summaryrefslogtreecommitdiffstats
path: root/hacks
diff options
context:
space:
mode:
authorSimon Rettberg2018-10-16 10:08:48 +0200
committerSimon Rettberg2018-10-16 10:08:48 +0200
commitd3a98cf6cbc3bd0b9efc570f58e8812c03931c18 (patch)
treecbddf8e50f35a9c6e878a5bfe3c6d625d99e12ba /hacks
downloadxscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.gz
xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.xz
xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.zip
Original 5.40
Diffstat (limited to 'hacks')
-rw-r--r--hacks/.gdbinit12
-rw-r--r--hacks/Makefile.in3263
-rw-r--r--hacks/README6
-rw-r--r--hacks/abstractile.c1605
-rw-r--r--hacks/abstractile.man52
-rw-r--r--hacks/analogtv.c2431
-rw-r--r--hacks/analogtv.h338
-rw-r--r--hacks/anemone.c448
-rw-r--r--hacks/anemone.man74
-rw-r--r--hacks/anemotaxis.c755
-rw-r--r--hacks/anemotaxis.man78
-rw-r--r--hacks/ant.c1350
-rw-r--r--hacks/ant.man96
-rw-r--r--hacks/apollonian.c810
-rw-r--r--hacks/apollonian.man70
-rw-r--r--hacks/apple2-main.c1913
-rw-r--r--hacks/apple2.c885
-rw-r--r--hacks/apple2.h121
-rw-r--r--hacks/apple2.man206
-rw-r--r--hacks/asm6502.c2275
-rw-r--r--hacks/asm6502.h181
-rw-r--r--hacks/attraction.c1109
-rw-r--r--hacks/attraction.man214
-rw-r--r--hacks/automata.h64
-rw-r--r--hacks/barcode.c1995
-rw-r--r--hacks/barcode.man61
-rw-r--r--hacks/binaryring.c587
-rw-r--r--hacks/binaryring.man88
-rw-r--r--hacks/blaster.c1191
-rw-r--r--hacks/blaster.man65
-rw-r--r--hacks/blitspin.c451
-rw-r--r--hacks/blitspin.man96
-rw-r--r--hacks/bouboule.c858
-rw-r--r--hacks/bouboule.man80
-rw-r--r--hacks/boxfit.c561
-rw-r--r--hacks/boxfit.man102
-rw-r--r--hacks/braid.c443
-rw-r--r--hacks/braid.man69
-rw-r--r--hacks/bsod.c6008
-rw-r--r--hacks/bsod.man149
-rw-r--r--hacks/bubbles-default.c154
-rw-r--r--hacks/bubbles.c1437
-rw-r--r--hacks/bubbles.h208
-rw-r--r--hacks/bubbles.man140
-rw-r--r--hacks/bumps.c700
-rw-r--r--hacks/bumps.man80
-rw-r--r--hacks/ccurve.c866
-rw-r--r--hacks/ccurve.man60
-rw-r--r--hacks/celtic.c1131
-rw-r--r--hacks/celtic.man64
-rwxr-xr-xhacks/check-configs.pl1243
-rw-r--r--hacks/cloudlife.c428
-rw-r--r--hacks/cloudlife.man87
-rw-r--r--hacks/compass.c986
-rw-r--r--hacks/compass.man57
-rw-r--r--hacks/compile_axp.com156
-rw-r--r--hacks/compile_decc.com156
-rw-r--r--hacks/config/README262
-rw-r--r--hacks/config/abstractile.xml36
-rw-r--r--hacks/config/anemone.xml61
-rw-r--r--hacks/config/anemotaxis.xml39
-rw-r--r--hacks/config/ant.xml74
-rw-r--r--hacks/config/antinspect.xml25
-rw-r--r--hacks/config/antmaze.xml23
-rw-r--r--hacks/config/antspotlight.xml25
-rw-r--r--hacks/config/apollonian.xml42
-rw-r--r--hacks/config/apple2.xml65
-rw-r--r--hacks/config/atlantis.xml50
-rw-r--r--hacks/config/attraction.xml87
-rw-r--r--hacks/config/atunnel.xml26
-rw-r--r--hacks/config/barcode.xml35
-rw-r--r--hacks/config/binaryring.xml31
-rw-r--r--hacks/config/blaster.xml63
-rw-r--r--hacks/config/blinkbox.xml35
-rw-r--r--hacks/config/blitspin.xml46
-rw-r--r--hacks/config/blocktube.xml33
-rw-r--r--hacks/config/boing.xml51
-rw-r--r--hacks/config/bouboule.xml33
-rw-r--r--hacks/config/bouncingcow.xml32
-rw-r--r--hacks/config/boxed.xml58
-rw-r--r--hacks/config/boxfit.xml65
-rw-r--r--hacks/config/braid.xml39
-rw-r--r--hacks/config/bsod.xml105
-rw-r--r--hacks/config/bubble3d.xml30
-rw-r--r--hacks/config/bubbles.xml42
-rw-r--r--hacks/config/bumps.xml36
-rw-r--r--hacks/config/cage.xml27
-rw-r--r--hacks/config/carousel.xml57
-rw-r--r--hacks/config/ccurve.xml32
-rw-r--r--hacks/config/celtic.xml32
-rw-r--r--hacks/config/circuit.xml37
-rw-r--r--hacks/config/cityflow.xml55
-rw-r--r--hacks/config/cloudlife.xml41
-rw-r--r--hacks/config/companioncube.xml56
-rw-r--r--hacks/config/compass.xml24
-rw-r--r--hacks/config/coral.xml36
-rw-r--r--hacks/config/crackberg.xml52
-rw-r--r--hacks/config/critical.xml31
-rw-r--r--hacks/config/crumbler.xml49
-rw-r--r--hacks/config/crystal.xml48
-rw-r--r--hacks/config/cube21.xml77
-rw-r--r--hacks/config/cubenetic.xml67
-rw-r--r--hacks/config/cubestack.xml44
-rw-r--r--hacks/config/cubestorm.xml53
-rw-r--r--hacks/config/cubetwist.xml46
-rw-r--r--hacks/config/cubicgrid.xml31
-rw-r--r--hacks/config/cwaves.xml31
-rw-r--r--hacks/config/cynosure.xml32
-rw-r--r--hacks/config/dangerball.xml37
-rw-r--r--hacks/config/decayscreen.xml48
-rw-r--r--hacks/config/deco.xml45
-rw-r--r--hacks/config/deluxe.xml39
-rw-r--r--hacks/config/demon.xml41
-rw-r--r--hacks/config/discoball.xml37
-rw-r--r--hacks/config/discrete.xml32
-rw-r--r--hacks/config/distort.xml53
-rw-r--r--hacks/config/dnalogo.xml50
-rw-r--r--hacks/config/drift.xml31
-rw-r--r--hacks/config/dymaxionmap.xml79
-rw-r--r--hacks/config/endgame.xml29
-rw-r--r--hacks/config/energystream.xml26
-rw-r--r--hacks/config/engine.xml44
-rw-r--r--hacks/config/epicycle.xml57
-rw-r--r--hacks/config/eruption.xml53
-rw-r--r--hacks/config/esper.xml46
-rw-r--r--hacks/config/euler2d.xml53
-rw-r--r--hacks/config/extrusion.xml44
-rw-r--r--hacks/config/fadeplot.xml35
-rw-r--r--hacks/config/fiberlamp.xml31
-rw-r--r--hacks/config/filmleader.xml42
-rw-r--r--hacks/config/fireworkx.xml30
-rw-r--r--hacks/config/flag.xml41
-rw-r--r--hacks/config/flame.xml39
-rw-r--r--hacks/config/flipflop.xml52
-rw-r--r--hacks/config/flipscreen3d.xml27
-rw-r--r--hacks/config/fliptext.xml55
-rw-r--r--hacks/config/flow.xml60
-rw-r--r--hacks/config/fluidballs.xml55
-rw-r--r--hacks/config/flurry.xml29
-rw-r--r--hacks/config/flyingtoasters.xml42
-rw-r--r--hacks/config/fontglide.xml54
-rw-r--r--hacks/config/forest.xml30
-rw-r--r--hacks/config/fuzzyflakes.xml66
-rw-r--r--hacks/config/galaxy.xml36
-rw-r--r--hacks/config/gears.xml39
-rw-r--r--hacks/config/geodesic.xml61
-rw-r--r--hacks/config/geodesicgears.xml41
-rw-r--r--hacks/config/gflux.xml61
-rw-r--r--hacks/config/glblur.xml46
-rw-r--r--hacks/config/glcells.xml64
-rw-r--r--hacks/config/gleidescope.xml41
-rw-r--r--hacks/config/glforestfire.xml46
-rw-r--r--hacks/config/glhanoi.xml54
-rw-r--r--hacks/config/glitchpeg.xml38
-rw-r--r--hacks/config/glknots.xml63
-rw-r--r--hacks/config/glmatrix.xml53
-rw-r--r--hacks/config/glplanet.xml43
-rw-r--r--hacks/config/glschool.xml45
-rw-r--r--hacks/config/glslideshow.xml55
-rw-r--r--hacks/config/glsnake.xml56
-rw-r--r--hacks/config/gltext.xml51
-rw-r--r--hacks/config/goop.xml65
-rw-r--r--hacks/config/grav.xml36
-rw-r--r--hacks/config/greynetic.xml25
-rw-r--r--hacks/config/halftone.xml61
-rw-r--r--hacks/config/halo.xml42
-rw-r--r--hacks/config/helix.xml27
-rw-r--r--hacks/config/hexadrop.xml60
-rw-r--r--hacks/config/hexstrut.xml48
-rw-r--r--hacks/config/hilbert.xml77
-rw-r--r--hacks/config/hopalong.xml64
-rw-r--r--hacks/config/hydrostat.xml76
-rw-r--r--hacks/config/hyperball.xml66
-rw-r--r--hacks/config/hypercube.xml77
-rw-r--r--hacks/config/hypertorus.xml116
-rw-r--r--hacks/config/hypnowheel.xml54
-rw-r--r--hacks/config/ifs.xml65
-rw-r--r--hacks/config/imsmap.xml46
-rw-r--r--hacks/config/interaggregate.xml33
-rw-r--r--hacks/config/interference.xml57
-rw-r--r--hacks/config/intermomentary.xml37
-rw-r--r--hacks/config/jigglypuff.xml95
-rw-r--r--hacks/config/jigsaw.xml51
-rw-r--r--hacks/config/juggle.xml60
-rw-r--r--hacks/config/juggler3d.xml55
-rw-r--r--hacks/config/julia.xml39
-rw-r--r--hacks/config/kaleidescope.xml42
-rw-r--r--hacks/config/kaleidocycle.xml57
-rw-r--r--hacks/config/klein.xml131
-rw-r--r--hacks/config/kumppa.xml32
-rw-r--r--hacks/config/lament.xml29
-rw-r--r--hacks/config/laser.xml38
-rw-r--r--hacks/config/lavalite.xml90
-rw-r--r--hacks/config/lcdscrub.xml58
-rw-r--r--hacks/config/lightning.xml30
-rw-r--r--hacks/config/lisa.xml50
-rw-r--r--hacks/config/lissie.xml52
-rw-r--r--hacks/config/lmorph.xml51
-rw-r--r--hacks/config/lockward.xml67
-rw-r--r--hacks/config/loop.xml37
-rw-r--r--hacks/config/m6502.xml55
-rw-r--r--hacks/config/maze.xml71
-rwxr-xr-xhacks/config/maze3d.xml122
-rw-r--r--hacks/config/memscroller.xml35
-rw-r--r--hacks/config/menger.xml51
-rw-r--r--hacks/config/metaballs.xml53
-rw-r--r--hacks/config/mirrorblob.xml75
-rw-r--r--hacks/config/mismunch.xml44
-rw-r--r--hacks/config/moebius.xml29
-rw-r--r--hacks/config/moebiusgears.xml47
-rw-r--r--hacks/config/moire.xml38
-rw-r--r--hacks/config/moire2.xml34
-rw-r--r--hacks/config/molecule.xml60
-rw-r--r--hacks/config/morph3d.xml34
-rw-r--r--hacks/config/mountain.xml31
-rw-r--r--hacks/config/munch.xml63
-rw-r--r--hacks/config/nerverot.xml62
-rw-r--r--hacks/config/noof.xml23
-rw-r--r--hacks/config/noseguy.xml19
-rw-r--r--hacks/config/pacman.xml28
-rw-r--r--hacks/config/pedal.xml33
-rw-r--r--hacks/config/peepers.xml47
-rw-r--r--hacks/config/penetrate.xml34
-rw-r--r--hacks/config/penrose.xml55
-rw-r--r--hacks/config/petri.xml83
-rw-r--r--hacks/config/phosphor.xml49
-rw-r--r--hacks/config/photopile.xml65
-rw-r--r--hacks/config/piecewise.xml45
-rw-r--r--hacks/config/pinion.xml49
-rw-r--r--hacks/config/pipes.xml49
-rw-r--r--hacks/config/polyhedra.xml201
-rw-r--r--hacks/config/polyominoes.xml36
-rw-r--r--hacks/config/polytopes.xml112
-rw-r--r--hacks/config/pong.xml46
-rw-r--r--hacks/config/popsquares.xml56
-rw-r--r--hacks/config/projectiveplane.xml153
-rw-r--r--hacks/config/providence.xml29
-rw-r--r--hacks/config/pulsar.xml42
-rw-r--r--hacks/config/pyro.xml37
-rw-r--r--hacks/config/qix.xml74
-rw-r--r--hacks/config/quasicrystal.xml56
-rw-r--r--hacks/config/queens.xml31
-rw-r--r--hacks/config/raverhoop.xml54
-rw-r--r--hacks/config/razzledazzle.xml66
-rw-r--r--hacks/config/rd-bomb.xml67
l---------hacks/config/rdbomb.xml1
-rw-r--r--hacks/config/ripples.xml55
-rw-r--r--hacks/config/rocks.xml45
-rw-r--r--hacks/config/romanboy.xml128
-rw-r--r--hacks/config/rorschach.xml36
-rw-r--r--hacks/config/rotor.xml40
-rw-r--r--hacks/config/rotzoomer.xml43
-rw-r--r--hacks/config/rubik.xml39
-rw-r--r--hacks/config/rubikblocks.xml67
-rw-r--r--hacks/config/sballs.xml37
-rw-r--r--hacks/config/shadebobs.xml38
-rw-r--r--hacks/config/sierpinski.xml37
-rw-r--r--hacks/config/sierpinski3d.xml34
-rw-r--r--hacks/config/skytentacles.xml71
-rw-r--r--hacks/config/slidescreen.xml54
-rw-r--r--hacks/config/slip.xml43
-rw-r--r--hacks/config/sonar.xml85
-rw-r--r--hacks/config/speedmine.xml62
-rw-r--r--hacks/config/sphere.xml30
-rw-r--r--hacks/config/spheremonics.xml60
-rw-r--r--hacks/config/spiral.xml38
-rw-r--r--hacks/config/splitflap.xml72
-rw-r--r--hacks/config/splodesic.xml32
-rw-r--r--hacks/config/spotlight.xml34
-rw-r--r--hacks/config/sproingies.xml36
-rw-r--r--hacks/config/squiral.xml51
-rw-r--r--hacks/config/stairs.xml25
-rw-r--r--hacks/config/starfish.xml43
-rw-r--r--hacks/config/starwars.xml63
-rw-r--r--hacks/config/stonerview.xml27
-rw-r--r--hacks/config/strange.xml58
-rw-r--r--hacks/config/substrate.xml47
-rw-r--r--hacks/config/superquadrics.xml36
-rw-r--r--hacks/config/surfaces.xml75
-rw-r--r--hacks/config/swirl.xml33
-rw-r--r--hacks/config/t3d.xml60
-rw-r--r--hacks/config/tangram.xml45
-rw-r--r--hacks/config/tessellimage.xml66
-rw-r--r--hacks/config/testx11.xml17
-rw-r--r--hacks/config/thornbird.xml37
-rw-r--r--hacks/config/timetunnel.xml42
-rw-r--r--hacks/config/topblock.xml64
-rw-r--r--hacks/config/triangle.xml28
-rw-r--r--hacks/config/tronbit.xml41
-rw-r--r--hacks/config/truchet.xml41
-rw-r--r--hacks/config/twang.xml61
-rw-r--r--hacks/config/unicrud.xml44
-rw-r--r--hacks/config/unknownpleasures.xml57
-rw-r--r--hacks/config/vermiculate.xml22
-rw-r--r--hacks/config/vfeedback.xml39
-rw-r--r--hacks/config/vidwhacker.xml32
-rw-r--r--hacks/config/vigilance.xml30
-rw-r--r--hacks/config/vines.xml30
-rw-r--r--hacks/config/voronoi.xml63
-rw-r--r--hacks/config/wander.xml55
-rw-r--r--hacks/config/webcollage.xml56
-rw-r--r--hacks/config/whirlwindwarp.xml28
-rw-r--r--hacks/config/whirlygig.xml90
-rw-r--r--hacks/config/winduprobot.xml62
-rw-r--r--hacks/config/worm.xml39
-rw-r--r--hacks/config/wormhole.xml31
-rw-r--r--hacks/config/xanalogtv.xml48
-rw-r--r--hacks/config/xflame.xml34
-rw-r--r--hacks/config/xjack.xml25
-rw-r--r--hacks/config/xlyap.xml52
-rw-r--r--hacks/config/xmatrix.xml68
-rw-r--r--hacks/config/xrayswarm.xml23
-rw-r--r--hacks/config/xspirograph.xml32
-rw-r--r--hacks/config/xss.dtd109
-rw-r--r--hacks/config/xss.xsd375
-rw-r--r--hacks/config/zoom.xml54
-rw-r--r--hacks/coral.c314
-rw-r--r--hacks/coral.man64
-rw-r--r--hacks/critical.c454
-rw-r--r--hacks/critical.man94
-rw-r--r--hacks/crystal.c1284
-rw-r--r--hacks/crystal.man81
-rw-r--r--hacks/cwaves.c212
-rw-r--r--hacks/cwaves.man76
-rw-r--r--hacks/cynosure.c443
-rw-r--r--hacks/cynosure.man64
-rw-r--r--hacks/decayscreen.c397
-rw-r--r--hacks/decayscreen.man92
-rw-r--r--hacks/deco.c339
-rw-r--r--hacks/deco.man105
-rw-r--r--hacks/delaunay.c301
-rw-r--r--hacks/delaunay.h52
-rw-r--r--hacks/deluxe.c465
-rw-r--r--hacks/deluxe.man72
-rw-r--r--hacks/demon.c952
-rw-r--r--hacks/demon.man69
-rw-r--r--hacks/discrete.c440
-rw-r--r--hacks/discrete.man61
-rw-r--r--hacks/distort.c864
-rw-r--r--hacks/distort.man137
-rw-r--r--hacks/drift.c672
-rw-r--r--hacks/drift.man79
-rw-r--r--hacks/epicycle.c794
-rw-r--r--hacks/epicycle.man204
-rw-r--r--hacks/eruption.c526
-rw-r--r--hacks/eruption.man77
-rw-r--r--hacks/euler2d.c887
-rw-r--r--hacks/euler2d.man69
-rw-r--r--hacks/euler2d.tex337
-rw-r--r--hacks/fadeplot.c233
-rw-r--r--hacks/fadeplot.man65
-rw-r--r--hacks/fiberlamp.c474
-rw-r--r--hacks/fiberlamp.man65
-rw-r--r--hacks/filmleader.c571
-rw-r--r--hacks/filmleader.man69
-rw-r--r--hacks/fireworkx.c868
-rw-r--r--hacks/fireworkx.man88
-rw-r--r--hacks/flag.c565
-rw-r--r--hacks/flag.man92
-rw-r--r--hacks/flame.c466
-rw-r--r--hacks/flame.man74
-rw-r--r--hacks/flow.c1211
-rw-r--r--hacks/flow.man137
-rw-r--r--hacks/fluidballs.c852
-rw-r--r--hacks/fluidballs.man90
-rw-r--r--hacks/fontglide.c2489
-rw-r--r--hacks/fontglide.man124
-rw-r--r--hacks/forest.c244
-rw-r--r--hacks/forest.man62
-rw-r--r--hacks/fps.c268
-rw-r--r--hacks/fps.h35
-rw-r--r--hacks/fpsI.h40
-rw-r--r--hacks/fuzzyflakes.c646
-rw-r--r--hacks/fuzzyflakes.man112
-rw-r--r--hacks/galaxy.c451
-rw-r--r--hacks/galaxy.man87
-rw-r--r--hacks/glitchpeg.c440
-rw-r--r--hacks/glitchpeg.man79
-rw-r--r--hacks/glx/Makefile.in3473
-rw-r--r--hacks/glx/README10
-rw-r--r--hacks/glx/antinspect.c704
-rw-r--r--hacks/glx/antinspect.man56
-rw-r--r--hacks/glx/antmaze.c1613
-rw-r--r--hacks/glx/antmaze.man52
-rw-r--r--hacks/glx/ants.h45
-rw-r--r--hacks/glx/antspotlight.c799
-rw-r--r--hacks/glx/antspotlight.man56
-rw-r--r--hacks/glx/atlantis.c577
-rw-r--r--hacks/glx/atlantis.h133
-rw-r--r--hacks/glx/atlantis.man78
-rw-r--r--hacks/glx/atunnel.c317
-rw-r--r--hacks/glx/atunnel.man83
-rw-r--r--hacks/glx/b_draw.c239
-rw-r--r--hacks/glx/b_lockglue.c240
-rw-r--r--hacks/glx/b_sphere.c219
-rw-r--r--hacks/glx/blinkbox.c608
-rw-r--r--hacks/glx/blinkbox.man73
-rw-r--r--hacks/glx/blocktube.c457
-rw-r--r--hacks/glx/blocktube.man73
-rw-r--r--hacks/glx/boing.c658
-rw-r--r--hacks/glx/boing.man105
-rw-r--r--hacks/glx/bouncingcow.c519
-rw-r--r--hacks/glx/bouncingcow.man73
-rw-r--r--hacks/glx/boxed.c1370
-rw-r--r--hacks/glx/boxed.h4116
-rw-r--r--hacks/glx/boxed.man56
-rw-r--r--hacks/glx/bubble3d.c281
-rw-r--r--hacks/glx/bubble3d.h100
-rw-r--r--hacks/glx/bubble3d.man62
-rw-r--r--hacks/glx/buildlwo.c96
-rw-r--r--hacks/glx/buildlwo.h43
-rw-r--r--hacks/glx/cage.c480
-rw-r--r--hacks/glx/cage.man61
-rw-r--r--hacks/glx/carousel.c941
-rw-r--r--hacks/glx/carousel.man109
-rw-r--r--hacks/glx/chessgames.h343
-rw-r--r--hacks/glx/chessmodels.c1738
-rw-r--r--hacks/glx/chessmodels.h44
-rw-r--r--hacks/glx/circuit.c2094
-rw-r--r--hacks/glx/circuit.man72
-rw-r--r--hacks/glx/cityflow.c545
-rw-r--r--hacks/glx/cityflow.man77
-rw-r--r--hacks/glx/companion.c592
-rw-r--r--hacks/glx/companion_disc.c9593
-rw-r--r--hacks/glx/companion_heart.c653
-rw-r--r--hacks/glx/companion_quad.c389
-rw-r--r--hacks/glx/companioncube.man85
-rw-r--r--hacks/glx/cow_face.c341
-rw-r--r--hacks/glx/cow_hide.c13055
-rw-r--r--hacks/glx/cow_hoofs.c1037
-rw-r--r--hacks/glx/cow_horns.c1025
-rw-r--r--hacks/glx/cow_tail.c464
-rw-r--r--hacks/glx/cow_udder.c1520
-rw-r--r--hacks/glx/crackberg.c1468
-rw-r--r--hacks/glx/crackberg.man123
-rw-r--r--hacks/glx/crumbler.c875
-rw-r--r--hacks/glx/crumbler.man77
-rw-r--r--hacks/glx/cube21.c941
-rw-r--r--hacks/glx/cube21.man147
-rw-r--r--hacks/glx/cubenetic.c598
-rw-r--r--hacks/glx/cubenetic.man89
-rw-r--r--hacks/glx/cubestack.c462
-rw-r--r--hacks/glx/cubestack.man72
-rw-r--r--hacks/glx/cubestorm.c469
-rw-r--r--hacks/glx/cubestorm.man77
-rw-r--r--hacks/glx/cubetwist.c595
-rw-r--r--hacks/glx/cubetwist.man80
-rw-r--r--hacks/glx/cubicgrid.c269
-rw-r--r--hacks/glx/cubicgrid.man83
-rw-r--r--hacks/glx/curlicue.h261
-rw-r--r--hacks/glx/dangerball.c364
-rw-r--r--hacks/glx/dangerball.man72
-rw-r--r--hacks/glx/discoball.c707
-rw-r--r--hacks/glx/discoball.man72
-rw-r--r--hacks/glx/dnalogo.c3639
-rw-r--r--hacks/glx/dnapizza.h122
-rw-r--r--hacks/glx/dolphin.c2061
-rw-r--r--hacks/glx/dropshadow.c181
-rw-r--r--hacks/glx/dropshadow.h40
-rwxr-xr-xhacks/glx/dxf2gl.pl729
-rw-r--r--hacks/glx/dymaxionmap-coords.c685
-rw-r--r--hacks/glx/dymaxionmap-coords.h6
-rw-r--r--hacks/glx/dymaxionmap.c1654
-rw-r--r--hacks/glx/dymaxionmap.man117
-rw-r--r--hacks/glx/e_textures.h1478
-rw-r--r--hacks/glx/endgame.c971
-rw-r--r--hacks/glx/endgame.man72
-rw-r--r--hacks/glx/energystream.c534
-rw-r--r--hacks/glx/energystream.man56
-rw-r--r--hacks/glx/engine.c1006
-rw-r--r--hacks/glx/engine.man80
-rw-r--r--hacks/glx/erase-gl.c38
-rw-r--r--hacks/glx/esper.c2412
-rw-r--r--hacks/glx/esper.man68
-rw-r--r--hacks/glx/extrusion-helix2.c47
-rw-r--r--hacks/glx/extrusion-helix3.c46
-rw-r--r--hacks/glx/extrusion-helix4.c63
-rw-r--r--hacks/glx/extrusion-joinoffset.c148
-rw-r--r--hacks/glx/extrusion-screw.c114
-rw-r--r--hacks/glx/extrusion-taper.c218
-rw-r--r--hacks/glx/extrusion-twistoid.c215
-rw-r--r--hacks/glx/extrusion.c556
-rw-r--r--hacks/glx/extrusion.h55
-rw-r--r--hacks/glx/extrusion.man71
-rw-r--r--hacks/glx/flipflop.c859
-rw-r--r--hacks/glx/flipflop.man95
-rw-r--r--hacks/glx/flipscreen3d.c518
-rw-r--r--hacks/glx/flipscreen3d.man61
-rw-r--r--hacks/glx/fliptext.c1001
-rw-r--r--hacks/glx/fliptext.man114
-rw-r--r--hacks/glx/flurry-smoke.c1441
-rw-r--r--hacks/glx/flurry-spark.c285
-rw-r--r--hacks/glx/flurry-star.c106
-rw-r--r--hacks/glx/flurry-texture.c224
-rw-r--r--hacks/glx/flurry.c549
-rw-r--r--hacks/glx/flurry.h299
-rw-r--r--hacks/glx/flurry.man73
-rw-r--r--hacks/glx/flyingtoasters.c868
-rw-r--r--hacks/glx/flyingtoasters.man86
-rw-r--r--hacks/glx/fps-gl.c98
-rw-r--r--hacks/glx/gears.c938
-rw-r--r--hacks/glx/gears.man79
-rw-r--r--hacks/glx/geodesic.c816
-rw-r--r--hacks/glx/geodesic.man79
-rw-r--r--hacks/glx/geodesicgears.c1803
-rw-r--r--hacks/glx/geodesicgears.man78
-rw-r--r--hacks/glx/gflux.c803
-rw-r--r--hacks/glx/gflux.man111
-rw-r--r--hacks/glx/glblur.c610
-rw-r--r--hacks/glx/glblur.man76
-rw-r--r--hacks/glx/glcells.c1388
-rw-r--r--hacks/glx/glcells.man97
-rw-r--r--hacks/glx/gleidescope.c1624
-rw-r--r--hacks/glx/gleidescope.man77
-rw-r--r--hacks/glx/glforestfire.c1097
-rw-r--r--hacks/glx/glforestfire.man130
-rw-r--r--hacks/glx/glhanoi.c2086
-rw-r--r--hacks/glx/glhanoi.man83
-rw-r--r--hacks/glx/glknots.c445
-rw-r--r--hacks/glx/glknots.man81
-rw-r--r--hacks/glx/gllist.c127
-rw-r--r--hacks/glx/gllist.h44
-rw-r--r--hacks/glx/glmatrix.c1068
-rw-r--r--hacks/glx/glmatrix.man116
-rw-r--r--hacks/glx/glplanet.c847
-rw-r--r--hacks/glx/glplanet.man75
-rw-r--r--hacks/glx/glschool.c216
-rw-r--r--hacks/glx/glschool.h17
-rw-r--r--hacks/glx/glschool.man126
-rw-r--r--hacks/glx/glschool_alg.c364
-rw-r--r--hacks/glx/glschool_alg.h126
-rw-r--r--hacks/glx/glschool_gl.c274
-rw-r--r--hacks/glx/glschool_gl.h51
-rw-r--r--hacks/glx/glslideshow.c1222
-rw-r--r--hacks/glx/glslideshow.man131
-rw-r--r--hacks/glx/glsnake.c2694
-rw-r--r--hacks/glx/glsnake.man98
-rw-r--r--hacks/glx/gltext.c660
-rw-r--r--hacks/glx/gltext.man152
-rw-r--r--hacks/glx/gltrackball.c337
-rw-r--r--hacks/glx/gltrackball.h72
-rw-r--r--hacks/glx/glut_mroman.h2456
-rw-r--r--hacks/glx/glut_roman.h2455
-rw-r--r--hacks/glx/glut_stroke.c66
-rw-r--r--hacks/glx/glut_swidth.c77
-rw-r--r--hacks/glx/glutstroke.h47
-rw-r--r--hacks/glx/grab-ximage.c813
-rw-r--r--hacks/glx/grab-ximage.h76
-rw-r--r--hacks/glx/hexstrut.c509
-rw-r--r--hacks/glx/hexstrut.man77
-rw-r--r--hacks/glx/hilbert.c1144
-rw-r--r--hacks/glx/hilbert.man103
-rw-r--r--hacks/glx/hydrostat.c809
-rw-r--r--hacks/glx/hydrostat.man103
-rw-r--r--hacks/glx/hypertorus.c1016
-rw-r--r--hacks/glx/hypertorus.man188
-rw-r--r--hacks/glx/hypnowheel.c322
-rw-r--r--hacks/glx/hypnowheel.man80
-rw-r--r--hacks/glx/involute.c998
-rw-r--r--hacks/glx/involute.h78
-rw-r--r--hacks/glx/jigglypuff.c1076
-rw-r--r--hacks/glx/jigglypuff.man121
-rw-r--r--hacks/glx/jigsaw.c1509
-rw-r--r--hacks/glx/jigsaw.man90
-rw-r--r--hacks/glx/juggler3d.c3022
-rw-r--r--hacks/glx/juggler3d.man183
-rw-r--r--hacks/glx/kaleidocycle.c574
-rw-r--r--hacks/glx/kaleidocycle.man96
-rw-r--r--hacks/glx/klein.c2099
-rw-r--r--hacks/glx/klein.man308
-rw-r--r--hacks/glx/lament.c1786
-rw-r--r--hacks/glx/lament.dxf163404
-rw-r--r--hacks/glx/lament.man68
-rw-r--r--hacks/glx/lament_model.c16258
-rw-r--r--hacks/glx/lavalite.c1539
-rw-r--r--hacks/glx/lavalite.man160
-rw-r--r--hacks/glx/lockward.c970
-rw-r--r--hacks/glx/lockward.man79
-rw-r--r--hacks/glx/marching.c645
-rw-r--r--hacks/glx/marching.h48
-rwxr-xr-xhacks/glx/maze3d.c1955
-rwxr-xr-xhacks/glx/maze3d.man116
-rw-r--r--hacks/glx/menger.c562
-rw-r--r--hacks/glx/menger.man78
-rw-r--r--hacks/glx/mirrorblob.c1841
-rw-r--r--hacks/glx/mirrorblob.man107
-rw-r--r--hacks/glx/moebius.c788
-rw-r--r--hacks/glx/moebius.man65
-rw-r--r--hacks/glx/moebiusgears.c437
-rw-r--r--hacks/glx/moebiusgears.man86
-rw-r--r--hacks/glx/molecule.c1682
-rw-r--r--hacks/glx/molecule.man160
-rwxr-xr-xhacks/glx/molecules.sh23
-rw-r--r--hacks/glx/morph3d.c837
-rw-r--r--hacks/glx/morph3d.man57
-rw-r--r--hacks/glx/noof.c519
-rw-r--r--hacks/glx/noof.man52
-rw-r--r--hacks/glx/normals.c52
-rw-r--r--hacks/glx/normals.h48
-rw-r--r--hacks/glx/peepers.c1455
-rw-r--r--hacks/glx/peepers.man80
-rw-r--r--hacks/glx/photopile.c833
-rw-r--r--hacks/glx/photopile.man113
-rw-r--r--hacks/glx/pinion.c1470
-rw-r--r--hacks/glx/pinion.man82
-rw-r--r--hacks/glx/pipeobjs.c3262
-rw-r--r--hacks/glx/pipes.c1220
-rw-r--r--hacks/glx/pipes.man85
-rw-r--r--hacks/glx/polyhedra-gl.c683
-rw-r--r--hacks/glx/polyhedra.c2457
-rw-r--r--hacks/glx/polyhedra.h52
-rw-r--r--hacks/glx/polyhedra.man124
-rw-r--r--hacks/glx/polytopes.c3189
-rw-r--r--hacks/glx/polytopes.man207
-rw-r--r--hacks/glx/projectiveplane.c1550
-rw-r--r--hacks/glx/projectiveplane.man400
-rw-r--r--hacks/glx/providence.c799
-rw-r--r--hacks/glx/providence.man66
-rw-r--r--hacks/glx/pulsar.c515
-rw-r--r--hacks/glx/pulsar.man102
-rw-r--r--hacks/glx/quasicrystal.c478
-rw-r--r--hacks/glx/quasicrystal.man83
-rw-r--r--hacks/glx/queens.c610
-rw-r--r--hacks/glx/queens.man66
-rw-r--r--hacks/glx/quickhull.c1368
-rw-r--r--hacks/glx/quickhull.h56
-rw-r--r--hacks/glx/raverhoop.c767
-rw-r--r--hacks/glx/raverhoop.man83
-rw-r--r--hacks/glx/razzledazzle.c725
-rw-r--r--hacks/glx/razzledazzle.man76
-rw-r--r--hacks/glx/robot-wireframe.c154
-rw-r--r--hacks/glx/robot-wireframe.dxf1160
-rw-r--r--hacks/glx/robot.c18539
-rw-r--r--hacks/glx/robot.dxf185616
-rw-r--r--hacks/glx/romanboy.c1552
-rw-r--r--hacks/glx/romanboy.man390
-rw-r--r--hacks/glx/rotator.c274
-rw-r--r--hacks/glx/rotator.h60
-rw-r--r--hacks/glx/rubik.c2140
-rw-r--r--hacks/glx/rubik.man69
-rw-r--r--hacks/glx/rubikblocks.c633
-rw-r--r--hacks/glx/rubikblocks.man117
-rw-r--r--hacks/glx/s1_1.c1733
-rw-r--r--hacks/glx/s1_2.c1733
-rw-r--r--hacks/glx/s1_3.c1733
-rw-r--r--hacks/glx/s1_4.c1733
-rw-r--r--hacks/glx/s1_5.c1733
-rw-r--r--hacks/glx/s1_6.c1733
-rw-r--r--hacks/glx/s1_b.c505
-rw-r--r--hacks/glx/sballs.c823
-rw-r--r--hacks/glx/sballs.man125
-rw-r--r--hacks/glx/seccam.c1388
-rw-r--r--hacks/glx/seccam.dxf13606
-rw-r--r--hacks/glx/shark.c1395
-rw-r--r--hacks/glx/ships.c4976
-rw-r--r--hacks/glx/ships.dxf49148
-rw-r--r--hacks/glx/sierpinski3d.c581
-rw-r--r--hacks/glx/sierpinski3d.man67
-rw-r--r--hacks/glx/skytentacles.c1103
-rw-r--r--hacks/glx/skytentacles.man102
-rw-r--r--hacks/glx/sonar-icmp.c1703
-rw-r--r--hacks/glx/sonar-sim.c112
-rw-r--r--hacks/glx/sonar.c1258
-rw-r--r--hacks/glx/sonar.h71
-rw-r--r--hacks/glx/sonar.man169
-rw-r--r--hacks/glx/sphere.c155
-rw-r--r--hacks/glx/sphere.h24
-rw-r--r--hacks/glx/spheremonics.c882
-rw-r--r--hacks/glx/spheremonics.man92
-rw-r--r--hacks/glx/splitflap.c1408
-rw-r--r--hacks/glx/splitflap.dxf1658
-rw-r--r--hacks/glx/splitflap.man98
-rw-r--r--hacks/glx/splitflap_obj.c200
-rw-r--r--hacks/glx/splodesic.c640
-rw-r--r--hacks/glx/splodesic.man69
-rw-r--r--hacks/glx/sproingies.c906
-rw-r--r--hacks/glx/sproingies.h43
-rw-r--r--hacks/glx/sproingies.man68
-rw-r--r--hacks/glx/sproingiewrap.c231
-rw-r--r--hacks/glx/stairs.c589
-rw-r--r--hacks/glx/stairs.man56
-rw-r--r--hacks/glx/starwars.c1075
-rw-r--r--hacks/glx/starwars.h363
-rw-r--r--hacks/glx/starwars.man181
-rw-r--r--hacks/glx/starwars.txt415
-rw-r--r--hacks/glx/stonerview-move.c147
-rw-r--r--hacks/glx/stonerview-move.h32
-rw-r--r--hacks/glx/stonerview-osc.c341
-rw-r--r--hacks/glx/stonerview-osc.h175
-rw-r--r--hacks/glx/stonerview-view.c134
-rw-r--r--hacks/glx/stonerview.c154
-rw-r--r--hacks/glx/stonerview.h59
-rw-r--r--hacks/glx/stonerview.man53
-rw-r--r--hacks/glx/superquadrics.c807
-rw-r--r--hacks/glx/superquadrics.man70
-rw-r--r--hacks/glx/surfaces.c648
-rw-r--r--hacks/glx/surfaces.man127
-rw-r--r--hacks/glx/swim.c232
-rw-r--r--hacks/glx/tangram.c1067
-rw-r--r--hacks/glx/tangram.man67
-rw-r--r--hacks/glx/tangram_shapes.c240
-rw-r--r--hacks/glx/tangram_shapes.h15
-rw-r--r--hacks/glx/teapot.c285
-rw-r--r--hacks/glx/teapot.h7
-rw-r--r--hacks/glx/teapot2.h6330
-rw-r--r--hacks/glx/texfont.c961
-rw-r--r--hacks/glx/texfont.h72
-rw-r--r--hacks/glx/timetunnel.c1240
-rw-r--r--hacks/glx/timetunnel.man105
-rw-r--r--hacks/glx/toast.c190
-rw-r--r--hacks/glx/toast.dxf1814
-rw-r--r--hacks/glx/toast2.c214
-rw-r--r--hacks/glx/toast2.dxf2054
-rw-r--r--hacks/glx/toaster.c376
-rw-r--r--hacks/glx/toaster.dxf3674
-rw-r--r--hacks/glx/toaster_base.c130
-rw-r--r--hacks/glx/toaster_base.dxf1214
-rw-r--r--hacks/glx/toaster_handle.c64
-rw-r--r--hacks/glx/toaster_handle.dxf554
-rw-r--r--hacks/glx/toaster_handle2.c40
-rw-r--r--hacks/glx/toaster_handle2.dxf314
-rw-r--r--hacks/glx/toaster_jet.c178
-rw-r--r--hacks/glx/toaster_jet.dxf1694
-rw-r--r--hacks/glx/toaster_knob.c76
-rw-r--r--hacks/glx/toaster_knob.dxf674
-rw-r--r--hacks/glx/toaster_slots.c106
-rw-r--r--hacks/glx/toaster_slots.dxf974
-rw-r--r--hacks/glx/toaster_wing.c43
-rw-r--r--hacks/glx/toaster_wing.dxf344
-rw-r--r--hacks/glx/topblock.c883
-rw-r--r--hacks/glx/topblock.h45
-rw-r--r--hacks/glx/topblock.man170
-rw-r--r--hacks/glx/trackball.c331
-rw-r--r--hacks/glx/trackball.h82
-rw-r--r--hacks/glx/tronbit.c536
-rw-r--r--hacks/glx/tronbit.man79
-rw-r--r--hacks/glx/tronbit_idle1.c247
-rw-r--r--hacks/glx/tronbit_idle2.c175
-rw-r--r--hacks/glx/tronbit_no.c1087
-rw-r--r--hacks/glx/tronbit_yes.c31
-rw-r--r--hacks/glx/tube.c403
-rw-r--r--hacks/glx/tube.h32
-rw-r--r--hacks/glx/tunnel_draw.c512
-rw-r--r--hacks/glx/tunnel_draw.h11
-rw-r--r--hacks/glx/unicrud.c961
-rw-r--r--hacks/glx/unicrud.man74
-rw-r--r--hacks/glx/unknownpleasures.c486
-rw-r--r--hacks/glx/unknownpleasures.man74
-rw-r--r--hacks/glx/vigilance.c1150
-rw-r--r--hacks/glx/vigilance.man57
-rw-r--r--hacks/glx/voronoi.c543
-rw-r--r--hacks/glx/voronoi.man88
-rwxr-xr-xhacks/glx/vrml2gl.pl361
-rwxr-xr-xhacks/glx/wfront2gl.pl361
-rw-r--r--hacks/glx/whale.c1887
-rw-r--r--hacks/glx/winduprobot.c2483
-rw-r--r--hacks/glx/winduprobot.man85
-rw-r--r--hacks/glx/xlock-gl-utils.c230
-rw-r--r--hacks/glx/xscreensaver-gl-helper.c74
-rw-r--r--hacks/glx/xscreensaver-gl-helper.man33
-rw-r--r--hacks/glx/zalgo.txt30
-rw-r--r--hacks/goop.c650
-rw-r--r--hacks/goop.man84
-rw-r--r--hacks/grav.c356
-rw-r--r--hacks/grav.man78
-rw-r--r--hacks/greynetic.c296
-rw-r--r--hacks/greynetic.man56
-rw-r--r--hacks/halftone.c397
-rw-r--r--hacks/halftone.man83
-rw-r--r--hacks/halo.c440
-rw-r--r--hacks/halo.man75
-rw-r--r--hacks/helix.c356
-rw-r--r--hacks/helix.man62
-rw-r--r--hacks/hexadrop.c414
-rw-r--r--hacks/hexadrop.man74
-rw-r--r--hacks/hopalong.c555
-rw-r--r--hacks/hopalong.man82
-rw-r--r--hacks/hyperball.c2458
-rw-r--r--hacks/hyperball.man88
-rw-r--r--hacks/hypercube.c569
-rw-r--r--hacks/hypercube.man97
-rw-r--r--hacks/ifs.c551
-rw-r--r--hacks/ifs.man111
-rw-r--r--hacks/images/6x10font.pngbin0 -> 1968 bytes
-rw-r--r--hacks/images/Makefile54
-rw-r--r--hacks/images/Makefile.in54
-rw-r--r--hacks/images/amiga.pngbin0 -> 1136 bytes
-rw-r--r--hacks/images/android.pngbin0 -> 1091 bytes
-rw-r--r--hacks/images/apple.pngbin0 -> 1562 bytes
-rw-r--r--hacks/images/apple2font.pngbin0 -> 651 bytes
-rw-r--r--hacks/images/atari.pngbin0 -> 148 bytes
-rw-r--r--hacks/images/atm.pngbin0 -> 982 bytes
-rw-r--r--hacks/images/blocktube.pngbin0 -> 23571 bytes
-rw-r--r--hacks/images/bob.pngbin0 -> 1491 bytes
-rw-r--r--hacks/images/brick1.pngbin0 -> 8544 bytes
-rw-r--r--hacks/images/brick2.pngbin0 -> 688 bytes
-rw-r--r--hacks/images/bubbles/blood.pov24
-rw-r--r--hacks/images/bubbles/blood1.pngbin0 -> 583 bytes
-rw-r--r--hacks/images/bubbles/blood10.pngbin0 -> 8605 bytes
-rw-r--r--hacks/images/bubbles/blood11.pngbin0 -> 11682 bytes
-rw-r--r--hacks/images/bubbles/blood2.pngbin0 -> 781 bytes
-rw-r--r--hacks/images/bubbles/blood3.pngbin0 -> 1020 bytes
-rw-r--r--hacks/images/bubbles/blood4.pngbin0 -> 1276 bytes
-rw-r--r--hacks/images/bubbles/blood5.pngbin0 -> 1768 bytes
-rw-r--r--hacks/images/bubbles/blood6.pngbin0 -> 2612 bytes
-rw-r--r--hacks/images/bubbles/blood7.pngbin0 -> 3571 bytes
-rw-r--r--hacks/images/bubbles/blood8.pngbin0 -> 5076 bytes
-rw-r--r--hacks/images/bubbles/blood9.pngbin0 -> 6324 bytes
-rw-r--r--hacks/images/bubbles/blue.pov22
-rw-r--r--hacks/images/bubbles/blue1.pngbin0 -> 583 bytes
-rw-r--r--hacks/images/bubbles/blue10.pngbin0 -> 7064 bytes
-rw-r--r--hacks/images/bubbles/blue11.pngbin0 -> 9455 bytes
-rw-r--r--hacks/images/bubbles/blue2.pngbin0 -> 781 bytes
-rw-r--r--hacks/images/bubbles/blue3.pngbin0 -> 1018 bytes
-rw-r--r--hacks/images/bubbles/blue4.pngbin0 -> 1184 bytes
-rw-r--r--hacks/images/bubbles/blue5.pngbin0 -> 1626 bytes
-rw-r--r--hacks/images/bubbles/blue6.pngbin0 -> 2354 bytes
-rw-r--r--hacks/images/bubbles/blue7.pngbin0 -> 3133 bytes
-rw-r--r--hacks/images/bubbles/blue8.pngbin0 -> 4300 bytes
-rw-r--r--hacks/images/bubbles/blue9.pngbin0 -> 5286 bytes
-rw-r--r--hacks/images/bubbles/glass.pov27
-rw-r--r--hacks/images/bubbles/glass1.pngbin0 -> 583 bytes
-rw-r--r--hacks/images/bubbles/glass10.pngbin0 -> 6805 bytes
-rw-r--r--hacks/images/bubbles/glass11.pngbin0 -> 9200 bytes
-rw-r--r--hacks/images/bubbles/glass2.pngbin0 -> 781 bytes
-rw-r--r--hacks/images/bubbles/glass3.pngbin0 -> 1018 bytes
-rw-r--r--hacks/images/bubbles/glass4.pngbin0 -> 1045 bytes
-rw-r--r--hacks/images/bubbles/glass5.pngbin0 -> 1425 bytes
-rw-r--r--hacks/images/bubbles/glass6.pngbin0 -> 2110 bytes
-rw-r--r--hacks/images/bubbles/glass7.pngbin0 -> 2856 bytes
-rw-r--r--hacks/images/bubbles/glass8.pngbin0 -> 4014 bytes
-rw-r--r--hacks/images/bubbles/glass9.pngbin0 -> 4996 bytes
-rw-r--r--hacks/images/bubbles/jade.pov24
-rw-r--r--hacks/images/bubbles/jade1.pngbin0 -> 583 bytes
-rw-r--r--hacks/images/bubbles/jade10.pngbin0 -> 7853 bytes
-rw-r--r--hacks/images/bubbles/jade11.pngbin0 -> 10816 bytes
-rw-r--r--hacks/images/bubbles/jade2.pngbin0 -> 781 bytes
-rw-r--r--hacks/images/bubbles/jade3.pngbin0 -> 1018 bytes
-rw-r--r--hacks/images/bubbles/jade4.pngbin0 -> 1202 bytes
-rw-r--r--hacks/images/bubbles/jade5.pngbin0 -> 1670 bytes
-rw-r--r--hacks/images/bubbles/jade6.pngbin0 -> 2416 bytes
-rw-r--r--hacks/images/bubbles/jade7.pngbin0 -> 3255 bytes
-rw-r--r--hacks/images/bubbles/jade8.pngbin0 -> 4670 bytes
-rw-r--r--hacks/images/bubbles/jade9.pngbin0 -> 5758 bytes
-rw-r--r--hacks/images/chromesphere.pngbin0 -> 33091 bytes
-rw-r--r--hacks/images/earth.pngbin0 -> 433159 bytes
-rw-r--r--hacks/images/earth_flat.pngbin0 -> 16698 bytes
-rw-r--r--hacks/images/earth_night.pngbin0 -> 390020 bytes
-rw-r--r--hacks/images/ground.pngbin0 -> 13299 bytes
-rw-r--r--hacks/images/hmac.pngbin0 -> 439 bytes
-rw-r--r--hacks/images/iris.pngbin0 -> 143843 bytes
-rw-r--r--hacks/images/jigglymap.pngbin0 -> 29863 bytes
-rw-r--r--hacks/images/lament512.pngbin0 -> 566651 bytes
-rw-r--r--hacks/images/logo-180.pngbin0 -> 8734 bytes
-rw-r--r--hacks/images/logo-32.pngbin0 -> 1614 bytes
-rw-r--r--hacks/images/logo-50.pngbin0 -> 2030 bytes
-rw-r--r--hacks/images/m6502/amiga.asm120
-rw-r--r--hacks/images/m6502/breakout.asm195
-rw-r--r--hacks/images/m6502/byterun.asm100
-rw-r--r--hacks/images/m6502/cellular-30.asm67
-rw-r--r--hacks/images/m6502/cellular-600.asm209
-rw-r--r--hacks/images/m6502/colors.asm46
-rw-r--r--hacks/images/m6502/crunch6502.asm292
-rw-r--r--hacks/images/m6502/demoscene.asm457
-rw-r--r--hacks/images/m6502/disco.asm23
-rw-r--r--hacks/images/m6502/dmsc.asm130
-rw-r--r--hacks/images/m6502/dmsc.txt768
-rw-r--r--hacks/images/m6502/dragon-fractal.asm49
-rw-r--r--hacks/images/m6502/fullscreenlogo.asm107
-rw-r--r--hacks/images/m6502/greynetic.asm96
-rw-r--r--hacks/images/m6502/keftal.asm82
-rw-r--r--hacks/images/m6502/life.asm127
-rw-r--r--hacks/images/m6502/lines.asm313
-rw-r--r--hacks/images/m6502/matrix.asm67
-rw-r--r--hacks/images/m6502/noise.asm16
-rw-r--r--hacks/images/m6502/random-walk.asm82
-rw-r--r--hacks/images/m6502/random.asm11
-rw-r--r--hacks/images/m6502/random2.asm11
-rw-r--r--hacks/images/m6502/rorschach.asm124
-rw-r--r--hacks/images/m6502/santa.asm142
-rw-r--r--hacks/images/m6502/selfmodify.asm12
-rw-r--r--hacks/images/m6502/sflake.asm320
-rw-r--r--hacks/images/m6502/sierpinski.asm24
-rw-r--r--hacks/images/m6502/sierpinsky.asm131
-rw-r--r--hacks/images/m6502/softsprite.asm132
-rw-r--r--hacks/images/m6502/spacer.asm235
-rw-r--r--hacks/images/m6502/starfield2d.asm50
-rw-r--r--hacks/images/m6502/texture.asm393
-rw-r--r--hacks/images/m6502/wave6502.asm164
-rw-r--r--hacks/images/m6502/zookeeper.asm109
-rw-r--r--hacks/images/mac.pngbin0 -> 211 bytes
-rw-r--r--hacks/images/macbomb.pngbin0 -> 697 bytes
-rw-r--r--hacks/images/matrix1.pngbin0 -> 29412 bytes
-rw-r--r--hacks/images/matrix1b.pngbin0 -> 11525 bytes
-rw-r--r--hacks/images/matrix2.pngbin0 -> 27982 bytes
-rw-r--r--hacks/images/matrix2b.pngbin0 -> 11468 bytes
-rw-r--r--hacks/images/matrix3.pngbin0 -> 125539 bytes
-rw-r--r--hacks/images/molecules/adenine.pdb37
-rw-r--r--hacks/images/molecules/adrenochrome.pdb55
-rw-r--r--hacks/images/molecules/bucky.pdb156
-rw-r--r--hacks/images/molecules/caffeine.pdb54
-rw-r--r--hacks/images/molecules/capsaicin.pdb49
-rw-r--r--hacks/images/molecules/chlordecone.pdb49
-rw-r--r--hacks/images/molecules/cocaine.pdb93
-rw-r--r--hacks/images/molecules/codeine.pdb93
-rw-r--r--hacks/images/molecules/cyclohexane.pdb151
-rw-r--r--hacks/images/molecules/cytosine.pdb33
-rw-r--r--hacks/images/molecules/dna.pdb972
-rw-r--r--hacks/images/molecules/dodecahedrane.pdb87
-rw-r--r--hacks/images/molecules/dthc.pdb107
-rw-r--r--hacks/images/molecules/dynamite.pdb47
-rw-r--r--hacks/images/molecules/glycol.pdb27
-rw-r--r--hacks/images/molecules/guanine.pdb39
-rw-r--r--hacks/images/molecules/heroin.pdb107
-rw-r--r--hacks/images/molecules/hexahelicene.pdb90
-rw-r--r--hacks/images/molecules/ibuprofen.pdb72
-rw-r--r--hacks/images/molecules/lsd.pdb104
-rw-r--r--hacks/images/molecules/menthol.pdb69
-rw-r--r--hacks/images/molecules/mescaline.pdb71
-rw-r--r--hacks/images/molecules/methamphetamine.pdb88
-rw-r--r--hacks/images/molecules/morphine.pdb87
-rw-r--r--hacks/images/molecules/nicotine.pdb59
-rw-r--r--hacks/images/molecules/novocaine.pdb81
-rw-r--r--hacks/images/molecules/olestra.pdb913
-rw-r--r--hacks/images/molecules/penicillin.pdb89
-rw-r--r--hacks/images/molecules/salvinorin.pdb92
-rw-r--r--hacks/images/molecules/sarin.pdb43
-rw-r--r--hacks/images/molecules/strychnine.pdb101
-rw-r--r--hacks/images/molecules/sucrose.pdb97
-rw-r--r--hacks/images/molecules/thalidomide.pdb65
-rw-r--r--hacks/images/molecules/thymine.pdb37
-rw-r--r--hacks/images/molecules/viagra.pdb133
-rw-r--r--hacks/images/molecules/vitaminb6.pdb56
-rw-r--r--hacks/images/molecules/vitaminc.pdb47
-rw-r--r--hacks/images/molecules/vx.pdb92
-rw-r--r--hacks/images/noseguy/nose-f1.pngbin0 -> 454 bytes
-rw-r--r--hacks/images/noseguy/nose-f2.pngbin0 -> 397 bytes
-rw-r--r--hacks/images/noseguy/nose-f3.pngbin0 -> 396 bytes
-rw-r--r--hacks/images/noseguy/nose-f4.pngbin0 -> 448 bytes
-rw-r--r--hacks/images/noseguy/nose-l1.pngbin0 -> 388 bytes
-rw-r--r--hacks/images/noseguy/nose-l2.pngbin0 -> 470 bytes
-rw-r--r--hacks/images/noseguy/nose-r1.pngbin0 -> 386 bytes
-rw-r--r--hacks/images/noseguy/nose-r2.pngbin0 -> 467 bytes
-rw-r--r--hacks/images/osx_10_2.pngbin0 -> 53621 bytes
-rw-r--r--hacks/images/osx_10_3.pngbin0 -> 28292 bytes
-rw-r--r--hacks/images/pacman.pngbin0 -> 2695 bytes
-rw-r--r--hacks/images/ransomware.pngbin0 -> 976 bytes
-rw-r--r--hacks/images/sball-bg.pngbin0 -> 31249 bytes
-rw-r--r--hacks/images/sball.pngbin0 -> 2334 bytes
-rw-r--r--hacks/images/scales.pngbin0 -> 8573 bytes
-rw-r--r--hacks/images/sclera.pngbin0 -> 230321 bytes
-rw-r--r--hacks/images/sea-texture.pngbin0 -> 6933 bytes
-rw-r--r--hacks/images/som.pngbin0 -> 7593 bytes
-rw-r--r--hacks/images/start.pngbin0 -> 1153 bytes
-rw-r--r--hacks/images/testcard_bbcf.pngbin0 -> 67094 bytes
-rw-r--r--hacks/images/testcard_pm5544.pngbin0 -> 20774 bytes
-rw-r--r--hacks/images/testcard_rca.pngbin0 -> 96263 bytes
-rw-r--r--hacks/images/timetunnel0.pngbin0 -> 35798 bytes
-rw-r--r--hacks/images/timetunnel1.pngbin0 -> 131957 bytes
-rw-r--r--hacks/images/timetunnel2.pngbin0 -> 50547 bytes
-rw-r--r--hacks/images/toast.pngbin0 -> 11667 bytes
-rw-r--r--hacks/images/tree.pngbin0 -> 5944 bytes
-rw-r--r--hacks/images/tunnel0.pngbin0 -> 6996 bytes
-rw-r--r--hacks/images/tunnel1.pngbin0 -> 3449 bytes
-rw-r--r--hacks/images/tunnel2.pngbin0 -> 11424 bytes
-rw-r--r--hacks/images/tunnel3.pngbin0 -> 6725 bytes
-rw-r--r--hacks/images/tunnel4.pngbin0 -> 3297 bytes
-rw-r--r--hacks/images/tunnel5.pngbin0 -> 3340 bytes
-rw-r--r--hacks/images/tunnelstar.pngbin0 -> 23414 bytes
-rw-r--r--hacks/images/win10_spinner.gifbin0 -> 64501 bytes
-rw-r--r--hacks/images/wood.pngbin0 -> 2130 bytes
-rw-r--r--hacks/images/wood2.pngbin0 -> 3274 bytes
-rw-r--r--hacks/imsmap.c420
-rw-r--r--hacks/imsmap.man64
-rw-r--r--hacks/interaggregate.c981
-rw-r--r--hacks/interaggregate.man72
-rw-r--r--hacks/interference.c1001
-rw-r--r--hacks/interference.man86
-rw-r--r--hacks/intermomentary.c577
-rw-r--r--hacks/intermomentary.man82
-rw-r--r--hacks/juggle.c2796
-rw-r--r--hacks/juggle.man181
-rw-r--r--hacks/julia.c442
-rw-r--r--hacks/julia.man81
-rw-r--r--hacks/kaleidescope.c490
-rw-r--r--hacks/kaleidescope.man89
-rw-r--r--hacks/kumppa.c537
-rw-r--r--hacks/kumppa.man65
-rw-r--r--hacks/laser.c355
-rw-r--r--hacks/laser.man68
-rw-r--r--hacks/lcdscrub.c401
-rw-r--r--hacks/lcdscrub.man73
-rw-r--r--hacks/lightning.c601
-rw-r--r--hacks/lightning.man62
-rw-r--r--hacks/link_axp.com107
-rw-r--r--hacks/link_decc.com107
-rw-r--r--hacks/lisa.c739
-rw-r--r--hacks/lisa.man71
-rw-r--r--hacks/lissie.c322
-rw-r--r--hacks/lissie.man69
-rwxr-xr-xhacks/ljlatest1
-rw-r--r--hacks/ljlatest.man61
-rw-r--r--hacks/lmorph.c568
-rw-r--r--hacks/lmorph.man65
-rw-r--r--hacks/loop.c1694
-rw-r--r--hacks/loop.man65
-rw-r--r--hacks/m6502.c307
-rwxr-xr-xhacks/m6502.sh26
-rw-r--r--hacks/maze.c1661
-rw-r--r--hacks/maze.man148
-rw-r--r--hacks/memscroller.c636
-rw-r--r--hacks/memscroller.man78
-rw-r--r--hacks/metaballs.c436
-rw-r--r--hacks/metaballs.man73
-rw-r--r--hacks/moire.c245
-rw-r--r--hacks/moire.man68
-rw-r--r--hacks/moire2.c356
-rw-r--r--hacks/moire2.man63
-rw-r--r--hacks/mountain.c282
-rw-r--r--hacks/mountain.man60
-rw-r--r--hacks/munch.c476
-rw-r--r--hacks/munch.man153
-rwxr-xr-xhacks/munge-ad.pl237
-rw-r--r--hacks/nerverot.c1354
-rw-r--r--hacks/nerverot.man132
-rw-r--r--hacks/noseguy.c689
-rw-r--r--hacks/noseguy.man84
-rw-r--r--hacks/pacman.c1467
-rw-r--r--hacks/pacman.h220
-rw-r--r--hacks/pacman.man67
-rw-r--r--hacks/pacman_ai.c876
-rw-r--r--hacks/pacman_ai.h32
-rw-r--r--hacks/pacman_level.c772
-rw-r--r--hacks/pacman_level.h33
-rw-r--r--hacks/pedal.c335
-rw-r--r--hacks/pedal.man60
-rw-r--r--hacks/penetrate.c977
-rw-r--r--hacks/penetrate.man98
-rw-r--r--hacks/penrose.c1352
-rw-r--r--hacks/penrose.man106
-rw-r--r--hacks/petri.c761
-rw-r--r--hacks/petri.man129
-rw-r--r--hacks/phosphor.c1451
-rw-r--r--hacks/phosphor.man173
-rw-r--r--hacks/piecewise.c1006
-rw-r--r--hacks/piecewise.man77
-rw-r--r--hacks/polyominoes.c2368
-rw-r--r--hacks/polyominoes.man65
-rw-r--r--hacks/pong.c1118
-rw-r--r--hacks/pong.man86
-rw-r--r--hacks/popsquares.c306
-rw-r--r--hacks/pyro.c368
-rw-r--r--hacks/pyro.man64
-rw-r--r--hacks/qix.c624
-rw-r--r--hacks/qix.man132
-rw-r--r--hacks/rd-bomb.c549
-rw-r--r--hacks/rd-bomb.man100
-rw-r--r--hacks/recanim.c413
-rw-r--r--hacks/recanim.h36
-rw-r--r--hacks/ripples.c1118
-rw-r--r--hacks/ripples.man96
-rw-r--r--hacks/rocks.c550
-rw-r--r--hacks/rocks.man90
-rw-r--r--hacks/rorschach.c214
-rw-r--r--hacks/rorschach.man75
-rw-r--r--hacks/rotor.c389
-rw-r--r--hacks/rotor.man68
-rw-r--r--hacks/rotzoomer.c585
-rw-r--r--hacks/rotzoomer.man88
-rw-r--r--hacks/screenhack.c984
-rw-r--r--hacks/screenhack.h67
-rw-r--r--hacks/screenhackI.h162
-rw-r--r--hacks/shadebobs.c471
-rw-r--r--hacks/shadebobs.man65
-rw-r--r--hacks/sierpinski.c213
-rw-r--r--hacks/sierpinski.man69
-rw-r--r--hacks/slidescreen.c510
-rw-r--r--hacks/slidescreen.man97
-rw-r--r--hacks/slip.c375
-rw-r--r--hacks/slip.man86
-rw-r--r--hacks/speedmine.c1647
-rw-r--r--hacks/speedmine.man246
-rw-r--r--hacks/sphere.c303
-rw-r--r--hacks/sphere.man62
-rw-r--r--hacks/spiral.c330
-rw-r--r--hacks/spiral.man71
-rw-r--r--hacks/spotlight.c353
-rw-r--r--hacks/spotlight.man80
-rw-r--r--hacks/squiral.c290
-rw-r--r--hacks/squiral.man80
-rw-r--r--hacks/starfish.c559
-rw-r--r--hacks/starfish.man84
-rw-r--r--hacks/strange.c1341
-rw-r--r--hacks/strange.man79
-rw-r--r--hacks/substrate.c773
-rw-r--r--hacks/substrate.man73
-rw-r--r--hacks/swirl.c1445
-rw-r--r--hacks/swirl.man70
-rw-r--r--hacks/t3d.c980
-rw-r--r--hacks/t3d.man131
-rw-r--r--hacks/tessellimage.c1013
-rw-r--r--hacks/tessellimage.man86
-rw-r--r--hacks/testx11.c968
-rw-r--r--hacks/thornbird.c264
-rw-r--r--hacks/thornbird.man64
-rw-r--r--hacks/triangle.c354
-rw-r--r--hacks/triangle.man56
-rw-r--r--hacks/truchet.c536
-rw-r--r--hacks/truchet.man139
-rw-r--r--hacks/twang.c775
-rw-r--r--hacks/twang.man132
-rw-r--r--hacks/vermiculate.c1221
-rw-r--r--hacks/vermiculate.man48
-rw-r--r--hacks/vfeedback.c628
-rw-r--r--hacks/vfeedback.man71
-rwxr-xr-xhacks/vidwhacker506
-rw-r--r--hacks/vidwhacker.man89
-rw-r--r--hacks/vines.c179
-rw-r--r--hacks/vines.man66
-rw-r--r--hacks/vms_axp.opt4
-rw-r--r--hacks/vms_axp_12.opt4
-rw-r--r--hacks/vms_decc.opt4
-rw-r--r--hacks/vms_decc_12.opt4
-rw-r--r--hacks/wander.c280
-rw-r--r--hacks/wander.man76
-rwxr-xr-xhacks/webcollage4048
-rw-r--r--hacks/webcollage-cocoa.m428
-rw-r--r--hacks/webcollage-helper-cocoa.m510
-rw-r--r--hacks/webcollage-helper.c592
-rw-r--r--hacks/webcollage.man247
-rw-r--r--hacks/whirlwindwarp.c506
-rw-r--r--hacks/whirlwindwarp.man64
-rw-r--r--hacks/whirlygig.c733
-rw-r--r--hacks/whirlygig.man137
-rw-r--r--hacks/worm.c433
-rw-r--r--hacks/worm.man65
-rw-r--r--hacks/wormhole.c725
-rw-r--r--hacks/wormhole.man69
-rw-r--r--hacks/xanalogtv.c654
-rw-r--r--hacks/xanalogtv.man84
-rw-r--r--hacks/xflame.c819
-rw-r--r--hacks/xflame.man72
-rw-r--r--hacks/ximage-loader.c686
-rw-r--r--hacks/ximage-loader.h37
-rw-r--r--hacks/xjack.c487
-rw-r--r--hacks/xjack.man52
-rw-r--r--hacks/xlockmore.c773
-rw-r--r--hacks/xlockmore.h255
-rw-r--r--hacks/xlockmoreI.h177
-rw-r--r--hacks/xlyap.c1932
-rw-r--r--hacks/xlyap.man223
-rw-r--r--hacks/xmatrix.c1856
-rw-r--r--hacks/xmatrix.man146
-rwxr-xr-xhacks/xml2man.pl266
-rw-r--r--hacks/xrayswarm.c1224
-rw-r--r--hacks/xrayswarm.man50
-rw-r--r--hacks/xscreensaver-sgigl.c266
-rw-r--r--hacks/xspirograph.c333
-rw-r--r--hacks/xspirograph.man71
-rw-r--r--hacks/xsublim.c799
-rw-r--r--hacks/xsublim.man91
-rw-r--r--hacks/zoom.c291
-rw-r--r--hacks/zoom.man111
1163 files changed, 866018 insertions, 0 deletions
diff --git a/hacks/.gdbinit b/hacks/.gdbinit
new file mode 100644
index 0000000..5649178
--- /dev/null
+++ b/hacks/.gdbinit
@@ -0,0 +1,12 @@
+set args -geom =800x600+0+0 -sync
+set env MallocScribble 1
+set env MallocPreScribble 1
+set env MallocErrorAbort 1
+set env MallocCheckHeapAbort 1
+set env MallocGuardEdges 1
+#set env MallocCheckHeapStart 130000
+#set env MallocCheckHeapEach 1
+b screenhack_ehandler
+b malloc_error_break
+b exit
+b abort
diff --git a/hacks/Makefile.in b/hacks/Makefile.in
new file mode 100644
index 0000000..4556872
--- /dev/null
+++ b/hacks/Makefile.in
@@ -0,0 +1,3263 @@
+# hacks/Makefile.in --- xscreensaver, Copyright (c) 1997-2015 Jamie Zawinski.
+# the `../configure' script generates `hacks/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+
+install_prefix =
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+mandir = @mandir@
+libexecdir = @libexecdir@
+mansuffix = 6
+manNdir = $(mandir)/man$(mansuffix)
+
+HACKDIR = @HACKDIR@
+HACK_CONF_DIR = @HACK_CONF_DIR@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+DEFS = -DSTANDALONE @DEFS@
+LIBS = @LIBS@
+PERL = @PERL@
+
+THREAD_LIBS = @PTHREAD_LIBS@
+THREAD_CFLAGS = @PTHREAD_CFLAGS@
+
+DEPEND = @DEPEND@
+DEPEND_FLAGS = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL = /bin/sh
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_DIRS = @INSTALL_DIRS@
+
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+XMU_LIBS = @XMU_LIBS@
+XFT_LIBS = @XFT_LIBS@
+
+# Note: see comment in ../driver/Makefile.in for explanation of X_LIBS, etc.
+#
+HACK_PRE = $(LIBS) $(X_LIBS)
+HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ @HACK_LIBS@ $(HACK_POST)
+PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ @HACK_LIBS@ $(HACK_POST)
+JPEG_LIBS = @JPEG_LIBS@
+XLOCK_LIBS = $(HACK_LIBS)
+TEXT_LIBS = @PTY_LIBS@
+
+UTILS_SRC = $(srcdir)/../utils
+UTILS_BIN = ../utils
+HACK_BIN = .
+
+INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I..
+INCLUDES = $(INCLUDES_1) @INCLUDES@
+
+UTIL_SRCS = $(UTILS_SRC)/alpha.c $(UTILS_SRC)/colors.c \
+ $(UTILS_SRC)/grabclient.c \
+ $(UTILS_SRC)/hsv.c $(UTILS_SRC)/resources.c \
+ $(UTILS_SRC)/spline.c $(UTILS_SRC)/usleep.c \
+ $(UTILS_SRC)/visual.c \
+ $(UTILS_SRC)/yarandom.c $(UTILS_SRC)/erase.c \
+ $(UTILS_SRC)/xshm.c $(UTILS_SRC)/xdbe.c \
+ $(UTILS_SRC)/textclient.c $(UTILS_SRC)/aligned_malloc.c \
+ $(UTILS_SRC)/thread_util.c $(UTILS_SRC)/pow2.c \
+ $(UTILS_SRC)/font-retry.c
+UTIL_OBJS = $(UTILS_BIN)/alpha.o $(UTILS_BIN)/colors.o \
+ $(UTILS_BIN)/grabclient.o \
+ $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/spline.o $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/erase.o \
+ $(UTILS_BIN)/xshm.o $(UTILS_BIN)/xdbe.o \
+ $(UTILS_BIN)/colorbars.o \
+ $(UTILS_BIN)/textclient.o $(UTILS_BIN)/aligned_malloc.o \
+ $(UTILS_BIN)/thread_util.o $(UTILS_BIN)/pow2.o \
+ $(UTILS_BIN)/xft.o $(UTILS_BIN)/utf8wc.o \
+ $(UTILS_BIN)/font-retry-xft.o
+
+SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
+ bubbles-default.c decayscreen.c deco.c drift.c flag.c \
+ flame.c forest.c vines.c galaxy.c grav.c greynetic.c \
+ halo.c helix.c hopalong.c hypercube.c ifs.c imsmap.c \
+ julia.c kaleidescope.c laser.c lightning.c lisa.c lmorph.c \
+ maze.c moire.c noseguy.c pedal.c penrose.c pyro.c qix.c \
+ rocks.c rorschach.c screenhack.c sierpinski.c slidescreen.c \
+ slip.c sphere.c spiral.c strange.c swirl.c xlockmore.c \
+ fps.c goop.c starfish.c munch.c fadeplot.c \
+ rd-bomb.c coral.c mountain.c triangle.c lissie.c worm.c \
+ rotor.c ant.c xjack.c xlyap.c xscreensaver-sgigl.c \
+ cynosure.c moire2.c flow.c epicycle.c interference.c \
+ truchet.c bsod.c crystal.c discrete.c distort.c kumppa.c \
+ demon.c loop.c t3d.c penetrate.c deluxe.c compass.c \
+ squiral.c xflame.c wander.c spotlight.c critical.c \
+ phosphor.c xmatrix.c petri.c shadebobs.c xsublim.c ccurve.c \
+ blaster.c bumps.c ripples.c xspirograph.c \
+ nerverot.c xrayswarm.c hyperball.c zoom.c whirlwindwarp.c \
+ rotzoomer.c whirlygig.c speedmine.c vermiculate.c \
+ ximage-loader.c webcollage-helper.c twang.c apollonian.c \
+ euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \
+ anemone.c halftone.c metaballs.c eruption.c popsquares.c \
+ barcode.c piecewise.c cloudlife.c fontglide.c apple2.c \
+ apple2-main.c analogtv.c xanalogtv.c pong.c filmleader.c \
+ wormhole.c pacman.c pacman_ai.c pacman_level.c \
+ fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
+ intermomentary.c fireworkx.c fiberlamp.c \
+ boxfit.c interaggregate.c celtic.c cwaves.c m6502.c \
+ asm6502.c abstractile.c lcdscrub.c hexadrop.c \
+ tessellimage.c delaunay.c recanim.c binaryring.c \
+ glitchpeg.c vfeedback.c \
+ webcollage-cocoa.m webcollage-helper-cocoa.m testx11.c
+SCRIPTS = vidwhacker webcollage ljlatest
+
+# Programs that are mentioned in XScreenSaver.ad, and that have XML files,
+# but that are not shipped with xscreensaver itself.
+#
+EXTERNALS = cosmos electricsheep fireflies goban \
+ sphereeversion ssystem xaos xdaliclock xearth xfishtank \
+ xmountains xplanet xsnow
+
+OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
+ bubbles-default.o decayscreen.o deco.o drift.o flag.o \
+ flame.o forest.o vines.o galaxy.o grav.o greynetic.o \
+ halo.o helix.o hopalong.o hypercube.o ifs.o imsmap.o \
+ julia.o kaleidescope.o laser.o lightning.o lisa.o lmorph.o \
+ maze.o moire.o noseguy.o pedal.o penrose.o pyro.o qix.o \
+ rocks.o rorschach.o screenhack.o sierpinski.o slidescreen.o \
+ slip.o sphere.o spiral.o strange.o swirl.o xlockmore.o \
+ fps.o goop.o starfish.o munch.o fadeplot.o \
+ rd-bomb.o coral.o mountain.o triangle.o lissie.o worm.o \
+ rotor.o ant.o xjack.o xlyap.o xscreensaver-sgigl.o \
+ cynosure.o moire2.o flow.o epicycle.o interference.o \
+ truchet.o bsod.o crystal.o discrete.o distort.o kumppa.o \
+ demon.o loop.o t3d.o penetrate.o deluxe.o compass.o \
+ squiral.o xflame.o wander.o spotlight.o critical.o \
+ phosphor.o xmatrix.o petri.o shadebobs.o xsublim.o ccurve.o \
+ blaster.o bumps.o ripples.o xspirograph.o \
+ nerverot.o xrayswarm.o hyperball.o zoom.o whirlwindwarp.o \
+ rotzoomer.o whirlygig.o speedmine.o vermiculate.o \
+ ximage-loader.o webcollage-helper.o twang.o apollonian.o \
+ euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \
+ anemone.o halftone.o metaballs.o eruption.o popsquares.o \
+ barcode.o piecewise.o cloudlife.o fontglide.o apple2.o \
+ apple2-main.o analogtv.o xanalogtv.o pong.o filmleader.o \
+ wormhole.o pacman.o pacman_ai.o pacman_level.o \
+ fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \
+ intermomentary.o fireworkx.o fiberlamp.o boxfit.o \
+ interaggregate.o celtic.o cwaves.o webcollage-cocoa.o \
+ webcollage-helper-cocoa.o m6502.o asm6502.o abstractile.o \
+ lcdscrub.o hexadrop.o tessellimage.o delaunay.o recanim.o \
+ binaryring.o glitchpeg.o vfeedback.o testx11.o
+
+EXES = attraction blitspin bouboule braid decayscreen deco \
+ drift flame galaxy grav greynetic halo \
+ helix hopalong ifs imsmap julia kaleidescope \
+ maze moire noseguy pedal \
+ penrose pyro qix rocks rorschach sierpinski slidescreen \
+ slip strange swirl goop starfish munch \
+ fadeplot rd-bomb coral mountain triangle \
+ xjack xlyap cynosure moire2 flow epicycle \
+ interference truchet bsod crystal discrete distort kumppa \
+ demon loop penetrate deluxe compass squiral xflame \
+ wander spotlight phosphor xmatrix petri shadebobs \
+ ccurve blaster bumps ripples xspirograph \
+ nerverot xrayswarm zoom whirlwindwarp rotzoomer \
+ speedmine vermiculate twang apollonian euler2d \
+ polyominoes thornbird fluidballs anemone halftone \
+ metaballs eruption popsquares barcode piecewise cloudlife \
+ fontglide apple2 xanalogtv pong filmleader wormhole \
+ pacman fuzzyflakes anemotaxis memscroller substrate \
+ intermomentary fireworkx fiberlamp boxfit interaggregate \
+ celtic cwaves m6502 abstractile lcdscrub hexadrop \
+ tessellimage binaryring glitchpeg vfeedback \
+ @JPEG_EXES@
+JPEG_EXES = webcollage-helper
+
+RETIRED_EXES = ant bubbles critical flag forest hyperball hypercube laser \
+ lightning lisa lissie lmorph rotor sphere spiral t3d vines \
+ whirlygig worm xsublim juggle testx11
+
+HACK_OBJS_1 = fps.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \
+ $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/font-retry-xft.o \
+ @XMU_OBJS@ @XFT_OBJS@ @ANIM_OBJS@
+HACK_OBJS = screenhack.o $(HACK_OBJS_1)
+XLOCK_OBJS = screenhack.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1) \
+ $(ERASE)
+COLOR_OBJS = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
+GRAB_OBJS = $(UTILS_BIN)/grabclient.o
+XSHM_OBJS = $(UTILS_BIN)/xshm.o
+XDBE_OBJS = $(UTILS_BIN)/xdbe.o
+ANIM_OBJS = recanim.o
+ANIM_LIBS = @PNG_LIBS@
+THREAD_OBJS = $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o
+
+HDRS = screenhack.h screenhackI.h fps.h fpsI.h xlockmore.h \
+ xlockmoreI.h automata.h bubbles.h ximage-loader.h \
+ apple2.h analogtv.h pacman.h pacman_ai.h pacman_level.h \
+ asm6502.h delaunay.h recanim.h
+MEN = anemone.man apollonian.man attraction.man \
+ blaster.man blitspin.man bouboule.man braid.man bsod.man \
+ bumps.man ccurve.man compass.man coral.man \
+ crystal.man cynosure.man decayscreen.man \
+ deco.man deluxe.man demon.man discrete.man distort.man \
+ drift.man epicycle.man euler2d.man fadeplot.man \
+ flame.man flow.man fluidballs.man galaxy.man \
+ goop.man grav.man greynetic.man halo.man helix.man \
+ hopalong.man ifs.man imsmap.man \
+ interference.man julia.man \
+ kaleidescope.man kumppa.man \
+ loop.man maze.man moire.man \
+ moire2.man mountain.man munch.man nerverot.man noseguy.man \
+ pedal.man penetrate.man penrose.man petri.man phosphor.man \
+ polyominoes.man pyro.man qix.man rd-bomb.man ripples.man \
+ rocks.man rorschach.man rotzoomer.man \
+ shadebobs.man sierpinski.man slidescreen.man slip.man \
+ speedmine.man \
+ spotlight.man squiral.man starfish.man strange.man \
+ swirl.man thornbird.man triangle.man truchet.man \
+ twang.man vermiculate.man vidwhacker.man \
+ wander.man webcollage.man whirlwindwarp.man \
+ xflame.man xjack.man xlyap.man xmatrix.man \
+ xrayswarm.man xspirograph.man \
+ zoom.man halftone.man eruption.man metaballs.man \
+ barcode.man piecewise.man cloudlife.man ljlatest.man \
+ fontglide.man apple2.man xanalogtv.man filmleader.man \
+ pong.man wormhole.man pacman.man fuzzyflakes.man \
+ anemotaxis.man memscroller.man substrate.man \
+ intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
+ interaggregate.man celtic.man cwaves.man abstractile.man \
+ lcdscrub.man hexadrop.man tessellimage.man binaryring.man \
+ glitchpeg.man vfeedback.man
+
+RETIRED_MEN = ant.man bubbles.man critical.man flag.man forest.man \
+ laser.man lightning.man lisa.man lissie.man lmorph.man \
+ rotor.man sphere.man spiral.man t3d.man vines.man \
+ whirlygig.man worm.man xsublim.man juggle.man \
+ hypercube.man hyperball.man
+
+STAR = *
+EXTRAS = README Makefile.in xml2man.pl m6502.sh .gdbinit \
+ euler2d.tex check-configs.pl munge-ad.pl \
+ config/README \
+ config/$(STAR).xml \
+ config/$(STAR).dtd \
+ config/$(STAR).xsd \
+
+VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \
+ vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
+
+TARFILES = $(SRCS) $(HDRS) $(SCRIPTS) $(MEN) $(RETIRED_MEN) \
+ $(EXTRAS) $(VMSFILES)
+
+
+default: all
+all: $(EXES) $(RETIRED_EXES)
+
+install: install-program install-scripts install-xml install-man
+uninstall: uninstall-program uninstall-xml uninstall-man
+
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
+ install
+
+# the hacks, in $HACKDIR
+install-program:: $(EXES)
+ @if [ ! -d $(install_prefix)$(HACKDIR) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(HACKDIR) ; \
+ fi ; \
+ for program in $(EXES); do \
+ echo $(INSTALL_PROGRAM) $$program \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ $(INSTALL_PROGRAM) $$program \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ done
+
+install-scripts: $(SCRIPTS) munge-scripts
+ @for program in $(SCRIPTS); do \
+ if [ -r $$program ] ; then \
+ p=$$program ; \
+ else \
+ p=$(srcdir)/$$program ; \
+ fi ; \
+ echo $(INSTALL_SCRIPT) $$p \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ $(INSTALL_SCRIPT) $$p \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ done
+
+munge-scripts: $(SCRIPTS)
+ @tmp=/tmp/mf.$$$$ ; \
+ perl="${PERL}" ; \
+ rm -f $$tmp ; \
+ for program in $(SCRIPTS); do \
+ sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@" \
+ < $(srcdir)/$$program > $$tmp ; \
+ if ! cmp -s $(srcdir)/$$program $$tmp ; then \
+ echo "$$program: setting interpreter to $$perl" >&2 ; \
+ cat $$tmp > ./$$program ; \
+ fi ; \
+ done ; \
+ rm -f $$tmp
+
+# When installing man pages, we install "foo.man" as "foo.N" and update
+# the .TH line in the installed file with one like
+#
+# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
+#
+# where N is the manual section suffix.
+#
+install-man: $(MEN)
+ @men="$(MEN)" ; \
+ U=$(UTILS_SRC)/version.h ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
+ T=/tmp/xs$$$$.$(mansuffix) ; \
+ TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
+ echo "installing man pages: $$TH" ; \
+ \
+ if [ ! -d $(install_prefix)$(manNdir) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
+ fi ; \
+ \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ manbase=`echo $$man | sed 's/\.man$$//'` ; \
+ TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
+ sed -e "s/^\.TH.*/$$TH/" \
+ -e 's@(MANSUFFIX)@($(mansuffix))@g' \
+ < $(srcdir)/$$man > $$T ; \
+ echo $(INSTALL_DATA) $(srcdir)/$$man \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ $(INSTALL_DATA) $$T \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ done ; \
+ rm -f $$T
+
+install-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ if [ ! -d $$dest ]; then \
+ $(INSTALL_DIRS) $$dest ; \
+ fi ; \
+ src=$(srcdir)/config ; \
+ for file in $(EXES) $(SCRIPTS) $(EXTERNALS) ; do \
+ if [ -f $$src/$$file.xml ]; then \
+ echo $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ fi ; \
+ done
+
+uninstall-program:
+ @for program in $(EXES) $(RETIRED_EXES) $(SCRIPTS); do \
+ echo rm -f $(install_prefix)$(HACKDIR)/$$program ; \
+ rm -f $(install_prefix)$(HACKDIR)/$$program ; \
+ done
+
+uninstall-man:
+ @men="$(MEN) $(RETIRED_MEN)" ; \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ done
+
+uninstall-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) $(EXTERNALS) ; do \
+ echo rm -f $$dest/$$file.xml ; \
+ rm -f $$dest/$$file.xml ; \
+ done
+
+clean::
+ -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) m6502.h
+
+distclean: clean
+ -rm -f Makefile TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend:
+ $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
+ $(DEPEND_FLAGS) -- \
+ $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close. This excludes dependencies on files in /usr/include, etc. It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend:: m6502.h
+ @echo updating dependencies in `pwd`/Makefile.in... ; \
+ $(DEPEND) -w 0 -f - \
+ -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+ $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS) 2>/dev/null | \
+ sort -d | \
+ ( \
+ awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+ sed -e '/^#.*/d' \
+ -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \
+ -e 's@\.\./utils@$$(UTILS_SRC)@g' \
+ -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \
+ -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' \
+ -e 's@ $$(srcdir)/\(m6502.h\)@ \1@g' ; \
+ echo '' \
+ ) > /tmp/distdepend.$$$$ && \
+ mv /tmp/distdepend.$$$$ Makefile.in
+
+TAGS: tags
+tags:
+ find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+ @echo $(TARFILES)
+
+check_men:
+ @badmen="" ; \
+ for exe in $(EXES) $(SCRIPTS); do \
+ if ! [ -f $(srcdir)/$$exe.man \
+ -o "$$exe" = webcollage-helper ]; then \
+ badmen="$$badmen $$exe" ; \
+ fi ; \
+ done ; \
+ if [ -n "$$badmen" ]; then \
+ echo "" ; \
+ echo "Warning: The following programs have no manuals:" ; \
+ echo "" ; \
+ for m in $$badmen ; do \
+ echo " $$m" ; \
+ done ; \
+ fi
+
+validate_xml:
+ @echo "Validating XML..." ; \
+ cd $(srcdir) ; ./check-configs.pl $(EXES)
+
+munge_ad_file:
+ @echo "Updating hack list in XScreenSaver.ad.in..." ; \
+ cd $(srcdir) ; ./munge-ad.pl ../driver/XScreenSaver.ad.in
+
+
+# Rules for generating the VMS makefiles on Unix, so that it doesn't have to
+# be done by hand...
+#
+VMS_AXP_COMPILE_1=$$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE
+VMS_AXP_COMPILE_2=)/INCL=([],[-],[-.UTILS])
+
+compile_axp.com: Makefile.in
+ @echo generating $@ from $<... ; \
+ ( for c in $(SRCS) ; do \
+ c=`echo $$c | tr a-z A-Z` ; \
+ echo "$(VMS_AXP_COMPILE_1)$(VMS_AXP_COMPILE_2) $$c" ; \
+ done ; \
+ ) | sort -d > $@
+
+compile_decc.com: compile_axp.com
+ @echo generating $@ from $<... ; \
+ sed 's/axp/decc/g' < $< > $@
+
+#### TODO: generating link_axp.com is kinda tricky...
+
+link_decc.com: link_axp.com
+ @echo generating $@ from $<... ; \
+ sed 's/axp/decc/g' < $< > $@
+
+$(srcdir)/../setup.com: Makefile.in
+ @echo generating $@ from $<... ; \
+ ( echo '$$! Xscreensaver - definition of various DCL symbols' ; \
+ echo '$$ set NOON' ; \
+ echo '$$ set def [.HACKS]' ; \
+ echo '$$ mydisk = f$$trnlmn("SYS$$DISK")' ; \
+ echo '$$ mydir = mydisk+f$$directory()' ; \
+ ( for c in $(EXES) ; do \
+ c2="$${c} " ; \
+ c2=`echo "$${c2}" | sed 's/^\(........*\) $$/\1/'` ; \
+ echo '$$' "$${c2}:== $$'mydir'$${c}" ; \
+ done ; \
+ ) | sort -d ; \
+ echo '$$ set def [-.DRIVER]' ; \
+ echo '$$ mydir = mydisk+f$$directory()' ; \
+ echo "$$ xscreensaver :== $$'mydir'xscreensaver" ; \
+ echo "$$ xscreen*command :== $$'mydir'xscreensaver-command" ; \
+ echo '$$ set def [-]' ; \
+ echo '$$ exit' ; \
+ ) > $@
+
+distdepend:: compile_axp.com compile_decc.com
+distdepend:: link_axp.com link_decc.com
+distdepend:: $(srcdir)/../setup.com
+distdepend:: check_men validate_xml munge_ad_file
+
+
+# Rules for noticing when the objects from the utils directory are out of
+# date with respect to their sources, and going and building them according
+# to the rules in their own Makefile...
+#
+$(UTILS_BIN)/alpha.o: $(UTILS_SRC)/alpha.c
+$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c
+$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
+$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c
+$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xft.o: $(UTILS_SRC)/xft.c
+$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
+$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/erase.o: $(UTILS_SRC)/erase.c
+$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c
+$(UTILS_BIN)/xdbe.o: $(UTILS_SRC)/xdbe.c
+$(UTILS_BIN)/textclient.o: $(UTILS_SRC)/textclient.c
+$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
+$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
+$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
+$(UTILS_BIN)/font-retry-xft.o: $(UTILS_SRC)/font-retry.c
+
+$(UTIL_OBJS):
+ cd $(UTILS_BIN) ; \
+ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+# How we build object files in this directory.
+.c.o:
+ $(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+
+
+# Make sure these are regenerated when the version number ticks.
+screenhack.o: $(UTILS_SRC)/version.h
+
+# Some abbreviations to keep the lines short...
+PNG = ximage-loader.o
+ALP = $(UTILS_BIN)/alpha.o
+HSV = $(UTILS_BIN)/hsv.o
+SPL = $(UTILS_BIN)/spline.o
+GRAB = $(GRAB_OBJS)
+ERASE = $(UTILS_BIN)/erase.o
+COL = $(COLOR_OBJS)
+SHM = $(XSHM_OBJS) $(THREAD_OBJS)
+DBE = $(XDBE_OBJS)
+BARS = $(UTILS_BIN)/colorbars.o
+THRO = $(THREAD_OBJS)
+THRL = $(THREAD_CFLAGS) $(THREAD_LIBS)
+ATV = analogtv.o $(SHM)
+APPLE2 = apple2.o $(ATV)
+TEXT = $(UTILS_BIN)/textclient.o
+
+CC_HACK = $(CC) $(LDFLAGS)
+
+xscreensaver-sgigl: xscreensaver-sgigl.c
+ $(CC) $(LDFLAGS) -o $@ $< -I$(UTILS_SRC) $(HACK_PRE) \
+ $(XMU_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm
+
+test-utf8wc: $(UTILS_SRC)/utf8wc.c
+ $(CC) $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $(LDFLAGS)\
+ -o $@ -DSELFTEST $<
+
+# Make sure the images have been packaged. This is the first one hit:
+$(HACK_BIN)/images/gen/nose-f1_png.h:
+ cd $(srcdir)/images && $(MAKE)
+
+# The rules for those hacks which follow the `screenhack.c' API.
+# If make wasn't such an utter abomination, these could all be combined
+# into one rule, but we don't live in such a perfect world. The $< rule
+# is pretty much useless in the face of more than one dependency, as far
+# as I can tell.
+#
+attraction: attraction.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+binaryring: binaryring.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+blitspin: blitspin.o $(HACK_OBJS) $(GRAB) $(PNG) $(UTILS_BIN)/pow2.o
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(PNG) $(UTILS_BIN)/pow2.o $(PNG_LIBS)
+
+bubbles: bubbles.o $(HACK_OBJS) bubbles-default.o $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) bubbles-default.o $(PNG) $(PNG_LIBS)
+
+decayscreen: decayscreen.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+deco: deco.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+flame: flame.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+greynetic: greynetic.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+halo: halo.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+helix: helix.o $(HACK_OBJS) $(HSV) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+hypercube: hypercube.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+imsmap: imsmap.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+kaleidescope: kaleidescope.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+lmorph: lmorph.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+maze: maze.o $(HACK_OBJS) $(ERASE) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ERASE) $(PNG) $(PNG_LIBS)
+
+moire: moire.o $(HACK_OBJS) $(COL) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS) $(THRL)
+
+moire2: moire2.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+noseguy: noseguy.o $(HACK_OBJS) $(PNG) $(TEXT)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(TEXT) $(PNG_LIBS) $(TEXT_LIBS)
+
+pedal: pedal.o $(HACK_OBJS) $(HSV) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+pyro: pyro.o $(HACK_OBJS) $(HSV)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(HACK_LIBS)
+
+qix: qix.o $(HACK_OBJS) $(HSV) $(ALP)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ALP) $(HACK_LIBS)
+
+rocks: rocks.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+rorschach: rorschach.o $(HACK_OBJS) $(HSV) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+slidescreen: slidescreen.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+goop: goop.o $(HACK_OBJS) $(HSV) $(ALP) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ALP) $(SPL) $(HACK_LIBS)
+
+starfish: starfish.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+munch: munch.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+rd-bomb: rd-bomb.o $(HACK_OBJS) $(COL) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS) $(THRL)
+
+coral: coral.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+xjack: xjack.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+xlyap: xlyap.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+cynosure: cynosure.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+epicycle: epicycle.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+interference: interference.o $(HACK_OBJS) $(COL) $(SHM) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(DBE) $(HACK_LIBS) $(THRL)
+
+truchet: truchet.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+bsod: bsod.o $(HACK_OBJS) $(GRAB) $(APPLE2) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(APPLE2) $(PNG) $(PNG_LIBS) $(THRL)
+
+apple2: apple2.o apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT) $(PNG)
+ $(CC_HACK) -o $@ $@.o apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT) $(PNG) $(PNG_LIBS) $(TEXT_LIBS) $(THRL)
+
+xanalogtv: xanalogtv.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+distort: distort.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+kumppa: kumppa.o $(HACK_OBJS) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+t3d: t3d.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+penetrate: penetrate.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+deluxe: deluxe.o $(HACK_OBJS) $(ALP) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS)
+
+compass: compass.o $(HACK_OBJS) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+squiral: squiral.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+xflame: xflame.o $(HACK_OBJS) $(SHM) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(PNG) $(PNG_LIBS) $(THRL)
+
+wander: wander.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+spotlight: spotlight.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+critical: critical.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+phosphor: phosphor.o $(HACK_OBJS) $(TEXT) $(COL) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(TEXT) $(COL) $(PNG) $(PNG_LIBS) $(TEXT_LIBS)
+
+xmatrix: xmatrix.o $(HACK_OBJS) $(TEXT) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(TEXT) $(PNG) $(PNG_LIBS) $(TEXT_LIBS)
+
+petri: petri.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+shadebobs: shadebobs.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+ccurve: ccurve.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+blaster: blaster.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+bumps: bumps.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+ripples: ripples.o $(HACK_OBJS) $(SHM) $(COL) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(COL) $(GRAB) $(HACK_LIBS) $(THRL)
+
+xspirograph: xspirograph.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+nerverot: nerverot.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+xrayswarm: xrayswarm.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+hyperball: hyperball.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+zoom: zoom.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+whirlwindwarp: whirlwindwarp.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+rotzoomer: rotzoomer.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+whirlygig: whirlygig.o $(HACK_OBJS) $(DBE) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(COL) $(HACK_LIBS)
+
+speedmine: speedmine.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+vermiculate: vermiculate.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+twang: twang.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+fluidballs: fluidballs.o $(HACK_OBJS) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+anemone: anemone.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+halftone: halftone.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+metaballs: metaballs.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+eruption: eruption.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+popsquares: popsquares.o $(HACK_OBJS) $(DBE) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(COL) $(HACK_LIBS)
+
+barcode: barcode.o $(HACK_OBJS) $(HSV)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(HACK_LIBS)
+
+piecewise: piecewise.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+cloudlife: cloudlife.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+fontglide: fontglide.o $(HACK_OBJS) $(DBE) $(TEXT)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(TEXT) $(HACK_LIBS) $(TEXT_LIBS)
+
+pong: pong.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+wormhole: wormhole.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+fuzzyflakes: fuzzyflakes.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+anemotaxis: anemotaxis.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+memscroller: memscroller.o $(HACK_OBJS) $(SHM) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(COL) $(HACK_LIBS) $(THRL)
+
+substrate: substrate.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+intermomentary: intermomentary.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+interaggregate: interaggregate.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+fireworkx: fireworkx.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+boxfit: boxfit.o $(HACK_OBJS) $(COL) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(GRAB) $(HACK_LIBS)
+
+ifs: ifs.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+celtic: celtic.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+cwaves: cwaves.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+m6502.h:
+ @echo "building m6502.h from $(srcdir)/images/m6502/*.asm"; \
+ UTILS_SRC="$(UTILS_SRC)" \
+ $(srcdir)/m6502.sh m6502.h $(srcdir)/images/m6502/*.asm
+
+m6502.o: m6502.h
+m6502: m6502.o asm6502.o $(HACK_OBJS) $(ATV) $(PNG)
+ $(CC_HACK) -o $@ $@.o asm6502.o $(HACK_OBJS) $(ATV) $(PNG) $(PNG_LIBS) $(THRL)
+
+abstractile: abstractile.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+lcdscrub: lcdscrub.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+hexadrop: hexadrop.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+tessellimage: tessellimage.o delaunay.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o delaunay.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+glitchpeg: glitchpeg.o $(HACK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(PNG_LIBS)
+
+filmleader: filmleader.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+vfeedback: vfeedback.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+
+testx11: testx11.o glx/rotator.o $(HACK_OBJS) $(COL) $(PNG) $(BARS) $(ERASE)
+ $(CC_HACK) -o $@ $@.o glx/rotator.o $(HACK_OBJS) $(COL) $(PNG) $(BARS) $(ERASE) $(PNG_LIBS)
+
+glx/rotator.o: glx/rotator.c
+ cd glx ; \
+ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+# The rules for those hacks which follow the `xlockmore' API.
+#
+
+bouboule: bouboule.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+braid: braid.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+drift: drift.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+flag: flag.o $(XLOCK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(PNG) $(PNG_LIBS)
+
+forest: forest.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+vines: vines.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+galaxy: galaxy.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+grav: grav.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+hopalong: hopalong.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+julia: julia.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+laser: laser.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+lightning: lightning.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+lisa: lisa.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+lissie: lissie.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+penrose: penrose.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+sierpinski: sierpinski.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+slip: slip.o $(XLOCK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(GRAB) $(HACK_LIBS)
+
+sphere: sphere.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+spiral: spiral.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+strange: strange.o $(XLOCK_OBJS) $(SHM) $(UTILS_BIN)/pow2.o
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(UTILS_BIN)/pow2.o $(HACK_LIBS) $(THRL)
+
+swirl: swirl.o $(XLOCK_OBJS) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(HACK_LIBS) $(THRL)
+
+fadeplot: fadeplot.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+mountain: mountain.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+triangle: triangle.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+worm: worm.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+rotor: rotor.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+ant: ant.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+demon: demon.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+loop: loop.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+flow: flow.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+discrete: discrete.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+crystal: crystal.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+apollonian: apollonian.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+euler2d: euler2d.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+juggle: juggle.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+polyominoes: polyominoes.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+thornbird: thornbird.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+PACOBJS=pacman_ai.o pacman_level.o
+pacman: pacman.o $(PACOBJS) $(XLOCK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(PACOBJS) $(XLOCK_OBJS) $(PNG) $(PNG_LIBS)
+
+fiberlamp: fiberlamp.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+# These are not like the others.
+#
+xsublim: xsublim.o $(HACK_OBJS_1)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS_1) $(HACK_LIBS)
+
+webcollage-helper: webcollage-helper.o
+ $(CC_HACK) -o $@ $@.o $(PNG_LIBS) $(JPEG_LIBS)
+
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+
+abstractile.o: ../config.h
+abstractile.o: $(srcdir)/fps.h
+abstractile.o: $(srcdir)/recanim.h
+abstractile.o: $(srcdir)/screenhackI.h
+abstractile.o: $(srcdir)/screenhack.h
+abstractile.o: $(UTILS_SRC)/colors.h
+abstractile.o: $(UTILS_SRC)/font-retry.h
+abstractile.o: $(UTILS_SRC)/grabscreen.h
+abstractile.o: $(UTILS_SRC)/hsv.h
+abstractile.o: $(UTILS_SRC)/resources.h
+abstractile.o: $(UTILS_SRC)/usleep.h
+abstractile.o: $(UTILS_SRC)/visual.h
+abstractile.o: $(UTILS_SRC)/yarandom.h
+analogtv.o: $(srcdir)/analogtv.h
+analogtv.o: ../config.h
+analogtv.o: $(srcdir)/images/gen/6x10font_png.h
+analogtv.o: $(UTILS_SRC)/aligned_malloc.h
+analogtv.o: $(UTILS_SRC)/font-retry.h
+analogtv.o: $(UTILS_SRC)/grabscreen.h
+analogtv.o: $(UTILS_SRC)/resources.h
+analogtv.o: $(UTILS_SRC)/thread_util.h
+analogtv.o: $(UTILS_SRC)/utils.h
+analogtv.o: $(UTILS_SRC)/visual.h
+analogtv.o: $(UTILS_SRC)/xshm.h
+analogtv.o: $(UTILS_SRC)/yarandom.h
+analogtv.o: $(srcdir)/ximage-loader.h
+anemone.o: ../config.h
+anemone.o: $(srcdir)/fps.h
+anemone.o: $(srcdir)/recanim.h
+anemone.o: $(srcdir)/screenhackI.h
+anemone.o: $(srcdir)/screenhack.h
+anemone.o: $(UTILS_SRC)/colors.h
+anemone.o: $(UTILS_SRC)/font-retry.h
+anemone.o: $(UTILS_SRC)/grabscreen.h
+anemone.o: $(UTILS_SRC)/hsv.h
+anemone.o: $(UTILS_SRC)/resources.h
+anemone.o: $(UTILS_SRC)/usleep.h
+anemone.o: $(UTILS_SRC)/visual.h
+anemone.o: $(UTILS_SRC)/xdbe.h
+anemone.o: $(UTILS_SRC)/yarandom.h
+anemotaxis.o: ../config.h
+anemotaxis.o: $(srcdir)/fps.h
+anemotaxis.o: $(srcdir)/recanim.h
+anemotaxis.o: $(srcdir)/screenhackI.h
+anemotaxis.o: $(srcdir)/screenhack.h
+anemotaxis.o: $(UTILS_SRC)/colors.h
+anemotaxis.o: $(UTILS_SRC)/font-retry.h
+anemotaxis.o: $(UTILS_SRC)/grabscreen.h
+anemotaxis.o: $(UTILS_SRC)/hsv.h
+anemotaxis.o: $(UTILS_SRC)/resources.h
+anemotaxis.o: $(UTILS_SRC)/usleep.h
+anemotaxis.o: $(UTILS_SRC)/visual.h
+anemotaxis.o: $(UTILS_SRC)/xdbe.h
+anemotaxis.o: $(UTILS_SRC)/yarandom.h
+ant.o: $(srcdir)/automata.h
+ant.o: ../config.h
+ant.o: $(srcdir)/fps.h
+ant.o: $(srcdir)/recanim.h
+ant.o: $(srcdir)/screenhackI.h
+ant.o: $(UTILS_SRC)/colors.h
+ant.o: $(UTILS_SRC)/erase.h
+ant.o: $(UTILS_SRC)/font-retry.h
+ant.o: $(UTILS_SRC)/grabscreen.h
+ant.o: $(UTILS_SRC)/hsv.h
+ant.o: $(UTILS_SRC)/resources.h
+ant.o: $(UTILS_SRC)/usleep.h
+ant.o: $(UTILS_SRC)/visual.h
+ant.o: $(UTILS_SRC)/yarandom.h
+ant.o: $(srcdir)/xlockmoreI.h
+ant.o: $(srcdir)/xlockmore.h
+apollonian.o: ../config.h
+apollonian.o: $(srcdir)/fps.h
+apollonian.o: $(srcdir)/recanim.h
+apollonian.o: $(srcdir)/screenhackI.h
+apollonian.o: $(UTILS_SRC)/colors.h
+apollonian.o: $(UTILS_SRC)/erase.h
+apollonian.o: $(UTILS_SRC)/font-retry.h
+apollonian.o: $(UTILS_SRC)/grabscreen.h
+apollonian.o: $(UTILS_SRC)/hsv.h
+apollonian.o: $(UTILS_SRC)/resources.h
+apollonian.o: $(UTILS_SRC)/usleep.h
+apollonian.o: $(UTILS_SRC)/visual.h
+apollonian.o: $(UTILS_SRC)/yarandom.h
+apollonian.o: $(srcdir)/xlockmoreI.h
+apollonian.o: $(srcdir)/xlockmore.h
+apple2-main.o: $(srcdir)/analogtv.h
+apple2-main.o: $(srcdir)/apple2.h
+apple2-main.o: ../config.h
+apple2-main.o: $(srcdir)/fps.h
+apple2-main.o: $(srcdir)/recanim.h
+apple2-main.o: $(srcdir)/screenhackI.h
+apple2-main.o: $(srcdir)/screenhack.h
+apple2-main.o: $(UTILS_SRC)/aligned_malloc.h
+apple2-main.o: $(UTILS_SRC)/colors.h
+apple2-main.o: $(UTILS_SRC)/font-retry.h
+apple2-main.o: $(UTILS_SRC)/grabscreen.h
+apple2-main.o: $(UTILS_SRC)/hsv.h
+apple2-main.o: $(UTILS_SRC)/resources.h
+apple2-main.o: $(UTILS_SRC)/textclient.h
+apple2-main.o: $(UTILS_SRC)/thread_util.h
+apple2-main.o: $(UTILS_SRC)/usleep.h
+apple2-main.o: $(UTILS_SRC)/utf8wc.h
+apple2-main.o: $(UTILS_SRC)/visual.h
+apple2-main.o: $(UTILS_SRC)/xshm.h
+apple2-main.o: $(UTILS_SRC)/yarandom.h
+apple2.o: $(srcdir)/analogtv.h
+apple2.o: $(srcdir)/apple2.h
+apple2.o: ../config.h
+apple2.o: $(srcdir)/fps.h
+apple2.o: $(srcdir)/images/gen/apple2font_png.h
+apple2.o: $(srcdir)/recanim.h
+apple2.o: $(srcdir)/screenhackI.h
+apple2.o: $(UTILS_SRC)/aligned_malloc.h
+apple2.o: $(UTILS_SRC)/colors.h
+apple2.o: $(UTILS_SRC)/font-retry.h
+apple2.o: $(UTILS_SRC)/grabscreen.h
+apple2.o: $(UTILS_SRC)/hsv.h
+apple2.o: $(UTILS_SRC)/resources.h
+apple2.o: $(UTILS_SRC)/thread_util.h
+apple2.o: $(UTILS_SRC)/usleep.h
+apple2.o: $(UTILS_SRC)/visual.h
+apple2.o: $(UTILS_SRC)/xshm.h
+apple2.o: $(UTILS_SRC)/yarandom.h
+apple2.o: $(srcdir)/ximage-loader.h
+asm6502.o: $(srcdir)/asm6502.h
+asm6502.o: ../config.h
+asm6502.o: $(UTILS_SRC)/yarandom.h
+attraction.o: ../config.h
+attraction.o: $(srcdir)/fps.h
+attraction.o: $(srcdir)/recanim.h
+attraction.o: $(srcdir)/screenhackI.h
+attraction.o: $(srcdir)/screenhack.h
+attraction.o: $(UTILS_SRC)/colors.h
+attraction.o: $(UTILS_SRC)/font-retry.h
+attraction.o: $(UTILS_SRC)/grabscreen.h
+attraction.o: $(UTILS_SRC)/hsv.h
+attraction.o: $(UTILS_SRC)/resources.h
+attraction.o: $(UTILS_SRC)/spline.h
+attraction.o: $(UTILS_SRC)/usleep.h
+attraction.o: $(UTILS_SRC)/visual.h
+attraction.o: $(UTILS_SRC)/yarandom.h
+barcode.o: ../config.h
+barcode.o: $(srcdir)/fps.h
+barcode.o: $(srcdir)/recanim.h
+barcode.o: $(srcdir)/screenhackI.h
+barcode.o: $(srcdir)/screenhack.h
+barcode.o: $(UTILS_SRC)/colors.h
+barcode.o: $(UTILS_SRC)/font-retry.h
+barcode.o: $(UTILS_SRC)/grabscreen.h
+barcode.o: $(UTILS_SRC)/hsv.h
+barcode.o: $(UTILS_SRC)/resources.h
+barcode.o: $(UTILS_SRC)/usleep.h
+barcode.o: $(UTILS_SRC)/visual.h
+barcode.o: $(UTILS_SRC)/yarandom.h
+binaryring.o: ../config.h
+binaryring.o: $(srcdir)/fps.h
+binaryring.o: $(srcdir)/recanim.h
+binaryring.o: $(srcdir)/screenhackI.h
+binaryring.o: $(srcdir)/screenhack.h
+binaryring.o: $(UTILS_SRC)/colors.h
+binaryring.o: $(UTILS_SRC)/font-retry.h
+binaryring.o: $(UTILS_SRC)/grabscreen.h
+binaryring.o: $(UTILS_SRC)/hsv.h
+binaryring.o: $(UTILS_SRC)/resources.h
+binaryring.o: $(UTILS_SRC)/usleep.h
+binaryring.o: $(UTILS_SRC)/visual.h
+binaryring.o: $(UTILS_SRC)/yarandom.h
+blaster.o: ../config.h
+blaster.o: $(srcdir)/fps.h
+blaster.o: $(srcdir)/recanim.h
+blaster.o: $(srcdir)/screenhackI.h
+blaster.o: $(srcdir)/screenhack.h
+blaster.o: $(UTILS_SRC)/colors.h
+blaster.o: $(UTILS_SRC)/font-retry.h
+blaster.o: $(UTILS_SRC)/grabscreen.h
+blaster.o: $(UTILS_SRC)/hsv.h
+blaster.o: $(UTILS_SRC)/resources.h
+blaster.o: $(UTILS_SRC)/usleep.h
+blaster.o: $(UTILS_SRC)/visual.h
+blaster.o: $(UTILS_SRC)/yarandom.h
+blitspin.o: ../config.h
+blitspin.o: $(srcdir)/fps.h
+blitspin.o: $(srcdir)/images/gen/som_png.h
+blitspin.o: $(srcdir)/recanim.h
+blitspin.o: $(srcdir)/screenhackI.h
+blitspin.o: $(srcdir)/screenhack.h
+blitspin.o: $(UTILS_SRC)/colors.h
+blitspin.o: $(UTILS_SRC)/font-retry.h
+blitspin.o: $(UTILS_SRC)/grabscreen.h
+blitspin.o: $(UTILS_SRC)/hsv.h
+blitspin.o: $(UTILS_SRC)/pow2.h
+blitspin.o: $(UTILS_SRC)/resources.h
+blitspin.o: $(UTILS_SRC)/usleep.h
+blitspin.o: $(UTILS_SRC)/visual.h
+blitspin.o: $(UTILS_SRC)/yarandom.h
+blitspin.o: $(srcdir)/ximage-loader.h
+bouboule.o: ../config.h
+bouboule.o: $(srcdir)/fps.h
+bouboule.o: $(srcdir)/recanim.h
+bouboule.o: $(srcdir)/screenhackI.h
+bouboule.o: $(UTILS_SRC)/colors.h
+bouboule.o: $(UTILS_SRC)/erase.h
+bouboule.o: $(UTILS_SRC)/font-retry.h
+bouboule.o: $(UTILS_SRC)/grabscreen.h
+bouboule.o: $(UTILS_SRC)/hsv.h
+bouboule.o: $(UTILS_SRC)/resources.h
+bouboule.o: $(UTILS_SRC)/usleep.h
+bouboule.o: $(UTILS_SRC)/visual.h
+bouboule.o: $(UTILS_SRC)/yarandom.h
+bouboule.o: $(srcdir)/xlockmoreI.h
+bouboule.o: $(srcdir)/xlockmore.h
+boxfit.o: ../config.h
+boxfit.o: $(srcdir)/fps.h
+boxfit.o: $(srcdir)/recanim.h
+boxfit.o: $(srcdir)/screenhackI.h
+boxfit.o: $(srcdir)/screenhack.h
+boxfit.o: $(UTILS_SRC)/colors.h
+boxfit.o: $(UTILS_SRC)/font-retry.h
+boxfit.o: $(UTILS_SRC)/grabscreen.h
+boxfit.o: $(UTILS_SRC)/hsv.h
+boxfit.o: $(UTILS_SRC)/resources.h
+boxfit.o: $(UTILS_SRC)/usleep.h
+boxfit.o: $(UTILS_SRC)/visual.h
+boxfit.o: $(UTILS_SRC)/yarandom.h
+boxfit.o: $(srcdir)/ximage-loader.h
+braid.o: ../config.h
+braid.o: $(srcdir)/fps.h
+braid.o: $(srcdir)/recanim.h
+braid.o: $(srcdir)/screenhackI.h
+braid.o: $(UTILS_SRC)/colors.h
+braid.o: $(UTILS_SRC)/erase.h
+braid.o: $(UTILS_SRC)/font-retry.h
+braid.o: $(UTILS_SRC)/grabscreen.h
+braid.o: $(UTILS_SRC)/hsv.h
+braid.o: $(UTILS_SRC)/resources.h
+braid.o: $(UTILS_SRC)/usleep.h
+braid.o: $(UTILS_SRC)/visual.h
+braid.o: $(UTILS_SRC)/yarandom.h
+braid.o: $(srcdir)/xlockmoreI.h
+braid.o: $(srcdir)/xlockmore.h
+bsod.o: $(srcdir)/analogtv.h
+bsod.o: $(srcdir)/apple2.h
+bsod.o: ../config.h
+bsod.o: $(srcdir)/fps.h
+bsod.o: $(srcdir)/images/gen/amiga_png.h
+bsod.o: $(srcdir)/images/gen/android_png.h
+bsod.o: $(srcdir)/images/gen/apple_png.h
+bsod.o: $(srcdir)/images/gen/atari_png.h
+bsod.o: $(srcdir)/images/gen/atm_png.h
+bsod.o: $(srcdir)/images/gen/hmac_png.h
+bsod.o: $(srcdir)/images/gen/macbomb_png.h
+bsod.o: $(srcdir)/images/gen/mac_png.h
+bsod.o: $(srcdir)/images/gen/osx_10_2_png.h
+bsod.o: $(srcdir)/images/gen/osx_10_3_png.h
+bsod.o: $(srcdir)/images/gen/ransomware_png.h
+bsod.o: $(srcdir)/recanim.h
+bsod.o: $(srcdir)/screenhackI.h
+bsod.o: $(srcdir)/screenhack.h
+bsod.o: $(UTILS_SRC)/aligned_malloc.h
+bsod.o: $(UTILS_SRC)/colors.h
+bsod.o: $(UTILS_SRC)/font-retry.h
+bsod.o: $(UTILS_SRC)/grabscreen.h
+bsod.o: $(UTILS_SRC)/hsv.h
+bsod.o: $(UTILS_SRC)/resources.h
+bsod.o: $(UTILS_SRC)/thread_util.h
+bsod.o: $(UTILS_SRC)/usleep.h
+bsod.o: $(UTILS_SRC)/visual.h
+bsod.o: $(UTILS_SRC)/xshm.h
+bsod.o: $(UTILS_SRC)/yarandom.h
+bsod.o: $(srcdir)/ximage-loader.h
+bubbles-default.o: $(srcdir)/bubbles.h
+bubbles-default.o: ../config.h
+bubbles-default.o: $(srcdir)/images/gen/blood10_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood11_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood1_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood2_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood3_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood4_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood5_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood6_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood7_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood8_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood9_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue10_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue11_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue1_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue2_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue3_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue4_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue5_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue6_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue7_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue8_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue9_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass10_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass11_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass1_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass2_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass3_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass4_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass5_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass6_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass7_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass8_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass9_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade10_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade11_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade1_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade2_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade3_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade4_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade5_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade6_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade7_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade8_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade9_png.h
+bubbles-default.o: $(UTILS_SRC)/yarandom.h
+bubbles.o: $(srcdir)/bubbles.h
+bubbles.o: ../config.h
+bubbles.o: $(srcdir)/fps.h
+bubbles.o: $(srcdir)/recanim.h
+bubbles.o: $(srcdir)/screenhackI.h
+bubbles.o: $(srcdir)/screenhack.h
+bubbles.o: $(UTILS_SRC)/colors.h
+bubbles.o: $(UTILS_SRC)/font-retry.h
+bubbles.o: $(UTILS_SRC)/grabscreen.h
+bubbles.o: $(UTILS_SRC)/hsv.h
+bubbles.o: $(UTILS_SRC)/resources.h
+bubbles.o: $(UTILS_SRC)/usleep.h
+bubbles.o: $(UTILS_SRC)/visual.h
+bubbles.o: $(UTILS_SRC)/yarandom.h
+bubbles.o: $(srcdir)/ximage-loader.h
+bumps.o: ../config.h
+bumps.o: $(srcdir)/fps.h
+bumps.o: $(srcdir)/recanim.h
+bumps.o: $(srcdir)/screenhackI.h
+bumps.o: $(srcdir)/screenhack.h
+bumps.o: $(UTILS_SRC)/colors.h
+bumps.o: $(UTILS_SRC)/font-retry.h
+bumps.o: $(UTILS_SRC)/grabscreen.h
+bumps.o: $(UTILS_SRC)/hsv.h
+bumps.o: $(UTILS_SRC)/resources.h
+bumps.o: $(UTILS_SRC)/usleep.h
+bumps.o: $(UTILS_SRC)/visual.h
+bumps.o: $(UTILS_SRC)/xshm.h
+bumps.o: $(UTILS_SRC)/yarandom.h
+ccurve.o: ../config.h
+ccurve.o: $(srcdir)/fps.h
+ccurve.o: $(srcdir)/recanim.h
+ccurve.o: $(srcdir)/screenhackI.h
+ccurve.o: $(srcdir)/screenhack.h
+ccurve.o: $(UTILS_SRC)/colors.h
+ccurve.o: $(UTILS_SRC)/erase.h
+ccurve.o: $(UTILS_SRC)/font-retry.h
+ccurve.o: $(UTILS_SRC)/grabscreen.h
+ccurve.o: $(UTILS_SRC)/hsv.h
+ccurve.o: $(UTILS_SRC)/resources.h
+ccurve.o: $(UTILS_SRC)/usleep.h
+ccurve.o: $(UTILS_SRC)/visual.h
+ccurve.o: $(UTILS_SRC)/yarandom.h
+celtic.o: ../config.h
+celtic.o: $(srcdir)/fps.h
+celtic.o: $(srcdir)/recanim.h
+celtic.o: $(srcdir)/screenhackI.h
+celtic.o: $(srcdir)/screenhack.h
+celtic.o: $(UTILS_SRC)/colors.h
+celtic.o: $(UTILS_SRC)/erase.h
+celtic.o: $(UTILS_SRC)/font-retry.h
+celtic.o: $(UTILS_SRC)/grabscreen.h
+celtic.o: $(UTILS_SRC)/hsv.h
+celtic.o: $(UTILS_SRC)/resources.h
+celtic.o: $(UTILS_SRC)/usleep.h
+celtic.o: $(UTILS_SRC)/visual.h
+celtic.o: $(UTILS_SRC)/yarandom.h
+cloudlife.o: ../config.h
+cloudlife.o: $(srcdir)/fps.h
+cloudlife.o: $(srcdir)/recanim.h
+cloudlife.o: $(srcdir)/screenhackI.h
+cloudlife.o: $(srcdir)/screenhack.h
+cloudlife.o: $(UTILS_SRC)/colors.h
+cloudlife.o: $(UTILS_SRC)/font-retry.h
+cloudlife.o: $(UTILS_SRC)/grabscreen.h
+cloudlife.o: $(UTILS_SRC)/hsv.h
+cloudlife.o: $(UTILS_SRC)/resources.h
+cloudlife.o: $(UTILS_SRC)/usleep.h
+cloudlife.o: $(UTILS_SRC)/visual.h
+cloudlife.o: $(UTILS_SRC)/yarandom.h
+compass.o: ../config.h
+compass.o: $(srcdir)/fps.h
+compass.o: $(srcdir)/recanim.h
+compass.o: $(srcdir)/screenhackI.h
+compass.o: $(srcdir)/screenhack.h
+compass.o: $(UTILS_SRC)/colors.h
+compass.o: $(UTILS_SRC)/font-retry.h
+compass.o: $(UTILS_SRC)/grabscreen.h
+compass.o: $(UTILS_SRC)/hsv.h
+compass.o: $(UTILS_SRC)/resources.h
+compass.o: $(UTILS_SRC)/usleep.h
+compass.o: $(UTILS_SRC)/visual.h
+compass.o: $(UTILS_SRC)/xdbe.h
+compass.o: $(UTILS_SRC)/yarandom.h
+coral.o: ../config.h
+coral.o: $(srcdir)/fps.h
+coral.o: $(srcdir)/recanim.h
+coral.o: $(srcdir)/screenhackI.h
+coral.o: $(srcdir)/screenhack.h
+coral.o: $(UTILS_SRC)/colors.h
+coral.o: $(UTILS_SRC)/erase.h
+coral.o: $(UTILS_SRC)/font-retry.h
+coral.o: $(UTILS_SRC)/grabscreen.h
+coral.o: $(UTILS_SRC)/hsv.h
+coral.o: $(UTILS_SRC)/resources.h
+coral.o: $(UTILS_SRC)/usleep.h
+coral.o: $(UTILS_SRC)/visual.h
+coral.o: $(UTILS_SRC)/yarandom.h
+critical.o: ../config.h
+critical.o: $(srcdir)/fps.h
+critical.o: $(srcdir)/recanim.h
+critical.o: $(srcdir)/screenhackI.h
+critical.o: $(srcdir)/screenhack.h
+critical.o: $(UTILS_SRC)/colors.h
+critical.o: $(UTILS_SRC)/erase.h
+critical.o: $(UTILS_SRC)/font-retry.h
+critical.o: $(UTILS_SRC)/grabscreen.h
+critical.o: $(UTILS_SRC)/hsv.h
+critical.o: $(UTILS_SRC)/resources.h
+critical.o: $(UTILS_SRC)/usleep.h
+critical.o: $(UTILS_SRC)/visual.h
+critical.o: $(UTILS_SRC)/yarandom.h
+crystal.o: ../config.h
+crystal.o: $(srcdir)/fps.h
+crystal.o: $(srcdir)/recanim.h
+crystal.o: $(srcdir)/screenhackI.h
+crystal.o: $(UTILS_SRC)/colors.h
+crystal.o: $(UTILS_SRC)/erase.h
+crystal.o: $(UTILS_SRC)/font-retry.h
+crystal.o: $(UTILS_SRC)/grabscreen.h
+crystal.o: $(UTILS_SRC)/hsv.h
+crystal.o: $(UTILS_SRC)/resources.h
+crystal.o: $(UTILS_SRC)/usleep.h
+crystal.o: $(UTILS_SRC)/visual.h
+crystal.o: $(UTILS_SRC)/yarandom.h
+crystal.o: $(srcdir)/xlockmoreI.h
+crystal.o: $(srcdir)/xlockmore.h
+cwaves.o: ../config.h
+cwaves.o: $(srcdir)/fps.h
+cwaves.o: $(srcdir)/recanim.h
+cwaves.o: $(srcdir)/screenhackI.h
+cwaves.o: $(srcdir)/screenhack.h
+cwaves.o: $(UTILS_SRC)/colors.h
+cwaves.o: $(UTILS_SRC)/font-retry.h
+cwaves.o: $(UTILS_SRC)/grabscreen.h
+cwaves.o: $(UTILS_SRC)/hsv.h
+cwaves.o: $(UTILS_SRC)/resources.h
+cwaves.o: $(UTILS_SRC)/usleep.h
+cwaves.o: $(UTILS_SRC)/visual.h
+cwaves.o: $(UTILS_SRC)/yarandom.h
+cwaves.o: $(srcdir)/ximage-loader.h
+cynosure.o: ../config.h
+cynosure.o: $(srcdir)/fps.h
+cynosure.o: $(srcdir)/recanim.h
+cynosure.o: $(srcdir)/screenhackI.h
+cynosure.o: $(srcdir)/screenhack.h
+cynosure.o: $(UTILS_SRC)/colors.h
+cynosure.o: $(UTILS_SRC)/font-retry.h
+cynosure.o: $(UTILS_SRC)/grabscreen.h
+cynosure.o: $(UTILS_SRC)/hsv.h
+cynosure.o: $(UTILS_SRC)/resources.h
+cynosure.o: $(UTILS_SRC)/usleep.h
+cynosure.o: $(UTILS_SRC)/visual.h
+cynosure.o: $(UTILS_SRC)/yarandom.h
+decayscreen.o: ../config.h
+decayscreen.o: $(srcdir)/fps.h
+decayscreen.o: $(srcdir)/recanim.h
+decayscreen.o: $(srcdir)/screenhackI.h
+decayscreen.o: $(srcdir)/screenhack.h
+decayscreen.o: $(UTILS_SRC)/colors.h
+decayscreen.o: $(UTILS_SRC)/font-retry.h
+decayscreen.o: $(UTILS_SRC)/grabscreen.h
+decayscreen.o: $(UTILS_SRC)/hsv.h
+decayscreen.o: $(UTILS_SRC)/resources.h
+decayscreen.o: $(UTILS_SRC)/usleep.h
+decayscreen.o: $(UTILS_SRC)/visual.h
+decayscreen.o: $(UTILS_SRC)/yarandom.h
+deco.o: ../config.h
+deco.o: $(srcdir)/fps.h
+deco.o: $(srcdir)/recanim.h
+deco.o: $(srcdir)/screenhackI.h
+deco.o: $(srcdir)/screenhack.h
+deco.o: $(UTILS_SRC)/colors.h
+deco.o: $(UTILS_SRC)/font-retry.h
+deco.o: $(UTILS_SRC)/grabscreen.h
+deco.o: $(UTILS_SRC)/hsv.h
+deco.o: $(UTILS_SRC)/resources.h
+deco.o: $(UTILS_SRC)/usleep.h
+deco.o: $(UTILS_SRC)/visual.h
+deco.o: $(UTILS_SRC)/yarandom.h
+delaunay.o: ../config.h
+delaunay.o: $(srcdir)/delaunay.h
+deluxe.o: ../config.h
+deluxe.o: $(srcdir)/fps.h
+deluxe.o: $(srcdir)/recanim.h
+deluxe.o: $(srcdir)/screenhackI.h
+deluxe.o: $(srcdir)/screenhack.h
+deluxe.o: $(UTILS_SRC)/alpha.h
+deluxe.o: $(UTILS_SRC)/colors.h
+deluxe.o: $(UTILS_SRC)/font-retry.h
+deluxe.o: $(UTILS_SRC)/grabscreen.h
+deluxe.o: $(UTILS_SRC)/hsv.h
+deluxe.o: $(UTILS_SRC)/resources.h
+deluxe.o: $(UTILS_SRC)/usleep.h
+deluxe.o: $(UTILS_SRC)/visual.h
+deluxe.o: $(UTILS_SRC)/xdbe.h
+deluxe.o: $(UTILS_SRC)/yarandom.h
+demon.o: $(srcdir)/automata.h
+demon.o: ../config.h
+demon.o: $(srcdir)/fps.h
+demon.o: $(srcdir)/recanim.h
+demon.o: $(srcdir)/screenhackI.h
+demon.o: $(UTILS_SRC)/colors.h
+demon.o: $(UTILS_SRC)/erase.h
+demon.o: $(UTILS_SRC)/font-retry.h
+demon.o: $(UTILS_SRC)/grabscreen.h
+demon.o: $(UTILS_SRC)/hsv.h
+demon.o: $(UTILS_SRC)/resources.h
+demon.o: $(UTILS_SRC)/usleep.h
+demon.o: $(UTILS_SRC)/visual.h
+demon.o: $(UTILS_SRC)/yarandom.h
+demon.o: $(srcdir)/xlockmoreI.h
+demon.o: $(srcdir)/xlockmore.h
+discrete.o: ../config.h
+discrete.o: $(srcdir)/fps.h
+discrete.o: $(srcdir)/recanim.h
+discrete.o: $(srcdir)/screenhackI.h
+discrete.o: $(UTILS_SRC)/colors.h
+discrete.o: $(UTILS_SRC)/erase.h
+discrete.o: $(UTILS_SRC)/font-retry.h
+discrete.o: $(UTILS_SRC)/grabscreen.h
+discrete.o: $(UTILS_SRC)/hsv.h
+discrete.o: $(UTILS_SRC)/resources.h
+discrete.o: $(UTILS_SRC)/usleep.h
+discrete.o: $(UTILS_SRC)/visual.h
+discrete.o: $(UTILS_SRC)/yarandom.h
+discrete.o: $(srcdir)/xlockmoreI.h
+discrete.o: $(srcdir)/xlockmore.h
+distort.o: ../config.h
+distort.o: $(srcdir)/fps.h
+distort.o: $(srcdir)/recanim.h
+distort.o: $(srcdir)/screenhackI.h
+distort.o: $(srcdir)/screenhack.h
+distort.o: $(UTILS_SRC)/colors.h
+distort.o: $(UTILS_SRC)/font-retry.h
+distort.o: $(UTILS_SRC)/grabscreen.h
+distort.o: $(UTILS_SRC)/hsv.h
+distort.o: $(UTILS_SRC)/resources.h
+distort.o: $(UTILS_SRC)/usleep.h
+distort.o: $(UTILS_SRC)/visual.h
+distort.o: $(UTILS_SRC)/xshm.h
+distort.o: $(UTILS_SRC)/yarandom.h
+drift.o: ../config.h
+drift.o: $(srcdir)/fps.h
+drift.o: $(srcdir)/recanim.h
+drift.o: $(srcdir)/screenhackI.h
+drift.o: $(UTILS_SRC)/colors.h
+drift.o: $(UTILS_SRC)/erase.h
+drift.o: $(UTILS_SRC)/font-retry.h
+drift.o: $(UTILS_SRC)/grabscreen.h
+drift.o: $(UTILS_SRC)/hsv.h
+drift.o: $(UTILS_SRC)/resources.h
+drift.o: $(UTILS_SRC)/usleep.h
+drift.o: $(UTILS_SRC)/visual.h
+drift.o: $(UTILS_SRC)/yarandom.h
+drift.o: $(srcdir)/xlockmoreI.h
+drift.o: $(srcdir)/xlockmore.h
+epicycle.o: ../config.h
+epicycle.o: $(srcdir)/fps.h
+epicycle.o: $(srcdir)/recanim.h
+epicycle.o: $(srcdir)/screenhackI.h
+epicycle.o: $(srcdir)/screenhack.h
+epicycle.o: $(UTILS_SRC)/colors.h
+epicycle.o: $(UTILS_SRC)/erase.h
+epicycle.o: $(UTILS_SRC)/font-retry.h
+epicycle.o: $(UTILS_SRC)/grabscreen.h
+epicycle.o: $(UTILS_SRC)/hsv.h
+epicycle.o: $(UTILS_SRC)/resources.h
+epicycle.o: $(UTILS_SRC)/usleep.h
+epicycle.o: $(UTILS_SRC)/visual.h
+epicycle.o: $(UTILS_SRC)/yarandom.h
+eruption.o: ../config.h
+eruption.o: $(srcdir)/fps.h
+eruption.o: $(srcdir)/recanim.h
+eruption.o: $(srcdir)/screenhackI.h
+eruption.o: $(srcdir)/screenhack.h
+eruption.o: $(UTILS_SRC)/colors.h
+eruption.o: $(UTILS_SRC)/font-retry.h
+eruption.o: $(UTILS_SRC)/grabscreen.h
+eruption.o: $(UTILS_SRC)/hsv.h
+eruption.o: $(UTILS_SRC)/resources.h
+eruption.o: $(UTILS_SRC)/usleep.h
+eruption.o: $(UTILS_SRC)/visual.h
+eruption.o: $(UTILS_SRC)/yarandom.h
+euler2d.o: ../config.h
+euler2d.o: $(srcdir)/fps.h
+euler2d.o: $(srcdir)/recanim.h
+euler2d.o: $(srcdir)/screenhackI.h
+euler2d.o: $(UTILS_SRC)/colors.h
+euler2d.o: $(UTILS_SRC)/erase.h
+euler2d.o: $(UTILS_SRC)/font-retry.h
+euler2d.o: $(UTILS_SRC)/grabscreen.h
+euler2d.o: $(UTILS_SRC)/hsv.h
+euler2d.o: $(UTILS_SRC)/resources.h
+euler2d.o: $(UTILS_SRC)/usleep.h
+euler2d.o: $(UTILS_SRC)/visual.h
+euler2d.o: $(UTILS_SRC)/yarandom.h
+euler2d.o: $(srcdir)/xlockmoreI.h
+euler2d.o: $(srcdir)/xlockmore.h
+fadeplot.o: ../config.h
+fadeplot.o: $(srcdir)/fps.h
+fadeplot.o: $(srcdir)/recanim.h
+fadeplot.o: $(srcdir)/screenhackI.h
+fadeplot.o: $(UTILS_SRC)/colors.h
+fadeplot.o: $(UTILS_SRC)/erase.h
+fadeplot.o: $(UTILS_SRC)/font-retry.h
+fadeplot.o: $(UTILS_SRC)/grabscreen.h
+fadeplot.o: $(UTILS_SRC)/hsv.h
+fadeplot.o: $(UTILS_SRC)/resources.h
+fadeplot.o: $(UTILS_SRC)/usleep.h
+fadeplot.o: $(UTILS_SRC)/visual.h
+fadeplot.o: $(UTILS_SRC)/yarandom.h
+fadeplot.o: $(srcdir)/xlockmoreI.h
+fadeplot.o: $(srcdir)/xlockmore.h
+fiberlamp.o: ../config.h
+fiberlamp.o: $(srcdir)/fps.h
+fiberlamp.o: $(srcdir)/recanim.h
+fiberlamp.o: $(srcdir)/screenhackI.h
+fiberlamp.o: $(UTILS_SRC)/colors.h
+fiberlamp.o: $(UTILS_SRC)/erase.h
+fiberlamp.o: $(UTILS_SRC)/font-retry.h
+fiberlamp.o: $(UTILS_SRC)/grabscreen.h
+fiberlamp.o: $(UTILS_SRC)/hsv.h
+fiberlamp.o: $(UTILS_SRC)/resources.h
+fiberlamp.o: $(UTILS_SRC)/usleep.h
+fiberlamp.o: $(UTILS_SRC)/visual.h
+fiberlamp.o: $(UTILS_SRC)/yarandom.h
+fiberlamp.o: $(srcdir)/xlockmoreI.h
+fiberlamp.o: $(srcdir)/xlockmore.h
+filmleader.o: $(srcdir)/analogtv.h
+filmleader.o: ../config.h
+filmleader.o: $(srcdir)/fps.h
+filmleader.o: $(srcdir)/recanim.h
+filmleader.o: $(srcdir)/screenhackI.h
+filmleader.o: $(srcdir)/screenhack.h
+filmleader.o: $(UTILS_SRC)/aligned_malloc.h
+filmleader.o: $(UTILS_SRC)/colors.h
+filmleader.o: $(UTILS_SRC)/font-retry.h
+filmleader.o: $(UTILS_SRC)/grabscreen.h
+filmleader.o: $(UTILS_SRC)/hsv.h
+filmleader.o: $(UTILS_SRC)/resources.h
+filmleader.o: $(UTILS_SRC)/thread_util.h
+filmleader.o: $(UTILS_SRC)/usleep.h
+filmleader.o: $(UTILS_SRC)/visual.h
+filmleader.o: $(UTILS_SRC)/xft.h
+filmleader.o: $(UTILS_SRC)/xshm.h
+filmleader.o: $(UTILS_SRC)/yarandom.h
+fireworkx.o: ../config.h
+fireworkx.o: $(srcdir)/fps.h
+fireworkx.o: $(srcdir)/recanim.h
+fireworkx.o: $(srcdir)/screenhackI.h
+fireworkx.o: $(srcdir)/screenhack.h
+fireworkx.o: $(UTILS_SRC)/colors.h
+fireworkx.o: $(UTILS_SRC)/font-retry.h
+fireworkx.o: $(UTILS_SRC)/grabscreen.h
+fireworkx.o: $(UTILS_SRC)/hsv.h
+fireworkx.o: $(UTILS_SRC)/resources.h
+fireworkx.o: $(UTILS_SRC)/usleep.h
+fireworkx.o: $(UTILS_SRC)/visual.h
+fireworkx.o: $(UTILS_SRC)/yarandom.h
+flag.o: ../config.h
+flag.o: $(srcdir)/fps.h
+flag.o: $(srcdir)/images/gen/bob_png.h
+flag.o: $(srcdir)/recanim.h
+flag.o: $(srcdir)/screenhackI.h
+flag.o: $(UTILS_SRC)/colors.h
+flag.o: $(UTILS_SRC)/erase.h
+flag.o: $(UTILS_SRC)/font-retry.h
+flag.o: $(UTILS_SRC)/grabscreen.h
+flag.o: $(UTILS_SRC)/hsv.h
+flag.o: $(UTILS_SRC)/resources.h
+flag.o: $(UTILS_SRC)/usleep.h
+flag.o: $(UTILS_SRC)/visual.h
+flag.o: $(UTILS_SRC)/yarandom.h
+flag.o: $(srcdir)/ximage-loader.h
+flag.o: $(srcdir)/xlockmoreI.h
+flag.o: $(srcdir)/xlockmore.h
+flame.o: ../config.h
+flame.o: $(srcdir)/fps.h
+flame.o: $(srcdir)/recanim.h
+flame.o: $(srcdir)/screenhackI.h
+flame.o: $(srcdir)/screenhack.h
+flame.o: $(UTILS_SRC)/colors.h
+flame.o: $(UTILS_SRC)/font-retry.h
+flame.o: $(UTILS_SRC)/grabscreen.h
+flame.o: $(UTILS_SRC)/hsv.h
+flame.o: $(UTILS_SRC)/resources.h
+flame.o: $(UTILS_SRC)/usleep.h
+flame.o: $(UTILS_SRC)/visual.h
+flame.o: $(UTILS_SRC)/yarandom.h
+flow.o: ../config.h
+flow.o: $(srcdir)/fps.h
+flow.o: $(srcdir)/recanim.h
+flow.o: $(srcdir)/screenhackI.h
+flow.o: $(UTILS_SRC)/colors.h
+flow.o: $(UTILS_SRC)/erase.h
+flow.o: $(UTILS_SRC)/font-retry.h
+flow.o: $(UTILS_SRC)/grabscreen.h
+flow.o: $(UTILS_SRC)/hsv.h
+flow.o: $(UTILS_SRC)/resources.h
+flow.o: $(UTILS_SRC)/usleep.h
+flow.o: $(UTILS_SRC)/visual.h
+flow.o: $(UTILS_SRC)/yarandom.h
+flow.o: $(srcdir)/xlockmoreI.h
+flow.o: $(srcdir)/xlockmore.h
+fluidballs.o: ../config.h
+fluidballs.o: $(srcdir)/fps.h
+fluidballs.o: $(srcdir)/recanim.h
+fluidballs.o: $(srcdir)/screenhackI.h
+fluidballs.o: $(srcdir)/screenhack.h
+fluidballs.o: $(UTILS_SRC)/colors.h
+fluidballs.o: $(UTILS_SRC)/font-retry.h
+fluidballs.o: $(UTILS_SRC)/grabscreen.h
+fluidballs.o: $(UTILS_SRC)/hsv.h
+fluidballs.o: $(UTILS_SRC)/resources.h
+fluidballs.o: $(UTILS_SRC)/usleep.h
+fluidballs.o: $(UTILS_SRC)/visual.h
+fluidballs.o: $(UTILS_SRC)/xdbe.h
+fluidballs.o: $(UTILS_SRC)/yarandom.h
+fontglide.o: ../config.h
+fontglide.o: $(srcdir)/fps.h
+fontglide.o: $(srcdir)/recanim.h
+fontglide.o: $(srcdir)/screenhackI.h
+fontglide.o: $(srcdir)/screenhack.h
+fontglide.o: $(UTILS_SRC)/colors.h
+fontglide.o: $(UTILS_SRC)/font-retry.h
+fontglide.o: $(UTILS_SRC)/grabscreen.h
+fontglide.o: $(UTILS_SRC)/hsv.h
+fontglide.o: $(UTILS_SRC)/resources.h
+fontglide.o: $(UTILS_SRC)/textclient.h
+fontglide.o: $(UTILS_SRC)/usleep.h
+fontglide.o: $(UTILS_SRC)/utf8wc.h
+fontglide.o: $(UTILS_SRC)/visual.h
+fontglide.o: $(UTILS_SRC)/xdbe.h
+fontglide.o: $(UTILS_SRC)/xft.h
+fontglide.o: $(UTILS_SRC)/yarandom.h
+forest.o: ../config.h
+forest.o: $(srcdir)/fps.h
+forest.o: $(srcdir)/recanim.h
+forest.o: $(srcdir)/screenhackI.h
+forest.o: $(UTILS_SRC)/colors.h
+forest.o: $(UTILS_SRC)/erase.h
+forest.o: $(UTILS_SRC)/font-retry.h
+forest.o: $(UTILS_SRC)/grabscreen.h
+forest.o: $(UTILS_SRC)/hsv.h
+forest.o: $(UTILS_SRC)/resources.h
+forest.o: $(UTILS_SRC)/usleep.h
+forest.o: $(UTILS_SRC)/visual.h
+forest.o: $(UTILS_SRC)/yarandom.h
+forest.o: $(srcdir)/xlockmoreI.h
+forest.o: $(srcdir)/xlockmore.h
+fps.o: ../config.h
+fps.o: $(srcdir)/fpsI.h
+fps.o: $(srcdir)/fps.h
+fps.o: $(srcdir)/recanim.h
+fps.o: $(srcdir)/screenhackI.h
+fps.o: $(UTILS_SRC)/colors.h
+fps.o: $(UTILS_SRC)/font-retry.h
+fps.o: $(UTILS_SRC)/grabscreen.h
+fps.o: $(UTILS_SRC)/hsv.h
+fps.o: $(UTILS_SRC)/resources.h
+fps.o: $(UTILS_SRC)/usleep.h
+fps.o: $(UTILS_SRC)/visual.h
+fps.o: $(UTILS_SRC)/yarandom.h
+fuzzyflakes.o: ../config.h
+fuzzyflakes.o: $(srcdir)/fps.h
+fuzzyflakes.o: $(srcdir)/recanim.h
+fuzzyflakes.o: $(srcdir)/screenhackI.h
+fuzzyflakes.o: $(srcdir)/screenhack.h
+fuzzyflakes.o: $(UTILS_SRC)/colors.h
+fuzzyflakes.o: $(UTILS_SRC)/font-retry.h
+fuzzyflakes.o: $(UTILS_SRC)/grabscreen.h
+fuzzyflakes.o: $(UTILS_SRC)/hsv.h
+fuzzyflakes.o: $(UTILS_SRC)/resources.h
+fuzzyflakes.o: $(UTILS_SRC)/usleep.h
+fuzzyflakes.o: $(UTILS_SRC)/visual.h
+fuzzyflakes.o: $(UTILS_SRC)/yarandom.h
+galaxy.o: ../config.h
+galaxy.o: $(srcdir)/fps.h
+galaxy.o: $(srcdir)/recanim.h
+galaxy.o: $(srcdir)/screenhackI.h
+galaxy.o: $(UTILS_SRC)/colors.h
+galaxy.o: $(UTILS_SRC)/erase.h
+galaxy.o: $(UTILS_SRC)/font-retry.h
+galaxy.o: $(UTILS_SRC)/grabscreen.h
+galaxy.o: $(UTILS_SRC)/hsv.h
+galaxy.o: $(UTILS_SRC)/resources.h
+galaxy.o: $(UTILS_SRC)/usleep.h
+galaxy.o: $(UTILS_SRC)/visual.h
+galaxy.o: $(UTILS_SRC)/yarandom.h
+galaxy.o: $(srcdir)/xlockmoreI.h
+galaxy.o: $(srcdir)/xlockmore.h
+glitchpeg.o: ../config.h
+glitchpeg.o: $(srcdir)/fps.h
+glitchpeg.o: $(srcdir)/recanim.h
+glitchpeg.o: $(srcdir)/screenhackI.h
+glitchpeg.o: $(srcdir)/screenhack.h
+glitchpeg.o: $(UTILS_SRC)/colors.h
+glitchpeg.o: $(UTILS_SRC)/font-retry.h
+glitchpeg.o: $(UTILS_SRC)/grabscreen.h
+glitchpeg.o: $(UTILS_SRC)/hsv.h
+glitchpeg.o: $(UTILS_SRC)/resources.h
+glitchpeg.o: $(UTILS_SRC)/usleep.h
+glitchpeg.o: $(UTILS_SRC)/visual.h
+glitchpeg.o: $(UTILS_SRC)/yarandom.h
+glitchpeg.o: $(srcdir)/ximage-loader.h
+goop.o: ../config.h
+goop.o: $(srcdir)/fps.h
+goop.o: $(srcdir)/recanim.h
+goop.o: $(srcdir)/screenhackI.h
+goop.o: $(srcdir)/screenhack.h
+goop.o: $(UTILS_SRC)/alpha.h
+goop.o: $(UTILS_SRC)/colors.h
+goop.o: $(UTILS_SRC)/font-retry.h
+goop.o: $(UTILS_SRC)/grabscreen.h
+goop.o: $(UTILS_SRC)/hsv.h
+goop.o: $(UTILS_SRC)/resources.h
+goop.o: $(UTILS_SRC)/spline.h
+goop.o: $(UTILS_SRC)/usleep.h
+goop.o: $(UTILS_SRC)/visual.h
+goop.o: $(UTILS_SRC)/yarandom.h
+grav.o: ../config.h
+grav.o: $(srcdir)/fps.h
+grav.o: $(srcdir)/recanim.h
+grav.o: $(srcdir)/screenhackI.h
+grav.o: $(UTILS_SRC)/colors.h
+grav.o: $(UTILS_SRC)/erase.h
+grav.o: $(UTILS_SRC)/font-retry.h
+grav.o: $(UTILS_SRC)/grabscreen.h
+grav.o: $(UTILS_SRC)/hsv.h
+grav.o: $(UTILS_SRC)/resources.h
+grav.o: $(UTILS_SRC)/usleep.h
+grav.o: $(UTILS_SRC)/visual.h
+grav.o: $(UTILS_SRC)/yarandom.h
+grav.o: $(srcdir)/xlockmoreI.h
+grav.o: $(srcdir)/xlockmore.h
+greynetic.o: ../config.h
+greynetic.o: $(srcdir)/fps.h
+greynetic.o: $(srcdir)/recanim.h
+greynetic.o: $(srcdir)/screenhackI.h
+greynetic.o: $(srcdir)/screenhack.h
+greynetic.o: $(UTILS_SRC)/colors.h
+greynetic.o: $(UTILS_SRC)/font-retry.h
+greynetic.o: $(UTILS_SRC)/grabscreen.h
+greynetic.o: $(UTILS_SRC)/hsv.h
+greynetic.o: $(UTILS_SRC)/resources.h
+greynetic.o: $(UTILS_SRC)/usleep.h
+greynetic.o: $(UTILS_SRC)/visual.h
+greynetic.o: $(UTILS_SRC)/yarandom.h
+halftone.o: ../config.h
+halftone.o: $(srcdir)/fps.h
+halftone.o: $(srcdir)/recanim.h
+halftone.o: $(srcdir)/screenhackI.h
+halftone.o: $(srcdir)/screenhack.h
+halftone.o: $(UTILS_SRC)/colors.h
+halftone.o: $(UTILS_SRC)/font-retry.h
+halftone.o: $(UTILS_SRC)/grabscreen.h
+halftone.o: $(UTILS_SRC)/hsv.h
+halftone.o: $(UTILS_SRC)/resources.h
+halftone.o: $(UTILS_SRC)/usleep.h
+halftone.o: $(UTILS_SRC)/visual.h
+halftone.o: $(UTILS_SRC)/yarandom.h
+halo.o: ../config.h
+halo.o: $(srcdir)/fps.h
+halo.o: $(srcdir)/recanim.h
+halo.o: $(srcdir)/screenhackI.h
+halo.o: $(srcdir)/screenhack.h
+halo.o: $(UTILS_SRC)/colors.h
+halo.o: $(UTILS_SRC)/font-retry.h
+halo.o: $(UTILS_SRC)/grabscreen.h
+halo.o: $(UTILS_SRC)/hsv.h
+halo.o: $(UTILS_SRC)/resources.h
+halo.o: $(UTILS_SRC)/usleep.h
+halo.o: $(UTILS_SRC)/visual.h
+halo.o: $(UTILS_SRC)/yarandom.h
+helix.o: ../config.h
+helix.o: $(srcdir)/fps.h
+helix.o: $(srcdir)/recanim.h
+helix.o: $(srcdir)/screenhackI.h
+helix.o: $(srcdir)/screenhack.h
+helix.o: $(UTILS_SRC)/colors.h
+helix.o: $(UTILS_SRC)/erase.h
+helix.o: $(UTILS_SRC)/font-retry.h
+helix.o: $(UTILS_SRC)/grabscreen.h
+helix.o: $(UTILS_SRC)/hsv.h
+helix.o: $(UTILS_SRC)/resources.h
+helix.o: $(UTILS_SRC)/usleep.h
+helix.o: $(UTILS_SRC)/visual.h
+helix.o: $(UTILS_SRC)/yarandom.h
+hexadrop.o: ../config.h
+hexadrop.o: $(srcdir)/fps.h
+hexadrop.o: $(srcdir)/recanim.h
+hexadrop.o: $(srcdir)/screenhackI.h
+hexadrop.o: $(srcdir)/screenhack.h
+hexadrop.o: $(UTILS_SRC)/colors.h
+hexadrop.o: $(UTILS_SRC)/font-retry.h
+hexadrop.o: $(UTILS_SRC)/grabscreen.h
+hexadrop.o: $(UTILS_SRC)/hsv.h
+hexadrop.o: $(UTILS_SRC)/resources.h
+hexadrop.o: $(UTILS_SRC)/usleep.h
+hexadrop.o: $(UTILS_SRC)/visual.h
+hexadrop.o: $(UTILS_SRC)/yarandom.h
+hopalong.o: ../config.h
+hopalong.o: $(srcdir)/fps.h
+hopalong.o: $(srcdir)/recanim.h
+hopalong.o: $(srcdir)/screenhackI.h
+hopalong.o: $(UTILS_SRC)/colors.h
+hopalong.o: $(UTILS_SRC)/erase.h
+hopalong.o: $(UTILS_SRC)/font-retry.h
+hopalong.o: $(UTILS_SRC)/grabscreen.h
+hopalong.o: $(UTILS_SRC)/hsv.h
+hopalong.o: $(UTILS_SRC)/resources.h
+hopalong.o: $(UTILS_SRC)/usleep.h
+hopalong.o: $(UTILS_SRC)/visual.h
+hopalong.o: $(UTILS_SRC)/yarandom.h
+hopalong.o: $(srcdir)/xlockmoreI.h
+hopalong.o: $(srcdir)/xlockmore.h
+hyperball.o: ../config.h
+hyperball.o: $(srcdir)/fps.h
+hyperball.o: $(srcdir)/recanim.h
+hyperball.o: $(srcdir)/screenhackI.h
+hyperball.o: $(srcdir)/screenhack.h
+hyperball.o: $(UTILS_SRC)/colors.h
+hyperball.o: $(UTILS_SRC)/font-retry.h
+hyperball.o: $(UTILS_SRC)/grabscreen.h
+hyperball.o: $(UTILS_SRC)/hsv.h
+hyperball.o: $(UTILS_SRC)/resources.h
+hyperball.o: $(UTILS_SRC)/usleep.h
+hyperball.o: $(UTILS_SRC)/visual.h
+hyperball.o: $(UTILS_SRC)/yarandom.h
+hypercube.o: ../config.h
+hypercube.o: $(srcdir)/fps.h
+hypercube.o: $(srcdir)/recanim.h
+hypercube.o: $(srcdir)/screenhackI.h
+hypercube.o: $(srcdir)/screenhack.h
+hypercube.o: $(UTILS_SRC)/colors.h
+hypercube.o: $(UTILS_SRC)/font-retry.h
+hypercube.o: $(UTILS_SRC)/grabscreen.h
+hypercube.o: $(UTILS_SRC)/hsv.h
+hypercube.o: $(UTILS_SRC)/resources.h
+hypercube.o: $(UTILS_SRC)/usleep.h
+hypercube.o: $(UTILS_SRC)/visual.h
+hypercube.o: $(UTILS_SRC)/yarandom.h
+ifs.o: ../config.h
+ifs.o: $(srcdir)/fps.h
+ifs.o: $(srcdir)/recanim.h
+ifs.o: $(srcdir)/screenhackI.h
+ifs.o: $(srcdir)/screenhack.h
+ifs.o: $(UTILS_SRC)/colors.h
+ifs.o: $(UTILS_SRC)/font-retry.h
+ifs.o: $(UTILS_SRC)/grabscreen.h
+ifs.o: $(UTILS_SRC)/hsv.h
+ifs.o: $(UTILS_SRC)/resources.h
+ifs.o: $(UTILS_SRC)/usleep.h
+ifs.o: $(UTILS_SRC)/visual.h
+ifs.o: $(UTILS_SRC)/yarandom.h
+imsmap.o: ../config.h
+imsmap.o: $(srcdir)/fps.h
+imsmap.o: $(srcdir)/recanim.h
+imsmap.o: $(srcdir)/screenhackI.h
+imsmap.o: $(srcdir)/screenhack.h
+imsmap.o: $(UTILS_SRC)/colors.h
+imsmap.o: $(UTILS_SRC)/font-retry.h
+imsmap.o: $(UTILS_SRC)/grabscreen.h
+imsmap.o: $(UTILS_SRC)/hsv.h
+imsmap.o: $(UTILS_SRC)/resources.h
+imsmap.o: $(UTILS_SRC)/usleep.h
+imsmap.o: $(UTILS_SRC)/visual.h
+imsmap.o: $(UTILS_SRC)/yarandom.h
+interaggregate.o: ../config.h
+interaggregate.o: $(srcdir)/fps.h
+interaggregate.o: $(srcdir)/recanim.h
+interaggregate.o: $(srcdir)/screenhackI.h
+interaggregate.o: $(srcdir)/screenhack.h
+interaggregate.o: $(UTILS_SRC)/colors.h
+interaggregate.o: $(UTILS_SRC)/font-retry.h
+interaggregate.o: $(UTILS_SRC)/grabscreen.h
+interaggregate.o: $(UTILS_SRC)/hsv.h
+interaggregate.o: $(UTILS_SRC)/resources.h
+interaggregate.o: $(UTILS_SRC)/usleep.h
+interaggregate.o: $(UTILS_SRC)/visual.h
+interaggregate.o: $(UTILS_SRC)/yarandom.h
+interference.o: ../config.h
+interference.o: $(srcdir)/fps.h
+interference.o: $(srcdir)/recanim.h
+interference.o: $(srcdir)/screenhackI.h
+interference.o: $(srcdir)/screenhack.h
+interference.o: $(UTILS_SRC)/aligned_malloc.h
+interference.o: $(UTILS_SRC)/colors.h
+interference.o: $(UTILS_SRC)/font-retry.h
+interference.o: $(UTILS_SRC)/grabscreen.h
+interference.o: $(UTILS_SRC)/hsv.h
+interference.o: $(UTILS_SRC)/resources.h
+interference.o: $(UTILS_SRC)/thread_util.h
+interference.o: $(UTILS_SRC)/usleep.h
+interference.o: $(UTILS_SRC)/visual.h
+interference.o: $(UTILS_SRC)/xdbe.h
+interference.o: $(UTILS_SRC)/xshm.h
+interference.o: $(UTILS_SRC)/yarandom.h
+intermomentary.o: ../config.h
+intermomentary.o: $(srcdir)/fps.h
+intermomentary.o: $(srcdir)/recanim.h
+intermomentary.o: $(srcdir)/screenhackI.h
+intermomentary.o: $(srcdir)/screenhack.h
+intermomentary.o: $(UTILS_SRC)/colors.h
+intermomentary.o: $(UTILS_SRC)/font-retry.h
+intermomentary.o: $(UTILS_SRC)/grabscreen.h
+intermomentary.o: $(UTILS_SRC)/hsv.h
+intermomentary.o: $(UTILS_SRC)/resources.h
+intermomentary.o: $(UTILS_SRC)/usleep.h
+intermomentary.o: $(UTILS_SRC)/visual.h
+intermomentary.o: $(UTILS_SRC)/yarandom.h
+juggle.o: ../config.h
+juggle.o: $(srcdir)/fps.h
+juggle.o: $(srcdir)/recanim.h
+juggle.o: $(srcdir)/screenhackI.h
+juggle.o: $(UTILS_SRC)/colors.h
+juggle.o: $(UTILS_SRC)/erase.h
+juggle.o: $(UTILS_SRC)/font-retry.h
+juggle.o: $(UTILS_SRC)/grabscreen.h
+juggle.o: $(UTILS_SRC)/hsv.h
+juggle.o: $(UTILS_SRC)/resources.h
+juggle.o: $(UTILS_SRC)/usleep.h
+juggle.o: $(UTILS_SRC)/visual.h
+juggle.o: $(UTILS_SRC)/yarandom.h
+juggle.o: $(srcdir)/xlockmoreI.h
+juggle.o: $(srcdir)/xlockmore.h
+julia.o: ../config.h
+julia.o: $(srcdir)/fps.h
+julia.o: $(srcdir)/recanim.h
+julia.o: $(srcdir)/screenhackI.h
+julia.o: $(UTILS_SRC)/colors.h
+julia.o: $(UTILS_SRC)/erase.h
+julia.o: $(UTILS_SRC)/font-retry.h
+julia.o: $(UTILS_SRC)/grabscreen.h
+julia.o: $(UTILS_SRC)/hsv.h
+julia.o: $(UTILS_SRC)/resources.h
+julia.o: $(UTILS_SRC)/usleep.h
+julia.o: $(UTILS_SRC)/visual.h
+julia.o: $(UTILS_SRC)/yarandom.h
+julia.o: $(srcdir)/xlockmoreI.h
+julia.o: $(srcdir)/xlockmore.h
+kaleidescope.o: ../config.h
+kaleidescope.o: $(srcdir)/fps.h
+kaleidescope.o: $(srcdir)/recanim.h
+kaleidescope.o: $(srcdir)/screenhackI.h
+kaleidescope.o: $(srcdir)/screenhack.h
+kaleidescope.o: $(UTILS_SRC)/colors.h
+kaleidescope.o: $(UTILS_SRC)/font-retry.h
+kaleidescope.o: $(UTILS_SRC)/grabscreen.h
+kaleidescope.o: $(UTILS_SRC)/hsv.h
+kaleidescope.o: $(UTILS_SRC)/resources.h
+kaleidescope.o: $(UTILS_SRC)/spline.h
+kaleidescope.o: $(UTILS_SRC)/usleep.h
+kaleidescope.o: $(UTILS_SRC)/visual.h
+kaleidescope.o: $(UTILS_SRC)/yarandom.h
+kumppa.o: ../config.h
+kumppa.o: $(srcdir)/fps.h
+kumppa.o: $(srcdir)/recanim.h
+kumppa.o: $(srcdir)/screenhackI.h
+kumppa.o: $(srcdir)/screenhack.h
+kumppa.o: $(UTILS_SRC)/colors.h
+kumppa.o: $(UTILS_SRC)/font-retry.h
+kumppa.o: $(UTILS_SRC)/grabscreen.h
+kumppa.o: $(UTILS_SRC)/hsv.h
+kumppa.o: $(UTILS_SRC)/resources.h
+kumppa.o: $(UTILS_SRC)/usleep.h
+kumppa.o: $(UTILS_SRC)/visual.h
+kumppa.o: $(UTILS_SRC)/xdbe.h
+kumppa.o: $(UTILS_SRC)/yarandom.h
+laser.o: ../config.h
+laser.o: $(srcdir)/fps.h
+laser.o: $(srcdir)/recanim.h
+laser.o: $(srcdir)/screenhackI.h
+laser.o: $(UTILS_SRC)/colors.h
+laser.o: $(UTILS_SRC)/erase.h
+laser.o: $(UTILS_SRC)/font-retry.h
+laser.o: $(UTILS_SRC)/grabscreen.h
+laser.o: $(UTILS_SRC)/hsv.h
+laser.o: $(UTILS_SRC)/resources.h
+laser.o: $(UTILS_SRC)/usleep.h
+laser.o: $(UTILS_SRC)/visual.h
+laser.o: $(UTILS_SRC)/yarandom.h
+laser.o: $(srcdir)/xlockmoreI.h
+laser.o: $(srcdir)/xlockmore.h
+lcdscrub.o: ../config.h
+lcdscrub.o: $(srcdir)/fps.h
+lcdscrub.o: $(srcdir)/recanim.h
+lcdscrub.o: $(srcdir)/screenhackI.h
+lcdscrub.o: $(srcdir)/screenhack.h
+lcdscrub.o: $(UTILS_SRC)/colors.h
+lcdscrub.o: $(UTILS_SRC)/font-retry.h
+lcdscrub.o: $(UTILS_SRC)/grabscreen.h
+lcdscrub.o: $(UTILS_SRC)/hsv.h
+lcdscrub.o: $(UTILS_SRC)/resources.h
+lcdscrub.o: $(UTILS_SRC)/usleep.h
+lcdscrub.o: $(UTILS_SRC)/visual.h
+lcdscrub.o: $(UTILS_SRC)/yarandom.h
+lightning.o: ../config.h
+lightning.o: $(srcdir)/fps.h
+lightning.o: $(srcdir)/recanim.h
+lightning.o: $(srcdir)/screenhackI.h
+lightning.o: $(UTILS_SRC)/colors.h
+lightning.o: $(UTILS_SRC)/erase.h
+lightning.o: $(UTILS_SRC)/font-retry.h
+lightning.o: $(UTILS_SRC)/grabscreen.h
+lightning.o: $(UTILS_SRC)/hsv.h
+lightning.o: $(UTILS_SRC)/resources.h
+lightning.o: $(UTILS_SRC)/usleep.h
+lightning.o: $(UTILS_SRC)/visual.h
+lightning.o: $(UTILS_SRC)/yarandom.h
+lightning.o: $(srcdir)/xlockmoreI.h
+lightning.o: $(srcdir)/xlockmore.h
+lisa.o: ../config.h
+lisa.o: $(srcdir)/fps.h
+lisa.o: $(srcdir)/recanim.h
+lisa.o: $(srcdir)/screenhackI.h
+lisa.o: $(UTILS_SRC)/colors.h
+lisa.o: $(UTILS_SRC)/erase.h
+lisa.o: $(UTILS_SRC)/font-retry.h
+lisa.o: $(UTILS_SRC)/grabscreen.h
+lisa.o: $(UTILS_SRC)/hsv.h
+lisa.o: $(UTILS_SRC)/resources.h
+lisa.o: $(UTILS_SRC)/usleep.h
+lisa.o: $(UTILS_SRC)/visual.h
+lisa.o: $(UTILS_SRC)/yarandom.h
+lisa.o: $(srcdir)/xlockmoreI.h
+lisa.o: $(srcdir)/xlockmore.h
+lissie.o: ../config.h
+lissie.o: $(srcdir)/fps.h
+lissie.o: $(srcdir)/recanim.h
+lissie.o: $(srcdir)/screenhackI.h
+lissie.o: $(UTILS_SRC)/colors.h
+lissie.o: $(UTILS_SRC)/erase.h
+lissie.o: $(UTILS_SRC)/font-retry.h
+lissie.o: $(UTILS_SRC)/grabscreen.h
+lissie.o: $(UTILS_SRC)/hsv.h
+lissie.o: $(UTILS_SRC)/resources.h
+lissie.o: $(UTILS_SRC)/usleep.h
+lissie.o: $(UTILS_SRC)/visual.h
+lissie.o: $(UTILS_SRC)/yarandom.h
+lissie.o: $(srcdir)/xlockmoreI.h
+lissie.o: $(srcdir)/xlockmore.h
+lmorph.o: ../config.h
+lmorph.o: $(srcdir)/fps.h
+lmorph.o: $(srcdir)/recanim.h
+lmorph.o: $(srcdir)/screenhackI.h
+lmorph.o: $(srcdir)/screenhack.h
+lmorph.o: $(UTILS_SRC)/colors.h
+lmorph.o: $(UTILS_SRC)/font-retry.h
+lmorph.o: $(UTILS_SRC)/grabscreen.h
+lmorph.o: $(UTILS_SRC)/hsv.h
+lmorph.o: $(UTILS_SRC)/resources.h
+lmorph.o: $(UTILS_SRC)/usleep.h
+lmorph.o: $(UTILS_SRC)/visual.h
+lmorph.o: $(UTILS_SRC)/yarandom.h
+loop.o: $(srcdir)/automata.h
+loop.o: ../config.h
+loop.o: $(srcdir)/fps.h
+loop.o: $(srcdir)/recanim.h
+loop.o: $(srcdir)/screenhackI.h
+loop.o: $(UTILS_SRC)/colors.h
+loop.o: $(UTILS_SRC)/erase.h
+loop.o: $(UTILS_SRC)/font-retry.h
+loop.o: $(UTILS_SRC)/grabscreen.h
+loop.o: $(UTILS_SRC)/hsv.h
+loop.o: $(UTILS_SRC)/resources.h
+loop.o: $(UTILS_SRC)/usleep.h
+loop.o: $(UTILS_SRC)/visual.h
+loop.o: $(UTILS_SRC)/yarandom.h
+loop.o: $(srcdir)/xlockmoreI.h
+loop.o: $(srcdir)/xlockmore.h
+m6502.o: $(srcdir)/analogtv.h
+m6502.o: $(srcdir)/asm6502.h
+m6502.o: ../config.h
+m6502.o: $(srcdir)/fps.h
+m6502.o: m6502.h
+m6502.o: $(srcdir)/recanim.h
+m6502.o: $(srcdir)/screenhackI.h
+m6502.o: $(srcdir)/screenhack.h
+m6502.o: $(UTILS_SRC)/aligned_malloc.h
+m6502.o: $(UTILS_SRC)/colors.h
+m6502.o: $(UTILS_SRC)/font-retry.h
+m6502.o: $(UTILS_SRC)/grabscreen.h
+m6502.o: $(UTILS_SRC)/hsv.h
+m6502.o: $(UTILS_SRC)/resources.h
+m6502.o: $(UTILS_SRC)/thread_util.h
+m6502.o: $(UTILS_SRC)/usleep.h
+m6502.o: $(UTILS_SRC)/visual.h
+m6502.o: $(UTILS_SRC)/xshm.h
+m6502.o: $(UTILS_SRC)/yarandom.h
+maze.o: ../config.h
+maze.o: $(srcdir)/fps.h
+maze.o: $(srcdir)/images/gen/logo-180_png.h
+maze.o: $(srcdir)/images/gen/logo-50_png.h
+maze.o: $(srcdir)/recanim.h
+maze.o: $(srcdir)/screenhackI.h
+maze.o: $(srcdir)/screenhack.h
+maze.o: $(UTILS_SRC)/colors.h
+maze.o: $(UTILS_SRC)/erase.h
+maze.o: $(UTILS_SRC)/font-retry.h
+maze.o: $(UTILS_SRC)/grabscreen.h
+maze.o: $(UTILS_SRC)/hsv.h
+maze.o: $(UTILS_SRC)/resources.h
+maze.o: $(UTILS_SRC)/usleep.h
+maze.o: $(UTILS_SRC)/visual.h
+maze.o: $(UTILS_SRC)/yarandom.h
+maze.o: $(srcdir)/ximage-loader.h
+memscroller.o: ../config.h
+memscroller.o: $(srcdir)/fps.h
+memscroller.o: $(srcdir)/recanim.h
+memscroller.o: $(srcdir)/screenhackI.h
+memscroller.o: $(srcdir)/screenhack.h
+memscroller.o: $(UTILS_SRC)/colors.h
+memscroller.o: $(UTILS_SRC)/font-retry.h
+memscroller.o: $(UTILS_SRC)/grabscreen.h
+memscroller.o: $(UTILS_SRC)/hsv.h
+memscroller.o: $(UTILS_SRC)/resources.h
+memscroller.o: $(UTILS_SRC)/usleep.h
+memscroller.o: $(UTILS_SRC)/visual.h
+memscroller.o: $(UTILS_SRC)/xshm.h
+memscroller.o: $(UTILS_SRC)/yarandom.h
+metaballs.o: ../config.h
+metaballs.o: $(srcdir)/fps.h
+metaballs.o: $(srcdir)/recanim.h
+metaballs.o: $(srcdir)/screenhackI.h
+metaballs.o: $(srcdir)/screenhack.h
+metaballs.o: $(UTILS_SRC)/colors.h
+metaballs.o: $(UTILS_SRC)/font-retry.h
+metaballs.o: $(UTILS_SRC)/grabscreen.h
+metaballs.o: $(UTILS_SRC)/hsv.h
+metaballs.o: $(UTILS_SRC)/resources.h
+metaballs.o: $(UTILS_SRC)/usleep.h
+metaballs.o: $(UTILS_SRC)/visual.h
+metaballs.o: $(UTILS_SRC)/yarandom.h
+moire2.o: ../config.h
+moire2.o: $(srcdir)/fps.h
+moire2.o: $(srcdir)/recanim.h
+moire2.o: $(srcdir)/screenhackI.h
+moire2.o: $(srcdir)/screenhack.h
+moire2.o: $(UTILS_SRC)/colors.h
+moire2.o: $(UTILS_SRC)/font-retry.h
+moire2.o: $(UTILS_SRC)/grabscreen.h
+moire2.o: $(UTILS_SRC)/hsv.h
+moire2.o: $(UTILS_SRC)/resources.h
+moire2.o: $(UTILS_SRC)/usleep.h
+moire2.o: $(UTILS_SRC)/visual.h
+moire2.o: $(UTILS_SRC)/xdbe.h
+moire2.o: $(UTILS_SRC)/yarandom.h
+moire.o: ../config.h
+moire.o: $(srcdir)/fps.h
+moire.o: $(srcdir)/recanim.h
+moire.o: $(srcdir)/screenhackI.h
+moire.o: $(srcdir)/screenhack.h
+moire.o: $(UTILS_SRC)/colors.h
+moire.o: $(UTILS_SRC)/font-retry.h
+moire.o: $(UTILS_SRC)/grabscreen.h
+moire.o: $(UTILS_SRC)/hsv.h
+moire.o: $(UTILS_SRC)/resources.h
+moire.o: $(UTILS_SRC)/usleep.h
+moire.o: $(UTILS_SRC)/visual.h
+moire.o: $(UTILS_SRC)/xshm.h
+moire.o: $(UTILS_SRC)/yarandom.h
+mountain.o: ../config.h
+mountain.o: $(srcdir)/fps.h
+mountain.o: $(srcdir)/recanim.h
+mountain.o: $(srcdir)/screenhackI.h
+mountain.o: $(UTILS_SRC)/colors.h
+mountain.o: $(UTILS_SRC)/erase.h
+mountain.o: $(UTILS_SRC)/font-retry.h
+mountain.o: $(UTILS_SRC)/grabscreen.h
+mountain.o: $(UTILS_SRC)/hsv.h
+mountain.o: $(UTILS_SRC)/resources.h
+mountain.o: $(UTILS_SRC)/usleep.h
+mountain.o: $(UTILS_SRC)/visual.h
+mountain.o: $(UTILS_SRC)/yarandom.h
+mountain.o: $(srcdir)/xlockmoreI.h
+mountain.o: $(srcdir)/xlockmore.h
+munch.o: ../config.h
+munch.o: $(srcdir)/fps.h
+munch.o: $(srcdir)/recanim.h
+munch.o: $(srcdir)/screenhackI.h
+munch.o: $(srcdir)/screenhack.h
+munch.o: $(UTILS_SRC)/colors.h
+munch.o: $(UTILS_SRC)/font-retry.h
+munch.o: $(UTILS_SRC)/grabscreen.h
+munch.o: $(UTILS_SRC)/hsv.h
+munch.o: $(UTILS_SRC)/resources.h
+munch.o: $(UTILS_SRC)/usleep.h
+munch.o: $(UTILS_SRC)/visual.h
+munch.o: $(UTILS_SRC)/yarandom.h
+nerverot.o: ../config.h
+nerverot.o: $(srcdir)/fps.h
+nerverot.o: $(srcdir)/recanim.h
+nerverot.o: $(srcdir)/screenhackI.h
+nerverot.o: $(srcdir)/screenhack.h
+nerverot.o: $(UTILS_SRC)/colors.h
+nerverot.o: $(UTILS_SRC)/font-retry.h
+nerverot.o: $(UTILS_SRC)/grabscreen.h
+nerverot.o: $(UTILS_SRC)/hsv.h
+nerverot.o: $(UTILS_SRC)/resources.h
+nerverot.o: $(UTILS_SRC)/usleep.h
+nerverot.o: $(UTILS_SRC)/visual.h
+nerverot.o: $(UTILS_SRC)/yarandom.h
+noseguy.o: ../config.h
+noseguy.o: $(srcdir)/fps.h
+noseguy.o: $(srcdir)/images/gen/nose-f1_png.h
+noseguy.o: $(srcdir)/images/gen/nose-f2_png.h
+noseguy.o: $(srcdir)/images/gen/nose-f3_png.h
+noseguy.o: $(srcdir)/images/gen/nose-f4_png.h
+noseguy.o: $(srcdir)/images/gen/nose-l1_png.h
+noseguy.o: $(srcdir)/images/gen/nose-l2_png.h
+noseguy.o: $(srcdir)/images/gen/nose-r1_png.h
+noseguy.o: $(srcdir)/images/gen/nose-r2_png.h
+noseguy.o: $(srcdir)/recanim.h
+noseguy.o: $(srcdir)/screenhackI.h
+noseguy.o: $(srcdir)/screenhack.h
+noseguy.o: $(UTILS_SRC)/colors.h
+noseguy.o: $(UTILS_SRC)/font-retry.h
+noseguy.o: $(UTILS_SRC)/grabscreen.h
+noseguy.o: $(UTILS_SRC)/hsv.h
+noseguy.o: $(UTILS_SRC)/resources.h
+noseguy.o: $(UTILS_SRC)/textclient.h
+noseguy.o: $(UTILS_SRC)/usleep.h
+noseguy.o: $(UTILS_SRC)/visual.h
+noseguy.o: $(UTILS_SRC)/xft.h
+noseguy.o: $(UTILS_SRC)/yarandom.h
+noseguy.o: $(srcdir)/ximage-loader.h
+pacman_ai.o: ../config.h
+pacman_ai.o: $(srcdir)/fps.h
+pacman_ai.o: $(srcdir)/pacman_ai.h
+pacman_ai.o: $(srcdir)/pacman.h
+pacman_ai.o: $(srcdir)/pacman_level.h
+pacman_ai.o: $(srcdir)/recanim.h
+pacman_ai.o: $(srcdir)/screenhackI.h
+pacman_ai.o: $(UTILS_SRC)/colors.h
+pacman_ai.o: $(UTILS_SRC)/erase.h
+pacman_ai.o: $(UTILS_SRC)/font-retry.h
+pacman_ai.o: $(UTILS_SRC)/grabscreen.h
+pacman_ai.o: $(UTILS_SRC)/hsv.h
+pacman_ai.o: $(UTILS_SRC)/resources.h
+pacman_ai.o: $(UTILS_SRC)/usleep.h
+pacman_ai.o: $(UTILS_SRC)/visual.h
+pacman_ai.o: $(UTILS_SRC)/yarandom.h
+pacman_ai.o: $(srcdir)/ximage-loader.h
+pacman_ai.o: $(srcdir)/xlockmoreI.h
+pacman_level.o: ../config.h
+pacman_level.o: $(srcdir)/fps.h
+pacman_level.o: $(srcdir)/pacman.h
+pacman_level.o: $(srcdir)/pacman_level.h
+pacman_level.o: $(srcdir)/recanim.h
+pacman_level.o: $(srcdir)/screenhackI.h
+pacman_level.o: $(UTILS_SRC)/colors.h
+pacman_level.o: $(UTILS_SRC)/erase.h
+pacman_level.o: $(UTILS_SRC)/font-retry.h
+pacman_level.o: $(UTILS_SRC)/grabscreen.h
+pacman_level.o: $(UTILS_SRC)/hsv.h
+pacman_level.o: $(UTILS_SRC)/resources.h
+pacman_level.o: $(UTILS_SRC)/usleep.h
+pacman_level.o: $(UTILS_SRC)/visual.h
+pacman_level.o: $(UTILS_SRC)/yarandom.h
+pacman_level.o: $(srcdir)/ximage-loader.h
+pacman_level.o: $(srcdir)/xlockmoreI.h
+pacman.o: ../config.h
+pacman.o: $(srcdir)/fps.h
+pacman.o: $(srcdir)/images/gen/pacman_png.h
+pacman.o: $(srcdir)/pacman_ai.h
+pacman.o: $(srcdir)/pacman.h
+pacman.o: $(srcdir)/pacman_level.h
+pacman.o: $(srcdir)/recanim.h
+pacman.o: $(srcdir)/screenhackI.h
+pacman.o: $(UTILS_SRC)/colors.h
+pacman.o: $(UTILS_SRC)/erase.h
+pacman.o: $(UTILS_SRC)/font-retry.h
+pacman.o: $(UTILS_SRC)/grabscreen.h
+pacman.o: $(UTILS_SRC)/hsv.h
+pacman.o: $(UTILS_SRC)/resources.h
+pacman.o: $(UTILS_SRC)/usleep.h
+pacman.o: $(UTILS_SRC)/visual.h
+pacman.o: $(UTILS_SRC)/yarandom.h
+pacman.o: $(srcdir)/ximage-loader.h
+pacman.o: $(srcdir)/xlockmoreI.h
+pacman.o: $(srcdir)/xlockmore.h
+pedal.o: ../config.h
+pedal.o: $(srcdir)/fps.h
+pedal.o: $(srcdir)/recanim.h
+pedal.o: $(srcdir)/screenhackI.h
+pedal.o: $(srcdir)/screenhack.h
+pedal.o: $(UTILS_SRC)/colors.h
+pedal.o: $(UTILS_SRC)/erase.h
+pedal.o: $(UTILS_SRC)/font-retry.h
+pedal.o: $(UTILS_SRC)/grabscreen.h
+pedal.o: $(UTILS_SRC)/hsv.h
+pedal.o: $(UTILS_SRC)/resources.h
+pedal.o: $(UTILS_SRC)/usleep.h
+pedal.o: $(UTILS_SRC)/visual.h
+pedal.o: $(UTILS_SRC)/yarandom.h
+penetrate.o: ../config.h
+penetrate.o: $(srcdir)/fps.h
+penetrate.o: $(srcdir)/recanim.h
+penetrate.o: $(srcdir)/screenhackI.h
+penetrate.o: $(srcdir)/screenhack.h
+penetrate.o: $(UTILS_SRC)/colors.h
+penetrate.o: $(UTILS_SRC)/font-retry.h
+penetrate.o: $(UTILS_SRC)/grabscreen.h
+penetrate.o: $(UTILS_SRC)/hsv.h
+penetrate.o: $(UTILS_SRC)/resources.h
+penetrate.o: $(UTILS_SRC)/usleep.h
+penetrate.o: $(UTILS_SRC)/visual.h
+penetrate.o: $(UTILS_SRC)/yarandom.h
+penrose.o: ../config.h
+penrose.o: $(srcdir)/fps.h
+penrose.o: $(srcdir)/recanim.h
+penrose.o: $(srcdir)/screenhackI.h
+penrose.o: $(UTILS_SRC)/colors.h
+penrose.o: $(UTILS_SRC)/erase.h
+penrose.o: $(UTILS_SRC)/font-retry.h
+penrose.o: $(UTILS_SRC)/grabscreen.h
+penrose.o: $(UTILS_SRC)/hsv.h
+penrose.o: $(UTILS_SRC)/resources.h
+penrose.o: $(UTILS_SRC)/usleep.h
+penrose.o: $(UTILS_SRC)/visual.h
+penrose.o: $(UTILS_SRC)/yarandom.h
+penrose.o: $(srcdir)/xlockmoreI.h
+penrose.o: $(srcdir)/xlockmore.h
+petri.o: ../config.h
+petri.o: $(srcdir)/fps.h
+petri.o: $(srcdir)/recanim.h
+petri.o: $(srcdir)/screenhackI.h
+petri.o: $(srcdir)/screenhack.h
+petri.o: $(UTILS_SRC)/colors.h
+petri.o: $(UTILS_SRC)/font-retry.h
+petri.o: $(UTILS_SRC)/grabscreen.h
+petri.o: $(UTILS_SRC)/hsv.h
+petri.o: $(UTILS_SRC)/resources.h
+petri.o: $(UTILS_SRC)/spline.h
+petri.o: $(UTILS_SRC)/usleep.h
+petri.o: $(UTILS_SRC)/visual.h
+petri.o: $(UTILS_SRC)/yarandom.h
+phosphor.o: ../config.h
+phosphor.o: $(srcdir)/fps.h
+phosphor.o: $(srcdir)/images/gen/6x10font_png.h
+phosphor.o: $(srcdir)/recanim.h
+phosphor.o: $(srcdir)/screenhackI.h
+phosphor.o: $(srcdir)/screenhack.h
+phosphor.o: $(UTILS_SRC)/colors.h
+phosphor.o: $(UTILS_SRC)/font-retry.h
+phosphor.o: $(UTILS_SRC)/grabscreen.h
+phosphor.o: $(UTILS_SRC)/hsv.h
+phosphor.o: $(UTILS_SRC)/resources.h
+phosphor.o: $(UTILS_SRC)/textclient.h
+phosphor.o: $(UTILS_SRC)/usleep.h
+phosphor.o: $(UTILS_SRC)/utf8wc.h
+phosphor.o: $(UTILS_SRC)/visual.h
+phosphor.o: $(UTILS_SRC)/yarandom.h
+phosphor.o: $(srcdir)/ximage-loader.h
+piecewise.o: ../config.h
+piecewise.o: $(srcdir)/fps.h
+piecewise.o: $(srcdir)/recanim.h
+piecewise.o: $(srcdir)/screenhackI.h
+piecewise.o: $(srcdir)/screenhack.h
+piecewise.o: $(UTILS_SRC)/colors.h
+piecewise.o: $(UTILS_SRC)/font-retry.h
+piecewise.o: $(UTILS_SRC)/grabscreen.h
+piecewise.o: $(UTILS_SRC)/hsv.h
+piecewise.o: $(UTILS_SRC)/resources.h
+piecewise.o: $(UTILS_SRC)/usleep.h
+piecewise.o: $(UTILS_SRC)/visual.h
+piecewise.o: $(UTILS_SRC)/xdbe.h
+piecewise.o: $(UTILS_SRC)/yarandom.h
+polyominoes.o: ../config.h
+polyominoes.o: $(srcdir)/fps.h
+polyominoes.o: $(srcdir)/recanim.h
+polyominoes.o: $(srcdir)/screenhackI.h
+polyominoes.o: $(UTILS_SRC)/colors.h
+polyominoes.o: $(UTILS_SRC)/erase.h
+polyominoes.o: $(UTILS_SRC)/font-retry.h
+polyominoes.o: $(UTILS_SRC)/grabscreen.h
+polyominoes.o: $(UTILS_SRC)/hsv.h
+polyominoes.o: $(UTILS_SRC)/resources.h
+polyominoes.o: $(UTILS_SRC)/usleep.h
+polyominoes.o: $(UTILS_SRC)/visual.h
+polyominoes.o: $(UTILS_SRC)/yarandom.h
+polyominoes.o: $(srcdir)/xlockmoreI.h
+polyominoes.o: $(srcdir)/xlockmore.h
+pong.o: $(srcdir)/analogtv.h
+pong.o: ../config.h
+pong.o: $(srcdir)/fps.h
+pong.o: $(srcdir)/recanim.h
+pong.o: $(srcdir)/screenhackI.h
+pong.o: $(srcdir)/screenhack.h
+pong.o: $(UTILS_SRC)/aligned_malloc.h
+pong.o: $(UTILS_SRC)/colors.h
+pong.o: $(UTILS_SRC)/font-retry.h
+pong.o: $(UTILS_SRC)/grabscreen.h
+pong.o: $(UTILS_SRC)/hsv.h
+pong.o: $(UTILS_SRC)/resources.h
+pong.o: $(UTILS_SRC)/thread_util.h
+pong.o: $(UTILS_SRC)/usleep.h
+pong.o: $(UTILS_SRC)/visual.h
+pong.o: $(UTILS_SRC)/xshm.h
+pong.o: $(UTILS_SRC)/yarandom.h
+popsquares.o: ../config.h
+popsquares.o: $(srcdir)/fps.h
+popsquares.o: $(srcdir)/recanim.h
+popsquares.o: $(srcdir)/screenhackI.h
+popsquares.o: $(srcdir)/screenhack.h
+popsquares.o: $(UTILS_SRC)/colors.h
+popsquares.o: $(UTILS_SRC)/font-retry.h
+popsquares.o: $(UTILS_SRC)/grabscreen.h
+popsquares.o: $(UTILS_SRC)/hsv.h
+popsquares.o: $(UTILS_SRC)/resources.h
+popsquares.o: $(UTILS_SRC)/usleep.h
+popsquares.o: $(UTILS_SRC)/visual.h
+popsquares.o: $(UTILS_SRC)/xdbe.h
+popsquares.o: $(UTILS_SRC)/yarandom.h
+pyro.o: ../config.h
+pyro.o: $(srcdir)/fps.h
+pyro.o: $(srcdir)/recanim.h
+pyro.o: $(srcdir)/screenhackI.h
+pyro.o: $(srcdir)/screenhack.h
+pyro.o: $(UTILS_SRC)/colors.h
+pyro.o: $(UTILS_SRC)/font-retry.h
+pyro.o: $(UTILS_SRC)/grabscreen.h
+pyro.o: $(UTILS_SRC)/hsv.h
+pyro.o: $(UTILS_SRC)/resources.h
+pyro.o: $(UTILS_SRC)/usleep.h
+pyro.o: $(UTILS_SRC)/visual.h
+pyro.o: $(UTILS_SRC)/yarandom.h
+qix.o: ../config.h
+qix.o: $(srcdir)/fps.h
+qix.o: $(srcdir)/recanim.h
+qix.o: $(srcdir)/screenhackI.h
+qix.o: $(srcdir)/screenhack.h
+qix.o: $(UTILS_SRC)/alpha.h
+qix.o: $(UTILS_SRC)/colors.h
+qix.o: $(UTILS_SRC)/font-retry.h
+qix.o: $(UTILS_SRC)/grabscreen.h
+qix.o: $(UTILS_SRC)/hsv.h
+qix.o: $(UTILS_SRC)/resources.h
+qix.o: $(UTILS_SRC)/usleep.h
+qix.o: $(UTILS_SRC)/visual.h
+qix.o: $(UTILS_SRC)/yarandom.h
+rd-bomb.o: ../config.h
+rd-bomb.o: $(srcdir)/fps.h
+rd-bomb.o: $(srcdir)/recanim.h
+rd-bomb.o: $(srcdir)/screenhackI.h
+rd-bomb.o: $(srcdir)/screenhack.h
+rd-bomb.o: $(UTILS_SRC)/colors.h
+rd-bomb.o: $(UTILS_SRC)/font-retry.h
+rd-bomb.o: $(UTILS_SRC)/grabscreen.h
+rd-bomb.o: $(UTILS_SRC)/hsv.h
+rd-bomb.o: $(UTILS_SRC)/resources.h
+rd-bomb.o: $(UTILS_SRC)/usleep.h
+rd-bomb.o: $(UTILS_SRC)/visual.h
+rd-bomb.o: $(UTILS_SRC)/xshm.h
+rd-bomb.o: $(UTILS_SRC)/yarandom.h
+recanim.o: ../config.h
+recanim.o: $(srcdir)/fps.h
+recanim.o: $(srcdir)/recanim.h
+recanim.o: $(srcdir)/screenhackI.h
+recanim.o: $(UTILS_SRC)/colors.h
+recanim.o: $(UTILS_SRC)/font-retry.h
+recanim.o: $(UTILS_SRC)/grabscreen.h
+recanim.o: $(UTILS_SRC)/hsv.h
+recanim.o: $(UTILS_SRC)/resources.h
+recanim.o: $(UTILS_SRC)/usleep.h
+recanim.o: $(UTILS_SRC)/visual.h
+recanim.o: $(UTILS_SRC)/yarandom.h
+ripples.o: ../config.h
+ripples.o: $(srcdir)/fps.h
+ripples.o: $(srcdir)/recanim.h
+ripples.o: $(srcdir)/screenhackI.h
+ripples.o: $(srcdir)/screenhack.h
+ripples.o: $(UTILS_SRC)/colors.h
+ripples.o: $(UTILS_SRC)/font-retry.h
+ripples.o: $(UTILS_SRC)/grabscreen.h
+ripples.o: $(UTILS_SRC)/hsv.h
+ripples.o: $(UTILS_SRC)/resources.h
+ripples.o: $(UTILS_SRC)/usleep.h
+ripples.o: $(UTILS_SRC)/visual.h
+ripples.o: $(UTILS_SRC)/xshm.h
+ripples.o: $(UTILS_SRC)/yarandom.h
+rocks.o: ../config.h
+rocks.o: $(srcdir)/fps.h
+rocks.o: $(srcdir)/recanim.h
+rocks.o: $(srcdir)/screenhackI.h
+rocks.o: $(srcdir)/screenhack.h
+rocks.o: $(UTILS_SRC)/colors.h
+rocks.o: $(UTILS_SRC)/font-retry.h
+rocks.o: $(UTILS_SRC)/grabscreen.h
+rocks.o: $(UTILS_SRC)/hsv.h
+rocks.o: $(UTILS_SRC)/resources.h
+rocks.o: $(UTILS_SRC)/usleep.h
+rocks.o: $(UTILS_SRC)/visual.h
+rocks.o: $(UTILS_SRC)/yarandom.h
+rorschach.o: ../config.h
+rorschach.o: $(srcdir)/fps.h
+rorschach.o: $(srcdir)/recanim.h
+rorschach.o: $(srcdir)/screenhackI.h
+rorschach.o: $(srcdir)/screenhack.h
+rorschach.o: $(UTILS_SRC)/colors.h
+rorschach.o: $(UTILS_SRC)/erase.h
+rorschach.o: $(UTILS_SRC)/font-retry.h
+rorschach.o: $(UTILS_SRC)/grabscreen.h
+rorschach.o: $(UTILS_SRC)/hsv.h
+rorschach.o: $(UTILS_SRC)/resources.h
+rorschach.o: $(UTILS_SRC)/usleep.h
+rorschach.o: $(UTILS_SRC)/visual.h
+rorschach.o: $(UTILS_SRC)/yarandom.h
+rotor.o: ../config.h
+rotor.o: $(srcdir)/fps.h
+rotor.o: $(srcdir)/recanim.h
+rotor.o: $(srcdir)/screenhackI.h
+rotor.o: $(UTILS_SRC)/colors.h
+rotor.o: $(UTILS_SRC)/erase.h
+rotor.o: $(UTILS_SRC)/font-retry.h
+rotor.o: $(UTILS_SRC)/grabscreen.h
+rotor.o: $(UTILS_SRC)/hsv.h
+rotor.o: $(UTILS_SRC)/resources.h
+rotor.o: $(UTILS_SRC)/usleep.h
+rotor.o: $(UTILS_SRC)/visual.h
+rotor.o: $(UTILS_SRC)/yarandom.h
+rotor.o: $(srcdir)/xlockmoreI.h
+rotor.o: $(srcdir)/xlockmore.h
+rotzoomer.o: ../config.h
+rotzoomer.o: $(srcdir)/fps.h
+rotzoomer.o: $(srcdir)/recanim.h
+rotzoomer.o: $(srcdir)/screenhackI.h
+rotzoomer.o: $(srcdir)/screenhack.h
+rotzoomer.o: $(UTILS_SRC)/colors.h
+rotzoomer.o: $(UTILS_SRC)/font-retry.h
+rotzoomer.o: $(UTILS_SRC)/grabscreen.h
+rotzoomer.o: $(UTILS_SRC)/hsv.h
+rotzoomer.o: $(UTILS_SRC)/resources.h
+rotzoomer.o: $(UTILS_SRC)/usleep.h
+rotzoomer.o: $(UTILS_SRC)/visual.h
+rotzoomer.o: $(UTILS_SRC)/xshm.h
+rotzoomer.o: $(UTILS_SRC)/yarandom.h
+screenhack.o: ../config.h
+screenhack.o: $(srcdir)/fps.h
+screenhack.o: $(srcdir)/recanim.h
+screenhack.o: $(srcdir)/screenhackI.h
+screenhack.o: $(UTILS_SRC)/colors.h
+screenhack.o: $(UTILS_SRC)/font-retry.h
+screenhack.o: $(UTILS_SRC)/grabscreen.h
+screenhack.o: $(UTILS_SRC)/hsv.h
+screenhack.o: $(UTILS_SRC)/resources.h
+screenhack.o: $(UTILS_SRC)/usleep.h
+screenhack.o: $(UTILS_SRC)/version.h
+screenhack.o: $(UTILS_SRC)/visual.h
+screenhack.o: $(UTILS_SRC)/vroot.h
+screenhack.o: $(UTILS_SRC)/xmu.h
+screenhack.o: $(UTILS_SRC)/yarandom.h
+shadebobs.o: ../config.h
+shadebobs.o: $(srcdir)/fps.h
+shadebobs.o: $(srcdir)/recanim.h
+shadebobs.o: $(srcdir)/screenhackI.h
+shadebobs.o: $(srcdir)/screenhack.h
+shadebobs.o: $(UTILS_SRC)/colors.h
+shadebobs.o: $(UTILS_SRC)/font-retry.h
+shadebobs.o: $(UTILS_SRC)/grabscreen.h
+shadebobs.o: $(UTILS_SRC)/hsv.h
+shadebobs.o: $(UTILS_SRC)/resources.h
+shadebobs.o: $(UTILS_SRC)/usleep.h
+shadebobs.o: $(UTILS_SRC)/visual.h
+shadebobs.o: $(UTILS_SRC)/yarandom.h
+sierpinski.o: ../config.h
+sierpinski.o: $(srcdir)/fps.h
+sierpinski.o: $(srcdir)/recanim.h
+sierpinski.o: $(srcdir)/screenhackI.h
+sierpinski.o: $(UTILS_SRC)/colors.h
+sierpinski.o: $(UTILS_SRC)/erase.h
+sierpinski.o: $(UTILS_SRC)/font-retry.h
+sierpinski.o: $(UTILS_SRC)/grabscreen.h
+sierpinski.o: $(UTILS_SRC)/hsv.h
+sierpinski.o: $(UTILS_SRC)/resources.h
+sierpinski.o: $(UTILS_SRC)/usleep.h
+sierpinski.o: $(UTILS_SRC)/visual.h
+sierpinski.o: $(UTILS_SRC)/yarandom.h
+sierpinski.o: $(srcdir)/xlockmoreI.h
+sierpinski.o: $(srcdir)/xlockmore.h
+slidescreen.o: ../config.h
+slidescreen.o: $(srcdir)/fps.h
+slidescreen.o: $(srcdir)/recanim.h
+slidescreen.o: $(srcdir)/screenhackI.h
+slidescreen.o: $(srcdir)/screenhack.h
+slidescreen.o: $(UTILS_SRC)/colors.h
+slidescreen.o: $(UTILS_SRC)/font-retry.h
+slidescreen.o: $(UTILS_SRC)/grabscreen.h
+slidescreen.o: $(UTILS_SRC)/hsv.h
+slidescreen.o: $(UTILS_SRC)/resources.h
+slidescreen.o: $(UTILS_SRC)/usleep.h
+slidescreen.o: $(UTILS_SRC)/visual.h
+slidescreen.o: $(UTILS_SRC)/yarandom.h
+slip.o: ../config.h
+slip.o: $(srcdir)/fps.h
+slip.o: $(srcdir)/recanim.h
+slip.o: $(srcdir)/screenhackI.h
+slip.o: $(UTILS_SRC)/colors.h
+slip.o: $(UTILS_SRC)/erase.h
+slip.o: $(UTILS_SRC)/font-retry.h
+slip.o: $(UTILS_SRC)/grabscreen.h
+slip.o: $(UTILS_SRC)/hsv.h
+slip.o: $(UTILS_SRC)/resources.h
+slip.o: $(UTILS_SRC)/usleep.h
+slip.o: $(UTILS_SRC)/visual.h
+slip.o: $(UTILS_SRC)/yarandom.h
+slip.o: $(srcdir)/xlockmoreI.h
+slip.o: $(srcdir)/xlockmore.h
+speedmine.o: ../config.h
+speedmine.o: $(srcdir)/fps.h
+speedmine.o: $(srcdir)/recanim.h
+speedmine.o: $(srcdir)/screenhackI.h
+speedmine.o: $(srcdir)/screenhack.h
+speedmine.o: $(UTILS_SRC)/colors.h
+speedmine.o: $(UTILS_SRC)/erase.h
+speedmine.o: $(UTILS_SRC)/font-retry.h
+speedmine.o: $(UTILS_SRC)/grabscreen.h
+speedmine.o: $(UTILS_SRC)/hsv.h
+speedmine.o: $(UTILS_SRC)/resources.h
+speedmine.o: $(UTILS_SRC)/usleep.h
+speedmine.o: $(UTILS_SRC)/visual.h
+speedmine.o: $(UTILS_SRC)/yarandom.h
+sphere.o: ../config.h
+sphere.o: $(srcdir)/fps.h
+sphere.o: $(srcdir)/recanim.h
+sphere.o: $(srcdir)/screenhackI.h
+sphere.o: $(UTILS_SRC)/colors.h
+sphere.o: $(UTILS_SRC)/erase.h
+sphere.o: $(UTILS_SRC)/font-retry.h
+sphere.o: $(UTILS_SRC)/grabscreen.h
+sphere.o: $(UTILS_SRC)/hsv.h
+sphere.o: $(UTILS_SRC)/resources.h
+sphere.o: $(UTILS_SRC)/usleep.h
+sphere.o: $(UTILS_SRC)/visual.h
+sphere.o: $(UTILS_SRC)/yarandom.h
+sphere.o: $(srcdir)/xlockmoreI.h
+sphere.o: $(srcdir)/xlockmore.h
+spiral.o: ../config.h
+spiral.o: $(srcdir)/fps.h
+spiral.o: $(srcdir)/recanim.h
+spiral.o: $(srcdir)/screenhackI.h
+spiral.o: $(UTILS_SRC)/colors.h
+spiral.o: $(UTILS_SRC)/erase.h
+spiral.o: $(UTILS_SRC)/font-retry.h
+spiral.o: $(UTILS_SRC)/grabscreen.h
+spiral.o: $(UTILS_SRC)/hsv.h
+spiral.o: $(UTILS_SRC)/resources.h
+spiral.o: $(UTILS_SRC)/usleep.h
+spiral.o: $(UTILS_SRC)/visual.h
+spiral.o: $(UTILS_SRC)/yarandom.h
+spiral.o: $(srcdir)/xlockmoreI.h
+spiral.o: $(srcdir)/xlockmore.h
+spotlight.o: ../config.h
+spotlight.o: $(srcdir)/fps.h
+spotlight.o: $(srcdir)/recanim.h
+spotlight.o: $(srcdir)/screenhackI.h
+spotlight.o: $(srcdir)/screenhack.h
+spotlight.o: $(UTILS_SRC)/colors.h
+spotlight.o: $(UTILS_SRC)/font-retry.h
+spotlight.o: $(UTILS_SRC)/grabscreen.h
+spotlight.o: $(UTILS_SRC)/hsv.h
+spotlight.o: $(UTILS_SRC)/resources.h
+spotlight.o: $(UTILS_SRC)/usleep.h
+spotlight.o: $(UTILS_SRC)/visual.h
+spotlight.o: $(UTILS_SRC)/yarandom.h
+squiral.o: ../config.h
+squiral.o: $(srcdir)/fps.h
+squiral.o: $(srcdir)/recanim.h
+squiral.o: $(srcdir)/screenhackI.h
+squiral.o: $(srcdir)/screenhack.h
+squiral.o: $(UTILS_SRC)/colors.h
+squiral.o: $(UTILS_SRC)/erase.h
+squiral.o: $(UTILS_SRC)/font-retry.h
+squiral.o: $(UTILS_SRC)/grabscreen.h
+squiral.o: $(UTILS_SRC)/hsv.h
+squiral.o: $(UTILS_SRC)/resources.h
+squiral.o: $(UTILS_SRC)/usleep.h
+squiral.o: $(UTILS_SRC)/visual.h
+squiral.o: $(UTILS_SRC)/yarandom.h
+starfish.o: ../config.h
+starfish.o: $(srcdir)/fps.h
+starfish.o: $(srcdir)/recanim.h
+starfish.o: $(srcdir)/screenhackI.h
+starfish.o: $(srcdir)/screenhack.h
+starfish.o: $(UTILS_SRC)/colors.h
+starfish.o: $(UTILS_SRC)/font-retry.h
+starfish.o: $(UTILS_SRC)/grabscreen.h
+starfish.o: $(UTILS_SRC)/hsv.h
+starfish.o: $(UTILS_SRC)/resources.h
+starfish.o: $(UTILS_SRC)/spline.h
+starfish.o: $(UTILS_SRC)/usleep.h
+starfish.o: $(UTILS_SRC)/visual.h
+starfish.o: $(UTILS_SRC)/yarandom.h
+strange.o: ../config.h
+strange.o: $(srcdir)/fps.h
+strange.o: $(srcdir)/recanim.h
+strange.o: $(srcdir)/screenhackI.h
+strange.o: $(UTILS_SRC)/aligned_malloc.h
+strange.o: $(UTILS_SRC)/colors.h
+strange.o: $(UTILS_SRC)/erase.h
+strange.o: $(UTILS_SRC)/font-retry.h
+strange.o: $(UTILS_SRC)/grabscreen.h
+strange.o: $(UTILS_SRC)/hsv.h
+strange.o: $(UTILS_SRC)/pow2.h
+strange.o: $(UTILS_SRC)/resources.h
+strange.o: $(UTILS_SRC)/thread_util.h
+strange.o: $(UTILS_SRC)/usleep.h
+strange.o: $(UTILS_SRC)/visual.h
+strange.o: $(UTILS_SRC)/xshm.h
+strange.o: $(UTILS_SRC)/yarandom.h
+strange.o: $(srcdir)/xlockmoreI.h
+strange.o: $(srcdir)/xlockmore.h
+substrate.o: ../config.h
+substrate.o: $(srcdir)/fps.h
+substrate.o: $(srcdir)/recanim.h
+substrate.o: $(srcdir)/screenhackI.h
+substrate.o: $(srcdir)/screenhack.h
+substrate.o: $(UTILS_SRC)/colors.h
+substrate.o: $(UTILS_SRC)/font-retry.h
+substrate.o: $(UTILS_SRC)/grabscreen.h
+substrate.o: $(UTILS_SRC)/hsv.h
+substrate.o: $(UTILS_SRC)/resources.h
+substrate.o: $(UTILS_SRC)/usleep.h
+substrate.o: $(UTILS_SRC)/visual.h
+substrate.o: $(UTILS_SRC)/yarandom.h
+swirl.o: ../config.h
+swirl.o: $(srcdir)/fps.h
+swirl.o: $(srcdir)/recanim.h
+swirl.o: $(srcdir)/screenhackI.h
+swirl.o: $(UTILS_SRC)/colors.h
+swirl.o: $(UTILS_SRC)/erase.h
+swirl.o: $(UTILS_SRC)/font-retry.h
+swirl.o: $(UTILS_SRC)/grabscreen.h
+swirl.o: $(UTILS_SRC)/hsv.h
+swirl.o: $(UTILS_SRC)/resources.h
+swirl.o: $(UTILS_SRC)/usleep.h
+swirl.o: $(UTILS_SRC)/visual.h
+swirl.o: $(UTILS_SRC)/xshm.h
+swirl.o: $(UTILS_SRC)/yarandom.h
+swirl.o: $(srcdir)/xlockmoreI.h
+swirl.o: $(srcdir)/xlockmore.h
+t3d.o: ../config.h
+t3d.o: $(srcdir)/fps.h
+t3d.o: $(srcdir)/recanim.h
+t3d.o: $(srcdir)/screenhackI.h
+t3d.o: $(srcdir)/screenhack.h
+t3d.o: $(UTILS_SRC)/colors.h
+t3d.o: $(UTILS_SRC)/font-retry.h
+t3d.o: $(UTILS_SRC)/grabscreen.h
+t3d.o: $(UTILS_SRC)/hsv.h
+t3d.o: $(UTILS_SRC)/resources.h
+t3d.o: $(UTILS_SRC)/usleep.h
+t3d.o: $(UTILS_SRC)/visual.h
+t3d.o: $(UTILS_SRC)/yarandom.h
+tessellimage.o: ../config.h
+tessellimage.o: $(srcdir)/delaunay.h
+tessellimage.o: $(srcdir)/fps.h
+tessellimage.o: $(srcdir)/recanim.h
+tessellimage.o: $(srcdir)/screenhackI.h
+tessellimage.o: $(srcdir)/screenhack.h
+tessellimage.o: $(UTILS_SRC)/colors.h
+tessellimage.o: $(UTILS_SRC)/font-retry.h
+tessellimage.o: $(UTILS_SRC)/grabscreen.h
+tessellimage.o: $(UTILS_SRC)/hsv.h
+tessellimage.o: $(UTILS_SRC)/resources.h
+tessellimage.o: $(UTILS_SRC)/usleep.h
+tessellimage.o: $(UTILS_SRC)/visual.h
+tessellimage.o: $(UTILS_SRC)/yarandom.h
+testx11.o: ../config.h
+testx11.o: $(srcdir)/fps.h
+testx11.o: $(srcdir)/glx/rotator.h
+testx11.o: $(srcdir)/images/gen/logo-180_png.h
+testx11.o: $(srcdir)/recanim.h
+testx11.o: $(srcdir)/screenhackI.h
+testx11.o: $(srcdir)/screenhack.h
+testx11.o: $(UTILS_SRC)/colorbars.h
+testx11.o: $(UTILS_SRC)/colors.h
+testx11.o: $(UTILS_SRC)/erase.h
+testx11.o: $(UTILS_SRC)/font-retry.h
+testx11.o: $(UTILS_SRC)/grabscreen.h
+testx11.o: $(UTILS_SRC)/hsv.h
+testx11.o: $(UTILS_SRC)/resources.h
+testx11.o: $(UTILS_SRC)/usleep.h
+testx11.o: $(UTILS_SRC)/visual.h
+testx11.o: $(UTILS_SRC)/yarandom.h
+testx11.o: $(srcdir)/ximage-loader.h
+thornbird.o: ../config.h
+thornbird.o: $(srcdir)/fps.h
+thornbird.o: $(srcdir)/recanim.h
+thornbird.o: $(srcdir)/screenhackI.h
+thornbird.o: $(UTILS_SRC)/colors.h
+thornbird.o: $(UTILS_SRC)/erase.h
+thornbird.o: $(UTILS_SRC)/font-retry.h
+thornbird.o: $(UTILS_SRC)/grabscreen.h
+thornbird.o: $(UTILS_SRC)/hsv.h
+thornbird.o: $(UTILS_SRC)/resources.h
+thornbird.o: $(UTILS_SRC)/usleep.h
+thornbird.o: $(UTILS_SRC)/visual.h
+thornbird.o: $(UTILS_SRC)/yarandom.h
+thornbird.o: $(srcdir)/xlockmoreI.h
+thornbird.o: $(srcdir)/xlockmore.h
+triangle.o: ../config.h
+triangle.o: $(srcdir)/fps.h
+triangle.o: $(srcdir)/recanim.h
+triangle.o: $(srcdir)/screenhackI.h
+triangle.o: $(UTILS_SRC)/colors.h
+triangle.o: $(UTILS_SRC)/erase.h
+triangle.o: $(UTILS_SRC)/font-retry.h
+triangle.o: $(UTILS_SRC)/grabscreen.h
+triangle.o: $(UTILS_SRC)/hsv.h
+triangle.o: $(UTILS_SRC)/resources.h
+triangle.o: $(UTILS_SRC)/usleep.h
+triangle.o: $(UTILS_SRC)/visual.h
+triangle.o: $(UTILS_SRC)/yarandom.h
+triangle.o: $(srcdir)/xlockmoreI.h
+triangle.o: $(srcdir)/xlockmore.h
+truchet.o: ../config.h
+truchet.o: $(srcdir)/fps.h
+truchet.o: $(srcdir)/recanim.h
+truchet.o: $(srcdir)/screenhackI.h
+truchet.o: $(srcdir)/screenhack.h
+truchet.o: $(UTILS_SRC)/colors.h
+truchet.o: $(UTILS_SRC)/font-retry.h
+truchet.o: $(UTILS_SRC)/grabscreen.h
+truchet.o: $(UTILS_SRC)/hsv.h
+truchet.o: $(UTILS_SRC)/resources.h
+truchet.o: $(UTILS_SRC)/usleep.h
+truchet.o: $(UTILS_SRC)/visual.h
+truchet.o: $(UTILS_SRC)/yarandom.h
+twang.o: ../config.h
+twang.o: $(srcdir)/fps.h
+twang.o: $(srcdir)/recanim.h
+twang.o: $(srcdir)/screenhackI.h
+twang.o: $(srcdir)/screenhack.h
+twang.o: $(UTILS_SRC)/colors.h
+twang.o: $(UTILS_SRC)/font-retry.h
+twang.o: $(UTILS_SRC)/grabscreen.h
+twang.o: $(UTILS_SRC)/hsv.h
+twang.o: $(UTILS_SRC)/resources.h
+twang.o: $(UTILS_SRC)/usleep.h
+twang.o: $(UTILS_SRC)/visual.h
+twang.o: $(UTILS_SRC)/xshm.h
+twang.o: $(UTILS_SRC)/yarandom.h
+vermiculate.o: ../config.h
+vermiculate.o: $(srcdir)/fps.h
+vermiculate.o: $(srcdir)/recanim.h
+vermiculate.o: $(srcdir)/screenhackI.h
+vermiculate.o: $(srcdir)/screenhack.h
+vermiculate.o: $(UTILS_SRC)/colors.h
+vermiculate.o: $(UTILS_SRC)/font-retry.h
+vermiculate.o: $(UTILS_SRC)/grabscreen.h
+vermiculate.o: $(UTILS_SRC)/hsv.h
+vermiculate.o: $(UTILS_SRC)/resources.h
+vermiculate.o: $(UTILS_SRC)/usleep.h
+vermiculate.o: $(UTILS_SRC)/visual.h
+vermiculate.o: $(UTILS_SRC)/yarandom.h
+vfeedback.o: $(srcdir)/analogtv.h
+vfeedback.o: ../config.h
+vfeedback.o: $(srcdir)/fps.h
+vfeedback.o: $(srcdir)/recanim.h
+vfeedback.o: $(srcdir)/screenhackI.h
+vfeedback.o: $(srcdir)/screenhack.h
+vfeedback.o: $(UTILS_SRC)/aligned_malloc.h
+vfeedback.o: $(UTILS_SRC)/colors.h
+vfeedback.o: $(UTILS_SRC)/font-retry.h
+vfeedback.o: $(UTILS_SRC)/grabscreen.h
+vfeedback.o: $(UTILS_SRC)/hsv.h
+vfeedback.o: $(UTILS_SRC)/resources.h
+vfeedback.o: $(UTILS_SRC)/thread_util.h
+vfeedback.o: $(UTILS_SRC)/usleep.h
+vfeedback.o: $(UTILS_SRC)/visual.h
+vfeedback.o: $(UTILS_SRC)/xshm.h
+vfeedback.o: $(UTILS_SRC)/yarandom.h
+vines.o: ../config.h
+vines.o: $(srcdir)/fps.h
+vines.o: $(srcdir)/recanim.h
+vines.o: $(srcdir)/screenhackI.h
+vines.o: $(UTILS_SRC)/colors.h
+vines.o: $(UTILS_SRC)/erase.h
+vines.o: $(UTILS_SRC)/font-retry.h
+vines.o: $(UTILS_SRC)/grabscreen.h
+vines.o: $(UTILS_SRC)/hsv.h
+vines.o: $(UTILS_SRC)/resources.h
+vines.o: $(UTILS_SRC)/usleep.h
+vines.o: $(UTILS_SRC)/visual.h
+vines.o: $(UTILS_SRC)/yarandom.h
+vines.o: $(srcdir)/xlockmoreI.h
+vines.o: $(srcdir)/xlockmore.h
+wander.o: ../config.h
+wander.o: $(srcdir)/fps.h
+wander.o: $(srcdir)/recanim.h
+wander.o: $(srcdir)/screenhackI.h
+wander.o: $(srcdir)/screenhack.h
+wander.o: $(UTILS_SRC)/colors.h
+wander.o: $(UTILS_SRC)/erase.h
+wander.o: $(UTILS_SRC)/font-retry.h
+wander.o: $(UTILS_SRC)/grabscreen.h
+wander.o: $(UTILS_SRC)/hsv.h
+wander.o: $(UTILS_SRC)/resources.h
+wander.o: $(UTILS_SRC)/usleep.h
+wander.o: $(UTILS_SRC)/visual.h
+wander.o: $(UTILS_SRC)/yarandom.h
+webcollage-cocoa.o: ../config.h
+webcollage-cocoa.o: $(srcdir)/fps.h
+webcollage-cocoa.o: $(srcdir)/recanim.h
+webcollage-cocoa.o: $(srcdir)/screenhackI.h
+webcollage-cocoa.o: $(srcdir)/screenhack.h
+webcollage-cocoa.o: $(UTILS_SRC)/colors.h
+webcollage-cocoa.o: $(UTILS_SRC)/font-retry.h
+webcollage-cocoa.o: $(UTILS_SRC)/grabscreen.h
+webcollage-cocoa.o: $(UTILS_SRC)/hsv.h
+webcollage-cocoa.o: $(UTILS_SRC)/resources.h
+webcollage-cocoa.o: $(UTILS_SRC)/usleep.h
+webcollage-cocoa.o: $(UTILS_SRC)/visual.h
+webcollage-cocoa.o: $(UTILS_SRC)/yarandom.h
+webcollage-helper.o: ../config.h
+whirlwindwarp.o: ../config.h
+whirlwindwarp.o: $(srcdir)/fps.h
+whirlwindwarp.o: $(srcdir)/recanim.h
+whirlwindwarp.o: $(srcdir)/screenhackI.h
+whirlwindwarp.o: $(srcdir)/screenhack.h
+whirlwindwarp.o: $(UTILS_SRC)/colors.h
+whirlwindwarp.o: $(UTILS_SRC)/erase.h
+whirlwindwarp.o: $(UTILS_SRC)/font-retry.h
+whirlwindwarp.o: $(UTILS_SRC)/grabscreen.h
+whirlwindwarp.o: $(UTILS_SRC)/hsv.h
+whirlwindwarp.o: $(UTILS_SRC)/resources.h
+whirlwindwarp.o: $(UTILS_SRC)/usleep.h
+whirlwindwarp.o: $(UTILS_SRC)/visual.h
+whirlwindwarp.o: $(UTILS_SRC)/yarandom.h
+whirlygig.o: ../config.h
+whirlygig.o: $(srcdir)/fps.h
+whirlygig.o: $(srcdir)/recanim.h
+whirlygig.o: $(srcdir)/screenhackI.h
+whirlygig.o: $(srcdir)/screenhack.h
+whirlygig.o: $(UTILS_SRC)/colors.h
+whirlygig.o: $(UTILS_SRC)/font-retry.h
+whirlygig.o: $(UTILS_SRC)/grabscreen.h
+whirlygig.o: $(UTILS_SRC)/hsv.h
+whirlygig.o: $(UTILS_SRC)/resources.h
+whirlygig.o: $(UTILS_SRC)/usleep.h
+whirlygig.o: $(UTILS_SRC)/visual.h
+whirlygig.o: $(UTILS_SRC)/xdbe.h
+whirlygig.o: $(UTILS_SRC)/yarandom.h
+wormhole.o: ../config.h
+wormhole.o: $(srcdir)/fps.h
+wormhole.o: $(srcdir)/recanim.h
+wormhole.o: $(srcdir)/screenhackI.h
+wormhole.o: $(srcdir)/screenhack.h
+wormhole.o: $(UTILS_SRC)/colors.h
+wormhole.o: $(UTILS_SRC)/font-retry.h
+wormhole.o: $(UTILS_SRC)/grabscreen.h
+wormhole.o: $(UTILS_SRC)/hsv.h
+wormhole.o: $(UTILS_SRC)/resources.h
+wormhole.o: $(UTILS_SRC)/usleep.h
+wormhole.o: $(UTILS_SRC)/visual.h
+wormhole.o: $(UTILS_SRC)/yarandom.h
+worm.o: ../config.h
+worm.o: $(srcdir)/fps.h
+worm.o: $(srcdir)/recanim.h
+worm.o: $(srcdir)/screenhackI.h
+worm.o: $(UTILS_SRC)/colors.h
+worm.o: $(UTILS_SRC)/erase.h
+worm.o: $(UTILS_SRC)/font-retry.h
+worm.o: $(UTILS_SRC)/grabscreen.h
+worm.o: $(UTILS_SRC)/hsv.h
+worm.o: $(UTILS_SRC)/resources.h
+worm.o: $(UTILS_SRC)/usleep.h
+worm.o: $(UTILS_SRC)/visual.h
+worm.o: $(UTILS_SRC)/yarandom.h
+worm.o: $(srcdir)/xlockmoreI.h
+worm.o: $(srcdir)/xlockmore.h
+xanalogtv.o: $(srcdir)/analogtv.h
+xanalogtv.o: ../config.h
+xanalogtv.o: $(srcdir)/fps.h
+xanalogtv.o: $(srcdir)/images/gen/logo-180_png.h
+xanalogtv.o: $(srcdir)/images/gen/testcard_bbcf_png.h
+xanalogtv.o: $(srcdir)/images/gen/testcard_pm5544_png.h
+xanalogtv.o: $(srcdir)/images/gen/testcard_rca_png.h
+xanalogtv.o: $(srcdir)/recanim.h
+xanalogtv.o: $(srcdir)/screenhackI.h
+xanalogtv.o: $(srcdir)/screenhack.h
+xanalogtv.o: $(UTILS_SRC)/aligned_malloc.h
+xanalogtv.o: $(UTILS_SRC)/colors.h
+xanalogtv.o: $(UTILS_SRC)/font-retry.h
+xanalogtv.o: $(UTILS_SRC)/grabscreen.h
+xanalogtv.o: $(UTILS_SRC)/hsv.h
+xanalogtv.o: $(UTILS_SRC)/resources.h
+xanalogtv.o: $(UTILS_SRC)/thread_util.h
+xanalogtv.o: $(UTILS_SRC)/usleep.h
+xanalogtv.o: $(UTILS_SRC)/visual.h
+xanalogtv.o: $(UTILS_SRC)/xshm.h
+xanalogtv.o: $(UTILS_SRC)/yarandom.h
+xanalogtv.o: $(srcdir)/ximage-loader.h
+xflame.o: ../config.h
+xflame.o: $(srcdir)/fps.h
+xflame.o: $(srcdir)/images/gen/bob_png.h
+xflame.o: $(srcdir)/recanim.h
+xflame.o: $(srcdir)/screenhackI.h
+xflame.o: $(srcdir)/screenhack.h
+xflame.o: $(UTILS_SRC)/colors.h
+xflame.o: $(UTILS_SRC)/font-retry.h
+xflame.o: $(UTILS_SRC)/grabscreen.h
+xflame.o: $(UTILS_SRC)/hsv.h
+xflame.o: $(UTILS_SRC)/resources.h
+xflame.o: $(UTILS_SRC)/usleep.h
+xflame.o: $(UTILS_SRC)/visual.h
+xflame.o: $(UTILS_SRC)/xshm.h
+xflame.o: $(UTILS_SRC)/yarandom.h
+xflame.o: $(srcdir)/ximage-loader.h
+ximage-loader.o: ../config.h
+ximage-loader.o: $(srcdir)/ximage-loader.h
+xjack.o: ../config.h
+xjack.o: $(srcdir)/fps.h
+xjack.o: $(srcdir)/recanim.h
+xjack.o: $(srcdir)/screenhackI.h
+xjack.o: $(srcdir)/screenhack.h
+xjack.o: $(UTILS_SRC)/colors.h
+xjack.o: $(UTILS_SRC)/font-retry.h
+xjack.o: $(UTILS_SRC)/grabscreen.h
+xjack.o: $(UTILS_SRC)/hsv.h
+xjack.o: $(UTILS_SRC)/resources.h
+xjack.o: $(UTILS_SRC)/usleep.h
+xjack.o: $(UTILS_SRC)/visual.h
+xjack.o: $(UTILS_SRC)/yarandom.h
+xlockmore.o: ../config.h
+xlockmore.o: $(srcdir)/fps.h
+xlockmore.o: $(srcdir)/recanim.h
+xlockmore.o: $(srcdir)/screenhackI.h
+xlockmore.o: $(srcdir)/screenhack.h
+xlockmore.o: $(UTILS_SRC)/colors.h
+xlockmore.o: $(UTILS_SRC)/erase.h
+xlockmore.o: $(UTILS_SRC)/font-retry.h
+xlockmore.o: $(UTILS_SRC)/grabscreen.h
+xlockmore.o: $(UTILS_SRC)/hsv.h
+xlockmore.o: $(UTILS_SRC)/resources.h
+xlockmore.o: $(UTILS_SRC)/usleep.h
+xlockmore.o: $(UTILS_SRC)/visual.h
+xlockmore.o: $(UTILS_SRC)/yarandom.h
+xlockmore.o: $(srcdir)/xlockmoreI.h
+xlyap.o: ../config.h
+xlyap.o: $(srcdir)/fps.h
+xlyap.o: $(srcdir)/recanim.h
+xlyap.o: $(srcdir)/screenhackI.h
+xlyap.o: $(srcdir)/screenhack.h
+xlyap.o: $(UTILS_SRC)/colors.h
+xlyap.o: $(UTILS_SRC)/font-retry.h
+xlyap.o: $(UTILS_SRC)/grabscreen.h
+xlyap.o: $(UTILS_SRC)/hsv.h
+xlyap.o: $(UTILS_SRC)/resources.h
+xlyap.o: $(UTILS_SRC)/usleep.h
+xlyap.o: $(UTILS_SRC)/visual.h
+xlyap.o: $(UTILS_SRC)/yarandom.h
+xmatrix.o: ../config.h
+xmatrix.o: $(srcdir)/fps.h
+xmatrix.o: $(srcdir)/images/gen/matrix1b_png.h
+xmatrix.o: $(srcdir)/images/gen/matrix1_png.h
+xmatrix.o: $(srcdir)/images/gen/matrix2b_png.h
+xmatrix.o: $(srcdir)/images/gen/matrix2_png.h
+xmatrix.o: $(srcdir)/recanim.h
+xmatrix.o: $(srcdir)/screenhackI.h
+xmatrix.o: $(srcdir)/screenhack.h
+xmatrix.o: $(UTILS_SRC)/colors.h
+xmatrix.o: $(UTILS_SRC)/font-retry.h
+xmatrix.o: $(UTILS_SRC)/grabscreen.h
+xmatrix.o: $(UTILS_SRC)/hsv.h
+xmatrix.o: $(UTILS_SRC)/resources.h
+xmatrix.o: $(UTILS_SRC)/textclient.h
+xmatrix.o: $(UTILS_SRC)/usleep.h
+xmatrix.o: $(UTILS_SRC)/visual.h
+xmatrix.o: $(UTILS_SRC)/yarandom.h
+xmatrix.o: $(srcdir)/ximage-loader.h
+xrayswarm.o: ../config.h
+xrayswarm.o: $(srcdir)/fps.h
+xrayswarm.o: $(srcdir)/recanim.h
+xrayswarm.o: $(srcdir)/screenhackI.h
+xrayswarm.o: $(srcdir)/screenhack.h
+xrayswarm.o: $(UTILS_SRC)/colors.h
+xrayswarm.o: $(UTILS_SRC)/font-retry.h
+xrayswarm.o: $(UTILS_SRC)/grabscreen.h
+xrayswarm.o: $(UTILS_SRC)/hsv.h
+xrayswarm.o: $(UTILS_SRC)/resources.h
+xrayswarm.o: $(UTILS_SRC)/usleep.h
+xrayswarm.o: $(UTILS_SRC)/visual.h
+xrayswarm.o: $(UTILS_SRC)/yarandom.h
+xscreensaver-sgigl.o: $(UTILS_SRC)/vroot.h
+xspirograph.o: ../config.h
+xspirograph.o: $(srcdir)/fps.h
+xspirograph.o: $(srcdir)/recanim.h
+xspirograph.o: $(srcdir)/screenhackI.h
+xspirograph.o: $(srcdir)/screenhack.h
+xspirograph.o: $(UTILS_SRC)/colors.h
+xspirograph.o: $(UTILS_SRC)/erase.h
+xspirograph.o: $(UTILS_SRC)/font-retry.h
+xspirograph.o: $(UTILS_SRC)/grabscreen.h
+xspirograph.o: $(UTILS_SRC)/hsv.h
+xspirograph.o: $(UTILS_SRC)/resources.h
+xspirograph.o: $(UTILS_SRC)/usleep.h
+xspirograph.o: $(UTILS_SRC)/visual.h
+xspirograph.o: $(UTILS_SRC)/yarandom.h
+xsublim.o: ../config.h
+xsublim.o: $(UTILS_SRC)/font-retry.h
+xsublim.o: $(UTILS_SRC)/resources.h
+xsublim.o: $(UTILS_SRC)/usleep.h
+xsublim.o: $(UTILS_SRC)/vroot.h
+xsublim.o: $(UTILS_SRC)/yarandom.h
+zoom.o: ../config.h
+zoom.o: $(srcdir)/fps.h
+zoom.o: $(srcdir)/recanim.h
+zoom.o: $(srcdir)/screenhackI.h
+zoom.o: $(srcdir)/screenhack.h
+zoom.o: $(UTILS_SRC)/colors.h
+zoom.o: $(UTILS_SRC)/font-retry.h
+zoom.o: $(UTILS_SRC)/grabscreen.h
+zoom.o: $(UTILS_SRC)/hsv.h
+zoom.o: $(UTILS_SRC)/resources.h
+zoom.o: $(UTILS_SRC)/usleep.h
+zoom.o: $(UTILS_SRC)/visual.h
+zoom.o: $(UTILS_SRC)/yarandom.h
+
diff --git a/hacks/README b/hacks/README
new file mode 100644
index 0000000..34e687e
--- /dev/null
+++ b/hacks/README
@@ -0,0 +1,6 @@
+
+This directory contains various graphics hacks. These are independent from
+the xscreensaver program (in the ../driver/ directory) but some of them use
+the utility functions found in the ../utils/ directory.
+
+If you have compilation problems, check the parameters in ../config.h.
diff --git a/hacks/abstractile.c b/hacks/abstractile.c
new file mode 100644
index 0000000..b4394f1
--- /dev/null
+++ b/hacks/abstractile.c
@@ -0,0 +1,1605 @@
+/*
+ * Copyright (c) 2004-2009 Steve Sundstrom
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+#include <stdio.h>
+#include <math.h>
+#include <sys/time.h>
+/*#include <sys/utsname.h>*/
+
+#define MODE_CREATE 0 /* init, create, then finish sleep */
+#define MODE_ERASE 1 /* erase, then reset colors */
+#define MODE_DRAW 2
+
+#define DIR_NONE 0
+#define DIR_UP 1
+#define DIR_DOWN 2
+#define DIR_LEFT 3
+#define DIR_RIGHT 4
+
+#define LINE_FORCE 1
+#define LINE_NEW 2
+#define LINE_BRIN 3
+#define LINE_BROUT 4
+
+#define PT_UL 0
+#define PT_MP 1
+#define PT_LR 2
+#define PT_NL 3
+
+#define D3D_NONE 0
+#define D3D_BLOCK 1
+#define D3D_NEON 2
+#define D3D_TILED 3
+
+#define TILE_RANDOM 0
+#define TILE_FLAT 1
+#define TILE_THIN 2
+#define TILE_OUTLINE 3
+#define TILE_BLOCK 4
+#define TILE_NEON 5
+#define TILE_TILED 6
+
+#define BASECOLORS 30
+#define SHADES 12
+#define MAXCOLORS 40
+#define LAYERS 4
+#define PATTERNS 40
+#define SHAPES 18
+#define DRAWORDERS 40
+#define COLORMAPS 20
+#define WAVES 6
+#define STRETCHES 8
+
+struct lineStruct {
+ unsigned int x, y, len, obj, color, ndol;
+ int deo;
+ Bool hv;
+};
+
+struct gridStruct {
+ unsigned int line, hl, hr, vu, vd, dhl, dhr, dvu, dvd;
+};
+
+/* basically the same as global variables, but used to keep them in a bucket
+ and pass them around easier like the original C++ implementation */
+struct state {
+ /* window values */
+ Display *display;
+ Window window;
+ XWindowAttributes xgwa;
+ GC fgc, bgc;
+ XColor colors[255];
+
+ /* memory values */
+ struct lineStruct *dline, *eline;
+ struct gridStruct *grid;
+ unsigned int *zlist, *fdol;
+ Bool *odi;
+ /* draw, erase, fill, init, line, object, z indexes */
+ unsigned int di, ei, fi, ii, bi, li, eli, oi, zi;
+ /* size variables */
+ int gridx, gridy; /* grid size */
+ unsigned int gridn;
+ int lwid, bwid, swid;/* line width, background width, shadow width */
+ int narray, max_wxh;
+ int elwid, elpu, egridx, egridy; /* for now */
+ /* fill variables */
+ int bnratio; /* ratio of branch lines to new lines */
+ int maxlen; /* maximum length of line */
+ int forcemax; /* make line be max possible length */
+ int olen; /* open length set by findopen */
+ int bln; /* blocking line number set by findopen, -1=edge */
+ /* color variables */
+ int ncolors; /* number of colors for screen */
+ int shades;
+ int rco[MAXCOLORS]; /* random ordering of colors for deo */
+ int cmap;
+ int layers;
+ Bool newcols; /* can we create new colormaps with each screen */
+ /* draw variables */
+ int dmap, emap; /* pattern by which line draw order is determined */
+ int dvar, evar; /* random number added to .deo to vary */
+ int ddir, edir; /* draw/erase in forward direction or reverse */
+ int lpu; /* lines drawn per update used to adjust speed */
+ int d3d;
+ int round;
+ int outline;
+ /* layered draw variables */
+ int pattern[LAYERS], shape[LAYERS], mix[LAYERS];
+ int csw[LAYERS], wsx[LAYERS], wsy[LAYERS], sec[LAYERS];
+ int cs1[LAYERS], cs2[LAYERS], cs3[LAYERS]; int cs4[LAYERS];
+ int wave[LAYERS], waveh[LAYERS], wavel[LAYERS];
+ int rx1[LAYERS], rx2[LAYERS], rx3[LAYERS];
+ int ry1[LAYERS], ry2[LAYERS], ry3[LAYERS];
+ /* misc variables */
+ int mode, sleep, speed, tile, dialog;
+ Bool grid_full, resized;
+ struct timeval time;
+};
+
+static int
+_min(int a, int b)
+{
+ if (a<=b)
+ return(a);
+ return(b);
+}
+
+static int
+_max(int a, int b)
+{
+ if (a>=b)
+ return(a);
+ return(b);
+}
+
+static int
+_dist(struct state *st, int x1, int x2, int y1, int y2, int s)
+{
+ double xd=x1-x2;
+ double yd=y1-y2;
+ switch(s) {
+ case 0:
+ return((int)sqrt(xd*xd+yd*yd));
+ case 1:
+ return((int)sqrt(xd*xd*st->cs1[0]*2+yd*yd));
+ case 2:
+ return((int)sqrt(xd*xd+yd*yd*st->cs2[0]*2));
+ default:
+ return((int)sqrt(xd*xd*st->cs1[0]/st->cs2[0]+yd*yd*st->cs3[0]/st->cs4[0]));
+ }
+}
+
+static int
+_wave(struct state *st, int x, int h, int l, int wave)
+{
+ l+=1;
+ switch(wave) {
+ case 0: /* cos wave*/
+ return((int)(cos((double)x*M_PI/l)*h));
+ case 1: /* double wave*/
+ case 2: /* double wave*/
+ return((int)(cos((double)x*M_PI/l)*h)+(int)(sin((double)x*M_PI/l/st->cs1[1])*h));
+ case 3: /* zig zag */
+ return(abs((x%(l*2)-l))*h/l);
+ case 4: /* giant zig zag */
+ return(abs((x%(l*4)-l*2))*h*3/l);
+ case 5: /* sawtooth */
+ return((x%(l))*h/l);
+ default: /* no wave */
+ return(0);
+ }
+}
+
+static int
+_triangle(struct state *st, int x, int y, int rx, int ry, int t)
+{
+ switch(t) {
+ case 1:
+ return(_min(_min(x+y+rx-(st->gridx/2),st->gridx-x+y),(st->gridy-y+(ry/2))*3/2));
+ case 2:
+ return(_min(_min(x-rx,y-ry),(rx+ry-x-y)*2/3));
+ case 3:
+ return(_min(_min(st->gridx-x-rx,y-ry),(rx+ry-st->gridx+x-y)*2/3));
+ case 4:
+ return(_min(_min(x-rx,st->gridy-y-ry),(rx+ry-x-st->gridy+y)*2/3));
+ }
+ return(_min(_min(st->gridx-x-rx,st->gridy-y-ry),(rx+ry-st->gridx+x-st->gridy+y)*2/3));
+}
+
+static void
+_init_zlist(struct state *st)
+{
+ unsigned int tmp, y, z;
+
+ st->gridx=st->xgwa.width/st->lwid;
+ st->gridy=st->xgwa.height/st->lwid;
+ if ((st->gridx <= 0) || (st->gridy <= 0)) abort();
+ st->gridn=st->gridx*st->gridy;
+ /* clear grid */
+ for (z=0; z<st->gridn; z++) {
+ st->grid[z].line=st->grid[z].hl=st->grid[z].hr=st->grid[z].vu=st->grid[z].vd=st->grid[z].dhl=st->grid[z].dhr=st->grid[z].dvu=st->grid[z].dvd=0;
+ st->zlist[z]=z;
+ }
+ /* rather than pull x,y points randomly and wait to hit final empy cells a
+ list of all points is created and mixed so empty cells do get hit last */
+ for (z=0; z<st->gridn; z++) {
+ y=random()%st->gridn;
+ tmp=st->zlist[y];
+ st->zlist[y]=st->zlist[z];
+ st->zlist[z]=tmp;
+ }
+}
+
+static void
+make_color_ramp_rgb (Screen *screen, Visual *visual, Colormap cmap,
+ int r1, int g1, int b1, int r2, int g2, int b2,
+ XColor *colors, int *ncolorsP, Bool closed_p)
+{
+ int h1, h2;
+ double s1, s2, v1, v2;
+ rgb_to_hsv(r1, g1, b1, &h1, &s1, &v1);
+ rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
+ make_color_ramp(screen, visual, cmap, h1, s1, v1, h2, s2, v2,
+ colors, ncolorsP, False, True, 0);
+}
+
+
+static void
+_init_colors(struct state *st)
+{
+ int col[BASECOLORS];
+ int c1, c2, c3, h1, h2, h3;
+ int r1, g1, b1, r2, g2, b2, r3, g3, b3;
+ double s1, s2, s3, v1, v2, v3;
+ XColor tmp_col1[16], tmp_col2[16], tmp_col3[16];
+
+ unsigned short basecol[BASECOLORS][3]={
+ /* 0 dgray */ {0x3333,0x3333,0x3333},
+ /* 1 dbrown */ {0x6666,0x3333,0x0000},
+ /* 2 dred */ {0x9999,0x0000,0x0000},
+ /* 3 orange */ {0xFFFF,0x6666,0x0000},
+ /* 4 gold */ {0xFFFF,0xCCCC,0x0000},
+ /* 5 olive */ {0x6666,0x6666,0x0000},
+ /* 6 ivy */ {0x0000,0x6666,0x0000},
+ /* 7 dgreen */ {0x0000,0x9999,0x0000},
+ /* 8 bluegray */ {0x3333,0x6666,0x6666},
+ /* 9 dblue */ {0x0000,0x0000,0x9999},
+ /* 10 blue */ {0x3333,0x3333,0xFFFF},
+ /* 11 dpurple */ {0x6666,0x0000,0xCCCC},
+ /* 12 purple */ {0x6666,0x3333,0xFFFF},
+ /* 13 violet */ {0x9999,0x3333,0x9999},
+ /* 14 magenta */ {0xCCCC,0x3333,0xCCCC},
+ /* lights */
+ /* 15 gray */ {0x3333,0x3333,0x3333},
+ /* 16 brown */ {0x9999,0x6666,0x3333},
+ /* 17 tan */ {0xCCCC,0x9999,0x3333},
+ /* 18 red */ {0xFFFF,0x0000,0x0000},
+ /* 19 lorange */ {0xFFFF,0x9999,0x0000},
+ /* 20 yellow */ {0xFFFF,0xFFFF,0x0000},
+ /* 21 lolive */ {0x9999,0x9999,0x0000},
+ /* 22 green */ {0x3333,0xCCCC,0x0000},
+ /* 23 lgreen */ {0x3333,0xFFFF,0x3333},
+ /* 24 cyan */ {0x0000,0xCCCC,0xCCCC},
+ /* 25 sky */ {0x3333,0xFFFF,0xFFFF},
+ /* 26 marine */ {0x3333,0x6666,0xFFFF},
+ /* 27 lblue */ {0x3333,0xCCCC,0xFFFF},
+ /* 28 lpurple */ {0x9999,0x9999,0xFFFF},
+ /* 29 pink */ {0xFFFF,0x9999,0xFFFF}};
+
+ if (st->d3d) {
+ st->shades = (st->d3d==D3D_TILED) ? 5 : st->lwid/2+1;
+ st->ncolors=4+random()%4;
+ if (st->cmap>0) { /* tint the basecolors a bit */
+ for (c1=0; c1<BASECOLORS; c1++)
+ for (c2=0; c2<2; c2++)
+ if (!basecol[c1][c2]) {
+ basecol[c1][c2]+=random()%16000;
+ } else if (basecol[c1][c2]==0xFFFF) {
+ basecol[c1][c2]-=random()%16000;
+ } else {
+ basecol[c1][c2]-=8000;
+ basecol[c1][c2]+=random()%16000;
+ }
+ }
+ switch(st->cmap%4) {
+ case 0: /* all */
+ for (c1=0; c1<st->ncolors; c1++)
+ col[c1]=random()%BASECOLORS;
+ break;
+ case 1: /* darks */
+ for (c1=0; c1<st->ncolors; c1++)
+ col[c1]=random()%15;
+ break;
+ case 2: /* semi consecutive darks */
+ col[0]=random()%15;
+ for (c1=1; c1<st->ncolors; c1++)
+ col[c1]=(col[c1-1]+1+random()%2)%15;
+ break;
+ case 3: /* consecutive darks */
+ col[0]=random()%(15-st->ncolors);
+ for (c1=1; c1<st->ncolors; c1++)
+ col[c1]=col[c1-1]+1;
+ break;
+ }
+ for (c1=0; c1<st->ncolors; c1++) {
+ /* adjust colors already set */
+ for (h1=c1*st->shades-1; h1>=0; h1--)
+ st->colors[h1+st->shades]=st->colors[h1];
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ basecol[col[c1]][0], basecol[col[c1]][1], basecol[col[c1]][2],
+ 0xFFFF, 0xFFFF, 0xFFFF, st->colors, &st->shades,
+ False);
+ }
+ return;
+ }
+ /* not 3d */
+ st->shades=1;
+ if (st->cmap%2) { /* basecolors */
+ if (random()%3) {
+ c1=random()%15;
+ c2=(c1+3+(random()%5))%15;
+ c3=(c2+3+(random()%5))%15;
+ } else {
+ c1=random()%BASECOLORS;
+ c2=(c1+5+(random()%10))%BASECOLORS;
+ c3=(c2+5+(random()%10))%BASECOLORS;
+ }
+ r1=basecol[c1][0];
+ g1=basecol[c1][1];
+ b1=basecol[c1][2];
+ r2=basecol[c2][0];
+ g2=basecol[c2][1];
+ b2=basecol[c2][2];
+ r3=basecol[c3][0];
+ g3=basecol[c3][1];
+ b3=basecol[c3][2];
+ } else { /* random rgb's */
+ r1=random()%65535;
+ g1=random()%65535;
+ b1=random()%65535;
+ r2=(r1+16384+random()%32768)%65535;
+ g2=(g1+16384+random()%32768)%65535;
+ b2=(b1+16384+random()%32768)%65535;
+ r3=(r2+16384+random()%32768)%65535;
+ g3=(g2+16384+random()%32768)%65535;
+ b3=(b2+16384+random()%32768)%65535;
+ }
+ switch(st->cmap) {
+ case 0: /* make_color_ramp color->color */
+ case 1:
+ case 2: /* make_color_ramp color->white */
+ case 3:
+ st->ncolors=5+random()%5;
+ if (st->cmap>1)
+ r2=g2=b2=0xFFFF;
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r1, g1, b1, r2, g2, b2,
+ st->colors, &st->ncolors, random()%2);
+ break;
+ case 4: /* 3 color make_color_loop */
+ case 5:
+ case 6:
+ case 7:
+ st->ncolors=8+random()%12;
+ rgb_to_hsv(r1, g1, b1, &h1, &s1, &v1);
+ rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
+ rgb_to_hsv(r3, g3, b3, &h3, &s3, &v3);
+
+ make_color_loop(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ h1, s1, v1, h2, s2, v2, h3, s3, v3,
+ st->colors, &st->ncolors, True, False);
+ break;
+ case 8: /* random smooth */
+ case 9:
+ st->ncolors=(random()%4)*6+12;
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ True, False, True);
+ break;
+ case 10: /* rainbow */
+ st->ncolors=(random()%4)*6+12;
+ make_uniform_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ True, False, True);
+ break;
+ case 11: /* dark to light blend */
+ case 12:
+ case 13:
+ case 14:
+ st->ncolors=7;
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r1, g1, b1, 0xFFFF, 0xFFFF, 0xFFFF,
+ tmp_col1, &st->ncolors, False);
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r2, g2, b2, 0xFFFF, 0xFFFF, 0xFFFF,
+ tmp_col2, &st->ncolors, False);
+ if (st->cmap<13) {
+ for(c1=0; c1<=4; c1++) {
+ st->colors[c1*2]=tmp_col1[c1];
+ st->colors[c1*2+1]=tmp_col2[c1];
+ }
+ st->ncolors=10;
+ } else {
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r3, g3, b3, 0xFFFF, 0xFFFF, 0xFFFF,
+ tmp_col3, &st->ncolors, False);
+ for(c1=0; c1<=4; c1++) {
+ st->colors[c1*3]=tmp_col1[c1];
+ st->colors[c1*3+1]=tmp_col2[c1];
+ st->colors[c1*3+2]=tmp_col3[c1];
+ }
+ st->ncolors=15;
+ }
+ break;
+ default: /* random */
+ st->ncolors=(random()%4)*6+12;
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ False, True, False, True);
+ break;
+ }
+
+ /* set random color order for drawing and erasing */
+ for (c1=0; c1<MAXCOLORS; c1++)
+ st->rco[c1]=c1;
+ for (c1=0; c1<MAXCOLORS; c1++) {
+ c3=random()%MAXCOLORS;
+ c2=st->rco[c1];
+ st->rco[c1]=st->rco[c3];
+ st->rco[c3]=c2;
+ }
+}
+
+static int _comparedeo(const void *i, const void *j)
+{
+ struct lineStruct *h1, *h2;
+
+ h1=(struct lineStruct *)i;
+ h2=(struct lineStruct *)j;
+ if (h1->deo > h2->deo)
+ return(1);
+ if (h1->deo < h2->deo)
+ return(-1);
+ return(0);
+}
+
+static int
+_hv(struct state *st, int x, int y, int d1, int d2, int pn, Bool de)
+{
+ int v1, v2, r;
+
+ switch (d1) {
+ case 0:
+ v1 = (de) ? st->egridx-x : st->gridx-x;
+ break;
+ case 1:
+ v1 = y;
+ break;
+ case 2:
+ v1 = x;
+ break;
+ default:
+ v1 = (de) ? st->egridy-y : st->gridy-y;
+ break;
+ }
+ switch (d2) {
+ case 0:
+ v2 = (de) ? st->egridx-x : st->gridx-x;
+ break;
+ case 1:
+ v2 = y;
+ break;
+ case 2:
+ v2 = x;
+ break;
+ default:
+ v2 = (de) ? st->egridy-y : st->gridy-y;
+ break;
+ }
+ r = (de) ? (st->dline[st->li].hv) ? (v1+10000)*pn : (v2+10000)*-pn :
+ (st->eline[st->li].hv) ? (v1+10000)*pn : (v2+10000)*-pn;
+ return(r);
+}
+
+static int
+_getdeo(struct state *st, int x, int y, int map, int de)
+{
+ int cr;
+ switch(map) {
+ case 0: /* horizontal one side */
+ return(x);
+ case 1: /* vertical one side */
+ return(y);
+ case 2: /* horizontal two side */
+ return(_min(x,st->gridx-x)+1);
+ case 3: /* vertical two side */
+ return(_min(y,st->gridy-y)+1);
+ case 4: /* square */
+ return(_max(abs(x-st->rx3[de]),abs(y-st->ry3[de]))+1);
+ case 5: /* two squares */
+ return(_min(_max(abs(x-(st->rx3[de]/2)),abs(y-st->ry3[de])),_max(abs(x-(st->gridx-(st->rx2[de]/2))),abs(y-st->ry2[de])))+1);
+ case 6: /* horizontal rectangle */
+ return(_max(abs(x-st->rx3[de]),abs(y-(st->ry3[de]))*st->cs1[de])+1);
+ case 7: /* vertical rectangle */
+ return(_max(abs(x-st->rx3[de])*st->cs1[de],abs(y-(st->ry3[de])))+1);
+ case 8: /* + cross */
+ return(_min(abs(x-st->rx3[de]),abs(y-(st->ry3[de])))+1);
+ case 9: /* diagonal */
+ return((x*3/4+y)+1);
+ case 10: /* opposite diagonal */
+ return((x*3/4+st->gridy-y)+1);
+ case 11: /* diamond */
+ return((abs(x-st->rx3[de])+abs(y-st->ry3[de]))/2+1);
+ case 12: /* two diamonds */
+ return(_min(abs(x-(st->rx3[de]/2))+abs(y-st->ry3[de]),abs(x-(st->gridx-(st->rx2[de]/2)))+abs(y-st->ry2[de]))/2+1);
+ case 13: /* circle */
+ return(_dist(st,x,st->rx3[de],y,st->ry3[de],0)+1);
+ case 14: /* horizontal ellipse */
+ return(_dist(st,x,st->rx3[de],y,st->ry3[de],1)+1);
+ case 15: /* vertical ellipse */
+ return(_dist(st,x,st->rx3[de],y,st->ry3[de],2)+1);
+ case 16: /* two circles */
+ return(_min(_dist(st,x,st->rx3[de]/2,y,st->ry3[de],0),_dist(st,x,st->gridx-(st->rx2[de]/2),y,st->ry2[de],0))+1);
+ case 17: /* horizontal straight wave */
+ return(x+_wave(st,st->gridy+y,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
+ case 18: /* vertical straight wave */
+ return(y+_wave(st,st->gridx+x,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
+ case 19: /* horizontal wavey wave */
+ return(x+_wave(st,st->gridy+y+((x/5)*st->edir),st->csw[de]*st->cs1[de],st->csw[de]*st->cs2[de],st->wave[de])+1);
+ case 20: /* vertical wavey wave */
+ return(y+_wave(st,st->gridx+x+((y/5)*st->edir),st->csw[de]*st->cs1[de],st->csw[de]*st->cs2[de],st->wave[de])+1);
+/* no d3d for 21,22 */
+ case 21: /* simultaneous directional */
+ return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,1,de));
+ case 22: /* reverse directional */
+ return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,-1,de));
+ case 23: /* length */
+ if (de)
+ return(st->dline[st->li].len*1000+random()%5000);
+ else
+ return(st->eline[st->li].len*1000+random()%5000);
+ case 24: /* object */
+ case 25:
+ case 26:
+ case 27:
+ if (de)
+ return(st->dline[st->li].obj*100);
+ else
+ return(st->eline[st->li].obj*100);
+ default: /* color */
+ cr = (de) ? st->dline[st->li].color : st->eline[st->li].color;
+ if (map<34) cr=st->rco[cr];
+ if ((map%6<4) || (de)) { /* by color */
+ cr*=1000;
+ cr+=random()%1000;
+ } else if (map%6==4) { /* by color horizontaly */
+ cr*=st->gridx;
+ cr+=(x+random()%(st->gridx/2));
+ } else { /* by color vertically */
+ cr*=st->gridy;
+ cr+=(y+random()%(st->gridy/2));
+ }
+ return(cr);
+ }
+ return(1);
+}
+
+static void
+_init_screen(struct state *st)
+{
+ int nstr, x;
+ struct lineStruct *tmp;
+
+ /* malloc memory in case of resize */
+ if (st->resized) {
+ st->max_wxh=st->xgwa.width*st->xgwa.height;
+ if (st->dline!=NULL)
+ free(st->dline);
+ if (st->eline!=NULL)
+ free(st->eline);
+ if (st->grid!=NULL)
+ free(st->grid);
+ if (st->zlist!=NULL)
+ free(st->zlist);
+ if (st->fdol!=NULL)
+ free(st->fdol);
+ if (st->odi!=NULL)
+ free(st->odi);
+ st->narray = (st->xgwa.width+1)*(st->xgwa.height+1)/4+1;
+ st->dline = calloc(st->narray, sizeof(struct lineStruct));
+ st->eline = calloc(st->narray, sizeof(struct lineStruct));
+ st->grid = calloc(st->narray, sizeof(struct gridStruct));
+ st->zlist = calloc(st->narray, sizeof(unsigned int));
+ st->fdol = calloc(st->narray, sizeof(unsigned int));
+ st->odi = calloc(st->narray, sizeof(Bool));
+ if ((st->dline == NULL) || (st->eline == NULL) ||
+ (st->grid == NULL) || (st->zlist == NULL) ||
+ (st->fdol == NULL) || (st->odi == NULL)) {
+ fprintf(stderr, "not enough memory\n");
+ exit(1);
+ }
+ st->dialog = (st->xgwa.width<500) ? 1 : 0;
+ st->resized=False;
+ }
+ if (st->ii) {
+ /* swap st->dline and st->eline pointers to resort and erase */
+ tmp=st->eline;
+ st->eline=st->dline;
+ st->dline=tmp;
+ st->eli=st->li;
+ st->elwid=st->lwid;
+ st->elpu=st->lpu;
+ st->egridx=st->gridx;
+ st->egridy=st->gridy;
+
+ /* create new erase order */
+ for (st->li=1; st->li<=st->eli; st->li++)
+ st->eline[st->li].deo=(_getdeo(st,st->eline[st->li].x,st->eline[st->li].y,st->emap,0) + (random()%st->evar) + (random()%st->evar))*st->edir;
+ qsort(st->eline, st->eli+1, sizeof(struct lineStruct), _comparedeo);
+ }
+ st->ii++;
+
+ /* clear arrays and other counters */
+ st->di=st->ei=st->fi=st->li=st->oi=st->zi=0;
+ st->grid_full=False;
+ /* li starts from 1 */
+ st->dline[0].x=st->dline[0].y=st->dline[0].len=0;
+ /* to keep it first after sorting so di is never null */
+ st->dline[0].deo=-999999999;
+
+ /* set random screen variables */
+ st->lwid = (st->ii==1) ? 3 : 2+((random()%6)%4);
+ st->d3d = ((st->tile==TILE_FLAT) || (st->tile==TILE_THIN) ||
+ (st->tile==TILE_OUTLINE)) ? D3D_NONE :
+ (st->tile==TILE_BLOCK) ? D3D_BLOCK :
+ (st->tile==TILE_NEON) ? D3D_NEON :
+ (st->tile==TILE_TILED) ? D3D_TILED :
+ /* force TILE_D3D on first screen to properly load all shades */
+ ((st->ii==1) && (!st->newcols)) ? D3D_TILED : (random()%5)%4;
+/* st->d3d=D3D_BLOCK; st->lwid=2; */
+ st->outline = (st->tile==TILE_OUTLINE) ? 1 :
+ ((st->tile!=TILE_RANDOM) || (random()%5)) ? 0 : 1;
+ st->round = (st->d3d==D3D_NEON) ? 1 :
+ ((st->d3d==D3D_BLOCK) || (st->outline) || (random()%6)) ? 0 : 1;
+ if ((st->d3d) || (st->outline) || (st->round))
+ st->lwid+=2;
+ if ((!st->d3d) && (!st->round) && (!st->outline) && (st->lwid>3))
+ st->lwid-=2;
+ if (st->d3d==D3D_TILED)
+ st->lwid++;
+ if (st->tile==TILE_THIN)
+ st->lwid=2;
+
+ _init_zlist(st);
+
+ st->maxlen=(st->lwid>6) ? 2+(random()%4) :
+ (st->lwid>4) ? 2+(random()%8)%6 :
+ (st->lwid>2) ? 2+(random()%12)%8 : 2+(random()%15)%10;
+ st->bnratio = 4+(random()%4)+(random()%4);
+ st->forcemax = (random()%6) ? 0 : 1;
+
+ if ((st->ii==1) || (st->newcols))
+ _init_colors(st);
+
+ st->dmap = (st->emap+5+(random()%5))%DRAWORDERS;
+
+ st->dmap=20+random()%20;
+
+ st->dvar = (st->dmap>22) ? 100 : 10+(st->csw[0]*(random()%5));
+ st->ddir= (random()%2) ? 1 : -1;
+
+ st->emap = (st->dmap+10+(random()%10))%20;
+ st->evar = (st->emap>22) ? 100 : 10+(st->csw[0]*(random()%5));
+ st->edir= (random()%2) ? 1 : -1;
+
+ st->layers= (random()%2) ? 2 : (random()%2) ? 1 : (random()%2) ? 3 : 4;
+ st->cmap=(st->cmap+5+(random()%10))%COLORMAPS;
+
+ for (x=0; x<LAYERS; x++) {
+ st->pattern[x]=random()%PATTERNS;
+ st->shape[x]=random()%SHAPES;
+ st->mix[x]=random()%20;
+ nstr = (st->lwid==2) ? 20+random()%12 :
+ (st->lwid==3) ? 16+random()%8 :
+ (st->lwid==4) ? 12+random()%6 :
+ (st->lwid==5) ? 10+random()%5 :
+ (st->lwid==6) ? 8+random()%4 :
+ 5+random()%5;
+ st->csw[x] = _max(5,st->gridy/nstr);
+ st->wsx[x] = (st->wsx[x]+3+(random()%3))%STRETCHES;
+ st->wsy[x] = (st->wsy[x]+3+(random()%3))%STRETCHES;
+ st->sec[x] = random()%5;
+ if ((!st->dialog) && (st->sec[x]<2)) st->csw[x]/=2;
+ st->cs1[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->cs2[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->cs3[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->cs4[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->wave[x]=random()%WAVES;
+ st->wavel[x]=st->csw[x]*(2+random()%6);
+ st->waveh[x]=st->csw[x]*(1+random()%3);
+ st->rx1[x]=(st->gridx/10+random()%(st->gridx*8/10));
+ st->ry1[x]=(st->gridy/10+random()%(st->gridy*8/10));
+ st->rx2[x]=(st->gridx*2/10+random()%(st->gridx*6/10));
+ st->ry2[x]=(st->gridy*2/10+random()%(st->gridy*6/10));
+ st->rx3[x]=(st->gridx*3/10+random()%(st->gridx*4/10));
+ st->ry3[x]=(st->gridy*3/10+random()%(st->gridy*4/10));
+ }
+}
+
+static int
+_shape(struct state *st, int x, int y, int rx, int ry, int n)
+{
+ switch(st->shape[n]) {
+ case 0: /* square/rectangle */
+ case 1:
+ case 2:
+ return(1+_max(abs(x-rx)*st->cs1[n]/st->cs2[n],abs(y-ry)*st->cs3[n]/st->cs4[n]));
+ case 3: /* diamond */
+ case 4:
+ return(1+(abs(x-rx)*st->cs1[n]/st->cs2[n]+abs(y-ry)*st->cs3[n]/st->cs4[n]));
+ case 5: /* 8 point star */
+ return(1+_min(_max(abs(x-rx),abs(y-ry))*3/2,abs(x-rx)+abs(y-ry)));
+ case 6: /* circle/oval */
+ case 7:
+ case 8:
+ return(1+_dist(st,x,rx,y,ry,st->cs1[n]));
+ case 9: /* black hole circle */
+ return(1+(st->gridx*st->gridy/(1+(_dist(st,x,rx,y,ry,st->cs2[n])))));
+ case 10: /* sun */
+ return(1+_min(abs(x-rx)*st->gridx/(abs(y-ry)+1),abs(y-ry)*st->gridx/(abs(x-rx)+1)));
+ case 11: /* 2 circles+inverted circle */
+ return(1+(_dist(st,x,rx,y,ry,st->cs1[n])*_dist(st,x,(rx*3)%st->gridx,y,(ry*5)%st->gridy,st->cs1[n])/(1+_dist(st,x,(rx*4)%st->gridx,y,(ry*7)%st->gridy,st->cs1[n]))));
+ case 12: /* star */
+ return(1+(int)sqrt(abs((x-rx)*(y-ry))));
+ case 13: /* centered ellipse */
+ return(1+_dist(st,x,rx,y,ry,0)+_dist(st,x,st->gridx-rx,y,st->gridy-ry,0));
+ default: /* triangle */
+ return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
+ }
+ return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
+}
+
+static int
+_pattern(struct state *st, int x, int y, int n)
+{
+ int v=0, ox;
+ ox=x;
+ switch(st->wsx[n]) {
+ case 0: /* slants */
+ x+=y/(1+st->cs4[n]);
+ break;
+ case 1:
+ x+=(st->gridy-y)/(1+st->cs4[n]);
+ break;
+ case 2: /* curves */
+ x+=_wave(st,y,st->gridx/(1+st->cs1[n]),st->gridy,0);
+ break;
+ case 3:
+ x+=_wave(st,st->gridy-y,st->gridy/(1+st->cs1[n]),st->gridy,0);
+ break;
+ case 4: /* U curves */
+ x+=_wave(st,y,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ case 5:
+ x-=_wave(st,y,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ }
+ switch(st->wsy[0]) {
+ case 0: /* slants */
+ y+=ox/(1+st->cs1[n]);
+ break;
+ case 1:
+ y+=(st->gridx-ox)/(1+st->cs1[n]);
+ break;
+ case 2: /* curves */
+ y+=_wave(st,ox,st->gridx/(1+st->cs1[n]),st->gridx,0);
+ break;
+ case 3:
+ y+=_wave(st,st->gridx-ox,st->gridx/(1+st->cs1[n]),st->gridx,0);
+ break;
+ case 4: /* U curves */
+ y+=_wave(st,ox,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ case 5:
+ y-=_wave(st,ox,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ }
+ switch(st->pattern[n]) {
+ case 0: /* horizontal stripes */
+ v=y;
+ break;
+ case 1: /* vertical stripes */
+ v=x;
+ break;
+ case 2: /* diagonal stripes */
+ v=(x+(y*st->cs1[n]/st->cs2[n]));
+ break;
+ case 3: /* reverse diagonal stripes */
+ v=(x-(y*st->cs1[n]/st->cs2[n]));
+ break;
+ case 4: /* checkerboard */
+ v=(y/st->csw[n]*3+x/st->csw[n])*st->csw[n];
+ break;
+ case 5: /* diagonal checkerboard */
+ v=((x+y)/2/st->csw[n]+(x+st->gridy-y)/2/st->csw[n]*3)*st->csw[n];
+ break;
+ case 6: /* + cross */
+ v=st->gridx+(_min(abs(x-st->rx3[n]),abs(y-st->ry3[n]))*2);
+ break;
+ case 7: /* double + cross */
+ v=_min(_min(abs(x-st->rx2[n]),abs(y-st->ry2[n])),_min(abs(x-st->rx1[n]),abs(y-st->ry1[n])))*2;
+ break;
+ case 8: /* X cross */
+ v=st->gridx+(_min(abs(x-st->rx3[n])*st->cs1[n]/st->cs2[n]+abs(y-st->ry2[n])*st->cs3[n]/st->cs4[n],abs(x-st->rx3[n])*st->cs1[n]/st->cs2[n]-abs(y-st->ry3[n])*st->cs3[n]/st->cs4[n])*2);
+ break;
+ case 9: /* double X cross */
+ v=_min(_min(abs(x-st->rx2[n])+abs(y-st->ry2[n]),abs(x-st->rx2[n])-abs(y-st->ry2[n])),_min(abs(x-st->rx1[n])+abs(y-st->ry1[n]),abs(x-st->rx1[n])-abs(y-st->ry1[n])))*2;
+ break;
+ case 10: /* horizontal stripes/waves */
+ v=st->gridy+(y+_wave(st,x,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 11: /* vertical stripes/waves */
+ v=st->gridx+(x+_wave(st,y,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 12: /* diagonal stripes/waves */
+ v=st->gridx+(x+(y*st->cs1[n]/st->cs2[n])+_wave(st,x,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 13: /* diagonal stripes/waves */
+ v=st->gridx+(x-(y*st->cs1[n]/st->cs2[n])+_wave(st,y,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 14: /* horizontal spikey waves */
+ v=y+(st->csw[n]*st->cs4[n]/st->cs3[n])+_wave(st,x+((y/st->cs3[n])*st->edir),st->csw[n]/2*st->cs1[n]/st->cs2[n],st->csw[n]/2*st->cs2[n]/st->cs1[n],st->wave[n]);
+ break;
+ case 15: /* vertical spikey waves */
+ v=x+(st->csw[n]*st->cs1[n]/st->cs2[n])+_wave(st,y+((x/st->cs3[n])*st->edir),st->csw[n]/2*st->cs1[n]/st->cs2[n],st->csw[n]/2*st->cs3[n]/st->cs4[n],st->wave[n]);
+ break;
+ case 16: /* big slanted hwaves */
+ v=st->gridy-y-(x*st->cs1[n]/st->cs3[n])+(st->csw[n]*st->cs1[n]*st->cs2[n]) +_wave(st,x,st->csw[n]/3*st->cs1[n]*st->cs2[n],st->csw[n]/3*st->cs3[n]*st->cs2[n],st->wave[n]);
+ break;
+ case 17: /* big slanted vwaves */
+ v=x-(y*st->cs1[n]/st->cs3[n])+(st->csw[n]*st->cs1[n]*st->cs2[n]) +_wave(st,y, st->csw[n]/3*st->cs1[n]*st->cs2[n], st->csw[n]/3*st->cs3[n]*st->cs2[n], st->wave[n]);
+ break;
+ case 18: /* double hwave */
+ v=y+(y+st->csw[n]*st->cs3[n])+_wave(st,x,st->csw[n]/3*st->cs3[n],st->csw[n]/3*st->cs2[n],st->wave[n])+_wave(st,x,st->csw[n]/3*st->cs4[n],st->csw[n]/3*st->cs1[n]*3/2,st->wave[n]);
+ break;
+ case 19: /* double vwave */
+ v=x+(x+st->csw[n]*st->cs1[n])+_wave(st,y,st->csw[n]/3*st->cs1[n],st->csw[n]/3*st->cs3[n],st->wave[n])+_wave(st,y,st->csw[n]/3*st->cs2[n],st->csw[n]/3*st->cs4[n]*3/2,st->wave[n]);
+ break;
+ case 20: /* one shape */
+ case 21:
+ case 22:
+ v=_shape(st,x, y, st->rx3[n], st->ry3[n], n);
+ break;
+ case 23: /* two shapes */
+ case 24:
+ case 25:
+ v=_min(_shape(st,x, y, st->rx1[n], st->ry1[n], n),_shape(st,x, y, st->rx2[n], st->ry2[n], n));
+ break;
+ case 26: /* two shapes opposites */
+ case 27:
+ v=_min(_shape(st,x, y, st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->gridx-st->rx2[n], st->gridy-st->rx2[n], n));
+ break;
+ case 28: /* two shape checkerboard */
+ case 29:
+ v=((_shape(st,x, y, st->rx1[n], st->ry1[n], n)/st->csw[n])+(_shape(st,x, y, st->rx2[n], st->ry2[n], n)/st->csw[n]))*st->csw[n];
+ break;
+ case 30: /* two shape blob */
+ case 31:
+ v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,x, y, st->rx2[n], st->ry2[n], n))/2;
+ break;
+ case 32: /* inverted two shape blob */
+ case 33:
+ v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,st->gridx-x, st->gridy-y, st->rx1[n], st->ry1[n], n))/2;
+ break;
+ case 34: /* three shapes */
+ case 35:
+ v=_min(_shape(st,x, y, st->rx3[n], st->ry3[n], n),_min(_shape(st,x, y, st->rx1[n], st->ry1[n], n),_shape(st,x, y, st->rx2[n], st->ry2[n], n)));
+ break;
+ case 36: /* three shape blob */
+ case 37:
+ v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,x, y, st->rx2[n], st->ry2[n], n)+_shape(st,x, y, st->rx3[n], st->ry3[n], n))/3;
+ break;
+ case 38: /* 4 shapes */
+ v=(_min(_shape(st,x, y, st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->gridx-st->rx2[n], st->gridy-st->ry2[n], n)),_min(_shape(st,x, y, st->gridx-st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->rx2[n], st->gridy-st->ry2[n], n)));
+ break;
+ case 39: /* four rainbows */
+ v=(_min(_shape(st,x, y, st->gridx-st->rx2[n]/2, st->csw[n], n),_shape(st,x, y, st->csw[n], st->ry2[n]/2, n)),_min(_shape(st,x, y, st->rx2[n]/2, st->gridy-st->csw[n], n),_shape(st,x, y, st->gridx-st->csw[n], st->gridy-(st->ry2[n]/2), n)));
+ break;
+ }
+ /* stretch or contract stripe */
+ switch(st->sec[n]) {
+ case 0:
+ v=(int)sqrt((int)sqrt(abs(v)*st->gridx)*st->gridx);
+ break;
+ case 1:
+ v=((int)pow(v,2)/st->gridx);
+ break;
+ }
+ return (abs(v));
+}
+
+static int
+_getcolor(struct state *st, int x, int y)
+{
+ int n, cv[LAYERS];
+
+ cv[0] = 0;
+ for (n=0; n<st->layers; n++) {
+ cv[n]=_pattern(st,x,y,n);
+ /* first wave/shape */
+ cv[0] = (!n) ? cv[0]/st->csw[0] :
+ /* checkerboard+1 */
+ (st->mix[n]<5) ? (cv[0]*st->csw[0]+cv[n])/st->csw[n] :
+ /* checkerboard+ncol/2 */
+ (st->mix[n]<12) ? cv[0]+(cv[n]/st->csw[n]*st->ncolors/2) :
+ /* add mix */
+ (st->mix[n]<16) ? cv[0]+(cv[n]/st->csw[n]) :
+ /* subtract mix */
+ (st->mix[n]<18) ? cv[0]-(cv[n]/st->csw[n]) :
+ /* r to l morph mix */
+ (st->mix[n]==18) ? ((cv[0]*x)+(cv[n]*(st->gridx-x)/st->csw[n]))/st->gridx :
+ /* u to d morph mix */
+ ((cv[0]*y)+(cv[n]*(st->gridy-y)/st->csw[n]))/st->gridy;
+ }
+ return(cv[0]);
+}
+
+/* return value=line direction
+ st->olen=open space to edge or next blocking line
+ st->bln=blocking line number or -1 if edge blocks */
+static int
+_findopen(struct state *st, int x, int y, int z)
+{
+ int dir, od[4], no=0;
+
+ if (((st->grid[z].hl) || (st->grid[z].hr)) &&
+ ((st->grid[z].vu) || (st->grid[z].vd)))
+ return(DIR_NONE);
+ if ((z>st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+ (!st->grid[z-st->gridx].line)) {
+ od[no]=DIR_UP;
+ no++;
+ }
+ if ((z<st->gridn-st->gridx) && (!st->grid[z].hl) &&
+ (!st->grid[z].hr) && (!st->grid[z+st->gridx].line)) {
+ od[no]=DIR_DOWN;
+ no++;
+ }
+ if ((x) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+ (!st->grid[z-1].line)) {
+ od[no]=DIR_LEFT;
+ no++;
+ }
+ if (((z+1)%st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+ (!st->grid[z+1].line)) {
+ od[no]=DIR_RIGHT;
+ no++;
+ }
+ if (!no)
+ return(DIR_NONE);
+ dir=od[random()%no];
+ st->olen=st->bln=0;
+ while ((st->olen<=st->maxlen) && (!st->bln)) {
+ st->olen++;
+ if (dir==DIR_UP)
+ st->bln = (y-st->olen<0) ? -1 :
+ st->grid[z-(st->olen*st->gridx)].line;
+ if (dir==DIR_DOWN)
+ st->bln = (y+st->olen>=st->gridy) ? -1 :
+ st->grid[z+(st->olen*st->gridx)].line;
+ if (dir==DIR_LEFT)
+ st->bln = (x-st->olen<0) ? -1 :
+ st->grid[z-st->olen].line;
+ if (dir==DIR_RIGHT)
+ st->bln = (x+st->olen>=st->gridx) ? -1 :
+ st->grid[z+st->olen].line;
+ }
+ st->olen--;
+ return(dir);
+}
+
+static void
+_fillgrid(struct state *st)
+{
+ unsigned int gridc, n, add;
+
+ gridc=st->gridx*st->dline[st->li].y+st->dline[st->li].x;
+ add = (st->dline[st->li].hv) ? 1 : st->gridx;
+ for (n=0; n<=st->dline[st->li].len; n++) {
+ if (n)
+ gridc+=add;
+ if (!st->grid[gridc].line) {
+ st->fi++;
+ st->grid[gridc].line=st->li;
+ }
+ if (st->dline[st->li].hv) {
+ if (n)
+ st->grid[gridc].hr=st->li;
+ if (n<st->dline[st->li].len)
+ st->grid[gridc].hl=st->li;
+ } else {
+ if (n)
+ st->grid[gridc].vd=st->li;
+ if (n<st->dline[st->li].len)
+ st->grid[gridc].vu=st->li;
+ }
+ if (st->fi>=st->gridn) {
+ st->grid_full=True;
+ return;
+ }
+ }
+}
+
+static void
+_newline(struct state *st)
+{
+ int bl, bz, dir, lt, x, y, z;
+
+ bl=0;
+ z=st->zlist[st->zi];
+ x=z%st->gridx;
+ y=z/st->gridx;
+ st->zi++;
+ dir=_findopen(st,x,y,z);
+
+ if (!st->grid[z].line) {
+ /* this is an empty space, make a new line unless nothing is open around it */
+ if (dir==DIR_NONE) {
+ /* nothing is open, force a len 1 branch in any direction */
+ lt=LINE_FORCE;
+ while ((dir==DIR_NONE) ||
+ ((dir==DIR_UP) && (!y)) ||
+ ((dir==DIR_DOWN) && (y+1==st->gridy)) ||
+ ((dir==DIR_LEFT) && (!x)) ||
+ ((dir==DIR_RIGHT) && (x+1==st->gridx))) {
+ dir=random()%4;
+ }
+ bz = (dir==DIR_UP) ? z-st->gridx : (dir==DIR_DOWN) ? z+st->gridx : (dir==DIR_LEFT) ? z-1 : z+1;
+ bl = st->grid[bz].line;
+ } else if ((st->bnratio>1) && (st->bln>0) &&
+ (st->olen<st->maxlen) && (random()%st->bnratio)) {
+ /* branch into blocking line */
+ lt=LINE_BRIN;
+ bl = st->bln;
+ } else {
+ /* make a new line and new object */
+ lt=LINE_NEW;
+ st->oi++;
+ }
+ } else {
+ /* this is a filled space, make a branch unless nothing is open around it */
+ if (dir==DIR_NONE)
+ return;
+ /* make a branch out of this line */
+ lt=LINE_BROUT;
+ bl=st->grid[z].line;
+ }
+ st->li++;
+ st->dline[st->li].len = (lt==LINE_FORCE) ? 1 : (lt==LINE_BRIN) ?
+ st->olen+1 : (!st->forcemax) ? st->olen : 1+random()%st->olen;
+ st->dline[st->li].x=x;
+ if (dir==DIR_LEFT)
+ st->dline[st->li].x-=st->dline[st->li].len;
+ st->dline[st->li].y=y;
+ if (dir==DIR_UP)
+ st->dline[st->li].y-=st->dline[st->li].len;
+ st->dline[st->li].hv = ((dir==DIR_LEFT) || (dir==DIR_RIGHT)) ?
+ True : False;
+ st->dline[st->li].obj = (lt==LINE_NEW) ? st->oi :
+ st->dline[bl].obj;
+ if (lt==LINE_NEW) {
+ int color = (_getcolor(st,x,y))%st->ncolors;
+ if (color < 0) color += st->ncolors;
+ st->dline[st->li].color = color;
+ } else {
+ st->dline[st->li].color = st->dline[bl].color;
+ }
+ st->dline[st->li].deo=(_getdeo(st,x,y,st->dmap,1) +
+ (random()%st->dvar) + (random()%st->dvar))*st->ddir;
+ st->dline[st->li].ndol=0;
+ _fillgrid(st);
+}
+
+static void
+_create_screen(struct state *st)
+{
+ while(!st->grid_full)
+ _newline(st);
+ qsort(st->dline, st->li+1, sizeof(struct lineStruct), _comparedeo);
+/*st->lpu=st->li/20/((6-st->speed)*3);
+ Used to use a computed lpu, lines per update to control draw speed
+ draw 1/lpu of the lines before each XSync which takes a split second
+ the higher the lpu, the quicker the screen draws. This worked somewhat
+ after the 4->5 update, however with the Mac updating so much more slowly,
+ values tuned for it draw the screen in a blink on Linux. Therefore we
+ draw 1/200th of the screen with each update and sleep, if necessary */
+ st->lpu = (st->dialog) ? st->li/50 : st->li/200;
+ if (!st->lpu) st->lpu = 1;
+ st->bi=1;
+ st->mode=MODE_ERASE;
+}
+
+static void
+_fill_outline(struct state *st, int di)
+{
+ int x, y, h, w;
+
+ if (!di)
+ return;
+ x=st->dline[di].x*st->lwid+1;
+ y=st->dline[di].y*st->lwid+1;
+ if (st->dline[di].hv) {
+ w=(st->dline[di].len+1)*st->lwid-3;
+ h=st->lwid-3;
+ } else {
+ w=st->lwid-3;
+ h=(st->dline[di].len+1)*st->lwid-3;
+ }
+ XFillRectangle (st->display, st->window, st->bgc, x, y, w, h);
+}
+
+static void
+_XFillRectangle(struct state *st, int di, int adj)
+{
+ int a, b, x, y, w, h;
+
+ x=st->dline[di].x*st->lwid;
+ y=st->dline[di].y*st->lwid;
+ if (st->dline[di].hv) {
+ w=(st->dline[di].len+1)*st->lwid-1;
+ h=st->lwid-1;
+ } else {
+ w=st->lwid-1;
+ h=(st->dline[di].len+1)*st->lwid-1;
+ }
+ switch (st->d3d) {
+ case D3D_NEON:
+ x+=adj;
+ y+=adj;
+ w-=adj*2;
+ h-=adj*2;
+ break;
+ case D3D_BLOCK:
+ x+=adj;
+ y+=adj;
+ w-=st->lwid/2-1;
+ h-=st->lwid/2-1;
+ break;
+ }
+ if (!st->round) {
+ XFillRectangle(st->display, st->window, st->fgc, x, y, w, h);
+ } else {
+ if (h<st->lwid) { /* horizontal */
+ a=(h-1)/2;
+ for (b=0; b<=a; b++)
+ XFillRectangle(st->display, st->window, st->fgc,
+ x+b, y+a-b, w-b*2, h-((a-b)*2));
+ } else { /* vertical */
+ a=(w-1)/2;
+ for (b=0; b<=a; b++)
+ XFillRectangle(st->display, st->window, st->fgc,
+ x+a-b, y+b, w-((a-b)*2), h-b*2);
+ }
+ }
+}
+
+static void
+_XFillTriangle(struct state *st, int color, int x1, int y1, int x2, int y2,
+ int x3, int y3)
+{
+ XPoint points[3];
+
+ points[0].x=x1;
+ points[0].y=y1;
+ points[1].x=x2;
+ points[1].y=y2;
+ points[2].x=x3;
+ points[2].y=y3;
+ XSetForeground(st->display, st->fgc, st->colors[color].pixel);
+ XFillPolygon (st->display, st->window, st->fgc, points, 3, Convex,
+ CoordModeOrigin);
+}
+
+static void
+_XFillPolygon4(struct state *st, int color, int x1, int y1, int x2, int y2,
+ int x3, int y3, int x4, int y4)
+{
+ XPoint points[4];
+
+ points[0].x=x1;
+ points[0].y=y1;
+ points[1].x=x2;
+ points[1].y=y2;
+ points[2].x=x3;
+ points[2].y=y3;
+ points[3].x=x4;
+ points[3].y=y4;
+ XSetForeground(st->display, st->fgc, st->colors[color].pixel);
+ XFillPolygon (st->display, st->window, st->fgc, points, 4, Convex,
+ CoordModeOrigin);
+}
+
+static void
+_draw_tiled(struct state *st, int color)
+{
+ int a, c, d, x, y, z, m1, m2, lr, nl, w, h;
+ a = (st->dline[st->di].hv) ? 1 : st->gridx;
+ z = st->dline[st->di].y*st->gridx+st->dline[st->di].x;
+ m1 = (st->lwid-1)/2;
+ m2 = st->lwid/2;
+ lr = st->lwid-1;
+ nl = st->lwid;
+
+ /* draw tiles one grid cell at a time */
+ for (c=0; c<=st->dline[st->di].len; c++) {
+ if (st->dline[st->di].hv) {
+ x = (st->dline[st->di].x+c)*st->lwid;
+ y = st->dline[st->di].y*st->lwid;
+ if (c)
+ st->grid[z].dhr=st->di;
+ if (c<st->dline[st->di].len)
+ st->grid[z].dhl=st->di;
+ } else {
+ x = st->dline[st->di].x*st->lwid;
+ y = (st->dline[st->di].y+c)*st->lwid;
+ if (c)
+ st->grid[z].dvd=st->di;
+ if (c<st->dline[st->di].len)
+ st->grid[z].dvu=st->di;
+ }
+ d=0;
+ if (st->grid[z].dhl)
+ d+=8;
+ if (st->grid[z].dhr)
+ d+=4;
+ if (st->grid[z].dvu)
+ d+=2;
+ if (st->grid[z].dvd)
+ d++;
+ /* draw line base */
+ switch (d) {
+ case 1:
+ case 2: /* vertical */
+ case 3:
+ case 5:
+ case 6:
+ case 7:
+ case 11:
+ case 15:
+ h = ((d==1) || (d==5)) ? lr : nl;
+ XSetForeground(st->display, st->fgc,
+ st->colors[color].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x, y, m2, h);
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+3].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x+m2, y, m1, h);
+ break;
+ case 4:
+ case 8: /* horizontal */
+ case 9:
+ case 10:
+ case 12:
+ case 13:
+ case 14:
+ w = (d==4) ? lr : nl;
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+1].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x, y, w, m2);
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+2].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x, y+m2, w, m1);
+ break;
+ }
+ /* draw angles */
+ switch(d) {
+ case 1: /* bottom end ^ */
+ _XFillTriangle(st,color+2, x, y+lr, x+lr, y+lr, x+m2, y+m2);
+ break;
+ case 2: /* top end \/ */
+ _XFillTriangle(st,color+1, x, y, x+lr, y, x+m2, y+m2);
+ break;
+ case 4: /* right end < */
+ _XFillTriangle(st,color+3, x+lr, y, x+lr, y+lr, x+m2, y+m2);
+ break;
+ case 5: /* LR corner */
+ _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
+ _XFillPolygon4(st,color+2, x, y+m2, x+m2, y+m2, x+lr, y+lr, x, y+lr);
+ break;
+ case 6: /* UR corner */
+ _XFillPolygon4(st,color+1, x, y+m2, x+m2, y+m2, x+lr, y, x, y);
+ _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
+ break;
+ case 7: /* T > into line */
+ _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
+ _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
+ break;
+ case 8: /* left end > */
+ _XFillTriangle(st,color, x, y, x, y+lr, x+m2, y+m2);
+ break;
+ case 9: /* LL corner */
+ _XFillPolygon4(st,color, x+m2, y, x+m2, y+m2, x, y+lr, x, y);
+ _XFillTriangle(st,color+3, x+m2, y, x+m2, y+m2, x+lr, y);
+ break;
+ case 10: /* UL corner */
+ _XFillPolygon4(st,color, x+m2, y+nl, x+m2, y+m2, x, y, x, y+nl);
+ _XFillPolygon4(st,color+3, x+m2, y+nl, x+m2, y+m2, x+lr, y+lr, x+lr, y+nl);
+ break;
+ case 11: /* T < into line */
+ _XFillPolygon4(st,color+1, x+nl, y+m2, x+m2, y+m2, x+lr, y, x+nl, y);
+ _XFillPolygon4(st,color+2, x+nl, y+m2, x+m2, y+m2, x+lr, y+lr, x+nl, y+lr);
+ break;
+ case 13: /* T \/ into line */
+ _XFillTriangle(st,color, x+m2, y, x+m2, y+m2, x, y);
+ _XFillTriangle(st,color+3, x+m2, y, x+m2, y+m2, x+lr, y);
+ break;
+ case 14: /* T ^ into line */
+ _XFillPolygon4(st,color, x+m2, y+nl, x+m2, y+m2, x, y+lr, x, y+nl);
+ _XFillPolygon4(st,color+3, x+m2, y+nl, x+m2, y+m2, x+lr, y+lr, x+lr, y+nl);
+ break;
+ case 15: /* X intersection */
+ _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
+ _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
+ _XFillPolygon4(st,color+1, x+nl, y+m2, x+m2, y+m2, x+lr, y, x+nl, y);
+ _XFillPolygon4(st,color+2, x+nl, y+m2, x+m2, y+m2, x+lr, y+lr, x+nl, y+lr);
+ break;
+ }
+ z+=a;
+ }
+}
+
+static long
+_mselapsed(struct state *st)
+{
+ struct timeval t;
+ gettimeofday(&t, NULL);
+ t.tv_sec -= st->time.tv_sec;
+ t.tv_usec -= st->time.tv_usec;
+ return ((long)t.tv_sec*1000000+t.tv_usec);
+}
+
+static void
+_draw_lines(struct state *st)
+{
+ int n, z, a, color, sh, di;
+ if (st->bi==1)
+ for (a=0; a<=st->oi; a++)
+ st->fdol[a]=0;
+
+ for (st->di=st->bi; st->di<_min(st->li+1,st->bi+st->lpu); st->di++) {
+ color=(st->dline[st->di].color%st->ncolors)*st->shades;
+ XSetForeground(st->display, st->fgc, st->colors[color].pixel);
+
+ switch (st->d3d) {
+ case D3D_NEON:
+ st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
+ st->fdol[st->dline[st->di].obj]=st->di;
+ for (sh=0; sh<st->lwid/2; sh++) {
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+sh].pixel);
+ di=st->di;
+ while(di>0) {
+ _XFillRectangle(st,di,sh);
+ di=st->dline[di].ndol;
+ }
+ }
+ break;
+ case D3D_BLOCK:
+ st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
+ st->fdol[st->dline[st->di].obj]=st->di;
+ for (sh=0; sh<st->lwid/2; sh++) {
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+(st->lwid/2)-sh-1].pixel);
+ di=st->di;
+ while(di>0) {
+ _XFillRectangle(st,di,sh);
+ di=st->dline[di].ndol;
+ }
+ }
+ break;
+ case D3D_TILED:
+ _draw_tiled(st,color);
+ break;
+ default: /* D3D_NONE */
+ _XFillRectangle(st,st->di,0);
+ if (st->outline) {
+ _fill_outline(st, st->di);
+ z=st->dline[st->di].y*st->gridx+st->dline[st->di].x;
+ a = (st->dline[st->di].hv) ? 1 : st->gridx;
+ for (n=0; n<=st->dline[st->di].len; n++) {
+ _fill_outline(st, st->grid[z].dhl);
+ _fill_outline(st, st->grid[z].dhr);
+ _fill_outline(st, st->grid[z].dvu);
+ _fill_outline(st, st->grid[z].dvd);
+ if (st->dline[st->di].hv) {
+ if (n)
+ st->grid[z].dhr=st->di;
+ if (n<st->dline[st->di].len)
+ st->grid[z].dhl=st->di;
+ } else {
+ if (n)
+ st->grid[z].dvd=st->di;
+ if (n<st->dline[st->di].len)
+ st->grid[z].dvu=st->di;
+ }
+ z+=a;
+ }
+ }
+ break;
+ }
+ }
+ if (st->di>st->li) {
+ st->bi=1;
+ st->mode=MODE_CREATE;
+ } else {
+ st->bi+=st->lpu;
+ }
+}
+
+static void
+_erase_lines(struct state *st)
+{
+ if (!st->ii)
+ return;
+ for (st->di=st->bi; st->di<_min(st->eli+1,st->bi+st->elpu); st->di++) {
+ if (st->eline[st->di].hv) {
+ XFillRectangle (st->display, st->window, st->bgc,
+ st->eline[st->di].x*st->elwid,
+ st->eline[st->di].y*st->elwid,
+ (st->eline[st->di].len+1)*st->elwid, st->elwid);
+ } else {
+ XFillRectangle (st->display, st->window, st->bgc,
+ st->eline[st->di].x*st->elwid,
+ st->eline[st->di].y*st->elwid,
+ st->elwid, (st->eline[st->di].len+1)*st->elwid);
+ }
+ if (st->di==st->eli) /* clear just in case */
+ XFillRectangle(st->display, st->window, st->bgc, 0, 0,
+ st->xgwa.width, st->xgwa.height);
+ }
+ if (st->di>st->eli) {
+ st->bi=1;
+ if (st->resized) {
+ st->mode=MODE_CREATE;
+ } else {
+ st->mode=MODE_DRAW;
+ }
+ } else {
+ st->bi+=st->elpu;
+ }
+}
+
+static void *
+abstractile_init(Display *display, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+/* struct utsname os;*/
+
+ char *tile = get_string_resource(display, "tile", "Tile");
+ if (tile && !strcmp(tile, "random")) st->tile = TILE_RANDOM;
+ else if (tile && !strcmp(tile, "flat")) st->tile = TILE_FLAT;
+ else if (tile && !strcmp(tile, "thin")) st->tile = TILE_THIN;
+ else if (tile && !strcmp(tile, "outline")) st->tile = TILE_OUTLINE;
+ else if (tile && !strcmp(tile, "block")) st->tile = TILE_BLOCK;
+ else if (tile && !strcmp(tile, "neon")) st->tile = TILE_NEON;
+ else if (tile && !strcmp(tile, "tiled")) st->tile = TILE_TILED;
+ else {
+ if (tile && *tile && !!strcmp(tile, "random"))
+ fprintf(stderr, "%s: unknown tile option %s\n", progname, tile);
+ st->tile = TILE_RANDOM;
+ }
+
+ st->speed = get_integer_resource(display, "speed", "Integer");
+ if (st->speed < 0) st->speed = 0;
+ if (st->speed > 5) st->speed = 5;
+ st->sleep = get_integer_resource(display, "sleep", "Integer");
+ if (st->sleep < 0) st->sleep = 0;
+ if (st->sleep > 60) st->sleep = 60;
+
+ st->display=display;
+ st->window=window;
+
+ /* get screen size and create Graphics Contexts */
+ XGetWindowAttributes (display, window, &st->xgwa);
+ gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->fgc = XCreateGC (display, window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC (display, window, GCForeground, &gcv);
+
+/* Um, no. This is obscene. -jwz.
+ uname(&os);
+ st->newcols=((!strcmp(os.sysname,"Linux")) || (!strcmp(os.sysname,"Darwin")))
+ ? True : False;
+*/
+ st->newcols=False;
+
+ st->mode=MODE_CREATE;
+ st->ii=0;
+ st->resized=True;
+ return st;
+}
+
+static unsigned long
+abstractile_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int mse, usleep;
+
+ gettimeofday(&st->time, NULL);
+
+ /* If the window is too small, do nothing, sorry! */
+ if (st->xgwa.width > 20 && st->xgwa.height > 20) {
+ switch (st->mode) {
+ case MODE_CREATE:
+ _init_screen(st);
+ _create_screen(st);
+ break;
+ case MODE_ERASE:
+ _erase_lines(st);
+ break;
+ case MODE_DRAW:
+ _draw_lines(st);
+ break;
+ }
+ }
+ mse=_mselapsed(st);
+ usleep = ((!st->ii) && (st->mode==MODE_CREATE)) ? 0 :
+ (st->mode==MODE_CREATE) ? st->sleep*1000000-mse :
+ /* speed=0-5, goal is 10,8,6,4,2,0 sec normal and 5,4,3,2,1,0 dialog */
+ (5-st->speed)*(2-st->dialog)*100000/st->lpu-mse;
+ if (usleep>=0)
+ return usleep;
+ return 0;
+}
+
+static void
+abstractile_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xgwa.width = w;
+ st->xgwa.height = h;
+ if (w*h>st->max_wxh)
+ st->resized=True;
+}
+
+static Bool
+abstractile_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->mode=MODE_CREATE;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+abstractile_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+static const char *abstractile_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*sleep: 3",
+ "*speed: 3",
+ "*tile: random",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec abstractile_options [] = {
+ { "-sleep", ".sleep", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-tile", ".tile", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Abstractile", abstractile)
diff --git a/hacks/abstractile.man b/hacks/abstractile.man
new file mode 100644
index 0000000..d043ce7
--- /dev/null
+++ b/hacks/abstractile.man
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+abstractile - draw abstract mosaic patterns of interlocking tiles
+.SH SYNOPSIS
+.B abstractile
+[\-sleep \fIseconds\fP] [\-speed \fIint\fP] [\-tile \fItile_mode\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIabstractile\fP program draws chaotic grids of randomly colored
+and shaped interlocking tiles.
+.SH OPTIONS
+.I abstractile
+accepts the following options:
+.TP 8
+.B \-sleep \fIseconds\fP
+Specify the number of seconds to sleep between screens (0-60).
+.TP 8
+.B \-speed \fIint\fP
+A value between 0 and 5 used to specify the speed at which each screen is drawn.
+.TP 8
+.B \-tile \fItile_mode\fP
+The type of tile that is drawn on each screen. Legal values are
+\fIrandom\fP, \fIflat\fP, \fIthin\fP, \fIoutline\fP,
+\fIblock\fP, \fIneon\fP, and \fItiled\fP
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Steve Sundstrom. Based on
+examples from the hacks directory of xscreensaver,
+Copyright (c) 1997, 1998, 2002 Jamie Zawinski
+<jwz@jwz.org>
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Steve Sundstrom
diff --git a/hacks/analogtv.c b/hacks/analogtv.c
new file mode 100644
index 0000000..fd7f504
--- /dev/null
+++ b/hacks/analogtv.c
@@ -0,0 +1,2431 @@
+/* analogtv, Copyright (c) 2003-2018 Trevor Blackwell <tlb@tlb.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+
+ This is the code for implementing something that looks like a conventional
+ analog TV set. It simulates the following characteristics of standard
+ televisions:
+
+ - Realistic rendering of a composite video signal
+ - Compression & brightening on the right, as the scan gets truncated
+ because of saturation in the flyback transformer
+ - Blooming of the picture dependent on brightness
+ - Overscan, cutting off a few pixels on the left side.
+ - Colored text in mixed graphics/text modes
+
+ It's amazing how much it makes your high-end monitor look like at large
+ late-70s TV. All you need is to put a big "Solid State" logo in curly script
+ on it and you'd be set.
+
+ In DirectColor or TrueColor modes, it generates pixel values
+ directly from RGB values it calculates across each scan line. In
+ PseudoColor mode, it consider each possible pattern of 5 preceding
+ bit values in each possible position modulo 4 and allocates a color
+ for each. A few things, like the brightening on the right side as
+ the horizontal trace slows down, aren't done in PseudoColor.
+
+ I originally wrote it for the Apple ][ emulator, and generalized it
+ here for use with a rewrite of xteevee and possibly others.
+
+ A maxim of technology is that failures reveal underlying mechanism.
+ A good way to learn how something works is to push it to failure.
+ The way it fails will usually tell you a lot about how it works. The
+ corollary for this piece of software is that in order to emulate
+ realistic failures of a TV set, it has to work just like a TV set.
+ So there is lots of DSP-style emulation of analog circuitry for
+ things like color decoding, H and V sync following, and more. In
+ 2003, computers are just fast enough to do this at television signal
+ rates. We use a 14 MHz sample rate here, so we can do on the order
+ of a couple hundred instructions per sample and keep a good frame
+ rate.
+
+ Trevor Blackwell <tlb@tlb.org>
+*/
+
+/*
+ 2014-04-20, Dave Odell <dmo2118@gmail.com>:
+ API change: Folded analogtv_init_signal and *_add_signal into *_draw().
+ Added SMP support.
+ Replaced doubles with floats, including constants and transcendental functions.
+ Fixed a bug or two.
+*/
+
+/* 2015-02-27, Tomasz Sulej <tomeksul@gmail.com>:
+ - tint_control variable is used now
+ - removed unusable hashnoise code
+ */
+
+/*
+ 2016-10-09, Dave Odell <dmo2118@gmail.com>:
+ Updated for new xshm.c.
+*/
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else /* !HAVE_JWXYZ */
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+#endif
+#include <limits.h>
+
+#include <assert.h>
+#include <errno.h>
+#include "utils.h"
+#include "resources.h"
+#include "analogtv.h"
+#include "yarandom.h"
+#include "grabscreen.h"
+#include "visual.h"
+#include "font-retry.h"
+#include "ximage-loader.h"
+
+/* #define DEBUG 1 */
+
+#if defined(DEBUG) && (defined(__linux) || defined(__FreeBSD__))
+/* only works on linux + freebsd */
+#include <machine/cpufunc.h>
+
+#define DTIME_DECL u_int64_t dtimes[100]; int n_dtimes
+#define DTIME_START do {n_dtimes=0; dtimes[n_dtimes++]=rdtsc(); } while (0)
+#define DTIME dtimes[n_dtimes++]=rdtsc()
+#define DTIME_SHOW(DIV) \
+do { \
+ double _dtime_div=(DIV); \
+ printf("time/%.1f: ",_dtime_div); \
+ for (i=1; i<n_dtimes; i++) \
+ printf(" %0.9f",(dtimes[i]-dtimes[i-1])* 1e-9 / _dtime_div); \
+ printf("\n"); \
+} while (0)
+
+#else
+
+#define DTIME_DECL
+#define DTIME_START do { } while (0)
+#define DTIME do { } while (0)
+#define DTIME_SHOW(DIV) do { } while (0)
+
+#endif
+
+
+#define FASTRND_A 1103515245
+#define FASTRND_C 12345
+#define FASTRND (fastrnd = fastrnd*FASTRND_A+FASTRND_C)
+
+static void analogtv_ntsc_to_yiq(const analogtv *it, int lineno, const float *signal,
+ int start, int end, struct analogtv_yiq_s *it_yiq);
+
+static float puramp(const analogtv *it, float tc, float start, float over)
+{
+ float pt=it->powerup-start;
+ float ret;
+ if (pt<0.0f) return 0.0f;
+ if (pt>900.0f || pt/tc>8.0f) return 1.0f;
+
+ ret=(1.0f-expf(-pt/tc))*over;
+ if (ret>1.0f) return 1.0f;
+ return ret*ret;
+}
+
+/*
+ There are actual standards for TV signals: NTSC and RS-170A describe the
+ system used in the US and Japan. Europe has slightly different systems, but
+ not different enough to make substantially different screensaver displays.
+ Sadly, the standards bodies don't do anything so useful as publish the spec on
+ the web. Best bets are:
+
+ http://www.ee.washington.edu/conselec/CE/kuhn/ntsc/95x4.htm
+ http://www.ntsc-tv.com/ntsc-index-02.htm
+
+ In DirectColor or TrueColor modes, it generates pixel values directly from RGB
+ values it calculates across each scan line. In PseudoColor mode, it consider
+ each possible pattern of 5 preceding bit values in each possible position
+ modulo 4 and allocates a color for each. A few things, like the brightening on
+ the right side as the horizontal trace slows down, aren't done in PseudoColor.
+
+ I'd like to add a bit of visible retrace, but it conflicts with being able to
+ bitcopy the image when fast scrolling. After another couple of CPU
+ generations, we could probably regenerate the whole image from scratch every
+ time. On a P4 2 GHz it can manage this fine for blinking text, but scrolling
+ looks too slow.
+*/
+
+/* localbyteorder is MSBFirst or LSBFirst */
+static int localbyteorder;
+static const double float_low8_ofs=8388608.0;
+static int float_extraction_works;
+
+typedef union {
+ float f;
+ int i;
+} float_extract_t;
+
+static void
+analogtv_init(void)
+{
+ int i;
+ {
+ unsigned int localbyteorder_loc = (MSBFirst<<24) | (LSBFirst<<0);
+ localbyteorder=*(char *)&localbyteorder_loc;
+ }
+
+ if (1) {
+ float_extract_t fe;
+ int ans;
+
+ float_extraction_works=1;
+ for (i=0; i<256*4; i++) {
+ fe.f=float_low8_ofs+(double)i;
+ ans=fe.i&0x3ff;
+ if (ans != i) {
+#ifdef DEBUG
+ printf("Float extraction failed for %d => %d\n",i,ans);
+#endif
+ float_extraction_works=0;
+ break;
+ }
+ }
+ }
+
+}
+
+void
+analogtv_set_defaults(analogtv *it, char *prefix)
+{
+ char buf[256];
+
+ sprintf(buf,"%sTVTint",prefix);
+ it->tint_control = get_float_resource(it->dpy, buf,"TVTint");
+ sprintf(buf,"%sTVColor",prefix);
+ it->color_control = get_float_resource(it->dpy, buf,"TVColor")/100.0;
+ sprintf(buf,"%sTVBrightness",prefix);
+ it->brightness_control = get_float_resource(it->dpy, buf,"TVBrightness") / 100.0;
+ sprintf(buf,"%sTVContrast",prefix);
+ it->contrast_control = get_float_resource(it->dpy, buf,"TVContrast") / 100.0;
+ it->height_control = 1.0;
+ it->width_control = 1.0;
+ it->squish_control = 0.0;
+ it->powerup=1000.0;
+
+ it->hashnoise_rpm=0;
+ it->hashnoise_on=0;
+ it->hashnoise_enable=1;
+
+ it->horiz_desync=frand(10.0)-5.0;
+ it->squeezebottom=frand(5.0)-1.0;
+
+#ifdef DEBUG
+ printf("analogtv: prefix=%s\n",prefix);
+ printf(" use: cmap=%d color=%d\n",
+ it->use_cmap,it->use_color);
+ printf(" controls: tint=%g color=%g brightness=%g contrast=%g\n",
+ it->tint_control, it->color_control, it->brightness_control,
+ it->contrast_control);
+/* printf(" freq_error %g: %g %d\n",
+ it->freq_error, it->freq_error_inc, it->flutter_tint); */
+ printf(" desync: %g %d\n",
+ it->horiz_desync, it->flutter_horiz_desync);
+ printf(" hashnoise rpm: %g\n",
+ it->hashnoise_rpm);
+ printf(" vis: %d %d\n",
+ it->visclass, it->visdepth);
+ printf(" shift: %d-%d %d-%d %d-%d\n",
+ it->red_invprec,it->red_shift,
+ it->green_invprec,it->green_shift,
+ it->blue_invprec,it->blue_shift);
+ printf(" size: %d %d %d %d xrepl=%d\n",
+ it->usewidth, it->useheight,
+ it->screen_xo, it->screen_yo, it->xrepl);
+
+ printf(" ANALOGTV_V=%d\n",ANALOGTV_V);
+ printf(" ANALOGTV_TOP=%d\n",ANALOGTV_TOP);
+ printf(" ANALOGTV_VISLINES=%d\n",ANALOGTV_VISLINES);
+ printf(" ANALOGTV_BOT=%d\n",ANALOGTV_BOT);
+ printf(" ANALOGTV_H=%d\n",ANALOGTV_H);
+ printf(" ANALOGTV_SYNC_START=%d\n",ANALOGTV_SYNC_START);
+ printf(" ANALOGTV_BP_START=%d\n",ANALOGTV_BP_START);
+ printf(" ANALOGTV_CB_START=%d\n",ANALOGTV_CB_START);
+ printf(" ANALOGTV_PIC_START=%d\n",ANALOGTV_PIC_START);
+ printf(" ANALOGTV_PIC_LEN=%d\n",ANALOGTV_PIC_LEN);
+ printf(" ANALOGTV_FP_START=%d\n",ANALOGTV_FP_START);
+ printf(" ANALOGTV_PIC_END=%d\n",ANALOGTV_PIC_END);
+ printf(" ANALOGTV_HASHNOISE_LEN=%d\n",ANALOGTV_HASHNOISE_LEN);
+
+#endif
+
+}
+
+extern Bool mono_p; /* shoot me */
+
+static void
+analogtv_free_image(analogtv *it)
+{
+ if (it->image) {
+ destroy_xshm_image(it->dpy, it->image, &it->shm_info);
+ it->image=NULL;
+ }
+}
+
+static void
+analogtv_alloc_image(analogtv *it)
+{
+ /* On failure, it->image is NULL. */
+
+ unsigned bits_per_pixel = visual_pixmap_depth(it->screen, it->xgwa.visual);
+ unsigned align = thread_memory_alignment(it->dpy) * 8 - 1;
+ /* Width is in bits. */
+ unsigned width = (it->usewidth * bits_per_pixel + align) & ~align;
+
+ it->image=create_xshm_image(it->dpy, it->xgwa.visual, it->xgwa.depth,
+ ZPixmap, &it->shm_info,
+ width / bits_per_pixel, it->useheight);
+
+ if (it->image) {
+ memset (it->image->data, 0, it->image->height * it->image->bytes_per_line);
+ } else {
+ /* Not enough memory. Maybe try a smaller window. */
+ fprintf(stderr, "analogtv: %s\n", strerror(ENOMEM));
+ }
+}
+
+
+static void
+analogtv_configure(analogtv *it)
+{
+ int oldwidth=it->usewidth;
+ int oldheight=it->useheight;
+ int wlim,hlim,height_diff;
+
+ /* If the window is very small, don't let the image we draw get lower
+ than the actual TV resolution (266x200.)
+
+ If the aspect ratio of the window is close to a 4:3 or 16:9 ratio --
+ or if it is a completely weird aspect ratio --
+ then scale the image to exactly fill the window.
+
+ Otherwise, center the image either horizontally or vertically,
+ letterboxing or pillarboxing (but not both).
+
+ If it's very close (2.5%) to a multiple of VISLINES, make it exact
+ For example, it maps 1024 => 1000.
+ */
+ float percent = 0.15;
+ float min_ratio = 4.0 / 3.0 * (1 - percent);
+ float max_ratio = 16.0 / 9.0 * (1 + percent);
+ float crazy_min_ratio = 10;
+ float crazy_max_ratio = 1/crazy_min_ratio;
+ float ratio;
+ float height_snap=0.025;
+
+ hlim = it->xgwa.height;
+ wlim = it->xgwa.width;
+ ratio = wlim / (float) hlim;
+
+#ifdef HAVE_MOBILE
+ /* Fill the whole iPhone screen, even though that distorts the image. */
+ min_ratio = 0;
+ max_ratio = 10;
+#endif
+
+ if (wlim < 266 || hlim < 200)
+ {
+ wlim = 266;
+ hlim = 200;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: minimal: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+ else if (ratio > min_ratio && ratio < max_ratio)
+ {
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: close enough: %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, min_ratio, ratio, max_ratio);
+# endif
+ }
+ else if (ratio >= max_ratio)
+ {
+ wlim = hlim*max_ratio;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: center H: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+ else /* ratio <= min_ratio */
+ {
+ hlim = wlim/min_ratio;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: center V: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+
+ if (ratio < crazy_min_ratio || ratio > crazy_max_ratio)
+ {
+ if (ratio < crazy_min_ratio)
+ hlim = it->xgwa.height;
+ else
+ wlim = it->xgwa.width;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: aspect: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+
+
+ height_diff = ((hlim + ANALOGTV_VISLINES/2) % ANALOGTV_VISLINES) - ANALOGTV_VISLINES/2;
+ if (height_diff != 0 && abs(height_diff) < hlim * height_snap)
+ {
+ hlim -= height_diff;
+ }
+
+
+ /* Most times this doesn't change */
+ if (wlim != oldwidth || hlim != oldheight) {
+
+ it->usewidth=wlim;
+ it->useheight=hlim;
+
+ it->xrepl=1+it->usewidth/640;
+ if (it->xrepl>2) it->xrepl=2;
+ it->subwidth=it->usewidth/it->xrepl;
+
+ analogtv_free_image(it);
+ analogtv_alloc_image(it);
+ }
+
+ it->screen_xo = (it->xgwa.width-it->usewidth)/2;
+ it->screen_yo = (it->xgwa.height-it->useheight)/2;
+ it->need_clear=1;
+}
+
+void
+analogtv_reconfigure(analogtv *it)
+{
+ XGetWindowAttributes (it->dpy, it->window, &it->xgwa);
+ analogtv_configure(it);
+}
+
+/* Can be any power-of-two <= 32. 16 a slightly better choice for 2-3 threads. */
+#define ANALOGTV_SUBTOTAL_LEN 32
+
+typedef struct analogtv_thread_s
+{
+ analogtv *it;
+ unsigned thread_id;
+ size_t signal_start, signal_end;
+} analogtv_thread;
+
+#define SIGNAL_OFFSET(thread_id) \
+ ((ANALOGTV_SIGNAL_LEN * (thread_id) / threads->count) & align)
+
+static int analogtv_thread_create(void *thread_raw, struct threadpool *threads,
+ unsigned thread_id)
+{
+ analogtv_thread *thread = (analogtv_thread *)thread_raw;
+ unsigned align;
+
+ thread->it = GET_PARENT_OBJ(analogtv, threads, threads);
+ thread->thread_id = thread_id;
+
+ align = thread_memory_alignment(thread->it->dpy) /
+ sizeof(thread->it->signal_subtotals[0]);
+ if (!align)
+ align = 1;
+ align = ~(align * ANALOGTV_SUBTOTAL_LEN - 1);
+
+ thread->signal_start = SIGNAL_OFFSET(thread_id);
+ thread->signal_end = thread_id + 1 == threads->count ?
+ ANALOGTV_SIGNAL_LEN :
+ SIGNAL_OFFSET(thread_id + 1);
+
+ return 0;
+}
+
+static void analogtv_thread_destroy(void *thread_raw)
+{
+}
+
+analogtv *
+analogtv_allocate(Display *dpy, Window window)
+{
+ static const struct threadpool_class cls = {
+ sizeof(analogtv_thread),
+ analogtv_thread_create,
+ analogtv_thread_destroy
+ };
+
+ XGCValues gcv;
+ analogtv *it=NULL;
+ int i;
+ const size_t rx_signal_len = ANALOGTV_SIGNAL_LEN + 2*ANALOGTV_H;
+
+ analogtv_init();
+
+ it=(analogtv *)calloc(1,sizeof(analogtv));
+ if (!it) return 0;
+ it->threads.count=0;
+ it->rx_signal=NULL;
+ it->signal_subtotals=NULL;
+
+ it->dpy=dpy;
+ it->window=window;
+
+ if (thread_malloc((void **)&it->rx_signal, dpy,
+ sizeof(it->rx_signal[0]) * rx_signal_len))
+ goto fail;
+
+ assert(!(ANALOGTV_SIGNAL_LEN % ANALOGTV_SUBTOTAL_LEN));
+ if (thread_malloc((void **)&it->signal_subtotals, dpy,
+ sizeof(it->signal_subtotals[0]) *
+ (rx_signal_len / ANALOGTV_SUBTOTAL_LEN)))
+ goto fail;
+
+ if (threadpool_create(&it->threads, &cls, dpy, hardware_concurrency(dpy)))
+ goto fail;
+
+ assert(it->threads.count);
+
+ it->shrinkpulse=-1;
+
+ it->n_colors=0;
+
+ XGetWindowAttributes (it->dpy, it->window, &it->xgwa);
+
+ it->screen=it->xgwa.screen;
+ it->colormap=it->xgwa.colormap;
+ it->visclass=visual_class(it->xgwa.screen, it->xgwa.visual);
+ it->visdepth=it->xgwa.depth;
+ if (it->visclass == TrueColor || it->visclass == DirectColor) {
+ if (get_integer_resource (it->dpy, "use_cmap", "Integer")) {
+ it->use_cmap=1;
+ } else {
+ it->use_cmap=0;
+ }
+ it->use_color=!mono_p;
+ }
+ else if (it->visclass == PseudoColor || it->visclass == StaticColor) {
+ it->use_cmap=1;
+ it->use_color=!mono_p;
+ }
+ else {
+ it->use_cmap=1;
+ it->use_color=0;
+ }
+
+ visual_rgb_masks (it->xgwa.screen, it->xgwa.visual,
+ &it->red_mask, &it->green_mask, &it->blue_mask);
+ it->red_shift=it->red_invprec=-1;
+ it->green_shift=it->green_invprec=-1;
+ it->blue_shift=it->blue_invprec=-1;
+ if (!it->use_cmap) {
+ /* Is there a standard way to do this? Does this handle all cases? */
+ int shift, prec;
+ for (shift=0; shift<32; shift++) {
+ for (prec=1; prec<16 && prec<40-shift; prec++) {
+ unsigned long mask=(0xffffUL>>(16-prec)) << shift;
+ if (it->red_shift<0 && mask==it->red_mask)
+ it->red_shift=shift, it->red_invprec=16-prec;
+ if (it->green_shift<0 && mask==it->green_mask)
+ it->green_shift=shift, it->green_invprec=16-prec;
+ if (it->blue_shift<0 && mask==it->blue_mask)
+ it->blue_shift=shift, it->blue_invprec=16-prec;
+ }
+ }
+ if (it->red_shift<0 || it->green_shift<0 || it->blue_shift<0) {
+ if (0) fprintf(stderr,"Can't figure out color space\n");
+ goto fail;
+ }
+
+ for (i=0; i<ANALOGTV_CV_MAX; i++) {
+ int intensity=pow(i/256.0, 0.8)*65535.0; /* gamma correction */
+ if (intensity>65535) intensity=65535;
+ it->red_values[i]=((intensity>>it->red_invprec)<<it->red_shift);
+ it->green_values[i]=((intensity>>it->green_invprec)<<it->green_shift);
+ it->blue_values[i]=((intensity>>it->blue_invprec)<<it->blue_shift);
+ }
+
+ }
+
+ gcv.background=get_pixel_resource(it->dpy, it->colormap,
+ "background", "Background");
+
+ it->gc = XCreateGC(it->dpy, it->window, GCBackground, &gcv);
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (it->dpy, it->gc, False);
+# endif
+ XSetWindowBackground(it->dpy, it->window, gcv.background);
+ XClearWindow(dpy,window);
+
+ analogtv_configure(it);
+
+ return it;
+
+ fail:
+ if (it) {
+ if(it->threads.count)
+ threadpool_destroy(&it->threads);
+ thread_free(it->signal_subtotals);
+ thread_free(it->rx_signal);
+ free(it);
+ }
+ return NULL;
+}
+
+void
+analogtv_release(analogtv *it)
+{
+ if (it->image) {
+ destroy_xshm_image(it->dpy, it->image, &it->shm_info);
+ it->image=NULL;
+ }
+ if (it->gc) XFreeGC(it->dpy, it->gc);
+ it->gc=NULL;
+ if (it->n_colors) XFreeColors(it->dpy, it->colormap, it->colors, it->n_colors, 0L);
+ it->n_colors=0;
+ threadpool_destroy(&it->threads);
+ thread_free(it->rx_signal);
+ thread_free(it->signal_subtotals);
+ free(it);
+}
+
+
+/*
+ First generate the I and Q reference signals, which we'll multiply
+ the input signal by to accomplish the demodulation. Normally they
+ are shifted 33 degrees from the colorburst. I think this was convenient
+ for inductor-capacitor-vacuum tube implementation.
+
+ The tint control, FWIW, just adds a phase shift to the chroma signal,
+ and the color control controls the amplitude.
+
+ In text modes (colormode==0) the system disabled the color burst, and no
+ color was detected by the monitor.
+
+ freq_error gives a mismatch between the built-in oscillator and the
+ TV's colorbust. Some II Plus machines seemed to occasionally get
+ instability problems -- the crystal oscillator was a single
+ transistor if I remember correctly -- and the frequency would vary
+ enough that the tint would change across the width of the screen.
+ The left side would be in correct tint because it had just gotten
+ resynchronized with the color burst.
+
+ If we're using a colormap, set it up.
+*/
+int
+analogtv_set_demod(analogtv *it)
+{
+ int y_levels=10,i_levels=5,q_levels=5;
+
+ /*
+ In principle, we might be able to figure out how to adjust the
+ color map frame-by-frame to get some nice color bummage. But I'm
+ terrified of changing the color map because we'll get flashing.
+
+ I can hardly believe we still have to deal with colormaps. They're
+ like having NEAR PTRs: an enormous hassle for the programmer just
+ to save on memory. They should have been deprecated by 1995 or
+ so. */
+
+ cmap_again:
+ if (it->use_cmap && !it->n_colors) {
+
+ if (it->n_colors) {
+ XFreeColors(it->dpy, it->colormap, it->colors, it->n_colors, 0L);
+ it->n_colors=0;
+ }
+
+ {
+ int yli,qli,ili;
+ for (yli=0; yli<y_levels; yli++) {
+ for (ili=0; ili<i_levels; ili++) {
+ for (qli=0; qli<q_levels; qli++) {
+ double interpy,interpi,interpq;
+ double levelmult=700.0;
+ int r,g,b;
+ XColor col;
+
+ interpy=100.0 * ((double)yli/y_levels);
+ interpi=50.0 * (((double)ili-(0.5*i_levels))/(double)i_levels);
+ interpq=50.0 * (((double)qli-(0.5*q_levels))/(double)q_levels);
+
+ r=(int)((interpy + 1.04*interpi + 0.624*interpq)*levelmult);
+ g=(int)((interpy - 0.276*interpi - 0.639*interpq)*levelmult);
+ b=(int)((interpy - 1.105*interpi + 1.729*interpq)*levelmult);
+ if (r<0) r=0;
+ if (r>65535) r=65535;
+ if (g<0) g=0;
+ if (g>65535) g=65535;
+ if (b<0) b=0;
+ if (b>65535) b=65535;
+
+#ifdef DEBUG
+ printf("%0.2f %0.2f %0.2f => %02x%02x%02x\n",
+ interpy, interpi, interpq,
+ r/256,g/256,b/256);
+#endif
+
+ col.red=r;
+ col.green=g;
+ col.blue=b;
+ col.pixel=0;
+ if (!XAllocColor(it->dpy, it->colormap, &col)) {
+ if (q_levels > y_levels*4/12)
+ q_levels--;
+ else if (i_levels > y_levels*5/12)
+ i_levels--;
+ else
+ y_levels--;
+
+ if (y_levels<2)
+ return -1;
+ goto cmap_again;
+ }
+ it->colors[it->n_colors++]=col.pixel;
+ }
+ }
+ }
+
+ it->cmap_y_levels=y_levels;
+ it->cmap_i_levels=i_levels;
+ it->cmap_q_levels=q_levels;
+ }
+ }
+
+ return 0;
+}
+
+#if 0
+unsigned int
+analogtv_line_signature(analogtv_input *input, int lineno)
+{
+ int i;
+ char *origsignal=&input->signal[(lineno+input->vsync)
+ %ANALOGTV_V][input->line_hsync[lineno]];
+ unsigned int hash=0;
+
+ /* probably lame */
+ for (i=0; i<ANALOGTV_PIC_LEN; i++) {
+ int c=origsignal[i];
+ hash = hash + (hash<<17) + c;
+ }
+
+ hash += input->line_hsync[lineno];
+ hash ^= hash >> 2;
+ /*
+ hash += input->hashnoise_times[lineno];
+ hash ^= hash >> 2;
+ */
+
+ return hash;
+}
+#endif
+
+
+/* Here we model the analog circuitry of an NTSC television.
+ Basically, it splits the signal into 3 signals: Y, I and Q. Y
+ corresponds to luminance, and you get it by low-pass filtering the
+ input signal to below 3.57 MHz.
+
+ I and Q are the in-phase and quadrature components of the 3.57 MHz
+ subcarrier. We get them by multiplying by cos(3.57 MHz*t) and
+ sin(3.57 MHz*t), and low-pass filtering. Because the eye has less
+ resolution in some colors than others, the I component gets
+ low-pass filtered at 1.5 MHz and the Q at 0.5 MHz. The I component
+ is approximately orange-blue, and Q is roughly purple-green. See
+ http://www.ntsc-tv.com for details.
+
+ We actually do an awful lot to the signal here. I suspect it would
+ make sense to wrap them all up together by calculating impulse
+ response and doing FFT convolutions.
+
+*/
+
+static void
+analogtv_ntsc_to_yiq(const analogtv *it, int lineno, const float *signal,
+ int start, int end, struct analogtv_yiq_s *it_yiq)
+{
+ enum {MAXDELAY=32};
+ int i;
+ const float *sp;
+ int phasecorr=(signal-it->rx_signal)&3;
+ struct analogtv_yiq_s *yiq;
+ int colormode;
+ float agclevel=it->agclevel;
+ float brightadd=it->brightness_control*100.0 - ANALOGTV_BLACK_LEVEL;
+ float delay[MAXDELAY+ANALOGTV_PIC_LEN], *dp;
+ float multiq2[4];
+
+ {
+
+ double cb_i=(it->line_cb_phase[lineno][(2+phasecorr)&3]-
+ it->line_cb_phase[lineno][(0+phasecorr)&3])/16.0;
+ double cb_q=(it->line_cb_phase[lineno][(3+phasecorr)&3]-
+ it->line_cb_phase[lineno][(1+phasecorr)&3])/16.0;
+
+ colormode = (cb_i * cb_i + cb_q * cb_q) > 2.8;
+
+ if (colormode) {
+ multiq2[0] = (cb_i*it->tint_i - cb_q*it->tint_q) * it->color_control;
+ multiq2[1] = (cb_q*it->tint_i + cb_i*it->tint_q) * it->color_control;
+ multiq2[2]=-multiq2[0];
+ multiq2[3]=-multiq2[1];
+ }
+ }
+
+#if 0
+ if (lineno==100) {
+ printf("multiq = [%0.3f %0.3f %0.3f %0.3f] ",
+ it->multiq[60],it->multiq[61],it->multiq[62],it->multiq[63]);
+ printf("it->line_cb_phase = [%0.3f %0.3f %0.3f %0.3f]\n",
+ it->line_cb_phase[lineno][0],it->line_cb_phase[lineno][1],
+ it->line_cb_phase[lineno][2],it->line_cb_phase[lineno][3]);
+ printf("multiq2 = [%0.3f %0.3f %0.3f %0.3f]\n",
+ multiq2[0],multiq2[1],multiq2[2],multiq2[3]);
+ }
+#endif
+
+ dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
+ for (i=0; i<5; i++) dp[i]=0.0f;
+
+ assert(start>=0);
+ assert(end < ANALOGTV_PIC_LEN+10);
+
+ dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
+ for (i=0; i<24; i++) dp[i]=0.0;
+ for (i=start, yiq=it_yiq+start, sp=signal+start;
+ i<end;
+ i++, dp--, yiq++, sp++) {
+
+ /* Now filter them. These are infinite impulse response filters
+ calculated by the script at
+ http://www-users.cs.york.ac.uk/~fisher/mkfilter. This is
+ fixed-point integer DSP, son. No place for wimps. We do it in
+ integer because you can count on integer being faster on most
+ CPUs. We care about speed because we need to recalculate every
+ time we blink text, and when we spew random bytes into screen
+ memory. This is roughly 16.16 fixed point arithmetic, but we
+ scale some filter values up by a few bits to avoid some nasty
+ precision errors. */
+
+ /* Filter Y with a 4-pole low-pass Butterworth filter at 3.5 MHz
+ with an extra zero at 3.5 MHz, from
+ mkfilter -Bu -Lp -o 4 -a 2.1428571429e-01 0 -Z 2.5e-01 -l
+ Delay about 2 */
+
+ dp[0] = sp[0] * 0.0469904257251935f * agclevel;
+ dp[8] = (+1.0f*(dp[6]+dp[0])
+ +4.0f*(dp[5]+dp[1])
+ +7.0f*(dp[4]+dp[2])
+ +8.0f*(dp[3])
+ -0.0176648f*dp[12]
+ -0.4860288f*dp[10]);
+ yiq->y = dp[8] + brightadd;
+ }
+
+ if (colormode) {
+ dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
+ for (i=0; i<27; i++) dp[i]=0.0;
+
+ for (i=start, yiq=it_yiq+start, sp=signal+start;
+ i<end;
+ i++, dp--, yiq++, sp++) {
+ float sig=*sp;
+
+ /* Filter I and Q with a 3-pole low-pass Butterworth filter at
+ 1.5 MHz with an extra zero at 3.5 MHz, from
+ mkfilter -Bu -Lp -o 3 -a 1.0714285714e-01 0 -Z 2.5000000000e-01 -l
+ Delay about 3.
+ */
+
+ dp[0] = sig*multiq2[i&3] * 0.0833333333333f;
+ yiq->i=dp[8] = (dp[5] + dp[0]
+ +3.0f*(dp[4] + dp[1])
+ +4.0f*(dp[3] + dp[2])
+ -0.3333333333f * dp[10]);
+
+ dp[16] = sig*multiq2[(i+3)&3] * 0.0833333333333f;
+ yiq->q=dp[24] = (dp[16+5] + dp[16+0]
+ +3.0f*(dp[16+4] + dp[16+1])
+ +4.0f*(dp[16+3] + dp[16+2])
+ -0.3333333333f * dp[24+2]);
+ }
+ } else {
+ for (i=start, yiq=it_yiq+start; i<end; i++, yiq++) {
+ yiq->i = yiq->q = 0.0f;
+ }
+ }
+}
+
+void
+analogtv_setup_teletext(analogtv_input *input)
+{
+ int x,y;
+ int teletext=ANALOGTV_BLACK_LEVEL;
+
+ /* Teletext goes in line 21. But I suspect there are other things
+ in the vertical retrace interval */
+
+ for (y=19; y<22; y++) {
+ for (x=ANALOGTV_PIC_START; x<ANALOGTV_PIC_END; x++) {
+ if ((x&7)==0) {
+ teletext=(random()&1) ? ANALOGTV_WHITE_LEVEL : ANALOGTV_BLACK_LEVEL;
+ }
+ input->signal[y][x]=teletext;
+ }
+ }
+}
+
+void
+analogtv_setup_frame(analogtv *it)
+{
+ /* int i,x,y;*/
+
+ it->redraw_all=0;
+
+ if (it->flutter_horiz_desync) {
+ /* Horizontal sync during vertical sync instability. */
+ it->horiz_desync += -0.10*(it->horiz_desync-3.0) +
+ ((int)(random()&0xff)-0x80) *
+ ((int)(random()&0xff)-0x80) *
+ ((int)(random()&0xff)-0x80) * 0.000001;
+ }
+
+ /* it wasn't used
+ for (i=0; i<ANALOGTV_V; i++) {
+ it->hashnoise_times[i]=0;
+ }
+ */
+
+ /* let's leave it to process shrinkpulse */
+ if (it->hashnoise_enable && !it->hashnoise_on) {
+ if (random()%10000==0) {
+ it->hashnoise_on=1;
+ it->shrinkpulse=random()%ANALOGTV_V;
+ }
+ }
+ if (random()%1000==0) {
+ it->hashnoise_on=0;
+ }
+
+#if 0 /* never used */
+ if (it->hashnoise_on) {
+ it->hashnoise_rpm += (15000.0 - it->hashnoise_rpm)*0.05 +
+ ((int)(random()%2000)-1000)*0.1;
+ } else {
+ it->hashnoise_rpm -= 100 + 0.01*it->hashnoise_rpm;
+ if (it->hashnoise_rpm<0.0) it->hashnoise_rpm=0.0;
+ }
+ if (it->hashnoise_rpm > 0.0) {
+ int hni;
+ double hni_double;
+ int hnc=it->hashnoise_counter; /* in 24.8 format */
+
+ /* Convert rpm of a 16-pole motor into dots in 24.8 format */
+ hni_double = ANALOGTV_V * ANALOGTV_H * 256.0 /
+ (it->hashnoise_rpm * 16.0 / 60.0 / 60.0);
+ hni = (hni_double <= INT_MAX) ? (int)hni_double : INT_MAX;
+
+ while (hnc < (ANALOGTV_V * ANALOGTV_H)<<8) {
+ y=(hnc>>8)/ANALOGTV_H;
+ x=(hnc>>8)%ANALOGTV_H;
+
+ if (x>0 && x<ANALOGTV_H - ANALOGTV_HASHNOISE_LEN) {
+ it->hashnoise_times[y]=x;
+ }
+ /* hnc += hni + (int)(random()%65536)-32768; */
+ {
+ hnc += (int)(random()%65536)-32768;
+ if ((hnc >= 0) && (INT_MAX - hnc < hni)) break;
+ hnc += hni;
+ }
+ }
+ }
+#endif /* 0 */
+
+/* hnc -= (ANALOGTV_V * ANALOGTV_H)<<8;*/
+
+
+ if (it->rx_signal_level != 0.0)
+ it->agclevel = 1.0/it->rx_signal_level;
+
+
+#ifdef DEBUG2
+ printf("filter: ");
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ printf(" %0.3f",it->ghostfir[i]);
+ }
+ printf(" siglevel=%g agc=%g\n", siglevel, it->agclevel);
+#endif
+}
+
+void
+analogtv_setup_sync(analogtv_input *input, int do_cb, int do_ssavi)
+{
+ int i,lineno,vsync;
+ signed char *sig;
+
+ int synclevel = do_ssavi ? ANALOGTV_WHITE_LEVEL : ANALOGTV_SYNC_LEVEL;
+
+ for (lineno=0; lineno<ANALOGTV_V; lineno++) {
+ vsync=lineno>=3 && lineno<7;
+
+ sig=input->signal[lineno];
+
+ i=ANALOGTV_SYNC_START;
+ if (vsync) {
+ while (i<ANALOGTV_BP_START) sig[i++]=ANALOGTV_BLANK_LEVEL;
+ while (i<ANALOGTV_H) sig[i++]=synclevel;
+ } else {
+ while (i<ANALOGTV_BP_START) sig[i++]=synclevel;
+ while (i<ANALOGTV_PIC_START) sig[i++]=ANALOGTV_BLANK_LEVEL;
+ while (i<ANALOGTV_FP_START) sig[i++]=ANALOGTV_BLACK_LEVEL;
+ }
+ while (i<ANALOGTV_H) sig[i++]=ANALOGTV_BLANK_LEVEL;
+
+ if (do_cb) {
+ /* 9 cycles of colorburst */
+ for (i=ANALOGTV_CB_START; i<ANALOGTV_CB_START+36; i+=4) {
+ sig[i+1] += ANALOGTV_CB_LEVEL;
+ sig[i+3] -= ANALOGTV_CB_LEVEL;
+ }
+ }
+ }
+}
+
+static void
+analogtv_sync(analogtv *it)
+{
+ int cur_hsync=it->cur_hsync;
+ int cur_vsync=it->cur_vsync;
+ int lineno = 0;
+ int i,j;
+ float osc,filt;
+ float *sp;
+ float cbfc=1.0f/128.0f;
+
+/* sp = it->rx_signal + lineno*ANALOGTV_H + cur_hsync;*/
+ for (i=-32; i<32; i++) {
+ lineno = (cur_vsync + i + ANALOGTV_V) % ANALOGTV_V;
+ sp = it->rx_signal + lineno*ANALOGTV_H;
+ filt=0.0f;
+ for (j=0; j<ANALOGTV_H; j+=ANALOGTV_H/16) {
+ filt += sp[j];
+ }
+ filt *= it->agclevel;
+
+ osc = (float)(ANALOGTV_V+i)/(float)ANALOGTV_V;
+
+ if (osc >= 1.05f+0.0002f * filt) break;
+ }
+ cur_vsync = (cur_vsync + i + ANALOGTV_V) % ANALOGTV_V;
+
+ for (lineno=0; lineno<ANALOGTV_V; lineno++) {
+
+ if (lineno>5 && lineno<ANALOGTV_V-3) { /* ignore vsync interval */
+ unsigned lineno2 = (lineno + cur_vsync + ANALOGTV_V)%ANALOGTV_V;
+ if (!lineno2) lineno2 = ANALOGTV_V;
+ sp = it->rx_signal + lineno2*ANALOGTV_H + cur_hsync;
+ for (i=-8; i<8; i++) {
+ osc = (float)(ANALOGTV_H+i)/(float)ANALOGTV_H;
+ filt=(sp[i-3]+sp[i-2]+sp[i-1]+sp[i]) * it->agclevel;
+
+ if (osc >= 1.005f + 0.0001f*filt) break;
+ }
+ cur_hsync = (cur_hsync + i + ANALOGTV_H) % ANALOGTV_H;
+ }
+
+ it->line_hsync[lineno]=(cur_hsync + ANALOGTV_PIC_START +
+ ANALOGTV_H) % ANALOGTV_H;
+
+ /* Now look for the colorburst, which is a few cycles after the H
+ sync pulse, and store its phase.
+ The colorburst is 9 cycles long, and we look at the middle 5
+ cycles.
+ */
+
+ if (lineno>15) {
+ sp = it->rx_signal + lineno*ANALOGTV_H + (cur_hsync&~3);
+ for (i=ANALOGTV_CB_START+8; i<ANALOGTV_CB_START+36-8; i++) {
+ it->cb_phase[i&3] = it->cb_phase[i&3]*(1.0f-cbfc) +
+ sp[i]*it->agclevel*cbfc;
+ }
+ }
+
+ {
+ float tot=0.1f;
+ float cbgain;
+
+ for (i=0; i<4; i++) {
+ tot += it->cb_phase[i]*it->cb_phase[i];
+ }
+ cbgain = 32.0f/sqrtf(tot);
+
+ for (i=0; i<4; i++) {
+ it->line_cb_phase[lineno][i]=it->cb_phase[i]*cbgain;
+ }
+ }
+
+#ifdef DEBUG
+ if (0) printf("hs=%d cb=[%0.3f %0.3f %0.3f %0.3f]\n",
+ cur_hsync,
+ it->cb_phase[0], it->cb_phase[1],
+ it->cb_phase[2], it->cb_phase[3]);
+#endif
+
+ /* if (random()%2000==0) cur_hsync=random()%ANALOGTV_H; */
+ }
+
+ it->cur_hsync = cur_hsync;
+ it->cur_vsync = cur_vsync;
+}
+
+static double
+analogtv_levelmult(const analogtv *it, int level)
+{
+ static const double levelfac[3]={-7.5, 5.5, 24.5};
+ return (40.0 + levelfac[level]*puramp(it, 3.0, 6.0, 1.0))/256.0;
+}
+
+static int
+analogtv_level(const analogtv *it, int y, int ytop, int ybot)
+{
+ int level;
+ if (ybot-ytop>=7) {
+ if (y==ytop || y==ybot-1) level=0;
+ else if (y==ytop+1 || y==ybot-2) level=1;
+ else level=2;
+ }
+ else if (ybot-ytop>=5) {
+ if (y==ytop || y==ybot-1) level=0;
+ else level=2;
+ }
+ else if (ybot-ytop>=3) {
+ if (y==ytop) level=0;
+ else level=2;
+ }
+ else {
+ level=2;
+ }
+ return level;
+}
+
+/*
+ The point of this stuff is to ensure that when useheight is not a
+ multiple of VISLINES so that TV scan lines map to different numbers
+ of vertical screen pixels, the total brightness of each scan line
+ remains the same.
+ ANALOGTV_MAX_LINEHEIGHT corresponds to 2400 vertical pixels, beyond which
+ it interpolates extra black lines.
+ */
+
+static void
+analogtv_setup_levels(analogtv *it, double avgheight)
+{
+ int i,height;
+ static const double levelfac[3]={-7.5, 5.5, 24.5};
+
+ for (height=0; height<avgheight+2.0 && height<=ANALOGTV_MAX_LINEHEIGHT; height++) {
+
+ for (i=0; i<height; i++) {
+ it->leveltable[height][i].index = 2;
+ }
+
+ if (avgheight>=3) {
+ it->leveltable[height][0].index=0;
+ }
+ if (avgheight>=5) {
+ if (height >= 1) it->leveltable[height][height-1].index=0;
+ }
+ if (avgheight>=7) {
+ it->leveltable[height][1].index=1;
+ if (height >= 2) it->leveltable[height][height-2].index=1;
+ }
+
+ for (i=0; i<height; i++) {
+ it->leveltable[height][i].value =
+ (40.0 + levelfac[it->leveltable[height][i].index]*puramp(it, 3.0, 6.0, 1.0)) / 256.0;
+ }
+
+ }
+}
+
+static void rnd_combine(unsigned *a0, unsigned *c0, unsigned a1, unsigned c1)
+{
+ *a0 = (*a0 * a1) & 0xffffffffu;
+ *c0 = (c1 + a1 * *c0) & 0xffffffffu;
+}
+
+static void rnd_seek_ac(unsigned *a, unsigned *c, unsigned dist)
+{
+ unsigned int a1 = *a, c1 = *c;
+ *a = 1, *c = 0;
+
+ while(dist)
+ {
+ if(dist & 1)
+ rnd_combine(a, c, a1, c1);
+ dist >>= 1;
+ rnd_combine(&a1, &c1, a1, c1);
+ }
+}
+
+static unsigned int rnd_seek(unsigned a, unsigned c, unsigned rnd, unsigned dist)
+{
+ rnd_seek_ac(&a, &c, dist);
+ return a * rnd + c;
+}
+
+static void analogtv_init_signal(const analogtv *it, double noiselevel, unsigned start, unsigned end)
+{
+ float *ps=it->rx_signal + start;
+ float *pe=it->rx_signal + end;
+ float *p=ps;
+ unsigned int fastrnd=rnd_seek(FASTRND_A, FASTRND_C, it->random0, start);
+ unsigned int fastrnd_offset;
+ float nm1,nm2;
+ float noisemul = sqrt(noiselevel*150)/(float)0x7fffffff;
+
+ fastrnd_offset = fastrnd - 0x7fffffff;
+ nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
+ while (p != pe) {
+ nm2=nm1;
+ fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
+ fastrnd_offset = fastrnd - 0x7fffffff;
+ nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
+ *p++ = nm1*nm2;
+ }
+}
+
+static void analogtv_add_signal(const analogtv *it, const analogtv_reception *rec, unsigned start, unsigned end, int ec)
+{
+ analogtv_input *inp=rec->input;
+ float *ps=it->rx_signal + start;
+ float *pe=it->rx_signal + end;
+ float *p=ps;
+ signed char *ss=&inp->signal[0][0];
+ signed char *se=&inp->signal[0][0] + ANALOGTV_SIGNAL_LEN;
+ signed char *s=ss + ((start + (unsigned)rec->ofs) % ANALOGTV_SIGNAL_LEN);
+ signed char *s2;
+ int i;
+ float level=rec->level;
+ float hfloss=rec->hfloss;
+ unsigned int fastrnd=rnd_seek(FASTRND_A, FASTRND_C, it->random1, start);
+ float dp[5];
+
+ const float noise_decay = 0.99995f;
+ float noise_ampl = 1.3f * powf(noise_decay, start);
+
+ if (ec > end)
+ ec = end;
+
+ /* assert((se-ss)%4==0 && (se-s)%4==0); */
+
+ for (i = start; i < ec; i++) { /* Sometimes start > ec. */
+
+ /* Do a big noisy transition. We can make the transition noise of
+ high constant strength regardless of signal strength.
+
+ There are two separate state machines. here, One is the noise
+ process and the other is the
+
+ We don't bother with the FIR filter here
+ */
+
+ float sig0=(float)s[0];
+ unsigned int fastrnd_offset = fastrnd - 0x7fffffff;
+ float noise = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * (50.0f/(float)0x7fffffff);
+ fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
+
+ p[0] += sig0 * level * (1.0f - noise_ampl) + noise * noise_ampl;
+
+ noise_ampl *= noise_decay;
+
+ p++;
+ s++;
+ if (s>=se) s=ss;
+ }
+
+ dp[0]=0.0;
+ s2 = s;
+ for (i=1; i<5; i++) {
+ s2 -= 4;
+ if (s2 < ss)
+ s2 += ANALOGTV_SIGNAL_LEN;
+ dp[i] = (float)((int)s2[0]+(int)s2[1]+(int)s2[2]+(int)s2[3]);
+ }
+
+ assert(p <= pe);
+ assert(!((pe - p) % 4));
+ while (p != pe) {
+ float sig0,sig1,sig2,sig3,sigr;
+
+ sig0=(float)s[0];
+ sig1=(float)s[1];
+ sig2=(float)s[2];
+ sig3=(float)s[3];
+
+ dp[0]=sig0+sig1+sig2+sig3;
+
+ /* Get the video out signal, and add some ghosting, typical of RF
+ monitor cables. This corresponds to a pretty long cable, but
+ looks right to me.
+ */
+
+ sigr=(dp[1]*rec->ghostfir[0] + dp[2]*rec->ghostfir[1] +
+ dp[3]*rec->ghostfir[2] + dp[4]*rec->ghostfir[3]);
+ dp[4]=dp[3]; dp[3]=dp[2]; dp[2]=dp[1]; dp[1]=dp[0];
+
+ p[0] += (sig0+sigr + sig2*hfloss) * level;
+ p[1] += (sig1+sigr + sig3*hfloss) * level;
+ p[2] += (sig2+sigr + sig0*hfloss) * level;
+ p[3] += (sig3+sigr + sig1*hfloss) * level;
+
+ p += 4;
+ s += 4;
+ if (s>=se) s = ss + (s-se);
+ }
+
+ assert(p == pe);
+}
+
+static void analogtv_thread_add_signals(void *thread_raw)
+{
+ const analogtv_thread *thread = (analogtv_thread *)thread_raw;
+ const analogtv *it = thread->it;
+ unsigned i, j;
+ unsigned subtotal_end;
+
+ unsigned start = thread->signal_start;
+ while(start != thread->signal_end)
+ {
+ float *p;
+
+ /* Work on 8 KB blocks; these should fit in L1. */
+ /* (Though it doesn't seem to help much on my system.) */
+ unsigned end = start + 2048;
+ if(end > thread->signal_end)
+ end = thread->signal_end;
+
+ analogtv_init_signal (it, it->noiselevel, start, end);
+
+ for (i = 0; i != it->rec_count; ++i) {
+ analogtv_add_signal (it, it->recs[i], start, end,
+ !i ? it->channel_change_cycles : 0);
+ }
+
+ assert (!(start % ANALOGTV_SUBTOTAL_LEN));
+ assert (!(end % ANALOGTV_SUBTOTAL_LEN));
+
+ p = it->rx_signal + start;
+ subtotal_end = end / ANALOGTV_SUBTOTAL_LEN;
+ for (i = start / ANALOGTV_SUBTOTAL_LEN; i != subtotal_end; ++i) {
+ float sum = p[0];
+ for (j = 1; j != ANALOGTV_SUBTOTAL_LEN; ++j)
+ sum += p[j];
+ it->signal_subtotals[i] = sum;
+ p += ANALOGTV_SUBTOTAL_LEN;
+ }
+
+ start = end;
+ }
+}
+
+static int analogtv_get_line(const analogtv *it, int lineno, int *slineno,
+ int *ytop, int *ybot, unsigned *signal_offset)
+{
+ *slineno=lineno-ANALOGTV_TOP;
+ *ytop=(int)((*slineno*it->useheight/ANALOGTV_VISLINES -
+ it->useheight/2)*it->puheight) + it->useheight/2;
+ *ybot=(int)(((*slineno+1)*it->useheight/ANALOGTV_VISLINES -
+ it->useheight/2)*it->puheight) + it->useheight/2;
+#if 0
+ int linesig=analogtv_line_signature(input,lineno)
+ + it->hashnoise_times[lineno];
+#endif
+ *signal_offset = ((lineno+it->cur_vsync+ANALOGTV_V) % ANALOGTV_V) * ANALOGTV_H +
+ it->line_hsync[lineno];
+
+ if (*ytop==*ybot) return 0;
+ if (*ybot<0 || *ytop>it->useheight) return 0;
+ if (*ytop<0) *ytop=0;
+ if (*ybot>it->useheight) *ybot=it->useheight;
+
+ if (*ybot > *ytop+ANALOGTV_MAX_LINEHEIGHT) *ybot=*ytop+ANALOGTV_MAX_LINEHEIGHT;
+ return 1;
+}
+
+static void
+analogtv_blast_imagerow(const analogtv *it,
+ float *rgbf, float *rgbf_end,
+ int ytop, int ybot)
+{
+ int i,j,x,y;
+ float *rpf;
+ char *level_copyfrom[3];
+ int xrepl=it->xrepl;
+ unsigned lineheight = ybot - ytop;
+ if (lineheight > ANALOGTV_MAX_LINEHEIGHT) lineheight = ANALOGTV_MAX_LINEHEIGHT;
+ for (i=0; i<3; i++) level_copyfrom[i]=NULL;
+
+ for (y=ytop; y<ybot; y++) {
+ char *rowdata=it->image->data + y*it->image->bytes_per_line;
+ unsigned line = y-ytop;
+
+ int level=it->leveltable[lineheight][line].index;
+ float levelmult=it->leveltable[lineheight][line].value;
+
+ /* Fast special cases to avoid the slow XPutPixel. Ugh. It goes to show
+ why standard graphics sw has to be fast, or else people will have to
+ work around it and risk incompatibility. The quickdraw folks
+ understood this. The other answer would be for X11 to have fewer
+ formats for bitm.. oh, never mind. If neither of these cases work
+ (they probably cover 99% of setups) it falls back on the Xlib
+ routines. */
+
+ if (level_copyfrom[level]) {
+ memcpy(rowdata, level_copyfrom[level], it->image->bytes_per_line);
+ }
+ else {
+ level_copyfrom[level] = rowdata;
+
+ if (0) {
+ }
+ else if (it->image->format==ZPixmap &&
+ it->image->bits_per_pixel==32 &&
+ sizeof(unsigned int)==4 &&
+ it->image->byte_order==localbyteorder) {
+ /* int is more likely to be 32 bits than long */
+ unsigned int *pixelptr=(unsigned int *)rowdata;
+ unsigned int pix;
+
+ for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
+ int ntscri=rpf[0]*levelmult;
+ int ntscgi=rpf[1]*levelmult;
+ int ntscbi=rpf[2]*levelmult;
+ if (ntscri>=ANALOGTV_CV_MAX) ntscri=ANALOGTV_CV_MAX-1;
+ if (ntscgi>=ANALOGTV_CV_MAX) ntscgi=ANALOGTV_CV_MAX-1;
+ if (ntscbi>=ANALOGTV_CV_MAX) ntscbi=ANALOGTV_CV_MAX-1;
+ pix = (it->red_values[ntscri] |
+ it->green_values[ntscgi] |
+ it->blue_values[ntscbi]);
+ pixelptr[0] = pix;
+ if (xrepl>=2) {
+ pixelptr[1] = pix;
+ if (xrepl>=3) pixelptr[2] = pix;
+ }
+ pixelptr+=xrepl;
+ }
+ }
+ else if (it->image->format==ZPixmap &&
+ it->image->bits_per_pixel==16 &&
+ sizeof(unsigned short)==2 &&
+ float_extraction_works &&
+ it->image->byte_order==localbyteorder) {
+ unsigned short *pixelptr=(unsigned short *)rowdata;
+ float r2,g2,b2;
+ float_extract_t r1,g1,b1;
+ unsigned short pix;
+
+ for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
+ r2=rpf[0]; g2=rpf[1]; b2=rpf[2];
+ r1.f=r2 * levelmult+float_low8_ofs;
+ g1.f=g2 * levelmult+float_low8_ofs;
+ b1.f=b2 * levelmult+float_low8_ofs;
+ pix = (it->red_values[r1.i & 0x3ff] |
+ it->green_values[g1.i & 0x3ff] |
+ it->blue_values[b1.i & 0x3ff]);
+ pixelptr[0] = pix;
+ if (xrepl>=2) {
+ pixelptr[1] = pix;
+ if (xrepl>=3) pixelptr[2] = pix;
+ }
+ pixelptr+=xrepl;
+ }
+ }
+ else if (it->image->format==ZPixmap &&
+ it->image->bits_per_pixel==16 &&
+ sizeof(unsigned short)==2 &&
+ it->image->byte_order==localbyteorder) {
+ unsigned short *pixelptr=(unsigned short *)rowdata;
+ unsigned short pix;
+
+ for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
+ int r1=rpf[0] * levelmult;
+ int g1=rpf[1] * levelmult;
+ int b1=rpf[2] * levelmult;
+ if (r1>=ANALOGTV_CV_MAX) r1=ANALOGTV_CV_MAX-1;
+ if (g1>=ANALOGTV_CV_MAX) g1=ANALOGTV_CV_MAX-1;
+ if (b1>=ANALOGTV_CV_MAX) b1=ANALOGTV_CV_MAX-1;
+ pix = it->red_values[r1] | it->green_values[g1] | it->blue_values[b1];
+ pixelptr[0] = pix;
+ if (xrepl>=2) {
+ pixelptr[1] = pix;
+ if (xrepl>=3) pixelptr[2] = pix;
+ }
+ pixelptr+=xrepl;
+ }
+ }
+ else {
+ for (x=0, rpf=rgbf; rpf!=rgbf_end ; x++, rpf+=3) {
+ int ntscri=rpf[0]*levelmult;
+ int ntscgi=rpf[1]*levelmult;
+ int ntscbi=rpf[2]*levelmult;
+ if (ntscri>=ANALOGTV_CV_MAX) ntscri=ANALOGTV_CV_MAX-1;
+ if (ntscgi>=ANALOGTV_CV_MAX) ntscgi=ANALOGTV_CV_MAX-1;
+ if (ntscbi>=ANALOGTV_CV_MAX) ntscbi=ANALOGTV_CV_MAX-1;
+ for (j=0; j<xrepl; j++) {
+ XPutPixel(it->image, x*xrepl + j, y,
+ it->red_values[ntscri] | it->green_values[ntscgi] |
+ it->blue_values[ntscbi]);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void analogtv_thread_draw_lines(void *thread_raw)
+{
+ const analogtv_thread *thread = (analogtv_thread *)thread_raw;
+ const analogtv *it = thread->it;
+
+ int lineno;
+
+ float *raw_rgb_start;
+ float *raw_rgb_end;
+ raw_rgb_start=(float *)calloc(it->subwidth*3, sizeof(float));
+
+ if (! raw_rgb_start) return;
+
+ raw_rgb_end=raw_rgb_start+3*it->subwidth;
+
+ for (lineno=ANALOGTV_TOP + thread->thread_id;
+ lineno<ANALOGTV_BOT;
+ lineno += it->threads.count) {
+ int i,j,x,y;
+
+ int slineno, ytop, ybot;
+ unsigned signal_offset;
+
+ const float *signal;
+
+ int scanstart_i,scanend_i,squishright_i,squishdiv,pixrate;
+ float *rgb_start, *rgb_end;
+ float pixbright;
+ int pixmultinc;
+
+ float *rrp;
+
+ struct analogtv_yiq_s yiq[ANALOGTV_PIC_LEN+10];
+
+ if (! analogtv_get_line(it, lineno, &slineno, &ytop, &ybot,
+ &signal_offset))
+ continue;
+
+ signal = it->rx_signal + signal_offset;
+
+ {
+
+ float bloomthisrow,shiftthisrow;
+ float viswidth,middle;
+ float scanwidth;
+ int scw,scl,scr;
+
+ bloomthisrow = -10.0f * it->crtload[lineno];
+ if (bloomthisrow<-10.0f) bloomthisrow=-10.0f;
+ if (bloomthisrow>2.0f) bloomthisrow=2.0f;
+ if (slineno<16) {
+ shiftthisrow=it->horiz_desync * (expf(-0.17f*slineno) *
+ (0.7f+cosf(slineno*0.6f)));
+ } else {
+ shiftthisrow=0.0f;
+ }
+
+ viswidth=ANALOGTV_PIC_LEN * 0.79f - 5.0f*bloomthisrow;
+ middle=ANALOGTV_PIC_LEN/2 - shiftthisrow;
+
+ scanwidth=it->width_control * puramp(it, 0.5f, 0.3f, 1.0f);
+
+ scw=it->subwidth*scanwidth;
+ if (scw>it->subwidth) scw=it->usewidth;
+ scl=it->subwidth/2 - scw/2;
+ scr=it->subwidth/2 + scw/2;
+
+ pixrate=(int)((viswidth*65536.0f*1.0f)/it->subwidth)/scanwidth;
+ scanstart_i=(int)((middle-viswidth*0.5f)*65536.0f);
+ scanend_i=(ANALOGTV_PIC_LEN-1)*65536;
+ squishright_i=(int)((middle+viswidth*(0.25f + 0.25f*puramp(it, 2.0f, 0.0f, 1.1f)
+ - it->squish_control)) *65536.0f);
+ squishdiv=it->subwidth/15;
+
+ rgb_start=raw_rgb_start+scl*3;
+ rgb_end=raw_rgb_start+scr*3;
+
+ assert(scanstart_i>=0);
+
+#ifdef DEBUG
+ if (0) printf("scan %d: %0.3f %0.3f %0.3f scl=%d scr=%d scw=%d\n",
+ lineno,
+ scanstart_i/65536.0f,
+ squishright_i/65536.0f,
+ scanend_i/65536.0f,
+ scl,scr,scw);
+#endif
+ }
+
+ if (it->use_cmap) {
+ for (y=ytop; y<ybot; y++) {
+ int level=analogtv_level(it, y, ytop, ybot);
+ float levelmult=analogtv_levelmult(it, level);
+ float levelmult_y = levelmult * it->contrast_control
+ * puramp(it, 1.0f, 0.0f, 1.0f) / (0.5f+0.5f*it->puheight) * 0.070f;
+ float levelmult_iq = levelmult * 0.090f;
+
+ analogtv_ntsc_to_yiq(it, lineno, signal,
+ (scanstart_i>>16)-10, (scanend_i>>16)+10, yiq);
+ pixmultinc=pixrate;
+
+ x=0;
+ i=scanstart_i;
+ while (i<0 && x<it->usewidth) {
+ XPutPixel(it->image, x, y, it->colors[0]);
+ i+=pixmultinc;
+ x++;
+ }
+
+ while (i<scanend_i && x<it->usewidth) {
+ float pixfrac=(i&0xffff)/65536.0f;
+ float invpixfrac=(1.0f-pixfrac);
+ int pati=i>>16;
+ int yli,ili,qli,cmi;
+
+ float interpy=(yiq[pati].y*invpixfrac
+ + yiq[pati+1].y*pixfrac) * levelmult_y;
+ float interpi=(yiq[pati].i*invpixfrac
+ + yiq[pati+1].i*pixfrac) * levelmult_iq;
+ float interpq=(yiq[pati].q*invpixfrac
+ + yiq[pati+1].q*pixfrac) * levelmult_iq;
+
+ yli = (int)(interpy * it->cmap_y_levels);
+ ili = (int)((interpi+0.5f) * it->cmap_i_levels);
+ qli = (int)((interpq+0.5f) * it->cmap_q_levels);
+ if (yli<0) yli=0;
+ if (yli>=it->cmap_y_levels) yli=it->cmap_y_levels-1;
+ if (ili<0) ili=0;
+ if (ili>=it->cmap_i_levels) ili=it->cmap_i_levels-1;
+ if (qli<0) qli=0;
+ if (qli>=it->cmap_q_levels) qli=it->cmap_q_levels-1;
+
+ cmi=qli + it->cmap_i_levels*(ili + it->cmap_q_levels*yli);
+
+#ifdef DEBUG
+ if ((random()%65536)==0) {
+ printf("%0.3f %0.3f %0.3f => %d %d %d => %d\n",
+ interpy, interpi, interpq,
+ yli, ili, qli,
+ cmi);
+ }
+#endif
+
+ for (j=0; j<it->xrepl; j++) {
+ XPutPixel(it->image, x, y,
+ it->colors[cmi]);
+ x++;
+ }
+ if (i >= squishright_i) {
+ pixmultinc += pixmultinc/squishdiv;
+ }
+ i+=pixmultinc;
+ }
+ while (x<it->usewidth) {
+ XPutPixel(it->image, x, y, it->colors[0]);
+ x++;
+ }
+ }
+ }
+ else {
+ analogtv_ntsc_to_yiq(it, lineno, signal,
+ (scanstart_i>>16)-10, (scanend_i>>16)+10, yiq);
+
+ pixbright=it->contrast_control * puramp(it, 1.0f, 0.0f, 1.0f)
+ / (0.5f+0.5f*it->puheight) * 1024.0f/100.0f;
+ pixmultinc=pixrate;
+ i=scanstart_i; rrp=rgb_start;
+ while (i<0 && rrp!=rgb_end) {
+ rrp[0]=rrp[1]=rrp[2]=0;
+ i+=pixmultinc;
+ rrp+=3;
+ }
+ while (i<scanend_i && rrp!=rgb_end) {
+ float pixfrac=(i&0xffff)/65536.0f;
+ float invpixfrac=1.0f-pixfrac;
+ int pati=i>>16;
+ float r,g,b;
+
+ float interpy=(yiq[pati].y*invpixfrac + yiq[pati+1].y*pixfrac);
+ float interpi=(yiq[pati].i*invpixfrac + yiq[pati+1].i*pixfrac);
+ float interpq=(yiq[pati].q*invpixfrac + yiq[pati+1].q*pixfrac);
+
+ /*
+ According to the NTSC spec, Y,I,Q are generated as:
+
+ y=0.30 r + 0.59 g + 0.11 b
+ i=0.60 r - 0.28 g - 0.32 b
+ q=0.21 r - 0.52 g + 0.31 b
+
+ So if you invert the implied 3x3 matrix you get what standard
+ televisions implement with a bunch of resistors (or directly in the
+ CRT -- don't ask):
+
+ r = y + 0.948 i + 0.624 q
+ g = y - 0.276 i - 0.639 q
+ b = y - 1.105 i + 1.729 q
+ */
+
+ r=(interpy + 0.948f*interpi + 0.624f*interpq) * pixbright;
+ g=(interpy - 0.276f*interpi - 0.639f*interpq) * pixbright;
+ b=(interpy - 1.105f*interpi + 1.729f*interpq) * pixbright;
+ if (r<0.0f) r=0.0f;
+ if (g<0.0f) g=0.0f;
+ if (b<0.0f) b=0.0f;
+ rrp[0]=r;
+ rrp[1]=g;
+ rrp[2]=b;
+
+ if (i>=squishright_i) {
+ pixmultinc += pixmultinc/squishdiv;
+ pixbright += pixbright/squishdiv/2;
+ }
+ i+=pixmultinc;
+ rrp+=3;
+ }
+ while (rrp != rgb_end) {
+ rrp[0]=rrp[1]=rrp[2]=0.0f;
+ rrp+=3;
+ }
+
+ analogtv_blast_imagerow(it, raw_rgb_start, raw_rgb_end,
+ ytop,ybot);
+ }
+ }
+
+ free(raw_rgb_start);
+}
+
+void
+analogtv_draw(analogtv *it, double noiselevel,
+ const analogtv_reception *const *recs, unsigned rec_count)
+{
+ int i,lineno;
+ /* int bigloadchange,drawcount;*/
+ double baseload;
+ int overall_top, overall_bot;
+
+ /* AnalogTV isn't very interesting if there isn't enough RAM. */
+ if (!it->image)
+ return;
+
+ it->rx_signal_level = noiselevel;
+ for (i = 0; i != rec_count; ++i) {
+ const analogtv_reception *rec = recs[i];
+ double level = rec->level;
+ analogtv_input *inp=rec->input;
+
+ it->rx_signal_level =
+ sqrt(it->rx_signal_level * it->rx_signal_level +
+ (level * level * (1.0 + 4.0*(rec->ghostfir[0] + rec->ghostfir[1] +
+ rec->ghostfir[2] + rec->ghostfir[3]))));
+
+ /* duplicate the first line into the Nth line to ease wraparound computation */
+ memcpy(inp->signal[ANALOGTV_V], inp->signal[0],
+ ANALOGTV_H * sizeof(inp->signal[0][0]));
+ }
+
+ analogtv_setup_frame(it);
+ analogtv_set_demod(it);
+
+ it->random0 = random();
+ it->random1 = random();
+ it->noiselevel = noiselevel;
+ it->recs = recs;
+ it->rec_count = rec_count;
+ threadpool_run(&it->threads, analogtv_thread_add_signals);
+ threadpool_wait(&it->threads);
+
+ it->channel_change_cycles=0;
+
+ /* rx_signal has an extra 2 lines at the end, where we copy the
+ first 2 lines so we can index into it while only worrying about
+ wraparound on a per-line level */
+ memcpy(&it->rx_signal[ANALOGTV_SIGNAL_LEN],
+ &it->rx_signal[0],
+ 2*ANALOGTV_H*sizeof(it->rx_signal[0]));
+
+ /* Repeat for signal_subtotals. */
+
+ memcpy(&it->signal_subtotals[ANALOGTV_SIGNAL_LEN / ANALOGTV_SUBTOTAL_LEN],
+ &it->signal_subtotals[0],
+ (2*ANALOGTV_H/ANALOGTV_SUBTOTAL_LEN)*sizeof(it->signal_subtotals[0]));
+
+ analogtv_sync(it); /* Requires the add_signals be complete. */
+
+ baseload=0.5;
+ /* if (it->hashnoise_on) baseload=0.5; */
+
+ /*bigloadchange=1;
+ drawcount=0;*/
+ it->crtload[ANALOGTV_TOP-1]=baseload;
+ it->puheight = puramp(it, 2.0, 1.0, 1.3) * it->height_control *
+ (1.125 - 0.125*puramp(it, 2.0, 2.0, 1.1));
+
+ analogtv_setup_levels(it, it->puheight * (double)it->useheight/(double)ANALOGTV_VISLINES);
+
+ /* calculate tint once per frame */
+ it->tint_i = -cos((103 + it->tint_control)*3.1415926/180);
+ it->tint_q = sin((103 + it->tint_control)*3.1415926/180);
+
+ for (lineno=ANALOGTV_TOP; lineno<ANALOGTV_BOT; lineno++) {
+ int slineno, ytop, ybot;
+ unsigned signal_offset;
+ if (! analogtv_get_line(it, lineno, &slineno, &ytop, &ybot, &signal_offset))
+ continue;
+
+ if (lineno==it->shrinkpulse) {
+ baseload += 0.4;
+ /*bigloadchange=1;*/
+ it->shrinkpulse=-1;
+ }
+
+#if 0
+ if (it->hashnoise_rpm>0.0 &&
+ !(bigloadchange ||
+ it->redraw_all ||
+ (slineno<20 && it->flutter_horiz_desync) ||
+ it->gaussiannoise_level>30 ||
+ ((it->gaussiannoise_level>2.0 ||
+ it->multipath) && random()%4) ||
+ linesig != it->onscreen_signature[lineno])) {
+ continue;
+ }
+ it->onscreen_signature[lineno] = linesig;
+#endif
+ /* drawcount++;*/
+
+ /*
+ Interpolate the 600-dotclock line into however many horizontal
+ screen pixels we're using, and convert to RGB.
+
+ We add some 'bloom', variations in the horizontal scan width with
+ the amount of brightness, extremely common on period TV sets. They
+ had a single oscillator which generated both the horizontal scan and
+ (during the horizontal retrace interval) the high voltage for the
+ electron beam. More brightness meant more load on the oscillator,
+ which caused an decrease in horizontal deflection. Look for
+ (bloomthisrow).
+
+ Also, the A2 did a bad job of generating horizontal sync pulses
+ during the vertical blanking interval. This, and the fact that the
+ horizontal frequency was a bit off meant that TVs usually went a bit
+ out of sync during the vertical retrace, and the top of the screen
+ would be bent a bit to the left or right. Look for (shiftthisrow).
+
+ We also add a teeny bit of left overscan, just enough to be
+ annoying, but you can still read the left column of text.
+
+ We also simulate compression & brightening on the right side of the
+ screen. Most TVs do this, but you don't notice because they overscan
+ so it's off the right edge of the CRT. But the A2 video system used
+ so much of the horizontal scan line that you had to crank the
+ horizontal width down in order to not lose the right few characters,
+ and you'd see the compression on the right edge. Associated with
+ compression is brightening; since the electron beam was scanning
+ slower, the same drive signal hit the phosphor harder. Look for
+ (squishright_i) and (squishdiv).
+ */
+
+ {
+ /* This used to be an int, I suspect by mistake. - Dave */
+ float totsignal=0;
+ float ncl/*,diff*/;
+ unsigned frac;
+ size_t end0, end1;
+ const float *p;
+
+ frac = signal_offset & (ANALOGTV_SUBTOTAL_LEN - 1);
+ p = it->rx_signal + (signal_offset & ~(ANALOGTV_SUBTOTAL_LEN - 1));
+ for (i=0; i != frac; i++) {
+ totsignal -= p[i];
+ }
+
+ end0 = (signal_offset + ANALOGTV_PIC_LEN);
+
+ end1 = end0 / ANALOGTV_SUBTOTAL_LEN;
+ for (i=signal_offset / ANALOGTV_SUBTOTAL_LEN; i<end1; i++) {
+ totsignal += it->signal_subtotals[i];
+ }
+
+ frac = end0 & (ANALOGTV_SUBTOTAL_LEN - 1);
+ p = it->rx_signal + (end0 & ~(ANALOGTV_SUBTOTAL_LEN - 1));
+ for (i=0; i != frac; i++) {
+ totsignal += p[i];
+ }
+
+ totsignal *= it->agclevel;
+ ncl = 0.95f * it->crtload[lineno-1] +
+ 0.05f*(baseload +
+ (totsignal-30000)/100000.0f +
+ (slineno>184 ? (slineno-184)*(lineno-184)*0.001f * it->squeezebottom
+ : 0.0f));
+ /*diff=ncl - it->crtload[lineno];*/
+ /*bigloadchange = (diff>0.01 || diff<-0.01);*/
+ it->crtload[lineno]=ncl;
+ }
+ }
+
+ threadpool_run(&it->threads, analogtv_thread_draw_lines);
+ threadpool_wait(&it->threads);
+
+#if 0
+ /* poor attempt at visible retrace */
+ for (i=0; i<15; i++) {
+ int ytop=(int)((i*it->useheight/15 -
+ it->useheight/2)*puheight) + it->useheight/2;
+ int ybot=(int)(((i+1)*it->useheight/15 -
+ it->useheight/2)*puheight) + it->useheight/2;
+ int div=it->usewidth*3/2;
+
+ for (x=0; x<it->usewidth; x++) {
+ y = ytop + (ybot-ytop)*x / div;
+ if (y<0 || y>=it->useheight) continue;
+ XPutPixel(it->image, x, y, 0xffffff);
+ }
+ }
+#endif
+
+ if (it->need_clear) {
+ XClearWindow(it->dpy, it->window);
+ it->need_clear=0;
+ }
+
+ /*
+ Subtle change: overall_bot was the bottom of the last scan line. Now it's
+ the top of the next-after-the-last scan line. This is the same until
+ the y-dimension is > 2400, note ANALOGTV_MAX_LINEHEIGHT.
+ */
+
+ overall_top=(int)(it->useheight*(1-it->puheight)/2);
+ overall_bot=(int)(it->useheight*(1+it->puheight)/2);
+
+ if (overall_top<0) overall_top=0;
+ if (overall_bot>it->useheight) overall_bot=it->useheight;
+
+ if (overall_top>0) {
+ XClearArea(it->dpy, it->window,
+ it->screen_xo, it->screen_yo,
+ it->usewidth, overall_top, 0);
+ }
+ if (it->useheight > overall_bot) {
+ XClearArea(it->dpy, it->window,
+ it->screen_xo, it->screen_yo+overall_bot,
+ it->usewidth, it->useheight-overall_bot, 0);
+ }
+
+ if (overall_bot > overall_top) {
+ put_xshm_image(it->dpy, it->window, it->gc, it->image,
+ 0, overall_top,
+ it->screen_xo, it->screen_yo+overall_top,
+ it->usewidth, overall_bot - overall_top,
+ &it->shm_info);
+ }
+
+#ifdef DEBUG
+ if (0) {
+ struct timeval tv;
+ double fps;
+ char buf[256];
+ gettimeofday(&tv,NULL);
+
+ fps=1.0/((tv.tv_sec - it->last_display_time.tv_sec)
+ + 0.000001*(tv.tv_usec - it->last_display_time.tv_usec));
+ sprintf(buf, "FPS=%0.1f",fps);
+ XDrawString(it->dpy, it->window, it->gc, 50, it->useheight*2/3,
+ buf, strlen(buf));
+
+ it->last_display_time=tv;
+ }
+#endif
+}
+
+analogtv_input *
+analogtv_input_allocate()
+{
+ analogtv_input *ret=(analogtv_input *)calloc(1,sizeof(analogtv_input));
+
+ return ret;
+}
+
+/*
+ This takes a screen image and encodes it as a video camera would,
+ including all the bandlimiting and YIQ modulation.
+ This isn't especially tuned for speed.
+
+ xoff, yoff: top left corner of rendered image, in window pixels.
+ w, h: scaled size of rendered image, in window pixels.
+ mask: BlackPixel means don't render (it's not full alpha)
+*/
+
+int
+analogtv_load_ximage(analogtv *it, analogtv_input *input,
+ XImage *pic_im, XImage *mask_im,
+ int xoff, int yoff, int target_w, int target_h)
+{
+ int i,x,y;
+ int img_w,img_h;
+ int fyx[7],fyy[7];
+ int fix[4],fiy[4];
+ int fqx[4],fqy[4];
+ XColor col1[ANALOGTV_PIC_LEN];
+ XColor col2[ANALOGTV_PIC_LEN];
+ char mask[ANALOGTV_PIC_LEN];
+ int multiq[ANALOGTV_PIC_LEN+4];
+ unsigned long black = 0; /* not BlackPixelOfScreen (it->xgwa.screen); */
+
+ int x_length=ANALOGTV_PIC_LEN;
+ int y_overscan=5; /* overscan this much top and bottom */
+ int y_scanlength=ANALOGTV_VISLINES+2*y_overscan;
+
+ if (target_w > 0) x_length = x_length * target_w / it->xgwa.width;
+ if (target_h > 0) y_scanlength = y_scanlength * target_h / it->xgwa.height;
+
+ img_w = pic_im->width;
+ img_h = pic_im->height;
+
+ xoff = ANALOGTV_PIC_LEN * xoff / it->xgwa.width;
+ yoff = ANALOGTV_VISLINES * yoff / it->xgwa.height;
+
+ for (i=0; i<x_length+4; i++) {
+ double phase=90.0-90.0*i;
+ double ampl=1.0;
+ multiq[i]=(int)(-cos(3.1415926/180.0*(phase-303)) * 4096.0 * ampl);
+ }
+
+ for (y=0; y<y_scanlength; y++) {
+ int picy1=(y*img_h)/y_scanlength;
+ int picy2=(y*img_h + y_scanlength/2)/y_scanlength;
+
+ for (x=0; x<x_length; x++) {
+ int picx=(x*img_w)/x_length;
+ col1[x].pixel=XGetPixel(pic_im, picx, picy1);
+ col2[x].pixel=XGetPixel(pic_im, picx, picy2);
+ if (mask_im)
+ mask[x] = (XGetPixel(mask_im, picx, picy1) != black);
+ else
+ mask[x] = 1;
+ }
+ XQueryColors(it->dpy, it->colormap, col1, x_length);
+ XQueryColors(it->dpy, it->colormap, col2, x_length);
+ for (i=0; i<7; i++) fyx[i]=fyy[i]=0;
+ for (i=0; i<4; i++) fix[i]=fiy[i]=fqx[i]=fqy[i]=0.0;
+
+ for (x=0; x<x_length; x++) {
+ int rawy,rawi,rawq;
+ int filty,filti,filtq;
+ int composite;
+
+ if (!mask[x]) continue;
+
+ /* Compute YIQ as:
+ y=0.30 r + 0.59 g + 0.11 b
+ i=0.60 r - 0.28 g - 0.32 b
+ q=0.21 r - 0.52 g + 0.31 b
+ The coefficients below are in .4 format */
+
+ rawy=( 5*col1[x].red + 11*col1[x].green + 2*col1[x].blue +
+ 5*col2[x].red + 11*col2[x].green + 2*col2[x].blue)>>7;
+ rawi=(10*col1[x].red - 4*col1[x].green - 5*col1[x].blue +
+ 10*col2[x].red - 4*col2[x].green - 5*col2[x].blue)>>7;
+ rawq=( 3*col1[x].red - 8*col1[x].green + 5*col1[x].blue +
+ 3*col2[x].red - 8*col2[x].green + 5*col2[x].blue)>>7;
+
+ /* Filter y at with a 4-pole low-pass Butterworth filter at 3.5 MHz
+ with an extra zero at 3.5 MHz, from
+ mkfilter -Bu -Lp -o 4 -a 2.1428571429e-01 0 -Z 2.5e-01 -l */
+
+ fyx[0] = fyx[1]; fyx[1] = fyx[2]; fyx[2] = fyx[3];
+ fyx[3] = fyx[4]; fyx[4] = fyx[5]; fyx[5] = fyx[6];
+ fyx[6] = (rawy * 1897) >> 16;
+ fyy[0] = fyy[1]; fyy[1] = fyy[2]; fyy[2] = fyy[3];
+ fyy[3] = fyy[4]; fyy[4] = fyy[5]; fyy[5] = fyy[6];
+ fyy[6] = (fyx[0]+fyx[6]) + 4*(fyx[1]+fyx[5]) + 7*(fyx[2]+fyx[4]) + 8*fyx[3]
+ + ((-151*fyy[2] + 8115*fyy[3] - 38312*fyy[4] + 36586*fyy[5]) >> 16);
+ filty = fyy[6];
+
+ /* Filter I at 1.5 MHz. 3 pole Butterworth from
+ mkfilter -Bu -Lp -o 3 -a 1.0714285714e-01 0 */
+
+ fix[0] = fix[1]; fix[1] = fix[2]; fix[2] = fix[3];
+ fix[3] = (rawi * 1413) >> 16;
+ fiy[0] = fiy[1]; fiy[1] = fiy[2]; fiy[2] = fiy[3];
+ fiy[3] = (fix[0]+fix[3]) + 3*(fix[1]+fix[2])
+ + ((16559*fiy[0] - 72008*fiy[1] + 109682*fiy[2]) >> 16);
+ filti = fiy[3];
+
+ /* Filter Q at 0.5 MHz. 3 pole Butterworth from
+ mkfilter -Bu -Lp -o 3 -a 3.5714285714e-02 0 -l */
+
+ fqx[0] = fqx[1]; fqx[1] = fqx[2]; fqx[2] = fqx[3];
+ fqx[3] = (rawq * 75) >> 16;
+ fqy[0] = fqy[1]; fqy[1] = fqy[2]; fqy[2] = fqy[3];
+ fqy[3] = (fqx[0]+fqx[3]) + 3 * (fqx[1]+fqx[2])
+ + ((2612*fqy[0] - 9007*fqy[1] + 10453 * fqy[2]) >> 12);
+ filtq = fqy[3];
+
+
+ composite = filty + ((multiq[x] * filti + multiq[x+3] * filtq)>>12);
+ composite = ((composite*100)>>14) + ANALOGTV_BLACK_LEVEL;
+ if (composite>125) composite=125;
+ if (composite<0) composite=0;
+
+ input->signal[y-y_overscan+ANALOGTV_TOP+yoff][x+ANALOGTV_PIC_START+xoff] = composite;
+ }
+ }
+
+ return 1;
+}
+
+#if 0
+void analogtv_channel_noise(analogtv_input *it, analogtv_input *s2)
+{
+ int x,y,newsig;
+ int change=random()%ANALOGTV_V;
+ unsigned int fastrnd=random();
+ double hso=(int)(random()%1000)-500;
+ int yofs=random()%ANALOGTV_V;
+ int noise;
+
+ for (y=change; y<ANALOGTV_V; y++) {
+ int s2y=(y+yofs)%ANALOGTV_V;
+ int filt=0;
+ int noiselevel=60000 / (y-change+100);
+
+ it->line_hsync[y] = s2->line_hsync[y] + (int)hso;
+ hso *= 0.9;
+ for (x=0; x<ANALOGTV_H; x++) {
+ FASTRND;
+ filt+= (-filt/16) + (int)(fastrnd&0xfff)-0x800;
+ noise=(filt*noiselevel)>>16;
+ newsig=s2->signal[s2y][x] + noise;
+ if (newsig>120) newsig=120;
+ if (newsig<0) newsig=0;
+ it->signal[y][x]=newsig;
+ }
+ }
+ s2->vsync=yofs;
+}
+#endif
+
+
+#ifdef FIXME
+/* add hash */
+ if (it->hashnoise_times[lineno]) {
+ int hnt=it->hashnoise_times[lineno] - input->line_hsync[lineno];
+
+ if (hnt>=0 && hnt<ANALOGTV_PIC_LEN) {
+ double maxampl=1.0;
+ double cur=frand(150.0)-20.0;
+ int len=random()%15+3;
+ if (len > ANALOGTV_PIC_LEN-hnt) len=ANALOGTV_PIC_LEN-hnt;
+ for (i=0; i<len; i++) {
+ double sig=signal[hnt];
+
+ sig += cur*maxampl;
+ cur += frand(5.0)-5.0;
+ maxampl = maxampl*0.9;
+
+ signal[hnt]=sig;
+ hnt++;
+ }
+ }
+ }
+#endif
+
+
+void
+analogtv_reception_update(analogtv_reception *rec)
+{
+ int i;
+
+ if (rec->multipath > 0.0) {
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ rec->ghostfir2[i] +=
+ -(rec->ghostfir2[i]/16.0) + rec->multipath * (frand(0.02)-0.01);
+ }
+ if (random()%20==0) {
+ rec->ghostfir2[random()%(ANALOGTV_GHOSTFIR_LEN)]
+ = rec->multipath * (frand(0.08)-0.04);
+ }
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ rec->ghostfir[i] = 0.8*rec->ghostfir[i] + 0.2*rec->ghostfir2[i];
+ }
+
+ if (0) {
+ rec->hfloss2 += -(rec->hfloss2/16.0) + rec->multipath * (frand(0.08)-0.04);
+ rec->hfloss = 0.5*rec->hfloss + 0.5*rec->hfloss2;
+ }
+
+ } else {
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ rec->ghostfir[i] = (i>=ANALOGTV_GHOSTFIR_LEN/2) ? ((i&1) ? +0.04 : -0.08) /ANALOGTV_GHOSTFIR_LEN
+ : 0.0;
+ }
+ }
+}
+
+
+/* jwz: since MacOS doesn't have "6x10", I dumped this font to a PNG...
+ */
+
+#include "images/gen/6x10font_png.h"
+
+void
+analogtv_make_font(Display *dpy, Window window, analogtv_font *f,
+ int w, int h, char *fontname)
+{
+ int i;
+ XFontStruct *font;
+ Pixmap text_pm;
+ GC gc;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ f->char_w = w;
+ f->char_h = h;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ if (fontname && !strcmp (fontname, "6x10")) {
+
+ int pix_w, pix_h;
+ XWindowAttributes xgwa;
+ Pixmap m = 0;
+ Pixmap p = image_data_to_pixmap (dpy, window,
+ _6x10font_png, sizeof(_6x10font_png),
+ &pix_w, &pix_h, &m);
+ XImage *im = XGetImage (dpy, p, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
+ XImage *mm = XGetImage (dpy, m, 0, 0, pix_w, pix_h, 1, XYPixmap);
+ unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
+ int x, y;
+
+ XFreePixmap (dpy, p);
+ XFreePixmap (dpy, m);
+ if (pix_w != 256*7) abort();
+ if (pix_h != 10) abort();
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ f->text_im = XCreateImage (dpy, xgwa.visual, 1, XYBitmap, 0, 0,
+ pix_w, pix_h, 8, 0);
+ f->text_im->data = malloc (f->text_im->bytes_per_line * f->text_im->height);
+
+ /* Convert deep image to 1 bit */
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ XPutPixel (f->text_im, x, y,
+ (XGetPixel (mm, x, y)
+ ? XGetPixel (im, x, y) == black
+ : 0));
+ XDestroyImage (im);
+ XDestroyImage (mm);
+
+ } else if (fontname) {
+
+ font = load_font_retry (dpy, fontname);
+ if (!font) {
+ fprintf(stderr, "analogtv: can't load font %s\n", fontname);
+ abort();
+ }
+
+ text_pm=XCreatePixmap(dpy, window, 256*f->char_w, f->char_h, 1);
+
+ memset(&gcv, 0, sizeof(gcv));
+ gcv.foreground=1;
+ gcv.background=0;
+ gcv.font=font->fid;
+ gc=XCreateGC(dpy, text_pm, GCFont|GCBackground|GCForeground, &gcv);
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, gc, False);
+# endif
+
+ XSetForeground(dpy, gc, 0);
+ XFillRectangle(dpy, text_pm, gc, 0, 0, 256*f->char_w, f->char_h);
+ XSetForeground(dpy, gc, 1);
+ for (i=0; i<256; i++) {
+ char c=i;
+ int x=f->char_w*i+1;
+ int y=f->char_h*8/10;
+ XDrawString(dpy, text_pm, gc, x, y, &c, 1);
+ }
+ f->text_im = XGetImage(dpy, text_pm, 0, 0, 256*f->char_w, f->char_h,
+ 1, XYPixmap);
+# if 0
+ XWriteBitmapFile(dpy, "/tmp/tvfont.xbm", text_pm,
+ 256*f->char_w, f->char_h, -1, -1);
+# endif
+ XFreeGC(dpy, gc);
+ XFreePixmap(dpy, text_pm);
+ } else {
+ f->text_im = XCreateImage(dpy, xgwa.visual, 1, XYPixmap, 0, 0,
+ 256*f->char_w, f->char_h, 8, 0);
+ f->text_im->data = (char *)calloc(f->text_im->height,
+ f->text_im->bytes_per_line);
+
+ }
+ f->x_mult=4;
+ f->y_mult=2;
+}
+
+int
+analogtv_font_pixel(analogtv_font *f, int c, int x, int y)
+{
+ if (x<0 || x>=f->char_w) return 0;
+ if (y<0 || y>=f->char_h) return 0;
+ if (c<0 || c>=256) return 0;
+ return XGetPixel(f->text_im, c*f->char_w + x, y) ? 1 : 0;
+}
+
+void
+analogtv_font_set_pixel(analogtv_font *f, int c, int x, int y, int value)
+{
+ if (x<0 || x>=f->char_w) return;
+ if (y<0 || y>=f->char_h) return;
+ if (c<0 || c>=256) return;
+
+ XPutPixel(f->text_im, c*f->char_w + x, y, value);
+}
+
+void
+analogtv_font_set_char(analogtv_font *f, int c, char *s)
+{
+ int value,x,y;
+
+ if (c<0 || c>=256) return;
+
+ for (y=0; y<f->char_h; y++) {
+ for (x=0; x<f->char_w; x++) {
+ if (!*s) return;
+ value=(*s==' ') ? 0 : 1;
+ analogtv_font_set_pixel(f, c, x, y, value);
+ s++;
+ }
+ }
+}
+
+void
+analogtv_lcp_to_ntsc(double luma, double chroma, double phase, int ntsc[4])
+{
+ int i;
+ for (i=0; i<4; i++) {
+ double w=90.0*i + phase;
+ double val=luma + chroma * (cos(3.1415926/180.0*w));
+ if (val<0.0) val=0.0;
+ if (val>127.0) val=127.0;
+ ntsc[i]=(int)val;
+ }
+}
+
+void
+analogtv_draw_solid(analogtv_input *input,
+ int left, int right, int top, int bot,
+ int ntsc[4])
+{
+ int x,y;
+
+ if (right-left<4) right=left+4;
+ if (bot-top<1) bot=top+1;
+
+ for (y=top; y<bot; y++) {
+ for (x=left; x<right; x++) {
+ input->signal[y][x] = ntsc[x&3];
+ }
+ }
+}
+
+
+void
+analogtv_draw_solid_rel_lcp(analogtv_input *input,
+ double left, double right, double top, double bot,
+ double luma, double chroma, double phase)
+{
+ int ntsc[4];
+
+ int topi=(int)(ANALOGTV_TOP + ANALOGTV_VISLINES*top);
+ int boti=(int)(ANALOGTV_TOP + ANALOGTV_VISLINES*bot);
+ int lefti=(int)(ANALOGTV_VIS_START + ANALOGTV_VIS_LEN*left);
+ int righti=(int)(ANALOGTV_VIS_START + ANALOGTV_VIS_LEN*right);
+
+ analogtv_lcp_to_ntsc(luma, chroma, phase, ntsc);
+ analogtv_draw_solid(input, lefti, righti, topi, boti, ntsc);
+}
+
+
+void
+analogtv_draw_char(analogtv_input *input, analogtv_font *f,
+ int c, int x, int y, int ntsc[4])
+{
+ int yc,xc,ys,xs,pix;
+
+ for (yc=0; yc<f->char_h; yc++) {
+ for (ys=y + yc*f->y_mult; ys<y + (yc+1)*f->y_mult; ys++) {
+ if (ys<0 || ys>=ANALOGTV_V) continue;
+
+ for (xc=0; xc<f->char_w; xc++) {
+ pix=analogtv_font_pixel(f, c, xc, yc);
+
+ for (xs=x + xc*f->x_mult; xs<x + (xc+1)*f->x_mult; xs++) {
+ if (xs<0 || xs>=ANALOGTV_H) continue;
+ if (pix) {
+ input->signal[ys][xs] = ntsc[xs&3];
+ }
+ }
+ }
+ }
+ }
+}
+
+void
+analogtv_draw_string(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4])
+{
+ while (*s) {
+ analogtv_draw_char(input, f, *s, x, y, ntsc);
+ x += f->char_w * 4;
+ s++;
+ }
+}
+
+void
+analogtv_draw_string_centered(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4])
+{
+ int width=strlen(s) * f->char_w * 4;
+ x -= width/2;
+
+ analogtv_draw_string(input, f, s, x, y, ntsc);
+}
diff --git a/hacks/analogtv.h b/hacks/analogtv.h
new file mode 100644
index 0000000..e3170f1
--- /dev/null
+++ b/hacks/analogtv.h
@@ -0,0 +1,338 @@
+/* analogtv, Copyright (c) 2003-2018 Trevor Blackwell <tlb@tlb.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef _XSCREENSAVER_ANALOGTV_H
+#define _XSCREENSAVER_ANALOGTV_H
+
+#include "thread_util.h"
+#include "xshm.h"
+
+#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+# define HAVE_MOBILE
+#endif
+
+/*
+ You'll need these to generate standard NTSC TV signals
+ */
+enum {
+ /* We don't handle interlace here */
+ ANALOGTV_V=262,
+ ANALOGTV_TOP=30,
+ ANALOGTV_VISLINES=200,
+ ANALOGTV_BOT=ANALOGTV_TOP + ANALOGTV_VISLINES,
+
+ /* This really defines our sampling rate, 4x the colorburst
+ frequency. Handily equal to the Apple II's dot clock.
+ You could also make a case for using 3x the colorburst freq,
+ but 4x isn't hard to deal with. */
+ ANALOGTV_H=912,
+
+ /* Each line is 63500 nS long. The sync pulse is 4700 nS long, etc.
+ Define sync, back porch, colorburst, picture, and front porch
+ positions */
+ ANALOGTV_SYNC_START=0,
+ ANALOGTV_BP_START=4700*ANALOGTV_H/63500,
+ ANALOGTV_CB_START=5800*ANALOGTV_H/63500,
+ /* signal[row][ANALOGTV_PIC_START] is the first displayed pixel */
+ ANALOGTV_PIC_START=9400*ANALOGTV_H/63500,
+ ANALOGTV_PIC_LEN=52600*ANALOGTV_H/63500,
+ ANALOGTV_FP_START=62000*ANALOGTV_H/63500,
+ ANALOGTV_PIC_END=ANALOGTV_FP_START,
+
+ /* TVs scan past the edges of the picture tube, so normally you only
+ want to use about the middle 3/4 of the nominal scan line.
+ */
+ ANALOGTV_VIS_START=ANALOGTV_PIC_START + (ANALOGTV_PIC_LEN*1/8),
+ ANALOGTV_VIS_END=ANALOGTV_PIC_START + (ANALOGTV_PIC_LEN*7/8),
+ ANALOGTV_VIS_LEN=ANALOGTV_VIS_END-ANALOGTV_VIS_START,
+
+ ANALOGTV_HASHNOISE_LEN=6,
+
+ ANALOGTV_GHOSTFIR_LEN=4,
+
+ /* analogtv.signal is in IRE units, as defined below: */
+ ANALOGTV_WHITE_LEVEL=100,
+ ANALOGTV_GRAY50_LEVEL=55,
+ ANALOGTV_GRAY30_LEVEL=35,
+ ANALOGTV_BLACK_LEVEL=10,
+ ANALOGTV_BLANK_LEVEL=0,
+ ANALOGTV_SYNC_LEVEL=-40,
+ ANALOGTV_CB_LEVEL=20,
+
+ ANALOGTV_SIGNAL_LEN=ANALOGTV_V*ANALOGTV_H,
+
+ /* The number of intensity levels we deal with for gamma correction &c */
+ ANALOGTV_CV_MAX=1024,
+
+ /* MAX_LINEHEIGHT corresponds to 2400 vertical pixels, beyond which
+ it interpolates extra black lines. */
+ ANALOGTV_MAX_LINEHEIGHT=12
+
+};
+
+typedef struct analogtv_input_s {
+ signed char signal[ANALOGTV_V+1][ANALOGTV_H];
+
+ int do_teletext;
+
+ /* for client use */
+ void (*updater)(struct analogtv_input_s *inp);
+ void *client_data;
+ double next_update_time;
+
+} analogtv_input;
+
+typedef struct analogtv_font_s {
+ XImage *text_im;
+ int char_w, char_h;
+ int x_mult, y_mult;
+} analogtv_font;
+
+typedef struct analogtv_reception_s {
+
+ analogtv_input *input;
+ double ofs;
+ double level;
+ double multipath;
+ double freqerr;
+
+ double ghostfir[ANALOGTV_GHOSTFIR_LEN];
+ double ghostfir2[ANALOGTV_GHOSTFIR_LEN];
+
+ double hfloss;
+ double hfloss2;
+
+} analogtv_reception;
+
+/*
+ The rest of this should be considered mostly opaque to the analogtv module.
+ */
+
+struct analogtv_yiq_s {
+ float y,i,q;
+} /*yiq[ANALOGTV_PIC_LEN+10] */;
+
+typedef struct analogtv_s {
+
+ Display *dpy;
+ Window window;
+ Screen *screen;
+ XWindowAttributes xgwa;
+
+ struct threadpool threads;
+
+#if 0
+ unsigned int onscreen_signature[ANALOGTV_V];
+#endif
+
+ int n_colors;
+
+ int interlace;
+ int interlace_counter;
+
+ float agclevel;
+
+ /* If you change these, call analogtv_set_demod */
+ float tint_control,color_control,brightness_control,contrast_control;
+ float height_control, width_control, squish_control;
+ float horiz_desync;
+ float squeezebottom;
+ float powerup;
+
+ /* internal cache */
+ int blur_mult;
+
+ /* For fast display, set fakeit_top, fakeit_bot to
+ the scanlines (0..ANALOGTV_V) that can be preserved on screen.
+ fakeit_scroll is the number of scan lines to scroll it up,
+ or 0 to not scroll at all. It will DTRT if asked to scroll from
+ an offscreen region.
+ */
+ int fakeit_top;
+ int fakeit_bot;
+ int fakeit_scroll;
+ int redraw_all;
+
+ int use_cmap,use_color;
+ int bilevel_signal;
+
+ XShmSegmentInfo shm_info;
+ int visdepth,visclass,visbits;
+ int red_invprec, red_shift;
+ int green_invprec, green_shift;
+ int blue_invprec, blue_shift;
+ unsigned long red_mask, green_mask, blue_mask;
+
+ Colormap colormap;
+ int usewidth,useheight,xrepl,subwidth;
+ XImage *image; /* usewidth * useheight */
+ GC gc;
+ int screen_xo,screen_yo; /* centers image in window */
+
+ int flutter_horiz_desync;
+ int flutter_tint;
+
+ struct timeval last_display_time;
+ int need_clear;
+
+
+ /* Add hash (in the radio sense, not the programming sense.) These
+ are the small white streaks that appear in quasi-regular patterns
+ all over the screen when someone is running the vacuum cleaner or
+ the blender. We also set shrinkpulse for one period which
+ squishes the image horizontally to simulate the temporary line
+ voltate drop when someone turns on a big motor */
+ double hashnoise_rpm;
+ int hashnoise_counter;
+ int hashnoise_times[ANALOGTV_V];
+ int hashnoise_signal[ANALOGTV_V];
+ int hashnoise_on;
+ int hashnoise_enable;
+ int shrinkpulse;
+
+ float crtload[ANALOGTV_V];
+
+ unsigned int red_values[ANALOGTV_CV_MAX];
+ unsigned int green_values[ANALOGTV_CV_MAX];
+ unsigned int blue_values[ANALOGTV_CV_MAX];
+
+ unsigned long colors[256];
+ int cmap_y_levels;
+ int cmap_i_levels;
+ int cmap_q_levels;
+
+ float tint_i, tint_q;
+
+ int cur_hsync;
+ int line_hsync[ANALOGTV_V];
+ int cur_vsync;
+ double cb_phase[4];
+ double line_cb_phase[ANALOGTV_V][4];
+
+ int channel_change_cycles;
+ double rx_signal_level;
+ float *rx_signal;
+
+ struct {
+ int index;
+ double value;
+ } leveltable[ANALOGTV_MAX_LINEHEIGHT+1][ANALOGTV_MAX_LINEHEIGHT+1];
+
+ /* Only valid during draw. */
+ unsigned random0, random1;
+ double noiselevel;
+ const analogtv_reception *const *recs;
+ unsigned rec_count;
+
+ float *signal_subtotals;
+
+ float puheight;
+} analogtv;
+
+
+analogtv *analogtv_allocate(Display *dpy, Window window);
+analogtv_input *analogtv_input_allocate(void);
+
+/* call if window size changes */
+void analogtv_reconfigure(analogtv *it);
+
+void analogtv_set_defaults(analogtv *it, char *prefix);
+void analogtv_release(analogtv *it);
+int analogtv_set_demod(analogtv *it);
+void analogtv_setup_frame(analogtv *it);
+void analogtv_setup_sync(analogtv_input *input, int do_cb, int do_ssavi);
+void analogtv_draw(analogtv *it, double noiselevel,
+ const analogtv_reception *const *recs, unsigned rec_count);
+
+int analogtv_load_ximage(analogtv *it, analogtv_input *input,
+ XImage *pic_im, XImage *mask_im,
+ int xoff, int yoff, int width, int height);
+
+void analogtv_reception_update(analogtv_reception *inp);
+
+void analogtv_setup_teletext(analogtv_input *input);
+
+
+/* Functions for rendering content into an analogtv_input */
+
+void analogtv_make_font(Display *dpy, Window window,
+ analogtv_font *f, int w, int h, char *fontname);
+int analogtv_font_pixel(analogtv_font *f, int c, int x, int y);
+void analogtv_font_set_pixel(analogtv_font *f, int c, int x, int y, int value);
+void analogtv_font_set_char(analogtv_font *f, int c, char *s);
+void analogtv_lcp_to_ntsc(double luma, double chroma, double phase,
+ int ntsc[4]);
+
+
+void analogtv_draw_solid(analogtv_input *input,
+ int left, int right, int top, int bot,
+ int ntsc[4]);
+
+void analogtv_draw_solid_rel_lcp(analogtv_input *input,
+ double left, double right,
+ double top, double bot,
+ double luma, double chroma, double phase);
+
+void analogtv_draw_char(analogtv_input *input, analogtv_font *f,
+ int c, int x, int y, int ntsc[4]);
+void analogtv_draw_string(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4]);
+void analogtv_draw_string_centered(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4]);
+
+int analogtv_handle_events (analogtv *it);
+
+#ifdef HAVE_XSHM_EXTENSION
+#define ANALOGTV_DEFAULTS_SHM "*useSHM: True",
+#else
+#define ANALOGTV_DEFAULTS_SHM
+#endif
+
+#ifndef HAVE_MOBILE
+# define ANALOGTV_DEF_BRIGHTNESS "2"
+# define ANALOGTV_DEF_CONTRAST "150"
+#else
+ /* Need to really crank this up for it to look good on the iPhone screen. */
+# define ANALOGTV_DEF_BRIGHTNESS "3"
+# define ANALOGTV_DEF_CONTRAST "400"
+#endif
+
+/* Brightness: useful range is around -75 to 100.
+ Contrast: useful range is around 0 - 500.
+ Color: useful range is around +/- 500.
+ Tint: range is mod 360.
+
+ The values in the 'analogtv' struct are the resource divided by 100.0,
+ except for tint, which is exact.
+ */
+
+#define ANALOGTV_DEFAULTS \
+ "*TVColor: 70", \
+ "*TVTint: 5", \
+ "*TVBrightness: " ANALOGTV_DEF_BRIGHTNESS, \
+ "*TVContrast: " ANALOGTV_DEF_CONTRAST, \
+ "*Background: Black", \
+ "*use_cmap: 0", \
+ "*geometry: 800x600", \
+ "*fpsSolid: True", \
+ "*lowrez: True", \
+ THREAD_DEFAULTS \
+ ANALOGTV_DEFAULTS_SHM
+
+#define ANALOGTV_OPTIONS \
+ THREAD_OPTIONS \
+ { "-use-cmap", ".use_cmap", XrmoptionSepArg, 0 }, \
+ { "-tv-color", ".TVColor", XrmoptionSepArg, 0 }, \
+ { "-tv-tint", ".TVTint", XrmoptionSepArg, 0 }, \
+ { "-tv-brightness", ".TVBrightness", XrmoptionSepArg, 0 }, \
+ { "-tv-contrast", ".TVContrast", XrmoptionSepArg, 0 },
+
+#endif /* _XSCREENSAVER_ANALOGTV_H */
diff --git a/hacks/anemone.c b/hacks/anemone.c
new file mode 100644
index 0000000..deedb27
--- /dev/null
+++ b/hacks/anemone.c
@@ -0,0 +1,448 @@
+/* anemone, Copyright (c) 2001 Gabriel Finch
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*------------------------------------------------------------------------
+ |
+ | FILE anemone.c
+ | MODULE OF xscreensaver
+ |
+ | DESCRIPTION Anemone.
+ |
+ | WRITTEN BY Gabriel Finch
+ |
+ |
+ |
+ | MODIFICATIONS june 2001 started
+ |
+ +----------------------------------------------------------------------*/
+
+
+#include <math.h>
+#include "screenhack.h"
+
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE DATA |
+ +-----------------------------------------------------------------------*/
+
+
+#define TWO_PI (2.0 * M_PI)
+#define RND(x) (random() % (x))
+#define MAXPEND 2000
+#define MAXPTS 200
+#define TRUE 1
+#define FALSE 0
+
+
+typedef struct {
+ double x,y,z;
+ int sx,sy,sz;
+} vPend;
+
+typedef struct {
+ long col;
+ int numpt;
+ int growth;
+ unsigned short rate;
+} appDef;
+
+struct state {
+ Display *dpy;
+ Pixmap b, ba, bb;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ int arms; /* number of arms */
+ int finpoints; /* final number of points in each array. */
+ long delay; /* usecs to wait between updates. */
+
+ int scrWidth, scrHeight;
+ GC gcDraw, gcClear;
+
+ Bool dbuf;
+ int width;
+
+ vPend *vPendage; /* 3D representation of appendages */
+ appDef *appD; /* defaults */
+ vPend *vCurr, *vNext;
+ appDef *aCurr;
+
+ double turn, turndelta;
+
+ int mx, my; /* max screen coordinates. */
+ int withdraw;
+
+ XGCValues gcv;
+ Colormap cmap;
+ XColor *colors;
+ int ncolors;
+};
+
+
+
+/*-----------------------------------------------------------------------+
+ | PUBLIC DATA |
+ +-----------------------------------------------------------------------*/
+
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE FUNCTIONS |
+ +-----------------------------------------------------------------------*/
+
+static void *
+xmalloc(size_t size)
+{
+ void *ret;
+
+ if ((ret = malloc(size)) == NULL) {
+ fprintf(stderr, "anemone: out of memory\n");
+ exit(1);
+ }
+ return ret;
+}
+
+
+static void
+initAppendages(struct state *st)
+{
+ int i;
+ /*int marginx, marginy; */
+
+ /*double scalex, scaley;*/
+
+ double x,y,z,dist;
+
+ st->mx = st->scrWidth - 1;
+ st->my = st->scrHeight - 1;
+
+ /* each appendage will have: colour,
+ number of points, and a grow or shrink indicator */
+
+ /* added: growth rate 1-10 (smaller==faster growth) */
+ /* each appendage needs virtual coords (x,y,z) with y and z combining to
+ give the screen y */
+
+ st->vPendage = (vPend *) xmalloc((st->finpoints + 1) * sizeof(vPend) * st->arms);
+ st->appD = (appDef *) xmalloc(sizeof(appDef) * st->arms);
+
+
+ for (i = 0; i < st->arms; i++) {
+ st->aCurr = st->appD + i;
+ st->vCurr = st->vPendage + (st->finpoints + 1) * i;
+ st->vNext = st->vCurr + 1;
+
+ st->aCurr->col = st->colors[random() % st->ncolors].pixel;
+ st->aCurr->numpt = 1;
+ st->aCurr->growth = st->finpoints / 2 + RND(st->finpoints / 2);
+ st->aCurr->rate = RND(11) * RND(11);
+
+ do {
+ x = (1 - RND(1001) / 500);
+ y = (1 - RND(1001) / 500);
+ z = (1 - RND(1001) / 500);
+ dist = x * x + y * y + z * z;
+ } while (dist >= 1.);
+
+ st->vCurr->x = x * 200;
+ st->vCurr->y = st->my / 2 + y * 200;
+ st->vCurr->z = 0 + z * 200;
+
+ /* start the arm going outwards */
+ st->vCurr->sx = st->vCurr->x / 5;
+ st->vCurr->sy = (st->vCurr->y - st->my / 2) / 5;
+ st->vCurr->sz = (st->vCurr->z) / 5;
+
+
+ st->vNext->x = st->vCurr->x + st->vCurr->sx;
+ st->vNext->y = st->vCurr->y + st->vCurr->sy;
+ st->vNext->z = st->vCurr->z + st->vCurr->sz;
+ }
+}
+
+static void *
+anemone_init (Display *disp, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes wa;
+
+ st->dpy = disp;
+ st->turn = 0.;
+
+ st->width = get_integer_resource(st->dpy, "width", "Integer");
+ st->arms = get_integer_resource(st->dpy, "arms", "Integer");
+ st->finpoints = get_integer_resource(st->dpy, "finpoints", "Integer");
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->withdraw = get_integer_resource(st->dpy, "withdraw", "Integer");
+ st->turndelta = get_float_resource(st->dpy, "turnspeed", "float") / 100000;
+
+ st->dbuf = TRUE;
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ st->b = st->ba = st->bb = 0; /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = st->backb = xdbe_get_backbuffer (st->dpy, window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+
+ XGetWindowAttributes(st->dpy, window, &wa);
+ st->scrWidth = wa.width;
+ st->scrHeight = wa.height;
+ st->cmap = wa.colormap;
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ st->ncolors += 3;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_smooth_colormap (wa.screen, wa.visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+
+ st->gcDraw = XCreateGC(st->dpy, window, 0, &st->gcv);
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->cmap,
+ "background", "Background");
+ st->gcClear = XCreateGC(st->dpy, window, GCForeground, &st->gcv);
+
+ if (st->dbuf) {
+ if (!st->b)
+ {
+ st->ba = XCreatePixmap (st->dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->bb = XCreatePixmap (st->dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = window;
+ }
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+
+ XClearWindow(st->dpy, window);
+ XSetLineAttributes(st->dpy, st->gcDraw, st->width, LineSolid, CapRound, JoinBevel);
+
+ initAppendages(st);
+
+ return st;
+}
+
+
+static void
+createPoints(struct state *st)
+{
+ int i;
+ int withdrawall = RND(st->withdraw);
+
+ for (i = 0; i< st->arms; i++) {
+ st->aCurr = st->appD + i;
+ if (!withdrawall) {
+ st->aCurr->growth = -st->finpoints;
+ st->turndelta = -st->turndelta;
+ }
+
+ else if (withdrawall<11) st->aCurr->growth = -st->aCurr->numpt;
+
+ else if (RND(100)<st->aCurr->rate) {
+ if (st->aCurr->growth>0) {
+ if (!(--st->aCurr->growth)) st->aCurr->growth = -RND(st->finpoints) - 1;
+ st->vCurr = st->vPendage + (st->finpoints + 1) * i + st->aCurr->numpt - 1;
+ if (st->aCurr->numpt<st->finpoints - 1) {
+ /* add a piece */
+ st->vNext = st->vCurr + 1;
+ st->aCurr->numpt++;
+ st->vNext->sx = st->vCurr->sx + RND(3) - 1;
+ st->vNext->sy = st->vCurr->sy + RND(3) - 1;
+ st->vNext->sz = st->vCurr->sz + RND(3) - 1;
+ st->vCurr = st->vNext + 1;
+ st->vCurr->x = st->vNext->x + st->vNext->sx;
+ st->vCurr->y = st->vNext->y + st->vNext->sy;
+ st->vCurr->z = st->vNext->z + st->vNext->sz;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+drawImage(struct state *st, Drawable curr_window, double sint, double cost)
+{
+ int q,numpt,mx2 = st->mx / 2;
+ double cx,cy,cz,nx = 0,ny = 0,nz = 0;
+
+ if ((numpt = st->aCurr->numpt)==1) return;
+ XSetForeground(st->dpy, st->gcDraw, st->aCurr->col);
+
+ st->vNext = st->vCurr + 1;
+
+ cx = st->vCurr->x;
+ cy = st->vCurr->y;
+ cz = st->vCurr->z;
+
+
+ for (q = 0; q < numpt - 1; q++) {
+ nx = st->vNext->x + 2 - RND(5);
+ ny = st->vNext->y + 2 - RND(5);
+ nz = st->vNext->z + 2 - RND(5);
+
+ XDrawLine(st->dpy, curr_window, st->gcDraw,
+ mx2 + cx * cost - cz * sint, cy,
+ mx2 + nx * cost - nz * sint, ny);
+ st->vCurr++;
+ st->vNext++;
+
+ cx = nx;
+ cy = ny;
+ cz = nz;
+ }
+ XSetLineAttributes(st->dpy, st->gcDraw, st->width * 3,
+ LineSolid, CapRound, JoinBevel);
+ XDrawLine(st->dpy, curr_window, st->gcDraw,
+ st->mx / 2 + cx * cost - cz * sint, cy,
+ st->mx / 2 + nx * cost - nz * sint, ny);
+ XSetLineAttributes(st->dpy, st->gcDraw, st->width,
+ LineSolid, CapRound, JoinBevel);
+
+}
+
+static void
+animateAnemone(struct state *st, Drawable curr_window)
+{
+ int i;
+ double sint = sin(st->turn),cost = cos(st->turn);
+
+ st->aCurr = st->appD;
+ for (i = 0; i< st->arms; i++) {
+ st->vCurr = st->vPendage + (st->finpoints + 1) * i;
+ if (RND(25)<st->aCurr->rate) {
+ if (st->aCurr->growth<0) {
+ st->aCurr->numpt -= st->aCurr->numpt>1;
+ if (!(++st->aCurr->growth)) st->aCurr->growth = RND(st->finpoints - st->aCurr->numpt) + 1;
+ }
+ }
+ drawImage(st, curr_window, sint, cost);
+ st->turn += st->turndelta;
+ st->aCurr++;
+ }
+ createPoints(st);
+
+ if (st->turn >= TWO_PI) st->turn -= TWO_PI;
+}
+
+static unsigned long
+anemone_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ XFillRectangle (st->dpy, st->b, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+
+ animateAnemone(st, st->b);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, window, st->gcClear, 0, 0,
+ st->scrWidth, st->scrHeight, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+
+static void
+anemone_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->scrWidth = w;
+ st->scrHeight = h;
+#if 0
+ if (st->dbuf) {
+ XWindowAttributes wa;
+ XGetWindowAttributes(dpy, window, &wa);
+ if (st->ba) XFreePixmap (dpy, st->ba);
+ if (st->bb) XFreePixmap (dpy, st->bb);
+ st->ba = XCreatePixmap (dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->bb = XCreatePixmap (dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->b = st->ba;
+ }
+#endif
+}
+
+static Bool
+anemone_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+anemone_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->vPendage) free (st->vPendage);
+ if (st->appD) free (st->appD);
+ free (st);
+}
+
+
+
+static const char *anemone_defaults [] = {
+ ".background: black",
+ "*arms: 128",
+ "*width: 2",
+ "*finpoints: 64",
+ "*delay: 40000",
+ "*withdraw: 1200",
+ "*turnspeed: 50",
+ "*colors: 20",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+
+static XrmOptionDescRec anemone_options [] = {
+ { "-arms", ".arms", XrmoptionSepArg, 0 },
+ { "-finpoints", ".finpoints", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-width", ".width", XrmoptionSepArg, 0 },
+ { "-withdraw", ".withdraw", XrmoptionSepArg, 0 },
+ { "-turnspeed", ".turnspeed", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Anemone", anemone)
diff --git a/hacks/anemone.man b/hacks/anemone.man
new file mode 100644
index 0000000..463a999
--- /dev/null
+++ b/hacks/anemone.man
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+anemone - wiggling tentacles.
+.SH SYNOPSIS
+.B anemone
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-arms \fInumber\fP]
+[\-finpoints \fInumber\fP]
+[\-width \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Wiggling tentacles.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-arms \fInumber\fP
+Arms. 2 - 500. Default: 128.
+.TP 8
+.B \-finpoints \fInumber\fP
+Tentacles. 3 - 200. Default: 64.
+.TP 8
+.B \-withdraw \fInumber\fP
+Frequency that the arms withdraw. Arms withdraw on randomly generated
+values between 1 and 11; this value determines the maximum value of
+that range. So 100 spends a lot of time withdrawn, while 1000,000 tends
+not to withdraw at all. Default: 1200.
+.TP 8
+.B \-turnspeed \fInumber\fP
+How fast it turns. At zero, not at all, all they way up to thousands
+which are very fast indeed. Default: 50.
+.TP 8
+.B \-width \fInumber\fP
+Thickness. 1 - 10. Default: 2.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Gabriel Finch. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Gabriel Finch.
diff --git a/hacks/anemotaxis.c b/hacks/anemotaxis.c
new file mode 100644
index 0000000..9f240e8
--- /dev/null
+++ b/hacks/anemotaxis.c
@@ -0,0 +1,755 @@
+/* anemotaxis, Copyright (c) 2004 Eugene Balkovski
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation. No representations are made
+ * about the suitability of this software for any purpose. It is
+ * provided "as is" without express or implied warranty.
+ */
+
+/*------------------------------------------------------------------------
+ |
+ | FILE anemotaxis.c
+ |
+ | DESCRIPTION Anemotaxis
+ |
+ | This code illustrates an optimal algorithm designed
+ | for searching a source of particles on a plane.
+ | The particles drift in one direction and walk randomly
+ | in the other. The only information available to the
+ | searcher is the presence of a particle at its location
+ | and the local direction from where particle arrived.
+ | The algorithm "explains" the behavior
+ | of some animals and insects
+ | who use olfactory and directional cues to find
+ | sources of odor (mates, food, home etc) in
+ | turbulent atmosphere (odor-modulated anemotaxis),
+ | e.g. male moths locating females who release
+ | pheromones to attract males. The search trajectories
+ | resemble the trajectories that the animals follow.
+ |
+ |
+ | WRITTEN BY Eugene Balkovski
+ |
+ | MODIFICATIONS june 2004 started
+ |
+ +----------------------------------------------------------------------*/
+
+/*
+ Options:
+
+ -distance <arg> size of the lattice
+ -sources <arg> number of sources
+ -searhers <arg> number of searcher */
+
+
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE DATA |
+ +-----------------------------------------------------------------------*/
+
+#define MAX_DIST 250
+#define MIN_DIST 10
+#define LINE_WIDTH 4
+#define MAX_INV_RATE 5
+
+#define RND(x) (random() % (x))
+#define X(x) ((int) (st->ax * (x) + st->bx))
+#define Y(x) ((int) (st->ay * (x) + st->by))
+
+typedef struct {
+ short x;
+ short y;
+} Point;
+
+typedef struct {
+
+ short y; /* y-coordinate of the particle (relative to the source) */
+
+ short v; /* velocity of the particle. Allowed values are -1, 0, 1.
+ 2 means the particle is not valid */
+} YV;
+
+typedef struct {
+
+ int n; /* size of array xv */
+
+ YV *yv; /* yv[i] keeps velocity and y-coordinate of the
+ particle at (i + 1, yv[i].y) relative to the
+ source */
+
+ int inv_rate; /* Inverse rate of particle emission (if 0 then
+ source doesn't emit new particles (although
+ old ones can still exist )*/
+
+ Point r; /* Position of the source */
+
+ long color;
+
+} Source;
+
+
+typedef struct PList {
+ Point r;
+ struct PList *next;
+} PList;
+
+typedef enum {UP_LEFT, UP_RIGHT, LEFT, RIGHT, DONE} State_t;
+
+typedef struct {
+
+ Point r; /* Current position */
+
+ Point vertex; /* Position of the vertex of the most recent
+ cone, which is the region where the source
+ is located. We do exhaustive search in the
+ cone until we encounter a new particle,
+ which gives us a new cone. */
+
+ State_t state; /* Internal state variable */
+
+ unsigned char c; /* Concentration at r */
+
+ short v; /* Velocity at r (good only when c != 0) */
+
+ PList *hist; /* Trajectory */
+
+ int rs; /* small shift of x-coordinate to avoid
+ painting over the same x */
+
+ long color;
+
+} Searcher;
+
+struct state {
+ Source **source;
+ Searcher **searcher;
+
+ int max_dist, max_src, max_searcher;
+
+ double ax, ay, bx, by;
+ int dx, dy;
+
+ Display *dpy;
+ Window window;
+
+ Pixmap b, ba, bb;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif
+
+ long delay; /* usecs to wait between updates. */
+
+ int scrWidth, scrHeight;
+ GC gcDraw, gcClear;
+
+ Bool dbuf;
+
+ XGCValues gcv;
+ Colormap cmap;
+ XColor *colors;
+ int ncolors;
+};
+
+/*-----------------------------------------------------------------------+
+ | PUBLIC DATA |
+ +-----------------------------------------------------------------------*/
+
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE FUNCTIONS |
+ +-----------------------------------------------------------------------*/
+
+static void *emalloc(size_t size)
+{
+ void *ret = malloc(size);
+
+ if (ret == NULL) {
+ fprintf(stderr, "out of memory\n");
+ exit(1);
+ }
+ return ret;
+}
+
+static Searcher *new_searcher(struct state *st)
+{
+ Searcher *m = (Searcher *) emalloc(sizeof(Searcher));
+
+ m->r.x = m->vertex.x = st->max_dist;
+
+ do {
+ m->r.y = RND(2 * st->max_dist);
+ } while(m->r.y < MIN_DIST || m->r.y > 2 * st->max_dist - MIN_DIST);
+
+ m->vertex.y = m->r.y;
+
+ m->state = (RND(2) == 0 ? UP_RIGHT : UP_LEFT);
+ m->hist = NULL;
+ m->color = st->colors[random() % st->ncolors].pixel;
+
+ m->rs = RND(st->dx);
+
+ return m;
+}
+
+static void destroy_searcher(Searcher *m)
+{
+ PList *p = m->hist, *q;
+
+ while(p != NULL) {
+ q = p->next;
+ free(p);
+ p = q;
+ }
+
+ free(m);
+}
+
+static void write_hist(Searcher *m)
+{
+ PList *l;
+
+ l = m->hist;
+ m->hist = (PList *) emalloc(sizeof(PList));
+ m->hist->next = l;
+ m->hist->r = m->r;
+
+}
+
+static void move_searcher(Searcher *m)
+{
+
+ if(m->c == True) {
+ write_hist(m);
+ m->r.x -= 1;
+ m->r.y -= m->v;
+ write_hist(m);
+ m->state = (RND(2) == 0 ? UP_LEFT : UP_RIGHT);
+ m->vertex = m->r;
+ return;
+
+ }
+
+ switch(m->state) {
+ case UP_LEFT:
+
+ m->r.x -= 1;
+ m->r.y += 1;
+ m->state = RIGHT;
+ write_hist(m);
+ return;
+
+ case RIGHT:
+
+ m->r.y -= 1;
+ if(m->vertex.x - m->r.x == m->vertex.y - m->r.y) {
+ write_hist(m);
+ m->state = UP_RIGHT;
+ }
+ return;
+
+ case UP_RIGHT:
+
+ m->r.x -= 1;
+ m->r.y -= 1;
+
+ m->state = LEFT;
+ write_hist(m);
+ return;
+
+ case LEFT:
+
+ m->r.y += 1;
+
+ if(m->vertex.x - m->r.x == m->r.y - m->vertex.y) {
+ write_hist(m);
+ m->state = UP_LEFT;
+ }
+ return;
+
+ default:
+ break;
+ }
+
+}
+
+static void evolve_source(Source *s)
+{
+
+ int i;
+
+ /* propagate existing particles */
+
+ for(i = s->n - 1; i > 0; i--) {
+
+ if(s->yv[i - 1].v == 2)
+ s->yv[i].v = 2;
+ else {
+ s->yv[i].v = RND(3) - 1;
+ s->yv[i].y = s->yv[i - 1].y + s->yv[i].v;
+ }
+
+ }
+
+
+ if(s->inv_rate > 0 && (RND(s->inv_rate) == 0)) /* emit a particle */
+ s->yv[0].y = s->yv[0].v = RND(3) - 1;
+ else
+ s->yv[0].v = 2;
+
+}
+
+static Source *new_source(struct state *st)
+{
+ int i;
+
+ Source *s = (Source *) emalloc(sizeof(Source));
+ if(st->max_searcher == 0) {
+ s->r.x = 0;
+ s->r.y = RND(2 * st->max_dist);
+ }
+ else {
+ s->r.x = RND(st->max_dist / 3);
+ do {
+ s->r.y = RND(2 * st->max_dist);
+ } while(s->r.y < MIN_DIST || s->r.y > 2 * st->max_dist - MIN_DIST);
+ }
+
+ s->n = st->max_dist - s->r.x;
+ s->yv = emalloc(sizeof(YV) * s->n);
+
+ for(i = 0; i < s->n; i++)
+ s->yv[i].v = 2;
+
+ s->inv_rate = RND(MAX_INV_RATE);
+
+ if(s->inv_rate == 0)
+ s->inv_rate = 1;
+
+ s->color = st->colors[random() % st->ncolors].pixel;
+
+ return s;
+}
+
+static void destroy_source(Source *s)
+{
+ free(s->yv);
+ free(s);
+}
+
+static void get_v(const Source *s, Searcher *m)
+{
+ int x = m->r.x - s->r.x - 1;
+
+ m->c = 0;
+
+ if(x < 0 || x >= s->n)
+ return;
+
+ if((s->yv[x].v == 2) || (s->yv[x].y != m->r.y - s->r.y))
+ return;
+
+ m->c = 1;
+ m->v = s->yv[x].v;
+ m->color = s->color;
+}
+
+
+static void *
+anemotaxis_init (Display *disp, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes wa;
+
+ st->dpy = disp;
+ st->window = win;
+
+ XGetWindowAttributes(st->dpy, st->window, &wa);
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ st->ncolors++;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_random_colormap (wa.screen, wa.visual, wa.colormap,
+ st->colors, &st->ncolors,
+ True, True, 0, True);
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->max_dist = get_integer_resource(st->dpy, "distance", "Integer");
+
+ if(st->max_dist < MIN_DIST)
+ st->max_dist = MIN_DIST + 1;
+ if(st->max_dist > MAX_DIST)
+ st->max_dist = MAX_DIST;
+
+ st->max_src = get_integer_resource(st->dpy, "sources", "Integer");
+
+ if(st->max_src <= 0)
+ st->max_src = 1;
+
+ st->max_searcher = get_integer_resource(st->dpy, "searchers", "Integer");
+
+ if(st->max_searcher < 0)
+ st->max_searcher = 0;
+
+ st->dbuf = True;
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ st->source = (Source **) emalloc(sizeof(Source *) * st->max_src);
+ memset(st->source, 0, st->max_src * sizeof(Source *));
+
+ st->source[0] = new_source(st);
+
+ st->searcher = (Searcher **) emalloc(st->max_searcher * sizeof(Searcher *));
+
+ memset(st->searcher, 0, st->max_searcher * sizeof(Searcher *));
+
+ st->b = st->ba = st->bb = 0; /* double-buffer to reduce flicker */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = st->backb = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+#endif
+
+ st->scrWidth = wa.width;
+ st->scrHeight = wa.height;
+ st->cmap = wa.colormap;
+ st->gcDraw = XCreateGC(st->dpy, st->window, 0, &st->gcv);
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->cmap,
+ "background", "Background");
+ st->gcClear = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ if (st->dbuf) {
+ if (!st->b) {
+ st->ba = XCreatePixmap (st->dpy, st->window, st->scrWidth, st->scrHeight, wa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->scrWidth, st->scrHeight, wa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ st->b = st->window;
+
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+
+ st->ax = st->scrWidth / (double) st->max_dist;
+ st->ay = st->scrHeight / (2. * st->max_dist);
+ st->bx = 0.;
+ st->by = 0.;
+
+ if((st->dx = st->scrWidth / (2 * st->max_dist)) == 0)
+ st->dx = 1;
+ if((st->dy = st->scrHeight / (4 * st->max_dist)) == 0)
+ st->dy = 1;
+ XSetLineAttributes(st->dpy, st->gcDraw, st->dx / 3 + 1, LineSolid, CapRound, JoinRound);
+ XClearWindow(st->dpy, st->window);
+
+ return st;
+}
+
+static void draw_searcher(struct state *st, Drawable curr_window, int i)
+{
+ Point r1, r2;
+ PList *l;
+
+ if(st->searcher[i] == NULL)
+ return;
+
+ XSetForeground(st->dpy, st->gcDraw, st->searcher[i]->color);
+
+ r1.x = X(st->searcher[i]->r.x) + st->searcher[i]->rs;
+ r1.y = Y(st->searcher[i]->r.y);
+
+ XFillRectangle(st->dpy, curr_window, st->gcDraw, r1.x - 2, r1.y - 2, 4, 4);
+
+ for(l = st->searcher[i]->hist; l != NULL; l = l->next) {
+
+ r2.x = X(l->r.x) + st->searcher[i]->rs;
+ r2.y = Y(l->r.y);
+
+ XDrawLine(st->dpy, curr_window, st->gcDraw, r1.x, r1.y, r2.x, r2.y);
+
+ r1 = r2;
+ }
+
+}
+
+static void draw_image(struct state *st, Drawable curr_window)
+{
+ int i, j;
+ int x, y;
+
+ for(i = 0; i < st->max_src; i++) {
+
+ if(st->source[i] == NULL)
+ continue;
+
+ XSetForeground(st->dpy, st->gcDraw, st->source[i]->color);
+
+ if(st->source[i]->inv_rate > 0) {
+
+ if(st->max_searcher > 0) {
+ x = (int) X(st->source[i]->r.x);
+ y = (int) Y(st->source[i]->r.y);
+ j = st->dx * (MAX_INV_RATE + 1 - st->source[i]->inv_rate) / (2 * MAX_INV_RATE);
+ if(j == 0)
+ j = 1;
+ XFillArc(st->dpy, curr_window, st->gcDraw, x - j, y - j, 2 * j, 2 * j, 0, 360 * 64);
+ }}
+
+ for(j = 0; j < st->source[i]->n; j++) {
+
+ int size = (st->scrWidth > 2560 ? 8 : 4); /* Retina displays */
+
+ if(st->source[i]->yv[j].v == 2)
+ continue;
+
+ /* Move the particles slightly off lattice */
+ x = X(st->source[i]->r.x + 1 + j) + RND(st->dx);
+ y = Y(st->source[i]->r.y + st->source[i]->yv[j].y) + RND(st->dy);
+ XFillArc(st->dpy, curr_window, st->gcDraw, x - size/2, y - size/2, size, size, 0, 360 * 64);
+ }
+
+ }
+
+ for(i = 0; i < st->max_searcher; i++)
+ draw_searcher(st, curr_window, i);
+
+}
+
+static void animate_anemotaxis(struct state *st, Drawable curr_window)
+{
+ int i, j;
+ Bool dead;
+
+ for(i = 0; i < st->max_src; i++) {
+
+ if(st->source[i] == NULL)
+ continue;
+
+ evolve_source(st->source[i]);
+
+ /* reap dead sources for which all particles are gone */
+ if(st->source[i]->inv_rate == 0) {
+
+ dead = True;
+
+ for(j = 0; j < st->source[i]->n; j++) {
+ if(st->source[i]->yv[j].v != 2) {
+ dead = False;
+ break;
+ }
+ }
+
+ if(dead == True) {
+ destroy_source(st->source[i]);
+ st->source[i] = NULL;
+ }
+ }
+ }
+
+ /* Decide if we want to add new sources */
+
+ for(i = 0; i < st->max_src; i++) {
+ if(st->source[i] == NULL && RND(st->max_dist * st->max_src) == 0)
+ st->source[i] = new_source(st);
+ }
+
+ if(st->max_searcher == 0) { /* kill some sources when searchers don't do that */
+ for(i = 0; i < st->max_src; i++) {
+ if(st->source[i] != NULL && RND(st->max_dist * st->max_src) == 0) {
+ destroy_source(st->source[i]);
+ st->source[i] = 0;
+ }
+ }
+ }
+
+ /* Now deal with searchers */
+
+ for(i = 0; i < st->max_searcher; i++) {
+
+ if((st->searcher[i] != NULL) && (st->searcher[i]->state == DONE)) {
+ destroy_searcher(st->searcher[i]);
+ st->searcher[i] = NULL;
+ }
+
+ if(st->searcher[i] == NULL) {
+
+ if(RND(st->max_dist * st->max_searcher) == 0) {
+
+ st->searcher[i] = new_searcher(st);
+
+ }
+ }
+
+ if(st->searcher[i] == NULL)
+ continue;
+
+ /* Check if searcher found a source or missed all of them */
+ for(j = 0; j < st->max_src; j++) {
+
+ if(st->source[j] == NULL || st->source[j]->inv_rate == 0)
+ continue;
+
+ if(st->searcher[i]->r.x < 0) {
+ st->searcher[i]->state = DONE;
+ break;
+ }
+
+ if((st->source[j]->r.y == st->searcher[i]->r.y) &&
+ (st->source[j]->r.x == st->searcher[i]->r.x)) {
+ st->searcher[i]->state = DONE;
+ st->source[j]->inv_rate = 0; /* source disappears */
+
+ /* Make it flash */
+ st->searcher[i]->color = WhitePixel(st->dpy, DefaultScreen(st->dpy));
+
+ break;
+ }
+ }
+
+ st->searcher[i]->c = 0; /* set it here in case we don't get to get_v() */
+
+ /* Find the concentration at searcher's location */
+
+ if(st->searcher[i]->state != DONE) {
+ for(j = 0; j < st->max_src; j++) {
+
+ if(st->source[j] == NULL)
+ continue;
+
+ get_v(st->source[j], st->searcher[i]);
+
+ if(st->searcher[i]->c == 1)
+ break;
+ }
+ }
+
+ move_searcher(st->searcher[i]);
+
+ }
+
+ draw_image(st, curr_window);
+}
+
+static unsigned long
+anemotaxis_draw (Display *disp, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes wa;
+ int w, h;
+
+
+ XGetWindowAttributes(st->dpy, st->window, &wa);
+
+ w = wa.width;
+ h = wa.height;
+
+ if(w != st->scrWidth || h != st->scrHeight) {
+ st->scrWidth = w;
+ st->scrHeight = h;
+ st->ax = st->scrWidth / (double) st->max_dist;
+ st->ay = st->scrHeight / (2. * st->max_dist);
+ st->bx = 0.;
+ st->by = 0.;
+
+ if((st->dx = st->scrWidth / (2 * st->max_dist)) == 0)
+ st->dx = 1;
+ if((st->dy = st->scrHeight / (4 * st->max_dist)) == 0)
+ st->dy = 1;
+ XSetLineAttributes(st->dpy, st->gcDraw, st->dx / 3 + 1, LineSolid, CapRound, JoinRound);
+ }
+
+ XFillRectangle (st->dpy, st->b, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+ animate_anemotaxis(st, st->b);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb) {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif
+ if (st->dbuf) {
+ XCopyArea (st->dpy, st->b, st->window, st->gcClear, 0, 0,
+ st->scrWidth, st->scrHeight, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+
+
+static void
+anemotaxis_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+anemotaxis_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+anemotaxis_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ if (st->source) {
+ for (i = 0; i < st->max_src; i++)
+ if (st->source[i]) destroy_source (st->source[i]);
+ free (st->source);
+ }
+ if (st->searcher) {
+ for (i = 0; i < st->max_searcher; i++)
+ if (st->searcher[i]) destroy_searcher (st->searcher[i]);
+ free (st->searcher);
+ }
+ free (st);
+}
+
+
+
+
+static const char *anemotaxis_defaults [] = {
+ ".background: black",
+ "*distance: 40",
+ "*sources: 25",
+ "*searchers: 25",
+ "*delay: 20000",
+ "*colors: 20",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+#endif
+ 0
+};
+
+
+static XrmOptionDescRec anemotaxis_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-distance", ".distance", XrmoptionSepArg, 0 },
+ { "-sources", ".sources", XrmoptionSepArg, 0 },
+ { "-searchers", ".searchers", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Anemotaxis", anemotaxis)
diff --git a/hacks/anemotaxis.man b/hacks/anemotaxis.man
new file mode 100644
index 0000000..cf5c1ea
--- /dev/null
+++ b/hacks/anemotaxis.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+anemotaxis - directional search on a plane.
+.SH SYNOPSIS
+.B anemotaxis
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-distance \fInumber\fP]
+[\-sources \fInumber\fP]
+[\-searchers \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+The program demonstrates a search algorithm designed for locating a
+source of odor in turbulent atmosphere. The odor is convected by wind
+which has a constant mean direction and fluctuations around it. The
+searcher is able to sense the odor and determine local instantaneous
+wind direction. The goal is to find the source in the shortest mean
+time. Some animals face this task to find mates, food, home etc. They
+exhibit very particular, zigzagging search trajectories.
+
+This is modeled as a search on a discrete two-dimensional lattice. The
+source releases particles that drift with constant velocity in one
+direction and walk randomly in the other direction. The searcher knows
+if it hit a particle, and if so, particle's position one time step
+earlier (local wind direction). The program paints sources and
+particles released by them as well as trajectories of searchers who are
+trying to capture the sources.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-distance \fInumber\fP
+Max initial distance to the source . 10 - 250. Default: 40.
+.TP 8
+.B \-sources \fInumber\fP
+Max number of sources. Default: 25.
+.TP 8
+.B \-searchers \fInumber\fP
+Max number of searchers. Default: 25.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Eugene Balkovsky. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Eugene Balkovsky
diff --git a/hacks/ant.c b/hacks/ant.c
new file mode 100644
index 0000000..56d3036
--- /dev/null
+++ b/hacks/ant.c
@@ -0,0 +1,1350 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * ant --- Chris Langton's generalized turing machine ants (also known
+ * as Greg Turk's turmites) whose tape is the screen
+ */
+
+#if 0
+static const char sccsid[] = "@(#)ant.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 16-Apr-1997: -neighbors 3 and 8 added
+ * 01-Jan-1997: Updated ant.c to handle more kinds of ants. Thanks to
+ * J Austin David <Austin.David@tlogic.com>. Check it out in
+ * java at http://havoc.gtf.gatech.edu/austin He thought up the
+ * new Ladder ant.
+ * 04-Apr-1996: -neighbors 6 runtime-time option added for hexagonal ants
+ * (bees), coded from an idea of Jim Propp's in Science News,
+ * Oct 28, 1995 VOL. 148 page 287
+ * 20-Sep-1995: Memory leak in ant fixed. Now random colors.
+ * 05-Sep-1995: Coded from A.K. Dewdney's "Computer Recreations", Scientific
+ * American Magazine" Sep 1989 pp 180-183, Mar 1990 p 121
+ * Also used Ian Stewart's Mathematical Recreations, Scientific
+ * American Jul 1994 pp 104-107
+ * also used demon.c and life.c as a guide.
+ */
+
+/*-
+ Species Grid Number of Neighbors
+ ------- ---- ------------------
+ Ants Square 4 (or 8)
+ Bees Hexagon 6
+ Bees Triangle 3 (or 9, 12)
+
+ Neighbors 6 and neighbors 3 produce the same Turk ants.
+*/
+
+#ifndef HAVE_JWXYZ
+/*# define DO_STIPPLE*/
+#endif
+
+#ifdef STANDALONE
+# define MODE_ant
+# define DEFAULTS "*delay: 20000 \n" \
+ "*count: -3 \n" \
+ "*cycles: 40000 \n" \
+ "*size: -12 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+
+# define reshape_ant 0
+# define release_ant 0
+# define ant_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+#include "automata.h"
+
+#ifdef MODE_ant
+
+/*-
+ * neighbors of 0 randomizes it for 3, 4, 6, 8, 12 (last 2 are less likely)
+ */
+
+#define DEF_NEIGHBORS "0" /* choose random value */
+#define DEF_TRUCHET "False"
+#define DEF_EYES "False"
+#define DEF_SHARPTURN "False"
+
+static int neighbors;
+static Bool truchet;
+static Bool eyes;
+static Bool sharpturn;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-neighbors", ".ant.neighbors", XrmoptionSepArg, 0},
+ {"-truchet", ".ant.truchet", XrmoptionNoArg, "on"},
+ {"+truchet", ".ant.truchet", XrmoptionNoArg, "off"},
+ {"-eyes", ".ant.eyes", XrmoptionNoArg, "on"},
+ {"+eyes", ".ant.eyes", XrmoptionNoArg, "off"},
+ {"-sharpturn", ".ant.sharpturn", XrmoptionNoArg, "on"},
+ {"+sharpturn", ".ant.sharpturn", XrmoptionNoArg, "off"},
+};
+static argtype vars[] =
+{
+ {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int},
+ {&truchet, "truchet", "Truchet", DEF_TRUCHET, t_Bool},
+ {&eyes, "eyes", "Eyes", DEF_EYES, t_Bool},
+ {&sharpturn, "sharpturn", "SharpTurn", DEF_SHARPTURN, t_Bool},
+};
+static OptionStruct desc[] =
+{
+ {"-neighbors num", "squares 4 or 8, hexagons 6, triangles 3 or 12"},
+ {"-/+truchet", "turn on/off Truchet lines"},
+ {"-/+eyes", "turn on/off eyes"},
+ {"-/+sharpturn", "turn on/off sharp turns (6, 8 or 12 neighbors only)"}
+};
+
+ENTRYPOINT ModeSpecOpt ant_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+const ModStruct ant_description =
+{"ant",
+ "init_ant", "draw_ant", (char *) NULL,
+ "refresh_ant", "init_ant", "free_ant", &ant_opts,
+ 1000, -3, 40000, -12, 64, 1.0, "",
+ "Shows Langton's and Turk's generalized ants", 0, NULL};
+
+#endif
+
+#define ANTBITS(n,w,h)\
+ if ((ap->pixmaps[ap->init_bits]=\
+ XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1))==None){\
+ free_ant(mi); return;} else {ap->init_bits++;}
+
+/* If you change the table you may have to change the following 2 constants */
+#define STATES 2
+#define MINANTS 1
+#define REDRAWSTEP 2000 /* How much tape to draw per cycle */
+#define MINGRIDSIZE 24
+#define MINSIZE 1
+#define MINRANDOMSIZE 5
+#define ANGLES 360
+
+typedef struct {
+ unsigned char color;
+ short direction;
+ unsigned char next;
+} statestruct;
+
+typedef struct {
+ int col, row;
+ short direction;
+ unsigned char state;
+} antstruct;
+
+typedef struct {
+ Bool painted;
+ int neighbors;
+ int generation;
+ int xs, ys;
+ int xb, yb;
+ int init_dir;
+ int nrows, ncols;
+ int width, height;
+ unsigned char ncolors, nstates;
+ int n;
+ int redrawing, redrawpos;
+ int truchet; /* Only for Turk modes */
+ int eyes;
+ int sharpturn;
+ statestruct machine[NUMSTIPPLES * STATES];
+ unsigned char *tape;
+ unsigned char *truchet_state;
+ antstruct *ants;
+ int init_bits;
+ unsigned char colors[NUMSTIPPLES - 1];
+# ifdef DO_STIPPLE
+ GC stippledGC;
+# endif /* DO_STIPPLE */
+ Pixmap pixmaps[NUMSTIPPLES - 1];
+ union {
+ XPoint hexagon[7]; /* Need more than 6 for truchet */
+ XPoint triangle[2][4]; /* Need more than 3 for truchet */
+ } shape;
+} antfarmstruct;
+
+static char plots[] =
+{3, 4, 6, 8,
+#ifdef NUMBER_9
+ 9,
+#endif
+ 12};
+
+#define NEIGHBORKINDS ((long) (sizeof plots / sizeof *plots))
+#define GOODNEIGHBORKINDS 3
+
+/* Relative ant moves */
+#define FS 0 /* Step */
+#define TRS 1 /* Turn right, then step */
+#define THRS 2 /* Turn hard right, then step */
+#define TBS 3 /* Turn back, then step */
+#define THLS 4 /* Turn hard left, then step */
+#define TLS 5 /* Turn left, then step */
+#define SF 6 /* Step */
+#define STR 7 /* Step then turn right */
+#define STHR 8 /* Step then turn hard right */
+#define STB 9 /* Step then turn back */
+#define STHL 10 /* Step then turn hard left */
+#define STL 11 /* Step then turn left */
+
+static antfarmstruct *antfarms = (antfarmstruct *) NULL;
+
+/* LANGTON'S ANT (10) Chaotic after 500, Builder after 10,000 (104p) */
+/* TURK'S 100 ANT Always chaotic?, tested past 150,000,000 */
+/* TURK'S 101 ANT Always chaotic? */
+/* TURK'S 110 ANT Builder at 150 (18p) */
+/* TURK'S 1000 ANT Always chaotic? */
+/* TURK'S 1100 SYMMETRIC ANT all even run 1's and 0's are symmetric */
+/* other examples 1001, 110011, 110000, 1001101 */
+/* TURK'S 1101 ANT Builder after 250,000 (388p) */
+/* Once saw a chess horse type builder (i.e. non-45 degree builder) */
+
+/* BEE ONLY */
+/* All alternating 10 appear symmetric, no proof (i.e. 10, 1010, etc) */
+/* Even runs of 0's and 1's are also symmetric */
+/* I have seen Hexagonal builders but they are more rare. */
+
+static unsigned char tables[][3 * NUMSTIPPLES * STATES + 2] =
+{
+#if 0
+ /* Here just so you can figure out notation */
+ { /* Langton's ant */
+ 2, 1,
+ 1, TLS, 0, 0, TRS, 0
+ },
+#else
+ /* First 2 numbers are the size (ncolors, nstates) */
+ { /* LADDER BUILDER */
+ 4, 1,
+ 1, STR, 0, 2, STL, 0, 3, TRS, 0, 0, TLS, 0
+ },
+ { /* SPIRALING PATTERN */
+ 2, 2,
+ 1, TLS, 0, 0, FS, 1,
+ 1, TRS, 0, 1, TRS, 0
+ },
+ { /* SQUARE (HEXAGON) BUILDER */
+ 2, 2,
+ 1, TLS, 0, 0, FS, 1,
+ 0, TRS, 0, 1, TRS, 0
+ },
+#endif
+};
+
+#define NTABLES (sizeof tables / sizeof tables[0])
+
+static void
+position_of_neighbor(antfarmstruct * ap, int dir, int *pcol, int *prow)
+{
+ int col = *pcol, row = *prow;
+
+ if (ap->neighbors == 6) {
+ switch (dir) {
+ case 0:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 60:
+ if (!(row & 1))
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 120:
+ if (row & 1)
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 180:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 240:
+ if (row & 1)
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 300:
+ if (!(row & 1))
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ switch (dir) {
+ case 0:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 45:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 90:
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 135:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 180:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 225:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 270:
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 315:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ } else { /* TRI */
+ if ((col + row) % 2) { /* right */
+ switch (dir) {
+ case 0:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 30:
+ case 40:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 60:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ if (!row)
+ row = ap->nrows - 2;
+ else if (!(row - 1))
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 80:
+ case 90:
+ if (!row)
+ row = ap->nrows - 2;
+ else if (!(row - 1))
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 120:
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 150:
+ case 160:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 180:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 200:
+ case 210:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 240:
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 270:
+ case 280:
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 300:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 320:
+ case 330:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ } else { /* left */
+ switch (dir) {
+ case 0:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 30:
+ case 40:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 60:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 80:
+ case 90:
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 120:
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 150:
+ case 160:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 180:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 200:
+ case 210:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 240:
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 270:
+ case 280:
+ if (!row)
+ row = ap->nrows - 2;
+ else if (row == 1)
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 300:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ if (!row)
+ row = ap->nrows - 2;
+ else if (row == 1)
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 320:
+ case 330:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ }
+ }
+ *pcol = col;
+ *prow = row;
+}
+
+static void
+fillcell(ModeInfo * mi, GC gc, int col, int row)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+ if (ap->neighbors == 6) {
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+ ap->shape.hexagon[0].x = ap->xb + ccol * ap->xs;
+ ap->shape.hexagon[0].y = ap->yb + crow * ap->ys;
+ if (ap->xs == 1 && ap->ys == 1)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->shape.hexagon[0].x, ap->shape.hexagon[0].y);
+ else
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->shape.hexagon, 6, Convex, CoordModePrevious);
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->xb + ap->xs * col, ap->yb + ap->ys * row,
+ ap->xs - (ap->xs > 3), ap->ys - (ap->ys > 3));
+ } else { /* TRI */
+ int orient = (col + row) % 2; /* O left 1 right */
+
+ ap->shape.triangle[orient][0].x = ap->xb + col * ap->xs;
+ ap->shape.triangle[orient][0].y = ap->yb + row * ap->ys;
+ if (ap->xs <= 3 || ap->ys <= 3)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ((orient) ? -1 : 1) + ap->shape.triangle[orient][0].x,
+ ap->shape.triangle[orient][0].y);
+ else {
+ if (orient)
+ ap->shape.triangle[orient][0].x += (ap->xs / 2 - 1);
+ else
+ ap->shape.triangle[orient][0].x -= (ap->xs / 2 - 1);
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->shape.triangle[orient], 3, Convex, CoordModePrevious);
+ }
+ }
+}
+
+static void
+truchetcell(ModeInfo * mi, int col, int row, int truchetstate)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+ if (ap->neighbors == 6) {
+
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+ int side;
+ int fudge = 7; /* fudge because the hexagons are not exact */
+ XPoint hex, hex2;
+
+ if (ap->sharpturn) {
+ hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs / 2.0) - 1;
+ hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys / 2.0) - 1;
+ for (side = 0; side < 6; side++) {
+ if (side) {
+ hex.x += ap->shape.hexagon[side].x;
+ hex.y += ap->shape.hexagon[side].y;
+ }
+ if (truchetstate == side % 2)
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ hex.x, hex.y, ap->xs, ap->ys,
+ ((570 - (side * 60) + fudge) % 360) * 64, (120 - 2 * fudge) * 64);
+ }
+ } else {
+ /* Very crude approx of Sqrt 3, so it will not cause drawing errors. */
+ hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs * 1.6 / 2.0) - 1;
+ hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys * 1.6 / 2.0) - 1;
+ for (side = 0; side < 6; side++) {
+ if (side) {
+ hex.x += ap->shape.hexagon[side].x;
+ hex.y += ap->shape.hexagon[side].y;
+ }
+ hex2.x = hex.x + ap->shape.hexagon[side + 1].x / 2;
+ hex2.y = hex.y + ap->shape.hexagon[side + 1].y / 2 + 1;
+ /* Lots of fudging here */
+ if (side == 1) {
+ hex2.x += (short) (ap->xs * 0.1 + 1);
+ hex2.y += (short) (ap->ys * 0.1 - ((ap->ys > 5) ? 1 : 0));
+ } else if (side == 2) {
+ hex2.x += (short) (ap->xs * 0.1);
+ } else if (side == 4) {
+ hex2.x += (short) (ap->xs * 0.1);
+ hex2.y += (short) (ap->ys * 0.1 - 1);
+ } else if (side == 5) {
+ hex2.x += (short) (ap->xs * 0.5);
+ hex2.y += (short) (-ap->ys * 0.3 + 1);
+ }
+ if (truchetstate == side % 3)
+ /* Crude approx of 120 deg, so it will not cause drawing errors. */
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ hex2.x, hex2.y,
+ (int) ((double) ap->xs * 1.5), (int) ((double) ap->ys * 1.5),
+ ((555 - (side * 60)) % 360) * 64, 90 * 64);
+ }
+ }
+ } else if (ap->neighbors == 4) {
+ if (truchetstate) {
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col - ap->xs / 2 + 1,
+ ap->yb + ap->ys * row + ap->ys / 2 - 1,
+ ap->xs - 2, ap->ys - 2,
+ 0 * 64, 90 * 64);
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 1,
+ ap->yb + ap->ys * row - ap->ys / 2 + 1,
+ ap->xs - 2, ap->ys - 2,
+ -90 * 64, -90 * 64);
+ } else {
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col - ap->xs / 2 + 1,
+ ap->yb + ap->ys * row - ap->ys / 2 + 1,
+ ap->xs - 2, ap->ys - 2,
+ 0 * 64, -90 * 64);
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 1,
+ ap->yb + ap->ys * row + ap->ys / 2 - 1,
+ ap->xs - 2, ap->ys - 2,
+ 90 * 64, 90 * 64);
+ }
+ } else if (ap->neighbors == 3) {
+ int orient = (col + row) % 2; /* O left 1 right */
+ int side, ang;
+ int fudge = 7; /* fudge because the triangles are not exact */
+ double fudge2 = 1.18;
+ XPoint tri;
+
+ tri.x = ap->xb + col * ap->xs;
+ tri.y = ap->yb + row * ap->ys;
+ if (orient) {
+ tri.x += (ap->xs / 2 - 1);
+ } else {
+ tri.x -= (ap->xs / 2 - 1);
+ }
+ for (side = 0; side < 3; side++) {
+ if (side > 0) {
+ tri.x += ap->shape.triangle[orient][side].x;
+ tri.y += ap->shape.triangle[orient][side].y;
+ }
+ if (truchetstate == side) {
+ if (orient)
+ ang = (510 - side * 120) % 360; /* Right */
+ else
+ ang = (690 - side * 120) % 360; /* Left */
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (int) (tri.x - ap->xs * fudge2 / 2),
+ (int) (tri.y - 3 * ap->ys * fudge2 / 4),
+ (unsigned int) (ap->xs * fudge2),
+ (unsigned int) (3 * ap->ys * fudge2 / 2),
+ (ang + fudge) * 64, (60 - 2 * fudge) * 64);
+ }
+ }
+ }
+}
+
+static void
+drawcell(ModeInfo * mi, int col, int row, unsigned char color)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ GC gc;
+
+ if (!color) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ gc = MI_GC(mi);
+# ifdef DO_STIPPLE
+ } else if (MI_NPIXELS(mi) <= 2) {
+ XGCValues gcv;
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ gcv.stipple = ap->pixmaps[color - 1];
+ XChangeGC(MI_DISPLAY(mi), ap->stippledGC,
+ GCStipple | GCForeground | GCBackground, &gcv);
+ gc = ap->stippledGC;
+# endif /* !DO_STIPPLE */
+ } else {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ap->colors[color - 1]));
+ gc = MI_GC(mi);
+ }
+ fillcell(mi, gc, col, row);
+}
+
+static void
+drawtruchet(ModeInfo * mi, int col, int row,
+ unsigned char color, unsigned char truchetstate)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+ if (!color)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ else if (MI_NPIXELS(mi) > 2 || color > ap->ncolors / 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ truchetcell(mi, col, row, truchetstate);
+}
+
+static void
+draw_anant(ModeInfo * mi, int direction, int col, int row)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+ fillcell(mi, MI_GC(mi), col, row);
+ if (ap->eyes) { /* Draw Eyes */
+ XSetForeground(display, MI_GC(mi), MI_BLACK_PIXEL(mi));
+ if (ap->neighbors == 6) {
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+ int side, ang;
+ XPoint hex;
+
+ if (!(ap->xs > 3 && ap->ys > 3))
+ return;
+ hex.x = ap->xb + ccol * ap->xs;
+ hex.y = ap->yb + crow * ap->ys + ap->ys / 2;
+ ang = direction * ap->neighbors / ANGLES;
+ for (side = 0; side < ap->neighbors; side++) {
+ if (side) {
+ hex.x -= ap->shape.hexagon[side].x / 2;
+ hex.y += ap->shape.hexagon[side].y / 2;
+ }
+ if (side == (ap->neighbors + ang - 2) % ap->neighbors)
+ XDrawPoint(display, window, MI_GC(mi), hex.x, hex.y);
+ if (side == (ap->neighbors + ang - 1) % ap->neighbors)
+ XDrawPoint(display, window, MI_GC(mi), hex.x, hex.y);
+ }
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ if (!(ap->xs > 3 && ap->ys > 3))
+ return;
+ switch (direction) {
+ case 0:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * row + ap->ys / 2 - 2);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * row + ap->ys / 2);
+ break;
+ case 45:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 4,
+ ap->yb + ap->ys * row + 1);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * row + 2);
+ break;
+ case 90:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 2,
+ ap->yb + ap->ys * row + 1);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2,
+ ap->yb + ap->ys * row + 1);
+ break;
+ case 135:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 2,
+ ap->yb + ap->ys * row + 1);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * row + 2);
+ break;
+ case 180:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * row + ap->ys / 2 - 2);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * row + ap->ys / 2);
+ break;
+ case 225:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 2,
+ ap->yb + ap->ys * (row + 1) - 3);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * (row + 1) - 4);
+ break;
+ case 270:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 2,
+ ap->yb + ap->ys * (row + 1) - 3);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2,
+ ap->yb + ap->ys * (row + 1) - 3);
+ break;
+ case 315:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 4,
+ ap->yb + ap->ys * (row + 1) - 3);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * (row + 1) - 4);
+ break;
+ default:
+ (void) fprintf(stderr, "wrong eyes direction %d for ant eyes\n", direction);
+ }
+ } else { /* TRI */
+ int orient = (col + row) % 2; /* O left 1 right */
+ int side, ang;
+ XPoint tri;
+
+ if (!(ap->xs > 6 && ap->ys > 6))
+ return;
+ tri.x = ap->xb + col * ap->xs;
+ tri.y = ap->yb + row * ap->ys;
+ if (orient)
+ tri.x += (ap->xs / 6 - 1);
+ else
+ tri.x -= (ap->xs / 6 - 1);
+ ang = direction * ap->neighbors / ANGLES;
+ /* approx... does not work that well for even numbers */
+ if (
+#ifdef NUMBER_9
+ ap->neighbors == 9 ||
+#endif
+ ap->neighbors == 12) {
+#ifdef UNDER_CONSTRUCTION
+ /* Not sure why this does not work */
+ ang = ((ang + ap->neighbors / 6) / (ap->neighbors / 3)) % 3;
+#else
+ return;
+#endif
+ }
+ for (side = 0; side < 3; side++) {
+ if (side) {
+ tri.x += ap->shape.triangle[orient][side].x / 3;
+ tri.y += ap->shape.triangle[orient][side].y / 3;
+ }
+ /* Either you have the eyes in back or one eye in front */
+#if 0
+ if (side == ang)
+ XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
+#else
+ if (side == (ang + 2) % 3)
+ XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
+ if (side == (ang + 1) % 3)
+ XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
+#endif
+ }
+ }
+ }
+}
+
+#if 0
+static void
+RandomSoup(mi)
+ ModeInfo *mi;
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int row, col, mrow = 0;
+
+ for (row = 0; row < ap->nrows; ++row) {
+ for (col = 0; col < ap->ncols; ++col) {
+ ap->old[col + mrow] = (unsigned char) NRAND((int) ap->ncolors);
+ drawcell(mi, col, row, ap->old[col + mrow]);
+ }
+ mrow += ap->nrows;
+ }
+}
+
+#endif
+
+static short
+fromTableDirection(unsigned char dir, int local_neighbors)
+{
+ /* Crafted to work for odd number of neighbors */
+ switch (dir) {
+ case FS:
+ return 0;
+ case TLS:
+ return (ANGLES / local_neighbors);
+ case THLS:
+ return (2 * ANGLES / local_neighbors);
+ case TBS:
+ return ((local_neighbors / 2) * ANGLES / local_neighbors);
+ case THRS:
+ return (ANGLES - 2 * ANGLES / local_neighbors);
+ case TRS:
+ return (ANGLES - ANGLES / local_neighbors);
+ case SF:
+ return ANGLES;
+ case STL:
+ return (ANGLES + ANGLES / local_neighbors);
+ case STHL:
+ return (ANGLES + 2 * ANGLES / local_neighbors);
+ case STB:
+ return (ANGLES + (local_neighbors / 2) * ANGLES / local_neighbors);
+ case STHR:
+ return (2 * ANGLES - 2 * ANGLES / local_neighbors);
+ case STR:
+ return (2 * ANGLES - ANGLES / local_neighbors);
+ default:
+ (void) fprintf(stderr, "wrong direction %d from table\n", dir);
+ }
+ return -1;
+}
+
+static void
+getTable(ModeInfo * mi, int i)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int j, total;
+ unsigned char *patptr;
+
+ patptr = &tables[i][0];
+ ap->ncolors = *patptr++;
+ ap->nstates = *patptr++;
+ total = ap->ncolors * ap->nstates;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout,
+ "ants %d, neighbors %d, table number %d, colors %d, states %d\n",
+ ap->n, ap->neighbors, i, ap->ncolors, ap->nstates);
+ for (j = 0; j < total; j++) {
+ ap->machine[j].color = *patptr++;
+ if (ap->sharpturn && ap->neighbors > 4) {
+ int k = *patptr++;
+
+ switch (k) {
+ case TRS:
+ k = THRS;
+ break;
+ case THRS:
+ k = TRS;
+ break;
+ case THLS:
+ k = TLS;
+ break;
+ case TLS:
+ k = THLS;
+ break;
+ case STR:
+ k = STHR;
+ break;
+ case STHR:
+ k = STR;
+ break;
+ case STHL:
+ k = STL;
+ break;
+ case STL:
+ k = STHL;
+ break;
+ default:
+ break;
+ }
+ ap->machine[j].direction = fromTableDirection(k, ap->neighbors);
+ } else {
+ ap->machine[j].direction = fromTableDirection(*patptr++, ap->neighbors);
+ }
+ ap->machine[j].next = *patptr++;
+ }
+ ap->truchet = False;
+}
+
+static void
+getTurk(ModeInfo * mi, int i)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int power2, j, number, total;
+
+ /* To force a number, say <i = 2;> has i + 2 (or 4) binary digits */
+ power2 = 1 << (i + 1);
+ /* Do not want numbers which in binary are all 1's. */
+ number = NRAND(power2 - 1) + power2;
+ /* To force a particular number, say <number = 10;> */
+
+ ap->ncolors = i + 2;
+ ap->nstates = 1;
+ total = ap->ncolors * ap->nstates;
+ for (j = 0; j < total; j++) {
+ ap->machine[j].color = (j + 1) % total;
+ if (ap->sharpturn && ap->neighbors > 4) {
+ ap->machine[j].direction = (power2 & number) ?
+ fromTableDirection(THRS, ap->neighbors) :
+ fromTableDirection(THLS, ap->neighbors);
+ } else {
+ ap->machine[j].direction = (power2 & number) ?
+ fromTableDirection(TRS, ap->neighbors) :
+ fromTableDirection(TLS, ap->neighbors);
+ }
+ ap->machine[j].next = 0;
+ power2 >>= 1;
+ }
+ ap->truchet = (ap->truchet && ap->xs > 2 && ap->ys > 2 &&
+ (ap->neighbors == 3 || ap->neighbors == 4 || ap->neighbors == 6));
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout,
+ "ants %d, neighbors %d, Turk's number %d, colors %d\n",
+ ap->n, ap->neighbors, number, ap->ncolors);
+}
+
+ENTRYPOINT void
+free_ant(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int shade;
+
+#ifdef DO_STIPPLE
+ if (ap->stippledGC != None) {
+ XFreeGC(display, ap->stippledGC);
+ ap->stippledGC = None;
+ }
+#endif /* DO_STIPPLE */
+ for (shade = 0; shade < ap->init_bits; shade++) {
+ XFreePixmap(display, ap->pixmaps[shade]);
+ }
+ ap->init_bits = 0;
+ if (ap->tape != NULL) {
+ (void) free((void *) ap->tape);
+ ap->tape = (unsigned char *) NULL;
+ }
+ if (ap->ants != NULL) {
+ (void) free((void *) ap->ants);
+ ap->ants = (antstruct *) NULL;
+ }
+ if (ap->truchet_state != NULL) {
+ (void) free((void *) ap->truchet_state);
+ ap->truchet_state = (unsigned char *) NULL;
+ }
+}
+
+ENTRYPOINT void
+init_ant(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ int size = MI_SIZE(mi);
+ antfarmstruct *ap;
+ int col, row, dir;
+ int i;
+
+ MI_INIT(mi, antfarms);
+ /*if (antfarms == NULL) {
+ if ((antfarms = (antfarmstruct *) calloc(MI_NUM_SCREENS(mi),
+ sizeof (antfarmstruct))) == NULL)
+ return;
+ }*/
+ ap = &antfarms[MI_SCREEN(mi)];
+
+ ap->redrawing = 0;
+#ifdef DO_STIPPLE
+ if (MI_NPIXELS(mi) <= 2) {
+ Window window = MI_WINDOW(mi);
+ if (ap->stippledGC == None) {
+ XGCValues gcv;
+
+ gcv.fill_style = FillOpaqueStippled;
+ if ((ap->stippledGC = XCreateGC(display, window,
+ GCFillStyle,
+ &gcv)) == None) {
+ free_ant(mi);
+ return;
+ }
+ }
+ if (ap->init_bits == 0) {
+ for (i = 1; i < NUMSTIPPLES; i++) {
+ ANTBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
+ }
+ }
+ }
+#endif /* DO_STIPPLE */
+ ap->generation = 0;
+ ap->n = MI_COUNT(mi);
+ if (ap->n < -MINANTS) {
+ /* if ap->n is random ... the size can change */
+ if (ap->ants != NULL) {
+ (void) free((void *) ap->ants);
+ ap->ants = (antstruct *) NULL;
+ }
+ ap->n = NRAND(-ap->n - MINANTS + 1) + MINANTS;
+ } else if (ap->n < MINANTS)
+ ap->n = MINANTS;
+
+ ap->width = MI_WIDTH(mi);
+ ap->height = MI_HEIGHT(mi);
+
+ for (i = 0; i < NEIGHBORKINDS; i++) {
+ if (neighbors == plots[i]) {
+ ap->neighbors = plots[i];
+ break;
+ }
+ if (i == NEIGHBORKINDS - 1) {
+ if (!NRAND(10)) {
+ /* Make above 6 rare */
+ ap->neighbors = plots[NRAND(NEIGHBORKINDS)];
+ } else {
+ ap->neighbors = plots[NRAND(GOODNEIGHBORKINDS)];
+ }
+ break;
+ }
+ }
+
+ if (ap->neighbors == 6) {
+ int nccols, ncrows;
+
+ if (ap->width < 8)
+ ap->width = 8;
+ if (ap->height < 8)
+ ap->height = 8;
+ if (size < -MINSIZE) {
+ ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ if (ap->ys < MINRANDOMSIZE)
+ ap->ys = MIN(MINRANDOMSIZE,
+ MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+ } else if (size < MINSIZE) {
+ if (!size)
+ ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+ else
+ ap->ys = MINSIZE;
+ } else
+ ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE));
+ ap->xs = ap->ys;
+ nccols = MAX(ap->width / ap->xs - 2, 2);
+ ncrows = MAX(ap->height / ap->ys - 1, 4);
+ ap->ncols = nccols / 2;
+ ap->nrows = 2 * (ncrows / 4);
+ ap->xb = (ap->width - ap->xs * nccols) / 2 + ap->xs / 2;
+ ap->yb = (ap->height - ap->ys * (ncrows / 2) * 2) / 2 + ap->ys - 2;
+ for (i = 0; i < 6; i++) {
+ ap->shape.hexagon[i].x = (ap->xs - 1) * hexagonUnit[i].x;
+ ap->shape.hexagon[i].y = ((ap->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+ }
+ /* Avoid array bounds read of hexagonUnit */
+ ap->shape.hexagon[6].x = 0;
+ ap->shape.hexagon[6].y = 0;
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ if (size < -MINSIZE) {
+ ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ if (ap->ys < MINRANDOMSIZE)
+ ap->ys = MIN(MINRANDOMSIZE,
+ MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+ } else if (size < MINSIZE) {
+ if (!size)
+ ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+ else
+ ap->ys = MINSIZE;
+ } else
+ ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE));
+ ap->xs = ap->ys;
+ ap->ncols = MAX(ap->width / ap->xs, 2);
+ ap->nrows = MAX(ap->height / ap->ys, 2);
+ ap->xb = (ap->width - ap->xs * ap->ncols) / 2;
+ ap->yb = (ap->height - ap->ys * ap->nrows) / 2;
+ } else { /* TRI */
+ int orient;
+
+ if (ap->width < 2)
+ ap->width = 2;
+ if (ap->height < 2)
+ ap->height = 2;
+ if (size < -MINSIZE) {
+ ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ if (ap->ys < MINRANDOMSIZE)
+ ap->ys = MIN(MINRANDOMSIZE,
+ MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+ } else if (size < MINSIZE) {
+ if (!size)
+ ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+ else
+ ap->ys = MINSIZE;
+ } else
+ ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE));
+ ap->xs = (int) (1.52 * ap->ys);
+ ap->ncols = (MAX(ap->width / ap->xs - 1, 2) / 2) * 2;
+ ap->nrows = (MAX(ap->height / ap->ys - 1, 2) / 2) * 2;
+ ap->xb = (ap->width - ap->xs * ap->ncols) / 2 + ap->xs / 2;
+ ap->yb = (ap->height - ap->ys * ap->nrows) / 2 + ap->ys;
+ for (orient = 0; orient < 2; orient++) {
+ for (i = 0; i < 3; i++) {
+ ap->shape.triangle[orient][i].x =
+ (ap->xs - 2) * triangleUnit[orient][i].x;
+ ap->shape.triangle[orient][i].y =
+ (ap->ys - 2) * triangleUnit[orient][i].y;
+ }
+ /* Avoid array bounds read of triangleUnit */
+ ap->shape.triangle[orient][3].x = 0;
+ ap->shape.triangle[orient][3].y = 0;
+ }
+ }
+
+ XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinMiter);
+ MI_CLEARWINDOW(mi);
+ ap->painted = False;
+
+ if (MI_IS_FULLRANDOM(mi)) {
+ ap->truchet = (Bool) (LRAND() & 1);
+ ap->eyes = (Bool) (LRAND() & 1);
+ ap->sharpturn = (Bool) (LRAND() & 1);
+ } else {
+ ap->truchet = truchet;
+ ap->eyes = eyes;
+ ap->sharpturn = sharpturn;
+ }
+ if (!NRAND(NUMSTIPPLES)) {
+ getTable(mi, (int) (NRAND(NTABLES)));
+ } else
+ getTurk(mi, (int) (NRAND(NUMSTIPPLES - 1)));
+ if (MI_NPIXELS(mi) > 2)
+ for (i = 0; i < (int) ap->ncolors - 1; i++)
+ ap->colors[i] = (unsigned char) (NRAND(MI_NPIXELS(mi)) +
+ i * MI_NPIXELS(mi)) / ((int) (ap->ncolors - 1));
+ if (ap->ants == NULL) {
+ if ((ap->ants = (antstruct *) malloc(ap->n * sizeof (antstruct))) ==
+ NULL) {
+ free_ant(mi);
+ return;
+ }
+ }
+ if (ap->tape != NULL)
+ (void) free((void *) ap->tape);
+ if ((ap->tape = (unsigned char *) calloc(ap->ncols * ap->nrows,
+ sizeof (unsigned char))) == NULL) {
+ free_ant(mi);
+ return;
+ }
+ if (ap->truchet_state != NULL)
+ (void) free((void *) ap->truchet_state);
+ if ((ap->truchet_state = (unsigned char *) calloc(ap->ncols * ap->nrows,
+ sizeof (unsigned char))) == NULL) {
+ free_ant(mi);
+ return;
+ }
+
+ row = ap->nrows / 2;
+ col = ap->ncols / 2;
+ if (col > 0 && ((ap->neighbors % 2) || ap->neighbors == 12) && (LRAND() & 1))
+ col--;
+ dir = NRAND(ap->neighbors) * ANGLES / ap->neighbors;
+ ap->init_dir = dir;
+#ifdef NUMBER_9
+ if (ap->neighbors == 9 && !((col + row) & 1))
+ dir = (dir + ANGLES - ANGLES / (ap->neighbors * 2)) % ANGLES;
+#endif
+ /* Have them all start in the same spot, why not? */
+ for (i = 0; i < ap->n; i++) {
+ ap->ants[i].col = col;
+ ap->ants[i].row = row;
+ ap->ants[i].direction = dir;
+ ap->ants[i].state = 0;
+ }
+ draw_anant(mi, dir, col, row);
+}
+
+ENTRYPOINT void
+draw_ant(ModeInfo * mi)
+{
+ antstruct *anant;
+ statestruct *status;
+ int i, state_pos, tape_pos;
+ unsigned char color;
+ short chg_dir, old_dir;
+ antfarmstruct *ap;
+
+ if (antfarms == NULL)
+ return;
+ ap = &antfarms[MI_SCREEN(mi)];
+ if (ap->ants == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ ap->painted = True;
+ for (i = 0; i < ap->n; i++) {
+ anant = &ap->ants[i];
+ tape_pos = anant->col + anant->row * ap->ncols;
+ color = ap->tape[tape_pos]; /* read tape */
+ state_pos = color + anant->state * ap->ncolors;
+ status = &(ap->machine[state_pos]);
+ drawcell(mi, anant->col, anant->row, status->color);
+ ap->tape[tape_pos] = status->color; /* write on tape */
+
+ /* Find direction of Bees or Ants. */
+ /* Translate relative direction to actual direction */
+ old_dir = anant->direction;
+ chg_dir = (2 * ANGLES - status->direction) % ANGLES;
+ anant->direction = (chg_dir + old_dir) % ANGLES;
+ if (ap->truchet) {
+ int a = 0, b;
+
+ if (ap->neighbors == 6) {
+ if (ap->sharpturn) {
+ a = (((ANGLES + anant->direction - old_dir) % ANGLES) == 240);
+ /* should be some way of getting rid of the init_dir dependency... */
+ b = !(ap->init_dir % 120);
+ a = ((a && !b) || (b && !a));
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ } else {
+ a = (old_dir / 60) % 3;
+ b = (anant->direction / 60) % 3;
+ a = (a + b + 1) % 3;
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ }
+ } else if (ap->neighbors == 4) {
+ a = old_dir / 180;
+ b = anant->direction / 180;
+ a = ((a && !b) || (b && !a));
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ } else if (ap->neighbors == 3) {
+ if (chg_dir == 240)
+ a = (2 + anant->direction / 120) % 3;
+ else
+ a = (1 + anant->direction / 120) % 3;
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ }
+ ap->truchet_state[tape_pos] = a + 1;
+ }
+ anant->state = status->next;
+
+ /* Allow step first and turn */
+ old_dir = ((status->direction < ANGLES) ? anant->direction : old_dir);
+#if DEBUG
+ (void) printf("old_dir %d, col %d, row %d", old_dir, anant->col, anant->row);
+#endif
+ position_of_neighbor(ap, old_dir, &(anant->col), &(anant->row));
+#if DEBUG
+ (void) printf(", ncol %d, nrow %d\n", anant->col, anant->row);
+#endif
+ draw_anant(mi, anant->direction, anant->col, anant->row);
+ }
+ if (++ap->generation > MI_CYCLES(mi)) {
+ init_ant(mi);
+ }
+ if (ap->redrawing) {
+ for (i = 0; i < REDRAWSTEP; i++) {
+ if (ap->tape[ap->redrawpos] ||
+ (ap->truchet && ap->truchet_state[ap->redrawpos])) {
+ drawcell(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
+ ap->tape[ap->redrawpos]);
+ if (ap->truchet)
+ drawtruchet(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
+ ap->tape[ap->redrawpos],
+ ap->truchet_state[ap->redrawpos] - 1);
+ }
+ if (++(ap->redrawpos) >= ap->ncols * ap->nrows) {
+ ap->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_ant(ModeInfo * mi)
+{
+ antfarmstruct *ap;
+
+ if (antfarms == NULL)
+ return;
+ ap = &antfarms[MI_SCREEN(mi)];
+
+ if (ap->painted) {
+ MI_CLEARWINDOW(mi);
+ ap->redrawing = 1;
+ ap->redrawpos = 0;
+ }
+}
+#endif
+
+XSCREENSAVER_MODULE ("Ant", ant)
+
+#endif /* MODE_ant */
diff --git a/hacks/ant.man b/hacks/ant.man
new file mode 100644
index 0000000..fb71d57
--- /dev/null
+++ b/hacks/ant.man
@@ -0,0 +1,96 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ant - cellular automaton.
+.SH SYNOPSIS
+.B ant
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-install]
+[\-noinstall]
+[\-root]
+[\-eyes]
+[\-no-eyes]
+[\-truchet]
+[\-no-truchet]
+[\-sharpturn]
+[\-no-sharpturn]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-count \fInumber\fP]
+[\-size \fInumber\fP]
+[\-neighbors 3]
+[\-neighbors 4]
+[\-neighbors 6]
+[\-neighbors 9]
+[\-neighbors 12]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+A cellular automaton that is really a two-dimensional Turing machine: as
+the heads ("ants") walk along the screen, they change pixel values in
+their path. Then, as they pass over changed pixels, their behavior is
+influenced.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-sharpturns | \-no-sharpturns
+Whether to do sharp turns.
+.TP 8
+.B \-truchet | \-no-truchet
+Whether to use truchet lines.
+.TP 8
+.B \-eyes | \-no-eyes
+Whether to draw eyes on the ants.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000 (0.0001 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+How long to wait until resetting. 0 - 800000. Default: 40000.
+.TP 8
+.B \-count \fInumber\fP
+Ants Count. -20 - 20. Default: -3.
+.TP 8
+.B \-size \fInumber\fP
+Ant Size. -18 - 18. Default: -12.
+.TP 8
+.B \-neighbors \fIN\fP
+How many neighbors each cell has. Legal values are 3, 4, 6, 9, and 12.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by David Bagley. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David Bagley.
diff --git a/hacks/apollonian.c b/hacks/apollonian.c
new file mode 100644
index 0000000..4b28ac3
--- /dev/null
+++ b/hacks/apollonian.c
@@ -0,0 +1,810 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* apollonian --- Apollonian Circles */
+
+#if 0
+static const char sccsid[] = "@(#)apollonian.c 5.02 2001/07/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 2000, 2001 by Allan R. Wilks <allan@research.att.com>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * radius r = 1 / c (curvature)
+ *
+ * Descartes Circle Theorem: (a, b, c, d are curvatures of tangential circles)
+ * Let a, b, c, d be the curvatures of for mutually (externally) tangent
+ * circles in the plane. Then
+ * a^2 + b^2 + c^2 + d^2 = (a + b + c + d)^2 / 2
+ *
+ * Complex Descartes Theorem: If the oriented curvatues and (complex) centers
+ * of an oriented Descrates configuration in the plane are a, b, c, d and
+ * w, x, y, z respectively, then
+ * a^2*w^2 + b^2*x^2 + c^2*y^2 + d^2*z^2 = (aw + bx + cy + dz)^2 / 2
+ * In addition these quantities satisfy
+ * a^2*w + b^2*x + c^2*y + d^2*z = (aw + bx + cy + dz)(a + b + c + d) / 2
+ *
+ * Enumerate root integer Descartes quadruples (a,b,c,d) satisfying the
+ * Descartes condition:
+ * 2(a^2+b^2+c^2+d^2) = (a+b+c+d)^2
+ * i.e., quadruples for which no application of the "pollinate" operator
+ * z <- 2(a+b+c+d) - 3*z,
+ * where z is in {a,b,c,d}, gives a quad of strictly smaller sum. This
+ * is equivalent to the condition:
+ * sum(a,b,c,d) >= 2*max(a,b,c,d)
+ * which, because of the Descartes condition, is equivalent to
+ * sum(a^2,b^2,c^2,d^2) >= 2*max(a,b,c,d)^2
+ *
+ *
+ * Todo:
+ * Add a small font
+ *
+ * Revision History:
+ * 25-Jun-2001: Converted from C and Postscript code by David Bagley
+ * Original code by Allan R. Wilks <allan@research.att.com>.
+ *
+ * From Circle Math Science News April 21, 2001 VOL. 254-255
+ * http://www.sciencenews.org/20010421/toc.asp
+ * Apollonian Circle Packings Assorted papers from Ronald L Graham,
+ * Jeffrey Lagarias, Colin Mallows, Allan Wilks, Catherine Yan
+ * http://front.math.ucdavis.edu/math.NT/0009113
+ * http://front.math.ucdavis.edu/math.MG/0101066
+ * http://front.math.ucdavis.edu/math.MG/0010298
+ * http://front.math.ucdavis.edu/math.MG/0010302
+ * http://front.math.ucdavis.edu/math.MG/0010324
+ */
+
+#ifdef STANDALONE
+# define MODE_apollonian
+# define DEFAULTS "*delay: 1000000 \n" \
+ "*count: 64 \n" \
+ "*cycles: 20 \n" \
+ "*ncolors: 64 \n" \
+ "*font: fixed" "\n" \
+ "*fpsTop: true \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True" \
+
+# define release_apollonian 0
+# define reshape_apollonian 0
+# define apollonian_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_apollonian
+
+#define DEF_ALTGEOM "True"
+#define DEF_LABEL "True"
+
+static Bool altgeom;
+static Bool label;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-altgeom", ".apollonian.altgeom", XrmoptionNoArg, "on"},
+ {"+altgeom", ".apollonian.altgeom", XrmoptionNoArg, "off"},
+ {"-label", ".apollonian.label", XrmoptionNoArg, "on"},
+ {"+label", ".apollonian.label", XrmoptionNoArg, "off"},
+};
+static argtype vars[] =
+{
+ {&altgeom, "altgeom", "AltGeom", DEF_ALTGEOM, t_Bool},
+ {&label, "label", "Label", DEF_LABEL, t_Bool},
+};
+static OptionStruct desc[] =
+{
+ {"-/+altgeom", "turn on/off alternate geometries (off euclidean space, on includes spherical and hyperbolic)"},
+ {"-/+label", "turn on/off alternate space and number labeling"},
+};
+
+ENTRYPOINT ModeSpecOpt apollonian_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef DOFONT
+extern XFontStruct *getFont(Display * display);
+#endif
+
+#ifdef USE_MODULES
+ModStruct apollonian_description =
+{"apollonian", "init_apollonian", "draw_apollonian", (char *) NULL,
+ "init_apollonian", "init_apollonian", "free_apollonian", &apollonian_opts,
+ 1000000, 64, 20, 1, 64, 1.0, "",
+ "Shows Apollonian Circles", 0, NULL};
+
+#endif
+
+typedef struct {
+ int a, b, c, d;
+} apollonian_quadruple;
+
+typedef struct {
+ double e; /* euclidean bend */
+ double s; /* spherical bend */
+ double h; /* hyperbolic bend */
+ double x, y; /* euclidean bend times euclidean position */
+} circle;
+enum space {
+ euclidean = 0, spherical, hyperbolic
+};
+
+static const char * space_string[] = {
+ "euclidean",
+ "spherical",
+ "hyperbolic"
+};
+
+/*
+Generate Apollonian packing starting with a quadruple of circles.
+The four input lines each contain the 5-tuple (e,s,h,x,y) representing
+the circle with radius 1/e and center (x/e,y/e). The s and h is propagated
+like e, x and y, but can differ from e so as to represent different
+geometries, spherical and hyperbolic, respectively. The "standard" picture,
+for example (-1, 2, 2, 3), can be labeled for the three geometries.
+Origins of circles z1, z2, z3, z4
+a * z1 = 0
+b * z2 = (a+b)/a
+c * z3 = (q123 + a * i)^2/(a*(a+b)) where q123 = sqrt(a*b+a*c+b*c)
+d * z4 = (q124 + a * i)^2/(a*(a+b)) where q124 = q123 - a - b
+If (e,x,y) represents the Euclidean circle (1/e,x/e,y/e) (so that e is
+the label in the standard picture) then the "spherical label" is
+(e^2+x^2+y^2-1)/(2*e) (an integer!) and the "hyperbolic label", is
+calulated by h + s = e.
+*/
+static circle examples[][4] = {
+{ /* double semi-bounded */
+ { 0, 0, 0, 0, 1},
+ { 0, 0, 0, 0, -1},
+ { 1, 1, 1, -1, 0},
+ { 1, 1, 1, 1, 0}
+},
+#if 0
+{ /* standard */
+ {-1, 0, -1, 0, 0},
+ { 2, 1, 1, 1, 0},
+ { 2, 1, 1, -1, 0},
+ { 3, 2, 1, 0, 2}
+},
+{ /* next simplest */
+ {-2, -1, -1, 0.0, 0},
+ { 3, 2, 1, 0.5, 0},
+ { 6, 3, 3, -2.0, 0},
+ { 7, 4, 3, -1.5, 2}
+},
+{ /* */
+ {-3, -2, -1, 0.0, 0},
+ { 4, 3, 1, 1.0 / 3.0, 0},
+ {12, 7, 5, -3.0, 0},
+ {13, 8, 5, -8.0 / 3.0, 2}
+},
+{ /* Mickey */
+ {-3, -2, -1, 0.0, 0},
+ { 5, 4, 1, 2.0 / 3.0, 0},
+ { 8, 5, 3, -4.0 / 3.0, -1},
+ { 8, 5, 3, -4.0 / 3.0, 1}
+},
+{ /* */
+ {-4, -3, -1, 0.00, 0},
+ { 5, 4, 1, 0.25, 0},
+ {20, 13, 7, -4.00, 0},
+ {21, 14, 7, -3.75, 2}
+},
+{ /* Mickey2 */
+ {-4, -2, -2, 0.0, 0},
+ { 8, 4, 4, 1.0, 0},
+ { 9, 5, 4, -0.75, -1},
+ { 9, 5, 4, -0.75, 1}
+},
+{ /* Mickey3 */
+ {-5, -4, -1, 0.0, 0},
+ { 7, 6, 1, 0.4, 0},
+ {18, 13, 5, -2.4, -1},
+ {18, 13, 5, -2.4, 1}
+},
+{ /* */
+ {-6, -5, -1, 0.0, 0},
+ { 7, 6, 1, 1.0 / 6.0, 0},
+ {42, 31, 11, -6.0, 0},
+ {43, 32, 11, -35.0 / 6.0, 2}
+},
+{ /* */
+ {-6, -3, -3, 0.0, 0},
+ {10, 5, 5, 2.0 / 3.0, 0},
+ {15, 8, 7, -1.5, 0},
+ {19, 10, 9, -5.0 / 6.0, 2}
+},
+{ /* asymmetric */
+ {-6, -5, -1, 0.0, 0.0},
+ {11, 10, 1, 5.0 / 6.0, 0.0},
+ {14, 11, 3, -16.0 / 15.0, -0.8},
+ {15, 12, 3, -0.9, 1.2}
+},
+#endif
+/* Non integer stuff */
+#define DELTA 2.154700538 /* ((3+2*sqrt(3))/3) */
+{ /* 3 fold symmetric bounded (x, y calculated later) */
+ { -1, -1, -1, 0.0, 0.0},
+ {DELTA, DELTA, DELTA, 1.0, 0.0},
+ {DELTA, DELTA, DELTA, 1.0, -1.0},
+ {DELTA, DELTA, DELTA, -1.0, 1.0}
+},
+{ /* semi-bounded (x, y calculated later) */
+#define ALPHA 2.618033989 /* ((3+sqrt(5))/2) */
+ { 1.0, 1.0, 1.0, 0, 0},
+ { 0.0, 0.0, 0.0, 0, -1},
+ {1.0/(ALPHA*ALPHA), 1.0/(ALPHA*ALPHA), 1.0/(ALPHA*ALPHA), -1, 0},
+ { 1.0/ALPHA, 1.0/ALPHA, 1.0/ALPHA, -1, 0}
+},
+{ /* unbounded (x, y calculated later) */
+/* #define PHI 1.618033989 *//* ((1+sqrt(5))/2) */
+#define BETA 2.890053638 /* (PHI+sqrt(PHI)) */
+ { 1.0, 1.0, 1.0, 0, 0},
+ {1.0/(BETA*BETA*BETA), 1.0/(BETA*BETA*BETA), 1.0/(BETA*BETA*BETA), 1, 0},
+ { 1.0/(BETA*BETA), 1.0/(BETA*BETA), 1.0/(BETA*BETA), 1, 0},
+ { 1.0/BETA, 1.0/BETA, 1.0/BETA, 1, 0}
+}
+};
+
+#define PREDEF_CIRCLE_GAMES (sizeof (examples) / (4 * sizeof (circle)))
+
+#if 0
+Euclidean
+0, 0, 1, 1
+-1, 2, 2, 3
+-2, 3, 6, 7
+-3, 5, 8, 8
+-4, 8, 9, 9
+-3, 4, 12, 13
+-6, 11, 14, 15
+ -5, 7, 18, 18
+ -6, 10, 15, 19
+ -7, 12, 17, 20
+ -4, 5, 20, 21
+ -9, 18, 19, 22
+ -8, 13, 21, 24
+Spherical
+0, 1, 1, 2
+ -1, 2, 3, 4
+ -2, 4, 5, 5
+ -2, 3, 7, 8
+Hyperbolic
+-1, 1, 1, 1
+ 0, 0, 1, 3
+ -2, 3, 5, 6
+ -3, 6, 6, 7
+#endif
+
+typedef struct {
+ int size;
+ XPoint offset;
+ int geometry;
+ circle c1, c2, c3, c4;
+ int color_offset;
+ int count;
+ Bool label, altgeom;
+ apollonian_quadruple *quad;
+#ifdef DOFONT
+ XFontStruct *font;
+#endif
+ int time;
+ int game;
+} apollonianstruct;
+
+static apollonianstruct *apollonians = (apollonianstruct *) NULL;
+
+#define FONT_HEIGHT 19
+#define FONT_WIDTH 15
+#define FONT_LENGTH 20
+#define MAX_CHAR 10
+#define K 2.15470053837925152902 /* 1+2/sqrt(3) */
+#define MAXBEND 100 /* Do not want configurable by user since it will take too
+ much time if increased. */
+
+static int
+gcd(int a, int b)
+{
+ int r;
+
+ while (b) {
+ r = a % b;
+ a = b;
+ b = r;
+ }
+ return a;
+}
+
+static int
+isqrt(int n)
+{
+ int y;
+
+ if (n < 0)
+ return -1;
+ y = (int) (sqrt((double) n) + 0.5);
+ return ((n == y*y) ? y : -1);
+}
+
+static void
+dquad(int n, apollonian_quadruple *quad)
+{
+ int a, b, c, d;
+ int counter = 0, B, C;
+
+ for (a = 0; a < MAXBEND; a++) {
+ B = (int) (K * a);
+ for (b = a + 1; b <= B; b++) {
+ C = (int) (((a + b) * (a + b)) / (4.0 * (b - a)));
+ for (c = b; c <= C; c++) {
+ d = isqrt(b*c-a*(b+c));
+ if (d >= 0 && (gcd(a,gcd(b,c)) <= 1)) {
+ quad[counter].a = -a;
+ quad[counter].b = b;
+ quad[counter].c = c;
+ quad[counter].d = -a+b+c-2*d;
+ if (++counter >= n) {
+ return;
+ }
+ }
+ }
+ }
+ }
+ (void) printf("found only %d below maximum bend of %d\n",
+ counter, MAXBEND);
+ for (; counter < n; counter++) {
+ quad[counter].a = -1;
+ quad[counter].b = 2;
+ quad[counter].c = 2;
+ quad[counter].d = 3;
+ }
+ return;
+}
+
+/*
+ * Given a Descartes quadruple of bends (a,b,c,d), with a<0, find a
+ * quadruple of circles, represented by (bend,bend*x,bend*y), such
+ * that the circles have the given bends and the bends times the
+ * centers are integers.
+ *
+ * This just performs an exaustive search, assuming that the outer
+ * circle has center in the unit square.
+ *
+ * It is always sufficient to look in {(x,y):0<=y<=x<=1/2} for the
+ * center of the outer circle, but this may not lead to a packing
+ * that can be labelled with integer spherical and hyperbolic labels.
+ * To effect the smaller search, replace FOR(a) with
+ *
+ * for (pa = ea/2; pa <= 0; pa++) for (qa = pa; qa <= 0; qa++)
+ */
+
+#define For(v,l,h) for (v = l; v <= h; v++)
+#define FOR(z) For(p##z,lop##z,hip##z) For(q##z,loq##z,hiq##z)
+#define H(z) ((e##z*e##z+p##z*p##z+q##z*q##z)%2)
+#define UNIT(z) ((abs(e##z)-1)*(abs(e##z)-1) >= p##z*p##z+q##z*q##z)
+#define T(z,w) is_tangent(e##z,p##z,q##z,e##w,p##w,q##w)
+#define LO(r,z) lo##r##z = iceil(e##z*(r##a+1),ea)-1
+#define HI(r,z) hi##r##z = iflor(e##z*(r##a-1),ea)-1
+#define B(z) LO(p,z); HI(p,z); LO(q,z); HI(q,z)
+
+static int
+is_quad(int a, int b, int c, int d)
+{
+ int s;
+
+ s = a+b+c+d;
+ return 2*(a*a+b*b+c*c+d*d) == s*s;
+}
+
+static Bool
+is_tangent(int e1, int p1, int q1, int e2, int p2, int q2)
+{
+ int dx, dy, s;
+
+ dx = p1*e2 - p2*e1;
+ dy = q1*e2 - q2*e1;
+ s = e1 + e2;
+ return dx*dx + dy*dy == s*s;
+}
+
+static int
+iflor(int a, int b)
+{
+ int q;
+
+ if (b == 0) {
+ (void) printf("iflor: b = 0\n");
+ return 0;
+ }
+ if (a%b == 0)
+ return a/b;
+ q = abs(a)/abs(b);
+ return ((a<0)^(b<0)) ? -q-1 : q;
+}
+
+static int
+iceil(int a, int b)
+{
+ int q;
+
+ if (b == 0) {
+ (void) printf("iceil: b = 0\n");
+ return 0;
+ }
+ if (a%b == 0)
+ return a/b;
+ q = abs(a)/abs(b);
+ return ((a<0)^(b<0)) ? -q : 1+q;
+}
+
+static double
+geom(int geometry, int e, int p, int q)
+{
+ int g = (geometry == spherical) ? -1 :
+ (geometry == hyperbolic) ? 1 : 0;
+
+ if (g)
+ return (e*e + (1.0 - p*p - q*q) * g) / (2.0*e);
+ (void) printf("geom: g = 0\n");
+ return e;
+}
+
+static void
+cquad(circle *c1, circle *c2, circle *c3, circle *c4)
+{
+ int ea, eb, ec, ed;
+ int pa, pb, pc, pd;
+ int qa, qb, qc, qd;
+ int lopa, lopb, lopc, lopd;
+ int hipa, hipb, hipc, hipd;
+ int loqa, loqb, loqc, loqd;
+ int hiqa, hiqb, hiqc, hiqd;
+
+ ea = (int) c1->e;
+ eb = (int) c2->e;
+ ec = (int) c3->e;
+ ed = (int) c4->e;
+ if (ea >= 0)
+ (void) printf("ea = %d\n", ea);
+ if (!is_quad(ea,eb,ec,ed))
+ (void) printf("Error not quad %d %d %d %d\n", ea, eb, ec, ed);
+ lopa = loqa = ea;
+ hipa = hiqa = 0;
+ FOR(a) {
+ B(b); B(c); B(d);
+ if (H(a) && UNIT(a)) FOR(b) {
+ if (H(b) && T(a,b)) FOR(c) {
+ if (H(c) && T(a,c) && T(b,c)) FOR(d) {
+ if (H(d) && T(a,d) && T(b,d) && T(c,d)) {
+ c1->s = geom(spherical, ea, pa, qa);
+ c1->h = geom(hyperbolic, ea, pa, qa);
+ c2->s = geom(spherical, eb, pb, qb);
+ c2->h = geom(hyperbolic, eb, pb, qb);
+ c3->s = geom(spherical, ec, pc, qc);
+ c3->h = geom(hyperbolic, ec, pc, qc);
+ c4->s = geom(spherical, ed, pd, qd);
+ c4->h = geom(hyperbolic, ed, pd, qd);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void
+p(ModeInfo *mi, circle c)
+{
+ apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
+ char string[15];
+ double g, e;
+ int g_width;
+
+#ifdef DEBUG
+ (void) printf("c.e=%g c.s=%g c.h=%g c.x=%g c.y=%g\n",
+ c.e, c.s, c.h, c.x, c.y);
+#endif
+ g = (cp->geometry == spherical) ? c.s : (cp->geometry == hyperbolic) ?
+ c.h : c.e;
+ if (c.e < 0.0) {
+ if (g < 0.0)
+ g = -g;
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_WHITE_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ((int) ((g + cp->color_offset) *
+ g)) % MI_NPIXELS(mi)));
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * (-cp->c1.e) * (c.x - 1.0) /
+ (-2.0 * c.e) + cp->size / 2.0 + cp->offset.x)),
+ ((int) (cp->size * (-cp->c1.e) * (c.y - 1.0) /
+ (-2.0 * c.e) + cp->size / 2.0 + cp->offset.y)),
+ (int) (cp->c1.e * cp->size / c.e),
+ (int) (cp->c1.e * cp->size / c.e), 0, 23040);
+ if (!cp->label) {
+#ifdef DEBUG
+ (void) printf("%g\n", -g);
+#endif
+ return;
+ }
+ (void) sprintf(string, "%g", (g == 0.0) ? 0 : -g);
+ if (cp->size >= 10 * FONT_WIDTH) {
+ /* hard code these to corners */
+ XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * c.x / (2.0 * c.e))) + cp->offset.x,
+ ((int) (cp->size * c.y / (2.0 * c.e))) + FONT_HEIGHT,
+ string, (g == 0.0) ? 1 : ((g < 10.0) ? 2 :
+ ((g < 100.0) ? 3 : 4)));
+ }
+ if (cp->altgeom && MI_HEIGHT(mi) >= 30 * FONT_WIDTH) {
+ XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * c.x / (2.0 * c.e) + cp->offset.x)),
+ ((int) (cp->size * c.y / (2.0 * c.e) + MI_HEIGHT(mi) -
+ FONT_HEIGHT / 2)), (char *) space_string[cp->geometry],
+ strlen(space_string[cp->geometry]));
+ }
+ return;
+ }
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g)) %
+ MI_NPIXELS(mi)));
+ if (c.e == 0.0) {
+ if (c.x == 0.0 && c.y != 0.0) {
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, (int) ((c.y + 1.0) * cp->size / 2.0 + cp->offset.y),
+ MI_WIDTH(mi),
+ (int) ((c.y + 1.0) * cp->size / 2.0 + cp->offset.y));
+ } else if (c.y == 0.0 && c.x != 0.0) {
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (int) ((c.x + 1.0) * cp->size / 2.0 + cp->offset.x), 0,
+ (int) ((c.x + 1.0) * cp->size / 2.0 + cp->offset.x),
+ MI_HEIGHT(mi));
+ }
+ return;
+ }
+ e = (cp->c1.e >= 0.0) ? 1.0 : -cp->c1.e;
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * e * (c.x - 1.0) / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.x)),
+ ((int) (cp->size * e * (c.y - 1.0) / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.y)),
+ (int) (e * cp->size / c.e), (int) (e * cp->size / c.e),
+ 0, 23040);
+ if (!cp->label) {
+#ifdef DEBUG
+ (void) printf("%g\n", g);
+#endif
+ return;
+ }
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g) +
+ MI_NPIXELS(mi) / 2) % MI_NPIXELS(mi)));
+ g_width = (g < 10.0) ? 1: ((g < 100.0) ? 2 : 3);
+ if (c.e < e * cp->size / (FONT_LENGTH + 5 * g_width) && g < 1000.0) {
+ (void) sprintf(string, "%g", g);
+ XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * e * c.x / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.x)) -
+ g_width * FONT_WIDTH / 2,
+ ((int) (cp->size * e * c.y / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.y)) +
+ FONT_HEIGHT / 2,
+ string, g_width);
+ }
+}
+
+#define BIG 7
+static void
+f(ModeInfo *mi, circle c1, circle c2, circle c3, circle c4, int depth)
+{
+ apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
+ int e = (int) ((cp->c1.e >= 0.0) ? 1.0 : -cp->c1.e);
+ circle c;
+
+ if (depth > mi->recursion_depth) mi->recursion_depth = depth;
+
+ c.e = 2*(c1.e+c2.e+c3.e) - c4.e;
+ c.s = 2*(c1.s+c2.s+c3.s) - c4.s;
+ c.h = 2*(c1.h+c2.h+c3.h) - c4.h;
+ c.x = 2*(c1.x+c2.x+c3.x) - c4.x;
+ c.y = 2*(c1.y+c2.y+c3.y) - c4.y;
+ if (c.e == 0 ||
+ c.e > cp->size * e || c.x / c.e > BIG || c.y / c.e > BIG ||
+ c.x / c.e < -BIG || c.y / c.e < -BIG)
+ return;
+ p(mi, c);
+ f(mi, c2, c3, c, c1, depth+1);
+ f(mi, c1, c3, c, c2, depth+1);
+ f(mi, c1, c2, c, c3, depth+1);
+}
+
+ENTRYPOINT void
+free_apollonian (ModeInfo * mi)
+{
+ apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
+
+ if (cp->quad != NULL) {
+ (void) free((void *) cp->quad);
+ cp->quad = (apollonian_quadruple *) NULL;
+ }
+#ifdef DOFONT
+ if (cp->gc != None) {
+ XFreeGC(display, cp->gc);
+ cp->gc = None;
+ }
+ if (cp->font != None) {
+ XFreeFont(display, cp->font);
+ cp->font = None;
+ }
+#endif
+}
+
+#ifndef DEBUG
+static void
+randomize_c(int randomize, circle * c)
+{
+ if (randomize / 2) {
+ double temp;
+
+ temp = c->x;
+ c->x = c->y;
+ c->y = temp;
+ }
+ if (randomize % 2) {
+ c->x = -c->x;
+ c->y = -c->y;
+ }
+}
+#endif
+
+ENTRYPOINT void
+init_apollonian (ModeInfo * mi)
+{
+ apollonianstruct *cp;
+ int i;
+
+ MI_INIT (mi, apollonians);
+ cp = &apollonians[MI_SCREEN(mi)];
+
+ cp->size = MAX(MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) - 1, 1);
+ cp->offset.x = (MI_WIDTH(mi) - cp->size) / 2;
+ cp->offset.y = (MI_HEIGHT(mi) - cp->size) / 2;
+ cp->color_offset = NRAND(MI_NPIXELS(mi));
+
+#ifdef DOFONT
+ if (cp->font == None) {
+ if ((cp->font = getFont(MI_DISPLAY(mi))) == None)
+ return False;
+ }
+#endif
+ cp->label = label;
+ cp->altgeom = cp->label && altgeom;
+
+ if (cp->quad == NULL) {
+ cp->count = ABS(MI_COUNT(mi));
+ if ((cp->quad = (apollonian_quadruple *) malloc(cp->count *
+ sizeof (apollonian_quadruple))) == NULL) {
+ return;
+ }
+ dquad(cp->count, cp->quad);
+ }
+ cp->game = NRAND(PREDEF_CIRCLE_GAMES + cp->count);
+ cp->geometry = (cp->game && cp->altgeom) ? NRAND(3) : 0;
+
+ if (cp->game < PREDEF_CIRCLE_GAMES) {
+ cp->c1 = examples[cp->game][0];
+ cp->c2 = examples[cp->game][1];
+ cp->c3 = examples[cp->game][2];
+ cp->c4 = examples[cp->game][3];
+ /* do not label non int */
+ cp->label = cp->label && (cp->c4.e == (int) cp->c4.e);
+ } else { /* uses results of dquad, all int */
+ i = cp->game - PREDEF_CIRCLE_GAMES;
+ cp->c1.e = cp->quad[i].a;
+ cp->c2.e = cp->quad[i].b;
+ cp->c3.e = cp->quad[i].c;
+ cp->c4.e = cp->quad[i].d;
+ if (cp->geometry)
+ cquad(&(cp->c1), &(cp->c2), &(cp->c3), &(cp->c4));
+ }
+ cp->time = 0;
+ MI_CLEARWINDOW(mi);
+ if (cp->game != 0) {
+ double q123;
+
+ if (cp->c1.e == 0.0 || cp->c1.e == -cp->c2.e)
+ return;
+ cp->c1.x = 0.0;
+ cp->c1.y = 0.0;
+ cp->c2.x = -(cp->c1.e + cp->c2.e) / cp->c1.e;
+ cp->c2.y = 0;
+ q123 = sqrt(cp->c1.e * cp->c2.e + cp->c1.e * cp->c3.e +
+ cp->c2.e * cp->c3.e);
+#ifdef DEBUG
+ (void) printf("q123 = %g, ", q123);
+#endif
+ cp->c3.x = (cp->c1.e * cp->c1.e - q123 * q123) / (cp->c1.e *
+ (cp->c1.e + cp->c2.e));
+ cp->c3.y = -2.0 * q123 / (cp->c1.e + cp->c2.e);
+ q123 = -cp->c1.e - cp->c2.e + q123;
+ cp->c4.x = (cp->c1.e * cp->c1.e - q123 * q123) / (cp->c1.e *
+ (cp->c1.e + cp->c2.e));
+ cp->c4.y = -2.0 * q123 / (cp->c1.e + cp->c2.e);
+#ifdef DEBUG
+ (void) printf("q124 = %g\n", q123);
+ (void) printf("%g %g %g %g %g %g %g %g\n",
+ cp->c1.x, cp->c1.y, cp->c2.x, cp->c2.y,
+ cp->c3.x, cp->c3.y, cp->c4.x, cp->c4.y);
+#endif
+ }
+#ifndef DEBUG
+ if (LRAND() & 1) {
+ cp->c3.y = -cp->c3.y;
+ cp->c4.y = -cp->c4.y;
+ }
+ i = NRAND(4);
+ randomize_c(i, &(cp->c1));
+ randomize_c(i, &(cp->c2));
+ randomize_c(i, &(cp->c3));
+ randomize_c(i, &(cp->c4));
+#endif
+
+ mi->recursion_depth = -1;
+}
+
+ENTRYPOINT void
+draw_apollonian (ModeInfo * mi)
+{
+ apollonianstruct *cp;
+
+ if (apollonians == NULL)
+ return;
+ cp = &apollonians[MI_SCREEN(mi)];
+
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (cp->time < 5) {
+ switch (cp->time) {
+ case 0:
+ p(mi, cp->c1);
+ p(mi, cp->c2);
+ p(mi, cp->c3);
+ p(mi, cp->c4);
+ break;
+ case 1:
+ f(mi, cp->c1, cp->c2, cp->c3, cp->c4, 0);
+ break;
+ case 2:
+ f(mi, cp->c1, cp->c2, cp->c4, cp->c3, 0);
+ break;
+ case 3:
+ f(mi, cp->c1, cp->c3, cp->c4, cp->c2, 0);
+ break;
+ case 4:
+ f(mi, cp->c2, cp->c3, cp->c4, cp->c1, 0);
+ }
+ }
+ if (++cp->time > MI_CYCLES(mi))
+ init_apollonian(mi);
+}
+
+XSCREENSAVER_MODULE ("Apollonian", apollonian)
+
+#endif /* MODE_apollonian */
diff --git a/hacks/apollonian.man b/hacks/apollonian.man
new file mode 100644
index 0000000..157d109
--- /dev/null
+++ b/hacks/apollonian.man
@@ -0,0 +1,70 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+apollonian - Descartes Circle Theorem.
+.SH SYNOPSIS
+.B apollonian
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-label]
+[\-no-altgeom]
+[\-cycles \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Packs a large circle with smaller circles, demonstrating the Descartes
+Circle Theorem.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-label | \-no-label
+Draw Labels. Boolean.
+.TP 8
+.B \-altgeom | \-no-altgeom
+Include Alternate Geometries. Boolean.
+.TP 8
+.B \-cycles \fInumber\fP
+Depth. 1 - 20. Default: 20.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000000 (1.00 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Allan R. Wilks and David Bagley. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Allan R. Wilks and David Bagley.
diff --git a/hacks/apple2-main.c b/hacks/apple2-main.c
new file mode 100644
index 0000000..3063b58
--- /dev/null
+++ b/hacks/apple2-main.c
@@ -0,0 +1,1913 @@
+/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
+ * with additional work by Jamie Zawinski <jwz@jwz.org>
+ * Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <math.h>
+#include <ctype.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "screenhack.h"
+#include "apple2.h"
+#include "textclient.h"
+#include "utf8wc.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define SCREEN_COLS 40
+#define SCREEN_ROWS 24
+
+
+/* Given a bitmask, returns the position and width of the field.
+ */
+static void
+decode_mask (unsigned int mask, unsigned int *pos_ret, unsigned int *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+/* Given a value and a field-width, expands the field to fill out 8 bits.
+ */
+static unsigned char
+spread_bits (unsigned char value, unsigned char width)
+{
+ switch (width)
+ {
+ case 8: return value;
+ case 7: return (value << 1) | (value >> 6);
+ case 6: return (value << 2) | (value >> 4);
+ case 5: return (value << 3) | (value >> 2);
+ case 4: return (value << 4) | (value);
+ case 3: return (value << 5) | (value << 2) | (value >> 2);
+ case 2: return (value << 6) | (value << 4) | (value);
+ default: abort(); break;
+ }
+}
+
+
+/* Convert an XImage (of any size/depth/visual) to a 32bpp RGB array.
+ Scales it (without dithering) to WxH.
+ */
+static void
+scale_image (Display *dpy, Window window, XImage *in,
+ int fromx, int fromy, int fromw, int fromh,
+ unsigned int *out, int w, int h)
+{
+ float scale;
+ int x, y, i;
+ unsigned int rpos=0, gpos=0, bpos=0; /* bitfield positions */
+ unsigned int rsiz=0, gsiz=0, bsiz=0;
+ unsigned long rmsk=0, gmsk=0, bmsk=0;
+ unsigned char spread_map[3][256];
+ XWindowAttributes xgwa;
+ XColor *colors = 0;
+
+ if (fromx + fromw > in->width ||
+ fromy + fromh > in->height)
+ abort();
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ /* Compute the field offsets for RGB decoding in the XImage,
+ when in TrueColor mode. Otherwise we use the colormap.
+ */
+ if (visual_class (xgwa.screen, xgwa.visual) == PseudoColor ||
+ visual_class (xgwa.screen, xgwa.visual) == GrayScale)
+ {
+ int ncolors = visual_cells (xgwa.screen, xgwa.visual);
+ colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
+ for (i = 0; i < ncolors; i++)
+ colors[i].pixel = i;
+ XQueryColors (dpy, xgwa.colormap, colors, ncolors);
+ }
+ else
+ {
+ visual_rgb_masks (xgwa.screen, xgwa.visual, &rmsk, &gmsk, &bmsk);
+ decode_mask (rmsk, &rpos, &rsiz);
+ decode_mask (gmsk, &gpos, &gsiz);
+ decode_mask (bmsk, &bpos, &bsiz);
+
+ for (i = 0; i < 256; i++)
+ {
+ spread_map[0][i] = spread_bits (i, rsiz);
+ spread_map[1][i] = spread_bits (i, gsiz);
+ spread_map[2][i] = spread_bits (i, bsiz);
+ }
+ }
+
+ scale = (fromw > fromh
+ ? (float) fromw / w
+ : (float) fromh / h);
+
+ /* Scale the pixmap from window size to Apple][ screen size (but 32bpp)
+ */
+ for (y = 0; y < h-1; y++) /* iterate over dest pixels */
+ for (x = 0; x < w-1; x++)
+ {
+ int xx, yy;
+ unsigned int r=0, g=0, b=0;
+
+ int xx1 = x * scale + fromx;
+ int yy1 = y * scale + fromy;
+ int xx2 = (x+1) * scale + fromx;
+ int yy2 = (y+1) * scale + fromy;
+
+ /* Iterate over the source pixels contributing to this one, and sum. */
+ for (xx = xx1; xx < xx2; xx++)
+ for (yy = yy1; yy < yy2; yy++)
+ {
+ unsigned char rr, gg, bb;
+ unsigned long sp = ((xx > in->width || yy > in->height)
+ ? 0 : XGetPixel (in, xx, yy));
+ if (colors)
+ {
+ rr = colors[sp].red & 0xFF;
+ gg = colors[sp].green & 0xFF;
+ bb = colors[sp].blue & 0xFF;
+ }
+ else
+ {
+ rr = (sp & rmsk) >> rpos;
+ gg = (sp & gmsk) >> gpos;
+ bb = (sp & bmsk) >> bpos;
+ rr = spread_map[0][rr];
+ gg = spread_map[1][gg];
+ bb = spread_map[2][bb];
+ }
+ r += rr;
+ g += gg;
+ b += bb;
+ }
+
+ /* Scale summed pixel values down to 8/8/8 range */
+ i = (xx2 - xx1) * (yy2 - yy1);
+ if (i < 1) i = 1;
+ r /= i;
+ g /= i;
+ b /= i;
+
+ out[y * w + x] = (r << 16) | (g << 8) | b;
+ }
+}
+
+
+/* Convert an XImage (of any size/depth/visual) to a 32bpp RGB array.
+ Picks a random sub-image out of the source image, and scales it to WxH.
+ */
+static void
+pick_a2_subimage (Display *dpy, Window window, XImage *in,
+ unsigned int *out, int w, int h)
+{
+ int fromx, fromy, fromw, fromh;
+ if (in->width <= w || in->height <= h)
+ {
+ fromx = 0;
+ fromy = 0;
+ fromw = in->width;
+ fromh = in->height;
+ }
+ else
+ {
+ int dw, dh;
+ do {
+ double scale = (0.5 + frand(0.7) + frand(0.7) + frand(0.7));
+ fromw = w * scale;
+ fromh = h * scale;
+ } while (fromw > in->width ||
+ fromh > in->height);
+
+ dw = (in->width - fromw) / 2; /* near the center! */
+ dh = (in->height - fromh) / 2;
+
+ fromx = (dw <= 0 ? 0 : (random() % dw) + (dw/2));
+ fromy = (dh <= 0 ? 0 : (random() % dh) + (dh/2));
+ }
+
+ scale_image (dpy, window, in,
+ fromx, fromy, fromw, fromh,
+ out, w, h);
+}
+
+
+/* Floyd-Steinberg dither. Derived from ppmquant.c,
+ Copyright (c) 1989, 1991 by Jef Poskanzer.
+ */
+static void
+a2_dither (unsigned int *in, unsigned char *out, int w, int h)
+{
+ /*
+ Apple ][ color map. Each pixel can only be 1 or 0, but what that
+ means depends on whether it's an odd or even pixel, and whether
+ the high bit in the byte is set or not. If it's 0, it's always
+ black.
+ */
+ static const int a2_cmap[2][2][3] = {
+ {
+ /* hibit=0 */
+ {/* odd pixels = blue */ 0x00, 0x80, 0xff},
+ {/* even pixels = red */ 0xff, 0x80, 0x00}
+ },
+ {
+ /* hibit=1 */
+ {/* even pixels = purple */ 0xa0, 0x40, 0xa0},
+ {/* odd pixels = green */ 0x40, 0xff, 0x40}
+ }
+ };
+
+ int x, y;
+ unsigned int **pixels;
+ unsigned int *pP;
+ int maxval = 255;
+ long *this_rerr;
+ long *next_rerr;
+ long *this_gerr;
+ long *next_gerr;
+ long *this_berr;
+ long *next_berr;
+ long *temp_err;
+ int fs_scale = 1024;
+ int brightness = 75;
+
+#if 0
+ {
+ FILE *pipe = popen ("xv -", "w");
+ fprintf (pipe, "P6\n%d %d\n%d\n", w, h, 255);
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ {
+ unsigned int p = in[y * w + x];
+ unsigned int r = (p >> 16) & 0xFF;
+ unsigned int g = (p >> 8) & 0xFF;
+ unsigned int b = (p ) & 0xFF;
+ fprintf(pipe, "%c%c%c", r, g, b);
+ }
+ fclose (pipe);
+ }
+#endif
+
+ /* Initialize Floyd-Steinberg error vectors. */
+ this_rerr = (long *) calloc (w + 2, sizeof(long));
+ next_rerr = (long *) calloc (w + 2, sizeof(long));
+ this_gerr = (long *) calloc (w + 2, sizeof(long));
+ next_gerr = (long *) calloc (w + 2, sizeof(long));
+ this_berr = (long *) calloc (w + 2, sizeof(long));
+ next_berr = (long *) calloc (w + 2, sizeof(long));
+
+
+ /* #### do we really need more than one element of "pixels" at once?
+ */
+ pixels = (unsigned int **) malloc (h * sizeof (unsigned int *));
+ for (y = 0; y < h; y++)
+ pixels[y] = (unsigned int *) malloc (w * sizeof (unsigned int));
+
+ for (x = 0; x < w + 2; ++x)
+ {
+ this_rerr[x] = random() % (fs_scale * 2) - fs_scale;
+ this_gerr[x] = random() % (fs_scale * 2) - fs_scale;
+ this_berr[x] = random() % (fs_scale * 2) - fs_scale;
+ /* (random errors in [-1 .. 1]) */
+ }
+
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ pixels[y][x] = in[y * w + x];
+
+ for (y = 0; y < h; y++)
+ {
+ int xbyte;
+ int err;
+ int prev_byte=0;
+
+ for (x = 0; x < w + 2; x++)
+ next_rerr[x] = next_gerr[x] = next_berr[x] = 0;
+
+ /* It's too complicated to go back and forth on alternate rows,
+ so we always go left-right here. It doesn't change the result
+ very much.
+
+ For each group of 7 pixels, we have to try it both with the
+ high bit=0 and =1. For each high bit value, we add up the
+ total error and pick the best one.
+
+ Because we have to go through each group of bits twice, we
+ don't propagate the error values through this_[rgb]err since
+ it would add them twice. So we keep seperate local_[rgb]err
+ variables for propagating error within the 7-pixel group.
+ */
+
+ pP = pixels[y];
+ for (xbyte=0; xbyte<280; xbyte+=7)
+ {
+ int best_byte=0;
+ int best_error=2000000000;
+ int hibit;
+ int sr, sg, sb;
+ int r2, g2, b2;
+ int local_rerr=0, local_gerr=0, local_berr=0;
+
+ for (hibit=0; hibit<2; hibit++)
+ {
+ int byte = hibit<<7;
+ int tot_error=0;
+
+ for (x=xbyte; x<xbyte+7; x++)
+ {
+ int dist0, dist1;
+
+ /* Use Floyd-Steinberg errors to adjust actual color. */
+ sr = ((pP[x] >> 16) & 0xFF) * brightness/256;
+ sg = ((pP[x] >> 8) & 0xFF) * brightness/256;
+ sb = ((pP[x] ) & 0xFF) * brightness/256;
+ sr += (this_rerr[x + 1] + local_rerr) / fs_scale;
+ sg += (this_gerr[x + 1] + local_gerr) / fs_scale;
+ sb += (this_berr[x + 1] + local_berr) / fs_scale;
+
+ if (sr < 0) sr = 0;
+ else if (sr > maxval) sr = maxval;
+ if (sg < 0) sg = 0;
+ else if (sg > maxval) sg = maxval;
+ if (sb < 0) sb = 0;
+ else if (sb > maxval) sb = maxval;
+
+ /* This is the color we'd get if we set the bit 1. For 0,
+ we get black */
+ r2=a2_cmap[hibit][x&1][0];
+ g2=a2_cmap[hibit][x&1][1];
+ b2=a2_cmap[hibit][x&1][2];
+
+ /*
+ dist0 and dist1 are the error (Minkowski 2-metric
+ distances in the color space) for choosing 0 and
+ 1 respectively. 0 is black, 1 is the color r2,g2,b2.
+ */
+ dist1= (sr-r2)*(sr-r2) + (sg-g2)*(sg-g2) + (sb-b2)*(sb-b2);
+ dist0= sr*sr + sg*sg + sb*sb;
+
+ if (dist1<dist0)
+ {
+ byte |= 1 << (x-xbyte);
+ tot_error += dist1;
+
+ /* Wanted sr but got r2, so propagate sr-r2 */
+ local_rerr = (sr - r2) * fs_scale * 7/16;
+ local_gerr = (sg - g2) * fs_scale * 7/16;
+ local_berr = (sb - b2) * fs_scale * 7/16;
+ }
+ else
+ {
+ tot_error += dist0;
+
+ /* Wanted sr but got 0, so propagate sr */
+ local_rerr = sr * fs_scale * 7/16;
+ local_gerr = sg * fs_scale * 7/16;
+ local_berr = sb * fs_scale * 7/16;
+ }
+ }
+
+ if (tot_error < best_error)
+ {
+ best_byte = byte;
+ best_error = tot_error;
+ }
+ }
+
+ /* Avoid alternating 7f and ff in all-white areas, because it makes
+ regular pink vertical lines */
+ if ((best_byte&0x7f)==0x7f && (prev_byte&0x7f)==0x7f)
+ best_byte=prev_byte;
+ prev_byte=best_byte;
+
+ /*
+ Now that we've chosen values for all 8 bits of the byte, we
+ have to fill in the real pixel values into pP and propagate
+ all the error terms. We end up repeating a lot of the code
+ above.
+ */
+
+ for (x=xbyte; x<xbyte+7; x++)
+ {
+ int bit=(best_byte>>(x-xbyte))&1;
+ hibit=(best_byte>>7)&1;
+
+ sr = (pP[x] >> 16) & 0xFF;
+ sg = (pP[x] >> 8) & 0xFF;
+ sb = (pP[x] ) & 0xFF;
+ sr += this_rerr[x + 1] / fs_scale;
+ sg += this_gerr[x + 1] / fs_scale;
+ sb += this_berr[x + 1] / fs_scale;
+
+ if (sr < 0) sr = 0;
+ else if (sr > maxval) sr = maxval;
+ if (sg < 0) sg = 0;
+ else if (sg > maxval) sg = maxval;
+ if (sb < 0) sb = 0;
+ else if (sb > maxval) sb = maxval;
+
+ r2=a2_cmap[hibit][x&1][0] * bit;
+ g2=a2_cmap[hibit][x&1][1] * bit;
+ b2=a2_cmap[hibit][x&1][2] * bit;
+
+ pP[x] = (r2<<16) | (g2<<8) | (b2);
+
+ /* Propagate Floyd-Steinberg error terms. */
+ err = (sr - r2) * fs_scale;
+ this_rerr[x + 2] += (err * 7) / 16;
+ next_rerr[x ] += (err * 3) / 16;
+ next_rerr[x + 1] += (err * 5) / 16;
+ next_rerr[x + 2] += (err ) / 16;
+ err = (sg - g2) * fs_scale;
+ this_gerr[x + 2] += (err * 7) / 16;
+ next_gerr[x ] += (err * 3) / 16;
+ next_gerr[x + 1] += (err * 5) / 16;
+ next_gerr[x + 2] += (err ) / 16;
+ err = (sb - b2) * fs_scale;
+ this_berr[x + 2] += (err * 7) / 16;
+ next_berr[x ] += (err * 3) / 16;
+ next_berr[x + 1] += (err * 5) / 16;
+ next_berr[x + 2] += (err ) / 16;
+ }
+
+ /*
+ And put the actual byte into out.
+ */
+
+ out[y*(w/7) + xbyte/7] = best_byte;
+
+ }
+
+ temp_err = this_rerr;
+ this_rerr = next_rerr;
+ next_rerr = temp_err;
+ temp_err = this_gerr;
+ this_gerr = next_gerr;
+ next_gerr = temp_err;
+ temp_err = this_berr;
+ this_berr = next_berr;
+ next_berr = temp_err;
+ }
+
+ free (this_rerr);
+ free (next_rerr);
+ free (this_gerr);
+ free (next_gerr);
+ free (this_berr);
+ free (next_berr);
+
+ for (y=0; y<h; y++)
+ free (pixels[y]);
+ free (pixels);
+
+#if 0
+ {
+ /* let's see what we got... */
+ FILE *pipe = popen ("xv -", "w");
+ fprintf (pipe, "P6\n%d %d\n%d\n", w, h, 255);
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ {
+ unsigned int r = (pixels[y][x]>>16)&0xff;
+ unsigned int g = (pixels[y][x]>>8)&0xff;
+ unsigned int b = (pixels[y][x]>>0)&0xff;
+ fprintf(pipe, "%c%c%c", r, g, b);
+ }
+ fclose (pipe);
+ }
+#endif
+}
+
+typedef struct slideshow_data_s {
+ int slideno;
+ int render_img_lineno;
+ unsigned char *render_img;
+ char *img_filename;
+ Bool image_loading_p;
+} slideshow_data;
+
+
+static void
+image_loaded_cb (Screen *screen, Window window, Drawable p,
+ const char *name, XRectangle *geometry,
+ void *closure)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ apple2_sim_t *sim = (apple2_sim_t *) closure;
+ slideshow_data *mine = (slideshow_data *) sim->controller_data;
+ XWindowAttributes xgwa;
+ int w = 280;
+ int h = 192;
+ XImage *image;
+ unsigned int *buf32 = (unsigned int *) calloc (w, h * 4);
+ unsigned char *buf8 = (unsigned char *) calloc (w/7, h);
+
+ if (!buf32 || !buf8)
+ {
+ fprintf (stderr, "%s: out of memory (%dx%d)\n", progname, w, h);
+ exit (1);
+ }
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ image = XGetImage (dpy, p, 0, 0, xgwa.width, xgwa.height, ~0, ZPixmap);
+ XFreePixmap (dpy, p);
+ p = 0;
+
+ /* Scale the XImage down to Apple][ size, and convert it to a 32bpp
+ image (regardless of whether it started as TrueColor/PseudoColor.)
+ */
+ pick_a2_subimage (dpy, window, image, buf32, w, h);
+ free(image->data);
+ image->data = 0;
+ XDestroyImage(image);
+
+ /* Then dither the 32bpp image to a 6-color Apple][ colormap.
+ */
+ a2_dither (buf32, buf8, w, h);
+
+ free (buf32);
+
+ mine->image_loading_p = False;
+ mine->img_filename = (name ? strdup (name) : 0);
+ mine->render_img = buf8;
+}
+
+
+
+static const char *apple2_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*mode: random",
+ "*duration: 60",
+ "*program: xscreensaver-text --cols 40",
+ "*metaSendsESC: True",
+ "*swapBSDEL: True",
+ "*fast: False",
+# ifdef HAVE_FORKPTY
+ "*usePty: True",
+#else
+ "*usePty: False",
+# endif /* !HAVE_FORKPTY */
+
+ ANALOGTV_DEFAULTS
+ 0
+};
+
+static XrmOptionDescRec apple2_options [] = {
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-slideshow", ".mode", XrmoptionNoArg, "slideshow" },
+ { "-basic", ".mode", XrmoptionNoArg, "basic" },
+ { "-text", ".mode", XrmoptionNoArg, "text" },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-pty", ".usePty", XrmoptionNoArg, "True" },
+ { "-pipe", ".usePty", XrmoptionNoArg, "False" },
+ { "-meta", ".metaSendsESC", XrmoptionNoArg, "False" },
+ { "-esc", ".metaSendsESC", XrmoptionNoArg, "True" },
+ { "-bs", ".swapBSDEL", XrmoptionNoArg, "False" },
+ { "-del", ".swapBSDEL", XrmoptionNoArg, "True" },
+ { "-fast", ".fast", XrmoptionNoArg, "True" },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+/*
+ TODO: this should load 10 images at startup time, then cycle through them
+ to avoid the pause while it loads.
+ */
+
+static void slideshow_controller(apple2_sim_t *sim, int *stepno,
+ double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ int i;
+ slideshow_data *mine;
+
+ if (!sim->controller_data)
+ sim->controller_data = calloc (1, sizeof(*mine));
+ mine = (slideshow_data *) sim->controller_data;
+
+ switch(*stepno) {
+
+ case 0:
+ a2_invalidate(st);
+ a2_clear_hgr(st);
+ a2_cls(st);
+ sim->typing_rate = 0.3;
+ sim->dec->powerup=0.0;
+
+ a2_goto(st, 0, 16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,23,0);
+ a2_printc(st,']');
+
+ *stepno=10;
+ break;
+
+ case 10:
+ {
+ XWindowAttributes xgwa;
+ Pixmap p;
+ XGetWindowAttributes (sim->dpy, sim->window, &xgwa);
+ p = XCreatePixmap (sim->dpy, sim->window, xgwa.width, xgwa.height,
+ xgwa.depth);
+ mine->image_loading_p = True;
+ load_image_async (xgwa.screen, sim->window, p, image_loaded_cb, sim);
+
+ /* pause with a blank screen for a bit, while the image loads in the
+ background. */
+ *next_actiontime += 2.0;
+ *stepno=11;
+ }
+ break;
+
+ case 11:
+ if (! mine->image_loading_p) { /* image is finally loaded */
+ if (st->gr_mode) {
+ *stepno=30;
+ } else {
+ *stepno=20;
+ }
+ *next_actiontime += 3.0;
+ }
+ break;
+
+ case 20:
+ sim->typing="HGR\n";
+ *stepno=29;
+ break;
+
+ case 29:
+ sim->printing="]";
+ *stepno=30;
+ break;
+
+ case 30:
+ st->gr_mode=A2_GR_HIRES;
+ if (mine->img_filename) {
+ char *basename, *tmp;
+ char *s;
+
+ basename = tmp = strdup (mine->img_filename);
+ while (1)
+ {
+ char *slash = strchr(basename, '/');
+ if (!slash || !slash[1]) break;
+ basename = slash+1;
+ }
+ {
+ char *dot=strrchr(basename,'.');
+ if (dot) *dot=0;
+ }
+ if (strlen(basename)>20) basename[20]=0;
+ for (s=basename; *s; s++) {
+ *s = toupper (*s);
+ if (*s <= ' ') *s = '_';
+ }
+ sprintf(sim->typing_buf, "BLOAD %s\n", basename);
+ sim->typing = sim->typing_buf;
+
+ free(tmp);
+ } else {
+ sim->typing = "BLOAD IMAGE\n";
+ }
+ mine->render_img_lineno=0;
+
+ *stepno=35;
+ break;
+
+ case 35:
+ *next_actiontime += 0.7;
+ *stepno=40;
+ break;
+
+ case 40:
+ if (mine->render_img_lineno>=192) {
+ sim->printing="]";
+ sim->typing="POKE 49234,0\n";
+ *stepno=50;
+ return;
+ }
+
+ for (i=0; i<6 && mine->render_img_lineno<192; i++) {
+ a2_display_image_loading(st, mine->render_img,
+ mine->render_img_lineno++);
+ }
+
+ /* The disk would have to seek every 13 sectors == 78 lines.
+ (This ain't no newfangled 16-sector operating system) */
+ if ((mine->render_img_lineno%78)==0) {
+ *next_actiontime += 0.5;
+ } else {
+ *next_actiontime += 0.08;
+ }
+ break;
+
+ case 50:
+ st->gr_mode |= A2_GR_FULL;
+ *stepno=60;
+ /* Note that sim->delay is sometimes "infinite" in this controller.
+ These images are kinda dull anyway, so don't leave it on too long. */
+ *next_actiontime += 2;
+ break;
+
+ case 60:
+ sim->printing="]";
+ sim->typing="POKE 49235,0\n";
+ *stepno=70;
+ break;
+
+ case 70:
+ sim->printing="]";
+ st->gr_mode &= ~A2_GR_FULL;
+ if (mine->render_img) {
+ free(mine->render_img);
+ mine->render_img=NULL;
+ }
+ if (mine->img_filename) {
+ free(mine->img_filename);
+ mine->img_filename=NULL;
+ }
+ *stepno=10;
+ break;
+
+ case 80:
+ /* Do nothing, just wait */
+ *next_actiontime += 2.0;
+ *stepno = A2CONTROLLER_FREE;
+ break;
+
+ case A2CONTROLLER_FREE:
+ /* It is possible that still image is being loaded,
+ in that case mine cannot be freed, because
+ callback function tries to use it, so wait.
+ */
+ if (mine->image_loading_p) {
+ *stepno = 80;
+ break;
+ }
+ free(mine->render_img);
+ free(mine->img_filename);
+ free(mine);
+ mine = 0;
+ return;
+
+ }
+}
+
+#define NPAR 16
+
+struct terminal_controller_data {
+ Display *dpy;
+ char curword[256];
+ unsigned char lastc;
+ double last_emit_time;
+ text_data *tc;
+
+ int escstate;
+ int csiparam[NPAR];
+ int curparam;
+ int cursor_x, cursor_y;
+ int saved_x, saved_y;
+ int unicruds; char unicrud[7];
+ union {
+ struct {
+ unsigned int bold : 1;
+ unsigned int blink : 1;
+ unsigned int rev : 1;
+ } bf;
+ int w;
+ } termattrib;
+ Bool fast_p;
+
+};
+
+
+/* The structure of closure linkage throughout this code is so amazingly
+ baroque that I can't get to the 'struct state' from where I need it. */
+static const char *global_program;
+static Bool global_fast_p;
+
+
+static void
+terminal_closegen(struct terminal_controller_data *mine)
+{
+ if (mine->tc) {
+ textclient_close (mine->tc);
+ mine->tc = 0;
+ }
+}
+
+static int
+terminal_read(struct terminal_controller_data *mine, unsigned char *buf, int n)
+{
+ if (!mine || !mine->tc) {
+ return 0;
+ } else {
+ int i, count = 0;
+ for (i = 0; i < n; i++) {
+ int c = textclient_getc (mine->tc);
+ if (c <= 0) break;
+ buf[i] = c;
+ mine->lastc = c;
+ count++;
+ }
+ return count;
+ }
+}
+
+
+static int
+terminal_keypress_handler (Display *dpy, XEvent *event, void *data)
+{
+ struct terminal_controller_data *mine =
+ (struct terminal_controller_data *) data;
+ mine->dpy = dpy;
+ if (event->xany.type == KeyPress && mine->tc)
+ return textclient_putc (mine->tc, &event->xkey);
+ return 0;
+}
+
+
+static void
+a2_ascii_printc (apple2_state_t *st, unsigned char c,
+ Bool bold_p, Bool blink_p, Bool rev_p,
+ Bool scroll_p)
+{
+ if (c >= 'a' && c <= 'z') /* upcase lower-case chars */
+ {
+ c &= 0xDF;
+ }
+ else if ((c >= 'A'+128) || /* upcase and blink */
+ (c < ' ' && c != 014 && /* high-bit & ctl chrs */
+ c != '\r' && c != '\n' && c!='\t'))
+ {
+ c = (c & 0x1F) | 0x80;
+ }
+ else if (c >= 'A' && c <= 'Z') /* invert upper-case chars */
+ {
+ c |= 0x80;
+ }
+
+ if (bold_p) c |= 0xc0;
+ if (blink_p) c = (c & ~0x40) | 0x80;
+ if (rev_p) c |= 0xc0;
+
+ if (scroll_p)
+ a2_printc(st, c);
+ else
+ a2_printc_noscroll(st, c);
+}
+
+
+static void
+a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
+ unsigned char c)
+{
+ apple2_state_t *st=sim->st;
+ int cols = SCREEN_COLS;
+ int rows = SCREEN_ROWS;
+
+ int i;
+ int start, end;
+
+ /* Mostly duplicated in phosphor.c */
+
+ switch (state->escstate)
+ {
+ case 0:
+ switch (c)
+ {
+ case 7: /* BEL */
+ /* Dummy case - we don't want the screensaver to beep */
+ /* #### But maybe this should flash the screen? */
+ break;
+ case 8: /* BS */
+ if (state->cursor_x > 0)
+ state->cursor_x--;
+ break;
+ case 9: /* HT */
+ if (state->cursor_x < cols - 8)
+ {
+ state->cursor_x = (state->cursor_x & ~7) + 8;
+ }
+ else
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ }
+ break;
+ case 10: /* LF */
+# ifndef HAVE_FORKPTY
+ state->cursor_x = 0; /* No ptys on iPhone; assume CRLF. */
+# endif
+ case 11: /* VT */
+ case 12: /* FF */
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ break;
+ case 13: /* CR */
+ state->cursor_x = 0;
+ break;
+ case 14: /* SO */
+ case 15: /* SI */
+ /* Dummy case - there is one and only one font. */
+ break;
+ case 24: /* CAN */
+ case 26: /* SUB */
+ /* Dummy case - these interrupt escape sequences, so
+ they don't do anything in this state */
+ break;
+ case 27: /* ESC */
+ state->escstate = 1;
+ break;
+ case 127: /* DEL */
+ /* Dummy case - this is supposed to be ignored */
+ break;
+ case 155: /* CSI */
+ state->escstate = 2;
+ for(i = 0; i < NPAR; i++)
+ state->csiparam[i] = 0;
+ state->curparam = 0;
+ break;
+ default:
+
+ /* states 102-106 are for UTF-8 decoding */
+
+ if ((c & 0xE0) == 0xC0) { /* 110xxxxx - 11 bits, 2 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 102;
+ break;
+ } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx - 16 bits, 3 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 103;
+ break;
+ } else if ((c & 0xF8) == 0xF0) { /* 11110xxx - 21 bits, 4 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 104;
+ break;
+ } else if ((c & 0xFC) == 0xF8) { /* 111110xx - 26 bits, 5 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 105;
+ break;
+ } else if ((c & 0xFE) == 0xFC) { /* 1111110x - 31 bits, 6 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 106;
+ break;
+ }
+
+ PRINT:
+
+ /* If the cursor is in column 39 and we print a character, then
+ that character shows up in column 39, and the cursor is no longer
+ visible on the screen (it's in "column 40".) If another character
+ is printed, then that character shows up in column 0, and the
+ cursor moves to column 1.
+
+ This is empirically what xterm and gnome-terminal do, so that must
+ be the right thing. (In xterm, the cursor vanishes, whereas; in
+ gnome-terminal, the cursor overprints the character in col 39.)
+ */
+ if (state->cursor_x >= cols)
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y >= rows - 1)
+ a2_scroll (st);
+ else
+ state->cursor_y++;
+ }
+
+ a2_goto(st, state->cursor_y, state->cursor_x); /* clips range */
+ a2_ascii_printc (st, c,
+ state->termattrib.bf.bold,
+ state->termattrib.bf.blink,
+ state->termattrib.bf.rev,
+ False);
+ state->cursor_x++;
+
+ break;
+ }
+ break;
+ case 1:
+ switch (c)
+ {
+ case 24: /* CAN */
+ case 26: /* SUB */
+ state->escstate = 0;
+ break;
+ case 'c': /* Reset */
+ a2_cls(st);
+ state->escstate = 0;
+ break;
+ case 'D': /* Linefeed */
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ state->escstate = 0;
+ break;
+ case 'E': /* Newline */
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'M': /* Reverse newline */
+ if (state->cursor_y > 0)
+ state->cursor_y--;
+ state->escstate = 0;
+ break;
+ case '7': /* Save state */
+ state->saved_x = state->cursor_x;
+ state->saved_y = state->cursor_y;
+ state->escstate = 0;
+ break;
+ case '8': /* Restore state */
+ state->cursor_x = state->saved_x;
+ state->cursor_y = state->saved_y;
+ state->escstate = 0;
+ break;
+ case '[': /* CSI */
+ state->escstate = 2;
+ for(i = 0; i < NPAR; i++)
+ state->csiparam[i] = 0;
+ state->curparam = 0;
+ break;
+ case '%': /* Select charset */
+ /* @: Select default (ISO 646 / ISO 8859-1)
+ G: Select UTF-8
+ 8: Select UTF-8 (obsolete)
+
+ We can just ignore this and always process UTF-8, I think?
+ We must still catch the last byte, though.
+ */
+ case '(':
+ case ')':
+ /* I don't support different fonts either - see above
+ for SO and SI */
+ state->escstate = 3;
+ break;
+ default:
+ /* Escape sequences not supported:
+ *
+ * H - Set tab stop
+ * Z - Terminal identification
+ * > - Keypad change
+ * = - Other keypad change
+ * ] - OS command
+ */
+ state->escstate = 0;
+ break;
+ }
+ break;
+ case 2:
+ switch (c)
+ {
+ case 24: /* CAN */
+ case 26: /* SUB */
+ state->escstate = 0;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ if (state->curparam < NPAR)
+ state->csiparam[state->curparam] =
+ (state->csiparam[state->curparam] * 10) + (c - '0');
+ break;
+ case ';':
+ state->csiparam[++state->curparam] = 0;
+ break;
+ case '[':
+ state->escstate = 3;
+ break;
+ case '@':
+ for (i = 0; i < state->csiparam[0]; i++)
+ {
+ if(++state->cursor_x > cols)
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ }
+ }
+ state->escstate = 0;
+ break;
+ case 'F':
+ state->cursor_x = 0;
+ case 'A':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_y -= state->csiparam[0]) < 0)
+ state->cursor_y = 0;
+ state->escstate = 0;
+ break;
+ case 'E':
+ state->cursor_x = 0;
+ case 'e':
+ case 'B':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_y += state->csiparam[0]) >= rows)
+ state->cursor_y = rows - 1;
+ state->escstate = 0;
+ break;
+ case 'a':
+ case 'C':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_x += state->csiparam[0]) >= cols)
+ state->cursor_x = cols - 1;
+ state->escstate = 0;
+ break;
+ case 'D':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_x -= state->csiparam[0]) < 0)
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'd':
+ if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
+ state->cursor_y = rows - 1;
+ state->escstate = 0;
+ break;
+ case '`':
+ case 'G':
+ if ((state->cursor_x = (state->csiparam[0] - 1)) >= cols)
+ state->cursor_x = cols - 1;
+ state->escstate = 0;
+ break;
+ case 'f':
+ case 'H':
+ if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
+ state->cursor_y = rows - 1;
+ if ((state->cursor_x = (state->csiparam[1] - 1)) >= cols)
+ state->cursor_x = cols - 1;
+ if(state->cursor_y < 0)
+ state->cursor_y = 0;
+ if(state->cursor_x < 0)
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'J':
+ start = 0;
+ end = rows * cols;
+ if (state->csiparam[0] == 0)
+ start = cols * state->cursor_y + state->cursor_x;
+ if (state->csiparam[0] == 1)
+ end = cols * state->cursor_y + state->cursor_x;
+
+ a2_goto(st, state->cursor_y, state->cursor_x);
+ for (i = start; i < end; i++)
+ {
+ a2_ascii_printc(st, ' ', False, False, False, False);
+ }
+ state->escstate = 0;
+ break;
+ case 'K':
+ start = 0;
+ end = cols;
+ if (state->csiparam[0] == 0)
+ start = state->cursor_x;
+ if (state->csiparam[1] == 1)
+ end = state->cursor_x;
+
+ a2_goto(st, state->cursor_y, state->cursor_x);
+ for (i = start; i < end; i++)
+ {
+ a2_ascii_printc(st, ' ', False, False, False, False);
+ }
+ state->escstate = 0;
+ break;
+ case 'm': /* Set attributes */
+ for (i = 0; i <= state->curparam; i++)
+ {
+ switch(state->csiparam[i])
+ {
+ case 0:
+ state->termattrib.w = 0;
+ break;
+ case 1:
+ state->termattrib.bf.bold = 1;
+ break;
+ case 5:
+ state->termattrib.bf.blink = 1;
+ break;
+ case 7:
+ state->termattrib.bf.rev = 1;
+ break;
+ case 21:
+ case 22:
+ state->termattrib.bf.bold = 0;
+ break;
+ case 25:
+ state->termattrib.bf.blink = 0;
+ break;
+ case 27:
+ state->termattrib.bf.rev = 0;
+ break;
+ }
+ }
+ state->escstate = 0;
+ break;
+ case 's': /* Save position */
+ state->saved_x = state->cursor_x;
+ state->saved_y = state->cursor_y;
+ state->escstate = 0;
+ break;
+ case 'u': /* Restore position */
+ state->cursor_x = state->saved_x;
+ state->cursor_y = state->saved_y;
+ state->escstate = 0;
+ break;
+ case '?': /* DEC Private modes */
+ if ((state->curparam != 0) || (state->csiparam[0] != 0))
+ state->escstate = 0;
+ break;
+ default:
+ /* Known unsupported CSIs:
+ *
+ * L - Insert blank lines
+ * M - Delete lines (I don't know what this means...)
+ * P - Delete characters
+ * X - Erase characters (difference with P being...?)
+ * c - Terminal identification
+ * g - Clear tab stop(s)
+ * h - Set mode (Mainly due to its complexity and lack of good
+ docs)
+ * l - Clear mode
+ * m - Set mode (Phosphor is, per defenition, green on black)
+ * n - Status report
+ * q - Set keyboard LEDs
+ * r - Set scrolling region (too exhausting - noone uses this,
+ right?)
+ */
+ state->escstate = 0;
+ break;
+ }
+ break;
+ case 3:
+ state->escstate = 0;
+ break;
+
+ case 102:
+ case 103:
+ case 104:
+ case 105:
+ case 106:
+ {
+ int total = state->escstate - 100; /* see what I did there */
+ if (state->unicruds < total) {
+ /* Buffer more bytes of the UTF-8 sequence */
+ state->unicrud[state->unicruds++] = c;
+ }
+
+ if (state->unicruds >= total) {
+ /* Done! Convert it to ASCII and print that. */
+ char *s;
+ state->unicrud[state->unicruds] = 0;
+ s = utf8_to_latin1 ((const char *) state->unicrud, True);
+ state->unicruds = 0;
+ state->escstate = 0;
+ if (s) {
+ c = s[0];
+ free (s);
+ goto PRINT;
+ } else {
+ /* c = 0; */
+ }
+ }
+ }
+ break;
+
+ default:
+ abort();
+ }
+ a2_goto(st, state->cursor_y, state->cursor_x);
+}
+
+
+/*
+ It's fun to put things like "gdb" as the command. For one, it's
+ amusing how the standard mumble (version, no warranty, it's
+ GNU/Linux dammit) occupies an entire screen on the Apple ][.
+*/
+
+static void
+terminal_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ int c;
+ int i;
+
+ struct terminal_controller_data *mine;
+ if (!sim->controller_data)
+ sim->controller_data=calloc(sizeof(struct terminal_controller_data),1);
+ mine=(struct terminal_controller_data *) sim->controller_data;
+ mine->dpy = sim->dpy;
+
+ mine->fast_p = global_fast_p;
+
+ switch(*stepno) {
+
+ case 0:
+ if (random()%2)
+ st->gr_mode |= A2_GR_FULL; /* Turn on color mode even through it's
+ showing text */
+ a2_cls(st);
+ a2_goto(st,0,16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,2,0);
+ mine->cursor_y = 2;
+
+ if (! mine->tc) {
+ mine->tc = textclient_open (mine->dpy);
+ textclient_reshape (mine->tc,
+ SCREEN_COLS, SCREEN_ROWS,
+ SCREEN_COLS, SCREEN_ROWS,
+ 0);
+ }
+
+ if (! mine->fast_p)
+ *next_actiontime += 4.0;
+ *stepno = 10;
+
+ mine->last_emit_time = sim->curtime;
+ break;
+
+ case 10:
+ case 11:
+ {
+ Bool first_line_p = (*stepno == 10);
+ unsigned char buf[1024];
+ int nr,nwant;
+ double elapsed;
+
+ elapsed=sim->curtime - mine->last_emit_time;
+
+ nwant = elapsed * 25.0; /* characters per second */
+
+ if (first_line_p) {
+ *stepno = 11;
+ nwant = 1;
+ }
+
+ if (nwant > 40) nwant = 40;
+
+ if (mine->fast_p)
+ nwant = sizeof(buf)-1;
+
+ if (nwant <= 0) break;
+
+ mine->last_emit_time = sim->curtime;
+
+ nr=terminal_read(mine, buf, nwant);
+ for (i=0; i<nr; i++) {
+ c=buf[i];
+
+ if (mine->tc)
+ a2_vt100_printc (sim, mine, c);
+ else
+ a2_ascii_printc (st, c, False, False, False, True);
+ }
+ }
+ break;
+
+ case A2CONTROLLER_FREE:
+ terminal_closegen(mine);
+ free(mine);
+ mine = 0;
+ return;
+ }
+}
+
+struct basic_controller_data {
+ int prog_line;
+ int x,y,k;
+ const char * const * progtext;
+ int progstep;
+ char *rep_str;
+ int rep_pos;
+ double prog_start_time;
+ char error_buf[256];
+};
+
+/*
+ Adding more programs is easy. Just add a listing here and to all_programs,
+ then add the state machine to actually execute it to basic_controller.
+ */
+static const char * const moire_program[]={
+ "10 HGR2\n",
+ "20 FOR Y = 0 TO 190 STEP 2\n",
+ "30 HCOLOR=4 : REM BLACK\n",
+ "40 HPLOT 0,191-Y TO 279,Y\n",
+ "60 HCOLOR=7 : REM WHITE\n",
+ "80 HPLOT 0,190-Y TO 279,Y+1\n",
+ "90 NEXT Y\n",
+ "100 FOR X = 0 TO 278 STEP 3\n",
+ "110 HCOLOR=4\n",
+ "120 HPLOT 279-X,0 TO X,191\n",
+ "140 HCOLOR=7\n",
+ "150 HPLOT 278-X,0 TO X+1,191\n",
+ "160 NEXT X\n",
+ NULL
+};
+
+static const char * const sinewave_program[] = {
+ "10 HGR\n",
+ "25 K=0\n",
+ "30 FOR X = 0 TO 279\n",
+ "32 HCOLOR= 0\n",
+ "35 HPLOT X,0 TO X,159\n",
+ "38 HCOLOR= 3\n",
+ "40 Y = 80 + SIN(15*(X-K)/279) * 40\n",
+ "50 HPLOT X,Y\n",
+ "60 NEXT X\n",
+ "70 K=K+4\n",
+ "80 GOTO 30\n",
+ NULL
+};
+
+#if 0
+static const char * const dumb_program[]={
+ "10 PRINT \"APPLE ][ ROOLZ! TRS-80 DROOLZ!\"\n",
+ "20 GOTO 10\n",
+ NULL
+};
+#endif
+
+static const char * const random_lores_program[]={
+ "1 REM APPLE ][ SCREEN SAVER\n",
+ "10 GR\n",
+ "100 COLOR= RND(1)*16\n",
+
+ "110 X=RND(1)*40\n",
+ "120 Y1=RND(1)*40\n",
+ "130 Y2=RND(1)*40\n",
+ "140 FOR Y = Y1 TO Y2\n",
+ "150 PLOT X,Y\n",
+ "160 NEXT Y\n",
+
+ "210 Y=RND(1)*40\n",
+ "220 X1=RND(1)*40\n",
+ "230 X2=RND(1)*40\n",
+ "240 FOR X = X1 TO X2\n",
+ "250 PLOT X,Y\n",
+ "260 NEXT X\n",
+ "300 GOTO 100\n",
+
+ NULL
+};
+
+static char typo_map[256];
+
+static int make_typo(char *out_buf, const char *orig, char *err_buf)
+{
+ int i,j;
+ int errc;
+ int success=0;
+ err_buf[0]=0;
+
+ typo_map['A']='Q';
+ typo_map['S']='A';
+ typo_map['D']='S';
+ typo_map['F']='G';
+ typo_map['G']='H';
+ typo_map['H']='J';
+ typo_map['J']='H';
+ typo_map['K']='L';
+ typo_map['L']=';';
+
+ typo_map['Q']='1';
+ typo_map['W']='Q';
+ typo_map['E']='3';
+ typo_map['R']='T';
+ typo_map['T']='Y';
+ typo_map['Y']='U';
+ typo_map['U']='Y';
+ typo_map['I']='O';
+ typo_map['O']='P';
+ typo_map['P']='[';
+
+ typo_map['Z']='X';
+ typo_map['X']='C';
+ typo_map['C']='V';
+ typo_map['V']='C';
+ typo_map['B']='N';
+ typo_map['N']='B';
+ typo_map['M']='N';
+ typo_map[',']='.';
+ typo_map['.']=',';
+
+ typo_map['!']='1';
+ typo_map['@']='2';
+ typo_map['#']='3';
+ typo_map['$']='4';
+ typo_map['%']='5';
+ typo_map['^']='6';
+ typo_map['&']='7';
+ typo_map['*']='8';
+ typo_map['(']='9';
+ typo_map[')']='0';
+
+ typo_map['1']='Q';
+ typo_map['2']='W';
+ typo_map['3']='E';
+ typo_map['4']='R';
+ typo_map['5']='T';
+ typo_map['6']='Y';
+ typo_map['7']='U';
+ typo_map['8']='I';
+ typo_map['9']='O';
+ typo_map['0']='-';
+
+ strcpy(out_buf, orig);
+ for (i=0; out_buf[i]; i++) {
+ char *p = out_buf+i;
+
+ if (i>2 && p[-2]=='R' && p[-1]=='E' && p[0]=='M')
+ break;
+
+ if (isalpha(p[0]) &&
+ isalpha(p[1]) &&
+ p[0] != p[1] &&
+ random()%15==0)
+ {
+ int tmp=p[1];
+ p[1]=p[0];
+ p[0]=tmp;
+ success=1;
+ sprintf(err_buf,"?SYNTAX ERROR\n");
+ break;
+ }
+
+ if (random()%10==0 && strlen(p)>=4 && (errc=typo_map[(int)(unsigned char)p[0]])) {
+ int remain=strlen(p);
+ int past=random()%(remain-2)+1;
+ memmove(p+past+past, p, remain+1);
+ p[0]=errc;
+ for (j=0; j<past; j++) {
+ p[past+j]=010;
+ }
+ break;
+ }
+ }
+ return success;
+}
+
+static const struct {
+ const char * const * progtext;
+ int progstep;
+} all_programs[]={
+ {moire_program, 100},
+ /*{dumb_program, 200}, */
+ {sinewave_program, 400},
+ {random_lores_program, 500},
+};
+
+static void
+basic_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ int i;
+
+ struct basic_controller_data *mine;
+ if (!sim->controller_data)
+ sim->controller_data=calloc(sizeof(struct basic_controller_data),1);
+ mine=(struct basic_controller_data *) sim->controller_data;
+
+ switch (*stepno) {
+ case 0:
+ st->gr_mode=0;
+ a2_cls(st);
+ a2_goto(st,0,16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,23,0);
+ a2_printc(st,']');
+ sim->typing_rate=0.2;
+
+ i=random()%countof(all_programs);
+ mine->progtext=all_programs[i].progtext;
+ mine->progstep=all_programs[i].progstep;
+ mine->prog_line=0;
+
+ *next_actiontime += 1.0;
+ *stepno=10;
+ break;
+
+ case 10:
+ if (st->cursx==0) a2_printc(st,']');
+ if (mine->progtext[mine->prog_line]) {
+ if (random()%4==0) {
+ int err=make_typo(sim->typing_buf,
+ mine->progtext[mine->prog_line],
+ mine->error_buf);
+ sim->typing=sim->typing_buf;
+ if (err) {
+ *stepno=11;
+ } else {
+ mine->prog_line++;
+ }
+ } else {
+ sim->typing=mine->progtext[mine->prog_line++];
+ }
+ } else {
+ *stepno=15;
+ }
+ break;
+
+ case 11:
+ sim->printing=mine->error_buf;
+ *stepno=12;
+ break;
+
+ case 12:
+ if (st->cursx==0) a2_printc(st,']');
+ *next_actiontime+=1.0;
+ *stepno=10;
+ break;
+
+ case 15:
+ sim->typing="RUN\n";
+ mine->y=0;
+ mine->x=0;
+ mine->k=0;
+ mine->prog_start_time=*next_actiontime;
+ *stepno=mine->progstep;
+ break;
+
+ /* moire_program */
+ case 100:
+ st->gr_mode=A2_GR_HIRES|A2_GR_FULL;
+ for (i=0; i<24 && mine->y<192; i++)
+ {
+ a2_hline(st, 4, 0, 191-mine->y, 279, mine->y);
+ a2_hline(st, 7, 0, 191-mine->y-1, 279, mine->y+1);
+ mine->y += 2;
+ }
+ if (mine->y>=192) {
+ mine->x = 0;
+ *stepno = 110;
+ }
+ break;
+
+ case 110:
+ for (i=0; i<24 && mine->x<280; i++)
+ {
+ a2_hline(st, 4, 279-mine->x, 0, mine->x, 192);
+ a2_hline(st, 7, 279-mine->x-1, 0, mine->x+1, 192);
+ mine->x+=3;
+ }
+ if (mine->x >= 280) *stepno=120;
+ break;
+
+ case 120:
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ /* dumb_program */
+ case 200:
+ mine->rep_str="\nAPPLE ][ ROOLZ! TRS-80 DROOLZ!";
+ for (i=0; i<30; i++) {
+ a2_prints(st, mine->rep_str);
+ }
+ *stepno=210;
+ break;
+
+ case 210:
+ i=random()%strlen(mine->rep_str);
+ while (mine->rep_pos != i) {
+ a2_printc(st, mine->rep_str[mine->rep_pos]);
+ mine->rep_pos++;
+ if (!mine->rep_str[mine->rep_pos]) mine->rep_pos=0;
+ }
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ /* sinewave_program */
+ case 400:
+ st->gr_mode=A2_GR_HIRES;
+ *stepno=410;
+ break;
+
+ case 410:
+ for (i=0; i<48; i++) {
+ int y=80 + (int)(75.0*sin(15.0*(mine->x-mine->k)/279.0));
+ a2_hline(st, 0, mine->x, 0, mine->x, 159);
+ a2_hplot(st, 3, mine->x, y);
+ mine->x += 1;
+ if (mine->x>=279) {
+ mine->x=0;
+ mine->k+=4;
+ }
+ }
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ case 420:
+ a2_prints(st, "]");
+ *stepno=999;
+ break;
+
+ /* random_lores_program */
+ case 500:
+ st->gr_mode=A2_GR_LORES|A2_GR_FULL;
+ a2_clear_gr(st);
+ *stepno=510;
+
+ case 510:
+ for (i=0; i<10; i++) {
+ int color,x,y,x1,x2,y1,y2;
+
+ color=random()%15;
+ x=random()%40;
+ y1=random()%48;
+ y2=random()%48;
+ for (y=y1; y<y2; y++) a2_plot(st, color, x, y);
+
+ x1=random()%40;
+ x2=random()%40;
+ y=random()%48;
+ for (x=x1; x<x2; x++) a2_plot(st, color, x, y);
+ }
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ case 999:
+ *stepno=0;
+ break;
+
+ case A2CONTROLLER_FREE:
+ free(mine);
+ mine = 0;
+ break;
+ }
+
+}
+
+static void (* const controllers[]) (apple2_sim_t *sim, int *stepno,
+ double *next_actiontime) = {
+ slideshow_controller,
+ terminal_controller,
+ basic_controller
+};
+
+struct state {
+ int duration;
+ Bool random_p;
+ apple2_sim_t *sim;
+ void (*controller) (apple2_sim_t *sim, int *stepno, double *next_actiontime);
+};
+
+
+static void *
+apple2_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ char *s;
+
+ st->duration = get_integer_resource (dpy, "duration", "Integer");
+
+ st->controller = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ s = get_string_resource (dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp(s, "random"))
+ st->random_p = True;
+ else if (!strcasecmp(s, "text"))
+ st->controller = terminal_controller;
+ else if (!strcasecmp(s, "slideshow"))
+ st->controller = slideshow_controller;
+ else if (!strcasecmp(s, "basic"))
+ st->controller = basic_controller;
+ else
+ {
+ fprintf (stderr, "%s: mode must be text, slideshow, or random; not %s\n",
+ progname, s);
+ exit (1);
+ }
+ if (s) free (s);
+
+ global_program = get_string_resource (dpy, "program", "Program");
+ global_fast_p = get_boolean_resource (dpy, "fast", "Boolean");
+
+
+ /* Kludge for MacOS standalone mode: see OSX/SaverRunner.m. */
+ {
+ const char *s = getenv ("XSCREENSAVER_STANDALONE");
+ if (s && *s && strcmp(s, "0"))
+ {
+ st->controller = terminal_controller;
+ st->random_p = False;
+ global_program = getenv ("SHELL");
+ global_fast_p = True;
+ }
+ }
+
+
+ if (! st->random_p) {
+ if (st->controller == terminal_controller ||
+ st->controller == slideshow_controller)
+ st->duration = 999999; /* these run "forever" */
+ }
+
+ return st;
+}
+
+static unsigned long
+apple2_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (! st->sim) {
+ if (st->random_p)
+ st->controller = controllers[random() % (countof(controllers))];
+ st->sim = apple2_start (dpy, window, st->duration, st->controller);
+ }
+
+ if (! apple2_one_frame (st->sim)) {
+ st->sim = 0;
+ }
+
+#ifdef HAVE_MOBILE
+ return 0;
+#else
+ return 5000;
+#endif
+}
+
+static void
+apple2_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (st->sim)
+ analogtv_reconfigure (st->sim->dec);
+}
+
+static Bool
+apple2_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->sim &&
+ st->controller == terminal_controller &&
+ event->xany.type == KeyPress) {
+ terminal_keypress_handler (dpy, event, st->sim->controller_data);
+ return True;
+ }
+
+ return False;
+}
+
+static void
+apple2_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->sim) {
+ st->sim->stepno = A2CONTROLLER_DONE;
+ if (apple2_one_frame (st->sim))
+ abort(); /* should have freed! */
+ }
+ free (st);
+}
+
+
+XSCREENSAVER_MODULE ("Apple2", apple2)
diff --git a/hacks/apple2.c b/hacks/apple2.c
new file mode 100644
index 0000000..1918a5c
--- /dev/null
+++ b/hacks/apple2.c
@@ -0,0 +1,885 @@
+/* xscreensaver, Copyright (c) 1998-2010 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
+ * with additional work by Jamie Zawinski <jwz@jwz.org>
+ */
+
+#include <math.h>
+#include "screenhackI.h"
+#include "apple2.h"
+#include "ximage-loader.h"
+
+#ifdef HAVE_XSHM_EXTENSION
+#include "xshm.h"
+#endif
+
+/*
+ * Implementation notes
+ *
+ * The A2 had 3 display modes: text, lores, and hires. Text was 40x24, and it
+ * disabled color in the TV. Lores gave you 40x48 graphics blocks, using the
+ * same memory as the text screen. Each could be one of 16 colors. Hires gave
+ * you 280x192 pixels. Odd pixels were blue or purple, and even pixels were
+ * orange or green depending on the setting of the high bit in each byte.
+ *
+ * The graphics modes could also have 4 lines of text at the bottom. This was
+ * fairly unreadable if you had a color monitor.
+ *
+ * Each mode had 2 different screens using different memory space. In hires
+ * mode this was sometimes used for double buffering, but more often the lower
+ * screen was full of code/data and the upper screen was used for display, so
+ * you got random garbage on the screen.
+ *
+ * The text font is based on X's standard 6x10 font, with a few tweaks like
+ * putting a slash across the zero.
+ *
+ * To use this, you'll call apple2(display, window, duration,
+ * controller) where the function controller defines what will happen.
+ * See bsod.c and apple2-main.c for example controllers. The
+ * controller function gets called whenever the machine ready to start
+ * something new. By setting sim->printing or sim->typing, it'll be
+ * busy for some time spitting characters out one at a time. By
+ * setting *next_actiontime+=X.X, it'll pause and just update the screen
+ * for that long before calling the controller function again.
+ *
+ * By setting stepno to A2CONTROLLER_DONE, the loop will end. It will also end
+ * after the time specified by the delay parameter. In either case, it calls
+ * the controller with stepno==A2CONTROLLER_FREE to allow it to release any
+ * memory.
+ *
+ * The void* apple2_sim_t::controller_data is for the use of the controller.
+ * It will be initialize to NULL, and the controller can store its own state
+ * there.
+ *
+ */
+
+void
+a2_scroll(apple2_state_t *st)
+{
+ int i;
+ st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off cursor */
+
+ for (i=0; i<23; i++) {
+ memcpy(st->textlines[i],st->textlines[i+1],40);
+ }
+ memset(st->textlines[23],0xe0,40);
+}
+
+static void
+a2_printc_1(apple2_state_t *st, char c, int scroll_p)
+{
+ st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
+
+ if (c == '\n') /* ^J == NL */
+ {
+ if (st->cursy==23)
+ {
+ if (scroll_p)
+ a2_scroll(st);
+ }
+ else
+ {
+ st->cursy++;
+ }
+ st->cursx=0;
+ }
+ else if (c == 014) /* ^L == CLS, Home */
+ {
+ a2_cls(st);
+ a2_goto(st,0,0);
+ }
+ else if (c == '\t') /* ^I == tab */
+ {
+ a2_goto(st, st->cursy, (st->cursx+8)&~7);
+ }
+ else if (c == 010) /* ^H == backspace */
+ {
+ st->textlines[st->cursy][st->cursx]=0xe0;
+ a2_goto(st, st->cursy, st->cursx-1);
+ }
+ else if (c == '\r') /* ^M == CR */
+ {
+ st->cursx=0;
+ }
+ else
+ {
+ st->textlines[st->cursy][st->cursx]=c ^ 0xc0;
+ st->cursx++;
+ if (st->cursx==40) {
+ if (st->cursy==23) {
+ if (scroll_p)
+ a2_scroll(st);
+ } else {
+ st->cursy++;
+ }
+ st->cursx=0;
+ }
+ }
+
+ st->textlines[st->cursy][st->cursx] &= 0x7f; /* turn on blink */
+}
+
+void
+a2_printc(apple2_state_t *st, char c)
+{
+ a2_printc_1(st, c, 1);
+}
+
+void
+a2_printc_noscroll(apple2_state_t *st, char c)
+{
+ a2_printc_1(st, c, 0);
+}
+
+
+void
+a2_prints(apple2_state_t *st, char *s)
+{
+ while (*s) a2_printc(st, *s++);
+}
+
+void
+a2_goto(apple2_state_t *st, int r, int c)
+{
+ if (r > 23) r = 23;
+ if (c > 39) c = 39;
+ st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
+ st->cursy=r;
+ st->cursx=c;
+ st->textlines[st->cursy][st->cursx] &= 0x7f; /* turn on blink */
+}
+
+void
+a2_cls(apple2_state_t *st)
+{
+ int i;
+ for (i=0; i<24; i++) {
+ memset(st->textlines[i],0xe0,40);
+ }
+}
+
+void
+a2_clear_gr(apple2_state_t *st)
+{
+ int i;
+ for (i=0; i<24; i++) {
+ memset(st->textlines[i],0x00,40);
+ }
+}
+
+void
+a2_clear_hgr(apple2_state_t *st)
+{
+ int i;
+ for (i=0; i<192; i++) {
+ memset(st->hireslines[i],0,40);
+ }
+}
+
+void
+a2_invalidate(apple2_state_t *st)
+{
+}
+
+void
+a2_poke(apple2_state_t *st, int addr, int val)
+{
+
+ if (addr>=0x400 && addr<0x800) {
+ /* text memory */
+ int row=((addr&0x380)/0x80) + ((addr&0x7f)/0x28)*8;
+ int col=(addr&0x7f)%0x28;
+ if (row<24 && col<40) {
+ st->textlines[row][col]=val;
+ if (!(st->gr_mode&(A2_GR_HIRES)) ||
+ (!(st->gr_mode&(A2_GR_FULL)) && row>=20)) {
+ }
+ }
+ }
+ else if (addr>=0x2000 && addr<0x4000) {
+ int row=(((addr&0x1c00) / 0x400) * 1 +
+ ((addr&0x0380) / 0x80) * 8 +
+ ((addr&0x0078) / 0x28) * 64);
+ int col=((addr&0x07f)%0x28);
+ if (row<192 && col<40) {
+ st->hireslines[row][col]=val;
+ if (st->gr_mode&A2_GR_HIRES) {
+ }
+ }
+ }
+}
+
+void
+a2_hplot(apple2_state_t *st, int hcolor, int x, int y)
+{
+ int highbit,run;
+
+ highbit=((hcolor<<5)&0x80) ^ 0x80; /* capture bit 2 into bit 7 */
+
+ if (y<0 || y>=192 || x<0 || x>=280) return;
+
+ for (run=0; run<2 && x<280; run++) {
+ unsigned char *vidbyte = &st->hireslines[y][x/7];
+ unsigned char whichbit=1<<(x%7);
+ int masked_bit;
+
+ *vidbyte = (*vidbyte & 0x7f) | highbit;
+
+ /* use either bit 0 or 1 of hcolor for odd or even pixels */
+ masked_bit = (hcolor>>(1-(x&1)))&1;
+
+ /* Set whichbit to 1 or 0 depending on color */
+ *vidbyte = (*vidbyte & ~whichbit) | (masked_bit ? whichbit : 0);
+
+ x++;
+ }
+}
+
+void
+a2_hline(apple2_state_t *st, int hcolor, int x1, int y1, int x2, int y2)
+{
+ int dx,dy,incx,incy,x,y,balance;
+
+ /* Bresenham's line drawing algorithm */
+
+ if (x2>=x1) {
+ dx=x2-x1;
+ incx=1;
+ } else {
+ dx=x1-x2;
+ incx=-1;
+ }
+ if (y2>=y1) {
+ dy=y2-y1;
+ incy=1;
+ } else {
+ dy=y1-y2;
+ incy=-1;
+ }
+
+ x=x1; y=y1;
+
+ if (dx>=dy) {
+ dy*=2;
+ balance=dy-dx;
+ dx*=2;
+ while (x!=x2) {
+ a2_hplot(st, hcolor, x, y);
+ if (balance>=0) {
+ y+=incy;
+ balance-=dx;
+ }
+ balance+=dy;
+ x+=incx;
+ }
+ a2_hplot(st, hcolor, x, y);
+ } else {
+ dx*=2;
+ balance=dx-dy;
+ dy*=2;
+ while (y!=y2) {
+ a2_hplot(st, hcolor, x, y);
+ if (balance>=0) {
+ x+=incx;
+ balance-=dy;
+ }
+ balance+=dx;
+ y+=incy;
+ }
+ a2_hplot(st, hcolor, x, y);
+ }
+}
+
+void
+a2_plot(apple2_state_t *st, int color, int x, int y)
+{
+ int textrow=y/2;
+ unsigned char byte;
+
+ if (x<0 || x>=40 || y<0 || y>=48) return;
+
+ byte=st->textlines[textrow][x];
+ if (y&1) {
+ byte = (byte&0xf0) | (color&0x0f);
+ } else {
+ byte = (byte&0x0f) | ((color&0x0f)<<4);
+ }
+ st->textlines[textrow][x]=byte;
+}
+
+void
+a2_display_image_loading(apple2_state_t *st, unsigned char *image,
+ int lineno)
+{
+ /*
+ When loading images,it would normally just load the big binary
+ dump into screen memory while you watched. Because of the way
+ screen memory was laid out, it wouldn't load from the top down,
+ but in a funny interleaved way. You should call this with lineno
+ increasing from 0 thru 191 over a period of a few seconds.
+ */
+
+ int row=(((lineno / 24) % 8) * 1 +
+ ((lineno / 3 ) % 8) * 8 +
+ ((lineno / 1 ) % 3) * 64);
+
+ memcpy (st->hireslines[row], &image[row * 40], 40);
+}
+
+/*
+ Simulate plausible initial memory contents for running a program.
+*/
+void
+a2_init_memory_active(apple2_sim_t *sim)
+{
+ int i,j,x,y,c;
+ int addr=0;
+ apple2_state_t *st=sim->st;
+
+ while (addr<0x4000) {
+ int n;
+
+ switch (random()%4) {
+ case 0:
+ case 1:
+ n=random()%500;
+ for (i=0; i<n && addr<0x4000; i++) {
+ unsigned char rb=((random()%6==0 ? 0 : random()%16) |
+ ((random()%5==0 ? 0 : random()%16)<<4));
+ a2_poke(st, addr++, rb);
+ }
+ break;
+
+ case 2:
+ /* Simulate shapes stored in memory. We use the font since we have it.
+ Unreadable, since rows of each character are stored in consecutive
+ bytes. It was typical to store each of the 7 possible shifts of
+ bitmaps, for fastest blitting to the screen. */
+ x=random()%(sim->text_im->width);
+ for (i=0; i<100; i++) {
+ for (y=0; y<8; y++) {
+ c=0;
+ for (j=0; j<8; j++) {
+ c |= XGetPixel(sim->text_im, (x+j)%sim->text_im->width, y)<<j;
+ }
+ a2_poke(st, addr++, c);
+ }
+ x=(x+1)%(sim->text_im->width);
+ }
+ break;
+
+ case 3:
+ if (addr>0x2000) {
+ n=random()%200;
+ for (i=0; i<n && addr<0x4000; i++) {
+ a2_poke(st, addr++, 0);
+ }
+ }
+ break;
+
+ }
+ }
+}
+
+
+#if 1 /* jwz: since MacOS doesn't have "6x10", I dumped this font to a PNG...
+ */
+
+#include "images/gen/apple2font_png.h"
+
+static void
+a2_make_font(apple2_sim_t *sim)
+{
+ int pix_w, pix_h;
+ XWindowAttributes xgwa;
+ Pixmap m = 0;
+ Pixmap p = image_data_to_pixmap (sim->dpy, sim->window,
+ apple2font_png, sizeof(apple2font_png),
+ &pix_w, &pix_h, &m);
+ XImage *im = XGetImage (sim->dpy, p, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
+ XImage *mm = XGetImage (sim->dpy, m, 0, 0, pix_w, pix_h, 1, XYPixmap);
+ unsigned long black =
+ BlackPixelOfScreen (DefaultScreenOfDisplay (sim->dpy));
+ int x, y;
+
+ XFreePixmap (sim->dpy, p);
+ XFreePixmap (sim->dpy, m);
+ if (pix_w != 64*7) abort();
+ if (pix_h != 8) abort();
+
+ XGetWindowAttributes (sim->dpy, sim->window, &xgwa);
+ sim->text_im = XCreateImage (sim->dpy, xgwa.visual, 1, XYBitmap, 0, 0,
+ pix_w, pix_h, 8, 0);
+ sim->text_im->data = malloc (sim->text_im->bytes_per_line *
+ sim->text_im->height);
+
+ /* Convert deep image to 1 bit */
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ XPutPixel (sim->text_im, x, y,
+ (XGetPixel (mm, x, y)
+ ? XGetPixel (im, x, y) == black
+ : 0));
+
+ XDestroyImage (im);
+ XDestroyImage (mm);
+}
+
+#else /* 0 */
+
+/* This table lists fixes for characters that differ from the standard 6x10
+ font. Each encodes a pixel, as (charindex*7 + x) + (y<<10) + (value<<15)
+ where value is 0 for white and 1 for black. */
+static const unsigned short a2_fixfont[] = {
+ /* Fix $ */ 0x8421, 0x941d,
+ /* Fix % */ 0x8024, 0x0028, 0x8425, 0x0426, 0x0825, 0x1027, 0x1426, 0x9427,
+ 0x1824, 0x9828,
+ /* Fix * */ 0x8049, 0x8449, 0x8849, 0x0c47, 0x0c48, 0x0c4a, 0x0c4b, 0x9049,
+ 0x9449, 0x9849,
+ /* Fix , */ 0x9057, 0x1458, 0x9856, 0x1857, 0x1c56,
+ /* Fix . */ 0x1465, 0x1864, 0x1866, 0x1c65,
+ /* Fix / */ 0x006e, 0x186a,
+ /* Fix 0 */ 0x8874, 0x8c73, 0x9072,
+ /* Fix 1 */ 0x0878, 0x1878, 0x187c,
+ /* Fix 5 */ 0x8895, 0x0c94, 0x0c95,
+ /* Fix 6 */ 0x809f, 0x8c9c, 0x109c,
+ /* Fix 7 */ 0x8ca4, 0x0ca5, 0x90a3, 0x10a4,
+ /* Fix 9 */ 0x08b3, 0x8cb3, 0x98b0,
+ /* Fix : */ 0x04b9, 0x08b8, 0x08ba, 0x0cb9, 0x90b9, 0x14b9, 0x18b8, 0x18b9,
+ 0x18ba, 0x1cb9,
+ /* Fix ; */ 0x04c0, 0x08bf, 0x08c1, 0x0cc0, 0x90c0, 0x14c1, 0x98bf, 0x18c0,
+ 0x1cbf,
+ /* Fix < */ 0x80c8, 0x00c9, 0x84c7, 0x04c8, 0x88c6, 0x08c7, 0x8cc5, 0x0cc6,
+ 0x90c6, 0x10c7,
+ 0x94c7, 0x14c8, 0x98c8, 0x18c9,
+ /* Fix > */ 0x80d3, 0x00d4, 0x84d4, 0x04d5, 0x88d5, 0x08d6, 0x8cd6, 0x0cd7,
+ 0x90d5, 0x10d6,
+ 0x94d4, 0x14d5, 0x98d3, 0x18d4,
+ /* Fix @ */ 0x88e3, 0x08e4, 0x8ce4, 0x98e5,
+ /* Fix B */ 0x84ef, 0x04f0, 0x88ef, 0x08f0, 0x8cef, 0x90ef, 0x10f0, 0x94ef,
+ 0x14f0,
+ /* Fix D */ 0x84fd, 0x04fe, 0x88fd, 0x08fe, 0x8cfd, 0x0cfe, 0x90fd, 0x10fe,
+ 0x94fd, 0x14fe,
+ /* Fix G */ 0x8116, 0x0516, 0x9916,
+ /* Fix J */ 0x0129, 0x012a, 0x052a, 0x852b, 0x092a, 0x892b, 0x0d2a, 0x8d2b,
+ 0x112a, 0x912b,
+ 0x152a, 0x952b, 0x992a,
+ /* Fix M */ 0x853d, 0x853f, 0x093d, 0x893e, 0x093f,
+ /* Fix Q */ 0x915a, 0x155a, 0x955b, 0x155c, 0x195b, 0x995c, 0x1d5c,
+ /* Fix V */ 0x8d7b, 0x0d7c, 0x0d7e, 0x8d7f, 0x917b, 0x117c, 0x117e, 0x917f,
+ /* Fix [ */ 0x819e, 0x81a2, 0x859e, 0x899e, 0x8d9e, 0x919e, 0x959e, 0x999e,
+ 0x99a2,
+ /* Fix \ */ 0x01a5, 0x19a9,
+ /* Fix ] */ 0x81ac, 0x81b0, 0x85b0, 0x89b0, 0x8db0, 0x91b0, 0x95b0, 0x99ac,
+ 0x99b0,
+ /* Fix ^ */ 0x01b5, 0x05b4, 0x05b6, 0x09b3, 0x89b5, 0x09b7, 0x8db4, 0x8db6,
+ 0x91b3, 0x91b7,
+ /* Fix _ */ 0x9db9, 0x9dbf,
+ 0,
+};
+
+static void
+a2_make_font(apple2_sim_t *sim)
+{
+ /*
+ Generate the font. It used a 5x7 font which looks a lot like the standard X
+ 6x10 font, with a few differences. So we render up all the uppercase
+ letters of 6x10, and make a few tweaks (like putting a slash across the
+ zero) according to fixfont.
+ */
+
+ int i;
+ const char *def_font="6x10";
+ XFontStruct *font;
+ Pixmap text_pm;
+ GC gc;
+ XGCValues gcv;
+
+ font = load_font_retry (sim->dpy, def_font);
+ if (!font) {
+ fprintf(stderr, "%s: can't load font %s\n", progname, def_font);
+ abort();
+ }
+
+ text_pm=XCreatePixmap(sim->dpy, sim->window, 64*7, 8, 1);
+
+ memset(&gcv, 0, sizeof(gcv));
+ gcv.foreground=1;
+ gcv.background=0;
+ gcv.font=font->fid;
+ gc=XCreateGC(sim->dpy, text_pm, GCFont|GCBackground|GCForeground, &gcv);
+
+ XSetForeground(sim->dpy, gc, 0);
+ XFillRectangle(sim->dpy, text_pm, gc, 0, 0, 64*7, 8);
+ XSetForeground(sim->dpy, gc, 1);
+ for (i=0; i<64; i++) {
+ char c=32+i;
+ int x=7*i+1;
+ int y=7;
+ if (c=='0') {
+ c='O';
+ XDrawString(sim->dpy, text_pm, gc, x, y, &c, 1);
+ } else {
+ XDrawString(sim->dpy, text_pm, gc, x, y, &c, 1);
+ }
+ }
+
+# if 0
+ for (i=0; a2_fixfont[i]; i++) {
+ XSetForeground (sim->dpy, gc, (a2_fixfont[i]>>15)&1);
+ XDrawPoint(sim->dpy, text_pm, gc, a2_fixfont[i]&0x3ff,
+ (a2_fixfont[i]>>10)&0xf);
+ }
+ XWriteBitmapFile(sim->dpy, "/tmp/a2font.xbm", text_pm, 64*7, 8, -1, -1);
+# endif
+
+ sim->text_im = XGetImage(sim->dpy, text_pm, 0, 0, 64*7, 8, ~0L, ZPixmap);
+ XFreeGC(sim->dpy, gc);
+ XFreePixmap(sim->dpy, text_pm);
+
+ for (i=0; a2_fixfont[i]; i++) {
+ XPutPixel(sim->text_im, a2_fixfont[i]&0x3ff,
+ (a2_fixfont[i]>>10)&0xf,
+ (a2_fixfont[i]>>15)&1);
+ }
+}
+
+#endif /* 0 */
+
+apple2_sim_t *
+apple2_start(Display *dpy, Window window, int delay,
+ void (*controller)(apple2_sim_t *sim,
+ int *stepno,
+ double *next_actiontime))
+{
+ apple2_sim_t *sim;
+
+ sim=(apple2_sim_t *)calloc(1,sizeof(apple2_sim_t));
+ sim->dpy = dpy;
+ sim->window = window;
+ sim->delay = delay;
+ sim->controller = controller;
+
+ sim->st = (apple2_state_t *)calloc(1,sizeof(apple2_state_t));
+ sim->dec = analogtv_allocate(dpy, window);
+ sim->inp = analogtv_input_allocate();
+
+ sim->reception.input = sim->inp;
+ sim->reception.level = 1.0;
+
+ sim->prompt=']';
+
+ if (random()%4==0 && !sim->dec->use_cmap && sim->dec->use_color && sim->dec->visbits>=8) {
+ sim->dec->flutter_tint=1;
+ }
+ else if (random()%3==0) {
+ sim->dec->flutter_horiz_desync=1;
+ }
+ sim->typing_rate = 1.0;
+
+ analogtv_set_defaults(sim->dec, "");
+ sim->dec->squish_control=0.05;
+ analogtv_setup_sync(sim->inp, 1, 0);
+
+
+ a2_make_font(sim);
+
+ sim->stepno=0;
+ a2_goto(sim->st,23,0);
+
+ if (random()%2==0) sim->basetime_tv.tv_sec -= 1; /* random blink phase */
+ sim->next_actiontime=0.0;
+
+ sim->curtime=0.0;
+ sim->next_actiontime=sim->curtime;
+ sim->controller (sim, &sim->stepno, &sim->next_actiontime);
+
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&sim->basetime_tv, NULL);
+# else
+ gettimeofday(&sim->basetime_tv);
+# endif
+
+ return sim;
+}
+
+int
+apple2_one_frame (apple2_sim_t *sim)
+{
+ double blinkphase;
+ int i;
+ int textrow;
+
+ if (sim->stepno==A2CONTROLLER_DONE)
+ goto DONE; /* when caller says we're done, be done, dammit! */
+
+ {
+ struct timeval curtime_tv;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&curtime_tv, &tzp);
+# else
+ gettimeofday(&curtime_tv);
+# endif
+ sim->curtime=(curtime_tv.tv_sec - sim->basetime_tv.tv_sec) +
+ 0.000001*(curtime_tv.tv_usec - sim->basetime_tv.tv_usec);
+ if (sim->curtime > sim->dec->powerup)
+ sim->dec->powerup=sim->curtime;
+ }
+
+ blinkphase=sim->curtime/0.8;
+
+ /* The blinking rate was controlled by 555 timer with a resistor/capacitor
+ time constant. Because the capacitor was electrolytic, the flash rate
+ varied somewhat between machines. I'm guessing 1.6 seconds/cycle was
+ reasonable. (I soldered a resistor in mine to make it blink faster.) */
+ i=sim->st->blink;
+ sim->st->blink=((int)blinkphase)&1;
+ if (sim->st->blink!=i && !(sim->st->gr_mode&A2_GR_FULL)) {
+ int downcounter=0;
+ /* For every row with blinking text, set the changed flag. This basically
+ works great except with random screen garbage in text mode, when we
+ end up redrawing the whole screen every second */
+ int row, col;
+ for (row=(sim->st->gr_mode ? 20 : 0); row<24; row++) {
+ for (col=0; col<40; col++) {
+ int c=sim->st->textlines[row][col];
+ if ((c & 0xc0) == 0x40) {
+ downcounter=4;
+ break;
+ }
+ }
+ if (downcounter>0) {
+ downcounter--;
+ }
+ }
+ }
+
+ if (sim->curtime >= sim->delay)
+ sim->stepno = A2CONTROLLER_DONE;
+
+ if (sim->printing) {
+ int nlcnt=0;
+ while (*sim->printing) {
+ if (*sim->printing=='\001') { /* pause */
+ sim->printing++;
+ break;
+ }
+ else if (*sim->printing=='\n') {
+ a2_printc(sim->st,*sim->printing);
+ sim->printing++;
+ nlcnt++;
+ if (nlcnt>=2) break;
+ }
+ else {
+ a2_printc(sim->st,*sim->printing);
+ sim->printing++;
+ }
+ }
+ if (!*sim->printing) sim->printing=NULL;
+ }
+ else if (sim->curtime >= sim->next_actiontime) {
+ if (sim->typing) {
+
+ int c;
+ /* If we're in the midst of typing a string, emit a character with
+ random timing. */
+ c =*sim->typing;
+ if (c==0) {
+ sim->typing=NULL;
+ }
+ else {
+ sim->typing++;
+ a2_printc(sim->st, c);
+ if (c=='\r' || c=='\n') {
+ sim->next_actiontime = sim->curtime;
+ }
+ else if (c==010) {
+ sim->next_actiontime = sim->curtime + 0.1;
+ }
+ else {
+ sim->next_actiontime = (sim->curtime +
+ (((random()%1000)*0.001 + 0.3) *
+ sim->typing_rate));
+ }
+ }
+ } else {
+ sim->next_actiontime = sim->curtime;
+
+ sim->controller (sim, &sim->stepno, &sim->next_actiontime);
+
+ if (sim->stepno==A2CONTROLLER_DONE) {
+
+ DONE:
+ sim->stepno=A2CONTROLLER_FREE;
+ sim->controller (sim, &sim->stepno, &sim->next_actiontime);
+ /* if stepno is changed, return 1 */
+ if (sim->stepno != A2CONTROLLER_FREE)
+ return 1;
+
+ XClearWindow(sim->dpy, sim->window);
+
+ /* free sim */
+ /* This is from a2_make_font */
+ free(sim->text_im->data);
+ sim->text_im->data = 0;
+ XDestroyImage(sim->text_im);
+
+ /* And free else */
+ analogtv_release(sim->dec);
+ free(sim->st);
+ free(sim->inp);
+ free(sim);
+
+ return 0;
+ }
+
+ }
+ }
+
+
+ analogtv_setup_sync(sim->inp, sim->st->gr_mode? 1 : 0, 0);
+ analogtv_setup_frame(sim->dec);
+
+ for (textrow=0; textrow<24; textrow++) {
+ int row;
+ for (row=textrow*8; row<textrow*8+8; row++) {
+
+ /* First we generate the pattern that the video circuitry shifts out
+ of memory. It has a 14.something MHz dot clock, equal to 4 times
+ the color burst frequency. So each group of 4 bits defines a color.
+ Each character position, or byte in hires, defines 14 dots, so odd
+ and even bytes have different color spaces. So, pattern[0..600]
+ gets the dots for one scan line. */
+
+ signed char *pp=&sim->inp->signal[row+ANALOGTV_TOP+4][ANALOGTV_PIC_START+100];
+
+ if ((sim->st->gr_mode&A2_GR_HIRES) &&
+ (row<160 || (sim->st->gr_mode&A2_GR_FULL))) {
+ int col;
+
+ /* Emulate the mysterious pink line, due to a bit getting
+ stuck in a shift register between the end of the last
+ row and the beginning of this one. */
+ if ((sim->st->hireslines[row][0] & 0x80) &&
+ (sim->st->hireslines[row][39]&0x40)) {
+ pp[-1]=ANALOGTV_WHITE_LEVEL;
+ }
+
+ for (col=0; col<40; col++) {
+ unsigned char b=sim->st->hireslines[row][col];
+ int shift=(b&0x80)?0:1;
+
+ /* Each of the low 7 bits in hires mode corresponded to 2 dot
+ clocks, shifted by one if the high bit was set. */
+ for (i=0; i<7; i++) {
+ pp[shift+1] = pp[shift] = (((b>>i)&1)
+ ?ANALOGTV_WHITE_LEVEL
+ :ANALOGTV_BLACK_LEVEL);
+ pp+=2;
+ }
+ }
+ }
+ else if ((sim->st->gr_mode&A2_GR_LORES) &&
+ (row<160 || (sim->st->gr_mode&A2_GR_FULL))) {
+ int col;
+ for (col=0; col<40; col++) {
+ unsigned char nib=((sim->st->textlines[textrow][col] >> (((row/4)&1)*4))
+ & 0xf);
+ /* The low or high nybble was shifted out one bit at a time. */
+ for (i=0; i<14; i++) {
+ *pp = (((nib>>((col*14+i)&3))&1)
+ ?ANALOGTV_WHITE_LEVEL
+ :ANALOGTV_BLACK_LEVEL);
+ pp++;
+ }
+ }
+ }
+ else {
+ int col;
+ for (col=0; col<40; col++) {
+ int rev;
+ int c=sim->st->textlines[textrow][col]&0xff;
+ /* hi bits control inverse/blink as follows:
+ 0x00: inverse
+ 0x40: blink
+ 0x80: normal
+ 0xc0: normal */
+ rev=!(c&0x80) && (!(c&0x40) || sim->st->blink);
+
+ for (i=0; i<7; i++) {
+ unsigned long pix=XGetPixel(sim->text_im,
+ ((c&0x3f)^0x20)*7+i,
+ row%8);
+ pp[1] = pp[2] = ((pix^rev)
+ ?ANALOGTV_WHITE_LEVEL
+ :ANALOGTV_BLACK_LEVEL);
+ pp+=2;
+ }
+ }
+ }
+ }
+ }
+ analogtv_reception_update(&sim->reception);
+ {
+ const analogtv_reception *rec = &sim->reception;
+ analogtv_draw(sim->dec, 0.02, &rec, 1);
+ }
+
+ return 1;
+}
+
+
+#if 0
+void
+a2controller_test(apple2_sim_t *sim, int *stepno, double *next_actiontime)
+{
+ int row,col;
+
+ switch(*stepno) {
+ case 0:
+ a2_invalidate(sim->st);
+ /*
+ For testing color rendering. The spec is:
+ red grn blu
+ 0 black 0 0 0
+ 1 red 227 30 96
+ 2 dk blue 96 78 189
+ 3 purple 255 68 253
+ 4 dk green 0 163 96
+ 5 gray 156 156 156
+ 6 med blue 20 207 253
+ 7 lt blue 208 195 255
+ 8 brown 96 114 3
+ 9 orange 255 106 60
+ 10 grey 156 156 156
+ 11 pink 255 160 208
+ 12 lt green 20 245 60
+ 13 yellow 208 221 141
+ 14 aqua 114 255 208
+ 15 white 255 255 255
+ */
+ sim->st->gr_mode=A2_GR_LORES;
+ for (row=0; row<24; row++) {
+ for (col=0; col<40; col++) {
+ sim->st->textlines[row][col]=(row&15)*17;
+ }
+ }
+ *next_actiontime+=0.4;
+ *stepno=99;
+ break;
+
+ case 99:
+ if (sim->curtime > 10) *stepno=-1;
+ break;
+ }
+}
+#endif
diff --git a/hacks/apple2.h b/hacks/apple2.h
new file mode 100644
index 0000000..87f18a9
--- /dev/null
+++ b/hacks/apple2.h
@@ -0,0 +1,121 @@
+/* xscreensaver, Copyright (c) 1998-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
+ * with additional work by Jamie Zawinski <jwz@jwz.org>
+ */
+
+#ifndef __XSCREENSAVER_APPLE_II__
+#define __XSCREENSAVER_APPLE_II__
+
+#include "analogtv.h"
+
+typedef struct apple2_state {
+ unsigned char hireslines[192][40];
+ unsigned char textlines[24][40];
+ int gr_text;
+ enum {
+ A2_GR_FULL=1,
+ A2_GR_LORES=2,
+ A2_GR_HIRES=4
+ } gr_mode;
+ int cursx;
+ int cursy;
+ int blink;
+
+} apple2_state_t;
+
+
+typedef struct apple2_sim_s apple2_sim_t;
+struct apple2_sim_s {
+
+ void *controller_data;
+
+ apple2_state_t *st;
+
+ analogtv *dec;
+ analogtv_input *inp;
+ analogtv_reception reception;
+
+ const char *typing;
+ char typing_buf[1024];
+ double typing_rate;
+
+ char *printing;
+ char printing_buf[1024];
+
+ char prompt;
+
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ XImage *text_im;
+
+ struct timeval basetime_tv;
+ double curtime;
+ double delay;
+
+ int stepno;
+ double next_actiontime;
+ void (*controller)(apple2_sim_t *sim,
+ int *stepno,
+ double *next_actiontime);
+
+};
+
+
+enum {
+ A2_HCOLOR_BLACK=0,
+ A2_HCOLOR_GREEN=1,
+ A2_HCOLOR_PURPLE=2,
+ A2_HCOLOR_WHITE=3,
+ A2_HCOLOR_ALTBLACK=4,
+ A2_HCOLOR_RED=5,
+ A2_HCOLOR_BLUE=6,
+ A2_HCOLOR_ALTWHITE=7
+ };
+
+enum {
+ A2CONTROLLER_DONE=-1,
+ A2CONTROLLER_FREE=-2
+};
+
+
+extern apple2_sim_t * apple2_start (Display *, Window, int delay,
+ void (*)(apple2_sim_t *, int *stepno,
+ double *next_actiontime));
+extern int apple2_one_frame (apple2_sim_t *);
+
+
+void a2_poke(apple2_state_t *st, int addr, int val);
+void a2_goto(apple2_state_t *st, int r, int c);
+void a2_cls(apple2_state_t *st);
+void a2_invalidate(apple2_state_t *st);
+
+void a2_add_disk_item(apple2_state_t *st, char *name, unsigned char *data,
+ int len, char type);
+void a2_scroll(apple2_state_t *st);
+void a2_printc(apple2_state_t *st, char c);
+void a2_printc_noscroll(apple2_state_t *st, char c);
+void a2_prints(apple2_state_t *st, char *s);
+void a2_goto(apple2_state_t *st, int r, int c);
+void a2_cls(apple2_state_t *st);
+void a2_clear_hgr(apple2_state_t *st);
+void a2_clear_gr(apple2_state_t *st);
+void a2_invalidate(apple2_state_t *st);
+void a2_poke(apple2_state_t *st, int addr, int val);
+void a2_display_image_loading(apple2_state_t *st, unsigned char *image,
+ int lineno);
+void a2_init_memory_active(apple2_sim_t *sim);
+void a2_hplot(apple2_state_t *st, int hcolor, int x, int y);
+void a2_hline(apple2_state_t *st, int hcolor, int x1, int y1, int x2, int y2);
+void a2_plot(apple2_state_t *st, int color, int x, int y);
+
+#endif /* __XSCREENSAVER_APPLE_II__ */
diff --git a/hacks/apple2.man b/hacks/apple2.man
new file mode 100644
index 0000000..b0d6d5c
--- /dev/null
+++ b/hacks/apple2.man
@@ -0,0 +1,206 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+apple2 - Apple ][ display emulator
+.SH SYNOPSIS
+.B apple2
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-program \fIcommand to run\fP]
+[\-basic] [\-slideshow] [\-text]
+[\-meta] [\-esc] [\-bs] [\-del] [\-fast]
+[\-fps]
+.SH DESCRIPTION
+The
+.I apple2
+program simulates an original Apple ][ Plus computer in all its 1979
+glory. It also reproduces the appearance of display on a color
+television set of the period.
+.PP
+There are 3 modes: basic, slideshow, and text. Normally it chooses a
+mode randomly, but you can override with the \fI\-basic\fP,
+\fI\-slideshow\fP, or \fI\-text\fP options.
+
+In basic mode a simulated user types in a Basic program and runs it.
+
+In slideshow mode it chooses a number of images from the image source
+you configured into XScreenSaver and displays them within the
+limitations of the Apple ][ display hardware. With only 6 available
+colors, you can only make out the general shape of the pictures.
+
+In text mode it displays the output of a command or the contents of
+a file or URL (via the default
+.BR xscreensaver-text (1)
+program, which can be overridden with \fI\-program\fP).
+
+In text mode, it is also a fully functional (if anachronistic)
+vt100 terminal emulator.
+.SH OPTIONS
+.I apple2
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-basic
+Choose basic mode
+.TP 8
+.B \-slideshow
+Choose slideshow mode
+.TP 8
+.B \-text
+Choose text mode
+.TP 8
+.B \-program \fIsh-command\fP
+In text mode, the command to run to generate the text to display. This
+option may be any string acceptable to /bin/sh. The program will be
+run at the end of a pipe, and any characters that it prints to
+\fIstdout\fP will be printed on the Apple ][ display. If the program
+exits, it will be launched again after 3 seconds. Default:
+.BR xscreensaver-text (1).
+
+In text mode, \fIapple2\fP emulates a vt100 terminal running on a 40x24
+uppercase-only screen.
+
+For example:
+.EX
+apple2 -text \\
+ -program 'cat /usr/src/linux*/README | fold -sw40'
+apple2 -text -program 'ping apple.com'
+apple2 -text -program 'ps -e'
+apple2 -text -program 'od -txCz -w7 /dev/urandom'
+apple2 -text -program 'cat /dev/random'
+apple2 -text -fast -program 'xemacs -nw -q -f life'
+apple2 -text -fast \\
+ -program 'xemacs -nw -q --eval "(hanoi 5)"'
+.EE
+You can also use \fIapple2\fP as an extremely lo-fi replacement for the
+.BR xterm (1)
+and
+.BR gnome-terminal (1)
+terminal emulators:
+.EX
+apple2 -text -fast -program tcsh
+.EE
+.TP 8
+.B \-pty
+In \fI\-text\fP mode, launch the sub-program under a pty so that it
+can address the screen directly. This is the default.
+.TP 8
+.B \-pipe
+In \fI\-text\fP mode, launch the sub-program at the end of a pipe:
+do not let it address the screen directly.
+.TP 8
+.B \-esc
+When the user types a key with the Alt or Meta keys held down, send an
+ESC character first. This is the default.
+.TP 8
+.B \-meta
+When Meta or Alt are held down, set the high bit on the character instead.
+.TP 8
+.B \-del
+Swap Backspace and Delete. This is the default.
+.TP 8
+.B \-bs
+Do not swap Backspace and Delete.
+.TP 8
+.B \-fast
+Normally, characters are printed at the speed of an original Apple][
+computer; however, when using this program as a terminal emulator,
+the novelty of those 300 baud characters might wear off. You can use
+the \fI\-fast\fP option to speed things up a bit.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH TERMINAL EMULATION
+By default, \fIapple2\fP allocates a pseudo-tty for the \fI\-text\fP-mode
+sub-process to run under. This has the desirable side effect that the
+program will be able to use
+.BR ioctl (2)
+to fetch information about terminal parameters and window size, which
+many programs (such as
+.BR top (1))
+need to run properly. \fIapple2\fP will also set the environment
+variable \fITERM\fP to \fIvt100\fP in the child process.
+
+Any characters typed on the apple2 window will be passed along to
+the sub-process. (Note that this only works when running in "window"
+mode, not when running in \fI\-root\fP mode under xscreensaver.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.TP 8
+.B TERM
+to inform the sub-process of the type of terminal emulation.
+.SH X RESOURCES
+Notable X resources supported include the following which correspond
+to standard TV controls:
+.BR analogTVTint ,
+.BR analogTVColor ,
+.BR analogTVBrightness ,
+and
+.BR analogTVContrast
+which correspond to standard TV controls. They range from 0 to
+100,except for tint which is an angle between -180 and +180.
+.SH TRADEMARKS
+Apple ][ and Applesoft are trademarks of Apple Computer.
+
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR bsod (MANSUFFIX),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek ,
+.BR console_codes (4).
+.SH COPYRIGHT
+Copyright \(co 2002-2003 by Trevor Blackwell. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Television and Apple ][ emulation by Trevor Blackwell <tlb@tlb.org>.
+Slideshow and text mode by Jamie Zawinski <jwz@jwz.org>.
+Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>.
diff --git a/hacks/asm6502.c b/hacks/asm6502.c
new file mode 100644
index 0000000..27d2824
--- /dev/null
+++ b/hacks/asm6502.c
@@ -0,0 +1,2275 @@
+/*-*- indent-tabs-mode:nil -*- */
+/* Copyright (C) 2007 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 12-April-2007
+ */
+
+/*
+ This is a port of the javascript 6502 assembler, compiler and
+ debugger. The orignal code was copyright 2006 by Stian Soreng -
+ www.6502asm.com
+
+ I changed the structure of the assembler in this version.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+/*#include <malloc.h>*/
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+#include <math.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+#include <unistd.h>
+
+#include "yarandom.h"
+#include "asm6502.h"
+
+/*#ifdef DEBUGGER
+# define random rand
+#endif*/
+
+#ifndef HAVE_MOBILE
+# define READ_FILES
+#endif
+
+typedef enum{
+ LEFT, RIGHT
+ } Side;
+
+/*
+
+Bit Flags
+ _ _ _ _ _ _ _ _
+ |N||V||F||B||D||I||Z||C|
+ - - - - - - - -
+ 7 6 5 4 3 2 1 0
+
+*/
+
+typedef enum{
+ CARRY_FL = 0, ZERO_FL = 1, INTERRUPT_FL = 2,
+ DECIMAL_FL = 3, BREAK_FL = 4, FUTURE_FL = 5,
+ OVERFLOW_FL = 6, NEGATIVE_FL = 7
+ } Flags;
+
+
+typedef BOOL (*CharTest) (char);
+
+/* A jump function takes a pointer to the current machine and a
+ opcode. The opcode is needed to figure out the memory mode. */
+/*typedef void (*JumpFunc) (machine_6502* AddrMode);*/
+
+typedef struct {
+ m6502_AddrMode type;
+ Bit32 value[MAX_PARAM_VALUE];
+ unsigned int vp; /*value pointer, index into the value table.*/
+ char *label;
+ Bit32 lbladdr;
+} Param;
+
+typedef struct {
+ Bit32 addr; /* Address of the label */
+ char *label;
+} Label;
+
+typedef struct AsmLine AsmLine;
+struct AsmLine {
+ BOOL labelDecl; /* Does the line have a label declaration? */
+ Label *label;
+ char *command;
+ Param *param;
+ AsmLine *next; /* in list */
+};
+
+typedef struct {
+ Bit16 addr;
+ Bit16 value;
+} Pointer;
+
+
+/*static void *emalloc(size_t n) {
+ void *p = malloc(n);
+ if (! p) abort();
+ return p;
+}*/
+
+static void *ecalloc(uint32_t nelm, size_t nsize){
+ void *p = calloc(nelm, nsize);
+ if (!p) abort();
+ return p;
+}
+
+/* estrdup() - Allocates memory for a new string a returns a copy of the source sting in it. */
+static char *estrdup(const char *source){
+ int ln = strlen(source) + 1;
+ char *s = ecalloc(ln, sizeof(char));
+ strncpy(s,source,ln);
+ return s;
+}
+
+static void checkAddress(Bit32 address){
+ /* XXX: Do we want to kill the program here? */
+ if (address >= MEM_64K)
+ fprintf(stderr, "Address %d is beyond 64k", address);
+}
+
+/*
+ * stackPush() - Push byte to stack
+ *
+ */
+
+static void stackPush(machine_6502 *machine, Bit8 value ) {
+ if(machine->regSP >= STACK_BOTTOM){
+ machine->memory[machine->regSP--] = value;
+ }
+ else{
+ fprintf(stderr, "The stack is full: %.4x\n", machine->regSP);
+ machine->codeRunning = FALSE;
+ }
+}
+
+
+/*
+ * stackPop() - Pop byte from stack
+ *
+ */
+
+static Bit8 stackPop(machine_6502 *machine) {
+ if (machine->regSP < STACK_TOP){
+ Bit8 value =machine->memory[++machine->regSP];
+ return value;
+ }
+ else {
+ /* fprintf(stderr, "The stack is empty.\n"); xxx */
+ machine->codeRunning = FALSE;
+ return 0;
+ }
+}
+
+static void pushByte(machine_6502 *machine, Bit32 value ) {
+ Bit32 address = machine->defaultCodePC;
+ checkAddress(address);
+ machine->memory[address] = value & 0xff;
+ machine->codeLen++;
+ machine->defaultCodePC++;
+}
+
+/*
+ * pushWord() - Push a word using pushByte twice
+ *
+ */
+
+static void pushWord(machine_6502 *machine, Bit16 value ) {
+ pushByte(machine, value & 0xff );
+ pushByte(machine, (value>>8) & 0xff );
+}
+
+/*
+ * popByte( machine_6502 *machine,) - Pops a byte
+ *
+ */
+
+static Bit8 popByte( machine_6502 *machine) {
+ Bit8 value = machine->memory[machine->regPC];
+ machine->regPC++;
+ return value;
+}
+
+/*
+ * popWord() - Pops a word using popByte() twice
+ *
+ */
+
+static int popWord(machine_6502 *machine) {
+ return popByte(machine) + (popByte(machine) << 8);
+}
+
+
+/*
+ * memReadByte() - Peek a byte, don't touch any registers
+ *
+ */
+
+static int memReadByte( machine_6502 *machine, int addr ) {
+ if( addr == 0xfe ) return floor( random()%255 );
+ return machine->memory[addr];
+}
+
+static void updateDisplayPixel(machine_6502 *machine, Bit16 addr){
+ Bit8 idx = memReadByte(machine,addr) & 0x0f;
+ Bit8 x,y;
+ addr -= 0x200;
+ x = addr & 0x1f;
+ y = (addr >> 5);
+ if (machine->plot) {
+ machine->plot(x,y,idx,machine->plotterState);
+ }
+}
+
+/*
+ * memStoreByte() - Poke a byte, don't touch any registers
+ *
+ */
+
+static void memStoreByte( machine_6502 *machine, int addr, int value ) {
+ machine->memory[ addr ] = (value & 0xff);
+ if( (addr >= 0x200) && (addr<=0x5ff) )
+ updateDisplayPixel(machine, addr );
+}
+
+
+
+/* EMULATION CODE */
+
+static Bit8 bitOn(Bit8 value,Flags bit){
+ Bit8 mask = 1;
+ mask = mask << bit;
+ return ((value & mask) > 0);
+}
+
+static Bit8 bitOff(Bit8 value, Flags bit){
+ return (! bitOn(value,bit));
+}
+
+static Bit8 setBit(Bit8 value, Flags bit, int on){
+ Bit8 onMask = 1;
+ Bit8 offMask = 0xff;
+ onMask = onMask << bit;
+ offMask = offMask ^ onMask;
+ return ((on) ? value | onMask : value & offMask);
+}
+
+static Bit8 nibble(Bit8 value, Side side){
+ switch(side){
+ case LEFT: return value & 0xf0;
+ case RIGHT: return value & 0xf;
+ default:
+ fprintf(stderr,"nibble unknown side\n");
+ return 0;
+ }
+}
+
+
+/* used for tracing. XXX: combined with function getvalue */
+static BOOL peekValue(machine_6502 *machine, m6502_AddrMode adm, Pointer *pointer, Bit16 PC){
+ Bit8 zp;
+ pointer->value = 0;
+ pointer->addr = 0;
+ switch(adm){
+ case SINGLE:
+ return FALSE;
+ case IMMEDIATE_LESS:
+ case IMMEDIATE_GREAT:
+ case IMMEDIATE_VALUE:
+ pointer->value = memReadByte(machine, PC);
+ return TRUE;
+ case INDIRECT_X:
+ zp = memReadByte(machine, PC) + machine->regX;
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case INDIRECT_Y:
+ zp = memReadByte(machine, PC);
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO:
+ pointer->addr = memReadByte(machine, PC);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_X:
+ pointer->addr = memReadByte(machine, PC) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_Y:
+ pointer->addr = memReadByte(machine, PC) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_OR_BRANCH:
+ pointer->addr = memReadByte(machine, PC);
+ return TRUE;
+ case ABS_VALUE:
+ pointer->addr = memReadByte(machine, PC) + (memReadByte(machine, PC+1) << 8);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_X:
+ case ABS_X:
+ pointer->addr = (memReadByte(machine, PC) +
+ (memReadByte(machine, PC+1) << 8)) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_Y:
+ case ABS_Y:
+ pointer->addr = (memReadByte(machine, PC) +
+ (memReadByte(machine, PC+1) << 8)) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case DCB_PARAM:
+ /* Handled elsewhere */
+ break;
+ }
+ return FALSE;
+
+}
+
+
+/* Figure out how to get the value from the addrmode and get it.*/
+static BOOL getValue(machine_6502 *machine, m6502_AddrMode adm, Pointer *pointer){
+ Bit8 zp;
+ pointer->value = 0;
+ pointer->addr = 0;
+ switch(adm){
+ case SINGLE:
+ return FALSE;
+ case IMMEDIATE_LESS:
+ case IMMEDIATE_GREAT:
+ case IMMEDIATE_VALUE:
+ pointer->value = popByte(machine);
+ return TRUE;
+ case INDIRECT_X:
+ zp = popByte(machine) + machine->regX;
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case INDIRECT_Y:
+ zp = popByte(machine);
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO:
+ pointer->addr = popByte(machine);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_X:
+ pointer->addr = popByte(machine) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_Y:
+ pointer->addr = popByte(machine) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_OR_BRANCH:
+ pointer->addr = popByte(machine);
+ return TRUE;
+ case ABS_VALUE:
+ pointer->addr = popWord(machine);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_X:
+ case ABS_X:
+ pointer->addr = popWord(machine) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_Y:
+ case ABS_Y:
+ pointer->addr = popWord(machine) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case DCB_PARAM:
+ /* Handled elsewhere */
+ break;
+ }
+ return FALSE;
+
+}
+
+#if 0
+static void dismem(machine_6502 *machine, m6502_AddrMode adm, char *output){
+ Bit8 zp;
+ Bit16 n;
+ switch(adm){
+ case SINGLE:
+ *output = 0;
+ break;
+ case IMMEDIATE_LESS:
+ case IMMEDIATE_GREAT:
+ case IMMEDIATE_VALUE:
+ n = popByte(machine);
+ sprintf(output,"#$%x",n);
+ break;
+ case INDIRECT_X:
+ zp = popByte(machine);
+ n = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ sprintf(output,"($%x,x)",n);
+ break;
+ case INDIRECT_Y:
+ zp = popByte(machine);
+ n = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ sprintf(output,"($%x),y",n);
+ break;
+ case ABS_OR_BRANCH:
+ case ZERO:
+ n = popByte(machine);
+ sprintf(output,"$%x",n);
+ break;
+ case ZERO_X:
+ n = popByte(machine);
+ sprintf(output,"$%x,x",n);
+ break;
+ case ZERO_Y:
+ n = popByte(machine);
+ sprintf(output,"$%x,y",n);
+ break;
+ case ABS_VALUE:
+ n = popWord(machine);
+ sprintf(output,"$%x",n);
+ break;
+ case ABS_LABEL_X:
+ case ABS_X:
+ n = popWord(machine);
+ sprintf(output,"$%x,x",n);
+ break;
+ case ABS_LABEL_Y:
+ case ABS_Y:
+ n = popWord(machine);
+ sprintf(output,"$%x,x",n);
+ break;
+ case DCB_PARAM:
+ *output = 0;
+ break;
+ }
+}
+#endif
+
+/* manZeroNeg - Manage the negative and zero flags */
+static void manZeroNeg(machine_6502 *machine, Bit8 value){
+ machine->regP = setBit(machine->regP, ZERO_FL, (value == 0));
+ machine->regP = setBit(machine->regP, NEGATIVE_FL, bitOn(value,NEGATIVE_FL));
+}
+
+static void warnValue(BOOL isValue){
+ if (! isValue){
+ fprintf(stderr,"Invalid Value from getValue.\n");
+ }
+}
+
+static void jmpADC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ Bit16 tmp;
+ Bit8 c = bitOn(machine->regP, CARRY_FL);
+ BOOL isValue = getValue(machine, adm, &ptr);
+
+ warnValue(isValue);
+
+ if (bitOn(machine->regA, NEGATIVE_FL) &&
+ bitOn(ptr.value, NEGATIVE_FL))
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ else
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 1);
+
+ if (bitOn(machine->regP, DECIMAL_FL)) {
+ tmp = nibble(machine->regA,RIGHT) + nibble(ptr.value,RIGHT ) + c;
+ /* The decimal part is limited to 0 through 9 */
+ if (tmp >= 10){
+ tmp = 0x10 | ((tmp + 6) & 0xf);
+ }
+ tmp += nibble(machine->regA,LEFT) + nibble(ptr.value,LEFT);
+ if (tmp >= 160){
+ machine->regP = setBit(machine->regP,CARRY_FL,1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp >= 0x180)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ tmp += 0x60;
+ }
+ else {
+ machine->regP = setBit(machine->regP,CARRY_FL,0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp < 0x80)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ } /* end decimal */
+ else {
+ tmp = machine->regA + ptr.value + c;
+ if ( tmp >= 0x100 ){
+ machine->regP = setBit(machine->regP,CARRY_FL,1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp >= 0x180)
+ machine->regP =setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ else {
+ machine->regP = setBit(machine->regP,CARRY_FL,0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp < 0x80)
+ machine->regP =setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ }
+
+ machine->regA = tmp;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpAND(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA &= ptr.value;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpASL(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue){
+ machine->regP = setBit(machine->regP, CARRY_FL, bitOn(ptr.value, NEGATIVE_FL));
+ ptr.value = ptr.value << 1;
+ ptr.value = setBit(ptr.value, CARRY_FL, 0);
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine,ptr.value);
+ }
+ else { /* Accumulator */
+ machine->regP = setBit(machine->regP, CARRY_FL, bitOn(machine->regA, NEGATIVE_FL));
+ machine->regA = machine->regA << 1;
+ machine->regA = setBit(machine->regA, CARRY_FL, 0);
+ manZeroNeg(machine,machine->regA);
+ }
+
+}
+
+static void jmpBIT(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regP = setBit(machine->regP, ZERO_FL, !(ptr.value & machine->regA));
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, bitOn(ptr.value, OVERFLOW_FL));
+ machine->regP = setBit(machine->regP, NEGATIVE_FL, bitOn(ptr.value, NEGATIVE_FL));
+
+}
+
+static void jumpBranch(machine_6502 *machine, Bit16 offset){
+ if ( offset > 0x7f )
+ machine->regPC = machine->regPC - (0x100 - offset);
+ else
+ machine->regPC = machine->regPC + offset;
+}
+
+static void jmpBPL(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP,NEGATIVE_FL))
+ jumpBranch(machine, ptr.addr);
+
+}
+
+static void jmpBMI(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP,NEGATIVE_FL))
+ jumpBranch(machine, ptr.addr);
+
+}
+
+static void jmpBVC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP,OVERFLOW_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBVS(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP,OVERFLOW_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBCC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP,CARRY_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBCS(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP,CARRY_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBNE(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP, ZERO_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBEQ(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP, ZERO_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void doCompare(machine_6502 *machine, Bit16 reg, Pointer *ptr){
+ machine->regP = setBit(machine->regP,CARRY_FL, ((reg + ptr->value) > 0xff));
+ manZeroNeg(machine,(reg - ptr->value));
+}
+
+static void jmpCMP(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ doCompare(machine,machine->regA,&ptr);
+}
+
+static void jmpCPX(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ doCompare(machine,machine->regX,&ptr);
+}
+
+static void jmpCPY(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ doCompare(machine,machine->regY,&ptr);
+}
+
+static void jmpDEC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (ptr.value > 0)
+ ptr.value--;
+ else
+ ptr.value = 0xFF;
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine,ptr.value);
+}
+
+static void jmpEOR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA ^= ptr.value;
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpCLC(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, CARRY_FL, 0);
+}
+
+static void jmpSEC(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, CARRY_FL, 1);
+}
+
+static void jmpCLI(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, INTERRUPT_FL, 0);
+}
+
+static void jmpSEI(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, INTERRUPT_FL, 1);
+}
+
+static void jmpCLV(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+}
+
+static void jmpCLD(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, DECIMAL_FL, 0);
+}
+
+static void jmpSED(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, DECIMAL_FL, 1);
+}
+
+static void jmpINC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ ptr.value = (ptr.value + 1) & 0xFF;
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine,ptr.value);
+}
+
+static void jmpJMP(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regPC = ptr.addr;
+}
+
+static void jmpJSR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ /* Move past the 2 byte parameter. JSR is always followed by
+ absolute address. */
+ Bit16 currAddr = machine->regPC + 2;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ stackPush(machine, (currAddr >> 8) & 0xff);
+ stackPush(machine, currAddr & 0xff);
+ machine->regPC = ptr.addr;
+}
+
+static void jmpLDA(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA = ptr.value;
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpLDX(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regX = ptr.value;
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpLDY(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regY = ptr.value;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpLSR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue){
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(ptr.value, CARRY_FL));
+ ptr.value = ptr.value >> 1;
+ ptr.value = setBit(ptr.value,NEGATIVE_FL,0);
+ memStoreByte(machine,ptr.addr,ptr.value);
+ manZeroNeg(machine,ptr.value);
+ }
+ else { /* Accumulator */
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(machine->regA, CARRY_FL));
+ machine->regA = machine->regA >> 1;
+ machine->regA = setBit(machine->regA,NEGATIVE_FL,0);
+ manZeroNeg(machine,ptr.value);
+ }
+}
+
+static void jmpNOP(machine_6502 *machine, m6502_AddrMode adm){
+ /* no operation */
+}
+
+static void jmpORA(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA |= ptr.value;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpTAX(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regX = machine->regA;
+ manZeroNeg(machine,machine->regX);
+}
+
+static void jmpTXA(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regA = machine->regX;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpDEX(machine_6502 *machine, m6502_AddrMode adm){
+ if (machine->regX > 0)
+ machine->regX--;
+ else
+ machine->regX = 0xFF;
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpINX(machine_6502 *machine, m6502_AddrMode adm){
+ Bit16 value = machine->regX + 1;
+ machine->regX = value & 0xFF;
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpTAY(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regY = machine->regA;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpTYA(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regA = machine->regY;
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpDEY(machine_6502 *machine, m6502_AddrMode adm){
+ if (machine->regY > 0)
+ machine->regY--;
+ else
+ machine->regY = 0xFF;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpINY(machine_6502 *machine, m6502_AddrMode adm){
+ Bit16 value = machine->regY + 1;
+ machine->regY = value & 0xff;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpROR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ Bit8 cf;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue) {
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(ptr.value, CARRY_FL));
+ ptr.value = ptr.value >> 1;
+ ptr.value = setBit(ptr.value, NEGATIVE_FL, cf);
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine, ptr.value);
+ }
+ else { /* Implied */
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(machine->regA, CARRY_FL));
+ machine->regA = machine->regA >> 1;
+ machine->regA = setBit(machine->regA, NEGATIVE_FL, cf);
+ manZeroNeg(machine, machine->regA);
+ }
+}
+
+static void jmpROL(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ Bit8 cf;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue) {
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(ptr.value, NEGATIVE_FL));
+ ptr.value = ptr.value << 1;
+ ptr.value = setBit(ptr.value, CARRY_FL, cf);
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine, ptr.value);
+ }
+ else { /* Implied */
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(machine->regA,NEGATIVE_FL));
+ machine->regA = machine->regA << 1;
+ machine->regA = setBit(machine->regA, CARRY_FL, cf);
+ manZeroNeg(machine, machine->regA);
+ }
+}
+
+static void jmpRTI(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = stackPop(machine);
+ machine->regPC = stackPop(machine);
+}
+
+static void jmpRTS(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ Bit16 nr = stackPop(machine);
+ Bit16 nl = stackPop(machine);
+ warnValue(! isValue);
+ machine->regPC = (nl << 8) | nr;
+}
+
+static void jmpSBC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ /*Bit8 vflag;*/
+ Bit8 c = bitOn(machine->regP, CARRY_FL);
+ Bit16 tmp, w;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ /*vflag = (bitOn(machine->regA,NEGATIVE_FL) &&
+ bitOn(ptr.value, NEGATIVE_FL));*/
+
+ if (bitOn(machine->regP, DECIMAL_FL)) {
+ Bit8 ar = nibble(machine->regA, RIGHT);
+ Bit8 br = nibble(ptr.value, RIGHT);
+ Bit8 al = nibble(machine->regA, LEFT);
+ Bit8 bl = nibble(ptr.value, LEFT);
+
+ tmp = 0xf + ar - br + c;
+ if ( tmp < 0x10){
+ w = 0;
+ tmp -= 6;
+ }
+ else {
+ w = 0x10;
+ tmp -= 0x10;
+ }
+ w += 0xf0 + al - bl;
+ if ( w < 0x100) {
+ machine->regP = setBit(machine->regP, CARRY_FL, 0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w < 0x80)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ w -= 0x60;
+ }
+ else {
+ machine->regP = setBit(machine->regP, CARRY_FL, 1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w >= 0x180)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ w += tmp;
+ } /* end decimal mode */
+ else {
+ w = 0xff + machine->regA - ptr.value + c;
+ if ( w < 0x100 ){
+ machine->regP = setBit(machine->regP, CARRY_FL, 0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w < 0x80)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ else {
+ machine->regP = setBit(machine->regP, CARRY_FL, 1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w >= 0x180)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ }
+ machine->regA = w;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpSTA(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ memStoreByte(machine,ptr.addr,machine->regA);
+}
+
+static void jmpTXS(machine_6502 *machine, m6502_AddrMode adm){
+ stackPush(machine,machine->regX);
+}
+
+static void jmpTSX(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regX = stackPop(machine);
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpPHA(machine_6502 *machine, m6502_AddrMode adm){
+ stackPush(machine, machine->regA);
+}
+
+static void jmpPLA(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regA = stackPop(machine);
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpPHP(machine_6502 *machine, m6502_AddrMode adm){
+ stackPush(machine,machine->regP);
+}
+
+static void jmpPLP(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = stackPop(machine);
+ machine->regP = setBit(machine->regP, FUTURE_FL, 1);
+}
+
+static void jmpSTX(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ memStoreByte(machine,ptr.addr,machine->regX);
+}
+
+static void jmpSTY(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ memStoreByte(machine,ptr.addr,machine->regY);
+}
+
+
+
+/* OPCODES */
+static void assignOpCodes(m6502_Opcodes *opcodes){
+
+ #define SETOP(num, _name, _Imm, _ZP, _ZPX, _ZPY, _ABS, _ABSX, _ABSY, _INDX, _INDY, _SNGL, _BRA, _func) \
+{opcodes[num].name[3] = '\0'; \
+ strncpy(opcodes[num].name, _name, 3); opcodes[num].Imm = _Imm; opcodes[num].ZP = _ZP; \
+ opcodes[num].ZPX = _ZPX; opcodes[num].ZPY = _ZPY; opcodes[num].ABS = _ABS; \
+ opcodes[num].ABSX = _ABSX; opcodes[num].ABSY = _ABSY; opcodes[num].INDX = _INDX; \
+ opcodes[num].INDY = _INDY; opcodes[num].SNGL = _SNGL; opcodes[num].BRA = _BRA; \
+ opcodes[num].func = _func;}
+
+ /* OPCODE Imm ZP ZPX ZPY ABS ABSX ABSY INDX INDY SGNL BRA Jump Function*/
+ SETOP( 0, "ADC", 0x69, 0x65, 0x75, 0x00, 0x6d, 0x7d, 0x79, 0x61, 0x71, 0x00, 0x00, jmpADC);
+ SETOP( 1, "AND", 0x29, 0x25, 0x35, 0x31, 0x2d, 0x3d, 0x39, 0x00, 0x00, 0x00, 0x00, jmpAND);
+ SETOP( 2, "ASL", 0x00, 0x06, 0x16, 0x00, 0x0e, 0x1e, 0x00, 0x00, 0x00, 0x0a, 0x00, jmpASL);
+ SETOP( 3, "BIT", 0x00, 0x24, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpBIT);
+ SETOP( 4, "BPL", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, jmpBPL);
+ SETOP( 5, "BMI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, jmpBMI);
+ SETOP( 6, "BVC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, jmpBVC);
+ SETOP( 7, "BVS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, jmpBVS);
+ SETOP( 8, "BCC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, jmpBCC);
+ SETOP( 9, "BCS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, jmpBCS);
+ SETOP(10, "BNE", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, jmpBNE);
+ SETOP(11, "BEQ", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, jmpBEQ);
+ SETOP(12, "CMP", 0xc9, 0xc5, 0xd5, 0x00, 0xcd, 0xdd, 0xd9, 0xc1, 0xd1, 0x00, 0x00, jmpCMP);
+ SETOP(13, "CPX", 0xe0, 0xe4, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpCPX);
+ SETOP(14, "CPY", 0xc0, 0xc4, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpCPY);
+ SETOP(15, "DEC", 0x00, 0xc6, 0xd6, 0x00, 0xce, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, jmpDEC);
+ SETOP(16, "EOR", 0x49, 0x45, 0x55, 0x00, 0x4d, 0x5d, 0x59, 0x41, 0x51, 0x00, 0x00, jmpEOR);
+ SETOP(17, "CLC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, jmpCLC);
+ SETOP(18, "SEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, jmpSEC);
+ SETOP(19, "CLI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, jmpCLI);
+ SETOP(20, "SEI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, jmpSEI);
+ SETOP(21, "CLV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, jmpCLV);
+ SETOP(22, "CLD", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, jmpCLD);
+ SETOP(23, "SED", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, jmpSED);
+ SETOP(24, "INC", 0x00, 0xe6, 0xf6, 0x00, 0xee, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, jmpINC);
+ SETOP(25, "JMP", 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpJMP);
+ SETOP(26, "JSR", 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpJSR);
+ SETOP(27, "LDA", 0xa9, 0xa5, 0xb5, 0x00, 0xad, 0xbd, 0xb9, 0xa1, 0xb1, 0x00, 0x00, jmpLDA);
+ SETOP(28, "LDX", 0xa2, 0xa6, 0x00, 0xb6, 0xae, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, jmpLDX);
+ SETOP(29, "LDY", 0xa0, 0xa4, 0xb4, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, jmpLDY);
+ SETOP(30, "LSR", 0x00, 0x46, 0x56, 0x00, 0x4e, 0x5e, 0x00, 0x00, 0x00, 0x4a, 0x00, jmpLSR);
+ SETOP(31, "NOP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, jmpNOP);
+ SETOP(32, "ORA", 0x09, 0x05, 0x15, 0x00, 0x0d, 0x1d, 0x19, 0x01, 0x11, 0x00, 0x00, jmpORA);
+ SETOP(33, "TAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, jmpTAX);
+ SETOP(34, "TXA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, jmpTXA);
+ SETOP(35, "DEX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, jmpDEX);
+ SETOP(36, "INX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, jmpINX);
+ SETOP(37, "TAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, jmpTAY);
+ SETOP(38, "TYA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, jmpTYA);
+ SETOP(39, "DEY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, jmpDEY);
+ SETOP(40, "INY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, jmpINY);
+ SETOP(41, "ROR", 0x00, 0x66, 0x76, 0x00, 0x6e, 0x7e, 0x00, 0x00, 0x00, 0x6a, 0x00, jmpROR);
+ SETOP(42, "ROL", 0x00, 0x26, 0x36, 0x00, 0x2e, 0x3e, 0x00, 0x00, 0x00, 0x2a, 0x00, jmpROL);
+ SETOP(43, "RTI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, jmpRTI);
+ SETOP(44, "RTS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, jmpRTS);
+ SETOP(45, "SBC", 0xe9, 0xe5, 0xf5, 0x00, 0xed, 0xfd, 0xf9, 0xe1, 0xf1, 0x00, 0x00, jmpSBC);
+ SETOP(46, "STA", 0x00, 0x85, 0x95, 0x00, 0x8d, 0x9d, 0x99, 0x81, 0x91, 0x00, 0x00, jmpSTA);
+ SETOP(47, "TXS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, jmpTXS);
+ SETOP(48, "TSX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, jmpTSX);
+ SETOP(49, "PHA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, jmpPHA);
+ SETOP(50, "PLA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, jmpPLA);
+ SETOP(51, "PHP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, jmpPHP);
+ SETOP(52, "PLP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, jmpPLP);
+ SETOP(53, "STX", 0x00, 0x86, 0x00, 0x96, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpSTX);
+ SETOP(54, "STY", 0x00, 0x84, 0x94, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpSTY);
+ SETOP(55, "---", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, NULL);
+}
+
+static void buildIndexCache(machine_6502 *machine){
+ unsigned int i;
+ for (i = 0; i < NUM_OPCODES; i++) {
+ if (machine->opcodes[i].Imm != 0x00){
+ machine->opcache[machine->opcodes[i].Imm].adm = IMMEDIATE_VALUE;
+ machine->opcache[machine->opcodes[i].Imm].index = i;
+ }
+ if (machine->opcodes[i].ZP != 0x00){
+ machine->opcache[machine->opcodes[i].ZP].adm = ZERO;
+ machine->opcache[machine->opcodes[i].ZP].index = i;
+ }
+ if (machine->opcodes[i].ZPX != 0x00){
+ machine->opcache[machine->opcodes[i].ZPX].adm = ZERO_X;
+ machine->opcache[machine->opcodes[i].ZPX].index = i;;
+ }
+ if (machine->opcodes[i].ZPY != 0x00){
+ machine->opcache[machine->opcodes[i].ZPY].adm = ZERO_Y;
+ machine->opcache[machine->opcodes[i].ZPY].index = i;;
+ }
+ if (machine->opcodes[i].ABS != 0x00){
+ machine->opcache[machine->opcodes[i].ABS].adm = ABS_VALUE;
+ machine->opcache[machine->opcodes[i].ABS].index = i;;
+ }
+ if (machine->opcodes[i].ABSX != 0x00){
+ machine->opcache[machine->opcodes[i].ABSX].adm = ABS_X;
+ machine->opcache[machine->opcodes[i].ABSX].index = i;;
+ }
+ if (machine->opcodes[i].ABSY != 0x00){
+ machine->opcache[machine->opcodes[i].ABSY].adm = ABS_Y;
+ machine->opcache[machine->opcodes[i].ABSY].index = i;;
+ }
+ if (machine->opcodes[i].INDX != 0x00){
+ machine->opcache[machine->opcodes[i].INDX].adm = INDIRECT_X;
+ machine->opcache[machine->opcodes[i].INDX].index = i;;
+ }
+ if (machine->opcodes[i].INDY != 0x00){
+ machine->opcache[machine->opcodes[i].INDY].adm = INDIRECT_Y;
+ machine->opcache[machine->opcodes[i].INDY].index = i;;
+ }
+ if (machine->opcodes[i].SNGL != 0x00){
+ machine->opcache[machine->opcodes[i].SNGL].adm = SINGLE;
+ machine->opcache[machine->opcodes[i].SNGL].index = i;
+ }
+ if (machine->opcodes[i].BRA != 0x00){
+ machine->opcache[machine->opcodes[i].BRA].adm = ABS_OR_BRANCH;
+ machine->opcache[machine->opcodes[i].BRA].index = i;
+ }
+ }
+}
+
+/* opIndex() - Search the opcode table for a match. If found return
+ the index into the optable and the address mode of the opcode. If
+ the opcode is not found then return -1. */
+static int opIndex(machine_6502 *machine, Bit8 opcode, m6502_AddrMode *adm){
+ /* XXX could catch errors by setting a addressmode of error or something */
+ *adm = machine->opcache[opcode].adm;
+ return machine->opcache[opcode].index;
+}
+
+
+/* Assembly parser */
+
+static Param *newParam(void){
+ Param *newp;
+ int i = 0;
+
+ newp = (Param *) ecalloc(1, sizeof(Param));
+ newp->type = SINGLE;
+ for (i = 0; i < MAX_PARAM_VALUE; i++)
+ newp->value[i] = 0;
+ newp->vp = 0;
+ newp->label = ecalloc(MAX_LABEL_LEN,sizeof(char));
+ newp->lbladdr = 0;
+ return newp;
+}
+
+/* Copy the fields from p2 to p1 */
+static void copyParam(Param *p1, Param *p2){
+ int i = 0;
+ strncpy(p1->label,p2->label,MAX_LABEL_LEN);
+ for(i = 0; i < MAX_PARAM_VALUE; i++)
+ p1->value[i] = p2->value[i];
+ p1->vp = p2->vp;
+ p1->type = p2->type;
+}
+
+static Label *newLabel(void){
+ Label *newp;
+
+ newp = (Label *) ecalloc(1, sizeof(Label));
+ newp->addr = 0;
+ newp->label = ecalloc(MAX_LABEL_LEN,sizeof(char));
+
+ return newp;
+}
+
+static AsmLine *newAsmLine(char *cmd, char *label, BOOL decl, Param *param, int lc)
+{
+ AsmLine *newp;
+
+ newp = (AsmLine *) ecalloc(1, sizeof(AsmLine));
+ newp->labelDecl = decl;
+ newp->label = newLabel();
+ strncpy(newp->label->label,label,MAX_LABEL_LEN);
+ newp->command = estrdup(cmd);
+ newp->param = newParam();
+ copyParam(newp->param, param);
+ newp->next = NULL;
+ return newp;
+}
+
+static AsmLine *addend(AsmLine *listp, AsmLine *newp)
+{
+ AsmLine *p;
+ if(listp == NULL)
+ return newp;
+ for (p =listp; p->next != NULL; p = p->next)
+ ;
+ p->next = newp;
+ return listp;
+}
+
+static BOOL apply(AsmLine *listp, BOOL(*fn)(AsmLine*, void*), void *arg)
+{
+ AsmLine *p;
+ if(listp == NULL)
+ return FALSE;
+ for (p = listp; p != NULL; p = p->next)
+ if (! fn(p,arg) )
+ return FALSE;
+ return TRUE;
+}
+
+static void freeParam(Param *param){
+ free(param->label);
+ free(param);
+}
+
+static void freeLabel(Label *label){
+ free(label->label);
+ free(label);
+}
+
+static void freeallAsmLine(AsmLine *listp)
+{
+ AsmLine *next;
+ for(; listp != NULL; listp = next){
+ next = listp->next;
+ freeParam(listp->param);
+ freeLabel(listp->label);
+ free(listp->command);
+ free(listp);
+ }
+}
+
+static BOOL addvalue(Param *param,Bit32 value){
+ /* jwz: suppress "0 <= unsigned" warning */
+ if (/*0 <= param->vp &&*/ param->vp < MAX_PARAM_VALUE) {
+ param->value[param->vp++] = value;
+ return TRUE;
+ }
+ else {
+ fprintf(stderr,"Wrong number of parameters: %d. The limit is %d\n",param->vp+1, MAX_PARAM_VALUE);
+ return FALSE;
+ }
+}
+
+static void parseError(char *s){
+ fprintf(stderr,"6502 Syntax Error: %s\n", s);
+}
+
+/* stoupper() - Destructivley modifies the string making all letters upper case*/
+static void stoupper(char **s){
+ int i = 0;
+ while((*s)[i] != '\0'){
+ (*s)[i] = toupper((*s)[i]);
+ i++;
+ }
+}
+
+static BOOL isWhite(char c){
+ return (c == '\r' || c == '\t' || c == ' ');
+}
+
+static void skipSpace(char **s){
+ for(; isWhite(**s); (*s)++)
+ ;
+}
+
+/* nullify() - fills a string with upto sourceLength null characters. */
+static void nullify(char *token, unsigned int sourceLength){
+ unsigned int i = 0;
+ while (i < sourceLength)
+ token[i++] = '\0';
+}
+
+static BOOL isBlank(const char *token){
+ return (token[0] == '\0');
+}
+
+static BOOL isCommand(machine_6502 *machine, const char *token){
+ int i = 0;
+
+ while (i < NUM_OPCODES) {
+ if (strcmp(machine->opcodes[i].name,token) == 0)
+ return TRUE;
+ i++;
+ }
+
+ if (strcmp(token, "DCB") == 0) return TRUE;
+ return FALSE;
+}
+
+/* hasChar() - Check to see if the current line has a certain
+ charater */
+static BOOL hasChar(char *s, char c){
+ for(; *s != '\0' && *s != '\n'; s++) {
+ if (*s == c)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static BOOL ishexdigit(char c){
+ if (isdigit(c))
+ return TRUE;
+ else {
+ char c1 = toupper(c);
+ return ('A' <= c1 && c1 <= 'F');
+ }
+}
+
+/* isCmdChar() - Is this a valid character for a command. All of the
+ command are alpha except for the entry point code that is "*=" */
+static BOOL isCmdChar(char c){
+ return (isalpha(c) || c == '*' || c == '=');
+}
+
+
+/* command() - parse a command from the source code. We pass along a
+ machine so the opcode can be validated. */
+static BOOL command(machine_6502 *machine, char **s, char **cmd){
+ int i = 0;
+ skipSpace(s);
+ for(;isCmdChar(**s) && i < MAX_CMD_LEN; (*s)++)
+ (*cmd)[i++] = **s;
+ if (i == 0)
+ return TRUE; /* Could be a blank line. */
+ else if (strcmp(*cmd,"*=") == 0)
+ return TRUE; /* This is an entry point. */
+ else
+ return isCommand(machine,*cmd);
+}
+
+static BOOL declareLabel(char **s, char **label){
+ int i = 0;
+ skipSpace(s);
+ for(;**s != ':' && **s != '\n' && **s != '\0'; (*s)++){
+ if (isWhite(**s))
+ continue;
+ (*label)[i++] = **s;
+ }
+ if (i == 0)
+ return FALSE; /* Current line has to have a label */
+ else if (**s == ':'){
+ (*s)++; /* Skip colon */
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static BOOL parseHex(char **s, Bit32 *value){
+ enum { MAX_HEX_LEN = 5 };
+ if (**s == '$') {
+ char *hex = ecalloc(MAX_HEX_LEN, sizeof(char));
+ int i = 0;
+
+ (*s)++; /* move pass $ */
+ for(; ishexdigit(**s) && i < MAX_HEX_LEN; (*s)++)
+ hex[i++] = **s;
+
+ *value = strtol(hex,NULL,16);
+ free(hex);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static BOOL parseDec(char **s, Bit32 *value){
+ enum { MAX_DEC_LEN = 4 };
+ char *dec = ecalloc(MAX_DEC_LEN, sizeof(char));
+ int i;
+ for(i = 0; isdigit(**s) && i < MAX_DEC_LEN; (*s)++)
+ dec[i++] = **s;
+
+ if (i > 0){
+ *value = atoi(dec);
+ free(dec);
+ return TRUE;
+ }
+ else{
+ free(dec);
+ return FALSE;
+ }
+}
+
+static BOOL parseValue(char **s, Bit32 *value){
+ skipSpace(s);
+ if (**s == '$')
+ return parseHex(s, value);
+ else
+ return parseDec(s, value);
+}
+
+static BOOL paramLabel(char **s, char **label){
+ int i;
+ for(i = 0; (isalnum(**s) || **s == '_') && i < MAX_LABEL_LEN; (*s)++)
+ (*label)[i++] = **s;
+
+ if (i > 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static BOOL immediate(char **s, Param *param){
+ if (**s != '#')
+ return FALSE;
+
+ (*s)++; /*Move past hash */
+ if (**s == '<' || **s == '>'){
+ char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
+ param->type = (**s == '<') ? IMMEDIATE_LESS : IMMEDIATE_GREAT;
+ (*s)++; /* move past < or > */
+ if (paramLabel(s, &label)){
+ int ln = strlen(label) + 1;
+ strncpy(param->label, label, ln);
+ free(label);
+ return TRUE;
+ }
+ free(label);
+ }
+ else {
+ Bit32 value;
+ if (parseValue(s, &value)){
+ if (value > 0xFF){
+ parseError("Immediate value is too large.");
+ return FALSE;
+ }
+ param->type = IMMEDIATE_VALUE;
+ return addvalue(param, value);
+ }
+ }
+ return FALSE;
+}
+
+static BOOL isDirection(char c){
+ return (c == 'X' || c == 'Y');
+}
+
+static BOOL getDirection(char **s, char *direction){
+ skipSpace(s);
+ if (**s == ','){
+ (*s)++;
+ skipSpace(s);
+ if (isDirection(**s)){
+ *direction = **s;
+ (*s)++;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL indirect(char **s, Param *param){
+ Bit32 value;
+ char c;
+ if (**s == '(')
+ (*s)++;
+ else
+ return FALSE;
+
+ if (! parseHex(s,&value))
+ return FALSE;
+ if (value > 0xFF) {
+ parseError("Indirect value is too large.");
+ return FALSE;
+ }
+ if (!addvalue(param, value))
+ return FALSE;
+ skipSpace(s);
+ if (**s == ')'){
+ (*s)++;
+ if (getDirection(s,&c)) {
+ if (c == 'Y'){
+ param->type = INDIRECT_Y;
+ return TRUE;
+ }
+ }
+ }
+ else if (getDirection(s, &c)){
+ if (c == 'X'){
+ skipSpace(s);
+ if (**s == ')'){
+ (*s)++;
+ param->type = INDIRECT_X;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static BOOL dcbValue(char **s, Param *param){
+ Bit32 val;
+ if (! parseValue(s,&val))
+ return FALSE;
+
+ if (val > 0xFF)
+ return FALSE;
+
+ if (!addvalue(param,val))
+ return FALSE;
+
+ param->type = DCB_PARAM;
+
+ skipSpace(s);
+ if(**s == ','){
+ (*s)++;
+ return dcbValue(s, param);
+ }
+ else
+ return TRUE;
+}
+
+static BOOL value(char **s, Param *param){
+ Bit32 val;
+ BOOL abs;
+ BOOL dir;
+ char c = '\0';
+ if (! parseValue(s,&val))
+ return FALSE;
+
+ abs = (val > 0xFF);
+ dir = getDirection(s,&c);
+ if (!addvalue(param,val))
+ return FALSE;
+
+ if(abs && dir){
+ if (c == 'X')
+ param->type = ABS_X;
+ else if (c == 'Y')
+ param->type = ABS_Y;
+ else
+ return FALSE;
+ }
+ else if (abs)
+ param->type = ABS_VALUE;
+ else if (dir){
+ if (c == 'X')
+ param->type = ZERO_X;
+ else if (c == 'Y')
+ param->type = ZERO_Y;
+ else
+ return FALSE;
+ }
+ else
+ param->type = ZERO;
+
+ return TRUE;
+}
+
+static BOOL label(char **s, Param *param){
+ char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
+ char c;
+ BOOL labelOk = FALSE;
+ if (paramLabel(s, &label)){
+ labelOk = TRUE;
+ param->type = ABS_OR_BRANCH;
+ if (getDirection(s, &c)){
+ if (c == 'X')
+ param->type = ABS_LABEL_X;
+ else if (c == 'Y')
+ param->type = ABS_LABEL_Y;
+ else
+ labelOk = FALSE;
+ }
+ strncpy(param->label,label,MAX_LABEL_LEN);
+ }
+ free(label);
+ return labelOk;
+}
+
+static BOOL parameter(const char *cmd, char **s, Param *param){
+ skipSpace(s);
+ if (**s == '\0' || **s == '\n')
+ return TRUE;
+ else if (**s == '#')
+ return immediate(s,param);
+ else if (**s == '(')
+ return indirect(s,param);
+ else if (**s == '$' || isdigit(**s)){
+ if (strcmp(cmd, "DCB") == 0)
+ return dcbValue(s,param);
+ else
+ return value(s,param);
+ }
+ else if (isalpha(**s))
+ return label(s ,param);
+ else
+ return FALSE; /* Invalid Parameter */
+}
+
+static void comment(char **s){
+ skipSpace(s);
+ if (**s == ';')
+ for(;**s != '\n' && **s != '\0'; (*s)++)
+ ;
+}
+
+static void initParam(Param *param){
+ int i;
+ param->type = SINGLE;
+ for(i = 0; i < MAX_PARAM_VALUE; i++)
+ param->value[i] = 0;
+ param->vp = 0;
+ nullify(param->label,MAX_LABEL_LEN);
+}
+
+
+static AsmLine *parseAssembly(machine_6502 *machine, BOOL *codeOk, const char *code){
+ char *s;
+ char *cmd = ecalloc(MAX_CMD_LEN, sizeof(char));
+ char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
+ char *start; /*pointer to the start of the code.*/
+ unsigned int lc = 1;
+ Param *param;
+ BOOL decl;
+ AsmLine *listp = NULL;
+
+ *codeOk = TRUE;
+ param = newParam();
+ s = estrdup(code);
+ start = s;
+ stoupper(&s);
+
+ while(*s != '\0' && *codeOk){
+ initParam(param);
+ nullify(cmd, MAX_CMD_LEN);
+ nullify(label, MAX_LABEL_LEN);
+ decl = FALSE;
+ skipSpace(&s);
+ comment(&s);
+ if (*s == '\n'){
+ lc++;
+ s++;
+ continue; /* blank line */
+ }
+ else if (*s == '\0')
+ continue; /* no newline at the end of the code */
+ else if (hasChar(s,':')){
+ decl = TRUE;
+ if(! declareLabel(&s,&label)){
+ *codeOk = FALSE;
+ break;
+ }
+ skipSpace(&s);
+ }
+ if(!command(machine, &s, &cmd)){
+ *codeOk = FALSE;
+ break;
+ }
+ skipSpace(&s);
+ comment(&s);
+ if(!parameter(cmd, &s, param)){
+ *codeOk = FALSE;
+ break;
+ }
+ skipSpace(&s);
+ comment(&s);
+ if (*s == '\n' || *s == '\0'){
+ AsmLine *asmm;
+ asmm = newAsmLine(cmd,label,decl,param,lc);
+ listp = addend(listp,asmm);
+ }
+ else {
+ *codeOk = FALSE;
+ break;
+ }
+ }
+ if (! *codeOk)
+ fprintf(stderr,"Syntax error at line %u\n", lc);
+ free(start);
+ free(cmd);
+ free(label);
+ freeParam(param);
+ return listp;
+}
+
+#ifdef READ_FILES
+/* fileToBuffer() - Allocates a buffer and loads all of the file into memory. */
+static char *fileToBuffer(const char *filename){
+ const int defaultSize = 1024;
+ FILE *ifp;
+ int c;
+ int size = defaultSize;
+ int i = 0;
+ char *buffer = ecalloc(defaultSize,sizeof(char));
+
+ if (!buffer) abort();
+
+ ifp = fopen(filename, "rb");
+ if (!ifp) abort();
+
+ while((c = getc(ifp)) != EOF){
+ buffer[i++] = c;
+ if (i == size){
+ size += defaultSize;
+ buffer = realloc(buffer, size);
+ if (buffer == NULL) {
+ abort();
+ }
+ }
+ }
+ fclose(ifp);
+ buffer = realloc(buffer, i+2);
+ if (!buffer) abort();
+ /* Make sure we have a line feed at the end */
+ buffer[i] = '\n';
+ buffer[i+1] = '\0';
+ return buffer;
+}
+#endif
+
+
+/* Routines */
+
+/* reset() - Reset CPU and memory. */
+static void reset(machine_6502 *machine){
+ int x, y;
+ for ( y = 0; y < 32; y++ ){
+ for (x = 0; x < 32; x++){
+ machine->screen[x][y] = 0;
+ }
+ }
+
+ for(x=0; x < MEM_64K; x++)
+ machine->memory[x] = 0;
+
+ machine->codeCompiledOK = FALSE;
+ machine->regA = 0;
+ machine->regX = 0;
+ machine->regY = 0;
+ machine->regP = setBit(machine->regP, FUTURE_FL, 1);
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->regSP = STACK_TOP;
+ machine->runForever = FALSE;
+ machine->labelPtr = 0;
+ machine->codeRunning = FALSE;
+}
+
+/* hexDump() - Dump the memory to output */
+void m6502_hexDump(machine_6502 *machine, Bit16 start, Bit16 numbytes, FILE *output){
+ Bit32 address;
+ Bit32 i;
+ for( i = 0; i < numbytes; i++){
+ address = start + i;
+ if ( (i&15) == 0 ) {
+ fprintf(output,"\n%.4x: ", address);
+ }
+ fprintf(output,"%.2x%s",machine->memory[address], (i & 1) ? " ":"");
+ }
+ fprintf(output,"%s\n",(i&1)?"--":"");
+}
+
+/* XXX */
+/* void save_program(machine_6502 *machine, char *filename){ */
+/* FILE *ofp; */
+/* Bit16 pc = PROG_START; */
+/* Bit16 end = pc + machine->codeLen; */
+/* Bit16 n; */
+/* ofp = fopen(filename, "w"); */
+/* if (!ofp) abort(); */
+
+/* fprintf(ofp,"Bit8 prog[%d] =\n{",machine->codeLen); */
+/* n = 1; */
+/* while(pc < end) */
+/* fprintf(ofp,"0x%.2x,%s",machine->memory[pc++],n++%10?" ":"\n"); */
+/* fseek(ofp,-2,SEEK_CUR); */
+/* fprintf(ofp,"};\n"); */
+
+/* fclose(ofp); */
+/* } */
+
+static BOOL translate(m6502_Opcodes *op,Param *param, machine_6502 *machine){
+ switch(param->type){
+ case SINGLE:
+ if (op->SNGL)
+ pushByte(machine, op->SNGL);
+ else {
+ fprintf(stderr,"%s needs a parameter.\n",op->name);
+ return FALSE;
+ }
+ break;
+ case IMMEDIATE_VALUE:
+ if (op->Imm) {
+ pushByte(machine, op->Imm);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take IMMEDIATE_VALUE parameters.\n",op->name);
+ return FALSE;
+ }
+ case IMMEDIATE_GREAT:
+ if (op->Imm) {
+ pushByte(machine, op->Imm);
+ pushByte(machine, param->lbladdr >> 8);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take IMMEDIATE_GREAT parameters.\n",op->name);
+ return FALSE;
+ }
+ case IMMEDIATE_LESS:
+ if (op->Imm) {
+ pushByte(machine, op->Imm);
+ pushByte(machine, param->lbladdr & 0xFF);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take IMMEDIATE_LESS parameters.\n",op->name);
+ return FALSE;
+ }
+ case INDIRECT_X:
+ if (op->INDX) {
+ pushByte(machine, op->INDX);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take INDIRECT_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case INDIRECT_Y:
+ if (op->INDY) {
+ pushByte(machine, op->INDY);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take INDIRECT_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case ZERO:
+ if (op->ZP) {
+ pushByte(machine, op->ZP);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ZERO parameters.\n",op->name);
+ return FALSE;
+ }
+ case ZERO_X:
+ if (op->ZPX) {
+ pushByte(machine, op->ZPX);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ZERO_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case ZERO_Y:
+ if (op->ZPY) {
+ pushByte(machine, op->ZPY);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ZERO_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_VALUE:
+ if (op->ABS) {
+ pushByte(machine, op->ABS);
+ pushWord(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_VALUE parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_OR_BRANCH:
+ if (op->ABS > 0){
+ pushByte(machine, op->ABS);
+ pushWord(machine, param->lbladdr);
+ }
+ else {
+ if (op->BRA) {
+ pushByte(machine, op->BRA);
+ {
+ int diff = abs((int)param->lbladdr - (int)machine->defaultCodePC);
+ int backward = (param->lbladdr < machine->defaultCodePC);
+ pushByte(machine, (backward) ? 0xff - diff : diff - 1);
+ }
+ }
+ else {
+ fprintf(stderr,"%s does not take BRANCH parameters.\n",op->name);
+ return FALSE;
+ }
+ }
+ break;
+ case ABS_X:
+ if (op->ABSX) {
+ pushByte(machine, op->ABSX);
+ pushWord(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_Y:
+ if (op->ABSY) {
+ pushByte(machine, op->ABSY);
+ pushWord(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_LABEL_X:
+ if (op->ABSX) {
+ pushByte(machine, op->ABSX);
+ pushWord(machine, param->lbladdr);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_LABEL_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_LABEL_Y:
+ if (op->ABSY) {
+ pushByte(machine, op->ABSY);
+ pushWord(machine, param->lbladdr);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_LABEL_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case DCB_PARAM:
+ /* Handled elsewhere */
+ break;
+ }
+ return TRUE;
+}
+
+/* compileLine() - Compile one line of code. Returns
+ TRUE if it compile successfully. */
+static BOOL compileLine(AsmLine *asmline, void *args){
+ machine_6502 *machine;
+ machine = args;
+ if (isBlank(asmline->command)) return TRUE;
+ if (strcmp("*=",asmline->command) == 0){
+ machine->defaultCodePC = asmline->param->value[0];
+ }
+ else if (strcmp("DCB",asmline->command) == 0){
+ int i;
+ for(i = 0; i < asmline->param->vp; i++)
+ pushByte(machine, asmline->param->value[i]);
+ }
+ else{
+ int i;
+ char *command = asmline->command;
+ m6502_Opcodes op;
+ for(i = 0; i < NUM_OPCODES; i++){
+ if (strcmp(machine->opcodes[i].name, command) == 0){
+ op = machine->opcodes[i];
+ break;
+ }
+ }
+ if (i == NUM_OPCODES)
+ return FALSE; /* unknow upcode */
+ else
+ return translate(&op,asmline->param,machine);
+ }
+ return TRUE;
+}
+
+/* indexLabels() - Get the address for each label */
+static BOOL indexLabels(AsmLine *asmline, void *arg){
+ machine_6502 *machine;
+ int thisPC;
+ Bit16 oldDefault;
+ machine = arg;
+ oldDefault = machine->defaultCodePC;
+ thisPC = machine->regPC;
+ /* Figure out how many bytes this instruction takes */
+ machine->codeLen = 0;
+
+ if ( ! compileLine(asmline, machine) ){
+ return FALSE;
+ }
+
+ /* If the machine's defaultCodePC has changed then we encountered a
+ *= which changes the load address. We need to initials our code
+ *counter with the current default. */
+ if (oldDefault == machine->defaultCodePC){
+ machine->regPC += machine->codeLen;
+ }
+ else {
+ machine->regPC = machine->defaultCodePC;
+ /*oldDefault = machine->defaultCodePC;*/
+ }
+
+ if (asmline->labelDecl) {
+ asmline->label->addr = thisPC;
+ }
+ return TRUE;
+}
+
+static BOOL changeParamLabelAddr(AsmLine *asmline, void *label){
+ Label *la = label;
+ if (strcmp(asmline->param->label, la->label) == 0)
+ asmline->param->lbladdr = la->addr;
+ return TRUE;
+}
+
+static BOOL linkit(AsmLine *asmline, void *asmlist){
+ apply(asmlist,changeParamLabelAddr,asmline->label);
+ return TRUE;
+}
+
+/* linkLabels - Make sure all of the references to the labels contain
+ the right address*/
+static void linkLabels(AsmLine *asmlist){
+ apply(asmlist,linkit,asmlist);
+}
+
+/* compileCode() - Compile the current assembly code for the machine */
+static BOOL compileCode(machine_6502 *machine, const char *code){
+ BOOL codeOk;
+ AsmLine *asmlist;
+
+ reset(machine);
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ asmlist = parseAssembly(machine, &codeOk, code);
+
+ if(codeOk){
+ /* First pass: Find the addresses for the labels */
+ if (!apply(asmlist, indexLabels, machine))
+ return FALSE;
+ /* update label references */
+ linkLabels(asmlist);
+
+#if 0 /* prints out some debugging information */
+ {
+ AsmLine *p;
+ if(asmlist != NULL){
+ for (p = asmlist; p != NULL; p = p->next)
+ fprintf(stderr,"%s lbl: %s addr: %x ParamLbl: %s ParamAddr: %x\n",
+ p->command, p->label->label, p->label->addr,
+ p->param->label, p->param->lbladdr);
+ }
+ }
+
+#endif
+
+ /* Second pass: translate the instructions */
+ machine->codeLen = 0;
+ /* Link label call push_byte which increments defaultCodePC.
+ We need to reset it so the compiled code goes in the
+ correct spot. */
+ machine->defaultCodePC = PROG_START;
+ if (!apply(asmlist, compileLine, machine))
+ return FALSE;
+
+ if (machine->defaultCodePC > PROG_START ){
+ machine->memory[machine->defaultCodePC] = 0x00;
+ codeOk = TRUE;
+ }
+ else{
+ fprintf(stderr,"No Code to run.\n");
+ codeOk = FALSE;
+ }
+ }
+ else{
+ fprintf(stderr,"An error occured while parsing the file.\n");
+ codeOk = FALSE;
+ }
+ freeallAsmLine(asmlist);
+ return codeOk;
+}
+
+
+/*
+ * execute() - Executes one instruction.
+ * This is the main part of the CPU emulator.
+ *
+ */
+
+static void execute(machine_6502 *machine){
+ Bit8 opcode;
+ m6502_AddrMode adm;
+ int opidx;
+
+ if(!machine->codeRunning) return;
+
+ opcode = popByte(machine);
+ if (opcode == 0x00)
+ machine->codeRunning = FALSE;
+ else {
+ opidx = opIndex(machine,opcode,&adm);
+ if(opidx > -1)
+ machine->opcodes[opidx].func(machine, adm);
+ else
+ fprintf(stderr,"Invalid opcode!\n");
+ }
+ if( (machine->regPC == 0) ||
+ (!machine->codeRunning) ) {
+ machine->codeRunning = FALSE;
+ }
+}
+
+machine_6502 *m6502_build(void){
+ machine_6502 *machine;
+ machine = ecalloc(1, sizeof(machine_6502));
+ assignOpCodes(machine->opcodes);
+ buildIndexCache(machine);
+ reset(machine);
+ return machine;
+}
+
+void m6502_destroy6502(machine_6502 *machine){
+ free(machine);
+ machine = NULL;
+}
+
+void m6502_trace(machine_6502 *machine, FILE *output){
+ Bit8 opcode = memReadByte(machine,machine->regPC);
+ m6502_AddrMode adm;
+ Pointer ptr;
+ int opidx = opIndex(machine,opcode,&adm);
+ int stacksz = STACK_TOP - machine->regSP;
+
+ fprintf(output,"\n NVFBDIZC\nP: %d%d%d%d%d%d%d%d ",
+ bitOn(machine->regP,NEGATIVE_FL),
+ bitOn(machine->regP,OVERFLOW_FL),
+ bitOn(machine->regP,FUTURE_FL),
+ bitOn(machine->regP,BREAK_FL),
+ bitOn(machine->regP,DECIMAL_FL),
+ bitOn(machine->regP,INTERRUPT_FL),
+ bitOn(machine->regP,ZERO_FL),
+ bitOn(machine->regP,CARRY_FL));
+ fprintf(output,"A: %.2x X: %.2x Y: %.2x SP: %.4x PC: %.4x\n",
+ machine->regA, machine->regX, machine->regY, machine->regSP, machine->regPC);
+ if (opidx > -1){
+ Bit16 pc = machine->regPC;
+ fprintf(output,"\n%.4x:\t%s",machine->regPC, machine->opcodes[opidx].name);
+ if (peekValue(machine, adm, &ptr, pc+1))
+ fprintf(output,"\tAddress:%.4x\tValue:%.4x\n",
+ ptr.addr,ptr.value);
+ else
+ fprintf(output,"\n");
+ }
+ fprintf(output,"STACK:");
+ m6502_hexDump(machine,(STACK_TOP - stacksz) + 1, stacksz, output);
+}
+
+#if 0
+void disassemble(machine_6502 *machine, FILE *output){
+ /* Read the opcode
+ increment the program counter
+ print the opcode
+ loop until end of program. */
+ m6502_AddrMode adm;
+ Bit16 addr;
+ Bit8 opcode;
+ int opidx;
+ char *mem;
+ int i;
+ Bit16 opc = machine->regPC;
+ mem = calloc(20,sizeof(char));
+ machine->regPC = PROG_START;
+ do{
+ addr = machine->regPC;
+ opcode = popByte(machine);
+ opidx = opIndex(machine,opcode,&adm);
+ for (i = 0; i < 20; i++) mem[i] = '\0';
+ dismem(machine, adm, mem);
+ fprintf(output,"%x\t%s\t%s\n",
+ addr,machine->opcodes[opidx].name,mem);
+ }while((machine->regPC - PROG_START) < machine->codeLen); /*XXX - may need to change since defaultCodePC */
+ free(mem);
+ machine->regPC = opc;
+}
+#endif
+
+
+#ifdef READ_FILES
+void m6502_eval_file(machine_6502 *machine, const char *filename, m6502_Plotter plot, void *plotterState){
+ char *code = NULL;
+
+ machine->plot = plot;
+ machine->plotterState = plotterState;
+
+ code = fileToBuffer(filename);
+
+ if (! compileCode(machine, code) ) abort();
+
+ free(code);
+
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->codeRunning = TRUE;
+ do{
+ sleep(0); /* XXX */
+#if 0
+ m6502_trace(machine, stdout);
+#endif
+ execute(machine);
+ }while(machine->codeRunning);
+}
+
+void m6502_start_eval_file(machine_6502 *machine, const char *filename, m6502_Plotter plot, void *plotterState){
+ char *code = NULL;
+ reset(machine);
+
+ machine->plot = plot;
+ machine->plotterState = plotterState;
+
+ code = fileToBuffer(filename);
+
+ if (! compileCode(machine, code) ) abort();
+
+ free(code);
+
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->codeRunning = TRUE;
+ execute(machine);
+}
+#endif /* READ_FILES */
+
+void m6502_start_eval_string(machine_6502 *machine, const char *code,
+ m6502_Plotter plot, void *plotterState){
+ reset(machine);
+
+ machine->plot = plot;
+ machine->plotterState = plotterState;
+
+ if (! compileCode(machine, code) ){
+ fprintf(stderr,"Could not compile code.\n");
+ }
+
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->codeRunning = TRUE;
+ execute(machine);
+}
+
+/* void start_eval_binary(machine_6502 *machine, Bit8 *program, */
+/* unsigned int proglen, */
+/* Plotter plot, void *plotterState){ */
+/* unsigned int pc, n; */
+/* reset(machine); */
+/* machine->plot = plot; */
+/* machine->plotterState = plotterState; */
+
+/* machine->regPC = PROG_START; */
+/* pc = machine->regPC; */
+/* machine->codeLen = proglen; */
+/* n = 0; */
+/* while (n < proglen){ */
+/* machine->memory[pc++] = program[n++]; */
+/* } */
+/* machine->codeRunning = TRUE; */
+/* execute(machine); */
+/* } */
+
+void m6502_next_eval(machine_6502 *machine, int insno){
+ int i = 0;
+ for (i = 1; i < insno; i++){
+ if (machine->codeRunning){
+#if 0
+ trace(machine, stdout);
+#endif
+ execute(machine);
+ }
+ else
+ break;
+ }
+}
+
diff --git a/hacks/asm6502.h b/hacks/asm6502.h
new file mode 100644
index 0000000..79b13a2
--- /dev/null
+++ b/hacks/asm6502.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2007 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 07-May-2007
+ */
+
+/*
+ This is a port of the javascript 6502 assembler, compiler and
+ debugger. The orignal code was copyright 2006 by Stian Soreng -
+ www.6502asm.com
+
+ The stack space is in page $100 to $1ff. The video buffer starts at
+ $200 and is 1024 bytes. Programs get loaded at address
+ $600. Address $fe is random and byte $ff is used for user input.
+
+ User input is disabled.
+*/
+
+#ifndef __ASM6502_H__
+#define __ASM6502_H__
+
+typedef uint8_t Bit8;
+typedef uint16_t Bit16;
+typedef uint32_t Bit32;
+
+#undef BOOL
+#undef TRUE
+#undef FALSE
+#define BOOL Bit8
+#define TRUE 1
+#define FALSE 0
+
+enum {
+ MAX_LABEL_LEN = 80,
+ NUM_OPCODES = 56, /* Number of unique instructions not counting DCB */
+ MEM_64K = 65536, /* We have 64k of memory to work with. */
+ MAX_PARAM_VALUE = 25, /* The number of values allowed behind dcb */
+ MAX_CMD_LEN = 4, /* Each assembly command is 3 characeters long */
+/* The stack works from the top down in page $100 to $1ff */
+ STACK_TOP = 0x1ff,
+ STACK_BOTTOM = 0x100,
+ PROG_START = 0x600 /* The default entry point for the program */
+};
+
+typedef enum{
+ SINGLE, IMMEDIATE_VALUE, IMMEDIATE_GREAT,
+ IMMEDIATE_LESS, INDIRECT_X, INDIRECT_Y,
+ ZERO, ZERO_X, ZERO_Y,
+ ABS_VALUE, ABS_OR_BRANCH, ABS_X, ABS_Y,
+ ABS_LABEL_X, ABS_LABEL_Y, DCB_PARAM
+} m6502_AddrMode;
+
+typedef struct machine_6502 machine_6502;
+
+typedef struct {
+ char name[MAX_CMD_LEN];
+ Bit8 Imm;
+ Bit8 ZP;
+ Bit8 ZPX;
+ Bit8 ZPY;
+ Bit8 ABS;
+ Bit8 ABSX;
+ Bit8 ABSY;
+ Bit8 INDX;
+ Bit8 INDY;
+ Bit8 SNGL;
+ Bit8 BRA;
+ void (*func) (machine_6502*, m6502_AddrMode);
+} m6502_Opcodes;
+
+/* Used to cache the index of each opcode */
+typedef struct {
+ Bit8 index;
+ m6502_AddrMode adm;
+} m6502_OpcodeIndex;
+
+/* Plotter is a function that will be called everytime a pixel
+ needs to be updated. The first two parameter are the x and y
+ values. The third parameter is the color index:
+
+ Color Index Table
+ 00 black #000000
+ 01 white #ffffff
+ 02 Red #880000
+ 03 seafoam #aaffee
+ 04 fuscia #cc44cc
+ 05 green #00cc55
+ 06 blue #0000aa
+ 07 Yellow #eeee77
+ 08 tangerine #dd8855
+ 09 brown #664400
+ 10 salmon #ff7777
+ 11 charcoal #333333
+ 12 smoke #777777
+ 13 lime #aaff66
+ 14 light blue #0088ff
+ 15 gray #bbbbbb
+
+ The plotter state variable of the machine gets passed as the forth
+ parameter. You can use this parameter to store state information.
+
+*/
+typedef void (*m6502_Plotter) (Bit8, Bit8, Bit8, void*);
+
+struct machine_6502 {
+ BOOL codeCompiledOK;
+ Bit8 regA;
+ Bit8 regX;
+ Bit8 regY;
+ Bit8 regP;
+ Bit16 regPC; /* A pair of 8 bit registers */
+ Bit16 regSP;
+ Bit16 defaultCodePC;
+ Bit8 memory[MEM_64K];
+ BOOL runForever;
+ int labelPtr;
+ BOOL codeRunning;
+ int myInterval;
+ m6502_Opcodes opcodes[NUM_OPCODES];
+ int screen[32][32];
+ int codeLen;
+ m6502_OpcodeIndex opcache[0xff];
+ m6502_Plotter plot;
+ void *plotterState;
+};
+
+/* build6502() - Creates an instance of the 6502 machine */
+machine_6502 *m6502_build(void);
+
+/* destroy6502() - compile the file and exectue it until the program
+ is finished */
+void m6502_destroy6502(machine_6502 *machine);
+
+/* eval_file() - Compiles and runs a file until the program is
+ finished */
+void m6502_eval_file(machine_6502 *machine, const char *filename,
+ m6502_Plotter plot, void *plotterState);
+
+/* start_eval_file() - Compile the file and execute the first
+ instruction */
+void m6502_start_eval_file(machine_6502 *machine, const char *filename,
+ m6502_Plotter plot, void *plotterState);
+
+/* XXX
+void m6502_start_eval_binary(machine_6502 *machine, Bit8 *program,
+ unsigned int proglen,
+ Plotter plot, void *plotterState);
+*/
+
+void m6502_start_eval_string(machine_6502 *machine, const char *code,
+ m6502_Plotter plot, void *plotterState);
+
+/* next_eval() - Execute the next insno of machine instructions */
+void m6502_next_eval(machine_6502 *machine, int insno);
+
+/* hexDump() - Dumps memory to output */
+void m6502_hexDump(machine_6502 *machine, Bit16 start,
+ Bit16 numbytes, FILE *output);
+
+/* Disassemble() - Prints the assembly code for the program currently
+ loaded in memory.*/
+void m6502_disassemble(machine_6502 *machine, FILE *output);
+
+/* trace() - Prints to output the current value of registers, the
+ current nmemonic, memory address and value. */
+void m6502_trace(machine_6502 *machine, FILE *output);
+
+/* save_program() - Writes a binary file of the program loaded in
+ memory. */
+/* XXX
+void save_program(machine_6502 *machine, const char *filename);
+*/
+#endif /* __ASM6502_H__ */
diff --git a/hacks/attraction.c b/hacks/attraction.c
new file mode 100644
index 0000000..4fe22c2
--- /dev/null
+++ b/hacks/attraction.c
@@ -0,0 +1,1109 @@
+/* xscreensaver, Copyright (c) 1992-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda
+ a little like the strong and weak electromagnetic forces. Derived from
+ a Lispm screensaver by John Pezaris <pz@mit.edu>. Viscosity added by
+ Philip Edward Cutone, III <pc2d+@andrew.cmu.edu>.
+
+ John sez:
+
+ The simulation started out as a purely accurate gravitational
+ simulation, but, with constant simulation step size, I quickly
+ realized the field being simulated while grossly gravitational
+ was, in fact, non-conservative. It also had the rather annoying
+ behavior of dealing very badly with colliding orbs. Therefore,
+ I implemented a negative-gravity region (with two thresholds; as
+ I read your code, you only implemented one) to prevent orbs from
+ every coming too close together, and added a viscosity factor if
+ the speed of any orb got too fast. This provides a nice stable
+ system with interesting behavior.
+
+ I had experimented with a number of fields including the van der
+ Waals force (very interesting orbiting behavior) and 1/r^3
+ gravity (not as interesting as 1/r^2). An even normal viscosity
+ (rather than the thresholded version to bleed excess energy) is
+ also not interesting. The 1/r^2, -1/r^2, -10/r^2 thresholds
+ proved not only robust but also interesting -- the orbs never
+ collided and the threshold viscosity fixed the
+ non-conservational problem.
+
+ Philip sez:
+ > An even normal viscosity (rather than the thresholded version to
+ > bleed excess energy) is also not interesting.
+
+ unless you make about 200 points.... set the viscosity to about .8
+ and drag the mouse through it. it makes a nice wave which travels
+ through the field.
+
+ And (always the troublemaker) Joe Keane <jgk@jgk.org> sez:
+
+ Despite what John sez, the field being simulated is always
+ conservative. The real problem is that it uses a simple hack,
+ computing acceleration *based only on the starting position*,
+ instead of a real differential equation solver. Thus you'll
+ always have energy coming out of nowhere, although it's most
+ blatant when balls get close together. If it were done right,
+ you wouldn't need viscosity or artificial limits on how close
+ the balls can get.
+
+ Matt <straitm@carleton.edu> sez:
+
+ Added a switch to remove the walls.
+
+ Added a switch to make the threshold viscosity optional. If
+ nomaxspeed is specified, then balls going really fast do not
+ recieve special treatment.
+
+ I've made tail mode prettier by eliminating the first erase line
+ that drew from the upper left corner to the starting position of
+ each point.
+
+ Made the balls in modes other than "balls" bounce exactly at the
+ walls. (Because the graphics for different modes are drawn
+ differently with respect to the "actual" position of the point,
+ they used to be able to run somewhat past the walls, or bounce
+ before hitting them.)
+
+ Added an option to output each ball's speed in the form of a bar
+ graph drawn on the same window as the balls. If only x or y is
+ selected, they will be represented on the appropriate axis down
+ the center of the window. If both are selected, they will both
+ be displayed along the diagonal such that the x and y bars for
+ each point start at the same place. If speed is selected, the
+ speed will be displayed down the left side. */
+
+#include <stdio.h>
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+
+/* The normal (and max) width for a graph bar */
+#define BAR_SIZE 11
+#define MAX_SIZE 16
+#define min(a,b) ((a)<(b)?(a):(b))
+#define max(a,b) ((a)>(b)?(a):(b))
+
+
+enum object_mode {
+ ball_mode, line_mode, polygon_mode, spline_mode, spline_filled_mode,
+ tail_mode
+};
+
+enum graph_mode {
+ graph_none, graph_x, graph_y, graph_both, graph_speed
+};
+
+struct ball {
+ double x, y;
+ double vx, vy;
+ double dx, dy;
+ double mass;
+ int size;
+ int pixel_index;
+ int hue;
+};
+
+struct state {
+ struct ball *balls;
+ double *x_vels;
+ double *y_vels;
+ double *speeds;
+ int npoints;
+ int threshold;
+ int delay;
+ int global_size;
+ int segments;
+ Bool glow_p;
+ Bool orbit_p;
+ Bool walls_p;
+ Bool maxspeed_p;
+ Bool cbounce_p;
+ XPoint *point_stack;
+ int point_stack_size, point_stack_fp;
+ XColor *colors;
+ int ncolors;
+ int fg_index;
+ int color_shift;
+ int xlim, ylim;
+ Bool no_erase_yet; /* for tail mode fix */
+ double viscosity;
+
+ int mouse_ball; /* index of ball being dragged, or 0 if none. */
+ unsigned long mouse_pixel;
+
+ enum object_mode mode;
+ enum graph_mode graph_mode;
+
+ GC draw_gc, erase_gc;
+
+ int total_ticks;
+ int color_tick;
+ spline *spl;
+};
+
+
+static void *
+attraction_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+ int midx, midy, r, vx, vy;
+ double th;
+ Colormap cmap;
+ char *mode_str, *graph_mode_str;
+ double size_scale;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ st->xlim = xgwa.width;
+ st->ylim = xgwa.height;
+ cmap = xgwa.colormap;
+ midx = st->xlim/2;
+ midy = st->ylim/2;
+ st->walls_p = get_boolean_resource (dpy, "walls", "Boolean");
+
+ /* if there aren't walls, don't set a limit on the radius */
+ r = get_integer_resource (dpy, "radius", "Integer");
+ if (r <= 0 || (r > min (st->xlim/2, st->ylim/2) && st->walls_p) )
+ r = min (st->xlim/2, st->ylim/2) - 50;
+
+ vx = get_integer_resource (dpy, "vx", "Integer");
+ vy = get_integer_resource (dpy, "vy", "Integer");
+
+ st->npoints = get_integer_resource (dpy, "points", "Integer");
+ if (st->npoints < 1)
+ st->npoints = 3 + (random () % 5);
+ st->balls = (struct ball *) malloc (st->npoints * sizeof (struct ball));
+
+ st->no_erase_yet = 1; /* for tail mode fix */
+
+ st->segments = get_integer_resource (dpy, "segments", "Integer");
+ if (st->segments < 0) st->segments = 1;
+
+ st->threshold = get_integer_resource (dpy, "threshold", "Integer");
+ if (st->threshold < 0) st->threshold = 0;
+
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+
+ st->global_size = get_integer_resource (dpy, "size", "Integer");
+ if (st->global_size < 0) st->global_size = 0;
+
+ st->glow_p = get_boolean_resource (dpy, "glow", "Boolean");
+
+ st->orbit_p = get_boolean_resource (dpy, "orbit", "Boolean");
+
+ st->maxspeed_p = get_boolean_resource (dpy, "maxspeed", "Boolean");
+
+ st->cbounce_p = get_boolean_resource (dpy, "cbounce", "Boolean");
+
+ st->color_shift = get_integer_resource (dpy, "colorShift", "Integer");
+ if (st->color_shift <= 0) st->color_shift = 5;
+
+ st->viscosity = get_float_resource (dpy, "viscosity", "Float");
+
+ mode_str = get_string_resource (dpy, "mode", "Mode");
+ if (! mode_str) st->mode = ball_mode;
+ else if (!strcmp (mode_str, "balls")) st->mode = ball_mode;
+ else if (!strcmp (mode_str, "lines")) st->mode = line_mode;
+ else if (!strcmp (mode_str, "polygons")) st->mode = polygon_mode;
+ else if (!strcmp (mode_str, "tails")) st->mode = tail_mode;
+ else if (!strcmp (mode_str, "splines")) st->mode = spline_mode;
+ else if (!strcmp (mode_str, "filled-splines"))st->mode = spline_filled_mode;
+ else {
+ fprintf (stderr,
+ "%s: mode must be balls, lines, tails, polygons, splines, or\n\
+ filled-splines, not \"%s\"\n",
+ progname, mode_str);
+ exit (1);
+ }
+
+ graph_mode_str = get_string_resource (dpy, "graphmode", "Mode");
+ if (! graph_mode_str) st->graph_mode = graph_none;
+ else if (!strcmp (graph_mode_str, "x")) st->graph_mode = graph_x;
+ else if (!strcmp (graph_mode_str, "y")) st->graph_mode = graph_y;
+ else if (!strcmp (graph_mode_str, "both")) st->graph_mode = graph_both;
+ else if (!strcmp (graph_mode_str, "speed")) st->graph_mode = graph_speed;
+ else if (!strcmp (graph_mode_str, "none")) st->graph_mode = graph_none;
+ else {
+ fprintf (stderr,
+ "%s: graphmode must be speed, x, y, both, or none, not \"%s\"\n",
+ progname, graph_mode_str);
+ exit (1);
+ }
+
+ /* only allocate memory if it is needed */
+ if(st->graph_mode != graph_none)
+ {
+ if(st->graph_mode == graph_x || st->graph_mode == graph_both)
+ st->x_vels = (double *) malloc (st->npoints * sizeof (double));
+ if(st->graph_mode == graph_y || st->graph_mode == graph_both)
+ st->y_vels = (double *) malloc (st->npoints * sizeof (double));
+ if(st->graph_mode == graph_speed)
+ st->speeds = (double *) malloc (st->npoints * sizeof (double));
+ }
+
+ if (st->mode != ball_mode && st->mode != tail_mode) st->glow_p = False;
+
+ if (st->mode == polygon_mode && st->npoints < 3)
+ st->mode = line_mode;
+
+ st->ncolors = get_integer_resource (dpy, "colors", "Colors");
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+ st->colors = 0;
+
+ if (!mono_p)
+ {
+ st->fg_index = 0;
+ switch (st->mode)
+ {
+ case ball_mode:
+ if (st->glow_p)
+ {
+ int H = random() % 360;
+ double S1 = 0.25;
+ double S2 = 1.00;
+ double V = frand(0.25) + 0.75;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_color_ramp (xgwa.screen, xgwa.visual, cmap,
+ H, S1, V, H, S2, V, st->colors, &st->ncolors,
+ False, True, False);
+ }
+ else
+ {
+ st->ncolors = st->npoints;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_random_colormap (xgwa.screen, xgwa.visual, cmap,
+ st->colors, &st->ncolors,
+ True, True, False, True);
+ }
+ break;
+ case line_mode:
+ case polygon_mode:
+ case spline_mode:
+ case spline_filled_mode:
+ case tail_mode:
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_smooth_colormap (xgwa.screen, xgwa.visual, cmap,
+ st->colors, &st->ncolors,
+ True, False, True);
+ break;
+ default:
+ abort ();
+ }
+ }
+
+ if (!mono_p && st->ncolors <= 2)
+ {
+ if (st->colors) free (st->colors);
+ st->colors = 0;
+ mono_p = True;
+ }
+
+ st->mouse_pixel =
+ get_pixel_resource (dpy, cmap, "mouseForeground", "MouseForeground");
+ st->mouse_ball = -1;
+
+ if (st->mode != ball_mode)
+ {
+ int size = (st->segments ? st->segments : 1);
+ st->point_stack_size = size * (st->npoints + 1);
+ st->point_stack = (XPoint *) calloc (st->point_stack_size, sizeof (XPoint));
+ st->point_stack_fp = 0;
+ }
+
+ gcv.line_width = (st->mode == tail_mode
+ ? (st->global_size ? st->global_size : (MAX_SIZE * 2 / 3))
+ : 1);
+ gcv.cap_style = (st->mode == tail_mode ? CapRound : CapButt);
+
+ if (mono_p)
+ gcv.foreground = get_pixel_resource(dpy, cmap, "foreground", "Foreground");
+ else
+ gcv.foreground = st->colors[st->fg_index].pixel;
+ st->draw_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+
+ gcv.foreground = get_pixel_resource(dpy, cmap, "background", "Background");
+ st->erase_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle,&gcv);
+
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, st->draw_gc, False);
+ jwxyz_XSetAntiAliasing (dpy, st->erase_gc, False);
+#endif
+
+ size_scale = 3;
+ if (xgwa.width < 100 || xgwa.height < 100) /* tiny windows */
+ size_scale = 0.75;
+
+ /* let's make the balls bigger by default */
+#define rand_size() (size_scale * (8 + (random () % 7)))
+
+ if (st->orbit_p && !st->global_size)
+ /* To orbit, all objects must be the same mass, or the math gets
+ really hairy... */
+ st->global_size = rand_size ();
+
+ RETRY_NO_ORBIT:
+ th = frand (M_PI+M_PI);
+ for (i = 0; i < st->npoints; i++)
+ {
+ int new_size = (st->global_size ? st->global_size : rand_size ());
+ st->balls [i].dx = 0;
+ st->balls [i].dy = 0;
+ st->balls [i].size = new_size;
+ st->balls [i].mass = (new_size * new_size * 10);
+ st->balls [i].x = midx + r * cos (i * ((M_PI+M_PI) / st->npoints) + th);
+ st->balls [i].y = midy + r * sin (i * ((M_PI+M_PI) / st->npoints) + th);
+ if (! st->orbit_p)
+ {
+ st->balls [i].vx = vx ? vx : ((6.0 - (random () % 11)) / 8.0);
+ st->balls [i].vy = vy ? vy : ((6.0 - (random () % 11)) / 8.0);
+ }
+ if (mono_p || st->mode != ball_mode)
+ st->balls [i].pixel_index = -1;
+ else if (st->glow_p)
+ st->balls [i].pixel_index = 0;
+ else
+ st->balls [i].pixel_index = random() % st->ncolors;
+ }
+
+ /* This lets modes where the points don't really have any size use the whole
+ window. Otherwise, since the points still have a positive size
+ assigned to them, they will be bounced somewhat early. Mass and size are
+ seperate, so this shouldn't cause problems. It's a bit kludgy, tho.
+ */
+ if(st->mode == line_mode || st->mode == spline_mode ||
+ st->mode == spline_filled_mode || st->mode == polygon_mode)
+ {
+ for(i = 1; i < st->npoints; i++)
+ {
+ st->balls[i].size = 0;
+ }
+ }
+
+ if (st->orbit_p)
+ {
+ double a = 0;
+ double v;
+ double v_mult = get_float_resource (dpy, "vMult", "Float");
+ if (v_mult == 0.0) v_mult = 1.0;
+
+ for (i = 1; i < st->npoints; i++)
+ {
+ double _2ipi_n = (2 * i * M_PI / st->npoints);
+ double x = r * cos (_2ipi_n);
+ double y = r * sin (_2ipi_n);
+ double distx = r - x;
+ double dist2 = (distx * distx) + (y * y);
+ double dist = sqrt (dist2);
+ double a1 = ((st->balls[i].mass / dist2) *
+ ((dist < st->threshold) ? -1.0 : 1.0) *
+ (distx / dist));
+ a += a1;
+ }
+ if (a < 0.0)
+ {
+ /* "domain error: forces on balls too great" */
+ fprintf (stderr, "%s: window too small for these orbit settings.\n",
+ progname);
+ st->orbit_p = False;
+ goto RETRY_NO_ORBIT;
+ }
+ v = sqrt (a * r) * v_mult;
+ for (i = 0; i < st->npoints; i++)
+ {
+ double k = ((2 * i * M_PI / st->npoints) + th);
+ st->balls [i].vx = -v * sin (k);
+ st->balls [i].vy = v * cos (k);
+ }
+ }
+
+ if (mono_p) st->glow_p = False;
+
+ XClearWindow (dpy, window);
+ return st;
+}
+
+static void
+compute_force (struct state *st, int i, double *dx_ret, double *dy_ret)
+{
+ int j;
+ double x_dist, y_dist, dist, dist2;
+ *dx_ret = 0;
+ *dy_ret = 0;
+ for (j = 0; j < st->npoints; j++)
+ {
+ if (i == j) continue;
+ x_dist = st->balls [j].x - st->balls [i].x;
+ y_dist = st->balls [j].y - st->balls [i].y;
+ dist2 = (x_dist * x_dist) + (y_dist * y_dist);
+ dist = sqrt (dist2);
+
+ if (dist > 0.1) /* the balls are not overlapping */
+ {
+ double new_acc = ((st->balls[j].mass / dist2) *
+ ((dist < st->threshold) ? -1.0 : 1.0));
+ double new_acc_dist = new_acc / dist;
+ *dx_ret += new_acc_dist * x_dist;
+ *dy_ret += new_acc_dist * y_dist;
+ }
+ else
+ { /* the balls are overlapping; move randomly */
+ *dx_ret += (frand (10.0) - 5.0);
+ *dy_ret += (frand (10.0) - 5.0);
+ }
+ }
+}
+
+
+/* Draws meters along the diagonal for the x velocity */
+static void
+draw_meter_x(Display *dpy, Window window, struct state *st, int i, int alone)
+{
+ XWindowAttributes xgwa;
+ int x1,x2,y,w1,w2,h;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ /* set the width of the bars to use */
+ if(xgwa.height < BAR_SIZE*st->npoints)
+ {
+ y = i*(xgwa.height/st->npoints);
+ h = (xgwa.height/st->npoints) - 2;
+ }
+ else
+ {
+ y = BAR_SIZE*i;
+ h = BAR_SIZE - 2;
+ }
+
+ if(alone)
+ {
+ x1 = xgwa.width/2;
+ x2 = x1;
+ }
+ else
+ {
+ x1 = i*(h+2);
+ if(x1 < i)
+ x1 = i;
+ x2 = x1;
+ }
+
+ if(y<1) y=i;
+ if(h<1) h=1;
+
+ w1 = (int)(20*st->x_vels[i]);
+ w2 = (int)(20*st->balls[i].vx);
+ st->x_vels[i] = st->balls[i].vx;
+
+ if (w1<0) {
+ w1=-w1;
+ x1=x1-w1;
+ }
+ if (w2<0) {
+ w2=-w2;
+ x2=x2-w2;
+ }
+ XDrawRectangle(dpy,window,st->erase_gc,x1+(h+2)/2,y,w1,h);
+ XDrawRectangle(dpy,window,st->draw_gc,x2+(h+2)/2,y,w2,h);
+}
+
+/* Draws meters along the diagonal for the y velocity.
+ Is there some way to make draw_meter_x and draw_meter_y
+ one function instead of two without making them completely unreadable?
+*/
+static void
+draw_meter_y (Display *dpy, Window window, struct state *st, int i, int alone)
+{
+ XWindowAttributes xgwa;
+ int y1,y2,x,h1,h2,w;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ if(xgwa.height < BAR_SIZE*st->npoints){ /*needs to be height still */
+ x = i*(xgwa.height/st->npoints);
+ w = (xgwa.height/st->npoints) - 2;
+ }
+ else{
+ x = BAR_SIZE*i;
+ w = BAR_SIZE - 2;
+ }
+
+ if(alone)
+ {
+ y1 = xgwa.height/2;
+ y2 = y1;
+ }
+ else
+ {
+ y1 = i*(w+2);
+ if(y1 < i)
+ y1 = i;
+ y2 = y1;
+ }
+
+ if(x < 1) x = i;
+ if(w < 1) w = 1;
+
+ h1 = (int)(20*st->y_vels[i]);
+ h2 = (int)(20*st->balls[i].vy);
+ st->y_vels[i] = st->balls[i].vy;
+
+ if (h1<0) {
+ h1=-h1;
+ y1=y1-h1;
+ }
+ if (h2<0) {
+ h2=-h2;
+ y2=y2-h2;
+ }
+ XDrawRectangle(dpy,window,st->erase_gc,x,y1+(w+2)/2,w,h1);
+ XDrawRectangle(dpy,window,st->draw_gc,x,y2+(w+2)/2,w,h2);
+}
+
+
+/* Draws meters of the total speed of the balls */
+static void
+draw_meter_speed (Display *dpy, Window window, struct state *st, int i)
+{
+ XWindowAttributes xgwa;
+ int y,x1,x2,h,w1,w2;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ if(xgwa.height < BAR_SIZE*st->npoints)
+ {
+ y = i*(xgwa.height/st->npoints);
+ h = (xgwa.height/st->npoints) - 2;
+ }
+ else{
+ y = BAR_SIZE*i;
+ h = BAR_SIZE - 2;
+ }
+
+ x1 = 0;
+ x2 = x1;
+
+ if(y < 1) y = i;
+ if(h < 1) h = 1;
+
+ w1 = (int)(5*st->speeds[i]);
+ w2 = (int)(5*(st->balls[i].vy*st->balls[i].vy+st->balls[i].vx*st->balls[i].vx));
+ st->speeds[i] = st->balls[i].vy*st->balls[i].vy+st->balls[i].vx*st->balls[i].vx;
+
+ XDrawRectangle(dpy,window,st->erase_gc,x1,y,w1,h);
+ XDrawRectangle(dpy,window,st->draw_gc, x2,y,w2,h);
+}
+
+/* Returns the position of the mouse relative to the root window.
+ */
+static void
+query_mouse (Display *dpy, Window win, int *x, int *y)
+{
+ Window root1, child1;
+ int mouse_x, mouse_y, root_x, root_y;
+ unsigned int mask;
+ if (XQueryPointer (dpy, win, &root1, &child1,
+ &root_x, &root_y, &mouse_x, &mouse_y, &mask))
+ {
+ *x = mouse_x;
+ *y = mouse_y;
+ }
+ else
+ {
+ *x = -9999;
+ *y = -9999;
+ }
+}
+
+static unsigned long
+attraction_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int last_point_stack_fp = st->point_stack_fp;
+
+ int i, radius = st->global_size/2;
+
+ st->total_ticks++;
+
+ if(st->global_size == 0)
+ radius = (MAX_SIZE / 3);
+
+ if(st->graph_mode != graph_none)
+ {
+ if(st->graph_mode == graph_both)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_x(dpy, window, st, i, 0);
+ draw_meter_y(dpy, window, st, i, 0);
+ }
+ }
+ else if(st->graph_mode == graph_x)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_x(dpy, window, st, i, 1);
+ }
+ }
+ else if(st->graph_mode == graph_y)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_y(dpy, window, st, i, 1);
+ }
+ }
+ else if(st->graph_mode == graph_speed)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_speed(dpy, window, st, i);
+ }
+ }
+
+ }
+
+ /* compute the force of attraction/repulsion among all balls */
+ for (i = 0; i < st->npoints; i++)
+ compute_force (st, i, &st->balls[i].dx, &st->balls[i].dy);
+
+ /* move the balls according to the forces now in effect */
+ for (i = 0; i < st->npoints; i++)
+ {
+ double old_x = st->balls[i].x;
+ double old_y = st->balls[i].y;
+ double new_x, new_y;
+ int size = st->balls[i].size;
+
+ st->balls[i].vx += st->balls[i].dx;
+ st->balls[i].vy += st->balls[i].dy;
+
+ /* "don't let them get too fast: impose a terminal velocity
+ (actually, make the medium have friction)"
+ Well, what this first step really does is give the medium a
+ viscosity of .9 for balls going over the speed limit. Anyway,
+ this is now optional
+ */
+ if (fabs(st->balls[i].vx) > 10 && st->maxspeed_p)
+ {
+ st->balls[i].vx *= 0.9;
+ st->balls[i].dx = 0;
+ }
+ if (st->viscosity != 1)
+ {
+ st->balls[i].vx *= st->viscosity;
+ }
+
+ if (fabs(st->balls[i].vy) > 10 && st->maxspeed_p)
+ {
+ st->balls[i].vy *= 0.9;
+ st->balls[i].dy = 0;
+ }
+ if (st->viscosity != 1)
+ {
+ st->balls[i].vy *= st->viscosity;
+ }
+
+ st->balls[i].x += st->balls[i].vx;
+ st->balls[i].y += st->balls[i].vy;
+
+
+ /* bounce off the walls if desired
+ note: a ball is actually its upper left corner */
+ if(st->walls_p)
+ {
+ if(st->cbounce_p) /* with correct bouncing */
+ {
+ /* so long as it's out of range, keep bouncing */
+ /* limit the maximum number to bounce to 4.*/
+ int bounce_allowed = 4;
+
+ while( bounce_allowed && (
+ (st->balls[i].x >= (st->xlim - st->balls[i].size)) ||
+ (st->balls[i].y >= (st->ylim - st->balls[i].size)) ||
+ (st->balls[i].x <= 0) ||
+ (st->balls[i].y <= 0) )
+ )
+ {
+ bounce_allowed--;
+ if (st->balls[i].x >= (st->xlim - st->balls[i].size))
+ {
+ st->balls[i].x = (2*(st->xlim - st->balls[i].size) - st->balls[i].x);
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y >= (st->ylim - st->balls[i].size))
+ {
+ st->balls[i].y = (2*(st->ylim - st->balls[i].size) - st->balls[i].y);
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ if (st->balls[i].x <= 0)
+ {
+ st->balls[i].x = -st->balls[i].x;
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y <= 0)
+ {
+ st->balls[i].y = -st->balls[i].y;
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ }
+ }
+ else /* with old bouncing */
+ {
+ if (st->balls[i].x >= (st->xlim - st->balls[i].size))
+ {
+ st->balls[i].x = (st->xlim - st->balls[i].size - 1);
+ if (st->balls[i].vx > 0) /* why is this check here? */
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y >= (st->ylim - st->balls[i].size))
+ {
+ st->balls[i].y = (st->ylim - st->balls[i].size - 1);
+ if (st->balls[i].vy > 0)
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ if (st->balls[i].x <= 0)
+ {
+ st->balls[i].x = 0;
+ if (st->balls[i].vx < 0)
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y <= 0)
+ {
+ st->balls[i].y = 0;
+ if (st->balls[i].vy < 0)
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ }
+ }
+
+ if (i == st->mouse_ball)
+ {
+ int x, y;
+ query_mouse (dpy, window, &x, &y);
+ if (st->mode == ball_mode)
+ {
+ x -= st->balls[i].size / 2;
+ y -= st->balls[i].size / 2;
+ }
+
+ st->balls[i].x = x;
+ st->balls[i].y = y;
+ }
+
+ new_x = st->balls[i].x;
+ new_y = st->balls[i].y;
+
+ if (!mono_p)
+ {
+ if (st->mode == ball_mode)
+ {
+ if (st->glow_p)
+ {
+ /* make color saturation be related to particle
+ acceleration. */
+ double limit = 0.5;
+ double s, fraction;
+ double vx = st->balls [i].dx;
+ double vy = st->balls [i].dy;
+ if (vx < 0) vx = -vx;
+ if (vy < 0) vy = -vy;
+ fraction = vx + vy;
+ if (fraction > limit) fraction = limit;
+
+ s = 1 - (fraction / limit);
+ st->balls[i].pixel_index = (st->ncolors * s);
+ }
+ XSetForeground (dpy, st->draw_gc,
+ (i == st->mouse_ball
+ ? st->mouse_pixel
+ : st->colors[st->balls[i].pixel_index].pixel));
+ }
+ }
+
+ if (st->mode == ball_mode)
+ {
+ XFillArc (dpy, window, st->erase_gc, (int) old_x, (int) old_y,
+ size, size, 0, 360*64);
+ XFillArc (dpy, window, st->draw_gc, (int) new_x, (int) new_y,
+ size, size, 0, 360*64);
+ }
+ else
+ {
+ st->point_stack [st->point_stack_fp].x = new_x;
+ st->point_stack [st->point_stack_fp].y = new_y;
+ st->point_stack_fp++;
+ }
+ }
+
+ /* draw the lines or polygons after computing all points */
+ if (st->mode != ball_mode)
+ {
+ st->point_stack [st->point_stack_fp].x = st->balls [0].x; /* close the polygon */
+ st->point_stack [st->point_stack_fp].y = st->balls [0].y;
+ st->point_stack_fp++;
+ if (st->point_stack_fp == st->point_stack_size)
+ st->point_stack_fp = 0;
+ else if (st->point_stack_fp > st->point_stack_size) /* better be aligned */
+ abort ();
+ if (!mono_p)
+ {
+ if (st->color_tick++ == st->color_shift)
+ {
+ st->color_tick = 0;
+ st->fg_index = (st->fg_index + 1) % st->ncolors;
+ XSetForeground (dpy, st->draw_gc, st->colors[st->fg_index].pixel);
+ }
+ }
+ }
+
+ switch (st->mode)
+ {
+ case ball_mode:
+ break;
+ case line_mode:
+ if (st->segments > 0)
+ XDrawLines (dpy, window, st->erase_gc, st->point_stack + st->point_stack_fp,
+ st->npoints + 1, CoordModeOrigin);
+ XDrawLines (dpy, window, st->draw_gc, st->point_stack + last_point_stack_fp,
+ st->npoints + 1, CoordModeOrigin);
+ break;
+ case polygon_mode:
+ if (st->segments > 0)
+ XFillPolygon (dpy, window, st->erase_gc, st->point_stack + st->point_stack_fp,
+ st->npoints + 1, (st->npoints == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ XFillPolygon (dpy, window, st->draw_gc, st->point_stack + last_point_stack_fp,
+ st->npoints + 1, (st->npoints == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ break;
+ case tail_mode:
+ {
+ for (i = 0; i < st->npoints; i++)
+ {
+ int index = st->point_stack_fp + i;
+ int next_index = (index + (st->npoints + 1)) % st->point_stack_size;
+ if(st->no_erase_yet == 1)
+ {
+ if(st->total_ticks >= st->segments)
+ {
+ st->no_erase_yet = 0;
+ XDrawLine (dpy, window, st->erase_gc,
+ st->point_stack [index].x + radius,
+ st->point_stack [index].y + radius,
+ st->point_stack [next_index].x + radius,
+ st->point_stack [next_index].y + radius);
+ }
+ }
+ else
+ {
+ XDrawLine (dpy, window, st->erase_gc,
+ st->point_stack [index].x + radius,
+ st->point_stack [index].y + radius,
+ st->point_stack [next_index].x + radius,
+ st->point_stack [next_index].y + radius);
+ }
+ index = last_point_stack_fp + i;
+ next_index = (index - (st->npoints + 1)) % st->point_stack_size;
+ if (next_index < 0) next_index += st->point_stack_size;
+ if (st->point_stack [next_index].x == 0 &&
+ st->point_stack [next_index].y == 0)
+ continue;
+ XDrawLine (dpy, window, st->draw_gc,
+ st->point_stack [index].x + radius,
+ st->point_stack [index].y + radius,
+ st->point_stack [next_index].x + radius,
+ st->point_stack [next_index].y + radius);
+ }
+ }
+ break;
+ case spline_mode:
+ case spline_filled_mode:
+ {
+ if (! st->spl) st->spl = make_spline (st->npoints);
+ if (st->segments > 0)
+ {
+ for (i = 0; i < st->npoints; i++)
+ {
+ st->spl->control_x [i] = st->point_stack [st->point_stack_fp + i].x;
+ st->spl->control_y [i] = st->point_stack [st->point_stack_fp + i].y;
+ }
+ compute_closed_spline (st->spl);
+ if (st->mode == spline_filled_mode)
+ XFillPolygon (dpy, window, st->erase_gc, st->spl->points, st->spl->n_points,
+ (st->spl->n_points == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ else
+ XDrawLines (dpy, window, st->erase_gc, st->spl->points, st->spl->n_points,
+ CoordModeOrigin);
+ }
+ for (i = 0; i < st->npoints; i++)
+ {
+ st->spl->control_x [i] = st->point_stack [last_point_stack_fp + i].x;
+ st->spl->control_y [i] = st->point_stack [last_point_stack_fp + i].y;
+ }
+ compute_closed_spline (st->spl);
+ if (st->mode == spline_filled_mode)
+ XFillPolygon (dpy, window, st->draw_gc, st->spl->points, st->spl->n_points,
+ (st->spl->n_points == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ else
+ XDrawLines (dpy, window, st->draw_gc, st->spl->points, st->spl->n_points,
+ CoordModeOrigin);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+ return st->delay;
+}
+
+static void
+attraction_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xlim = w;
+ st->ylim = h;
+}
+
+static Bool
+attraction_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+
+ if (event->xany.type == ButtonPress)
+ {
+ int i;
+ if (st->mouse_ball != -1) /* second down-click? drop the ball. */
+ {
+ st->mouse_ball = -1;
+ return True;
+ }
+ else
+ {
+ /* When trying to pick up a ball, first look for a click directly
+ inside the ball; but if we don't find it, expand the radius
+ outward until we find something nearby.
+ */
+ int x = event->xbutton.x;
+ int y = event->xbutton.y;
+ float max = 10 * (st->global_size ? st->global_size : MAX_SIZE);
+ float step = max / 100;
+ float r2;
+ for (r2 = step; r2 < max; r2 += step)
+ {
+ for (i = 0; i < st->npoints; i++)
+ {
+ float d = ((st->balls[i].x - x) * (st->balls[i].x - x) +
+ (st->balls[i].y - y) * (st->balls[i].y - y));
+ float r = st->balls[i].size;
+ if (r2 > r) r = r2;
+ if (d < r*r)
+ {
+ st->mouse_ball = i;
+ return True;
+ }
+ }
+ }
+ }
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease) /* drop the ball */
+ {
+ st->mouse_ball = -1;
+ return True;
+ }
+
+
+
+ return False;
+}
+
+static void
+attraction_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->balls) free (st->balls);
+ if (st->x_vels) free (st->x_vels);
+ if (st->y_vels) free (st->y_vels);
+ if (st->speeds) free (st->speeds);
+ if (st->point_stack) free (st->point_stack);
+ if (st->colors) free (st->colors);
+ if (st->spl) free_spline (st->spl);
+
+ free (st);
+}
+
+
+static const char *attraction_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*mode: balls",
+ "*graphmode: none",
+ "*points: 0",
+ "*size: 0",
+ "*colors: 200",
+ "*threshold: 200",
+ "*delay: 10000",
+ "*glow: false",
+ "*walls: true",
+ "*maxspeed: true",
+ "*cbounce: true",
+ "*viscosity: 1.0",
+ "*orbit: false",
+ "*colorShift: 3",
+ "*segments: 500",
+ "*vMult: 0.9",
+ "*radius: 0",
+ "*vx: 0",
+ "*vy: 0",
+ "*mouseForeground: white",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec attraction_options [] = {
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-graphmode", ".graphmode", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-points", ".points", XrmoptionSepArg, 0 },
+ { "-color-shift", ".colorShift", XrmoptionSepArg, 0 },
+ { "-threshold", ".threshold", XrmoptionSepArg, 0 },
+ { "-segments", ".segments", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-vx", ".vx", XrmoptionSepArg, 0 },
+ { "-vy", ".vy", XrmoptionSepArg, 0 },
+ { "-vmult", ".vMult", XrmoptionSepArg, 0 },
+ { "-viscosity", ".viscosity", XrmoptionSepArg, 0 },
+ { "-glow", ".glow", XrmoptionNoArg, "true" },
+ { "-noglow", ".glow", XrmoptionNoArg, "false" },
+ { "-orbit", ".orbit", XrmoptionNoArg, "true" },
+ { "-nowalls", ".walls", XrmoptionNoArg, "false" },
+ { "-walls", ".walls", XrmoptionNoArg, "true" },
+ { "-nomaxspeed", ".maxspeed", XrmoptionNoArg, "false" },
+ { "-maxspeed", ".maxspeed", XrmoptionNoArg, "true" },
+ { "-correct-bounce", ".cbounce", XrmoptionNoArg, "false" },
+ { "-fast-bounce", ".cbounce", XrmoptionNoArg, "true" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Attraction", attraction)
diff --git a/hacks/attraction.man b/hacks/attraction.man
new file mode 100644
index 0000000..6630355
--- /dev/null
+++ b/hacks/attraction.man
@@ -0,0 +1,214 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
+.SH NAME
+attraction - interactions of opposing forces
+.SH SYNOPSIS
+.B attraction
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-points \fIint\fP] [\-threshold \fIint\fP]
+[\-mode balls | lines | polygons | splines | filled-splines | tails ]
+[\-size \fIint\fP] [\-segments \fIint\fP] [\-delay \fIusecs\fP]
+[\-color-shift \fIint\fP] [\-radius \fIint\fP]
+[\-vx \fIint\fP] [\-vy \fIint\fP] [\-glow] [\-noglow]
+[\-orbit] [\-viscosity \fIfloat\fP]
+[\-walls] [\-nowalls] [\-maxspeed] [\-nomaxspeed]
+[\-correct-bounce] [\-fast-bounce]
+[\-fps]
+.SH DESCRIPTION
+The \fIattraction\fP program has several visually different modes of
+operation, all of which are based on the interactions of a set of control
+points which attract each other up to a certain distance, and then begin
+to repel each other. The attraction/repulsion is proportional to the
+distance between any two particles.
+.SH OPTIONS
+.I attraction
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-points integer
+How many control points should be used, or 0 to select the number randomly.
+Default 0. Between 3 and 15 works best.
+.TP 8
+.B \-threshold integer
+The distance (in pixels) from each particle at which the attractive force
+becomes repulsive. Default 100.
+.TP 8
+.B \-mode "balls | lines | polygons | tails | splines | filled-splines"
+In \fIballs\fP mode (the default) the control points are drawn as filled
+circles. The larger the circle, the more massive the particle.
+
+In \fIlines\fP mode, the control points are connected by straight lines;
+the effect is something like \fIqix\fP.
+
+In \fIpolygons\fP mode, the control points are connected by straight
+lines, and filled in. This is most interesting in color.
+
+In \fIsplines\fP mode, a closed spline is interpolated from the control
+points.
+
+In \fIfilled-splines\fP mode, the splines are filled in instead of being
+outlines. This is most interesting in color.
+
+In \fItails\fP mode, the path which each particle follows is indicated
+by a worm-like trail, whose length is controlled by the \fIsegments\fP
+parameter.
+.TP 8
+.B \-size integer
+The size of the balls in pixels, or 0, meaning to select the sizes
+randomly (the default.) If this is specified, then all balls will be
+the same size. This option has an effect in all modes, since the ``size''
+of the balls controls their mass.
+.TP 8
+.B \-segments integer
+If in \fIlines\fP or \fIpolygons\fP mode, how many sets of line segments
+or polygons should be drawn. Default 500. This has no effect in \fIballs\fP
+mode. If \fIsegments\fP is 0, then no segments will ever be erased (this
+is only useful in color.)
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default 10000, or about 0.01 seconds.
+.TP 8
+.B \-color-shift int
+If on a color display, the color of the line segments or polygons will
+cycle through the color map. This specifies how many lines will be drawn
+before a new color is chosen. (When a small number of colors are available,
+increasing this value will yield smoother transitions.) Default 3.
+This has no effect in \fIballs\fP mode.
+.TP 8
+.B \-radius
+The size in pixels of the circle on which the points are initially positioned.
+The default is slightly smaller than the size of the window.
+.TP 8
+.B \-glow
+This is consulted only in \fIballs\fP mode. If this is specified, then
+the saturation of the colors of the points will vary according to their
+current acceleration. This has the effect that the balls flare brighter
+when they are reacting to each other most strongly.
+
+In \fIglow\fP mode, all of the balls will be drawn the same (random)
+color, modulo the saturation shifts. In non-glow mode, the balls will
+each be drawn in a random color that doesn't change.
+.TP 8
+.B \-noglow
+Don't do ``glowing.'' This is the default.
+.TP 8
+.B \-vx pixels
+.TP 8
+.B \-vy pixels
+Initial velocity of the balls. This has no effect in \fB\-orbit\fP mode.
+.TP 8
+.B \-orbit
+Make the initial force on each ball be tangential to the circle on which
+they are initially placed, with the right velocity to hold them in orbit
+about each other. After a while, roundoff errors will cause the orbit
+to decay.
+.TP 8
+.B \-vmult float
+In orbit mode, the initial velocity of the balls is multiplied by this;
+a number less than 1 will make the balls pull closer together, and a larger
+number will make them move apart. The default is 0.9, meaning a slight
+inward pull.
+.TP 8
+.B \-viscosity float
+This sets the viscosity of the hypothetical fluid through which the control
+points move; the default is 1, meaning no resistance. Values higher than 1
+aren't interesting; lower values cause less motion.
+
+One interesting thing to try is
+.EX
+attraction -viscosity 0.8 -points 300 -size 10 -geometry =500x500
+.EE
+Give it a few seconds to settle down into a stable clump, and then move
+the drag the mouse through it to make "waves".
+.TP 8
+.B \-nowalls
+This will cause the balls to continue on past the edge of the
+screen or window. They will still be kept track of and can come back.
+.TP 8
+.B \-walls
+This will cause the balls to bounce when they get
+to the edge of the screen or window. This is the default behavior.
+.TP 8
+.B \-maxspeed
+Imposes a maximum speed (default). If a ball ends up going faster than
+this, it will be treated as though there were .9 viscosity until it is
+under the limit. This stops the balls from continually accelerating (which
+they have a tendency to do), but also causes balls moving very fast to
+tend to clump in the lower right corner.
+.TP 8
+.B \-nomaxspeed
+If this is specified, no maximum speed is set for the balls.
+.TP 8
+.B \-fast-bounce
+Uses the old, simple bouncing algorithm (default). This simply moves any
+ball that is out of bounds back to a wall and reverses its velocity.
+This works fine for most cases, but under some circumstances, the
+simplification can lead to annoying effects.
+.TP 8
+.B \-correct-bounce
+Uses a more intelligent bouncing algorithm. This method actually reflects
+the balls off the walls until they are within bounds. This can be slow
+if balls are bouncing a whole lot, perhaps because of -nomaxspeed.
+.TP 8
+.B \-graphmode none | x | y | both | speed
+For "x", "y", and "both", displays the given velocities of each ball as a
+bar graph in the same window as the balls. For "speed", displays the total
+speed of each ball. Default is "none".
+.BR
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for any
+purpose is hereby granted without fee, provided that the above copyright
+notice appear in all copies and that both that copyright notice and this
+permission notice appear in supporting documentation. No representations are
+made about the suitability of this software for any purpose. It is provided
+"as is" without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Viscosity support by Philip Edward Cutone, III.
+
+Walls, speed limit options, new bouncing, graphs, and tail mode fix by
+Matthew Strait. 31 March 2001
diff --git a/hacks/automata.h b/hacks/automata.h
new file mode 100644
index 0000000..ad30d47
--- /dev/null
+++ b/hacks/automata.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * automata.c - special stuff for automata modes
+ *
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#define NUMSTIPPLES 11
+#define STIPPLESIZE 8
+
+static XPoint hexagonUnit[6] =
+{
+ {0, 0},
+ {1, 1},
+ {0, 2},
+ {-1, 1},
+ {-1, -1},
+ {0, -2}
+};
+
+static XPoint triangleUnit[2][3] =
+{
+ {
+ {0, 0},
+ {1, -1},
+ {0, 2}
+ },
+ {
+ {0, 0},
+ {-1, 1},
+ {0, -2}
+ }
+};
+
+
+#ifdef DO_STIPPLE
+static unsigned char stipples[NUMSTIPPLES][STIPPLESIZE] =
+{
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* white */
+ {0x11, 0x22, 0x11, 0x22, 0x11, 0x22, 0x11, 0x22}, /* grey+white | stripe */
+ {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}, /* spots */
+ {0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11}, /* lt. / stripe */
+ {0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, /* | bars */
+ {0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa}, /* 50% grey */
+ {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00}, /* - bars */
+ {0xee, 0xdd, 0xbb, 0x77, 0xee, 0xdd, 0xbb, 0x77}, /* dark \ stripe */
+ {0xff, 0x99, 0x99, 0xff, 0xff, 0x99, 0x99, 0xff}, /* spots */
+ {0xaa, 0xff, 0xff, 0x55, 0xaa, 0xff, 0xff, 0x55}, /* black+grey - stripe */
+ {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} /* black */
+};
+#endif /* DO_STIPPLE */
+
diff --git a/hacks/barcode.c b/hacks/barcode.c
new file mode 100644
index 0000000..31574bd
--- /dev/null
+++ b/hacks/barcode.c
@@ -0,0 +1,1995 @@
+/* barcode, draw some barcodes
+ * by Dan Bornstein, danfuzz@milk.com
+ * Copyright (c) 2003 Dan Bornstein. All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * See the included man page for more details.
+ */
+
+#include <math.h>
+#include <time.h>
+#include "screenhack.h"
+
+/* non-user-modifiable immutable definitions */
+
+#define FLOAT double
+
+/* random float in the range (0..1) */
+#define RAND_FLOAT_01 \
+ (((FLOAT) ((random() >> 8) & 0xffff)) / ((FLOAT) 0x10000))
+
+#define BARCODE_WIDTH (164)
+#define BARCODE_HEIGHT (69)
+#define MAX_MAG (7)
+
+
+/* simple bitmap structure */
+
+typedef struct
+{
+ int width;
+ int height;
+ int widthBytes;
+ char *buf;
+}
+Bitmap;
+
+
+
+/* the model */
+
+typedef struct
+{
+ int x; /* x coordinate of the left of the barcode */
+ int y; /* y coordinate of the left of the barcode */
+ int mag; /* magnfication factor */
+ Bitmap *bitmap; /* the bitmap */
+ char code[128]; /* the barcode string */
+ unsigned long pixel; /* the color */
+}
+Barcode;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ /* parameters that are user configurable */
+
+ /* delay (usec) between iterations */
+ int delay;
+
+ /* width and height of the window */
+ int windowWidth;
+ int windowHeight;
+
+ Visual *visual; /* the visual to use */
+ Colormap cmap; /* the colormap of the window */
+
+ GC theGC; /* GC for drawing */
+ unsigned long fg_pixel, grid_pixel;
+ Bool button_down_p;
+ int grid_alloced_p;
+ char *strings[200];
+
+ Barcode *barcodes; /* array of barcodes */
+ int barcode_count; /* how many barcodes are currently active */
+ int barcode_max; /* the maximum number of active barcodes */
+
+ XImage *theImage; /* ginormo image for drawing */
+ Bitmap *theBitmap; /* ginormo bitmap for drawing */
+
+ enum { BC_SCROLL, BC_GRID, BC_CLOCK12, BC_CLOCK24 } mode;
+
+ int grid_w;
+ int grid_h;
+};
+
+/* a bunch of words */
+static const char *words[] =
+{
+ "abdomen",
+ "abeyance",
+ "abhorrence",
+ "abrasion",
+ "abstraction",
+ "acid",
+ "addiction",
+ "alertness",
+ "Algeria",
+ "anxiety",
+ "aorta",
+ "argyle socks",
+ "attrition",
+ "axis of evil",
+ "bamboo",
+ "bangle",
+ "bankruptcy",
+ "baptism",
+ "beer",
+ "bellicosity",
+ "bells",
+ "belly",
+ "bliss",
+ "bogosity",
+ "boobies",
+ "boobs",
+ "booty",
+ "bread",
+ "bubba",
+ "burrito",
+ "California",
+ "capybara",
+ "cardinality",
+ "caribou",
+ "carnage",
+ "children",
+ "chocolate",
+ "CLONE",
+ "cock",
+ "constriction",
+ "contrition",
+ "cop",
+ "corpse",
+ "cowboy",
+ "crabapple",
+ "craziness",
+ "cthulhu",
+ "Death",
+ "decepticon",
+ "deception",
+ "Decker",
+ "decoder",
+ "decoy",
+ "defenestration",
+ "democracy",
+ "dependency",
+ "despair",
+ "desperation",
+ "disease",
+ "disease",
+ "doberman",
+ "DOOM",
+ "dreams",
+ "dreams",
+ "drugs",
+ "easy",
+ "ebony",
+ "election",
+ "eloquence",
+ "emergency",
+ "eureka",
+ "excommunication",
+ "fat",
+ "fatherland",
+ "Faust",
+ "fear",
+ "fever",
+ "filth",
+ "flatulence",
+ "fluff",
+ "fnord",
+ "freedom",
+ "fruit",
+ "fruit",
+ "futility",
+ "gerbils",
+ "GOD",
+ "goggles",
+ "goobers",
+ "gorilla",
+ "halibut",
+ "handmaid",
+ "happiness",
+ "hate",
+ "helplessness",
+ "hemorrhoid",
+ "hermaphrodite",
+ "heroin",
+ "heroine",
+ "hope",
+ "hysteria",
+ "icepick",
+ "identity",
+ "ignorance",
+ "importance",
+ "individuality",
+ "inkling",
+ "insurrection",
+ "intoxicant",
+ "ire",
+ "irritant",
+ "jade",
+ "jaundice",
+ "Joyce",
+ "kidney stone",
+ "kitchenette",
+ "kiwi",
+ "lathe",
+ "lattice",
+ "lawyer",
+ "lemming",
+ "liquidation",
+ "lobbyist",
+ "love",
+ "lozenge",
+ "magazine",
+ "magnesium",
+ "malfunction",
+ "marmot",
+ "marshmallow",
+ "merit",
+ "merkin",
+ "mescaline",
+ "milk",
+ "mischief",
+ "mistrust",
+ "money",
+ "monkey",
+ "monkeybutter",
+ "nationalism",
+ "nature",
+ "neuron",
+ "noise",
+ "nomenclature",
+ "nutria",
+ "OBEY",
+ "ocelot",
+ "offspring",
+ "overseer",
+ "pain",
+ "pajamas",
+ "passenger",
+ "passion",
+ "Passover",
+ "peace",
+ "penance",
+ "persimmon",
+ "petticoat",
+ "pharmacist",
+ "PhD",
+ "pitchfork",
+ "plague",
+ "Poindexter",
+ "politician",
+ "pony",
+ "presidency",
+ "prison",
+ "prophecy",
+ "Prozac",
+ "punishment",
+ "punk rock",
+ "punk",
+ "pussy",
+ "quagmire",
+ "quarantine",
+ "quartz",
+ "rabies",
+ "radish",
+ "rage",
+ "readout",
+ "reality",
+ "rectum",
+ "reject",
+ "rejection",
+ "respect",
+ "revolution",
+ "roadrunner",
+ "rule",
+ "savor",
+ "scab",
+ "scalar",
+ "Scandinavia",
+ "schadenfreude",
+ "security",
+ "sediment",
+ "self worth",
+ "sickness",
+ "silicone",
+ "slack",
+ "slander",
+ "slavery",
+ "sledgehammer",
+ "smegma",
+ "smelly socks",
+ "sorrow",
+ "space program",
+ "stamen",
+ "standardization",
+ "stench",
+ "subculture",
+ "subversion",
+ "suffering",
+ "surrender",
+ "surveillance",
+ "synthesis",
+ "television",
+ "tenant",
+ "tendril",
+ "terror",
+ "terrorism",
+ "terrorist",
+ "the impossible",
+ "the unknown",
+ "toast",
+ "topography",
+ "truism",
+ "turgid",
+ "underbrush",
+ "underling",
+ "unguent",
+ "unusual",
+ "uplink",
+ "urge",
+ "valor",
+ "variance",
+ "vaudeville",
+ "vector",
+ "vegetarian",
+ "venom",
+ "verifiability",
+ "viagra",
+ "vibrator",
+ "victim",
+ "vignette",
+ "villainy",
+ "W.A.S.T.E.",
+ "wagon",
+ "waiver",
+ "warehouse",
+ "waste",
+ "waveform",
+ "whiffle ball",
+ "whorl",
+ "windmill",
+ "words",
+ "worm",
+ "worship",
+ "worship",
+ "Xanax",
+ "Xerxes",
+ "Xhosa",
+ "xylophone",
+ "yellow",
+ "yesterday",
+ "your nose",
+ "Zanzibar",
+ "zeal",
+ "zebra",
+ "zest",
+ "zinc"
+};
+
+#define WORD_COUNT (sizeof(words) / sizeof(char *))
+
+
+
+/* ----------------------------------------------------------------------------
+ * bitmap manipulation
+ */
+
+/* construct a new bitmap */
+static Bitmap *makeBitmap (int width, int height)
+{
+ Bitmap *result = malloc (sizeof (Bitmap));
+ result->width = width;
+ result->height = height;
+ result->widthBytes = (width + 7) / 8;
+ result->buf = calloc (1, height * result->widthBytes);
+ return result;
+}
+
+/* clear a bitmap */
+static void bitmapClear (Bitmap *b)
+{
+ memset (b->buf, 0, b->widthBytes * b->height);
+}
+
+#if 0
+/* free a bitmap */
+static void bitmapFree (Bitmap *b)
+{
+ free (b->buf);
+ free (b);
+}
+#endif
+
+
+/* get the byte value at the given byte-offset coordinates in the given
+ * bitmap */
+static int bitmapGetByte (Bitmap *b, int xByte, int y)
+{
+ if ((xByte < 0) ||
+ (xByte >= b->widthBytes) ||
+ (y < 0) ||
+ (y >= b->height))
+ {
+ /* out-of-range get returns 0 */
+ return 0;
+ }
+
+ return b->buf[b->widthBytes * y + xByte];
+}
+
+/* get the bit value at the given coordinates in the given bitmap */
+static int bitmapGet (Bitmap *b, int x, int y)
+{
+ int xbyte = x >> 3;
+ int xbit = x & 0x7;
+ int byteValue = bitmapGetByte (b, xbyte, y);
+
+ return (byteValue & (1 << xbit)) >> xbit;
+}
+
+/* set the bit value at the given coordinates in the given bitmap */
+static void bitmapSet (Bitmap *b, int x, int y, int value)
+{
+ int xbyte = x >> 3;
+ int xbit = x & 0x7;
+
+ if ((x < 0) ||
+ (x >= b->width) ||
+ (y < 0) ||
+ (y >= b->height))
+ {
+ /* ignore out-of-range set */
+ return;
+ }
+
+ if (value)
+ {
+ b->buf[b->widthBytes * y + xbyte] |= 1 << xbit;
+ }
+ else
+ {
+ b->buf[b->widthBytes * y + xbyte] &= ~(1 << xbit);
+ }
+}
+
+/* copy the given rectangle to the given destination from the given source. */
+static void bitmapCopyRect (Bitmap *dest, int dx, int dy,
+ Bitmap *src, int sx, int sy, int width, int height)
+{
+ int x, y;
+
+ for (y = 0; y < height; y++)
+ {
+ for (x = 0; x < width; x++)
+ {
+ bitmapSet (dest, x + dx, y + dy, bitmapGet (src, x + sx, y + sy));
+ }
+ }
+}
+
+/* draw a vertical line in the given bitmap */
+static void bitmapVlin (Bitmap *b, int x, int y1, int y2)
+{
+ while (y1 <= y2)
+ {
+ bitmapSet (b, x, y1, 1);
+ y1++;
+ }
+}
+
+/* scale a bitmap into another bitmap */
+static void bitmapScale (Bitmap *dest, Bitmap *src, int mag)
+{
+ int x, y, x2, y2;
+
+ for (y = 0; y < BARCODE_HEIGHT; y++)
+ {
+ for (x = 0; x < BARCODE_WIDTH; x++)
+ {
+ int v = bitmapGet (src, x, y);
+ for (x2 = 0; x2 < mag; x2++)
+ {
+ for (y2 = 0; y2 < mag; y2++)
+ {
+ bitmapSet (dest, x * mag + x2, y * mag + y2, v);
+ }
+ }
+ }
+ }
+}
+
+
+/* ----------------------------------------------------------------------------
+ * character generation
+ */
+
+static unsigned char font5x8Buf[] =
+{
+ 0x1e, 0x01, 0x06, 0x01, 0x1e, 0x00, 0x1e, 0x01, 0x06, 0x01, 0x1e, 0x00,
+ 0x1e, 0x01, 0x1e, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x1f, 0x08, 0x04, 0x08,
+ 0x1f, 0x00, 0x11, 0x1f, 0x11, 0x00, 0x1f, 0x01, 0x01, 0x00, 0x1f, 0x04,
+ 0x0a, 0x11, 0x00, 0x01, 0x00, 0x0e, 0x11, 0x11, 0x00, 0x0e, 0x11, 0x11,
+ 0x0e, 0x00, 0x1f, 0x08, 0x04, 0x08, 0x1f, 0x00, 0x44, 0x41, 0x4e, 0x20,
+ 0x42, 0x4f, 0x52, 0x4e, 0x53, 0x54, 0x45, 0x49, 0x4e, 0x21, 0x21, 0x00,
+ 0x66, 0x6e, 0x6f, 0x72, 0x64, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x05, 0x05, 0x05, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x0f, 0x05, 0x0f, 0x05, 0x05, 0x00,
+ 0x02, 0x0f, 0x01, 0x0f, 0x08, 0x0f, 0x04, 0x00, 0x0b, 0x0b, 0x08, 0x06,
+ 0x01, 0x0d, 0x0d, 0x00, 0x03, 0x05, 0x02, 0x05, 0x0d, 0x05, 0x0b, 0x00,
+ 0x04, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x04, 0x00, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x00,
+ 0x00, 0x09, 0x06, 0x0f, 0x06, 0x09, 0x00, 0x00, 0x00, 0x02, 0x02, 0x07,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x08, 0x08, 0x04, 0x06, 0x02, 0x01, 0x01, 0x00,
+ 0x0f, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x06, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x0f, 0x00, 0x0f, 0x09, 0x08, 0x0f, 0x01, 0x09, 0x0f, 0x00,
+ 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x0f, 0x00, 0x09, 0x09, 0x09, 0x0f,
+ 0x08, 0x08, 0x08, 0x00, 0x0f, 0x09, 0x01, 0x0f, 0x08, 0x09, 0x0f, 0x00,
+ 0x03, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0c,
+ 0x04, 0x04, 0x04, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x0f, 0x00,
+ 0x0f, 0x09, 0x09, 0x0f, 0x08, 0x08, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x06, 0x00,
+ 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00,
+ 0x0f, 0x09, 0x08, 0x0e, 0x02, 0x00, 0x02, 0x00, 0x0f, 0x09, 0x0d, 0x0d,
+ 0x0d, 0x01, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x09, 0x00,
+ 0x07, 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x00, 0x0f, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x0f, 0x00, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x00,
+ 0x0f, 0x01, 0x01, 0x0f, 0x01, 0x01, 0x0f, 0x00, 0x0f, 0x01, 0x01, 0x0f,
+ 0x01, 0x01, 0x01, 0x00, 0x0f, 0x01, 0x01, 0x0d, 0x09, 0x09, 0x0f, 0x00,
+ 0x09, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x09, 0x00, 0x07, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x07, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x05, 0x07, 0x00,
+ 0x09, 0x09, 0x09, 0x07, 0x09, 0x09, 0x09, 0x00, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x0f, 0x00, 0x09, 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x09, 0x00,
+ 0x09, 0x0b, 0x0d, 0x09, 0x09, 0x09, 0x09, 0x00, 0x0f, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x01, 0x01, 0x01, 0x00,
+ 0x0f, 0x09, 0x09, 0x09, 0x0b, 0x05, 0x0b, 0x00, 0x07, 0x09, 0x09, 0x07,
+ 0x09, 0x09, 0x09, 0x00, 0x0f, 0x01, 0x01, 0x0f, 0x08, 0x08, 0x0f, 0x00,
+ 0x0f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x0f, 0x00, 0x09, 0x09, 0x09, 0x09, 0x09, 0x05, 0x02, 0x00,
+ 0x09, 0x09, 0x09, 0x09, 0x0f, 0x0f, 0x09, 0x00, 0x09, 0x09, 0x05, 0x06,
+ 0x0a, 0x09, 0x09, 0x00, 0x09, 0x09, 0x09, 0x0f, 0x08, 0x08, 0x0f, 0x00,
+ 0x0f, 0x08, 0x08, 0x06, 0x01, 0x01, 0x0f, 0x00, 0x0e, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x0e, 0x00, 0x01, 0x01, 0x02, 0x06, 0x04, 0x08, 0x08, 0x00,
+ 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x02, 0x05, 0x05, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x02, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08,
+ 0x0f, 0x09, 0x0f, 0x00, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x09, 0x0f, 0x00,
+ 0x00, 0x00, 0x0f, 0x01, 0x01, 0x01, 0x0f, 0x00, 0x08, 0x08, 0x0f, 0x09,
+ 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x09, 0x0f, 0x01, 0x0f, 0x00,
+ 0x0e, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x09,
+ 0x09, 0x0f, 0x08, 0x0c, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x09, 0x09, 0x00,
+ 0x02, 0x00, 0x03, 0x02, 0x02, 0x02, 0x07, 0x00, 0x04, 0x00, 0x04, 0x04,
+ 0x04, 0x04, 0x05, 0x07, 0x01, 0x01, 0x09, 0x05, 0x03, 0x05, 0x09, 0x00,
+ 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x09, 0x0f,
+ 0x0f, 0x09, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x09, 0x09, 0x09, 0x09, 0x00,
+ 0x00, 0x00, 0x0f, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x09,
+ 0x09, 0x0f, 0x01, 0x01, 0x00, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x08, 0x08,
+ 0x00, 0x00, 0x0f, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x01,
+ 0x0f, 0x08, 0x0f, 0x00, 0x00, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x0e, 0x00,
+ 0x00, 0x00, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x09, 0x09,
+ 0x09, 0x05, 0x02, 0x00, 0x00, 0x00, 0x09, 0x09, 0x0f, 0x0f, 0x09, 0x00,
+ 0x00, 0x00, 0x09, 0x09, 0x06, 0x09, 0x09, 0x00, 0x00, 0x00, 0x09, 0x09,
+ 0x09, 0x0f, 0x08, 0x0c, 0x00, 0x00, 0x0f, 0x08, 0x06, 0x01, 0x0f, 0x00,
+ 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0x00, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x04, 0x02, 0x02, 0x01, 0x00,
+ 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00
+};
+
+static Bitmap font5x8 = { 8, 1024, 1, (char *) font5x8Buf };
+
+/* draw the given 5x8 character at the given coordinates */
+static void bitmapDrawChar5x8 (Bitmap *b, int x, int y, char c)
+{
+ bitmapCopyRect (b, x, y, &font5x8, 0, c * 8, 5, 8);
+}
+
+/* draw a string of 5x8 characters at the given coordinates */
+static void bitmapDrawString5x8 (Bitmap *b, int x, int y, char *str)
+{
+ int origx = x;
+
+ while (*str != '\0')
+ {
+ char c = *str;
+ if (c == '\n')
+ {
+ x = origx;
+ y += 8;
+ }
+ else
+ {
+ if (c < ' ')
+ {
+ c = ' ';
+ }
+
+ bitmapDrawChar5x8 (b, x, y, c);
+ x += 5;
+ }
+ str++;
+ }
+}
+
+
+
+/* ----------------------------------------------------------------------------
+ * upc/ean symbologies
+ */
+
+/* A quick lesson in UPC and EAN barcodes:
+ *
+ * Each digit consists of 2 bars and 2 spaces, taking a total width of 7
+ * times the width of the thinnest possible bar or space. There are three
+ * different possible representations for each digit, used depending on
+ * what side of a two-sided barcode the digit is used on, and to encode
+ * checksum or other information in some cases. The three forms are
+ * related. Taking as the "base" form the pattern as seen on the right-hand
+ * side of a UPC-A barcode, the other forms are the inverse of the base
+ * (that is, bar becomes space and vice versa) and the mirror image of the
+ * base. Still confused? Here's a complete table, where 0 means space and 1
+ * means bar:
+ *
+ * Left-A Left-B Right
+ * ------- ------- -------
+ * 0 0001101 0100111 1110010
+ * 1 0011001 0110011 1100110
+ * 2 0010011 0011011 1101100
+ * 3 0111101 0100001 1000010
+ * 4 0100011 0011101 1011100
+ * 5 0110001 0111001 1001110
+ * 6 0101111 0000101 1010000
+ * 7 0111011 0010001 1000100
+ * 8 0110111 0001001 1001000
+ * 9 0001011 0010111 1110100
+ *
+ * A UPC-A barcode consists of 6 patterns from Left-A on the left-hand side,
+ * 6 patterns from Right on the right-hand side, a guard pattern of 01010
+ * in the middle, and a guard pattern of 101 on each end. The 12th digit
+ * checksum is calculated as follows: Take the 1st, 3rd, ... 11th digits,
+ * sum them and multiplying by 3, and add that to the sum of the other digits.
+ * Subtract the final digit from 10, and that is the checksum digit. (If
+ * the last digit of the sum is 0, then the check digit is 0.)
+ *
+ * An EAN-13 barcode is just like a UPC-A barcode, except that the characters
+ * on the left-hand side have a pattern of Left-A and Left-B that encodes
+ * an extra first digit. Note that an EAN-13 barcode with the first digit
+ * of 0 is exactly the same as the UPC-A barcode of the rightmost 12 digits.
+ * The patterns to encode the first digit are as follows:
+ *
+ * Left-Hand
+ * Digit Position
+ * 1 2 3 4 5 6
+ * - - - - - -
+ * 0 a a a a a a
+ * 1 a a b a b b
+ * 2 a a b b a b
+ * 3 a a b b b a
+ * 4 a b a a b b
+ * 5 a b b a a b
+ * 6 a b b b a a
+ * 7 a b a b a b
+ * 8 a b a b b a
+ * 9 a b b a b a
+ *
+ * The checksum for EAN-13 is just like UPC-A, except the 2nd, 4th, ... 12th
+ * digits are multiplied by 3 instead of the other way around.
+ *
+ * An EAN-8 barcode is just like a UPC-A barcode, except there are only 4
+ * digits in each half. Unlike EAN-13, there's no nonsense about different
+ * left-hand side patterns, either.
+ *
+ * A UPC-E barcode contains 6 explicit characters between a guard of 101
+ * on the left and 010101 on the right. The explicit characters are the
+ * middle six characters of the code. The first and last characters are
+ * encoded in the parity pattern of the six characters. There are two
+ * sets of parity patterns, one to use if the first digit of the number
+ * is 0, and another if it is 1. (UPC-E barcodes may only start with a 0
+ * or 1.) The patterns are as follows:
+ *
+ * First digit 0 First digit 1
+ * Explicit Digit Explicit Digit
+ * Position Position
+ * 1 2 3 4 5 6 1 2 3 4 5 6
+ * - - - - - - - - - - - -
+ * 0 b b b a a a a a a b b b
+ * 1 b b a b a a a a b a b b
+ * 2 b b a a b a a a b b a b
+ * 3 b b a a a b a a b b b a
+ * 4 b a b b a a a b a a b b
+ * 5 b a a b b a a b b a a b
+ * 6 b a a a b b a b b b a a
+ * 7 b a b a b a a b a b a b
+ * 8 b a b a a b a b a b b a
+ * 9 b a a b a b a b b a b a
+ *
+ * (Note that the two sets are the complements of each other. Also note
+ * that the first digit 1 patterns are mostly the same as the EAN-13
+ * first digit patterns.) The UPC-E check digit (the final digit encoded in
+ * the parity pattern) is the same as the UPC-A check digit for the
+ * expanded form of the UPC-E number. The expanstion is as follows, based
+ * on the last explicit digit (the second to last digit) in the encoded
+ * number:
+ *
+ * Corresponding
+ * UPC-E form UPC-A form
+ * ---------- -------------
+ * XABCDE0Y XAB00000CDEY
+ * XABCDE1Y XAB10000CDEY
+ * XABCDE2Y XAB20000CDEY
+ * XABCDE3Y XABC00000DEY
+ * XABCDE4Y XABCD00000EY
+ * XABCDE5Y XABCDE00005Y
+ * XABCDE6Y XABCDE00006Y
+ * XABCDE7Y XABCDE00007Y
+ * XABCDE8Y XABCDE00008Y
+ * XABCDE9Y XABCDE00009Y
+ *
+ * All UPC/EAN barcodes may have an additional 2- or 5-digit supplemental
+ * code just to the right of the main barcode. The supplement starts about
+ * one digit-length (that is about 7 times the width of the thinnest bar)
+ * to the right of the main code, beginning with the guard pattern 1011.
+ * After that comes each digit, with a guard pattern of 01 between each,
+ * but not at the end. The digits are encoded using the left A and B
+ * characters to encode a parity pattern.
+ *
+ * For 2-digit supplements, the parity pattern is determined by the
+ * lower two bits of the numeric value of the code (e.g., 42 would use
+ * pattern 2):
+ *
+ * Lower 2 bits Parity Pattern
+ * ------------ --------------
+ * 0 (bin 00) a a
+ * 1 (bin 01) a b
+ * 2 (bin 10) b a
+ * 3 (bin 11) b b
+ *
+ * For 5-digit supplements, the parity pattern is calculated in a similar
+ * manner to check digit calculation: The first, third, and fifth digits
+ * are summed and multiplied by 3; the second and fourth digits are summed
+ * and multiplied by nine; the parity digit is the sum of those two numbers,
+ * modulo 10. The parity pattern is then the last five patterns from the
+ * UPC-E final digit 0 table for the corresponding digit.
+ */
+
+/* enum to indicate which pattern set to use */
+typedef enum
+{
+ UPC_LEFT_A, UPC_LEFT_B, UPC_RIGHT
+}
+UpcSet;
+
+/* the Left A patterns */
+static unsigned int upcLeftA[] = {
+ 0x0d, 0x19, 0x13, 0x3d, 0x23, 0x31, 0x2f, 0x3b, 0x37, 0x0b
+};
+
+/* the Left B patterns */
+static unsigned int upcLeftB[] = {
+ 0x27, 0x33, 0x1b, 0x21, 0x1d, 0x39, 0x05, 0x11, 0x09, 0x17
+};
+
+/* the Right patterns */
+static unsigned int upcRight[] = {
+ 0x72, 0x66, 0x6c, 0x42, 0x5c, 0x4e, 0x50, 0x44, 0x48, 0x74
+};
+
+/* the EAN-13 first-digit patterns */
+static unsigned int ean13FirstDigit[] = {
+ 0x00, 0x0b, 0x0d, 0x0e, 0x13, 0x19, 0x1c, 0x15, 0x16, 0x1a
+};
+
+/* the UPC-E last-digit patterns for first digit 0 (complement for
+ * digit 1); also used for 5-digit supplemental check patterns */
+static unsigned int upcELastDigit[] = {
+ 0x38, 0x34, 0x32, 0x31, 0x2c, 0x26, 0x23, 0x2a, 0x29, 0x25
+};
+
+/* turn a character into an int representing its digit value; return
+ * 0 for things not in the range '0'-'9' */
+static int charToDigit (char c)
+{
+ if ((c >= '0') && (c <= '9'))
+ {
+ return c - '0';
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+/* draw the given digit character at the given coordinates; a '0' is
+ * used in place of any non-digit character */
+static void drawDigitChar (struct state *st, Bitmap *b, int x, int y, char c)
+{
+ if (st->mode != BC_CLOCK24 &&
+ st->mode != BC_CLOCK12)
+ if ((c < '0') || (c > '9'))
+ c = '0';
+
+ bitmapDrawChar5x8 (b, x, y, c);
+}
+
+/* draw a upc/ean digit at the given coordinates */
+static void drawUpcEanDigit (Bitmap *upcBitmap, int x, int y1, int y2, char n,
+ UpcSet set)
+{
+ unsigned int bits;
+ int i;
+
+ n = charToDigit (n);
+ switch (set)
+ {
+ case UPC_LEFT_A:
+ bits = upcLeftA[(int) n];
+ break;
+ case UPC_LEFT_B:
+ bits = upcLeftB[(int) n];
+ break;
+ default /* case UPC_RIGHT */:
+ bits = upcRight[(int) n];
+ break;
+ }
+
+ for (i = 6; i >=0; i--)
+ {
+ if (bits & (1 << i))
+ {
+ bitmapVlin (upcBitmap, x, y1, y2);
+ }
+ x++;
+ }
+}
+
+/* report the width of the given supplemental code or 0 if it is a bad
+ * supplement form */
+static int upcEanSupplementWidth (char *digits)
+{
+ switch (strlen (digits))
+ {
+ case 2: return 28; /* 8 + 4 + 2*7 + 1*2 */
+ case 5: return 55; /* 8 + 4 + 5*7 + 4*2 */
+ default: return 0;
+ }
+}
+
+/* draw the given supplemental barcode, including the textual digits */
+static void drawUpcEanSupplementalBars (struct state *st,
+ Bitmap *upcBitmap, char *digits,
+ int x, int y, int y2, int textAbove)
+{
+ int len = strlen (digits);
+ int i;
+ int parity;
+ int textY;
+ int textX;
+
+ if (textAbove)
+ {
+ textY = y;
+ y += 8;
+ }
+ else
+ {
+ y2 -= 8;
+ textY = y2 + 2;
+ }
+
+ x += 8; /* skip the space between the main and supplemental */
+
+ switch (len)
+ {
+ case 2:
+ {
+ textX = x + 5;
+ parity = (charToDigit (digits[0]) * 10 +
+ charToDigit (digits[1])) & 0x3;
+ break;
+ }
+ case 5:
+ {
+ textX = x + 10;
+ parity =
+ ((charToDigit (digits[0]) + charToDigit (digits[2]) +
+ charToDigit (digits[4])) * 3
+ + (charToDigit (digits[1]) + charToDigit (digits[3])) * 9)
+ % 10;
+ parity = upcELastDigit[parity];
+ break;
+ }
+ default:
+ {
+ fprintf (stderr, "%s: bad supplement (%d digits)\n",
+ progname, len);
+ exit(1);
+ break;
+ }
+ }
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, y2);
+ bitmapVlin (upcBitmap, x + 2, y, y2);
+ bitmapVlin (upcBitmap, x + 3, y, y2);
+
+ for (i = 0; i < len; i++)
+ {
+ UpcSet lset =
+ (parity & (1 << (len - 1 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
+ int baseX = x + 2 + i * 9;
+
+ /* separator / end of header */
+ if (i == 0)
+ {
+ bitmapVlin (upcBitmap, baseX, y, y2);
+ }
+ bitmapVlin (upcBitmap, baseX + 1, y, y2);
+
+ drawUpcEanDigit (upcBitmap,
+ baseX + 2,
+ y,
+ y2,
+ digits[i],
+ lset);
+
+ drawDigitChar (st, upcBitmap, textX + i*6, textY, digits[i]);
+ }
+}
+
+/* draw the actual barcode part of a UPC-A barcode */
+static void drawUpcABars (Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* center marker */
+ bitmapVlin (upcBitmap, x + 46, y, guardY2);
+ bitmapVlin (upcBitmap, x + 48, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 92, y, guardY2);
+ bitmapVlin (upcBitmap, x + 94, y, guardY2);
+
+ for (i = 0; i < 6; i++)
+ {
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7,
+ y,
+ (i == 0) ? guardY2 : barY2,
+ digits[i],
+ UPC_LEFT_A);
+ drawUpcEanDigit (upcBitmap,
+ x + 50 + i*7,
+ y,
+ (i == 5) ? guardY2 : barY2,
+ digits[i+6],
+ UPC_RIGHT);
+ }
+}
+
+/* make and return a full-height UPC-A barcode */
+static int makeUpcAFull (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 108;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawUpcABars (dest, digits, 6, y, height - 10, height - 4);
+
+ drawDigitChar (st, dest, 0, height - 14, digits[0]);
+
+ for (i = 0; i < 5; i++)
+ {
+ drawDigitChar (st, dest, 18 + i*7, height - 7, digits[i+1]);
+ drawDigitChar (st, dest, 57 + i*7, height - 7, digits[i+6]);
+ }
+
+ drawDigitChar (st, dest, 103, height - 14, digits[11]);
+
+ return baseWidth;
+}
+
+/* make and return a UPC-A barcode */
+static int makeUpcA (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int i;
+ unsigned int mul = 3;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 11; i++)
+ {
+ sum += charToDigit (digits[i]) * mul;
+ mul ^= 2;
+ }
+
+ if (digits[11] == '?')
+ {
+ digits[11] = ((10 - (sum % 10)) % 10) + '0';
+ }
+
+ return makeUpcAFull (st, dest, digits, y);
+}
+
+/* draw the actual barcode part of a UPC-E barcode */
+static void drawUpcEBars (struct state *st,
+ Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+ int parityPattern = upcELastDigit[charToDigit(digits[7])];
+
+ int clockp = (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24);
+
+ if (digits[0] == '1')
+ {
+ parityPattern = ~parityPattern;
+ }
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 46 + (clockp?8:0), y, guardY2);
+ bitmapVlin (upcBitmap, x + 48 + (clockp?8:0), y, guardY2);
+ bitmapVlin (upcBitmap, x + 50 + (clockp?8:0), y, guardY2);
+
+ /* clock kludge -- this draws an extra set of dividers after
+ digits 2 and 4. This makes this *not* be a valid bar code,
+ but, it looks pretty for the clock dpy.
+ */
+ if (clockp)
+ {
+ bitmapVlin (upcBitmap, x + 18, y, guardY2);
+ bitmapVlin (upcBitmap, x + 18 + 2, y, guardY2);
+
+ bitmapVlin (upcBitmap, x + 36, y, guardY2);
+ bitmapVlin (upcBitmap, x + 36 + 2, y, guardY2);
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ UpcSet lset =
+ (parityPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
+ int off = (clockp
+ ? (i < 2 ? 0 :
+ i < 4 ? 4 : /* extra spacing for clock bars */
+ 8)
+ : 0);
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7 + off,
+ y,
+ barY2,
+ digits[i + 1],
+ lset);
+ }
+}
+
+/* make and return a full-height UPC-E barcode */
+static int makeUpcEFull (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 64;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawUpcEBars (st, dest, digits, 6, y, height - 10, height - 4);
+
+ drawDigitChar (st, dest, 0, height - 14, digits[0]);
+
+ for (i = 0; i < 6; i++)
+ {
+ drawDigitChar (st, dest, 11 + i*7, height - 7, digits[i+1]);
+ }
+
+ drawDigitChar (st, dest, 59, height - 14, digits[7]);
+
+ return baseWidth;
+}
+
+/* expand 8 UPC-E digits into a UPC-A number, storing into the given result
+ * array, or just store '\0' into the first element, if the form factor
+ * is incorrect; this will also calculate the check digit, if it is
+ * specified as '?' */
+static void expandToUpcADigits (char *compressed, char *expanded)
+{
+ int i;
+
+ if ((compressed[0] != '0') && (compressed[0] != '1'))
+ {
+ return;
+ }
+
+ expanded[0] = compressed[0];
+ expanded[6] = '0';
+ expanded[7] = '0';
+ expanded[11] = compressed[7];
+
+ switch (compressed[6])
+ {
+ case '0':
+ case '1':
+ case '2':
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[6];
+ expanded[4] = '0';
+ expanded[5] = '0';
+ expanded[8] = compressed[3];
+ expanded[9] = compressed[4];
+ expanded[10] = compressed[5];
+ break;
+ }
+ case '3':
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[3];
+ expanded[4] = '0';
+ expanded[5] = '0';
+ expanded[8] = '0';
+ expanded[9] = compressed[4];
+ expanded[10] = compressed[5];
+ break;
+ }
+ case '4':
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[3];
+ expanded[4] = compressed[4];
+ expanded[5] = '0';
+ expanded[8] = '0';
+ expanded[9] = '0';
+ expanded[10] = compressed[5];
+ break;
+ }
+ default:
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[3];
+ expanded[4] = compressed[4];
+ expanded[5] = compressed[5];
+ expanded[8] = '0';
+ expanded[9] = '0';
+ expanded[10] = compressed[6];
+ break;
+ }
+ }
+
+ if (expanded[11] == '?')
+ {
+ unsigned int mul = 3;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 11; i++)
+ {
+ sum += charToDigit (expanded[i]) * mul;
+ mul ^= 2;
+ }
+
+ expanded[11] = ((10 - (sum % 10)) % 10) + '0';
+ }
+}
+
+/* make and return a UPC-E barcode */
+static int makeUpcE (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ char expandedDigits[13];
+ char compressedDigits[9];
+
+ expandedDigits[0] = '\0';
+ compressedDigits[0] = '0';
+ strcpy (compressedDigits + 1, digits);
+
+ expandToUpcADigits (compressedDigits, expandedDigits);
+ if (expandedDigits[0] == '\0')
+ {
+ return 0;
+ }
+
+ compressedDigits[7] = expandedDigits[11];
+
+ return makeUpcEFull (st, dest, compressedDigits, y);
+}
+
+/* draw the actual barcode part of a EAN-13 barcode */
+static void drawEan13Bars (Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+ int leftPattern = ean13FirstDigit[charToDigit (digits[0])];
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* center marker */
+ bitmapVlin (upcBitmap, x + 46, y, guardY2);
+ bitmapVlin (upcBitmap, x + 48, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 92, y, guardY2);
+ bitmapVlin (upcBitmap, x + 94, y, guardY2);
+
+ for (i = 0; i < 6; i++)
+ {
+ UpcSet lset = (leftPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
+
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7,
+ y,
+ barY2,
+ digits[i+1],
+ lset);
+ drawUpcEanDigit (upcBitmap,
+ x + 50 + i*7,
+ y,
+ barY2,
+ digits[i+7],
+ UPC_RIGHT);
+ }
+}
+
+/* make and return a full-height EAN-13 barcode */
+static int makeEan13Full (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 102;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawEan13Bars (dest, digits, 6, y, height - 10, height - 4);
+
+ drawDigitChar (st, dest, 0, height - 7, digits[0]);
+
+ for (i = 0; i < 6; i++)
+ {
+ drawDigitChar (st, dest, 11 + i*7, height - 7, digits[i+1]);
+ drawDigitChar (st, dest, 57 + i*7, height - 7, digits[i+7]);
+ }
+
+ return baseWidth;
+}
+
+/* make and return an EAN-13 barcode */
+static int makeEan13 (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int i;
+ unsigned int mul = 1;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 12; i++)
+ {
+ sum += charToDigit (digits[i]) * mul;
+ mul ^= 2;
+ }
+
+ if (digits[12] == '?')
+ {
+ digits[12] = ((10 - (sum % 10)) % 10) + '0';
+ }
+
+ return makeEan13Full (st, dest, digits, y);
+}
+
+/* draw the actual barcode part of an EAN-8 barcode */
+static void drawEan8Bars (Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* center marker */
+ bitmapVlin (upcBitmap, x + 32, y, guardY2);
+ bitmapVlin (upcBitmap, x + 34, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 64, y, guardY2);
+ bitmapVlin (upcBitmap, x + 66, y, guardY2);
+
+ for (i = 0; i < 4; i++)
+ {
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7,
+ y,
+ barY2,
+ digits[i],
+ UPC_LEFT_A);
+ drawUpcEanDigit (upcBitmap,
+ x + 36 + i*7,
+ y,
+ barY2,
+ digits[i+4],
+ UPC_RIGHT);
+ }
+}
+
+/* make and return a full-height EAN-8 barcode */
+static int makeEan8Full (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 68;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawEan8Bars (dest, digits, 0, y, height - 10, height - 4);
+
+ for (i = 0; i < 4; i++)
+ {
+ drawDigitChar (st, dest, 5 + i*7, height - 7, digits[i]);
+ drawDigitChar (st, dest, 37 + i*7, height - 7, digits[i+4]);
+ }
+
+ return baseWidth;
+}
+
+/* make and return an EAN-8 barcode */
+static int makeEan8 (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int i;
+ unsigned int mul = 3;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 7; i++)
+ {
+ sum += charToDigit (digits[i]) * mul;
+ mul ^= 2;
+ }
+
+ if (digits[7] == '?')
+ {
+ digits[7] = ((10 - (sum % 10)) % 10) + '0';
+ }
+
+ return makeEan8Full (st, dest, digits, y);
+}
+
+/* Dispatch to the right form factor UPC/EAN barcode generator */
+static void processUpcEan (struct state *st, char *str, Bitmap *dest)
+{
+ char digits[16];
+ int digitCount = 0;
+ char supDigits[8];
+ int supDigitCount = 0;
+ char *instr = str;
+ char *banner = NULL;
+ int supplement = 0;
+ int vstart = 9;
+ int width = 0;
+
+ while ((digitCount < 15) && (supDigitCount < 7))
+ {
+ char c = *instr;
+ if (((c >= '0') && (c <= '9')) || (c == '?'))
+ {
+ if (supplement)
+ {
+ supDigits[supDigitCount] = *instr;
+ supDigitCount++;
+ }
+ else
+ {
+ digits[digitCount] = *instr;
+ digitCount++;
+ }
+ }
+ else if (c == ',')
+ {
+ supplement = 1;
+ }
+ else if (c == ':')
+ {
+ banner = instr + 1;
+ break;
+ }
+ else if (c == '\0')
+ {
+ break;
+ }
+ instr++;
+ }
+
+ digits[digitCount] = '\0';
+ supDigits[supDigitCount] = '\0';
+
+ if (supDigitCount == 0)
+ {
+ supplement = 0;
+ }
+ else if ((supDigitCount == 2) || (supDigitCount == 5))
+ {
+ supplement = upcEanSupplementWidth (supDigits);
+ }
+ else
+ {
+ fprintf (stderr, "%s: invalid supplement (must be 2 or 5 digits)\n",
+ progname);
+ exit (1);
+ }
+
+ if (banner == NULL)
+ {
+ banner = "barcode";
+ }
+
+ switch (digitCount)
+ {
+ case 7:
+ {
+ width = makeUpcE (st, dest, digits, vstart);
+ break;
+ }
+ case 8:
+ {
+ width = makeEan8 (st, dest, digits, vstart);
+ break;
+ }
+ case 12:
+ {
+ width = makeUpcA (st, dest, digits, vstart);
+ break;
+ }
+ case 13:
+ {
+ width = makeEan13 (st, dest, digits, vstart);
+ break;
+ }
+ default:
+ {
+ fprintf (stderr, "%s: bad barcode (%d digits)\n",
+ progname, digitCount);
+ exit(1);
+ }
+ }
+
+ if (supplement)
+ {
+ drawUpcEanSupplementalBars (st, dest, supDigits,
+ width,
+ vstart + 1, dest->height - 4, 1);
+ }
+
+ if (banner != NULL)
+ {
+ bitmapDrawString5x8 (dest,
+ (width + supplement -
+ ((int) strlen (banner) * 5)) / 2,
+ 0,
+ banner);
+ }
+}
+
+
+
+/* ----------------------------------------------------------------------------
+ * the screenhack
+ */
+
+/*
+ * overall setup stuff
+ */
+
+/* set up the system */
+static void setup (struct state *st)
+{
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->visual = xgwa.visual;
+ st->cmap = xgwa.colormap;
+ st->windowWidth = xgwa.width;
+ st->windowHeight = xgwa.height;
+
+ gcv.background = get_pixel_resource (st->dpy, xgwa.colormap,
+ "background", "Background");
+ gcv.foreground = get_pixel_resource (st->dpy, xgwa.colormap,
+ "foreground", "Foreground");
+ st->fg_pixel = gcv.foreground;
+ st->theGC = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+
+ st->theBitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG, BARCODE_HEIGHT * MAX_MAG);
+ st->theImage = XCreateImage(st->dpy, st->visual, 1, XYBitmap, 0, st->theBitmap->buf,
+ st->theBitmap->width, st->theBitmap->height, 8,
+ st->theBitmap->widthBytes);
+ st->theImage->bitmap_bit_order = LSBFirst;
+ st->theImage->byte_order = LSBFirst;
+}
+
+
+
+/*
+ * the simulation
+ */
+
+/* set up the model */
+static void setupModel (struct state *st)
+{
+ int i;
+
+ st->barcode_max = 20;
+ st->barcode_count = 0;
+ st->barcodes = malloc (sizeof (Barcode) * st->barcode_max);
+
+ for (i = 0; i < st->barcode_max; i++)
+ {
+ st->barcodes[i].bitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG,
+ BARCODE_HEIGHT * MAX_MAG);
+ }
+}
+
+/* make a new barcode string */
+static void makeBarcodeString (struct state *st, char *str)
+{
+ int dig, i;
+
+ switch ((int) (RAND_FLOAT_01 * 4))
+ {
+ case 0: dig = 6; break;
+ case 1: dig = 7; break;
+ case 2: dig = 11; break;
+ default: dig = 12; break;
+ }
+
+ for (i = 0; i < dig; i++)
+ {
+ str[i] = RAND_FLOAT_01 * 10 + '0';
+ }
+
+ str[i] = '?';
+ i++;
+
+ switch ((int) (RAND_FLOAT_01 * 3))
+ {
+ case 0: dig = 0; break;
+ case 1: dig = 2; break;
+ default: dig = 5; break;
+ }
+
+ if (dig != 0)
+ {
+ str[i] = ',';
+ i++;
+ while (dig > 0)
+ {
+ str[i] = RAND_FLOAT_01 * 10 + '0';
+ i++;
+ dig--;
+ }
+ }
+
+ str[i] = ':';
+ i++;
+
+ strcpy(&str[i], words[(int) (RAND_FLOAT_01 * WORD_COUNT)]);
+}
+
+/* update the model for one iteration */
+static void scrollModel (struct state *st)
+{
+ int i;
+
+ for (i = 0; i < st->barcode_count; i++)
+ {
+ Barcode *b = &st->barcodes[i];
+ b->x--;
+ if ((b->x + BARCODE_WIDTH * b->mag) < 0)
+ {
+ /* fell off the edge */
+ if (i != (st->barcode_count - 1)) {
+ Bitmap *oldb = b->bitmap;
+ memmove (b, b + 1, (st->barcode_count - i - 1) * sizeof (Barcode));
+ st->barcodes[st->barcode_count - 1].bitmap = oldb;
+
+ XFreeColors (st->dpy, st->cmap, &b->pixel, 1, 0);
+ }
+
+ i--;
+ st->barcode_count--;
+ }
+ }
+
+ while (st->barcode_count < st->barcode_max)
+ {
+ Barcode *barcode = &st->barcodes[st->barcode_count];
+ barcode->x = (st->barcode_count == 0) ?
+ 0 :
+ (st->barcodes[st->barcode_count - 1].x +
+ st->barcodes[st->barcode_count - 1].mag * BARCODE_WIDTH);
+ barcode->x += RAND_FLOAT_01 * 100;
+ barcode->mag = RAND_FLOAT_01 * MAX_MAG;
+
+ if (st->windowWidth < 100 || st->windowHeight < 100) {
+ barcode->mag *= 0.5;
+ if (barcode->mag <= 0) barcode->mag = 1;
+ }
+
+ barcode->y =
+ RAND_FLOAT_01 * (st->windowHeight - BARCODE_HEIGHT * barcode->mag);
+ if (barcode->y < 0)
+ {
+ barcode->y = 0;
+ }
+ makeBarcodeString(st, barcode->code);
+ processUpcEan (st, barcode->code, st->theBitmap);
+ bitmapScale (barcode->bitmap, st->theBitmap, barcode->mag);
+
+ {
+ XColor c;
+ int ii, ok = 0;
+ for (ii = 0; ii < 100; ii++)
+ {
+ hsv_to_rgb (random() % 360, 1.0, 1.0, &c.red, &c.green, &c.blue);
+ ok = XAllocColor (st->dpy, st->cmap, &c);
+ if (ok) break;
+ }
+ if (!ok)
+ {
+ c.red = c.green = c.blue = 0xFFFF;
+ if (!XAllocColor (st->dpy, st->cmap, &c))
+ abort();
+ }
+ barcode->pixel = c.pixel;
+ }
+
+ st->barcode_count++;
+ }
+}
+
+/* update the model for one iteration */
+static void updateGrid (struct state *st)
+{
+ int i, x, y;
+
+ if (st->grid_w == 0 || st->grid_h == 0 ||
+ (! (random() % 400)))
+ {
+ XClearWindow (st->dpy, st->window);
+ st->grid_w = 1 + (random() % 3);
+ st->grid_h = 1 + (random() % 4);
+ }
+
+ if (!st->grid_alloced_p || (! (random() % 100)))
+ {
+ XColor c;
+ hsv_to_rgb (random() % 360, 1.0, 1.0, &c.red, &c.green, &c.blue);
+ if (st->grid_alloced_p)
+ XFreeColors (st->dpy, st->cmap, &st->grid_pixel, 1, 0);
+ XAllocColor (st->dpy, st->cmap, &c);
+ st->grid_pixel = c.pixel;
+ st->grid_alloced_p = 1;
+ }
+
+ st->barcode_count = st->grid_w * st->grid_h;
+ if (st->barcode_count > st->barcode_max) abort();
+
+ for (i = 0; i < st->barcode_max; i++)
+ {
+ Barcode *b = &st->barcodes[i];
+ b->x = b->y = 999999;
+ }
+
+ i = 0;
+ for (y = 0; y < st->grid_h; y++)
+ for (x = 0; x < st->grid_w; x++, i++)
+ {
+ Barcode *b = &st->barcodes[i];
+ int digits = 12;
+
+ int cell_w = (st->windowWidth / st->grid_w);
+ int cell_h = (st->windowHeight / st->grid_h);
+ int mag_x = cell_w / BARCODE_WIDTH;
+ int mag_y = cell_h / BARCODE_HEIGHT;
+ int BW = 108 /*BARCODE_WIDTH*/;
+ int BH = BARCODE_HEIGHT;
+
+ b->mag = (mag_x < mag_y ? mag_x : mag_y);
+
+ b->x = (x * cell_w) + ((cell_w - b->mag * BW) / 2);
+ b->y = (y * cell_h) + ((cell_h - b->mag * BH) / 2);
+ b->pixel = st->grid_pixel;
+
+ if (!st->strings[i])
+ {
+ int j;
+ char *s = malloc (digits + 10);
+ st->strings[i] = s;
+ for (j = 0; j < digits; j++)
+ s[j] = (random() % 10) + '0';
+ s[j++] = '?';
+ s[j++] = ':';
+ s[j] = 0;
+ }
+
+ /* change one digit in this barcode */
+ st->strings[i][random() % digits] = (random() % 10) + '0';
+
+ strcpy (b->code, st->strings[i]);
+ processUpcEan (st, b->code, b->bitmap);
+ }
+}
+
+
+/* update the model for one iteration.
+ This one draws a clock. By jwz. */
+static void updateClock (struct state *st)
+{
+ Barcode *b = &st->barcodes[0];
+ int BW = 76 /* BARCODE_WIDTH */;
+ int BH = BARCODE_HEIGHT;
+ int mag_x, mag_y;
+ int i;
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ XWindowAttributes xgwa;
+ int ow = st->windowWidth;
+ int oh = st->windowHeight;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->windowWidth = xgwa.width;
+ st->windowHeight = xgwa.height;
+
+ mag_x = st->windowWidth / BW;
+ mag_y = st->windowHeight / BH;
+
+ st->barcode_count = 1;
+
+ b->mag = (mag_x < mag_y ? mag_x : mag_y);
+
+ if (b->mag > MAX_MAG) b->mag = MAX_MAG;
+ if (b->mag < 1) b->mag = 1;
+
+ b->x = (st->windowWidth - (b->mag * BW )) / 2;
+ b->y = (st->windowHeight - (b->mag * (BH + 9))) / 2;
+ b->pixel = st->fg_pixel;
+
+ if (!st->button_down_p)
+ sprintf (b->code, "0%02d%02d%02d?:",
+ (st->mode == BC_CLOCK24
+ ? tm->tm_hour
+ : (tm->tm_hour > 12
+ ? tm->tm_hour - 12
+ : (tm->tm_hour == 0
+ ? 12
+ : tm->tm_hour))),
+ tm->tm_min,
+ tm->tm_sec);
+ else
+ sprintf (b->code, "0%02d%02d%02d?:",
+ tm->tm_year % 100, tm->tm_mon+1, tm->tm_mday);
+
+ {
+ int vstart = 9;
+ int hh = BH + vstart;
+ char expandedDigits[13];
+
+ expandedDigits[0] = '\0';
+
+ expandToUpcADigits (b->code, expandedDigits);
+ if (expandedDigits[0] != '\0')
+ b->code[7] = expandedDigits[11];
+
+ bitmapClear (st->theBitmap);
+ drawUpcEBars (st, st->theBitmap, b->code, 6, 9, 59, 65);
+ for (i = 0; i < 6; i++)
+ {
+ int off = (i < 2 ? 0 :
+ i < 4 ? 4 :
+ 8);
+ drawDigitChar (st, st->theBitmap, 11 + i*7 + off, hh - 16, b->code[i+1]);
+ }
+
+ if (!st->button_down_p)
+ {
+#if 0
+ char *days[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
+ char *s = days[tm->tm_wday];
+ bitmapDrawString5x8 (st->theBitmap, (BW - strlen (s)*5) / 2, 0, s);
+#endif
+ drawDigitChar (st, st->theBitmap, 0, hh - 23, (tm->tm_hour < 12 ? 'A' : 'P'));
+ drawDigitChar (st, st->theBitmap, 68, hh - 23, 'M');
+ }
+ else
+ {
+ char s[20];
+ sprintf (s, "%03d", tm->tm_yday);
+ bitmapDrawString5x8 (st->theBitmap, (BW - strlen (s)*5) / 2, 0, s);
+ }
+ }
+
+ bitmapScale (b->bitmap, st->theBitmap, b->mag);
+
+ if (ow != st->windowWidth || oh != st->windowHeight)
+ XClearWindow (st->dpy, st->window);
+}
+
+
+
+/* render and dpy the current model */
+static void renderFrame (struct state *st)
+{
+ int i;
+
+ for (i = 0; i < st->barcode_count; i++)
+ {
+ Barcode *barcode = &st->barcodes[i];
+
+ if (barcode->x > st->windowWidth) {
+ break;
+ }
+
+ /* bitmapScale (st->theBitmap, barcode->bitmap, barcode->mag);*/
+ st->theImage->data = barcode->bitmap->buf;
+
+ XSetForeground (st->dpy, st->theGC, barcode->pixel);
+ XPutImage (st->dpy, st->window, st->theGC, st->theImage,
+ 0, 0, barcode->x, barcode->y,
+ BARCODE_WIDTH * barcode->mag,
+ BARCODE_HEIGHT * barcode->mag);
+ }
+}
+
+/* do one iteration */
+static unsigned long
+barcode_draw (Display *dpy, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->mode == BC_SCROLL)
+ scrollModel (st);
+ else if (st->mode == BC_GRID)
+ updateGrid (st);
+ else if (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24)
+ updateClock (st);
+ else
+ abort();
+
+ renderFrame (st);
+
+ return st->delay;
+}
+
+
+static Bool
+barcode_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ int clockp = (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24);
+ if (clockp && event->xany.type == ButtonPress) {
+ st->button_down_p = True;
+ return True;
+ } else if (clockp && event->xany.type == ButtonRelease) {
+ st->button_down_p = False;
+ return True;
+ } else
+ return False;
+}
+
+static void
+barcode_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->windowWidth = w;
+ st->windowHeight = h;
+}
+
+static void
+barcode_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+/* main and options and stuff */
+
+static const char *barcode_defaults [] = {
+ ".background: black",
+ ".foreground: green",
+ ".lowrez: true",
+ "*fpsSolid: true",
+ "*delay: 10000",
+ "*mode: scroll",
+ 0
+};
+
+static XrmOptionDescRec barcode_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-scroll", ".mode", XrmoptionNoArg, "scroll" },
+ { "-grid", ".mode", XrmoptionNoArg, "grid" },
+ { "-clock", ".mode", XrmoptionNoArg, "clock" },
+ { "-clock12", ".mode", XrmoptionNoArg, "clock12" },
+ { "-clock24", ".mode", XrmoptionNoArg, "clock24" },
+ { 0, 0, 0, 0 }
+};
+
+/* initialize the user-specifiable params */
+static void initParams (struct state *st)
+{
+ int problems = 0;
+ char *s;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ if (st->delay < 0)
+ {
+ fprintf (stderr, "%s: delay must be at least 0\n", progname);
+ problems = 1;
+ }
+
+ s = get_string_resource (st->dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp (s, "scroll"))
+ st->mode = BC_SCROLL;
+ else if (!strcasecmp (s, "grid"))
+ st->mode = BC_GRID;
+ else if (!strcasecmp (s, "clock") ||
+ !strcasecmp (s, "clock12"))
+ st->mode = BC_CLOCK12;
+ else if (!strcasecmp (s, "clock24"))
+ st->mode = BC_CLOCK24;
+ else
+ {
+ fprintf (stderr, "%s: unknown mode \"%s\"\n", progname, s);
+ problems = 1;
+ }
+ free (s);
+
+ if (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24)
+ st->delay = 10000; /* only update every 1/10th second */
+
+ if (problems)
+ {
+ exit (1);
+ }
+}
+
+static void *
+barcode_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = win;
+
+ initParams (st);
+ setup (st);
+ setupModel (st);
+ return st;
+}
+
+
+XSCREENSAVER_MODULE ("Barcode", barcode)
diff --git a/hacks/barcode.man b/hacks/barcode.man
new file mode 100644
index 0000000..9074e16
--- /dev/null
+++ b/hacks/barcode.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+barcode - draws a random sequence of barcodes for the products you enjoy
+.SH SYNOPSIS
+.B barcode
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-clock]
+[\-clock24]
+[\-fps]
+.SH DESCRIPTION
+This draws a random sequence of colorful barcodes scrolling across your
+screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.02 seconds.).
+.TP 8
+.B \-clock
+Instead of drawing a stream of barcodes, draw a barcode-based digital clock.
+.TP 8
+.B \-clock24
+Same as \fI\-clock\fP, but display 24-hour time instead of 12-hour time.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Dan Bornstein. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Dan Bornstein <danfuzz@milk.com>
diff --git a/hacks/binaryring.c b/hacks/binaryring.c
new file mode 100644
index 0000000..3cbaec2
--- /dev/null
+++ b/hacks/binaryring.c
@@ -0,0 +1,587 @@
+/*
+ * Binary Ring
+ * Copyright (c) 2006-2014 Emilio Del Tessandoro <emilio.deltessa@gmail.com>
+ *
+ * Directly ported code from complexification.net Binary Ring art
+ * http://www.complexification.net/gallery/machines/binaryRing/appletm/BinaryRing_m.pde
+ *
+ * Binary Ring code:
+ * j.tarbell June, 2004
+ * Albuquerque, New Mexico
+ * complexification.net
+ *
+ * Directly based the hacks of:
+ *
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+
+#define ANTIALIAS 1
+#define BLACK 0
+#define WHITE 1
+
+#define swap(a, b) do { __typeof__(a) tmp; tmp = a; a = b; b = tmp; } while(0)
+#define frand1() ((((int) random() ) << 1) * 4.65661287524579692411E-10)
+#define min(a,b) ((a)<(b)?(a):(b))
+#define max(a,b) ((a)>(b)?(a):(b))
+
+/* better if signed */
+typedef unsigned long pixel_t;
+
+
+typedef struct {
+ float x, y;
+ float xx, yy;
+ float vx, vy;
+ float color;
+ int age; /* age from 0 to ageMax */
+} particle_t;
+
+
+struct state {
+ int epoch;
+ int growth_delay;
+ int ring_radius;
+ int max_age;
+ float curliness;
+ int particles_number;
+ particle_t* particles;
+
+
+ Display *display; /* variables for the X stuff */
+ Window window;
+ GC gc;
+ XGCValues gcv;
+ Visual* visual;
+ int depth;
+
+ int width;
+ int height;
+
+ Pixmap pix; /* for reshape */
+ XImage* buf; /* buffer */
+ pixel_t* buffer;
+ pixel_t colors[2];
+
+ Bool color;
+};
+
+
+
+static void point2rgb(int depth, pixel_t c, int *r, int *g, int *b)
+{
+ switch(depth) {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ *r = (c & 0x00ff0000) >> 16;
+ *g = (c & 0x0000ffff) >> 8;
+ *b = (c & 0x000000ff);
+#else
+ *g = (c & 0xff00) >> 8;
+ *r = (c & 0xff0000) >> 16;
+ *b = c & 0xff;
+#endif
+ break;
+ case 16:
+ *g = ((c >> 5) & 0x3f) << 2;
+ *r = ((c >> 11) & 0x1f) << 3;
+ *b = (c & 0x1f) << 3;
+ break;
+ case 15:
+ *g = ((c >> 5) & 0x1f) << 3;
+ *r = ((c >> 10) & 0x1f) << 3;
+ *b = (c & 0x1f) << 3;
+ break;
+ }
+}
+
+static pixel_t rgb2point(int depth, int r, int g, int b)
+{
+ pixel_t ret = 0;
+
+ switch(depth) {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ ret = 0xFF000000 | (r << 16) | (g << 8) | b;
+#else
+ ret |= (r << 16) | (g << 8) | b;
+#endif
+ break;
+ case 16:
+ ret = ((r>>3) << 11) | ((g>>2)<<5) | (b>>3);
+ break;
+ case 15:
+ ret = ((r>>3) << 10) | ((g>>3)<<5) | (b>>3);
+ break;
+ }
+
+ return ret;
+}
+
+void print_color ( struct state* st, pixel_t color );
+/* alpha blended point drawing -- this is Not Right and will likely fail on
+ * non-intel platforms as it is now, needs fixing
+ */
+
+static
+void draw_point ( struct state* st,
+ int x, int y, pixel_t myc, float a ) {
+
+ int or = 0, og = 0, ob = 0;
+ int r = 0, g = 0, b = 0;
+ int nr, ng, nb;
+ register pixel_t c;
+
+ /*or = st->buffer[ 3 * ( y * st->width + x ) + 0 ];
+ og = st->buffer[ 3 * ( y * st->width + x ) + 1 ];
+ ob = st->buffer[ 3 * ( y * st->width + x ) + 2 ];*/
+
+ c = st->buffer[ y * st->width + x ];
+ point2rgb( st->depth, c, &or, &og, &ob );
+ point2rgb( st->depth, myc, &r, &g, &b );
+
+ nr = or + (r - or) * a;
+ ng = og + (g - og) * a;
+ nb = ob + (b - ob) * a;
+
+ /*st->buffer[ 3 * ( y * st->width + x ) + 0 ] = nr;
+ st->buffer[ 3 * ( y * st->width + x ) + 1 ] = ng;
+ st->buffer[ 3 * ( y * st->width + x ) + 2 ] = nb;*/
+ c = rgb2point(st->depth, nr, ng, nb);
+ st->buffer[ y * st->width + x ] = c;
+
+ XPutPixel( st->buf, x, y, c );
+}
+
+
+
+
+void print_color ( struct state* st, pixel_t color ) {
+ int r=0, g=0, b=0;
+ point2rgb(st->depth, color, &r, &g, &b);
+ printf( "%d %d %d\n", r, g, b);
+}
+
+
+
+#if ANTIALIAS
+#define plot_(X,Y,D) do{ \
+ _dla_plot(st, (X), (Y), color, (D) * alpha); }while(0)
+
+static
+void _dla_plot(struct state* st, int x, int y, pixel_t col, float br)
+{
+ if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) ) {
+ if ( br > 1.0f ) br = 1.0f;
+ draw_point( st, x, y, col, br );
+ }
+}
+
+#define ipart_(X) ((int)(X))
+#define round_(X) ((int)(((float)(X))+0.5))
+#define fpart_(X) (((float)(X))-(float)ipart_(X))
+#define rfpart_(X) (1.0-fpart_(X))
+
+static
+void draw_line_antialias(
+ struct state* st,
+ int x1, int y1,
+ int x2, int y2,
+ pixel_t color, float alpha )
+{
+ float dx = (float)x2 - (float)x1;
+ float dy = (float)y2 - (float)y1;
+ float gradient;
+ float xend;
+ float yend;
+ float xgap;
+ float ygap;
+ int xpxl1;
+ int ypxl1;
+ float intery;
+ float interx;
+ int xpxl2;
+ int ypxl2;
+ int x;
+ int y;
+
+ /* hard clipping, because this routine has some problems with negative coordinates */
+ /* TODO: fix the alpha for that boundary cases. Using fabs() could solve? */
+ if ( ( x1 < 0 || x1 > st->width ) ||
+ ( x2 < 0 || x2 > st->width ) ||
+ ( y1 < 0 || y1 > st->height ) ||
+ ( y2 < 0 || y2 > st->height ) )
+ return;
+
+ if ( fabs(dx) > fabs(dy) ) {
+ if ( x2 < x1 ) {
+ swap(x1, x2);
+ swap(y1, y2);
+ }
+ gradient = dy / dx;
+ xend = round_(x1);
+ yend = y1 + gradient*(xend - x1);
+ xgap = rfpart_(x1 + 0.5);
+ xpxl1 = xend;
+ ypxl1 = ipart_(yend);
+ plot_(xpxl1, ypxl1, rfpart_(yend)*xgap);
+ plot_(xpxl1, ypxl1+1, fpart_(yend)*xgap);
+ intery = yend + gradient;
+
+ xend = round_(x2);
+ yend = y2 + gradient*(xend - x2);
+ xgap = fpart_(x2+0.5);
+ xpxl2 = xend;
+ ypxl2 = ipart_(yend);
+ plot_(xpxl2, ypxl2, rfpart_(yend) * xgap);
+ plot_(xpxl2, ypxl2 + 1, fpart_(yend) * xgap);
+
+ /*if ( rfpart_(yend) * xgap < 0 || fpart_(yend) * xgap < 0)
+ printf("%f %f\n", rfpart_(yend) * xgap, fpart_(yend) * xgap);*/
+ for(x=xpxl1+1; x <= (xpxl2-1); x++) {
+ plot_(x, ipart_(intery), rfpart_(intery));
+ plot_(x, ipart_(intery) + 1, fpart_(intery));
+ /*if ( rfpart_(intery) < 0 || fpart_(intery) < 0)
+ printf("%f %f\n", rfpart_(intery), fpart_(intery));*/
+ intery += gradient;
+ }
+ } else {
+ if ( y2 < y1 ) {
+ swap(x1, x2);
+ swap(y1, y2);
+ }
+ gradient = dx / dy;
+ yend = round_(y1);
+ xend = x1 + gradient*(yend - y1);
+ ygap = rfpart_(y1 + 0.5);
+ ypxl1 = yend;
+ xpxl1 = ipart_(xend);
+ plot_(xpxl1, ypxl1, rfpart_(xend)*ygap);
+ plot_(xpxl1, ypxl1+1, fpart_(xend)*ygap);
+ interx = xend + gradient;
+
+ yend = round_(y2);
+ xend = x2 + gradient*(yend - y2);
+ ygap = fpart_(y2+0.5);
+ ypxl2 = yend;
+ xpxl2 = ipart_(xend);
+ plot_(xpxl2, ypxl2, rfpart_(xend) * ygap);
+ plot_(xpxl2, ypxl2 + 1, fpart_(xend) * ygap);
+
+ for(y=ypxl1+1; y <= (ypxl2-1); y++) {
+ plot_(ipart_(interx), y, rfpart_(interx));
+ plot_(ipart_(interx) + 1, y, fpart_(interx));
+ interx += gradient;
+ }
+ }
+}
+#undef plot_
+#undef ipart_
+#undef fpart_
+#undef round_
+#undef rfpart_
+
+#else
+
+static
+void draw_line ( struct state* st, int x0, int y0, int x1, int y1, int color, float a ) {
+ register int steep;
+ register int deltax;
+ register int deltay;
+ register int error;
+ register int ystep;
+ register int y;
+ register int x;
+
+
+ steep = abs ( y1 - y0 ) > abs ( x1 - x0 );
+ if ( steep ) { swap(x0,y0); swap(x1,y1); }
+ if ( x0 > x1 ) { swap(x0,x1); swap(y0,y1); }
+ deltax = x1 - x0;
+ deltay = abs(y1-y0);
+ error = 0;
+ y = y0;
+ ystep = y0 < y1 ? 1 : -1;
+ if ( a > 1.0f ) a = 1.0f;
+
+ for ( x = x0; x < x1; x++ ) {
+ if ( steep ) {
+ if ( ( y >= 0 && y < st->width ) && ( x >= 0 && x < st->height ) )
+ draw_point( st, y, x, color, a );
+ } else {
+ if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) )
+ draw_point( st, x, y, color, a );
+ }
+ error += deltay;
+ if ( ( error << 1 ) > deltax ) {
+ y += ystep;
+ error -= deltax;
+ }
+ }
+}
+#endif
+
+static void create_buffers ( struct state* st, Display* display, Screen* screen, Window window, GC gc ) {
+
+ XWindowAttributes xgwa;
+ XGetWindowAttributes( display, window, &xgwa );
+
+ /* Initialize the pixmap */
+ if ( st->buf != NULL ) XFreePixmap( display, st->pix );
+
+ XSetForeground( display, gc, st->colors[BLACK] );
+ st->pix = XCreatePixmap( display, window, st->width, st->height,
+ xgwa.depth );
+ XFillRectangle( display, st->pix, gc, 0, 0, st->width, st->height);
+
+ /* Initialize the bitmap */
+ if ( st->buf != NULL ) XDestroyImage ( st->buf );
+ st->buf = XGetImage( display, st->pix, 0, 0, st->width, st->height, visual_depth(screen, st->visual), ZPixmap );
+ st->buffer = (pixel_t*) calloc(sizeof(pixel_t), st->width * st->height);
+ /*int i;
+ for ( i = 0; i < st->width * st->height; ++i ) st->buffer[i] = st->colors[BLACK];*/
+}
+
+static void init_particle ( particle_t* p, float dx, float dy, float direction, int color, int max_age ) {
+ float max_initial_velocity = 2.0f;
+ p->x = -dx;
+ p->y = -dy;
+ p->xx = 0;
+ p->yy = 0;
+ p->vx = max_initial_velocity * cos(direction);
+ p->vy = max_initial_velocity * sin(direction);
+
+ p->age = random() % max_age;
+
+ p->color = color;
+}
+
+static void clamp ( int* value, int l, int h ) {
+ if ( *value < l ) *value = l;
+ if ( *value > h ) *value = h;
+}
+
+static pixel_t next_color ( struct state* st, pixel_t current ) {
+ int r=0, g=0, b=0;
+
+ point2rgb(st->depth, current, &r, &g, &b);
+ r += random() % 5 - 2;
+ g += random() % 5 - 2;
+ b += random() % 5 - 2;
+ clamp(&r, 0, 255);
+ clamp(&g, 0, 255);
+ clamp(&b, 0, 255);
+
+ return rgb2point( st->depth, r, g, b );
+}
+
+
+static void create_particles ( struct state* st ) {
+ int i;
+ float emitx, emity;
+ float direction;
+
+ for ( i = 0; i < st->particles_number; i++ ) {
+ emitx = ( st->ring_radius * sinf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
+ emity = ( st->ring_radius * cosf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
+ direction = (M_PI * i) / st->particles_number;
+
+ if ( st->epoch == WHITE && st->color )
+ st->colors[WHITE] = next_color(st, st->colors[WHITE]);
+
+ init_particle(st->particles + i, emitx, emity, direction, st->colors[WHITE], st->max_age);
+ }
+}
+
+
+/* randomly move one particle and draw it */
+static void move ( particle_t* p, struct state * st ) {
+ int w = st->width / 2;
+ int h = st->height / 2;
+ float max_dv = 1.0f;
+
+ p->xx = p->x;
+ p->yy = p->y;
+ p->x += p->vx;
+ p->y += p->vy;
+ p->vx += frand1() * st->curliness * max_dv;
+ p->vy += frand1() * st->curliness * max_dv;
+
+
+#if ANTIALIAS
+ draw_line_antialias( st,
+ w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
+ draw_line_antialias( st,
+ w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
+#else
+ draw_line( st, w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
+ draw_line( st, w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
+#endif
+
+ p->age++;
+ /* if this is too old, die and reborn */
+ if ( p->age > st->max_age ) {
+ float dir = frand1() * 2 * M_PI;
+ p->x = st->ring_radius * sin(dir);
+ p->y = st->ring_radius * cos(dir);
+ p->xx = p->yy = p->vx = p->vy = 0;
+ p->age = 0;
+
+ if ( st->epoch == WHITE && st->color )
+ st->colors[WHITE] = next_color(st, st->colors[WHITE] );
+
+ p->color = st->colors[st->epoch];
+ }
+}
+
+
+
+
+/* Initialize Everything */
+static void* binaryring_init ( Display* display, Window window ) {
+ XWindowAttributes xgwa;
+
+ struct state *st = ( struct state* ) calloc ( 1, sizeof( *st ) );
+
+ XGetWindowAttributes( display, window, &xgwa );
+
+ st->epoch = WHITE;
+ st->display = display;
+ st->window = window;
+ st->particles_number = (get_integer_resource(st->display, "particles_number", "Integer"));
+ st->growth_delay = (get_integer_resource(st->display, "growth_delay", "Integer"));
+ st->ring_radius = (get_integer_resource(st->display, "ring_radius", "Integer"));
+ st->max_age = (get_integer_resource(st->display, "max_age", "Integer"));
+ st->color = get_boolean_resource(st->display, "color", "Boolean");
+ st->height = xgwa.height;
+ st->width = xgwa.width;
+ st->visual = xgwa.visual;
+ st->curliness = 0.5;
+
+
+ st->depth = visual_depth(xgwa.screen, st->visual);
+ st->colors[0] = rgb2point(st->depth, 0, 0, 0);
+ st->colors[1] = rgb2point(st->depth, 255, 255, 255);
+
+ /*describe_visual (stdout, xgwa.screen, xgwa.visual, False);*/
+
+ st->particles = malloc (st->particles_number * sizeof( particle_t ) );
+ create_particles ( st );
+
+ st->gc = XCreateGC( st->display, st->window, 0, &st->gcv );
+ create_buffers ( st, display, xgwa.screen, window, st->gc );
+
+
+ return st;
+}
+
+
+static unsigned long binaryring_draw ( Display* display, Window win, void *closure ) {
+ struct state *st = (struct state *) closure;
+ int i;
+
+ for ( i = 0; i < st->particles_number; i++ )
+ move( &(st->particles[i]), st );
+
+ /* draw the XImage in the Pixmap and the put the Pixmap on the screen */
+ XPutImage( display, st->pix, st->gc, st->buf, 0, 0, 0, 0, st->width, st->height);
+ XCopyArea( display, st->pix, win, st->gc, 0, 0, st->width, st->height, 0, 0 );
+
+ /* randomly switch ageColor periods */
+ if ( random() % 10000 > 9950 )
+ st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
+
+ return st->growth_delay;
+}
+
+
+
+static void binaryring_reshape ( Display* display, Window win, void *closure, unsigned int w, unsigned int h ) {
+ struct state *st = (struct state *) closure;
+
+ XWindowAttributes tmp;
+ XGetWindowAttributes(display, win, &tmp);
+
+ if ( tmp.height != st->height || tmp.width != st->width ) {
+ st->height = tmp.height;
+ st->width = tmp.width;
+
+
+ st->epoch = WHITE;
+ create_particles ( st );
+
+ create_buffers ( st, display, tmp.screen, win, st->gc );
+ }
+}
+
+
+/* if someone press a key switch the color */
+static Bool binaryring_event ( Display* display, Window win, void *closure, XEvent* event ) {
+ struct state *st = (struct state *) closure;
+
+ if ( (*event).xany.type == KeyPress ) {
+ st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
+ }
+
+ return False;
+}
+
+
+/* delete everything */
+static void binaryring_free ( Display* display, Window win, void *closure ) {
+ struct state *st = (struct state *) closure;
+ XWindowAttributes tmp;
+ XGetWindowAttributes(display, win, &tmp);
+
+ free( st->buffer );
+ free( st->particles );
+
+ free ( st );
+}
+
+
+/* Default resources of the program */
+static const char* binaryring_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*growth_delay: 10000",
+ "*particles_number: 5000",
+ "*ring_radius: 40",
+ "*max_age: 400",
+ "*color: True",
+ "*ignoreRotation: True",
+ 0
+};
+
+static XrmOptionDescRec binaryring_options [] = {
+ { "-particles-number", ".particles_number", XrmoptionSepArg, 0 },
+ { "-growth-delay", ".growth_delay", XrmoptionSepArg, 0 },
+ { "-ring-radius", ".ring_radius", XrmoptionSepArg, 0 },
+ { "-max-age", ".max_age", XrmoptionSepArg, 0 },
+ { "-color", ".color", XrmoptionNoArg, "True" },
+ { "-no-color", ".color", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0}
+};
+
+XSCREENSAVER_MODULE("BinaryRing", binaryring)
diff --git a/hacks/binaryring.man b/hacks/binaryring.man
new file mode 100644
index 0000000..2d44496
--- /dev/null
+++ b/hacks/binaryring.man
@@ -0,0 +1,88 @@
+.TH "Binary Ring" 1 "02-Sep-14" "X Version 11"
+.SH NAME
+binaryring - A system of path tracing particles evolves continuously from an initial creation.
+.SH SYNOPSIS
+.B binaryring
+[\-fps]
+[\-install]
+[\-noinstall]
+[\-mono]
+[\-root]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-window\-id \fIwindow\-id\fP]
+[\-color]
+[\-no\-color]
+[\-growth\-delay \fIdelayms\fP]
+[\-particle\-number \fIparticles\fP]
+[\-ring\-radius \fIradius\fP]
+.SH DESCRIPTION
+A system of path tracing particles evolves continuously from an initial circular creation.
+Ages of darkness play arbitrarily with ages of light.
+
+Ported (with some extensions) from the code by J. Tarbell at http://complexification.net
+.SH OPTIONS
+.I binaryring
+accepts the following options:
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-window\-id \fIwindow\-id\fP
+Specify which window id to use.
+.TP 8
+.B \-color (Default)
+Particles have random generated colors that gradually change over time.
+.TP 8
+.B \-no\-color
+Use the original black and white visualization.
+.TP 8
+.B \-growth\-delay \fIdelayms\fP (Default: \fI10000\fP)
+Delay in ms between growth cycles. More delay, slower (but less CPU intensive).
+.TP 8
+.B \-particles\-number \fIparticles\fP (Default: \fI5000\fP)
+The number of particles in the system. With more particles the fps
+can also be affected.
+.TP 8
+.B \-ring\-radius \fIradius\fP (Default: \fI40\fP)
+The radius of the ring where the particles are born, in pixels.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global
+resources stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by J. Tarbell
+(complex@complexification.net, http://www.complexification.net).
+
+Ported to XScreensaver by Emilio Del Tessandoro (emilio.deltessa@gmail.com)
+.SH AUTHOR
+J. Tarbell <complex@complexification.net>, Jun-03
+
+Emilio Del Tessandoro <emilio.deltessa@gmail.com>, Aug-14
diff --git a/hacks/blaster.c b/hacks/blaster.c
new file mode 100644
index 0000000..a60351a
--- /dev/null
+++ b/hacks/blaster.c
@@ -0,0 +1,1191 @@
+/* -*- mode: C; tab-width: 2 -*-
+ * blaster, Copyright (c) 1999 Jonathan H. Lin <jonlin@tesuji.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Robots that move randomly and shoot lasers at each other. If the
+ * mothership is active, it will fly back and forth horizontally,
+ * firing 8 lasers in the 8 cardinal directions. The explosions are
+ * a 20 frame animation. Robots regenerate after the explosion is finished
+ * and all of its lasers have left the screen.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "screenhack.h"
+
+struct laser_state {
+ int active;
+ int start_x,start_y;
+ int end_x, end_y;
+};
+
+struct robot_state {
+ int alive;
+ int death;
+
+ int move_style;
+ int target;
+
+ int old_x, old_y;
+ int new_x, new_y;
+
+ int radius;
+ GC robot_color;
+ GC laser_color;
+ struct laser_state *lasers;
+};
+
+struct mother_ship_state {
+ int active;
+ int death;
+ int old_x,new_x;
+ int y;
+ GC ship_color;
+ GC laser_color;
+ struct laser_state *lasers;
+};
+
+
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC r_color0, r_color1, r_color2, r_color3, r_color4, r_color5, l_color0, l_color1;
+ GC s_color;
+ GC black;
+
+ int delay;
+
+ int NUM_ROBOTS;
+ int NUM_LASERS;
+
+ int MOTHER_SHIP;
+ int MOTHER_SHIP_WIDTH;
+ int MOTHER_SHIP_HEIGHT;
+ int MOTHER_SHIP_LASER;
+ int MOTHER_SHIP_PERIOD;
+ int MOTHER_SHIP_HITS;
+
+ int LINE_MOVE_STYLE;
+ int RANDOM_MOVE_STYLE;
+ int NUM_MOVE_STYLES;
+
+ int EXPLODE_SIZE_1;
+ int EXPLODE_SIZE_2;
+ int EXPLODE_SIZE_3;
+ GC EXPLODE_COLOR_1;
+ GC EXPLODE_COLOR_2;
+
+ XArc *stars;
+ int NUM_STARS;
+ int MOVE_STARS;
+ int MOVE_STARS_X;
+ int MOVE_STARS_Y;
+ int MOVE_STARS_RANDOM;
+
+ struct mother_ship_state *mother;
+
+ struct robot_state *robots;
+
+ XWindowAttributes xgwa;
+
+ int initted;
+
+ int draw_x;
+ int draw_y;
+ int draw_z;
+};
+
+
+/* creates a new robot. It starts out on one of the edges somewhere and
+ has no initial velocity. A target is randomly picked. */
+static void make_new_robot(struct state *st, int index)
+{
+ int laser_check = 0;
+ int x=0;
+
+ for(x=0;x<st->NUM_LASERS;x++) {
+ if(st->robots[index].lasers[x].active) {
+ x=st->NUM_LASERS;
+ laser_check = 1;
+ }
+ }
+ if(laser_check==0) {
+ st->robots[index].alive=1;
+
+ st->robots[index].radius = 7+(random()%7);
+
+ st->robots[index].move_style = random()%st->NUM_MOVE_STYLES;
+ if(random()%2==0) {
+ st->robots[index].new_x=random()%(st->xgwa.width-st->robots[index].radius);
+ st->robots[index].old_x=st->robots[index].new_x;
+ if(random()%2==0) {
+ st->robots[index].new_y=0;
+ st->robots[index].old_y=0;
+ }
+ else {
+ st->robots[index].new_y=st->xgwa.height-st->robots[index].radius;
+ st->robots[index].old_y = st->robots[index].new_y;
+ }
+ }
+ else {
+ st->robots[index].new_y=random()%(st->xgwa.height-st->robots[index].radius);
+ st->robots[index].old_y = st->robots[index].new_y;
+ if(random()%2) {
+ st->robots[index].new_x=0;
+ st->robots[index].old_x=0;
+ }
+ else {
+ st->robots[index].new_x=st->xgwa.width-st->robots[index].radius;
+ st->robots[index].old_x=st->robots[index].new_x;
+ }
+ }
+
+ x=random()%6;
+ if(x==0) {
+ st->robots[index].robot_color = st->r_color0;
+ }
+ else if(x==1) {
+ st->robots[index].robot_color = st->r_color1;
+ }
+ else if(x==2) {
+ st->robots[index].robot_color = st->r_color2;
+ }
+ else if(x==3) {
+ st->robots[index].robot_color = st->r_color3;
+ }
+ else if(x==4) {
+ st->robots[index].robot_color = st->r_color4;
+ }
+ else if(x==5) {
+ st->robots[index].robot_color = st->r_color5;
+ }
+
+ if(random()%2==0) {
+ st->robots[index].laser_color = st->l_color0;
+ }
+ else {
+ st->robots[index].laser_color = st->l_color1;
+ }
+
+ if(st->NUM_ROBOTS>1) {
+ st->robots[index].target = random()%st->NUM_ROBOTS;
+ while(st->robots[index].target==index) {
+ st->robots[index].target = random()%st->NUM_ROBOTS;
+ }
+ }
+ }
+}
+
+/* moves each robot, randomly changing its direction and velocity.
+ At random a laser is shot toward that robot's target. Also at random
+ the target can change. */
+static void move_robots(struct state *st)
+{
+ int x=0;
+ int y=0;
+ int dx=0;
+ int dy=0;
+ int target_x = 0;
+ int target_y = 0;
+ double slope = 0;
+
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ if(st->robots[x].alive) {
+ if((st->robots[x].new_x == st->robots[x].old_x) && (st->robots[x].new_y == st->robots[x].old_y)) {
+ if(st->robots[x].new_x==0) {
+ st->robots[x].old_x = -((random()%3)+1);
+ }
+ else {
+ st->robots[x].old_x = st->robots[x].old_x + (random()%3)+1;
+ }
+ if(st->robots[x].new_y==0) {
+ st->robots[x].old_y = -((random()%3)+1);
+ }
+ else {
+ st->robots[x].old_y = st->robots[x].old_y + (random()%3)+1;
+ }
+ }
+ if(st->robots[x].move_style==st->LINE_MOVE_STYLE) {
+ dx = st->robots[x].new_x - st->robots[x].old_x;
+ dy = st->robots[x].new_y - st->robots[x].old_y;
+ if(dx > 3) {
+ dx = 3;
+ }
+ else if(dx < -3) {
+ dx = -3;
+ }
+ if(dy > 3) {
+ dy = 3;
+ }
+ else if(dy < -3) {
+ dy = -3;
+ }
+ st->robots[x].old_x = st->robots[x].new_x;
+ st->robots[x].old_y = st->robots[x].new_y;
+
+ st->robots[x].new_x = st->robots[x].new_x + dx;
+ st->robots[x].new_y = st->robots[x].new_y + dy;
+ }
+ else if(st->robots[x].move_style==st->RANDOM_MOVE_STYLE) {
+ dx = st->robots[x].new_x - st->robots[x].old_x;
+ dy = st->robots[x].new_y - st->robots[x].old_y;
+ y=random()%3;
+ if(y==0) {
+ dx = dx - ((random()%7)+1);
+ }
+ else if(y==1){
+ dx = dx + ((random()%7)+1);
+ }
+ else {
+ dx = (-1)*dx;
+ }
+ if(dx > 3) {
+ dx = 3;
+ }
+ else if(dx < -3) {
+ dx = -3;
+ }
+
+ y = random()%3;
+ if(y==0) {
+ dy = dy - ((random()%7)+1);
+ }
+ else if(y==1){
+ dy = dy + ((random()%7)+1);
+ }
+ else {
+ dx = (-1)*dx;
+ }
+ if(dy > 3) {
+ dy = 3;
+ }
+ else if(dy < -3) {
+ dy = -3;
+ }
+ st->robots[x].old_x = st->robots[x].new_x;
+ st->robots[x].old_y = st->robots[x].new_y;
+
+ st->robots[x].new_x = st->robots[x].new_x + dx;
+ st->robots[x].new_y = st->robots[x].new_y + dy;
+ }
+
+ /* bounds corrections */
+ if(st->robots[x].new_x >= st->xgwa.width-st->robots[x].radius) {
+ st->robots[x].new_x = st->xgwa.width - st->robots[x].radius;
+ }
+ else if(st->robots[x].new_x < 0) {
+ st->robots[x].new_x = 0;
+ }
+ if(st->robots[x].new_y >= st->xgwa.height-st->robots[x].radius) {
+ st->robots[x].new_y = st->xgwa.height - st->robots[x].radius;
+ }
+ else if(st->robots[x].new_y < 0) {
+ st->robots[x].new_y = 0;
+ }
+
+ if(random()%10==0) {
+ st->robots[x].move_style = 1;
+ }
+ else {
+ st->robots[x].move_style = 0;
+ }
+
+ if(st->NUM_ROBOTS>1) {
+ if(random()%2==0) {
+ if(random()%200==0) {
+ st->robots[x].target = random()%st->NUM_ROBOTS;
+ while(st->robots[x].target==x) {
+ st->robots[x].target = random()%st->NUM_ROBOTS;
+ }
+ for(y=0;y<st->NUM_LASERS;y++) {
+ if(st->robots[x].lasers[y].active == 0) {
+ st->robots[x].lasers[y].active = 1;
+ if(random()%2==0) {
+ if(random()%2==0) {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
+ }
+ }
+ else {
+ if(random()%2==0) {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
+ }
+ }
+ y = st->NUM_LASERS;
+ }
+ }
+ }
+ else {
+ for(y=0;y<st->NUM_LASERS;y++) {
+ if(st->robots[x].lasers[y].active==0) {
+ target_x = st->robots[st->robots[x].target].new_x;
+ target_y = st->robots[st->robots[x].target].new_y;
+ if((target_x-st->robots[x].new_x)!=0) {
+ slope = ((double)target_y-st->robots[x].new_y)/((double)(target_x-st->robots[x].new_x));
+
+ if((slope<1) && (slope>-1)) {
+ if(target_x>st->robots[x].new_x) {
+ st->robots[x].lasers[y].start_x = st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x + 7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = -st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x - 7;
+ }
+ st->robots[x].lasers[y].start_y = (int)(st->robots[x].lasers[y].start_x * slope);
+ st->robots[x].lasers[y].end_y = (int)(st->robots[x].lasers[y].end_x * slope);
+ }
+ else {
+ slope = (target_x-st->robots[x].new_x)/(target_y-st->robots[x].new_y);
+ if(target_y>st->robots[x].new_y) {
+ st->robots[x].lasers[y].start_y = st->robots[x].radius;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y + 7;
+ }
+ else {
+ st->robots[x].lasers[y].start_y = -st->robots[x].radius;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y - 7;
+ }
+ st->robots[x].lasers[y].start_x = (int)(st->robots[x].lasers[y].start_y * slope);;
+ st->robots[x].lasers[y].end_x = (int)(st->robots[x].lasers[y].end_y * slope);
+ }
+ st->robots[x].lasers[y].start_x = st->robots[x].lasers[y].start_x + st->robots[x].new_x;
+ st->robots[x].lasers[y].start_y = st->robots[x].lasers[y].start_y + st->robots[x].new_y;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].end_x + st->robots[x].new_x;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].end_y + st->robots[x].new_y;
+ }
+ else {
+ if(target_y > st->robots[x].new_y) {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
+ }
+ }
+
+ if((((st->robots[x].lasers[y].start_x - st->robots[x].lasers[y].end_x) > 7) ||
+ ((st->robots[x].lasers[y].end_x - st->robots[x].lasers[y].start_x) > 7)) &&
+ (((st->robots[x].lasers[y].start_y - st->robots[x].lasers[y].end_y) > 7) ||
+ ((st->robots[x].lasers[y].end_y - st->robots[x].lasers[y].start_y) > 7))) {
+ }
+ else {
+ st->robots[x].lasers[y].active = 1;
+ y = st->NUM_LASERS;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ if(st->robots[x].death==0) {
+ make_new_robot(st,x);
+ }
+ }
+ }
+
+}
+
+/* This moves a single laser one frame. collisions with other robots or
+ the mothership is checked. */
+static void move_laser(struct state *st, int rindex, int index)
+{
+ int x=0;
+ int y=0;
+ int z=0;
+ int dx=0;
+ int dy=0;
+ struct laser_state *laser;
+ if(rindex>=0) {
+ laser = st->robots[rindex].lasers;
+ }
+ else {
+ laser = st->mother->lasers;
+ }
+ if(laser[index].active) {
+ /* collision with other robots are checked here */
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ if(x!=rindex) {
+ if(st->robots[x].alive) {
+ y = laser[index].start_x-st->robots[x].new_x;
+ if(y<0) {
+ y = st->robots[x].new_x-laser[index].start_x;
+ }
+ z = laser[index].start_y-st->robots[x].new_y;
+ if(z<0) {
+ z = st->robots[x].new_y-laser[index].start_y;
+ }
+ if((z<st->robots[x].radius-1)&&(y<st->robots[x].radius-1)) {
+ st->robots[x].alive = 0;
+ st->robots[x].death = 20;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ laser[index].active = 0;
+ x = st->NUM_ROBOTS;
+ }
+ else {
+ y = laser[index].end_x-st->robots[x].new_x;
+ if(y<0) {
+ y = st->robots[x].new_x-laser[index].end_x;
+ }
+ z = laser[index].end_y-st->robots[x].new_y;
+ if(z<0) {
+ z = st->robots[x].new_y-laser[index].end_y;
+ }
+ if((z<st->robots[x].radius-1)&&(y<st->robots[x].radius-1)) {
+ st->robots[x].alive = 0;
+ st->robots[x].death = 20;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ laser[index].active = 0;
+ x = st->NUM_ROBOTS;
+ }
+ }
+ }
+ }
+ }
+ if((st->MOTHER_SHIP)&&(rindex!=-1)) {
+ if(laser[index].active) {
+ if(st->mother->active) {
+ y = laser[index].start_x-st->mother->new_x;
+ if(y<0) {
+ y = st->mother->new_x-laser[index].start_x;
+ }
+ z = laser[index].start_y-st->mother->y;
+ if(z<0) {
+ z = st->mother->y-laser[index].start_y;
+ }
+ if((z<st->MOTHER_SHIP_HEIGHT-1)&&(y<st->MOTHER_SHIP_WIDTH-1)) {
+ laser[index].active = 0;
+ st->mother->active--;
+ }
+ else {
+ y = laser[index].end_x-st->mother->new_x;
+ if(y<0) {
+ y = st->mother->new_x-laser[index].end_x;
+ }
+ z = laser[index].end_y-st->mother->y;
+ if(z<0) {
+ z = st->mother->y-laser[index].end_y;
+ }
+ if((z<st->MOTHER_SHIP_HEIGHT-1)&&(y<st->MOTHER_SHIP_WIDTH-1)) {
+ laser[index].active = 0;
+ st->mother->active--;
+ }
+ }
+
+ if(st->mother->active==0) {
+ st->mother->death=20;
+ }
+ }
+ }
+ }
+
+ if(laser[index].active) {
+ dx = laser[index].start_x - laser[index].end_x;
+ dy = laser[index].start_y - laser[index].end_y;
+
+ laser[index].start_x = laser[index].end_x;
+ laser[index].start_y = laser[index].end_y;
+ laser[index].end_x = laser[index].end_x-dx;
+ laser[index].end_y = laser[index].end_y-dy;
+
+ if((laser[index].end_x < 0) || (laser[index].end_x >= st->xgwa.width) ||
+ (laser[index].end_y < 0) || (laser[index].end_y >= st->xgwa.height)) {
+ laser[index].active = 0;
+ }
+ }
+ }
+}
+
+/* All the robots are drawn, including the mother ship and the explosions.
+ After all the robots have been drawn, their laser banks are check and
+ the active lasers are drawn. */
+static void draw_robots(struct state *st)
+{
+ int x=0;
+ int y=0;
+
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ if(st->robots[x].alive) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ XFillArc(st->dpy, st->window, st->robots[x].robot_color, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ }
+ else {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ if(st->robots[x].death) {
+ if(st->robots[x].death==20) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==18) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==17) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==15) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==14) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==13) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==12) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==11) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==10) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==9) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==8) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==7) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==6) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->robots[x].death==4) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->robots[x].death==3) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->robots[x].death==2) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(1.7*st->robots[x].radius/2), st->robots[x].new_y+(1.7*st->robots[x].radius/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ else if(st->robots[x].death==1) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(1.7*st->robots[x].radius/2), st->robots[x].new_y+(1.7*st->robots[x].radius/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ st->robots[x].death--;
+ }
+ }
+ }
+
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ for(y=0;y<st->NUM_LASERS;y++) {
+ if(st->robots[x].lasers[y].active) {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->robots[x].lasers[y].start_x,
+ st->robots[x].lasers[y].start_y,
+ st->robots[x].lasers[y].end_x,
+ st->robots[x].lasers[y].end_y);
+ move_laser(st, x, y);
+ if(st->robots[x].lasers[y].active) {
+ XDrawLine(st->dpy, st->window, st->robots[x].laser_color, st->robots[x].lasers[y].start_x,
+ st->robots[x].lasers[y].start_y,
+ st->robots[x].lasers[y].end_x,
+ st->robots[x].lasers[y].end_y);
+ }
+ else {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->robots[x].lasers[y].start_x,
+ st->robots[x].lasers[y].start_y,
+ st->robots[x].lasers[y].end_x,
+ st->robots[x].lasers[y].end_y);
+ }
+ }
+ }
+ }
+
+ if(st->MOTHER_SHIP) {
+ if(st->mother->active) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ XFillArc(st->dpy, st->window, st->mother->ship_color, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ }
+ else {
+ if(st->mother->death) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ if(st->mother->death==20) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==18) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==17) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==15) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==14) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==13) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==12) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==11) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==10) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==9) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==8) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==7) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==6) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->mother->death==4) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->mother->death==3) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->mother->death==2) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+(1.7*st->MOTHER_SHIP_WIDTH/2), st->mother->y+(1.7*st->MOTHER_SHIP_HEIGHT/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ else if(st->mother->death==1) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+(1.7*st->MOTHER_SHIP_WIDTH/2), st->mother->y+(1.7*st->MOTHER_SHIP_HEIGHT/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ st->mother->death--;
+ }
+ }
+ for(y=0;y<8;y++) {
+ if(st->mother->lasers[y].active) {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->mother->lasers[y].start_x,
+ st->mother->lasers[y].start_y,
+ st->mother->lasers[y].end_x,
+ st->mother->lasers[y].end_y);
+ move_laser(st, -1,y);
+ if(st->mother->lasers[y].active) {
+ XDrawLine(st->dpy, st->window, st->mother->laser_color, st->mother->lasers[y].start_x,
+ st->mother->lasers[y].start_y,
+ st->mother->lasers[y].end_x,
+ st->mother->lasers[y].end_y);
+ }
+ else {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->mother->lasers[y].start_x,
+ st->mother->lasers[y].start_y,
+ st->mother->lasers[y].end_x,
+ st->mother->lasers[y].end_y);
+ }
+ }
+ }
+ }
+}
+
+static void
+init_stars(struct state *st)
+{
+ if(st->NUM_STARS) {
+ if (! st->stars)
+ st->stars = (XArc *) malloc (st->NUM_STARS * sizeof(XArc));
+ for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
+ st->stars[st->draw_x].x = random()%st->xgwa.width;
+ st->stars[st->draw_x].y = random()%st->xgwa.height;
+ st->stars[st->draw_x].width = random()%4 + 1;
+ st->stars[st->draw_x].height = st->stars[st->draw_x].width;
+ st->stars[st->draw_x].angle1 = 0;
+ st->stars[st->draw_x].angle2 = 360 * 64;
+ }
+ }
+}
+
+
+static unsigned long
+blaster_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (dpy, window);
+#endif
+
+ if (!st->initted)
+ {
+ st->initted = 1;
+
+ st->robots = (struct robot_state *) malloc(st->NUM_ROBOTS * sizeof (struct robot_state));
+ for(st->draw_x=0;st->draw_x<st->NUM_ROBOTS;st->draw_x++) {
+ st->robots[st->draw_x].alive = 0;
+ st->robots[st->draw_x].death = 0;
+ st->robots[st->draw_x].lasers = (struct laser_state *) malloc (st->NUM_LASERS * sizeof(struct laser_state));
+ for(st->draw_y=0;st->draw_y<st->NUM_LASERS;st->draw_y++) {
+ st->robots[st->draw_x].lasers[st->draw_y].active = 0;
+ }
+ }
+
+ init_stars(st);
+ }
+
+ if(st->NUM_STARS) {
+ if(st->MOVE_STARS) {
+ if (st->black) XFillArcs(st->dpy,st->window,st->black,st->stars,st->NUM_STARS);
+ if(st->MOVE_STARS_RANDOM) {
+ st->draw_y = st->MOVE_STARS_X;
+ st->draw_z = st->MOVE_STARS_Y;
+ if(random()%167==0) {
+ st->draw_y = (-1)*st->draw_y;
+ }
+ if(random()%173==0) {
+ st->draw_z = (-1)*st->draw_z;
+ }
+ if(random()%50==0) {
+ if(random()%2) {
+ st->draw_y++;
+ if(st->draw_y>st->MOVE_STARS_RANDOM) {
+ st->draw_y = st->MOVE_STARS_RANDOM;
+ }
+ }
+ else {
+ st->draw_y--;
+ if(st->draw_y < -(st->MOVE_STARS_RANDOM)) {
+ st->draw_y = -(st->MOVE_STARS_RANDOM);
+ }
+ }
+ }
+ if(random()%50==0) {
+ if(random()%2) {
+ st->draw_z++;
+ if(st->draw_z>st->MOVE_STARS_RANDOM) {
+ st->draw_z = st->MOVE_STARS_RANDOM;
+ }
+ }
+ else {
+ st->draw_z--;
+ if(st->draw_z < -st->MOVE_STARS_RANDOM) {
+ st->draw_z = -st->MOVE_STARS_RANDOM;
+ }
+ }
+ }
+ st->MOVE_STARS_X = st->draw_y;
+ st->MOVE_STARS_Y = st->draw_z;
+ for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->draw_y;
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->draw_z;
+ if(st->stars[st->draw_x].x<0) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->xgwa.width;
+ }
+ else if(st->stars[st->draw_x].x>st->xgwa.width) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x - st->xgwa.width;
+ }
+ if(st->stars[st->draw_x].y<0) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->xgwa.height;
+ }
+ else if(st->stars[st->draw_x].y>st->xgwa.height) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y - st->xgwa.height;
+ }
+ }
+ }
+ else {
+ for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->MOVE_STARS_X;
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->MOVE_STARS_Y;
+ if(st->stars[st->draw_x].x<0) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->xgwa.width;
+ }
+ else if(st->stars[st->draw_x].x>st->xgwa.width) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x - st->xgwa.width;
+ }
+ if(st->stars[st->draw_x].y<0) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->xgwa.height;
+ }
+ else if(st->stars[st->draw_x].y>st->xgwa.height) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y - st->xgwa.height;
+ }
+ }
+ }
+ XFillArcs(st->dpy,st->window,st->s_color,st->stars,st->NUM_STARS);
+ }
+ else {
+ XFillArcs(st->dpy,st->window,st->s_color,st->stars,st->NUM_STARS);
+ }
+ }
+
+ if(st->MOTHER_SHIP) {
+ if(random()%st->MOTHER_SHIP_PERIOD==0) {
+ if((st->mother->active==0)&&(st->mother->death==0)) {
+ st->mother->active = st->MOTHER_SHIP_HITS;
+ st->mother->y = random()%(st->xgwa.height-7);
+ if(random()%2==0) {
+ st->mother->old_x=0;
+ st->mother->new_x=0;
+ }
+ else {
+ st->mother->old_x=st->xgwa.width-25;
+ st->mother->new_x=st->xgwa.width-25;
+ }
+ }
+ }
+ }
+ move_robots(st);
+ if(st->MOTHER_SHIP) {
+ if(st->mother->active) {
+ if(st->mother->old_x==st->mother->new_x) {
+ if(st->mother->old_x==0) {
+ st->mother->new_x=3;
+ }
+ else {
+ st->mother->new_x=st->mother->new_x-3;
+ }
+ }
+ else {
+ if(st->mother->old_x>st->mother->new_x) {
+ st->mother->old_x = st->mother->new_x;
+ st->mother->new_x = st->mother->new_x-3;
+ if(st->mother->new_x<0) {
+ st->mother->active=0;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ }
+ }
+ else {
+ st->mother->old_x = st->mother->new_x;
+ st->mother->new_x = st->mother->new_x+3;
+ if(st->mother->new_x>st->xgwa.width) {
+ st->mother->active=0;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ }
+ }
+ }
+ st->draw_y=0;
+ for(st->draw_x=0;st->draw_x<8;st->draw_x++) {
+ if(st->mother->lasers[st->draw_x].active) {
+ st->draw_y=1;
+ st->draw_x=8;
+ }
+ }
+ if(st->draw_y==0) {
+ for(st->draw_x=0;st->draw_x<8;st->draw_x++) {
+ st->mother->lasers[st->draw_x].active = 1;
+ st->mother->lasers[st->draw_x].start_x=st->mother->new_x+(st->MOTHER_SHIP_WIDTH/2);
+ st->mother->lasers[st->draw_x].start_y=st->mother->y+(st->MOTHER_SHIP_HEIGHT/2);
+ }
+ st->draw_y = (int)(st->MOTHER_SHIP_LASER/1.5);
+ st->mother->lasers[0].end_x=st->mother->lasers[0].start_x-st->MOTHER_SHIP_LASER;
+ st->mother->lasers[0].end_y=st->mother->lasers[0].start_y;
+ st->mother->lasers[1].end_x=st->mother->lasers[1].start_x-st->draw_y;
+ st->mother->lasers[1].end_y=st->mother->lasers[1].start_y-st->draw_y;
+ st->mother->lasers[2].end_x=st->mother->lasers[2].start_x;
+ st->mother->lasers[2].end_y=st->mother->lasers[2].start_y-st->MOTHER_SHIP_LASER;
+ st->mother->lasers[3].end_x=st->mother->lasers[3].start_x+st->draw_y;
+ st->mother->lasers[3].end_y=st->mother->lasers[3].start_y-st->draw_y;
+ st->mother->lasers[4].end_x=st->mother->lasers[4].start_x+st->MOTHER_SHIP_LASER;
+ st->mother->lasers[4].end_y=st->mother->lasers[4].start_y;
+ st->mother->lasers[5].end_x=st->mother->lasers[5].start_x+st->draw_y;
+ st->mother->lasers[5].end_y=st->mother->lasers[5].start_y+st->draw_y;
+ st->mother->lasers[6].end_x=st->mother->lasers[6].start_x;
+ st->mother->lasers[6].end_y=st->mother->lasers[6].start_y+st->MOTHER_SHIP_LASER;
+ st->mother->lasers[7].end_x=st->mother->lasers[7].start_x-st->draw_y;
+ st->mother->lasers[7].end_y=st->mother->lasers[7].start_y+st->draw_y;
+ }
+ }
+ }
+ draw_robots(st);
+
+ return st->delay;
+}
+
+static void *
+blaster_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ Colormap cmap;
+ unsigned long bg;
+
+ st->dpy = d;
+ st->window = w;
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+ cmap = st->xgwa.colormap;
+
+ st->NUM_ROBOTS=5;
+ st->NUM_LASERS=3;
+
+ st->MOTHER_SHIP_WIDTH=25;
+ st->MOTHER_SHIP_HEIGHT=7;
+ st->MOTHER_SHIP_LASER=15;
+ st->MOTHER_SHIP_PERIOD=150;
+ st->MOTHER_SHIP_HITS=10;
+
+ st->RANDOM_MOVE_STYLE=1;
+ st->NUM_MOVE_STYLES=2;
+
+ st->EXPLODE_SIZE_1=27;
+ st->EXPLODE_SIZE_2=19;
+ st->EXPLODE_SIZE_3=7;
+
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ if(st->delay==0) {
+ st->delay=10000;
+ }
+ st->NUM_ROBOTS = get_integer_resource(st->dpy, "num_robots","Integer");
+ if(st->NUM_ROBOTS==0) {
+ st->NUM_ROBOTS=5;
+ }
+ st->NUM_LASERS = get_integer_resource(st->dpy, "num_lasers","Integer");
+ st->EXPLODE_SIZE_1 = get_integer_resource(st->dpy, "explode_size_1","Integer");
+ st->EXPLODE_SIZE_2 = get_integer_resource(st->dpy, "explode_size_2","Integer");
+ st->EXPLODE_SIZE_3 = get_integer_resource(st->dpy, "explode_size_3","Integer");
+
+ st->NUM_STARS = get_integer_resource(st->dpy, "num_stars","Integer");
+ if(get_boolean_resource(st->dpy, "move_stars","Boolean")) {
+ st->MOVE_STARS = 1;
+ st->MOVE_STARS_X = get_integer_resource(st->dpy, "move_stars_x","Integer");
+ st->MOVE_STARS_Y = get_integer_resource(st->dpy, "move_stars_y","Integer");
+ st->MOVE_STARS_RANDOM = get_integer_resource(st->dpy, "move_stars_random","Integer");
+ }
+ else {
+ st->MOVE_STARS = 0;
+ }
+
+
+ bg = get_pixel_resource(st->dpy, cmap, "background","Background");
+ gcv.function = GXcopy;
+
+#define make_gc(color,name) \
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, (name), "Foreground"); \
+ color = XCreateGC (st->dpy, st->window, GCForeground|GCFunction, &gcv)
+
+ if(mono_p) {
+ gcv.foreground = bg;
+ st->black = XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv);
+ gcv.foreground = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
+ st->r_color0 = st->r_color1 = st->r_color2 = st->r_color3 = st->r_color4 = st->r_color5 = st->l_color0 = st->l_color1 = st->s_color=
+ XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv);
+ if(get_boolean_resource(st->dpy, "mother_ship","Boolean")) {
+ st->MOTHER_SHIP_WIDTH=get_integer_resource(st->dpy, "mother_ship_width","Integer");
+ st->MOTHER_SHIP_HEIGHT=get_integer_resource(st->dpy, "mother_ship_height","Integer");
+ st->MOTHER_SHIP_LASER=get_integer_resource(st->dpy, "mother_ship_laser","Integer");
+ st->MOTHER_SHIP_PERIOD=get_integer_resource(st->dpy, "mother_ship_period","Integer");
+ st->MOTHER_SHIP_HITS=get_integer_resource(st->dpy, "mother_ship_hits","Integer");
+ st->MOTHER_SHIP=1;
+ st->mother = (struct mother_ship_state *) malloc(sizeof(struct mother_ship_state));
+ st->mother->lasers = (struct laser_state *) malloc(8*sizeof(struct laser_state));
+ st->mother->active = 0;
+ st->mother->death = 0;
+ st->mother->ship_color = st->r_color0;
+ st->mother->laser_color = st->r_color0;
+ }
+ }
+ else {
+ if(get_boolean_resource(st->dpy, "mother_ship","Boolean")) {
+ st->MOTHER_SHIP_WIDTH=get_integer_resource(st->dpy, "mother_ship_width","Integer");
+ st->MOTHER_SHIP_HEIGHT=get_integer_resource(st->dpy, "mother_ship_height","Integer");
+ st->MOTHER_SHIP_LASER=get_integer_resource(st->dpy, "mother_ship_laser","Integer");
+ st->MOTHER_SHIP_PERIOD=get_integer_resource(st->dpy, "mother_ship_period","Integer");
+ st->MOTHER_SHIP_HITS=get_integer_resource(st->dpy, "mother_ship_hits","Integer");
+ st->MOTHER_SHIP=1;
+ st->mother = (struct mother_ship_state *) malloc(sizeof(struct mother_ship_state));
+ st->mother->lasers = (struct laser_state *) malloc(8*sizeof(struct laser_state));
+ st->mother->active = 0;
+ st->mother->death = 0;
+ make_gc(st->mother->ship_color,"mother_ship_color0");
+ make_gc(st->mother->laser_color,"mother_ship_color1");
+ }
+
+ make_gc (st->s_color,"star_color");
+
+ make_gc (st->EXPLODE_COLOR_1,"explode_color_1");
+ make_gc (st->EXPLODE_COLOR_2,"explode_color_2");
+
+ make_gc (st->r_color0,"r_color0");
+ make_gc (st->r_color1,"r_color1");
+ make_gc (st->r_color2,"r_color2");
+ make_gc (st->r_color3,"r_color3");
+ make_gc (st->r_color4,"r_color4");
+ make_gc (st->r_color5,"r_color5");
+ make_gc (st->l_color0,"l_color0");
+ make_gc (st->l_color1,"l_color1");
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->black = 0;
+#else
+ make_gc (st->black,"background");
+#endif
+ }
+
+ return st;
+}
+
+
+static void
+blaster_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+ XClearWindow (dpy, window);
+ init_stars (st);
+}
+
+static Bool
+blaster_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+blaster_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ if (st->r_color0) XFreeGC (dpy, st->r_color0);
+ if (st->r_color1) XFreeGC (dpy, st->r_color1);
+ if (st->r_color2) XFreeGC (dpy, st->r_color2);
+ if (st->r_color3) XFreeGC (dpy, st->r_color3);
+ if (st->r_color4) XFreeGC (dpy, st->r_color4);
+ if (st->r_color5) XFreeGC (dpy, st->r_color5);
+ if (st->l_color0) XFreeGC (dpy, st->l_color0);
+ if (st->l_color1) XFreeGC (dpy, st->l_color1);
+ if (st->s_color) XFreeGC (dpy, st->s_color);
+ if (st->black) XFreeGC (dpy, st->black);
+ if (st->stars) free (st->stars);
+ if (st->mother) {
+ free (st->mother->lasers);
+ free (st->mother);
+ }
+ for (i = 0; i < st->NUM_ROBOTS; i++)
+ free (st->robots[i].lasers);
+ free (st->robots);
+ free (st);
+}
+
+
+static const char *blaster_defaults [] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*r_color0: #FF00FF",
+ "*r_color1: #FFA500",
+ "*r_color2: #FFFF00",
+ "*r_color3: #FFFFFF",
+ "*r_color4: #0000FF",
+ "*r_color5: #00FFFF",
+ "*l_color0: #00FF00",
+ "*l_color1: #FF0000",
+ "*mother_ship_color0: #00008B",
+ "*mother_ship_color1: #FFFFFF",
+ "*explode_color_1: #FFFF00",
+ "*explode_color_2: #FFA500",
+ "*delay: 10000",
+ "*num_robots: 5",
+ "*num_lasers: 3",
+ "*mother_ship: false",
+ "*mother_ship_width: 25",
+ "*mother_ship_height: 7",
+ "*mother_ship_laser: 15",
+ "*mother_ship_period: 150",
+ "*mother_ship_hits: 10",
+ "*explode_size_1: 27",
+ "*explode_size_2: 19",
+ "*explode_size_3: 7",
+ "*num_stars: 50",
+ "*star_color: white",
+ "*move_stars: true",
+ "*move_stars_x: 2",
+ "*move_stars_y: 1",
+ "*move_stars_random: 0",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec blaster_options [] = {
+ /* These are the 6 robot colors */
+ { "-r_color0", ".r_color0", XrmoptionSepArg, 0 },
+ { "-r_color1", ".r_color1", XrmoptionSepArg, 0 },
+ { "-r_color2", ".r_color2", XrmoptionSepArg, 0 },
+ { "-r_color3", ".r_color3", XrmoptionSepArg, 0 },
+ { "-r_color4", ".r_color4", XrmoptionSepArg, 0 },
+ { "-r_color5", ".r_color5", XrmoptionSepArg, 0 },
+ /* These are the 2 laser colors that robots have */
+ { "-l_color0", ".l_color0", XrmoptionSepArg, 0 },
+ { "-l_color1", ".l_color1", XrmoptionSepArg, 0 },
+ /* These are the colors for the mothership and the mothership lasers */
+ { "-mother_ship_color0", ".mother_ship_color0", XrmoptionSepArg, 0},
+ { "-mother_ship_color1", ".mother_ship_color1", XrmoptionSepArg, 0},
+ /* These are the two colors of the animated explosion */
+ { "-explode_color_1", ".explode_color_1", XrmoptionSepArg, 0 },
+ { "-explode_color_2", ".explode_color_2", XrmoptionSepArg, 0 },
+ /* This is the delay in the main loop */
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ /* The number of robots and the number of lasers each robot has */
+ { "-num_robots", ".num_robots", XrmoptionSepArg, 0},
+ { "-num_lasers", ".num_lasers", XrmoptionSepArg, 0},
+ /* If this is set, a mothership will appear, otherwise no mothership */
+ { "-mother_ship", ".mother_ship", XrmoptionNoArg, "true"},
+ { "-no_mother_ship", ".mother_ship", XrmoptionNoArg, "false"},
+ /* This is the width, height, and laser length of the mothership */
+ { "-mother_ship_width", ".mother_ship_width", XrmoptionSepArg, 0},
+ { "-mother_ship_height", ".mother_ship_height", XrmoptionSepArg, 0},
+ { "-mother_ship_laser", ".mother_ship_laser", XrmoptionSepArg, 0},
+ /* This is the period which the mothership comes out, higher period==less often */
+ { "-mother_ship_period", ".mother_ship_period", XrmoptionSepArg, 0},
+ /* This is the number of hits it takes to destroy the mothership */
+ { "-mother_ship_hits", ".mother_ship_hits", XrmoptionSepArg, 0},
+ /* These are the size of the radius of the animated explosions */
+ { "-explode_size_1", ".explode_size_1", XrmoptionSepArg, 0},
+ { "-explode_size_2", ".explode_size_2", XrmoptionSepArg, 0},
+ { "-explode_size_3", ".explode_size_3", XrmoptionSepArg, 0},
+ /* This sets the number of stars in the star field, if this is set to 0, there will be no stars */
+ { "-num_stars", ".num_stars", XrmoptionSepArg, 0},
+ /* This is the color of the stars */
+ { "-star_color", ".star_color", XrmoptionSepArg, 0},
+ /* If this is true, the stars will move */
+ { "-move_stars", ".move_stars", XrmoptionNoArg, "true"},
+ /* This is the amount the stars will move in the x and y direction */
+ { "-move_stars_x", ".move_stars_x", XrmoptionSepArg, 0},
+ { "-move_stars_y", ".move_stars_y", XrmoptionSepArg, 0},
+ /* If this is non-zero, the stars will move randomly, but will not move more than this number in
+ either the x or y direction */
+ { "-move_stars_random", ".move_stars_random", XrmoptionSepArg, 0},
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Blaster", blaster)
diff --git a/hacks/blaster.man b/hacks/blaster.man
new file mode 100644
index 0000000..6ac369f
--- /dev/null
+++ b/hacks/blaster.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blaster - simulation of space combat
+.SH SYNOPSIS
+.B blaster
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-num_robots \fInumber\fP]
+[\-num_lasers \fInumber\fP]
+[\-num_stars \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a simulation of flying space-combat robots (cleverly disguised as
+colored circles) doing battle in front of a moving star field.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-num_robots \fInumber\fP
+Robots. 2 - 50. Default: 5.
+.TP 8
+.B \-num_lasers \fInumber\fP
+Lasers. 1 - 100. Default: 3.
+.TP 8
+.B \-num_stars \fInumber\fP
+Stars. 5 - 200. Default: 50.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jonathan Lin. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jonathan Lin.
diff --git a/hacks/blitspin.c b/hacks/blitspin.c
new file mode 100644
index 0000000..d27271d
--- /dev/null
+++ b/hacks/blitspin.c
@@ -0,0 +1,451 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Rotate a bitmap using using bitblts.
+ The bitmap must be square, and must be a power of 2 in size.
+ This was translated from SmallTalk code which appeared in the
+ August 1981 issue of Byte magazine.
+
+ The input bitmap may be non-square, it is padded and centered
+ with the background color. Another way would be to subdivide
+ the bitmap into square components and rotate them independently
+ (and preferably in parallel), but I don't think that would be as
+ interesting looking.
+
+ It's too bad almost nothing uses blitter hardware these days,
+ or this might actually win.
+ */
+
+#include "screenhack.h"
+#include "pow2.h"
+#include "ximage-loader.h"
+#include <stdio.h>
+#include <time.h>
+
+#include "images/gen/som_png.h"
+
+/* Implementing this using XCopyArea doesn't work with color images on OSX.
+ This means that the Cocoa implementation of XCopyArea in jwxyz.m is
+ broken with the GXor, GXand, and/or the GXxor GC operations. This
+ probably means that (e.g.) "kCGBlendModeDarken" is not close enough
+ to being "GXand" to use for that. (It works with monochrome images,
+ just not color ones).
+
+ So, on OSX, we implement the blitter by hand. It is correct, but
+ orders of magnitude slower.
+ */
+#ifndef HAVE_JWXYZ
+# define USE_XCOPYAREA
+#endif
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int width, height, size;
+ Bool scale_up;
+ Pixmap self, temp, mask;
+# ifdef USE_XCOPYAREA
+ GC gc_set, gc_clear, gc_copy, gc_and, gc_or, gc_xor;
+# endif
+ GC gc;
+ int delay, delay2;
+ int duration;
+ Pixmap bitmap;
+ unsigned int fg, bg;
+
+ int qwad; /* fuckin' C, man... who needs namespaces? */
+ int first_time;
+ int last_w, last_h;
+
+ time_t start_time;
+ Bool loaded_p;
+ Bool load_ext_p;
+ async_load_state *img_loader;
+};
+
+static void display (struct state *, Pixmap);
+static void blitspin_init_2 (struct state *);
+
+#define copy_to(from, xoff, yoff, to, op) \
+ bitblt (st, st->from, st->to, op, 0, 0, \
+ st->size-(xoff), st->size-(yoff), (xoff), (yoff))
+
+#define copy_from(to, xoff, yoff, from, op) \
+ bitblt (st, st->from, st->to, op, (xoff), (yoff), \
+ st->size-(xoff), st->size-(yoff), 0, 0)
+
+
+#ifdef USE_XCOPYAREA
+# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \
+ XCopyArea((st)->dpy, (from), (to), (st)->gc_##op, \
+ (src_x), (src_y), (w), (h), (dst_x), (dst_y))
+#else /* !USE_XCOPYAREA */
+
+# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \
+ do_bitblt((st)->dpy, (from), (to), st->gc, GX##op, \
+ (src_x), (src_y), (w), (h), (dst_x), (dst_y))
+
+static void
+do_bitblt (Display *dpy, Drawable src, Drawable dst, GC gc, int op,
+ int src_x, int src_y,
+ unsigned int width, unsigned int height,
+ int dst_x, int dst_y)
+{
+ if (op == GXclear)
+ {
+ XSetForeground (dpy, gc, 0xFF000000); /* ARGB black for Cocoa */
+ XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height);
+ }
+ else if (op == GXset)
+ {
+ XSetForeground (dpy, gc, ~0L);
+ XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height);
+ }
+ else if (op == GXcopy)
+ {
+ XCopyArea (dpy, src, dst, gc, src_x, src_y, width, height, dst_x, dst_y);
+ }
+ else
+ {
+ XImage *srci = XGetImage (dpy, src, src_x, src_y, width, height,
+ ~0L, ZPixmap);
+ XImage *dsti = XGetImage (dpy, dst, dst_x, dst_y, width, height,
+ ~0L, ZPixmap);
+ unsigned long *out = (unsigned long *) dsti->data;
+ unsigned long *in = (unsigned long *) srci->data;
+ unsigned long *end = (in + (height * srci->bytes_per_line
+ / sizeof(unsigned long)));
+ switch (op)
+ {
+ case GXor: while (in < end) { *out++ |= *in++; } break;
+ case GXand: while (in < end) { *out++ &= *in++; } break;
+ case GXxor: while (in < end) { *out++ ^= *in++; } break;
+ default: abort();
+ }
+ XPutImage (dpy, dst, gc, dsti, 0, 0, dst_x, dst_y, width, height);
+ XDestroyImage (srci);
+ XDestroyImage (dsti);
+ }
+}
+
+#endif /* !USE_XCOPYAREA */
+
+
+
+static unsigned long
+blitspin_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->delay;
+ int qwad;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+
+ if (!st->img_loader) { /* just finished */
+ st->first_time = 0;
+ st->loaded_p = True;
+ st->qwad = -1;
+ st->start_time = time ((time_t *) 0);
+ blitspin_init_2 (st);
+ }
+
+ /* Rotate nothing if the very first image is not yet loaded */
+ if (! st->loaded_p)
+ return this_delay;
+ }
+
+ if (!st->img_loader &&
+ st->load_ext_p &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ /* Start a new image loading, but keep rotating the old image
+ until the new one arrives. */
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->bitmap, 0, 0);
+ }
+
+ if (st->qwad == -1)
+ {
+ bitblt(st, st->mask, st->mask, clear,0,0, st->size, st->size, 0,0);
+ bitblt(st, st->mask, st->mask, set, 0,0, st->size>>1, st->size>>1, 0,0);
+ st->qwad = st->size>>1;
+ }
+
+ if (st->first_time)
+ {
+ st->first_time = 0;
+ display (st, st->self);
+ return st->delay2;
+ }
+
+ /* for (st->qwad = st->size>>1; st->qwad > 0; st->qwad>>=1) */
+
+ qwad = st->qwad;
+
+ copy_to (mask, 0, 0, temp, copy); /* 1 */
+ copy_to (mask, 0, qwad, temp, or); /* 2 */
+ copy_to (self, 0, 0, temp, and); /* 3 */
+ copy_to (temp, 0, 0, self, xor); /* 4 */
+ copy_from (temp, qwad, 0, self, xor); /* 5 */
+ copy_from (self, qwad, 0, self, or); /* 6 */
+ copy_to (temp, qwad, 0, self, xor); /* 7 */
+ copy_to (self, 0, 0, temp, copy); /* 8 */
+ copy_from (temp, qwad, qwad, self, xor); /* 9 */
+ copy_to (mask, 0, 0, temp, and); /* A */
+ copy_to (temp, 0, 0, self, xor); /* B */
+ copy_to (temp, qwad, qwad, self, xor); /* C */
+ copy_from (mask, qwad>>1, qwad>>1, mask, and); /* D */
+ copy_to (mask, qwad, 0, mask, or); /* E */
+ copy_to (mask, 0, qwad, mask, or); /* F */
+ display (st, st->self);
+
+ st->qwad >>= 1;
+ if (st->qwad == 0) /* done with this round */
+ {
+ st->qwad = -1;
+ this_delay = st->delay2;
+ }
+
+ return this_delay;
+}
+
+
+static int
+blitspin_to_pow2(int n, Bool up)
+{
+ int pow2 = to_pow2 (n);
+ if (n == pow2)
+ return n;
+ else
+ return up ? pow2 : pow2 >> 1;
+}
+
+static void *
+blitspin_init (Display *d_arg, Window w_arg)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ char *bitmap_name;
+
+ st->dpy = d_arg;
+ st->window = w_arg;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->fg = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->bg = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->delay < 0) st->delay = 0;
+ if (st->delay2 < 0) st->delay2 = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ st->start_time = time ((time_t *) 0);
+
+ bitmap_name = get_string_resource (st->dpy, "bitmap", "Bitmap");
+ if (! bitmap_name || !*bitmap_name)
+ bitmap_name = "(default)";
+
+ if (!strcasecmp (bitmap_name, "(default)") ||
+ !strcasecmp (bitmap_name, "default"))
+ bitmap_name = "(screen)";
+
+ if (!strcasecmp (bitmap_name, "(builtin)") ||
+ !strcasecmp (bitmap_name, "builtin"))
+ {
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (st->dpy, st->window,
+ som_png, sizeof(som_png),
+ &st->width, &st->height, &mask);
+ XGCValues gcv;
+ GC gc;
+ gcv.foreground = st->bg;
+ gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ st->bitmap = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+ XFillRectangle (st->dpy, st->bitmap, gc, 0, 0, st->width, st->height);
+ XSetClipMask (st->dpy, gc, mask);
+ XCopyArea (st->dpy, pixmap, st->bitmap, gc, 0, 0, st->width, st->height,
+ 0, 0);
+ XFreeGC (st->dpy, gc);
+ XFreePixmap (st->dpy, pixmap);
+ XFreePixmap (st->dpy, mask);
+
+ st->scale_up = True; /* definitely. */
+ st->loaded_p = True;
+ blitspin_init_2 (st);
+ }
+ else if (!strcasecmp (bitmap_name, "(screen)") ||
+ !strcasecmp (bitmap_name, "screen"))
+ {
+ st->bitmap = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+ st->width = st->xgwa.width;
+ st->height = st->xgwa.height;
+ st->scale_up = True; /* maybe? */
+ st->load_ext_p = True;
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->bitmap, 0, 0);
+ }
+ else
+ {
+ st->bitmap = file_to_pixmap (st->dpy, st->window, bitmap_name,
+ &st->width, &st->height, 0);
+ st->scale_up = True; /* probably? */
+ blitspin_init_2 (st);
+ }
+
+ return st;
+}
+
+
+static void
+blitspin_init_2 (struct state *st)
+{
+ XGCValues gcv;
+
+ /* make it square */
+ st->size = (st->width < st->height) ? st->height : st->width;
+ /* round up to power of 2 */
+ st->size = blitspin_to_pow2(st->size, st->scale_up);
+ { /* don't exceed screen size */
+ int s = XScreenNumberOfScreen(st->xgwa.screen);
+ int w = blitspin_to_pow2(XDisplayWidth(st->dpy, s), False);
+ int h = blitspin_to_pow2(XDisplayHeight(st->dpy, s), False);
+ if (st->size > w) st->size = w;
+ if (st->size > h) st->size = h;
+ }
+
+ if (st->self) XFreePixmap (st->dpy, st->self);
+ if (st->temp) XFreePixmap (st->dpy, st->temp);
+ if (st->mask) XFreePixmap (st->dpy, st->mask);
+
+ st->self = XCreatePixmap (st->dpy, st->window, st->size, st->size,
+ st->xgwa.depth);
+ st->temp = XCreatePixmap (st->dpy, st->window, st->size, st->size,
+ st->xgwa.depth);
+ st->mask = XCreatePixmap (st->dpy, st->window, st->size, st->size,
+ st->xgwa.depth);
+ gcv.foreground = (st->xgwa.depth == 1 ? 1 : (~0));
+
+# ifdef USE_XCOPYAREA
+# define make_gc(op) \
+ gcv.function=GX##op; \
+ if (st->gc_##op) XFreeGC (st->dpy, st->gc_##op); \
+ st->gc_##op = XCreateGC (st->dpy, st->self, GCFunction|GCForeground, &gcv)
+ make_gc(set);
+ make_gc(clear);
+ make_gc(copy);
+ make_gc(and);
+ make_gc(or);
+ make_gc(xor);
+# endif /* USE_XCOPYAREA */
+
+ gcv.foreground = gcv.background = st->bg;
+ if (st->gc) XFreeGC (st->dpy, st->gc);
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+ /* Clear st->self to the background color (not to 0, which 'clear' does.) */
+ XFillRectangle (st->dpy, st->self, st->gc, 0, 0, st->size, st->size);
+ XSetForeground (st->dpy, st->gc, st->fg);
+
+ XCopyArea (st->dpy, st->bitmap, st->self, st->gc, 0, 0,
+ st->width, st->height,
+ (st->size - st->width) >> 1,
+ (st->size - st->height) >> 1);
+
+ st->qwad = -1;
+ st->first_time = 1;
+}
+
+static void
+display (struct state *st, Pixmap pixmap)
+{
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ if (st->xgwa.width != st->last_w ||
+ st->xgwa.height != st->last_h)
+ {
+ XClearWindow (st->dpy, st->window);
+ st->last_w = st->xgwa.width;
+ st->last_h = st->xgwa.height;
+ }
+ if (st->xgwa.depth != 1)
+ XCopyArea (st->dpy, pixmap, st->window, st->gc, 0, 0, st->size, st->size,
+ (st->xgwa.width - st->size) >> 1,
+ (st->xgwa.height - st->size) >> 1);
+ else
+ XCopyPlane (st->dpy, pixmap, st->window, st->gc, 0, 0, st->size, st->size,
+ (st->xgwa.width - st->size) >> 1,
+ (st->xgwa.height - st->size) >> 1,
+ 1);
+/*
+ XDrawRectangle (st->dpy, st->window, st->gc,
+ ((st->xgwa.width - st->size) >> 1) - 1,
+ ((st->xgwa.height - st->size) >> 1) - 1,
+ st->size+2, st->size+2);
+*/
+}
+
+static void
+blitspin_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+blitspin_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+blitspin_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *blitspin_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".fpsSolid: true",
+ "*delay: 500000",
+ "*delay2: 500000",
+ "*duration: 120",
+ "*bitmap: (default)",
+ "*geometry: 1080x1080",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec blitspin_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-bitmap", ".bitmap", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("BlitSpin", blitspin)
diff --git a/hacks/blitspin.man b/hacks/blitspin.man
new file mode 100644
index 0000000..4a221da
--- /dev/null
+++ b/hacks/blitspin.man
@@ -0,0 +1,96 @@
+.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
+.SH NAME
+blitspin - rotate a bitmap in an interesting way
+.SH SYNOPSIS
+.B blitspin
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root]
+[\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP]
+[\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] [\-duration \fIsecs\fP]
+.SH DESCRIPTION
+The \fIblitspin\fP program repeatedly rotates a bitmap by 90 degrees by
+using logical operations: the bitmap is divided into quadrants, and the
+quadrants are shifted clockwise. Then the same thing is done again with
+progressively smaller quadrants, except that all sub-quadrants of a
+given size are rotated in parallel. So this takes \fBO(16*log2(N))\fP
+blits of size NxN, with the limitation that the image must be square,
+and the size must be a power of 2.
+.SH OPTIONS
+.I blitspin
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-bitmap \fIfilename\fP
+The file name of a bitmap to rotate. It need not be square: it
+will be padded with the background color. If unspecified or the
+string \fI(default)\fP, a builtin bitmap is used.
+
+If support for the \fIXPM\fP library was enabled at compile-time,
+the specified file may be in \fIXPM\fP format as well as \fIXBM\fP, and
+thus may be a color image.
+
+The \fB*bitmapFilePath\fP resource will be searched if the bitmap
+name is not a fully-qualified pathname.
+.TP 8
+.B \-grab\-screen
+If this option is specified, then the image which is spun will be grabbed
+from the portion of the screen underlying the blitspin window, or from
+the system's video input, or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP file;
+see
+.BR xscreensaver-demo (1)
+for more details.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to delay between steps of the rotation process, in microseconds.
+Default is 500000, one-half second.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-delay2 \fImicroseconds\fP
+How long to delay between each 90-degree rotation, in microseconds.
+Default is 500000, one-half second.
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver-demo (1),
+.BR xscreensaver-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997, 2001 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation. No
+representations are made about the suitability of this software for any
+purpose. It is provided "as is" without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 17-aug-92.
+
+Based on SmallTalk code which appeared in the August 1981 issue of Byte
+magazine.
diff --git a/hacks/bouboule.c b/hacks/bouboule.c
new file mode 100644
index 0000000..1ac0425
--- /dev/null
+++ b/hacks/bouboule.c
@@ -0,0 +1,858 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ Ported from xlockmore 4.03a12 to be a standalone program and thus usable
+ with xscreensaver by Jamie Zawinski <jwz@jwz.org> on 15-May-97.
+
+ Original copyright notice from xlock.c:
+
+ * Copyright (c) 1988-91 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#if 0
+static const char sccsid[] = "@(#)bouboule.c 4.00 97/01/01 xlockmore";
+#endif
+
+/*-
+ * bouboule.c (bouboule mode for xlockmore)
+ *
+ * Sort of starfield for xlockmore. I found that making a starfield for
+ * a 3D engine and thought it could be a nice lock mode. For a real starfield,
+ * I only scale the sort of sphere you see to the whole sky and clip the stars
+ * to the camera screen.
+ *
+ * Code Copyright 1996 by Jeremie PETIT (jeremie_petit@geocities.com)
+ *
+ * Use: batchcount is the number of stars.
+ * cycles is the maximum size for a star
+ *
+ * 15-May-97: jwz@jwz.org: turned into a standalone program.
+ * 04-Sep-96: Added 3d support (Henrik Theiling, theiling@coli-uni-sb.de)
+ * 20-Feb-96: Added tests so that already malloced objects are not
+ * malloced twice, thanks to the report from <mccomb@interport.net>
+ * 01-Feb-96: Patched by Jouk Jansen <joukj@alpha.chem.uva.nl> for VMS
+ * Patched by <bagleyd@bigfoot.com> for TrueColor displays
+ * 30-Jan-96: Wrote all that I wanted to.
+ *
+ * DONE: Build up a XArc list and Draw everything once with XFillArcs
+ * That idea came from looking at swarm code.
+ * DONE: Add an old arcs list for erasing.
+ * DONE: Make center of starfield SinVariable.
+ * DONE: Add some random in the sinvary() function.
+ * DONE: check time for erasing the stars with the two methods and use the
+ * better one. Note that sometimes the time difference between
+ * beginning of erasing and its end is negative! I check this, and
+ * do not use this result when it occurs. If all values are negative,
+ * the erasing will continue being done in the currently tested mode.
+ * DONE: Allow stars size customization.
+ * DONE: Make sizey be no less than half sizex or no bigger than twice sizex.
+ *
+ * IDEA: A simple check can be performed to know which stars are "behind"
+ * and which are "in front". So is possible to very simply change
+ * the drawing mode for these two sorts of stars. BUT: this would lead
+ * to a rewrite of the XArc list code because drawing should be done
+ * in two steps: "behind" stars then "in front" stars. Also, what could
+ * be the difference between the rendering of these two types of stars?
+ * IDEA: Calculate the distance of each star to the "viewer" and render the
+ * star accordingly to this distance. Same remarks as for previous
+ * ideas can be pointed out. This would even lead to reget the old stars
+ * drawing code, that has been replaced by the XFillArcs. On another
+ * hand, this would allow particular stars (own color, shape...), as
+ * far as they would be individually drawn. One should be careful to
+ * draw them according to their distance, that is not drawing a far
+ * star after a close one.
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*count: 100 \n" \
+ "*size: 15 \n" \
+ "*delay: 20000 \n" \
+ "*ncolors: 64 \n" \
+ "*use3d: True \n" \
+ "*delta3d: 1.5 \n" \
+ "*right3d: red \n" \
+ "*left3d: blue \n" \
+ "*both3d: magenta \n" \
+ "*none3d: black \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n"
+
+# define SMOOTH_COLORS
+# define release_bouboule 0
+# define bouboule_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# define ENTRYPOINT /**/
+#endif /* !STANDALONE */
+
+ENTRYPOINT ModeSpecOpt bouboule_opts = {
+ 0, NULL, 0, NULL, NULL };
+
+#define USEOLDXARCS 1 /* If 1, we use old xarcs list for erasing.
+ * else we just roughly erase the window.
+ * This mainly depends on the number of stars,
+ * because when they are many, it is faster to
+ * erase the whole window than to erase each star
+ */
+
+#if HAVE_GETTIMEOFDAY
+#define ADAPT_ERASE 1 /* If 1, then we try ADAPT_CHECKS black XFillArcs,
+ * and after, ADAPT_CHECKS XFillRectangle.
+ * We check which method seems better, knowing that
+ * XFillArcs is generally visually better. So we
+ * consider that XFillArcs is still better if its time
+ * is about XFillRectangle * ADAPT_ARC_PREFERED
+ * We need gettimeofday
+ * for this... Does it exist on other systems ? Do we
+ * have to use another function for others ?
+ * This value overrides USEOLDXARCS.
+ */
+
+#ifdef USE_XVMSUTILS
+# if 0
+# include "../xvmsutils/unix_time.h"
+# else
+# include <X11/unix_time.h>
+# endif
+#endif
+
+#include <sys/time.h>
+
+#define ADAPT_CHECKS 50
+#define ADAPT_ARC_PREFERED 150 /* Maybe the value that is the most important
+ * for adapting to a system */
+#endif
+
+#define dtor(x) (((x) * M_PI) / 180.0) /* Degrees to radians */
+
+#define MINSTARS 1
+#define MINSIZE 1
+/* jwz: I think slower color changes look better */
+#define COLOR_CHANGES 50 /* How often we change colors (1 = always)
+ * This value should be tuned accordingly to
+ * the number of stars */
+#define MAX_SIZEX_SIZEY 2. /* This controls whether the sphere can be very
+ * very large and have a small height (or the
+ * opposite) or no. */
+
+#define THETACANRAND 80 /* percentage of changes for the speed of
+ * change of the 3 theta values */
+#define SIZECANRAND 80 /* percentage of changes for the speed of
+ * change of the sizex and sizey values */
+#define POSCANRAND 80 /* percentage of changes for the speed of
+ * change of the x and y values */
+/* Note that these XXXCANRAND values can be 0, that is no rand acceleration *
+ variation. */
+
+#define VARRANDALPHA (NRAND((int) (M_PI * 1000.0))/1000.0)
+#define VARRANDSTEP (M_PI/(NRAND(100)+100.0))
+#define VARRANDMIN (-70.0)
+#define VARRANDMAX 70.0
+
+#define MINZVAL 100 /* stars can come this close */
+#define SCREENZ 2000 /* this is where the screen is */
+#define MAXZVAL 10000 /* stars can go this far away */
+
+#define GETZDIFF(z) ((MI_DELTA3D(mi))*20.0*(1.0-(SCREENZ)/(z+1000)))
+#define MAXDIFF MAX(-GETZDIFF(MINZVAL),GETZDIFF(MAXZVAL))
+
+/* These values are the variation parameters of the acceleration variation *
+ of the SinVariables that are randomized. */
+
+/******************************/
+typedef struct SinVariableStruct
+/******************************/
+{
+ double alpha; /*
+ * Alpha is the current state of the sinvariable
+ * alpha should be initialized to a value between
+ * 0.0 and 2 * M_PI
+ */
+ double step; /*
+ * Speed of evolution of alpha. It should be a reasonable
+ * fraction of 2 * M_PI. This value directly influence
+ * the variable speed of variation.
+ */
+ double minimum; /* Minimum value for the variable */
+ double maximum; /* Maximum value for the variable */
+ double value; /* Current value */
+ int mayrand; /* Flag for knowing whether some randomization can be
+ * applied to the variable */
+ struct SinVariableStruct *varrand; /* Evolving Variable: the variation of
+ * alpha */
+} SinVariable;
+
+/***********************/
+typedef struct StarStruct
+/***********************/
+{
+ double x, y, z; /* Position of the star */
+ short size; /* Try to guess */
+} Star;
+
+/****************************/
+typedef struct StarFieldStruct
+/****************************/
+{
+ short width, height; /* width and height of the starfield window */
+ short max_star_size; /* Maximum radius for stars. stars radius will
+ * vary from 1 to MAX_STAR_SIZE */
+ SinVariable x; /* Evolving variables: */
+ SinVariable y; /* Center of the field on the screen */
+ SinVariable z;
+ SinVariable sizex; /* Evolving variable: half width of the field */
+ SinVariable sizey; /* Evolving variable: half height of the field */
+ SinVariable thetax; /* Evolving Variables: */
+ SinVariable thetay; /* rotation angles of the starfield */
+ SinVariable thetaz; /* around x, y and z local axis */
+ Star *star; /* List of stars */
+ XArc *xarc; /* Current List of arcs */
+ XArc *xarcleft; /* additional list for the left arcs */
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ XArc *oldxarc; /* Old list of arcs */
+ XArc *oldxarcleft;
+#endif
+ unsigned long color; /* Current color of the starfield */
+ int colorp; /* Pointer to color of the starfield */
+ int NbStars; /* Number of stars */
+ short colorchange; /* Counter for the color change */
+#if (ADAPT_ERASE == 1)
+ short hasbeenchecked;
+ long rect_time;
+ long xarc_time;
+#endif
+} StarField;
+
+static StarField *starfield = NULL;
+
+/*********/
+static void
+sinvary(SinVariable * v)
+/*********/
+
+{
+ v->value = v->minimum +
+ (v->maximum - v->minimum) * (sin(v->alpha) + 1.0) / 2.0;
+
+ if (v->mayrand == 0)
+ v->alpha += v->step;
+ else {
+ int vaval = NRAND(100);
+
+ if (vaval <= v->mayrand)
+ sinvary(v->varrand);
+ v->alpha += (100.0 + (v->varrand->value)) * v->step / 100.0;
+ }
+
+ if (v->alpha > 2 * M_PI)
+ v->alpha -= 2 * M_PI;
+}
+
+/*************************************************/
+static void
+sininit(SinVariable * v,
+ double alpha, double step, double minimum, double maximum,
+ short int mayrand)
+{
+ v->alpha = alpha;
+ v->step = step;
+ v->minimum = minimum;
+ v->maximum = maximum;
+ v->mayrand = mayrand;
+ if (mayrand != 0) {
+ if (v->varrand == NULL)
+ v->varrand = (SinVariable *) calloc(1, sizeof (SinVariable));
+ sininit(v->varrand,
+ VARRANDALPHA,
+ VARRANDSTEP,
+ VARRANDMIN,
+ VARRANDMAX,
+ 0);
+ sinvary(v->varrand);
+ }
+ /* We calculate the values at least once for initialization */
+ sinvary(v);
+}
+
+static void
+sinfree(SinVariable * point)
+{
+ SinVariable *temp, *next;
+
+ next = point->varrand;
+ while (next) {
+ temp = next;
+ next = temp->varrand;
+ (void) free((void *) temp);
+ }
+}
+
+
+/***************/
+ENTRYPOINT void
+init_bouboule(ModeInfo * mi)
+/***************/
+
+/*-
+ * The stars init part was first inspirated from the net3d game starfield
+ * code. But net3d starfield is not really 3d starfield, and I needed real 3d,
+ * so only remains the net3d starfield initialization main idea, that is
+ * the stars distribution on a sphere (theta and omega computing)
+ */
+{
+ StarField *sp;
+ int size = MI_SIZE(mi);
+ int i;
+ double theta, omega;
+
+ if (MI_WIDTH(mi) > 2560) size *= 2; /* Retina displays */
+
+ MI_INIT (mi, starfield);
+ sp = &starfield[MI_SCREEN(mi)];
+
+ sp->width = MI_WIN_WIDTH(mi);
+ sp->height = MI_WIN_HEIGHT(mi);
+
+ /* use the right `black' pixel values: */
+ if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_NONE_COLOR(mi));
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, 0, sp->width, sp->height);
+ } else
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ if (size < -MINSIZE)
+ sp->max_star_size = NRAND(-size - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE)
+ sp->max_star_size = MINSIZE;
+ else
+ sp->max_star_size = size;
+
+ sp->NbStars = MI_BATCHCOUNT(mi);
+ if (sp->NbStars < -MINSTARS) {
+ if (sp->star) {
+ (void) free((void *) sp->star);
+ sp->star = NULL;
+ }
+ if (sp->xarc) {
+ (void) free((void *) sp->xarc);
+ sp->xarc = NULL;
+ }
+ if (sp->xarcleft) {
+ (void) free((void *) sp->xarcleft);
+ sp->xarcleft = NULL;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ if (sp->oldxarc) {
+ (void) free((void *) sp->oldxarc);
+ sp->oldxarc = NULL;
+ }
+ if (sp->oldxarcleft) {
+ (void) free((void *) sp->oldxarcleft);
+ sp->oldxarcleft = NULL;
+ }
+#endif
+ sp->NbStars = NRAND(-sp->NbStars - MINSTARS + 1) + MINSTARS;
+ } else if (sp->NbStars < MINSTARS)
+ sp->NbStars = MINSTARS;
+
+ /* We get memory for lists of objects */
+ if (sp->star == NULL)
+ sp->star = (Star *) malloc(sp->NbStars * sizeof (Star));
+ if (sp->xarc == NULL)
+ sp->xarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+ if (MI_WIN_IS_USE3D(mi) && sp->xarcleft == NULL)
+ sp->xarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ if (sp->oldxarc == NULL)
+ sp->oldxarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+ if (MI_WIN_IS_USE3D(mi) && sp->oldxarcleft == NULL)
+ sp->oldxarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+#endif
+
+ {
+ /* We initialize evolving variables */
+ sininit(&sp->x,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ ((double) sp->width) / 4.0,
+ 3.0 * ((double) sp->width) / 4.0,
+ POSCANRAND);
+ sininit(&sp->y,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ ((double) sp->height) / 4.0,
+ 3.0 * ((double) sp->height) / 4.0,
+ POSCANRAND);
+
+ /* for z, we have to ensure that the bouboule does not get behind */
+ /* the eyes of the viewer. His/Her eyes are at 0. Because the */
+ /* bouboule uses the x-radius for the z-radius, too, we have to */
+ /* use the x-values. */
+ sininit(&sp->z,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ ((double) sp->width / 2.0 + MINZVAL),
+ ((double) sp->width / 2.0 + MAXZVAL),
+ POSCANRAND);
+
+
+ sininit(&sp->sizex,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ MIN(((double) sp->width) - sp->x.value,
+ sp->x.value) / 5.0,
+ MIN(((double) sp->width) - sp->x.value,
+ sp->x.value),
+ SIZECANRAND);
+
+ sininit(&sp->sizey,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
+ sp->sizey.maximum / 5.0),
+ MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
+ MIN(((double) sp->height) -
+ sp->y.value,
+ sp->y.value)),
+ SIZECANRAND);
+
+ sininit(&sp->thetax,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
+ -M_PI, M_PI,
+ THETACANRAND);
+ sininit(&sp->thetay,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
+ -M_PI, M_PI,
+ THETACANRAND);
+ sininit(&sp->thetaz,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(400) + 400.0),
+ -M_PI, M_PI,
+ THETACANRAND);
+ }
+ for (i = 0; i < sp->NbStars; i++) {
+ Star *star;
+ XArc *arc = NULL, *arcleft = NULL;
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ XArc *oarc = NULL, *oarcleft = NULL;
+#endif
+
+ star = &(sp->star[i]);
+ arc = &(sp->xarc[i]);
+ if (MI_WIN_IS_USE3D(mi))
+ arcleft = &(sp->xarcleft[i]);
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc = &(sp->oldxarc[i]);
+ if (MI_WIN_IS_USE3D(mi))
+ oarcleft = &(sp->oldxarcleft[i]);
+#endif
+ /* Elevation and bearing of the star */
+ theta = dtor((NRAND(1800)) / 10.0 - 90.0);
+ omega = dtor((NRAND(3600)) / 10.0 - 180.0);
+
+ /* Stars coordinates in a 3D space */
+ star->x = cos(theta) * sin(omega);
+ star->y = sin(omega) * sin(theta);
+ star->z = cos(omega);
+
+ /* We set the stars size */
+ star->size = NRAND(2 * sp->max_star_size);
+ if (star->size < sp->max_star_size)
+ star->size = 0;
+ else
+ star->size -= sp->max_star_size;
+
+ /* We set default values for the XArc lists elements */
+ arc->x = arc->y = 0;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->x = arcleft->y = 0;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc->x = oarc->y = 0;
+ if (MI_WIN_IS_USE3D(mi)) {
+ oarcleft->x = oarcleft->y = 0;
+ }
+#endif
+ arc->width = 2 + star->size;
+ arc->height = 2 + star->size;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->width = 2 + star->size;
+ arcleft->height = 2 + star->size;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc->width = 2 + star->size;
+ oarc->height = 2 + star->size;
+ if (MI_WIN_IS_USE3D(mi)) {
+ oarcleft->width = 2 + star->size;
+ oarcleft->height = 2 + star->size;
+ }
+#endif
+
+ arc->angle1 = 0;
+ arc->angle2 = 360 * 64;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->angle1 = 0;
+ arcleft->angle2 = 360 * 64;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc->angle1 = 0;
+ oarc->angle2 = 360 * 64; /* ie. we draw whole disks:
+ * from 0 to 360 degrees */
+ if (MI_WIN_IS_USE3D(mi)) {
+ oarcleft->angle1 = 0;
+ oarcleft->angle2 = 360 * 64;
+ }
+#endif
+ }
+
+ if (MI_NPIXELS(mi) > 2)
+ sp->colorp = NRAND(MI_NPIXELS(mi));
+ /* We set up the starfield color */
+ if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2)
+ sp->color = MI_PIXEL(mi, sp->colorp);
+ else
+ sp->color = MI_WIN_WHITE_PIXEL(mi);
+
+#if (ADAPT_ERASE == 1)
+ /* We initialize the adaptation code for screen erasing */
+ sp->hasbeenchecked = ADAPT_CHECKS * 2;
+ sp->rect_time = 0;
+ sp->xarc_time = 0;
+#endif
+}
+
+/****************/
+ENTRYPOINT void
+draw_bouboule(ModeInfo * mi)
+/****************/
+
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ StarField *sp = &starfield[MI_SCREEN(mi)];
+ int i, diff = 0;
+ double CX, CY, CZ, SX, SY, SZ;
+ Star *star;
+ XArc *arc = NULL, *arcleft = NULL;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+#if (ADAPT_ERASE == 1)
+ struct timeval tv1;
+ struct timeval tv2;
+
+#endif
+
+#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
+ short x_1, y_1, x_2, y_2;
+
+ /* bounding rectangle around the old starfield,
+ * for erasing with the smallest rectangle
+ * instead of filling the whole screen */
+ int maxdiff = 0; /* maximal distance between left and right */
+
+ /* star in 3d mode, otherwise 0 */
+#endif
+
+#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
+ if (MI_WIN_IS_USE3D(mi)) {
+ maxdiff = (int) MAXDIFF;
+ }
+ x_1 = (int) sp->x.value - (int) sp->sizex.value -
+ sp->max_star_size - maxdiff;
+ y_1 = (int) sp->y.value - (int) sp->sizey.value -
+ sp->max_star_size;
+ x_2 = 2 * ((int) sp->sizex.value + sp->max_star_size + maxdiff);
+ y_2 = 2 * ((int) sp->sizey.value + sp->max_star_size);
+#endif
+ /* We make variables vary. */
+ sinvary(&sp->thetax);
+ sinvary(&sp->thetay);
+ sinvary(&sp->thetaz);
+
+ sinvary(&sp->x);
+ sinvary(&sp->y);
+ if (MI_WIN_IS_USE3D(mi))
+ sinvary(&sp->z);
+
+ /* A little trick to prevent the bouboule from being
+ * bigger than the screen */
+ sp->sizex.maximum =
+ MIN(((double) sp->width) - sp->x.value,
+ sp->x.value);
+ sp->sizex.minimum = sp->sizex.maximum / 3.0;
+
+ /* Another trick to make the ball not too flat */
+ sp->sizey.minimum =
+ MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
+ sp->sizey.maximum / 3.0);
+ sp->sizey.maximum =
+ MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
+ MIN(((double) sp->height) - sp->y.value,
+ sp->y.value));
+
+ sinvary(&sp->sizex);
+ sinvary(&sp->sizey);
+
+ /*
+ * We calculate the rotation matrix values. We just make the
+ * rotation on the fly, without using a matrix.
+ * Star positions are recorded as unit vectors pointing in various
+ * directions. We just make them all rotate.
+ */
+ CX = cos(sp->thetax.value);
+ SX = sin(sp->thetax.value);
+ CY = cos(sp->thetay.value);
+ SY = sin(sp->thetay.value);
+ CZ = cos(sp->thetaz.value);
+ SZ = sin(sp->thetaz.value);
+
+ for (i = 0; i < sp->NbStars; i++) {
+ star = &(sp->star[i]);
+ arc = &(sp->xarc[i]);
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft = &(sp->xarcleft[i]);
+ /* to help the eyes, the starfield is always as wide as */
+ /* deep, so .sizex.value can be used. */
+ diff = (int) GETZDIFF(sp->sizex.value *
+ ((SY * CX) * star->x + (SX) * star->y +
+ (CX * CY) * star->z) + sp->z.value);
+ }
+ arc->x = (short) ((sp->sizex.value *
+ ((CY * CZ - SX * SY * SZ) * star->x +
+ (-CX * SZ) * star->y +
+ (SY * CZ + SZ * SX * CY) * star->z) +
+ sp->x.value));
+ arc->y = (short) ((sp->sizey.value *
+ ((CY * SZ + SX * SY * CZ) * star->x +
+ (CX * CZ) * star->y +
+ (SY * SZ - SX * CY * CZ) * star->z) +
+ sp->y.value));
+
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->x = (short) ((sp->sizex.value *
+ ((CY * CZ - SX * SY * SZ) * star->x +
+ (-CX * SZ) * star->y +
+ (SY * CZ + SZ * SX * CY) * star->z) +
+ sp->x.value));
+ arcleft->y = (short) ((sp->sizey.value *
+ ((CY * SZ + SX * SY * CZ) * star->x +
+ (CX * CZ) * star->y +
+ (SY * SZ - SX * CY * CZ) * star->z) +
+ sp->y.value));
+ arc->x += diff;
+ arcleft->x -= diff;
+ }
+ if (star->size != 0) {
+ arc->x -= star->size;
+ arc->y -= star->size;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->x -= star->size;
+ arcleft->y -= star->size;
+ }
+ }
+ }
+
+ /* First, we erase the previous starfield */
+ if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi))
+ XSetForeground(display, gc, MI_NONE_COLOR(mi));
+ else
+ XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+
+#if (ADAPT_ERASE == 1)
+ if (sp->hasbeenchecked == 0) {
+ /* We just calculate which method is the faster and eventually free
+ * the oldxarc list */
+ if (sp->xarc_time >
+ ADAPT_ARC_PREFERED * sp->rect_time) {
+ sp->hasbeenchecked = -2; /* XFillRectangle mode */
+ (void) free((void *) sp->oldxarc);
+ sp->oldxarc = NULL;
+ if (MI_WIN_IS_USE3D(mi)) {
+ (void) free((void *) sp->oldxarcleft);
+ sp->oldxarcleft = NULL;
+ }
+ } else {
+ sp->hasbeenchecked = -1; /* XFillArcs mode */
+ }
+ }
+ if (sp->hasbeenchecked == -2) {
+ /* Erasing is done with XFillRectangle */
+ XFillRectangle(display, window, gc,
+ x_1, y_1, x_2, y_2);
+ } else if (sp->hasbeenchecked == -1) {
+ /* Erasing is done with XFillArcs */
+ XFillArcs(display, window, gc,
+ sp->oldxarc, sp->NbStars);
+ if (MI_WIN_IS_USE3D(mi))
+ XFillArcs(display, window, gc,
+ sp->oldxarcleft, sp->NbStars);
+ } else {
+ long usec;
+
+ if (sp->hasbeenchecked > ADAPT_CHECKS) {
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv1, NULL);
+#else
+ (void) gettimeofday(&tv1);
+#endif
+ XFillRectangle(display, window, gc,
+ x_1, y_1, x_2, y_2);
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv2, NULL);
+#else
+ (void) gettimeofday(&tv2);
+#endif
+ usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
+ if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
+ sp->rect_time += usec + tv2.tv_usec - tv1.tv_usec;
+ sp->hasbeenchecked--;
+ }
+ } else {
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv1, NULL);
+#else
+ (void) gettimeofday(&tv1);
+#endif
+ XFillArcs(display, window, gc,
+ sp->oldxarc, sp->NbStars);
+ if (MI_WIN_IS_USE3D(mi))
+ XFillArcs(display, window, gc,
+ sp->oldxarcleft, sp->NbStars);
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv2, NULL);
+#else
+ (void) gettimeofday(&tv2);
+#endif
+ usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
+ if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
+ sp->xarc_time += usec + tv2.tv_usec - tv1.tv_usec;
+ sp->hasbeenchecked--;
+ }
+ }
+ }
+#else
+#if (USEOLDXARCS == 1)
+ XFillArcs(display, window, gc,
+ sp->oldxarc, sp->NbStars);
+ if (MI_WIN_IS_USE3D(mi))
+ XFillArcs(display, window, gc,
+ sp->oldxarcleft, sp->NbStars);
+#else
+ XFillRectangle(display, window, gc,
+ x_1, y_1, x_2, y_2);
+#endif
+#endif
+
+ /* Then we draw the new one */
+ if (MI_WIN_IS_USE3D(mi)) {
+ if (MI_WIN_IS_INSTALL(mi))
+ XSetFunction(display, gc, GXor);
+ XSetForeground(display, gc, MI_RIGHT_COLOR(mi));
+ XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
+ XSetForeground(display, gc, MI_LEFT_COLOR(mi));
+ XFillArcs(display, window, gc, sp->xarcleft, sp->NbStars);
+ if (MI_WIN_IS_INSTALL(mi))
+ XSetFunction(display, gc, GXcopy);
+ } else {
+ XSetForeground(display, gc, sp->color);
+ XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
+ }
+
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+#if (ADAPT_ERASE == 1)
+ if (sp->hasbeenchecked >= -1) {
+ arc = sp->xarc;
+ sp->xarc = sp->oldxarc;
+ sp->oldxarc = arc;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft = sp->xarcleft;
+ sp->xarcleft = sp->oldxarcleft;
+ sp->oldxarcleft = arcleft;
+ }
+ }
+#else
+ arc = sp->xarc;
+ sp->xarc = sp->oldxarc;
+ sp->oldxarc = arc;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft = sp->xarcleft;
+ sp->xarcleft = sp->oldxarcleft;
+ sp->oldxarcleft = arcleft;
+ }
+#endif
+#endif
+
+ /* We set up the color for the next drawing */
+ if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2 &&
+ (++sp->colorchange >= COLOR_CHANGES)) {
+ sp->colorchange = 0;
+ if (++sp->colorp >= MI_NPIXELS(mi))
+ sp->colorp = 0;
+ sp->color = MI_PIXEL(mi, sp->colorp);
+ }
+}
+
+ENTRYPOINT void
+free_bouboule(ModeInfo * mi)
+{
+ StarField *sp = &starfield[MI_SCREEN(mi)];
+
+ if (sp->star)
+ (void) free((void *) sp->star);
+ if (sp->xarc)
+ (void) free((void *) sp->xarc);
+ if (sp->xarcleft)
+ (void) free((void *) sp->xarcleft);
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ if (sp->oldxarc)
+ (void) free((void *) sp->oldxarc);
+ if (sp->oldxarcleft)
+ (void) free((void *) sp->oldxarcleft);
+#endif
+ sinfree(&(sp->x));
+ sinfree(&(sp->y));
+ sinfree(&(sp->z));
+ sinfree(&(sp->sizex));
+ sinfree(&(sp->sizey));
+ sinfree(&(sp->thetax));
+ sinfree(&(sp->thetay));
+ sinfree(&(sp->thetaz));
+}
+
+ENTRYPOINT void
+reshape_bouboule(ModeInfo * mi, int width, int height)
+{
+ StarField *sp = &starfield[MI_SCREEN(mi)];
+ sp->width = width;
+ sp->height = height;
+ sininit(&sp->x,
+ sp->x.alpha, sp->x.step,
+ ((double) sp->width) / 4.0,
+ 3.0 * ((double) sp->width) / 4.0,
+ POSCANRAND);
+ sininit(&sp->y,
+ sp->y.alpha, sp->y.step,
+ ((double) sp->height) / 4.0,
+ 3.0 * ((double) sp->height) / 4.0,
+ POSCANRAND);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_bouboule(ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Bouboule", bouboule)
diff --git a/hacks/bouboule.man b/hacks/bouboule.man
new file mode 100644
index 0000000..259490f
--- /dev/null
+++ b/hacks/bouboule.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "15-May-97" "X Version 11"
+.SH NAME
+bouboule - draws spinning 3D blobs
+.SH SYNOPSIS
+.B bouboule
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-3d]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIbouboule\fP program draws spinning 3D blobs.
+.SH OPTIONS
+.I bouboule
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-3d
+Do red/blue 3d separations (for 3d glasses.)
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Jeremie Petit.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+.SH AUTHOR
+Jeremie Petit <jpetit@essi.fr>, 1996.
+
+3D support by Henrik Theiling <theiling@coli-uni-sb.de>, 04-Sep-96.
+
+VMS support by Jouk Jansen <joukj@alpha.chem.uva.nl>, 01-Feb-96.
+
+TrueColor support by David Bagley <bagleyd@bigfoot.com>, 01-Feb-96.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 15-May-97.
diff --git a/hacks/boxfit.c b/hacks/boxfit.c
new file mode 100644
index 0000000..1b1d0d7
--- /dev/null
+++ b/hacks/boxfit.c
@@ -0,0 +1,561 @@
+/* xscreensaver, Copyright (c) 2005-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Boxfit -- fills space with a gradient of growing boxes or circles.
+ *
+ * Written by jwz, 21-Feb-2005.
+ *
+ * Inspired by http://www.levitated.net/daily/levBoxFitting.html
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include "ximage-loader.h"
+
+#define ALIVE 1
+#define CHANGED 2
+#define UNDEAD 4
+
+typedef struct {
+ unsigned long fill_color;
+ short x, y, w, h;
+ char flags;
+} box;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ GC gc;
+ unsigned long fg_color, bg_color;
+ int border_size;
+ int spacing;
+ int inc;
+
+ int mode;
+ Bool circles_p;
+ Bool growing_p;
+ Bool color_horiz_p;
+
+ int box_count;
+ int boxes_size;
+ int nboxes;
+ box *boxes;
+
+ XImage *image;
+ int ncolors;
+ XColor *colors;
+ int delay;
+ int countdown;
+
+ Bool done_once;
+ async_load_state *img_loader;
+ Pixmap loading_pixmap;
+
+} state;
+
+
+static void
+reset_boxes (state *st)
+{
+ st->nboxes = 0;
+ st->growing_p = True;
+ st->color_horiz_p = random() & 1;
+
+ if (st->done_once && st->colors)
+ free_colors (st->xgwa.screen, st->xgwa.colormap, st->colors, st->ncolors);
+
+ if (!st->done_once)
+ {
+ char *s = get_string_resource (st->dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp (s, "random"))
+ st->mode = -1;
+ else if (!strcasecmp (s, "squares") || !strcasecmp (s, "square"))
+ st->mode = 0;
+ else if (!strcasecmp (s, "circles") || !strcasecmp (s, "circle"))
+ st->mode = 1;
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be random, squares, or circles, not '%s'\n",
+ progname, s);
+ exit (1);
+ }
+ }
+
+ if (st->mode == -1)
+ st->circles_p = random() & 1;
+ else
+ st->circles_p = (st->mode == 1);
+
+ st->done_once = True;
+
+ if (st->image || get_boolean_resource (st->dpy, "grab", "Boolean"))
+ {
+ if (st->image) XDestroyImage (st->image);
+ st->image = 0;
+
+ if (st->loading_pixmap) abort();
+ if (st->img_loader) abort();
+ if (!get_boolean_resource (st->dpy, "peek", "Boolean"))
+ st->loading_pixmap = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+
+ XClearWindow (st->dpy, st->window);
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen,
+ st->window,
+ (st->loading_pixmap
+ ? st->loading_pixmap
+ : st->window),
+ 0, 0);
+ }
+ else
+ {
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors"); /* re-get */
+ if (st->ncolors < 1) st->ncolors = 1;
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, False);
+ if (st->ncolors < 1) abort();
+ XClearWindow (st->dpy, st->window);
+ }
+}
+
+
+static void
+reshape_boxes (state *st)
+{
+ int i;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *b = &st->boxes[i];
+ b->flags |= CHANGED;
+ }
+}
+
+static void *
+boxfit_init (Display *dpy, Window window)
+{
+ XGCValues gcv;
+ state *st = (state *) calloc (1, sizeof (*st));
+
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+/* XSelectInput (dpy, window, st->xgwa.your_event_mask | ExposureMask);*/
+
+ if (! get_boolean_resource (dpy, "grab", "Boolean"))
+ {
+ st->ncolors = get_integer_resource (dpy, "colors", "Colors");
+ if (st->ncolors < 1) st->ncolors = 1;
+ st->colors = (XColor *) malloc (sizeof(XColor) * st->ncolors);
+ }
+
+ st->inc = get_integer_resource (dpy, "growBy", "GrowBy");
+ st->spacing = get_integer_resource (dpy, "spacing", "Spacing");
+ st->border_size = get_integer_resource (dpy, "borderSize", "BorderSize");
+ st->fg_color = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->bg_color = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ if (st->inc < 1) st->inc = 1;
+ if (st->border_size < 0) st->border_size = 0;
+
+ gcv.line_width = st->border_size;
+ gcv.background = st->bg_color;
+ st->gc = XCreateGC (st->dpy, st->window, GCBackground|GCLineWidth, &gcv);
+
+ st->box_count = get_integer_resource (dpy, "boxCount", "BoxCount");
+ if (st->box_count < 1) st->box_count = 1;
+
+ st->nboxes = 0;
+ st->boxes_size = st->box_count * 2;
+ st->boxes = (box *) calloc (st->boxes_size, sizeof(*st->boxes));
+
+ reset_boxes (st);
+
+ reshape_boxes (st);
+ return st;
+}
+
+
+
+static Bool
+boxes_overlap_p (box *a, box *b, int pad)
+{
+ /* Two rectangles overlap if the max of the tops is less than the
+ min of the bottoms and the max of the lefts is less than the min
+ of the rights.
+ */
+# undef MAX
+# undef MIN
+# define MAX(A,B) ((A)>(B)?(A):(B))
+# define MIN(A,B) ((A)<(B)?(A):(B))
+
+ int maxleft = MAX(a->x - pad, b->x);
+ int maxtop = MAX(a->y - pad, b->y);
+ int minright = MIN(a->x + a->w + pad + pad - 1, b->x + b->w);
+ int minbot = MIN(a->y + a->h + pad + pad - 1, b->y + b->h);
+ return (maxtop < minbot && maxleft < minright);
+}
+
+
+static Bool
+circles_overlap_p (box *a, box *b, int pad)
+{
+ int ar = a->w/2; /* radius */
+ int br = b->w/2;
+ int ax = a->x + ar; /* center */
+ int ay = a->y + ar;
+ int bx = b->x + br;
+ int by = b->y + br;
+ int d2 = (((bx - ax) * (bx - ax)) + /* distance between centers squared */
+ ((by - ay) * (by - ay)));
+ int r2 = ((ar + br + pad) * /* sum of radii squared */
+ (ar + br + pad));
+ return (d2 < r2);
+}
+
+
+static Bool
+box_collides_p (state *st, box *a, int pad)
+{
+ int i;
+
+ /* collide with wall */
+ if (a->x - pad < 0 ||
+ a->y - pad < 0 ||
+ a->x + a->w + pad + pad >= st->xgwa.width ||
+ a->y + a->h + pad + pad >= st->xgwa.height)
+ return True;
+
+ /* collide with another box */
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *b = &st->boxes[i];
+ if (a != b &&
+ (st->circles_p
+ ? circles_overlap_p (a, b, pad)
+ : boxes_overlap_p (a, b, pad)))
+ return True;
+ }
+
+ return False;
+}
+
+
+static unsigned int
+grow_boxes (state *st)
+{
+ int inc2 = st->inc + st->spacing + st->border_size;
+ int i;
+ int live_count = 0;
+
+ /* check box collisions, and grow if none.
+ */
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *a = &st->boxes[i];
+ if (!(a->flags & ALIVE)) continue;
+
+ if (box_collides_p (st, a, inc2))
+ {
+ a->flags &= ~ALIVE;
+ continue;
+ }
+
+ live_count++;
+ a->x -= st->inc;
+ a->y -= st->inc;
+ a->w += st->inc + st->inc;
+ a->h += st->inc + st->inc;
+ a->flags |= CHANGED;
+ }
+
+ /* Add more boxes.
+ */
+ while (live_count < st->box_count)
+ {
+ box *a;
+ st->nboxes++;
+ if (st->boxes_size <= st->nboxes)
+ {
+ st->boxes_size = (st->boxes_size * 1.2) + st->nboxes;
+ st->boxes = (box *)
+ realloc (st->boxes, st->boxes_size * sizeof(*st->boxes));
+ if (! st->boxes)
+ {
+ fprintf (stderr, "%s: out of memory (%d boxes)\n",
+ progname, st->boxes_size);
+ exit (1);
+ }
+ }
+
+ a = &st->boxes[st->nboxes-1];
+ a->flags = CHANGED;
+
+ for (i = 0; i < 100; i++)
+ {
+ a->x = inc2 + (random() % (st->xgwa.width - inc2));
+ a->y = inc2 + (random() % (st->xgwa.height - inc2));
+ a->w = 0;
+ a->h = 0;
+
+ if (! box_collides_p (st, a, inc2))
+ {
+ a->flags |= ALIVE;
+ live_count++;
+ break;
+ }
+ }
+
+ if (! (a->flags & ALIVE) || /* too many retries; */
+ st->nboxes > 65535) /* that's about 1MB of box structs. */
+ {
+ st->nboxes--; /* go into "fade out" mode now. */
+ st->growing_p = False;
+ return 2000000; /* make customizable... */
+ }
+
+ /* Pick colors for this box */
+ if (st->image)
+ {
+ int w = st->image->width;
+ int h = st->image->height;
+ a->fill_color = XGetPixel (st->image, a->x % w, a->y % h);
+ }
+ else
+ {
+ int n = (st->color_horiz_p
+ ? (a->x * st->ncolors / st->xgwa.width)
+ : (a->y * st->ncolors / st->xgwa.height));
+ a->fill_color = st->colors [n % st->ncolors].pixel;
+ }
+ }
+
+ return st->delay;
+}
+
+
+static unsigned int
+shrink_boxes (state *st)
+{
+ int i;
+ int remaining = 0;
+
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *a = &st->boxes[i];
+
+ if (a->w <= 0 || a->h <= 0) continue;
+
+ a->x += st->inc;
+ a->y += st->inc;
+ a->w -= st->inc + st->inc;
+ a->h -= st->inc + st->inc;
+ a->flags |= CHANGED;
+ if (a->w < 0) a->w = 0;
+ if (a->h < 0) a->h = 0;
+
+ if (a->w > 0 && a->h > 0)
+ remaining++;
+ }
+
+ if (remaining == 0) {
+ reset_boxes (st);
+ return 1000000;
+ } else {
+ return st->delay;
+ }
+}
+
+
+static void
+draw_boxes (state *st)
+{
+ int i;
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *b = &st->boxes[i];
+
+ if (b->flags & UNDEAD) continue;
+ if (! (b->flags & CHANGED)) continue;
+ b->flags &= ~CHANGED;
+
+ if (!st->growing_p)
+ {
+ /* When shrinking, black out an area outside of the border
+ before re-drawing the box.
+ */
+ int margin = st->inc + st->border_size;
+
+ XSetForeground (st->dpy, st->gc, st->bg_color);
+ if (st->circles_p)
+ XFillArc (st->dpy, st->window, st->gc,
+ b->x - margin, b->y - margin,
+ b->w + (margin*2), b->h + (margin*2),
+ 0, 360*64);
+ else
+ XFillRectangle (st->dpy, st->window, st->gc,
+ b->x - margin, b->y - margin,
+ b->w + (margin*2), b->h + (margin*2));
+
+ if (b->w <= 0 || b->h <= 0)
+ b->flags |= UNDEAD; /* really very dead now */
+ }
+
+ if (b->w <= 0 || b->h <= 0) continue;
+
+ XSetForeground (st->dpy, st->gc, b->fill_color);
+
+ if (st->circles_p)
+ XFillArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
+ 0, 360*64);
+ else
+ XFillRectangle (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h);
+
+ if (st->border_size > 0)
+ {
+ unsigned int bd = (st->image
+ ? st->fg_color
+ : st->colors [(b->fill_color + st->ncolors/2)
+ % st->ncolors].pixel);
+ XSetForeground (st->dpy, st->gc, bd);
+ if (st->circles_p)
+ XDrawArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
+ 0, 360*64);
+ else
+ XDrawRectangle (st->dpy, st->window, st->gc,
+ b->x, b->y, b->w, b->h);
+ }
+ }
+}
+
+
+static unsigned long
+boxfit_draw (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+ int delay;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) /* just finished */
+ {
+ st->image = XGetImage (st->dpy,
+ (st->loading_pixmap ? st->loading_pixmap :
+ st->window),
+ 0, 0,
+ st->xgwa.width, st->xgwa.height, ~0L,
+ ZPixmap);
+ if (st->loading_pixmap) XFreePixmap (st->dpy, st->loading_pixmap);
+ XSetWindowBackground (st->dpy, st->window, st->bg_color);
+ if (st->loading_pixmap)
+ XClearWindow (st->dpy, st->window);
+ else
+ st->countdown = 2000000;
+ st->loading_pixmap = 0;
+ }
+ return st->delay;
+ }
+
+ if (st->countdown > 0)
+ {
+ st->countdown -= st->delay;
+ if (st->countdown <= 0)
+ {
+ st->countdown = 0;
+ XClearWindow (st->dpy, st->window);
+ }
+ return st->delay;
+ }
+
+ if (st->growing_p) {
+ draw_boxes (st);
+ delay = grow_boxes (st);
+ } else {
+ delay = shrink_boxes (st);
+ draw_boxes (st);
+ }
+ return delay;
+}
+
+static void
+boxfit_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *st = (state *) closure;
+ reshape_boxes (st);
+}
+
+static Bool
+boxfit_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ state *st = (state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->growing_p = !st->growing_p;
+ return True;
+ }
+ return False;
+}
+
+static void
+boxfit_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *boxfit_defaults [] = {
+ ".background: black",
+ ".foreground: #444444",
+ "*fpsSolid: true",
+ "*delay: 20000",
+ "*mode: random",
+ "*colors: 64",
+ "*boxCount: 50",
+ "*growBy: 1",
+ "*spacing: 1",
+ "*borderSize: 1",
+ "*grab: False",
+ "*peek: False",
+ "*grabDesktopImages: False", /* HAVE_JWXYZ */
+ "*chooseRandomImages: True", /* HAVE_JWXYZ */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec boxfit_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-count", ".boxCount", XrmoptionSepArg, 0 },
+ { "-growby", ".growBy", XrmoptionSepArg, 0 },
+ { "-spacing", ".spacing", XrmoptionSepArg, 0 },
+ { "-border", ".borderSize", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-circles", ".mode", XrmoptionNoArg, "circles" },
+ { "-squares", ".mode", XrmoptionNoArg, "squares" },
+ { "-random", ".mode", XrmoptionNoArg, "random" },
+ { "-grab", ".grab", XrmoptionNoArg, "True" },
+ { "-no-grab", ".grab", XrmoptionNoArg, "False" },
+ { "-peek", ".peek", XrmoptionNoArg, "True" },
+ { "-no-peek", ".peek", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("BoxFit", boxfit)
diff --git a/hacks/boxfit.man b/hacks/boxfit.man
new file mode 100644
index 0000000..ec157e3
--- /dev/null
+++ b/hacks/boxfit.man
@@ -0,0 +1,102 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+boxfit - fills space with a gradient of growing boxes or circles.
+.SH SYNOPSIS
+.B boxfit
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-count \fIint\fP]
+[\-growby \fIint\fP]
+[\-spacing \fIint\fP]
+[\-border \fIint\fP]
+[\-circles | \-squares | \-random]
+[\-grab]
+[\-peek]
+[\-fps]
+.SH DESCRIPTION
+Packs the screen with growing boxes or circles, colored according to a
+horizontal or vertical gradient. The objects grow until they touch,
+then stop. When the screen is full, they shrink away and the process
+restarts.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 20000, or about 0.02 seconds.
+.TP 8
+.B \-count \fIint\fP
+How many boxes or circles to animate simultaneously; default 50.
+Smaller numbers yield larger boxes/circles.
+.TP 8
+.B \-growby \fIint\fP
+How many pixels the objects should grow by, each frame. Default 1.
+.TP 8
+.B \-spacing \fIint\fP
+How many pixels of space should be left between the objects. Default 1.
+.TP 8
+.B \-border \fIint\fP
+Thickness of the colored border around each object. Default 1.
+.TP 8
+.B \-circles\fB | \-squares\fP | \-random\fP
+Draw circles, squares, or choose randomly (the default).
+.TP 8
+.B \-grab
+Normally it colors the boxes with a horizontal or vertical gradient.
+If \fI\-grab\fP is specified, it will instead load a random image,
+and color the boxes according to the colors in that image.
+As the picture fills in, some features of the underlying image
+may become recognisable.
+
+When grabbing images, the image will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.TP 8
+.B \-peek
+This option says to briefly show you the underlying image before
+beginning. The default is not to show the unadulterated image at all.
+(This only has an effect when \fI\-grab\fP is used.)
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/braid.c b/hacks/braid.c
new file mode 100644
index 0000000..4f5a77c
--- /dev/null
+++ b/hacks/braid.c
@@ -0,0 +1,443 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * braid --- random braids around a circle and then changes the color in
+ * a rotational pattern
+ */
+
+#if 0
+static const char sccsid[] = "@(#)braid.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 by John Neil.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
+ * 01-Sep-1995: color knotted components differently, J. Neil.
+ * 29-Aug-1995: Written. John Neil <neil@math.idbsu.edu>
+ */
+
+#ifdef STANDALONE
+# define MODE_braid
+# define DEFAULTS "*delay: 1000 \n" \
+ "*count: 15 \n" \
+ "*cycles: 100 \n" \
+ "*size: -7 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True" \
+
+# define UNIFORM_COLORS
+# define free_braid 0
+# define release_braid 0
+# define reshape_braid 0
+# define braid_handle_event 0
+# include "xlockmore.h"
+#else /* STANDALONE */
+# include "xlock.h"
+# define ENTRYPOINT /**/
+#endif /* STANDALONE */
+
+#ifdef MODE_braid
+
+ENTRYPOINT ModeSpecOpt braid_opts = {0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct braid_description =
+{"braid", "init_braid", "draw_braid", (char *) NULL,
+ "refresh_braid", "init_braid", (char *) NULL, &braid_opts,
+ 1000, 15, 100, 1, 64, 1.0, "",
+ "Shows random braids and knots", 0, NULL};
+
+#endif
+
+#if defined( COLORROUND ) && defined( COLORCOMP )
+#undef COLORROUND
+#undef COLORCOMP
+#endif
+
+#if !defined( COLORROUND ) && !defined( COLORCOMP )
+#if 0
+/* to color in a circular pattern use COLORROUND */
+#define COLORROUND
+#else
+/* to color by component use COLORCOMP */
+#define COLORCOMP
+#endif
+#endif
+
+#define MAXLENGTH 50 /* the maximum length of a braid word */
+#define MINLENGTH 8 /* the minimum length of a braid word */
+#define MAXSTRANDS 15 /* the maximum number of strands in the braid */
+#define MINSTRANDS 3 /* the minimum number of strands in the braid */
+#define SPINRATE 12.0 /* the rate at which the colors spin */
+
+#define INTRAND(min,max) (NRAND((max+1)-(min))+(min))
+#define FLOATRAND(min,max) ((min)+((double) LRAND()/((double) MAXRAND))*((max)-(min)))
+
+typedef struct {
+ int linewidth;
+ int braidword[MAXLENGTH];
+ int components[MAXSTRANDS];
+ int startcomp[MAXLENGTH][MAXSTRANDS];
+ int nstrands;
+ int braidlength;
+ float startcolor;
+ int center_x;
+ int center_y;
+ float min_radius;
+ float max_radius;
+ float top, bottom, left, right;
+ int age;
+ int color_direction;
+} braidtype;
+
+static braidtype *braids = (braidtype *) NULL;
+
+static int
+applyword(braidtype * braid, int string, int position)
+{
+ int i, c;
+
+ c = string;
+ for (i = position; i < braid->braidlength; i++) {
+ if (c == ABS(braid->braidword[i]))
+ c--;
+ else if (c == ABS(braid->braidword[i]) - 1)
+ c++;
+ }
+ for (i = 0; i < position; i++) {
+ if (c == ABS(braid->braidword[i]))
+ c--;
+ else if (c == ABS(braid->braidword[i]) - 1)
+ c++;
+ }
+ return c;
+}
+
+#if 0
+static int
+applywordto(braidtype * braid, int string, int position)
+{
+ int i, c;
+
+ c = string;
+ for (i = 0; i < position; i++) {
+ if (c == ABS(braid->braidword[i])) {
+ c--;
+ } else if (c == ABS(braid->braidword[i]) - 1) {
+ c++;
+ }
+ }
+ return c;
+}
+#endif
+
+static int
+applywordbackto(braidtype * braid, int string, int position)
+{
+ int i, c;
+
+ c = string;
+ for (i = position - 1; i >= 0; i--) {
+ if (c == ABS(braid->braidword[i])) {
+ c--;
+ } else if (c == ABS(braid->braidword[i]) - 1) {
+ c++;
+ }
+ }
+ return c;
+}
+
+ENTRYPOINT void
+init_braid(ModeInfo * mi)
+{
+ braidtype *braid;
+ int used[MAXSTRANDS];
+ int i, count, comp, c;
+ float min_length;
+
+ MI_INIT (mi, braids);
+ braid = &braids[MI_SCREEN(mi)];
+
+ braid->center_x = MI_WIDTH(mi) / 2;
+ braid->center_y = MI_HEIGHT(mi) / 2;
+ braid->age = 0;
+
+ /* jwz: go in the other direction sometimes. */
+ braid->color_direction = ((LRAND() & 1) ? 1 : -1);
+
+ MI_CLEARWINDOW(mi);
+
+ min_length = (braid->center_x > braid->center_y) ?
+ braid->center_y : braid->center_x;
+ braid->min_radius = min_length * 0.30;
+ braid->max_radius = min_length * 0.90;
+
+ if (MI_COUNT(mi) < MINSTRANDS)
+ braid->nstrands = MINSTRANDS;
+ else
+ braid->nstrands = INTRAND(MINSTRANDS,
+ MAX(MIN(MIN(MAXSTRANDS, MI_COUNT(mi)),
+ (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS));
+ braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH -1, braid->nstrands * 6));
+
+ for (i = 0; i < braid->braidlength; i++) {
+ braid->braidword[i] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ if (i > 0)
+ while (braid->braidword[i] == -braid->braidword[i - 1])
+ braid->braidword[i] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ }
+
+ while (braid->braidword[0] == -braid->braidword[braid->braidlength - 1])
+ braid->braidword[braid->braidlength - 1] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+
+ do {
+ (void) memset((char *) used, 0, sizeof (used));
+ count = 0;
+ for (i = 0; i < braid->braidlength; i++)
+ used[ABS(braid->braidword[i])]++;
+ for (i = 0; i < braid->nstrands; i++)
+ count += (used[i] > 0) ? 1 : 0;
+ if (count < braid->nstrands - 1) {
+ braid->braidword[braid->braidlength] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ while (braid->braidword[braid->braidlength] ==
+ -braid->braidword[braid->braidlength - 1] &&
+ braid->braidword[0] == -braid->braidword[braid->braidlength])
+ braid->braidword[braid->braidlength] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ braid->braidlength++;
+ }
+ } while (count < braid->nstrands - 1 && braid->braidlength < MAXLENGTH);
+
+ braid->startcolor = (MI_NPIXELS(mi) > 2) ?
+ (float) NRAND(MI_NPIXELS(mi)) : 0.0;
+ /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound,
+ JoinRound); */
+
+ (void) memset((char *) braid->components, 0, sizeof (braid->components));
+ c = 1;
+ comp = 0;
+ braid->components[0] = 1;
+ do {
+ i = comp;
+ do {
+ i = applyword(braid, i, 0);
+ braid->components[i] = braid->components[comp];
+ } while (i != comp);
+ count = 0;
+ for (i = 0; i < braid->nstrands; i++)
+ if (braid->components[i] == 0)
+ count++;
+ if (count > 0) {
+ for (comp = 0; braid->components[comp] != 0; comp++);
+ braid->components[comp] = ++c;
+ }
+ } while (count > 0);
+
+ braid->linewidth = MI_SIZE(mi);
+
+ if (braid->linewidth < 0)
+ braid->linewidth = NRAND(-braid->linewidth) + 1;
+ if (braid->linewidth * braid->linewidth * 8 > MIN(MI_WIDTH(mi), MI_HEIGHT(mi)))
+ braid->linewidth = MIN(1, (int) sqrt((double) MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) / 8));
+ for (i = 0; i < braid->nstrands; i++)
+ if (!(braid->components[i] & 1))
+ braid->components[i] *= -1;
+}
+
+ENTRYPOINT void
+draw_braid(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int num_points = 500;
+ float t_inc;
+ float theta, psi;
+ float t, r_diff;
+ int i, s;
+ float x_1, y_1, x_2, y_2, r1, r2;
+ float color, color_use = 0.0, color_inc;
+ braidtype *braid;
+
+ if (braids == NULL)
+ return;
+ braid = &braids[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ XSetLineAttributes(display, MI_GC(mi), braid->linewidth,
+ LineSolid,
+ (braid->linewidth <= 3 ? CapButt : CapRound),
+ JoinMiter);
+
+ theta = (2.0 * M_PI) / (float) (braid->braidlength);
+ t_inc = (2.0 * M_PI) / (float) num_points;
+ color_inc = (float) MI_NPIXELS(mi) * braid->color_direction /
+ (float) num_points;
+ braid->startcolor += SPINRATE * color_inc;
+ if (((int) braid->startcolor) >= MI_NPIXELS(mi))
+ braid->startcolor = 0.0;
+
+ r_diff = (braid->max_radius - braid->min_radius) / (float) (braid->nstrands);
+
+ color = braid->startcolor;
+ psi = 0.0;
+ for (i = 0; i < braid->braidlength; i++) {
+ psi += theta;
+ for (t = 0.0; t < theta; t += t_inc) {
+#ifdef COLORROUND
+ color += color_inc;
+ if (((int) color) >= MI_NPIXELS(mi))
+ color = 0.0;
+ color_use = color;
+#endif
+ for (s = 0; s < braid->nstrands; s++) {
+ if (ABS(braid->braidword[i]) == s)
+ continue;
+ if (ABS(braid->braidword[i]) - 1 == s) {
+ /* crosSINFg */
+#ifdef COLORCOMP
+ if (MI_NPIXELS(mi) > 2) {
+ color_use = color + SPINRATE *
+ braid->components[applywordbackto(braid, s, i)] +
+ (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ while (((int) color_use) < 0)
+ color_use += (float) MI_NPIXELS(mi);
+ }
+#endif
+#ifdef COLORROUND
+ if (MI_NPIXELS(mi) > 2) {
+ color_use += SPINRATE * color_inc;
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ }
+#endif
+ r1 = braid->min_radius + r_diff * (float) (s);
+ r2 = braid->min_radius + r_diff * (float) (s + 1);
+ if (braid->braidword[i] > 0 ||
+ (FABSF(t - theta / 2.0) > theta / 7.0)) {
+ x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
+ COSF(t + psi) + braid->center_x;
+ y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
+ SINF(t + psi) + braid->center_y;
+ x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
+ COSF(t + t_inc + psi) + braid->center_x;
+ y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
+ SINF(t + t_inc + psi) + braid->center_y;
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+ else
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+
+ XDrawLine(display, window, MI_GC(mi),
+ (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+ }
+#ifdef COLORCOMP
+ if (MI_NPIXELS(mi) > 2) {
+ color_use = color + SPINRATE *
+ braid->components[applywordbackto(braid, s + 1, i)] +
+ (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ while (((int) color_use) < 0)
+ color_use += (float) MI_NPIXELS(mi);
+ }
+#endif
+ if (braid->braidword[i] < 0 ||
+ (FABSF(t - theta / 2.0) > theta / 7.0)) {
+ x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
+ COSF(t + psi) + braid->center_x;
+ y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
+ SINF(t + psi) + braid->center_y;
+ x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
+ COSF(t + t_inc + psi) + braid->center_x;
+ y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
+ SINF(t + t_inc + psi) + braid->center_y;
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+ else
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+
+ XDrawLine(display, window, MI_GC(mi),
+ (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+ }
+ } else {
+ /* no crosSINFg */
+#ifdef COLORCOMP
+ if (MI_NPIXELS(mi) > 2) {
+ color_use = color + SPINRATE *
+ braid->components[applywordbackto(braid, s, i)] +
+ (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ while (((int) color_use) < 0)
+ color_use += (float) MI_NPIXELS(mi);
+ }
+#endif
+#ifdef COLORROUND
+ if (MI_NPIXELS(mi) > 2) {
+ color_use += SPINRATE * color_inc;
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ }
+#endif
+ r1 = braid->min_radius + r_diff * (float) (s);
+ x_1 = r1 * COSF(t + psi) + braid->center_x;
+ y_1 = r1 * SINF(t + psi) + braid->center_y;
+ x_2 = r1 * COSF(t + t_inc + psi) + braid->center_x;
+ y_2 = r1 * SINF(t + t_inc + psi) + braid->center_y;
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+ else
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+
+ XDrawLine(display, window, MI_GC(mi),
+ (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+ }
+ }
+ }
+ }
+ XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinRound);
+
+ if (++braid->age > MI_CYCLES(mi)) {
+ init_braid(mi);
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_braid(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Braid", braid)
+
+#endif /* MODE_braid */
diff --git a/hacks/braid.man b/hacks/braid.man
new file mode 100644
index 0000000..28f0c4d
--- /dev/null
+++ b/hacks/braid.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+braid - draws random color-cycling braids around a circle
+.SH SYNOPSIS
+.B braid
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIbraid\fP program draws random color-cycling braids around a circle.
+.SH OPTIONS
+.I braid
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by John Neil.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+John Neil <neil@math.idbsu.edu>, 29-Aug-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/bsod.c b/hacks/bsod.c
new file mode 100644
index 0000000..ff6c359
--- /dev/null
+++ b/hacks/bsod.c
@@ -0,0 +1,6008 @@
+/* xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Blue Screen of Death: the finest in personal computer emulation.
+ * Concept cribbed from Stephen Martin <smartin@mks.com>;
+ * this version written by jwz, 4-Jun-98.
+ * Mostly rewritten by jwz, 20-Feb-2006.
+ */
+
+
+/* To add a new mode:
+
+ - Define a function `new_os(dpy,win)' that returns a `bsod_state' struct.
+ - Draw on the window to set up its frame-zero state. This must be fast:
+ no sleeping or long loops!
+ - Populate the bsod_state structure with additional actions to take by
+ using the various BSOD_ macros. Note that you can control the delays
+ when printing text on a per-character or per-line basis.
+ - Insert your function in the `all_modes' table.
+ - Add a `doXXX' entry to `bsod_defaults'.
+ - Add fonts or colors to `bsod_defaults' if necessary.
+
+ Look at windows_31() for a simple example.
+
+ Look at linux_fsck() for a more complicated example with random behavior.
+
+ Or, you can bypass all that: look at nvidia() for a really hairy example.
+ */
+
+
+#include "screenhack.h"
+#include "ximage-loader.h"
+#include "apple2.h"
+
+#include <ctype.h>
+#include <time.h>
+
+#ifdef HAVE_XSHM_EXTENSION
+#include "xshm.h"
+#endif
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+
+#include "images/gen/amiga_png.h"
+#include "images/gen/hmac_png.h"
+#include "images/gen/osx_10_2_png.h"
+#include "images/gen/osx_10_3_png.h"
+#include "images/gen/android_png.h"
+#include "images/gen/ransomware_png.h"
+#include "images/gen/atari_png.h"
+#include "images/gen/mac_png.h"
+#include "images/gen/macbomb_png.h"
+#include "images/gen/apple_png.h"
+#include "images/gen/atm_png.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+# undef MIN
+# undef MAX
+# define MIN(A,B) ((A)<(B)?(A):(B))
+# define MAX(A,B) ((A)>(B)?(A):(B))
+
+#undef EOF
+typedef enum { EOF=0,
+ LEFT, CENTER, RIGHT,
+ LEFT_FULL, CENTER_FULL, RIGHT_FULL,
+ COLOR, INVERT, MOVETO, MARGINS,
+ CURSOR_BLOCK, CURSOR_LINE, RECT, LINE, COPY, PIXMAP, IMG, FONT,
+ PAUSE, CHAR_DELAY, LINE_DELAY,
+ LOOP, RESET, VERT_MARGINS, CROP,
+ WRAP, WORD_WRAP, TRUNCATE
+} bsod_event_type;
+
+struct bsod_event {
+ bsod_event_type type;
+ void *arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
+};
+
+struct bsod_state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ XFontStruct *font, *fontA, *fontB, *fontC;
+ unsigned long fg, bg;
+ GC gc;
+ int left_margin, right_margin; /* for text wrapping */
+ int top_margin, bottom_margin; /* for text scrolling and cropping */
+ int xoff, yoff;
+ Bool wrap_p, word_wrap_p;
+ char word_buf[80];
+ Bool scroll_p;
+ Bool crop_p; /* If True, chops off extra text vertically */
+
+ Pixmap pixmap, mask; /* Source image used by BSOD_PIXMAP */
+
+ int x, y; /* current text-drawing position */
+ int current_left; /* don't use this */
+ int last_nonwhite;
+
+ int pos; /* position in queue */
+ int queue_size;
+ struct bsod_event *queue;
+
+ unsigned long char_delay; /* delay between printing characters */
+ unsigned long line_delay; /* delay between printing lines */
+
+ Bool macx_eol_kludge;
+
+ void *closure;
+ int (*draw_cb) (struct bsod_state *);
+ void (*free_cb) (struct bsod_state *);
+
+ async_load_state *img_loader;
+};
+
+
+# if !defined(__GNUC__) && !defined(__extension__)
+ /* don't warn about "string length is greater than the length ISO C89
+ compilers are required to support" in these string constants... */
+# define __extension__ /**/
+# endif
+
+
+/* Draw text at the current position; align is LEFT, CENTER, RIGHT, or *_FULL
+ (meaning to clear the whole line margin to margin).
+ */
+#define BSOD_TEXT(bst,align,string) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = (align); \
+ (bst)->queue[(bst)->pos].arg1 = (void *) strdup (__extension__ (string)); \
+ (bst)->queue[(bst)->pos].arg2 = (bst)->queue[(bst)->pos].arg1; \
+ (bst)->queue[(bst)->pos].arg3 = (void *) 0; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Flip the foreground and background colors
+ */
+#define BSOD_INVERT(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = INVERT; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the foreground and background colors to the given pixels
+ */
+#define BSOD_COLOR(bst,fg,bg) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = COLOR; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) fg; \
+ (bst)->queue[(bst)->pos].arg2 = (void *) bg; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the position of the next text.
+ Note that this is the baseline: lower left corner of next char printed.
+ */
+#define BSOD_MOVETO(bst,x,y) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = MOVETO; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (x)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (y)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Delay for at least the given number of microseconds.
+ */
+#define BSOD_PAUSE(bst,usec) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = PAUSE; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (usec)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the delay after each character is printed.
+ */
+#define BSOD_CHAR_DELAY(bst,usec) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = CHAR_DELAY; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (usec)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the delay after each newline.
+ */
+#define BSOD_LINE_DELAY(bst,usec) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = LINE_DELAY; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) (usec); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the prevailing left/right margins (used when strings have
+ embedded newlines, and when centering or right-justifying text.)
+ */
+#define BSOD_MARGINS(bst,left,right) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = MARGINS; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (left)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (right)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the prevailing top/bottom margins (used when scrolling and cropping text)
+ */
+#define BSOD_VERT_MARGINS(bst,top,bottom) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = VERT_MARGINS; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (top)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (bottom)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Draw a blinking cursor; type is CURSOR_BLOCK or CURSOR_LINE.
+ usec is how long 1/2 of a cycle is. count is how many times to blink.
+ (You can pass a gigantic number if this is the last thing in your mode.)
+ */
+#define BSOD_CURSOR(bst,ctype,usec,count) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = (ctype); \
+ (bst)->queue[(bst)->pos].arg1 = (void *) (usec); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) (count); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Draw or fill a rectangle. You can set line-width in the GC.
+ */
+#define BSOD_RECT(bst,fill,x,y,w,h) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = RECT; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (fill)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (x)); \
+ (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (y)); \
+ (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (w)); \
+ (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (h)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Draw a line.
+ */
+#define BSOD_LINE(bst,x,y,x2,y2,thick) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = LINE; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (x)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (y)); \
+ (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (x2)); \
+ (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (y2)); \
+ (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (thick)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Copy a rect from the window, to the window.
+ */
+#define BSOD_COPY(bst,srcx,srcy,w,h,tox,toy) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = COPY; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (srcx)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (srcy)); \
+ (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (w)); \
+ (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (h)); \
+ (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (tox)); \
+ (bst)->queue[(bst)->pos].arg6 = (void *) ((long) (toy)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Copy a rect from bst->pixmap to the window.
+ */
+#define BSOD_PIXMAP(bst,srcx,srcy,w,h,tox,toy) do { \
+ BSOD_COPY(bst,srcx,srcy,w,h,tox,toy); \
+ (bst)->queue[(bst)->pos-1].type = PIXMAP; \
+ } while (0)
+
+/* Load a random image (or the desktop) onto the window.
+ */
+#define BSOD_IMG(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = IMG; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Switch between fonts A, B and C.
+ */
+#define BSOD_FONT(bst,n) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = FONT; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (n)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Jump around in the state table. You can use this as the last thing
+ in your state table to repeat the last N elements forever.
+ */
+#define BSOD_LOOP(bst,off) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = LOOP; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) (off); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Restart the whole thing from the beginning.
+ */
+#define BSOD_RESET(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = RESET; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Sets the crop state, if True, will not write text below the bottom_margin
+ */
+#define BSOD_CROP(bst, state) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = CROP; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (state)); \
+ (bst)->pos++; \
+ } while (0)
+
+#define BSOD_WRAP(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = WRAP; \
+ (bst)->pos++; \
+ } while (0)
+
+#define BSOD_WORD_WRAP(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = WORD_WRAP; \
+ (bst)->pos++; \
+ } while (0)
+
+#define BSOD_TRUNCATE(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = TRUNCATE; \
+ (bst)->pos++; \
+ } while (0)
+
+
+static void
+ensure_queue (struct bsod_state *bst)
+{
+ int n;
+ if (bst->pos + 1 < bst->queue_size)
+ return;
+
+ n = bst->queue_size + 10;
+ if (n < 100) n *= 2;
+ n *= 1.2;
+
+ bst->queue = (struct bsod_event *)
+ realloc (bst->queue, n * sizeof(*bst->queue));
+ if (!bst->queue) abort();
+ memset (bst->queue + bst->queue_size, 0,
+ (n - bst->queue_size) * sizeof(*bst->queue));
+ bst->queue_size = n;
+}
+
+
+static void
+position_for_text (struct bsod_state *bst, const char *line)
+{
+ int max_width = 0;
+
+ const char *start = line;
+
+ if (bst->queue[bst->pos].type != LEFT &&
+ bst->queue[bst->pos].type != LEFT_FULL)
+ while (*start)
+ {
+ int dir, ascent, descent;
+ XCharStruct ov;
+ const char *end = start;
+ while (*end && *end != '\r' && *end != '\n')
+ end++;
+
+ XTextExtents (bst->font, start, end-start,
+ &dir, &ascent, &descent, &ov);
+ if (ov.width > max_width)
+ max_width = ov.width;
+ if (!*end) break;
+ start = end+1;
+ }
+
+ switch (bst->queue[bst->pos].type) {
+ case LEFT:
+ case LEFT_FULL:
+ bst->current_left = bst->left_margin + bst->xoff;
+ break;
+ case RIGHT:
+ case RIGHT_FULL:
+ bst->x = max_width - bst->right_margin - bst->xoff;
+ bst->current_left = bst->x;
+ break;
+ case CENTER:
+ case CENTER_FULL:
+ {
+ int w = (bst->xgwa.width - bst->left_margin - bst->right_margin -
+ max_width);
+ if (w < 0) w = 0;
+ bst->x = bst->left_margin + bst->xoff + (w / 2);
+ bst->current_left = bst->x;
+ break;
+ }
+ default:
+ abort();
+ }
+}
+
+
+static void
+bst_crlf (struct bsod_state *bst)
+{
+ int lh = bst->font->ascent + bst->font->descent;
+ bst->x = bst->current_left;
+ if (!bst->scroll_p ||
+ bst->y + lh < bst->xgwa.height - bst->bottom_margin - bst->yoff)
+ bst->y += lh;
+ else
+ {
+ int w = bst->xgwa.width - bst->right_margin - bst->left_margin;
+ int h = bst->xgwa.height - bst->top_margin - bst->bottom_margin;
+ XCopyArea (bst->dpy, bst->window, bst->window, bst->gc,
+ bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff + lh,
+ w, h - lh,
+ bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff);
+ XClearArea (bst->dpy, bst->window,
+ bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff + h - lh, w, lh, False);
+ }
+}
+
+
+static void
+draw_char (struct bsod_state *bst, char c)
+{
+ if (!c)
+ abort();
+ else if (bst->crop_p && bst->y >=
+ (bst->xgwa.height - bst->bottom_margin - bst->yoff))
+ {
+ /* reached the bottom of the drawing area, and crop_p = True */
+ return;
+ }
+ else if (c == '\r')
+ {
+ bst->x = bst->current_left;
+ bst->last_nonwhite = bst->x;
+ }
+ else if (c == '\n')
+ {
+ if (bst->macx_eol_kludge)
+ {
+ /* Special case for the weird way OSX crashes print newlines... */
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y, " ", 1);
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x,
+ bst->y + bst->font->ascent + bst->font->descent,
+ " ", 1);
+ }
+ bst_crlf (bst);
+ }
+ else if (c == '\b') /* backspace */
+ {
+ int cw = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ bst->x -= cw;
+ if (bst->x < bst->left_margin + bst->xoff)
+ bst->x = bst->left_margin + bst->xoff;
+ }
+ else
+ {
+ int dir, ascent, descent;
+ XCharStruct ov;
+ XTextExtents (bst->font, &c, 1, &dir, &ascent, &descent, &ov);
+
+ if ((bst->wrap_p || bst->word_wrap_p) &&
+ bst->x + ov.width > bst->xgwa.width - bst->right_margin - bst->xoff)
+ {
+ XCharStruct ov2;
+ int L = 0;
+
+ if (bst->word_wrap_p && *bst->word_buf)
+ {
+ L = strlen(bst->word_buf);
+ XTextExtents (bst->font, bst->word_buf, L,
+ &dir, &ascent, &descent, &ov2);
+ }
+
+ if (L) /* Erase the truncated wrapped word */
+ {
+ XSetForeground (bst->dpy, bst->gc, bst->bg);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ bst->last_nonwhite,
+ bst->y - bst->font->ascent,
+ ov2.width,
+ bst->font->ascent + bst->font->descent);
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ }
+
+ bst_crlf (bst);
+
+ if (L) /* Draw wrapped partial word on the next line, no delay */
+ {
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y, bst->word_buf, L);
+ bst->x += ov2.width;
+ bst->last_nonwhite = bst->x;
+ }
+ }
+
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y, &c, 1);
+ bst->x += ov.width;
+
+ if (bst->word_wrap_p)
+ {
+ if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
+ {
+ bst->word_buf[0] = 0;
+ bst->last_nonwhite = bst->x;
+ }
+ else
+ {
+ int L = strlen (bst->word_buf);
+ if (L >= sizeof(bst->word_buf)-1) abort();
+ bst->word_buf[L] = c;
+ bst->word_buf[L+1] = 0;
+ }
+ }
+ }
+}
+
+
+static long
+bsod_pop (struct bsod_state *bst)
+{
+ bsod_event_type type = bst->queue[bst->pos].type;
+
+ if (bst->draw_cb)
+ return bst->draw_cb (bst);
+
+ if (bst->pos < 0) /* already done */
+ abort();
+
+ switch (type) {
+
+ case LEFT: case LEFT_FULL:
+ case CENTER: case CENTER_FULL:
+ case RIGHT: case RIGHT_FULL:
+ {
+ const char *s = (const char *) bst->queue[bst->pos].arg2;
+ char c;
+
+ if (! *s)
+ {
+ long delay = bst->line_delay;
+ /* Reset the string back to the beginning, in case we loop. */
+ bst->queue[bst->pos].arg2 = bst->queue[bst->pos].arg1;
+ bst->queue[bst->pos].arg3 = 0;
+ bst->queue[bst->pos].type = (bsod_event_type)
+ bst->queue[bst->pos].arg4;
+ bst->pos++;
+ bst->current_left = bst->left_margin + bst->xoff;
+ return delay;
+ }
+
+ if (! bst->queue[bst->pos].arg3) /* "done once" */
+ {
+ position_for_text (bst, s);
+ bst->queue[bst->pos].arg4 = (void *) bst->queue[bst->pos].type;
+ bst->queue[bst->pos].type = LEFT;
+ bst->word_buf[0] = 0;
+ bst->last_nonwhite = bst->x;
+
+ if (type == CENTER_FULL ||
+ type == LEFT_FULL ||
+ type == RIGHT_FULL)
+ {
+ XSetForeground (bst->dpy, bst->gc, bst->bg);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ 0,
+ bst->y - bst->font->ascent,
+ bst->xgwa.width,
+ bst->font->ascent + bst->font->descent);
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ }
+ }
+
+ c = *s++;
+ draw_char (bst, c);
+ bst->queue[bst->pos].arg2 = (void *) s;
+ bst->queue[bst->pos].arg3 = (void *) 1; /* "done once" */
+
+ return (c == '\r' || c == '\n'
+ ? bst->line_delay
+ : bst->char_delay);
+ }
+ case INVERT:
+ {
+ unsigned long swap = bst->fg;
+ bst->fg = bst->bg;
+ bst->bg = swap;
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ XSetBackground (bst->dpy, bst->gc, bst->bg);
+ bst->pos++;
+ return 0;
+ }
+ case COLOR:
+ {
+ bst->fg = (unsigned long) bst->queue[bst->pos].arg1;
+ bst->bg = (unsigned long) bst->queue[bst->pos].arg2;
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ XSetBackground (bst->dpy, bst->gc, bst->bg);
+ bst->pos++;
+ return 0;
+ }
+ case MOVETO:
+ {
+ bst->x = (long) bst->queue[bst->pos].arg1;
+ bst->y = (long) bst->queue[bst->pos].arg2;
+ bst->word_buf[0] = 0;
+ bst->last_nonwhite = bst->x;
+ bst->pos++;
+ return 0;
+ }
+ case RECT:
+ {
+ int f = (long) bst->queue[bst->pos].arg1;
+ int x = (long) bst->queue[bst->pos].arg2;
+ int y = (long) bst->queue[bst->pos].arg3;
+ int w = (long) bst->queue[bst->pos].arg4;
+ int h = (long) bst->queue[bst->pos].arg5;
+ if (f)
+ XFillRectangle (bst->dpy, bst->window, bst->gc, x, y, w, h);
+ else
+ XDrawRectangle (bst->dpy, bst->window, bst->gc, x, y, w, h);
+ bst->pos++;
+ return 0;
+ }
+ case LINE:
+ {
+ int x1 = (long) bst->queue[bst->pos].arg1;
+ int y1 = (long) bst->queue[bst->pos].arg2;
+ int x2 = (long) bst->queue[bst->pos].arg3;
+ int y2 = (long) bst->queue[bst->pos].arg4;
+ int t = (long) bst->queue[bst->pos].arg5;
+ XGCValues gcv;
+ gcv.line_width = t;
+ XChangeGC (bst->dpy, bst->gc, GCLineWidth, &gcv);
+ XDrawLine (bst->dpy, bst->window, bst->gc, x1, y1, x2, y2);
+ bst->pos++;
+ return 0;
+ }
+ case COPY:
+ case PIXMAP:
+ {
+ int srcx = (long) bst->queue[bst->pos].arg1;
+ int srcy = (long) bst->queue[bst->pos].arg2;
+ int w = (long) bst->queue[bst->pos].arg3;
+ int h = (long) bst->queue[bst->pos].arg4;
+ int tox = (long) bst->queue[bst->pos].arg5;
+ int toy = (long) bst->queue[bst->pos].arg6;
+ if (type == PIXMAP && bst->mask)
+ {
+ XSetClipMask (bst->dpy, bst->gc, bst->mask);
+ XSetClipOrigin (bst->dpy, bst->gc, tox, toy);
+ }
+ XCopyArea (bst->dpy,
+ (type == PIXMAP ? bst->pixmap : bst->window),
+ bst->window, bst->gc,
+ srcx, srcy, w, h, tox, toy);
+ if (type == PIXMAP && bst->mask)
+ XSetClipMask (bst->dpy, bst->gc, None);
+ bst->pos++;
+ return 0;
+ }
+ case IMG:
+ {
+ if (bst->img_loader) abort();
+ bst->img_loader = load_image_async_simple (0, bst->xgwa.screen,
+ bst->window, bst->window,
+ 0, 0);
+ bst->pos++;
+ return 0;
+ }
+ case FONT:
+ {
+ switch ((long) bst->queue[bst->pos].arg1) {
+ case 0: bst->font = bst->fontA; break;
+ case 1: bst->font = bst->fontB; break;
+ case 2: bst->font = bst->fontC; break;
+ default: abort(); break;
+ }
+ XSetFont (bst->dpy, bst->gc, bst->font->fid);
+ bst->pos++;
+ return 0;
+ }
+ case PAUSE:
+ {
+ long delay = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return delay;
+ }
+ case CHAR_DELAY:
+ {
+ bst->char_delay = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return 0;
+ }
+ case LINE_DELAY:
+ {
+ bst->line_delay = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return 0;
+ }
+ case MARGINS:
+ {
+ bst->left_margin = (long) bst->queue[bst->pos].arg1;
+ bst->right_margin = (long) bst->queue[bst->pos].arg2;
+ bst->pos++;
+ return 0;
+ }
+ case VERT_MARGINS:
+ {
+ bst->top_margin = (long) bst->queue[bst->pos].arg1;
+ bst->bottom_margin = (long) bst->queue[bst->pos].arg2;
+ bst->pos++;
+ return 0;
+ }
+ case CURSOR_BLOCK:
+ case CURSOR_LINE:
+ {
+ long delay = (long) bst->queue[bst->pos].arg1;
+ long count = (long) bst->queue[bst->pos].arg2;
+ int ox = bst->x;
+
+ if (type == CURSOR_BLOCK)
+ {
+ unsigned long swap = bst->fg;
+ bst->fg = bst->bg;
+ bst->bg = swap;
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ XSetBackground (bst->dpy, bst->gc, bst->bg);
+ draw_char (bst, ' ');
+ }
+ else
+ {
+ draw_char (bst, (count & 1 ? ' ' : '_'));
+ draw_char (bst, ' ');
+ }
+
+ bst->x = ox;
+
+ count--;
+ bst->queue[bst->pos].arg2 = (void *) count;
+ if (count <= 0)
+ bst->pos++;
+
+ return delay;
+ }
+ case WRAP:
+ bst->wrap_p = 1;
+ bst->word_wrap_p = 0;
+ bst->pos++;
+ return 0;
+
+ case WORD_WRAP:
+ bst->wrap_p = 0;
+ bst->word_wrap_p = 1;
+ bst->pos++;
+ return 0;
+
+ case TRUNCATE:
+ bst->wrap_p = 0;
+ bst->word_wrap_p = 0;
+ bst->pos++;
+ return 0;
+
+ case LOOP:
+ {
+ long off = (long) bst->queue[bst->pos].arg1;
+ bst->pos += off;
+ if (bst->pos < 0 || bst->pos >= bst->queue_size)
+ abort();
+ return 0;
+ }
+ case RESET:
+ {
+ int i;
+ for (i = 0; i < bst->queue_size; i++)
+ switch (bst->queue[i].type) {
+ case LEFT: case LEFT_FULL:
+ case CENTER: case CENTER_FULL:
+ case RIGHT: case RIGHT_FULL:
+ bst->queue[i].arg2 = bst->queue[i].arg1;
+ bst->queue[i].arg3 = 0;
+ bst->queue[i].type = (bsod_event_type) bst->queue[i].arg4;
+ break;
+ default: break;
+ }
+ bst->pos = 0;
+ return 0;
+ }
+ case CROP:
+ {
+ bst->crop_p = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return 0;
+ }
+ case EOF:
+ {
+ bst->pos = -1;
+ return -1;
+ }
+ default:
+ break;
+ }
+ abort();
+}
+
+
+static struct bsod_state *
+make_bsod_state (Display *dpy, Window window,
+ const char *name, const char *class)
+{
+ XGCValues gcv;
+ struct bsod_state *bst;
+ char buf1[1024], buf2[1024];
+ char buf5[1024], buf6[1024];
+ char buf7[1024], buf8[1024];
+ const char *font1, *font3, *font4;
+
+ bst = (struct bsod_state *) calloc (1, sizeof (*bst));
+ bst->queue_size = 10;
+ bst->queue = (struct bsod_event *) calloc (bst->queue_size,
+ sizeof (*bst->queue));
+ bst->dpy = dpy;
+ bst->window = window;
+ XGetWindowAttributes (dpy, window, &bst->xgwa);
+
+ /* If the window is small, use ".font"; if big, ".bigFont". */
+ if (
+# ifdef HAVE_MOBILE
+ 1
+# else
+ bst->xgwa.height < 640
+# endif
+ )
+ {
+ sprintf (buf1, "%.100s.font", name);
+ sprintf (buf2, "%.100s.font", class);
+ }
+ else
+ {
+ sprintf (buf1, "%.100s.bigFont", name);
+ sprintf (buf2, "%.100s.bigFont", class);
+ }
+ sprintf (buf5, "%.100s.fontB", name);
+ sprintf (buf6, "%.100s.fontB", class);
+ sprintf (buf7, "%.100s.fontC", name);
+ sprintf (buf8, "%.100s.fontC", class);
+
+ font1 = get_string_resource (dpy, buf1, buf2);
+ font3 = get_string_resource (dpy, buf5, buf6);
+ font4 = get_string_resource (dpy, buf7, buf8);
+
+ /* If there was no ".mode.font" resource also look for ".font".
+ Under real X11, the wildcard does this, so this is redundant,
+ but jwxyz needs it because it doesn't implement wildcards.
+ */
+# define RES2(VAR, BUF1, BUF2) do { \
+ if (! VAR) { \
+ VAR = get_string_resource (dpy, \
+ strchr (BUF1, '.') + 1, \
+ strchr (BUF2, '.') + 1); \
+ }} while(0)
+ RES2 (font1, buf1, buf2);
+ RES2 (font3, buf5, buf6);
+ RES2 (font4, buf7, buf8);
+#undef RES2
+
+ if (font1 && *font1)
+ bst->font = load_font_retry (dpy, font1);
+
+ if (! bst->font)
+ abort();
+
+ if (font3 && *font3)
+ bst->fontB = load_font_retry (dpy, font3);
+ if (font4 && *font4)
+ bst->fontC = load_font_retry (dpy, font4);
+
+ if (! bst->fontB) bst->fontB = bst->font;
+ if (! bst->fontC) bst->fontC = bst->font;
+
+ bst->fontA = bst->font;
+
+
+ gcv.font = bst->font->fid;
+
+ sprintf (buf1, "%.100s.foreground", name);
+ sprintf (buf2, "%.100s.Foreground", class);
+ bst->fg = gcv.foreground = get_pixel_resource (dpy, bst->xgwa.colormap,
+ buf1, buf2);
+ sprintf (buf1, "%.100s.background", name);
+ sprintf (buf2, "%.100s.Background", class);
+ bst->bg = gcv.background = get_pixel_resource (dpy, bst->xgwa.colormap,
+ buf1, buf2);
+ bst->gc = XCreateGC (dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, bst->gc, True);
+#endif
+
+# ifdef USE_IPHONE
+ /* Stupid iPhone X bezel.
+ #### This is the worst of all possible ways to do this!
+ */
+ if (bst->xgwa.width == 2436 || bst->xgwa.height == 2436) {
+ if (bst->xgwa.width > bst->xgwa.height)
+ bst->xoff = 96;
+ else
+ bst->yoff = 96;
+ }
+# endif
+
+ bst->left_margin = bst->right_margin = 10;
+ bst->x = bst->left_margin + bst->xoff;
+ bst->y = bst->font->ascent + bst->left_margin + bst->yoff;
+
+ XSetWindowBackground (dpy, window, gcv.background);
+ return bst;
+}
+
+
+static void
+free_bsod_state (struct bsod_state *bst)
+{
+ int i;
+
+ if (bst->free_cb)
+ bst->free_cb (bst);
+ if (bst->pixmap)
+ XFreePixmap(bst->dpy, bst->pixmap);
+ if (bst->mask)
+ XFreePixmap(bst->dpy, bst->mask);
+
+ XFreeFont (bst->dpy, bst->font);
+ XFreeGC (bst->dpy, bst->gc);
+
+ for (i = 0; i < bst->queue_size; i++)
+ switch (bst->queue[i].type) {
+ case LEFT: case LEFT_FULL:
+ case RIGHT: case RIGHT_FULL:
+ case CENTER: case CENTER_FULL:
+ free ((char *) bst->queue[i].arg1);
+ break;
+ default:
+ break;
+ }
+
+ free (bst->queue);
+ free (bst);
+}
+
+
+static Pixmap
+double_pixmap (Display *dpy, Visual *visual, int depth, Pixmap pixmap,
+ int pix_w, int pix_h)
+{
+ int x, y;
+ Pixmap p2 = XCreatePixmap(dpy, pixmap, pix_w*2, pix_h*2, depth);
+ XImage *i1 = XGetImage (dpy, pixmap, 0, 0, pix_w, pix_h, ~0L,
+ (depth == 1 ? XYPixmap : ZPixmap));
+ XImage *i2 = XCreateImage (dpy, visual, depth,
+ (depth == 1 ? XYPixmap : ZPixmap), 0, 0,
+ pix_w*2, pix_h*2, 8, 0);
+ XGCValues gcv;
+ GC gc = XCreateGC (dpy, p2, 0, &gcv);
+ i2->data = (char *) calloc(i2->height, i2->bytes_per_line);
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ {
+ unsigned long p = XGetPixel(i1, x, y);
+ XPutPixel(i2, x*2, y*2, p);
+ XPutPixel(i2, x*2+1, y*2, p);
+ XPutPixel(i2, x*2, y*2+1, p);
+ XPutPixel(i2, x*2+1, y*2+1, p);
+ }
+ free(i1->data); i1->data = 0;
+ XDestroyImage(i1);
+ XPutImage(dpy, p2, gc, i2, 0, 0, 0, 0, i2->width, i2->height);
+ XFreeGC (dpy, gc);
+ free(i2->data); i2->data = 0;
+ XDestroyImage(i2);
+ XFreePixmap(dpy, pixmap);
+ return p2;
+}
+
+
+/*****************************************************************************
+ *****************************************************************************/
+
+static struct bsod_state *
+windows_31 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "Windows\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ "A fatal exception 0E has occured at F0AD:42494C4C\n"
+ "the current application will be terminated.\n"
+ "\n"
+ "* Press any key to terminate the current application.\n"
+ "* Press CTRL+ALT+DELETE again to restart your computer.\n"
+ " You will lose any unsaved information in all applications.\n"
+ "\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press any key to continue");
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 9))
+ / 2);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+static struct bsod_state *
+vmware (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "vmware", "VMware");
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "vmware.foreground2",
+ "vmware.foreground");
+ BSOD_COLOR (bst, fg2, bg);
+ BSOD_TEXT (bst, LEFT,
+ "VMware ESX Server [Releasebuild-98103]\n");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT,
+ "PCPU 1 locked up. Failed to ack TLB invalidate.\n"
+ "frame=0x3a37d98 ip=0x625e94 cr2=0x0 cr3=0x40c66000 cr4=0x16c\n"
+ "es=0xffffffff ds=0xffffffff fs=0xffffffff gs=0xffffffff\n"
+ "eax=0xffffffff ebx=0xffffffff ecx=0xffffffff edx=0xffffffff\n"
+ "ebp=0x3a37ef4 esi=0xffffffff edi=0xffffffff err=-1 eflags=0xffffffff\n"
+ "*0:1037/helper1-4 1:1107/vmm0:Fagi 2:1121/vmware-vm 3:1122/mks:Franc\n"
+ "0x3a37ef4:[0x625e94]Panic+0x17 stack: 0x833ab4, 0x3a37f10, 0x3a37f48\n"
+ "0x3a37f04:[0x625e94]Panic+0x17 stack: 0x833ab4, 0x1, 0x14a03a0\n"
+ "0x3a37f48:[0x64bfa4]TLBDoInvalidate+0x38f stack: 0x3a37f54, 0x40, 0x2\n"
+ "0x3a37f70:[0x66da4d]XMapForceFlush+0x64 stack: 0x0, 0x4d3a, 0x0\n"
+ "0x3a37fac:[0x652b8b]helpFunc+0x2d2 stack: 0x1, 0x14a4580, 0x0\n"
+ "0x3a37ffc:[0x750902]CpuSched_StartWorld+0x109 stack: 0x0, 0x0, 0x0\n"
+ "0x3a38000:[0x0]blk_dev+0xfd76461f stack: 0x0, 0x0, 0x0\n"
+ "VMK uptime: 7:05:43:45.014 TSC: 1751259712918392\n"
+ "Starting coredump to disk\n");
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "using slot 1 of 1... ");
+ BSOD_CHAR_DELAY (bst, 300000);
+ BSOD_TEXT (bst, LEFT, "9876");
+ BSOD_CHAR_DELAY (bst, 3000000);
+ BSOD_TEXT (bst, LEFT, "66665");
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, "4321");
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT, "Disk dump successfull.\n"
+ "Waiting for Debugger (world 1037)\n"
+ "Debugger is listening on serial port ...\n");
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "Press Escape to enter local debugger\n");
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "Remote debugger activated. Local debugger no longer available.\n");
+
+/* BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);*/
+
+/* bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 9))
+ / 2);*/
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+
+static struct bsod_state *
+windows_nt (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "nt", "NT");
+
+ BSOD_TEXT (bst, LEFT,
+ "*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
+ "Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
+ "\n"
+ "Dll Base Date Stamp - Name Dll Base Date Stamp - Name\n"
+ "80100000 2be154c9 - ntoskrnl.exe 80400000 2bc153b0 - hal.dll\n"
+ "80258000 2bd49628 - ncrc710.sys 8025c000 2bd49688 - SCSIPORT.SYS \n"
+ "80267000 2bd49683 - scsidisk.sys 802a6000 2bd496b9 - Fastfat.sys\n"
+ "fa800000 2bd49666 - Floppy.SYS fa810000 2bd496db - Hpfs_Rec.SYS\n"
+ "fa820000 2bd49676 - Null.SYS fa830000 2bd4965a - Beep.SYS\n"
+ "fa840000 2bdaab00 - i8042prt.SYS fa850000 2bd5a020 - SERMOUSE.SYS\n"
+ "fa860000 2bd4966f - kbdclass.SYS fa870000 2bd49671 - MOUCLASS.SYS\n"
+ "fa880000 2bd9c0be - Videoprt.SYS fa890000 2bd49638 - NCC1701E.SYS\n"
+ "fa8a0000 2bd4a4ce - Vga.SYS fa8b0000 2bd496d0 - Msfs.SYS\n"
+ "fa8c0000 2bd496c3 - Npfs.SYS fa8e0000 2bd496c9 - Ntfs.SYS\n"
+ "fa940000 2bd496df - NDIS.SYS fa930000 2bd49707 - wdlan.sys\n"
+ "fa970000 2bd49712 - TDI.SYS fa950000 2bd5a7fb - nbf.sys\n"
+ "fa980000 2bd72406 - streams.sys fa9b0000 2bd4975f - ubnb.sys\n"
+ "fa9c0000 2bd5bfd7 - usbser.sys fa9d0000 2bd4971d - netbios.sys\n"
+ "fa9e0000 2bd49678 - Parallel.sys fa9f0000 2bd4969f - serial.SYS\n"
+ "faa00000 2bd49739 - mup.sys faa40000 2bd4971f - SMBTRSUP.SYS\n"
+ "faa10000 2bd6f2a2 - srv.sys faa50000 2bd4971a - afd.sys\n"
+ "faa60000 2bd6fd80 - rdr.sys faaa0000 2bd49735 - bowser.sys\n"
+ "\n"
+ "Address dword dump Dll Base - Name\n"
+ "801afc20 80106fc0 80106fc0 00000000 00000000 80149905 : "
+ "fa840000 - i8042prt.SYS\n"
+ "801afc24 80149905 80149905 ff8e6b8c 80129c2c ff8e6b94 : "
+ "8025c000 - SCSIPORT.SYS\n"
+ "801afc2c 80129c2c 80129c2c ff8e6b94 00000000 ff8e6b94 : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc34 801240f2 80124f02 ff8e6df4 ff8e6f60 ff8e6c58 : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc54 80124f16 80124f16 ff8e6f60 ff8e6c3c 8015ac7e : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc64 8015ac7e 8015ac7e ff8e6df4 ff8e6f60 ff8e6c58 : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc70 80129bda 80129bda 00000000 80088000 80106fc0 : "
+ "80100000 - ntoskrnl.exe\n"
+ "\n"
+ "Kernel Debugger Using: COM2 (Port 0x2f8, Baud Rate 19200)\n"
+ "Restart and set the recovery options in the system control panel\n"
+ "or the /CRASHDEBUG system start option. If this message reappears,\n"
+ "contact your system administrator or technical support group."
+ );
+
+ bst->line_delay = 750;
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_2k (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ BSOD_TEXT (bst, LEFT,
+ "*** STOP: 0x000000D1 (0xE1D38000,0x0000001C,0x00000000,0xF09D42DA)\n"
+ "DRIVER_IRQL_NOT_LESS_OR_EQUAL \n"
+ "\n"
+ "*** Address F09D42DA base at F09D4000, DateStamp 39f459ff - CRASHDD.SYS\n"
+ "\n"
+ "Beginning dump of physical memory\n");
+ BSOD_PAUSE (bst, 4000000);
+ BSOD_TEXT (bst, LEFT,
+ "Physical memory dump complete. Contact your system administrator or\n"
+ "technical support group.\n");
+
+ bst->left_margin = 40;
+ bst->y = (bst->font->ascent + bst->font->descent) * 10;
+ bst->line_delay = 750;
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_me (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ BSOD_TEXT (bst, LEFT,
+ "Windows protection error. You need to restart your computer.\n\n"
+ "System halted.");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+
+ bst->left_margin = 40;
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 3))
+ / 2);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_xp (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ BSOD_TEXT (bst, LEFT, /* From Wm. Rhodes <xscreensaver@27.org> */
+ "A problem has been detected and windows has been shut down to prevent "
+ "damage\n"
+ "to your computer.\n"
+ "\n"
+ "If this is the first time you've seen this Stop error screen,\n"
+ "restart your computer. If this screen appears again, follow\n"
+ "these steps:\n"
+ "\n"
+ "Check to be sure you have adequate disk space. If a driver is\n"
+ "identified in the Stop message, disable the driver or check\n"
+ "with the manufacturer for driver updates. Try changing video\n"
+ "adapters.\n"
+ "\n"
+ "Check with your hardware vendor for any BIOS updates. Disable\n"
+ "BIOS memory options such as caching or shadowing. If you need\n"
+ "to use Safe Mode to remove or disable components, restart your\n"
+ "computer, press F8 to select Advanced Startup Options, and then\n"
+ "select Safe Mode.\n"
+ "\n"
+ "Technical information:\n"
+ "\n"
+ "*** STOP: 0x0000007E (0xC0000005,0xF88FF190,0x0xF8975BA0,0xF89758A0)\n"
+ "\n"
+ "\n"
+ "*** EPUSBDSK.sys - Address F88FF190 base at FF88FE000, datestamp "
+ "3b9f3248\n"
+ "\n"
+ "Beginning dump of physical memory\n");
+ BSOD_PAUSE (bst, 4000000);
+ BSOD_TEXT (bst, LEFT,
+ "Physical memory dump complete.\n"
+ "Contact your system administrator or technical support group for "
+ "further\n"
+ "assistance.\n");
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_lh (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "windowslh", "WindowsLH");
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "windowslh.background2",
+ "WindowsLH.Background");
+
+ /* The "RSOD" that appeared with "Windows Longhorn 5048.050401-0536_x86fre"
+ As reported by http://joi.ito.com/RedScreen.jpg
+ */
+ BSOD_COLOR (bst, bg, bg2);
+ BSOD_TEXT (bst, CENTER_FULL, "Windows Boot Error\n");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, CENTER,
+ "\n"
+ "Windows Boot Manager has experienced a problem.\n"
+ "\n"
+ "\n"
+ " Status: 0xc000000f\n"
+ "\n"
+ "\n"
+ "\n"
+ " Info: An error occurred transferring exectuion." /* (sic) */
+ "\n"
+ "\n"
+ "\n"
+ "You can try to recover the system with the Microsoft Windows "
+ "System Recovery\n"
+ "Tools. (You might need to restart the system manually.)\n"
+ "\n"
+ "If the problem continues, please contact your system administrator "
+ "or computer\n"
+ "manufacturer.\n"
+ );
+ BSOD_MOVETO (bst, bst->left_margin + bst->xoff,
+ bst->xgwa.height - bst->yoff - bst->font->descent);
+ BSOD_COLOR (bst, bg, bg2);
+ BSOD_TEXT (bst, LEFT_FULL, " SPACE=Continue\n");
+
+ bst->y = bst->font->ascent;
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_10_update (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "win10", "Win10");
+ const char *fmt = "Working on updates %d%%";
+ char line1[255];
+ const char *line2 = "Don't turn off your PC. This will take a while.";
+ const char *line3 = "Your PC will restart several times.";
+ int line_height = bst->fontA->ascent + bst->fontA->descent;
+ int y1 = bst->xgwa.height / 2 - line_height * 4;
+ int y2 = bst->xgwa.height - bst->yoff - line_height * 3;
+ int pct;
+
+ /* TODO: win10_spinner.gif goes at (y - line_height * 2 - 64). */
+
+ for (pct = 0; pct < 98; pct++)
+ {
+ BSOD_MOVETO (bst, 0, y1);
+ sprintf (line1, fmt, pct);
+ BSOD_TEXT (bst, CENTER, line1);
+ BSOD_MOVETO (bst, 0, y1 + line_height);
+ BSOD_TEXT (bst, CENTER, line2);
+ BSOD_MOVETO (bst, 0, y2);
+ BSOD_TEXT (bst, CENTER, line3);
+ BSOD_PAUSE (bst, 200000 + (random() % 3000000) + (random() % 3000000));
+ }
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_10 (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "win10", "Win10");
+
+ int qr_width = 41;
+ int qr_height = 41;
+ static const unsigned char qr_bits[] = {
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
+ 0x03,0x9A,0x70,0xEE,0x80,0x01,0xFB,0x22,0xAA,0xA6,0xBE,0x01,
+ 0x8B,0x8E,0x74,0xE7,0xA2,0x01,0x8B,0xEE,0x42,0xC4,0xA2,0x01,
+ 0x8B,0x42,0x6E,0xED,0xA2,0x01,0xFB,0xDA,0x63,0xA6,0xBE,0x01,
+ 0x03,0xAA,0xAA,0xAA,0x80,0x01,0xFF,0x8B,0xD8,0x9D,0xFF,0x01,
+ 0x63,0x62,0xDA,0x1B,0x98,0x01,0x6F,0x67,0x98,0x9F,0xBC,0x01,
+ 0x4F,0xCC,0x55,0x81,0x83,0x01,0xB7,0x6D,0xFF,0x68,0xB2,0x01,
+ 0xC3,0x10,0x87,0x8B,0x96,0x01,0x6F,0xB1,0x91,0x58,0x94,0x01,
+ 0xE3,0x36,0x88,0x84,0xB8,0x01,0x83,0x9B,0xFE,0x59,0xD7,0x01,
+ 0x3B,0x74,0x98,0x5C,0xB4,0x01,0x37,0x75,0xDC,0x91,0xA6,0x01,
+ 0x77,0xDE,0x01,0x54,0xBA,0x01,0xBB,0x6D,0x8B,0xB9,0xB5,0x01,
+ 0x1F,0x06,0xBD,0x9B,0xB4,0x01,0xD3,0xBD,0x91,0x19,0x84,0x01,
+ 0x0B,0x20,0xD8,0x91,0xB4,0x01,0x33,0x95,0xBC,0x0A,0xD5,0x01,
+ 0xB3,0x60,0xDC,0xD9,0xB6,0x01,0xEF,0x77,0x18,0x09,0xA4,0x01,
+ 0xA3,0xC2,0x95,0x51,0xB2,0x01,0xDF,0x63,0xDB,0xBE,0xB3,0x01,
+ 0x03,0x08,0xC9,0x09,0xF0,0x01,0xFF,0xA3,0x19,0xBD,0xFB,0x01,
+ 0x03,0x2E,0x84,0xA5,0xAA,0x01,0xFB,0x9A,0xFC,0x9B,0xBB,0x01,
+ 0x8B,0x7E,0x9C,0x1D,0xB0,0x01,0x8B,0x6E,0x58,0xA1,0xDB,0x01,
+ 0x8B,0xDA,0xD5,0x65,0xA2,0x01,0xFB,0x72,0xFB,0xE9,0xF0,0x01,
+ 0x03,0x02,0x99,0x3B,0xB3,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0x01};
+ Pixmap pixmap;
+
+ const char *lines[] = {
+ ":(\n",
+ "\n",
+ "Your PC ran into a problem and needs to restart. We're just\n",
+ "collecting some error info, and then we'll restart for you.\n",
+ "\n",
+ "\n",
+ "\n",
+ "For more information about this issue and\n",
+ "possible fixes, visit\n",
+/* "https://www.jwz.org/xscreensaver\n",*/
+ "http://youtu.be/-RjmN9RZyr4\n",
+ "\n",
+ "If you call a support person, give them this info:\n",
+ "Stop code CRITICAL_PROCESS_DIED",
+ };
+ int i, y = 0, y0 = 0;
+ int line_height0 = bst->fontB->ascent;
+ int line_height1 = bst->fontA->ascent + bst->fontA->descent;
+ int line_height2 = bst->fontC->ascent + bst->fontC->descent;
+ int line_height = line_height0;
+ int top, left0, left;
+ int stop = 60 + (random() % 39);
+
+ if (!(random() % 7))
+ return windows_10_update (dpy, window);
+
+
+ line_height1 *= 1.3;
+ line_height2 *= 1.5;
+
+ top = ((bst->xgwa.height - bst->yoff
+ - (line_height0 * 1 +
+ line_height1 * 6 +
+ line_height2 * 6))
+ / 2);
+
+ {
+ int dir, ascent, descent;
+ XCharStruct ov;
+ const char *s = lines[2];
+ XTextExtents (bst->fontA, s, strlen(s),
+ &dir, &ascent, &descent, &ov);
+ left = left0 = (bst->xgwa.width - ov.width) / 2;
+ }
+
+ pixmap = XCreatePixmapFromBitmapData (dpy, window, (char *) qr_bits,
+ qr_width, qr_height,
+ bst->fg, bst->bg, bst->xgwa.depth);
+ {
+ int n = 2;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, qr_width, qr_height);
+ qr_width *= 2;
+ qr_height *= 2;
+ }
+ }
+ bst->pixmap = pixmap;
+
+ y = top;
+ line_height = line_height0;
+ BSOD_FONT (bst, 1);
+ for (i = 0; i < countof(lines); i++)
+ {
+ BSOD_MOVETO (bst, left, y);
+ BSOD_TEXT (bst, LEFT, lines[i]);
+ y += line_height;
+ if (i == 0)
+ {
+ BSOD_FONT (bst, 0);
+ line_height = line_height1;
+ }
+ else if (i == 4)
+ {
+ y0 = y;
+ y += line_height / 2;
+ BSOD_PIXMAP (bst, 0, 0, qr_width, qr_height, left, y + line_height1);
+ BSOD_FONT (bst, 2);
+ line_height = line_height2;
+ left += qr_width + line_height2 / 2;
+# ifdef HAVE_MOBILE
+ y -= 14;
+# endif
+ }
+ }
+
+ left = left0;
+ BSOD_FONT (bst, 0);
+ for (i = 0; i <= stop; i++)
+ {
+ char buf[100];
+ sprintf (buf, "%d%% complete", i);
+ BSOD_MOVETO (bst, left, y0);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 85000);
+ }
+ BSOD_PAUSE (bst, 3000000);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_other (Display *dpy, Window window)
+{
+ /* Lump all of the 2K-ish crashes together and select them randomly...
+ */
+ int which = (random() % 4);
+ switch (which) {
+ case 0: return windows_2k (dpy, window); break;
+ case 1: return windows_me (dpy, window); break;
+ case 2: return windows_xp (dpy, window); break;
+ case 3: return windows_lh (dpy, window); break;
+ default: abort(); break;
+ }
+}
+
+/* Windows and Apple2 ransomware.
+ */
+static struct bsod_state *apple2ransomware (Display *, Window);
+
+static struct bsod_state *
+windows_ransomware (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window,
+ "ransomware", "Ransomware");
+ char buf[1024];
+
+ int pix_w = 0, pix_h = 0;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ ransomware_png, sizeof(ransomware_png),
+ &pix_w, &pix_h, &mask);
+ int i, n = 0;
+
+ /* Don't start the countdown from the start, advance the deadline by 3 - 30
+ hours */
+ int advance_deadline = (random() % 97200) + 10800;
+
+ time_t now = time(NULL);
+ const time_t stage1_deadline = now + 259200 - advance_deadline; /* 3 days */
+ const time_t stage2_deadline = now + 604800 - advance_deadline; /* 7 days */
+ char stage1_deadline_str[25], stage2_deadline_str[25];
+ char countdown_str[16];
+ int countdown_d, countdown_h, countdown_m, countdown_s, countdown_r;
+ int line_height = bst->font->ascent + bst->font->descent;
+ int line_height1 = bst->fontA->ascent + bst->fontA->descent;
+
+ const char *currencies[] = {
+ "Blitcoin",
+ "Bitcorn",
+ "Buttcorn",
+ "clicks",
+ "clicks",
+ "Ass Pennies",
+ "Ass Pennies",
+ "Dollary-doos",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "gift certificates",
+ "Creepto-Currency",
+ "secret sauce",
+ "Tribbles",
+ };
+
+ const char *currency = currencies[random() % countof(currencies)];
+
+ const char *header_quips[] = {
+ "Oops, your screens have been encrypted!",
+ "Oops, your screens have been encrypted!",
+ "Oops, your screens have been encrypted!",
+ "Oops, your screens have been encrypted!",
+ "Oops, your screen have encrypted!",
+ "Oops, you're screens have been encrypted!",
+ "Oops, your screens have been encrupted!",
+ "Oops, your screens have been encrumpet!",
+ "Oops, your screens have been encrusted!",
+ "If you don't pay this ransom, then you are a theif!",
+ "Your screen was subject to the laws of mathomatics!",
+ "Oops, your screen was shaved by Occam's Razor!",
+ "Oops, your screen was perturbated by Langford's Basilisk!",
+ "Your screen is now stored as Snapchat messages!",
+ "Oops, your screen is now stored on Betamax!",
+ "Oops, your screen is now in the clown!",
+ "Oops, your screen has been deprecated!",
+ "Oops, you're screen was seized by the FBI!",
+ "All your screen was shared with your coworkers!",
+ "All your screen are belong to us.",
+ "Well actually, your screen isn't needed anymore.",
+ "u just got popped with some 0day shit!!",
+ "M'lady,",
+ };
+
+ const char *header_quip = header_quips[random() % countof(header_quips)];
+
+ /* You got this because... */
+ const char *excuse_quips[] = {
+ "all human actions are equivalent and all are on principle doomed "
+ "to failure",
+ "you hold a diverse portfolio of cryptocurrencies",
+ "you need to get in on ransomware futures at the ground floor",
+ "your flight was overbooked",
+ "you did not apply the security update for bugs NSA keys secret from "
+ "Microsoft in your Windows(R) operating system",
+ "you are bad and you should feel bad",
+ "you used the wifi at defcon",
+ "you lack official Clown Strike[TM] threaty threat technology",
+ };
+
+ const char *excuse_quip = excuse_quips[random() % countof(excuse_quips)];
+
+ /* WELL ACTUALLY, screensavers aren't really nescessary anymore because... */
+ const char *screensaver_quips[] = {
+ "I read it on hacker news",
+ "that's official Debian policy now",
+ "that is the official policy of United Airlines",
+ "they cause global warming",
+ "they lack an eternal struggle",
+ "they lack a vapid dichotomy",
+ "those electrons could be used for gold farming instead",
+ "you can make more money in art exhibitions",
+ };
+
+ const char *screensaver_quip =
+ screensaver_quips[random() % countof(screensaver_quips)];
+
+ const char *lines[] = {
+ "*What Happened To My Computer?\n",
+ "Your important pixels are paintcrypted. All of your documents, photos, ",
+ "videos, databases, icons, dick pics are not accessible because they ",
+ "have been bitblted. Maybe you are looking for a way to get them back, ",
+ "but don't waste your time. Nobody can recover your pixels without our ",
+ "pointer motion clicker services.\n",
+ "\n",
+ "*Can I Recover My Important Dick Pix?\n",
+ "Yes. We guarantee that you can recover them safely and easily. But you ",
+ "not have much time.\n",
+ "You can expose some files for free. Try it now by pressing <The Any ",
+ "Key>.\n",
+ "But if you want to unsave all your screens, then you need to pay. ",
+ "You have only 3 days to click. After that the clicks will double. ",
+ "After 7 days your pixels will be gone forever.\n",
+ "We will have free events for cheapskates who can't pay in 6 months, ",
+ "long after all the pixels are xored.\n",
+ "\n",
+ "*How do I pay?\n",
+ "Payment is accepted in ", "[C]",
+ " only. For more information, press <About ", "[C]", ">.",
+ " Please check the current price of ", "[C]", " and buy some ", "[C]",
+ ". For more information, press <How to buy ", "[C]", ">.\n",
+ "And send the correct amount to the address specified below. After your ",
+ "payment, press <Check Payment>. Best time to check: 4-6am, Mon-Fri.\n",
+ "\n",
+ "*Why Did I Get This?\n",
+ "You got this because ", "[Q]",
+ ". Also you didn't click hard enough and now Tinkerbelle is dead.\n",
+ "\n",
+ "*But Aren't Screensavers Are Necessary?\n",
+ "WELL ACTUALLY, screensavers aren't really nescessary anymore because ",
+ "[S]", ".\n",
+ "\n",
+ "Please file complaints to @POTUS on Twitter.\n",
+ "\n"
+ "\n"
+ "\n"
+ "\n",
+ "*GREETZ TO CRASH OVERRIDE AND ALSO JOEY\n",
+ };
+
+ /* Positions of UI elements. Layout:
+
+ +---------+-+---------------------------------------+
+ | LOGO | | HEADER |
+ | | |---------------------------------------|
+ | | | NOTE TEXT |
+ | DEAD | | |
+ | LINE | | |
+ | TIMERS | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ +---------+ | |
+ | LINKS | +---------------------------------------+
+ | LINKS | | FOOTER |
+ +---------+-+---------------------------------------+
+
+ The right side of the UI maximises to available width.
+ The note text maximises to available height.
+ The logo, header and timers are anchored to the top left of the window.
+ The links and footer are anchored to the bottom left of the window.
+ The entire window is a fixed 4:3 scale, with a minimum margin around it.
+ */
+
+ /* main window text */
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ /* ransom note */
+ unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.foreground2",
+ "Ransomware.Foreground");
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.background2",
+ "Ransomware.Background");
+ /* buttons */
+ unsigned long fg3 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.foreground3",
+ "Ransomware.Foreground");
+ unsigned long bg3 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.background3",
+ "Ransomware.Background");
+ /* links */
+ unsigned long link = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.link",
+ "Ransomware.Foreground");
+ /* headers */
+ unsigned long theader = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.timerheader",
+ "Ransomware.Foreground");
+ int left_column_width;
+ int right_column_width;
+ int right_column_height;
+ int stage1_countdown_y, stage2_countdown_y;
+ int margin;
+ int top_height, bottom_height;
+ int x, y;
+
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1,
+ mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+
+ margin = line_height;
+ left_column_width = MAX (pix_w, line_height1 * 8);
+ right_column_width = MIN (line_height * 40,
+ MAX (line_height * 8,
+ bst->xgwa.width - left_column_width
+ - margin*2));
+ top_height = line_height * 2.5;
+ bottom_height = line_height * 6;
+ right_column_height = MIN (line_height * 36,
+ bst->xgwa.height - bottom_height - top_height
+ - line_height);
+
+ if ((bst->xgwa.width / 4) * 3 > bst->xgwa.height)
+ /* Wide screen: keep the big text box at 4:3, centered. */
+ right_column_height = MIN (right_column_height,
+ right_column_width * 4 / 3);
+ else if (right_column_width < line_height * 30)
+ /* Tall but narrow screen: make the text box be full height. */
+ right_column_height = (bst->xgwa.height - bottom_height - top_height
+ - line_height);
+
+ x = (bst->xgwa.width - left_column_width - right_column_width - margin) / 2;
+ y = (bst->xgwa.height - right_column_height - bottom_height) / 2;
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ if (!(random() % 8))
+ return apple2ransomware (dpy, window);
+
+ /* Draw the main red window */
+ BSOD_INVERT (bst);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+
+ if (pixmap) {
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h,
+ x + (left_column_width - pix_w) / 2,
+ y);
+ }
+
+ /* Setup deadlines */
+ strftime (stage1_deadline_str, sizeof(stage1_deadline_str),
+ "%m/%d/%Y %H:%M:%S", localtime(&stage1_deadline));
+ strftime (stage2_deadline_str, sizeof(stage1_deadline_str),
+ "%m/%d/%Y %H:%M:%S", localtime(&stage2_deadline));
+
+ BSOD_INVERT (bst);
+ /* Draw header pane */
+ BSOD_FONT (bst, 0);
+
+ BSOD_MARGINS (bst,
+ x + left_column_width + margin,
+ bst->xgwa.width -
+ (x + left_column_width + margin + right_column_width));
+ BSOD_MOVETO (bst, x + left_column_width + margin,
+ y + bst->fontA->ascent);
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_WORD_WRAP (bst);
+ BSOD_TEXT (bst, CENTER, header_quip);
+ BSOD_TRUNCATE (bst);
+
+ /* Draw left-side timers */
+ BSOD_MARGINS (bst, x, bst->xgwa.width - (x + left_column_width));
+ BSOD_MOVETO (bst, x, y + pix_h + line_height);
+ BSOD_FONT (bst, 1);
+
+ BSOD_COLOR (bst, theader, bg);
+ BSOD_TEXT (bst, CENTER, "Payment will be raised on\n");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, CENTER, stage1_deadline_str);
+
+ stage1_countdown_y = y + pix_h + line_height + line_height1 * 3;
+ BSOD_MOVETO (bst, x, stage1_countdown_y - line_height);
+ BSOD_TEXT (bst, CENTER, "Time Left");
+
+ BSOD_COLOR (bst, theader, bg);
+ BSOD_WORD_WRAP (bst);
+ BSOD_TEXT (bst, CENTER, "\n\n\n\nYour pixels will be lost on\n");
+ BSOD_TRUNCATE (bst);
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, CENTER, stage2_deadline_str);
+
+ stage2_countdown_y = stage1_countdown_y + line_height1 * 5;
+ BSOD_MOVETO (bst, x, stage2_countdown_y - line_height);
+ BSOD_TEXT (bst, CENTER, "Time Left");
+
+ BSOD_FONT (bst, 1);
+
+ /* Draw links, but skip on small screens */
+ if (right_column_height > 425) {
+ BSOD_MOVETO (bst, x,
+ y + right_column_height + top_height + bottom_height
+ - line_height1 * 5);
+ BSOD_COLOR (bst, link, bg);
+ BSOD_TEXT (bst, LEFT, "\n");
+ BSOD_TEXT (bst, LEFT, "About ");
+ BSOD_TEXT (bst, LEFT, currency);
+ BSOD_TEXT (bst, LEFT, "\n\n"
+ "How to buy ");
+ BSOD_TEXT (bst, LEFT, currency);
+ BSOD_TEXT (bst, LEFT, "\n\n"
+ "Contact us\n");
+ }
+
+ /* Ransom note text area */
+ BSOD_COLOR (bst, bg2, fg2);
+ BSOD_RECT (bst, True,
+ x + left_column_width + margin,
+ y + top_height,
+ right_column_width,
+ right_column_height);
+ BSOD_MOVETO (bst,
+ x + left_column_width + margin + line_height / 2,
+ y + top_height + line_height + line_height / 2);
+ BSOD_MARGINS (bst,
+ x + left_column_width + margin + line_height / 2,
+ bst->xgwa.width -
+ (x + left_column_width + margin + right_column_width));
+ BSOD_VERT_MARGINS (bst,
+ y + top_height + line_height / 2,
+ bottom_height - line_height);
+ BSOD_INVERT (bst);
+
+ /* Write out the ransom note itself */
+ BSOD_CROP (bst, True);
+ BSOD_WORD_WRAP (bst);
+ for (i = 0; i < countof(lines); i++)
+ {
+ const char *s = lines[i];
+ if (!strcmp(s, "[C]")) s = currency;
+ else if (!strcmp(s, "[Q]")) s = excuse_quip;
+ else if (!strcmp(s, "[S]")) s = screensaver_quip;
+
+ if (*s == '*')
+ {
+ s++;
+ BSOD_FONT (bst, 2);
+ }
+ else
+ BSOD_FONT (bst, 0);
+
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ BSOD_TRUNCATE (bst);
+ BSOD_CROP (bst, False);
+ BSOD_FONT (bst, 0);
+
+ /* Draw over any overflowing ransom text. */
+ BSOD_COLOR (bst, bg, fg);
+ BSOD_RECT (bst, True,
+ x + left_column_width + margin,
+ y + top_height + right_column_height,
+ bst->xgwa.width, bst->xgwa.height);
+ BSOD_RECT (bst, True,
+ x + left_column_width + margin + right_column_width,
+ y + top_height,
+ bst->xgwa.width, bst->xgwa.height);
+
+ /* Draw the footer */
+ BSOD_COLOR (bst, theader, bg);
+ BSOD_MOVETO (bst,
+ x + left_column_width + margin,
+ y + top_height + right_column_height + line_height * 2);
+
+ sprintf(buf, "Send $%.2f of %s to this address:\n", 101+frand(888), currency);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_COLOR (bst, fg2, bg2);
+
+ /* address, has some extra slashes in there because it's a fake address */
+ for (i = 0; i < 40; i++) {
+ const char *s =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123459789";
+ buf[i] = s[random() % strlen(s)];
+ }
+ strncpy (buf, " //", 3);
+ buf[10] = '/';
+ buf[17] = '/';
+ buf[24] = '/';
+ strcpy (buf+33, " ");
+ BSOD_TEXT (bst, LEFT, buf);
+
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT, " ");
+ BSOD_COLOR (bst, fg3, bg3);
+ BSOD_TEXT (bst, LEFT, " Copy ");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT, "\n\n");
+
+ BSOD_COLOR (bst, fg3, bg3);
+ BSOD_TEXT (bst, LEFT, " Demogrify Screen ");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT, " ");
+ BSOD_COLOR (bst, fg3, bg3);
+ BSOD_TEXT (bst, LEFT, " Check Payment ");
+
+
+ /* Draw countdown timers */
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_FONT (bst, 0);
+ do {
+ /* First timer */
+ BSOD_MOVETO (bst, x, stage1_countdown_y);
+ BSOD_MARGINS (bst, x, bst->xgwa.width - (x + left_column_width));
+
+ countdown_r = stage1_deadline - now;
+ countdown_s = countdown_r % 60;
+ countdown_m = (countdown_r / 60) % 60;
+ countdown_h = (countdown_r / 3600) % 24;
+ countdown_d = (countdown_r / 86400);
+
+ sprintf (countdown_str, "%02d:%02d:%02d:%02d\n",
+ countdown_d, countdown_h, countdown_m, countdown_s);
+
+ BSOD_TEXT (bst, CENTER, countdown_str);
+
+ /* Second timer */
+ BSOD_MOVETO (bst, x, stage2_countdown_y);
+
+ countdown_r = stage2_deadline - now;
+ countdown_s = countdown_r % 60;
+ countdown_m = (countdown_r / 60) % 60;
+ countdown_h = (countdown_r / 3600) % 24;
+ countdown_d = (countdown_r / 86400);
+
+ sprintf (countdown_str, "%02d:%02d:%02d:%02d\n",
+ countdown_d, countdown_h, countdown_m, countdown_s);
+
+ BSOD_TEXT (bst, CENTER, countdown_str);
+
+ BSOD_PAUSE (bst, 1000000);
+ now++;
+
+ /* While the "correct" thing to do is create enough of a script to fill the
+ * stage2_deadline, this would be 7 days of "frames", which is quite a bit
+ * of memory. Instead, only fill the buffer with 1 hour of frames, which is
+ * enough to make the point before xscreensaver cycles us.
+ */
+ } while (stage1_deadline - now > 3600);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* As seen in Portal 2. By jwz.
+ */
+static struct bsod_state *
+glados (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "glaDOS", "GlaDOS");
+ const char * panicstr[] = {
+ "\n",
+ "MOLTEN CORE WARNING\n",
+ "\n",
+ "An operator error exception has occurred at FISSREAC0020093:09\n",
+ "FISSREAC0020077:14 FISSREAC0020023:17 FISSREAC0020088:22\n",
+ "neutron multiplication rate at spikevalue 99999999\n",
+ "\n",
+ "* Press any key to vent radiological emissions into atmosphere.\n",
+ "* Consult reactor core manual for instructions on proper reactor core\n",
+ "maintenance and repair.\n",
+ "\n",
+ "Press any key to continue\n",
+ };
+
+ int i;
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * countof(panicstr)))
+ / 2);
+
+ BSOD_MOVETO (bst, 0, bst->y);
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "OPERATOR ERROR\n");
+ BSOD_INVERT (bst);
+ for (i = 0; i < countof(panicstr); i++)
+ BSOD_TEXT (bst, CENTER, panicstr[i]);
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_INVERT (bst);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_INVERT (bst);
+ BSOD_PAUSE (bst, 250000);
+ BSOD_RESET (bst);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+
+/* SCO OpenServer 5 panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
+ */
+static struct bsod_state *
+sco (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "sco", "SCO");
+
+ BSOD_TEXT (bst, LEFT,
+ "Unexpected trap in kernel mode:\n"
+ "\n"
+ "cr0 0x80010013 cr2 0x00000014 cr3 0x00000000 tlb 0x00000000\n"
+ "ss 0x00071054 uesp 0x00012055 efl 0x00080888 ipl 0x00000005\n"
+ "cs 0x00092585 eip 0x00544a4b err 0x004d4a47 trap 0x0000000E\n"
+ "eax 0x0045474b ecx 0x0042544b edx 0x57687920 ebx 0x61726520\n"
+ "esp 0x796f7520 ebp 0x72656164 esi 0x696e6720 edi 0x74686973\n"
+ "ds 0x3f000000 es 0x43494c48 fs 0x43525343 gs 0x4f4d4b53\n"
+ "\n"
+ "PANIC: k_trap - kernel mode trap type 0x0000000E\n"
+ "Trying to dump 5023 pages to dumpdev hd (1/41), 63 pages per '.'\n"
+ );
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT,
+ "................................................................."
+ "..............\n"
+ );
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT,
+ "5023 pages dumped\n"
+ "\n"
+ "\n"
+ );
+ BSOD_PAUSE (bst, 2000000);
+ BSOD_TEXT (bst, LEFT,
+ "** Safe to Power Off **\n"
+ " - or -\n"
+ "** Press Any Key to Reboot **\n"
+ );
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 18)));
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* Linux (sparc) panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
+ */
+static struct bsod_state *
+sparc_linux (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window,
+ "sparclinux", "SparcLinux");
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->yoff
+ - bst->font->ascent - bst->font->descent;
+
+ BSOD_TEXT (bst, LEFT,
+ "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
+ "Unable to handle kernel paging request at virtual address f0d4a000\n"
+ "tsk->mm->context = 00000014\n"
+ "tsk->mm->pgd = f26b0000\n"
+ " \\|/ ____ \\|/\n"
+ " \"@'/ ,. \\`@\"\n"
+ " /_| \\__/ |_\\\n"
+ " \\__U_/\n"
+ "gawk(22827): Oops\n"
+ "PSR: 044010c1 PC: f001c2cc NPC: f001c2d0 Y: 00000000\n"
+ "g0: 00001000 g1: fffffff7 g2: 04401086 g3: 0001eaa0\n"
+ "g4: 000207dc g5: f0130400 g6: f0d4a018 g7: 00000001\n"
+ "o0: 00000000 o1: f0d4a298 o2: 00000040 o3: f1380718\n"
+ "o4: f1380718 o5: 00000200 sp: f1b13f08 ret_pc: f001c2a0\n"
+ "l0: efffd880 l1: 00000001 l2: f0d4a230 l3: 00000014\n"
+ "l4: 0000ffff l5: f0131550 l6: f012c000 l7: f0130400\n"
+ "i0: f1b13fb0 i1: 00000001 i2: 00000002 i3: 0007c000\n"
+ "i4: f01457c0 i5: 00000004 i6: f1b13f70 i7: f0015360\n"
+ "Instruction DUMP:\n"
+ );
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* BSD Panic by greywolf@starwolf.com - modeled after the Linux panic above.
+ By Grey Wolf <greywolf@siteROCK.com>
+ */
+static struct bsod_state *
+bsd (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "bsd", "BSD");
+
+ const char * const panicstr[] = {
+ "panic: ifree: freeing free inode\n",
+ "panic: blkfree: freeing free block\n",
+ "panic: improbability coefficient below zero\n",
+ "panic: cgsixmmap\n",
+ "panic: crazy interrupts\n",
+ "panic: nmi\n",
+ "panic: attempted windows install\n",
+ "panic: don't\n",
+ "panic: free inode isn't\n",
+ "panic: cpu_fork: curproc\n",
+ "panic: malloc: out of space in kmem_map\n",
+ "panic: vogon starship detected\n",
+ "panic: teleport chamber: out of order\n",
+ "panic: Brain fried - core dumped\n"
+ };
+ int i, n, b;
+ char syncing[80], bbuf[5];
+
+ for (i = 0; i < sizeof(syncing); i++)
+ syncing[i] = 0;
+
+ i = (random() % (sizeof(panicstr) / sizeof(*panicstr)));
+ BSOD_TEXT (bst, LEFT, panicstr[i]);
+ BSOD_TEXT (bst, LEFT, "Syncing disks: ");
+
+ b = (random() % 40);
+ for (n = 0; (n < 20) && (b > 0); n++)
+ {
+ if (i)
+ {
+ i = (random() & 0x7);
+ b -= (random() & 0xff) % 20;
+ if (b < 0)
+ b = 0;
+ }
+ sprintf (bbuf, "%d ", b);
+ BSOD_TEXT (bst, LEFT, bbuf);
+ BSOD_PAUSE (bst, 1000000);
+ }
+
+ BSOD_TEXT (bst, LEFT, "\n");
+ BSOD_TEXT (bst, LEFT, (b ? "damn!" : "sunk!"));
+ BSOD_TEXT (bst, LEFT, "\nRebooting\n");
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 4)));
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+amiga (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "amiga", "Amiga");
+
+ const char *guru1 ="Software failure. Press left mouse button to continue.";
+ const char *guru2 ="Guru Meditation #00000003.00C01570";
+ Pixmap pixmap = 0;
+ Pixmap mask = 0;
+ int pix_w = 0, pix_h = 0;
+ int height;
+ int lw = bst->font->ascent + bst->font->descent;
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "amiga.background2",
+ "Amiga.Background");
+
+ bst->yoff = 0;
+ bst->top_margin = bst->bottom_margin = 0;
+
+ pixmap = image_data_to_pixmap (dpy, window,
+ amiga_png, sizeof(amiga_png),
+ &pix_w, &pix_h, &mask);
+
+ if (pixmap)
+ {
+ int i, n = 0;
+ if (MIN (bst->xgwa.width, bst->xgwa.height) > 600) n++;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+
+ XSetLineAttributes (dpy, bst->gc, lw, LineSolid, CapButt, JoinMiter);
+
+ height = lw * 5;
+
+ bst->char_delay = bst->line_delay = 0;
+
+ BSOD_PAUSE (bst, 2000000);
+ BSOD_COPY (bst, 0, 0, bst->xgwa.width, bst->xgwa.height - height, 0, height);
+
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, height); /* red */
+ BSOD_COLOR (bst, bg, fg);
+ BSOD_RECT (bst, True, lw/2, lw/2, bst->xgwa.width-lw, height-lw); /* black */
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_MOVETO (bst, 0, lw*2);
+ BSOD_TEXT (bst, CENTER, guru1);
+ BSOD_MOVETO (bst, 0, lw*3.5);
+ BSOD_TEXT (bst, CENTER, guru2);
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_COLOR (bst, bg, fg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, height); /* black */
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_MOVETO (bst, 0, lw*2);
+ BSOD_TEXT (bst, CENTER, guru1);
+ BSOD_MOVETO (bst, 0, lw*3.5);
+ BSOD_TEXT (bst, CENTER, guru2);
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_LOOP (bst, -17);
+
+ XSetWindowBackground (dpy, window, bg2);
+ XClearWindow (dpy, window);
+ XSetWindowBackground (dpy, window, bst->bg);
+
+ if (pixmap)
+ {
+ int x = (bst->xgwa.width - pix_w) / 2;
+ int y = ((bst->xgwa.height - pix_h) / 2);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, bst->window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+ }
+
+ bst->y += lw;
+
+ return bst;
+}
+
+
+
+/* Atari ST, by Marcus Herbert <rhoenie@nobiscum.de>
+ Marcus had this to say:
+
+ Though I still have my Atari somewhere, I hardly remember
+ the meaning of the bombs. I think 9 bombs was "bus error" or
+ something like that. And you often had a few bombs displayed
+ quickly and then the next few ones coming up step by step.
+ Perhaps somebody else can tell you more about it.. its just
+ a quick hack :-}
+ */
+static struct bsod_state *
+atari (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "atari", "Atari");
+
+ int pix_w, pix_h;
+ int offset;
+ int i, x, y;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ atari_png, sizeof(atari_png),
+ &pix_w, &pix_h, &mask);
+
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+
+ offset = pix_w;
+ x = 0;
+ y = bst->xgwa.height/2;
+ if (y < 0) y = 0;
+
+ for (i = 1; i< 7; i++)
+ BSOD_COPY (bst, x, y, pix_w, pix_h, (x + (i*offset)), y);
+
+ for (; i< 10; i++)
+ {
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_COPY (bst, x, y, pix_w, pix_h, (x + (i*offset)), y);
+ }
+
+ XClearWindow (dpy, window);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+
+ return bst;
+}
+
+
+static struct bsod_state *
+mac (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "mac", "Mac");
+
+ int pix_w, pix_h;
+ int i;
+
+ const char *string = ("0 0 0 0 0 0 0 F\n"
+ "0 0 0 0 0 0 0 3");
+
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ mac_png, sizeof(mac_png),
+ &pix_w, &pix_h, &mask);
+ int offset = pix_h * 4;
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ for (i = 0; i < 2; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2; pix_h *= 2;
+ }
+
+ bst->x = (bst->xgwa.width - pix_w) / 2;
+ bst->y = (((bst->xgwa.height + offset) / 2) -
+ pix_h -
+ (bst->font->ascent + bst->font->descent) * 2);
+ if (bst->y < 0) bst->y = 0;
+
+ XClearWindow (dpy, window);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, bst->x, bst->y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, bst->x, bst->y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+
+ bst->y += offset + bst->font->ascent + bst->font->descent;
+ BSOD_TEXT (bst, CENTER, string);
+
+ return bst;
+}
+
+
+static struct bsod_state *
+macsbug (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macsbug", "MacsBug");
+
+ __extension__
+ const char *left = (" SP \n"
+ " 04EB0A58 \n"
+ "58 00010000\n"
+ "5C 00010000\n"
+ " ........\n"
+ "60 00000000\n"
+ "64 000004EB\n"
+ " ........\n"
+ "68 0000027F\n"
+ "6C 2D980035\n"
+ " ....-..5\n"
+ "70 00000054\n"
+ "74 0173003E\n"
+ " ...T.s.>\n"
+ "78 04EBDA76\n"
+ "7C 04EBDA8E\n"
+ " .S.L.a.U\n"
+ "80 00000000\n"
+ "84 000004EB\n"
+ " ........\n"
+ "88 00010000\n"
+ "8C 00010000\n"
+ " ...{3..S\n"
+ "\n"
+ "\n"
+ " CurApName \n"
+ " Finder \n"
+ "\n"
+ " 32-bit VM \n"
+ "SR Smxnzvc0\n"
+ "D0 04EC0062\n"
+ "D1 00000053\n"
+ "D2 FFFF0100\n"
+ "D3 00010000\n"
+ "D4 00010000\n"
+ "D5 04EBDA76\n"
+ "D6 04EBDA8E\n"
+ "D7 00000001\n"
+ "\n"
+ "A0 04EBDA76\n"
+ "A1 04EBDA8E\n"
+ "A2 A0A00060\n"
+ "A3 027F2D98\n"
+ "A4 027F2E58\n"
+ "A5 04EC04F0\n"
+ "A6 04EB0A86\n"
+ "A7 04EB0A58");
+ const char *bottom = (" _A09D\n"
+ " +00884 40843714 #$0700,SR "
+ " ; A973 | A973\n"
+ " +00886 40843765 *+$0400 "
+ " | 4A1F\n"
+ " +00888 40843718 $0004(A7),([0,A7[)"
+ " ; 04E8D0AE | 66B8");
+ __extension__
+ const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
+ "BowelsOfTheMemoryMgr+04F9C\n"
+ " Calling chain using A6/R1 links\n"
+ " Back chain ISA Caller\n"
+ " 00000000 PPC 28C5353C __start+00054\n"
+ " 24DB03C0 PPC 28B9258C main+0039C\n"
+ " 24DB0350 PPC 28B9210C MainEvent+00494\n"
+ " 24DB02B0 PPC 28B91B40 HandleEvent+00278\n"
+ " 24DB0250 PPC 28B83DAC DoAppleEvent+00020\n"
+ " 24DB0210 PPC FFD3E5D0 "
+ "AEProcessAppleEvent+00020\n"
+ " 24DB0132 68K 00589468\n"
+ " 24DAFF8C 68K 00589582\n"
+ " 24DAFF26 68K 00588F70\n"
+ " 24DAFEB3 PPC 00307098 "
+ "EmToNatEndMoveParams+00014\n"
+ " 24DAFE40 PPC 28B9D0B0 DoScript+001C4\n"
+ " 24DAFDD0 PPC 28B9C35C RunScript+00390\n"
+ " 24DAFC60 PPC 28BA36D4 run_perl+000E0\n"
+ " 24DAFC10 PPC 28BC2904 perl_run+002CC\n"
+ " 24DAFA80 PPC 28C18490 Perl_runops+00068\n"
+ " 24DAFA30 PPC 28BE6CC0 Perl_pp_backtick+000FC\n"
+ " 24DAF9D0 PPC 28BA48B8 Perl_my_popen+00158\n"
+ " 24DAF980 PPC 28C5395C sfclose+00378\n"
+ " 24DAF930 PPC 28BA568C free+0000C\n"
+ " 24DAF8F0 PPC 28BA6254 pool_free+001D0\n"
+ " 24DAF8A0 PPC FFD48F14 DisposePtr+00028\n"
+ " 24DAF7C9 PPC 00307098 "
+ "EmToNatEndMoveParams+00014\n"
+ " 24DAF780 PPC 003AA180 __DisposePtr+00010");
+
+ const char *s;
+ int body_lines = 1;
+
+ int char_width, line_height;
+ int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
+ int xoff, yoff;
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long bc = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macsbug.borderColor",
+ "MacsBug.BorderColor");
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ for (s = body; *s; s++) if (*s == '\n') body_lines++;
+
+ char_width = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ line_height = bst->font->ascent + bst->font->descent;
+
+ col_right = char_width * 12; /* number of columns in `left' */
+ page_bottom = line_height * 47; /* number of lines in `left' */
+
+ if (page_bottom > bst->xgwa.height - bst->yoff)
+ page_bottom = bst->xgwa.height - bst->yoff;
+
+ row_bottom = page_bottom - line_height;
+ row_top = row_bottom - (line_height * 4);
+ page_right = col_right + (char_width * 88);
+ body_top = row_top - (line_height * body_lines);
+
+ page_bottom += 2;
+ row_bottom += 2;
+ body_top -= 4;
+
+ if (body_top > 4)
+ body_top = 4;
+
+ xoff = (bst->xgwa.width - page_right) / 2;
+ yoff = (bst->xgwa.height - page_bottom) / 2;
+
+ if (xoff < 0) xoff = 0;
+ if (yoff < 0) yoff = 0;
+
+ BSOD_MARGINS (bst, xoff, yoff);
+
+ BSOD_COLOR (bst, bc, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR (bst, bg, bg);
+ BSOD_RECT (bst, True, xoff-2, yoff, page_right+4, page_bottom);
+ BSOD_COLOR (bst, fg, bg);
+
+ BSOD_MOVETO (bst, xoff, yoff + line_height);
+ BSOD_TEXT (bst, LEFT, left);
+ BSOD_MOVETO (bst, xoff+col_right, yoff + row_top + line_height);
+ BSOD_TEXT (bst, LEFT, bottom);
+
+ BSOD_RECT (bst, True, xoff + col_right, yoff, 2, page_bottom);
+ BSOD_RECT (bst, True, xoff + col_right, yoff + row_top,
+ page_right - col_right, 1);
+ BSOD_RECT (bst, True, xoff + col_right, yoff + row_bottom,
+ page_right - col_right, 1);
+ BSOD_RECT (bst, False, xoff-2, yoff, page_right+4, page_bottom);
+
+ BSOD_LINE_DELAY (bst, 500);
+ BSOD_MOVETO (bst,
+ xoff + col_right + char_width,
+ yoff + body_top + line_height);
+ BSOD_MARGINS (bst, xoff + col_right + char_width, yoff);
+ BSOD_TEXT (bst, LEFT, body);
+
+ BSOD_RECT (bst, False, xoff-2, yoff, page_right+4, page_bottom); /* again */
+
+ BSOD_RECT (bst, False,
+ xoff + col_right + (char_width/2)+2,
+ yoff + row_bottom + 2,
+ 0,
+ page_bottom - row_bottom - 4);
+
+ BSOD_PAUSE (bst, 666666);
+ BSOD_INVERT (bst);
+ BSOD_LOOP (bst, -3);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+mac1 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "mac1", "Mac1");
+
+ int pix_w, pix_h;
+ int x, y;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ macbomb_png, sizeof(macbomb_png),
+ &pix_w, &pix_h, &mask);
+
+ if (pixmap &&
+ pix_w < bst->xgwa.width / 2 &&
+ pix_h < bst->xgwa.height / 2)
+ {
+ int i, n = 1;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual,
+ bst->xgwa.depth, pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height - pix_h) / 2;
+ if (y < 0) y = 0;
+
+ XClearWindow (dpy, window);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, mask);
+
+ return bst;
+}
+
+
+/* This is what kernel panics looked like on MacOS X 10.0 through 10.1.5.
+ In later releases, it's a graphic of a power button with text in
+ English, French, German, and Japanese overlayed transparently.
+ */
+static struct bsod_state *
+macx_10_0 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macx", "MacX");
+
+ XClearWindow (dpy, window);
+ XSetForeground (dpy, bst->gc,
+ get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.textForeground",
+ "MacX.TextForeground"));
+ XSetBackground (dpy, bst->gc,
+ get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.textBackground",
+ "MacX.TextBackground"));
+
+ {
+ Pixmap pixmap = 0;
+ Pixmap mask = 0;
+ int x, y, pix_w, pix_h;
+ pixmap = image_data_to_pixmap (dpy, window,
+ hmac_png, sizeof(hmac_png),
+ &pix_w, &pix_h, &mask);
+
+# ifdef HAVE_MOBILE
+ if (pixmap)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual,
+ bst->xgwa.depth, pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual,
+ 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+# endif
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height - pix_h) / 2;
+ if (y < 0) y = 0;
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+ }
+
+ bst->left_margin = 0;
+ bst->right_margin = 0;
+ bst->y = bst->font->ascent;
+ bst->macx_eol_kludge = True;
+ bst->wrap_p = True;
+
+ BSOD_PAUSE (bst, 3000000);
+ BSOD_TEXT (bst, LEFT,
+ "panic(cpu 0): Unable to find driver for this platform: "
+ "\"PowerMac 3,5\".\n"
+ "\n"
+ "backtrace: 0x0008c2f4 0x0002a7a0 0x001f0204 0x001d4e4c 0x001d4c5c "
+ "0x001a56cc 0x01d5dbc 0x001c621c 0x00037430 0x00037364\n"
+ "\n"
+ "\n"
+ "\n"
+ "No debugger configured - dumping debug information\n"
+ "\n"
+ "version string : Darwin Kernel Version 1.3:\n"
+ "Thu Mar 1 06:56:40 PST 2001; root:xnu/xnu-123.5.obj~1/RELEASE_PPC\n"
+ "\n"
+ "\n"
+ "\n"
+ "\n"
+ "DBAT0: 00000000 00000000\n"
+ "DBAT1: 00000000 00000000\n"
+ "DBAT2: 80001FFE 8000003A\n"
+ "DBAT3: 90001FFE 9000003A\n"
+ "MSR=00001030\n"
+ "backtrace: 0x0008c2f4 0x0002a7a0 0x001f0204 0x001d4e4c 0x001d4c5c "
+ "0x001a56cc 0x01d5dbc 0x001c621c 0x00037430 0x00037364\n"
+ "\n"
+ "panic: We are hanging here...\n");
+
+ return bst;
+}
+
+
+static struct bsod_state *
+macx_10_2 (Display *dpy, Window window, Bool v10_3_p)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macx", "MacX");
+
+ Pixmap mask = 0;
+ Pixmap pixmap = 0;
+ int pix_w = 0, pix_h = 0;
+ int x, y;
+
+ if (v10_3_p)
+ pixmap = image_data_to_pixmap (dpy, window,
+ osx_10_3_png, sizeof(osx_10_3_png),
+ &pix_w, &pix_h, &mask);
+ else
+ pixmap = image_data_to_pixmap (dpy, window,
+ osx_10_2_png, sizeof(osx_10_2_png),
+ &pix_w, &pix_h, &mask);
+ if (! pixmap) abort();
+ if (! mask) abort();
+
+#if 0
+ if (bst->xgwa.height > 600) /* scale up the bitmap */
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ if (! pixmap) abort();
+ if (! mask) abort();
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+#endif
+
+ BSOD_IMG (bst);
+ BSOD_PAUSE (bst, 2000000);
+
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = ((bst->xgwa.height - pix_h) / 2);
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
+
+ return bst;
+}
+
+
+/* 2006 Mac Mini with MacOS 10.6 failing with a bad boot drive. By jwz.
+ */
+static struct bsod_state *
+mac_diskfail (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macdisk", "Mac");
+ int cw = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ int h = bst->font->ascent + bst->font->descent;
+ int L = (bst->xgwa.width - (cw * 80)) / 2;
+ int T = (bst->xgwa.height - (h * 10)) / 2;
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.background",
+ "Mac.Background");
+ if (L < 0) L = 0;
+ if (T < 0) T = 0;
+
+ bst->wrap_p = True;
+ bst->scroll_p = True;
+
+ BSOD_COLOR(bst, bg2, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_COLOR(bst, bg, fg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR(bst, fg, bg);
+
+ BSOD_MARGINS (bst, L, L);
+ BSOD_MOVETO (bst, L, T);
+
+ BSOD_TEXT (bst, LEFT,
+ "efiboot loaded from device: Acpi(PNP0A03,0)/Pci*1F|2)/Ata"
+ "(Primary,Slave)/HD(Part\n"
+ "2,Sig8997E427-064E-4FE7-8CB9-F27A784B232C)\n"
+ "boot file path: \\System\\Library\\CoreServices\\boot.efi\n"
+ ".Loading kernel cache file 'System\\Library\\Caches\\"
+ "com.apple.kext.caches\\Startup\\\n"
+ "kernelcache_i386.2A14EC2C'\n"
+ "Loading 'mach_kernel'...\n"
+ );
+ BSOD_CHAR_DELAY (bst, 7000);
+ BSOD_TEXT (bst, LEFT,
+ ".....................\n"
+ );
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT,
+ "root device uuid is 'B62181B4-6755-3C27-BFA1-49A0E053DBD6\n"
+ "Loading drivers...\n"
+ "Loading System\\Library\\Caches\\com.apple.kext.caches\\"
+ "Startup\\Extensions.mkext....\n"
+ );
+ BSOD_CHAR_DELAY (bst, 7000);
+ BSOD_TEXT (bst, LEFT,
+ "..............................................................."
+ ".................\n"
+ "..............................................................."
+ ".................\n"
+ "..............\n"
+ );
+ BSOD_INVERT (bst);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_INVERT (bst);
+
+ BSOD_MARGINS (bst, 0, 0);
+ BSOD_MOVETO (bst, 0, h);
+
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_LINE_DELAY (bst, 5000);
+ BSOD_TEXT (bst, LEFT,
+ "npvhash=4095\n"
+ "PRE enabled\n"
+ "Darwin Kernel Version 10.8.9: Tue Jun 7 16:33:36 PDT 2011;"
+ " root:xnu-1504.15.3~1/RELEASE_I386\n"
+ "vm_page_bootstrap: 508036 free pages and 16252 wired pages\n"
+ "standard timeslicing quantum is 10000 us\n"
+ "mig_table_max_displ = 73\n"
+ "AppleACPICPU: ProcessorId=0 LocalApicId=0 Enabled\n"
+ "AppleACPICPU: ProcessorId=1 LocalApicId=1 Enabled\n"
+ "calling npo_policy_init for Quarantine\n"
+ "Security policy loaded: Quaantine policy (Quarantine)\n"
+ "calling npo_policy_init for Sandbox\n"
+ "Security policy loaded: Seatbelt sandbox policy (Sandbox)\n"
+ "calling npo_policy_init for TMSafetyNet\n"
+ "Security policy loaded: Safety net for Time Machine "
+ "(TMSafetyNet)\n"
+ "Copyright (c) 1982, 1986, 1989, 1991, 1993\n"
+ "The Regents of the University of California. All rights "
+ "reserved.\n"
+ "\n"
+ "MAC Framework successfully initialized\n"
+ "using 10485 buffer headers and 4096 cluster IO buffer headers\n"
+ "IOAPIC: Version 0x20 Vectors 64:87\n"
+ "ACPI: System State [S0 S3 S4 S5] (S3)\n"
+ "PFM64 0x10000000, 0xf0000000\n"
+ "[ PCI configuration begin ]\n"
+ "PCI configuration changed (bridge=1 device=1 cardbus=0)\n"
+ "[ PCI configuration end, bridges 4 devices 17 ]\n"
+ "nbinit: done (64 MB memory set for nbuf pool)\n"
+ "rooting via boot-uuid from /chosen: "
+ "B62181B4-6755-3C27-BFA1-49A0E053DBD6\n"
+ "Waiting on <dict ID=\"0\"><key>IOProviderClass</key>"
+ "<string ID=\"1\">IOResources</string><key>IOResourceMatch</key>"
+ "<string ID=\"2\">boot-uuid-nedia</string></dict>\n"
+ "com.apple.AppleFSCCompressionTypeZlib kmod start\n"
+ "com.apple.AppleFSCCompressionTypeZlib kmod succeeded\n"
+ "AppleIntelCPUPowerManagementClient: ready\n"
+ "FireWire (OHCI) Lucent ID 5811 built-in now active, GUID "
+ "0019e3fffe97f8b4; max speed s400.\n"
+ "Got boot device = IOService:/AppleACPIPlatformExpert/PCI000/"
+ "AppleACPIPCI/SATA@1F,2/AppleAHCI/PRI202/IOAHCIDevice@0/"
+ "AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/"
+ "IOBlockStorageDriver/ST96812AS Media/IOGUIDPartitionScheme/"
+ "Customer02\n"
+ );
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_TEXT (bst, LEFT,
+ "BSD root: Disk0s, major 14, minor 2\n"
+ "[Bluetooth::CSRHIDTransition] switchtoHCIMode (legacy)\n"
+ "[Bluetooth::CSRHIDTransition] transition complete.\n"
+ "CSRUSBBluetoothHCIController::setupHardware super returned 0\n"
+ );
+ BSOD_PAUSE (bst, 3000000);
+ BSOD_TEXT (bst, LEFT,
+ "disk0s2: I/O error.\n"
+ "0 [Level 3] [ReadUID 0] [Facility com.apple.system.fs] "
+ "[ErrType IO] [ErrNo 5] [IOType Read] [PBlkNum 48424] "
+ "[LBlkNum 1362] [FSLogMsgID 2009724291] [FSLogMsgOrder First]\n"
+ "0 [Level 3] [ReadUID 0] [Facility com.apple.system.fs] "
+ "[DevNode root_device] [MountPt /] [FSLogMsgID 2009724291] "
+ "[FSLogMsgOrder Last]\n"
+ "panic(cpu 0 caller 0x47f5ad): \"Process 1 exec of /sbin/launchd"
+ " failed, errno 5\\n\"0/SourceCache/xnu/xnu-1504.15.3/bsd/kern/"
+ "kern_exec.c:3145\n"
+ "Debugger called: <panic>\n"
+ "Backtrace (CPU 0), Frame : Return Address (4 potential args "
+ "on stack)\n"
+ "0x34bf3e48 : 0x21b837 (0x5dd7fc 0x34bf3e7c 0x223ce1 0x0)\n"
+ "0x34bf3e98 : 0x47f5ad (0x5cf950 0x831c08 0x5 0x0)\n"
+ "0x34bf3ef8 : 0x4696d2 (0x4800d20 0x1fe 0x45a69a0 0x80000001)\n"
+ "0x34bf3f38 : 0x48fee5 (0x46077a8 0x84baa0 0x34bf3f88 "
+ "0x34bf3f94)\n"
+ "0x34bf3f68 : 0x219432 (0x46077a8 0xffffff7f 0x0 0x227c4b)\n"
+ "0x34bf3fa8 : 0x2aacb4 (0xffffffff 0x1 0x22f8f5 0x227c4b)\n"
+ "0x34bf3fc8 : 0x2a1976 (0x0 0x0 0x2a17ab 0x4023ef0)\n"
+ "\n"
+ "BSD process name corresponding to current thread: init\n"
+ "\n"
+ "Mac OS version:\n"
+ "Not yet set\n"
+ "\n"
+ "Kernel version:\n"
+ "Darwin Kernel version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; "
+ "root:xnu-1504.15-3~1/RELEASE_I386\n"
+ "System model name: Macmini1,1 (Mac-F4208EC0)\n"
+ "\n"
+ "System uptime in nanoseconds: 13239332027\n"
+ );
+ BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 999999);
+
+ XClearWindow (dpy, window);
+
+ return bst;
+}
+
+
+/* 2017 MacOS 10.12 interminable software update, by jwz.
+ */
+static struct bsod_state *
+macx_install (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macinstall", "MacX");
+
+ int pix_w, pix_h;
+ int x, y;
+ int bw1, bh1;
+ int bw2, bh2;
+
+ unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.foreground",
+ "Mac.Foreground");
+ unsigned long bg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.background",
+ "Mac.Background");
+ unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.barForeground",
+ "Mac.Foreground");
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.barBackground",
+ "Mac.Background");
+ char buf[1024];
+ int lh = bst->font->ascent + bst->font->descent;
+ int i, min;
+ double pct;
+
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ apple_png, sizeof(apple_png),
+ &pix_w, &pix_h, &mask);
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ if (pixmap)
+ {
+ int i, n = 0;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height) / 2 - pix_h;
+ if (y < 0) y = 0;
+
+ XSetLineAttributes (dpy, bst->gc, 1, LineSolid, CapRound, JoinMiter);
+
+ BSOD_COLOR(bst, bg, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR(bst, fg, bg);
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
+ y += pix_h * 2 - lh;
+
+ /* progress bar */
+ bw1 = pix_w * 2.5;
+ bh1 = lh * 0.66;
+ if (bh1 < 8) bh1 = 8;
+
+ x = (bst->xgwa.width - bw1) / 2;
+ BSOD_COLOR(bst, fg2, bg);
+ BSOD_LINE (bst, x, y, x + bw1, y, bh1);
+
+ bw2 = bw1 - 1;
+ bh2 = bh1 - 4;
+ BSOD_COLOR(bst, bg2, bg);
+ BSOD_LINE (bst, x+1, y, x + bw2, y, bh2);
+
+ BSOD_COLOR(bst, fg, bg);
+ BSOD_LINE (bst, x, y, x + 1, y, bh1);
+
+ pct = 5 + (random() % 40);
+ min = 5 + (random() % 40);
+
+ for (i = 0; i < 100; i++) {
+ pct += frand(0.3);
+ min += (random() % 3) - 1; /* sometimes down, mostly up */
+
+ if (pct > 90) pct = 90;
+ BSOD_RECT (bst, True, x, y - bh1/2, bw1 * pct / 100, bh1);
+
+ sprintf (buf, " Installing Software Update: about %d minutes. ", min);
+ bst->y = y + lh * 3;
+ BSOD_TEXT (bst, CENTER, buf);
+ BSOD_PAUSE (bst, 1000000);
+ }
+
+ return bst;
+}
+
+
+static struct bsod_state *
+macx (Display *dpy, Window window)
+{
+ switch (1?4:random() % 5) {
+ case 0: return macx_10_0 (dpy, window); break;
+ case 1: return macx_10_2 (dpy, window, False); break;
+ case 2: return macx_10_2 (dpy, window, True); break;
+ case 3: return mac_diskfail (dpy, window); break;
+ case 4: return macx_install (dpy, window); break;
+ default: abort();
+ }
+}
+
+
+#ifndef HAVE_JWXYZ /* #### I have no idea how to implement this without
+ real plane-masks. I don't think it would look
+ right if done with alpha-transparency... */
+/* blit damage
+ *
+ * by Martin Pool <mbp@samba.org>, Feb 2000.
+ *
+ * This is meant to look like the preferred failure mode of NCD
+ * Xterms. The parameters for choosing what to copy where might not
+ * be quite right, but it looks about ugly enough.
+ */
+static struct bsod_state *
+blitdamage (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "blitdamage", "BlitDamage");
+
+ int i;
+ int delta_x = 0, delta_y = 0;
+ int w, h;
+ int chunk_h, chunk_w;
+ int steps;
+ int src_x, src_y;
+ int x, y;
+
+ w = bst->xgwa.width;
+ h = bst->xgwa.height;
+
+ XSetPlaneMask (dpy, bst->gc, random());
+
+ steps = 50;
+ chunk_w = w / (random() % 1 + 1);
+ chunk_h = h / (random() % 1 + 1);
+ if (random() & 0x1000)
+ delta_y = random() % 600;
+ if (!delta_y || (random() & 0x2000))
+ delta_x = random() % 600;
+ src_x = 0;
+ src_y = 0;
+ x = 0;
+ y = 0;
+
+ BSOD_IMG (bst);
+ for (i = 0; i < steps; i++) {
+ if (x + chunk_w > w)
+ x -= w;
+ else
+ x += delta_x;
+
+ if (y + chunk_h > h)
+ y -= h;
+ else
+ y += delta_y;
+
+ BSOD_COPY (bst, src_x, src_y, chunk_w, chunk_h, x, y);
+ BSOD_PAUSE (bst, 1000);
+ }
+
+ return bst;
+}
+#endif /* !HAVE_JWXYZ */
+
+
+/*
+ * OS/2 panics, by Knut St. Osmundsen <bird-xscreensaver@anduin.net>
+ *
+ * All but one messages are real ones, some are from my test machines
+ * and system dumps, others are reconstructed from google results.
+ * Please, don't be to hard if the formatting of the earlier systems
+ * aren't 100% correct.
+ */
+static struct bsod_state *
+os2 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "os2", "OS2");
+
+ __extension__
+ static const char * const os2_panics[] =
+ { /* OS/2 2.0 trap - details are bogus (CR0++). */
+ "TRAP 0002 ERRCD=0000 ERACC=**** ERLIM=********\n"
+ "EAX=7d240a58 EBX=ff202fdc ECX=00064423 EDX=00003624\n"
+ "ESI=fff3272c EDI=7d240004 EBP=00004a44 FLG=00003202\n"
+ "CS:EIP=0160:fff702a6 CSACC=c09d CSLIM=ffffffff\n"
+ "SS:ESP=0030:00004a38 SSACC=1097 SSLIM=00003fff\n"
+ "DS=0158 DSACC=c0f3 DSLIM=ffffffff CR0=fffffffb\n"
+ "ES=0158 ESACC=c0f3 ESLIM=ffffffff CR2=1a060014\n"
+ "FS=0000 FSACC=**** FSLIM=********\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0160:fff6453f - 000d:a53f\n"
+ "60000, 9084\n"
+ "\n"
+ "038600d1\n"
+ "Internal revision 6.307, 92/03/01\n"
+ "\n",
+
+ /* warp 3 (early) */
+ "TRAP 000e ERRCD=0000 ERACC=**** ERLIM=********\n"
+ "EAX=ff050c20 EBX=000000bb ECX=ffff00c1 EDx=fff379b8\n"
+ "ESI=ffe55a3c EDI=00000000 EBP=00004eb8 FLG=00013282\n"
+ "CS:EIP=0160:fff8dbb8 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:EIP=0030:00004eb4 SSACC=1097 SSLIM=00003fff\n"
+ "DS=0158 DSACC=c0f3 DSLIM=ffffffff CR0=8001001b\n"
+ "ES=0158 DSACC=c0f3 DSLIM=ffffffff CR2=000000c7\n"
+ "FS=0000 FSACC=**** FSLIM=********\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0160:fff66bf0 - 000d:9bf0.\n"
+ "60000, 9084\n"
+ "\n"
+ "048600b4\n"
+ "Internal revision 8.125, 94/02/16\n"
+ "\n"
+ "The system is stopped. Record the location number of the error\n"
+ "and contact your service representative.\n",
+
+ /* warp 3 */
+ "TRAP 000e ERRCD=0002 ERACC=**** ERLIM=********\n"
+ "EAX=00000000 EBX=fdef1e0c ECX=00003824 EDX=0000edf9\n"
+ "ESI=fdf30e80 EDI=fc8b0000 EBP=00005658 FLG=00012246\n"
+ "CS:EIP=0160:fff8ada3 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=0030:000055d4 SSACC=1097 SSLIM=0000480f\n"
+ "DS=0158 DSACC=c093 DSLIM=ffffffff CR0=8001001b\n"
+ "ES=0158 ESACC=c093 ESLIM=ffffffff CR2=fc8b0000\n"
+ "FS=03b8 FSACC=0093 FSLIM=00000023\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0160:fff5c364 - 000d:a364.\n"
+ "60000, 9084\n"
+ "\n"
+ "05860526\n"
+ "Internal revision 8200,94/11/07\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n",
+
+ /* warp 3 (late) */
+ "TRAP 000d ERRCD=2200 ERACC=1092 ERLIM=00010fff\n"
+ "EAX=0000802e EBX=fff001c8 ECX=9bd80000 EDX=00000000\n"
+ "ESI=fff09bd8 EDI=fdeb001b EBP=00000000 FLG=00012012\n"
+ "CS:EIP=0168:fff480a2 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=00e8:00001f32 SSACC=0093 SSLIM=00001fff\n"
+ "DS=0940 DSACC=0093 DSLIM=00000397 CR0=8001001b\n"
+ "ES=00e8 ESACC=0093 ESLIM=00001fff CR2=15760008\n"
+ "FS=0000 FSACC=**** FSLIM=****\n"
+ "GS=0000 GSACC=**** GSLIM=****\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0168:fff4b06e - 000e:c06e\n"
+ "60000, 9084\n"
+ "\n"
+ "06860652\n"
+ "Internal revision 8.259_uni,98/01/07\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n",
+
+ /* Warp 4.52+ - the official r0trap.exe from the debugging classes */
+ "Exception in module: OS2KRNL\n"
+ "TRAP 000e ERRCD=0002 ERACC=**** ERLIM=********\n"
+ "EAX=00000001 EBX=80010002 ECX=ffed4638 EDX=0003f17b\n"
+ "ESI=00000001 EDI=00000002 EBP=00005408 FLG=00012202\n"
+ "CS:EIP=0168:fff3cd2e CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=0030:000053ec SSACC=1097 SSLIM=000044ff\n"
+ "DS=0160 DSACC=c093 DSLIM=ffffffff CR0=8001001b\n"
+ "ES=0160 ESACC=c093 ESLIM=ffffffff CR2=00000001\n"
+ "FS=0000 FSACC=**** FSLIM=********\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error at\n"
+ "location ##0168:fff1e3f3 - 000e:c3f3.\n"
+ "60000, 9084\n"
+ "\n"
+ "068606a0\n"
+ "Internal revision 14.097_UNI\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n",
+
+ /* Warp 4.52+, typical JFS problem. */
+ "Exeption in module: JFS\n"
+ "TRAP 0003 ERRCD=0000 ERACC=**** ERLIM=********\n"
+ "EAX=00000000 EBX=ffffff05 ECX=00000001 EDX=f5cd8010\n"
+ "ESI=000000e6 EDI=000000e7 EBP=f9c7378e FLG=00002296\n"
+ "CS:EIP=0168:f8df3250 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=1550:fdc73778 SSACC=c093 SSLIM=ffffffff\n"
+ "DS=0160 DSACC=c093 DSLIM=ffffffff CR0=80010016\n"
+ "ES=0160 ESACC=c093 DSLIM=ffffffff CR2=05318000\n"
+ "FS=03c0 FSACC=0093 DSLIM=00000023\n"
+ "GS=0160 GSACC=c093 DSLIM=ffffffff\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0168:fff1e2ab - 000e:c2ab.\n"
+ "60000, 9084\n"
+ "\n"
+ "07860695\n"
+ "\n"
+ "Internal revision 14.100c_UNI\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n"
+ };
+
+ BSOD_TEXT (bst, LEFT, os2_panics[random() % countof(os2_panics)]);
+ BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* SPARC Solaris panic. Should look pretty authentic on Solaris boxes.
+ * Anton Solovyev <solovam@earthlink.net>
+ */
+static struct bsod_state *
+sparc_solaris (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "solaris", "Solaris");
+ int i;
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = bst->xgwa.width * 0.07;
+ bst->top_margin = bst->bottom_margin = bst->xgwa.height * 0.07;
+ bst->y = bst->top_margin + bst->yoff + bst->font->ascent;
+
+ BSOD_IMG (bst);
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_INVERT(bst);
+ BSOD_RECT (bst, True,
+ bst->left_margin, bst->top_margin,
+ bst->xgwa.width - bst->left_margin - bst->right_margin,
+ bst->xgwa.height - bst->top_margin - bst->bottom_margin);
+ BSOD_INVERT(bst);
+
+ BSOD_TEXT (bst, LEFT,
+ "BAD TRAP: cpu=0 type=0x31 rp=0x2a10043b5e0 addr=0xf3880 mmu_fsr=0x0\n"
+ "BAD TRAP occurred in module \"unix\" due to an illegal access to a"
+ " user address.\n"
+ "adb: trap type = 0x31\n"
+ "addr=0xf3880\n"
+ "pid=307, pc=0x100306e4, sp=0x2a10043ae81, tstate=0x4480001602,"
+ " context=0x87f\n"
+ "g1-g7: 1045b000, 32f, 10079440, 180, 300000ebde8, 0, 30000953a20\n"
+ "Begin traceback... sp = 2a10043ae81\n"
+ "Called from 100bd060, fp=2a10043af31, args=f3700 300008cc988 f3880 0"
+ " 1 300000ebde0.\n"
+ "Called from 101fe1bc, fp=2a10043b011, args=3000045a240 104465a0"
+ " 300008e47d0 300008e48fa 300008ae350 300008ae410\n"
+ "Called from 1007c520, fp=2a10043b0c1, args=300008e4878 300003596e8 0"
+ " 3000045a320 0 3000045a220\n"
+ "Called from 1007c498, fp=2a10043b171, args=1045a000 300007847f0 20"
+ " 3000045a240 1 0\n"
+ "Called from 1007972c, fp=2a10043b221, args=1 300009517c0 30000951e58 1"
+ " 300007847f0 0\n"
+ "Called from 10031e10, fp=2a10043b2d1, args=3000095b0c8 0 300009396a8"
+ " 30000953a20 0 1\n"
+ "Called from 10000bdd8, fp=ffffffff7ffff1c1, args=0 57 100131480"
+ " 100131480 10012a6e0 0\n"
+ "End traceback...\n"
+ "panic[cpu0]/thread=30000953a20: trap\n"
+ "syncing file systems...");
+
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_TEXT (bst, LEFT, " 1 done\n");
+ BSOD_TEXT (bst, LEFT, "dumping to /dev/dsk/c0t0d0s3, offset 26935296\n");
+ BSOD_PAUSE (bst, 2000000);
+
+
+ for (i = 1; i <= 100; ++i)
+ {
+ char buf[100];
+ sprintf (buf, "\b\b\b\b\b\b\b\b\b\b\b%3d%% done", i);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 100000);
+ }
+
+ BSOD_TEXT (bst, LEFT,
+ ": 2803 pages dumped, compression ratio 2.88, dump succeeded\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "rebooting...\n"
+ "Resetting ...");
+
+ return bst;
+}
+
+
+/* Linux panic and fsck, by jwz
+ */
+static struct bsod_state *
+linux_fsck (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "linux", "Linux");
+
+ int i;
+ const char *sysname;
+ char buf[1024];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+#endif /* UNAME */
+
+ const char *linux_panic[] = {
+ " kernel: Unable to handle kernel paging request at virtual "
+ "address 0000f0ad\n",
+ " kernel: printing eip:\n",
+ " kernel: c01becd7\n",
+ " kernel: *pde = 00000000\n",
+ " kernel: Oops: 0000\n",
+ " kernel: CPU: 0\n",
+ " kernel: EIP: 0010:[<c01becd7>] Tainted: P \n",
+ " kernel: EFLAGS: 00010286\n",
+ " kernel: eax: 0000ff00 ebx: ca6b7e00 ecx: ce1d7a60 edx: ce1d7a60\n",
+ " kernel: esi: ca6b7ebc edi: 00030000 ebp: d3655ca0 esp: ca6b7e5c\n",
+ " kernel: ds: 0018 es: 0018 ss: 0018\n",
+ " kernel: Process crond (pid: 1189, stackpage=ca6b7000)\n",
+ " kernel: Stack: d3655ca0 ca6b7ebc 00030054 ca6b7e7c c01c1e5b "
+ "00000287 00000020 c01c1fbf \n",
+ "",
+ " kernel: 00005a36 000000dc 000001f4 00000000 00000000 "
+ "ce046d40 00000001 00000000 \n",
+ "", "", "",
+ " kernel: ffffffff d3655ca0 d3655b80 00030054 c01bef93 "
+ "d3655ca0 ca6b7ebc 00030054 \n",
+ "", "", "",
+ " kernel: Call Trace: [<c01c1e5b>] [<c01c1fbf>] [<c01bef93>] "
+ "[<c01bf02b>] [<c0134c4f>]\n",
+ "", "", "",
+ " kernel: [<c0142562>] [<c0114f8c>] [<c0134de3>] [<c010891b>]\n",
+ " kernel: \n",
+ " kernel: Code: 2a 00 75 08 8b 44 24 2c 85 c0 74 0c 8b 44 24 58 83 48 18 "
+ "08 \n",
+ 0
+ };
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = 10;
+ bst->top_margin = bst->bottom_margin = 10;
+
+ sysname = "linux";
+# ifdef HAVE_UNAME
+ {
+ char *s;
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+
+ BSOD_TEXT (bst, LEFT, "waiting for X server to shut down ");
+ BSOD_PAUSE (bst, 100000);
+ BSOD_TEXT (bst, LEFT,
+ "XIO: fatal IO error 2 (broken pipe) on X server \":0.0\"\n"
+ " after 339471 requests (339471 known processed) "
+ "with 0 events remaining\n");
+ BSOD_CHAR_DELAY (bst, 300000);
+ BSOD_TEXT (bst, LEFT, ".........\n");
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT,
+ "xinit: X server slow to shut down, sending KILL signal.\n"
+ "waiting for server to die ");
+ BSOD_CHAR_DELAY (bst, 300000);
+ BSOD_TEXT (bst, LEFT, "...\n");
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT, "xinit: Can't kill server\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ sprintf (buf, "\n%s Login: ", sysname);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_TEXT (bst, LEFT,
+ "\n\n"
+ "Parallelizing fsck version 1.22 (22-Jun-2001)\n"
+ "e2fsck 1.22, 22-Jun-2001 for EXT2 FS 0.5b, 95/08/09\n"
+ "Warning! /dev/hda1 is mounted.\n"
+ "/dev/hda1 contains a file system with errors, check forced.\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ if (0 == random() % 2)
+ BSOD_TEXT (bst, LEFT,
+ "Couldn't find ext2 superblock, trying backup blocks...\n"
+ "The filesystem size (according to the superblock) is 3644739 blocks\n"
+ "The physical size of the device is 3636706 blocks\n"
+ "Either the superblock or the partition table is likely to be corrupt!\n"
+ "Abort<y>? no\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ AGAIN:
+
+ BSOD_TEXT (bst, LEFT, "Pass 1: Checking inodes, blocks, and sizes\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ i = (random() % 60) - 20;
+ while (--i > 0)
+ {
+ int b = random() % 0xFFFF;
+ sprintf (buf, "Deleted inode %d has zero dtime. Fix<y>? yes\n\n", b);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ }
+
+ i = (random() % 40) - 10;
+ if (i > 0)
+ {
+ int g = random() % 0xFFFF;
+ int b = random() % 0xFFFFFFF;
+
+ BSOD_PAUSE (bst, 1000000);
+
+ sprintf (buf, "Warning: Group %d's copy of the group descriptors "
+ "has a bad block (%d).\n", g, b);
+ BSOD_TEXT (bst, LEFT, buf);
+
+ b = random() % 0x3FFFFF;
+ while (--i > 0)
+ {
+ b += random() % 0xFFFF;
+ sprintf (buf,
+ "Error reading block %d (Attempt to read block "
+ "from filesystem resulted in short read) while doing "
+ "inode scan. Ignore error<y>?",
+ b);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 10000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ }
+ }
+
+ if (0 == (random() % 10))
+ {
+ BSOD_PAUSE (bst, 1000000);
+
+ i = 3 + (random() % 10);
+ while (--i > 0)
+ {
+ BSOD_TEXT (bst, LEFT,
+ "Could not allocate 256 block(s) for inode table: "
+ "No space left on device\n");
+ BSOD_PAUSE (bst, 1000);
+ }
+ BSOD_TEXT (bst, LEFT, "Restarting e2fsck from the beginning...\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ goto AGAIN;
+ }
+
+ i = (random() % 20) - 5;
+
+ if (i > 0)
+ BSOD_PAUSE (bst, 1000000);
+
+ while (--i > 0)
+ {
+ int j = 5 + (random() % 10);
+ int w = random() % 4;
+
+ while (--j > 0)
+ {
+ int b = random() % 0xFFFFF;
+ int g = random() % 0xFFF;
+
+ if (0 == (random() % 10))
+ b = 0;
+ else if (0 == (random() % 10))
+ b = -1;
+
+ if (w == 0)
+ sprintf (buf,
+ "Inode table for group %d not in group. (block %d)\n"
+ "WARNING: SEVERE DATA LOSS POSSIBLE.\n"
+ "Relocate<y>?",
+ g, b);
+ else if (w == 1)
+ sprintf (buf,
+ "Block bitmap for group %d not in group. (block %d)\n"
+ "Relocate<y>?",
+ g, b);
+ else if (w == 2)
+ sprintf (buf,
+ "Inode bitmap %d for group %d not in group.\n"
+ "Continue<y>?",
+ b, g);
+ else /* if (w == 3) */
+ sprintf (buf,
+ "Bad block %d in group %d's inode table.\n"
+ "WARNING: SEVERE DATA LOSS POSSIBLE.\n"
+ "Relocate<y>?",
+ b, g);
+
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ BSOD_PAUSE (bst, 1000);
+ }
+ }
+
+
+ if (0 == random() % 10) goto PANIC;
+ BSOD_TEXT (bst, LEFT, "Pass 2: Checking directory structure\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ i = (random() % 20) - 5;
+ while (--i > 0)
+ {
+ int n = random() % 0xFFFFF;
+ int o = random() % 0xFFF;
+ sprintf (buf, "Directory inode %d, block 0, offset %d: "
+ "directory corrupted\n"
+ "Salvage<y>? ",
+ n, o);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+
+ if (0 == (random() % 100))
+ {
+ sprintf (buf, "Missing '.' in directory inode %d.\nFix<y>?", n);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ }
+ }
+
+ if (0 == random() % 10)
+ goto PANIC;
+
+ BSOD_TEXT (bst, LEFT,
+ "Pass 3: Checking directory connectivity\n"
+ "/lost+found not found. Create? yes\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ /* Unconnected directory inode 4949 (/var/spool/squid/06/???)
+ Connect to /lost+found<y>? yes
+
+ '..' in /var/spool/squid/06/08 (20351) is <The NULL inode> (0), should be
+ /var/spool/squid/06 (20350).
+ Fix<y>? yes
+
+ Unconnected directory inode 128337 (/var/spool/squid/06/???)
+ Connect to /lost+found<y>? yes
+ */
+
+
+ if (0 == random() % 10) goto PANIC;
+ BSOD_TEXT (bst, LEFT, "Pass 4: Checking reference counts\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ /* Inode 2 ref count is 19, should be 20. Fix<y>? yes
+
+ Inode 4949 ref count is 3, should be 2. Fix<y>? yes
+
+ ...
+
+ Inode 128336 ref count is 3, should be 2. Fix<y>? yes
+
+ Inode 128337 ref count is 3, should be 2. Fix<y>? yes
+
+ */
+
+
+ if (0 == random() % 10) goto PANIC;
+ BSOD_TEXT (bst, LEFT, "Pass 5: Checking group summary information\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ i = (random() % 200) - 50;
+ if (i > 0)
+ {
+ BSOD_TEXT (bst, LEFT, "Block bitmap differences: ");
+ while (--i > 0)
+ {
+ sprintf (buf, " %d", -(random() % 0xFFF));
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ }
+ BSOD_TEXT (bst, LEFT, "\nFix? yes\n\n");
+ }
+
+
+ i = (random() % 100) - 50;
+ if (i > 0)
+ {
+ BSOD_TEXT (bst, LEFT, "Inode bitmap differences: ");
+ while (--i > 0)
+ {
+ sprintf (buf, " %d", -(random() % 0xFFF));
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ }
+ BSOD_TEXT (bst, LEFT, "\nFix? yes\n\n");
+ }
+
+ i = (random() % 20) - 5;
+ while (--i > 0)
+ {
+ int g = random() % 0xFFFF;
+ int c = random() % 0xFFFF;
+ sprintf (buf,
+ "Free blocks count wrong for group #0 (%d, counted=%d).\nFix? ",
+ g, c);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ }
+
+ PANIC:
+
+ i = 0;
+ BSOD_TEXT (bst, LEFT, "\n\n");
+ while (linux_panic[i])
+ {
+ time_t t = time ((time_t *) 0);
+ struct tm *tm = localtime (&t);
+ char prefix[100];
+
+ if (*linux_panic[i])
+ {
+ strftime (prefix, sizeof(prefix)-1, "%b %d %H:%M:%S ", tm);
+ BSOD_TEXT (bst, LEFT, prefix);
+ BSOD_TEXT (bst, LEFT, sysname);
+ BSOD_TEXT (bst, LEFT, linux_panic[i]);
+ BSOD_PAUSE (bst, 1000);
+ }
+ else
+ BSOD_PAUSE (bst, 300000);
+
+ i++;
+ }
+ BSOD_PAUSE (bst, 4000000);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/*
+ * Linux (hppa) panic, by Stuart Brady <sdbrady@ntlworld.com>
+ * Output courtesy of M. Grabert
+ */
+static struct bsod_state *
+hppa_linux (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "hppalinux", "HPPALinux");
+
+ int i = 0;
+ const char *release, *sysname, *gccversion, *version;
+ long int linedelay = 0;
+ char ss[1024];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif /* UNAME */
+
+ __extension__
+ struct { long int delay; const char *string; } linux_panic[] =
+ {{ 0, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
+ "\n\n\n\n\n\n\n\n\n\n\n\n\n" },
+ { 0, "Linux version %s (root@%s) (gcc version %s) %s\n" },
+ { 4000, "FP[0] enabled: Rev 1 Model 16\n" },
+ { 10, "The 32-bit Kernel has started...\n" },
+ { -1, "Determining PDC firmware type: System Map.\n" },
+ { -1, "model 00005bb0 00000481 00000000 00000002 7778df9f 100000f0 "
+ "00000008 000000b2 000000b2\n" },
+ { -1, "vers 00000203\n" },
+ { -1, "CPUID vers 17 rev 7 (0x00000227)\n" },
+ { -1, "capabilities 0x3\n" },
+ { -1, "model 9000/785/C3000\n" },
+ { -1, "Total Memory: 1024 Mb\n" },
+ { -1, "On node 0 totalpages: 262144\n" },
+ { -1, " DMA zone: 262144 pages, LIFO batch:16\n" },
+ { -1, " Normal zone: 0 pages, LIFO batch:1\n" },
+ { -1, " HighMem zone: 0 pages, LIFO batch:1\n" },
+ { -1, "LCD display at f05d0008,f05d0000 registered\n" },
+ { -1, "Building zonelist for node : 0\n" },
+ { -1, "Kernel command line: ide=nodma root=/dev/sda3 HOME=/ ip=off "
+ "console=ttyS0 TERM=vt102 palo_kernel=2/vmlinux-2.6\n" },
+ { -1, "ide_setup: ide=nodmaIDE: Prevented DMA\n" },
+ { -1, "PID hash table entries: 16 (order 4: 128 bytes)\n" },
+ {500, "Console: colour dummy device 160x64\n" },
+ { 10, "Memory: 1034036k available\n" },
+ { -1, "Calibrating delay loop... 796.67 BogoMIPS\n" },
+ { -1, "Dentry cache hash table entries: 131072 (order: 7, 524288 "
+ "bytes)\n" },
+ { -1, "Inode-cache hash table entries: 65536 (order: 6, 262144 "
+ "bytes)\n" },
+ { -1, "Mount-cache hash table entries: 512 (order: 0, 4096 bytes)\n" },
+ { -1, "POSIX conformance testing by UNIFIX\n" },
+ { -1, "NET: Registered protocol family 16\n" },
+ { 100, "Searching for devices...\n" },
+ { 25, "Found devices:\n" },
+ { 10, "1. Astro BC Runway Port at 0xfed00000 [10] "
+ "{ 12, 0x0, 0x582, 0x0000b }\n" },
+ { -1, "2. Elroy PCI Bridge at 0xfed30000 [10/0] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "3. Elroy PCI Bridge at 0xfed32000 [10/1] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "4. Elroy PCI Bridge at 0xfed38000 [10/4] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "5. Elroy PCI Bridge at 0xfed3c000 [10/6] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "6. AllegroHigh W at 0xfffa0000 [32] "
+ "{ 0, 0x0, 0x5bb, 0x00004 }\n" },
+ { -1, "7. Memory at 0xfed10200 [49] { 1, 0x0, 0x086, 0x00009 }\n" },
+ { -1, "CPU(s): 1 x PA8500 (PCX-W) at 400.000000 MHz\n" },
+ { -1, "SBA found Astro 2.1 at 0xfed00000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed30000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed32000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed38000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed3c000\n" },
+ { 100, "SCSI subsystem initialized\n" },
+ { 10, "drivers/usb/core/usb.c: registered new driver usbfs\n" },
+ { -1, "drivers/usb/core/usb.c: registered new driver hub\n" },
+ { -1, "ikconfig 0.7 with /proc/config*\n" },
+ { -1, "Initializing Cryptographic API\n" },
+ { 250, "SuperIO: probe of 0000:00:0e.0 failed with error -1\n" },
+ { 20, "SuperIO: Found NS87560 Legacy I/O device at 0000:00:0e.1 "
+ "(IRQ 64)\n" },
+ { -1, "SuperIO: Serial port 1 at 0x3f8\n" },
+ { -1, "SuperIO: Serial port 2 at 0x2f8\n" },
+ { -1, "SuperIO: Parallel port at 0x378\n" },
+ { -1, "SuperIO: Floppy controller at 0x3f0\n" },
+ { -1, "SuperIO: ACPI at 0x7e0\n" },
+ { -1, "SuperIO: USB regulator enabled\n" },
+ { -1, "SuperIO: probe of 0000:00:0e.2 failed with error -1\n" },
+ { -1, "Soft power switch enabled, polling @ 0xf0400804.\n" },
+ { -1, "pty: 256 Unix98 ptys configured\n" },
+ { -1, "Generic RTC Driver v1.07\n" },
+ { -1, "Serial: 8250/16550 driver $" "Revision: 1.100 $ 13 ports, "
+ "IRQ sharing disabled\n" },
+ { -1, "ttyS0 at I/O 0x3f8 (irq = 0) is a 16550A\n" },
+ { -1, "ttyS1 at I/O 0x2f8 (irq = 0) is a 16550A\n" },
+ { -1, "Linux Tulip driver version 1.1.13 (May 11, 2002)\n" },
+ { 150, "tulip0: no phy info, aborting mtable build\n" },
+ { 10, "tulip0: MII transceiver #1 config 1000 status 782d "
+ "advertising 01e1.\n" },
+ { -1, "eth0: Digital DS21143 Tulip rev 65 at 0xf4008000, "
+ "00:10:83:F9:B4:34, IRQ 66.\n" },
+ { -1, "Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2\n" },
+ { -1, "ide: Assuming 33MHz system bus speed for PIO modes; "
+ "override with idebus=xx\n" },
+ { 100, "SiI680: IDE controller at PCI slot 0000:01:06.0\n" },
+ { 10, "SiI680: chipset revision 2\n" },
+ { -1, "SiI680: BASE CLOCK == 133\n" },
+ { -1, "SiI680: 100% native mode on irq 128\n" },
+ { -1, " ide0: MMIO-DMA at 0xf4800000-0xf4800007 -- "
+ "Error, MMIO ports already in use.\n" },
+ { -1, " ide1: MMIO-DMA at 0xf4800008-0xf480000f -- "
+ "Error, MMIO ports already in use.\n" },
+ { 5, "hda: TS130220A2, ATA DISK drive\n" },
+ { -1, " _______________________________\n" },
+ { -1, " < Your System ate a SPARC! Gah! >\n" },
+ { -1, " -------------------------------\n" },
+ { -1, " \\ ^__^\n" },
+ { -1, " \\ (xx)\\_______\n" },
+ { -1, " (__)\\ )\\/\\\n" },
+ { -1, " U ||----w |\n" },
+ { -1, " || ||\n" },
+ { -1, "swapper (pid 1): Breakpoint (code 0)\n" },
+ { -1, "\n" },
+ { -1, " YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n" },
+ { -1, "PSW: 00000000000001001111111100001111 Not tainted\n" },
+ { -1, "r00-03 4d6f6f21 1032f010 10208f34 103fc2e0\n" },
+ { -1, "r04-07 103fc230 00000001 00000001 0000000f\n" },
+ { -1, "r08-11 103454f8 000f41fa 372d3980 103ee404\n" },
+ { -1, "r12-15 3ccbf700 10344810 103ee010 f0400004\n" },
+ { -1, "r16-19 f00008c4 f000017c f0000174 00000000\n" },
+ { -1, "r20-23 fed32840 fed32800 00000000 0000000a\n" },
+ { -1, "r24-27 0000ffa0 000000ff 103fc2e0 10326010\n" },
+ { -1, "r28-31 00000000 00061a80 4ff98340 10208f34\n" },
+ { -1, "sr0-3 00000000 00000000 00000000 00000000\n" },
+ { -1, "sr4-7 00000000 00000000 00000000 00000000\n" },
+ { -1, "\n" },
+ { -1, "IASQ: 00000000 00000000 IAOQ: 00000000 00000004\n" },
+ { -1, " IIR: 00000000 ISR: 00000000 IOR: 00000000\n" },
+ { -1, " CPU: 0 CR30: 4ff98000 CR31: 1037c000\n" },
+ { -1, " ORIG_R28: 55555555\n" },
+ { -1, " IAOQ[0]: 0x0\n" },
+ { -1, " IAOQ[1]: 0x4\n" },
+ { -1, " RP(r2): probe_hwif+0x218/0x44c\n" },
+ { -1, "Kernel panic: Attempted to kill init!\n" },
+ { 0, NULL }};
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = 10;
+ bst->top_margin = bst->bottom_margin = 10;
+
+ release = "2.6.0-test11-pa2";
+ sysname = "hppa";
+ version = "#2 Mon Dec 8 06:09:27 GMT 2003";
+# ifdef HAVE_UNAME
+ {
+ char *s;
+ if (uname (&uts) >= 0)
+ {
+ sysname = uts.nodename;
+ if (!strcmp (uts.sysname, "Linux"))
+ {
+ release = uts.release;
+ version = uts.version;
+ }
+ }
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+# if (defined (__GNUC__) && defined (__VERSION__))
+ gccversion = __VERSION__;
+# else /* !(defined (__GNUC__) && defined (__VERSION__)) */
+ gccversion = "3.3.2 (Debian)";
+# endif /* !(defined (__GNUC__) && defined (__VERSION__)) */
+
+ /* Insert current host name into banner on line 2 */
+ {
+ snprintf (ss, 1024, linux_panic[1].string,
+ release, sysname, gccversion, version);
+ linux_panic[1].string = ss;
+ }
+
+ BSOD_PAUSE (bst, 100000);
+ while (linux_panic[i].string)
+ {
+ if (linux_panic[i].delay != -1)
+ linedelay = linux_panic[i].delay * 1000;
+ BSOD_PAUSE (bst, linedelay);
+ BSOD_TEXT (bst, LEFT, linux_panic[i].string);
+ i++;
+ }
+
+ bst->y = bst->xgwa.height - bst->yoff
+ - bst->font->ascent - bst->font->descent;
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* VMS by jwz (text sent by Roland Barmettler <roli@barmettler.net>)
+ */
+static struct bsod_state *
+vms (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "vms", "VMS");
+
+ const char *sysname;
+ int char_delay = 0;
+ int dot_delay = 40000;
+ int chunk_delay = 500000;
+ char *s, *s1;
+ int i;
+ int arg_count;
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif /* UNAME */
+
+ __extension__
+
+ const char *lines[] = {
+ "%CNXMAN, Lost connection to system #\n"
+ "%SHADOW-I-VOLPROC, DSA0: shadow master has changed. "
+ "Dump file WILL be written if system crashes.\n"
+ "\n",
+ "",
+
+ "%CNXMAN, Quorum lost, blocking activity\n"
+ "%CNXMAN, Timed-out lost connection to system #\n"
+ "%CNXMAN, Timed-out lost connection to system #\n"
+ "%CNXMAN, Timed-out lost connection to system #\n"
+ "%CNXMAN, Proposing reconfiguration of the VMScluster\n",
+ "",
+
+ "%CNXMAN, Removed from VMScluster system #\n"
+ "%CNXMAN, Removed from VMScluster system #\n"
+ "%CNXMAN, Removed from VMScluster system #\n"
+ "%CNXMAN, Completing VMScluster state transition\n",
+
+ "\n"
+ "**** OpenVMS (TM) Alpha Operating system V7.3-1 - BUGCHECK ****\n"
+ "\n"
+ "** Bugcheck code = 000005DC: CLUEXIT, Node voluntarily exiting "
+ "VMScluster\n"
+ "** Crash CPU: 00 Primary CPU: 00 Active CPUs: 00000001\n"
+ "** Current Process = NULL\n"
+ "** Current PSB ID = 00000001\n"
+ "** Image Name =\n"
+ "\n"
+ "** Dumping error log buffers to HBVS unit 0\n"
+ "**** Unable to dump error log buffers to remaining shadow set members\n"
+ "** Error log buffers not dumped to HBVS unit 200\n"
+ "\n"
+ "** Dumping memory to HBVS unit 0\n"
+ "**** Starting compressed selective memory dump at #...\n",
+
+ "...",
+
+ "\n"
+ "**** Memory dump complete - not all processes or global pages saved\n",
+
+ "\n"
+ "halted CPU 0\n",
+ "",
+
+ "\n"
+ "halt code = 5\n"
+ "HALT instruction executed\n"
+ "PC = ffffffff800c3884\n",
+
+ "\n"
+ "CPU 0 booting\n",
+
+ "\n"
+ "resetting all I/O buses\n"
+ "\n"
+ "\n"
+ };
+ char *args[8];
+ int ids[3];
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = 10;
+ bst->top_margin = bst->bottom_margin = 10;
+
+ sysname = "VMS001";
+# ifdef HAVE_UNAME
+ {
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+ args[0] = malloc (strlen(sysname) + 7);
+ strcpy (args[0], sysname);
+ args[0][5] = 0;
+
+ /* Pick three numbers, 1-9, no overlaps. */
+ ids[0] = 1 + (random() % 9);
+ do { ids[1] = 1 + (random() % 9); } while (ids[1]==ids[0]);
+ do { ids[2] = 1 + (random() % 9); } while (ids[2]==ids[0] || ids[2]==ids[1]);
+
+ i = strlen(args[0])-1;
+ if (i < 6) i++;
+ args[0][i] = '0' + ids[0];
+ args[0][i+1] = 0;
+
+ for (s = args[0]; *s; s++)
+ if (isalpha(*s)) *s = toupper (*s);
+
+ args[1] = strdup (args[0]);
+ args[2] = strdup (args[0]); args[2][i] = '0' + ids[1];
+ args[3] = strdup (args[0]); args[3][i] = '0' + ids[2];
+
+ args[4] = strdup (args[1]);
+ args[5] = strdup (args[2]);
+ args[6] = strdup (args[3]);
+
+ {
+ time_t t = time ((time_t *) 0);
+ struct tm *tm = localtime (&t);
+ args[7] = malloc (30);
+ strftime (args[7], 29, "%d-%b-%Y %H:%M", tm);
+ for (s = args[7]; *s; s++)
+ if (isalpha(*s)) *s = toupper (*s);
+ }
+
+ arg_count = 0;
+ for (i = 0; i < countof(lines); i++)
+ {
+ const char *fmt = lines[i];
+ if (! strcmp (fmt, "..."))
+ {
+ int steps = 180 + (random() % 60);
+ while (--steps >= 0)
+ {
+ BSOD_TEXT (bst, LEFT, ".");
+ BSOD_PAUSE (bst, dot_delay);
+ }
+ }
+ else
+ {
+ char *fmt2 = malloc (strlen (fmt) * 2 + 1);
+ for (s = (char *) fmt, s1 = fmt2; *s; s++)
+ {
+ if (*s == '#')
+ {
+ strcpy (s1, args[arg_count++]);
+ s1 += strlen(s1);
+ }
+ else
+ *s1++ = *s;
+ }
+ *s1 = 0;
+ BSOD_CHAR_DELAY (bst, char_delay);
+ BSOD_TEXT (bst, LEFT, fmt2);
+ free (fmt2);
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_PAUSE (bst, chunk_delay);
+ }
+ }
+
+ for (i = 0; i < countof (args); i++)
+ free (args[i]);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* HVX (formerly GCOS6) and TPS6 crash
+ by Brian Garratt <brian-m.garratt@bull.co.uk>
+
+ GCOS6 is a Unix-like operating system developed by Honeywell in the
+ 1970s in collaboration with MIT and AT&T (who called their version
+ UNIX). Both are very much like MULTICS which Honeywell got from GE.
+
+ HVX ("High-performance Virtual System on Unix") is an AIX application
+ which emulates GCOS6 hardware on RS6000-like machines.
+ */
+static struct bsod_state *
+hvx (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "hvx", "HVX");
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT,
+ "(TP) Trap no E Effective address 00000000 Instruction D7DE\n"
+ "(TP) Registers :\n"
+ "(TP) B1 -> B7 03801B02 00000000 03880D45 038BABDB 0388AFFD"
+ " 0389B3F8 03972317\n"
+ "(TP) R1 -> R7 0001 0007 F10F 090F 0020 0106 0272\n"
+ "(TP) P I Z M1 0388A18B 3232 0000 FF00\n"
+ "(TP) Program counter is at offset 0028 from string YTPAD\n"
+ "(TP) User id of task which trapped is LT 626\n"
+ "(TP)?\n"
+ );
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, " TP CLOSE ALL");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\n(TP)?\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, " TP ABORT -LT ALL");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\n(TP)?\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, " TP STOP KILL");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "(TP)?\n"
+ "Core dumps initiated for selected HVX processes ...\n"
+ "Core dumps complete.\n"
+ "Fri Jul 19 15:53:09 2002\n"
+ "Live registers for cp 0:\n"
+ " P = 7de3 IW=0000 I=32 CI=30000000 S=80006013"
+ " IV=aa0 Level=13\n"
+ " R1-7 = 1f 913 13 4 8 0 0\n"
+ " B1-7 = 64e71b a93 50e 64e73c 6c2c 7000 b54\n"
+ "Memory dump starting to file /var/hvx/dp01/diag/Level2 ...\n"
+ "Memory dump complete.\n"
+ );
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* HPUX panic, by Tobias Klausmann <klausman@schwarzvogel.de>
+ */
+static struct bsod_state *
+hpux (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "hpux", "HPUX");
+ const char *sysname;
+ char buf[2048];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif /* UNAME */
+
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ sysname = "HPUX";
+# ifdef HAVE_UNAME
+ {
+ char *s;
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+ BSOD_TEXT (bst, LEFT,
+ " "
+ " "
+ " \n");
+ sprintf (buf, "%.100s [HP Release B.11.00] (see /etc/issue)\n", sysname);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_TEXT (bst, LEFT,
+ "Console Login:\n"
+ "\n"
+ " ******* Unexpected HPMC/TOC. Processor HPA FFFFFFFF'"
+ "FFFA0000 *******\n"
+ " GENERAL REGISTERS:\n"
+ "r00/03 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
+ "006C76C0\n"
+ "r04/07 00000000'00000001 00000000'0126E328 00000000'00000000 00000000'"
+ "0122B640\n"
+ "r08/11 00000000'00000000 00000000'0198CFC0 00000000'000476FE 00000000'"
+ "00000001\n"
+ "r12/15 00000000'40013EE8 00000000'08000080 00000000'4002530C 00000000'"
+ "4002530C\n"
+ "r16/19 00000000'7F7F2A00 00000000'00000001 00000000'00000000 00000000'"
+ "00000000\n"
+ "r20/23 00000000'006C8048 00000000'00000001 00000000'00000000 00000000'"
+ "00000000\n"
+ "r24/27 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
+ "00744378\n"
+ "r28/31 00000000'00000000 00000000'007DD628 00000000'0199F2B0 00000000'"
+ "00000000\n"
+ " CONTROL REGISTERS:\n"
+ "sr0/3 00000000'0F3B4000 00000000'0C2A2000 00000000'016FF800 00000000'"
+ "00000000\n"
+ "sr4/7 00000000'00000000 00000000'016FF800 00000000'0DBF1400 00000000'"
+ "00000000\n"
+ "pcq = 00000000'00000000.00000000'00104950 00000000'00000000.00000000'"
+ "00104A14\n"
+ "isr = 00000000'10240006 ior = 00000000'67D9E220 iir = 08000240 rctr = "
+ "7FF10BB6\n"
+ "\n"
+ "pid reg cr8/cr9 00007700'0000B3A9 00000000'0000C5D8\n"
+ "pid reg cr12/cr13 00000000'00000000 00000000'00000000\n"
+ "ipsw = 000000FF'080CFF1F iva = 00000000'0002C000 sar = 3A ccr = C0\n"
+ "tr0/3 00000000'006C76C0 00000000'00000001 00000000'00000000 00000000'"
+ "7F7CE000\n"
+ "tr4/7 00000000'03790000 0000000C'4FB68340 00000000'C07EE13F 00000000'"
+ "0199F2B0\n"
+ "eiem = FFFFFFF0'FFFFFFFF eirr = 80000000'00000000 itmr = 0000000C'"
+ "4FD8EDE1\n"
+ "cr1/4 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
+ "00000000\n"
+ "cr5/7 00000000'00000000 00000000'00000000 00000000'"
+ "00000000\n"
+ " MACHINE CHECK PARAMETERS:\n"
+ "Check Type = 00000000 CPU STATE = 9E000001 Cache Check = 00000000\n"
+ "TLB Check = 00000000 Bus Check = 00000000 PIM State = ? SIU "
+ "Status = ????????\n"
+ "Assists = 00000000 Processor = 00000000\n"
+ "Slave Addr = 00000000'00000000 Master Addr = 00000000'00000000\n"
+ "\n"
+ "\n"
+ "TOC, pcsq.pcoq = 0'0.0'104950 , isr.ior = 0'10240006.0'67d9e220\n"
+ "@(#)B2352B/9245XB HP-UX (B.11.00) #1: Wed Nov 5 22:38:19 PST 1997\n"
+ "Transfer of control: (display==0xd904, flags==0x0)\n"
+ "\n"
+ "\n"
+ "\n"
+ "*** A system crash has occurred. (See the above messages for details.)\n"
+ "*** The system is now preparing to dump physical memory to disk, for use\n"
+ "*** in debugging the crash.\n"
+ "\n"
+ "*** The dump will be a SELECTIVE dump: 40 of 256 megabytes.\n"
+ "*** To change this dump type, press any key within 10 seconds.\n"
+ "*** Proceeding with selective dump.\n"
+ "\n"
+ "*** The dump may be aborted at any time by pressing ESC.\n");
+
+ {
+ int i;
+ int steps = 11;
+ int size = 40;
+ for (i = 0; i <= steps; i++)
+ {
+ if (i > steps) i = steps;
+ sprintf (buf,
+ "*** Dumping: %3d%% complete (%d of 40 MB) (device 64:0x2)\r",
+ i * 100 / steps,
+ i * size / steps);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1500000);
+ }
+ }
+
+ BSOD_TEXT (bst, LEFT, "\n*** System rebooting.\n");
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* IBM OS/390 aka MVS aka z/OS.
+ Text from Dan Espen <dane@mk.telcordia.com>.
+ Apparently this isn't actually a crash, just a random session...
+ But who can tell.
+ */
+static struct bsod_state *
+os390 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "os390", "OS390");
+
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ BSOD_LINE_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT,
+ "\n*** System rebooting.\n"
+ "* ISPF Subtask abend *\n"
+ "SPF ENDED DUE TO ERROR+\n"
+ "READY\n"
+ "\n"
+ "IEA995I SYMPTOM DUMP OUTPUT\n"
+ " USER COMPLETION CODE=0222\n"
+ " TIME=23.00.51 SEQ=03210 CPU=0000 ASID=00AE\n"
+ " PSW AT TIME OF ERROR 078D1000 859DAF18 ILC 2 INTC 0D\n"
+ " NO ACTIVE MODULE FOUND\n"
+ " NAME=UNKNOWN\n"
+ " DATA AT PSW 059DAF12 - 00181610 0A0D9180 70644710\n"
+ " AR/GR 0: 00000000/80000000 1: 00000000/800000DE\n"
+ " 2: 00000000/196504DC 3: 00000000/00037A78\n"
+ " 4: 00000000/00037B78 5: 00000000/0003351C\n"
+ " 6: 00000000/0000F0AD 7: 00000000/00012000\n"
+ " 8: 00000000/059DAF10 9: 00000000/0002D098\n"
+ " A: 00000000/059D9F10 B: 00000000/059D8F10\n"
+ " C: 00000000/859D7F10 D: 00000000/00032D60\n"
+ " E: 00000000/00033005 F: 01000002/00000041\n"
+ " END OF SYMPTOM DUMP\n"
+ "ISPS014 - ** Logical screen request failed - abend 0000DE **\n"
+ "ISPS015 - ** Contact your system programmer or dialog developer.**\n"
+ "*** ISPF Main task abend ***\n"
+ "IEA995I SYMPTOM DUMP OUTPUT\n"
+ " USER COMPLETION CODE=0222\n"
+ " TIME=23.00.52 SEQ=03211 CPU=0000 ASID=00AE\n"
+ " PSW AT TIME OF ERROR 078D1000 8585713C ILC 2 INTC 0D\n"
+ " ACTIVE LOAD MODULE ADDRESS=05855000 OFFSET=0000213C\n"
+ " NAME=ISPMAIN\n"
+ " DATA AT PSW 05857136 - 00181610 0A0D9180 D3304770\n"
+ " GR 0: 80000000 1: 800000DE\n"
+ " 2: 00015260 3: 00000038\n"
+ " 4: 00012508 5: 00000000\n"
+ " 6: 000173AC 7: FFFFFFF8\n"
+ " 8: 05858000 9: 00012CA0\n"
+ " A: 05857000 B: 05856000\n"
+ " C: 85855000 D: 00017020\n"
+ " E: 85857104 F: 00000000\n"
+ " END OF SYMPTOM DUMP\n"
+ "READY\n"
+ "***");
+ BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* Compaq Tru64 Unix panic, by jwz as described by
+ Tobias Klausmann <klausman@schwarzvogel.de>
+ */
+static struct bsod_state *
+tru64 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "tru64", "Tru64");
+ const char *sysname;
+ char buf[2048];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+#endif /* UNAME */
+
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ sysname = "127.0.0.1";
+# ifdef HAVE_UNAME
+ {
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ }
+# endif /* !HAVE_UNAME */
+
+ sprintf (buf,
+ "Compaq Tru64 UNIX V5.1B (Rev. 2650) (%.100s) console\n"
+ "\n"
+ "login: ",
+ sysname);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 6000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "panic (cpu 0): trap: illegal instruction\n"
+ "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+ "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+ " \n"
+ "DUMP: blocks available: 1571600\n"
+ "DUMP: blocks wanted: 100802 (partial compressed dump) [OKAY]\n"
+ "DUMP: Device Disk Blocks Available\n"
+ "DUMP: ------ ---------------------\n"
+ "DUMP: 0x1300023 1182795 - 1571597 (of 1571598) [primary swap]\n"
+ "DUMP.prom: Open: dev 0x5100041, block 2102016: SCSI 0 11 0 2 200 0 0\n"
+ "DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
+ "DUMP: Writing data");
+
+ {
+ int i;
+ int steps = 4 + (random() % 8);
+ BSOD_CHAR_DELAY (bst, 1000000);
+ for (i = 0; i < steps; i++)
+ BSOD_TEXT (bst, LEFT, ".");
+ BSOD_CHAR_DELAY (bst, 0);
+ sprintf (buf, "[%dMB]\n", steps);
+ BSOD_TEXT (bst, LEFT, buf);
+ }
+
+ BSOD_TEXT (bst, LEFT,
+ "DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
+ "DUMP: crash dump complete.\n"
+ "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+ " \n"
+ "DUMP: second crash dump skipped: 'dump_savecnt' enforced.\n");
+ BSOD_PAUSE (bst, 4000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "halted CPU 0\n"
+ "\n"
+ "halt code = 5\n"
+ "HALT instruction executed\n"
+ "PC = fffffc00005863b0\n");
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "CPU 0 booting\n"
+ "\n"
+ "\n"
+ "\n");
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* MS-DOS, by jwz
+ */
+static struct bsod_state *
+msdos (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "msdos", "MSDOS");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "C:\\WINDOWS>");
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 8);
+
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "dir a:");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\nNot ready reading drive A\nAbort, Retry, Fail?");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 10);
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "f");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT,
+ "\n\n\nNot ready reading drive A\nAbort, Retry, Fail?");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 10);
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "f");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\nVolume in drive A has no label\n\n"
+ "Not ready reading drive A\nAbort, Retry, Fail?");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 12);
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "a");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\n\nC:\\WINDOWS>");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 999999);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* nvidia, by jwz.
+ *
+ * This is what happens if an Nvidia card goes into some crazy text mode.
+ * Most often seen on the second screen of a dual-head system when the
+ * proper driver isn't loaded.
+ */
+typedef struct { int fg; int bg; int bit; Bool blink; } nvcell;
+
+static void
+nvspatter (nvcell *grid, int rows, int cols, int ncolors, int nbits,
+ Bool fill_p)
+{
+ int max = rows * cols;
+ int from = fill_p ? 0 : random() % (max - 1);
+ int len = fill_p ? max : random() % (cols * 4);
+ int to = from + len;
+ int i;
+ Bool noisy = ((random() % 4) == 0);
+ Bool diag = (noisy || fill_p) ? 0 : ((random() % 4) == 0);
+
+ int fg = random() % ncolors;
+ int bg = random() % ncolors;
+ int blink = ((random() % 4) == 0);
+ int bit = (random() % nbits);
+
+ if (to > max) to = max;
+
+ if (diag)
+ {
+ int src = random() % (rows * cols);
+ int len2 = (cols / 2) - (random() % 5);
+ int j = src;
+ for (i = from; i < to; i++, j++)
+ {
+ if (j > src + len2 || j >= max)
+ j = src;
+ if (i >= max) abort();
+ if (j >= max) abort();
+ grid[j] = grid[i];
+ }
+ }
+ else
+ for (i = from; i < to; i++)
+ {
+ nvcell *cell = &grid[i];
+ cell->fg = fg;
+ cell->bg = bg;
+ cell->bit = bit;
+ cell->blink = blink;
+
+ if (noisy)
+ {
+ fg = random() % ncolors;
+ bg = random() % ncolors;
+ blink = ((random() % 8) == 0);
+ }
+ }
+}
+
+typedef struct {
+ struct bsod_state *bst;
+ GC gc1;
+ Pixmap bits[5];
+ int rows, cols;
+ int cellw, cellh;
+ nvcell *grid;
+ int ncolors;
+ unsigned long colors[256];
+ int tick;
+} nvstate;
+
+
+static void
+nvidia_free (struct bsod_state *bst)
+{
+ nvstate *nvs = (nvstate *) bst->closure;
+ int i;
+ XFreeColors (bst->dpy, bst->xgwa.colormap, nvs->colors, nvs->ncolors, 0);
+ for (i = 0; i < countof(nvs->bits); i++)
+ XFreePixmap (bst->dpy, nvs->bits[i]);
+ XFreeGC (bst->dpy, nvs->gc1);
+ free (nvs->grid);
+ free (nvs);
+}
+
+static int
+nvidia_draw (struct bsod_state *bst)
+{
+ nvstate *nvs = (nvstate *) bst->closure;
+ int x, y;
+
+ for (y = 0; y < nvs->rows; y++)
+ for (x = 0; x < nvs->cols; x++)
+ {
+ nvcell *cell = &nvs->grid[y * nvs->cols + x];
+ unsigned long fg = nvs->colors[cell->fg];
+ unsigned long bg = nvs->colors[cell->bg];
+ Bool flip = cell->blink && (nvs->tick & 1);
+ XSetForeground (bst->dpy, bst->gc, flip ? fg : bg);
+ XSetBackground (bst->dpy, bst->gc, flip ? bg : fg);
+ XCopyPlane (bst->dpy, nvs->bits[cell->bit], bst->window, bst->gc,
+ 0, 0, nvs->cellw, nvs->cellh,
+ x * nvs->cellw, y * nvs->cellh, 1L);
+ }
+
+ nvs->tick++;
+ if ((random() % 5) == 0) /* change the display */
+ nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
+ countof(nvs->bits), False);
+
+ return 250000;
+}
+
+
+static struct bsod_state *
+nvidia (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "nvidia", "nVidia");
+ nvstate *nvs = (nvstate *) calloc (1, sizeof (*nvs));
+
+ XGCValues gcv;
+ int i;
+
+ nvs->bst = bst;
+ bst->closure = nvs;
+ bst->draw_cb = nvidia_draw;
+ bst->free_cb = nvidia_free;
+
+ nvs->cols = 80;
+ nvs->rows = 25;
+ nvs->cellw = bst->xgwa.width / nvs->cols;
+ nvs->cellh = bst->xgwa.height / nvs->rows;
+ if (nvs->cellw < 8 || nvs->cellh < 18)
+ nvs->cellw = 8, nvs->cellh = 18;
+ nvs->cols = (bst->xgwa.width / nvs->cellw) + 1;
+ nvs->rows = (bst->xgwa.height / nvs->cellh) + 1;
+
+ nvs->grid = (nvcell *) calloc (sizeof(*nvs->grid), nvs->rows * nvs->cols);
+
+ /* Allocate colors
+ */
+ nvs->ncolors = 16;
+ for (i = 0; i < nvs->ncolors; i++)
+ {
+ XColor c;
+ c.red = random() & 0xFFFF;
+ c.green = random() & 0xFFFF;
+ c.blue = random() & 0xFFFF;
+ c.flags = DoRed|DoGreen|DoBlue;
+ XAllocColor (dpy, bst->xgwa.colormap, &c);
+ nvs->colors[i] = c.pixel;
+ }
+
+ /* Construct corrupted character bitmaps
+ */
+ for (i = 0; i < countof(nvs->bits); i++)
+ {
+ int j;
+
+ nvs->bits[i] = XCreatePixmap (dpy, window, nvs->cellw, nvs->cellh, 1);
+ if (!nvs->gc1) nvs->gc1 = XCreateGC (dpy, nvs->bits[i], 0, &gcv);
+
+ XSetForeground (dpy, nvs->gc1, 0);
+ XFillRectangle (dpy, nvs->bits[i], nvs->gc1, 0, 0,
+ nvs->cellw, nvs->cellh);
+ XSetForeground (dpy, nvs->gc1, 1);
+
+ if ((random() % 40) != 0)
+ for (j = 0; j < ((nvs->cellw * nvs->cellh) / 16); j++)
+ XFillRectangle (dpy, nvs->bits[i], nvs->gc1,
+ (random() % (nvs->cellw-2)) & ~1,
+ (random() % (nvs->cellh-2)) & ~1,
+ 2, 2);
+ }
+
+ /* Randomize the grid
+ */
+ nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
+ countof(nvs->bits), True);
+ for (i = 0; i < 20; i++)
+ nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
+ countof(nvs->bits), False);
+
+ return bst;
+}
+
+
+/*
+ * Simulate various Apple ][ crashes. The memory map encouraged many programs
+ * to use the primary hi-res video page for various storage, and the secondary
+ * hi-res page for active display. When it crashed into Applesoft or the
+ * monitor, it would revert to the primary page and you'd see memory garbage on
+ * the screen. Also, it was common for copy-protected games to use the primary
+ * text page for important code, because that made it really hard to
+ * reverse-engineer them. The result often looked like what this generates.
+ *
+ * The Apple ][ logic and video hardware is in apple2.c. The TV is emulated by
+ * analogtv.c for maximum realism
+ *
+ * Trevor Blackwell <tlb@tlb.org>
+ */
+
+static const char * const apple2_basic_errors[]={
+ "BREAK",
+ "NEXT WITHOUT FOR",
+ "SYNTAX ERROR",
+ "RETURN WITHOUT GOSUB",
+ "ILLEGAL QUANTITY",
+ "OVERFLOW",
+ "OUT OF MEMORY",
+ "BAD SUBSCRIPT ERROR",
+ "DIVISION BY ZERO",
+ "STRING TOO LONG",
+ "FORMULA TOO COMPLEX",
+ "UNDEF'D FUNCTION",
+ "OUT OF DATA"
+#if 0
+ ,
+ "DEFAULT ARGUMENTS ARE NOT ALLOWED IN DECLARATION OF FRIEND "
+ "TEMPLATE SPECIALIZATION"
+#endif
+
+};
+static const char * const apple2_dos_errors[]={
+ "VOLUME MISMATCH",
+ "I/O ERROR",
+ "DISK FULL",
+ "NO BUFFERS AVAILABLE",
+ "PROGRAM TOO LARGE",
+};
+
+static void a2controller_crash(apple2_sim_t *sim, int *stepno,
+ double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ char *s;
+ int i;
+
+ struct mydata {
+ int fillptr;
+ int fillbyte;
+ } *mine;
+
+ if (!sim->controller_data)
+ sim->controller_data = calloc(sizeof(struct mydata),1);
+ mine=(struct mydata *) sim->controller_data;
+
+ switch(*stepno) {
+ case 0:
+
+ a2_init_memory_active(sim);
+ sim->dec->powerup = 1000.0;
+
+ if (random()%3==0) {
+ st->gr_mode=0;
+ *next_actiontime+=0.4;
+ *stepno=100;
+ }
+ else if (random()%4==0) {
+ st->gr_mode=A2_GR_LORES;
+ if (random()%3==0) st->gr_mode |= A2_GR_FULL;
+ *next_actiontime+=0.4;
+ *stepno=100;
+ }
+ else if (random()%2==0) {
+ st->gr_mode=A2_GR_HIRES;
+ *stepno=300;
+ }
+ else {
+ st->gr_mode=A2_GR_HIRES;
+ *next_actiontime+=0.4;
+ *stepno=100;
+ }
+ break;
+
+ case 100:
+ /* An illegal instruction or a reset caused it to drop into the
+ assembly language monitor, where you could disassemble code & view
+ data in hex. */
+ if (random()%3==0) {
+ char ibytes[128];
+ char itext[128];
+ int addr=0xd000+random()%0x3000;
+ sprintf(ibytes,
+ "%02X",random()%0xff);
+ sprintf(itext,
+ "???");
+ sprintf(sim->printing_buf,
+ "\n\n"
+ "%04X: %-15s %s\n"
+ " A=%02X X=%02X Y=%02X S=%02X F=%02X\n"
+ "*",
+ addr,ibytes,itext,
+ random()%0xff, random()%0xff,
+ random()%0xff, random()%0xff,
+ random()%0xff);
+ sim->printing=sim->printing_buf;
+ a2_goto(st,23,1);
+ if (st->gr_mode) {
+ *stepno=180;
+ } else {
+ *stepno=200;
+ }
+ sim->prompt='*';
+ *next_actiontime += 2.0 + (random()%1000)*0.0002;
+ }
+ else {
+ /* Lots of programs had at least their main functionality in
+ Applesoft Basic, which had a lot of limits (memory, string
+ length, etc) and would sometimes crash unexpectedly. */
+ sprintf(sim->printing_buf,
+ "\n"
+ "\n"
+ "\n"
+ "?%s IN %d\n"
+ "\001]",
+ apple2_basic_errors[random() %
+ (sizeof(apple2_basic_errors)
+ /sizeof(char *))],
+ (1000*(random()%(random()%59+1)) +
+ 100*(random()%(random()%9+1)) +
+ 5*(random()%(random()%199+1)) +
+ 1*(random()%(random()%(random()%2+1)+1))));
+ sim->printing=sim->printing_buf;
+ a2_goto(st,23,1);
+ *stepno=110;
+ sim->prompt=']';
+ *next_actiontime += 2.0 + (random()%1000)*0.0002;
+ }
+ break;
+
+ case 110:
+ if (random()%3==0) {
+ /* This was how you reset the Basic interpreter. The sort of
+ incantation you'd have on a little piece of paper taped to the
+ side of your machine */
+ sim->typing="CALL -1370";
+ *stepno=120;
+ }
+ else if (random()%2==0) {
+ sim->typing="CATALOG\n";
+ *stepno=170;
+ }
+ else {
+ *next_actiontime+=1.0;
+ *stepno=999;
+ }
+ break;
+
+ case 120:
+ *stepno=130;
+ *next_actiontime += 0.5;
+ break;
+
+ case 130:
+ st->gr_mode=0;
+ a2_cls(st);
+ a2_goto(st,0,16);
+ for (s="APPLE ]["; *s; s++) a2_printc(st,*s);
+ a2_goto(st,23,0);
+ a2_printc(st,']');
+ *next_actiontime+=1.0;
+ *stepno=999;
+ break;
+
+ case 170:
+ if (random()%50==0) {
+ sprintf(sim->printing_buf,
+ "\nDISK VOLUME 254\n\n"
+ " A 002 HELLO\n"
+ "\n"
+ "]");
+ sim->printing=sim->printing_buf;
+ }
+ else {
+ sprintf(sim->printing_buf,"\n?%s\n]",
+ apple2_dos_errors[random()%
+ (sizeof(apple2_dos_errors) /
+ sizeof(char *))]);
+ sim->printing=sim->printing_buf;
+ }
+ *stepno=999;
+ *next_actiontime+=1.0;
+ break;
+
+ case 180:
+ if (random()%2==0) {
+ /* This was how you went back to text mode in the monitor */
+ sim->typing="FB4BG";
+ *stepno=190;
+ } else {
+ *next_actiontime+=1.0;
+ *stepno=999;
+ }
+ break;
+
+ case 190:
+ st->gr_mode=0;
+ a2_invalidate(st);
+ a2_printc(st,'\n');
+ a2_printc(st,'*');
+ *stepno=200;
+ *next_actiontime+=2.0;
+ break;
+
+ case 200:
+ /* This reset things into Basic */
+ if (random()%2==0) {
+ sim->typing="FAA6G";
+ *stepno=120;
+ }
+ else {
+ *stepno=999;
+ *next_actiontime+=sim->delay;
+ }
+ break;
+
+ case 300:
+ for (i=0; i<1500; i++) {
+ a2_poke(st, mine->fillptr, mine->fillbyte);
+ mine->fillptr++;
+ mine->fillbyte = (mine->fillbyte+1)&0xff;
+ }
+ *next_actiontime += 0.08;
+ /* When you hit c000, it changed video settings */
+ if (mine->fillptr>=0xc000) {
+ a2_invalidate(st);
+ st->gr_mode=0;
+ }
+ /* And it seemed to reset around here, I dunno why */
+ if (mine->fillptr>=0xcf00) *stepno=130;
+ break;
+
+ case 999:
+ break;
+
+ case A2CONTROLLER_FREE:
+ free(mine);
+ mine = 0;
+ break;
+ }
+}
+
+static int
+a2_draw (struct bsod_state *bst)
+{
+ apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
+ if (! sim) {
+ sim = apple2_start (bst->dpy, bst->window, 9999999, a2controller_crash);
+ bst->closure = sim;
+ }
+
+ if (! apple2_one_frame (sim)) {
+ bst->closure = 0;
+ }
+
+ return 10000;
+}
+
+static void
+a2_free (struct bsod_state *bst)
+{
+ apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
+ if (sim) {
+ sim->stepno = A2CONTROLLER_DONE;
+ a2_draw (bst); /* finish up */
+ if (bst->closure) abort(); /* should have been freed by now */
+ }
+}
+
+
+static struct bsod_state *
+apple2crash (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "apple2", "Apple2");
+ bst->draw_cb = a2_draw;
+ bst->free_cb = a2_free;
+ return bst;
+}
+
+
+static void
+a2controller_ransomware(apple2_sim_t *sim, int *stepno,
+ double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+
+ struct mydata {
+ const char *str;
+ Bool bold_p;
+ } *mine;
+
+ if (!sim->controller_data)
+ sim->controller_data = calloc(sizeof(struct mydata),1);
+ mine=(struct mydata *) sim->controller_data;
+
+ switch(*stepno) {
+ case 0:
+
+ st->gr_mode |= A2_GR_FULL;
+ a2_cls(st);
+ a2_goto(st,0,16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,2,0);
+ *stepno = 10;
+ *next_actiontime += 2;
+ break;
+
+ case 10:
+ a2_prints(st, "READY\n\n");
+ *stepno = 11;
+ *next_actiontime += 1;
+ break;
+
+ case 11:
+ a2_goto(st, 1, 0);
+ *stepno = 12;
+ mine->str =
+ ("\n"
+ " _____________________________________\n"
+ "/ \\\n"
+ "! OOPS YOUR FILES HAVE BEEN ENCRYPTED !\n"
+ "! ________________________ !\n"
+ "! ! ! !\n"
+ "! [/--\\] ! [ WHAT HAPPENED TO MY ] ! !\n"
+ "! [!] [!] ! [ COMPUTER? ] ! !\n"
+ "! [!] [!] ! ! !\n"
+ "! [######] ! [ CAN I RECOVER MY ] ! !\n"
+ "! [######] ! [ FILES? ] ! !\n"
+ "! [######] ! ! !\n"
+ "! [######] ! [ HOW DO I PAY? ] ! !\n"
+ "! ! ! !\n"
+ "! !________________________! !\n"
+ "! !\n"
+ "! BITCOIN ACCEPTED HERE !\n"
+ "\\_____________________________________/\n"
+ "\n"
+ "\n"
+ "WAITING FOR BLOCKCHAIN..@\n"
+ "\n"
+ "PLEASE INSERT NEXT FLOPPY: "
+ );
+ break;
+
+ case 12:
+ {
+ char c = *mine->str;
+ mine->str++;
+
+ if (c == 0)
+ {
+ *next_actiontime += 30;
+ *stepno = 0;
+ }
+ else if (c == '[')
+ mine->bold_p++;
+ else if (c == ']')
+ mine->bold_p--;
+ else
+ {
+ if (c == '@')
+ {
+ c = '.';
+ *next_actiontime += 2;
+ }
+
+ if (mine->bold_p)
+ c |= 0xC0;
+ a2_printc_noscroll(st, c);
+ if (c == '.')
+ *next_actiontime += 1;
+ }
+ }
+ break;
+
+ case A2CONTROLLER_FREE:
+ return;
+ }
+}
+
+
+static int
+a2_ransomware_draw (struct bsod_state *bst)
+{
+ apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
+ if (! sim) {
+ sim = apple2_start (bst->dpy, bst->window, 9999999,
+ a2controller_ransomware);
+ bst->closure = sim;
+ }
+
+ if (! apple2_one_frame (sim)) {
+ bst->closure = 0;
+ }
+
+ return 10000;
+}
+
+static struct bsod_state *
+apple2ransomware (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "apple2", "Apple2");
+ bst->draw_cb = a2_ransomware_draw;
+ bst->free_cb = a2_free;
+ return bst;
+}
+
+
+
+/* A crash spotted on a cash machine circa 2006, by jwz. I didn't note
+ what model it was; probably a Tranax Mini-Bank 1000 or similar vintage.
+ */
+static struct bsod_state *
+atm (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "atm", "ATM");
+
+ int pix_w, pix_h;
+ int x, y, i = 0;
+ float scale = 0.48;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ atm_png, sizeof(atm_png),
+ &pix_w, &pix_h, &mask);
+
+ XClearWindow (dpy, window);
+
+ while (pix_w <= bst->xgwa.width * scale &&
+ pix_h <= bst->xgwa.height * scale)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ i++;
+ }
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height - pix_h) / 2;
+ if (y < 0) y = 0;
+
+ if (i > 0)
+ {
+ int j;
+ XSetForeground (dpy, bst->gc,
+ get_pixel_resource (dpy, bst->xgwa.colormap,
+ "atm.background",
+ "ATM.Background"));
+ for (j = -1; j < pix_w; j += i+1)
+ XDrawLine (bst->dpy, pixmap, bst->gc, j, 0, j, pix_h);
+ for (j = -1; j < pix_h; j += i+1)
+ XDrawLine (bst->dpy, pixmap, bst->gc, 0, j, pix_w, j);
+ }
+
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+
+ return bst;
+}
+
+
+/* An Android phone boot loader, by jwz.
+ */
+static struct bsod_state *
+android (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "android", "Android");
+
+ unsigned long bg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.background",
+ "Android.Background");
+ unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.foreground",
+ "Android.Foreground");
+ unsigned long c1 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color1",
+ "Android.Foreground");
+ unsigned long c2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color2",
+ "Android.Foreground");
+ unsigned long c3 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color3",
+ "Android.Foreground");
+ unsigned long c4 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color4",
+ "Android.Foreground");
+ unsigned long c5 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color5",
+ "Android.Foreground");
+ unsigned long c6 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color6",
+ "Android.Foreground");
+ unsigned long c7 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color7",
+ "Android.Foreground");
+
+ const char *lines0[] = {
+ "Calculating... please wait\n",
+ "osbl: 0x499DF907\n",
+ "amss: 0x73162409\n",
+ "hboot: 0xE46C3327\n",
+ "boot: 0xBA570E7A\n",
+ "recovery: 0xC8BBA213\n",
+ "system: 0x87C3B1F0\n",
+ "\n",
+ "Press power key to go back.\n",
+ };
+
+ const char *lines1[] = {
+ "Checking SD card update...\n",
+ "",
+ " SD Checking...\n",
+ " Failed to open zipfile\n",
+ " loading preload_content...\n",
+ " [Caution] Preload Content Not Found\n",
+ " loading HTCUpdateZipName image...\n",
+ "",
+ " Checking...[PG46IMG.zip]\n",
+ "Please plug off USB\n",
+ };
+
+ const char *lines2[] = {
+ " SD Checking...\n",
+ " Loading...[PK76DIAG.zip]\n",
+ " No image!\n",
+ " Loading...[PK76DIAG.nbh]\n",
+ " No image or wrong image!\n",
+ " Loading...[PK76IMG.zip]\n",
+ " No image!\n",
+ " Loading...[PK76IMG.nbh]\n",
+ " No image or wrong image!\n",
+ " Loading...[PK76IMG.tar]\n",
+ " No image!\n",
+ " Loading...[PK76IMG.aes]\n",
+ " No image!\n",
+ " Loading...[PK76IMG.enc]\n",
+ " No image!\n",
+ };
+
+ int cw = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ int line_height = bst->font->ascent + bst->font->descent;
+
+ int state = 0;
+
+ Pixmap pixmap = 0, mask = 0;
+ int pix_w = 0, pix_h = 0;
+
+ pixmap = image_data_to_pixmap (dpy, window,
+ android_png, sizeof(android_png),
+ &pix_w, &pix_h, &mask);
+ if (! pixmap) abort();
+ {
+ int i, n = 0;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1,
+ mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+
+ bst->left_margin = (bst->xgwa.width - (cw * 40)) / 2;
+ if (bst->left_margin < 0) bst->left_margin = 0;
+
+ while (1) {
+ unsigned long delay =
+ ((state == 0 ||
+ state == countof(lines0) ||
+ state == countof(lines0) + countof(lines1) ||
+ state == countof(lines0) + countof(lines1) + countof(lines2))
+ ? 10000 : 0);
+ BSOD_LINE_DELAY (bst, delay);
+
+ if (state <= countof(lines0) + countof(lines1) + countof(lines2))
+ {
+ BSOD_COLOR (bst, bg, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR (bst, bg, c1);
+ BSOD_MOVETO (bst, bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff + line_height);
+ BSOD_TEXT (bst, LEFT, "*** UNLOCKED ***\n");
+ BSOD_COLOR (bst, c2, bg);
+ BSOD_TEXT (bst, LEFT,
+ "PRIMOU PVT SHIP S-OFF RL\n"
+ "HBOOT-1.17.0000\n"
+ "CPLD-None\n"
+ "MICROP-None\n"
+ "RADIO-3831.17.00.23_2\n"
+ "eMMC-bootmode: disabled\n"
+ "CPU-bootmode : disabled\n"
+ "HW Secure boot: enabled\n"
+ "MODEM PATH : OFF\n"
+ "May 15 2012, 10:28:15\n"
+ "\n");
+ BSOD_COLOR (bst, bg, c3);
+
+ if (pixmap)
+ {
+ int x = (bst->xgwa.width - pix_w) / 2;
+ int y = bst->xgwa.height - bst->yoff - pix_h;
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
+ }
+ }
+
+ if (state == countof(lines0) ||
+ state == countof(lines0) + countof(lines1) ||
+ state == countof(lines0) + countof(lines1) + countof(lines2))
+ {
+ BSOD_TEXT (bst, LEFT, "HBOOT USB\n");
+ BSOD_COLOR (bst, c4, bg);
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "<VOL UP> to previous item\n"
+ "<VOL DOWN> to next item\n"
+ "<POWER> to select item\n"
+ "\n");
+ BSOD_COLOR (bst, c5, bg); BSOD_TEXT (bst, LEFT, "FASTBOOT\n");
+ BSOD_COLOR (bst, c6, bg); BSOD_TEXT (bst, LEFT, "RECOVERY\n");
+ BSOD_COLOR (bst, c7, bg); BSOD_TEXT (bst, LEFT, "FACTORY RESET\n");
+ BSOD_COLOR (bst, c3, bg); BSOD_TEXT (bst, LEFT, "SIMLOCK\n");
+ BSOD_COLOR (bst, bg, c3); BSOD_TEXT (bst, LEFT, "HBOOT USB\n");
+ BSOD_COLOR (bst, fg, bg); BSOD_TEXT (bst, LEFT, "IMAGE CRC\n");
+ BSOD_COLOR (bst, c3, bg); BSOD_TEXT (bst, LEFT, "SHOW BARCODE\n");
+ BSOD_PAUSE (bst, 3000000);
+ }
+ else if (state < countof(lines0))
+ {
+ BSOD_TEXT (bst, LEFT, "IMAGE CRC\n\n");
+ BSOD_COLOR (bst, c5, bg);
+ {
+ int i;
+ for (i = 0; i <= state; i++) {
+ const char *s = lines0[i];
+ BSOD_COLOR (bst, (strchr(s, ':') ? c7 : c3), bg);
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ }
+ BSOD_PAUSE (bst, 500000);
+ if (state == countof(lines0)-1)
+ BSOD_PAUSE (bst, 2000000);
+ }
+ else if (state < countof(lines0) + countof(lines1))
+ {
+ BSOD_TEXT (bst, LEFT, "HBOOT\n\n");
+ BSOD_COLOR (bst, c5, bg);
+ {
+ int i;
+ for (i = countof(lines0); i <= state; i++) {
+ const char *s = lines1[i - countof(lines0)];
+ BSOD_COLOR (bst, (*s == ' ' ? c6 : c3), bg);
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ }
+ BSOD_PAUSE (bst, 500000);
+ if (state == countof(lines0) + countof(lines1) - 1)
+ BSOD_PAUSE (bst, 2000000);
+ }
+ else if (state < countof(lines0) + countof(lines1) + countof(lines2))
+ {
+ BSOD_TEXT (bst, LEFT, "HBOOT USB\n\n");
+ BSOD_COLOR (bst, c5, bg);
+ {
+ int i;
+ for (i = countof(lines0) + countof(lines1); i <= state; i++) {
+ const char *s = lines2[i - countof(lines0) - countof(lines1)];
+ BSOD_COLOR (bst, (*s == ' ' ? c6 : c3), bg);
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ }
+ BSOD_PAUSE (bst, 500000);
+ if (state == countof(lines0) + countof(lines1) + countof(lines2)-1)
+ BSOD_PAUSE (bst, 2000000);
+ }
+ else
+ break;
+
+ state++;
+ }
+
+ XClearWindow (dpy, window);
+
+ return bst;
+}
+
+
+
+
+/*****************************************************************************
+ *****************************************************************************/
+
+
+static const struct {
+ const char *name;
+ struct bsod_state * (*fn) (Display *, Window);
+} all_modes[] = {
+ { "Windows", windows_31 },
+ { "NT", windows_nt },
+ { "Win2K", windows_other },
+ { "Win10", windows_10 },
+ { "Ransomware", windows_ransomware },
+ { "Amiga", amiga },
+ { "Mac", mac },
+ { "MacsBug", macsbug },
+ { "Mac1", mac1 },
+ { "MacX", macx },
+ { "SCO", sco },
+ { "HVX", hvx },
+ { "HPPALinux", hppa_linux },
+ { "SparcLinux", sparc_linux },
+ { "BSD", bsd },
+ { "Atari", atari },
+#ifndef HAVE_JWXYZ
+ { "BlitDamage", blitdamage },
+#endif
+ { "Solaris", sparc_solaris },
+ { "Linux", linux_fsck },
+ { "HPUX", hpux },
+ { "OS390", os390 },
+ { "Tru64", tru64 },
+ { "VMS", vms },
+ { "OS2", os2 },
+ { "MSDOS", msdos },
+ { "Nvidia", nvidia },
+ { "Apple2", apple2crash },
+ { "ATM", atm },
+ { "GLaDOS", glados },
+ { "Android", android },
+ { "VMware", vmware },
+};
+
+
+struct driver_state {
+ const char *name;
+ int only, which, next_one;
+ int mode_duration;
+ int delay_remaining;
+ time_t start;
+ Bool debug_p, cycle_p;
+ struct bsod_state *bst;
+};
+
+
+static void
+hack_title (struct driver_state *dst)
+{
+# ifndef HAVE_JWXYZ
+ char *oname = 0;
+ XFetchName (dst->bst->dpy, dst->bst->window, &oname);
+ if (oname && !strncmp (oname, "BSOD: ", 6)) {
+ char *tail = oname + 4;
+ char *s = strchr (tail+1, ':');
+ char *nname;
+ if (s) tail = s;
+ nname = malloc (strlen (tail) + strlen (dst->name) + 20);
+ sprintf (nname, "BSOD: %s%s", dst->name, tail);
+ XStoreName (dst->bst->dpy, dst->bst->window, nname);
+ free (nname);
+ }
+# endif /* !HAVE_JWXYZ */
+}
+
+static void *
+bsod_init (Display *dpy, Window window)
+{
+ struct driver_state *dst = (struct driver_state *) calloc (1, sizeof(*dst));
+ char *s;
+
+ dst->mode_duration = get_integer_resource (dpy, "delay", "Integer");
+ if (dst->mode_duration < 3) dst->mode_duration = 3;
+
+ dst->debug_p = get_boolean_resource (dpy, "debug", "Boolean");
+
+ dst->only = -1;
+ dst->next_one = -1;
+ s = get_string_resource(dpy, "doOnly", "DoOnly");
+ if (s && !strcasecmp (s, "cycle"))
+ {
+ dst->which = -1;
+ dst->cycle_p = True;
+ }
+ else if (s && *s)
+ {
+ int count = countof(all_modes);
+ for (dst->only = 0; dst->only < count; dst->only++)
+ if (!strcasecmp (s, all_modes[dst->only].name))
+ break;
+ if (dst->only >= count)
+ {
+ fprintf (stderr, "%s: unknown -only mode: \"%s\"\n", progname, s);
+ dst->only = -1;
+ }
+ }
+ if (s) free (s);
+
+ dst->name = "none";
+ dst->which = -1;
+ return dst;
+}
+
+
+static unsigned long
+bsod_draw (Display *dpy, Window window, void *closure)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+ time_t now;
+ int time_left;
+
+ AGAIN:
+ now = time ((time_t *) 0);
+ time_left = dst->start + dst->mode_duration - now;
+
+ if (dst->bst && dst->bst->img_loader) /* still loading */
+ {
+ dst->bst->img_loader =
+ load_image_async_simple (dst->bst->img_loader, 0, 0, 0, 0, 0);
+ return 100000;
+ }
+
+ DELAY_NOW:
+ /* Rather than returning a multi-second delay from the draw() routine,
+ meaning "don't call us again for N seconds", we quantize that down
+ to 1/10th second intervals so that it's more responsive to
+ rotate/reshape events.
+ */
+ if (dst->delay_remaining)
+ {
+ int inc = 10000;
+ int this_delay = MIN (dst->delay_remaining, inc);
+ dst->delay_remaining = MAX (0, dst->delay_remaining - inc);
+ return this_delay;
+ }
+
+ if (! dst->bst && time_left > 0) /* run completed; wait out the delay */
+ {
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: %d left\n", progname, dst->name, time_left);
+ dst->start = 0;
+ if (time_left > 5) time_left = 5; /* Boooored now */
+ dst->delay_remaining = 1000000 * time_left;
+ }
+
+ else if (dst->bst) /* sub-mode currently running */
+ {
+ int this_delay = -1;
+
+ if (time_left > 0)
+ this_delay = bsod_pop (dst->bst);
+
+ /* XSync (dpy, False); slows down char drawing too much on HAVE_JWXYZ */
+
+ if (this_delay == 0)
+ goto AGAIN; /* no delay, not expired: stay here */
+ else if (this_delay >= 0)
+ {
+ dst->delay_remaining = this_delay; /* return; time to sleep */
+ goto DELAY_NOW;
+ }
+ else
+ { /* sub-mode run completed or expired */
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: done\n", progname, dst->name);
+ free_bsod_state (dst->bst);
+ dst->bst = 0;
+ return 0;
+ }
+ }
+ else /* launch a new sub-mode */
+ {
+ if (dst->next_one >= 0)
+ dst->which = dst->next_one, dst->next_one = -1;
+ else if (dst->cycle_p)
+ dst->which = (dst->which + 1) % countof(all_modes);
+ else if (dst->only >= 0)
+ dst->which = dst->only;
+ else
+ {
+ int count = countof(all_modes);
+ int *enabled = (int *) calloc (sizeof(*enabled), count + 1);
+ int nenabled = 0;
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ char name[100], class[100];
+ sprintf (name, "do%s", all_modes[i].name);
+ sprintf (class, "Do%s", all_modes[i].name);
+ if (get_boolean_resource (dpy, name, class))
+ enabled[nenabled++] = i;
+ }
+
+ if (nenabled == 0)
+ {
+ fprintf (stderr, "%s: no display modes enabled?\n", progname);
+ /* exit (-1); */
+ dst->which = dst->only = 0;
+ }
+ else if (nenabled == 1)
+ dst->which = enabled[0];
+ else
+ {
+ i = dst->which;
+ while (i == dst->which)
+ i = enabled[random() % nenabled];
+ dst->which = i;
+ }
+ free (enabled);
+ }
+
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: launch\n", progname,
+ all_modes[dst->which].name);
+
+ /* Run the mode setup routine...
+ */
+ if (dst->bst) abort();
+ dst->name = all_modes[dst->which].name;
+ dst->bst = all_modes[dst->which].fn (dpy, window);
+ dst->start = (dst->bst ? time ((time_t *) 0) : 0);
+
+ /* Reset the structure run state to the beginning,
+ and do some sanitization of the cursor position
+ before the first run.
+ */
+ if (dst->bst)
+ {
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: queue size: %d (%d)\n", progname,
+ dst->name, dst->bst->pos, dst->bst->queue_size);
+
+ hack_title (dst);
+ dst->bst->pos = 0;
+ dst->bst->x = dst->bst->current_left =
+ dst->bst->left_margin + dst->bst->xoff;
+
+ if (dst->bst->y <
+ dst->bst->top_margin + dst->bst->yoff + dst->bst->font->ascent)
+ dst->bst->y =
+ dst->bst->top_margin + dst->bst->yoff + dst->bst->font->ascent;
+ }
+ }
+
+ return 0;
+}
+
+
+static void
+bsod_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+
+ if (dst->bst &&
+ w == dst->bst->xgwa.width &&
+ h == dst->bst->xgwa.height)
+ return;
+
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: reshape reset\n", progname, dst->name);
+
+ /* just restart this mode and restart when the window is resized. */
+ if (dst->bst)
+ free_bsod_state (dst->bst);
+ dst->bst = 0;
+ dst->start = 0;
+ dst->delay_remaining = 0;
+ dst->next_one = dst->which;
+ dst->name = "none";
+ XClearWindow (dpy, window);
+}
+
+
+static Bool
+bsod_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+ Bool reset_p = False;
+
+ /* pick a new mode and restart when mouse clicked, or certain keys typed. */
+
+ if (screenhack_event_helper (dpy, window, event))
+ reset_p = True;
+
+ if (reset_p)
+ {
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: manual reset\n", progname, dst->name);
+ if (dst->bst)
+ free_bsod_state (dst->bst);
+ dst->bst = 0;
+ dst->start = 0;
+ dst->delay_remaining = 0;
+ dst->name = "none";
+ XClearWindow (dpy, window);
+ return True;
+ }
+ else
+ return False;
+}
+
+
+static void
+bsod_free (Display *dpy, Window window, void *closure)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+ if (dst->bst)
+ free_bsod_state (dst->bst);
+ free (dst);
+}
+
+
+static const char *bsod_defaults [] = {
+ "*delay: 45",
+ "*debug: False",
+
+ "*doOnly: ",
+ "*doWindows: True",
+ "*doNT: True",
+ "*doWin2K: True",
+ "*doWin10: True",
+ "*doRansomware: True",
+ "*doAmiga: True",
+ "*doMac: True",
+ "*doMacsBug: True",
+ "*doMac1: True",
+ "*doMacX: True",
+ "*doSCO: True",
+ "*doAtari: False", /* boring */
+ "*doBSD: False", /* boring */
+ "*doLinux: True",
+ "*doSparcLinux: False", /* boring */
+ "*doHPPALinux: True",
+ "*doBlitDamage: True",
+ "*doSolaris: True",
+ "*doHPUX: True",
+ "*doTru64: True",
+ "*doApple2: True",
+ "*doOS390: True",
+ "*doVMS: True",
+ "*doHVX: True",
+ "*doMSDOS: True",
+ "*doOS2: True",
+ "*doNvidia: True",
+ "*doATM: True",
+ "*doGLaDOS: True",
+ "*doAndroid: True",
+ "*doVMware: True",
+
+ ".foreground: White",
+ ".background: Black",
+
+ ".windows.foreground: White",
+ ".windows.background: #0000AA", /* EGA color 0x01. */
+
+ ".nt.foreground: White",
+ ".nt.background: #0000AA", /* EGA color 0x01. */
+
+ ".windowslh.foreground: White",
+ ".windowslh.background: #AA0000", /* EGA color 0x04. */
+ ".windowslh.background2: #AAAAAA", /* EGA color 0x07. */
+
+ ".win10.foreground: White",
+ ".win10.background: #1070AA",
+
+ ".ransomware.foreground: White",
+ ".ransomware.background: #841212",
+ ".ransomware.foreground2: Black", /* ransom note */
+ ".ransomware.background2: White",
+ ".ransomware.foreground3: Black", /* buttons */
+ ".ransomware.background3: #AAAAAA",
+ ".ransomware.link: #7BF9F6",
+ ".ransomware.timerheader: #BDBE02",
+
+
+ ".glaDOS.foreground: White",
+ ".glaDOS.background: #0000AA", /* EGA color 0x01. */
+
+ ".amiga.foreground: #FF0000",
+ ".amiga.background: Black",
+ ".amiga.background2: White",
+
+ ".mac.foreground: #FFFFFF",
+ ".mac.background: Black",
+
+ ".atari.foreground: Black",
+ ".atari.background: White",
+
+ ".macsbug.foreground: Black",
+ ".macsbug.background: White",
+ ".macsbug.borderColor: #AAAAAA",
+
+ ".mac1.foreground: Black",
+ ".mac1.background: White",
+
+ ".macx.foreground: White",
+ ".macx.textForeground: White",
+ ".macx.textBackground: Black",
+ ".macx.background: #888888",
+
+ ".macinstall.barForeground: #C0C0C0",
+ ".macinstall.barBackground: #888888",
+
+ ".sco.foreground: White",
+ ".sco.background: Black",
+
+ ".hvx.foreground: White",
+ ".hvx.background: Black",
+
+ ".linux.foreground: White",
+ ".linux.background: Black",
+
+ ".hppalinux.foreground: White",
+ ".hppalinux.background: Black",
+
+ ".sparclinux.foreground: White",
+ ".sparclinux.background: Black",
+
+ ".bsd.foreground: #c0c0c0",
+ ".bsd.background: Black",
+
+ ".solaris.foreground: Black",
+ ".solaris.background: White",
+
+ ".hpux.foreground: White",
+ ".hpux.background: Black",
+
+ ".os390.background: Black",
+ ".os390.foreground: Red",
+
+ ".tru64.foreground: White",
+ ".tru64.background: #0000AA", /* EGA color 0x01. */
+
+ ".vms.foreground: White",
+ ".vms.background: Black",
+
+ ".msdos.foreground: White",
+ ".msdos.background: Black",
+
+ ".os2.foreground: White",
+ ".os2.background: Black",
+
+ ".atm.foreground: Black",
+ ".atm.background: #FF6600",
+
+ ".android.foreground: Black",
+ ".android.background: White",
+ ".android.color1: #AA00AA", /* violet */
+ ".android.color2: #336633", /* green1 */
+ ".android.color3: #0000FF", /* blue */
+ ".android.color4: #CC7744", /* orange */
+ ".android.color5: #99AA55", /* green2 */
+ ".android.color6: #66AA33", /* green3 */
+ ".android.color7: #FF0000", /* red */
+
+ ".vmware.foreground: White",
+ ".vmware.foreground2: Yellow",
+ ".vmware.background: #a700a8", /* purple */
+
+ "*dontClearRoot: True",
+
+ ANALOGTV_DEFAULTS
+
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#endif
+
+ "*fontB: ",
+ "*fontC: ",
+
+# if defined(USE_IPHONE)
+
+ "*font: PxPlus IBM VGA8 16, Courier-Bold 14",
+ "*bigFont: ",
+
+ ".mac.font: Courier-Bold 18",
+ ".macsbug.font: Courier-Bold 8",
+ ".macx.font: Courier-Bold 14",
+ ".macdisk.font: Courier-Bold 14",
+ ".macinstall.font: Helvetica 12, Arial 12",
+ ".macinstall.bigFont: Helvetica 12, Arial 12",
+ ".msdos.font: PxPlus IBM VGA8 32, Courier-Bold 28",
+ ".nt.font: PxPlus IBM VGA8 12, Courier-Bold 10",
+ ".win10.font: Arial 12, Helvetica 12",
+ ".win10.bigFont: Arial 12, Helvetica 12",
+ ".win10.fontB: Arial 50, Helvetica 50",
+ ".win10.fontC: Arial 9, Helvetica 9",
+
+ /* The real Solaris font is ../OSX/Gallant19.bdf but I don't know how
+ to convert that to a TTF, so let's use Luxi Mono instead. */
+ ".solaris.font: Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
+
+ /* "Arial" loads "ArialMT" but "Arial Bold" does not load "Arial-BoldMT"? */
+ ".ransomware.font: Arial 11, Helvetica 11",
+ ".ransomware.fontB: Arial 9, Helvetica 9",
+ ".ransomware.fontC: Arial Bold 11, Arial-BoldMT 11, Helvetica Bold 11",
+
+# elif defined(HAVE_ANDROID)
+
+ "*font: PxPlus IBM VGA8 16",
+ "*bigFont: ",
+
+ ".mac.font: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+ ".macsbug.font: -*-courier-bold-r-*-*-*-80-*-*-m-*-*-*",
+ ".macx.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".macdisk.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".macinstall.font: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".macinstall.bigFont: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".msdos.font: PxPlus IBM VGA8 32",
+ ".nt.font: PxPlus IBM VGA8 12",
+ ".solaris.font: Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
+
+ ".win10.font: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".win10.bigFont: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".win10.fontB: -*-helvetica-medium-r-*-*-*-500-*-*-*-*-*-*",
+ ".win10.fontC: -*-helvetica-medium-r-*-*-*-90-*-*-*-*-*-*",
+
+ ".ransomware.font: -*-helvetica-medium-r-*-*-*-100-*-*-*-*-*-*",
+ ".ransomware.fontB: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-*-*",
+ ".ransomware.fontC: -*-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*",
+
+# elif defined(HAVE_COCOA)
+
+ "*font: PxPlus IBM VGA8 8, Courier Bold 9",
+ "*bigFont: PxPlus IBM VGA8 32, Courier Bold 24",
+
+ ".mac.font: Monaco 10, Courier Bold 9",
+ ".mac.bigFont: Monaco 18, Courier Bold 18",
+
+ ".macsbug.font: Monaco 10, Courier Bold 9",
+ ".macsbug.bigFont: Monaco 24, Courier Bold 24",
+
+ ".macx.font: Courier Bold 9",
+ ".macx.bigFont: Courier Bold 14",
+ ".macdisk.font: Courier Bold 9",
+ ".macdisk.bigFont: Courier Bold 18",
+ ".macinstall.font: Helvetica 24, Arial 24",
+ ".macinstall.bigFont: Helvetica 24, Arial 24",
+
+ ".hvx.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".hppalinux.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".linux.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".hpux.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".msdos.font: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".solaris.font: Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
+ ".solaris.bigFont: Luxi Mono 16, PxPlus IBM VGA8 16, Courier Bold 14",
+
+ ".win10.font: Arial 24, Helvetica 24",
+ ".win10.bigFont: Arial 24, Helvetica 24",
+ ".win10.fontB: Arial 100, Helvetica 100",
+ ".win10.fontC: Arial 16, Helvetica 16",
+
+ ".ransomware.font: Arial 24, Helvetica 24",
+ ".ransomware.bigFont: Arial 24, Helvetica 24",
+ ".ransomware.fontB: Arial 16, Helvetica 16",
+ ".ransomware.fontC: Arial Bold 24, Helvetica Bold 24",
+
+# else /* X11 */
+
+ "*font: 9x15bold",
+ "*bigFont: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+
+ ".macsbug.font: -*-courier-medium-r-*-*-*-80-*-*-m-*-*-*",
+ ".macsbug.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+
+ ".macdisk.font: -*-courier-bold-r-*-*-*-80-*-*-m-*-*-*",
+ ".macdisk.bigFont: -*-courier-bold-r-*-*-*-100-*-*-m-*-*-*",
+ ".macinstall.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".macinstall.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+
+ ".sco.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".hvx.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".hppalinux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".sparclinux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+
+ /* Some systems might have this, but I'm not sure where it comes from: */
+ /* ".bsd.font: -*-vga-normal-r-*-*-*-120-*-*-c-*-*-*", */
+ /* The fonts/misc/vga.pcf that comes with xdosemu has no XLFD name: */
+ ".bsd.font: vga",
+ ".bsd.bigFont: -*-vga-normal-r-*-*-*-220-*-*-c-*-*-*",
+
+ /* The original Solaris console font was:
+ -sun-gallant-demi-r-normal-*-*-140-*-*-c-*-*-*
+ Red Hat introduced Luxi Mono as its console font, which is similar
+ to Gallant. X.Org includes it but Debian and Fedora do not. */
+ ".solaris.font: -*-luxi mono-medium-r-normal--*-140-*-*-m-*-*-*",
+
+ ".hpux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".os390.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".tru64.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".vms.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".msdos.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+
+ ".win10.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".win10.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".win10.fontB: -*-helvetica-medium-r-*-*-*-240-*-*-*-*-*-*",
+ ".win10.fontC: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
+
+ ".ransomware.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".ransomware.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".ransomware.fontB: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
+ ".ransomware.fontC: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-*-*",
+
+
+# endif /* X11 */
+
+ 0
+};
+
+static const XrmOptionDescRec bsod_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-only", ".doOnly", XrmoptionSepArg, 0 },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+ { "-windows", ".doWindows", XrmoptionNoArg, "True" },
+ { "-no-windows", ".doWindows", XrmoptionNoArg, "False" },
+ { "-nt", ".doNT", XrmoptionNoArg, "True" },
+ { "-no-nt", ".doNT", XrmoptionNoArg, "False" },
+ { "-2k", ".doWin2K", XrmoptionNoArg, "True" },
+ { "-no-2k", ".doWin2K", XrmoptionNoArg, "False" },
+ { "-win10", ".doWin10", XrmoptionNoArg, "True" },
+ { "-no-win10", ".doWin10", XrmoptionNoArg, "False" },
+ { "-ransomware", ".doRansomware", XrmoptionNoArg, "True" },
+ { "-no-ransomware", ".doRansomware", XrmoptionNoArg, "False" },
+ { "-amiga", ".doAmiga", XrmoptionNoArg, "True" },
+ { "-no-amiga", ".doAmiga", XrmoptionNoArg, "False" },
+ { "-mac", ".doMac", XrmoptionNoArg, "True" },
+ { "-no-mac", ".doMac", XrmoptionNoArg, "False" },
+ { "-mac1", ".doMac1", XrmoptionNoArg, "True" },
+ { "-no-mac1", ".doMac1", XrmoptionNoArg, "False" },
+ { "-macx", ".doMacX", XrmoptionNoArg, "True" },
+ { "-no-macx", ".doMacX", XrmoptionNoArg, "False" },
+ { "-atari", ".doAtari", XrmoptionNoArg, "True" },
+ { "-no-atari", ".doAtari", XrmoptionNoArg, "False" },
+ { "-macsbug", ".doMacsBug", XrmoptionNoArg, "True" },
+ { "-no-macsbug", ".doMacsBug", XrmoptionNoArg, "False" },
+ { "-apple2", ".doApple2", XrmoptionNoArg, "True" },
+ { "-no-apple2", ".doApple2", XrmoptionNoArg, "False" },
+ { "-sco", ".doSCO", XrmoptionNoArg, "True" },
+ { "-no-sco", ".doSCO", XrmoptionNoArg, "False" },
+ { "-hvx", ".doHVX", XrmoptionNoArg, "True" },
+ { "-no-hvx", ".doHVX", XrmoptionNoArg, "False" },
+ { "-bsd", ".doBSD", XrmoptionNoArg, "True" },
+ { "-no-bsd", ".doBSD", XrmoptionNoArg, "False" },
+ { "-linux", ".doLinux", XrmoptionNoArg, "True" },
+ { "-no-linux", ".doLinux", XrmoptionNoArg, "False" },
+ { "-hppalinux", ".doHPPALinux", XrmoptionNoArg, "True" },
+ { "-no-hppalinux", ".doHPPALinux", XrmoptionNoArg, "False" },
+ { "-sparclinux", ".doSparcLinux", XrmoptionNoArg, "True" },
+ { "-no-sparclinux", ".doSparcLinux", XrmoptionNoArg, "False" },
+ { "-blitdamage", ".doBlitDamage", XrmoptionNoArg, "True" },
+ { "-no-blitdamage", ".doBlitDamage", XrmoptionNoArg, "False" },
+ { "-nvidia", ".doNvidia", XrmoptionNoArg, "True" },
+ { "-no-nvidia", ".doNvidia", XrmoptionNoArg, "False" },
+ { "-solaris", ".doSolaris", XrmoptionNoArg, "True" },
+ { "-no-solaris", ".doSolaris", XrmoptionNoArg, "False" },
+ { "-hpux", ".doHPUX", XrmoptionNoArg, "True" },
+ { "-no-hpux", ".doHPUX", XrmoptionNoArg, "False" },
+ { "-os390", ".doOS390", XrmoptionNoArg, "True" },
+ { "-no-os390", ".doOS390", XrmoptionNoArg, "False" },
+ { "-tru64", ".doHPUX", XrmoptionNoArg, "True" },
+ { "-no-tru64", ".doTru64", XrmoptionNoArg, "False" },
+ { "-vms", ".doVMS", XrmoptionNoArg, "True" },
+ { "-no-vms", ".doVMS", XrmoptionNoArg, "False" },
+ { "-msdos", ".doMSDOS", XrmoptionNoArg, "True" },
+ { "-no-msdos", ".doMSDOS", XrmoptionNoArg, "False" },
+ { "-os2", ".doOS2", XrmoptionNoArg, "True" },
+ { "-no-os2", ".doOS2", XrmoptionNoArg, "False" },
+ { "-atm", ".doATM", XrmoptionNoArg, "True" },
+ { "-no-atm", ".doATM", XrmoptionNoArg, "False" },
+ { "-glados", ".doGLaDOS", XrmoptionNoArg, "True" },
+ { "-no-glados", ".doGLaDOS", XrmoptionNoArg, "False" },
+ { "-android", ".doAndroid", XrmoptionNoArg, "True" },
+ { "-no-android", ".doAndroid", XrmoptionNoArg, "False" },
+ { "-vmware", ".doVMware", XrmoptionNoArg, "True" },
+ { "-no-vmware", ".doVMware", XrmoptionNoArg, "False" },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("BSOD", bsod)
diff --git a/hacks/bsod.man b/hacks/bsod.man
new file mode 100644
index 0000000..0043e7f
--- /dev/null
+++ b/hacks/bsod.man
@@ -0,0 +1,149 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+bsod - Blue Screen of Death emulator
+.SH SYNOPSIS
+.B bsod
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIseconds\fP]
+[\-fps]
+.SH DESCRIPTION
+The
+.I bsod
+program is the finest in personal computer emulation.
+.PP
+.I bsod
+steps through a set of screens, each one a recreation of a different failure
+mode of an operating system. Systems depicted include
+Windows 3.1, Windows 95, Windows NT, MS-DOS, AmigaDOS 1.3, Linux,
+SCO UNIX, BSD UNIX, HPUX, Solaris, Tru64, VMS, HVX/GCOS6, IBM OS/390, OS/2,
+MacOS (MacsBug, Bomb, Sad Mac, and OSX), Atari ST, Apple ][+, VMware and
+NCD X Terminals.
+.PP
+.SH OPTIONS
+.I bsod
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIdelay\fP
+The duration each crash-mode is displayed before selecting another.
+.TP 8
+.B \-only \fIwhich\fP
+Tell it to run only one mode, e.g., \fI\-only HPUX\fP.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+Notable X resources supported include the following, which control which
+hacks are displayed and which aren't.
+.BR doWindows ,
+.BR doNT ,
+.BR doWin2K ,
+.BR doWin10 ,
+.BR doRansomware ,
+.BR doAmiga ,
+.BR doMac ,
+.BR doMac1 ,
+.BR doMacsBug ,
+.BR doMacX ,
+.BR doSCO ,
+.BR doAtari ,
+.BR doBSD ,
+.BR doLinux ,
+.BR doSparcLinux ,
+.BR doHPPALinux ,
+.BR doBlitDamage ,
+.BR doSolaris ,
+.BR doHPUX ,
+.BR doApple2 ,
+.BR doOS390 ,
+.BR doTru64 ,
+.BR doVMS ,
+.BR doMSDOS ,
+.BR doOS2 ,
+.BR doHVX ,
+.BR doVMware ,
+and
+.BR doATM .
+Each of these is a Boolean resource, they all default to true, except
+for doAtari, doBSD, doSparcLinux, and doHPPALinux, which are turned off
+by default, because they're really not all that interesting looking
+unless you're a fan of those systems.
+
+There are command-line options for all of these:
+e.g., \fI\-bsd\fP, \fI\-no-bsd\fP. (Also note the \fI\-only\fP option.)
+.SH BUGS
+Unlike the systems being simulated, \fIbsod\fP does not require a
+reboot after running.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR http://www.microsoft.com/ ,
+.BR http://www.apple.com/ ,
+.BR http://www.sco.com/ ,
+.BR http://www.kernel.org/ ,
+and
+.BR http://www.amiga.de/ .
+.SH TRADEMARKS
+Microsoft Windows, Microsoft Windows 95, and Microsoft Windows NT are all
+registered trademarks of Microsoft Corporation. Apple Macintosh is a
+registered trademark of Apple Computer. Amiga is a registered trademark of
+Amiga International, Inc. Solaris is a trademark of Sun Microsystems. HP-UX
+is a trademark of HP Hewlett Packard Group LLC. Nvidia is a tradmark of
+Nvidia Corporation. VMS is probably a trademark of Digital Equipment
+Corporation. Atari ST is probably a trademark, too, but it's hard to tell who
+owns it. SCO is probably still a trademark of somebody these days, I guess.
+Linux is a registered trademark of Linus Torvalds, but it isn't his
+fault. OS/2 is a registered trademark of International Business Machines
+Corporation. VMware is a registered trademark of VMware, Inc. Android is a
+trademark of Google LLC. GladOS is a trademark of Aperture Science
+Incorporated.
+.SH COPYRIGHT
+Copyright \(co 1998-2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty. No animals were harmed during the testing of
+these simulations. Always mount a scratch monkey.
+.SH AUTHOR
+Concept cribbed from Stephen Martin <smartin@mks.com>. This version is by
+Jamie Zawinski <jwz@jwz.org>, with contributions from many others.
diff --git a/hacks/bubbles-default.c b/hacks/bubbles-default.c
new file mode 100644
index 0000000..0e729d5
--- /dev/null
+++ b/hacks/bubbles-default.c
@@ -0,0 +1,154 @@
+/* bubbles_default.c - pick images for bubbles.c
+ * By Jamie Zawinski <jwz@jwz.org>, 20-Jan-98.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "bubbles.h"
+#include "yarandom.h"
+
+#ifndef NO_DEFAULT_BUBBLE
+
+# define BLOOD 0
+# include "images/gen/blood1_png.h"
+# include "images/gen/blood2_png.h"
+# include "images/gen/blood3_png.h"
+# include "images/gen/blood4_png.h"
+# include "images/gen/blood5_png.h"
+# include "images/gen/blood6_png.h"
+# include "images/gen/blood7_png.h"
+# include "images/gen/blood8_png.h"
+# include "images/gen/blood9_png.h"
+# include "images/gen/blood10_png.h"
+# include "images/gen/blood11_png.h"
+
+# define BLUE 1
+# include "images/gen/blue1_png.h"
+# include "images/gen/blue2_png.h"
+# include "images/gen/blue3_png.h"
+# include "images/gen/blue4_png.h"
+# include "images/gen/blue5_png.h"
+# include "images/gen/blue6_png.h"
+# include "images/gen/blue7_png.h"
+# include "images/gen/blue8_png.h"
+# include "images/gen/blue9_png.h"
+# include "images/gen/blue10_png.h"
+# include "images/gen/blue11_png.h"
+
+# define GLASS 2
+# include "images/gen/glass1_png.h"
+# include "images/gen/glass2_png.h"
+# include "images/gen/glass3_png.h"
+# include "images/gen/glass4_png.h"
+# include "images/gen/glass5_png.h"
+# include "images/gen/glass6_png.h"
+# include "images/gen/glass7_png.h"
+# include "images/gen/glass8_png.h"
+# include "images/gen/glass9_png.h"
+# include "images/gen/glass10_png.h"
+# include "images/gen/glass11_png.h"
+
+# define JADE 3
+# include "images/gen/jade1_png.h"
+# include "images/gen/jade2_png.h"
+# include "images/gen/jade3_png.h"
+# include "images/gen/jade4_png.h"
+# include "images/gen/jade5_png.h"
+# include "images/gen/jade6_png.h"
+# include "images/gen/jade7_png.h"
+# include "images/gen/jade8_png.h"
+# include "images/gen/jade9_png.h"
+# include "images/gen/jade10_png.h"
+# include "images/gen/jade11_png.h"
+
+# define END 4
+
+
+bubble_png default_bubbles[50];
+int num_default_bubbles;
+
+void init_default_bubbles(void)
+{
+ int i = 0;
+ switch (random() % END) {
+
+# define DEF(N,S) default_bubbles[i].png = N; default_bubbles[i].size = S; i++
+
+ case BLOOD:
+ DEF(blood1_png, sizeof(blood1_png));
+ DEF(blood2_png, sizeof(blood2_png));
+ DEF(blood3_png, sizeof(blood3_png));
+ DEF(blood4_png, sizeof(blood4_png));
+ DEF(blood5_png, sizeof(blood5_png));
+ DEF(blood6_png, sizeof(blood6_png));
+ DEF(blood7_png, sizeof(blood7_png));
+ DEF(blood8_png, sizeof(blood8_png));
+ DEF(blood9_png, sizeof(blood9_png));
+ DEF(blood10_png, sizeof(blood10_png));
+ DEF(blood11_png, sizeof(blood11_png));
+ break;
+
+ case BLUE:
+ DEF(blue1_png, sizeof(blue1_png));
+ DEF(blue2_png, sizeof(blue2_png));
+ DEF(blue3_png, sizeof(blue3_png));
+ DEF(blue4_png, sizeof(blue4_png));
+ DEF(blue5_png, sizeof(blue5_png));
+ DEF(blue6_png, sizeof(blue6_png));
+ DEF(blue7_png, sizeof(blue7_png));
+ DEF(blue8_png, sizeof(blue8_png));
+ DEF(blue9_png, sizeof(blue9_png));
+ DEF(blue10_png, sizeof(blue10_png));
+ DEF(blue11_png, sizeof(blue11_png));
+ break;
+
+ case GLASS:
+ DEF(glass1_png, sizeof(glass1_png));
+ DEF(glass2_png, sizeof(glass2_png));
+ DEF(glass3_png, sizeof(glass3_png));
+ DEF(glass4_png, sizeof(glass4_png));
+ DEF(glass5_png, sizeof(glass5_png));
+ DEF(glass6_png, sizeof(glass6_png));
+ DEF(glass7_png, sizeof(glass7_png));
+ DEF(glass8_png, sizeof(glass8_png));
+ DEF(glass9_png, sizeof(glass9_png));
+ DEF(glass10_png, sizeof(glass10_png));
+ DEF(glass11_png, sizeof(glass11_png));
+ break;
+
+ case JADE:
+ DEF(jade1_png, sizeof(jade1_png));
+ DEF(jade2_png, sizeof(jade2_png));
+ DEF(jade3_png, sizeof(jade3_png));
+ DEF(jade4_png, sizeof(jade4_png));
+ DEF(jade5_png, sizeof(jade5_png));
+ DEF(jade6_png, sizeof(jade6_png));
+ DEF(jade7_png, sizeof(jade7_png));
+ DEF(jade8_png, sizeof(jade8_png));
+ DEF(jade9_png, sizeof(jade9_png));
+ DEF(jade10_png, sizeof(jade10_png));
+ DEF(jade11_png, sizeof(jade11_png));
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ default_bubbles[i].png = 0;
+ num_default_bubbles = i;
+}
+
+#endif /* NO_DEFAULT_BUBBLE */
diff --git a/hacks/bubbles.c b/hacks/bubbles.c
new file mode 100644
index 0000000..9cb2678
--- /dev/null
+++ b/hacks/bubbles.c
@@ -0,0 +1,1437 @@
+/* bubbles.c - frying pan / soft drink in a glass simulation */
+
+/*$Id: bubbles.c,v 1.30 2008/07/31 19:27:48 jwz Exp $*/
+
+/*
+ * Copyright (C) 1995-1996 James Macnicol
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ * I got my original inspiration for this by looking at the bottom of a
+ * frying pan while something was cooking and watching the little bubbles
+ * coming off the bottom of the pan as the oil was boiling joining together
+ * to form bigger bubbles and finally to *pop* and disappear. I had some
+ * time on my hands so I wrote this little xscreensaver module to imitate
+ * it. Now that it's done it reminds me more of the bubbles you get in
+ * a glass of fizzy soft drink.....
+ *
+ * The problem seemed to be that the position/size etc. of all the bubbles
+ * on the screen had to be remembered and searched through to find when
+ * bubbles hit each other and combined. To do this more efficiently, the
+ * window/screen is divided up into a square mesh of side length mesh_length
+ * and separate lists of bubbles contained in each cell of the mesh are
+ * kept. Only the cells in the immediate vicinity of the bubble in question
+ * are searched. This should make things more efficient although the whole
+ * thing seems to use up too much CPU, but then I'm using an ancient PC so
+ * perhaps it's not surprising .
+ * (Six months after I wrote the above I now have a Pentium with PCI graphics
+ * and things are _much_ nicer.)
+ *
+ * Author: James Macnicol
+ * Internet E-mail : j-macnicol@adfa.edu.au
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#undef DEBUG /* doesn't compile */
+
+#include <math.h>
+#include <limits.h>
+
+#ifndef VMS
+# include <sys/wait.h>
+#else /* VMS */
+# if __DECC_VER >= 50200000
+# include <sys/wait.h>
+# endif
+#endif /* VMS */
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "screenhack.h"
+#include "yarandom.h"
+#include "bubbles.h"
+#include "ximage-loader.h"
+
+#define FANCY_BUBBLES
+
+/*
+ * Public variables
+ */
+
+static const char *bubbles_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*simple: false",
+ "*broken: false",
+ "*delay: 10000",
+ "*quiet: false",
+ "*mode: float",
+ "*trails: false",
+ "*3D: false",
+ 0
+};
+
+static XrmOptionDescRec bubbles_options [] = {
+ { "-simple", ".simple", XrmoptionNoArg, "true" },
+#ifdef FANCY_BUBBLES
+ { "-broken", ".broken", XrmoptionNoArg, "true" },
+#endif
+ { "-quiet", ".quiet", XrmoptionNoArg, "true" },
+ { "-3D", ".3D", XrmoptionNoArg, "true" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-drop", ".mode", XrmoptionNoArg, "drop" },
+ { "-rise", ".mode", XrmoptionNoArg, "rise" },
+ { "-trails", ".trails", XrmoptionNoArg, "true" },
+ { 0, 0, 0, 0 }
+};
+
+/*
+ * Private variables
+ */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Bubble **mesh;
+ int mesh_length;
+ int mesh_width;
+ int mesh_height;
+ int mesh_cells;
+
+ int **adjacent_list;
+
+ int screen_width;
+ int screen_height;
+ int screen_depth;
+ unsigned int default_fg_pixel, default_bg_pixel;
+
+ int bubble_min_radius; /* For simple mode only */
+ int bubble_max_radius;
+ long *bubble_areas;
+ int *bubble_droppages;
+ GC draw_gc, erase_gc;
+
+#ifdef FANCY_BUBBLES
+ int num_bubble_pixmaps;
+ Bubble_Step **step_pixmaps;
+#endif
+
+ Bool simple;
+ Bool broken;
+ Bool quiet;
+ Bool threed;
+ Bool drop;
+ Bool trails;
+ int drop_dir;
+ int delay;
+};
+
+static int drop_bubble( struct state *st, Bubble *bb );
+
+/*
+ * To prevent forward references, some stuff is up here
+ */
+
+static long
+calc_bubble_area(struct state *st, int r)
+/* Calculate the area of a bubble of radius r */
+{
+#ifdef DEBUG
+ printf("%d %g\n", r,
+ 10.0 * PI * (double)r * (double)r * (double)r);
+#endif /* DEBUG */
+ if (st->threed)
+ return (long)(10.0 * PI * (double)r * (double)r * (double)r);
+ else
+ return (long)(10.0 * PI * (double)r * (double)r);
+}
+
+static void *
+xmalloc(size_t size)
+/* Safe malloc */
+{
+ void *ret;
+
+ if ((ret = malloc(size)) == NULL) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ return ret;
+}
+
+#ifdef DEBUG
+static void
+die_bad_bubble(Bubble *bb)
+/* This is for use with GDB */
+{
+ fprintf(stderr, "Bad bubble detected at 0x%x!\n", (int)bb);
+ exit(1);
+}
+#endif
+
+static int
+null_bubble(Bubble *bb)
+/* Returns true if the pointer passed is NULL. If not then this checks to
+see if the bubble is valid (i.e. the (x,y) position is valid and the magic
+number is set correctly. This only a sanity check for debugging and is
+turned off if DEBUG isn't set. */
+{
+ if (bb == (Bubble *)NULL)
+ return 1;
+#ifdef DEBUG
+ if ((bb->cell_index < 0) || (bb->cell_index > st->mesh_cells)) {
+ fprintf(stderr, "cell_index = %d\n", bb->cell_index);
+ die_bad_bubble(bb);
+ }
+ if (bb->magic != BUBBLE_MAGIC) {
+ fprintf(stderr, "Magic = %d\n", bb->magic);
+ die_bad_bubble(bb);
+ }
+ if (st->simple) {
+ if ((bb->x < 0) || (bb->x > st->screen_width) ||
+ (bb->y < 0) || (bb->y > st->screen_height) ||
+ (bb->radius < st->bubble_min_radius) || (bb->radius >
+ st->bubble_max_radius)) {
+ fprintf(stderr,
+ "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
+ bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
+ die_bad_bubble(bb);
+ }
+#ifdef FANCY_BUBBLES
+ } else {
+ if ((bb->x < 0) || (bb->x > st->screen_width) ||
+ (bb->y < 0) || (bb->y > st->screen_height) ||
+ (bb->radius < st->step_pixmaps[0]->radius) ||
+ (bb->radius > st->step_pixmaps[st->num_bubble_pixmaps-1]->radius)) {
+ fprintf(stderr,
+ "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
+ bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
+ die_bad_bubble(bb);
+ }
+#endif
+ }
+#endif /* DEBUG */
+ return 0;
+}
+
+#ifdef DEBUG
+static void
+print_bubble_list(Bubble *bb)
+/* Print list of where all the bubbles are. For debugging purposes only. */
+{
+ if (! null_bubble(bb)) {
+ printf(" (%d, %d) %d\n", bb->x, bb->y, bb->radius);
+ print_bubble_list(bb->next);
+ }
+}
+#endif /* DEBUG */
+
+static void
+add_bubble_to_list(Bubble **list, Bubble *bb)
+/* Take a pointer to a list of bubbles and stick bb at the head of the
+ list. */
+{
+ Bubble *head = *list;
+
+ if (null_bubble(head)) {
+ bb->prev = (Bubble *)NULL;
+ bb->next = (Bubble *)NULL;
+ } else {
+ bb->next = head;
+ bb->prev = (Bubble *)NULL;
+ head->prev = bb;
+ }
+ *list = bb;
+}
+
+
+/*
+ * Mesh stuff
+ */
+
+
+static void
+init_mesh (struct state *st)
+/* Setup the mesh of bubbles */
+{
+ int i;
+
+ st->mesh = (Bubble **)xmalloc(st->mesh_cells * sizeof(Bubble *));
+ for (i = 0; i < st->mesh_cells; i++)
+ st->mesh[i] = (Bubble *)NULL;
+}
+
+static int
+cell_to_mesh(struct state *st, int x, int y)
+/* convert cell coordinates to mesh index */
+{
+#ifdef DEBUG
+ if ((x < 0) || (y < 0)) {
+ fprintf(stderr, "cell_to_mesh: x = %d, y = %d\n", x, y);
+ exit(1);
+ }
+#endif
+ return ((st->mesh_width * y) + x);
+}
+
+static void
+mesh_to_cell(struct state *st, int mi, int *cx, int *cy)
+/* convert mesh index into cell coordinates */
+{
+ *cx = mi % st->mesh_width;
+ *cy = mi / st->mesh_width;
+}
+
+static int
+pixel_to_mesh(struct state *st, int x, int y)
+/* convert screen coordinates into mesh index */
+{
+ return cell_to_mesh(st, (x / st->mesh_length), (y / st->mesh_length));
+}
+
+static int
+verify_mesh_index(struct state *st, int x, int y)
+/* check to see if (x,y) is in the mesh */
+{
+ if ((x < 0) || (y < 0) || (x >= st->mesh_width) || (y >= st->mesh_height))
+ return (-1);
+ return (cell_to_mesh(st, x, y));
+}
+
+#ifdef DEBUG
+static void
+print_adjacents(int *adj)
+/* Print a list of the cells calculated above. For debugging only. */
+{
+ int i;
+
+ printf("(");
+ for (i = 0; i < 8; i++)
+ printf("%d ", adj[i]);
+ printf(")\n");
+}
+#endif /* DEBUG */
+
+static void
+add_to_mesh(struct state *st, Bubble *bb)
+/* Add the given bubble to the mesh by sticking it on the front of the
+list. bb is already allocated so no need to malloc() anything, just
+adjust pointers. */
+{
+#ifdef DEBUG
+ if (null_bubble(bb)) {
+ fprintf(stderr, "Bad bubble passed to add_to_mesh()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ add_bubble_to_list(&st->mesh[bb->cell_index], bb);
+}
+
+#ifdef DEBUG
+static void
+print_mesh (struct state *st)
+/* Print the contents of the mesh */
+{
+ int i;
+
+ for (i = 0; i < st->mesh_cells; i++) {
+ if (! null_bubble(st->mesh[i])) {
+ printf("Mesh cell %d\n", i);
+ print_bubble_list(st->mesh[i]);
+ }
+ }
+}
+
+static void
+valid_mesh (struct state *st)
+/* Check to see if the mesh is Okay. For debugging only. */
+{
+ int i;
+ Bubble *b;
+
+ for (i = 0; i < st->mesh_cells; i++) {
+ b = st->mesh[i];
+ while (! null_bubble(b))
+ b = b->next;
+ }
+}
+
+static int
+total_bubbles (struct state *st)
+/* Count how many bubbles there are in total. For debugging only. */
+{
+ int rv = 0;
+ int i;
+ Bubble *b;
+
+ for (i = 0; i < st->mesh_cells; i++) {
+ b = st->mesh[i];
+ while (! null_bubble(b)) {
+ rv++;
+ b = b->next;
+ }
+ }
+
+ return rv;
+}
+#endif /* DEBUG */
+
+static void
+calculate_adjacent_list (struct state *st)
+/* Calculate the list of cells adjacent to a particular cell for use
+ later. */
+{
+ int i;
+ int ix, iy;
+
+ st->adjacent_list = (int **)xmalloc(st->mesh_cells * sizeof(int *));
+ for (i = 0; i < st->mesh_cells; i++) {
+ st->adjacent_list[i] = (int *)xmalloc(9 * sizeof(int));
+ mesh_to_cell(st, i, &ix, &iy);
+ st->adjacent_list[i][0] = verify_mesh_index(st, --ix, --iy);
+ st->adjacent_list[i][1] = verify_mesh_index(st, ++ix, iy);
+ st->adjacent_list[i][2] = verify_mesh_index(st, ++ix, iy);
+ st->adjacent_list[i][3] = verify_mesh_index(st, ix, ++iy);
+ st->adjacent_list[i][4] = verify_mesh_index(st, ix, ++iy);
+ st->adjacent_list[i][5] = verify_mesh_index(st, --ix, iy);
+ st->adjacent_list[i][6] = verify_mesh_index(st, --ix, iy);
+ st->adjacent_list[i][7] = verify_mesh_index(st, ix, --iy);
+ st->adjacent_list[i][8] = i;
+ }
+}
+
+static void
+adjust_areas (struct state *st)
+/* Adjust areas of bubbles so we don't get overflow in weighted_mean() */
+{
+ double maxvalue;
+ long maxarea;
+ long factor;
+ int i;
+
+#ifdef FANCY_BUBBLES
+ if (st->simple)
+ maxarea = st->bubble_areas[st->bubble_max_radius+1];
+ else
+ maxarea = st->step_pixmaps[st->num_bubble_pixmaps]->area;
+#else /* !FANCY_BUBBLES */
+ maxarea = st->bubble_areas[st->bubble_max_radius+1];
+#endif /* !FANCY_BUBBLES */
+ maxvalue = (double)st->screen_width * 2.0 * (double)maxarea;
+ factor = (long)ceil(maxvalue / (double)LONG_MAX);
+ if (factor > 1) {
+ /* Overflow will occur in weighted_mean(). We must divide areas
+ each by factor so it will never do so. */
+#ifdef FANCY_BUBBLES
+ if (st->simple) {
+ for (i = st->bubble_min_radius; i <= st->bubble_max_radius+1; i++) {
+ st->bubble_areas[i] /= factor;
+ if (st->bubble_areas[i] == 0)
+ st->bubble_areas[i] = 1;
+ }
+ } else {
+ for (i = 0; i <= st->num_bubble_pixmaps; i++) {
+#ifdef DEBUG
+ printf("area = %ld", st->step_pixmaps[i]->area);
+#endif /* DEBUG */
+ st->step_pixmaps[i]->area /= factor;
+ if (st->step_pixmaps[i]->area == 0)
+ st->step_pixmaps[i]->area = 1;
+#ifdef DEBUG
+ printf("-> %ld\n", st->step_pixmaps[i]->area);
+#endif /* DEBUG */
+ }
+ }
+#else /* !FANCY_BUBBLES */
+ for (i = st->bubble_min_radius; i <= st->bubble_max_radius+1; i++) {
+ st->bubble_areas[i] /= factor;
+ if (st->bubble_areas[i] == 0)
+ st->bubble_areas[i] = 1;
+ }
+#endif /* !FANCY_BUBBLES */
+ }
+#ifdef DEBUG
+ printf("maxarea = %ld\n", maxarea);
+ printf("maxvalue = %g\n", maxvalue);
+ printf("LONG_MAX = %ld\n", LONG_MAX);
+ printf("factor = %ld\n", factor);
+#endif /* DEBUG */
+}
+
+/*
+ * Bubbles stuff
+ */
+
+static Bubble *
+new_bubble (struct state *st)
+/* Add a new bubble at some random position on the screen of the smallest
+size. */
+{
+ Bubble *rv = (Bubble *)xmalloc(sizeof(Bubble));
+
+ /* Can't use null_bubble() here since magic number hasn't been set */
+ if (rv == (Bubble *)NULL) {
+ fprintf(stderr, "Ran out of memory!\n");
+ exit(1);
+ }
+
+ if (st->simple) {
+ rv->radius = st->bubble_min_radius;
+ rv->area = st->bubble_areas[st->bubble_min_radius];
+#ifdef FANCY_BUBBLES
+ } else {
+ rv->step = 0;
+ rv->radius = st->step_pixmaps[0]->radius;
+ rv->area = st->step_pixmaps[0]->area;
+#endif /* FANCY_BUBBLES */
+ }
+ rv->visible = 0;
+ rv->magic = BUBBLE_MAGIC;
+ rv->x = random() % st->screen_width;
+ rv->y = random() % st->screen_height;
+ rv->cell_index = pixel_to_mesh(st, rv->x, rv->y);
+
+ return rv;
+}
+
+static void
+show_bubble(struct state *st, Bubble *bb)
+/* paint the bubble on the screen */
+{
+ if (null_bubble(bb)) {
+ fprintf(stderr, "NULL bubble passed to show_bubble\n");
+ exit(1);
+ }
+
+ if (! bb->visible) {
+ bb->visible = 1;
+
+ if (st->simple) {
+ XDrawArc(st->dpy, st->window, st->draw_gc, (bb->x - bb->radius),
+ (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
+ 360*64);
+ } else {
+#ifdef FANCY_BUBBLES
+ XSetClipOrigin(st->dpy, st->step_pixmaps[bb->step]->draw_gc,
+ (bb->x - bb->radius),
+ (bb->y - bb->radius));
+
+ XCopyArea(st->dpy, st->step_pixmaps[bb->step]->ball, st->window,
+ st->step_pixmaps[bb->step]->draw_gc,
+ 0, 0, (bb->radius * 2),
+ (bb->radius * 2),
+ (bb->x - bb->radius),
+ (bb->y - bb->radius));
+#endif /* FANCY_BUBBLES */
+ }
+ }
+}
+
+static void
+hide_bubble(struct state *st, Bubble *bb)
+/* erase the bubble */
+{
+ if (null_bubble(bb)) {
+ fprintf(stderr, "NULL bubble passed to hide_bubble\n");
+ exit(1);
+ }
+
+ if (bb->visible) {
+ bb->visible = 0;
+
+ if (st->simple) {
+ XDrawArc(st->dpy, st->window, st->erase_gc, (bb->x - bb->radius),
+ (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
+ 360*64);
+ } else {
+#ifdef FANCY_BUBBLES
+ if (! st->broken) {
+ XSetClipOrigin(st->dpy, st->step_pixmaps[bb->step]->erase_gc,
+ (bb->x - bb->radius), (bb->y - bb->radius));
+
+ XFillRectangle(st->dpy, st->window, st->step_pixmaps[bb->step]->erase_gc,
+ (bb->x - bb->radius),
+ (bb->y - bb->radius),
+ (bb->radius * 2),
+ (bb->radius * 2));
+ }
+#endif /* FANCY_BUBBLES */
+ }
+ }
+}
+
+static void
+delete_bubble_in_mesh(struct state *st, Bubble *bb, int keep_bubble)
+/* Delete an individual bubble, adjusting list of bubbles around it.
+ If keep_bubble is true then the bubble isn't actually deleted. We
+ use this to allow bubbles to change mesh cells without reallocating,
+ (it needs this when two bubbles collide and the centre position is
+ recalculated, and this may stray over a mesh boundary). */
+{
+ if ((!null_bubble(bb->prev)) && (!null_bubble(bb->next))) {
+ bb->prev->next = bb->next;
+ bb->next->prev = bb->prev;
+ } else if ((!null_bubble(bb->prev)) &&
+ (null_bubble(bb->next))) {
+ bb->prev->next = (Bubble *)NULL;
+ bb->next = st->mesh[bb->cell_index];
+ } else if ((null_bubble(bb->prev)) &&
+ (!null_bubble(bb->next))) {
+ bb->next->prev = (Bubble *)NULL;
+ st->mesh[bb->cell_index] = bb->next;
+ bb->next = st->mesh[bb->cell_index];
+ } else {
+ /* Only item on list */
+ st->mesh[bb->cell_index] = (Bubble *)NULL;
+ }
+ if (! keep_bubble)
+ free(bb);
+}
+
+static unsigned long
+ulongsqrint(int x)
+/* Saves ugly inline code */
+{
+ return ((unsigned long)x * (unsigned long)x);
+}
+
+static Bubble *
+get_closest_bubble(struct state *st, Bubble *bb)
+/* Find the closest bubble touching the this bubble, NULL if none are
+ touching. */
+{
+ Bubble *rv = (Bubble *)NULL;
+ Bubble *tmp;
+ unsigned long separation2, touchdist2;
+ int dx, dy;
+ unsigned long closest2 = ULONG_MAX;
+ int i;
+
+#ifdef DEBUG
+ if (null_bubble(bb)) {
+ fprintf(stderr, "NULL pointer 0x%x passed to get_closest_bubble()!",
+ (int)bb);
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ for (i = 0; i < 9; i++) {
+ /* There is a bug here where bb->cell_index is negaitve.. */
+#ifdef DEBUG
+ if ((bb->cell_index < 0) || (bb->cell_index >= st->mesh_cells)) {
+ fprintf(stderr, "bb->cell_index = %d\n", bb->cell_index);
+ exit(1);
+ }
+#endif /* DEBUG */
+/* printf("%d,", bb->cell_index); */
+ if (st->adjacent_list[bb->cell_index][i] != -1) {
+ tmp = st->mesh[st->adjacent_list[bb->cell_index][i]];
+ while (! null_bubble(tmp)) {
+ if (tmp != bb) {
+ dx = tmp->x - bb->x;
+ dy = tmp->y - bb->y;
+ separation2 = ulongsqrint(dx) + ulongsqrint(dy);
+ /* Add extra leeway so circles _never_ overlap */
+ touchdist2 = ulongsqrint(tmp->radius + bb->radius + 2);
+ if ((separation2 <= touchdist2) && (separation2 <
+ closest2)) {
+ rv = tmp;
+ closest2 = separation2;
+ }
+ }
+ tmp = tmp->next;
+ }
+ }
+ }
+
+ return rv;
+}
+
+#ifdef DEBUG
+static void
+ldr_barf (struct state *st)
+{
+}
+#endif /* DEBUG */
+
+static long
+long_div_round(long num, long dem)
+{
+ long divvie, moddo;
+
+#ifdef DEBUG
+ if ((num < 0) || (dem < 0)) {
+ fprintf(stderr, "long_div_round: %ld, %ld\n", num, dem);
+ ldr_barf();
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ divvie = num / dem;
+ moddo = num % dem;
+ if (moddo > (dem / 2))
+ ++divvie;
+
+#ifdef DEBUG
+ if ((divvie < 0) || (moddo < 0)) {
+ fprintf(stderr, "long_div_round: %ld, %ld\n", divvie, moddo);
+ ldr_barf();
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ return divvie;
+}
+
+static int
+weighted_mean(int n1, int n2, long w1, long w2)
+/* Mean of n1 and n2 respectively weighted by weights w1 and w2. */
+{
+#ifdef DEBUG
+ if ((w1 <= 0) || (w2 <= 0)) {
+ fprintf(stderr,
+ "Bad weights passed to weighted_mean() - (%d, %d, %ld, %ld)!\n",
+ n1, n2, w1, w2);
+ exit(1);
+ }
+#endif /* DEBUG */
+ return ((int)long_div_round((long)n1 * w1 + (long)n2 * w2,
+ w1 + w2));
+}
+
+static int
+bubble_eat(struct state *st, Bubble *diner, Bubble *food)
+/* The diner eats the food. Returns true (1) if the diner still exists */
+{
+ int i;
+ int newmi;
+
+#ifdef DEBUG
+ if ((null_bubble(diner)) || (null_bubble(food))) {
+ fprintf(stderr, "Bad bubbles passed to bubble_eat()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ /* We hide the diner even in the case that it doesn't grow so that
+ if the food overlaps its boundary it is replaced. This could
+ probably be solved by letting bubbles eat others which are close
+ but not quite touching. It's probably worth it, too, since we
+ would then not have to redraw bubbles which don't change in
+ size. */
+
+ hide_bubble(st, diner);
+ hide_bubble(st, food);
+ diner->x = weighted_mean(diner->x, food->x, diner->area, food->area);
+ diner->y = weighted_mean(diner->y, food->y, diner->area, food->area);
+ newmi = pixel_to_mesh(st, diner->x, diner->y);
+ diner->area += food->area;
+ delete_bubble_in_mesh(st, food, DELETE_BUBBLE);
+
+ if (st->drop) {
+ if ((st->simple) && (diner->area > st->bubble_areas[st->bubble_max_radius])) {
+ diner->area = st->bubble_areas[st->bubble_max_radius];
+ }
+#ifdef FANCY_BUBBLES
+ if ((! st->simple) && (diner->area > st->step_pixmaps[st->num_bubble_pixmaps]->area)) {
+ diner->area = st->step_pixmaps[st->num_bubble_pixmaps]->area;
+ }
+#endif /* FANCY_BUBBLES */
+ }
+ else {
+ if ((st->simple) && (diner->area > st->bubble_areas[st->bubble_max_radius])) {
+ delete_bubble_in_mesh(st, diner, DELETE_BUBBLE);
+ return 0;
+ }
+#ifdef FANCY_BUBBLES
+ if ((! st->simple) && (diner->area >
+ st->step_pixmaps[st->num_bubble_pixmaps]->area)) {
+ delete_bubble_in_mesh(st, diner, DELETE_BUBBLE);
+ return 0;
+ }
+#endif /* FANCY_BUBBLES */
+ }
+
+ if (st->simple) {
+ if (diner->area > st->bubble_areas[diner->radius + 1]) {
+ /* Move the bubble to a new radius */
+ i = diner->radius;
+ while ((i < st->bubble_max_radius - 1) && (diner->area > st->bubble_areas[i+1]))
+ ++i;
+ diner->radius = i;
+ }
+ show_bubble(st, diner);
+#ifdef FANCY_BUBBLES
+ } else {
+ if (diner->area > st->step_pixmaps[diner->step+1]->area) {
+ i = diner->step;
+ while ((i < st->num_bubble_pixmaps - 1) && (diner->area > st->step_pixmaps[i+1]->area))
+ ++i;
+ diner->step = i;
+ diner->radius = st->step_pixmaps[diner->step]->radius;
+ }
+ show_bubble(st, diner);
+#endif /* FANCY_BUBBLES */
+ }
+
+ /* Now adjust locations and cells if need be */
+ if (newmi != diner->cell_index) {
+ delete_bubble_in_mesh(st, diner, KEEP_BUBBLE);
+ diner->cell_index = newmi;
+ add_to_mesh(st, diner);
+ }
+
+ return 1;
+}
+
+static int
+merge_bubbles(struct state *st, Bubble *b1, Bubble *b2)
+/* These two bubbles merge into one. If the first one wins out return
+1 else return 2. If there is no winner (it explodes) then return 0 */
+{
+ int b1size, b2size;
+
+ b1size = b1->area;
+ b2size = b2->area;
+
+#ifdef DEBUG
+ if ((null_bubble(b1) || null_bubble(b2))) {
+ fprintf(stderr, "NULL bubble passed to merge_bubbles()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ if (b1 == b2) {
+ hide_bubble(st, b1);
+ delete_bubble_in_mesh(st, b1, DELETE_BUBBLE);
+ return 0;
+ }
+
+ if (b1size > b2size) {
+ switch (bubble_eat(st, b1, b2)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 1;
+ break;
+ default:
+ break;
+ }
+ } else if (b1size < b2size) {
+ switch (bubble_eat(st, b2, b1)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 2;
+ break;
+ default:
+ break;
+ }
+ } else {
+ if ((random() % 2) == 0) {
+ switch (bubble_eat(st, b1, b2)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 1;
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (bubble_eat(st, b2, b1)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 2;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ fprintf(stderr, "An error occurred in merge_bubbles()\n");
+ exit(1);
+}
+
+static void
+insert_new_bubble(struct state *st, Bubble *tmp)
+/* Calculates which bubbles are eaten when a new bubble tmp is
+ inserted. This is called recursively in case when a bubble grows
+ it eats others. Careful to pick out disappearing bubbles. */
+{
+ Bubble *nextbub;
+ Bubble *touch;
+
+#ifdef DEBUG
+ if (null_bubble(tmp)) {
+ fprintf(stderr, "Bad bubble passed to insert_new_bubble()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ nextbub = tmp;
+ touch = get_closest_bubble(st, nextbub);
+ if (null_bubble(touch))
+ return;
+
+ while (1) {
+
+ /* Merge all touching bubbles */
+ while (! null_bubble(touch)) {
+ switch (merge_bubbles(st, nextbub, touch)) {
+ case 2:
+ /* touch ate nextbub and survived */
+ nextbub = touch;
+ break;
+ case 1:
+ /* nextbub ate touch and survived */
+ break;
+ case 0:
+ /* somebody ate someone else but they exploded */
+ nextbub = (Bubble *)NULL;
+ break;
+ default:
+ /* something went wrong */
+ fprintf(stderr, "Error occurred in insert_new_bubble()\n");
+ exit(1);
+ }
+
+ /* Check to see if any bubble survived. */
+ if (null_bubble(nextbub))
+ break;
+
+ /* Check to see if there are any other bubbles still in the area
+ and if we need to do this all over again for them. */
+ touch = get_closest_bubble(st, nextbub);
+ }
+
+ if (null_bubble(nextbub))
+ break;
+
+ /* Shift bubble down. Break if we run off the screen. */
+ if (st->drop) {
+ if (drop_bubble( st, nextbub ) == -1)
+ break;
+ }
+
+ /* Check to see if there are any other bubbles still in the area
+ and if we need to do this all over again for them. */
+ touch = get_closest_bubble(st, nextbub);
+ if (null_bubble(touch)) {
+ /* We also continue every so often if we're dropping and the bubble is at max size */
+ if (st->drop) {
+ if (st->simple) {
+ if ((nextbub->area >= st->bubble_areas[st->bubble_max_radius - 1]) && (random() % 2 == 0))
+ continue;
+ }
+#ifdef FANCY_BUBBLES
+ else {
+ if ((nextbub->step >= st->num_bubble_pixmaps - 1) && (random() % 2 == 0))
+ continue;
+ }
+#endif /* FANCY_BUBBLES */
+ }
+ break;
+ }
+
+ }
+}
+
+
+static void
+leave_trail(struct state *st, Bubble *bb )
+{
+ Bubble *tmp;
+
+ tmp = new_bubble(st);
+ tmp->x = bb->x;
+ tmp->y = bb->y - ((bb->radius + 10) * st->drop_dir);
+ tmp->cell_index = pixel_to_mesh(st, tmp->x, tmp->y);
+ add_to_mesh(st, tmp);
+ insert_new_bubble(st, tmp);
+ show_bubble( st, tmp );
+}
+
+
+static int
+drop_bubble( struct state *st, Bubble *bb )
+{
+ int newmi;
+
+ hide_bubble( st, bb );
+
+ if (st->simple)
+ (bb->y) += (st->bubble_droppages[bb->radius] * st->drop_dir);
+#ifdef FANCY_BUBBLES
+ else
+ (bb->y) += (st->step_pixmaps[bb->step]->droppage * st->drop_dir);
+#endif /* FANCY_BUBBLES */
+ if ((bb->y < 0) || (bb->y > st->screen_height)) {
+ delete_bubble_in_mesh( st, bb, DELETE_BUBBLE );
+ return -1;
+ }
+
+ show_bubble( st, bb );
+
+ /* Now adjust locations and cells if need be */
+ newmi = pixel_to_mesh(st, bb->x, bb->y);
+ if (newmi != bb->cell_index) {
+ delete_bubble_in_mesh(st, bb, KEEP_BUBBLE);
+ bb->cell_index = newmi;
+ add_to_mesh(st, bb);
+ }
+
+ if (st->trails) {
+ if (st->simple) {
+ if ((bb->area >= st->bubble_areas[st->bubble_max_radius - 1]) && (random() % 2 == 0))
+ leave_trail( st, bb );
+ }
+#ifdef FANCY_BUBBLES
+ else {
+ if ((bb->step >= st->num_bubble_pixmaps - 1) && (random() % 2 == 0))
+ leave_trail( st, bb );
+ }
+#endif /* FANCY_BUBBLES */
+ }
+
+ return 0;
+}
+
+
+#ifdef DEBUG
+static int
+get_length_of_bubble_list(Bubble *bb)
+{
+ Bubble *tmp = bb;
+ int rv = 0;
+
+ while (! null_bubble(tmp)) {
+ rv++;
+ tmp = tmp->next;
+ }
+
+ return rv;
+}
+#endif /* DEBUG */
+
+/*
+ * Pixmap stuff used regardless of whether file I/O is available. Must
+ * still check for XPM, though!
+ */
+
+#ifdef FANCY_BUBBLES
+
+/*
+ * Pixmaps without file I/O (but do have XPM)
+ */
+
+static void
+pixmap_sort(Bubble_Step **head, int numelems)
+/* Couldn't get qsort to work right with this so I wrote my own. This puts
+the numelems length array with first element at head into order of radius.
+*/
+{
+ Bubble_Step tmp;
+ Bubble_Step *least = 0;
+ int minradius = INT_MAX;
+ int i;
+
+ for (i = 0; i < numelems; i++) {
+ if (head[i]->radius < minradius) {
+ least = head[i];
+ minradius = head[i]->radius;
+ }
+ }
+ if (*head != least) {
+ memcpy(&tmp, least, sizeof(Bubble_Step));
+ memcpy(least, *head, sizeof(Bubble_Step));
+ memcpy(*head, &tmp, sizeof(Bubble_Step));
+ }
+
+ if (numelems > 2)
+ pixmap_sort(&head[1], numelems-1);
+}
+
+static int
+extrapolate(int i1, int i2)
+{
+ return (i2 + (i2 - i1));
+}
+
+static void
+make_pixmap_array(struct state *st, Bubble_Step *list)
+/* From a linked list of bubbles construct the array step_pixmaps */
+{
+ Bubble_Step *tmp = list;
+ int ind;
+#ifdef DEBUG
+ int prevrad = -1;
+#endif
+
+ if (list == (Bubble_Step *)NULL) {
+ fprintf(stderr, "NULL list passed to make_pixmap_array\n");
+ exit(1);
+ }
+
+ st->num_bubble_pixmaps = 1;
+ while(tmp->next != (Bubble_Step *)NULL) {
+ tmp = tmp->next;
+ ++st->num_bubble_pixmaps;
+ }
+
+ if (st->num_bubble_pixmaps < 2) {
+ fprintf(stderr, "Must be at least two bubbles in file\n");
+ exit(1);
+ }
+
+ st->step_pixmaps = (Bubble_Step **)xmalloc((st->num_bubble_pixmaps + 1) *
+ sizeof(Bubble_Step *));
+
+ /* Copy them blindly into the array for sorting. */
+ ind = 0;
+ tmp = list;
+ do {
+ st->step_pixmaps[ind++] = tmp;
+ tmp = tmp->next;
+ } while(tmp != (Bubble_Step *)NULL);
+
+ /* We make another bubble beyond the ones with pixmaps so that the final
+ bubble hangs around and doesn't pop immediately. It's radius and area
+ are found by extrapolating from the largest two bubbles with pixmaps. */
+
+ st->step_pixmaps[st->num_bubble_pixmaps] =
+ (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
+ st->step_pixmaps[st->num_bubble_pixmaps]->radius = INT_MAX;
+
+ pixmap_sort(st->step_pixmaps, (st->num_bubble_pixmaps + 1));
+
+#ifdef DEBUG
+ if (st->step_pixmaps[st->num_bubble_pixmaps]->radius != INT_MAX) {
+ fprintf(stderr, "pixmap_sort() screwed up make_pixmap_array\n");
+ }
+#endif /* DEBUG */
+
+ st->step_pixmaps[st->num_bubble_pixmaps]->radius =
+ extrapolate(st->step_pixmaps[st->num_bubble_pixmaps-2]->radius,
+ st->step_pixmaps[st->num_bubble_pixmaps-1]->radius);
+ st->step_pixmaps[st->num_bubble_pixmaps]->area =
+ calc_bubble_area(st, st->step_pixmaps[st->num_bubble_pixmaps]->radius);
+
+
+#ifdef DEBUG
+ /* Now check for correct order */
+ for (ind = 0; ind < st->num_bubble_pixmaps; ind++) {
+ if (prevrad > 0) {
+ if (st->step_pixmaps[ind]->radius < prevrad) {
+ fprintf(stderr, "Pixmaps not in ascending order of radius\n");
+ exit(1);
+ }
+ }
+ prevrad = st->step_pixmaps[ind]->radius;
+ }
+#endif /* DEBUG */
+
+ /* Now populate the droppage values */
+ for (ind = 0; ind < st->num_bubble_pixmaps; ind++)
+ st->step_pixmaps[ind]->droppage = MAX_DROPPAGE * ind / st->num_bubble_pixmaps;
+}
+
+static void
+make_pixmap_from_default(struct state *st,
+ const unsigned char *png_data,
+ unsigned long data_size,
+ Bubble_Step *bl)
+/* Read pixmap data which has been compiled into the program and a pointer
+ to which has been passed.
+
+ This is virtually copied verbatim from make_pixmap_from_file() above and
+changes made to either should be propagated onwards! */
+{
+ XGCValues gcv;
+
+#ifdef DEBUG
+ if (pixmap_data == (char **)0) {
+ fprintf(stderr, "make_pixmap_from_default(): NULL passed\n");
+ exit(1);
+ }
+#endif
+
+ if (bl == (Bubble_Step *)NULL) {
+ fprintf(stderr, "NULL pointer passed to make_pixmap()\n");
+ exit(1);
+ }
+
+#ifdef FANCY_BUBBLES
+ {
+ int w, h;
+ bl->ball = image_data_to_pixmap (st->dpy, st->window, png_data, data_size,
+ &w, &h, &bl->shape_mask);
+ bl->radius = MAX(w, h) / 2;
+ bl->area = calc_bubble_area(st, bl->radius);
+ }
+#endif /* FANCY_BUBBLES */
+
+ gcv.foreground = st->default_fg_pixel;
+ gcv.function = GXcopy;
+ bl->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ XSetClipMask(st->dpy, bl->draw_gc, bl->shape_mask);
+
+ gcv.foreground = st->default_bg_pixel;
+ gcv.function = GXcopy;
+ bl->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ XSetClipMask(st->dpy, bl->erase_gc, bl->shape_mask);
+}
+
+static void
+default_to_pixmaps (struct state *st)
+/* Make pixmaps out of default ball data stored in bubbles_default.c */
+{
+ int i;
+ Bubble_Step *pixmap_list = (Bubble_Step *)NULL;
+ Bubble_Step *newpix, *tmppix;
+
+ init_default_bubbles();
+
+ for (i = 0; i < num_default_bubbles; i++) {
+ newpix = (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
+ make_pixmap_from_default(st,
+ default_bubbles[i].png,
+ default_bubbles[i].size,
+ newpix);
+ /* Now add to list */
+ if (pixmap_list == (Bubble_Step *)NULL) {
+ pixmap_list = newpix;
+ } else {
+ tmppix = pixmap_list;
+ while (tmppix->next != (Bubble_Step *)NULL)
+ tmppix = tmppix->next;
+ tmppix->next = newpix;
+ }
+ newpix->next = (Bubble_Step *)NULL;
+ }
+
+ /* Finally construct step_pixmaps[] */
+ make_pixmap_array(st, pixmap_list);
+}
+
+#endif /* FANCY_BUBBLES */
+
+
+/*
+ * Main stuff
+ */
+
+
+static void
+get_resources(struct state *st)
+/* Get the appropriate X resources and warn about any inconsistencies. */
+{
+ Bool rise;
+ XWindowAttributes xgwa;
+ Colormap cmap;
+ char *s;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ cmap = xgwa.colormap;
+
+ st->threed = get_boolean_resource(st->dpy, "3D", "Boolean");
+ st->quiet = get_boolean_resource(st->dpy, "quiet", "Boolean");
+ st->simple = get_boolean_resource(st->dpy, "simple", "Boolean");
+ /* Forbid rendered bubbles on monochrome displays */
+ if ((mono_p) && (! st->simple)) {
+ if (! st->quiet)
+ fprintf(stderr,
+ "Rendered bubbles not supported on monochrome displays\n");
+ st->simple = True;
+ }
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+
+ s = get_string_resource (st->dpy, "mode", "Mode");
+ rise = False;
+ if (!s || !*s || !strcasecmp (s, "float"))
+ ;
+ else if (!strcasecmp (s, "rise"))
+ rise = True;
+ else if (!strcasecmp (s, "drop"))
+ st->drop = True;
+ else
+ fprintf (stderr, "%s: bogus mode: \"%s\"\n", progname, s);
+
+ st->trails = get_boolean_resource(st->dpy, "trails", "Boolean");
+ st->drop_dir = (st->drop ? 1 : -1);
+ if (st->drop || rise)
+ st->drop = 1;
+
+ st->default_fg_pixel = get_pixel_resource (st->dpy,
+ cmap, "foreground", "Foreground");
+ st->default_bg_pixel = get_pixel_resource (st->dpy,
+ cmap, "background", "Background");
+
+ if (st->simple) {
+ /* This is easy */
+ st->broken = get_boolean_resource(st->dpy, "broken", "Boolean");
+ if (st->broken)
+ if (! st->quiet)
+ fprintf(stderr, "-broken not available in simple mode\n");
+ } else {
+#ifndef FANCY_BUBBLES
+ st->simple = 1;
+#else /* FANCY_BUBBLES */
+ st->broken = get_boolean_resource(st->dpy, "broken", "Boolean");
+#endif /* FANCY_BUBBLES */
+ }
+}
+
+static void *
+bubbles_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ int i;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ get_resources(st);
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+#ifdef DEBUG
+ printf("sizof(int) on this platform is %d\n", sizeof(int));
+ printf("sizof(long) on this platform is %d\n", sizeof(long));
+#endif /* DEBUG */
+
+ st->screen_width = xgwa.width;
+ st->screen_height = xgwa.height;
+ st->screen_depth = xgwa.depth;
+
+ if (st->simple) {
+ /* These are pretty much plucked out of the air */
+ st->bubble_min_radius = (int)(0.006*(double)(MIN(st->screen_width,
+ st->screen_height)));
+ st->bubble_max_radius = (int)(0.045*(double)(MIN(st->screen_width,
+ st->screen_height)));
+ /* Some trivial values */
+ if (st->bubble_min_radius < 1)
+ st->bubble_min_radius = 1;
+ if (st->bubble_max_radius <= st->bubble_min_radius)
+ st->bubble_max_radius = st->bubble_min_radius + 1;
+
+ st->mesh_length = (2 * st->bubble_max_radius) + 3;
+
+ /* store area of each bubble of certain radius as number of 1/10s of
+ a pixel area. PI is defined in <math.h> */
+ st->bubble_areas = (long *)xmalloc((st->bubble_max_radius + 2) * sizeof(int));
+ for (i = 0; i < st->bubble_min_radius; i++)
+ st->bubble_areas[i] = 0;
+ for (i = st->bubble_min_radius; i <= (st->bubble_max_radius+1); i++)
+ st->bubble_areas[i] = calc_bubble_area(st, i);
+
+ /* Now populate the droppage values */
+ st->bubble_droppages = (int *)xmalloc((st->bubble_max_radius + 2) * sizeof(int));
+ for (i = 0; i < st->bubble_min_radius; i++)
+ st->bubble_droppages[i] = 0;
+ for (i = st->bubble_min_radius; i <= (st->bubble_max_radius+1); i++)
+ st->bubble_droppages[i] = MAX_DROPPAGE * (i - st->bubble_min_radius) / (st->bubble_max_radius - st->bubble_min_radius);
+
+ st->mesh_length = (2 * st->bubble_max_radius) + 3;
+ } else {
+#ifndef FANCY_BUBBLES
+ fprintf(stderr,
+ "Bug: simple mode code not set but FANCY_BUBBLES not defined\n");
+ exit(1);
+#else /* FANCY_BUBBLES */
+ /* Make sure all #ifdef sort of things have been taken care of in
+ get_resources(). */
+ default_to_pixmaps(st);
+
+ /* Set mesh length */
+ st->mesh_length = (2 * st->step_pixmaps[st->num_bubble_pixmaps-1]->radius) + 3;
+#endif /* FANCY_BUBBLES */
+
+ /* Am I missing something in here??? */
+ }
+
+ st->mesh_width = (st->screen_width / st->mesh_length) + 1;
+ st->mesh_height = (st->screen_height / st->mesh_length) + 1;
+ st->mesh_cells = st->mesh_width * st->mesh_height;
+ init_mesh(st);
+
+ calculate_adjacent_list(st);
+
+ adjust_areas(st);
+
+ /* Graphics contexts for simple mode */
+ if (st->simple) {
+ gcv.foreground = st->default_fg_pixel;
+ st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = st->default_bg_pixel;
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ }
+
+ XClearWindow (st->dpy, st->window);
+
+# ifndef FANCY_BUBBLES
+ st->simple = True;
+# endif
+
+ return st;
+}
+
+static unsigned long
+bubbles_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ for (i = 0; i < 5; i++)
+ {
+ Bubble *tmp = new_bubble(st);
+ add_to_mesh(st, tmp);
+ insert_new_bubble(st, tmp);
+ }
+ return st->delay;
+}
+
+
+static void
+bubbles_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+bubbles_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+bubbles_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Bubbles", bubbles)
diff --git a/hacks/bubbles.h b/hacks/bubbles.h
new file mode 100644
index 0000000..24872e3
--- /dev/null
+++ b/hacks/bubbles.h
@@ -0,0 +1,208 @@
+/* bubbles.h - definitions for bubbles screensaver */
+
+/* $Id: bubbles.h,v 1.6 2006/02/25 20:11:57 jwz Exp $ */
+
+#ifndef _BUBBLES_H_
+#define _BUBBLES_H_
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+#endif
+
+/***************************************************************************
+ * Options you might like to change to affect the program's behaviour *
+ ***************************************************************************/
+
+/*
+ * Uncommenting the following will enable support for reading bubbles from
+ * files (using the -file and -directory options to bubbles). This is
+ * disabled by default since such operations are inherently non-portable
+ * and we want the program to compile on as many systems as possible.
+ *
+ * If you uncomment this and you figure out how to get it working, please
+ * let me (J.Macnicol@student.anu.edu.au) know. Diffs against the standard
+ * distribution would be appreciated. Possible sources of problems are
+ * dirent and possibly the use of tmpnam().
+ */
+
+/* #define BUBBLES_IO */
+
+/*
+ * The following only makes sense if BUBBLES_IO above is defined.
+ *
+ * Uncomment the following if you always want to use the -file or
+ * -directory options on the command line and never to use a default bubble
+ * compiled into the program. This way you would save memory and disk space
+ * since if you do use -file or -directory only one bubble will be loaded
+ * into memory at any one time (and remember the default bubble is really
+ * uncompressed, unlike bubbles in files which can be compressed). This
+ * is disabled by default only so people running the program for the first
+ * time with no knowldege of the command line options don't get error
+ * messages ;)
+ *
+ * NOTE: You will still need to have a bubbles_default.c file, else the
+ * build sequence will fail. Well constructed bubbles_default.c files
+ * have #ifdef's which simply exclude everything else in the file at
+ * compile time. The bubblestodefault script does this.
+ */
+
+/* #define NO_DEFAULT_BUBBLE */
+
+/*
+ * This turns on any debugging messages and sanity checks. Hopefully you
+ * won't need this :) It slows things down a bit, too.
+ *
+ * NOTE: If you uncomment this you will get some messages about unused
+ * functions when you compile. You can ignore these - they refer to
+ * convenient checking routines which simply aren't called but are left
+ * in case someone wants to use them.
+ */
+
+/* #define DEBUG */
+
+/***************************************************************************
+ * Things you might need to change to get things working right *
+ ***************************************************************************/
+
+/*
+ * Name of the gzip binary. You shouldn't need to change this unless it's
+ * not in your PATH when the program is run, in which case you will need to
+ * substitute the full path here. Keep the double quotes else things won't
+ * compile!
+ */
+
+#define GZIP "gzip"
+
+/*
+ * Likewise for the Bourne shell.
+ */
+
+#define BOURNESH "sh"
+
+/*
+ * The name of the directory entry structure is different under Linux
+ * (under which this code is being developed) than other systems. The case
+ * alternate form here is that given in Kernighan & Ritchie's C book (which
+ * must be authoratitive, no?)
+ *
+ * 04/07/96 : People will have to hack this to get it working on some
+ * systems. I believe it doesn't work on SGI, for example.
+ */
+
+#ifdef _POSIX_SOURCE
+#define STRUCT_DIRENT struct dirent
+#else
+#define STRUCT_DIRENT Dirent
+#endif
+
+/*
+ * The naming of fields in struct dirent also seems to differ from system to
+ * system. This may have to be extended to make things truly portable.
+ * What we want here is the name field from a dirent struct pointed to
+ * by "dp".
+ *
+ * 04/07/96 : See above. This may need to be changed too.
+ */
+
+#ifdef _POSIX_SOURCE
+#define DIRENT_NAME dp->d_name
+#else
+#define DIRENT_NAME dp->name
+#endif
+
+/* I don't know why this isn't defined. */
+#ifdef linux
+/* apparently it is defined in recent linuxes. who knows. */
+/*extern char *tempnam(char *, char *);*/
+#endif
+
+/****************************************************************************
+ * Buffer lengths and things you probably won't need to touch *
+ ****************************************************************************/
+
+/* Maximum length of a full path name we can deal with */
+#define PATH_BUF_SIZE 1024
+
+/* Size of string passed to shell as command */
+#define COMMAND_BUF_SIZE 2500
+
+/* Size increments for read_line() buffers */
+#define READ_LINE_BUF_SIZE 24
+
+/* Maximum amount to drop a bubble */
+#define MAX_DROPPAGE 20
+
+/****************************************************************************
+ * End of options *
+ ****************************************************************************/
+
+/* Some machines define M_PI and not PI. If they don't define either, use
+own own. Really, the accuracy of this is _not_ very important. */
+#ifndef PI
+# define PI M_PI
+# ifndef M_PI
+# define M_PI 3.1415926535
+# endif
+#endif
+
+/* for delete_bubble_in_mesh() */
+#define DELETE_BUBBLE 0
+#define KEEP_BUBBLE 1
+
+/* Status codes for read_line */
+#define LINE_READ 0
+#define EOF_REACHED 1
+#define IO_ERROR 2
+
+/*
+ * Magic number for Bubble struct, in case it's trashed when debugging code
+ * (which happened to me often.... :(
+ */
+
+#define BUBBLE_MAGIC 5674
+
+/* Useful macros */
+#define MAX(A, B) ((A) > (B) ? (A) : (B))
+#define MIN(A, B) ((A) < (B) ? (A) : (B))
+
+/* How we represent bubbles */
+struct bub {
+ int radius;
+ int step; /* for rendered bubbles */
+ long area;
+ int x;
+ int y;
+ int magic;
+ int cell_index;
+ int visible;
+ struct bub *next;
+ struct bub *prev;
+};
+
+typedef struct bub Bubble;
+
+/*
+ * How we represent pixmaps of rendered bubbles. Because the range of radii
+ * available may not be continuous, we call each a step (for the lack of a
+ * better name...)
+ */
+
+struct bub_step {
+ int radius;
+ long area;
+ int droppage;
+ Pixmap ball, shape_mask;
+ GC draw_gc, erase_gc;
+ struct bub_step *next;
+};
+
+typedef struct bub_step Bubble_Step;
+
+extern void init_default_bubbles(void);
+extern int num_default_bubbles;
+typedef struct { const unsigned char *png; unsigned long size; } bubble_png;
+extern bubble_png default_bubbles[];
+
+#endif /* _BUBBLES_H_ */
diff --git a/hacks/bubbles.man b/hacks/bubbles.man
new file mode 100644
index 0000000..f9b892e
--- /dev/null
+++ b/hacks/bubbles.man
@@ -0,0 +1,140 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "14-Dec-95" "X Version 11"
+.SH NAME
+bubbles - frying pan / soft drink simulation
+.SH SYNOPSIS
+.B bubbles
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-rise|\-drop] [-trails]
+[\-fps]
+.SH DESCRIPTION
+\fIBubbles\fP sprays lots of little random bubbles all over the window which
+then grow until they reach their maximum size and go pop. The inspiration
+for this was watching little globules of oil on the bottom of a frying pan
+and it also looks a little like bubbles in fizzy soft drink. The default
+mode uses fancy ray-traced bubbles but there is also a mode which just draws
+circles in case the default mode is too taxing on your hardware.
+.SH OPTIONS
+Depending on how your
+.I bubbles
+was compiled, it accepts the following options:
+.TP 8
+.B \-foreground
+Colour of circles if \fI\-simple\fP mode is selected.
+.TP 8
+.B \-background
+Colour of window background.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default 800, or about 800 microsecond. Actually, this is the delay between each
+group of 15 new bubbles since such a delay between each step results in a
+very slow animation rate.
+.TP 8
+.B \-nodelay
+Same as \fI\-delay 0\fP.
+.TP 8
+.B \-simple
+Don't use the default fancy pixmap bubbles. Just draw circles instead.
+This may give more bearable performance if your hardware wasn't made for
+this sort of thing.
+.TP 8
+.B \-broken
+Don't hide bubbles when they pop. This was a bug during development
+but the results were actually quite attractive.
+.TP 8
+.B \-3D
+Normally, the simulation is done completely in two dimensions. When a
+bubble swallows up another bubble, the areas of each are added to get
+the area of the resulting bubble. This option changes the algorithm
+to instead add volume (imagining each to be a sphere in 3D space). The
+whole thing looks more realistic but I find it attracts attention to
+the flickering of each bubble as they are move and are redrawn. Your
+mileage may vary.
+.TP 8
+.B \-quiet
+Don't print messages explaining why one or several command line options
+were ignored. This is disabled by default.
+.TP 8
+.B \-rise | \-drop
+.TP 8
+.B \-trails
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH NOTES
+If you find the pace of things too slow, remember that there is a delay
+even though you specify no \fI\-delay\fP option. Try using \fI\-nodelay\fP
+although beware of the effects of irritation of other users if you're on a
+shared system as you bleed their CPU time away.
+
+Some tools to assist in creation of new bubbles are included in the source
+distribution. These can either be loaded with the \fI\-file\fP or
+\fI\-directory\fP options (if available) or they can be used in place
+of the distributed default bubble (bubble_default.c).
+You might like to copy these scripts to a permanent location and
+use them. Read bubbles.README.
+
+Rendered bubbles are not supported on monochrome displays. I'm not
+convinced that small bubbles, even dithered properly are going to look
+like anything more than a jumble of random dots.
+.SH BUGS
+There is a delay before something appears on the screen when using
+rendered bubbles. The XPM library seems to take a \fBlong\fP time to make
+pixmaps out of raw data. This can be irritating on slower systems.
+
+The movement of the bubbles looks jerky if an incomplete set of bubbles
+is used.
+
+The hide/display algorithm could do with some work to avoid flickering
+when \fI\-nodelay\fP is set.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH DISTRIBUTION POLICY
+This work is Copyright \(co 1995, 1996 by James Macnicol. Permission
+to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+James Macnicol <james.macnicol@mailexcite.com>
diff --git a/hacks/bumps.c b/hacks/bumps.c
new file mode 100644
index 0000000..fa728e6
--- /dev/null
+++ b/hacks/bumps.c
@@ -0,0 +1,700 @@
+/* -*- mode: C; tab-width: 4 -*-
+ * Bumps, Copyright (c) 2002, 2006 Shane Smit <CodeWeaver@DigitalLoom.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Module: "bumps.c"
+ * Tab Size: 4
+ *
+ * Description:
+ * This is typical bump-mapping. The actual bump map is generated by a screen
+ * grab. The light source is represented by a spotlight of random color. This
+ * spotlight randomly traverses the bump map in a sinus pattern.
+ *
+ * Essentially, it 3D-izes your desktop, based on color intensity.
+ *
+ * Modification History:
+ * [10/01/1999] - Shane Smit: Creation
+ * [10/08/1999] - Shane Smit: Port to C. (Ick)
+ * [03/08/2002] - Shane Smit: New movement code.
+ * [09/12/2002] - Shane Smit: MIT-SHM XImages.
+ * Thanks to Kennett Galbraith <http://www.Alpha-II.com/>
+ * for code optimization.
+ * [10/09/2016] - Dave Odell: Updated for new xshm.c.
+ * Y2K compliance.
+ */
+
+
+#include <math.h>
+#include <time.h>
+#include <inttypes.h>
+#include "screenhack.h"
+#include "xshm.h"
+
+
+/* Defines: */
+/* #define VERBOSE */
+#define RANDOM() ((int) (random() & 0X7FFFFFFFL))
+
+typedef unsigned char BOOL;
+
+
+/* Globals: */
+
+static const char *bumps_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*color: random",
+ "*colorcount: 64",
+ "*delay: 30000",
+ "*duration: 120",
+ "*soften: 1",
+ "*invert: FALSE",
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#endif /* HAVE_XSHM_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec bumps_options [] = {
+ { "-color", ".color", XrmoptionSepArg, 0 },
+ { "-colorcount", ".colorcount", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-soften", ".soften", XrmoptionSepArg, 0 },
+ { "-invert", ".invert", XrmoptionNoArg, "TRUE" },
+#ifdef HAVE_XSHM_EXTENSION
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+
+ { 0, 0, 0, 0 }
+};
+
+
+/* This structure handles everything to do with the spotlight, and is designed to be
+ * a member of TBumps. */
+typedef struct
+{
+ uint8_t *aLightMap;
+ uint16_t nFalloffDiameter, nFalloffRadius;
+ uint16_t nLightDiameter, nLightRadius;
+ float nAccelX, nAccelY;
+ float nAccelMax;
+ float nVelocityX, nVelocityY;
+ float nVelocityMax;
+ float nXPos, nYPos;
+} SSpotLight;
+
+
+/* The entire program's operation is contained within this structure. */
+typedef struct
+{
+ /* XWindows specific variables. */
+ Display *dpy;
+ Window Win;
+ Screen *screen;
+ Pixmap source;
+ GC GraphicsContext;
+ XColor *xColors;
+ unsigned long *aColors;
+ XImage *pXImage;
+ XShmSegmentInfo XShmInfo;
+
+ uint8_t nColorCount; /* Number of colors used. */
+ uint8_t bytesPerPixel;
+ uint16_t iWinWidth, iWinHeight;
+ uint16_t *aBumpMap; /* The actual bump map. */
+ SSpotLight SpotLight;
+
+ int delay;
+ int duration;
+ time_t start_time;
+
+ async_load_state *img_loader;
+} SBumps;
+
+
+static void SetPalette(Display *, SBumps *, XWindowAttributes * );
+static void InitBumpMap(Display *, SBumps *, XWindowAttributes * );
+static void InitBumpMap_2(Display *, SBumps *);
+static void SoftenBumpMap( SBumps * );
+
+
+
+
+/* This function pointer will point to the appropriate PutPixel*() function below. */
+static void (*MyPutPixel)( int8_t *, uint32_t );
+
+static void PutPixel32( int8_t *pData, uint32_t pixel )
+{
+ *(uint32_t *)pData = pixel;
+}
+
+static void PutPixel24( int8_t *pData, uint32_t pixel )
+{
+ pData[ 2 ] = ( pixel & 0x00FF0000 ) >> 16;
+ pData[ 1 ] = ( pixel & 0x0000FF00 ) >> 8;
+ pData[ 0 ] = ( pixel & 0x000000FF );
+}
+
+static void PutPixel16( int8_t *pData, uint32_t pixel )
+{
+ *(uint16_t *)pData = (uint16_t)pixel;
+}
+
+static void PutPixel8( int8_t *pData, uint32_t pixel )
+{
+ *(uint8_t *)pData = (uint8_t)pixel;
+}
+
+/* Creates the light map, which is a circular image... going from black around the edges
+ * to white in the center. */
+static void CreateSpotLight( SSpotLight *pSpotLight, uint16_t iDiameter, uint16_t nColorCount )
+{
+ double nDist;
+ int16_t iDistX, iDistY;
+ uint8_t *pLOffset;
+
+ pSpotLight->nFalloffDiameter = iDiameter;
+ pSpotLight->nFalloffRadius = pSpotLight->nFalloffDiameter / 2;
+ pSpotLight->nLightDiameter = iDiameter / 2;
+ pSpotLight->nLightRadius = pSpotLight->nLightDiameter / 2;
+#ifdef VERBOSE
+ printf( "%s: Falloff Diameter: %d\n", progclass, pSpotLight->nFalloffDiameter );
+ printf( "%s: Spot Light Diameter: %d\n", progclass, pSpotLight->nLightDiameter );
+#endif
+
+ pSpotLight->aLightMap = malloc( pSpotLight->nLightDiameter * pSpotLight->nLightDiameter * sizeof(uint8_t) );
+
+ pLOffset = pSpotLight->aLightMap;
+ for( iDistY=-pSpotLight->nLightRadius; iDistY<pSpotLight->nLightRadius; ++iDistY )
+ {
+ for( iDistX=-pSpotLight->nLightRadius; iDistX<pSpotLight->nLightRadius; ++iDistX )
+ {
+ nDist = sqrt( pow( iDistX+0.5F, 2 ) + pow( iDistY+0.5F, 2 ) );
+ if( nDist / pSpotLight->nLightRadius <= 1.0f )
+ *pLOffset = (uint8_t)(nColorCount - ( ( nDist / pSpotLight->nLightRadius ) * ( nColorCount - 1 ) ));
+ else
+ *pLOffset = 0;
+
+ ++pLOffset;
+ }
+ }
+
+ /* Initialize movement variables. */
+ pSpotLight->nAccelX = 0;
+ pSpotLight->nAccelY = 0;
+ pSpotLight->nVelocityX = ( RANDOM() % 2 ) ? pSpotLight->nVelocityMax : -pSpotLight->nVelocityMax;
+ pSpotLight->nVelocityY = ( RANDOM() % 2 ) ? pSpotLight->nVelocityMax : -pSpotLight->nVelocityMax;
+}
+
+
+/* Calculates the position of the spot light on the screen. */
+static void CalcLightPos( SBumps *pBumps )
+{
+ SSpotLight *pSpotLight = &pBumps->SpotLight;
+ float nGravity;
+
+ /* X */
+ if( pSpotLight->nXPos < pSpotLight->nFalloffRadius ) nGravity = 1.0f;
+ else if( pSpotLight->nXPos > pBumps->iWinWidth - pSpotLight->nFalloffRadius ) nGravity = -1.0f;
+ else nGravity = ( ( RANDOM() % 201 ) / 100.0f ) - 1.0f;
+
+ pSpotLight->nAccelX += nGravity * ( pSpotLight->nAccelMax / 5.0f );
+ if( pSpotLight->nAccelX < -pSpotLight->nAccelMax ) pSpotLight->nAccelX = -pSpotLight->nAccelMax;
+ else if( pSpotLight->nAccelX > pSpotLight->nAccelMax ) pSpotLight->nAccelX = pSpotLight->nAccelMax;
+
+ pSpotLight->nVelocityX += pSpotLight->nAccelX;
+ if( pSpotLight->nVelocityX < -pSpotLight->nVelocityMax ) pSpotLight->nVelocityX = -pSpotLight->nVelocityMax;
+ else if( pSpotLight->nVelocityX > pSpotLight->nVelocityMax ) pSpotLight->nVelocityX = pSpotLight->nVelocityMax;
+
+ pSpotLight->nXPos += pSpotLight->nVelocityX;
+
+ /* Y */
+ if( pSpotLight->nYPos < pSpotLight->nFalloffRadius ) nGravity = 1.0f;
+ else if( pSpotLight->nYPos > pBumps->iWinHeight - pSpotLight->nFalloffRadius ) nGravity = -1.0f;
+ else nGravity = ( ( RANDOM() % 201 ) / 100.0f ) - 1.0f;
+
+ pSpotLight->nAccelY += nGravity * ( pSpotLight->nAccelMax / 5.0f );
+ if( pSpotLight->nAccelY < -pSpotLight->nAccelMax ) pSpotLight->nAccelY = -pSpotLight->nAccelMax;
+ else if( pSpotLight->nAccelY > pSpotLight->nAccelMax ) pSpotLight->nAccelY = pSpotLight->nAccelMax;
+
+ pSpotLight->nVelocityY += pSpotLight->nAccelY;
+ if( pSpotLight->nVelocityY < -pSpotLight->nVelocityMax ) pSpotLight->nVelocityY = -pSpotLight->nVelocityMax;
+ else if( pSpotLight->nVelocityY > pSpotLight->nVelocityMax ) pSpotLight->nVelocityY = pSpotLight->nVelocityMax;
+
+ pSpotLight->nYPos += pSpotLight->nVelocityY;
+}
+
+
+/* Main initialization function. */
+static void CreateBumps( SBumps *pBumps, Display *dpy, Window NewWin )
+{
+ XWindowAttributes XWinAttribs;
+ XGCValues GCValues;
+ int32_t nGCFlags;
+ uint16_t iDiameter;
+
+ /* Make size and velocity a function of window size, so it appears the same at 100x60 as it does in 3200x1200. */
+ XGetWindowAttributes( dpy, NewWin, &XWinAttribs );
+ pBumps->iWinWidth = XWinAttribs.width;
+ pBumps->iWinHeight = XWinAttribs.height;
+ pBumps->SpotLight.nXPos = XWinAttribs.width / 2.0f;
+ pBumps->SpotLight.nYPos = XWinAttribs.height / 2.0f;
+ pBumps->SpotLight.nVelocityMax = ( ( XWinAttribs.width < XWinAttribs.height ) ? XWinAttribs.width : XWinAttribs.height ) / 140.0f;
+ pBumps->SpotLight.nAccelMax = pBumps->SpotLight.nVelocityMax / 10.0f;
+ pBumps->dpy = dpy;
+ pBumps->Win = NewWin;
+ pBumps->screen = XWinAttribs.screen;
+
+ iDiameter = ( ( pBumps->iWinWidth < pBumps->iWinHeight ) ? pBumps->iWinWidth : pBumps->iWinHeight ) / 2;
+
+ /* jwz: sometimes we get tearing if this lands on the wrong bounaary;
+ constraining it to be a multiple of 8 seems to fix it. */
+ iDiameter = ((iDiameter+7)/8)*8;
+
+ pBumps->pXImage = create_xshm_image( pBumps->dpy, XWinAttribs.visual, XWinAttribs.depth,
+ ZPixmap, &pBumps->XShmInfo, iDiameter, iDiameter );
+
+ /* For speed, access the XImage data directly using my own PutPixel routine. */
+ switch( pBumps->pXImage->bits_per_pixel )
+ {
+ case 32:
+ pBumps->bytesPerPixel = 4;
+ MyPutPixel = PutPixel32;
+ break;
+
+ case 24:
+ pBumps->bytesPerPixel = 3;
+ MyPutPixel = PutPixel24;
+ break;
+
+ case 16:
+ pBumps->bytesPerPixel = 2;
+ MyPutPixel = PutPixel16;
+ break;
+
+ case 8:
+ pBumps->bytesPerPixel = 1;
+ MyPutPixel = PutPixel8;
+ break;
+
+ default:
+ fprintf( stderr, "%s: Unknown XImage depth.", progname );
+ destroy_xshm_image( pBumps->dpy, pBumps->pXImage, &pBumps->XShmInfo );
+ exit( 1 );
+ }
+
+ GCValues.function = GXcopy;
+ GCValues.subwindow_mode = IncludeInferiors;
+ nGCFlags = GCFunction;
+ if( use_subwindow_mode_p( XWinAttribs.screen, pBumps->Win ) ) /* See grabscreen.c */
+ nGCFlags |= GCSubwindowMode;
+ pBumps->GraphicsContext = XCreateGC( pBumps->dpy, pBumps->Win, nGCFlags, &GCValues );
+
+ SetPalette(dpy, pBumps, &XWinAttribs );
+ CreateSpotLight( &pBumps->SpotLight, iDiameter, pBumps->nColorCount );
+ InitBumpMap(dpy, pBumps, &XWinAttribs );
+}
+
+
+/* Creates a specialized phong shade palette. */
+static void SetPalette(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAttribs )
+{
+ XColor BaseColor;
+ XColor Color;
+ char *sColor; /* Spotlight Color */
+ int16_t iColor;
+
+ sColor = get_string_resource(dpy, "color", "Color" );
+
+ BaseColor.red = RANDOM() % 0xFFFF;
+ BaseColor.green = RANDOM() % 0xFFFF;
+ BaseColor.blue = RANDOM() % 0xFFFF;
+
+ /* Make one color full intesity to avoid dark spotlights. */
+ switch( RANDOM() % 3 )
+ {
+ case 0: BaseColor.red = 0xFFFF; break;
+ case 1: BaseColor.green = 0xFFFF; break;
+ case 2: BaseColor.blue = 0xFFFF; break;
+ }
+
+ if( strcasecmp( sColor, "random" ) && !XParseColor( pBumps->dpy, pXWinAttribs->colormap, sColor, &BaseColor ) )
+ fprintf( stderr, "%s: color %s not found in database. Choosing random...\n", progname, sColor );
+
+#ifdef VERBOSE
+ printf( "%s: Spotlight color is <%d,%d,%d> RGB.\n", progclass, BaseColor.red, BaseColor.green, BaseColor.blue );
+#endif /* VERBOSE */
+
+ pBumps->nColorCount = get_integer_resource(dpy, "colorcount", "Integer" );
+ if( pBumps->nColorCount < 2 ) pBumps->nColorCount = 2;
+ if( pBumps->nColorCount > 128 ) pBumps->nColorCount = 128;
+
+ pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
+
+ /* Creates a phong shade: / BaseColor \ Index/ColorCount
+ * PhongShade = | ------------ | Index + ( 65535 - BaseColor )^
+ * \ ColorCount / */
+ pBumps->nColorCount--;
+ for( iColor=0; iColor<=pBumps->nColorCount; iColor++ )
+ {
+ Color.red = (uint16_t)( ( ( BaseColor.red / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.red, iColor/(double)pBumps->nColorCount ) );
+ Color.green = (uint16_t)( ( ( BaseColor.green / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.green, iColor/(double)pBumps->nColorCount ) );
+ Color.blue = (uint16_t)( ( ( BaseColor.blue / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.blue, iColor/(double)pBumps->nColorCount ) );
+
+ if( !XAllocColor( pBumps->dpy, pXWinAttribs->colormap, &Color ) )
+ {
+ XFreeColors( pBumps->dpy, pXWinAttribs->colormap, pBumps->aColors, iColor, 0 );
+ free( pBumps->aColors );
+ pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
+ pBumps->nColorCount--;
+ iColor = -1;
+ }
+ else
+ pBumps->aColors[ iColor ] = Color.pixel;
+ }
+ pBumps->nColorCount++;
+
+#ifdef VERBOSE
+ printf( "%s: Allocated %d colors.\n", progclass, pBumps->nColorCount );
+#endif /* VERBOSE */
+
+ XSetWindowBackground( pBumps->dpy, pBumps->Win, pBumps->aColors[ 0 ] );
+}
+
+
+/* Grabs the current contents of the window to use an intensity-based bump map. */
+static void InitBumpMap(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAttribs )
+{
+ pBumps->xColors = (XColor*)malloc( pBumps->iWinWidth * sizeof(XColor) );
+
+ if (pBumps->source) abort();
+ pBumps->source = XCreatePixmap(pBumps->dpy, pBumps->Win,
+ pXWinAttribs->width, pXWinAttribs->height,
+ pXWinAttribs->depth);
+ pBumps->img_loader = load_image_async_simple (0, pXWinAttribs->screen,
+ pBumps->Win, pBumps->source, 0, 0);
+}
+
+static void InitBumpMap_2(Display *dpy, SBumps *pBumps)
+{
+ XImage *pScreenImage;
+ XColor *pColor;
+ uint8_t nSoften;
+ uint16_t iWidth, iHeight;
+ uint32_t nAverager;
+ uint16_t *pBump;
+ uint16_t maxHeight;
+ double softenMultiplier = 1.0f;
+ BOOL bInvert = (BOOL)get_boolean_resource(dpy, "invert", "Boolean" );
+ XWindowAttributes XWinAttribs;
+ XGetWindowAttributes( pBumps->dpy, pBumps->Win, &XWinAttribs );
+
+ pBumps->start_time = time ((time_t *) 0);
+
+ pScreenImage = XGetImage( pBumps->dpy, pBumps->source, 0, 0,
+ pBumps->iWinWidth, pBumps->iWinHeight,
+ ~0L, ZPixmap );
+/* XFreePixmap (pBumps->dpy, pBumps->source);
+ pBumps->source = 0;*/
+
+ XSetWindowBackground( pBumps->dpy, pBumps->Win, pBumps->aColors[ 0 ] );
+ XClearWindow (pBumps->dpy, pBumps->Win);
+ XSync (pBumps->dpy, 0);
+
+ pBumps->aBumpMap = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
+
+ nSoften = get_integer_resource(dpy, "soften", "Integer" );
+ while( nSoften-- )
+ softenMultiplier *= 1.0f + ( 1.0f / 3.0f ); /* Softening takes the max height down, so scale up to compensate. */
+ maxHeight = pBumps->SpotLight.nLightRadius * softenMultiplier;
+ nAverager = maxHeight ? ( 3 * 0xFFFF ) / maxHeight : 0;
+
+ pBump = pBumps->aBumpMap;
+ if( bInvert ) /* Funny, it's actually the 'else' that inverts the bump map... */
+ {
+ for( iHeight=0; iHeight<pBumps->iWinHeight; iHeight++ )
+ {
+ pColor = pBumps->xColors;
+ for( iWidth=0; iWidth<pBumps->iWinWidth; iWidth++ )
+ (pColor++)->pixel = XGetPixel( pScreenImage, iWidth, iHeight );
+
+ XQueryColors( pBumps->dpy, XWinAttribs.colormap, pBumps->xColors, pBumps->iWinWidth );
+
+ pColor = pBumps->xColors;
+ for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pColor, ++pBump )
+ *pBump = ( nAverager ? ( pColor->red + pColor->green + pColor->blue ) / nAverager : 0 );
+ }
+ }
+ else
+ {
+ for( iHeight=0; iHeight<pBumps->iWinHeight; iHeight++ )
+ {
+ pColor = pBumps->xColors;
+ for( iWidth=0; iWidth<pBumps->iWinWidth; iWidth++ )
+ (pColor++)->pixel = XGetPixel( pScreenImage, iWidth, iHeight );
+
+ XQueryColors( pBumps->dpy, XWinAttribs.colormap, pBumps->xColors, pBumps->iWinWidth );
+
+ pColor = pBumps->xColors;
+ for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pColor, ++pBump )
+ *pBump = ( maxHeight - ( nAverager ? ( pColor->red + pColor->green + pColor->blue ) / nAverager : 0 ) );
+ }
+ }
+
+ XDestroyImage( pScreenImage );
+
+ nSoften = get_integer_resource(dpy, "soften", "Integer" );
+#ifdef VERBOSE
+ if( nSoften ) printf( "%s: Softening Bump Map %d time(s)...\n", progclass, nSoften );
+#endif
+ while( nSoften-- )
+ SoftenBumpMap( pBumps );
+
+/* free( pBumps->xColors );
+ pBumps->xColors = 0;*/
+}
+
+/* Soften the bump map. This is to avoid pixelated-looking ridges.
+ * |-----|-----|-----|
+ * | 0% |12.5%| 0% | The adjacent pixels are averaged together
+ * |-----|-----|-----| first. Then than value is averaged with
+ * |12.5%| 50% |12.5%| the pixel is question. This essentially weights
+ * |-----|-----|-----| each pixel as shown on the left.
+ * | 0% |12.5%| 0% |
+ * |-----|-----|-----|
+ */
+static void SoftenBumpMap( SBumps *pBumps )
+{
+ uint16_t *pOffset, *pTOffset;
+ uint32_t nHeight;
+ uint32_t iWidth, iHeight;
+ uint16_t *aTempBuffer = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
+
+ pOffset = pBumps->aBumpMap;
+ pTOffset = aTempBuffer;
+ for( iHeight=pBumps->iWinHeight; iHeight; --iHeight )
+ {
+ for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pOffset, ++pTOffset )
+ {
+ if( iHeight==pBumps->iWinHeight || iHeight==1 ||
+ iWidth==pBumps->iWinWidth || iWidth==1 )
+ {
+ *pTOffset = 0;
+ continue;
+ }
+
+ nHeight = pOffset[ -pBumps->iWinWidth ];
+ nHeight += pOffset[ 1 ];
+ nHeight += pOffset[ pBumps->iWinWidth ];
+ nHeight += pOffset[ -1 ];
+ nHeight >>= 2;
+ nHeight += pOffset[ 0 ];
+ nHeight >>= 1;
+ *pTOffset = nHeight;
+ }
+ }
+
+ memcpy( pBumps->aBumpMap, aTempBuffer, pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
+ free( aTempBuffer );
+}
+
+
+/* This is where we slap down some pixels... */
+static void Execute( SBumps *pBumps )
+{
+ int32_t nLightXPos, nLightYPos;
+ int32_t iScreenX, iScreenY;
+ int32_t iLightX, iLightY;
+ uint16_t *pBOffset;
+ int8_t *pDOffset;
+ int32_t nX, nY;
+ uint16_t nColor;
+ int32_t nLightOffsetFar = pBumps->SpotLight.nFalloffDiameter - pBumps->SpotLight.nLightRadius;
+
+ CalcLightPos( pBumps );
+
+ /* Offset to upper left hand corner. */
+ nLightXPos = pBumps->SpotLight.nXPos - pBumps->SpotLight.nFalloffRadius;
+ nLightYPos = pBumps->SpotLight.nYPos - pBumps->SpotLight.nFalloffRadius;
+
+ for( iScreenY=nLightYPos, iLightY=-pBumps->SpotLight.nLightRadius; iLightY<nLightOffsetFar; ++iScreenY, ++iLightY )
+ {
+ if( iScreenY < 0 ) continue;
+ else if( iScreenY >= pBumps->iWinHeight ) break;
+
+ /* warning: pointer targets in assignment differ in signedness
+ Should pDOffset be a int8? I can't tell. -jwz, 22-Jul-2003 */
+ pDOffset = (int8_t *) &pBumps->pXImage->data[ (iLightY+pBumps->SpotLight.nLightRadius) * pBumps->pXImage->bytes_per_line ];
+ pBOffset = pBumps->aBumpMap + ( iScreenY * pBumps->iWinWidth ) + nLightXPos;
+ for( iScreenX=nLightXPos, iLightX=-pBumps->SpotLight.nLightRadius; iLightX<nLightOffsetFar; ++iScreenX, ++iLightX, ++pBOffset, pDOffset+=pBumps->bytesPerPixel )
+ {
+ if( iScreenX < 0 ) continue;
+ else if( iScreenX >= pBumps->iWinWidth ) break;
+ else if( iScreenY == 0 || iScreenY >= pBumps->iWinHeight-2 ||
+ iScreenX == 0 || iScreenX >= pBumps->iWinWidth-2 )
+ {
+ MyPutPixel( pDOffset, pBumps->aColors[ 0 ] );
+ continue;
+ }
+
+ /* That's right folks, all the magic of bump mapping occurs in these two lines. (kinda disappointing, isn't it?) */
+ nX = ( pBOffset[ 1 ] - pBOffset[ 0 ] ) + iLightX;
+ nY = ( pBOffset[ pBumps->iWinWidth ] - pBOffset[ 0 ] ) + iLightY;
+
+ if( nX<0 || nX>=pBumps->SpotLight.nLightDiameter
+ || nY<0 || nY>=pBumps->SpotLight.nLightDiameter )
+ {
+ MyPutPixel( pDOffset, pBumps->aColors[ 0 ] );
+ continue;
+ }
+
+ nColor = pBumps->SpotLight.aLightMap[ ( nY * pBumps->SpotLight.nLightDiameter ) + nX ];
+ MyPutPixel( pDOffset, pBumps->aColors[ nColor ] );
+ }
+ }
+
+ /* Allow the spotlight to go *slightly* off the screen by clipping the XImage. */
+ iLightX = iLightY = 0; /* Use these for XImages X and Y now. */
+ nX = nY = pBumps->SpotLight.nFalloffDiameter; /* Use these for XImage width and height now. */
+ if( nLightXPos < 0 )
+ {
+ iLightX = -nLightXPos;
+ nX -= iLightX;
+ nLightXPos = 0;
+ }
+ else if( nLightXPos + nX >= pBumps->iWinWidth )
+ {
+ nX -= ( nLightXPos + nX ) - pBumps->iWinWidth;
+ }
+
+ if( nLightYPos < 0 )
+ {
+ iLightY = -nLightYPos;
+ nY -= iLightY;
+ nLightYPos = 0;
+ }
+ else if( nLightYPos + nY >= pBumps->iWinHeight )
+ {
+ nY -= ( nLightYPos + nY ) - pBumps->iWinHeight;
+ }
+
+ put_xshm_image( pBumps->dpy, pBumps->Win, pBumps->GraphicsContext, pBumps->pXImage, iLightX, iLightY, nLightXPos, nLightYPos,
+ nX, nY, &pBumps->XShmInfo);
+}
+
+
+static void DestroySpotLight( SSpotLight *pSpotLight ) { free( pSpotLight->aLightMap ); }
+
+/* Clean up */
+static void DestroyBumps( SBumps *pBumps )
+{
+ DestroySpotLight( &pBumps->SpotLight );
+ free( pBumps->aColors );
+ free( pBumps->aBumpMap );
+ destroy_xshm_image( pBumps->dpy, pBumps->pXImage, &pBumps->XShmInfo );
+}
+
+
+/* All messages to the screensaver are processed here. */
+static void *
+bumps_init (Display *dpy, Window Win)
+{
+ SBumps *Bumps = (SBumps *) calloc (1, sizeof(SBumps));
+
+#ifdef VERBOSE
+ time_t Time = time( NULL );
+ uint16_t iFrame = 0;
+#endif /* VERBOSE */
+
+ CreateBumps( Bumps, dpy, Win );
+ Bumps->delay = get_integer_resource(dpy, "delay", "Integer" );
+ Bumps->duration = get_integer_resource (dpy, "duration", "Seconds");
+ if (Bumps->delay < 0) Bumps->delay = 0;
+ if (Bumps->duration < 1) Bumps->duration = 1;
+ Bumps->start_time = time ((time_t *) 0);
+ return Bumps;
+}
+
+static unsigned long
+bumps_draw (Display *dpy, Window window, void *closure)
+{
+ SBumps *Bumps = (SBumps *) closure;
+
+ if (Bumps->img_loader) /* still loading */
+ {
+ Bumps->img_loader = load_image_async_simple (Bumps->img_loader, 0, 0, 0, 0, 0);
+ if (! Bumps->img_loader) /* just finished */
+ InitBumpMap_2(dpy, Bumps);
+ return Bumps->delay;
+ }
+
+ if (!Bumps->img_loader &&
+ Bumps->start_time + Bumps->duration < time ((time_t *) 0)) {
+ Bumps->img_loader = load_image_async_simple (0, Bumps->screen,
+ Bumps->Win, Bumps->source,
+ 0, 0);
+ }
+
+ Execute( Bumps );
+
+#ifdef VERBOSE
+ iFrame++;
+ if( Time - time( NULL ) )
+ {
+ printf( "FPS: %d\n", iFrame );
+ Time = time( NULL );
+ iFrame = 0;
+ }
+#endif /* VERBOSE */
+
+ return Bumps->delay;
+}
+
+static void
+bumps_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+bumps_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ SBumps *Bumps = (SBumps *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ Bumps->start_time = 0;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+bumps_free (Display *dpy, Window window, void *closure)
+{
+ SBumps *Bumps = (SBumps *) closure;
+ DestroyBumps( Bumps );
+}
+
+
+XSCREENSAVER_MODULE ("Bumps", bumps)
+
+/* vim: ts=4
+ */
diff --git a/hacks/bumps.man b/hacks/bumps.man
new file mode 100644
index 0000000..8e47184
--- /dev/null
+++ b/hacks/bumps.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+bumps - move distorting spotlight around desktop
+.SH SYNOPSIS
+.B bumps
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIbumps\fP program takes an image and exposes small, distorted
+sections of it as if through an odd wandering spotlight beam.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I bumps
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1999 by Shane Smit. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH CREDITS
+Shane Smit <blackend@inconnect.com>, 8-Oct-1999.
diff --git a/hacks/ccurve.c b/hacks/ccurve.c
new file mode 100644
index 0000000..23b53e8
--- /dev/null
+++ b/hacks/ccurve.c
@@ -0,0 +1,866 @@
+/* ccurve, Copyright (c) 1998, 1999
+ * Rick Campbell <rick@campbellcentral.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ */
+
+/* Draw self-similar linear fractals including the classic ``C Curve''
+ *
+ * 16 Aug 1999 Rick Campbell <rick@campbellcentral.org>
+ * Eliminated sub-windows-with-backing-store-double-buffering crap in
+ * favor of drawing the new image in a pixmap and then splatting that on
+ * the window.
+ *
+ * 19 Dec 1998 Rick Campbell <rick@campbellcentral.org>
+ * Original version.
+ */
+
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+
+#define SQRT3 (1.73205080756887729353)
+#define MAXIMUM_COLOR_COUNT (256)
+#define EPSILON (1e-5)
+
+typedef struct Position_struct
+{
+ double x;
+ double y;
+}
+Position;
+
+typedef struct Segment_struct
+{
+ double angle;
+ double length;
+}
+Segment;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int color_count;
+ int color_index;
+ Colormap color_map;
+ XColor colors [MAXIMUM_COLOR_COUNT];
+ int line_count;
+ int maximum_lines;
+ double plot_maximum_x;
+ double plot_maximum_y;
+ double plot_minimum_x;
+ double plot_minimum_y;
+ int total_lines;
+
+ unsigned long int background;
+ GC context;
+ Pixmap pixmap;
+ int width;
+ int height;
+ float delay;
+ float delay2;
+
+ int draw_index;
+
+ int draw_iterations;
+ double draw_maximum_x;
+ double draw_maximum_y;
+ double draw_minimum_x;
+ double draw_minimum_y;
+ int draw_segment_count;
+ Segment* draw_segments;
+ double draw_x1;
+ double draw_y1;
+ double draw_x2;
+ double draw_y2;
+};
+
+
+
+
+/* normalize alters the sequence to go from (0,0) to (1,0) */
+static void
+normalized_plot (int segment_count,
+ Segment* segments,
+ Position* points)
+{
+ double angle = 0.0;
+ double cosine = 0.0;
+ int index = 0;
+ double length = 0.0;
+ double sine = 0.0;
+ double x = 0.0;
+ double y = 0.0;
+
+ for (index = 0; index < segment_count; ++index)
+ {
+ Segment* segment = segments + index;
+ double length = segment->length;
+ double angle = segment->angle;
+
+ x += length * cos (angle);
+ y += length * sin (angle);
+ points [index].x = x;
+ points [index].y = y;
+ }
+ angle = -(atan2 (y, x));
+ cosine = cos (angle);
+ sine = sin (angle);
+ length = sqrt ((x * x) + (y * y));
+ /* rotate and scale */
+ for (index = 0; index < segment_count; ++index)
+ {
+ double temp_x = points [index].x;
+ double temp_y = points [index].y;
+ points [index].x = ((temp_x * cosine) + (temp_y * (-sine))) / length;
+ points [index].y = ((temp_x * sine) + (temp_y * cosine)) / length;
+ }
+}
+
+static void
+copy_points (int segment_count,
+ Position* source,
+ Position* target)
+{
+ int index = 0;
+
+ for (index = 0; index < segment_count; ++index)
+ {
+ target [index] = source [index];
+ }
+}
+
+static void
+realign (double x1,
+ double y1,
+ double x2,
+ double y2,
+ int segment_count,
+ Position* points)
+{
+ double angle = 0.0;
+ double cosine = 0.0;
+ double delta_x = 0.0;
+ double delta_y = 0.0;
+ int index = 0;
+ double length = 0.0;
+ double sine = 0.0;
+
+ delta_x = x2 - x1;
+ delta_y = y2 - y1;
+ angle = atan2 (delta_y, delta_x);
+ cosine = cos (angle);
+ sine = sin (angle);
+ length = sqrt ((delta_x * delta_x) + (delta_y * delta_y));
+ /* rotate, scale, then shift */
+ for (index = 0; index < segment_count; ++index)
+ {
+ double temp_x = points [index].x;
+ double temp_y = points [index].y;
+ points [index].x
+ = (length * ((temp_x * cosine) + (temp_y * (-sine)))) + x1;
+ points [index].y
+ = (length * ((temp_x * sine) + (temp_y * cosine))) + y1;
+ }
+}
+
+static Bool
+self_similar_normalized (struct state *st,
+ int iterations,
+ double x1,
+ double y1,
+ double x2,
+ double y2,
+ double maximum_x,
+ double maximum_y,
+ double minimum_x,
+ double minimum_y,
+ int segment_count,
+ Position* points)
+{
+ if (iterations == 0)
+ {
+ double delta_x = maximum_x - minimum_x;
+ double delta_y = maximum_y - minimum_y;
+ st->color_index = (int)(((double)(st->line_count * st->color_count))
+ / ((double)st->total_lines));
+ ++st->line_count;
+ XSetForeground (st->dpy, st->context, st->colors [st->color_index].pixel);
+ if (st->plot_maximum_x < x1) st->plot_maximum_x = x1;
+ if (st->plot_maximum_x < x2) st->plot_maximum_x = x2;
+ if (st->plot_maximum_y < y1) st->plot_maximum_y = y1;
+ if (st->plot_maximum_y < y2) st->plot_maximum_y = y2;
+ if (st->plot_minimum_x > x1) st->plot_minimum_x = x1;
+ if (st->plot_minimum_x > x2) st->plot_minimum_x = x2;
+ if (st->plot_minimum_y > y1) st->plot_minimum_y = y1;
+ if (st->plot_minimum_y > y2) st->plot_minimum_y = y2;
+ XDrawLine (st->dpy, st->pixmap, st->context,
+ (int)(((x1 - minimum_x) / delta_x) * st->width),
+ (int)(((maximum_y - y1) / delta_y) * st->height),
+ (int)(((x2 - minimum_x) / delta_x) * st->width),
+ (int)(((maximum_y - y2) / delta_y) * st->height));
+ }
+ else
+ {
+ int index = 0;
+ double next_x = 0.0;
+ double next_y = 0.0;
+ Position* replacement = (Position*)NULL;
+ double x = 0.0;
+ double y = 0.0;
+
+ replacement = (Position*)(malloc (segment_count * sizeof (Segment)));
+ copy_points (segment_count, points, replacement);
+ assert (fabs ((replacement [segment_count - 1].x) - 1.0) < EPSILON);
+ assert (fabs (replacement [segment_count - 1].y) < EPSILON);
+ realign (x1, y1, x2, y2, segment_count, replacement);
+ /* jwz: I don't understand what these assertions are supposed to
+ be detecting, but let's just bail on the fractal instead of
+ crashing. */
+/* assert (fabs (x2 - (replacement [segment_count - 1].x)) < EPSILON);
+ assert (fabs (y2 - (replacement [segment_count - 1].y)) < EPSILON);*/
+ if (fabs (x2 - (replacement [segment_count - 1].x)) >= EPSILON ||
+ fabs (y2 - (replacement [segment_count - 1].y)) >= EPSILON) {
+ free (replacement);
+ return False;
+ }
+ x = x1;
+ y = y1;
+ for (index = 0; index < segment_count; ++index)
+ {
+ next_x = replacement [index].x;
+ next_y = replacement [index].y;
+ if (!self_similar_normalized (st,
+ iterations - 1, x, y, next_x, next_y,
+ maximum_x, maximum_y,
+ minimum_x, minimum_y,
+ segment_count, points)) {
+ free(replacement);
+ return False;
+ }
+ x = next_x;
+ y = next_y;
+ }
+ free(replacement);
+ }
+ return True;
+}
+
+static void
+self_similar (struct state *st,
+ Pixmap pixmap,
+ GC context,
+ int width,
+ int height,
+ int iterations,
+ double x1,
+ double y1,
+ double x2,
+ double y2,
+ double maximum_x,
+ double maximum_y,
+ double minimum_x,
+ double minimum_y,
+ int segment_count,
+ Segment* segments)
+{
+ Position* points = (Position*)NULL;
+
+ points = (Position*)(malloc (segment_count * sizeof (Position)));
+ normalized_plot (segment_count, segments, points);
+ assert (fabs ((points [segment_count - 1].x) - 1.0) < EPSILON);
+ assert (fabs (points [segment_count - 1].y) < EPSILON);
+ self_similar_normalized (st, iterations,
+ x1, y1, x2, y2,
+ maximum_x, maximum_y,
+ minimum_x, minimum_y,
+ segment_count, points);
+ free((void*)points);
+}
+
+static
+double
+random_double (double base,
+ double limit,
+ double epsilon)
+{
+ double range = 0.0;
+ unsigned int steps = 0;
+
+ assert (base < limit);
+ assert (epsilon > 0.0);
+ range = limit - base;
+ steps = (unsigned int)(floor (range / epsilon));
+ return base + ((random () % steps) * epsilon);
+}
+
+static void
+select_2_pattern (Segment* segments)
+{
+ if ((random () % 2) == 0)
+ {
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = -M_PI_4;
+ segments [0].length = M_SQRT2;
+ segments [1].angle = M_PI_4;
+ segments [1].length = M_SQRT2;
+ }
+ else
+ {
+ segments [0].angle = M_PI_4;
+ segments [0].length = M_SQRT2;
+ segments [1].angle = -M_PI_4;
+ segments [1].length = M_SQRT2;
+ }
+ }
+ else
+ {
+ segments [0].angle
+ = random_double (M_PI / 6.0, M_PI / 3.0, M_PI / 180.0);
+ segments [0].length = random_double (0.25, 0.67, 0.001);
+ if ((random () % 2) == 0)
+ {
+ segments [1].angle = -(segments [0].angle);
+ segments [1].length = segments [0].length;
+ }
+ else
+ {
+ segments [1].angle = random_double ((-M_PI) / 3.0,
+ (-M_PI) / 6.0,
+ M_PI / 180.0);
+ segments [1].length = random_double (0.25, 0.67, 0.001);
+ }
+ }
+}
+
+static void
+select_3_pattern (Segment* segments)
+{
+ switch (random () % 5)
+ {
+ case 0:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = M_PI_4;
+ segments [0].length = M_SQRT2 / 4.0;
+ segments [1].angle = -M_PI_4;
+ segments [1].length = M_SQRT2 / 2.0;
+ segments [2].angle = M_PI_4;
+ segments [2].length = M_SQRT2 / 4.0;
+ }
+ else
+ {
+ segments [0].angle = -M_PI_4;
+ segments [0].length = M_SQRT2 / 4.0;
+ segments [1].angle = M_PI_4;
+ segments [1].length = M_SQRT2 / 2.0;
+ segments [2].angle = -M_PI_4;
+ segments [2].length = M_SQRT2 / 4.0;
+ }
+ break;
+ case 1:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = M_PI / 6.0;
+ segments [0].length = 1.0;
+ segments [1].angle = -M_PI_2;
+ segments [1].length = 1.0;
+ segments [2].angle = M_PI / 6.0;
+ segments [2].length = 1.0;
+ }
+ else
+ {
+ segments [0].angle = -M_PI / 6.0;
+ segments [0].length = 1.0;
+ segments [1].angle = M_PI_2;
+ segments [1].length = 1.0;
+ segments [2].angle = -M_PI / 6.0;
+ segments [2].length = 1.0;
+ }
+ break;
+ case 2:
+ case 3:
+ case 4:
+ segments [0].angle
+ = random_double (M_PI / 6.0, M_PI / 3.0, M_PI / 180.0);
+ segments [0].length = random_double (0.25, 0.67, 0.001);
+ segments [1].angle
+ = random_double (-M_PI / 3.0, -M_PI / 6.0, M_PI / 180.0);
+ segments [1].length = random_double (0.25, 0.67, 0.001);
+ if ((random () % 3) == 0)
+ {
+ if ((random () % 2) == 0)
+ {
+ segments [2].angle = segments [0].angle;
+ }
+ else
+ {
+ segments [2].angle = -(segments [0].angle);
+ }
+ segments [2].length = segments [0].length;
+ }
+ else
+ {
+ segments [2].angle
+ = random_double (-M_PI / 3.0, -M_PI / 6.0, M_PI / 180.0);
+ segments [2].length = random_double (0.25, 0.67, 0.001);
+ }
+ break;
+ }
+}
+
+static void
+select_4_pattern (Segment* segments)
+{
+ switch (random () % 9)
+ {
+ case 0:
+ if ((random () % 2) == 0)
+ {
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = M_PI_2;
+ segments [1].length = length;
+ segments [2].angle = -M_PI_2;
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ else
+ {
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = -M_PI_2;
+ segments [1].length = length;
+ segments [2].angle = M_PI_2;
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ break;
+ case 1:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = M_PI_2;
+ segments [1].length = 0.45;
+ segments [2].angle = -M_PI_2;
+ segments [2].length = 0.45;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ else
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = -M_PI_2;
+ segments [1].length = 0.45;
+ segments [2].angle = M_PI_2;
+ segments [2].length = 0.45;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ break;
+ case 2:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (5.0 * M_PI) / 12.0;
+ segments [1].length = 1.2;
+ segments [2].angle = (-5.0 * M_PI) / 12.0;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-5.0 * M_PI) / 12.0;
+ segments [1].length = 1.2;
+ segments [2].angle = (5.0 * M_PI) / 12.0;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 3:
+ if ((random () % 2) == 0)
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = angle;
+ segments [1].length = 1.2;
+ segments [2].angle = (-angle);
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-angle);
+ segments [1].length = 1.2;
+ segments [2].angle = angle;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 4:
+ if ((random () % 2) == 0)
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = angle;
+ segments [1].length = 1.2;
+ segments [2].angle = (-angle);
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-angle);
+ segments [1].length = 1.2;
+ segments [2].angle = angle;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 5:
+ if ((random () % 2) == 0)
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = angle;
+ segments [1].length = length;
+ segments [2].angle = (-angle);
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-angle);
+ segments [1].length = length;
+ segments [2].angle = angle;
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 6:
+ case 7:
+ case 8:
+ segments [0].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [0].length = random_double (0.25, 0.50, 0.001);
+ segments [1].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [1].length = random_double (0.25, 0.50, 0.001);
+ if ((random () % 3) == 0)
+ {
+ segments [2].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [2].length = random_double (0.25, 0.50, 0.001);
+ segments [3].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [3].length = random_double (0.25, 0.50, 0.001);
+ }
+ else
+ {
+ if ((random () % 2) == 0)
+ {
+ segments [2].angle = -(segments [1].angle);
+ segments [2].length = segments [1].length;
+ segments [3].angle = -(segments [0].angle);
+ segments [3].length = segments [0].length;
+ }
+ else
+ {
+ segments [2].angle = segments [1].angle;
+ segments [2].length = segments [1].length;
+ segments [3].angle = segments [0].angle;
+ segments [3].length = segments [0].length;
+ }
+ }
+ break;
+ }
+}
+
+static void
+select_pattern (int segment_count,
+ Segment* segments)
+{
+ switch (segment_count)
+ {
+ case 2:
+ select_2_pattern (segments);
+ break;
+ case 3:
+ select_3_pattern (segments);
+ break;
+ case 4:
+ select_4_pattern (segments);
+ break;
+ default:
+ fprintf (stderr, "\nBad segment count, must be 2, 3, or 4.\n");
+ exit (1);
+ }
+}
+
+#define Y_START (0.5)
+
+static void *
+ccurve_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ unsigned long int black = 0;
+ int depth = 0;
+ XWindowAttributes hack_attributes;
+ XGCValues values;
+ unsigned long int white = 0;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->delay = get_float_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_float_resource (st->dpy, "pause", "Integer");
+ st->maximum_lines = get_integer_resource (st->dpy, "limit", "Integer");
+ black = BlackPixel (st->dpy, DefaultScreen (st->dpy));
+ white = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ st->background = black;
+ XGetWindowAttributes (st->dpy, st->window, &hack_attributes);
+ st->width = hack_attributes.width;
+ st->height = hack_attributes.height;
+ depth = hack_attributes.depth;
+ st->color_map = hack_attributes.colormap;
+ st->pixmap = XCreatePixmap (st->dpy, st->window, st->width, st->height, depth);
+ values.foreground = white;
+ values.background = black;
+ st->context = XCreateGC (st->dpy, st->window, GCForeground | GCBackground,
+ &values);
+ st->color_count = MAXIMUM_COLOR_COUNT;
+ make_color_loop (hack_attributes.screen, hack_attributes.visual,
+ st->color_map,
+ 0, 1, 1,
+ 120, 1, 1,
+ 240, 1, 1,
+ st->colors, &st->color_count, True, False);
+ if (st->color_count <= 0)
+ {
+ st->color_count = 1;
+ st->colors [0].red = st->colors [0].green = st->colors [0].blue = 0xFFFF;
+ XAllocColor (st->dpy, st->color_map, &st->colors [0]);
+ }
+
+ st->draw_maximum_x = 1.20;
+ st->draw_maximum_y = 0.525;
+ st->draw_minimum_x = -0.20;
+ st->draw_minimum_y = -0.525;
+ st->draw_x2 = 1.0;
+
+ return st;
+}
+
+static unsigned long
+ccurve_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ static const int lengths [] = { 4, 4, 4, 4, 4, 3, 3, 3, 2 };
+
+ if (st->draw_index == 0)
+ {
+ st->draw_segment_count
+ = lengths [random () % (sizeof (lengths) / sizeof (int))];
+ st->draw_segments
+ = (Segment*)(malloc ((st->draw_segment_count) * sizeof (Segment)));
+ select_pattern (st->draw_segment_count, st->draw_segments);
+ st->draw_iterations = floor (log (st->maximum_lines)
+ / log (((double)(st->draw_segment_count))));
+ if ((random () % 3) != 0)
+ {
+ double factor = 0.45;
+ st->draw_x1 += random_double (-factor, factor, 0.001);
+ st->draw_y1 += random_double (-factor, factor, 0.001);
+ st->draw_x2 += random_double (-factor, factor, 0.001);
+ st->draw_y2 += random_double (-factor, factor, 0.001);
+ }
+/* background = (random () % 2) ? black : white; */
+
+ }
+
+ /* for (st->draw_index = 0; st->draw_index < st->draw_iterations; ++st->draw_index) */
+ {
+ double delta_x = 0.0;
+ double delta_y = 0.0;
+
+ XSetForeground (st->dpy, st->context, st->background);
+ XFillRectangle (st->dpy, st->pixmap, st->context, 0, 0, st->width, st->height);
+ st->line_count = 0;
+ st->total_lines = (int)(pow ((double)(st->draw_segment_count),
+ (double)st->draw_index));
+ st->plot_maximum_x = -1000.00;
+ st->plot_maximum_y = -1000.00;
+ st->plot_minimum_x = 1000.00;
+ st->plot_minimum_y = 1000.00;
+ self_similar (st, st->pixmap, st->context, st->width, st->height, st->draw_index,
+ st->draw_x1, st->draw_y1, st->draw_x2, st->draw_y2,
+ st->draw_maximum_x,
+ st->draw_maximum_y,
+ st->draw_minimum_x,
+ st->draw_minimum_y,
+ st->draw_segment_count, st->draw_segments);
+ delta_x = st->plot_maximum_x - st->plot_minimum_x;
+ delta_y = st->plot_maximum_y - st->plot_minimum_y;
+ st->draw_maximum_x = st->plot_maximum_x + (delta_x * 0.2);
+ st->draw_maximum_y = st->plot_maximum_y + (delta_y * 0.2);
+ st->draw_minimum_x = st->plot_minimum_x - (delta_x * 0.2);
+ st->draw_minimum_y = st->plot_minimum_y - (delta_y * 0.2);
+ delta_x = st->draw_maximum_x - st->draw_minimum_x;
+ delta_y = st->draw_maximum_y - st->draw_minimum_y;
+ if ((delta_y / delta_x) > (((double)st->height) / ((double)st->width)))
+ {
+ double new_delta_x
+ = (delta_y * ((double)st->width)) / ((double)st->height);
+ st->draw_minimum_x -= (new_delta_x - delta_x) / 2.0;
+ st->draw_maximum_x += (new_delta_x - delta_x) / 2.0;
+ }
+ else
+ {
+ double new_delta_y
+ = (delta_x * ((double)st->height)) / ((double)st->width);
+ st->draw_minimum_y -= (new_delta_y - delta_y) / 2.0;
+ st->draw_maximum_y += (new_delta_y - delta_y) / 2.0;
+ }
+ XCopyArea (st->dpy, st->pixmap, st->window, st->context, 0, 0, st->width, st->height,
+ 0, 0);
+ }
+ st->draw_index++;
+ /* #### mi->recursion_depth = st->draw_index; */
+
+ if (st->draw_index >= st->draw_iterations)
+ {
+ st->draw_index = 0;
+ free((void*)st->draw_segments);
+ st->draw_segments = 0;
+ return (int) (1000000 * st->delay);
+ }
+ else
+ return (int) (1000000 * st->delay2);
+}
+
+static void
+ccurve_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes xgwa;
+ st->width = w;
+ st->height = h;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ XFreePixmap (dpy, st->pixmap);
+ st->pixmap = XCreatePixmap (st->dpy, st->window, st->width, st->height,
+ xgwa.depth);
+}
+
+static Bool
+ccurve_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->draw_index = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+ccurve_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *ccurve_defaults [] =
+{
+ ".background: black",
+ ".foreground: white",
+ ".delay: 3",
+ ".pause: 0.4",
+ ".limit: 200000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec ccurve_options [] =
+{
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-pause", ".pause", XrmoptionSepArg, 0 },
+ { "-limit", ".limit", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("CCurve", ccurve)
diff --git a/hacks/ccurve.man b/hacks/ccurve.man
new file mode 100644
index 0000000..93b81fc
--- /dev/null
+++ b/hacks/ccurve.man
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ccurve - self-similar linear fractals.
+.SH SYNOPSIS
+.B ccurve
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-pause \fInumber\fP]
+[\-limit \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Generates self-similar linear fractals, including the classic ``C Curve.''
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Delay. 0 - 60. Default: 1.
+.TP 8
+.B \-pause \fInumber\fP
+Duration. 1 - 60. Default: 3.
+.TP 8
+.B \-limit \fInumber\fP
+Density. 3 - 300000. Default: 200000.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Rick Campbell. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Rick Campbell.
diff --git a/hacks/celtic.c b/hacks/celtic.c
new file mode 100644
index 0000000..890b398
--- /dev/null
+++ b/hacks/celtic.c
@@ -0,0 +1,1131 @@
+/* celtic, Copyright (c) 2006 Max Froumentin <max@lapin-bleu.net>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * A celtic pattern programme inspired by "Les Entrelacs Celtes", by
+ * Christian Mercat, Dossier Pour La Science, no. 47, april/june 2005.
+ * See <http://www.entrelacs.net/>
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "erase.h"
+
+#define SQRT_3 1.73205080756887729352
+#undef assert
+#define assert(EXP) do { if (!((EXP))) abort(); } while(0)
+
+/*-----------------------------------------*/
+
+struct params {
+ unsigned long curve_width, shadow_width;
+ double shape1, shape2;
+ unsigned long margin;
+
+ enum graph_type { polar, tgrid, kennicott, triangle } type;
+ unsigned long edge_size;
+ unsigned long cluster_size; /* only used if type is kennicott */
+ unsigned long delay; /* controls curve drawing speed (step delay
+ * in microsecs) */
+ unsigned long nsteps; /* only if triangle: number of subdivisions along the side */
+ unsigned long nb_orbits; /* only used if type is polar */
+ unsigned long nb_nodes_per_orbit; /* only used if type is polar */
+
+ double angle; /* angle of rotation of the graph around the centre */
+};
+
+/*-----------------------------------------*/
+typedef enum direction {
+ CLOCKWISE=0, ANTICLOCKWISE=1
+} Direction;
+
+
+/*-----------------------------------------*/
+typedef struct array {
+ int nb_elements;
+ int nb_allocated_elements;
+ int increment;
+ void **elements;
+} *Array;
+
+typedef struct graph {
+ Array nodes;
+ Array edges;
+} *Graph;
+
+typedef struct edge_couple {
+ int **array;
+ int size;
+} *EdgeCouple;
+
+typedef struct pattern {
+ double shape1, shape2;
+ EdgeCouple ec;
+ Graph graph;
+ Array splines;
+ int ncolors;
+} *Pattern;
+
+struct state {
+ Display *dpy;
+ Window window;
+ eraser_state *eraser;
+
+ int ncolors;
+ XColor *colors;
+ GC gc,shadow_gc,gc_graph;
+
+ Bool showGraph;
+ Pattern pattern;
+ Graph graph;
+ XWindowAttributes xgwa;
+ int delay2;
+ int reset, force_reset;
+ double t;
+
+ struct params params;
+};
+
+
+
+
+static Array array_new(int increment)
+{
+ Array new;
+ assert(new=(Array)calloc(1,sizeof(struct array)));
+ new->nb_elements=0;
+ new->nb_allocated_elements=0;
+ new->increment=increment;
+ return new;
+}
+
+static void array_del(Array a, void (*free_element)(void*))
+{
+ int i;
+ if (free_element)
+ for (i=0;i<a->nb_elements;i++)
+ free_element(a->elements[i]);
+ free(a->elements);
+ free(a);
+}
+
+static void array_add_element(Array a, void *element)
+{
+ if (a->nb_elements == a->nb_allocated_elements) {
+ /* we must allocate more */
+ a->nb_allocated_elements+=a->increment;
+ a->elements=realloc(a->elements,a->nb_allocated_elements*sizeof(void *));
+ }
+ a->elements[a->nb_elements++]=element;
+}
+/*-----------------------------------------*/
+
+typedef struct node {
+ double x,y;
+ Array edges;
+} *Node;
+
+typedef struct edge {
+ Node node1, node2;
+ double angle1, angle2;
+} *Edge;
+
+/*-----------------------------------------*/
+/* Node functions */
+
+static Node node_new(double x, double y)
+{
+ Node new;
+ assert(new = (Node)calloc(1,sizeof(struct node)));
+ new->x=x;
+ new->y=y;
+ new->edges = array_new(10);
+ return new;
+}
+
+static void node_del(void *n)
+{ /* not Node * because the function is passed to array_del */
+ array_del(((Node)n)->edges,NULL);
+ free(n);
+}
+
+#if 0
+static void node_to_s(Node n, FILE *f)
+{
+ fprintf(f,"Node: %g %g\n",n->x,n->y);
+}
+#endif
+
+static void node_draw(struct state *st, Node n)
+{
+ XDrawArc(st->dpy,st->window,st->gc_graph,(int)rint(n->x)-5,(int)rint(n->y)-5,10,10,0,360*64);
+}
+
+static void node_add_edge(Node n, Edge e)
+{
+ array_add_element(n->edges,e);
+}
+
+
+/*-----------------------------------------*/
+/* Edge functions */
+
+static Edge edge_new(Node n1, Node n2)
+{
+ Edge new;
+ assert(new = (Edge)calloc(1,sizeof(struct edge)));
+ new->node1=n1;
+ new->node2=n2;
+ new->angle1=atan2(new->node2->y - new->node1->y, new->node2->x - new->node1->x);
+ if (new->angle1 < 0) new->angle1+=6.28;
+
+ new->angle2=atan2(new->node1->y - new->node2->y, new->node1->x - new->node2->x);
+ if (new->angle2 < 0) new->angle2+=6.28;
+ return new;
+}
+
+static void edge_del(void *e) /* not Edge * because the function is passed to array_del */
+{
+ free(e);
+}
+
+#if 0
+static void edge_to_s(Edge e, FILE *f)
+{
+ fprintf(f,"Edge: (%g, %g), (%g, %g) angles: %g, %g\n",
+ e->node1->x, e->node1->y, e->node2->x, e->node2->y,
+ e->angle1, e->angle2);
+}
+#endif
+
+static void edge_draw(struct state *st, Edge e)
+{
+ XDrawLine(st->dpy,st->window,st->gc_graph, e->node1->x, e->node1->y, e->node2->x, e->node2->y);
+}
+
+static double edge_angle(Edge e, Node n)
+{
+ /* returns the angle of the edge at Node n */
+ assert(n==e->node1 || n==e->node2);
+ if (n==e->node1) return e->angle1; else return e->angle2;
+}
+
+static Node edge_other_node(Edge e, Node n)
+{
+ assert(n==e->node1 || n==e->node2);
+ if (n==e->node1) return e->node2; else return e->node1;
+}
+
+static double edge_angle_to(Edge e, Edge e2, Node node, Direction direction)
+{
+ /* returns the absolute angle from this edge to "edge2" around
+ "node" following "direction" */
+ double a;
+
+ if (direction==CLOCKWISE)
+ a=edge_angle(e,node) - edge_angle(e2,node);
+ else
+ a=edge_angle(e2,node) - edge_angle(e,node);
+
+ if (a<0) return a+2*M_PI; else return a;
+}
+
+/*-----------------------------------------*/
+
+static Graph graph_new(struct state *st)
+{
+ Graph new;
+ assert(new = (Graph)calloc(1,sizeof(struct graph)));
+ new->nodes = array_new(100);
+ new->edges = array_new(100);
+ return new;
+}
+
+static void graph_del(Graph g)
+{
+ array_del(g->nodes, &node_del);
+ array_del(g->edges, &edge_del);
+ free(g);
+}
+
+
+static void graph_add_node(Graph g, Node n)
+{
+ array_add_element(g->nodes, n);
+}
+
+static void graph_add_edge(Graph g, Edge e)
+{
+ array_add_element(g->edges, e);
+
+ /* for each node n of e, add n to pointer e */
+ node_add_edge(e->node1, e);
+ node_add_edge(e->node2, e);
+}
+
+static Edge graph_next_edge_around(Graph g, Node n, Edge e, Direction direction)
+{
+ /* return the next edge after e around node n clockwise */
+ double angle, minangle=20;
+ Edge next_edge = e, edge;
+ int i;
+
+ for (i=0;i<n->edges->nb_elements;i++) {
+ edge=n->edges->elements[i];
+ if (edge != e) {
+ angle = edge_angle_to(e,edge,n,direction);
+ if (angle < minangle) {
+ next_edge=edge;
+ minangle=angle;
+ }
+ }
+ }
+ return next_edge;
+}
+
+#if 0
+static void graph_to_s(Graph g, FILE *f)
+{
+ int i;
+ for (i=0;i<g->nodes->nb_elements;i++)
+ node_to_s(g->nodes->elements[i],f);
+ for (i=0;i<g->edges->nb_elements;i++)
+ edge_to_s(g->edges->elements[i],f);
+}
+#endif
+
+static void graph_draw(struct state *st, Graph g)
+{
+ int i;
+
+ for (i=0;i<g->nodes->nb_elements;i++)
+ node_draw(st, g->nodes->elements[i]);
+ for (i=0;i<g->edges->nb_elements;i++)
+ edge_draw(st, g->edges->elements[i]);
+}
+
+static void graph_rotate(Graph g, double angle, int cx, int cy)
+{
+ /* rotate all the nodes of the graph around the centre */
+ int i;
+ float c=cos(angle),s=sin(angle),x,y;
+ Node n;
+ for (i=0;i<g->nodes->nb_elements;i++) {
+ n=g->nodes->elements[i];
+ x=n->x; y=n->y;
+ n->x = (x-cx)*c-(y-cy)*s + cx;
+ n->y = (x-cx)*s+(y-cy)*c + cy;
+ }
+}
+
+
+/*---------------------------*/
+
+static Graph make_polar_graph(struct state *st,
+ int xmin, int ymin, int width, int height,
+ int nbp, /* number of points on each orbit */
+ int nbo /* number of orbits */)
+ /* make a simple grid graph, with edges present or absent randomly */
+{
+ int cx = width/2+xmin, cy=height/2+ymin; /* centre */
+ int os = (width<height?width:height)/(2*nbo); /* orbit height */
+ Graph g;
+ Node *grid;
+ int o,p;
+
+ /* generate nodes */
+ assert(grid=(Node*)calloc(1+nbp*nbo,sizeof(Node)));
+ assert(g=graph_new(st));
+
+ graph_add_node(g, grid[0]=node_new((double)cx,(double)cy));
+
+ for (o=0;o<nbo;o++)
+ for (p=0;p<nbp;p++)
+ graph_add_node(g,
+ grid[1+o*nbp+p]=node_new(cx+(o+1)*os*sin(p*2*M_PI/nbp),
+ cy+(o+1)*os*cos(p*2*M_PI/nbp)));
+
+
+ /* generate edges */
+ for (o=0;o<nbo;o++)
+ for (p=0;p<nbp;p++) {
+ if (o==0) /* link first orbit nodes with centre */
+ graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[0]));
+ else /* liink orbit nodes with lower orbit */
+ graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[1+(o-1)*nbp+p]));
+ /* link along orbit */
+ graph_add_edge(g,edge_new(grid[1+o*nbp+p],
+ grid[1+o*nbp+(p+1)%nbp]));
+ }
+
+ free(grid);
+ return g;
+}
+
+
+static Graph make_grid_graph(struct state *st,
+ int xmin, int ymin, int width, int height, int step)
+ /* make a simple grid graph */
+{
+ Graph g;
+ int row,col,x,y;
+ int size=(width<height?height:width);
+
+ /* empirically, it seems there are 2 curves only if both
+ nbcol and nbrow are even, so we round them to even */
+ int nbcol=(2+size/step)/2*2, nbrow=(2+size/step)/2*2;
+
+ Node *grid;
+ assert(grid=(Node*)calloc(nbrow*nbcol,sizeof(Node)));
+ assert(g=graph_new(st));
+
+
+ /* adjust xmin and xmax so that the grid is centered */
+ xmin+=(width-(nbcol-1)*step)/2;
+ ymin+=(height-(nbrow-1)*step)/2;
+
+ /* create node grid */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ x=col*step+xmin;
+ y=row*step+ymin;
+ grid[row+col*nbrow]=node_new((double)x, (double)y);
+ graph_add_node(g, grid[row+col*nbrow]);
+ }
+
+ /* create edges */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ if (col!=nbcol-1)
+ graph_add_edge(g,edge_new(grid[row+col*nbrow],
+ grid[row+(col+1)*nbrow]));
+ if (row!=nbrow-1)
+ graph_add_edge(g,edge_new(grid[row+col*nbrow],grid[row+1+col*nbrow]));
+ if (col!=nbcol-1 && row!=nbrow-1) {
+ graph_add_edge(g,edge_new(grid[row+col*nbrow],
+ grid[row+1+(col+1)*nbrow]));
+ graph_add_edge(g,edge_new(grid[row+1+col*nbrow],
+ grid[row+(col+1)*nbrow]));
+ }
+ }
+
+ free(grid);
+
+ return g;
+}
+
+
+static Graph make_triangle_graph(struct state *st,
+ int xmin, int ymin, int width, int height, int edge_size)
+{
+ Graph g;
+ Node *grid;
+ int row,col;
+ double L=(width<height?width:height)/2.0; /* circumradius of the triangle */
+ double cx=xmin+width/2.0, cy=ymin+height/2.0; /* centre of the triangle */
+ double p2x=cx-L*SQRT_3/2.0, p2y=cy+L/2.0; /* p2 is the bottom left vertex */
+ double x,y;
+ int nsteps=3*L/(SQRT_3*edge_size);
+
+ assert(grid=(Node*)calloc((nsteps+1)*(nsteps+1),sizeof(Node)));
+ assert(g=graph_new(st));
+
+ /* create node grid */
+ for (row=0;row<=nsteps;row++)
+ for (col=0;col<=nsteps;col++)
+ if (row+col<=nsteps) {
+ x=p2x+col*L*SQRT_3/nsteps + row*L*SQRT_3/(2*nsteps);
+ y=p2y-row*3*L/(2*nsteps);
+ grid[col+row*(nsteps+1)]=node_new((double)x, (double)y);
+ graph_add_node(g, grid[col+row*(nsteps+1)]);
+ }
+
+ /* create edges */
+ for (row=0;row<nsteps;row++)
+ for (col=0;col<nsteps;col++)
+ if (row+col<nsteps) {
+ /* horizontal edges */
+ graph_add_edge(g,edge_new(grid[row+col*(nsteps+1)],grid[row+(col+1)*(nsteps+1)]));
+ /* vertical edges */
+ graph_add_edge(g,edge_new(grid[row+col*(nsteps+1)],grid[row+1+col*(nsteps+1)]));
+ /* diagonal edges */
+ graph_add_edge(g,edge_new(grid[row+1+col*(nsteps+1)],grid[row+(col+1)*(nsteps+1)]));
+ }
+
+ free(grid);
+ return g;
+
+}
+
+
+static Graph make_kennicott_graph(struct state *st,
+ int xmin, int ymin, int width, int height, int step,
+ int cluster_size)
+ /* make a graph inspired by one of the motifs from the Kennicott bible */
+ /* square grid of clusters of the shape /|\
+ * ---
+ * \|/
+ * cluster_size is the length of an edge of a cluster
+ */
+{
+ Graph g;
+ int row,col,x,y;
+ int size=width<height?height:width;
+ int nbcol=(1+size/step)/2*2, nbrow=(1+size/step)/2*2;
+ Node *grid;
+
+ /* there are 5 nodes by for each cluster */
+ assert(grid=(Node*)calloc(5*nbrow*nbcol,sizeof(Node)));
+ assert(g=graph_new(st));
+
+ /* adjust xmin and xmax so that the grid is centered */
+ xmin+=(width-(nbcol-1)*step)/2;
+ ymin+=(height-(nbrow-1)*step)/2;
+
+ /* create node grid */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ int ci=5*(row+col*nbrow);
+ x=col*step+xmin;
+ y=row*step+ymin;
+
+ /* create a cluster centred on x,y */
+ grid[ci ]=node_new((double)x, (double)y);
+ grid[ci+1]=node_new((double)(x+cluster_size), (double)y);
+ grid[ci+2]=node_new((double)x, (double)(y-cluster_size));
+ grid[ci+3]=node_new((double)(x-cluster_size), (double)y);
+ grid[ci+4]=node_new((double)x, (double)(y+cluster_size));
+
+ graph_add_node(g, grid[ci]);
+ graph_add_node(g, grid[ci+1]);
+ graph_add_node(g, grid[ci+2]);
+ graph_add_node(g, grid[ci+3]);
+ graph_add_node(g, grid[ci+4]);
+
+ /* internal edges */
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+1]));
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+2]));
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+3]));
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+4]));
+ graph_add_edge(g,edge_new(grid[ci+1], grid[ci+2]));
+ graph_add_edge(g,edge_new(grid[ci+2], grid[ci+3]));
+ graph_add_edge(g,edge_new(grid[ci+3], grid[ci+4]));
+ graph_add_edge(g,edge_new(grid[ci+4], grid[ci+1]));
+
+ }
+
+ /* create inter-cluster edges */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ if (col!=nbcol-1)
+ /* horizontal edge from edge 1 of cluster (row, col) to edge 3
+ * of cluster (row,col+1) */
+ graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+1],grid[5*(row+(col+1)*nbrow)+3]));
+ if (row!=nbrow-1)
+ /* vertical edge from edge 4 of cluster (row, col) to edge 2
+ * of cluster (row+1,col) */
+ graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+4],
+ grid[5*(row+1+col*nbrow)+2]));
+ }
+ free(grid);
+ return g;
+}
+
+/*---------------------------*/
+typedef struct spline_segment {
+ double x1,y1,x2,y2,x3,y3,x4,y4;
+} *SplineSegment;
+
+typedef struct spline {
+ Array segments; /* array of SplineSegment */
+ int color;
+} *Spline;
+
+static Spline spline_new(int color)
+{
+ Spline new=(Spline)calloc(1,sizeof(struct spline));
+ new->segments=array_new(30);
+ new->color=color;
+ return new;
+}
+
+static void spline_del(void *s)
+{
+ array_del(((Spline)s)->segments,&free);
+ free(s);
+}
+
+static void spline_add_segment(Spline s,
+ double x1, double y1, double x2, double y2,
+ double x3, double y3, double x4, double y4)
+{
+ SplineSegment ss=(SplineSegment)calloc(1,sizeof(struct spline_segment));
+ ss->x1=x1; ss->x2=x2; ss->x3=x3; ss->x4=x4;
+ ss->y1=y1; ss->y2=y2; ss->y3=y3; ss->y4=y4;
+ array_add_element(s->segments,ss);
+}
+
+#if 0
+static void spline_to_s(Spline s, FILE *f)
+{
+ int i;
+ SplineSegment ss;
+ fprintf(f,"Spline: \n");
+ for (i=0;i<s->segments->nb_elements;i++) {
+ ss=s->segments->elements[i];
+ fprintf(f," - segment %d: (%g, %g),(%g, %g),(%g, %g),(%g, %g)\n",
+ i,ss->x1,ss->y1,ss->x2,ss->y2,ss->x3,ss->y3,ss->x4,ss->y4);
+ }
+}
+#endif
+
+static void spline_value_at(Spline s, double *x, double *y, double t, int *segment)
+{
+ int si;
+ double tt;
+ SplineSegment ss;
+ si = floor(t*s->segments->nb_elements);
+ tt = t*s->segments->nb_elements - si;
+ assert(tt>=0 && tt<1);
+ ss=s->segments->elements[si];
+
+ *x = ss->x1*(1-tt)*(1-tt)*(1-tt)+3*ss->x2*tt*(1-tt)*(1-tt)+3*ss->x3*tt*tt*(1-tt)+ss->x4*tt*tt*tt;
+ *y = ss->y1*(1-tt)*(1-tt)*(1-tt)+3*ss->y2*tt*(1-tt)*(1-tt)+3*ss->y3*tt*tt*(1-tt)+ss->y4*tt*tt*tt;
+
+ *segment=si;
+}
+
+/*---------------------------*/
+
+static EdgeCouple edge_couple_new(int nb_edges) {
+ int i;
+ EdgeCouple new = (EdgeCouple)calloc(1,sizeof(struct edge_couple));
+ new->array = (int **)calloc(nb_edges, sizeof(int*));
+ new->size = nb_edges;
+
+ for (i=0;i<nb_edges;i++) {
+ new->array[i]=(int *)calloc(2,sizeof(int));
+ new->array[i][CLOCKWISE]=0;
+ new->array[i][ANTICLOCKWISE]=0;
+ }
+ return new;
+}
+
+static void edge_couple_del(EdgeCouple e)
+{
+ int i;
+ for (i=0;i<e->size;i++) free(e->array[i]);
+ free(e->array);
+ free(e);
+}
+
+/*---------------------------*/
+
+static Pattern pattern_new(struct state *st, Graph g, double shape1, double shape2)
+{
+ Pattern new;
+ assert(new=(Pattern)calloc(1,sizeof(struct pattern)));
+ new->shape1=shape1;
+ new->shape2=shape2;
+ new->graph=g;
+ new->ec=edge_couple_new(g->edges->nb_elements);
+ new->splines=array_new(10);
+ new->ncolors=st->ncolors;
+ return new;
+}
+
+static void pattern_del(Pattern p)
+{
+ edge_couple_del(p->ec);
+ array_del(p->splines,&spline_del);
+ free(p);
+}
+
+static void pattern_edge_couple_set(Pattern p, Edge e, Direction d, int value)
+{
+ int i;
+ for (i=0;i<p->graph->edges->nb_elements;i++)
+ if (p->graph->edges->elements[i]==e) {
+ p->ec->array[i][d]=value;
+ return;
+ }
+}
+
+static void pattern_draw_spline_direction(Pattern p, Spline s,
+ Node node, Edge edge1, Edge edge2,
+ Direction direction)
+{
+ double x1=(edge1->node1->x+edge1->node2->x)/2.0;
+ double y1=(edge1->node1->y+edge1->node2->y)/2.0;
+
+ /* P2 (x2,y2) is the middle point of edge1 */
+ double x4=(edge2->node1->x+edge2->node2->x)/2.0;
+ double y4=(edge2->node1->y+edge2->node2->y)/2.0;
+
+ double alpha=edge_angle_to(edge1,edge2,node,direction)*p->shape1;
+ double beta=p->shape2;
+
+ double i1x,i1y,i2x,i2y,x2,y2,x3,y3;
+
+ if (direction == ANTICLOCKWISE) {
+ /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+ i1x = alpha*(node->y-y1)+x1;
+ i1y = -alpha*(node->x-x1)+y1;
+ i2x = -alpha*(node->y-y4)+x4;
+ i2y = alpha*(node->x-x4)+y4;
+ x2 = beta*(y1-i1y) + i1x;
+ y2 = -beta*(x1-i1x) + i1y;
+ x3 = -beta*(y4-i2y) + i2x;
+ y3 = beta*(x4-i2x) + i2y;
+ }
+ else {
+ /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+ i1x = -alpha*(node->y-y1)+x1;
+ i1y = alpha*(node->x-x1)+y1;
+ i2x = alpha*(node->y-y4)+x4;
+ i2y = -alpha*(node->x-x4)+y4;
+ x2 = -beta*(y1-i1y) + i1x;
+ y2 = beta*(x1-i1x) + i1y;
+ x3 = beta*(y4-i2y) + i2x;
+ y3 = -beta*(x4-i2x) + i2y;
+ }
+
+ spline_add_segment(s,x1,y1,x2,y2,x3,y3,x4,y4);
+}
+
+static int pattern_next_unfilled_couple(Pattern p, Edge *e, Direction *d)
+{
+ int i;
+ for (i=0;i<p->ec->size;i++) {
+ if (p->ec->array[i][CLOCKWISE]==0) {
+ *e=p->graph->edges->elements[i];
+ *d=CLOCKWISE;
+ return 1;
+ }
+ else if (p->ec->array[i][ANTICLOCKWISE]==0) {
+ *e=p->graph->edges->elements[i];
+ *d=ANTICLOCKWISE;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static void pattern_make_curves(Pattern p)
+{
+ Edge current_edge, first_edge, next_edge;
+ Node current_node, first_node;
+ Direction current_direction, first_direction;
+ Spline s;
+
+ while (pattern_next_unfilled_couple(p, &first_edge, &first_direction)) {
+ /* start a new loop */
+ s=spline_new(random()%(p->ncolors-2)+2);
+ array_add_element(p->splines, s);
+
+ current_edge=first_edge;
+ current_node=first_node=current_edge->node1;
+ current_direction=first_direction;
+
+ do {
+ pattern_edge_couple_set(p, current_edge, current_direction, 1);
+ next_edge = graph_next_edge_around(p->graph,current_node,current_edge,current_direction);
+
+ /* add the spline segment to the spline */
+ pattern_draw_spline_direction(p,s,current_node,
+ current_edge,next_edge,current_direction);
+
+ /* cross the edge */
+ current_edge = next_edge;
+ current_node = edge_other_node(next_edge, current_node);
+ current_direction=1-current_direction;
+
+ } while (current_node!=first_node || current_edge!=first_edge || current_direction!=first_direction);
+
+ if (s->segments->nb_elements==2) /* spline is just one point: remove it */
+ p->splines->elements[p->splines->nb_elements-1]=NULL;
+
+ }
+}
+
+static void pattern_animate(struct state *st)
+{
+ Pattern p = st->pattern;
+ double t = st->t;
+ double t2;
+ double x,y,x2,y2,x3,y3,x4,y4;
+ int i,segment,unused;
+ int ticks;
+ double step=0.0001; /* TODO: set the step (or the delay) as a
+ * function of the spline length, so that
+ * drawing speed is constant
+ */
+ Spline s;
+
+ XSetLineAttributes(st->dpy,st->gc,st->params.curve_width,LineSolid,CapRound,JoinRound);
+ XSetLineAttributes(st->dpy,st->shadow_gc,st->params.shadow_width,LineSolid,CapRound,JoinRound);
+
+ for (ticks=0;ticks<100 && t<1;ticks++) {
+ for (i=0;i<p->splines->nb_elements;i++)
+ if ((s=p->splines->elements[i])) { /* skip if one-point spline */
+ spline_value_at(s, &x, &y, fmod(t,1.0),&segment);
+ spline_value_at(s, &x2, &y2, fmod(t+step,1.0),&unused);
+
+ /* look ahead for the shadow segment */
+ t2=t+step;
+ if (t2<=1.0) {
+ spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+ while (t2+step<1.0 && (x3-x2)*(x3-x2)+(y3-y2)*(y3-y2) < st->params.shadow_width*st->params.shadow_width) {
+ t2+=step;
+ spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+ }
+
+ spline_value_at(s, &x4, &y4, fmod(t2+step,1.0),&unused);
+
+ /* draw shadow line */
+ XDrawLine(st->dpy,st->window,st->shadow_gc,
+ (int)rint(x3),(int)rint(y3),
+ (int)rint(x4),(int)rint(y4));
+ }
+ /* draw line segment */
+ if (p->splines->nb_elements==1)
+ XSetForeground(st->dpy, st->gc, st->colors[segment%(p->ncolors-3)+2].pixel);
+ else
+ XSetForeground(st->dpy, st->gc, st->colors[s->color].pixel);
+ XDrawLine(st->dpy,st->window,st->gc,
+ (int)rint(x),(int)rint(y),
+ (int)rint(x2),(int)rint(y2));
+ }
+ t+=step;
+ }
+ st->t=t;
+
+ if (t>=1) {
+ st->reset=1;
+
+ /* at the end we redraw back to remove shadow spillage */
+ for (i=0;i<p->splines->nb_elements;i++) {
+ if ((s=p->splines->elements[i])) {
+ double offset=step;
+ XSetForeground(st->dpy, st->gc, st->colors[s->color].pixel);
+ spline_value_at(s, &x, &y, fmod(t,1.0),&unused);
+
+ spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+
+ while ((x2-x)*(x2-x)+(y2-y)*(y2-y) < st->params.shadow_width*st->params.shadow_width) {
+ offset+=step;
+ spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+ }
+
+ XDrawLine(st->dpy,st->window,st->gc, (int)rint(x),(int)rint(y), (int)rint(x2),(int)rint(y2));
+ }
+ }
+ }
+}
+
+/*======================================================================*/
+
+static const char *celtic_defaults[] = {
+ ".background: black",
+ ".foreground: #333333",
+ "*fpsSolid: true",
+ "*ncolors: 20",
+ "*delay: 10000",
+ "*delay2: 5",
+ "*showGraph: False",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec celtic_options[] = {
+ {"-background", ".background", XrmoptionSepArg, 0},
+ {"-foreground", ".foreground", XrmoptionSepArg, 0},
+ {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+ {"-delay", ".delay", XrmoptionSepArg, 0},
+ {"-delay2", ".delay2", XrmoptionSepArg, 0},
+ {"-graph", ".showGraph", XrmoptionNoArg, "True"},
+ {0, 0, 0, 0}
+};
+
+#if 0
+static void params_to_s(FILE *f)
+{
+ switch (st->params.type) {
+ case polar: fprintf(f,"type: polar\n");
+ fprintf(f,"nb_orbits: %ld\n",st->params.nb_orbits);
+ fprintf(f,"nb_nodes_per_orbit: %ld\n",st->params.nb_nodes_per_orbit);
+ break;
+ case tgrid: fprintf(f,"type: grid\n");
+ fprintf(f,"edge_size: %ld\n",st->params.edge_size);
+ break;
+ case triangle: fprintf(f,"type: triangle\n");
+ fprintf(f,"edge_size: %ld\n",st->params.edge_size);
+ break;
+ case kennicott:
+ fprintf(f,"type: kennicott\n");
+ fprintf(f,"edge_size: %ld\n",st->params.edge_size);
+ fprintf(f,"cluster_size: %ld\n",st->params.cluster_size);
+ break;
+ }
+
+ fprintf(f,"curve width: %ld\n",st->params.curve_width);
+ fprintf(f,"shadow width: %ld\n",st->params.shadow_width);
+ fprintf(f,"shape1: %g\n",st->params.shape1);
+ fprintf(f,"shape2: %g\n",st->params.shape2);
+ fprintf(f,"margin: %ld\n",st->params.margin);
+ fprintf(f,"angle: %g\n",st->params.angle);
+ fprintf(f,"delay: %ld\n",st->params.delay);
+}
+#endif
+
+#if 0
+static void colormap_to_s(int ncolors, XColor *colors)
+{
+ int i;
+ printf("-- colormap (%d colors):\n",st->ncolors);
+ for (i=0;i<st->ncolors;i++)
+ printf("%d: %d %d %d\n", i, st->colors[i].red, st->colors[i].green, st->colors[i].blue);
+ printf("----\n");
+}
+#endif
+
+
+static void *
+celtic_init (Display *d_arg, Window w_arg)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy=d_arg; st->window=w_arg;
+ st->showGraph=get_boolean_resource (st->dpy, "showGraph", "Boolean");
+
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ assert(st->colors = (XColor *) calloc (st->ncolors,sizeof(XColor)));
+
+ if (get_boolean_resource(st->dpy, "mono", "Boolean"))
+ {
+ MONO:
+ st->ncolors = 1;
+ st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ }
+ else
+ {
+#if 0
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, True, 0, True);
+#else
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+#endif
+ if (st->ncolors < 2)
+ goto MONO;
+ else {
+ st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->colors[1].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ }
+ }
+
+
+ /* graphic context for curves */
+ gcv.foreground = st->colors[0].pixel;
+ gcv.background = st->colors[1].pixel;
+ gcv.line_width = st->params.curve_width;
+ gcv.cap_style=CapRound;
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground|GCLineWidth|GCCapStyle, &gcv);
+
+ /* graphic context for graphs */
+ gcv.foreground = st->colors[0].pixel;
+ gcv.background = st->colors[1].pixel;
+ st->gc_graph = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+
+ /* graphic context for shadows */
+ gcv.foreground = st->colors[1].pixel;
+ gcv.line_width = st->params.shadow_width;
+ gcv.cap_style=CapRound;
+ st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+
+ st->delay2 = 1000000 * get_integer_resource(st->dpy, "delay2", "Delay2");
+
+ return st;
+}
+
+static unsigned long
+celtic_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->eraser) {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return 10000;
+ }
+
+ if (st->reset || st->force_reset) {
+ int delay = (st->force_reset ? 0 : st->delay2);
+ st->reset = 0;
+ st->force_reset = 0;
+ st->t = 1;
+
+ if (st->pattern != NULL) {
+ pattern_del(st->pattern);
+ }
+ st->pattern = NULL;
+ graph_del(st->graph);
+
+ /* recolor each time */
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ if (st->ncolors > 2)
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return (delay);
+ }
+
+ if (st->pattern == NULL) {
+ st->params.curve_width=random()%5+4;
+ st->params.shadow_width=st->params.curve_width+4;
+ st->params.shape1=(15+random()%15)/10.0 -1.0;
+ st->params.shape2=(15+random()%15)/10.0 -1.0;
+ st->params.edge_size=10*(random()%5)+20;
+ st->params.delay=get_integer_resource(st->dpy, "delay", "Delay");
+ st->params.angle=random()%360*2*M_PI/360;
+ st->params.margin=(random()%8)*100-600;
+
+ switch (random()%4) {
+ case 0:
+ st->params.type=tgrid;
+ st->params.shape1=(random()%1*2-1.0)*(random()%10+3)/10.0;
+ st->params.shape2=(random()%1*2-1.0)*(random()%10+3)/10.0;
+ st->params.edge_size=10*(random()%5)+50;
+ break;
+ case 1:
+ st->params.type=kennicott;
+ st->params.shape1=(random()%20)/10.0 -1.0;
+ st->params.shape2=(random()%20)/10.0 -1.0;
+ st->params.edge_size=10*(random()%3)+70;
+ st->params.cluster_size=st->params.edge_size/(3.0+random()%10)-1;
+ break;
+ case 2:
+ st->params.type=triangle;
+ st->params.edge_size=10*(random()%5)+60;
+ st->params.margin=(random()%10)*100-900;
+ break;
+ case 3:
+ st->params.type=polar;
+ st->params.nb_orbits=2+random()%10;
+ st->params.nb_nodes_per_orbit=4+random()%10;
+ break;
+ }
+
+
+/* st->params.type= polar; */
+/* st->params.nb_orbits= 5; */
+/* st->params.nb_nodes_per_orbit= 19; */
+/* st->params.curve_width= 4; */
+/* st->params.shadow_width= 8; */
+/* st->params.shape1= 0.5; */
+/* st->params.shape2= 1.3; */
+/* st->params.margin= 30; */
+/* st->params.angle= 5.21853; */
+/* st->params.delay= 10000; */
+
+
+/* params_to_s(stdout); */
+
+ /*=======================================================*/
+
+
+ switch (st->params.type) {
+ case tgrid:
+ st->graph=make_grid_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size);
+ break;
+ case kennicott:
+ st->graph=make_kennicott_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size,
+ st->params.cluster_size);
+ break;
+ case triangle:
+ st->graph=make_triangle_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size);
+ break;
+ case polar:
+ st->graph=make_polar_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.nb_nodes_per_orbit,
+ st->params.nb_orbits);
+ break;
+ default:
+ st->graph=make_grid_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size);
+ break;
+ }
+
+ graph_rotate(st->graph,st->params.angle,st->xgwa.width/2,st->xgwa.height/2);
+
+ if (st->showGraph)
+ graph_draw(st, st->graph);
+
+ st->pattern=pattern_new(st, st->graph, st->params.shape1, st->params.shape2);
+ pattern_make_curves(st->pattern);
+ st->t = 0.0;
+ }
+
+ pattern_animate(st);
+
+ return st->params.delay;
+}
+
+
+static void
+celtic_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+celtic_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->force_reset = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+celtic_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+XSCREENSAVER_MODULE ("Celtic", celtic)
diff --git a/hacks/celtic.man b/hacks/celtic.man
new file mode 100644
index 0000000..9747cd5
--- /dev/null
+++ b/hacks/celtic.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+celtic - draws celtic cross-stich patterns
+.SH SYNOPSIS
+.B ifs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-delay2 \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-graph \fImode\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIceltic\fP program repeatedly draws random cross-stitch patterns.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000.
+.TP 8
+.B \-delay2 \fInumber\fP
+Delay between patterns, in seconds. Default: 5.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colours to use. Default: 20.
+.TP 8
+.B \-graph
+Whether to render the underlying graph. Default: no.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Max Froumentin. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Max Froumentin <max@lapin-bleu.net>
diff --git a/hacks/check-configs.pl b/hacks/check-configs.pl
new file mode 100755
index 0000000..7a7d0bb
--- /dev/null
+++ b/hacks/check-configs.pl
@@ -0,0 +1,1243 @@
+#!/usr/bin/perl -w
+# Copyright © 2008-2017 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This parses the .c and .xml files and makes sure they are in sync: that
+# options are spelled the same, and that all the numbers are in sync.
+#
+# It also converts the hacks/config/ XML files into the Android XML files.
+#
+# Created: 1-Aug-2008.
+
+require 5;
+use diagnostics;
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.26 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+my $debug_p = 0;
+
+
+my $text_default_opts = '';
+foreach (qw(text-mode text-literal text-file text-url text-program)) {
+ my $s = $_; $s =~ s/-(.)/\U$1/g; $s =~ s/url/URL/si;
+ $text_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n";
+}
+my $image_default_opts = '';
+foreach (qw(choose-random-images grab-desktop-images)) {
+ my $s = $_; $s =~ s/-(.)/\U$1/g;
+ $image_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n";
+}
+my $xlockmore_default_opts = '';
+foreach (qw(count cycles delay ncolors size font)) {
+ $xlockmore_default_opts .= "{\"-$_\", \".$_\", XrmoptionSepArg, 0},\n";
+}
+$xlockmore_default_opts .=
+ "{\"-wireframe\", \".wireframe\", XrmoptionNoArg, \"true\"},\n" .
+ "{\"-3d\", \".use3d\", XrmoptionNoArg, \"true\"},\n" .
+ "{\"-no-3d\", \".use3d\", XrmoptionNoArg, \"false\"},\n";
+
+my $thread_default_opts =
+ "{\"-threads\", \".useThreads\", XrmoptionNoArg, \"True\"},\n" .
+ "{\"-no-threads\", \".useThreads\", XrmoptionNoArg, \"False\"},\n";
+
+my $analogtv_default_opts = '';
+foreach (qw(color tint brightness contrast)) {
+ $analogtv_default_opts .= "{\"-tv-$_\", \".TV$_\", XrmoptionSepArg, 0},\n";
+}
+
+$analogtv_default_opts .= $thread_default_opts;
+
+
+
+# Returns two tables:
+# - A table of the default resource values.
+# - A table of "-switch" => "resource: value", or "-switch" => "resource: %"
+#
+sub parse_src($) {
+ my ($saver) = @_;
+ my $file = lc($saver) . ".c";
+
+ # kludge...
+ $file = 'apple2-main.c' if ($file eq 'apple2.c');
+ $file = 'sproingiewrap.c' if ($file eq 'sproingies.c');
+ $file = 'b_lockglue.c' if ($file eq 'bubble3d.c');
+ $file = 'polyhedra-gl.c' if ($file eq 'polyhedra.c');
+ $file = 'companion.c' if ($file eq 'companioncube.c');
+ $file = 'rd-bomb.c' if ($file eq 'rdbomb.c');
+
+ my $ofile = $file;
+ $file = "glx/$ofile" unless (-f $file);
+ $file = "../hacks/$ofile" unless (-f $file);
+ $file = "../hacks/glx/$ofile" unless (-f $file);
+ my $body = '';
+ open (my $in, '<', $file) || error ("$ofile: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+ $file =~ s@^.*/@@;
+
+ my $xlockmore_p = 0;
+ my $thread_p = ($body =~ m/THREAD_DEFAULTS/);
+ my $analogtv_p = ($body =~ m/ANALOGTV_DEFAULTS/);
+ my $text_p = ($body =~ m/"textclient\.h"/);
+ my $grab_p = ($body =~ m/load_image_async/);
+
+ $body =~ s@/\*.*?\*/@@gs;
+ $body =~ s@^#\s*(if|ifdef|ifndef|elif|else|endif).*$@@gm;
+ $body =~ s/(THREAD|ANALOGTV)_(DEFAULTS|OPTIONS)(_XLOCK)?//gs;
+ $body =~ s/__extension__//gs;
+
+ print STDERR "$progname: $file: defaults:\n" if ($verbose > 2);
+ my %res_to_val;
+ if ($body =~ m/_defaults\s*\[\]\s*=\s*{(.*?)}\s*;/s) {
+ foreach (split (/,\s*\n/, $1)) {
+ s/^\s*//s;
+ s/\s*$//s;
+ next if m/^0?$/s;
+ my ($key, $val) = m@^\"([^:\s]+)\s*:\s*(.*?)\s*\"$@;
+ print STDERR "$progname: $file: unparsable: $_\n" unless $key;
+ $key =~ s/^[.*]//s;
+ $res_to_val{$key} = $val;
+ print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2);
+ }
+ } elsif ($body =~ m/\#\s*define\s*DEFAULTS\s*\\?\s*(.*?)\n[\n#]/s) {
+ $xlockmore_p = 1;
+ my $str = $1;
+ $str =~ s/\"\s*\\\n\s*\"//gs;
+ $str =~ m/^\s*\"(.*?)\"\s*\\?\s*$/ ||
+ error ("$file: unparsable defaults: $str");
+ $str = $1;
+ $str =~ s/\s*\\n\s*/\n/gs;
+ foreach (split (/\n/, $str)) {
+ my ($key, $val) = m@^([^:\s]+)\s*:\s*(.*?)\s*$@;
+ print STDERR "$progname: $file: unparsable: $_\n" unless $key;
+ $key =~ s/^[.*]//s;
+ $val =~ s/"\s*"\s*$//s;
+ $res_to_val{$key} = $val;
+ print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2);
+ }
+
+ while ($body =~ s/^#\s*define\s+(DEF_([A-Z\d_]+))\s+\"([^\"]+)\"//m) {
+ my ($key1, $key2, $val) = ($1, lc($2), $3);
+ $key2 =~ s/_(.)/\U$1/gs; # "foo_bar" -> "fooBar"
+ $key2 =~ s/Rpm/RPM/; # kludge
+ $res_to_val{$key2} = $val;
+ print STDERR "$progname: $file: $key1 ($key2) = $val\n"
+ if ($verbose > 2);
+ }
+
+ } else {
+ error ("$file: no defaults");
+ }
+
+ $body =~ m/XSCREENSAVER_MODULE(_2)?\s*\(\s*\"([^\"]+)\"/ ||
+ error ("$file: no module name");
+ $res_to_val{progclass} = $2;
+ $res_to_val{doFPS} = 'false';
+ $res_to_val{textMode} = 'date';
+ $res_to_val{textLiteral} = '';
+ $res_to_val{textURL} =
+ 'https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss';
+ $res_to_val{grabDesktopImages} = 'true';
+ $res_to_val{chooseRandomImages} = 'true';
+
+ print STDERR "$progname: $file: progclass = $2\n" if ($verbose > 2);
+
+ print STDERR "$progname: $file: switches to resources:\n"
+ if ($verbose > 2);
+ my %switch_to_res;
+ $switch_to_res{'-fps'} = 'doFPS: true';
+ $switch_to_res{'-fg'} = 'foreground: %';
+ $switch_to_res{'-bg'} = 'background: %';
+ $switch_to_res{'-no-grab-desktop-images'} = 'grabDesktopImages: false';
+ $switch_to_res{'-no-choose-random-images'} = 'chooseRandomImages: false';
+
+ my ($ign, $opts) = ($body =~ m/(_options|\bopts)\s*\[\]\s*=\s*{(.*?)}\s*;/s);
+ if ($xlockmore_p || $thread_p || $analogtv_p || $opts) {
+ $opts = '' unless $opts;
+ $opts .= ",\n$text_default_opts" if ($text_p);
+ $opts .= ",\n$image_default_opts" if ($grab_p);
+ $opts .= ",\n$xlockmore_default_opts" if ($xlockmore_p);
+ $opts .= ",\n$thread_default_opts" if ($thread_p);
+ $opts .= ",\n$analogtv_default_opts" if ($analogtv_p);
+
+ foreach (split (/,\s*\n/, $opts)) {
+ s/^\s*//s;
+ s/\s*$//s;
+ next if m/^$/s;
+ next if m/^\{\s*0\s*,/s;
+ my ($switch, $res, $type, $v0, $v1, $v2) =
+ m@^ \s* { \s * \"([^\"]+)\" \s* ,
+ \s * \"([^\"]+)\" \s* ,
+ \s * ([^\s]+) \s* ,
+ \s * (\"([^\"]*)\"|([a-zA-Z\d_]+)) \s* }@xi;
+ print STDERR "$progname: $file: unparsable: $_\n" unless $switch;
+ my $val = defined($v1) ? $v1 : $v2;
+ $val = '%' if ($type eq 'XrmoptionSepArg');
+ $res =~ s/^[.*]//s;
+ $res =~ s/^[a-z\d]+\.//si;
+ $switch =~ s/^\+/-no-/s;
+
+ $val = "$res: $val";
+ if (defined ($switch_to_res{$switch})) {
+ print STDERR "$progname: $file: DUP! $switch = \"$val\"\n"
+ if ($verbose > 2);
+ } else {
+ $switch_to_res{$switch} = $val;
+ print STDERR "$progname: $file: $switch = \"$val\"\n"
+ if ($verbose > 2);
+ }
+ }
+ } else {
+ error ("$file: no options");
+ }
+
+ return (\%res_to_val, \%switch_to_res);
+}
+
+my %video_dups;
+
+# Returns a list of:
+# "resource = default value"
+# or "resource != non-default value"
+#
+# Also a hash of the simplified XML contents.
+#
+sub parse_xml($$$) {
+ my ($saver, $switch_to_res, $src_opts) = @_;
+
+ my $saver_title = undef;
+ my $gl_p = 0;
+ my $file = "config/" . lc($saver) . ".xml";
+ my $ofile = $file;
+ $file = "../hacks/$ofile" unless (-f $file);
+ my $body = '';
+ open (my $in, '<', $file) || error ("$ofile: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+ $file =~ s@^.*/@@;
+
+ my @result = ();
+
+ $body =~ s@<xscreensaver-text\s*/?>@
+ <select id="textMode">
+ <option id="date" _label="Display the date and time"/>
+ <option id="text" _label="Display static text"
+ arg-set="-text-mode literal"/>
+ <option id="url" _label="Display the contents of a URL"
+ arg-set="-text-mode url"/>
+ </select>
+ <string id="textLiteral" _label="Text to display" arg="-text-literal %"/>
+ <string id="textURL" _label="URL to display" arg="-text-url %"/>
+ @gs;
+
+ $body =~ s@<xscreensaver-image\s*/?>@
+ <boolean id="grabDesktopImages" _label="Grab screenshots"
+ arg-unset="-no-grab-desktop-images"/>
+ <boolean id="chooseRandomImages" _label="Use photo library"
+ arg-unset="-no-choose-random-images"/>
+ @gs;
+
+ $body =~ s/<!--.*?-->/ /gsi;
+
+ $body =~ s@(<(_description)>.*?</\2>)@{ $_ = $1; s/\n/\002/gs; $_; }@gsexi;
+
+ $body =~ s/\s+/ /gs;
+ $body =~ s/</\001</gs;
+ $body =~ s/\001(<option)/$1/gs;
+
+ my $video = undef;
+
+ my @widgets = ();
+
+ print STDERR "$progname: $file: options:\n" if ($verbose > 2);
+ foreach (split (m/\001/, $body)) {
+ next if (m/^\s*$/s);
+ my ($type, $args) = m@^<([?/]?[-_a-z]+)\b\s*(.*)$@si;
+ error ("$progname: $file: unparsable: $_") unless $type;
+ next if ($type =~ m@^/@);
+
+ my $ctrl = { type => $type };
+
+ if ($type =~ m/^( [hv]group |
+ \?xml |
+ command |
+ file |
+ xscreensaver-image |
+ xscreensaver-updater
+ )/sx) {
+ $ctrl = undef;
+
+ } elsif ($type eq '_description') {
+ $args =~ s/\002/\n/gs;
+ $args =~ s@^>\s*@@s;
+ $args =~ s/^\n*|\s*$//gs;
+ $ctrl->{text} = $args;
+
+ } elsif ($type eq 'screensaver') {
+ ($saver_title) = ($args =~ m/\b_label\s*=\s*\"([^\"]+)\"/s);
+ ($gl_p) = ($args =~ m/\bgl="?yes/s);
+ my $s = $saver_title;
+ $s =~ s/\s+//gs;
+ my $val = "progclass = $s";
+ push @result, $val;
+ print STDERR "$progname: $file: name: $saver_title\n"
+ if ($verbose > 2);
+ $ctrl = undef;
+
+ } elsif ($type eq 'video') {
+ error ("$file: multiple videos") if $video;
+ ($video) = ($args =~ m/\bhref="(.*?)"/);
+ error ("$file: unparsable video") unless $video;
+ error ("$file: unparsable video URL")
+ unless ($video =~ m@^https?://www\.youtube\.com/watch\?v=[^?&]+$@s);
+ $ctrl = undef;
+
+ } elsif ($type eq 'select') {
+ $args =~ s/</\001</gs;
+ my @opts = split (/\001/, $args);
+ shift @opts;
+ my $unset_p = 0;
+ my $this_res = undef;
+ my @menu = ();
+ foreach (@opts) {
+ error ("$file: unparsable option: $_") unless (m/^<option\s/);
+
+ my %item;
+ my $opt = $_;
+ $opt =~ s@^<option\s+@@s;
+ $opt =~ s@[?/]>\s*$@@s;
+ while ($opt =~ s/^\s*([^\s]+)\s*=\s*"(.*?)"\s*(.*)/$3/s) {
+ my ($k, $v) = ($1, $2);
+ $item{$k} = $v;
+ }
+
+ error ("unparsable XML option line: $_ [$opt]") if ($opt);
+ push @menu, \%item;
+
+ my ($set) = $item{'arg-set'};
+ if ($set) {
+ my ($set2, $val) = ($set =~ m/^(.*?) (.*)$/s);
+ $set = $set2 if ($set2);
+ my ($res) = $switch_to_res->{$set};
+ error ("$file: no resource for select switch \"$set\"") unless $res;
+
+ my ($res2, $val2) = ($res =~ m/^(.*?): (.*)$/s);
+ error ("$file: unparsable select resource: $res") unless $res2;
+ $res = $res2;
+ $val = $val2 unless ($val2 eq '%');
+ $item{value} = $val;
+
+ error ("$file: mismatched resources: $res vs $this_res")
+ if (defined($this_res) && $this_res ne $res);
+ $this_res = $res;
+
+ $val = "$res != $val";
+ push @result, $val;
+ print STDERR "$progname: $file: select: $val\n" if ($verbose > 2);
+
+ } else {
+ error ("$file: multiple default options: $set") if ($unset_p);
+ $unset_p++;
+ }
+ }
+ $ctrl->{resource} = $this_res;
+ $ctrl->{default} = $src_opts->{$this_res};
+ $ctrl->{menu} = \@menu;
+
+ } else {
+
+ my $rest = $args;
+ $rest =~ s@[/?]*>\s*$@@s;
+ while ($rest =~ s/^\s*([^\s]+)\s*=\s*"(.*?)"\s*(.*)/$3/s) {
+ my ($k, $v) = ($1, $2);
+ $ctrl->{$k} = $v;
+ }
+ error ("unparsable XML line: $args [$rest]") if ($rest);
+
+ if ($type eq 'number') {
+ my ($arg) = $ctrl->{arg};
+ my ($val) = $ctrl->{default};
+ $val = '' unless defined($val);
+
+ my $switch = $arg;
+ $switch =~ s/\s+.*$//;
+ my ($res) = $switch_to_res->{$switch};
+ error ("$file: no resource for $type switch \"$arg\"") unless $res;
+
+ $res =~ s/: \%$//;
+ error ("$file: unparsable value: $res") if ($res =~ m/:/);
+ $ctrl->{resource} = $res;
+
+ $val = "$res = $val";
+ push @result, $val;
+ print STDERR "$progname: $file: number: $val\n" if ($verbose > 2);
+
+ } elsif ($type eq 'boolean') {
+ my ($set) = $ctrl->{'arg-set'};
+ my ($unset) = $ctrl->{'arg-unset'};
+ my ($arg) = $set || $unset || error ("$file: unparsable: $args");
+ my ($res) = $switch_to_res->{$arg};
+ error ("$file: no resource for boolean switch \"$arg\"") unless $res;
+
+ my ($res2, $val) = ($res =~ m/^(.*?): (.*)$/s);
+ error ("$file: unparsable boolean resource: $res") unless $res2;
+ $res = $res2;
+
+ $ctrl->{resource} = $res;
+ $ctrl->{convert} = 'invert' if ($val =~ m/off|false|no/i);
+ $ctrl->{default} = ($ctrl->{convert} ? 'true' : 'false');
+
+# $val = ($set ? "$res != $val" : "$res = $val");
+ $val = "$res != $val";
+ push @result, $val;
+ print STDERR "$progname: $file: boolean: $val\n" if ($verbose > 2);
+
+ } elsif ($type eq 'string') {
+ my ($arg) = $ctrl->{arg};
+
+ my $switch = $arg;
+ $switch =~ s/\s+.*$//;
+ my ($res) = $switch_to_res->{$switch};
+ error ("$file: no resource for $type switch \"$arg\"") unless $res;
+
+ $res =~ s/: \%$//;
+ error ("$file: unparsable value: $res") if ($res =~ m/:/);
+ $ctrl->{resource} = $res;
+ $ctrl->{default} = $src_opts->{$res};
+ my $val = "$res = %";
+ push @result, $val;
+ print STDERR "$progname: $file: string: $val\n" if ($verbose > 2);
+
+ } else {
+ error ("$file: unknown type \"$type\" for no arg");
+ }
+ }
+
+ push @widgets, $ctrl if $ctrl;
+ }
+
+# error ("$file: no video") unless $video;
+ print STDERR "\n$file: WARNING: no video\n\n" unless $video;
+
+ if ($video && $video_dups{$video} &&
+ $video_dups{$video} ne $saver_title) {
+ print STDERR "\n$file: WARNING: $saver_title: dup video with " .
+ $video_dups{$video} . "\n";
+ }
+ $video_dups{$video} = $saver_title if ($video);
+
+ return ($saver_title, $gl_p, \@result, \@widgets);
+}
+
+
+sub check_config($) {
+ my ($saver) = @_;
+
+ # kludge
+ return 0 if ($saver =~ m/(-helper)$/);
+
+ my ($src_opts, $switchmap) = parse_src ($saver);
+ my ($saver_title, $gl_p, $xml_opts, $widgets) =
+ parse_xml ($saver, $switchmap, $src_opts);
+
+ my $failures = 0;
+ foreach my $claim (@$xml_opts) {
+ my ($res, $compare, $xval) = ($claim =~ m/^(.*) (=|!=) (.*)$/s);
+ error ("$saver: unparsable xml claim: $claim") unless $compare;
+
+ my $sval = $src_opts->{$res};
+ if ($res =~ m/^TV|^text-mode/) {
+ print STDERR "$progname: $saver: OK: skipping \"$res\"\n"
+ if ($verbose > 1);
+ } elsif (!defined($sval)) {
+ print STDERR "$progname: $saver: $res: not in source\n";
+ } elsif ($claim !~ m/ = %$/s &&
+ ($compare eq '!='
+ ? $sval eq $xval
+ : $sval ne $xval)) {
+ print STDERR "$progname: $saver: " .
+ "src has \"$res = $sval\", xml has \"$claim\"\n";
+ $failures++;
+ } elsif ($verbose > 1) {
+ print STDERR "$progname: $saver: OK: \"$res = $sval\" vs \"$claim\"\n";
+ }
+ }
+
+ # Now make sure the progclass in the source and XML also matches
+ # the XCode target name.
+ #
+ my $obd = "../OSX/build/Debug";
+ if (-d $obd) {
+ my $progclass = $src_opts->{progclass};
+ $progclass = 'DNAlogo' if ($progclass eq 'DNALogo');
+ my $f = (glob("$obd/$progclass.saver*"))[0];
+ if (!$f && $progclass ne 'Flurry') {
+ print STDERR "$progname: $progclass.saver does not exist\n";
+ $failures++;
+ }
+ }
+
+ print STDERR "$progname: $saver: OK\n"
+ if ($verbose == 1 && $failures == 0);
+
+ return $failures;
+}
+
+
+# Returns true if the two files differ (by running "cmp")
+#
+sub cmp_files($$) {
+ my ($file1, $file2) = @_;
+
+ my @cmd = ("cmp", "-s", "$file1", "$file2");
+ print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+ if ($verbose > 3);
+
+ system (@cmd);
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ return $exit_value;
+}
+
+
+sub diff_files($$) {
+ my ($file1, $file2) = @_;
+
+ my @cmd = ("diff",
+ "-U1",
+# "-w",
+ "--unidirectional-new-file", "$file1", "$file2");
+ print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+ if ($verbose > 3);
+
+ system (@cmd);
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ return $exit_value;
+}
+
+
+# If the two files differ:
+# mv file2 file1
+# else
+# rm file2
+#
+sub rename_or_delete($$;$) {
+ my ($file, $file_tmp, $suffix_msg) = @_;
+
+ my $changed_p = cmp_files ($file, $file_tmp);
+
+ if ($changed_p && $debug_p) {
+ print STDOUT "\n" . ('#' x 79) . "\n";
+ diff_files ("$file", "$file_tmp");
+ $changed_p = 0;
+ }
+
+ if ($changed_p) {
+
+ if (!rename ("$file_tmp", "$file")) {
+ unlink "$file_tmp";
+ error ("mv $file_tmp $file: $!");
+ }
+ print STDERR "$progname: wrote $file" .
+ ($suffix_msg ? " $suffix_msg" : "") . "\n";
+
+ } else {
+ unlink "$file_tmp" || error ("rm $file_tmp: $!\n");
+ print STDERR "$file unchanged" .
+ ($suffix_msg ? " $suffix_msg" : "") . "\n"
+ if ($verbose);
+ print STDERR "$progname: rm $file_tmp\n" if ($verbose > 2);
+ }
+}
+
+
+# Write the given body to the file, but don't alter the file's
+# date if the new content is the same as the existing content.
+#
+sub write_file_if_changed($$;$) {
+ my ($outfile, $body, $suffix_msg) = @_;
+
+ my $file_tmp = "$outfile.tmp";
+ open (my $out, '>', $file_tmp) || error ("$file_tmp: $!");
+ (print $out $body) || error ("$file_tmp: $!");
+ close $out || error ("$file_tmp: $!");
+ rename_or_delete ($outfile, $file_tmp, $suffix_msg);
+}
+
+
+# Read the template file and splice in the @KEYWORDS@ in the hash.
+#
+sub read_template($$) {
+ my ($file, $subs) = @_;
+ my $body = '';
+ open (my $in, '<', $file) || error ("$file: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+
+ $body =~ s@/\*.*?\*/@@gs; # omit comments
+ $body =~ s@//.*$@@gm;
+
+ foreach my $key (keys %$subs) {
+ my $val = $subs->{$key};
+ $body =~ s/@\Q$key\E@/$val/gs;
+ }
+
+ if ($body =~ m/(@[-_A-Z\d]+@)/s) {
+ error ("$file: unmatched: $1 [$body]");
+ }
+
+ $body =~ s/[ \t]+$//gm;
+ $body =~ s/(\n\n)\n+/$1/gs;
+ return $body;
+}
+
+
+# This is duplicated in OSX/update-info-plist.pl
+#
+sub munge_blurb($$$$) {
+ my ($filename, $name, $vers, $desc) = @_;
+
+ $desc =~ s/^([ \t]*\n)+//s;
+ $desc =~ s/\s*$//s;
+
+ # in case it's done already...
+ $desc =~ s@<!--.*?-->@@gs;
+ $desc =~ s/^.* version \d[^\n]*\n//s;
+ $desc =~ s/^From the XScreenSaver.*\n//m;
+ $desc =~ s@^https://www\.jwz\.org/xscreensaver.*\n@@m;
+ $desc =~
+ s/\nCopyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/\nWritten $3; $1./s;
+ $desc =~ s/^\n+//s;
+
+ error ("$filename: description contains markup: $1")
+ if ($desc =~ m/([<>&][^<>&\s]*)/s);
+ error ("$filename: description contains ctl chars: $1")
+ if ($desc =~ m/([\000-\010\013-\037])/s);
+
+ error ("$filename: can't extract authors")
+ unless ($desc =~ m@^(.*)\nWritten by[ \t]+(.+)$@s);
+ $desc = $1;
+ my $authors = $2;
+ $desc =~ s/\s*$//s;
+
+ my $year = undef;
+ if ($authors =~ m@^(.*?)\s*[,;]\s+(\d\d\d\d)([-\s,;]+\d\d\d\d)*[.]?$@s) {
+ $authors = $1;
+ $year = $2;
+ }
+
+ error ("$filename: can't extract year") unless $year;
+ my $cyear = 1900 + ((localtime())[5]);
+ $year = "$cyear" unless $year;
+ if ($year && ! ($year =~ m/$cyear/)) {
+ $year = "$year-$cyear";
+ }
+
+ $authors =~ s/[.,;\s]+$//s;
+
+ # List me as a co-author on all of them, since I'm the one who
+ # did the OSX port, packaged it up, and built the executables.
+ #
+ my $curator = "Jamie Zawinski";
+ if (! ($authors =~ m/$curator/si)) {
+ if ($authors =~ m@^(.*?),? and (.*)$@s) {
+ $authors = "$1, $2, and $curator";
+ } else {
+ $authors .= " and $curator";
+ }
+ }
+
+ my $desc1 = ("$name, version $vers.\n\n" . # savername.xml
+ $desc . "\n" .
+ "\n" .
+ "From the XScreenSaver collection: " .
+ "https://www.jwz.org/xscreensaver/\n" .
+ "Copyright \302\251 $year by $authors.\n");
+
+ my $desc2 = ("$name $vers,\n" . # Info.plist
+ "\302\251 $year $authors.\n" .
+ #"From the XScreenSaver collection:\n" .
+ #"https://www.jwz.org/xscreensaver/\n" .
+ "\n" .
+ $desc .
+ "\n");
+
+ # unwrap lines, but only when it's obviously ok: leave blank lines,
+ # and don't unwrap if that would compress leading whitespace on a line.
+ #
+ $desc2 =~ s/^(From |https?:)/\n$1/gm;
+ 1 while ($desc2 =~ s/([^\s])[ \t]*\n([^\s])/$1 $2/gs);
+ $desc2 =~ s/\n\n(From |https?:)/\n$1/gs;
+
+ return ($desc1, $desc2);
+}
+
+
+sub build_android(@) {
+ my (@savers) = @_;
+
+ my $package = "org.jwz.xscreensaver";
+ my $project_dir = "xscreensaver";
+ my $xml_dir = "$project_dir/res/xml";
+ my $values_dir = "$project_dir/res/values";
+ my $java_dir = "$project_dir/src/org/jwz/xscreensaver/gen";
+ my $gen_dir = "gen";
+
+ my $xml_header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+
+ my $manifest = '';
+ my $daydream_java = '';
+ my $settings_java = '';
+ my $wallpaper_java = '';
+ my $fntable_h2 = '';
+ my $fntable_h3 = '';
+ my $arrays = '';
+ my $strings = '';
+ my %write_files;
+ my %string_dups;
+
+ my $vers;
+ {
+ my $file = "../utils/version.h";
+ my $body = '';
+ open (my $in, '<', $file) || error ("$file: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+ ($vers) = ($body =~ m@ (\d+\.[0-9a-z]+) @s);
+ error ("$file: no version number") unless $vers;
+ }
+
+
+ foreach my $saver (@savers) {
+ next if ($saver =~ m/(-helper)$/);
+ $saver = 'rdbomb' if ($saver eq 'rd-bomb');
+
+ my ($src_opts, $switchmap) = parse_src ($saver);
+ my ($saver_title, $gl_p, $xml_opts, $widgets) =
+ parse_xml ($saver, $switchmap, $src_opts);
+
+ my $saver_class = "${saver_title}";
+ $saver_class =~ s/\s+//gs;
+ $saver_class =~ s/^([a-z])/\U$1/gs; # upcase first letter
+
+ $saver_title =~ s/(.[a-z])([A-Z\d])/$1 $2/gs; # Spaces in InterCaps
+ $saver_title =~ s/^(GL|RD)[- ]?(.)/$1 \U$2/gs; # Space after "GL"
+ $saver_title =~ s/^Apple ?2$/Apple &#x5D;&#x5B;/gs; # "Apple ]["
+ $saver_title =~ s/(m)oe(bius)/$1&#xF6;$2/gsi; # &ouml;
+ $saver_title =~ s/(moir)e/$1&#xE9;/gsi; # &eacute;
+ $saver_title =~ s/^([a-z])/\U$1/s; # "M6502" for sorting
+
+ my $settings = '';
+
+ my $localize0 = sub($$) {
+ my ($key, $string) = @_;
+ $string =~ s@([\\\"\'])@\\$1@gs; # backslashify
+ $string =~ s@\n@\\n@gs; # quote newlines
+ $key =~ s@[^a-z\d_]+@_@gsi; # illegal characters
+
+ my $old = $string_dups{$key};
+ error ("dup string: $key: \"$old\" != \"$string\"")
+ if (defined($old) && $old ne $string);
+ $string_dups{$key} = $string;
+
+ my $fmt = ($string =~ m/%/ ? ' formatted="false"' : '');
+ $strings .= "<string name=\"${key}\"$fmt>$string</string>\n"
+ unless defined($old);
+ return "\@string/$key";
+ };
+
+ $localize0->('app_name', 'XScreenSaver');
+
+ $settings .= ("<Preference\n" .
+ " android:key=\"${saver}_reset\"\n" .
+ " android:title=\"" .
+ $localize0->('reset_to_defaults', 'Reset to defaults') .
+ "\"\n" .
+ " />\n");
+
+ my $daydream_desc = '';
+ foreach my $widget (@$widgets) {
+ my $type = $widget->{type};
+ my $rsrc = $widget->{resource};
+ my $label = $widget->{_label};
+ my $def = $widget->{default};
+ my $invert_p = (($widget->{convert} || '') eq 'invert');
+
+ my $key = "${saver}_$rsrc" if $rsrc;
+
+ #### The menus don't actually have titles on X11 or Cocoa...
+ $label = $widget->{resource} unless $label;
+
+ my $localize = sub($;$) {
+ my ($string, $suf) = @_;
+ $suf = 'title' unless $suf;
+ return $localize0->("${saver}_${rsrc}_${suf}", $string);
+ };
+
+ if ($type eq 'slider' || $type eq 'spinbutton') {
+
+ my $low = $widget->{low};
+ my $high = $widget->{high};
+ my $float_p = $low =~ m/[.]/;
+ my $low_label = $widget->{'_low-label'};
+ my $high_label = $widget->{'_high-label'};
+
+ $low_label = $low unless defined($low_label);
+ $high_label = $high unless defined($high_label);
+
+ ($low, $high) = ($high, $low)
+ if (($widget->{convert} || '') eq 'invert');
+
+ $settings .=
+ ("<$package.SliderPreference\n" .
+ " android:layout=\"\@layout/slider_preference\"\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label) . "\"\n" .
+ " android:defaultValue=\"$def\"\n" .
+ " low=\"$low\"\n" .
+ " high=\"$high\"\n" .
+ " lowLabel=\"" . $localize->($low_label, 'low_label') . "\"\n" .
+ " highLabel=\"" . $localize->($high_label, 'high_label') . "\"\n" .
+ " integral=\"" .($float_p ? 'false' : 'true'). "\" />\n");
+
+ } elsif ($type eq 'boolean') {
+
+ my $def = ($invert_p ? 'true' : 'false');
+ $settings .=
+ ("<CheckBoxPreference\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label) . "\"\n" .
+ " android:defaultValue=\"$def\" />\n");
+
+ } elsif ($type eq 'select') {
+
+ $label =~ s/^(.)/\U$1/s; # upcase first letter of menu title
+ $label =~ s/[-_]/ /gs;
+ $label =~ s/([a-z])([A-Z])/$1 $2/gs;
+ $def = '' unless defined ($def);
+ $settings .=
+ ("<ListPreference\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label, 'menu') . "\"\n" .
+ " android:entries=\"\@array/${key}_entries\"\n" .
+ " android:defaultValue=\"$def\"\n" .
+ " android:entryValues=\"\@array/${key}_values\" />\n");
+
+ my $a1 = '';
+ foreach my $item (@{$widget->{menu}}) {
+ my $val = $item->{value};
+ if (! defined($val)) {
+ $val = $src_opts->{$widget->{resource}};
+ error ("$saver: no default resource in option menu " .
+ $item->{_label})
+ unless defined($val);
+ }
+ $val =~ s@([\\\"\'])@\\$1@gs; # backslashify
+ $a1 .= " <item>$val</item>\n";
+ }
+
+ my $a2 = '';
+ foreach my $item (@{$widget->{menu}}) {
+ my $val = $item->{value};
+ $val = $src_opts->{$widget->{resource}} unless defined($val);
+ $a2 .= (" <item>" . $localize->($item->{_label}, $val) .
+ "</item>\n");
+ }
+
+ my $fmt1 = ($a1 =~ m/%/ ? ' formatted="false"' : '');
+ my $fmt2 = ($a2 =~ m/%/ ? ' formatted="false"' : '');
+ $arrays .= ("<string-array name=\"${key}_values\"$fmt1>\n" .
+ $a1 .
+ "</string-array>\n" .
+ "<string-array name=\"${key}_entries\"$fmt2>\n" .
+ $a2 .
+ "</string-array>\n");
+
+ } elsif ($type eq 'string') {
+
+ $def =~ s/&/&amp;/gs;
+ $settings .=
+ ("<EditTextPreference\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label) . "\"\n" .
+ " android:defaultValue=\"$def\" />\n");
+
+ } elsif ($type eq 'file') {
+
+ } elsif ($type eq '_description') {
+
+ $type = 'description';
+ $rsrc = $type;
+ my $desc = $widget->{text};
+ (undef, $desc) = munge_blurb ($saver, $saver_title, $vers, $desc);
+
+ # Lose the Wikipedia URLs.
+ $desc =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm;
+ $desc =~ s/(\n\n)\n+/$1/s;
+ $desc =~ s/\s*$/\n\n\n/s;
+
+ $daydream_desc = $desc;
+
+ my ($year) = ($daydream_desc =~ m/\b((19|20)\d\d)\b/s);
+ error ("$saver: no year") unless $year;
+ $daydream_desc =~ s/^.*?\n\n//gs;
+ $daydream_desc =~ s/\n.*$//gs;
+ $daydream_desc = "$year: $daydream_desc";
+ $daydream_desc =~ s/^(.{72}).+$/$1.../s;
+
+ $settings .=
+ ("<Preference\n" .
+ " android:icon=\"\@drawable/thumbnail\"\n" .
+ " android:key=\"${saver}_${type}\"\n" .
+# " android:selectable=\"false\"\n" .
+ " android:persistent=\"false\"\n" .
+ " android:layout=\"\@layout/preference_blurb\"\n" .
+ " android:summary=\"" . $localize->($desc) . "\">\n" .
+ " <intent android:action=\"android.intent.action.VIEW\"\n" .
+ " android:data=\"https://www.jwz.org/xscreensaver/\" />\n" .
+ "</Preference>\n");
+
+ } else {
+ error ("unhandled type: $type");
+ }
+ }
+
+ my $heading = "XScreenSaver: $saver_title";
+
+ $settings =~ s/^/ /gm;
+ $settings = ($xml_header .
+ "<PreferenceScreen xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " android:title=\"" .
+ $localize0->("${saver}_settings_title", $heading) . "\">\n" .
+ $settings .
+ "</PreferenceScreen>\n");
+
+ my $saver_underscore = $saver;
+ $saver_underscore =~ s/-/_/g;
+ $write_files{"$xml_dir/${saver_underscore}_settings.xml"} = $settings;
+
+ $manifest .= ("<service android:label=\"" .
+ $localize0->("${saver_underscore}_saver_title",
+ $saver_title) .
+ "\"\n" .
+ " android:summary=\"" .
+ $localize0->("${saver_underscore}_saver_desc",
+ $daydream_desc) . "\"\n" .
+ " android:name=\".gen.Daydream\$$saver_class\"\n" .
+ " android:permission=\"android.permission" .
+ ".BIND_DREAM_SERVICE\"\n" .
+ " android:exported=\"true\"\n" .
+ " android:icon=\"\@drawable/${saver_underscore}\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.service.dreams" .
+ ".DreamService\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" .
+ " </intent-filter>\n" .
+ " <meta-data android:name=\"android.service.dream\"\n" .
+ " android:resource=\"\@xml/${saver}_dream\" />\n" .
+ "</service>\n" .
+ "<service android:label=\"" .
+ $localize0->("${saver_underscore}_saver_title",
+ $saver_title) .
+ "\"\n" .
+ " android:summary=\"" .
+ $localize0->("${saver_underscore}_saver_desc",
+ $daydream_desc) . "\"\n" .
+ " android:name=\".gen.Wallpaper\$$saver_class\"\n" .
+ " android:permission=\"android.permission" .
+ ".BIND_WALLPAPER\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.service.wallpaper" .
+ ".WallpaperService\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" . # TODO: Is the DEFAULT category needed?
+ " </intent-filter>\n" .
+ " <meta-data android:name=\"android.service.wallpaper\"\n" .
+ " android:resource=\"\@xml/${saver}_wallpaper\" />\n" .
+ "</service>\n" .
+ "<activity android:label=\"" .
+ $localize0->("${saver}_settings_title", $heading) . "\"\n" .
+ " android:name=\"$package.gen.Settings\$$saver_class\"\n" .
+ " android:exported=\"true\">\n" .
+ "</activity>\n"
+ );
+
+ my $dream = ("<dream xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " android:settingsActivity=\"" .
+ "$package.gen.Settings\$$saver_class\" />\n");
+ $write_files{"$xml_dir/${saver_underscore}_dream.xml"} = $dream;
+
+ my $wallpaper = ("<wallpaper xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " android:settingsActivity=\"" .
+ "$package.gen.Settings\$$saver_class\"\n" .
+ " android:thumbnail=\"\@drawable/${saver_underscore}\" />\n");
+ $write_files{"$xml_dir/${saver_underscore}_wallpaper.xml"} = $wallpaper;
+
+ $daydream_java .=
+ (" public static class $saver_class extends org.jwz.xscreensaver.Daydream {\n" .
+ " }\n" .
+ "\n");
+
+ $wallpaper_java .=
+ (" public static class $saver_class extends org.jwz.xscreensaver.Wallpaper {\n" .
+ " }\n" .
+ "\n");
+
+ $settings_java .=
+ (" public static class $saver_class extends org.jwz.xscreensaver.Settings\n" .
+ " implements SharedPreferences.OnSharedPreferenceChangeListener {\n" .
+ " }\n" .
+ "\n");
+
+ $fntable_h2 .= ",\n " if $fntable_h2 ne '';
+ $fntable_h3 .= ",\n " if $fntable_h3 ne '';
+
+ $fntable_h2 .= "${saver}_xscreensaver_function_table";
+ $fntable_h3 .= "{\"${saver}\", &${saver}_xscreensaver_function_table}";
+ }
+
+ $arrays =~ s/^/ /gm;
+ $arrays = ($xml_header .
+ "<resources xmlns:xliff=\"" .
+ "urn:oasis:names:tc:xliff:document:1.2\">\n" .
+ $arrays .
+ "</resources>\n");
+
+ $strings =~ s/^/ /gm;
+ $strings = ($xml_header .
+ "<resources>\n" .
+ $strings .
+ "</resources>\n");
+
+ $manifest .= "<activity android:name=\"$package.Settings\" />\n";
+
+ $manifest .= ("<activity android:name=\"" .
+ "org.jwz.xscreensaver.Activity\"\n" .
+ " android:theme=\"\@android:style/Theme.Holo\"\n" .
+ " android:label=\"\@string/app_name\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".MAIN\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".LAUNCHER\" />\n" .
+ " </intent-filter>\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".VIEW\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".BROWSABLE\" />\n" .
+ " </intent-filter>\n" .
+ "</activity>\n");
+
+
+ $manifest .= ("<activity android:name=\"" .
+ "org.jwz.xscreensaver.TVActivity\"\n" .
+ " android:theme=\"\@android:style/Theme.Holo\"\n" .
+ " android:label=\"\@string/app_name\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".MAIN\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".LEANBACK_LAUNCHER\" />\n" .
+ " </intent-filter>\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".VIEW\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".BROWSABLE\" />\n" .
+ " </intent-filter>\n" .
+ "</activity>\n");
+
+
+
+
+ # Android wants this to be an int
+ my $versb = $vers;
+ $versb =~ s/^(\d+)\.(\d+).*$/{ $1 * 10000 + $2 * 100 }/sex;
+ $versb++ if ($versb == 53500); # Herp derp
+
+ $manifest =~ s/^/ /gm;
+ $manifest = ($xml_header .
+ "<manifest xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " package=\"$package\"\n" .
+ " android:versionCode=\"$versb\"\n" .
+ " android:versionName=\"$vers\">\n" .
+
+ " <uses-sdk android:minSdkVersion=\"14\"" .
+ " android:targetSdkVersion=\"19\" />\n" .
+
+ " <uses-feature android:glEsVersion=\"0x00010001\"\n" .
+ " android:required=\"true\" />\n" .
+
+ " <uses-feature android:name=\"android.software.leanback\"\n" .
+ " android:required=\"false\" />\n" .
+
+ " <uses-feature" .
+ " android:name=\"android.hardware.touchscreen\"\n" .
+ " android:required=\"false\" />\n" .
+
+ " <uses-permission android:name=\"" .
+ "android.permission.INTERNET\" />\n" .
+ " <uses-permission android:name=\"" .
+ "android.permission.READ_EXTERNAL_STORAGE\" />\n" .
+
+ " <application android:icon=\"\@drawable/thumbnail\"\n" .
+ " android:banner=\"\@drawable/thumbnail\"\n" .
+ " android:label=\"\@string/app_name\"\n" .
+ " android:name=\".App\">\n" .
+ $manifest .
+ " </application>\n" .
+ "</manifest>\n");
+
+ $daydream_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import org.jwz.xscreensaver.jwxyz;\n" .
+ "\n" .
+ "public class Daydream {\n" .
+ $daydream_java .
+ "}\n");
+
+ $wallpaper_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import org.jwz.xscreensaver.jwxyz;\n" .
+ "\n" .
+ "public class Wallpaper {\n" .
+ $wallpaper_java .
+ "}\n");
+
+ $settings_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import android.content.SharedPreferences;\n" .
+ "\n" .
+ "public class Settings {\n" .
+ $settings_java .
+ "}\n");
+
+ $write_files{"$project_dir/AndroidManifest.xml"} = $manifest;
+ $write_files{"$values_dir/settings.xml"} = $arrays;
+ $write_files{"$values_dir/strings.xml"} = $strings;
+ $write_files{"$java_dir/Daydream.java"} = $daydream_java;
+ $write_files{"$java_dir/Wallpaper.java"} = $wallpaper_java;
+ $write_files{"$java_dir/Settings.java"} = $settings_java;
+
+ my $fntable_h = ("extern struct xscreensaver_function_table\n" .
+ " " . $fntable_h2 . ";\n" .
+ "\n" .
+ "static const struct function_table_entry" .
+ " function_table[] = {\n" .
+ " " . $fntable_h3 . "\n" .
+ "};\n");
+ $write_files{"$gen_dir/function-table.h"} = $fntable_h;
+
+
+ $write_files{"$values_dir/attrs.xml"} =
+ # This file doesn't actually have any substitutions in it, so it could
+ # just be static, somewhere...
+ # SliderPreference.java refers to this via "R.styleable.SliderPreference".
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" .
+ "<resources>\n" .
+ " <declare-styleable name=\"SliderPreference\">\n" .
+ " <attr name=\"android:summary\" />\n" .
+ " </declare-styleable>\n" .
+ "</resources>\n");
+
+
+ foreach my $file (sort keys %write_files) {
+ my ($dir) = ($file =~ m@^(.*)/[^/]*$@s);
+ system ("mkdir", "-p", $dir) if (! -d $dir && !$debug_p);
+ my $body = $write_files{$file};
+ $body = "// Generated by $progname\n$body"
+ if ($file =~ m/\.(java|[chm])$/s);
+ write_file_if_changed ($file, $body);
+ }
+
+ # Unlink any .xml files from a previous run that shouldn't be there:
+ # if a hack is removed from $ANDROID_HACKS in android/Makefile but
+ # the old XML files remain behind, the build blows up.
+ #
+ foreach my $dd ($xml_dir, $gen_dir, $java_dir) {
+ opendir (my $dirp, $dd) || error ("$dd: $!");
+ my @files = readdir ($dirp);
+ closedir $dirp;
+ foreach my $f (sort @files) {
+ next if ($f eq '.' || $f eq '..');
+ $f = "$dd/$f";
+ next if (defined ($write_files{$f}));
+ if ($f =~ m/_(settings|wallpaper|dream)\.xml$/s ||
+ $f =~ m/(Settings|Daydream)\.java$/s) {
+ print STDERR "$progname: rm $f\n";
+ unlink ($f) unless ($debug_p);
+ } else {
+ print STDERR "$progname: warning: unrecognised file: $f\n";
+ }
+ }
+ }
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] [--debug]" .
+ " [--build-android] files ...\n";
+ exit 1;
+}
+
+sub main() {
+ my $android_p = 0;
+ my @files = ();
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if (m/^--?verbose$/) { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^--?debug$/s) { $debug_p++; }
+ elsif (m/^--?build-android$/s) { $android_p++; }
+ elsif (m/^-./) { usage; }
+ else { push @files, $_; }
+# else { usage; }
+ }
+
+ usage unless ($#files >= 0);
+ my $failures = 0;
+ foreach my $file (@files) {
+ $failures += check_config ($file);
+ }
+
+ build_android (@files) if ($android_p);
+
+ exit ($failures);
+}
+
+main();
diff --git a/hacks/cloudlife.c b/hacks/cloudlife.c
new file mode 100644
index 0000000..4b65f9e
--- /dev/null
+++ b/hacks/cloudlife.c
@@ -0,0 +1,428 @@
+/* cloudlife by Don Marti <dmarti@zgp.org>
+ *
+ * Based on Conway's Life, but with one rule change to make it a better
+ * screensaver: cells have a max age.
+ *
+ * When a cell exceeds the max age, it counts as 3 for populating the next
+ * generation. This makes long-lived formations explode instead of just
+ * sitting there burning a hole in your screen.
+ *
+ * Cloudlife only draws one pixel of each cell per tick, whether the cell is
+ * alive or dead. So gliders look like little comets.
+
+ * 20 May 2003 -- now includes color cycling and a man page.
+
+ * Based on several examples from the hacks directory of:
+
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+#ifndef MAX_WIDTH
+#include <limits.h>
+#define MAX_WIDTH SHRT_MAX
+#endif
+
+#ifdef TIME_ME
+#include <time.h>
+#endif
+
+/* this program goes faster if some functions are inline. The following is
+ * borrowed from ifs.c */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+
+struct field {
+ unsigned int height;
+ unsigned int width;
+ unsigned int max_age;
+ unsigned int cell_size;
+ unsigned char *cells;
+ unsigned char *new_cells;
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+#ifdef TIME_ME
+ time_t start_time;
+#endif
+
+ unsigned int cycles;
+ unsigned int colorindex; /* which color in the colormap are we on */
+ unsigned int colortimer; /* when this reaches 0, cycle to next color */
+
+ int cycle_delay;
+ int cycle_colors;
+ int ncolors;
+ int density;
+
+ GC fgc, bgc;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ XColor *colors;
+
+ struct field *field;
+
+ XPoint fg_points[MAX_WIDTH];
+ XPoint bg_points[MAX_WIDTH];
+};
+
+
+static void
+*xrealloc(void *p, size_t size)
+{
+ void *ret;
+ if ((ret = realloc(p, size)) == NULL) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ return ret;
+}
+
+static struct field *
+init_field(struct state *st)
+{
+ struct field *f = xrealloc(NULL, sizeof(struct field));
+ f->height = 0;
+ f->width = 0;
+ f->cell_size = get_integer_resource(st->dpy, "cellSize", "Integer");
+ f->max_age = get_integer_resource(st->dpy, "maxAge", "Integer");
+
+ if (f->max_age > 255) {
+ fprintf (stderr, "%s: max-age must be < 256 (not %d)\n", progname,
+ f->max_age);
+ exit (1);
+ }
+
+ f->cells = NULL;
+ f->new_cells = NULL;
+ return f;
+}
+
+static void
+resize_field(struct field * f, unsigned int w, unsigned int h)
+{
+ int s = w * h * sizeof(unsigned char);
+ f->width = w;
+ f->height = h;
+
+ f->cells = xrealloc(f->cells, s);
+ f->new_cells = xrealloc(f->new_cells, s);
+ memset(f->cells, 0, s);
+ memset(f->new_cells, 0, s);
+}
+
+static inline unsigned char
+*cell_at(struct field * f, unsigned int x, unsigned int y)
+{
+ return (f->cells + x * sizeof(unsigned char) +
+ y * f->width * sizeof(unsigned char));
+}
+
+static inline unsigned char
+*new_cell_at(struct field * f, unsigned int x, unsigned int y)
+{
+ return (f->new_cells + x * sizeof(unsigned char) +
+ y * f->width * sizeof(unsigned char));
+}
+
+static void
+draw_field(struct state *st, struct field * f)
+{
+ unsigned int x, y;
+ unsigned int rx, ry = 0; /* random amount to offset the dot */
+ unsigned int size = 1 << f->cell_size;
+ unsigned int mask = size - 1;
+ unsigned int fg_count, bg_count;
+
+ /* columns 0 and width-1 are off screen and not drawn. */
+ for (y = 1; y < f->height - 1; y++) {
+ fg_count = 0;
+ bg_count = 0;
+
+ /* rows 0 and height-1 are off screen and not drawn. */
+ for (x = 1; x < f->width - 1; x++) {
+ rx = random();
+ ry = rx >> f->cell_size;
+ rx &= mask;
+ ry &= mask;
+
+ if (*cell_at(f, x, y)) {
+ st->fg_points[fg_count].x = (short) x *size - rx - 1;
+ st->fg_points[fg_count].y = (short) y *size - ry - 1;
+ fg_count++;
+ } else {
+ st->bg_points[bg_count].x = (short) x *size - rx - 1;
+ st->bg_points[bg_count].y = (short) y *size - ry - 1;
+ bg_count++;
+ }
+ }
+ XDrawPoints(st->dpy, st->window, st->fgc, st->fg_points, fg_count,
+ CoordModeOrigin);
+ XDrawPoints(st->dpy, st->window, st->bgc, st->bg_points, bg_count,
+ CoordModeOrigin);
+ }
+}
+
+static inline unsigned int
+cell_value(unsigned char c, unsigned int age)
+{
+ if (!c) {
+ return 0;
+ } else if (c > age) {
+ return (3);
+ } else {
+ return (1);
+ }
+}
+
+static inline unsigned int
+is_alive(struct field * f, unsigned int x, unsigned int y)
+{
+ unsigned int count;
+ unsigned int i, j;
+ unsigned char *p;
+
+ count = 0;
+
+ for (i = x - 1; i <= x + 1; i++) {
+ for (j = y - 1; j <= y + 1; j++) {
+ if (y != j || x != i) {
+ count += cell_value(*cell_at(f, i, j), f->max_age);
+ }
+ }
+ }
+
+ p = cell_at(f, x, y);
+ if (*p) {
+ if (count == 2 || count == 3) {
+ return ((*p) + 1);
+ } else {
+ return (0);
+ }
+ } else {
+ if (count == 3) {
+ return (1);
+ } else {
+ return (0);
+ }
+ }
+}
+
+static unsigned int
+do_tick(struct field * f)
+{
+ unsigned int x, y;
+ unsigned int count = 0;
+ for (x = 1; x < f->width - 1; x++) {
+ for (y = 1; y < f->height - 1; y++) {
+ count += *new_cell_at(f, x, y) = is_alive(f, x, y);
+ }
+ }
+ memcpy(f->cells, f->new_cells, f->width * f->height *
+ sizeof(unsigned char));
+ return count;
+}
+
+
+static unsigned int
+random_cell(unsigned int p)
+{
+ int r = random() & 0xff;
+
+ if (r < p) {
+ return (1);
+ } else {
+ return (0);
+ }
+}
+
+static void
+populate_field(struct field * f, unsigned int p)
+{
+ unsigned int x, y;
+
+ for (x = 0; x < f->width; x++) {
+ for (y = 0; y < f->height; y++) {
+ *cell_at(f, x, y) = random_cell(p);
+ }
+ }
+}
+
+static void
+populate_edges(struct field * f, unsigned int p)
+{
+ unsigned int i;
+
+ for (i = f->width; i--;) {
+ *cell_at(f, i, 0) = random_cell(p);
+ *cell_at(f, i, f->height - 1) = random_cell(p);
+ }
+
+ for (i = f->height; i--;) {
+ *cell_at(f, f->width - 1, i) = random_cell(p);
+ *cell_at(f, 0, i) = random_cell(p);
+ }
+}
+
+static void *
+cloudlife_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ Bool tmp = True;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->field = init_field(st);
+
+#ifdef TIME_ME
+ st->start_time = time(NULL);
+#endif
+
+ st->cycle_delay = get_integer_resource(st->dpy, "cycleDelay", "Integer");
+ st->cycle_colors = get_integer_resource(st->dpy, "cycleColors", "Integer");
+ st->ncolors = get_integer_resource(st->dpy, "ncolors", "Integer");
+ st->density = (get_integer_resource(st->dpy, "initialDensity", "Integer")
+ % 100 * 256)/100;
+
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+
+ if (st->cycle_colors) {
+ st->colors = (XColor *) xrealloc(st->colors, sizeof(XColor) * (st->ncolors+1));
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ True, &tmp, True);
+ }
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->fgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ return st;
+}
+
+static unsigned long
+cloudlife_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->cycle_colors) {
+ if (st->colortimer == 0) {
+ st->colortimer = st->cycle_colors;
+ if( st->colorindex == 0 )
+ st->colorindex = st->ncolors;
+ st->colorindex--;
+ XSetForeground(st->dpy, st->fgc, st->colors[st->colorindex].pixel);
+ }
+ st->colortimer--;
+ }
+
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+ if (st->field->height != st->xgwa.height / (1 << st->field->cell_size) + 2 ||
+ st->field->width != st->xgwa.width / (1 << st->field->cell_size) + 2) {
+
+ resize_field(st->field, st->xgwa.width / (1 << st->field->cell_size) + 2,
+ st->xgwa.height / (1 << st->field->cell_size) + 2);
+ populate_field(st->field, st->density);
+ }
+
+ draw_field(st, st->field);
+
+ if (do_tick(st->field) < (st->field->height + st->field->width) / 4) {
+ populate_field(st->field, st->density);
+ }
+
+ if (st->cycles % (st->field->max_age /2) == 0) {
+ populate_edges(st->field, st->density);
+ do_tick(st->field);
+ populate_edges(st->field, 0);
+ }
+
+ st->cycles++;
+
+#ifdef TIME_ME
+ if (st->cycles % st->field->max_age == 0) {
+ printf("%g s.\n",
+ ((time(NULL) - st->start_time) * 1000.0) / st->cycles);
+ }
+#endif
+
+ return (st->cycle_delay);
+}
+
+
+static void
+cloudlife_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+cloudlife_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ XClearWindow (dpy, window);
+ st->cycles = 0;
+ st->field = init_field(st);
+ return True;
+ }
+ return False;
+}
+
+static void
+cloudlife_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *cloudlife_defaults[] = {
+ ".background: black",
+ ".foreground: blue",
+ "*fpsSolid: true",
+ "*cycleDelay: 25000",
+ "*cycleColors: 2",
+ "*ncolors: 64",
+ "*maxAge: 64",
+ "*initialDensity: 30",
+ "*cellSize: 3",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec cloudlife_options[] = {
+ {"-background", ".background", XrmoptionSepArg, 0},
+ {"-foreground", ".foreground", XrmoptionSepArg, 0},
+ {"-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0},
+ {"-cycle-colors", ".cycleColors", XrmoptionSepArg, 0},
+ {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+ {"-cell-size", ".cellSize", XrmoptionSepArg, 0},
+ {"-initial-density", ".initialDensity", XrmoptionSepArg, 0},
+ {"-max-age", ".maxAge", XrmoptionSepArg, 0},
+ {0, 0, 0, 0}
+};
+
+
+XSCREENSAVER_MODULE ("CloudLife", cloudlife)
diff --git a/hacks/cloudlife.man b/hacks/cloudlife.man
new file mode 100644
index 0000000..35eae12
--- /dev/null
+++ b/hacks/cloudlife.man
@@ -0,0 +1,87 @@
+.TH XScreenSaver 6 "20-May-2003" "X Version 11"
+.SH NAME
+cloudlife - a cellular automaton based on Conway's Life
+.SH SYNOPSIS
+.B cloudlife
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-cycle-delay \fImicroseconds\fP] [\-cycle-colors \fIinteger\fP][\-cell-size \fIinteger\fP] [\-initial-density \fIinteger\fP] [\-max-age \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIcloudlife\fP program draws a cellular
+automaton based on Conway's Life, except that
+cells have a maximum age, and only one pixel per
+cell is drawn every tick.
+.SH OPTIONS
+.I cloudlife
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-cycle-delay \fIinteger\fP
+Time in microseconds to sleep between ticks. Default 25000.
+.TP 8
+.B \-cycle-colors \fIinteger\fP
+How many ticks should elapse between cycling colors. 0 to disable
+color cycling. Default 2.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-cell-size \fIinteger\fP
+Size of each cell, in powers of 2. Default 3 (8-pixel cells).
+.TP 8
+.B \-initial-density \fIinteger\fP
+Percentage of cells that are alive at start and when the
+field is repopulated. Default 30.
+.TP 8
+.B \-max-age \fIinteger\fP
+Maximum age for a cell. Default 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+
+Copyright \(co 2003 by Don Marti. Based on
+examples from the hacks directory of xscreensaver,
+Copyright (c) 1997, 1998, 2002 Jamie Zawinski
+<jwz@jwz.org>
+
+This man page based on the man page of sierpinski,
+Copyright \(co 1996 by Desmond Daignault.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Don Marti <dmarti@zgp.org> 20 May 2003.
+
diff --git a/hacks/compass.c b/hacks/compass.c
new file mode 100644
index 0000000..1dc1d3e
--- /dev/null
+++ b/hacks/compass.c
@@ -0,0 +1,986 @@
+/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+#define MAX(x,y) ((x)<(y)?(y):(x))
+#define MIN(x,y) ((x)>(y)?(y):(x))
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int delay;
+ Bool dbuf;
+ struct disc *discs[4];
+ int x, y, size, size2;
+ GC ptr_gc;
+ GC erase_gc;
+ XWindowAttributes xgwa;
+ Pixmap b, ba, bb; /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+};
+
+
+
+struct disc {
+ int theta; /* 0 - 360*64 */
+ int velocity;
+ int acceleration;
+ int limit;
+ GC gc;
+ void (*draw) (struct state *, Drawable, struct disc *,
+ int x, int y, int radius);
+};
+
+
+static void
+draw_letters (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XPoint points[50];
+ double th2 = 2 * M_PI * (disc->theta / ((double) 360*64));
+ double th;
+
+ /* W */
+
+ th = th2;
+
+ points[0].x = x + radius * 0.8 * cos(th - 0.07);
+ points[0].y = y + radius * 0.8 * sin(th - 0.07);
+
+ points[1].x = x + radius * 0.7 * cos(th - 0.05);
+ points[1].y = y + radius * 0.7 * sin(th - 0.05);
+
+ points[2].x = x + radius * 0.78 * cos(th);
+ points[2].y = y + radius * 0.78 * sin(th);
+
+ points[3].x = x + radius * 0.7 * cos(th + 0.05);
+ points[3].y = y + radius * 0.7 * sin(th + 0.05);
+
+ points[4].x = x + radius * 0.8 * cos(th + 0.07);
+ points[4].y = y + radius * 0.8 * sin(th + 0.07);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 5, CoordModeOrigin);
+
+ /* 30 (1) */
+
+ th = th2 + (2 * M_PI * 0.08333);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.75 * cos(th - 0.08);
+ points[4].y = y + radius * 0.75 * sin(th - 0.08);
+
+ points[5].x = x + radius * 0.74 * cos(th - 0.03);
+ points[5].y = y + radius * 0.74 * sin(th - 0.03);
+
+ points[6].x = x + radius * 0.72 * cos(th - 0.03);
+ points[6].y = y + radius * 0.72 * sin(th - 0.03);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.08);
+ points[7].y = y + radius * 0.7 * sin(th - 0.08);
+
+ points[8].x = x + radius * 0.72 * cos(th - 0.13);
+ points[8].y = y + radius * 0.72 * sin(th - 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* 30 (2) */
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.03);
+ points[0].y = y + radius * 0.78 * sin(th + 0.03);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.08);
+ points[1].y = y + radius * 0.8 * sin(th + 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.13);
+ points[2].y = y + radius * 0.78 * sin(th + 0.13);
+
+ points[3].x = x + radius * 0.72 * cos(th + 0.13);
+ points[3].y = y + radius * 0.72 * sin(th + 0.13);
+
+ points[4].x = x + radius * 0.7 * cos(th + 0.08);
+ points[4].y = y + radius * 0.7 * sin(th + 0.08);
+
+ points[5].x = x + radius * 0.72 * cos(th + 0.03);
+ points[5].y = y + radius * 0.72 * sin(th + 0.03);
+
+ points[6] = points[0];
+
+ XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
+
+ /* 33 (1) */
+
+ th = th2 + (2 * M_PI * 0.16666);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.75 * cos(th - 0.08);
+ points[4].y = y + radius * 0.75 * sin(th - 0.08);
+
+ points[5].x = x + radius * 0.74 * cos(th - 0.03);
+ points[5].y = y + radius * 0.74 * sin(th - 0.03);
+
+ points[6].x = x + radius * 0.72 * cos(th - 0.03);
+ points[6].y = y + radius * 0.72 * sin(th - 0.03);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.08);
+ points[7].y = y + radius * 0.7 * sin(th - 0.08);
+
+ points[8].x = x + radius * 0.72 * cos(th - 0.13);
+ points[8].y = y + radius * 0.72 * sin(th - 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* 33 (2) */
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.03);
+ points[0].y = y + radius * 0.78 * sin(th + 0.03);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.08);
+ points[1].y = y + radius * 0.8 * sin(th + 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.13);
+ points[2].y = y + radius * 0.78 * sin(th + 0.13);
+
+ points[3].x = x + radius * 0.76 * cos(th + 0.13);
+ points[3].y = y + radius * 0.76 * sin(th + 0.13);
+
+ points[4].x = x + radius * 0.75 * cos(th + 0.08);
+ points[4].y = y + radius * 0.75 * sin(th + 0.08);
+
+ points[5].x = x + radius * 0.74 * cos(th + 0.13);
+ points[5].y = y + radius * 0.74 * sin(th + 0.13);
+
+ points[6].x = x + radius * 0.72 * cos(th + 0.13);
+ points[6].y = y + radius * 0.72 * sin(th + 0.13);
+
+ points[7].x = x + radius * 0.7 * cos(th + 0.08);
+ points[7].y = y + radius * 0.7 * sin(th + 0.08);
+
+ points[8].x = x + radius * 0.72 * cos(th + 0.03);
+ points[8].y = y + radius * 0.72 * sin(th + 0.03);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* N */
+
+ th = th2 + (2 * M_PI * 0.25);
+
+ points[0].x = x + radius * 0.7 * cos(th - 0.05);
+ points[0].y = y + radius * 0.7 * sin(th - 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.05);
+ points[1].y = y + radius * 0.8 * sin(th - 0.05);
+
+ points[2].x = x + radius * 0.7 * cos(th + 0.05);
+ points[2].y = y + radius * 0.7 * sin(th + 0.05);
+
+ points[3].x = x + radius * 0.8 * cos(th + 0.05);
+ points[3].y = y + radius * 0.8 * sin(th + 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
+
+ /* 3 */
+
+ th = th2 + (2 * M_PI * 0.33333);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.05);
+ points[0].y = y + radius * 0.78 * sin(th - 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th);
+ points[1].y = y + radius * 0.8 * sin(th);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.05);
+ points[2].y = y + radius * 0.78 * sin(th + 0.05);
+
+ points[3].x = x + radius * 0.76 * cos(th + 0.05);
+ points[3].y = y + radius * 0.76 * sin(th + 0.05);
+
+ points[4].x = x + radius * 0.75 * cos(th);
+ points[4].y = y + radius * 0.75 * sin(th);
+
+ points[5].x = x + radius * 0.74 * cos(th + 0.05);
+ points[5].y = y + radius * 0.74 * sin(th + 0.05);
+
+ points[6].x = x + radius * 0.72 * cos(th + 0.05);
+ points[6].y = y + radius * 0.72 * sin(th + 0.05);
+
+ points[7].x = x + radius * 0.7 * cos(th);
+ points[7].y = y + radius * 0.7 * sin(th);
+
+ points[8].x = x + radius * 0.72 * cos(th - 0.05);
+ points[8].y = y + radius * 0.72 * sin(th - 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* 6 */
+
+ th = th2 + (2 * M_PI * 0.41666);
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.05);
+ points[0].y = y + radius * 0.78 * sin(th + 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th);
+ points[1].y = y + radius * 0.8 * sin(th);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.05);
+ points[2].y = y + radius * 0.78 * sin(th - 0.05);
+
+ points[3].x = x + radius * 0.72 * cos(th - 0.05);
+ points[3].y = y + radius * 0.72 * sin(th - 0.05);
+
+ points[4].x = x + radius * 0.7 * cos(th);
+ points[4].y = y + radius * 0.7 * sin(th);
+
+ points[5].x = x + radius * 0.72 * cos(th + 0.05);
+ points[5].y = y + radius * 0.72 * sin(th + 0.05);
+
+ points[6].x = x + radius * 0.74 * cos(th + 0.05);
+ points[6].y = y + radius * 0.74 * sin(th + 0.05);
+
+ points[7].x = x + radius * 0.76 * cos(th);
+ points[7].y = y + radius * 0.76 * sin(th);
+
+ points[8].x = x + radius * 0.74 * cos(th - 0.05);
+ points[8].y = y + radius * 0.74 * sin(th - 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+
+ /* E */
+
+ th = th2 + (2 * M_PI * 0.5);
+
+ points[0].x = x + radius * 0.8 * cos(th + 0.05);
+ points[0].y = y + radius * 0.8 * sin(th + 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.05);
+ points[1].y = y + radius * 0.8 * sin(th - 0.05);
+
+ points[2].x = x + radius * 0.75 * cos(th - 0.05);
+ points[2].y = y + radius * 0.75 * sin(th - 0.05);
+
+ points[3].x = x + radius * 0.75 * cos(th + 0.025);
+ points[3].y = y + radius * 0.75 * sin(th + 0.025);
+
+ points[4].x = x + radius * 0.75 * cos(th - 0.05);
+ points[4].y = y + radius * 0.75 * sin(th - 0.05);
+
+ points[5].x = x + radius * 0.7 * cos(th - 0.05);
+ points[5].y = y + radius * 0.7 * sin(th - 0.05);
+
+ points[6].x = x + radius * 0.7 * cos(th + 0.05);
+ points[6].y = y + radius * 0.7 * sin(th + 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
+
+ /* 12 (1) */
+
+ th = th2 + (2 * M_PI * 0.58333);
+
+ points[0].x = x + radius * 0.77 * cos(th - 0.06);
+ points[0].y = y + radius * 0.77 * sin(th - 0.06);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.03);
+ points[1].y = y + radius * 0.8 * sin(th - 0.03);
+
+ points[2].x = x + radius * 0.7 * cos(th - 0.03);
+ points[2].y = y + radius * 0.7 * sin(th - 0.03);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+ /* 12 (2) */
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.02);
+ points[0].y = y + radius * 0.78 * sin(th + 0.02);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.07);
+ points[1].y = y + radius * 0.8 * sin(th + 0.07);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.11);
+ points[2].y = y + radius * 0.78 * sin(th + 0.11);
+
+ points[3].x = x + radius * 0.76 * cos(th + 0.11);
+ points[3].y = y + radius * 0.76 * sin(th + 0.11);
+
+ points[4].x = x + radius * 0.74 * cos(th + 0.02);
+ points[4].y = y + radius * 0.74 * sin(th + 0.02);
+
+ points[5].x = x + radius * 0.71 * cos(th + 0.03);
+ points[5].y = y + radius * 0.71 * sin(th + 0.03);
+
+ points[6].x = x + radius * 0.7 * cos(th + 0.03);
+ points[6].y = y + radius * 0.7 * sin(th + 0.03);
+
+ points[7].x = x + radius * 0.7 * cos(th + 0.13);
+ points[7].y = y + radius * 0.7 * sin(th + 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 15 (1) */
+
+ th = th2 + (2 * M_PI * 0.66666);
+
+ points[0].x = x + radius * 0.77 * cos(th - 0.06);
+ points[0].y = y + radius * 0.77 * sin(th - 0.06);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.03);
+ points[1].y = y + radius * 0.8 * sin(th - 0.03);
+
+ points[2].x = x + radius * 0.7 * cos(th - 0.03);
+ points[2].y = y + radius * 0.7 * sin(th - 0.03);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+ /* 15 (2) */
+
+ points[0].x = x + radius * 0.8 * cos(th + 0.11);
+ points[0].y = y + radius * 0.8 * sin(th + 0.11);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.02);
+ points[1].y = y + radius * 0.8 * sin(th + 0.02);
+
+ points[2].x = x + radius * 0.76 * cos(th + 0.02);
+ points[2].y = y + radius * 0.76 * sin(th + 0.02);
+
+ points[3].x = x + radius * 0.77 * cos(th + 0.06);
+ points[3].y = y + radius * 0.77 * sin(th + 0.06);
+
+ points[4].x = x + radius * 0.76 * cos(th + 0.10);
+ points[4].y = y + radius * 0.76 * sin(th + 0.10);
+
+ points[5].x = x + radius * 0.73 * cos(th + 0.11);
+ points[5].y = y + radius * 0.73 * sin(th + 0.11);
+
+ points[6].x = x + radius * 0.72 * cos(th + 0.10);
+ points[6].y = y + radius * 0.72 * sin(th + 0.10);
+
+ points[7].x = x + radius * 0.7 * cos(th + 0.06);
+ points[7].y = y + radius * 0.7 * sin(th + 0.06);
+
+ points[8].x = x + radius * 0.72 * cos(th + 0.02);
+ points[8].y = y + radius * 0.72 * sin(th + 0.02);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* S */
+
+ th = th2 + (2 * M_PI * 0.75);
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.05);
+ points[0].y = y + radius * 0.78 * sin(th + 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th);
+ points[1].y = y + radius * 0.8 * sin(th);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.05);
+ points[2].y = y + radius * 0.78 * sin(th - 0.05);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.05);
+ points[3].y = y + radius * 0.76 * sin(th - 0.05);
+
+ points[4].x = x + radius * 0.74 * cos(th + 0.05);
+ points[4].y = y + radius * 0.74 * sin(th + 0.05);
+
+ points[5].x = x + radius * 0.72 * cos(th + 0.05);
+ points[5].y = y + radius * 0.72 * sin(th + 0.05);
+
+ points[6].x = x + radius * 0.7 * cos(th);
+ points[6].y = y + radius * 0.7 * sin(th);
+
+ points[7].x = x + radius * 0.72 * cos(th - 0.05);
+ points[7].y = y + radius * 0.72 * sin(th - 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 21 (1) */
+
+ th = th2 + (2 * M_PI * 0.83333);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.74 * cos(th - 0.12);
+ points[4].y = y + radius * 0.74 * sin(th - 0.12);
+
+ points[5].x = x + radius * 0.71 * cos(th - 0.13);
+ points[5].y = y + radius * 0.71 * sin(th - 0.13);
+
+ points[6].x = x + radius * 0.7 * cos(th - 0.13);
+ points[6].y = y + radius * 0.7 * sin(th - 0.13);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.02);
+ points[7].y = y + radius * 0.7 * sin(th - 0.02);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 21 (2) */
+
+ points[0].x = x + radius * 0.77 * cos(th + 0.03);
+ points[0].y = y + radius * 0.77 * sin(th + 0.03);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.06);
+ points[1].y = y + radius * 0.8 * sin(th + 0.06);
+
+ points[2].x = x + radius * 0.7 * cos(th + 0.06);
+ points[2].y = y + radius * 0.7 * sin(th + 0.06);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+ /* 24 (1) */
+
+ th = th2 + (2 * M_PI * 0.91666);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.74 * cos(th - 0.12);
+ points[4].y = y + radius * 0.74 * sin(th - 0.12);
+
+ points[5].x = x + radius * 0.71 * cos(th - 0.13);
+ points[5].y = y + radius * 0.71 * sin(th - 0.13);
+
+ points[6].x = x + radius * 0.7 * cos(th - 0.13);
+ points[6].y = y + radius * 0.7 * sin(th - 0.13);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.02);
+ points[7].y = y + radius * 0.7 * sin(th - 0.02);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 24 (2) */
+
+ points[0].x = x + radius * 0.69 * cos(th + 0.09);
+ points[0].y = y + radius * 0.69 * sin(th + 0.09);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.09);
+ points[1].y = y + radius * 0.8 * sin(th + 0.09);
+
+ points[2].x = x + radius * 0.72 * cos(th + 0.01);
+ points[2].y = y + radius * 0.72 * sin(th + 0.01);
+
+ points[3].x = x + radius * 0.72 * cos(th + 0.13);
+ points[3].y = y + radius * 0.72 * sin(th + 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
+}
+
+
+static void
+draw_ticks (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XSegment segs[72];
+ int i;
+ double tick = (M_PI * 2) / 72;
+
+ for (i = 0; i < 72; i++)
+ {
+ int radius2 = radius;
+ double th = (i * tick) + (2 * M_PI * (disc->theta / ((double) 360*64)));
+
+ if (i % 6)
+ radius2 -= radius / 16;
+ else
+ radius2 -= radius / 8;
+
+ segs[i].x1 = x + radius * cos(th);
+ segs[i].y1 = y + radius * sin(th);
+ segs[i].x2 = x + radius2 * cos(th);
+ segs[i].y2 = y + radius2 * sin(th);
+ }
+ XDrawSegments (st->dpy, d, disc->gc, segs, countof(segs));
+
+ draw_letters (st, d, disc, x, y, radius);
+}
+
+
+static void
+draw_thin_arrow (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XPoint points[3];
+ double th;
+ int radius2;
+ double tick = ((M_PI * 2) / 72) * 2;
+
+ radius *= 0.9;
+ radius2 = radius - (radius / 8) * 3;
+
+ th = 2 * M_PI * (disc->theta / ((double) 360*64));
+
+ points[0].x = x + radius * cos(th); /* tip */
+ points[0].y = y + radius * sin(th);
+
+ points[1].x = x + radius2 * cos(th - tick); /* tip left */
+ points[1].y = y + radius2 * sin(th - tick);
+
+ points[2].x = x + radius2 * cos(th + tick); /* tip right */
+ points[2].y = y + radius2 * sin(th + tick);
+
+ XDrawLine (st->dpy, d, disc->gc,
+ (int) (x + radius2 * cos(th)),
+ (int) (y + radius2 * sin(th)),
+ (int) (x + -radius * cos(th)),
+ (int) (y + -radius * sin(th)));
+
+ XFillPolygon (st->dpy, d, disc->gc, points, 3, Convex, CoordModeOrigin);
+}
+
+
+static void
+draw_thick_arrow (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XPoint points[10];
+ double th;
+ int radius2, radius3;
+ double tick = ((M_PI * 2) / 72) * 2;
+
+ radius *= 0.9;
+ radius2 = radius - (radius / 8) * 3;
+ radius3 = radius - (radius / 8) * 2;
+ th = 2 * M_PI * (disc->theta / ((double) 360*64));
+
+ points[0].x = x + radius * cos(th); /* tip */
+ points[0].y = y + radius * sin(th);
+
+ points[1].x = x + radius2 * cos(th - tick); /* tip left */
+ points[1].y = y + radius2 * sin(th - tick);
+
+ points[2].x = x + radius2 * cos(th + tick); /* tip right */
+ points[2].y = y + radius2 * sin(th + tick);
+
+ points[3] = points[0];
+
+ XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
+
+ points[0].x = x + radius2 * cos(th - tick/2); /* top left */
+ points[0].y = y + radius2 * sin(th - tick/2);
+
+ points[1].x = x + -radius2 * cos(th + tick/2); /* bottom left */
+ points[1].y = y + -radius2 * sin(th + tick/2);
+
+ points[2].x = x + -radius3 * cos(th); /* bottom */
+ points[2].y = y + -radius3 * sin(th);
+
+ points[3].x = x + -radius * cos(th); /* bottom spike */
+ points[3].y = y + -radius * sin(th);
+
+ points[4] = points[2]; /* return */
+
+ points[5].x = x + -radius2 * cos(th - tick/2); /* bottom right */
+ points[5].y = y + -radius2 * sin(th - tick/2);
+
+ points[6].x = x + radius2 * cos(th + tick/2); /* top right */
+ points[6].y = y + radius2 * sin(th + tick/2);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
+}
+
+
+
+static void
+roll_disc (struct disc *disc)
+{
+ double th = disc->theta;
+ if (th < 0)
+ th = -(th + disc->velocity);
+ else
+ th = (th + disc->velocity);
+
+ if (th > (360*64))
+ th -= (360*64);
+ else if (th < 0)
+ th += (360*64);
+
+ disc->theta = (disc->theta > 0 ? th : -th);
+
+ disc->velocity += disc->acceleration;
+
+ if (disc->velocity > disc->limit ||
+ disc->velocity < -disc->limit)
+ disc->acceleration = -disc->acceleration;
+
+ /* Alter direction of rotational acceleration randomly. */
+ if (! (random() % 120))
+ disc->acceleration = -disc->acceleration;
+
+ /* Change acceleration very occasionally. */
+ if (! (random() % 200))
+ {
+ if (random() & 1)
+ disc->acceleration *= 1.2;
+ else
+ disc->acceleration *= 0.8;
+ }
+}
+
+
+static void
+init_spin (struct disc *disc)
+{
+ disc->limit = 5*64;
+ disc->theta = RAND(360*64);
+ disc->velocity = RAND(16) * RANDSIGN();
+ disc->acceleration = RAND(16) * RANDSIGN();
+}
+
+
+static void
+draw_compass (struct state *st)
+{
+ int i = 0;
+ while (st->discs[i])
+ {
+ st->discs[i]->draw (st, st->b, st->discs[i], st->x, st->y, st->size);
+ roll_disc (st->discs[i]);
+ i++;
+ }
+}
+
+static void
+draw_pointer (struct state *st)
+{
+ int radius = st->size;
+ GC dot_gc = st->discs[0]->gc;
+ XPoint points[3];
+ int size = radius * 0.1;
+
+ /* top */
+
+ points[0].x = st->x - size;
+ points[0].y = st->y - radius - size;
+
+ points[1].x = st->x + size;
+ points[1].y = st->y - radius - size;
+
+ points[2].x = st->x;
+ points[2].y = st->y - radius;
+
+ XFillPolygon (st->dpy, st->b, st->ptr_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* top right */
+
+ points[0].x = st->x - (radius * 0.85);
+ points[0].y = st->y - (radius * 0.8);
+
+ points[1].x = st->x - (radius * 1.1);
+ points[1].y = st->y - (radius * 0.55);
+
+ points[2].x = st->x - (radius * 0.6);
+ points[2].y = st->y - (radius * 0.65);
+
+ XFillPolygon (st->dpy, st->b, st->ptr_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* left */
+
+ points[0].x = st->x - (radius * 1.05);
+ points[0].y = st->y;
+
+ points[1].x = st->x - (radius * 1.1);
+ points[1].y = st->y - (radius * 0.025);
+
+ points[2].x = st->x - (radius * 1.1);
+ points[2].y = st->y + (radius * 0.025);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* right */
+
+ points[0].x = st->x + (radius * 1.05);
+ points[0].y = st->y;
+
+ points[1].x = st->x + (radius * 1.1);
+ points[1].y = st->y - (radius * 0.025);
+
+ points[2].x = st->x + (radius * 1.1);
+ points[2].y = st->y + (radius * 0.025);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* bottom */
+
+ points[0].x = st->x;
+ points[0].y = st->y + (radius * 1.05);
+
+ points[1].x = st->x - (radius * 0.025);
+ points[1].y = st->y + (radius * 1.1);
+
+ points[2].x = st->x + (radius * 0.025);
+ points[2].y = st->y + (radius * 1.1);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* bottom left */
+
+ points[0].x = st->x + (radius * 0.74);
+ points[0].y = st->y + (radius * 0.74);
+
+ points[1].x = st->x + (radius * 0.78);
+ points[1].y = st->y + (radius * 0.75);
+
+ points[2].x = st->x + (radius * 0.75);
+ points[2].y = st->y + (radius * 0.78);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* top left */
+
+ points[0].x = st->x + (radius * 0.74);
+ points[0].y = st->y - (radius * 0.74);
+
+ points[1].x = st->x + (radius * 0.78);
+ points[1].y = st->y - (radius * 0.75);
+
+ points[2].x = st->x + (radius * 0.75);
+ points[2].y = st->y - (radius * 0.78);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* bottom right */
+
+ points[0].x = st->x - (radius * 0.74);
+ points[0].y = st->y + (radius * 0.74);
+
+ points[1].x = st->x - (radius * 0.78);
+ points[1].y = st->y + (radius * 0.75);
+
+ points[2].x = st->x - (radius * 0.75);
+ points[2].y = st->y + (radius * 0.78);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+}
+
+
+static void *
+compass_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->dbuf = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->size2 = MIN(st->xgwa.width, st->xgwa.height);
+
+ if (st->xgwa.width > st->xgwa.height * 5 || /* goofy aspect ratio */
+ st->xgwa.height > st->xgwa.width * 5)
+ st->size2 = MAX(st->xgwa.width, st->xgwa.height);
+
+ {
+ int max = 600;
+ if (st->xgwa.width > 2560) max *= 2; /* Retina displays */
+ if (st->size2 > max) st->size2 = max;
+ }
+
+ st->size = (st->size2 / 2) * 0.8;
+
+ st->x = st->xgwa.width/2;
+ st->y = st->xgwa.height/2;
+
+ if (st->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = st->backb = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!st->b)
+ {
+ st->x = st->size2/2;
+ st->y = st->size2/2;
+ st->ba = XCreatePixmap (st->dpy, st->window, st->size2, st->size2, st->xgwa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->size2, st->size2, st->xgwa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = st->window;
+ }
+
+ st->discs[0] = (struct disc *) calloc (1, sizeof (struct disc));
+ st->discs[1] = (struct disc *) calloc (1, sizeof (struct disc));
+ st->discs[2] = (struct disc *) calloc (1, sizeof (struct disc));
+ st->discs[3] = 0;
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ gcv.line_width = MAX(2, (st->size/60));
+ gcv.join_style = JoinBevel;
+ st->discs[0]->draw = draw_ticks;
+ st->discs[0]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth|GCJoinStyle,
+ &gcv);
+ init_spin (st->discs[0]);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "arrow2Foreground", "Foreground");
+ gcv.line_width = MAX(4, (st->size / 30));
+ st->discs[1]->draw = draw_thick_arrow;
+ st->discs[1]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
+ init_spin (st->discs[1]);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "arrow1Foreground", "Foreground");
+ gcv.line_width = MAX(4, (st->size / 30));
+ st->discs[2]->draw = draw_thin_arrow;
+ st->discs[2]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
+ init_spin (st->discs[2]);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "pointerForeground", "Foreground");
+ st->ptr_gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &gcv);
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->erase_gc, 0, 0, st->size2, st->size2);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->erase_gc, 0, 0, st->size2, st->size2);
+
+ return st;
+}
+
+static unsigned long
+compass_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFillRectangle (st->dpy, st->b, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ draw_compass (st);
+ draw_pointer (st);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, st->window, st->erase_gc, 0, 0,
+ st->size2, st->size2,
+ st->xgwa.width/2 - st->x,
+ st->xgwa.height/2 - st->y);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+static void
+compass_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->size2 = MIN(st->xgwa.width, st->xgwa.height);
+ st->x = st->xgwa.width/2;
+ st->y = st->xgwa.height/2;
+}
+
+static Bool
+compass_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+compass_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+
+static const char *compass_defaults [] = {
+ ".background: #000000",
+ ".foreground: #DDFFFF",
+ "*arrow1Foreground: #FFF66A",
+ "*arrow2Foreground: #F7D64A",
+ "*pointerForeground: #FF0000",
+ "*delay: 20000",
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ 0
+};
+
+static XrmOptionDescRec compass_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Compass", compass)
diff --git a/hacks/compass.man b/hacks/compass.man
new file mode 100644
index 0000000..8d7cc7e
--- /dev/null
+++ b/hacks/compass.man
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+compass - draws a spinning compass.
+.SH SYNOPSIS
+.B compass
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-no-db]
+[\-fps]
+.SH DESCRIPTION
+This draws a compass, with all elements spinning about randomly, for that
+``lost and nauseous'' feeling.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-db | \-no-db
+Double Buffer. Boolean.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com
new file mode 100644
index 0000000..c50e0f9
--- /dev/null
+++ b/hacks/compile_axp.com
@@ -0,0 +1,156 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ABSTRACTILE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMOTAXIS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2-MAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CWAVES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELAUNAY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FILMLEADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GLITCHPEG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERAGGREGATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERMOMENTARY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JUGGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LCDSCRUB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) M6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MEMSCROLLER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_AI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_LEVEL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTZOOMER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPEEDMINE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SUBSTRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESSELLIMAGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESTX11.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) THORNBIRD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TWANG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VERMICULATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VFEEDBACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLWINDWARP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XIMAGE-LOADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XRAYSWARM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSPIROGRAPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSUBLIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ZOOM.C
diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com
new file mode 100644
index 0000000..c50e0f9
--- /dev/null
+++ b/hacks/compile_decc.com
@@ -0,0 +1,156 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ABSTRACTILE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMOTAXIS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2-MAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CWAVES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELAUNAY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FILMLEADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GLITCHPEG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERAGGREGATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERMOMENTARY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JUGGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LCDSCRUB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) M6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MEMSCROLLER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_AI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_LEVEL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTZOOMER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPEEDMINE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SUBSTRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESSELLIMAGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESTX11.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) THORNBIRD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TWANG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VERMICULATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VFEEDBACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLWINDWARP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XIMAGE-LOADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XRAYSWARM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSPIROGRAPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSUBLIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ZOOM.C
diff --git a/hacks/config/README b/hacks/config/README
new file mode 100644
index 0000000..9771a89
--- /dev/null
+++ b/hacks/config/README
@@ -0,0 +1,262 @@
+
+ XScreenSaver
+
+ a screen saver and locker for the X window system
+ by Jamie Zawinski
+
+ version 5.40
+ 12-Aug-2018
+
+ https://www.jwz.org/xscreensaver/
+
+-----------------------------------------------------------------------
+
+This directory contains XML files that describe each of the screenhacks;
+the per-hack user interface is constructed based on the things in these
+files. The files are loaded at run-time by xscreensaver-demo (also
+known as "the Control Center screensaver properties capplet".)
+
+The tags and parameters used here are:
+
+-----------------------------------------------------------------------
+
+ <screensaver name="PROGRAM-NAME" _label="PRETTY NAME">
+ ...
+ </screensaver>
+
+ This encloses the whole file: all of the tags described below
+ are inside this one.
+
+-----------------------------------------------------------------------
+
+ <command arg="-SWITCH"/>
+
+ specifies that "-SWITCH" always appears on the command line.
+ You'll most often see this with "-root".
+
+-----------------------------------------------------------------------
+
+ <boolean id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg-set="-SWITCH-A"
+ arg-unset="-SWITCH-B"
+ />
+
+ This creates a checkbox.
+
+ "id" is currently unused, but may eventually be used for
+ letting other widgets refer to this one.
+
+ "_label" is the string printed next to the checkbox.
+
+ "arg-set" is what to insert into the command line if the
+ box is checked.
+
+ "arg-unset" is what to insert into the command line if the
+ box is unchecked.
+
+ You will probably never specify both "arg-set" and "arg-unset",
+ because the setting that is the default should insert nothing
+ into the command line (that's what makes it the default.)
+ For example:
+
+ <boolean _label="foo" arg-set="-foo" />
+
+ or if "foo" is the default, and must be explicity turned off,
+
+ <boolean _label="foo" arg-unset="-no-foo" />
+
+-----------------------------------------------------------------------
+
+ <number id="SYMBOLIC NAME"
+ type="slider"
+ arg="-SWITCH %"
+ _label="HEADING LABEL"
+ _low-label="LEFT LABEL"
+ _high-label="RIGHT LABEL"
+ low="MIN VALUE"
+ high="MAX VALUE"
+ default="DEFAULT VALUE"
+ [ convert="invert" ]
+ />
+
+ This creates a slider.
+
+ The _label is printed above the slider. The _low-label and
+ _high-label are printed to the left and right, respectively.
+
+ If any of the numbers you type has a decimal point, then
+ the range is assumed to be a floating-point value; otherwise,
+ only integral values will be used. So be careful about "1"
+ versus "1.0".
+
+ If convert="invert" is specified, then the value that the
+ user tweaks goes the other way from the value the command
+ line expects: e.g., if the slider goes from 10-20 and the
+ user picks 13, the converted value goes from 20-10 (and
+ would be 17.) This is useful for converting between the
+ concepts of "delay" and "speed".
+
+ In the "arg" string, the first occurence of "%" is replaced
+ with the numeric value, when creating the command line.
+
+-----------------------------------------------------------------------
+
+ <number id="SYMBOLIC NAME"
+ type="spinbutton"
+ arg="-SWITCH %"
+ _label="HEADING LABEL"
+ low="MIN VALUE"
+ high="MAX VALUE"
+ default="DEFAULT VALUE"
+ [ convert="invert" ]
+ />
+
+ This creates a spinbox (a text field with a number in it,
+ and up/down arrows next to it.)
+
+ Arguments are exactly like type="slider", except that
+ _low-label and _high-label are not used. Also, _label
+ appears to the left of the box, instead of above it.
+
+-----------------------------------------------------------------------
+
+ <select id="SYMBOLIC NAME">
+ <option id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg-set="-SWITCH"
+ />
+ [ ... more <options> ... ]
+ </select>
+
+ This creates a selection popup menu.
+
+ Options should have arg-set (arg-unset is not used here.)
+
+ One of the menu items (the default) should have no arg-set.
+
+ Each arg-set should begin with the same switch: that is,
+ all the args in a given menu should look like:
+
+ -mode one
+ -mode two
+ -mode three
+
+ and not
+
+ -this
+ -that
+ -the other
+
+-----------------------------------------------------------------------
+
+ <string id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg="-SWITCH %"
+ />
+
+ This creates a text entry field.
+
+-----------------------------------------------------------------------
+
+ <file id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg="-SWITCH %"
+ />
+
+ This creates a file entry field (a text field with a "Browse"
+ button next to it.)
+
+-----------------------------------------------------------------------
+
+ <xscreensaver-text />
+
+ This indicates that this screen saver displays text via the
+ "xscreensaver-text" program.
+
+ In the X11 version, this tag does nothing: the text-related
+ preferences are in the main Screen Saver Preferences window,
+ not in the per-display-mode preferences.
+
+ In the MacOS version, the text-related preferences appear
+ in this pane, and this tag emits those several controls.
+
+-----------------------------------------------------------------------
+
+ <xscreensaver-image />
+
+ This indicates that this screen saver displays images via the
+ "xscreensaver-getimage" program.
+
+ In the X11 version, this tag does nothing: the image-loading
+ and screen-grabbing-related preferences are in the main
+ Screen Saver Preferences window, not in the per-display-mode
+ preferences.
+
+ In the MacOS version, the image-related preferences appear
+ in this pane, and this tag emits those several controls.
+
+-----------------------------------------------------------------------
+
+ <xscreensaver-updater />
+
+ Where to position the "Check for Updates" options.
+ This is used on MacOS and ignored on X11.
+
+-----------------------------------------------------------------------
+
+ <video href="URL" />
+
+ A link to a Youtube preview of this screen saver.
+
+-----------------------------------------------------------------------
+
+ <hgroup>
+ [ ... <boolean>s ... ]
+ [ ... <number>s ... ]
+ [ ... <select>s ... ]
+ [ ... <string>s ... ]
+ [ ... <file>s ... ]
+ [ ... <vgroup>s ... ]
+ </hgroup>
+
+ A horizontal group of widgets/groups. No more than 4 widgets
+ or groups should be used in a row.
+
+-----------------------------------------------------------------------
+
+ <vgroup>
+ [ ... <boolean>s ... ]
+ [ ... <number>s ... ]
+ [ ... <select>s ... ]
+ [ ... <string>s ... ]
+ [ ... <file>s ... ]
+ [ ... <hgroup>s ... ]
+ </vgroup>
+
+ A vertical group of widgets/groups. No more than 10 widgets
+ or groups should be used in a column.
+
+ Since the default alignment of widgets is a column, the
+ <vgroup> element is only of use inside an <hgroup> element.
+
+-----------------------------------------------------------------------
+
+ <_description>
+ FREE TEXT
+ </_description>
+
+ This is the description of the hack that appears in the right
+ part of the window. Lines are wrapped; paragraphs are separated
+ by blank lines. Lines that begin with whitespace will not be
+ wrapped (see "munch.xml" for an example of why.)
+
+ Make sure you use "&lt;" instead of "<", etc. Character
+ entities are allowed; HTML (and other markup) is not.
+
+-----------------------------------------------------------------------
+
+If you are DTD-minded, you may also find the included files "xss.dtd"
+and "xss.xsd" useful.
+
+-----------------------------------------------------------------------
diff --git a/hacks/config/abstractile.xml b/hacks/config/abstractile.xml
new file mode 100644
index 0000000..c706330
--- /dev/null
+++ b/hacks/config/abstractile.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="abstractile" _label="Abstractile">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NgSetBY6VP4"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="5" default="3"/>
+
+ <number id="sleep" type="slider" arg="-sleep %"
+ _label="Linger" _low-label="0 seconds" _high-label="60 seconds"
+ low="0" high="60" default="3"/>
+
+ <select id="tile">
+ <option id="random" _label="Random tile layout"/>
+ <option id="random" _label="Flat tiles" arg-set="-tile flat"/>
+ <option id="random" _label="Thin tiles" arg-set="-tile thin"/>
+ <option id="random" _label="Outline tiles" arg-set="-tile outline"/>
+ <option id="random" _label="Block tiles" arg-set="-tile block"/>
+ <option id="random" _label="Neon tiles" arg-set="-tile neon"/>
+ <option id="random" _label="Tiled tiles" arg-set="-tile tiled"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Mosaic patterns of interlocking tiles.
+
+Written by Steve Sundstrom; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/anemone.xml b/hacks/config/anemone.xml
new file mode 100644
index 0000000..90dff7a
--- /dev/null
+++ b/hacks/config/anemone.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="anemone" _label="Anemone">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=usITxM2YJZs"/>
+
+<!--
+ -withdraw 1200
+ -turnspeed 50
+-->
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="80000" default="40000"
+ convert="invert"/>
+
+ <number id="arms" type="slider" arg="-arms %"
+ _label="Arms" _low-label="Few" _high-label="Many"
+ low="2" high="500" default="128"/>
+
+ <number id="finpoints" type="slider" arg="-finpoints %"
+ _label="Tentacles" _low-label="Few" _high-label="Many"
+ low="3" high="200" default="64"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="width" type="slider" arg="-width %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="1" high="10" default="2"/>
+
+ <number id="withdraw" type="slider" arg="-withdraw %"
+ _label="Withdraw freqency" _low-label="Often" _high-label="Rarely"
+ low="12" high="10000" default="1200"/>
+
+ <number id="turnspeed" type="slider" arg="-turnspeed %"
+ _label="Turn speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="1000" default="50"/>
+
+ <!--
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+ -->
+
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Wiggling tentacles.
+
+Written by Gabriel Finch; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/anemotaxis.xml b/hacks/config/anemotaxis.xml
new file mode 100644
index 0000000..6c3785f
--- /dev/null
+++ b/hacks/config/anemotaxis.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="anemotaxis" _label="Anemotaxis">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=hIqmIQbQkW8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="distance" type="slider" arg="-distance %"
+ _label="Distance" _low-label="Near" _high-label="Far"
+ low="10" high="250" default="40"/>
+
+ <number id="sources" type="slider" arg="-sources %"
+ _label="Sources" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="25"/>
+
+ <number id="searchers" type="slider" arg="-searchers %"
+ _label="Searchers" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="25"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Searches for a source of odor in a turbulent atmosphere. The searcher
+is able to sense the odor and determine local instantaneous wind
+direction. The goal is to find the source in the shortest mean time.
+
+https://en.wikipedia.org/wiki/Anemotaxis
+
+Written by Eugene Balkovsky; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/ant.xml b/hacks/config/ant.xml
new file mode 100644
index 0000000..8bb7423
--- /dev/null
+++ b/hacks/config/ant.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ant" _label="Ant">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PaG7RCO4ezs"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="40000"/>
+
+ <hgroup>
+ <boolean id="sharpturn" _label="Sharp turns" arg-set="-sharpturn"/>
+ <boolean id="truchet" _label="Truchet lines" arg-set="-truchet"/>
+ <boolean id="eyes" _label="Draw eyes" arg-set="-eyes"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Three" _high-label="Many"
+ low="3" high="255" default="64"/>
+
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Ants count" low="-20" high="20" default="-3"/>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Ant size" low="-18" high="18" default="-12"/>
+ </hgroup>
+
+ <select id="neighbors">
+ <option id="rand" _label="Random cell shape"/>
+ <option id="three" _label="Three sided cells"
+ arg-set="-neighbors 3"/>
+ <option id="four" _label="Four sided cells"
+ arg-set="-neighbors 4"/>
+ <option id="six" _label="Six sided cells"
+ arg-set="-neighbors 6"/>
+ <option id="nine" _label="Nine sided cells"
+ arg-set="-neighbors 9"/>
+ <option id="twelve" _label="Twelve sided cells"
+ arg-set="-neighbors 12"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 4.22.
+
+A cellular automaton that is really a two-dimensional Turing machine:
+as the heads ("ants") walk along the screen, they change pixel
+values in their path. Then, as they pass over changed pixels, their
+behavior is influenced.
+
+https://en.wikipedia.org/wiki/Langton%27s_ant
+https://en.wikipedia.org/wiki/Turing_machine
+
+Written by David Bagley; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/antinspect.xml b/hacks/config/antinspect.xml
new file mode 100644
index 0000000..ee4ce7b
--- /dev/null
+++ b/hacks/config/antinspect.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="antinspect" _label="AntInspect" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Ecw9dDc0db0"/>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <boolean id="shadows" _label="Draw shadows" arg-set="-shadows"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Ants move spheres around a circle.
+
+Written by Blair Tennessy; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/antmaze.xml b/hacks/config/antmaze.xml
new file mode 100644
index 0000000..1580205
--- /dev/null
+++ b/hacks/config/antmaze.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="antmaze" _label="AntMaze" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Bwa5-n6UUj8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Ants walk around a simple maze.
+
+Written by Blair Tennessy; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/antspotlight.xml b/hacks/config/antspotlight.xml
new file mode 100644
index 0000000..fe78174
--- /dev/null
+++ b/hacks/config/antspotlight.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="antspotlight" _label="AntSpotlight" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NYisFYtODTA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+An ant walks over an image.
+
+Written by Blair Tennessy; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/apollonian.xml b/hacks/config/apollonian.xml
new file mode 100644
index 0000000..72d0e41
--- /dev/null
+++ b/hacks/config/apollonian.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="apollonian" _label="Apollonian">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aeWnjSROR8U"/>
+
+ <boolean id="label" _label="Draw labels" arg-unset="-no-label"/>
+
+ <boolean id="altgeom" _label="Include alternate geometries"
+ arg-unset="-no-altgeom"/>
+
+<!-- don't know what -count does -->
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Depth" _low-label="Shallow" _high-label="Deep"
+ low="1" high="20" default="20"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="1000000" default="1000000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A fractal packing of circles with smaller circles, demonstrating
+Descartes's theorem.
+
+https://en.wikipedia.org/wiki/Apollonian_gasket
+https://en.wikipedia.org/wiki/Descartes%27_theorem
+
+Written by Allan R. Wilks and David Bagley; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/apple2.xml b/hacks/config/apple2.xml
new file mode 100644
index 0000000..4084bc9
--- /dev/null
+++ b/hacks/config/apple2.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="apple2" _label="Apple2">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=p3QZqhp67l8"/>
+
+ <hgroup>
+ <vgroup>
+ <select id="mode">
+ <option id="random" _label="Choose display mode randomly"/>
+ <option id="text" _label="Display scrolling text" arg-set="-mode text"/>
+ <option id="slideshow" _label="Display images" arg-set="-mode slideshow"/>
+ <option id="basic" _label="Run basic programs" arg-set="-mode basic"/>
+ </select>
+
+ <xscreensaver-text />
+ </vgroup>
+ <vgroup>
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="60"/>
+
+ <xscreensaver-image />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+ </vgroup>
+
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+
+ <_description>
+An Apple ][+ computer simulation, in all its 1979 glory. It also
+reproduces the appearance of display on a color television set of the
+period.
+
+In "Basic Programming Mode", a simulated user types in a BASIC program
+and runs it. In "Text Mode", it displays the output of a program, or
+the contents of a file or URL. In "Slideshow Mode", it chooses random
+images and displays them within the limitations of the Apple ][
+display hardware. (Six available colors in hi-res mode!)
+
+On MacOS and Linux, this program is also a fully-functional VT100
+emulator! Run it as an application instead of as a screen saver and
+you can use it as a terminal.
+
+https://en.wikipedia.org/wiki/Apple_II_series
+
+Written by Trevor Blackwell and Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/atlantis.xml b/hacks/config/atlantis.xml
new file mode 100644
index 0000000..2e06b85
--- /dev/null
+++ b/hacks/config/atlantis.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="atlantis" _label="Atlantis" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=U78xPez5UGg"/>
+
+ <number id="sharkspeed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <number id="whalespeed" type="slider" arg="-whalespeed %"
+ _label="Whale speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="1000" default="250"/>
+
+ <number id="sharkproximity" type="slider" arg="-size %"
+ _label="Shark proximity" _low-label="Shy" _high-label="Agressive"
+ low="100" high="10000" default="6000"/>
+
+ <number id="sharkcount" type="slider" arg="-count %"
+ _label="Number of sharks" _low-label="None" _high-label="20"
+ low="0" high="20" default="4"/>
+
+ <hgroup>
+ <select id="water">
+ <option id="shimmer" _label="Shimmering water"/>
+ <option id="clear" _label="Clear water" arg-set="-no-texture"/>
+ </select>
+
+ <select id="bg">
+ <option id="flat" _label="Flat background" arg-set="-no-gradient"/>
+ <option id="gradient" _label="Gradient background"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Sharks, dolphins and whales.
+
+Written by Mark Kilgard; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/attraction.xml b/hacks/config/attraction.xml
new file mode 100644
index 0000000..b0ca4ae
--- /dev/null
+++ b/hacks/config/attraction.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="attraction" _label="Attraction">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KAT9nkXCdms"/>
+
+ <hgroup>
+ <select id="mode">
+ <option id="balls" _label="Balls"/>
+ <option id="lines" _label="Lines" arg-set="-mode lines"/>
+ <option id="tails" _label="Tails" arg-set="-mode tails"/>
+ <option id="polygons" _label="Polygons" arg-set="-mode polygons"/>
+ <option id="splines" _label="Splines" arg-set="-mode splines"/>
+ <option id="fsplines" _label="Filled splines"
+ arg-set="-mode filled-splines"/>
+ </select>
+
+ <select id="wallmode">
+ <option id="walls" _label="Bounce off walls"/>
+ <option id="nowalls" _label="Ignore screen edges" arg-set="-nowalls"/>
+ </select>
+
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="points" type="spinbutton" arg="-points %"
+ _label="Ball count" low="0" high="200" default="0"/>
+ <number id="viscosity" type="slider" arg="-viscosity %"
+ _label="Environmental viscosity"
+ _low-label="Low" _high-label="High"
+ low="0.0" high="1.0" default="1.0"
+ convert="invert"/>
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Trail length" _low-label="Short" _high-label="Long"
+ low="2" high="1000" default="500"/>
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+ </vgroup>
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _low-label="Ball mass" _high-label="High"
+ low="0" high="100" default="0"/>
+ <number id="threshold" type="slider" arg="-threshold %"
+ _label="Repulsion threshold"
+ _low-label="Small" _high-label="Large"
+ low="0" high="600" default="200"/>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="40000" default="10000"
+ convert="invert"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="orbit" _label="Orbital mode" arg-set="-orbit"/>
+ <number id="radius" type="spinbutton" arg="-radius %"
+ _label="Radius" low="0" high="1000" default="0"/>
+ <number id="vmult" type="slider" arg="-vmult %"
+ _low-label="Outward" _high-label="Inward"
+ low="-5.0" high="5.0" default="0.9"/>
+ </hgroup>
+
+ <!-- #### -vx [?] -->
+ <!-- #### -vy [?] -->
+ <!-- #### -glow -->
+ <!-- #### -nomaxspeed -->
+ <!-- #### -correct-bounce -->
+ <!-- #### -graphmode [none] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Points attract each other up to a certain distance, and then begin to
+repel each other. The attraction/repulsion is proportional to the
+distance between any two particles, similar to the strong and weak
+nuclear forces.
+
+Written by Jamie Zawinski and John Pezaris; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/atunnel.xml b/hacks/config/atunnel.xml
new file mode 100644
index 0000000..eea3b96
--- /dev/null
+++ b/hacks/config/atunnel.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="atunnel" _label="Atunnel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mpCRbi3jkuc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="light" _label="Lighting" arg-set="-light"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Zooming through a textured tunnel.
+
+Written by Eric Lassauge and Roman Podobedov; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/barcode.xml b/hacks/config/barcode.xml
new file mode 100644
index 0000000..76fca28
--- /dev/null
+++ b/hacks/config/barcode.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="barcode" _label="Barcode">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gmtAySJdsfg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="scroll" _label="Scrolling barcodes"/>
+ <option id="scroll" _label="Barcode grid" arg-set="-mode grid"/>
+ <option id="clock12" _label="Barcode clock (AM/PM)" arg-set="-mode clock12"/>
+ <option id="clock24" _label="Barcode clock (24 hour)" arg-set="-mode clock24"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Colorful scrolling barcodes. CONSUME!
+
+The barcodes follow the UPC-A, UPC-E, EAN-8 or EAN-13 standards.
+
+https://en.wikipedia.org/wiki/Universal_Product_Code
+https://en.wikipedia.org/wiki/European_Article_Number
+
+Written by Dan Bornstein and Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/binaryring.xml b/hacks/config/binaryring.xml
new file mode 100644
index 0000000..a96026c
--- /dev/null
+++ b/hacks/config/binaryring.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="binaryring" _label="BinaryRing">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KPiJb0Qm1SE"/>
+
+ <number id="growth-delay" type="slider" arg="-growth-delay %"
+ _label="Growth delay" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000" />
+
+ <number id="ring-radius" type="slider" arg="-ring-radius %"
+ _label="Ring Radius" _low-label="Short" _high-label="Long"
+ low="0" high="400" default="40" />
+
+ <number id="particles-number" type="slider" arg="-particles-number %"
+ _label="Number of particles" _low-label="Few" _high-label="Lots"
+ low="500" high="20000" default="5000" />
+
+ <boolean id="color" _label="Fade with colors" arg-unset="-no-color"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A system of path tracing particles evolves continuously from an
+initial creation, alternating dark and light colors.
+
+Written by J. Tarbell and Emilio Del Tessandoro; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blaster.xml b/hacks/config/blaster.xml
new file mode 100644
index 0000000..d7cb42d
--- /dev/null
+++ b/hacks/config/blaster.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blaster" _label="Blaster">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=bp3J3si2Hr0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="num_robots" type="spinbutton" arg="-num_robots %"
+ _label="Robots" low="2" high="50" default="5"/>
+
+ <number id="num_lasers" type="spinbutton" arg="-num_lasers %"
+ _label="Lasers" low="1" high="100" default="3"/>
+
+ <number id="num_stars" type="slider" arg="-num_stars %"
+ _label="Stars" _low-label="Few" _high-label="Many"
+ low="5" high="200" default="50"/>
+
+ <!-- #### -move_stars_x [2] -->
+ <!-- #### -move_stars_y [1] -->
+ <!-- #### -move_stars_random [0] -->
+ <!-- #### -star_color [white] -->
+
+ <!-- #### -explode_size_1 [27] -->
+ <!-- #### -explode_size_2 [19] -->
+ <!-- #### -explode_size_3 [7] -->
+ <!-- #### -explode_color_1 [yellow] -->
+ <!-- #### -explode_color_2 [orange] -->
+
+ <!-- #### -r_color0 [magenta] -->
+ <!-- #### -r_color1 [orange] -->
+ <!-- #### -r_color2 [yellow] -->
+ <!-- #### -r_color3 [white] -->
+ <!-- #### -r_color4 [blue] -->
+ <!-- #### -r_color5 [cyan] -->
+ <!-- #### -l_color0 [green] -->
+ <!-- #### -l_color1 [red] -->
+
+ <!-- #### -mother_ship -->
+ <!-- #### -mother_ship_width [25] -->
+ <!-- #### -mother_ship_height [7] -->
+ <!-- #### -mother_ship_laser [15] -->
+ <!-- #### -mother_ship_period [150] -->
+ <!-- #### -mother_ship_hits [10] -->
+ <!-- #### -mother_ship_color0 [darkblue] -->
+ <!-- #### -mother_ship_color1 [white] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flying space-combat robots (cleverly disguised as colored circles)
+do battle in front of a moving star field.
+
+Written by Jonathan Lin; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blinkbox.xml b/hacks/config/blinkbox.xml
new file mode 100644
index 0000000..d457df2
--- /dev/null
+++ b/hacks/config/blinkbox.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blinkbox" _label="BlinkBox" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lgjbHMcSd8U"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="boxsize" type="slider" arg="-boxsize %"
+ _label="Box size" _low-label="Small" _high-label="Large"
+ low="1" high="8" default="2"/>
+
+ <hgroup>
+ <boolean id="fade" _label="Fade" arg-unset="-no-fade"/>
+ <boolean id="blur" _label="Motion blur" arg-unset="-no-blur"/>
+ <boolean id="dissolve" _label="Dissolve" arg-set="-dissolve"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A motion-blurred ball bounces inside a box whose tiles only become
+visible upon impact.
+
+Written by Jeremy English; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blitspin.xml b/hacks/config/blitspin.xml
new file mode 100644
index 0000000..df53aa7
--- /dev/null
+++ b/hacks/config/blitspin.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blitspin" _label="BlitSpin">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=UTtcwb-UWW8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Fuzzy rotation speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="800000" default="500000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="90 degree rotation speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="800000" default="500000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+ </vgroup>
+
+ <vgroup>
+ <!-- <file id="bitmap" _label="Bitmap to rotate" arg="-bitmap %"/> -->
+ <xscreensaver-image />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Repeatedly rotates a bitmap by 90 degrees by using logical operations:
+the bitmap is divided into quadrants, and the quadrants are shifted
+clockwise. Then the same thing is done again with progressively
+smaller quadrants, except that all sub-quadrants of a given size are
+rotated in parallel. As you watch it, the image appears to dissolve
+into static and then reconstitute itself, but rotated.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blocktube.xml b/hacks/config/blocktube.xml
new file mode 100644
index 0000000..85f88f9
--- /dev/null
+++ b/hacks/config/blocktube.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blocktube" _label="BlockTube" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=L0JUBhpZlMw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="holdtime" type="slider" arg="-holdtime %"
+ _label="Color hold time" _low-label="Short" _high-label="Long"
+ low="10" high="2000" default="1000"/>
+
+ <number id="changetime" type="slider" arg="-changetime %"
+ _label="Color change time" _low-label="Short" _high-label="Long"
+ low="10" high="1000" default="200"/>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A swirling, falling tunnel of reflective slabs. They fade from hue to hue.
+
+Written by Lars R. Damerow; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/boing.xml b/hacks/config/boing.xml
new file mode 100644
index 0000000..a36d1e2
--- /dev/null
+++ b/hacks/config/boing.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boing" _label="Boing" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=J3KAsV31d6M"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Size" _low-label="Tiny" _high-label="Huge"
+ low="0.02" high="0.9" default="0.5"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <vgroup>
+ <hgroup>
+ <number id="meridians" type="spinbutton" arg="-meridians %"
+ _label="Meridians" low="1" high="90" default="16"/>
+ <number id="parallels" type="spinbutton" arg="-parallels %"
+ _label="Parallels" low="1" high="90" default="8"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="smoothing" _label="Smoothing" arg-set="-smooth"/>
+ <boolean id="lighting" _label="Lighting" arg-set="-lighting"/>
+ <boolean id="scanlines" _label="Scanlines" arg-unset="-no-scanlines"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+A clone of the first graphics demo for the Amiga 1000, which was
+written by Dale Luck and RJ Mical during a break at the 1984 Consumer
+Electronics Show (or so the legend goes.)
+
+This looks like the original Amiga demo if you turn off "smoothing"
+and "lighting" and turn on "scanlines", and is somewhat more modern
+otherwise.
+
+https://en.wikipedia.org/wiki/Amiga#Boing_Ball
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bouboule.xml b/hacks/config/bouboule.xml
new file mode 100644
index 0000000..b28912e
--- /dev/null
+++ b/hacks/config/bouboule.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bouboule" _label="Bouboule">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=MdmIBmlkyFw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of spots" _low-label="Few" _high-label="Many"
+ low="1" high="400" default="100"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="3d" _label="Do Red/Blue 3D separation" arg-unset="-no-3d"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A deforming balloon with varying-sized spots painted on its invisible surface.
+
+Written by Jeremie Petit; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bouncingcow.xml b/hacks/config/bouncingcow.xml
new file mode 100644
index 0000000..0e3dfe5
--- /dev/null
+++ b/hacks/config/bouncingcow.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bouncingcow" _label="BouncingCow" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=O_b5UWhv49w"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Bounce speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of cows" _low-label="Moo" _high-label="Herd"
+ low="1" high="9" default="1"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Cow. A Trampoline. Together, they fight crime.
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/boxed.xml b/hacks/config/boxed.xml
new file mode 100644
index 0000000..b2926f0
--- /dev/null
+++ b/hacks/config/boxed.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boxed" _label="Boxed" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=CU4QFtZm9So"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="15000"
+ convert="invert"/>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="4.0" default="0.5"/>
+
+ <number id="balls" type="slider" arg="-balls %"
+ _label="Number of balls" _low-label="Few" _high-label="Lots"
+ low="3" high="40" default="20"/>
+
+ <number id="ballsize" type="slider" arg="-ballsize %"
+ _label="Ball size" _low-label="Tiny" _high-label="Huge"
+ low="1.0" high="5.0" default="3.0"/>
+
+ </vgroup>
+
+ <vgroup>
+
+ <number id="explosion" type="slider" arg="-explosion %"
+ _label="Explosion force" _low-label="Popcorn" _high-label="Nuke"
+ low="1.0" high="50.0" default="15.0"/>
+
+ <number id="decay" type="slider" arg="-decay %"
+ _label="Explosion decay" _low-label="Linger" _high-label="Pop!"
+ low="0.0" high="1.0" default="0.07"/>
+
+ <number id="momentum" type="slider" arg="-momentum %"
+ _label="Explosion momentum" _low-label="None" _high-label="Full"
+ low="0.0" high="1.0" default="0.6"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+
+ </vgroup>
+ </hgroup>
+
+
+ <xscreensaver-updater />
+
+ <_description>
+A box full of 3D bouncing balls that explode.
+
+Written by Sander van Grieken; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/boxfit.xml b/hacks/config/boxfit.xml
new file mode 100644
index 0000000..a297e13
--- /dev/null
+++ b/hacks/config/boxfit.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boxfit" _label="BoxFit">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8GkcbBbcwBk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Boxes" low="1" high="1000" default="50"/>
+
+ <number id="growby" type="spinbutton" arg="-growby %"
+ _label="Grow by" low="1" high="10" default="1"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="spacing" type="spinbutton" arg="-spacing %"
+ _label="Spacing" low="1" high="10" default="1"/>
+
+ <number id="border" type="spinbutton" arg="-border %"
+ _label="Border" low="1" high="10" default="1"/>
+ </hgroup>
+
+ <hgroup>
+ <select id="mode">
+ <option id="random" _label="Boxes or circles"/>
+ <option id="boxes" _label="Boxes only" arg-set="-mode squares"/>
+ <option id="circles" _label="Circles only" arg-set="-mode circles"/>
+ </select>
+
+ <select id="mode2">
+ <option id="gradient" _label="Color gradient"/>
+ <option id="image" _label="Grab images" arg-set="-grab"/>
+ </select>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-image />
+
+ <boolean id="peek" _label="Peek at underlying images" arg-set="-peek"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Packs the screen with growing squares or circles, colored according to
+a horizontal or vertical gradient, or according to the colors of a
+loaded image. The objects grow until they touch, then stop. When the
+screen is full, they shrink away and the process restarts.
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/braid.xml b/hacks/config/braid.xml
new file mode 100644
index 0000000..b49fa22
--- /dev/null
+++ b/hacks/config/braid.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="braid" _label="Braid">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PUhJq56ViGM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="1000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="500" default="100"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of rings" low="3" high="15" default="15"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Line thickness" low="-20" high="20" default="-7"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Inter-braided concentric circles.
+
+Written by John Neil; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bsod.xml b/hacks/config/bsod.xml
new file mode 100644
index 0000000..ef18e21
--- /dev/null
+++ b/hacks/config/bsod.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bsod" _label="BSOD">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=YIqbMCfR3r0"/>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
+ low="5" high="120" default="45"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="windows" _label="Windows 3.1" arg-unset="-no-windows"/>
+ <boolean id="nt" _label="Windows NT" arg-unset="-no-nt"/>
+ <boolean id="2k" _label="Windows 2000 " arg-unset="-no-2k"/>
+ <boolean id="win10" _label="Windows 10 " arg-unset="-no-win10"/>
+ <boolean id="msdos" _label="MS-DOS" arg-unset="-no-msdos"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="amiga" _label="AmigaDOS" arg-unset="-no-amiga"/>
+ <boolean id="glados" _label="GLaDOS" arg-unset="-no-glados"/>
+ <boolean id="android" _label="Android" arg-unset="-no-android"/>
+ <boolean id="apple2" _label="Apple ][" arg-unset="-no-apple2"/>
+ <boolean id="ransomware" _label="Ransomware" arg-unset="-no-ransomware"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="nvidia" _label="NVidia" arg-unset="-no-nvidia"/>
+ <boolean id="os2" _label="OS/2" arg-unset="-no-os2"/>
+ <boolean id="mac" _label="Sad Mac" arg-unset="-no-mac"/>
+ <boolean id="mac1" _label="Mac bomb" arg-unset="-no-mac1"/>
+ <boolean id="vmware" _label="VMware" arg-unset="-no-vmware"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="macsbug" _label="MacsBug" arg-unset="-no-macsbug"/>
+ <boolean id="atari" _label="Atari" arg-set="-atari"/>
+ <boolean id="macx" _label="MacOS X" arg-unset="-no-macx"/>
+ <boolean id="os390" _label="OS/390" arg-unset="-no-os390"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="vms" _label="VMS" arg-unset="-no-vms"/>
+ <boolean id="hvx" _label="HVX/GCOS6" arg-unset="-no-hvx"/>
+ <boolean id="blitdamage" _label="NCD X Terminal " arg-unset="-no-blitdamage"/>
+ <boolean id="atm" _label="ATM" arg-unset="-no-atm"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="bsd" _label="BSD" arg-set="-bsd"/>
+ <boolean id="linux" _label="Linux (fsck)" arg-unset="-no-linux"/>
+ <boolean id="sparclinux" _label="Linux (sparc)" arg-set="-sparclinux"/>
+ <boolean id="hppalinux" _label="Linux (hppa)" arg-unset="-no-hppalinux"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="solaris" _label="Solaris" arg-unset="-no-solaris"/>
+ <boolean id="sco" _label="SCO" arg-unset="-no-sco"/>
+ <boolean id="hpux" _label="HPUX" arg-unset="-no-hpux"/>
+ <boolean id="tru64" _label="Tru64" arg-unset="-no-tru64"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ <xscreensaver-updater />
+ </hgroup>
+
+<!--
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+-->
+
+ <_description>
+BSOD stands for "Blue Screen of Death". The finest in personal
+computer emulation, BSOD simulates popular screen savers from a
+number of less robust operating systems.
+
+https://en.wikipedia.org/wiki/Blue_Screen_of_Death
+https://en.wikipedia.org/wiki/Screen_of_death
+https://en.wikipedia.org/wiki/Guru_Meditation
+https://en.wikipedia.org/wiki/Row_of_Bombs
+https://en.wikipedia.org/wiki/Bomb_%28symbol%29
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bubble3d.xml b/hacks/config/bubble3d.xml
new file mode 100644
index 0000000..985c394
--- /dev/null
+++ b/hacks/config/bubble3d.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bubble3d" _label="Bubble3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=4vcj8sq9FO8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="transp" _label="Transparent bubbles" arg-unset="-no-transparent"/>
+ <select id="bubblecolor">
+ <option id="random" _label="Random" />
+ <option id="Red" _label="Amber" arg-set="-color #FF0000" />
+ <option id="Green" _label="Green" arg-set="-color #00FF00" />
+ <option id="Blue" _label="Blue" arg-set="-color #0000FF" />
+ <option id="white" _label="White" arg-set="-color #FFFFFF" />
+ </select>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+
+ <_description>
+Rising, undulating 3D bubbles, with transparency and specular reflections.
+
+Written by Richard Jones; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bubbles.xml b/hacks/config/bubbles.xml
new file mode 100644
index 0000000..86cb132
--- /dev/null
+++ b/hacks/config/bubbles.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bubbles" _label="Bubbles">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Mli1TjZY1YA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="simple" _label="Draw circles instead of bubble images"
+ arg-set="-simple"/>
+
+ <boolean id="broken" _label="Don't hide bubbles when they pop"
+ arg-set="-broken"/>
+
+ <boolean id="trails" _label="Leave trails" arg-set="-trails"/>
+
+ <select id="gravity">
+ <option id="rise" _label="Bubbles rise" arg-set="-mode rise"/>
+ <option id="float" _label="Bubbles float"/>
+ <option id="drop" _label="Bubbles fall" arg-set="-mode drop"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+This simulates the kind of bubble formation that happens when water
+boils: small bubbles appear, and as they get closer to each other,
+they combine to form larger bubbles, which eventually pop.
+
+Written by James Macnicol; 1996.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bumps.xml b/hacks/config/bumps.xml
new file mode 100644
index 0000000..78ee969
--- /dev/null
+++ b/hacks/config/bumps.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bumps" _label="Bumps">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IV7D-NYRCiU"/>
+
+ <!-- #### -degrees [360] -->
+ <!-- #### -color [random] -->
+ <!-- #### -colorcount [64] -->
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <!-- #### -soften [1] -->
+ <!-- #### -invert -->
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A spotlight roams across an embossed version of a loaded image.
+
+Written by Shane Smit; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cage.xml b/hacks/config/cage.xml
new file mode 100644
index 0000000..6ede618
--- /dev/null
+++ b/hacks/config/cage.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cage" _label="Cage" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=BxGHUFvI2Zo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Escher's "Impossible Cage", a 3d analog of a moebius
+strip, and rotates it in three dimensions.
+
+https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
+
+Written by Marcelo Vianna; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/carousel.xml b/hacks/config/carousel.xml
new file mode 100644
index 0000000..6f9a79f
--- /dev/null
+++ b/hacks/config/carousel.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="carousel" _label="Carousel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IyqWkGVrFIY"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Time until loading a new image"
+ _low-label="5 seconds" _high-label="1 minute"
+ low="5" high="60" default="20"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of images" low="1" high="20" default="7"/>
+
+ <select id="mode">
+ <option id="tiltxy" _label="Tilt in/out and left/right"/>
+ <option id="tiltx" _label="Tilt in/out only" arg-set="-tilt x"/>
+ <option id="tilty" _label="Tilt left/right only" arg-set="-tilt y"/>
+ <option id="notilt" _label="No tilting" arg-set="-tilt 0"/>
+ </select>
+
+ <boolean id="zoom" _label="Zoom in/out" arg-unset="-no-zoom"/>
+ <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Loads several random images, and displays them flying in a circular
+formation. The formation changes speed and direction randomly, and
+images periodically drop out to be replaced by new ones.
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/ccurve.xml b/hacks/config/ccurve.xml
new file mode 100644
index 0000000..e15138f
--- /dev/null
+++ b/hacks/config/ccurve.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ccurve" _label="CCurve">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=zqIlWzUHOz8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Change image every" _low-label="0 seconds" _high-label="30 seconds"
+ low="0" high="30" default="3"/>
+
+ <number id="pause" type="slider" arg="-pause %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="5.0" default="0.4" convert="invert"/>
+
+ <number id="limit" type="slider" arg="-limit %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="3" high="300000" default="200000"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates self-similar linear fractals, including the classic "C Curve".
+
+https://en.wikipedia.org/wiki/Levy_C_curve
+
+Written by Rick Campbell; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/celtic.xml b/hacks/config/celtic.xml
new file mode 100644
index 0000000..f84d12b
--- /dev/null
+++ b/hacks/config/celtic.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="celtic" _label="Celtic">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PnX60AAoTdw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="0" high="10" default="5"/>
+
+ <boolean id="graph" _label="Draw graph" arg-set="-graph"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Repeatedly draws random Celtic cross-stitch patterns.
+
+https://en.wikipedia.org/wiki/Celtic_knot
+https://en.wikipedia.org/wiki/Knots_and_graphs
+
+Written by Max Froumentin; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/circuit.xml b/hacks/config/circuit.xml
new file mode 100644
index 0000000..0605002
--- /dev/null
+++ b/hacks/config/circuit.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="circuit" _label="Circuit" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=tfqR1j1OQs8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-parts %"
+ _label="Parts" _low-label="One" _high-label="Lots"
+ low="1" high="30" default="10"/>
+
+ <number id="speed" type="slider" arg="-rotate-speed %"
+ _label="Rotation speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="100" default="1"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+
+ <select id="render">
+ <option id="flat" _label="Flat coloring" arg-set="-no-light"/>
+ <option id="light" _label="Directional lighting"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Electronic components float around.
+
+Written by Ben Buxton; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cityflow.xml b/hacks/config/cityflow.xml
new file mode 100644
index 0000000..61f67d9
--- /dev/null
+++ b/hacks/config/cityflow.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cityflow" _label="Cityflow" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=LJMtu-9T3U0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Boxes" _low-label="Few" _high-label="Many"
+ low="50" high="4000" default="800"/>
+
+ <number id="skew" type="slider" arg="-skew %"
+ _label="Skew"
+ _low-label="Low" _high-label="High"
+ low="0" high="45" default="12"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="wave-speed" type="slider" arg="-wave-speed %"
+ _label="Wave speed" _low-label="Slow" _high-label="Fast"
+ low="5" high="150" default="25"/>
+
+ <number id="wave-radius" type="slider" arg="-wave-radius %"
+ _label="Wave overlap"
+ _low-label="Small" _high-label="Large"
+ low="5" high="512" default="256"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Wave complexity"
+ _low-label="Low" _high-label="High"
+ low="1" high="20" default="6"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </hgroup>
+
+ <_description>
+Waves move across a sea of boxes. The city swells. The walls are closing in.
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cloudlife.xml b/hacks/config/cloudlife.xml
new file mode 100644
index 0000000..767a8ea
--- /dev/null
+++ b/hacks/config/cloudlife.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cloudlife" _label="CloudLife">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TkVDO3nTTsE"/>
+
+ <number id="delay" type="slider" arg="-cycle-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <number id="maxage" type="slider" arg="-max-age %"
+ _label="Max age" _low-label="Young" _high-label="Old"
+ low="2" high="255" default="64"/>
+
+ <number id="density" type="slider" arg="-initial-density %"
+ _label="Initial density" _low-label="Low" _high-label="High"
+ low="1" high="99" default="30"/>
+
+ <number id="cellsize" type="slider" arg="-cell-size %"
+ _label="Cell size" _low-label="Small" _high-label="Large"
+ low="1" high="20" default="3"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Generates cloud-like formations based on a variant of Conway's Life. The
+difference is that cells have a maximum age, after which they count as
+3 for populating the next generation. This makes long-lived formations
+explode instead of just sitting there.
+
+https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
+
+Written by Don Marti; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/companioncube.xml b/hacks/config/companioncube.xml
new file mode 100644
index 0000000..128edc5
--- /dev/null
+++ b/hacks/config/companioncube.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="companioncube" _label="CompanionCube" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Q54NVuxhGso"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Bounce" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of cubes" _low-label="1" _high-label="20"
+ low="1" high="20" default="3"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="spin" _label="Spin" arg-set="-spin"/>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The symptoms most commonly produced by Enrichment Center testing are
+superstition, perceiving inanimate objects as alive, and hallucinations.
+The Enrichment Center reminds you that the weighted companion cube will
+never threaten to stab you and, in fact, cannot speak. In the event that
+the Weighted Companion Cube does speak, the Enrichment Center urges you to
+disregard its advice.
+
+https://en.wikipedia.org/wiki/Portal_%28video_game%29
+
+Written by Jamie Zawinski; 2011.
+ </_description>
+</screensaver>
diff --git a/hacks/config/compass.xml b/hacks/config/compass.xml
new file mode 100644
index 0000000..83e0c83
--- /dev/null
+++ b/hacks/config/compass.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="compass" _label="Compass">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IssDEcgB550"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A compass, with all elements spinning about randomly, for
+that "lost and nauseous" feeling.
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/coral.xml b/hacks/config/coral.xml
new file mode 100644
index 0000000..c722ea5
--- /dev/null
+++ b/hacks/config/coral.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="coral" _label="Coral">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=3WTSvzJcQhw"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="1" high="500000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1" high="90" default="25"
+ convert="invert"/>
+
+ <number id="seeds" type="slider" arg="-seeds %"
+ _label="Seeds" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="20"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates coral growth, albeit somewhat slowly.
+
+Written by Frederick Roeber; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/crackberg.xml b/hacks/config/crackberg.xml
new file mode 100644
index 0000000..dacf279
--- /dev/null
+++ b/hacks/config/crackberg.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="crackberg" _label="Crackberg" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ej1No4EK8Rc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="visibility" type="slider" arg="-visibility %"
+ _label="Visibility" _low-label="Mouse hole" _high-label="Eagle nest"
+ low="0.2" high="1.0" default="0.6" />
+ <number id="nsubdivs" type="slider" arg="-nsubdivs %"
+ _label="Subdivisions" _low-label="Few" _high-label="Hurt me"
+ low="2" high="9" default="4" />
+
+ <hgroup>
+ <vgroup>
+ <boolean id="flat" _label="Flat shading" arg-unset="-no-flat"/>
+ <boolean id="lit" _label="Lighting" arg-unset="-no-lit"/>
+ <boolean id="water" _label="Water" arg-unset="-no-water"/>
+ <boolean id="crack" _label="Confused" arg-unset="-no-crack"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="boring" _label="Immediate" arg-set="-boring"/>
+ <boolean id="letter" _label="Letterbox" arg-set="-letterbox"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <select id="color">
+ <option id="random" _label="Random coloration"/>
+ <option id="plain" _label="Earthy coloration" arg-set="-color plain"/>
+ <option id="ice" _label="Icy coloration" arg-set="-color ice"/>
+ <option id="magma" _label="Swampy coloration" arg-set="-color magma"/>
+ <option id="vomit" _label="Vomitous coloration" arg-set="-color vomit"/>
+ </select>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flies through height maps, optionally animating the creation and
+destruction of generated tiles; tiles `grow' into place.
+
+Written by Matus Telgarsky; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/critical.xml b/hacks/config/critical.xml
new file mode 100644
index 0000000..399c569
--- /dev/null
+++ b/hacks/config/critical.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="critical" _label="Critical">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=HN2ykbM2cTk"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="3" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws a system of self-organizing lines. It starts out as random
+squiggles, but after a few iterations, order begins to appear.
+
+Written by Martin Pool; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/crumbler.xml b/hacks/config/crumbler.xml
new file mode 100644
index 0000000..57b1bd6
--- /dev/null
+++ b/hacks/config/crumbler.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="crumbler" _label="Crumbler" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=oERz1IPluYQ"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Polygons" _low-label="Few" _high-label="Many"
+ low="0.2" high="5.0" default="1.0"/>
+
+ <number id="fracture" type="slider" arg="-fracture %"
+ _label="Fractures" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="0"/>
+ </vgroup>
+
+ <vgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Randomly subdivides a ball into voronoi chunks, then further subdivides
+one of the remaining pieces.
+
+https://en.wikipedia.org/wiki/Voronoi_diagram
+https://en.wikipedia.org/wiki/Convex_hull
+https://en.wikipedia.org/wiki/Quickhull
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/crystal.xml b/hacks/config/crystal.xml
new file mode 100644
index 0000000..ab1f1dd
--- /dev/null
+++ b/hacks/config/crystal.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="crystal" _label="Crystal">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=M27wWKGXIvw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="60000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <!-- #### -maxsize -->
+ <!-- #### -shift (color cycling) -->
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of crystals" low="-5000" high="5000" default="-500"/>
+
+ <number id="nx" type="spinbutton" arg="-nx %"
+ _label="Horizontal symmetries" low="-10" high="10" default="-3"/>
+
+ <number id="ny" type="spinbutton" arg="-ny %"
+ _label="Vertical symmetries" low="-10" high="10" default="-3"/>
+
+ <hgroup>
+ <boolean id="grid" _label="Draw grid" arg-set="-grid"/>
+ <boolean id="cells" _label="Draw cell" arg-unset="-no-cell"/>
+ <boolean id="centre" _label="Center on screen" arg-set="-centre"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Moving polygons, similar to a kaleidoscope. See also the
+"Kaleidescope" and "GLeidescope" screen savers.
+
+https://en.wikipedia.org/wiki/Kaleidoscope
+
+Written by Jouk Jansen; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml
new file mode 100644
index 0000000..f16d7fd
--- /dev/null
+++ b/hacks/config/cube21.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cube21" _label="Cube21" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AFtxL6--lTQ"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="cubesize" type="slider" arg="-cubesize %"
+ _label="Cube size" _low-label="Small" _high-label="Large"
+ low="0.4" high="1.0" default="0.7"/>
+
+ <number id="rotspeed" type="slider" arg="-rotspeed %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="1.0" high="10.0" default="3.0"/>
+
+ <select id="start">
+ <option id="cube" _label="Start as cube" arg-set="-no-randomize"/>
+ <option id="shuffle" _label="Start as random shape"/>
+ </select>
+
+ <select id="colors">
+ <option id="white" _label="White" arg-set="-colormode white"/>
+ <option id="one" _label="Random color" arg-set="-colormode rnd"/>
+ <option id="se" _label="Silver edition" arg-set="-colormode se"/>
+ <option id="two" _label="Two random colors" arg-set="-colormode two"/>
+ <option id="ce" _label="Classic edition" arg-set="-colormode ce"/>
+ <option id="six" _label="Six random colors"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="spinspeed" type="slider" arg="-spinspeed %"
+ _label="Spin" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="4.0" default="1.0"/>
+
+ <number id="wanderspeed" type="slider" arg="-wanderspeed %"
+ _label="Wander" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="0.1" default="0.02"/>
+
+ <number id="wait" type="slider" arg="-wait %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="10.0" high="100.0" default="40.0"/>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="tex" _label="Outlines" arg-unset="-no-texture"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The "Cube 21" Rubik-like puzzle, also known as "Square-1".
+The rotations are chosen randomly. See also the "Rubik",
+"RubikBlocks" and "GLSnake" screen savers.
+
+https://en.wikipedia.org/wiki/Square_One_%28puzzle%29
+
+Written by Vasek Potocek; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubenetic.xml b/hacks/config/cubenetic.xml
new file mode 100644
index 0000000..3907214
--- /dev/null
+++ b/hacks/config/cubenetic.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubenetic" _label="Cubenetic" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aElbM0rZZNg"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Boxes" _low-label="Few" _high-label="Many"
+ low="1" high="20" default="5"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <number id="wave-speed" type="slider" arg="-wave-speed %"
+ _label="Surface pattern speed" _low-label="Slow" _high-label="Fast"
+ low="5" high="150" default="80"/>
+
+ <number id="wave-radius" type="slider" arg="-wave-radius %"
+ _label="Surface pattern overlap"
+ _low-label="Small" _high-label="Large"
+ low="5" high="600" default="512"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Surface pattern complexity"
+ _low-label="Low" _high-label="High"
+ low="1" high="20" default="3"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A cubist Lavalite, sort of. A pulsating set of overlapping boxes with
+ever-changing blobby patterns undulating across their surfaces.
+
+Written by Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubestack.xml b/hacks/config/cubestack.xml
new file mode 100644
index 0000000..68c550e
--- /dev/null
+++ b/hacks/config/cubestack.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubestack" _label="CubeStack" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rZi5yav6sRo"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.0" high="0.5" default="0.13"/>
+
+ <number id="opacity" type="slider" arg="-opacity %"
+ _label="Opacity" _low-label="Transparent" _high-label="Opaque"
+ low="0.01" high="1.0" default="0.7"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An endless stack of unfolding, translucent cubes.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubestorm.xml b/hacks/config/cubestorm.xml
new file mode 100644
index 0000000..533d710
--- /dev/null
+++ b/hacks/config/cubestorm.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubestorm" _label="CubeStorm" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=enuZbkMiqCE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Cubes" _low-label="Few" _high-label="Many"
+ low="1" high="20" default="4"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="length" type="slider" arg="-length %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="20" high="1000" default="200"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Struts" _low-label="Thin" _high-label="Thick"
+ low="0.01" high="1.0" default="0.06"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Boxes change shape and intersect each other, filling space.
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubetwist.xml b/hacks/config/cubetwist.xml
new file mode 100644
index 0000000..00f54b8
--- /dev/null
+++ b/hacks/config/cubetwist.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubetwist" _label="CubeTwist" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RjrtUtMEa_4"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.0" high="0.5" default="0.0"/>
+
+ <number id="displacement" type="slider" arg="-displacement %"
+ _label="Displacement" _low-label="Tight" _high-label="Wide"
+ low="0.0" high="0.5" default="0.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="flat" _label="Flat shading" arg-unset="-no-flat"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A series of nested cubes rotate and slide recursively.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubicgrid.xml b/hacks/config/cubicgrid.xml
new file mode 100644
index 0000000..b8a90a8
--- /dev/null
+++ b/hacks/config/cubicgrid.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubicgrid" _label="CubicGrid" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=nOTi7gy9l-I"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.2" high="10.0" default="1.0"/>
+
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Dot spacing" _low-label="Close" _high-label="Far"
+ low="15" high="100" default="20"/>
+
+ <boolean id="bigdots" _label="Big dots" arg-unset="-no-bigdots"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A rotating lattice of colored points.
+
+Written by Vasek Potocek; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cwaves.xml b/hacks/config/cwaves.xml
new file mode 100644
index 0000000..b18f365
--- /dev/null
+++ b/hacks/config/cwaves.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cwaves" _label="CWaves">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=yOuJqiDUrpY"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Complexity" _low-label="Low" _high-label="High"
+ low="1" high="100" default="15"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Color transitions" _low-label="Rough" _high-label="Smooth"
+ low="2" high="1000" default="600"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A field of sinusoidal colors languidly scrolls. It's relaxing.
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cynosure.xml b/hacks/config/cynosure.xml
new file mode 100644
index 0000000..c81130d
--- /dev/null
+++ b/hacks/config/cynosure.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cynosure" _label="Cynosure">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=If7FOc8UnYs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="1000000" default="500000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="128"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="200" default="100"/>
+
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Random dropshadowed rectangles pop onto the screen in lockstep.
+
+Written by Ozymandias G. Desiderata, Jamie Zawinski, and Stephen Linhart; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/dangerball.xml b/hacks/config/dangerball.xml
new file mode 100644
index 0000000..12bbac5
--- /dev/null
+++ b/hacks/config/dangerball.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="dangerball" _label="DangerBall" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QU0aPwWwHbg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="spikespeed" type="slider" arg="-speed %"
+ _label="Spike growth" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="0.25" default="0.05"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of spikes" _low-label="Few" _high-label="Ouch"
+ low="1" high="100" default="30"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A spiky ball. Ouch!
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/decayscreen.xml b/hacks/config/decayscreen.xml
new file mode 100644
index 0000000..93d85b3
--- /dev/null
+++ b/hacks/config/decayscreen.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="decayscreen" _label="DecayScreen">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dFlyRTObuDo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <select id="mode">
+ <option id="random" _label="Random melt style"/>
+ <option id="random" _label="Shuffle melt" arg-set="-mode shuffle"/>
+ <option id="random" _label="Melt up" arg-set="-mode up"/>
+ <option id="random" _label="Melt down" arg-set="-mode down"/>
+ <option id="random" _label="Melt left" arg-set="-mode left"/>
+ <option id="random" _label="Melt right" arg-set="-mode right"/>
+ <option id="random" _label="Melt up, left" arg-set="-mode upleft"/>
+ <option id="random" _label="Melt up, right" arg-set="-mode upright"/>
+ <option id="random" _label="Melt down, left" arg-set="-mode downleft"/>
+ <option id="random" _label="Melt down, right" arg-set="-mode downright"/>
+ <option id="random" _label="Melt towards center" arg-set="-mode in"/>
+ <option id="random" _label="Melt away from center" arg-set="-mode out"/>
+ <option id="random" _label="Melty melt" arg-set="-mode melt"/>
+ <option id="random" _label="Stretchy melt" arg-set="-mode stretch"/>
+ <option id="random" _label="Fuzzy melt" arg-set="-mode fuzz"/>
+ </select>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Melts an image in various ways. Warning, if the effect continues after
+the screen saver is off, seek medical attention.
+
+Written by David Wald, Vivek Khera, Jamie Zawinski, and Vince Levey; 1993.
+ </_description>
+</screensaver>
diff --git a/hacks/config/deco.xml b/hacks/config/deco.xml
new file mode 100644
index 0000000..b5347cf
--- /dev/null
+++ b/hacks/config/deco.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="deco" _label="Deco">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=kfdDTv07Nhw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="minwidth" type="spinbutton" arg="-min-width %"
+ _label="Minimum width" low="1" high="100" default="20"/>
+
+ <number id="minheight" type="spinbutton" arg="-min-height %"
+ _label="Minimum height" low="1" high="100" default="20"/>
+
+ <number id="maxdepth" type="spinbutton" arg="-max-depth %"
+ _label="Maximum depth" low="1" high="40" default="12"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="smooth-colors" _label="Smooth colors" arg-set="-smooth-colors"/>
+ <boolean id="golden-ratio" _label="Golden ratio" arg-set="-golden-ratio"/>
+ <boolean id="mondrian" _label="Mondrian" arg-set="-mondrian"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Subdivides and colors rectangles randomly, for a Mondrian-esque effect.
+
+https://en.wikipedia.org/wiki/Piet_Mondrian#Paris_1919.E2.80.931938
+
+Written by Jamie Zawinski and Michael Bayne; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/deluxe.xml b/hacks/config/deluxe.xml
new file mode 100644
index 0000000..0cd4746
--- /dev/null
+++ b/hacks/config/deluxe.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="deluxe" _label="Deluxe">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2CsKEVR3ecs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="50000" default="10000"
+ convert="invert"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Lines" _low-label="Thin" _high-label="Thick"
+ low="1" high="150" default="50"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Shapes" _low-label="1" _high-label="20"
+ low="1" high="20" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="20"/>
+
+ <!-- #### -speed [15] -->
+
+ <boolean id="transparent" _label="Transparency" arg-unset="-no-transparent"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Pulsing stars, circles, and lines.
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/demon.xml b/hacks/config/demon.xml
new file mode 100644
index 0000000..bd78bf1
--- /dev/null
+++ b/hacks/config/demon.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="demon" _label="Demon">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=OhHI-pIHddA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="States" _low-label="0" _high-label="20"
+ low="0" high="20" default="0"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Cell size" low="-40" high="40" default="-30"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A cellular automaton that starts with a random field, and organizes
+it into stripes and spirals.
+
+https://en.wikipedia.org/wiki/Maxwell%27s_demon
+
+Written by David Bagley; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/discoball.xml b/hacks/config/discoball.xml
new file mode 100644
index 0000000..61ed94c
--- /dev/null
+++ b/hacks/config/discoball.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="discoball" _label="Discoball" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8yd4PYJQrMw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Size" _low-label="Small" _high-label="Large"
+ low="10" high="100" default="30"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-set="-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A dusty, dented disco ball. Woop woop.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/discrete.xml b/hacks/config/discrete.xml
new file mode 100644
index 0000000..01c7d4f
--- /dev/null
+++ b/hacks/config/discrete.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="discrete" _label="Discrete">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=l-yIY8vRlHA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="100" high="10000" default="2500"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Discrete map fractal systems, including variants of Hopalong, Julia,
+and others.
+
+Written by Tim Auckland; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/distort.xml b/hacks/config/distort.xml
new file mode 100644
index 0000000..ab06ae1
--- /dev/null
+++ b/hacks/config/distort.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="distort" _label="Distort">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ENaG3gwtukM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="20000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <!-- #### -speed [0] -->
+ <!-- #### -slow -->
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Lens size" _low-label="Small" _high-label="Large"
+ low="0" high="1000" default="0"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-number %"
+ _label="Lens count" low="0" high="10" default="0"/>
+
+ <select id="effect">
+ <option id="normal" _label="Normal"/>
+ <option id="swamp" _label="Swamp thing" arg-set="-effect swamp"/>
+ <option id="bounce" _label="Bounce" arg-set="-effect bounce"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="reflect" _label="Reflect" arg-set="-reflect"/>
+ <boolean id="magnify" _label="Magnify" arg-set="-magnify"/>
+ <boolean id="blackhole" _label="Black hole" arg-set="-blackhole"/>
+ <boolean id="vortex" _label="Vortex" arg-set="-vortex"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Wandering lenses distort the screen image in various ways.
+
+Written by Jonas Munsin; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/dnalogo.xml b/hacks/config/dnalogo.xml
new file mode 100644
index 0000000..ac10f15
--- /dev/null
+++ b/hacks/config/dnalogo.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="dnalogo" _label="DNA Logo" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=B7I5A7E3SP0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame Rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="glyph" _label="DNA Lounge logo" arg-set="-mode helix"/>
+ <option id="pizza" _label="DNA Pizza logo" arg-set="-mode pizza"/>
+ <option id="both" _label="DNA Lounge and DNA Pizza logos"/>
+<!--<option id="codeword" _label="Codeword logo" arg-set="-mode codeword"/>-->
+ </select>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+DNA Lounge
+
+ Restaurant -- Bar -- Nightclub -- Cafe -- Est. 1985.
+
+ 375 Eleventh Street
+ San Francisco, CA
+ 94103
+
+Codeword
+
+ Restaurant -- Bar -- Nightclub -- Cafe -- Est. 2015.
+
+ 917 Folsom Street
+ San Francisco, CA
+ 94107
+
+ https://www.dnalounge.com/
+ http://www.dnapizza.com/
+ https://www.codeword-sf.com/
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/drift.xml b/hacks/config/drift.xml
new file mode 100644
index 0000000..9eda2b4
--- /dev/null
+++ b/hacks/config/drift.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="drift" _label="Drift">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=cppZgCh6U7I"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="200" default="30"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Drifting recursive fractal cosmic flames.
+
+Written by Scott Draves; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/dymaxionmap.xml b/hacks/config/dymaxionmap.xml
new file mode 100644
index 0000000..6f846c7
--- /dev/null
+++ b/hacks/config/dymaxionmap.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="dymaxionmap" _label="DymaxionMap" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=4LnO0UiccGs"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+
+ <hgroup>
+ <select id="map">
+ <option id="flat" _label="Flat map"/>
+ <option id="day" _label="Satellite map" arg-set="-image BUILTIN_SAT"/>
+ </select>
+
+ <!-- <file id="image" _label="Image file" arg="-image %"/> -->
+ </hgroup>
+
+ <number id="frames" type="slider" arg="-frames %"
+ _label="Day / night smoothness" _low-label="Low" _high-label="High"
+ low="24" high="1440" default="720"/>
+ </vgroup>
+ </hgroup>
+ <hgroup>
+
+ <vgroup>
+ <hgroup>
+ <boolean id="stars" _label="Stars" arg-unset="-no-stars"/>
+ <boolean id="grid" _label="Lat / Long" arg-unset="-no-grid"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Buckminster Fuller's map of the Earth projected onto the surface of
+an unfolded icosahedron. It depicts the Earth's continents as one
+island, or nearly contiguous land masses.
+
+This screen saver animates the progression of the dusk terminator across
+the flattened globe. It includes both satellite and flat-colored map
+imagery, and can load and convert other Equirectangular-projected maps.
+
+"Dymaxion Map" and "The Fuller Projection Map" are trademarks of
+The Buckminster Fuller Institute.
+
+The original Dymaxion Map image is copyright 1982 by
+The Buckminster Fuller Institute. (This program does not use their
+imagery, only similar trigonometry.)
+
+The Dymaxion Map was covered by now-expired US Patent 2,393,676
+(Richard Buckminster Fuller, 1946).
+
+https://en.wikipedia.org/wiki/Dymaxion_map
+https://en.wikipedia.org/wiki/Buckminster_Fuller
+https://en.wikipedia.org/wiki/List_of_map_projections
+https://en.wikipedia.org/wiki/Cahill%E2%80%93Keyes_projection
+https://en.wikipedia.org/wiki/Waterman_butterfly_projection
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/endgame.xml b/hacks/config/endgame.xml
new file mode 100644
index 0000000..88eac22
--- /dev/null
+++ b/hacks/config/endgame.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="endgame" _label="Endgame" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QfglC_lvUTA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="classic" _label="Low resolution chess pieces" arg-set="-classic"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Black slips out of three mating nets, but the fourth one holds him tight!
+A brilliant composition!
+
+See also the "Queens" screen saver.
+
+https://en.wikipedia.org/wiki/Chess_endgame
+
+Written by Blair Tennessy and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/energystream.xml b/hacks/config/energystream.xml
new file mode 100644
index 0000000..a3c034f
--- /dev/null
+++ b/hacks/config/energystream.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="energystream" _label="EnergyStream" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TbWZ6v5Zzk8"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-wander" />
+ <boolean id="spin" _label="Spin" arg-unset="-spin" />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A flow of particles which form an energy stream.
+
+Written by Eugene Sandulenko and Konrad "Yoghurt" Zagorowicz; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/engine.xml b/hacks/config/engine.xml
new file mode 100644
index 0000000..5c91d28
--- /dev/null
+++ b/hacks/config/engine.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="engine" _label="Engine" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8BL2o8QJmiA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <select id="engine">
+ <option id="random" _label="Random engine"/>
+ <option id="1" _label="Honda Insight (3 cylinders)" arg-set="-engine honda_insight"/>
+ <option id="2" _label="BMW M3 (4 cylinders)" arg-set="-engine bmw_m3"/>
+ <option id="3" _label="VW Beetle (4 cylinders, flat)" arg-set="-engine vw_beetle"/>
+ <option id="4" _label="Audi Quattro (5 cylinders)" arg-set="-engine audi_quattro"/>
+ <option id="5" _label="BMW M5 (6 cylinders)" arg-set="-engine bmw_m5"/>
+ <option id="6" _label="Subaru XT (6 cylinders, V)" arg-set="-engine subaru_xt"/>
+ <option id="7" _label="Porsche 911 (6 cylinders, flat)" arg-set="-engine porsche_911"/>
+ <option id="8" _label="Corvette Z06 (8 cylinders, V)" arg-set="-engine corvette_z06"/>
+ <option id="9" _label="Dodge Viper (10 cylinders, V)" arg-set="-engine dodge_viper"/>
+ <option id="10" _label="Jaguar XKE (12 cylinders, V)" arg-set="-engine jaguar_xke"/>
+ </select>
+
+ <boolean id="titles" _label="Show engine name" arg-set="-titles"/>
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-move"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ </hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Internal combusion engines.
+
+https://en.wikipedia.org/wiki/Internal_combustion_engine#Operation
+
+Written by Ben Buxton, Ed Beroset and Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/epicycle.xml b/hacks/config/epicycle.xml
new file mode 100644
index 0000000..0b56922
--- /dev/null
+++ b/hacks/config/epicycle.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="epicycle" _label="Epicycle">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rpk3zxQxaR8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <number id="holdtime" type="slider" arg="-holdtime %"
+ _label="Linger" _low-label="1 second" _high-label="30 seconds"
+ low="1" high="30" default="2"/>
+
+ <hgroup>
+ <number id="linewidth" type="spinbutton" arg="-linewidth %"
+ _label="Line thickness" low="1" high="50" default="4"/>
+
+ <number id="harmonics" type="spinbutton" arg="-harmonics %"
+ _label="Harmonics" low="1" high="20" default="8"/>
+ </hgroup>
+
+ <!-- #### -color0 [red] -->
+ <!-- #### -colours [100] -->
+ <!-- #### -foreground [white] -->
+ <!-- #### -min_circles [2] -->
+ <!-- #### -max_circles [10] -->
+ <!-- #### -min_speed [0.003] -->
+ <!-- #### -max_speed [0.005] -->
+ <!-- #### -timestep [1.0] -->
+ <!-- #### -divisor_poisson [0.4] -->
+ <!-- #### -size_factor_min [1.05] -->
+ <!-- #### -size_factor_max [2.05] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A pre-heliocentric model of planetary motion.
+
+This draws the path traced out by a point on the edge of a
+circle. That circle rotates around a point on the rim of another
+circle, and so on, several times.
+
+https://en.wikipedia.org/wiki/Deferent_and_epicycle
+
+Written by James Youngman; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/eruption.xml b/hacks/config/eruption.xml
new file mode 100644
index 0000000..da778fe
--- /dev/null
+++ b/hacks/config/eruption.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="eruption" _label="Eruption">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=CQ6jDBnumT8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Few" _high-label="Many"
+ low="16" high="256" default="256"/>
+
+ <number id="nparticles" type="slider" arg="-particles %"
+ _label="Number of particles" _low-label="Little" _high-label="Many"
+ low="100" high="2000" default="300"/>
+
+ <number id="cooloff" type="slider" arg="-cooloff %"
+ _label="Cooling factor" _low-label="Slow" _high-label="Fast"
+ low="0" high="10" default="2"/>
+ </vgroup>
+ <vgroup>
+ <number id="heat" type="slider" arg="-heat %"
+ _label="Heat" _low-label="Pleasant" _high-label="Inferno"
+ low="64" high="256" default="256"/>
+
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label="Negative" _high-label="Positive"
+ low="-5" high="5" default="1"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="10" high="3000" default="80"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Exploding fireworks. See also the "Fireworkx", "XFlame" and "Pyro"
+screen savers.
+
+Written by W.P. van Paassen; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/esper.xml b/hacks/config/esper.xml
new file mode 100644
index 0000000..e91bb51
--- /dev/null
+++ b/hacks/config/esper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="esper" _label="Esper" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_er7xZd7zUU"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.2" high="20" default="1.0"/>
+
+ </vgroup>
+ <vgroup>
+
+ <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+"Enhance 224 to 176. Pull out track right. Center in pull back. Pull
+back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left.
+Gimme a hardcopy right there."
+
+The Esper Machine was a voice-controlled forensic device used by LAPD
+in 2019, as documented in the 1982 film, Blade Runner. It was capable
+of enhancing photographs to an extreme degree, including reconstructing
+different viewpoints within the space from the reflections on various
+objects in the photograph.
+
+Written by Jamie Zawinski; 2017.
+ </_description>
+</screensaver>
diff --git a/hacks/config/euler2d.xml b/hacks/config/euler2d.xml
new file mode 100644
index 0000000..31222e6
--- /dev/null
+++ b/hacks/config/euler2d.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="euler2d" _label="Euler2D">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ZH1ZtfId0iA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Particles" _low-label="Few" _high-label="Many"
+ low="2" high="5000" default="1024"/>
+
+ <number id="eulertail" type="slider" arg="-eulertail %"
+ _label="Trail length" _low-label="Short" _high-label="Long"
+ low="2" high="500" default="10"/>
+ </vgroup>
+
+ <vgroup>
+ <!--
+ <number id="eulerpower" type="slider" arg="-eulerpower %"
+ _label="Power" _low-label="Low" _high-label="High"
+ low="0.5" high="3.0" default="1.0"/>
+ -->
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="100" high="5000" default="3000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+
+ <_description>
+Simulates two dimensional incompressible inviscid fluid flow.
+
+https://en.wikipedia.org/wiki/Euler_equations_%28fluid_dynamics%29
+https://en.wikipedia.org/wiki/Inviscid_flow
+
+Written by Stephen Montgomery-Smith; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/extrusion.xml b/hacks/config/extrusion.xml
new file mode 100644
index 0000000..97c26a8
--- /dev/null
+++ b/hacks/config/extrusion.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="extrusion" _label="Extrusion" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=eKYmqL7ndGs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="random" _label="Random object"/>
+ <option id="helix2" _label="Helix 2" arg-set="-name helix2"/>
+ <option id="helix3" _label="Helix 3" arg-set="-name helix3"/>
+ <option id="helix4" _label="Helix 4" arg-set="-name helix4"/>
+ <option id="joinoffset" _label="Join offset" arg-set="-name joinoffset"/>
+ <option id="screw" _label="Screw" arg-set="-name screw"/>
+ <option id="taper" _label="Taper" arg-set="-name taper"/>
+ <option id="twist" _label="Twistoid" arg-set="-name twistoid"/>
+ </select>
+
+ <select id="render">
+ <option id="flat" _label="Use flat coloring" arg-set="-no-light"/>
+ <option id="light" _label="Use lighting"/>
+ </select>
+
+ <!-- #### -texture -->
+ <!-- #### -texture_quality -->
+ <!-- #### -mipmap -->
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Various extruded shapes twist and turn inside out.
+
+Written by Linas Vepstas, David Konerding, and Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fadeplot.xml b/hacks/config/fadeplot.xml
new file mode 100644
index 0000000..a977c2b
--- /dev/null
+++ b/hacks/config/fadeplot.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fadeplot" _label="FadePlot">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Cev034v37JM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0" high="30" default="10"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Cycles" _low-label="Small" _high-label="Large"
+ low="0" high="10000" default="1500"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A waving ribbon follows a sinusoidal path.
+
+Written by Bas van Gaalen and Charles Vidal; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fiberlamp.xml b/hacks/config/fiberlamp.xml
new file mode 100644
index 0000000..b07e863
--- /dev/null
+++ b/hacks/config/fiberlamp.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fiberlamp" _label="Fiberlamp">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PvYKJ-vkxE0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Fibers" _low-label="Few" _high-label="Many"
+ low="10" high="500" default="500"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Time between knocks" _low-label="Short" _high-label="Long"
+ low="100" high="10000" default="10000"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A fiber-optic lamp. Groovy.
+
+Written by Tim Auckland; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/filmleader.xml b/hacks/config/filmleader.xml
new file mode 100644
index 0000000..02b4fd7
--- /dev/null
+++ b/hacks/config/filmleader.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="filmleader" _label="FilmLeader">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Cng7hmsuLo0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ <number id="noise" type="slider" arg="-noise %"
+ _label="Noise" _low-label="Low" _high-label="High"
+ low="0.0" high="0.2" default="0.04"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a looping countdown based on the SMPTE Universal Film leader
+on a simulation of an old analog television.
+
+https://en.wikipedia.org/wiki/Film_leader
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fireworkx.xml b/hacks/config/fireworkx.xml
new file mode 100644
index 0000000..2c8d096
--- /dev/null
+++ b/hacks/config/fireworkx.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fireworkx" _label="Fireworkx">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-l9BfvnFIPM"/>
+
+ <number id="Delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="maxlife" type="slider" arg="-maxlife %"
+ _label="Activity" _low-label="Dense" _high-label="Sparse"
+ low="0" high="100" default="32"/>
+
+ <boolean id="flash" _label="Light flash" arg-unset="-no-flash"/>
+ <boolean id="shoot" _label="Shells upward" arg-set="-shoot"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Exploding fireworks. See also the "Eruption", "XFlame" and "Pyro"
+screen savers.
+
+Written by Rony B Chandran; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flag.xml b/hacks/config/flag.xml
new file mode 100644
index 0000000..1e6cfb3
--- /dev/null
+++ b/hacks/config/flag.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flag" _label="Flag">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=LuEC3EONzjc"/>
+
+ <string id="text" _label="Text for flag" arg="-text %"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="50000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <!-- #### -size [-7] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+This draws a waving colored flag, that undulates its way around the
+screen. The flag can contain arbitrary text and images. By default,
+it displays either the current system name and OS type, or a picture
+of "Bob".
+
+Written by Charles Vidal and Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flame.xml b/hacks/config/flame.xml
new file mode 100644
index 0000000..8e341c6
--- /dev/null
+++ b/hacks/config/flame.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flame" _label="Flame">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=6Pu8JKNT_Jk"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Linger" _low-label="0 seconds" _high-label="10 seconds"
+ low="1000" high="10000000" default="2000000"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Number of fractals" _low-label="Few" _high-label="Many"
+ low="1" high="250" default="25"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Complexity" _low-label="Low" _high-label="High"
+ low="100" high="80000" default="10000"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Iterative fractals.
+
+Written by Scott Draves; 1993.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flipflop.xml b/hacks/config/flipflop.xml
new file mode 100644
index 0000000..7f843a3
--- /dev/null
+++ b/hacks/config/flipflop.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flipflop" _label="FlipFlop" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RzWRoAMFtnw"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="spin" type="slider" arg="-spin %"
+ _label="Spin" _low-label="Stopped" _high-label="Whirlwind"
+ low="0" high="3.0" default="0.1"/>
+ </vgroup>
+ <vgroup>
+
+ <select id="mode">
+ <option id="tiles" _label="Draw Tiles"/>
+ <option id="sticks" _label="Draw Sticks" arg-set="-mode sticks"/>
+ </select>
+
+ <number id="size-x" type="spinbutton" arg="-size-x %"
+ _label="Width" low="3" high="20" default="9"/>
+ <number id="size-y" type="spinbutton" arg="-size-y %"
+ _label="Depth" low="3" high="20" default="9"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="texture" _label="Load image" arg-set="-texture" />
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Colored tiles swap with each other.
+
+Written by Kevin Ogden and Sergio Gutierrez; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flipscreen3d.xml b/hacks/config/flipscreen3d.xml
new file mode 100644
index 0000000..5ed1cfb
--- /dev/null
+++ b/hacks/config/flipscreen3d.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flipscreen3d" _label="FlipScreen3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mu3iN_BSpt4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Spins and deforms an image.
+
+Written by Ben Buxton and Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fliptext.xml b/hacks/config/fliptext.xml
new file mode 100644
index 0000000..48c7e64
--- /dev/null
+++ b/hacks/config/fliptext.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fliptext" _label="FlipText" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=vcB-6S7Hfuk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <select id="align">
+ <option id="left" _label="Random text alignment"/>
+ <option id="left" _label="Flush left text" arg-set="-alignment left"/>
+ <option id="center" _label="Centered text" arg-set="-alignment center"/>
+ <option id="right" _label="Flush right text" arg-set="-alignment right"/>
+ </select>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Font point size" low="1" high="100" default="20"/>
+
+ <number id="columns" type="spinbutton" arg="-columns %"
+ _label="Text columns" low="1" high="200" default="80"/>
+
+ <number id="lines" type="spinbutton" arg="-lines %"
+ _label="Text lines" low="1" high="99" default="8"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <xscreensaver-text />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Successive pages of text flip in and out in a soothing 3D pattern.
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flow.xml b/hacks/config/flow.xml
new file mode 100644
index 0000000..804080a
--- /dev/null
+++ b/hacks/config/flow.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flow" _label="Flow">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RJjbRV0FC_A"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="10" high="5000" default="3000"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="10000"/>
+ </vgroup>
+ <vgroup>
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Length of trails" _low-label="Short" _high-label="Long"
+ low="-20" high="-2" default="-10" convert="invert"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="rotate" _label="Rotating around attractor" arg-unset="-no-rotate"/>
+ <boolean id="ride" _label="Ride in the flow" arg-unset="-no-ride"/>
+ <boolean id="box" _label="Draw bounding box" arg-unset="-no-box"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="periodic" _label="Periodic attractors" arg-unset="-no-periodic"/>
+ <boolean id="search" _label="Search for new attractors" arg-unset="-no-search"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Strange attractors formed of flows in a 3D differential equation phase
+space. Features the popular attractors described by Lorentz,
+Roessler, Birkhoff and Duffing, and can discover entirely new
+attractors by itself.
+
+https://en.wikipedia.org/wiki/Attractor#Strange_attractor
+
+Written by Tim Auckland; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fluidballs.xml b/hacks/config/fluidballs.xml
new file mode 100644
index 0000000..2acd92c
--- /dev/null
+++ b/hacks/config/fluidballs.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fluidballs" _label="FluidBalls">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=5Iz9V-vOrxA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of balls" _low-label="Few" _high-label="Many"
+ low="1" high="3000" default="300"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Ball size" _low-label="Small" _high-label="Large"
+ low="3" high="200" default="25"/>
+ </vgroup>
+ <vgroup>
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label=" Freefall" _high-label="Jupiter"
+ low="0.0" high="0.1" default="0.01"/>
+
+ <number id="wind" type="slider" arg="-wind %"
+ _label="Wind" _low-label="Still" _high-label="Hurricane"
+ low="0.0" high="0.1" default="0.00"/>
+
+ <number id="elasticity" type="slider" arg="-elasticity %"
+ _label="Friction" _low-label="Clay" _high-label="Rubber"
+ low="0.2" high="1.0" default="0.97"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="random" _label="Various ball sizes" arg-unset="-no-random"/>
+ <boolean id="shake" _label="Shake box" arg-unset="-no-shake"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Models the physics of bouncing balls, or of particles in a gas or
+fluid, depending on the settings. If "Shake Box" is selected, then
+every now and then, the box will be rotated, changing which direction
+is down (in order to keep the settled balls in motion.)
+
+Written by Peter Birtles and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flurry.xml b/hacks/config/flurry.xml
new file mode 100644
index 0000000..5917e32
--- /dev/null
+++ b/hacks/config/flurry.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flurry" _label="Flurry" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=0beqUyN5ZsI"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <select id="preset">
+ <option id="classic" _label="Classic" arg-set="-preset classic"/>
+ <option id="rgb" _label="RGB" arg-set="-preset rgb"/>
+ <option id="fire" _label="Fire" arg-set="-preset fire"/>
+ <option id="water" _label="Water" arg-set="-preset water"/>
+ <option id="binary" _label="Binary" arg-set="-preset binary"/>
+ <option id="psych" _label="Psychedelic" arg-set="-preset psychedelic"/>
+ <option id="insane" _label="Insane" arg-set="-preset insane"/>
+ <option id="random" _label="Random"/>
+ </select>
+
+ <xscreensaver-updater />
+
+ <_description>
+A colourful star(fish)like flurry of particles.
+
+Written by Calum Robinson and Tobias Sargeant; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flyingtoasters.xml b/hacks/config/flyingtoasters.xml
new file mode 100644
index 0000000..7df6459
--- /dev/null
+++ b/hacks/config/flyingtoasters.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flyingtoasters" _label="FlyingToasters" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mLGDvtbFvfg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Air speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="ntoasters" type="slider" arg="-ntoasters %"
+ _label="Number of toasters" _low-label="None" _high-label="Swarm"
+ low="0" high="50" default="20"/>
+
+ <number id="nslices" type="slider" arg="-nslices %"
+ _label="Number of slices" _low-label="None" _high-label="Swarm"
+ low="0" high="50" default="25"/>
+
+ <hgroup>
+ <boolean id="tex" _label="Chrome" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A fleet of 3d space-age jet-powered flying toasters (and toast!)
+Inspired by the ancient Berkeley Systems After Dark flying toasters.
+
+https://en.wikipedia.org/wiki/After_Dark_%28software%29#Flying_Toasters
+
+Written by Jamie Zawinski and Devon Dossett; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fontglide.xml b/hacks/config/fontglide.xml
new file mode 100644
index 0000000..db437d3
--- /dev/null
+++ b/hacks/config/fontglide.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fontglide" _label="FontGlide">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2KCXD19FHk0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <number id="linger" type="slider" arg="-linger %"
+ _label="Page linger" _low-label="Brief" _high-label="Long"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <select id="mode">
+ <option id="page" _label="Pages of text" arg-set="-mode page"/>
+ <option id="scroll" _label="Horizontally scrolling text" arg-set="-mode scroll"/>
+ <option id="random" _label="Random display style"/>
+ </select>
+
+ <hgroup>
+ <number id="bw" type="spinbutton" arg="-bw %"
+ _label="Font border thickness" low="0" high="8" default="2"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-text />
+ <hgroup>
+ <boolean id="trails" _label="Vapor trails" arg-set="-trails"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Puts text on the screen using large characters that glide in from the
+edges, assemble, then disperse. Alternately, it can simply scroll whole
+sentences from right to left.
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/forest.xml b/hacks/config/forest.xml
new file mode 100644
index 0000000..2e0bd41
--- /dev/null
+++ b/hacks/config/forest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="forest" _label="Forest">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=EEK2qbAmKWs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="3000000" default="500000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="20" default="20"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Fractal trees.
+
+Written by Peter Baumung; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fuzzyflakes.xml b/hacks/config/fuzzyflakes.xml
new file mode 100644
index 0000000..b59517d
--- /dev/null
+++ b/hacks/config/fuzzyflakes.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fuzzyflakes" _label="FuzzyFlakes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NrGe3xcqAns"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="50" default="10"/>
+
+ <number id="layers" type="slider" arg="-layers %"
+ _label="Layers" _low-label="Few" _high-label="Many"
+ low="1" high="10" default="3"/>
+
+ <hgroup>
+ <boolean id="rc" _label="Random colors" arg-set="-random-colors"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <select id="color">
+ <option id="lred" _label="Red" arg-set="-color #FF0000"/>
+ <option id="pink" _label="Pink"/>
+ <option id="lyellow" _label="Yellow" arg-set="-color #FFFF00"/>
+ <option id="lgreen" _label="Green" arg-set="-color #00FF00"/>
+ <option id="lcyan" _label="Cyan" arg-set="-color #00FFFF"/>
+ <option id="lblue" _label="Blue" arg-set="-color #0000FF"/>
+ <option id="lmagenta" _label="Magenta" arg-set="-color #FF00FF"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+ <number id="arms" type="slider" arg="-arms %"
+ _label="Arms" _low-label="Few" _high-label="Many"
+ low="1" high="10" default="5"/>
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="1" high="50" default="10"/>
+ <number id="bthickness" type="slider" arg="-bthickness %"
+ _label="Border thickness" _low-label="Thin" _high-label="Thick"
+ low="0" high="50" default="3"/>
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Radius" _low-label="Small" _high-label="Large"
+ low="1" high="100" default="20"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Falling colored snowflake/flower shapes.
+
+https://en.wikipedia.org/wiki/Snowflake
+
+Written by Barry Dmytro; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/galaxy.xml b/hacks/config/galaxy.xml
new file mode 100644
index 0000000..b12d62f
--- /dev/null
+++ b/hacks/config/galaxy.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="galaxy" _label="Galaxy">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xBprAm9w-Fo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="-20" high="20" default="-5"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="10" high="1000" default="250"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="10" high="255" default="64"/>
+
+ <boolean id="spin" _label="Rotate viewpoint" arg-unset="-no-spin"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Spinning galaxies collide.
+
+Written by Uli Siegmund, Harald Backert, and Hubert Feyrer; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gears.xml b/hacks/config/gears.xml
new file mode 100644
index 0000000..957fbdb
--- /dev/null
+++ b/hacks/config/gears.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gears" _label="Gears" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=OHamiC1tcdg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Gear count" _low-label="0" _high-label="20"
+ low="0" high="20" default="0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Interlocking gears. See also the "Pinion" and "MoebiusGears" screen savers.
+
+https://en.wikipedia.org/wiki/Involute_gear
+https://en.wikipedia.org/wiki/Epicyclic_gearing
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/geodesic.xml b/hacks/config/geodesic.xml
new file mode 100644
index 0000000..0bc52ff
--- /dev/null
+++ b/hacks/config/geodesic.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="geodesic" _label="Geodesic" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=qulzooBLIcU"/>
+
+ <hgroup>
+ <vgroup>
+ <select id="object">
+ <option id="mesh" _label="Mesh faces"/>
+ <option id="solid" _label="Solid faces" arg-set="-mode solid"/>
+ <option id="stellated" _label="Stellated faces" arg-set="-mode stellated"/>
+ <option id="stellated2" _label="Inverse Stellated" arg-set="-mode stellated2"/>
+ <option id="wire" _label="Wireframe" arg-set="-mode wire"/>
+ <option id="random" _label="Random face style" arg-set="-mode random"/>
+ </select>
+
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Depth" _low-label="1" _high-label="8"
+ low="1" high="8" default="4"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A mesh geodesic sphere of increasing and decreasing complexity.
+
+A geodesic sphere is an icosohedron whose equilateral faces are
+sub-divided into non-equilateral triangles to more closely approximate
+a sphere.
+
+The animation shows the equilateral triangles subdivided into four
+coplanar equilateral triangles; and then inflated outward, causing the
+sub-triangles to no longer be equilateral, but to more closely
+approximate the surface of a sphere.
+
+https://en.wikipedia.org/wiki/Geodesic_dome
+https://en.wikipedia.org/wiki/Buckminster_Fuller
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/geodesicgears.xml b/hacks/config/geodesicgears.xml
new file mode 100644
index 0000000..813268a
--- /dev/null
+++ b/hacks/config/geodesicgears.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="geodesicgears" _label="GeodesicGears" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gd_nTnJQ4Ps"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="timeout" type="slider" arg="-timeout %"
+ _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
+ low="5" high="120" default="20"/>
+
+ <hgroup>
+ <boolean id="labels" _label="Describe gears" arg-set="-labels"/>
+ <boolean id="numbers" _label="Number gears" arg-set="-numbers"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A set of meshed gears arranged on the surface of a sphere.
+
+https://en.wikipedia.org/wiki/Geodesic_dome
+https://en.wikipedia.org/wiki/Involute_gear
+https://en.wikipedia.org/wiki/Buckminster_Fuller
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gflux.xml b/hacks/config/gflux.xml
new file mode 100644
index 0000000..baced13
--- /dev/null
+++ b/hacks/config/gflux.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gflux" _label="GFlux" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=vbRFlKH-LpA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="wave" type="slider" arg="-speed %"
+ _label="Wave speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="0.50" default="0.05"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="squares" type="slider" arg="-squares %"
+ _label="Mesh density" _low-label="Sparse" _high-label="Dense"
+ low="2" high="40" default="19"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Waves" _low-label="1" _high-label="10"
+ low="1" high="10" default="3"/>
+ </vgroup>
+ </hgroup>
+
+ <select id="mode">
+ <option id="wire" _label="Wire mesh" arg-set="-mode wire"/>
+ <option id="solid" _label="Flat lighting" arg-set="-mode solid"/>
+ <option id="light" _label="Directional lighting" arg-set="-mode light"/>
+ <option id="checker" _label="Checkerboard" arg-set="-mode checker"/>
+ <option id="grab" _label="Picture" />
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <!-- #### -resolution [4] -->
+ <!-- #### -flat [0] -->
+ <!-- #### -rotationx [0.01] -->
+ <!-- #### -rotationy [0.0] -->
+ <!-- #### -rotationz [0.1] -->
+ <!-- #### -waveChange [50] -->
+ <!-- #### -waveHeight [1.0] -->
+ <!-- #### -waveFreq [3.0] -->
+ <!-- #### -zoom [1.0] -->
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Undulating waves on a rotating grid.
+
+Written by Josiah Pease; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glblur.xml b/hacks/config/glblur.xml
new file mode 100644
index 0000000..ffa953d
--- /dev/null
+++ b/hacks/config/glblur.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glblur" _label="GLBlur" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wUWwQXRp8lE"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="blursize" type="slider" arg="-blursize %"
+ _label="Blur smoothness" _low-label="Sparse" _high-label="Dense"
+ low="1" high="100" default="15"/>
+
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flowing field effects from the vapor trails around a moving object.
+
+This is done by rendering the scene into a small texture, then
+repeatedly rendering increasingly-enlarged and increasingly-transparent
+versions of that texture onto the frame buffer. As such, it's quite
+GPU-intensive: if you don't have a very good graphics card, it
+will hurt your machine bad.
+
+Written by Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glcells.xml b/hacks/config/glcells.xml
new file mode 100644
index 0000000..da86fe6
--- /dev/null
+++ b/hacks/config/glcells.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glcells" _label="GLCells" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=94ac7nEQyBI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+ <number id="pause" type="slider" arg="-pause %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="0" high="400" default="50"/>
+ <number id="maxcells" type="slider" arg="-maxcells %"
+ _label="Max cells" _low-label="Few" _high-label="Many"
+ low="50" high="5000" default="800"/>
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Cell radius" _low-label="Small" _high-label="Huge"
+ low="5" high="80" default="40"/>
+ <select id="quality">
+ <option id="q0" _label="Lowest sphere detail" arg-set="-quality 0"/>
+ <option id="q1" _label="Medium sphere detail" arg-set="-quality 1"/>
+ <option id="q2" _label="Normal sphere detail" arg-set="-quality 2"/>
+ <option id="q3" _label="More sphere detail"/>
+ <option id="q4" _label="Highest sphere detail" arg-set="-quality 4"/>
+ </select>
+ </vgroup>
+ <vgroup>
+ <number id="minfood" type="slider" arg="-minfood %"
+ _label="Min food" _low-label="Starve" _high-label="Gorge"
+ low="0" high="100" default="5"/>
+ <number id="maxfood" type="slider" arg="-maxfood %"
+ _label="Max food" _low-label="Starve" _high-label="Gorge"
+ low="10" high="100" default="20"/>
+ <number id="divideage" type="slider" arg="-divideage %"
+ _label="Cell division" _low-label="Quick" _high-label="Slow"
+ low="1" high="100" default="20"/>
+ <number id="mindist" type="slider" arg="-mindist %"
+ _label="Min distance" _low-label="Small" _high-label="Large"
+ low="1.0" high="3.0" default="1.4"/>
+ <number id="seeds" type="slider" arg="-seeds %"
+ _label="Seeds" _low-label="1" _high-label="15"
+ low="1" high="15" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="keepold" _label="Keep dead cells" arg-set="-keepold"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Cells growing, dividing and dying on your screen. Microscopic pathos.
+
+Written by Matthias Toussaint; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gleidescope.xml b/hacks/config/gleidescope.xml
new file mode 100644
index 0000000..b75bc11
--- /dev/null
+++ b/hacks/config/gleidescope.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gleidescope" _label="Gleidescope" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=q6F-CDX6-tU"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="size" _label="Size of tube" arg="-size %"
+ type="slider" _low-label="Small" _high-label="Large"
+ low="0" high="10" default="0" />
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Image duration"
+ _low-label="10 seconds" _high-label="5 minutes"
+ low="10" high="300" default="30"/>
+
+ <hgroup>
+ <boolean id="move" _label="Move" arg-unset="-no-move"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="zoom" _label="Zoom" arg-set="-zoom"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+A kaleidoscope that operates on a loaded image.
+
+https://en.wikipedia.org/wiki/Kaleidoscope
+
+Written by Andrew Dean; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glforestfire.xml b/hacks/config/glforestfire.xml
new file mode 100644
index 0000000..08f882c
--- /dev/null
+++ b/hacks/config/glforestfire.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glforestfire" _label="GLForestFire" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_0Ff3qHUfsA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Rain" _high-label="Huge fire"
+ low="0" high="8000" default="800"/>
+
+ <number id="trees" type="slider" arg="-trees %"
+ _label="Number of trees" _low-label="Desert" _high-label="Forest"
+ low="0" high="20" default="5"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="tex" _label="Textures" arg-unset="-no-texture"/>
+ <boolean id="shadow" _label="Shadows" arg-unset="-no-shadows"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="fog" _label="Fog" arg-set="-fog"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws an animation of sprinkling fire-like 3D triangles in a landscape
+filled with trees.
+
+Written by Eric Lassauge; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml
new file mode 100644
index 0000000..6d9aec2
--- /dev/null
+++ b/hacks/config/glhanoi.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glhanoi" _label="GLHanoi" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=1qRCviRmsTY"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="15000" convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of disks" _low-label="0" _high-label="31"
+ default="0" low="0" high="31"/>
+
+ <number id="poles" type="slider" arg="-poles %"
+ _label="Number of poles" _low-label="0" _high-label="31"
+ default="0" low="3" high="31"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed (of smallest disks)" _low-label="1" _high-label="20"
+ default="1" low="1" high="20"/>
+
+ <number id="trails" type="slider" arg="-trails %"
+ _label="Length of disk trails" _low-label="0" _high-label="10"
+ default="2" low="0" high="10"/>
+
+ <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <boolean id="lighting" _label="Enable lighting" arg-unset="-no-light"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Solves the Towers of Hanoi puzzle. Move N disks from one pole to
+another, one disk at a time, with no disk ever resting on a disk
+smaller than itself.
+
+https://en.wikipedia.org/wiki/Tower_of_Hanoi
+
+Written by Dave Atkinson; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glitchpeg.xml b/hacks/config/glitchpeg.xml
new file mode 100644
index 0000000..f53777c
--- /dev/null
+++ b/hacks/config/glitchpeg.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glitchpeg" _label="GlitchPEG">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Xl5vKJ65_xM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="1 second" _high-label="10 minutes"
+ low="1" high="600" default="120"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Glitchiness" _low-label="Low" _high-label="High"
+ low="1" high="1024" default="100"/>
+
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-image />
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Loads an image, corrupts it, and then displays the corrupted version,
+several times a second. After a while, finds a new image to corrupt.
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glknots.xml b/hacks/config/glknots.xml
new file mode 100644
index 0000000..afdd296
--- /dev/null
+++ b/hacks/config/glknots.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glknots" _label="GLKnots" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ILiYNkeEb_k"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Resolution" _low-label="Segmented" _high-label="Smooth"
+ low="100" high="2000" default="800"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.05" high="1.0" default="0.3"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates some twisting 3d knot patterns. Spins 'em around.
+
+https://en.wikipedia.org/wiki/Knot_theory
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glmatrix.xml b/hacks/config/glmatrix.xml
new file mode 100644
index 0000000..18293da
--- /dev/null
+++ b/hacks/config/glmatrix.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glmatrix" _label="GLMatrix" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_dktSpsaCPg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Glyph density" _low-label="Sparse" _high-label="Dense"
+ low="0" high="100" default="20"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Glyph speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <select id="mode">
+ <option id="matrix" _label="Matrix encoding"/>
+ <option id="binary" _label="Binary encoding" arg-set="-mode binary"/>
+ <option id="hex" _label="Hexadecimal encoding" arg-set="-mode hex"/>
+ <option id="dna" _label="Genetic encoding" arg-set="-mode dna"/>
+ </select>
+
+ <hgroup>
+ <boolean id="fog" _label="Fog" arg-unset="-no-fog"/>
+ <boolean id="waves" _label="Waves" arg-unset="-no-waves"/>
+ <boolean id="rotate" _label="Panning" arg-unset="-no-rotate"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 3D "digital rain" effect, as seen in the title sequence of "The Matrix".
+
+See also "xmatrix" for a 2D rendering of the similar effect that
+appeared on the computer monitors actually *in* the movie.
+
+https://en.wikipedia.org/wiki/Matrix_digital_rain
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glplanet.xml b/hacks/config/glplanet.xml
new file mode 100644
index 0000000..5714b7a
--- /dev/null
+++ b/hacks/config/glplanet.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glplanet" _label="GLPlanet" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ohcJ1bVkLZ4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <!-- #### -no-texture -->
+
+ <file id="image" _label="Day image" arg="-image %" />
+ <file id="image2" _label="Night image" arg="-image2 %" />
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
+ <boolean id="stars" _label="Stars" arg-unset="-no-stars"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Earth, bouncing around in space, rendered with satellite imagery
+of the planet in both sunlight and darkness.
+
+If you would like it to display a different planet, any pair of
+Equirectangular-projected maps will work. The maps that come with
+"ssystem" work well.
+
+Written by David Konerding and Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glschool.xml b/hacks/config/glschool.xml
new file mode 100644
index 0000000..a79ce12
--- /dev/null
+++ b/hacks/config/glschool.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glschool" _label="GLSchool" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=SuMIatcSPdU"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="NFish" type="slider" arg="-nfish %"
+ _label="Fish count" _low-label="Few" _high-label="Lots"
+ low="5" high="500" default="100"/>
+
+ <number id="AvoidFact" type="slider" arg="-avoidfact %" _label="Avoidance" _low-label="None" _high-label="High" low="0" high="10" default="1.5"/>
+ </vgroup>
+ <vgroup>
+ <number id="MatchFact" type="slider" arg="-matchfact %" _label="Velocity matching" _low-label="None" _high-label="High" low="0" high="3" default="0.15"/>
+ <number id="CenterFact" type="slider" arg="-centerfact %" _label="Centering" _low-label="None" _high-label="High" low="0" high="1.0" default="0.1"/>
+ <number id="TargetFact" type="slider" arg="-targetfact %" _label="Goal following" _low-label="None" _high-label="High" low="0" high="400" default="80"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="fog" _label="Fog" arg-set="-fog"/>
+ <boolean id="drawgoal" _label="Draw goal" arg-set="-drawgoal"/>
+ <boolean id="drawbbox" _label="Draw bounding box" arg-unset="-no-drawbbox"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A school of fish, using the classic "Boids" algorithm by Craig Reynolds.
+
+https://en.wikipedia.org/wiki/Boids
+
+Written by David C. Lambert and Jamie Zawinski; 2006.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glslideshow.xml b/hacks/config/glslideshow.xml
new file mode 100644
index 0000000..c92a6de
--- /dev/null
+++ b/hacks/config/glslideshow.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glslideshow" _label="GLSlideshow" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Hi0xUWnqBhQ"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Time until loading a new image"
+ _low-label="10 seconds" _high-label="5 minutes"
+ low="10" high="300" default="30"/>
+
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Always show at least this much of the image"
+ _low-label="50%" _high-label="100%"
+ low="50" high="100" default="75"/>
+
+ <number id="pan" type="slider" arg="-pan %"
+ _label="Pan/zoom duration"
+ _low-label="1 second" _high-label="30 seconds"
+ low="1" high="30" default="6"/>
+
+ <number id="fade" type="slider" arg="-fade %"
+ _label="Crossfade duration"
+ _low-label="None" _high-label="30 seconds"
+ low="0" high="30" default="2"/>
+ </vgroup>
+ <vgroup>
+
+ <boolean id="letterbox" _label="Letterbox" arg-unset="-no-letterbox"/>
+ <boolean id="titles" _label="Show file names" arg-set="-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Loads a random sequence of images and smoothly scans and zooms around
+in each, fading from pan to pan.
+
+Written by Jamie Zawinski and Mike Oliphant; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glsnake.xml b/hacks/config/glsnake.xml
new file mode 100644
index 0000000..d73663d
--- /dev/null
+++ b/hacks/config/glsnake.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glsnake" _label="GLSnake" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AIqz-G0n1JU"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-statictime %"
+ _label="Duration" _low-label="1" _high-label="30 seconds"
+ low="1000" high="30000" default="5000"/>
+
+ <number id="packing" type="slider" arg="-explode %"
+ _label="Packing" _low-label="Tight" _high-label="Loose"
+ low="0.0" high="0.5" default="0.03"/>
+ </vgroup>
+ <vgroup>
+
+ <number id="angvel" type="slider" arg="-angvel %"
+ _label="Angular velocity" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="5.0" default="1.0"/>
+ <number id="yangvel" type="slider" arg="-yangvel %"
+ _label="Y angular velocity" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.10"/>
+
+ <number id="zangvel" type="slider" arg="-zangvel %"
+ _label="Z angular velocity" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.14"/>
+
+ </vgroup>
+ </hgroup>
+
+
+ <hgroup>
+ <boolean id="labels" _label="Show titles" arg-set="-titles"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The "Rubik's Snake" puzzle. See also the "Rubik" and "Cube21" screen savers.
+
+https://en.wikipedia.org/wiki/Rubik%27s_Snake
+
+Written by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gltext.xml b/hacks/config/gltext.xml
new file mode 100644
index 0000000..99ec92f
--- /dev/null
+++ b/hacks/config/gltext.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gltext" _label="GLText" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=jrXa-QtY6MU"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <select id="text">
+ <option id="uname" _label="Display system information" />
+ <option id="clock" _label="Display date and time"
+ arg-set="-text '%A%n%d %b %Y%n%r'"/>
+ </select>
+
+ <hgroup>
+ <select id="facing">
+ <option id="front" _label="Always face front"/>
+ <option id="nofront" _label="Spin all the way around" arg-set="-no-front"/>
+ </select>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ </hgroup>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a few lines of text spinning around in a solid 3D font.
+The text can use strftime() escape codes to display the current
+date and time.
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/goop.xml b/hacks/config/goop.xml
new file mode 100644
index 0000000..53222f8
--- /dev/null
+++ b/hacks/config/goop.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="goop" _label="Goop">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=bLMAF4Q-mGA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="12000"
+ convert="invert"/>
+
+ <number id="torque" type="slider" arg="-torque %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.0002" high="0.0500" default="0.0075"/>
+
+ <number id="count" type="slider" arg="-planes %"
+ _label="Blobs" _low-label="Few" _high-label="Many"
+ low="1" high="50" default="12"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="elasticity" type="slider" arg="-elasticity %"
+ _label="Elasticity" _low-label="Low" _high-label="High"
+ low="0.1" high="5.0" default="0.9"/>
+
+ <number id="maxv" type="slider" arg="-max-velocity %"
+ _label="Speed limit" _low-label="Low" _high-label="High"
+ low="0.1" high="3.0" default="0.5"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <select id="mode">
+ <option id="transparent" _label="Transparent blobs"/>
+ <option id="opaque" _label="Opaque blobs" arg-set="-mode opaque"/>
+ <option id="xor" _label="XOR blobs" arg-set="-mode xor"/>
+ </select>
+
+ <select id="color-mode">
+ <option id="additive" _label="Additive colors (transmitted light)"/>
+ <option id="subtractive" _label="Subtractive colors (reflected light)"
+ arg-set="-subtractive"/>
+ </select>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Amoeba-like blobs change shape as they wander around the screen.
+They are translucent, so you can see the lower blobs through the
+higher ones, and when one passes over another, their colors merge. I
+got the idea for this from a mouse pad I had once, which achieved the
+same kind of effect in real life by having several layers of plastic
+with colored oil between them.
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/grav.xml b/hacks/config/grav.xml
new file mode 100644
index 0000000..807f37d
--- /dev/null
+++ b/hacks/config/grav.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="grav" _label="Grav">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=spQRFDmDMeg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of objects" _low-label="Few" _high-label="Many"
+ low="1" high="40" default="12"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <hgroup>
+ <boolean id="decay" _label="Orbital decay" arg-unset="-no-decay"/>
+ <boolean id="trail" _label="Object trails" arg-unset="-no-trail"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An orbital simulation. With trails enabled, it looks kind of like a
+cloud-chamber photograph.
+
+Written by Greg Bowering; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/greynetic.xml b/hacks/config/greynetic.xml
new file mode 100644
index 0000000..cbc11a9
--- /dev/null
+++ b/hacks/config/greynetic.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="greynetic" _label="Greynetic">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lVEi089s1_c"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="250000" default="10000"
+ convert="invert"/>
+
+ <boolean id="grey" _label="Grey" arg-set="-grey"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Colored, stippled and transparent rectangles.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/halftone.xml b/hacks/config/halftone.xml
new file mode 100644
index 0000000..be65660
--- /dev/null
+++ b/hacks/config/halftone.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="halftone" _label="Halftone">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=K2lqgBPde4o"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000" convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Gravity points" _low-label="Few" _high-label="Many"
+ low="1" high="50" default="10"/>
+
+ <number id="size" type="slider" arg="-spacing %"
+ _label="Dot size" _low-label="Small" _high-label="Big"
+ low="2" high="50" default="14"/>
+
+ <number id="dotfill" type="slider" arg="-sizefactor %"
+ _label="Dot fill factor" _low-label="Small" _high-label="Large"
+ low="0.1" high="3" default="1.5"/>
+ </vgroup>
+ <vgroup>
+ <number id="minspeed" type="slider" arg="-minspeed %"
+ _label="Minimum speed" _low-label="Low" _high-label="High"
+ low="0.001" high="0.09" default="0.001"/>
+
+ <number id="maxspeed" type="slider" arg="-maxspeed %"
+ _label="Maximum speed" _low-label="Low" _high-label="High"
+ low="0.001" high="0.09" default="0.02"/>
+
+ <number id="minmass" type="slider" arg="-minmass %"
+ _label="Minimum mass" _low-label="Small" _high-label="Large"
+ low="0.001" high="0.09" default="0.001"/>
+
+ <number id="maxmass" type="slider" arg="-maxmass %"
+ _label="Maximum mass" _low-label="Small" _high-label="Large"
+ low="0.001" high="0.09" default="0.02"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A halftone dot pattern in motion.
+
+Draws the gravity force in each point on the screen seen through a
+halftone dot pattern. The gravity force is calculated from a set of
+moving mass points. View it from a distance for best effect.
+
+https://en.wikipedia.org/wiki/Halftone
+
+Written by Peter Jaric; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/halo.xml b/hacks/config/halo.xml
new file mode 100644
index 0000000..ef947e2
--- /dev/null
+++ b/hacks/config/halo.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="halo" _label="Halo">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=K7LbfXh3LTc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="100000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of circles" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="0"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <select id="mode">
+ <option id="random" _label="Random mode"/>
+ <option id="seuss" _label="Seuss mode" arg-set="-mode seuss"/>
+ <option id="ramp" _label="Ramp mode" arg-set="-mode ramp"/>
+ </select>
+
+ <hgroup>
+ <boolean id="animate" _label="Animate circles" arg-set="-animate"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Circular interference patterns.
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski; 1993.
+ </_description>
+</screensaver>
diff --git a/hacks/config/helix.xml b/hacks/config/helix.xml
new file mode 100644
index 0000000..00d4525
--- /dev/null
+++ b/hacks/config/helix.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="helix" _label="Helix">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=H-mMnadnPSs"/>
+
+ <number id="delay" type="slider" arg="-subdelay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Spirally string-art-ish patterns.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hexadrop.xml b/hacks/config/hexadrop.xml
new file mode 100644
index 0000000..8f8baef
--- /dev/null
+++ b/hacks/config/hexadrop.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hexadrop" _label="Hexadrop">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=HMPVzQUGW-Q"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="50000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="4.0" default="1.0"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Tile size" _low-label="Small" _high-label="Large"
+ low="5" high="50" default="15"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="sides">
+ <option id="0" _label="Random shape"/>
+ <option id="3" _label="Triangles" arg-set="-sides 3"/>
+ <option id="4" _label="Squares" arg-set="-sides 4"/>
+ <option id="6" _label="Hexagons" arg-set="-sides 6"/>
+ <option id="5" _label="Octagons" arg-set="-sides 8"/>
+ </select>
+
+ <select id="uniform">
+ <option id="r-uniform" _label="Random speed"/>
+ <option id="uniform" _label="Uniform speed" arg-set="-uniform-speed"/>
+ <option id="no-uniform" _label="Non-uniform speed" arg-set="-no-uniform-speed"/>
+ </select>
+
+ <select id="lockstep">
+ <option id="r-lockstep" _label="Random sync"/>
+ <option id="lockstep" _label="Synchronized" arg-set="-lockstep"/>
+ <option id="no-lockstep" _label="Non-synchronized" arg-set="-no-lockstep"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A grid of hexagons or other shapes, with tiles dropping out.
+
+https://en.wikipedia.org/wiki/Tiling_by_regular_polygons
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hexstrut.xml b/hacks/config/hexstrut.xml
new file mode 100644
index 0000000..0823dc8
--- /dev/null
+++ b/hacks/config/hexstrut.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hexstrut" _label="Hexstrut" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=iOCffj3ZmgE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Hexagon Size" _low-label="Small" _high-label="Large"
+ low="2" high="80" default="20"
+ convert="invert"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Line Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.01" high="1.7" default="0.2"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A grid of hexagons composed of rotating Y-shaped struts.
+Waves of rotation and color changes randomly propagate across the plane.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hilbert.xml b/hacks/config/hilbert.xml
new file mode 100644
index 0000000..7f44aed
--- /dev/null
+++ b/hacks/config/hilbert.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hilbert" _label="Hilbert" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NhKmipo_Ek4"/>
+
+ <hgroup>
+ <vgroup>
+
+ <hgroup>
+ <select id="twodee">
+ <option id="random" _label="2D or 3D"/>
+ <option id="2D" _label="2D" arg-set="-mode 2d"/>
+ <option id="3D" _label="3D" arg-set="-mode 3d"/>
+ </select>
+
+ <select id="closed">
+ <option id="random" _label="Open or closed paths"/>
+ <option id="closed" _label="Closed" arg-set="-ends closed"/>
+ <option id="open" _label="Open" arg-set="-ends open"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.02" high="10.0" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="depth" type="slider" arg="-max-depth %"
+ _label="Recursion levels" _low-label="2" _high-label="10"
+ low="2" high="10" default="5"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Line thickness" _low-label="Thin" _high-label="Thick"
+ low="0.01" high="1.0" default="0.25"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The recursive Hilbert space-filling curve, both 2D and 3D variants.
+It incrementally animates the growth and recursion to the maximum
+depth, then unwinds it back.
+
+The Hilbert path is a single contiguous line that can fill a volume
+without crossing itself. As a data structure, Hilbert paths are
+useful because ordering along the curve preserves locality: points
+that are close together along the curve are also close together in space.
+The converse is often, but not always, true. The coloration
+reflects this.
+
+https://en.wikipedia.org/wiki/Hilbert_curve
+
+Written by Jamie Zawinski; 2011.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hopalong.xml b/hacks/config/hopalong.xml
new file mode 100644
index 0000000..c3c5aad
--- /dev/null
+++ b/hacks/config/hopalong.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hopalong" _label="Hopalong">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Ck0pKMflau0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="2500"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="100" high="10000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="sine" _label="Sine" arg-set="-sine"/>
+ <boolean id="martin" _label="Martin" arg-set="-martin"/>
+ <boolean id="popcorn" _label="Popcorn" arg-set="-popcorn"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="jong" _label="Jong" arg-set="-jong"/>
+ <boolean id="rr" _label="RR" arg-set="-rr"/>
+ <boolean id="ejk1" _label="EJK1" arg-set="-ejk1"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="ejk2" _label="EJK2" arg-set="-ejk2"/>
+ <boolean id="ejk3" _label="EJK3" arg-set="-ejk3"/>
+ <boolean id="ejk4" _label="EJK4" arg-set="-ejk4"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="ejk5" _label="EJK5" arg-set="-ejk5"/>
+ <boolean id="ejk6" _label="EJK6" arg-set="-ejk6"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Lacy fractal patterns based on iteration in the imaginary
+plane, from a 1986 Scientific American article. See also the
+"Discrete" screen saver.
+
+Written by Patrick Naughton; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hydrostat.xml b/hacks/config/hydrostat.xml
new file mode 100644
index 0000000..b8b8bbe
--- /dev/null
+++ b/hacks/config/hydrostat.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hydrostat" _label="Hydrostat" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=nn-nA18hFt0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="4.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of squid" _low-label="One" _high-label="Many"
+ low="1" high="100" default="3" />
+
+ <number id="head_radius" type="slider" arg="-head-radius %"
+ _label="Head size" _low-label="Small" _high-label="Large"
+ low="10" high="100" default="60" />
+
+ <number id="tentacles" type="slider" arg="-tentacles %"
+ _label="Number of tentacles" _low-label="Few" _high-label="Many"
+ low="3" high="100" default="35" />
+
+ </vgroup>
+ <vgroup>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="3" high="40" default="18" />
+
+ <number id="length" type="slider" arg="-length %"
+ _label="Length of tentacles" _low-label="Short" _high-label="Long"
+ low="10" high="150" default="55" />
+
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label="Weak" _high-label="Strong"
+ low="0" high="10.0" default="0.5" />
+
+ <number id="current" type="slider" arg="-current %"
+ _label="Current" _low-label="Weak" _high-label="Strong"
+ low="0.0" high="10.0" default="0.25" />
+
+ <number id="friction" type="slider" arg="-friction %"
+ _label="Viscosity" _low-label="Low" _high-label="High"
+ low="0.0" high="0.1" default="0.02" />
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="pulse" _label="Pulse" arg-unset="-no-pulse" />
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+ </hgroup>
+
+ <_description>
+Wiggly squid or jellyfish with many tentacles.
+
+A muscular hydrostat is a biological structure used to move its host
+about, consisting of muscles with no skeletal support. It performs
+its hydraulic movement without fluid in a separate compartment, as in
+a hydrostatic skeleton.
+
+https://en.wikipedia.org/wiki/Muscular_hydrostat
+
+Written by Justin Windle and Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hyperball.xml b/hacks/config/hyperball.xml
new file mode 100644
index 0000000..8f674d2
--- /dev/null
+++ b/hacks/config/hyperball.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hyperball" _label="HyperBall">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=BqOHgn0BQOc"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+
+ <number id="z" type="slider" arg="-observer-z %"
+ _label="Zoom" _low-label="Near" _high-label="Far"
+ low="1.125" high="10.0" default="3.0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="xw" type="slider" arg="-xw %"
+ _label="XW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="xy" type="slider" arg="-xy %"
+ _label="XY rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="3"/>
+ <number id="xz" type="slider" arg="-xz %"
+ _label="XZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="yw" type="slider" arg="-yw %"
+ _label="YW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="10"/>
+ <number id="yz" type="slider" arg="-yz %"
+ _label="YZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="zw" type="slider" arg="-zw %"
+ _label="ZW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.10. It has been replaced by the more general "Polytopes"
+screen saver, which can display this object as well as others. The
+Polytopes "120-cell" object corresponds to this one.
+
+Hyperball is to hypercube as dodecahedron is to cube: this displays
+a 2D projection of the sequence of 3D objects which are the projections
+of the 4D analog to the dodecahedron. Technically, it is a "120 cell
+polytope".
+
+https://en.wikipedia.org/wiki/Hypercube
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Joe Keane; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hypercube.xml b/hacks/config/hypercube.xml
new file mode 100644
index 0000000..f471230
--- /dev/null
+++ b/hacks/config/hypercube.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hypercube" _label="HyperCube">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=tOLzz_D4-0E"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="z" type="slider" arg="-observer-z %"
+ _label="Zoom" _low-label="Near" _high-label="Far"
+ low="1.125" high="10.0" default="3.0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="xw" type="slider" arg="-xw %"
+ _label="XW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="xy" type="slider" arg="-xy %"
+ _label="XY rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="3"/>
+ <number id="xz" type="slider" arg="-xz %"
+ _label="XZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="yw" type="slider" arg="-yw %"
+ _label="YW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="10"/>
+ <number id="yz" type="slider" arg="-yz %"
+ _label="YZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="zw" type="slider" arg="-zw %"
+ _label="ZW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -color0 [magenta] -->
+ <!-- #### -color1 [yellow] -->
+ <!-- #### -color2 [#FF9300] -->
+ <!-- #### -color3 [#FF0093] -->
+ <!-- #### -color4 [green] -->
+ <!-- #### -color5 [#8080FF] -->
+ <!-- #### -color6 [#00D0FF] -->
+ <!-- #### -color7 [#00FFD0] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.10. It has been replaced by the more general "Polytopes"
+screen saver, which can display this object as well as others.
+
+This displays 2D projections of the sequence of 3D objects which are
+the projections of the 4D analog to the cube: as a square is composed
+of four lines, each touching two others; and a cube is composed of
+six squares, each touching four others; a hypercube is composed of
+eight cubes, each touching six others. To make it easier to
+visualize the rotation, it uses a different color for the edges of
+each face. Don't think about it too long, or your brain will melt.
+
+https://en.wikipedia.org/wiki/Hypercube
+https://en.wikipedia.org/wiki/Tesseract
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Joe Keane, Fritz Mueller, and Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hypertorus.xml b/hacks/config/hypertorus.xml
new file mode 100644
index 0000000..a82e090
--- /dev/null
+++ b/hacks/config/hypertorus.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hypertorus" _label="Hypertorus" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KJWe4G4Qa1Q"/>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <select id="display-mode">
+ <option id="wire" _label="Wireframe"
+ arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid"/>
+ <option id="transparent" _label="Transparent"
+ arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="solid" _label="Solid object"
+ arg-set="-appearance solid"/>
+ <option id="bands" _label="Transparent bands"/>
+ <option id="bands" _label="1 transparent spiral"
+ arg-set="-appearance spirals-1"/>
+ <option id="bands" _label="2 transparent spirals"
+ arg-set="-appearance spirals-2"/>
+ <option id="bands" _label="4 transparent spirals"
+ arg-set="-appearance spirals-4"/>
+ <option id="bands" _label="8 transparent spirals"
+ arg-set="-appearance spirals-8"/>
+ <option id="bands" _label="16 Transparent spirals"
+ arg-set="-appearance spirals-16"/>
+ </select>
+
+ <select id="colors">
+ <option id="twosided" _label="Two-sided" arg-set="-twosided"/>
+ <option id="colorwheel" _label="Color wheel"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="perspective-3d" _label="Perspective 3D"/>
+ <option id="orthographic-3d" _label="Orthographic 3D"
+ arg-set="-orthographic-3d"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="perspective-4d" _label="Perspective 4D"/>
+ <option id="orthographic-4d" _label="Orthographic 4D"
+ arg-set="-orthographic-4d"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+
+ <vgroup>
+
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+
+ </vgroup>
+
+ <vgroup>
+
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.7"/>
+
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.9"/>
+
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="2.1"/>
+
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Clifford Torus: a torus lying on the "surface" of a 4D hypersphere.
+Inspired by Thomas Banchoff's book "Beyond the Third Dimension:
+Geometry, Computer Graphics, and Higher Dimensions", Scientific
+American Library, 1990.
+
+https://en.wikipedia.org/wiki/N-sphere
+https://en.wikipedia.org/wiki/Clifford_torus
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Carsten Steger; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hypnowheel.xml b/hacks/config/hypnowheel.xml
new file mode 100644
index 0000000..ae8975c
--- /dev/null
+++ b/hacks/config/hypnowheel.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hypnowheel" _label="Hypnowheel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QcJnc9EKJrI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="20.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="symmetric" _label="Symmetric twisting" arg-set="-symmetric"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="layers" type="slider" arg="-layers %"
+ _label="Layers" _low-label="1" _high-label="50"
+ low="1" high="50" default="4"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Arms" _low-label="2" _high-label="50"
+ low="2" high="50" default="13"/>
+
+ <number id="twistiness" type="slider" arg="-twistiness %"
+ _label="Twistiness" _low-label="Low" _high-label="High"
+ low="0.2" high="10.0" default="4.0"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A overlapping, translucent spiral patterns.
+The tightness of their spirals fluctuates in and out.
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/ifs.xml b/hacks/config/ifs.xml
new file mode 100644
index 0000000..14999f4
--- /dev/null
+++ b/hacks/config/ifs.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ifs" _label="IFS">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=0uOIrVFsECM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="functions" type="slider" arg="-functions %"
+ _label="Number of functions" _low-label="2" _high-label="6"
+ low="2" high="6" default="3"/>
+
+ <number id="detail" type="slider" arg="-detail %"
+ _label="Detail" _low-label="Low" _high-label="High"
+ low="4" high="14" default="9"/>
+
+<!--
+ On a 2.93 gHz iMac i7, I get these rates with -delay 0:
+
+ detail 3: invisible
+ detail 4: barely visible
+ detail 5: 1000+ fps, looks like noise at -delay 0, ok at -delay 20000
+ detail 8: ~700+ fps
+ detail 9: ~400 fps
+ detail 10: ~300 fps
+ detail 11: ~100 fps
+ detail 12: ~50 fps
+ detail 13: ~17 fps
+ detail 14: ~8 fps
+ detail 15: ~2 fps
+
+ With the default -delay, CPU load only starts causing the frame rate
+ to drop below 30 fps detail 12 or higher.
+-->
+
+ <number id="colors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="2" _high-label="Many"
+ low="2" high="255" default="200" />
+
+ <hgroup>
+ <boolean id="translate" _label="Translate" arg-unset="-no-translate"/>
+ <boolean id="scale" _label="Scale" arg-unset="-no-scale"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Clouds of iterated function systems spin and collide.
+
+Note that the "Detail" parameter is exponential. Number of points
+drawn is functions^detail.
+
+https://en.wikipedia.org/wiki/Iterated_function_system
+
+Written by Chris Le Sueur and Robby Griffin; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/imsmap.xml b/hacks/config/imsmap.xml
new file mode 100644
index 0000000..f3d3cb2
--- /dev/null
+++ b/hacks/config/imsmap.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="imsmap" _label="IMSMap">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=FP8YJzFkdoQ"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 Second" _high-label="1 Minute"
+ low="1" high="60" default="5"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1" high="7" default="7"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="50"/>
+
+ <select id="mode">
+ <option id="random" _label="Random coloration"/>
+ <option id="h" _label="Hue gradients" arg-set="-mode h"/>
+ <option id="s" _label="Saturation gradients" arg-set="-mode s"/>
+ <option id="v" _label="Brightness gradients" arg-set="-mode v"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Cloud-like patterns. The idea is to take four points on the edge of
+the image, and assign each a random "elevation". Then find the point
+between them, and give it a value which is the average of the other
+four, plus some small random offset. Coloration is done based on
+elevation.
+
+Written by Juergen Nickelsen and Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/interaggregate.xml b/hacks/config/interaggregate.xml
new file mode 100644
index 0000000..c1ce7f3
--- /dev/null
+++ b/hacks/config/interaggregate.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="interaggregate" _label="Interaggregate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wqPOZiuj4RI"/>
+
+ <number id="speed" type="slider" arg="-growth-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="18000" convert="invert"/>
+
+ <number id="init" type="slider" arg="-num-circles %"
+ _label="Number of discs" _low-label="Few" _high-label="Many"
+ low="50" high="400" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Pale pencil-like scribbles slowly fill the screen.
+
+A surface is filled with a hundred medium to small sized circles.
+Each circle has a different size and direction, but moves at the same
+slow rate. Displays the instantaneous intersections of the circles as
+well as the aggregate intersections of the circles.
+
+Though actually it doesn't look like circles at all!
+
+Written by Casey Reas, William Ngan, Robert Hodgin, and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/interference.xml b/hacks/config/interference.xml
new file mode 100644
index 0000000..969d10c
--- /dev/null
+++ b/hacks/config/interference.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="interference" _label="Interference">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=nEmvx4l1sHI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="wspeed" type="slider" arg="-speed %"
+ _label="Wave speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="100" default="30"/>
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Wave size" _low-label="Small" _high-label="Large"
+ low="50" high="1500" default="800"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of waves" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="3"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="gridsize" type="slider" arg="-gridsize %"
+ _label="Magnification" _low-label="Low" _high-label="High"
+ low="1" high="20" default="2"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="192"/>
+
+ <number id="color_contrast" type="slider" arg="-color-shift %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="0" high="100" default="60"/>
+
+ <number id="hue" type="slider" arg="-hue %"
+ _label="Hue" _low-label="0" _high-label="360"
+ low="0" high="360" default="0"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Color field based on computing decaying sinusoidal waves.
+
+Written by Hannu Mallat; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/intermomentary.xml b/hacks/config/intermomentary.xml
new file mode 100644
index 0000000..6db1424
--- /dev/null
+++ b/hacks/config/intermomentary.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="intermomentary" _label="Intermomentary">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pH-ykepPopw"/>
+
+ <number id="speed" type="slider" arg="-draw-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000" convert="invert"/>
+
+ <number id="init" type="slider" arg="-num-discs %"
+ _label="Number of discs" _low-label="50" _high-label="400"
+ low="50" high="400" default="85"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Blinking dots interact with each other circularly.
+
+A surface is filled with a hundred medium to small sized circles.
+Each circle has a different size and direction, but moves at the same
+slow rate. Displays the instantaneous intersections of the circles as
+well as the aggregate intersections of the circles.
+
+The circles begin with a radius of 1 pixel and slowly increase to some
+arbitrary size. Circles are drawn with small moving points along the
+perimeter. The intersections are rendered as glowing orbs. Glowing
+orbs are rendered only when a perimeter point moves past the
+intersection point.
+
+Written by Casey Reas, William Ngan, Robert Hodgin, and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/jigglypuff.xml b/hacks/config/jigglypuff.xml
new file mode 100644
index 0000000..832bbef
--- /dev/null
+++ b/hacks/config/jigglypuff.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="jigglypuff" _label="JigglyPuff" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=60vfs2WcDtE"/>
+
+ <hgroup>
+ <boolean id="random" _label="Randomize almost everything" arg-unset="-no-random"/>
+
+ <select id="color">
+ <option id="cycle" _label="Cycle" />
+ <option id="flowerbox" _label="Flower box" arg-set="-color flowerbox"/>
+ <option id="clownbarf" _label="Clown barf" arg-set="-color clownbarf"/>
+ <option id="chrome" _label="Chrome" arg-set="-color chrome"/>
+ </select>
+
+ <select id="start">
+ <option id="sphere" _label="Sphere" />
+ <option id="tetrahedron" _label="Tetrahedron" arg-set="-tetra"/>
+ </select>
+
+ <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Rotation speed" _low-label="Slow" _high-label="Fast"
+ low="50" high="1000" default="500"/>
+
+ <number id="damping" type="slider" arg="-damping %"
+ _label="Inertial damping" _low-label="Low" _high-label="High"
+ low="10" high="1000" default="500" convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="hold" type="slider" arg="-hold %"
+ _label="Vertex-vertex force" _low-label="None" _high-label="Strong"
+ low="0" high="1000" default="800"/>
+
+ <number id="complexity" type="slider" arg="-complexity %"
+ _label="Complexity" _low-label="Low" _high-label="High"
+ low="1" high="3" default="2"/>
+
+ <number id="spherism" type="slider" arg="-spherism %"
+ _label="Sphere strength" _low-label="None" _high-label="Strong"
+ low="0" high="1000" default="75"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="distance" type="slider" arg="-distance %"
+ _label="Vertex-vertex behavior" _low-label="Expand"
+ _high-label="Collapse" low="0" high="1000" default="100"/>
+
+ <number id="spooky" type="slider" arg="-spooky %"
+ _label="Spookiness" _low-label="None" _high-label="Spoooooky"
+ low="0" high="12" default="0"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Quasi-spherical objects are distorted.
+
+You have a tetrahedron with tesselated faces. The vertices on these
+faces have forces on them: one proportional to the distance from the
+surface of a sphere; and one proportional to the distance from the
+neighbors. They also have inertia. The resulting effect can range
+from a shape that does nothing, to a frenetic polygon storm.
+Somewhere in between there it usually manifests as a blob that jiggles
+in a kind of disturbing manner.
+
+Written by Keith Macleod; 2003.
+ </_description>
+
+</screensaver>
+
+
+
+
+
+
+
+
diff --git a/hacks/config/jigsaw.xml b/hacks/config/jigsaw.xml
new file mode 100644
index 0000000..219a534
--- /dev/null
+++ b/hacks/config/jigsaw.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="jigsaw" _label="Jigsaw" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=T5_hiY2eEeo"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="density" type="slider" arg="-complexity %"
+ _label="Puzzle pieces" _low-label="Few" _high-label="Many"
+ low="1.0" high="4.0" default="1.0"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Chunky" _high-label="Smooth"
+ low="50" high="300" default="100"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ <vgroup>
+ <boolean id="wobble" _label="Tilt" arg-unset="-no-wobble"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Carves an image up into a jigsaw puzzle, shuffles it, and solves it.
+
+https://en.wikipedia.org/wiki/Jigsaw_puzzle
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/juggle.xml b/hacks/config/juggle.xml
new file mode 100644
index 0000000..8c8c05a
--- /dev/null
+++ b/hacks/config/juggle.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="juggle" _label="Juggle">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=E3Ae7uQtWP0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="50" high="1000" default="200"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Performance length" _low-label="Short" _high-label="Long"
+ low="50" high="1000" default="1000"/>
+
+ <number id="tail" type="slider" arg="-tail %"
+ _label="Trail length" _low-label="None" _high-label="Long"
+ low="0" high="100" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="balls" _label="Balls" arg-unset="-no-balls"/>
+ <boolean id="clubs" _label="Clubs" arg-unset="-no-clubs"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="rings" _label="Rings" arg-unset="-no-rings"/>
+ <boolean id="knives" _label="Knives" arg-unset="-no-knives"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="torches" _label="Flaming torches" arg-unset="-no-torches"/>
+ <boolean id="bballs" _label="Bowling balls" arg-unset="-no-bballs"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="describe" _label="Print Cambridge juggling pattern descriptions" arg-unset="-no-describe"/>
+ <string id="pattern" _label="Juggle this pattern" arg="-pattern %" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.09. It has been replaced by the "Juggler3D" screen saver.
+
+Written by Tim Auckland; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/juggler3d.xml b/hacks/config/juggler3d.xml
new file mode 100644
index 0000000..0e136f2
--- /dev/null
+++ b/hacks/config/juggler3d.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="juggler3d" _label="Juggler3D" gl="yes">
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TJkKaXBOvCA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="50" high="1000" default="200"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Performance length" _low-label="Short" _high-label="Long"
+ low="50" high="1000" default="1000"/>
+
+ <number id="tail" type="slider" arg="-tail %"
+ _label="Trail length" _low-label="None" _high-label="Long"
+ low="0" high="100" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="balls" _label="Balls" arg-unset="-no-balls"/>
+ <boolean id="clubs" _label="Clubs" arg-unset="-no-clubs"/>
+ <boolean id="rings" _label="Rings" arg-unset="-no-rings"/>
+ <boolean id="knives" _label="Knives" arg-unset="-no-knives"/>
+<!--<boolean id="torches" _label="Flaming torches" arg-unset="-no-torches"/>-->
+ <boolean id="bballs" _label="Bowling balls" arg-unset="-no-bballs"/>
+ </hgroup>
+
+ <boolean id="describe" _label="Print Cambridge juggling pattern descriptions" arg-unset="-no-describe"/>
+ <string id="pattern" _label="Juggle this pattern" arg="-pattern %" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A 3D juggling stick-man, with Cambridge juggling pattern
+notation used to describe the patterns he juggles.
+
+https://en.wikipedia.org/wiki/Siteswap
+
+Written by Tim Auckland and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/julia.xml b/hacks/config/julia.xml
new file mode 100644
index 0000000..f648197
--- /dev/null
+++ b/hacks/config/julia.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="julia" _label="Julia">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=cA4Rgq-rmy8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Lots"
+ low="10" high="20000" default="1000"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Iterations" _low-label="Small" _high-label="Large"
+ low="1" high="100" default="20"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Julia set is a close relative of the Mandelbrot set. The
+small moving dot indicates the control point from which the rest of
+the image was generated. See also the "Discrete" screen saver.
+
+https://en.wikipedia.org/wiki/Julia_set
+
+Written by Sean McCullough; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/kaleidescope.xml b/hacks/config/kaleidescope.xml
new file mode 100644
index 0000000..ccfc18f
--- /dev/null
+++ b/hacks/config/kaleidescope.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="kaleidescope" _label="Kaleidescope">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mGplFlx1y3M"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="nsegments" type="slider" arg="-nsegments %"
+ _label="Segments" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="7"/>
+
+ <number id="symmetry" type="slider" arg="-symmetry %"
+ _label="Symmetry" _low-label="3" _high-label="32"
+ low="3" high="32" default="11"/>
+
+ <number id="ntrails" type="slider" arg="-ntrails %"
+ _label="Trails" _low-label="Few" _high-label="Many"
+ low="1" high="1000" default="100"/>
+
+ <!-- #### -local_rotation [-59] -->
+ <!-- #### -global_rotation [1] -->
+ <!-- #### -spring_constant [5] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A simple kaleidoscope made of line segments. See "GLeidescope"
+for a more sophisticated take.
+
+https://en.wikipedia.org/wiki/Kaleidoscope
+
+Written by Ron Tapia; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/kaleidocycle.xml b/hacks/config/kaleidocycle.xml
new file mode 100644
index 0000000..06228d2
--- /dev/null
+++ b/hacks/config/kaleidocycle.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="kaleidocycle" _label="Kaleidocycle" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=SJqRaCCy_vo"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="8" _high-label="64"
+ low="8" high="64" default="16"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
+ </select>
+
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Draw a ring composed of tetrahedra connected at the edges that twists
+and rotates toroidally.
+
+When a series of tetrahedra are joined at the edges in a loop, it is
+possible for them to rotate continously through the center without
+deforming. This only works with an even number of tetrahedra, and
+there must be eight or more, or they don't fit.
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/klein.xml b/hacks/config/klein.xml
new file mode 100644
index 0000000..8a93c9e
--- /dev/null
+++ b/hacks/config/klein.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="klein" _label="Klein" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=c2gvyGVNG80"/>
+
+ <hgroup>
+ <select id="kleinbottle">
+ <option id="random" _label="Random shape"/>
+ <option id="figure-8" _label="Figure 8" arg-set="-klein-bottle figure-8"/>
+ <option id="squeezed-torus" _label="Squeezed torus" arg-set="-klein-bottle squeezed-torus"/>
+ <option id="lawson" _label="Lawson" arg-set="-klein-bottle lawson"/>
+ </select>
+
+ <select id="view-mode">
+ <option id="walk" _label="Random motion"/>
+ <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
+ <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
+ <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
+ </select>
+
+ <boolean id="orientation-marks" _label="Show orientation marks"
+ arg-set="-orientation-marks"/>
+ </hgroup>
+
+ <hgroup>
+ <select id="display-mode">
+ <option id="random" _label="Random surface"/>
+ <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="random" _label="Random pattern"/>
+ <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
+ <option id="bands" _label="See-through bands" arg-set="-appearance bands"/>
+ </select>
+
+ <select id="colors">
+ <option id="random" _label="Random coloration"/>
+ <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
+ <option id="rainbow" _label="Rainbow colors" arg-set="-colors rainbow"/>
+ <option id="depth" _label="4d depth colors" arg-set="-colors depth"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="random" _label="Random 3D"/>
+ <option id="perspective-3d" _label="Perspective 3D" arg-set="-projection-3d perspective"/>
+ <option id="orthographic-3d" _label="Orthographic 3D" arg-set="-projection-3d orthographic"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="random" _label="Random 4D"/>
+ <option id="perspective-4d" _label="Perspective 4D" arg-set="-projection-4d perspective"/>
+ <option id="orthographic-4d" _label="Orthographic 4D" arg-set="-projection-4d orthographic"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.7"/>
+
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.9"/>
+
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="2.1"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="walk-direction" type="slider" arg="-walk-direction %"
+ _label="Walking direction"
+ _low-label="-180.0" _high-label="180.0"
+ low="-180.0" high="180.0" default="7.0"/>
+
+ <number id="walk-speed" type="slider" arg="-walk-speed %"
+ _label="Walking speed"
+ _low-label="1.0" _high-label="100.0"
+ low="1.0" high="100.0" default="20.0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Klein bottle is the 4D analog of a moebius strip.
+
+You can walk on the surface of the bottle or rotate it in 4D or walk
+on it while it rotates in 4D. Inspired by Thomas Banchoff's book
+"Beyond the Third Dimension: Geometry, Computer Graphics, and Higher
+Dimensions", Scientific American Library, 1990.
+
+https://en.wikipedia.org/wiki/Klein_bottle
+
+Written by Carsten Steger; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/kumppa.xml b/hacks/config/kumppa.xml
new file mode 100644
index 0000000..85f7ee2
--- /dev/null
+++ b/hacks/config/kumppa.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="kumppa" _label="Kumppa">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=64ULSfxhkDY"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-speed %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="0.0001" high="0.2" default="0.1"/>
+
+ <boolean id="random" _label="Randomize" arg-unset="-no-random"/>
+<!-- <boolean id="db" _label="Double buffer" arg-set="-db"/> -->
+
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Spiraling, spinning, and very, very fast splashes of color rush
+toward the screen.
+
+Written by Teemu Suutari; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lament.xml b/hacks/config/lament.xml
new file mode 100644
index 0000000..7f0de9d
--- /dev/null
+++ b/hacks/config/lament.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lament" _label="Lament" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-TBqI4YKOKI"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Lemarchand's Box, the Lament Configuration.
+
+Warning: occasionally opens doors.
+
+https://en.wikipedia.org/wiki/Lemarchand%27s_box
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/laser.xml b/hacks/config/laser.xml
new file mode 100644
index 0000000..4694cca
--- /dev/null
+++ b/hacks/config/laser.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="laser" _label="Laser">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QjPEa3KDlsw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="0" high="20" default="10"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="2000" default="200"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Moving radiating lines, that look vaguely like scanning laser beams.
+(Frankie say relax.)
+
+Written by Pascal Pensa; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lavalite.xml b/hacks/config/lavalite.xml
new file mode 100644
index 0000000..5e7d4f7
--- /dev/null
+++ b/hacks/config/lavalite.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lavalite" _label="Lavalite" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=XKbtdHL35u0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Activity" _low-label="Sparse" _high-label="Dense"
+ low="0.001" high="0.01" default="0.003"/>
+ </vgroup>
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Max blobs" _low-label="1" _high-label="10"
+ low="1" high="10" default="3"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Low" _high-label="High"
+ low="10" high="120" default="40"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+
+ <hgroup>
+ <boolean id="impatient" _label="Impatient" arg-set="-impatient"/>
+ <boolean id="smooth" _label="Smooth" arg-unset="-no-smooth"/>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ <vgroup>
+
+ <select id="style">
+ <option id="classic" _label="Classic Lavalite" arg-set="-style classic"/>
+ <option id="giant" _label="Giant Lavalite" arg-set="-style giant"/>
+ <option id="cone" _label="Cone Lavalite" arg-set="-style cone"/>
+ <option id="rocket" _label="Rocket Lavalite" arg-set="-style rocket"/>
+ <option id="random" _label="Random Lamp Style"/>
+ </select>
+
+ <select id="rotation">
+ <option id="no" _label="Don't Rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
+ </select>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Simulation a Lava Lite(r). Odd-shaped blobs of a mysterious
+substance are heated, slowly rise to the top of the bottle, and then
+drop back down as they cool. This simulation requires a fairly fast
+machine (both CPU and 3D performance.)
+
+"LAVA LITE(r) and the configuration of the LAVA(r) brand motion lamp are
+registered trademarks of Haggerty Enterprises, Inc. The configuration
+of the globe and base of the motion lamp are registered trademarks of
+Haggerty Enterprises, Inc. in the U.S.A. and in other countries around
+the world."
+
+https://en.wikipedia.org/wiki/Lava_lamp
+https://en.wikipedia.org/wiki/Metaballs
+https://en.wikipedia.org/wiki/Lavarand
+
+Written by Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lcdscrub.xml b/hacks/config/lcdscrub.xml
new file mode 100644
index 0000000..c92b125
--- /dev/null
+++ b/hacks/config/lcdscrub.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lcdscrub" _label="LCDscrub">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aWtHHBOkO4w"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="5000000" default="100000"
+ convert="invert"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="spread" type="spinbutton" arg="-spread %"
+ _label="Line spread" low="2" high="8192" default="8"/>
+ <number id="cycles" type="spinbutton" arg="-cycles %"
+ _label="Cycles" low="1" high="600" default="60"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="hw" _label="Horizontal white" arg-unset="-no-hw"/>
+ <boolean id="vw" _label="Vertical white" arg-unset="-no-vw"/>
+ <boolean id="dw" _label="Diagonal white" arg-unset="-no-dw"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="w" _label="Solid white" arg-unset="-no-w"/>
+ <boolean id="rgb" _label="Primary colors" arg-unset="-no-rgb"/>
+ <boolean id="hb" _label="Horizontal black" arg-unset="-no-hb"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="vb" _label="Vertical black" arg-unset="-no-vb"/>
+ <boolean id="db" _label="Diagonal black" arg-unset="-no-db"/>
+ <boolean id="b" _label="Solid black" arg-unset="-no-b"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+repairs burn-in on LCD monitors. This saver is functional,
+rather than pretty.
+
+Believe it or not, screen burn is not a thing of the past.
+It can happen to LCD screens pretty easily, even in this modern age.
+However, leaving the screen on and displaying high contrast images
+can often repair the damage. That's what this screen saver does.
+
+See also:
+http://docs.info.apple.com/article.html?artnum=88343
+http://toastycode.com/blog/2008/02/05/lcd-scrub/
+
+Inspired by the like-named program by Daniel Sandler.
+
+Written by Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lightning.xml b/hacks/config/lightning.xml
new file mode 100644
index 0000000..8e602fe
--- /dev/null
+++ b/hacks/config/lightning.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lightning" _label="Lightning">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lUUdHtPvp5Y"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Crackling fractal lightning bolts.
+
+Written by Keith Romberg; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lisa.xml b/hacks/config/lisa.xml
new file mode 100644
index 0000000..d142fad
--- /dev/null
+++ b/hacks/config/lisa.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lisa" _label="Lisa">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AUbAuARmlnE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="50000" default="17000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Steps" _low-label="Few" _high-label="Many"
+ low="1" high="1000" default="768"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _label="Size" _low-label="Small" _high-label="Large"
+ low="10" high="500" default="500"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="1" _high-label="20"
+ low="0" high="20" default="1"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Lissajous loops.
+
+https://en.wikipedia.org/wiki/Lissajous_curve
+
+Written by Caleb Cullen; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lissie.xml b/hacks/config/lissie.xml
new file mode 100644
index 0000000..ca165a4
--- /dev/null
+++ b/hacks/config/lissie.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lissie" _label="Lissie">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=6EBNCXcD9f0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="80000" default="20000"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="1" _high-label="20"
+ low="0" high="20" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-500" high="500" default="-200"/>
+ </vgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Lissajous loops. This one draws the progress of circular shapes along a path.
+
+https://en.wikipedia.org/wiki/Lissajous_curve
+
+Written by Alexander Jolk; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lmorph.xml b/hacks/config/lmorph.xml
new file mode 100644
index 0000000..f0920b3
--- /dev/null
+++ b/hacks/config/lmorph.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lmorph" _label="LMorph">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=yMbMB7xQMkA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="70000"
+ convert="invert"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Control points" _low-label="Few" _high-label="Many"
+ low="10" high="1000" default="200"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="steps" type="slider" arg="-steps %"
+ _label="Interpolation steps" _low-label="Less" _high-label="More"
+ low="100" high="500" default="150"/>
+
+ <number id="thickness" type="slider" arg="-linewidth %"
+ _label="Lines" _low-label="Thin" _high-label="Thick"
+ low="1" high="50" default="5"/>
+ </vgroup>
+ </hgroup>
+
+ <select id="type">
+ <option id="random" _label="Open and closed figures"/>
+ <option id="open" _label="Open figures" arg-set="-figtype open"/>
+ <option id="closed" _label="Closed figures" arg-set="-figtype closed"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+This generates random spline-ish line drawings and morphs between
+them.
+
+Written by Sverre H. Huseby and Glenn T. Lines; 1995.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lockward.xml b/hacks/config/lockward.xml
new file mode 100644
index 0000000..1a44ddd
--- /dev/null
+++ b/hacks/config/lockward.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lockward" _label="Lockward" gl="yes">
+
+ <command arg="-root" />
+
+ <video href="https://www.youtube.com/watch?v=MGwySGVQZ2M"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="rotateidle-min" type="slider"
+ _label="Miniumum rotator idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="10000" default="1000" arg="-rotateidle-min %" />
+
+ <number id="blinkidle-min" type="slider"
+ _label="Minimum blink idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="20000" default="1000" arg="-blinkidle-min %" />
+
+ <number id="blinkdwell-min" type="slider"
+ _label="Minimum blink dwell time"
+ _low-label="Low" _high-label="High"
+ low="50" high="1500" default="100" arg="-blinkdwell-min %" />
+
+ <hgroup>
+ <boolean id="blink"
+ _label="Blinking effects"
+ arg-unset="-no-blink" />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="rotateidle-max" type="slider"
+ _label="Maximum rotator idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="10000" default="6000" arg="-rotateidle-max %" />
+
+ <number id="blinkidle-max" type="slider"
+ _label="Maximum blink idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="20000" default="9000" arg="-blinkidle-max %" />
+
+ <number id="blinkdwell-max" type="slider"
+ _label="Maximum blink dwell time"
+ _low-label="Low" _high-label="High"
+ low="50" high="1500" default="600" arg="-blinkdwell-max %" />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A translucent spinning, blinking thing. Sort of a cross between the wards
+in an old combination lock and those old backlit information displays that
+animated and changed color via polarized light.
+
+Written by Leo L. Schwab; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/loop.xml b/hacks/config/loop.xml
new file mode 100644
index 0000000..65571c0
--- /dev/null
+++ b/hacks/config/loop.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="loop" _label="Loop">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_kTMO7oEN8U"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="100000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="8000" default="1600"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="15"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-50" high="50" default="-12"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A cellular automaton that generates loop-shaped colonies that spawn,
+age, and eventually die.
+
+https://en.wikipedia.org/wiki/Langton%27s_loops
+
+Written by David Bagley; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/m6502.xml b/hacks/config/m6502.xml
new file mode 100644
index 0000000..5738921
--- /dev/null
+++ b/hacks/config/m6502.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="m6502" _label="m6502">
+
+ <command arg="-root" />
+
+ <video href="https://www.youtube.com/watch?v=KlDw0nYwUe4"/>
+
+ <file id="file" _label="Assembly file" arg="-file %"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="displaytime" type="slider" arg="-displaytime %"
+ _label="Display time for each program"
+ _low-label="5 seconds" _high-label="2 minutes"
+ low="5.0" high="120.0" default="30.0" />
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="ips" type="slider" arg="-ips %"
+ _label="Instructions per second"
+ _low-label="500" _high-label="120000"
+ low="500" high="120000" default="15000" />
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Emulates a 6502 microprocessor, and runs some example programs on it.
+
+The family of 6502 chips were used throughout the 70's and 80's in
+machines such as the Atari 2600, Commodore PET, VIC20 and C64, Apple
+][, and the NES. Some example programs are included, and it can also
+read in an assembly file as input.
+
+Original JavaScript Version by Stian Soreng: http://www.6502asm.com/.
+Ported to XScreenSaver by Jeremy English.
+
+Written by Stian Soreng and Jeremy English; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/maze.xml b/hacks/config/maze.xml
new file mode 100644
index 0000000..83b5b92
--- /dev/null
+++ b/hacks/config/maze.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="maze" _label="Maze">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-u4neMXIRA8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-solve-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <select id="generator">
+ <option id="mrandom" _label="Random maze generator"/>
+ <option id="m0" _label="Depth-first backtracking maze generator"
+ arg-set="-generator 0"/>
+ <option id="m1" _label="Wall-building maze generator (Prim)"
+ arg-set="-generator 1"/>
+ <option id="m2" _label="Set-joining maze generator (Kruskal)"
+ arg-set="-generator 2"/>
+ </select>
+
+ <hgroup>
+ <select id="ignorance">
+ <option id="smart" _label="Head toward exit"/>
+ <option id="dumb" _label="Ignorant of exit direction"
+ arg-set="-ignorant"/>
+ </select>
+
+ </hgroup>
+
+ <hgroup>
+ <number id="grid-size" type="spinbutton" arg="-grid-size %"
+ _label="Grid size" low="0" high="100" default="0"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="pre-delay" type="slider" arg="-pre-delay %"
+ _label="Linger before solving"
+ _low-label="0 seconds" _high-label="10 seconds"
+ low="0" high="10000000" default="2000000"/>
+
+ <number id="post-delay" type="slider" arg="-post-delay %"
+ _label="Linger after solving"
+ _low-label="0 seconds" _high-label="10 seconds"
+ low="0" high="10000000" default="4000000"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+
+ <_description>
+Generates random mazes, with three different algorithms: Kruskal,
+Prim, and a depth-first recursive backtracker. It also solves them.
+Backtracking and look-ahead paths are displayed in different colors.
+
+https://en.wikipedia.org/wiki/Maze_generation_algorithm
+https://en.wikipedia.org/wiki/Maze_solving_algorithm
+
+Written by Martin Weiss, Dave Lemke, Jim Randell, Jamie Zawinski,
+Johannes Keukelaar, and Zack Weinberg; 1985.
+ </_description>
+</screensaver>
diff --git a/hacks/config/maze3d.xml b/hacks/config/maze3d.xml
new file mode 100755
index 0000000..ac578da
--- /dev/null
+++ b/hacks/config/maze3d.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="maze3d" _label="Maze3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=VTAwxTVdyLc"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.02" high="4.0" default="1.0"/>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+ <hgroup>
+ <boolean id="showOverlay" _label="Show Overlay" arg-set="-overlay"/>
+ <boolean id="acid" _label="Acid" arg-set="-drop-acid"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="numRows" type="spinbutton" arg="-rows %"
+ _label="Rows" low="2" high="24" default="12"/>
+ <number id="numColumns" type="spinbutton" arg="-columns %"
+ _label="Columns" low="2" high="24" default="12"/>
+ </hgroup>
+
+<!--
+ <hgroup>
+ <file id="wallTextureFile" _label="Wall Texture" arg="-wall-texture %"/>
+ <select id="wallTextureSelect">
+ <option id="wallTextureBrickWall" _label="Brick Wall"/>
+ <option id="wallTextureWoodFloor" _label="Wood Floor"
+ arg-set="-wall-texture wood-floor"/>
+ <option id="wallTextureCeilingTiles" _label="Ceiling Tiles"
+ arg-set="-wall-texture ceiling-tiles"/>
+ <option id="wallTextureFractal1" _label="Fractal 1"
+ arg-set="-wall-texture fractal-1"/>
+ <option id="wallTextureFractal2" _label="Fractal 2"
+ arg-set="-wall-texture fractal-2"/>
+ <option id="wallTextureFractal3" _label="Fractal 3"
+ arg-set="-wall-texture fractal-3"/>
+ <option id="wallTextureFractal4" _label="Fractal 4"
+ arg-set="-wall-texture fractal-4"/>
+ </select>
+ <boolean id="dropAcidWalls" _label="Drop acid"
+ arg-set="-drop-acid-walls"/>
+ </hgroup>
+
+ <hgroup>
+ <file id="floorTextureFile" _label="Floor Texture"
+ arg="-floor-texture %"/>
+ <select id="floorTextureSelect">
+ <option id="floorTextureWoodFloor" _label="Wood Floor"/>
+ <option id="floorTextureBrickWall" _label="Brick Wall"
+ arg-set="-floor-texture brick-wall"/>
+ <option id="floorTextureCeilingTiles" _label="Ceiling Tiles"
+ arg-set="-floor-texture ceiling-tiles"/>
+ <option id="floorTextureFractal1" _label="Fractal 1"
+ arg-set="-floor-texture fractal-1"/>
+ <option id="floorTextureFractal2" _label="Fractal 2"
+ arg-set="-floor-texture fractal-2"/>
+ <option id="floorTextureFractal3" _label="Fractal 3"
+ arg-set="-floor-texture fractal-3"/>
+ <option id="floorTextureFractal4" _label="Fractal 4"
+ arg-set="-floor-texture fractal-4"/>
+ </select>
+ <boolean id="dropAcidFloor" _label="Drop acid"
+ arg-set="-drop-acid-floor"/>
+ </hgroup>
+
+ <hgroup>
+ <file id="ceilingTextureFile" _label="Ceiling Texture"
+ arg="-ceiling-texture %"/>
+ <select id="ceilingTextureSelect">
+ <option id="ceilingTextureCeilingTiles" _label="Ceiling Tiles"/>
+ <option id="ceilingTextureBrickWall" _label="Brick Wall"
+ arg-set="-ceiling-texture brick-wall"/>
+ <option id="ceilingTextureWoodFloor" _label="Wood Floor"
+ arg-set="-ceiling-texture wood-floor"/>
+ <option id="ceilingTextureFractal1" _label="Fractal 1"
+ arg-set="-ceiling-texture fractal-1"/>
+ <option id="ceilingTextureFractal2" _label="Fractal 2"
+ arg-set="-ceiling-texture fractal-2"/>
+ <option id="ceilingTextureFractal3" _label="Fractal 3"
+ arg-set="-ceiling-texture fractal-3"/>
+ <option id="ceilingTextureFractal4" _label="Fractal 4"
+ arg-set="-ceiling-texture fractal-4"/>
+ </select>
+ <boolean id="dropAcidCeiling" _label="Drop acid"
+ arg-set="-drop-acid-ceiling"/>
+ </hgroup>
+-->
+
+ <hgroup>
+ <number id="numInverters" type="spinbutton"
+ arg="-inverters %" _label="Inverters" low="0"
+ high="100" default="10"/>
+ <number id="numRats" type="spinbutton"
+ arg="-rats %" _label="Rats" low="0" high="100"
+ default="1"/>
+
+<!--
+ <vgroup>
+ <number id="numGl3dTexts" type="spinbutton"
+ arg="-gl-3d-texts %" _label="OpenGL"
+ low="0" high="100" default="3"/>
+ <number id="numGlRedbooks" type="spinbutton"
+ arg="-gl-redbooks %" _label="Redbooks"
+ low="0" high="100" default="3"/>
+ </vgroup>
+-->
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A re-creation of the 3D Maze screensaver from Windows 95.
+Written by Sudoer; 2018.
+</_description>
+</screensaver>
diff --git a/hacks/config/memscroller.xml b/hacks/config/memscroller.xml
new file mode 100644
index 0000000..ccb6c0a
--- /dev/null
+++ b/hacks/config/memscroller.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="memscroller" _label="MemScroller">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=DQJRNlTKCdA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <hgroup>
+ <select id="seedMode">
+ <option id="ram" _label="Dump memory"/>
+ <option id="random" _label="Draw random numbers" arg-set="-random"/>
+ </select>
+
+ <select id="drawMode">
+ <option id="color" _label="Draw in RGB"/>
+ <option id="mono" _label="Draw green" arg-set="-mono"/>
+ </select>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Scrolls a dump of its own memory in three windows at three different rates.
+
+Written by Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/menger.xml b/hacks/config/menger.xml
new file mode 100644
index 0000000..760167e
--- /dev/null
+++ b/hacks/config/menger.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="menger" _label="Menger" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=qpnuNJH9cLw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="descent" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="500" default="150"
+ convert="invert"/>
+
+ <number id="depth" type="spinbutton" arg="-depth %"
+ _label="Max depth" low="1" high="6" default="3"/>
+
+ <!-- #### -no-optimize -->
+
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Menger Gasket is a cube-based recursive fractal object
+analagous to the Sierpinski Tetrahedron.
+
+https://en.wikipedia.org/wiki/Menger_sponge
+https://en.wikipedia.org/wiki/Sierpinski_carpet
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/metaballs.xml b/hacks/config/metaballs.xml
new file mode 100644
index 0000000..0d1a218
--- /dev/null
+++ b/hacks/config/metaballs.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="metaballs" _label="MetaBalls">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wcdKHCp9foY"/>
+
+ <!-- #### -color [random] -->
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="100" high="3000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="256" default="256"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Metaball count" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="10"/>
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="MetaBall Radius" _low-label="Small" _high-label="Big" low="2" high="100" default="100"/>
+
+ <number id="delta" type="slider" arg="-delta %"
+ _label="MetaBall Movement" _low-label="Small" _high-label="Big" low="1" high="20" default="3"/>
+
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+2D meta-balls: overlapping and merging balls with fuzzy edges.
+
+https://en.wikipedia.org/wiki/Metaballs
+
+Written by W.P. van Paassen; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/mirrorblob.xml b/hacks/config/mirrorblob.xml
new file mode 100644
index 0000000..74b1015
--- /dev/null
+++ b/hacks/config/mirrorblob.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="mirrorblob" _label="MirrorBlob" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=o4GTO18KHe8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Zoom"
+ _low-label="0.1x" _high-label="3.0x"
+ low="0.1" high="3.0" default="1.0"/>
+
+ <number id="hold_time" type="slider" arg="-hold-time %"
+ _label="Time until loading a new image"
+ _low-label="5 sec" _high-label="5 min"
+ low="5.0" high="300.0" default="30.0"/>
+
+ <number id="fade_speed" type="slider" arg="-fade-time %"
+ _label="Transition duration"
+ _low-label="None" _high-label="30 sec"
+ low="0.0" high="30.0" default="5.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="resolution" type="slider" arg="-resolution %"
+ _low-label="Low" _high-label="High"
+ _label="Resolution" low="4" high="50" default="30"/>
+
+ <number id="bumps" type="slider" arg="-bumps %"
+ _low-label="None" _high-label="50 bumps"
+ _label="Bumps" low="0" high="50" default="10"/>
+
+ <number id="blend" type="slider" arg="-blend %"
+ _low-label="Clear" _high-label="Opaque"
+ _label="Transparency" low="0.1" high="1.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="walls" _label="Enable walls" arg-set="-walls"/>
+ <boolean id="colour" _label="Enable colouring" arg-set="-colour"/>
+ <boolean id="texture" _label="Enable reflected image" arg-unset="-no-texture"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="backgound" _label="Show image on background" arg-unset="-no-paint-background"/>
+ <boolean id="offset_texture" _label="Offset texture coordinates" arg-set="-offset-texture"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="render">
+ <option id="wire" _label="Wireframe" arg-set="-wire"/>
+ <option id="solid" _label="Solid surface"/>
+ </select>
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-image />
+ <xscreensaver-updater />
+
+ <_description>
+A wobbly blob distorts images behind it.
+
+Written by Jon Dowdall; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/mismunch.xml b/hacks/config/mismunch.xml
new file mode 100644
index 0000000..02a258f
--- /dev/null
+++ b/hacks/config/mismunch.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="mismunch" _label="Mismunch">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-clear %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="200" default="65"/>
+
+ <number id="simultaneous" type="slider" arg="-simul %"
+ _label="Simultaneous squares" _low-label="One" _high-label="Many"
+ low="1" high="20" default="5"/>
+
+ <select id="mode">
+ <option id="xor" _label="XOR"/>
+ <option id="solid" _label="Solid" arg-set="-no-xor"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08. It was merged with the "Munch" screen saver.
+
+Munching errors! This is a creatively broken misimplementation of the
+classic munching squares graphics hack. See the "Munch" screen saver
+for the original.
+
+https://en.wikipedia.org/wiki/HAKMEM
+https://en.wikipedia.org/wiki/Munching_square
+
+Written by Steven Hazel; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moebius.xml b/hacks/config/moebius.xml
new file mode 100644
index 0000000..324c527
--- /dev/null
+++ b/hacks/config/moebius.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moebius" _label="Moebius" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=77Nib6jQrXc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="solid" _label="Solid floor" arg-set="-solidmoebius"/>
+ <boolean id="ants" _label="Draw ants" arg-unset="-no-ants"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+M. C. Escher's "Moebius Strip II", an image of ants walking along the
+surface of a moebius strip.
+
+https://en.wikipedia.org/wiki/Moebius_strip
+https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
+
+Written by Marcelo F. Vianna; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moebiusgears.xml b/hacks/config/moebiusgears.xml
new file mode 100644
index 0000000..9233f91
--- /dev/null
+++ b/hacks/config/moebiusgears.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moebiusgears" _label="MoebiusGears" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=kpT6j2-9b40"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of gears" low="13" high="99" default="17"/>
+
+ <number id="teeth" type="spinbutton" arg="-teeth %"
+ _label="Number of teeth" low="7" high="49" default="15"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+An interlinked loop of rotating gears. The layout of the gears
+follows the path of a moebius strip. See also the "Pinion" and
+"Gears" screen savers.
+
+https://en.wikipedia.org/wiki/Involute_gear
+https://en.wikipedia.org/wiki/Moebius_strip
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moire.xml b/hacks/config/moire.xml
new file mode 100644
index 0000000..9c3f558
--- /dev/null
+++ b/hacks/config/moire.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moire" _label="Moire">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=S50zFVcUe4s"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <number id="offset" type="slider" arg="-offset %"
+ _label="Offset" _low-label="Small" _high-label="Large"
+ low="1" high="200" default="50"/>
+
+ <!-- #### -no-random -->
+
+<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+ When the lines on the screen
+ Make more lines in between,
+ That's a moire'!
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski and Michael Bayne; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moire2.xml b/hacks/config/moire2.xml
new file mode 100644
index 0000000..1785df3
--- /dev/null
+++ b/hacks/config/moire2.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moire2" _label="Moire2">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=7iBNbYCo8so"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="150"/>
+
+ <number id="thickness" type="spinbutton" arg="-thickness %"
+ _label="Thickness" low="0" high="100" default="0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates fields of concentric circles or ovals, and combines the
+planes with various operations. The planes are moving independently
+of one another, causing the interference lines to spray.
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/molecule.xml b/hacks/config/molecule.xml
new file mode 100644
index 0000000..fe1129b
--- /dev/null
+++ b/hacks/config/molecule.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="molecule" _label="Molecule" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=D1A0tNcPL4M"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="timeout" type="slider" arg="-timeout %"
+ _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
+ low="5" high="120" default="20"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="labels" _label="Label atoms" arg-unset="-no-labels"/>
+ <boolean id="titles" _label="Describe molecule" arg-unset="-no-titles"/>
+ <boolean id="bbox" _label="Draw bounding box" arg-set="-bbox"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="atoms" _label="Draw atomic nuclei" arg-unset="-no-atoms"/>
+ <boolean id="bonds" _label="Draw atomic bonds" arg-unset="-no-bonds"/>
+ <boolean id="shells" _label="Draw electron shells" arg-unset="-no-shells"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+ </hgroup>
+
+ <file id="molecule" _label="PDB file or directory" arg="-molecule %"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Some interesting molecules. Several molecules are built in, and it can
+also read PDB (Protein Data Bank) files as input.
+
+https://en.wikipedia.org/wiki/Protein_Data_Bank_%28file_format%29
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/morph3d.xml b/hacks/config/morph3d.xml
new file mode 100644
index 0000000..0122fb7
--- /dev/null
+++ b/hacks/config/morph3d.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="morph3d" _label="Morph3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lNtDppjOli4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <select id="object">
+ <option id="random" _label="Random object"/>
+ <option id="tetra" _label="Tetrahedron" arg-set="-count 1"/>
+ <option id="cube" _label="Cube" arg-set="-count 2"/>
+ <option id="octa" _label="Octahedron" arg-set="-count 3"/>
+ <option id="dodeca" _label="Dodecahedron" arg-set="-count 4"/>
+ <option id="icosa" _label="Icosahedron" arg-set="-count 5"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Platonic solids that turn inside out and get spikey.
+
+https://en.wikipedia.org/wiki/Platonic_solid
+
+Written by Marcelo Vianna; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/mountain.xml b/hacks/config/mountain.xml
new file mode 100644
index 0000000..de0eb4d
--- /dev/null
+++ b/hacks/config/mountain.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="mountain" _label="Mountain">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=knqnPcZGqkA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Peaks" _low-label="One" _high-label="Lots"
+ low="1" high="100" default="30"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates random 3D plots that look vaguely mountainous.
+
+Written by Pascal Pensa; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/munch.xml b/hacks/config/munch.xml
new file mode 100644
index 0000000..9875838
--- /dev/null
+++ b/hacks/config/munch.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="munch" _label="Munch">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-clear %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="200" default="65"/>
+
+ <number id="simultaneous" type="slider" arg="-simul %"
+ _label="Simultaneous squares" _low-label="One" _high-label="Many"
+ low="1" high="20" default="5"/>
+ </vgroup>
+ <vgroup>
+ <select id="mismunch">
+ <option id="random" _label="Munch or mismunch"/>
+ <option id="munch" _label="Munch only" arg-set="-classic"/>
+ <option id="mismunch" _label="Mismunch only" arg-set="-mismunch"/>
+ </select>
+
+ <select id="mode">
+ <option id="xor" _label="XOR"/>
+ <option id="solid" _label="Solid" arg-set="-no-xor"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+ DATAI 2
+ ADDB 1,2
+ ROTC 2,-22
+ XOR 1,2
+ JRST .-4
+
+As reported by HAKMEM (MIT AI Memo 239, 1972), Jackson Wright wrote
+the above PDP-1 code in 1962. That code still lives on here, some 46
+years later.
+
+In "mismunch" mode, it displays a creatively broken misimplementation
+of the classic munching squares algorithm instead.
+
+https://en.wikipedia.org/wiki/HAKMEM
+https://en.wikipedia.org/wiki/Munching_square
+
+Written by Jackson Wright, Tim Showalter, Jamie Zawinski and
+Steven Hazel; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/nerverot.xml b/hacks/config/nerverot.xml
new file mode 100644
index 0000000..ef6db85
--- /dev/null
+++ b/hacks/config/nerverot.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="nerverot" _label="NerveRot">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=oUfgDnyGqHM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="iters" type="slider" arg="-max-iters %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="100" high="8000" default="1200"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Blot count" _low-label="Few" _high-label="Many"
+ low="1" high="1000" default="250"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="4"/>
+ </vgroup>
+ <vgroup>
+ <number id="event" type="slider" arg="-event-chance %"
+ _label="Changes" _low-label="Seldom" _high-label="Frequent"
+ low="0.0" high="1.0" default="0.2"/>
+
+ <number id="nervous" type="slider" arg="-nervousness %"
+ _label="Nervousness" _low-label="Calm" _high-label="Spastic"
+ low="0.0" high="1.0" default="0.3"/>
+
+ <number id="mnr" type="slider" arg="-max-nerve-radius %"
+ _label="Crunchiness" _low-label="Low" _high-label="High"
+ low="0.0" high="1.0" default="0.7"/>
+
+ <number id="linewidth" type="spinbutton" arg="-line-width %"
+ _label="Line thickness" low="0" high="100" default="0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -iter-amt [0.01] -->
+ <!-- #### -min-scale [0.6] -->
+ <!-- #### -max-scale [1.75] -->
+ <!-- #### -min-radius [3] -->
+ <!-- #### -max-radius [25] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+Nervously vibrating squiggles.
+
+Written by Dan Bornstein; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/noof.xml b/hacks/config/noof.xml
new file mode 100644
index 0000000..3e2b0fc
--- /dev/null
+++ b/hacks/config/noof.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="noof" _label="Noof" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=x5DQjgYqmn0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flowery, rotatey patterns.
+
+Written by Bill Torzewski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/noseguy.xml b/hacks/config/noseguy.xml
new file mode 100644
index 0000000..bfc1674
--- /dev/null
+++ b/hacks/config/noseguy.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="noseguy" _label="NoseGuy">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ONJlg9Y_TLI"/>
+
+ <xscreensaver-text />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A little man with a big nose wanders around your screen saying things.
+
+Written by Dan Heller and Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pacman.xml b/hacks/config/pacman.xml
new file mode 100644
index 0000000..5ef77d5
--- /dev/null
+++ b/hacks/config/pacman.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pacman" _label="Pacman">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=G-pdjis0ECw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Player size" low="0" high="200" default="0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates a game of Pac-Man on a randomly-created level.
+
+https://en.wikipedia.org/wiki/Pac-Man
+
+Written by Edwin de Jong and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pedal.xml b/hacks/config/pedal.xml
new file mode 100644
index 0000000..5ddb6e1
--- /dev/null
+++ b/hacks/config/pedal.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pedal" _label="Pedal">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=VFibXcP1JH0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="lines" type="slider" arg="-maxlines %"
+ _label="Lines" _low-label="Few" _high-label="Many"
+ low="100" high="5000" default="1000"/>
+
+ <!-- #### -fadedelay [200000] -->
+ <!-- #### -foreground [white] -->
+ <!-- #### -background [black] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The even-odd winding rule.
+
+https://en.wikipedia.org/wiki/Even-odd_rule
+https://en.wikipedia.org/wiki/Nonzero-rule
+
+Written by Dale Moore; 1995.
+ </_description>
+</screensaver>
diff --git a/hacks/config/peepers.xml b/hacks/config/peepers.xml
new file mode 100644
index 0000000..300c389
--- /dev/null
+++ b/hacks/config/peepers.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="peepers" _label="Peepers" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=9xwPoLRKff8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of eyes" _low-label="Few" _high-label="Many"
+ low="0" high="50" default="0"/>
+ </vgroup>
+
+ <vgroup>
+
+ <select id="mode">
+ <option id="bounce" _label="Bounce" arg-set="-mode bounce"/>
+ <option id="scroll" _label="Scroll" arg-set="-mode scroll"/>
+ <option id="random" _label="Bounce or scroll"/>
+ <option id="xeyes" _label="Grid" arg-set="-mode xeyes"/>
+ <option id="beholder" _label="Beholder" arg-set="-mode beholder"/>
+ </select>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Floating eyeballs. Anatomically correct, and they also track the pointer.
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/penetrate.xml b/hacks/config/penetrate.xml
new file mode 100644
index 0000000..a7f6de9
--- /dev/null
+++ b/hacks/config/penetrate.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="penetrate" _label="Penetrate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=iuutzMOVYgI"/>
+
+ <number id="bgrowth" type="slider" arg="-bgrowth %"
+ _label="Explosions" _low-label="Slow" _high-label="Fast"
+ low="1" high="20" default="5"/>
+
+ <number id="lrate" type="slider" arg="-lrate %"
+ _label="Lasers" _low-label="Slow" _high-label="Fast"
+ low="10" high="200" default="80"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="dumb" _label="Start badly, but learn"/>
+ <option id="smart" _label="Always play well" arg-set="-smart"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates (something like) the classic arcade game Missile Command.
+
+https://en.wikipedia.org/wiki/Missile_Command
+
+Written by Adam Miller; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/penrose.xml b/hacks/config/penrose.xml
new file mode 100644
index 0000000..aa70323
--- /dev/null
+++ b/hacks/config/penrose.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="penrose" _label="Penrose">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=atlkrWkbYHk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+ </vgroup>
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _label="Tile size" _low-label="Small" _high-label="Large"
+ low="1" high="100" default="40"/>
+
+ <boolean id="ammann" _label="Draw ammann lines" arg-set="-ammann"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+
+ <xscreensaver-updater />
+
+ <_description>
+Quasiperiodic tilings.
+
+In April 1997, Sir Roger Penrose, a British math professor who has
+worked with Stephen Hawking on such topics as relativity, black
+holes, and whether time has a beginning, filed a
+copyright-infringement lawsuit against the Kimberly-Clark
+Corporation, which Penrose said copied a pattern he created (a
+pattern demonstrating that "a nonrepeating pattern could exist in
+nature") for its Kleenex quilted toilet paper. Penrose said he
+doesn't like litigation but, "When it comes to the population of
+Great Britain being invited by a multinational to wipe their bottoms
+on what appears to be the work of a Knight of the Realm, then a last
+stand must be taken."
+
+As reported by News of the Weird #491, 4-Jul-1997.
+
+https://en.wikipedia.org/wiki/Penrose_tiling
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Timo Korvola; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/petri.xml b/hacks/config/petri.xml
new file mode 100644
index 0000000..eff9373
--- /dev/null
+++ b/hacks/config/petri.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="petri" _label="Petri">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QkJ9cN0QQd8"/>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="diaglim" type="slider" arg="-diaglim %"
+ _label="Colony shape" _low-label="Square" _high-label="Diamond"
+ low="1.0" high="2.0" default="1.414"
+ convert="invert"/>
+
+ <number id="anychan" type="slider" arg="-anychan %"
+ _label="Fertility" _low-label="Low" _high-label="High"
+ low="0.0" high="0.25" default="0.0015"/>
+
+ <number id="minorchan" type="slider" arg="-minorchan %"
+ _label="Offspring" _low-label="Few" _high-label="Many"
+ low="0.0" high="1.0" default="0.5"/>
+
+ <number id="instantdeathchan" type="slider" arg="-instantdeathchan %"
+ _label="Death comes" _low-label="Slowly" _high-label="Quickly"
+ low="0.0" high="1.0" default="0.2"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="minlifespeed" type="slider" arg="-minlifespeed %"
+ _label="Minimum rate of growth" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.04"/>
+
+ <number id="maxlifespeed" type="slider" arg="-maxlifespeed %"
+ _label="Maximum rate of growth" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.13"/>
+
+ <number id="mindeathspeed" type="slider" arg="-mindeathspeed %"
+ _label="Minimum rate of death" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.42"/>
+
+ <number id="maxdeathspeed" type="slider" arg="-maxdeathspeed %"
+ _label="Maximum rate of death" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.46"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="minlifespan" type="slider" arg="-minlifespan %"
+ _label="Minimum lifespan" _low-label="Short" _high-label="Long"
+ low="0" high="3000" default="500"/>
+
+ <number id="maxlifespan" type="slider" arg="-maxlifespan %"
+ _label="Maximum lifespan" _low-label="Short" _high-label="Long"
+ low="0" high="3000" default="1500"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Cell size" low="0" high="100" default="2"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Mold varieties" low="0" high="20" default="20"/>
+
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -mem-throttle [22M] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+Colonies of mold grow in a petri dish. Growing colored circles
+overlap and leave spiral interference in their wake.
+
+Written by Dan Bornstein; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/phosphor.xml b/hacks/config/phosphor.xml
new file mode 100644
index 0000000..484cf88
--- /dev/null
+++ b/hacks/config/phosphor.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="phosphor" _label="Phosphor">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=G6ZWTrl7pV0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="scale" type="spinbutton" arg="-scale %"
+ _label="Font scale" low="1" high="20" default="6"/>
+
+ <number id="fade" type="slider" arg="-ticks %"
+ _label="Fade" _low-label="Slow" _high-label="Fast"
+ low="1" high="100" default="20"
+ convert="invert"/>
+
+ <select id="fg">
+ <option id="green" _label="Green" />
+ <!-- DarkOrange is probably the closest named color. -->
+ <option id="DarkOrange" _label="Amber" arg-set="-fg #ff7900" />
+ <option id="white" _label="White" arg-set="-fg white" />
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <xscreensaver-text />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An old terminal with large pixels and long-sustain phosphor.
+
+On MacOS and Linux, this program is also a fully-functional VT100
+emulator! Run it as an application instead of as a screen saver and
+you can use it as a terminal.
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/photopile.xml b/hacks/config/photopile.xml
new file mode 100644
index 0000000..a174afd
--- /dev/null
+++ b/hacks/config/photopile.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="photopile" _label="Photopile" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=snm7o95AR8E"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="scale" type="slider" arg="-scale %"
+ _label="Image size"
+ _low-label="Small" _high-label="Large"
+ low="0.1" high="0.9" default="0.4"/>
+
+ <number id="tilt" type="slider" arg="-maxTilt %"
+ _label="Maximum angle from vertical"
+ _low-label="0 deg" _high-label="90 deg"
+ low="0" high="90" default="50"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of images" low="1" high="20" default="7"/>
+
+ <boolean id="polaroid" _label="Simulate instant film" arg-unset="-no-polaroid"/>
+
+ <boolean id="clip" _label="Instant film theme" arg-unset="-no-clip"/>
+
+ <boolean id="shadows" _label="Draw drop shadows" arg-unset="-no-shadows"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Time until loading a new image"
+ _low-label="Short" _high-label="Long"
+ low="1" high="60" default="5"/>
+
+ <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+ <xscreensaver-updater />
+
+ <_description>
+Loads several random images, and displays them as if lying in a random pile.
+The pile is periodically reshuffled, with new images coming in and old ones
+being thrown out.
+
+Written by Jens Kilian and Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/piecewise.xml b/hacks/config/piecewise.xml
new file mode 100644
index 0000000..fb6990a
--- /dev/null
+++ b/hacks/config/piecewise.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="piecewise" _label="Piecewise">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=3gQr1FxFSe0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="4" high="100" default="32"/>
+
+ <number id="colorspeed" type="slider" arg="-colorspeed %"
+ _label="Color shift" _low-label="Slow" _high-label="Fast"
+ low="0" high="100" default="10"/>
+ </vgroup>
+ <vgroup>
+
+ <number id="minradius" type="slider" arg="-minradius %"
+ _label="Minimum radius" _low-label="Small" _high-label="Large"
+ low="0.01" high="0.5" default="0.05"/>
+
+ <number id="maxradius" type="slider" arg="-maxradius %"
+ _label="Maximum radius" _low-label="Small" _high-label="Large"
+ low="0.01" high="0.5" default="0.2"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Moving circles switch from visibility to invisibility at intersection points.
+
+Written by Geoffrey Irving; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pinion.xml b/hacks/config/pinion.xml
new file mode 100644
index 0000000..edb4f0e
--- /dev/null
+++ b/hacks/config/pinion.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pinion" _label="Pinion" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rHY8dR1urQk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="15000"
+ convert="invert"/>
+
+ <number id="spin" type="slider" arg="-spin %"
+ _label="Rotation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="7.0" default="1.0"/>
+
+ <number id="scroll" type="slider" arg="-scroll %"
+ _label="Scrolling speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _label="Gear size" _low-label="Tiny" _high-label="Huge"
+ low="0.1" high="3.0" default="1.0"/>
+
+ <number id="max-rpm" type="slider" arg="-max-rpm %"
+ _label="Max RPM" _low-label="100" _high-label="2000"
+ low="100" high="2000" default="900"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A gear system marches across the screen.
+See also the "Gears" and "MoebiusGears" screen savers.
+
+https://en.wikipedia.org/wiki/Involute_gear
+
+Written by Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pipes.xml b/hacks/config/pipes.xml
new file mode 100644
index 0000000..ba2deff
--- /dev/null
+++ b/hacks/config/pipes.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pipes" _label="Pipes" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=UsUGENa7jvE"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Number of pipes" _low-label="One" _high-label="A hundred"
+ low="1" high="100" default="5"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Pipe length" _low-label="Short" _high-label="Long"
+ low="0" high="3000" default="500"/>
+
+ <number id="factory" type="slider" arg="-factory %"
+ _label="Gadgetry" _low-label="None" _high-label="Lots"
+ low="0" high="10" default="2"/>
+
+ <hgroup>
+ <boolean id="fisheye" _label="Fisheye lens" arg-unset="-no-fisheye"/>
+ <boolean id="tight" _label="Allow tight turns" arg-set="-tightturns"/>
+ <select id="style">
+ <option id="curves" _label="Curved pipes" arg-set="-count 3"/>
+ <option id="balls" _label="Ball joints" arg-set="-count 1"/>
+ <option id="fit" _label="Bolted fittings"/>
+ <option id="random" _label="Random style" arg-set="-count 0"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A growing plumbing system, with bolts and valves.
+
+Written by Marcelo Vianna and Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/polyhedra.xml b/hacks/config/polyhedra.xml
new file mode 100644
index 0000000..0780999
--- /dev/null
+++ b/hacks/config/polyhedra.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="polyhedra" _label="Polyhedra" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gYb-3EErLJE"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="1 second" _high-label="30 seconds"
+ low="1" high="30" default="12"/>
+
+ <select id="object">
+<option id="random" _label="Display random polyhedron"/>
+<option _label="Pentagonal prism" arg-set="-which pentagonal_prism"/>
+<option _label="Pentagonal dipyramid" arg-set="-which pentagonal_dipyramid"/>
+<option _label="Pentagonal antiprism" arg-set="-which pentagonal_antiprism"/>
+<option _label="Pentagonal deltohedron" arg-set="-which pentagonal_deltohedron"/>
+<option _label="Pentagrammic prism" arg-set="-which pentagrammic_prism"/>
+<option _label="Pentagrammic dipyramid" arg-set="-which pentagrammic_dipyramid"/>
+<option _label="Pentagrammic antiprism" arg-set="-which pentagrammic_antiprism"/>
+<option _label="Pentagrammic deltohedron" arg-set="-which pentagrammic_deltohedron"/>
+<option _label="Pentagrammic crossed antiprism" arg-set="-which pentagrammic_crossed_antiprism"/>
+<option _label="Pentagrammic concave deltohedron" arg-set="-which pentagrammic_concave_deltohedron"/>
+<option _label="Tetrahedron" arg-set="-which tetrahedron"/>
+<option _label="Truncated tetrahedron" arg-set="-which truncated_tetrahedron"/>
+<option _label="Triakistetrahedron" arg-set="-which triakistetrahedron"/>
+<option _label="Octahemioctahedron" arg-set="-which octahemioctahedron"/>
+<option _label="Octahemioctacron" arg-set="-which octahemioctacron"/>
+<option _label="Tetrahemihexahedron" arg-set="-which tetrahemihexahedron"/>
+<option _label="Tetrahemihexacron" arg-set="-which tetrahemihexacron"/>
+<option _label="Octahedron" arg-set="-which octahedron"/>
+<option _label="Cube" arg-set="-which cube"/>
+<option _label="Cuboctahedron" arg-set="-which cuboctahedron"/>
+<option _label="Rhombic dodecahedron" arg-set="-which rhombic_dodecahedron"/>
+<option _label="Truncated octahedron" arg-set="-which truncated_octahedron"/>
+<option _label="Tetrakishexahedron" arg-set="-which tetrakishexahedron"/>
+<option _label="Truncated cube" arg-set="-which truncated_cube"/>
+<option _label="Triakisoctahedron" arg-set="-which triakisoctahedron"/>
+<option _label="Rhombicuboctahedron" arg-set="-which rhombicuboctahedron"/>
+<option _label="Deltoidal icositetrahedron" arg-set="-which deltoidal_icositetrahedron"/>
+<option _label="Truncated cuboctahedron" arg-set="-which truncated_cuboctahedron"/>
+<option _label="Disdyakisdodecahedron" arg-set="-which disdyakisdodecahedron"/>
+<option _label="Snub cube" arg-set="-which snub_cube"/>
+<option _label="Pentagonal icositetrahedron" arg-set="-which pentagonal_icositetrahedron"/>
+<option _label="Small cubicuboctahedron" arg-set="-which small_cubicuboctahedron"/>
+<option _label="Small hexacronic icositetrahedron" arg-set="-which small_hexacronic_icositetrahedron"/>
+<option _label="Great cubicuboctahedron" arg-set="-which great_cubicuboctahedron"/>
+<option _label="Great hexacronic icositetrahedron" arg-set="-which great_hexacronic_icositetrahedron"/>
+<option _label="Cubohemioctahedron" arg-set="-which cubohemioctahedron"/>
+<option _label="Hexahemioctacron" arg-set="-which hexahemioctacron"/>
+<option _label="Cubitruncated cuboctahedron" arg-set="-which cubitruncated_cuboctahedron"/>
+<option _label="Tetradyakishexahedron" arg-set="-which tetradyakishexahedron"/>
+<option _label="Great rhombicuboctahedron" arg-set="-which great_rhombicuboctahedron"/>
+<option _label="Great deltoidal icositetrahedron" arg-set="-which great_deltoidal_icositetrahedron"/>
+<option _label="Small rhombihexahedron" arg-set="-which small_rhombihexahedron"/>
+<option _label="Small rhombihexacron" arg-set="-which small_rhombihexacron"/>
+<option _label="Stellated truncated hexahedron" arg-set="-which stellated_truncated_hexahedron"/>
+<option _label="Great triakisoctahedron" arg-set="-which great_triakisoctahedron"/>
+<option _label="Great truncated cuboctahedron" arg-set="-which great_truncated_cuboctahedron"/>
+<option _label="Great disdyakisdodecahedron" arg-set="-which great_disdyakisdodecahedron"/>
+<option _label="Great rhombihexahedron" arg-set="-which great_rhombihexahedron"/>
+<option _label="Great rhombihexacron" arg-set="-which great_rhombihexacron"/>
+<option _label="Icosahedron" arg-set="-which icosahedron"/>
+<option _label="Dodecahedron" arg-set="-which dodecahedron"/>
+<option _label="Icosidodecahedron" arg-set="-which icosidodecahedron"/>
+<option _label="Rhombic triacontahedron" arg-set="-which rhombic_triacontahedron"/>
+<option _label="Truncated icosahedron" arg-set="-which truncated_icosahedron"/>
+<option _label="Pentakisdodecahedron" arg-set="-which pentakisdodecahedron"/>
+<option _label="Truncated dodecahedron" arg-set="-which truncated_dodecahedron"/>
+<option _label="Triakisicosahedron" arg-set="-which triakisicosahedron"/>
+<option _label="Rhombicosidodecahedron" arg-set="-which rhombicosidodecahedron"/>
+<option _label="Deltoidal hexecontahedron" arg-set="-which deltoidal_hexecontahedron"/>
+<option _label="Truncated icosidodecahedron" arg-set="-which truncated_icosidodecahedron"/>
+<option _label="Disdyakistriacontahedron" arg-set="-which disdyakistriacontahedron"/>
+<option _label="Snub dodecahedron" arg-set="-which snub_dodecahedron"/>
+<option _label="Pentagonal hexecontahedron" arg-set="-which pentagonal_hexecontahedron"/>
+<option _label="Small ditrigonal icosidodecahedron" arg-set="-which small_ditrigonal_icosidodecahedron"/>
+<option _label="Small triambic icosahedron" arg-set="-which small_triambic_icosahedron"/>
+<option _label="Small icosicosidodecahedron" arg-set="-which small_icosicosidodecahedron"/>
+<option _label="Small icosacronic hexecontahedron" arg-set="-which small_icosacronic_hexecontahedron"/>
+<option _label="Small snub icosicosidodecahedron" arg-set="-which small_snub_icosicosidodecahedron"/>
+<option _label="Small hexagonal hexecontahedron" arg-set="-which small_hexagonal_hexecontahedron"/>
+<option _label="Small dodecicosidodecahedron" arg-set="-which small_dodecicosidodecahedron"/>
+<option _label="Small dodecacronic hexecontahedron" arg-set="-which small_dodecacronic_hexecontahedron"/>
+<option _label="Small stellated dodecahedron" arg-set="-which small_stellated_dodecahedron"/>
+<option _label="Great dodecahedron" arg-set="-which great_dodecahedron"/>
+<option _label="Great dodecadodecahedron" arg-set="-which great_dodecadodecahedron"/>
+<option _label="Medial rhombic triacontahedron" arg-set="-which medial_rhombic_triacontahedron"/>
+<option _label="Truncated great dodecahedron" arg-set="-which truncated_great_dodecahedron"/>
+<option _label="Small stellapentakisdodecahedron" arg-set="-which small_stellapentakisdodecahedron"/>
+<option _label="Rhombidodecadodecahedron" arg-set="-which rhombidodecadodecahedron"/>
+<option _label="Medial deltoidal hexecontahedron" arg-set="-which medial_deltoidal_hexecontahedron"/>
+<option _label="Small rhombidodecahedron" arg-set="-which small_rhombidodecahedron"/>
+<option _label="Small rhombidodecacron" arg-set="-which small_rhombidodecacron"/>
+<option _label="Snub dodecadodecahedron" arg-set="-which snub_dodecadodecahedron"/>
+<option _label="Medial pentagonal hexecontahedron" arg-set="-which medial_pentagonal_hexecontahedron"/>
+<option _label="Ditrigonal dodecadodecahedron" arg-set="-which ditrigonal_dodecadodecahedron"/>
+<option _label="Medial triambic icosahedron" arg-set="-which medial_triambic_icosahedron"/>
+<option _label="Great ditrigonal dodecicosidodecahedron" arg-set="-which great_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Great ditrigonal dodecacronic hexecontahedron" arg-set="-which great_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Small ditrigonal dodecicosidodecahedron" arg-set="-which small_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Small ditrigonal dodecacronic hexecontahedron" arg-set="-which small_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Icosidodecadodecahedron" arg-set="-which icosidodecadodecahedron"/>
+<option _label="Medial icosacronic hexecontahedron" arg-set="-which medial_icosacronic_hexecontahedron"/>
+<option _label="Icositruncated dodecadodecahedron" arg-set="-which icositruncated_dodecadodecahedron"/>
+<option _label="Tridyakisicosahedron" arg-set="-which tridyakisicosahedron"/>
+<option _label="Snub icosidodecadodecahedron" arg-set="-which snub_icosidodecadodecahedron"/>
+<option _label="Medial hexagonal hexecontahedron" arg-set="-which medial_hexagonal_hexecontahedron"/>
+<option _label="Great ditrigonal icosidodecahedron" arg-set="-which great_ditrigonal_icosidodecahedron"/>
+<option _label="Great triambic icosahedron" arg-set="-which great_triambic_icosahedron"/>
+<option _label="Great icosicosidodecahedron" arg-set="-which great_icosicosidodecahedron"/>
+<option _label="Great icosacronic hexecontahedron" arg-set="-which great_icosacronic_hexecontahedron"/>
+<option _label="Small icosihemidodecahedron" arg-set="-which small_icosihemidodecahedron"/>
+<option _label="Small icosihemidodecacron" arg-set="-which small_icosihemidodecacron"/>
+<option _label="Small dodecicosahedron" arg-set="-which small_dodecicosahedron"/>
+<option _label="Small dodecicosacron" arg-set="-which small_dodecicosacron"/>
+<option _label="Small dodecahemidodecahedron" arg-set="-which small_dodecahemidodecahedron"/>
+<option _label="Small dodecahemidodecacron" arg-set="-which small_dodecahemidodecacron"/>
+<option _label="Great stellated dodecahedron" arg-set="-which great_stellated_dodecahedron"/>
+<option _label="Great icosahedron" arg-set="-which great_icosahedron"/>
+<option _label="Great icosidodecahedron" arg-set="-which great_icosidodecahedron"/>
+<option _label="Great rhombic triacontahedron" arg-set="-which great_rhombic_triacontahedron"/>
+<option _label="Great truncated icosahedron" arg-set="-which great_truncated_icosahedron"/>
+<option _label="Great stellapentakisdodecahedron" arg-set="-which great_stellapentakisdodecahedron"/>
+<option _label="Rhombicosahedron" arg-set="-which rhombicosahedron"/>
+<option _label="Rhombicosacron" arg-set="-which rhombicosacron"/>
+<option _label="Great snub icosidodecahedron" arg-set="-which great_snub_icosidodecahedron"/>
+<option _label="Great pentagonal hexecontahedron" arg-set="-which great_pentagonal_hexecontahedron"/>
+<option _label="Small stellated truncated dodecahedron" arg-set="-which small_stellated_truncated_dodecahedron"/>
+<option _label="Great pentakisdodecahedron" arg-set="-which great_pentakisdodecahedron"/>
+<option _label="Truncated dodecadodecahedron" arg-set="-which truncated_dodecadodecahedron"/>
+<option _label="Medial disdyakistriacontahedron" arg-set="-which medial_disdyakistriacontahedron"/>
+<option _label="Inverted snub dodecadodecahedron" arg-set="-which inverted_snub_dodecadodecahedron"/>
+<option _label="Medial inverted pentagonal hexecontahedron" arg-set="-which medial_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great dodecicosidodecahedron" arg-set="-which great_dodecicosidodecahedron"/>
+<option _label="Great dodecacronic hexecontahedron" arg-set="-which great_dodecacronic_hexecontahedron"/>
+<option _label="Small dodecahemicosahedron" arg-set="-which small_dodecahemicosahedron"/>
+<option _label="Small dodecahemicosacron" arg-set="-which small_dodecahemicosacron"/>
+<option _label="Great dodecicosahedron" arg-set="-which great_dodecicosahedron"/>
+<option _label="Great dodecicosacron" arg-set="-which great_dodecicosacron"/>
+<option _label="Great snub dodecicosidodecahedron" arg-set="-which great_snub_dodecicosidodecahedron"/>
+<option _label="Great hexagonal hexecontahedron" arg-set="-which great_hexagonal_hexecontahedron"/>
+<option _label="Great dodecahemicosahedron" arg-set="-which great_dodecahemicosahedron"/>
+<option _label="Great dodecahemicosacron" arg-set="-which great_dodecahemicosacron"/>
+<option _label="Great stellated truncated dodecahedron" arg-set="-which great_stellated_truncated_dodecahedron"/>
+<option _label="Great triakisicosahedron" arg-set="-which great_triakisicosahedron"/>
+<option _label="Great rhombicosidodecahedron" arg-set="-which great_rhombicosidodecahedron"/>
+<option _label="Great deltoidal hexecontahedron" arg-set="-which great_deltoidal_hexecontahedron"/>
+<option _label="Great truncated icosidodecahedron" arg-set="-which great_truncated_icosidodecahedron"/>
+<option _label="Great disdyakistriacontahedron" arg-set="-which great_disdyakistriacontahedron"/>
+<option _label="Great inverted snub icosidodecahedron" arg-set="-which great_inverted_snub_icosidodecahedron"/>
+<option _label="Great inverted pentagonal hexecontahedron" arg-set="-which great_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great dodecahemidodecahedron" arg-set="-which great_dodecahemidodecahedron"/>
+<option _label="Great dodecahemidodecacron" arg-set="-which great_dodecahemidodecacron"/>
+<option _label="Great icosihemidodecahedron" arg-set="-which great_icosihemidodecahedron"/>
+<option _label="Great icosihemidodecacron" arg-set="-which great_icosihemidodecacron"/>
+<option _label="Small retrosnub icosicosidodecahedron" arg-set="-which small_retrosnub_icosicosidodecahedron"/>
+<option _label="Small hexagrammic hexecontahedron" arg-set="-which small_hexagrammic_hexecontahedron"/>
+<option _label="Great rhombidodecahedron" arg-set="-which great_rhombidodecahedron"/>
+<option _label="Great rhombidodecacron" arg-set="-which great_rhombidodecacron"/>
+<option _label="Great retrosnub icosidodecahedron" arg-set="-which great_retrosnub_icosidodecahedron"/>
+<option _label="Great pentagrammic hexecontahedron" arg-set="-which great_pentagrammic_hexecontahedron"/>
+<option _label="Great dirhombicosidodecahedron" arg-set="-which great_dirhombicosidodecahedron"/>
+<option _label="Great dirhombicosidodecacron" arg-set="-which great_dirhombicosidodecacron"/>
+<option _label="Utah teapotahedron" arg-set="-which utah_teapotahedron"/>
+ </select>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="titles" _label="Show description" arg-unset="-no-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 75 uniform polyhedra and their duals, plus 5 prisms
+and antiprisms, and some information about each.
+
+https://en.wikipedia.org/wiki/Uniform_polyhedra
+https://en.wikipedia.org/wiki/Stellation
+https://en.wikipedia.org/wiki/Dual_polyhedron
+https://en.wikipedia.org/wiki/Antiprism
+
+Written by Dr. Zvi Har'El and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/polyominoes.xml b/hacks/config/polyominoes.xml
new file mode 100644
index 0000000..74b05f2
--- /dev/null
+++ b/hacks/config/polyominoes.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="polyominoes" _label="Polyominoes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=6j2H2gL8cws"/>
+
+ <boolean id="identical" _label="Identical pieces" arg-set="-identical"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="500" high="5000" default="2000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Repeatedly attempts to completely fill a rectangle with
+irregularly-shaped puzzle pieces.
+
+https://en.wikipedia.org/wiki/Polyomino
+
+Written by Stephen Montgomery-Smith; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/polytopes.xml b/hacks/config/polytopes.xml
new file mode 100644
index 0000000..1e6f1f3
--- /dev/null
+++ b/hacks/config/polytopes.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="polytopes" _label="Polytopes" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=MKZQ5Q7QINM"/>
+
+ <hgroup>
+ <vgroup>
+ <select id="display-mode">
+ <option id="wire" _label="Wireframe mesh"
+ arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface"
+ arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface"/>
+ </select>
+
+ <select id="polytope">
+ <option id="random" _label="Random object"/>
+ <option id="cell-5" _label="5-cell (hyper-tetrahedron)"
+ arg-set="-polytope 5-cell"/>
+ <option id="cell-8" _label="8-cell (hypercube / tesseract)"
+ arg-set="-polytope 8-cell"/>
+ <option id="cell-16" _label="16-cell (hyper-octahedron)"
+ arg-set="-polytope 16-cell"/>
+ <option id="cell-24" _label="24-cell"
+ arg-set="-polytope 24-cell"/>
+ <option id="cell-120" _label="120-cell"
+ arg-set="-polytope 120-cell"/>
+ <option id="cell-600" _label="600-cell"
+ arg-set="-polytope 600-cell"/>
+ </select>
+
+ <select id="colors">
+ <option id="single" _label="Single color" arg-set="-single-color"/>
+ <option id="depth" _label="Colors By 4D Depth"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="perspective-3d" _label="Perspective 3D"/>
+ <option id="orthographic-3d" _label="Orthographic 3D"
+ arg-set="-orthographic-3d"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="perspective-4d" _label="Perspective 4D"/>
+ <option id="orthographic-4d" _label="Orthographic 4D"
+ arg-set="-orthographic-4d"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.7"/>
+
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.9"/>
+
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="2.1"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The six regular 4D polytopes rotating in 4D.
+
+Inspired by H.S.M Coxeter's book "Regular Polytopes", 3rd Edition,
+Dover Publications, Inc., 1973, and Thomas Banchoff's book "Beyond the
+Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+Scientific American Library, 1990.
+
+https://en.wikipedia.org/wiki/Hypercube
+https://en.wikipedia.org/wiki/Tesseract
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Carsten Steger; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pong.xml b/hacks/config/pong.xml
new file mode 100644
index 0000000..6ae353a
--- /dev/null
+++ b/hacks/config/pong.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pong" _label="Pong">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2jPmisDwwi0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Game speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="20" default="6"/>
+
+ <number id="noise" type="slider" arg="-noise %"
+ _label="Noise" _low-label="Crisp" _high-label="Noisy"
+ low="0.00" high="5.00" default="0.04"/>
+
+ <hgroup>
+ <boolean id="clock" _label="Clock mode" arg-set="-clock"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 1971 Pong home video game, including artifacts of an old color TV set.
+
+In clock mode, the score keeps track of the current time.
+
+https://en.wikipedia.org/wiki/Pong
+
+Written by Jeremy English, Trevor Blackwell and Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/popsquares.xml b/hacks/config/popsquares.xml
new file mode 100644
index 0000000..8bc519a
--- /dev/null
+++ b/hacks/config/popsquares.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="popsquares" _label="PopSquares">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=99Aweq7Nypc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <number id="subdivision" type="spinbutton" arg="-subdivision %"
+ _label="Subdivision"
+ low="1" high="64" default="5"/>
+
+ <number id="border" type="spinbutton" arg="-border %"
+ _label="Border"
+ low="0" high="5" default="1"/>
+
+ <number id="ncolors" type="spinbutton" arg="-ncolors %"
+ _label="Number of colors" low="1" high="512" default="128"/>
+
+ <hgroup>
+ <select id="bg">
+ <option id="lred" _label="Light red" arg-set="-bg #FF0000"/>
+ <option id="lyellow" _label="Light yellow" arg-set="-bg #FFFF00"/>
+ <option id="lgreen" _label="Light green" arg-set="-bg #00FF00"/>
+ <option id="lcyan" _label="Light cyan" arg-set="-bg #00FFFF"/>
+ <option id="lblue" _label="Light blue"/>
+ <option id="lmagenta" _label="Light magenta" arg-set="-bg #FF00FF"/>
+ </select>
+
+ <select id="fg">
+ <option id="dred" _label="Dark red" arg-set="-fg #8C0000"/>
+ <option id="dyellow" _label="Dark yellow" arg-set="-fg #8C8C00"/>
+ <option id="dgreen" _label="Dark green" arg-set="-fg #008C00"/>
+ <option id="dcyan" _label="Dark cyan" arg-set="-fg #008C8C"/>
+ <option id="dblue" _label="Dark blue"/>
+ <option id="dmagenta" _label="Dark magenta" arg-set="-fg #8C008C"/>
+ </select>
+ </hgroup>
+
+ <boolean id="twitch" _label="Twitch" arg-set="-twitch"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A pop-art-ish looking grid of pulsing colors.
+
+Written by Levi Burton; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/projectiveplane.xml b/hacks/config/projectiveplane.xml
new file mode 100644
index 0000000..fa9dfb8
--- /dev/null
+++ b/hacks/config/projectiveplane.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="projectiveplane" _label="ProjectivePlane" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Zg6ONPUTwUQ"/>
+
+ <hgroup>
+ <select id="display-mode">
+ <option id="random" _label="Random surface"/>
+ <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="random" _label="Random pattern"/>
+ <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
+ <option id="bands" _label="Distance bands" arg-set="-appearance distance-bands"/>
+ <option id="bands" _label="Direction bands" arg-set="-appearance direction-bands"/>
+ </select>
+
+ <select id="colors">
+ <option id="random" _label="Random coloration"/>
+ <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
+ <option id="rainbow" _label="Distance colors" arg-set="-colors distance"/>
+ <option id="rainbow" _label="Direction colors" arg-set="-colors direction"/>
+ <option id="depth" _label="4d depth colors" arg-set="-colors depth"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="random" _label="Random 3D"/>
+ <option id="perspective-3d" _label="Perspective 3D" arg-set="-projection-3d perspective"/>
+ <option id="orthographic-3d" _label="Orthographic 3D" arg-set="-projection-3d orthographic"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="random" _label="Random 4D"/>
+ <option id="perspective-4d" _label="Perspective 4D" arg-set="-projection-4d perspective"/>
+ <option id="orthographic-4d" _label="Orthographic 4D" arg-set="-projection-4d orthographic"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <hgroup>
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.1"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.3"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.5"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <hgroup>
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.7"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.9"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="2.1"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <hgroup>
+ <number id="walk-direction" type="slider" arg="-walk-direction %"
+ _label="Walk dir "
+ _low-label="-180" _high-label="180"
+ low="-180.0" high="180.0" default="83.0"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="walk-speed" type="slider" arg="-walk-speed %"
+ _label="Walk speed"
+ _low-label="1" _high-label="100"
+ low="1.0" high="100.0" default="20.0"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ </hgroup>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <select id="view-mode">
+ <option id="walk" _label="Random motion"/>
+ <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
+ <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
+ <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
+ </select>
+
+ <boolean id="orientation-marks" _label="Show orientation marks"
+ arg-set="-orientation-marks"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </hgroup>
+
+
+
+ <_description>
+A 4D embedding of the real projective plane.
+
+You can walk on the surface of the real projective plane or rotate it
+in 4D or walk on it while it rotates in 4D. Inspired by Thomas
+Banchoff's book "Beyond the Third Dimension: Geometry, Computer
+Graphics, and Higher Dimensions", Scientific American Library, 1990.
+
+https://en.wikipedia.org/wiki/Real_projective_plane
+https://en.wikipedia.org/wiki/Roman_surface
+https://en.wikipedia.org/wiki/Cross_cap
+https://en.wikipedia.org/wiki/Moebius_strip
+http://mathworld.wolfram.com/RealProjectivePlane.html
+http://mathworld.wolfram.com/RomanSurface.html
+http://mathworld.wolfram.com/Cross-Cap.html
+http://mathworld.wolfram.com/MoebiusStrip.html
+
+Written by Carsten Steger; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/providence.xml b/hacks/config/providence.xml
new file mode 100644
index 0000000..0156dc0
--- /dev/null
+++ b/hacks/config/providence.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="providence" _label="Providence" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=bnwRPPMopWc"/>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="eye" _label="Draw eye" arg-unset="-no-eye"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+"A pyramid unfinished. In the zenith an eye in a triangle, surrounded
+by a glory, proper."
+
+https://en.wikipedia.org/wiki/Eye_of_Providence
+
+Written by Blair Tennessy; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pulsar.xml b/hacks/config/pulsar.xml
new file mode 100644
index 0000000..64be3bf
--- /dev/null
+++ b/hacks/config/pulsar.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pulsar" _label="Pulsar" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pR0lpvOAbUo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="quads" type="spinbutton" arg="-quads %"
+ _label="Quad count" low="1" high="50" default="5"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="light" _label="Enable lighting" arg-set="-light"/>
+ <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
+ <boolean id="texture" _label="Enable texturing" arg-set="-texture"/>
+ <boolean id="mipmap" _label="Enable texture mipmaps" arg-set="-mipmap"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="no-blend" _label="Enable blending" arg-unset="-no-blend"/>
+ <boolean id="antialias" _label="Anti-alias lines" arg-set="-antialias"/>
+ <boolean id="texture_quality" _label="Enable texture filtering"
+ arg-set="-texture_quality"/>
+ <boolean id="do_depth" _label="Enable depth buffer" arg-set="-do_depth"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Intersecting planes, with alpha blending, fog, textures, and mipmaps.
+
+Written by David Konerding; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pyro.xml b/hacks/config/pyro.xml
new file mode 100644
index 0000000..ca81c3d
--- /dev/null
+++ b/hacks/config/pyro.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pyro" _label="Pyro">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JJqVfnMstuw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Particle density" _low-label="Sparse" _high-label="Dense"
+ low="10" high="2000" default="600"/>
+
+ <number id="launch" type="slider" arg="-frequency %"
+ _label="Launch frequency" _low-label="Seldom" _high-label="Often"
+ low="1" high="100" default="30"
+ convert="invert"/>
+
+ <number id="scatter" type="slider" arg="-scatter %"
+ _label="Explosive yield" _low-label="Low" _high-label="High"
+ low="1" high="400" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Exploding fireworks. See also the "Fireworkx", "Eruption", and
+"XFlame" screen savers.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/qix.xml b/hacks/config/qix.xml
new file mode 100644
index 0000000..a2a4ea2
--- /dev/null
+++ b/hacks/config/qix.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="qix" _label="Qix">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=GPqDtJ0vF8U"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Segments" _low-label="Few" _high-label="Many"
+ low="10" high="500" default="250"/>
+
+ <number id="spread" type="slider" arg="-spread %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1" high="50" default="8"
+ convert="invert"/>
+
+ <number id="color_contrast" type="slider" arg="-color-shift %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="0" high="25" default="3"/>
+ </vgroup>
+ <vgroup>
+ <select id="fill">
+ <option id="lines" _label="Line segments" arg-set="-hollow"/>
+ <option id="solid" _label="Solid objects"/>
+ </select>
+
+ <select id="motion">
+ <option id="linear" _label="Linear motion"/>
+ <option id="random" _label="Random motion" arg-set="-random"/>
+ </select>
+
+ <select id="color-mode">
+ <option id="additive" _label="Additive colors"/>
+ <option id="subtractive" _label="Subtractive colors"
+ arg-set="-subtractive"/>
+ </select>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="0" high="20" default="4"/>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Max size" low="200" high="1000" default="200"/>
+ <number id="poly" type="spinbutton" arg="-poly %"
+ _label="Poly corners" low="2" high="100" default="2"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="transparent" _label="Transparent" arg-unset="-non-transparent"/>
+ <boolean id="xor" _label="XOR" arg-set="-xor"/>
+ <boolean id="gravity" _label="Gravity" arg-set="-gravity"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Bounces a series of line segments around the screen, and uses
+variations on this basic motion pattern to produce all sorts of
+different presentations: line segments, filled polygons, and
+overlapping translucent areas.
+
+https://en.wikipedia.org/wiki/Qix
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/quasicrystal.xml b/hacks/config/quasicrystal.xml
new file mode 100644
index 0000000..0823c89
--- /dev/null
+++ b/hacks/config/quasicrystal.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="quasicrystal" _label="QuasiCrystal" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JsGf65d5TfM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="7" high="37" default="17"
+ convert="invert"/>
+
+ <number id="contrast" type="slider" arg="-contrast %"
+ _label="Contrast" _low-label="Low" _high-label="High"
+ low="0" high="100" default="30"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Displacement" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Rotation" arg-unset="-no-spin"/>
+ <boolean id="symmetric" _label="Symmetry" arg-unset="-no-symmetry"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A quasicrystal is a structure that is ordered but aperiodic.
+Two-dimensional quasicrystals can be generated by adding a set of
+planes where x is the sine of y. Different complex aperiodic plane
+tilings are produced depending on the period, position, and rotation
+of the component planes, and whether the rotation of the planes is
+evenly distributed around the circle (the "symmetry" option, above)
+or random.
+
+See also the "RD-Bomb", "CWaves" and "Penrose" screen savers.
+
+https://en.wikipedia.org/wiki/Quasicrystal
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/queens.xml b/hacks/config/queens.xml
new file mode 100644
index 0000000..aa949fd
--- /dev/null
+++ b/hacks/config/queens.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="queens" _label="Queens" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Ssy0ldFDeAs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The N-Queens problem: how to place N queens on an NxN chessboard
+such that no queen can attack a sister?
+
+See also the "Endgame" screen saver.
+
+https://en.wikipedia.org/wiki/Eight_queens_puzzle
+
+Written by Blair Tennessy and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/raverhoop.xml b/hacks/config/raverhoop.xml
new file mode 100644
index 0000000..4932255
--- /dev/null
+++ b/hacks/config/raverhoop.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="raverhoop" _label="RaverHoop" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=0k2sP_Imb80" />
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Colors" _low-label="1" _high-label="64"
+ low="1" high="64" default="12"/>
+
+ <number id="lights" type="slider" arg="-lights %"
+ _label="Lights" _low-label="Sparse" _high-label="Dense"
+ low="3" high="512" default="200"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed, motion" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5.0" default="1.0"/>
+
+ <number id="light-speed" type="slider" arg="-light-speed %"
+ _label="Speed, lights" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5.0" default="1.0"/>
+
+ <number id="sustain" type="slider" arg="-sustain %"
+ _label="Sustain" _low-label="Brief" _high-label="Long"
+ low="0.1" high="5.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="spin" _label="Spin" arg-set="-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates an LED hula hoop in a dark room. Oontz oontz oontz.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/razzledazzle.xml b/hacks/config/razzledazzle.xml
new file mode 100644
index 0000000..1af07df
--- /dev/null
+++ b/hacks/config/razzledazzle.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="razzledazzle" _label="RazzleDazzle" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=tV_70VxJFfs" />
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10" default="1.0"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Colors" _low-label="Mono" _high-label="Many"
+ low="2" high="200" default="2"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1.0" high="10.0" default="5.0"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Lines" _low-label="Thick" _high-label="Thin"
+ low="0.05" high="1.0" default="0.1"/>
+
+ <select id="object">
+ <option _label="Ship Outlines" arg-set="-mode ships"/>
+ <option _label="Flat Pattern" arg-set="-mode flat"/>
+ <option id="random" _label="Ships or flat pattern"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates an infinitely-scrolling sequence of dazzle camouflage patterns.
+
+Dazzle Ships, in addition to being the best album by Orchestral
+Manoeuvres in the Dark, were military vessels during World War I and
+early in World War II that were painted not to conceal but to confuse:
+with these Cubist overlapping stripes, it was very hard to estimate
+their size, range and heading. This was a big deal before the
+invention of Radar.
+
+https://en.wikipedia.org/wiki/Dazzle_camouflage
+https://en.wikipedia.org/wiki/Cubism
+https://en.wikipedia.org/wiki/Dazzle_Ships_%28album%29
+https://en.wikipedia.org/wiki/Acoustic_mirror
+https://en.wikipedia.org/wiki/Radar
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rd-bomb.xml b/hacks/config/rd-bomb.xml
new file mode 100644
index 0000000..c8a656d
--- /dev/null
+++ b/hacks/config/rd-bomb.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rd-bomb" _label="RDbomb">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xiooDyrZSsY"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="250000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Wander speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="10.0" default="0.0"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Fill screen" _low-label="1%" _high-label="100%"
+ low="0.01" high="1.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="epoch" type="slider" arg="-epoch %"
+ _label="Epoch" _low-label="Small" _high-label="Large"
+ low="1000" high="300000" default="40000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="255"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="width" type="spinbutton" arg="-width %"
+ _label="X tile size" low="0" high="500" default="0"/>
+ <number id="pixheight" type="spinbutton" arg="-height %"
+ _label="Y tile size" low="0" high="500" default="0"/>
+ </vgroup>
+ <vgroup>
+ <number id="reaction" type="spinbutton" arg="-reaction %"
+ _label="Reaction" low="-1" high="2" default="-1"/>
+ <number id="diffusion" type="spinbutton" arg="-diffusion %"
+ _label="Diffusion" low="-1" high="2" default="-1"/>
+
+ <!-- #### default is wrong -->
+ <number id="radius" type="spinbutton" arg="-radius %"
+ _label="Seed radius" low="-1" high="60" default="-1"/>
+
+ </vgroup>
+
+ </hgroup>
+
+ <_description>
+Reaction-diffusion: draws a grid of growing square-like shapes that,
+once they overtake each other, react in unpredictable ways.
+
+Written by Scott Draves; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rdbomb.xml b/hacks/config/rdbomb.xml
new file mode 120000
index 0000000..b70f7a7
--- /dev/null
+++ b/hacks/config/rdbomb.xml
@@ -0,0 +1 @@
+rd-bomb.xml \ No newline at end of file
diff --git a/hacks/config/ripples.xml b/hacks/config/ripples.xml
new file mode 100644
index 0000000..191e041
--- /dev/null
+++ b/hacks/config/ripples.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ripples" _label="Ripples">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=w8YXAalnRzc"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="rate" type="slider" arg="-rate %"
+ _label="Drippiness" _low-label="Drizzle" _high-label="Storm"
+ low="1" high="100" default="5"
+ convert="invert"/>
+
+ <number id="fluidity" type="slider" arg="-fluidity %"
+ _label="Fluidity" _low-label="Small drops" _high-label="Big drops"
+ low="0" high="16" default="6"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+
+ <hgroup>
+ <boolean id="stir" _label="Moving splashes" arg-set="-stir"/>
+ <boolean id="oily" _label="Psychedelic colors" arg-set="-oily"/>
+ <boolean id="gray" _label="Grayscale" arg-set="-grayscale"/>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <number id="light" type="spinbutton" arg="-light %"
+ _label="Magic lighting effect" low="0" high="8" default="4"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Rippling interference patterns reminiscent of splashing water
+distort a loaded image.
+
+Written by Tom Hammersley; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rocks.xml b/hacks/config/rocks.xml
new file mode 100644
index 0000000..964de82
--- /dev/null
+++ b/hacks/config/rocks.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rocks" _label="Rocks">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=7x7PMI7LFK0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="200" default="100"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Velocity" _low-label="Slow" _high-label="Fast"
+ low="1" high="100" default="100"/>
+
+ <hgroup>
+ <boolean id="rotate" _label="Rotation" arg-unset="-no-rotate"/>
+ <boolean id="steer" _label="Steering" arg-unset="-no-move"/>
+ <boolean id="3d" _label="Do Red/Blue 3D separation" arg-set="-3d"/>
+ </hgroup>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="5"/>
+
+ <!-- #### -delta3d [1.5] -->
+ <!-- #### -left3d [Blue] -->
+ <!-- #### -right3d [Red] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+An asteroid field zooms by.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/romanboy.xml b/hacks/config/romanboy.xml
new file mode 100644
index 0000000..b2f6cb4
--- /dev/null
+++ b/hacks/config/romanboy.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<screensaver name="romanboy" _label="RomanBoy" gl="yes">
+
+ <video href="https://www.youtube.com/watch?v=KEW5TuPbWyg"/>
+
+ <command arg="-root"/>
+
+ <hgroup>
+ <select id="view-mode">
+ <option id="walk" _label="Random motion"/>
+ <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
+ <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
+ </select>
+
+ <number id="surface-order" type="spinbutton" arg="-surface-order %"
+ _label="Order of the surface" low="2" high="9" default="3"/>
+
+ <boolean id="orientation-marks" _label="Show orientation marks"
+ arg-set="-orientation-marks"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="deform" _label="Deform the projective plane"
+ arg-unset="-no-deform"/>
+
+ <number id="deform-speed" type="slider" arg="-deformation-speed %"
+ _label="Deformation speed"
+ _low-label="1.0" _high-label="100.0"
+ low="1.0" high="100.0" default="10.0"/>
+
+ <number id="init-deform" type="slider" arg="-initial-deformation %"
+ _label="Initial deformation"
+ _low-label="0.0" _high-label="1000.0"
+ low="0.0" high="1000.0" default="1000.0"/>
+ </hgroup>
+
+
+ <hgroup>
+
+ <vgroup>
+ <select id="display-mode">
+ <option id="random" _label="Random surface"/>
+ <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="random" _label="Random pattern"/>
+ <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
+ <option id="bands" _label="Distance bands" arg-set="-appearance distance-bands"/>
+ <option id="bands" _label="Direction bands" arg-set="-appearance direction-bands"/>
+ </select>
+
+ <select id="colors">
+ <option id="random" _label="Random coloration"/>
+ <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
+ <option id="rainbow" _label="Distance colors" arg-set="-colors distance"/>
+ <option id="rainbow" _label="Direction colors" arg-set="-colors direction"/>
+ </select>
+
+ <select id="projection">
+ <option id="random" _label="Random Projection"/>
+ <option id="perspective" _label="Perspective" arg-set="-projection perspective"/>
+ <option id="orthographic" _label="Orthographic" arg-set="-projection orthographic"/>
+ </select>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-x" type="slider" arg="-speed-x %"
+ _label="X rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-y" type="slider" arg="-speed-y %"
+ _label="Y rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-z" type="slider" arg="-speed-z %"
+ _label="Z rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="walk-direction" type="slider" arg="-walk-direction %"
+ _label="Walking direction"
+ _low-label="-180.0" _high-label="180.0"
+ low="-180.0" high="180.0" default="83.0"/>
+
+ <number id="walk-speed" type="slider" arg="-walk-speed %"
+ _label="Walking speed"
+ _low-label="1.0" _high-label="100.0"
+ low="1.0" high="100.0" default="20.0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-updater />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ </hgroup>
+
+ <_description>
+A 3D immersion of the real projective plane that smoothly deforms
+between the Roman surface and the Boy surface.
+
+You can walk on the surface of the real projective plane or rotate it
+in 3D. Furthermore, it is possible to smoothly deform the real
+projective plane between the Roman surface and the Boy surface while
+turning it or walking on it. Inspired by François Apéry's book
+"Models of the Real Projective Plane", Vieweg, 1987.
+
+https://en.wikipedia.org/wiki/Boy%27s_surface
+https://en.wikipedia.org/wiki/Roman_surface
+http://mathworld.wolfram.com/BoySurface.html
+http://mathworld.wolfram.com/RomanSurface.html
+
+Written by Carsten Steger; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rorschach.xml b/hacks/config/rorschach.xml
new file mode 100644
index 0000000..e4f0207
--- /dev/null
+++ b/hacks/config/rorschach.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rorschach" _label="Rorschach">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=G1OLn4Mdk5Y"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Iterations" _low-label="Small" _high-label="Large"
+ low="0" high="10000" default="4000"/>
+
+ <number id="offset" type="slider" arg="-offset %"
+ _label="Offset" _low-label="Small" _high-label="Large"
+ low="0" high="50" default="7"/>
+
+ <boolean id="xsymmetry" _label="With X symmetry" arg-unset="-no-xsymmetry"/>
+ <boolean id="ysymmetry" _label="With Y symmetry" arg-set="-ysymmetry"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Inkblot patterns via a reflected random walk.
+
+https://en.wikipedia.org/wiki/Rorschach_inkblot_test
+https://en.wikipedia.org/wiki/Random_walk
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rotor.xml b/hacks/config/rotor.xml
new file mode 100644
index 0000000..2ffddf1
--- /dev/null
+++ b/hacks/config/rotor.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rotor" _label="Rotor">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=HWcEvT1keDA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="2" high="100" default="20"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="0" high="20" default="4"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-50" high="50" default="-6"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws a line segment moving along a complex spiraling curve.
+
+Written by Tom Lawrence; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rotzoomer.xml b/hacks/config/rotzoomer.xml
new file mode 100644
index 0000000..d610fcb
--- /dev/null
+++ b/hacks/config/rotzoomer.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rotzoomer" _label="RotZoomer">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ecl8ykLswX8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000" convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="n" type="spinbutton" arg="-n %"
+ _label="Rectangle count" low="1" high="20" default="2"/>
+
+ <select id="mode">
+ <option id="random" _label="Random"/>
+ <option id="stationary" _label="Stationary rectangles" arg-set="-mode stationary"/>
+ <option id="move" _label="Wandering rectangles" arg-set="-mode move"/>
+ <option id="sweep" _label="Sweeping arcs" arg-set="-mode sweep"/>
+ <option id="circle" _label="Rotating discs" arg-set="-mode circle"/>
+ </select>
+
+ <boolean id="anim" _label="Animate" arg-unset="-no-anim"/>
+
+<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Distorts an image by rotating and scaling random sections of it.
+
+Written by Claudio Matsuoka and Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rubik.xml b/hacks/config/rubik.xml
new file mode 100644
index 0000000..f48668b
--- /dev/null
+++ b/hacks/config/rubik.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rubik" _label="Rubik" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AQdJgvyVkXU"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="-100" high="100" default="-30"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="3" high="200" default="20"
+ convert="invert"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-20" high="20" default="-6"/>
+
+ <boolean id="shuffle" _label="Hide shuffling" arg-set="-hideshuffling"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Rubik's Cube that repeatedly shuffles and solves itself.
+See also the "GLSnake" and "Cube21" screen savers.
+
+https://en.wikipedia.org/wiki/Rubik%27s_Cube
+
+Written by Marcelo Vianna; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rubikblocks.xml b/hacks/config/rubikblocks.xml
new file mode 100644
index 0000000..de96caf
--- /dev/null
+++ b/hacks/config/rubikblocks.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rubikblocks" _label="RubikBlocks" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=B2sGaRLWz-A"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="cubesize" type="slider" arg="-cubesize %"
+ _label="Cube size" _low-label="Small" _high-label="Large"
+ low="0.4" high="2.0" default="1.0"/>
+
+ <number id="rotspeed" type="slider" arg="-rotspeed %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="1.0" high="10.0" default="3.0"/>
+
+ <select id="start">
+ <option id="cube" _label="Start as cube"/>
+ <option id="shuffle" _label="Start as random shape" arg-set="-randomize"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="spinspeed" type="slider" arg="-spinspeed %"
+ _label="Spin" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="4.0" default="0.1"/>
+
+ <number id="wanderspeed" type="slider" arg="-wanderspeed %"
+ _label="Wander" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="0.1" default="0.005"/>
+
+ <number id="wait" type="slider" arg="-wait %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="10.0" high="100.0" default="40.0"/>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="tex" _label="Outlines" arg-unset="-no-texture"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The "Rubik's Mirror Blocks" puzzle.
+See also the "Rubik", "Cube21", and "GLSnake" screen savers.
+
+https://en.wikipedia.org/wiki/Combination_puzzles#Irregular_cuboids
+
+Written by Vasek Potocek; 2009.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sballs.xml b/hacks/config/sballs.xml
new file mode 100644
index 0000000..6a72def
--- /dev/null
+++ b/hacks/config/sballs.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sballs" _label="SBalls" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pcfqdvvPG8k"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <select id="object">
+ <option id="random" _label="Random"/>
+ <option id="tetra" _label="Tetrahedron" arg-set="-object 1"/>
+ <option id="cube" _label="Cube" arg-set="-object 2"/>
+ <option id="octa" _label="Octahedron" arg-set="-object 3"/>
+ <option id="dodeca" _label="Dodecahedron" arg-set="-object 4"/>
+ <option id="icosa" _label="Icosahedron" arg-set="-object 5"/>
+ <option id="plane" _label="Plane" arg-set="-object 6"/>
+ <option id="pyramid" _label="Pyramid" arg-set="-object 7"/>
+ <option id="star" _label="Star" arg-set="-object 8"/>
+ </select>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Textured balls spinning like crazy.
+
+Written by Eric Lassauge; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/shadebobs.xml b/hacks/config/shadebobs.xml
new file mode 100644
index 0000000..f34c5b9
--- /dev/null
+++ b/hacks/config/shadebobs.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="shadebobs" _label="ShadeBobs">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gJtxnQ5_8Zk"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="20000" default="10000"
+ convert="invert"/>
+
+ <!-- #### -degrees [0] -->
+ <!-- #### -color [random] -->
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="One" _high-label="Many"
+ low="1" high="20" default="4"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="100" default="10"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Oscillating oval patterns that look something like vapor trails or neon tubes.
+
+Written by Shane Smit; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sierpinski.xml b/hacks/config/sierpinski.xml
new file mode 100644
index 0000000..3aec43d
--- /dev/null
+++ b/hacks/config/sierpinski.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sierpinski" _label="Sierpinski">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=m0zdPWuFhjA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="1000000" default="400000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Points" _low-label="Few" _high-label="Many"
+ low="10" high="10000" default="2000"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="1000" default="100"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 2D Sierpinski triangle fractal. See also the "Sierpinski3D" screen saver.
+
+https://en.wikipedia.org/wiki/Sierpinski_triangle
+
+Written by Desmond Daignault; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sierpinski3d.xml b/hacks/config/sierpinski3d.xml
new file mode 100644
index 0000000..782fe9d
--- /dev/null
+++ b/hacks/config/sierpinski3d.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sierpinski3d" _label="Sierpinski3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TGQRLAhDLv0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="descent" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="500" default="150"
+ convert="invert"/>
+
+ <number id="depth" type="spinbutton" arg="-depth %"
+ _label="Max depth" low="1" high="6" default="5"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The recursive Sierpinski tetrahedron fractal.
+
+https://en.wikipedia.org/wiki/Sierpinski_triangle#Analogs_in_higher_dimension
+
+Written by Jamie Zawinski and Tim Robinson; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/skytentacles.xml b/hacks/config/skytentacles.xml
new file mode 100644
index 0000000..e6d1b5b
--- /dev/null
+++ b/hacks/config/skytentacles.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="skytentacles" _label="SkyTentacles" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=iCjtXUSQv1A"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Tentacles" _low-label="1" _high-label="20"
+ low="1" high="20" default="9"/>
+
+ <number id="length" type="slider" arg="-length %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="1.0" high="20.0" default="9.0"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.1" high="5.0" default="1.0"/>
+
+ <number id="flexibility" type="slider" arg="-flexibility %"
+ _label="Flexibility" _low-label="Low" _high-label="High"
+ low="0.1" high="1.0" default="0.35"/>
+
+ <number id="wiggliness" type="slider" arg="-wiggliness %"
+ _label="Wiggliness" _low-label="Low" _high-label="High"
+ low="0.1" high="1.0" default="0.35"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <number id="slices" type="slider" arg="-slices %"
+ _label="X resolution" _low-label="Low" _high-label="High"
+ low="3" high="50" default="16"/>
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Y resolution" _low-label="Low" _high-label="High"
+ low="2" high="50" default="24"/>
+
+ <hgroup>
+ <boolean id="skin" _label="Draw skin" arg-unset="-no-texture"/>
+ <boolean id="cel" _label="Cartoony" arg-set="-cel"/>
+ <boolean id="intersect" _label="Tentacles can intersect" arg-set="-intersect"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="smooth" _label="Smooth" arg-unset="-no-smooth"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+
+ <xscreensaver-updater />
+
+ <_description>
+There is a tentacled abomination in the sky. From above you it devours.
+
+Written by Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/slidescreen.xml b/hacks/config/slidescreen.xml
new file mode 100644
index 0000000..3018998
--- /dev/null
+++ b/hacks/config/slidescreen.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="slidescreen" _label="SlideScreen">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=uKNE4xCdlno"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Pause" _low-label="Short" _high-label="Long"
+ low="0" high="2000000" default="1000000"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <xscreensaver-image />
+
+ </vgroup>
+ <vgroup>
+ <number id="increment" type="slider" arg="-increment %"
+ _label="Slide speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="30" default="10"/>
+
+ <number id="grid-size" type="slider" arg="-grid-size %"
+ _label="Cell size" _low-label="Small" _high-label="Large"
+ low="12" high="500" default="70"/>
+
+ <number id="ibw" type="spinbutton" arg="-ibw %"
+ _label="Gutter size" low="0" high="50" default="4"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+A variant on a "fifteen puzzle", operating on the screen or an image.
+It divides the image into a grid and randomly shuffles the squares.
+
+https://en.wikipedia.org/wiki/Fifteen_puzzle
+
+Written by Jamie Zawinski; 1994.
+ </_description>
+</screensaver>
diff --git a/hacks/config/slip.xml b/hacks/config/slip.xml
new file mode 100644
index 0000000..5a656f3
--- /dev/null
+++ b/hacks/config/slip.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="slip" _label="Slip">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=BgzNvBm4MuE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="100" default="35"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="100" default="50"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A jet engine consumes the screen, then puts it through a spin cycle.
+
+Written by Scott Draves and Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sonar.xml b/hacks/config/sonar.xml
new file mode 100644
index 0000000..e459c51
--- /dev/null
+++ b/hacks/config/sonar.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sonar" _label="Sonar" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=XEL8g3qbthE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <select id="ping">
+ <option id="sn" _label="Ping local subnet"/>
+<!--
+ <option id="24" _label="Ping subnet/24 (254 hosts)" arg-set="-ping subnet/24"/>
+ <option id="25" _label="Ping subnet/25 (126 hosts)" arg-set="-ping subnet/25"/>
+ <option id="26" _label="Ping subnet/26 (62 hosts)" arg-set="-ping subnet/26"/>
+ <option id="27" _label="Ping subnet/27 (31 hosts)" arg-set="-ping subnet/27"/>
+ <option id="28" _label="Ping subnet/28 (14 hosts)"/>
+ <option id="29" _label="Ping subnet/29 (6 hosts)" arg-set="-ping subnet/29"/>
+ <option id="30" _label="Ping subnet/30 (2 hosts)" arg-set="-ping subnet/30"/>
+-->
+
+ <option id="ssh" _label="Ping known SSH hosts" arg-set="-ping /etc/hosts,$HOME/.ssh/known_hosts,$HOME/.ssh/known_hosts2"/>
+
+ <option id="popular" _label="Ping Google, Facebook, etc." arg-set="-ping google.com,facebook.com,twitter.com,yahoo.com,flickr.com,www.apple.com,wikipedia.org,linux.org,youtube.com,disqus.com,blogger.com,wordpress.com,tumblr.com,whitehouse.gov"/>
+
+ <option id="sim" _label="Simulation (don't ping)" arg-set="-ping simulation"/>
+ </select>
+ </vgroup>
+
+ <vgroup>
+ <number id="font" type="slider" arg="-font-size %"
+ _label="Font size" _low-label="Tiny" _high-label="Huge"
+ low="6.0" high="24.0" default="12"/>
+
+ <number id="sweep" type="slider" arg="-sweep-size %"
+ _label="Trail length" _low-label="Short" _high-label="Long"
+ low="0.02" high="0.7" default="0.3"/>
+ </vgroup>
+ </hgroup>
+
+
+ <hgroup>
+ <string id="aname" _label="Simulation team A name" arg="-team-a-name %"/>
+ <number id="acount" type="spinbutton" arg="-team-a-count %"
+ _label="A count" low="1" high="100" default="4"/>
+ </hgroup>
+
+ <hgroup>
+ <string id="bname" _label="Simulation team B name" arg="-team-b-name %"/>
+ <number id="bcount" type="spinbutton" arg="-team-b-count %"
+ _label="B count" low="1" high="100" default="4"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="dns" _label="Resolve host names" arg-unset="-no-dns"/>
+ <boolean id="times" _label="Show ping times" arg-unset="-no-times"/>
+ <boolean id="wobble" _label="Tilt" arg-unset="-no-wobble"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A sonar display pings (get it?) the hosts on your local network, and
+plots their distance (response time) from you. The three rings
+represent ping times of approximately 2.5, 70 and 2,000 milliseconds
+respectively.
+
+Alternately, it can run a simulation that doesn't involve hosts.
+
+https://en.wikipedia.org/wiki/Ping#History
+
+Written by Jamie Zawinski and Stephen Martin; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/speedmine.xml b/hacks/config/speedmine.xml
new file mode 100644
index 0000000..cf7b88a
--- /dev/null
+++ b/hacks/config/speedmine.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="speedmine" _label="SpeedMine">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=awOnhCxRD_c"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="velocity" type="slider" arg="-maxspeed %"
+ _label="Max velocity" _low-label="Slow" _high-label="Fast"
+ low="1" high="1000" default="700"/>
+
+ <number id="thrust" type="slider" arg="-thrust %"
+ _label="Thrust" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="4.0" default="1.0"/>
+
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label="Low" _high-label="High"
+ low="0.0" high="25.0" default="9.8"/>
+ </vgroup>
+ <vgroup>
+
+ <select id="mode">
+ <option id="speedmine" _label="Tunnel"/>
+ <option id="speedworm" _label="Worm" arg-set="-worm"/>
+ </select>
+
+ <boolean id="terrain" _label="Rocky walls" arg-unset="-no-terrain"/>
+ <boolean id="bump" _label="Allow wall collisions" arg-unset="-no-bumps"/>
+ <boolean id="bonus" _label="Present bonuses" arg-unset="-no-bonuses"/>
+ <boolean id="xhair" _label="Display crosshair" arg-unset="-no-crosshair"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -vertigo [1.0] -->
+ <!-- #### -darkground [#101010] -->
+ <!-- #### -lightground [#a0a0a0] -->
+ <!-- #### -tunnelend [#000000] -->
+ <!-- #### -smoothness [6] -->
+ <!-- #### -curviness [1.0] -->
+ <!-- #### -twistiness [1.0] -->
+ <!-- #### -no-widening -->
+ <!-- #### -psychedelic -->
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates speeding down a rocky mineshaft, or a funky dancing worm.
+
+Written by Conrad Parker; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sphere.xml b/hacks/config/sphere.xml
new file mode 100644
index 0000000..55a5d79
--- /dev/null
+++ b/hacks/config/sphere.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sphere" _label="Sphere">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=FswhxIVXdt8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws shaded spheres in multiple colors.
+
+Written by Tom Duff and Jamie Zawinski; 1982, 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/spheremonics.xml b/hacks/config/spheremonics.xml
new file mode 100644
index 0000000..fc4fa92
--- /dev/null
+++ b/hacks/config/spheremonics.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="spheremonics" _label="Spheremonics" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KrNVwyWi0io"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="5" high="1000" default="100"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Low" _high-label="High"
+ low="5" high="100" default="64"/>
+
+ </vgroup>
+ <vgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="smooth" _label="Smoothed lines" arg-unset="-no-smooth"/>
+ <boolean id="grid" _label="Draw grid" arg-unset="-no-grid"/>
+ <boolean id="bbox" _label="Draw bounding box" arg-set="-bbox"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+These closed objects are commonly called spherical harmonics,
+although they are only remotely related to the mathematical
+definition found in the solution to certain wave functions, most
+notably the eigenfunctions of angular momentum operators.
+
+https://en.wikipedia.org/wiki/Spherical_harmonics#Visualization_of_the_spherical_harmonics
+
+Written by Paul Bourke and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/spiral.xml b/hacks/config/spiral.xml
new file mode 100644
index 0000000..71e78c7
--- /dev/null
+++ b/hacks/config/spiral.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="spiral" _label="Spiral">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8Ov2SxnO_Kg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="100" default="40"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Cycles" _low-label="Low" _high-label="High"
+ low="10" high="800" default="350"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Moving circular moire patterns.
+
+Written by Peter Schmitzberger; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/splitflap.xml b/hacks/config/splitflap.xml
new file mode 100644
index 0000000..265c9b6
--- /dev/null
+++ b/hacks/config/splitflap.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="splitflap" _label="SplitFlap" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rZOL2jyDey0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="width" type="spinbutton" arg="-width %"
+ _label="Columns" low="1" high="120" default="22"/>
+ <number id="height" type="spinbutton" arg="-height %"
+ _label="Rows" low="1" high="40" default="8"/>
+
+ <select id="text">
+ <option id="text" _label="Display text" />
+ <option id="c12" _label="Display 12-hour clock" arg-set="-mode clock12" />
+ <option id="c24" _label="Display 24-hour clock" arg-set="-mode clock24" />
+ </select>
+
+ <select id="facing">
+ <option id="front" _label="Always face front"/>
+ <option id="nofront" _label="Spin all the way around" arg-set="-no-front"/>
+ </select>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-text />
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Simulates a split-flap display, an old style of electromechanical
+sign as seen in airports and train stations, and commonly used in
+alarm clocks in the 1960s and 1970s.
+
+https://en.wikipedia.org/wiki/Split-flap_display
+https://en.wikipedia.org/wiki/Flip_clock
+
+Written by Jamie Zawinski; 2015.
+ </_description>
+</screensaver>
diff --git a/hacks/config/splodesic.xml b/hacks/config/splodesic.xml
new file mode 100644
index 0000000..0970fd3
--- /dev/null
+++ b/hacks/config/splodesic.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="splodesic" _label="Splodesic" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pwpTs1pEQmM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Eruption frequency" _low-label="Seldom" _high-label="Often"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <hgroup>
+ <number id="freq" type="spinbutton" arg="-depth %"
+ _label="Depth" low="0" high="5" default="4"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A geodesic sphere experiences a series of eruptions.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/spotlight.xml b/hacks/config/spotlight.xml
new file mode 100644
index 0000000..24bfb9a
--- /dev/null
+++ b/hacks/config/spotlight.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="spotlight" _label="Spotlight">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=av29CVh2UeM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Spotlight size" _low-label="Small" _high-label="Large"
+ low="5" high="350" default="125"/>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A spotlight scanning across a black screen, illuminating a loaded
+image when it passes.
+
+Written by Rick Schultz and Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sproingies.xml b/hacks/config/sproingies.xml
new file mode 100644
index 0000000..1d16ff0
--- /dev/null
+++ b/hacks/config/sproingies.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sproingies" _label="Sproingies" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=fmHl17ppgc0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Sproingies" _low-label="One" _high-label="Lots"
+ low="1" high="30" default="8"/>
+
+ <hgroup>
+ <boolean id="nofall" _label="Fall off edge" arg-set="-fall"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Slinky-like creatures walk down an infinite staircase and
+occasionally explode!
+
+https://en.wikipedia.org/wiki/Slinky
+https://en.wikipedia.org/wiki/Q%2Abert
+https://en.wikipedia.org/wiki/Marble_Madness
+
+Written by Ed Mackey; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/squiral.xml b/hacks/config/squiral.xml
new file mode 100644
index 0000000..1cc7e44
--- /dev/null
+++ b/hacks/config/squiral.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="squiral" _label="Squiral">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=WPhqyM9Bb4o"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="disorder" type="slider" arg="-disorder %"
+ _label="Randomness" _low-label="Low" _high-label="High"
+ low="0.0" high="0.5" default="0.005"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Seeds" low="0" high="200" default="0"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="handedness" type="slider" arg="-handedness %"
+ _label="Handedness" _low-label="Left" _high-label="Right"
+ low="0.0" high="1.0" default="0.5"/>
+
+ <number id="fill" type="slider" arg="-fill %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="0" high="100" default="75"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -cycle -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Square-spiral-producing automata. The spirals grow outward until they
+hit something, then they go around it.
+
+Written by Jeff Epler; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/stairs.xml b/hacks/config/stairs.xml
new file mode 100644
index 0000000..099f963
--- /dev/null
+++ b/hacks/config/stairs.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="stairs" _label="Stairs" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Y1ceRT30qr0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Escher's infinite staircase.
+
+https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
+
+Written by Marcelo Vianna and Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/starfish.xml b/hacks/config/starfish.xml
new file mode 100644
index 0000000..006bc00
--- /dev/null
+++ b/hacks/config/starfish.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="starfish" _label="Starfish">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=atwc7IJHuLo"/>
+
+ <select id="mode">
+ <option id="random" _label="Random"/>
+ <option id="zoom" _label="Color gradients" arg-set="-mode zoom"/>
+ <option id="blob" _label="Pulsating blob" arg-set="-mode blob"/>
+ </select>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="1 second" _high-label="30 seconds"
+ low="1" high="60" default="30"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Lines" _low-label="Thin" _high-label="Thick"
+ low="0" high="150" default="0"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Undulating, throbbing, star-like patterns pulsate, rotate, and turn
+inside out. Another display mode uses these shapes to lay down a
+field of colors, which are then cycled. The motion is very organic.
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/starwars.xml b/hacks/config/starwars.xml
new file mode 100644
index 0000000..caa005e
--- /dev/null
+++ b/hacks/config/starwars.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="starwars" _label="StarWars" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=UUjC-6e7y_U"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _low-label=" Frame rate Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+ <number id="steps" type="slider" arg="-steps %"
+ _low-label="Scroll speed Slow" _high-label="Fast"
+ low="1" high="100" default="35"
+ convert="invert"/>
+ <number id="spin" type="slider" arg="-spin %"
+ _low-label=" Stars speed Slow" _high-label="Fast"
+ low="0.0" high="0.2" default="0.03"/>
+
+ <xscreensaver-text />
+ </vgroup>
+
+ <vgroup>
+ <select id="align">
+ <option id="left" _label="Flush left text" arg-set="-alignment left"/>
+ <option id="center" _label="Centered text"/>
+ <option id="right" _label="Flush right text" arg-set="-alignment right"/>
+ </select>
+
+ <boolean id="wrap" _label="Wrap long lines" arg-unset="-no-wrap"/>
+ <boolean id="texture" _label="Texture-mapped font" arg-unset="-no-textures"/>
+ <boolean id="smooth" _label="Anti-aliased lines" arg-unset="-no-smooth"/>
+ <hgroup>
+ <boolean id="thick" _label="Thick lines" arg-unset="-no-thick"/>
+ <boolean id="fade" _label="Fade out" arg-unset="-no-fade"/>
+ </hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <number id="lines" type="spinbutton" arg="-lines %"
+ _label="Text lines" low="4" high="1000" default="125"/>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Font point size" low="-1" high="10" default="-1"/>
+ <number id="columns" type="spinbutton" arg="-columns %"
+ _label="or, Text columns" low="-1" high="200" default="-1"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A stream of text slowly scrolling into the distance at an
+angle, over a star field, like at the beginning of the movie of the
+same name.
+
+https://en.wikipedia.org/wiki/Star_Wars_opening_crawl
+
+Written by Jamie Zawinski and Claudio Matsuoka; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/stonerview.xml b/hacks/config/stonerview.xml
new file mode 100644
index 0000000..5db55f5
--- /dev/null
+++ b/hacks/config/stonerview.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="stonerview" _label="StonerView" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xvDK_wwnXWs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="trans" _label="Translucent" arg-unset="-no-transparent"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Chains of colorful squares dance around each other in complex spiral
+patterns. Inspired by David Tristram's `electropaint' screen saver,
+originally written for SGI computers in the late 1980s or early 1990s.
+
+Written by Andrew Plotkin; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/strange.xml b/hacks/config/strange.xml
new file mode 100644
index 0000000..fcaeb63
--- /dev/null
+++ b/hacks/config/strange.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="strange" _label="Strange">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=F1qna7UAxC0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="curve" type="slider" arg="-curve %"
+ _label="Curviness" _low-label="Low" _high-label="High"
+ low="1" high="50" default="10"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Number of points" _low-label="1k" _high-label="500k"
+ low="1000" high="500000" default="5500"/>
+
+ <number id="pointSize" type="slider" arg="-point-size %"
+ _label="Point size" _low-label="1" _high-label="8"
+ low="1" high="8" default="1"/>
+ </vgroup>
+ <vgroup>
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Zoom" _low-label="10%" _high-label="400%"
+ low="0.1" high="4.0" default="0.9"/>
+
+ <number id="brightness" type="slider" arg="-brightness %"
+ _label="Brightness" _low-label="10%" _high-label="400%"
+ low="0.1" high="4.0" default="1.0"/>
+
+ <number id="motionBlur" type="slider" arg="-motion-blur %"
+ _label="Motion blur" _low-label="1" _high-label="10"
+ low="1.0" high="10.0" default="3.0"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Strange attractors: a swarm of dots swoops and twists around.
+
+https://en.wikipedia.org/wiki/Attractor#Strange_attractor
+
+Written by Massimino Pascal; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/substrate.xml b/hacks/config/substrate.xml
new file mode 100644
index 0000000..11e8ccc
--- /dev/null
+++ b/hacks/config/substrate.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="substrate" _label="Substrate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dCCVgBOVD0E"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-growth-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="18000" convert="invert"/>
+
+ <number id="maxcyc" type="slider" arg="-max-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2000" high="25000" default="10000" />
+
+ <number id="sandg" type="slider" arg="-sand-grains %"
+ _label="Sand grains" _low-label="Few" _high-label="Lots"
+ low="16" high="128" default="64" />
+
+ <number id="curve" type="slider" arg="-circle-percent %"
+ _label="Circle percentage" _low-label="0%" _high-label="100%"
+ low="0" high="100" default="33" />
+ </vgroup>
+ <vgroup>
+ <number id="init" type="spinbutton" arg="-initial-cracks %"
+ _label="Initial cracks" low="3" high="15" default="3"/>
+
+ <boolean id="wire" _label="Wireframe only" arg-set="-wireframe" />
+
+ <boolean id="seamless" _label="Seamless mode" arg-set="-seamless" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Crystalline lines grow on a computational substrate. A simple
+perpendicular growth rule creates intricate city-like structures.
+
+Written by J. Tarbell and Mike Kershaw; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/superquadrics.xml b/hacks/config/superquadrics.xml
new file mode 100644
index 0000000..642125c
--- /dev/null
+++ b/hacks/config/superquadrics.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="superquadrics" _label="Superquadrics" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Mjlc7iPA1N4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="spinspeed" type="slider" arg="-spinspeed %"
+ _label="Spin speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="15.0" default="5.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="0" high="100" default="25"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="100" default="40"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Morphing 3D shapes.
+
+Written by Ed Mackey; 1987, 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/surfaces.xml b/hacks/config/surfaces.xml
new file mode 100644
index 0000000..92a184a
--- /dev/null
+++ b/hacks/config/surfaces.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="surfaces" _label="Surfaces" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Q412lxz3fTg"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="descent" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="2000" default="300"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="surface">
+ <option id="random" _label="Random Surface"/>
+ <option id="dini" _label="Dini's Surface" arg-set="-surface dini"/>
+ <option id="enneper" _label="Enneper's Surface" arg-set="-surface enneper"/>
+ <option id="kuen" _label="Kuen Surface" arg-set="-surface kuen"/>
+ <option id="moebius" _label="Moebius Strip" arg-set="-surface moebius"/>
+ <option id="seashell" _label="Seashell" arg-set="-surface seashell"/>
+ <option id="swallow" _label="Swallowtail" arg-set="-surface swallowtail"/>
+ <option id="bohemian" _label="Bohemian Dome" arg-set="-surface bohemian"/>
+ <option id="whitney" _label="Whitney Umbrella" arg-set="-surface whitney"/>
+ <option id="pluecker" _label="Pluecker's Conoid" arg-set="-surface pluecker"/>
+ <option id="henneberg" _label="Henneberg's Surface" arg-set="-surface henneberg"/>
+ <option id="catalan" _label="Catalan's Surface" arg-set="-surface catalan"/>
+ <option id="corkscrew" _label="Corkscrew Surface" arg-set="-surface corkscrew"/>
+ </select>
+
+ <select id="mode">
+ <option id="random" _label="Random Display Mode"/>
+ <option id="points" _label="Points" arg-set="-mode points"/>
+ <option id="lines" _label="Lines" arg-set="-mode lines"/>
+ <option id="line_loop" _label="Line Loops" arg-set="-mode line-loops"/>
+ </select>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Parametric surfaces.
+
+http://mathworld.wolfram.com/DinisSurface.html
+https://en.wikipedia.org/wiki/Enneper_surface
+http://mathworld.wolfram.com/EnnepersMinimalSurface.html
+http://mathworld.wolfram.com/KuenSurface.html
+https://en.wikipedia.org/wiki/Moebius_strip
+http://mathworld.wolfram.com/Seashell.html
+http://mathworld.wolfram.com/SwallowtailCatastrophe.html
+http://mathworld.wolfram.com/BohemianDome.html
+https://en.wikipedia.org/wiki/Whitney_umbrella
+http://mathworld.wolfram.com/PlueckersConoid.html
+http://mathworld.wolfram.com/HennebergsMinimalSurface.html
+http://mathworld.wolfram.com/CatalansSurface.html
+http://mathworld.wolfram.com/CorkscrewSurface.html
+
+Written by Andrey Mirtchovski and Carsten Steger; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/swirl.xml b/hacks/config/swirl.xml
new file mode 100644
index 0000000..199bdb7
--- /dev/null
+++ b/hacks/config/swirl.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="swirl" _label="Swirl">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=o_VRQxPCB7w"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flowing, swirly patterns.
+
+Written by M. Dobie and R. Taylor; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/t3d.xml b/hacks/config/t3d.xml
new file mode 100644
index 0000000..d1fd19b
--- /dev/null
+++ b/hacks/config/t3d.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="t3d" _label="T3D">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=5UohH7U2CAI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="move" type="slider" arg="-move %"
+ _label="Turn side-to-side" _low-label="0 deg" _high-label="90 deg"
+ low="0.0" high="3.0" default="0.5"/>
+
+ <number id="wobble" type="slider" arg="-wobble %"
+ _label="Wobbliness" _low-label="Low" _high-label="High"
+ low="0.0" high="3.0" default="2.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="cycle" type="slider" arg="-cycle %"
+ _label="Cycle seconds" _low-label="Low" _high-label="High"
+ low="0.0" high="60.0" default="10.0"/>
+
+ <number id="mag" type="slider" arg="-mag %"
+ _label="Magnification" _low-label="Smaller" _high-label="Bigger"
+ low="0.1" high="4.0" default="1.0"/>
+
+ <select id="mins">
+ <option id="min2" _label="Minute tick marks" arg-set="-minutes"/>
+ <option id="min5" _label="5 minute tick marks"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -fast [50] -->
+ <!-- #### -colcycle [?] -->
+ <!-- #### -hsvcycle [0.0] -->
+ <!-- #### -rgb [?] -->
+ <!-- #### -hsv [?] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws a working analog clock composed of floating, throbbing bubbles.
+
+Written by Bernd Paysan; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/tangram.xml b/hacks/config/tangram.xml
new file mode 100644
index 0000000..11b8f71
--- /dev/null
+++ b/hacks/config/tangram.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="tangram" _label="Tangram" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JgJ-OsgCCJ4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"/>
+
+ <number id="viewing_time" type="slider" arg="-viewing_time %"
+ _label="Linger" _low-label="Brief" _high-label="Long"
+ low="0" high="30" default="5" />
+
+ <number id="x_camera_rotate" type="slider" arg="-x_camera_rotate %"
+ _label="X rotation" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.2" />
+
+ <number id="y_camera_rotate" type="slider" arg="-y_camera_rotate %"
+ _label="Y rotation" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.5" />
+
+ <number id="z_camera_rotate" type="slider" arg="-z_camera_rotate %"
+ _label="Z rotation" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0" />
+
+ <hgroup>
+ <boolean id="labels" _label="Draw labels" arg-unset="-no-labels"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Solves tangram puzzles.
+
+https://en.wikipedia.org/wiki/Tangram
+
+Written by Jeremy English; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/tessellimage.xml b/hacks/config/tessellimage.xml
new file mode 100644
index 0000000..f6e1a3c
--- /dev/null
+++ b/hacks/config/tessellimage.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="tessellimage" _label="Tessellimage">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JNgybysnYU8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration2" type="slider" arg="-duration2 %"
+ _label="Speed" _low-label="0.1 second" _high-label="4 seconds"
+ low="0.1" high="4.0" default="0.4"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="depth" type="slider" arg="-max-depth %"
+ _label="Complexity" _low-label="Shallow" _high-label="Deep"
+ low="1000" high="100000" default="30000"/>
+ </vgroup>
+
+ <vgroup>
+
+ <select id="mode">
+ <option id="random" _label="Delaunay or voronoi"/>
+ <option _label="Delaunay" arg-set="-mode delaunay"/>
+ <option _label="Voronoi" arg-set="-mode voronoi"/>
+ </select>
+
+ <xscreensaver-image />
+
+ <boolean id="fill" _label="Fill screen" arg-unset="-no-fill-screen"/>
+ <boolean id="outline" _label="Outline triangles" arg-unset="-no-outline"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Converts an image to triangles using Delaunay tessellation, or to
+polygons using Voronoi tesselation, and animates the result at
+various depths.
+
+More polygons are allocated to visually complex parts of the image.
+This is accomplished by first computing the first derivative of the
+image: the distance between each pixel and its neighbors (which is
+essentially edge detection or embossing). Then the Delaunay or
+Voronoi control points are chosen by selecting those pixels whose
+distance value is above a certain threshold: those are the pixels that
+have the largest change in color/brightness.
+
+https://en.wikipedia.org/wiki/Delaunay_triangulation
+https://en.wikipedia.org/wiki/Voronoi_diagram
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/testx11.xml b/hacks/config/testx11.xml
new file mode 100644
index 0000000..aaf85a7
--- /dev/null
+++ b/hacks/config/testx11.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<screensaver name="testx11" _label="TestX11">
+
+ <command arg="-root"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Test platform for JWXYZ - the X11 compatibility shim for OS X and iOS.
+End users shouldn't normally see this one.
+
+Written by Dave Odell; 2015.
+ </_description>
+</screensaver>
diff --git a/hacks/config/thornbird.xml b/hacks/config/thornbird.xml
new file mode 100644
index 0000000..8bbd1ab
--- /dev/null
+++ b/hacks/config/thornbird.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="thornbird" _label="Thornbird">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rfGfPezVnac"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Points" _low-label="Few" _high-label="Many"
+ low="10" high="1000" default="100"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="2" high="1000" default="400"/>
+
+<!--
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+-->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a view of the "Bird in a Thornbush" fractal.
+
+Written by Tim Auckland; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/timetunnel.xml b/hacks/config/timetunnel.xml
new file mode 100644
index 0000000..caab9fc
--- /dev/null
+++ b/hacks/config/timetunnel.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="timetunnel" _label="TimeTunnel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=GZe5rk_7TnA"/>
+
+ <number id="start" type="slider" arg="-start %"
+ _label="Start sequence time" _low-label="0 sec" _high-label="30 sec"
+ low="0.00" high="27.79" default="0.00"/>
+
+ <number id="end" type="slider" arg="-end %"
+ _label="End sequence time" _low-label="0 sec" _high-label="30 sec"
+ low="0.00" high="27.79" default="27.79"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="logo" _label="Draw logo" arg-unset="-no-logo"/>
+ <boolean id="reverse" _label="Run backward" arg-set="-reverse"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+<!--
+ <string id="tardis" _label="Tardis image " arg="-tardis %"/>
+ <string id="head" _label="Head image " arg="-head %"/>
+ <string id="marquee" _label="Marquee image " arg="-marquee %"/>
+ <string id="tun1" _label="Tardis tunnel image " arg="-tun1 %"/>
+ <string id="tun2" _label="Middle tunnel image" arg="-tun2 %"/>
+ <string id="tun3" _label="Final tunnel image " arg="-tun3 %"/>
+-->
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An animation similar to the title sequence of Dr. Who in the 70s.
+
+Written by Sean P. Brennan; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/topblock.xml b/hacks/config/topblock.xml
new file mode 100644
index 0000000..df498bc
--- /dev/null
+++ b/hacks/config/topblock.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="topblock" _label="TopBlock" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=zj0FHFJgQJ8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="dropspeed" type="slider" arg="-dropSpeed %"
+ _label="Drop speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="9" default="4"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Carpet size" _low-label="Small" _high-label="Large"
+ low="1" high="10" default="2"/>
+
+ <number id="spawn" type="slider" arg="-spawn %"
+ _label="Spawn likelyhood" _low-label="Low" _high-label="High"
+ low="4" high="1000" default="50"
+ convert="invert"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Polygon count" _low-label="Low" _high-label="High"
+ low="4" high="20" default="4"/>
+
+ <number id="maxColors" type="slider" arg="-maxColors %"
+ _label="Colors" _low-label="Few" _high-label="Many"
+ low="1" high="32" default="7"/>
+
+ <number id="rotatespeed" type="slider" arg="-rotateSpeed %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="1" high="1000" default="10"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="follow" _label="Follow" arg-set="-follow"/>
+ <boolean id="blob" _label="Blob mode" arg-set="-blob"/>
+ <boolean id="override" _label="Tunnel mode" arg-set="-override"/>
+ <boolean id="carpet" _label="Carpet" arg-unset="-no-carpet"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="nipples" _label="Nipples" arg-unset="-no-nipples"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Creates a 3D world with dropping blocks that build up and up.
+Written by rednuht; 2006.
+ </_description>
+</screensaver>
diff --git a/hacks/config/triangle.xml b/hacks/config/triangle.xml
new file mode 100644
index 0000000..70d9949
--- /dev/null
+++ b/hacks/config/triangle.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="triangle" _label="Triangle">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=GXrzjY-Flro"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="128"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates random mountain ranges using iterative subdivision of
+triangles.
+
+Written by Tobias Gloth; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/tronbit.xml b/hacks/config/tronbit.xml
new file mode 100644
index 0000000..965d333
--- /dev/null
+++ b/hacks/config/tronbit.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="tronbit" _label="TronBit" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dIF4fodt-L8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The character "Bit" from the film, "Tron".
+
+The "yes" state is a tetrahedron; the "no" state is the second
+stellation of an icosahedron; and the idle state oscillates between
+a small triambic icosahedron and the compound of an icosahedron and
+a dodecahedron.
+
+https://en.wikipedia.org/wiki/List_of_Tron_characters#Bit
+https://en.wikipedia.org/wiki/Uniform_polyhedra
+https://en.wikipedia.org/wiki/Stellation
+
+Written by Jamie Zawinski; 2011.
+ </_description>
+</screensaver>
diff --git a/hacks/config/truchet.xml b/hacks/config/truchet.xml
new file mode 100644
index 0000000..c20a3f8
--- /dev/null
+++ b/hacks/config/truchet.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="truchet" _label="Truchet">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=hoJ23JSsUD8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="1000000" default="400000"
+ convert="invert"/>
+
+ <!-- #### -min-width [40] -->
+ <!-- #### -max-height [150] -->
+ <!-- #### -max-width [150] -->
+ <!-- #### -min-height [40] -->
+ <!-- #### -max-linewidth [25] -->
+ <!-- #### -min-linewidth [2] -->
+ <!-- #### -no-erase -->
+ <!-- #### -erase-count [25] -->
+ <!-- #### -not-square -->
+ <!-- #### -no-angles -->
+ <!-- #### -no-curves -->
+ <!-- #### -scroll -->
+ <!-- #### -scroll-overlap [400] -->
+ <!-- #### -anim-delay [100] -->
+ <!-- #### -anim-step-size [3] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Line- and arc-based truchet patterns that tile the screen.
+
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Adrian Likins; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/twang.xml b/hacks/config/twang.xml
new file mode 100644
index 0000000..3eefded
--- /dev/null
+++ b/hacks/config/twang.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="twang" _label="Twang">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=7pxDMSduQoU"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="event-chance" type="slider" arg="-event-chance %"
+ _label="Randomness" _low-label="Slow" _high-label="Jumpy"
+ low="0.0" high="0.1" default="0.01"/>
+
+ <number id="friction" type="slider" arg="-friction %"
+ _label="Friction" _low-label="Low" _high-label="High"
+ low="0.0" high="0.2" default="0.05"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="springiness" type="slider" arg="-springiness %"
+ _label="Springiness" _low-label="Low" _high-label="High"
+ low="0.0" high="1.0" default="0.1"/>
+
+ <number id="transference" type="slider" arg="-transference %"
+ _label="Transference" _low-label="Low" _high-label="High"
+ low="0.0" high="0.1" default="0.025"/>
+
+ <number id="tile-size" type="slider" arg="-tile-size %"
+ _label="Tile size" _low-label="Small" _high-label="Large"
+ low="10" high="512" default="120"/>
+
+ <number id="border-width" type="spinbutton" arg="-border-width %"
+ _label="Border width" low="0" high="20" default="3"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Divides the screen into a grid, and plucks them.
+
+Written by Dan Bornstein; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/unicrud.xml b/hacks/config/unicrud.xml
new file mode 100644
index 0000000..327e033
--- /dev/null
+++ b/hacks/config/unicrud.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="unicrud" _label="Unicrud" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=prEzdYMZ7xA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="titles" _label="Show titles" arg-unset="-no-titles"/>
+ </hgroup>
+
+ <select id="block">
+ <option _label="Display everything"/>
+ <option _label="Display Latin1" arg-set="-block Latin1,Latin_Extended-A,Latin_Extended-B,Spacing_Modifier_Letters"/>
+ <option _label="Display simple characters" arg-set="-block Latin1,Latin_Extended-A,Latin_Extended-B,Spacing_Modifier_Letters,Phonetic_Extensions,Latin_Extended_Additional,Greek_Extended,General_Punctuation,Superscripts_and_Subscripts,Currency_Symbols,Letterlike_Symbols,Number_Forms"/>
+ <option _label="Display mathematical symbols" arg-set="-block Greek_and_Coptic,Mathematical_Operators,Miscellaneous_Mathematical_Symbols-A,Supplemental_Arrows-A,Supplemental_Arrows-B,Miscellaneous_Mathematical_Symbols-B,Supplemental_Mathematical_Operators,Miscellaneous_Symbols_and_Arrows"/>
+ <option _label="Display emoticons" arg-set="-block Currency_Symbols,Miscellaneous_Technical,Box_Drawing,Geometric_Shapes,Miscellaneous_Symbols,Dingbats,Mahjong_Tiles,Domino_Tiles,Playing_Cards,Miscellaneous_Symbols_and_Pictographs,Emoticons,Ornamental_Dingbats,Transport_and_Map_Symbols,Alchemical_Symbols,Geometric_Shapes_Extended,Supplemental_Symbols_and_Pictographs,Egyptian_Hieroglyphs"/>
+ <option _label="Display hieroglyphs" arg-set="-block Egyptian_Hieroglyphs"/>
+ </select>
+
+ <xscreensaver-updater />
+
+ <_description>
+Chooses a random Unicode character and displays it full screen,
+along with some information about it.
+
+https://en.wikipedia.org/wiki/Unicode
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/unknownpleasures.xml b/hacks/config/unknownpleasures.xml
new file mode 100644
index 0000000..7ef79ac
--- /dev/null
+++ b/hacks/config/unknownpleasures.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="unknownpleasures" _label="UnknownPleasures" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=vuWhUxBq99E"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Scanlines" _low-label="Few" _high-label="Many"
+ low="3" high="200" default="80"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="3.0" default="1.0"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Low" _high-label="High"
+ low="5" high="300" default="100"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="ortho" _label="Orthographic Projection" arg-unset="-no-ortho"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+PSR B1919+21 (AKA CP 1919) was the first pulsar ever discovered:
+a spinning neutron star emitting a periodic lighthouse-like beacon.
+An illustration of the signal received from it was published in
+Scientific American in 1971, and later in The Cambridge Encyclopedia
+of Astronomy in 1977, where it was seen by Stephen Morris, the
+drummer of Joy Division, and was consequently appropriated by
+Peter Saville for the cover of the band's album "Unknown Pleasures".
+
+https://en.wikipedia.org/wiki/Pulsar
+https://en.wikipedia.org/wiki/PSR_B1919%2B21
+https://en.wikipedia.org/wiki/Unknown_Pleasures
+https://en.wikipedia.org/wiki/Peter_Saville_%28graphic_designer%29
+https://en.wikipedia.org/wiki/Joy_Division
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vermiculate.xml b/hacks/config/vermiculate.xml
new file mode 100644
index 0000000..7d82ab0
--- /dev/null
+++ b/hacks/config/vermiculate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vermiculate" _label="Vermiculate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=YSg9KY-qw5o"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="1000" default="1" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Squiggly worm-like paths.
+
+Written by Tyler Pierce; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vfeedback.xml b/hacks/config/vfeedback.xml
new file mode 100644
index 0000000..2accd19
--- /dev/null
+++ b/hacks/config/vfeedback.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vfeedback" _label="VFeedback">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=I_MkW0CW4QM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ <number id="noise" type="slider" arg="-noise %"
+ _label="Noise" _low-label="Low" _high-label="High"
+ low="0.0" high="0.2" default="0.02"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="1.5"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates video feedback: pointing a video camera at an NTSC television.
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vidwhacker.xml b/hacks/config/vidwhacker.xml
new file mode 100644
index 0000000..e1fade1
--- /dev/null
+++ b/hacks/config/vidwhacker.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vidwhacker" _label="VidWhacker">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=u8esWjcR4eI"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="2 seconds" _high-label="2 minutes"
+ low="2" high="120" default="5"/>
+
+ <file id="directory" _label="Image directory" arg="-directory %"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a distorted frame video.
+
+This is a shell script that grabs a frame of video from the system's
+video input, and then uses some PBM filters (chosen at random) to
+manipulate and recombine the video frame in various ways (edge
+detection, subtracting the image from a rotated version of itself,
+etc.) Then it displays that image for a few seconds, and does it
+again. This works really well if you just feed broadcast television
+into it.
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vigilance.xml b/hacks/config/vigilance.xml
new file mode 100644
index 0000000..ea9962e
--- /dev/null
+++ b/hacks/config/vigilance.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vigilance" _label="Vigilance" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=b7y35gr3WZ0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of cameras" _low-label="One" _high-label="Lots"
+ low="1" high="30" default="5"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Security cameras keep careful track of their surroundings.
+You can trust them. Everything is completely under control.
+
+Written by Jamie Zawinski; 2017.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vines.xml b/hacks/config/vines.xml
new file mode 100644
index 0000000..0299d77
--- /dev/null
+++ b/hacks/config/vines.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vines" _label="Vines">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IaVfFCIAUn8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="250000" default="200000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Generates a continuous sequence of small, curvy geometric patterns.
+
+Written by Tracy Camp and David Hansen; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/voronoi.xml b/hacks/config/voronoi.xml
new file mode 100644
index 0000000..9e0ef2e
--- /dev/null
+++ b/hacks/config/voronoi.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="voronoi" _label="Voronoi" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=hD_8cBvknUM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Points" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="25"/>
+
+ <number id="pointSize" type="slider" arg="-point-size %"
+ _label="Point size" _low-label="0" _high-label="50 pixels"
+ low="0" high="50" default="9"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="pointSpeed" type="slider" arg="-point-speed %"
+ _label="Wander speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="10.0" default="1.0"/>
+
+ <number id="pointDelay" type="slider" arg="-point-delay %"
+ _label="Insertion speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="3.0" default="0.05"
+ convert="invert"/>
+
+ <number id="zoomSpeed" type="slider" arg="-zoom-speed %"
+ _label="Zoom speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <number id="zoomDelay" type="slider" arg="-zoom-delay %"
+ _label="Zoom frequency" _low-label="0" _high-label="60 seconds"
+ low="0" high="60" default="15"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Voronoi tessellation. Periodically zooms in and adds new points.
+The existing points also wander around.
+
+There are a set of control points on the plane, each at the center of
+a colored cell. Every pixel within that cell is closer to that cell's
+control point than to any other control point. That is what
+determines the cell's shapes.
+
+https://en.wikipedia.org/wiki/Voronoi_diagram
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/wander.xml b/hacks/config/wander.xml
new file mode 100644
index 0000000..ad72fe8
--- /dev/null
+++ b/hacks/config/wander.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="wander" _label="Wander">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2ZZC46Z9wJE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="1" high="30" default="2"
+ convert="invert"/>
+
+ <number id="reset" type="slider" arg="-reset %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="10000" high="3000000" default="2500000"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="length" type="slider" arg="-length %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="100" high="100000" default="25000"/>
+
+ <number id="advance" type="slider" arg="-advance %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="1" high="100" default="1"/>
+
+ <hgroup>
+ <boolean id="circles" _label="Draw spots" arg-set="-circles"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="0" high="100" default="1"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A colorful random-walk.
+
+https://en.wikipedia.org/wiki/Random_walk
+
+Written by Rick Campbell; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/webcollage.xml b/hacks/config/webcollage.xml
new file mode 100644
index 0000000..c26ea98
--- /dev/null
+++ b/hacks/config/webcollage.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="webcollage" _label="WebCollage">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=u8esWjcR4eI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Delay between images" _low-label="None" _high-label="30 secs"
+ low="0" high="30" default="2"/>
+
+ <number id="timeout" type="slider" arg="-timeout %"
+ _label="Network timeout" _low-label="2 secs" _high-label="2 min"
+ low="2" high="120" default="30"/>
+ </vgroup>
+ <vgroup>
+ <number id="opacity" type="slider" arg="-opacity %"
+ _label="Image opacity" _low-label="Transparent" _high-label="Opaque"
+ low="0.1" high="1.0" default="0.85"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+<!--
+ <string id="filter" _label="Per-image filter program" arg="-filter %"/>
+ <string id="filter2" _label="Overall filter program" arg="-filter2 %"/>
+ <file id="dictionary" _label="Dictionary file" arg="-dictionary %"/>
+ <file id="dir" _label="Image directory" arg="-directory %"/>
+ -->
+
+ <xscreensaver-updater />
+
+ <_description>
+This is what the Internet looks like.
+
+This creates collages out of random images from the World Wide Web.
+It finds the images by feeding random words into various search
+engines, and pulling images (or sections of images) out of the pages
+returned.
+
+WARNING: THE INTERNET SOMETIMES CONTAINS PORNOGRAPHY.
+
+The Internet being what it is, absolutely anything might show up in the
+collage including -- quite possibly -- pornography, or even nudity.
+Please act accordingly.
+
+See also https://www.jwz.org/webcollage/
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/whirlwindwarp.xml b/hacks/config/whirlwindwarp.xml
new file mode 100644
index 0000000..7cd774e
--- /dev/null
+++ b/hacks/config/whirlwindwarp.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="whirlwindwarp" _label="WhirlWindWarp">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=eWrRhSYzimY"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Particles" _low-label="Few" _high-label="Many"
+ low="10" high="1000" default="400"/>
+
+ <number id="tails" type="slider" arg="-tails %"
+ _label="Trail size" _low-label="Short" _high-label="Long"
+ low="1" high="50" default="8"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Floating stars are acted upon by a mixture of simple 2D
+force fields. The strength of each force field changes
+continuously, and it is also switched on and off at random.
+
+Written by Paul 'Joey' Clark; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/whirlygig.xml b/hacks/config/whirlygig.xml
new file mode 100644
index 0000000..d7842db
--- /dev/null
+++ b/hacks/config/whirlygig.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="whirlygig" _label="Whirlygig">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Y2JTY7bssPM"/>
+
+ <hgroup>
+ <number id="whirlies" type="spinbutton" arg="-whirlies %"
+ _label="Whirlies" low="-1" high="50" default="-1"/>
+
+ <number id="lines" type="spinbutton" arg="-nlines %"
+ _label="Lines" low="-1" high="50" default="-1"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="xspeed" type="slider" arg="-xspeed %"
+ _label="X speed" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ <number id="yspeed" type="slider" arg="-yspeed %"
+ _label="Y speed" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="xamplitude" type="slider" arg="-xamplitude %"
+ _label="X amplitude" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ <number id="yamplitude" type="slider" arg="-yamplitude %"
+ _label="Y amplitude" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+
+ <!-- #### -xmode [change] -->
+
+ <hgroup>
+ <select id="xmode">
+ <option id="randomx" _label="X random" />
+ <option id="spinx" _label="X spin" arg-set="-xmode spin"/>
+ <option id="funkyx" _label="X funky" arg-set="-xmode funky"/>
+ <option id="circlex" _label="X circle" arg-set="-xmode circle"/>
+ <option id="linearx" _label="X linear" arg-set="-xmode linear"/>
+ <option id="testx" _label="X test" arg-set="-xmode test"/>
+ <option id="funx" _label="X fun" arg-set="-xmode fun"/>
+ <option id="inniex" _label="X innie" arg-set="-xmode innie"/>
+ <option id="lissajousx" _label="X lissajous" arg-set="-xmode lissajous"/>
+ </select>
+
+ <select id="ymode">
+ <option id="randomy" _label="Y random" />
+ <option id="spiny" _label="Y spin" arg-set="-ymode spin"/>
+ <option id="funkyy" _label="Y funky" arg-set="-ymode funky"/>
+ <option id="circley" _label="Y circle" arg-set="-ymode circle"/>
+ <option id="lineary" _label="Y linear" arg-set="-ymode linear"/>
+ <option id="testy" _label="Y test" arg-set="-ymode test"/>
+ <option id="funy" _label="Y fun" arg-set="-ymode fun"/>
+ <option id="inniey" _label="Y innie" arg-set="-ymode innie"/>
+ <option id="lissajousy" _label="Y lissajous" arg-set="-ymode lissajous"/>
+ </select>
+ </hgroup>
+
+ <!-- #### -speed [1] -->
+ <!-- #### -color_modifier [-1] -->
+ <!-- #### -start_time [-1] -->
+ <!-- #### -xoffset [1.0] -->
+ <!-- #### -yoffset [1.0] -->
+ <!-- #### -offset_period [1] -->
+
+ <hgroup>
+ <boolean id="trail" _label="Leave a trail" arg-set="-trail"/>
+ <boolean id="explain" _label="Explain modes" arg-set="-explain"/>
+ <boolean id="wrap" _label="Wrap the screen" arg-set="-wrap"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Zooming chains of sinusoidal spots.
+
+Written by Ashton Trey Belew; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/winduprobot.xml b/hacks/config/winduprobot.xml
new file mode 100644
index 0000000..0aaf78a
--- /dev/null
+++ b/hacks/config/winduprobot.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="winduprobot" _label="WindupRobot" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RmpsDx9MuUM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Robot speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of robots" _low-label="One" _high-label="Lots"
+ low="1" high="100" default="25"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Robot size" _low-label="Tiny" _high-label="Huge"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <number id="opacity" type="slider" arg="-opacity %"
+ _label="Robot skin transparency" _low-label="Invisible" _high-label="Solid"
+ low="0.0" high="1.0" default="1.0"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="talk" type="slider" arg="-talk %"
+ _label="Word bubbles" _low-label="Never" _high-label="Often"
+ low="0.0" high="1.0" default="0.2"/>
+
+ <xscreensaver-text />
+
+ <hgroup>
+ <boolean id="texture" _label="Chrome" arg-unset="-no-texture"/>
+ <boolean id="fade" _label="Fade opacity" arg-unset="-no-fade"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A swarm of wind-up toy robots wander around the table-top, bumping
+into each other. Each robot contains a mechanically accurate gear
+system inside, which you can see when the robot's shell occasionally
+fades to transparency. Also, sometimes a cartoony word bubble pops up
+above a robot, full of random text.
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/worm.xml b/hacks/config/worm.xml
new file mode 100644
index 0000000..9678f29
--- /dev/null
+++ b/hacks/config/worm.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="worm" _label="Worm">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-S26J2Ja11g"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="17000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="150"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="-100" high="100" default="-20"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-20" high="20" default="-3"/>
+
+ <!-- #### -cycles [10] -->
+ <!-- #### -3d -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws multicolored worms that crawl around the screen.
+
+Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik Theiling; 1991.
+ </_description>
+</screensaver>
diff --git a/hacks/config/wormhole.xml b/hacks/config/wormhole.xml
new file mode 100644
index 0000000..387afa1
--- /dev/null
+++ b/hacks/config/wormhole.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="wormhole" _label="Wormhole">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=jGuJU8JKxlI"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="zspeed" type="slider" arg="-zspeed %"
+ _label="Star speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="30" default="10"/>
+
+ <number id="stars" type="slider" arg="-stars %"
+ _label="Stars created" _low-label="Few" _high-label="Lots"
+ low="1" high="100" default="20"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flying through a colored wormhole in space.
+
+Written by Jon Rafkind; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xanalogtv.xml b/hacks/config/xanalogtv.xml
new file mode 100644
index 0000000..5064ca1
--- /dev/null
+++ b/hacks/config/xanalogtv.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xanalogtv" _label="XAnalogTV">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=VmM1KkFsry0"/>
+
+ <hgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ <vgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="colorbars" _label="Colorbars only" arg-set="-colorbars-only"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="1500" default="1000"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An old TV set, including artifacts like snow, bloom, distortion,
+ghosting, and hash noise. It also simulates the TV warming up. It
+will cycle through 12 channels, some with images you give it, and some
+with color bars or nothing but static.
+
+Written by Trevor Blackwell; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xflame.xml b/hacks/config/xflame.xml
new file mode 100644
index 0000000..783dcab
--- /dev/null
+++ b/hacks/config/xflame.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xflame" _label="XFlame">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=jUJiULU4i0k"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+<!-- <file id="bitmap" _label="Bitmap file" arg="-bitmap %"/> -->
+
+ <!-- #### -baseline [20] -->
+ <!-- #### -hspread [30] -->
+ <!-- #### -vspread [97] -->
+ <!-- #### -residual [99] -->
+ <!-- #### -variance [50] -->
+ <!-- #### -vartrend [20] -->
+
+ <boolean id="bloom" _label="Enable blooming" arg-unset="-no-bloom"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Pulsing fire. It can also take an arbitrary image and set it on fire too.
+
+Written by Carsten Haitzler and many others; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xjack.xml b/hacks/config/xjack.xml
new file mode 100644
index 0000000..542d19f
--- /dev/null
+++ b/hacks/config/xjack.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xjack" _label="XJack">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wSOiSrEbxu4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="200000" default="50000"
+ convert="invert"/>
+
+ <!-- #### -font [] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This behaves schizophrenically and makes a lot of typos.
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xlyap.xml b/hacks/config/xlyap.xml
new file mode 100644
index 0000000..1d2e176
--- /dev/null
+++ b/hacks/config/xlyap.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xlyap" _label="XLyap">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=5MrEaXnhEPg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="linger" type="slider" arg="-linger %"
+ _label="Linger" _low-label="Brief" _high-label="Long"
+ low="0" high="10" default="5" />
+
+ <!-- #### -builtin [-1] -->
+ <!-- #### -C [1] -->
+ <!-- #### -D [50] -->
+ <!-- #### -L -->
+ <!-- #### -M [1.0] -->
+ <!-- #### -O [0] -->
+ <!-- #### -R [] -->
+ <!-- #### -S [50] -->
+ <!-- #### -a [2.0] -->
+ <!-- #### -b [2.0] -->
+ <!-- #### -c [7] -->
+ <!-- #### -F [10101010] -->
+ <!-- #### -f [abbabaab] -->
+ <!-- #### -h [] -->
+ <!-- #### -i [0.65] -->
+ <!-- #### -m [] -->
+ <!-- #### -o [] -->
+ <!-- #### -p -->
+ <!-- #### -r [65000] -->
+ <!-- #### -s [256] -->
+ <!-- #### -v -->
+ <!-- #### -w [] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Lyapunov exponent makes pretty fractal pictures.
+
+https://en.wikipedia.org/wiki/Lyapunov_exponent
+
+Written by Ron Record; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xmatrix.xml b/hacks/config/xmatrix.xml
new file mode 100644
index 0000000..b1afe9c
--- /dev/null
+++ b/hacks/config/xmatrix.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xmatrix" _label="XMatrix">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dSJQHm-YoWc"/>
+
+ <hgroup>
+ <select id="size">
+ <option id="font1" _label="Small font" arg-set="-small"/>
+ <option id="font2" _label="Large font"/>
+ </select>
+
+ <select id="mode">
+ <option id="matrix" _label="Matrix encoding"/>
+ <option id="binary" _label="Binary encoding" arg-set="-mode binary"/>
+ <option id="hex" _label="Hexadecimal encoding" arg-set="-mode hex"/>
+ <option id="dna" _label="Genetic encoding" arg-set="-mode dna"/>
+ <option id="pipe" _label="Piped ASCII text" arg-set="-mode pipe"/>
+ </select>
+
+ <select id="fill">
+ <option id="both" _label="Synergistic algorithm"/>
+ <option id="top" _label="Slider algorithm" arg-set="-insert top"/>
+ <option id="bottom" _label="Expansion algorithm" arg-set="-insert bottom"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="trace" _label="Run trace program" arg-unset="-no-trace"/>
+ <boolean id="knock" _label="Knock knock" arg-unset="-no-knock-knock"/>
+ <string id="phone" _label="Phone number" arg="-phone %"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Sparse" _high-label="Full"
+ low="1" high="100" default="75"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ <vgroup>
+ <xscreensaver-text />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+The "digital rain" effect, as seen on the computer monitors in
+"The Matrix".
+
+See also "GLMatrix" for a 3D rendering of the similar effect that
+appeared in the movie's title sequence.
+
+https://en.wikipedia.org/wiki/Matrix_digital_rain
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xrayswarm.xml b/hacks/config/xrayswarm.xml
new file mode 100644
index 0000000..5aaf815
--- /dev/null
+++ b/hacks/config/xrayswarm.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xrayswarm" _label="XRaySwarm">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=e_E-k37b4Vc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Worm-like swarms of particles with vapor trails.
+
+Written by Chris Leger; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xspirograph.xml b/hacks/config/xspirograph.xml
new file mode 100644
index 0000000..6be28f0
--- /dev/null
+++ b/hacks/config/xspirograph.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xspirograph" _label="XSpirograph">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=XWCeQqzNavY"/>
+
+ <number id="delay" type="slider" arg="-subdelay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="layers" type="spinbutton" arg="-layers %"
+ _label="Layers" low="1" high="10" default="2"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates that pen-in-nested-plastic-gears toy from your childhood.
+
+https://en.wikipedia.org/wiki/Spirograph
+
+Written by Rohit Singh; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xss.dtd b/hacks/config/xss.dtd
new file mode 100644
index 0000000..212d53d
--- /dev/null
+++ b/hacks/config/xss.dtd
@@ -0,0 +1,109 @@
+<!-- xscreensaver, Copyright (c) 2001-2012 Jamie Zawinski <jwz@jwz.org> -->
+<!--
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+-->
+<!--
+This DTD validates the format of the XScreenSaver configuration files.
+
+The DTD will not be devloped further, as the .XSD style validation
+can already check more of the details of the config files.
+
+DTD written by Andrew Thompson <andrewthommo@gmail.com>
+-->
+<!-- XScreenSaver settings config file. - DTD version 1.0 -->
+<!ELEMENT screensaver
+ ((command|fullcommand)*,
+ (boolean|number|select|string|file|hgroup|vgroup|xscreensaver-text|xscreensaver-image)*,
+ _description)>
+<!ATTLIST screensaver
+ name CDATA #REQUIRED
+ _label CDATA #REQUIRED
+ gl CDATA #IMPLIED
+ >
+
+<!-- Every XScreenSaver hack has exactly one of either command or fullcommand -->
+<!ELEMENT command EMPTY>
+<!ATTLIST command
+ arg CDATA #IMPLIED
+ >
+
+<!-- Checkbox -->
+<!-- One of either arg-set or arg-unset is required -->
+<!ELEMENT boolean EMPTY>
+<!ATTLIST boolean
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg-set CDATA #IMPLIED
+ arg-unset CDATA #IMPLIED
+ >
+
+<!-- Slider and Spin Button -->
+<!-- _low/high-label not required for type spinbutton -->
+<!-- arg must end with ' %' -->
+<!ELEMENT number EMPTY>
+<!ATTLIST number
+ id ID #IMPLIED
+ type (slider|spinbutton) #REQUIRED
+ _label CDATA #REQUIRED
+ _low-label CDATA #IMPLIED
+ _high-label CDATA #IMPLIED
+ arg CDATA #REQUIRED
+ low CDATA #REQUIRED
+ high CDATA #REQUIRED
+ default CDATA #REQUIRED
+ convert (invert) #IMPLIED
+ >
+
+<!-- Drop-down list -->
+<!ELEMENT select (option+)>
+<!ATTLIST select
+ id ID #IMPLIED
+ >
+
+<!-- List item -->
+<!ELEMENT option EMPTY>
+<!ATTLIST option
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg-set CDATA #IMPLIED
+ >
+
+<!-- String or Textual input -->
+<!-- arg must end with ' %' -->
+<!ELEMENT string EMPTY>
+<!ATTLIST string
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg CDATA #REQUIRED
+ >
+
+<!-- File browser. -->
+<!-- arg must end with ' %' -->
+<!ELEMENT file EMPTY>
+<!ATTLIST file
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg CDATA #REQUIRED
+ >
+
+<!ELEMENT xscreensaver-text EMPTY>
+<!ELEMENT xscreensaver-image EMPTY>
+
+<!-- Free Text. The description of the Screen Saver. -->
+<!ELEMENT _description (#PCDATA)>
+
+<!-- Horizontal grouping element, a row of widgets.
+Unimplemented in SaverBeans as of API 0.2. -->
+<!ELEMENT hgroup ((boolean|number|select|string|file|vgroup)*)> <!-- Undocumented -->
+
+<!-- Vertical grouping element, a column of widgets.
+Since the widgets are normally arranged in a column,
+this is only of use within an hgroup.
+Unimplemented in SaverBeans as of API 0.2. -->
+<!ELEMENT vgroup ((boolean|number|select|string|file|hgroup)*)> <!-- Undocumented --> \ No newline at end of file
diff --git a/hacks/config/xss.xsd b/hacks/config/xss.xsd
new file mode 100644
index 0000000..fac1fe3
--- /dev/null
+++ b/hacks/config/xss.xsd
@@ -0,0 +1,375 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- xscreensaver, Copyright (c) 2001-2005 Jamie Zawinski <jwz@jwz.org> -->
+<!--
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+-->
+<!-- XScreenSaver schema version 0.5
+
+This schema validates the format of the XScreenSaver configuration files.
+
+The notices shown above, appear at the top of the source of 'demo-Gtk-conf.c'.
+Since this schema (attempts to) describe the format of the existing
+XScreenSaver configuration files, it seems appropriate to reproduce them here.
+If it is not appropriate, please ignore/remove them rather than sue me.
+
+To check a savername.xml, reference this XSD from the file and validate it at
+ http://www.w3.org/2001/03/webdata/xsv
+
+** Background
+Andrew Thompson defined a DTD based on his understanding of the
+XScreenSaver configuration files after examining the files..
+xscreensaver-4.22
+ |- hacks
+ | |- config
+ | README
+ | *.xml
+ |- driver
+ demo-Gtk-conf.c
+
+Paul Dennis generated an XSD file (xscreensaver.xsd) from the DTD.
+This is a stricter version of that XSD, with more comments and
+documentation by Andrew Thompson.
+
+Note that Andrew does not program in c, and has not had the
+opportunity to see XScreenSaver in action (he runs Windows),
+so some of the details of the schema may be incorrect. It aims
+to be cautious, and thus might be more strict than is actually
+required.
+
+** .XSD started as version 0.1
+- generated from the DTD.
+- checked parameter types
+ - mostly as xs:string, except for..
+ - ID's - checked as xs:ID.
+- provided grouping parse logic, but specified elements
+ with maxOccurs 'unbounded'
+
+** Tightened parsing in 0.2
+- The only field still defined as xs:string is the _description.
+- A substitutionArgumentType has been introduced to lock the form of
+ the arg to '-lettersandnumbers %'
+- An argumentType has been introduced to ensure other
+ arg/arg-set/arg-unset attributes begin with '-' and
+ are followed by at least one letter or number.
+- Float and integer numeric values (low/high/default) are checked as xs:decimal
+- Remaining attributes were tightened from xs:string to xs:token.
+
+** Tightened parsing in 0.3
+ * Note that no maximums at all are stated in the XScreenSaver README!
+- maxOccurs lowered from 'unbounded' to
+ - screensaver: '200' components/groups
+ - screensaver: '40' commands/fullcommands
+ - select: '100' options
+ - hgroup: '6' components/groups per row
+ - vgroup: '40' components/groups per column
+- maxLength of _description set to '2000' chars.
+
+** Changes in version 0.4 - Strict
+ After testing against the configuration files of the XScreenSaver
+ hacks, the following changes were made..
+- Added (+ _ / $) to allowable characters for substitutionArgumentType
+ & argumentType, but tightened baseType to xs:token
+- maxOccurs changed to
+ - screensaver: '200' -> '30' components/groups
+ (xmountains.xml has 24)
+ - screensaver: '40' -> '10' commands/fullcommands
+ - select: '100' -> '200' options
+ (to account for polyhedra.xml, which has 152 options!)
+ - hgroup: '6' -> '4' components/groups per row
+ (glplanet.xml has 4)
+ - vgroup: '40' -> '10' components/groups per column
+ (bsod.xml has 9)
+- maxLength of _description changed from '2000' to '3000' chars,
+ (covers the largest _description, 'jigglypuff.xml', at 852 chars,
+ 'magicrainbow.xml', at 2837 chars.)
+- introduced idType to facilitate maintenance between the
+ strict and loose schemas.
+
+** Changes in version 0.4 - Loose
+- made _label of number element optional (when using sliders, some
+ developers put what would normally appear in the _label, as a
+ prefix to _low-label instead)
+- widens the idType base type from xs:ID to xs:token. Since the ID is
+ unimplemented and will most likely remain so, it makes little
+ sense to ensure they are unique & valid ID's.
+
+** Changes in 0.5 - Strict
+- Minor typos. to 0.4 docs fixed.
+- Since both the XScreenSaver code and Saverbeans SettingsDialog
+seem tolerant to the _label of the number element missing, it is
+marked as 'optional' now, even in the strict version.
+
+** Limits: This version
+- specifies the 'arg-set'/'arg-unset' of 'boolean' as optional, whereas it
+ requires exactly one of either 'arg-set' or 'arg-unset'.
+- cannot properly distinguish between the 'slider' and 'spinbutton' types
+ of the 'number' element. As a result of that, '_low-label'/'_high-label'
+ are specified as not required, whereas they are actually undefined for
+ 'spinbutton' and required for 'slider'.
+- has no checks to ensure that 'default' values of ranges in the
+ number element fall between 'low' & 'high' values.
+- Selects can have no more than one option missing an arg-set attribute.
+- Arguments must be unique, but this schema does not check that.
+- _label is effectively optional for the slider type of the number element,
+ since this info can be preprended to the _low-label, but no checks are
+ done to ensure that the spinbutton type has the _label.
+
+** Undocumented.
+'undocumented' means that the element/feature was not mentioned in the
+official documentation of the format available in the -
+xscreensaver-4.22/hacks/config/README.
+-->
+<xs:schema
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified">
+
+ <!-- The root element of any XScreenSaver configuration file. -->
+ <xs:element name="screensaver">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- Every XScreenSaver hack has exactly one of either
+ command or fullcommand, but my understanding is that
+ demo-Gtk-conf.c chains them together.
+ This specifies a maximum numner of commands. -->
+ <xs:choice minOccurs="0" maxOccurs="10">
+ <xs:element ref="command"/>
+ <xs:element ref="fullcommand"/>
+ </xs:choice>
+ <!-- A maximum number of components/groups is specified. -->
+ <xs:choice minOccurs="0" maxOccurs="30">
+ <xs:element ref="boolean"/>
+ <xs:element ref="number"/>
+ <xs:element ref="select"/>
+ <xs:element ref="string"/>
+ <xs:element ref="file"/>
+ <xs:element ref="hgroup"/>
+ <xs:element ref="vgroup"/>
+ </xs:choice>
+ <xs:element ref="_description"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:token" use="required"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Added to the command line when invoked. -->
+ <xs:element name="command">
+ <xs:complexType>
+ <xs:attribute name="arg" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Unimplemented in SaverBeans as of API 0.2.
+ Used only by cosmos.xml. Undocumented. -->
+ <xs:element name="fullcommand">
+ <xs:complexType>
+ <xs:attribute name="arg" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Checkbox -->
+ <xs:element name="boolean">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <!-- Exactly one of either arg-set or arg-unset is required -->
+ <xs:attribute name="arg-set" type="argumentType"/>
+ <xs:attribute name="arg-unset" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Slider and Spinbutton -->
+ <xs:element name="number">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="type" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:NMTOKEN">
+ <xs:enumeration value="slider"/>
+ <xs:enumeration value="spinbutton"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <!-- Listed as 'required' in the documentation, though XScreenSaver is
+ tolerant to it being left out. A number of hacks deliberately exclude it
+ for formatting purposes, and put the _label as prefix to _low-label -->
+ <xs:attribute name="_label" type="xs:token" />
+ <!-- _low/_high-label not defined for type spinbutton,
+ but required for slider -->
+ <xs:attribute name="_low-label" type="xs:token"/>
+ <xs:attribute name="_high-label" type="xs:token"/>
+ <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
+ <xs:attribute name="low" type="xs:decimal" use="required"/>
+ <xs:attribute name="high" type="xs:decimal" use="required"/>
+ <!-- Must logically fall between low and high, but not checked. -->
+ <xs:attribute name="default" type="xs:decimal" use="required"/>
+ <xs:attribute name="convert">
+ <xs:simpleType>
+ <xs:restriction base="xs:NMTOKEN">
+ <xs:enumeration value="invert"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Drop-down list -->
+ <xs:element name="select">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- A maximum number of options is specified, as a longer
+ drop down becomes kludgy and difficult to use. -->
+ <xs:element ref="option" maxOccurs="200"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="idType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- List item -->
+ <xs:element name="option">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <xs:attribute name="arg-set" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- String or textual input -->
+ <xs:element name="string">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- File browser. -->
+ <xs:element name="file">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Free Text. The description of the Screen Saver. -->
+ <xs:element name="_description">
+ <!-- The _description must contain text only, with no HTML formatting.
+
+ Character entities are also valid, which suggests that..
+ http://www.w3.org/TR/REC-html40/sgml/entities.html
+ ..are valid entities, though this, ..
+ http://www.w3.org/TR/1998/REC-html40-19980424/sgml/entities.html#h-24.4.1
+ ..may represent a safer sub-set.
+
+ The main entities you might require (none of which are allowed
+ in textual content in an XML file) are..
+ &lt; (= <)
+ &gt; (= >)
+ &amp; (= &)
+
+ XScreenSaver itself will probably* turn any URL enclosed in
+ &lt; / &gt; into a clickable link.
+
+ Conversion to an URL is unimplemented in SaverBeans as of API 0.2.
+
+ It might be possible to implement this in SaverBeans with the help of
+ BrowserLauncher, though that would require about 20Kb (AFAIR) of extra
+ classes in the core API distributable.
+
+ * This is based solely on the use of the delimiters in many of the
+ XScreenSaver hacks, but has not been investigated in any depth.
+ -->
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:maxLength value="3000"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+
+ <!-- Horizontal grouping element, a row of components or groups.
+ Unimplemented in SaverBeans as of API 0.2,
+ components inside groups do not appear. -->
+ <xs:element name="hgroup">
+ <xs:complexType>
+ <!-- A maximum number of components/groups per row is specified. -->
+ <xs:choice minOccurs="0" maxOccurs="4">
+ <xs:element ref="boolean"/>
+ <xs:element ref="number"/>
+ <xs:element ref="select"/>
+ <xs:element ref="string"/>
+ <xs:element ref="file"/>
+ <xs:element ref="vgroup"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Vertical grouping element, a column of components or groups.
+ Since the components are normally arranged in a column,
+ this is only of use within an hgroup.
+ Unimplemented in SaverBeans as of API 0.2,
+ components inside groups do not appear. -->
+ <xs:element name="vgroup">
+ <xs:complexType>
+ <!-- A maximum number of components/groups per column is specified. -->
+ <xs:choice minOccurs="0" maxOccurs="10">
+ <xs:element ref="boolean"/>
+ <xs:element ref="number"/>
+ <xs:element ref="select"/>
+ <xs:element ref="string"/>
+ <xs:element ref="file"/>
+ <xs:element ref="hgroup"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Checks that the command arguments (non substitution arg, as
+ well as arg-set/arg-unset) are of a logical (and restricted) form.
+ This determines that the type must start with '-', and contain at
+ least one letter, number or the other characters shown in the RegEx.
+ It is stricter than the XScreenSaver documentation suggests. -->
+ <xs:simpleType name="argumentType">
+ <xs:restriction base="xs:token">
+ <xs:minLength value="2"/>
+ <xs:pattern value="-([a-zA-Z0-9 .,;:+_$#%?/\\\-])*"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Checks that the command arguments that use substitution are of
+ a logical (and quite restricted) form. This determines that the
+ type must start with '-', contain at least one letter, number
+ or the other characters shown in the RegEx.
+ It is stricter than the XScreenSaver documentation suggests. -->
+ <xs:simpleType name="substitutionArgumentType">
+ <xs:restriction base="xs:token">
+ <xs:minLength value="4"/>
+ <xs:pattern value="-([a-zA-Z0-9.,;:+_$#%?/\\\-])* %"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- idType is used to validate the ID's
+ Many ID's do not parse as type xs:ID, so this type was created to
+ allow easy maintenance between the strict and loose versions of the schema.
+ The base type should be
+ - xs:ID in the strict schema, and
+ - xs:token in the loose schema.
+ Note that the base type of xs:ID overrides the minLength value of '0'
+ -->
+ <xs:simpleType name="idType">
+ <!-- strict -->
+ <xs:restriction base="xs:ID">
+ <!-- loose -->
+ <!--
+ <xs:restriction base="xs:token">
+ -->
+ <xs:minLength value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema>
diff --git a/hacks/config/zoom.xml b/hacks/config/zoom.xml
new file mode 100644
index 0000000..c538bb8
--- /dev/null
+++ b/hacks/config/zoom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="zoom" _label="Zoom">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=LeQa9inGEKc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="pixwidth" type="spinbutton" arg="-pixwidth %"
+ _label="X mag" low="2" high="100" default="40" />
+ <number id="pixspacex" type="spinbutton" arg="-pixspacex %"
+ _label=" X border" low="0" high="10" default="2" />
+ <number id="lensoffsetx" type="spinbutton" arg="-lensoffsetx %"
+ _label=" X lens" low="1" high="100" default="5" />
+ </vgroup>
+ <vgroup>
+ <number id="pixheight" type="spinbutton" arg="-pixheight %"
+ _label="Y mag" low="2" high="100" default="40" />
+ <number id="pixspacey" type="spinbutton" arg="-pixspacey %"
+ _label=" Y border" low="0" high="10" default="2" />
+ <number id="lensoffsety" type="spinbutton" arg="-lensoffsety %"
+ _label=" Y lens" low="1" high="100" default="5" />
+ </vgroup>
+
+ <vgroup>
+ <boolean id="lenses" _label="Lenses" arg-unset="-no-lenses"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Fatbits! Zooms in on a part of the screen and then moves around.
+With the "Lenses" option, the result is like looking through many
+overlapping lenses rather than just a simple zoom.
+
+Written by James Macnicol; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/coral.c b/hacks/coral.c
new file mode 100644
index 0000000..9cfcf50
--- /dev/null
+++ b/hacks/coral.c
@@ -0,0 +1,314 @@
+/* coral, by "Frederick G.M. Roeber" <roeber@netscape.com>, 15-jul-97.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+
+#define NCOLORSMAX 200
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC draw_gc, erase_gc;
+ unsigned int default_fg_pixel;
+ XColor colors[NCOLORSMAX];
+ int ncolors;
+ int colorindex;
+ int colorsloth;
+
+ XPoint *walkers;
+ int nwalkers;
+ int width, widthb;
+ int height;
+ int delay, delay2;
+ int max_points;
+ XPoint *pointbuf;
+
+ unsigned int *board;
+
+ int done, reset;
+ int npoints;
+ eraser_state *eraser;
+};
+
+
+#define getdot(x,y) (st->board[(y*st->widthb)+(x>>5)] & (1<<(x & 31)))
+#define setdot(x,y) (st->board[(y*st->widthb)+(x>>5)] |= (1<<(x & 31)))
+
+
+static void
+init_coral(struct state *st)
+{
+ XGCValues gcv;
+ Colormap cmap;
+ XWindowAttributes xgwa;
+ Bool writeable = False;
+ int seeds;
+ int density;
+ int i;
+
+ XClearWindow(st->dpy, st->window);
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->width = xgwa.width;
+ st->widthb = ((xgwa.width + 31) >> 5);
+ st->height = xgwa.height;
+ if (st->board) free(st->board);
+ st->board = (unsigned int *)calloc(st->widthb * xgwa.height, sizeof(unsigned int));
+ if(!st->board) exit(1);
+ cmap = xgwa.colormap;
+ if( st->ncolors ) {
+ free_colors(xgwa.screen, cmap, st->colors, st->ncolors);
+ st->ncolors = 0;
+ }
+ gcv.foreground = st->default_fg_pixel = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ st->ncolors = NCOLORSMAX;
+ make_uniform_colormap(xgwa.screen, xgwa.visual, cmap,
+ st->colors, &st->ncolors, True, &writeable, False);
+ if (st->ncolors <= 0) {
+ st->ncolors = 2;
+ st->colors[0].red = st->colors[0].green = st->colors[0].blue = 0;
+ st->colors[1].red = st->colors[1].green = st->colors[1].blue = 0xFFFF;
+ XAllocColor(st->dpy, cmap, &st->colors[0]);
+ XAllocColor(st->dpy, cmap, &st->colors[1]);
+ }
+ st->colorindex = random()%st->ncolors;
+
+ density = get_integer_resource(st->dpy, "density", "Integer");
+ if( density < 1 ) density = 1;
+ if( density > 100 ) density = 90; /* more like mold than coral */
+ st->nwalkers = (st->width*st->height*density)/100;
+ if (st->walkers) free(st->walkers);
+ st->walkers = (XPoint *)calloc(st->nwalkers, sizeof(XPoint));
+ if( (XPoint *)0 == st->walkers ) exit(1);
+
+ seeds = get_integer_resource(st->dpy, "seeds", "Integer");
+ if( seeds < 1 ) seeds = 1;
+ if( seeds > 1000 ) seeds = 1000;
+
+ st->colorsloth = st->nwalkers*2/st->ncolors;
+ XSetForeground(st->dpy, st->draw_gc, st->colors[st->colorindex].pixel);
+
+ if ((st->width <= 2) || (st->height <= 2)) return;
+
+ for( i = 0; i < seeds; i++ ) {
+ int x, y;
+ int max_repeat = 10;
+ do {
+ x = 1 + random() % (st->width - 2);
+ y = 1 + random() % (st->height - 2);
+ } while( getdot(x, y) && max_repeat--);
+
+ setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
+ setdot((x-1), y ); setdot(x, y ); setdot((x+1), y );
+ setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
+ XDrawPoint(st->dpy, st->window, st->draw_gc, x, y);
+ }
+
+ for( i = 0; i < st->nwalkers; i++ ) {
+ st->walkers[i].x = (random() % (st->width-2)) + 1;
+ st->walkers[i].y = (random() % (st->height-2)) + 1;
+ }
+}
+
+
+/* returns 2 bits of randomness (conserving calls to random()).
+ This speeds things up a little, but not a lot (5-10% or so.)
+ */
+static int
+rand_2(void)
+{
+ static int i = 0;
+ static int r = 0;
+ if (i != 0) {
+ i--;
+ } else {
+ i = 15;
+ r = random();
+ }
+
+ {
+ register int j = (r & 3);
+ r = r >> 2;
+ return j;
+ }
+}
+
+
+static int
+coral(struct state *st)
+{
+ int i = 0;
+
+ for( i = 0; i < st->nwalkers; i++ ) {
+ int x = st->walkers[i].x;
+ int y = st->walkers[i].y;
+
+ if( getdot(x, y) ) {
+
+ Bool flush = False;
+ Bool color = False;
+
+ /* XDrawPoint(dpy, window, draw_gc, x, y); */
+ st->pointbuf[st->npoints].x = x;
+ st->pointbuf[st->npoints].y = y;
+ st->npoints++;
+
+ /* Mark the surrounding area as "sticky" */
+ setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
+ setdot((x-1), y ); setdot((x+1), y );
+ setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
+ st->nwalkers--;
+ st->walkers[i].x = st->walkers[st->nwalkers].x;
+ st->walkers[i].y = st->walkers[st->nwalkers].y;
+ if( 0 ==
+ ((st->colorsloth ? st->nwalkers%st->colorsloth : 0)) ) {
+ color = True;
+ }
+
+ if (flush || color || 0 == st->nwalkers || st->npoints >= st->max_points) {
+ XDrawPoints(st->dpy, st->window, st->draw_gc, st->pointbuf, st->npoints,
+ CoordModeOrigin);
+ st->npoints = 0;
+ }
+
+ if (color) {
+ st->colorindex++;
+ if( st->colorindex == st->ncolors )
+ st->colorindex = 0;
+ XSetForeground(st->dpy, st->draw_gc, st->colors[st->colorindex].pixel);
+ }
+ } else {
+ /* move it a notch */
+ do {
+ switch(rand_2()) {
+ case 0:
+ if( 1 == x ) continue;
+ st->walkers[i].x--;
+ break;
+ case 1:
+ if( st->width-2 == x ) continue;
+ st->walkers[i].x++;
+ break;
+ case 2:
+ if( 1 == y ) continue;
+ st->walkers[i].y--;
+ break;
+ default: /* case 3: */
+ if( st->height-2 == y ) continue;
+ st->walkers[i].y++;
+ break;
+ /* default:
+ abort(); */
+ }
+ } while(0);
+ }
+ }
+
+ return (0 == st->nwalkers);
+}
+
+static void *
+coral_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ st->max_points = 200;
+ st->pointbuf = (XPoint *) calloc(sizeof(XPoint), st->max_points+2);
+ if (!st->pointbuf) exit(-1);
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ st->reset = 1;
+ return st;
+}
+
+
+static unsigned long
+coral_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->eraser || st->done)
+ {
+ st->done = 0;
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return st->delay2;
+ }
+
+ if (st->reset)
+ init_coral(st);
+ st->reset = st->done = coral(st);
+
+ return (st->reset
+ ? (st->delay * 1000000)
+ : st->delay2);
+}
+
+static void
+coral_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ init_coral(st);
+}
+
+static Bool
+coral_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->reset = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+coral_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st->pointbuf);
+ if (st->walkers) free (st->walkers);
+ if (st->board) free (st->board);
+ free (st);
+}
+
+static const char *coral_defaults[] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*density: 25",
+ "*seeds: 20", /* too many for 640x480, too few for 1280x1024 */
+ "*delay: 5",
+ "*delay2: 20000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec coral_options[] = {
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-seeds", ".seeds", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Coral", coral)
diff --git a/hacks/coral.man b/hacks/coral.man
new file mode 100644
index 0000000..aaa497e
--- /dev/null
+++ b/hacks/coral.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+coral - simulates coral growth, albeit somewhat slowly.
+.SH SYNOPSIS
+.B coral
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay2 \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-density \fInumber\fP]
+[\-seeds \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Simulates coral growth, albeit somewhat slowly.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay2 \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-delay \fInumber\fP
+Duration. 1 - 60. Default: 5.
+.TP 8
+.B \-density \fInumber\fP
+Density. 1 - 90. Default: 25.
+.TP 8
+.B \-seeds \fInumber\fP
+Seeds. 1 - 100. Default: 20.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Frederick Roeber. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Frederick Roeber.
diff --git a/hacks/critical.c b/hacks/critical.c
new file mode 100644
index 0000000..81fd0c1
--- /dev/null
+++ b/hacks/critical.c
@@ -0,0 +1,454 @@
+/* critical -- Self-organizing-criticality display hack for XScreenSaver
+ * Copyright (C) 1998, 1999, 2000 Martin Pool <mbp@humbug.org.au>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation. No representations are made
+ * about the suitability of this software for any purpose. It is
+ * provided "as is" without express or implied warranty.
+ *
+ * See `critical.man' for more information.
+ *
+ * Revision history:
+ * 13 Nov 1998: Initial version, Martin Pool <mbp@humbug.org.au>
+ * 08 Feb 2000: Change to keeping and erasing a trail, <mbp>
+ *
+ * It would be nice to draw curvy shapes rather than just straight
+ * lines, but X11 doesn't have spline primitives (?) so we'd have to
+ * do all the work ourselves */
+
+#include "screenhack.h"
+#include "erase.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+typedef struct {
+ int width, height; /* in cells */
+ unsigned short *cells;
+} CriticalModel;
+
+typedef struct {
+ int trail; /* length of trail */
+ int cell_size;
+} CriticalSettings;
+
+
+/* Number of screens that should be drawn before reinitializing the
+ model, and count of the number of screens done so far. */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int n_restart, i_restart;
+ XWindowAttributes wattr;
+ CriticalModel *model;
+ int batchcount;
+ XPoint *history; /* in cell coords */
+ long delay_usecs;
+ GC fgc, bgc;
+ XGCValues gcv;
+ CriticalSettings settings;
+
+ int d_n_colors;
+ XColor *d_colors;
+ int lines_per_color;
+ int d_i_color;
+ int d_pos;
+ int d_wrapped;
+
+ int d_i_batch;
+ eraser_state *eraser;
+
+};
+
+
+static CriticalModel * model_allocate (int w, int h);
+static void model_initialize (CriticalModel *);
+
+
+static int
+clip (int low, int val, int high)
+{
+ if (val < low)
+ return low;
+ else if (val > high)
+ return high;
+ else
+ return val;
+}
+
+
+/* Allocate an return a new simulation model datastructure.
+ */
+
+static CriticalModel *
+model_allocate (int model_w, int model_h)
+{
+ CriticalModel *mm;
+
+ mm = malloc (sizeof (CriticalModel));
+ if (!mm)
+ return 0;
+
+ mm->width = model_w;
+ mm->height = model_h;
+
+ mm->cells = malloc (sizeof (unsigned short) * model_w * model_h);
+ if (!mm->cells) {
+ free (mm);
+ return 0;
+ }
+
+ return mm;
+}
+
+
+
+/* Initialize the data model underlying the hack.
+
+ For the self-organizing criticality hack, this consists of a 2d
+ array full of random integers.
+
+ I've considered storing the data as (say) a binary tree within a 2d
+ array, to make finding the highest value faster at the expense of
+ storage space: searching the whole array on each iteration seems a
+ little inefficient. However, the screensaver doesn't seem to take
+ up many cycles as it is: presumably the search is pretty quick
+ compared to the sleeps. The current version uses less than 1% of
+ the CPU time of an AMD K6-233. Many machines running X11 at this
+ point in time seem to be memory-limited, not CPU-limited.
+
+ The root of all evil, and all that.
+*/
+
+
+static void
+model_initialize (CriticalModel *mm)
+{
+ int i;
+
+ for (i = mm->width * mm->height - 1; i >= 0; i--)
+ {
+ mm->cells[i] = (unsigned short) random ();
+ }
+}
+
+
+/* Move one step forward in the criticality simulation.
+
+ This function locates and returns in (TOP_X, TOP_Y) the location of
+ the highest-valued cell in the model. It also replaces that cell
+ and it's eight nearest neighbours with new random values.
+ Neighbours that fall off the edge of the model are simply
+ ignored. */
+static void
+model_step (CriticalModel *mm, XPoint *ptop)
+{
+ int x, y, i;
+ int dx, dy;
+ unsigned short top_value = 0;
+ int top_x = 0, top_y = 0;
+
+ /* Find the top cell */
+ top_value = 0;
+ i = 0;
+ for (y = 0; y < mm->height; y++)
+ for (x = 0; x < mm->width; x++)
+ {
+ if (mm->cells[i] >= top_value)
+ {
+ top_value = mm->cells[i];
+ top_x = x;
+ top_y = y;
+ }
+ i++;
+ }
+
+ /* Replace it and its neighbours with new random values */
+ for (dy = -1; dy <= 1; dy++)
+ {
+ int yy = top_y + dy;
+ if (yy < 0 || yy >= mm->height)
+ continue;
+
+ for (dx = -1; dx <= 1; dx++)
+ {
+ int xx = top_x + dx;
+ if (xx < 0 || xx >= mm->width)
+ continue;
+
+ mm->cells[yy * mm->width + xx] = (unsigned short) random();
+ }
+ }
+
+ ptop->x = top_x;
+ ptop->y = top_y;
+}
+
+
+/* Construct and return in COLORS and N_COLORS a new set of colors,
+ depending on the resource settings. */
+static void
+setup_colormap (struct state *st, XColor **colors, int *n_colors)
+{
+ Bool writable;
+ char const * color_scheme;
+
+ /* Make a colormap */
+ *n_colors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ if (*n_colors < 3)
+ *n_colors = 3;
+
+ *colors = (XColor *) calloc (sizeof(XColor), *n_colors);
+ if (!*colors)
+ {
+ fprintf (stderr, "%s:%d: can't allocate memory for colors\n",
+ __FILE__, __LINE__);
+ return;
+ }
+
+ writable = False;
+ color_scheme = get_string_resource (st->dpy, "colorscheme", "ColorScheme");
+
+ if (!strcmp (color_scheme, "random"))
+ {
+ make_random_colormap (st->wattr.screen, st->wattr.visual,
+ st->wattr.colormap,
+ *colors, n_colors,
+ True, True, &writable, True);
+ }
+ else if (!strcmp (color_scheme, "smooth"))
+ {
+ make_smooth_colormap (st->wattr.screen, st->wattr.visual,
+ st->wattr.colormap,
+ *colors, n_colors,
+ True, &writable, True);
+ }
+ else
+ {
+ make_uniform_colormap (st->wattr.screen, st->wattr.visual,
+ st->wattr.colormap,
+ *colors, n_colors, True,
+ &writable, True);
+ }
+}
+
+
+/* Free allocated colormap created by setup_colormap. */
+static void
+free_colormap (struct state *st, XColor **colors, int n_colors)
+{
+ free_colors (st->wattr.screen, st->wattr.colormap, *colors, n_colors);
+ free (*colors);
+}
+
+
+
+/* Draw one step of the hack. Positions are cell coordinates. */
+static void
+draw_step (struct state *st, GC gc, int pos)
+{
+ int cell_size = st->settings.cell_size;
+ int half = cell_size/2;
+ int old_pos = (pos + st->settings.trail - 1) % st->settings.trail;
+
+ pos = pos % st->settings.trail;
+
+ XDrawLine (st->dpy, st->window, gc,
+ st->history[pos].x * cell_size + half,
+ st->history[pos].y * cell_size + half,
+ st->history[old_pos].x * cell_size + half,
+ st->history[old_pos].y * cell_size + half);
+}
+
+
+
+static void *
+critical_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int model_w, model_h;
+ st->dpy = dpy;
+ st->window = window;
+
+ /* Find window attributes */
+ XGetWindowAttributes (st->dpy, st->window, &st->wattr);
+
+ st->batchcount = get_integer_resource (st->dpy, "batchcount", "Integer");
+ if (st->batchcount < 5)
+ st->batchcount = 5;
+
+ st->lines_per_color = 10;
+
+ /* For the moment the model size is just fixed -- making it vary
+ with the screen size just makes the hack boring on large
+ screens. */
+ model_w = 80;
+ st->settings.cell_size = st->wattr.width / model_w;
+ model_h = st->settings.cell_size ?
+ st->wattr.height / st->settings.cell_size : 1;
+
+ /* Construct the initial model state. */
+
+ st->settings.trail = clip(2, get_integer_resource (st->dpy, "trail", "Integer"), 1000);
+
+ st->history = calloc (st->settings.trail, sizeof (st->history[0]));
+ if (!st->history)
+ {
+ fprintf (stderr, "critical: "
+ "couldn't allocate trail history of %d cells\n",
+ st->settings.trail);
+ abort();
+ }
+
+ st->model = model_allocate (model_w, model_h);
+ if (!st->model)
+ {
+ fprintf (stderr, "critical: error preparing the model\n");
+ abort();
+ }
+
+ /* make a black gc for the background */
+ st->gcv.foreground = get_pixel_resource (st->dpy, st->wattr.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC (st->dpy, st->window, GCForeground, &st->gcv);
+
+ st->fgc = XCreateGC (st->dpy, st->window, 0, &st->gcv);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, st->fgc, False);
+ jwxyz_XSetAntiAliasing (dpy, st->bgc, False);
+#endif
+
+ st->delay_usecs = get_integer_resource (st->dpy, "delay", "Integer");
+ st->n_restart = get_integer_resource (st->dpy, "restart", "Integer");
+
+ setup_colormap (st, &st->d_colors, &st->d_n_colors);
+ model_initialize (st->model);
+ model_step (st->model, &st->history[0]);
+ st->d_pos = 1;
+ st->d_wrapped = 0;
+ st->i_restart = 0;
+ st->d_i_batch = st->batchcount;
+
+ return st;
+}
+
+static unsigned long
+critical_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->eraser) {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return st->delay_usecs;
+ }
+
+ /* for (d_i_batch = batchcount; d_i_batch; d_i_batch--) */
+ {
+ /* Set color */
+ if ((st->d_i_batch % st->lines_per_color) == 0)
+ {
+ st->d_i_color = (st->d_i_color + 1) % st->d_n_colors;
+ st->gcv.foreground = st->d_colors[st->d_i_color].pixel;
+ XChangeGC (st->dpy, st->fgc, GCForeground, &st->gcv);
+ }
+
+ assert(st->d_pos >= 0 && st->d_pos < st->settings.trail);
+ model_step (st->model, &st->history[st->d_pos]);
+
+ draw_step (st, st->fgc, st->d_pos);
+
+ /* we use the history as a ring buffer, but don't start erasing until
+ we've d_wrapped around once. */
+ if (++st->d_pos >= st->settings.trail)
+ {
+ st->d_pos -= st->settings.trail;
+ st->d_wrapped = 1;
+ }
+
+ if (st->d_wrapped)
+ {
+ draw_step (st, st->bgc, st->d_pos+1);
+ }
+
+ }
+
+ st->d_i_batch--;
+ if (st->d_i_batch < 0)
+ st->d_i_batch = st->batchcount;
+ else
+ return st->delay_usecs;
+
+ st->i_restart = (st->i_restart + 1) % st->n_restart;
+
+ if (st->i_restart == 0)
+ {
+ /* Time to start a new simulation, this one has probably got
+ to be a bit boring. */
+ free_colormap (st, &st->d_colors, st->d_n_colors);
+ setup_colormap (st, &st->d_colors, &st->d_n_colors);
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ model_initialize (st->model);
+ model_step (st->model, &st->history[0]);
+ st->d_pos = 1;
+ st->d_wrapped = 0;
+ st->d_i_batch = st->batchcount;
+ }
+
+ return st->delay_usecs;
+}
+
+static void
+critical_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+critical_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+critical_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+/* Options this module understands. */
+static XrmOptionDescRec critical_options[] = {
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-colorscheme", ".colorscheme", XrmoptionSepArg, 0 },
+ { "-restart", ".restart", XrmoptionSepArg, 0 },
+ { "-batchcount", ".batchcount", XrmoptionSepArg, 0 },
+ { "-trail", ".trail", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 } /* end */
+};
+
+
+/* Default xrm resources. */
+static const char *critical_defaults[] = {
+ ".background: black",
+ "*fpsSolid: true",
+ "*colorscheme: smooth",
+ "*delay: 10000",
+ "*ncolors: 64",
+ "*restart: 8",
+ "*batchcount: 1500",
+ "*trail: 50",
+ 0 /* end */
+};
+
+
+XSCREENSAVER_MODULE ("Critical", critical)
diff --git a/hacks/critical.man b/hacks/critical.man
new file mode 100644
index 0000000..324c116
--- /dev/null
+++ b/hacks/critical.man
@@ -0,0 +1,94 @@
+.TH XScreenSaver 1 "08 Feb 2000" "X Version 11"
+.SH NAME
+critical - Draw a system showing self-organizing criticality
+.SH SYNOPSIS
+.B critical
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIcritical\fP program displays a self-organizing critical system
+that gradually emerges from chaos.
+
+\fIcritical\fP performs a simulation on a two-dimensional array of
+integers. The array is initialized to random values. On each
+iteration, it draws a line to the array position with the greatest
+value. It then replaces that location and the eight neighboring
+locations with randomly-selected values.
+
+The lines are initially random, but over time a chaotic
+self-organizing system evolves: areas of the screen which happen to
+have lower values are less likely to be updated to new values, and so
+the line tends to avoid those areas. Eventually, the histogram of
+changes approaches the power-law curve typical of such systems.
+
+The simplest documented self-organizing system is the one-dimensional
+equivalent of \fIcritical\fP.
+
+I heard about this algorithm second-hand: apparently there was an
+article in \fIScientific American\fP describing it sometime in 1997.
+.SH OPTIONS
+.I critical
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+Number of microseconds to wait after drawing each line.
+.TP 8
+.B \-random \fIboolean\fP
+Whether to use randomly selected colours rather than a cycle around
+the colour wheel.
+.TP 8
+.B \-offset \fIinteger\fP
+The maximum random radius increment to use.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be allocated in the color ramp (note that this
+value interacts with \fIoffset\fP.)
+.TP 8
+.B \-trail \fIinteger\fP
+Length of the trail: between 5 and 100 is nice.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver-command (1)
+.BR xscreensaver-demo (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Martin Pool.
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Martin Pool <mbp@humbug.org.au>, 1998-2000. Based in part on the
+XScreenSaver code by Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/crystal.c b/hacks/crystal.c
new file mode 100644
index 0000000..9f33529
--- /dev/null
+++ b/hacks/crystal.c
@@ -0,0 +1,1284 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* crystal --- polygons moving according to plane group rules */
+
+#if 0
+static const char sccsid[] = "@(#)crystal.c 4.12 98/09/10 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1997 by Jouk Jansen <joukj@crys.chem.uva.nl>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The author should like to be notified if changes have been made to the
+ * routine. Response will only be guaranteed when a VMS version of the
+ * program is available.
+ *
+ * A moving polygon-mode. The polygons obey 2D-planegroup symmetry.
+ *
+ * The groupings of the cells fall in 3 categories:
+ * oblique groups 1 and 2 where the angle gamma ranges from 60 to 120 degrees
+ * square groups 3 through 11 where the angle gamma is 90 degrees
+ * hexagonal groups 12 through 17 where the angle gamma is 120 degrees
+ *
+ * Revision History:
+ * 03-Dec-98: Random inversion of y-axis included to simulate hexagonal groups
+ * with an angle of 60 degrees.
+ * 10-Sep-98: new colour scheme
+ * 24-Feb-98: added option centre which turns on/off forcing the centre of
+ * the screen to be used
+ * added option maxsize which forces the dimensions to be chasen
+ * in such ua way that the largest possible part of the screen is
+ * used
+ * When only one unit cell is drawn, it is chosen at random
+ * 18-Feb-98: added support for negative numbers with -nx and -ny meaning
+ * "random" choice with given maximum
+ * added +/-grid option. If -cell is specified this option
+ * determines if one or all unit cells are drawn.
+ * -batchcount is now a parameter for all the objects on the screen
+ * instead of the number of "unique" objects
+ * The maximum size of the objects now scales with the part
+ * of the screen used.
+ * fixed "size" problem. Now very small non-vissable objects
+ * are not allowed
+ * 13-Feb-98: randomized the unit cell size
+ * runtime options -/+cell (turn on/off unit cell drawing)
+ * -nx num (number of translational symmetries in x-direction
+ * -ny num (idem y-direction but ignored for square and
+ * hexagonal space groups
+ * i.e. try xlock -mode crystal -nx 3 -ny 2
+ * Fullrandom overrules the -/+cell option.
+ * 05-Feb-98: Revision + bug repairs
+ * shows unit cell
+ * use part of the screen for unit cell
+ * in hexagonal and square groups a&b axis forced to be equal
+ * cell angle for oblique groups randomly chosen between 60 and 120
+ * bugs solved: planegroups with cell angles <> 90.0 now work properly
+ * 19-Sep-97: Added remaining hexagonal groups
+ * 12-Jun-97: Created
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 60000 \n" \
+ "*count: -500 \n" \
+ "*cycles: 200 \n" \
+ "*size: -15 \n" \
+ "*ncolors: 100 \n" \
+ "*fpsSolid: True \n" \
+ "*ignoreRotation: True \n" \
+
+# define release_crystal 0
+# define reshape_crystal 0
+# define crystal_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+# include "color.h"
+#endif /* STANDALONE */
+
+#define DEF_CELL "True" /* Draw unit cell */
+#define DEF_GRID "False" /* Draw unit all cell if DEF_CELL is True */
+#define DEF_NX "-3" /* number of unit cells in x-direction */
+#define DEF_NX1 1 /* number of unit cells in x-direction */
+#define DEF_NY "-3" /* number of unit cells in y-direction */
+#define DEF_NY1 1 /* number of unit cells in y-direction */
+#define DEF_CENTRE "False"
+#define DEF_MAXSIZE "False"
+#define DEF_CYCLE "True"
+
+#undef NRAND
+#define NRAND(n) ( (n) ? (int) (LRAND() % (n)) : 0)
+
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+
+static int nx, ny;
+
+static Bool unit_cell, grid_cell, centre, maxsize, cycle_p;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-nx", "crystal.nx", XrmoptionSepArg, 0},
+ {"-ny", "crystal.ny", XrmoptionSepArg, 0},
+ {"-centre", ".crystal.centre", XrmoptionNoArg, "on"},
+ {"+centre", ".crystal.centre", XrmoptionNoArg, "off"},
+ {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, "on"},
+ {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, "off"},
+ {"-cell", ".crystal.cell", XrmoptionNoArg, "on"},
+ {"+cell", ".crystal.cell", XrmoptionNoArg, "off"},
+ {"-grid", ".crystal.grid", XrmoptionNoArg, "on"},
+ {"+grid", ".crystal.grid", XrmoptionNoArg, "off"},
+ {"-shift", ".crystal.shift", XrmoptionNoArg, "on"},
+ {"+shift", ".crystal.shift", XrmoptionNoArg, "off"}
+};
+
+static argtype vars[] =
+{
+ {&nx, "nx", "nx", DEF_NX, t_Int},
+ {&ny, "ny", "ny", DEF_NY, t_Int},
+ {&centre, "centre", "Centre", DEF_CENTRE, t_Bool},
+ {&maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
+ {&unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
+ {&grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
+ {&cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-nx num", "Number of unit cells in x-direction"},
+ {"-ny num", "Number of unit cells in y-direction"},
+ {"-/+centre", "turn on/off centering on screen"},
+ {"-/+maxsize", "turn on/off use of maximum part of screen"},
+ {"-/+cell", "turn on/off drawing of unit cell"},
+ {"-/+grid", "turn on/off drawing of grid of unit cells (if -cell is on)"},
+ {"-/+shift", "turn on/off colour cycling"}
+};
+
+ENTRYPOINT ModeSpecOpt crystal_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct crystal_description =
+{"crystal", "init_crystal", "draw_crystal", NULL,
+ "refresh_crystal", "init_crystal", "free_crystal", &crystal_opts,
+ 60000, -40, 200, -15, 64, 1.0, "",
+ "Shows polygons in 2D plane groups", 0, NULL};
+
+#endif
+
+#define DEF_NUM_ATOM 10
+
+#define DEF_SIZ_ATOM 10
+
+#define PI_RAD (M_PI / 180.0)
+
+static Bool centro[17] =
+{
+ False,
+ True,
+ False,
+ False,
+ False,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ False,
+ False,
+ False,
+ True,
+ True
+};
+
+static Bool primitive[17] =
+{
+ True,
+ True,
+ True,
+ True,
+ False,
+ True,
+ True,
+ True,
+ False,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True
+};
+
+static short numops[34] =
+{
+ 1, 0,
+ 1, 0,
+ 9, 7,
+ 2, 0,
+ 9, 7,
+ 9, 7,
+ 4, 2,
+ 5, 3,
+ 9, 7,
+ 8, 6,
+ 10, 6,
+ 8, 4,
+ 16, 13,
+ 19, 13,
+ 16, 10,
+ 19, 13,
+ 19, 13
+};
+
+static short operation[114] =
+{
+ 1, 0, 0, 1, 0, 0,
+ -1, 0, 0, 1, 0, 1,
+ -1, 0, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 0,
+ -1, 0, 0, 1, 1, 1,
+ 1, 0, 0, 1, 1, 1,
+ 0, -1, 1, 0, 0, 0,
+ 1, 0, 0, 1, 0, 0,
+ -1, 0, 0, 1, 0, 0,
+ 0, 1, 1, 0, 0, 0,
+ -1, 0, -1, 1, 0, 0,
+ 1, -1, 0, -1, 0, 0,
+ 0, 1, 1, 0, 0, 0,
+ 0, -1, 1, -1, 0, 0,
+ -1, 1, -1, 0, 0, 0,
+ 1, 0, 0, 1, 0, 0,
+ 0, -1, -1, 0, 0, 0,
+ -1, 1, 0, 1, 0, 0,
+ 1, 0, 1, -1, 0, 0
+};
+
+typedef struct {
+ unsigned long colour;
+ int x0, y0, velocity[2];
+ float angle, velocity_a;
+ int num_point, at_type, size_at;
+ XPoint xy[5];
+} crystalatom;
+
+typedef struct {
+ Bool painted;
+ int win_width, win_height, num_atom;
+ int planegroup, a, b, offset_w, offset_h, nx, ny;
+ float gamma;
+ crystalatom *atom;
+ GC gc;
+ Bool unit_cell, grid_cell;
+ Colormap cmap;
+ XColor *colors;
+ int ncolors;
+ Bool cycle_p, mono_p, no_colors;
+ unsigned long blackpixel, whitepixel, fg, bg;
+ int direction, invert;
+ unsigned long grid_pixel;
+ int inx, iny;
+} crystalstruct;
+
+static crystalstruct *crystals = NULL;
+
+static void
+trans_coor(XPoint * xyp, XPoint * new_xyp, int num_points,
+ float gamma)
+{
+ int i;
+
+ for (i = 0; i <= num_points; i++) {
+ new_xyp[i].x = xyp[i].x +
+ (int) (xyp[i].y * sin((gamma - 90.0) * PI_RAD));
+ new_xyp[i].y = (int) (xyp[i].y / cos((gamma - 90.0) * PI_RAD));
+ }
+}
+
+static void
+trans_coor_back(XPoint * xyp, XPoint * new_xyp,
+ int num_points, float gamma, int offset_w, int offset_h ,
+ int winheight , int invert )
+{
+ int i;
+
+ for (i = 0; i <= num_points; i++) {
+ new_xyp[i].y = (int) (xyp[i].y * cos((gamma - 90) * PI_RAD)) +
+ offset_h;
+ new_xyp[i].x = xyp[i].x - (int) (xyp[i].y * sin((gamma - 90.0)
+ * PI_RAD)) + offset_w;
+ if ( invert ) new_xyp[i].y = winheight - new_xyp[i].y;
+ }
+}
+
+static void
+crystal_setupatom(crystalatom * atom0, float gamma)
+{
+ XPoint xy[5];
+ int x0, y0;
+
+ y0 = (int) (atom0->y0 * cos((gamma - 90) * PI_RAD));
+ x0 = atom0->x0 - (int) (atom0->y0 * sin((gamma - 90.0) * PI_RAD));
+ switch (atom0->at_type) {
+ case 0: /* rectangles */
+ xy[0].x = x0 + (int) (2 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[0].y = y0 + (int) (atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (2 * atom0->size_at * sin(atom0->angle));
+ xy[1].x = x0 + (int) (2 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[1].y = y0 - (int) (atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (2 * atom0->size_at * sin(atom0->angle));
+ xy[2].x = x0 - (int) (2 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[2].y = y0 - (int) (atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (2 * atom0->size_at * sin(atom0->angle));
+ xy[3].x = x0 - (int) (2 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[3].y = y0 + (int) (atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (2 * atom0->size_at *
+ sin(atom0->angle));
+ xy[4].x = xy[0].x;
+ xy[4].y = xy[0].y;
+ trans_coor(xy, atom0->xy, 4, gamma);
+ return;
+ case 1: /* squares */
+ xy[0].x = x0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[0].y = y0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[1].x = x0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[1].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].x = x0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[3].x = x0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[3].y = y0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[4].x = xy[0].x;
+ xy[4].y = xy[0].y;
+ trans_coor(xy, atom0->xy, 4, gamma);
+ return;
+ case 2: /* triangles */
+ xy[0].x = x0 + (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[0].y = y0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle));
+ xy[1].x = x0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[1].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].x = x0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[3].x = xy[0].x;
+ xy[3].y = xy[0].y;
+ trans_coor(xy, atom0->xy, 3, gamma);
+ return;
+ }
+}
+
+static void
+crystal_drawatom(ModeInfo * mi, crystalatom * atom0)
+{
+ crystalstruct *cryst;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int j, k, l, m;
+
+ cryst = &crystals[MI_SCREEN(mi)];
+ for (j = numops[2 * cryst->planegroup + 1];
+ j < numops[2 * cryst->planegroup]; j++) {
+ XPoint xy[5], new_xy[5];
+ XPoint xy_1[5];
+ int xtrans, ytrans;
+
+ xtrans = operation[j * 6] * atom0->x0 + operation[j * 6 + 1] *
+ atom0->y0 + (int) (operation[j * 6 + 4] * cryst->a /
+ 2.0);
+ ytrans = operation[j * 6 + 2] * atom0->x0 + operation[j * 6 +
+ 3] * atom0->y0 + (int) (operation[j * 6 + 5] *
+ cryst->b / 2.0);
+ if (xtrans < 0) {
+ if (xtrans < -cryst->a)
+ xtrans = 2 * cryst->a;
+ else
+ xtrans = cryst->a;
+ } else if (xtrans >= cryst->a)
+ xtrans = -cryst->a;
+ else
+ xtrans = 0;
+ if (ytrans < 0)
+ ytrans = cryst->b;
+ else if (ytrans >= cryst->b)
+ ytrans = -cryst->b;
+ else
+ ytrans = 0;
+ for (k = 0; k < atom0->num_point; k++) {
+ xy[k].x = operation[j * 6] * atom0->xy[k].x +
+ operation[j * 6 + 1] *
+ atom0->xy[k].y + (int) (operation[j * 6 + 4] *
+ cryst->a / 2.0) +
+ xtrans;
+ xy[k].y = operation[j * 6 + 2] * atom0->xy[k].x +
+ operation[j * 6 + 3] *
+ atom0->xy[k].y + (int) (operation[j * 6 + 5] *
+ cryst->b / 2.0) +
+ ytrans;
+ }
+ xy[atom0->num_point].x = xy[0].x;
+ xy[atom0->num_point].y = xy[0].y;
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy[k].x + l * cryst->a;
+ xy_1[k].y = xy[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma, cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
+ XFillPolygon(display, window, cryst->gc, new_xy,
+ atom0->num_point, Convex, CoordModeOrigin);
+ }
+ }
+ if (centro[cryst->planegroup] == True) {
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy[k].x = cryst->a - xy[k].x;
+ xy[k].y = cryst->b - xy[k].y;
+ }
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy[k].x + l * cryst->a;
+ xy_1[k].y = xy[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height ,
+ cryst->invert);
+ XFillPolygon(display, window, cryst->gc,
+ new_xy,
+ atom0->num_point, Convex,
+ CoordModeOrigin);
+ }
+ }
+ }
+ if (primitive[cryst->planegroup] == False) {
+ if (xy[atom0->num_point].x >= (int) (cryst->a / 2.0))
+ xtrans = (int) (-cryst->a / 2.0);
+ else
+ xtrans = (int) (cryst->a / 2.0);
+ if (xy[atom0->num_point].y >= (int) (cryst->b / 2.0))
+ ytrans = (int) (-cryst->b / 2.0);
+ else
+ ytrans = (int) (cryst->b / 2.0);
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy[k].x = xy[k].x + xtrans;
+ xy[k].y = xy[k].y + ytrans;
+ }
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy[k].x + l * cryst->a;
+ xy_1[k].y = xy[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
+ XFillPolygon(display, window, cryst->gc,
+ new_xy,
+ atom0->num_point, Convex,
+ CoordModeOrigin);
+ }
+ }
+ if (centro[cryst->planegroup] == True) {
+ XPoint xy1[5];
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy1[k].x = cryst->a - xy[k].x;
+ xy1[k].y = cryst->b - xy[k].y;
+ }
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy1[k].x + l * cryst->a;
+ xy_1[k].y = xy1[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
+ XFillPolygon(display, window,
+ cryst->gc,
+ new_xy, atom0->num_point,
+ Convex, CoordModeOrigin);
+ }
+ }
+ }
+ }
+ }
+}
+
+ENTRYPOINT void init_crystal(ModeInfo * mi);
+
+
+ENTRYPOINT void
+draw_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+ int i;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+ if (cryst->no_colors) {
+ init_crystal(mi);
+ return;
+ }
+
+ /* Moved from init_crystal because you can't draw after MI_CLEARWINDOW in
+ XScreenSaver. - Dave Odell <dmo2118@gmail.com>
+ */
+ if (cryst->unit_cell
+#ifndef HAVE_JWXYZ
+ && !cryst->painted
+#endif
+ ) {
+ int y_coor1 , y_coor2;
+
+ XSetForeground(display, cryst->gc, cryst->grid_pixel);
+ if (cryst->grid_cell) {
+ int inx, iny;
+
+ if ( cryst->invert )
+ y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+ else
+ y_coor1 = y_coor2 = cryst->offset_h;
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+ y_coor2);
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height - cryst->offset_h;
+ y_coor2 = cryst->win_height - (int) (cryst->ny *
+ cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = cryst->offset_h;
+ y_coor2 = (int) (cryst->ny * cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ inx = cryst->nx;
+ for (iny = 1; iny <= cryst->ny; iny++) {
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ (int) (cryst->offset_w - iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ iny = cryst->ny;
+ for (inx = 1; inx <= cryst->nx; inx++) {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 =cryst->win_height - cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 =cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ cryst->offset_w + inx * cryst->a,
+ y_coor2);
+ }
+ } else {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (cryst->iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ y_coor2 =cryst->win_height -
+ (int) ( ( cryst->iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (cryst->iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ y_coor2 =(int) (( cryst->iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + cryst->inx * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + cryst->inx * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + cryst->inx * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + cryst->inx * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ }
+
+ XSetFunction(display, cryst->gc, GXxor);
+
+/* Rotate colours */
+ if (cryst->cycle_p) {
+ rotate_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors,
+ cryst->direction);
+ if (!(LRAND() % 1000))
+ cryst->direction = -cryst->direction;
+ }
+ for (i = 0; i < cryst->num_atom; i++) {
+ crystalatom *atom0;
+
+ atom0 = &cryst->atom[i];
+
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ } else {
+ XSetForeground(display, cryst->gc, atom0->colour);
+ }
+#ifndef HAVE_JWXYZ
+ if(cryst->painted)
+ crystal_drawatom(mi, atom0);
+#endif
+ atom0->velocity[0] += NRAND(3) - 1;
+ atom0->velocity[0] = MAX(-20, MIN(20, atom0->velocity[0]));
+ atom0->velocity[1] += NRAND(3) - 1;
+ atom0->velocity[1] = MAX(-20, MIN(20, atom0->velocity[1]));
+ atom0->x0 += atom0->velocity[0];
+ /*if (cryst->gamma == 90.0) { */
+ if (atom0->x0 < 0)
+ atom0->x0 += cryst->a;
+ else if (atom0->x0 >= cryst->a)
+ atom0->x0 -= cryst->a;
+ atom0->y0 += atom0->velocity[1];
+ if (atom0->y0 < 0)
+ atom0->y0 += cryst->b;
+ else if (atom0->y0 >= cryst->b)
+ atom0->y0 -= cryst->b;
+ /*} */
+ atom0->velocity_a += ((float) NRAND(1001) - 500.0) / 2000.0;
+ atom0->angle += atom0->velocity_a;
+ crystal_setupatom(atom0, cryst->gamma);
+ crystal_drawatom(mi, atom0);
+ }
+ XSetFunction(display, cryst->gc, GXcopy);
+ cryst->painted = True;
+ MI_IS_DRAWN(mi) = True;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+ int i;
+
+ if (!cryst->painted)
+ return;
+ MI_CLEARWINDOW(mi);
+ XSetFunction(display, cryst->gc, GXxor);
+
+ if (cryst->unit_cell) {
+ int y_coor1 , y_coor2;
+
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, cryst->gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
+ else
+ XSetForeground(display, cryst->gc, MI_WHITE_PIXEL(mi));
+ if (cryst->grid_cell) {
+ int inx, iny;
+
+ if ( cryst->invert )
+ y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+ else
+ y_coor1 = y_coor2 = cryst->offset_h;
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+ y_coor2);
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height - cryst->offset_h;
+ y_coor2 = cryst->win_height - (int) (cryst->ny *
+ cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = cryst->offset_h;
+ y_coor2 = (int) (cryst->ny * cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ inx = cryst->nx;
+ for (iny = 1; iny <= cryst->ny; iny++) {
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ (int) (cryst->offset_w - iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ iny = cryst->ny;
+ for (inx = 1; inx <= cryst->nx; inx++) {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 =cryst->win_height - cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 =cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ cryst->offset_w + inx * cryst->a,
+ y_coor2);
+ }
+ } else {
+ int inx, iny;
+
+ inx = NRAND(cryst->nx);
+ iny = NRAND(cryst->ny);
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ y_coor2 =cryst->win_height -
+ (int) ( ( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ y_coor2 =(int) (( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ }
+ for (i = 0; i < cryst->num_atom; i++) {
+ crystalatom *atom0;
+
+ atom0 = &cryst->atom[i];
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ } else {
+ XSetForeground(display, cryst->gc, atom0->colour);
+ }
+ crystal_drawatom(mi, atom0);
+ }
+ XSetFunction(display, cryst->gc, GXcopy);
+}
+#endif
+
+ENTRYPOINT void
+free_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ MI_WHITE_PIXEL(mi) = cryst->whitepixel;
+ MI_BLACK_PIXEL(mi) = cryst->blackpixel;
+#ifndef STANDALONE
+ MI_FG_PIXEL(mi) = cryst->fg;
+ MI_BG_PIXEL(mi) = cryst->bg;
+#endif
+ if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+ free_colors(mi->xgwa.screen, cryst->cmap, cryst->colors,
+ cryst->ncolors);
+ if (cryst->colors)
+ (void) free((void *) cryst->colors);
+#if 0 /* #### wrong! -jwz */
+ XFreeColormap(display, cryst->cmap);
+#endif
+ }
+ if (cryst->gc != NULL)
+ XFreeGC(display, cryst->gc);
+ if (cryst->atom != NULL)
+ (void) free((void *) cryst->atom);
+}
+
+ENTRYPOINT void
+init_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ crystalstruct *cryst;
+ int i, max_atoms, size_atom, neqv;
+ int cell_min;
+
+#define MIN_CELL 200
+
+/* initialize */
+ MI_INIT (mi, crystals);
+ cryst = &crystals[MI_SCREEN(mi)];
+
+ if (!cryst->gc) {
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XColor color;
+
+#ifndef STANDALONE
+ extern char *background;
+ extern char *foreground;
+
+ cryst->fg = MI_FG_PIXEL(mi);
+ cryst->bg = MI_BG_PIXEL(mi);
+#endif
+ cryst->blackpixel = MI_BLACK_PIXEL(mi);
+ cryst->whitepixel = MI_WHITE_PIXEL(mi);
+#if 0 /* #### wrong! -jwz */
+ cryst->cmap = XCreateColormap(display, window,
+ MI_VISUAL(mi), AllocNone);
+ XSetWindowColormap(display, window, cryst->cmap);
+#else
+ cryst->cmap = mi->xgwa.colormap;
+#endif
+ (void) XParseColor(display, cryst->cmap, "black", &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_BLACK_PIXEL(mi) = color.pixel;
+ (void) XParseColor(display, cryst->cmap, "white", &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_WHITE_PIXEL(mi) = color.pixel;
+#ifndef STANDALONE
+ (void) XParseColor(display, cryst->cmap, background, &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_BG_PIXEL(mi) = color.pixel;
+ (void) XParseColor(display, cryst->cmap, foreground, &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_FG_PIXEL(mi) = color.pixel;
+#endif
+ cryst->colors = 0;
+ cryst->ncolors = 0;
+ }
+ if ((cryst->gc = XCreateGC(display, MI_WINDOW(mi),
+ (unsigned long) 0, (XGCValues *) NULL)) == None)
+ return;
+ }
+/* Clear Display */
+ MI_CLEARWINDOW(mi);
+ cryst->painted = False;
+ XSetFunction(display, cryst->gc, GXxor);
+
+
+/*Set up crystal data */
+ cryst->direction = (LRAND() & 1) ? 1 : -1;
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (LRAND() & 1)
+ cryst->unit_cell = True;
+ else
+ cryst->unit_cell = False;
+ } else
+ cryst->unit_cell = unit_cell;
+ if (cryst->unit_cell) {
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (LRAND() & 1)
+ cryst->grid_cell = True;
+ else
+ cryst->grid_cell = False;
+ } else
+ cryst->grid_cell = grid_cell;
+ }
+ cryst->win_width = MI_WIDTH(mi);
+ cryst->win_height = MI_HEIGHT(mi);
+ cell_min = min(cryst->win_width / 2 + 1, MIN_CELL);
+ cell_min = min(cell_min, cryst->win_height / 2 + 1);
+ cryst->planegroup = NRAND(17);
+ cryst->invert = NRAND(2);
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "Selected plane group no %d\n",
+ cryst->planegroup + 1);
+ if (cryst->planegroup > 11)
+ cryst->gamma = 120.0;
+ else if (cryst->planegroup < 2)
+ cryst->gamma = 60.0 + NRAND(60);
+ else
+ cryst->gamma = 90.0;
+ neqv = numops[2 * cryst->planegroup] - numops[2 * cryst->planegroup + 1];
+ if (centro[cryst->planegroup] == True)
+ neqv = 2 * neqv;
+ if (primitive[cryst->planegroup] == False)
+ neqv = 2 * neqv;
+
+
+ if (nx > 0)
+ cryst->nx = nx;
+ else if (nx < 0)
+ cryst->nx = NRAND(-nx) + 1;
+ else
+ cryst->nx = DEF_NX1;
+ if (cryst->planegroup > 8)
+ cryst->ny = cryst->nx;
+ else if (ny > 0)
+ cryst->ny = ny;
+ else if (ny < 0)
+ cryst->ny = NRAND(-ny) + 1;
+ else
+ cryst->ny = DEF_NY1;
+ neqv = neqv * cryst->nx * cryst->ny;
+
+ cryst->num_atom = MI_COUNT(mi);
+ max_atoms = MI_COUNT(mi);
+ if (cryst->num_atom == 0) {
+ cryst->num_atom = DEF_NUM_ATOM;
+ max_atoms = DEF_NUM_ATOM;
+ } else if (cryst->num_atom < 0) {
+ max_atoms = -cryst->num_atom;
+ cryst->num_atom = NRAND(-cryst->num_atom) + 1;
+ }
+ if (neqv > 1)
+ cryst->num_atom = cryst->num_atom / neqv + 1;
+
+ if (cryst->atom == NULL)
+ cryst->atom = (crystalatom *) calloc(max_atoms, sizeof (
+ crystalatom));
+
+ if (maxsize) {
+ if (cryst->planegroup < 13) {
+ cryst->gamma = 90.0;
+ cryst->offset_w = 0;
+ cryst->offset_h = 0;
+ if (cryst->planegroup < 10) {
+ cryst->b = cryst->win_height;
+ cryst->a = cryst->win_width;
+ } else {
+ cryst->b = min(cryst->win_height, cryst->win_width);
+ cryst->a = cryst->b;
+ }
+ } else {
+ cryst->gamma = 120.0;
+ cryst->a = (int) (cryst->win_width * 2.0 / 3.0);
+ cryst->b = cryst->a;
+ cryst->offset_h = (int) (cryst->b * 0.25 *
+ cos((cryst->gamma - 90) * PI_RAD));
+ cryst->offset_w = (int) (cryst->b * 0.5);
+ }
+ } else {
+ int max_repeat = 10;
+ cryst->offset_w = -1;
+ while (max_repeat-- &&
+ (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)) < 4)
+ ) {
+ cryst->b = NRAND((int) (cryst->win_height / (cos((cryst->gamma - 90) *
+ PI_RAD))) - cell_min) + cell_min;
+ if (cryst->planegroup > 8)
+ cryst->a = cryst->b;
+ else
+ cryst->a = NRAND(cryst->win_width - cell_min) + cell_min;
+ cryst->offset_w = (int) ((cryst->win_width - (cryst->a - cryst->b *
+ sin((cryst->gamma - 90) *
+ PI_RAD))) / 2.0);
+ }
+ cryst->offset_h = (int) ((cryst->win_height - cryst->b * cos((
+ cryst->gamma - 90) * PI_RAD)) / 2.0);
+ if (!centre) {
+ if (cryst->offset_h > 0)
+ cryst->offset_h = NRAND(2 * cryst->offset_h);
+ cryst->offset_w = (int) (cryst->win_width - cryst->a -
+ cryst->b *
+ fabs(sin((cryst->gamma - 90) * PI_RAD)));
+ if (cryst->gamma > 90.0) {
+ if (cryst->offset_w > 0)
+ cryst->offset_w = NRAND(cryst->offset_w) +
+ (int) (cryst->b * sin((cryst->gamma - 90) * PI_RAD));
+ else
+ cryst->offset_w = (int) (cryst->b * sin((cryst->gamma - 90) *
+ PI_RAD));
+ } else if (cryst->offset_w > 0)
+ cryst->offset_w = NRAND(cryst->offset_w);
+ else
+ cryst->offset_w = 0;
+ }
+ }
+
+ size_atom = min((int) ((float) (cryst->a) / 40.) + 1,
+ (int) ((float) (cryst->b) / 40.) + 1);
+ if (MI_SIZE(mi) < size_atom) {
+ if (MI_SIZE(mi) < -size_atom)
+ size_atom = -size_atom;
+ else
+ size_atom = MI_SIZE(mi);
+ }
+ cryst->a = cryst->a / cryst->nx;
+ cryst->b = cryst->b / cryst->ny;
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+/* Set up colour map */
+ if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+ free_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors);
+ if (cryst->colors)
+ (void) free((void *) cryst->colors);
+ cryst->colors = 0;
+ cryst->ncolors = MI_NCOLORS(mi);
+ if (cryst->ncolors < 2)
+ cryst->ncolors = 2;
+ if (cryst->ncolors <= 2)
+ cryst->mono_p = True;
+ else
+ cryst->mono_p = False;
+
+ if (cryst->mono_p)
+ cryst->colors = 0;
+ else
+ cryst->colors = (XColor *) malloc(sizeof (*cryst->colors) * (cryst->ncolors + 1));
+ cryst->cycle_p = has_writable_cells(mi->xgwa.screen, MI_VISUAL(mi));
+ if (cryst->cycle_p) {
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (!NRAND(8))
+ cryst->cycle_p = False;
+ else
+ cryst->cycle_p = True;
+ } else {
+ cryst->cycle_p = cycle_p;
+ }
+ }
+ if (!cryst->mono_p) {
+ if (!(LRAND() % 10))
+ make_random_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, True, &cryst->cycle_p, True);
+ else if (!(LRAND() % 2))
+ make_uniform_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors, True,
+ &cryst->cycle_p, True);
+ else
+ make_smooth_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, &cryst->cycle_p, True);
+ }
+#if 0 /* #### wrong! -jwz */
+ XInstallColormap(display, cryst->cmap);
+#endif
+ if (cryst->ncolors < 2) {
+ cryst->ncolors = 2;
+ cryst->no_colors = True;
+ } else
+ cryst->no_colors = False;
+ if (cryst->ncolors <= 2)
+ cryst->mono_p = True;
+
+ if (cryst->mono_p)
+ cryst->cycle_p = False;
+
+ }
+ for (i = 0; i < cryst->num_atom; i++) {
+ crystalatom *atom0;
+
+ atom0 = &cryst->atom[i];
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ if (cryst->ncolors > 2)
+ atom0->colour = NRAND(cryst->ncolors - 2) + 2;
+ else
+ atom0->colour = 1; /* Just in case */
+ } else {
+ if (MI_NPIXELS(mi) > 2)
+ atom0->colour = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+ else
+ atom0->colour = 1; /*Xor'red so WHITE may not be appropriate */
+ }
+ atom0->x0 = NRAND(cryst->a);
+ atom0->y0 = NRAND(cryst->b);
+ atom0->velocity[0] = NRAND(7) - 3;
+ atom0->velocity[1] = NRAND(7) - 3;
+ atom0->velocity_a = (NRAND(7) - 3) * PI_RAD;
+ atom0->angle = NRAND(90) * PI_RAD;
+ atom0->at_type = NRAND(3);
+ if (size_atom == 0)
+ atom0->size_at = DEF_SIZ_ATOM;
+ else if (size_atom > 0)
+ atom0->size_at = size_atom;
+ else
+ atom0->size_at = NRAND(-size_atom) + 1;
+ atom0->size_at++;
+ if (atom0->at_type == 2)
+ atom0->num_point = 3;
+ else
+ atom0->num_point = 4;
+ crystal_setupatom(atom0, cryst->gamma);
+ }
+ XSetFunction(display, cryst->gc, GXcopy);
+
+ if (MI_NPIXELS(mi) > 2)
+ cryst->grid_pixel = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+ else
+ cryst->grid_pixel = MI_WHITE_PIXEL(mi);
+
+ cryst->inx = NRAND(cryst->nx);
+ cryst->iny = NRAND(cryst->ny);
+
+}
+
+XSCREENSAVER_MODULE ("Crystal", crystal)
diff --git a/hacks/crystal.man b/hacks/crystal.man
new file mode 100644
index 0000000..06bf654
--- /dev/null
+++ b/hacks/crystal.man
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+crystal - kaleidescope.
+.SH SYNOPSIS
+.B crystal
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-grid]
+[\-no-cell]
+[\-centre]
+[\-nx \fInumber\fP]
+[\-ny \fInumber\fP]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Moving polygons, similar to a kaleidescope (more like a kaleidescope than
+the hack called `kaleid,' actually.)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-grid | \-no-grid
+Whether to draw grid.
+.TP 8
+.B \-cell | \-no-cell
+Whether to draw the cell.
+.TP 8
+.B \-centre | \-no-centre
+Whether to center on screen
+.TP 8
+.B \-nx \fInumber\fP
+Horizontal Symmetries. -10 - 10. Default: -3.
+.TP 8
+.B \-ny \fInumber\fP
+Vertical Symmetries. -10 - 10. Default: -3.
+.TP 8
+.B \-count \fInumber\fP
+Count. -5000 - 5000. Default: -500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 60000 (0.06 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 100.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jouk Jansen. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jouk Jansen.
diff --git a/hacks/cwaves.c b/hacks/cwaves.c
new file mode 100644
index 0000000..20dd80a
--- /dev/null
+++ b/hacks/cwaves.c
@@ -0,0 +1,212 @@
+/* xscreensaver, Copyright (c) 2007-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * cwaves -- languid sinusoidal colors.
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include "ximage-loader.h"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+typedef struct {
+ double scale;
+ double offset;
+ double delta;
+} wave;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ GC gc;
+ int delay;
+ int scale;
+ int ncolors;
+ XColor *colors;
+
+ int nwaves;
+ wave *waves;
+ int debug_p;
+
+} state;
+
+
+static void *
+cwaves_init (Display *dpy, Window window)
+{
+ int i;
+ XGCValues gcv;
+ state *st = (state *) calloc (1, sizeof (*st));
+
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->debug_p = get_boolean_resource (dpy, "debug", "Boolean");
+ st->scale = get_integer_resource (dpy, "scale", "Integer");
+ if (st->scale <= 0) st->scale = 1;
+ st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
+ if (st->ncolors < 4) st->ncolors = 4;
+ st->colors = (XColor *) malloc (sizeof(*st->colors) * (st->ncolors+1));
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, False);
+
+ st->gc = XCreateGC (st->dpy, st->window, 0, &gcv);
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ st->nwaves = get_integer_resource (dpy, "nwaves", "Integer");
+ st->waves = (wave *) calloc (st->nwaves, sizeof(*st->waves));
+
+ for (i = 0; i < st->nwaves; i++)
+ {
+ st->waves[i].scale = frand(0.03) + 0.005;
+ st->waves[i].offset = frand(M_PI);
+ st->waves[i].delta = (BELLRAND(2)-1) / 15.0;
+ }
+
+ return st;
+}
+
+
+static unsigned long
+cwaves_draw (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+ int i, x;
+
+ for (i = 0; i < st->nwaves; i++)
+ st->waves[i].offset += st->waves[i].delta;
+
+ for (x = 0; x < st->xgwa.width; x += st->scale)
+ {
+ double v = 0;
+ int j;
+ for (i = 0; i < st->nwaves; i++)
+ v += cos ((x * st->waves[i].scale) - st->waves[i].offset);
+ v /= st->nwaves;
+
+ j = st->ncolors * (v/2 + 0.5);
+ if (j < 0 || j >= st->ncolors) abort();
+ XSetForeground (st->dpy, st->gc, st->colors[j].pixel);
+ XFillRectangle (st->dpy, st->window, st->gc,
+ x, 0, st->scale, st->xgwa.height);
+ }
+
+ if (st->debug_p)
+ {
+ int wh = (st->xgwa.height / (st->nwaves + 1)) * 0.9;
+ int i;
+ XSetLineAttributes (st->dpy, st->gc, 2, LineSolid, CapRound, JoinRound);
+ XSetForeground (st->dpy, st->gc, BlackPixelOfScreen (st->xgwa.screen));
+ for (i = 0; i < st->nwaves; i++)
+ {
+ int y = st->xgwa.height * i / (st->nwaves + 1);
+ int ox = -1, oy = -1;
+
+ for (x = 0; x < st->xgwa.width; x += st->scale)
+ {
+ int yy;
+ double v = 0;
+ v = cos ((x * st->waves[i].scale) - st->waves[i].offset);
+ v /= 2;
+
+ yy = y + wh/2 + (wh * v);
+ if (ox == -1)
+ ox = x, oy = yy;
+ XDrawLine (st->dpy, st->window, st->gc, ox, oy, x, yy);
+ ox = x;
+ oy = yy;
+ }
+ }
+
+ {
+ int y = st->xgwa.height * i / (st->nwaves + 1);
+ int ox = -1, oy = -1;
+
+ for (x = 0; x < st->xgwa.width; x += st->scale)
+ {
+ int yy;
+ double v = 0;
+ for (i = 0; i < st->nwaves; i++)
+ v += cos ((x * st->waves[i].scale) - st->waves[i].offset);
+ v /= st->nwaves;
+ v /= 2;
+
+ yy = y + wh/2 + (wh * v);
+ if (ox == -1)
+ ox = x, oy = yy;
+ XDrawLine (st->dpy, st->window, st->gc, ox, oy, x, yy);
+ ox = x;
+ oy = yy;
+ }
+ }
+ }
+
+ return st->delay;
+}
+
+
+static void
+cwaves_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *st = (state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+cwaves_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ state *st = (state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, False);
+ return True;
+ }
+ return False;
+}
+
+static void
+cwaves_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *cwaves_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*ncolors: 600",
+ "*nwaves: 15",
+ "*scale: 2",
+ "*debug: False",
+ "*delay: 20000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec cwaves_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-waves", ".nwaves", XrmoptionSepArg, 0 },
+ { "-colors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-scale", ".scale", XrmoptionSepArg, 0 },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("CWaves", cwaves)
diff --git a/hacks/cwaves.man b/hacks/cwaves.man
new file mode 100644
index 0000000..57f3978
--- /dev/null
+++ b/hacks/cwaves.man
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
+.SH NAME
+cwaves - languid sinusoidal colors
+.SH SYNOPSIS
+.B cwaves
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-waves \fIint\fP]
+[\-colors \fIint\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIcwaves\fP program draws a languidly-scrolling vertical field
+of sinusoidal colors.
+.SH OPTIONS
+.I cwaves
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 20000, or about 1/50th second.
+.TP 8
+.B \-waves \fIint\fP
+How many cosines to add together. The more waves, the more complex
+the apparent motion.
+.TP 8
+.B \-colors \fIint\fP
+How many colors to use. Default 800. The more colors, the smoother the
+blending will be.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 2-Jul-2007.
diff --git a/hacks/cynosure.c b/hacks/cynosure.c
new file mode 100644
index 0000000..8b8b85b
--- /dev/null
+++ b/hacks/cynosure.c
@@ -0,0 +1,443 @@
+/* cynosure --- draw some rectangles
+ *
+ * 01-aug-96: written in Java by ozymandias G desiderata <ogd@organic.com>
+ * 25-dec-97: ported to C and XScreenSaver by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Original version:
+ * http://www.organic.com/staff/ogd/java/cynosure.html
+ * http://www.organic.com/staff/ogd/java/source/cynosure/Cynosure-java.txt
+ *
+ * Original comments and copyright:
+ *
+ * Cynosure.java
+ * A Java implementation of Stephen Linhart's Cynosure screen-saver as a
+ * drop-in class.
+ *
+ * Header: /home/ogd/lib/cvs/aoaioxxysz/graphics/Cynosure.java,v 1.2 1996/08/02 02:41:21 ogd Exp
+ *
+ * ozymandias G desiderata <ogd@organic.com>
+ * Thu Aug 1 1996
+ *
+ * COPYRIGHT NOTICE
+ *
+ * Copyright 1996 ozymandias G desiderata. Title, ownership rights, and
+ * intellectual property rights in and to this software remain with
+ * ozymandias G desiderata. This software may be copied, modified,
+ * or used as long as this copyright is retained. Use this code at your
+ * own risk.
+ *
+ * Revision: 1.2
+ *
+ * Log: Cynosure.java,v
+ * Revision 1.2 1996/08/02 02:41:21 ogd
+ * Added a few more comments, fixed messed-up header.
+ *
+ * Revision 1.1.1.1 1996/08/02 02:30:45 ogd
+ * First version
+ */
+
+#include "screenhack.h"
+
+/* #define DO_STIPPLE */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ XColor *colors;
+ int ncolors;
+
+#ifndef DO_STIPPLE
+ XColor *colors2;
+ int ncolors2;
+#endif
+
+ int fg_pixel, bg_pixel;
+ GC fg_gc, bg_gc, shadow_gc;
+
+ int curColor;
+ int curBase; /* color progression */
+ int shadowWidth;
+ int elevation; /* offset of dropshadow */
+ int sway; /* time until base color changed */
+ int timeLeft; /* until base color used */
+ int tweak; /* amount of color variance */
+ int gridSize;
+ int iterations, i, delay;
+ XWindowAttributes xgwa;
+};
+
+
+/**
+ * The smallest size for an individual cell.
+ **/
+#define MINCELLSIZE 16
+
+/**
+ * The narrowest a rectangle can be.
+ **/
+#define MINRECTSIZE 6
+
+/**
+ * Every so often genNewColor() generates a completely random
+ * color. This variable sets how frequently that happens. It's
+ * currently set to happen 1% of the time.
+ *
+ * @see #genNewColor
+ **/
+#define THRESHOLD 100 /*0.01*/
+
+static void paint(struct state *st);
+static int genNewColor(struct state *st);
+static int genConstrainedColor(struct state *st, int base, int tweak);
+static int c_tweak(struct state *st, int base, int tweak);
+
+
+static void *
+cynosure_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy = d;
+ st->window = w;
+
+ st->curColor = 0;
+ st->curBase = st->curColor;
+ st->shadowWidth = get_integer_resource (st->dpy, "shadowWidth", "Integer");
+ st->elevation = get_integer_resource (st->dpy, "elevation", "Integer");
+ st->sway = get_integer_resource (st->dpy, "sway", "Integer");
+ st->tweak = get_integer_resource (st->dpy, "tweak", "Integer");
+ st->gridSize = get_integer_resource (st->dpy, "gridSize", "Integer");
+ st->timeLeft = 0;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+
+ if (mono_p)
+ st->colors = 0;
+ else
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+
+ if (mono_p)
+ ;
+ else {
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+ if (st->ncolors <= 2) {
+ mono_p = True;
+ st->ncolors = 2;
+ if (st->colors) free(st->colors);
+ st->colors = 0;
+ }
+ }
+
+ st->bg_pixel = get_pixel_resource(st->dpy,
+ st->xgwa.colormap, "background", "Background");
+ st->fg_pixel = get_pixel_resource(st->dpy,
+ st->xgwa.colormap, "foreground", "Foreground");
+
+ gcv.foreground = st->fg_pixel;
+ st->fg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = st->bg_pixel;
+ st->bg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+
+#ifdef DO_STIPPLE
+ gcv.fill_style = FillStippled;
+ gcv.stipple = XCreateBitmapFromData(st->dpy, st->window, "\125\252", 8, 2);
+ st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground|GCFillStyle|GCStipple, &gcv);
+ XFreePixmap(st->dpy, gcv.stipple);
+
+#else /* !DO_STIPPLE */
+ st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+
+# ifdef HAVE_JWXYZ /* allow non-opaque alpha components in pixel values */
+ jwxyz_XSetAlphaAllowed (st->dpy, st->shadow_gc, True);
+# endif
+
+ if (st->colors)
+ {
+ int i;
+ st->ncolors2 = st->ncolors;
+ st->colors2 = (XColor *) malloc(sizeof(*st->colors2) * (st->ncolors2+1));
+
+ for (i = 0; i < st->ncolors2; i++)
+ {
+# ifdef HAVE_JWXYZ
+ /* give a non-opaque alpha to the shadow colors */
+ unsigned long pixel = st->colors[i].pixel;
+ unsigned long amask = BlackPixelOfScreen (st->xgwa.screen);
+ unsigned long a = (0x77777777 & amask);
+ pixel = (pixel & (~amask)) | a;
+ st->colors2[i].pixel = pixel;
+# else /* !HAVE_JWXYZ */
+ int h;
+ double s, v;
+ rgb_to_hsv (st->colors[i].red,
+ st->colors[i].green,
+ st->colors[i].blue,
+ &h, &s, &v);
+ v *= 0.4;
+ hsv_to_rgb (h, s, v,
+ &st->colors2[i].red,
+ &st->colors2[i].green,
+ &st->colors2[i].blue);
+ st->colors2[i].pixel = st->colors[i].pixel;
+ XAllocColor (st->dpy, st->xgwa.colormap, &st->colors2[i]);
+# endif /* !HAVE_JWXYZ */
+ }
+ }
+# endif /* !DO_STIPPLE */
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ st->iterations = get_integer_resource (st->dpy, "iterations", "Iterations");
+
+ return st;
+}
+
+static unsigned long
+cynosure_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->iterations > 0 && ++st->i >= st->iterations)
+ {
+ st->i = 0;
+ if (!mono_p)
+ XSetWindowBackground(st->dpy, st->window,
+ st->colors[random() % st->ncolors].pixel);
+ XClearWindow(st->dpy, st->window);
+ }
+ paint(st);
+
+ return st->delay;
+}
+
+
+/**
+ * paint adds a new layer of multicolored rectangles within a grid of
+ * randomly generated size. Each row of rectangles is the same color,
+ * but colors vary slightly from row to row. Each rectangle is placed
+ * within a regularly-sized cell, but each rectangle is sized and
+ * placed randomly within that cell.
+ *
+ * @param g the Graphics coordinate in which to draw
+ * @see #genNewColor
+ **/
+static void paint(struct state *st)
+{
+ int i;
+ int cellsWide, cellsHigh, cellWidth, cellHeight;
+ int width = st->xgwa.width;
+ int height = st->xgwa.height;
+
+ /* How many cells wide the grid is (equal to gridSize +/- (gridSize / 2))
+ */
+ cellsWide = c_tweak(st, st->gridSize, st->gridSize / 2);
+ /* How many cells high the grid is (equal to gridSize +/- (gridSize / 2))
+ */
+ cellsHigh = c_tweak(st, st->gridSize, st->gridSize / 2);
+ /* How wide each cell in the grid is */
+ cellWidth = width / cellsWide;
+ /* How tall each cell in the grid is */
+ cellHeight = height / cellsHigh;
+
+ /* Ensure that each cell is above a certain minimum size */
+
+ if (cellWidth < MINCELLSIZE) {
+ cellWidth = MINCELLSIZE;
+ cellsWide = width / cellWidth;
+ }
+
+ if (cellHeight < MINCELLSIZE) {
+ cellHeight = MINCELLSIZE;
+ cellsHigh = width / cellWidth;
+ }
+
+ /* fill the grid with randomly-generated cells */
+ for(i = 0; i < cellsHigh; i++) {
+ int j;
+
+ /* Each row is a different color, randomly generated (but constrained) */
+ if (!mono_p)
+ {
+ int c = genNewColor(st);
+ XSetForeground(st->dpy, st->fg_gc, st->colors[c].pixel);
+# ifndef DO_STIPPLE
+ if (st->colors2)
+ XSetForeground(st->dpy, st->shadow_gc, st->colors2[c].pixel);
+# endif
+ }
+
+ for(j = 0; j < cellsWide; j++) {
+ int curWidth, curHeight, curX, curY;
+
+ /* Generate a random height for a rectangle and make sure that */
+ /* it's above a certain minimum size */
+ curHeight = random() % (cellHeight - st->shadowWidth);
+ if (curHeight < MINRECTSIZE)
+ curHeight = MINRECTSIZE;
+ /* Generate a random width for a rectangle and make sure that
+ it's above a certain minimum size */
+ curWidth = random() % (cellWidth - st->shadowWidth);
+ if (curWidth < MINRECTSIZE)
+ curWidth = MINRECTSIZE;
+ /* Figure out a random place to locate the rectangle within the
+ cell */
+ curY = (i * cellHeight) + (random() % ((cellHeight - curHeight) -
+ st->shadowWidth));
+ curX = (j * cellWidth) + (random() % ((cellWidth - curWidth) -
+ st->shadowWidth));
+
+ /* Draw the shadow */
+ if (st->elevation > 0)
+ XFillRectangle(st->dpy, st->window, st->shadow_gc,
+ curX + st->elevation, curY + st->elevation,
+ curWidth, curHeight);
+
+ /* Draw the edge */
+ if (st->shadowWidth > 0)
+ XFillRectangle(st->dpy, st->window, st->bg_gc,
+ curX + st->shadowWidth, curY + st->shadowWidth,
+ curWidth, curHeight);
+
+ XFillRectangle(st->dpy, st->window, st->fg_gc, curX, curY, curWidth, curHeight);
+
+ /* Draw a 1-pixel black border around the rectangle */
+ XDrawRectangle(st->dpy, st->window, st->bg_gc, curX, curY, curWidth, curHeight);
+ }
+
+ }
+}
+
+
+/**
+ * genNewColor returns a new color, gradually mutating the colors and
+ * occasionally returning a totally random color, just for variety.
+ *
+ * @return the new color
+ **/
+static int genNewColor(struct state *st)
+{
+ /* These lines handle "sway", or the gradual random changing of */
+ /* colors. After genNewColor() has been called a given number of */
+ /* times (specified by a random permutation of the tweak variable), */
+ /* take whatever color has been most recently randomly generated and */
+ /* make it the new base color. */
+ if (st->timeLeft == 0) {
+ st->timeLeft = c_tweak(st, st->sway, st->sway / 3);
+ st->curColor = st->curBase;
+ } else {
+ st->timeLeft--;
+ }
+
+ /* If a randomly generated number is less than the threshold value,
+ produce a "sport" color value that is completely unrelated to the
+ current palette. */
+ if (0 == (random() % THRESHOLD)) {
+ return (random() % st->ncolors);
+ } else {
+ st->curBase = genConstrainedColor(st, st->curColor, st->tweak);
+ return st->curBase;
+ }
+
+}
+
+/**
+ * genConstrainedColor creates a random new color within a certain
+ * range of an existing color. Right now this works with RGB color
+ * values, but a future version of the program will most likely use HSV
+ * colors, which should generate a more pleasing progression of values.
+ *
+ * @param base the color on which the new color will be based
+ * @param tweak the amount that the new color can be tweaked
+ * @return a new constrained color
+ * @see #genNewColor
+ **/
+static int genConstrainedColor(struct state *st, int base, int tweak)
+{
+ int i = 1 + (random() % st->tweak);
+ if (random() & 1)
+ i = -i;
+ i = (base + i) % st->ncolors;
+ while (i < 0)
+ i += st->ncolors;
+ return i;
+}
+
+/**
+ * Utility function to generate a tweaked color value
+ *
+ * @param base the byte value on which the color is based
+ * @param tweak the amount the value will be skewed
+ * @see #tweak
+ * @return the tweaked byte
+ **/
+static int c_tweak(struct state *st, int base, int tweak)
+{
+ int ranTweak = (random() % (2 * tweak));
+ int n = (base + (ranTweak - tweak));
+ if (n < 0) n = -n;
+ return (n < 255 ? n : 255);
+}
+
+static void
+cynosure_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xgwa.width = w;
+ st->xgwa.height = h;
+}
+
+static Bool
+cynosure_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->i = st->iterations;
+ return True;
+ }
+ return False;
+}
+
+static void
+cynosure_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *cynosure_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: true",
+ "*fpsSolid: true",
+ "*delay: 500000",
+ "*colors: 128",
+ "*iterations: 100",
+ "*shadowWidth: 2",
+ "*elevation: 5",
+ "*sway: 30",
+ "*tweak: 20",
+ "*gridSize: 12",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec cynosure_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".colors", XrmoptionSepArg, 0 },
+ { "-iterations", ".iterations", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Cynosure", cynosure)
diff --git a/hacks/cynosure.man b/hacks/cynosure.man
new file mode 100644
index 0000000..b89eb81
--- /dev/null
+++ b/hacks/cynosure.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cynosure - gentle overlapping squares screen saver.
+.SH SYNOPSIS
+.B cynosure
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-iterations \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+A hack similar to `greynetic', but less frenetic. The first implementation
+was by Stephen Linhart; then Ozymandias G. Desiderata wrote a Java applet
+clone. That clone was discovered by Jamie Zawinski, and ported to C for
+inclusion here.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 500000 (0.50 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 128.
+.TP 8
+.B \-iterations \fInumber\fP
+Duration. 2 - 200. Default: 100.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Stephen Linhart, Ozymandias G. Desiderata, and
+Jamie Zawinski. Permission to use, copy, modify, distribute, and sell
+this software and its documentation for any purpose is hereby granted
+without fee, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about
+the suitability of this software for any purpose. It is provided "as
+is" without express or implied warranty.
+.SH AUTHOR
+Stephen Linhart, Ozymandias G. Desiderata, and Jamie Zawinski.
diff --git a/hacks/decayscreen.c b/hacks/decayscreen.c
new file mode 100644
index 0000000..8b45af9
--- /dev/null
+++ b/hacks/decayscreen.c
@@ -0,0 +1,397 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* decayscreen
+ *
+ * Based on slidescreen program from the xscreensaver application and the
+ * decay program for Sun framebuffers. This is the comment from the decay.c
+ * file:
+
+ * decay.c
+ * find the screen bitmap for the console and make it "decay" by
+ * randomly shifting random rectangles by one pixelwidth at a time.
+ *
+ * by David Wald, 1988
+ * rewritten by Natuerlich!
+ * based on a similar "utility" on the Apollo ring at Yale.
+
+ * X version by
+ *
+ * Vivek Khera <khera@cs.duke.edu>
+ * 5-AUG-1993
+ *
+ * Hacked by jwz, 28-Nov-97 (sped up and added new motion directions)
+
+ * R. Schultz
+ * Added "melt" & "stretch" modes 28-Mar-1999
+ *
+ */
+
+#include "screenhack.h"
+#include <time.h>
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ Pixmap saved;
+ int saved_w, saved_h;
+
+ int sizex, sizey;
+ int delay;
+ int duration;
+ GC gc;
+ int mode;
+ int random_p;
+ time_t start_time;
+
+ int fuzz_toggle;
+ const int *current_bias;
+
+ async_load_state *img_loader;
+};
+
+
+#define SHUFFLE 0
+#define UP 1
+#define LEFT 2
+#define RIGHT 3
+#define DOWN 4
+#define UPLEFT 5
+#define DOWNLEFT 6
+#define UPRIGHT 7
+#define DOWNRIGHT 8
+#define IN 9
+#define OUT 10
+#define MELT 11
+#define STRETCH 12
+#define FUZZ 13
+
+static void
+decayscreen_load_image (struct state *st)
+{
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->sizex = xgwa.width;
+ st->sizey = xgwa.height;
+ if (st->img_loader) abort();
+
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+}
+
+static void *
+decayscreen_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ long gcflags;
+ unsigned long bg;
+ char *s;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->random_p = 0;
+
+ s = get_string_resource(st->dpy, "mode", "Mode");
+ if (s && !strcmp(s, "shuffle")) st->mode = SHUFFLE;
+ else if (s && !strcmp(s, "up")) st->mode = UP;
+ else if (s && !strcmp(s, "left")) st->mode = LEFT;
+ else if (s && !strcmp(s, "right")) st->mode = RIGHT;
+ else if (s && !strcmp(s, "down")) st->mode = DOWN;
+ else if (s && !strcmp(s, "upleft")) st->mode = UPLEFT;
+ else if (s && !strcmp(s, "downleft")) st->mode = DOWNLEFT;
+ else if (s && !strcmp(s, "upright")) st->mode = UPRIGHT;
+ else if (s && !strcmp(s, "downright")) st->mode = DOWNRIGHT;
+ else if (s && !strcmp(s, "in")) st->mode = IN;
+ else if (s && !strcmp(s, "out")) st->mode = OUT;
+ else if (s && !strcmp(s, "melt")) st->mode = MELT;
+ else if (s && !strcmp(s, "stretch")) st->mode = STRETCH;
+ else if (s && !strcmp(s, "fuzz")) st->mode = FUZZ;
+ else {
+ if (s && *s && !!strcmp(s, "random"))
+ fprintf(stderr, "%s: unknown mode %s\n", progname, s);
+ st->random_p = 1;
+ st->mode = random() % (FUZZ+1);
+ }
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->duration < 1) st->duration = 1;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ bg = get_pixel_resource (st->dpy, st->xgwa.colormap, "background", "Background");
+ gcv.foreground = bg;
+
+ gcflags = GCForeground | GCFunction;
+ if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+ st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
+
+ st->start_time = time ((time_t *) 0);
+ decayscreen_load_image (st);
+
+ return st;
+}
+
+
+/*
+ * perform one iteration of decay
+ */
+static unsigned long
+decayscreen_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int left, top, width, height, toleft, totop;
+
+#define L 101
+#define R 102
+#define U 103
+#define D 104
+ static const int no_bias[] = { L,L,L,L, R,R,R,R, U,U,U,U, D,D,D,D };
+ static const int up_bias[] = { L,L,L,L, R,R,R,R, U,U,U,U, U,U,D,D };
+ static const int down_bias[] = { L,L,L,L, R,R,R,R, U,U,D,D, D,D,D,D };
+ static const int left_bias[] = { L,L,L,L, L,L,R,R, U,U,U,U, D,D,D,D };
+ static const int right_bias[] = { L,L,R,R, R,R,R,R, U,U,U,U, D,D,D,D };
+
+ static const int upleft_bias[] = { L,L,L,L, L,R,R,R, U,U,U,U, U,D,D,D };
+ static const int downleft_bias[] = { L,L,L,L, L,R,R,R, U,U,U,D, D,D,D,D };
+ static const int upright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,U, U,D,D,D };
+ static const int downright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,D, D,D,D,D };
+
+ int off = 1;
+ if (st->sizex > 2560) off *= 2; /* Retina displays */
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader,
+ 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+
+ st->start_time = time ((time_t *) 0);
+ if (st->random_p)
+ st->mode = random() % (FUZZ+1);
+
+ if (st->mode == MELT || st->mode == STRETCH)
+ /* make sure screen eventually turns background color */
+ XDrawLine (st->dpy, st->window, st->gc, 0, 0, st->sizex, 0);
+
+ if (!st->saved) {
+ st->saved = XCreatePixmap (st->dpy, st->window,
+ st->sizex, st->sizey,
+ st->xgwa.depth);
+ st->saved_w = st->sizex;
+ st->saved_h = st->sizey;
+ }
+ XCopyArea (st->dpy, st->window, st->saved, st->gc, 0, 0,
+ st->sizex, st->sizey, 0, 0);
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ decayscreen_load_image (st);
+ }
+
+ switch (st->mode) {
+ case SHUFFLE: st->current_bias = no_bias; break;
+ case UP: st->current_bias = up_bias; break;
+ case LEFT: st->current_bias = left_bias; break;
+ case RIGHT: st->current_bias = right_bias; break;
+ case DOWN: st->current_bias = down_bias; break;
+ case UPLEFT: st->current_bias = upleft_bias; break;
+ case DOWNLEFT: st->current_bias = downleft_bias; break;
+ case UPRIGHT: st->current_bias = upright_bias; break;
+ case DOWNRIGHT: st->current_bias = downright_bias; break;
+ case IN: st->current_bias = no_bias; break;
+ case OUT: st->current_bias = no_bias; break;
+ case MELT: st->current_bias = no_bias; break;
+ case STRETCH: st->current_bias = no_bias; break;
+ case FUZZ: st->current_bias = no_bias; break;
+ default: abort();
+ }
+
+#define nrnd(x) ((x) ? random() % (x) : x)
+
+ if (st->mode == MELT || st->mode == STRETCH) {
+ left = nrnd(st->sizex/2);
+ top = nrnd(st->sizey);
+ width = nrnd( st->sizex/2 ) + st->sizex/2 - left;
+ height = nrnd(st->sizey - top);
+ toleft = left;
+ totop = top+off;
+
+ } else if (st->mode == FUZZ) { /* By Vince Levey <vincel@vincel.org>;
+ inspired by the "melt" mode of the
+ "scrhack" IrisGL program by Paul Haeberli
+ circa 1991. */
+ left = nrnd(st->sizex - 1);
+ top = nrnd(st->sizey - 1);
+ st->fuzz_toggle = !st->fuzz_toggle;
+ if (st->fuzz_toggle)
+ {
+ totop = top;
+ height = off;
+ toleft = nrnd(st->sizex - 1);
+ if (toleft > left)
+ {
+ width = toleft-left;
+ toleft = left;
+ left++;
+ }
+ else
+ {
+ width = left-toleft;
+ left = toleft;
+ toleft++;
+ }
+ }
+ else
+ {
+ toleft = left;
+ width = off;
+ totop = nrnd(st->sizey - 1);
+ if (totop > top)
+ {
+ height = totop-top;
+ totop = top;
+ top++;
+ }
+ else
+ {
+ height = top-totop;
+ top = totop;
+ totop++;
+ }
+ }
+
+ } else {
+
+ left = nrnd(st->sizex - 1);
+ top = nrnd(st->sizey);
+ width = nrnd(st->sizex - left);
+ height = nrnd(st->sizey - top);
+
+ toleft = left;
+ totop = top;
+ if (st->mode == IN || st->mode == OUT) {
+ int x = left+(width/2);
+ int y = top+(height/2);
+ int cx = st->sizex/2;
+ int cy = st->sizey/2;
+ if (st->mode == IN) {
+ if (x > cx && y > cy) st->current_bias = upleft_bias;
+ else if (x < cx && y > cy) st->current_bias = upright_bias;
+ else if (x < cx && y < cy) st->current_bias = downright_bias;
+ else /* (x > cx && y < cy)*/ st->current_bias = downleft_bias;
+ } else {
+ if (x > cx && y > cy) st->current_bias = downright_bias;
+ else if (x < cx && y > cy) st->current_bias = downleft_bias;
+ else if (x < cx && y < cy) st->current_bias = upleft_bias;
+ else /* (x > cx && y < cy)*/ st->current_bias = upright_bias;
+ }
+ }
+
+ switch (st->current_bias[random() % (sizeof(no_bias)/sizeof(*no_bias))]) {
+ case L: toleft = left-off; break;
+ case R: toleft = left+off; break;
+ case U: totop = top-off; break;
+ case D: totop = top+off; break;
+ default: abort(); break;
+ }
+ }
+
+ if (st->mode == STRETCH) {
+ XCopyArea (st->dpy, st->window, st->window, st->gc,
+ 0, st->sizey-top-off*2, st->sizex, top+off,
+ 0, st->sizey-top-off);
+ } else {
+ XCopyArea (st->dpy, st->window, st->window, st->gc,
+ left, top, width, height,
+ toleft, totop);
+ }
+
+#undef nrnd
+
+ return st->delay;
+}
+
+static void
+decayscreen_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (! st->saved) return; /* Image might not be loaded yet */
+ XClearWindow (st->dpy, st->window);
+ XCopyArea (st->dpy, st->saved, st->window, st->gc,
+ 0, 0, st->saved_w, st->saved_h,
+ ((int)w - st->saved_w) / 2,
+ ((int)h - st->saved_h) / 2);
+ st->sizex = w;
+ st->sizey = h;
+}
+
+static Bool
+decayscreen_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+decayscreen_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+static const char *decayscreen_defaults [] = {
+ ".background: Black",
+ ".foreground: Yellow",
+ "*dontClearRoot: True",
+ "*fpsSolid: True",
+
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+
+ "*delay: 10000",
+ "*mode: random",
+ "*duration: 120",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec decayscreen_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("DecayScreen", decayscreen)
diff --git a/hacks/decayscreen.man b/hacks/decayscreen.man
new file mode 100644
index 0000000..7b0f816
--- /dev/null
+++ b/hacks/decayscreen.man
@@ -0,0 +1,92 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+decayscreen - make a screen meltdown.
+.SH SYNOPSIS
+.B decayscreen
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-mode \fImode\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIdecayscreen\fP program creates a melting effect by randomly
+shifting rectangles around the screen.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I decayscreen
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-mode \fImode\fP
+The direction in which the image should tend to slide. Legal values are
+\fIrandom\fP (meaning pick one), \fIup\fP, \fIleft\fP, \fIright\fP,
+\fIdown\fP, \fIupleft\fP, \fIdownleft\fP, \fIupright\fP, \fIdownright\fP,
+\fIshuffle\fP (meaning prefer no particular direction), \fIin\fP (meaning
+move things toward the center), \fIout\fP (meaning move things away
+from the center), \fImelt\fP (meaning melt straight
+downward), \fIstretch\fP (meaning stretch the screen downward),
+and \fIfuzz\fP (meaning go blurry instead of melty).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH "SEE ALSO"
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright 1992 by Vivek Khera. Permission to use, copy, modify, distribute,
+and sell this software and its documentation for any purpose is hereby granted
+without fee, provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the suitability
+of this software for any purpose. It is provided "as is" without express or
+implied warranty.
+.SH AUTHOR
+Vivek Khera <khera@cs.duke.edu>, 05-Aug-93; based on code by David Wald, 1988.
+Modified by jwz, 28-Nov-1997.
+Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
+Modified by Vince Levey <vincel@vincel.org> 25-Oct-2001.
diff --git a/hacks/deco.c b/hacks/deco.c
new file mode 100644
index 0000000..876badc
--- /dev/null
+++ b/hacks/deco.c
@@ -0,0 +1,339 @@
+/* xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Concept snarfed from Michael D. Bayne in
+ * http://www.go2net.com/internet/deep/1997/04/16/body.html
+ *
+ * Changes by Lars Huttar, http://www.huttar.net:
+ * - allow use of golden ratio for dividing rectangles instead of 1/2.
+ * - allow smooth colors instead of random
+ * - added line thickness setting
+ * - added "Mondrian" mode
+ * Other ideas:
+ * - allow recomputing the colormap on each new frame (especially useful
+ * when ncolors is low)
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+
+struct state {
+ XColor colors[255];
+ int ncolors;
+ int max_depth;
+ int min_height;
+ int min_width;
+ int line_width;
+ int old_line_width;
+ Bool goldenRatio;
+ Bool mondrian;
+ Bool smoothColors;
+
+ int delay;
+ XWindowAttributes xgwa;
+ GC fgc, bgc;
+ int current_color;
+};
+
+/* Golden Ratio
+ * Suppose you're dividing a rectangle of length A+B
+ * into two parts, of length A and B respectively. You want the ratio of
+ * A to B to be the same as the ratio of the whole (A+B) to A. The golden
+ * ratio (phi) is that ratio. Supposed to be visually pleasing. */
+#define PHI 1.61803
+#define PHI1 (1.0/PHI)
+#define PHI2 (1.0 - PHI1)
+
+/* copied from make_random_colormap in colors.c */
+static void
+make_mondrian_colormap (Screen *screen, Visual *visual, Colormap cmap,
+ XColor *colors, int *ncolorsP,
+ Bool allocate_p,
+ Bool *writable_pP,
+ Bool verbose_p)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
+ int ncolors = 8;
+ int i;
+
+ if (*ncolorsP <= 0) return;
+
+ /* If this visual doesn't support writable cells, don't bother trying. */
+ if (wanted_writable && !has_writable_cells(screen, visual))
+ *writable_pP = False;
+
+ for (i = 0; i < ncolors; i++)
+ {
+ colors[i].flags = DoRed|DoGreen|DoBlue;
+ colors[i].red = 0;
+ colors[i].green = 0;
+ colors[i].blue = 0;
+
+ switch(i) {
+ case 0: case 1: case 2: case 3: case 7: /* white */
+ colors[i].red = 0xE800;
+ colors[i].green = 0xE800;
+ colors[i].blue = 0xE800;
+ break;
+ case 4:
+ colors[i].red = 0xCFFF; break; /* red */
+ case 5:
+ colors[i].red = 0x2000;
+ colors[i].blue = 0xCFFF; break; /* blue */
+ case 6:
+ colors[i].red = 0xDFFF; /* yellow */
+ colors[i].green = 0xCFFF; break;
+ }
+ }
+
+ if (!allocate_p)
+ return;
+
+ RETRY_NON_WRITABLE:
+ if (writable_pP && *writable_pP)
+ {
+ unsigned long *pixels = (unsigned long *)
+ malloc(sizeof(*pixels) * (ncolors + 1));
+
+ allocate_writable_colors (screen, cmap, pixels, &ncolors);
+ if (ncolors > 0)
+ for (i = 0; i < ncolors; i++)
+ colors[i].pixel = pixels[i];
+ free (pixels);
+ if (ncolors > 0)
+ XStoreColors (dpy, cmap, colors, ncolors);
+ }
+ else
+ {
+ for (i = 0; i < ncolors; i++)
+ {
+ XColor color;
+ color = colors[i];
+ if (!XAllocColor (dpy, cmap, &color))
+ break;
+ colors[i].pixel = color.pixel;
+ }
+ ncolors = i;
+ }
+
+ /* If we tried for writable cells and got none, try for non-writable. */
+ if (allocate_p && ncolors == 0 && writable_pP && *writable_pP)
+ {
+ ncolors = *ncolorsP;
+ *writable_pP = False;
+ goto RETRY_NON_WRITABLE;
+ }
+
+#if 0
+ /* I don't think we need to bother copying or linking to the complain
+ function. */
+ if (verbose_p)
+ complain(*ncolorsP, ncolors, wanted_writable,
+ wanted_writable && *writable_pP);
+#endif
+
+ *ncolorsP = ncolors;
+}
+
+static void
+mondrian_set_sizes (struct state *st, int w, int h)
+{
+ if (w > h) {
+ st->line_width = w/50;
+ st->min_height = st->min_width = w/8;
+ } else {
+ st->line_width = h/50;
+ st->min_height = st->min_width = h/8;
+ }
+}
+
+static void
+deco (Display *dpy, Window window, struct state *st,
+ int x, int y, int w, int h, int depth)
+{
+ if (((random() % st->max_depth) < depth) || (w < st->min_width) || (h < st->min_height))
+ {
+ if (!mono_p)
+ {
+ if (++st->current_color >= st->ncolors)
+ st->current_color = 0;
+ XSetForeground(dpy, st->bgc, st->colors[st->current_color].pixel);
+ }
+ XFillRectangle (dpy, window, st->bgc, x, y, w, h);
+ XDrawRectangle (dpy, window, st->fgc, x, y, w, h);
+ }
+ else
+ {
+ if ((st->goldenRatio || st->mondrian) ? (w > h) : (random() & 1))
+ { /* Divide the rectangle side-by-side */
+ int wnew = (st->goldenRatio ? (w * (random() & 1 ? PHI1 : PHI2)) : w/2);
+ deco (dpy, window, st, x, y, wnew, h, depth+1);
+ deco (dpy, window, st, x+wnew, y, w-wnew, h, depth+1);
+ }
+ else
+ { /* Divide the rectangle top-to-bottom */
+ int hnew = (st->goldenRatio ? (h * (random() & 1 ? PHI1 : PHI2)) : h/2);
+ deco (dpy, window, st, x, y, w, hnew, depth+1);
+ deco (dpy, window, st, x, y+hnew, w, h-hnew, depth+1);
+ }
+ }
+}
+
+static void *
+deco_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ st->smoothColors = get_boolean_resource(dpy, "smoothColors", "Boolean");
+ st->old_line_width = 1;
+
+ st->goldenRatio = get_boolean_resource (dpy, "goldenRatio", "Boolean");
+
+ st->max_depth = get_integer_resource (dpy, "maxDepth", "Integer");
+ if (st->max_depth < 1) st->max_depth = 1;
+ else if (st->max_depth > 1000) st->max_depth = 1000;
+
+ st->min_width = get_integer_resource (dpy, "minWidth", "Integer");
+ if (st->min_width < 2) st->min_width = 2;
+ st->min_height = get_integer_resource (dpy, "minHeight", "Integer");
+ if (st->min_height < 2) st->min_height = 2;
+
+ st->line_width = get_integer_resource (dpy, "lineWidth", "Integer");
+
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
+
+ gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->fgc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+ gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+ if (st->ncolors <= 2)
+ mono_p = True;
+
+ if (!mono_p)
+ {
+ GC tmp = st->fgc;
+ st->fgc = st->bgc;
+ st->bgc = tmp;
+ }
+
+ st->mondrian = get_boolean_resource(dpy, "mondrian", "Boolean");
+ if (st->mondrian) {
+ /* Mondrian, if true, overrides several other options. */
+ mondrian_set_sizes(st, st->xgwa.width, st->xgwa.height);
+
+ /** set up red-yellow-blue-black-white colormap and fgc **/
+ make_mondrian_colormap(st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+
+ /** put white in several cells **/
+ /** set min-height and min-width to about 10% of total w/h **/
+ }
+ else if (st->smoothColors)
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+ else
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors, False, True, 0, True);
+
+ gcv.line_width = st->old_line_width = st->line_width;
+ XChangeGC(dpy, st->fgc, GCLineWidth, &gcv);
+
+ return st;
+}
+
+static unsigned long
+deco_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFillRectangle (dpy, window, st->bgc, 0, 0, st->xgwa.width, st->xgwa.height);
+ if (st->mondrian) {
+ mondrian_set_sizes(st, st->xgwa.width, st->xgwa.height);
+ if (st->line_width != st->old_line_width) {
+ XSetLineAttributes(dpy, st->fgc, st->line_width,
+ LineSolid, CapButt, JoinBevel);
+ st->old_line_width = st->line_width;
+ }
+ }
+ deco (dpy, window, st, 0, 0, st->xgwa.width, st->xgwa.height, 0);
+ return 1000000 * st->delay;
+}
+
+static void
+deco_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xgwa.width = w;
+ st->xgwa.height = h;
+}
+
+static Bool
+deco_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+deco_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *deco_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: true",
+ "*maxDepth: 12",
+ "*minWidth: 20",
+ "*minHeight: 20",
+ "*lineWidth: 1",
+ "*delay: 5",
+ "*ncolors: 64",
+ "*goldenRatio: False",
+ "*smoothColors: False",
+ "*mondrian: False",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec deco_options [] = {
+ { "-max-depth", ".maxDepth", XrmoptionSepArg, 0 },
+ { "-min-width", ".minWidth", XrmoptionSepArg, 0 },
+ { "-min-height", ".minHeight", XrmoptionSepArg, 0 },
+ { "-line-width", ".lineWidth", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-golden-ratio", ".goldenRatio", XrmoptionNoArg, "True" },
+ { "-no-golden-ratio", ".goldenRatio", XrmoptionNoArg, "False" },
+ { "-smooth-colors", ".smoothColors",XrmoptionNoArg, "True" },
+ { "-no-smooth-colors",".smoothColors",XrmoptionNoArg, "False" },
+ { "-mondrian", ".mondrian", XrmoptionNoArg, "True" },
+ { "-no-mondrian", ".mondrian", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Deco", deco)
diff --git a/hacks/deco.man b/hacks/deco.man
new file mode 100644
index 0000000..e62190c
--- /dev/null
+++ b/hacks/deco.man
@@ -0,0 +1,105 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+deco - draw tacky 70s basement wall panelling
+.SH SYNOPSIS
+.B deco
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIseconds\fP]
+[\-max\-depth \fIint\fP]
+[\-min\-width \fIint\fP]
+[\-min\-height \fIint\fP]
+[\-line-width \yIint\fP]
+[\-smooth\-colors]
+[\-golden\-ratio]
+[\-mondrian]
+[\-fps]
+.SH DESCRIPTION
+The \fIdeco\fP program subdivides and colors rectangles randomly.
+It looks kind of like Brady-Bunch-era rec-room wall paneling.
+(Raven says: "This screensaver is ugly enough to peel paint.")
+Can also produce more aesthetically pleasing displays via options.
+.SH OPTIONS
+.I deco
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to wait before starting over. Default 5 seconds.
+.TP 8
+.B \-max\-depth \fIinteger\fP
+How deep to subdivide. Default 12.
+.TP 8
+.B \-min\-width \fIinteger\fP
+.TP 8
+.B \-min\-height \fIinteger\fP
+The size of the smallest rectangle to draw. Default 20x20.
+.TP 8
+.B \-line\-width \fIinteger\fP
+Width of lines drawn between rectangles. Default zero (minimal width).
+.TP 8
+.B \-smooth\-colors
+.TP 8
+.B \-no\-smooth\-colors
+Whether to use a smooth color palette instead of a random one.
+Less jarring. Default False.
+.TP 8
+.B \-golden\-ratio
+.TP 8
+.B \-no\-golden\-ratio
+Whether to subdivide rectangles using the golden ratio instead of 1/2.
+This ratio is supposed to be more aesthetically pleasing. Default false.
+.TP 8
+.B \-mondrian
+.TP 8
+.B \-no\-mondrian
+Whether to imitiate style of some famous paintings by Piet Mondrian.
+Overrides line-width and colormap options. Default false.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 26-Apr-97, based on code by
+Michael D. Bayne <mdb@go2net.com>. Golden ratio and
+Mondrian settings by Lars Huttar.
diff --git a/hacks/delaunay.c b/hacks/delaunay.c
new file mode 100644
index 0000000..a5ea9ae
--- /dev/null
+++ b/hacks/delaunay.c
@@ -0,0 +1,301 @@
+/* Triangulate
+ Efficient Triangulation Algorithm Suitable for Terrain Modelling
+ or
+ An Algorithm for Interpolating Irregularly-Spaced Data
+ with Applications in Terrain Modelling
+
+ Written by Paul Bourke
+ Presented at Pan Pacific Computer Conference, Beijing, China.
+ January 1989
+ Abstract
+
+ A discussion of a method that has been used with success in terrain
+ modelling to estimate the height at any point on the land surface
+ from irregularly distributed samples. The special requirements of
+ terrain modelling are discussed as well as a detailed description
+ of the algorithm and an example of its application.
+
+ http://paulbourke.net/papers/triangulate/
+ http://paulbourke.net/papers/triangulate/triangulate.c
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "delaunay.h"
+
+typedef struct {
+ int p1,p2;
+} IEDGE;
+
+#define TRUE 1
+#define FALSE 0
+#define EPSILON 0.000001
+
+/*
+ Return TRUE if a point (xp,yp) is inside the circumcircle made up
+ of the points (x1,y1), (x2,y2), (x3,y3)
+ The circumcircle centre is returned in (xc,yc) and the radius r
+ NOTE: A point on the edge is inside the circumcircle
+*/
+static int
+circumcircle (double xp,double yp,
+ double x1,double y1,double x2,double y2,double x3,double y3,
+ double *xc,double *yc,double *rsqr)
+{
+ double m1,m2,mx1,mx2,my1,my2;
+ double dx,dy,drsqr;
+ double fabsy1y2 = fabs(y1-y2);
+ double fabsy2y3 = fabs(y2-y3);
+
+ /* Check for coincident points */
+ if (fabsy1y2 < EPSILON && fabsy2y3 < EPSILON)
+ return(FALSE);
+
+ if (fabsy1y2 < EPSILON) {
+ m2 = - (x3-x2) / (y3-y2);
+ mx2 = (x2 + x3) / 2.0;
+ my2 = (y2 + y3) / 2.0;
+ *xc = (x2 + x1) / 2.0;
+ *yc = m2 * (*xc - mx2) + my2;
+ } else if (fabsy2y3 < EPSILON) {
+ m1 = - (x2-x1) / (y2-y1);
+ mx1 = (x1 + x2) / 2.0;
+ my1 = (y1 + y2) / 2.0;
+ *xc = (x3 + x2) / 2.0;
+ *yc = m1 * (*xc - mx1) + my1;
+ } else {
+ m1 = - (x2-x1) / (y2-y1);
+ m2 = - (x3-x2) / (y3-y2);
+ mx1 = (x1 + x2) / 2.0;
+ mx2 = (x2 + x3) / 2.0;
+ my1 = (y1 + y2) / 2.0;
+ my2 = (y2 + y3) / 2.0;
+ *xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
+ if (fabsy1y2 > fabsy2y3) {
+ *yc = m1 * (*xc - mx1) + my1;
+ } else {
+ *yc = m2 * (*xc - mx2) + my2;
+ }
+ }
+
+ dx = x2 - *xc;
+ dy = y2 - *yc;
+ *rsqr = dx*dx + dy*dy;
+
+ dx = xp - *xc;
+ dy = yp - *yc;
+ drsqr = dx*dx + dy*dy;
+
+ /* Original
+ return((drsqr <= *rsqr) ? TRUE : FALSE);
+ Proposed by Chuck Morris */
+ return((drsqr - *rsqr) <= EPSILON ? TRUE : FALSE);
+}
+
+
+/*
+ Triangulation subroutine
+ Takes as input NV vertices in array pxyz
+ Returned is a list of ntri triangular faces in the array v
+ These triangles are arranged in a consistent clockwise order.
+ The triangle array 'v' should be malloced to 3 * nv
+ The vertex array pxyz must be big enough to hold 3 more points
+ The vertex array must be sorted in increasing x values say
+ qsort(p,nv,sizeof(XYZ),XYZCompare);
+*/
+int
+delaunay (int nv,XYZ *pxyz,ITRIANGLE *v,int *ntri)
+{
+ int *complete = NULL;
+ IEDGE *edges = NULL;
+ int nedge = 0;
+ int trimax,emax = 200;
+ int status = 0;
+
+ int inside;
+ int i,j,k;
+ double xp,yp,x1,y1,x2,y2,x3,y3,xc=0,yc=0,r=0;
+ double xmin,xmax,ymin,ymax,xmid,ymid;
+ double dx,dy,dmax;
+
+ /* Allocate memory for the completeness list, flag for each triangle */
+ trimax = 4 * nv;
+ if ((complete = malloc(trimax*sizeof(int))) == NULL) {
+ status = 1;
+ goto skip;
+ }
+
+ /* Allocate memory for the edge list */
+ if ((edges = malloc(emax*(long)sizeof(IEDGE))) == NULL) {
+ status = 2;
+ goto skip;
+ }
+
+ /*
+ Find the maximum and minimum vertex bounds.
+ This is to allow calculation of the bounding triangle
+ */
+ xmin = pxyz[0].x;
+ ymin = pxyz[0].y;
+ xmax = xmin;
+ ymax = ymin;
+ for (i=1;i<nv;i++) {
+ if (pxyz[i].x < xmin) xmin = pxyz[i].x;
+ if (pxyz[i].x > xmax) xmax = pxyz[i].x;
+ if (pxyz[i].y < ymin) ymin = pxyz[i].y;
+ if (pxyz[i].y > ymax) ymax = pxyz[i].y;
+ }
+ dx = xmax - xmin;
+ dy = ymax - ymin;
+ dmax = (dx > dy) ? dx : dy;
+ xmid = (xmax + xmin) / 2.0;
+ ymid = (ymax + ymin) / 2.0;
+
+ /*
+ Set up the supertriangle
+ This is a triangle which encompasses all the sample points.
+ The supertriangle coordinates are added to the end of the
+ vertex list. The supertriangle is the first triangle in
+ the triangle list.
+ */
+ pxyz[nv+0].x = xmid - 20 * dmax;
+ pxyz[nv+0].y = ymid - dmax;
+ pxyz[nv+0].z = 0.0;
+ pxyz[nv+1].x = xmid;
+ pxyz[nv+1].y = ymid + 20 * dmax;
+ pxyz[nv+1].z = 0.0;
+ pxyz[nv+2].x = xmid + 20 * dmax;
+ pxyz[nv+2].y = ymid - dmax;
+ pxyz[nv+2].z = 0.0;
+ v[0].p1 = nv;
+ v[0].p2 = nv+1;
+ v[0].p3 = nv+2;
+ complete[0] = FALSE;
+ *ntri = 1;
+
+ /*
+ Include each point one at a time into the existing mesh
+ */
+ for (i=0;i<nv;i++) {
+
+ xp = pxyz[i].x;
+ yp = pxyz[i].y;
+ nedge = 0;
+
+ /*
+ Set up the edge buffer.
+ If the point (xp,yp) lies inside the circumcircle then the
+ three edges of that triangle are added to the edge buffer
+ and that triangle is removed.
+ */
+ for (j=0;j<(*ntri);j++) {
+ if (complete[j])
+ continue;
+ x1 = pxyz[v[j].p1].x;
+ y1 = pxyz[v[j].p1].y;
+ x2 = pxyz[v[j].p2].x;
+ y2 = pxyz[v[j].p2].y;
+ x3 = pxyz[v[j].p3].x;
+ y3 = pxyz[v[j].p3].y;
+ inside = circumcircle(xp,yp,x1,y1,x2,y2,x3,y3,&xc,&yc,&r);
+ if (xc < xp && ((xp-xc)*(xp-xc)) > r)
+ complete[j] = TRUE;
+ if (inside) {
+ /* Check that we haven't exceeded the edge list size */
+ if (nedge+3 >= emax) {
+ emax += 100;
+ if ((edges = realloc(edges,emax*(long)sizeof(IEDGE))) == NULL) {
+ status = 3;
+ goto skip;
+ }
+ }
+ edges[nedge+0].p1 = v[j].p1;
+ edges[nedge+0].p2 = v[j].p2;
+ edges[nedge+1].p1 = v[j].p2;
+ edges[nedge+1].p2 = v[j].p3;
+ edges[nedge+2].p1 = v[j].p3;
+ edges[nedge+2].p2 = v[j].p1;
+ nedge += 3;
+ v[j] = v[(*ntri)-1];
+ complete[j] = complete[(*ntri)-1];
+ (*ntri)--;
+ j--;
+ }
+ }
+
+ /*
+ Tag multiple edges
+ Note: if all triangles are specified anticlockwise then all
+ interior edges are opposite pointing in direction.
+ */
+ for (j=0;j<nedge-1;j++) {
+ for (k=j+1;k<nedge;k++) {
+ if ((edges[j].p1 == edges[k].p2) && (edges[j].p2 == edges[k].p1)) {
+ edges[j].p1 = -1;
+ edges[j].p2 = -1;
+ edges[k].p1 = -1;
+ edges[k].p2 = -1;
+ }
+ /* Shouldn't need the following, see note above */
+ if ((edges[j].p1 == edges[k].p1) && (edges[j].p2 == edges[k].p2)) {
+ edges[j].p1 = -1;
+ edges[j].p2 = -1;
+ edges[k].p1 = -1;
+ edges[k].p2 = -1;
+ }
+ }
+ }
+
+ /*
+ Form new triangles for the current point
+ Skipping over any tagged edges.
+ All edges are arranged in clockwise order.
+ */
+ for (j=0;j<nedge;j++) {
+ if (edges[j].p1 < 0 || edges[j].p2 < 0)
+ continue;
+ if ((*ntri) >= trimax) {
+ status = 4;
+ goto skip;
+ }
+ v[*ntri].p1 = edges[j].p1;
+ v[*ntri].p2 = edges[j].p2;
+ v[*ntri].p3 = i;
+ complete[*ntri] = FALSE;
+ (*ntri)++;
+ }
+ }
+
+ /*
+ Remove triangles with supertriangle vertices
+ These are triangles which have a vertex number greater than nv
+ */
+ for (i=0;i<(*ntri);i++) {
+ if (v[i].p1 >= nv || v[i].p2 >= nv || v[i].p3 >= nv) {
+ v[i] = v[(*ntri)-1];
+ (*ntri)--;
+ i--;
+ }
+ }
+
+ skip:
+ free(edges);
+ free(complete);
+ return(status);
+}
+
+
+int
+delaunay_xyzcompare (const void *v1, const void *v2)
+{
+ const XYZ *p1,*p2;
+ p1 = v1;
+ p2 = v2;
+ if (p1->x < p2->x)
+ return(-1);
+ else if (p1->x > p2->x)
+ return(1);
+ else
+ return(0);
+}
diff --git a/hacks/delaunay.h b/hacks/delaunay.h
new file mode 100644
index 0000000..913de6d
--- /dev/null
+++ b/hacks/delaunay.h
@@ -0,0 +1,52 @@
+/* Triangulate
+ Efficient Triangulation Algorithm Suitable for Terrain Modelling
+ or
+ An Algorithm for Interpolating Irregularly-Spaced Data
+ with Applications in Terrain Modelling
+
+ Written by Paul Bourke
+ Presented at Pan Pacific Computer Conference, Beijing, China.
+ January 1989
+ Abstract
+
+ A discussion of a method that has been used with success in terrain
+ modelling to estimate the height at any point on the land surface
+ from irregularly distributed samples. The special requirements of
+ terrain modelling are discussed as well as a detailed description
+ of the algorithm and an example of its application.
+
+ http://paulbourke.net/papers/triangulate/
+ http://paulbourke.net/papers/triangulate/triangulate.c
+ */
+
+#ifndef __DELAUNAY_H__
+#define __DELAUNAY_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+typedef struct {
+ double x,y,z;
+} XYZ;
+
+typedef struct {
+ int p1,p2,p3;
+} ITRIANGLE;
+
+/*
+ Takes as input NV vertices in array pxyz
+ Returned is a list of ntri triangular faces in the array v
+ These triangles are arranged in a consistent clockwise order.
+ The triangle array 'v' should be malloced to 3 * nv
+ The vertex array pxyz must be big enough to hold 3 more points
+ The vertex array must be sorted in increasing x values
+ */
+extern int delaunay (int nv, XYZ *pxyz, ITRIANGLE *v, int *ntri);
+
+/* qsort(p,nv,sizeof(XYZ), delaunay_xyzcompare); */
+extern int delaunay_xyzcompare (const void *v1, const void *v2);
+
+
+#endif /* __DELAUNAY_H__ */
+
diff --git a/hacks/deluxe.c b/hacks/deluxe.c
new file mode 100644
index 0000000..694a982
--- /dev/null
+++ b/hacks/deluxe.c
@@ -0,0 +1,465 @@
+/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "alpha.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Bool transparent_p;
+ int nplanes;
+ unsigned long base_pixel, *plane_masks;
+
+ int count;
+ int delay;
+ int ncolors;
+ Bool dbuf;
+ XColor *colors;
+ GC erase_gc;
+ struct throbber **throbbers;
+ XWindowAttributes xgwa;
+ Pixmap b, ba, bb; /* double-buffer to reduce flicker */
+
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ Bool dbeclear_p;
+ XdbeBackBuffer backb;
+# endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+};
+
+struct throbber {
+ int x, y;
+ int size;
+ int max_size;
+ int thickness;
+ int speed;
+ int fuse;
+ GC gc;
+ void (*draw) (struct state *, Drawable, struct throbber *);
+};
+
+
+static void
+draw_star (struct state *st, Drawable w, struct throbber *t)
+{
+ XPoint points[11];
+ int x = t->x;
+ int y = t->y;
+
+ /*
+ The following constant is really:
+ sqrt(5 - sqrt(5)) / sqrt(25 - 11 * sqrt(5))
+
+ Reference: http://mathworld.wolfram.com/Pentagram.html
+ */
+ int s = t->size * 2.6180339887498985;
+ int s2 = t->size;
+ double c = M_PI * 2;
+ double o = -M_PI / 2;
+
+ points[0].x = x + s * cos(o + 0.0*c); points[0].y = y + s * sin(o + 0.0*c);
+ points[1].x = x + s2 * cos(o + 0.1*c); points[1].y = y + s2 * sin(o + 0.1*c);
+ points[2].x = x + s * cos(o + 0.2*c); points[2].y = y + s * sin(o + 0.2*c);
+ points[3].x = x + s2 * cos(o + 0.3*c); points[3].y = y + s2 * sin(o + 0.3*c);
+ points[4].x = x + s * cos(o + 0.4*c); points[4].y = y + s * sin(o + 0.4*c);
+ points[5].x = x + s2 * cos(o + 0.5*c); points[5].y = y + s2 * sin(o + 0.5*c);
+ points[6].x = x + s * cos(o + 0.6*c); points[6].y = y + s * sin(o + 0.6*c);
+ points[7].x = x + s2 * cos(o + 0.7*c); points[7].y = y + s2 * sin(o + 0.7*c);
+ points[8].x = x + s * cos(o + 0.8*c); points[8].y = y + s * sin(o + 0.8*c);
+ points[9].x = x + s2 * cos(o + 0.9*c); points[9].y = y + s2 * sin(o + 0.9*c);
+ points[10] = points[0];
+
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+}
+
+static void
+draw_circle (struct state *st, Drawable w, struct throbber *t)
+{
+ XDrawArc (st->dpy, w, t->gc,
+ t->x - t->size / 2,
+ t->y - t->size / 2,
+ t->size, t->size,
+ 0, 360*64);
+}
+
+static void
+draw_hlines (struct state *st, Drawable w, struct throbber *t)
+{
+ XDrawLine (st->dpy, w, t->gc, 0,
+ t->y - t->size, t->max_size,
+ t->y - t->size);
+ XDrawLine (st->dpy, w, t->gc, 0,
+ t->y + t->size, t->max_size,
+ t->y + t->size);
+}
+
+static void
+draw_vlines (struct state *st, Drawable w, struct throbber *t)
+{
+ XDrawLine (st->dpy, w, t->gc,
+ t->x - t->size, 0,
+ t->x - t->size, t->max_size);
+ XDrawLine (st->dpy, w, t->gc,
+ t->x + t->size, 0,
+ t->x + t->size, t->max_size);
+}
+
+static void
+draw_corners (struct state *st, Drawable w, struct throbber *t)
+{
+ int s = (t->size + t->thickness) / 2;
+ XPoint points[3];
+
+ if (t->y > s)
+ {
+ points[0].x = 0; points[0].y = t->y - s;
+ points[1].x = t->x - s; points[1].y = t->y - s;
+ points[2].x = t->x - s; points[2].y = 0;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+
+ points[0].x = t->x + s; points[0].y = 0;
+ points[1].x = t->x + s; points[1].y = t->y - s;
+ points[2].x = t->max_size; points[2].y = t->y - s;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+ }
+
+ if (t->x > s)
+ {
+ points[0].x = 0; points[0].y = t->y + s;
+ points[1].x = t->x - s; points[1].y = t->y + s;
+ points[2].x = t->x - s; points[2].y = t->max_size;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+
+ points[0].x = t->x + s; points[0].y = t->max_size;
+ points[1].x = t->x + s; points[1].y = t->y + s;
+ points[2].x = t->max_size; points[2].y = t->y + s;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+ }
+}
+
+
+static struct throbber *
+make_throbber (struct state *st, Drawable d, int w, int h, unsigned long pixel)
+{
+ XGCValues gcv;
+ unsigned long flags;
+ struct throbber *t = (struct throbber *) malloc (sizeof (*t));
+ t->x = w / 2;
+ t->y = h / 2;
+ t->max_size = (w > h ? w : h);
+ t->speed = get_integer_resource (st->dpy, "speed", "Speed");
+ t->fuse = 1 + (random() % 4);
+ t->thickness = get_integer_resource (st->dpy, "thickness", "Thickness");
+
+ if (st->xgwa.width > 2560) t->thickness *= 3; /* Retina displays */
+
+ if (t->speed < 0) t->speed = -t->speed;
+ t->speed += (((random() % t->speed) / 2) - (t->speed / 2));
+ if (t->speed > 0) t->speed = -t->speed;
+
+ flags = GCForeground;
+# ifndef HAVE_JWXYZ
+ if (st->transparent_p)
+ {
+ gcv.foreground = ~0L;
+ gcv.plane_mask = st->base_pixel | st->plane_masks[random() % st->nplanes];
+ flags |= GCPlaneMask;
+ }
+ else
+# endif /* !HAVE_JWXYZ */
+ {
+ gcv.foreground = pixel;
+ }
+
+ gcv.line_width = t->thickness;
+ gcv.cap_style = CapProjecting;
+ gcv.join_style = JoinMiter;
+
+ flags |= (GCLineWidth | GCCapStyle | GCJoinStyle);
+ t->gc = XCreateGC (st->dpy, d, flags, &gcv);
+
+# ifdef HAVE_JWXYZ
+ if (st->transparent_p)
+ {
+ /* give a non-opaque alpha to the color */
+ unsigned long pixel = gcv.foreground;
+ unsigned long amask = BlackPixelOfScreen (st->xgwa.screen);
+ unsigned long a = (0xCCCCCCCC & amask);
+ pixel = (pixel & (~amask)) | a;
+
+ jwxyz_XSetAlphaAllowed (st->dpy, t->gc, True);
+ XSetForeground (st->dpy, t->gc, pixel);
+ }
+# endif /* HAVE_JWXYZ */
+
+ switch (random() % 11) {
+ case 0: case 1: case 2: case 3: t->draw = draw_star; break;
+ case 4: case 5: case 6: case 7: t->draw = draw_circle; break;
+ case 8: t->draw = draw_hlines; break;
+ case 9: t->draw = draw_vlines; break;
+ case 10: t->draw = draw_corners; break;
+ default: abort(); break;
+ }
+
+ if (t->draw == draw_circle)
+ t->max_size *= 1.5;
+
+ if (random() % 4)
+ t->size = t->max_size;
+ else
+ t->size = t->thickness, t->speed = -t->speed;
+
+ return t;
+}
+
+static int
+throb (struct state *st, Drawable window, struct throbber *t)
+{
+ t->size += t->speed;
+ if (t->size <= (t->thickness / 2))
+ {
+ t->speed = -t->speed;
+ t->size += (t->speed * 2);
+ }
+ else if (t->size > t->max_size)
+ {
+ t->speed = -t->speed;
+ t->size += (t->speed * 2);
+ t->fuse--;
+ }
+
+ if (t->fuse <= 0)
+ {
+ XFreeGC (st->dpy, t->gc);
+ memset (t, 0, sizeof(*t));
+ free (t);
+ return -1;
+ }
+ else
+ {
+ t->draw (st, window, t);
+ return 0;
+ }
+}
+
+
+static void *
+deluxe_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ int i;
+ st->dpy = dpy;
+ st->window = window;
+ st->count = get_integer_resource (st->dpy, "count", "Integer");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ st->dbuf = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->dbeclear_p = get_boolean_resource (st->dpy, "useDBEClear", "Boolean");
+#endif
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->transparent_p = get_boolean_resource(st->dpy, "transparent", "Transparent");
+
+ st->colors = (XColor *) calloc (sizeof(*st->colors), st->ncolors);
+
+ if (get_boolean_resource(st->dpy, "mono", "Boolean"))
+ {
+ MONO:
+ st->ncolors = 1;
+ st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ }
+#ifndef HAVE_JWXYZ
+ else if (st->transparent_p)
+ {
+ st->nplanes = get_integer_resource (st->dpy, "planes", "Planes");
+ if (st->nplanes <= 0)
+ st->nplanes = (random() % (st->xgwa.depth-2)) + 2;
+
+ allocate_alpha_colors (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ &st->nplanes, True, &st->plane_masks,
+ &st->base_pixel);
+ if (st->nplanes <= 1)
+ {
+# if 0
+ fprintf (stderr,
+ "%s: couldn't allocate any color planes; turning transparency off.\n",
+ progname);
+# endif
+ st->transparent_p = False;
+ goto COLOR;
+ }
+ }
+#endif /* !HAVE_JWXYZ */
+ else
+ {
+#ifndef HAVE_JWXYZ
+ COLOR:
+#endif
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, True, 0, True);
+ if (st->ncolors < 2)
+ goto MONO;
+ }
+
+ if (st->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->dbeclear_p)
+ st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeBackground);
+ else
+ st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+ st->backb = st->b;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!st->b)
+ {
+ st->ba = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = st->window;
+ }
+
+ st->throbbers = (struct throbber **) calloc (st->count, sizeof(struct throbber *));
+ for (i = 0; i < st->count; i++)
+ st->throbbers[i] = make_throbber (st, st->b, st->xgwa.width, st->xgwa.height,
+ st->colors[random() % st->ncolors].pixel);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &gcv);
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ return st;
+}
+
+static unsigned long
+deluxe_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (!st->dbeclear_p || !st->backb)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ XFillRectangle (st->dpy, st->b, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ for (i = 0; i < st->count; i++)
+ if (throb (st, st->b, st->throbbers[i]) < 0)
+ st->throbbers[i] = make_throbber (st, st->b, st->xgwa.width, st->xgwa.height,
+ st->colors[random() % st->ncolors].pixel);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = (st->dbeclear_p ? XdbeBackground : XdbeUndefined);
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, st->window, st->erase_gc, 0, 0,
+ st->xgwa.width, st->xgwa.height, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+static void
+deluxe_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (! st->dbuf) { /* #### more complicated if we have a back buffer... */
+ int i;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ XClearWindow (dpy, window);
+ for (i = 0; i < st->count; i++)
+ if (st->throbbers[i])
+ st->throbbers[i]->fuse = 0;
+ }
+}
+
+static Bool
+deluxe_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+deluxe_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *deluxe_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*delay: 10000",
+ "*count: 5",
+ "*thickness: 50",
+ "*speed: 15",
+ "*ncolors: 20",
+ "*transparent: True",
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+ "*useDBEClear: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec deluxe_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-transparent", ".transparent", XrmoptionNoArg, "True" },
+ { "-no-transparent", ".transparent", XrmoptionNoArg, "False" },
+ { "-opaque", ".transparent", XrmoptionNoArg, "False" },
+ { "-no-opaque", ".transparent", XrmoptionNoArg, "True" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Deluxe", deluxe)
diff --git a/hacks/deluxe.man b/hacks/deluxe.man
new file mode 100644
index 0000000..380e7e5
--- /dev/null
+++ b/hacks/deluxe.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+deluxe - pulsing sequence of stars, circles, and lines.
+.SH SYNOPSIS
+.B deluxe
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-count \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-transparent]
+[\-no-db]
+[\-fps]
+.SH DESCRIPTION
+This draws a pulsing sequence of stars, circles, and lines.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of lines. Default: 50.
+.TP 8
+.B \-count \fInumber\fP
+Number of objects. Default: 5.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors. Default: 20.
+.TP 8
+.B \-transparent | \-no-transparent
+Whether to use transparency.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/demon.c b/hacks/demon.c
new file mode 100644
index 0000000..0fff863
--- /dev/null
+++ b/hacks/demon.c
@@ -0,0 +1,952 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* demon --- David Griffeath's cellular automata */
+
+#if 0
+static const char sccsid[] = "@(#)demon.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 16-Apr-1997: -neighbors 3, 9 (not sound mathematically), 12, and 8 added
+ * 30-May-1996: Ron Hitchens <ron@idiom.com>
+ * Fixed memory management that caused leaks
+ * 14-Apr-1996: -neighbors 6 runtime-time option added
+ * 21-Aug-1995: Coded from A.K. Dewdney's "Computer Recreations", Scientific
+ * American Magazine" Aug 1989 pp 102-105. Also very similar
+ * to hodgepodge machine described in A.K. Dewdney's "Computer
+ * Recreations", Scientific American Magazine" Aug 1988
+ * pp 104-107. Also used life.c as a guide.
+ */
+
+/*-
+ * A cellular universe of 4 phases debris, droplets, defects, and demons.
+ */
+
+/*-
+ Grid Number of Neighbors
+ ---- ------------------
+ Square 4 or 8
+ Hexagon 6
+ Triangle 3, 9, or 12
+*/
+
+#ifndef HAVE_JWXYZ
+# define DO_STIPPLE
+#endif
+
+#ifdef STANDALONE
+# define MODE_demon
+# define DEFAULTS "*delay: 50000 \n" \
+ "*count: 0 \n" \
+ "*cycles: 1000 \n" \
+ "*size: -30 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define UNIFORM_COLORS
+# define release_demon 0
+# define reshape_demon 0
+# define demon_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+#include "automata.h"
+
+#ifdef MODE_demon
+
+/*-
+ * neighbors of 0 randomizes it between 3, 4, 6, 8, 9, and 12.
+ */
+#define DEF_NEIGHBORS "0" /* choose random value */
+
+static int neighbors;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-neighbors", ".demon.neighbors", XrmoptionSepArg, 0}
+};
+
+static argtype vars[] =
+{
+ {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
+};
+static OptionStruct desc[] =
+{
+ {"-neighbors num", "squares 4 or 8, hexagons 6, triangles 3, 9 or 12"}
+};
+
+ENTRYPOINT ModeSpecOpt demon_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct demon_description =
+{"demon", "init_demon", "draw_demon", (char *) NULL,
+ "refresh_demon", "init_demon", "free_demon", &demon_opts,
+ 50000, 0, 1000, -7, 64, 1.0, "",
+ "Shows Griffeath's cellular automata", 0, NULL};
+
+#endif
+
+#define DEMONBITS(n,w,h)\
+ if ((dp->pixmaps[dp->init_bits]=\
+ XCreatePixmapFromBitmapData(MI_DISPLAY(mi),window,(char *)n,w,h,1,0,1))==None){\
+ free_demon(mi); return;} else {dp->init_bits++;}
+
+#define REDRAWSTEP 2000 /* How many cells to draw per cycle */
+#define MINSTATES 2
+#define MINGRIDSIZE 5
+#define MINSIZE 4
+#define NEIGHBORKINDS 6
+
+/* Singly linked list */
+typedef struct _CellList {
+ XPoint pt;
+ struct _CellList *next;
+} CellList;
+
+typedef struct {
+ int generation;
+ int xs, ys;
+ int xb, yb;
+ int nrows, ncols;
+ int width, height;
+ int states;
+ int state;
+ int redrawing, redrawpos;
+ int *ncells;
+ CellList **cellList;
+ unsigned char *oldcell, *newcell;
+ int neighbors;
+ int init_bits;
+ GC stippledGC;
+ Pixmap pixmaps[NUMSTIPPLES - 1];
+ union {
+ XPoint hexagon[6];
+ XPoint triangle[2][3];
+ } shape;
+} demonstruct;
+
+static char plots[2][NEIGHBORKINDS] =
+{
+ {3, 4, 6, 8, 9, 12}, /* Neighborhoods */
+ {12, 16, 18, 20, 22, 24} /* Number of states */
+};
+
+static demonstruct *demons = (demonstruct *) NULL;
+
+static void
+drawcell(ModeInfo * mi, int col, int row, unsigned char state)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ GC gc;
+
+ if (!state) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ gc = MI_GC(mi);
+ } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
+ (dp->states - 1)) % MI_NPIXELS(mi)));
+ gc = MI_GC(mi);
+ } else {
+ XGCValues gcv;
+#ifdef DO_STIPPLE
+ gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
+#endif /* DO_STIPPLE */
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
+ GCStipple | GCForeground | GCBackground, &gcv);
+ gc = dp->stippledGC;
+ }
+ if (dp->neighbors == 6) {
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+ dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
+ dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
+ if (dp->xs == 1 && dp->ys == 1)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
+ gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y);
+ else
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.hexagon, 6, Convex, CoordModePrevious);
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->xb + dp->xs * col, dp->yb + dp->ys * row,
+ dp->xs - (dp->xs > 3), dp->ys - (dp->ys > 3));
+ } else { /* TRI */
+ int orient = (col + row) % 2; /* O left 1 right */
+
+ dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
+ dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
+ if (dp->xs <= 3 || dp->ys <= 3)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
+ dp->shape.triangle[orient][0].y);
+ else {
+ if (orient)
+ dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
+ else
+ dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
+
+ }
+ }
+}
+
+static Bool
+addtolist(ModeInfo * mi, int col, int row, unsigned char state)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ CellList *current;
+
+ current = dp->cellList[state];
+ if ((dp->cellList[state] = (CellList *)
+ malloc(sizeof (CellList))) == NULL) {
+ return False;
+ }
+ dp->cellList[state]->pt.x = col;
+ dp->cellList[state]->pt.y = row;
+ dp->cellList[state]->next = current;
+ dp->ncells[state]++;
+ return True;
+}
+
+
+static void
+free_state(demonstruct * dp, int state)
+{
+ CellList *current;
+
+ while (dp->cellList[state]) {
+ current = dp->cellList[state];
+ dp->cellList[state] = dp->cellList[state]->next;
+ (void) free((void *) current);
+ }
+ dp->cellList[state] = (CellList *) NULL;
+ if (dp->ncells != NULL)
+ dp->ncells[state] = 0;
+}
+
+
+static void
+free_list(demonstruct * dp)
+{
+ int state;
+
+ for (state = 0; state < dp->states; state++)
+ free_state(dp, state);
+ (void) free((void *) dp->cellList);
+ dp->cellList = (CellList **) NULL;
+}
+
+static void
+free_struct(demonstruct * dp)
+{
+ if (dp->cellList != NULL) {
+ free_list(dp);
+ }
+ if (dp->ncells != NULL) {
+ (void) free((void *) dp->ncells);
+ dp->ncells = (int *) NULL;
+ }
+ if (dp->oldcell != NULL) {
+ (void) free((void *) dp->oldcell);
+ dp->oldcell = (unsigned char *) NULL;
+ }
+ if (dp->newcell != NULL) {
+ (void) free((void *) dp->newcell);
+ dp->newcell = (unsigned char *) NULL;
+ }
+}
+
+ENTRYPOINT void
+free_demon(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ int shade;
+
+ if (dp->stippledGC != None) {
+ XFreeGC(display, dp->stippledGC);
+ dp->stippledGC = None;
+ }
+ for (shade = 0; shade < dp->init_bits; shade++) {
+ XFreePixmap(display, dp->pixmaps[shade]);
+ }
+ dp->init_bits = 0;
+ free_struct(dp);
+}
+
+static Bool
+draw_state(ModeInfo * mi, int state)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ GC gc;
+ XRectangle *rects;
+ CellList *current;
+
+ if (!state) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ gc = MI_GC(mi);
+ } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
+ (dp->states - 1)) % MI_NPIXELS(mi)));
+ gc = MI_GC(mi);
+ } else {
+ XGCValues gcv;
+
+#ifdef DO_STIPPLE
+ gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
+#endif /* DO_STIPPLE */
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
+ GCStipple | GCForeground | GCBackground, &gcv);
+ gc = dp->stippledGC;
+ }
+ if (dp->neighbors == 6) { /* Draw right away, slow */
+ current = dp->cellList[state];
+ while (current) {
+ int col, row, ccol, crow;
+
+ col = current->pt.x;
+ row = current->pt.y;
+ ccol = 2 * col + !(row & 1), crow = 2 * row;
+ dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
+ dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
+ if (dp->xs == 1 && dp->ys == 1)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
+ gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y);
+ else
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.hexagon, 6, Convex, CoordModePrevious);
+ current = current->next;
+ }
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ /* Take advantage of XDrawRectangles */
+ int ncells = 0;
+
+ /* Create Rectangle list from part of the cellList */
+ if ((rects = (XRectangle *) malloc(dp->ncells[state] *
+ sizeof (XRectangle))) == NULL) {
+ return False;
+ }
+ current = dp->cellList[state];
+ while (current) {
+ rects[ncells].x = dp->xb + current->pt.x * dp->xs;
+ rects[ncells].y = dp->yb + current->pt.y * dp->ys;
+ rects[ncells].width = dp->xs - (dp->xs > 3);
+ rects[ncells].height = dp->ys - (dp->ys > 3);
+ current = current->next;
+ ncells++;
+ }
+ /* Finally get to draw */
+ XFillRectangles(MI_DISPLAY(mi), MI_WINDOW(mi), gc, rects, ncells);
+ /* Free up rects list and the appropriate part of the cellList */
+ (void) free((void *) rects);
+ } else { /* TRI */
+ current = dp->cellList[state];
+ while (current) {
+ int col, row, orient;
+
+ col = current->pt.x;
+ row = current->pt.y;
+ orient = (col + row) % 2; /* O left 1 right */
+ dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
+ dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
+ if (dp->xs <= 3 || dp->ys <= 3)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
+ dp->shape.triangle[orient][0].y);
+ else {
+ if (orient)
+ dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
+ else
+ dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
+ }
+ current = current->next;
+ }
+ }
+ free_state(dp, state);
+ return True;
+}
+
+static void
+RandomSoup(ModeInfo * mi)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ int row, col, mrow = 0;
+
+ for (row = 0; row < dp->nrows; ++row) {
+ for (col = 0; col < dp->ncols; ++col) {
+ dp->oldcell[col + mrow] =
+ (unsigned char) LRAND() % ((unsigned char) dp->states);
+ if (!addtolist(mi, col, row, dp->oldcell[col + mrow]))
+ return; /* sparse soup */
+ }
+ mrow += dp->ncols;
+ }
+}
+
+ENTRYPOINT void
+init_demon (ModeInfo * mi)
+{
+ int size = MI_SIZE(mi), nk;
+ demonstruct *dp;
+
+ MI_INIT (mi, demons);
+ dp = &demons[MI_SCREEN(mi)];
+
+ if (MI_WIDTH(mi) < 100 || MI_HEIGHT(mi) < 100) /* tiny window */
+ size = MIN(MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ dp->generation = 0;
+ dp->redrawing = 0;
+#ifdef DO_STIPPLE
+ if (MI_NPIXELS(mi) < NUMSTIPPLES) {
+ Window window = MI_WINDOW(mi);
+ if (dp->stippledGC == None) {
+ XGCValues gcv;
+
+ gcv.fill_style = FillOpaqueStippled;
+ if ((dp->stippledGC = XCreateGC(MI_DISPLAY(mi), window,
+ GCFillStyle, &gcv)) == None) {
+ free_demon(mi);
+ return;
+ }
+ }
+ if (dp->init_bits == 0) {
+ int i;
+
+ for (i = 1; i < NUMSTIPPLES; i++) {
+ DEMONBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
+ }
+ }
+ }
+#endif /* DO_STIPPLE */
+ free_struct(dp);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+#endif
+
+ for (nk = 0; nk < NEIGHBORKINDS; nk++) {
+ if (neighbors == plots[0][nk]) {
+ dp->neighbors = plots[0][nk];
+ break;
+ }
+ if (nk == NEIGHBORKINDS - 1) {
+ nk = NRAND(NEIGHBORKINDS);
+ dp->neighbors = plots[0][nk];
+ break;
+ }
+ }
+
+ dp->states = MI_COUNT(mi);
+ if (dp->states < -MINSTATES)
+ dp->states = NRAND(-dp->states - MINSTATES + 1) + MINSTATES;
+ else if (dp->states < MINSTATES)
+ dp->states = plots[1][nk];
+ if ((dp->cellList = (CellList **) calloc(dp->states,
+ sizeof (CellList *))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+ if ((dp->ncells = (int *) calloc(dp->states, sizeof (int))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+
+ dp->state = 0;
+
+ dp->width = MI_WIDTH(mi);
+ dp->height = MI_HEIGHT(mi);
+
+ if (dp->neighbors == 6) {
+ int nccols, ncrows, i;
+
+ if (dp->width < 8)
+ dp->width = 8;
+ if (dp->height < 8)
+ dp->height = 8;
+ if (size < -MINSIZE)
+ dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+ else
+ dp->ys = MINSIZE;
+ } else
+ dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE));
+ dp->xs = dp->ys;
+ nccols = MAX(dp->width / dp->xs - 2, 2);
+ ncrows = MAX(dp->height / dp->ys - 1, 4);
+ dp->ncols = nccols / 2;
+ dp->nrows = 2 * (ncrows / 4);
+ dp->xb = (dp->width - dp->xs * nccols) / 2 + dp->xs / 2;
+ dp->yb = (dp->height - dp->ys * (ncrows / 2) * 2) / 2 + dp->ys - 2;
+ for (i = 0; i < 6; i++) {
+ dp->shape.hexagon[i].x = (dp->xs - 1) * hexagonUnit[i].x;
+ dp->shape.hexagon[i].y = ((dp->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+ }
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ if (size < -MINSIZE)
+ dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+ else
+ dp->ys = MINSIZE;
+ } else
+ dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE));
+ dp->xs = dp->ys;
+ dp->ncols = MAX(dp->width / dp->xs, 2);
+ dp->nrows = MAX(dp->height / dp->ys, 2);
+ dp->xb = (dp->width - dp->xs * dp->ncols) / 2;
+ dp->yb = (dp->height - dp->ys * dp->nrows) / 2;
+ } else { /* TRI */
+ int orient, i;
+
+ if (dp->width < 2)
+ dp->width = 2;
+ if (dp->height < 2)
+ dp->height = 2;
+ if (size < -MINSIZE)
+ dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+ else
+ dp->ys = MINSIZE;
+ } else
+ dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE));
+ dp->xs = (int) (1.52 * dp->ys);
+ dp->ncols = (MAX(dp->width / dp->xs - 1, 2) / 2) * 2;
+ dp->nrows = (MAX(dp->height / dp->ys - 1, 2) / 2) * 2;
+ dp->xb = (dp->width - dp->xs * dp->ncols) / 2 + dp->xs / 2;
+ dp->yb = (dp->height - dp->ys * dp->nrows) / 2 + dp->ys / 2;
+ for (orient = 0; orient < 2; orient++) {
+ for (i = 0; i < 3; i++) {
+ dp->shape.triangle[orient][i].x =
+ (dp->xs - 2) * triangleUnit[orient][i].x;
+ dp->shape.triangle[orient][i].y =
+ (dp->ys - 2) * triangleUnit[orient][i].y;
+ }
+ }
+ }
+
+ MI_CLEARWINDOW(mi);
+
+ if ((dp->oldcell = (unsigned char *)
+ malloc(dp->ncols * dp->nrows * sizeof (unsigned char))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+
+ if ((dp->newcell = (unsigned char *)
+ malloc(dp->ncols * dp->nrows * sizeof (unsigned char))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+
+ RandomSoup(mi);
+}
+
+ENTRYPOINT void
+draw_demon (ModeInfo * mi)
+{
+ int i, j, k, l, mj = 0, ml;
+ demonstruct *dp;
+
+ if (demons == NULL)
+ return;
+ dp = &demons[MI_SCREEN(mi)];
+ if (dp->cellList == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ if (dp->state >= dp->states) {
+ (void) memcpy((char *) dp->newcell, (char *) dp->oldcell,
+ dp->ncols * dp->nrows * sizeof (unsigned char));
+
+ if (dp->neighbors == 6) {
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* NE */
+ if (!(j & 1))
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ else
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* E */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SE */
+ if (!(j & 1))
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ else
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SW */
+ if (j & 1)
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ else
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* W */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NW */
+ if (j & 1)
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ else
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* N */
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* E */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* S */
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* W */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ /*l = j;*/
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ if (dp->neighbors == 8) {
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* NE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ }
+ } else if (dp->neighbors == 3 || dp->neighbors == 9 ||
+ dp->neighbors == 12) {
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ if ((i + j) % 2) { /* right */
+ /* W */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ } else { /* left */
+ /* E */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ /* N */
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* S */
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ if (dp->neighbors == 9 || dp->neighbors == 12) {
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* NN */
+ k = i;
+ if (!j)
+ l = dp->nrows - 2;
+ else if (!(j - 1))
+ l = dp->nrows - 1;
+ else
+ l = j - 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SS */
+ k = i;
+ if (j + 1 == dp->nrows)
+ l = 1;
+ else if (j + 2 == dp->nrows)
+ l = 0;
+ else
+ l = j + 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ if (dp->neighbors == 12) {
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ if ((i + j) % 2) { /* right */
+ /* NNW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ if (!j)
+ l = dp->nrows - 2;
+ else if (!(j - 1))
+ l = dp->nrows - 1;
+ else
+ l = j - 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SSW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ if (j + 1 == dp->nrows)
+ l = 1;
+ else if (j + 2 == dp->nrows)
+ l = 0;
+ else
+ l = j + 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* EE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ /*l = j;*/
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ } else { /* left */
+ /* NNE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ if (!j)
+ l = dp->nrows - 2;
+ else if (!(j - 1))
+ l = dp->nrows - 1;
+ else
+ l = j - 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SSE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ if (j + 1 == dp->nrows)
+ l = 1;
+ else if (j + 2 == dp->nrows)
+ l = 0;
+ else
+ l = j + 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* WW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ /*l = j;*/
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ }
+ mj += dp->ncols;
+ }
+ }
+ }
+ }
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++)
+ if (dp->oldcell[i + mj] != dp->newcell[i + mj]) {
+ dp->oldcell[i + mj] = dp->newcell[i + mj];
+ if (!addtolist(mi, i, j, dp->oldcell[i + mj])) {
+ free_demon(mi);
+ return;
+ }
+ }
+ mj += dp->ncols;
+ }
+ if (++dp->generation > MI_CYCLES(mi))
+ init_demon(mi);
+ dp->state = 0;
+ } else {
+ if (dp->ncells[dp->state])
+ if (!draw_state(mi, dp->state)) {
+ free_demon(mi);
+ return;
+ }
+ dp->state++;
+ }
+ if (dp->redrawing) {
+ for (i = 0; i < REDRAWSTEP; i++) {
+ if (dp->oldcell[dp->redrawpos]) {
+ drawcell(mi, dp->redrawpos % dp->ncols, dp->redrawpos / dp->ncols,
+ dp->oldcell[dp->redrawpos]);
+ }
+ if (++(dp->redrawpos) >= dp->ncols * dp->nrows) {
+ dp->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_demon (ModeInfo * mi)
+{
+ demonstruct *dp;
+
+ if (demons == NULL)
+ return;
+ dp = &demons[MI_SCREEN(mi)];
+
+ dp->redrawing = 1;
+ dp->redrawpos = 0;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Demon", demon)
+
+#endif /* MODE_demon */
diff --git a/hacks/demon.man b/hacks/demon.man
new file mode 100644
index 0000000..43481bc
--- /dev/null
+++ b/hacks/demon.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+demon - cellular automaton.
+.SH SYNOPSIS
+.B demon
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+A cellular automaton that starts with a random field, and organizes it into
+stripes and spirals.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+States. 0 - 20. Default: 0.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout. 0 - 800000. Default: 1000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 50000 (0.05 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-size \fInumber\fP
+Cell Size. -20 - 20. Default: -7.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by David Bagley. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David Bagley.
diff --git a/hacks/discrete.c b/hacks/discrete.c
new file mode 100644
index 0000000..bfb4459
--- /dev/null
+++ b/hacks/discrete.c
@@ -0,0 +1,440 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* discrete --- chaotic mappings */
+
+#if 0
+static const char sccsid[] = "@(#)discrete.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "discrete" shows a number of fractals based on the "discrete map"
+ * type of dynamical systems. They include a different way of looking
+ * at the HOPALONG system, an inverse julia-set iteration, the "Standard
+ * Map" and the "Bird in a Thornbush" fractal.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 31-Jul-1997: Ported to xlockmore-4
+ * 08-Aug-1996: Adapted from hop.c Copyright (c) 1991 by Patrick J. Naughton.
+ */
+
+#ifdef STANDALONE
+# define MODE_discrete
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 4096 \n" \
+ "*cycles: 2500 \n" \
+ "*ncolors: 100 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ "*lowrez: True \n" \
+
+# define SMOOTH_COLORS
+# define release_discrete 0
+# define discrete_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_discrete
+
+ENTRYPOINT ModeSpecOpt discrete_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct discrete_description =
+{"discrete", "init_discrete", "draw_discrete", (char *) NULL,
+ "refresh_discrete", "init_discrete", "free_discrete", &discrete_opts,
+ 1000, 4096, 2500, 1, 64, 1.0, "",
+ "Shows various discrete maps", 0, NULL};
+
+#endif
+
+enum ftypes {
+ SQRT, BIRDIE, STANDARD, TRIG, CUBIC, HENON, AILUJ, HSHOE, DELOG
+};
+
+/*#define TEST STANDARD */
+
+#define BIASES 18
+static enum ftypes bias[BIASES] =
+{
+ STANDARD, STANDARD, STANDARD, STANDARD,
+ SQRT, SQRT, SQRT, SQRT,
+ BIRDIE, BIRDIE, BIRDIE,
+ AILUJ, AILUJ, AILUJ,
+ TRIG, TRIG,
+ CUBIC,
+ HENON,
+};
+
+typedef struct {
+ int maxx;
+ int maxy; /* max of the screen */
+ double a;
+ double b;
+ double c;
+ double d;
+ double e;
+ double i;
+ double j; /* discrete parameters */
+ double ic;
+ double jc;
+ double is;
+ double js;
+ int inc;
+ int pix;
+ enum ftypes op;
+ int count;
+ XPoint *pointBuffer; /* pointer for XDrawPoints */
+
+ int sqrt_sign, std_sign;
+
+} discretestruct;
+
+static discretestruct *discretes = (discretestruct *) NULL;
+
+ENTRYPOINT void
+init_discrete (ModeInfo * mi)
+{
+ double range;
+ discretestruct *hp;
+
+ MI_INIT (mi, discretes);
+ hp = &discretes[MI_SCREEN(mi)];
+
+ hp->maxx = MI_WIDTH(mi);
+ hp->maxy = MI_HEIGHT(mi);
+#ifdef TEST
+ hp->op = TEST;
+#else
+ hp->op = bias[LRAND() % BIASES];
+#endif
+ switch (hp->op) {
+ case HSHOE:
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / (4);
+ hp->js = hp->maxy / (4);
+ hp->a = 0.5;
+ hp->b = 0.5;
+ hp->c = 0.2;
+ hp->d = -1.25;
+ hp->e = 1;
+ hp->i = hp->j = 0.0;
+ break;
+ case DELOG:
+ hp->ic = 0.5;
+ hp->jc = 0.3;
+ hp->is = hp->maxx / 1.5;
+ hp->js = hp->maxy / 1.5;
+ hp->a = 2.176399;
+ hp->i = hp->j = 0.01;
+ break;
+ case HENON:
+ hp->jc = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.4;
+ hp->ic = 1.3 * (1 - (hp->jc * hp->jc) / (0.4 * 0.4));
+ hp->is = hp->maxx;
+ hp->js = hp->maxy * 1.5;
+ hp->a = 1;
+ hp->b = 1.4;
+ hp->c = 0.3;
+ hp->i = hp->j = 0;
+ break;
+ case SQRT:
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = 1;
+ hp->js = 1;
+ range = sqrt((double) hp->maxx * 2 * hp->maxx * 2 +
+ (double) hp->maxy * 2 * hp->maxy * 2) /
+ (10.0 + LRAND() % 10);
+
+ hp->a = (LRAND() / MAXRAND) * range - range / 2.0;
+ hp->b = (LRAND() / MAXRAND) * range - range / 2.0;
+ hp->c = (LRAND() / MAXRAND) * range - range / 2.0;
+ if (!(LRAND() % 2))
+ hp->c = 0.0;
+ hp->i = hp->j = 0.0;
+ break;
+ case STANDARD:
+ hp->ic = M_PI;
+ hp->jc = M_PI;
+ hp->is = hp->maxx / (M_PI * 2);
+ hp->js = hp->maxy / (M_PI * 2);
+ hp->a = 0; /* decay */
+ hp->b = (LRAND() / MAXRAND) * 2.0;
+ hp->c = 0;
+ hp->i = M_PI;
+ hp->j = M_PI;
+ break;
+ case BIRDIE:
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / 2;
+ hp->js = hp->maxy / 2;
+ hp->a = 1.99 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.2;
+ hp->b = 0;
+ hp->c = 0.8 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
+ hp->i = hp->j = 0;
+ break;
+ case TRIG:
+ hp->a = 5;
+ hp->b = 0.5 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.3;
+ hp->ic = hp->a;
+ hp->jc = 0;
+ hp->is = hp->maxx / (hp->b * 20);
+ hp->js = hp->maxy / (hp->b * 20);
+ hp->i = hp->j = 0;
+ break;
+ case CUBIC:
+ hp->a = 2.77;
+ hp->b = 0.1 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / 4;
+ hp->js = hp->maxy / 4;
+ hp->i = hp->j = 0.1;
+ break;
+ case AILUJ:
+ {
+ int i;
+ double x, y, xn, yn;
+
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / 4;
+ hp->js = hp->maxx / 4;
+ do {
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5 - 0.5;
+ hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5;
+ x = y = 0;
+#define MAXITER 10
+ for (i = 0; i < MAXITER && x * x + y * y < 13; i++) { /* 'Brot calc */
+ xn = x * x - y * y + hp->a;
+ yn = 2 * x * y + hp->b;
+ x = xn;
+ y = yn;
+ }
+ } while (i < MAXITER); /* wait for a connected set */
+ hp->i = hp->j = 0.1;
+ break;
+ }
+ }
+ hp->pix = 0;
+ hp->inc = 0;
+
+ if (hp->pointBuffer == NULL) {
+ hp->pointBuffer = (XPoint *) malloc(sizeof (XPoint) * MI_COUNT(mi));
+ /* if fails will check later */
+ }
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ hp->count = 0;
+ hp->sqrt_sign = 1;
+ hp->std_sign = 1;
+}
+
+
+static void
+draw_discrete_1 (ModeInfo * mi)
+{
+ Display *dsp = MI_DISPLAY(mi);
+ Window win = MI_WINDOW(mi);
+ double oldj, oldi;
+ int count = MI_COUNT(mi);
+ int cycles = MI_CYCLES(mi);
+ int k;
+ XPoint *xp;
+ GC gc = MI_GC(mi);
+ discretestruct *hp;
+
+ if (discretes == NULL)
+ return;
+ hp = &discretes[MI_SCREEN(mi)];
+ if (hp->pointBuffer == NULL)
+ return;
+
+ k = count;
+ xp = hp->pointBuffer;
+
+ hp->inc++;
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
+ if (++hp->pix >= MI_NPIXELS(mi))
+ hp->pix = 0;
+ }
+ while (k--) {
+ oldj = hp->j;
+ oldi = hp->i;
+ switch (hp->op) {
+ case HSHOE:
+ {
+ int i;
+
+#if 0
+ if (!k) {
+ XSetForeground(dsp, gc, MI_BLACK_PIXEL(mi));
+ XFillRectangle(dsp, win, gc, 0, 0, hp->maxx, hp->maxy);
+ XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
+ } else
+#endif
+#define HD
+#ifdef HD
+ if (k < count / 4) {
+ hp->i = ((double) k / count) * 8 - 1;
+ hp->j = 1;
+ } else if (k < count / 2) {
+ hp->i = 1;
+ hp->j = 3 - ((double) k / count) * 8;
+ } else if (k < 3 * count / 4) {
+ hp->i = 5 - ((double) k / count) * 8;
+ hp->j = -1;
+ } else {
+ hp->i = -1;
+ hp->j = ((double) k / count) * 8 - 7;
+ }
+ for (i = 1; i < (hp->inc % 15); i++) {
+ oldj = hp->j;
+ oldi = hp->i;
+#endif
+ hp->i = (hp->a * oldi + hp->b) * oldj;
+ hp->j = (hp->e - hp->d + hp->c * oldi) * oldj * oldj - hp->c * oldi + hp->d;
+#ifdef HD
+ }
+#endif
+ break;
+ }
+ case DELOG:
+ hp->j = oldi;
+ hp->i = hp->a * oldi * (1 - oldj);
+ break;
+ case HENON:
+ hp->i = oldj + hp->a - hp->b * oldi * oldi;
+ hp->j = hp->c * oldi;
+ break;
+ case SQRT:
+ if (k) {
+ hp->j = hp->a + hp->i;
+ hp->i = -oldj + (hp->i < 0
+ ? sqrt(fabs(hp->b * (hp->i - hp->c)))
+ : -sqrt(fabs(hp->b * (hp->i - hp->c))));
+ } else {
+ hp->i = (hp->sqrt_sign ? 1 : -1) * hp->inc * hp->maxx / cycles / 2;
+ hp->j = hp->a + hp->i;
+ hp->sqrt_sign = !hp->sqrt_sign;
+ }
+ break;
+ case STANDARD:
+ if (k) {
+ hp->j = (1 - hp->a) * oldj + hp->b * sin(oldi) + hp->a * hp->c;
+ hp->j = fmod(hp->j + 2 * M_PI, 2 * M_PI);
+ hp->i = oldi + hp->j;
+ hp->i = fmod(hp->i + 2 * M_PI, 2 * M_PI);
+ } else {
+ hp->j = M_PI + fmod((hp->std_sign ? 1 : -1) * hp->inc * 2 * M_PI / (cycles - 0.5), M_PI);
+ hp->i = M_PI;
+ hp->std_sign = !hp->std_sign;
+ }
+ break;
+ case BIRDIE:
+ hp->j = oldi;
+ hp->i = (1 - hp->c) * cos(M_PI * hp->a * oldj) + hp->c * hp->b;
+ hp->b = oldj;
+ break;
+ case TRIG:
+ {
+ double r2 = oldi * oldi + oldj * oldj;
+
+ hp->i = hp->a + hp->b * (oldi * cos(r2) - oldj * sin(r2));
+ hp->j = hp->b * (oldj * cos(r2) + oldi * sin(r2));
+ }
+ break;
+ case CUBIC:
+ hp->i = oldj;
+ hp->j = hp->a * oldj - oldj * oldj * oldj - hp->b * oldi;
+ break;
+ case AILUJ:
+ hp->i = ((LRAND() < MAXRAND / 2) ? -1 : 1) *
+ sqrt(((oldi - hp->a) +
+ sqrt((oldi - hp->a) * (oldi - hp->a) + (oldj - hp->b) * (oldj - hp->b))) / 2);
+ if (hp->i < 0.00000001 && hp->i > -0.00000001)
+ hp->i = (hp->i > 0.0) ? 0.00000001 : -0.00000001;
+ hp->j = (oldj - hp->b) / (2 * hp->i);
+ break;
+ }
+ xp->x = hp->maxx / 2 + (int) ((hp->i - hp->ic) * hp->is);
+ xp->y = hp->maxy / 2 - (int) ((hp->j - hp->jc) * hp->js);
+ xp++;
+ }
+ XDrawPoints(dsp, win, gc, hp->pointBuffer, count, CoordModeOrigin);
+}
+
+ENTRYPOINT void
+draw_discrete (ModeInfo * mi)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+ int cycles = MI_CYCLES(mi);
+ int i;
+
+ for (i = 0; i < 10; i++) {
+ draw_discrete_1 (mi);
+ hp->count++;
+ }
+
+ if (hp->count > cycles) {
+ init_discrete(mi);
+ }
+}
+
+
+ENTRYPOINT void
+reshape_discrete(ModeInfo * mi, int width, int height)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+ hp->maxx = width;
+ hp->maxy = height;
+ XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+free_discrete(ModeInfo * mi)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+
+ if (hp->pointBuffer != NULL) {
+ (void) free((void *) hp->pointBuffer);
+ /* hp->pointBuffer = NULL; */
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_discrete(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Discrete", discrete)
+
+#endif /* MODE_discrete */
diff --git a/hacks/discrete.man b/hacks/discrete.man
new file mode 100644
index 0000000..63e1787
--- /dev/null
+++ b/hacks/discrete.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+discrete - discrete map iterative function fractal systems.
+.SH SYNOPSIS
+.B discrete
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+More ``discrete map'' systems, including new variants of Hopalong and
+Julia, and a few others.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout. 100 - 10000. Default: 2500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 100.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tim Auckland. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tim Auckland.
diff --git a/hacks/distort.c b/hacks/distort.c
new file mode 100644
index 0000000..ba81279
--- /dev/null
+++ b/hacks/distort.c
@@ -0,0 +1,864 @@
+/* -*- mode: C; tab-width: 4 -*-
+ * xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* distort
+ * by Jonas Munsin (jmunsin@iki.fi) and Jamie Zawinski <jwz@jwz.org>
+ * TODO:
+ * -check the allocations in init_round_lense again, maybe make it possible again
+ * to use swamp without pre-allocating/calculating (although that
+ * makes it slower) - -swamp is memory hungry
+ * -more distortion matrices (fortunately, I'm out of ideas :)
+ * Stuff that would be cool but probably too much of a resource hog:
+ * -some kind of interpolation to avoid jaggies
+ * -large speed values leaves the image distorted
+ * program idea borrowed from a screensaver on a non-*NIX OS,
+ *
+ * 28 Sep 1999 Jonas Munsin (jmunsin@iki.fi)
+ * Added about 10x faster algortim for 8, 16 and 32 bpp (modifies pixels
+ * directly avoiding costly XPutPixle(XGetPixel()) calls, inspired by
+ * xwhirl made by horvai@clipper.ens.fr (Peter Horvai) and the XFree86
+ * Xlib sources.
+ * This piece of code is really horrible, but it works, and at the moment
+ * I don't have time or inspiration to fix something that works (knock
+ * on wood).
+ * 08 Oct 1999 Jonas Munsin (jmunsin@iki.fi)
+ * Corrected several bugs causing references beyond allocated memory.
+ * 09 Oct 2016 Dave Odell (dmo2118@gmail.com)
+ * Updated for new xshm.c.
+ */
+
+#include <math.h>
+#include <time.h>
+#include "screenhack.h"
+/*#include <X11/Xmd.h>*/
+# include "xshm.h"
+
+#define CARD32 unsigned int
+#define CARD16 unsigned short
+#define CARD8 unsigned char
+
+
+struct coo {
+ int x;
+ int y;
+ int r, r_change;
+ int xmove, ymove;
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ struct coo xy_coo[10];
+
+ int delay, radius, speed, number, blackhole, vortex, magnify, reflect, slow;
+ int duration;
+ time_t start_time;
+
+ XWindowAttributes xgwa;
+ GC gc;
+ unsigned long black_pixel;
+
+ XImage *orig_map, *buffer_map;
+ unsigned long *buffer_map_cache;
+
+ int ***from;
+ int ****from_array;
+ int *fast_from;
+
+ int bpp_size;
+
+ XShmSegmentInfo shm_info;
+
+ void (*effect) (struct state *, int);
+ void (*draw) (struct state *, int);
+ void (*draw_routine) (struct state *st, XImage *, XImage *, int, int, int *);
+
+ async_load_state *img_loader;
+ Pixmap pm;
+};
+
+
+static void move_lense(struct state *, int);
+static void swamp_thing(struct state *, int);
+static void new_rnd_coo(struct state *, int);
+static void init_round_lense(struct state *st);
+static void reflect_draw(struct state *, int);
+static void plain_draw(struct state *, int);
+
+static void fast_draw_8 (struct state *st, XImage *, XImage *, int, int, int *);
+static void fast_draw_16(struct state *st, XImage *, XImage *, int, int, int *);
+static void fast_draw_32(struct state *st, XImage *, XImage *, int, int, int *);
+static void generic_draw(struct state *st, XImage *, XImage *, int, int, int *);
+
+
+static void distort_finish_loading (struct state *);
+
+static void
+distort_reset (struct state *st)
+{
+ char *s;
+ int i;
+
+ st->start_time = 0;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ st->radius = get_integer_resource(st->dpy, "radius", "Integer");
+ st->speed = get_integer_resource(st->dpy, "speed", "Integer");
+ st->number = get_integer_resource(st->dpy, "number", "Integer");
+
+ st->blackhole = get_boolean_resource(st->dpy, "blackhole", "Boolean");
+ st->vortex = get_boolean_resource(st->dpy, "vortex", "Boolean");
+ st->magnify = get_boolean_resource(st->dpy, "magnify", "Boolean");
+ st->reflect = get_boolean_resource(st->dpy, "reflect", "Boolean");
+ st->slow = get_boolean_resource(st->dpy, "slow", "Boolean");
+
+ if (st->xgwa.width > 2560) st->radius *= 3; /* Retina displays */
+
+ if (st->delay < 0) st->delay = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ st->effect = NULL;
+ s = get_string_resource(st->dpy, "effect", "String");
+ if (s && !strcasecmp(s,"swamp"))
+ st->effect = &swamp_thing;
+ else if (s && !strcasecmp(s,"bounce"))
+ st->effect = &move_lense;
+ else if (s && !strcasecmp(s,"none"))
+ ;
+ else if (s && *s)
+ fprintf(stderr,"%s: bogus effect: %s\n", progname, s);
+
+ if (st->effect == NULL && st->radius == 0 && st->speed == 0 && st->number == 0
+ && !st->blackhole && !st->vortex && !st->magnify && !st->reflect) {
+/* if no cmdline options are given, randomly choose one of:
+ * -radius 125 -number 4 -speed 1 -bounce
+ * -radius 125 -number 4 -speed 1 -blackhole
+ * -radius 125 -number 4 -speed 1 -vortex
+ * -radius 125 -number 4 -speed 1 -vortex -magnify
+ * -radius 125 -number 4 -speed 1 -vortex -magnify -blackhole
+ * -radius 250 -number 1 -speed 2 -bounce
+ * -radius 250 -number 1 -speed 2 -blackhole
+ * -radius 250 -number 1 -speed 2 -vortex
+ * -radius 250 -number 1 -speed 2 -vortex -magnify
+ * -radius 250 -number 1 -speed 2 -vortex -magnify -blackhole
+ * -radius 80 -number 1 -speed 2 -reflect
+ * -radius 125 -number 3 -speed 2 -reflect
+ * jwz: not these
+ * -radius 125 -number 4 -speed 2 -swamp
+ * -radius 125 -number 4 -speed 2 -swamp -blackhole
+ * -radius 125 -number 4 -speed 2 -swamp -vortex
+ * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify
+ * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify -blackhole
+ */
+
+ i = (random() % 12 /* 17 */);
+
+ st->draw = &plain_draw;
+
+ switch (i) {
+ case 0:
+ st->radius=125;st->number=4;st->speed=1;
+ st->effect=&move_lense;break;
+ case 1:
+ st->radius=125;st->number=4;st->speed=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 2:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;
+ st->effect=&move_lense;break;
+ case 3:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;
+ st->effect=&move_lense;break;
+ case 4:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 5:
+ st->radius=250;st->number=1;st->speed=2;
+ st->effect=&move_lense;break;
+ case 6:
+ st->radius=250;st->number=1;st->speed=2;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 7:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;
+ st->effect=&move_lense;break;
+ case 8:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;
+ st->effect=&move_lense;break;
+ case 9:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+
+ case 10:
+ st->radius=80;st->number=1;st->speed=2;st->reflect=1;
+ st->draw = &reflect_draw;st->effect = &move_lense;break;
+ case 11:
+ st->radius=125;st->number=4;st->speed=2;st->reflect=1;
+ st->draw = &reflect_draw;st->effect = &move_lense;break;
+
+#if 0 /* jwz: not these */
+ case 12:
+ st->radius=125;st->number=4;st->speed=2;
+ effect=&swamp_thing;break;
+ case 13:
+ st->radius=125;st->number=4;st->speed=2;st->blackhole=1;
+ effect=&swamp_thing;break;
+ case 14:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;
+ effect=&swamp_thing;break;
+ case 15:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;
+ effect=&swamp_thing;break;
+ case 16:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
+ effect=&swamp_thing;break;
+#endif
+
+ default:
+ abort(); break;
+ }
+ }
+
+ /* never allow the radius to be too close to the min window dimension
+ */
+ if (st->radius > st->xgwa.width * 0.3) st->radius = st->xgwa.width * 0.3;
+ if (st->radius > st->xgwa.height * 0.3) st->radius = st->xgwa.height * 0.3;
+
+
+ /* -swamp mode consumes vast amounts of memory, proportional to radius --
+ so throttle radius to a small-ish value (60 => ~30MB.)
+ */
+ if (st->effect == &swamp_thing && st->radius > 60)
+ st->radius = 60;
+
+ if (st->delay < 0)
+ st->delay = 0;
+ if (st->radius <= 0)
+ st->radius = 60;
+ if (st->speed <= 0)
+ st->speed = 2;
+ if (st->number <= 0)
+ st->number=1;
+ if (st->number >= 10)
+ st->number=1;
+ if (st->effect == NULL)
+ st->effect = &move_lense;
+ if (st->reflect) {
+ st->draw = &reflect_draw;
+ st->effect = &move_lense;
+ }
+ if (st->draw == NULL)
+ st->draw = &plain_draw;
+}
+
+static void *
+distort_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ long gcflags;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ distort_reset (st);
+
+ st->black_pixel = BlackPixelOfScreen( st->xgwa.screen );
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ gcflags = GCFunction;
+ if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+ st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
+
+ /* On MacOS X11, XGetImage on a Window often gets an inexplicable BadMatch,
+ possibly due to the window manager having occluded something? It seems
+ nondeterministic. Loading the image into a pixmap instead fixes it. */
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ st->pm = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->pm, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ return st;
+}
+
+static void
+distort_finish_loading (struct state *st)
+{
+ int i;
+
+ st->start_time = time ((time_t *) 0);
+
+ if (! st->pm) abort();
+ XClearWindow (st->dpy, st->window);
+ XCopyArea (st->dpy, st->pm, st->window, st->gc,
+ 0, 0, st->xgwa.width, st->xgwa.height, 0, 0);
+ st->orig_map = XGetImage(st->dpy, st->pm, 0, 0,
+ st->xgwa.width, st->xgwa.height,
+ ~0L, ZPixmap);
+ st->buffer_map_cache = malloc(sizeof(unsigned long)*(2*st->radius+st->speed+2)*(2*st->radius+st->speed+2));
+
+ if (st->buffer_map_cache == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+
+ st->buffer_map = create_xshm_image(st->dpy, st->xgwa.visual, st->orig_map->depth,
+ ZPixmap, &st->shm_info,
+ 2*st->radius + st->speed + 2,
+ 2*st->radius + st->speed + 2);
+
+ if ((st->buffer_map->byte_order == st->orig_map->byte_order)
+ && (st->buffer_map->depth == st->orig_map->depth)
+ && (st->buffer_map->format == ZPixmap)
+ && (st->orig_map->format == ZPixmap)
+ && !st->slow) {
+ switch (st->orig_map->bits_per_pixel) {
+ case 32:
+ st->draw_routine = &fast_draw_32;
+ st->bpp_size = sizeof(CARD32);
+ break;
+ case 16:
+ st->draw_routine = &fast_draw_16;
+ st->bpp_size = sizeof(CARD16);
+ break;
+ case 8:
+ st->draw_routine = &fast_draw_8;
+ st->bpp_size = sizeof(CARD8);
+ break;
+ default:
+ st->draw_routine = &generic_draw;
+ break;
+ }
+ } else {
+ st->draw_routine = &generic_draw;
+ }
+ init_round_lense(st);
+
+ for (i = 0; i < st->number; i++) {
+ new_rnd_coo(st,i);
+ if (st->number != 1)
+ st->xy_coo[i].r = (i*st->radius)/(st->number-1); /* "randomize" initial */
+ else
+ st->xy_coo[i].r = 0;
+ st->xy_coo[i].r_change = st->speed + (i%2)*2*(-st->speed); /* values a bit */
+ st->xy_coo[i].xmove = st->speed + (i%2)*2*(-st->speed);
+ st->xy_coo[i].ymove = st->speed + (i%2)*2*(-st->speed);
+ }
+}
+
+/* example: initializes a "see-trough" matrix */
+/* static void make_null_lense(struct state *st)
+{
+ int i, j;
+ for (i = 0; i < 2*radius+speed+2; i++) {
+ for (j = 0 ; j < 2*radius+speed+2 ; j++) {
+ from[i][j][0]=i;
+ from[i][j][1]=j;
+ }
+ }
+}
+*/
+static void convert(struct state *st)
+{
+ int *p;
+ int i, j;
+ st->fast_from = calloc(1, sizeof(int)*((st->buffer_map->bytes_per_line/st->bpp_size)*(2*st->radius+st->speed+2) + 2*st->radius+st->speed+2));
+ if (st->fast_from == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ p = st->fast_from;
+ for (i = 0; i < 2*st->radius+st->speed+2; i++) {
+ for (j = 0; j < 2*st->radius+st->speed+2; j++) {
+ *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size)
+ = st->from[i][j][0] + st->xgwa.width*st->from[i][j][1];
+ if (*(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) < 0
+ || *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) >= st->orig_map->height*st->orig_map->width) {
+ *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) = 0;
+ }
+ }
+ }
+}
+
+/* makes a lense with the Radius=loop and centred in
+ * the point (radius, radius)
+ */
+static void make_round_lense(struct state *st, int radius, int loop)
+{
+ int i, j;
+
+ for (i = 0; i < 2*radius+st->speed+2; i++) {
+ for(j = 0; j < ((0 == st->bpp_size) ? (2*radius+st->speed+2) : (st->buffer_map->bytes_per_line/st->bpp_size)); j++) {
+ double r, d;
+ r = sqrt ((i-radius)*(i-radius)+(j-radius)*(j-radius));
+ if (loop == 0)
+ d=0.0;
+ else
+ d=r/loop;
+
+ if (r < loop-1) {
+
+ if (st->vortex) { /* vortex-twist effect */
+ double angle;
+ /* this one-line formula for getting a nice rotation angle is borrowed
+ * (with permission) from the whirl plugin for gimp,
+ * Copyright (C) 1996 Federico Mena Quintero
+ */
+ /* 5 is just a constant used because it looks good :) */
+ angle = 5*(1-d)*(1-d);
+
+ /* Avoid atan2: DOMAIN error message */
+ if ((radius-j) == 0.0 && (radius-i) == 0.0) {
+ st->from[i][j][0] = radius + cos(angle)*r;
+ st->from[i][j][1] = radius + sin(angle)*r;
+ } else {
+ st->from[i][j][0] = radius +
+ cos(angle - atan2(radius-j, -(radius-i)))*r;
+ st->from[i][j][1] = radius +
+ sin(angle - atan2(radius-j, -(radius-i)))*r;
+ }
+ if (st->magnify) {
+ r = sin(d*M_PI_2);
+ if (st->blackhole && r != 0) /* blackhole effect */
+ r = 1/r;
+ st->from[i][j][0] = radius + (st->from[i][j][0]-radius)*r;
+ st->from[i][j][1] = radius + (st->from[i][j][1]-radius)*r;
+ }
+ } else { /* default is to magnify */
+ r = sin(d*M_PI_2);
+
+ /* raising r to different power here gives different amounts of
+ * distortion, a negative value sucks everything into a black hole
+ */
+ /* r = r*r; */
+ if (st->blackhole && r != 0) /* blackhole effect */
+ r = 1/r;
+ /* bubble effect (and blackhole) */
+ st->from[i][j][0] = radius + (i-radius)*r;
+ st->from[i][j][1] = radius + (j-radius)*r;
+ }
+ } else { /* not inside loop */
+ st->from[i][j][0] = i;
+ st->from[i][j][1] = j;
+ }
+ }
+ }
+
+ /* this is really just a quick hack to keep both the compability mode with all depths and still
+ * allow the custom optimized draw routines with the minimum amount of work */
+ if (0 != st->bpp_size) {
+ convert(st);
+ }
+}
+
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE -1
+#endif
+
+static void allocate_lense(struct state *st)
+{
+ int i, j;
+ int s = ((0 != st->bpp_size) ? (st->buffer_map->bytes_per_line/st->bpp_size) : (2*st->radius+st->speed+2));
+ /* maybe this should be redone so that from[][][] is in one block;
+ * then pointers could be used instead of arrays in some places (and
+ * maybe give a speedup - maybe also consume less memory)
+ */
+ st->from = (int ***)malloc(s*sizeof(int **));
+ if (st->from == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ for (i = 0; i < s; i++) {
+ st->from[i] = (int **)malloc((2*st->radius+st->speed+2) * sizeof(int *));
+ if (st->from[i] == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ for (j = 0; j < s; j++) {
+ st->from[i][j] = (int *)malloc(2 * sizeof(int));
+ if (st->from[i][j] == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ }
+ }
+}
+
+/* from_array in an array containing precalculated from matrices,
+ * this is a double faced mem vs speed trade, it's faster, but eats
+ * _a lot_ of mem for large radius (is there a bug here? I can't see it)
+ */
+static void init_round_lense(struct state *st)
+{
+ int k;
+
+ if (st->effect == &swamp_thing) {
+ st->from_array = (int ****)malloc((st->radius+1)*sizeof(int ***));
+ for (k=0; k <= st->radius; k++) {
+ allocate_lense(st);
+ make_round_lense(st, st->radius, k);
+ st->from_array[k] = st->from;
+ }
+ } else { /* just allocate one from[][][] */
+ allocate_lense(st);
+ make_round_lense(st, st->radius,st->radius);
+ }
+}
+
+/* If fast_draw_8, fast_draw_16 or fast_draw_32 are to be used, the following properties
+ * of the src and dest XImages must hold (otherwise the generic, slooow, method provided
+ * by X is to be used):
+ * src->byte_order == dest->byte_order
+ * src->format == ZPixmap && dest->format == ZPixmap
+ * src->depth == dest->depth == the depth the function in question asumes
+ * x and y is the coordinates in src from where to cut out the image from,
+ * distort_matrix is a precalculated array of how to distort the matrix
+ */
+
+static void fast_draw_8(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ CARD8 *u = (CARD8 *)dest->data;
+ CARD8 *t = (CARD8 *)src->data + x + y*src->bytes_per_line/sizeof(CARD8);
+
+ while (u < (CARD8 *)(dest->data + sizeof(CARD8)*dest->height
+ *dest->bytes_per_line/sizeof(CARD8))) {
+ *u++ = t[*distort_matrix++];
+ }
+}
+
+static void fast_draw_16(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ CARD16 *u = (CARD16 *)dest->data;
+ CARD16 *t = (CARD16 *)src->data + x + y*src->bytes_per_line/sizeof(CARD16);
+
+ while (u < (CARD16 *)(dest->data + sizeof(CARD16)*dest->height
+ *dest->bytes_per_line/sizeof(CARD16))) {
+ *u++ = t[*distort_matrix++];
+ }
+}
+
+static void fast_draw_32(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ CARD32 *u = (CARD32 *)dest->data;
+ CARD32 *t = (CARD32 *)src->data + x + y*src->bytes_per_line/sizeof(CARD32);
+
+ while (u < (CARD32 *)(dest->data + sizeof(CARD32)*dest->height
+ *dest->bytes_per_line/sizeof(CARD32))) {
+ *u++ = t[*distort_matrix++];
+ }
+}
+
+static void generic_draw(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ int i, j;
+ for (i = 0; i < dest->width; i++)
+ for (j = 0; j < dest->height; j++)
+ if (st->from[i][j][0] + x >= 0 &&
+ st->from[i][j][0] + x < src->width &&
+ st->from[i][j][1] + y >= 0 &&
+ st->from[i][j][1] + y < src->height)
+ XPutPixel(dest, i, j,
+ XGetPixel(src,
+ st->from[i][j][0] + x,
+ st->from[i][j][1] + y));
+}
+
+/* generate an XImage of from[][][] and draw it on the screen */
+static void plain_draw(struct state *st, int k)
+{
+ if (st->xy_coo[k].x+2*st->radius+st->speed+2 > st->orig_map->width ||
+ st->xy_coo[k].y+2*st->radius+st->speed+2 > st->orig_map->height)
+ return;
+
+ st->draw_routine(st, st->orig_map, st->buffer_map, st->xy_coo[k].x, st->xy_coo[k].y, st->fast_from);
+
+ put_xshm_image(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, st->xy_coo[k].x, st->xy_coo[k].y,
+ 2*st->radius+st->speed+2, 2*st->radius+st->speed+2, &st->shm_info);
+}
+
+
+/* generate an XImage from the reflect algoritm submitted by
+ * Randy Zack <randy@acucorp.com>
+ * draw really got too big and ugly so I split it up
+ * it should be possible to use the from[][] to speed it up
+ * (once I figure out the algorithm used :)
+ */
+static void reflect_draw(struct state *st, int k)
+{
+ int i, j;
+ int cx, cy;
+ int ly, lysq, lx, ny, dist, rsq = st->radius * st->radius;
+
+ cx = cy = st->radius;
+ if (st->xy_coo[k].ymove > 0)
+ cy += st->speed;
+ if (st->xy_coo[k].xmove > 0)
+ cx += st->speed;
+
+ for(i = 0 ; i < 2*st->radius+st->speed+2; i++) {
+ ly = i - cy;
+ lysq = ly * ly;
+ ny = st->xy_coo[k].y + i;
+ if (ny >= st->orig_map->height) ny = st->orig_map->height-1;
+ for(j = 0 ; j < 2*st->radius+st->speed+2 ; j++) {
+ lx = j - cx;
+ dist = lx * lx + lysq;
+ if (dist > rsq ||
+ ly < -st->radius || ly > st->radius ||
+ lx < -st->radius || lx > st->radius)
+ XPutPixel( st->buffer_map, j, i,
+ XGetPixel( st->orig_map, st->xy_coo[k].x + j, ny ));
+ else if (dist == 0)
+ XPutPixel( st->buffer_map, j, i, st->black_pixel );
+ else {
+ int x = st->xy_coo[k].x + cx + (lx * rsq / dist);
+ int y = st->xy_coo[k].y + cy + (ly * rsq / dist);
+ if (x < 0 || x >= st->xgwa.width ||
+ y < 0 || y >= st->xgwa.height)
+ XPutPixel( st->buffer_map, j, i, st->black_pixel );
+ else
+ XPutPixel( st->buffer_map, j, i,
+ XGetPixel( st->orig_map, x, y ));
+ }
+ }
+ }
+
+ XPutImage(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, st->xy_coo[k].x, st->xy_coo[k].y,
+ 2*st->radius+st->speed+2, 2*st->radius+st->speed+2);
+}
+
+/* create a new, random coordinate, that won't interfer with any other
+ * coordinates, as the drawing routines would be significantly slowed
+ * down if they were to handle serveral layers of distortions
+ */
+static void new_rnd_coo(struct state *st, int k)
+{
+ int i;
+ int loop = 0;
+
+ st->xy_coo[k].x = (random() % (st->xgwa.width-2*st->radius));
+ st->xy_coo[k].y = (random() % (st->xgwa.height-2*st->radius));
+
+ for (i = 0; i < st->number; i++) {
+ if (i != k) {
+ if ((abs(st->xy_coo[k].x - st->xy_coo[i].x) <= 2*st->radius+st->speed+2)
+ && (abs(st->xy_coo[k].y - st->xy_coo[i].y) <= 2*st->radius+st->speed+2)) {
+ st->xy_coo[k].x = (random() % (st->xgwa.width-2*st->radius));
+ st->xy_coo[k].y = (random() % (st->xgwa.height-2*st->radius));
+ i=-1; /* ugly */
+ }
+ }
+ if (loop++ > 1000) return; /* let's not get stuck */
+ }
+}
+
+/* move lens and handle bounces with walls and other lenses */
+static void move_lense(struct state *st, int k)
+{
+ int i;
+
+ if (st->xy_coo[k].x + 2*st->radius + st->speed + 2 >= st->xgwa.width)
+ st->xy_coo[k].xmove = -abs(st->xy_coo[k].xmove);
+ if (st->xy_coo[k].x <= st->speed)
+ st->xy_coo[k].xmove = abs(st->xy_coo[k].xmove);
+ if (st->xy_coo[k].y + 2*st->radius + st->speed + 2 >= st->xgwa.height)
+ st->xy_coo[k].ymove = -abs(st->xy_coo[k].ymove);
+ if (st->xy_coo[k].y <= st->speed)
+ st->xy_coo[k].ymove = abs(st->xy_coo[k].ymove);
+
+ st->xy_coo[k].x = st->xy_coo[k].x + st->xy_coo[k].xmove;
+ st->xy_coo[k].y = st->xy_coo[k].y + st->xy_coo[k].ymove;
+
+ /* bounce against othe lenses */
+ for (i = 0; i < st->number; i++) {
+ if ((i != k)
+
+/* This commented test is for rectangular lenses (not currently used) and
+ * the one used is for circular ones
+ && (abs(xy_coo[k].x - xy_coo[i].x) <= 2*radius)
+ && (abs(xy_coo[k].y - xy_coo[i].y) <= 2*radius)) { */
+
+ && ((st->xy_coo[k].x - st->xy_coo[i].x)*(st->xy_coo[k].x - st->xy_coo[i].x)
+ + (st->xy_coo[k].y - st->xy_coo[i].y)*(st->xy_coo[k].y - st->xy_coo[i].y)
+ <= 2*st->radius*2*st->radius)) {
+
+ int x, y;
+ x = st->xy_coo[k].xmove;
+ y = st->xy_coo[k].ymove;
+ st->xy_coo[k].xmove = st->xy_coo[i].xmove;
+ st->xy_coo[k].ymove = st->xy_coo[i].ymove;
+ st->xy_coo[i].xmove = x;
+ st->xy_coo[i].ymove = y;
+ }
+ }
+
+}
+
+/* make xy_coo[k] grow/shrink */
+static void swamp_thing(struct state *st, int k)
+{
+ if (st->xy_coo[k].r >= st->radius)
+ st->xy_coo[k].r_change = -abs(st->xy_coo[k].r_change);
+
+ if (st->xy_coo[k].r <= 0) {
+ st->from = st->from_array[0];
+ st->draw(st,k);
+ st->xy_coo[k].r_change = abs(st->xy_coo[k].r_change);
+ new_rnd_coo(st,k);
+ st->xy_coo[k].r=st->xy_coo[k].r_change;
+ return;
+ }
+
+ st->xy_coo[k].r = st->xy_coo[k].r + st->xy_coo[k].r_change;
+
+ if (st->xy_coo[k].r >= st->radius)
+ st->xy_coo[k].r = st->radius;
+ if (st->xy_coo[k].r <= 0)
+ st->xy_coo[k].r=0;
+
+ st->from = st->from_array[st->xy_coo[k].r];
+}
+
+
+static unsigned long
+distort_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int k;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+ distort_finish_loading (st);
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ st->pm = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->pm, 0, 0);
+ return st->delay;
+ }
+
+ for (k = 0; k < st->number; k++) {
+ st->effect(st,k);
+ st->draw(st,k);
+ }
+ return st->delay;
+}
+
+static void
+distort_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ /* XClearWindow (dpy, window); */
+ /* Why doesn't this work? */
+ if (st->orig_map) /* created in distort_finish_loading, might be early */
+ XPutImage (st->dpy, st->window, st->gc, st->orig_map,
+ 0, 0, st->orig_map->width, st->orig_map->height, 0, 0);
+}
+
+static Bool
+distort_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ distort_reset(st);
+ return True;
+ }
+ return False;
+}
+
+static void
+distort_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (st->dpy, st->gc);
+ if (st->pm) XFreePixmap (dpy, st->pm);
+ if (st->orig_map) XDestroyImage (st->orig_map);
+ if (st->buffer_map) destroy_xshm_image (st->dpy, st->buffer_map, &st->shm_info);
+ if (st->from) free (st->from);
+ if (st->fast_from) free (st->fast_from);
+ if (st->from_array) free (st->from_array);
+ free (st);
+}
+
+
+
+
+static const char *distort_defaults [] = {
+ "*dontClearRoot: True",
+ "*background: Black",
+ "*fpsSolid: true",
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+
+ "*delay: 20000",
+ "*duration: 120",
+ "*radius: 0",
+ "*speed: 0",
+ "*number: 0",
+ "*slow: False",
+ "*vortex: False",
+ "*magnify: False",
+ "*reflect: False",
+ "*blackhole: False",
+ "*effect: none",
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: False", /* xshm turns out not to help. */
+#endif /* HAVE_XSHM_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec distort_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-number", ".number", XrmoptionSepArg, 0 },
+
+ { "-effect", ".effect", XrmoptionSepArg, 0 },
+ { "-swamp", ".effect", XrmoptionNoArg, "swamp" },
+ { "-bounce", ".effect", XrmoptionNoArg, "bounce" },
+
+ { "-reflect", ".reflect", XrmoptionNoArg, "True" },
+ { "-vortex", ".vortex", XrmoptionNoArg, "True" },
+ { "-magnify", ".magnify", XrmoptionNoArg, "True" },
+ { "-blackhole", ".blackhole", XrmoptionNoArg, "True" },
+ { "-slow", ".slow", XrmoptionNoArg, "True" },
+#ifdef HAVE_XSHM_EXTENSION
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Distort", distort)
diff --git a/hacks/distort.man b/hacks/distort.man
new file mode 100644
index 0000000..eedb924
--- /dev/null
+++ b/hacks/distort.man
@@ -0,0 +1,137 @@
+.TH XScreenSaver 1 "17-Oct-99" "X Version 11"
+.SH NAME
+distort \- distort the content of the screen in interesting ways
+.SH SYNOPSIS
+.B distort
+[\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIvisual\fP]
+[\-window\-id \fIwindow\-id\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-radius \fIpixels\fP]
+[\-speed \fIint\fP]
+[\-number \fIint\fP]
+[\-swamp]
+[\-bounce]
+[\-reflect]
+[\-vortex]
+[\-magnify]
+[\-blackhole]
+[\-slow]
+[\-shm] [\-no\-shm]
+[\-fps]
+.SH DESCRIPTION
+The \fIdistort\fP program takes an image and lets circular zones of
+distortion wander randomly around it, distorting what is under them.
+The mode of distortion and the overall behaviour of the zones can be
+influenced in various ways.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I distort
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window\-id \fIwindow\-id\fP
+Specify which window id to use.
+.TP 8
+.B \-delay \fIusecs\fP
+Specify the delay between subsequent animation frames in microseconds.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-radius \fIpixels\fP
+Specify the radius of the distortion zone in pixels.
+.TP 8
+.B \-speed \fIint\fP
+Specify the speed at which the distortion zone moves, where 0 is slow,
+higher numbers are faster (10 is pretty fast.)
+.TP 8
+.B \-number \fIint\fP
+Specify the number of distortion zones.
+.TP 8
+.B \-swamp
+Instead of letting zones wander around, let small zones pop up like
+bubbles in a swamp and leave permanent distortion. \fBWARNING:\fP
+this option uses a \fIcolossal\fP amount of memory: keep the \fI\-radius\fP
+small when using \fI\-swamp\fP.
+.TP 8
+.B \-bounce
+Let zones wander around and bounce off the window border. This is the
+default.
+.TP 8
+.B \-reflect
+Mode of distortion that resembles reflection by a cylindrical mirror.
+.TP 8
+.B \-vortex
+Whirlpool-shaped distortion. Way cool.
+.TP 8
+.B \-magnify
+This mode of distortion looks like a magnifying glass.
+.TP 8
+.B \-blackhole
+Suck your pixels beyond the event horizon. Favourite mode of Dr
+Stephen Hawking.
+.TP 8
+.B \-slow
+Make the zone wander slower.
+.TP 8
+.B \-shm
+Use shared memory extension.
+.TP 8
+.B \-no\-shm
+Don't use shared memory extension.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Jonas Munsin and Jamie Zawinski. Permission to use,
+copy, modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHORS
+Jonas Munsin <jmunsin@iki.fi> and Jamie Zawinski <jwz@jwz.org>.
+This manual page by Matthias Warkus <mawa@iname.com>, 17-Oct-1999.
diff --git a/hacks/drift.c b/hacks/drift.c
new file mode 100644
index 0000000..e88986b
--- /dev/null
+++ b/hacks/drift.c
@@ -0,0 +1,672 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* drift --- drifting recursive fractal cosmic flames */
+
+#if 0
+static const char sccsid[] = "@(#)drift.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
+ * 01-Jan-1997: Moved new flame to drift. Compile time options now run time.
+ * 01-Jun-1995: Updated by Scott Draves.
+ * 27-Jun-1991: vary number of functions used.
+ * 24-Jun-1991: fixed portability problem with integer mod (%).
+ * 06-Jun-1991: Written, received from Scott Draves <spot@cs.cmu.edu>
+ */
+
+#ifdef STANDALONE
+# define MODE_drift
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 30 \n" \
+ "*ncolors: 200 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define SMOOTH_COLORS
+# define release_drift 0
+# define reshape_drift 0
+# define drift_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# define ENTRYPOINT /**/
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_drift
+
+#define DEF_GROW "False" /* Grow fractals instead of animating one at a time,
+ would then be like flame */
+#define DEF_LISS "False" /* if this is defined then instead of a point
+ bouncing around in a high dimensional sphere, we
+ use lissojous figures. Only makes sense if
+ grow is false. */
+
+static Bool grow;
+static Bool liss;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-grow", ".drift.grow", XrmoptionNoArg, "on"},
+ {"+grow", ".drift.grow", XrmoptionNoArg, "off"},
+ {"-liss", ".drift.trail", XrmoptionNoArg, "on"},
+ {"+liss", ".drift.trail", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&grow, "grow", "Grow", DEF_GROW, t_Bool},
+ {&liss, "trail", "Trail", DEF_LISS, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-/+grow", "turn on/off growing fractals, else they are animated"},
+ {"-/+liss", "turn on/off using lissojous figures to get points"}
+};
+
+ENTRYPOINT ModeSpecOpt drift_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct drift_description =
+{"drift", "init_drift", "draw_drift", (char *) NULL,
+ "refresh_drift", "init_drift", "free_drift", &drift_opts,
+ 10000, 30, 1, 1, 64, 1.0, "",
+ "Shows cosmic drifting flame fractals", 0, NULL};
+
+#endif
+
+#define MAXBATCH1 200 /* mono */
+#define MAXBATCH2 20 /* color */
+#define FUSE 10 /* discard this many initial iterations */
+#define NMAJORVARS 7
+#define MAXLEV 10
+
+typedef struct {
+ /* shape of current flame */
+ int nxforms;
+ double f[2][3][MAXLEV]; /* a bunch of non-homogeneous xforms */
+ int variation[10]; /* for each xform */
+
+ /* Animation */
+ double df[2][3][MAXLEV];
+
+ /* high-level control */
+ int mode; /* 0->slow/single 1->fast/many */
+ int nfractals; /* draw this many fractals */
+ int major_variation;
+ int fractal_len; /* pts/fractal */
+ int color;
+ int rainbow; /* more than one color per fractal
+ 1-> computed by adding dimension to fractal */
+
+ int width, height; /* of window */
+ int timer;
+
+ /* draw info about current flame */
+ int fuse; /* iterate this many before drawing */
+ int total_points; /* draw this many pts before fractal ends */
+ int npoints; /* how many we've computed but not drawn */
+ XPoint pts[MAXBATCH1]; /* here they are */
+ unsigned long pixcol;
+ /* when drawing in color, we have a buffer per color */
+ int *ncpoints;
+ XPoint *cpts;
+
+ double x, y, c;
+ int liss_time;
+ Bool grow, liss;
+
+ short lasthalf;
+ long saved_random_bits;
+ int nbits;
+
+ int erase_countdown;
+} driftstruct;
+
+static driftstruct *drifts = (driftstruct *) NULL;
+
+static short
+halfrandom(driftstruct * dp, int mv)
+{
+ unsigned long r;
+
+ if (dp->lasthalf) {
+ r = dp->lasthalf;
+ dp->lasthalf = 0;
+ } else {
+ r = LRAND();
+ dp->lasthalf = (short) (r >> 16);
+ }
+ r = r % mv;
+ return r;
+}
+
+static int
+frandom(driftstruct * dp, int n)
+{
+ int result;
+
+ if (3 > dp->nbits) {
+ dp->saved_random_bits = LRAND();
+ dp->nbits = 31;
+ }
+ switch (n) {
+ case 2:
+ result = (int) (dp->saved_random_bits & 1);
+ dp->saved_random_bits >>= 1;
+ dp->nbits -= 1;
+ return result;
+
+ case 3:
+ result = (int) (dp->saved_random_bits & 3);
+ dp->saved_random_bits >>= 2;
+ dp->nbits -= 2;
+ if (3 == result)
+ return frandom(dp, 3);
+ return result;
+
+ case 4:
+ result = (int) (dp->saved_random_bits & 3);
+ dp->saved_random_bits >>= 2;
+ dp->nbits -= 2;
+ return result;
+
+ case 5:
+ result = (int) (dp->saved_random_bits & 7);
+ dp->saved_random_bits >>= 3;
+ dp->nbits -= 3;
+ if (4 < result)
+ return frandom(dp, 5);
+ return result;
+ default:
+ (void) fprintf(stderr, "bad arg to frandom\n");
+ }
+ return 0;
+}
+
+#define DISTRIB_A (halfrandom(dp, 7000) + 9000)
+#define DISTRIB_B ((frandom(dp, 3) + 1) * (frandom(dp, 3) + 1) * 120000)
+#define LEN(x) (sizeof(x)/sizeof((x)[0]))
+
+static void
+initmode(ModeInfo * mi, int mode)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+
+#define VARIATION_LEN 14
+
+ dp->mode = mode;
+
+ dp->major_variation = halfrandom(dp, VARIATION_LEN);
+ /* 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6 */
+ dp->major_variation = ((dp->major_variation >= VARIATION_LEN >> 1) &&
+ (dp->major_variation < VARIATION_LEN - 1)) ?
+ (dp->major_variation + 1) >> 1 : dp->major_variation >> 1;
+
+ if (dp->grow) {
+ dp->rainbow = 0;
+ if (mode) {
+ if (!dp->color || halfrandom(dp, 8)) {
+ dp->nfractals = halfrandom(dp, 30) + 5;
+ dp->fractal_len = DISTRIB_A;
+ } else {
+ dp->nfractals = halfrandom(dp, 5) + 5;
+ dp->fractal_len = DISTRIB_B;
+ }
+ } else {
+ dp->rainbow = dp->color;
+ dp->nfractals = 1;
+ dp->fractal_len = DISTRIB_B;
+ }
+ } else {
+ dp->nfractals = 1;
+ dp->rainbow = dp->color;
+ dp->fractal_len = 2000000;
+ }
+ dp->fractal_len = (dp->fractal_len * MI_COUNT(mi)) / 20;
+
+ MI_CLEARWINDOW(mi);
+}
+
+static void
+pick_df_coefs(ModeInfo * mi)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+ int i, j, k;
+ double r;
+
+ for (i = 0; i < dp->nxforms; i++) {
+
+ r = 1e-6;
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++) {
+ dp->df[j][k][i] = ((double) halfrandom(dp, 1000) / 500.0 - 1.0);
+ r += dp->df[j][k][i] * dp->df[j][k][i];
+ }
+ r = (3 + halfrandom(dp, 5)) * 0.01 / sqrt(r);
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++)
+ dp->df[j][k][i] *= r;
+ }
+}
+
+ENTRYPOINT void
+free_drift(ModeInfo * mi)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+ if (dp->ncpoints != NULL) {
+ (void) free((void *) dp->ncpoints);
+ dp->ncpoints = (int *) NULL;
+ }
+ if (dp->cpts != NULL) {
+ (void) free((void *) dp->cpts);
+ dp->cpts = (XPoint *) NULL;
+ }
+}
+
+static void
+initfractal(ModeInfo * mi)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+ int i, j, k;
+
+#define XFORM_LEN 9
+
+ dp->fuse = FUSE;
+ dp->total_points = 0;
+
+ if (!dp->ncpoints) {
+ if ((dp->ncpoints = (int *) malloc(sizeof (int) * MI_NCOLORS(mi))) ==
+ NULL) {
+ free_drift(mi);
+ return;
+ }
+ }
+ if (!dp->cpts) {
+ if ((dp->cpts = (XPoint *) malloc(MAXBATCH2 * sizeof (XPoint) *
+ MI_NCOLORS(mi))) == NULL) {
+ free_drift(mi);
+ return;
+ }
+ }
+
+ if (dp->rainbow)
+ for (i = 0; i < MI_NPIXELS(mi); i++)
+ dp->ncpoints[i] = 0;
+ else
+ dp->npoints = 0;
+ dp->nxforms = halfrandom(dp, XFORM_LEN);
+ /* 2, 2, 2, 3, 3, 3, 4, 4, 5 */
+ dp->nxforms = (dp->nxforms >= XFORM_LEN - 1) + dp->nxforms / 3 + 2;
+
+ dp->c = dp->x = dp->y = 0.0;
+ if (dp->liss && !halfrandom(dp, 10)) {
+ dp->liss_time = 0;
+ }
+ if (!dp->grow)
+ pick_df_coefs(mi);
+ for (i = 0; i < dp->nxforms; i++) {
+ if (NMAJORVARS == dp->major_variation)
+ dp->variation[i] = halfrandom(dp, NMAJORVARS);
+ else
+ dp->variation[i] = dp->major_variation;
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++) {
+ if (dp->liss)
+ dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
+ else
+ dp->f[j][k][i] = ((double) halfrandom(dp, 1000) / 500.0 - 1.0);
+ }
+ }
+ if (dp->color)
+ dp->pixcol = MI_PIXEL(mi, halfrandom(dp, MI_NPIXELS(mi)));
+ else
+ dp->pixcol = MI_WHITE_PIXEL(mi);
+
+}
+
+
+ENTRYPOINT void
+init_drift(ModeInfo * mi)
+{
+ driftstruct *dp;
+
+ MI_INIT (mi, drifts);
+ dp = &drifts[MI_SCREEN(mi)];
+
+ dp->width = MI_WIDTH(mi);
+ dp->height = MI_HEIGHT(mi);
+ dp->color = MI_NPIXELS(mi) > 2;
+
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (NRAND(3) == 0)
+ dp->grow = True;
+ else {
+ dp->grow = False;
+ dp->liss = (Bool) (LRAND() & 1);
+ }
+ } else {
+ dp->grow = grow;
+ if (dp->grow)
+ dp->liss = False;
+ else
+ dp->liss = liss;
+ }
+ initmode(mi, 1);
+ initfractal(mi);
+}
+
+static void
+iter(driftstruct * dp)
+{
+ int i = frandom(dp, dp->nxforms);
+ double nx, ny, nc;
+
+
+ if (i)
+ nc = (dp->c + 1.0) / 2.0;
+ else
+ nc = dp->c / 2.0;
+
+ nx = dp->f[0][0][i] * dp->x + dp->f[0][1][i] * dp->y + dp->f[0][2][i];
+ ny = dp->f[1][0][i] * dp->x + dp->f[1][1][i] * dp->y + dp->f[1][2][i];
+
+
+ switch (dp->variation[i]) {
+ case 1:
+ /* sinusoidal */
+ nx = sin(nx);
+ ny = sin(ny);
+ break;
+ case 2:
+ {
+ /* complex */
+ double r2 = nx * nx + ny * ny + 1e-6;
+
+ nx = nx / r2;
+ ny = ny / r2;
+ break;
+ }
+ case 3:
+ /* bent */
+ if (nx < 0.0)
+ nx = nx * 2.0;
+ if (ny < 0.0)
+ ny = ny / 2.0;
+ break;
+ case 4:
+ {
+ /* swirl */
+
+ double r = (nx * nx + ny * ny); /* times k here is fun */
+ double c1 = sin(r);
+ double c2 = cos(r);
+ double t = nx;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = c2 * t + c1 * ny;
+ nx = c1 * nx - c2 * ny;
+ break;
+ }
+ case 5:
+ {
+ /* horseshoe */
+ double r, c1, c2, t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ r = 0.0;
+ else
+ r = atan2(nx, ny); /* times k here is fun */
+ c1 = sin(r);
+ c2 = cos(r);
+ t = nx;
+
+ nx = c1 * nx - c2 * ny;
+ ny = c2 * t + c1 * ny;
+ break;
+ }
+ case 6:
+ {
+ /* drape */
+ double t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ t = 0.0;
+ else
+ t = atan2(nx, ny) / M_PI;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = sqrt(nx * nx + ny * ny) - 1.0;
+ nx = t;
+ break;
+ }
+ }
+
+#if 0
+ /* here are some others */
+ {
+ /* broken */
+ if (nx > 1.0)
+ nx = nx - 1.0;
+ if (nx < -1.0)
+ nx = nx + 1.0;
+ if (ny > 1.0)
+ ny = ny - 1.0;
+ if (ny < -1.0)
+ ny = ny + 1.0;
+ break;
+ }
+ {
+ /* complex sine */
+ double u = nx, v = ny;
+ double ev = exp(v);
+ double emv = exp(-v);
+
+ nx = (ev + emv) * sin(u) / 2.0;
+ ny = (ev - emv) * cos(u) / 2.0;
+ }
+ {
+
+ /* polynomial */
+ if (nx < 0)
+ nx = -nx * nx;
+ else
+ nx = nx * nx;
+
+ if (ny < 0)
+ ny = -ny * ny;
+ else
+ ny = ny * ny;
+ }
+ {
+ /* spherical */
+ double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
+
+ nx = nx / r;
+ ny = ny / r;
+ }
+ {
+ nx = atan(nx) / M_PI_2
+ ny = atan(ny) / M_PI_2
+ }
+#endif
+
+ /* how to check nan too? some machines don't have finite().
+ don't need to check ny, it'll propogate */
+ if (nx > 1e4 || nx < -1e4) {
+ nx = halfrandom(dp, 1000) / 500.0 - 1.0;
+ ny = halfrandom(dp, 1000) / 500.0 - 1.0;
+ dp->fuse = FUSE;
+ }
+ dp->x = nx;
+ dp->y = ny;
+ dp->c = nc;
+
+}
+
+static void
+draw(ModeInfo * mi, driftstruct * dp, Drawable d)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ double x = dp->x;
+ double y = dp->y;
+ int fixed_x, fixed_y, npix, c, n;
+
+ if (dp->fuse) {
+ dp->fuse--;
+ return;
+ }
+ if (!(x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0))
+ return;
+
+ fixed_x = (int) ((dp->width / 2) * (x + 1.0));
+ fixed_y = (int) ((dp->height / 2) * (y + 1.0));
+
+ if (!dp->rainbow) {
+
+ dp->pts[dp->npoints].x = fixed_x;
+ dp->pts[dp->npoints].y = fixed_y;
+ dp->npoints++;
+ if (dp->npoints == MAXBATCH1) {
+ XSetForeground(display, gc, dp->pixcol);
+ XDrawPoints(display, d, gc, dp->pts, dp->npoints, CoordModeOrigin);
+ dp->npoints = 0;
+ }
+ } else {
+
+ npix = MI_NPIXELS(mi);
+ c = (int) (dp->c * npix);
+
+ if (c < 0)
+ c = 0;
+ if (c >= npix)
+ c = npix - 1;
+ n = dp->ncpoints[c];
+ dp->cpts[c * MAXBATCH2 + n].x = fixed_x;
+ dp->cpts[c * MAXBATCH2 + n].y = fixed_y;
+ if (++dp->ncpoints[c] == MAXBATCH2) {
+ XSetForeground(display, gc, MI_PIXEL(mi, c));
+ XDrawPoints(display, d, gc, &(dp->cpts[c * MAXBATCH2]),
+ dp->ncpoints[c], CoordModeOrigin);
+ dp->ncpoints[c] = 0;
+ }
+ }
+}
+
+static void
+draw_flush(ModeInfo * mi, driftstruct * dp, Drawable d)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+
+ if (dp->rainbow) {
+ int npix = MI_NPIXELS(mi);
+ int i;
+
+ for (i = 0; i < npix; i++) {
+ if (dp->ncpoints[i]) {
+ XSetForeground(display, gc, MI_PIXEL(mi, i));
+ XDrawPoints(display, d, gc, &(dp->cpts[i * MAXBATCH2]),
+ dp->ncpoints[i], CoordModeOrigin);
+ dp->ncpoints[i] = 0;
+ }
+ }
+ } else {
+ if (dp->npoints)
+ XSetForeground(display, gc, dp->pixcol);
+ XDrawPoints(display, d, gc, dp->pts,
+ dp->npoints, CoordModeOrigin);
+ dp->npoints = 0;
+ }
+}
+
+
+ENTRYPOINT void
+draw_drift(ModeInfo * mi)
+{
+ Window window = MI_WINDOW(mi);
+ driftstruct *dp;
+
+ if (drifts == NULL)
+ return;
+ dp = &drifts[MI_SCREEN(mi)];
+ if (dp->ncpoints == NULL)
+ return;
+
+ if (dp->erase_countdown) {
+ if (!--dp->erase_countdown) {
+ initmode(mi, frandom(dp, 2));
+ initfractal(mi);
+ }
+ return;
+ }
+
+ MI_IS_DRAWN(mi) = True;
+ dp->timer = 3000;
+ while (dp->timer) {
+ iter(dp);
+ draw(mi, dp, window);
+ if (dp->total_points++ > dp->fractal_len) {
+ draw_flush(mi, dp, window);
+ if (0 == --dp->nfractals) {
+ dp->erase_countdown = 4 * 1000000 / MI_PAUSE(mi);
+ return;
+ }
+ initfractal(mi);
+ }
+ dp->timer--;
+ }
+ if (!dp->grow) {
+ int i, j, k;
+
+ draw_flush(mi, dp, window);
+ if (dp->liss)
+ dp->liss_time++;
+ for (i = 0; i < dp->nxforms; i++)
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++) {
+ if (dp->liss)
+ dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
+ else {
+ double t = dp->f[j][k][i] += dp->df[j][k][i];
+
+ if (t < -1.0 || 1.0 < t)
+ dp->df[j][k][i] *= -1.0;
+ }
+ }
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_drift(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Drift", drift)
+
+#endif /* MODE_drift */
diff --git a/hacks/drift.man b/hacks/drift.man
new file mode 100644
index 0000000..f0a9be8
--- /dev/null
+++ b/hacks/drift.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+drift - draws drifting recursive fractal cosmic flames
+.SH SYNOPSIS
+.B drift
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-grow] [\-no\-grow] [\-liss] [\-no\-liss]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIdrift\fP program draws drifting recursive fractal cosmic flames
+.SH OPTIONS
+.I drift
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-grow
+.TP 8
+.B \-no\-grow
+Whether fractals should grow; otherwise, they are animated.
+
+.TP 8
+.B \-liss
+.TP 8
+.B \-no\-liss
+Whether we should use lissajous figures to get points.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR flame (MANSUFFIX),
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1991, 1995 by Scott Draves.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Scott Draves <spot@cs.cmu.edu>, 06-Jun-91, 01-Jun-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/epicycle.c b/hacks/epicycle.c
new file mode 100644
index 0000000..89fab0b
--- /dev/null
+++ b/hacks/epicycle.c
@@ -0,0 +1,794 @@
+/* epicycle --- The motion of a body with epicycles, as in the pre-Copernican
+ * cosmologies.
+ *
+ * Copyright (c) 1998 James Youngman <jay@gnu.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Standard C headers; screenhack.h assumes that these have already
+ * been included if required -- for example, it defines M_PI if not
+ * already defined.
+ */
+#include <float.h>
+#include <math.h>
+
+
+#include "screenhack.h"
+#include "erase.h"
+
+/* MIT-SHM headers omitted; this screenhack doesn't use it */
+
+
+
+/*********************************************************/
+/******************** MAGIC CONSTANTS ********************/
+/*********************************************************/
+#define MIN_RADIUS (5) /* smallest allowable circle radius */
+#define FILL_PROPORTION (0.9) /* proportion of screen to fill by scaling. */
+/*********************************************************/
+/***************** END OF MAGIC CONSTANTS ****************/
+/*********************************************************/
+
+
+
+#define FULLCIRCLE (2.0 * M_PI) /* radians in a circle. */
+
+
+/* Some of these resource values here are hand-tuned to give a
+ * pleasing variety of interesting shapes. These are not the only
+ * good settings, but you may find you need to change some as a group
+ * to get pleasing figures.
+ */
+static const char *epicycle_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*colors: 100",
+ "*color0: red",
+ "*delay: 20000",
+ "*holdtime: 2",
+ "*lineWidth: 4",
+ "*minCircles: 2",
+ "*maxCircles: 10",
+ "*minSpeed: 0.003",
+ "*maxSpeed: 0.005",
+ "*harmonics: 8",
+ "*timestep: 1.0",
+ "*timestepCoarseFactor: 1.0", /* no option for this resource. */
+ "*divisorPoisson: 0.4",
+ "*sizeFactorMin: 1.05",
+ "*sizeFactorMax: 2.05",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+/* options passed to this program */
+static XrmOptionDescRec epicycle_options [] = {
+ { "-color0", ".color0", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-colours", ".colors", XrmoptionSepArg, 0 },
+ { "-foreground", ".foreground", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-holdtime", ".holdtime", XrmoptionSepArg, 0 },
+ { "-linewidth", ".lineWidth", XrmoptionSepArg, 0 },
+ { "-min_circles", ".minCircles", XrmoptionSepArg, 0 },
+ { "-max_circles", ".maxCircles", XrmoptionSepArg, 0 },
+ { "-min_speed", ".minSpeed", XrmoptionSepArg, 0 },
+ { "-max_speed", ".maxSpeed", XrmoptionSepArg, 0 },
+ { "-harmonics", ".harmonics", XrmoptionSepArg, 0 },
+ { "-timestep", ".timestep", XrmoptionSepArg, 0 },
+ { "-divisor_poisson",".divisorPoisson",XrmoptionSepArg, 0 },
+ { "-size_factor_min", ".sizeFactorMin", XrmoptionSepArg, 0 },
+ { "-size_factor_max", ".sizeFactorMax", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+/* Each circle is centred on a point on the rim of another circle.
+ */
+struct tagCircle
+{
+ long radius; /* in pixels */
+ double w; /* position (radians ccw from x-axis) */
+ double initial_w; /* starting position */
+ double wdot; /* rotation rate (change in w per iteration) */
+ int divisor;
+
+ struct tagCircle *pchild;
+};
+typedef struct tagCircle Circle;
+
+
+struct tagBody /* a body that moves on a system of circles. */
+{
+ int x_origin, y_origin;
+ int x, y;
+ int old_x, old_y;
+ int current_color; /* pixel index into colors[] */
+ Circle *epicycles; /* system of circles on which it moves. */
+ struct tagBody *next; /* next in list. */
+};
+typedef struct tagBody Body;
+
+
+struct state {
+ Display *dpy;
+ Window window;
+ GC color0;
+ int width, height;
+ int x_offset, y_offset;
+ int unit_pixels;
+ unsigned long bg;
+ Colormap cmap;
+ int restart;
+ double wdot_max;
+ XColor *colors;
+ int ncolors;
+ int color_shift_pos; /* how far we are towards that. */
+ double colour_cycle_rate;
+ int harmonics;
+ double divisorPoisson;
+ double sizeFactorMin;
+ double sizeFactorMax;
+ int minCircles;
+ int maxCircles;
+
+ Bool done;
+
+ long L;
+ double T, timestep, circle, timestep_coarse;
+ int delay;
+ int uncleared;
+ int holdtime;
+ int xmax, xmin, ymax, ymin;
+ Body *pb0;
+ double xtime;
+ eraser_state *eraser;
+};
+
+
+
+/* Determine the GCD of two numbers using Euclid's method. The other
+ * possible algorighm is Stein's method, but it's probably only going
+ * to be much faster on machines with no divide instruction, like the
+ * ARM and the Z80. The former is very fast anyway and the latter
+ * probably won't run X clients; in any case, this calculation is not
+ * the bulk of the computational expense of the program. I originally
+ * tried using Stein's method, but I wanted to remove the gotos. Not
+ * wanting to introduce possible bugs, I plumped for Euclid's method
+ * instead. Lastly, Euclid's algorithm is preferred to the
+ * generalisation for N inputs.
+ *
+ * See Knuth, section 4.5.2.
+ */
+static int
+gcd(int u, int v) /* Euclid's Method */
+{
+ /* If either operand of % is negative, the sign of the result is
+ * implementation-defined. See section 6.3.5 "Multiplicative
+ * Operators" of the ANSI C Standard (page 46 [LEFT HAND PAGE!] of
+ * "Annotated C Standard", Osborne, ISBN 0-07-881952-0).
+ */
+ if (u < 0) u = -u;
+ if (v < 0) v = -v;
+
+ while (0 != v)
+ {
+ int r;
+ r = u % v;
+ u = v;
+ v = r;
+ }
+ return u;
+}
+
+/* Determine the Lowest Common Multiple of two integers, using
+ * Euclid's Proposition 34, as explained in Knuth's The Art of
+ * Computer Programming, Vol 2, section 4.5.2.
+ */
+static int
+lcm(int u, int v)
+{
+ return u / gcd(u,v) * v;
+}
+
+static long
+random_radius(struct state *st, double scale)
+{
+ long r;
+
+ r = frand(scale) * st->unit_pixels/2; /* for frand() see utils/yarandom.h */
+ if (r < MIN_RADIUS)
+ r = MIN_RADIUS;
+ return r;
+}
+
+
+static long
+random_divisor(struct state *st)
+{
+ int divisor = 1;
+ int sign;
+
+ while (frand(1.0) < st->divisorPoisson && divisor <= st->harmonics)
+ {
+ ++divisor;
+ }
+ sign = (frand(1.0) < 0.5) ? +1 : -1;
+ return sign * divisor;
+}
+
+
+/* Construct a circle or die.
+ */
+static Circle *
+new_circle(struct state *st, double scale)
+{
+ Circle *p = malloc(sizeof(Circle));
+
+ p->radius = random_radius(st, scale);
+ p->w = p->initial_w = 0.0;
+ p->divisor = random_divisor(st);
+ p->wdot = st->wdot_max / p->divisor;
+ p->pchild = NULL;
+
+ return p;
+}
+
+static void delete_circle(Circle *p)
+{
+ free(p);
+}
+
+static void
+delete_circle_chain(Circle *p)
+{
+ while (p)
+ {
+ Circle *q = p->pchild;
+ delete_circle(p);
+ p = q;
+ }
+}
+
+static Circle *
+new_circle_chain(struct state *st)
+{
+ Circle *head;
+ double scale = 1.0, factor;
+ int n;
+
+ /* Parent circles are larger than their children by a factor of at
+ * least FACTOR_MIN and at most FACTOR_MAX.
+ */
+ factor = st->sizeFactorMin + frand(st->sizeFactorMax - st->sizeFactorMin);
+
+ /* There are between minCircles and maxCircles in each figure.
+ */
+ if (st->maxCircles == st->minCircles)
+ n = st->minCircles; /* Avoid division by zero. */
+ else
+ n = st->minCircles + random() % (st->maxCircles - st->minCircles);
+
+ head = NULL;
+ while (n--)
+ {
+ Circle *p = new_circle(st, scale);
+ p->pchild = head;
+ head = p;
+
+ scale /= factor;
+ }
+ return head;
+}
+
+static void
+assign_random_common_w(Circle *p)
+{
+ double w_common = frand(FULLCIRCLE); /* anywhere on the circle */
+ while (p)
+ {
+ p->initial_w = w_common;
+ p = p->pchild;
+ }
+}
+
+static Body *
+new_body(struct state *st)
+{
+ Body *p = malloc(sizeof(Body));
+ if (!p) abort();
+ p->epicycles = new_circle_chain(st);
+ p->current_color = 0; /* ?? start them all on different colors? */
+ p->next = NULL;
+ p->x = p->y = 0;
+ p->old_x = p->old_y = 0;
+ p->x_origin = p->y_origin = 0;
+
+ /* Start all the epicycles at the same w value to make it easier to
+ * figure out at what T value the cycle is closed. We don't just fix
+ * the initial W value because that makes all the patterns tend to
+ * be symmetrical about the X axis.
+ */
+ assign_random_common_w(p->epicycles);
+ return p;
+}
+
+static void
+delete_body(Body *p)
+{
+ delete_circle_chain(p->epicycles);
+ free(p);
+}
+
+
+static void
+draw_body(struct state *st, Body *pb, GC gc)
+{
+ XDrawLine(st->dpy, st->window, gc, pb->old_x, pb->old_y, pb->x, pb->y);
+}
+
+static long
+compute_divisor_lcm(Circle *p)
+{
+ long l = 1;
+
+ while (p)
+ {
+ l = lcm(l, p->divisor);
+ p = p->pchild;
+ }
+ return l;
+}
+
+
+/* move_body()
+ *
+ * Calculate the position for the body at time T. We work in double
+ * rather than int to avoid the cumulative errors that would be caused
+ * by the rounding implicit in an assignment to int.
+ */
+static void
+move_body(Body *pb, double t)
+{
+ Circle *p;
+ double x, y;
+
+ pb->old_x = pb->x;
+ pb->old_y = pb->y;
+
+ x = pb->x_origin;
+ y = pb->y_origin;
+
+ for (p=pb->epicycles; NULL != p; p=p->pchild)
+ {
+ /* angular pos = initial_pos + time * angular speed */
+ /* but this is an angular position, so modulo FULLCIRCLE. */
+ p->w = fmod(p->initial_w + (t * p->wdot), FULLCIRCLE);
+
+ x += (p->radius * cos(p->w));
+ y += (p->radius * sin(p->w));
+ }
+
+ pb->x = (int)x;
+ pb->y = (int)y;
+}
+
+static int
+colour_init(struct state *st, XWindowAttributes *pxgwa)
+{
+ XGCValues gcv;
+
+#if 0
+ int H = random() % 360; /* colour choice from attraction.c. */
+ double S1 = 0.25;
+ double S2 = 1.00;
+ double V = frand(0.25) + 0.75;
+ int line_width = 0;
+#endif
+
+ int retval = 1;
+ unsigned long valuemask = 0L;
+ unsigned long fg;
+
+ /* Free any already allocated colors...
+ */
+ if (st->colors)
+ {
+ free_colors(pxgwa->screen, st->cmap, st->colors, st->ncolors);
+ st->colors = 0;
+ st->ncolors = 0;
+ }
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ if (0 == st->ncolors) /* English spelling? */
+ st->ncolors = get_integer_resource (st->dpy, "colours", "Colors");
+
+ if (st->ncolors < 2)
+ st->ncolors = 2;
+ if (st->ncolors <= 2)
+ mono_p = True;
+ st->colors = 0;
+
+ if (!mono_p)
+ {
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ if (!st->colors) abort();
+
+ make_smooth_colormap (pxgwa->screen, pxgwa->visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, /* allocate */
+ False, /* not writable */
+ True); /* verbose (complain about failure) */
+ if (st->ncolors <= 2)
+ {
+ if (st->colors)
+ free (st->colors);
+ st->colors = 0;
+ mono_p = True;
+ }
+ }
+
+
+ st->bg = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
+
+ /* Set the line width
+ */
+ gcv.line_width = get_integer_resource (st->dpy, "lineWidth", "Integer");
+ if (gcv.line_width)
+ {
+ valuemask |= GCLineWidth;
+
+ gcv.join_style = JoinRound;
+ gcv.cap_style = CapRound;
+
+ valuemask |= (GCCapStyle | GCJoinStyle);
+ }
+
+
+ /* Set the drawing function.
+ */
+ gcv.function = GXcopy;
+ valuemask |= GCFunction;
+
+ /* Set the foreground.
+ */
+/* if (mono_p)*/
+ fg = get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+/* WTF?
+else
+ fg = st->bg ^ get_pixel_resource (st->dpy, st->cmap, ("color0"), "Foreground");
+*/
+ gcv.foreground = fg;
+ valuemask |= GCForeground;
+
+ /* Actually create the GC.
+ */
+ st->color0 = XCreateGC (st->dpy, st->window, valuemask, &gcv);
+
+ return retval;
+}
+
+
+
+
+static void
+setup(struct state *st)
+{
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->cmap = xgwa.colormap;
+
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ st->x_offset = st->width / 2;
+ st->y_offset = st->height / 2;
+ st->unit_pixels = st->width < st->height ? st->width : st->height;
+
+ {
+ if (!st->done)
+ {
+ colour_init(st, &xgwa);
+ st->done = True;
+ }
+ }
+}
+
+
+static void
+color_step(struct state *st, Body *pb, double frac)
+{
+ if (!mono_p)
+ {
+ int newshift = st->ncolors * fmod(frac * st->colour_cycle_rate, 1.0);
+ if (newshift != st->color_shift_pos)
+ {
+ pb->current_color = newshift;
+ XSetForeground (st->dpy, st->color0, st->colors[pb->current_color].pixel);
+ st->color_shift_pos = newshift;
+ }
+ }
+}
+
+
+#if 0
+static long
+distance(long x1, long y1, long x2, long y2)
+{
+ long dx, dy;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ return dx*dx + dy*dy;
+}
+
+static int poisson_irand(double p)
+{
+ int r = 1;
+ while (fabs(frand(1.0)) < p)
+ ++r;
+ return r < 1 ? 1 : r;
+}
+#endif
+
+static void
+precalculate_figure(Body *pb,
+ double this_xtime, double step,
+ int *x_max, int *y_max,
+ int *x_min, int *y_min)
+{
+ double t;
+
+ move_body(pb, 0.0); /* move once to avoid initial line from origin */
+ *x_min = *x_max = pb->x;
+ *y_min = *y_max = pb->y;
+
+ for (t=0.0; t<this_xtime; t += step)
+ {
+ move_body(pb, t); /* move once to avoid initial line from origin */
+ if (pb->x > *x_max)
+ *x_max = pb->x;
+ if (pb->x < *x_min)
+ *x_min = pb->x;
+ if (pb->y > *y_max)
+ *y_max = pb->y;
+ if (pb->y < *y_min)
+ *y_min = pb->y;
+ }
+}
+
+static int i_max(int a, int b)
+{
+ return (a>b) ? a : b;
+}
+
+static void rescale_circles(struct state *st, Body *pb,
+ int x_max, int y_max,
+ int x_min, int y_min)
+{
+ double xscale, yscale, scale;
+ double xm, ym;
+
+ x_max -= st->x_offset;
+ x_min -= st->x_offset;
+ y_max -= st->y_offset;
+ y_min -= st->y_offset;
+
+ x_max = i_max(x_max, -x_min);
+ y_max = i_max(y_max, -y_min);
+
+
+ xm = st->width / 2.0;
+ ym = st->height / 2.0;
+ if (x_max > xm)
+ xscale = xm / x_max;
+ else
+ xscale = 1.0;
+ if (y_max > ym)
+ yscale = ym / y_max;
+ else
+ yscale = 1.0;
+
+ if (xscale < yscale) /* wider than tall */
+ scale = xscale; /* ensure width fits onscreen */
+ else
+ scale = yscale; /* ensure height fits onscreen */
+
+
+ scale *= FILL_PROPORTION; /* only fill FILL_PROPORTION of screen */
+ if (scale < 1.0) /* only reduce, don't enlarge. */
+ {
+ Circle *p;
+ for (p=pb->epicycles; p; p=p->pchild)
+ {
+ p->radius *= scale;
+ }
+ }
+ else
+ {
+ printf("enlarge by x%.2f skipped...\n", scale);
+ }
+
+ if (st->width > st->height * 5 || /* window has weird aspect */
+ st->height > st->width * 5)
+ {
+ Circle *p;
+ double r = (st->width > st->height
+ ? st->width / (double) st->height
+ : st->height / (double) st->width);
+ for (p=pb->epicycles; p; p=p->pchild)
+ p->radius *= r;
+ }
+}
+
+
+/* angular speeds of the circles are harmonics of a fundamental
+ * value. That should please the Pythagoreans among you... :-)
+ */
+static double
+random_wdot_max(struct state *st)
+{
+ /* Maximum and minimum values for the choice of wdot_max. Possible
+ * epicycle speeds vary from wdot_max to (wdot_max * harmonics).
+ */
+ double minspeed, maxspeed;
+ minspeed = get_float_resource(st->dpy, "minSpeed", "Double");
+ maxspeed = get_float_resource(st->dpy, "maxSpeed", "Double");
+ return st->harmonics * (minspeed + FULLCIRCLE * frand(maxspeed-minspeed));
+}
+
+
+static void *
+epicycle_init (Display *disp, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = disp;
+ st->window = win;
+
+ st->holdtime = get_integer_resource (st->dpy, "holdtime", "Integer");
+
+ st->circle = FULLCIRCLE;
+
+ XClearWindow(st->dpy, st->window);
+ st->uncleared = 0;
+ st->restart = 1;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->harmonics = get_integer_resource(st->dpy, "harmonics", "Integer");
+ st->divisorPoisson = get_float_resource(st->dpy, "divisorPoisson", "Double");
+
+ st->timestep = get_float_resource(st->dpy, "timestep", "Double");
+ st->timestep_coarse = st->timestep *
+ get_float_resource(st->dpy, "timestepCoarseFactor", "Double");
+
+ st->sizeFactorMin = get_float_resource(st->dpy, "sizeFactorMin", "Double");
+ st->sizeFactorMax = get_float_resource(st->dpy, "sizeFactorMax", "Double");
+
+ st->minCircles = get_integer_resource (st->dpy, "minCircles", "Integer");
+ st->maxCircles = get_integer_resource (st->dpy, "maxCircles", "Integer");
+
+ st->xtime = 0; /* is this right? */
+
+ return st;
+}
+
+static unsigned long
+epicycle_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->delay;
+
+ if (st->eraser) {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return 10000;
+ }
+
+ if (st->restart)
+ {
+ setup(st);
+ st->restart = 0;
+
+ /* Flush any outstanding events; this has the side effect of
+ * reducing the number of "false restarts"; resdtarts caused by
+ * one event (e.g. ConfigureNotify) followed by another
+ * (e.g. Expose).
+ */
+
+ st->wdot_max = random_wdot_max(st);
+
+ if (st->pb0)
+ {
+ delete_body(st->pb0);
+ st->pb0 = NULL;
+ }
+ st->pb0 = new_body(st);
+ st->pb0->x_origin = st->pb0->x = st->x_offset;
+ st->pb0->y_origin = st->pb0->y = st->y_offset;
+
+ if (st->uncleared)
+ {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ st->uncleared = 0;
+ }
+
+ precalculate_figure(st->pb0, st->xtime, st->timestep_coarse,
+ &st->xmax, &st->ymax, &st->xmin, &st->ymin);
+
+ rescale_circles(st, st->pb0, st->xmax, st->ymax, st->xmin, st->ymin);
+
+ move_body(st->pb0, 0.0); /* move once to avoid initial line from origin */
+ move_body(st->pb0, 0.0); /* move once to avoid initial line from origin */
+
+
+ st->T = 0.0; /* start at time zero. */
+
+ st->L = compute_divisor_lcm(st->pb0->epicycles);
+
+ st->colour_cycle_rate = labs(st->L);
+
+ st->xtime = fabs(st->L * st->circle / st->wdot_max);
+
+ if (st->colors) /* (colors==NULL) if mono_p */
+ XSetForeground (st->dpy, st->color0, st->colors[st->pb0->current_color].pixel);
+ }
+
+
+ color_step(st, st->pb0, st->T/st->xtime );
+ draw_body(st, st->pb0, st->color0);
+ st->uncleared = 1;
+
+
+ /* Check if the figure is complete...*/
+ if (st->T > st->xtime)
+ {
+ this_delay = st->holdtime * 1000000;
+ st->restart = 1; /* begin new figure. */
+ }
+
+
+
+ st->T += st->timestep;
+ move_body(st->pb0, st->T);
+
+ return this_delay;
+}
+
+static void
+epicycle_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->restart = 1;
+}
+
+static Bool
+epicycle_event (Display *dpy, Window window, void *closure, XEvent *e)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, e))
+ {
+ st->restart = 1;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+epicycle_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Epicycle", epicycle)
diff --git a/hacks/epicycle.man b/hacks/epicycle.man
new file mode 100644
index 0000000..290884f
--- /dev/null
+++ b/hacks/epicycle.man
@@ -0,0 +1,204 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+epicycle - draws a point moving around a circle which moves around a cicle which...
+.SH SYNOPSIS
+.B epicycle
+[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIviz\fP] [\-colors \fIN\fP] [\-foreground \fIname\fP] [\-color\-shift \fIN\fP] [\-delay \fImicroseconds\fP] [\-holdtime \fIseconds\fP] [\-linewidth \fIN\fP] [\-min_circles \fIN\fP] [\-max_circles \fIN\fP] [\-min_speed \fInumber\fP] [\-max_speed \fInumber\fP] [\-harmonics \fIN\fP] [\-timestep \fInumber\fP] [\-divisor_poisson \fIprobability\fP] [\-size_factor_min \fInumber\fP] [\-size_factor_max \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+The epicycle program draws the path traced out by a point on the edge
+of a circle. That circle rotates around a point on the rim of another
+circle, and so on, several times. The random curves produced can be
+simple or complex, convex or concave, but they are always closed
+curves (they never go in indefinitely).
+
+You can configure both the way the curves are drawn and the way in
+which the random sequence of circles is generated, either with
+command-line options or X resources.
+.SH OPTIONS
+.TP 8
+.B \-display \fIhost:display.screen\fP
+Specifies which X display we should use (see the section DISPLAY NAMES in
+.BR X (1)
+for more information about this option).
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+If we're on a mono display, we have no choice.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-visual \fIviz\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+Possible choices include
+
+.RS
+default, best, mono, monochrome, gray, grey, color, staticgray, staticcolor,
+truecolor, grayscale, greyscale, pseudocolor, directcolor, \fInumber\fP
+
+If a decimal or hexadecimal number is used,
+.BR XGetVisualInfo (3X)
+is consulted to obtain the required visual.
+.RE
+.TP 8
+.B \-colors \fIN\fP
+How many colors should be used (if possible). The colors are chosen
+randomly.
+.TP 8
+.B \-foreground \fIname\fP
+With
+.BR \-mono ,
+this option selects the foreground colour.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Specifies the delay between drawing successive line segments of the
+path. If you do not specify
+.BR -sync ,
+some X servers may batch up several drawing operations together,
+producing a less smooth effect. This is more likely to happen
+in monochrome mode (on monochrome servers or when
+.B \-mono
+is specified).
+.TP 8
+.B \-holdtime \fIseconds\fP
+When the figure is complete,
+.I epicycle
+pauses this number of seconds.
+.TP 8
+.B \-linewidth \fIN\fP
+Width in pixels of the body's track. Specifying values greater than
+one may cause slower drawing. The fastest value is usually zero,
+meaning one pixel.
+.TP 8
+.B \-min_circles \fIN\fP
+Smallest number of epicycles in the figure.
+.TP 8
+.B \-max_circles \fIN\fP
+Largest number of epicycles in the figure.
+.TP 8
+.B \-min_speed \fInumber\fP
+Smallest possible value for the base speed of revolution of the
+epicycles. The actual speeds of the epicycles vary from this down
+to
+.IB "min_speed / harmonics" .
+.TP 8
+.B \-max_speed \fInumber\fP
+Smallest possible value for the base speed of revolution of the
+epicycles.
+.TP 8
+.B \-harmonics \fIN\fP
+Number of possible harmonics; the larger this value is, the greater
+the possible variety of possible speeds of epicycle.
+.TP 8
+.B \-timestep \fInumber\fP
+Decreasing this value will reduce the distance the body moves for
+each line segment, possibly producing a smoother figure. Increasing
+it may produce faster results.
+.TP 8
+.B \-divisor_poisson \fIprobability\fP
+Each epicycle rotates at a rate which is a factor of the base speed.
+The speed of each epicycle is the base speed divided by some integer
+between 1 and the value of the
+.B \-harmonics
+option. This integer is decided by starting at 1 and tossing
+a biased coin. For each consecutive head, the value is incremented by
+one. The integer will not be incremented above the value of the
+.B \-harmonics
+option. The argument of this option decides the bias of the coin; it
+is the probability that that coin will produce a head at any given toss.
+.TP 8
+.B \-size_factor_min \fInumber\fP
+Epicycles are always at least this factor smaller than their
+parents.
+.TP 8
+.B \-size_factor_max \fInumber\fP
+Epicycles are never more than this factor smaller than their parents.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH RESOURCES
+.EX
+Option Resource Default Value
+------ -------- -------------
+-colors .colors 100
+-delay .delay 1000
+-holdtime .holdtime 2
+-linewidth .lineWidth 4
+-min_circles .minCircles 2
+-max_circles .maxCircles 10
+-min_speed .minSpeed 0.003
+-max_speed .maxSpeed 0.005
+-harmonics .harmonics 8
+-timestep .timestep 1.0
+-divisor_poisson .divisorPoisson 0.4
+-size_factor_min .sizeFactorMin 1.05
+-size_factor_max .sizeFactorMax 2.05
+ .timestepCoarseFactor 1.0
+.EE
+Before the drawing of the figure is begun, a preliminary calculation
+of the path is done in order to scale the radii of the epicycles so
+as to fit the figure on the screen or window. For the sake of speed,
+This calculation is done with a larger timestep than the actual
+drawing. The time-step used is the value of the
+.B \-timestep
+option multiplied by the timestepCoarseFactor resource. The default
+value of 1 will almost always work fast enough and so this resource
+is not available as a command-line option.
+.SH USER INTERFACE
+The program runs mostly without user interaction. When running on the
+root window, no input is accepted. When running in its own window,
+the program will exit if mouse button 3 is pressed. If any other
+mouse button is pressed, the current figure will be abandoned and
+another will be started.
+.SH HISTORY
+The geometry of epicycles was perfected by Hipparchus of Rhodes at
+some time around 125 B.C., 185 years after the birth of Aristarchus of
+Samos, the inventor of the heliocentric universe model. Hipparchus
+applied epicycles to the Sun and the Moon. Ptolemy of Alexandria went
+on to apply them to what was then the known universe, at around 150
+A.D. Copernicus went on to apply them to the heliocentric model at
+the beginning of the sixteenth century. Johannes Kepler discovered
+that the planets actually move in elliptical orbits in about 1602.
+The inverse-square law of gravity was suggested by Boulliau in 1645.
+Isaac Newton's
+.I Principia Mathematica
+was published in 1687, and proved that Kepler's laws derived from
+Newtonian gravitation.
+.SH BUGS
+The colour selection is re-done for every figure. This may
+generate too much network traffic for this program to work well
+over slow or long links.
+.SH COPYRIGHT
+Copyright \(co 1998, James Youngman. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+James Youngman <jay@gnu.org>, April 1998.
diff --git a/hacks/eruption.c b/hacks/eruption.c
new file mode 100644
index 0000000..629cb8e
--- /dev/null
+++ b/hacks/eruption.c
@@ -0,0 +1,526 @@
+/* Eruption, Copyright (c) 2002-2003 W.P. van Paassen <peter@paassen.tmfweb.nl>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Module - "eruption.c"
+ *
+ * [02-2003] - W.P. van Paassen: Improvements, added some code of jwz from the pyro hack for a spherical distribution of the particles
+ * [01-2003] - W.P. van Paassen: Port to X for use with XScreenSaver, the shadebob hack by Shane Smit was used as a template
+ * [04-2002] - W.P. van Paassen: Creation for the Demo Effects Collection (http://demo-effects.sourceforge.net)
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+/*#define VERBOSE*/
+
+/* Slightly whacked, for better explosions
+ */
+#define PI_2000 6284
+#define SPREAD 15
+
+/*particle structure*/
+typedef struct
+{
+ short xpos, ypos, xdir, ydir;
+ unsigned char colorindex;
+ unsigned char dead;
+} PARTICLE;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int sin_cache[PI_2000];
+ int cos_cache[PI_2000];
+
+ PARTICLE *particles;
+ unsigned short iWinWidth, iWinHeight;
+ unsigned char **fire;
+ unsigned short nParticleCount;
+ unsigned char xdelta, ydelta, decay;
+ signed char gravity;
+ signed short heat;
+
+ int cycles, delay;
+ GC gc;
+ signed short iColorCount;
+ unsigned long *aiColorVals;
+ XImage *pImage;
+
+ int draw_i;
+};
+
+static void
+cache(struct state *st) /* jwz */
+{ /*needs to be run once. Could easily be */
+ int i; /*reimplemented to run and cache at compile-time,*/
+ double dA;
+ for (i=0; i<PI_2000; i++)
+ {
+ dA=sin(((double) (random() % (PI_2000/2)))/1000.0);
+ /*Emulation of spherical distribution*/
+ dA+=asin(frand(1.0))/M_PI_2*0.1;
+ /*Approximating the integration of the binominal, for
+ well-distributed randomness*/
+ st->cos_cache[i]=-abs((int) (cos(((double)i)/1000.0)*dA*st->ydelta));
+ st->sin_cache[i]=(int) (sin(((double)i)/1000.0)*dA*st->xdelta);
+ }
+}
+
+static void init_particle(struct state *st, PARTICLE* particle, unsigned short xcenter, unsigned short ycenter)
+{
+ int v = random() % PI_2000;
+ particle->xpos = xcenter - SPREAD + (random() % (SPREAD * 2));
+ particle->ypos = ycenter - SPREAD + (random() % (SPREAD * 2));;
+ particle->xdir = st->sin_cache[v];
+ particle->ydir = st->cos_cache[v];
+ particle->colorindex = st->iColorCount-1;
+ particle->dead = 0;
+}
+
+static void Execute( struct state *st )
+{
+ int i, j;
+ unsigned int temp;
+
+ /* move and draw particles into st->fire array */
+
+ for (i = 0; i < st->nParticleCount; i++)
+ {
+ if (!st->particles[i].dead)
+ {
+ st->particles[i].xpos += st->particles[i].xdir;
+ st->particles[i].ypos += st->particles[i].ydir;
+
+ /* is particle dead? */
+
+ if (st->particles[i].colorindex == 0)
+ {
+ st->particles[i].dead = 1;
+ continue;
+ }
+
+ if (st->particles[i].xpos < 1)
+ {
+ st->particles[i].xpos = 1;
+ st->particles[i].xdir = -st->particles[i].xdir - 4;
+ st->particles[i].colorindex = st->iColorCount;
+ }
+ else if (st->particles[i].xpos >= st->iWinWidth - 2)
+ {
+ st->particles[i].xpos = st->iWinWidth - 2;
+ if (st->particles[i].xpos < 1) st->particles[i].xpos = 1;
+ st->particles[i].xdir = -st->particles[i].xdir + 4;
+ st->particles[i].colorindex = st->iColorCount;
+ }
+
+ if (st->particles[i].ypos < 1)
+ {
+ st->particles[i].ypos = 1;
+ st->particles[i].ydir = -st->particles[i].ydir;
+ st->particles[i].colorindex = st->iColorCount;
+ }
+ else if (st->particles[i].ypos >= st->iWinHeight - 3)
+ {
+ st->particles[i].ypos = st->iWinHeight- 3;
+ if (st->particles[i].ypos < 1) st->particles[i].ypos = 1;
+ st->particles[i].ydir = (-st->particles[i].ydir >> 2) - (random() % 2);
+ st->particles[i].colorindex = st->iColorCount;
+ }
+
+
+ /* st->gravity kicks in */
+ st->particles[i].ydir += st->gravity;
+
+ /* particle cools off */
+ st->particles[i].colorindex--;
+
+ /* draw particle */
+ if (st->iWinHeight <= 2 || st->iWinWidth <= 2) continue;
+ st->fire[st->particles[i].ypos][st->particles[i].xpos] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos][st->particles[i].xpos - 1] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos + 1][st->particles[i].xpos] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos - 1][st->particles[i].xpos] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos][st->particles[i].xpos + 1] = st->particles[i].colorindex;
+ }
+ }
+
+ /* create st->fire effect */
+ for (i = 0; i < st->iWinHeight; i++)
+ {
+ for (j = 0; j < st->iWinWidth; j++)
+ {
+ if (j + 1 >= st->iWinWidth)
+ temp = 0;
+ else
+ temp = st->fire[i][j + 1];
+
+ if (j - 1 >= 0)
+ temp += st->fire[i][j - 1];
+
+ if (i - 1 >= 0)
+ {
+ temp += st->fire[i - 1][j];
+ if (j - 1 >= 0)
+ temp += st->fire[i - 1][j - 1];
+ if (j + 1 < st->iWinWidth)
+ temp += st->fire[i - 1][j + 1];
+ }
+
+ if (i + 1 < st->iWinHeight)
+ {
+ temp += st->fire[i + 1][j];
+ if (j + 1 < st->iWinWidth)
+ temp += st->fire[i + 1][j + 1];
+ if (j - 1 >= 0)
+ temp += st->fire[i + 1][j - 1];
+ }
+
+ temp >>= 3;
+
+ if (temp > st->decay)
+ {
+ temp -= st->decay;
+ }
+ else
+ temp = 0;
+
+ st->fire[i][j] = temp;
+ }
+ }
+
+ memset( st->pImage->data, 0, st->pImage->bytes_per_line * st->pImage->height );
+
+ /* draw st->fire array to screen */
+ for (i = 0; i < st->iWinHeight; ++i)
+ {
+ for (j = 0; j < st->iWinWidth; ++j)
+ {
+ if (st->fire[i][j] > 0)
+ XPutPixel( st->pImage, j, i, st->aiColorVals[ st->fire[i][j] ] );
+ }
+ }
+ XPutImage( st->dpy, st->window, st->gc, st->pImage,
+ 0,0,0,0, st->iWinWidth, st->iWinHeight );
+}
+
+static unsigned long * SetPalette(struct state *st)
+{
+ XWindowAttributes XWinAttribs;
+ XColor Color, *aColors;
+ signed short iColor;
+
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ st->iColorCount = get_integer_resource(st->dpy, "ncolors", "Integer" );
+ if( st->iColorCount < 16 ) st->iColorCount = 16;
+ if( st->iColorCount > 255 ) st->iColorCount = 256;
+
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+
+ Color.red = Color.green = Color.blue = 65535 / st->iColorCount;
+
+ /* create st->fire palette */
+ for( iColor=0; iColor < st->iColorCount; iColor++ )
+ {
+ if (iColor < st->iColorCount >> 3)
+ {
+ /* black to blue */
+ aColors[iColor].red = 0;
+ aColors[iColor].green = 0;
+ aColors[iColor].blue = Color.blue * (iColor << 1);
+ }
+ else if (iColor < st->iColorCount >> 2)
+ {
+ /* blue to red */
+ signed short temp = (iColor - (st->iColorCount >> 3));
+ aColors[iColor].red = Color.red * (temp << 3);
+ aColors[iColor].green = 0;
+ aColors[iColor].blue = 16383 - Color.blue * (temp << 1);
+ }
+ else if (iColor < (st->iColorCount >> 2) + (st->iColorCount >> 3))
+ {
+ /* red to yellow */
+ signed short temp = (iColor - (st->iColorCount >> 2)) << 3;
+ aColors[iColor].red = 65535;
+ aColors[iColor].green = Color.green * temp;
+ aColors[iColor].blue = 0;
+ }
+ else if (iColor < st->iColorCount >> 1)
+ {
+ /* yellow to white */
+ signed int temp = (iColor - ((st->iColorCount >> 2) + (st->iColorCount >> 3))) << 3;
+ aColors[iColor].red = 65535;
+ aColors[iColor].green = 65535;
+ aColors[iColor].blue = Color.blue * temp;
+ }
+ else
+ {
+ /* white */
+ aColors[iColor].red = aColors[iColor].green = aColors[iColor].blue = 65535;
+ }
+
+ if( !XAllocColor( st->dpy, XWinAttribs.colormap, &aColors[ iColor ] ) )
+ {
+ /* start all over with less colors */
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, iColor, 0 );
+ free( aColors );
+ free( st->aiColorVals );
+ (st->iColorCount)--;
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+ iColor = -1;
+ }
+ else
+ st->aiColorVals[ iColor ] = aColors[ iColor ].pixel;
+ }
+
+ if (st->heat < st->iColorCount)
+ st->iColorCount = st->heat;
+
+ free( aColors );
+
+ XSetWindowBackground( st->dpy, st->window, st->aiColorVals[ 0 ] );
+
+ return st->aiColorVals;
+}
+
+
+static void Initialize( struct state *st )
+{
+ XGCValues gcValues;
+ XWindowAttributes XWinAttribs;
+ int /*iBitsPerPixel,*/ i;
+
+ /* Create the Image for drawing */
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ /* Find the preferred bits-per-pixel. (jwz) */
+ {
+ int pfvc = 0;
+ XPixmapFormatValues *pfv = XListPixmapFormats( st->dpy, &pfvc );
+ for( i=0; i<pfvc; i++ )
+ if( pfv[ i ].depth == XWinAttribs.depth )
+ {
+ /*iBitsPerPixel = pfv[ i ].bits_per_pixel;*/
+ break;
+ }
+ if( pfv )
+ XFree (pfv);
+ }
+
+ /* Create the GC. */
+ st->gc = XCreateGC( st->dpy, st->window, 0, &gcValues );
+
+ st->pImage = XCreateImage( st->dpy, XWinAttribs.visual, XWinAttribs.depth, ZPixmap, 0, NULL,
+ XWinAttribs.width, XWinAttribs.height, BitmapPad( st->dpy ), 0 );
+ (st->pImage)->data = calloc((st->pImage)->bytes_per_line, (st->pImage)->height);
+
+ st->iWinWidth = XWinAttribs.width;
+ st->iWinHeight = XWinAttribs.height;
+
+ /* create st->fire array */
+ st->fire = calloc( st->iWinHeight, sizeof(unsigned char*));
+ for (i = 0; i < st->iWinHeight; ++i)
+ st->fire[i] = calloc( st->iWinWidth, sizeof(unsigned char));
+
+ /*create st->particles */
+ st->particles = malloc (st->nParticleCount * sizeof(PARTICLE));
+}
+
+static void *
+eruption_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes XWinAttribs;
+ unsigned short sum = 0;
+#ifdef VERBOSE
+ time_t nTime = time( NULL );
+ unsigned short iFrame = 0;
+#endif /* VERBOSE */
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->nParticleCount = get_integer_resource(st->dpy, "particles", "Integer" );
+ if (st->nParticleCount < 100)
+ st->nParticleCount = 100;
+ if (st->nParticleCount > 2000)
+ st->nParticleCount = 2000;
+
+ st->decay = get_integer_resource(st->dpy, "cooloff", "Integer" );
+ if (st->decay <= 0)
+ st->decay = 0;
+ if (st->decay > 10)
+ st->decay = 10;
+
+ st->gravity = get_integer_resource(st->dpy, "gravity", "Integer" );
+ if (st->gravity < -5)
+ st->gravity = -5;
+ if (st->gravity > 5)
+ st->gravity = 5;
+
+ st->heat = get_integer_resource(st->dpy, "heat", "Integer" );
+ if (st->heat < 64)
+ st->heat = 64;
+ if (st->heat > 256)
+ st->heat = 256;
+
+#ifdef VERBOSE
+ printf( "%s: Allocated %d st->particles\n", progclass, st->nParticleCount );
+#endif /* VERBOSE */
+
+ Initialize( st );
+
+ st->ydelta = 0;
+ while (sum < (st->iWinHeight >> 1) - SPREAD)
+ {
+ st->ydelta++;
+ sum += st->ydelta;
+ }
+
+ sum = 0;
+ while (sum < (st->iWinWidth >> 3))
+ {
+ st->xdelta++;
+ sum += st->xdelta;
+ }
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer" );
+ st->cycles = get_integer_resource(st->dpy, "cycles", "Integer" );
+
+ cache(st);
+
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, st->iColorCount, 0 );
+ free( st->aiColorVals );
+ st->aiColorVals = SetPalette( st );
+ XClearWindow( st->dpy, st->window );
+ memset( st->pImage->data, 0, st->pImage->bytes_per_line * st->pImage->height );
+
+ st->draw_i = -1;
+
+ return st;
+}
+
+
+static unsigned long
+eruption_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if( st->draw_i < 0 || st->draw_i++ >= st->cycles )
+ {
+ /* compute random center */
+ unsigned short xcenter, ycenter;
+ xcenter = random() % st->iWinWidth;
+ ycenter = random() % st->iWinHeight;
+
+ for (st->draw_i = 0; st->draw_i < st->nParticleCount; st->draw_i++)
+ init_particle(st, st->particles + st->draw_i, xcenter, ycenter);
+ st->draw_i = 0;
+ }
+
+ Execute( st );
+
+#ifdef VERBOSE
+ iFrame++;
+ if( nTime - time( NULL ) )
+ {
+ printf( "%s: %d FPS\n", progclass, iFrame );
+ nTime = time( NULL );
+ iFrame = 0;
+ }
+#endif /* VERBOSE */
+
+ return st->delay;
+}
+
+
+static void
+eruption_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes XWinAttribs;
+ int i;
+
+ for (i = 0; i < st->iWinHeight; ++i)
+ free (st->fire[i]);
+
+ st->iWinWidth = w;
+ st->iWinHeight = h;
+
+ free (st->fire);
+ st->fire = calloc( st->iWinHeight, sizeof(unsigned char*));
+ for (i = 0; i < st->iWinHeight; ++i)
+ st->fire[i] = calloc( st->iWinWidth, sizeof(unsigned char));
+
+ XDestroyImage( st->pImage );
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+ st->pImage = XCreateImage( st->dpy, XWinAttribs.visual, XWinAttribs.depth, ZPixmap, 0, NULL,
+ XWinAttribs.width, XWinAttribs.height, BitmapPad( st->dpy ), 0 );
+ (st->pImage)->data = calloc((st->pImage)->bytes_per_line, (st->pImage)->height);
+
+ st->draw_i = -1;
+}
+
+static Bool
+eruption_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+eruption_free (Display *dpy, Window window, void *closure)
+{
+#if 0
+ struct state *st = (struct state *) closure;
+ XDestroyImage( st->pImage );
+ free( st->aiColorVals );
+ for (i = 0; i < st->iWinHeight; ++i)
+ free( st->fire[i] );
+ free( st->fire );
+ free( st->particles );
+#endif
+}
+
+
+static const char *eruption_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsTop: true",
+ "*cycles: 80",
+ "*ncolors: 256",
+ "*delay: 10000",
+ "*particles: 300",
+ "*cooloff: 2",
+ "*gravity: 1",
+ "*heat: 256",
+ 0
+};
+
+static XrmOptionDescRec eruption_options [] = {
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-cycles", ".cycles", XrmoptionSepArg, 0 },
+ { "-particles", ".particles", XrmoptionSepArg, 0 },
+ { "-cooloff", ".cooloff", XrmoptionSepArg, 0 },
+ { "-gravity", ".gravity", XrmoptionSepArg, 0 },
+ { "-heat", ".heat", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Eruption", eruption)
+
+/* End of Module - "eruption.c" */
+
diff --git a/hacks/eruption.man b/hacks/eruption.man
new file mode 100644
index 0000000..032b3bd
--- /dev/null
+++ b/hacks/eruption.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+Eruption \- eruption of pieces of hot volcanic rock
+.SH SYNOPSIS
+.B Eruption
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-ncolors \fInumber\fP]
+[\-nParticles \fInumber\fP]
+[\-Heat \fInumber\fP]
+[\-Cooling \fInumber\fP]
+[\-Gravity \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+This hack creates an eruption of pieces of hot volcanic rock.
+Ported from the demo effects collection (http://demo-effects.sourceforge.net)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 256.
+.TP 8
+.B \-particles \fInumber\fP
+Number of Particles. Default: 300.
+.TP 8
+.B \-cooloff \fInumber\fP
+Eruption Cooloff. Default: 2.
+.TP 8
+.B \-heat \fInumber\fP
+Heat of Eruption. Default: 256.
+.TP 8
+.B \-gravity \fInumber\fP
+Gravity. Default: 1.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+Duration. 10 - 3000. Default: 80.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002-2003 by W.P. van Paassen. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+ suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+W.P. van Paassen
diff --git a/hacks/euler2d.c b/hacks/euler2d.c
new file mode 100644
index 0000000..d42a2bb
--- /dev/null
+++ b/hacks/euler2d.c
@@ -0,0 +1,887 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* euler2d --- 2 Dimensional Incompressible Inviscid Fluid Flow */
+
+#if 0
+static const char sccsid[] = "@(#)euler2d.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*
+ * Copyright (c) 2000 by Stephen Montgomery-Smith <stephen@math.missouri.edu>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 04-Nov-2000: Added an option eulerpower. This allows for example the
+ * quasi-geostrophic equation by setting eulerpower to 2.
+ * 01-Nov-2000: Allocation checks.
+ * 10-Sep-2000: Added optimizations, and removed subtle_perturb, by stephen.
+ * 03-Sep-2000: Changed method of solving ode to Adams-Bashforth of order 2.
+ * Previously used a rather compilcated method of order 4.
+ * This doubles the speed of the program. Also it seems
+ * to have improved numerical stability. Done by stephen.
+ * 27-Aug-2000: Added rotation of region to maximize screen fill by stephen.
+ * 05-Jun-2000: Adapted from flow.c Copyright (c) 1996 by Tim Auckland
+ * 18-Jul-1996: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+ * 31-Aug-1990: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org)
+ */
+
+/*
+ * The mathematical aspects of this program are discussed in the file
+ * euler2d.tex.
+ */
+
+#ifdef STANDALONE
+# define MODE_euler2d
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 1024 \n" \
+ "*cycles: 3000 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define SMOOTH_COLORS
+# define release_euler2d 0
+# define reshape_euler2d 0
+# define euler2d_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_euler2d
+
+#define DEF_EULERTAIL "10"
+
+#define DEBUG_POINTED_REGION 0
+
+static int tail_len;
+static int variable_boundary = 1;
+static float power = 1;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-eulertail", ".euler2d.eulertail", XrmoptionSepArg, NULL},
+ {"-eulerpower", ".euler2d.eulerpower", XrmoptionSepArg, NULL},
+};
+static argtype vars[] =
+{
+ {&tail_len, "eulertail",
+ "EulerTail", (char *) DEF_EULERTAIL, t_Int},
+ {&power, "eulerpower",
+ "EulerPower", "1", t_Float},
+};
+static OptionStruct desc[] =
+{
+ {"-eulertail len", "Length of Euler2d tails"},
+ {"-eulerpower power", "power of interaction law for points for Euler2d"},
+};
+
+ENTRYPOINT ModeSpecOpt euler2d_opts =
+{sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct euler2d_description = {
+ "euler2d", "init_euler2d", "draw_euler2d", (char *) NULL,
+ "refresh_euler2d", "init_euler2d", "free_euler2d", &euler2d_opts,
+ 1000, 1024, 3000, 1, 64, 1.0, "",
+ "Simulates 2D incompressible invisid fluid.", 0, NULL
+};
+
+#endif
+
+#define balance_rand(v) ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
+#define positive_rand(v) (LRAND()/MAXRAND*(v)) /* positive random */
+
+#define number_of_vortex_points 20
+
+#define n_bound_p 500
+#define deg_p 6
+
+static double delta_t;
+
+typedef struct {
+ int width;
+ int height;
+ int count;
+ double xshift,yshift,scale;
+ double xshift2,yshift2;
+ double radius;
+
+ int N;
+ int Nvortex;
+
+/* x[2i+0] = x coord for nth point
+ x[2i+1] = y coord for nth point
+ w[i] = vorticity at nth point
+*/
+ double *x;
+ double *w;
+
+ double *diffx;
+ double *olddiffx;
+ double *tempx;
+ double *tempdiffx;
+/* (xs[2i+0],xs[2i+1]) is reflection of (x[2i+0],x[2i+1]) about unit circle
+ xs[2i+0] = x[2i+0]/nx
+ xs[2i+1] = x[2i+1]/nx
+ where
+ nx = x[2i+0]*x[2i+0] + x[2i+1]*x[2i+1]
+
+ x_is_zero[i] = (nx < 1e-10)
+*/
+ double *xs;
+ short *x_is_zero;
+
+/* (p[2i+0],p[2i+1]) is image of (x[2i+0],x[2i+1]) under polynomial p.
+ mod_dp2 is |p'(z)|^2 when z = (x[2i+0],x[2i+1]).
+*/
+ double *p;
+ double *mod_dp2;
+
+/* Sometimes in our calculations we get overflow or numbers that are too big.
+ If that happens with the point x[2*i+0], x[2*i+1], we set dead[i].
+*/
+ short *dead;
+
+ XSegment *csegs;
+ int cnsegs;
+ XSegment *old_segs;
+ int *nold_segs;
+ int c_old_seg;
+ int boundary_color;
+ int hide_vortex;
+ short *lastx;
+
+ double p_coef[2*(deg_p-1)];
+ XSegment *boundary;
+
+} euler2dstruct;
+
+static euler2dstruct *euler2ds = (euler2dstruct *) NULL;
+
+/*
+ If variable_boundary == 1, then we make a variable boundary.
+ The way this is done is to map the unit disk under a
+ polynomial p, where
+ p(z) = z + c_2 z^2 + ... + c_n z^n
+ where n = deg_p. sp->p_coef contains the complex numbers
+ c_2, c_3, ... c_n.
+*/
+
+#define add(a1,a2,b1,b2) (a1)+=(b1);(a2)+=(b2)
+#define mult(a1,a2,b1,b2) temp=(a1)*(b1)-(a2)*(b2); \
+ (a2)=(a1)*(b2)+(a2)*(b1);(a1)=temp
+
+static void
+calc_p(double *p1, double *p2, double z1, double z2, double p_coef[])
+{
+ int i;
+ double temp;
+
+ *p1=0;
+ *p2=0;
+ for(i=deg_p;i>=2;i--)
+ {
+ add(*p1,*p2,p_coef[(i-2)*2],p_coef[(i-2)*2+1]);
+ mult(*p1,*p2,z1,z2);
+ }
+ add(*p1,*p2,1,0);
+ mult(*p1,*p2,z1,z2);
+}
+
+/* Calculate |p'(z)|^2 */
+static double
+calc_mod_dp2(double z1, double z2, double p_coef[])
+{
+ int i;
+ double temp,mp1,mp2;
+
+ mp1=0;
+ mp2=0;
+ for(i=deg_p;i>=2;i--)
+ {
+ add(mp1,mp2,i*p_coef[(i-2)*2],i*p_coef[(i-2)*2+1]);
+ mult(mp1,mp2,z1,z2);
+ }
+ add(mp1,mp2,1,0);
+ return mp1*mp1+mp2*mp2;
+}
+
+static void
+calc_all_p(euler2dstruct *sp)
+{
+ int i,j;
+ double temp,p1,p2,z1,z2;
+ for(j=(sp->hide_vortex?sp->Nvortex:0);j<sp->N;j++) if(!sp->dead[j])
+ {
+ p1=0;
+ p2=0;
+ z1=sp->x[2*j+0];
+ z2=sp->x[2*j+1];
+ for(i=deg_p;i>=2;i--)
+ {
+ add(p1,p2,sp->p_coef[(i-2)*2],sp->p_coef[(i-2)*2+1]);
+ mult(p1,p2,z1,z2);
+ }
+ add(p1,p2,1,0);
+ mult(p1,p2,z1,z2);
+ sp->p[2*j+0] = p1;
+ sp->p[2*j+1] = p2;
+ }
+}
+
+static void
+calc_all_mod_dp2(double *x, euler2dstruct *sp)
+{
+ int i,j;
+ double temp,mp1,mp2,z1,z2;
+ for(j=0;j<sp->N;j++) if(!sp->dead[j])
+ {
+ mp1=0;
+ mp2=0;
+ z1=x[2*j+0];
+ z2=x[2*j+1];
+ for(i=deg_p;i>=2;i--)
+ {
+ add(mp1,mp2,i*sp->p_coef[(i-2)*2],i*sp->p_coef[(i-2)*2+1]);
+ mult(mp1,mp2,z1,z2);
+ }
+ add(mp1,mp2,1,0);
+ sp->mod_dp2[j] = mp1*mp1+mp2*mp2;
+ }
+}
+
+static void
+derivs(double *x, euler2dstruct *sp)
+{
+ int i,j;
+ double u1,u2,x1,x2,xij1,xij2,nxij;
+ double nx;
+
+ if (variable_boundary)
+ calc_all_mod_dp2(sp->x,sp);
+
+ for (j=0;j<sp->Nvortex;j++) if (!sp->dead[j])
+ {
+ nx = x[2*j+0]*x[2*j+0] + x[2*j+1]*x[2*j+1];
+ if (nx < 1e-10)
+ sp->x_is_zero[j] = 1;
+ else {
+ sp->x_is_zero[j] = 0;
+ sp->xs[2*j+0] = x[2*j+0]/nx;
+ sp->xs[2*j+1] = x[2*j+1]/nx;
+ }
+ }
+
+ (void) memset(sp->diffx,0,sizeof(double)*2*sp->N);
+
+ for (i=0;i<sp->N;i++) if (!sp->dead[i])
+ {
+ x1 = x[2*i+0];
+ x2 = x[2*i+1];
+ for (j=0;j<sp->Nvortex;j++) if (!sp->dead[j])
+ {
+/*
+ Calculate the Biot-Savart kernel, that is, effect of a
+ vortex point at a = (x[2*j+0],x[2*j+1]) at the point
+ x = (x1,x2), returning the vector field in (u1,u2).
+
+ In the plane, this is given by the formula
+
+ u = (x-a)/|x-a|^2 or zero if x=a.
+
+ However, in the unit disk we have to subtract from the
+ above:
+
+ (x-as)/|x-as|^2
+
+ where as = a/|a|^2 is the reflection of a about the unit circle.
+
+ If however power != 1, then
+
+ u = (x-a)/|x-a|^(power+1) - |a|^(1-power) (x-as)/|x-as|^(power+1)
+
+*/
+
+ xij1 = x1 - x[2*j+0];
+ xij2 = x2 - x[2*j+1];
+ nxij = (power==1.0) ? xij1*xij1+xij2*xij2 : pow(xij1*xij1+xij2*xij2,(power+1)/2.0);
+
+ if(nxij >= 1e-4) {
+ u1 = xij2/nxij;
+ u2 = -xij1/nxij;
+ }
+ else
+ u1 = u2 = 0.0;
+
+ if (!sp->x_is_zero[j])
+ {
+ xij1 = x1 - sp->xs[2*j+0];
+ xij2 = x2 - sp->xs[2*j+1];
+ nxij = (power==1.0) ? xij1*xij1+xij2*xij2 : pow(xij1*xij1+xij2*xij2,(power+1)/2.0);
+
+ if (nxij < 1e-5)
+ {
+ sp->dead[i] = 1;
+ u1 = u2 = 0.0;
+ }
+ else
+ {
+ u1 -= xij2/nxij;
+ u2 += xij1/nxij;
+ }
+ }
+
+ if (!sp->dead[i])
+ {
+ sp->diffx[2*i+0] += u1*sp->w[j];
+ sp->diffx[2*i+1] += u2*sp->w[j];
+ }
+ }
+
+ if (!sp->dead[i] && variable_boundary)
+ {
+ if (sp->mod_dp2[i] < 1e-5)
+ sp->dead[i] = 1;
+ else
+ {
+ sp->diffx[2*i+0] /= sp->mod_dp2[i];
+ sp->diffx[2*i+1] /= sp->mod_dp2[i];
+ }
+ }
+ }
+}
+
+/*
+ What perturb does is effectively
+ ret = x + k,
+ where k should be of order delta_t.
+
+ We have the option to do this more subtly by mapping points x
+ in the unit disk to points y in the plane, where y = f(|x|) x,
+ with f(t) = -log(1-t)/t.
+
+ This might reduce (but does not remove) problems where particles near
+ the edge of the boundary bounce around.
+
+ But it seems to be not that effective, so for now switch it off.
+*/
+
+#define SUBTLE_PERTURB 0
+
+static void
+perturb(double ret[], double x[], double k[], euler2dstruct *sp)
+{
+ int i;
+ double x1,x2,k1,k2;
+
+#if SUBTLE_PERTURB
+ double d1,d2,t1,t2,mag,mag2,mlog1mmag,memmagdmag,xdotk;
+ for (i=0;i<sp->N;i++) if (!sp->dead[i])
+ {
+ x1 = x[2*i+0];
+ x2 = x[2*i+1];
+ k1 = k[2*i+0];
+ k2 = k[2*i+1];
+ mag2 = x1*x1 + x2*x2;
+ if (mag2 < 1e-10)
+ {
+ ret[2*i+0] = x1+k1;
+ ret[2*i+1] = x2+k2;
+ }
+ else if (mag2 > 1-1e-5)
+ sp->dead[i] = 1;
+ else
+ {
+ mag = sqrt(mag2);
+ mlog1mmag = -log(1-mag);
+ xdotk = x1*k1 + x2*k2;
+ t1 = (x1 + k1)*mlog1mmag/mag + x1*xdotk*(1.0/(1-mag)-mlog1mmag/mag)/mag/mag;
+ t2 = (x2 + k2)*mlog1mmag/mag + x2*xdotk*(1.0/(1-mag)-mlog1mmag/mag)/mag/mag;
+ mag = sqrt(t1*t1+t2*t2);
+ if (mag > 11.5 /* log(1e5) */)
+ sp->dead[i] = 1;
+ else
+ {
+ memmagdmag = (mag>1e-5) ? ((1.0-exp(-mag))/mag) : (1-mag/2.0);
+ ret[2*i+0] = t1*memmagdmag;
+ ret[2*i+1] = t2*memmagdmag;
+ }
+ }
+ if (!sp->dead[i])
+ {
+ d1 = ret[2*i+0]-x1;
+ d2 = ret[2*i+1]-x2;
+ if (d1*d1+d2*d2 > 0.1)
+ sp->dead[i] = 1;
+ }
+ }
+
+#else
+
+ for (i=0;i<sp->N;i++) if (!sp->dead[i])
+ {
+ x1 = x[2*i+0];
+ x2 = x[2*i+1];
+ k1 = k[2*i+0];
+ k2 = k[2*i+1];
+ if (k1*k1+k2*k2 > 0.1 || x1*x1+x2*x2 > 1-1e-5)
+ sp->dead[i] = 1;
+ else
+ {
+ ret[2*i+0] = x1+k1;
+ ret[2*i+1] = x2+k2;
+ }
+ }
+#endif
+}
+
+static void
+ode_solve(euler2dstruct *sp)
+{
+ int i;
+ double *temp;
+
+ if (sp->count < 1) {
+ /* midpoint method */
+ derivs(sp->x,sp);
+ (void) memcpy(sp->olddiffx,sp->diffx,sizeof(double)*2*sp->N);
+ for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
+ sp->tempdiffx[2*i+0] = 0.5*delta_t*sp->diffx[2*i+0];
+ sp->tempdiffx[2*i+1] = 0.5*delta_t*sp->diffx[2*i+1];
+ }
+ perturb(sp->tempx,sp->x,sp->tempdiffx,sp);
+ derivs(sp->tempx,sp);
+ for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
+ sp->tempdiffx[2*i+0] = delta_t*sp->diffx[2*i+0];
+ sp->tempdiffx[2*i+1] = delta_t*sp->diffx[2*i+1];
+ }
+ perturb(sp->x,sp->x,sp->tempdiffx,sp);
+ } else {
+ /* Adams Basforth */
+ derivs(sp->x,sp);
+ for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
+ sp->tempdiffx[2*i+0] = delta_t*(1.5*sp->diffx[2*i+0] - 0.5*sp->olddiffx[2*i+0]);
+ sp->tempdiffx[2*i+1] = delta_t*(1.5*sp->diffx[2*i+1] - 0.5*sp->olddiffx[2*i+1]);
+ }
+ perturb(sp->x,sp->x,sp->tempdiffx,sp);
+ temp = sp->olddiffx;
+ sp->olddiffx = sp->diffx;
+ sp->diffx = temp;
+ }
+}
+
+#define deallocate(p,t) if (p!=NULL) {(void) free((void *) p); p=(t*)NULL; }
+#define allocate(p,t,s) if ((p=(t*)malloc(sizeof(t)*s))==NULL)\
+{free_euler2d(mi);return;}
+
+ENTRYPOINT void
+free_euler2d(ModeInfo * mi)
+{
+ euler2dstruct *sp = &euler2ds[MI_SCREEN(mi)];
+ deallocate(sp->csegs, XSegment);
+ deallocate(sp->old_segs, XSegment);
+ deallocate(sp->nold_segs, int);
+ deallocate(sp->lastx, short);
+ deallocate(sp->x, double);
+ deallocate(sp->diffx, double);
+ deallocate(sp->w, double);
+ deallocate(sp->olddiffx, double);
+ deallocate(sp->tempdiffx, double);
+ deallocate(sp->tempx, double);
+ deallocate(sp->dead, short);
+ deallocate(sp->boundary, XSegment);
+ deallocate(sp->xs, double);
+ deallocate(sp->x_is_zero, short);
+ deallocate(sp->p, double);
+ deallocate(sp->mod_dp2, double);
+}
+
+ENTRYPOINT void
+init_euler2d (ModeInfo * mi)
+{
+#define nr_rotates 18 /* how many rotations to try to fill as much of screen as possible - must be even number */
+ euler2dstruct *sp;
+ int i,k,n,np;
+ double r,theta,x,y,w;
+ double mag,xscale,yscale,p1,p2;
+ double low[nr_rotates],high[nr_rotates],pp1,pp2,pn1,pn2,angle1,angle2,tempangle,dist,scale,bestscale,temp;
+ int besti = 0;
+
+ if (power<0.5) power = 0.5;
+ if (power>3.0) power = 3.0;
+ variable_boundary &= power == 1.0;
+ delta_t = 0.001;
+ if (power>1.0) delta_t *= pow(0.1,power-1);
+
+ MI_INIT (mi, euler2ds);
+ sp = &euler2ds[MI_SCREEN(mi)];
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+#endif
+
+ sp->boundary_color = NRAND(MI_NPIXELS(mi));
+ sp->hide_vortex = NRAND(4) != 0;
+
+ sp->count = 0;
+
+ sp->xshift2 = sp->yshift2 = 0;
+
+ sp->width = MI_WIDTH(mi);
+ sp->height = MI_HEIGHT(mi);
+
+ if (sp->width > sp->height * 5 || /* window has weird aspect */
+ sp->height > sp->width * 5)
+ {
+ if (sp->width > sp->height)
+ {
+ sp->height = sp->width * 0.8;
+ sp->yshift2 = -sp->height/2;
+ }
+ else
+ {
+ sp->width = sp->height * 0.8;
+ sp->xshift2 = -sp->width/2;
+ }
+ }
+
+ sp->N = MI_COUNT(mi)+number_of_vortex_points;
+ sp->Nvortex = number_of_vortex_points;
+
+ if (tail_len < 1) { /* minimum tail */
+ tail_len = 1;
+ }
+ if (tail_len > MI_CYCLES(mi)) { /* maximum tail */
+ tail_len = MI_CYCLES(mi);
+ }
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+
+ /* Allocate memory. */
+
+ if (sp->csegs == NULL) {
+ allocate(sp->csegs, XSegment, sp->N);
+ allocate(sp->old_segs, XSegment, sp->N * tail_len);
+ allocate(sp->nold_segs, int, tail_len);
+ allocate(sp->lastx, short, sp->N * 2);
+ allocate(sp->x, double, sp->N * 2);
+ allocate(sp->diffx, double, sp->N * 2);
+ allocate(sp->w, double, sp->Nvortex);
+ allocate(sp->olddiffx, double, sp->N * 2);
+ allocate(sp->tempdiffx, double, sp->N * 2);
+ allocate(sp->tempx, double, sp->N * 2);
+ allocate(sp->dead, short, sp->N);
+ allocate(sp->boundary, XSegment, n_bound_p);
+ allocate(sp->xs, double, sp->Nvortex * 2);
+ allocate(sp->x_is_zero, short, sp->Nvortex);
+ allocate(sp->p, double, sp->N * 2);
+ allocate(sp->mod_dp2, double, sp->N);
+ }
+ for (i=0;i<tail_len;i++) {
+ sp->nold_segs[i] = 0;
+ }
+ sp->c_old_seg = 0;
+ (void) memset(sp->dead,0,sp->N*sizeof(short));
+
+ if (variable_boundary)
+ {
+ /* Initialize polynomial p */
+/*
+ The polynomial p(z) = z + c_2 z^2 + ... c_n z^n needs to be
+ a bijection of the unit disk onto its image. This is achieved
+ by insisting that sum_{k=2}^n k |c_k| <= 1. Actually we set
+ the inequality to be equality (to get more interesting shapes).
+*/
+ mag = 0;
+ for(k=2;k<=deg_p;k++)
+ {
+ r = positive_rand(1.0/k);
+ theta = balance_rand(2*M_PI);
+ sp->p_coef[2*(k-2)+0]=r*cos(theta);
+ sp->p_coef[2*(k-2)+1]=r*sin(theta);
+ mag += k*r;
+ }
+ if (mag > 0.0001) for(k=2;k<=deg_p;k++)
+ {
+ sp->p_coef[2*(k-2)+0] /= mag;
+ sp->p_coef[2*(k-2)+1] /= mag;
+ }
+
+#if DEBUG_POINTED_REGION
+ for(k=2;k<=deg_p;k++){
+ sp->p_coef[2*(k-2)+0]=0;
+ sp->p_coef[2*(k-2)+1]=0;
+ }
+ sp->p_coef[2*(6-2)+0] = 1.0/6.0;
+#endif
+
+
+/* Here we figure out the best rotation of the domain so that it fills as
+ much of the screen as possible. The number of angles we look at is determined
+ by nr_rotates (we look every 180/nr_rotates degrees).
+ While we figure out the best angle to rotate, we also figure out the correct scaling factors.
+*/
+
+ for(k=0;k<nr_rotates;k++) {
+ low[k] = 1e5;
+ high[k] = -1e5;
+ }
+
+ for(k=0;k<n_bound_p;k++) {
+ calc_p(&p1,&p2,cos((double)k/(n_bound_p)*2*M_PI),sin((double)k/(n_bound_p)*2*M_PI),sp->p_coef);
+ calc_p(&pp1,&pp2,cos((double)(k-1)/(n_bound_p)*2*M_PI),sin((double)(k-1)/(n_bound_p)*2*M_PI),sp->p_coef);
+ calc_p(&pn1,&pn2,cos((double)(k+1)/(n_bound_p)*2*M_PI),sin((double)(k+1)/(n_bound_p)*2*M_PI),sp->p_coef);
+ angle1 = nr_rotates/M_PI*atan2(p2-pp2,p1-pp1)-nr_rotates/2;
+ angle2 = nr_rotates/M_PI*atan2(pn2-p2,pn1-p1)-nr_rotates/2;
+ while (angle1<0) angle1+=nr_rotates*2;
+ while (angle2<0) angle2+=nr_rotates*2;
+ if (angle1>nr_rotates*1.75 && angle2<nr_rotates*0.25) angle2+=nr_rotates*2;
+ if (angle1<nr_rotates*0.25 && angle2>nr_rotates*1.75) angle1+=nr_rotates*2;
+ if (angle2<angle1) {
+ tempangle=angle1;
+ angle1=angle2;
+ angle2=tempangle;
+ }
+ for(i=(int)floor(angle1);i<(int)ceil(angle2);i++) {
+ dist = cos((double)i*M_PI/nr_rotates)*p1 + sin((double)i*M_PI/nr_rotates)*p2;
+ if (i%(nr_rotates*2)<nr_rotates) {
+ if (dist>high[i%nr_rotates]) high[i%nr_rotates] = dist;
+ if (dist<low[i%nr_rotates]) low[i%nr_rotates] = dist;
+ }
+ else {
+ if (-dist>high[i%nr_rotates]) high[i%nr_rotates] = -dist;
+ if (-dist<low[i%nr_rotates]) low[i%nr_rotates] = -dist;
+ }
+ }
+ }
+ bestscale = 0;
+ for (i=0;i<nr_rotates;i++) {
+ xscale = (sp->width-5.0)/(high[i]-low[i]);
+ yscale = (sp->height-5.0)/(high[(i+nr_rotates/2)%nr_rotates]-low[(i+nr_rotates/2)%nr_rotates]);
+ scale = (xscale>yscale) ? yscale : xscale;
+ if (scale>bestscale) {
+ bestscale = scale;
+ besti = i;
+ }
+ }
+/* Here we do the rotation. The way we do this is to replace the
+ polynomial p(z) by a^{-1} p(a z) where a = exp(i best_angle).
+*/
+ p1 = 1;
+ p2 = 0;
+ for(k=2;k<=deg_p;k++)
+ {
+ mult(p1,p2,cos((double)besti*M_PI/nr_rotates),sin((double)besti*M_PI/nr_rotates));
+ mult(sp->p_coef[2*(k-2)+0],sp->p_coef[2*(k-2)+1],p1,p2);
+ }
+
+ sp->scale = bestscale;
+ sp->xshift = -(low[besti]+high[besti])/2.0*sp->scale+sp->width/2;
+ if (besti<nr_rotates/2)
+ sp->yshift = -(low[besti+nr_rotates/2]+high[besti+nr_rotates/2])/2.0*sp->scale+sp->height/2;
+ else
+ sp->yshift = (low[besti-nr_rotates/2]+high[besti-nr_rotates/2])/2.0*sp->scale+sp->height/2;
+
+ sp->xshift += sp->xshift2;
+ sp->yshift += sp->yshift2;
+
+/* Initialize boundary */
+
+ for(k=0;k<n_bound_p;k++)
+ {
+
+ calc_p(&p1,&p2,cos((double)k/(n_bound_p)*2*M_PI),sin((double)k/(n_bound_p)*2*M_PI),sp->p_coef);
+ sp->boundary[k].x1 = (short)(p1*sp->scale+sp->xshift);
+ sp->boundary[k].y1 = (short)(p2*sp->scale+sp->yshift);
+ }
+ for(k=1;k<n_bound_p;k++)
+ {
+ sp->boundary[k].x2 = sp->boundary[k-1].x1;
+ sp->boundary[k].y2 = sp->boundary[k-1].y1;
+ }
+ sp->boundary[0].x2 = sp->boundary[n_bound_p-1].x1;
+ sp->boundary[0].y2 = sp->boundary[n_bound_p-1].y1;
+ }
+ else
+ {
+ if (sp->width>sp->height)
+ sp->radius = sp->height/2.0-5.0;
+ else
+ sp->radius = sp->width/2.0-5.0;
+ }
+
+ /* Initialize point positions */
+
+ for (i=sp->Nvortex;i<sp->N;i++) {
+ do {
+ r = sqrt(positive_rand(1.0));
+ theta = balance_rand(2*M_PI);
+ sp->x[2*i+0]=r*cos(theta);
+ sp->x[2*i+1]=r*sin(theta);
+ /* This is to make sure the initial distribution of points is uniform */
+ } while (variable_boundary &&
+ calc_mod_dp2(sp->x[2*i+0],sp->x[2*i+1],sp->p_coef)
+ < positive_rand(4));
+ }
+
+ n = NRAND(4)+2;
+ /* number of vortex points with negative vorticity */
+ if (n%2) {
+ np = NRAND(n+1);
+ }
+ else {
+ /* if n is even make sure that np==n/2 is twice as likely
+ as the other possibilities. */
+ np = NRAND(n+2);
+ if (np==n+1) np=n/2;
+ }
+ for(k=0;k<n;k++)
+ {
+ r = sqrt(positive_rand(0.77));
+ theta = balance_rand(2*M_PI);
+ x=r*cos(theta);
+ y=r*sin(theta);
+ r = 0.02+positive_rand(0.1);
+ w = (2*(k<np)-1)*2.0/sp->Nvortex;
+ for (i=sp->Nvortex*k/n;i<sp->Nvortex*(k+1)/n;i++) {
+ theta = balance_rand(2*M_PI);
+ sp->x[2*i+0]=x + r*cos(theta);
+ sp->x[2*i+1]=y + r*sin(theta);
+ sp->w[i]=w;
+ }
+ }
+}
+
+ENTRYPOINT void
+draw_euler2d (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int b, col, n_non_vortex_segs;
+ euler2dstruct *sp;
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (euler2ds == NULL)
+ return;
+ sp = &euler2ds[MI_SCREEN(mi)];
+ if (sp->csegs == NULL)
+ return;
+
+ ode_solve(sp);
+ if (variable_boundary)
+ calc_all_p(sp);
+
+ sp->cnsegs = 0;
+ for(b=sp->Nvortex;b<sp->N;b++) if(!sp->dead[b])
+ {
+ sp->csegs[sp->cnsegs].x1 = sp->lastx[2*b+0];
+ sp->csegs[sp->cnsegs].y1 = sp->lastx[2*b+1];
+ if (variable_boundary)
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->p[2*b+0]*sp->scale+sp->xshift);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->p[2*b+1]*sp->scale+sp->yshift);
+ }
+ else
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->x[2*b+0]*sp->radius+sp->width/2);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->x[2*b+1]*sp->radius+sp->height/2);
+ }
+ sp->lastx[2*b+0] = sp->csegs[sp->cnsegs].x2;
+ sp->lastx[2*b+1] = sp->csegs[sp->cnsegs].y2;
+ sp->cnsegs++;
+ }
+ n_non_vortex_segs = sp->cnsegs;
+
+ if (!sp->hide_vortex) for(b=0;b<sp->Nvortex;b++) if(!sp->dead[b])
+ {
+ sp->csegs[sp->cnsegs].x1 = sp->lastx[2*b+0];
+ sp->csegs[sp->cnsegs].y1 = sp->lastx[2*b+1];
+ if (variable_boundary)
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->p[2*b+0]*sp->scale+sp->xshift);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->p[2*b+1]*sp->scale+sp->yshift);
+ }
+ else
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->x[2*b+0]*sp->radius+sp->width/2);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->x[2*b+1]*sp->radius+sp->height/2);
+ }
+ sp->lastx[2*b+0] = sp->csegs[sp->cnsegs].x2;
+ sp->lastx[2*b+1] = sp->csegs[sp->cnsegs].y2;
+ sp->cnsegs++;
+ }
+
+ if (sp->count) {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+
+ XDrawSegments(display, window, gc, sp->old_segs+sp->c_old_seg*sp->N, sp->nold_segs[sp->c_old_seg]);
+
+ if (MI_NPIXELS(mi) > 2){ /* render colour */
+ for (col = 0; col < MI_NPIXELS(mi); col++) {
+ int start = col*n_non_vortex_segs/MI_NPIXELS(mi);
+ int finish = (col+1)*n_non_vortex_segs/MI_NPIXELS(mi);
+ XSetForeground(display, gc, MI_PIXEL(mi, col));
+ XDrawSegments(display, window, gc,sp->csegs+start, finish-start);
+ }
+ if (!sp->hide_vortex) {
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawSegments(display, window, gc,sp->csegs+n_non_vortex_segs, sp->cnsegs-n_non_vortex_segs);
+ }
+
+ } else { /* render mono */
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawSegments(display, window, gc,
+ sp->csegs, sp->cnsegs);
+ }
+
+ if (MI_NPIXELS(mi) > 2) /* render colour */
+ XSetForeground(display, gc, MI_PIXEL(mi, sp->boundary_color));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ if (variable_boundary)
+ XDrawSegments(display, window, gc,
+ sp->boundary, n_bound_p);
+ else
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ sp->width/2 - (int) sp->radius - 1, sp->height/2 - (int) sp->radius -1,
+ (int) (2*sp->radius) + 2, (int) (2* sp->radius) + 2, 0, 64*360);
+
+ /* Copy to erase-list */
+ (void) memcpy(sp->old_segs+sp->c_old_seg*sp->N, sp->csegs, sp->cnsegs*sizeof(XSegment));
+ sp->nold_segs[sp->c_old_seg] = sp->cnsegs;
+ sp->c_old_seg++;
+ if (sp->c_old_seg >= tail_len)
+ sp->c_old_seg = 0;
+ }
+
+ if (++sp->count > MI_CYCLES(mi)) /* pick a new flow */
+ init_euler2d(mi);
+
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_euler2d (ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Euler2D", euler2d)
+
+#endif /* MODE_euler2d */
diff --git a/hacks/euler2d.man b/hacks/euler2d.man
new file mode 100644
index 0000000..ddfd619
--- /dev/null
+++ b/hacks/euler2d.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+euler2d - two dimensional incompressible inviscid fluid flow.
+.SH SYNOPSIS
+.B euler2d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-eulertail \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Simulates two dimensional incompressible inviscid fluid flow.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Particles. 2 - 5000. Default: 1024.
+.TP 8
+.B \-eulertail \fInumber\fP
+Trail Length. 2 - 500. Default: 10.
+.TP 8
+.B \-cycles \fInumber\fP
+Duration. 100 - 5000. Default: 3000.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Stephen Montgomery-Smith. Permission to use,
+copy, modify, distribute, and sell this software and its documentation
+for any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Stephen Montgomery-Smith.
diff --git a/hacks/euler2d.tex b/hacks/euler2d.tex
new file mode 100644
index 0000000..700ad31
--- /dev/null
+++ b/hacks/euler2d.tex
@@ -0,0 +1,337 @@
+\documentclass[12pt]{article}
+
+%\usepackage{fullpage}
+\usepackage{amsmath,amssymb}
+
+\begin{document}
+
+\title{Two Dimensional Euler Simulation}
+
+\author{
+S.J. Montgomery-Smith\\
+Department of Mathematics\\
+University of Missouri\\
+Columbia, MO 65211, U.S.A.\\
+stephen@math.missouri.edu\\
+http://www.math.missouri.edu/\~{}stephen}
+
+\date{September 10, 2000}
+
+\maketitle
+
+This document describes a program I wrote to simulate the
+two dimensional Euler Equation --- a program that is part
+of the {\tt xlock} screensaver as the {\tt euler2d}
+mode. A similar explanation may also be found in the
+book by Chorin \cite{C}.
+
+\section{The Euler Equation}
+
+The Euler Equation describes the motion of an incompressible
+fluid that has no viscosity. If the fluid is contained
+in a domain $\Omega$ with boundary $\partial \Omega$, then
+the equation is in the vector field $u$ (the velocity)
+and the
+scalar field $p$ (the pressure):
+\begin{eqnarray*}
+\frac{\partial}{\partial t} u &=& -u \cdot \nabla u + \nabla p \\
+\nabla \cdot u &=& 0 \\
+u \cdot n &=& 0 \quad \text{on $\partial \Omega$}
+\end{eqnarray*}
+where $n$ is the unit normal to $\partial \Omega$.
+
+\section{Vorticity}
+
+It turns out that it can be easier write these equations
+in terms of the vorticity. In two dimensions the vorticity
+is the scalar $w = \partial u_2/\partial x - \partial u_1/\partial y$.
+The equation for vorticity becomes
+\[ \frac{\partial}{\partial t} w = -u \cdot \nabla w .\]
+A solution to this equation can be written as follows. The velocity
+$u$ causes a flow, that is, a function $\varphi(t,x)$ that tells where
+the particle initially at $x$ ends up at time $t$, that is
+\[
+\frac\partial{\partial t} \varphi(t,x)
+= u(t,\varphi(t,x)) .\]
+Then the equation
+for $w$ tells us that the vorticity is ``pushed'' around by the flow,
+that is, $w(t,\varphi(t,x)) = w(0,x)$.
+
+\section{The Biot-Savart Kernel}
+
+Now, once we have the vorticity, we can recover the velocity $u$ by
+solving the equation
+\begin{eqnarray*}
+\partial u_2/\partial x - \partial u_1/\partial y &=& w \\
+\nabla \cdot u &=& 0 \\
+u \cdot n &=& 0 \quad \text{on $\partial \Omega$}.
+\end{eqnarray*}
+This equation is solved by using a Biot-Savart kernel $K(x,y)$:
+$$ u(x) = \int_\Omega K(x,y) w(y) \, dy .$$
+The function $K$ depends upon the choice of domain. First let us consider
+the case when $\Omega$ is the whole plane (in which case the boundary
+condition $u \cdot n = 0$ is replaced by saying that $u$ decays at infinity).
+Then
+\begin{equation*}
+K(x,y) = K_1(x,y) = c \frac{(x-y)^\perp}{|x-y|^2} .
+\end{equation*}
+Here $x^\perp = (-x_2,x_1)$, and $c$ is a constant, probably something
+like $1/2\pi$. In any case we will set it to be one, which in effect
+is rescaling the time variable, so we don't need to worry about it.
+
+We can use this as a basis to find $K$ on the unit disk
+$\Omega = \Delta = \{x:|x|<1\}$. It turns out to be
+\begin{equation*}
+K_2(x,y) = K_1(x,y) - K_1(x,y^*) ,
+\end{equation*}
+where $y^* = y/|y|^2$ is called the reflection of $y$ about the
+boundary of the unit disk.
+
+Another example is if we have a bijective analytic function
+$p:\Delta \to {\mathbb C}$, and we let $\Omega = p(\Delta)$.
+(Here we think of $\Delta$ as a subset of $\mathbb C$, that is,
+we are identifying the plane with the set of complex numbers.)
+In that case we get
+\[ K_p(p(x),p(y)) = K_2(x,y)/|p'(x)|^2 .\]
+Our simulation considers the last case. Examples of such
+analytic functions include series
+$p(x) = x + \sum_{n=2}^\infty c_n x^n$, where
+$\sum_{n=2}^\infty n |c_n| \le 1$.
+(Thanks to David Ullrich for pointing this out to me.)
+
+\section{The Simulation}
+
+Now let's get to decribing the simulation. We assume a rather
+unusual initial distribution for the vorticity --- that the
+vorticity is a finite sum of dirac delta masses.
+\[ w(0,x) = \sum_{k=1}^N w_k \delta(x-x_k(0)) .\]
+Here $x_k(0)$ is the initial place where the points
+of vorticity are concentrated, with values $w_k$.
+Then at time $t$, the vorticity becomes
+\[ w(t,x) = \sum_{k=1}^N w_k \delta(x-x_k(t)) .\]
+The points of fluid $x_k(t)$ are pushed by the
+flow, that is, $x_k(t) = \varphi(t,x_k(0))$, or
+\[ \frac{\partial}{\partial t} x_k(t) = u(t,x_k(t)) .\]
+Putting this all together, we finally obtain the equations
+\[ \frac{\partial}{\partial t} x_k = \alpha_k \]
+where
+\[ \alpha_k = \sum_{l=1}^N w_l K(x_k,x_l) .\]
+This is the equation that our simulation solves.
+
+In fact, in our case, where the domain is $p(\Delta)$,
+the points are described by points
+$\tilde x_k$, where $x_k = p(\tilde x_k)$. Then
+the equations become
+\begin{eqnarray}
+\label{tildex-p1}
+\frac{\partial}{\partial t} \tilde x_k &=& \tilde\alpha_k \\
+\label{tildex-p2}
+\tilde\alpha_k &=& \frac1{|p'(\tilde x_k)|^2}
+ \sum_{l=1}^N w_l K_2(\tilde x_k,\tilde x_l) .
+\end{eqnarray}
+
+We solve this $2N$ system of equations using standard
+numerical methods, in our case, using the second order midpoint method
+for the first step, and thereafter using the second order Adams-Bashforth
+method. (See for example the book
+by Burden and Faires \cite{BF}).
+
+\section{The Program - Data Structures}
+
+The computer program solves equation (\ref{tildex-p1}), and displays
+the results on the screen, with a boundary. All the information
+for solving the equation and displaying the output is countained
+in the structure {\tt euler2dstruct}. Let us describe some of
+the fields in {\tt euler2dstruct}.
+The points $\tilde x_k$ are contained
+in {\tt double *x}: with the coordinates of
+$\tilde x_k$ being the two numbers
+{\tt x[2*k+0]}, {\tt x[2*k+1]}. The values $w_k$ are contained
+in {\tt double *w}. The total number of points is
+{\tt int N}. (But only the first {\tt int Nvortex} points
+have $w_k \ne 0$.) The coefficients of the analytic function
+(in our case a polynomial) $p$
+are contained in {\tt double p\_coef[2*(deg\_p-1)]} --- here
+{\tt deg\_p} is the degree of $p$, and the real and imaginary
+parts of the coefficient
+$c_n$ is contained in {\tt p\_coef[2*(n-2)+0]} and {\tt p\_coef[2*(n-2)+1]}.
+
+\section{Data Initialization}
+
+The program starts in the function {\tt init\_euler2d}. After allocating
+the memory for the data, and initialising some of the temporary variables
+required for the numerical solving program, it randomly assigns the
+coefficients of $p$, making sure that $\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$.
+Then the program figures out how to draw the boundary, and what rescaling
+of the data is required to draw it on the screen. (This uses the
+function {\tt calc\_p} which calculates $p(x)$.)
+
+Next, it randomly assigns the initial values of $\tilde x_k$. We want
+to do this in such a way so that the points are uniformly spread over the
+domain. Let us first consider the case when the domain is the unit circle
+$\Delta$. In that case the proportion of points that we would expect
+inside the circle of radius $r$ would be proportional to $r^2$. So
+we do it as follows:
+\[ r = \sqrt{R_{0,1}},\quad \theta = R_{-\pi,\pi}, \quad
+ \tilde x_k = r (\cos \theta, \sin \theta) .\]
+Here, and in the rest of this discussion, $R_{a,b}$ is a function
+that returns a random variable uniformly distributed over the interval
+$[a,b]$.
+
+This works fine for $\Delta$, but for $p(\Delta)$, the points
+$p(\tilde x_k)$ are not uniformly distributed over $p(\Delta)$,
+but are distributed with a density proportional to
+$1/|p'(\tilde x_k)|^2$. So to restore the uniform density we need
+to reject this value of $\tilde x_k$ with probability proportional
+to $|p'(\tilde x_k)|^2$. Noticing that the condition
+$\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$ implies that
+$|p'(\tilde x_k)| \le 2$, we
+do this by rejecting if $|p'(\tilde x_k)|^2 < R_{0,4}$.
+(This makes use of the function {\tt calc\_mod\_dp2} which calculates
+$|p'(x)|^2$.)
+
+\section{Solving the Equation}
+
+The main loop of the program is in the function {\tt draw\_euler2d}.
+Most of the drawing operations are contained in this function, and
+the numerical aspects are sent to the function {\tt ode\_solve}.
+But there is an aspect of this that I would like
+to discuss in the next section, and so we will look at a simple method for
+numerically solving differential equations.
+
+The Euler Method
+(nothing to do with the Euler Equation), is as
+follows. Pick a small number $h$ --- the time step (in
+the program call {\tt delta\_t}). Then we approximate
+the solution of the equation:
+\begin{equation}
+\label{method-simple}
+\tilde x_k(t+h) = \tilde x_k(t) + h \tilde\alpha_k(t) .
+\end{equation}
+The more sophisticated methods we use are variations of
+the Euler Method, and so the discussion in the following section
+still applies.
+
+In the program, the quantities $\tilde\alpha_k$, given by
+equations (\ref{tildex-p2}) are calculated by the function
+{\tt derivs}
+(which in turns calls {\tt calc\_all\_mod\_dp2} to
+calculate $|p'(\tilde x_k)|^2$ at all the points).
+
+
+\section{Subtle Perturbation}
+
+Added later: the scheme described here seems to not be that effective,
+so now it is not used.
+
+One problem using a numerical scheme such as the Euler Method occurs
+when the points $\tilde x_k$ get close to the boundary
+of $\Delta$. In that case, it is possible that the new
+points will be pushed outside of the boundary. Even if they
+are not pushed out of the boundary, they may be much closer
+or farther from the boundary than they should be.
+Our system of equations is very sensitive to how close points
+are to the boundary --- points with non-zero vorticity
+(``vortex points'') that are close to the boundary travel
+at great speed alongside the boundary, with speed that is
+inversely proportional to the distance from the boundary.
+
+A way to try to mitigate this problem is something that I call
+``subtle perturbation.''
+We map the points in
+the unit disk to points in the plane using the map
+\begin{equation*}
+F(x) = f(|x|) \frac x{|x|} ,
+\end{equation*}
+where $f:[0,1]\to[0,\infty]$ is an increasing continuous
+bijection. It turns out that a good choice is
+\begin{equation*}
+f(t) = -\log(1-t) .
+\end{equation*}
+(The reason for this is that points close to each other
+that are a distance
+about $r$ from the boundary will be pushed around so that
+their distance from each other is about multiplied by the
+derivative of $\log r$, that is, $1/r$.)
+Note that the inverse of this function is given by
+\begin{equation*}
+F^{-1}(x) = f^{-1}(|x|) \frac x{|x|} ,
+\end{equation*}
+where
+\begin{equation*}
+f^{-1}(t) = 1-e^{-t} .
+\end{equation*}
+
+So what we could do is the following: instead of working with
+the points $\tilde x_k$, we could work instead with the points
+$y_k = F(\tilde x_k)$. In effect this is what we do.
+Instead of performing the computation (\ref{method-simple}),
+we do the calculation
+\begin{equation*}
+y_k = F(\tilde x_k(t)) + h {\cal A}(\tilde x_k) \tilde\alpha_k(t)
+\end{equation*}
+where
+${\cal A}(x)$ is the matrix of partial derivatives of $F$:
+\begin{equation*}
+{\cal A}(x) =
+\frac{f(|x|)}{|x|}
+\left[
+\begin{matrix}
+1 & 0\\
+0 & 1
+\end{matrix}
+\right]
++ \frac1{|x|}
+ \left(\frac{f'(|x|)}{|x|} - \frac{f(|x|)}{|x|^2}\right)
+\left[
+\begin{matrix}
+x_{1}^2 & x_{1} x_{2}\\
+x_{1} x_{2} & x_{2}^2
+\end{matrix}
+\right],
+\end{equation*}
+and then compute
+\begin{equation*}
+\tilde x_k(t+h) = F^{-1}(y_k).
+\end{equation*}
+These calculations are done in the function {\tt perturb}, if
+the quantity {\tt SUBTLE\_PERTURB} is set.
+
+\section{Drawing the Points}
+
+As we stated earlier, most of the drawing functions are contained
+in the function {\tt draw\_euler2d}. If the variable
+{\tt hide\_vortex} is set (and the function {\tt init\_euler2d}
+will set this with probability $3/4$), then we only display
+the points $\tilde x_k$ for ${\tt Nvortex} < k \le N$. If
+{\tt hide\_vortex} is not set, then the ``vortex points''
+$\tilde x_k$ ($1 \le k \le {\tt Nvortex}$) are displayed in white.
+In fact the points $p(\tilde x_k)$ are what are put onto the screen,
+and for this we make use of the function {\tt calc\_all\_p}.
+
+\section{Addition to Program: Changing the Power Law}
+
+A later addition to the program adds an option {\tt eulerpower},
+which allows one to change the power law that describes how
+the vortex points influence other points. In effect, if this
+option is set with the value $m$, then the Biot-Savart Kernel
+is replace by
+$$ K_1(x,y) = \frac{(x-y)^\perp}{|x-y|^{m+1}}, $$
+and
+$$ K_2(x,y) = K_1(x,y) - |y|^{1-m} K_1(x,y) .$$
+So for example, setting $m=2$ corresponds to the
+quasi-geostrophic equation. (I haven't yet figured out
+what $K_p$ should be, so if $m \ne 1$ we use the unit circle
+as the boundary.)
+
+\begin{thebibliography}{9}
+
+\bibitem{BF} Richard L. Burden, J. Douglas Faires, Numerical Analysis,
+sixth edition, Brooks/Cole, 1996.
+
+\bibitem{C} Alexandre J. Chorin, Vorticity and Turbulence,
+Applied Mathematical Sciences, Vol 103, Springer Verlag, 1994.
+
+\end{thebibliography}
+
+\end{document}
diff --git a/hacks/fadeplot.c b/hacks/fadeplot.c
new file mode 100644
index 0000000..93f4719
--- /dev/null
+++ b/hacks/fadeplot.c
@@ -0,0 +1,233 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* fadeplot --- a fading plot of sine squared */
+
+#if 0
+static const char sccsid[] = "@(#)fadeplot.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Some easy plotting stuff, by Bas van Gaalen, Holland, PD
+ *
+ * Copyright (c) 1996 by Charles Vidal
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with screensaver
+ * 1996: Written by Charles Vidal based on work by Bas van Gaalen
+ */
+
+#ifdef STANDALONE
+# define MODE_fadeplot
+# define DEFAULTS "*delay: 30000 \n" \
+ "*count: 10 \n" \
+ "*cycles: 1500 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define BRIGHT_COLORS
+# define UNIFORM_COLORS
+# define release_fadeplot 0
+# define fadeplot_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_fadeplot
+
+ENTRYPOINT ModeSpecOpt fadeplot_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct fadeplot_description =
+{"fadeplot", "init_fadeplot", "draw_fadeplot", (char *) NULL,
+ "refresh_fadeplot", "init_fadeplot", "free_fadeplot", &fadeplot_opts,
+ 30000, 10, 1500, 1, 64, 0.6, "",
+ "Shows a fading plot of sine squared", 0, NULL};
+
+#endif
+
+#define MINSTEPS 1
+
+typedef struct {
+ XPoint speed, step, factor, st;
+ int temps, maxpts, nbstep;
+ int min;
+ int width, height;
+ int pix;
+ int angles;
+ int *stab;
+ XPoint *pts;
+} fadeplotstruct;
+
+static fadeplotstruct *fadeplots = (fadeplotstruct *) NULL;
+
+ENTRYPOINT void
+free_fadeplot(ModeInfo * mi)
+{
+ fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+ if (fp->pts != NULL) {
+ (void) free((void *) fp->pts);
+ fp->pts = (XPoint *) NULL;
+ }
+ if (fp->stab != NULL) {
+ (void) free((void *) fp->stab);
+ fp->stab = (int *) NULL;
+ }
+}
+
+static Bool
+initSintab(ModeInfo * mi)
+{
+ fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+ int i;
+ float x;
+
+ fp->angles = NRAND(950) + 250;
+ if ((fp->stab = (int *) malloc(fp->angles * sizeof (int))) == NULL) {
+ free_fadeplot(mi);
+ return False;
+ }
+ for (i = 0; i < fp->angles; i++) {
+ x = SINF(2.0 * M_PI * i / fp->angles);
+ fp->stab[i] = (int) (x * ABS(x) * fp->min) + fp->min;
+ }
+ return True;
+}
+
+ENTRYPOINT void
+init_fadeplot (ModeInfo * mi)
+{
+ fadeplotstruct *fp;
+
+ MI_INIT (mi, fadeplots);
+ fp = &fadeplots[MI_SCREEN(mi)];
+
+ fp->width = MI_WIDTH(mi);
+ fp->height = MI_HEIGHT(mi);
+ fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
+
+ fp->speed.x = 8;
+ fp->speed.y = 10;
+ fp->step.x = 1;
+ fp->step.y = 1;
+ fp->temps = 0;
+ fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
+ fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
+
+ fp->nbstep = MI_COUNT(mi);
+ if (fp->nbstep < -MINSTEPS) {
+ fp->nbstep = NRAND(-fp->nbstep - MINSTEPS + 1) + MINSTEPS;
+ } else if (fp->nbstep < MINSTEPS)
+ fp->nbstep = MINSTEPS;
+
+ fp->maxpts = MI_CYCLES(mi);
+ if (fp->maxpts < 1)
+ fp->maxpts = 1;
+
+ if (fp->pts == NULL) {
+ if ((fp->pts = (XPoint *) calloc(fp->maxpts, sizeof (XPoint))) ==
+ NULL) {
+ free_fadeplot(mi);
+ return;
+ }
+ }
+ if (MI_NPIXELS(mi) > 2)
+ fp->pix = NRAND(MI_NPIXELS(mi));
+
+ if (fp->stab != NULL)
+ (void) free((void *) fp->stab);
+ if (!initSintab(mi))
+ return;
+ MI_CLEARWINDOW(mi);
+}
+
+ENTRYPOINT void
+draw_fadeplot (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int i, j, temp;
+ fadeplotstruct *fp;
+
+ if (fadeplots == NULL)
+ return;
+ fp = &fadeplots[MI_SCREEN(mi)];
+ if (fp->stab == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin);
+
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, gc, MI_PIXEL(mi, fp->pix));
+ if (++fp->pix >= MI_NPIXELS(mi))
+ fp->pix = 0;
+ } else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+
+ temp = 0;
+ for (j = 0; j < fp->nbstep; j++) {
+ for (i = 0; i < fp->maxpts / fp->nbstep; i++) {
+ fp->pts[temp].x =
+ fp->stab[(fp->st.x + fp->speed.x * j + i * fp->step.x) % fp->angles] *
+ fp->factor.x + fp->width / 2 - fp->min;
+ fp->pts[temp].y =
+ fp->stab[(fp->st.y + fp->speed.y * j + i * fp->step.y) % fp->angles] *
+ fp->factor.y + fp->height / 2 - fp->min;
+ temp++;
+ }
+ }
+ XDrawPoints(display, window, gc, fp->pts, temp, CoordModeOrigin);
+ fp->st.x = (fp->st.x + fp->speed.x) % fp->angles;
+ fp->st.y = (fp->st.y + fp->speed.y) % fp->angles;
+ fp->temps++;
+ if ((fp->temps % (fp->angles / 2)) == 0) {
+ fp->temps = fp->temps % fp->angles * 5;
+ if ((fp->temps % (fp->angles)) == 0)
+ fp->speed.y = (fp->speed.y + 1) % 30 + 1;
+ if ((fp->temps % (fp->angles * 2)) == 0)
+ fp->speed.x = (fp->speed.x) % 20;
+ if ((fp->temps % (fp->angles * 3)) == 0)
+ fp->step.y = (fp->step.y + 1) % 2 + 1;
+
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+reshape_fadeplot(ModeInfo * mi, int width, int height)
+{
+ fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+ fp->width = width;
+ fp->height = height;
+ fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
+ fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
+ fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_fadeplot (ModeInfo * mi)
+{
+}
+#endif
+
+XSCREENSAVER_MODULE ("FadePlot", fadeplot)
+
+#endif /* MODE_fadeplot */
diff --git a/hacks/fadeplot.man b/hacks/fadeplot.man
new file mode 100644
index 0000000..d525afd
--- /dev/null
+++ b/hacks/fadeplot.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fadeplot - draws a waving ribbon following a sinusoidal path.
+.SH SYNOPSIS
+.B fadeplot
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws what looks like a waving ribbon following a sinusoidal path.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Count. 0 - 20. Default: 10.
+.TP 8
+.B \-cycles \fInumber\fP
+How many frames until the shape changes. Default: 1500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Bas van Gaalen and Charles Vidal. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Bas van Gaalen and Charles Vidal.
diff --git a/hacks/fiberlamp.c b/hacks/fiberlamp.c
new file mode 100644
index 0000000..580851a
--- /dev/null
+++ b/hacks/fiberlamp.c
@@ -0,0 +1,474 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* fiberlamp --- A Fiber Optic Lamp */
+
+#if 0
+static const char sccsid[] = "@(#)fiberlamp.c 5.00 2000/11/01 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 2005 by Tim Auckland <tda10.geo@yahoo.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "fiberlamp" shows Fiber Optic Lamp. Since there is no closed-form
+ * solution to the large-amplitude cantilever equation, the flexible
+ * fiber is modeled as a set of descrete nodes.
+ *
+ * Revision History:
+ * 13-Jan-2005: Initial development.
+ */
+
+#ifdef STANDALONE
+#define MODE_fiberlamp
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 500 \n" \
+ "*cycles: 10000 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsTop: true \n" \
+
+# define UNIFORM_COLORS
+# define release_fiberlamp 0
+# define reshape_fiberlamp 0
+# define fiberlamp_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_fiberlamp
+
+ENTRYPOINT ModeSpecOpt fiberlamp_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct fiberlamp_description =
+{"fiberlamp", "init_fiberlamp", "draw_fiberlamp", (char *) NULL,
+ "draw_fiberlamp", "change_fiberlamp", "free_fiberlamp", &fiberlamp_opts,
+ 1000, 500, 10000, 0, 64, 1.0, "", "Shows a Fiber Optic Lamp", 0, NULL};
+
+#endif
+
+#define SPREAD (30.0) /* Angular spread at the base */
+#define SCALE (MI_WIDTH(mi)/2) /* Screen size */
+#define NODES (20L) /* Number of nodes in a fiber. Variable with range
+ 10 .. 30, if desired. High values have
+ stability problems unless you use small DT */
+
+/* Physics parameters. Tune carefully to keep realism and avoid instability*/
+#define DT (0.5) /* Time increment: Low is slow, High is less stable. */
+#define PY (0.12) /* Rigidity: Low droops, High is stiff. */
+#define DAMPING (0.055) /* Damping: Low allows oscillations, High is boring. */
+
+#undef PLAN /* Plan view (for debugging) */
+#undef CHECKCOLORWHEEL /* Plan view with no spread */
+
+#define DRAND(v) (LRAND()/MAXRAND*(v)) /* double random 0 - v */
+
+/* Length of nodes. Uniform except for shorter notes at the tips for
+ colour highlights. Sum from 0..NODES-1 should exactly 1.0 */
+#define LEN(A) ((A<NODES-3) ? 1.0/(NODES-2.5) : 0.25/(NODES-2.5))
+
+
+typedef struct {
+ double phi, phidash;
+ double eta, etadash;
+ double x;
+ double y;
+ double z;
+} nodestruct;
+
+typedef struct {
+ nodestruct *node;
+ XPoint *draw;
+} fiberstruct;
+
+typedef struct {
+ int init;
+ double psi;
+ double dpsi;
+ long count, nfibers;
+ double cx;
+ double rx, ry; /* Coordinates relative to root */
+ fiberstruct *fiber;
+ Bool dbufp;
+ Pixmap buffer; /* Double Buffer */
+ long bright, medium, dim; /* "White" colors */
+} fiberlampstruct;
+
+static fiberlampstruct *fiberlamps = (fiberlampstruct *) NULL;
+
+static void
+change_fiberlamp(ModeInfo * mi)
+{
+ fiberlampstruct *fl;
+ if (fiberlamps == NULL)
+ return;
+ fl = &fiberlamps[MI_SCREEN(mi)];
+ fl->cx = (DRAND(SCALE/4)-SCALE/8)/SCALE; /* Knock the lamp */
+ fl->count = 0; /* Reset counter */
+ if (fl->dbufp) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+}
+
+static void
+free_fiber(fiberlampstruct *fl)
+{
+ if (fl->fiber) {
+ int f;
+
+ for (f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+
+ if (fs->node)
+ free(fs->node);
+ if (fs->draw)
+ free(fs->draw);
+ }
+ free(fl->fiber);
+ fl->fiber = NULL;
+ }
+}
+
+ENTRYPOINT void
+free_fiberlamp(ModeInfo *mi)
+{
+ fiberlampstruct *fl = &fiberlamps[MI_SCREEN(mi)];
+ if (fl->buffer != None && fl->dbufp) {
+ XFreePixmap(MI_DISPLAY(mi), fl->buffer);
+ fl->buffer = None;
+ }
+ free_fiber(fl);
+}
+
+ENTRYPOINT void
+init_fiberlamp(ModeInfo * mi)
+{
+ fiberlampstruct *fl;
+
+ MI_INIT (mi, fiberlamps);
+ fl = &fiberlamps[MI_SCREEN(mi)];
+
+ /* Create or Resize double buffer */
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ fl->dbufp = False;
+#else
+ fl->dbufp = True;
+#endif
+
+ if(fl->buffer != None && fl->buffer != MI_WINDOW(mi) && fl->dbufp)
+ XFreePixmap(MI_DISPLAY(mi), fl->buffer);
+
+ if(fl->dbufp) {
+ fl->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi));
+ if (fl->buffer == None) {
+ free_fiberlamp(mi);
+ return;
+ }
+ } else {
+ fl->buffer = MI_WINDOW(mi);
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if(fl->init) /* Nothing else to do (probably a resize) */
+ return;
+
+ fl->init = True;
+ fl->nfibers = MI_COUNT(mi);
+ /* Allocate fibers */
+ if((fl->fiber =
+ (fiberstruct*) calloc(fl->nfibers, sizeof (fiberstruct))) == NULL) {
+ free_fiberlamp(mi);
+ return;
+ } else {
+ int f;
+ for(f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+ if((fs->node =
+ (nodestruct*) calloc(NODES, sizeof (nodestruct))) == NULL
+ ||(fs->draw =
+ (XPoint*) calloc(NODES, sizeof (XPoint))) == NULL) {
+ free_fiberlamp(mi);
+ return;
+ }
+ }
+ }
+
+ {
+ int f, i;
+ for(f = 0; f < fl->nfibers; f++) {
+ double phi = M_PI/180 * DRAND(SPREAD);
+ double eta = DRAND(2*M_PI) - M_PI;
+ for(i = 0; i < NODES; i++) {
+ nodestruct *n = &fl->fiber[f].node[i];
+ n->phi = phi;
+ n->phidash = 0;
+ n->eta = eta;
+ n->etadash = 0;
+ }
+ fl->fiber[f].node[0].etadash = 0.002/DT;
+ fl->fiber[f].node[0].y = 0;
+ fl->fiber[f].node[0].z = 0;
+ }
+
+ }
+
+ /* Set up rotation */
+ fl->psi = DRAND(2*M_PI);
+ fl->dpsi = 0.01;
+
+ /* no "NoExpose" events from XCopyArea wanted */
+ XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
+
+ /* Make sure we're using 'thin' lines */
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast,
+ JoinMiter);
+#ifdef CHECKCOLORWHEEL
+ /* Only interested in tips, leave the rest black */
+ fl->bright = fl->medium = fl->dim = MI_BLACK_PIXEL(mi);
+#else
+ if(MI_NPIXELS(mi) > 2) {
+ /* Set up colours for the fiber bodies. Tips handled seperately */
+ XColor c, t;
+ if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#E0E0C0", &c, &t)){
+ fl->bright = c.pixel;
+ } else {
+ fl->bright = MI_WHITE_PIXEL(mi);
+ }
+ if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#808070", &c, &t)){
+ fl->medium = c.pixel;
+ } else {
+ fl->medium = MI_WHITE_PIXEL(mi);
+ }
+ if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#404020", &c, &t)){
+ fl->dim = c.pixel;
+ } else {
+ fl->dim = MI_BLACK_PIXEL(mi);
+ }
+ } else {
+ fl->bright = MI_WHITE_PIXEL(mi);
+ fl->medium = MI_WHITE_PIXEL(mi);
+ fl->dim = MI_BLACK_PIXEL(mi);
+ }
+#endif
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+ change_fiberlamp(mi);
+}
+
+/* sort fibers so they get drawn back-to-front, one bubble pass is
+ enough as the order only changes slowly */
+static void
+sort_fibers(fiberlampstruct *fl)
+{
+ int i;
+
+ for(i = 1; i < fl->nfibers; i++) {
+ if (fl->fiber[i - 1].node[NODES - 1].z > fl->fiber[i].node[NODES - 1].z) {
+ fiberstruct tmp = fl->fiber[i - 1];
+ fl->fiber[i - 1] = fl->fiber[i];
+ fl->fiber[i] = tmp;
+ }
+ }
+}
+
+ENTRYPOINT void
+draw_fiberlamp (ModeInfo * mi)
+{
+ fiberlampstruct *fl;
+ int f, i;
+ int x, y;
+ int ww, hh;
+ Window unused;
+ short cx, cy;
+
+ ww = MI_WIDTH(mi);
+ hh = MI_HEIGHT(mi);
+
+ cx = MI_WIDTH(mi)/2;
+#if defined PLAN || defined CHECKCOLORWHEEL
+ cy = MI_HEIGHT(mi)/2;
+#else
+ cy = MI_HEIGHT(mi);
+#endif
+
+ if (ww > hh * 5 || /* window has weird aspect */
+ hh > ww * 5)
+ {
+ if (ww > hh)
+ {
+ hh = ww;
+ cy = hh / 4;
+ }
+ else
+ {
+ ww = hh;
+ cx = 0;
+ cy = hh*3/4;
+ }
+ }
+
+ if (fiberlamps == NULL)
+ return;
+ fl = &fiberlamps[MI_SCREEN(mi)];
+
+ fl->psi += fl->dpsi; /* turn colorwheel */
+
+ XTranslateCoordinates(MI_DISPLAY(mi), MI_WINDOW(mi),
+ RootWindow(MI_DISPLAY(mi),0/*#### MI_SCREEN(mi)*/),
+ cx, cy, &x, &y, &unused);
+ sort_fibers(fl);
+
+ for(f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+
+ fs->node[0].eta += DT*fs->node[0].etadash;
+ fs->node[0].x = fl->cx; /* Handle center movement */
+ /* Handle window move. NOTE, only x is deflected, since y doesn't
+ directly affect the physics */
+ fs->node[NODES-2].x *= 0.1*(fl->ry - y);
+ fs->node[NODES-2].x += 0.05*(fl->rx - x);
+
+ /* 2nd order diff equation */
+ for(i = 1; i < NODES; i++) {
+ nodestruct *n = fs->node+i;
+ nodestruct *p = fs->node+i-1;
+ double pload = 0;
+ double eload = 0;
+ double pstress = (n->phi - p->phi)*PY;
+ double estress = (n->eta - p->eta)*PY;
+ double dxi = n->x - p->x;
+ double dzi = n->z - p->z;
+ double li = sqrt(dxi*dxi + dzi*dzi)/LEN(i);
+ double drag = DAMPING*LEN(i)*LEN(i)*NODES*NODES;
+
+ if(li > 0) {
+ int j;
+ for(j = i+1; j < NODES; j++) {
+ nodestruct *nn = fs->node+j;
+ double dxj = nn->x - n->x;
+ double dzj = nn->z - n->z;
+
+ pload += LEN(j)*(dxi*dxj + dzi*dzj)/li; /* Radial load */
+ eload += LEN(j)*(dxi*dzj - dzi*dxj)/li; /* Transverse load */
+ /* Not a perfect simulation: in reality the transverse load
+ is only indirectly coupled to the eta deflection, but of
+ all the approaches I've tried this produces the most
+ stable model and looks the most realistic. */
+ }
+ }
+
+#ifndef CHECKCOLORWHEEL
+ n->phidash += DT*(pload - pstress - drag*n->phidash)/LEN(i);
+ n->phi += DT*n->phidash;
+#endif
+
+ n->etadash += DT*(eload - estress - drag*n->etadash)/LEN(i);
+ n->eta += DT*n->etadash;
+
+ {
+ double sp = sin(p->phi);
+ double cp = cos(p->phi);
+ double se = sin(p->eta);
+ double ce = cos(p->eta);
+
+ n->x = p->x + LEN(i-1) * ce * sp;
+ n->y = p->y - LEN(i-1) * cp;
+ n->z = p->z + LEN(i-1) * se * sp;
+ }
+
+ fs->draw[i-1].x = cx + ww/2*n->x;
+#if defined PLAN || defined CHECKCOLORWHEEL /* Plan */
+ fs->draw[i-1].y = cy + ww/2*n->z;
+#else /* Elevation */
+ fs->draw[i-1].y = cy + ww/2*n->y;
+#endif
+ }
+ MI_IS_DRAWN(mi) = True;
+
+ /* Erase: this may only be erasing an off-screen buffer, but on a
+ slow system it may still be faster than XFillRectangle() */
+ /* That's unpossible. -jwz */
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+ 0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ for(f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+
+ {
+ double x = fs->node[1].x - fl->cx + 0.025;
+ double y = fs->node[1].z + 0.02;
+ double angle = atan2(y, x) + fl->psi;
+ long tipcolor = (int)(MI_NPIXELS(mi)*angle/(2*M_PI)) % MI_NPIXELS(mi);
+ long fibercolor;
+ long tiplen;
+
+ if (tipcolor < 0) tipcolor += MI_NPIXELS(mi);
+ tipcolor = MI_PIXEL(mi, tipcolor);
+
+ if(fs->node[1].z < 0.0) { /* Back */
+ tiplen = 2;
+ fibercolor = fl->dim;
+ }else if(fs->node[NODES-1].z < 0.7) { /* Middle */
+ tiplen = 3;
+ fibercolor = fl->medium;
+ } else { /* Front */
+ tiplen = 3;
+ fibercolor = fl->bright;
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), fibercolor);
+ XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+ fs->draw, NODES-tiplen, CoordModeOrigin);
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), tipcolor);
+ XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+ fs->draw+NODES-1-tiplen, tiplen, CoordModeOrigin);
+ }
+ }
+
+ /* Update the screen from the double-buffer */
+ if (fl->dbufp)
+ XCopyArea(MI_DISPLAY(mi), fl->buffer, MI_WINDOW(mi), MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi), 0, 0);
+
+ fl->rx = x;
+ fl->ry = y;
+
+ if(fl->count++ > MI_CYCLES(mi)) {
+ change_fiberlamp(mi);
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_fiberlamp(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Fiberlamp", fiberlamp)
+
+#endif /* MODE_fiberlamp */
diff --git a/hacks/fiberlamp.man b/hacks/fiberlamp.man
new file mode 100644
index 0000000..da0d4f4
--- /dev/null
+++ b/hacks/fiberlamp.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fiberlamp - Fiber Optic Lamp
+.SH SYNOPSIS
+.B fiberlamp
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Displays a Fiber Optic Lamp.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Number of Fibers. 10 - 500. Default: 500.
+.TP 8
+.B \-cycles \fInumber\fP
+Number of cycles before the lamp is knocked sideways. 100 - 10000.
+Default: 10000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Tim Auckland. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tim Auckland.
diff --git a/hacks/filmleader.c b/hacks/filmleader.c
new file mode 100644
index 0000000..ef021e1
--- /dev/null
+++ b/hacks/filmleader.c
@@ -0,0 +1,571 @@
+/* filmleader, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Simulate an SMPTE Universal Film Leader playing on an analog television.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "xft.h" /* before screenhack.h */
+
+#include "screenhack.h"
+#include "analogtv.h"
+
+#include <time.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int w, h;
+ unsigned long bg, text_color, ring_color, trace_color;
+ XftColor xft_text_color_1, xft_text_color_2;
+
+ XftFont *font, *font2, *font3;
+ XftDraw *xftdraw;
+ Pixmap pix;
+ GC gc;
+ double start, last_time;
+ double value;
+ int stop;
+ double noise;
+ analogtv *tv;
+ analogtv_input *inp;
+ analogtv_reception rec;
+ Bool button_down_p;
+};
+
+
+static void *
+filmleader_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->tv = analogtv_allocate (st->dpy, st->window);
+ analogtv_set_defaults (st->tv, "");
+ st->tv->need_clear = 1;
+ st->inp = analogtv_input_allocate();
+ analogtv_setup_sync (st->inp, 1, 0);
+ st->rec.input = st->inp;
+ st->rec.level = 2.0;
+ st->tv->use_color = 1;
+ st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
+ st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
+ st->tv->powerup = 0;
+
+ st->rec.multipath = 0.0;
+ st->tv->color_control += frand(0.3);
+ st->noise = get_float_resource (st->dpy, "noise", "Float");
+ st->value = 18; /* Leave time for powerup */
+ st->stop = 2 + (random() % 5);
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ /* Let's render it into a 16:9 pixmap, since that's what most screens are
+ these days. That means the circle will be squashed on 4:3 screens. */
+ {
+ double r = 16/9.0;
+
+# ifdef HAVE_MOBILE
+ /* analogtv.c always fills whole screen on mobile, so use screen aspect. */
+ r = st->xgwa.width / (double) st->xgwa.height;
+ if (r < 1) r = 1/r;
+# endif
+
+ st->w = 712;
+ st->h = st->w / r;
+ }
+
+ if (st->xgwa.width < st->xgwa.height)
+ {
+ int swap = st->w;
+ st->w = st->h;
+ st->h = swap;
+ }
+
+ st->pix = XCreatePixmap (dpy, window,
+ st->w > st->h ? st->w : st->h,
+ st->w > st->h ? st->w : st->h,
+ st->xgwa.depth);
+ st->gc = XCreateGC (dpy, st->pix, 0, &gcv);
+
+ st->xftdraw = XftDrawCreate (dpy, st->pix, st->xgwa.visual,
+ st->xgwa.colormap);
+ st->font = load_xft_font_retry (dpy, screen_number (st->xgwa.screen),
+ get_string_resource (dpy, "numberFont",
+ "Font"));
+ st->font2 = load_xft_font_retry (dpy, screen_number (st->xgwa.screen),
+ get_string_resource (dpy, "numberFont2",
+ "Font"));
+ st->font3 = load_xft_font_retry (dpy, screen_number (st->xgwa.screen),
+ get_string_resource (dpy, "numberFont3",
+ "Font"));
+
+ st->bg = get_pixel_resource (dpy, st->xgwa.colormap,
+ "textBackground", "Background");
+ st->text_color = get_pixel_resource (dpy, st->xgwa.colormap,
+ "textColor", "Foreground");
+ st->ring_color = get_pixel_resource (dpy, st->xgwa.colormap,
+ "ringColor", "Foreground");
+ st->trace_color = get_pixel_resource (dpy, st->xgwa.colormap,
+ "traceColor", "Foreground");
+
+ XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap,
+ get_string_resource (dpy, "textColor", "Foreground"),
+ &st->xft_text_color_1);
+ XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap,
+ get_string_resource (dpy, "textBackground", "Background"),
+ &st->xft_text_color_2);
+
+ return st;
+}
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static unsigned long
+filmleader_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ const analogtv_reception *rec = &st->rec;
+ double then = double_time(), now, timedelta;
+ XImage *img;
+ int i, x, y, w2, h2;
+ XGlyphInfo extents;
+ int lbearing, rbearing, ascent, descent;
+ char s[20];
+ double r = 1 - (st->value - (int) st->value);
+ int ivalue = st->value;
+ XftFont *xftfont;
+ XftColor *xftcolor;
+
+ /* You may ask, why use Xft for this instead of the much simpler XDrawString?
+ Well, for some reason, XLoadQueryFont is giving me horribly-scaled bitmap
+ fonts, but Xft works properly. So perhaps in This Modern World, if one
+ expects large fonts to work, one must use Xft instead of Xlib?
+
+ Everything is terrible.
+ */
+
+ const struct { double t; int k, f; const char * const s[4]; } blurbs[] = {
+ { 9.1, 3, 1, { "PICTURE", " START", 0, 0 }},
+ { 10.0, 2, 1, { " 16", "SOUND", "START", 0 }},
+ { 10.5, 2, 1, { " 32", "SOUND", "START", 0 }},
+ { 11.6, 2, 0, { "PICTURE", "COMPANY", "SERIES", 0 }},
+ { 11.7, 2, 0, { "XSCRNSAVER", 0, 0, 0 }},
+ { 11.9, 2, 0, { "REEL No.", "PROD No.", "PLAY DATE", 0 }},
+ { 12.2, 0, 0, { " SMPTE ", "UNIVERSAL", " LEADER", 0 }},
+ { 12.3, 0, 1, { "X ", "X", "X", "X" }},
+ { 12.4, 0, 0, { " SMPTE ", "UNIVERSAL", " LEADER", 0 }},
+ { 12.5, 3, 1, { "PICTURE", 0, 0, 0 }},
+ { 12.7, 3, 1, { "HEAD", 0, 0, 0 }},
+ { 12.8, 2, 1, { "OOOO", 0, "ASPECT", "TYPE OF" }},
+ { 12.9, 2, 0, { "SOUND", 0, "RATIO", 0 }},
+ { 13.2, 1, 1, { " ", "PICTURE", 0, 0 }},
+ { 13.3, 1, 0, { "REEL No. ", "COLOR", 0, 0 }},
+ { 13.4, 1, 0, { "LENGTH ", 0, 0, "ROLL" }},
+ { 13.5, 1, 0, { "SUBJECT", 0, 0, 0 }},
+ { 13.9, 1, 1, { " \342\206\221", "SPLICE", " HERE", 0 }},
+ };
+
+ for (i = 0; i < countof(blurbs); i++)
+ {
+ if (st->value >= blurbs[i].t && st->value <= blurbs[i].t + 1/15.0)
+ {
+ int line_height;
+ int j;
+ xftfont = (blurbs[i].f == 1 ? st->font2 :
+ blurbs[i].f == 2 ? st->font : st->font3);
+
+ XSetForeground (dpy, st->gc,
+ blurbs[i].k == 3 ? st->bg : st->text_color);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+ XSetForeground (dpy, st->gc,
+ blurbs[i].k == 3 ? st->text_color : st->bg);
+ xftcolor = (blurbs[i].k == 3 ?
+ &st->xft_text_color_1 : &st->xft_text_color_2);
+
+ /* The height of a string of spaces is 0... */
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) "My", 2, &extents);
+ line_height = extents.height;
+
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *)
+ blurbs[i].s[0], strlen(blurbs[i].s[0]),
+ &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = (st->w - rbearing) / 2;
+ y = st->h * 0.1 + ascent;
+
+ for (j = 0; j < countof(blurbs[i].s); j++)
+ {
+ if (blurbs[i].s[j])
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) blurbs[i].s[j],
+ strlen(blurbs[i].s[j]));
+
+ y += line_height * 1.5;
+
+ if (blurbs[i].s[j])
+ {
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *)
+ blurbs[i].s[0], strlen(blurbs[i].s[j]),
+ &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+ }
+ }
+
+ if (blurbs[i].k == 2) /* Rotate clockwise and flip */
+ {
+ int wh = st->w < st->h ? st->w : st->h;
+ XImage *img1 = XGetImage (dpy, st->pix,
+ (st->w - wh) / 2,
+ (st->h - wh) / 2,
+ wh, wh, ~0L, ZPixmap);
+ XImage *img2 = XCreateImage (dpy, st->xgwa.visual,
+ st->xgwa.depth, ZPixmap, 0, 0,
+ wh, wh, 32, 0);
+ img2->data = malloc (img2->bytes_per_line * img2->height);
+ for (y = 0; y < wh; y++)
+ for (x = 0; x < wh; x++)
+ XPutPixel (img2, y, x, XGetPixel (img1, x, y));
+ XSetForeground (dpy, st->gc,
+ blurbs[i].k == 3 ? st->bg : st->text_color);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+ XPutImage (dpy, st->pix, st->gc, img2,
+ 0, 0,
+ (st->w - wh) / 2,
+ (st->h - wh) / 2,
+ wh, wh);
+ XDestroyImage (img1);
+ XDestroyImage (img2);
+ }
+ else if (blurbs[i].k == 1) /* Flip vertically */
+ {
+ XImage *img1 = XGetImage (dpy, st->pix, 0, 0,
+ st->w, st->h, ~0L, ZPixmap);
+ XImage *img2 = XCreateImage (dpy, st->xgwa.visual,
+ st->xgwa.depth, ZPixmap, 0, 0,
+ st->w, st->h, 32, 0);
+ img2->data = malloc (img2->bytes_per_line * img2->height);
+ for (y = 0; y < img2->height; y++)
+ for (x = 0; x < img2->width; x++)
+ XPutPixel (img2, x, img2->height-y-1,
+ XGetPixel (img1, x, y));
+ XPutImage (dpy, st->pix, st->gc, img2, 0, 0, 0, 0, st->w, st->h);
+ XDestroyImage (img1);
+ XDestroyImage (img2);
+ }
+
+ goto DONE;
+ }
+ }
+
+ if (st->value < 2.0 || st->value >= 9.0) /* Black screen */
+ {
+ XSetForeground (dpy, st->gc, st->text_color);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+ goto DONE;
+ }
+
+ XSetForeground (dpy, st->gc, st->bg);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+
+ if (r > 1/30.0) /* Sweep line and background */
+ {
+ x = st->w/2 + st->w * cos (M_PI * 2 * r - M_PI/2);
+ y = st->h/2 + st->h * sin (M_PI * 2 * r - M_PI/2);
+
+ XSetForeground (dpy, st->gc, st->trace_color);
+ XFillArc (dpy, st->pix, st->gc,
+ -st->w, -st->h, st->w*3, st->h*3,
+ 90*64,
+ 90*64 - ((r + 0.25) * 360*64));
+
+ XSetForeground (dpy, st->gc, st->text_color);
+ XSetLineAttributes (dpy, st->gc, 1, LineSolid, CapRound, JoinRound);
+ XDrawLine (dpy, st->pix, st->gc, st->w/2, st->h/2, x, y);
+
+ XSetForeground (dpy, st->gc, st->text_color);
+ XSetLineAttributes (dpy, st->gc, 2, LineSolid, CapRound, JoinRound);
+ XDrawLine (dpy, st->pix, st->gc, st->w/2, 0, st->w/2, st->h);
+ XDrawLine (dpy, st->pix, st->gc, 0, st->h/2, st->w, st->h/2);
+ }
+
+ /* Big number */
+
+ s[0] = (char) (ivalue + '0');
+ xftfont = st->font;
+ xftcolor = &st->xft_text_color_1;
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, 1, &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = (st->w - (rbearing + lbearing)) / 2;
+ y = (st->h + (ascent - descent)) / 2;
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y, (FcChar8 *) s, 1);
+
+ /* Annotations on 7 and 4 */
+
+ if ((st->value >= 7.75 && st->value <= 7.85) ||
+ (st->value >= 4.00 && st->value <= 4.25))
+ {
+ XSetForeground (dpy, st->gc, st->ring_color);
+ xftcolor = &st->xft_text_color_2;
+ xftfont = st->font2;
+
+ s[0] = (ivalue == 4 ? 'C' : 'M');
+ s[1] = 0;
+
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, strlen(s), &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = st->w * 0.1;
+ y = st->h * 0.1 + ascent;
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+ x = st->w * 0.9 - (rbearing + lbearing);
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+
+ s[0] = (ivalue == 4 ? 'F' : '3');
+ s[1] = (ivalue == 4 ? 0 : '5');
+ s[2] = 0;
+
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, strlen(s), &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = st->w * 0.1;
+ y = st->h * 0.95;
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+ x = st->w * 0.9 - (rbearing + lbearing);
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+ }
+
+ if (r > 1/30.0) /* Two rings around number */
+ {
+ double r2 = st->w / (double) st->h;
+ double ss = 1;
+
+ if (st->xgwa.width < st->xgwa.height)
+ ss = 0.5;
+
+ XSetForeground (dpy, st->gc, st->ring_color);
+ XSetLineAttributes (dpy, st->gc, st->w * 0.025,
+ LineSolid, CapRound, JoinRound);
+
+ w2 = st->w * 0.8 * ss / r2;
+ h2 = st->h * 0.8 * ss;
+ x = (st->w - w2) / 2;
+ y = (st->h - h2) / 2;
+ XDrawArc (dpy, st->pix, st->gc, x, y, w2, h2, 0, 360*64);
+
+ w2 = w2 * 0.8;
+ h2 = h2 * 0.8;
+ x = (st->w - w2) / 2;
+ y = (st->h - h2) / 2;
+ XDrawArc (dpy, st->pix, st->gc, x, y, w2, h2, 0, 360*64);
+ }
+
+ DONE:
+
+ img = XGetImage (dpy, st->pix, 0, 0, st->w, st->h, ~0L, ZPixmap);
+
+ analogtv_load_ximage (st->tv, st->rec.input, img, 0, 0, 0, 0, 0);
+ analogtv_reception_update (&st->rec);
+ analogtv_draw (st->tv, st->noise, &rec, 1);
+
+ XDestroyImage (img);
+
+ now = double_time();
+ timedelta = (1 / 29.97) - (now - then);
+
+ if (! st->button_down_p)
+ {
+ if (st->last_time == 0)
+ st->start = then;
+ else
+ st->value -= then - st->last_time;
+
+ if (st->value <= 0 ||
+ (r > 0.9 && st->value <= st->stop))
+ {
+ st->value = (random() % 20) ? 8.9 : 15;
+ st->stop = ((random() % 50) ? 2 : 1) + (random() % 5);
+
+ if (st->value > 9) /* Spin the knobs again */
+ {
+ st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
+ st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
+ st->tv->color_control += frand(0.3) - 0.15;
+ }
+ }
+ }
+
+ st->tv->powerup = then - st->start;
+ st->last_time = then;
+
+ return timedelta > 0 ? timedelta * 1000000 : 0;
+}
+
+
+static void
+filmleader_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_reconfigure (st->tv);
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ if ((st->w > st->h) != (st->xgwa.width > st->xgwa.height))
+ {
+ int swap = st->w;
+ st->w = st->h;
+ st->h = swap;
+ }
+}
+
+
+static Bool
+filmleader_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->xany.type == ButtonPress)
+ {
+ st->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ st->button_down_p = False;
+ return True;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ {
+ st->value = 15;
+ st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
+ st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
+ st->tv->color_control += frand(0.3) - 0.15;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c >= '2' && c <= '8')
+ {
+ st->value = (c - '0') + (st->value - (int) st->value);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+static void
+filmleader_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_release (st->tv);
+ XftDrawDestroy (st->xftdraw);
+ XftColorFree(dpy, st->xgwa.visual, st->xgwa.colormap, &st->xft_text_color_1);
+ XftColorFree(dpy, st->xgwa.visual, st->xgwa.colormap, &st->xft_text_color_2);
+ XFreePixmap (dpy, st->pix);
+ XFreeGC (dpy, st->gc);
+ free (st);
+}
+
+
+static const char *filmleader_defaults [] = {
+
+ ".background: #000000",
+
+# ifdef HAVE_MOBILE
+
+ "*textBackground: #444488", /* Need much higher contrast for some reason */
+ "*textColor: #000033",
+ "*ringColor: #DDDDFF",
+ "*traceColor: #222244",
+
+# else /* X11 or Cocoa */
+
+ "*textBackground: #9999DD",
+ "*textColor: #000015",
+ "*ringColor: #DDDDFF",
+ "*traceColor: #555577",
+
+# endif
+
+# ifdef USE_IPHONE
+
+ "*numberFont: Helvetica Bold 120",
+ "*numberFont2: Helvetica 36",
+ "*numberFont3: Helvetica 28",
+
+# else /* X11, Cocoa or Android */
+
+ "*numberFont: -*-helvetica-bold-r-*-*-*-1700-*-*-*-*-*-*",
+ "*numberFont2: -*-helvetica-medium-r-*-*-*-500-*-*-*-*-*-*",
+ "*numberFont3: -*-helvetica-medium-r-*-*-*-360-*-*-*-*-*-*",
+
+# endif
+
+
+ "*noise: 0.04",
+ ANALOGTV_DEFAULTS
+ "*geometry: 1280x720",
+ 0
+};
+
+static XrmOptionDescRec filmleader_options [] = {
+ { "-noise", ".noise", XrmoptionSepArg, 0 },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("FilmLeader", filmleader)
diff --git a/hacks/filmleader.man b/hacks/filmleader.man
new file mode 100644
index 0000000..4a98270
--- /dev/null
+++ b/hacks/filmleader.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+filmleader - screen saver.
+.SH SYNOPSIS
+.B filmleader
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-tv-color \fInumber\fP]
+[\-tv-tint \fInumber\fP]
+[\-noise \fInumber\fP]
+[\-tv-brightness \fInumber\fP]
+[\-tv-contrast \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Displays a looping countdown based on the SMPTE Universal Film leader on a
+simulation of an old analog television.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-tv-color \fInumber\fP
+Color Knob. 0 - 1000. Default: 70.
+.TP 8
+.B \-tv-tint \fInumber\fP
+Tint Knob. 0 - 100. Default: 5.
+.TP 8
+.B \-noise \fInumber\fP
+Noise. 0.0 - 0.2. Default: 0.04.
+.TP 8
+.B \-tv-brightness \fInumber\fP
+Brightness Knob. 0 - 200. Default: 150.
+.TP 8
+.B \-tv-contrast \fInumber\fP
+Contrast Knob. 0 - 1500. Default: 1000.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/fireworkx.c b/hacks/fireworkx.c
new file mode 100644
index 0000000..faf3745
--- /dev/null
+++ b/hacks/fireworkx.c
@@ -0,0 +1,868 @@
+/*
+ Fireworkx 2.2 - Pyrotechnic explosions simulation,
+ an eyecandy, live animating colorful fireworks super-blasts..!
+ Copyright (GPL) 1999-2013 Rony B Chandran <ronybc@gmail.com>
+
+ From Kerala, INDIA
+ Website: http://www.ronybc.com
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+
+ 2004-OCT: ronybc: Landed on Xscreensaver..!
+ 2012-DEC: ronybc: Almost rewrite of the last version (>4 years old)
+ with SSE2 optimization, colored light flashes,
+ HSV color and many visual and speed improvements.
+
+ Additional coding:
+ ---------------------------------------------------------------------------------
+ Support for different display color modes: put_image()
+ Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
+
+ Fixed array access problems by beating on it with a large hammer.
+ Nicholas Miell <nmiell@gmail.com>
+
+ Help 'free'ing up of memory with needed 'XSync's.
+ Renuka S <renuka@ronybc.com>
+ Rugmini R Chandran <rugmini@ronybc.com>
+\
+ */
+
+#include "screenhack.h"
+
+#ifdef __SSE2__
+# include <emmintrin.h>
+#endif
+
+#define FWXVERSION "2.2"
+
+#define WIDTH 1024 /* 888 */
+#define HEIGHT 632 /* 548 */
+#define SHELLCOUNT 4 /* FIXED NUMBER; for SSE optimization */
+#define PIXCOUNT 500 /* 500 */
+#define SHELL_LIFE_DEFAULT 32 /* 32 */
+#define SHELL_LIFE_RATIO 6 /* 6 */
+#define POWDER 5.0 /* 5.0 */
+#define FTWEAK 12 /* 12 */
+#define FLASH_ZOOM 0.8 /* 1.0 */
+#define G_ACCELERATION 0.001 /* GRAVITY */
+
+typedef struct
+{
+ unsigned int burn;
+ float x, y;
+ float xv, yv;
+} firepix;
+
+typedef struct
+{
+ unsigned int cx, cy;
+ unsigned int seq_number, life;
+ unsigned int bicolor, flies, hshift, vshift;
+ unsigned int mortar_fired, explode_y;
+ float air_drag, vshift_phase;
+ float flash_r, flash_g, flash_b;
+ unsigned int h;
+ double s, v;
+ unsigned char r, g, b;
+ firepix *fpix;
+} fireshell;
+
+struct state
+{
+ unsigned int fps_on;
+ unsigned int flash_on;
+ unsigned int shoot;
+ unsigned int verbose;
+ unsigned int width;
+ unsigned int height;
+ unsigned int fullscreen;
+ unsigned int max_shell_life;
+ unsigned int delay;
+ float flash_fade;
+ float *light_map;
+ unsigned char *palaka1;
+ unsigned char *palaka2;
+ void *mem1;
+ void *mem2;
+ fireshell *fireshell_array;
+
+ Display *dpy;
+ Window window;
+ XImage *xim;
+ GC gc;
+ XColor *colors;
+ int depth;
+ int bigendian;
+ int ncolors;
+ Bool button_down_p;
+ int deferred;
+
+};
+
+/*
+ will return zero.. divide with care.
+*/
+static unsigned int rnd(unsigned int x)
+{
+ return(random() % x);
+}
+
+static void fs_roll_rgb(fireshell *fs)
+{
+ unsigned short r, g, b;
+ hsv_to_rgb (fs->h, fs->s, fs->v, &r, &g, &b);
+ fs->r = (unsigned char) (r >> 8);
+ fs->g = (unsigned char) (g >> 8);
+ fs->b = (unsigned char) (b >> 8);
+}
+
+static void mix_colors(fireshell *fs)
+{
+ float flash;
+ fs->h = rnd(360);
+ fs->s = frand(0.4) + 0.6;
+ fs->v = 1.0;
+ fs_roll_rgb(fs);
+
+ flash = rnd(444) + 111; /* Mega Jouls ! */
+ fs->flash_r = fs->r * flash;
+ fs->flash_g = fs->g * flash;
+ fs->flash_b = fs->b * flash;
+}
+
+static void render_light_map(struct state *st, fireshell *fs)
+{
+ signed int x, y, v = 0;
+ for (y = 0, v = fs->seq_number; y < st->height; y += 2)
+ {
+ for (x = 0; x < st->width; x += 2, v += SHELLCOUNT)
+ {
+ double f;
+ f = sqrt((fs->cx - x) * (fs->cx - x) + (fs->cy - y) * (fs->cy - y)) + 4.0;
+ f = FLASH_ZOOM / f;
+ f += pow(f,0.1) * frand(0.0001); /* dither */
+ st->light_map[v] = f;
+ }
+ }
+}
+
+static void recycle(struct state *st, fireshell *fs, unsigned int x, unsigned int y)
+{
+ unsigned int n, pixlife;
+ firepix *fp = fs->fpix;
+ fs->mortar_fired = st->shoot;
+ fs->explode_y = y;
+ fs->cx = x;
+ fs->cy = st->shoot ? st->height : y ;
+ fs->life = rnd(st->max_shell_life) + (st->max_shell_life/SHELL_LIFE_RATIO);
+ fs->life += !rnd(25) ? st->max_shell_life * 5 : 0;
+ fs->air_drag = 1.0 - (float)(rnd(200)) / (10000.0 + fs->life);
+ fs->bicolor = !rnd(5) ? 120 : 0;
+ fs->flies = !rnd(10) ? 1 : 0; /* flies' motion */
+ fs->hshift = !rnd(5) ? 1 : 0; /* hue shifting */
+ fs->vshift = !rnd(10) ? 1 : 0; /* value shifting */
+ fs->vshift_phase = M_PI/2.0;
+ pixlife = rnd(fs->life) + fs->life / 10 + 1; /* ! */
+ for (n = 0; n < PIXCOUNT; n++)
+ {
+ fp->burn = rnd(pixlife) + 32;
+ fp->xv = frand(2.0) * POWDER - POWDER;
+ fp->yv = sqrt(POWDER * POWDER - fp->xv * fp->xv) * (frand(2.0) - 1.0);
+ fp->x = x;
+ fp->y = y;
+ fp++;
+ }
+ mix_colors(fs);
+ render_light_map(st, fs);
+}
+
+static void recycle_oldest(struct state *st, unsigned int x, unsigned int y)
+{
+ unsigned int n;
+ fireshell *fs, *oldest;
+ fs = oldest = st->fireshell_array;
+ for (n = 0; n < SHELLCOUNT; n++)
+ {
+ if(fs[n].life < oldest->life) oldest = &fs[n];
+ }
+ recycle(st, oldest, x, y);
+}
+
+static void rotate_hue(fireshell *fs, int dh)
+{
+ fs->h = fs->h + dh;
+ fs->s = fs->s - 0.001;
+ fs_roll_rgb(fs);
+}
+
+static void wave_value(fireshell *fs)
+{
+ fs->vshift_phase = fs->vshift_phase + 0.008;
+ fs->v = fabs(sin(fs->vshift_phase));
+ fs_roll_rgb(fs);
+}
+
+static int explode(struct state *st, fireshell *fs)
+{
+ float air_drag;
+ unsigned int n;
+ unsigned int h = st->height;
+ unsigned int w = st->width;
+ unsigned char r, g, b;
+ unsigned char *prgba;
+ unsigned char *palaka = st->palaka1;
+ firepix *fp = fs->fpix;
+ if (fs->mortar_fired)
+ {
+ if (--fs->cy == fs->explode_y)
+ {
+ fs->mortar_fired = 0;
+ mix_colors(fs);
+ render_light_map(st, fs);
+ }
+ else
+ {
+ fs->flash_r =
+ fs->flash_g =
+ fs->flash_b = 50 + (fs->cy - fs->explode_y) * 10;
+ prgba = palaka + (fs->cy * w + fs->cx + rnd(5) - 2) * 4;
+ prgba[0] = (rnd(32) + 128);
+ prgba[1] = (rnd(32) + 128);
+ prgba[2] = (rnd(32) + 128);
+ return(1);
+ }
+ }
+ if ((fs->bicolor + 1) % 50 == 0) rotate_hue(fs, 180);
+ if (fs->bicolor) --fs->bicolor;
+ if (fs->hshift) rotate_hue(fs, rnd(8));
+ if (fs->vshift) wave_value(fs);
+ if (fs->flash_r > 1.0) fs->flash_r *= st->flash_fade;
+ if (fs->flash_g > 1.0) fs->flash_g *= st->flash_fade;
+ if (fs->flash_b > 1.0) fs->flash_b *= st->flash_fade;
+ air_drag = fs->air_drag;
+ r = fs->r;
+ g = fs->g;
+ b = fs->b;
+ for (n = 0; n < PIXCOUNT; n++, fp++)
+ {
+ if (!fp->burn) continue;
+ --fp->burn;
+ if (fs->flies)
+ {
+ fp->x += fp->xv = fp->xv * air_drag + frand(0.1) - 0.05;
+ fp->y += fp->yv = fp->yv * air_drag + frand(0.1) - 0.05 + G_ACCELERATION;
+ }
+ else
+ {
+ fp->x += fp->xv = fp->xv * air_drag + frand(0.01) - 0.005;
+ fp->y += fp->yv = fp->yv * air_drag + frand(0.005) - 0.0025 + G_ACCELERATION;
+ }
+ if (fp->y > h)
+ {
+ if (rnd(5) == 3)
+ {
+ fp->yv *= -0.24;
+ fp->y = h;
+ }
+ /* touch muddy ground :) */
+ else fp->burn = 0;
+ }
+ if (fp->x < w && fp->x > 0 && fp->y < h && fp->y > 0)
+ {
+ prgba = palaka + ((int)fp->y * w + (int)fp->x) * 4;
+ prgba[0] = b;
+ prgba[1] = g;
+ prgba[2] = r;
+ }
+ }
+ return(--fs->life);
+}
+
+#ifdef __SSE2__
+
+/* SSE2 optimized versions of glow_blur() and chromo_2x2_light() */
+
+static void glow_blur(struct state *st)
+{
+ unsigned int n, nn;
+ unsigned char *ps = st->palaka1;
+ unsigned char *pd = st->palaka2;
+ unsigned char *pa = st->palaka1 - (st->width * 4);
+ unsigned char *pb = st->palaka1 + (st->width * 4);
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4;
+
+ xmm0 = _mm_setzero_si128();
+ nn = st->width * st->height * 4;
+ for (n = 0; n < nn; n+=16)
+ {
+ _mm_prefetch((const void *)&ps[n+16],_MM_HINT_T0);
+ _mm_prefetch((const void *)&pa[n+16],_MM_HINT_T0);
+ _mm_prefetch((const void *)&pb[n+16],_MM_HINT_T0);
+
+ xmm1 = _mm_load_si128((const __m128i*)&ps[n]);
+ xmm2 = xmm1;
+ xmm1 = _mm_unpacklo_epi8(xmm1,xmm0);
+ xmm2 = _mm_unpackhi_epi8(xmm2,xmm0);
+ xmm3 = _mm_loadu_si128((const __m128i*)&ps[n+4]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm3 = _mm_slli_epi16(xmm3,3);
+ xmm4 = _mm_slli_epi16(xmm4,3);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&ps[n+8]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+
+ xmm3 = _mm_load_si128((const __m128i*)&pa[n]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pa[n+4]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pa[n+8]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+
+ xmm3 = _mm_load_si128((const __m128i*)&pb[n]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pb[n+4]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pb[n+8]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+
+ xmm3 = xmm1;
+ xmm4 = xmm2;
+ xmm1 = _mm_srli_epi16(xmm1,4);
+ xmm2 = _mm_srli_epi16(xmm2,4);
+ xmm3 = _mm_srli_epi16(xmm3,3);
+ xmm4 = _mm_srli_epi16(xmm4,3);
+ xmm1 = _mm_packus_epi16(xmm1,xmm2);
+ xmm3 = _mm_packus_epi16(xmm3,xmm4);
+
+ _mm_storeu_si128((__m128i*)&ps[n+4], xmm1);
+ _mm_storeu_si128((__m128i*)&pd[n+4], xmm3);
+ }
+}
+
+static void chromo_2x2_light(struct state *st)
+{
+ __m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6;
+ __m128i xmi4, xmi5, xmi6, xmi7;
+
+ unsigned int x, y, v = 0;
+ unsigned int nl = st->width * 4;
+ unsigned char *mem = st->palaka2;
+ fireshell *fs = st->fireshell_array;
+
+ xmm0 = _mm_setr_ps(fs[0].flash_b, fs[0].flash_g, fs[0].flash_r, 0.0);
+ xmm1 = _mm_setr_ps(fs[1].flash_b, fs[1].flash_g, fs[1].flash_r, 0.0);
+ xmm2 = _mm_setr_ps(fs[2].flash_b, fs[2].flash_g, fs[2].flash_r, 0.0);
+ xmm3 = _mm_setr_ps(fs[3].flash_b, fs[3].flash_g, fs[3].flash_r, 0.0);
+
+ for (y = st->height/2; y; y--, mem += nl)
+ {
+ for (x = st->width/4; x; x--, v += 8, mem += 16)
+ {
+ xmm4 = _mm_set1_ps(st->light_map[v+0]);
+ xmm5 = xmm0;
+ xmm5 = _mm_mul_ps(xmm5,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+1]);
+ xmm4 = _mm_mul_ps(xmm4,xmm1);
+ xmm5 = _mm_add_ps(xmm5,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+2]);
+ xmm4 = _mm_mul_ps(xmm4,xmm2);
+ xmm5 = _mm_add_ps(xmm5,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+3]);
+ xmm4 = _mm_mul_ps(xmm4,xmm3);
+ xmm5 = _mm_add_ps(xmm5,xmm4);
+
+ xmm4 = _mm_set1_ps(st->light_map[v+4]);
+ xmm6 = xmm0;
+ xmm6 = _mm_mul_ps(xmm6,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+5]);
+ xmm4 = _mm_mul_ps(xmm4,xmm1);
+ xmm6 = _mm_add_ps(xmm6,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+6]);
+ xmm4 = _mm_mul_ps(xmm4,xmm2);
+ xmm6 = _mm_add_ps(xmm6,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+7]);
+ xmm4 = _mm_mul_ps(xmm4,xmm3);
+ xmm6 = _mm_add_ps(xmm6,xmm4);
+
+ xmi6 = _mm_cvtps_epi32(xmm5);
+ xmi7 = _mm_cvtps_epi32(xmm6);
+ xmi6 = _mm_packs_epi32(xmi6,xmi6);
+ xmi7 = _mm_packs_epi32(xmi7,xmi7);
+
+ xmi4 = _mm_load_si128((const __m128i*) mem);
+ xmi5 = _mm_unpacklo_epi8(xmi5,xmi4);
+ xmi5 = _mm_srli_epi16(xmi5,8);
+ xmi4 = _mm_unpackhi_epi8(xmi4,xmi4);
+ xmi4 = _mm_srli_epi16(xmi4,8);
+ xmi5 = _mm_add_epi16(xmi5,xmi6);
+ xmi4 = _mm_add_epi16(xmi4,xmi7);
+ xmi5 = _mm_packus_epi16(xmi5,xmi4);
+ _mm_store_si128((__m128i*) mem, xmi5);
+
+ xmi4 = _mm_load_si128((const __m128i*) &mem[nl]);
+ xmi5 = _mm_unpacklo_epi8(xmi5,xmi4);
+ xmi5 = _mm_srli_epi16(xmi5,8);
+ xmi4 = _mm_unpackhi_epi8(xmi4,xmi4);
+ xmi4 = _mm_srli_epi16(xmi4,8);
+ xmi5 = _mm_add_epi16(xmi5,xmi6);
+ xmi4 = _mm_add_epi16(xmi4,xmi7);
+ xmi5 = _mm_packus_epi16(xmi5,xmi4);
+ _mm_store_si128((__m128i*) &mem[nl], xmi5);
+ }
+ }
+}
+
+#else
+
+static void glow_blur(struct state *st)
+{
+ unsigned int n, q;
+ unsigned char *pm = st->palaka1;
+ unsigned char *po = st->palaka2;
+ unsigned char *pa = pm - (st->width * 4);
+ unsigned char *pb = pm + (st->width * 4);
+ /*
+ unsigned int rgba = 0;
+ for (n = st->width*st->height*4; n; n--, pm++, pa++, pb++, po++)
+ {
+ if(++rgba > 3)
+ {
+ rgba = 0;
+ continue;
+ }
+ q = pm[0] + pm[4] * 8 + pm[8] +
+ pa[0] + pa[4] + pa[8] +
+ pb[0] + pb[4] + pb[8];
+ pm[4] = q >> 4;
+ po[4] = q > 2047 ? 255 : q >> 3;
+ }
+ --- using unrolled version ------------
+ */
+ for (n = st->width*st->height*4; n; n-=4)
+ {
+ q = pm[0] + pm[4] * 8 + pm[8] +
+ pa[0] + pa[4] + pa[8] +
+ pb[0] + pb[4] + pb[8];
+ pm[4] = q >> 4;
+ po[4] = q > 2047 ? 255 : q >> 3;
+ q = pm[1] + pm[5] * 8 + pm[9] +
+ pa[1] + pa[5] + pa[9] +
+ pb[1] + pb[5] + pb[9];
+ pm[5] = q >> 4;
+ po[5] = q > 2047 ? 255 : q >> 3;
+ q = pm[2] + pm[6] * 8 + pm[10] +
+ pa[2] + pa[6] + pa[10] +
+ pb[2] + pb[6] + pb[10];
+ pm[6] = q >> 4;
+ po[6] = q > 2047 ? 255 : q >> 3;
+
+ pm+=4, pa+=4, pb+=4, po+=4;
+ }
+}
+
+static inline unsigned char addbs(unsigned char c, unsigned int i)
+{
+ i += c;
+ return(i > 255 ? 255 : i);
+}
+
+static void chromo_2x2_light(struct state *st)
+{
+ unsigned int n, x, y, v = 0;
+ unsigned int nl = st->width * 4;
+ unsigned char *mem = st->palaka2;
+ float r, g, b;
+ float rgb[SHELLCOUNT*4];
+ fireshell *fs = st->fireshell_array;
+
+ for (n = 0, x = 0; n < SHELLCOUNT; n++, x += 4, fs++)
+ {
+ rgb[x ] = fs->flash_r;
+ rgb[x+1] = fs->flash_g;
+ rgb[x+2] = fs->flash_b;
+ }
+
+ for (y = st->height/2; y; y--)
+ {
+ for (x = st->width/2; x; x--, v += 4)
+ {
+ r = rgb[0] * st->light_map[v] + rgb[4] * st->light_map[v+1]
+ + rgb[ 8] * st->light_map[v+2] + rgb[12] * st->light_map[v+3];
+ g = rgb[1] * st->light_map[v] + rgb[5] * st->light_map[v+1]
+ + rgb[ 9] * st->light_map[v+2] + rgb[13] * st->light_map[v+3];
+ b = rgb[2] * st->light_map[v] + rgb[6] * st->light_map[v+1]
+ + rgb[10] * st->light_map[v+2] + rgb[14] * st->light_map[v+3];
+
+ mem[0] = addbs(mem[0], b);
+ mem[1] = addbs(mem[1], g);
+ mem[2] = addbs(mem[2], r);
+ mem[4] = addbs(mem[4], b);
+ mem[5] = addbs(mem[5], g);
+ mem[6] = addbs(mem[6], r);
+
+ mem += nl;
+
+ mem[0] = addbs(mem[0], b);
+ mem[1] = addbs(mem[1], g);
+ mem[2] = addbs(mem[2], r);
+ mem[4] = addbs(mem[4], b);
+ mem[5] = addbs(mem[5], g);
+ mem[6] = addbs(mem[6], r);
+
+ mem -= nl - 8;
+ }
+ mem += nl;
+ }
+}
+
+#endif
+
+static void resize(struct state *st)
+{
+ unsigned int n;
+ fireshell *fs = st->fireshell_array;
+ XWindowAttributes xwa;
+ XGetWindowAttributes (st->dpy, st->window, &xwa);
+ xwa.width -= xwa.width % 4;
+ xwa.height -= xwa.height % 2;
+ st->width = xwa.width;
+ st->height = xwa.height;
+ if (st->verbose)
+ {
+ printf("resolution: %d x %d \n",st->width,st->height);
+ }
+ XSync(st->dpy, 0);
+ if (st->xim)
+ {
+ if (st->xim->data == (char *)st->palaka2) st->xim->data = NULL;
+ XDestroyImage(st->xim);
+ XSync(st->dpy, 0);
+ free(st->mem2);
+ free(st->mem1);
+ }
+ st->xim = XCreateImage(st->dpy, xwa.visual, xwa.depth, ZPixmap, 0, 0,
+ st->width, st->height, 8, 0);
+ if (!st->xim) return;
+
+#ifdef __SSE2___ABANDONED /* causes __ERROR_use_memset_not_bzero_in_xscreensaver__ */
+ st->mem1 = _mm_malloc(((st->height + 2) * st->width + 8)*4, 16);
+ bzero(st->mem1, ((st->height + 2) * st->width + 8)*4);
+ st->mem2 = _mm_malloc(((st->height + 2) * st->width + 8)*4, 16);
+ bzero(st->mem2, ((st->height + 2) * st->width + 8)*4);
+#else
+ st->mem1 = calloc((st->height + 2) * st->width + 8, 4);
+ st->mem2 = calloc((st->height + 2) * st->width + 8, 4);
+#endif
+ st->palaka1 = (unsigned char *) st->mem1 + (st->width * 4 + 16);
+ st->palaka2 = (unsigned char *) st->mem2 + (st->width * 4 + 16);
+
+ if (xwa.depth >= 24)
+ {
+ st->xim->data = (char *)st->palaka2;
+ }
+ else
+ {
+ st->xim->data = calloc(st->height, st->xim->bytes_per_line);
+ }
+
+ if (st->light_map) free(st->light_map);
+ st->light_map = calloc((st->width * st->height * SHELLCOUNT)/4, sizeof(float));
+ for (n = 0; n < SHELLCOUNT; n++, fs++)
+ {
+ render_light_map(st, fs);
+ }
+}
+
+static void put_image(struct state *st)
+{
+ int x,y,i,j;
+ unsigned char r, g, b;
+ if (!st->xim) return;
+ i = 0;
+ j = 0;
+ if (st->depth==16)
+ {
+ if(st->bigendian)
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (g&224)>>5 | (r&248);
+ st->xim->data[i++] = (b&248)>>3 | (g&28)<<3;
+ }
+ else
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (b&248)>>3 | (g&28)<<3;
+ st->xim->data[i++] = (g&224)>>5 | (r&248);
+ }
+ }
+ if (st->depth==15)
+ {
+ if(st->bigendian)
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (g&192)>>6 | (r&248)>>1;
+ st->xim->data[i++] = (b&248)>>3 | (g&56)<<2;
+ }
+ else
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (b&248)>>3 | (g&56)<<2;
+ st->xim->data[i++] = (g&192)>>6 | (r&248)>>1;
+ }
+ }
+ if (st->depth==8)
+ {
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (((7*g)/256)*36)+(((6*r)/256)*6)+((6*b)/256);
+ }
+ }
+ XPutImage(st->dpy,st->window,st->gc,st->xim,0,0,0,0,st->xim->width,st->xim->height);
+}
+
+static void *
+fireworkx_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ unsigned int n;
+ Visual *vi;
+ Colormap cmap;
+ Bool writable;
+ XWindowAttributes xwa;
+ XGCValues gcv;
+ firepix *fp;
+ fireshell *fs;
+
+ st->dpy = dpy;
+ st->window = win;
+ st->xim = NULL;
+ st->flash_on = 1;
+ st->shoot = 0;
+ st->width = 0;
+ st->height = 0;
+ st->max_shell_life = SHELL_LIFE_DEFAULT;
+ st->flash_fade = 0.995;
+ st->light_map = NULL;
+ st->palaka1 = NULL;
+ st->palaka2 = NULL;
+
+ st->flash_on = get_boolean_resource(st->dpy, "flash" , "Boolean");
+ st->shoot = get_boolean_resource(st->dpy, "shoot" , "Boolean");
+ st->verbose = get_boolean_resource(st->dpy, "verbose" , "Boolean");
+ st->max_shell_life = get_integer_resource(st->dpy, "maxlife" , "Integer");
+ /* transition from xscreensaver <= 5.20 */
+ if (st->max_shell_life > 100) st->max_shell_life = 100;
+
+ st->delay = get_integer_resource(st->dpy, "delay" , "Integer");
+
+ st->max_shell_life = pow(10.0,(st->max_shell_life/50.0)+2.7);
+ if(st->max_shell_life < 1000) st->flash_fade = 0.998;
+
+ if(st->verbose)
+ {
+ printf("Fireworkx %s - Pyrotechnics explosions simulation \n", FWXVERSION);
+ printf("Copyright (GPL) 1999-2013 Rony B Chandran <ronybc@gmail.com> \n\n");
+ printf("url: http://www.ronybc.com \n\n");
+ printf("Life = %u\n", st->max_shell_life);
+#ifdef __SSE2__
+ printf("Using SSE2 optimization.\n");
+#endif
+ }
+
+ XGetWindowAttributes(st->dpy,win,&xwa);
+ st->depth = xwa.depth;
+ vi = xwa.visual;
+ cmap = xwa.colormap;
+ st->bigendian = (ImageByteOrder(st->dpy) == MSBFirst);
+
+ if(st->depth==8)
+ {
+ st->colors = (XColor *) calloc(sizeof(XColor),st->ncolors+1);
+ writable = False;
+ make_smooth_colormap(xwa.screen, vi, cmap,
+ st->colors, &st->ncolors,
+ False, &writable, True);
+ }
+ st->gc = XCreateGC(st->dpy, win, 0, &gcv);
+
+ fs = calloc(SHELLCOUNT, sizeof(fireshell));
+ fp = calloc(PIXCOUNT * SHELLCOUNT, sizeof(firepix));
+ st->fireshell_array = fs;
+
+ XGetWindowAttributes (st->dpy, st->window, &xwa);
+ st->depth = xwa.depth;
+
+ resize(st); /* initialize palakas */
+
+ for (n = 0; n < SHELLCOUNT; n++, fs++)
+ {
+ fs->seq_number = n;
+ fs->fpix = fp;
+ recycle (st, fs, rnd(st->width), rnd(st->height));
+ fp += PIXCOUNT;
+ }
+
+ return st;
+}
+
+static unsigned long
+fireworkx_draw (Display *dpy, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ fireshell *fs;
+ unsigned int n, q;
+ for (q = FTWEAK; q; q--)
+ {
+ fs = st->fireshell_array;
+ for (n = 0; n < SHELLCOUNT; n++, fs++)
+ {
+ if (!explode(st, fs))
+ {
+ if (st->button_down_p)
+ st->deferred++;
+ else
+ recycle(st, fs, rnd(st->width), rnd(st->height));
+ }
+ }
+ }
+
+ while (!st->button_down_p && st->deferred) {
+ st->deferred--;
+ recycle_oldest(st, rnd(st->width), rnd(st->height));
+ }
+
+ glow_blur(st);
+
+ if (st->flash_on)
+ {
+ chromo_2x2_light(st);
+ }
+
+ put_image(st);
+ return st->delay;
+}
+
+static void
+fireworkx_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+ resize(st);
+}
+
+static Bool
+fireworkx_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->type == ButtonPress)
+ {
+ recycle_oldest(st, event->xbutton.x, event->xbutton.y);
+ st->button_down_p = True;
+ return True;
+ }
+ else if (event->type == ButtonRelease)
+ {
+ st->button_down_p = False;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+fireworkx_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free(st->mem2);
+ free(st->mem1);
+ free(st->fireshell_array->fpix);
+ free(st->fireshell_array);
+}
+
+static const char *fireworkx_defaults [] =
+{
+ ".background: black",
+ ".foreground: white",
+ "*delay: 10000", /* never default to zero! */
+ "*maxlife: 32",
+ "*flash: True",
+ "*shoot: False",
+ "*verbose: False",
+ 0
+};
+
+static XrmOptionDescRec fireworkx_options [] =
+{
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-maxlife", ".maxlife", XrmoptionSepArg, 0 },
+ { "-no-flash", ".flash", XrmoptionNoArg, "False" },
+ { "-shoot", ".shoot", XrmoptionNoArg, "True" },
+ { "-verbose", ".verbose", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Fireworkx", fireworkx)
diff --git a/hacks/fireworkx.man b/hacks/fireworkx.man
new file mode 100644
index 0000000..05a383c
--- /dev/null
+++ b/hacks/fireworkx.man
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fireworkx - pyrotechnic explosions eye-candy.
+.SH SYNOPSIS
+.B fireworkx
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-verbose]
+[\-noflash]
+[\-shoot]
+[\-delay \fInumber\fP]
+[\-maxlife \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Animates explosions.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-noflash
+Turn off light flash effect. (Runs faster)
+.TP 8
+.B \-shoot
+Fire shells up using mortar.
+.TP 8
+.B \-delay \fInumber\fP
+Delay between frames. In microseconds. (Default: 10000)
+.TP 8
+.B \-maxlife \fInumber\fP
+Maximum decay period for an explosion. (Range: 0-100)
+.TP 8
+.B \-verbose
+For scientific research purposes only..!
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999-2013 by Rony B Chandran. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+
+.br
+Written by Rony B Chandran <ronybc@gmail.com>
+.br
+
+.br
+Additional programming and support:
+.br
+--------------------------------------------------------------------
+.br
+Rugmini R Chandran <rugmini@ronybc.com>
+.br
+Renuka S <renuka@ronybc.com>
+.br
+Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
+.br
+Nicholas Miell <nmiell@gmail.com>
+
+.SH URL
+http://www.ronybc.com
+
diff --git a/hacks/flag.c b/hacks/flag.c
new file mode 100644
index 0000000..f12c0bc
--- /dev/null
+++ b/hacks/flag.c
@@ -0,0 +1,565 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * flag --- a waving flag
+ */
+#if 0
+static const char sccsid[] = "@(#)flag.c 4.02 97/04/01 xlockmore";
+#endif
+
+/* Copyright (c) 1996 Charles Vidal <vidalc@univ-mlv.fr>.
+ * PEtite demo X11 de charles vidal 15 05 96
+ * tourne sous Linux et SOLARIS
+ * thank's to Bas van Gaalen, Holland, PD, for his sources
+ * in pascal vous devez rajouter une ligne dans mode.c
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 22-Jan-98: jwz: made the flag wigglier; added xpm support.
+ * (I tried to do this by re-porting from xlockmore, but the
+ * current xlockmore version is completely inscrutable.)
+ * 13-May-97: jwz@jwz.org: turned into a standalone program.
+ * Made it able to animate arbitrary (runtime) text or bitmaps.
+ * 01-May-96: written.
+ */
+
+#ifdef HAVE_COCOA
+# define DEF_FONT "Monaco 15"
+#else
+# define DEF_FONT "fixed"
+#endif
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 50000 \n" \
+ "*cycles: 1000 \n" \
+ "*size: -7 \n" \
+ "*ncolors: 200 \n" \
+ "*bitmap: \n" \
+ "*font: " DEF_FONT "\n" \
+ "*text: \n" \
+ "*fpsSolid: true \n" \
+ "*lowrez: true \n" \
+
+# define BRIGHT_COLORS
+# define UNIFORM_COLORS
+# define release_flag 0
+# define reshape_flag 0
+# define flag_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+
+#include "ximage-loader.h"
+#include "images/gen/bob_png.h"
+
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# include "flag.h"
+#endif /* !STANDALONE */
+
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+
+#ifdef STANDALONE
+static XrmOptionDescRec opts[] =
+{
+ { "-bitmap", ".flag.bitmap", XrmoptionSepArg, 0 },
+ { "-text", ".flag.text", XrmoptionSepArg, 0 }
+};
+
+#endif /* STANDALONE */
+
+ENTRYPOINT ModeSpecOpt flag_opts = {
+#ifdef STANDALONE
+ 2, opts, 0, NULL, NULL
+#else /* !STANDALONE */
+ 0, NULL, 0, NULL, NULL
+#endif /* STANDALONE */
+};
+
+#define MINSIZE 1
+#define MAXSCALE 8
+#define MINSCALE 2
+#define MAXINITSIZE 6
+#define MININITSIZE 2
+#define MINAMP 5
+#define MAXAMP 20
+#define MAXW(fp) (MAXSCALE * (fp)->image->width + 2 * MAXAMP + (fp)->pointsize)
+#define MAXH(fp) (MAXSCALE * (fp)->image->height+ 2 * MAXAMP + (fp)->pointsize)
+#define MINW(fp) (MINSCALE * (fp)->image->width + 2 * MINAMP + (fp)->pointsize)
+#define MINH(fp) (MINSCALE * (fp)->image->height+ 2 * MINAMP + (fp)->pointsize)
+#define ANGLES 360
+
+typedef struct {
+ int samp;
+ int sofs;
+ int sidx;
+ int x_flag, y_flag;
+ int timer;
+ int initialized;
+ int stab[ANGLES];
+ Bool dbufp;
+ Pixmap cache;
+ int width, height;
+ int pointsize;
+ float size;
+ float inctaille;
+ int startcolor;
+ XImage *image;
+} flagstruct;
+
+static flagstruct *flags = NULL;
+
+static int
+random_num(int n)
+{
+ return ((int) (((float) LRAND() / MAXRAND) * (n + 1.0)));
+}
+
+static void
+initSintab(ModeInfo * mi)
+{
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+ int i;
+
+ /*-
+ * change the periodicity of the sin formula : the maximum of the
+ * periocity seem to be 16 ( 2^4 ), after the drawing isn't good looking
+ */
+ int periodicity = random_num(4);
+ int puissance = 1;
+
+ /* for (i=0;i<periodicity;i++) puissance*=2; */
+ puissance <<= periodicity;
+ for (i = 0; i < ANGLES; i++)
+ fp->stab[i] = (int) (SINF(i * puissance * M_PI / ANGLES) * fp->samp) +
+ fp->sofs;
+}
+
+static void
+affiche(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ int x, y, xp, yp;
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+
+ for (x = 0; x < fp->image->width; x++)
+ for (y = fp->image->height-1; y >= 0; y--) {
+ xp = (int) (fp->size * (float) x) +
+ fp->stab[(fp->sidx + x + y) % ANGLES];
+ yp = (int) (fp->size * (float) y) +
+ fp->stab[(fp->sidx + 4 * x + y + y) % ANGLES];
+
+ if (fp->image->depth > 1)
+ XSetForeground(display, MI_GC(mi),
+ XGetPixel(fp->image, x, y));
+ else if (XGetPixel(fp->image, x, y))
+ XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+ else if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
+ else
+ XSetForeground(display, MI_GC(mi),
+ MI_PIXEL(mi, (y + x + fp->sidx + fp->startcolor) % MI_NPIXELS(mi)));
+
+ if (fp->cache == MI_WINDOW(mi)) { /* not double-buffering */
+ xp += fp->x_flag;
+ yp += fp->y_flag;
+ }
+
+ if (fp->pointsize <= 1)
+ XDrawPoint(display, fp->cache, MI_GC(mi), xp, yp);
+ else if (fp->pointsize < 6)
+ XFillRectangle(display, fp->cache, MI_GC(mi), xp, yp,
+ fp->pointsize, fp->pointsize);
+ else
+ XFillArc(display, fp->cache, MI_GC(mi), xp, yp,
+ fp->pointsize, fp->pointsize, 0, 360*64);
+ }
+}
+
+#ifdef STANDALONE
+
+static void
+make_flag_bits(ModeInfo *mi)
+{
+ Display *dpy = MI_DISPLAY(mi);
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+ char *bitmap_name = get_string_resource (dpy, "bitmap", "Bitmap");
+ char *text = get_string_resource (dpy, "text", "Text");
+
+#ifdef HAVE_JWXYZ
+ bitmap_name = 0; /* #### always use default */
+#endif
+
+ /* If neither a bitmap nor text are specified, randomly select either
+ the builtin bitmap or builtin text. */
+ if ((!bitmap_name || !*bitmap_name) && (!text || !*text))
+ {
+ if (random() & 1)
+ {
+ free(bitmap_name);
+ bitmap_name = strdup("(default)");
+ }
+ else
+ {
+ free(text);
+ text = strdup("(default)");
+ }
+ }
+
+ if (bitmap_name &&
+ *bitmap_name &&
+ !!strcmp(bitmap_name, "(default)"))
+ {
+ Pixmap bitmap = 0;
+ int width = 0;
+ int height = 0;
+
+ bitmap = file_to_pixmap (dpy, MI_WINDOW (mi), bitmap_name,
+ &width, &height, 0);
+ if (bitmap)
+ {
+ fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, ~0L,
+ ZPixmap);
+ XFreePixmap(dpy, bitmap);
+ }
+ }
+ else if (text && *text)
+ {
+ char *text2;
+ char *fn = get_string_resource (dpy, "font", "Font");
+ char *def_fn = "fixed";
+ char *line, *token;
+ int width, height;
+ int lines;
+ int margin = 2;
+ int fg = 1;
+ int bg = 0;
+ Pixmap bitmap;
+ XFontStruct *font;
+ XCharStruct overall;
+ XGCValues gcv;
+ GC gc;
+
+ if (!strcmp(text, "(default)"))
+ {
+# ifdef HAVE_UNAME
+ struct utsname uts;
+ if (uname (&uts) < 0)
+ {
+ text = strdup("uname() failed");
+ }
+ else
+ {
+ char *s;
+ if ((s = strchr(uts.nodename, '.')))
+ *s = 0;
+ text = (char *) malloc(strlen(uts.nodename) +
+ strlen(uts.sysname) +
+ strlen(uts.version) +
+ strlen(uts.release) + 10);
+# if defined(_AIX)
+ sprintf(text, "%s\n%s %s.%s",
+ uts.nodename, uts.sysname, uts.version, uts.release);
+# elif defined(__APPLE__) && !defined(USE_IPHONE) /* MacOS X + XDarwin */
+ {
+ const char *file =
+ "/System/Library/CoreServices/SystemVersion.plist";
+ FILE *f = fopen (file, "r");
+ char *pbv = 0, *pn = 0, *puvv = 0;
+ if (f) {
+ char *s, buf[255];
+
+ while (fgets (buf, sizeof(buf)-1, f)) {
+# define GRAB(S,V) \
+ if (strstr(buf, S)) { \
+ fgets (buf, sizeof(buf)-1, f); \
+ if ((s = strchr (buf, '>'))) V = strdup(s+1); \
+ if ((s = strchr (V, '<'))) *s = 0; \
+ }
+ GRAB ("ProductName", pn)
+ GRAB ("ProductBuildVersion", pbv)
+ GRAB ("ProductUserVisibleVersion", puvv)
+# undef GRAB
+ }
+ }
+ if (pbv)
+ sprintf (text, "%s\n%s\n%s",
+ uts.nodename, pn, puvv /*, uts.machine*/);
+ else
+ sprintf(text, "%s\n%s %s",
+ uts.nodename, uts.sysname, uts.release);
+ }
+# else
+ sprintf(text, "%s\n%s %s",
+ uts.nodename, uts.sysname, uts.release);
+# endif /* special system types */
+ }
+#else /* !HAVE_UNAME */
+# ifdef VMS
+ text = strdup(getenv("SYS$NODE"));
+# else
+ text = strdup("X\nScreen\nSaver");
+# endif
+#endif /* !HAVE_UNAME */
+ }
+
+ while (*text &&
+ (text[strlen(text)-1] == '\r' ||
+ text[strlen(text)-1] == '\n'))
+ text[strlen(text)-1] = 0;
+
+ text2 = strdup(text);
+
+ if (!fn) fn = def_fn;
+ font = load_font_retry (dpy, fn);
+
+ memset(&overall, 0, sizeof(overall));
+ token = text;
+ lines = 0;
+ while ((line = strtok(token, "\r\n")))
+ {
+ XCharStruct o2;
+ int ascent, descent, direction;
+ token = 0;
+ XTextExtents(font, line, strlen(line),
+ &direction, &ascent, &descent, &o2);
+ overall.lbearing = MAX(overall.lbearing, o2.lbearing);
+ overall.rbearing = MAX(overall.rbearing, o2.rbearing);
+ lines++;
+ }
+
+ width = overall.lbearing + overall.rbearing + margin + margin + 1;
+ height = ((font->ascent + font->descent) * lines) + margin + margin;
+
+ bitmap = XCreatePixmap(dpy, MI_WINDOW(mi), width, height, 1);
+
+ gcv.font = font->fid;
+ gcv.foreground = bg;
+ gc = XCreateGC (dpy, bitmap, (GCFont | GCForeground), &gcv);
+ XFillRectangle(dpy, bitmap, gc, 0, 0, width, height);
+ XSetForeground(dpy, gc, fg);
+
+ token = text2;
+ lines = 0;
+ while ((line = strtok(token, "\r\n")))
+ {
+ XCharStruct o2;
+ int ascent, descent, direction, xoff;
+ token = 0;
+
+ XTextExtents(font, line, strlen(line),
+ &direction, &ascent, &descent, &o2);
+ xoff = ((overall.lbearing + overall.rbearing) -
+ (o2.lbearing + o2.rbearing)) / 2;
+
+ XDrawString(dpy, bitmap, gc,
+ overall.lbearing + margin + xoff,
+ ((font->ascent * (lines + 1)) +
+ (font->descent * lines) +
+ margin),
+ line, strlen(line));
+ lines++;
+ }
+ free(text2);
+ XUnloadFont(dpy, font->fid);
+ XFree((XPointer) font);
+ XFreeGC(dpy, gc);
+
+ fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, 1L, XYPixmap);
+ XFreePixmap(dpy, bitmap);
+ }
+
+
+ if (! fp->image)
+ {
+ XImage *im = image_data_to_ximage (dpy, MI_VISUAL(mi),
+ bob_png, sizeof(bob_png));
+ int x, y;
+
+ fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0,
+ 0, im->width, im->height, 8, 0);
+ fp->image->data = malloc (fp->image->bytes_per_line * fp->image->height);
+
+ /* Convert deep image to 1 bit */
+ for (y = 0; y < im->height; y++)
+ {
+ for (x = 0; x < im->width; x++)
+ {
+ unsigned long p = XGetPixel (im, x, im->height-y-1);
+ if (! (p & 0xFF000000)) p = ~0; /* alpha -> white */
+ p = (p >> 16) & 0xFF; /* red */
+ XPutPixel (fp->image, x, y, p > 0x7F ? 0 : 1);
+ }
+ }
+ XDestroyImage (im);
+ }
+
+ if (bitmap_name)
+ free (bitmap_name);
+ if (text)
+ free (text);
+}
+
+#else /* !STANDALONE */
+
+static void
+make_flag_bits(ModeInfo *mi)
+{
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+ int x, y;
+ int w = flag_width;
+ int h = flag_height;
+ int i = 0;
+ fp->image =
+ XCreateImage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ 1, XYBitmap, 0, /* dpth, fmt, offset */
+ (char *) calloc ((w+8) / 8, h), /* data */
+ w, h, 8, 0); /* w, h, pad, bpl */
+ /* Geez, what kinda goofy bit order is this?? */
+ for (x = 0; x < w; x++)
+ for (y = h-1; y >= 0; y--)
+ XPutPixel (fp->image, x, y, flag_bits[i++]);
+}
+
+#endif /* !STANDALONE */
+
+
+ENTRYPOINT void
+init_flag(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ int size = MI_SIZE(mi);
+ flagstruct *fp;
+
+ MI_INIT (mi, flags);
+ fp = &flags[MI_SCREEN(mi)];
+
+ make_flag_bits(mi);
+ if (!fp->image) abort();
+
+ fp->width = MI_WIN_WIDTH(mi);
+ fp->height = MI_WIN_HEIGHT(mi);
+
+ fp->samp = MAXAMP; /* Amplitude */
+ fp->sofs = 20; /* ???????? */
+ fp->pointsize = size;
+ if (size < -MINSIZE)
+ fp->pointsize = NRAND(-size - MINSIZE + 1) + MINSIZE;
+ if (fp->pointsize < MINSIZE ||
+ fp->width <= MAXW(fp) || fp->height <= MAXH(fp))
+ fp->pointsize = MINSIZE;
+ fp->size = MAXINITSIZE; /* Initial distance between pts */
+ fp->inctaille = 0.05;
+ fp->timer = 0;
+ fp->sidx = fp->x_flag = fp->y_flag = 0;
+
+ if (!fp->initialized) {
+ fp->dbufp = True;
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ fp->dbufp = False;
+#endif
+ fp->initialized = True;
+ if (!fp->dbufp)
+ fp->cache = MI_WINDOW(mi); /* not double-buffering */
+ else
+ if (!(fp->cache = XCreatePixmap(display, MI_WINDOW(mi),
+ MAXW(fp), MAXH(fp),
+ MI_WIN_DEPTH(mi))))
+#ifdef STANDALONE
+ exit(-1);
+#else /* !STANDALONE */
+ error("%s: catastrophe memoire\n");
+#endif /* !STANDALONE */
+ }
+ XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+ XFillRectangle(display, fp->cache, MI_GC(mi),
+ 0, 0, MAXW(fp), MAXH(fp));
+ /* don't want any exposure events from XCopyArea */
+ XSetGraphicsExposures(display, MI_GC(mi), False);
+ if (MI_NPIXELS(mi) > 2)
+ fp->startcolor = NRAND(MI_NPIXELS(mi));
+ if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
+ fp->samp = MINAMP;
+ fp->sofs = 0;
+ fp->x_flag = random_num(fp->width - MINW(fp));
+ fp->y_flag = random_num(fp->height - MINH(fp));
+ } else {
+ fp->samp = MAXAMP;
+ fp->sofs = 20;
+ fp->x_flag = random_num(fp->width - MAXW(fp));
+ fp->y_flag = random_num(fp->height - MAXH(fp));
+ }
+
+ initSintab(mi);
+
+ XClearWindow(display, MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+draw_flag(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+
+ if (!fp->image) abort();
+ if (fp->cache == window) { /* not double-buffering */
+ XClearWindow (display, window);
+ } else if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
+ fp->size = MININITSIZE;
+ /* fp->pointsize = MINPOINTSIZE; */
+ XCopyArea(display, fp->cache, window, MI_GC(mi),
+ 0, 0, MINW(fp), MINH(fp), fp->x_flag, fp->y_flag);
+ } else {
+ if ((fp->size + fp->inctaille) > MAXSCALE)
+ fp->inctaille = -fp->inctaille;
+ if ((fp->size + fp->inctaille) < MINSCALE)
+ fp->inctaille = -fp->inctaille;
+ fp->size += fp->inctaille;
+ XCopyArea(display, fp->cache, window, MI_GC(mi),
+ 0, 0, MAXW(fp), MAXH(fp), fp->x_flag, fp->y_flag);
+ }
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+ XFillRectangle(display, fp->cache, MI_GC(mi),
+ 0, 0, MAXW(fp), MAXH(fp));
+ affiche(mi);
+ fp->sidx += 2;
+ fp->sidx %= (ANGLES * MI_NPIXELS(mi));
+ fp->timer++;
+ if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
+ init_flag(mi);
+}
+
+ENTRYPOINT void
+free_flag(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+
+ if (flags == NULL)
+ return;
+
+ if (flags[screen].cache && flags[screen].dbufp)
+ XFreePixmap(MI_DISPLAY(mi), flags[screen].cache);
+ if (flags[screen].image)
+ XDestroyImage(flags[screen].image);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_flag(ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Flag", flag)
diff --git a/hacks/flag.man b/hacks/flag.man
new file mode 100644
index 0000000..dcf93f7
--- /dev/null
+++ b/hacks/flag.man
@@ -0,0 +1,92 @@
+.TH XScreenSaver 1 "24-May-97" "X Version 11"
+.SH NAME
+flag - draws a waving flag, containing text or an image
+.SH SYNOPSIS
+.B flag
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-size \fIinteger\fP] [\-text \fIstring\fP] [\-font \fIfont\fP] [\-bitmap \fIxbm-file\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIflag\fP program draws a waving flag that contains text or a bitmap.
+.SH OPTIONS
+.I flag
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-size \fIinteger\fP
+How large the pixels in the flag should be, from 1 to 8.
+If this is a negative number, the pixel size is chosen randomly
+from the range 1 to -size. Default -7.
+.TP 8
+.B \-text \fItext\fP
+The text to display in the flag. Multiple lines of text are allowed;
+the lines will be displayed centered atop one another. Default: none.
+If the text is the magic string \fI"(default)"\fP, then the text used
+will be the local machine name; a newline; and the local OS version.
+.TP 8
+.B \-bitmap \fIxbm-file\fP
+The bitmap to display in the flag; this must be an XBM file (color XPMs
+are not allowed.) Default: none. If the bitmap is the magic
+string \fI"(default)"\fP, then the bitmap used will be a charming
+little picture of J. R. "Bob" Dobbs.
+
+If neither \fI\-text\fP nor \fI\-bitmap\fP are specified, then either
+the builtin text or the builtin bitmap will be chosen randomly.
+.TP 8
+.B \-font \fIfont\fP
+The font in which to draw the text; the default is
+"-*-helvetica-bold-r-*-240-*".
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 Charles Vidal.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+.SH AUTHOR
+Charles Vidal <vidalc@univ-mlv.fr>, 1996.
+
+Ability to run standalone or with \fIxscreensaver\fP, and the \-text
+and \-bitmap options, added by Jamie Zawinski <jwz@jwz.org>, 24-May-97.
diff --git a/hacks/flame.c b/hacks/flame.c
new file mode 100644
index 0000000..7b59056
--- /dev/null
+++ b/hacks/flame.c
@@ -0,0 +1,466 @@
+/* xscreensaver, Copyright (c) 1993-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This file was ported from xlock for use in xscreensaver (and standalone)
+ * by jwz on 18-Oct-93. (And again, 11-May-97.) Original copyright reads:
+ *
+ * static char sccsid[] = "@(#)flame.c 1.4 91/09/27 XLOCK";
+ *
+ * flame.c - recursive fractal cosmic flames.
+ *
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Comments and additions should be sent to the author:
+ *
+ * naughton@eng.sun.com
+ *
+ * Patrick J. Naughton
+ * MS 21-14
+ * Sun Laboritories, Inc.
+ * 2550 Garcia Ave
+ * Mountain View, CA 94043
+ *
+ * Revision History:
+ * 01-Jun-95: This should look more like the original with some updates by
+ * Scott Draves.
+ * 27-Jun-91: vary number of functions used.
+ * 24-Jun-91: fixed portability problem with integer mod (%).
+ * 06-Jun-91: Written. (received from Scott Draves, spot@cs.cmu.edu).
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#include <signal.h> /* so we can ignore SIGFPE */
+
+#define POINT_BUFFER_SIZE 10
+#define MAXLEV 4
+#define MAXKINDS 10
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ double f[2][3][MAXLEV]; /* three non-homogeneous transforms */
+ int max_total;
+ int max_levels;
+ int max_points;
+ int cur_level;
+ int variation;
+ int snum;
+ int anum;
+ int num_points;
+ int total_points;
+ int pixcol;
+ int ncolors;
+ XColor *colors;
+ XPoint points [POINT_BUFFER_SIZE];
+ GC gc;
+
+ int delay, delay2;
+ int width, height;
+
+ short lasthalf;
+
+ int flame_alt;
+ int do_reset;
+};
+
+
+static short
+halfrandom (struct state *st, int mv)
+{
+ unsigned long r;
+
+ if (st->lasthalf)
+ {
+ r = st->lasthalf;
+ st->lasthalf = 0;
+ }
+ else
+ {
+ r = random ();
+ st->lasthalf = r >> 16;
+ }
+ return (r % mv);
+}
+
+static void *
+flame_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ Colormap cmap;
+
+ st->dpy = dpy;
+ st->window = window;
+
+#if defined(SIGFPE) && defined(SIG_IGN)
+ /* No doubt a better fix would be to track down where the NaN is coming
+ from, and code around that; but this should do. Apparently most systems
+ (Linux, Solaris, Irix, ...) ignore FPE by default -- but FreeBSD dumps
+ core by default. */
+ signal (SIGFPE, SIG_IGN);
+#endif
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ cmap = xgwa.colormap;
+
+ st->max_points = get_integer_resource (st->dpy, "iterations", "Integer");
+ if (st->max_points <= 0) st->max_points = 100;
+
+ st->max_levels = st->max_points;
+
+ st->max_total = get_integer_resource (st->dpy, "points", "Integer");
+ if (st->max_total <= 0) st->max_total = 10000;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ if (st->delay2 < 0) st->delay2 = 0;
+
+ st->variation = random() % MAXKINDS;
+
+ if (mono_p)
+ st->ncolors = 0;
+ else
+ {
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Integer");
+ if (st->ncolors <= 0) st->ncolors = 128;
+ st->colors = (XColor *) malloc ((st->ncolors+1) * sizeof (*st->colors));
+ make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+ if (st->ncolors <= 2)
+ mono_p = True, st->ncolors = 0;
+ }
+
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
+ gcv.background = get_pixel_resource (st->dpy, cmap, "background", "Background");
+
+ if (! mono_p)
+ {
+ st->pixcol = halfrandom (st, st->ncolors);
+ gcv.foreground = (st->colors [st->pixcol].pixel);
+ }
+
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground | GCBackground, &gcv);
+ return st;
+}
+
+static int
+recurse (struct state *st, double x, double y, int l, Display *dpy, Window win)
+{
+ int i;
+ double nx, ny;
+
+ if (l == st->max_levels)
+ {
+ st->total_points++;
+ if (st->total_points > st->max_total) /* how long each fractal runs */
+ return 0;
+
+ if (x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0)
+ {
+ st->points[st->num_points].x = (int) ((st->width / 2) * (x + 1.0));
+ st->points[st->num_points].y = (int) ((st->height / 2) * (y + 1.0));
+ st->num_points++;
+ if (st->num_points >= POINT_BUFFER_SIZE)
+ {
+ XDrawPoints (st->dpy, win, st->gc, st->points, st->num_points, CoordModeOrigin);
+ st->num_points = 0;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < st->snum; i++)
+ {
+
+ /* Scale back when values get very large. Spot sez:
+ "I think this happens on HPUX. I think it's non-IEEE
+ to generate an exception instead of a silent NaN."
+ */
+ if ((fabs(x) > 1.0E5) || (fabs(y) > 1.0E5))
+ x = x / y;
+
+ nx = st->f[0][0][i] * x + st->f[0][1][i] * y + st->f[0][2][i];
+ ny = st->f[1][0][i] * x + st->f[1][1][i] * y + st->f[1][2][i];
+ if (i < st->anum)
+ {
+ switch (st->variation)
+ {
+ case 0: /* sinusoidal */
+ nx = sin(nx);
+ ny = sin(ny);
+ break;
+ case 1: /* complex */
+ {
+ double r2 = nx * nx + ny * ny + 1e-6;
+ nx = nx / r2;
+ ny = ny / r2;
+ }
+ break;
+ case 2: /* bent */
+ if (nx < 0.0)
+ nx = nx * 2.0;
+ if (ny < 0.0)
+ ny = ny / 2.0;
+ break;
+ case 3: /* swirl */
+ {
+ double r = (nx * nx + ny * ny); /* times k here is fun */
+ double c1 = sin(r);
+ double c2 = cos(r);
+ double t = nx;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = c2 * t + c1 * ny;
+ nx = c1 * nx - c2 * ny;
+ }
+ break;
+ case 4: /* horseshoe */
+ {
+ double r, c1, c2, t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ r = 0.0;
+ else
+ r = atan2(nx, ny); /* times k here is fun */
+ c1 = sin(r);
+ c2 = cos(r);
+ t = nx;
+
+ nx = c1 * nx - c2 * ny;
+ ny = c2 * t + c1 * ny;
+ }
+ break;
+ case 5: /* drape */
+ {
+ double t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ t = 0.0;
+ else
+ t = atan2(nx, ny) / M_PI;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = sqrt(nx * nx + ny * ny) - 1.0;
+ nx = t;
+ }
+ break;
+ case 6: /* broken */
+ if (nx > 1.0)
+ nx = nx - 1.0;
+ if (nx < -1.0)
+ nx = nx + 1.0;
+ if (ny > 1.0)
+ ny = ny - 1.0;
+ if (ny < -1.0)
+ ny = ny + 1.0;
+ break;
+ case 7: /* spherical */
+ {
+ double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
+
+ nx = nx / r;
+ ny = ny / r;
+ }
+ break;
+ case 8: /* */
+ nx = atan(nx) / M_PI_2;
+ ny = atan(ny) / M_PI_2;
+ break;
+/* #if 0 */ /* core dumps on some machines, why not all? */
+ case 9: /* complex sine */
+ {
+ double u = nx;
+ double v = ny;
+ double ev = exp(v);
+ double emv = exp(-v);
+
+ nx = (ev + emv) * sin(u) / 2.0;
+ ny = (ev - emv) * cos(u) / 2.0;
+ }
+ break;
+ case 10: /* polynomial */
+ if (nx < 0)
+ nx = -nx * nx;
+ else
+ nx = nx * nx;
+ if (ny < 0)
+ ny = -ny * ny;
+ else
+ ny = ny * ny;
+ break;
+/* #endif */
+ default:
+ nx = sin(nx);
+ ny = sin(ny);
+ }
+ }
+ if (!recurse (st, nx, ny, l + 1, st->dpy, win))
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static unsigned long
+flame_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i, j, k;
+ unsigned long this_delay = st->delay;
+
+ if (st->do_reset)
+ {
+ st->do_reset = 0;
+ XClearWindow (st->dpy, st->window);
+ }
+
+ if (!(st->cur_level++ % st->max_levels))
+ {
+ st->do_reset = 1;
+ this_delay = st->delay2;
+ st->flame_alt = !st->flame_alt;
+ st->variation = random() % MAXKINDS;
+ }
+ else
+ {
+ if (st->ncolors > 2)
+ {
+ XSetForeground (st->dpy, st->gc, st->colors [st->pixcol].pixel);
+ if (--st->pixcol < 0)
+ st->pixcol = st->ncolors - 1;
+ }
+ }
+
+ /* number of functions */
+ st->snum = 2 + (st->cur_level % (MAXLEV - 1));
+
+ /* how many of them are of alternate form */
+ if (st->flame_alt)
+ st->anum = 0;
+ else
+ st->anum = halfrandom (st, st->snum) + 2;
+
+ /* 6 coefs per function */
+ for (k = 0; k < st->snum; k++)
+ {
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 3; j++)
+ st->f[i][j][k] = ((double) (random() & 1023) / 512.0 - 1.0);
+ }
+ st->num_points = 0;
+ st->total_points = 0;
+ recurse (st, 0.0, 0.0, 0, st->dpy, st->window);
+ XDrawPoints (st->dpy, st->window, st->gc, st->points, st->num_points, CoordModeOrigin);
+
+ return this_delay;
+}
+
+
+#if defined(__hpux) && defined(PLOSS)
+/* I don't understand why this is necessary, but I'm told that this program
+ does nothing at all on HP-sUX without it.
+
+ I'm further told that HPUX 11.0 doesn't define PLOSS, and works ok without
+ this section. Go figure.
+ */
+#undef random
+#undef srandom
+#include <math.h>
+int matherr(x)
+ register struct exception *x;
+{
+ if (x->type == PLOSS) return 1;
+ else return 0;
+}
+#endif /* __hpux */
+
+
+
+static const char *flame_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*colors: 64",
+ "*iterations: 25",
+ "*delay: 50000",
+ "*delay2: 2000000",
+ "*points: 10000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec flame_options [] = {
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-iterations", ".iterations", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { "-points", ".points", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+static void
+flame_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+}
+
+static Bool
+flame_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->do_reset = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+flame_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Flame", flame)
+
diff --git a/hacks/flame.man b/hacks/flame.man
new file mode 100644
index 0000000..dae4d1b
--- /dev/null
+++ b/hacks/flame.man
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+flame - draw weird cosmic fractals
+.SH SYNOPSIS
+.B flame
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-colors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIflame\fP program generates colorful fractal displays.
+.SH OPTIONS
+.I flame
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-colors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+.TP 8
+.B \-iterations \fIinteger\fP
+How many fractals to generate. Default 25.
+.TP 8
+.B \-points \fIinteger\fP
+How many pixels to draw for each fractal. Default 10000.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long we should wait between drawing each fractal. Default 50000,
+or about 1/20th second.
+.TP 8
+.B \-delay2 \fImicroseconds\fP
+How long we should wait before clearing the screen when each run ends.
+Default 2000000, or two seconds.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1991 by Patrick J. Naughton
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Scott Graves <spot@cs.cmu.edu>, 06-Jun-91.n
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/hacks/flow.c b/hacks/flow.c
new file mode 100644
index 0000000..6dddd8e
--- /dev/null
+++ b/hacks/flow.c
@@ -0,0 +1,1211 @@
+/* -*- Mode: C; tab-width: 4; c-basic-offset: 4 -*- */
+/* flow --- flow of strange bees */
+
+#if 0
+static const char sccsid[] = "@(#)flow.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
+ * Incorporating some code from Stephen Davies Copyright (c) 2000
+ *
+ * Search code based on techniques described in "Strange Attractors:
+ * Creating Patterns in Chaos" by Julien C. Sprott
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "flow" shows a variety of continuous phase-space flows around strange
+ * attractors. It includes the well-known Lorentz mask (the "Butterfly"
+ * of chaos fame), two forms of Rossler's "Folded Band" and Poincare'
+ * sections of the "Birkhoff Bagel" and Duffing's forced occilator. "flow"
+ * can now discover new attractors.
+ *
+ * Revision History:
+ *
+ * 29-Oct-2004: [TDA] Discover Attractors unknown to science.
+ * Replace 2D rendering of Periodic Attractors with a 3D
+ * 'interrupted' rendering. Replace "-/+allow2d" with "-/+periodic"
+ * Replace all ODE formulae with completely generic forms.
+ * Add '-search' option to perform background high-speed discovery
+ * for completely new attractors without impacting rendering
+ * performance.
+ * Use gaussian distribution for initial point positions and for
+ * parameter search.
+ * Add "+dbuf" option to allow Double-Buffering to be turned off on
+ * slow X servers.
+ * Remove redundant '-zoom' option. Now automatically zooms if both
+ * rotation and riding are permitted.
+ * Replace dynamic bounding box with static one pre-calculated
+ * during discovery phase.
+ * Simplify and fix bounding box clipping code. Should now be safe
+ * to run without double buffer on all XFree86 servers if desired.
+ * 12-Oct-2004: [TDA] Merge Xscreensaver and Xlockmore branches
+ * Added Chalky's orbital camera, but made the zooming work by
+ * flying the camera rather than interpolating the view transforms.
+ * Added Chalky's Bounding Box, but time-averaged the boundaries to
+ * let the lost bees escape.
+ * Added Chalky's 'view-frustrum' clipping, but only applying it to
+ * the Bounding Box. Trails make clipping less useful.
+ * Added Chalky's "-slow" and "-freeze" options for compatibility,
+ * but haven't implemented the features, since the results are ugly
+ * and make no mathematical contribution.
+ * Added Double-Buffering as a work-around for a persistent XFree86
+ * bug that left debris on the screen.
+ * 21-Mar-2003: [TDA] Trails added (XLockmore branch)
+ * 01-Nov-2000: [TDA] Allocation checks (XLockmore branch)
+ * 21-Feb-2000: [Chalky] Major hackage (Stephen Davies, chalky@null.net)
+ * (Xscreensaver branch)
+ * Forced perspective mode, added 3d box around attractor which
+ * involved coding 3d-planar-clipping against the view-frustrum
+ * thingy. Also made view alternate between piggybacking on a 'bee'
+ * to zooming around outside the attractor. Most bees slow down and
+ * stop, to make the structure of the attractor more obvious.
+* 28-Jan-1999: [TDA] Catch 'lost' bees in flow.c and disable them.
+ * (XLockmore branch)
+ * I chose to disable them rather than reinitialise them because
+ * reinitialising can produce fake attractors.
+ * This has allowed me to relax some of the parameters and initial
+ * conditions slightly to catch some of the more extreme cases. As a
+ * result you may see some bees fly away at the start - these are the ones
+ * that 'missed' the attractor. If the bee with the camera should fly
+ * away the mode will restart :-)
+ * 31-Nov-1998: [TDA] Added Duffing (what a strange day that was :) DAB)
+ * Duffing's forced oscillator has been added to the formula list and
+ * the parameters section has been updated to display it in Poincare'
+ * section.
+ * 30-Nov-1998: [TDA] Added travelling perspective option
+ * A more exciting point-of-view has been added to all autonomous flows.
+ * This views the flow as seen by a particle moving with the flow. In the
+ * metaphor of the original code, I've attached a camera to one of the
+ * trained bees!
+ * 30-Nov-1998: [TDA] Much code cleanup.
+ * 09-Apr-1997: [TDA] Ported to xlockmore-4
+ * 18-Jul-1996: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+ * 31-Aug-1990: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org).
+ */
+
+#ifdef STANDALONE
+# define MODE_flow
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 3000 \n" \
+ "*size: -10 \n" \
+ "*cycles: 10000 \n" \
+ "*ncolors: 200 \n"
+
+# define release_flow 0
+# define reshape_flow 0
+# define flow_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_flow
+
+#define DEF_ROTATE "TRUE"
+#define DEF_RIDE "TRUE"
+#define DEF_BOX "TRUE"
+#define DEF_PERIODIC "TRUE"
+#define DEF_SEARCH "TRUE"
+#define DEF_DBUF "TRUE"
+
+static Bool rotatep;
+static Bool ridep;
+static Bool boxp;
+static Bool periodicp;
+static Bool searchp;
+static Bool dbufp;
+
+static XrmOptionDescRec opts[] = {
+ {"-rotate", ".flow.rotate", XrmoptionNoArg, "on"},
+ {"+rotate", ".flow.rotate", XrmoptionNoArg, "off"},
+ {"-ride", ".flow.ride", XrmoptionNoArg, "on"},
+ {"+ride", ".flow.ride", XrmoptionNoArg, "off"},
+ {"-box", ".flow.box", XrmoptionNoArg, "on"},
+ {"+box", ".flow.box", XrmoptionNoArg, "off"},
+ {"-periodic", ".flow.periodic", XrmoptionNoArg, "on"},
+ {"+periodic", ".flow.periodic", XrmoptionNoArg, "off"},
+ {"-search", ".flow.search", XrmoptionNoArg, "on"},
+ {"+search", ".flow.search", XrmoptionNoArg, "off"},
+ {"-dbuf", ".flow.dbuf", XrmoptionNoArg, "on"},
+ {"+dbuf", ".flow.dbuf", XrmoptionNoArg, "off"},
+};
+
+static argtype vars[] = {
+ {&rotatep, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&ridep, "ride", "Ride", DEF_RIDE, t_Bool},
+ {&boxp, "box", "Box", DEF_BOX, t_Bool},
+ {&periodicp, "periodic", "Periodic", DEF_PERIODIC, t_Bool},
+ {&searchp, "search", "Search", DEF_SEARCH, t_Bool},
+ {&dbufp, "dbuf", "Dbuf", DEF_DBUF, t_Bool},
+};
+
+static OptionStruct desc[] = {
+ {"-/+rotate", "turn on/off rotating around attractor."},
+ {"-/+ride", "turn on/off ride in the flow."},
+ {"-/+box", "turn on/off bounding box."},
+ {"-/+periodic", "turn on/off periodic attractors."},
+ {"-/+search", "turn on/off search for new attractors."},
+ {"-/+dbuf", "turn on/off double buffering."},
+};
+
+ENTRYPOINT ModeSpecOpt flow_opts =
+{sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct flow_description = {
+ "flow", "init_flow", "draw_flow", NULL,
+ "refresh_flow", "init_flow", "free_flow", &flow_opts,
+ 1000, 1024, 10000, -10, 200, 1.0, "",
+ "Shows dynamic strange attractors", 0, NULL
+};
+
+#endif
+
+typedef struct { double x, y, z; } dvector;
+
+#define N_PARS 20 /* Enough for Full Cubic or Periodic Cubic */
+typedef dvector Par[N_PARS];
+enum { /* Name the parameter indices to make it easier to write
+ standard examples */
+ C,
+ X,XX,XXX,XXY,XXZ,XY,XYY,XYZ,XZ,XZZ,
+ Y,YY,YYY,YYZ,YZ,YZZ,
+ Z,ZZ,ZZZ,
+ SINY = XY /* OK to overlap in this case */
+};
+
+/* Camera target [TDA] */
+typedef enum {
+ ORBIT = 0,
+ BEE = 1
+} Chaseto;
+
+/* Macros */
+#define IX(C) ((C) * segindex + sp->cnsegs[(C)])
+#define B(t,b) (sp->p + (t) + (b) * sp->taillen)
+#define X(t,b) (B((t),(b))->x)
+#define Y(t,b) (B((t),(b))->y)
+#define Z(t,b) (B((t),(b))->z)
+#define balance_rand(v) ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
+#define LOST_IN_SPACE 2000.0
+#define INITIALSTEP 0.04
+#define EYEHEIGHT 0.005
+#define MINTRAIL 2
+#define BOX_L 36
+
+/* Points that make up the box (normalized coordinates) */
+static const double box[][3] = {
+ {1,1,1}, /* 0 */
+ {1,1,-1}, /* 1 */
+ {1,-1,-1}, /* 2 */
+ {1,-1,1}, /* 3 */
+ {-1,1,1}, /* 4 */
+ {-1,1,-1}, /* 5 */
+ {-1,-1,-1},/* 6 */
+ {-1,-1,1}, /* 7 */
+ {1, .8, .8},
+ {1, .8,-.8},
+ {1,-.8,-.8},
+ {1,-.8, .8},
+ { .8,1, .8},
+ { .8,1,-.8},
+ {-.8,1,-.8},
+ {-.8,1, .8},
+ { .8, .8,1},
+ { .8,-.8,1},
+ {-.8,-.8,1},
+ {-.8, .8,1},
+ {-1, .8, .8},
+ {-1, .8,-.8},
+ {-1,-.8,-.8},
+ {-1,-.8, .8},
+ { .8,-1, .8},
+ { .8,-1,-.8},
+ {-.8,-1,-.8},
+ {-.8,-1, .8},
+ { .8, .8,-1},
+ { .8,-.8,-1},
+ {-.8,-.8,-1},
+ {-.8, .8,-1}
+};
+
+/* Lines connecting the box dots */
+static const double lines[][2] = {
+ {0,1}, {1,2}, {2,3}, {3,0}, /* box */
+ {4,5}, {5,6}, {6,7}, {7,4},
+ {0,4}, {1,5}, {2,6}, {3,7},
+ {4+4,5+4}, {5+4,6+4}, {6+4,7+4}, {7+4,4+4},
+ {4+8,5+8}, {5+8,6+8}, {6+8,7+8}, {7+8,4+8},
+ {4+12,5+12}, {5+12,6+12}, {6+12,7+12}, {7+12,4+12},
+ {4+16,5+16}, {5+16,6+16}, {6+16,7+16}, {7+16,4+16},
+ {4+20,5+20}, {5+20,6+20}, {6+20,7+20}, {7+20,4+20},
+ {4+24,5+24}, {5+24,6+24}, {6+24,7+24}, {7+24,4+24},
+};
+
+typedef struct {
+ /* Variables used in rendering */
+ dvector cam[3]; /* camera flight path */
+ int chasetime;
+ Chaseto chaseto;
+ Pixmap buffer; /* Double Buffer */
+ dvector circle[2]; /* POV that circles around the scene */
+ dvector centre; /* centre */
+ int beecount; /* number of bees */
+ XSegment *csegs; /* bee lines */
+ int *cnsegs;
+ XSegment *old_segs; /* old bee lines */
+ int nold_segs;
+ int taillen;
+
+ /* Variables common to iterators */
+ dvector (*ODE) (Par par, double x, double y, double z);
+ dvector range; /* Initial conditions */
+ double yperiod; /* ODE's where Y is periodic. */
+
+ /* Variables used in iterating main flow */
+ Par par;
+ dvector *p; /* bee positions x[time][bee#] */
+ int count;
+ double lyap;
+ double size;
+ dvector mid; /* Effective bounding box */
+ double step;
+
+ /* second set of variables, used for parallel search */
+ Par par2;
+ dvector p2[2];
+ int count2;
+ double lyap2;
+ double size2;
+ dvector mid2;
+ double step2;
+
+} flowstruct;
+
+static flowstruct *flows = (flowstruct *) NULL;
+
+/*
+ * Private functions
+ */
+
+
+/* ODE functions */
+
+/* Generic 3D Cubic Polynomial. Includes all the Quadratics (Lorentz,
+ Rossler) and much more! */
+
+/* I considered offering a seperate 'Quadratic' option, since Cubic is
+ clearly overkill for the standard examples, but the performance
+ difference is too small to measure. The compute time is entirely
+ dominated by the XDrawSegments calls anyway. [TDA] */
+static dvector
+Cubic(Par a, double x, double y, double z)
+{
+ dvector d;
+ d.x = a[C].x + a[X].x*x + a[XX].x*x*x + a[XXX].x*x*x*x + a[XXY].x*x*x*y +
+ a[XXZ].x*x*x*z + a[XY].x*x*y + a[XYY].x*x*y*y + a[XYZ].x*x*y*z +
+ a[XZ].x*x*z + a[XZZ].x*x*z*z + a[Y].x*y + a[YY].x*y*y +
+ a[YYY].x*y*y*y + a[YYZ].x*y*y*z + a[YZ].x*y*z + a[YZZ].x*y*z*z +
+ a[Z].x*z + a[ZZ].x*z*z + a[ZZZ].x*z*z*z;
+
+ d.y = a[C].y + a[X].y*x + a[XX].y*x*x + a[XXX].y*x*x*x + a[XXY].y*x*x*y +
+ a[XXZ].y*x*x*z + a[XY].y*x*y + a[XYY].y*x*y*y + a[XYZ].y*x*y*z +
+ a[XZ].y*x*z + a[XZZ].y*x*z*z + a[Y].y*y + a[YY].y*y*y +
+ a[YYY].y*y*y*y + a[YYZ].y*y*y*z + a[YZ].y*y*z + a[YZZ].y*y*z*z +
+ a[Z].y*z + a[ZZ].y*z*z + a[ZZZ].y*z*z*z;
+
+ d.z = a[C].z + a[X].z*x + a[XX].z*x*x + a[XXX].z*x*x*x + a[XXY].z*x*x*y +
+ a[XXZ].z*x*x*z + a[XY].z*x*y + a[XYY].z*x*y*y + a[XYZ].z*x*y*z +
+ a[XZ].z*x*z + a[XZZ].z*x*z*z + a[Y].z*y + a[YY].z*y*y +
+ a[YYY].z*y*y*y + a[YYZ].z*y*y*z + a[YZ].z*y*z + a[YZZ].z*y*z*z +
+ a[Z].z*z + a[ZZ].z*z*z + a[ZZZ].z*z*z*z;
+
+ return d;
+}
+
+/* 3D Cubic in (x,z) with periodic sinusoidal forcing term in x. y is
+ the independent periodic (time) axis. This includes Birkhoff's
+ Bagel and Duffing's Attractor */
+static dvector
+Periodic(Par a, double x, double y, double z)
+{
+ dvector d;
+
+ d.x = a[C].x + a[X].x*x + a[XX].x*x*x + a[XXX].x*x*x*x +
+ a[XXZ].x*x*x*z + a[XZ].x*x*z + a[XZZ].x*x*z*z + a[Z].x*z +
+ a[ZZ].x*z*z + a[ZZZ].x*z*z*z + a[SINY].x*sin(y);
+
+ d.y = a[C].y;
+
+ d.z = a[C].z + a[X].z*x + a[XX].z*x*x + a[XXX].z*x*x*x +
+ a[XXZ].z*x*x*z + a[XZ].z*x*z + a[XZZ].z*x*z*z + a[Z].z*z +
+ a[ZZ].z*z*z + a[ZZZ].z*z*z*z;
+
+ return d;
+}
+
+/* Numerical integration of the ODE using 2nd order Runge Kutta.
+ Returns length^2 of the update, so that we can detect if the step
+ size needs reducing. */
+static double
+Iterate(dvector *p, dvector(*ODE)(Par par, double x, double y, double z),
+ Par par, double step)
+{
+ dvector k1, k2, k3;
+
+ k1 = ODE(par, p->x, p->y, p->z);
+ k1.x *= step;
+ k1.y *= step;
+ k1.z *= step;
+ k2 = ODE(par, p->x + k1.x, p->y + k1.y, p->z + k1.z);
+ k2.x *= step;
+ k2.y *= step;
+ k2.z *= step;
+ k3.x = (k1.x + k2.x) / 2.0;
+ k3.y = (k1.y + k2.y) / 2.0;
+ k3.z = (k1.z + k2.z) / 2.0;
+
+ p->x += k3.x;
+ p->y += k3.y;
+ p->z += k3.z;
+
+ return k3.x*k3.x + k3.y*k3.y + k3.z*k3.z;
+}
+
+/* Memory functions */
+
+#define deallocate(p,t) if (p!=NULL) {free(p); p=(t*)NULL; }
+#define allocate(p,t,s) if ((p=(t*)malloc(sizeof(t)*s))==NULL)\
+{free_flow(mi);return;}
+
+ENTRYPOINT void
+free_flow(ModeInfo * mi)
+{
+ flowstruct *sp = &flows[MI_SCREEN(mi)];
+ deallocate(sp->csegs, XSegment);
+ deallocate(sp->cnsegs, int);
+ deallocate(sp->old_segs, XSegment);
+ deallocate(sp->p, dvector);
+}
+
+/* Generate Gaussian random number: mean 0, "amplitude" A (actually
+ A is 3*standard deviation). */
+
+/* Note this generates a pair of gaussian variables, so it saves one
+ to give out next time it's called */
+static double
+Gauss_Rand(double A)
+{
+ static double d;
+ static Bool ready = 0;
+ if(ready) {
+ ready = 0;
+ return A/3 * d;
+ } else {
+ double x, y, w;
+ do {
+ x = 2.0 * (double)LRAND() / MAXRAND - 1.0;
+ y = 2.0 * (double)LRAND() / MAXRAND - 1.0;
+ w = x*x + y*y;
+ } while(w >= 1.0);
+
+ w = sqrt((-2 * log(w))/w);
+ ready = 1;
+ d = x * w;
+ return A/3 * y * w;
+ }
+}
+
+/* Attempt to discover new atractors by sending a pair of bees on a
+ fast trip through the new flow and computing their Lyapunov
+ exponent. Returns False if the bees fly away.
+
+ If the bees stay bounded, the new bounds and the Lyapunov exponent
+ are stored in sp and the function returns True.
+
+ Repeat invocations continue the flow and improve the accuracy of
+ the bounds and the Lyapunov exponent. Set sp->count2 to zero to
+ start a new test.
+
+ Acts on alternate variable set, so that it can be run in parallel
+ with the main flow */
+
+static Bool
+discover(ModeInfo * mi)
+{
+ flowstruct *sp;
+ double l = 0;
+ dvector dl;
+ dvector max, min;
+ double dl2, df, rs, lsum = 0, s, maxv2 = 0, v2;
+
+ int N, i, nl = 0;
+
+ if (flows == NULL)
+ return 0;
+ sp = &flows[MI_SCREEN(mi)];
+
+ if(sp->count2 == 0) {
+ /* initial conditions */
+ sp->p2[0].x = Gauss_Rand(sp->range.x);
+ sp->p2[0].y = (sp->yperiod > 0)?
+ balance_rand(sp->range.y) : Gauss_Rand(sp->range.y);
+ sp->p2[0].z = Gauss_Rand(sp->range.z);
+
+ /* 1000 steps to find an attractor */
+ /* Most cases explode out here */
+ for(N=0; N < 1000; N++){
+ Iterate(sp->p2, sp->ODE, sp->par2, sp->step2);
+ if(sp->yperiod > 0 && sp->p2[0].y > sp->yperiod)
+ sp->p2[0].y -= sp->yperiod;
+ if(fabs(sp->p2[0].x) > LOST_IN_SPACE ||
+ fabs(sp->p2[0].y) > LOST_IN_SPACE ||
+ fabs(sp->p2[0].z) > LOST_IN_SPACE) {
+ return 0;
+ }
+ sp->count2++;
+ }
+ /* Small perturbation */
+ sp->p2[1].x = sp->p2[0].x + 0.000001;
+ sp->p2[1].y = sp->p2[0].y;
+ sp->p2[1].z = sp->p2[0].z;
+ }
+
+ /* Reset bounding box */
+ max.x = min.x = sp->p2[0].x;
+ max.y = min.y = sp->p2[0].y;
+ max.z = min.z = sp->p2[0].z;
+
+ /* Compute Lyapunov Exponent */
+
+ /* (Technically, we're only estimating the largest Lyapunov
+ Exponent, but that's all we need to know to determine if we
+ have a strange attractor.) [TDA] */
+
+ /* Fly two bees close together */
+ for(N=0; N < 5000; N++){
+ for(i=0; i< 2; i++) {
+ v2 = Iterate(sp->p2+i, sp->ODE, sp->par2, sp->step2);
+ if(sp->yperiod > 0 && sp->p2[i].y > sp->yperiod)
+ sp->p2[i].y -= sp->yperiod;
+
+ if(fabs(sp->p2[i].x) > LOST_IN_SPACE ||
+ fabs(sp->p2[i].y) > LOST_IN_SPACE ||
+ fabs(sp->p2[i].z) > LOST_IN_SPACE) {
+ return 0;
+ }
+ if(v2 > maxv2) maxv2 = v2; /* Track max v^2 */
+ }
+
+ /* find bounding box */
+ if ( sp->p2[0].x < min.x ) min.x = sp->p2[0].x;
+ else if ( sp->p2[0].x > max.x ) max.x = sp->p2[0].x;
+ if ( sp->p2[0].y < min.y ) min.y = sp->p2[0].y;
+ else if ( sp->p2[0].y > max.y ) max.y = sp->p2[0].y;
+ if ( sp->p2[0].z < min.z ) min.z = sp->p2[0].z;
+ else if ( sp->p2[0].z > max.z ) max.z = sp->p2[0].z;
+
+ /* Measure how much we have to pull the two bees to prevent
+ them diverging. */
+ dl.x = sp->p2[1].x - sp->p2[0].x;
+ dl.y = sp->p2[1].y - sp->p2[0].y;
+ dl.z = sp->p2[1].z - sp->p2[0].z;
+
+ dl2 = dl.x*dl.x + dl.y*dl.y + dl.z*dl.z;
+ if(dl2 > 0) {
+ df = 1e12 * dl2;
+ rs = 1/sqrt(df);
+ sp->p2[1].x = sp->p2[0].x + rs * dl.x;
+ sp->p2[1].y = sp->p2[0].y + rs * dl.y;
+ sp->p2[1].z = sp->p2[0].z + rs * dl.z;
+ lsum = lsum + log(df);
+ nl = nl + 1;
+ l = M_LOG2E / 2 * lsum / nl / sp->step2;
+ }
+ sp->count2++;
+ }
+ /* Anything that didn't explode has a finite attractor */
+ /* If Lyapunov is negative then it probably hit a fixed point or a
+ * limit cycle. Positive Lyapunov indicates a strange attractor. */
+
+ sp->lyap2 = l;
+
+ sp->size2 = max.x - min.x;
+ s = max.y - min.y;
+ if(s > sp->size2) sp->size2 = s;
+ s = max.z - min.z;
+ if(s > sp->size2) sp->size2 = s;
+
+ sp->mid2.x = (max.x + min.x) / 2;
+ sp->mid2.y = (max.y + min.y) / 2;
+ sp->mid2.z = (max.z + min.z) / 2;
+
+ if(sqrt(maxv2) > sp->size2 * 0.2) {
+ /* Flowing too fast, reduce step size. This
+ helps to eliminate high-speed limit cycles,
+ which can show +ve Lyapunov due to integration
+ inaccuracy. */
+ sp->step2 /= 2;
+ }
+ return 1;
+}
+
+/* Sets up initial conditions for a flow without all the extra baggage
+ that goes with init_flow */
+static void
+restart_flow(ModeInfo * mi)
+{
+ flowstruct *sp;
+ int b;
+
+ if (flows == NULL)
+ return;
+ sp = &flows[MI_SCREEN(mi)];
+ sp->count = 0;
+
+ /* Re-Initialize point positions, velocities, etc. */
+ for (b = 0; b < sp->beecount; b++) {
+ X(0, b) = Gauss_Rand(sp->range.x);
+ Y(0, b) = (sp->yperiod > 0)?
+ balance_rand(sp->range.y) : Gauss_Rand(sp->range.y);
+ Z(0, b) = Gauss_Rand(sp->range.z);
+ }
+}
+
+/* Returns true if line was behind a clip plane, or it clips the line */
+/* nx,ny,nz is the normal to the plane. d is the distance from the origin */
+/* s and e are the end points of the line to be clipped */
+static int
+clip(double nx, double ny, double nz, double d, dvector *s, dvector *e)
+{
+ int front1, front2;
+ dvector w, p;
+ double t;
+
+ front1 = (nx*s->x + ny*s->y + nz*s->z >= -d);
+ front2 = (nx*e->x + ny*e->y + nz*e->z >= -d);
+ if (!front1 && !front2) return 1;
+ if (front1 && front2) return 0;
+ w.x = e->x - s->x;
+ w.y = e->y - s->y;
+ w.z = e->z - s->z;
+
+ /* Find t in line equation */
+ t = ( -d - nx*s->x - ny*s->y - nz*s->z) / ( nx*w.x + ny*w.y + nz*w.z);
+
+ p.x = s->x + w.x * t;
+ p.y = s->y + w.y * t;
+ p.z = s->z + w.z * t;
+
+ /* Move clipped point to the intersection */
+ if (front2) {
+ *s = p;
+ } else {
+ *e = p;
+ }
+ return 0;
+}
+
+/*
+ * Public functions
+ */
+
+ENTRYPOINT void
+init_flow (ModeInfo * mi)
+{
+ flowstruct *sp;
+ char *name;
+
+ MI_INIT (mi, flows);
+ sp = &flows[MI_SCREEN(mi)];
+
+ sp->count2 = 0;
+
+ sp->taillen = MI_SIZE(mi);
+ if (sp->taillen < -MINTRAIL) {
+ /* Change by sqrt so it seems more variable */
+ sp->taillen = NRAND((int)sqrt((double) (-sp->taillen - MINTRAIL + 1)));
+ sp->taillen = sp->taillen * sp->taillen + MINTRAIL;
+ } else if (sp->taillen < MINTRAIL) {
+ sp->taillen = MINTRAIL;
+ }
+
+ if(!rotatep && !ridep) rotatep = True; /* We need at least one viewpoint */
+
+ /* Start camera at Orbit or Bee */
+ if(rotatep) {
+ sp->chaseto = ORBIT;
+ } else {
+ sp->chaseto = BEE;
+ }
+ sp->chasetime = 1; /* Go directly to target */
+
+ sp->lyap = 0;
+ sp->yperiod = 0;
+ sp->step2 = INITIALSTEP;
+
+ /* Zero parameter set */
+ memset(sp->par2, 0, N_PARS * sizeof(dvector));
+
+ /* Set up standard examples */
+ switch (NRAND((periodicp) ? 5 : 3)) {
+ case 0:
+ /*
+ x' = a(y - x)
+ y' = x(b - z) - y
+ z' = xy - cz
+ */
+ name = "Lorentz";
+ sp->par2[Y].x = 10 + balance_rand(5*0); /* a */
+ sp->par2[X].x = - sp->par2[Y].x; /* -a */
+ sp->par2[X].y = 28 + balance_rand(5*0); /* b */
+ sp->par2[XZ].y = -1;
+ sp->par2[Y].y = -1;
+ sp->par2[XY].z = 1;
+ sp->par2[Z].z = - 2 + balance_rand(1*0); /* -c */
+ break;
+ case 1:
+ /*
+ x' = -(y + az)
+ y' = x + by
+ z' = c + z(x - 5.7)
+ */
+ name = "Rossler";
+ sp->par2[Y].x = -1;
+ sp->par2[Z].x = -2 + balance_rand(1); /* a */
+ sp->par2[X].y = 1;
+ sp->par2[Y].y = 0.2 + balance_rand(0.1); /* b */
+ sp->par2[C].z = 0.2 + balance_rand(0.1); /* c */
+ sp->par2[XZ].z = 1;
+ sp->par2[Z].z = -5.7;
+ break;
+ case 2:
+ /*
+ x' = -(y + az)
+ y' = x + by - cz^2
+ z' = 0.2 + z(x - 5.7)
+ */
+ name = "RosslerCone";
+ sp->par2[Y].x = -1;
+ sp->par2[Z].x = -2; /* a */
+ sp->par2[X].y = 1;
+ sp->par2[Y].y = 0.2; /* b */
+ sp->par2[ZZ].y = -0.331 + balance_rand(0.01); /* c */
+ sp->par2[C].z = 0.2;
+ sp->par2[XZ].z = 1;
+ sp->par2[Z].z = -5.7;
+ break;
+ case 3:
+ /*
+ x' = -z + b sin(y)
+ y' = c
+ z' = 0.7x + az(0.1 - x^2)
+ */
+ name = "Birkhoff";
+ sp->par2[Z].x = -1;
+ sp->par2[SINY].x = 0.35 + balance_rand(0.25); /* b */
+ sp->par2[C].y = 1.57; /* c */
+ sp->par2[X].z = 0.7;
+ sp->par2[Z].z = 1 + balance_rand(0.5); /* a/10 */
+ sp->par2[XXZ].z = -10 * sp->par2[Z].z; /* -a */
+ sp->yperiod = 2 * M_PI;
+ break;
+ default:
+ /*
+ x' = -ax - z/2 - z^3/8 + b sin(y)
+ y' = c
+ z' = 2x
+ */
+ name = "Duffing";
+ sp->par2[X].x = -0.2 + balance_rand(0.1); /* a */
+ sp->par2[Z].x = -0.5;
+ sp->par2[ZZZ].x = -0.125;
+ sp->par2[SINY].x = 27.0 + balance_rand(3.0); /* b */
+ sp->par2[C].y = 1.33; /* c */
+ sp->par2[X].z = 2;
+ sp->yperiod = 2 * M_PI;
+ break;
+
+ }
+
+ sp->range.x = 5;
+ sp->range.z = 5;
+
+ if(sp->yperiod > 0) {
+ sp->ODE = Periodic;
+ /* periodic flows show either uniform distribution or a
+ snapshot on the 'time' axis */
+ sp->range.y = NRAND(2)? sp->yperiod : 0;
+ } else {
+ sp->range.y = 5;
+ sp->ODE = Cubic;
+ }
+
+ /* Run discoverer to set up bounding box, etc. Lyapunov will
+ probably be innaccurate, since we're only running it once, but
+ we're using known strange attractors so it should be ok. */
+ discover(mi);
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout,
+ "flow: Lyapunov exponent: %g, step: %g, size: %g (%s)\n",
+ sp->lyap2, sp->step2, sp->size2, name);
+ /* Install new params */
+ sp->lyap = sp->lyap2;
+ sp->size = sp->size2;
+ sp->mid = sp->mid2;
+ sp->step = sp->step2;
+ memcpy(sp->par, sp->par2, sizeof(sp->par2));
+
+ sp->count2 = 0; /* Reset search */
+
+ sp->beecount = MI_COUNT(mi);
+ if (!sp->beecount) {
+ sp->beecount = 1; /* The camera requires 1 or more */
+ } else if (sp->beecount < 0) { /* random variations */
+ sp->beecount = NRAND(-sp->beecount) + 1; /* Minimum 1 */
+ }
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ dbufp = False;
+# endif
+
+ if(dbufp) { /* Set up double buffer */
+ if (sp->buffer != None)
+ XFreePixmap(MI_DISPLAY(mi), sp->buffer);
+ sp->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi));
+ } else {
+ sp->buffer = MI_WINDOW(mi);
+ }
+ /* no "NoExpose" events from XCopyArea wanted */
+ XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
+
+ /* Make sure we're using 'thin' lines */
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast,
+ JoinMiter);
+
+ /* Clear the background (may be slow depending on user prefs). */
+ MI_CLEARWINDOW(mi);
+
+ /* Allocate memory. */
+ if (sp->csegs == NULL) {
+ allocate(sp->csegs, XSegment,
+ (sp->beecount + BOX_L) * MI_NPIXELS(mi) * sp->taillen);
+ allocate(sp->cnsegs, int, MI_NPIXELS(mi));
+ allocate(sp->old_segs, XSegment, (sp->beecount + BOX_L) * sp->taillen);
+ allocate(sp->p, dvector, sp->beecount * sp->taillen);
+ }
+
+ /* Initialize point positions, velocities, etc. */
+ restart_flow(mi);
+
+ /* Set up camera tail */
+ X(1, 0) = sp->cam[1].x = 0;
+ Y(1, 0) = sp->cam[1].y = 0;
+ Z(1, 0) = sp->cam[1].z = 0;
+}
+
+ENTRYPOINT void
+draw_flow (ModeInfo * mi)
+{
+ int b, i;
+ int col, begin, end;
+ double M[3][3]; /* transformation matrix */
+ flowstruct *sp = NULL;
+ int swarm = 0;
+ int segindex;
+
+ if (flows == NULL)
+ return;
+ sp = &flows[MI_SCREEN(mi)];
+ if (sp->csegs == NULL)
+ return;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+ /* multiplier for indexing segment arrays. Used in IX macro, etc. */
+ segindex = (sp->beecount + BOX_L) * sp->taillen;
+
+ if(searchp){
+ if(sp->count2 == 0) { /* start new search */
+ sp->step2 = INITIALSTEP;
+ /* Pick random parameters. Actual range is irrelevant
+ since parameter scale determines flow speed but not
+ structure. */
+ for(i=0; i< N_PARS; i++) {
+ sp->par2[i].x = Gauss_Rand(1.0);
+ sp->par2[i].y = Gauss_Rand(1.0);
+ sp->par2[i].z = Gauss_Rand(1.0);
+ }
+ }
+ if(!discover(mi)) { /* Flow exploded, reset. */
+ sp->count2 = 0;
+ } else {
+ if(sp->lyap2 < 0) {
+ sp->count2 = 0; /* Attractor found, but it's not strange */
+ }else if(sp->count2 > 1000000) { /* This one will do */
+ sp->count2 = 0; /* Reset search */
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout,
+ "flow: Lyapunov exponent: %g, step: %g, size: %g (unnamed)\n",
+ sp->lyap2, sp->step2, sp->size2);
+ /* Install new params */
+ sp->lyap = sp->lyap2;
+ sp->size = sp->size2;
+ sp->mid = sp->mid2;
+ sp->step = sp->step2;
+ memcpy(sp->par, sp->par2, sizeof(sp->par2));
+
+ /* If we're allowed to zoom out, do so now, so that we
+ get a look at the new attractor. */
+ if(sp->chaseto == BEE && rotatep) {
+ sp->chaseto = ORBIT;
+ sp->chasetime = 100;
+ }
+ /* Reset initial conditions, so we don't get
+ misleading artifacts in the particle density. */
+ restart_flow(mi);
+ }
+ }
+ }
+
+ /* Reset segment buffers */
+ for (col = 0; col < MI_NPIXELS(mi); col++)
+ sp->cnsegs[col] = 0;
+
+ MI_IS_DRAWN(mi) = True;
+
+ /* Calculate circling POV [Chalky]*/
+ sp->circle[1] = sp->circle[0];
+ sp->circle[0].x = sp->size * 2 * sin(sp->count / 100.0) *
+ (-0.6 + 0.4 *cos(sp->count / 500.0)) + sp->mid.x;
+ sp->circle[0].y = sp->size * 2 * cos(sp->count / 100.0) *
+ (0.6 + 0.4 *cos(sp->count / 500.0)) + sp->mid.y;
+ sp->circle[0].z = sp->size * 2 * sin(sp->count / 421.0) + sp->mid.z;
+
+ /* Timed chase instead of Chalkie's Bistable oscillator [TDA] */
+ if(rotatep && ridep) {
+ if(sp->chaseto == BEE && NRAND(1000) == 0){
+ sp->chaseto = ORBIT;
+ sp->chasetime = 100;
+ }else if(NRAND(4000) == 0){
+ sp->chaseto = BEE;
+ sp->chasetime = 100;
+ }
+ }
+
+ /* Set up orientation matrix */
+ {
+ double x[3], p[3], x2=0, xp=0;
+ int j;
+
+ /* Chasetime is here to guarantee the camera makes it all the
+ way to the target in a finite number of steps. */
+ if(sp->chasetime > 1)
+ sp->chasetime--;
+
+ if(sp->chaseto == BEE){
+ /* Camera Head targets bee 0 */
+ sp->cam[0].x += (X(0, 0) - sp->cam[0].x)/sp->chasetime;
+ sp->cam[0].y += (Y(0, 0) - sp->cam[0].y)/sp->chasetime;
+ sp->cam[0].z += (Z(0, 0) - sp->cam[0].z)/sp->chasetime;
+
+ /* Camera Tail targets previous position of bee 0 */
+ sp->cam[1].x += (X(1, 0) - sp->cam[1].x)/sp->chasetime;
+ sp->cam[1].y += (Y(1, 0) - sp->cam[1].y)/sp->chasetime;
+ sp->cam[1].z += (Z(1, 0) - sp->cam[1].z)/sp->chasetime;
+
+ /* Camera Wing targets bee 1 */
+ sp->cam[2].x += (X(0, 1) - sp->cam[2].x)/sp->chasetime;
+ sp->cam[2].y += (Y(0, 1) - sp->cam[2].y)/sp->chasetime;
+ sp->cam[2].z += (Z(0, 1) - sp->cam[2].z)/sp->chasetime;
+ } else {
+ /* Camera Head targets Orbiter */
+ sp->cam[0].x += (sp->circle[0].x - sp->cam[0].x)/sp->chasetime;
+ sp->cam[0].y += (sp->circle[0].y - sp->cam[0].y)/sp->chasetime;
+ sp->cam[0].z += (sp->circle[0].z - sp->cam[0].z)/sp->chasetime;
+
+ /* Camera Tail targets diametrically opposite the middle
+ of the bounding box from the Orbiter */
+ sp->cam[1].x +=
+ (2*sp->circle[0].x - sp->mid.x - sp->cam[1].x)/sp->chasetime;
+ sp->cam[1].y +=
+ (2*sp->circle[0].y - sp->mid.y - sp->cam[1].y)/sp->chasetime;
+ sp->cam[1].z +=
+ (2*sp->circle[0].z - sp->mid.z - sp->cam[1].z)/sp->chasetime;
+ /* Camera Wing targets previous position of Orbiter */
+ sp->cam[2].x += (sp->circle[1].x - sp->cam[2].x)/sp->chasetime;
+ sp->cam[2].y += (sp->circle[1].y - sp->cam[2].y)/sp->chasetime;
+ sp->cam[2].z += (sp->circle[1].z - sp->cam[2].z)/sp->chasetime;
+ }
+
+ /* Viewpoint from Tail of camera */
+ sp->centre.x=sp->cam[1].x;
+ sp->centre.y=sp->cam[1].y;
+ sp->centre.z=sp->cam[1].z;
+
+ /* forward vector */
+ x[0] = sp->cam[0].x - sp->cam[1].x;
+ x[1] = sp->cam[0].y - sp->cam[1].y;
+ x[2] = sp->cam[0].z - sp->cam[1].z;
+
+ /* side */
+ p[0] = sp->cam[2].x - sp->cam[1].x;
+ p[1] = sp->cam[2].y - sp->cam[1].y;
+ p[2] = sp->cam[2].z - sp->cam[1].z;
+
+
+ /* So long as X and P don't collide, these can be used to form
+ three mutually othogonal axes: X, (X x P) x X and X x P.
+ After being normalised to unit length, these form the
+ Orientation Matrix. */
+
+ for(i=0; i<3; i++){
+ x2+= x[i]*x[i]; /* X . X */
+ xp+= x[i]*p[i]; /* X . P */
+ M[0][i] = x[i]; /* X */
+ }
+
+ for(i=0; i<3; i++) /* (X x P) x X */
+ M[1][i] = x2*p[i] - xp*x[i]; /* == (X . X) P - (X . P) X */
+
+ M[2][0] = x[1]*p[2] - x[2]*p[1]; /* X x P */
+ M[2][1] = -x[0]*p[2] + x[2]*p[0];
+ M[2][2] = x[0]*p[1] - x[1]*p[0];
+
+ /* normalise axes */
+ for(j=0; j<3; j++){
+ double A=0;
+ for(i=0; i<3; i++) A+=M[j][i]*M[j][i]; /* sum squares */
+ A=sqrt(A);
+ if(A>0)
+ for(i=0; i<3; i++) M[j][i]/=A;
+ }
+
+ if(sp->chaseto == BEE) {
+ X(0, 1)=X(0, 0)+M[1][0]*sp->step; /* adjust neighbour */
+ Y(0, 1)=Y(0, 0)+M[1][1]*sp->step;
+ Z(0, 1)=Z(0, 0)+M[1][2]*sp->step;
+ }
+ }
+
+ /* <=- Bounding Box -=> */
+ if(boxp) {
+ for (b = 0; b < BOX_L; b++) {
+
+ /* Chalky's clipping code, Only used for the box */
+ /* clipping trails is slow and of little benefit. [TDA] */
+ int p1 = lines[b][0];
+ int p2 = lines[b][1];
+ dvector A1, A2;
+ double x1=box[p1][0]* sp->size/2 + sp->mid.x - sp->centre.x;
+ double y1=box[p1][1]* sp->size/2 + sp->mid.y - sp->centre.y;
+ double z1=box[p1][2]* sp->size/2 + sp->mid.z - sp->centre.z;
+ double x2=box[p2][0]* sp->size/2 + sp->mid.x - sp->centre.x;
+ double y2=box[p2][1]* sp->size/2 + sp->mid.y - sp->centre.y;
+ double z2=box[p2][2]* sp->size/2 + sp->mid.z - sp->centre.z;
+
+ A1.x=M[0][0]*x1 + M[0][1]*y1 + M[0][2]*z1;
+ A1.y=M[1][0]*x1 + M[1][1]*y1 + M[1][2]*z1;
+ A1.z=M[2][0]*x1 + M[2][1]*y1 + M[2][2]*z1 + EYEHEIGHT * sp->size;
+ A2.x=M[0][0]*x2 + M[0][1]*y2 + M[0][2]*z2;
+ A2.y=M[1][0]*x2 + M[1][1]*y2 + M[1][2]*z2;
+ A2.z=M[2][0]*x2 + M[2][1]*y2 + M[2][2]*z2 + EYEHEIGHT * sp->size;
+
+ /* Clip in 3D before projecting down to 2D. A 2D clip
+ after projection wouldn't be able to handle lines that
+ cross x=0 */
+ if (clip(1, 0, 0,-1, &A1, &A2) || /* Screen */
+ clip(1, 2, 0, 0, &A1, &A2) || /* Left */
+ clip(1,-2, 0, 0, &A1, &A2) || /* Right */
+ clip(1,0, 2.0*MI_WIDTH(mi)/MI_HEIGHT(mi), 0, &A1, &A2)||/*UP*/
+ clip(1,0,-2.0*MI_WIDTH(mi)/MI_HEIGHT(mi), 0, &A1, &A2))/*Down*/
+ continue;
+
+ /* Colour according to bee */
+ col = b % (MI_NPIXELS(mi) - 1);
+
+ sp->csegs[IX(col)].x1 = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * A1.y/A1.x;
+ sp->csegs[IX(col)].y1 = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * A1.z/A1.x;
+ sp->csegs[IX(col)].x2 = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * A2.y/A2.x;
+ sp->csegs[IX(col)].y2 = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * A2.z/A2.x;
+ sp->cnsegs[col]++;
+ }
+ }
+
+ /* <=- Bees -=> */
+ for (b = 0; b < sp->beecount; b++) {
+ if(fabs(X(0, b)) > LOST_IN_SPACE ||
+ fabs(Y(0, b)) > LOST_IN_SPACE ||
+ fabs(Z(0, b)) > LOST_IN_SPACE){
+ if(sp->chaseto == BEE && b == 0){
+ /* Lost camera bee. Need to replace it since
+ rerunning init_flow could lose us a hard-won new
+ attractor. Try moving it very close to a random
+ other bee. This way we have a good chance of being
+ close to the attractor and not forming a false
+ artifact. If we've lost many bees this may need to
+ be repeated. */
+ /* Don't worry about camera wingbee. It stays close
+ to the main camera bee no matter what happens. */
+ int newb = 1 + NRAND(sp->beecount - 1);
+ X(0, 0) = X(0, newb) + 0.001;
+ Y(0, 0) = Y(0, newb);
+ Z(0, 0) = Z(0, newb);
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout,
+ "flow: resetting lost camera near bee %d\n",
+ newb);
+ }
+ continue;
+ }
+
+ /* Age the tail. It's critical this be fast since
+ beecount*taillen can be large. */
+ memmove(B(1, b), B(0, b), (sp->taillen - 1) * sizeof(dvector));
+
+ Iterate(B(0,b), sp->ODE, sp->par, sp->step);
+
+ /* Don't show wingbee since he's not quite in the flow. */
+ if(sp->chaseto == BEE && b == 1) continue;
+
+ /* Colour according to bee */
+ col = b % (MI_NPIXELS(mi) - 1);
+
+ /* Fill the segment lists. */
+
+ begin = 0; /* begin new trail */
+ end = MIN(sp->taillen, sp->count); /* short trails at first */
+ for(i=0; i < end; i++){
+ double x = X(i,b)-sp->centre.x;
+ double y = Y(i,b)*(sp->yperiod < 0? (sp->size/sp->yperiod) :1)
+ -sp->centre.y;
+ double z = Z(i,b)-sp->centre.z;
+ double XM=M[0][0]*x + M[0][1]*y + M[0][2]*z;
+ double YM=M[1][0]*x + M[1][1]*y + M[1][2]*z;
+ double ZM=M[2][0]*x + M[2][1]*y + M[2][2]*z + EYEHEIGHT * sp->size;
+ short absx, absy;
+
+ swarm++; /* count the remaining bees */
+ if(sp->yperiod > 0 && Y(i,b) > sp->yperiod){
+ int j;
+ Y(i,b) -= sp->yperiod;
+ /* hide tail to prevent streaks in Y. Streaks in X,Z
+ are ok, they help to outline the Poincare'
+ slice. */
+ for(j = i; j < end; j++) Y(j,b) = Y(i,b);
+ /*begin = i + 1;*/
+ break;
+ }
+
+ if(XM <= 0){ /* off screen - new trail */
+ begin = i + 1;
+ continue;
+ }
+ absx = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * YM/XM;
+ absy = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * ZM/XM;
+ /* Performance bottleneck */
+ if(absx <= 0 || absx >= MI_WIDTH(mi) ||
+ absy <= 0 || absy >= MI_HEIGHT(mi)) {
+ /* off screen - new trail */
+ begin = i + 1;
+ continue;
+ }
+ if(i > begin) { /* complete previous segment */
+ sp->csegs[IX(col)].x2 = absx;
+ sp->csegs[IX(col)].y2 = absy;
+ sp->cnsegs[col]++;
+ }
+
+ if(i < end -1){ /* start new segment */
+ sp->csegs[IX(col)].x1 = absx;
+ sp->csegs[IX(col)].y1 = absy;
+ }
+ }
+ }
+
+ /* Erase */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ if (dbufp) { /* In Double Buffer case, prepare off-screen copy */
+ /* For slow systems, this can be the single biggest bottleneck
+ in the program. These systems may be better of not using
+ the double buffer. */
+ XFillRectangle(MI_DISPLAY(mi), sp->buffer, MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else { /* Otherwise, erase previous segment list directly */
+ XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
+ sp->old_segs, sp->nold_segs);
+ }
+
+ /* Render */
+ if (MI_NPIXELS(mi) > 2){ /* colour */
+ int mn = 0;
+ for (col = 0; col < MI_NPIXELS(mi) - 1; col++)
+ if (sp->cnsegs[col] > 0) {
+ if(sp->cnsegs[col] > mn) mn = sp->cnsegs[col];
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, col+1));
+ /* This is usually the biggest bottleneck on most
+ systems. The maths load is insignificant compared
+ to this. */
+ XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
+ sp->csegs + col * segindex, sp->cnsegs[col]);
+ }
+ } else { /* mono handled seperately since xlockmore uses '1' for
+ mono white! */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
+ sp->csegs, sp->cnsegs[0]);
+ }
+ if (dbufp) { /* In Double Buffer case, this updates the screen */
+ XCopyArea(MI_DISPLAY(mi), sp->buffer, MI_WINDOW(mi), MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi), 0, 0);
+ } else { /* Otherwise, screen is already updated. Copy segments
+ to erase-list to be erased directly next time. */
+ int c = 0;
+ for (col = 0; col < MI_NPIXELS(mi) - 1; col++) {
+ memcpy(sp->old_segs + c, sp->csegs + col * segindex,
+ sp->cnsegs[col] * sizeof(XSegment));
+ c += sp->cnsegs[col];
+ }
+ sp->nold_segs = c;
+ }
+
+ if(sp->count > 1 && swarm == 0) { /* all gone */
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout, "flow: all gone at %d\n", sp->count);
+ init_flow(mi);
+ }
+
+ if(sp->count++ > MI_CYCLES(mi)){ /* Time's up. If we haven't
+ found anything new by now we
+ should pick a new standard
+ flow */
+ init_flow(mi);
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_flow (ModeInfo * mi)
+{
+ if(!dbufp) MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Flow", flow)
+
+#endif /* MODE_flow */
diff --git a/hacks/flow.man b/hacks/flow.man
new file mode 100644
index 0000000..ea3a295
--- /dev/null
+++ b/hacks/flow.man
@@ -0,0 +1,137 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flow - strange attractors.
+.SH SYNOPSIS
+.B flow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-periodic|\-no\-periodic]
+[\-search|\-no\-search]
+[\-rotate|\-no\-rotate]
+[\-ride|\-no\-ride]
+[\-box|\-no\-box]
+[\-dbuf|\-no\-dbuf]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Strange attractors formed of flows in a 3D differential equation phase
+space. Features the popular attractors described by \fBLorentz\fP,
+\fBRoessler\fP, \fBBirkhoff\fP and \fBDuffing\fP, and can discover
+entirely new attractors by itself.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Number of particles in the flow. Default: 3000
+.TP 8
+.B \-size \fInumber\fP
+Length of particle trails. Negative values indicate
+randomness. The computational load of a given flow depends on
+(particle count) * (trail length). Default: -10
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout before changing objects. 0 - 800000. Default: 10000.
+.TP 8
+.B \-periodic
+.TP 8
+.B \-no\-periodic
+turn on/off periodic attractors. These are flows in 2 dependent
+variables, with a periodic dependence on a third independent variable
+(eg time). Flow will sometimes choose to start all the particles in
+the same phase to illustrate the flow's cross-section. Default:
+on
+.TP 8
+.B \-search
+.TP 8
+.B \-no\-search
+turn on/off search for new attractors. If this is enabled, a fraction
+of the computing cycles is directed to searching a 60-dimensional
+parameter space for new strange attractors. If periodic flows are
+enabled, these can be searched too. Watch carefully - you are quite
+likely to see mathematical objects that have never been seen before,
+and since the parameters are not recorded, you'll probably never see
+them again! Default: on
+.TP 8
+.B \-rotate
+.TP 8
+.B \-no\-rotate
+turn on/off rotating around attractor. Default: on
+.TP 8
+.B \-ride
+.TP 8
+.B \-no\-ride
+turn on/off ride in the flow. Default: on
+
+If both -rotate and -ride are enabled the viewpoint will occasionally
+fly between the two views.
+.TP 8
+.B \-box
+.TP 8
+.B \-no\-box
+turn on/off bounding box. Default: on
+.TP 8
+.B \-dbuf
+.TP 8
+.B \-no\-dbuf
+turn on/off double buffering. If Flow runs slowly in full screen, but
+fast in a smaller window (eg on old graphics cards with too little
+memory), try turning this option off. Default: on
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 200.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright (c) 1996 by Tim Auckland <Tim.Auckland@Procket.com>
+Incorporating some code from Stephen Davies Copyright (c) 2000
+
+Search code based on techniques described in "Strange Attractors:
+Creating Patterns in Chaos" by Julien C. Sprott
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+This file is provided AS IS with no warranties of any kind. The author
+shall have no liability with respect to the infringement of copyrights,
+trade secrets or any patents by this file or any part thereof. In no
+event will the author be liable for any lost revenue or profits or
+other special, indirect and consequential damages.
+
+Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+
+Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org).
+.SH AUTHOR
+Tim Auckland
diff --git a/hacks/fluidballs.c b/hacks/fluidballs.c
new file mode 100644
index 0000000..9273082
--- /dev/null
+++ b/hacks/fluidballs.c
@@ -0,0 +1,852 @@
+/* fluidballs, Copyright (c) 2000 by Peter Birtles <peter@bqdesign.com.au>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Ported to X11 and xscreensaver by jwz, 27-Feb-2002.
+ *
+ * http://astronomy.swin.edu.au/~pbourke/modelling/fluid/
+ *
+ * Some physics improvements by Steven Barker <steve@blckknght.org>
+ */
+
+/* Future ideas:
+ * Specifying a distribution in the ball sizes (with a gamma curve, possibly).
+ * Brownian motion, for that extra touch of realism.
+ *
+ * It would be nice to detect when there are more balls than fit in
+ * the window, and scale the number of balls back. Useful for the
+ * xscreensaver-demo preview, which is often too tight by default.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include <stdio.h>
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int delay;
+
+ Pixmap b, ba; /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+ Bool dbeclear_p;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ GC draw_gc; /* most of the balls */
+ GC draw_gc2; /* the ball being dragged with the mouse */
+ GC erase_gc;
+ XColor fg;
+ XColor fg2;
+
+ int count; /* number of balls */
+ float xmin, ymin; /* rectangle of window, relative to root */
+ float xmax, ymax;
+
+ int mouse_ball; /* index of ball being dragged, or 0 if none. */
+
+ float tc; /* time constant (time-warp multiplier) */
+ float accx; /* horizontal acceleration (wind) */
+ float accy; /* vertical acceleration (gravity) */
+
+ float *vx, *vy; /* current ball velocities */
+ float *px, *py; /* current ball positions */
+ float *opx, *opy; /* previous ball positions */
+ float *r; /* ball radiuses */
+
+ float *m; /* ball mass, precalculated */
+ float e; /* coeficient of elasticity */
+ float max_radius; /* largest radius of any ball */
+
+ Bool random_sizes_p; /* Whether balls should be various sizes up to max. */
+ Bool shake_p; /* Whether to mess with gravity when things settle. */
+ Bool dbuf; /* Whether we're using double buffering. */
+ float shake_threshold;
+ int time_since_shake;
+
+ Bool fps_p; /* Whether to draw some text at the bottom. */
+ GC font_gc;
+ int font_height;
+ int font_baseline;
+ int frame_count;
+ int collision_count;
+ char fps_str[1024];
+
+ int time_tick;
+ struct timeval last_time;
+
+} b_state;
+
+
+/* Draws the frames per second string */
+static void
+draw_fps_string (b_state *state)
+{
+ XFillRectangle (state->dpy, state->b, state->erase_gc,
+ 0, state->xgwa.height - state->font_height*3 - 20,
+ state->xgwa.width, state->font_height*3 + 20);
+ XDrawImageString (state->dpy, state->b, state->font_gc,
+ 10, state->xgwa.height - state->font_height*2 -
+ state->font_baseline - 10,
+ state->fps_str, strlen(state->fps_str));
+}
+
+/* Finds the origin of the window relative to the root window, by
+ walking up the window tree until it reaches the top.
+ */
+static void
+window_origin (Display *dpy, Window window, int *x, int *y)
+{
+ XTranslateCoordinates (dpy, window, RootWindow (dpy, DefaultScreen (dpy)),
+ 0, 0, x, y, &window);
+}
+
+
+/* Queries the window position to see if the window has moved or resized.
+ We poll this instead of waiting for ConfigureNotify events, because
+ when the window manager moves the window, only one ConfigureNotify
+ comes in: at the end of the motion. If we poll, we can react to the
+ new position while the window is still being moved. (Assuming the WM
+ does OpaqueMove, of course.)
+ */
+static void
+check_window_moved (b_state *state)
+{
+ float oxmin = state->xmin;
+ float oxmax = state->xmax;
+ float oymin = state->ymin;
+ float oymax = state->ymax;
+ int wx, wy;
+ XGetWindowAttributes (state->dpy, state->window, &state->xgwa);
+ window_origin (state->dpy, state->window, &wx, &wy);
+ state->xmin = wx;
+ state->ymin = wy;
+ state->xmax = state->xmin + state->xgwa.width;
+ state->ymax = state->ymin + state->xgwa.height - (state->font_height*3) -
+ (state->font_height ? 22 : 0);
+
+ if (state->dbuf && (state->ba))
+ {
+ if (oxmax != state->xmax || oymax != state->ymax)
+ {
+ XFreePixmap (state->dpy, state->ba);
+ state->ba = XCreatePixmap (state->dpy, state->window,
+ state->xgwa.width, state->xgwa.height,
+ state->xgwa.depth);
+ XFillRectangle (state->dpy, state->ba, state->erase_gc, 0, 0,
+ state->xgwa.width, state->xgwa.height);
+ state->b = state->ba;
+ }
+ }
+ else
+ {
+ /* Only need to erase the window if the origin moved */
+ if (oxmin != state->xmin || oymin != state->ymin)
+ XClearWindow (state->dpy, state->window);
+ else if (state->fps_p && oymax != state->ymax)
+ XFillRectangle (state->dpy, state->b, state->erase_gc,
+ 0, state->xgwa.height - state->font_height*3,
+ state->xgwa.width, state->font_height*3);
+ }
+}
+
+
+/* Returns the position of the mouse relative to the root window.
+ */
+static void
+query_mouse (b_state *state, int *x, int *y)
+{
+ Window root1, child1;
+ int mouse_x, mouse_y, root_x, root_y;
+ unsigned int mask;
+ if (XQueryPointer (state->dpy, state->window, &root1, &child1,
+ &root_x, &root_y, &mouse_x, &mouse_y, &mask))
+ {
+ *x = root_x;
+ *y = root_y;
+ }
+ else
+ {
+ *x = -9999;
+ *y = -9999;
+ }
+}
+
+/* Re-pick the colors of the balls, and the mouse-ball.
+ */
+static void
+recolor (b_state *state)
+{
+ if (state->fg.flags)
+ XFreeColors (state->dpy, state->xgwa.colormap, &state->fg.pixel, 1, 0);
+ if (state->fg2.flags)
+ XFreeColors (state->dpy, state->xgwa.colormap, &state->fg2.pixel, 1, 0);
+
+ state->fg.flags = DoRed|DoGreen|DoBlue;
+ state->fg.red = 0x8888 + (random() % 0x8888);
+ state->fg.green = 0x8888 + (random() % 0x8888);
+ state->fg.blue = 0x8888 + (random() % 0x8888);
+
+ state->fg2.flags = DoRed|DoGreen|DoBlue;
+ state->fg2.red = 0x8888 + (random() % 0x8888);
+ state->fg2.green = 0x8888 + (random() % 0x8888);
+ state->fg2.blue = 0x8888 + (random() % 0x8888);
+
+ if (XAllocColor (state->dpy, state->xgwa.colormap, &state->fg))
+ XSetForeground (state->dpy, state->draw_gc, state->fg.pixel);
+
+ if (XAllocColor (state->dpy, state->xgwa.colormap, &state->fg2))
+ XSetForeground (state->dpy, state->draw_gc2, state->fg2.pixel);
+}
+
+/* Initialize the state structure and various X data.
+ */
+static void *
+fluidballs_init (Display *dpy, Window window)
+{
+ int i;
+ float extx, exty;
+ b_state *state = (b_state *) calloc (1, sizeof(*state));
+ XGCValues gcv;
+
+ state->dpy = dpy;
+ state->window = window;
+ state->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ check_window_moved (state);
+
+ state->dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ state->dbuf = False;
+# endif
+
+ if (state->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ state->dbeclear_p = get_boolean_resource (dpy, "useDBEClear", "Boolean");
+ if (state->dbeclear_p)
+ state->b = xdbe_get_backbuffer (dpy, window, XdbeBackground);
+ else
+ state->b = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+ state->backb = state->b;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!state->b)
+ {
+ state->ba = XCreatePixmap (state->dpy, state->window,
+ state->xgwa.width, state->xgwa.height,
+ state->xgwa.depth);
+ state->b = state->ba;
+ }
+ }
+ else
+ {
+ state->b = state->window;
+ }
+
+ /* Select ButtonRelease events on the external window, if no other app has
+ already selected it (only one app can select it at a time: BadAccess. */
+#if 0
+ if (! (state->xgwa.all_event_masks & ButtonReleaseMask))
+ XSelectInput (state->dpy, state->window,
+ state->xgwa.your_event_mask | ButtonReleaseMask);
+#endif
+
+ gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "foreground", "Foreground");
+ gcv.background = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "background", "Background");
+ state->draw_gc = XCreateGC (state->dpy, state->b,
+ GCForeground|GCBackground, &gcv);
+
+ gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "mouseForeground", "MouseForeground");
+ state->draw_gc2 = XCreateGC (state->dpy, state->b,
+ GCForeground|GCBackground, &gcv);
+
+ gcv.foreground = gcv.background;
+ state->erase_gc = XCreateGC (state->dpy, state->b,
+ GCForeground|GCBackground, &gcv);
+
+
+ if (state->ba)
+ XFillRectangle (state->dpy, state->ba, state->erase_gc, 0, 0,
+ state->xgwa.width, state->xgwa.height);
+
+ recolor (state);
+
+ extx = state->xmax - state->xmin;
+ exty = state->ymax - state->ymin;
+
+ state->count = get_integer_resource (dpy, "count", "Count");
+ if (state->count < 1) state->count = 20;
+
+ state->max_radius = get_float_resource (dpy, "size", "Size") / 2;
+ if (state->max_radius < 1.0) state->max_radius = 1.0;
+
+ if (state->xgwa.width > 2560) state->max_radius *= 2; /* Retina displays */
+
+ if (state->xgwa.width < 100 || state->xgwa.height < 100) /* tiny window */
+ {
+ if (state->max_radius > 5)
+ state->max_radius = 5;
+ }
+
+ state->random_sizes_p = get_boolean_resource (dpy, "random", "Random");
+
+ /* If the initial window size is too small to hold all these balls,
+ make fewer of them...
+ */
+ {
+ float r = (state->random_sizes_p
+ ? state->max_radius * 0.7
+ : state->max_radius);
+ float ball_area = M_PI * r * r;
+ float balls_area = state->count * ball_area;
+ float window_area = state->xgwa.width * state->xgwa.height;
+ window_area *= 0.75; /* don't pack it completely full */
+ if (balls_area > window_area)
+ state->count = window_area / ball_area;
+ }
+
+ state->accx = get_float_resource (dpy, "wind", "Wind");
+ if (state->accx < -1.0 || state->accx > 1.0) state->accx = 0;
+
+ state->accy = get_float_resource (dpy, "gravity", "Gravity");
+ if (state->accy < -1.0 || state->accy > 1.0) state->accy = 0.01;
+
+ state->e = get_float_resource (dpy, "elasticity", "Elacitcity");
+ if (state->e < 0.2 || state->e > 1.0) state->e = 0.97;
+
+ state->tc = get_float_resource (dpy, "timeScale", "TimeScale");
+ if (state->tc <= 0 || state->tc > 10) state->tc = 1.0;
+
+ state->shake_p = get_boolean_resource (dpy, "shake", "Shake");
+ state->shake_threshold = get_float_resource (dpy, "shakeThreshold",
+ "ShakeThreshold");
+ state->time_tick = 999999;
+
+# ifdef HAVE_MOBILE /* Always obey real-world gravity */
+ state->shake_p = False;
+# endif
+
+
+ state->fps_p = get_boolean_resource (dpy, "doFPS", "DoFPS");
+ if (state->fps_p)
+ {
+ XFontStruct *font;
+ char *fontname = get_string_resource (dpy, "fpsFont", "Font");
+ if (!fontname) fontname = "-*-courier-bold-r-normal-*-180-*";
+ font = load_font_retry (dpy, fontname);
+ if (!font) abort();
+ gcv.font = font->fid;
+ gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "textColor", "Foreground");
+ state->font_gc = XCreateGC(dpy, state->b,
+ GCFont|GCForeground|GCBackground, &gcv);
+ state->font_height = font->ascent + font->descent;
+ state->font_baseline = font->descent;
+ }
+
+ state->m = (float *) malloc (sizeof (*state->m) * (state->count + 1));
+ state->r = (float *) malloc (sizeof (*state->r) * (state->count + 1));
+ state->vx = (float *) malloc (sizeof (*state->vx) * (state->count + 1));
+ state->vy = (float *) malloc (sizeof (*state->vy) * (state->count + 1));
+ state->px = (float *) malloc (sizeof (*state->px) * (state->count + 1));
+ state->py = (float *) malloc (sizeof (*state->py) * (state->count + 1));
+ state->opx = (float *) malloc (sizeof (*state->opx) * (state->count + 1));
+ state->opy = (float *) malloc (sizeof (*state->opy) * (state->count + 1));
+
+ for (i=1; i<=state->count; i++)
+ {
+ state->px[i] = frand(extx) + state->xmin;
+ state->py[i] = frand(exty) + state->ymin;
+ state->vx[i] = frand(0.2) - 0.1;
+ state->vy[i] = frand(0.2) - 0.1;
+
+ state->r[i] = (state->random_sizes_p
+ ? ((0.2 + frand(0.8)) * state->max_radius)
+ : state->max_radius);
+ /*state->r[i] = pow(frand(1.0), state->sizegamma) * state->max_radius;*/
+
+ /* state->m[i] = pow(state->r[i],2) * M_PI; */
+ state->m[i] = pow(state->r[i],3) * M_PI * 1.3333;
+ }
+
+ memcpy (state->opx, state->px, sizeof (*state->opx) * (state->count + 1));
+ memcpy (state->opy, state->py, sizeof (*state->opx) * (state->count + 1));
+
+ return state;
+}
+
+
+/* Messes with gravity: permute "down" to be in a random direction.
+ */
+static void
+shake (b_state *state)
+{
+ float a = state->accx;
+ float b = state->accy;
+ int i = random() % 4;
+
+ switch (i)
+ {
+ case 0:
+ state->accx = a;
+ state->accy = b;
+ break;
+ case 1:
+ state->accx = -a;
+ state->accy = -b;
+ break;
+ case 2:
+ state->accx = b;
+ state->accy = a;
+ break;
+ case 3:
+ state->accx = -b;
+ state->accy = -a;
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ state->time_since_shake = 0;
+ recolor (state);
+}
+
+
+/* Look at the current time, and update state->time_since_shake.
+ Draw the FPS display if desired.
+ */
+static void
+check_wall_clock (b_state *state, float max_d)
+{
+ state->frame_count++;
+
+ if (state->time_tick++ > 20) /* don't call gettimeofday() too often -- it's slow. */
+ {
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ if (state->last_time.tv_sec == 0)
+ state->last_time = now;
+
+ state->time_tick = 0;
+ if (now.tv_sec == state->last_time.tv_sec)
+ return;
+
+ state->time_since_shake += (now.tv_sec - state->last_time.tv_sec);
+
+# ifdef HAVE_MOBILE /* Always obey real-world gravity */
+ {
+ float a = fabs (fabs(state->accx) > fabs(state->accy)
+ ? state->accx : state->accy);
+ int rot = current_device_rotation();
+ switch (rot) {
+ case 0: case 360: state->accx = 0; state->accy = a; break;
+ case -90: state->accx = -a; state->accy = 0; break;
+ case 90: state->accx = a; state->accy = 0; break;
+ case 180: case -180: state->accx = 0; state->accy = -a; break;
+ default: break;
+ }
+ }
+# endif /* HAVE_MOBILE */
+
+ if (state->fps_p)
+ {
+ float elapsed = ((now.tv_sec + (now.tv_usec / 1000000.0)) -
+ (state->last_time.tv_sec + (state->last_time.tv_usec / 1000000.0)));
+ float fps = state->frame_count / elapsed;
+ float cps = state->collision_count / elapsed;
+
+ sprintf (state->fps_str, "Collisions: %.3f/frame Max motion: %.3f",
+ cps/fps, max_d);
+
+ draw_fps_string(state);
+ }
+
+ state->frame_count = 0;
+ state->collision_count = 0;
+ state->last_time = now;
+ }
+}
+
+/* Erases the balls at their previous positions, and draws the new ones.
+ */
+static void
+repaint_balls (b_state *state)
+{
+ int a;
+# ifndef HAVE_JWXYZ
+ int x1a, x2a, y1a, y2a;
+# endif
+ int x1b, x2b, y1b, y2b;
+ float max_d = 0;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (state->dpy, state->b);
+#endif
+
+ for (a=1; a <= state->count; a++)
+ {
+ GC gc;
+# ifndef HAVE_JWXYZ
+ x1a = (state->opx[a] - state->r[a] - state->xmin);
+ y1a = (state->opy[a] - state->r[a] - state->ymin);
+ x2a = (state->opx[a] + state->r[a] - state->xmin);
+ y2a = (state->opy[a] + state->r[a] - state->ymin);
+# endif
+
+ x1b = (state->px[a] - state->r[a] - state->xmin);
+ y1b = (state->py[a] - state->r[a] - state->ymin);
+ x2b = (state->px[a] + state->r[a] - state->xmin);
+ y2b = (state->py[a] + state->r[a] - state->ymin);
+
+#ifndef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (!state->dbeclear_p || !state->backb)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ {
+/* if (x1a != x1b || y1a != y1b) -- leaves turds if we optimize this */
+ {
+ gc = state->erase_gc;
+ XFillArc (state->dpy, state->b, gc,
+ x1a, y1a, x2a-x1a, y2a-y1a,
+ 0, 360*64);
+ }
+ }
+#endif /* !HAVE_JWXYZ */
+
+ if (state->mouse_ball == a)
+ gc = state->draw_gc2;
+ else
+ gc = state->draw_gc;
+
+ XFillArc (state->dpy, state->b, gc,
+ x1b, y1b, x2b-x1b, y2b-y1b,
+ 0, 360*64);
+
+ if (state->shake_p)
+ {
+ /* distance this ball moved this frame */
+ float d = ((state->px[a] - state->opx[a]) *
+ (state->px[a] - state->opx[a]) +
+ (state->py[a] - state->opy[a]) *
+ (state->py[a] - state->opy[a]));
+ if (d > max_d) max_d = d;
+ }
+
+ state->opx[a] = state->px[a];
+ state->opy[a] = state->py[a];
+ }
+
+ if (state->fps_p
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ && (state->backb ? state->dbeclear_p : 1)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ )
+ draw_fps_string(state);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (state->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = state->window;
+ info[0].swap_action = (state->dbeclear_p ? XdbeBackground : XdbeUndefined);
+ XdbeSwapBuffers (state->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (state->dbuf)
+ {
+ XCopyArea (state->dpy, state->b, state->window, state->erase_gc,
+ 0, 0, state->xgwa.width, state->xgwa.height, 0, 0);
+ }
+
+ if (state->shake_p && state->time_since_shake > 5)
+ {
+ max_d /= state->max_radius;
+ if (max_d < state->shake_threshold || /* when its stable */
+ state->time_since_shake > 30) /* or when 30 secs has passed */
+ {
+ shake (state);
+ }
+ }
+
+ check_wall_clock (state, max_d);
+}
+
+
+/* Implements the laws of physics: move balls to their new positions.
+ */
+static void
+update_balls (b_state *state)
+{
+ int a, b;
+ float d, vxa, vya, vxb, vyb, dd, cdx, cdy;
+ float ma, mb, vca, vcb, dva, dvb;
+ float dee2;
+
+ check_window_moved (state);
+
+ /* If we're currently tracking the mouse, update that ball first.
+ */
+ if (state->mouse_ball != 0)
+ {
+ int mouse_x, mouse_y;
+ query_mouse (state, &mouse_x, &mouse_y);
+ state->px[state->mouse_ball] = mouse_x;
+ state->py[state->mouse_ball] = mouse_y;
+ state->vx[state->mouse_ball] =
+ (0.1 *
+ (state->px[state->mouse_ball] - state->opx[state->mouse_ball]) *
+ state->tc);
+ state->vy[state->mouse_ball] =
+ (0.1 *
+ (state->py[state->mouse_ball] - state->opy[state->mouse_ball]) *
+ state->tc);
+ }
+
+ /* For each ball, compute the influence of every other ball. */
+ for (a=1; a <= state->count - 1; a++)
+ for (b=a + 1; b <= state->count; b++)
+ {
+ d = ((state->px[a] - state->px[b]) *
+ (state->px[a] - state->px[b]) +
+ (state->py[a] - state->py[b]) *
+ (state->py[a] - state->py[b]));
+ dee2 = (state->r[a] + state->r[b]) *
+ (state->r[a] + state->r[b]);
+ if (d < dee2)
+ {
+ state->collision_count++;
+ d = sqrt(d);
+ dd = state->r[a] + state->r[b] - d;
+
+ cdx = (state->px[b] - state->px[a]) / d;
+ cdy = (state->py[b] - state->py[a]) / d;
+
+ /* Move each ball apart from the other by half the
+ * 'collision' distance.
+ */
+ state->px[a] -= 0.5 * dd * cdx;
+ state->py[a] -= 0.5 * dd * cdy;
+ state->px[b] += 0.5 * dd * cdx;
+ state->py[b] += 0.5 * dd * cdy;
+
+ ma = state->m[a];
+ mb = state->m[b];
+
+ vxa = state->vx[a];
+ vya = state->vy[a];
+ vxb = state->vx[b];
+ vyb = state->vy[b];
+
+ vca = vxa * cdx + vya * cdy; /* the component of each velocity */
+ vcb = vxb * cdx + vyb * cdy; /* along the axis of the collision */
+
+ /* elastic collison */
+ dva = (vca * (ma - mb) + vcb * 2 * mb) / (ma + mb) - vca;
+ dvb = (vcb * (mb - ma) + vca * 2 * ma) / (ma + mb) - vcb;
+
+ dva *= state->e; /* some energy lost to inelasticity */
+ dvb *= state->e;
+
+#if 0
+ dva += (frand (50) - 25) / ma; /* q: why are elves so chaotic? */
+ dvb += (frand (50) - 25) / mb; /* a: brownian motion. */
+#endif
+
+ vxa += dva * cdx;
+ vya += dva * cdy;
+ vxb += dvb * cdx;
+ vyb += dvb * cdy;
+
+ state->vx[a] = vxa;
+ state->vy[a] = vya;
+ state->vx[b] = vxb;
+ state->vy[b] = vyb;
+ }
+ }
+
+ /* Force all balls to be on screen.
+ */
+ for (a=1; a <= state->count; a++)
+ {
+ if (state->px[a] <= (state->xmin + state->r[a]))
+ {
+ state->px[a] = state->xmin + state->r[a];
+ state->vx[a] = -state->vx[a] * state->e;
+ }
+ if (state->px[a] >= (state->xmax - state->r[a]))
+ {
+ state->px[a] = state->xmax - state->r[a];
+ state->vx[a] = -state->vx[a] * state->e;
+ }
+ if (state->py[a] <= (state->ymin + state->r[a]))
+ {
+ state->py[a] = state->ymin + state->r[a];
+ state->vy[a] = -state->vy[a] * state->e;
+ }
+ if (state->py[a] >= (state->ymax - state->r[a]))
+ {
+ state->py[a] = state->ymax - state->r[a];
+ state->vy[a] = -state->vy[a] * state->e;
+ }
+ }
+
+ /* Apply gravity to all balls.
+ */
+ for (a=1; a <= state->count; a++)
+ if (a != state->mouse_ball)
+ {
+ state->vx[a] += state->accx * state->tc;
+ state->vy[a] += state->accy * state->tc;
+ state->px[a] += state->vx[a] * state->tc;
+ state->py[a] += state->vy[a] * state->tc;
+ }
+}
+
+
+/* Handle X events, specifically, allow a ball to be picked up with the mouse.
+ */
+static Bool
+fluidballs_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ b_state *state = (b_state *) closure;
+
+ if (event->xany.type == ButtonPress)
+ {
+ int i, rx, ry;
+ XTranslateCoordinates (dpy, window, RootWindow (dpy, DefaultScreen(dpy)),
+ event->xbutton.x, event->xbutton.y, &rx, &ry,
+ &window);
+
+ if (state->mouse_ball != 0) /* second down-click? drop the ball. */
+ {
+ state->mouse_ball = 0;
+ return True;
+ }
+ else
+ {
+ /* When trying to pick up a ball, first look for a click directly
+ inside the ball; but if we don't find it, expand the radius
+ outward until we find something nearby.
+ */
+ float max = state->max_radius * 4;
+ float step = max / 10;
+ float r2;
+ for (r2 = step; r2 < max; r2 += step) {
+ for (i = 1; i <= state->count; i++)
+ {
+ float d = ((state->px[i] - rx) * (state->px[i] - rx) +
+ (state->py[i] - ry) * (state->py[i] - ry));
+ float r = state->r[i];
+ if (r2 > r) r = r2;
+ if (d < r*r)
+ {
+ state->mouse_ball = i;
+ return True;
+ }
+ }
+ }
+ }
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease) /* drop the ball */
+ {
+ state->mouse_ball = 0;
+ return True;
+ }
+
+ return False;
+}
+
+static unsigned long
+fluidballs_draw (Display *dpy, Window window, void *closure)
+{
+ b_state *state = (b_state *) closure;
+ repaint_balls(state);
+ update_balls(state);
+ return state->delay;
+}
+
+static void
+fluidballs_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static void
+fluidballs_free (Display *dpy, Window window, void *closure)
+{
+ b_state *state = (b_state *) closure;
+ free (state);
+}
+
+
+static const char *fluidballs_defaults [] = {
+ ".background: black",
+ ".foreground: yellow",
+ ".textColor: yellow",
+ "*mouseForeground: white",
+ "*delay: 10000",
+ "*count: 300",
+ "*size: 25",
+ "*random: True",
+ "*gravity: 0.01",
+ "*wind: 0.00",
+ "*elasticity: 0.97",
+ "*timeScale: 1.0",
+ "*shake: True",
+ "*shakeThreshold: 0.015",
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+ "*useDBEClear: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec fluidballs_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-gravity", ".gravity", XrmoptionSepArg, 0 },
+ { "-wind", ".wind", XrmoptionSepArg, 0 },
+ { "-elasticity", ".elasticity", XrmoptionSepArg, 0 },
+ { "-shake", ".shake", XrmoptionNoArg, "True" },
+ { "-no-shake", ".shake", XrmoptionNoArg, "False" },
+ { "-random", ".random", XrmoptionNoArg, "True" },
+ { "-no-random", ".random", XrmoptionNoArg, "False" },
+ { "-nonrandom", ".random", XrmoptionNoArg, "False" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("FluidBalls", fluidballs)
diff --git a/hacks/fluidballs.man b/hacks/fluidballs.man
new file mode 100644
index 0000000..650fe63
--- /dev/null
+++ b/hacks/fluidballs.man
@@ -0,0 +1,90 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fluidballs - the physics of bouncing balls.
+.SH SYNOPSIS
+.B fluidballs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-size \fInumber\fP]
+[\-gravity \fInumber\fP]
+[\-wind \fInumber\fP]
+[\-elasticity \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-nonrandom]
+[\-no-shake]
+[\-fps]
+.SH DESCRIPTION
+Models the physics of bouncing balls, or of particles in a gas or fluid,
+depending on the settings. If "Shake Box" is selected, then every now and
+then, the box will be rotated, changing which direction is down (in order
+to keep the settled balls in motion.)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+How many balls to display. Default: 300.
+.TP 8
+.B \-size \fInumber\fP
+Maximum size of each ball. Default: 25.
+.TP 8
+.B \-gravity \fInumber\fP
+Coefficient of gravity. Useful values are < 0.1. Default: 0.01.
+.TP 8
+.B \-wind \fInumber\fP
+Wind. Useful values are < 0.1. Default: 0.00.
+.TP 8
+.B \-elasticity \fInumber\fP
+Coefficient of elasticity. Useful values are 0.2 to 1.0. Default: 0.97.
+Lower numbers make less bouncy balls.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-nonrandom
+Make all balls be the same size.
+.TP 8
+.B \-no-nonrandom
+Make the balls be random sizes. Default.
+.TP 8
+.B \-shake | \-no-shake
+Whether to shake the box if the system seems to have settled down.
+"Shake" means "change the direction of Down."
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Peter Birtles and Jamie Zawinski. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Peter Birtles, Jamie Zawinski, and Steven Barker.
+
diff --git a/hacks/fontglide.c b/hacks/fontglide.c
new file mode 100644
index 0000000..263393a
--- /dev/null
+++ b/hacks/fontglide.c
@@ -0,0 +1,2489 @@
+/* xscreensaver, Copyright (c) 2003-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * fontglide -- reads text from a subprocess and puts it on the screen using
+ * large characters that glide in from the edges, assemble, then disperse.
+ * Requires a system with scalable fonts. (X's font handing sucks. A lot.)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+
+/* If you turn on DEBUG, this program also masquerades as a tool for
+ debugging font metrics issues, which is probably only if interest
+ if you are doing active development on libjwxyz.a itself.
+ */
+/* #define DEBUG */
+
+#include <math.h>
+#include <time.h>
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "screenhack.h"
+#include "textclient.h"
+#include "xft.h"
+#include "utf8wc.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+typedef struct {
+ char *text;
+
+ int x, y; /* Position of origin of first character in word */
+
+ /* These have the same meanings as in XCharStruct: */
+ int lbearing; /* origin to leftmost pixel */
+ int rbearing; /* origin to rightmost pixel */
+ int ascent; /* origin to topmost pixel */
+ int descent; /* origin to bottommost pixel */
+ int width; /* origin to next word's origin */
+
+ int nticks, tick;
+ int start_x, start_y;
+ int target_x, target_y;
+ Pixmap pixmap, mask;
+} word;
+
+
+typedef struct {
+ int id;
+ Bool dark_p;
+ Bool move_chars_p;
+ int width;
+
+ char *font_name;
+ GC fg_gc;
+ XftFont *xftfont;
+ XftColor xftcolor_fg, xftcolor_bg;
+
+ int nwords;
+ word **words;
+
+ enum { IN, PAUSE, OUT } anim_state;
+ enum { LEFT, CENTER, RIGHT } alignment;
+ int pause_tick;
+
+} sentence;
+
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+
+ Pixmap b, ba; /* double-buffer to reduce flicker */
+ GC bg_gc;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+ Bool dbeclear_p;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ Bool dbuf; /* Whether we're using double buffering. */
+
+ int border_width; /* size of the font outline */
+ char *charset; /* registry and encoding for font lookups */
+ double speed; /* frame rate multiplier */
+ double linger; /* multiplier for how long to leave words on screen */
+ Bool trails_p;
+ enum { PAGE, SCROLL, CHARS } mode;
+
+ char *font_override; /* if -font was specified on the cmd line */
+
+ char buf [40]; /* this only needs to be as big as one "word". */
+ int buf_tail;
+ Bool early_p;
+ time_t start_time;
+
+ int nsentences;
+ sentence **sentences;
+ Bool spawn_p; /* whether it is time to create a new sentence */
+ int latest_sentence;
+ unsigned long frame_delay;
+ int id_tick;
+ text_data *tc;
+
+# ifdef DEBUG
+ Bool debug_p;
+ unsigned long debug_metrics_p;
+ int debug_metrics_antialiasing_p;
+ int debug_scale;
+ unsigned entering_unicode_p; /* 0 = No, 1 = Just started, 2 = in progress */
+ XFontStruct *metrics_font1;
+ XFontStruct *metrics_font2;
+ XftFont *metrics_xftfont;
+ GC label_gc;
+ char *prev_font_name;
+ char *next_font_name;
+# endif /* DEBUG */
+
+} state;
+
+
+static void drain_input (state *s);
+
+
+static int
+pick_font_size (state *s)
+{
+ double scale = s->xgwa.height / 1024.0; /* shrink for small windows */
+ int min, max, r, pixel;
+
+ min = scale * 24;
+ max = scale * 260;
+
+ if (min < 10) min = 10;
+ if (max < 30) max = 30;
+
+ r = ((max-min)/3)+1;
+
+ pixel = min + ((random() % r) + (random() % r) + (random() % r));
+
+ if (s->mode == SCROLL) /* scroll mode likes bigger fonts */
+ pixel *= 1.5;
+
+ return pixel;
+}
+
+
+#ifdef HAVE_JWXYZ
+
+static char *
+append_font_name(Display *dpy, char *dest, const XFontStruct *font)
+{
+ int i;
+ for (i = 0; i != font->n_properties; ++i) {
+ if (font->properties[i].name == XA_FONT) {
+ const char *suffix = XGetAtomName (dpy, font->properties[i].card32);
+ strcpy(dest, suffix);
+ return dest + strlen(suffix);
+ }
+ }
+
+ dest[0] = '?';
+ dest[1] = 0;
+ return dest + 1;
+
+/*
+ float s;
+ const char *n = jwxyz_nativeFontName (font->fid, &s);
+ return dest + sprintf (dest, "%s %.1f", n, s);
+ */
+}
+
+#endif
+
+
+/* Finds the set of scalable fonts on the system; picks one;
+ and loads that font in a random pixel size.
+ Returns False if something went wrong.
+ */
+static Bool
+pick_font_1 (state *s, sentence *se)
+{
+ Bool ok = False;
+ char pattern[1024];
+ char pattern2[1024];
+
+#ifndef HAVE_JWXYZ /* real Xlib */
+ char **names = 0;
+ char **names2 = 0;
+ XFontStruct *info = 0;
+ int count = 0, count2 = 0;
+ int i;
+
+ if (se->xftfont)
+ {
+ XftFontClose (s->dpy, se->xftfont);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_fg);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_bg);
+
+ free (se->font_name);
+ se->xftfont = 0;
+ se->font_name = 0;
+ }
+
+ if (s->font_override)
+ sprintf (pattern, "%.200s", s->font_override);
+ else
+ sprintf (pattern, "-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s",
+ "*", /* foundry */
+ "*", /* family */
+ "*", /* weight */
+ "*", /* slant */
+ "*", /* swidth */
+ "*", /* adstyle */
+ "0", /* pixel size */
+ "0", /* point size */
+ "0", /* resolution x */
+ "0", /* resolution y */
+ "p", /* spacing */
+ "0", /* avg width */
+ s->charset); /* registry + encoding */
+
+ names = XListFonts (s->dpy, pattern, 1000, &count);
+
+ if (count <= 0)
+ {
+ if (s->font_override)
+ fprintf (stderr, "%s: -font option bogus: %s\n", progname, pattern);
+ else
+ fprintf (stderr, "%s: no scalable fonts found! (pattern: %s)\n",
+ progname, pattern);
+ exit (1);
+ }
+
+ i = random() % count;
+
+ names2 = XListFontsWithInfo (s->dpy, names[i], 1000, &count2, &info);
+ if (count2 <= 0)
+ {
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: pattern %s\n"
+ " gave unusable %s\n\n",
+ progname, pattern, names[i]);
+# endif /* DEBUG */
+ goto FAIL;
+ }
+
+ {
+ XFontStruct *font = &info[0];
+ unsigned long value = 0;
+ char *foundry=0, *family=0, *weight=0, *slant=0, *setwidth=0, *add_style=0;
+ unsigned long pixel=0, point=0, res_x=0, res_y=0;
+ char *spacing=0;
+ unsigned long avg_width=0;
+ char *registry=0, *encoding=0;
+ Atom a;
+ char *bogus = "\"?\"";
+
+# define STR(ATOM,VAR) \
+ bogus = (ATOM); \
+ a = XInternAtom (s->dpy, (ATOM), False); \
+ if (XGetFontProperty (font, a, &value)) \
+ VAR = XGetAtomName (s->dpy, value); \
+ else \
+ goto FAIL2
+
+# define INT(ATOM,VAR) \
+ bogus = (ATOM); \
+ a = XInternAtom (s->dpy, (ATOM), False); \
+ if (!XGetFontProperty (font, a, &VAR) || \
+ VAR > 9999) \
+ goto FAIL2
+
+ STR ("FOUNDRY", foundry);
+ STR ("FAMILY_NAME", family);
+ STR ("WEIGHT_NAME", weight);
+ STR ("SLANT", slant);
+ STR ("SETWIDTH_NAME", setwidth);
+ STR ("ADD_STYLE_NAME", add_style);
+ INT ("PIXEL_SIZE", pixel);
+ INT ("POINT_SIZE", point);
+ INT ("RESOLUTION_X", res_x);
+ INT ("RESOLUTION_Y", res_y);
+ STR ("SPACING", spacing);
+ INT ("AVERAGE_WIDTH", avg_width);
+ STR ("CHARSET_REGISTRY", registry);
+ STR ("CHARSET_ENCODING", encoding);
+
+#undef INT
+#undef STR
+
+ pixel = pick_font_size (s);
+
+#if 0
+ /* Occasionally change the aspect ratio of the font, by increasing
+ either the X or Y resolution (while leaving the other alone.)
+
+ #### Looks like this trick doesn't really work that well: the
+ metrics of the individual characters are ok, but the
+ overall font ascent comes out wrong (unscaled.)
+ */
+ if (! (random() % 8))
+ {
+ double n = 2.5 / 3;
+ double scale = 1 + (frand(n) + frand(n) + frand(n));
+ if (random() % 2)
+ res_x *= scale;
+ else
+ res_y *= scale;
+ }
+# endif
+
+ sprintf (pattern,
+ "-%s-%s-%s-%s-%s-%s-%ld-%s-%ld-%ld-%s-%s-%s-%s",
+ foundry, family, weight, slant, setwidth, add_style,
+ pixel, "*", /* point, */
+ res_x, res_y, spacing,
+ "*", /* avg_width */
+ registry, encoding);
+ ok = True;
+
+ FAIL2:
+ if (!ok)
+ fprintf (stderr, "%s: font has bogus %s property: %s\n",
+ progname, bogus, names[i]);
+
+ if (foundry) XFree (foundry);
+ if (family) XFree (family);
+ if (weight) XFree (weight);
+ if (slant) XFree (slant);
+ if (setwidth) XFree (setwidth);
+ if (add_style) XFree (add_style);
+ if (spacing) XFree (spacing);
+ if (registry) XFree (registry);
+ if (encoding) XFree (encoding);
+ }
+
+ FAIL:
+
+ XFreeFontInfo (names2, info, count2);
+ XFreeFontNames (names);
+
+# else /* HAVE_JWXYZ */
+
+ if (s->font_override)
+ sprintf (pattern, "%.200s", s->font_override);
+ else
+ {
+ const char *family = "random";
+ const char *weight = ((random() % 2) ? "regular" : "bold");
+ const char *slant = ((random() % 2) ? "o" : "r");
+ int size = 10 * pick_font_size (s);
+ sprintf (pattern, "*-%s-%s-%s-*-*-*-%d-*", family, weight, slant, size);
+ }
+ ok = True;
+# endif /* HAVE_JWXYZ */
+
+ if (! ok) return False;
+
+ se->xftfont = XftFontOpenXlfd (s->dpy, screen_number (s->xgwa.screen),
+ pattern);
+
+ if (! se->xftfont)
+ {
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: unable to load font %s\n",
+ progname, pattern);
+#endif
+ return False;
+ }
+
+ strcpy (pattern2, pattern);
+# ifdef HAVE_JWXYZ
+ {
+ char *out = pattern2 + strlen(pattern2);
+ out[0] = ' ';
+ out[1] = '(';
+ out = append_font_name (s->dpy, out + 2, se->xftfont->xfont);
+ out[0] = ')';
+ out[1] = 0;
+ }
+# endif
+
+# ifdef DEBUG
+ if (s->prev_font_name) free (s->prev_font_name);
+ s->prev_font_name = s->next_font_name;
+ s->next_font_name = strdup (pattern2);
+# endif
+
+ /* Sometimes we get fonts with screwed up metrics. For example:
+ -b&h-lucida-medium-r-normal-sans-40-289-100-100-p-0-iso8859-1
+
+ When using XDrawString, XTextExtents and XTextExtents16, it is rendered
+ as a scaled-up bitmap font. The character M has rbearing 70, ascent 68
+ and width 78, which is correct for the glyph as rendered.
+
+ But when using XftDrawStringUtf8 and XftTextExtentsUtf8, it is rendered
+ at the original, smaller, un-scaled size, with rbearing 26, ascent 25
+ and... width 77!
+
+ So it's taking the *size* from the unscaled font, the *advancement* from
+ the scaled-up version, and then *not* actually scaling it up. Awesome.
+
+ So, after loading the font, measure the M, and if its advancement is more
+ than 20% larger than its rbearing, reject the font.
+
+ ------------------------------------------------------------------------
+
+ Some observations on this nonsense from Dave Odell:
+
+ 1. -*-lucidatypewriter-bold-r-normal-*-*-480-*-*-*-*-iso8859-1 normally
+ resolves to /usr/share/fonts/X11/100dpi/lutBS24-ISO8859-1.pcf.gz.
+
+ -*-lucidatypewriter-* is from the 'xfonts-100dpi' package in
+ Debian/Ubuntu. It's usually (54.46% of systems), but not always,
+ installed whenever an X.org server (57.96% of systems) is. It might
+ be a good idea for this and xfonts-75dpi to be recommended
+ dependencies of XScreenSaver in Debian, but that's neither here nor
+ there. https://qa.debian.org/popcon.php?package=xorg
+ https://qa.debian.org/popcon.php?package=xfonts-100dpi
+
+ 2. It normally resolves to the PCF font... but not always.
+
+ Fontconfig has /etc/fonts/conf.d/ (it's /opt/local/etc/fonts/conf.d/
+ with MacPorts) containing symlinks to configuration files. And both
+ Debian and Ubuntu normally has a 70-no-bitmaps.conf, installed as part
+ of the 'fontconfig-config' package. And the 70-no-bitmaps.conf
+ symlink... disables bitmap fonts.
+
+ Without bitmap fonts, I get DejaVu Sans.
+
+ 3. There's another symlink of interest here:
+ /etc/fonts/conf.d/10-scale-bitmap-fonts.conf. This adds space to the
+ right of glyphs of bitmap fonts when the requested size of the font is
+ larger than the actual bitmap font. Ubuntu and MacPorts has this one.
+
+ This specifically is causing text to have excessive character spacing.
+
+ (jwz asks: WHY WOULD ANYONE EVER WANT THIS BEHAVIOR?)
+
+ 4. Notice that I'm only talking about Debian and Ubuntu. Other distros
+ will probably have different symlinks in /etc/fonts/conf.d/. So yes,
+ this can be an issue on Linux as well as MacOS.
+ */
+ {
+ XGlyphInfo extents;
+ int rbearing, width;
+ float ratio;
+ float min = 0.8;
+
+ XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) "M", 1, &extents);
+ rbearing = extents.width - extents.x;
+ width = extents.xOff;
+ ratio = rbearing / (float) width;
+
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: M ratio %.2f (%d %d): %s\n", progname,
+ ratio, rbearing, width, pattern2);
+# endif
+
+ if (ratio < min && !s->font_override)
+ {
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: skipping font with broken metrics: %s\n",
+ progname, pattern2);
+# endif
+ return False;
+ }
+ }
+
+
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf(stderr, "%s: %s\n", progname, pattern2);
+# endif /* DEBUG */
+
+ se->font_name = strdup (pattern);
+ return True;
+}
+
+
+/* Finds the set of scalable fonts on the system; picks one;
+ and loads that font in a random pixel size.
+ */
+static void
+pick_font (state *s, sentence *se)
+{
+ int i;
+ for (i = 0; i < 50; i++)
+ if (pick_font_1 (s, se))
+ return;
+ fprintf (stderr, "%s: too many font-loading failures: giving up!\n",
+ progname);
+ exit (1);
+}
+
+
+static char *unread_word_text = 0;
+
+/* Returns a newly-allocated string with one word in it, or NULL if there
+ is no complete word available.
+ */
+static char *
+get_word_text (state *s)
+{
+ const char *start = s->buf;
+ const char *end;
+ char *result = 0;
+ int lfs = 0;
+
+ drain_input (s);
+
+ /* If we just launched, and haven't had any text yet, and it has been
+ more than 2 seconds since we launched, then push out "Loading..."
+ as our first text. So if the text source is speedy, just use that.
+ But if we'd display a blank screen for a while, give 'em something
+ to see.
+ */
+ if (s->early_p &&
+ !*s->buf &&
+ !unread_word_text &&
+ s->start_time < ((time ((time_t *) 0) - 2)))
+ {
+ unread_word_text = "Loading...";
+ s->early_p = False;
+ }
+
+ if (unread_word_text)
+ {
+ result = unread_word_text;
+ unread_word_text = 0;
+ return strdup (result);
+ }
+
+ /* Skip over whitespace at the beginning of the buffer,
+ and count up how many linebreaks we see while doing so.
+ */
+ while (*start &&
+ (*start == ' ' ||
+ *start == '\t' ||
+ *start == '\r' ||
+ *start == '\n'))
+ {
+ if (*start == '\n' || (*start == '\r' && start[1] != '\n'))
+ lfs++;
+ start++;
+ }
+
+ end = start;
+
+ /* If we saw a blank line, then return NULL (treat it as a temporary "eof",
+ to trigger a sentence break here.) */
+ if (lfs >= 2)
+ goto DONE;
+
+ /* Skip forward to the end of this word (find next whitespace.) */
+ while (*end &&
+ (! (*end == ' ' ||
+ *end == '\t' ||
+ *end == '\r' ||
+ *end == '\n')))
+ end++;
+
+ /* If we have a word, allocate a string for it */
+ if (end > start)
+ {
+ result = malloc ((end - start) + 1);
+ strncpy (result, start, (end-start));
+ result [end-start] = 0;
+ }
+
+ DONE:
+
+ /* Make room in the buffer by compressing out any bytes we've processed.
+ */
+ if (end > s->buf)
+ {
+ int n = end - s->buf;
+ memmove (s->buf, end, sizeof(s->buf) - n);
+ s->buf_tail -= n;
+ }
+
+ return result;
+}
+
+
+/* Returns a 1-bit pixmap of the same size as the drawable,
+ with a 0 wherever the drawable is black.
+ */
+static Pixmap
+make_mask (Screen *screen, Visual *visual, Drawable drawable)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ unsigned long black = BlackPixelOfScreen (screen);
+ Window r;
+ int x, y;
+ unsigned int w, h, bw, d;
+ XImage *out, *in;
+ Pixmap mask;
+ GC gc;
+
+ XGetGeometry (dpy, drawable, &r, &x, &y, &w, &h, &bw, &d);
+ in = XGetImage (dpy, drawable, 0, 0, w, h, ~0L, ZPixmap);
+ out = XCreateImage (dpy, visual, 1, XYPixmap, 0, 0, w, h, 8, 0);
+ out->data = (char *) malloc (h * out->bytes_per_line);
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ XPutPixel (out, x, y, (black != XGetPixel (in, x, y)));
+ mask = XCreatePixmap (dpy, drawable, w, h, 1L);
+ gc = XCreateGC (dpy, mask, 0, 0);
+ XPutImage (dpy, mask, gc, out, 0, 0, 0, 0, w, h);
+ XFreeGC (dpy, gc);
+ free (in->data);
+ free (out->data);
+ in->data = out->data = 0;
+ XDestroyImage (in);
+ XDestroyImage (out);
+ return mask;
+}
+
+
+/* Gets some random text, and creates a "word" object from it.
+ */
+static word *
+new_word (state *s, sentence *se, const char *txt, Bool alloc_p)
+{
+ word *w;
+ XGlyphInfo extents;
+ int bw = s->border_width;
+
+ if (!txt)
+ return 0;
+
+ w = (word *) calloc (1, sizeof(*w));
+ XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) txt, strlen(txt),
+ &extents);
+
+ w->lbearing = -extents.x;
+ w->rbearing = extents.width - extents.x;
+ w->ascent = extents.y;
+ w->descent = extents.height - extents.y;
+ w->width = extents.xOff;
+
+ w->lbearing -= bw;
+ w->rbearing += bw;
+ w->descent += bw;
+ w->ascent += bw;
+
+ if (s->mode == SCROLL && !alloc_p) abort();
+
+ if (alloc_p)
+ {
+ int i, j;
+ XGCValues gcv;
+ GC gc_fg, gc_bg, gc_black;
+ XftDraw *xftdraw;
+ int width = w->rbearing - w->lbearing;
+ int height = w->ascent + w->descent;
+
+ if (width <= 0) width = 1;
+ if (height <= 0) height = 1;
+
+ w->pixmap = XCreatePixmap (s->dpy, s->b, width, height, s->xgwa.depth);
+ xftdraw = XftDrawCreate (s->dpy, w->pixmap, s->xgwa.visual,
+ s->xgwa.colormap);
+
+ gcv.foreground = se->xftcolor_fg.pixel;
+ gc_fg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
+
+ gcv.foreground = se->xftcolor_bg.pixel;
+ gc_bg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
+
+ gcv.foreground = BlackPixelOfScreen (s->xgwa.screen);
+ gc_black = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
+
+ XFillRectangle (s->dpy, w->pixmap, gc_black, 0, 0, width, height);
+
+# ifdef DEBUG
+ if (s->debug_p)
+ {
+ /* bounding box (behind the characters) */
+ XDrawRectangle (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ 0, 0, width-1, height-1);
+ }
+# endif /* DEBUG */
+
+ /* Draw background text for border */
+ for (i = -bw; i <= bw; i++)
+ for (j = -bw; j <= bw; j++)
+ XftDrawStringUtf8 (xftdraw, &se->xftcolor_bg, se->xftfont,
+ -w->lbearing + i, w->ascent + j,
+ (FcChar8 *) txt, strlen(txt));
+
+ /* Draw foreground text */
+ XftDrawStringUtf8 (xftdraw, &se->xftcolor_fg, se->xftfont,
+ -w->lbearing, w->ascent,
+ (FcChar8 *) txt, strlen(txt));
+
+# ifdef DEBUG
+ if (s->debug_p)
+ {
+ if (w->ascent != height)
+ {
+ /* baseline (on top of the characters) */
+ XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ 0, w->ascent, width-1, w->ascent);
+ }
+
+ if (w->lbearing < 0)
+ {
+ /* left edge of charcell */
+ XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ -w->lbearing, 0,
+ -w->lbearing, height-1);
+ }
+
+ if (w->rbearing != w->width)
+ {
+ /* right edge of charcell */
+ XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ w->width - w->lbearing, 0,
+ w->width - w->lbearing, height-1);
+ }
+ }
+# endif /* DEBUG */
+
+ w->mask = make_mask (s->xgwa.screen, s->xgwa.visual, w->pixmap);
+
+ XftDrawDestroy (xftdraw);
+ XFreeGC (s->dpy, gc_fg);
+ XFreeGC (s->dpy, gc_bg);
+ XFreeGC (s->dpy, gc_black);
+ }
+
+ w->text = strdup (txt);
+ return w;
+}
+
+
+static void
+free_word (state *s, word *w)
+{
+ if (w->text) free (w->text);
+ if (w->pixmap) XFreePixmap (s->dpy, w->pixmap);
+ if (w->mask) XFreePixmap (s->dpy, w->mask);
+}
+
+
+static sentence *
+new_sentence (state *st, state *s)
+{
+ XGCValues gcv;
+ sentence *se = (sentence *) calloc (1, sizeof (*se));
+ se->fg_gc = XCreateGC (s->dpy, s->b, 0, &gcv);
+ se->anim_state = IN;
+ se->id = ++st->id_tick;
+ return se;
+}
+
+
+static void
+free_sentence (state *s, sentence *se)
+{
+ int i;
+ for (i = 0; i < se->nwords; i++)
+ free_word (s, se->words[i]);
+ if (se->words)
+ free (se->words);
+ if (se->font_name)
+ free (se->font_name);
+ if (se->fg_gc)
+ XFreeGC (s->dpy, se->fg_gc);
+
+ if (se->xftfont)
+ {
+ XftFontClose (s->dpy, se->xftfont);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_fg);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_bg);
+ }
+
+ free (se);
+}
+
+
+/* free the word, and put its text back at the front of the input queue,
+ to be read next time. */
+static void
+unread_word (state *s, word *w)
+{
+ if (unread_word_text)
+ abort();
+ unread_word_text = w->text;
+ w->text = 0;
+ free_word (s, w);
+}
+
+
+/* Divide each of the words in the sentence into one character words,
+ without changing the positions of those characters.
+ */
+static void
+split_words (state *s, sentence *se)
+{
+ word **words2;
+ int nwords2 = 0;
+ int i, j;
+
+ char ***word_chars = (char ***) malloc (se->nwords * sizeof(*word_chars));
+ for (i = 0; i < se->nwords; i++)
+ {
+ int L;
+ word *ow = se->words[i];
+ word_chars[i] = utf8_split (ow->text, &L);
+ nwords2 += L;
+ }
+
+ words2 = (word **) calloc (nwords2, sizeof(*words2));
+
+ for (i = 0, j = 0; i < se->nwords; i++)
+ {
+ char **chars = word_chars[i];
+ word *parent = se->words[i];
+ int x = parent->x;
+ int y = parent->y;
+ int sx = parent->start_x;
+ int sy = parent->start_y;
+ int tx = parent->target_x;
+ int ty = parent->target_y;
+ int k;
+
+ for (k = 0; chars[k]; k++)
+ {
+ char *t2 = chars[k];
+ word *w2 = new_word (s, se, t2, True);
+ words2[j++] = w2;
+
+ w2->x = x;
+ w2->y = y;
+ w2->start_x = sx;
+ w2->start_y = sy;
+ w2->target_x = tx;
+ w2->target_y = ty;
+
+ x += w2->width;
+ sx += w2->width;
+ tx += w2->width;
+ }
+
+ /* This is not invariant when kerning is involved! */
+ /* if (x != parent->x + parent->width) abort(); */
+
+ free (chars); /* but we retain its contents */
+ free_word (s, parent);
+ }
+ if (j != nwords2) abort();
+ free (word_chars);
+ free (se->words);
+
+ se->words = words2;
+ se->nwords = nwords2;
+}
+
+
+/* Set the source or destination position of the words to be somewhere
+ off screen.
+ */
+static void
+scatter_sentence (state *s, sentence *se)
+{
+ int i = 0;
+ int off = s->border_width * 4 + 2;
+
+ int flock_p = ((random() % 4) == 0);
+ int mode = (flock_p ? (random() % 12) : 0);
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+ int x, y;
+ int r = (flock_p ? mode : (random() % 4));
+ int left = -(off + w->rbearing);
+ int top = -(off + w->descent);
+ int right = off - w->lbearing + s->xgwa.width;
+ int bottom = off + w->ascent + s->xgwa.height;
+
+ switch (r) {
+ /* random positions on the edges */
+ case 0: x = left; y = random() % s->xgwa.height; break;
+ case 1: x = right; y = random() % s->xgwa.height; break;
+ case 2: x = random() % s->xgwa.width; y = top; break;
+ case 3: x = random() % s->xgwa.width; y = bottom; break;
+
+ /* straight towards the edges */
+ case 4: x = left; y = w->target_y; break;
+ case 5: x = right; y = w->target_y; break;
+ case 6: x = w->target_x; y = top; break;
+ case 7: x = w->target_x; y = bottom; break;
+
+ /* corners */
+ case 8: x = left; y = top; break;
+ case 9: x = left; y = bottom; break;
+ case 10: x = right; y = top; break;
+ case 11: x = right; y = bottom; break;
+
+ default: abort(); break;
+ }
+
+ if (se->anim_state == IN)
+ {
+ w->start_x = x;
+ w->start_y = y;
+ }
+ else
+ {
+ w->start_x = w->x;
+ w->start_y = w->y;
+ w->target_x = x;
+ w->target_y = y;
+ }
+
+ w->nticks = ((100 + ((random() % 140) +
+ (random() % 140) +
+ (random() % 140)))
+ / s->speed);
+ if (w->nticks < 2)
+ w->nticks = 2;
+ w->tick = 0;
+ }
+}
+
+
+/* Set the source position of the words to be off the right side,
+ and the destination to be off the left side.
+ */
+static void
+aim_sentence (state *s, sentence *se)
+{
+ int i = 0;
+ int nticks;
+ int yoff = 0;
+
+ if (se->nwords <= 0) abort();
+
+ /* Have the sentence shift up or down a little bit; not too far, and
+ never let it fall off the top or bottom of the screen before its
+ last character has reached the left edge.
+ */
+ for (i = 0; i < 10; i++)
+ {
+ int ty = random() % (s->xgwa.height - se->words[0]->ascent);
+ yoff = ty - se->words[0]->target_y;
+ if (yoff < s->xgwa.height/3) /* this one is ok */
+ break;
+ }
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+ w->start_x = w->target_x + s->xgwa.width;
+ w->target_x -= se->width;
+ w->start_y = w->target_y;
+ w->target_y += yoff;
+ }
+
+ nticks = ((se->words[0]->start_x - se->words[0]->target_x)
+ / (s->speed * 7));
+ nticks *= (frand(0.9) + frand(0.9) + frand(0.9));
+
+ if (nticks < 2)
+ nticks = 2;
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+ w->nticks = nticks;
+ w->tick = 0;
+ }
+}
+
+
+/* Randomize the order of the words in the list (since that changes
+ which ones are "on top".)
+ */
+static void
+shuffle_words (state *s, sentence *se)
+{
+ int i;
+ for (i = 0; i < se->nwords-1; i++)
+ {
+ int j = i + (random() % (se->nwords - i));
+ word *swap = se->words[i];
+ se->words[i] = se->words[j];
+ se->words[j] = swap;
+ }
+}
+
+
+/* qsort comparitor */
+static int
+cmp_sentences (const void *aa, const void *bb)
+{
+ const sentence *a = *(sentence **) aa;
+ const sentence *b = *(sentence **) bb;
+ return ((a ? a->id : 999999) - (b ? b->id : 999999));
+}
+
+
+/* Sort the sentences by id, so that sentences added later are on top.
+ */
+static void
+sort_sentences (state *s)
+{
+ qsort (s->sentences, s->nsentences, sizeof(*s->sentences), cmp_sentences);
+}
+
+
+/* Re-pick the colors of the text and border
+ */
+static void
+recolor (state *s, sentence *se)
+{
+ XRenderColor fg, bg;
+
+ fg.red = (random() % 0x5555) + 0xAAAA;
+ fg.green = (random() % 0x5555) + 0xAAAA;
+ fg.blue = (random() % 0x5555) + 0xAAAA;
+ fg.alpha = 0xFFFF;
+ bg.red = (random() % 0x5555);
+ bg.green = (random() % 0x5555);
+ bg.blue = (random() % 0x5555);
+ bg.alpha = 0xFFFF;
+ se->dark_p = False;
+
+ if (random() & 1)
+ {
+ XRenderColor swap = fg; fg = bg; bg = swap;
+ se->dark_p = True;
+ }
+
+ if (se->xftfont)
+ {
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_fg);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_bg);
+ }
+
+ XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &fg,
+ &se->xftcolor_fg);
+ XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &bg,
+ &se->xftcolor_bg);
+}
+
+
+static void
+align_line (state *s, sentence *se, int line_start, int x, int right)
+{
+ int off, j;
+ switch (se->alignment)
+ {
+ case LEFT: off = 0; break;
+ case CENTER: off = (right - x) / 2; break;
+ case RIGHT: off = (right - x); break;
+ default: abort(); break;
+ }
+
+ if (off != 0)
+ for (j = line_start; j < se->nwords; j++)
+ se->words[j]->target_x += off;
+}
+
+
+/* Fill the sentence with new words: in "page" mode, fills the page
+ with text; in "scroll" mode, just makes one long horizontal sentence.
+ The sentence might have *no* words in it, if no text is currently
+ available.
+ */
+static void
+populate_sentence (state *s, sentence *se)
+{
+ int i = 0;
+ int left, right, top, x, y;
+ int space = 0;
+ int line_start = 0;
+ Bool done = False;
+
+ int array_size = 100;
+
+ se->move_chars_p = (s->mode == CHARS ? True :
+ s->mode == SCROLL ? False :
+ (random() % 3) ? False : True);
+ se->alignment = (random() % 3);
+
+ recolor (s, se);
+
+ if (se->words)
+ {
+ for (i = 0; i < se->nwords; i++)
+ free_word (s, se->words[i]);
+ free (se->words);
+ }
+
+ se->words = (word **) calloc (array_size, sizeof(*se->words));
+ se->nwords = 0;
+
+ switch (s->mode)
+ {
+ case PAGE:
+ case CHARS:
+ left = random() % (s->xgwa.width / 3);
+ right = s->xgwa.width - (random() % (s->xgwa.width / 3));
+ top = random() % (s->xgwa.height * 2 / 3);
+ break;
+ case SCROLL:
+ left = 0;
+ right = s->xgwa.width;
+ top = random() % s->xgwa.height;
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ x = left;
+ y = top;
+
+ while (!done)
+ {
+ char *txt = get_word_text (s);
+ word *w;
+ if (!txt)
+ {
+ if (se->nwords == 0)
+ return; /* If the stream is empty, bail. */
+ else
+ break; /* If EOF after some words, end of sentence. */
+ }
+
+ if (! se->xftfont) /* Got a word: need a font now */
+ {
+ XGlyphInfo extents;
+ pick_font (s, se);
+ if (y < se->xftfont->ascent)
+ y += se->xftfont->ascent;
+
+ /* Measure the space character to figure out how much room to
+ leave between words (since we don't actually render that.) */
+ XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) " ", 1,
+ &extents);
+ space = extents.xOff;
+ }
+
+ w = new_word (s, se, txt, !se->move_chars_p);
+ free (txt);
+ txt = 0;
+
+ /* If we have a few words, let punctuation terminate the sentence:
+ stop gathering more words if the last word ends in a period, etc. */
+ if (se->nwords >= 4)
+ {
+ char c = w->text[strlen(w->text)-1];
+ if (c == '.' || c == '?' || c == '!')
+ done = True;
+ }
+
+ /* If the sentence is kind of long already, terminate at commas, etc. */
+ if (se->nwords >= 12)
+ {
+ char c = w->text[strlen(w->text)-1];
+ if (c == ',' || c == ';' || c == ':' || c == '-' ||
+ c == ')' || c == ']' || c == '}')
+ done = True;
+ }
+
+ if (se->nwords >= 25) /* ok that's just about enough out of you */
+ done = True;
+
+ if ((s->mode == PAGE || s->mode == CHARS) &&
+ x + w->rbearing > right) /* wrap line */
+ {
+ align_line (s, se, line_start, x, right);
+ line_start = se->nwords;
+
+ x = left;
+ y += se->xftfont->ascent + se->xftfont->descent;
+
+ /* If we're close to the bottom of the screen, stop, and
+ unread the current word. (But not if this is the first
+ word, otherwise we might just get stuck on it.)
+ */
+ if (se->nwords > 0 &&
+ y + se->xftfont->ascent + se->xftfont->descent > s->xgwa.height)
+ {
+ unread_word (s, w);
+ free (w);
+ /* done = True; */
+ break;
+ }
+ }
+
+ w->target_x = x;
+ w->target_y = y;
+
+ x += w->width + space;
+ se->width = x;
+
+ if (se->nwords >= (array_size - 1))
+ {
+ array_size += 100;
+ se->words = (word **)
+ realloc (se->words, array_size * sizeof(*se->words));
+ if (!se->words)
+ {
+ fprintf (stderr, "%s: out of memory (%d words)\n",
+ progname, array_size);
+ exit (1);
+ }
+ }
+
+ se->words[se->nwords++] = w;
+ }
+
+ se->width -= space;
+
+ switch (s->mode)
+ {
+ case PAGE:
+ case CHARS:
+ align_line (s, se, line_start, x, right);
+ if (se->move_chars_p)
+ split_words (s, se);
+ scatter_sentence (s, se);
+ shuffle_words (s, se);
+ break;
+ case SCROLL:
+ aim_sentence (s, se);
+ break;
+ default:
+ abort();
+ break;
+ }
+
+# ifdef DEBUG
+ if (s->debug_p)
+ {
+ fprintf (stderr, "%s: sentence %d:", progname, se->id);
+ for (i = 0; i < se->nwords; i++)
+ fprintf (stderr, " %s", se->words[i]->text);
+ fprintf (stderr, "\n");
+ }
+# endif /* DEBUG */
+}
+
+
+/* Render a single word object to the screen.
+ */
+static void
+draw_word (state *s, sentence *se, word *word)
+{
+ int x, y, w, h;
+ if (! word->pixmap) return;
+
+ x = word->x + word->lbearing;
+ y = word->y - word->ascent;
+ w = word->rbearing - word->lbearing;
+ h = word->ascent + word->descent;
+
+ if (x + w < 0 ||
+ y + h < 0 ||
+ x > s->xgwa.width ||
+ y > s->xgwa.height)
+ return;
+
+ XSetClipMask (s->dpy, se->fg_gc, word->mask);
+ XSetClipOrigin (s->dpy, se->fg_gc, x, y);
+ XCopyArea (s->dpy, word->pixmap, s->b, se->fg_gc,
+ 0, 0, w, h, x, y);
+}
+
+
+/* If there is room for more sentences, add one.
+ */
+static void
+more_sentences (state *s)
+{
+ int i;
+ Bool any = False;
+ for (i = 0; i < s->nsentences; i++)
+ {
+ sentence *se = s->sentences[i];
+ if (! se)
+ {
+ se = new_sentence (s, s);
+ populate_sentence (s, se);
+ if (se->nwords > 0)
+ s->spawn_p = False, any = True;
+ else
+ {
+ free_sentence (s, se);
+ se = 0;
+ }
+ s->sentences[i] = se;
+ if (se)
+ s->latest_sentence = se->id;
+ break;
+ }
+ }
+
+ if (any) sort_sentences (s);
+}
+
+
+/* Render all the words to the screen, and run the animation one step.
+ */
+static void
+draw_sentence (state *s, sentence *se)
+{
+ int i;
+ Bool moved = False;
+
+ if (! se) return;
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+
+ switch (s->mode)
+ {
+ case PAGE:
+ case CHARS:
+ if (se->anim_state != PAUSE &&
+ w->tick <= w->nticks)
+ {
+ int dx = w->target_x - w->start_x;
+ int dy = w->target_y - w->start_y;
+ double r = sin (w->tick * M_PI / (2 * w->nticks));
+ w->x = w->start_x + (dx * r);
+ w->y = w->start_y + (dy * r);
+
+ w->tick++;
+ if (se->anim_state == OUT &&
+ (s->mode == PAGE || s->mode == CHARS))
+ w->tick++; /* go out faster */
+ moved = True;
+ }
+ break;
+ case SCROLL:
+ {
+ int dx = w->target_x - w->start_x;
+ int dy = w->target_y - w->start_y;
+ double r = (double) w->tick / w->nticks;
+ w->x = w->start_x + (dx * r);
+ w->y = w->start_y + (dy * r);
+ w->tick++;
+ moved = (w->tick <= w->nticks);
+
+ /* Launch a new sentence when:
+ - the front of this sentence is almost off the left edge;
+ - the end of this sentence is almost on screen.
+ - or, randomly
+ */
+ if (se->anim_state != OUT &&
+ i == 0 &&
+ se->id == s->latest_sentence)
+ {
+ Bool new_p = (w->x < (s->xgwa.width * 0.4) &&
+ w->x + se->width < (s->xgwa.width * 2.1));
+ Bool rand_p = (new_p ? 0 : !(random() % 2000));
+
+ if (new_p || rand_p)
+ {
+ se->anim_state = OUT;
+ s->spawn_p = True;
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: OUT %d (x2 = %d%s)\n",
+ progname, se->id,
+ se->words[0]->x + se->width,
+ rand_p ? " randomly" : "");
+# endif /* DEBUG */
+ }
+ }
+ }
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ draw_word (s, se, w);
+ }
+
+ if (moved && se->anim_state == PAUSE)
+ abort();
+
+ if (! moved)
+ {
+ switch (se->anim_state)
+ {
+ case IN:
+ se->anim_state = PAUSE;
+ se->pause_tick = (se->nwords * 7 * s->linger);
+ if (se->move_chars_p)
+ se->pause_tick /= 5;
+ scatter_sentence (s, se);
+ shuffle_words (s, se);
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: PAUSE %d\n", progname, se->id);
+# endif /* DEBUG */
+ break;
+ case PAUSE:
+ if (--se->pause_tick <= 0)
+ {
+ se->anim_state = OUT;
+ s->spawn_p = True;
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: OUT %d\n", progname, se->id);
+# endif /* DEBUG */
+ }
+ break;
+ case OUT:
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: DEAD %d\n", progname, se->id);
+# endif /* DEBUG */
+ {
+ int j;
+ for (j = 0; j < s->nsentences; j++)
+ if (s->sentences[j] == se)
+ s->sentences[j] = 0;
+ free_sentence (s, se);
+ }
+ break;
+ default:
+ abort();
+ break;
+ }
+ }
+}
+
+
+#ifdef DEBUG /* All of this stuff is for -debug-metrics mode. */
+
+
+static Pixmap
+scale_ximage (Screen *screen, Window window, XImage *img, int scale,
+ int margin)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int x, y;
+ unsigned width = img->width, height = img->height;
+ Pixmap p2;
+ GC gc;
+
+ p2 = XCreatePixmap (dpy, window, width*scale, height*scale, img->depth);
+ gc = XCreateGC (dpy, p2, 0, 0);
+
+ XSetForeground (dpy, gc, BlackPixelOfScreen (screen));
+ XFillRectangle (dpy, p2, gc, 0, 0, width*scale, height*scale);
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++)
+ {
+ XSetForeground (dpy, gc, XGetPixel (img, x, y));
+ XFillRectangle (dpy, p2, gc, x*scale, y*scale, scale, scale);
+ }
+
+ if (scale > 2)
+ {
+ XWindowAttributes xgwa;
+ XColor c;
+ c.red = c.green = c.blue = 0x4444;
+ c.flags = DoRed|DoGreen|DoBlue;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ if (! XAllocColor (dpy, xgwa.colormap, &c)) abort();
+ XSetForeground (dpy, gc, c.pixel);
+ XDrawRectangle (dpy, p2, gc, 0, 0, width*scale-1, height*scale-1);
+ XDrawRectangle (dpy, p2, gc, margin*scale, margin*scale,
+ width*scale-1, height*scale-1);
+ for (y = 0; y <= height - 2*margin; y++)
+ XDrawLine (dpy, p2, gc,
+ margin*scale, (y+margin)*scale-1,
+ (width-margin)*scale, (y+margin)*scale-1);
+ for (x = 0; x <= width - 2*margin; x++)
+ XDrawLine (dpy, p2, gc,
+ (x+margin)*scale-1, margin*scale,
+ (x+margin)*scale-1, (height-margin)*scale);
+ XFreeColors (dpy, xgwa.colormap, &c.pixel, 1, 0);
+ }
+
+ XFreeGC (dpy, gc);
+ return p2;
+}
+
+
+static int check_edge (Display *dpy, Drawable p, GC gc,
+ unsigned msg_x, unsigned msg_y, const char *msg,
+ XImage *img,
+ unsigned x, unsigned y, unsigned dim, unsigned end)
+{
+ unsigned pt[2];
+ pt[0] = x;
+ pt[1] = y;
+ end += pt[dim];
+
+ for (;;)
+ {
+ if (pt[dim] == end)
+ {
+ XDrawString (dpy, p, gc, msg_x, msg_y, msg, strlen (msg));
+ return 1;
+ }
+
+ if (XGetPixel(img, pt[0], pt[1]) & 0xffffff)
+ break;
+
+ ++pt[dim];
+ }
+
+ return 0;
+}
+
+
+static unsigned long
+fontglide_draw_metrics (state *s)
+{
+ unsigned int margin = (s->debug_metrics_antialiasing_p ? 2 : 0);
+
+ char txt[2], utxt[3], txt2[80];
+ XChar2b *txt3 = 0;
+ const char *fn = (s->font_override ? s->font_override : "fixed");
+ char fn2[1024];
+ XCharStruct c, overall, fake_c;
+ int dir, ascent, descent;
+ int x, y;
+ XGlyphInfo extents;
+ XftColor xftcolor;
+ XftDraw *xftdraw;
+ int sc = s->debug_scale;
+ GC gc;
+ unsigned long red = 0xFFFF0000; /* so shoot me */
+ unsigned long green = 0xFF00FF00;
+ unsigned long blue = 0xFF6666FF;
+ unsigned long yellow = 0xFFFFFF00;
+ unsigned long cyan = 0xFF004040;
+ int i, j;
+ Drawable dest = s->b ? s->b : s->window;
+
+ if (sc < 1) sc = 1;
+
+ /* Self-test these macros to make sure they're symmetrical. */
+ for (i = 0; i < 1000; i++)
+ {
+ XGlyphInfo g, g2;
+ XRectangle r;
+ c.lbearing = (random()%50)-100;
+ c.rbearing = (random()%50)-100;
+ c.ascent = (random()%50)-100;
+ c.descent = (random()%50)-100;
+ c.width = (random()%50)-100;
+ XCharStruct_to_XGlyphInfo (c, g);
+ XGlyphInfo_to_XCharStruct (g, overall);
+ if (c.lbearing != overall.lbearing) abort();
+ if (c.rbearing != overall.rbearing) abort();
+ if (c.ascent != overall.ascent) abort();
+ if (c.descent != overall.descent) abort();
+ if (c.width != overall.width) abort();
+ XCharStruct_to_XGlyphInfo (overall, g2);
+ if (g.x != g2.x) abort();
+ if (g.y != g2.y) abort();
+ if (g.xOff != g2.xOff) abort();
+ if (g.yOff != g2.yOff) abort();
+ if (g.width != g2.width) abort();
+ if (g.height != g2.height) abort();
+ XCharStruct_to_XmbRectangle (overall, r);
+ XmbRectangle_to_XCharStruct (r, c, c.width);
+ if (c.lbearing != overall.lbearing) abort();
+ if (c.rbearing != overall.rbearing) abort();
+ if (c.ascent != overall.ascent) abort();
+ if (c.descent != overall.descent) abort();
+ if (c.width != overall.width) abort();
+ }
+
+ txt[0] = s->debug_metrics_p;
+ txt[1] = 0;
+
+ /* Convert Unicode code point to UTF-8. */
+ utxt[utf8_encode(s->debug_metrics_p, utxt, 4)] = 0;
+
+ txt3 = utf8_to_XChar2b (utxt, 0);
+
+ if (! s->metrics_font1)
+ s->metrics_font1 = XLoadQueryFont (s->dpy, fn);
+ if (! s->metrics_font2)
+ s->metrics_font2 = XLoadQueryFont (s->dpy, "fixed");
+ if (! s->metrics_font1)
+ s->metrics_font1 = s->metrics_font2;
+
+ gc = XCreateGC (s->dpy, dest, 0, 0);
+ XSetFont (s->dpy, gc, s->metrics_font1->fid);
+
+# if defined(HAVE_JWXYZ)
+ jwxyz_XSetAntiAliasing (s->dpy, gc, False);
+# endif
+
+ if (! s->metrics_xftfont)
+ {
+ s->metrics_xftfont =
+ XftFontOpenXlfd (s->dpy, screen_number(s->xgwa.screen), fn);
+ if (! s->metrics_xftfont)
+ {
+ const char *fn2 = "fixed";
+ s->metrics_xftfont =
+ XftFontOpenName (s->dpy, screen_number(s->xgwa.screen), fn2);
+ if (s->metrics_xftfont)
+ fn = fn2;
+ else
+ {
+ fprintf (stderr, "%s: XftFontOpen failed on \"%s\" and \"%s\"\n",
+ progname, fn, fn2);
+ exit (1);
+ }
+ }
+ }
+
+ strcpy (fn2, fn);
+# ifdef HAVE_JWXYZ
+ append_font_name (s->dpy, fn2, s->metrics_xftfont->xfont);
+# endif
+
+ xftdraw = XftDrawCreate (s->dpy, dest, s->xgwa.visual,
+ s->xgwa.colormap);
+ XftColorAllocName (s->dpy, s->xgwa.visual, s->xgwa.colormap, "white",
+ &xftcolor);
+ XftTextExtentsUtf8 (s->dpy, s->metrics_xftfont,
+ (FcChar8 *) utxt, strlen(utxt),
+ &extents);
+
+
+ XTextExtents (s->metrics_font1, txt, strlen(txt),
+ &dir, &ascent, &descent, &overall);
+ c = ((s->debug_metrics_p >= s->metrics_font1->min_char_or_byte2 &&
+ s->debug_metrics_p <= s->metrics_font1->max_char_or_byte2)
+ ? s->metrics_font1->per_char[s->debug_metrics_p -
+ s->metrics_font1->min_char_or_byte2]
+ : overall);
+
+ XSetForeground (s->dpy, gc, BlackPixelOfScreen (s->xgwa.screen));
+ XFillRectangle (s->dpy, dest, gc, 0, 0, s->xgwa.width, s->xgwa.height);
+
+ XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ XDrawString (s->dpy, dest, gc,
+ s->xgwa.width / 2,
+ s->xgwa.height - 5,
+ fn2, strlen(fn2));
+
+# ifdef HAVE_JWXYZ
+ {
+ char *name = jwxyz_unicode_character_name (
+ s->dpy, s->metrics_font1->fid, s->debug_metrics_p);
+ if (!name || !*name) name = strdup("unknown character name");
+ XDrawString (s->dpy, dest, gc,
+ 10,
+ 10 + 2 * (s->metrics_font2->ascent +
+ s->metrics_font2->descent),
+ name, strlen(name));
+ free (name);
+ }
+# endif
+
+ /* i 0, j 0: top left, XDrawString, char metrics
+ i 1, j 0: bot left, XDrawString, overall metrics, ink escape
+ i 0, j 1: top right, XftDrawStringUtf8, utf8 metrics
+ i 1, j 1: bot right, XDrawString16, 16 metrics, ink escape
+ */
+ for (j = 0; j < 2; j++) {
+ Bool xft_p = (j != 0);
+ int ww = s->xgwa.width / 2 - 20;
+ int xoff = (j == 0 ? 0 : ww + 20);
+
+ /* XDrawString only does 8-bit characters, so skip it outside Latin-1. */
+ if (s->debug_metrics_p >= 256)
+ {
+ if (!xft_p)
+ continue;
+ xoff = 0;
+ ww = s->xgwa.width;
+ }
+
+ x = (ww - overall.width) / 2;
+
+ for (i = 0; i < 2; i++)
+ {
+ XCharStruct cc;
+ int x1 = xoff + ww * 0.18;
+ int x2 = xoff + ww * 0.82;
+ int x3 = xoff + ww;
+ int pixw, pixh;
+ Pixmap p;
+
+ y = 80;
+ {
+ int h = sc * (ascent + descent);
+ int min = (ascent + descent) * 4;
+ if (h < min) h = min;
+ if (i == 1) h *= 3;
+ y += h;
+ }
+
+ memset (&fake_c, 0, sizeof(fake_c));
+
+ if (!xft_p && i == 0)
+ cc = c;
+ else if (!xft_p && i == 1)
+ cc = overall;
+ else if (xft_p && i == 0)
+ {
+ /* Measure the glyph in the Xft way */
+ XGlyphInfo extents;
+ XftTextExtentsUtf8 (s->dpy,
+ s->metrics_xftfont,
+ (FcChar8 *) utxt, strlen(utxt),
+ &extents);
+ XGlyphInfo_to_XCharStruct (extents, fake_c);
+ cc = fake_c;
+ }
+ else if (xft_p)
+ {
+ /* Measure the glyph in the 16-bit way */
+ int dir, ascent, descent;
+ XTextExtents16 (s->metrics_font1, txt3, 1, &dir, &ascent, &descent,
+ &fake_c);
+ cc = fake_c;
+ }
+
+ pixw = margin * 2 + cc.rbearing - cc.lbearing;
+ pixh = margin * 2 + cc.ascent + cc.descent;
+ p = (pixw > 0 && pixh > 0
+ ? XCreatePixmap (s->dpy, dest, pixw, pixh, s->xgwa.depth)
+ : 0);
+
+ if (p)
+ {
+ Pixmap p2;
+ GC gc2 = XCreateGC (s->dpy, p, 0, 0);
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc2, False);
+# endif
+ XSetFont (s->dpy, gc2, s->metrics_font1->fid);
+ XSetForeground (s->dpy, gc2, BlackPixelOfScreen (s->xgwa.screen));
+ XFillRectangle (s->dpy, p, gc2, 0, 0, pixw, pixh);
+ XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
+ XSetForeground (s->dpy, gc2, WhitePixelOfScreen (s->xgwa.screen));
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc2,
+ s->debug_metrics_antialiasing_p);
+# endif
+
+ if (xft_p && i == 0)
+ {
+ XftDraw *xftdraw2 = XftDrawCreate (s->dpy, p, s->xgwa.visual,
+ s->xgwa.colormap);
+ XftDrawStringUtf8 (xftdraw2, &xftcolor,
+ s->metrics_xftfont,
+ -cc.lbearing + margin,
+ cc.ascent + margin,
+ (FcChar8 *) utxt, strlen(utxt));
+ XftDrawDestroy (xftdraw2);
+ }
+ else if (xft_p)
+ XDrawString16 (s->dpy, p, gc2,
+ -cc.lbearing + margin,
+ cc.ascent + margin,
+ txt3, 1);
+ else
+ XDrawString (s->dpy, p, gc2,
+ -cc.lbearing + margin,
+ cc.ascent + margin,
+ txt, strlen(txt));
+
+ {
+ unsigned x2, y2;
+ XImage *img = XGetImage (s->dpy, p, 0, 0, pixw, pixh,
+ ~0L, ZPixmap);
+ XImage *img2;
+
+ if (i == 1)
+ {
+ unsigned w = pixw - margin * 2, h = pixh - margin * 2;
+
+ if (margin > 0)
+ {
+ /* Check for ink escape. */
+ unsigned long ink = 0;
+ for (y2 = 0; y2 != pixh; ++y2)
+ for (x2 = 0; x2 != pixw; ++x2)
+ {
+ /* Sloppy... */
+ if (! (x2 >= margin &&
+ x2 < pixw - margin &&
+ y2 >= margin &&
+ y2 < pixh - margin))
+ ink |= XGetPixel (img, x2, y2);
+ }
+
+ if (ink & 0xFFFFFF)
+ {
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10, 40,
+ "Ink escape!", 11);
+ }
+ }
+
+ /* ...And wasted space. */
+ if (w && h)
+ {
+ if (check_edge (s->dpy, dest, gc, 120, 60, "left",
+ img, margin, margin, 1, h) |
+ check_edge (s->dpy, dest, gc, 160, 60, "right",
+ img, margin + w - 1, margin, 1, h) |
+ check_edge (s->dpy, dest, gc, 200, 60, "top",
+ img, margin, margin, 0, w) |
+ check_edge (s->dpy, dest, gc, 240, 60, "bottom",
+ img, margin, margin + h - 1, 0, w))
+ {
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10, 60,
+ "Wasted space: ", 14);
+ }
+ }
+ }
+
+ if (s->debug_metrics_antialiasing_p)
+ {
+ /* Draw a dark cyan boundary around antialiased glyphs */
+ img2 = XCreateImage (s->dpy, s->xgwa.visual, img->depth,
+ ZPixmap, 0, NULL,
+ img->width, img->height,
+ img->bitmap_pad, 0);
+ img2->data = malloc (img->bytes_per_line * img->height);
+
+ for (y2 = 0; y2 != pixh; ++y2)
+ for (x2 = 0; x2 != pixw; ++x2)
+ {
+ unsigned long px = XGetPixel (img, x2, y2);
+ if ((px & 0xffffff) == 0)
+ {
+ unsigned long neighbors = 0;
+ if (x2)
+ neighbors |= XGetPixel (img, x2 - 1, y2);
+ if (x2 != pixw - 1)
+ neighbors |= XGetPixel (img, x2 + 1, y2);
+ if (y2)
+ neighbors |= XGetPixel (img, x2, y2 - 1);
+ if (y2 != pixh - 1)
+ neighbors |= XGetPixel (img, x2, y2 + 1);
+ XPutPixel (img2, x2, y2,
+ (neighbors & 0xffffff
+ ? cyan
+ : BlackPixelOfScreen (s->xgwa.screen)));
+ }
+ else
+ {
+ XPutPixel (img2, x2, y2, px);
+ }
+ }
+ }
+ else
+ {
+ img2 = img;
+ img = NULL;
+ }
+
+ p2 = scale_ximage (s->xgwa.screen, s->window, img2, sc, margin);
+ if (img)
+ XDestroyImage (img);
+ XDestroyImage (img2);
+ }
+
+ XCopyArea (s->dpy, p2, dest, gc,
+ 0, 0, sc*pixw, sc*pixh,
+ xoff + x + sc * (cc.lbearing - margin),
+ y - sc * (cc.ascent + margin));
+ XFreePixmap (s->dpy, p);
+ XFreePixmap (s->dpy, p2);
+ XFreeGC (s->dpy, gc2);
+ }
+
+ if (i == 0)
+ {
+ XSetFont (s->dpy, gc, s->metrics_font1->fid);
+ XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc, s->debug_metrics_antialiasing_p);
+# endif
+ sprintf (txt2, "%s [XX%sXX] [%s%s%s%s]",
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt));
+
+ if (xft_p)
+ XftDrawStringUtf8 (xftdraw, &xftcolor,
+ s->metrics_xftfont,
+ xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2
+ + 40,
+ ascent + 10,
+ (FcChar8 *) txt2, strlen(txt2));
+ else
+ XDrawString (s->dpy, dest, gc,
+ xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2,
+ ascent + 10,
+ txt2, strlen(txt2));
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc, False);
+# endif
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ if (xft_p)
+ {
+ char *uptr;
+ char *tptr = txt2 + sprintf(txt2, "U+%04lX", s->debug_metrics_p);
+ *tptr++ = " ?_"[s->entering_unicode_p];
+ *tptr++ = ' ';
+
+ uptr = utxt;
+ while (*uptr)
+ {
+ tptr += sprintf (tptr, "0%03o ", (unsigned char) *uptr);
+ ++uptr;
+ }
+ *tptr++ = ' ';
+ uptr = utxt;
+ while (*uptr)
+ {
+ tptr += sprintf (tptr, "%02x ", (unsigned char) *uptr);
+ ++uptr;
+ }
+ }
+ else
+ sprintf (txt2, "%c %3ld 0%03lo 0x%02lx%s",
+ (char)s->debug_metrics_p, s->debug_metrics_p,
+ s->debug_metrics_p, s->debug_metrics_p,
+ (txt[0] < s->metrics_font1->min_char_or_byte2
+ ? " *" : ""));
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10, 20,
+ txt2, strlen(txt2));
+ }
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc, True);
+# endif
+
+ {
+ const char *ss = (j == 0
+ ? (i == 0 ? "char" : "overall")
+ : (i == 0 ? "utf8" : "16 bit"));
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+
+ XSetForeground (s->dpy, gc, red);
+
+ sprintf (txt2, "%s ascent %d", ss, ascent);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10,
+ y - sc*ascent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff, y - sc*ascent,
+ x3, y - sc*ascent);
+
+ sprintf (txt2, "%s descent %d", ss, descent);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10,
+ y + sc*descent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff, y + sc*descent,
+ x3, y + sc*descent);
+ }
+
+
+ /* ascent, descent, baseline */
+
+ XSetForeground (s->dpy, gc, green);
+
+ sprintf (txt2, "ascent %d", cc.ascent);
+ if (cc.ascent != 0)
+ XDrawString (s->dpy, dest, gc,
+ x1, y - sc*cc.ascent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ x1, y - sc*cc.ascent,
+ x2, y - sc*cc.ascent);
+
+ sprintf (txt2, "descent %d", cc.descent);
+ if (cc.descent != 0)
+ XDrawString (s->dpy, dest, gc,
+ x1, y + sc*cc.descent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ x1, y + sc*cc.descent,
+ x2, y + sc*cc.descent);
+
+ XSetForeground (s->dpy, gc, yellow);
+ strcpy (txt2, "baseline");
+ XDrawString (s->dpy, dest, gc,
+ x1, y - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc, x1, y, x2, y);
+
+
+ /* origin, width */
+
+ XSetForeground (s->dpy, gc, blue);
+
+ strcpy (txt2, "origin");
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + 2,
+ y + sc*descent + 50,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x, y - sc*(ascent - 10),
+ xoff + x, y + sc*(descent + 10));
+
+ sprintf (txt2, "width %d", cc.width);
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + sc*cc.width + 2,
+ y + sc*descent + 60,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x + sc*cc.width, y - sc*(ascent - 10),
+ xoff + x + sc*cc.width, y + sc*(descent + 10));
+
+
+ /* lbearing, rbearing */
+
+ XSetForeground (s->dpy, gc, green);
+
+ sprintf (txt2, "lbearing %d", cc.lbearing);
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + sc*cc.lbearing + 2,
+ y + sc * descent + 30,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x + sc*cc.lbearing, y - sc*ascent,
+ xoff + x + sc*cc.lbearing, y + sc*descent + 20);
+
+ sprintf (txt2, "rbearing %d", cc.rbearing);
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + sc*cc.rbearing + 2,
+ y + sc * descent + 40,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x + sc*cc.rbearing, y - sc*ascent,
+ xoff + x + sc*cc.rbearing, y + sc*descent + 40);
+
+ /* y += sc * (ascent + descent) * 2; */
+ }
+ }
+
+ if (dest != s->window)
+ XCopyArea (s->dpy, dest, s->window, s->bg_gc,
+ 0, 0, s->xgwa.width, s->xgwa.height, 0, 0);
+
+ XFreeGC (s->dpy, gc);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap, &xftcolor);
+ XftDrawDestroy (xftdraw);
+ free (txt3);
+
+ return s->frame_delay;
+}
+
+# endif /* DEBUG */
+
+
+/* Render all the words to the screen, and run the animation one step.
+ Clear screen first, swap buffers after.
+ */
+static unsigned long
+fontglide_draw (Display *dpy, Window window, void *closure)
+{
+ state *s = (state *) closure;
+ int i;
+
+# ifdef DEBUG
+ if (s->debug_metrics_p)
+ return fontglide_draw_metrics (closure);
+# endif /* DEBUG */
+
+ if (s->spawn_p)
+ more_sentences (s);
+
+ if (!s->trails_p)
+ XFillRectangle (s->dpy, s->b, s->bg_gc,
+ 0, 0, s->xgwa.width, s->xgwa.height);
+
+ for (i = 0; i < s->nsentences; i++)
+ draw_sentence (s, s->sentences[i]);
+
+# ifdef DEBUG
+ if (s->debug_p && (s->prev_font_name || s->next_font_name))
+ {
+ if (! s->label_gc)
+ {
+ if (! s->metrics_font2)
+ s->metrics_font2 = XLoadQueryFont (s->dpy, "fixed");
+ s->label_gc = XCreateGC (dpy, s->b, 0, 0);
+ XSetFont (s->dpy, s->label_gc, s->metrics_font2->fid);
+ }
+ if (s->prev_font_name)
+ XDrawString (s->dpy, s->b, s->label_gc,
+ 10, 10 + s->metrics_font2->ascent,
+ s->prev_font_name, strlen(s->prev_font_name));
+ if (s->next_font_name)
+ XDrawString (s->dpy, s->b, s->label_gc,
+ 10, 10 + s->metrics_font2->ascent * 2,
+ s->next_font_name, strlen(s->next_font_name));
+ }
+# endif /* DEBUG */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (s->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = s->window;
+ info[0].swap_action = (s->dbeclear_p ? XdbeBackground : XdbeUndefined);
+ XdbeSwapBuffers (s->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (s->dbuf)
+ {
+ XCopyArea (s->dpy, s->b, s->window, s->bg_gc,
+ 0, 0, s->xgwa.width, s->xgwa.height, 0, 0);
+ }
+
+ return s->frame_delay;
+}
+
+
+
+/* When the subprocess has generated some output, this reads as much as it
+ can into s->buf at s->buf_tail.
+ */
+static void
+drain_input (state *s)
+{
+ while (s->buf_tail < sizeof(s->buf) - 2)
+ {
+ int c = textclient_getc (s->tc);
+ if (c > 0)
+ s->buf[s->buf_tail++] = (char) c;
+ else
+ break;
+ }
+}
+
+
+/* Window setup and resource loading */
+
+static void *
+fontglide_init (Display *dpy, Window window)
+{
+ XGCValues gcv;
+ state *s = (state *) calloc (1, sizeof(*s));
+ s->dpy = dpy;
+ s->window = window;
+ s->frame_delay = get_integer_resource (dpy, "delay", "Integer");
+
+ XGetWindowAttributes (s->dpy, s->window, &s->xgwa);
+
+ s->font_override = get_string_resource (dpy, "font", "Font");
+ if (s->font_override && (!*s->font_override || *s->font_override == '('))
+ s->font_override = 0;
+
+ s->charset = get_string_resource (dpy, "fontCharset", "FontCharset");
+ s->border_width = get_integer_resource (dpy, "fontBorderWidth", "Integer");
+ if (s->border_width < 0 || s->border_width > 20)
+ s->border_width = 1;
+
+ s->speed = get_float_resource (dpy, "speed", "Float");
+ if (s->speed <= 0 || s->speed > 200)
+ s->speed = 1;
+
+ s->linger = get_float_resource (dpy, "linger", "Float");
+ if (s->linger <= 0 || s->linger > 200)
+ s->linger = 1;
+
+ s->trails_p = get_boolean_resource (dpy, "trails", "Trails");
+
+# ifdef DEBUG
+ s->debug_p = get_boolean_resource (dpy, "debug", "Debug");
+ s->debug_metrics_p = (get_boolean_resource (dpy, "debugMetrics", "Debug")
+ ? 199 : 0);
+ s->debug_scale = 6;
+
+# ifdef HAVE_JWXYZ
+ if (s->debug_metrics_p && !s->font_override)
+ s->font_override = "Helvetica Bold 16";
+# endif
+
+# endif /* DEBUG */
+
+ s->dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ s->dbuf = False;
+# endif
+
+# ifdef DEBUG
+ if (s->debug_metrics_p) s->trails_p = False;
+# endif /* DEBUG */
+
+ if (s->trails_p) s->dbuf = False; /* don't need it in this case */
+
+ {
+ const char *ss = get_string_resource (dpy, "mode", "Mode");
+ if (!ss || !*ss || !strcasecmp (ss, "random"))
+ s->mode = ((random() % 2) ? SCROLL : PAGE);
+ else if (!strcasecmp (ss, "scroll"))
+ s->mode = SCROLL;
+ else if (!strcasecmp (ss, "page"))
+ s->mode = PAGE;
+ else if (!strcasecmp (ss, "chars") || !strcasecmp (ss, "char"))
+ s->mode = CHARS;
+ else
+ {
+ fprintf (stderr,
+ "%s: `mode' must be `scroll', `page', or `random', not `%s'\n",
+ progname, ss);
+ }
+ }
+
+ if (s->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ s->dbeclear_p = get_boolean_resource (dpy, "useDBEClear", "Boolean");
+ if (s->dbeclear_p)
+ s->b = xdbe_get_backbuffer (dpy, window, XdbeBackground);
+ else
+ s->b = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+ s->backb = s->b;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!s->b)
+ {
+ s->ba = XCreatePixmap (s->dpy, s->window,
+ s->xgwa.width, s->xgwa.height,
+ s->xgwa.depth);
+ s->b = s->ba;
+ }
+ }
+ else
+ {
+ s->b = s->window;
+ }
+
+ gcv.foreground = get_pixel_resource (s->dpy, s->xgwa.colormap,
+ "background", "Background");
+ s->bg_gc = XCreateGC (s->dpy, s->b, GCForeground, &gcv);
+
+ s->nsentences = 5; /* #### */
+ s->sentences = (sentence **) calloc (s->nsentences, sizeof (sentence *));
+ s->spawn_p = True;
+
+ s->early_p = True;
+ s->start_time = time ((time_t *) 0);
+ s->tc = textclient_open (dpy);
+
+ return s;
+}
+
+
+static Bool
+fontglide_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+# ifdef DEBUG
+ state *s = (state *) closure;
+
+ if (! s->debug_metrics_p)
+ return False;
+ if (event->xany.type == KeyPress)
+ {
+ static const unsigned long max = 0x110000;
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+ if (s->entering_unicode_p > 0)
+ {
+ unsigned digit;
+ unsigned long new_char = 0;
+
+ if (c >= 'a' && c <= 'f')
+ digit = c + 0xa - 'a';
+ else if (c >= 'A' && c <= 'F')
+ digit = c + 0xa - 'A';
+ else if (c >= '0' && c <= '9')
+ digit = c + 0 - '0';
+ else
+ {
+ s->entering_unicode_p = 0;
+ return True;
+ }
+
+ if (s->entering_unicode_p == 1)
+ new_char = 0;
+ else if (s->entering_unicode_p == 2)
+ new_char = s->debug_metrics_p;
+
+ new_char = (new_char << 4) | digit;
+ if (new_char > 0 && new_char < max)
+ {
+ s->debug_metrics_p = new_char;
+ s->entering_unicode_p = 2;
+ }
+ else
+ s->entering_unicode_p = 0;
+ return True;
+ }
+
+ if (c == '\t')
+ s->debug_metrics_antialiasing_p ^= True;
+ else if (c == 3 || c == 27)
+ exit (0);
+ else if (c >= ' ')
+ s->debug_metrics_p = (unsigned char) c;
+ else if (keysym == XK_Left || keysym == XK_Right)
+ {
+ s->debug_metrics_p += (keysym == XK_Left ? -1 : 1);
+ if (s->debug_metrics_p >= max)
+ s->debug_metrics_p = 1;
+ else if (s->debug_metrics_p <= 0)
+ s->debug_metrics_p = max - 1;
+ return True;
+ }
+ else if (keysym == XK_Prior)
+ s->debug_metrics_p = (s->debug_metrics_p + max - 0x80) % max;
+ else if (keysym == XK_Next)
+ s->debug_metrics_p = (s->debug_metrics_p + 0x80) % max;
+ else if (keysym == XK_Up)
+ s->debug_scale++;
+ else if (keysym == XK_Down)
+ s->debug_scale = (s->debug_scale > 1 ? s->debug_scale-1 : 1);
+ else if (keysym == XK_F1)
+ s->entering_unicode_p = 1;
+ else
+ return False;
+ return True;
+ }
+# endif /* DEBUG */
+
+ return False;
+}
+
+
+static void
+fontglide_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *s = (state *) closure;
+ XGetWindowAttributes (s->dpy, s->window, &s->xgwa);
+
+ if (s->dbuf && s->ba)
+ {
+ XFreePixmap (s->dpy, s->ba);
+ s->ba = XCreatePixmap (s->dpy, s->window,
+ s->xgwa.width, s->xgwa.height,
+ s->xgwa.depth);
+ XFillRectangle (s->dpy, s->ba, s->bg_gc, 0, 0,
+ s->xgwa.width, s->xgwa.height);
+ s->b = s->ba;
+ }
+}
+
+static void
+fontglide_free (Display *dpy, Window window, void *closure)
+{
+ state *s = (state *) closure;
+ textclient_close (s->tc);
+
+#ifdef DEBUG
+ if (s->metrics_xftfont)
+ XftFontClose (s->dpy, s->metrics_xftfont);
+ if (s->metrics_font1)
+ XFreeFont (s->dpy, s->metrics_font1);
+ if (s->metrics_font2 && s->metrics_font1 != s->metrics_font2)
+ XFreeFont (s->dpy, s->metrics_font2);
+ if (s->prev_font_name) free (s->prev_font_name);
+ if (s->next_font_name) free (s->next_font_name);
+ if (s->label_gc) XFreeGC (dpy, s->label_gc);
+#endif
+
+ /* #### there's more to free here */
+
+ free (s);
+}
+
+
+static const char *fontglide_defaults [] = {
+ ".background: #000000",
+ ".foreground: #DDDDDD",
+ ".borderColor: #555555",
+ "*delay: 10000",
+ "*program: xscreensaver-text",
+ "*usePty: false",
+ "*mode: random",
+ ".font: (default)",
+
+ /* I'm not entirely clear on whether the charset of an XLFD has any
+ meaning when Xft is being used. */
+ "*fontCharset: iso8859-1",
+/*"*fontCharset: iso10646-1", */
+/*"*fontCharset: *-*",*/
+
+ "*fontBorderWidth: 2",
+ "*speed: 1.0",
+ "*linger: 1.0",
+ "*trails: False",
+# ifdef DEBUG
+ "*debug: False",
+ "*debugMetrics: False",
+# endif /* DEBUG */
+ "*doubleBuffer: True",
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+ "*useDBEClear: True",
+# endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ 0
+};
+
+static XrmOptionDescRec fontglide_options [] = {
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-scroll", ".mode", XrmoptionNoArg, "scroll" },
+ { "-page", ".mode", XrmoptionNoArg, "page" },
+ { "-random", ".mode", XrmoptionNoArg, "random" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-linger", ".linger", XrmoptionSepArg, 0 },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-font", ".font", XrmoptionSepArg, 0 },
+ { "-fn", ".font", XrmoptionSepArg, 0 },
+ { "-bw", ".fontBorderWidth", XrmoptionSepArg, 0 },
+ { "-trails", ".trails", XrmoptionNoArg, "True" },
+ { "-no-trails", ".trails", XrmoptionNoArg, "False" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+# ifdef DEBUG
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+ { "-debug-metrics", ".debugMetrics", XrmoptionNoArg, "True" },
+# endif /* DEBUG */
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("FontGlide", fontglide)
diff --git a/hacks/fontglide.man b/hacks/fontglide.man
new file mode 100644
index 0000000..f60d20d
--- /dev/null
+++ b/hacks/fontglide.man
@@ -0,0 +1,124 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+fontglide - characters float onto the screen to form words
+.SH SYNOPSIS
+.B fontglide
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-scroll\fP]
+[\-page\fP]
+[\-random\fP]
+[\-speed \fIfloat\fP]
+[\-linger \fIfloat\fP]
+[\-program \fIsh-command\fP]
+[\-font \fIfont-name\fP]
+[\-bw \fIint\fP]
+[\-trails]
+[\-db]
+[\-debug]
+[\-fps]
+.SH DESCRIPTION
+The \fIfontglide\fP program reads text from a subprocess and puts it on
+the screen using large characters that glide in from the edges,
+assemble, then disperse. Alternately, it can simply scroll whole
+sentences from right to left.
+.SH OPTIONS
+.I fontglide
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation, in microseconds: default 10000.
+.TP 8
+.B \-page
+With this option, a page full of text will glide in, and disperse.
+.TP 8
+.B \-scroll
+With this option, sentences will scroll by from right to left.
+.TP 8
+.B \-random
+The default is to pick randomly between \fI\-page\fP and \fI\-scroll\fP.
+.TP 8
+.B \-speed \fIfloat\fP
+How fast to animate; 2 means twice as fast, 0.5 means half as fast.
+Default 1.0.
+.TP 8
+.B \-linger \fIfloat\fP
+How long to leave the assembled text on the screen in \fI\-page\fP mode;
+2 means twice as long, 0.5 means half as long. Default 1.0. (The more
+words there are on the screen, the longer it lingers.)
+.TP 8
+.B \-program \fIsh-command\fP
+The command to run to generate the text to display. This option may be
+any string acceptable to /bin/sh. The program will be run at the end of
+a pipe, and any words that it prints to \fIstdout\fP will end up on
+the window. (Whitespace and line breaks are ignored.) If the program
+exits, it will be launched again after we have processed all the text
+it produced. Default:
+.BR xscreensaver-text (1).
+.TP 8
+.B \-font\fP \fIstring\fP
+The base font pattern to use when loading fonts. The default is to search
+for any Latin1 scalable proportional fonts on the system. Once a base font
+is selected, it will be loaded in a random size.
+.TP 8
+.B \-bw \fIint\fP
+How thick an outline to draw around the characters. Default 2 pixels.
+.TP 8
+.B \-trails\fP
+Leave "vapor trails" behind the moving text. Default off.
+.TP 8
+.B \-no-db\fP
+Turn off double-buffering. It may be faster, but will flicker.
+.TP 8
+.B \-debug\fP
+Draw some boxes showing character metrics, and print the name of the
+current font to stderr.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 15-Sep-2003.
diff --git a/hacks/forest.c b/hacks/forest.c
new file mode 100644
index 0000000..38a480d
--- /dev/null
+++ b/hacks/forest.c
@@ -0,0 +1,244 @@
+/* forest.c (aka xtree.c), Copyright (c) 1999
+ * Peter Baumung <unn6@rz.uni-karlsruhe.de>
+ *
+ * Most code taken from
+ * xscreensaver, Copyright (c) 1992, 1995, 1997
+ * Jamie Zawinski <jwz@netscape.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* ****************************** NOTE ******************************
+
+ This is not the xlockmore version of forest, but a much better
+ looking rewrite. Be careful not to delete it in a merging frenzy...
+
+ **********************************************************************
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 500000 \n" \
+ "*ncolors: 20 \n" \
+ "*fpsSolid: true \n" \
+
+# include "xlockmore.h" /* from the xscreensaver distribution */
+# define free_trees 0
+# define release_trees 0
+# define reshape_trees 0
+# define trees_handle_event 0
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ENTRYPOINT ModeSpecOpt trees_opts = {0, NULL, 0, NULL, NULL};
+
+typedef struct {
+ int x;
+ int y;
+ int thick;
+ double size;
+ long color;
+ int toDo;
+ int pause;
+ int season;
+} treestruct;
+
+static treestruct *trees = NULL;
+
+static XColor colors[20];
+static int color;
+
+static long colorM[12] = {0xff0000, 0xff8000, 0xffff00, 0x80ff00,
+ 0x00ff00, 0x00ff80, 0x00ffff, 0x0080ff,
+ 0x0000ff, 0x8000ff, 0xff00ff, 0xff0080};
+
+static long colorV[12] = {0x0a0000, 0x0a0500, 0x0a0a00, 0x050a00,
+ 0x000a00, 0x000a05, 0x000a0a, 0x00050a,
+ 0x00000a, 0x05000a, 0x0a000a, 0x0a0005};
+
+ENTRYPOINT void
+init_trees(ModeInfo * mi)
+{
+ treestruct *tree;
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int i;
+
+ if (trees == NULL) {
+
+ if (mi->npixels > 20) {
+ printf("%d colors selected. Setting limit to 20...\n", mi->npixels);
+ mi->npixels = 20;
+ }
+
+ if (mi->npixels < 4) {
+ for (i = 0; i < mi->npixels; i++) {
+ colors[i].red = 65535 * (i & 1);
+ colors[i].green = 65535 * (i & 1);
+ colors[i].blue = 65535 * (i & 1);
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+ } else {
+ if (mi->npixels < 8) {
+ for (i = 0; i < mi->npixels; i++) {
+ colors[i].red = 32768 + 4096 * (i % 4);
+ colors[i].green = 32768 + 4096 * (i % 4);
+ colors[i].blue = 32768 + 4096 * (i % 4);
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+ } else {
+ for (i = 0; i < mi->npixels; i++) {
+ colors[i].red = 24576 + 4096 * (i % 4);
+ colors[i].green = 10240 + 2048 * (i % 4);
+ colors[i].blue = 0;
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+ }
+ }
+
+ for (i = 0; i < mi->npixels; i++)
+ if (!XAllocColor(display, mi->xgwa.colormap, &colors[i])) break;
+ color = i;
+
+ XSetForeground(display, gc, colors[1].pixel);
+ }
+
+ MI_INIT (mi, trees);
+
+ XClearWindow(display, MI_WINDOW(mi));
+ XSetLineAttributes(display, gc, 2, LineSolid, CapButt, JoinMiter);
+ tree = &trees[MI_SCREEN(mi)];
+ tree->toDo = 25;
+ tree->season = NRAND(12);
+
+ for (i = 4; i < mi->npixels; i++) {
+ int sIndex = (tree->season + (i-4) / 4) % 12;
+ long color = colorM[sIndex] - 2 * colorV[sIndex] * (i % 4);
+ colors[i].red = (color & 0xff0000) / 256;
+ colors[i].green = (color & 0x00ff00);
+ colors[i].blue = (color & 0x0000ff) * 256;
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+
+ for (i = 0; i < mi->npixels; i++)
+ if (!XAllocColor(display, mi->xgwa.colormap, &colors[i])) break;
+
+ color = i;
+}
+
+static double rRand(double a, double b)
+{
+ return (a+(b-a)*NRAND(10001)/10000.0);
+}
+
+static void draw_line(ModeInfo * mi,
+ int x1, int y1, int x2, int y2,
+ double angle, int widths, int widthe)
+{
+
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ double sns = 0.5*widths*sin(angle + M_PI_2);
+ double css = 0.5*widths*cos(angle + M_PI_2);
+ double sne = 0.5*widthe*sin(angle + M_PI_2);
+ double cse = 0.5*widthe*cos(angle + M_PI_2);
+
+ int xs1 = (int) (x1-sns);
+ int xs2 = (int) (x1+sns);
+ int ys1 = (int) (y1-css);
+ int ys2 = (int) (y1+css);
+ int xe1 = (int) (x2-sne);
+ int xe2 = (int) (x2+sne);
+ int ye1 = (int) (y2-cse);
+ int ye2 = (int) (y2+cse);
+ int i;
+
+ for (i = 0; i < widths; i++) {
+ if (color >= 4)
+ XSetForeground(display, gc, colors[i*4/widths].pixel);
+ XDrawLine(display, MI_WINDOW(mi), gc,
+ xs1+(xs2-xs1)*i/widths, ys1+(ys2-ys1)*i/widths,
+ xe1+(xe2-xe1)*i/widths, ye1+(ye2-ye1)*i/widths);
+ }
+}
+
+static void draw_tree_rec(ModeInfo * mi, double thick, int x, int y, double angle)
+{
+ treestruct *tree = &trees[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int length = (24+NRAND(12))*tree->size;
+ int a = (int) (x - length*sin(angle));
+ int b = (int) (y - length*cos(angle));
+ int i;
+
+ draw_line(mi, x, y, a, b, angle, thick*tree->size, 0.68*thick*tree->size);
+
+ if (thick > 2) {
+ draw_tree_rec(mi, 0.68*thick, a, b, 0.8*angle+rRand(-0.2, 0.2));
+ if (thick < tree->thick-1) {
+ draw_tree_rec(mi, 0.68*thick, a, b, angle+rRand(0.2, 0.9));
+ draw_tree_rec(mi, 0.68*thick, (a+x)/2, (b+y)/2, angle-rRand(0.2, 0.9));
+ }
+ }
+
+ if (thick < 0.5*tree->thick) {
+ int nleaf = 12 + NRAND(4);
+ XArc leaf[16];
+ for (i = 0; i < nleaf; i++) {
+ leaf[i].x = a + (int) (tree->size * rRand(-12, 12));
+ leaf[i].y = b + (int) (tree->size * rRand(-12, 12));
+ leaf[i].width = (int) (tree->size * rRand(2, 6));
+ leaf[i].height = leaf[i].width;
+ leaf[i].angle1 = 0;
+ leaf[i].angle2 = 360 * 64;
+ }
+ if (mi->npixels >= 4)
+ XSetForeground(display, gc, colors[tree->color+NRAND(4)].pixel);
+ XFillArcs(display, MI_WINDOW(mi), gc, leaf, nleaf);
+ }
+}
+
+ENTRYPOINT void
+draw_trees(ModeInfo * mi)
+{
+ treestruct *tree = &trees[MI_SCREEN(mi)];
+ int width = MI_WIN_WIDTH(mi);
+ int height = MI_WIN_HEIGHT(mi);
+
+ if (tree->pause == 1) {
+ tree->pause--;
+ init_trees(mi);
+ } else if (tree->pause > 1) {
+ tree->pause--;
+ return;
+ } else if (--(tree->toDo) == 0) {
+ tree->pause = 6;
+ return;
+ }
+
+ tree->x = NRAND(width);
+ tree->y = (int) (1.25 * height * (1 - tree->toDo / 23.0));
+ tree->thick = rRand(7, 12);
+ tree->size = height / 480.0;
+ if (color < 8) {
+ tree->color = 0;
+ } else {
+ tree->color = 4 * (1 + NRAND(color / 4 - 1));
+ }
+
+ draw_tree_rec(mi, tree->thick, tree->x, tree->y, rRand(-0.1, 0.1));
+}
+
+
+XSCREENSAVER_MODULE_2 ("Forest", forest, trees)
diff --git a/hacks/forest.man b/hacks/forest.man
new file mode 100644
index 0000000..4447221
--- /dev/null
+++ b/hacks/forest.man
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+forest - draws a fractal forest
+.SH SYNOPSIS
+.B forest
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIforest\fP program draws a fractal forest.
+.SH OPTIONS
+.I forest
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 20.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by Pascal Pensa.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Pascal Pensa <pensa@aurora.unice.fr>, 1995.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/fps.c b/hacks/fps.c
new file mode 100644
index 0000000..a24f623
--- /dev/null
+++ b/hacks/fps.c
@@ -0,0 +1,268 @@
+/* fps, Copyright (c) 2001-2018 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <time.h>
+#include "screenhackI.h"
+#include "fpsI.h"
+
+fps_state *
+fps_init (Display *dpy, Window window)
+{
+ fps_state *st;
+ const char *font;
+ XFontStruct *f;
+ Bool top_p;
+ XWindowAttributes xgwa;
+
+ if (! get_boolean_resource (dpy, "doFPS", "DoFPS"))
+ return 0;
+
+ if (!strcasecmp (progname, "BSOD")) return 0; /* Never worked right */
+
+ top_p = get_boolean_resource (dpy, "fpsTop", "FPSTop");
+
+ st = (fps_state *) calloc (1, sizeof(*st));
+
+ st->dpy = dpy;
+ st->window = window;
+ st->clear_p = get_boolean_resource (dpy, "fpsSolid", "FPSSolid");
+
+ font = get_string_resource (dpy, "fpsFont", "Font");
+
+ if (!font)
+ font = "-*-courier-bold-r-normal-*-*-180-*-*-*-*-*-*"; /* also texfont.c */
+ f = load_font_retry (dpy, font);
+ if (!f) abort();
+
+ {
+ XGCValues gcv;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ gcv.font = f->fid;
+ gcv.foreground =
+ get_pixel_resource (st->dpy, xgwa.colormap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (dpy, window, GCFont|GCForeground, &gcv);
+ gcv.foreground =
+ get_pixel_resource (st->dpy, xgwa.colormap, "background", "Background");
+ st->erase_gc = XCreateGC (dpy, window, GCFont|GCForeground, &gcv);
+ }
+
+ st->font = f;
+ st->x = 10;
+ st->y = 10;
+ if (top_p)
+ st->y = - (st->font->ascent + st->font->descent + 10);
+
+# ifdef USE_IPHONE
+ /* Don't hide the FPS display under the iPhone X bezel.
+ #### This is the worst of all possible ways to do this! But how else?
+ */
+ if (xgwa.width == 2436 || xgwa.height == 2436)
+ {
+ st->x += 48;
+ st->y += 48 * (top_p ? -1 : 1);
+ }
+# endif
+
+ strcpy (st->string, "FPS: ... ");
+
+ return st;
+}
+
+void
+fps_free (fps_state *st)
+{
+ if (st->draw_gc) XFreeGC (st->dpy, st->draw_gc);
+ if (st->erase_gc) XFreeGC (st->dpy, st->erase_gc);
+ if (st->font) XFreeFont (st->dpy, st->font);
+ free (st);
+}
+
+
+void
+fps_slept (fps_state *st, unsigned long usecs)
+{
+ st->slept += usecs;
+}
+
+
+double
+fps_compute (fps_state *st, unsigned long polys, double depth)
+{
+ if (! st) return 0; /* too early? */
+
+ /* Every N frames (where N is approximately one second's worth of frames)
+ check the wall clock. We do this because checking the wall clock is
+ a slow operation.
+ */
+ if (st->frame_count++ >= st->last_ifps)
+ {
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&st->this_frame_end, &tzp);
+# else
+ gettimeofday(&st->this_frame_end);
+# endif
+
+ if (st->prev_frame_end.tv_sec == 0)
+ st->prev_frame_end = st->this_frame_end;
+ }
+
+ /* If we've probed the wall-clock time, regenerate the string.
+ */
+ if (st->this_frame_end.tv_sec != st->prev_frame_end.tv_sec)
+ {
+ double uprev_frame_end = (st->prev_frame_end.tv_sec +
+ ((double) st->prev_frame_end.tv_usec
+ * 0.000001));
+ double uthis_frame_end = (st->this_frame_end.tv_sec +
+ ((double) st->this_frame_end.tv_usec
+ * 0.000001));
+ double fps = st->frame_count / (uthis_frame_end - uprev_frame_end);
+ double idle = (((double) st->slept * 0.000001) /
+ (uthis_frame_end - uprev_frame_end));
+ double load = 100 * (1 - idle);
+
+ if (load < 0) load = 0; /* well that's obviously nonsense... */
+
+ st->prev_frame_end = st->this_frame_end;
+ st->frame_count = 0;
+ st->slept = 0;
+ st->last_ifps = fps;
+ st->last_fps = fps;
+
+ sprintf (st->string, (polys
+ ? "FPS: %.1f \nLoad: %.1f%% "
+ : "FPS: %.1f \nLoad: %.1f%% "),
+ fps, load);
+
+ if (polys > 0)
+ {
+ const char *s = "";
+# if 0
+ if (polys >= (1024 * 1024)) polys >>= 20, s = "M";
+ else if (polys >= 2048) polys >>= 10, s = "K";
+# endif
+
+ strcat (st->string, "\nPolys: ");
+ if (polys >= 1000000)
+ sprintf (st->string + strlen(st->string), "%lu,%03lu,%03lu%s ",
+ (polys / 1000000), ((polys / 1000) % 1000),
+ (polys % 1000), s);
+ else if (polys >= 1000)
+ sprintf (st->string + strlen(st->string), "%lu,%03lu%s ",
+ (polys / 1000), (polys % 1000), s);
+ else
+ sprintf (st->string + strlen(st->string), "%lu%s ", polys, s);
+ }
+
+ if (depth >= 0.0)
+ {
+ unsigned long L = strlen (st->string);
+ char *s = st->string + L;
+ strcat (s, "\nDepth: ");
+ sprintf (s + strlen(s), "%.1f", depth);
+ L = strlen (s);
+ /* Remove trailing ".0" in case depth is not a fraction. */
+ if (s[L-2] == '.' && s[L-1] == '0')
+ s[L-2] = 0;
+ }
+ }
+
+ return st->last_fps;
+}
+
+
+
+/* Width (and optionally height) of the string in pixels.
+ */
+static int
+string_width (XFontStruct *f, const char *c, int *height_ret)
+{
+ int x = 0;
+ int max_w = 0;
+ int h = f->ascent + f->descent;
+ while (*c)
+ {
+ int cc = *((unsigned char *) c);
+ if (*c == '\n')
+ {
+ if (x > max_w) max_w = x;
+ x = 0;
+ h += f->ascent + f->descent;
+ }
+ else
+ x += (f->per_char
+ ? f->per_char[cc-f->min_char_or_byte2].width
+ : f->min_bounds.rbearing);
+ c++;
+ }
+ if (x > max_w) max_w = x;
+ if (height_ret) *height_ret = h;
+
+ return max_w;
+}
+
+
+/* This function is used only in Xlib mode. For GL mode, see glx/fps-gl.c.
+ */
+void
+fps_draw (fps_state *st)
+{
+ XWindowAttributes xgwa;
+ const char *string = st->string;
+ const char *s;
+ int x = st->x;
+ int y = st->y;
+ int lines = 1;
+ int lh = st->font->ascent + st->font->descent;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ for (s = string; *s; s++)
+ if (*s == '\n') lines++;
+
+ if (y < 0)
+ y = -y + (lines-1) * lh;
+ else
+ y = xgwa.height - y;
+
+ y -= lh * (lines-1) + st->font->descent;
+
+ /* clear the background */
+ if (st->clear_p)
+ {
+ int w, h;
+ w = string_width (st->font, string, &h);
+ XFillRectangle (st->dpy, st->window, st->erase_gc,
+ x - st->font->descent,
+ y - lh,
+ w + 2*st->font->descent,
+ h + 2*st->font->descent);
+ }
+
+ /* draw the text */
+ while (lines)
+ {
+ s = strchr (string, '\n');
+ if (! s) s = string + strlen(string);
+ XDrawString (st->dpy, st->window, st->draw_gc,
+ x, y, string, (int) (s - string));
+ string = s;
+ string++;
+ lines--;
+ y += lh;
+ }
+}
diff --git a/hacks/fps.h b/hacks/fps.h
new file mode 100644
index 0000000..d3832c1
--- /dev/null
+++ b/hacks/fps.h
@@ -0,0 +1,35 @@
+/* fps, Copyright (c) 2001-2011 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_FPS_H__
+# define __XSCREENSAVER_FPS_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+typedef struct fps_state fps_state;
+
+extern fps_state *fps_init (Display *, Window);
+extern void fps_free (fps_state *);
+extern void fps_slept (fps_state *, unsigned long usecs);
+extern double fps_compute (fps_state *, unsigned long polys, double depth);
+extern void fps_draw (fps_state *);
+
+/* Doesn't really belong here, but close enough. */
+#ifdef HAVE_MOBILE
+ extern double current_device_rotation (void);
+#else
+# define current_device_rotation() (0)
+#endif
+
+#endif /* __XSCREENSAVER_FPS_H__ */
diff --git a/hacks/fpsI.h b/hacks/fpsI.h
new file mode 100644
index 0000000..552de9c
--- /dev/null
+++ b/hacks/fpsI.h
@@ -0,0 +1,40 @@
+/* fps, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_FPSI_H__
+# define __XSCREENSAVER_FPSI_H__
+
+#include "fps.h"
+#undef HAVE_GLBITMAP
+
+
+struct fps_state {
+ Display *dpy;
+ Window window;
+ int x, y;
+ XFontStruct *font;
+ Bool clear_p;
+ char string[1024];
+
+ /* for glx/fps-gl.c */
+ void *gl_fps_data;
+
+ GC draw_gc, erase_gc;
+
+ int last_ifps;
+ double last_fps;
+ int frame_count;
+ unsigned long slept;
+ struct timeval prev_frame_end, this_frame_end;
+};
+
+#endif /* __XSCREENSAVER_FPSI_H__ */
diff --git a/hacks/fuzzyflakes.c b/hacks/fuzzyflakes.c
new file mode 100644
index 0000000..18470bc
--- /dev/null
+++ b/hacks/fuzzyflakes.c
@@ -0,0 +1,646 @@
+/* fuzzyflakes, Copyright (c) 2004
+ * Barry Dmytro <badcherry@mailc.net>
+ *
+ * ! 2004.06.10 21:05
+ * ! - Added support for resizing
+ * ! - Added a color scheme generation algorithm
+ * ! Thanks to <ZoeB> from #vegans@irc.blitzed.org
+ * ! - Added random color generation
+ * ! - Fixed errors in the xml config file
+ * ! - Cleaned up a few inconsistencies in the code
+ * ! - Changed the default color to #EFBEA5
+ *
+ * ! 2004.05.?? ??:??
+ * ! -original creation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+/* I have need of 1/3 and 2/3 constants later on */
+#define N1_3 0.3333333333
+#define N2_3 0.6666666666
+
+typedef struct _flake_var
+{
+ double Ticks;
+ double XPos, YPos;
+ double TrueX;
+ double XOffset;
+ double Angle;
+} FlakeVariable;
+
+/* Struct containing the atrributes to our flakes */
+typedef struct _flake
+{
+ Display *dpy;
+ Window window;
+
+ int Arms;
+ int Thickness;
+ int BorderThickness;
+ int Radius;
+ unsigned long BordColor;
+ unsigned long ForeColor;
+ unsigned long BackColor;
+ Bool RandomColors;
+ int Layers;
+ int Density;
+ int Delay;
+ int FallingSpeed;
+ struct _colors
+ {
+ char *Fore;
+ char *Bord;
+ char *Back;
+ } Colors;
+/* a dynamic array containing positions of all the flakes */
+ FlakeVariable ***Flakes;
+ XGCValues GCValues;
+ unsigned long GCFlags;
+ GC GCVar;
+ XWindowAttributes XGWA;
+ struct _dbevar
+ {
+ Bool dbuf;
+ Pixmap b, ba, bb;
+ } DB;
+} Flake;
+
+/*
+ *This gets the pixel resource for a color: #ffffff
+ */
+static unsigned int
+FuzzyFlakesColorResource(Flake *flake, char *Color)
+{
+ XColor color;
+
+ if (!XParseColor(flake->dpy, flake->XGWA.colormap, Color, &color))
+ {
+ fprintf(stderr, "%s: can't parse color %s", progname, Color);
+ return 0;
+ }
+ if (!XAllocColor(flake->dpy, flake->XGWA.colormap, &color))
+ {
+ fprintf(stderr, "%s: can't allocate color %s", progname, Color);
+ return 0;
+ }
+ return color.pixel;
+}
+
+/*
+ * This is a great color matching algorithm that I got from
+ * a friend of mine on #vegans@irc.blitzed.org
+ * She wrote it in PHP and I ported it over to C
+ * her site is http://beautifulfreak.net/
+ */
+static int
+FuzzyFlakesColorHelper(Flake *flake)
+{
+ unsigned int iR, iG, iB;
+ unsigned int iR0, iG0, iB0;
+ unsigned int iR1, iG1, iB1;
+ float fR, fG, fB;
+ float Max = 0, Min = 0, Lig, Sat;
+ float Hue, Hue0, Hue1;
+ float f1, f2;
+ float fR0, fG0, fB0;
+ float fR1, fG1, fB1;
+ float nR0, nG0, nB0;
+ float nR1, nG1, nB1;
+ XColor color;
+
+ /* First convert from hex to dec */
+ /* while splitting up the RGB values */
+ if (!XParseColor(flake->dpy, flake->XGWA.colormap,
+ flake->Colors.Back, &color))
+ {
+ fprintf(stderr, "%s: can't parse color %s", progname,
+ flake->Colors.Back);
+ return 1;
+ }
+ iR = color.red >> 8;
+ iG = color.green >> 8;
+ iB = color.blue >> 8;
+
+ /* Convert from int to float */
+ fR = iR;
+ fG = iG;
+ fB = iB;
+
+ /* convert from 0-255 to 0-1 */
+ fR = fR / 255;
+ fG = fG / 255;
+ fB = fB / 255;
+
+ /* work out the lightness */
+ if (fR >= fG && fR >= fB)
+ Max = fR;
+ if (fG >= fR && fG >= fB)
+ Max = fG;
+ if (fB >= fR && fB >= fG)
+ Max = fB;
+
+ if (fR <= fG && fR <= fB)
+ Min = fR;
+ if (fG <= fR && fG <= fB)
+ Min = fG;
+ if (fB <= fR && fB <= fG)
+ Min = fB;
+
+ Lig = (Max + Min) / 2;
+
+ /* work out the saturation */
+ if (Max == Min)
+ Sat = 0;
+ else
+ {
+ if (Lig < 0.5)
+ Sat = (Max - Min) / (Max + Min);
+ else
+ Sat = (Max - Min) / (2 - Max - Min);
+ }
+
+ /*
+ * if our satration is too low we won't be
+ * able to see any objects
+ */
+ if (Sat < 0.03)
+ {
+ return 1;
+ }
+
+ /* work out the hue */
+ if (fR == Max)
+ Hue = (fG - fB) / (Max - Min);
+ else if (fG == Max)
+ Hue = 2 + (fB - fR) / (Max - Min);
+ else
+ Hue = 4 + (fR - fG) / (Max - Min);
+
+ Hue = Hue / 6;
+
+ /* fine two equidistant hues */
+ Hue0 = Hue + N1_3;
+ if (Hue0 > 1)
+ Hue0 = Hue0 - 1;
+ Hue1 = Hue0 + N1_3;
+ if (Hue1 > 1)
+ Hue1 = Hue1 - 1;
+
+ /* convert the colors into hex codes */
+ if (Lig < 0.5)
+ f2 = Lig * (1 + Sat);
+ else
+ f2 = (Lig + Sat) - (Lig * Sat);
+
+ f1 = (2 * Lig) - f2;
+
+ fR0 = (Hue0 + 1) / 3;
+ fR1 = (Hue1 + 1) / 3;
+ fG0 = Hue0;
+ fG1 = Hue1;
+ fB0 = (Hue0 - 1) / 3;
+ fB1 = (Hue1 - 1) / 3;
+
+ if (fR0 < 0)
+ fR0 = fR0 + 1;
+ if (fR0 > 1)
+ fR0 = fR0 - 1;
+ if (fG0 < 0)
+ fG0 = fG0 + 1;
+ if (fG0 > 1)
+ fG0 = fG0 - 1;
+ if (fB0 < 0)
+ fB0 = fB0 + 1;
+ if (fB0 > 1)
+ fB0 = fB0 - 1;
+
+ if (fR1 < 0)
+ fR1 = fR1 + 1;
+ if (fR1 > 1)
+ fR1 = fR1 - 1;
+ if (fG1 < 0)
+ fG1 = fG1 + 1;
+ if (fG1 > 1)
+ fG1 = fG1 - 1;
+ if (fB1 < 0)
+ fB1 = fB1 + 1;
+ if (fB1 > 1)
+ fB1 = fB1 - 1;
+
+ if (6 * fR0 < 1)
+ nR0 = f1 + (f2 - f1) * 6 * fR0;
+ else if (2 * fR0 < 1)
+ nR0 = f2;
+ else if (3 * fR0 < 2)
+ nR0 = f1 + (f2 - f1) * (N2_3 - fR0) * 6;
+ else
+ nR0 = f1;
+
+ if (6 * fG0 < 1)
+ nG0 = f1 + (f2 - f1) * 6 * fG0;
+ else if (2 * fG0 < 1)
+ nG0 = f2;
+ else if (3 * fG0 < 2)
+ nG0 = f1 + (f2 - f1) * (N2_3 - fG0) * 6;
+ else
+ nG0 = f1;
+
+ if (6 * fB0 < 1)
+ nB0 = f1 + (f2 - f1) * 6 * fB0;
+ else if (2 * fB0 < 1)
+ nB0 = f2;
+ else if (3 * fB0 < 2)
+ nB0 = f1 + (f2 - f1) * (N2_3 - fB0) * 6;
+ else
+ nB0 = f1;
+
+ if (6 * fR1 < 1)
+ nR1 = f1 + (f2 - f1) * 6 * fR1;
+ else if (2 * fR1 < 1)
+ nR1 = f2;
+ else if (3 * fR1 < 2)
+ nR1 = f1 + (f2 - f1) * (N2_3 - fR1) * 6;
+ else
+ nR1 = f1;
+
+ if (6 * fG1 < 1)
+ nG1 = f1 + (f2 - f1) * 6 * fG1;
+ else if (2 * fG1 < 1)
+ nG1 = f2;
+ else if (3 * fG1 < 2)
+ nG1 = f1 + (f2 - f1) * (N2_3 - fG1) * 6;
+ else
+ nG1 = f1;
+
+ if (6 * fB1 < 1)
+ nB1 = f1 + (f2 - f1) * 6 * fB1;
+ else if (2 * fB1 < 1)
+ nB1 = f2;
+ else if (3 * fB1 < 2)
+ nB1 = f1 + (f2 - f1) * (N2_3 - fB1) * 6;
+ else
+ nB1 = f1;
+
+ /* at last convert them to a hex string */
+ iR0 = nR0 * 255;
+ iG0 = nG0 * 255;
+ iB0 = nB0 * 255;
+
+ iR1 = nR1 * 255;
+ iG1 = nG1 * 255;
+ iB1 = nB1 * 255;
+
+ flake->Colors.Fore = malloc(sizeof(unsigned char) * 8);
+ flake->Colors.Bord = malloc(sizeof(unsigned char) * 8);
+
+ sprintf(flake->Colors.Fore, "#%02X%02X%02X", iR0, iG0, iB0);
+ sprintf(flake->Colors.Bord, "#%02X%02X%02X", iR1, iG1, iB1);
+
+ return 0;
+}
+
+static void
+FuzzyFlakesInit(Flake *flake)
+{
+ int i, j;
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes(flake->dpy, flake->window, &xgwa);
+ flake->XGWA = xgwa;
+ flake->DB.b = flake->DB.ba = flake->DB.bb = 0;
+ flake->DB.dbuf = get_boolean_resource(flake->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ flake->DB.dbuf = False;
+# endif
+
+ if (flake->DB.dbuf)
+ {
+ flake->DB.ba =
+ XCreatePixmap(flake->dpy, flake->window, xgwa.width, xgwa.height, xgwa.depth);
+ flake->DB.bb =
+ XCreatePixmap(flake->dpy, flake->window, xgwa.width, xgwa.height, xgwa.depth);
+ flake->DB.b = flake->DB.ba;
+ }
+ else
+ {
+ flake->DB.b = flake->window;
+ }
+
+ flake->Arms = get_integer_resource(flake->dpy, "arms", "Integer");
+ flake->Thickness = get_integer_resource(flake->dpy, "thickness", "Integer");
+ flake->BorderThickness = get_integer_resource(flake->dpy, "bthickness", "Integer");
+ flake->Radius = get_integer_resource(flake->dpy, "radius", "Integer");
+
+ flake->Density = get_integer_resource(flake->dpy, "density", "Integer");
+ flake->Layers = get_integer_resource(flake->dpy, "layers", "Integer");
+ flake->FallingSpeed = get_integer_resource(flake->dpy, "fallingspeed", "Integer");
+ flake->Delay = get_integer_resource(flake->dpy, "delay", "Integer");
+ if (flake->RandomColors == True)
+ flake->RandomColors = get_boolean_resource(flake->dpy, "randomColors", "Boolean");
+
+ if (xgwa.width > 2560) { /* Retina displays */
+ flake->Thickness *= 2;
+ flake->BorderThickness *= 2;
+ flake->Radius *= 2;
+ flake->FallingSpeed *= 2;
+ }
+
+ if (flake->Delay < 0)
+ flake->Delay = 0;
+
+ if (!flake->Colors.Back)
+ {
+ flake->Colors.Back = get_string_resource(flake->dpy, "color", "Color");
+ if (!FuzzyFlakesColorResource(flake, flake->Colors.Back))
+ {
+ fprintf(stderr, " reverting to random\n");
+ flake->RandomColors = True;
+ }
+
+ if (flake->RandomColors)
+ {
+ if (flake->Colors.Back)
+ free(flake->Colors.Back);
+ flake->Colors.Back = malloc(sizeof(unsigned char) * 8);
+ sprintf(flake->Colors.Back, "#%X%X%X%X%X%X", random() % 16,
+ random() % 16, random() % 16, random() % 16, random() % 16,
+ random() % 16);
+ }
+
+ /*
+ * Here we establish our colormap based on what is in
+ * flake->Colors.Back
+ */
+ if (FuzzyFlakesColorHelper(flake))
+ {
+ fprintf(stderr, " reverting to random\n");
+ if (flake->Colors.Back)
+ free(flake->Colors.Back);
+ flake->Colors.Back = malloc(sizeof(unsigned char) * 8);
+ sprintf(flake->Colors.Back, "#%X%X%X%X%X%X", random() % 16,
+ random() % 16, random() % 16, random() % 16, random() % 16,
+ random() % 16);
+ FuzzyFlakesColorHelper(flake);
+ }
+
+ flake->ForeColor = FuzzyFlakesColorResource(flake, flake->Colors.Fore);
+ flake->BackColor = FuzzyFlakesColorResource(flake, flake->Colors.Back);
+ flake->BordColor = FuzzyFlakesColorResource(flake, flake->Colors.Bord);
+
+ flake->GCValues.foreground = flake->ForeColor;
+ flake->GCValues.background = flake->BackColor;
+ flake->RandomColors = False;
+ }
+
+ flake->GCValues.line_width = flake->Thickness;
+ flake->GCValues.cap_style = CapProjecting;
+ flake->GCValues.join_style = JoinMiter;
+ flake->GCFlags |= (GCLineWidth | GCCapStyle | GCJoinStyle);
+
+ flake->GCVar =
+ XCreateGC(flake->dpy, flake->window, flake->GCFlags,
+ &flake->GCValues);
+
+ flake->Density = flake->XGWA.width / 200 * flake->Density;
+ flake->Flakes = malloc(sizeof(FlakeVariable **) * flake->Layers);
+ for (i = 1; i <= flake->Layers; i++)
+ {
+ flake->Flakes[i - 1] = malloc(sizeof(FlakeVariable *) * flake->Density);
+ for (j = 0; j < flake->Density; j++)
+ {
+ flake->Flakes[i - 1][j] = malloc(sizeof(FlakeVariable));
+ flake->Flakes[i - 1][j]->XPos = random() % flake->XGWA.width;
+ flake->Flakes[i - 1][j]->YPos = random() % flake->XGWA.height;
+ flake->Flakes[i - 1][j]->Angle = random() % 360 * (M_PI / 180);
+ flake->Flakes[i - 1][j]->Ticks = random() % 360;
+ flake->Flakes[i - 1][j]->XOffset = random() % flake->XGWA.height;
+ }
+ }
+}
+
+static void
+FuzzyFlakesFreeFlake(Flake *flake)
+{
+ int i, j;
+
+ for (i = 1; i <= flake->Layers; i++)
+ {
+ for (j = 0; j < flake->Density; j++)
+ {
+ free(flake->Flakes[i - 1][j]);
+ }
+ free(flake->Flakes[i - 1]);
+ }
+
+ if (flake->DB.bb) XFreePixmap(flake->dpy, flake->DB.bb);
+ if (flake->DB.ba) XFreePixmap(flake->dpy, flake->DB.ba);
+}
+
+static void
+FuzzyFlakesMove(Flake *flake)
+{
+ int i, j;
+
+ for (i = 1; i <= flake->Layers; i++)
+ {
+ for (j = 0; j < flake->Density; j++)
+ {
+ FlakeVariable *FlakeVar;
+
+ FlakeVar = flake->Flakes[i - 1][j];
+ FlakeVar->Ticks++;
+ FlakeVar->YPos =
+ FlakeVar->YPos + ((double)flake->FallingSpeed) / 10 / i;
+ FlakeVar->TrueX =
+ (sin
+ (FlakeVar->XOffset +
+ FlakeVar->Ticks * (M_PI / 180) * ((double)flake->FallingSpeed /
+ 10))) * 10 + FlakeVar->XPos;
+ FlakeVar->Angle =
+ FlakeVar->Angle + 0.005 * ((double)flake->FallingSpeed / 10);
+ if (FlakeVar->YPos - flake->Radius > flake->XGWA.height)
+ {
+ FlakeVar->Ticks = 0;
+ FlakeVar->YPos = 0 - flake->Radius;
+ }
+ }
+ }
+}
+
+static void
+FuzzyFlakesDrawFlake(Flake *flake, int XPos, int YPos, double AngleOffset, int Layer)
+{
+ int i;
+ double x, y, Angle, Radius;
+
+ /* calculate the shrink factor debending on which layer we are drawing atm */
+ Radius = (double)(flake->Radius - Layer * 5);
+ /* draw the flake one arm at a time */
+ for (i = 1; i <= flake->Arms; i++)
+ {
+ int Diameter;
+
+ Diameter = (flake->BorderThickness * 2 + flake->Thickness) / Layer;
+ /* compute the angle of this arm of the flake */
+ Angle = ((2 * M_PI) / flake->Arms) * i + AngleOffset;
+ /* calculate the x and y dispositions for this arm */
+ y = (int)(sin(Angle) * Radius);
+ x = (int)(cos(Angle) * Radius);
+ /* draw the base for the arm */
+ flake->GCValues.line_width = Diameter;
+ XFreeGC(flake->dpy, flake->GCVar);
+ flake->GCVar =
+ XCreateGC(flake->dpy, flake->DB.b, flake->GCFlags,
+ &flake->GCValues);
+ XSetForeground(flake->dpy, flake->GCVar, flake->BordColor);
+ XDrawLine(flake->dpy, flake->DB.b, flake->GCVar, XPos, YPos,
+ XPos + x, YPos + y);
+ }
+ /* draw the flake one arm at a time */
+ for (i = 1; i <= flake->Arms; i++)
+ {
+ /* compute the angle of this arm of the flake */
+ Angle = ((2 * M_PI) / flake->Arms) * i + AngleOffset;
+ /* calculate the x and y dispositions for this arm */
+ y = (int)(sin(Angle) * Radius);
+ x = (int)(cos(Angle) * Radius);
+ /* draw the inside of the arm */
+ flake->GCValues.line_width = flake->Thickness / Layer;
+ XFreeGC(flake->dpy, flake->GCVar);
+ flake->GCVar =
+ XCreateGC(flake->dpy, flake->DB.b, flake->GCFlags,
+ &flake->GCValues);
+ XSetForeground(flake->dpy, flake->GCVar, flake->ForeColor);
+ XDrawLine(flake->dpy, flake->DB.b, flake->GCVar, XPos, YPos,
+ XPos + x, YPos + y);
+ }
+}
+
+static void
+FuzzyFlakes(Flake *flake)
+{
+ int i, j;
+
+ FuzzyFlakesMove(flake);
+ XSetForeground(flake->dpy, flake->GCVar, flake->BackColor);
+ XFillRectangle(flake->dpy, flake->DB.b, flake->GCVar, 0, 0,
+ flake->XGWA.width, flake->XGWA.height);
+ for (i = flake->Layers; i >= 1; i--)
+ {
+ for (j = 0; j < flake->Density; j++)
+ {
+ FuzzyFlakesDrawFlake(flake,
+ flake->Flakes[i - 1][j]->TrueX,
+ flake->Flakes[i - 1][j]->YPos,
+ flake->Flakes[i - 1][j]->Angle, i);
+ }
+ }
+
+}
+
+static void *
+fuzzyflakes_init (Display *dpy, Window window)
+{
+ Flake *flake = (Flake *) calloc (1, sizeof(*flake));
+ flake->dpy = dpy;
+ flake->window = window;
+
+ /* This is needed even if it is going to be set to false */
+ flake->RandomColors = True;
+
+ /* set up our colors amoung many other things */
+ FuzzyFlakesInit(flake);
+
+ return flake;
+}
+
+static unsigned long
+fuzzyflakes_draw (Display *dpy, Window window, void *closure)
+{
+ Flake *flake = (Flake *) closure;
+
+ FuzzyFlakes(flake);
+ if (flake->DB.dbuf)
+ {
+ XCopyArea(flake->dpy, flake->DB.b, flake->window,
+ flake->GCVar, 0, 0, flake->XGWA.width, flake->XGWA.height,
+ 0, 0);
+ flake->DB.b =
+ (flake->DB.b == flake->DB.ba ? flake->DB.bb : flake->DB.ba);
+ }
+
+ return flake->Delay;
+}
+
+static void
+fuzzyflakes_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ Flake *flake = (Flake *) closure;
+
+ if (flake->XGWA.width != w || flake->XGWA.height != h)
+ {
+ FuzzyFlakesFreeFlake(flake);
+ FuzzyFlakesInit(flake);
+ }
+}
+
+static Bool
+fuzzyflakes_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+fuzzyflakes_free (Display *dpy, Window window, void *closure)
+{
+ Flake *flake = (Flake *) closure;
+ FuzzyFlakesFreeFlake(flake);
+ free(flake);
+}
+
+
+static const char *fuzzyflakes_defaults[] = {
+ "*color: #efbea5",
+ "*arms: 5",
+ "*thickness: 10",
+ "*bthickness: 3",
+ "*radius: 20",
+ "*layers: 3",
+ "*density: 5",
+ "*fallingspeed: 10",
+ "*delay: 10000",
+ "*doubleBuffer: True",
+ "*randomColors: False",
+ 0
+};
+
+static XrmOptionDescRec fuzzyflakes_options[] = {
+ { "-color", ".color", XrmoptionSepArg, 0},
+ { "-arms", ".arms", XrmoptionSepArg, 0},
+ { "-thickness", ".thickness", XrmoptionSepArg, 0},
+ { "-bthickness", ".bthickness", XrmoptionSepArg, 0},
+ { "-radius", ".radius", XrmoptionSepArg, 0},
+ { "-layers", ".layers", XrmoptionSepArg, 0},
+ { "-density", ".density", XrmoptionSepArg, 0},
+ { "-speed", ".fallingspeed", XrmoptionSepArg, 0},
+ { "-delay", ".delay", XrmoptionSepArg, 0},
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True"},
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False"},
+ { "-random-colors", ".randomColors", XrmoptionNoArg, "True"},
+ { 0, 0, 0, 0}
+};
+
+
+XSCREENSAVER_MODULE ("FuzzyFlakes", fuzzyflakes)
diff --git a/hacks/fuzzyflakes.man b/hacks/fuzzyflakes.man
new file mode 100644
index 0000000..22222bd
--- /dev/null
+++ b/hacks/fuzzyflakes.man
@@ -0,0 +1,112 @@
+.TH XScreenSaver 1 "12-May-04" "X Version 11"
+.SH NAME
+fuzzyflakes - falling snowflakes/flower shapes
+.SH SYNOPSIS
+.B fuzzyflakes
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIint\fP]
+[\-arms \fIint\fP]
+[\-thickness \fIint\fP]
+[\-bthickness \fIint\fP]
+[\-radius \fIint\fP]
+[\-layers \fIint\fP]
+[\-density \fIint\fP]
+[\-no-db]
+(\-color \fIstring\fP)
+(\-random-colors)
+[\-fps]
+.SH DESCRIPTION
+The
+.I fuzzyflakes
+program draws falling pastel colored snowflake/flower shapes.
+Inspired by the credits of the anime "Azumanga Daioh".
+.SH OPTIONS
+.I fuzzyflakes
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation, in microseconds. Default: 250000.
+.TP 8
+.B \-speed \fIint\fP
+How fast, 1-50. Default 10.
+.TP 8
+.B \-arms \fIint\fP
+How many arms on the flakes; default 5.
+.TP 8
+.B \-thickness \fIint\fP
+How thick to make the lines; default 10 pixels.
+.TP 8
+.B \-bthickness \fIint\fP
+How thick to make the borders; default 3 pixels.
+.TP 8
+.B \-radius \fIint\fP
+Radius of the objects; default 20 pixels.
+.TP 8
+.B \-layers \fIint\fP
+How many layers of objects; default 3.
+.TP 8
+.B \-density \fIint\fP
+Default 5.
+.TP 8
+.B \-no-db
+Disable double-buffering.
+.TP 8
+.B \-color \fIstring\fP
+The base color for the color scheme. Typed as a hexadecimal triplet
+with or with out the leading #. ie. fa4563 & #43cd12 are both acceptable.
+If the saturation of you color is too low (<0.03) the random color
+generator will kick in.
+The default color is #efbea5
+.TP 8
+.B \-random-colors
+This enables the random color generation. It is disabled by default.
+It overrides anything from -color
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 Barry Dmytro. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any
+purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Barry Dmytro <badcherry@mailc.net>
+.SH CREDITS
+The color generation algorithm was borrowed from a friend <ZoeB>
+from #vegans@irc.blitzed.org. Her site was [REDACTED].
+To see her original code in action visit her site.
diff --git a/hacks/galaxy.c b/hacks/galaxy.c
new file mode 100644
index 0000000..3a6e1f7
--- /dev/null
+++ b/hacks/galaxy.c
@@ -0,0 +1,451 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* galaxy --- spinning galaxies */
+/* #include<math.h>*/
+#if 0
+static const char sccsid[] = "@(#)galaxy.c 4.04 97/07/28 xlockmore";
+#endif
+
+/* Originally done by Uli Siegmund <uli@wombat.okapi.sub.org> on Amiga
+ * for EGS in Cluster
+ * Port from Cluster/EGS to C/Intuition by Harald Backert
+ * Port to X11 and incorporation into xlockmore by Hubert Feyrer
+ * <hubert.feyrer@rz.uni-regensburg.de>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 26-Aug-00: robert.nagtegaal@phil.uu.nl and roland@tschai.demon.nl:
+ * various improvements
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 18-Apr-97: Memory leak fixed by Tom Schmidt <tschmidt@micron.com>
+ * 07-Apr-97: Modified by Dave Mitchell <davem@magnet.com>
+ * 23-Oct-94: Modified by David Bagley <bagleyd@bigfoot.com>
+ * random star sizes
+ * colors change depending on velocity
+ * 10-Oct-94: Add colors by Hubert Feyer
+ * 30-Sep-94: Initial port by Hubert Feyer
+ * 09-Mar-94: VMS can generate a random number 0.0 which results in a
+ * division by zero, corrected by Jouk Jansen
+ * <joukj@crys.chem.uva.nl>
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 20000 \n" \
+ "*count: -5 \n" \
+ "*cycles: 250 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ "*lowrez: True \n" \
+
+# define UNIFORM_COLORS
+# define release_galaxy 0
+# define reshape_galaxy 0
+# define galaxy_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+static Bool tracks;
+static Bool spin;
+static Bool dbufp;
+
+#define DEF_TRACKS "True"
+#define DEF_SPIN "True"
+#define DEF_DBUF "True"
+
+static XrmOptionDescRec opts[] =
+{
+ {"-tracks", ".galaxy.tracks", XrmoptionNoArg, "on"},
+ {"+tracks", ".galaxy.tracks", XrmoptionNoArg, "off"},
+ {"-spin", ".galaxy.spin", XrmoptionNoArg, "on"},
+ {"+spin", ".galaxy.spin", XrmoptionNoArg, "off"},
+ {"-dbuf", ".galaxy.dbuf", XrmoptionNoArg, "on"},
+ {"+dbuf", ".galaxy.dbuf", XrmoptionNoArg, "off"},
+};
+
+static argtype vars[] =
+{
+ {&tracks, "tracks", "Tracks", DEF_TRACKS, t_Bool},
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&dbufp, "dbuf", "Dbuf", DEF_DBUF, t_Bool},
+};
+
+static OptionStruct desc[] =
+{
+ {"-/+tracks", "turn on/off star tracks"},
+ {"-/+spin", "do/don't spin viewpoint"},
+ {"-/+dbuf", "turn on/off double buffering."},
+};
+
+ENTRYPOINT ModeSpecOpt galaxy_opts =
+{sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc};
+
+
+#define FLOATRAND ((double) LRAND() / ((double) MAXRAND))
+
+#if 0
+#define WRAP 1 /* Warp around edges */
+#define BOUNCE 1 /* Bounce from borders */
+#endif
+
+#define MINSIZE 1
+#define MINGALAXIES 2
+#define MAX_STARS 3000
+#define MAX_IDELTAT 50
+/* These come originally from the Cluster-version */
+#define DEFAULT_GALAXIES 3
+#define DEFAULT_STARS 1000
+#define DEFAULT_HITITERATIONS 7500
+#define DEFAULT_IDELTAT 200 /* 0.02 */
+#define EPSILON 0.00000001
+
+#define sqrt_EPSILON 0.0001
+
+#define DELTAT (MAX_IDELTAT * 0.0001)
+
+#define GALAXYRANGESIZE 0.1
+#define GALAXYMINSIZE 0.15
+#define QCONS 0.001
+
+
+#define COLORBASE 16
+/* colors per galaxy */
+/* #define COLORSTEP (NUMCOLORS/COLORBASE) */
+# define COLORSTEP (MI_NCOLORS(mi)/COLORBASE)
+
+
+typedef struct {
+ double pos[3], vel[3];
+} Star;
+
+
+typedef struct {
+ int mass;
+ int nstars;
+ Star *stars;
+ XPoint *oldpoints;
+ XPoint *newpoints;
+ double pos[3], vel[3];
+ int galcol;
+} Galaxy;
+
+typedef struct {
+ double mat[3][3]; /* Movement of stars(?) */
+ double scale; /* Scale */
+ int midx; /* Middle of screen, x */
+ int midy; /* Middle of screen, y */
+ double size; /* */
+ double diff[3]; /* */
+ Galaxy *galaxies; /* the Whole Universe */
+ int ngalaxies; /* # galaxies */
+ int f_hititerations; /* # iterations before restart */
+ int step; /* */
+ double rot_y; /* rotation of eye around center of universe, around
+y-axis*/
+ double rot_x; /* rotation of eye around center of universe, around
+x-axis */
+} unistruct;
+
+static unistruct *universes = NULL;
+
+ENTRYPOINT void
+free_galaxy(ModeInfo * mi)
+{
+ unistruct *gp = &universes[MI_SCREEN(mi)];
+ if (gp->galaxies != NULL) {
+ int i;
+
+ for (i = 0; i < gp->ngalaxies; i++) {
+ Galaxy *gt = &gp->galaxies[i];
+
+ if (gt->stars != NULL)
+ (void) free((void *) gt->stars);
+ if (gt->oldpoints != NULL)
+ (void) free((void *) gt->oldpoints);
+ if (gt->newpoints != NULL)
+ (void) free((void *) gt->newpoints);
+ }
+ (void) free((void *) gp->galaxies);
+ gp->galaxies = NULL;
+ }
+}
+
+static void
+startover(ModeInfo * mi)
+{
+ unistruct *gp = &universes[MI_SCREEN(mi)];
+ int i, j; /* more tmp */
+ double w1, w2; /* more tmp */
+ double d, v, w, h; /* yet more tmp */
+
+ gp->step = 0;
+ gp->rot_y = 0;
+ gp->rot_x = 0;
+
+ if (MI_BATCHCOUNT(mi) < -MINGALAXIES)
+ free_galaxy(mi);
+ gp->ngalaxies = MI_BATCHCOUNT(mi);
+ if (gp->ngalaxies < -MINGALAXIES)
+ gp->ngalaxies = NRAND(-gp->ngalaxies - MINGALAXIES + 1) + MINGALAXIES;
+
+ else if (gp->ngalaxies < MINGALAXIES)
+ gp->ngalaxies = MINGALAXIES;
+ if (gp->galaxies == NULL)
+ gp->galaxies = (Galaxy *) calloc(gp->ngalaxies, sizeof (Galaxy));
+
+ for (i = 0; i < gp->ngalaxies; ++i) {
+ Galaxy *gt = &gp->galaxies[i];
+ double sinw1, sinw2, cosw1, cosw2;
+
+ gt->galcol = NRAND(COLORBASE - 2);
+ if (gt->galcol > 1)
+ gt->galcol += 2; /* Mult 8; 16..31 no green stars */
+ /* Galaxies still may have some green stars but are not all green. */
+
+ if (gt->stars != NULL) {
+ (void) free((void *) gt->stars);
+ gt->stars = NULL;
+ }
+ gt->nstars = (NRAND(MAX_STARS / 2)) + MAX_STARS / 2;
+ gt->stars = (Star *) malloc(gt->nstars * sizeof (Star));
+ gt->oldpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint));
+ gt->newpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint));
+
+ w1 = 2.0 * M_PI * FLOATRAND;
+ w2 = 2.0 * M_PI * FLOATRAND;
+ sinw1 = SINF(w1);
+ sinw2 = SINF(w2);
+ cosw1 = COSF(w1);
+ cosw2 = COSF(w2);
+
+ gp->mat[0][0] = cosw2;
+ gp->mat[0][1] = -sinw1 * sinw2;
+ gp->mat[0][2] = cosw1 * sinw2;
+ gp->mat[1][0] = 0.0;
+ gp->mat[1][1] = cosw1;
+ gp->mat[1][2] = sinw1;
+ gp->mat[2][0] = -sinw2;
+ gp->mat[2][1] = -sinw1 * cosw2;
+ gp->mat[2][2] = cosw1 * cosw2;
+
+ gt->vel[0] = FLOATRAND * 2.0 - 1.0;
+ gt->vel[1] = FLOATRAND * 2.0 - 1.0;
+ gt->vel[2] = FLOATRAND * 2.0 - 1.0;
+ gt->pos[0] = -gt->vel[0] * DELTAT * gp->f_hititerations + FLOATRAND -
+0.5;
+ gt->pos[1] = -gt->vel[1] * DELTAT * gp->f_hititerations + FLOATRAND -
+0.5;
+ gt->pos[2] = -gt->vel[2] * DELTAT * gp->f_hititerations + FLOATRAND -
+0.5;
+
+ gt->mass = (int) (FLOATRAND * 1000.0) + 1;
+
+ gp->size = GALAXYRANGESIZE * FLOATRAND + GALAXYMINSIZE;
+
+ for (j = 0; j < gt->nstars; ++j) {
+ Star *st = &gt->stars[j];
+ XPoint *oldp = &gt->oldpoints[j];
+ XPoint *newp = &gt->newpoints[j];
+
+ double sinw, cosw;
+
+ w = 2.0 * M_PI * FLOATRAND;
+ sinw = SINF(w);
+ cosw = COSF(w);
+ d = FLOATRAND * gp->size;
+ h = FLOATRAND * exp(-2.0 * (d / gp->size)) / 5.0 * gp->size;
+ if (FLOATRAND < 0.5)
+ h = -h;
+ st->pos[0] = gp->mat[0][0] * d * cosw + gp->mat[1][0] * d * sinw +
+gp->mat[2][0] * h + gt->pos[0];
+ st->pos[1] = gp->mat[0][1] * d * cosw + gp->mat[1][1] * d * sinw +
+gp->mat[2][1] * h + gt->pos[1];
+ st->pos[2] = gp->mat[0][2] * d * cosw + gp->mat[1][2] * d * sinw +
+gp->mat[2][2] * h + gt->pos[2];
+
+ v = sqrt(gt->mass * QCONS / sqrt(d * d + h * h));
+ st->vel[0] = -gp->mat[0][0] * v * sinw + gp->mat[1][0] * v * cosw +
+gt->vel[0];
+ st->vel[1] = -gp->mat[0][1] * v * sinw + gp->mat[1][1] * v * cosw +
+gt->vel[1];
+ st->vel[2] = -gp->mat[0][2] * v * sinw + gp->mat[1][2] * v * cosw +
+gt->vel[2];
+
+ st->vel[0] *= DELTAT;
+ st->vel[1] *= DELTAT;
+ st->vel[2] *= DELTAT;
+
+ oldp->x = 0;
+ oldp->y = 0;
+ newp->x = 0;
+ newp->y = 0;
+ }
+
+ }
+
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+#if 0
+ (void) printf("ngalaxies=%d, f_hititerations=%d\n", gp->ngalaxies,
+gp->f_hititerations);
+ (void) printf("f_deltat=%g\n", DELTAT);
+ (void) printf("Screen: ");
+#endif /*0 */
+}
+
+ENTRYPOINT void
+init_galaxy(ModeInfo * mi)
+{
+ unistruct *gp;
+
+ MI_INIT (mi, universes);
+ gp = &universes[MI_SCREEN(mi)];
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ dbufp = False;
+# endif
+
+ gp->f_hititerations = MI_CYCLES(mi);
+
+ gp->scale = (double) (MI_WIN_WIDTH(mi) + MI_WIN_HEIGHT(mi)) / 8.0;
+ gp->midx = MI_WIN_WIDTH(mi) / 2;
+ gp->midy = MI_WIN_HEIGHT(mi) / 2;
+ startover(mi);
+}
+
+ENTRYPOINT void
+draw_galaxy(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ unistruct *gp = &universes[MI_SCREEN(mi)];
+ double d, eps, cox, six, cor, sir; /* tmp */
+ int i, j, k; /* more tmp */
+ XPoint *dummy = NULL;
+
+ if (! dbufp)
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ if(spin){
+ gp->rot_y += 0.01;
+ gp->rot_x += 0.004;
+ }
+
+ cox = COSF(gp->rot_y);
+ six = SINF(gp->rot_y);
+ cor = COSF(gp->rot_x);
+ sir = SINF(gp->rot_x);
+
+ eps = 1/(EPSILON * sqrt_EPSILON * DELTAT * DELTAT * QCONS);
+
+ for (i = 0; i < gp->ngalaxies; ++i) {
+ Galaxy *gt = &gp->galaxies[i];
+
+ for (j = 0; j < gp->galaxies[i].nstars; ++j) {
+ Star *st = &gt->stars[j];
+ XPoint *newp = &gt->newpoints[j];
+ double v0 = st->vel[0];
+ double v1 = st->vel[1];
+ double v2 = st->vel[2];
+
+ for (k = 0; k < gp->ngalaxies; ++k) {
+ Galaxy *gtk = &gp->galaxies[k];
+ double d0 = gtk->pos[0] - st->pos[0];
+ double d1 = gtk->pos[1] - st->pos[1];
+ double d2 = gtk->pos[2] - st->pos[2];
+
+ d = d0 * d0 + d1 * d1 + d2 * d2;
+ if (d > EPSILON)
+ d = gtk->mass / (d * sqrt(d)) * DELTAT * DELTAT * QCONS;
+ else
+ d = gtk->mass / (eps * sqrt(eps));
+ v0 += d0 * d;
+ v1 += d1 * d;
+ v2 += d2 * d;
+ }
+
+ st->vel[0] = v0;
+ st->vel[1] = v1;
+ st->vel[2] = v2;
+
+ st->pos[0] += v0;
+ st->pos[1] += v1;
+ st->pos[2] += v2;
+
+ newp->x = (short) (((cox * st->pos[0]) - (six * st->pos[2])) *
+ gp->scale) + gp->midx;
+ newp->y = (short) (((cor * st->pos[1]) - (sir * ((six * st->pos[0]) +
+ (cox * st->pos[2]))))
+ * gp->scale) + gp->midy;
+
+ }
+
+ for (k = i + 1; k < gp->ngalaxies; ++k) {
+ Galaxy *gtk = &gp->galaxies[k];
+ double d0 = gtk->pos[0] - gt->pos[0];
+ double d1 = gtk->pos[1] - gt->pos[1];
+ double d2 = gtk->pos[2] - gt->pos[2];
+
+ d = d0 * d0 + d1 * d1 + d2 * d2;
+ if (d > EPSILON)
+ d = 1 / (d * sqrt(d)) * DELTAT * QCONS;
+ else
+ d = 1 / (EPSILON * sqrt_EPSILON) * DELTAT * QCONS;
+
+ d0 *= d;
+ d1 *= d;
+ d2 *= d;
+ gt->vel[0] += d0 * gtk->mass;
+ gt->vel[1] += d1 * gtk->mass;
+ gt->vel[2] += d2 * gtk->mass;
+ gtk->vel[0] -= d0 * gt->mass;
+ gtk->vel[1] -= d1 * gt->mass;
+ gtk->vel[2] -= d2 * gt->mass;
+ }
+
+ gt->pos[0] += gt->vel[0] * DELTAT;
+ gt->pos[1] += gt->vel[1] * DELTAT;
+ gt->pos[2] += gt->vel[2] * DELTAT;
+
+ if (dbufp) {
+ XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+ XDrawPoints(display, window, gc, gt->oldpoints, gt->nstars,
+ CoordModeOrigin);
+ }
+ XSetForeground(display, gc, MI_PIXEL(mi, COLORSTEP * gt->galcol));
+ XDrawPoints(display, window, gc, gt->newpoints, gt->nstars,
+ CoordModeOrigin);
+
+ dummy = gt->oldpoints;
+ gt->oldpoints = gt->newpoints;
+ gt->newpoints = dummy;
+ }
+
+ gp->step++;
+ if (gp->step > gp->f_hititerations * 4)
+ startover(mi);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_galaxy(ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Galaxy", galaxy)
diff --git a/hacks/galaxy.man b/hacks/galaxy.man
new file mode 100644
index 0000000..1a2a79d
--- /dev/null
+++ b/hacks/galaxy.man
@@ -0,0 +1,87 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+galaxy - draws spinning galaxies
+.SH SYNOPSIS
+.B galaxy
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP] [\-tracks] [\-no\-tracks] [\-spin] [\-no\-spin]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIgalaxy\fP program draws spinning galaxies.
+.SH OPTIONS
+.I galaxy
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+.TP 8
+.B \-count \fIinteger\fP
+.TP 8
+.B \-size \fIinteger\fP
+.TP 8
+.B \-tracks
+.TP 8
+.B \-no\-tracks
+.TP 8
+.B \-spin
+.TP 8
+.B \-no\-spin
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1994 by Hubert Feyrer.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Original Amiga version by Uli Siegmund <uli@wombat.okapi.sub.org>
+ for EGS in Cluster.
+
+Ported from Cluster/EGS to C/Intuition by Harald Backert.
+
+Ported to X11 and xlockmore by
+Hubert Feyrer <hubert.feyrer@rz.uni-regensburg.de>, 30-Sep-94.
+
+Modified by David Bagley <bagleyd@bigfoot.com>, 23-Oct-94.
+
+Modified by Dave Mitchell <davem@magnet.com>, 7-Apr-97.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/glitchpeg.c b/hacks/glitchpeg.c
new file mode 100644
index 0000000..4f3b052
--- /dev/null
+++ b/hacks/glitchpeg.c
@@ -0,0 +1,440 @@
+/* glitchpeg, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Insert errors into an image file, then display the corrupted result.
+ *
+ * This only works on X11 and MacOS because iOS and Android don't have
+ * access to the source files of images, only the decoded image data.
+ */
+
+#include "screenhack.h"
+#include "ximage-loader.h"
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h> /* for XtInputId, etc */
+#endif
+
+#include <sys/stat.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+struct state {
+ Display *dpy;
+ Window window;
+ GC gc;
+ XWindowAttributes xgwa;
+ int delay;
+ int count;
+ int duration;
+ time_t start_time;
+ unsigned char *image_data; unsigned long image_size;
+ XtInputId pipe_id;
+ FILE *pipe;
+ Bool button_down_p;
+};
+
+
+static Bool
+bigendian (void)
+{
+ union { int i; char c[sizeof(int)]; } u;
+ u.i = 1;
+ return !u.c[0];
+}
+
+
+/* Given a bitmask, returns the position and width of the field.
+ Duplicated from ximage-loader.c.
+ */
+static void
+decode_mask (unsigned long mask, unsigned long *pos_ret,
+ unsigned long *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+/* Renders a scaled, cropped version of the RGBA XImage onto the window.
+ */
+static void
+draw_image (Display *dpy, Window window, Visual *v, GC gc,
+ int w, int h, int depth, XImage *in)
+{
+ XImage *out;
+ int x, y, w2, h2, xoff, yoff;
+ double xs, ys, s;
+
+ unsigned long crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+ unsigned long srpos=0, sgpos=0, sbpos=0;
+ unsigned long srmsk=0, sgmsk=0, sbmsk=0;
+ unsigned long srsiz=0, sgsiz=0, sbsiz=0;
+
+# ifdef HAVE_JWXYZ
+ // BlackPixel has alpha: 0xFF000000.
+ unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
+#else
+ unsigned long black = 0;
+# endif
+
+ xs = in->width / (double) w;
+ ys = in->height / (double) h;
+ s = (xs > ys ? ys : xs);
+ w2 = in->width / s;
+ h2 = in->height / s;
+ xoff = (w - w2) / 2;
+ yoff = (h - h2) / 2;
+
+ /* Create a new image in the depth and bit-order of the server. */
+ out = XCreateImage (dpy, v, depth, ZPixmap, 0, 0, w, h, 8, 0);
+ out->bitmap_bit_order = in->bitmap_bit_order;
+ out->byte_order = in->byte_order;
+
+ out->bitmap_bit_order = BitmapBitOrder (dpy);
+ out->byte_order = ImageByteOrder (dpy);
+
+ out->data = (char *) malloc (out->height * out->bytes_per_line);
+ if (!out->data) abort();
+
+ /* Find the server's color masks.
+ We could cache this and just do it once, but it's a small number
+ of instructions compared to the per-pixel operations happening next.
+ */
+ srmsk = out->red_mask;
+ sgmsk = out->green_mask;
+ sbmsk = out->blue_mask;
+
+ if (!(srmsk && sgmsk && sbmsk)) abort(); /* No server color masks? */
+
+ decode_mask (srmsk, &srpos, &srsiz);
+ decode_mask (sgmsk, &sgpos, &sgsiz);
+ decode_mask (sbmsk, &sbpos, &sbsiz);
+
+ /* 'in' is RGBA in client endianness. Convert to what the server wants. */
+ if (bigendian())
+ crpos = 24, cgpos = 16, cbpos = 8, capos = 0;
+ else
+ crpos = 0, cgpos = 8, cbpos = 16, capos = 24;
+
+ /* Iterate the destination rectangle and pull in the corresponding
+ scaled and cropped source pixel, or black. Nearest-neighbor is fine.
+ */
+ for (y = 0; y < out->height; y++)
+ {
+ int iy = (out->height - y - yoff - 1) * s;
+ for (x = 0; x < out->width; x++)
+ {
+ int ix = (x - xoff) * s;
+ unsigned long p = (ix >= 0 && ix < in->width &&
+ iy >= 0 && iy < in->height
+ ? XGetPixel (in, ix, iy)
+ : black);
+ /* unsigned char a = (p >> capos) & 0xFF; */
+ unsigned char b = (p >> cbpos) & 0xFF;
+ unsigned char g = (p >> cgpos) & 0xFF;
+ unsigned char r = (p >> crpos) & 0xFF;
+ XPutPixel (out, x, y, ((r << srpos) |
+ (g << sgpos) |
+ (b << sbpos) |
+ black));
+ }
+ }
+
+ XPutImage (dpy, window, gc, out, 0, 0, 0, 0, out->width, out->height);
+ XDestroyImage (out);
+}
+
+
+# define BACKSLASH(c) \
+ (! ((c >= 'a' && c <= 'z') || \
+ (c >= 'A' && c <= 'Z') || \
+ (c >= '0' && c <= '9') || \
+ c == '.' || c == '_' || c == '-' || c == '+' || c == '/'))
+
+/* Gets the name of an image file to load by running xscreensaver-getimage-file
+ at the end of a pipe. This can be very slow!
+ Duplicated from utils/grabclient.c
+ */
+static FILE *
+open_image_name_pipe (void)
+{
+ char *s;
+
+ /* /bin/sh on OS X 10.10 wipes out the PATH. */
+ const char *path = getenv("PATH");
+ char *cmd = s = malloc (strlen(path) * 2 + 100);
+ strcpy (s, "/bin/sh -c 'export PATH=");
+ s += strlen (s);
+ while (*path) {
+ char c = *path++;
+ if (BACKSLASH(c)) *s++ = '\\';
+ *s++ = c;
+ }
+ strcpy (s, "; ");
+ s += strlen (s);
+
+ strcpy (s, "xscreensaver-getimage-file --name --absolute");
+ s += strlen (s);
+
+ strcpy (s, "'");
+ s += strlen (s);
+
+ *s = 0;
+
+ FILE *pipe = popen (cmd, "r");
+ free (cmd);
+ return pipe;
+}
+
+
+/* Duplicated from utils/grabclient.c */
+static void
+xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
+{
+ /* This is not called from a signal handler, so doing stuff here is fine.
+ */
+ struct state *st = (struct state *) closure;
+ char buf[10240];
+ char *file = buf;
+ FILE *fp;
+ struct stat stat;
+ int n;
+ unsigned char *s;
+ int L;
+
+ *buf = 0;
+ fgets (buf, sizeof(buf)-1, st->pipe);
+ pclose (st->pipe);
+ st->pipe = 0;
+ XtRemoveInput (st->pipe_id);
+ st->pipe_id = 0;
+
+ /* strip trailing newline */
+ L = strlen(buf);
+ while (L > 0 && (buf[L-1] == '\r' || buf[L-1] == '\n'))
+ buf[--L] = 0;
+
+ fp = fopen (file, "r");
+ if (! fp)
+ {
+ fprintf (stderr, "%s: unable to read %s\n", progname, file);
+ return;
+ }
+
+ if (fstat (fileno (fp), &stat))
+ {
+ fprintf (stderr, "%s: %s: stat failed\n", progname, file);
+ return;
+ }
+
+ if (st->image_data) free (st->image_data);
+ st->image_size = stat.st_size;
+ st->image_data = malloc (st->image_size);
+
+ s = st->image_data;
+ do {
+ n = fread (s, 1, st->image_data + st->image_size - s, fp);
+ if (n > 0) s += n;
+ } while (n > 0);
+
+ fclose (fp);
+
+ /* fprintf (stderr, "loaded %s (%lu)\n", file, st->image_size); */
+
+ st->start_time = time((time_t *) 0);
+}
+
+
+static void *
+glitchpeg_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->gc = XCreateGC (dpy, window, 0, &gcv);
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 1) st->delay = 1;
+
+ st->duration = get_integer_resource (st->dpy, "duration", "Integer");
+ if (st->duration < 0) st->duration = 0;
+
+ st->count = get_integer_resource (st->dpy, "count", "Integer");
+ if (st->count < 1) st->count = 1;
+
+ XClearWindow (st->dpy, st->window);
+
+ return st;
+}
+
+
+static unsigned long
+glitchpeg_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if ((!st->image_data ||
+ time((time_t *) 0) >= st->start_time + st->duration) &&
+ !st->pipe)
+ {
+ /* Time to reload */
+ st->pipe = open_image_name_pipe();
+ st->pipe_id =
+ XtAppAddInput (XtDisplayToApplicationContext (dpy),
+ fileno (st->pipe),
+ (XtPointer) (XtInputReadMask | XtInputExceptMask),
+ xscreensaver_getimage_file_cb, (XtPointer) st);
+ }
+
+ if (st->image_data && !st->button_down_p)
+ {
+ int n;
+ XImage *image;
+ unsigned char *glitched = malloc (st->image_size);
+ int nn = random() % st->count;
+ if (nn <= 0) nn = 1;
+
+ memcpy (glitched, st->image_data, st->image_size);
+
+ for (n = 0; n < nn; n++)
+ {
+ int start = 255;
+ int end = st->image_size - 255;
+ int size = end - start;
+ Bool byte_p = True; /* random() % 100; */
+ if (size <= 100) break;
+ if (byte_p)
+ {
+ int i = start + (random() % size);
+ if (!(random() % 10))
+ /* Take one random byte and randomize it. */
+ glitched[i] = random() % 0xFF;
+ else
+ /* Take one random byte and add 5% to it. */
+ glitched[i] +=
+ (1 + (random() % 0x0C)) * ((random() & 1) ? 1 : -1);
+ }
+ else
+ {
+ /* Take two randomly-sized chunks of the file and swap them.
+ This tends to just destroy the image. Doesn't look good. */
+ int s2 = 2 + size * 0.05;
+ char *swap = malloc (s2);
+ int start1 = start + (random() % (size - s2));
+ int start2 = start + (random() % (size - s2));
+ memcpy (glitched + start1, swap, s2);
+ memmove (glitched + start2, glitched + start1, s2);
+ memcpy (swap, glitched + start2, s2);
+ free (swap);
+ }
+ }
+
+ image = image_data_to_ximage (dpy, st->xgwa.visual,
+ glitched, st->image_size);
+ free (glitched);
+
+ if (image) /* Might be null if decode fails */
+ {
+ draw_image (dpy, window, st->xgwa.visual, st->gc,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth,
+ image);
+ XDestroyImage (image);
+ }
+ }
+
+ return st->delay;
+}
+
+
+static void
+glitchpeg_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+
+static Bool
+glitchpeg_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->xany.type == ButtonPress)
+ {
+ st->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ st->button_down_p = False;
+ return True;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0; /* reload */
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+glitchpeg_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (dpy, st->gc);
+ if (st->pipe_id) XtRemoveInput (st->pipe_id);
+ if (st->pipe) fclose (st->pipe);
+ if (st->image_data) free (st->image_data);
+ free (st);
+}
+
+
+static const char *glitchpeg_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: True",
+ "*fpsSolid: true",
+ "*delay: 30000",
+ "*duration: 120",
+ "*count: 100",
+ "*grabDesktopImages: False", /* HAVE_JWXYZ */
+ "*chooseRandomImages: True", /* HAVE_JWXYZ */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec glitchpeg_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("GlitchPEG", glitchpeg)
diff --git a/hacks/glitchpeg.man b/hacks/glitchpeg.man
new file mode 100644
index 0000000..ca80165
--- /dev/null
+++ b/hacks/glitchpeg.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glitchpeg - glitched image screen saver.
+.SH SYNOPSIS
+.B glitchpeg
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-duration \fInumber\fP]
+[\-count \fInumber\fP]
+.SH DESCRIPTION
+Loads an image, corrupts it, and then displays the corrupted version,
+several times a second. After a while, finds a new image to corrupt.
+
+It glitches the image by altering random bytes in the compressed image
+file before de-compressing it. This creates interesting visual effects
+on JPEG files, but doesn't work well on PNG files, since PNG contains
+checksums that detect simple corruption.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-duration \fInumber\fP
+How many seconds before loading a new image. Default: 120.
+.TP 8
+.B \-count \fInumber\fP
+Number of glitches to introduce per iteration. Default: 100.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SECURITY
+Because this program is feeding intentionally-invalid data into your
+operating system's image-decoding libraries, it is possible that it
+may crash as a result of that corrupted data.
+
+That should not be possible -- but it might be.
+
+Please note that if this happens, that indicates a serious security
+bug in your system's image libraries! It likely means that your
+libraries are susceptible to buffer overflow attacks or similar, which
+can lead to remote code execution. You should report that bug to the
+maintainers of those image libraries.
+
+In the context of xscreensaver, when configured to load only local
+image files, this should not be a direct security concern: this screen
+saver crashing will not affect the xscreensaver daemon and will not
+unlock your screen.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in
new file mode 100644
index 0000000..e3fa617
--- /dev/null
+++ b/hacks/glx/Makefile.in
@@ -0,0 +1,3473 @@
+# hacks/glx/Makefile.in --- xscreensaver, Copyright (c) 1999-2018
+# by Jamie Zawinski.
+# the `../../configure' script generates `hacks/glx/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+
+install_prefix =
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+mandir = @mandir@
+libexecdir = @libexecdir@
+mansuffix = 6
+manNdir = $(mandir)/man$(mansuffix)
+
+HACKDIR = @HACKDIR@
+HACK_CONF_DIR = @HACK_CONF_DIR@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+DEFS = -DSTANDALONE -DUSE_GL @DEFS@
+LIBS = @LIBS@
+PERL = @PERL@
+
+DEPEND = @DEPEND@
+DEPEND_FLAGS = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL = /bin/sh
+INSTALL = @INSTALL@
+SUID_FLAGS = -o root -m 4755
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SETUID = @INSTALL_SETUID@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_DIRS = @INSTALL_DIRS@
+
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+XMU_LIBS = @XMU_LIBS@
+XFT_LIBS = @XFT_LIBS@
+
+# Note: see comment in ../../driver/Makefile.in for explanation of X_LIBS, etc.
+#
+HACK_PRE = $(LIBS) $(X_LIBS)
+HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_POST2 = @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
+HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ $(HACK_POST2)
+PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ $(HACK_POST2)
+GLE_LIBS = $(HACK_PRE) @GLE_LIBS@ @PNG_LIBS@ $(HACK_POST2)
+TEXT_LIBS = @PTY_LIBS@
+
+HACK_SRC = $(srcdir)/..
+HACK_BIN = ..
+UTILS_SRC = $(HACK_SRC)/../utils
+JWXYZ_SRC = $(HACK_SRC)/../jwxyz
+UTILS_BIN = $(HACK_BIN)/../utils
+JWXYZ_BIN = $(HACK_BIN)/../jwxyz
+
+INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I$(JWXYZ_SRC) -I$(HACK_SRC) -I$(HACK_BIN) -I../..
+INCLUDES = $(INCLUDES_1) @INCLUDES@
+
+UTILDIR_OBJS = $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabclient.o \
+ $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/xmu.o $(UTILS_BIN)/xft.o \
+ $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/logo.o \
+ $(UTILS_BIN)/visual-gl.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/xshm.o \
+ $(UTILS_BIN)/textclient.o $(UTILS_BIN)/async_netdb.o \
+ $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
+ $(UTILS_BIN)/spline.o $(UTILS_BIN)/pow2.o \
+ $(UTILS_SRC)/font-retry.c
+JWXYZ_OBJS = $(JWXYZ_BIN)/jwzgles.o
+HACKDIR_OBJS = $(HACK_BIN)/screenhack.o $(HACK_BIN)/xlockmore.o \
+ $(HACK_BIN)/fps.o $(HACK_BIN)/ximage-loader.o
+PNG = $(HACK_BIN)/ximage-loader.o
+
+SRCS = xscreensaver-gl-helper.c normals.c erase-gl.c fps-gl.c \
+ atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
+ buildlwo.c cage.c dolphin.c gears.c lament.c lament_model.c \
+ moebius.c morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c \
+ s1_3.c s1_4.c s1_5.c s1_6.c s1_b.c shark.c sproingies.c \
+ sproingiewrap.c stairs.c superquadrics.c swim.c whale.c \
+ xlock-gl-utils.c glplanet.c pulsar.c \
+ extrusion.c extrusion-helix2.c extrusion-helix3.c \
+ extrusion-helix4.c extrusion-joinoffset.c extrusion-screw.c \
+ extrusion-taper.c extrusion-twistoid.c sierpinski3d.c \
+ gflux.c stonerview.c stonerview-move.c stonerview-osc.c \
+ stonerview-view.c starwars.c glut_stroke.c glut_swidth.c \
+ gltext.c molecule.c dangerball.c sphere.c tube.c circuit.c \
+ menger.c engine.c flipscreen3d.c dnalogo.c \
+ grab-ximage.c glsnake.c boxed.c glforestfire.c sballs.c \
+ cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \
+ trackball.c gltrackball.c queens.c endgame.c chessmodels.c \
+ glblur.c gllist.c flurry.c flurry-smoke.c flurry-spark.c \
+ flurry-star.c flurry-texture.c atunnel.c tunnel_draw.c \
+ flyingtoasters.c toaster.c toaster_base.c toaster_handle.c \
+ toaster_handle2.c toaster_jet.c toaster_knob.c \
+ toaster_slots.c toaster_wing.c toast.c toast2.c \
+ bouncingcow.c cow_face.c cow_hide.c cow_hoofs.c cow_horns.c \
+ cow_tail.c cow_udder.c glslideshow.c jigglypuff.c klein.c \
+ hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c \
+ flipflop.c antspotlight.c polytopes.c gleidescope.c \
+ mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
+ antinspect.c providence.c pinion.c involute.c boing.c \
+ texfont.c carousel.c fliptext.c antmaze.c tangram.c \
+ tangram_shapes.c crackberg.c glhanoi.c cube21.c \
+ timetunnel.c juggler3d.c topblock.c glschool.c \
+ glschool_gl.c glschool_alg.c glcells.c voronoi.c \
+ moebiusgears.c lockward.c cubicgrid.c hypnowheel.c \
+ skytentacles.c teapot.c sonar.c sonar-sim.c sonar-icmp.c \
+ jigsaw.c photopile.c dropshadow.c rubikblocks.c surfaces.c \
+ hilbert.c companion.c companion_quad.c companion_disc.c \
+ companion_heart.c tronbit.c tronbit_idle1.c tronbit_idle2.c \
+ tronbit_no.c tronbit_yes.c kaleidocycle.c \
+ quasicrystal.c unknownpleasures.c geodesic.c geodesicgears.c \
+ projectiveplane.c winduprobot.c robot.c robot-wireframe.c \
+ cityflow.c romanboy.c splitflap.c splitflap_obj.c \
+ dymaxionmap.c dymaxionmap-coords.c unicrud.c energystream.c \
+ raverhoop.c hydrostat.c discoball.c cubetwist.c cubestack.c \
+ splodesic.c hexstrut.c vigilance.c seccam.c esper.c \
+ razzledazzle.c ships.c peepers.c crumbler.c quickhull.c \
+ maze3d.c
+
+OBJS = xscreensaver-gl-helper.o normals.o erase-gl.o fps-gl.o \
+ atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
+ buildlwo.o cage.o dolphin.o gears.o lament.o lament_model.o \
+ moebius.o morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o \
+ s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o shark.o sproingies.o \
+ sproingiewrap.o stairs.o superquadrics.o swim.o whale.o \
+ xlock-gl-utils.o glplanet.o pulsar.o \
+ extrusion.o extrusion-helix2.o extrusion-helix3.o \
+ extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
+ extrusion-taper.o extrusion-twistoid.o sierpinski3d.o \
+ gflux.o stonerview.o stonerview-move.o stonerview-osc.o \
+ stonerview-view.o starwars.o glut_stroke.o glut_swidth.o \
+ gltext.o molecule.o dangerball.o sphere.o tube.o circuit.o \
+ menger.o engine.o flipscreen3d.o dnalogo.o \
+ grab-ximage.o glsnake.o boxed.o glforestfire.o sballs.o \
+ cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \
+ trackball.o gltrackball.o queens.o endgame.o chessmodels.o \
+ glblur.o gllist.o flurry.o flurry-smoke.o flurry-spark.o \
+ flurry-star.o flurry-texture.o atunnel.o tunnel_draw.o \
+ flyingtoasters.o toaster.o toaster_base.o toaster_handle.o \
+ toaster_handle2.o toaster_jet.o toaster_knob.o \
+ toaster_slots.o toaster_wing.o toast.o toast2.o \
+ bouncingcow.o cow_face.o cow_hide.o cow_hoofs.o cow_horns.o \
+ cow_tail.o cow_udder.o glslideshow.o jigglypuff.o klein.o \
+ hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o \
+ flipflop.o antspotlight.o polytopes.o gleidescope.o \
+ mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
+ antinspect.o providence.o pinion.o involute.o boing.o \
+ texfont.o carousel.o fliptext.o antmaze.o tangram.o \
+ tangram_shapes.o crackberg.o glhanoi.o cube21.o \
+ timetunnel.o juggler3d.o topblock.o glschool.o \
+ glschool_gl.o glschool_alg.o glcells.o voronoi.o \
+ moebiusgears.o lockward.o cubicgrid.o hypnowheel.o \
+ skytentacles.o teapot.o sonar.o sonar-sim.o sonar-icmp.o \
+ jigsaw.o photopile.o dropshadow.o rubikblocks.o surfaces.o \
+ hilbert.o companion.o companion_quad.o companion_disc.o \
+ companion_heart.o tronbit.o tronbit_idle1.o tronbit_idle2.o \
+ tronbit_no.o tronbit_yes.o kaleidocycle.o \
+ quasicrystal.o unknownpleasures.o geodesic.o geodesicgears.o \
+ projectiveplane.o winduprobot.o robot.o robot-wireframe.o \
+ cityflow.o romanboy.o splitflap.o splitflap_obj.o \
+ dymaxionmap.o dymaxionmap-coords.o unicrud.o energystream.o \
+ raverhoop.o hydrostat.o discoball.o cubetwist.o cubestack.o \
+ splodesic.o hexstrut.o vigilance.o seccam.o esper.o \
+ razzledazzle.o ships.o peepers.o crumbler.o quickhull.o \
+ maze3d.o
+
+GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \
+ morph3d rubik atlantis lament bubble3d glplanet pulsar \
+ sierpinski3d gflux stonerview starwars gltext molecule \
+ dangerball circuit menger engine flipscreen3d glsnake boxed \
+ sballs cubenetic spheremonics lavalite queens \
+ endgame glblur flurry atunnel flyingtoasters bouncingcow \
+ glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
+ glknots blocktube flipflop antspotlight polytopes \
+ gleidescope mirrorblob blinkbox noof polyhedra \
+ antinspect providence pinion boing carousel fliptext \
+ antmaze tangram crackberg glhanoi cube21 timetunnel \
+ juggler3d topblock glschool glcells voronoi moebiusgears \
+ lockward cubicgrid hypnowheel skytentacles jigsaw photopile \
+ rubikblocks surfaces hilbert companioncube tronbit \
+ kaleidocycle quasicrystal unknownpleasures geodesic \
+ geodesicgears projectiveplane winduprobot cityflow romanboy \
+ splitflap dymaxionmap unicrud energystream raverhoop \
+ hydrostat discoball cubetwist cubestack splodesic \
+ hexstrut vigilance esper razzledazzle peepers crumbler \
+ maze3d
+GLE_EXES = extrusion
+SUID_EXES = sonar
+GL_UTIL_EXES = xscreensaver-gl-helper
+JWZGLES_OBJS = @JWZGLES_OBJS@
+HACK_EXES_1 = @GL_EXES@ @GLE_EXES@
+HACK_EXES = $(HACK_EXES_1) @SUID_EXES@
+XSHM_OBJS = $(UTILS_BIN)/xshm.o
+GRAB_OBJS = $(UTILS_BIN)/grabclient.o grab-ximage.o $(XSHM_OBJS)
+ANIM_OBJS = recanim-gl.o
+ANIM_LIBS = @PNG_LIBS@
+EXES = @GL_UTIL_EXES@ $(HACK_EXES)
+
+RETIRED_EXES = @RETIRED_GL_EXES@
+RETIRED_GL_EXES = glforestfire
+
+FPS_OBJS = texfont.o $(HACK_BIN)/fps.o fps-gl.o @XFT_OBJS@
+HACK_OBJS = $(JWZGLES_OBJS) $(HACK_BIN)/screenhack.o @ANIM_OBJS@ \
+ $(HACK_BIN)/xlockmore.o xlock-gl-utils.o erase-gl.o \
+ ${FPS_OBJS} $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/visual-gl.o $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/colors.o $(UTILS_BIN)/async_netdb.o \
+ $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
+ $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/pow2.o \
+ $(UTILS_BIN)/font-retry-xft.o
+
+HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h \
+ grab-ximage.h tube.h sphere.h boxed.h \
+ stonerview.h stonerview-move.h stonerview-osc.h \
+ glutstroke.h glut_roman.h glut_mroman.h marching.h \
+ rotator.h trackball.h gltrackball.h chessmodels.h \
+ chessgames.h gllist.h flurry.h tunnel_draw.h ants.h \
+ polyhedra.h normals.h texfont.h tangram_shapes.h \
+ sproingies.h extrusion.h glschool.h glschool_gl.h \
+ glschool_alg.h topblock.h involute.h teapot.h sonar.h \
+ dropshadow.h starwars.h teapot2.h dnapizza.h curlicue.h \
+ quickhull.h dymaxionmap-coords.h
+GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
+ cubenetic.man dangerball.man engine.man extrusion.man \
+ flipscreen3d.man gears.man gflux.man \
+ glplanet.man glsnake.man gltext.man lament.man lavalite.man \
+ menger.man moebius.man molecule.man morph3d.man pipes.man \
+ pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \
+ spheremonics.man sproingies.man stairs.man starwars.man \
+ stonerview.man superquadrics.man xscreensaver-gl-helper.man \
+ endgame.man flurry.man glblur.man atunnel.man \
+ flyingtoasters.man bouncingcow.man glslideshow.man \
+ jigglypuff.man klein.man hypertorus.man glmatrix.man \
+ cubestorm.man glknots.man blocktube.man flipflop.man \
+ antspotlight.man polytopes.man gleidescope.man \
+ mirrorblob.man blinkbox.man noof.man polyhedra.man \
+ antinspect.man providence.man pinion.man boing.man \
+ carousel.man fliptext.man antmaze.man tangram.man \
+ crackberg.man glhanoi.man cube21.man timetunnel.man \
+ juggler3d.man topblock.man glschool.man glcells.man \
+ voronoi.man moebiusgears.man lockward.man cubicgrid.man \
+ hypnowheel.man skytentacles.man sonar.man jigsaw.man \
+ photopile.man rubikblocks.man surfaces.man hilbert.man \
+ companioncube.man tronbit.man kaleidocycle.man \
+ quasicrystal.man unknownpleasures.man geodesic.man \
+ geodesicgears.man projectiveplane.man winduprobot.man \
+ cityflow.man romanboy.man splitflap.man dymaxionmap.man \
+ unicrud.man energystream.man raverhoop.man hydrostat.man \
+ discoball.man cubetwist.man cubestack.man splodesic.man \
+ hexstrut.man vigilance.man esper.man razzledazzle.man \
+ peepers.man crumbler.man maze3d.man
+MEN = @GL_MEN@
+RETIRED_MEN = glforestfire.man
+EXTRAS = README Makefile.in dxf2gl.pl vrml2gl.pl wfront2gl.pl \
+ molecules.sh starwars.txt zalgo.txt *.dxf
+
+TARFILES = $(SRCS) $(HDRS) $(GL_MEN) $(RETIRED_MEN) $(EXTRAS)
+
+
+default: all
+all: $(EXES) $(RETIRED_EXES)
+
+install: install-program install-xml install-man
+uninstall: uninstall-program uninstall-xml uninstall-man
+
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+
+# the hacks, in $HACKDIR
+install-program:: $(EXES)
+ @exes="$(HACK_EXES_1)" ; \
+ idir="$(install_prefix)$(HACKDIR)" ; \
+ if [ "$$exes" != "" ]; then \
+ if [ ! -d $$idir ]; then \
+ $(INSTALL_DIRS) $$idir ; \
+ fi ; \
+ for program in $$exes; do \
+ echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ done ; \
+ \
+ exes="$(SUID_EXES)" ; \
+ if [ @SETUID_HACKS@ = yes ]; then \
+ sinst="$(INSTALL_SETUID)" ; \
+ else \
+ sinst="$(INSTALL_PROGRAM)" ; \
+ fi ; \
+ for program in $$exes; do \
+ echo $$sinst $$program $$idir/$$program ; \
+ if $$sinst $$program $$idir/$$program ; then \
+ true ; \
+ elif [ @SETUID_HACKS@ = yes ]; then \
+ echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ if $(INSTALL_PROGRAM) $$program $$idir/$$program ; then\
+ echo "" ; \
+ echo "WARNING: unable to install $$program setuid:" \
+ "installed non-setuid instead." ; \
+ echo "" ; \
+ else \
+ exit 1 ; \
+ fi ; \
+ else \
+ exit 1 ; \
+ fi ; \
+ done ; \
+ fi
+
+
+# the xscreensaver-gl-helper program, in $bindir
+install-program:: $(EXES)
+ @exes="@GL_UTIL_EXES@" ; \
+ idir="$(install_prefix)$(bindir)" ; \
+ if [ "$$exes" != "" ]; then \
+ if [ ! -d $$idir ]; then \
+ $(INSTALL_DIRS) $$idir ; \
+ fi ; \
+ for program in $$exes; do \
+ echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ done ; \
+ fi
+
+# When installing man pages, we install "foo.man" as "foo.N" and update
+# the .TH line in the installed file with one like
+#
+# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
+#
+# where N is the manual section suffix.
+#
+install-man: $(MEN)
+ @men="$(MEN)" ; \
+ U=$(UTILS_SRC)/version.h ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
+ T=/tmp/xs$$$$.$(mansuffix) ; \
+ TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
+ echo "installing man pages: $$TH" ; \
+ \
+ if [ ! -d $(install_prefix)$(manNdir) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
+ fi ; \
+ \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ manbase=`echo $$man | sed 's/\.man$$//'` ; \
+ TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
+ sed -e "s/^\.TH.*/$$TH/" \
+ -e 's@(MANSUFFIX)@($(mansuffix))@g' \
+ < $(srcdir)/$$man > $$T ; \
+ echo $(INSTALL_DATA) $(srcdir)/$$man \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ $(INSTALL_DATA) $$T \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ done ; \
+ rm -f $$T
+
+install-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ if [ ! -d $$dest ]; then \
+ $(INSTALL_DIRS) $$dest ; \
+ fi ; \
+ src=$(srcdir)/../config ; \
+ for file in $(EXES) $(SCRIPTS) ; do \
+ if [ -f $$src/$$file.xml ]; then \
+ echo $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ fi ; \
+ done
+
+# the hacks, in $HACKDIR
+uninstall-program::
+ @exes="$(HACK_EXES) $(RETIRED_EXES)" ; \
+ idir="$(install_prefix)$(HACKDIR)" ; \
+ for program in $$exes; do \
+ echo rm -f $$idir/$$program ; \
+ rm -f $$idir/$$program ; \
+ done
+
+# the xscreensaver-gl-helper program, in $bindir
+uninstall-program::
+ @exes="$(GL_UTIL_EXES)" ; \
+ idir="$(install_prefix)$(bindir)" ; \
+ for program in $$exes; do \
+ echo rm -f $$idir/$$program ; \
+ rm -f $$idir/$$program ; \
+ done
+
+uninstall-man:
+ @men="$(MEN) $(RETIRED_MEN)" ; \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ done
+
+uninstall-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) ; do \
+ echo rm -f $$dest/$$file.xml ; \
+ rm -f $$dest/$$file.xml ; \
+ done
+
+clean::
+ -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) molecules.h
+
+distclean: clean
+ -rm -f Makefile TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend:
+ $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
+ $(DEPEND_FLAGS) -- \
+ $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close. This excludes dependencies on files in /usr/include, etc. It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend:: molecules.h
+ @echo updating dependencies in `pwd`/Makefile.in... ; \
+ $(DEPEND) -w 0 -f - \
+ -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+ $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS) 2>/dev/null | \
+ sort -d | \
+ ( \
+ awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+ sed -e '/^#.*/d' \
+ -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \
+ -e 's@\.\./\.\./utils@$$(UTILS_SRC)@g' \
+ -e 's@\.\./\.\./jwxyz@$$(JWXYZ_SRC)@g' \
+ -e 's@\.\./glx/@@g' \
+ -e 's@ \.\./@ $$(HACK_SRC)/@g' \
+ -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \
+ -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' \
+ -e 's@ $$(HACK_SRC)/\(.*config.h\)@ ../\1@g' \
+ -e 's@ $$(srcdir)/\(.*molecules.h\)@ \1@g' ; \
+ echo '' \
+ ) > /tmp/distdepend.$$$$ && \
+ mv /tmp/distdepend.$$$$ Makefile.in
+
+
+TAGS: tags
+tags:
+ find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+ @echo $(TARFILES)
+
+check_men:
+ @badmen="" ; \
+ for exe in $(EXES); do \
+ if ! [ -f $(srcdir)/$$exe.man ]; then \
+ badmen="$$badmen $$exe" ; \
+ fi ; \
+ done ; \
+ if [ -n "$$badmen" ]; then \
+ echo "" ; \
+ echo "Warning: The following programs have no manuals:" ; \
+ echo "" ; \
+ for m in $$badmen ; do \
+ echo " $$m" ; \
+ done ; \
+ fi
+
+validate_xml:
+ @echo "Validating XML..." ; \
+ cd $(HACK_SRC) ; ./check-configs.pl $(GL_EXES) $(GLE_EXES) $(SUID_EXES)
+
+distdepend:: check_men validate_xml
+
+
+
+# Rules for noticing when the objects from the utils and hacks
+# directories are out of date with respect to their sources, and going
+# and building them according to the rules in their own Makefile...
+#
+$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c
+$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
+$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xft.o: $(UTILS_SRC)/xft.c
+$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
+$(UTILS_BIN)/logo.o: $(UTILS_SRC)/logo.c
+$(UTILS_BIN)/visual-gl.o: $(UTILS_SRC)/visual-gl.c
+$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c
+$(UTILS_BIN)/textclient.o: $(UTILS_SRC)/textclient.c
+$(UTILS_BIN)/async_netdb.o: $(UTILS_SRC)/async_netdb.c
+$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
+$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
+$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c
+$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
+$(UTILS_BIN)/font-retry-xft.o: $(UTILS_SRC)/font-retry.c
+$(HACK_BIN)/screenhack.o: $(HACK_SRC)/screenhack.c
+$(HACK_BIN)/xlockmore.o: $(HACK_SRC)/xlockmore.c
+$(HACK_BIN)/fps.o: $(HACK_SRC)/fps.c
+
+$(UTILDIR_OBJS):
+ cd $(UTILS_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
+$(JWXYZ_OBJS):
+ cd $(JWXYZ_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
+$(HACKDIR_OBJS):
+ cd $(HACK_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
+
+
+# How we build object files in this directory.
+.c.o:
+ $(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+
+# Make sure the images have been packaged. This is the first one hit:
+../images/gen/wood_png.h:
+ cd ../images && $(MAKE)
+
+# How to build the "xscreensaver-gl-helper" program, that lets the daemon
+# know which visual is the right one for GL programs.
+#
+HELPER_OBJS = xscreensaver-gl-helper.o $(UTILS_BIN)/visual-gl.o \
+ $(UTILS_BIN)/visual.o $(UTILS_BIN)/resources.o
+xscreensaver-gl-helper: $(HELPER_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(HELPER_OBJS) $(LIBS) $(X_LIBS) $(HACK_POST2)
+
+
+# These hacks use a slightly-differently-compiled variant of recanim.c.
+# This is how to make the the other .o file from it.
+#
+XLM_CFLAGS=-DUSE_GL $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
+recanim-gl.o: $(HACK_SRC)/recanim.c
+ $(CC) -o $@ -c $(XLM_CFLAGS) $(HACK_SRC)/recanim.c
+
+CC_HACK = $(CC) $(LDFLAGS)
+
+
+TRACK_OBJS=rotator.o trackball.o gltrackball.o
+HACK_TRACK_OBJS=$(HACK_OBJS) $(TRACK_OBJS)
+HACK_GRAB_OBJS=$(HACK_OBJS) $(GRAB_OBJS)
+HACK_TRACK_GRAB_OBJS=$(HACK_TRACK_OBJS) $(GRAB_OBJS)
+TEXT=$(UTILS_BIN)/textclient.o
+
+ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o $(PNG)
+atlantis: atlantis.o $(ATLANTIS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(ATLANTIS_OBJS) $(PNG_LIBS)
+
+ATUNNEL_OBJS = $(HACK_OBJS) tunnel_draw.o $(PNG)
+atunnel: atunnel.o $(ATUNNEL_OBJS)
+ $(CC_HACK) -o $@ $@.o $(ATUNNEL_OBJS) $(PNG_LIBS)
+
+cage: cage.o $(PNG) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
+
+FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o
+FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS)
+
+flurry: flurry.o $(FLURRY_OBJS)
+ $(CC_HACK) -o $@ $@.o $(FLURRY_OBJS) $(HACK_LIBS) -lm
+
+GEARS_OBJS_1=normals.o involute.o
+GEARS_OBJS=$(GEARS_OBJS_1) $(HACK_TRACK_OBJS)
+gears: gears.o tube.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o tube.o $(GEARS_OBJS) $(HACK_LIBS)
+
+MOEBIUS_OBJS=sphere.o tube.o $(PNG) $(HACK_TRACK_OBJS)
+moebius: moebius.o $(MOEBIUS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(MOEBIUS_OBJS) $(HACK_LIBS) $(PNG_LIBS)
+
+PIPE_OBJS=pipeobjs.o buildlwo.o sphere.o teapot.o normals.o
+pipes: pipes.o $(PIPE_OBJS) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PIPE_OBJS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+superquadrics: superquadrics.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+morph3d: morph3d.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+rubik: rubik.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+stairs: stairs.o sphere.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(PNG) $(HACK_TRACK_OBJS) \
+ $(HACK_LIBS) $(PNG_LIBS)
+
+SPROINGIES = sproingiewrap.o gllist.o \
+ s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
+sproingies: sproingies.o $(HACK_OBJS) $(SPROINGIES)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS)
+
+LAMENTOBJS = gllist.o lament_model.o $(HACK_TRACK_OBJS) $(PNG) normals.o
+lament: lament.o $(LAMENTOBJS)
+ $(CC_HACK) -o $@ $@.o $(LAMENTOBJS) $(PNG_LIBS)
+
+lament_dxf::
+ ./dxf2gl.pl --smooth --layers lament.dxf lament_model.c
+
+
+B3D_OBJS = b_sphere.o b_draw.o b_lockglue.o $(HACK_OBJS)
+bubble3d: bubble3d.o $(B3D_OBJS)
+ $(CC_HACK) -o $@ $@.o $(B3D_OBJS) $(HACK_LIBS)
+
+PLANET_OBJS=sphere.o $(PNG) $(HACK_TRACK_OBJS)
+glplanet: glplanet.o $(PLANET_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PLANET_OBJS) $(PNG_LIBS)
+
+DYMAXIOBJS=dymaxionmap-coords.o normals.o $(PLANET_OBJS)
+dymaxionmap: dymaxionmap.o $(DYMAXIOBJS)
+ $(CC_HACK) -o $@ $@.o $(DYMAXIOBJS) $(PNG_LIBS)
+
+pulsar: pulsar.o $(HACK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(PNG_LIBS)
+
+EXTRUSION_OBJS=extrusion.o extrusion-helix2.o extrusion-helix3.o \
+ extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
+ extrusion-taper.o extrusion-twistoid.o $(PNG) \
+ $(HACK_TRACK_OBJS)
+extrusion: $(EXTRUSION_OBJS)
+ $(CC_HACK) -o $@ $(EXTRUSION_OBJS) $(GLE_LIBS)
+
+sierpinski3d: sierpinski3d.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+gflux: gflux.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+SW_OBJS=starwars.o glut_stroke.o glut_swidth.o $(TEXT) $(HACK_OBJS)
+starwars: $(SW_OBJS)
+ $(CC_HACK) -o $@ $(SW_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
+
+GLT_OBJS=gltext.o glut_stroke.o glut_swidth.o tube.o sphere.o \
+ $(TEXT) $(HACK_TRACK_OBJS)
+gltext: $(GLT_OBJS)
+ $(CC_HACK) -o $@ $(GLT_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
+
+DB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+dangerball: dangerball.o $(DB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(DB_OBJS) $(HACK_LIBS)
+
+circuit: circuit.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+menger: menger.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+engine: engine.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+flipscreen3d: flipscreen3d.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+glsnake: glsnake.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+boxed: boxed.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+glforestfire: glforestfire.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
+
+sballs: sballs.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
+
+cubenetic: cubenetic.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+spheremonics: spheremonics.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+LL_OBJS=marching.o $(PNG) normals.o $(HACK_TRACK_OBJS)
+lavalite: lavalite.o $(LL_OBJS)
+ $(CC_HACK) -o $@ $@.o $(LL_OBJS) $(PNG_LIBS)
+
+queens: queens.o chessmodels.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o chessmodels.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+endgame: endgame.o chessmodels.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o chessmodels.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+glblur: glblur.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TOAST_OBJS=\
+ toaster.o toaster_base.o toaster_handle.o toaster_handle2.o \
+ toaster_jet.o toaster_knob.o toaster_slots.o toaster_wing.o \
+ toast.o toast2.o \
+ flyingtoasters.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
+flyingtoasters: $(TOAST_OBJS)
+ $(CC_HACK) -o $@ $(TOAST_OBJS) $(PNG_LIBS)
+
+toaster_dxf::
+ @set -e ; \
+ for f in \
+ toaster.dxf \
+ toaster_base.dxf \
+ toaster_handle.dxf \
+ toaster_handle2.dxf \
+ toaster_jet.dxf \
+ toaster_knob.dxf \
+ toaster_slots.dxf \
+ toaster_wing.dxf \
+ toast.dxf \
+ toast2.dxf \
+ ; do \
+ f2=`echo $$f | sed 's/dxf$$/c/'` ; \
+ ./dxf2gl.pl --normalize --smooth $$f $$f2 ; \
+ done ; \
+
+COW_OBJS=\
+ cow_face.o cow_hide.o cow_hoofs.o cow_horns.o cow_tail.o cow_udder.o \
+ bouncingcow.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
+bouncingcow: $(COW_OBJS)
+ $(CC_HACK) -o $@ $(COW_OBJS) $(PNG_LIBS)
+
+ROBO_OBJS=\
+ robot.o robot-wireframe.o gllist.o $(PNG) sphere.o \
+ winduprobot.o $(GEARS_OBJS_1) $(TEXT) $(HACK_TRACK_OBJS)
+winduprobot: $(ROBO_OBJS)
+ $(CC_HACK) -o $@ $(ROBO_OBJS) $(PNG_LIBS) $(TEXT_LIBS)
+
+winduprobot_dxf::
+ ./dxf2gl.pl --smooth --layers robot.dxf robot.c
+ ./dxf2gl.pl --wireframe robot-wireframe.dxf robot-wireframe.c
+
+CAM_OBJS=seccam.o gllist.o vigilance.o $(HACK_TRACK_OBJS)
+vigilance: $(CAM_OBJS)
+ $(CC_HACK) -o $@ $(CAM_OBJS) $(HACK_LIBS)
+
+seccam_dxf::
+ ./dxf2gl.pl --smooth --layers seccam.dxf seccam.c
+
+glslideshow: glslideshow.o $(HACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_GRAB_OBJS) $(HACK_LIBS)
+
+jigglypuff: jigglypuff.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
+
+klein: klein.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+surfaces: surfaces.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+hypertorus: hypertorus.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+projectiveplane: projectiveplane.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+romanboy: romanboy.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+glmatrix: glmatrix.o $(PNG) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
+
+cubestorm: cubestorm.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+glknots: glknots.o tube.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+blocktube: blocktube.o $(PNG) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
+
+flipflop: flipflop.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+antspotlight: antspotlight.o sphere.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+polytopes: polytopes.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+STONER_OBJS=stonerview-move.o stonerview-osc.o stonerview-view.o
+stonerview: stonerview.o $(STONER_OBJS) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(STONER_OBJS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+molecules.h:
+ @echo "building molecules.h from $(HACK_SRC)/images/molecules/*.pdb"; \
+ UTILS_SRC="$(UTILS_SRC)" \
+ $(srcdir)/molecules.sh molecules.h $(HACK_SRC)/images/molecules/*.pdb
+
+MOLECULE_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+molecule.o: molecules.h
+molecule: molecule.o $(MOLECULE_OBJS)
+ $(CC_HACK) -o $@ $@.o $(MOLECULE_OBJS) $(HACK_LIBS)
+
+gleidescope: gleidescope.o $(PNG) $(HACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_GRAB_OBJS) $(PNG_LIBS)
+
+mirrorblob: mirrorblob.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(PNG_LIBS)
+
+blinkbox: blinkbox.o sphere.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(HACK_OBJS) $(HACK_LIBS)
+
+noof: noof.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+PH_OBJS=polyhedra-gl.o normals.o teapot.o $(HACK_TRACK_OBJS)
+polyhedra: polyhedra.o $(PH_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PH_OBJS) $(HACK_LIBS)
+
+antinspect: antinspect.o sphere.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+providence: providence.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+pinion: pinion.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
+
+moebiusgears: moebiusgears.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
+
+boing: boing.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+carousel: carousel.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+fliptext: fliptext.o $(TEXT) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TEXT) $(HACK_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
+
+antmaze: antmaze.o sphere.o tube.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TANGRAM_OBJS=tangram_shapes.o $(HACK_OBJS)
+tangram: tangram.o $(TANGRAM_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TANGRAM_OBJS) $(HACK_LIBS)
+
+crackberg: crackberg.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+glhanoi: glhanoi.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cube21: cube21.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TIMETUNNEL_OBJS = $(PNG) $(HACK_TRACK_OBJS)
+timetunnel: timetunnel.o $(TIMETUNNEL_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TIMETUNNEL_OBJS) $(PNG_LIBS)
+
+JUGG_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+juggler3d: juggler3d.o $(JUGG_OBJS)
+ $(CC_HACK) -o $@ $@.o $(JUGG_OBJS) $(HACK_LIBS)
+
+dnalogo: dnalogo.o tube.o sphere.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o tube.o sphere.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+topblock: topblock.o sphere.o tube.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+SCHOOL_OBJS=glschool.o glschool_alg.o glschool_gl.o \
+ sphere.o tube.o normals.o $(HACK_OBJS)
+glschool: $(SCHOOL_OBJS)
+ $(CC_HACK) -o $@ $(SCHOOL_OBJS) $(HACK_LIBS)
+
+glcells: glcells.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+voronoi: voronoi.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+lockward: lockward.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+cubicgrid: cubicgrid.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+hypnowheel: hypnowheel.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TENTACLE_OBJS=normals.o $(PNG) $(HACK_TRACK_OBJS)
+skytentacles: skytentacles.o $(TENTACLE_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TENTACLE_OBJS) $(PNG_LIBS)
+
+SONAR_OBJS=sonar-sim.o sonar-icmp.o $(HACK_TRACK_OBJS)
+sonar: sonar.o $(SONAR_OBJS)
+ $(CC_HACK) -o $@ $@.o $(SONAR_OBJS) $(HACK_LIBS)
+
+JIGSAW_OBJS=normals.o $(UTILS_BIN)/spline.o $(HACK_TRACK_GRAB_OBJS)
+jigsaw: jigsaw.o $(JIGSAW_OBJS)
+ $(CC_HACK) -o $@ $@.o $(JIGSAW_OBJS) $(HACK_LIBS)
+
+PHOTOPILE_OBJS=dropshadow.o $(HACK_GRAB_OBJS)
+photopile: photopile.o $(PHOTOPILE_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PHOTOPILE_OBJS) $(HACK_LIBS)
+
+rubikblocks: rubikblocks.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+HILB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+hilbert: hilbert.o $(HILB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HILB_OBJS) $(HACK_LIBS)
+
+CCUBE_OBJS=companion.o companion_quad.o companion_disc.o companion_heart.o \
+ gllist.o $(HACK_TRACK_OBJS)
+companioncube: $(CCUBE_OBJS)
+ $(CC_HACK) -o $@ $(CCUBE_OBJS) $(HACK_LIBS)
+
+TBIT_OBJS=tronbit.o tronbit_idle1.o tronbit_idle2.o tronbit_no.o tronbit_yes.o\
+ gllist.o $(HACK_TRACK_OBJS)
+tronbit: $(TBIT_OBJS)
+ $(CC_HACK) -o $@ $(TBIT_OBJS) $(HACK_LIBS)
+
+KALEIDOCYCLE_OBJS=kaleidocycle.o normals.o $(HACK_TRACK_OBJS)
+kaleidocycle: $(KALEIDOCYCLE_OBJS)
+ $(CC_HACK) -o $@ $(KALEIDOCYCLE_OBJS) $(HACK_LIBS)
+
+quasicrystal: quasicrystal.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+unknownpleasures: unknownpleasures.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+geodesic: geodesic.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+geodesicgears: geodesicgears.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
+
+cityflow: cityflow.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+splitflap_dxf::
+ ./dxf2gl.pl --normalize --smooth --layers splitflap.dxf splitflap_obj.c
+
+FLAP_OBJS=splitflap_obj.o gllist.o splitflap.o $(TEXT) $(HACK_TRACK_OBJS)
+splitflap: $(FLAP_OBJS)
+ $(CC_HACK) -o $@ $(FLAP_OBJS) $(PNG_LIBS) $(TEXT_LIBS)
+
+unicrud: unicrud.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+ES_OBJS=$(PNG) $(HACK_TRACK_OBJS)
+energystream: energystream.o $(ES_OBJS)
+ $(CC_HACK) -o $@ $@.o $(ES_OBJS) $(PNG_LIBS) $(HACK_LIBS)
+
+raverhoop: raverhoop.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+HSTAT_OBJS=sphere.o normals.o $(HACK_TRACK_OBJS)
+hydrostat: hydrostat.o $(HSTAT_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HSTAT_OBJS) $(HACK_LIBS)
+
+discoball: discoball.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cubetwist: cubetwist.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cubestack: cubestack.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+splodesic: splodesic.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+hexstrut: hexstrut.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+esper: esper.o $(HACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_GRAB_OBJS) $(HACK_LIBS)
+
+ships_dxf::
+ ./dxf2gl.pl --normalize --layers ships.dxf ships.c
+
+DAZ_OBJS=ships.o gllist.o $(HACK_TRACK_OBJS)
+razzledazzle: razzledazzle.o $(DAZ_OBJS)
+ $(CC_HACK) -o $@ $@.o $(DAZ_OBJS) $(HACK_LIBS)
+
+peepers: peepers.o normals.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(PNG) $(PNG_LIBS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+crumbler: crumbler.o quickhull.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o quickhull.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+maze3d: maze3d.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(PNG_LIBS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+
+antinspect.o: ../../config.h
+antinspect.o: $(HACK_SRC)/fps.h
+antinspect.o: $(srcdir)/gltrackball.h
+antinspect.o: $(HACK_SRC)/recanim.h
+antinspect.o: $(HACK_SRC)/screenhackI.h
+antinspect.o: $(srcdir)/sphere.h
+antinspect.o: $(UTILS_SRC)/colors.h
+antinspect.o: $(UTILS_SRC)/erase.h
+antinspect.o: $(UTILS_SRC)/font-retry.h
+antinspect.o: $(UTILS_SRC)/grabscreen.h
+antinspect.o: $(UTILS_SRC)/hsv.h
+antinspect.o: $(UTILS_SRC)/resources.h
+antinspect.o: $(UTILS_SRC)/usleep.h
+antinspect.o: $(UTILS_SRC)/visual.h
+antinspect.o: $(UTILS_SRC)/yarandom.h
+antinspect.o: $(HACK_SRC)/xlockmoreI.h
+antinspect.o: $(HACK_SRC)/xlockmore.h
+antmaze.o: $(srcdir)/ants.h
+antmaze.o: ../../config.h
+antmaze.o: $(HACK_SRC)/fps.h
+antmaze.o: $(srcdir)/gltrackball.h
+antmaze.o: $(HACK_SRC)/recanim.h
+antmaze.o: $(srcdir)/rotator.h
+antmaze.o: $(HACK_SRC)/screenhackI.h
+antmaze.o: $(srcdir)/sphere.h
+antmaze.o: $(srcdir)/tube.h
+antmaze.o: $(UTILS_SRC)/colors.h
+antmaze.o: $(UTILS_SRC)/erase.h
+antmaze.o: $(UTILS_SRC)/font-retry.h
+antmaze.o: $(UTILS_SRC)/grabscreen.h
+antmaze.o: $(UTILS_SRC)/hsv.h
+antmaze.o: $(UTILS_SRC)/resources.h
+antmaze.o: $(UTILS_SRC)/usleep.h
+antmaze.o: $(UTILS_SRC)/visual.h
+antmaze.o: $(UTILS_SRC)/yarandom.h
+antmaze.o: $(HACK_SRC)/xlockmoreI.h
+antmaze.o: $(HACK_SRC)/xlockmore.h
+antspotlight.o: $(srcdir)/ants.h
+antspotlight.o: ../../config.h
+antspotlight.o: $(HACK_SRC)/fps.h
+antspotlight.o: $(srcdir)/gltrackball.h
+antspotlight.o: $(srcdir)/grab-ximage.h
+antspotlight.o: $(HACK_SRC)/recanim.h
+antspotlight.o: $(srcdir)/rotator.h
+antspotlight.o: $(HACK_SRC)/screenhackI.h
+antspotlight.o: $(srcdir)/sphere.h
+antspotlight.o: $(srcdir)/tube.h
+antspotlight.o: $(UTILS_SRC)/colors.h
+antspotlight.o: $(UTILS_SRC)/erase.h
+antspotlight.o: $(UTILS_SRC)/font-retry.h
+antspotlight.o: $(UTILS_SRC)/grabscreen.h
+antspotlight.o: $(UTILS_SRC)/hsv.h
+antspotlight.o: $(UTILS_SRC)/resources.h
+antspotlight.o: $(UTILS_SRC)/usleep.h
+antspotlight.o: $(UTILS_SRC)/visual.h
+antspotlight.o: $(UTILS_SRC)/yarandom.h
+antspotlight.o: $(HACK_SRC)/xlockmoreI.h
+antspotlight.o: $(HACK_SRC)/xlockmore.h
+atlantis.o: $(srcdir)/atlantis.h
+atlantis.o: ../../config.h
+atlantis.o: $(HACK_SRC)/fps.h
+atlantis.o: $(HACK_SRC)/images/gen/sea-texture_png.h
+atlantis.o: $(HACK_SRC)/recanim.h
+atlantis.o: $(HACK_SRC)/screenhackI.h
+atlantis.o: $(UTILS_SRC)/colors.h
+atlantis.o: $(UTILS_SRC)/erase.h
+atlantis.o: $(UTILS_SRC)/font-retry.h
+atlantis.o: $(UTILS_SRC)/grabscreen.h
+atlantis.o: $(UTILS_SRC)/hsv.h
+atlantis.o: $(UTILS_SRC)/resources.h
+atlantis.o: $(UTILS_SRC)/usleep.h
+atlantis.o: $(UTILS_SRC)/visual.h
+atlantis.o: $(UTILS_SRC)/yarandom.h
+atlantis.o: $(HACK_SRC)/ximage-loader.h
+atlantis.o: $(HACK_SRC)/xlockmoreI.h
+atlantis.o: $(HACK_SRC)/xlockmore.h
+atunnel.o: ../../config.h
+atunnel.o: $(HACK_SRC)/fps.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel0_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel1_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel2_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel3_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel4_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel5_png.h
+atunnel.o: $(HACK_SRC)/recanim.h
+atunnel.o: $(HACK_SRC)/screenhackI.h
+atunnel.o: $(srcdir)/tunnel_draw.h
+atunnel.o: $(UTILS_SRC)/colors.h
+atunnel.o: $(UTILS_SRC)/erase.h
+atunnel.o: $(UTILS_SRC)/font-retry.h
+atunnel.o: $(UTILS_SRC)/grabscreen.h
+atunnel.o: $(UTILS_SRC)/hsv.h
+atunnel.o: $(UTILS_SRC)/resources.h
+atunnel.o: $(UTILS_SRC)/usleep.h
+atunnel.o: $(UTILS_SRC)/visual.h
+atunnel.o: $(UTILS_SRC)/yarandom.h
+atunnel.o: $(HACK_SRC)/ximage-loader.h
+atunnel.o: $(HACK_SRC)/xlockmoreI.h
+atunnel.o: $(HACK_SRC)/xlockmore.h
+b_draw.o: $(srcdir)/bubble3d.h
+b_draw.o: ../../config.h
+b_draw.o: $(HACK_SRC)/fps.h
+b_draw.o: $(HACK_SRC)/recanim.h
+b_draw.o: $(HACK_SRC)/screenhackI.h
+b_draw.o: $(UTILS_SRC)/colors.h
+b_draw.o: $(UTILS_SRC)/erase.h
+b_draw.o: $(UTILS_SRC)/font-retry.h
+b_draw.o: $(UTILS_SRC)/grabscreen.h
+b_draw.o: $(UTILS_SRC)/hsv.h
+b_draw.o: $(UTILS_SRC)/resources.h
+b_draw.o: $(UTILS_SRC)/usleep.h
+b_draw.o: $(UTILS_SRC)/visual.h
+b_draw.o: $(UTILS_SRC)/yarandom.h
+b_draw.o: $(HACK_SRC)/xlockmoreI.h
+blinkbox.o: ../../config.h
+blinkbox.o: $(HACK_SRC)/fps.h
+blinkbox.o: $(HACK_SRC)/recanim.h
+blinkbox.o: $(HACK_SRC)/screenhackI.h
+blinkbox.o: $(srcdir)/sphere.h
+blinkbox.o: $(UTILS_SRC)/colors.h
+blinkbox.o: $(UTILS_SRC)/erase.h
+blinkbox.o: $(UTILS_SRC)/font-retry.h
+blinkbox.o: $(UTILS_SRC)/grabscreen.h
+blinkbox.o: $(UTILS_SRC)/hsv.h
+blinkbox.o: $(UTILS_SRC)/resources.h
+blinkbox.o: $(UTILS_SRC)/usleep.h
+blinkbox.o: $(UTILS_SRC)/visual.h
+blinkbox.o: $(UTILS_SRC)/yarandom.h
+blinkbox.o: $(HACK_SRC)/xlockmoreI.h
+blinkbox.o: $(HACK_SRC)/xlockmore.h
+b_lockglue.o: $(srcdir)/bubble3d.h
+b_lockglue.o: ../../config.h
+b_lockglue.o: $(HACK_SRC)/fps.h
+b_lockglue.o: $(HACK_SRC)/recanim.h
+b_lockglue.o: $(HACK_SRC)/screenhackI.h
+b_lockglue.o: $(UTILS_SRC)/colors.h
+b_lockglue.o: $(UTILS_SRC)/erase.h
+b_lockglue.o: $(UTILS_SRC)/font-retry.h
+b_lockglue.o: $(UTILS_SRC)/grabscreen.h
+b_lockglue.o: $(UTILS_SRC)/hsv.h
+b_lockglue.o: $(UTILS_SRC)/resources.h
+b_lockglue.o: $(UTILS_SRC)/usleep.h
+b_lockglue.o: $(UTILS_SRC)/visual.h
+b_lockglue.o: $(UTILS_SRC)/yarandom.h
+b_lockglue.o: $(HACK_SRC)/xlockmoreI.h
+b_lockglue.o: $(HACK_SRC)/xlockmore.h
+blocktube.o: ../../config.h
+blocktube.o: $(HACK_SRC)/fps.h
+blocktube.o: $(HACK_SRC)/images/gen/blocktube_png.h
+blocktube.o: $(HACK_SRC)/recanim.h
+blocktube.o: $(HACK_SRC)/screenhackI.h
+blocktube.o: $(UTILS_SRC)/colors.h
+blocktube.o: $(UTILS_SRC)/erase.h
+blocktube.o: $(UTILS_SRC)/font-retry.h
+blocktube.o: $(UTILS_SRC)/grabscreen.h
+blocktube.o: $(UTILS_SRC)/hsv.h
+blocktube.o: $(UTILS_SRC)/resources.h
+blocktube.o: $(UTILS_SRC)/usleep.h
+blocktube.o: $(UTILS_SRC)/visual.h
+blocktube.o: $(UTILS_SRC)/yarandom.h
+blocktube.o: $(HACK_SRC)/ximage-loader.h
+blocktube.o: $(HACK_SRC)/xlockmoreI.h
+blocktube.o: $(HACK_SRC)/xlockmore.h
+boing.o: ../../config.h
+boing.o: $(HACK_SRC)/fps.h
+boing.o: $(srcdir)/gltrackball.h
+boing.o: $(HACK_SRC)/recanim.h
+boing.o: $(HACK_SRC)/screenhackI.h
+boing.o: $(UTILS_SRC)/colors.h
+boing.o: $(UTILS_SRC)/erase.h
+boing.o: $(UTILS_SRC)/font-retry.h
+boing.o: $(UTILS_SRC)/grabscreen.h
+boing.o: $(UTILS_SRC)/hsv.h
+boing.o: $(UTILS_SRC)/resources.h
+boing.o: $(UTILS_SRC)/usleep.h
+boing.o: $(UTILS_SRC)/visual.h
+boing.o: $(UTILS_SRC)/yarandom.h
+boing.o: $(HACK_SRC)/xlockmoreI.h
+boing.o: $(HACK_SRC)/xlockmore.h
+bouncingcow.o: ../../config.h
+bouncingcow.o: $(HACK_SRC)/fps.h
+bouncingcow.o: $(srcdir)/gllist.h
+bouncingcow.o: $(srcdir)/gltrackball.h
+bouncingcow.o: $(HACK_SRC)/recanim.h
+bouncingcow.o: $(srcdir)/rotator.h
+bouncingcow.o: $(HACK_SRC)/screenhackI.h
+bouncingcow.o: $(UTILS_SRC)/colors.h
+bouncingcow.o: $(UTILS_SRC)/erase.h
+bouncingcow.o: $(UTILS_SRC)/font-retry.h
+bouncingcow.o: $(UTILS_SRC)/grabscreen.h
+bouncingcow.o: $(UTILS_SRC)/hsv.h
+bouncingcow.o: $(UTILS_SRC)/resources.h
+bouncingcow.o: $(UTILS_SRC)/usleep.h
+bouncingcow.o: $(UTILS_SRC)/visual.h
+bouncingcow.o: $(UTILS_SRC)/yarandom.h
+bouncingcow.o: $(HACK_SRC)/ximage-loader.h
+bouncingcow.o: $(HACK_SRC)/xlockmoreI.h
+bouncingcow.o: $(HACK_SRC)/xlockmore.h
+boxed.o: $(srcdir)/boxed.h
+boxed.o: ../../config.h
+boxed.o: $(HACK_SRC)/fps.h
+boxed.o: $(HACK_SRC)/recanim.h
+boxed.o: $(HACK_SRC)/screenhackI.h
+boxed.o: $(UTILS_SRC)/colors.h
+boxed.o: $(UTILS_SRC)/erase.h
+boxed.o: $(UTILS_SRC)/font-retry.h
+boxed.o: $(UTILS_SRC)/grabscreen.h
+boxed.o: $(UTILS_SRC)/hsv.h
+boxed.o: $(UTILS_SRC)/resources.h
+boxed.o: $(UTILS_SRC)/usleep.h
+boxed.o: $(UTILS_SRC)/visual.h
+boxed.o: $(UTILS_SRC)/yarandom.h
+boxed.o: $(HACK_SRC)/xlockmoreI.h
+boxed.o: $(HACK_SRC)/xlockmore.h
+b_sphere.o: $(srcdir)/bubble3d.h
+b_sphere.o: ../../config.h
+b_sphere.o: $(HACK_SRC)/fps.h
+b_sphere.o: $(HACK_SRC)/recanim.h
+b_sphere.o: $(HACK_SRC)/screenhackI.h
+b_sphere.o: $(UTILS_SRC)/colors.h
+b_sphere.o: $(UTILS_SRC)/erase.h
+b_sphere.o: $(UTILS_SRC)/font-retry.h
+b_sphere.o: $(UTILS_SRC)/grabscreen.h
+b_sphere.o: $(UTILS_SRC)/hsv.h
+b_sphere.o: $(UTILS_SRC)/resources.h
+b_sphere.o: $(UTILS_SRC)/usleep.h
+b_sphere.o: $(UTILS_SRC)/visual.h
+b_sphere.o: $(UTILS_SRC)/yarandom.h
+b_sphere.o: $(HACK_SRC)/xlockmoreI.h
+bubble3d.o: $(srcdir)/bubble3d.h
+bubble3d.o: ../../config.h
+bubble3d.o: $(HACK_SRC)/fps.h
+bubble3d.o: $(HACK_SRC)/recanim.h
+bubble3d.o: $(HACK_SRC)/screenhackI.h
+bubble3d.o: $(UTILS_SRC)/colors.h
+bubble3d.o: $(UTILS_SRC)/erase.h
+bubble3d.o: $(UTILS_SRC)/font-retry.h
+bubble3d.o: $(UTILS_SRC)/grabscreen.h
+bubble3d.o: $(UTILS_SRC)/hsv.h
+bubble3d.o: $(UTILS_SRC)/resources.h
+bubble3d.o: $(UTILS_SRC)/usleep.h
+bubble3d.o: $(UTILS_SRC)/visual.h
+bubble3d.o: $(UTILS_SRC)/yarandom.h
+bubble3d.o: $(HACK_SRC)/xlockmoreI.h
+buildlwo.o: $(srcdir)/buildlwo.h
+buildlwo.o: ../../config.h
+cage.o: ../../config.h
+cage.o: $(HACK_SRC)/fps.h
+cage.o: $(HACK_SRC)/images/gen/wood_png.h
+cage.o: $(HACK_SRC)/recanim.h
+cage.o: $(HACK_SRC)/screenhackI.h
+cage.o: $(UTILS_SRC)/colors.h
+cage.o: $(UTILS_SRC)/erase.h
+cage.o: $(UTILS_SRC)/font-retry.h
+cage.o: $(UTILS_SRC)/grabscreen.h
+cage.o: $(UTILS_SRC)/hsv.h
+cage.o: $(UTILS_SRC)/resources.h
+cage.o: $(UTILS_SRC)/usleep.h
+cage.o: $(UTILS_SRC)/visual.h
+cage.o: $(UTILS_SRC)/yarandom.h
+cage.o: $(HACK_SRC)/ximage-loader.h
+cage.o: $(HACK_SRC)/xlockmoreI.h
+cage.o: $(HACK_SRC)/xlockmore.h
+carousel.o: ../../config.h
+carousel.o: $(HACK_SRC)/fps.h
+carousel.o: $(srcdir)/gltrackball.h
+carousel.o: $(srcdir)/grab-ximage.h
+carousel.o: $(HACK_SRC)/recanim.h
+carousel.o: $(srcdir)/rotator.h
+carousel.o: $(HACK_SRC)/screenhackI.h
+carousel.o: $(srcdir)/texfont.h
+carousel.o: $(UTILS_SRC)/colors.h
+carousel.o: $(UTILS_SRC)/erase.h
+carousel.o: $(UTILS_SRC)/font-retry.h
+carousel.o: $(UTILS_SRC)/grabscreen.h
+carousel.o: $(UTILS_SRC)/hsv.h
+carousel.o: $(UTILS_SRC)/resources.h
+carousel.o: $(UTILS_SRC)/usleep.h
+carousel.o: $(UTILS_SRC)/visual.h
+carousel.o: $(UTILS_SRC)/yarandom.h
+carousel.o: $(HACK_SRC)/xlockmoreI.h
+carousel.o: $(HACK_SRC)/xlockmore.h
+chessmodels.o: $(srcdir)/chessmodels.h
+chessmodels.o: ../../config.h
+circuit.o: ../../config.h
+circuit.o: $(HACK_SRC)/fps.h
+circuit.o: $(HACK_SRC)/recanim.h
+circuit.o: $(HACK_SRC)/screenhackI.h
+circuit.o: $(srcdir)/texfont.h
+circuit.o: $(UTILS_SRC)/colors.h
+circuit.o: $(UTILS_SRC)/erase.h
+circuit.o: $(UTILS_SRC)/font-retry.h
+circuit.o: $(UTILS_SRC)/grabscreen.h
+circuit.o: $(UTILS_SRC)/hsv.h
+circuit.o: $(UTILS_SRC)/resources.h
+circuit.o: $(UTILS_SRC)/usleep.h
+circuit.o: $(UTILS_SRC)/visual.h
+circuit.o: $(UTILS_SRC)/yarandom.h
+circuit.o: $(HACK_SRC)/xlockmoreI.h
+circuit.o: $(HACK_SRC)/xlockmore.h
+cityflow.o: ../../config.h
+cityflow.o: $(HACK_SRC)/fps.h
+cityflow.o: $(srcdir)/gltrackball.h
+cityflow.o: $(HACK_SRC)/recanim.h
+cityflow.o: $(HACK_SRC)/screenhackI.h
+cityflow.o: $(UTILS_SRC)/colors.h
+cityflow.o: $(UTILS_SRC)/erase.h
+cityflow.o: $(UTILS_SRC)/font-retry.h
+cityflow.o: $(UTILS_SRC)/grabscreen.h
+cityflow.o: $(UTILS_SRC)/hsv.h
+cityflow.o: $(UTILS_SRC)/resources.h
+cityflow.o: $(UTILS_SRC)/usleep.h
+cityflow.o: $(UTILS_SRC)/visual.h
+cityflow.o: $(UTILS_SRC)/yarandom.h
+cityflow.o: $(HACK_SRC)/xlockmoreI.h
+cityflow.o: $(HACK_SRC)/xlockmore.h
+companion_disc.o: ../../config.h
+companion_disc.o: $(srcdir)/gllist.h
+companion_heart.o: ../../config.h
+companion_heart.o: $(srcdir)/gllist.h
+companion.o: ../../config.h
+companion.o: $(HACK_SRC)/fps.h
+companion.o: $(srcdir)/gllist.h
+companion.o: $(srcdir)/gltrackball.h
+companion.o: $(HACK_SRC)/recanim.h
+companion.o: $(srcdir)/rotator.h
+companion.o: $(HACK_SRC)/screenhackI.h
+companion.o: $(UTILS_SRC)/colors.h
+companion.o: $(UTILS_SRC)/erase.h
+companion.o: $(UTILS_SRC)/font-retry.h
+companion.o: $(UTILS_SRC)/grabscreen.h
+companion.o: $(UTILS_SRC)/hsv.h
+companion.o: $(UTILS_SRC)/resources.h
+companion.o: $(UTILS_SRC)/usleep.h
+companion.o: $(UTILS_SRC)/visual.h
+companion.o: $(UTILS_SRC)/yarandom.h
+companion.o: $(HACK_SRC)/ximage-loader.h
+companion.o: $(HACK_SRC)/xlockmoreI.h
+companion.o: $(HACK_SRC)/xlockmore.h
+companion_quad.o: ../../config.h
+companion_quad.o: $(srcdir)/gllist.h
+cow_face.o: ../../config.h
+cow_face.o: $(srcdir)/gllist.h
+cow_hide.o: ../../config.h
+cow_hide.o: $(srcdir)/gllist.h
+cow_hoofs.o: ../../config.h
+cow_hoofs.o: $(srcdir)/gllist.h
+cow_horns.o: ../../config.h
+cow_horns.o: $(srcdir)/gllist.h
+cow_tail.o: ../../config.h
+cow_tail.o: $(srcdir)/gllist.h
+cow_udder.o: ../../config.h
+cow_udder.o: $(srcdir)/gllist.h
+crackberg.o: ../../config.h
+crackberg.o: $(HACK_SRC)/fps.h
+crackberg.o: $(HACK_SRC)/recanim.h
+crackberg.o: $(HACK_SRC)/screenhackI.h
+crackberg.o: $(UTILS_SRC)/colors.h
+crackberg.o: $(UTILS_SRC)/erase.h
+crackberg.o: $(UTILS_SRC)/font-retry.h
+crackberg.o: $(UTILS_SRC)/grabscreen.h
+crackberg.o: $(UTILS_SRC)/hsv.h
+crackberg.o: $(UTILS_SRC)/resources.h
+crackberg.o: $(UTILS_SRC)/usleep.h
+crackberg.o: $(UTILS_SRC)/visual.h
+crackberg.o: $(UTILS_SRC)/yarandom.h
+crackberg.o: $(HACK_SRC)/xlockmoreI.h
+crackberg.o: $(HACK_SRC)/xlockmore.h
+crumbler.o: ../../config.h
+crumbler.o: $(HACK_SRC)/fps.h
+crumbler.o: $(srcdir)/gltrackball.h
+crumbler.o: $(srcdir)/quickhull.h
+crumbler.o: $(HACK_SRC)/recanim.h
+crumbler.o: $(srcdir)/rotator.h
+crumbler.o: $(HACK_SRC)/screenhackI.h
+crumbler.o: $(UTILS_SRC)/colors.h
+crumbler.o: $(UTILS_SRC)/erase.h
+crumbler.o: $(UTILS_SRC)/font-retry.h
+crumbler.o: $(UTILS_SRC)/grabscreen.h
+crumbler.o: $(UTILS_SRC)/hsv.h
+crumbler.o: $(UTILS_SRC)/resources.h
+crumbler.o: $(UTILS_SRC)/usleep.h
+crumbler.o: $(UTILS_SRC)/visual.h
+crumbler.o: $(UTILS_SRC)/yarandom.h
+crumbler.o: $(HACK_SRC)/xlockmoreI.h
+crumbler.o: $(HACK_SRC)/xlockmore.h
+cube21.o: ../../config.h
+cube21.o: $(HACK_SRC)/fps.h
+cube21.o: $(srcdir)/gltrackball.h
+cube21.o: $(HACK_SRC)/recanim.h
+cube21.o: $(HACK_SRC)/screenhackI.h
+cube21.o: $(UTILS_SRC)/colors.h
+cube21.o: $(UTILS_SRC)/erase.h
+cube21.o: $(UTILS_SRC)/font-retry.h
+cube21.o: $(UTILS_SRC)/grabscreen.h
+cube21.o: $(UTILS_SRC)/hsv.h
+cube21.o: $(UTILS_SRC)/resources.h
+cube21.o: $(UTILS_SRC)/usleep.h
+cube21.o: $(UTILS_SRC)/visual.h
+cube21.o: $(UTILS_SRC)/yarandom.h
+cube21.o: $(HACK_SRC)/xlockmoreI.h
+cube21.o: $(HACK_SRC)/xlockmore.h
+cubenetic.o: ../../config.h
+cubenetic.o: $(HACK_SRC)/fps.h
+cubenetic.o: $(srcdir)/gltrackball.h
+cubenetic.o: $(HACK_SRC)/recanim.h
+cubenetic.o: $(srcdir)/rotator.h
+cubenetic.o: $(HACK_SRC)/screenhackI.h
+cubenetic.o: $(UTILS_SRC)/colors.h
+cubenetic.o: $(UTILS_SRC)/erase.h
+cubenetic.o: $(UTILS_SRC)/font-retry.h
+cubenetic.o: $(UTILS_SRC)/grabscreen.h
+cubenetic.o: $(UTILS_SRC)/hsv.h
+cubenetic.o: $(UTILS_SRC)/resources.h
+cubenetic.o: $(UTILS_SRC)/usleep.h
+cubenetic.o: $(UTILS_SRC)/visual.h
+cubenetic.o: $(UTILS_SRC)/yarandom.h
+cubenetic.o: $(HACK_SRC)/xlockmoreI.h
+cubenetic.o: $(HACK_SRC)/xlockmore.h
+cubestack.o: ../../config.h
+cubestack.o: $(HACK_SRC)/fps.h
+cubestack.o: $(srcdir)/gltrackball.h
+cubestack.o: $(HACK_SRC)/recanim.h
+cubestack.o: $(srcdir)/rotator.h
+cubestack.o: $(HACK_SRC)/screenhackI.h
+cubestack.o: $(UTILS_SRC)/colors.h
+cubestack.o: $(UTILS_SRC)/erase.h
+cubestack.o: $(UTILS_SRC)/font-retry.h
+cubestack.o: $(UTILS_SRC)/grabscreen.h
+cubestack.o: $(UTILS_SRC)/hsv.h
+cubestack.o: $(UTILS_SRC)/resources.h
+cubestack.o: $(UTILS_SRC)/usleep.h
+cubestack.o: $(UTILS_SRC)/visual.h
+cubestack.o: $(UTILS_SRC)/yarandom.h
+cubestack.o: $(HACK_SRC)/xlockmoreI.h
+cubestack.o: $(HACK_SRC)/xlockmore.h
+cubestorm.o: ../../config.h
+cubestorm.o: $(HACK_SRC)/fps.h
+cubestorm.o: $(srcdir)/gltrackball.h
+cubestorm.o: $(HACK_SRC)/recanim.h
+cubestorm.o: $(srcdir)/rotator.h
+cubestorm.o: $(HACK_SRC)/screenhackI.h
+cubestorm.o: $(UTILS_SRC)/colors.h
+cubestorm.o: $(UTILS_SRC)/erase.h
+cubestorm.o: $(UTILS_SRC)/font-retry.h
+cubestorm.o: $(UTILS_SRC)/grabscreen.h
+cubestorm.o: $(UTILS_SRC)/hsv.h
+cubestorm.o: $(UTILS_SRC)/resources.h
+cubestorm.o: $(UTILS_SRC)/usleep.h
+cubestorm.o: $(UTILS_SRC)/visual.h
+cubestorm.o: $(UTILS_SRC)/yarandom.h
+cubestorm.o: $(HACK_SRC)/xlockmoreI.h
+cubestorm.o: $(HACK_SRC)/xlockmore.h
+cubetwist.o: ../../config.h
+cubetwist.o: $(HACK_SRC)/fps.h
+cubetwist.o: $(srcdir)/gltrackball.h
+cubetwist.o: $(srcdir)/normals.h
+cubetwist.o: $(HACK_SRC)/recanim.h
+cubetwist.o: $(srcdir)/rotator.h
+cubetwist.o: $(HACK_SRC)/screenhackI.h
+cubetwist.o: $(UTILS_SRC)/colors.h
+cubetwist.o: $(UTILS_SRC)/erase.h
+cubetwist.o: $(UTILS_SRC)/font-retry.h
+cubetwist.o: $(UTILS_SRC)/grabscreen.h
+cubetwist.o: $(UTILS_SRC)/hsv.h
+cubetwist.o: $(UTILS_SRC)/resources.h
+cubetwist.o: $(UTILS_SRC)/usleep.h
+cubetwist.o: $(UTILS_SRC)/visual.h
+cubetwist.o: $(UTILS_SRC)/yarandom.h
+cubetwist.o: $(HACK_SRC)/xlockmoreI.h
+cubetwist.o: $(HACK_SRC)/xlockmore.h
+cubicgrid.o: ../../config.h
+cubicgrid.o: $(HACK_SRC)/fps.h
+cubicgrid.o: $(srcdir)/gltrackball.h
+cubicgrid.o: $(HACK_SRC)/recanim.h
+cubicgrid.o: $(srcdir)/rotator.h
+cubicgrid.o: $(HACK_SRC)/screenhackI.h
+cubicgrid.o: $(UTILS_SRC)/colors.h
+cubicgrid.o: $(UTILS_SRC)/erase.h
+cubicgrid.o: $(UTILS_SRC)/font-retry.h
+cubicgrid.o: $(UTILS_SRC)/grabscreen.h
+cubicgrid.o: $(UTILS_SRC)/hsv.h
+cubicgrid.o: $(UTILS_SRC)/resources.h
+cubicgrid.o: $(UTILS_SRC)/usleep.h
+cubicgrid.o: $(UTILS_SRC)/visual.h
+cubicgrid.o: $(UTILS_SRC)/yarandom.h
+cubicgrid.o: $(HACK_SRC)/xlockmoreI.h
+cubicgrid.o: $(HACK_SRC)/xlockmore.h
+dangerball.o: ../../config.h
+dangerball.o: $(HACK_SRC)/fps.h
+dangerball.o: $(srcdir)/gltrackball.h
+dangerball.o: $(HACK_SRC)/recanim.h
+dangerball.o: $(srcdir)/rotator.h
+dangerball.o: $(HACK_SRC)/screenhackI.h
+dangerball.o: $(srcdir)/sphere.h
+dangerball.o: $(srcdir)/tube.h
+dangerball.o: $(UTILS_SRC)/colors.h
+dangerball.o: $(UTILS_SRC)/erase.h
+dangerball.o: $(UTILS_SRC)/font-retry.h
+dangerball.o: $(UTILS_SRC)/grabscreen.h
+dangerball.o: $(UTILS_SRC)/hsv.h
+dangerball.o: $(UTILS_SRC)/resources.h
+dangerball.o: $(UTILS_SRC)/usleep.h
+dangerball.o: $(UTILS_SRC)/visual.h
+dangerball.o: $(UTILS_SRC)/yarandom.h
+dangerball.o: $(HACK_SRC)/xlockmoreI.h
+dangerball.o: $(HACK_SRC)/xlockmore.h
+discoball.o: ../../config.h
+discoball.o: $(HACK_SRC)/fps.h
+discoball.o: $(srcdir)/gltrackball.h
+discoball.o: $(srcdir)/normals.h
+discoball.o: $(HACK_SRC)/recanim.h
+discoball.o: $(srcdir)/rotator.h
+discoball.o: $(HACK_SRC)/screenhackI.h
+discoball.o: $(UTILS_SRC)/colors.h
+discoball.o: $(UTILS_SRC)/erase.h
+discoball.o: $(UTILS_SRC)/font-retry.h
+discoball.o: $(UTILS_SRC)/grabscreen.h
+discoball.o: $(UTILS_SRC)/hsv.h
+discoball.o: $(UTILS_SRC)/resources.h
+discoball.o: $(UTILS_SRC)/usleep.h
+discoball.o: $(UTILS_SRC)/visual.h
+discoball.o: $(UTILS_SRC)/yarandom.h
+discoball.o: $(HACK_SRC)/xlockmoreI.h
+discoball.o: $(HACK_SRC)/xlockmore.h
+dnalogo.o: ../../config.h
+dnalogo.o: $(HACK_SRC)/fps.h
+dnalogo.o: $(srcdir)/gltrackball.h
+dnalogo.o: $(srcdir)/normals.h
+dnalogo.o: $(HACK_SRC)/recanim.h
+dnalogo.o: $(srcdir)/rotator.h
+dnalogo.o: $(HACK_SRC)/screenhackI.h
+dnalogo.o: $(srcdir)/sphere.h
+dnalogo.o: $(srcdir)/texfont.h
+dnalogo.o: $(srcdir)/tube.h
+dnalogo.o: $(UTILS_SRC)/colors.h
+dnalogo.o: $(UTILS_SRC)/erase.h
+dnalogo.o: $(UTILS_SRC)/font-retry.h
+dnalogo.o: $(UTILS_SRC)/grabscreen.h
+dnalogo.o: $(UTILS_SRC)/hsv.h
+dnalogo.o: $(UTILS_SRC)/resources.h
+dnalogo.o: $(UTILS_SRC)/usleep.h
+dnalogo.o: $(UTILS_SRC)/utf8wc.h
+dnalogo.o: $(UTILS_SRC)/visual.h
+dnalogo.o: $(UTILS_SRC)/yarandom.h
+dnalogo.o: $(HACK_SRC)/xlockmoreI.h
+dnalogo.o: $(HACK_SRC)/xlockmore.h
+dolphin.o: $(srcdir)/atlantis.h
+dolphin.o: ../../config.h
+dolphin.o: $(HACK_SRC)/fps.h
+dolphin.o: $(HACK_SRC)/recanim.h
+dolphin.o: $(HACK_SRC)/screenhackI.h
+dolphin.o: $(UTILS_SRC)/colors.h
+dolphin.o: $(UTILS_SRC)/font-retry.h
+dolphin.o: $(UTILS_SRC)/grabscreen.h
+dolphin.o: $(UTILS_SRC)/hsv.h
+dolphin.o: $(UTILS_SRC)/resources.h
+dolphin.o: $(UTILS_SRC)/usleep.h
+dolphin.o: $(UTILS_SRC)/visual.h
+dolphin.o: $(UTILS_SRC)/yarandom.h
+dropshadow.o: ../../config.h
+dropshadow.o: $(srcdir)/dropshadow.h
+dropshadow.o: $(HACK_SRC)/fps.h
+dropshadow.o: $(HACK_SRC)/recanim.h
+dropshadow.o: $(HACK_SRC)/screenhackI.h
+dropshadow.o: $(UTILS_SRC)/colors.h
+dropshadow.o: $(UTILS_SRC)/erase.h
+dropshadow.o: $(UTILS_SRC)/font-retry.h
+dropshadow.o: $(UTILS_SRC)/grabscreen.h
+dropshadow.o: $(UTILS_SRC)/hsv.h
+dropshadow.o: $(UTILS_SRC)/resources.h
+dropshadow.o: $(UTILS_SRC)/usleep.h
+dropshadow.o: $(UTILS_SRC)/visual.h
+dropshadow.o: $(UTILS_SRC)/yarandom.h
+dropshadow.o: $(HACK_SRC)/xlockmoreI.h
+dymaxionmap-coords.o: ../../config.h
+dymaxionmap-coords.o: $(srcdir)/dymaxionmap-coords.h
+dymaxionmap.o: ../../config.h
+dymaxionmap.o: $(srcdir)/dymaxionmap-coords.h
+dymaxionmap.o: $(HACK_SRC)/fps.h
+dymaxionmap.o: $(srcdir)/gltrackball.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/earth_flat_png.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/earth_night_png.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/earth_png.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/ground_png.h
+dymaxionmap.o: $(srcdir)/normals.h
+dymaxionmap.o: $(HACK_SRC)/recanim.h
+dymaxionmap.o: $(srcdir)/rotator.h
+dymaxionmap.o: $(HACK_SRC)/screenhackI.h
+dymaxionmap.o: $(srcdir)/sphere.h
+dymaxionmap.o: $(srcdir)/texfont.h
+dymaxionmap.o: $(UTILS_SRC)/colors.h
+dymaxionmap.o: $(UTILS_SRC)/erase.h
+dymaxionmap.o: $(UTILS_SRC)/font-retry.h
+dymaxionmap.o: $(UTILS_SRC)/grabscreen.h
+dymaxionmap.o: $(UTILS_SRC)/hsv.h
+dymaxionmap.o: $(UTILS_SRC)/resources.h
+dymaxionmap.o: $(UTILS_SRC)/usleep.h
+dymaxionmap.o: $(UTILS_SRC)/visual.h
+dymaxionmap.o: $(UTILS_SRC)/yarandom.h
+dymaxionmap.o: $(HACK_SRC)/ximage-loader.h
+dymaxionmap.o: $(HACK_SRC)/xlockmoreI.h
+dymaxionmap.o: $(HACK_SRC)/xlockmore.h
+endgame.o: $(srcdir)/chessgames.h
+endgame.o: $(srcdir)/chessmodels.h
+endgame.o: ../../config.h
+endgame.o: $(HACK_SRC)/fps.h
+endgame.o: $(srcdir)/gltrackball.h
+endgame.o: $(HACK_SRC)/recanim.h
+endgame.o: $(HACK_SRC)/screenhackI.h
+endgame.o: $(UTILS_SRC)/colors.h
+endgame.o: $(UTILS_SRC)/erase.h
+endgame.o: $(UTILS_SRC)/font-retry.h
+endgame.o: $(UTILS_SRC)/grabscreen.h
+endgame.o: $(UTILS_SRC)/hsv.h
+endgame.o: $(UTILS_SRC)/resources.h
+endgame.o: $(UTILS_SRC)/usleep.h
+endgame.o: $(UTILS_SRC)/visual.h
+endgame.o: $(UTILS_SRC)/yarandom.h
+endgame.o: $(HACK_SRC)/xlockmoreI.h
+endgame.o: $(HACK_SRC)/xlockmore.h
+energystream.o: ../../config.h
+energystream.o: $(HACK_SRC)/fps.h
+energystream.o: $(srcdir)/gltrackball.h
+energystream.o: $(HACK_SRC)/recanim.h
+energystream.o: $(srcdir)/rotator.h
+energystream.o: $(HACK_SRC)/screenhackI.h
+energystream.o: $(UTILS_SRC)/colors.h
+energystream.o: $(UTILS_SRC)/erase.h
+energystream.o: $(UTILS_SRC)/font-retry.h
+energystream.o: $(UTILS_SRC)/grabscreen.h
+energystream.o: $(UTILS_SRC)/hsv.h
+energystream.o: $(UTILS_SRC)/resources.h
+energystream.o: $(UTILS_SRC)/usleep.h
+energystream.o: $(UTILS_SRC)/visual.h
+energystream.o: $(UTILS_SRC)/yarandom.h
+energystream.o: $(HACK_SRC)/xlockmoreI.h
+energystream.o: $(HACK_SRC)/xlockmore.h
+engine.o: ../../config.h
+engine.o: $(HACK_SRC)/fps.h
+engine.o: $(srcdir)/gltrackball.h
+engine.o: $(HACK_SRC)/recanim.h
+engine.o: $(srcdir)/rotator.h
+engine.o: $(HACK_SRC)/screenhackI.h
+engine.o: $(srcdir)/texfont.h
+engine.o: $(UTILS_SRC)/colors.h
+engine.o: $(UTILS_SRC)/erase.h
+engine.o: $(UTILS_SRC)/font-retry.h
+engine.o: $(UTILS_SRC)/grabscreen.h
+engine.o: $(UTILS_SRC)/hsv.h
+engine.o: $(UTILS_SRC)/resources.h
+engine.o: $(UTILS_SRC)/usleep.h
+engine.o: $(UTILS_SRC)/visual.h
+engine.o: $(UTILS_SRC)/yarandom.h
+engine.o: $(HACK_SRC)/xlockmoreI.h
+engine.o: $(HACK_SRC)/xlockmore.h
+erase-gl.o: ../../config.h
+erase-gl.o: $(UTILS_SRC)/erase.h
+erase-gl.o: $(UTILS_SRC)/utils.h
+esper.o: ../../config.h
+esper.o: $(HACK_SRC)/fps.h
+esper.o: $(srcdir)/grab-ximage.h
+esper.o: $(HACK_SRC)/recanim.h
+esper.o: $(HACK_SRC)/screenhackI.h
+esper.o: $(srcdir)/texfont.h
+esper.o: $(UTILS_SRC)/colors.h
+esper.o: $(UTILS_SRC)/erase.h
+esper.o: $(UTILS_SRC)/font-retry.h
+esper.o: $(UTILS_SRC)/grabscreen.h
+esper.o: $(UTILS_SRC)/hsv.h
+esper.o: $(UTILS_SRC)/resources.h
+esper.o: $(UTILS_SRC)/usleep.h
+esper.o: $(UTILS_SRC)/visual.h
+esper.o: $(UTILS_SRC)/xshm.h
+esper.o: $(UTILS_SRC)/yarandom.h
+esper.o: $(HACK_SRC)/xlockmoreI.h
+esper.o: $(HACK_SRC)/xlockmore.h
+extrusion-helix2.o: ../../config.h
+extrusion-helix2.o: $(srcdir)/extrusion.h
+extrusion-helix3.o: ../../config.h
+extrusion-helix3.o: $(srcdir)/extrusion.h
+extrusion-helix4.o: ../../config.h
+extrusion-helix4.o: $(srcdir)/extrusion.h
+extrusion-joinoffset.o: ../../config.h
+extrusion-joinoffset.o: $(srcdir)/extrusion.h
+extrusion.o: ../../config.h
+extrusion.o: $(srcdir)/extrusion.h
+extrusion.o: $(HACK_SRC)/fps.h
+extrusion.o: $(srcdir)/gltrackball.h
+extrusion.o: $(HACK_SRC)/recanim.h
+extrusion.o: $(srcdir)/rotator.h
+extrusion.o: $(HACK_SRC)/screenhackI.h
+extrusion.o: $(UTILS_SRC)/colors.h
+extrusion.o: $(UTILS_SRC)/erase.h
+extrusion.o: $(UTILS_SRC)/font-retry.h
+extrusion.o: $(UTILS_SRC)/grabscreen.h
+extrusion.o: $(UTILS_SRC)/hsv.h
+extrusion.o: $(UTILS_SRC)/resources.h
+extrusion.o: $(UTILS_SRC)/usleep.h
+extrusion.o: $(UTILS_SRC)/visual.h
+extrusion.o: $(UTILS_SRC)/yarandom.h
+extrusion.o: $(HACK_SRC)/ximage-loader.h
+extrusion.o: $(HACK_SRC)/xlockmoreI.h
+extrusion.o: $(HACK_SRC)/xlockmore.h
+extrusion-screw.o: ../../config.h
+extrusion-screw.o: $(srcdir)/extrusion.h
+extrusion-taper.o: ../../config.h
+extrusion-taper.o: $(srcdir)/extrusion.h
+extrusion-twistoid.o: ../../config.h
+extrusion-twistoid.o: $(srcdir)/extrusion.h
+flipflop.o: ../../config.h
+flipflop.o: $(HACK_SRC)/fps.h
+flipflop.o: $(srcdir)/gltrackball.h
+flipflop.o: $(srcdir)/grab-ximage.h
+flipflop.o: $(HACK_SRC)/recanim.h
+flipflop.o: $(HACK_SRC)/screenhackI.h
+flipflop.o: $(UTILS_SRC)/colors.h
+flipflop.o: $(UTILS_SRC)/erase.h
+flipflop.o: $(UTILS_SRC)/font-retry.h
+flipflop.o: $(UTILS_SRC)/grabscreen.h
+flipflop.o: $(UTILS_SRC)/hsv.h
+flipflop.o: $(UTILS_SRC)/resources.h
+flipflop.o: $(UTILS_SRC)/usleep.h
+flipflop.o: $(UTILS_SRC)/visual.h
+flipflop.o: $(UTILS_SRC)/yarandom.h
+flipflop.o: $(HACK_SRC)/xlockmoreI.h
+flipflop.o: $(HACK_SRC)/xlockmore.h
+flipscreen3d.o: ../../config.h
+flipscreen3d.o: $(HACK_SRC)/fps.h
+flipscreen3d.o: $(srcdir)/gltrackball.h
+flipscreen3d.o: $(srcdir)/grab-ximage.h
+flipscreen3d.o: $(HACK_SRC)/recanim.h
+flipscreen3d.o: $(HACK_SRC)/screenhackI.h
+flipscreen3d.o: $(UTILS_SRC)/colors.h
+flipscreen3d.o: $(UTILS_SRC)/erase.h
+flipscreen3d.o: $(UTILS_SRC)/font-retry.h
+flipscreen3d.o: $(UTILS_SRC)/grabscreen.h
+flipscreen3d.o: $(UTILS_SRC)/hsv.h
+flipscreen3d.o: $(UTILS_SRC)/resources.h
+flipscreen3d.o: $(UTILS_SRC)/usleep.h
+flipscreen3d.o: $(UTILS_SRC)/visual.h
+flipscreen3d.o: $(UTILS_SRC)/yarandom.h
+flipscreen3d.o: $(HACK_SRC)/xlockmoreI.h
+flipscreen3d.o: $(HACK_SRC)/xlockmore.h
+fliptext.o: ../../config.h
+fliptext.o: $(HACK_SRC)/fps.h
+fliptext.o: $(HACK_SRC)/recanim.h
+fliptext.o: $(HACK_SRC)/screenhackI.h
+fliptext.o: $(srcdir)/texfont.h
+fliptext.o: $(UTILS_SRC)/colors.h
+fliptext.o: $(UTILS_SRC)/erase.h
+fliptext.o: $(UTILS_SRC)/font-retry.h
+fliptext.o: $(UTILS_SRC)/grabscreen.h
+fliptext.o: $(UTILS_SRC)/hsv.h
+fliptext.o: $(UTILS_SRC)/resources.h
+fliptext.o: $(UTILS_SRC)/textclient.h
+fliptext.o: $(UTILS_SRC)/usleep.h
+fliptext.o: $(UTILS_SRC)/visual.h
+fliptext.o: $(UTILS_SRC)/yarandom.h
+fliptext.o: $(HACK_SRC)/xlockmoreI.h
+fliptext.o: $(HACK_SRC)/xlockmore.h
+flurry.o: ../../config.h
+flurry.o: $(srcdir)/flurry.h
+flurry.o: $(HACK_SRC)/fps.h
+flurry.o: $(srcdir)/gltrackball.h
+flurry.o: $(HACK_SRC)/recanim.h
+flurry.o: $(srcdir)/rotator.h
+flurry.o: $(HACK_SRC)/screenhackI.h
+flurry.o: $(UTILS_SRC)/colors.h
+flurry.o: $(UTILS_SRC)/erase.h
+flurry.o: $(UTILS_SRC)/font-retry.h
+flurry.o: $(UTILS_SRC)/grabscreen.h
+flurry.o: $(UTILS_SRC)/hsv.h
+flurry.o: $(UTILS_SRC)/resources.h
+flurry.o: $(UTILS_SRC)/usleep.h
+flurry.o: $(UTILS_SRC)/visual.h
+flurry.o: $(UTILS_SRC)/yarandom.h
+flurry.o: $(HACK_SRC)/xlockmoreI.h
+flurry.o: $(HACK_SRC)/xlockmore.h
+flurry-smoke.o: ../../config.h
+flurry-smoke.o: $(srcdir)/flurry.h
+flurry-smoke.o: $(srcdir)/gltrackball.h
+flurry-smoke.o: $(srcdir)/rotator.h
+flurry-smoke.o: $(UTILS_SRC)/yarandom.h
+flurry-spark.o: ../../config.h
+flurry-spark.o: $(srcdir)/flurry.h
+flurry-spark.o: $(srcdir)/gltrackball.h
+flurry-spark.o: $(srcdir)/rotator.h
+flurry-spark.o: $(UTILS_SRC)/yarandom.h
+flurry-star.o: ../../config.h
+flurry-star.o: $(srcdir)/flurry.h
+flurry-star.o: $(srcdir)/gltrackball.h
+flurry-star.o: $(srcdir)/rotator.h
+flurry-star.o: $(UTILS_SRC)/yarandom.h
+flurry-texture.o: ../../config.h
+flurry-texture.o: $(srcdir)/flurry.h
+flurry-texture.o: $(srcdir)/gltrackball.h
+flurry-texture.o: $(srcdir)/rotator.h
+flurry-texture.o: $(UTILS_SRC)/yarandom.h
+flyingtoasters.o: ../../config.h
+flyingtoasters.o: $(HACK_SRC)/fps.h
+flyingtoasters.o: $(srcdir)/gllist.h
+flyingtoasters.o: $(srcdir)/gltrackball.h
+flyingtoasters.o: $(HACK_SRC)/images/gen/chromesphere_png.h
+flyingtoasters.o: $(HACK_SRC)/images/gen/toast_png.h
+flyingtoasters.o: $(HACK_SRC)/recanim.h
+flyingtoasters.o: $(HACK_SRC)/screenhackI.h
+flyingtoasters.o: $(UTILS_SRC)/colors.h
+flyingtoasters.o: $(UTILS_SRC)/erase.h
+flyingtoasters.o: $(UTILS_SRC)/font-retry.h
+flyingtoasters.o: $(UTILS_SRC)/grabscreen.h
+flyingtoasters.o: $(UTILS_SRC)/hsv.h
+flyingtoasters.o: $(UTILS_SRC)/resources.h
+flyingtoasters.o: $(UTILS_SRC)/usleep.h
+flyingtoasters.o: $(UTILS_SRC)/visual.h
+flyingtoasters.o: $(UTILS_SRC)/yarandom.h
+flyingtoasters.o: $(HACK_SRC)/ximage-loader.h
+flyingtoasters.o: $(HACK_SRC)/xlockmoreI.h
+flyingtoasters.o: $(HACK_SRC)/xlockmore.h
+fps-gl.o: ../../config.h
+fps-gl.o: $(HACK_SRC)/fpsI.h
+fps-gl.o: $(HACK_SRC)/fps.h
+fps-gl.o: $(HACK_SRC)/recanim.h
+fps-gl.o: $(HACK_SRC)/screenhackI.h
+fps-gl.o: $(srcdir)/texfont.h
+fps-gl.o: $(UTILS_SRC)/colors.h
+fps-gl.o: $(UTILS_SRC)/erase.h
+fps-gl.o: $(UTILS_SRC)/font-retry.h
+fps-gl.o: $(UTILS_SRC)/grabscreen.h
+fps-gl.o: $(UTILS_SRC)/hsv.h
+fps-gl.o: $(UTILS_SRC)/resources.h
+fps-gl.o: $(UTILS_SRC)/usleep.h
+fps-gl.o: $(UTILS_SRC)/visual.h
+fps-gl.o: $(UTILS_SRC)/yarandom.h
+fps-gl.o: $(HACK_SRC)/xlockmoreI.h
+gears.o: ../../config.h
+gears.o: $(HACK_SRC)/fps.h
+gears.o: $(srcdir)/gltrackball.h
+gears.o: $(srcdir)/involute.h
+gears.o: $(srcdir)/normals.h
+gears.o: $(HACK_SRC)/recanim.h
+gears.o: $(srcdir)/rotator.h
+gears.o: $(HACK_SRC)/screenhackI.h
+gears.o: $(srcdir)/tube.h
+gears.o: $(UTILS_SRC)/colors.h
+gears.o: $(UTILS_SRC)/erase.h
+gears.o: $(UTILS_SRC)/font-retry.h
+gears.o: $(UTILS_SRC)/grabscreen.h
+gears.o: $(UTILS_SRC)/hsv.h
+gears.o: $(UTILS_SRC)/resources.h
+gears.o: $(UTILS_SRC)/usleep.h
+gears.o: $(UTILS_SRC)/visual.h
+gears.o: $(UTILS_SRC)/yarandom.h
+gears.o: $(HACK_SRC)/xlockmoreI.h
+gears.o: $(HACK_SRC)/xlockmore.h
+geodesicgears.o: ../../config.h
+geodesicgears.o: $(HACK_SRC)/fps.h
+geodesicgears.o: $(srcdir)/gllist.h
+geodesicgears.o: $(srcdir)/gltrackball.h
+geodesicgears.o: $(srcdir)/involute.h
+geodesicgears.o: $(srcdir)/normals.h
+geodesicgears.o: $(HACK_SRC)/recanim.h
+geodesicgears.o: $(srcdir)/rotator.h
+geodesicgears.o: $(HACK_SRC)/screenhackI.h
+geodesicgears.o: $(srcdir)/texfont.h
+geodesicgears.o: $(UTILS_SRC)/colors.h
+geodesicgears.o: $(UTILS_SRC)/erase.h
+geodesicgears.o: $(UTILS_SRC)/font-retry.h
+geodesicgears.o: $(UTILS_SRC)/grabscreen.h
+geodesicgears.o: $(UTILS_SRC)/hsv.h
+geodesicgears.o: $(UTILS_SRC)/resources.h
+geodesicgears.o: $(UTILS_SRC)/usleep.h
+geodesicgears.o: $(UTILS_SRC)/visual.h
+geodesicgears.o: $(UTILS_SRC)/yarandom.h
+geodesicgears.o: $(HACK_SRC)/xlockmoreI.h
+geodesicgears.o: $(HACK_SRC)/xlockmore.h
+geodesic.o: ../../config.h
+geodesic.o: $(HACK_SRC)/fps.h
+geodesic.o: $(srcdir)/gllist.h
+geodesic.o: $(srcdir)/gltrackball.h
+geodesic.o: $(srcdir)/normals.h
+geodesic.o: $(HACK_SRC)/recanim.h
+geodesic.o: $(srcdir)/rotator.h
+geodesic.o: $(HACK_SRC)/screenhackI.h
+geodesic.o: $(UTILS_SRC)/colors.h
+geodesic.o: $(UTILS_SRC)/erase.h
+geodesic.o: $(UTILS_SRC)/font-retry.h
+geodesic.o: $(UTILS_SRC)/grabscreen.h
+geodesic.o: $(UTILS_SRC)/hsv.h
+geodesic.o: $(UTILS_SRC)/resources.h
+geodesic.o: $(UTILS_SRC)/usleep.h
+geodesic.o: $(UTILS_SRC)/visual.h
+geodesic.o: $(UTILS_SRC)/yarandom.h
+geodesic.o: $(HACK_SRC)/xlockmoreI.h
+geodesic.o: $(HACK_SRC)/xlockmore.h
+gflux.o: ../../config.h
+gflux.o: $(HACK_SRC)/fps.h
+gflux.o: $(srcdir)/gltrackball.h
+gflux.o: $(srcdir)/grab-ximage.h
+gflux.o: $(HACK_SRC)/recanim.h
+gflux.o: $(HACK_SRC)/screenhackI.h
+gflux.o: $(UTILS_SRC)/colors.h
+gflux.o: $(UTILS_SRC)/erase.h
+gflux.o: $(UTILS_SRC)/font-retry.h
+gflux.o: $(UTILS_SRC)/grabscreen.h
+gflux.o: $(UTILS_SRC)/hsv.h
+gflux.o: $(UTILS_SRC)/resources.h
+gflux.o: $(UTILS_SRC)/usleep.h
+gflux.o: $(UTILS_SRC)/visual.h
+gflux.o: $(UTILS_SRC)/yarandom.h
+gflux.o: $(HACK_SRC)/xlockmoreI.h
+gflux.o: $(HACK_SRC)/xlockmore.h
+glblur.o: ../../config.h
+glblur.o: $(HACK_SRC)/fps.h
+glblur.o: $(srcdir)/gltrackball.h
+glblur.o: $(HACK_SRC)/recanim.h
+glblur.o: $(srcdir)/rotator.h
+glblur.o: $(HACK_SRC)/screenhackI.h
+glblur.o: $(UTILS_SRC)/colors.h
+glblur.o: $(UTILS_SRC)/erase.h
+glblur.o: $(UTILS_SRC)/font-retry.h
+glblur.o: $(UTILS_SRC)/grabscreen.h
+glblur.o: $(UTILS_SRC)/hsv.h
+glblur.o: $(UTILS_SRC)/resources.h
+glblur.o: $(UTILS_SRC)/usleep.h
+glblur.o: $(UTILS_SRC)/visual.h
+glblur.o: $(UTILS_SRC)/yarandom.h
+glblur.o: $(HACK_SRC)/xlockmoreI.h
+glblur.o: $(HACK_SRC)/xlockmore.h
+glcells.o: ../../config.h
+glcells.o: $(HACK_SRC)/fps.h
+glcells.o: $(HACK_SRC)/recanim.h
+glcells.o: $(HACK_SRC)/screenhackI.h
+glcells.o: $(UTILS_SRC)/colors.h
+glcells.o: $(UTILS_SRC)/erase.h
+glcells.o: $(UTILS_SRC)/font-retry.h
+glcells.o: $(UTILS_SRC)/grabscreen.h
+glcells.o: $(UTILS_SRC)/hsv.h
+glcells.o: $(UTILS_SRC)/resources.h
+glcells.o: $(UTILS_SRC)/usleep.h
+glcells.o: $(UTILS_SRC)/visual.h
+glcells.o: $(UTILS_SRC)/yarandom.h
+glcells.o: $(HACK_SRC)/xlockmoreI.h
+glcells.o: $(HACK_SRC)/xlockmore.h
+gleidescope.o: ../../config.h
+gleidescope.o: $(HACK_SRC)/fps.h
+gleidescope.o: $(srcdir)/grab-ximage.h
+gleidescope.o: $(HACK_SRC)/recanim.h
+gleidescope.o: $(HACK_SRC)/screenhackI.h
+gleidescope.o: $(UTILS_SRC)/colors.h
+gleidescope.o: $(UTILS_SRC)/erase.h
+gleidescope.o: $(UTILS_SRC)/font-retry.h
+gleidescope.o: $(UTILS_SRC)/grabscreen.h
+gleidescope.o: $(UTILS_SRC)/hsv.h
+gleidescope.o: $(UTILS_SRC)/resources.h
+gleidescope.o: $(UTILS_SRC)/usleep.h
+gleidescope.o: $(UTILS_SRC)/visual.h
+gleidescope.o: $(UTILS_SRC)/yarandom.h
+gleidescope.o: $(HACK_SRC)/ximage-loader.h
+gleidescope.o: $(HACK_SRC)/xlockmoreI.h
+gleidescope.o: $(HACK_SRC)/xlockmore.h
+glforestfire.o: ../../config.h
+glforestfire.o: $(HACK_SRC)/fps.h
+glforestfire.o: $(srcdir)/gltrackball.h
+glforestfire.o: $(HACK_SRC)/images/gen/ground_png.h
+glforestfire.o: $(HACK_SRC)/images/gen/tree_png.h
+glforestfire.o: $(HACK_SRC)/recanim.h
+glforestfire.o: $(HACK_SRC)/screenhackI.h
+glforestfire.o: $(UTILS_SRC)/colors.h
+glforestfire.o: $(UTILS_SRC)/erase.h
+glforestfire.o: $(UTILS_SRC)/font-retry.h
+glforestfire.o: $(UTILS_SRC)/grabscreen.h
+glforestfire.o: $(UTILS_SRC)/hsv.h
+glforestfire.o: $(UTILS_SRC)/resources.h
+glforestfire.o: $(UTILS_SRC)/usleep.h
+glforestfire.o: $(UTILS_SRC)/visual.h
+glforestfire.o: $(UTILS_SRC)/yarandom.h
+glforestfire.o: $(HACK_SRC)/ximage-loader.h
+glforestfire.o: $(HACK_SRC)/xlockmoreI.h
+glforestfire.o: $(HACK_SRC)/xlockmore.h
+glhanoi.o: ../../config.h
+glhanoi.o: $(HACK_SRC)/fps.h
+glhanoi.o: $(HACK_SRC)/recanim.h
+glhanoi.o: $(srcdir)/rotator.h
+glhanoi.o: $(HACK_SRC)/screenhackI.h
+glhanoi.o: $(UTILS_SRC)/colors.h
+glhanoi.o: $(UTILS_SRC)/erase.h
+glhanoi.o: $(UTILS_SRC)/font-retry.h
+glhanoi.o: $(UTILS_SRC)/grabscreen.h
+glhanoi.o: $(UTILS_SRC)/hsv.h
+glhanoi.o: $(UTILS_SRC)/resources.h
+glhanoi.o: $(UTILS_SRC)/usleep.h
+glhanoi.o: $(UTILS_SRC)/visual.h
+glhanoi.o: $(UTILS_SRC)/yarandom.h
+glhanoi.o: $(HACK_SRC)/xlockmoreI.h
+glhanoi.o: $(HACK_SRC)/xlockmore.h
+glknots.o: ../../config.h
+glknots.o: $(HACK_SRC)/fps.h
+glknots.o: $(srcdir)/gltrackball.h
+glknots.o: $(HACK_SRC)/recanim.h
+glknots.o: $(srcdir)/rotator.h
+glknots.o: $(HACK_SRC)/screenhackI.h
+glknots.o: $(srcdir)/tube.h
+glknots.o: $(UTILS_SRC)/colors.h
+glknots.o: $(UTILS_SRC)/erase.h
+glknots.o: $(UTILS_SRC)/font-retry.h
+glknots.o: $(UTILS_SRC)/grabscreen.h
+glknots.o: $(UTILS_SRC)/hsv.h
+glknots.o: $(UTILS_SRC)/resources.h
+glknots.o: $(UTILS_SRC)/usleep.h
+glknots.o: $(UTILS_SRC)/visual.h
+glknots.o: $(UTILS_SRC)/yarandom.h
+glknots.o: $(HACK_SRC)/xlockmoreI.h
+glknots.o: $(HACK_SRC)/xlockmore.h
+gllist.o: ../../config.h
+gllist.o: $(srcdir)/gllist.h
+glmatrix.o: ../../config.h
+glmatrix.o: $(HACK_SRC)/fps.h
+glmatrix.o: $(HACK_SRC)/images/gen/matrix3_png.h
+glmatrix.o: $(HACK_SRC)/recanim.h
+glmatrix.o: $(HACK_SRC)/screenhackI.h
+glmatrix.o: $(UTILS_SRC)/colors.h
+glmatrix.o: $(UTILS_SRC)/erase.h
+glmatrix.o: $(UTILS_SRC)/font-retry.h
+glmatrix.o: $(UTILS_SRC)/grabscreen.h
+glmatrix.o: $(UTILS_SRC)/hsv.h
+glmatrix.o: $(UTILS_SRC)/resources.h
+glmatrix.o: $(UTILS_SRC)/usleep.h
+glmatrix.o: $(UTILS_SRC)/visual.h
+glmatrix.o: $(UTILS_SRC)/yarandom.h
+glmatrix.o: $(HACK_SRC)/ximage-loader.h
+glmatrix.o: $(HACK_SRC)/xlockmoreI.h
+glmatrix.o: $(HACK_SRC)/xlockmore.h
+glplanet.o: ../../config.h
+glplanet.o: $(HACK_SRC)/fps.h
+glplanet.o: $(srcdir)/gltrackball.h
+glplanet.o: $(HACK_SRC)/images/gen/earth_night_png.h
+glplanet.o: $(HACK_SRC)/images/gen/earth_png.h
+glplanet.o: $(HACK_SRC)/recanim.h
+glplanet.o: $(srcdir)/rotator.h
+glplanet.o: $(HACK_SRC)/screenhackI.h
+glplanet.o: $(srcdir)/sphere.h
+glplanet.o: $(UTILS_SRC)/colors.h
+glplanet.o: $(UTILS_SRC)/erase.h
+glplanet.o: $(UTILS_SRC)/font-retry.h
+glplanet.o: $(UTILS_SRC)/grabscreen.h
+glplanet.o: $(UTILS_SRC)/hsv.h
+glplanet.o: $(UTILS_SRC)/resources.h
+glplanet.o: $(UTILS_SRC)/usleep.h
+glplanet.o: $(UTILS_SRC)/visual.h
+glplanet.o: $(UTILS_SRC)/yarandom.h
+glplanet.o: $(HACK_SRC)/ximage-loader.h
+glplanet.o: $(HACK_SRC)/xlockmoreI.h
+glplanet.o: $(HACK_SRC)/xlockmore.h
+glschool_alg.o: ../../config.h
+glschool_alg.o: $(srcdir)/glschool_alg.h
+glschool_alg.o: $(UTILS_SRC)/yarandom.h
+glschool_gl.o: ../../config.h
+glschool_gl.o: $(srcdir)/glschool_alg.h
+glschool_gl.o: $(srcdir)/glschool_gl.h
+glschool_gl.o: $(srcdir)/sphere.h
+glschool_gl.o: $(srcdir)/tube.h
+glschool.o: ../../config.h
+glschool.o: $(HACK_SRC)/fps.h
+glschool.o: $(srcdir)/glschool_alg.h
+glschool.o: $(srcdir)/glschool_gl.h
+glschool.o: $(srcdir)/glschool.h
+glschool.o: $(HACK_SRC)/recanim.h
+glschool.o: $(HACK_SRC)/screenhackI.h
+glschool.o: $(UTILS_SRC)/colors.h
+glschool.o: $(UTILS_SRC)/erase.h
+glschool.o: $(UTILS_SRC)/font-retry.h
+glschool.o: $(UTILS_SRC)/grabscreen.h
+glschool.o: $(UTILS_SRC)/hsv.h
+glschool.o: $(UTILS_SRC)/resources.h
+glschool.o: $(UTILS_SRC)/usleep.h
+glschool.o: $(UTILS_SRC)/visual.h
+glschool.o: $(UTILS_SRC)/yarandom.h
+glschool.o: $(HACK_SRC)/xlockmoreI.h
+glschool.o: $(HACK_SRC)/xlockmore.h
+glslideshow.o: ../../config.h
+glslideshow.o: $(HACK_SRC)/fps.h
+glslideshow.o: $(srcdir)/grab-ximage.h
+glslideshow.o: $(HACK_SRC)/recanim.h
+glslideshow.o: $(HACK_SRC)/screenhackI.h
+glslideshow.o: $(srcdir)/texfont.h
+glslideshow.o: $(UTILS_SRC)/colors.h
+glslideshow.o: $(UTILS_SRC)/erase.h
+glslideshow.o: $(UTILS_SRC)/font-retry.h
+glslideshow.o: $(UTILS_SRC)/grabscreen.h
+glslideshow.o: $(UTILS_SRC)/hsv.h
+glslideshow.o: $(UTILS_SRC)/resources.h
+glslideshow.o: $(UTILS_SRC)/usleep.h
+glslideshow.o: $(UTILS_SRC)/visual.h
+glslideshow.o: $(UTILS_SRC)/yarandom.h
+glslideshow.o: $(HACK_SRC)/xlockmoreI.h
+glslideshow.o: $(HACK_SRC)/xlockmore.h
+glsnake.o: ../../config.h
+glsnake.o: $(HACK_SRC)/fps.h
+glsnake.o: $(HACK_SRC)/recanim.h
+glsnake.o: $(HACK_SRC)/screenhackI.h
+glsnake.o: $(srcdir)/texfont.h
+glsnake.o: $(UTILS_SRC)/colors.h
+glsnake.o: $(UTILS_SRC)/erase.h
+glsnake.o: $(UTILS_SRC)/font-retry.h
+glsnake.o: $(UTILS_SRC)/grabscreen.h
+glsnake.o: $(UTILS_SRC)/hsv.h
+glsnake.o: $(UTILS_SRC)/resources.h
+glsnake.o: $(UTILS_SRC)/usleep.h
+glsnake.o: $(UTILS_SRC)/visual.h
+glsnake.o: $(UTILS_SRC)/yarandom.h
+glsnake.o: $(HACK_SRC)/xlockmoreI.h
+glsnake.o: $(HACK_SRC)/xlockmore.h
+gltext.o: ../../config.h
+gltext.o: $(HACK_SRC)/fps.h
+gltext.o: $(srcdir)/gltrackball.h
+gltext.o: $(srcdir)/glut_mroman.h
+gltext.o: $(srcdir)/glut_roman.h
+gltext.o: $(srcdir)/glutstroke.h
+gltext.o: $(HACK_SRC)/recanim.h
+gltext.o: $(srcdir)/rotator.h
+gltext.o: $(HACK_SRC)/screenhackI.h
+gltext.o: $(srcdir)/sphere.h
+gltext.o: $(srcdir)/tube.h
+gltext.o: $(UTILS_SRC)/colors.h
+gltext.o: $(UTILS_SRC)/erase.h
+gltext.o: $(UTILS_SRC)/font-retry.h
+gltext.o: $(UTILS_SRC)/grabscreen.h
+gltext.o: $(UTILS_SRC)/hsv.h
+gltext.o: $(UTILS_SRC)/resources.h
+gltext.o: $(UTILS_SRC)/textclient.h
+gltext.o: $(UTILS_SRC)/usleep.h
+gltext.o: $(UTILS_SRC)/utf8wc.h
+gltext.o: $(UTILS_SRC)/visual.h
+gltext.o: $(UTILS_SRC)/yarandom.h
+gltext.o: $(HACK_SRC)/xlockmoreI.h
+gltext.o: $(HACK_SRC)/xlockmore.h
+gltrackball.o: ../../config.h
+gltrackball.o: $(srcdir)/gltrackball.h
+gltrackball.o: $(srcdir)/trackball.h
+glut_stroke.o: ../../config.h
+glut_stroke.o: $(srcdir)/glutstroke.h
+glut_swidth.o: ../../config.h
+glut_swidth.o: $(srcdir)/glutstroke.h
+grab-ximage.o: ../../config.h
+grab-ximage.o: $(srcdir)/grab-ximage.h
+grab-ximage.o: $(UTILS_SRC)/grabscreen.h
+grab-ximage.o: $(UTILS_SRC)/pow2.h
+grab-ximage.o: $(UTILS_SRC)/visual.h
+grab-ximage.o: $(UTILS_SRC)/xshm.h
+hexstrut.o: ../../config.h
+hexstrut.o: $(HACK_SRC)/fps.h
+hexstrut.o: $(srcdir)/gltrackball.h
+hexstrut.o: $(srcdir)/normals.h
+hexstrut.o: $(HACK_SRC)/recanim.h
+hexstrut.o: $(srcdir)/rotator.h
+hexstrut.o: $(HACK_SRC)/screenhackI.h
+hexstrut.o: $(UTILS_SRC)/colors.h
+hexstrut.o: $(UTILS_SRC)/erase.h
+hexstrut.o: $(UTILS_SRC)/font-retry.h
+hexstrut.o: $(UTILS_SRC)/grabscreen.h
+hexstrut.o: $(UTILS_SRC)/hsv.h
+hexstrut.o: $(UTILS_SRC)/resources.h
+hexstrut.o: $(UTILS_SRC)/usleep.h
+hexstrut.o: $(UTILS_SRC)/visual.h
+hexstrut.o: $(UTILS_SRC)/yarandom.h
+hexstrut.o: $(HACK_SRC)/xlockmoreI.h
+hexstrut.o: $(HACK_SRC)/xlockmore.h
+hilbert.o: ../../config.h
+hilbert.o: $(HACK_SRC)/fps.h
+hilbert.o: $(srcdir)/gltrackball.h
+hilbert.o: $(HACK_SRC)/recanim.h
+hilbert.o: $(srcdir)/rotator.h
+hilbert.o: $(HACK_SRC)/screenhackI.h
+hilbert.o: $(srcdir)/sphere.h
+hilbert.o: $(srcdir)/tube.h
+hilbert.o: $(UTILS_SRC)/colors.h
+hilbert.o: $(UTILS_SRC)/erase.h
+hilbert.o: $(UTILS_SRC)/font-retry.h
+hilbert.o: $(UTILS_SRC)/grabscreen.h
+hilbert.o: $(UTILS_SRC)/hsv.h
+hilbert.o: $(UTILS_SRC)/resources.h
+hilbert.o: $(UTILS_SRC)/usleep.h
+hilbert.o: $(UTILS_SRC)/visual.h
+hilbert.o: $(UTILS_SRC)/yarandom.h
+hilbert.o: $(HACK_SRC)/xlockmoreI.h
+hilbert.o: $(HACK_SRC)/xlockmore.h
+hydrostat.o: ../../config.h
+hydrostat.o: $(HACK_SRC)/fps.h
+hydrostat.o: $(srcdir)/gltrackball.h
+hydrostat.o: $(srcdir)/normals.h
+hydrostat.o: $(HACK_SRC)/recanim.h
+hydrostat.o: $(HACK_SRC)/screenhackI.h
+hydrostat.o: $(srcdir)/sphere.h
+hydrostat.o: $(UTILS_SRC)/colors.h
+hydrostat.o: $(UTILS_SRC)/erase.h
+hydrostat.o: $(UTILS_SRC)/font-retry.h
+hydrostat.o: $(UTILS_SRC)/grabscreen.h
+hydrostat.o: $(UTILS_SRC)/hsv.h
+hydrostat.o: $(UTILS_SRC)/resources.h
+hydrostat.o: $(UTILS_SRC)/usleep.h
+hydrostat.o: $(UTILS_SRC)/visual.h
+hydrostat.o: $(UTILS_SRC)/yarandom.h
+hydrostat.o: $(HACK_SRC)/xlockmoreI.h
+hydrostat.o: $(HACK_SRC)/xlockmore.h
+hypertorus.o: ../../config.h
+hypertorus.o: $(HACK_SRC)/fps.h
+hypertorus.o: $(srcdir)/gltrackball.h
+hypertorus.o: $(HACK_SRC)/recanim.h
+hypertorus.o: $(HACK_SRC)/screenhackI.h
+hypertorus.o: $(UTILS_SRC)/colors.h
+hypertorus.o: $(UTILS_SRC)/erase.h
+hypertorus.o: $(UTILS_SRC)/font-retry.h
+hypertorus.o: $(UTILS_SRC)/grabscreen.h
+hypertorus.o: $(UTILS_SRC)/hsv.h
+hypertorus.o: $(UTILS_SRC)/resources.h
+hypertorus.o: $(UTILS_SRC)/usleep.h
+hypertorus.o: $(UTILS_SRC)/visual.h
+hypertorus.o: $(UTILS_SRC)/yarandom.h
+hypertorus.o: $(HACK_SRC)/xlockmoreI.h
+hypertorus.o: $(HACK_SRC)/xlockmore.h
+hypnowheel.o: ../../config.h
+hypnowheel.o: $(HACK_SRC)/fps.h
+hypnowheel.o: $(HACK_SRC)/recanim.h
+hypnowheel.o: $(srcdir)/rotator.h
+hypnowheel.o: $(HACK_SRC)/screenhackI.h
+hypnowheel.o: $(UTILS_SRC)/colors.h
+hypnowheel.o: $(UTILS_SRC)/erase.h
+hypnowheel.o: $(UTILS_SRC)/font-retry.h
+hypnowheel.o: $(UTILS_SRC)/grabscreen.h
+hypnowheel.o: $(UTILS_SRC)/hsv.h
+hypnowheel.o: $(UTILS_SRC)/resources.h
+hypnowheel.o: $(UTILS_SRC)/usleep.h
+hypnowheel.o: $(UTILS_SRC)/visual.h
+hypnowheel.o: $(UTILS_SRC)/yarandom.h
+hypnowheel.o: $(HACK_SRC)/xlockmoreI.h
+hypnowheel.o: $(HACK_SRC)/xlockmore.h
+involute.o: ../../config.h
+involute.o: $(HACK_SRC)/fps.h
+involute.o: $(srcdir)/involute.h
+involute.o: $(srcdir)/normals.h
+involute.o: $(HACK_SRC)/recanim.h
+involute.o: $(HACK_SRC)/screenhackI.h
+involute.o: $(UTILS_SRC)/colors.h
+involute.o: $(UTILS_SRC)/font-retry.h
+involute.o: $(UTILS_SRC)/grabscreen.h
+involute.o: $(UTILS_SRC)/hsv.h
+involute.o: $(UTILS_SRC)/resources.h
+involute.o: $(UTILS_SRC)/usleep.h
+involute.o: $(UTILS_SRC)/visual.h
+involute.o: $(UTILS_SRC)/yarandom.h
+jigglypuff.o: ../../config.h
+jigglypuff.o: $(HACK_SRC)/fps.h
+jigglypuff.o: $(srcdir)/gltrackball.h
+jigglypuff.o: $(HACK_SRC)/images/gen/jigglymap_png.h
+jigglypuff.o: $(HACK_SRC)/recanim.h
+jigglypuff.o: $(HACK_SRC)/screenhackI.h
+jigglypuff.o: $(UTILS_SRC)/colors.h
+jigglypuff.o: $(UTILS_SRC)/erase.h
+jigglypuff.o: $(UTILS_SRC)/font-retry.h
+jigglypuff.o: $(UTILS_SRC)/grabscreen.h
+jigglypuff.o: $(UTILS_SRC)/hsv.h
+jigglypuff.o: $(UTILS_SRC)/resources.h
+jigglypuff.o: $(UTILS_SRC)/usleep.h
+jigglypuff.o: $(UTILS_SRC)/visual.h
+jigglypuff.o: $(UTILS_SRC)/yarandom.h
+jigglypuff.o: $(HACK_SRC)/ximage-loader.h
+jigglypuff.o: $(HACK_SRC)/xlockmoreI.h
+jigglypuff.o: $(HACK_SRC)/xlockmore.h
+jigsaw.o: ../../config.h
+jigsaw.o: $(HACK_SRC)/fps.h
+jigsaw.o: $(srcdir)/gltrackball.h
+jigsaw.o: $(srcdir)/grab-ximage.h
+jigsaw.o: $(srcdir)/normals.h
+jigsaw.o: $(HACK_SRC)/recanim.h
+jigsaw.o: $(srcdir)/rotator.h
+jigsaw.o: $(HACK_SRC)/screenhackI.h
+jigsaw.o: $(srcdir)/texfont.h
+jigsaw.o: $(UTILS_SRC)/colors.h
+jigsaw.o: $(UTILS_SRC)/erase.h
+jigsaw.o: $(UTILS_SRC)/font-retry.h
+jigsaw.o: $(UTILS_SRC)/grabscreen.h
+jigsaw.o: $(UTILS_SRC)/hsv.h
+jigsaw.o: $(UTILS_SRC)/resources.h
+jigsaw.o: $(UTILS_SRC)/spline.h
+jigsaw.o: $(UTILS_SRC)/usleep.h
+jigsaw.o: $(UTILS_SRC)/visual.h
+jigsaw.o: $(UTILS_SRC)/yarandom.h
+jigsaw.o: $(HACK_SRC)/xlockmoreI.h
+jigsaw.o: $(HACK_SRC)/xlockmore.h
+juggler3d.o: ../../config.h
+juggler3d.o: $(HACK_SRC)/fps.h
+juggler3d.o: $(srcdir)/gltrackball.h
+juggler3d.o: $(HACK_SRC)/recanim.h
+juggler3d.o: $(srcdir)/rotator.h
+juggler3d.o: $(HACK_SRC)/screenhackI.h
+juggler3d.o: $(srcdir)/sphere.h
+juggler3d.o: $(srcdir)/texfont.h
+juggler3d.o: $(srcdir)/tube.h
+juggler3d.o: $(UTILS_SRC)/colors.h
+juggler3d.o: $(UTILS_SRC)/erase.h
+juggler3d.o: $(UTILS_SRC)/font-retry.h
+juggler3d.o: $(UTILS_SRC)/grabscreen.h
+juggler3d.o: $(UTILS_SRC)/hsv.h
+juggler3d.o: $(UTILS_SRC)/resources.h
+juggler3d.o: $(UTILS_SRC)/usleep.h
+juggler3d.o: $(UTILS_SRC)/visual.h
+juggler3d.o: $(UTILS_SRC)/yarandom.h
+juggler3d.o: $(HACK_SRC)/xlockmoreI.h
+juggler3d.o: $(HACK_SRC)/xlockmore.h
+kaleidocycle.o: ../../config.h
+kaleidocycle.o: $(HACK_SRC)/fps.h
+kaleidocycle.o: $(srcdir)/gltrackball.h
+kaleidocycle.o: $(srcdir)/normals.h
+kaleidocycle.o: $(HACK_SRC)/recanim.h
+kaleidocycle.o: $(srcdir)/rotator.h
+kaleidocycle.o: $(HACK_SRC)/screenhackI.h
+kaleidocycle.o: $(UTILS_SRC)/colors.h
+kaleidocycle.o: $(UTILS_SRC)/erase.h
+kaleidocycle.o: $(UTILS_SRC)/font-retry.h
+kaleidocycle.o: $(UTILS_SRC)/grabscreen.h
+kaleidocycle.o: $(UTILS_SRC)/hsv.h
+kaleidocycle.o: $(UTILS_SRC)/resources.h
+kaleidocycle.o: $(UTILS_SRC)/usleep.h
+kaleidocycle.o: $(UTILS_SRC)/visual.h
+kaleidocycle.o: $(UTILS_SRC)/yarandom.h
+kaleidocycle.o: $(HACK_SRC)/xlockmoreI.h
+kaleidocycle.o: $(HACK_SRC)/xlockmore.h
+klein.o: ../../config.h
+klein.o: $(srcdir)/curlicue.h
+klein.o: $(HACK_SRC)/fps.h
+klein.o: $(srcdir)/gltrackball.h
+klein.o: $(HACK_SRC)/recanim.h
+klein.o: $(HACK_SRC)/screenhackI.h
+klein.o: $(UTILS_SRC)/colors.h
+klein.o: $(UTILS_SRC)/erase.h
+klein.o: $(UTILS_SRC)/font-retry.h
+klein.o: $(UTILS_SRC)/grabscreen.h
+klein.o: $(UTILS_SRC)/hsv.h
+klein.o: $(UTILS_SRC)/resources.h
+klein.o: $(UTILS_SRC)/usleep.h
+klein.o: $(UTILS_SRC)/visual.h
+klein.o: $(UTILS_SRC)/yarandom.h
+klein.o: $(HACK_SRC)/xlockmoreI.h
+klein.o: $(HACK_SRC)/xlockmore.h
+lament_model.o: ../../config.h
+lament_model.o: $(srcdir)/gllist.h
+lament.o: ../../config.h
+lament.o: $(HACK_SRC)/fps.h
+lament.o: $(srcdir)/gllist.h
+lament.o: $(srcdir)/gltrackball.h
+lament.o: $(HACK_SRC)/images/gen/lament512_png.h
+lament.o: $(srcdir)/normals.h
+lament.o: $(HACK_SRC)/recanim.h
+lament.o: $(srcdir)/rotator.h
+lament.o: $(HACK_SRC)/screenhackI.h
+lament.o: $(UTILS_SRC)/colors.h
+lament.o: $(UTILS_SRC)/erase.h
+lament.o: $(UTILS_SRC)/font-retry.h
+lament.o: $(UTILS_SRC)/grabscreen.h
+lament.o: $(UTILS_SRC)/hsv.h
+lament.o: $(UTILS_SRC)/resources.h
+lament.o: $(UTILS_SRC)/usleep.h
+lament.o: $(UTILS_SRC)/visual.h
+lament.o: $(UTILS_SRC)/yarandom.h
+lament.o: $(HACK_SRC)/ximage-loader.h
+lament.o: $(HACK_SRC)/xlockmoreI.h
+lament.o: $(HACK_SRC)/xlockmore.h
+lavalite.o: ../../config.h
+lavalite.o: $(HACK_SRC)/fps.h
+lavalite.o: $(srcdir)/gltrackball.h
+lavalite.o: $(srcdir)/marching.h
+lavalite.o: $(HACK_SRC)/recanim.h
+lavalite.o: $(srcdir)/rotator.h
+lavalite.o: $(HACK_SRC)/screenhackI.h
+lavalite.o: $(UTILS_SRC)/colors.h
+lavalite.o: $(UTILS_SRC)/erase.h
+lavalite.o: $(UTILS_SRC)/font-retry.h
+lavalite.o: $(UTILS_SRC)/grabscreen.h
+lavalite.o: $(UTILS_SRC)/hsv.h
+lavalite.o: $(UTILS_SRC)/resources.h
+lavalite.o: $(UTILS_SRC)/usleep.h
+lavalite.o: $(UTILS_SRC)/visual.h
+lavalite.o: $(UTILS_SRC)/yarandom.h
+lavalite.o: $(HACK_SRC)/ximage-loader.h
+lavalite.o: $(HACK_SRC)/xlockmoreI.h
+lavalite.o: $(HACK_SRC)/xlockmore.h
+lockward.o: ../../config.h
+lockward.o: $(HACK_SRC)/fps.h
+lockward.o: $(HACK_SRC)/recanim.h
+lockward.o: $(HACK_SRC)/screenhackI.h
+lockward.o: $(UTILS_SRC)/colors.h
+lockward.o: $(UTILS_SRC)/erase.h
+lockward.o: $(UTILS_SRC)/font-retry.h
+lockward.o: $(UTILS_SRC)/grabscreen.h
+lockward.o: $(UTILS_SRC)/hsv.h
+lockward.o: $(UTILS_SRC)/resources.h
+lockward.o: $(UTILS_SRC)/usleep.h
+lockward.o: $(UTILS_SRC)/visual.h
+lockward.o: $(UTILS_SRC)/yarandom.h
+lockward.o: $(HACK_SRC)/xlockmoreI.h
+lockward.o: $(HACK_SRC)/xlockmore.h
+marching.o: ../../config.h
+marching.o: $(srcdir)/marching.h
+marching.o: $(srcdir)/normals.h
+maze3d.o: ../../config.h
+maze3d.o: $(HACK_SRC)/fps.h
+maze3d.o: $(HACK_SRC)/images/gen/bob_png.h
+maze3d.o: $(HACK_SRC)/images/gen/brick1_png.h
+maze3d.o: $(HACK_SRC)/images/gen/brick2_png.h
+maze3d.o: $(HACK_SRC)/images/gen/logo-32_png.h
+maze3d.o: $(HACK_SRC)/images/gen/start_png.h
+maze3d.o: $(HACK_SRC)/images/gen/wood2_png.h
+maze3d.o: $(HACK_SRC)/recanim.h
+maze3d.o: $(HACK_SRC)/screenhackI.h
+maze3d.o: $(UTILS_SRC)/colors.h
+maze3d.o: $(UTILS_SRC)/erase.h
+maze3d.o: $(UTILS_SRC)/font-retry.h
+maze3d.o: $(UTILS_SRC)/grabscreen.h
+maze3d.o: $(UTILS_SRC)/hsv.h
+maze3d.o: $(UTILS_SRC)/resources.h
+maze3d.o: $(UTILS_SRC)/usleep.h
+maze3d.o: $(UTILS_SRC)/visual.h
+maze3d.o: $(UTILS_SRC)/yarandom.h
+maze3d.o: $(HACK_SRC)/ximage-loader.h
+maze3d.o: $(HACK_SRC)/xlockmoreI.h
+maze3d.o: $(HACK_SRC)/xlockmore.h
+menger.o: ../../config.h
+menger.o: $(HACK_SRC)/fps.h
+menger.o: $(srcdir)/gltrackball.h
+menger.o: $(HACK_SRC)/recanim.h
+menger.o: $(srcdir)/rotator.h
+menger.o: $(HACK_SRC)/screenhackI.h
+menger.o: $(UTILS_SRC)/colors.h
+menger.o: $(UTILS_SRC)/erase.h
+menger.o: $(UTILS_SRC)/font-retry.h
+menger.o: $(UTILS_SRC)/grabscreen.h
+menger.o: $(UTILS_SRC)/hsv.h
+menger.o: $(UTILS_SRC)/resources.h
+menger.o: $(UTILS_SRC)/usleep.h
+menger.o: $(UTILS_SRC)/visual.h
+menger.o: $(UTILS_SRC)/yarandom.h
+menger.o: $(HACK_SRC)/xlockmoreI.h
+menger.o: $(HACK_SRC)/xlockmore.h
+mirrorblob.o: ../../config.h
+mirrorblob.o: $(HACK_SRC)/fps.h
+mirrorblob.o: $(srcdir)/gltrackball.h
+mirrorblob.o: $(srcdir)/grab-ximage.h
+mirrorblob.o: $(HACK_SRC)/recanim.h
+mirrorblob.o: $(HACK_SRC)/screenhackI.h
+mirrorblob.o: $(UTILS_SRC)/colors.h
+mirrorblob.o: $(UTILS_SRC)/erase.h
+mirrorblob.o: $(UTILS_SRC)/font-retry.h
+mirrorblob.o: $(UTILS_SRC)/grabscreen.h
+mirrorblob.o: $(UTILS_SRC)/hsv.h
+mirrorblob.o: $(UTILS_SRC)/resources.h
+mirrorblob.o: $(UTILS_SRC)/usleep.h
+mirrorblob.o: $(UTILS_SRC)/visual.h
+mirrorblob.o: $(UTILS_SRC)/yarandom.h
+mirrorblob.o: $(HACK_SRC)/xlockmoreI.h
+mirrorblob.o: $(HACK_SRC)/xlockmore.h
+moebiusgears.o: ../../config.h
+moebiusgears.o: $(HACK_SRC)/fps.h
+moebiusgears.o: $(srcdir)/gltrackball.h
+moebiusgears.o: $(srcdir)/involute.h
+moebiusgears.o: $(srcdir)/normals.h
+moebiusgears.o: $(HACK_SRC)/recanim.h
+moebiusgears.o: $(srcdir)/rotator.h
+moebiusgears.o: $(HACK_SRC)/screenhackI.h
+moebiusgears.o: $(UTILS_SRC)/colors.h
+moebiusgears.o: $(UTILS_SRC)/erase.h
+moebiusgears.o: $(UTILS_SRC)/font-retry.h
+moebiusgears.o: $(UTILS_SRC)/grabscreen.h
+moebiusgears.o: $(UTILS_SRC)/hsv.h
+moebiusgears.o: $(UTILS_SRC)/resources.h
+moebiusgears.o: $(UTILS_SRC)/usleep.h
+moebiusgears.o: $(UTILS_SRC)/visual.h
+moebiusgears.o: $(UTILS_SRC)/yarandom.h
+moebiusgears.o: $(HACK_SRC)/xlockmoreI.h
+moebiusgears.o: $(HACK_SRC)/xlockmore.h
+moebius.o: ../../config.h
+moebius.o: $(HACK_SRC)/fps.h
+moebius.o: $(srcdir)/gltrackball.h
+moebius.o: $(HACK_SRC)/recanim.h
+moebius.o: $(srcdir)/rotator.h
+moebius.o: $(HACK_SRC)/screenhackI.h
+moebius.o: $(srcdir)/sphere.h
+moebius.o: $(srcdir)/tube.h
+moebius.o: $(UTILS_SRC)/colors.h
+moebius.o: $(UTILS_SRC)/erase.h
+moebius.o: $(UTILS_SRC)/font-retry.h
+moebius.o: $(UTILS_SRC)/grabscreen.h
+moebius.o: $(UTILS_SRC)/hsv.h
+moebius.o: $(UTILS_SRC)/resources.h
+moebius.o: $(UTILS_SRC)/usleep.h
+moebius.o: $(UTILS_SRC)/visual.h
+moebius.o: $(UTILS_SRC)/yarandom.h
+moebius.o: $(HACK_SRC)/xlockmoreI.h
+moebius.o: $(HACK_SRC)/xlockmore.h
+molecule.o: ../../config.h
+molecule.o: $(HACK_SRC)/fps.h
+molecule.o: $(srcdir)/gltrackball.h
+molecule.o: molecules.h
+molecule.o: $(HACK_SRC)/recanim.h
+molecule.o: $(srcdir)/rotator.h
+molecule.o: $(HACK_SRC)/screenhackI.h
+molecule.o: $(srcdir)/sphere.h
+molecule.o: $(srcdir)/texfont.h
+molecule.o: $(srcdir)/tube.h
+molecule.o: $(UTILS_SRC)/colors.h
+molecule.o: $(UTILS_SRC)/erase.h
+molecule.o: $(UTILS_SRC)/font-retry.h
+molecule.o: $(UTILS_SRC)/grabscreen.h
+molecule.o: $(UTILS_SRC)/hsv.h
+molecule.o: $(UTILS_SRC)/resources.h
+molecule.o: $(UTILS_SRC)/usleep.h
+molecule.o: $(UTILS_SRC)/visual.h
+molecule.o: $(UTILS_SRC)/yarandom.h
+molecule.o: $(HACK_SRC)/xlockmoreI.h
+molecule.o: $(HACK_SRC)/xlockmore.h
+morph3d.o: ../../config.h
+morph3d.o: $(HACK_SRC)/fps.h
+morph3d.o: $(HACK_SRC)/recanim.h
+morph3d.o: $(HACK_SRC)/screenhackI.h
+morph3d.o: $(UTILS_SRC)/colors.h
+morph3d.o: $(UTILS_SRC)/erase.h
+morph3d.o: $(UTILS_SRC)/font-retry.h
+morph3d.o: $(UTILS_SRC)/grabscreen.h
+morph3d.o: $(UTILS_SRC)/hsv.h
+morph3d.o: $(UTILS_SRC)/resources.h
+morph3d.o: $(UTILS_SRC)/usleep.h
+morph3d.o: $(UTILS_SRC)/visual.h
+morph3d.o: $(UTILS_SRC)/yarandom.h
+morph3d.o: $(HACK_SRC)/xlockmoreI.h
+morph3d.o: $(HACK_SRC)/xlockmore.h
+noof.o: ../../config.h
+noof.o: $(HACK_SRC)/fps.h
+noof.o: $(HACK_SRC)/recanim.h
+noof.o: $(HACK_SRC)/screenhackI.h
+noof.o: $(UTILS_SRC)/colors.h
+noof.o: $(UTILS_SRC)/erase.h
+noof.o: $(UTILS_SRC)/font-retry.h
+noof.o: $(UTILS_SRC)/grabscreen.h
+noof.o: $(UTILS_SRC)/hsv.h
+noof.o: $(UTILS_SRC)/pow2.h
+noof.o: $(UTILS_SRC)/resources.h
+noof.o: $(UTILS_SRC)/usleep.h
+noof.o: $(UTILS_SRC)/visual.h
+noof.o: $(UTILS_SRC)/yarandom.h
+noof.o: $(HACK_SRC)/xlockmoreI.h
+noof.o: $(HACK_SRC)/xlockmore.h
+normals.o: ../../config.h
+normals.o: $(srcdir)/normals.h
+peepers.o: ../../config.h
+peepers.o: $(HACK_SRC)/fps.h
+peepers.o: $(srcdir)/gltrackball.h
+peepers.o: $(HACK_SRC)/images/gen/iris_png.h
+peepers.o: $(HACK_SRC)/images/gen/sclera_png.h
+peepers.o: $(srcdir)/normals.h
+peepers.o: $(HACK_SRC)/recanim.h
+peepers.o: $(srcdir)/rotator.h
+peepers.o: $(HACK_SRC)/screenhackI.h
+peepers.o: $(UTILS_SRC)/colors.h
+peepers.o: $(UTILS_SRC)/erase.h
+peepers.o: $(UTILS_SRC)/font-retry.h
+peepers.o: $(UTILS_SRC)/grabscreen.h
+peepers.o: $(UTILS_SRC)/hsv.h
+peepers.o: $(UTILS_SRC)/resources.h
+peepers.o: $(UTILS_SRC)/usleep.h
+peepers.o: $(UTILS_SRC)/visual.h
+peepers.o: $(UTILS_SRC)/yarandom.h
+peepers.o: $(HACK_SRC)/ximage-loader.h
+peepers.o: $(HACK_SRC)/xlockmoreI.h
+peepers.o: $(HACK_SRC)/xlockmore.h
+photopile.o: ../../config.h
+photopile.o: $(srcdir)/dropshadow.h
+photopile.o: $(HACK_SRC)/fps.h
+photopile.o: $(srcdir)/grab-ximage.h
+photopile.o: $(HACK_SRC)/recanim.h
+photopile.o: $(HACK_SRC)/screenhackI.h
+photopile.o: $(srcdir)/texfont.h
+photopile.o: $(UTILS_SRC)/colors.h
+photopile.o: $(UTILS_SRC)/erase.h
+photopile.o: $(UTILS_SRC)/font-retry.h
+photopile.o: $(UTILS_SRC)/grabscreen.h
+photopile.o: $(UTILS_SRC)/hsv.h
+photopile.o: $(UTILS_SRC)/resources.h
+photopile.o: $(UTILS_SRC)/usleep.h
+photopile.o: $(UTILS_SRC)/visual.h
+photopile.o: $(UTILS_SRC)/yarandom.h
+photopile.o: $(HACK_SRC)/xlockmoreI.h
+photopile.o: $(HACK_SRC)/xlockmore.h
+pinion.o: ../../config.h
+pinion.o: $(HACK_SRC)/fps.h
+pinion.o: $(srcdir)/gltrackball.h
+pinion.o: $(srcdir)/involute.h
+pinion.o: $(srcdir)/normals.h
+pinion.o: $(HACK_SRC)/recanim.h
+pinion.o: $(HACK_SRC)/screenhackI.h
+pinion.o: $(srcdir)/texfont.h
+pinion.o: $(UTILS_SRC)/colors.h
+pinion.o: $(UTILS_SRC)/erase.h
+pinion.o: $(UTILS_SRC)/font-retry.h
+pinion.o: $(UTILS_SRC)/grabscreen.h
+pinion.o: $(UTILS_SRC)/hsv.h
+pinion.o: $(UTILS_SRC)/resources.h
+pinion.o: $(UTILS_SRC)/usleep.h
+pinion.o: $(UTILS_SRC)/visual.h
+pinion.o: $(UTILS_SRC)/yarandom.h
+pinion.o: $(HACK_SRC)/xlockmoreI.h
+pinion.o: $(HACK_SRC)/xlockmore.h
+pipeobjs.o: $(srcdir)/buildlwo.h
+pipeobjs.o: ../../config.h
+pipes.o: $(srcdir)/buildlwo.h
+pipes.o: ../../config.h
+pipes.o: $(HACK_SRC)/fps.h
+pipes.o: $(srcdir)/gltrackball.h
+pipes.o: $(HACK_SRC)/recanim.h
+pipes.o: $(HACK_SRC)/screenhackI.h
+pipes.o: $(srcdir)/sphere.h
+pipes.o: $(srcdir)/teapot.h
+pipes.o: $(UTILS_SRC)/colors.h
+pipes.o: $(UTILS_SRC)/erase.h
+pipes.o: $(UTILS_SRC)/font-retry.h
+pipes.o: $(UTILS_SRC)/grabscreen.h
+pipes.o: $(UTILS_SRC)/hsv.h
+pipes.o: $(UTILS_SRC)/resources.h
+pipes.o: $(UTILS_SRC)/usleep.h
+pipes.o: $(UTILS_SRC)/visual.h
+pipes.o: $(UTILS_SRC)/yarandom.h
+pipes.o: $(HACK_SRC)/xlockmoreI.h
+pipes.o: $(HACK_SRC)/xlockmore.h
+polyhedra-gl.o: ../../config.h
+polyhedra-gl.o: $(HACK_SRC)/fps.h
+polyhedra-gl.o: $(srcdir)/gltrackball.h
+polyhedra-gl.o: $(srcdir)/normals.h
+polyhedra-gl.o: $(srcdir)/polyhedra.h
+polyhedra-gl.o: $(HACK_SRC)/recanim.h
+polyhedra-gl.o: $(srcdir)/rotator.h
+polyhedra-gl.o: $(HACK_SRC)/screenhackI.h
+polyhedra-gl.o: $(srcdir)/teapot.h
+polyhedra-gl.o: $(srcdir)/texfont.h
+polyhedra-gl.o: $(UTILS_SRC)/colors.h
+polyhedra-gl.o: $(UTILS_SRC)/erase.h
+polyhedra-gl.o: $(UTILS_SRC)/font-retry.h
+polyhedra-gl.o: $(UTILS_SRC)/grabscreen.h
+polyhedra-gl.o: $(UTILS_SRC)/hsv.h
+polyhedra-gl.o: $(UTILS_SRC)/resources.h
+polyhedra-gl.o: $(UTILS_SRC)/usleep.h
+polyhedra-gl.o: $(UTILS_SRC)/visual.h
+polyhedra-gl.o: $(UTILS_SRC)/yarandom.h
+polyhedra-gl.o: $(HACK_SRC)/xlockmoreI.h
+polyhedra-gl.o: $(HACK_SRC)/xlockmore.h
+polyhedra.o: ../../config.h
+polyhedra.o: $(srcdir)/polyhedra.h
+polytopes.o: ../../config.h
+polytopes.o: $(HACK_SRC)/fps.h
+polytopes.o: $(srcdir)/gltrackball.h
+polytopes.o: $(HACK_SRC)/recanim.h
+polytopes.o: $(HACK_SRC)/screenhackI.h
+polytopes.o: $(UTILS_SRC)/colors.h
+polytopes.o: $(UTILS_SRC)/erase.h
+polytopes.o: $(UTILS_SRC)/font-retry.h
+polytopes.o: $(UTILS_SRC)/grabscreen.h
+polytopes.o: $(UTILS_SRC)/hsv.h
+polytopes.o: $(UTILS_SRC)/resources.h
+polytopes.o: $(UTILS_SRC)/usleep.h
+polytopes.o: $(UTILS_SRC)/visual.h
+polytopes.o: $(UTILS_SRC)/yarandom.h
+polytopes.o: $(HACK_SRC)/xlockmoreI.h
+polytopes.o: $(HACK_SRC)/xlockmore.h
+projectiveplane.o: ../../config.h
+projectiveplane.o: $(srcdir)/curlicue.h
+projectiveplane.o: $(HACK_SRC)/fps.h
+projectiveplane.o: $(srcdir)/gltrackball.h
+projectiveplane.o: $(HACK_SRC)/recanim.h
+projectiveplane.o: $(HACK_SRC)/screenhackI.h
+projectiveplane.o: $(UTILS_SRC)/colors.h
+projectiveplane.o: $(UTILS_SRC)/erase.h
+projectiveplane.o: $(UTILS_SRC)/font-retry.h
+projectiveplane.o: $(UTILS_SRC)/grabscreen.h
+projectiveplane.o: $(UTILS_SRC)/hsv.h
+projectiveplane.o: $(UTILS_SRC)/resources.h
+projectiveplane.o: $(UTILS_SRC)/usleep.h
+projectiveplane.o: $(UTILS_SRC)/visual.h
+projectiveplane.o: $(UTILS_SRC)/yarandom.h
+projectiveplane.o: $(HACK_SRC)/xlockmoreI.h
+projectiveplane.o: $(HACK_SRC)/xlockmore.h
+providence.o: ../../config.h
+providence.o: $(HACK_SRC)/fps.h
+providence.o: $(srcdir)/gltrackball.h
+providence.o: $(HACK_SRC)/recanim.h
+providence.o: $(HACK_SRC)/screenhackI.h
+providence.o: $(UTILS_SRC)/colors.h
+providence.o: $(UTILS_SRC)/erase.h
+providence.o: $(UTILS_SRC)/font-retry.h
+providence.o: $(UTILS_SRC)/grabscreen.h
+providence.o: $(UTILS_SRC)/hsv.h
+providence.o: $(UTILS_SRC)/resources.h
+providence.o: $(UTILS_SRC)/usleep.h
+providence.o: $(UTILS_SRC)/visual.h
+providence.o: $(UTILS_SRC)/yarandom.h
+providence.o: $(HACK_SRC)/xlockmoreI.h
+providence.o: $(HACK_SRC)/xlockmore.h
+pulsar.o: ../../config.h
+pulsar.o: $(HACK_SRC)/fps.h
+pulsar.o: $(HACK_SRC)/recanim.h
+pulsar.o: $(HACK_SRC)/screenhackI.h
+pulsar.o: $(UTILS_SRC)/colors.h
+pulsar.o: $(UTILS_SRC)/erase.h
+pulsar.o: $(UTILS_SRC)/font-retry.h
+pulsar.o: $(UTILS_SRC)/grabscreen.h
+pulsar.o: $(UTILS_SRC)/hsv.h
+pulsar.o: $(UTILS_SRC)/resources.h
+pulsar.o: $(UTILS_SRC)/usleep.h
+pulsar.o: $(UTILS_SRC)/visual.h
+pulsar.o: $(UTILS_SRC)/yarandom.h
+pulsar.o: $(HACK_SRC)/ximage-loader.h
+pulsar.o: $(HACK_SRC)/xlockmoreI.h
+pulsar.o: $(HACK_SRC)/xlockmore.h
+quasicrystal.o: ../../config.h
+quasicrystal.o: $(HACK_SRC)/fps.h
+quasicrystal.o: $(HACK_SRC)/recanim.h
+quasicrystal.o: $(srcdir)/rotator.h
+quasicrystal.o: $(HACK_SRC)/screenhackI.h
+quasicrystal.o: $(UTILS_SRC)/colors.h
+quasicrystal.o: $(UTILS_SRC)/erase.h
+quasicrystal.o: $(UTILS_SRC)/font-retry.h
+quasicrystal.o: $(UTILS_SRC)/grabscreen.h
+quasicrystal.o: $(UTILS_SRC)/hsv.h
+quasicrystal.o: $(UTILS_SRC)/resources.h
+quasicrystal.o: $(UTILS_SRC)/usleep.h
+quasicrystal.o: $(UTILS_SRC)/visual.h
+quasicrystal.o: $(UTILS_SRC)/yarandom.h
+quasicrystal.o: $(HACK_SRC)/xlockmoreI.h
+quasicrystal.o: $(HACK_SRC)/xlockmore.h
+queens.o: $(srcdir)/chessmodels.h
+queens.o: ../../config.h
+queens.o: $(HACK_SRC)/fps.h
+queens.o: $(srcdir)/gltrackball.h
+queens.o: $(HACK_SRC)/recanim.h
+queens.o: $(HACK_SRC)/screenhackI.h
+queens.o: $(UTILS_SRC)/colors.h
+queens.o: $(UTILS_SRC)/erase.h
+queens.o: $(UTILS_SRC)/font-retry.h
+queens.o: $(UTILS_SRC)/grabscreen.h
+queens.o: $(UTILS_SRC)/hsv.h
+queens.o: $(UTILS_SRC)/resources.h
+queens.o: $(UTILS_SRC)/usleep.h
+queens.o: $(UTILS_SRC)/visual.h
+queens.o: $(UTILS_SRC)/yarandom.h
+queens.o: $(HACK_SRC)/xlockmoreI.h
+queens.o: $(HACK_SRC)/xlockmore.h
+quickhull.o: ../../config.h
+quickhull.o: $(HACK_SRC)/fps.h
+quickhull.o: $(srcdir)/quickhull.h
+quickhull.o: $(HACK_SRC)/recanim.h
+quickhull.o: $(HACK_SRC)/screenhackI.h
+quickhull.o: $(UTILS_SRC)/colors.h
+quickhull.o: $(UTILS_SRC)/font-retry.h
+quickhull.o: $(UTILS_SRC)/grabscreen.h
+quickhull.o: $(UTILS_SRC)/hsv.h
+quickhull.o: $(UTILS_SRC)/resources.h
+quickhull.o: $(UTILS_SRC)/usleep.h
+quickhull.o: $(UTILS_SRC)/visual.h
+quickhull.o: $(UTILS_SRC)/yarandom.h
+raverhoop.o: ../../config.h
+raverhoop.o: $(HACK_SRC)/fps.h
+raverhoop.o: $(srcdir)/gltrackball.h
+raverhoop.o: $(HACK_SRC)/recanim.h
+raverhoop.o: $(srcdir)/rotator.h
+raverhoop.o: $(HACK_SRC)/screenhackI.h
+raverhoop.o: $(UTILS_SRC)/colors.h
+raverhoop.o: $(UTILS_SRC)/erase.h
+raverhoop.o: $(UTILS_SRC)/font-retry.h
+raverhoop.o: $(UTILS_SRC)/grabscreen.h
+raverhoop.o: $(UTILS_SRC)/hsv.h
+raverhoop.o: $(UTILS_SRC)/resources.h
+raverhoop.o: $(UTILS_SRC)/usleep.h
+raverhoop.o: $(UTILS_SRC)/visual.h
+raverhoop.o: $(UTILS_SRC)/yarandom.h
+raverhoop.o: $(HACK_SRC)/xlockmoreI.h
+raverhoop.o: $(HACK_SRC)/xlockmore.h
+razzledazzle.o: ../../config.h
+razzledazzle.o: $(HACK_SRC)/fps.h
+razzledazzle.o: $(srcdir)/gllist.h
+razzledazzle.o: $(srcdir)/normals.h
+razzledazzle.o: $(HACK_SRC)/recanim.h
+razzledazzle.o: $(HACK_SRC)/screenhackI.h
+razzledazzle.o: $(UTILS_SRC)/colors.h
+razzledazzle.o: $(UTILS_SRC)/erase.h
+razzledazzle.o: $(UTILS_SRC)/font-retry.h
+razzledazzle.o: $(UTILS_SRC)/grabscreen.h
+razzledazzle.o: $(UTILS_SRC)/hsv.h
+razzledazzle.o: $(UTILS_SRC)/resources.h
+razzledazzle.o: $(UTILS_SRC)/usleep.h
+razzledazzle.o: $(UTILS_SRC)/visual.h
+razzledazzle.o: $(UTILS_SRC)/yarandom.h
+razzledazzle.o: $(HACK_SRC)/xlockmoreI.h
+razzledazzle.o: $(HACK_SRC)/xlockmore.h
+robot.o: ../../config.h
+robot.o: $(srcdir)/gllist.h
+robot-wireframe.o: ../../config.h
+robot-wireframe.o: $(srcdir)/gllist.h
+romanboy.o: ../../config.h
+romanboy.o: $(srcdir)/curlicue.h
+romanboy.o: $(HACK_SRC)/fps.h
+romanboy.o: $(srcdir)/gltrackball.h
+romanboy.o: $(HACK_SRC)/recanim.h
+romanboy.o: $(HACK_SRC)/screenhackI.h
+romanboy.o: $(UTILS_SRC)/colors.h
+romanboy.o: $(UTILS_SRC)/erase.h
+romanboy.o: $(UTILS_SRC)/font-retry.h
+romanboy.o: $(UTILS_SRC)/grabscreen.h
+romanboy.o: $(UTILS_SRC)/hsv.h
+romanboy.o: $(UTILS_SRC)/resources.h
+romanboy.o: $(UTILS_SRC)/usleep.h
+romanboy.o: $(UTILS_SRC)/visual.h
+romanboy.o: $(UTILS_SRC)/yarandom.h
+romanboy.o: $(HACK_SRC)/xlockmoreI.h
+romanboy.o: $(HACK_SRC)/xlockmore.h
+rotator.o: ../../config.h
+rotator.o: $(srcdir)/rotator.h
+rotator.o: $(UTILS_SRC)/yarandom.h
+rubikblocks.o: ../../config.h
+rubikblocks.o: $(HACK_SRC)/fps.h
+rubikblocks.o: $(srcdir)/gltrackball.h
+rubikblocks.o: $(HACK_SRC)/recanim.h
+rubikblocks.o: $(srcdir)/rotator.h
+rubikblocks.o: $(HACK_SRC)/screenhackI.h
+rubikblocks.o: $(UTILS_SRC)/colors.h
+rubikblocks.o: $(UTILS_SRC)/erase.h
+rubikblocks.o: $(UTILS_SRC)/font-retry.h
+rubikblocks.o: $(UTILS_SRC)/grabscreen.h
+rubikblocks.o: $(UTILS_SRC)/hsv.h
+rubikblocks.o: $(UTILS_SRC)/resources.h
+rubikblocks.o: $(UTILS_SRC)/usleep.h
+rubikblocks.o: $(UTILS_SRC)/visual.h
+rubikblocks.o: $(UTILS_SRC)/yarandom.h
+rubikblocks.o: $(HACK_SRC)/xlockmoreI.h
+rubikblocks.o: $(HACK_SRC)/xlockmore.h
+rubik.o: ../../config.h
+rubik.o: $(HACK_SRC)/fps.h
+rubik.o: $(srcdir)/gltrackball.h
+rubik.o: $(HACK_SRC)/recanim.h
+rubik.o: $(HACK_SRC)/screenhackI.h
+rubik.o: $(UTILS_SRC)/colors.h
+rubik.o: $(UTILS_SRC)/erase.h
+rubik.o: $(UTILS_SRC)/font-retry.h
+rubik.o: $(UTILS_SRC)/grabscreen.h
+rubik.o: $(UTILS_SRC)/hsv.h
+rubik.o: $(UTILS_SRC)/resources.h
+rubik.o: $(UTILS_SRC)/usleep.h
+rubik.o: $(UTILS_SRC)/visual.h
+rubik.o: $(UTILS_SRC)/yarandom.h
+rubik.o: $(HACK_SRC)/xlockmoreI.h
+rubik.o: $(HACK_SRC)/xlockmore.h
+s1_1.o: ../../config.h
+s1_1.o: $(srcdir)/gllist.h
+s1_2.o: ../../config.h
+s1_2.o: $(srcdir)/gllist.h
+s1_3.o: ../../config.h
+s1_3.o: $(srcdir)/gllist.h
+s1_4.o: ../../config.h
+s1_4.o: $(srcdir)/gllist.h
+s1_5.o: ../../config.h
+s1_5.o: $(srcdir)/gllist.h
+s1_6.o: ../../config.h
+s1_6.o: $(srcdir)/gllist.h
+s1_b.o: ../../config.h
+s1_b.o: $(srcdir)/gllist.h
+sballs.o: ../../config.h
+sballs.o: $(HACK_SRC)/fps.h
+sballs.o: $(srcdir)/gltrackball.h
+sballs.o: $(HACK_SRC)/images/gen/sball-bg_png.h
+sballs.o: $(HACK_SRC)/images/gen/sball_png.h
+sballs.o: $(HACK_SRC)/recanim.h
+sballs.o: $(HACK_SRC)/screenhackI.h
+sballs.o: $(UTILS_SRC)/colors.h
+sballs.o: $(UTILS_SRC)/erase.h
+sballs.o: $(UTILS_SRC)/font-retry.h
+sballs.o: $(UTILS_SRC)/grabscreen.h
+sballs.o: $(UTILS_SRC)/hsv.h
+sballs.o: $(UTILS_SRC)/resources.h
+sballs.o: $(UTILS_SRC)/usleep.h
+sballs.o: $(UTILS_SRC)/visual.h
+sballs.o: $(UTILS_SRC)/yarandom.h
+sballs.o: $(HACK_SRC)/ximage-loader.h
+sballs.o: $(HACK_SRC)/xlockmoreI.h
+sballs.o: $(HACK_SRC)/xlockmore.h
+seccam.o: ../../config.h
+seccam.o: $(srcdir)/gllist.h
+shark.o: $(srcdir)/atlantis.h
+shark.o: ../../config.h
+shark.o: $(HACK_SRC)/fps.h
+shark.o: $(HACK_SRC)/recanim.h
+shark.o: $(HACK_SRC)/screenhackI.h
+shark.o: $(UTILS_SRC)/colors.h
+shark.o: $(UTILS_SRC)/font-retry.h
+shark.o: $(UTILS_SRC)/grabscreen.h
+shark.o: $(UTILS_SRC)/hsv.h
+shark.o: $(UTILS_SRC)/resources.h
+shark.o: $(UTILS_SRC)/usleep.h
+shark.o: $(UTILS_SRC)/visual.h
+shark.o: $(UTILS_SRC)/yarandom.h
+ships.o: ../../config.h
+ships.o: $(srcdir)/gllist.h
+sierpinski3d.o: ../../config.h
+sierpinski3d.o: $(HACK_SRC)/fps.h
+sierpinski3d.o: $(srcdir)/gltrackball.h
+sierpinski3d.o: $(HACK_SRC)/recanim.h
+sierpinski3d.o: $(srcdir)/rotator.h
+sierpinski3d.o: $(HACK_SRC)/screenhackI.h
+sierpinski3d.o: $(UTILS_SRC)/colors.h
+sierpinski3d.o: $(UTILS_SRC)/erase.h
+sierpinski3d.o: $(UTILS_SRC)/font-retry.h
+sierpinski3d.o: $(UTILS_SRC)/grabscreen.h
+sierpinski3d.o: $(UTILS_SRC)/hsv.h
+sierpinski3d.o: $(UTILS_SRC)/resources.h
+sierpinski3d.o: $(UTILS_SRC)/usleep.h
+sierpinski3d.o: $(UTILS_SRC)/visual.h
+sierpinski3d.o: $(UTILS_SRC)/yarandom.h
+sierpinski3d.o: $(HACK_SRC)/xlockmoreI.h
+sierpinski3d.o: $(HACK_SRC)/xlockmore.h
+skytentacles.o: ../../config.h
+skytentacles.o: $(HACK_SRC)/fps.h
+skytentacles.o: $(srcdir)/gltrackball.h
+skytentacles.o: $(HACK_SRC)/images/gen/scales_png.h
+skytentacles.o: $(srcdir)/normals.h
+skytentacles.o: $(HACK_SRC)/recanim.h
+skytentacles.o: $(srcdir)/rotator.h
+skytentacles.o: $(HACK_SRC)/screenhackI.h
+skytentacles.o: $(UTILS_SRC)/colors.h
+skytentacles.o: $(UTILS_SRC)/erase.h
+skytentacles.o: $(UTILS_SRC)/font-retry.h
+skytentacles.o: $(UTILS_SRC)/grabscreen.h
+skytentacles.o: $(UTILS_SRC)/hsv.h
+skytentacles.o: $(UTILS_SRC)/resources.h
+skytentacles.o: $(UTILS_SRC)/usleep.h
+skytentacles.o: $(UTILS_SRC)/visual.h
+skytentacles.o: $(UTILS_SRC)/yarandom.h
+skytentacles.o: $(HACK_SRC)/ximage-loader.h
+skytentacles.o: $(HACK_SRC)/xlockmoreI.h
+skytentacles.o: $(HACK_SRC)/xlockmore.h
+sonar-icmp.o: ../../config.h
+sonar-icmp.o: $(HACK_SRC)/fps.h
+sonar-icmp.o: $(HACK_SRC)/recanim.h
+sonar-icmp.o: $(HACK_SRC)/screenhackI.h
+sonar-icmp.o: $(srcdir)/sonar.h
+sonar-icmp.o: $(UTILS_SRC)/aligned_malloc.h
+sonar-icmp.o: $(UTILS_SRC)/async_netdb.h
+sonar-icmp.o: $(UTILS_SRC)/colors.h
+sonar-icmp.o: $(UTILS_SRC)/font-retry.h
+sonar-icmp.o: $(UTILS_SRC)/grabscreen.h
+sonar-icmp.o: $(UTILS_SRC)/hsv.h
+sonar-icmp.o: $(UTILS_SRC)/resources.h
+sonar-icmp.o: $(UTILS_SRC)/thread_util.h
+sonar-icmp.o: $(UTILS_SRC)/usleep.h
+sonar-icmp.o: $(UTILS_SRC)/version.h
+sonar-icmp.o: $(UTILS_SRC)/visual.h
+sonar-icmp.o: $(UTILS_SRC)/yarandom.h
+sonar.o: ../../config.h
+sonar.o: $(HACK_SRC)/fps.h
+sonar.o: $(srcdir)/gltrackball.h
+sonar.o: $(HACK_SRC)/recanim.h
+sonar.o: $(srcdir)/rotator.h
+sonar.o: $(HACK_SRC)/screenhackI.h
+sonar.o: $(srcdir)/sonar.h
+sonar.o: $(srcdir)/texfont.h
+sonar.o: $(UTILS_SRC)/aligned_malloc.h
+sonar.o: $(UTILS_SRC)/colors.h
+sonar.o: $(UTILS_SRC)/erase.h
+sonar.o: $(UTILS_SRC)/font-retry.h
+sonar.o: $(UTILS_SRC)/grabscreen.h
+sonar.o: $(UTILS_SRC)/hsv.h
+sonar.o: $(UTILS_SRC)/resources.h
+sonar.o: $(UTILS_SRC)/thread_util.h
+sonar.o: $(UTILS_SRC)/usleep.h
+sonar.o: $(UTILS_SRC)/visual.h
+sonar.o: $(UTILS_SRC)/yarandom.h
+sonar.o: $(HACK_SRC)/xlockmoreI.h
+sonar.o: $(HACK_SRC)/xlockmore.h
+sonar-sim.o: ../../config.h
+sonar-sim.o: $(HACK_SRC)/fps.h
+sonar-sim.o: $(HACK_SRC)/recanim.h
+sonar-sim.o: $(HACK_SRC)/screenhackI.h
+sonar-sim.o: $(srcdir)/sonar.h
+sonar-sim.o: $(UTILS_SRC)/colors.h
+sonar-sim.o: $(UTILS_SRC)/font-retry.h
+sonar-sim.o: $(UTILS_SRC)/grabscreen.h
+sonar-sim.o: $(UTILS_SRC)/hsv.h
+sonar-sim.o: $(UTILS_SRC)/resources.h
+sonar-sim.o: $(UTILS_SRC)/usleep.h
+sonar-sim.o: $(UTILS_SRC)/visual.h
+sonar-sim.o: $(UTILS_SRC)/yarandom.h
+spheremonics.o: ../../config.h
+spheremonics.o: $(HACK_SRC)/fps.h
+spheremonics.o: $(srcdir)/gltrackball.h
+spheremonics.o: $(srcdir)/normals.h
+spheremonics.o: $(HACK_SRC)/recanim.h
+spheremonics.o: $(srcdir)/rotator.h
+spheremonics.o: $(HACK_SRC)/screenhackI.h
+spheremonics.o: $(srcdir)/texfont.h
+spheremonics.o: $(UTILS_SRC)/colors.h
+spheremonics.o: $(UTILS_SRC)/erase.h
+spheremonics.o: $(UTILS_SRC)/font-retry.h
+spheremonics.o: $(UTILS_SRC)/grabscreen.h
+spheremonics.o: $(UTILS_SRC)/hsv.h
+spheremonics.o: $(UTILS_SRC)/resources.h
+spheremonics.o: $(UTILS_SRC)/usleep.h
+spheremonics.o: $(UTILS_SRC)/visual.h
+spheremonics.o: $(UTILS_SRC)/yarandom.h
+spheremonics.o: $(HACK_SRC)/xlockmoreI.h
+spheremonics.o: $(HACK_SRC)/xlockmore.h
+sphere.o: ../../config.h
+sphere.o: $(srcdir)/sphere.h
+splitflap.o: ../../config.h
+splitflap.o: $(HACK_SRC)/fps.h
+splitflap.o: $(srcdir)/gllist.h
+splitflap.o: $(srcdir)/gltrackball.h
+splitflap.o: $(HACK_SRC)/recanim.h
+splitflap.o: $(srcdir)/rotator.h
+splitflap.o: $(HACK_SRC)/screenhackI.h
+splitflap.o: $(srcdir)/texfont.h
+splitflap.o: $(UTILS_SRC)/colors.h
+splitflap.o: $(UTILS_SRC)/erase.h
+splitflap.o: $(UTILS_SRC)/font-retry.h
+splitflap.o: $(UTILS_SRC)/grabscreen.h
+splitflap.o: $(UTILS_SRC)/hsv.h
+splitflap.o: $(UTILS_SRC)/resources.h
+splitflap.o: $(UTILS_SRC)/textclient.h
+splitflap.o: $(UTILS_SRC)/usleep.h
+splitflap.o: $(UTILS_SRC)/utf8wc.h
+splitflap.o: $(UTILS_SRC)/visual.h
+splitflap.o: $(UTILS_SRC)/yarandom.h
+splitflap.o: $(HACK_SRC)/ximage-loader.h
+splitflap.o: $(HACK_SRC)/xlockmoreI.h
+splitflap.o: $(HACK_SRC)/xlockmore.h
+splitflap_obj.o: ../../config.h
+splitflap_obj.o: $(srcdir)/gllist.h
+splodesic.o: ../../config.h
+splodesic.o: $(HACK_SRC)/fps.h
+splodesic.o: $(srcdir)/gltrackball.h
+splodesic.o: $(srcdir)/normals.h
+splodesic.o: $(HACK_SRC)/recanim.h
+splodesic.o: $(srcdir)/rotator.h
+splodesic.o: $(HACK_SRC)/screenhackI.h
+splodesic.o: $(UTILS_SRC)/colors.h
+splodesic.o: $(UTILS_SRC)/erase.h
+splodesic.o: $(UTILS_SRC)/font-retry.h
+splodesic.o: $(UTILS_SRC)/grabscreen.h
+splodesic.o: $(UTILS_SRC)/hsv.h
+splodesic.o: $(UTILS_SRC)/resources.h
+splodesic.o: $(UTILS_SRC)/usleep.h
+splodesic.o: $(UTILS_SRC)/visual.h
+splodesic.o: $(UTILS_SRC)/yarandom.h
+splodesic.o: $(HACK_SRC)/xlockmoreI.h
+splodesic.o: $(HACK_SRC)/xlockmore.h
+sproingies.o: ../../config.h
+sproingies.o: $(HACK_SRC)/fps.h
+sproingies.o: $(srcdir)/gllist.h
+sproingies.o: $(HACK_SRC)/recanim.h
+sproingies.o: $(HACK_SRC)/screenhackI.h
+sproingies.o: $(srcdir)/sproingies.h
+sproingies.o: $(UTILS_SRC)/colors.h
+sproingies.o: $(UTILS_SRC)/erase.h
+sproingies.o: $(UTILS_SRC)/font-retry.h
+sproingies.o: $(UTILS_SRC)/grabscreen.h
+sproingies.o: $(UTILS_SRC)/hsv.h
+sproingies.o: $(UTILS_SRC)/resources.h
+sproingies.o: $(UTILS_SRC)/usleep.h
+sproingies.o: $(UTILS_SRC)/visual.h
+sproingies.o: $(UTILS_SRC)/yarandom.h
+sproingies.o: $(HACK_SRC)/xlockmoreI.h
+sproingiewrap.o: ../../config.h
+sproingiewrap.o: $(HACK_SRC)/fps.h
+sproingiewrap.o: $(HACK_SRC)/recanim.h
+sproingiewrap.o: $(HACK_SRC)/screenhackI.h
+sproingiewrap.o: $(srcdir)/sproingies.h
+sproingiewrap.o: $(UTILS_SRC)/colors.h
+sproingiewrap.o: $(UTILS_SRC)/erase.h
+sproingiewrap.o: $(UTILS_SRC)/font-retry.h
+sproingiewrap.o: $(UTILS_SRC)/grabscreen.h
+sproingiewrap.o: $(UTILS_SRC)/hsv.h
+sproingiewrap.o: $(UTILS_SRC)/resources.h
+sproingiewrap.o: $(UTILS_SRC)/usleep.h
+sproingiewrap.o: $(UTILS_SRC)/visual.h
+sproingiewrap.o: $(UTILS_SRC)/yarandom.h
+sproingiewrap.o: $(HACK_SRC)/xlockmoreI.h
+sproingiewrap.o: $(HACK_SRC)/xlockmore.h
+stairs.o: ../../config.h
+stairs.o: $(HACK_SRC)/fps.h
+stairs.o: $(srcdir)/gltrackball.h
+stairs.o: $(HACK_SRC)/images/gen/wood_png.h
+stairs.o: $(HACK_SRC)/recanim.h
+stairs.o: $(HACK_SRC)/screenhackI.h
+stairs.o: $(srcdir)/sphere.h
+stairs.o: $(UTILS_SRC)/colors.h
+stairs.o: $(UTILS_SRC)/erase.h
+stairs.o: $(UTILS_SRC)/font-retry.h
+stairs.o: $(UTILS_SRC)/grabscreen.h
+stairs.o: $(UTILS_SRC)/hsv.h
+stairs.o: $(UTILS_SRC)/resources.h
+stairs.o: $(UTILS_SRC)/usleep.h
+stairs.o: $(UTILS_SRC)/visual.h
+stairs.o: $(UTILS_SRC)/yarandom.h
+stairs.o: $(HACK_SRC)/ximage-loader.h
+stairs.o: $(HACK_SRC)/xlockmoreI.h
+stairs.o: $(HACK_SRC)/xlockmore.h
+starwars.o: ../../config.h
+starwars.o: $(HACK_SRC)/fps.h
+starwars.o: $(srcdir)/glut_roman.h
+starwars.o: $(srcdir)/glutstroke.h
+starwars.o: $(HACK_SRC)/recanim.h
+starwars.o: $(HACK_SRC)/screenhackI.h
+starwars.o: $(srcdir)/starwars.h
+starwars.o: $(srcdir)/texfont.h
+starwars.o: $(UTILS_SRC)/colors.h
+starwars.o: $(UTILS_SRC)/erase.h
+starwars.o: $(UTILS_SRC)/font-retry.h
+starwars.o: $(UTILS_SRC)/grabscreen.h
+starwars.o: $(UTILS_SRC)/hsv.h
+starwars.o: $(UTILS_SRC)/resources.h
+starwars.o: $(UTILS_SRC)/textclient.h
+starwars.o: $(UTILS_SRC)/usleep.h
+starwars.o: $(UTILS_SRC)/utf8wc.h
+starwars.o: $(UTILS_SRC)/visual.h
+starwars.o: $(UTILS_SRC)/yarandom.h
+starwars.o: $(HACK_SRC)/xlockmoreI.h
+starwars.o: $(HACK_SRC)/xlockmore.h
+stonerview-move.o: ../../config.h
+stonerview-move.o: $(srcdir)/stonerview.h
+stonerview-move.o: $(srcdir)/stonerview-move.h
+stonerview-move.o: $(srcdir)/stonerview-osc.h
+stonerview-move.o: $(UTILS_SRC)/yarandom.h
+stonerview.o: ../../config.h
+stonerview.o: $(HACK_SRC)/fps.h
+stonerview.o: $(srcdir)/gltrackball.h
+stonerview.o: $(HACK_SRC)/recanim.h
+stonerview.o: $(HACK_SRC)/screenhackI.h
+stonerview.o: $(srcdir)/stonerview.h
+stonerview.o: $(srcdir)/stonerview-move.h
+stonerview.o: $(srcdir)/stonerview-osc.h
+stonerview.o: $(UTILS_SRC)/colors.h
+stonerview.o: $(UTILS_SRC)/erase.h
+stonerview.o: $(UTILS_SRC)/font-retry.h
+stonerview.o: $(UTILS_SRC)/grabscreen.h
+stonerview.o: $(UTILS_SRC)/hsv.h
+stonerview.o: $(UTILS_SRC)/resources.h
+stonerview.o: $(UTILS_SRC)/usleep.h
+stonerview.o: $(UTILS_SRC)/visual.h
+stonerview.o: $(UTILS_SRC)/yarandom.h
+stonerview.o: $(HACK_SRC)/xlockmoreI.h
+stonerview.o: $(HACK_SRC)/xlockmore.h
+stonerview-osc.o: ../../config.h
+stonerview-osc.o: $(srcdir)/stonerview.h
+stonerview-osc.o: $(srcdir)/stonerview-move.h
+stonerview-osc.o: $(srcdir)/stonerview-osc.h
+stonerview-osc.o: $(UTILS_SRC)/yarandom.h
+stonerview-view.o: ../../config.h
+stonerview-view.o: $(srcdir)/stonerview.h
+stonerview-view.o: $(srcdir)/stonerview-move.h
+stonerview-view.o: $(srcdir)/stonerview-osc.h
+superquadrics.o: ../../config.h
+superquadrics.o: $(HACK_SRC)/fps.h
+superquadrics.o: $(HACK_SRC)/recanim.h
+superquadrics.o: $(HACK_SRC)/screenhackI.h
+superquadrics.o: $(UTILS_SRC)/colors.h
+superquadrics.o: $(UTILS_SRC)/erase.h
+superquadrics.o: $(UTILS_SRC)/font-retry.h
+superquadrics.o: $(UTILS_SRC)/grabscreen.h
+superquadrics.o: $(UTILS_SRC)/hsv.h
+superquadrics.o: $(UTILS_SRC)/resources.h
+superquadrics.o: $(UTILS_SRC)/usleep.h
+superquadrics.o: $(UTILS_SRC)/visual.h
+superquadrics.o: $(UTILS_SRC)/yarandom.h
+superquadrics.o: $(HACK_SRC)/xlockmoreI.h
+superquadrics.o: $(HACK_SRC)/xlockmore.h
+surfaces.o: ../../config.h
+surfaces.o: $(HACK_SRC)/fps.h
+surfaces.o: $(srcdir)/gltrackball.h
+surfaces.o: $(HACK_SRC)/recanim.h
+surfaces.o: $(srcdir)/rotator.h
+surfaces.o: $(HACK_SRC)/screenhackI.h
+surfaces.o: $(UTILS_SRC)/colors.h
+surfaces.o: $(UTILS_SRC)/erase.h
+surfaces.o: $(UTILS_SRC)/font-retry.h
+surfaces.o: $(UTILS_SRC)/grabscreen.h
+surfaces.o: $(UTILS_SRC)/hsv.h
+surfaces.o: $(UTILS_SRC)/resources.h
+surfaces.o: $(UTILS_SRC)/usleep.h
+surfaces.o: $(UTILS_SRC)/visual.h
+surfaces.o: $(UTILS_SRC)/yarandom.h
+surfaces.o: $(HACK_SRC)/xlockmoreI.h
+surfaces.o: $(HACK_SRC)/xlockmore.h
+swim.o: $(srcdir)/atlantis.h
+swim.o: ../../config.h
+swim.o: $(HACK_SRC)/fps.h
+swim.o: $(HACK_SRC)/recanim.h
+swim.o: $(HACK_SRC)/screenhackI.h
+swim.o: $(UTILS_SRC)/colors.h
+swim.o: $(UTILS_SRC)/erase.h
+swim.o: $(UTILS_SRC)/font-retry.h
+swim.o: $(UTILS_SRC)/grabscreen.h
+swim.o: $(UTILS_SRC)/hsv.h
+swim.o: $(UTILS_SRC)/resources.h
+swim.o: $(UTILS_SRC)/usleep.h
+swim.o: $(UTILS_SRC)/visual.h
+swim.o: $(UTILS_SRC)/yarandom.h
+swim.o: $(HACK_SRC)/xlockmoreI.h
+tangram.o: ../../config.h
+tangram.o: $(HACK_SRC)/fps.h
+tangram.o: $(HACK_SRC)/recanim.h
+tangram.o: $(HACK_SRC)/screenhackI.h
+tangram.o: $(srcdir)/tangram_shapes.h
+tangram.o: $(srcdir)/texfont.h
+tangram.o: $(UTILS_SRC)/colors.h
+tangram.o: $(UTILS_SRC)/erase.h
+tangram.o: $(UTILS_SRC)/font-retry.h
+tangram.o: $(UTILS_SRC)/grabscreen.h
+tangram.o: $(UTILS_SRC)/hsv.h
+tangram.o: $(UTILS_SRC)/resources.h
+tangram.o: $(UTILS_SRC)/usleep.h
+tangram.o: $(UTILS_SRC)/visual.h
+tangram.o: $(UTILS_SRC)/yarandom.h
+tangram.o: $(HACK_SRC)/xlockmoreI.h
+tangram.o: $(HACK_SRC)/xlockmore.h
+tangram_shapes.o: ../../config.h
+tangram_shapes.o: $(srcdir)/tangram_shapes.h
+teapot.o: ../../config.h
+teapot.o: $(srcdir)/teapot.h
+texfont.o: ../../config.h
+texfont.o: $(HACK_SRC)/fps.h
+texfont.o: $(srcdir)/texfont.h
+texfont.o: $(UTILS_SRC)/pow2.h
+texfont.o: $(UTILS_SRC)/resources.h
+texfont.o: $(UTILS_SRC)/xft.h
+texfont.o: $(UTILS_SRC)/xshm.h
+timetunnel.o: ../../config.h
+timetunnel.o: $(HACK_SRC)/fps.h
+timetunnel.o: $(srcdir)/gltrackball.h
+timetunnel.o: $(HACK_SRC)/images/gen/logo-180_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/timetunnel0_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/timetunnel1_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/timetunnel2_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/tunnelstar_png.h
+timetunnel.o: $(HACK_SRC)/recanim.h
+timetunnel.o: $(srcdir)/rotator.h
+timetunnel.o: $(HACK_SRC)/screenhackI.h
+timetunnel.o: $(UTILS_SRC)/colors.h
+timetunnel.o: $(UTILS_SRC)/erase.h
+timetunnel.o: $(UTILS_SRC)/font-retry.h
+timetunnel.o: $(UTILS_SRC)/grabscreen.h
+timetunnel.o: $(UTILS_SRC)/hsv.h
+timetunnel.o: $(UTILS_SRC)/resources.h
+timetunnel.o: $(UTILS_SRC)/usleep.h
+timetunnel.o: $(UTILS_SRC)/visual.h
+timetunnel.o: $(UTILS_SRC)/yarandom.h
+timetunnel.o: $(HACK_SRC)/ximage-loader.h
+timetunnel.o: $(HACK_SRC)/xlockmoreI.h
+timetunnel.o: $(HACK_SRC)/xlockmore.h
+toast2.o: ../../config.h
+toast2.o: $(srcdir)/gllist.h
+toaster_base.o: ../../config.h
+toaster_base.o: $(srcdir)/gllist.h
+toaster_handle2.o: ../../config.h
+toaster_handle2.o: $(srcdir)/gllist.h
+toaster_handle.o: ../../config.h
+toaster_handle.o: $(srcdir)/gllist.h
+toaster_jet.o: ../../config.h
+toaster_jet.o: $(srcdir)/gllist.h
+toaster_knob.o: ../../config.h
+toaster_knob.o: $(srcdir)/gllist.h
+toaster.o: ../../config.h
+toaster.o: $(srcdir)/gllist.h
+toaster_slots.o: ../../config.h
+toaster_slots.o: $(srcdir)/gllist.h
+toaster_wing.o: ../../config.h
+toaster_wing.o: $(srcdir)/gllist.h
+toast.o: ../../config.h
+toast.o: $(srcdir)/gllist.h
+topblock.o: ../../config.h
+topblock.o: $(HACK_SRC)/fps.h
+topblock.o: $(srcdir)/gltrackball.h
+topblock.o: $(HACK_SRC)/recanim.h
+topblock.o: $(HACK_SRC)/screenhackI.h
+topblock.o: $(srcdir)/sphere.h
+topblock.o: $(srcdir)/topblock.h
+topblock.o: $(srcdir)/tube.h
+topblock.o: $(UTILS_SRC)/colors.h
+topblock.o: $(UTILS_SRC)/erase.h
+topblock.o: $(UTILS_SRC)/font-retry.h
+topblock.o: $(UTILS_SRC)/grabscreen.h
+topblock.o: $(UTILS_SRC)/hsv.h
+topblock.o: $(UTILS_SRC)/resources.h
+topblock.o: $(UTILS_SRC)/usleep.h
+topblock.o: $(UTILS_SRC)/visual.h
+topblock.o: $(UTILS_SRC)/yarandom.h
+topblock.o: $(HACK_SRC)/xlockmoreI.h
+topblock.o: $(HACK_SRC)/xlockmore.h
+trackball.o: ../../config.h
+trackball.o: $(srcdir)/trackball.h
+tronbit_idle1.o: ../../config.h
+tronbit_idle1.o: $(srcdir)/gllist.h
+tronbit_idle2.o: ../../config.h
+tronbit_idle2.o: $(srcdir)/gllist.h
+tronbit_no.o: ../../config.h
+tronbit_no.o: $(srcdir)/gllist.h
+tronbit.o: ../../config.h
+tronbit.o: $(HACK_SRC)/fps.h
+tronbit.o: $(srcdir)/gllist.h
+tronbit.o: $(srcdir)/gltrackball.h
+tronbit.o: $(HACK_SRC)/recanim.h
+tronbit.o: $(srcdir)/rotator.h
+tronbit.o: $(HACK_SRC)/screenhackI.h
+tronbit.o: $(srcdir)/sphere.h
+tronbit.o: $(UTILS_SRC)/colors.h
+tronbit.o: $(UTILS_SRC)/erase.h
+tronbit.o: $(UTILS_SRC)/font-retry.h
+tronbit.o: $(UTILS_SRC)/grabscreen.h
+tronbit.o: $(UTILS_SRC)/hsv.h
+tronbit.o: $(UTILS_SRC)/resources.h
+tronbit.o: $(UTILS_SRC)/usleep.h
+tronbit.o: $(UTILS_SRC)/visual.h
+tronbit.o: $(UTILS_SRC)/yarandom.h
+tronbit.o: $(HACK_SRC)/xlockmoreI.h
+tronbit.o: $(HACK_SRC)/xlockmore.h
+tronbit_yes.o: ../../config.h
+tronbit_yes.o: $(srcdir)/gllist.h
+tube.o: ../../config.h
+tube.o: $(srcdir)/tube.h
+tunnel_draw.o: ../../config.h
+tunnel_draw.o: $(HACK_SRC)/fps.h
+tunnel_draw.o: $(HACK_SRC)/recanim.h
+tunnel_draw.o: $(HACK_SRC)/screenhackI.h
+tunnel_draw.o: $(srcdir)/tunnel_draw.h
+tunnel_draw.o: $(UTILS_SRC)/colors.h
+tunnel_draw.o: $(UTILS_SRC)/erase.h
+tunnel_draw.o: $(UTILS_SRC)/font-retry.h
+tunnel_draw.o: $(UTILS_SRC)/grabscreen.h
+tunnel_draw.o: $(UTILS_SRC)/hsv.h
+tunnel_draw.o: $(UTILS_SRC)/resources.h
+tunnel_draw.o: $(UTILS_SRC)/usleep.h
+tunnel_draw.o: $(UTILS_SRC)/visual.h
+tunnel_draw.o: $(UTILS_SRC)/yarandom.h
+tunnel_draw.o: $(HACK_SRC)/xlockmoreI.h
+unicrud.o: ../../config.h
+unicrud.o: $(HACK_SRC)/fps.h
+unicrud.o: $(srcdir)/gltrackball.h
+unicrud.o: $(HACK_SRC)/recanim.h
+unicrud.o: $(srcdir)/rotator.h
+unicrud.o: $(HACK_SRC)/screenhackI.h
+unicrud.o: $(srcdir)/texfont.h
+unicrud.o: $(UTILS_SRC)/colors.h
+unicrud.o: $(UTILS_SRC)/erase.h
+unicrud.o: $(UTILS_SRC)/font-retry.h
+unicrud.o: $(UTILS_SRC)/grabscreen.h
+unicrud.o: $(UTILS_SRC)/hsv.h
+unicrud.o: $(UTILS_SRC)/resources.h
+unicrud.o: $(UTILS_SRC)/usleep.h
+unicrud.o: $(UTILS_SRC)/utf8wc.h
+unicrud.o: $(UTILS_SRC)/visual.h
+unicrud.o: $(UTILS_SRC)/yarandom.h
+unicrud.o: $(HACK_SRC)/xlockmoreI.h
+unicrud.o: $(HACK_SRC)/xlockmore.h
+unknownpleasures.o: ../../config.h
+unknownpleasures.o: $(HACK_SRC)/fps.h
+unknownpleasures.o: $(srcdir)/gltrackball.h
+unknownpleasures.o: $(HACK_SRC)/recanim.h
+unknownpleasures.o: $(HACK_SRC)/screenhackI.h
+unknownpleasures.o: $(UTILS_SRC)/colors.h
+unknownpleasures.o: $(UTILS_SRC)/erase.h
+unknownpleasures.o: $(UTILS_SRC)/font-retry.h
+unknownpleasures.o: $(UTILS_SRC)/grabscreen.h
+unknownpleasures.o: $(UTILS_SRC)/hsv.h
+unknownpleasures.o: $(UTILS_SRC)/resources.h
+unknownpleasures.o: $(UTILS_SRC)/usleep.h
+unknownpleasures.o: $(UTILS_SRC)/visual.h
+unknownpleasures.o: $(UTILS_SRC)/yarandom.h
+unknownpleasures.o: $(HACK_SRC)/xlockmoreI.h
+unknownpleasures.o: $(HACK_SRC)/xlockmore.h
+vigilance.o: ../../config.h
+vigilance.o: $(HACK_SRC)/fps.h
+vigilance.o: $(srcdir)/gllist.h
+vigilance.o: $(srcdir)/gltrackball.h
+vigilance.o: $(srcdir)/normals.h
+vigilance.o: $(HACK_SRC)/recanim.h
+vigilance.o: $(HACK_SRC)/screenhackI.h
+vigilance.o: $(UTILS_SRC)/colors.h
+vigilance.o: $(UTILS_SRC)/erase.h
+vigilance.o: $(UTILS_SRC)/font-retry.h
+vigilance.o: $(UTILS_SRC)/grabscreen.h
+vigilance.o: $(UTILS_SRC)/hsv.h
+vigilance.o: $(UTILS_SRC)/resources.h
+vigilance.o: $(UTILS_SRC)/usleep.h
+vigilance.o: $(UTILS_SRC)/visual.h
+vigilance.o: $(UTILS_SRC)/yarandom.h
+vigilance.o: $(HACK_SRC)/ximage-loader.h
+vigilance.o: $(HACK_SRC)/xlockmoreI.h
+vigilance.o: $(HACK_SRC)/xlockmore.h
+voronoi.o: ../../config.h
+voronoi.o: $(HACK_SRC)/fps.h
+voronoi.o: $(HACK_SRC)/recanim.h
+voronoi.o: $(HACK_SRC)/screenhackI.h
+voronoi.o: $(UTILS_SRC)/colors.h
+voronoi.o: $(UTILS_SRC)/erase.h
+voronoi.o: $(UTILS_SRC)/font-retry.h
+voronoi.o: $(UTILS_SRC)/grabscreen.h
+voronoi.o: $(UTILS_SRC)/hsv.h
+voronoi.o: $(UTILS_SRC)/resources.h
+voronoi.o: $(UTILS_SRC)/usleep.h
+voronoi.o: $(UTILS_SRC)/visual.h
+voronoi.o: $(UTILS_SRC)/yarandom.h
+voronoi.o: $(HACK_SRC)/xlockmoreI.h
+voronoi.o: $(HACK_SRC)/xlockmore.h
+whale.o: $(srcdir)/atlantis.h
+whale.o: ../../config.h
+whale.o: $(HACK_SRC)/fps.h
+whale.o: $(HACK_SRC)/recanim.h
+whale.o: $(HACK_SRC)/screenhackI.h
+whale.o: $(UTILS_SRC)/colors.h
+whale.o: $(UTILS_SRC)/font-retry.h
+whale.o: $(UTILS_SRC)/grabscreen.h
+whale.o: $(UTILS_SRC)/hsv.h
+whale.o: $(UTILS_SRC)/resources.h
+whale.o: $(UTILS_SRC)/usleep.h
+whale.o: $(UTILS_SRC)/visual.h
+whale.o: $(UTILS_SRC)/yarandom.h
+winduprobot.o: ../../config.h
+winduprobot.o: $(HACK_SRC)/fps.h
+winduprobot.o: $(srcdir)/gllist.h
+winduprobot.o: $(srcdir)/gltrackball.h
+winduprobot.o: $(HACK_SRC)/images/gen/chromesphere_png.h
+winduprobot.o: $(srcdir)/involute.h
+winduprobot.o: $(HACK_SRC)/recanim.h
+winduprobot.o: $(HACK_SRC)/screenhackI.h
+winduprobot.o: $(srcdir)/sphere.h
+winduprobot.o: $(srcdir)/texfont.h
+winduprobot.o: $(UTILS_SRC)/colors.h
+winduprobot.o: $(UTILS_SRC)/erase.h
+winduprobot.o: $(UTILS_SRC)/font-retry.h
+winduprobot.o: $(UTILS_SRC)/grabscreen.h
+winduprobot.o: $(UTILS_SRC)/hsv.h
+winduprobot.o: $(UTILS_SRC)/resources.h
+winduprobot.o: $(UTILS_SRC)/textclient.h
+winduprobot.o: $(UTILS_SRC)/usleep.h
+winduprobot.o: $(UTILS_SRC)/visual.h
+winduprobot.o: $(UTILS_SRC)/yarandom.h
+winduprobot.o: $(HACK_SRC)/ximage-loader.h
+winduprobot.o: $(HACK_SRC)/xlockmoreI.h
+winduprobot.o: $(HACK_SRC)/xlockmore.h
+xlock-gl-utils.o: ../../config.h
+xlock-gl-utils.o: $(HACK_SRC)/fps.h
+xlock-gl-utils.o: $(HACK_SRC)/recanim.h
+xlock-gl-utils.o: $(HACK_SRC)/screenhackI.h
+xlock-gl-utils.o: $(srcdir)/texfont.h
+xlock-gl-utils.o: $(UTILS_SRC)/colors.h
+xlock-gl-utils.o: $(UTILS_SRC)/erase.h
+xlock-gl-utils.o: $(UTILS_SRC)/font-retry.h
+xlock-gl-utils.o: $(UTILS_SRC)/grabscreen.h
+xlock-gl-utils.o: $(UTILS_SRC)/hsv.h
+xlock-gl-utils.o: $(UTILS_SRC)/resources.h
+xlock-gl-utils.o: $(UTILS_SRC)/usleep.h
+xlock-gl-utils.o: $(UTILS_SRC)/visual.h
+xlock-gl-utils.o: $(UTILS_SRC)/yarandom.h
+xlock-gl-utils.o: $(HACK_SRC)/xlockmoreI.h
+xscreensaver-gl-helper.o: ../../config.h
+xscreensaver-gl-helper.o: $(UTILS_SRC)/utils.h
+xscreensaver-gl-helper.o: $(UTILS_SRC)/visual.h
+
diff --git a/hacks/glx/README b/hacks/glx/README
new file mode 100644
index 0000000..5142503
--- /dev/null
+++ b/hacks/glx/README
@@ -0,0 +1,10 @@
+
+This directory contains various graphics hacks that requre OpenGL. These are
+independent from the xscreensaver program (in the ../../driver/ directory)
+but some of them use the utility functions found in the ../../utils/ directory.
+
+If you have compilation problems, check the parameters in ../../config.h.
+
+If you're looking for a free implementation of the OpenGL library,
+check out <http://www.mesa3d.org/>. For general OpenGL info, see
+<http://www.opengl.org/>.
diff --git a/hacks/glx/antinspect.c b/hacks/glx/antinspect.c
new file mode 100644
index 0000000..ad3bef5
--- /dev/null
+++ b/hacks/glx/antinspect.c
@@ -0,0 +1,704 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2004 Blair Tennessy
+ * tennessy@cs.ubc.ca
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n"
+
+# define free_antinspect 0
+# define release_antinspect 0
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "sphere.h"
+#include "gltrackball.h"
+
+#define DEF_SHADOWS "True"
+
+static int shadows;
+
+static XrmOptionDescRec opts[] = {
+ {"-shadows", ".antinspect.shadows", XrmoptionNoArg, "on"},
+ {"+shadows", ".antinspect.shadows", XrmoptionNoArg, "off"}
+};
+
+static argtype vars[] = {
+ {&shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool}
+};
+
+static OptionStruct desc[] = {
+ {"-/+shadows", "turn on/off ant shadows"}
+};
+
+ENTRYPOINT ModeSpecOpt antinspect_opts = {sizeof opts / sizeof opts[0],
+ opts,
+ sizeof vars / sizeof vars[0],
+ vars,
+ desc};
+
+#ifdef USE_MODULES
+ModStruct antinspect_description =
+ {"antinspect", "init_antinspect", "draw_antinspect", (char *) NULL,
+ "draw_antinspect", "change_antinspect", (char *) NULL, &antinspect_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "draws some ants", 0, NULL};
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#define ObjAntinspectStrip 0
+#define ObjAntBody 1
+#define MaxObj 2
+
+/*************************************************************************/
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLfloat ant_position;
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int linewidth;
+ float ant_step;
+
+} antinspectstruct;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static float position0[] = {0.0, 3.0, 0.0, 1.0};
+static const float position1[] = {-1.0, -3.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
+static const float MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};
+static const float MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+static const float MaterialBlack[] = {0.1, 0.1, 0.1, 0.4};
+static const float MaterialShadow[] = {0.3, 0.3, 0.3, 0.3};
+static const float MaterialGray5[] = {0.5, 0.5, 0.5, 0.3};
+static const float MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
+
+static antinspectstruct *antinspect = (antinspectstruct *) NULL;
+
+#define NUM_SCENES 2
+
+enum {X, Y, Z, W};
+enum {A, B, C, D};
+
+/* create a matrix that will project the desired shadow */
+static void shadowmatrix(GLfloat shadowMat[4][4],
+ const GLfloat groundplane[4],
+ const GLfloat lightpos[4])
+{
+ GLfloat dot;
+
+ /* find dot product between light position vector and ground plane normal */
+ dot = groundplane[X] * lightpos[X] +
+ groundplane[Y] * lightpos[Y] +
+ groundplane[Z] * lightpos[Z] +
+ groundplane[W] * lightpos[W];
+
+ shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
+ shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
+ shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
+ shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];
+
+ shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
+ shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
+ shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
+ shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];
+
+ shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
+ shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
+ shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
+ shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];
+
+ shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
+ shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
+ shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
+ shadowMat[3][3] = dot - lightpos[W] * groundplane[W];
+}
+
+static const GLfloat ground[4] = {0.0, 1.0, 0.0, -0.00001};
+
+/* simple filled sphere */
+static Bool mySphere(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, False);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+/* caged sphere */
+static Bool mySphere2(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_LINE);/*GLU_SILHOUETTE);*/
+ gluSphere(quadObj, radius, 16, 8);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 8, True);
+ glPopMatrix();
+#endif
+
+ return True;
+}
+
+/* null cone */
+static Bool myCone2(float radius)
+{
+ return True;
+}
+
+/* draw an ant */
+static Bool draw_antinspect_ant(ModeInfo *mi, antinspectstruct * mp,
+ const float *Material, int mono,
+ Bool (*sphere)(float), Bool (*cone)(float))
+{
+ float cos1 = cos(mp->ant_step);
+ float cos2 = cos(mp->ant_step + 2 * Pi / 3);
+ float cos3 = cos(mp->ant_step + 4 * Pi / 3);
+ float sin1 = sin(mp->ant_step);
+ float sin2 = sin(mp->ant_step + 2 * Pi / 3);
+ float sin3 = sin(mp->ant_step + 4 * Pi / 3);
+
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Material);
+ glEnable(GL_CULL_FACE);
+ glPushMatrix();
+ glScalef(1, 1.3, 1);
+ if (!((*sphere)(0.18)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glTranslatef(0.00, 0.30, 0.00);
+ if (!((*sphere)(0.2)))
+ return False;
+
+ glTranslatef(-0.05, 0.17, 0.05);
+ glRotatef(-90, 1, 0, 0);
+ glRotatef(-25, 0, 1, 0);
+ if (!((*cone)(0.05)))
+ return False;
+ glTranslatef(0.00, 0.10, 0.00);
+ if (!((*cone)(0.05)))
+ return False;
+ glRotatef(25, 0, 1, 0);
+ glRotatef(90, 1, 0, 0);
+
+ glScalef(1, 1.3, 1);
+ glTranslatef(0.15, -0.65, 0.05);
+ if (!((*sphere)(0.25)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glPopMatrix();
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_LIGHTING);
+
+ /* ANTENNAS */
+ glBegin(GL_LINES);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+ glBegin(GL_POINTS);
+ if (mono)
+ glColor3fv(MaterialGray6);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.00, 0.18);
+ glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ mi->polygon_count++;
+ glEnd();
+ mi->polygon_count++;
+
+ /* LEFT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, -0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.00, -0.18);
+ glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, -0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ glEnable(GL_LIGHTING);
+
+ return True;
+}
+
+/* only works with 3 right now */
+#define ANTCOUNT 3
+
+static const float MaterialBen[4] = {0.25, 0.30, 0.46, 1.0};
+
+static const float* antmaterial[ANTCOUNT] =
+ {MaterialRed, MaterialBen, MaterialOrange};
+static double antposition[ANTCOUNT] = {0.0, 120.0, 240.0};
+static const double antvelocity[ANTCOUNT] = {0.3, 0.3, 0.3};
+static const double antsphere[ANTCOUNT] = {1.2, 1.2, 1.2};
+
+/* permutations */
+static const double antorder[6][ANTCOUNT] = {{0, 1, 2},
+ {0, 2, 1},
+ {2, 0, 1},
+ {2, 1, 0},
+ {1, 2, 0},
+ {1, 0, 2}};
+
+/* draw the scene */
+static Bool draw_antinspect_strip(ModeInfo * mi)
+{
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+ int i, j;
+ int mono = MI_IS_MONO(mi);
+
+ int ro = (((int)antposition[1])/(360/(2*ANTCOUNT))) % (2*ANTCOUNT);
+
+ glEnable(GL_TEXTURE_2D);
+ position0[1] = 9.6;
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+ glRotatef(-30.0, 0.0, 1.0, 0.0);
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+
+ /* render ground plane */
+ glBegin(GL_TRIANGLES);
+ glColor4fv(MaterialShadow);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlack);
+ glNormal3f(0.0, 1.0, 0.0);
+
+ /* middle tri */
+ glVertex3f(0.0, 0.0, -1.0);
+ glVertex3f(-sqrt(3.0)/2.0, 0.0, 0.5);
+ glVertex3f(sqrt(3.0)/2.0, 0.0, 0.5);
+ mi->polygon_count++;
+ glEnd();
+
+ /* rotate */
+ for(i = 0; i < 3; ++i) {
+ glRotatef(120.0, 0.0, 1.0, 0.0);
+ glBegin(GL_TRIANGLES);
+ glVertex3f(0.0, 0.0, 1.0 + 3.0);
+ glVertex3f(sqrt(3.0)/2.0, 0.0, -0.5 + 3.0);
+ glVertex3f(-sqrt(3.0)/2.0, 0.0, -0.5 + 3.0);
+ mi->polygon_count++;
+ glEnd();
+ }
+
+ /* first render shadows -- no depth required */
+ if(shadows) {
+ GLfloat m[4][4];
+ shadowmatrix(m, ground, position0);
+
+ glColor4fv(MaterialShadow);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+
+ glDisable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+
+ /* display ant shadow */
+ glPushMatrix();
+ glTranslatef(0.0, 0.001, 0.0);
+ glMultMatrixf(m[0]);
+
+ for(i = 0; i < ANTCOUNT; ++i) {
+
+ /* draw ant */
+ glPushMatrix();
+
+ /* center */
+ glRotatef(antposition[i], 0.0, 1.0, 0.0);
+ glTranslatef(2.4, 0.0, 0.0);
+ glTranslatef(0.0, antsphere[i], 0.0);
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+
+ /* orient ant */
+ glRotatef(10.0, 0.0, 1.0, 0.0);
+ glRotatef(40.0, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, -0.8, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+
+ /* set colour */
+ glColor4fv(MaterialShadow);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+
+ if(antposition[i] > 360.0)
+ antposition[i] = 0.0;
+ draw_antinspect_ant(mi, mp, MaterialShadow, mono, mySphere2, myCone2);
+
+ glDisable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+
+ /* draw sphere */
+ glRotatef(-20.0, 1.0, 0.0, 0.0);
+ glRotatef(-mp->ant_step*2, 0.0, 0.0, 1.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+ mySphere2(1.2);
+
+ glPopMatrix();
+ }
+
+ glPopMatrix();
+ }
+
+ glEnable(GL_LIGHTING);
+
+ /* truants */
+ for(j = 0; j < ANTCOUNT; ++j) {
+ /* determine rendering order */
+ i = antorder[ro][j];
+
+ glPushMatrix();
+
+ /* center */
+ glRotatef(antposition[i], 0.0, 1.0, 0.0);
+ glTranslatef(2.4, 0.0, 0.0);
+ glTranslatef(0.0, antsphere[i], 0.0);
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+
+ /* draw ant */
+ glPushMatrix();
+ glRotatef(10.0, 0.0, 1.0, 0.0);
+ glRotatef(40.0, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, -0.8, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ if(antposition[i] > 360.0)
+ antposition[i] = 0.0;
+ glEnable(GL_BLEND);
+ draw_antinspect_ant(mi, mp, antmaterial[i], mono, mySphere2, myCone2);
+ glDisable(GL_BLEND);
+ glPopMatrix();
+
+ /* draw sphere */
+ glRotatef(-20.0, 1.0, 0.0, 0.0);
+ glRotatef(-mp->ant_step*2, 0.0, 0.0, 1.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : antmaterial[i]);
+ mySphere2(1.2);
+ glEnable(GL_BLEND);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlack);
+ mySphere(1.16);
+ glDisable(GL_BLEND);
+
+ glPopMatrix();
+
+ /* finally, evolve */
+ antposition[i] += antvelocity[i];
+ }
+
+ /* but the step size is the same! */
+ mp->ant_step += 0.2;
+
+ mp->ant_position += 1;
+ return True;
+}
+
+ENTRYPOINT void reshape_antinspect(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+ mp->linewidth = (width / 512) + 1;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective(45, 1/h, 7.0, 20.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLineWidth(mp->linewidth);
+ glPointSize(mp->linewidth);
+}
+
+static void pinit(void)
+{
+ glClearDepth(1.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+
+ /* antinspect */
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+ENTRYPOINT Bool antinspect_handle_event (ModeInfo *mi, XEvent *event)
+{
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ return False;
+}
+
+ENTRYPOINT void init_antinspect(ModeInfo * mi)
+{
+ antinspectstruct *mp;
+
+ MI_INIT(mi, antinspect);
+ mp = &antinspect[MI_SCREEN(mi)];
+ mp->step = NRAND(90);
+ mp->ant_position = NRAND(90);
+ mp->trackball = gltrackball_init (False);
+
+ if ((mp->glx_context = init_GL(mi)) != NULL) {
+ reshape_antinspect(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit();
+ }
+ else
+ MI_CLEARWINDOW(mi);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+}
+
+ENTRYPOINT void draw_antinspect(ModeInfo * mi)
+{
+ antinspectstruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!antinspect)
+ return;
+ mp = &antinspect[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if(!mp->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ mi->polygon_count = 0;
+
+ /* position camera --- this works well, we can peer inside
+ the antbubble */
+ glTranslatef(0.0, 0.0, -10.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ gltrackball_rotate(mp->trackball);
+ glRotatef((15.0/2.0 + 15.0*sin(mp->ant_step/100.0)), 1.0, 0.0, 0.0);
+ glRotatef(30.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+
+ if (!draw_antinspect_strip(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ mp->step += 0.025;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_antinspect(ModeInfo * mi)
+{
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("AntInspect", antinspect)
diff --git a/hacks/glx/antinspect.man b/hacks/glx/antinspect.man
new file mode 100644
index 0000000..804d7a4
--- /dev/null
+++ b/hacks/glx/antinspect.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "March 2004"
+.SH NAME
+antinspect \- ant model inspection screenhack
+.SH SYNOPSIS
+.B antinspect
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIantinspect\fP code displays three ant-powered balls churning in a
+circle.
+.SH OPTIONS
+.I antinspect
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-shadows
+Draw shadows on ground
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessy@cs.ubc.ca>, 15-March-2004.
+
diff --git a/hacks/glx/antmaze.c b/hacks/glx/antmaze.c
new file mode 100644
index 0000000..79b7e0b
--- /dev/null
+++ b/hacks/glx/antmaze.c
@@ -0,0 +1,1613 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2004 Blair Tennessy
+ * tennessy@cs.ubc.ca
+ */
+
+#if 0
+static const char sccsid[] = "@(#)antmaze.c 5.01 2001/03/01 xlockmore";
+#endif
+
+#ifdef STANDALONE
+# define MODE_antmaze
+# define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n"
+
+# define free_antmaze 0
+# define release_antmaze 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef MODE_antmaze
+
+
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+#define DEF_SOLIDANTMAZE "False"
+#define DEF_NOANTS "False"
+
+static int solidantmaze;
+static int noants;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-solidantmaze", ".antmaze.solidantmaze", XrmoptionNoArg, "on"},
+ {"+solidantmaze", ".antmaze.solidantmaze", XrmoptionNoArg, "off"},
+ {"-noants", ".antmaze.noants", XrmoptionNoArg, "on"},
+ {"+noants", ".antmaze.noants", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&solidantmaze, "solidantmaze", "Solidantmaze", DEF_SOLIDANTMAZE, t_Bool},
+ {&noants, "noants", "Noants", DEF_NOANTS, t_Bool}
+};
+
+static OptionStruct desc[] =
+{
+ {"-/+solidantmaze", "select between a SOLID or a NET Antmaze Strip"},
+ {"-/+noants", "turn on/off walking ants"}
+};
+
+ENTRYPOINT ModeSpecOpt antmaze_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct antmaze_description =
+{"antmaze", "init_antmaze", "draw_antmaze", NULL,
+ "draw_antmaze", "change_antmaze", NULL, &antmaze_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "draws some ants", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#define ObjAntmazeStrip 0
+#define ObjAntBody 1
+#define MaxObj 2
+
+/*************************************************************************/
+
+#include "ants.h"
+
+#define ANTCOUNT 5
+#define PI 3.14157
+
+#define EPSILON 0.01
+#define BOARDSIZE 10
+#define BOARDCOUNT 2
+#define PARTS 20
+
+#define checkImageWidth 64
+#define checkImageHeight 64
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLfloat ant_position;
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int focus;
+ int currentboard;
+
+ double antdirection[ANTCOUNT];
+ double antposition[ANTCOUNT][3];
+ int anton[ANTCOUNT];
+
+ double antvelocity[ANTCOUNT];
+ double antsize[ANTCOUNT];
+ int bposition[ANTCOUNT][2];
+ int board[BOARDCOUNT][10][10];
+
+ int part[ANTCOUNT];
+ double antpath[ANTCOUNT][PARTS][2];
+ int antpathlength[ANTCOUNT];
+
+ GLubyte checkers[checkImageWidth][checkImageHeight][3];
+
+ GLuint checktexture, brushedtexture;
+ double elevator;
+
+ double ant_step;
+ double first_ant_step;
+ int started;
+ int introduced;
+ int entroducing;
+
+ double fadeout;
+ double fadeoutspeed;
+
+ int mag;
+
+} antmazestruct;
+
+static antmazestruct *antmaze = (antmazestruct *) NULL;
+
+
+static const GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
+/*static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};*/
+static const GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};
+static const GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0};
+static const GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};
+static const GLfloat MaterialGreen[] = {0.1, 0.4, 0.2, 1.0};
+
+/* lighting variables */
+static const GLfloat front_shininess[] = {60.0};
+static const GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat ambient[] = {0.1, 0.1, 0.1, 1.0};
+/*static const GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};*/
+static const GLfloat diffuse[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat position0[] = {1.0, 5.0, 1.0, 1.0};
+static const GLfloat position1[] = {-1.0, -5.0, 1.0, 1.0};
+/*static const GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};*/
+/*static const GLfloat lmodel_twoside[] = {GL_TRUE};*/
+/*static const GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };*/
+/*static const GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };*/
+
+#define NUM_SCENES 2
+
+/* filled sphere */
+static Bool mySphere(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, False);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+#if 0
+/* silhouette sphere */
+static Bool mySphere2(float radius)
+{
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_SILHOUETTE);
+ gluSphere(quadObj, radius, 16, 8);
+ gluDeleteQuadric(quadObj);
+
+ return True;
+}
+#endif
+
+/* textured sphere */
+static Bool mySphereTex(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluQuadricTexture(quadObj, GL_TRUE);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ gluSphere(quadObj, radius, 32, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (32, 16, False);
+ glPopMatrix();
+#endif
+
+ return True;
+}
+
+/* filled cone */
+static Bool myCone(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if ((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluCylinder(quadObj, radius, 0, radius * 2, 8, 1);
+ gluDeleteQuadric(quadObj);
+#else
+ cone (0, 0, 0,
+ 0, 0, radius * 2,
+ radius, 0,
+ 8, True, True, False);
+#endif
+ return True;
+}
+
+/* no cone */
+static Bool myCone2(float radius) { return True; }
+
+#define MATERIALS 4
+static const float *antmaterial[ANTCOUNT] =
+ {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange, MaterialGreen};
+
+static const float *materials[MATERIALS] =
+ {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange};
+
+
+static void makeCheckImage(antmazestruct *mp)
+{
+ int i, j;
+
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ if(((((i&0x8)==0)^((j&0x8)))==0)) {
+ int c = 102 + random()%32;
+ mp->checkers[i][j][0] = c;
+ mp->checkers[i][j][1] = c;
+ mp->checkers[i][j][2] = c;
+ }
+ else {
+ int c = 153 + random()%32;
+ mp->checkers[i][j][0] = c;/*153;*/
+ mp->checkers[i][j][1] = c;/*c;*//*0;*/
+ mp->checkers[i][j][2] = c;/*c;*//*0;*/
+ }
+ }
+ }
+
+ glGenTextures(1, &mp->checktexture);
+ glBindTexture(GL_TEXTURE_2D, mp->checktexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &mp->checkers[0][0]);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+static void makeBrushedImage(antmazestruct *mp)
+{
+ int i, j, c;
+
+ for(i = 0; i < checkImageWidth; ++i)
+ for(j = 0; j < checkImageHeight; ++j) {
+
+ c = 102+102*fabs(sin(2.0*i / Pi)*sin(2.0*j/Pi)) + random()%51;
+
+/* c = (i+j)%8==0 || (i+j+5)%8==0 ? 153 : 102; */
+
+ mp->checkers[i][j][0] = c;
+ mp->checkers[i][j][1] = c;
+ mp->checkers[i][j][2] = c;
+ }
+
+/* for (i = 0; i < checkImageWidth; i++) { */
+/* for (j = 0; j < checkImageHeight; j++) { */
+/* int c = 102 + pow((random()%1000)/1000.0, 4)*103; */
+/* checkers[i][j][0] = c; */
+/* checkers[i][j][1] = c; */
+/* checkers[i][j][2] = c; */
+/* } */
+/* } */
+
+/* /\* smooth *\/ */
+/* for (i = 0; i < checkImageWidth; i++) { */
+/* for (j = 0; j < checkImageHeight; j++) { */
+/* int a = checkers[(i+checkImageWidth+1)%checkImageWidth][j][0] + */
+/* 4*checkers[i][j][0] + checkers[(i+1)%checkImageWidth][j][0]; */
+/* a /= 6; */
+/* checkers[i][j][0] = a; */
+/* checkers[i][j][1] = a; */
+/* checkers[i][j][2] = a; */
+/* } */
+/* } */
+
+ glGenTextures(1, &mp->brushedtexture);
+ glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &mp->checkers[0][0]);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+#if 0
+static void draw_wall(ModeInfo *mi, double x1, double z1, double x2, double z2)
+{
+ float x = fabs(x2 - x1)/2.0;
+
+ glBegin(GL_QUADS);
+
+ /* draw top */
+ glNormal3f(0.0, 1.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 1.0, z1+0.25);
+ glTexCoord2f(x, 0.0);
+ glVertex3f(x2, 1.0, z2+0.25);
+ glTexCoord2f(x, 0.25);
+ glVertex3f(x2, 1.0, z2-0.25);
+ glTexCoord2f(0.0, 0.25);
+ glVertex3f(x1, 1.0, z1-0.25);
+ mi->polygon_count++;
+
+ /* draw sides */
+ glNormal3f(0.0, 0.0, 1.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 0.0, z1+0.25);
+ glTexCoord2f(x, 0.0);
+ glVertex3f(x2, 0.0, z2+0.25);
+ glTexCoord2f(x, 0.5);
+ glVertex3f(x2, 1.0, z2+0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x1, 1.0, z1+0.25);
+ mi->polygon_count++;
+
+ glNormal3f(0.0, 0.0, -1.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 0.0, z1-0.25);
+ glTexCoord2f(x, 0.0);
+ glVertex3f(x2, 0.0, z2-0.25);
+ glTexCoord2f(x, 0.5);
+ glVertex3f(x2, 1.0, z2-0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x1, 1.0, z1-0.25);
+ mi->polygon_count++;
+
+ /* draw ends */
+ glNormal3f(1.0, 0.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x2, 0.0, z2+0.25);
+ glTexCoord2f(0.25, 0.0);
+ glVertex3f(x2, 0.0, z2-0.25);
+ glTexCoord2f(0.25, 0.5);
+ glVertex3f(x2, 1.0, z2-0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x2, 1.0, z2+0.25);
+ mi->polygon_count++;
+
+ glNormal3f(-1.0, 0.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 0.0, z1-0.25);
+ glTexCoord2f(0.25, 0.0);
+ glVertex3f(x1, 0.0, z1+0.25);
+ glTexCoord2f(0.25, 0.5);
+ glVertex3f(x1, 1.0, z1+0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x1, 1.0, z1-0.25);
+ mi->polygon_count++;
+
+ glEnd();
+}
+#endif
+
+static void draw_board(ModeInfo *mi, antmazestruct *mp)
+{
+
+ int i, j;
+ double h = 0.5;
+ double stf = 0.0625;
+
+ glBindTexture(GL_TEXTURE_2D, mp->checktexture);
+
+ glBegin(GL_QUADS);
+
+ for(i = 0; i < BOARDSIZE; ++i)
+ for(j = 0; j < BOARDSIZE; ++j) {
+ if(mp->board[mp->currentboard][j][i]) {
+
+/* /\* draw top *\/ */
+/* glNormal3f(0.0, 1.0, 0.0); */
+/* glTexCoord2f(0.0 + stf, 0.0 + stf); */
+/* glVertex3f(i-0.5, h, j+0.5); */
+/* glTexCoord2f(1.0 + stf, 0.0 + stf); */
+/* glVertex3f(i+0.5, h, j+0.5); */
+/* glTexCoord2f(1.0 + stf, 1.0 + stf); */
+/* glVertex3f(i+0.5, h, j-0.5); */
+/* glTexCoord2f(0.0 + stf, 1.0 + stf); */
+/* glVertex3f(i-0.5, h, j-0.5); */
+
+ /* draw top */
+ glNormal3f(0.0, 1.0, 0.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, h, j+0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, h, j+0.5);
+ glTexCoord2f(1.0 + stf, 1.0 + stf);
+ glVertex3f(i+0.5, h, j-0.5);
+ glTexCoord2f(0.0 + stf, 1.0 + stf);
+ glVertex3f(i-0.5, h, j-0.5);
+ mi->polygon_count++;
+
+ /* draw south face */
+ if(j == 9 || !mp->board[mp->currentboard][j+1][i]) {
+ glNormal3f(0.0, 0.0, 1.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j+0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j+0.5);
+ mi->polygon_count++;
+ }
+
+ /* draw north face */
+ if(j == 0 || !mp->board[mp->currentboard][j-1][i]) {
+ glNormal3f(0.0, 0.0, -1.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j-0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j-0.5);
+ mi->polygon_count++;
+ }
+
+ /* draw east face */
+ if(i == 9 || !mp->board[mp->currentboard][j][i+1]) {
+ glNormal3f(1.0, 0.0, 0.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j-0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j+0.5);
+ mi->polygon_count++;
+ }
+
+ /* draw west face */
+ if(i == 0 || !mp->board[mp->currentboard][j][i-1]) {
+ glNormal3f(-1.0, 0.0, 0.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j+0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j-0.5);
+ mi->polygon_count++;
+ }
+ }
+ else {
+ double tx = 2.0;
+ glNormal3f(0.0, 1.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(i-0.5, 0.0, j+0.5);
+ glTexCoord2f(tx, 0.0);
+ glVertex3f(i+0.5, 0.0, j+0.5);
+ glTexCoord2f(tx, tx);
+ glVertex3f(i+0.5, 0.0, j-0.5);
+ glTexCoord2f(0.0, tx);
+ glVertex3f(i-0.5, 0.0, j-0.5);
+ mi->polygon_count++;
+ }
+ }
+ glEnd();
+
+/* /\* draw elevator *\/ */
+/* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
+
+/* glBegin(GL_QUADS); */
+
+/* glNormal3f(0.0, 1.0, 0.0); */
+
+/* if(pastfirst) { */
+/* /\* source *\/ */
+/* glTexCoord2f(0.0, 0.0); */
+/* glVertex3f(0.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
+/* glTexCoord2f(1.0, 0.0); */
+/* glVertex3f(1.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
+/* glTexCoord2f(1.0, 1.5); */
+/* glVertex3f(1.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
+/* glTexCoord2f(0.0, 1.5); */
+/* glVertex3f(0.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
+/* mi->polygon_count++; */
+/* } */
+
+/* /\* destination *\/ */
+/* glTexCoord2f(0.0, 0.0); */
+/* glVertex3f(BOARDSIZE - 2.5, elevator, -2.0 - 0.2); */
+/* glTexCoord2f(1.0, 0.0); */
+/* glVertex3f(BOARDSIZE - 1.5, elevator, -2.0 - 0.2); */
+/* glTexCoord2f(1.0, 1.5); */
+/* glVertex3f(BOARDSIZE - 1.5, elevator, -0.5 - 0.2); */
+/* glTexCoord2f(0.0, 1.5); */
+/* glVertex3f(BOARDSIZE - 2.5, elevator, -0.5 - 0.2); */
+/* mi->polygon_count++; */
+
+/* glEnd(); */
+
+/* for(i = 0; i < BOARDSIZE; ++i) */
+/* for(j = 0; j < BOARDSIZE; ++j) { */
+/* if(board[j][i]) { */
+
+/* /\* draw brushed boxtop *\/ */
+/* glNormal3f(0.0, 1.0, 0.0); */
+/* glTexCoord2f(0.0 + stf, 0.0 + stf); */
+/* glVertex3f(i-0.5 + stf, h+0.001, j+0.5 - stf); */
+/* glTexCoord2f(1.0 + stf, 0.0 + stf); */
+/* glVertex3f(i+0.5 - stf, h+0.001, j+0.5 - stf); */
+/* glTexCoord2f(1.0 + stf, 1.0 + stf); */
+/* glVertex3f(i+0.5 - stf, h+0.001, j-0.5 + stf); */
+/* glTexCoord2f(0.0 + stf, 1.0 + stf); */
+/* glVertex3f(i-0.5 + stf, h+0.001, j-0.5 + stf); */
+/* mi->polygon_count++; */
+/* } */
+/* } */
+
+/* glEnd(); */
+}
+
+static void build_board(antmazestruct *mp, int b)
+{
+ int i, j;
+
+ for(i = 0; i < BOARDSIZE; ++i)
+ for(j = 0; j < BOARDSIZE; ++j)
+ mp->board[b][i][j] = 1;
+
+/* for(i = 0; i < BOARDSIZE; ++i) { */
+/* board[0][i] = 1; */
+/* board[i][0] = 1; */
+/* board[BOARDSIZE-1][BOARDSIZE-i] = 1; */
+/* board[BOARDSIZE-i][BOARDSIZE-1] = 1; */
+/* } */
+
+/* board[0][BOARDSIZE-2] = 0; */
+/* board[BOARDSIZE-1][1] = 0; */
+
+
+ mp->board[b][BOARDSIZE-1][1] = 0;
+ mp->board[b][0][BOARDSIZE-2] = 0;
+
+ /* build the ant paths */
+ if(mp->currentboard == b) {
+ for(i = 0; i < ANTCOUNT; ++i) {
+ int sx = BOARDSIZE-2;
+ int sy = 1;
+
+ for(j = 0; ; ++j) {
+ mp->board[b][sx][sy] = 0;
+ mp->antpath[i][j][0] = sy - 5.0;
+ mp->antpath[i][j][1] = sx - 5.0;
+
+ if(random()%2) {
+ if(sx > 1)
+ sx -= 1;
+ else if(sy < BOARDSIZE-2)
+ sy += 1;
+ else
+ break;
+ }
+ else {
+ if(sy < BOARDSIZE-2)
+ sy += 1;
+ else if(sx > 1)
+ sx -= 1;
+ else
+ break;
+ }
+ }
+
+ ++j;
+ mp->antpath[i][j][0] = BOARDSIZE-7.0;
+ mp->antpath[i][j][1] = -7.0;
+ mp->antpathlength[i] = j;
+ }
+ }
+
+/* for(i = 0; i < 20; ++i) { */
+/* int x = 1 + random()%(BOARDSIZE-2); */
+/* int y = 1 + random()%(BOARDSIZE-2); */
+/* board[x][y] = 1; */
+/* } */
+}
+
+/* compute nearness */
+static int near(double a[2], double b[2])
+{
+ return fabs(a[0] - b[0]) < 0.5 && fabs(a[1] - b[1]) < 0.5;
+}
+
+static double sign(double d)
+{
+ return d < 0.0 ? -1.0 : 1.0;
+}
+
+static double min(double a, double b)
+{
+ return a < b ? a : b;
+}
+
+/* draw method for ant */
+static Bool draw_ant(ModeInfo *mi, antmazestruct *mp,
+ const float *Material, int mono, int shadow,
+ float ant_step, Bool (*sphere)(float), Bool (*cone)(float))
+{
+
+ float cos1 = cos(mp->ant_step);
+ float cos2 = cos(mp->ant_step + 2 * Pi / 3);
+ float cos3 = cos(mp->ant_step + 4 * Pi / 3);
+ float sin1 = sin(mp->ant_step);
+ float sin2 = sin(mp->ant_step + 2 * Pi / 3);
+ float sin3 = sin(mp->ant_step + 4 * Pi / 3);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : Material);
+
+/* glEnable(GL_CULL_FACE); */
+
+ glPushMatrix();
+ glScalef(1, 1.3, 1);
+ if(!((*sphere)(0.18)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glTranslatef(0.00, 0.30, 0.00);
+ if(!((*sphere)(0.2)))
+ return False;
+
+ glTranslatef(-0.05, 0.17, 0.05);
+ glRotatef(-90, 1, 0, 0);
+ glRotatef(-25, 0, 1, 0);
+ if(!((*cone)(0.05)))
+ return False;
+ glTranslatef(0.00, 0.10, 0.00);
+ if(!((*cone)(0.05)))
+ return False;
+ glRotatef(25, 0, 1, 0);
+ glRotatef(90, 1, 0, 0);
+
+ glScalef(1, 1.3, 1);
+ glTranslatef(0.15, -0.65, 0.05);
+ if(!((*sphere)(0.25)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glPopMatrix();
+
+/* glDisable(GL_CULL_FACE); */
+
+ glDisable(GL_LIGHTING);
+
+ /* ANTENNAS */
+ glBegin(GL_LINES);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(mono ? MaterialGray6 : MaterialRed);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+ }
+
+ /* LEFT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, 0.18);
+ glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, -0.18);
+ glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(mono ? MaterialGray8 : MaterialGray35);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count += 6;
+ glEnd();
+ }
+
+ glEnable(GL_LIGHTING);
+
+ return True;
+}
+
+static Bool draw_antmaze_strip(ModeInfo * mi)
+{
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+ int i;
+ int mono = MI_IS_MONO(mi);
+
+/* glMatrixMode(GL_MODELVIEW); */
+/* glLoadIdentity(); */
+/* glPushMatrix(); */
+
+ glEnable(GL_LIGHTING);
+/* glDisable(GL_BLEND); */
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ /* set light */
+/* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
+/* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+ /* draw board */
+ if(mp->elevator < 1.0) {
+ glEnable(GL_TEXTURE_2D);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
+ glTranslatef(-(BOARDSIZE-1)/2.0, 0.0, -(BOARDSIZE-1)/2.0);
+ draw_board(mi, mp);
+ glTranslatef(BOARDSIZE/2.0, 0.0, BOARDSIZE/2.0);
+ glDisable(GL_TEXTURE_2D);
+ }
+
+ mp->introduced--;
+
+ glTranslatef(0.0, -0.1, 0.0);
+
+ for(i = 0; i < ANTCOUNT; ++i) {
+
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+ if(!mp->anton[i]) { continue; }
+
+ /* determine location, move to goal */
+ glPushMatrix();
+ glTranslatef(0.0, 0.01, 0.0);
+ glTranslatef(mp->antposition[i][0], mp->antposition[i][2], mp->antposition[i][1]);
+/* glScalef(1.0, 0.01, 1.0); */
+ glScalef(0.6, 0.01, 0.6);
+ glRotatef(180.0 + mp->antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ glDisable(GL_LIGHTING);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4fv(MaterialGrayB);
+
+ glScalef(mp->antsize[i], mp->antsize[i], mp->antsize[i]);
+
+ /* slow down first ant */
+ if(i == 0 && mp->part[i] == mp->antpathlength[i])
+ draw_ant(mi, mp, MaterialGrayB, mono, 1, mp->first_ant_step, mySphere, myCone);
+ else
+ draw_ant(mi, mp, MaterialGrayB, mono, 1, mp->ant_step, mySphere, myCone);
+
+ glPopMatrix();
+
+ glDisable(GL_BLEND);
+ glEnable(GL_LIGHTING);
+
+ glPushMatrix();
+/* glTranslatef(0.0, 0.18, 0.0); */
+ glTranslatef(0.0, 0.12, 0.0);
+ glTranslatef(mp->antposition[i][0], mp->antposition[i][2], mp->antposition[i][1]);
+ glRotatef(180.0 + mp->antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ glScalef(0.6, 0.6, 0.6);
+
+ glScalef(mp->antsize[i], mp->antsize[i], mp->antsize[i]);
+
+/* glEnable(GL_TEXTURE_2D); */
+/* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
+
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); */
+
+ /* slow down first ant */
+ if(i == 0 && mp->part[i] == mp->antpathlength[i] && mp->elevator > 0.0) {
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ draw_ant(mi, mp, antmaterial[i], mono, 1, mp->first_ant_step, mySphere, myCone);
+ }
+ else {
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
+ draw_ant(mi, mp, antmaterial[i], mono, 1, mp->ant_step, mySphereTex, myCone);
+ glDisable(GL_TEXTURE_2D);
+ }
+
+
+/* draw_ant(mi, antmaterial[i], mono, 0, ant_step, mySphereTex, myCone); */
+/* glDisable(GL_TEXTURE_2D); */
+ glPopMatrix();
+ }
+
+/* glPopMatrix(); */
+
+/* /\* now draw overlay *\/ */
+/* glDisable(GL_LIGHTING); */
+/* glDisable(GL_BLEND); */
+
+/* /\* go to ortho mode *\/ */
+/* glMatrixMode(GL_PROJECTION); */
+/* glPushMatrix(); */
+/* glLoadIdentity(); */
+/* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
+
+/* /\* translate to corner *\/ */
+/* glTranslatef(4.0-1.2, 3.0-1.2, 0.0); */
+
+/* glDisable(GL_LIGHTING); */
+/* glEnable(GL_BLEND); */
+
+/* /\* draw the 2d board *\/ */
+/* glBegin(GL_QUADS); */
+/* { */
+/* int i, j; */
+/* double sz = 1.0; */
+/* for(i = 0; i < BOARDSIZE; ++i) */
+/* for(j = 0; j < BOARDSIZE; ++j) { */
+/* int par = board[i][j]; */
+/* glColor4f(par ? 0.4 : 0.6, */
+/* par ? 0.4 : 0.6, */
+/* par ? 0.4 : 0.6, */
+/* 0.5); */
+/* glNormal3f(0.0, 0.0, 1.0); */
+/* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
+/* glVertex3f((sz*i)/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
+/* glVertex3f((sz*i)/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
+/* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
+/* mi->polygon_count++; */
+/* } */
+/* } */
+/* glEnd(); */
+
+/* glPopMatrix(); */
+
+
+ /* but the step size is the same! */
+ mp->ant_step += 0.18;
+/* if(ant_step > 2*Pi) { */
+/* ant_step = 0.0; */
+/* } */
+
+ if(mp->ant_step > 5*Pi)
+ mp->started = 1;
+
+ mp->ant_position += 1;
+ return True;
+}
+#undef AntmazeDivisions
+#undef AntmazeTransversals
+
+ENTRYPOINT void reshape_antmaze(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int size = (width / 512) + 1;
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+
+ glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective(45, 1/h, 1, 25.0);
+
+ glMatrixMode(GL_MODELVIEW);
+/* glLineWidth(3.0); */
+ glLineWidth(size);
+ glPointSize(size);
+}
+
+static void update_ants(antmazestruct *mp)
+{
+ int i;
+ GLfloat df[4];
+ df[0] = df[1] = df[2] = 0.8*mp->fadeout;
+ df[3] = 1.0;
+
+ /* fade out */
+ if(mp->fadeoutspeed < -0.00001) {
+
+ if(mp->fadeout <= 0.0) {
+ /* switch boards: rebuild old board, increment current */
+ mp->currentboard = (mp->currentboard+1)%BOARDCOUNT;
+ build_board(mp, mp->currentboard);
+ mp->fadeoutspeed = 0.02;
+ }
+
+ mp->fadeout += mp->fadeoutspeed;
+
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
+ }
+
+ /* fade in */
+ if(mp->fadeoutspeed > 0.0001) {
+ mp->fadeout += mp->fadeoutspeed;
+ if(mp->fadeout >= 1.0) {
+ mp->fadeout = 1.0;
+ mp->fadeoutspeed = 0.0;
+ mp->entroducing = 12;
+ }
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
+ }
+
+ for(i = 0; i < ANTCOUNT; ++i) {
+
+ if(!mp->anton[i] && mp->elevator < 1.0) {
+
+ /* turn on ant */
+ if(mp->entroducing > 0 && mp->introduced <= 0 && random()%100 == 0) {
+ mp->anton[i] = 1;
+ mp->part[i] = 0;
+ mp->antsize[i] = 0.0;
+ mp->antposition[i][0] = -4.0;
+ mp->antposition[i][1] = 5.0;
+ mp->antdirection[i] = PI/2.0;
+ mp->bposition[i][0] = 0;
+ mp->bposition[i][1] = 8;
+ mp->introduced = 300;
+ mp->entroducing--;
+ }
+
+ continue;
+ }
+
+ if(mp->part[i] == 0 && mp->antsize[i] < 1.0) {
+ mp->antsize[i] += 0.02;
+ continue;
+ }
+
+ if(mp->part[i] > mp->antpathlength[i] && mp->antsize[i] > 0.0) {
+ mp->antsize[i] -= 0.02;
+ if(mp->antvelocity[i] > 0.0) {
+ mp->antvelocity[i] -= 0.02;
+ }
+ else { mp->antvelocity[i] = 0.0; }
+
+ continue;
+ }
+
+ if(mp->part[i] > mp->antpathlength[i] && mp->antsize[i] <= 0.0) {
+ mp->antvelocity[i] = 0.02;
+
+ /* if(i != 0) { */
+ antmaterial[i] = materials[random()%MATERIALS];
+ /* } */
+
+ mp->antdirection[i] = PI/2.0;
+ mp->bposition[i][0] = 0;
+ mp->bposition[i][1] = 8;
+ mp->part[i] = 0;
+
+ mp->antsize[i] = 0.0;
+
+ mp->anton[i] = 0;
+
+ mp->antposition[i][0] = -4.0;
+ mp->antposition[i][1] = 5.0;
+
+ /* /\* reset camera *\/ */
+ /* if(i == focus) { */
+ /* started = 0; */
+ /* ant_step = 0.0; */
+ /* } */
+
+ /* check for the end */
+ if(mp->entroducing <= 0) {
+ int ao = 0, z = 0;
+ for(z = 0; z < ANTCOUNT; ++z) {
+ if(mp->anton[z]) { ao = 1; break; }
+ }
+
+ if(ao == 0) {
+ mp->fadeoutspeed = -0.02;
+ }
+ }
+
+ }
+
+ /* near goal, bend path towards next step */
+ if(near(mp->antposition[i], mp->antpath[i][mp->part[i]])) {
+
+ ++mp->part[i];
+
+/* /\* special first ant *\/ */
+/* if(i == 0 && part[i] > antpathlength[i]) { */
+/* if(fir) */
+/* first_ant_step = ant_step; */
+
+/* antvelocity[i] = 0.0; */
+/* /\* antposition[i][2] += 0.025; *\/ */
+/* elevator += 0.025; */
+
+/* /\* set light *\/ */
+/* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
+/* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+/* /\* draw next board *\/ */
+/* if(elevator > 1.0) { */
+
+/* if(makenew == 1) { */
+/* int re; */
+
+/* /\* switch boards: rebuild old board, increment current *\/ */
+/* currentboard = (currentboard+1)%BOARDCOUNT; */
+/* build_board(currentboard); */
+
+/* for(re = 1; re < ANTCOUNT; ++re) { */
+/* anton[re] = 0; */
+/* antmaterial[re] = materials[random()%MATERIALS]; */
+/* } */
+
+/* makenew = 0; */
+
+/* } */
+
+/* /\* draw the other board *\/ */
+/* glEnable(GL_TEXTURE_2D); */
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6); */
+
+/* glPushMatrix(); */
+/* glTranslatef(-(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0), 0.0, */
+/* -(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0)); */
+/* draw_board(mi, mp); */
+/* glPopMatrix(); */
+/* glDisable(GL_TEXTURE_2D); */
+/* } */
+/* /\* reset *\/ */
+/* if(elevator > 2.0) { */
+/* antposition[i][0] = -4.0;/\*-= -(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0);*\//\*= -4.0;*\/ */
+/* antposition[i][1] = 5.5;/\*-(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0);*\/ */
+/* /\* antposition[i][2] = 0.15; *\/ */
+/* antdirection[i] = PI/2.0; */
+/* bposition[i][0] = 0; */
+/* bposition[i][1] = 8; */
+/* part[i] = 0; */
+/* antvelocity[i] = 0.02; */
+/* fir = 0; */
+/* antmaterial[i] = MaterialRed; */
+
+/* makenew = 1; */
+
+/* elevator = 0.0; */
+/* introduced = 200; */
+/* } */
+/* else { */
+/* part[i]--; */
+/* } */
+/* } */
+
+ }
+
+ /* move toward goal, correct ant direction if required */
+ else {
+
+ /* difference */
+ double dx = mp->antpath[i][mp->part[i]][0] - mp->antposition[i][0];
+ double dz = - mp->antpath[i][mp->part[i]][1] + mp->antposition[i][1];
+ double theta, ideal;
+
+ if(dz > EPSILON)
+ theta = atan(dz/dx);
+ else
+ theta = dx > EPSILON ? 0.0 : PI;
+
+ ideal = theta - mp->antdirection[i];
+ if(ideal < -Pi/2.0)
+ ideal += Pi;
+
+ /* compute correction */
+ {
+ double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
+ mp->antdirection[i] += dt;
+ if(mp->antdirection[i] > 2.0*PI)
+ mp->antdirection[i] = 0.0;
+ }
+ }
+
+ mp->antposition[i][0] += mp->antvelocity[i] * cos(mp->antdirection[i]);
+ mp->antposition[i][1] += mp->antvelocity[i] * sin(-mp->antdirection[i]);
+ }
+}
+
+static void pinit(antmazestruct *mp)
+{
+ glClearDepth(1.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05);
+ glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.001);
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1);
+
+ glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05);
+ glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.001);
+ glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.1);
+
+
+/* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); */
+/* glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); */
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+ glCullFace(GL_BACK);
+
+ /* antmaze */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+
+ /* setup textures */
+ makeCheckImage(mp);
+ makeBrushedImage(mp);
+
+ build_board(mp, 0);
+ build_board(mp, 1);
+
+/* makeCheckImage(); */
+/* glPixelStorei(GL_UNPACK_ALIGNMENT, 1); */
+/* glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, */
+/* checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, checkers); */
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); */
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); */
+
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */
+/* glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); */
+ glEnable(GL_TEXTURE_2D);
+
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); */
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); */
+}
+
+#define MAX_MAGNIFICATION 10
+#define max(a, b) a < b ? b : a
+#define min(a, b) a < b ? a : b
+
+ENTRYPOINT Bool antmaze_handle_event (ModeInfo *mi, XEvent *event)
+{
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ if (event->xany.type == ButtonPress)
+ {
+ switch(event->xbutton.button) {
+
+ case Button3:
+ mp->focus = (mp->focus + 1) % ANTCOUNT;
+ return True;
+
+ case Button4:
+ mp->mag = max(mp->mag-1, 1);
+ return True;
+
+ case Button5:
+ mp->mag = min(mp->mag+1, MAX_MAGNIFICATION);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+ENTRYPOINT void init_antmaze(ModeInfo * mi)
+{
+ double rot_speed = 0.3;
+ int i;
+
+ antmazestruct *mp;
+
+ MI_INIT(mi, antmaze);
+ mp = &antmaze[MI_SCREEN(mi)];
+ mp->step = NRAND(90);
+ mp->ant_position = NRAND(90);
+
+
+ mp->antdirection[0] = PI/2.0;
+ mp->antdirection[1] = PI/2.0;
+ mp->antdirection[2] = 0;
+ mp->antdirection[3] = PI/2.0;
+ mp->antdirection[4] = PI/2.0;
+
+ mp->antposition[0][0] = -4.0;
+ mp->antposition[0][1] = 5.0;
+ mp->antposition[0][1] = 0.15;
+
+ mp->antposition[1][0] = -4.0;
+ mp->antposition[1][1] = 3.0;
+ mp->antposition[1][1] = 0.15;
+
+ mp->antposition[2][0] = -1.0;
+ mp->antposition[2][1] = -2.0;
+ mp->antposition[2][1] = 0.15;
+
+ mp->antposition[3][0] = -3.9;
+ mp->antposition[3][1] = 6.0;
+ mp->antposition[3][1] = 0.15;
+
+ mp->antposition[4][0] = 2.0;
+ mp->antposition[4][1] = -2.0;
+ mp->antposition[4][1] = 0.15;
+
+
+
+ for (i = 0; i < ANTCOUNT; i++) {
+ mp->antvelocity[i] = 0.02;
+ mp->antsize[i] = 1.0;
+ mp->anton[i] = 0;
+ }
+
+ mp->bposition[0][0] = 0;
+ mp->bposition[0][1] = 8;
+
+ mp->bposition[1][0] = 9;
+ mp->bposition[1][1] = 1;
+
+ mp->bposition[2][0] = 1;
+ mp->bposition[2][1] = 1;
+
+ mp->bposition[3][0] = 4;
+ mp->bposition[3][1] = 8;
+
+ mp->bposition[4][0] = 2;
+ mp->bposition[4][1] = 1;
+
+ mp->part[0] = 0;
+ mp->part[1] = 1;
+ mp->part[2] = 5;
+ mp->part[3] = 1;
+ mp->part[4] = 3;
+
+ mp->introduced = 0;
+ mp->entroducing = 12;
+ mp->fadeout = 1.0;
+ mp->mag = 4.0;
+
+ mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+ mp->trackball = gltrackball_init (False);
+
+ if ((mp->glx_context = init_GL(mi)) != NULL) {
+ reshape_antmaze(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit(mp);
+ }
+ else
+ MI_CLEARWINDOW(mi);
+}
+
+static void
+device_rotate(ModeInfo *mi)
+{
+#if 0
+ GLfloat rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ glScalef (1/s, s, 1);
+ }
+#endif
+}
+
+
+ENTRYPOINT void draw_antmaze(ModeInfo * mi)
+{
+ double h = (GLfloat) MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+
+ antmazestruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!antmaze)
+ return;
+ mp = &antmaze[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if(!mp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* first panel */
+ glPushMatrix();
+/* h = ((GLfloat) MI_HEIGHT(mi)/2) / (3*(GLfloat)MI_WIDTH(mi)/4); */
+ glViewport(MI_WIDTH(mi)/32, MI_HEIGHT(mi)/8, (9*MI_WIDTH(mi))/16, 3*MI_HEIGHT(mi)/4);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+/* h = (3*MI_HEIGHT(mi)/4) / (3*MI_WIDTH(mi)/4); */
+ gluPerspective(45, 1/h, 1, 25.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ device_rotate(mi);
+
+ glPushMatrix();
+
+ /* follow focused ant */
+ glTranslatef(0.0, 0.0, -mp->mag - 5.0);
+ glRotatef(20.0+5.0*sin(mp->ant_step/40.0), 1.0, 0.0, 0.0);
+/* glTranslatef(0.0, */
+/* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0)), */
+/* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0))); */
+
+ gltrackball_rotate(mp->trackball);
+
+ glRotatef(mp->ant_step*0.6, 0.0, 1.0, 0.0);
+
+/* glRotatef(90.0, 0.0, 0.0, 1.0); */
+
+/* glTranslatef(-antposition[0][0]-0.5, 0.0, -antposition[focus][1]); */
+ /*-elevator*/
+
+ /* sync */
+ if(!draw_antmaze_strip(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+ glPopMatrix();
+
+ h = (GLfloat) (3*MI_HEIGHT(mi)/8) / (GLfloat) (MI_WIDTH(mi)/2);
+
+ /* draw overhead */
+ glPushMatrix();
+ glViewport((17*MI_WIDTH(mi))/32, MI_HEIGHT(mi)/2, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ device_rotate(mi);
+ gluPerspective(45, 1/h, 1, 25.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ /* twist scene */
+ glTranslatef(0.0, 0.0, -16.0);
+ glRotatef(60.0, 1.0, 0.0, 0.0);
+ glRotatef(-15.0 + mp->ant_step/10.0, 0.0, 1.0, 0.0);
+ gltrackball_rotate(mp->trackball);
+
+ /* sync */
+ if(!draw_antmaze_strip(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+
+ /* draw ant display */
+ glPushMatrix();
+ glViewport((5*MI_WIDTH(mi))/8, MI_HEIGHT(mi)/8, (11*MI_WIDTH(mi))/32, 3*MI_HEIGHT(mi)/8);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ device_rotate(mi);
+ gluPerspective(45, 1/h, 1, 25.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ /* twist scene */
+ glTranslatef(0.0, 0.0, -1.6);
+ glRotatef(30.0, 1.0, 0.0, 0.0);
+ glRotatef(mp->ant_step, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+
+/* /\* draw ant shadow *\/ */
+/* glPushMatrix(); */
+/* glScalef(1.0, 0.01, 1.0); */
+/* glRotatef(90.0, 0.0, 0.0, 1.0); */
+/* glRotatef(90.0, 0.0, 1.0, 0.0); */
+/* glDisable(GL_LIGHTING); */
+/* glColor4fv(MaterialGray6); */
+
+/* /\* slow down first ant *\/ */
+/* draw_ant(MaterialGrayB, 0, 1, first_ant_step, mySphere, myCone); */
+/* glPopMatrix(); */
+
+ /* draw ant body */
+ glEnable(GL_TEXTURE_2D);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
+ draw_ant(mi, mp, MaterialGray35, 0, 1, mp->ant_step/2.0, mySphereTex, myCone2);
+ glDisable(GL_TEXTURE_2D);
+
+ glPopMatrix();
+
+/* /\* draw overlay *\/ */
+/* glPushMatrix(); */
+
+/* /\* go to ortho mode *\/ */
+/* glViewport(MI_WIDTH(mi)/2, MI_HEIGHT(mi)/8, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8); */
+
+/* glMatrixMode(GL_PROJECTION); */
+/* glLoadIdentity(); */
+
+/* glPushMatrix (); */
+/* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
+
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB); */
+/* glColor4fv(MaterialGrayB); */
+
+/* glDisable(GL_LIGHTING); */
+/* glEnable(GL_BLEND); */
+
+/* glBegin(GL_QUADS); */
+/* glNormal3f(0.0, 0.0, 1.0); */
+/* glVertex3f(4.0, 3.0, 0.0); */
+/* glVertex3f(2.0, 3.0, 0.0); */
+/* glVertex3f(2.0, -3.0, 0.0); */
+/* glVertex3f(4.0, -3.0, 0.0); */
+/* mi->polygon_count++; */
+/* glEnd(); */
+
+/* glEnable(GL_LIGHTING); */
+/* glDisable(GL_BLEND); */
+
+/* glPopMatrix(); */
+/* glPopMatrix(); */
+
+ if (MI_IS_FPS(mi)) {
+ glViewport(0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
+ do_fps (mi);
+ }
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ update_ants(mp);
+
+ mp->step += 0.025;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_antmaze(ModeInfo * mi)
+{
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("AntMaze", antmaze)
+
+#endif
diff --git a/hacks/glx/antmaze.man b/hacks/glx/antmaze.man
new file mode 100644
index 0000000..4c4bec8
--- /dev/null
+++ b/hacks/glx/antmaze.man
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "May 2005"
+.SH NAME
+antmaze \- ant maze walker
+.SH SYNOPSIS
+.B antmaze
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIantmaze\fP code displays ants finding their way through a maze.
+.SH OPTIONS
+.I antmaze
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessy@cs.ubc.ca>, 8-May-2005.
+
diff --git a/hacks/glx/ants.h b/hacks/glx/ants.h
new file mode 100644
index 0000000..d0bef7e
--- /dev/null
+++ b/hacks/glx/ants.h
@@ -0,0 +1,45 @@
+/* ants.h -- header file containing common ant parameters
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2003 Blair Tennessy
+*/
+
+/* static const GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0}; */
+/*static const GLfloat MaterialPurple[] = {0.6, 0.2, 0.5, 1.0};*/
+/*static const GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};*/
+/*static const GLfloat MaterialGreen[] = {0.1, 0.5, 0.2, 0.2};*/
+/*static const GLfloat MaterialBlue[] = {0.4, 0.4, 0.8, 1.0};*/
+/*static const GLfloat MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};*/
+/*static const GLfloat MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};*/
+/* static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0}; */
+/*static const GLfloat MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};*/
+static const GLfloat MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+static const GLfloat MaterialGrayB[] = {0.1, 0.1, 0.1, 0.5};
+/*static const GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};*/
+
+static const GLfloat MaterialGray5[] = {0.5, 0.5, 0.5, 1.0};
+static const GLfloat MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
+/* static const GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};*/
+
+typedef struct {
+
+ double position[3];
+ double goal[3];
+ double velocity;
+ double direction;
+ double step;
+
+ const GLfloat *material;
+
+} Ant;
diff --git a/hacks/glx/antspotlight.c b/hacks/glx/antspotlight.c
new file mode 100644
index 0000000..55bb80c
--- /dev/null
+++ b/hacks/glx/antspotlight.c
@@ -0,0 +1,799 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2003 Blair Tennessy
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*useSHM: True \n"
+
+# define free_antspotlight 0
+# define release_antspotlight 0
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+ENTRYPOINT ModeSpecOpt antspotlight_opts = {
+ 0, NULL, 0, NULL, NULL
+};
+
+#ifdef USE_MODULES
+ModStruct antspotlight_description = {
+ "antspotlight", "init_antspotlight", "draw_antspotlight",
+ (char *) NULL, "draw_antspotlight", "change_antspotlight",
+ (char *) NULL, &antspotlight_opts, 1000, 1, 1, 1, 4, 1.0, "",
+ "draws an ant scoping the screen", 0, NULL
+};
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#include "ants.h"
+#include "grab-ximage.h"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat max_tx, max_ty;
+ int mono, wire, ticks;
+ GLuint screentexture;
+
+ Ant *ant;
+ double boardsize;
+ GLfloat spot_direction[3];
+ int mag;
+
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+
+} antspotlightstruct;
+
+static antspotlightstruct *antspotlight = (antspotlightstruct *) NULL;
+
+#define NUM_SCENES 2
+
+/* draw method for ant */
+static Bool draw_ant(ModeInfo *mi, antspotlightstruct *mp,
+ const GLfloat *Material, int mono, int shadow,
+ float ant_step, Bool (*sphere)(float), Bool (*cone)(float))
+{
+
+ float cos1 = cos(ant_step);
+ float cos2 = cos(ant_step + 2 * Pi / 3);
+ float cos3 = cos(ant_step + 4 * Pi / 3);
+ float sin1 = sin(ant_step);
+ float sin2 = sin(ant_step + 2 * Pi / 3);
+ float sin3 = sin(ant_step + 4 * Pi / 3);
+
+/* Apparently this is a performance killer on many systems...
+ glEnable(GL_POLYGON_SMOOTH);
+ */
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->mono ? MaterialGray5 : Material);
+ glEnable(GL_CULL_FACE);
+ glPushMatrix();
+ glScalef(1, 1.3, 1);
+ if(!((*sphere)(0.18)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glTranslatef(0.00, 0.30, 0.00);
+ if(!((*sphere)(0.2)))
+ return False;
+
+ glTranslatef(-0.05, 0.17, 0.05);
+ glRotatef(-90, 1, 0, 0);
+ glRotatef(-25, 0, 1, 0);
+ if(!((*cone)(0.05)))
+ return False;
+ glTranslatef(0.00, 0.10, 0.00);
+ if(!((*cone)(0.05)))
+ return False;
+ glRotatef(25, 0, 1, 0);
+ glRotatef(90, 1, 0, 0);
+
+ glScalef(1, 1.3, 1);
+ glTranslatef(0.15, -0.65, 0.05);
+ if(!((*sphere)(0.25)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glPopMatrix();
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_LIGHTING);
+
+ /* ANTENNAS */
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBegin(GL_LINES);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(mp->mono ? MaterialGray6 : MaterialGray5);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+ }
+
+ /* LEFT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, 0.18);
+ glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, -0.18);
+ glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(MaterialGray5);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count += 6;
+ glEnd();
+ }
+
+ glEnable(GL_LIGHTING);
+
+ return True;
+}
+
+/* filled sphere */
+static Bool mySphere(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, False);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+/* silhouette sphere */
+static Bool mySphere2(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_LINE);
+ gluSphere(quadObj, radius, 16, 8);
+ gluDeleteQuadric(quadObj);
+#else
+ /* #### no GLU_LINE */
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, True);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+/* no cone */
+static Bool myCone2(float radius) { return True; }
+
+static void draw_board(ModeInfo *mi, antspotlightstruct *mp)
+{
+ int i, j;
+ double cutoff = Pi/3.0;
+ double center[3];
+ double centertex[2];
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, mp->screentexture);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
+
+ /* draw mesh */
+
+ /* center is roughly spotlight position */
+ center[0] = mp->ant->position[0];/* + cos(ant->direction); */
+ center[1] = 0.0;
+ center[2] = mp->ant->position[2];/* - 0.7*sin(ant->direction);*/
+
+ centertex[0] = (mp->boardsize/2.0+center[0]) * mp->max_tx / mp->boardsize;
+ centertex[1] = mp->max_ty - ((mp->boardsize/2.0+center[2]) * mp->max_ty / mp->boardsize);
+
+/* glPolygonMode(GL_FRONT, GL_LINE); */
+/* glDisable(GL_TEXTURE_2D); */
+
+ /*
+ the vertices determined here should correspond to the illuminated
+ board. ideally the code adapts vertex distribution to the
+ intensity and shape of the light.
+
+ i should be finding the intersection of the cone of light and
+ the board-plane.
+ */
+ for(i = -12; i < 12; ++i) {
+
+ double theta1, theta2;
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3f(0.0, 1.0, 0.0);
+
+ glTexCoord2f(centertex[0], centertex[1]);
+ glVertex3f(center[0], 0.01, center[2]);
+
+ /* watch those constants */
+ theta1 = mp->ant->direction + i*(cutoff/8);
+ theta2 = mp->ant->direction + (i+1)*(cutoff/8);
+
+ for(j = 1; j <= 64; ++j) {
+ double point[3], tex[2];
+ /* double fj = pow(1.05, j) - 1.0;*/
+ double fj = j / 6.0;
+ point[0] = center[0] + fj*cos(theta1);
+ point[1] = 0.0;
+ point[2] = center[2] - fj*sin(theta1);
+
+ tex[0] = (mp->boardsize/2.0+point[0]) * mp->max_tx / mp->boardsize;
+ tex[1] = (mp->boardsize/2.0+point[2]) * mp->max_ty / mp->boardsize;
+
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f(point[0], point[1], point[2]);
+
+ point[0] = center[0] + fj*cos(theta2);
+ point[1] = 0.0;
+ point[2] = center[2] - fj*sin(theta2);
+
+ tex[0] = (mp->boardsize/2.0+point[0]) * mp->max_tx / mp->boardsize;
+ tex[1] = (mp->boardsize/2.0+point[2]) * mp->max_ty / mp->boardsize;
+
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f(point[0], point[1], point[2]);
+ mi->polygon_count++;
+ }
+
+ glEnd();
+ }
+
+ glDisable(GL_TEXTURE_2D);
+}
+
+/* return euclidean distance between two points */
+static double distance(double x[3], double y[3])
+{
+ double dx = x[0] - y[0];
+ double dz = x[2] - y[2];
+ return sqrt(dx*dx + dz*dz);
+}
+
+/* determine a new goal */
+static void find_goal(antspotlightstruct *mp)
+{
+ do {
+ mp->ant->goal[0] = random()%((int)(mp->boardsize+0.5)-2) - mp->boardsize/2.0 + 1.0;
+ mp->ant->goal[1] = 0.0;
+ mp->ant->goal[2] = random()%((int)(mp->boardsize+0.5)-2) - mp->boardsize/2.0 + 1.0;
+ }
+ while(distance(mp->ant->position, mp->ant->goal) < 2.0);
+}
+
+/* construct our ant */
+static void build_ant(antspotlightstruct *mp)
+{
+ mp->ant = (Ant *) malloc(sizeof (Ant));
+ mp->ant->position[0] = 0.0;
+ mp->ant->position[1] = 0.0;
+ mp->ant->position[2] = 0.0;
+ mp->ant->direction = 0.0;
+ mp->ant->velocity = 0.02;
+ mp->ant->material = MaterialGray5;
+ mp->ant->step = 0;
+ find_goal(mp);
+}
+
+#define EPSILON 0.01
+
+static double sign(double d)
+{
+ return d < 0.0 ? -1.0 : 1.0;
+}
+
+static double min(double a, double b)
+{
+ return a < b ? a : b;
+}
+
+/*
+static double max(double a, double b)
+{
+ return a > b ? a : b;
+}
+*/
+
+/* find a new goal and reset steps */
+static void reset_ant(antspotlightstruct *mp)
+{
+ find_goal(mp);
+}
+
+/* draw ant composed of skeleton and glass */
+static void show_ant(ModeInfo *mi, antspotlightstruct *mp)
+{
+
+ glPushMatrix();
+
+ /* move into position */
+ glTranslatef(mp->ant->position[0], 0.33, mp->ant->position[2]);
+ glRotatef(180.0 + mp->ant->direction*180.0/Pi, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+
+ /* draw skeleton */
+ draw_ant(mi, mp, mp->ant->material, mp->mono, 0, mp->ant->step, mySphere2, myCone2);
+
+ /* draw glass */
+ if(!mp->wire && !mp->mono) {
+ glEnable(GL_BLEND);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB);
+ glColor4fv(MaterialGrayB);
+ draw_ant(mi, mp, MaterialGrayB, mp->mono, 0, mp->ant->step, mySphere, myCone2);
+ glDisable(GL_BLEND);
+ }
+
+ glPopMatrix();
+}
+
+static void draw_antspotlight_strip(ModeInfo *mi)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+ /* compute spotlight position and direction */
+ GLfloat light1_position[4];
+
+ light1_position[0] = mp->ant->position[0] + 0.7*cos(mp->ant->direction);
+ light1_position[1] = 0.5;
+ light1_position[2] = mp->ant->position[2] - 0.7*sin(mp->ant->direction);
+ light1_position[3] = 1.0;
+
+ mp->spot_direction[0] = cos(mp->ant->direction);
+ mp->spot_direction[1] = -0.5;
+ mp->spot_direction[2] = -sin(mp->ant->direction);
+
+ glLightfv(GL_LIGHT2, GL_POSITION, light1_position);
+ glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, mp->spot_direction);
+
+ glEnable(GL_LIGHT2);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_LIGHT1);
+
+ /* draw board */
+ if(mp->wire)
+ ;
+ else
+ draw_board(mi, mp);
+
+ glDisable(GL_LIGHT2);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ /* now modify ant */
+ show_ant(mi, mp);
+
+ /* near goal, bend path towards next step */
+ if(distance(mp->ant->position, mp->ant->goal) < 0.2) {
+ reset_ant(mp);
+ }
+
+ if(random()%100 == 0) {
+ reset_ant(mp);
+ }
+
+
+ /* move toward goal, correct ant direction if required */
+ else {
+
+ /* difference */
+ double dx = mp->ant->goal[0] - mp->ant->position[0];
+ double dz = -(mp->ant->goal[2] - mp->ant->position[2]);
+ double theta, ideal, dt;
+
+ if(fabs(dx) > EPSILON) {
+ theta = atan(dz/dx);
+ if(dx < 0.0)
+ theta += Pi;
+ }
+ else
+ theta = dz > 0.0 ? (1.0/2.0)*Pi : (3.0/2.0)*Pi;
+
+ if(theta < 0.0)
+ theta += 2*Pi;
+
+ ideal = theta - mp->ant->direction;
+ if(ideal > Pi)
+ ideal -= 2*Pi;
+
+ /* compute correction */
+ dt = sign(ideal) * min(fabs(ideal), Pi/100.0);
+ mp->ant->direction += dt;
+ while(mp->ant->direction < 0.0)
+ mp->ant->direction += 2*Pi;
+ while(mp->ant->direction > 2*Pi)
+ mp->ant->direction -= 2*Pi;
+ }
+
+ mp->ant->position[0] += mp->ant->velocity * cos(mp->ant->direction);
+ mp->ant->position[2] += mp->ant->velocity * sin(-mp->ant->direction);
+ mp->ant->step += 10*mp->ant->velocity;
+ while(mp->ant->step > 2*Pi)
+ mp->ant->step -= 2*Pi;
+}
+
+ENTRYPOINT void reshape_antspotlight(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+ int size = 2;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective(45, 1/h, 1.0, 25.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLineWidth(size);
+ glPointSize(size);
+}
+
+/* lighting variables */
+static const GLfloat front_shininess[] = {60.0};
+static const GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat ambient[] = {0.4, 0.4, 0.4, 1.0};
+/*static const GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};*/
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat position0[] = {1.0, 5.0, 1.0, 0.0};
+static const GLfloat position1[] = {-1.0, -5.0, 1.0, 0.0};
+/*static const GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};*/
+static const GLfloat lmodel_twoside[] = {GL_TRUE};
+static const GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+
+static void pinit(void)
+{
+ glClearDepth(1.0);
+
+ /* setup twoside lighting */
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, spotlight_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ /* setup spotlight */
+ glLightfv(GL_LIGHT2, GL_AMBIENT, spotlight_ambient);
+ glLightfv(GL_LIGHT2, GL_DIFFUSE, spotlight_diffuse);
+ glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, 0.1);
+ glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, 0.05);
+ glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, 0.0);
+ glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 60.0);
+ glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 3.0);
+
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+ glCullFace(GL_BACK);
+
+ /* setup material properties */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glShadeModel(GL_SMOOTH);
+/* glShadeModel(GL_FLAT); */
+ glEnable(GL_DEPTH_TEST);
+}
+
+#define MAX_MAGNIFICATION 10
+#define max(a, b) a < b ? b : a
+#define min(a, b) a < b ? a : b
+
+/* event handling */
+ENTRYPOINT Bool antspotlight_handle_event(ModeInfo *mi, XEvent *event)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ if (event->xany.type == ButtonPress)
+ {
+ switch(event->xbutton.button) {
+
+ case Button1:
+ mp->button_down_p = True;
+ gltrackball_start(mp->trackball,
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH (mi), MI_HEIGHT (mi));
+ return True;
+
+ case Button4:
+ mp->mag = max(mp->mag-1, 1);
+ return True;
+
+ case Button5:
+ mp->mag = min(mp->mag+1, MAX_MAGNIFICATION);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ antspotlightstruct *mp = (antspotlightstruct *) closure;
+
+ mp->max_tx = (GLfloat) image_width / texture_width;
+ mp->max_ty = (GLfloat) image_height / texture_height;
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (mp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ mp->waiting_for_image_p = False;
+}
+
+
+/* get screenshot */
+static void get_snapshot(ModeInfo *modeinfo)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(modeinfo)];
+
+ if (MI_IS_WIREFRAME(modeinfo))
+ return;
+
+ mp->waiting_for_image_p = True;
+ mp->mipmap_p = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ *mp->glx_context, 0, 0, mp->mipmap_p,
+ mp->screentexture, image_loaded_cb, mp);
+}
+
+
+ENTRYPOINT void init_antspotlight(ModeInfo *mi)
+{
+ double rot_speed = 0.3;
+
+ antspotlightstruct *mp;
+
+ MI_INIT(mi, antspotlight);
+ mp = &antspotlight[MI_SCREEN(mi)];
+ mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+ mp->trackball = gltrackball_init (False);
+
+ if((mp->glx_context = init_GL(mi)) != NULL) {
+ reshape_antspotlight(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit();
+ }
+ else
+ MI_CLEARWINDOW(mi);
+
+ glGenTextures(1, &mp->screentexture);
+ glBindTexture(GL_TEXTURE_2D, mp->screentexture);
+ get_snapshot(mi);
+
+ build_ant(mp);
+ mp->mono = MI_IS_MONO(mi);
+ mp->wire = MI_IS_WIREFRAME(mi);
+ mp->boardsize = 8.0;
+ mp->mag = 1;
+}
+
+ENTRYPOINT void draw_antspotlight(ModeInfo * mi)
+{
+ antspotlightstruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!antspotlight)
+ return;
+ mp = &antspotlight[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if(!mp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+
+ /* Just keep running before the texture has come in. */
+ /* if (mp->waiting_for_image_p) return; */
+
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /* position camera */
+
+ /* follow focused ant */
+ glTranslatef(0.0, 0.0, -6.0 - mp->mag);
+ glRotatef(35.0, 1.0, 0.0, 0.0);
+ gltrackball_rotate(mp->trackball);
+ glTranslatef(-mp->ant->position[0], mp->ant->position[1], -mp->ant->position[2]);
+
+ /* stable position */
+/* glTranslatef(0.0, 0.0, -10.0 - mag); */
+/* gltrackball_rotate(mp->trackball); */
+/* glRotatef(40.0, 1.0, 0.0, 0.0); */
+/* glRotatef(20.0, 0.0, 1.0, 0.0); */
+
+ draw_antspotlight_strip(mi);
+
+ ++mp->ticks;
+
+ glPopMatrix();
+
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_antspotlight(ModeInfo * mi)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("AntSpotlight", antspotlight)
diff --git a/hacks/glx/antspotlight.man b/hacks/glx/antspotlight.man
new file mode 100644
index 0000000..c5f8ed7
--- /dev/null
+++ b/hacks/glx/antspotlight.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "July 2003"
+.SH NAME
+antspotlight \- ant spotlight screenhack
+.SH SYNOPSIS
+.B antspotlight
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIantspotlight\fP code displays a single ant spotting out a screenshot.
+.SH OPTIONS
+.I antspotlight
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Per-frame delay.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessb@unbc.ca>, 20-July-2003.
+
diff --git a/hacks/glx/atlantis.c b/hacks/glx/atlantis.c
new file mode 100644
index 0000000..04bde12
--- /dev/null
+++ b/hacks/glx/atlantis.c
@@ -0,0 +1,577 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if 0
+static const char sccsid[] = "@(#)atlantis.c 5.08 2003/04/09 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@users.sourceforge.net
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ * REVISION HISTORY:
+ *
+ * Jamie Zawinski, 2-Apr-01: - The fishies were inside out! The back faces
+ * were being drawn, not the front faces.
+ * - Added a texture to simulate light from the
+ * surface, like in the SGI version.
+ *
+ * David A. Bagley - 98/06/17 : Add whalespeed option. Global options to
+ * initialize local variables are now:
+ * XLock.atlantis.cycles: 100 ! SharkSpeed
+ * XLock.atlantis.batchcount: 4 ! SharkNum
+ * XLock.atlantis.whalespeed: 250 ! WhaleSpeed
+ * XLock.atlantis.size: 6000 ! SharkSize
+ * Add random direction for whales/dolphins
+ *
+ * E.Lassauge - 98/06/16: Use the following global options to initialize
+ * local variables :
+ * XLock.atlantis.delay: 100 ! SharkSpeed
+ * XLock.atlantis.batchcount: 4 ! SharkNum
+ * XLock.atlantis.cycles: 250 ! WhaleSpeed
+ * XLock.atlantis.size: 6000 ! SharkSize
+ * Add support for -/+ wireframe (t'was so easy to do!)
+ *
+ * TODO :
+ * - better handling of sizes and speeds
+ * - test standalone and module modes
+ * - purify it (!)
+ */
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#define DEF_TEXTURE "True"
+#define DEF_GRADIENT "True"
+#define DEF_WHALESPEED "250"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 25000 \n" \
+ "*count: 4 \n" \
+ "*showFPS: False \n" \
+ "*cycles: 100 \n" \
+ "*size: 6000 \n" \
+ "*wireframe: False \n"
+# define release_atlantis 0
+# define atlantis_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# include "vis.h"
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+
+static int whalespeed;
+static int do_texture;
+static int do_gradient;
+static XrmOptionDescRec opts[] =
+{
+ {"-whalespeed", ".atlantis.whalespeed", XrmoptionSepArg, 0},
+ {"-texture", ".atlantis.texture", XrmoptionNoArg, "true"},
+ {"+texture", ".atlantis.texture", XrmoptionNoArg, "false"},
+ {"-gradient", ".atlantis.gradient", XrmoptionNoArg, "true"},
+ {"+gradient", ".atlantis.gradient", XrmoptionNoArg, "false"},
+};
+
+static argtype vars[] =
+{
+ {&whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_gradient, "gradient", "Gradient", DEF_GRADIENT, t_Bool},
+};
+
+static OptionStruct desc[] =
+{
+ {"-whalespeed num", "speed of whales and the dolphin"},
+ {"-texture", "whether to introduce water-like distortion"},
+ {"-gradient", "whether to introduce gradient-filled background"},
+};
+
+ENTRYPOINT ModeSpecOpt atlantis_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct atlantis_description =
+{"atlantis", "init_atlantis", "draw_atlantis", NULL,
+ "refresh_atlantis", "change_atlantis", "free_atlantis", &atlantis_opts,
+ 1000, NUM_SHARKS, SHARKSPEED, SHARKSIZE, 64, 1.0, "",
+ "Shows moving sharks/whales/dolphin", 0, NULL};
+
+#endif
+
+static atlantisstruct *atlantis = NULL;
+
+#include "ximage-loader.h"
+
+#include "images/gen/sea-texture_png.h"
+
+
+static void
+parse_image_data(ModeInfo *mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+ ap->texture = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ sea_texture_png,
+ sizeof(sea_texture_png));
+}
+
+static void
+InitFishs(atlantisstruct * ap)
+{
+ int i;
+
+ for (i = 0; i < ap->num_sharks; i++) {
+ ap->sharks[i].x = 70000.0 + NRAND(ap->sharksize);
+ ap->sharks[i].y = NRAND(ap->sharksize);
+ ap->sharks[i].z = NRAND(ap->sharksize);
+ ap->sharks[i].psi = NRAND(360) - 180.0;
+ ap->sharks[i].v = 1.0;
+ }
+
+ /* Random whale direction */
+ ap->whaledir = LRAND() & 1;
+
+ ap->dolph.x = 30000.0;
+ ap->dolph.y = 0.0;
+ ap->dolph.z = (float) (ap->sharksize);
+ ap->dolph.psi = (ap->whaledir) ? 90.0 : -90.0;
+ ap->dolph.theta = 0.0;
+ ap->dolph.v = 6.0;
+
+ ap->momWhale.x = 70000.0;
+ ap->momWhale.y = 0.0;
+ ap->momWhale.z = 0.0;
+ ap->momWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
+ ap->momWhale.theta = 0.0;
+ ap->momWhale.v = 3.0;
+
+ ap->babyWhale.x = 60000.0;
+ ap->babyWhale.y = -2000.0;
+ ap->babyWhale.z = -2000.0;
+ ap->babyWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
+ ap->babyWhale.theta = 0.0;
+ ap->babyWhale.v = 3.0;
+}
+
+static void
+Init(ModeInfo *mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+ static const float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ static const float position[] = {0.0, 1.0, 0.0, 0.0};
+ static const float mat_shininess[] = {90.0};
+ static const float mat_specular[] = {0.8, 0.8, 0.8, 1.0};
+ static const float mat_diffuse[] = {0.46, 0.66, 0.795, 1.0};
+ static const float mat_ambient[] = {0.0, 0.1, 0.2, 1.0};
+ static const float lmodel_ambient[] = {0.4, 0.4, 0.4, 1.0};
+ static const float lmodel_localviewer[] = {0.0};
+
+ float fblue = 0.0, fgreen;
+
+ glFrontFace(GL_CCW);
+
+ if (ap->wire)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_NORMALIZE);
+ }
+ else
+ {
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+ glShadeModel(GL_SMOOTH);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_localviewer);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
+ }
+
+ if (ap->wire || !do_texture)
+ {
+ glDisable(GL_TEXTURE_2D);
+ }
+ else
+ {
+ GLfloat scale = 0.0005;
+
+ if (!ap->texture)
+ parse_image_data (mi);
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ ap->texture->width, ap->texture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ ap->texture->data);
+ check_gl_error("texture");
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+# ifndef HAVE_JWZGLES
+ {
+ GLfloat s_plane[] = { 1, 0, 0, 0 };
+ GLfloat t_plane[] = { 0, 0, 1, 0 };
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
+ glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ }
+# endif
+ glEnable(GL_TEXTURE_2D);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glScalef(scale, scale, 1);
+ glMatrixMode(GL_MODELVIEW);
+ }
+
+ InitFishs(ap);
+
+ /* Add a little randomness */
+ fblue = ((float) (NRAND(30)) / 100.0) + 0.70;
+ fgreen = fblue * 0.56;
+ glClearColor(0.0, fgreen, fblue, 1.0);
+}
+
+ENTRYPOINT void
+reshape_atlantis(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, ap->WinW = (GLint) width, ap->WinH = (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(400.0, 1/h, 1.0, 2000000.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+/* Fill the background with a gradient -- thanks to
+ Phil Carrig <pod@internode.on.net> for figuring out
+ how to do this more efficiently!
+ */
+static void
+clear_tank (atlantisstruct * ap)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (do_gradient && !ap->wire)
+ {
+ GLfloat top[4] = { 0.00, 0.40, 0.70, };
+ GLfloat bot[4] = { 0.00, 0.05, 0.18, };
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+ /* glRotatef(current_device_rotation(), 0, 0, 1); */
+
+# ifndef HAVE_JWZGLES
+ glShadeModel (GL_SMOOTH);
+# endif
+ glDisable (GL_LIGHTING);
+ glBegin (GL_QUADS);
+ glColor3fv (bot);
+ glVertex3f (-1, -1, 1); glVertex3f ( 1, -1, 1);
+ glColor3fv (top);
+ glVertex3f ( 1, 1, 1); glVertex3f (-1, 1, 1);
+ glEnd();
+ glEnable (GL_LIGHTING);
+
+ /* Need to reset this because jwzgles conflates color and material */
+ glColor3f (0.0, 0.1, 0.2);
+ }
+ glPopMatrix();
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+ }
+}
+
+
+static void
+Animate(atlantisstruct * ap)
+{
+ int i;
+
+ for (i = 0; i < ap->num_sharks; i++) {
+ SharkPilot(&(ap->sharks[i]), ap->sharkspeed);
+ SharkMiss(ap, i);
+ }
+ WhalePilot(&(ap->dolph), ap->whalespeed, ap->whaledir);
+ ap->dolph.phi++;
+ WhalePilot(&(ap->momWhale), ap->whalespeed, ap->whaledir);
+ ap->momWhale.phi++;
+ WhalePilot(&(ap->babyWhale), ap->whalespeed, ap->whaledir);
+ ap->babyWhale.phi++;
+}
+
+static void
+AllDisplay(atlantisstruct * ap)
+{
+ int i;
+
+ clear_tank(ap);
+
+ for (i = 0; i < ap->num_sharks; i++) {
+ glPushMatrix();
+ FishTransform(&(ap->sharks[i]));
+ DrawShark(&(ap->sharks[i]), ap->wire);
+ glPopMatrix();
+ }
+
+ glPushMatrix();
+ FishTransform(&(ap->dolph));
+ DrawDolphin(&(ap->dolph), ap->wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ FishTransform(&(ap->momWhale));
+ DrawWhale(&(ap->momWhale), ap->wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ FishTransform(&(ap->babyWhale));
+ glScalef(0.45, 0.45, 0.3);
+ DrawWhale(&(ap->babyWhale), ap->wire);
+ glPopMatrix();
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize atlantis. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void
+init_atlantis(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ atlantisstruct *ap;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_INIT(mi, atlantis);
+ ap = &atlantis[screen];
+ ap->num_sharks = MI_COUNT(mi);
+ if (ap->sharks == NULL) {
+ if ((ap->sharks = (fishRec *) calloc(ap->num_sharks,
+ sizeof (fishRec))) == NULL) {
+ /* free everything up to now */
+ (void) free((void *) atlantis);
+ atlantis = NULL;
+ return;
+ }
+ }
+ ap->sharkspeed = MI_CYCLES(mi); /* has influence on the "width"
+ of the movement */
+ ap->sharksize = MI_SIZE(mi); /* has influence on the "distance"
+ of the sharks */
+ ap->whalespeed = whalespeed;
+ ap->wire = MI_IS_WIREFRAME(mi);
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tnum_sharks=%d\n\tsharkspeed=%.1f\n\tsharksize=%d\n\twhalespeed=%.1f\n\twireframe=%s\n",
+ MI_NAME(mi),
+ ap->num_sharks,
+ ap->sharkspeed,
+ ap->sharksize,
+ ap->whalespeed,
+ ap->wire ? "yes" : "no"
+ );
+ }
+ if ((ap->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_atlantis(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ Init(mi);
+ AllDisplay(ap);
+ glXSwapBuffers(display, window);
+
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void
+draw_atlantis(ModeInfo * mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!ap->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(ap->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ AllDisplay(ap);
+ Animate(ap);
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glXSwapBuffers(display, window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * The display is being taken away from us. Free up malloc'ed
+ * memory and X resources that we've alloc'ed.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void
+free_atlantis(ModeInfo * mi)
+{
+#if 0
+ atlantisstruct *ap = &atlantis[screen];
+
+ if (ap->sharks)
+ (void) free((void *) ap->sharks);
+#endif
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_atlantis(ModeInfo * mi)
+{
+}
+
+ENTRYPOINT void
+change_atlantis(ModeInfo * mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+ if (!ap->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ap->glx_context));
+ Init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Atlantis", atlantis)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/atlantis.h b/hacks/glx/atlantis.h
new file mode 100644
index 0000000..3b24bfa
--- /dev/null
+++ b/hacks/glx/atlantis.h
@@ -0,0 +1,133 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@users.sourceforge.net
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef STANDALONE
+# include <math.h>
+# include "screenhackI.h"
+# ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# include <GL/glx.h>
+# endif
+#else
+# include "xlock.h"
+#endif
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#define RAD 57.295
+#define RRAD 0.01745
+
+/* default values */
+#define NUM_SHARKS 4
+#define SHARKSPEED 100
+#define SHARKSIZE 6000
+
+typedef struct _fishRec {
+ float x, y, z, phi, theta, psi, v;
+ float xt, yt, zt;
+ float htail, vtail;
+ float dtheta;
+ int spurt, attack;
+ int sign;
+} fishRec;
+
+typedef struct {
+ GLint WinH, WinW;
+ GLXContext *glx_context;
+ int num_sharks;
+ float sharkspeed, whalespeed;
+ int sharksize;
+ int wire;
+ Bool whaledir;
+ fishRec *sharks;
+ fishRec momWhale;
+ fishRec babyWhale;
+ fishRec dolph;
+
+ XImage *texture; /* water distortion overlay bits */
+} atlantisstruct;
+
+extern void FishTransform(fishRec *);
+extern void WhalePilot(fishRec *, float, Bool);
+extern void SharkPilot(fishRec *, float);
+extern void SharkMiss(atlantisstruct *, int);
+extern void DrawWhale(fishRec *, int);
+extern void DrawShark(fishRec *, int);
+extern void DrawDolphin(fishRec *, int);
diff --git a/hacks/glx/atlantis.man b/hacks/glx/atlantis.man
new file mode 100644
index 0000000..0c2df5a
--- /dev/null
+++ b/hacks/glx/atlantis.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+atlantis - draw swimming sharks, whales, and dolphins.
+.SH SYNOPSIS
+.B atlantis
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-whalespeed \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-size \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-texture]
+[\-gradient]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This is xfishtank writ large: a GL animation of a number of sharks,
+dolphins, and whales. The swimming motions are great.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-whalespeed \fInumber\fP
+Whale Speed. 0 - 1000. Default: 250.
+.TP 8
+.B \-cycles \fInumber\fP
+Shark Speed. Default: 100.
+.TP 8
+.B \-size \fInumber\fP
+Shark Proximity. 100 - 10000. Default: 6000.
+.TP 8
+.B \-count \fInumber\fP
+Number of Sharks. 0 - 20. Default: 4.
+.TP 8
+.B \-texture | \-no-texture
+Whether to show shimmering water.
+.TP 8
+.B \-gradient
+Whether to draw a gradient on the background, making it darker at the bottom.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Mark Kilgard. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Mark Kilgard.
+
diff --git a/hacks/glx/atunnel.c b/hacks/glx/atunnel.c
new file mode 100644
index 0000000..f21d04f
--- /dev/null
+++ b/hacks/glx/atunnel.c
@@ -0,0 +1,317 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* atunnel --- OpenGL Advanced Tunnel Screensaver */
+
+#if 0
+static const char sccsid[] = "@(#)atunnel.c 5.13 2004/05/25 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2003-2004. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Roman Podobedov
+ * Email: romka@ut.ee
+ * WEB: http://romka.demonews.com
+ *
+ * Eric Lassauge (May-25-2004) <lassauge@users.sourceforge.net>
+ * http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ * E.Lassauge - 25-May-2004:
+ * - added more texture !
+ * E.Lassauge - 16-Mar-2002:
+ * - created based on the Roman demo.
+ * - deleted all external file stuff to use xpm textures and
+ * hardcoded path point values.
+ *
+ */
+
+#ifdef STANDALONE /* xscreensaver mode */
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_atunnel 0
+# define atunnel_handle_event 0
+#define MODE_atunnel
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_atunnel /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "tunnel_draw.h"
+
+#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined(STANDALONE)
+/* USE_XPM & USE_XPMINC in xlock mode ; STANDALONE in xscreensaver mode */
+#include "ximage-loader.h"
+#define I_HAVE_XPM
+
+#include "images/gen/tunnel0_png.h"
+#include "images/gen/tunnel1_png.h"
+#include "images/gen/tunnel2_png.h"
+#include "images/gen/tunnel3_png.h"
+#include "images/gen/tunnel4_png.h"
+#include "images/gen/tunnel5_png.h"
+#endif /* HAVE_XPM */
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_LIGHT "True"
+#define DEF_WIRE "False"
+#define DEF_TEXTURE "True"
+
+static Bool do_light;
+static Bool do_wire;
+static Bool do_texture;
+
+static XrmOptionDescRec opts[] = {
+ {"-light", ".atunnel.light", XrmoptionNoArg, "true" },
+ {"+light", ".atunnel.light", XrmoptionNoArg, "false" },
+ {"-wireframe",".atunnel.wire", XrmoptionNoArg, "true" },
+ {"+wireframe",".atunnel.wire", XrmoptionNoArg, "false" },
+ {"-texture", ".atunnel.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".atunnel.texture", XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+ {&do_light, "light", "Light", DEF_LIGHT, t_Bool},
+ {&do_wire, "wire", "Wire", DEF_WIRE, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+static OptionStruct desc[] =
+{
+ {"-/+ light", "whether to do enable lighting (slower)"},
+ {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+ {"-/+ texture", "whether to apply a texture (slower)"},
+};
+
+ENTRYPOINT ModeSpecOpt atunnel_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct atunnel_description =
+{"atunnel", "init_atunnel", "draw_atunnel", NULL,
+ "draw_atunnel", "init_atunnel", "free_atunnel", &atunnel_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL advanced tunnel screensaver", 0, NULL};
+#endif
+
+/* structure for holding the screensaver data */
+typedef struct {
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ struct tunnel_state *ts;
+ GLuint texture[MAX_TEXTURE]; /* texture id: GL world */
+} atunnelstruct;
+
+static atunnelstruct *Atunnel = NULL;
+
+/*=================== Load Texture =========================================*/
+static void LoadTexture(ModeInfo * mi,
+ const unsigned char *data, unsigned long size,
+ int t_num)
+{
+#if defined( I_HAVE_XPM )
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ XImage *teximage; /* Texture data */
+
+ if ((teximage = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ data, size))
+ == None) {
+ (void) fprintf(stderr, "Error reading the texture.\n");
+ glDeleteTextures(1, &sa->texture[t_num]);
+ do_texture = False;
+#ifdef STANDALONE
+ exit(0);
+#else
+ return;
+#endif
+ }
+
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, sa->texture[t_num]);
+#endif /* HAVE_GLBINDTEXTURE */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
+ check_gl_error("texture");
+
+ /* Texture parameters, LINEAR scaling for better texture quality */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ XDestroyImage(teximage);
+#else /* !I_HAVE_XPM */
+ do_texture = False;
+#endif /* !I_HAVE_XPM */
+}
+
+/*=================== Main Initialization ==================================*/
+static void Init(ModeInfo * mi)
+{
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0};
+ GLfloat fogColor[4] = {0.8, 0.8, 0.8, 1.0};
+
+ if (do_texture)
+ {
+ glGenTextures(MAX_TEXTURE, sa->texture);
+ LoadTexture(mi, tunnel0_png, sizeof(tunnel0_png),0);
+ LoadTexture(mi, tunnel1_png, sizeof(tunnel1_png),1);
+ LoadTexture(mi, tunnel2_png, sizeof(tunnel2_png),2);
+ LoadTexture(mi, tunnel3_png, sizeof(tunnel3_png),3);
+ LoadTexture(mi, tunnel4_png, sizeof(tunnel4_png),4);
+ LoadTexture(mi, tunnel5_png, sizeof(tunnel5_png),5);
+ glEnable(GL_TEXTURE_2D);
+ }
+ sa->ts = atunnel_InitTunnel();
+
+ /* Set lighting parameters */
+ if (do_light)
+ {
+ glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+
+ /* Enable light 0 */
+ glEnable(GL_LIGHT0);
+ glDepthFunc(GL_LESS);
+
+ glEnable(GL_LIGHTING);
+ }
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ do_wire = 0;
+# endif
+
+ if (do_wire) {
+ glDisable(GL_NORMALIZE);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+ glPolygonMode(GL_FRONT,GL_LINE);
+ glPolygonMode(GL_BACK,GL_LINE);
+ }
+ else
+ {
+ glEnable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ /* Enable fog */
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glFogf(GL_FOG_DENSITY, 0.3);
+ glEnable(GL_FOG);
+
+ /* Cull face */
+ glCullFace(GL_FRONT);
+ glEnable(GL_CULL_FACE);
+ }
+
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+}
+
+
+/* Standard reshape function */
+ENTRYPOINT void
+reshape_atunnel(ModeInfo *mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 2) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-0.1*(1/h), 0.1*(1/h), -0.1, 0.1, 0.1, 10);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+/* draw the screensaver once */
+ENTRYPOINT void draw_atunnel(ModeInfo * mi)
+{
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!sa->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(sa->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glLoadIdentity();
+
+ atunnel_DrawTunnel(sa->ts, do_texture, do_light, sa->texture);
+ atunnel_SplashScreen(sa->ts, do_wire, do_texture, do_light);
+
+ glFlush();
+ /* manage framerate display */
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glXSwapBuffers(display, window);
+
+}
+
+
+/* xscreensaver initialization routine */
+ENTRYPOINT void init_atunnel(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ atunnelstruct *sa;
+
+ MI_INIT(mi, Atunnel);
+ sa = &Atunnel[screen];
+
+ sa->window = MI_WINDOW(mi);
+ if ((sa->glx_context = init_GL(mi)) != NULL) {
+ reshape_atunnel(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ Init(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+}
+
+/* all sorts of nice cleanup code should go here! */
+ENTRYPOINT void free_atunnel(ModeInfo * mi)
+{
+#if 0
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ FreeTunnel(sa->ts);
+#endif
+}
+
+XSCREENSAVER_MODULE ("Atunnel", atunnel)
+
+#endif
diff --git a/hacks/glx/atunnel.man b/hacks/glx/atunnel.man
new file mode 100644
index 0000000..dc19582
--- /dev/null
+++ b/hacks/glx/atunnel.man
@@ -0,0 +1,83 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "12-Feb-03" "X Version 11"
+.SH NAME
+atunnel - hypnotic GL tunnel journey
+.SH SYNOPSIS
+.B sballs
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-light] [\-no-light]
+[\-wire] [\-no-wire]
+[\-texture] [\-no-texture]
+[\-fps]
+.SH DESCRIPTION
+The \fIatunnel\fP program draws an animation of a journey in a GL tunnel.
+.SH OPTIONS
+.I sballs
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-texture
+Show a textured tunnel. This is the default.
+.TP 8
+.B \-no\-texture
+Disables texturing the animation.
+.TP 8
+.B \-wire
+Draw a wireframe rendition of the tunnel.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Eric Lassauge.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+
+The original code for this mode was written by
+Roman Podobedov <romka@ut.ee>
+and can be found at http://romka.demonews.com
+
+.SH AUTHOR
+Roman Podobedov <romka@ut.ee>
+Eric Lassauge <lassauge@users.sourceforge.net>
diff --git a/hacks/glx/b_draw.c b/hacks/glx/b_draw.c
new file mode 100644
index 0000000..977efbe
--- /dev/null
+++ b/hacks/glx/b_draw.c
@@ -0,0 +1,239 @@
+#if 0
+static const char sccsid[] = "@(#)b_draw.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_draw.c: This code creates new bubbles, manages them and controls
+ * them as they are drawn on the screen.
+ */
+
+#include "bubble3d.h"
+
+typedef struct draw_context {
+ /* The list of bubbles currently on the screen. */
+ void **bubble_list;
+ int nr_bubbles;
+
+ /* When was the last time we created a new bubble? */
+ int bubble_count;
+
+ glb_data *d;
+
+} draw_context;
+
+void *
+glb_draw_init(void)
+{
+ draw_context *c;
+
+ GLfloat mat_specular[] =
+ {1, 1, 1, 1};
+ GLfloat mat_emission[] =
+ {0, 0, 0, 1};
+ GLfloat mat_shininess[] =
+ {100};
+ GLfloat ambient[] =
+ {0.5, 0.5, 0.5, 1.0};
+ GLfloat light_position[][4] =
+ {
+ {0, -1, 0, 0},
+ {1, 1, 0, 0},
+ {-1, 0, 1, 0}};
+ GLfloat light_diffuse[][4] =
+ {
+ {1, 1, 1, 1},
+ {1, 1, 1, 1},
+ {1, 1, 1, 1}};
+ GLfloat light_specular[][4] =
+ {
+ {1, 1, 1, 1},
+ {1, 1, 1, 1},
+ {1, 1, 1, 1}};
+
+ /* Initialize the context. */
+ c = (struct draw_context *) malloc(sizeof (struct draw_context));
+
+ if (c == 0)
+ return 0;
+ c->bubble_list = 0;
+ c->nr_bubbles = 0;
+ c->bubble_count = glb_config.create_bubbles_every;
+
+ /* Do some GL initialization. */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, glb_config.bubble_colour);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+ if (glb_config.transparent_p)
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_LIGHT2);
+
+ if (glb_config.transparent_p)
+ glEnable(GL_BLEND);
+ else
+ glEnable(GL_DEPTH_TEST);
+
+ glEnable(GL_AUTO_NORMAL);
+ glEnable(GL_NORMALIZE);
+
+ if (glb_config.transparent_p)
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position[0]);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse[0]);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular[0]);
+ glLightfv(GL_LIGHT1, GL_POSITION, light_position[1]);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse[1]);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular[1]);
+ glLightfv(GL_LIGHT2, GL_POSITION, light_position[2]);
+ glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse[2]);
+ glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular[2]);
+
+ c->d = glb_sphere_init();
+
+ return c;
+}
+
+static void
+delete_bubble(draw_context * c, int j)
+{
+ int i;
+
+ glb_bubble_delete(c->bubble_list[j]);
+
+ for (i = j; i < c->nr_bubbles - 1; ++i)
+ c->bubble_list[i] = c->bubble_list[i + 1];
+
+ c->nr_bubbles--;
+}
+
+void
+glb_draw_end(void *cc)
+{
+ draw_context *c = (draw_context *) cc;
+ int i;
+
+ for (i = 0; i < c->nr_bubbles; ++i) {
+ delete_bubble(c, i);
+ i--;
+ }
+
+ glb_sphere_end (c->d);
+
+ (void) free((void *) c->bubble_list);
+ (void) free((void *) c);
+}
+
+static int
+create_new_bubbles(draw_context * c)
+{
+ int n, i;
+ double r = glb_drand();
+ GLfloat size, speed, scale_incr, x, y, z;
+ void *b[4];
+ void **old_bubble_list;
+
+ /* How many bubbles to make? */
+ if (r < glb_config.p_bubble_group[0])
+ n = 1;
+ else if (r < glb_config.p_bubble_group[1])
+ n = 2;
+ else if (r < glb_config.p_bubble_group[2])
+ n = 3;
+ else
+ n = 4;
+
+ /* Initial position of top-most bubble in group. */
+ x = glb_drand() * 4 - 2;
+ y = glb_config.screen_bottom;
+ z = glb_drand() * 2 - 2;
+
+ /* What size? */
+ size = glb_config.min_size
+ + glb_drand() * (glb_config.max_size - glb_config.min_size);
+
+ /* What speed? */
+ speed = glb_config.min_speed
+ + glb_drand() * (glb_config.max_speed - glb_config.min_speed);
+
+ /* Work out the scaling increment. Bubbles should increase by scale_factor
+ * as they go from bottom to top of screen.
+ */
+ scale_incr = (size * glb_config.scale_factor - size)
+ / ((glb_config.screen_top - glb_config.screen_bottom) / speed);
+
+ /* Create the bubble(s). */
+ for (i = 0; i < n; ++i) {
+ if ((b[i] = glb_bubble_new(c->d, x, y, z, size, speed, scale_incr)) == 0) {
+ /* Out of memory - recover. */
+ i--;
+ while (i >= 0)
+ glb_bubble_delete(b[i]);
+ return 0;
+ }
+ /* Create the next bubble below the last bubble. */
+ y -= size * 3;
+ }
+
+ /* Add the bubbles to the list. */
+ c->nr_bubbles += n;
+ old_bubble_list = c->bubble_list;
+ if (c->bubble_list == 0) {
+ c->bubble_list = (void **) malloc(c->nr_bubbles * sizeof (void *));
+ } else {
+ c->bubble_list = (void **) realloc(c->bubble_list,
+ c->nr_bubbles * sizeof (void *));
+ }
+
+ if (c->bubble_list == 0) {
+ /* Out of memory - recover. */
+ for (i = 0; i < n; ++i)
+ glb_bubble_delete(b[i]);
+ c->bubble_list = old_bubble_list;
+ c->nr_bubbles -= n;
+ return 0;
+ }
+ for (i = 0; i < n; ++i)
+ c->bubble_list[c->nr_bubbles - i - 1] = b[i];
+
+ return 1;
+}
+
+void
+glb_draw_step(void *cc)
+{
+ draw_context *c = (draw_context *) cc;
+ int i;
+
+ /* Consider creating a new bubble or bubbles. */
+ if (c->nr_bubbles < glb_config.max_bubbles &&
+ c->bubble_count++ > glb_config.create_bubbles_every) {
+ if (create_new_bubbles(c))
+ c->bubble_count = 0;
+ }
+ /* Clear the display. */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* XXX Draw the background here ... */
+
+ /* Draw all the bubbles on the display. */
+ for (i = 0; i < c->nr_bubbles; ++i) {
+ void *b = c->bubble_list[i];
+
+ glb_bubble_step(b);
+ glb_bubble_draw(c->d, b);
+
+ /* Has the bubble reached the top of the screen? */
+ if (glb_bubble_get_y(b) >= glb_config.screen_top) {
+ delete_bubble(c, i);
+ i--;
+ }
+ }
+}
diff --git a/hacks/glx/b_lockglue.c b/hacks/glx/b_lockglue.c
new file mode 100644
index 0000000..1bb1e67
--- /dev/null
+++ b/hacks/glx/b_lockglue.c
@@ -0,0 +1,240 @@
+#if 0
+static const char sccsid[] = "@(#)b_lockglue.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_lockglue.c: Glue to make this all work with xlockmore.
+ */
+
+#include "bubble3d.h"
+
+/* XXX This lot should eventually be made configurable using the
+ * options stuff below.
+ */
+struct glb_config glb_config =
+{
+ 0, /* transparent_p */
+#if GLB_SLOW_GL
+ 2, /* subdivision_depth */
+#else
+ 3, /* subdivision_depth */
+#endif
+ 5, /* nr_nudge_axes */
+ 0.01, /* nudge_angle_factor */
+ 0.20, /* nudge_factor */
+ 0.1, /* rotation_factor */
+ 8, /* create_bubbles_every */
+ 8, /* max_bubbles */
+ {0.7, 0.8, 0.9, 1.0}, /* p_bubble_group */
+ 0.5, /* max_size */
+ 0.1, /* min_size */
+ 0.03, /* max_speed */
+ 0.005, /* min_speed */
+ 1.5, /* scale_factor */
+ -4, /* screen_bottom */
+ 4, /* screen_top */
+ {0.0, 0.0, 0.7, 0.3} /* bubble_colour */
+};
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n"
+
+# define release_bubble3d 0
+# define bubble3d_handle_event xlockmore_no_events
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#include "vis.h"
+#endif
+
+#ifdef USE_GL
+
+
+#define DEF_TRANSPARENT "True"
+#define DEF_BUBBLECOLOR "random"
+
+static Bool transparent_p;
+static char *bubble_color_str;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ { "-transparent", ".transparent", XrmoptionNoArg, "True" },
+ { "+transparent", ".transparent", XrmoptionNoArg, "False" },
+ { "-color", ".bubblecolor", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&transparent_p, "transparent", "Transparent", DEF_TRANSPARENT, t_Bool},
+ {&bubble_color_str, "bubblecolor", "BubbleColor", DEF_BUBBLECOLOR, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt bubble3d_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct bubbles3d_description =
+{"bubbles3d",
+ "init_bubble3d",
+ "draw_bubble3d",
+ NULL,
+ "change_bubble3d",
+ "init_bubble3d",
+ "free_bubble3d",
+ &bubble3d_opts,
+ 1000, 1, 2, 1, 64, 1.0, "",
+ "Richard Jones's GL bubbles",
+ 0,
+ NULL
+};
+
+#endif /* USE_MODULES */
+
+struct context {
+ GLXContext *glx_context;
+ void *draw_context;
+};
+
+static struct context *contexts = 0;
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+}
+
+static void
+init_colors(ModeInfo *mi)
+{
+ if (strncasecmp(bubble_color_str, "auto", strlen("auto")) == 0) {
+ glb_config.bubble_colour[0] = ((float) (NRAND(100)) / 100.0);
+ glb_config.bubble_colour[1] = ((float) (NRAND(100)) / 100.0);
+ /* I keep more blue */
+ glb_config.bubble_colour[2] = ((float) (NRAND(50)) / 100.0) + 0.50;
+ } else if (strncasecmp(bubble_color_str, "random", strlen("random")) == 0) {
+ glb_config.bubble_colour[0] = -1.0;
+ } else {
+ parse_color(mi, "bubble", bubble_color_str, glb_config.bubble_colour);
+ }
+}
+
+static void
+init(struct context *c)
+{
+ glb_config.transparent_p = transparent_p;
+ glb_sphere_init();
+ c->draw_context = glb_draw_init();
+}
+
+ENTRYPOINT void
+reshape_bubble3d(ModeInfo *mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ h = height / (GLfloat) width;
+ }
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1/h, 3, 8);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0, 0, -5);
+}
+
+static void
+do_display(struct context *c)
+{
+ glb_draw_step(c->draw_context);
+}
+
+ENTRYPOINT void
+init_bubble3d(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int screen = MI_SCREEN(mi);
+ struct context *c;
+
+ MI_INIT (mi, contexts);
+ c = &contexts[screen];
+ c->glx_context = init_GL(mi);
+ init_colors(mi);
+ if (c->glx_context != 0) {
+ init(c);
+ reshape_bubble3d(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ do_display(c);
+ glFinish();
+ glXSwapBuffers(display, window);
+ } else
+ MI_CLEARWINDOW(mi);
+}
+
+ENTRYPOINT void
+draw_bubble3d(ModeInfo * mi)
+{
+ struct context *c = &contexts[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!c->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(c->glx_context));
+
+ glb_config.polygon_count = 0;
+ glPushMatrix();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ do_display(c);
+ glPopMatrix();
+ mi->polygon_count = glb_config.polygon_count;
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_bubble3d(ModeInfo * mi)
+{
+ /* nothing */
+}
+#endif /* !STANDALONE */
+
+ENTRYPOINT void
+free_bubble3d(ModeInfo * mi)
+{
+ struct context *c = &contexts[MI_SCREEN(mi)];
+ if (c->draw_context)
+ glb_draw_end(c->draw_context);
+}
+
+XSCREENSAVER_MODULE ("Bubble3D", bubble3d)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/b_sphere.c b/hacks/glx/b_sphere.c
new file mode 100644
index 0000000..78be392
--- /dev/null
+++ b/hacks/glx/b_sphere.c
@@ -0,0 +1,219 @@
+#if 0
+static const char sccsid[] = "@(#)b_sphere.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_sphere.c: Create a list of vertices and triangles in a
+ * normalized sphere, which is then later used as the basic shape
+ * for all bubbles. This code is run once when the program starts
+ * up.
+ */
+
+#include "bubble3d.h"
+
+typedef glb_vertex vertex;
+typedef glb_triangle triangle;
+
+struct glb_data {
+
+ /* The list of vertices created. */
+ vertex *vertices;
+ int nr_vertices, nr_vertices_allocated;
+
+ /* The list of triangles created. */
+ triangle *triangles;
+ int nr_triangles, nr_triangles_allocated;
+};
+
+
+#define EPSILON GLB_VERTICES_EPSILON
+
+/* Should be taken care of already... but just in case */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+static inline int
+close_enough(const GLfloat * v1, const GLfloat * v2)
+{
+ return fabs((double) (v1[0] - v2[0])) <= EPSILON &&
+ fabs((double) (v1[1] - v2[1])) <= EPSILON &&
+ fabs((double) (v1[2] - v2[2])) <= EPSILON;
+}
+
+#define INCR(n) ((n == 0) ? (n = 1) : (n *= 2))
+#define INCR_ALLOCATION(a, n, t) (a = (t *) realloc (a, INCR (n) * sizeof (t)))
+
+static inline GLuint
+save_vertex(glb_data *d, const GLfloat * v)
+{
+ int i;
+
+ /* Inefficient, but we only do this a few times. Check to see if there's
+ * an existing vertex which is `close enough' to this one.
+ */
+ for (i = 0; i < d->nr_vertices; ++i)
+ if (close_enough(v, d->vertices[i]))
+ return i;
+
+ if (d->nr_vertices_allocated <= d->nr_vertices) {
+ if (d->vertices == 0) {
+ d->vertices = (vertex *) malloc(INCR(d->nr_vertices_allocated) * sizeof (vertex));
+ } else {
+ INCR_ALLOCATION(d->vertices, d->nr_vertices_allocated, vertex);
+ }
+ }
+ d->vertices[d->nr_vertices][0] = v[0];
+ d->vertices[d->nr_vertices][1] = v[1];
+ d->vertices[d->nr_vertices][2] = v[2];
+ return d->nr_vertices++;
+}
+
+static inline GLuint
+save_triangle(glb_data *d, GLuint v1, GLuint v2, GLuint v3)
+{
+ if (d->nr_triangles_allocated <= d->nr_triangles) {
+ if (d->triangles == 0) {
+ d->triangles = (triangle *) malloc(INCR(d->nr_triangles_allocated) * sizeof (triangle));
+ } else {
+ INCR_ALLOCATION(d->triangles, d->nr_triangles_allocated, triangle);
+ }
+ }
+ d->triangles[d->nr_triangles][0] = v1;
+ d->triangles[d->nr_triangles][1] = v2;
+ d->triangles[d->nr_triangles][2] = v3;
+ return d->nr_triangles++;
+}
+
+static inline void
+normalize(GLfloat v[3])
+{
+ GLfloat d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
+
+ if (d != 0) {
+ v[0] /= d;
+ v[1] /= d;
+ v[2] /= d;
+ } else {
+ v[0] = v[1] = v[2] = 0;
+ }
+}
+
+static void
+subdivide(glb_data *d,
+ const GLfloat * v1, GLuint vi1,
+ const GLfloat * v2, GLuint vi2,
+ const GLfloat * v3, GLuint vi3,
+ int depth)
+{
+ int i;
+
+ if (depth == 0) {
+ save_triangle(d, vi1, vi2, vi3);
+ } else {
+ GLuint vi12, vi23, vi31;
+ GLfloat v12[3], v23[3], v31[3];
+
+ for (i = 0; i < 3; ++i) {
+ v12[i] = v1[i] + v2[i];
+ v23[i] = v2[i] + v3[i];
+ v31[i] = v3[i] + v1[i];
+ }
+ normalize(v12);
+ vi12 = save_vertex(d, v12);
+ normalize(v23);
+ vi23 = save_vertex(d, v23);
+ normalize(v31);
+ vi31 = save_vertex(d, v31);
+ subdivide(d, v1, vi1, v12, vi12, v31, vi31, depth - 1);
+ subdivide(d, v2, vi2, v23, vi23, v12, vi12, depth - 1);
+ subdivide(d, v3, vi3, v31, vi31, v23, vi23, depth - 1);
+ subdivide(d, v12, vi12, v23, vi23, v31, vi31, depth - 1);
+ }
+}
+
+#define ICO_X 0.525731112119133606
+#define ICO_Z 0.850650808352039932
+
+static const GLfloat vdata[12][3] =
+{
+ {-ICO_X, 0, ICO_Z},
+ {ICO_X, 0, ICO_Z},
+ {-ICO_X, 0, -ICO_Z},
+ {ICO_X, 0, -ICO_Z},
+ {0, ICO_Z, ICO_X},
+ {0, ICO_Z, -ICO_X},
+ {0, -ICO_Z, ICO_X},
+ {0, -ICO_Z, -ICO_X},
+ {ICO_Z, ICO_X, 0},
+ {-ICO_Z, ICO_X, 0},
+ {ICO_Z, -ICO_X, 0},
+ {-ICO_Z, -ICO_X, 0}
+};
+
+static const GLuint tindices[20][3] =
+{
+ {0, 4, 1},
+ {0, 9, 4},
+ {9, 5, 4},
+ {4, 5, 8},
+ {4, 8, 1},
+ {8, 10, 1},
+ {8, 3, 10},
+ {5, 3, 8},
+ {5, 2, 3},
+ {2, 7, 3},
+ {7, 10, 3},
+ {7, 6, 10},
+ {7, 11, 6},
+ {11, 0, 6},
+ {0, 1, 6},
+ {6, 1, 10},
+ {9, 0, 11},
+ {9, 11, 2},
+ {9, 2, 5},
+ {7, 2, 11}
+};
+
+/* Public interface: Create the sphere. */
+glb_data *
+glb_sphere_init(void)
+{
+ glb_data *d = (glb_data *) calloc (1, sizeof (*d));
+ int i;
+
+ for (i = 0; i < 20; ++i) {
+ subdivide(d, vdata[tindices[i][0]], save_vertex(d, vdata[tindices[i][0]]),
+ vdata[tindices[i][1]], save_vertex(d, vdata[tindices[i][1]]),
+ vdata[tindices[i][2]], save_vertex(d, vdata[tindices[i][2]]),
+ glb_config.subdivision_depth);
+ }
+
+ return d;
+}
+
+/* Return the vertices list. */
+glb_vertex *
+glb_sphere_get_vertices(glb_data *d, int *nr_vertices_ptr)
+{
+ *nr_vertices_ptr = d->nr_vertices;
+ return d->vertices;
+}
+
+/* Return the triangles list. */
+glb_triangle *
+glb_sphere_get_triangles(glb_data *d, int *nr_triangles_ptr)
+{
+ *nr_triangles_ptr = d->nr_triangles;
+ return d->triangles;
+}
+
+/* Free up memory. */
+void
+glb_sphere_end(glb_data *d)
+{
+ (void) free((void *) d->vertices);
+ (void) free((void *) d->triangles);
+ free (d);
+}
diff --git a/hacks/glx/blinkbox.c b/hacks/glx/blinkbox.c
new file mode 100644
index 0000000..f777371
--- /dev/null
+++ b/hacks/glx/blinkbox.c
@@ -0,0 +1,608 @@
+/* blinkbox, Copyright (c) 2003 Jeremy English <jenglish@myself.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* motion blur added March 2005 by John Boero <jlboero@cs.uwm.edu>
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_ball 0
+# define release_ball 0
+# define ball_handle_event xlockmore_no_events
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "sphere.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define MAX_COUNT 20
+#define ALPHA_AMT 0.05
+
+/* this should be between 1 and 8 */
+#define DEF_BOXSIZE "2"
+#define DEF_DISSOLVE "False"
+#define DEF_FADE "True"
+#define DEF_BLUR "True"
+
+
+typedef struct{
+ GLfloat x,y,z;
+} Tdpos;
+
+typedef struct{
+ int hit;
+ Tdpos pos;
+ int counter;
+ GLfloat color[3];
+ GLfloat rot[4];
+ int des_count;
+ int alpha_count;
+}Side;
+
+struct Bounding_box {
+ Tdpos top;
+ Tdpos bottom;
+};
+
+struct Ball {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+ int d;
+};
+
+struct bscale {
+ GLfloat wh; /*width Height*/
+ GLfloat d; /*depth*/
+};
+
+static const struct Bounding_box bbox = {{14,14,20},{-14,-14,-20}};
+
+typedef struct {
+ GLXContext *glx_context;
+
+ struct Ball ball;
+
+ struct bscale bscale;
+
+ Tdpos mo; /*motion*/
+ Tdpos moh; /*hold motion value*/
+
+ Tdpos bpos;
+
+ GLuint ballList;
+ GLuint boxList;
+ GLfloat des_amt;
+
+ /*sides*/
+ Side lside;/*Red*/
+ Side rside;/*Green*/
+ Side tside;/*Blue*/
+ Side bside;/*Orange*/
+ Side fside;/*Yellow*/
+ Side aside;/*Purple*/
+ Side *sp;
+
+} blinkboxstruct;
+
+static blinkboxstruct *blinkbox = (blinkboxstruct *) NULL;
+
+
+/* lights */
+static const float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
+static const float LightPosition[]= { 20.0f, 100.0f, 20.0f, 1.0f };
+
+static Bool do_dissolve;
+static Bool do_fade;
+static Bool do_blur;
+static float bscale_wh;
+
+static XrmOptionDescRec opts[] = {
+ { "-boxsize", ".boxsize", XrmoptionSepArg, 0 },
+ { "-dissolve", ".dissolve", XrmoptionNoArg, "True" },
+ { "+dissolve", ".dissolve", XrmoptionNoArg, "False" },
+ { "-fade", ".fade", XrmoptionNoArg, "True" },
+ { "+fade", ".fade", XrmoptionNoArg, "False" },
+ { "-blur", ".blur", XrmoptionNoArg, "True" },
+ { "+blur", ".blur", XrmoptionNoArg, "False" }
+
+};
+
+static argtype vars[] = {
+ {&bscale_wh, "boxsize", "Boxsize", DEF_BOXSIZE, t_Float},
+ {&do_dissolve, "dissolve", "Dissolve", DEF_DISSOLVE, t_Bool},
+ {&do_fade, "fade", "Fade", DEF_FADE, t_Bool},
+ {&do_blur, "blur", "Blur", DEF_BLUR, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static void
+swap(GLfloat *a, GLfloat *b)
+{
+ GLfloat t = *a;
+ *a = *b;
+ *b = t;
+}
+
+static float
+get_rand(void)
+{
+ GLfloat j = 1+(random() % 2);
+ return (j);
+}
+
+static void
+swap_mov(GLfloat *a, GLfloat *b)
+{
+ int j;
+ swap(a,b);
+ j = get_rand();
+ if (*a < 0)
+ *a = j * -1;
+ else
+ *a = j;
+}
+
+static void
+cp_b_pos(blinkboxstruct *bp, Tdpos *s_pos)
+{
+ s_pos->x = bp->ball.x;
+ s_pos->y = bp->ball.y;
+ s_pos->z = bp->ball.z;
+}
+
+static void
+hit_side(blinkboxstruct *bp)
+{
+ if ((bp->ball.x - bp->ball.d) <= bbox.bottom.x){
+ bp->lside.hit = 1;
+ bp->lside.counter = MAX_COUNT;
+ bp->lside.des_count = 1;
+ bp->lside.alpha_count = 0;
+ cp_b_pos(bp, &bp->lside.pos);
+ swap_mov(&bp->mo.x,&bp->moh.x);
+ }else
+ if ((bp->ball.x + bp->ball.d) >= bbox.top.x){
+ bp->rside.hit = 1;
+ bp->rside.counter = MAX_COUNT;
+ bp->rside.des_count = 1;
+ bp->rside.alpha_count = 0;
+ cp_b_pos(bp, &bp->rside.pos);
+ swap_mov(&bp->mo.x,&bp->moh.x);
+ }
+}
+
+static void
+hit_top_bottom(blinkboxstruct *bp)
+{
+ if ((bp->ball.y - bp->ball.d) <= bbox.bottom.y){
+ bp->bside.hit = 1;
+ bp->bside.counter = MAX_COUNT;
+ bp->bside.des_count = 1;
+ bp->bside.alpha_count = 0;
+ cp_b_pos(bp, &bp->bside.pos);
+ swap_mov(&bp->mo.y,&bp->moh.y);
+ }else
+ if ((bp->ball.y + bp->ball.d) >= bbox.top.y){
+ bp->tside.hit = 1;
+ bp->tside.counter = MAX_COUNT;
+ bp->tside.des_count = 1;
+ bp->tside.alpha_count = 0;
+ cp_b_pos(bp, &bp->tside.pos);
+ swap_mov(&bp->mo.y,&bp->moh.y);
+ }
+}
+
+static void
+hit_front_back(blinkboxstruct *bp)
+{
+ if ((bp->ball.z - bp->ball.d) <= bbox.bottom.z){
+ bp->aside.hit = 1;
+ bp->aside.counter = MAX_COUNT;
+ bp->aside.des_count = 1;
+ bp->aside.alpha_count = 0;
+ cp_b_pos(bp, &bp->aside.pos);
+ swap_mov(&bp->mo.z,&bp->moh.z);
+ }else
+ if((bp->ball.z + bp->ball.d) >= bbox.top.z){
+ bp->fside.hit = 1;
+ bp->fside.counter = MAX_COUNT;
+ bp->fside.des_count = 1;
+ bp->fside.alpha_count = 0;
+ cp_b_pos(bp, &bp->fside.pos);
+ swap_mov(&bp->mo.z,&bp->moh.z);
+ }
+}
+
+ENTRYPOINT void
+reshape_ball (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 40.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 2.0, 10.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+}
+
+static void
+unit_cube(int wire)
+{
+ glBegin((wire)?GL_LINE_LOOP:GL_QUADS);
+ glNormal3f( 0.0f, -1.0f, 0.0f);
+ glVertex3f(-1.0f, -1.0f, -1.0f);
+ glVertex3f( 1.0f, -1.0f, -1.0f);
+ glVertex3f( 1.0f, -1.0f, 1.0f);
+ glVertex3f(-1.0f, -1.0f, 1.0f);
+ glNormal3f( 0.0f, 0.0f, 1.0f);
+ glVertex3f(-1.0f, -1.0f, 1.0f);
+ glVertex3f( 1.0f, -1.0f, 1.0f);
+ glVertex3f( 1.0f, 1.0f, 1.0f);
+ glVertex3f(-1.0f, 1.0f, 1.0f);
+ glNormal3f( 0.0f, 0.0f, -1.0f);
+ glVertex3f(-1.0f, -1.0f, -1.0f);
+ glVertex3f(-1.0f, 1.0f, -1.0f);
+ glVertex3f( 1.0f, 1.0f, -1.0f);
+ glVertex3f( 1.0f, -1.0f, -1.0f);
+ glNormal3f( 1.0f, 0.0f, 0.0f);
+ glVertex3f( 1.0f, -1.0f, -1.0f);
+ glVertex3f( 1.0f, 1.0f, -1.0f);
+ glVertex3f( 1.0f, 1.0f, 1.0f);
+ glVertex3f( 1.0f, -1.0f, 1.0f);
+ glNormal3f( -1.0f, 0.0f, 0.0f);
+ glVertex3f(-1.0f, -1.0f, -1.0f);
+ glVertex3f(-1.0f, -1.0f, 1.0f);
+ glVertex3f(-1.0f, 1.0f, 1.0f);
+ glVertex3f(-1.0f, 1.0f, -1.0f);
+ glNormal3f( 1.0f, 1.0f, 0.0f);
+ glVertex3f(-1.0f, 1.0f, -1.0f);
+ glVertex3f(-1.0f, 1.0f, 1.0f);
+ glVertex3f( 1.0f, 1.0f, 1.0f);
+ glVertex3f( 1.0f, 1.0f, -1.0f);
+ glEnd();
+}
+
+ENTRYPOINT void
+init_ball (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ blinkboxstruct *bp;
+
+ MI_INIT (mi, blinkbox);
+ bp = &blinkbox[MI_SCREEN(mi)];
+
+ if ((bp->glx_context = init_GL(mi)) != NULL) {
+ reshape_ball(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ }
+ else
+ MI_CLEARWINDOW(mi);
+
+ bp->ball.d = 1;
+ bp->bscale.wh = bscale_wh;
+ bp->bscale.d = 0.25;
+
+ bp->mo.x = 1;
+ bp->mo.y = 1;
+ bp->mo.z = 1;
+
+ bp->moh.x = -1.0;
+ bp->moh.y = -1.5;
+ bp->moh.z = -1.5;
+
+ bp->bpos.x = 1;
+ bp->bpos.y = 1;
+ bp->bpos.z = 1;
+
+ bp->des_amt = 1;
+
+ bp->lside.counter = MAX_COUNT;
+ bp->rside.counter = MAX_COUNT;
+ bp->tside.counter = MAX_COUNT;
+ bp->bside.counter = MAX_COUNT;
+ bp->fside.counter = MAX_COUNT;
+ bp->aside.counter = MAX_COUNT;
+
+ bp->lside.color[0] = 1;
+ bp->rside.color[1] = 1;
+ bp->tside.color[2] = 1;
+
+ bp->bside.color[0] = 1;
+ bp->bside.color[1] = 0.5;
+
+ bp->fside.color[0] = 1;
+ bp->fside.color[1] = 1;
+
+ bp->aside.color[0] = 0.5;
+ bp->aside.color[2] = 1;
+
+ bp->lside.rot[0] = 90;
+ bp->rside.rot[0] = 90;
+ bp->tside.rot[0] = 90;
+ bp->bside.rot[0] = 90;
+ bp->fside.rot[0] = 90;
+ bp->aside.rot[0] = 90;
+
+ bp->lside.rot[2] = 1;
+ bp->rside.rot[2] = 1;
+ bp->tside.rot[1] = 1;
+ bp->bside.rot[1] = 1;
+ bp->fside.rot[3] = 1;
+ bp->aside.rot[3] = 1;
+
+ bp->lside.des_count = 1;
+ bp->rside.des_count = 1;
+ bp->tside.des_count = 1;
+ bp->bside.des_count = 1;
+ bp->fside.des_count = 1;
+ bp->aside.des_count = 1;
+
+ bp->lside.alpha_count = 1;
+ bp->rside.alpha_count = 1;
+ bp->tside.alpha_count = 1;
+ bp->bside.alpha_count = 1;
+ bp->fside.alpha_count = 1;
+ bp->aside.alpha_count = 1;
+
+
+#define SPHERE_SLICES 12 /* how densely to render spheres */
+#define SPHERE_STACKS 16
+
+ bp->sp = malloc(sizeof(*bp->sp));
+ if(bp->sp == NULL){
+ fprintf(stderr,"Could not allocate memory\n");
+ exit(1);
+ }
+ if( (bp->bscale.wh < 1) ||
+ (bp->bscale.wh > 8) ) {
+ fprintf(stderr,"Boxsize out of range. Using default\n");
+ bp->bscale.wh = 2;
+ }
+ if (do_dissolve){
+ bp->des_amt = bp->bscale.wh / MAX_COUNT;
+ }
+
+ reshape_ball(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ bp->ballList = glGenLists(1);
+ glNewList(bp->ballList, GL_COMPILE);
+ unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
+ glEndList ();
+
+ bp->boxList = glGenLists(1);
+ glNewList(bp->boxList, GL_COMPILE);
+ unit_cube(wire);
+ glEndList();
+
+ if (wire) return;
+
+ glEnable(GL_COLOR_MATERIAL);
+ glShadeModel(GL_SMOOTH);
+ glClearDepth(1.0f);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_LIGHTING);
+ glClearDepth(1);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
+ glEnable(GL_LIGHT1);
+ if (do_fade || do_blur) {
+ glEnable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
+ }
+}
+
+static void
+CheckBoxPos(blinkboxstruct *bp,
+ GLfloat bot_x, GLfloat top_x, GLfloat bot_y, GLfloat top_y)
+{
+ /*Make sure it's inside of the bounding box*/
+ bp->bpos.x = ((bp->bpos.x - bp->bscale.wh) < bot_x) ? bot_x + bp->bscale.wh : bp->bpos.x;
+ bp->bpos.x = ((bp->bpos.x + bp->bscale.wh) > top_x) ? top_x - bp->bscale.wh : bp->bpos.x;
+ bp->bpos.y = ((bp->bpos.y - bp->bscale.wh) < bot_y) ? bot_y + bp->bscale.wh : bp->bpos.y;
+ bp->bpos.y = ((bp->bpos.y + bp->bscale.wh) > top_y) ? top_y - bp->bscale.wh : bp->bpos.y;
+}
+
+ENTRYPOINT void
+draw_ball (ModeInfo *mi)
+{
+ blinkboxstruct *bp = &blinkbox[MI_SCREEN(mi)];
+
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i = 0;
+
+ if (! bp->glx_context)
+ return;
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ hit_top_bottom(bp);
+ hit_front_back(bp);
+ hit_side(bp);
+
+ glRotated(0.25,0,0,1);
+ glRotated(0.25,0,1,0);
+ glRotated(0.25,1,0,0);
+
+
+ glPushMatrix();
+ glScalef(0.5,0.5,0.5);
+
+ glColor3f(1,1,1);
+ glPushMatrix();
+
+ if (!do_blur || MI_IS_WIREFRAME(mi)) {
+ glTranslatef(bp->ball.x += bp->mo.x,
+ bp->ball.y += bp->mo.y,
+ bp->ball.z += bp->mo.z);
+
+ glScalef(2,2,2);
+ glCallList(bp->ballList);
+ mi->polygon_count += SPHERE_SLICES*SPHERE_STACKS;
+
+ } else {
+
+# define blur_detail 24.0
+ float ball_alpha = 1 / blur_detail;
+
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glTranslatef(bp->ball.x, bp->ball.y, bp->ball.z);
+
+ for (i = 0; i < blur_detail; ++i) {
+ glTranslatef(bp->mo.x / blur_detail,
+ bp->mo.y / blur_detail,
+ bp->mo.z / blur_detail);
+
+ /* comment the following line for quick but boring linear blur */
+ ball_alpha = sin((M_PI / blur_detail) * i) / blur_detail;
+
+ glColor4f(1, 1, 1, ball_alpha);
+
+ glScalef(2, 2, 2);
+ glCallList(bp->ballList);
+ mi->polygon_count += SPHERE_SLICES*SPHERE_STACKS;
+ glScalef(.5, .5, .5);
+ }
+ i = 0;
+
+ bp->ball.x += bp->mo.x;
+ bp->ball.y += bp->mo.y;
+ bp->ball.z += bp->mo.z;
+ }
+
+ glPopMatrix();
+
+ while(i < 6){
+ switch(i){
+ case 0:{
+ bp->sp = &bp->lside;
+ bp->bpos.x = bp->lside.pos.z*-1;
+ bp->bpos.y = bp->lside.pos.y;
+ bp->bpos.z = bbox.bottom.x - bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
+ break;
+ }
+ case 1:{
+ bp->sp = &bp->rside;
+ bp->bpos.x = bp->rside.pos.z*-1;
+ bp->bpos.y = bp->rside.pos.y;
+ bp->bpos.z = bbox.top.x + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
+ break;
+ }
+ case 2:{
+ bp->sp = &bp->tside;
+ bp->bpos.x = bp->tside.pos.x;
+ bp->bpos.y = bp->tside.pos.z;
+ bp->bpos.z = bbox.bottom.y - bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
+ break;
+ }
+ case 3:{
+ bp->sp = &bp->bside;
+ bp->bpos.x = bp->bside.pos.x;
+ bp->bpos.y = bp->bside.pos.z;
+ bp->bpos.z = bbox.top.y + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
+ break;
+ }
+ case 4:{
+ bp->sp = &bp->fside;
+ bp->bpos.x = bp->fside.pos.y;
+ bp->bpos.y = bp->fside.pos.x*-1;
+ bp->bpos.z = bbox.top.z + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
+ break;
+ }
+ case 5:{
+ bp->sp = &bp->aside;
+ bp->bpos.x = bp->aside.pos.y;
+ bp->bpos.y = bp->aside.pos.x*-1;
+ bp->bpos.z = bbox.bottom.z + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
+ break;
+ }
+ }
+ if(bp->sp->hit){
+ if(do_fade){
+ glColor4f(bp->sp->color[0],bp->sp->color[1],bp->sp->color[2],1-(ALPHA_AMT * bp->sp->alpha_count));
+ }else{
+ glColor3fv(bp->sp->color);
+ }
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glPushMatrix();
+ glRotatef(bp->sp->rot[0],bp->sp->rot[1],bp->sp->rot[2],bp->sp->rot[3]);
+ glTranslatef(bp->bpos.x,bp->bpos.y,bp->bpos.z);
+ if (do_dissolve) {
+ glScalef(bp->bscale.wh-(bp->des_amt*bp->sp->des_count),bp->bscale.wh-(bp->des_amt*bp->sp->des_count),bp->bscale.d);
+ }else{
+ glScalef(bp->bscale.wh,bp->bscale.wh,bp->bscale.d);
+ }
+ glCallList(bp->boxList);
+ mi->polygon_count += 6;
+ glPopMatrix();
+ bp->sp->counter--;
+ bp->sp->des_count++;
+ bp->sp->alpha_count++;
+ if(!bp->sp->counter)
+ {
+ bp->sp->hit = 0;
+ }
+ }
+ i++;
+ }
+
+
+ glPopMatrix();
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+
+}
+
+XSCREENSAVER_MODULE_2 ("BlinkBox", blinkbox, ball)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/blinkbox.man b/hacks/glx/blinkbox.man
new file mode 100644
index 0000000..0dc2a3f
--- /dev/null
+++ b/hacks/glx/blinkbox.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blinkbox \- shows a ball inside a box.
+.SH SYNOPSIS
+.B blinkbox
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-boxsize \fInumber\fP]
+[\-dissolve]
+[\-fade]
+[\-no\-blur]
+[\-fps]
+.SH DESCRIPTION
+Shows a ball contained inside of a bounding box. Colored blocks blink in
+when the ball hits the edges.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-boxsize
+Sets the size of the colored boxes. Should be between 1 and 8. Default: 2
+.TP 8
+.B \-dissolve | \-no-dissolve
+Boxes shrink instead of just vanishing.
+.TP 8
+.B \-fade | \-no-fade
+Boxes fade to transparency instead of just vanishing.
+.TP 8
+.B \-blur | \-no-blur
+Enable or disable motion blur on the ball. Default: blurry.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jeremy English. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jeremy English. Motion blur by John Boero.
diff --git a/hacks/glx/blocktube.c b/hacks/glx/blocktube.c
new file mode 100644
index 0000000..d4a402e
--- /dev/null
+++ b/hacks/glx/blocktube.c
@@ -0,0 +1,457 @@
+/* blocktube, Copyright (c) 2003 Lars Damerow <lars@oddment.org>
+ *
+ * Based on Jamie Zawinski's original dangerball code.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEBUG 1
+
+#define DEFAULTS "*delay: 40000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_blocktube 0
+# define blocktube_handle_event xlockmore_no_events
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include <math.h>
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_HOLDTIME "1000"
+#define DEF_CHANGETIME "200"
+#define MAX_ENTITIES 1000
+#define DEF_TEXTURE "True"
+#define DEF_FOG "True"
+
+#if defined(USE_XPM) || defined(USE_XPMINC) || defined(STANDALONE)
+/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
+#include "ximage-loader.h"
+#define I_HAVE_XPM
+
+#include "images/gen/blocktube_png.h"
+#endif /* HAVE_XPM */
+
+typedef struct {
+ int id, r, g, b;
+ GLfloat tVal;
+ int age;
+ int lifetime;
+ GLfloat position[3];
+ GLfloat angle;
+ GLfloat angularVelocity;
+} entity;
+
+typedef struct {
+ GLXContext *glx_context;
+ GLuint block_dlist;
+ int nextID;
+
+ entity entities[MAX_ENTITIES];
+ float targetR, targetG, targetB,
+ currentR, currentG, currentB,
+ deltaR, deltaG, deltaB;
+ int counter;
+ int changing;
+ GLfloat zoom;
+ GLfloat tilt;
+ GLuint envTexture;
+ XImage *texti;
+
+ GLfloat tunnelLength;
+ GLfloat tunnelWidth;
+ int polys;
+
+} blocktube_configuration;
+
+static blocktube_configuration *lps = NULL;
+
+static GLint holdtime;
+static GLint changetime;
+static int do_texture;
+static int do_fog;
+
+static XrmOptionDescRec opts[] = {
+ { "-holdtime", ".holdtime", XrmoptionSepArg, 0 },
+ { "-changetime", ".changetime", XrmoptionSepArg, 0 },
+ {"-texture", ".texture", XrmoptionNoArg, "True" },
+ {"+texture", ".texture", XrmoptionNoArg, "False" },
+ {"-fog", ".fog", XrmoptionNoArg, "True" },
+ {"+fog", ".fog", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&holdtime, "holdtime", "Hold Time", DEF_HOLDTIME, t_Int},
+ {&changetime, "changetime", "Change Time", DEF_CHANGETIME, \
+ t_Int},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+};
+
+static OptionStruct desc[] = {
+ {"-holdtime", "how long to stay on the same color"},
+ {"-changetime", "how long it takes to fade to a new color"},
+};
+
+ENTRYPOINT ModeSpecOpt blocktube_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct blocktube_description =
+ {"blocktube", "init_blocktube", "draw_blocktube", (char *)NULL,
+ "draw_blocktube", "init_blocktube", "free_blocktube", &blocktube_opts,
+ 40000, 30, 1, 1, 64, 1.0, "",
+ "A shifting tunnel of reflective blocks", 0, NULL};
+#endif /* USE_MODULES */
+
+#if defined( I_HAVE_XPM )
+static Bool LoadGLTextures(ModeInfo *mi)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ Bool status;
+
+ status = True;
+ glGenTextures(1, &lp->envTexture);
+ glBindTexture(GL_TEXTURE_2D, lp->envTexture);
+ lp->texti = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ blocktube_png, sizeof(blocktube_png));
+ if (!lp->texti) {
+ status = False;
+ } else {
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lp->texti->width, lp->texti->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, lp->texti->data);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+# ifndef HAVE_JWZGLES /* #### Sphere maps unimplemented */
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+# endif
+ }
+ return status;
+}
+#endif
+
+static void newTargetColor(blocktube_configuration *lp)
+{
+ int luminance = 0;
+
+ while (luminance <= 150) {
+ lp->targetR = random() % 256;
+ lp->targetG = random() % 256;
+ lp->targetB = random() % 256;
+ lp->deltaR = (lp->targetR - lp->currentR) / changetime;
+ lp->deltaG = (lp->targetG - lp->currentG) / changetime;
+ lp->deltaB = (lp->targetB - lp->currentB) / changetime;
+ luminance = 0.3 * lp->targetR + 0.59 * lp->targetG + 0.11 * lp->targetB;
+ }
+}
+
+static void randomize_entity (blocktube_configuration *lp, entity *ent)
+{
+ ent->id = lp->nextID++;
+ ent->tVal = 1 - ((float)random() / RAND_MAX / 1.5);
+ ent->age = 0;
+ ent->lifetime = 100;
+ ent->angle = random() % 360;
+ ent->angularVelocity = 0.5-((float)(random()) / RAND_MAX);
+ ent->position[0] = (float)(random()) / RAND_MAX + lp->tunnelWidth;
+ ent->position[1] = (float)(random()) / RAND_MAX * 2;
+ ent->position[2] = -(float)(random()) / RAND_MAX * lp->tunnelLength;
+}
+
+static void entityTick(blocktube_configuration *lp, entity *ent)
+{
+ ent->angle += ent->angularVelocity;
+ ent->position[2] += 0.1;
+ if (ent->position[2] > lp->zoom) {
+ ent->position[2] = -lp->tunnelLength + ((float)(random()) / RAND_MAX) * 20;
+ }
+ ent->age += 0.1;
+}
+
+static void tick(blocktube_configuration *lp)
+{
+ lp->counter--;
+ if (!lp->counter) {
+ if (!lp->changing) {
+ newTargetColor(lp);
+ lp->counter = changetime;
+ } else {
+ lp->counter = holdtime;
+ }
+ lp->changing = (!lp->changing);
+ } else {
+ if (lp->changing) {
+ lp->currentR += lp->deltaR;
+ lp->currentG += lp->deltaG;
+ lp->currentB += lp->deltaB;
+ }
+ }
+}
+
+static int cube_vertices(float x, float y, float z, int wire);
+
+ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height);
+
+ENTRYPOINT void init_blocktube (ModeInfo *mi)
+{
+ int loop;
+ GLfloat fogColor[4] = {0,0,0,1};
+ blocktube_configuration *lp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT(mi, lps);
+
+ lp = &lps[MI_SCREEN(mi)];
+ lp->glx_context = init_GL(mi);
+
+ lp->zoom = 30;
+ lp->tilt = 4.5;
+ lp->tunnelLength = 200;
+ lp->tunnelWidth = 5;
+
+ if (wire) {
+ do_fog = False;
+ do_texture = False;
+ glLineWidth(2);
+ }
+
+ lp->block_dlist = glGenLists (1);
+ glNewList (lp->block_dlist, GL_COMPILE);
+ lp->polys = cube_vertices(0.15, 1.2, 5.25, wire);
+ glEndList ();
+
+#if defined( I_HAVE_XPM )
+ if (do_texture) {
+ if (!LoadGLTextures(mi)) {
+ fprintf(stderr, "%s: can't load textures!\n", progname);
+ exit(1);
+ }
+ glEnable(GL_TEXTURE_2D);
+ }
+#endif
+
+ /* kick on the fog machine */
+ if (do_fog) {
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glHint(GL_FOG_HINT, GL_NICEST);
+ glFogf(GL_FOG_START, 0);
+ glFogf(GL_FOG_END, lp->tunnelLength/1.8);
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+ }
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glClearDepth(1.0f);
+
+ if (!do_texture && !wire) {
+ /* If there is no texture, the boxes don't show up without a light.
+ Though I don't understand why all the blocks come out gray.
+ */
+ GLfloat pos[4] = {0.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ }
+
+ lp->counter = holdtime;
+ lp->currentR = random() % 256;
+ lp->currentG = random() % 256;
+ lp->currentB = random() % 256;
+ newTargetColor(lp);
+ for (loop = 0; loop < MAX_ENTITIES; loop++)
+ {
+ randomize_entity(lp, &lp->entities[loop]);
+ }
+ reshape_blocktube(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glFlush();
+}
+
+ENTRYPOINT void free_blocktube (ModeInfo *mi)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+# if defined ( I_HAVE_XPM )
+ if (lp->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context));
+
+ if (lp->envTexture)
+ glDeleteTextures(1, &lp->envTexture);
+ if (lp->texti)
+ XDestroyImage(lp->texti);
+ }
+# endif
+}
+
+ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context));
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0, 1/h, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+}
+
+static int cube_vertices(float x, float y, float z, int wire)
+{
+ int polygon_count = 0;
+ float x2, y2, z2, nv = 0.7;
+ x2 = x/2;
+ y2 = y/2;
+ z2 = z/2;
+
+ glFrontFace(GL_CW);
+
+ glNormal3f(0, 0, nv);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(0, 0, -nv);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(1.0, 0.0); glVertex3f(-x2, -y2, -z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, -z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, -z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, -z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(0, nv, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, y2, -z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(0, -nv, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-x2, -y2, -z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f( x2, -y2, z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
+ polygon_count++;
+ glEnd();
+
+ if (wire) return polygon_count;
+
+ glNormal3f(nv, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(-nv, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0.0, 0.0); glVertex3f(-x2, -y2, -z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f(-x2, y2, -z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
+ polygon_count++;
+ glEnd();
+
+ return polygon_count;
+}
+
+static void draw_block(ModeInfo *mi, entity *ent)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ glCallList (lp->block_dlist);
+ mi->polygon_count += lp->polys;
+}
+
+ENTRYPOINT void
+draw_blocktube (ModeInfo *mi)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ entity *cEnt = NULL;
+ int loop = 0;
+
+ if (!lp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (do_texture) {
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glBindTexture(GL_TEXTURE_2D, lp->envTexture);
+ }
+
+ for (loop = 0; loop < MAX_ENTITIES; loop++) {
+ cEnt = &lp->entities[loop];
+
+ glLoadIdentity();
+ glTranslatef(0.0f, 0.0f, lp->zoom);
+ glRotatef(lp->tilt, 1.0f, 0.0f, 0.0f);
+ glRotatef(cEnt->angle, 0.0f, 0.0f, 1.0f);
+ glTranslatef(cEnt->position[0], cEnt->position[1], cEnt->position[2]);
+ glColor4ub((int)(lp->currentR * cEnt->tVal),
+ (int)(lp->currentG * cEnt->tVal),
+ (int)(lp->currentB * cEnt->tVal), 255);
+ draw_block(mi, cEnt);
+ entityTick(lp, cEnt);
+ }
+ tick(lp);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("BlockTube", blocktube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/blocktube.man b/hacks/glx/blocktube.man
new file mode 100644
index 0000000..5d016e0
--- /dev/null
+++ b/hacks/glx/blocktube.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blocktube - draws a swirling, falling tunnel of reflective slabs
+.SH SYNOPSIS
+.B blocktube
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-holdtime \fInumber\fP]
+[\-changetime \fInumber\fP]
+[\-no-texture]
+[\-no-fog]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Blocktube draws a swirling, falling tunnel of reflective slabs. They fade
+from hue to hue.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-holdtime \fInumber\fP
+How long to stay on the same color. Default: 1000 frames.
+.TP 8
+.B \-changetime \fInumber\fP
+How long it takes to fade to a new color. Default: 200 frames.
+.TP 8
+.B \-no-texture
+Draw solid blocks intstead of reflective blocks.
+.TP 8
+.B \-no-fog
+Do not make blocks in the distance be darker.
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Lars Damerow. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Lars Damerow <lars@oddment.org>
diff --git a/hacks/glx/boing.c b/hacks/glx/boing.c
new file mode 100644
index 0000000..55a05f3
--- /dev/null
+++ b/hacks/glx/boing.c
@@ -0,0 +1,658 @@
+/* boing, Copyright (c) 2005-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * A clone of the Amiga 1000 "Boing" demo. This was the first graphics demo
+ * for the Amiga, written by Dale Luck and RJ Mical during a break at the 1984
+ * Consumer Electronics Show (or so the legend goes.) The boing ball was
+ * briefly the official logo of Amiga Inc., until they were bought by
+ * Commodore later that year.
+ *
+ * With no arguments, this program looks a lot like the original Amiga demo.
+ * With "-smooth -lighting", it looks... less old.
+ *
+ * The amiga version made noise when the ball hit the walls. This version
+ * does not, obviously.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_boing 0
+# define release_boing 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_LIGHTING "False"
+#define DEF_SMOOTH "False"
+#define DEF_SCANLINES "True"
+#define DEF_SPEED "1.0"
+#define DEF_BALL_SIZE "0.5"
+#define DEF_ANGLE "15"
+#define DEF_MERIDIANS "16"
+#define DEF_PARALLELS "8"
+#define DEF_TILES "12"
+#define DEF_THICKNESS "0.05"
+
+#define DEF_BALL_COLOR1 "#CC1919"
+#define DEF_BALL_COLOR2 "#F2F2F2"
+#define DEF_GRID_COLOR "#991999"
+#define DEF_SHADOW_COLOR "#303030"
+#define DEF_BACKGROUND "#8C8C8C"
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat speed;
+
+ GLuint ball_list;
+ double ball_x, ball_y, ball_z, ball_th;
+ double ball_dx, ball_dy, ball_dz, ball_dth;
+ double ball_ddx, ball_ddy, ball_ddz;
+
+ GLfloat ball_color1[4], ball_color2[4], grid_color[4];
+ GLfloat bg_color[4], shadow_color[4];
+ GLfloat lightpos[4];
+
+} boing_configuration;
+
+static boing_configuration *bps = NULL;
+
+static Bool spin;
+static Bool lighting_p;
+static Bool smooth_p;
+static Bool scanlines_p;
+static GLfloat speed;
+static int angle;
+static GLfloat ball_size;
+static unsigned int meridians;
+static unsigned int parallels;
+static unsigned int tiles;
+static GLfloat thickness;
+static char *ball_color1_str, *ball_color2_str, *grid_color_str,
+ *shadow_str, *bg_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-lighting", ".lighting", XrmoptionNoArg, "True" },
+ { "+lighting", ".lighting", XrmoptionNoArg, "False" },
+ { "-smooth", ".smooth", XrmoptionNoArg, "True" },
+ { "+smooth", ".smooth", XrmoptionNoArg, "False" },
+ { "-scanlines", ".scanlines", XrmoptionNoArg, "True" },
+ { "+scanlines", ".scanlines", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-angle", ".angle", XrmoptionSepArg, 0 },
+ { "-size", ".ballSize", XrmoptionSepArg, 0 },
+ { "-meridians", ".meridians", XrmoptionSepArg, 0 },
+ { "-parallels", ".parallels", XrmoptionSepArg, 0 },
+ { "-tiles", ".tiles", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-ball-color1",".ballColor1",XrmoptionSepArg, 0 },
+ { "-ball-color2",".ballColor2",XrmoptionSepArg, 0 },
+ { "-grid-color", ".gridColor", XrmoptionSepArg, 0 },
+ { "-shadow-color",".shadowColor",XrmoptionSepArg, 0 },
+ { "-background", ".boingBackground",XrmoptionSepArg, 0 },
+ { "-bg", ".boingBackground",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&lighting_p,"lighting", "Lighting", DEF_LIGHTING, t_Bool},
+ {&smooth_p, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+ {&scanlines_p,"scanlines","Scanlines", DEF_SCANLINES, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&angle, "angle", "Angle", DEF_ANGLE, t_Int},
+ {&ball_size, "ballSize", "BallSize", DEF_BALL_SIZE, t_Float},
+ {&meridians, "meridians", "meridians", DEF_MERIDIANS, t_Int},
+ {&parallels, "parallels", "parallels", DEF_PARALLELS, t_Int},
+ {&tiles, "tiles", "Tiles", DEF_TILES, t_Int},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&ball_color1_str, "ballColor1", "BallColor1", DEF_BALL_COLOR1, t_String},
+ {&ball_color2_str, "ballColor2", "BallColor2", DEF_BALL_COLOR2, t_String},
+ {&grid_color_str, "gridColor", "GridColor", DEF_GRID_COLOR, t_String},
+ {&shadow_str, "shadowColor","ShadowColor",DEF_SHADOW_COLOR,t_String},
+ /* dammit, -background is too magic... */
+ {&bg_str, "boingBackground", "Background", DEF_BACKGROUND, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt boing_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+ a[3] = 1.0; /* alpha */
+
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+}
+
+
+static void
+draw_grid (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ int x, y;
+ GLfloat t2 = (GLfloat) tiles / 2;
+ GLfloat s = 1.0 / (tiles + thickness);
+ GLfloat z = 0;
+
+ GLfloat lw = MI_HEIGHT(mi) * 0.06 * thickness;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->grid_color);
+ glColor3fv (bp->grid_color);
+
+ glPushMatrix();
+ glScalef(s, s, s);
+ glTranslatef (-t2, -t2, 0);
+
+ glLineWidth (lw);
+ glBegin (GL_LINES);
+ for (y = 0; y <= tiles; y++)
+ {
+ glVertex3f (0, y, z);
+ glVertex3f (tiles, y, z);
+ /*mi->polygon_count++;*/
+ }
+ for (x = 0; x <= tiles; x++)
+ {
+ glVertex3f (x, tiles, z);
+ glVertex3f (x, 0, z);
+ /*mi->polygon_count++;*/
+ }
+
+ glEnd();
+ glPopMatrix();
+}
+
+
+static void
+draw_box (ModeInfo *mi)
+{
+ /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
+ glPushMatrix();
+ glTranslatef (0, 0, -0.5);
+/* glFrontFace (GL_CCW);*/
+ draw_grid (mi);
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0, 0, 0.5);
+/* glFrontFace (GL_CW);*/
+ draw_grid (mi);
+ glPopMatrix();
+}
+
+
+static void
+draw_ball (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int x, y;
+ int xx = meridians;
+ int yy = parallels;
+ int scale = (smooth_p ? 5 : 1);
+
+ if (lighting_p && !wire)
+ glEnable (GL_LIGHTING);
+
+ if (parallels < 3)
+ scale *= 2;
+
+ xx *= scale;
+ yy *= scale;
+
+ glFrontFace (GL_CW);
+
+ glPushMatrix();
+ glTranslatef (bp->ball_x, bp->ball_y, bp->ball_z);
+ glScalef (ball_size, ball_size, ball_size);
+ glRotatef (-angle, 0, 0, 1);
+ glRotatef (bp->ball_th, 0, 1, 0);
+
+ for (y = 0; y < yy; y++)
+ {
+ GLfloat thy0 = y * (M_PI * 2) / (yy * 2) + M_PI_2;
+ GLfloat thy1 = (y+1) * (M_PI * 2) / (yy * 2) + M_PI_2;
+
+ for (x = 0; x < xx; x++)
+ {
+ GLfloat thx0 = x * (M_PI * 2) / xx;
+ GLfloat thx1 = (x+1) * (M_PI * 2) / xx;
+ XYZ p;
+ Bool bgp = ((x/scale) & 1) ^ ((y/scale) & 1);
+
+ if (wire && bgp) continue;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ (bgp ? bp->ball_color2 : bp->ball_color1));
+ glColor3fv (bgp ? bp->ball_color2 : bp->ball_color1);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ if (!smooth_p)
+ {
+ p.x = cos((thy0+thy1)/2) * cos((thx0+thx1)/2);
+ p.y = sin((thy0+thy1)/2);
+ p.z = cos((thy0+thy1)/2) * sin((thx0+thx1)/2);
+ glNormal3f (-p.x, -p.y, -p.z);
+ }
+
+ p.x = cos(thy0) * cos(thx0) / 2;
+ p.y = sin(thy0) / 2;
+ p.z = cos(thy0) * sin(thx0) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ p.x = cos(thy1) * cos(thx0) / 2;
+ p.y = sin(thy1) / 2;
+ p.z = cos(thy1) * sin(thx0) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ p.x = cos(thy1) * cos(thx1) / 2;
+ p.y = sin(thy1) / 2;
+ p.z = cos(thy1) * sin(thx1) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ p.x = cos(thy0) * cos(thx1) / 2;
+ p.y = sin(thy0) / 2;
+ p.z = cos(thy0) * sin(thx1) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ glEnd ();
+ mi->polygon_count++;
+ }
+ }
+
+ glPopMatrix();
+
+ if (lighting_p && !wire)
+ glDisable(GL_LIGHTING);
+}
+
+
+static void
+draw_shadow (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat xoff = 0.14;
+ GLfloat yoff = 0.07;
+ int y;
+ int yy = parallels;
+ int scale = (smooth_p ? 5 : 1);
+
+ if (lighting_p && !wire)
+ glEnable (GL_BLEND);
+
+ if (parallels < 3)
+ scale *= 2;
+
+ yy *= scale;
+
+ glPushMatrix();
+ glTranslatef (bp->ball_x + xoff, bp->ball_y + yoff, -0.49);
+ glScalef (ball_size, ball_size, ball_size);
+ glRotatef (-angle, 0, 0, 1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->shadow_color);
+ glColor4fv (bp->shadow_color);
+
+ glFrontFace (GL_CCW);
+ glNormal3f (0, 0, 1);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ if (!wire) glVertex3f (0, 0, 0);
+
+ for (y = 0; y < yy*2+1; y++)
+ {
+ GLfloat thy0 = y * (M_PI * 2) / (yy * 2) + M_PI_2;
+ glVertex3f (cos(thy0) / 2, sin(thy0) / 2, 0);
+ mi->polygon_count++;
+ }
+
+ glEnd ();
+
+ glPopMatrix();
+
+ if (lighting_p && !wire)
+ glDisable (GL_BLEND);
+}
+
+
+static void
+draw_scanlines (ModeInfo *mi)
+{
+ /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
+ int wire = MI_IS_WIREFRAME(mi);
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+
+ if (h <= 300) return;
+
+ if (!wire)
+ {
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ {
+ int lh, ls;
+ int y;
+ glLoadIdentity();
+ glOrtho (0, w, 0, h, -1, 1);
+
+ if (h > 500) lh = 4, ls = 4;
+ else if (h > 300) lh = 2, ls = 1;
+ else lh = 1, ls = 1;
+
+ if (lh == 1)
+ glDisable (GL_BLEND);
+
+ glLineWidth (lh);
+ glColor4f (0, 0, 0, 0.3);
+
+ glBegin(GL_LINES);
+ for (y = 0; y < h; y += lh + ls)
+ {
+ glVertex3f (0, y, 0);
+ glVertex3f (w, y, 0);
+ }
+ glEnd();
+ }
+ glPopMatrix();
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ if (!wire)
+ {
+ glDisable (GL_BLEND);
+ glEnable (GL_DEPTH_TEST);
+ }
+}
+
+
+
+static void
+tick_physics (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat s2 = ball_size / 2;
+ GLfloat max = 0.5 - s2;
+ GLfloat min = -max;
+
+ bp->ball_th += bp->ball_dth;
+ while (bp->ball_th > 360) bp->ball_th -= 360;
+ while (bp->ball_th < 0) bp->ball_th += 360;
+
+ bp->ball_dx += bp->ball_ddx;
+ bp->ball_x += bp->ball_dx;
+ if (bp->ball_x < min) bp->ball_x = min, bp->ball_dx = -bp->ball_dx,
+ bp->ball_dth = -bp->ball_dth,
+ bp->ball_dx += (frand(bp->speed/2) - bp->speed);
+ else if (bp->ball_x > max) bp->ball_x = max, bp->ball_dx = -bp->ball_dx,
+ bp->ball_dth = -bp->ball_dth,
+ bp->ball_dx += (frand(bp->speed/2) - bp->speed);
+
+ bp->ball_dy += bp->ball_ddy;
+ bp->ball_y += bp->ball_dy;
+ if (bp->ball_y < min) bp->ball_y = min, bp->ball_dy = -bp->ball_dy;
+ else if (bp->ball_y > max) bp->ball_y = max, bp->ball_dy = -bp->ball_dy;
+
+ bp->ball_dz += bp->ball_ddz;
+ bp->ball_z += bp->ball_dz;
+ if (bp->ball_z < min) bp->ball_z = min, bp->ball_dz = -bp->ball_dz;
+ else if (bp->ball_z > max) bp->ball_z = max, bp->ball_dz = -bp->ball_dz;
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_boing (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ h *= 4.0 / 3.0; /* Back in the caveman days we couldn't even afford
+ square pixels! */
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 3/4;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ if (height > width)
+ {
+ GLfloat s = width / (GLfloat) height;
+ glScalef (s, s, s);
+ }
+
+ gluPerspective (8.0, 1/h, 1.0, 10.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt (0.0, 0.0, 8.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+boing_handle_event (ModeInfo *mi, XEvent *event)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_boing (ModeInfo *mi)
+{
+ boing_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (tiles < 1) tiles = 1;
+
+ if (smooth_p)
+ {
+ if (meridians < 1) meridians = 1;
+ if (parallels < 1) parallels = 1;
+ }
+ else
+ {
+ if (meridians < 3) meridians = 3;
+ if (parallels < 2) parallels = 2;
+ }
+
+ if (meridians > 1 && meridians & 1) meridians++; /* odd numbers look bad */
+
+
+ if (thickness <= 0) thickness = 0.001;
+ else if (thickness > 1) thickness = 1;
+
+ reshape_boing (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ parse_color (mi, "ballColor1", ball_color1_str, bp->ball_color1);
+ parse_color (mi, "ballColor2", ball_color2_str, bp->ball_color2);
+ parse_color (mi, "gridColor", grid_color_str, bp->grid_color);
+ parse_color (mi, "shadowColor", shadow_str, bp->shadow_color);
+ parse_color (mi, "background", bg_str, bp->bg_color);
+
+ bp->shadow_color[3] = 0.9;
+
+ glClearColor (bp->bg_color[0], bp->bg_color[1], bp->bg_color[2], 1);
+
+ if (!wire)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ }
+
+ bp->lightpos[0] = 0.5;
+ bp->lightpos[1] = 0.5;
+ bp->lightpos[2] = -1;
+ bp->lightpos[3] = 0;
+
+ if (lighting_p && !wire)
+ {
+ GLfloat amb[4] = {0, 0, 0, 1};
+ GLfloat dif[4] = {1, 1, 1, 1};
+ GLfloat spc[4] = {1, 1, 1, 1};
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ bp->speed = speed / 800.0;
+
+ bp->ball_dth = (spin ? -bp->speed * 7 * 360 : 0);
+
+ bp->ball_x = 0.5 - ((ball_size/2) + frand(1-ball_size));
+ bp->ball_y = 0.2;
+ bp->ball_dx = bp->speed * 6 + frand(bp->speed);
+ bp->ball_ddy = -bp->speed;
+
+ bp->ball_dz = bp->speed * 6 + frand(bp->speed);
+
+ bp->trackball = gltrackball_init (False);
+}
+
+
+ENTRYPOINT void
+draw_boing (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ mi->polygon_count = 0;
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_NORMALIZE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (! bp->button_down_p)
+ tick_physics (mi);
+
+ glPushMatrix ();
+
+ {
+ double rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+/*
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (1/s, s, 1);
+ }
+*/
+ }
+
+ gltrackball_rotate (bp->trackball);
+
+ glLightfv (GL_LIGHT0, GL_POSITION, bp->lightpos);
+
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_DEPTH_TEST);
+
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+
+ draw_box (mi);
+ draw_shadow (mi);
+
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_DEPTH_TEST);
+
+ draw_ball (mi);
+ if (scanlines_p)
+ draw_scanlines (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Boing", boing)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/boing.man b/hacks/glx/boing.man
new file mode 100644
index 0000000..1f00d72
--- /dev/null
+++ b/hacks/glx/boing.man
@@ -0,0 +1,105 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+boing - draws a bouncing ball like the ancient Amiga demo
+.SH SYNOPSIS
+.B boing
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-smooth]
+[\-lighting]
+[\-scanlines]
+[\-speed]
+[\-no\-spin]
+[\-angle \fIdegrees\fP]
+[\-size \fIratio\fP]
+[\-parallels \fIn\fP]
+[\-meridians \fIn\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIboing\fP program draws a bouncing checkered ball on a grid.
+
+This is a clone of the first graphics demo for the Amiga 1000, which
+was written by Dale Luck and RJ Mical during a break at the 1984
+Consumer Electronics Show (or so the legend goes.) The boing ball was
+briefly the official logo of Amiga Inc., until they were bought by
+Commodore later that year.
+
+With no arguments, this program looks a lot like the original Amiga
+demo. With "-smooth -lighting", it looks... less old.
+.SH OPTIONS
+.I boing
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds: default 15000.
+.TP 8
+.B \-smooth
+Draw a smooth sphere instead of a faceted polyhedron.
+.TP 8
+.B \-lighting
+Do shaded lighting instead of flat colors.
+.TP 8
+.B \-scanlines
+If the window is large enough, draw horizontal lines to simulate the
+scanlines on a low resolution monitor.
+.TP 8
+.B \-speed \fIratio\fP
+Change the animation speed; 0.5 to go half as fast, 2.0 to go twice as fast.
+.TP 8
+.B \-no\-spin
+Don't rotate the ball.
+.TP 8
+.B \-angle \fIdegrees\fP
+The jaunty angle at which the ball sits. Default 15 degrees.
+.TP 8
+.B \-size \fIratio\fP
+How big the ball is; default 0.5 meaning about half the size of the window.
+.TP 8
+.B \-parallels \fIn\fP
+.B \-meridians \fIn\fP
+The pattern of rectangles on the ball. Default 8x16.
+.TP 8
+.B \-wireframe
+Look crummy.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR bsod (MANSUFFIX),
+.BR pong (MANSUFFIX),
+.BR xscreensaver (1),
+.BR X (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 19-Feb-2005.
diff --git a/hacks/glx/bouncingcow.c b/hacks/glx/bouncingcow.c
new file mode 100644
index 0000000..6f9b45d
--- /dev/null
+++ b/hacks/glx/bouncingcow.c
@@ -0,0 +1,519 @@
+/* bouncingcow, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Boing, boing, boing. Cow, cow, cow.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 1 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_cow 0
+# define release_cow 0
+#define DEF_SPEED "1.0"
+#define DEF_TEXTURE "(none)"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern struct gllist
+ *cow_face, *cow_hide, *cow_hoofs, *cow_horns, *cow_tail, *cow_udder;
+
+static struct gllist **all_objs[] = {
+ &cow_face, &cow_hide, &cow_hoofs, &cow_horns, &cow_tail, &cow_udder
+};
+
+#define FACE 0
+#define HIDE 1
+#define HOOFS 2
+#define HORNS 3
+#define TAIL 4
+#define UDDER 5
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat ix, iy, iz;
+ GLfloat dx, dy, dz;
+ GLfloat ddx, ddy, ddz;
+ rotator *rot;
+ Bool spinner_p;
+} floater;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint *dlists;
+ GLuint texture;
+
+ int nfloaters;
+ floater *floaters;
+
+} cow_configuration;
+
+static cow_configuration *bps = NULL;
+
+static GLfloat speed;
+static const char *do_texture;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ {"-texture", ".texture", XrmoptionSepArg, 0 },
+ {"+texture", ".texture", XrmoptionNoArg, "(none)" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt cow_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+#define BOTTOM 28.0
+
+static void
+reset_floater (ModeInfo *mi, floater *f)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ f->y = -BOTTOM;
+ f->x = f->ix;
+ f->z = f->iz;
+
+ /* Yes, I know I'm varying the force of gravity instead of varying the
+ launch velocity. That's intentional: empirical studies indicate
+ that it's way, way funnier that way. */
+
+ f->dy = 5.0;
+ f->dx = 0;
+ f->dz = 0;
+
+ /* -0.18 max -0.3 top -0.4 middle -0.6 bottom */
+ f->ddy = speed * (-0.6 + BELLRAND(0.45));
+ f->ddx = 0;
+ f->ddz = 0;
+
+ f->spinner_p = !(random() % (12 * bp->nfloaters));
+
+ if (! (random() % (30 * bp->nfloaters)))
+ {
+ f->dx = BELLRAND(1.8) * RANDSIGN();
+ f->dz = BELLRAND(1.8) * RANDSIGN();
+ }
+}
+
+
+static void
+tick_floater (ModeInfo *mi, floater *f)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->button_down_p) return;
+
+ f->dx += f->ddx;
+ f->dy += f->ddy;
+ f->dz += f->ddz;
+
+ f->x += f->dx * speed;
+ f->y += f->dy * speed;
+ f->z += f->dz * speed;
+
+ if (f->y < -BOTTOM ||
+ f->x < -BOTTOM*8 || f->x > BOTTOM*8 ||
+ f->z < -BOTTOM*8 || f->z > BOTTOM*8)
+ reset_floater (mi, f);
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cow (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cow_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+/* Textures
+ */
+
+static Bool
+load_texture (ModeInfo *mi, const char *filename)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+ XImage *image;
+
+ if (MI_IS_WIREFRAME(mi))
+ return False;
+
+ if (!filename ||
+ !*filename ||
+ !strcasecmp (filename, "(none)"))
+ {
+ glDisable (GL_TEXTURE_2D);
+ return False;
+ }
+
+ image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+ clear_gl_error();
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei (GL_UNPACK_ROW_LENGTH, image->width);
+
+ return True;
+}
+
+
+ENTRYPOINT void
+init_cow (ModeInfo *mi)
+{
+ cow_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ Bool tex_p = False;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ bp->trackball = gltrackball_init (False);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ tex_p = load_texture (mi, do_texture);
+ if (tex_p)
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ GLfloat black[4] = {0, 0, 0, 1};
+ const struct gllist *gll = *all_objs[i];
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glDisable (GL_TEXTURE_2D);
+
+ if (i == HIDE)
+ {
+ GLfloat color[4] = {0.63, 0.43, 0.36, 1.00};
+ if (tex_p)
+ {
+ /* if we have a texture, make the base color be white. */
+ color[0] = color[1] = color[2] = 1.0;
+
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_2D);
+
+ /* approximately line it up with ../images/earth.png */
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity();
+ glTranslatef (0.45, 0.58, 0);
+ glScalef (0.08, 0.16, 1);
+ glRotatef (-5, 0, 0, 1);
+ glMatrixMode (GL_MODELVIEW);
+ }
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
+ }
+ else if (i == TAIL)
+ {
+ GLfloat color[4] = {0.63, 0.43, 0.36, 1.00};
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
+ }
+ else if (i == UDDER)
+ {
+ GLfloat color[4] = {1.00, 0.53, 0.53, 1.00};
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
+ }
+ else if (i == HOOFS || i == HORNS)
+ {
+ GLfloat color[4] = {0.20, 0.20, 0.20, 1.00};
+ GLfloat spec[4] = {0.30, 0.30, 0.30, 1.00};
+ GLfloat shiny = 8.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == FACE)
+ {
+ GLfloat color[4] = {0.10, 0.10, 0.10, 1.00};
+ GLfloat spec[4] = {0.10, 0.10, 0.10, 1.00};
+ GLfloat shiny = 8.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else
+ {
+ GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat shiny = 128.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+
+ renderList (gll, wire);
+
+ glEndList ();
+ }
+
+ bp->nfloaters = MI_COUNT (mi);
+ bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ f->rot = make_rotator (10.0, 0, 0,
+ 4, 0.05 * speed,
+ True);
+ if (bp->nfloaters == 2)
+ {
+ f->x = (i ? 6 : -6);
+ }
+ else if (i != 0)
+ {
+ double th = (i - 1) * M_PI*2 / (bp->nfloaters-1);
+ double r = 10;
+ f->x = r * cos(th);
+ f->z = r * sin(th);
+ }
+
+ f->ix = f->x;
+ f->iy = f->y;
+ f->iz = f->z;
+ reset_floater (mi, f);
+ }
+}
+
+
+static void
+draw_floater (ModeInfo *mi, floater *f)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat n;
+ double x, y, z;
+
+ get_position (f->rot, &x, &y, &z, !bp->button_down_p);
+
+ glPushMatrix();
+ glTranslatef (f->x, f->y, f->z);
+
+ gltrackball_rotate (bp->trackball);
+
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ if (f->spinner_p)
+ {
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ n = 1.5;
+ if (bp->nfloaters > 99) n *= 0.05;
+ else if (bp->nfloaters > 25) n *= 0.18;
+ else if (bp->nfloaters > 9) n *= 0.3;
+ else if (bp->nfloaters > 1) n *= 0.7;
+ glScalef(n, n, n);
+
+ glCallList (bp->dlists[FACE]);
+ mi->polygon_count += (*all_objs[FACE])->points / 3;
+
+ glCallList (bp->dlists[HIDE]);
+ mi->polygon_count += (*all_objs[HIDE])->points / 3;
+
+ glCallList (bp->dlists[HOOFS]);
+ mi->polygon_count += (*all_objs[HOOFS])->points / 3;
+
+ glCallList (bp->dlists[HORNS]);
+ mi->polygon_count += (*all_objs[HORNS])->points / 3;
+
+ glCallList (bp->dlists[TAIL]);
+ mi->polygon_count += (*all_objs[TAIL])->points / 3;
+
+ glCallList (bp->dlists[UDDER]);
+ mi->polygon_count += (*all_objs[UDDER])->points / 3;
+
+ glPopMatrix();
+}
+
+
+
+ENTRYPOINT void
+draw_cow (ModeInfo *mi)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ glScalef (0.5, 0.5, 0.5);
+
+ mi->polygon_count = 0;
+
+# if 0
+ {
+ floater F;
+ F.x = F.y = F.z = 0;
+ F.dx = F.dy = F.dz = 0;
+ F.ddx = F.ddy = F.ddz = 0;
+ F.rot = make_rotator (0, 0, 0, 1, 0, False);
+ glScalef(2,2,2);
+ draw_floater (mi, &F);
+ }
+# else
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ /* "Don't kid yourself, Jimmy. If a cow ever got the chance,
+ he'd eat you and everyone you care about!"
+ -- Troy McClure in "Meat and You: Partners in Freedom"
+ */
+ floater *f = &bp->floaters[i];
+ draw_floater (mi, f);
+ tick_floater (mi, f);
+ }
+# endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("BouncingCow", bouncingcow, cow)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/bouncingcow.man b/hacks/glx/bouncingcow.man
new file mode 100644
index 0000000..516d1de
--- /dev/null
+++ b/hacks/glx/bouncingcow.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+bouncingcow - a happy cow on a trampoline in 3D. Moo.
+.SH SYNOPSIS
+.B bouncingcow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-texture \fIfilename\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+It's very silly.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the cow bounces. Larger for faster. Default: 1.0.
+.TP 8
+.B \-count \fInumber\fP
+How many cows! Default 1.
+.TP 8
+.B \-texture \fIfilename\fP
+An image file to paint on the cow's hide.
+
+Note that on most systems, GL textures must have dimensions that are a
+power of two.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Moo. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+Moo. No representations are made about the suitability of this
+software for any purpose. It is provided "as is" without express or
+implied warranty. Moo.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
+
diff --git a/hacks/glx/boxed.c b/hacks/glx/boxed.c
new file mode 100644
index 0000000..136d468
--- /dev/null
+++ b/hacks/glx/boxed.c
@@ -0,0 +1,1370 @@
+/* boxed --- 3D bouncing balls that explode */
+
+#if 0
+static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ *
+ * 2001: Written by Sander van Grieken <mailsander@gmx.net>
+ * as an OpenGL screensaver for the xscreensaver package.
+ * Lots of hardcoded values still in place. Also, there are some
+ * copy/paste leftovers from the gears hack. opts don't work.
+ *
+ * 2005: opts work. added options -balls, -ballsize, -explosion
+ *
+ * 2006: opts work. added option -decay
+ *
+ * 2008: opts work. added option -momentum
+ *
+ */
+
+#include "boxed.h"
+
+/*
+**----------------------------------------------------------------------------
+** Defines
+**----------------------------------------------------------------------------
+*/
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 15000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define release_boxed 0
+# define boxed_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+# define DEF_SPEED "0.5"
+# define DEF_BALLS "20"
+# define DEF_BALLSIZE "3.0"
+# define DEF_EXPLOSION "15.0"
+# define DEF_DECAY "0.07"
+# define DEF_MOMENTUM "0.6"
+
+#undef countof
+#define countof(x) (int)(sizeof((x))/sizeof((*x)))
+#undef rnd
+#define rnd() (frand(1.0))
+
+static GLfloat speed; /* jwz -- overall speed factor applied to all motion */
+static int cfg_balls;
+static GLfloat cfg_ballsize;
+static GLfloat cfg_explosion;
+static GLfloat cfg_decay;
+static GLfloat cfg_momentum;
+
+
+static XrmOptionDescRec opts[] = {
+ {"-speed", ".boxed.speed", XrmoptionSepArg, 0},
+ {"-balls", ".boxed.balls", XrmoptionSepArg, 0},
+ {"-ballsize", ".boxed.ballsize", XrmoptionSepArg, 0},
+ {"-explosion", ".boxed.explosion", XrmoptionSepArg, 0},
+ {"-decay", ".boxed.decay", XrmoptionSepArg, 0},
+ {"-momentum", ".boxed.momentum", XrmoptionSepArg, 0},
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&cfg_balls, "balls", "Balls", DEF_BALLS, t_Int},
+ {&cfg_ballsize, "ballsize", "Ball Size", DEF_BALLSIZE, t_Float},
+ {&cfg_explosion, "explosion", "Explosion", DEF_EXPLOSION, t_Float},
+ {&cfg_decay, "decay", "Explosion Decay", DEF_DECAY, t_Float},
+ {&cfg_momentum, "momentum", "Explosion Momentum", DEF_MOMENTUM, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt boxed_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+
+ModStruct boxed_description = {
+ "boxed", "init_boxed", "draw_boxed", NULL,
+ "draw_boxed", "init_boxed", "free_boxed", &boxed_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Shows GL's boxed balls", 0, NULL};
+
+#endif
+
+#define BOOL int
+#define TRUE 1
+#define FALSE 0
+
+/* camera */
+#define CAM_HEIGHT 80.0f
+#define CAMDISTANCE_MIN 35.0
+#define CAMDISTANCE_MAX 150.0
+#define CAMDISTANCE_SPEED 1.5
+#define LOOKAT_R 30.0
+
+/* rendering the sphere */
+#define MESH_SIZE 10
+#define SPHERE_VERTICES (2+MESH_SIZE*MESH_SIZE*2)
+#define SPHERE_INDICES ((MESH_SIZE*4 + MESH_SIZE*4*(MESH_SIZE-1))*3)
+
+/*
+**-----------------------------------------------------------------------------
+** Typedefs
+**-----------------------------------------------------------------------------
+*/
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+} vectorf;
+
+typedef struct {
+ vectorf loc;
+ vectorf dir;
+ vectorf color;
+ float radius;
+ BOOL bounced;
+ int offside;
+ BOOL justcreated;
+} ball;
+
+typedef struct {
+ int num_balls;
+ float ballsize;
+ float explosion;
+ ball *balls;
+} ballman;
+
+typedef struct {
+ vectorf loc;
+ vectorf dir;
+ BOOL far;
+ int gone;
+} tri;
+
+typedef struct {
+ int num_tri;
+ int lifetime;
+ float scalefac;
+ float explosion;
+ float decay;
+ float momentum;
+ vectorf color;
+ tri *tris;
+ GLint *indices;
+ vectorf *normals;
+ vectorf *vertices;
+} triman;
+
+typedef struct {
+ int numballs;
+ float ballsize;
+ float explosion;
+ float decay;
+ float momentum;
+ BOOL textures;
+ BOOL transparent;
+ float camspeed;
+} boxed_config;
+
+
+typedef struct {
+ float cam_x_speed, cam_z_speed, cam_y_speed;
+ boxed_config config;
+ float tic;
+ float camtic;
+ vectorf spherev[SPHERE_VERTICES];
+ GLint spherei[SPHERE_INDICES];
+ ballman bman;
+ triman *tman;
+ GLXContext *glx_context;
+ GLuint listobjects;
+ GLuint gllists[3];
+ int list_polys[3];
+ Window window;
+ BOOL stop;
+ char *tex1;
+} boxedstruct;
+
+#define GLL_PATTERN 0
+#define GLL_BALL 1
+#define GLL_BOX 2
+
+/*
+**----------------------------------------------------------------------------
+** Local Variables
+**----------------------------------------------------------------------------
+*/
+
+static boxedstruct *boxed = NULL;
+
+
+/*
+**----------------------------------------------------------------------------
+** Functions
+**----------------------------------------------------------------------------
+*/
+
+/*
+ * Add 2 vectors
+ */
+static inline void addvectors(vectorf *dest, vectorf *s1, vectorf *s2)
+{
+ dest->x = s1->x + s2->x;
+ dest->y = s1->y + s2->y;
+ dest->z = s1->z + s2->z;
+}
+
+/*
+ * Sub 2 vectors
+ */
+static inline void subvectors(vectorf *dest, vectorf* s1, vectorf *s2)
+{
+ dest->x = s1->x - s2->x;
+ dest->y = s1->y - s2->y;
+ dest->z = s1->z - s2->z;
+}
+
+/*
+ * Multiply vector with scalar (scale vector)
+ */
+static inline void scalevector(vectorf *dest, vectorf *source, GLfloat sc)
+{
+ dest->x = source->x * sc;
+ dest->y = source->y * sc;
+ dest->z = source->z * sc;
+}
+
+/*
+ * Copy vector
+ */
+static inline void copyvector(vectorf *dest, vectorf* source)
+{
+ dest->x = source->x;
+ dest->y = source->y;
+ dest->z = source->z;
+}
+
+
+static inline GLfloat
+dotproduct(vectorf * v1, vectorf * v2)
+{
+ return v1->x * v2->x + v1->y * v2->y + v1->z * v2->z;
+}
+
+static inline GLfloat
+squaremagnitude(vectorf * v)
+{
+ return v->x * v->x + v->y * v->y + v->z * v->z;
+}
+
+static inline GLfloat
+squaremagnitudehorz(vectorf * v)
+{
+ return v->x * v->x + v->z * v->z;
+}
+
+
+
+/*
+ * Generate the Sphere data
+ *
+ * Input:
+ */
+
+static void generatesphere(boxedstruct *gp)
+{
+ float dj = M_PI/(MESH_SIZE+1.0f);
+ float di = M_PI/MESH_SIZE;
+ int v; /* vertex offset */
+ int ind; /* indices offset */
+ int i,j,si;
+ GLfloat r_y_plane, h_y_plane;
+ vectorf *spherev;
+ GLint *spherei;
+
+ /*
+ * generate the sphere data
+ * vertices 0 and 1 are the north and south poles
+ */
+
+ spherei = gp->spherei;
+ spherev = gp->spherev;
+
+ spherev[0].x = 0.0f; spherev[0].y =1.0f; spherev[0].z = 0.0f;
+ spherev[1].x = 0.0f; spherev[1].y =-1.0f; spherev[1].z = 0.0f;
+
+ for (j=0; j<MESH_SIZE; j++) {
+ r_y_plane = (float)sin((j+1) * dj);
+ h_y_plane = (float)cos((j+1) * dj);
+ for (i=0; i<MESH_SIZE*2; i++) {
+ si = 2+i+j*MESH_SIZE*2;
+ spherev[si].y = h_y_plane;
+ spherev[si].x = (float) sin(i * di) * r_y_plane;
+ spherev[si].z = (float) cos(i * di) * r_y_plane;
+ }
+ }
+
+ /* generate indices */
+ for (i=0; i<MESH_SIZE*2; i++) {
+ spherei[3*i] = 0;
+ spherei[3*i+1] = i+2;
+ spherei[3*i+2] = i+3;
+ if (i==MESH_SIZE*2-1)
+ spherei[3*i+2] = 2;
+ }
+
+ /* the middle strips */
+ for (j=0; j<MESH_SIZE-1; j++) {
+ v = 2+j*MESH_SIZE*2;
+ ind = 3*MESH_SIZE*2 + j*6*MESH_SIZE*2;
+ for (i=0; i<MESH_SIZE*2; i++) {
+ spherei[6*i+ind] = v+i;
+ spherei[6*i+2+ind] = v+i+1;
+ spherei[6*i+1+ind] = v+i+MESH_SIZE*2;
+
+ spherei[6*i+ind+3] = v+i+MESH_SIZE*2;
+ spherei[6*i+2+ind+3] = v+i+1;
+ spherei[6*i+1+ind+3] = v+i+MESH_SIZE*2+1;
+ if (i==MESH_SIZE*2-1) {
+ spherei[6*i+2+ind] = v+i+1-2*MESH_SIZE;
+ spherei[6*i+2+ind+3] = v+i+1-2*MESH_SIZE;
+ spherei[6*i+1+ind+3] = v+i+MESH_SIZE*2+1-2*MESH_SIZE;
+ }
+ }
+ }
+
+ v = SPHERE_VERTICES-MESH_SIZE*2;
+ ind = SPHERE_INDICES-3*MESH_SIZE*2;
+ for (i=0; i<MESH_SIZE*2; i++) {
+ spherei[3*i+ind] = 1;
+ spherei[3*i+1+ind] = v+i+1;
+ spherei[3*i+2+ind] = v+i;
+ if (i==MESH_SIZE*2-1)
+ spherei[3*i+1+ind] = v;
+ }
+}
+
+
+
+
+/*
+ * create fresh ball
+ */
+
+static void createball(ball *newball)
+{
+ float r=0.0f,g=0.0f,b=0.0f;
+ newball->loc.x = 5-10*rnd();
+ newball->loc.y = 35+20*rnd();
+ newball->loc.z = 5-10*rnd();
+ newball->dir.x = (0.5f-rnd()) * speed;
+ newball->dir.y = 0.0;
+ newball->dir.z = (0.5-rnd()) * speed;
+ newball->offside = 0;
+ newball->bounced = FALSE;
+ newball->radius = cfg_ballsize;
+ while (r+g+b < 1.8f ) {
+ newball->color.x = r=rnd();
+ newball->color.y = g=rnd();
+ newball->color.z = b=rnd();
+ }
+ newball->justcreated = TRUE;
+}
+
+/* Update position of each ball */
+
+static void updateballs(ballman *bman)
+{
+ register int b,j;
+ vectorf dvect,richting,relspeed,influence;
+ GLfloat squaredist;
+
+ for (b=0;b<bman->num_balls;b++) {
+
+ GLfloat gravity = 0.30f * speed;
+
+ /* apply gravity */
+ bman->balls[b].dir.y -= gravity;
+ /* apply movement */
+ addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
+ /* boundary check */
+ if (bman->balls[b].loc.y < bman->balls[b].radius) { /* ball onder bodem? (bodem @ y=0) */
+ if ((bman->balls[b].loc.x < -95.0) ||
+ (bman->balls[b].loc.x > 95.0) ||
+ (bman->balls[b].loc.z < -95.0) ||
+ (bman->balls[b].loc.z > 95.0)) {
+ if (bman->balls[b].loc.y < -2000.0)
+ createball(&bman->balls[b]);
+ } else {
+ bman->balls[b].loc.y = bman->balls[b].radius + (bman->balls[b].radius - bman->balls[b].loc.y);
+ bman->balls[b].dir.y = -bman->balls[b].dir.y;
+ if (bman->balls[b].offside) {
+ bman->balls[b].bounced = TRUE; /* temporary disable painting ball */
+ scalevector(&bman->balls[b].dir,&bman->balls[b].dir,0.80f);
+ if (squaremagnitude(&bman->balls[b].dir) < 0.08f) {
+ createball(&bman->balls[b]);
+ }
+ if (squaremagnitudehorz(&bman->balls[b].dir) < 0.005f) {
+ createball(&bman->balls[b]);
+ }
+ }
+ }
+
+ }
+ if (!bman->balls[b].offside) {
+ if (bman->balls[b].loc.x - bman->balls[b].radius < -20.0f) { /* x ondergrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.x = -bman->balls[b].dir.x;
+ bman->balls[b].loc.x = -20.0f + bman->balls[b].radius;
+ }
+ }
+ if (bman->balls[b].loc.x + bman->balls[b].radius > 20.0f) { /* x bovengrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.x = -bman->balls[b].dir.x;
+ bman->balls[b].loc.x = 20.0f - bman->balls[b].radius;
+ }
+ }
+ if (bman->balls[b].loc.z - bman->balls[b].radius < -20.0f) { /* z ondergrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.z = -bman->balls[b].dir.z;
+ bman->balls[b].loc.z = -20.0f + bman->balls[b].radius;
+ }
+ }
+ if (bman->balls[b].loc.z + bman->balls[b].radius > 20.0f) { /* z bovengrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.z = -bman->balls[b].dir.z;
+ bman->balls[b].loc.z = 20.0f - bman->balls[b].radius;
+ }
+ }
+ } /* end if !offside */
+
+ /* check voor stuiteren */
+ for (j=b+1;j<bman->num_balls;j++) {
+ squaredist = (bman->balls[b].radius * bman->balls[b].radius) + (bman->balls[j].radius * bman->balls[j].radius);
+ subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
+ if ( squaremagnitude(&dvect) < squaredist ) { /* balls b and j touch */
+ subvectors(&richting,&bman->balls[j].loc,&bman->balls[b].loc);
+ subvectors(&relspeed,&bman->balls[b].dir,&bman->balls[j].dir);
+ /* calc mutual influence direction and magnitude */
+ scalevector(&influence,&richting,(dotproduct(&richting,&relspeed)/squaremagnitude(&richting)));
+
+ subvectors(&bman->balls[b].dir,&bman->balls[b].dir,&influence);
+ addvectors(&bman->balls[j].dir,&bman->balls[j].dir,&influence);
+ addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
+ addvectors(&bman->balls[j].loc,&bman->balls[j].loc,&bman->balls[j].dir);
+
+ subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
+ while (squaremagnitude(&dvect) < squaredist) {
+ addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
+ addvectors(&bman->balls[j].loc,&bman->balls[j].loc,&bman->balls[j].dir);
+ subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
+ }
+ }
+ } /* end for j */
+ } /* end for b */
+}
+
+
+/*
+* explode ball into triangles
+*/
+
+static void createtrisfromball(triman* tman, vectorf *spherev, GLint *spherei, int ind_num, ball *b)
+{
+ int pos;
+ float explosion;
+ float momentum;
+ float scale;
+ register int i;
+ vectorf avgdir,dvect,mvect;
+
+ tman->scalefac = b->radius;
+ copyvector(&tman->color,&b->color);
+ explosion = 1.0f + tman->explosion * 2.0 * rnd();
+ momentum = tman->momentum;
+
+ tman->num_tri = ind_num/3;
+
+ /* reserveer geheugen voor de poly's in een bal */
+
+ tman->tris = (tri *)malloc(tman->num_tri * sizeof(tri));
+ tman->vertices = (vectorf *)malloc(ind_num * sizeof(vectorf));
+ tman->normals = (vectorf *)malloc(ind_num/3 * sizeof(vectorf));
+
+ for (i=0; i<(tman->num_tri); i++) {
+ tman->tris[i].far = FALSE;
+ tman->tris[i].gone = 0;
+ pos = i * 3;
+ /* kopieer elke poly apart naar een tri structure */
+ copyvector(&tman->vertices[pos+0],&spherev[spherei[pos+0]]);
+ copyvector(&tman->vertices[pos+1],&spherev[spherei[pos+1]]);
+ copyvector(&tman->vertices[pos+2],&spherev[spherei[pos+2]]);
+ /* Calculate average direction of shrapnel */
+ addvectors(&avgdir,&tman->vertices[pos+0],&tman->vertices[pos+1]);
+ addvectors(&avgdir,&avgdir,&tman->vertices[pos+2]);
+ scalevector(&avgdir,&avgdir,0.33333);
+
+ /* should normalize first, NYI */
+ copyvector(&tman->normals[i],&avgdir);
+
+ /* copy de lokatie */
+ addvectors(&tman->tris[i].loc,&b->loc,&avgdir);
+ /* en translate alle triangles terug naar hun eigen oorsprong */
+ tman->vertices[pos+0].x -= avgdir.x;
+ tman->vertices[pos+0].y -= avgdir.y;
+ tman->vertices[pos+0].z -= avgdir.z;
+ tman->vertices[pos+1].x -= avgdir.x;
+ tman->vertices[pos+1].y -= avgdir.y;
+ tman->vertices[pos+1].z -= avgdir.z;
+ tman->vertices[pos+2].x -= avgdir.x;
+ tman->vertices[pos+2].y -= avgdir.y;
+ tman->vertices[pos+2].z -= avgdir.z;
+ /* alwaar opschaling plaatsvindt */
+ scale = b->radius * 2;
+ scalevector(&tman->vertices[pos+0],&tman->vertices[pos+0],scale);
+ scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale);
+ scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale);
+
+ tman->vertices[pos+0].x += avgdir.x;
+ tman->vertices[pos+0].y += avgdir.y;
+ tman->vertices[pos+0].z += avgdir.z;
+ tman->vertices[pos+1].x += avgdir.x;
+ tman->vertices[pos+1].y += avgdir.y;
+ tman->vertices[pos+1].z += avgdir.z;
+ tman->vertices[pos+2].x += avgdir.x;
+ tman->vertices[pos+2].y += avgdir.y;
+ tman->vertices[pos+2].z += avgdir.z;
+
+ /* bereken nieuwe richting */
+ scalevector(&tman->tris[i].dir,&avgdir,explosion);
+ dvect.x = (0.1f - 0.2f*rnd());
+ dvect.y = (0.15f - 0.3f*rnd());
+ dvect.z = (0.1f - 0.2f*rnd());
+ addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&dvect);
+
+ /* add ball's momentum to each piece of the exploded ball */
+ mvect.x = b->dir.x * momentum;
+ mvect.y = 0;
+ mvect.z = b->dir.z * momentum;
+ addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&mvect);
+ }
+}
+
+
+/*
+* update position of each tri
+*/
+
+static void updatetris(triman *t)
+{
+ int b;
+ GLfloat xd,zd;
+
+ for (b=0;b<t->num_tri;b++) {
+ /* the exploded triangles disappear over time */
+ if (rnd() < t->decay) {
+ if (t->tris[b].gone == 0)
+ t->tris[b].gone = 1;
+ }
+ /* apply gravity */
+ t->tris[b].dir.y -= (0.1f * speed);
+ /* apply movement */
+ addvectors(&t->tris[b].loc,&t->tris[b].loc,&t->tris[b].dir);
+ /* boundary check */
+ if (t->tris[b].far) continue;
+ if (t->tris[b].loc.y < 0) { /* onder bodem ? */
+ if ((t->tris[b].loc.x > -95.0f) &
+ (t->tris[b].loc.x < 95.0f) &
+ (t->tris[b].loc.z > -95.0f) &
+ (t->tris[b].loc.z < 95.0f)) { /* in veld */
+ t->tris[b].dir.y = -(t->tris[b].dir.y);
+ t->tris[b].loc.y = -t->tris[b].loc.y;
+ scalevector(&t->tris[b].dir,&t->tris[b].dir,0.80f); /* dampening */
+ }
+ else {
+ t->tris[b].far = TRUE;
+ continue;
+ }
+ }
+
+ if ((t->tris[b].loc.x > -21.0f) &
+ (t->tris[b].loc.x < 21.0f) &
+ (t->tris[b].loc.z > -21.0f) &
+ (t->tris[b].loc.z < 21.0f)) { /* in box? */
+
+ xd = zd = 999.0f; /* big */
+ if ((t->tris[b].loc.x > -21.0f) &
+ (t->tris[b].loc.x < 0)) {
+ xd = t->tris[b].loc.x + 21.0f;
+ }
+ if ((t->tris[b].loc.x < 21.0f) &
+ (t->tris[b].loc.x > 0)) {
+ xd = 21.0f - t->tris[b].loc.x;
+ }
+ if ((t->tris[b].loc.z > -21.0f) &
+ (t->tris[b].loc.z < 0)) {
+ zd = t->tris[b].loc.z + 21.0f;
+ }
+ if ((t->tris[b].loc.z < 21.0f) &
+ (t->tris[b].loc.z > 0)) {
+ zd = 21.0f - t->tris[b].loc.z;
+ }
+ if (xd < zd) {
+ /* bounce x */
+ if (t->tris[b].dir.x < 0)
+ t->tris[b].loc.x += (21.0f - t->tris[b].loc.x);
+ else
+ t->tris[b].loc.x += (-21.0f - t->tris[b].loc.x);
+ t->tris[b].dir.x = -t->tris[b].dir.x;
+ } else {
+ /* bounce z */
+ if (t->tris[b].dir.z < 0)
+ t->tris[b].loc.z += (21.0f - t->tris[b].loc.z);
+ else
+ t->tris[b].loc.z += (-21.0f - t->tris[b].loc.z);
+ t->tris[b].dir.z = -t->tris[b].dir.z;
+ }
+
+ }
+ } /* end for b */
+}
+
+
+/*
+ * free memory allocated by a tri manager
+ */
+static void freetris(triman *t)
+{
+ if (!t) return;
+ if (t->tris) free(t->tris);
+ if (t->vertices) free(t->vertices);
+ if (t->normals) free(t->normals);
+ t->tris = NULL;
+ t->vertices = NULL;
+ t->normals = NULL;
+ t->num_tri = 0;
+ t->lifetime = 0;
+}
+
+
+/*
+ *load defaults in config structure
+ */
+static void setdefaultconfig(boxed_config *config)
+{
+ cfg_balls = MAX(3,MIN(40,cfg_balls));
+ cfg_ballsize = MAX(1.0f,MIN(5.0f,cfg_ballsize));
+ cfg_explosion = MAX(0.0f,MIN(50.0f,cfg_explosion));
+ cfg_decay = MAX(0.02f,MIN(0.90f,cfg_decay));
+ cfg_momentum = MAX(0.0f,MIN(1.0f,cfg_momentum));
+
+ config->numballs = cfg_balls;
+ config->textures = TRUE;
+ config->transparent = FALSE;
+ config->explosion = cfg_explosion;
+ config->decay = cfg_decay;
+ config->momentum = cfg_momentum;
+ config->ballsize = cfg_ballsize;
+ config->camspeed = 35.0f;
+}
+
+
+/*
+ * draw bottom
+ */
+static int drawfilledbox(boxedstruct *boxed, int wire)
+{
+ /* draws texture filled box,
+ top is drawn using the entire texture,
+ the sides are drawn using the edge of the texture
+ */
+ int polys = 0;
+
+ /* front */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,-1.0,1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,-1.0,1.0);
+ polys++;
+ /* rear */
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,-1.0,-1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,-1.0,-1.0);
+ polys++;
+ /* left */
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,-1.0,1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,-1.0,-1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,1.0,-1.0);
+ polys++;
+ /* right */
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,-1.0,-1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,-1.0,1.0);
+ polys++;
+ /* top */
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-1.0,1.0,1.0);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-1.0,1.0,-1.0);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f(1.0,1.0,-1.0);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(1.0,1.0,1.0);
+ polys++;
+ /* bottom */
+ glTexCoord2f(0,0);
+ glVertex3f(-1.0,-1.0,1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,-1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,-1.0,-1.0);
+ glTexCoord2f(1,0);
+ glVertex3f(1.0,-1.0,1.0);
+ polys++;
+ glEnd();
+
+ return polys;
+}
+
+
+/*
+ * Draw a box made of lines
+ */
+static int drawbox(boxedstruct *boxed)
+{
+ int polys = 0;
+ /* top */
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-1.0,1.0,1.0);
+ glVertex3f(-1.0,1.0,-1.0); polys++;
+ glVertex3f(1.0,1.0,-1.0); polys++;
+ glVertex3f(1.0,1.0,1.0); polys++;
+ glVertex3f(-1.0,1.0,1.0); polys++;
+ glEnd();
+ /* bottom */
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-1.0,-1.0,1.0);
+ glVertex3f(1.0,-1.0,1.0); polys++;
+ glVertex3f(1.0,-1.0,-1.0); polys++;
+ glVertex3f(-1.0,-1.0,-1.0); polys++;
+ glVertex3f(-1.0,-1.0,1.0); polys++;
+ glEnd();
+ /* connect top & bottom */
+ glBegin(GL_LINES);
+ glVertex3f(-1.0,1.0,1.0);
+ glVertex3f(-1.0,-1.0,1.0); polys++;
+ glVertex3f(1.0,1.0,1.0);
+ glVertex3f(1.0,-1.0,1.0); polys++;
+ glVertex3f(1.0,1.0,-1.0);
+ glVertex3f(1.0,-1.0,-1.0); polys++;
+ glVertex3f(-1.0,1.0,-1.0);
+ glVertex3f(-1.0,-1.0,-1.0); polys++;
+ glEnd();
+ return polys;
+}
+
+
+
+/*
+ * Draw ball
+ */
+static int drawball(boxedstruct *gp, ball *b, int wire)
+{
+ int polys = 0;
+ int i,pos,cnt;
+ GLint *spherei = gp->spherei;
+ vectorf *spherev = gp->spherev;
+ GLfloat col[3];
+
+ glPushMatrix();
+
+ glTranslatef(b->loc.x,b->loc.y,b->loc.z);
+ glScalef(b->radius,b->radius,b->radius);
+ glColor3f(b->color.x,b->color.y,b->color.z);
+ col[0] = b->color.x;
+ col[1] = b->color.y;
+ col[2] = b->color.z;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.5;
+ col[1] *= 0.5;
+ col[2] *= 0.5;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+
+ if (!gp->gllists[GLL_BALL]) {
+ glNewList(gp->listobjects + GLL_BALL,GL_COMPILE);
+ glBegin(wire ? GL_LINES : GL_TRIANGLES);
+ cnt = SPHERE_INDICES/3;
+ for (i=0; i<cnt; i++) {
+ pos = i * 3;
+ glNormal3f(spherev[spherei[pos+0]].x,spherev[spherei[pos+0]].y,spherev[spherei[pos+0]].z);
+ glVertex3f(spherev[spherei[pos+0]].x,spherev[spherei[pos+0]].y,spherev[spherei[pos+0]].z);
+ glNormal3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
+ gp->list_polys[GLL_BALL]++;
+ glVertex3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
+ if (wire)
+ glVertex3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
+ glNormal3f(spherev[spherei[pos+2]].x,spherev[spherei[pos+2]].y,spherev[spherei[pos+2]].z);
+ glVertex3f(spherev[spherei[pos+2]].x,spherev[spherei[pos+2]].y,spherev[spherei[pos+2]].z);
+ gp->list_polys[GLL_BALL]++;
+ }
+ glEnd();
+ glEndList();
+ gp->gllists[GLL_BALL] = 1;
+ } else {
+ glCallList(gp->listobjects + GLL_BALL);
+ polys += gp->list_polys[GLL_BALL];
+ }
+
+ glPopMatrix();
+ return polys;
+}
+
+
+/*
+ * Draw a single triangle
+ */
+static void drawtri(triman *t, int wire, int i)
+{
+ const vectorf *spherev = t->vertices + i*3;
+ const vectorf *loc = &t->tris[i].loc;
+
+ glNormal3f(t->normals[i].x,t->normals[i].y,t->normals[i].z);
+ glVertex3f(spherev[0].x+loc->x,spherev[0].y+loc->y,spherev[0].z+loc->z);
+ glVertex3f(spherev[1].x+loc->x,spherev[1].y+loc->y,spherev[1].z+loc->z);
+ if (wire)
+ glVertex3f(spherev[1].x+loc->x,spherev[1].y+loc->y,spherev[1].z+loc->z);
+ glVertex3f(spherev[2].x+loc->x,spherev[2].y+loc->y,spherev[2].z+loc->z);
+ if (wire) {
+ glVertex3f(spherev[2].x+loc->x,spherev[2].y+loc->y,spherev[2].z+loc->z);
+ glVertex3f(spherev[0].x+loc->x,spherev[0].y+loc->y,spherev[0].z+loc->z);
+ }
+}
+
+
+/*
+ * Draw all triangles in triman
+ */
+static int drawtriman(triman *t, int wire)
+{
+ int polys = 0;
+ int i;
+ GLfloat col[3];
+
+ glPushMatrix();
+ glColor3f(t->color.x,t->color.y,t->color.z);
+ col[0] = t->color.x;
+ col[1] = t->color.y;
+ col[2] = t->color.z;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.3;
+ col[1] *= 0.3;
+ col[2] *= 0.3;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+ glBegin(wire ? GL_LINES : GL_TRIANGLES);
+
+ for (i=0; i<t->num_tri; i++) {
+ if (t->tris[i].gone > 3) { continue; }
+ if (t->tris[i].gone > 0) {
+ glColor3f(t->color.x,t->color.y,t->color.z);
+ col[0] = 1.0f;
+ col[1] = 1.0f;
+ col[2] = 1.0f;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.8;
+ col[1] *= 0.8;
+ col[2] *= 0.8;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+
+ drawtri(t, wire, i);
+ polys++;
+
+ glColor3f(t->color.x,t->color.y,t->color.z);
+ col[0] = t->color.x;
+ col[1] = t->color.y;
+ col[2] = t->color.z;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.3;
+ col[1] *= 0.3;
+ col[2] *= 0.3;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+
+ t->tris[i].gone++;
+ continue;
+ }
+
+ drawtri(t, wire, i);
+ polys++;
+ }
+ glEnd();
+ glPopMatrix();
+ return polys;
+}
+
+/*
+ * draw floor pattern
+ */
+static int drawpattern(boxedstruct *gp)
+{
+ int polys = 0;
+ if (!gp->gllists[GLL_PATTERN]) {
+ glNewList(gp->listobjects + GLL_PATTERN, GL_COMPILE);
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-25.0f, 0.0f, 35.0f);
+ glVertex3f(-15.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(5.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, -35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(5.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-15.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glEnd();
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-5.0f, 0.0f, 15.0f);
+ glVertex3f(5.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(5.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-15.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-15.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glEnd();
+
+ glEndList();
+ gp->gllists[GLL_PATTERN] = 1;
+ } else {
+ glCallList(gp->listobjects + GLL_PATTERN);
+ polys += gp->list_polys[GLL_PATTERN];
+ }
+
+ return polys;
+}
+
+
+/*
+ * main rendering loop
+ */
+static void draw(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME (mi);
+ vectorf v1,v2;
+ GLfloat r;
+ int dx, dz;
+ int i;
+
+ GLfloat dgray[4] = {0.3f, 0.3f, 0.3f, 1.0f};
+ GLfloat black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ GLfloat lblue[4] = {0.4f,0.6f,1.0f };
+
+ GLfloat l0_ambient[] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat l0_specular[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat l0_diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat l0_position[] = {0.0, 0.0, 0.0, 1.0}; /* w != 0 -> positional light */
+ GLfloat l1_ambient[] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat l1_specular[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat l1_diffuse[] = {0.5, 0.5, 0.5, 1.0};
+ GLfloat l1_position[] = {0.0, 1.0, 0.0, 0.0}; /* w = 0 -> directional light */
+
+ mi->polygon_count = 0;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ gp->tic += 0.01f;
+ gp->camtic += 0.01f + 0.01f * sin(gp->tic * speed);
+
+ /* rotate camera around (0,0,0), looking at (0,0,0), up is (0,1,0) */
+ r = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->camtic/CAMDISTANCE_SPEED) * speed);
+ v1.x = r * sin((gp->camtic/gp->cam_x_speed) * speed);
+ v1.z = r * cos((gp->camtic/gp->cam_x_speed) * speed);
+ v1.y = CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT;
+
+ v2.x = LOOKAT_R * sin((gp->camtic/(gp->cam_x_speed * 5.0f)) * speed);
+ v2.z = LOOKAT_R * cos((gp->camtic/(gp->cam_x_speed * 5.0f)) * speed);
+ v2.y = (CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT)/10.0;
+
+ gluLookAt(v1.x,v1.y,v1.z,v2.x,v2.y,v2.x,0.0,1.0,0.0);
+
+ if (!wire) {
+ glLightfv(GL_LIGHT0, GL_AMBIENT, l0_ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, l0_diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, l0_specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, l0_position);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, l1_ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, l1_diffuse);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, l1_specular);
+ glLightfv(GL_LIGHT1, GL_POSITION, l1_position);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ glFrontFace(GL_CW);
+
+ glMaterialfv(GL_FRONT, GL_SPECULAR, black);
+ glMaterialfv(GL_FRONT, GL_EMISSION, lblue);
+ glMaterialfv(GL_FRONT,GL_AMBIENT,black);
+ glMaterialf(GL_FRONT, GL_SHININESS, 5.0);
+ }
+
+
+ /* draw ground grid */
+ /* glDisable(GL_DEPTH_TEST); */
+ glDisable(GL_LIGHTING);
+
+ glColor3f(0.1,0.1,0.6);
+ for (dx= -2; dx<3; dx++) {
+ for (dz= -2; dz<3; dz++) {
+ glPushMatrix();
+ glTranslatef(dx*30.0f, 0.0f, dz*30.0f);
+ drawpattern(gp);
+ glPopMatrix();
+ }
+ }
+
+ /* Set drawing mode for the boxes */
+ glEnable(GL_DEPTH_TEST);
+ if (!wire) glEnable(GL_TEXTURE_2D);
+ glPushMatrix();
+ glColor3f(1.0,1.0,1.0);
+ glScalef(20.0,0.25,20.0);
+ glTranslatef(0.0,2.0,0.0);
+ mi->polygon_count += drawfilledbox(gp, wire);
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(20.0,20.0,0.25);
+ glTranslatef(0.0,1.0,81.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(20.0,20.0,0.25);
+ glTranslatef(0.0,1.0,-81.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(.25,20.0,20.0);
+ glTranslatef(-81.0,1.0,0.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(.25,20.0,20.0);
+ glTranslatef(81.0,1.0,0.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ if (!wire) {
+ glEnable(GL_LIGHTING);
+
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, dgray);
+ glMaterialfv(GL_FRONT, GL_EMISSION, black); /* turn it off before painting the balls */
+ }
+
+ /* move the balls and shrapnel */
+ updateballs(&gp->bman);
+
+ glFrontFace(GL_CCW);
+ for (i=0;i<gp->bman.num_balls;i++) {
+ if (gp->bman.balls[i].justcreated) {
+ gp->bman.balls[i].justcreated = FALSE;
+ freetris(&gp->tman[i]);
+ }
+ if (gp->bman.balls[i].bounced) {
+ if (gp->tman[i].vertices == NULL) {
+ createtrisfromball(&gp->tman[i],gp->spherev,gp->spherei,SPHERE_INDICES,&gp->bman.balls[i]);
+ } else {
+ updatetris(&gp->tman[i]);
+ }
+ glDisable(GL_CULL_FACE);
+ mi->polygon_count += drawtriman(&gp->tman[i], wire);
+ if (!wire) glEnable(GL_CULL_FACE);
+ } else {
+ mi->polygon_count += drawball(gp, &gp->bman.balls[i], wire);
+ }
+ }
+
+ glFlush();
+}
+
+
+
+/*
+ * new window size or exposure
+ */
+ENTRYPOINT void reshape_boxed(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(50.0,1/h,2.0,1000.0);
+ glMatrixMode (GL_MODELVIEW);
+
+ glLineWidth(1);
+ glPointSize(1);
+}
+
+
+static void
+pinit(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME (mi);
+ ballman *bman;
+ int i,texpixels;
+ char *texpixeldata;
+ char *texpixeltarget;
+
+ glShadeModel(GL_SMOOTH);
+ glClearDepth(1.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* Load configuration */
+ setdefaultconfig(&gp->config);
+
+ /* give the decay parameter a better curve */
+ if (gp->config.decay <= 0.8182) { gp->config.decay = gp->config.decay / 3; }
+ else { gp->config.decay = (gp->config.decay - 0.75) * 4; }
+
+ bman = &gp->bman;
+
+ bman->balls = (ball *)malloc(gp->config.numballs * sizeof(ball));
+ bman->num_balls = gp->config.numballs;
+ bman->ballsize = gp->config.ballsize;
+ bman->explosion = gp->config.explosion;
+
+ gp->tman = (triman *)malloc(bman->num_balls * sizeof(triman));
+ memset(gp->tman,0,bman->num_balls * sizeof(triman));
+
+ for(i=0;i<bman->num_balls;i++) {
+ gp->tman[i].explosion = (float) (((int)gp->config.explosion) / 15.0f );
+ gp->tman[i].decay = gp->config.decay;
+ gp->tman[i].momentum = gp->config.momentum;
+ gp->tman[i].vertices = NULL;
+ gp->tman[i].normals = NULL;
+ gp->tman[i].tris = NULL;
+ createball(&bman->balls[i]);
+ bman->balls[i].loc.y *= rnd();
+ }
+
+ generatesphere(gp);
+
+ if (!wire) {
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ }
+
+ /* define cam path */
+ gp->cam_x_speed = 1.0f/((float)gp->config.camspeed/50.0 + rnd()*((float)gp->config.camspeed/50.0));
+ gp->cam_z_speed = 1.0f/((float)gp->config.camspeed/50.0 + rnd()*((float)gp->config.camspeed/50.0));
+ gp->cam_y_speed = 1.0f/((float)gp->config.camspeed/250.0 + rnd()*((float)gp->config.camspeed/250.0));
+ if (rnd() < 0.5f) gp->cam_x_speed = -gp->cam_x_speed;
+ if (rnd() < 0.5f) gp->cam_z_speed = -gp->cam_z_speed;
+
+ /* define initial cam position */
+ gp->tic = gp->camtic = rnd() * 100.0f;
+
+ /* define tex1 (bottom plate) */
+ gp->tex1 = (char *)malloc(3*width*height*sizeof(GLuint));
+ texpixels = 256*256; /*width*height;*/
+ texpixeldata = header_data;
+ texpixeltarget = gp->tex1;
+ for (i=0; i < texpixels; i++) {
+ HEADER_PIXEL(texpixeldata,texpixeltarget);
+ texpixeltarget += 3;
+ }
+
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ clear_gl_error();
+#if 0
+ i = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 256, 256,
+ GL_RGB, GL_UNSIGNED_BYTE, gp->tex1);
+ if (i)
+ {
+ const char *s = (char *) gluErrorString (i);
+ fprintf (stderr, "%s: error mipmapping texture: %s\n",
+ progname, (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ gp->tex1);
+ check_gl_error("texture");
+#endif
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+}
+
+
+
+ENTRYPOINT void
+init_boxed(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+
+ /* Colormap cmap; */
+ /* Boolean rgba, doublebuffer, cmap_installed; */
+ boxedstruct *gp;
+
+ MI_INIT(mi, boxed);
+ gp = &boxed[screen];
+ gp->window = MI_WINDOW(mi);
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_boxed(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ if (!glIsList(gp->listobjects)) {
+ gp->listobjects = glGenLists(3);
+ gp->gllists[0] = 0;
+ gp->gllists[1] = 0;
+ gp->gllists[2] = 0;
+ }
+ pinit(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+
+ENTRYPOINT void
+draw_boxed(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!gp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+ draw(mi);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+ENTRYPOINT void
+free_boxed(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ int i;
+
+ if (gp->glx_context) {
+ /* Display lists MUST be freed while their glXContext is current. */
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ if (glIsList(gp->listobjects))
+ glDeleteLists(gp->listobjects, 3);
+
+ for (i=0;i<gp->bman.num_balls;i++) {
+ if (gp->bman.balls[i].bounced) freetris(&gp->tman[i]);
+ }
+ free (gp->bman.balls);
+ free (gp->tman);
+ free (gp->tex1);
+
+
+ }
+}
+
+
+XSCREENSAVER_MODULE ("Boxed", boxed)
+
+/*********************************************************/
+
+#endif
diff --git a/hacks/glx/boxed.h b/hacks/glx/boxed.h
new file mode 100644
index 0000000..fd9b5e1
--- /dev/null
+++ b/hacks/glx/boxed.h
@@ -0,0 +1,4116 @@
+/* GIMP header image file format (RGB-only): /home/shag/build/xscreensaver-3.33/hacks/glx/thebox.h */
+
+static unsigned int width = 256;
+static unsigned int height = 256;
+
+/* Call this macro repeatedly. After each use, the pixel data can be extracted */
+
+#define HEADER_PIXEL(data,pixel) \
+ pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \
+ pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \
+ pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
+ data += 4;
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the following constant data... */
+# endif
+static char *header_data =
+ "!FY'\"&Q#!&M!!VM-!6Y(!&M##6Q&\"69%\"FU'!FE!!VM$!VI$!&M!!FM#!VU&!'!!"
+ "\"&M%#&M!\"6Q$\"')#!FY#\"FY%\"6Y\"\"&Y#\"6]$\"&U!\"G%!\"7%&!G)!!'-!!')!\"'=!"
+ "!G!##G5\"\"75$\"W9#!G5#!G9!!WA$#'=\"!GE#\"'A%#GI$!GI!#'A!!'E##GQ&%7Q#"
+ "#WU%#W=%\"W]#\"GY\"%WQ)%7Y\"\"H-!\"W]&\"8!$%8%#$8-&\"8%!#81%$85)#H!##H-&"
+ "$H1(#H)#\"X5#$XA%\"X9##H9#\"89#\"89!\"HA\"\"8A!\"8A!\"X=#$8E&#(I!\"8I&$HM!"
+ "#8I%\"8M!!HM#!HM!!HU!$(M($8Q)!H])!XQ!\"8Y!$(]'$(Y'$8Q(\"XY%#XQ#\"I!$"
+ "\"XY\"#Y)##)%#%(]%$Y!!#I%\"\")!%#Y!$#9%!#8]!#I%\"$)%$%HY%#HU\"$91($9-("
+ "$))$#95!%8]&!9-\"$X](\")!#!)%!%)-\"#9-$#)-&#I5\"$Y%!#)-)\"I-!#91!\"Y-\""
+ "\"(]\"$I-'#IA\"\"I-!#Y-&#)-##Y-##)1#!I-##)-#\"H]!#)5#\"Y-\"!)-!\"Y!&$)-!"
+ "#)1#\"Y%##(]!$9-)\"I)!#)1#$Y%'\"XY\"\"91#!)1!#I)\"$)%%%(]&#HY\"#(]!#I)\""
+ "&8]%!(]!\"Y!##H]%#X]!#)%##(Y&\"I)!$X]!#Y!#\"(Y\"\"HY!#Y%'\"8Y!%(]+#XQ&"
+ "\"8M#!XQ$\"Y%%\"8M!#XU!#HI\"$XQ$#XI&\"HI!#8A\"$8E\"#(5!#8A$$(A%\"8=#$(5("
+ "#X='$89##H=\"#(=!\"XA#\"(-#\"H1\"\"81!\"8-!!(5!\"X-##8!#\"H1%$(!&#X1&%X1$"
+ "#(%$\"G]\"!8%\"\"7M!\"7U!#'Y$\"7M!#7Y##GI$#WI%!'M#\"7A!\"GI\"!G9!!GI&!GE!"
+ "\"GE%!W=\"!'E#\"W!\"!G%%!W5&!G9!!W)\"\"'-#!7-'\"V]&!W1\"\"'%\"\"'%#\"&]\"!'1%"
+ "\"&Y##FQ%!&U!\"FU!\"&Q#!&I!!FU#!&Y!!6M\"!FM%!FI!!&M!!VM\"!VM\"!FI%\"6Q$"
+ "!&E#!VQ&!&E!\"FM!\"FM#!&Q!\"&I%#&I%\"&M*\"VM(!6U\"!6A\"!&I'!FM#!FM!\"6M\""
+ "!FE##FU%#V]$\"&Y#\"FY!\"F]%!F]!!V]\"!G1!\"7%\"#75(!G%!\"71$\"'-#\"'1!!G5&"
+ "!W5$!G=!\"7)\"\"G=%\"7M#\"GM'!WA\"!'A!#7A*\"7I!#7Q&#X!*$'I!#'I\"$'U(\"7U!"
+ "#7Y%!GY!#GY&\"7]!!H)!$H!+\"WY##X!'#X%'\"H1!\"()#\"H=\"\"X1(%X-(!H1!#X5!"
+ "\"H5\"$8-&%X5'\"8-!#X-'\"XE%#H=&#XA'#XA$\"XE#\"XE#\"H=!#HE%\"XI\"!HM##(I'"
+ "\"8A!#H=#\"H]!#(Q#\"8Q##(Y#!HE#\"HU!\"))%$(Y$#(Q#$H]&#X]!#X]#\"HU!!)%!"
+ "\"Y!\"#I!&$)%%$)%$#Y-#$XQ*#95!#9)!&9%($)1'!Y)!\"Y-\"#9)$%I%'#)-#\"I-!"
+ "$9)(!YA'&)-*!I%#!Y5!#Y)#%I-$$I5#\"Y1%#I)%#YA&$I1)#))#!Y5!#9-$#)1#"
+ "\"I1!\"I1!!)1$\"I-!#I1%\"Y!#\"H]!#I)%#9)!#))#$9)&#9-$$)='#Y1##I9\"!Y1$"
+ "$)-'#Y)##I-%#99$!)-!#)-&!)-'$Y-+!9-\"%9)#\"X]\"$))'\"9=#$Y)!#Y%#$Y%("
+ "!I%&#Y!##(]!$I!'#9!!%I)!!Y!\"$H]#\"9!##8I(#8]$$(Y'\"I-!$8U##(Q##8I$"
+ "$(U'!HU#$HU!#(Q!%(I)#H](#HU\"$(E(\"XM\"\"HI!\"XA#\"HE!\"(I%&(A(#HE%#XI!"
+ "#H9##8=!\"HA$$8=#!H1##(=!%(1&\"H1!#85%\"X1#\"8-!$(-#\"8-!\"X-\"\"X%#\"X%!"
+ "!H!#!H!!#8-%!'I!\"8%!\"GY%$7M)\"GM\"!'M!\"GU\"\"WU#\"WM!\"'I#\"8!!!75\"\"'I#"
+ "\"79+\"G5\"\"'5!!GA#\"'-\"#'=\"!G%!#')'\"'=,!W5$\"'-#\"G!#\"')#\"'%#\"6U#!W!\""
+ "\"6]#\"G!%#'!$!VU\"!&Q!\"&Q#\"6]$!FM!!&]##&Q'!&Q!!6M$!6M&!&I!!69\"!G!#"
+ "\"6I$!&E!!6Y\"!FI#!6M&!&M!!F='!&Q&!&M!!VE$!VI$\"&I'!6M\"\"&I#!FE!\"6E&"
+ "#&Y%\"W)(!VU\"\"G!)!FU!#V]&!G9!!79&\"G-\"\"7)$!G1!\"G-$!W5\"\"71$\"'5#\"'5!"
+ "!71\"\"'1\"!G9!!7A%\"'A#!G1&\"GI$\"'A!#7I%\"'E'#H!&\"WY#\"WM&$GU%\"']\"!GY!"
+ "!WY!$H!+#W]'\"8!!\"X!#\"'Y#\"W]!!H)##X1'#H-##(5##89\"#H-!\"81!\"89##H1&"
+ "%HE%\"8=!$(9%\"X9\"!X9!\"XA#\"HI$\"XE(#(I#$(Y*$8I(\"8I!#85!#XM!!HM!$8M&"
+ "#(Y##(Q!#XQ!#XY##8Q$#(Q#$9%%#HY%\"X]\"$H]&!H]!\"8Y!!Y5!$I!)'I!'$)!!"
+ "#9%!\"9!$%95#\"9%&#I1(#9)$\"9-#!Y%!\"Y!#\"))\"!HQ!\"I)!$91\"\"I-!#9!!$9))"
+ "!)-'\"I-!$I5##)9#\"I5$#8]!#Y)##)1##)1#\"I9!$I-##9=!\"YA%$9-%\")5%\"I)!"
+ "\"I5!$)-'$)1!\"9=#$Y5!\"Y)\"#Y5&!)A!\"Y-\"#I=!#91$#I%\"#)-#%I5!#)5##9)$"
+ "#)1&!9-\"#91$\"I1!\"I1$\"Y9\"#I)%!I-#!I-##)-#\"I-!\"Y5\"#I)\"!))$\"))\"!)%!"
+ "!X]!$)!(\"Y%#$9%\"#I%\"#I)\"$Y-'#I%#\"I!!#Y-##I%)!Y%!\"8]!#I-%#)%#$(Y'"
+ "$)%%#XY#\"I!!\"8]!#(U#\"HA$#HU\"&HQ)&(Q*\"HU!#8M$\"8M!#8Q$#8Q$$(E(\"8E#"
+ "#(A#\"HA!%85'#(=!%(=#\"H5\"#H9\"\"89!\"85!\"H-'!H5#\"8=!$85$\"8-!!X)!#'U$"
+ "\"8%!\"8!!$H!$#(1!\"(%#!GU#!WY!\"WU#\"7U!$GU#\"7Q!#GI$\"7M!\"7M#\"GI%\"GI\""
+ "#WE*\"'E#\"WA&#'A'\"'I\"!')!\"G9\"\"W5$#W-#\"'1#\"'-#!7-\"\"&Y%\"G5\"\"'!#!'%#"
+ "\"'%#\"F]'\"VY&!&Q!#&Y\"\"&U!\"&Q#!FQ!\"FQ%$VU*!&E!!FM%!VM&!VM$\"F9)\"&U)"
+ "!&M#!&Q!!&I!!&M!!6Q\"\"6]&!&A!!FQ#!VQ$!6=\"!6Y&!6M\"$6M&#FM)!FQ!\"&Q#"
+ "\"6M,\"6Y$#&]$\"V]*#FY)!F]!!G!!!&]!\"')\"!W)!\"7-&!G5!!'-!\"75#!G5!!G9!"
+ "\"'A#!G5!!GA#\"WA#\"GA)!'E!#'A\"#GU!#WM%#7M%\"7M!#WY'#7Y%\"7Y!\"GM\"#7]%"
+ "\"X)##']$\"8%!#8%$%(=&\"8%!\"8)$$X)#$()#$8%)\"8-!&X1(\"X=\"$H='$(=\"%H1&"
+ "!HE#\"X=#\"89!!X5'$8A##XI&\"8A&#(I!&(Y##HI(#(]#\"8M!#8Q$!HQ!\"HQ!$(Y'"
+ "\"XU\"#9!$$X](\"XM%#HU%\"XQ(#XU&\"8Y!#9-!#8Y$\"8Y!#I!\"\"9)#\"H]!\"8]!#8U!"
+ "$9%##X]!\"X]\"\"I%!$Y!*!I)##9-$$914\")1(#I-%#)-#!))$$)5$$Y1*#91$\"Y1%"
+ "$9=\"!Y9!\"9-#$9%)\"Y5\"&)-&$)5'\"Y%#\"I5!\"I='#)9##99$#)=##I9%\"YI!#)9#"
+ "#)9#%I9.\"II!#Y9#\")=\"\"I9!%)1($Y9$\")E\"#Y9#\"Y9\"!YA$$I9)\"I5!#95$\")5("
+ "$)1'#Y=##Y9&$I5##Y9&\")9\"#Y5##)9##9=$#9-$!Y9!$)A'\"Y-\"&9-+!)-!\"Y-\""
+ "\"I)!\"I-!#91'#))##9)$\"XY\"#9)$#9%!$H]#!I)#%I)!&I%&$9!%%I1!!X]!\"8]!"
+ "\"8]!\"I!\"$HU'!XY!\"XU\"#(Q##(U#%(U)$XE%#8I$!(U#\"8M#\"HU$#(Q!\"HM!#HU\""
+ "!XE$\"8M!\"85!!H9!\"XA\"#(=$\"X=##HI%$89##X5&\"89#!H=&#(1&\"85!\"(5\"#H-%"
+ "$(!&#H)%#(5#\"()#\"8)$!G]#\"']\"#W]'#8!##WY'$X!)#7U#\"WQ#\"7Q!\"WM##'Q!"
+ "\"7I!\"WI#\"G=\"$7E$#W5*\"'=#!G=!$75,#W='\"'5\"!79\"#71(!W%\"\"G%#\"')#\"'%#"
+ "#G%$\"7)$!'!!\"'!#\"G%\"\"&Y#!VU\"!6M\"!FQ!\"6]&!6=\"!F]#!VM$!&U#\"FQ#\"&E#"
+ "!&M#!VI$!VU*\"VU&!6M(!6Q\"\"FQ%#6M$!FQ#!FI#!VM&#6M(\"&M#\"&U#\"&M#!F]&"
+ "!FY(\"6Y$!7)\"#6U\"\"W)&!G!!\"G%##G)'!W)\"!'9!\"7-$#W5#\"'-#\"'9%!W-\"\"'=\""
+ "!'=!\"G9%#7Q##'E$\"GI#%'I'!GE#\"WQ!\"'Q\"\"WM##GY$#WY)\"7Y##8!%#X%!\"X%#"
+ "#H)$\"H%\"%(5!#'Y!$8))#7]%#H-#$81$\"H5\"#89$#(=!#85!$(5($H-$#XM&#89\""
+ "$(E%!(M!#89\"$HM'\"(E\"\"HM!!(I!\"8I!!(I$#8]$#(E#%(Q)$HQ)#XQ'$(U'#8A$"
+ "\"HI!#XY#\"8Y!#(]##9!!#8]$$)!(#Y%$$9%%$9%#%(]\"#9!!\"Y%##Y)##I-\"#8Y-"
+ "\"I1!$9-\"$)5'\"I1!#))#\"I1!!))!#9%$!I)#\"I1!%)5\"\"95##91!$)5$$I5)#95!"
+ "$9=%\"I1!\"YI\"\"I9!#99$\"I9!\"Y5\"#I=%$)9!$I=#$)='!YI!\"I9!%I='!)5!#Y9#"
+ "$I=#!)A$\"I=!#I=%#9=$\"YQ!#)=##)A#\"YA\"\"I5!#I=(#Y9&\"II!!IA#\"9=##Y5#"
+ "#)9#\"I1!\"IE!#Y9&\"YI\"#Y-&\"Y=\"\"I=!#I9%#)9##I9\"$Y1'&9A&#I1%\"I!'#)1#"
+ "\"91#\"Y1\"#Y1&$))$$I5#!I%(\"I!$\"I)!#))#$Y)!#I1\"#I%##8]$#(]!$8Y\"#Y-#"
+ "#HQ(\"XY\"\"I!!#(Y#\"Y1\"#8Y$$(Y(\"HU!\"XM\"#8U$%(I#\"XQ\"\"XY\"#(M!!HI&\"(I\""
+ "#HE#!HI!#HM(#8=$\"X=\"#XE'!(9&\"XE#$X=&#(A'\"81!\"H1!#8=$\"81$$81&#(-$"
+ "#H-%\"8%!#H))$H)\"\"8%!\"X%!#8)%\"']%#(!!\"7U!\"'E#\"WU#!GM!\"GQ\"\"7Q!#WI%"
+ "!WM$\"GA$\"WA!\"WE#!'A!\"'A#!7A\"#GA$!G5!\"G5$\"W5#!G5!!'1!\"W)$\"G5\"#&Y#"
+ "\"'%#\"'%#\"F]##6M!!F]!#6](!G!!\"FU#\"6I$!VQ\"\"FM)!&Q!!&Y!!FM#!&=#\"FM%"
+ "!6U\"!6M$!6M\"!FQ##&E%\"&M*!VM$!6Q\"\"6U(\"6M$\"6Q$\"6E\"!VM\"!FY#!VU$\"&]\""
+ "\"FI%!&U&\"'%#\"'!\"!W!\"!G!!\"W%#\"71$\"'-#\"7%$!G-!!F]!!G=!\"'-\"#GI#\"7A#"
+ "\"7=$!WI\"\"GU\"!GE#\"GU\"#'Q$\"7Y&!'Q#\"W=$#7Y%$GY#\"GY%!G]#\"H)\"\"H!\"\"(!\""
+ "\"7Y!$(%%\"8)$$H-%\"X-\"\"X%#$(-(#H1##81%\"85!#(A#\"89!#(9##H=%#(=!!H=#"
+ "\"XA%\"HE$#H=%!HI!$XQ+#(I#\"8E!#(Q#\"8M#\"XQ\"\"HI$#I%%%9%*#8Y$#(U#%)%\""
+ "\"X]%\"Y-\"\"8Y!\"I!!!Y!$#(U!\"I!!$))!!Y-!%I-+%9%&\"I)!\"I!!\"I-!$)-$#I1\""
+ "\"Y!%#)1#!91\"\"I-!#HY%\"I1!$Y-+#95!$I5&#Y=&#IA%\"I9!#Y9&#I=%\"I9!\"I9!"
+ "#9E#$)M&\"I=!!9=\"$I=#\"Y9%#Y5)$)A!$)=$#I=\"%99\"%II&#Y9##YA#$IA##Y9&"
+ "!)E!\"I5!#9A$$Y=!$9A$\"YM!#IA\"$YI&$IA%#I9\"$YA'#Y=#$)9$#9E!$9=%\"IE!"
+ "\"Y5\"\"I9!\"IQ!#I=%%9I%\"I=!#)M#\"99&!)=!#YE%#99'$I9#$Y5'#)9##)9##)1#"
+ "$I=#\")-%\"Y)\"!I1)'))'\"I-!\"I)!$9-%$)-!#H]%#9)!$I)#\"Y)\"#I!#\"I-!$)!$"
+ "#I%\"#8Y$$8U##(Q#!X]!\"X]%%H]-\"(Y\"\"H]!\"XQ\"#XQ$#(Q&%(Q)#(Q#!HQ!\"8U#"
+ "\"HQ!#XY&\"8Y!!HI&\"X=##(M#!(=!#8E%\"H9\"!H9#$()##8I$%(5&#()!#H9&!(-!"
+ "#8-%#H-%#H9##']$\"8)!\"(%##X%!\"81!!(!$$H)(!(!$\"GY)#WQ'#7U#\"7Y#!GY#"
+ "!'Q!\"WM#!'Q!\"W9#\"'E#!WE!\"GA%\"G=%\"'=#\"G9$!G1!!W5\"!7-\"#71(!W1'\"'%#"
+ "\"F]%!7%'\"&]#!6Y$\"W-&#&]'!FY!\"&Q#\"&M#\"FI%$VY%!6M*\"VM&!&M!!&M#!FM#"
+ "!&Q!!&U%!FM#!6M\"\"6M$!&I!\"&M%!&M!#&U%#&M'!7%$!FQ!\"VY&#&U%\"6Y&!W!$"
+ "!6M$!FY!!&]#\"'%%\"'1\"!G1#\"V]\"\"W1&\"W5(!G9!!G9!!79\"!'5#!'=!\"GA\"!GA#"
+ "!GE!#79\"\"WI!\"'I!#WE#\"GQ\"$'Q##7U#!GQ!\"X)\"\"7Y!\"'Y\"$'Y%!H!!\"8)!#(%$"
+ "$H-%\"(%#%(!$#X-'\"X%#\"H%!#X1$#(5#\"89#\"X9\"#XQ&\"X=#\"89!#X=!#(E#\"HE$"
+ "#HA##(E&#(M#\"XM%$(M!\"HI!$XM(#HQ%#HY%$H]&#)!#$9!+#H]\"%Y!#$(]$%I!+"
+ "\"8]!#9!!#9%!!Y)$#9-!#9-!\")%\"\"I!\"#9-$\"I-!\"I-!\"Y9\"&)9##8]!$91%#)1#"
+ "#9=$\"Y1\"#I9%#Y5##Y5&\"I5!$)='!Y1!#I1($9=(#)9#\"Y9\"\")=\"!YI!!Y=!!Y=!"
+ "#Y%$$YA&#YA\"%9E%#9=!#95!#YA##99!$)5$%Y9%$YA&%9I)$)E$%9E)#)5##9E$"
+ "#YM\"$IE%$YI$#9A!%)E!#9E!#9=!#Y=#$95%&)M\"$I5##I=!$)I$$YA&$IA%$9M!"
+ "#Y5##YA\"$9=\"#YI#$)A$#)A#$)5$&9A.$IA($)1$#9E#\"I=!!I9##)A#!95\"\"II!"
+ "\"99##Y1&!)9!\"Y!##Y=#$Y5.#))#\"(]\"\"I1!\"I5!\"9)#!Y-!$Y%*$))$\"I)$\"I)!"
+ "$)%!$I)##9!!#9!\"$HE!$(]$#8]$\"8Y!#(]##HY%\"8U#!HY!#XU&\"XU\"\"HY!\"89!"
+ "\"8M!#HI##XM'#XA&#8Q$\"XI\"!H5##(9#\"XA#!H5#$X=%\"H9%$X9#%(=#$X5&#(5&"
+ "$H1*%X%'#(-!$(-%#8)%#H-&\"8%!#()$$(!#\"8%!#X%!$']&\"WU#\"W]#\"7U!$'U#"
+ "\"WQ!!GU!#'I$!'I#\"GI\"!GM!\"'I#!'E#\"WM#!W)!#'9&!G9!#'5\"!G5#!')!!7%&"
+ "\"G-%\"W)&!79%\"')#\"7)$\"7-$#&]&\"&U!$6Y%!FQ!!W%!\"FY%!VM\"#6E\"!V]\"\"6M&"
+ "!FU#!&M#!&Q!\"6M(!6M\"!&=#!VM$\"VE(\"VM$!V]\"\"&Q#\"&U#!6U$!FM!!&Y##'%%"
+ "!G%!!W%!\"7%$!')#!')!\"G-%#'1&$'I!!G9#\"79+!75\"\"W9&\"71$\"W-&#'U\"\"7E#"
+ "!WM$!'E#!GU##7I#\"WM(!G]!\"7U!#'A\"\"X!#$7]*#X!'\"8!!\"WI##(!$#H%&!H!#"
+ "$8)$\"X)%#8-'#(5#!H5!!(=!%XE)\"89#!X9$\"H=!\"X=%#H5&\"HE!#(M#%8I'#HE#"
+ "$HY)%(E+\"8]!\"8M!#(Q#\"XY\"!HI&!8I\"$8Y&\"8I!\"HI'\"XU\"#HY%#(])#8Y$#I!#"
+ "#9!!#H]\"#I%\"\"Y-\"!))!$))!$9=%$9-)#I)\"#9-$\"I1'\"I1!%Y=(#))&$95\"#)5#"
+ "$I9)#)5)$I9)&91'\"I5!%Y=$!)='\"Y-\"$Y-!#95!%9=)$IA\"$9=%%)A(#9A!#91!"
+ "$)E#\"IA$#9E!#IE\"\"II!$9E$%)A%%)E$&IE.#)=#$)='$IA\"$)A!#9E!%IM&$)E$"
+ "$)Q#$9I\"$)=!$IA#&9I'#9I$$9I$#9I!$9M!%)A+#IE$\"IE!$IA%%9=\"$9=%$Y=$"
+ "$)I#!)E!#YQ##9E!#YE#&)A(!YA$%)A(#YA#&)A\"&9I&#IE\"$Y=!$9=(\"IA!\"Y1\""
+ "$9)\"!YA!#I9%#)%$#Y%#%95\"\"I)!$)5'\"I1!\"9%$\"I1$#Y)&#)-#$91(\"Y-%%)-%"
+ "\"8]!#99'#)%#%Y%,\"I-!$)!!#9-!#9!\"!Y!!$HY##(U#\"I!$#(Y##(Y#%(]%#XU#"
+ "#(Q#!XQ!#(Q##8I$#HQ%#8Q!#HQ\"\"XE#\"8I!#XE&\"XQ%#X9$\"XA0\"X5#$8-)!H9!"
+ "#(=!\"XE#\"X=#$(1#\"7]#!X1!#8%\"#H)$!(%!#H%&\"H!\"\"X%#$8-'\"H%\"\"7Y!$(!("
+ "\"GQ$\"7E!!H%!#WM'\"7M!#7M#!GI#!WY$\"GA#!WE!!GE!#7I(\"W=!\"G9%\"')(#71$"
+ "#G%\"!'%!\"'A'\"G1\"!G%#!'!!!G!#\"G1#!FU#!FY)#&U%!&U#!VY\"\"VQ$\"FQ%!FM*"
+ "!VM$\"FI'\"&Q#\"&M#$&M)\"6M$!VM$\"&M##&M!\"&U##VU,\"&U!\"&U#\"FU%\"&]#!FY&"
+ "#')%\"G)%!FY!$7-%\"')\"\"G1%!W1(!G5%\"G9$!'9!!G=!\"'=#!G1!!W=\"!GA!\"7I!"
+ "\"7M!$'M(\"7M!\"7I!#WQ%\"WY#$GY%$'U#!7Y\"#W]$\"X!#\"X%#$(%%\"8)!#()!!X-$"
+ "\"X-#&H9'\"H5'!H5!#H)&$8=##89$\"X9#\"X=#\"8A!%8A-#(9#\"HM!#XE##HA&\"(A\""
+ "\"8M!\"HA!!HI!#HQ%#HM&!XQ$$8U##XI#\"8Y!#XY##9%!#Y)&#HY%#9%!!X]$$9!&"
+ "$I%'#)%$%)9%$I!*$Y%!!)-!#Y1#$8](#)9#$I5,\"Y1%#I5%#95!\"I1$$95(%II&"
+ "$)A!\"I9!!)=!\"I=!\"Y5\"$9=%$IA#%9E\"#Y9#$9=+$)=$$)A$!Y=!$YI&#YA\"$Y=#"
+ "$IQ%%IE$&)I,$)I#%9I%#YM#\"II!#YI\"#)Q\"#9I!#YM\"$)I#%IQ)&)I,$9Y!%II#"
+ "#9M!#9M!%IA*%YA$%YQ!$)I#\"YM!#)=#\"IM!#9A!#YM#$9U$#IM\"%)I(%)M!#9E!"
+ "#)I&#)M##Y9#'YI*#II\"#9E!#Y=\"$)E#&9E#%YE+%YE+#9I!#9A!%IQ#%9A\"$)=!"
+ "#99!#Y1#!9=%#)9#%9=\"$)5!\"Y=\"\"Y=\"#I=%\"Y-\"!I%##)1#\"I1!%)=$#))&!(]#"
+ "\"Y1%!I-##9)$#Y-&$91(#Y))#Y)##H]\"$I)#%I!!$X]*#9)!\"X]\"!8U%$8Y\"$(Y$"
+ "\"8U!%HI%!XM!$(Q(\"8M##Y!'#(M&#(I'#(E$\"(U\"!(E!\"HE!!HI!$HA'!H=!\"8-!"
+ "$89#\"HA!#89%#(9#\"81!\"(1\"\"(-\"#(5#$8).$()(\"8%!#7U%\"8!!\"GY$\"7]!#GY&"
+ "\"GY\"\"WU##GQ&!GM#!GI#\"GM\"\"GI\"#7I%\"GE$!WA!\"'A%%'9#\"7=#$'A&\"'9#!W5\""
+ "\"79&!W-\"!G1!!W)!\"G)%!'%##G%\"\"&Y#!VY\"!&]!\"6Y$!FU!!VU\"\"&Q##6]#!FM%"
+ "!FQ!!6Q$!6M$!6Q\"!6E\"\"W!&\"VM$!&I!!VM\"\"VQ##FQ)\"6Y#!W%\"\"7!\"#7)##'!%"
+ "\"'%\"\"'1#\"G%##G-)\"71(\"W1!\"G-%\"79$!W9\"!G9!\"W=##7A#$'E(!'I!\"GU\"\"G=%"
+ "\"W=#\"7=$!GE(\"WU##'U$#'I!#8%%$W](%8)(#'Y&!(!!\"']#\"(-#%'Y$#H-##X-'"
+ "\"X9#\"(5\"#X=#\"8)(\"X=##X5'#X=!\"8=$\"8A!!HE!$XE%!HA!\"8I!$8I)$HE*#8M$"
+ "#8Q2#8Y$$XQ*$HU&\"HM!$(]'\"(U\"#(]#\"H]!\"8]!$Y!!#9%!\"I!!#)1#\"9%$$))%"
+ "#9-!#(]!#))#\"8Q!$9A(\"I5!$99($I-##)I##YE&!I1&$99(#IE$\"I9!$I9\"\"I5!"
+ "\"IQ!\"IE$#9=$#9A!%IE$!YA!$)-$$II%$IE&$YA&$IQ\"$)I!\"IM!#YI#\"II$#9A!"
+ "\"I9!#YM#%9M)#9I#\"II!#9I!#IM\"$I=##)Y#$9I!#IE\"#IM+#YU)#Y=##9Q!#9M!"
+ "#9M!#9I!\"9U#$)Q'%)U'%)Q*$)A!$YU#%9M)#9Q!%IE##9M!#9E$$IQ&$)M#%YE$"
+ "#)M%#IM!!YM$$II##YM#\"IU!$)E#%)A!$)Q$$)I'$II##9I!$IE#$9A!$II&$IE%"
+ "$9A%#YA##IE!$YE*#9=!!)A!#9A'#9=!\"I9!%99#\"95#\")1%\"I-!!Y5!#Y%'$I5)"
+ "$(Y'#91$#9)!$9-%!)!!\"95##9)!\"8Y&%9-#$)!%%)%&\"Y!\"#(]!#(]#\"9!#\"H]$"
+ "$(M%#8M$#(M#$(Q(!XQ!#(Q#\"8U!\"9!##8M$!(=!#8E%\"XI\"#(I##(='\"XA\"\"8=#"
+ "\"8A#!(=!$(9\"\"X=\"$(=\"$(1(\"X%#!8-(#H-&!H%%$8%$\"8-!\"W]#\"8%!#7Q&\"W]#"
+ "#7Y#\"WY!&'E$#7U##'Q$\"7M!\"WQ#\"'A!#7M%!WE\"!WQ\"\"79\"#G=$\"GA%\"G)!!W9\""
+ "\"GM$%7)'#'-&!'-!\"7!$!W-!\"'%#!FU!\"&U#!F]!!W!\"\"&U#\"&Q#!FU#\"FU!\"&I)"
+ "!FM!!6M\"!&]!!&=!!&M!#6M\"\"6]$$&Q'#6Y(!&U!\"&M#!F]!\"6Y#\"6Y$#'!'\"'1#"
+ "!G)!!')$!'-#\"G-%#G5'!G5#!GE!\"'=##G9\"\"W=%!GA%\"7A!!'M#\"WM!\"GA#\"GU\""
+ "$GY*\"7Y!\"WY!#7Q\"#8!%\"7]!#']!!WY&\"7U!\"7U!$(-%\"X!##H)#$(!*#H9&$X-\""
+ "#X-!#85\"#H)&\"X9#\"H5!#(='\"8E!!H9!$8A##(Q#$8M##XI&\"8=!!)!$#HI#!XQ!"
+ "$HU$\"(Y%\"XU\"!X]!#(U!$I1##I!&#)!&$))$#8]!$9%#'I%'\"I)$!I-##9)!$I9#"
+ "!Y)!!Y-!\"I1!\"I1!#))#$I5&\"I5!!I5#%I9#\"Y9%#)=&#Y9&\"II!\"I=!$I1&$YE#"
+ "$9I%')5*#9E!!YE!$IE&$IE%&YQ($IE#$YM#%)I/$9M!$YA$$IE##YM##YU\"%)U'"
+ "\"IM$$IQ)#II!%YM.#9Q!$)Y##IM!$IQ&$IU\"$)U##9Q!$IQ&#YQ##9Q!$)U#$)Q#"
+ "\"IU!$YQ##YQ#$9Q!\"II!$)M$')Q*$9I!$)M#$II%#YQ#'9I(#IU!$YY&\"Z!\"#9U!"
+ "#YQ#!YE!$)U#\"IU##9I!$YI$$9M$#9M!%IQ'$IM\"#YI#%)5!#9M!#II\"#YI#%9E)"
+ "#YE#\"IE!%9M)%9=*$99%#YI#\"YA\"$Y1!#Y=##99!#9=$\"9I&$9=%$Y5*#)9#\"Y=\""
+ "%9E)#)1#&)5##I1%$)5*%Y)\"$9-(#X]&!Y)!#(Y&#I!\"$I)'$))!$9!%#I%\"\"8]!"
+ "\"X]\"\"I%!$I!##(U&\"HU!#(U#!XY$#8U$#9!$\"8E!\"(Y.#XI'$(I!#(A!#(M!\"XE#"
+ "#(A##8=$%(=)\"X9##X9!$(1&#(5#\"89!#(1$$()%\"()%#8)%%8%#\"H!\"\"8!!$'Y%"
+ "#7]%$(-#\"7Y!#(%$#7U##WU\"#7M%#'E+\"GE\"\"GE\"!GE!\"'E#\"'9!$'=&\"'9\"#'9+"
+ "\"'E#\"W5#\"'1'\"71&!71$\"&U#\"'-!\"&Y#\"W%$\"G%!!F]!\"F]#!&]#!FU!\"&U#!6Q'"
+ "!VQ$!VM\"\"VQ*!&Q!\"6M$\"&U#\"&I!\"&U#!G!!\"&]'!V]\"\"W!&!G!!!71\"!')!!')!"
+ "\"'-\"\"'-!\"'-#!'!%\"W1##GI#!'5!!GI!!'E!\"G=%!WE)\"7=$#7I!!WM\"#'M$\"'M\""
+ "$7Y$\"GE#!X%$\"GY\"\"7]!\"8!!\"89!\"(!%#(%'\"H)\"\"8)#$X1&#X%$\"X1#\"(-($(1#"
+ "#X5!\"89##89%#85%!8=\"\"H5\"$HA!#8=$%8]#\"XE\"\"XI\"\"(I\"#XE!#(Q##HI%!HU!"
+ "\"HQ!\"8Y)!HM#\"8]!\"8U!\"X]\"$9%%%Y9!\"Y!\"$)%%$Y!'\"Y=\"$))!#Y-#$I-)\"I-!"
+ "$Y1*\"Y1\"\"95#$)1'\"I5$#95$#95$\"I9!#)9#\"I=!%)=(\"I9$#IE\"!Y-$#9A!#9I!"
+ "#I9\"#IE%\"I5!#)I#\"IM$$II&$9U$#)A#$IQ&&IM(%)M!%9E&#9Q!#YQ#$YQ'%)Q!"
+ "%9Q($YY#%9Y\"&)Q(&IM$%)Y'!YU$#YM#%)U($9U($9U$%9Q($9U!&YY%%)Y$$9U$"
+ "\"IU'\"9M#%YE!#)]#!YQ!$YM##I]!&Y]$#)Y&\"YU$$)Y##II\"#9Q!%IU&\"9Y##IY!"
+ "&9M-#YQ&$Y]&$YQ'$YQ##9Q!\"YQ!#9U!#9Q!\"YQ\"$IM&$)A-#YI\"#9Q!$II%#IM$"
+ "\")A%\"YM\"#9I!$Y=!$9E\"$)5$#YA#%)9%!YA!#9=!#9A!#99!#)A#%IY*\"I9!\"Y9\""
+ "!Y-!\"I9!&)=&!)1!!91+\"I1!#91$#I5\"#I-%$H]##9)!#))#\"I1!\"Y-\"$9%&\"I)!"
+ "$8U\"#(]#!(]!\"I%!#8U$\"8Y!#XU&#HE#$HQ&#HQ%#(Q##(M#$HI'#(I##(U##(E$"
+ "\"X=#$XA(\"8=##(9#\"(9%\"X5\"!H5#\"X5\"#89%#85$$(!(#8-*!G]#!X!$\"X%\"#8)%"
+ "\"X!#\"GY'!'U!\"7U!\"7U!!']#\"WQ#!WQ!$'U##7I!\"7E!!GE!#WA%\"'A*\"'A#!79\""
+ "\"75(\"W9#\"G5%!W5$!G=%\"7-$#')'!G)!#7)&!G-%$7!#\"&Q#\"7%$\"FY%#FU\"#FA#"
+ "!&M!!&M!!VI$#&M#\"FQ!!&M!!G%!!6U$!FU!\"&Y#\"&]#\"'!\"!F]!!G!!!W)\"#W!!"
+ "\"'-##'1&!'1!!G9!!G5!\"7A!!GI!\"7A$\"7Q#\"7A$\"W9!#7Q%\"7Q!#'U$$'Q&\"GQ\""
+ "!'M!\"7Y!\"7Y!\"7]$\"7]!\"'Y##'Y$!X%!\"X)&#8-%$(9(#8-%#H9#!(I$#85%#(E$"
+ "#89$#H=%!HA##(I#\"XA%#(A#$89!\"(I\"\"HI$!(I)\"Y!#$8Q(#HQ&&HM*#(Q#!HM!"
+ "$(Y!!Y!'#)!##X]&\"9)#$9)\"#XU#!Y%$!Y)!$)1'!X]'$91%\"I-!$Y1!\")-\"\"9%#"
+ "\")5\"$I1)#IE%#Y-&$I=)#)9#\"Y5%#Y9#\"IE$%)A%&91$#IA!#YE\"#9E!#)E##9M!"
+ "\"II!#)I#\"9E##IM\"$YE*\"9I#%YQ'#I]!$)U##9Q!#9I!#I]!#9U!%)Q$%IY)#Y=\""
+ "%IQ*%9Q($)Y#%I=#%)U'$)U#\"IY!$)Y##9U$#9U!%I]#'J!'$)Y#$9Y$$*%&$IY&"
+ "!YY!$)Q#$Z!##Z%)$I]%$YY##YY\"\"YM\"$IY&%YI!#IU\"\"IY!$)M$$9Y$\":!#'9]+"
+ "%9Y(&YU$#YI#')Q%$IU%$IU%$)U##J)!\"9E##9U#$J%%!YQ!$9E\"$IY\"$)I#\"9M#"
+ "\")I\"#9I!$YE&#9U!$9A$$I]\"#99!#YI##9E!#IE!#YA#\"IE!#9A!#Y9##I9\"!)5!"
+ "\")E%#)9##Y=&$)1'#)5##)5##))#\"I1!\"Y1\"%)I!\"I-$\"I-$$)%'#9)$\"Y%#$))$"
+ "$Y%%$I)##X]!'I%*&(]&%HY$#8Y$#(Q#\"HM$#8U$#(]&\"H]!\"(=\"#XQ##(I#\"8Y#"
+ "$(A(!(A!#8A$\"H%!#X='#H=##(9!#X=$#H5&\"X-#!(9!\"H)\"$H-*\"8!!\"8A!\"8%!"
+ "!H!#\"(!#!GY#\"W]!#WY$\"7U#\"7Q!\"WU#\"7Q!\"WM#\"G9\"\"WY##7]%\"'I#!7A$!'9!"
+ "\"'=##'I$\"75$!G5!!71\"\"'-#\"'-#!'!!\"7-$!G!!#'!%\"VU#\"&]#!FE!!F]!\"&U!"
+ "!&I!!FM#!VE&\"6Y&\"&Q#\"6=(\"'!#!F]!\"&]##'%'#6]$!W%$!7)%!G)!\"G-%\"W1#"
+ "\"'1##'5\"\"75$!'9!!G1%!G=!\"'1#$79%!GE!\"WQ#!7E\"%GU&!GE&\"'=!#X)'\"7U#"
+ "\"GQ\"#'Y$\"WQ#\"8!!\"W]#\"X1#\"(%*\"()*\"8%!#81%$X-+#H!!%(=)!85\"#H=%#(=!"
+ "#XI'#8A$!HA#\"X=\"\"8E!\"XQ\"$HM*\"XQ%\"8A!#H]\"\"8Q##XQ#\"XE#\"8U!\"8Y!\"Y-\""
+ "$H]&\"I-!#(Y!\")!##9)!#9%$\"9)&\")1\"#I)&$9)(\"Y1(#)9##))##91!!Y5!#I5\""
+ "\"I9!!Y9!\"I9!!Y=!\"II!#Y=##YA##Y9#$IA#&I=(&IE$%)E(#IA!'9E+%II##99!"
+ "!)Q!#9M!#9=!'9M'$)M$#YQ#%II#$)Q$#IM\"#J!!%YE!$)Y##IY!#IQ!$9Y$$I]&"
+ "&IY.$:)!%YM.%)M($Z!&\"Z!\"%9])$:!$$I]&$J%&%)]($:-#&)Y!$:!$#I]!$:)!"
+ "#I]!$9]$%IY*#J)!#J)!%YU!$IQ%#IY!&*!$%*-'!I]#$9U$#Y]\"#YU\"\")M%\"I]'"
+ "$)Y##Y]\"#IY!#9U!#9Y#\"YY!$9]$')Y\"$)Y#\"YQ!#9I!#9U!\"IE$%)M!#IY!$IQ&"
+ "#9Q!#)Y&#YQ#%)M($9Y$%9I%$9E%#YI#\"YM\"!9I\"#IA\"%9E\"#Y=\"$)A!\"9E&#91!"
+ "#9A!&9=&%Y=!\"I=!\"IE!#Y5##I9\"\"I9!#Y=\"#I-%\"Y-\"#91$#9%$!)5!!Y)!\"I)!"
+ "\"8U!$Y-(!Y%!$)!$\"I!!\"H]!!Y!!#XY!&HY)#)!##8U$#8Q$!(Q!#XI##HQ%#HY%"
+ "#8I$#8M(\"XI\"#XA!!8E\"#(A!#85%#X5'\"89&\"85#!(5#%(1$\"(1##H5&$8!)!(5!"
+ "#(%$#85\"\"8-!\"WQ#\"7Q!#GU$\"X%\"\"WU##WU%\"WY#$'M!#'Y$#WQ'\"WM#!G=!\"'A#"
+ "#'I'!W=\"#G1$\"79&!71\"!W%$!W1&!'-!#')\"!79\"!W%\"\"'5#!W)(#F]'\"&Y!!FU!"
+ "!7!%!FY#\"VI&!FU##&Q#!6U\"\"6Y#!F]!!F]!!6]\"\"&]\"!G%!\"'5\"#G-)!'9%\"'%#"
+ "\"G1#\"75,!W9\"!G1!!W5\"!W5\"!GQ!!GE!#7Q#\"'Q##8%*\"7U!\"WQ#\"WU#\"GY\"!WM)"
+ "\"W]#!G]!#()$\"'Q\"#(%&$(%(#H))\"(1\"\"H-!!X)!\"HA\"\"85!\"85!\"XA#\"X=##(E$"
+ "\"X=#!HA!\"8A!\"HE!\"(I%#HE%%8M'#HQ&#8M$#(U#!)!!$)%!#(I##XY&#(]#&)%*"
+ "#8]$#91!$Y%!$I!$$I%'$Y)(!Y%!#I-\"#I-%#)9##I%%#)-#%I9.#)9##)A&$I9#"
+ "\"I=!\"I9!!YE!!Y9!$YU'#9M!$IE##9=!!IA&#YM&$)I$%)E!%)A$$9A%$9M!%)Q$"
+ "%)M(%YQ$!YU!#YM)$YI*$)]&#9Q!#IY!#IU!$Y]&$9U!$)]#%*%'#IY!$IY\"#:!#"
+ "#Z!\"#Y]\"#I]!$Z!\"%)]$$9Y$$*%##J%!$Y]'$:!$%J)*&*%!$J%&&*!($9U($I]%"
+ "$:%$%*-'#YY\"#J%!$*!#$9Q!#J%!\"YQ!\"J%!$:-$#IY!%*1##J!!!*!!\"J!!$J!%"
+ "%)](#9]$#I]!$9U$%)Q!!YQ!#J)$$YM#$)Y#$9U$$IY\"%)Y!#9M!&)](#9I!$)U#"
+ "$9M!&)U$#)U##9Q#$*%##J%!\")M,$IU%$)M##YM&$YI&\")E\"\"II$$YE##YE#%)-("
+ "%)E$#IA!&9M&\"I1!\"YM\"\"I=!\"99#!)9*#9-!\"I1!#95!\"I9!#))##I)&#95$\"I)*"
+ "#(Y!!Y-!!)-!#I%##I%##I!#%)1(\"I)!$8]\"#8Q!#(U#!(U!!8U(!XQ!\"8Q!!HE#"
+ "\"8E!$HI$\"8I!\"XE(#XY#!XA!#H5&#(I##(5$!(9!#(5$$85&#H)#$X1#$8-&\"X-\""
+ "#85'!WQ'\"8!!\"X!#\"WY!#GY!\"X!#\"(%%#']$#'U'\"WM##WA'\"WM!!GQ%#'I$!GE#"
+ "$'A&\"7A$\"'=!!W%\"!G=!!WA!#W=%!G1!\"7%$!'E%!G)!!FY!!F]!\"6Y$!F]!\"6Q$"
+ "!&M'!FM!!FY!\"&U#\"&U#\"&Y\"!FU!!V]$!'!!#&]'!'%##7-#\"75&!G-!#7)#!G1!"
+ "#'5&!G-!\"GE#!WA!#7A(!GM!\"7I##GM&$'Y(\"WA!\"WQ%!GQ!!WQ$#7Y%!W]!\"7]!"
+ "!'U!#W]%\"X-##85%#()$\"85!\"(%#\"8!!#(1!$(9(!H-!\"89!\"X)#$(E'\"(=\"#XA'"
+ "\"8A#\"X=#\"HE!#XY#\"XM\"\"H9!#(I#\"(I%\"8U!#9!!#8I\"$XU$\"(]\"\"Y%##XI!%)))"
+ "#9)!$)-$$Y-$\"I-!\"Y%##)1##Y5##9=!\"I5!\"Y1\"!Y-$\")5\"$I1&#Y)&$9I%\"I9$"
+ "#)5##YI##99!#)E##IE\"#IE%!YI!$9A$#9E!$9M!\"YM\"#9U!$)A$#YQ##9A!#9U!"
+ "$9I$#)U#$9]!#II\"$99%#9]##J!!%9Q)&9Y\"$Y]'$9]$\"I]#$:!$%YI!#9U!#Z)\""
+ "\"9]\"$J!%$JA!#J!!#YY\"#Z!%$:!!\"Z%$\"YY$!Z-!$Z)##J-!$IY&#J!!%)]!%Y]'"
+ "$J!&$*%##J1!%*!#%J-%!*%!%)I%!*-$$I]\"#Y]\"#9U!$*-#\"J%!#J)!\"YY\"$*!#"
+ "$*!#$*%##J!!!YY!#J!!!YQ!$*%#$J!%$)]##J!$#J)!#)]#$)]#&:!&#IU!#YY\""
+ "%Z%+%9U\"$9U$#IU\"#IM%\"J%$#9Q#&II($9]'$9Q!$YM#$YU#$II%#9Q!#YE\"#9I!"
+ "$)=$$)A!$II&#)A&$YA$$IA\"\"I=!$YE&\"I1!#))##)9#\"))\"\"I5!\"Y-\"\"XY\"!Y-!"
+ "\"91##)-##))#\"Y-\"#)5##Y)##(Y!#9!!&Y!.\"X]\"\"I!!\"HY!#8]'$(Y'#XI'!8U%"
+ "#XQ&\"8Q!!H]!\"8Q!&(M!#H5#!HE!!8M%\"HA!#H9&\"H=\"#81%#X5'#(5!\"X-\"#8-\""
+ "$(-(\"8%!$(5&#H%&!H!#\"8!!$GY#$(!%#'U$\"WU#\"GA#\"GQ\"\"7M!#7M%\"7]!#7I%"
+ "!WU\"#'5'\"'E#!G=!\"'9\"#'9$\"'5#\"7-$#71%\"G5$\"'-!!G)!!G%!\"G%#\"FM#!FY!"
+ "\"'!##&Q$#&U'!FU!!&]!\"&Y\"!F]!!G!!\"'!#\"'-#!')#\"W)\"#7)#!G1#\"'1\"!G=!"
+ "!W9\"\"7M#\"'=#\"'Q#\"W=%#GM(\"GI#\"'E#\"WQ#!'Q!#'Q$!'E%\"7U!!'Y#\"W]#\"W]!"
+ "\"WU#!X%$\"8%!#X%'#81%%(-'#X1&\"81!$(5(%(=&#(=!\"H9!#(=##HA\"\"XQ\"%8=$"
+ "\"8E!!HM!\"8E!!89\"#(M#!XM!#(U##(Q#\"XU\"%8Y&%)!+!HY!#(E$$XU%%)!##Y1#"
+ "#)%#\"Y)\"\"X]\"!)1!#I5%$)9$\"Y1\"#Y9#!Y5!#YE%#Y5##I=%$9=%\"IM!#YQ)$)A#"
+ "#YE#%9Q)%9A\"!YA'#YI##YQ%$)U#$YA$#YM\"#YQ)%)=!'9M+$9Y!#9U!#IY!#)Y#"
+ "\"IM!!IY#%YU*#YY\"$*%'\"J!!#)]##I]!%9])#9Q!$*%#$Z!#$:!$'Z!%!J!##Z!\""
+ "#Z%&#J%!#Z%\"#J%!!Z%!%IM&$J1%#J!$\"J%!$*)#%:1!$J)\"#J1!$Z!\"#Z!\"$Z!#"
+ "#:1##I]!%Z)##J)!#Z)\"\"J!!%J)\"%Z-#$J%!#Z-\"$:-$#*5\"$:%$#J-!#I]!$*!'"
+ "%*%##J5!$:%$$:%$$*1#\"Z-!#)]##Z!\"$)]#$*%#$9U!$*5#$Z%&$)]#$)Y#$)]#"
+ "$I]%$)]#\"YU\"$9Y!$I]&%9Q(%*!!\"IQ!$IE%$9Q!%9Q($Z%#$9Q%%IQ##9I!#9I#"
+ "%II*#9=!$)I!$95%$9U!#Y5#$IA%%99##Y=#%9A#!9I)\"Y1\"$Y5*\"9M#\"I5!\")5%"
+ "#I5\"$I-'#)5#\"Y-\"#Y)&\"I%%%9!&$I)&#9!!#Y!#&(Q'\"I!!#HU%#8U$#(M##8M$"
+ "\"8Q!#8U$#XI'\"XM\"#(I#!HI!\"XA#\"XE\"!HE!#(A$#(I#\"XA#!(9'#X5&#81\"\"(1#"
+ "\"X1#!8-\"#H)%#H)%%'U\"!GI!#7Y\"\"G]\"\"W]#\"'Y%\"WU##7Q&!WE$\"7U#\"7E!$'M&"
+ "$7M&\"'M#\"'9\"!7A$#'5&\"G9\"\"71&\"W5+\"'1!!'-!\"G-\"!G-#!G)'\"'%!\"7%$#VY$"
+ "!&Q!\"W%#\"&U%\"F])!VU\"\"F]%!V]&$FU)!G%%#7)%!W1\"!G)!\"71#!G%'!W5\"\"G=#"
+ "\"G-$\"'E!!G9!\"'A#!WA\"\"'A!#GM$$'M!\"8%!#7Q(#GU&!GY!#'Y$!WU$\"7Q&$H!\""
+ "#(%$$X%#!X!!\"8)!!8-%#(5#\"89!!(5!\"X5##XI##(=#\"H=!#8A!$(=%\"XE#!(9#"
+ "\"XY%#(U##XM!\"X]\"$9!($(]!\"8M!\"HM!!HM#\")!##(]#\"I!!#Y%$$I!'!Y!!#I!%"
+ "\"I)!\"9-#$Y1!#I)\"\")=%$I1#\"Y5\"$)9!#95$%I-$#9A$#Y=#\"IE!$)I#\"I=!$9M$"
+ "\"Y=\"%)I%$9Q!#9Q!')I*\"YQ$\"9M&&)I\"#YQ\"\")Q\"$9I\"#I]!%)E$$YY#$)U#%)Y!"
+ "$)Y#%)I%#IY!$)]#%I]*$I]%$J%!$9]$#Z!\"#Y]\"#J)!$Z%&#Z%\"#Z)\"#YU\"%:)%"
+ "%*-#%:)($*-*#Z!\"#Z)\"$*)#!:)\"#J-!#Z-\"#Z-\"%*-'$:-!\"Z1!$:-!#Z1\"\"J-!"
+ "&*-'#*)\"%Z5-#J1!$:-#$:-!$*%##Z5\"$Z1&#J!!#J%!%Z-#!*-!\"*)%#Z1\"&:%%"
+ "%*)'!:-%#J)!&:5)!Z)!$Z%&#J)!#J!!%:%!#J%!#J=!#J%!$:!!#:5#$Z%&$:!$"
+ "$*%#$J!%#9U!#9]$$*!##IQ\"\"9I&$YU'%IY&#)A##IQ!$9]$%)U(#YM#&)]($)U#"
+ "#9U!%9=)\"I-!#YI#\"YQ\"$IE#!YE!#YI&\"9I#%YQ!#Y=#\")=\"\"Y=\"$)9!#)9#!)1!"
+ "#)-#$I9##I1%#)-##I-%#))#\"Y)\"\"I)!$9%%$I5&#I!%#(]##XQ'!Y%!!9-\"#X]&"
+ "\"XM\"#X]&$8I#%8M*#(M#\"HY!%(I#\"89#$8E&#(A#$(E$#H9#!H=+%HA##X1'$X5+"
+ "!H1#$(-%#GY#\"8)!#X-'\"8!!\"X!#\"7]!!G]!\"7Q!\"WU#\"GY\"\"7U$!'Q##7Q%%7I("
+ "!GM#\"WA#\"'Q\"\"7A##'9$\"7=!!GA!\"'9!\"'-!\"79$\"GA%\"71$\"6]$#&]\"#7!&\"&Y#"
+ "!FE!\"&M#!6Y\"#&Y#!F]!!F]!\"7!$!VQ\"!G!!#7)'\"'-#\"G1\"!'5$!G5#!G9!!WQ$"
+ "\"'=#\"GA##'9'\"GU\"\"GU$\"'I!!'M&\"'A!!WQ!#7U%\"W]##8!%!7U\"\"WU#\"X)#\"H-\""
+ "\"8!!!H-!\"(!##(5#\"X-##(5$#H5&\"HE!#(5&$HE*#8Q$#(I#\"8A!\"8E#!(A#$(U!"
+ "#HM&%(Q##(Q#\"8M##(U##(U#\"Y%#\"XE\"#XY&$))!#9%!#(U!!9)\"#XQ#$))$#9%$"
+ "\"I1!\"8]#$Y%'$)1$#95$#I5\"$I=&#Y9#\"IE!\"9A#%)M!$Y=#%)A(#9E!$9E%#9I!"
+ "!YE!#II!#9M!$YU&#9M!$IQ\"$)U#$IQ%%*!$$IY%$IQ&$:!!%)Y'\"IY$#Y]\"!9]&"
+ "!9U\"$9U!#J!!%:!$$J!&#Z!\"%:%!\"IY$&J%&$J))%*5#$*%##Z1\"%Z)'$Z1&\"Z)\""
+ "#Z%\"!:-)#J-!')]&$:%$#J%!!:1\"#Z)\"#J-!!Z-!'J1*$*)#$Z1&$:!!$Z-#&:1%"
+ "$J5!$:1##J5!\"*5\"%Z1&$:1!#J1!#J-$&:--$:1$#J!!&*-!\"J!!!Z-!%J-\"#Z)\""
+ "%:%!#J9!%J-\"#Z-\"#Z!\"$:%$#Z)\"#YY\"$I]\"$:1##J)!$:)!#Z%\"!*!!#Z%\"$)U'"
+ "$YU#%)Q$#Z!\"#Z%&$J%%$)]##Y]\"$9Y$$)M##:!#$*!#%)Y+&)I\"#I]!%*)$#Y=\""
+ "%)Q!$9Y$$)A#$*)#$)Q##YI##IQ%#YE#$)E$%9M%$YE'#YE\"#9-!\"IA!$95(#Y5#"
+ "$)9!!Y1!\"I9!\"Y1\"#)=#!Y=!#)-##)%$$))$%9%*$)!!#Y-##I!%#)%##(]#$8U\""
+ "&)%*#XQ!\"8Y!\"(Q%#I)%!H]!#XE&\"I!!#XE&\"8E!#89!#(I$#89%#(A##(9!#XA!"
+ "#(5!\"X)#\"81!\"X-#!H1!#H%(\"X)#$X5%\"H%!$'U#\"8!!!GY!!X%'\"GY\"$'U#\"7U!"
+ "#WI%\"7I!\"GI#\"'9#\"GE%!G9!\"G=%\"'5\"\"W9(!G1!\"G1%\"7-$#'-%#'!'#W)##'!'"
+ "!G)!!&Q!\"F]#\"&U!\"7!\"\"6](\"'!#!W)\"!G1!\"'!!!'5#!71\"\"'5!!G9!\"G9\"#'-'"
+ "#G))!'=!\"GA$\"7Q&#WE%\"WM#\"WQ##7E(\"WU!\"7U!#G]!!WQ$\"(!#\"H!!#(!$#G]!"
+ "\"8!!\"8M!\"X1#\"85+!X=&\"X=#\"X5\"$H9$\"XE\"\"XI\"#(5$#(E##XM$\"HI!$(I%#8M$"
+ "#8E$#)!#\"(I\"\"8Q#$(Y(!HY#\"HY$#X]##)!'$XU!$8]\"!Y)!#I%\"#I)%#)-#$)1!"
+ "#Y1##I5%$)5'\"I5$!9E\"#)5#\"Y-($)5!$9=\"#)M#\"9=#$YE&&9A-%YE!!IE)#9A!"
+ "#IM\"$9E\"#YA##YQ\"#YE#%YM$$)U#$)U#$9U!#IY!#YM%$:%$%Y]-#I]!%Y]#%YU("
+ "$)]#&*!!%:!!%:-(#J)!#I]!'*-!#Z9\"$:)$$J1%&J-'%J%&$9]!#J1!&*-+$*%#"
+ "#Z1%$:)$$:1##J1!$J1!\"Z1!$Z=&#:1##Z1\"%J1\"$J5%#J1!#J9!$:E##Z5\"%*5'"
+ "#J1!$*5\"%Z5&!:5\"#J5!#J5!#*9\"$:5#%*5##J-!!ZI!%:5(#J9!$Z1\"\"J1##Z-\""
+ "#J1!$Z1\"#J%!%*1##Z5\"\"J1!#Z-\"$:-!#J-!$*-'#Z5\"#Z-\"$*-#%:)!#I]!$Z%\""
+ "\"J)!#J-!$J5!&Z)+#:-#$J-\"\"J%!':-*$)]##YQ\"#J!!\"YY$$IY%$*!##9U!%IQ'"
+ "%9Q)#9Q!%I9!#YQ##IE(!YY$#9I!&)I,$9M!#YE\"!YI!#9E!%I1'&)E&#I=!#Y=#"
+ "!I9)#95$\")5\"%9-'#Y9#$9-%#)5#\"I-!#)-##))#!Y-$%)%)%I%!#I-\"\"I!!\"Y1%"
+ "\"XU\"\"HQ!$9!#\"HU!!8U\"#8U$#(U#\"XM\"!(E!#(I#$8E)#HE#\"HE!\"85!#H=\"\"X9#"
+ "!()!\"X5\"\"8)!!8-\"#H-#\"81!#8)%\"X%\"\"GY\"\"7]!\"8%##'Y$\"'Y#!W]!\"W]#\"WQ#"
+ "\"WQ##GQ!!GE#\"G=\"!7Y%\"GE%\"W=#\"'9\"#W1%!W9&\"G9%#'1&!W5\"\"7%\"#'!'\"G)%"
+ "!FI!!VY\"!G!!\"&Y!!W!$!G%!!G)!!'9#\"G-%\"G1#!W1\"!W5$!W9!\"'I!!G1!#79'"
+ "\"WA%\"'E##GI&#'A$\"7M!\"GQ\"#'Q$\"WU#\"WY##7],#(!$#X!!#8!\"#(!$\"8)!#(9!"
+ "\"8)!\"X-\"\"8-!\"(5%#X-$\"X-\"$HA$$H-$#8A%!8=\"\"(=(#HM)#8Q$\"X]\"#XU##(Q!"
+ "#(Q##(]##XY#\"8]!$XI%$(]'#H]%$X]$'9%/#I!#\"I)!\"I)!!95\"#9-!$)1'\"I5!"
+ "!Y9!#95$$9)%$99\"!Y1$\"YE\"$)I$$95\"$)A$$YA$$)E#&9E##9I$$9Q!#9M!%)E("
+ "#YQ\"&)Y,%)Q$$YY&$IU%%)I($IY%!YY!$IY(%I]*$IY)$I]\"$I]\"\"9Q#$*!#&*)!"
+ "%J%\"$:%$%J)\"$J)%%*5'%:%!#Z%\"#J)!#J5!$:-#!*-!#Z-\"$*5\"%:1)#JA!\"J1!"
+ "'J-'%J9\"#JA!#J9!$J)%$J5!#)]#%:5!$*A#%Z=#$J5!\"Z5!%J9)$JE%#JA!#J9!"
+ "$*=##*9\"\"Z%\"#Z9\"\"*1\"#J9!\"Z9!%*=#\"*1\"#JA!%:E(&*9+\"Z5!$:)!\"J%!%:1!"
+ "!:-\"#J1!!9Y%#J)!#Z5!#Z9!!Z!!#Z%\"$J1($*5##Z!\"\"Z1!!*-%%:)!#J-%!:-\""
+ "%Z5#%*)##J)!!Z)!#J-!#Z-\"#J%!$J%)#I]!#Z!\"':)&%J))$I]\"$Z!##9Y'$)Y#"
+ "#9M!#YM\"#9U!#I]!#IQ+$9M%#)Q\"%)Q!$)I##IE!$II##9Q!!IA)%IE$!)A!&)-#"
+ "#Y9#!)=!!)1$\"I-!!)1!#)-#\"Y5\"$Y5$\"Y1\"#)-#%)!\"#Y)&$Y%+$)9!\"I%!#9)!"
+ "\"I)!\"8Y!$(]$#8]!#(I$#8]$#HU%\"HQ!#(M!\"8M##HI%\"XE\"!HA!\"HE!#HE\"%8=%"
+ "\"85!!H=!!(5!#85\"$H1*#H-#$(-##81\"\"H!\"$H%(\"8)!#(!$\"7]!$H!*\"8!!\"7U!"
+ "#GM&#WU'#8%$!GI!\"GI\"\"'E!!7A\"\"GA.\"G-'\"'9\"\"G9\"$79$\"'=\"\"71$\"79#\"7!&"
+ "\"&Y!\"&Y#!&U!\"W!(\"&Y!\"'%#!'1!!W-!$'-(\"G)'\"G9$!79\"!W=\"\"7I$#'A%\"'A#"
+ "!GA!\"'9!#7I%\"7Q!\"GI#$GQ\"%'Y'$'Q!$7Y'\"GQ\"$7]$#W]%!H1!\"8%!#(%$\"(-\""
+ "#8-%#(5!\"X5#\"85!\"8=!\"X=##(9!\"XA#\"XE\"\"89!\"(I\"\"8A!#(I##HM%!XU$$(U%"
+ "\"8Q!$I!'#HU%#(U#\"I!!$(U'&)5&\"H]!$)!!!Y)!\"9-##I-%$9-+#9-!\"I-!!Y9$"
+ "#)5##99$$99%#)1##)A##9A!$IA&\")E\"%IE*#9M!$IU\"#YM#$YM&$YU'$9Q%#99!"
+ "$)Q$#9Q!$IE&%9U%#)Y\"%)U!%IY'!YM!$9]!$*!#%:)($*1#$*1#$*%#%:%(#J1!"
+ "$Z%##J)!#Z)&%:-!%YY$#Z-\"%:-!%*='!Z5!%*5'\":5\"%:5+(*9!#J5!#J)!#J1!"
+ "$*A&#JA!#J9!#Z9\"$JA!#Z5\"':1\"\"JI$$Z9\"!*9$$*M\"#ZA%\":E\"#ZA\"$J%&$J=%"
+ "$:=$&*E(#J=!\"Z=!#J9%\"Z=!&:=,#J9%$ZA\"\"ZU!#Z9\"%JM)\":5*$J9!%:=!$JA!"
+ "$J9!%:5(\":5\"!*%!%ZM\"#J5!$J5!#:5##J5!$Z5\"#Z-\"#J1!\"J1!!Z9!!*5!\"Z%!"
+ "#Z-\"#J1%\"Z-!#J-!#Z)\"&Z%!$IU\"$J)\"$J-!%*)'#Z%\"$J!&#*!&$)U#%9Y%#I]!"
+ "$)]#\"IY!!)Y!#9Q!$9]$%)U!%IQ##YE#$)E#$IM\"\"IM!#9M$$)9!$)E#\"9E#$IA#"
+ "#IA!#YE#$I=&#99$#9)$#)9)#I-(\"Y5\"%91&\"Y=+\"I-!\"I!!#9%%\"Y!#$Y%$#))#"
+ "$I)&\"H]!\"8]!$)%!!HQ!\"8Q!#(]##(Q#\"HQ!#(A!\"X=#\"8I!#HI%#8E%$(A($8A)"
+ "\"8A!\"X1#$H5*#(1$\"81!#81%#81\"\"H)%#H)##8%%$H%'#H!&#H!$#X%'\"GM\"\"WU!"
+ "#WQ'\"GQ\"\"WQ%#7E%!'Q#\"GI\"#7A%!'A!#'E'!G%!\"WM&\"'-\"\"W5%\"'1#\"'1'!W-!"
+ "\"'!#\"V]&\"G%\"!W)\"\"7)$\"7%(\"W-(\"71#!V]\"!G-#\"75(#W9\"#7=&\"7=$\"7A$!G9!"
+ "!GI!#7M%#WM'\"WU#\"WQ#\"7Y$#7Y%\"7Y!#'Q\"$WU&#8!%!H!!\"8)!#85%$8-!\"85!"
+ "\"81!\"X5\"\"85!!(9!#81\"\"XA#$H9%!HA&\"8E!$XI%#(I!#(M&!Y!$!HQ&\"(Q%!HE&"
+ "!HY!$8Y\"\"8]!\"Y%#$)1!#9%%#I!#\"I%!#))#\")-(#Y1##)1##)-#$I5#\"Y1\"\"Y%\""
+ "%)9(\"Y=\"#9M$$)A$#I=!#9A!#YE##IE$$YI'%99)#IE!$9E$#9Q$%)Q!$)I!$YI#"
+ "%YU*#J!!$)Y##9]$$IY&!YM!%YU#\"Y]$%Z5\"\"Z!%\"J!!&J)*#Z)\"#J1!#Z)\"$*)#"
+ "$Z1&#J)!#J-!\"*-\"\"J)!%*1#$:!!#*9\"$*5#&:9($J5!$:E#$J5!#Z)\"$*9##ZA!"
+ "#*=\"#ZE\"$J9!#J=!#JA!#JA!$Z=%#ZI\"%*9'%:=$$:9#$J=!$*A#$ZA&&Z5#&:E!"
+ "%*A'!:A\"$JE$$JI$$*A#(:9.%ZQ%$JQ!&*=($JA$&Z=.\"Z9!#J9!#Z=\"#Z=\"#Z9\""
+ "#Z=\"%ZE\"#JA!$J-\"$*=#%:=($*5\"#J=!#J1(#JE!#J=!#*9\"#Z5!$:5$#ZA!\"Z-!"
+ "$:9#\"J1!#:-##JE!#J1!#*-\"%J))%:)!$IQ&$J1\"%*1+%J!\"#J%$%:!\"$9Y$$IY%"
+ "\")Q\"$9]!$Z%\"#)Y-$)Y#$YM'$)]#$9Q$$IU\"#YQ#$)Q$\"J)!#9Q!#9A!$)I$$IA&"
+ "$I9#$9=%$I=#$)9$!I5#$9=%#9-$%)A\"\"I5!#Y5&%)1(#9)$\"I-!\"9-##H]\"\"I!!"
+ "#9)!#)-##I!\"#XY!%(M)#8Y!!8U\"#(]#\"9!#\"XQ\"%XE##8M$#(M##XM!!HI&$8=("
+ "!HA!\"X=#\"8=##(5#!(9$#H5&$(%(\"WY!#X-$#(-$\"X)#!H%!!H!!$'Y!\"8!!\"7Y!"
+ "#'E$\"WU!#']$#7I##WM\"\"7Q!\"WI#\"'E#\"7I)!G=(\"W9!\"G5%\"79&\"WI#\"')\"!G1!"
+ "!6]\"\"6]&\"'%#!7!\"#'))\"W-&#7%*\"'1!\"'5##W1*!W9!!W=!\"GA%\"'9\"\"GE\"!GM!"
+ "$'Y&\"WY#\"GI#$'M#\"7U!\"WY%$GM#\"'Y%#GY$\"WY#\"7]##X=$!(%!#()!\"81!#(1#"
+ "#H-##H5#!HA&\"8E!\"X=##(A##XE!%8E$!(E!\"XI\"!XI!#(I$\"HQ!#XU!#(I#%(Y\""
+ "!HU!#H]\"\"Y!##9-!\")!#&)%'#9)'!Y)$#9-!#9-!$9-%$Y=*#91$%I9$$95\"\"I9!"
+ "#9=$#Y=#%I9.$9E$\"IM!#YQ\"#YI##9=!$9M!#YM#%IQ*$YU##YI#$YY'$)U#$YY'"
+ "$)Y##YY\"#I]!#YE#&:!*\"J!$$Z!'$*%##J%!%J-\"$J-\"\"Z)%#*%#$J-%#*-\"$J-\""
+ "$*)#$:-#\"J1!#Z5\"$J9%#Z)\"%J5)#J5!#J9!&:9%#:5#\"*=\"%J1\"#J9!$JA!!:E\""
+ "$Z1&#Z=\"!Z%!#Z5\"$JE!&JA-#JA!\"ZI!#JA!#JA!$ZA\"$*=)#Z=\"%*I#$*Q\"%JE("
+ "!ZM$#ZI\"$ZI&\"ZE!#*A\"#ZQ!%ZE\"\"ZM!#ZI\"#*A\"#J=!$ZM!#ZA!#ZA!$JQ!$JQ%"
+ "#JA!#J=!$*A##ZA!#J5!&JE)#J=!$JA!#ZE\"#J1!#J9!$:!$%:E$#J9!\"Z9!#Z5!"
+ "#Z-\"!:%\"%:9!$J1\"\"Z1!$*!##Z-\"!:-%#Z-\"$:-!%Z-&&:))$:)$$:%$%*!($9]$"
+ "#)]\"&J!#%J!&$J-%$*)#$9Y!$9Y$%YM!$)U##YU\"\")Q\"!9M%#9M!$)]#%IA'#9M-"
+ "#YM\"\"9I#$YU#%)=(#9E!#Y=&\"9=##)A##9A!!9-\"#)5#\"I!!!91%\"I-!$9E%!Y)$"
+ "&)9\"#HQ\"#I!#$9!##)!##(M##9!*$(I'#I-%$(M%\"XU\"#(U&!(=!\"HQ!!8E%$(E%"
+ "!HM#!HI#\"X=\"\"X=\"\"(!##85%$8=##(=!#H-#!(9!\"H)\"\"X!!#(%$!X!$$H!%\"W]#"
+ "\"7U!\"WY!!GU!\"7Y!\"WU#!WE$\"'I!\"GE\"!GQ%\"G1$!GA!!'A$\"7M!!G)#\"W1(!G1!"
+ "\"'!%!6]%\"'%#!W)\"\"G5\"!G-#!W-!#75%#'5%\"G5%!W=$\"GA%\"'E#!'A$#'E$\"7]!"
+ "!GM#!W]\"#'E$\"WU##WY\"#W]'#7M#\"X%#$(%(#X1&!X)\"#H)#\"89!$H1'\"X)#!HA!"
+ "#(9$\"8=!$8=##8-%#H=%\"XE\"\"8E!#HI\"\"HI!$XM+$8Q)\"HI!#HU%#HU%$(Y'#I)%"
+ "\"I!!#I)\"#9)!\"I)!#9!!$9)+\"I1!#Y%$#Y)'#Y)#\"Y5\"#Y%'#Y5#\"I9!\")A%$9=!"
+ "$)E#$)I!\"9E#$)A#$)A!%IA*%YI!#9=!#IE\"#IY!!YU!$9M!$*!##YY\"#Z%\"#9Q!"
+ "\"IY!$YU#$:!$$*!##)U#\"Z%!%I]*$*)##J-!$J%!!J-#\"Z9!%JA%$9]!#Z!\"$J1!"
+ "#J1!#Z1\"&JE)%*9#%*I'#JA!$:9$!Z-!&J9\"#Z9\"#JI!#J=!$:E$#J5!\"ZA!#*A\""
+ "#ZA\"#ZQ!#JA!$:)$\"J1!#ZI\"#JE!$JE!$ZE&#JE!#JE$\"ZE!$JI$':E%$*I\"%:U'"
+ "$ZI&%*I#\"*Q\"#*]\"%:I$%*Q'$J=!#ZI\"#JM!%JE)$ZE\"#JE!\"ZE!$:Q##JA!\"ZI!"
+ "#*M\"#JE!$ZE\"%*M\"#J=!%:A(#JE!#*=\"&:E!$*=\"$:=##JA!#Z=\"%*9&#JE!#*9\""
+ "!Z9!!ZA!#J5!$Z-&\"ZE!&*)(\":1##J9!!:9\"%:1!#Z)\"$Z!\"#*-\"%:)!#J1!!YU!"
+ "#J%!#J%!\"J!!$Z!'$*%#%9U)$Y]&#9]##Y]\"#IY$\"IU#$IU%#IQ$#IU!#)Q#))U,"
+ "$9I\"%YI+$9A$\"I5!\"IA!#II!#9A!#)=##)A#\"YA\"\"I9!$9)(\"I5!\"Y1\"%Y=,!9-\""
+ "!Y9!#HQ%#91!#Y%##Y-&\"9%#$(U$#X]##X]&#(Q#!8Q\"$8Q\"\"HQ!\"XQ\"$XI+\"HM!"
+ "\"XE%\"89!!8E%\"X1#$8E&#H9&\"HI!\"(5\"#X1'#(=!!X-!\"8)!$85)\"H%!\"H!'!()!"
+ "$7M$\"W]##7U%#(%&\"WQ!$WQ+#GM&#'E$#GE&\"'A#!7A$\"GA#!GA!!75'\"G1)\"'E%"
+ "!G)!#G%\"#W%#\"71#!G-!\"71$\"W5#\"'5\"\"'I)\"'E#\"WA!!G5!!GM!\"'E!#7A!!GQ!"
+ "\"WU!\"GU\"\"7U#!7]$!GM%\"8!$\"GU\"\"X)%#X%$!H)#$89(#HE\"\"X5\"#85'\"X5#\"89!"
+ "\"(1##8I$\"XA\"\"(I%$8M#\"(A\"#HM##(M#!XM$#(A$\"8U!#95!#I%%!HY!\"X]\"#XY&"
+ "$HQ##I!\"'9%%#I%\"#9-!#91!!Y)!$)1'!I=##)5##95!%9A&#)5#$Y9'%9E\"\"I=!"
+ "\"YU$\"IE$#)9#$9U$#Y9##9Q'$IM&$IQ\"#9Q!#9U!%IY##9U!$)Y#\"IY!$Y]'#*!#"
+ "\"J%!$*!#%)]!$:!'(:%+\"Z)!#J)!#J)!$9Y!$J-%$J-!%J%\"$J5%#J1!$:5##J5!"
+ "\"Z9%\"ZE!&:9,$J5%$J=!!Z9!$*9\"\"ZE!$*9\"$:I$#ZA\"#ZI\"#ZA\"$ZE%$ZE&$*E\""
+ "%:E!#J=!!:E&\"Z=!\"ZI!#JI!$ZI%$:I##ZM!#JE!\"Z]$&:Y,#:A#$ZI!$JI!#JA!"
+ "#JE!$Z9&!ZA!!*Q!!ZI!%*9&#ZU!#ZQ!#:A##ZE!&*E($*9##:U\"#ZM!%:I'&JI!"
+ "$JE!':E1#:U#$*E\"'*U#\"Z5%#JM!$J=!#JE!#J=!#J=!\"Z=!$ZI\"#JA!#:=&\"Z-!"
+ "\"ZE!$*I\"#JE!#J5!#Z9!#Z9\"$J5%#Z5\"#J!!$JI$#J1!\"*1%#J-!#J-!$*-#!:-\""
+ "#J1!#J%!#J%!&:-)#J!!$*!##J!!$9Q!$I]&#Y]\"\"IY!%)Y!#)]#$)Y##9Q!$YQ#"
+ "$)U#$)I#$9A$#IU\"#YE\"$9I!#Y=#&)A,$)A$#)M#\"IE!\")=\"!Y)!%Y1+\"I)!\")9\""
+ "\"I-!#Y5&$)-$\"8U!#9!!#(Q!%91)!)!!$(]$\"(M\"#I!)\"HU$$HM*#(E$\"8]!!8M\""
+ "!XI!\"8Q!%8E'#8I$%XE#\"81!\"85!\"89$\"X)\"!(1!$X5%#85%!H9(\"H-\"#X%'!G]!"
+ "%']'#W]'!GU#$'Y(#7Q%\"7Q!\"'Q#\"7M!#'I%#7I%\"GA$\"GE%!W=$!G=#!'-#\"G5%"
+ "!W%\"!W%\"!7)\"!G)#\"W5%#'5$#G5&!'=!!G9!\"'=#!GI!\"'E##'A$\"'E!\"7U!#7A#"
+ "\"7Q!!GU!\"7Y!$GE#\"WY##GU&!G]!\"G]\"#(%$\"8)#$7])#(I$\"81!#8A\"#(A#$H9*"
+ "#X-'!H=!#8A%#85\"!HA!!8I\"$8Q(\"(M\"\"8Q!$HM)\"XU\"#XY#\"XY\"#(]#\"8]!$I)'"
+ "%Y!&#9%!\")!##))#\"I-!\"Y5\"$I)#\"I5!$I-&#)=##Y9&#IQ$$Y9$!YA!#9E!#YQ#"
+ "$IE&$)E$#IE\"#9U!#9M!&)Q(&9M.$)U#$IQ&$9Y$%)]!&9Y&%)]!$I]%%:!$%Z%*"
+ "$*)#$:1!#J1!#J)!&J-'\"I]!%J5%'Z-('*9%#J1!$:1#%:=!#Z=!\"J5##J9!#Z-\""
+ "\"*9\"#*5\"#ZE\"#*=\"%*9&%JA%&:A!#JI!#Z9!%:A!#JM!#ZE!%ZE*$ZE\"#ZE\"%*I#"
+ "#*I\"$:I#&:E$%JQ!':9\"#JM!$:E#%*M&#JM!#JA!%JI)#Z]!$J]$%*Q*$JM$#JA!"
+ "\"ZM!#ZM!(:M*#:M\"$:M$#:I#%JI!#ZY!#JM!#JM!'JI&#JM!$ZI&#ZE\"$JI$#JM!"
+ "#JM!#JI!$JI!#JE!%JY(%*E'$ZA\"%ZM*#JE!\"*A!\"*I\"%*A+#J=!&*9+$:A##ZA!"
+ "#:A##JE!':Q(#J1!%:E!#Z-\"$Z9&&*1!#Z9\"\"Z5!%J1-#J1!\"J)!#I]!#J%!$J-%"
+ "!Z5!#*!##J)!%Z9*\"9]&$*!'#Z%%$*!#%IY'$)Q$$IY%&IY$$IY%!Z!!#YQ##YQ#"
+ "\"II$$9M!$9M(#9Q!$IM%#YE\"!9Q\"%9E%#9A!&IE($)1!#9I#\"IE!#)9#$)='#)5#"
+ "$I9)\"Y1\"&9-*#Y%$#9%%\"I%!$9%##(Y!!)%$#(Y##XU'#Y!&\"8Y!\"8M!#8U$!HM!"
+ "$(M'\"XA#\"XU\"\"8I#\"8A!\"(5\"\"XI\"\"H9\"\"X=\"\"H)\"\"(1\"!X%'\"8-!$()(\"7]!#7Y\""
+ "#H)%$(%##H%##()$#G]!\"7Y!\"G]\"\"7Q!\"'Q#\"WI!#7Q'\"'E#\"G=%\"'A#\"G9\"!'1%"
+ "\"G-%\"'%#\"G-$!G-!\"G1$\"WM&!GE!!7A\"#'5$!WE!!WM!!7I\"\"7I!#GY!$'I)\"GA\""
+ "\"H%\"\"G]%\"W]#\"G]\"#GY##H!&%8%#\"8%!\"(-#$(9%\"81!\"X%\"#(9##X='\"8)!\"8=!"
+ "!8A\"$8A(\"81!#(I#\"(M\"#HM\"\"XU\"%8U*#8]!$8U%\"8Y#%I%+\"8]#\"HY$#9-!\"8]!"
+ "$)%%$Y)+#99$#Y)'#91!#)9#!Y5!#99$#9Q#$)M&\"I5$#9E!&)A%$Y=!#9A!$YM#"
+ "%)9(#9M!\"YI!$IU%#YQ#%*!#!YU$$)Y##IY!#IU\"#YQ#%)]'$*%#%9U)&*%!&J%#"
+ "#J%!$:%$$Z9\"$:%$(Z-&$:-##J1!#*1\"$J5!#Z9\"$J9!#ZE\"#J5!#Z9!$*=&!*=!"
+ "#J9!&*-+#JA!%:1(%JU!$JA!#Z=\"#JE!#JE!$*5##JI!#JE!#ZI!$JM%$*U\"#JM!"
+ "$:E$$JM!\"ZM!\"ZM!#J=!#ZQ!%JQ(#ZQ!#ZQ!$JQ!#ZQ!$ZI%#JM!$:U##ZY!!ZQ!"
+ "#JM!&:Q($JE%\"ZQ!&JU%\"*Q\"\":Q\"%*I#&*Q#!Z]!$:Q#%JQ)$+)\"$*Q)#ZU!\"*Q\""
+ "$:Q#%JM)$JM!$*U\"$[!&':M!%JQ!&ZM+%ZM&&:I%#ZE\"$J5!#ZY!%:E!\"Z=!\"ZE!"
+ "$*M\"$ZA%\"*A!%:A($*9\"#J9!!:=%#J-!#JE!%:9%#Z-\"$J5!$J=!#Z)\"#J=!\"Z)\""
+ "%*1''*9)#Z9!$:-$\"Z!\"\"Z)!$*%#!Z)!%:)($*!#%Z!'#J!!$IU%$YU'!Z%!#9U!"
+ "\"IU!%)Q'\"9Q##YQ##9I!#9M!$IA##IQ!$)E&!)E!#Y9##Y=#\"IM!\"I-!!I5&$Y5$"
+ "#9A!#9=*%I1$#)-##91!#91!$9!%#9!!#9!!!Y!!#8]!\"(U\"\"I!!#(Y#\"8I#\"XQ\""
+ "!(9$\"HI!\"XM\"#(I#\"HE$#(M##(=$!HE!#X1%#89%#(=!!()!$HA*#()'\"81!$(%&"
+ "\"X%!#']&\"8!!#8!$#GY$#'Y$!GU#\"GQ%\"7Q!#7M#$7I'\"'E\"!'Q#!7A%\"75#\"'E#"
+ "#')%!'-!#'5'\"W5&!G5&\"75$\"7=$\"'=#!GM!\"WE%\"'E#\"WE##7Y%\"GI#\"GQ\"#7Y#"
+ "\"X%##GY!\"7]!\"H%$$8%&#8%\"\"WY#\"H)!!X-!#H1&\"H1\"\"89!%89%\"85!\"HQ$#H=\""
+ "\"8E!!HE&$HI'\"XE#!(A!\"XE#\"HQ'\"8U!#XU&#8Y$#HI#\")!(%9%,$8]%#9%!!)-!"
+ "#))&!Y9!\"I-!$Y)(\"I!!$I5#\")5\"\"I9!!9I%$Y=!#I9\"$)I$#YE%&)E)$9I%#9I!"
+ "$IM%$*)##J!!%YQ'#*!&$IU%%9Y(%IY\"\"I]!#I]!#J%!$I]\"#J)!%:1($Z!&%:%!"
+ "%)]!#J-%%J-\"%:1(%*=+#J1!#Z)\"#Z5!$J9!#JA!#J5!#J5!#*5\"&*A+#ZA%%*A&"
+ "$Z-\"$Z9&#JA!$JI(%:E!#JE!#Z9!#ZI\"$JM!\"ZI!!*M!#JI!\"ZM!#ZU!\"*M\"%Z])"
+ "&:I!$JM!%JM!$*Q\"#JA!%*U\"#ZQ!!ZM!#Z]!#ZU!#ZU!\"ZU!**U)$*]&#ZY!\"[!!"
+ "%JQ!$[!!#ZU!#JI!%ZU)#JI!$J]!$ZQ%#ZU!#[)!'*U#$JI!$*]\"$Z]%%+)\"\"[!!"
+ "$JU!#JM!%*M\"%:Q$!*Q$%JQ!#ZU!#Z]!#:M##JM!#JM$&ZU\"$ZM\"!:Q\"#ZE!#JI!"
+ "%*I\"&:A,$J9!#JI!$Z=\"$*=#$JQ!\"ZA!#J5!#*=\"%Z1&#J9!$J9!#Z9%!*5!#J5!"
+ "#J%!#J=!#*9\"#JA!#J-!%*1'%Z)+#Z-\"\"J!!%:%(#:%##Y]\"$*!#!)]!%:%!%9Y,"
+ "#IU!#IU\"$)]#%9U%#9U!&IM$\"YM\"$9I$$YI&&Y9/#IE(#9A!$IA%%9=%\"I=!!I=#"
+ "\"I1!\"(]%$9-(#9A$#9)!\"I-!$))%#))#%I%$%)!%\"8]#$X]$\"Y%##)%##))##8Y$"
+ "$(]$%(M##8M$\"H-*!HQ!\"XI\"#(A##8A%%H=&#(E!\"8M#\"8=!\"X1\"\"X9#\"8)!\"8)!"
+ "\"X=%$()(\"X!#$8%)#']$\"H!!\"WQ#!'M!\"7Q!\"GM\"\"GY\"#7I%#7I%!W1\"!GE%!WA&"
+ "!G-!\"7=#\"G1$#'9'#'5\"\"'5#!W9&\"79#\"W1&$7E$\"GM\"#']$#WA#!GU##7Y#$8)&"
+ "$'Y#\"G]!\"W]##(!$\"(!#\"8)!\"H)!\"X-#\"X-#$(9%#(9!#H1!#X5&&(=%%(E##(A$"
+ "!HE#!XI$#(M!#8M!\"XE#$(Q!#(U#%8Q$#(Y!#(]##HU\"#XU&#(]!#I5\"\"I1!\"I5!"
+ "\"I)!#))##9-$$Y1'!)1$#I=%\"I9!#9A!%Y=(%)E!#)A#\"IE!$)E#\"IA!$9U!#YM\""
+ "%YM$#YM#$IU\"!9Q\"$)U#$*!#$:!!&)]$#Z!\"\"J%!\"Z%\"%Z%'%*%'$J-\"#Z!\"#J-!"
+ "!Z-!#*9\"'*1%#J1!#J5!$J5!!Z1!$Z9\"$:9##J=!$Z5\"#Z=!#J=!%:E!#JA!#Z=\""
+ "&:I,\"JM#\"ZE!$JM$!ZY!%*I\"$:Y#%ZQ&$ZM\"$*U\"#:Q##;%&#ZQ!#ZQ!$J]!$*Y\""
+ "%*I\"#:U#$JU$#*]\"%:U$$J]!#ZU!\"ZU%#[)!#[%!$*U\"$ZY%$*Y\"$*Y\"#[)!$JU$"
+ "$;%\"\"Z]!&[%\"\"JY#\"[!!$ZU%(J].#ZU!#*]\"%JY)\"*Y\"\"ZM!$ZY)\"ZQ!$ZY%$:Q#"
+ "#ZU!$JQ!#ZI!$+!\"$*U\"#JM!$*U\"\":]\"#*Q\"$*M\"!ZM!#ZQ!#:]\"%ZE*$JA%%ZU)"
+ "$:I#$*I\"$J9%(JI#\"*E!#ZA\"#JE!$JM!$*A\"\"JM#%JA)#ZA%#ZQ!\"*9!#:5##Z=\""
+ "\"Z5!&:5!#J9!$*%##J)!%J-\"%J5\"\"J%!%:-!$:1!$:)!#*%#%J!*$:!!#J%!&9Y&"
+ "%YY$$)Y#$)Y##IU!#YU\"#YQ#%9U%#9U!#9A!#YI##)M#$IU%$YI'$)A!$)=$#)5#"
+ "#I=!#9=$\"Y=\"!Y5$%Y5%\"9-##9!*\"H]!#Y9##)%##Y-#%Y1($)%%$(]'!HY!#(E!"
+ "#XU##8Q$\"8Q+#8M$#HQ\"#(I#\"HU$%(E#\"XA\"!(I!\"85!\"8=#\"H=!\"8=#\"8-!\"X%#"
+ "!H)!\"(!%#8%$#(!$\"8)!\"(%%#WY$!7U\"!GQ#$7M'\"7Q$\"GM%#7M&!GE!\"'9##GI$"
+ "\"7=$#'-'!W1!!79\"\"G1'\"7=#!WA$#7A##'A'#'E$\"WQ##'E'\"WQ&\"GU\"#GU!\"W]#"
+ "#']$!GU!#H!&$(%(#H)!$8%)\"X)##(A$#(1&#X9$\"(9\"$(=!$XA&#(I##(A$#XI!"
+ "!XI$#HI#\"8Y!\"8M##XQ&#(U##(U!\"XY\"#H]%$I)##9!!!8Y\"%I!(\"I)!\"I)!$Y1$"
+ "$H]#$)5'\"I1$#I1%$I9&#9I##I1%#IA%#)A##IA\"#9E!$)Y##)U\"\"IU!#YQ#$9Q!"
+ "#YE%$)U#$IQ\"$J!&#9Q!#9]'%:!\"\"IU!#J)!$J%)$*%#%9])$J)%&*-($Z-&\"J-!"
+ "#Z-\"'Z1)$J5!$J9!%*A#$J9!$J9!#J)!#J5$#J=!%:5(#JA!%J9\"%JE(#JM!#ZA!"
+ "#J9!&ZM\"\"ZI!%*Q\"#JE!#JM!&ZI\"$JQ$!K!#'+!#![!$$JU$#ZQ!#[%!#[)!#JI!"
+ "%:M(#[)!$[%%#[-!#ZY!#[!!$*Y\"$[)!$ZU%$J]$#Z]!\"*]!$:]*$[%!#[-!#ZQ!"
+ "\"ZM!$:M$%J]%&;!#$[%!#;!#&ZY.#JM!#*]\"';!,$*]\"#Z]$#Z]!\"+!\"#ZY!%Z]\""
+ "%ZU\"$*U\"'*Q+#*Q\"#JE!%K)(#*Y\"$J]!%*U'$JE$$JM!&J]!#ZQ!#J9!!ZY!$JQ$"
+ "%ZM\"$:M$\"JM$%ZE\"$:I$$:I$#J=!#J=!\"*E%$:E##JM!$JM!$*I\"#*A&#J1!$:=$"
+ "#*9\"#J9!\"J9#%:5!$JA$$J!\"%J1\"#Z-\"%J5)$:-!#J)!#J-!#Z%\"#J!!'*!0&J-\""
+ "#IU\"#J)%#IY+$IY%#YQ##J)!$9Y!#9Q!#9M!#)M#%YI(%I5!#YA#$9E(#9I!$)A#"
+ "#)A#!Y9!&99*%)5%!Y5$$Y-'\"I5!#)%#!Y1!\"I1!$9%&$(]$\"8Y!\"Y)\"\"8U##(I'"
+ "!8M($(U$#(=$\"HQ!$(E(\"8I#\"8I!#HE##(=$\"HE$\"8E!$X5,#8=%$H5\"\"8-!$(-#"
+ "#8-%!(-!\"(5'#X%'\"8!!\"8-!\"H!!\"WY!$'Y)#7]%\"7Q!\"7M!\"7M!\"7I##'E+!G=!"
+ "\"7)$\"G-$\"'1\"!'1$\"'5%#79!\"'I##'E'!7U\"$7E*\"WM##7Q#\"GY\"!7Q\"!GM!\"X!#"
+ "$H!'$X!)#(%!\"8-!\"8%!#85\"\"H1!\"81$\"(9\"$81!#(1!#8=$!HI!$8I&\"(E\"\"8I!"
+ "!HE!$8M&\"(Q\"\"XE\"#)!$\"X]\"$(Y!#H]%$(]*#H]\"#Y)#$))$#I-\"\"9-##I)&$)!("
+ "!)1$#)5#$95%!Y=!!Y=!\"I=!$YA&#IA\"$IA&#9A!#YI\"#YY\"%IQ'%)Q$#IU\"%)Y$"
+ "$YU'#IM\"#J!!\"I]$$Y]&$*!#$9]$!J%#$)Y#$:)!&*!(#Z-\"\"J!!\"Z9!$:%$$:5$"
+ "#J1!#J9!%J-\"#J=!#J9!\"J=##JE!#J5!%ZE)&:M(\"ZM!$ZM%#ZE\"$JQ(#ZI!#ZU!"
+ "%JM!&:A$&*=+%*M&&*I'$ZQ%#ZY!#[!!$JU!$+%\"$:U$#ZU!$ZM\"$:Y'#Z]!&*Y*"
+ "$Z]%$K%(\"ZY!!Z]!#;%#%K!)#*]!#Z]!%;)+#[!!#[%!$Z]%#[%!$*U\"$ZY%%;!'"
+ "&K%!!+!$$K!$#*Y%\"[!!\"[1!#[!!#+)&$:Y*$+-\"$+!\"#ZY!#[9!$;!##[!!#[)!"
+ "%K)$$ZU%\"*]!$JY!#ZU!%J],$:Y#![!!\"JQ$$*U\"':I%#ZU!\"ZU!%*I'%:]#%K!)"
+ "$ZQ%!ZU!$*Q\"&JY!%JQ$$*M\"#*M\"$JI!#JE!%*E'\"*Q!#JE!$*E\"$Z=\"\"*I\"\"ZA%"
+ "#J=$#J5!$:9##Z9\"$*1&#J1!$J5!\"J1!$*-##J=!\":-\"$:)!#*1\"$:!$$J5%$:)$"
+ "\"J!!#Z!&\"IU!$:%!#)M%&)Y%!IQ##YQ&$)Q$#)Q#$YU#\"IM$$YI&%Y1%#9E!%)5\""
+ "&)I\"!95\"#9=$#I5%#99$#)9##I9\"#Y9#!Y-!\"Y-\"$I-)#9%!#Y%$$9!&\"I1$\"8]!"
+ "\"(Y\"\"8Y!\"(]%\"HQ$#(]#!XU!#XI!#(I#\"8A!$XE\"\"8A!\"X=#%(1'\"X9\"#()!\"85!"
+ "\"89&!()#\"X!#\"G]\"\"X%#$WY!\"(%#!']!#X!\"#7Q#$'M##GQ&\"GM\"$'E!\"'E\"!W=\""
+ "!71'\"'%#!'=#!W5!\"G=\"!WQ\"!WE\"$'U($GI&\"GM'\"7M!#7M&\"GQ\"\"WY##7Q%!WY$"
+ "!(!#$8%$\"X%##(!$&(-+\"8-!$(A\"\"(%#\"HE$#85$\"X-#!HA!#8A$\"(5%#89$#8]$"
+ "\"8I!\"8A!!HQ!#(Q#\"XY\"$8M#\"X]\"\"I!!%Y!#%XY\"!Y!!#Y%&$))$#Y-&!Y1!\"91#"
+ "#9I$$I9&#)5&#Y5&#9=!#)=#!YE!\"II!#)A##9I!!YM!#9Q!%9Y%$9U$#)]##IM\""
+ "#)Y#&)Y!#Y]\"$YY&$)Q$%:%+!Z)!$J!%&*-!&J-\"$:-#&*-+$:1!$Z1&$Z5\"#*5%"
+ "%:1%#J9!#J=!#J=!#Z=\"#JA!$*A\"%*M&%*E\"&:Q,&*E$!*I$#JE!%*M*#JM!$:E#"
+ "!ZM!#Z]!$*M\"\"*Q!#ZU!$*M\"$:]##[!!$*I\"'JY*\"ZU$$*Y&#[%!&+)\"&:M!%:U$"
+ "$[!!#[!!$;%\"%[!)#;!\"$+!\"%[!&%[%)$[!&$[%!%+%&$K%$#[%!\"ZU!$+!\"$*U\""
+ "#[%)#[%!$;%\"$+)\"#[%!!ZY!$K%$$[%!$[1!%+%&#[%!$+%\"#ZU!$K1$#*]!$K%$"
+ "\";5&%;%'%JY!#[!!![!!&:]+#[!!#:]\"%;!$%ZY\"$[!&%*Y*%:Y#$*M\"%JY($K!$"
+ "&;)'&JU)&JQ%$*U\"$:M$$*M\"$:Q$$*M\"%*M&%JM!%*I'$:M'%JI!\"ZM!#ZA\"#JA!"
+ "#JA!#JA!$:=$$*9)%*='$J%&$Z-&$JI!#J9!#J1$$:1!#Z-\"%:-%!Z%!$Z)\"#J=!"
+ "%9]!#J%!#YQ##Z!(#9Q!#J1!$)]#$)]#$)U#$)Q$$IQ&\"IQ!#IQ\"#YE%#Y]\"&9=$"
+ "#9A!#9E!#I5\"%Y=,#YA\"\"Y9\"\"I5!\"I=!\")9%$)5'#Y%'$I%&#9%!$I%'#XU##(Q!"
+ "\"X]\"\"XI\"\"8Y##9!!#(E!\"HM!#XA#\"8I!\"8E#\"X=#!X=!\"8A!\"81!\"89!\"H9!#HM&"
+ "#']$#85%$X1#\"X)##(!'#8-%\"G]\"\"WY#&(%)#'Q$!GU!#7]%\"GE\"\"7Y!#7=%#'I\""
+ "$'5&#G1$!G=%!G=!!W1&\"'E#!WE\"\"GA\"\"WM#\"7=!\"'Q#\"8%!$GY*!G]%#W]'\"7]!"
+ "\"X)##8!\"!(%!$H1%#(1!\"81!\"X5%\"W]##8=$%(5#\"XE#\"H-$#8E%#(I#\"XU\"\"8Q!"
+ "\"HU!\"I!\"\"XU\"\"XE\"!X]$!XY$\"I!!$Y!'%I-!\"XY\"\"8Y!$)5!\"I)!$Y1*\"IA!#)1#"
+ "#)-#!YA!\"IE!$)-$$)I$$YE$#IE!\"9I##9Q'#)]##9I!#99!\"YU!#IY!#YU\"$)Y#"
+ "#Z!\"$)Y#%*%'\":!\"!Z!!$9Y!%Y]'#Z%\"$Z1&&*%(#J-!$:1!#J5!#JI!\":A#%*9'"
+ "#JE!%:=(%:=$$ZE&%*=&$J5!&:I,$:Q#%:M$#JI!#*E\"$JY!$*M\"#ZI!#Z]!$:I#"
+ "#ZQ!\"*Q\"%:Q$%*Q##[!!%ZY\"%*Y\"#ZQ!$+!\"$;!#$[!!$*]\"&:],%K!)%;!#\"[)!"
+ "&;)#![%!#[%!\"K!$#JY$$[)!\"+!\"&+%\"$[%!\"ZQ!$[)%\"K)#'[)\"$+1\"#[1!#[)!"
+ "\"Z]$#+)\"%;)+$+)!$+!\"$+)\"%+).#+!\"#;)\"$[)!#[%!#[)!%+-&$[%!![1!\"[%!"
+ "$+!\"$;)\"#Z]!#[%!#[%!#[1!$;)'#ZY!%K!!'K%,%Z])!*]!#JI!#Z]!#Z]!%:M'"
+ "$:]##+%!$JU!$:Q#&:Q$$ZU\"#ZE\"$JQ!$JQ($ZE%$ZM%#ZY!$JQ!#JI!#Z5\"&:E%"
+ "\"ZM!#JE!%*=*$*A#$Z=\"#Z=!#JE!#ZA\"#Z5!#*5\"&*1!!*5$%Z1#$Z9&#J-!\"J)!"
+ "#J1!#J-!#I]!$:!$#IU\"$Y]#$)U##IY!#IU!$:!!#9]$#)Y#\"I]!#9I$$)U##)9#"
+ "!YE!#YE\"#9A!#II\"!I1#\"I9!#)-#\"Y5\"\"IE!#Y!'#9-$!Y5!\"(Y($HY$#I%\"#I%\""
+ "!Y1!\"XM\"\"HY!#HM%\"8Y!!I%##XA$#(M!#8M$$8M\"#XE&\"XA\"#(A$#(A!!H9##H9#"
+ "$81)!H=!#(-!#(!$\"85!\"H)!\"W]#%8%%!7]\"\"7]#\"X!#!WQ$#WQ'\"WU#\"7]!#7I\""
+ "\"'=##79!#7=(\"'=%\"W=%\"75&\"7I!\"7M!#'Q$#WQ'\"7U!\"7U!#']$#7Y%!']!!X)$"
+ "!H)!#H)#$H-*!XA!#X-'!H5!#X!(!H9!!X1!#(I!\"HI'\"8=!\"HA!#8Q!\"8M!$(Q("
+ "%(U,#I!%#XY&#XU&#(]##9%!$9!&$X](#9%!\"I)!!)9!\"9%#!Y=!#)=&#Y-#\"I=!"
+ "#I9%\"I=$$9=%$Y9'$9E%$)E#$9I\"#9M!%)I!$IQ&&)]($)]##YY\"$IY&%9Y!$9U$"
+ "$Z!##9U$#I]!&*!!#Z1\"&J)*#Z1\"#J-$$*9\"#J1!$Z5\"#Z5\"#ZE\"#J9!#J5!%:=!"
+ "%*=##Z9\"$*A##ZE\"!ZI!!ZQ!#ZQ!#JI!#J=!\"ZU!!ZI$!ZQ!%*Q'':Q!\"ZU!':U%"
+ "!:U\"\"ZU!#ZY!#ZY!&*Y#%ZY\"(*](\";%\"%ZU)%K%!\"[!!\"[!!#[!!#[!!!:Q\"#*M\""
+ "$[)!$+-\"#K)$$K9#$[)!$;!#%+)\"$+-\"$+)\"&[-.\";-&\"+1%$+-\"%+!\"$K5$$;1#"
+ "$[-$&;-+$;-\"%[)!$+5\"%+9&$+-!$+1\"$+)\"$*Y\"$[)!#[I!%;-'$+)\"%+)&\"[1$"
+ "\"[!!$+1\"#K)#%[)%\"[5!#[!!#[!$#:]\"$*]\"$+)\"#JM!%[-&$JU!%K%!#JM!$+-&"
+ "\":]&$Z]!$J]!%:Y$\"ZY!#Z]!&ZU*%ZU\"#;%'$:I$#ZQ!$*M\"%:M$#ZY!$J]!#JM!"
+ "#ZU!#JM!$ZA%%ZA&$ZE)#:=##J9!%:=(%:=($J=!$J5!$JE%$J!%$Z1&#Z9\"$J%&"
+ "\":)#%JA)\":%#$*%#$:-#&*!!#Y]&%*%+$9Y!'YQ*#IU!$)U##)Q##IY!\"9Q##IQ!"
+ "#9Q!#YE%$IE#$YA!#)9##)A#\"IA!\"95##95$\"I5!#)5##)9##I5\"#I)&#Y-##Y!$"
+ "#9%$\"Y!#\"X]\"#8Y$#XY!!XU'#(Q#$XQ*$(Q!\"8I!#XM#$X=+\"(E\"$8A&$H=!\"85!"
+ "#85!\"X5##(1&!H%#\"(-#&()(#(%&\"X%\"\"']#\"8!!#'Y$#'Y$#7U\"\"WM#\"WQ&\"WE!"
+ "!79%\"'9!\"'E\"\"7I!#GM!\"W=(\"WM#$'Q!\"7Q!!GU!\"7Y!\"7Y!\"G]\"#7Q##W]'#GU#"
+ "#(!$#H)&\"(9\"\"X5##X5&#(5)%(=##8I%$8A&#XA'\"HE!\"8Q!!(=!\"8M#\"XM\"\"XM\""
+ "#HQ&\"Y%#\"I!$#(]##9-$#Y!$$I!&$))!#)1#$)A!#)1##Y1&!Y=!#)5##Y-##9=$"
+ "\"I=!#IA%')I\"$)E#!)U!$)I$$9M!$YM#!IQ#$YU&$IQ&$)U##II\"#Y]\"#9Q!%YU("
+ "#Z!\"!*%!$J)\"!Z1!\"J1!#J-!\"*1\"#J!$#J5!#J5!$*5#$J=!'*5(#J1!%Z9##JA!"
+ "%Z1#\"*A\"%JE(!:E\"#*I\"$JI%$*Y\"$*M\"!ZM!#JA!#Z]!#Z]!#ZQ!&*U*#ZU!$;!\""
+ "$*Y\"'JQ%$JY!#[%!#[)$#ZQ!%[!&#;!#%+!\"%Z]*#JY(&+%*%;!'#[=!&;)'#[-!"
+ "%JY%#[%!#[)!%+-&%K-$$+)!#[-!#ZY!#[-!$+-!#[-!$[-!%;E\"%+5!#[=!#+1!"
+ "#[1!\"K)#$+M!#[5!$+1\"#+1\"#[-!%K1($+1\"#[-!!;=\"$J]!'[1-%+1&%+-\"$;-&"
+ "$[5$#[%!$[)%\"[1!$K)$%;-\"&K)!&+)\"$+)!$[)%%[%&\"ZU!%:Y$#;%*$[!!%ZY\""
+ "\"Z]!%Z])'*]+$:Q#$:]#$:Q$#ZY!%;%'#*U\"$*Q\"#*Y\"#ZQ!$*Q\"$*Y\"\"ZM!!ZY!"
+ "%:I'!:I%#JI!'JA\"#JE$%:M$$*A\"!*9!#J9!#Z%&#Z5\"$J1%\"Z5+#J5$#Z-\"$:9#"
+ "#Z%\"%:1!#J9!#Z5\"\"J%!$J!\"$YY#&J!#$)]&$*%#$Y]&$9M!#IU$$9M%%YI!$)A#"
+ "$9M!#YE\"#YI\"$9E\"$)A#$)=!!YA!#9Q#$)=!\"I5$$91(#I1%\"Y1\"\"I-$\"I-!\"Y)\""
+ "\"Y)%#I-\"#)%#\"I-!#(Y##(A$$8Y%\"HU!\"8Q!!HM!#(9##(Y!\"8M!\"X=#\"81!\"8-!"
+ "#89%#X5$\"81!#()$$(9(\"7]!$X)&$8%)\"8%!\"WY%\"WI#\"WY#\"X-##WU!\"WU%\"WQ!"
+ "!W5\"\"W=*#'9$\"'A\"#'E$#G9$!GM!\"WQ##'I$#7U%#7Y%#H!$$(!+\"7]!\"W]#\"8!$"
+ "#()$$(-(#(5##(=!#H-%%H9,#85$\"H=\"#(A#\"H=!$(Q'\"8M!\"(M\"!(Q!!HQ#\"8Q!"
+ "#(Y#$(Q%!H]!\"8]!#9!!%I%'\"Y)\"$)%!#I)%\"I%!\"I-!\"99&\"I9$#99$#)I##Y=#"
+ "$)=$$)A#%)9($9Q!#YQ\"$9U$$)M##YQ#\"IU!#J%!%)E%#IY!$*!#$9]$&:)-!Z%!"
+ "$Z)#$*)&#*1\"%J-\"&*5,$:A#$ZI!$:5##J=!#J9!#JI!#Z5\"&:9!$J5!%JA)&:A!"
+ "#ZE!&JE)':I!!*A$$*M\"!*U!#JM!$*Q\"$:M#\":A\"$ZU\"#ZU!%[!&$*Y\"\"ZE!$J]!"
+ "#ZY!#Z]!#[%!$J]!\"K!'#[)!$+%\"#[%!%K%)#[)!#[-!$[5!$;-\"$+!\"#+-\"$;-\""
+ "!+)!&+1\"#;)\"&[1&#[1!\"[1!#[1!$;1\"%+9\"#K1$$[9!#[1!$+9\"#[1!&K5$\"[%!"
+ "$;A\"\";5&$;5\"$;5\"#[5!$K9#\";5\"%+5!$;-\"%+9&$[5!\"[1!#[1!$[-!$+1\"$+1\""
+ "#[1!$[%!$;9\"#[)!#[%!#[-!$[!!$;)\"'K-!#[5!$+)\"#[9!&K5,#[)!$+)&#+)\""
+ "$K9'\"ZQ$#ZY!![%!$JU!#Z]!#Z]!#[!!%*M'$*]\"#[%!$ZU%%*U&$JY!%*U'$:Q$"
+ "$*M\"\"ZM!#ZM!#JM!%ZI'%:I$&:E!%:A(%ZA\"$JE$!Z5!#JA!$*9#\"Z=!&*=+#J9!"
+ "$Z1\"$*-'#Z-\"$:-!#:)'$J)%#J%!$*%#$J%%&J%&$)]##9U!\"J%!#I]!#9U!#YQ%"
+ "$9I$%)A'%)I!#YI&$YA&#IA\"\"IA!\"9A&$91\"$)5'#Y5&\"I=!$Y1*!)-$#I!##))#"
+ "$9)%#8]'#H]\"%)!)\"I!!\"I!!%(U##(U#!(Y!#8M$\"XM\"#(I##(E#\"8=!\"H9\"\"8A#"
+ "!81\"#X=)$85)#HA+\"(5#\"8)$\"(%\"#(9!\"()\"\"8!!!X!!\"']#\"WU##WY\"\"(!%\"7Q#"
+ "#'A$!G9#\"'I!%WM+#GI'#'I%#'I&\"7E#\"'E!\"7Q$\"GQ\"#']$\"X%#\"X!#\"(%\"$()#"
+ "\"89##(1#$H9'#H1&#(9!!H=##HA&#8='\"8M!#81\"#8I%$XU+\"HQ!$HM!\"XU\"%(M#"
+ "#8U!\"9!$%9!*$))!$9!&\"I)!\"Y-($I-)#)1##I9+#I1\"#Y=\"%)Q*$)9'#YE#$)A!"
+ "#9M!#YE##9A!%)=$%)Q!#IQ!#9Q!$)Y##YI\"$)Y##9Q!%*!!$:!!#IY!&Z%$%:%!"
+ "$J)%$I]&#*)\"\"J)!$J5!#J1!#Z=!'*5%%J9)%:5!\":=\"&*=+#JA!#:A'#*A\"#JM!"
+ "\"ZE!$JQ$$:M$$JM(#ZM!#ZQ!#JQ$$*U\"\"Z]!$JU!'[-)%*Y&#Z]!#;5\"%*]&$[%%"
+ "$;-##ZU!$:U#$[)!#[)!$J]!#[)!$+5!%:]+%[))\"[1!#K5$$;)#$[-$%JY)&;)+"
+ "%[-)%+)&$+!\"$+1\"\"[%!$+9\"%;1+$+%&$[5!&[5!![1!$;)\"$+-\"#[=!%+=!%+)\""
+ "%[A%%+=%%;9\"%[9!#K5'$[-!%+9\"&;9\"%K9$$[9!'+1+'[1!&[1)%;5\"&[9!$[=$"
+ "#[5!\"[5!#[-!$[5$\";1\"#[-!#[-!$;1\"#+1\"\";-\"$K-(![-$#+-\"$[)!%K)(%Z]%"
+ "$[1$$[%!$*]\"#[%!%K!$%;-\"%K!)%K!$#Z]!$*]\"$*]\"#ZY!$ZY%$ZU%%*U\"$*U\""
+ "&:Q$#JM$&JE-$*M\"#ZI!\"ZM!#JI!%:E!#Z9\"%ZE\"#J=!\"JE$%J5)#J9!#Z5!#J1!"
+ "#*9\"%J5%#J1!#J-!\"J-!\"Z)%#J)!$:%!$*!##I]!%IQ)$)]&%I]&$:!!\")Y\"$)Q$"
+ "\"J!!#IY!#YM#\"YI\"!Y=!$Y9'#95!#)E##95!#95$\"I9!!IA#\"I9!\"91#!8]%#9%!"
+ "$I%)#I%#$HY&#(Q!!I%&#(U##XY##(Y##XU!\"HU!#XQ!!HQ!!HI!#HI&&H9*\"HA%"
+ "\"81$$(A(#(9##89%\"XE(!H=!\"X)##H!&#H))\"8%!\"X!#\"7]!!W]!\"WY#\"7U!#H!$"
+ "\"'E#%WI(!GM##'I$#GM$\"WQ&\"GQ\"#'I$!(!#%H1&\"7]!\"()##8%$#8)%\"85!$H9!"
+ "$X1(#XE!#(5$#X=!#H=#\"89!#8A!$(M'$HQ'\"8I!%HI&#8A%%HQ!!HU!%)!($HE!"
+ "\"H]!#Y)'!H]!\"Y%##))#$)-'#Y-##I)%\"9A#\"I=!\"I9!\"IA!\"I='%YE!$)M'\")E\""
+ "#YE#$IA%&9A&#9M!\"IU$#YQ\"%)U'$YY&#J5$$I]&$Z)&\")]\"\"J!!#*%#%J)\"$*)#"
+ "$*-##J)!%*%'\"J1!#*5\"#Z9\"$9]$%*='#ZI\"#Z5\"!:=\"$Z=)#JE!#*E\"#JI!#JI!"
+ "#ZE\"$K!$%*M'$:Q$$*Q\"!ZQ!$ZU\"\"Z]!!*U(#ZY!$;!#\";-\"$JY$#[!!%+!\"#[)!"
+ "$*Y\"#[!!\"+)%#[-!$+)\"#[-!#+)\"\"[-!#[!!$[)!$+1\"#[)!#[%!\";1\"%K=##+5\""
+ "$+9\"%;9''+5\"#[5!%+=\"#[9!$[9!%K9$%;=\"\"[9!$[9!$[9!%;-\"&;I&$[9!&[5*"
+ "%+=!'[E!'+1&$[A!%+5\"%+=%$[I!%+M!#[5!%;5#&[=!#[9!%;9\"$[1%$[9!%+1\""
+ "$[A!%+1!$[E!&[=)#[9!'[5&\"[5!&K1$%;%#%+9!$+-!\"[5!#[%!\";)\"$+9!&+-&"
+ "!;5)$+5\"$K-$$K!$%;%'#[!!$+-\"$[!!%J](%;!#$*Y\"#Z]!#[%!%JY!':U)#Z]!"
+ "\"ZU!#ZQ!#ZU!$*I\"#JM!#JM!$*M\"#JM!$ZI%%JI(\"ZE!$ZI\"$ZA&\"Z)!$J-)#J9!"
+ "#*9\"#J1!#:1'\"Z9!%ZE)#Z)\"&*)!#Z-\"%:5(%Z5#$9]$%9Y(%)U+$YM'$)Y##Z!&"
+ "#9Q!#)Y&#YQ)$IM%')M)#YQ##I9\"#YE\"'Y=#$Y=$\"I=!#)9##YE#\"I5!!)1!$Y1'"
+ "#)-##Y%'$I)##9%!\"Y%\"\"9%##8]$#(]##(I$#8U!#(Y!#8M!#(E$#8=%\"X=#!8E\""
+ "#(A#\"85#$(=(\"X=##85%\"X1##X-$!H1##X-'!8%\"!W]\"#8%(\"W]##7Y%\"WQ#!GU#"
+ "!7M%!WE\"\"7M!#WM'$WQ)$X%&\"7U!#'Q!\"G]$\"'I!\"GU\"\"8%&!(!$!H)!\"X-#\"8!!"
+ "!(%!!H9!#(1$\"H-\"\"H9!!HM!\"8M!\"8I!!8M\"$(E(#(Y!!HM!\"8U#\"HU!#(U#\"8]!"
+ "!Y%!#9-!$9-%$I%'#HY%\"I1!%)1(%91&#I5%\"I9!!99\"#I=%#9=!#9=!#YE#$YI'"
+ "$YY##9U!$)U#&IE+\")M\"$IU(#J%!$)U#%Z!+\"YY!#Z%\"$:%!%Z%'#Z%\"$J%%\":)\""
+ "$J5%\"*1\"!Z5!%Z9&$J9!$:-#$ZE\"$J=!%JA%#Z9\"$ZE%!ZI!!:E\"#JM!$:M##JM$"
+ "\"*M!#ZU!$:]##ZY!#ZU!$*Y\"#[!!#ZY!#:]\"%J]!&ZQ*#[!$%+!\"%[!\"#K%$#[1!"
+ "#[1!'+)+#ZY!#[)!$+-&$+-\"&;A&\"[1!%+9&$KE##[1!$+1\"#[=!$K=$#[5!%+M!"
+ "$[E!$[=!%[=!#[9!%[9%%[E!$[=!%[5%'KI$%[9%%;9\"![=!%;E\"%[=!\"[=!$[5!"
+ "%;5#%K1$&KA$$[A!#+1\"$[=!!+E!\"[9!&KA(&[=!%;I\"%+=\"![I!&K9((+1\"%[-%"
+ "$[A!$[=!'+9\"'+9&%KE$%+=\"&[5!#[9!%+5\"$[1!$+E!#[5!#+1%$K1(%[1!$;%#"
+ "#;!'%+)&#[-!\"K!#$+)\"\"[)!!*]!#ZQ!\"[%!$+)\"&+!+$JU!$J]$\";)&#ZY!(ZY+"
+ "\"ZY!%ZY\"&:Q$#ZY!&:M+$:Y##ZU!!ZM!#*=%#JE$$JI!$JA$\"Z=!\"*A\"&:A%%*='"
+ "$J-%&:5%$:9##J5!$*5\"$:=$%J-\"#J%$$Z)#$J!)$Z%#\"YY\"\"YY!#J!!\"IY!#9M!"
+ "$YQ##YU\"&)Y)$)M$%IM##YM##9I!$9M!#9I!#Y=\"#9A!#)1##99!\"I5!\"I5!\"Y1\""
+ "!)1!#I)\"#I!#\"Y%\"$9%#!(U!\"(Y%$(]'$8M#\"8M!$HU-#XQ#$(9'#HA\"\"HI!\"89!"
+ "#HM%\"HA\"\"8=!$(9'\"(9\"!H5!#H1&#85$$X-%\"X-##H-&#H-&\"7U!$W](!GQ!\"7Y!"
+ "#G1'#'E\"\"WQ#\"'M\"#7M%\"7U!#7E#$'Y(#(!$#8!$#(!&#7M#!X)\"#X)\"#H-!\"85!"
+ "%HE\"#(=$\"(5%$(A%$8A(%HA\"$(E'#(I!\"(M\"#(I#\"(M\"$)%'\"8U#$8Y)#(]#$(]'"
+ "#I!#$)%$!Y)!%9))\"9%#\"9-##)%$\"9A#\"I9!\"I-!$)5$$)E$#IA!$)E!#9Q!\")E\""
+ "#9M!#YM#$)U##IU\"$YY&$J%%#IY!#YY&#YY\"%J!##J%!#9U!!ZA!$J)\"&*-+#J1!"
+ "\"*5\"%J1)%:9($*9\"\":9#%J=\"$Z9\"#J1!%JA\"\"ZE!!ZA!$ZI&%J=%%JM!$ZM\"$*Q\""
+ "&ZQ*#ZQ!$ZA&#JI!#ZY!%:U(%*]&%Z]!$*Q\"(;!-$K!$$J]'$;%#\"Z]$\";)\"$+)-"
+ "%[5!$+-\"![-!$;-\"$+1!$K=#\";1\"\";1\"$[-%&;5'\"[5!%+9\"#+9!$[=!$[9!%[1!"
+ "$[=!)[=*&;A\"'[A!$[-!(+=\"%+M!%[=!$[=!'KE,#;A\"(+A&$;M\"%KA$\"[A!$[A!"
+ "%+A!&[A)%+E!%[A%$[=!%+9\"%KA$%+U!';1,&[=$#;E\"%K-$&+A!$[A!%K=$'+A*"
+ "\";5\"$+E!';=\"&[9!\"[A!&[=!%+I!#[9!%[=%&;E\"%+=\"&K1$&+=\"$;=\"'K-!%[5!"
+ "#K1#$[1$%;1'&K=,#+-\"$K-$\"[-!#[%!$*]\"$;%\"#[%!&+-&%+%\"$*U\"&J]!#+!\""
+ "$*U\"$JM!#*Y\"$;!\"$[%%$[!!%*Q'%JM%%JI((ZU/#JI!%*9&&JY%#:E#%:A!#JA!"
+ "!*5!%ZI*#J9!$J9!\"*5\"#J5!#J5!$:1$#J5!#J)!#Z%\"$*1\"$*-#&*!$#:)#\"J!!"
+ "')])$IQ\"')I\"\"YU%#9Q!$)9*$YM##II\"$Y=!#YA#&)=-#I5%\"Y=\"\"Y%#\"YE\"\"Y-\""
+ "\"Y5\"#)-#!91+!))'%9)&#9%!#9%!!)-$$I!&\"Y%%%)!)#(U!\"XQ%$(Q!#(U#$HI$"
+ "#89%\"XA##8A%#XE!$(5%\"H5\"\"(5#$H1$\"X1#\"H-'$8)!$8%)\"H!!\"8!!\"G]\"\"WY!"
+ "#GE)\"7M!\"8!!!H!!\"GE\"\"7]!\"WU#&'Y&\"G]!&(!,#X%\"#8%$#H%&#(-!!(9!!(9#"
+ "\"(%%\"89!\"85!$HE$\"HE$#HI&\"XM\"#(I$\"XY\"#(Q##XU&\"8A!&8Y(#(Y!\"Y%\"%I%'"
+ "&I%)#HU\"\"I)!$Y-!#I5%!Y5!#)5##))##)A#&91'$IE)#9=!$9E%#YE\"#9M!$IQ%"
+ "#YA#&)Q(#IQ\"#9U!$J!&$)Y#$YU*$Z%*%IU)$IY%$*%#\"Z)!\"J-!%J-\"#Z-\"%*1'"
+ "%Z)'%*5'%:A!#J5$!ZA!#JA!#JA!%:9$#ZM!'ZI'\"ZA!'*M'!*Y$'*Y,%:M$#ZU!"
+ "%JY!#ZU!#ZY!$+)!!ZQ!&JU%#Z]!$*Y\"#+%&$[%!\"[%!$JY!#[)!#ZQ!%+)\"#[9!"
+ "%[-&&;9+%+1\"$[9$#[1!&;5#%;5#&+5\"#;9\"%+)\"$[9!#K=#)K11%+M!![I!$[E!"
+ "%+9\"%KA$&;=&%[9!%;=\"%;A&%;M\"&;E'&[9)$[I!(+5\"$+U!'[A!&+E!';M/&;I\""
+ "![E!%+M!%;A\"$[A!%;A\"$[I!$[E!&[E%$[I!$[E$%KE#%;M\"$[I!![A!$;I&%+9\""
+ "$;E\"%;A\"#+A)'+E*&+9*$[A!&+A\"%;=\"&;A'$+=!%;='%+U!#[9!'+9\"%;I\"%[9!"
+ "!+1!#[1!$;=\"#[%!'+-\"%[-)&;-$$[1!#[-!#[%!%[1)%;-\"#[)!\"[)!$+)\"';-,"
+ "%[!\"#ZQ!&+)&$:Q$%*U'#ZQ!#ZY!#ZY!#ZQ!&JQ-$JI!$JM!#ZE\"#JI!!ZE!#Z=\""
+ "#ZQ!%:=(#:=#\"Z=%\"Z9!\"Z)\"#J5!$J1($Z5&&Z!$$*1#%:)!#J-$!*)!%:!(#YI&"
+ "$IM%#IY!\"I]!$IQ&#IU\"#9I!#IY!#J!!%)I$#IQ!\"9M##9A!!YM!!)9!#)1#$I5&"
+ "!95\"\"Y1\"#91!#)-#!))!!I!##9)!%)%&\"8M##8]$\"8I##HU\"#(M#\"Y%\"#XI#$(I$"
+ "#8=\"#8I$$HE*!(I!#(=$#X=$\"X%#\"H5\"\"X1#\"8-!!H%##H)!#7U%\"W]#\"7Q!\"(%%"
+ "%7A$$WM$\"7U!#H-!\"WI%#7Y#!()!#8!\"#7]##H!&$H-$!H1!#X-!\"8=!\"H1\"%H-$"
+ "#8=$\"8=!$X=+\"XI\"\"8I!\"8A!#(M#$HM#%HI%#(Y##HQ%\"8U!%XQ&#Y%&#9)!#I)\""
+ "#9%!#I-%#I%)#)1#\"I1!#)5##)9#\"9=#!)9!$)E!$9I%\"I9$%)I!#)I&%Y=+&99'"
+ "#I]!#YU\"#9M!$Z-&!YY!#J)!#J!!%Y]$#J%!#J)!$Z)&$:A#\":%##Z5\"\"Z%\"#Z=\""
+ "$*9\"\":1#$J=!%J9!#ZE\"#ZI!%*E'#J1!$JQ%$ZI\"#:M\"$*M\"$JI!$*I\"$*Q\"#ZU!"
+ "&JY,#ZI\"%K!$#Z]!$ZY\"%+%\"#[%!%[9$';%$#[-!$;)#%+)\"%[-&#K-$$+9\"$;1+"
+ "%K1('[9&$[5$%+5\"\";=\"$[=!%[)&\";5\"'+=*%KI#%[=!$[A!&KA(%;A\"&;U\"'+A\""
+ "%;5\"'KE($[E!%;A\"%;E\"%;E\"&;I&&[M)%+Y!$[E$%;E\"%+Y!);E($;I\"$[I!%;I\""
+ "$[I!$[E!#[E!%[I$&+I%%;M\"%;1\"$+U!%;E\"%KI#%[=$$+Q!$[9!%+I%$[E!%[I!"
+ "%[I$$[E!&KE(&KA(%+I&$;E\"%[A$$;A\"%+U!#[A!$[=!%;A\"&[=!&[=$%+1\"%[9%"
+ "&[9!$+9\"#+1\"%[5!#+-\"\"[9!$[=)$;1#\"[1!%;1'$ZU!%+!\"$;-\"#[%!%[%)\"[%!"
+ "#[-!$[-$$+%&$;%#!JU##*]\"&:Y$$*]\"#JY$\"*E\"$*Q\"\"Z=!\"JU$%J9\"$JM$$JA!"
+ "#ZQ!$*M\"!ZA!&:9!%J5\"#*!#$:=$%J1&!Z1!%Z%*%*='\"ZE!$J)%#J1!$J%%#*%#"
+ "':!\"%9]\"\"I]!$IU%#YM&#Y]\"$Y]##9Q!$)Q$\"9Q##IE\"#9E#$)E##IA!$)9*$9=%"
+ "#Y=##I1%#95$&Y1-\"Y1\"#9!\"#I!#$Y%!#Y!$#(]##(]#\"XY\"#8U$$8Q(\"I!!\"XM\""
+ "$(E(!(I$\"HE!!(E!\"X=(#8E%#85\"\"H1\"\"HA%\"X!!\"X%#!(-!#8)'#X!!#7Y%!']!"
+ "#GM$\"7E!!'U!!'U!#X%'\"7U!#H!$\"8%!#X%'#(-!\"X!##(-$!H1#\"8=#\"(-#%(9&"
+ "#8I$#X='\"XA&#XE!%HI%\"8I##8M$\"XQ\"$HM#!HU#%(M#%)!\"!H]!!)!$%9)&%9%*"
+ "\"8]!#)-#$)-'\")A%%I1$!YA$$)5!\"I5!%IA*$9U!$)=$%)E$#YI##YQ#$)I$$YY#"
+ "&)U!!)Q!#9U$&I]*$IY&$:!!$YY&$*%#%*!!\"Z)\"#Z-\"\"J--#J1!\"Z5!$J5!#Z=\""
+ "#J1!#J=!#J=!%:Q$#ZQ!$:I#&:=%$:E$$JM%%JQ$#ZQ!$JA%&JY,$*U\"$*Y\"&*]&"
+ "&JY!\"ZY!$K!$#[!!%*Y&(;5($;%\"%JY(%;1#$[-%#;-\"%K-(\";=\"#+1\"%+1!$;I\""
+ "&[5!\";9&$[5!%+1\"\"[5!&+=&%+A!%KE$$+E!&+A\"&;Q'&+9\"'[E!%;I\"$;E\"%;A\""
+ "'KE,&[M$%;I\"';A+$[I!&+Q%%KM#$+Q!$[U%%+M%$KQ#%[5)&[]$#[M$$+M!%+M!"
+ "$;M\"$[M$$+M!!+Y)#+Q!$+M!&;A/#[A!%+M%#+Q!\";]\"#[E!$+U%#[I!%+M!(,!)"
+ "%;I\"%[E!$[A!%;M\"%;Q&$[E!%+E)'[E)&;E'$[=!$+Q!%+M!%[A$$[A!$[9!%+=!"
+ "$KI#$;5&%[9$%+5\"$[9!&*Y'$[1!$;-#%+1!$+1\"%+1!$;-#$;%\"%+=&#ZU!%K1$"
+ "\"ZM!&;!,#ZY!';5#$:U#\"+%!$J]!&J]!&*U+$:U#!ZQ!':A%$*M\"\"*A\"#JE$$ZM%"
+ "#*I\"%ZI\"$ZI&!ZQ!#Z=!)*%'#Z9!#ZA!%Z5\"$*5\"#JE!#Z-\"%J-%!:-&#J!!$J%\""
+ "%*%'%*!$\"*!%!YU!#I]!$9U!#9U!%IQ&$9M%&9M#$)E!#9E!#9E!\")E\"\"Y=%!Y5!"
+ "$Y1*!)9!%95,$)1'#I-%%9-)#))&#Y%#$)!!#)5#%8]#!H]##XY#\"HU!\"HQ$#(U#"
+ "%X])!H1#\"8I#$8E#\"81!!(=!$(E(#X9'\"(A\"$81&#H1&$8-)\"X)#\"X%!\"X)##'Q$"
+ "#7M#\"'I!\"7U!#GY#\"GU\"\"WM#\"GU\"\"G]!\"H%\"\"H%'#7]%#8=%\"H5\"#(5#\"(1##89$"
+ "#8Q$\"8M!\"XE#!HM&!HI!!XQ!\"XM\"%HQ(!XU$#8Y$\"8Y!#Y%*#X]&$Y%!#I%#\"Y%%"
+ "#I-%\"I)!\"I1!!Y-$#)5#!Y9!\"IA$%)E'#Y=#$)A##9Q!#9E!#9I!%IY\"$IM\"%YY("
+ "\"YU\"\"J%!$9]'&I]#$*!#\")Q\"\"J)##I]!$*!1\"Z-%\"J1!$:1!#J-!#J1!%*9&#ZA\""
+ "%*9'$JE%$*A\"\"*Q\"#ZQ!\"ZE!%:I'$*E\"%:E$%JQ!$JI%#ZQ!&JY,#ZU!\"ZY!#ZU!"
+ "$J]!#[)%$JY!%+5\"$+%\"%+)\"$;5\"%;-#!+1$#[!!#[1!%+1&&;E\"%;5#\"[)!#[5!"
+ "&[)\"&K9$'+=*$[5!#[=!$[I!&;I\"%[A!%[=$&;I&&;E\"%[E$$;=&%+I%&+A&$+A%"
+ "%;M\"$[E$#;Q\"%+E!$;Q\"%;M&$KY#$+Q!\"+U!$+I!$+Q!$;M##[=!&[M%$+U!#;Q\""
+ "&;Y\"%+M%%;U'$<%\"$+Q!$+U!$+U%$+M!%;U&&+Q%$;I\"&[],$+]!&+=!$[U$$;U\""
+ "%+M%&+M!$KE#%[M1$;Q\"$KE##+I!'+=\"$KY'&[I$![A!&;A&#[A!#+I!%[E!$[A!"
+ "%KA$$;M\"%[9$%;A&%[E$$[9!%[=!$[A!%;=\"#[5!&K)($Z]%$[E$$[)!$;1#&+%'"
+ "';!$#Z]!!+%!$[)!#[-%&;!#$*Y&\"*U\"$:Y#&*Y\"#[!!$+!\"#ZE\"#*]\"$JE!\"ZM!"
+ "%:I'#ZA\"%*E'#JE$#JA!#Z=\"$J=!#*9\"%*9&#JE!$:5$%:-!%:-($*)#$J%\"$*)#"
+ "$:1!#J%$#IY!\"IY#$9Y!!9Y\"\"IE!$IY%#)M\"#II$$IM&!YU!'9E+#)A#$IA%#9A!"
+ "!I=&!Y9!\"Y5(#Y=&!)=$!Y)!#I9\"\"I)!$I%'$I1##I!#\"Y!##XY&#99$$HQ'\"XU\""
+ "\"8Q##(I##8M$#(A$#(E#\"H=!!H=!!X-)\"81!\"(9\"#(9&#8!$!8-\"\"H%'\"7U#\"7]!"
+ "#7Q#$7M%!'Q!\"8!!#']!#H)&#()$\"81!!(5!\"X)\"#G]!\"X-\"#(5$!H5%#85$$85&"
+ "#HA%\"8A!!(M!\"8I!$8M(#(M##8Q$!(U!#HY%!XY*#9)!\"8Y!#9!!$)%$#9)$\"IA!"
+ "$)-$#91$\"91#$IA)$Y1'!Y=!\"I=!\")=\"#)E#$9I\"!IE##IY!$YM##IY!#9Q!#Z!,"
+ "\"IE!$9Y!$J%\"$Z!#$:1!#Y]\"%:-(':%#\"J-!%*1#%Z1#\"J1!#J5!!Z9!#ZA!!ZM!"
+ "%:-!\":A\"#ZI\"\"ZI!#JA!$+)\"\"*Y!%ZQ\"!ZU!\":U\"#JM!$[!!#[%!#[!!#ZU!$+%\""
+ "%+!\"#;)\"(K%*%ZU\"#[!!$[-!$K-($[-!#+%\"#K9$!+5$#[%!'KI#%;I\"%[=(%+1\""
+ "%[I!$[A!$[A!\"[5!$[A!%+A!$+Q!$+M!$[E!$+M!&[I!#;I\"$KI#%+M!#+M!$+M!"
+ "$;M\"\"+U!$;M\"$KI'$+U!$;Y\"%+Q!$;E\"&[])%[U%%+U!\"[I$'+M!$KY#%+Q!&;I\""
+ "$;Y\"%[Y$*;I'%KQ#$[U%$+M!'+Q*%;U\"%KY#&[U%&;E\"([I!#K]#%K]#&KU#$[Q$"
+ "&[Q$$;M'$+Q!&;I+%;Q+\"[Q%%+M%\"[E!%+=&%+Q!%KM#%[I!#KE#![I!&[E)%[E!"
+ "#;E\"#;=&%;A\"&+9\"&;A\"'[=!%+I%$[9!$[9!&;9#%;1#![5!#[1!$[5(#*]\"$[%!"
+ "$J]$#[-!%+)&%[5%!+)$$ZY\"#ZU!$:]##[%!!:]*#ZY!#Z]!#ZU!\"ZY!\"ZQ!$*Q\""
+ "(JM.#JM!$JM!$ZA%#ZQ!&:I!$ZA&#J9!#Z9\"$:1!\"J-!#:1#$Z1\"#Z1\"%:-%!*-!"
+ "#J%!#J%!#J%!$)M$()]*!)U$$II##9U!$9U$%)Q$#YE#&IQ(\")I\"$IE%$9E$#Y=\""
+ "$9A$#9M$&9-.\"Y)\"#)-#\"I1!$)%!&9%.\"Y-%$)9$#H]%\"Y!#$))!\"8Y!#(Y#$(Q'"
+ "#HU%$8E##(Q#\"HM$$(E$\"H9\"\"XA\"!(=!\"X=#\"X5#$(!#\"8)!$8-#\"H%\"\"GU%\"7Y$"
+ "\"WU!!GQ%#8-%\"7Y$\"GI\"#G])#()!#8%$\"8!!!H-&#(1##85$!H9!$XM%\"X=#\"H9\""
+ "#XM!$HE*\"H5\"#(M)#XM!$8E&#(U##HU\"!(Y!#HU-#(]!\"9-##X]!$Y5*\"9A#\"9)#"
+ "$)1$#Y5##95$$IA&#)-#\"I9!#)I##9I!%YU#$)U#%II##9U!#9E!\")U%#I]!&*%$"
+ "#YU\"#9]##Z!&$*!##IY!%J1&#JA!&:-)%:1!$Z1\"\":5\"%:5!\"*5\"$J-%!Z5!#ZE!"
+ "$Z5&$JE$#*M\"#JI!$JI$$JM%#:Q\"$JQ%$ZU\"$JY$$*Y\"#[%!\"*]\"%[!&$;)\"\"K!#"
+ "!Z]!%+1&$[)%%K%!$+-\"%+-&$[1!%K)$&[5!$+9\"%[5!$[9!\"[9!$;=\"$[=!#;=\""
+ "%;M\"![9!$[A!%K5$%+M!'KI,$[I!%;E\"%[Q(#[M%$[I!\"KM'%;M&$KQ#&+M&(+Q%"
+ "\"+Q!$;I\"&KM#%+U!%+Y%&KU,%+U!%KU#%+Q!&[E%#+Q!%KY#\"+M!%+U!%+Y!%;]!"
+ "%;Y\"%[Y$\"KU#$;Y&%KY#%\\)($+Y!'KY+(+Y!%+]!%+Y!$+Y!%+Y!'<!&&+U%%<%\""
+ "%+M!'+U!(+U!&;Y'\"+U!$+Q!$+Q!%+]%&[E-$+]!\"+M!%;M\"$+M!#+U!$[A$(;I/"
+ "$[I!%;Y\"&KI,'+Q)$[=!&[A)'+A!'+A\"&[=!&[-!$[9!$;9\"%[9!#[9!%K9(\"K)$"
+ "$+1\"%;-'%[-!$[)!#:Y\"![!'$K%$%[-!';-/$[)!\"ZM!(K%&$JU!$:M$\"ZU!$:Q$"
+ "%ZM\"#ZQ!$:I$#JI!#*I\"#JA!$:E$$*A#\"Z5!$:A#$J9!%J5&%:9$#Y]\"#J1!$J-!"
+ "#J1!#Z)\"!Z%!%:)!#I]!\"Y]!$)U#$9U!\"IU$#YE#\")Q\"#YM#$9Q$$)I#$)E#%)I%"
+ "#IA\"$)=!!)=!$Y=+#Y-##9=!\"Y-(\"Y%\"$)-$\"I)'#H]\"#91!$)5!\"H]!#(Y!\"X]\""
+ "!H]!#XU!\"XM\"#(M#'8Q)\"HE!!(U##X=$#(5!#H9\"$(E%\"85!#85%!X-!\"8!!$8%)"
+ "$'U&\"7Y!!GY!\"8!!$X!)#G]$\"8-!\"H%\"!8-%!H)!$(1%\"H=!\"89!\"8-!#(I#\"8A!"
+ "$HA$#(E$$HM*$(=%$(Y'\"XQ%#XU!#(]#\"(I\"\"8U!#Y!#$)1$\"))(!8Y\"#)-#!Y5!"
+ "!I=#$I9#!)A!#Y=##YE#$I=&$)A'#YE##9I!$)M'$9M%%)Q!$YQ#!YU!$*%#$J!&"
+ "$Z-&#J%!#J!!#Z-\"$:1##J-!#J1!#J-!%J1)&Z5+%*=##JE!'*1,%ZE'&*A(#JE!"
+ "#JA!$JM!#ZQ!%JM%$JM!':M(!*I%$+5\"&*U#$ZY-!ZY!$*U\"$;%\"$;!\"%[!%#[-!"
+ "$[1!$;1\"#;-\"![1!\"[1$$[1!$[5!#[5!'+A&$[=!$[9!%;I\"$[1!%+9!$[I!&+E%"
+ "\"[E!$[I!%[E!$[9!&KI(&;Y&$+Q!'KQ,%KE'$;I\"%+Q!&KQ#%;I\"%[Q)%+U!'+U!"
+ "$+U!&+U!#[Q$#;U\"%,!!(+]!'+Y!#+U!%,%!'<!+%[U%%;]!%[Y$%[I!$;]\"%[]$"
+ "'K]#';]*\",-!$+U!(;]\"%L%#%+Q!'K]'&[U%#;Y\"&KU#%+]!%+Y!$<-\"$+I%\"+Y!"
+ "$+]!%+Y!&KY#%+Q!$KY#'+Y%$+U!%KU#&+U!!KQ#';Q\"\";Q\"$[Q%$KQ#%;M#&+M)"
+ "#+]!&[M$%[5$%[I!%;A\"%KE#%+]!';I'$[A!%K=$$[E!$+M!#[5!%K-(%+5\"#K5$"
+ "$K=#$+!&%+5!![%!$;1#%;-'#[)!![9!#[%!#[)!&JY-\"Z]!%Z]\"#JY$\"ZY!$*]\""
+ "$JU$%ZQ*#[!!$:M'&ZA+&ZM&$:M#\"ZE%#JA!$Z5\"#J9!#J5!$Z9&$Z5\"\"Z5!#Z9!"
+ "#J-!!:)\"$Z-)#J%$$:!$$YU#$)Y##9U'#IY!#J-!#IU%#Y]\"%)M(%)Q'#Y]\"#YE%"
+ "\"IU$\"IA!#I=%\"IA!%9=)#Y9##)-#%9%&\"9-#%9%'!)1!\"I-!#9-!$I-*#(]#$(I'"
+ "$(U%#(M#\"XQ\"\"8M!$(M+!XI!#HE\"#(5#\"8=#\"X1#\"XI\"$(5\"\"H1!#X1&\"8-!\"X=\""
+ "\"GY\"#(%'\"X!!!']!\"'I!\"']*\"8)!\"X-#!H-!\"H-\"\"X1&\"(9%!X9)#89%\"(E-#(Y#"
+ "#HQ%#(I#$HI'!XQ!$(I'\"H]!$HU#$)-$\"H]!#)%$$)%%!95\"#I)&#Y1&#Y1&#Y1&"
+ "\"IE!#99!#Y=&#Y=##I5%!I1##Y=##9I!%9M)#YI#$9E%$)]##YU%#IY%#)Y#%Y]+"
+ "%9]\"\"J%!#J-$\"I]!$Z5\"&Z1'$*1\"#J9!\"Z5!%:9(#*E\"#J=!#JM!#ZA\"$ZE\"#ZE\""
+ "#ZA\"#:Q#%*9##ZU%#:Q#%*Y&&:Y$#[%!$Z]%$*]\"%Z]*%;%##[)!!+)!#+-\"$+)\""
+ "\"[-!$+5\"#[1!#[1!$;=\"$K)$$[=!%[A$%[9%%[9$&K=$&+Q!%+M!$;=\"$+=%$[E!"
+ "&+E&%+I!&;I&'[M)%+M!%;M'&L!'%KQ'%KQ'$+Q!$[I!'+U%$KQ#%[U$%K]#&+]%"
+ "&;Y&&;Y\"%;Y\"&+Y!&+]!%+]!%+]!&+]!%,1!%;Y\"(+]!#;Y\"\"L)#%KY#$+]!%,%!"
+ "%,!!&[])$+Y!&;Y\"%,%!&L=&%<!!%,%!(,!.%L)\"&L!#&\\!(&<-!#;I\"*K],$;U&"
+ "%;Q\"%K]#%+]!*KY#%;Q\"$KU#%;Q\"$[I!%KY#&KY'%;U\"&\\!$%;Q\"%<%&%;Q'$+Q!"
+ "%+I)$;I\"&[E%%;M\"%;A\"&;E&#[E!%[A!%KQ#$[A!%+A!$;M#$+=!&;E'%+9\"&+9\""
+ "$[5!$K5$#[A!!+5!%K1(%*Y\"$[%!#ZY!$+)\"$[%%#[%!%ZY!%*M''+!/#[!$$*Y\""
+ "$ZU%'ZU'#JM!#ZI\"%*A'#ZI!&JM-#:E#$ZE\"#:A##ZM!%:9$#Z9!#Z)\"#Z9\"\"Z5!"
+ "$*=#\"Z5!#J-!$J9!#IY!$9Y$#IY!#)U\"!Z)!')M#&IY+#9U!#YQ##IM\"\"9A#%9I)"
+ "\"Y5%$YE#$YA'#9=$\"Y9\"\"I9!%Y-\"#91$$)%(!Y-!\"I!!#Y))#9%!$8U\"$8Q(#8]!"
+ "\"8Y!\"H]!#HM&$8E&$XY*\"HA\"#XE&\"XE\"\"XA#\"8=##(9)!H5!#H%&\"81!$H-*\"8-!"
+ "\"WY%\"WQ#\"W]#\"8!!#8%%#7U#\"H)\"%(-$#(-!#(5$#(1$$89&#H)&#(1!%(='!H9!"
+ "!XM'\"XM%\"XQ\"\"8I!\"HU!\"91,#(Y##XU)#I%#&95$%9)##H]\"\"I1!#Y1##Y1&#)5#"
+ "')M&%99)#)A&%9E)#9A!#YU\"!II#$9M%$IU%&9I&$YU#!9Y\"#YM#\"IY$%9]$!)Y!"
+ "#J-!#Y]\"#9M!#J-!&:5%$:=##*5\"$J5%\":9&$J9!$*=#$JA!#J-!#Z=!#[!!\"*U%"
+ "%ZM\"$JY$#JM'#ZQ!&ZM\"![!$#ZQ!%K!(\"[-!#Z]!$Z]%%+-\"$+%\"\"[)!!;)\"%+5\""
+ "$*Y\"%+1&$;1#$[!!&[5!(;A0$[5!#[=!%;I\"%;M#%+M!$+E!%[E$%[I$!;A\"%KI#"
+ "&[I!%+U!#KU#$+M!$;A\"$+]!%KM#&KU#%+U!&KU+(;U&&+U%%[M%&<!&&+]%%+Y!"
+ "%K]#'[])#;U&$+Y!%\\)##<!\"#<%\"%,!!&,1$&L-#&+Y!%L)\"&L1&$+M!&\\%(%,%!"
+ "#<)&&\\%$%L-\"'<!*&,%!%L!#'\\%$\",%!!<%\"$<%!%<%\"$<-!*<!&%L)\"%+Y!&+U!"
+ "#+Y!(L!'$\\)#!+]!$KY#%+U!%KY#(<)!%,)!&+M!$[U%%\\!#'+M!$[I!$[I!&[I!"
+ "$;M\"$;U&$;E\"%+M%#[I!%;I\"%;A\"&+I!&[E!%;E&%+5!';-,%[I!&+Q%%+M!'+=&"
+ "$[A!&+E&$+5\"\"[5!%+1\"&;1#$+-!%[-&%;)'&K)-$+%\"%+%&#ZY!$+!\"\"Z]!$ZY%"
+ "\"ZY!$:]#)ZU'$[!!&ZU*!ZI!$ZM\"$JM!!ZI!#ZE!$JA!%JA\"$:9##J9!\":1\"%J1)"
+ "%:5!&:%&#J%!$Z-&%J-\"#Z%\"\"J!!&*),!Z%!$IU%#9M!$IU\"%Y]+#9Q!#YM##YM#"
+ "$IE%#9E!#)I##YE#$)9'$9A+#I9%#91!!Y5!#))#$I9#\")%\"$)!!\"I)!$)!%#(]#"
+ "#XY#$9!#\"XM\"\"8M!#HM\"!HQ!\"(E\"\"8E!\"XA#\"X%!\"8E!#(=!!XA!\"H9\"$8)#$(9\""
+ "#GU(\"8!!\"8!!#(!'\"81#!GY!\"X5#$8=##81!#(5#%(9!\"X=\"$8=&#8A!#(E$\"XU\""
+ "$HI'\"8M!#HQ%\"I!!#XI&#XY&%(]%\"X]\"\"8]!$)-!%)%%\"Y!\"#I%&#9=!\"I1!$9=("
+ "$99%!Y5!\"I=!\"IA$#IY%$)I#$YM&$9I%%9M%$IU\"$)U##9U!%)Q($:1!#)U##J%!"
+ "#Z-\"$:5$$Z5\"$:%$#*1\"$JI%%:A$$*E\"#J5!#ZI!#JI!!ZA!%*M'#ZI!$:I#&:I("
+ "#ZQ!$*Y)#ZU!$*U\"!:]\"#[!!$K%$$;1##Z]!$[%!$[%!#K)##[)!$K9$$K9(%+9!"
+ "&;)'$+5!%;5\"%[=!$[9!%;5#$KQ#$[A!%[I!%K9$%+Q!%;I\"%+I!&;E\"'+A!!+M!"
+ "%+Q!$+Q!&;A+%;E\"&+Q!$KY#(;U!'KY#%+U%$<!!%+Y!&+Q!%;]\"#,%%%+]!%;]\""
+ "&+]!%<!!&,%!&L!')<)%&L%\"&+]!%,)!&,%!%\\!#&,5%%;]!%,%!%+]!#,)!%,)!"
+ "),))'L1&%L%#&L)\"%<1!&\\1#%,1!#;Y\"%L)\"&L%#$\\!$%\\)$!+]!%\\)$$+Q!%,-!"
+ "\"<!&%L5\"$<)\"%,!!(;U'%<!!&<!\"%,-!%\\!#&;U&&\\%($+Q!%KQ#%+Y!%+]!$[I("
+ "$;Q\"%;Y\"%;U\"$+Q!$+Q!\"+Q!$;I\"#[A!$[A!&+I&$[I!&KI#&;='%KA$$[A!&KE("
+ "&K9$(+=!$[9!#[9$%+-\"#[1!$[1!#[1!%;)'\"[-!\"[)!%;%'!Z]!$+-\"'K!!%+!-"
+ "!JU#&*U\"$*Y\"#Z]!$*U\"$*Q\"#JQ'%JM!#ZI!%*M'%ZE\"#Z=%#JE!$*=\"$*E\"$:=#"
+ "!*)!#Z5\"&*=$\"*=\"$:)$%:)!\"Z-%#J%!\"Y]\"$)]#!Y]!\"9U&#Y]\"$J)%\"YQ!$J!%"
+ "#9E!&9I&$9E$%)A$#IA!#)=##99$#I9\"#95'#95!!Y)!$I%##9%%#Y!##I!\"%8Y$"
+ "$(U(\"8E##(M##(M##XM'$XU'#(9'\"8Q!#(E#\"HA!#8=$\"8A!#X9/\"85!%7]+#(%$"
+ "$'Y)#GU&\"8!!\"8!!#81!\"H5\"\"7Y!\"(1\"\"85##(9!#X1'#X-'#(E##8A!!(E!\"8I#"
+ "\"8U#\"HU'#(U#$)!'\"XY%#(Y#!Y!$#Y!$#)%##9)$\"I)!#I5%$91%#Y9#\"I5!!Y9!"
+ "#)=#\"IA$')A&#Y=##YU\"%IQ#$YM&#IY!#IM(#YU&&YY!$)]#%)]($J%\"':%\"%Z)'"
+ "$*)'$:-#%I]##J5!\"*5\"%:5!$Z5&$J=!\"Z=!&*A#\"ZE!#JA$%JI)$*I\"&:U$#ZQ!"
+ "&JQ%\"[!!%JQ(\"*]\"$J]!'K!&$K%$#[!!%ZY!#K%$$[1!$+-!%[-!'[9!#[)!\"[9!"
+ "#[5!&+9&$+5%%+=\"%;=\"$[=!'+A&%[E$$;I\"&;M\"%+Q!$[E!%;I\"$+M!%+U!%+Q!"
+ "#KQ#$+Q!#;Y\")+U%%+Q!&+Y!';U+&;Y.%;]!(;]\"%,)!#,%!%,%!&,%!(\\%,'\\-,"
+ "'<!&$,)!&<%%$,%!&L)+$,)!%\\)#&L%'&,%!)\\!2$,)!%;Y\"$,%!%,1!%L-\"%\\-#"
+ "$L%#%,-!%,-%#+]!$,)!$\\-$%<9!%L-\"&,%!%L5\"%;Y\"%L5#'L)\"%L)##<%&%L)\""
+ "%,)!&,)%%,)!%;M#%L)'&;]\"$,1!)K]#%L!#&K]'%+]!$;]\"%;]!'[],&\\!$%;M\""
+ "%+]!$,!!';I\"%;U\"%;Q\"$;Q\"$KQ#$;Q\"$+M!$[E$%;I\"%[=!#[I!$[=!&;Q\"%+A!"
+ "%+9\"'+=!$;A\"$[5!#K9##;=\"%+1\"#[9!$+1%%[9)$+-\"$;-\"$+)\"#[%!%;%#&*]#"
+ "%K!)%ZY&#ZU!#[%!$:U$!K%#$ZU%$ZY%$JM%#*I\"\"*E!#:A#$JE$'*=(#J=!#J9!"
+ "#*5&$*-#$Z5&$:-$#Z-\"%*E*\"Z!!%:%!%*%'$*!#&)]%!)]!$9]!#9M#%)M$$9Q!"
+ "\"YM!\"YA%$)E$#Y-#%I=$#IA!#)A##I9%#I5\"#Y5&#Y9#\")-(#9)$$9)\"#Y1##(Y!"
+ "!Y)!#8]$#(Y#\"8Q!#XU##8E%\"XI\"#8A$#HE&!HA(\"8A#\"8E!#H9\"$H-!!X5$\"81!"
+ "!7U\"#(!$#H1(!H!#$()(#(-$\"81!!X5&#H1&#X9$\"XI\"#(A!\"HA!#XE!#XE$!HM#"
+ "\"HI!#HY($8Q#\"XY\"#H]%$H]#%I%-#99!\")!#$9))\"(]\"\"I1!!Y5!$95\"!I9#\"I=!"
+ "$)=!%9E\"#9E!#IU!%)Q$$IQ%$9Q!#9M!%IU*#J!!%J%*$9]!#*%\"%:%!'*1!%*)'"
+ "$*-#%J-&#J5!#J-!$J5!#J5!%*=#$ZE&$*A&#ZQ!$:I$&:M+#ZU!$:M#%*U\"%*A&"
+ "\"[!!':U!#ZU!#[!!$JQ!#ZY!#*Q\"%[-!![)$#[A!$K-$!Z]!$;9\"%K1(%;=&$[%!"
+ "%[E!![-!$[5!%;9\"&[E!%[=%$[E!%+E!%;I\"%;E\"%;I\"$+M!$+M!\"+U!$;Q\"&KU#"
+ "&KQ#'+Q!%;Y\"&L)#%;]!$+]!&;Q'$+Y!%,!!',!!&+]!#<%*'<-*',-%%<5!%+U!"
+ "\"<)\"%,!!&,1$'<5!(<-*%\\)$%L5#&<-!&<=!',-%&,%!(L!\"%\\-#%,-!',5$(<%!"
+ "',5$$L1'&\\1(&<=!',1)%<5!%<5!(,1-&L-\"%L-#%\\=#%\\9#%,)!(L)\"#,-!%,-!"
+ "'<9!%,)!%\\)$&,)%%,)!&L-\"%L1\"$\\%#&<%&\",5!%\\%#&\\!(%;]\"&L!'%+]!$\\)#"
+ "%KY#'+Y!)+U!%+Y!&+Y%%+U!%,)!#[I!$+Q!$KQ#$+E!$KM#%[5$![I!\"[E$#[9!"
+ "&+1&$;A\"$[A!\";E\"#K1$'[E-$[1!$[1!$+5!$+)\"#[1!#[-!$[)!$+)!#[9!#[)!"
+ "$[!!%+!\"&*]\"\"ZU!&J]%\"ZQ!#JA!%:Y$!ZM!%JM!\"ZM!\"ZI!%ZE\"#:E##ZE%%:=("
+ "#Z=!\"Z9!\"ZM!$*%##Z1\"#Z-\"#J)!$)]'%*%'#J%$$II%\"J-$!YQ(#IY!$9M(#9Q!"
+ "#9Q!#II\"$9M%\"II!\"I9$%YE($II)$99!$I-)\"95&$I-&#)-#!)!!$))$%9)&#I%#"
+ "$Y!$\"I%!\"8]!\"8U!%(Y%#(Q##(I$!XE'#(I##(E$\"X=\"\"X5#\"8M!#(9$\"85!#85$"
+ "\"()\"$GQ\"\"H%%#X-$#(-$#H-#\"(5\"#8M%\"85!#8I$$89##8A$$HE'$85##(='!XM$"
+ "#(M!\"HU!#(I!#9!$#8U$!Y)!#I%%%I1$\"I%!#95!#Y-&$)A'\"I5$\"IA!\"IE!%)9("
+ "#YE\"%9Q\"!YE$#9Q!&9M##YQ#$IQ%#YY\"#IY!$9]$#IY!$:!$%*%'#IU(\"*)\"#Z)\""
+ "$*-#$ZE&$ZI\"$Z9&#J9!$J=!$J=!#JA!%JQ!&*E+#JI!&ZM&$*Q\"#ZE!#*M\"$*Y\""
+ "$JI!#JQ$$+-\"$+-\"$K!$#[%!&;%+#+-\"#[)%#[-!$K%$'+)'\"[5!$[=!%[9$'[5!"
+ "%K=$#+5\"#;=\"$[1!#[I!&+E&&[M%%+I*%+I&\"[E!\"[E!\"[M$#+M!%+U!';Y\"&[U("
+ "&+Y!%;]\"%+Y!&+Y!%+M!(L9!$<!!&\\%#\"\\-$%\\%$&K]'&<!\"%<)!&<1!%\\=#%<%\""
+ "&<9!%,-!&L9&&<1%$LA\"%L-#$,1%&\\1(%L-/&L-\"%<5!$<1%(L9/&+U!$\\9#)<%!"
+ "*<-!&,5$',5)%,%!$,1!'L5'&<5!%L5\"&,5(&\\1(%\\1#%,%!&,9$%<1!\"L1#&<1!"
+ "&L-#$,-!'\\=\"%<1!%<A!%L1\"&L1'&<1!$<!\"&L)\"$<%\"),!%$,)!',%!\",!!(L!0"
+ "',!)&,!%&[M)'+Y)%K]#%[I$#;Y\"&+U!%[U%$+Q!);U&#[E!$[U$$+M!&;Y\"%[M$"
+ "&[A!$[A!'[E!$[I!(;5(%+=\"#[A!$[9!%;5'&K!%#[-!$K9$%;5\"$KA''+5\"\"K1#"
+ "#[5!$;)#$*Q\"!*]%#[)%$JU$!*Q!#:U#$:Q#$JM,#JM!#*M\"$*M\"%ZE\"%ZE&$:A("
+ "#Z=%$JA!$J9!$*9#$:9##Z-\"#J-$$Y]&%:-!#Z)\"$Z%&#J%!\"I]#!YY!$9Y!!9Q\""
+ "\"YM\"$9I$!II#!9I\"#)U)$)E#$9A$%9=##Y9&\"IA!$YA$#95!\"Y1\"#))#$9!(#9!!"
+ "#I%##Y)#$9!##8Y$$X]+#)%#\"8Y#$HI*\"8M!#XM&#(I#\"8A!!H-#$(A\"$(9\"#(%$"
+ "#8!##(%$\"H=!\"X-\"\"8-!#H5#$(5%#(9$\"X9\"#(M##8A%!XA$#(A!$(E\"!HI#\"HM!"
+ "$XQ!\"HU!\"HQ!#9-$\"X]\"#8]'#H]\"$Y9'!Y1!#I5%#91$%)-+\"I=*\"IA!#)M\"#9A!"
+ "#9E!#YE##9I!$)M$#IY(!YI!#9U!#I]!#Y]\"#9]$&*!,#J5!%*1'#J!!%*)$%*1+"
+ "#J1!#J5!#J5!%J9)#ZI\"$Z=%$:=##ZQ!'*E(!ZQ!%:E(#JI!$*]\"$JE$$JQ$%+%&"
+ "$JM$\"[%!&ZU&$:U'#[!!$JY$$[)!!+%!&;!/&[1)$;)#![5!&;9'$[5!'+A*%+=\""
+ "#K=$&+5&&+9&%;E\"&[E!(+Q!'KY'$[I!$[E$&KQ(%;U+$L!#';Q'$;U\"&KQ(%[M$"
+ "%,!!%,!!%;]\"(\\%(%K]#$,-!$L!#%,)!%\\%$%,)!'\\),$,)!%,%!(\\11%<%!$\\-$"
+ "$,1!&L9'%,1!&,1$&L5*%<9!%\\9#'<9!#,9!%L5\"$<E!#\\=($L5''\\5#*,%.%L1\""
+ "%<9!%,%!!,1!*,9-(\\9(%<!\"%<9!#\\5#%<1&#\\5#&\\)((,)-%,)!%,5%%<9!%<9!"
+ "$,5!%L=\"%<5!%<=!%,1!$,5!%,-!%L)\"%L-\"&,-$%,)!%L1'\"<-\"#,%!%\\%$(<-!"
+ "$\\%$%;]\"!,!!$\\1#&[]#'L!,#<%\"(,%)$+U!'+U%#[U$%[U($+M!&;M'#+A%$[M$"
+ "%;M\"$[I$$[=!&KQ#%[A%'[E)$;=\"%+9!%[9!%;A\"%[5$%K-$\"[1!#[)!$+-!'[9!"
+ "#ZM!\";%\"#Z]!$Z]%$+)!$:Y#\"[1!$*]\"$*U\"$*]\"$JA!&:M$#ZU!#JI!#JE$#JE!"
+ "%JA)#ZI!$J5!#J=!#Z5\"%*E'%:1!%J-*$J1\"%Z!'$Z)&\"J!+$:%$#IY$#9Q!%9]("
+ "\"IY##IQ\"#9M!#YM#$)M#%Y9\"\"I=!#Y=#!Y=!%)I($)-'\"Y-\"#Y1&!H]!!I)#\"I-!"
+ "#9%'#9-!%(I\"$H])#HY%#(U##(I!\"8Y!#(I#\"8A!#X9$$89)\"8I##H=\"\"X)#!H=!"
+ "\"X)#\"H-!\"H%\"\"X%##85!\"X9##H5&#85%\"XI($(A!!(=##(I'\"HE!#HM%#HQ%$HE'"
+ "$(U'#8Y$\"Y%\"\"X]%&9!($)!$\"I)!#9-$#8]$#Y9)#Y5#%9I&#)A#\"IE!#9A$%YI!"
+ "$)M$$9U(\"9Q#$II&#9U!#YY\"%)U(#9Y#&*!+\"YQ\"$)]##I]!%*)#%*-##Z1\"$J1\""
+ "%:5!#J-!#JI!#*=\"$J5%#J=!':=&\"Z=!&*I+#JE!#JI!$*Y\"#ZU!#ZY!%JU!$+!\""
+ "%:U+#[!!&Z]\"#[%!#;1\"%+)&#[-!$[1$%+=%%;%'*+1+$[=!$[9!%[E$%[5$&;M'"
+ "';E+%;E\"'+E&%+Q!%[=$$+M!\";A\"$;A\"$+Q!%KI#%;Y\"%<!\"%+Y!'[Y$%,!!%KU#"
+ "'<)!'L%+%\\!##<5!'L%+%,)!%,)!\"<%\"%K]#%L-#(L1&%,-!&,)!',5(',)%%<9!"
+ "%,)!&\\5#\",1!%<A!%<A!%<5!'L-\"%\\5#&<9!%,1!&<9%&L9\"%<9!%<9!'\\-##<5!"
+ "%<=!%<A!%L=\"%,A$&L9\"%<=!&<A!'<9!%<1&#\\9$%<5!%L9\"%<A!',I)%<5!&<5!"
+ "&,9$$,5!&\\9(&<-*%,5$&<5!#<1\"#\\1$*L5!*,-)'<1!&,)%%<)%'L1\"'<)!&[]$"
+ "&<!\"%,%!&L5''L%,#<%\"'+]!%;]!*,%*%,)!%\\%$&+Y%#<!\"%+U!&;Y&%[M)#;U\""
+ "%+E&$+U!$[I!%+Y!%[U$\"+M!([=&%KE$#[9!'+A\"%[5$%K1$#[5!#[1!$;-#$[)%"
+ "$+1!$[5%(+=\"%Z]\"$[!&\"[)!$;!#$*Y\"$*]\"\"ZM!#Z]!#ZQ!#:Q\"$ZA\"%*M&$JE("
+ "#ZA\"\"ZI!\"Z9!#:9##:=#$*1\"#Z5\"#J9!#J)!!ZA!#J-!$*)#$*!#\"J!!$:%$#)Y\""
+ "%)U!#Y]&$9M%\"IQ!\"II!\"I5$#IU!#9I!#9I!#I=\"\"YI!\"9=##I1(#95!#)1##Y=#"
+ "!Y)$$9%#\"8Y!\"8I!$(]!!(U!\"8U#\"8Q!$(Q'\"XQ\"#XM&#85%%(A&$(A\"!8=\"!H9&"
+ "!8!%\"H%!\"X1\"#H-%\"X5#$8=&#X5&\"X=#$(=!%8E$!XI!#8I%\"8Q!$(M\"#XI!\"(U%"
+ "!Y%!\"I!\"#(]!\"Y%#$Y)!!9)\"#I)&\"9-#$91(#)A&\"I5!#)9&!IA#!Y=!#9M#%9E)"
+ "#YA#%95##9Q!!)Q'!YU!%IU##IY!$J!%#Z!\"\"Z!!$J5%$J5!\":-##J)!$Z1&&Z5'"
+ "#J)!$Z9&\"*E\"!:A\"#JA!\"ZE$%ZI\"$ZI%#ZI\"#JM!#ZQ!$*Y\"!*E!$ZM\"$*]\"$*]\""
+ "%*]\"%J]!$*]\"#;%#%+)&#+-\"$+9&$K1$%;5&\";E\"$+9\"$[9!%K5$#[=!&+1\"%+5\""
+ "#;I\"$[E!\"[I$'[I!$;U\"$[Q%#[Q$%+Q%%;U\"&;M##;Y\"%<!\"$,!!&[]#%KY##,!!"
+ "',!!)L9%%L%#'<)!$[]$$<-\"%,%!#,-!%,-!\",5%'<1!%<1!'L9\"%L)\"&<9%),5-"
+ "$,5!&<5!'\\9(%<A!&<9*%<=!&\\9($<)!%<=!%<=!%L=\"$LA\"'\\=(%<E!#,)!&<E!"
+ "%<1!(<E$\",A!'\\A\"'\\=,'<=!(LI.%LE\"&<M!$,9%%L5\"&,=$&<5!%<=!',9$%<=!"
+ "#<9!$<1!$,9!&<I!%<9!'<1*%<5!%L5\"&\\-($L-#&L)\"\"L1#%<5!$,-!%<9!'\\-("
+ "%L1\"%,-!%L5\"&\\%(%KY#&<)&\",9!&L%''+])&+]%%;]\"%+Q!#+Y!$+Y!&+])#;Q\""
+ "$+U!&[]$$;M#%K=#&+5\"$[E!&[E!&[=%&[9!$+=!$[-!%+9\"%+1\")+5'%;5\"$[1!"
+ "#[-!#[),\"[%!#Z]!#[%!#[!!#[!!%JY(#Z]!$K%($ZU%%*Q\"&JQ!%JQ!#*]\"$J=!"
+ "$ZQ!!ZI!&JA\"#*=%\"*=!#J9!#J=!%:5!\"Z5!$J-%#J-$&*)!#Z!\"#Z!)%*%##I]!"
+ "$9M!&IQ##9U!#)M\"$9E$#9M!%IQ#$)E!$99\"$YA!#9=$\"I=!$91(#95!\"91#\"I5!"
+ "!I%#\"X]\"$9%#\"Y!#%I!$#I!&\"XQ\"\"XU\"!H=!\"8M!$(I!#(I##(=$\"XA\"!H=!#X=#"
+ "#H!&\"(1\"#()$\"85!\"8A#\"H5$!X9&!(A!!H9(\"XE##XE&#(I#\"85!\"XQ%$(U(#8I\""
+ "#I-\"\"I%!$)!'#8U!%)!#\"I9!!)1!!I%#\"I1!\"9-#&Y5#!YA!\"YE%#IA\"#IA!\"II$"
+ "$)E!\")E\"#YE#$IQ)%)U'&II+$IY%$*!#$YU&$*!#!*-!$J)!#J1!%*5#&*5$\":1)"
+ "\"Z5!$*=\"#Z=\"$JM%&*=(\":A\"$ZM\"%ZI*%*M\"%*Q\"$JU!#JI!#JE!$+-\"%J]!%+!\""
+ "#ZY!$[1!%[)%#;%\"$[-%&;5\"%;5&\";=\"$[9!%;5#%K-(%KI##[I!#;I\"%+M!%[E$"
+ "$[I!$[A!%+E!%;U&$+Y!'KQ#%+U!'+M!%<!\"%;]!&+]%%,!!&;]&$+]!%,%!&L%'"
+ "([]$%,)%$L!#'<)!%L-\"#,-!\",1!%,1!',-$&,1$(,A-)LA*%L5##,5!&<9!&L9\""
+ "$,9!'<)!%\\E#&\\=(%L9\"%L=\"&<9!!<=\"&LM&%LE\"&<A&%<A!%\\A#%<A&'<=!+<E."
+ "%LI!#,E!#,A!(LM/%<9!&,M$%L1\"',A($<E!&\\1,'<A*'LA&$,A!%LA\"%L='%,1!"
+ "$L=\"#,9!%,-!%L=\"&<=!\",9%%,9$$<I!#,9!(L9&&L5+'<=)$\\A#%,%!'L1\"(<%!"
+ "%L-\"&,)!$,!!%\\%#&\\)'&L)'',%!&<)%%<!!$L!#%+]!&,!%%,!!&;Y'%+Q!'+U%"
+ "&+M!'+A&$[Q%#[I!$[M$&+I&%;Q\"(+U)&KI(%+E!([E$!+-!&+=&&;9#(K)%#[5!"
+ "$K!(#[-!$;-\"#+1\"#ZY!$;%#&J],#[%!#[!!#*]\"\"ZY!$:Q#%;!'%:E$#JM$#ZM!"
+ "%*I\"$:1$%*1#$JA%#J=!$:=#$J9!$J5!\"Z=!$Z1&$J9!$*-#$:-!!J!#!IY&#IU\""
+ "#IY!$IY&$)U#!YU!%IM*!YE!#9A!'IA&$)U#$YA##Y=##Y1&#I1%\"Y5\"\"I1!\")E+"
+ "!Y-!#I)&#))#!)%$$9)%$H])$9!&#Y!&\"8Y!\"I!!#(M#!HI##HE\"\"8A!#(M!$8=&"
+ "#(1'%85+#(-!\"8-!$85&\"8=!\"X=#\"X9#$(9%#(E!#8I%#HU\"#HQ\"#(Q#\"8U!#(]&"
+ "#(U#!9%\"#9!!%)!)\"Y)\"$I5##Y-&$91(#IE!\"IE!#)9#!YA!$9A\"%IM*$)I!\"9I&"
+ "#9M!#)M\"$9Q$!IQ&$)]#$:-#\"IU!#Y]\"$*%##J)!$J%&$Z1&#*9\"#*1\"$:9#\":9\""
+ "\"ZE!%*=&&*E+#JE!#ZE\"$*M\"\"ZE!#ZI!&J])#ZU!$ZY\"#:U\"\"ZY!$*Y%&J]-%[%)"
+ "#ZY!$[%%$[)!%[-)$+5\"\"[-!$K5$%;-#%+9!$[5!&;A\"#[A!'+A*'[E!&KE,%KQ#"
+ "$+M!$+M!$;M\"#;I\"%[Y$&;U&%+]!\"K]#%+]!$+]!%;Y\"$+U!&K]##,9!%+]!%L!#"
+ "$<)\"&,)!),1$'\\-,&L!'\"\\1$%L1\"%<5!&L5'$L5\"$,5!%\\1(%\\5#'<E%&LA&&\\E#"
+ "(LM%&\\=(&\\Q\"%\\A,%LI\"%<A!%<A!'<A*$<I!'<=&'LE!%LE&&\\E#%LE\"&,I$%<E!"
+ "%<I!%LA\"&LA&&<E!',I#&\\E''LE!$,=!%\\I##LA#%L=\"%<I!'LE&&,E#%<I!'LA+"
+ "&,=$%<A!(\\E!(LA/'<=*$\\=#%<9!%LM!&\\='%<=!'<5!%\\9#%LE!&\\1#%<5!&,I$"
+ ")<)&%,1!$L1\"%,)!&<-&%,)!&<1*%L)\"'[](%,1!!,!!%+U!'+]!&<)%'\\!#&+Y!"
+ "$+Q!&[U(%+I!$+U!$KY'%+M!)+E*$[I!';I\"'+M!%+1\"&;A'%KA#$[E!&KI'&+A\""
+ "%;1#$[-!$+1\"#[%!#[)!%K%!#[%!%[%)$*Y\"%J],$JY$&JY)%ZI'$:U#$JM!%JQ!"
+ "$*Q\"&:M!$:E$#ZE\"%ZI*#J=!\"Z=!%:E($:-$#Z=!#:1#%:A$$:-!$:)!%*%'#J!!"
+ "$:1!#J!!#YY\"#IY!#YQ%&IQ'$)E$\"9I#$YE&$)E$$YA'#9A!\")9%\"Y9\"\"I1!#Y1#"
+ "#9-!\")-%\"I-!%(I&\"8]!#))#\"Y!&$XY$#(M##)%#\"HU!!XM$\"HE!\"HA\"#(I#\"8A#"
+ "$8!)#X5'\"X1##X5&$8A(\"X1##8E\"\"8E!#XE!\"8M!#(I$#H=&$H]'#H]%#X]#\"8Q!"
+ "#(]#$Y!!\"I%$#9!!#I%%#Y-&#I1%#I5%\"95#\"I9$#99!$)9$#YA\"&IQ(#9I!%)Q("
+ "$9Q$$:%$#I]!#9U!#Y]\"$I]%$:!$$Z1&#Y]\"%Z1*\"Z5!#:1#$J=!$Z=\"#Z5!#Z5!"
+ "!ZI(&*=$!ZQ!%ZA&#JI!$:Q#$ZM%$*]\"#ZU!$:I$$JY!&+%\"\"Z]!\"ZY!#ZU!$Z]%"
+ "%;%'$+-!$[A!$[1!![1!#[E!%+9\"$[1!%[A(&[A!'[I!$[M)'KM,\"[I!%+Q!&+Y!"
+ "\";E\"$KQ#$+Q!&[U(%;U\"#+Y!%+Y!%<!\"(<%%%+M!%,!!&+]!&L-#%;Y\"%<5%&<5!"
+ "',1)(<1%(\\-(%<9!$L)#%,1!!<5&%\\=#%<9!&<9!#,9!#,1!%<E!'\\9#(,A#%<A!"
+ "%,=%&\\A#\"<M\"&<I!$<E!#\\=##LE\"$LI\"%,Q#&\\9(',U(&LI&&LI&&\\E'%<I!$<Q!"
+ "%<9!&LM!%<M!'LI!&<]$&LI&%\\U\"%\\A#%,=%%LM\"%LI!%LM!%<9!%<M!%LE\"'<9!"
+ "%<I!%<A%'<M$(,I-&<5%&\\E\"%<I!#LE#&<1!(<5!(<1!$<E!#,=!$,9!&L9&%<5!"
+ "(<1!%,5$%,1!'<1!%<5!%,1!&,-%%\\)#%\\)#$\\)$%<%\"%<%!&\\)('+Y!)<)%&;Y\""
+ "&;Y'%;M\"&+U!%+U!\"[M%$+Q!#[A!&+M!&KE($[I!%;E\"%;=&$;=\"#[9!%;9#&+A\""
+ "'+-*%+5&#[1!#K5#!+-!$:]#$+)!'ZY\"%Z]\"%+%\"#Z]%#Z]!$Z]%$ZU!$JU!#JI!"
+ "$J9%#JM!$*E\"#ZA\"$*A\"#JA!#*A\"$:9#$J5%#J=!%*1'$*1##J-!#J-!#J%!%Z%#"
+ "!)]!#:)#$)]#$)]#$)U##Z)\"&IY##9A!%)=(#9A!#99!$IA%#Y=&\"I1!#)9#\")5\""
+ "#95!#I!%#I)(!I)#$9%&%9!##8]$\"8M!#(U##XI'$)!(!8M\"#(I!\"8U#\"HE!\"X=("
+ "\"8!!\"H=$#8%%\"X5#$X=+\"8=!#HA\"#XA##(E$\"XI\"\"8Y!$(U%\"8]!!HU!$8Y(%I%'"
+ "\"Y!#!9-\"#Y)#!)!!\"I!\"\"I1!#9-$!YA!#)5##Y=&#YA\"#9A'&)E)$)I#\"YM%#IM\""
+ "#9M!%YU(#YY\"%)E$#J!!$)U#$J)%#YY\"#Z)\"#J-!#:-#$:1##J1(#J9!!:9%$J9!"
+ "%*9*$JE!\"*9\"\"ZI%!:I\"%ZU)%:U#\"ZY!$*Y\"$;!#![-!#[!!$ZU!$;!#$[)!![9!"
+ "&K5(#[-!%[1*$+5\"$[5!%[9%%;E\"&+M!%[9!%KA#&;I&%;I\"%[U%&+M)%+Q%&+])"
+ "!+Q%%;M\"';Y*'KY+%KU#'L!,&+]!&,%!%\\!$$<%!%,1!%<!&%,-!%+Y!'<9%&<9%"
+ "&<1!$<-!'[])$,5!'<1!%L-#%<=!$<9%%<=!%<=!'<9!%<9!%<A!&LI&%\\9#\"<I\""
+ "%<M!'LQ!&,E#%LI\"&\\Y!%LE\"$\\I#(<E%$<E!',U#%<M!%<M!'\\Q+%LE\"%LE\"$<M!"
+ "$<E!&<M!&\\M0%LM\"',Q#%\\Q\"$LM\"&<I!%<Q!&LY&'\\M'#,I!&<U$&\\M\"'<Q$%<I!"
+ "%<I!%LI\"%L=\"%<A!%LE\"$<M!!<M\"'<M%(,A#%L5#&<M!&<A!%<A!%<A!%,-!%L=&"
+ "&<9%$L9\"'<-!&L5&'L)\"$,)!\"L1#&L-\"(,%%'<1!$,1!$,)!$+]!&,%!$;]\"%<%\""
+ "&<-!%<%\"%+]!$;Y\"%;Y\"&[U-#+Q!$[Q%&;M\"%[E$%+U!%[=!\";=\"#[A!$[=!#[E$"
+ "%;9\"%+A!&[9!&[1!#[1!$+1\"$[-$$+-\"$[%%$[!!%*]\"#Z]!#J]$#J]$%ZI*#Z]!"
+ "#*]\"%JE%$[-$&*I+#Z9\"#JI!#ZE!$J=!'ZA#&*E$$JA$&*-+#J1!$:-!#J%!!Z%!"
+ "#J%!$:%$#I]!$9Y$#IU\"\"IU!$YY'%)Q!#YI##YI%$IE%#)5#\"I=!\"I=!%95&\"Y5\""
+ "!YI!\"I1!#I!&#I%%\"9%##(Y#$(]'!(]!\"Y%\"#HI#$(Q'\"Y)\"#(M#\"8I!#XA&#HA("
+ "$(!&#(1&\"X5#\"XA\"#89$#(5$\"89!\"HE!#HI##(I##(U!\"XE\"$8U%!HY!\"Y%\"#I%("
+ "#9!!\"8Y!\"Y1\"\"I1!\"H]$#95$\"I5!\"I=!$IA&$I5&#9A!%)M(&)5,%9U($IU%!YU!"
+ "%YU(#9Y#%9Y!#Y]%#Z!\"$II##*%\"#J)!#*-\"!*1!\"J1!%Z5&\"ZE!$J9!$JQ%$*A&"
+ "#ZA!$*A##J5!#JE!&JM\"%*Q'$JU!#*Y!%:Y$#Z]!#[)!$[%!$;%\"\"K)$$+)\"#[5!"
+ "$+!\"#[1!&+9*'+=&%+5\"%+=!$[=!%[M%\"[A!%;E\"';E\"&[I)$KY#\"[9!$[Q$$+Q!"
+ "$KU#%;U*$[Y$&KY#&+]%%;U\"%+Y!%+]!$<%\"&\\)#&,)!%\\1#%,)!%L%'&,A$&L%'"
+ "(,5)%<5!%L-#%<9!$\\-$#\\1#%\\=#%<=!\"LI#!,A%%LA\"&<E!$,=!&<M!%LI\"$\\E#"
+ "&\\I+#LI#%<I!&<E!(,M,(<=)&\\U\"$LU!%LM\"&\\M\"$\\M''<E)%<E!%<Q!%<U!%<Q!"
+ "%<]!%\\U\"%LY!%<=!%LQ!&\\M#&LQ&%<M!%<Q!$LU!%\\Q\"(<M$$<U!%\\Q\"',Q('L]!"
+ "&,A$&,U#)<U#%\\A#&\\M\"$LI\"%\\I#%LA\"&<E!&,I$%LA\"&\\5#%<A!%LE!&<-&#<5\""
+ "&<)!%<9!%L5\"'L=+$<5!%<5!&<9!'\\1,&,!%%L=+%,)!$,!!$,)!&L!'%,%!%L!#"
+ "!,!!$[I!%;M\"%,-!\"K]#$+U!!;U\"$+U!$;U\"$+M!\"[Q$%+I!%+5!%KE$#;A\"&;I&"
+ "&+5\"$;9&'[1*%+5!#[5!&+-\"%[-!#[-!$+)\"$[)!#;%\"!ZM!\"[)!%K%!&ZY.%*M#"
+ "%JY)#ZQ!\"ZM!#*I\"$ZM%$ZE&#JE!#Z9\"#J-!%:A#%*1'#J5!$J-\"#J-!#*-\"\"J%!"
+ "$:!!$*%'$:-##Z!\"!IY'%Y]+&9M&$YM##9M!&YY!!YM$#)E#\"I9!%)=$#9I!\"Y9\""
+ "\"YA\"\"I-!#I1\"#I-%\"Y)\"$)1$#Y5#\"I!%#HI%\"I!!\"X]\"!XY!#XM#\"8M!!XM!#XA$"
+ "#(1#$81$#HA%#XA!\"8)!\"XM\"#H=##XM'\"8A!\"8Y!\"XQ(#XU#$8U\"\"I!!#8U$!Y!!"
+ "$)1$$))!#8]!\"I9!$YM#!)=!%95##9=$#9E#&9A#%I1$\"YI%'9U'#Y9#$)Y##YM\""
+ "$)U#$)Y##YQ#%YM$$Z!#%:%%$:)!%Z)#$*-#$Z1\"%Z5&$*5\"$J5!$ZI!#J9!#J9!"
+ "!ZE$\"ZI!$*5##ZQ!&*9##J]$#ZU!\"*]\"%JY$&JY!#[!!#[%!%+%\"!;1&#[-!#[%!"
+ "$+5\"\"[1!%[1!%+9!([I$'+=*&+Q!&K=(&[A)%KU#$+M!$+Q!$;A\"\";Y\"#;]\"!+U!"
+ "%;Y\"$L%#%+]!$[I!&,!-%+]!&KI($\\)$&[])&\\!-&,5($<-%%L5&%L1\"$,!!$\\9#"
+ "&,1$\",)!&L9!)\\=\"%<=!'LM*&<9%$<I!#,A!%<A!%<E!%<E!$\\I#'LM+%<I!%LE\""
+ "&<M!&\\I\"$LE'#,I!(LU*%<I!&\\I'%\\I'&LU!(,],#\\U#$<U!)<Q#%,U#%\\Y\"%\\Y#"
+ "%<U!(<U)%LY!!<U\"%]!\"$LU\"%M-!$\\U(&,M$%<Q!&M!!&,M#%<U!#,U!%<Q!%\\Q\""
+ "%<I!&LY!)LQ*\"<M\"'<I$),M'%<U!#\\I#$<I!%LI\"&\\I'$\\E#&L9&%<E!)\\=\"#,5!"
+ "',A#',A$%\\E#$,5!!,5!%<9!%<9!%<-!&,)!(\\5,%,1!',1%'L-&&K]'&L)\"%L!#"
+ "$\\%#%,)!(<5!&,!)&+])%[Q$%+]!%;U\"%KM'%+Q)\"+Q!\"+M!&+I%#;I&%+5\"%;E\""
+ "$[=$\"[9!%;5#&[E!%+)\"$K5$%;5&#[))%K-($;-'$;%#!;)\"#Z]!\":]*#ZU!#ZY!"
+ "%ZU&#ZU!%:M$\"ZY!$*A\"$JM!\":=\"$ZA\"%J9%\":E&#ZA\"#Z9\"#J5!$:1!&Z9($Z5\""
+ "$J-\"#:%#$J!%#J!$#)]##*!##YQ##9Q!$9Y$#9I!#9I!#YI%$IA&#IA\"!)=!\"I%!"
+ "\"I5!\"Y1\"#91$$Y-'!I!&!I!#&X]!$))!!HY!\"8U!#HU%#8U$\"XQ\"\"HI$#XE&#XA$"
+ "\"81#\"81!!HE&\"8=##89$\"X9#\"XM\"#(I#%HE+\"8E!#(U##8Q$!XY$#(]#$I%$$IA#"
+ "#I!#!))!#9!%\"I5$\")=\"#Y=#$9E\"\"9=#$9=\"%9A(%II&#)Q##9Q!%IE#$)M#\"J)$"
+ "%IY&#YI%$J)%#J!!$*5#%:)!%*)$%*-'%Z9\"#Z-)$:5#$JA$%Z=&$:='$:E#\"ZI!"
+ "$ZI&#ZE\"$:U$#JM!#ZQ!\"JQ*&:Y$#[5!#[%!%;!+\"[!$#ZY!#;)\"\"+-%%K-$\"[1!"
+ "%[5)%+1\"%[9)'+A&$[A!$;A\"%;=&%KE#%;E\"&;M'$+M!$,!!$;Q&&KQ'%;I\"%[I!"
+ "&+Q!%+]!$KY#'<-!#<!\"(L%0(<)*%,%!';Q'&<-!#;Y\"%\\5##\\5#%<5!%<9!&,9$"
+ "&<9%%<=!%,1!&<=&&\\A'%LA\"%LI!\",E!%<=!$\\E#$<I!#,I%$<E!&<M!%\\Q\"*<M)"
+ "%<Q!%LM!&<I%%\\=#&\\Q&&,U)%<]!%<I!%\\U\"',Q#%<I!%\\Y\"$<Y!$LQ\"%<]!#,Y)"
+ "(,],&]!!%<Y!%LM\")LY2%M%!&-!$%<]!&,Y#&<Q$%<U!'LQ!%\\Y#&\\U\"%<I!'L]!"
+ "&<U%%LU!$<Q!&\\Q&'\\Q\"'<Q)%\\]\"!,M!',E('LI*%<U!%<I%%LI\"%<Q!&LM&&<A%"
+ "%<A!'<A!%,-!$,=!%<U!$<E&%\\)##,9!',5(%<5!$\\5((,9(%<=!%L)\"&L-'$\\),"
+ "%<5!&<%&%\\!$%,!!&+Y!&[](*<-%$;Y\"%,!!&+U!$,!!&;U\"$+M!$[I!%;I\"%[5!"
+ "%K9$%+A!$[9!(+E.$[=$%[1!$;1\"#;5\"%+)&$[-$\"[-!#[1!%ZU\"\"[!!#Z]!#Z]!"
+ "$JM%%:M$&*E+#ZY!!ZU!#ZQ!$JE%$:E$\"*A!(J=#%:M$$:M$$J5!#JA!#J1$%:1!"
+ "$:-##J-!$Z)#$)Y##Z!\"#9A!#Z%&%IY*'YU&%YI!#9M!#9E!#IU!$I5&#99!$9=!"
+ "$9-%#95'!91%\"I9!#)-#\"I)!%9%&$)!!$(]*!(]#$HM'#XI#!(Q!#(E$$(M'\"HE!"
+ "$89)\"(5##(5$\"85!$8A&#8A$\"XE+!(M!\"HI!#HM##XU&!8Y%#(Y##XY/#(]!#9)!"
+ "\"8]!#I)\"\"Y5\"!)1!#95$#)M#\"I5!\"I=!\"IA!\"II!%9I\"%YI!#)E##J!!$)Y##IQ\""
+ "#J!!#J-!\"Z!%#J%!$9Y$%9]$#:1#$J1\"#J1!$J5!&:=!\":A#%:=($*A\"!JI#$ZA&"
+ "#*I\"%*U'#ZQ!$*M\"#[%!#ZY!$*Y\"$JU$%K!($[%!![%!%+%\"![-!$+)\"$+-\"&;1+"
+ "\"+1!%;=\"!+=!$[9!'KA$#[A!%;E\"$[I$$;I\"$+U!$[M$\"[A!%+U!$+U!$+Y!&KE("
+ "'L!\"%,!!%\\-#%\\-(&,%!'L-&%<5!%L9\"'L5!'\\-#$\\5#%L5#&,5$(\\5(&+]%%L=\""
+ "%L-#%<=!$<A!$\\I#'LE&(,I,&<A!'\\E#&<E!'LI!%\\5(%\\A#$,9!#,Q$&,Q#&LU!"
+ "$<Y!'<I$&LU&$L]\"%<]!%<]!$\\]#$LY\"&]!\"',]#%\\]\"&M!!\"<Y\"'<])$L]!&\\Q\""
+ "&<M!\",U!'L]!&,Q#(])!&M!!%<]!%\\Y\"']!&%<]!$=)!%<Y!%<U!(<U-$<Y!&,Y#"
+ "%M!!%\\M'%<U!%LM\"&,Y#&<U$%LY!%<M!),M-%,U$'\\]!'\\='%]!\"'\\A''LE+'<A%"
+ "),I,(\\I!$\\A##\\9#'<=)$,1!$L9&&<1%%<A!'LE!$\\5#%L5#&L-\"&<-%$,)!%L-\""
+ "%<)!&<1!%<%!%L)\"$[I!%,!!$K]#'KU0$K]+)KU-&;U\"#[I!%KQ'$+M!&;I\"%[E!"
+ "%+M!'+=!%[A!$[=!&+=\"$[9!$[=!&[5!%;9&#;=\"$;-\"%+)\"$[-!%;!$#[%!$J]!"
+ "\"ZY!$JY!$ZM\"#JI!$:Y'$ZM%\"ZE!\"ZE!#ZQ!$:=#$:=#%:=(#Z=!#J9!%J5!!*1!"
+ "#J1(\":-##J)!#:1#%:-%\"Z)\"$9Y$#I=!$9U!$YM'$IE&$9I$#9A!#9Q!\"IE!\"YA%"
+ "%9A(\"Y9\"\"Y5\"$Y1'\")%\"#9)$$X]'#Y-##9!\"$(Y(\"X]\"$9!%\"(U\"\"8U!\"8M!\"XE#"
+ "!(5$\"XI%%(=##H=&\"XE#\"XI\"!XI$!8U\"!(]!$XU%\"8]!#(Y&\"X]\"&)!$\"8U!#9)!"
+ "\"91#!I%##I1\"$)1$%)5%#)9##9='$)A#!YI!#9I!#YI\"$9M$$YQ#&)Q%#YQ#%)Y'"
+ "%IM#\"J%!%J-)\"J)!$J%\"#J1!\")U\"#J5$%J5\"#Z9\"#J5!#JI!\"JE'#ZI\"&*Q'&*E$"
+ "#ZI%#ZY!#ZQ!$+)!#ZY!$+)\"$*]\"$*]\"#[!!#Z]!#[)!#[-!$[-!$;1#&+5&&K)("
+ "&K5$$[9!&+=&&;A'&+E&(;A\"#[A!\"[E!$+M!$+M!$+Q!%+U!&+Y%';Q')<!*'L!\""
+ "%L)#'<-!#L%#%L-\"&,1$&<-!$<)\"%\\A'%<9!&L5\"&\\5('<9!$L-#&\\A($,=!%LA\""
+ "(\\A0$<A!!,E!#LQ'%\\M#%\\A#%<I!',E(%<M!&\\Q'%<I!&LM&(,Y,&,]#$<U!'<Q)"
+ "%\\U\"#,Y!%<]!%\\Y#%<Y%&\\]&#LU\"%M!!%\\U#%]!\"$]%\"&]5!%<Y%%,Y$']%+',]'"
+ "%])\"&\\]!']!'%M!!#,U!%M!!&<Q%&])'$M%&&M!!'=-(%<]!',]''LY!&]-'$<])"
+ "&=)$&L]&%<Y!%LY!&,Y#&,U(&<U%%<I!%LU&&\\Y'%LE\"$]-\"%LQ!)LM*$LM\"$<M!"
+ "%LI\"$<E!&\\I#%<A!&,M$%<A%%<A!%\\=#%<5!%<=!'L9+%\\9#%\\9#&\\-(',9)%,)!"
+ "&L-#%,-!%,!!'L%+&L%\"%,!!$+U!&<-*%K]#';]*(+])%+Q!';Q+%KY#$+M!#+Y!"
+ "%;I\"%;I\"%+M!$KA$$[A!#;=\"$;A\"%+-&![5!$+9!\"[-!\"K-#'K!1#ZY!$K!$#;!#"
+ "#[%!%ZQ*%JY!#ZU!#ZQ!#JI!#ZQ!%:U'$Z9\"$JE%#JA!$ZA%#Z=!$*5#(J-,\"J1!"
+ "%:1!#*5\"#Z)\"$:%$$*)#&*)%#Y]\"#9M!$*%#$)Y#&YQ\"$IE\"%)I($)A#&Y1)#9A!"
+ "\"95#!99\"$)5$!)1*#)1#!Y%$\"I%!#Y%#$I!'#9%%!HY!%)%+#XU&\"8Q!#HQ&\"(E("
+ "$85)!(5!$HA$$X5+$8E#$HI!\"8E!#HM&!XU'#(Y!\"HE$$X]$#Y!'#8Y!%9%&$9%#"
+ "#))#\"9-#\"I=!\"I5!#95$#I9%$)5$#IA\"$IA%$YA'&)Y$\"YU!$9M$\"Z!\"#IY!!Y]!"
+ "#J%!$*!#$9]$%:%%#J%!#J5!#J1!\":5\"!*1!%*1##ZA\"$JE$#JA!#*E\"#ZU!$:M$"
+ "$:]#$ZY\"&*I$#ZQ!\"*Y!$Z]%$J]$$;)\"#+)!$;-\"#Z]!$+-!\";1\"$K5$%+%\"$[1!"
+ "$[E!%;=\"'K=($[=!%+Q!%[I(&;I\"$+M!#+Q!$;U\"&[U$%[U%#,!!%K]#%,%!%,)!"
+ "),-$%,!!',9)$,!!&\\-(%,-)%,-!$,5!)L5!#,1!%<A!%<9!$<A!&<=&+,9(%LE\""
+ "&<I%%LE\"&<U%&<9!%<I!&,Q#%LI\"',5('\\Q'&,U#$LQ\"&,U#(\\U!%<Q!),Y0$<Q!"
+ "&,]##\\]#%<]!$<U!&LU!&M)!%\\Y#%M!!%<]!%\\]\"&M!!$=!%%M)!(M-$%M%!%]!\""
+ "%M%!(=%(%M%!&=%$(M-)(,U'%=%$%M-!&M!&&M%!%M!!%LU!'=!$%<U!(=!#$M!\""
+ "(-!'%<]!'=-(']%+$<]!&L]&%]!\"$LY!#=%!&<M%%\\U'%<U!%<U!'\\A#&,M$%<E!"
+ "%LM\"%LE\"#\\I#$,9!(LE+&\\A'%\\U\"$\\A#&<9%$,=!$,9!&\\A'&L9\"'L5\"%<5!$<-\""
+ "%L1#%\\)#%,)!'<)%$K]#$,!!%L-'#,!!%;I\"%+]!&+Y%'+Y%$[Q%$KQ#$;M\"%;M&"
+ "#+Y!$[I!$;I\"%[A!&+1\"%K5$&+9&'+5+%;5\"$[9!#[1!'+-\"#+-!%+-\"#[-!%;!$"
+ "'*]'%JY!!:Y&$;5\"#ZU!$JY!#ZQ!#J9!&:I($*9\"#*A\"&:9%#J5!'JE\"$J9%\":5\""
+ "#Z5%#Z)\"&*)!%:%!%:)(%*!(#Z!\"$)]#$*!##YU%!IU#$YE##YM#$)I!#9E!#I1\""
+ "#9=!#)=#$I5)\"91##IA!%I-(#))#!)!!%9-##I!#\"I)!\"I!!!(U'!(U!#(M#!HI+"
+ "\"X9\"%(=##H=&\"X=\"#XE##(M#$(M%\"HQ!$(M'!(A##(U!#HQ%\"Y)\"#Y%$$95\"#H]%"
+ "#)-#$)!('9M.!)E!$)9*\"I=!$)A#$)5!$)M#$9I%#YU\"#YQ##9Q!$9U!#YY\"$*!#"
+ "#J!!#*%#\"I]!\"J)!#J-!#:)#\"*1\"#Z5!%Z9*%JU!$:A#\"ZA!$*E\"#ZA%#J=!#JM!"
+ "%*U&\"*M\"$*]\"$*Y\"#K)#$;!\"&+1*%Z]!#+1\"#+=!![-!$+1\"$[5%#K9$%[9!%[=$"
+ "&K9,)[A!&[E%%[E!#+U!'[Q$%KM,#+M!#;M\"&,%!%+]!&K]'%K]#%,%!&,%!),1("
+ "%+Y!%+U!$<!!%<)!%<1&%,-!%<E!%<5!%,!!'<9!(L=!&<=!$L5\"&\\I\"#,9!$LE\""
+ "'<9%%<M!%L9\"),M#%LM!%,U$&LY!&<M%%\\U\"%LU!&<U$%<Y!&<Y$(M!%&,]#&-!#"
+ "*M!$%\\U\"%M%!%M%!&<M!$M!\"(=!-%M%!'-1\"--!*%<Y!%]%\"&M)%),]&']%!%M1!"
+ "&=-$(M9$&=)$%M1!%<Y!)]5$&]!'\"=5!&]5!%M%!(=-#%])\"'M)%$]1\"$LU\"'=%)"
+ "%--$&\\Y&%M!!&M!%'-!,&LY!%M!!&,]#$LY\"%M-!%\\Y\"%,]$$LU\"&<I!(,Q('\\Q!"
+ "\"\\E$%,Q#%LM\"#<M&%\\U\"'<5*&,E#)\\M!$<M!$\\A(&,9$#,5!%L=\"'L=&%LA\"%<5!"
+ "'<1*&\\=(&\\=(%+]!#,)!%+]!%L-\"',5)%,!!(\\-($+Y!&+Y%&+Y!%+]!$+U!',!."
+ "$+M!'+M*%KE#$;E\"%;A\"'[I$#K1#$[E!![I!$K1$%[5!$;1\"'+-\"\"[)!!K)#$[%!"
+ "%*]\"$+%\"\"ZA!#*Y\"#ZU!%:U'\"JQ##ZU!$JE!$JI$#JE!#JA!\"Z=!&:=%#J-!$:9$"
+ "#*1\"$:%!!:5\"$:%!#J%!(J-)&9Q#\"9]#%9Y($YE-!YU!#9Q$\"YQ\"$YI##YA##IE\""
+ "%YE'#)=##)9##)-#%95#\"Y-\"!Y-!\"Y%##9%$#9-!#)%$\"8]!\"8A!#(U#!XM!\"8U!"
+ "\"89$\"81$\"X9\"#XM&$8I&\"8I!\"8M!#(Q#\"HY!#I%\"!HQ&\"Y)\"#XU##I)\"#I)%!)9$"
+ "#I1%#91$\"I9!\"IA$\"Y1\"&YQ$#)9##YA#$YM&%)Q!$YQ'$)Y#$YU&$)Y#$9]'!)]!"
+ "'YU-#J%!$:)!$Z1&$:%$\"Z1!%:9(#Z9\"\"ZE!#:='\":E#$J9%#JM!$ZY%$JM(#ZQ!"
+ "$:U'&ZU.&*Y'#ZY!\"J]##+!\"#[%!&ZY\"#K)#'JU%&K1,%[1)&[5)'+5+%[=$#[-!"
+ "%KA$'[E!%+5\"%;]\"!+M%$+M%#+Q!%;U\"%+Q!%;Y.%,%!&;U+\",-!%,%!%,-!&L%\""
+ "&<-!%<-!%L1#%<9!#,)%(<A*&<1!',)%%<E!%\\=#(,=-$LA\"'LE!%<I!#,E!&\\Q\""
+ "&LI&&,M$%LM\"%\\Q\"*<5/'\\U,$\\Q#$<U%'\\Y+%<Y!%<Y!%<Y!&,]#%\\]&&\\Y\"%M!!"
+ "'<Y$&\\U\"&=%$$=%!%M%!%M%!$]%\"#M)\"'])!&M)!%M-!(])%*=!\"&]-'&]5&&]!'"
+ "%M-!'--\"#M)\"$M)&#==!#=%!&]9!%M!!!-%!%M!!%M1!&=)$(]!!$]%#'M1*%])\""
+ "%]%\"#-%$&-%$%M5!$=)!'=%(&,U)\"=!\"#=%!%M!!%<]!%<]!%\\Y\"%\\Y#%\\Y\"#<M!"
+ "%<Y!$<E!'<E*#,I!&\\A#%\\Y#&\\E\"%\\I#&,E##\\I(%,5)%LA\"%<9!&<A!#,9!%\\=#"
+ "%<%%&<5!%,1!',A(%,)!%<=!#<9&%L)\"%,%!%L%'$,!!';]\"+\\!(%L)\"!+U!$KU#"
+ "#+Q!$;E\"$+M!%;I\"&+E%);U\"&;A&&+5\"%[5$\"K9#&[!)&[A%%+-&$+-\"![9!(K)&"
+ "#[)!$ZU%#Z]!&Z]\"$*Y\"#ZU!$:U$$*U\"$:M##JI!%ZI\"#ZE\"#:A#$J=%%:9!\"Z5%"
+ "%Z5\"!Z-!$J-)$Z%\"\"Z)\"#Z%\"#J)!%)]'$*!##J%!\"J%+#J%!#YQ#$Y9!#II\"&)M%"
+ "#9A!#I5\"#I5%!)5!\"Y1\"\"YM!\"Y%%\")%\"$9)($Y!\"#9!!#9!!$9!\"\"HU!\"HU!#(Q!"
+ "\"89!$(=(#8A'\"HQ!\"XI\"\"8M#\"8M!#XQ##XQ&$8I(#(Y#!X]!!Y)!$)%$#))##I%\""
+ "%95,\"IA!#Y9#\"I9!#)=#$)A#$9E!#9I!#99!$IM%#9Q!%YU.')Y)#9U!$Z%##IY!"
+ "&*%$$J)\"#J)!#J-!&:5,%JI!%:E!%:9(#J=!$*Q%#ZU!\"*A\"#ZI!%ZM*%*Y&$J]$"
+ "#ZY!%+%&%:]##Z]!$[%!%K%$#[-!$K1$$;)#%;-#$;-\"$[9!%+A!&K9(%+1\"%;A\""
+ "&[9!%+=!$[M(([M%%+M!$+Q!(;I\"%[U$$+Y!#,!!%KY##,!%%+]!&\\%(&L%'%,-!"
+ "%,-!#<5\"%<9!#L5#(,9#&L1\"%L9\"&<E!$\\=#%\\=(%L=/%LI!&L=\"%<I!(LM*),M#"
+ "&\\I'&LQ!'LI!(\\Q0\"<M!%<U!#,Y!%LY!%<Y!(]!!&\\]&&M!!&\\]!(]!&%=%$&-)#"
+ "%M%!!-)!%<]!%M)!%M%!(-)'$=)%*=-''=9#&]1!#=-!*=-1%]-!'-1\"(-)\"\"]-$"
+ "%M5&']1*&=E$&=1$%=5$%]-!'-1'(=!$%M)!+-5%$=!!)--!'])!$=%!&M-!%]-\""
+ "&--(%M1!$])\"%M-&%M%&&-1#&-%#'])!%M!!&<]$(<]($M!\"$=%!%,U#%\\M#%<M!"
+ "%\\]\"',U(%<M!(LQ!%<]!(,Q,%<M!%<Y!%<A!%<A!',Q#%\\9#'<A!'\\A,%L1\"%<9!"
+ "'L=!$,A!%<5!%L-#&<%%(\\)#&<-&%\\)$&L)'&L%'%+Y!',!!%KU#$+Q!%;U\"#<!\""
+ "#[U(';Q\"$+M!$;Q\"%;I\"&;=#%;E\"%+A%#[=!%[A!![I!%[5!';5'$+1\"#[-!$K)("
+ "%+)&%;%##Z]!!;!\"#Z]!$JY$%:U#%:M(%:Y$$ZQ%$:M##J=!#ZE\"!ZA!%*=#%*9'"
+ "#*=\"\"J1!!:5\"$Z=\"#J)!$:-#!Z%!#IQ\"#I]$'9Y#!)M$$IY%#IY!#9U!$Y='%)Q$"
+ "$)U#$IA%\"I=!#)1#\"I9!\"Y9\"\"I%!!Y-!\"Y)\"$I)#$Y-!$Y!(#XU'$8Y%#8U$#8Q$"
+ "\"X5#\"HA\"\"(E(#XI$$HI*!XI$%(]\"$XY!#XY&\"XQ\"\"X]\"#H]\"#9%!#9)!\"Y9\"$9)%"
+ "#Y-##)5#\"Y9\"\"9A##)A##Y1#\"YE\"#YI##99!&9Q&#9U!%)U!\"J)#%Y]+$J!%#:-*"
+ "#YY\"#Z)\"\"Z5!%:1($:5#&*5($Z9\"#Z9!#*I\"$Z=%#JI!$JE$#*U\"$:I#$*Q\"#*U\""
+ "$*Y\"$*Y\"$[)%$;!#$J]!#[%!#[)!&+1\"$K9#%K=(%[5!%+9\"!;5\"%K=#$[A!#[A!"
+ "&[I!)+Q!'[E2#[=!%;]\"%+]!%L!#%;Y\"$+]!$L!#$,!!$,-!$<%\")L)+%<5!%L5\""
+ "%,-!#L-#&,5)$,A%%,-!%L-\"%<=!%<9%%\\A#%<E!&L]!%\\A#(LY)%LU&%<U!$<Q!"
+ "%LY!%,Q$&LU!%<E!&<Y%$<U!&L]%\"<Y!'-!'%,Y-']%0&]!\"']-!&=%$$])#'-)'"
+ "%]-\"'-%#&-)#(--+%M-!*]=$'=-)%M1!'-1'%M=!'-%\"&]1!$=5!$=-!*M1'%M)!"
+ "%]1\"'-9\"&]5+'=9('-5\"#M5!%]1\"&-!#'==(&M5%%]-\"&=%$%M-!%]1\"'-9\"&==$"
+ "%M-!%M9!%]-\"%]-\"&-)((\\Y/%M)!%=)$&M!!(=%(%]%\"&-!$&M!!%\\]\"',]'%]5\""
+ "%M%!&LU!']%!$<Q!%<Y!'LI+%<U!),M'%LI!&LM&#,Q%%<5!',9$%,1%$\\I'&\\='"
+ "%<=!&<A&&LI&#,1!'<5!#,1!%+]!#,-!%,%!'<-!',%*'+Y!%K]#%,%!%,!!'K]'"
+ "$+Y!%;Q*$[Q$%;Q&$[M$$[E!\"+M!%+5\"&+9*%;E\"%K=($[A!#[5!\";1\"$+)!&[1%"
+ "#[-!$K-$$;%\"#[)!![!!#Z]!'+!.%JU!#*Q\"#ZI\"#JM!$ZI\"$JE!\"ZA!$ZE\"%*5'"
+ "%J9%$:1!#J1!\"*1\"\"J-!\"J%!#J!!#Z%&$*%##IU\"#9A!#9U!!YU!#IU\"#YQ#%)E%"
+ "#IE!#9I!$)9$#I=\"#)9#!Y5!#91$#)-#\")1\"#Y)&#Y!#%)%)!HY#\"8M!!H]#\"HQ$"
+ "#X='\"8=!\"8E##8I(\"X]\"\"9%#\"XQ%#(Y#\"HY$!HU&#)!#$Y%!!)!!\"XY\"#9-!$)=!"
+ "%I5.#)=##9)!#Y1##9M!#YE#$YI$()I+\")M\"%9M\"$IQ&!YY!!Z!!$IY&#J%!$Z%&"
+ "#J)!%:%!#J-!#J=!%Z5##J9!#J=!#*=\"#ZA\"#*A\"%JI!$*I\"$JQ%$[1,\"ZU!#ZU!"
+ "$*Y\"$J]$$[!!#Z]!#[!!![)!#[1!\"[%!$K1$$K5+%;9\"$[5!%;A\"&;=&%+E&$[E!"
+ "%+Y!$[E!%;E\"%K]'&<-!%+Q!%,!!'KY+&KU#'<)%'+]!%+Y!$\\)$%,)!&KQ(%L1'"
+ "(<1.',5('L1\"&L9'&<=*(L=!%,9%%<E!!\\E$#,E%&LI&%<I!&<E%'LQ&#,Q!&<U$"
+ "%<U!&L]!*LY)%M!!%<Y!&M!&']!!*-)&'M%*&-%$)<]#&-!$(-),&])&#=%&&-%#"
+ "%M-!&-1#%]=!$=1!'=1$&MA$&=5$'-5'&=%-$-5$)-5!(]5%'-A\"']5!$M=!%M5!"
+ "&]5!&]1&&]9&%M-!&-1#'-!#&]5!$=5!%M9!\"-5!)=5'&=5$%M5&&M5%&=1$%M1!"
+ "%]1\"'-9'(]5.%]5!$=1!%=%$(-)\"#]%,'--#&])&)M-)'-!(%]!\"$=-!%M)!%]-\""
+ "\"<Q!#\\](%<]!&M!!',Q('<U$%<M!'\\I+%<Q!$\\Q#(\\U!%<M!$,A!#,Q$(L=!%<=!"
+ "&LE!&<=!%<=!%L=\"(L5/$\\A#&L%'&<1!&,-$%,)!$<!\"&,%%(,!!%,%!&+Q)#;Y\""
+ "'+Y%%KU#)+]*$KA$%+M!![I!%+M!%[A!$;A\"%;A\"%;I\"#[1!$[A!$+5\"$+1\"%;5\""
+ "%K-(#[-!\"[!!%[%!#JY$\"Z]!\"ZU!\"ZU$$ZE\"#ZQ!%:]'#ZE\"#ZA!#ZA!%*A&#Z=\""
+ "#ZE%$*-##Z5\"$:9$&*E(#Z-\"$J)\"$)]#%:!%#J%!%IY*$9]!%)U!#9]'#9Q!#YA#"
+ "$)I!$IE#$)Q$#9=!#)9##)=##)5#$9)(\"Y!\"\"9%##9!%$)1$$HY#\"I)!\"8Y##HY%"
+ "#XI!\"X-#$(Q(\"8I##(E##XQ&#HY%#HY%#9!!!Y%!#H]\"!I%#!)-!%9)'#)9#!Y5!"
+ "$)5$$)1$#)=#$)=$#Y-##9E!#YQ#%)Q!#9M!$YY'%)U!#YM#$I]%$*%##J!!!YU!"
+ "\"Z)\"&*-$#Z%\"#J5!$J5!$*1-$J-!#JE!#JE!#JE!$ZA\"%JQ!%ZQ\"$*Q\"\":U\"%*]&"
+ "$K!$$;!\"#+!\"#+!\"&+)+#;%#%[-)$[1%$+5!%+=\"%;-\"$[=!$[A!$[E!%+A%#KE#"
+ "%+I!'KM(![I!$+Q!';Y\"%;Y\"%,%!&<!\"(<1%&<)%&<%%$,-!%L-\"$,-!&<-!&,)%"
+ "%<9!$,)!'L9\"%L-\"$\\E#\"<M&%<A!%\\E#$LI&%<U!(,I,\"M-\"),U,$<Q!%<U!%<Q!"
+ "&-)#'<]#(LY%%<Q!%<Q!$<U!%\\Q#%<]!$=!!$=%!(M%)%M%!'M)%(M-.&--#&=1)"
+ "%M-!&M1%&M5%%M-!&-9\"%MA!$=5!%M5!&==$&]A!&M=$%M9!*]=$&]-&\"M=\"&M9$"
+ "%M9!!-1!(MA(%M5!%]9'(-9'%=A$'-='%-9$(==\"&M9$&]E%&]9!&M-!%M-!&L]!"
+ "%M5!&-5#&-9\"']1!%M1!'-1\"&M1%%<]!']-!%]-\"$=1!'<U)&])&&=%-%]%\"%M9!"
+ "(]!!&LU!&-%(!]!$(]!+%<Y!'<U)',U#%\\U#%<U!%<E!%\\U\"%<Y!#LA\"%<E!%<A!"
+ "%<=!'\\=('<=)%<A!$\\-#&<1!%\\A#&<-&%<A!%<)!%,-%%,)!&<)%&+Y!%+]!%<%\""
+ "%+U!%+Y!#[E!$KU#$+Q!%[U(%;9\"&;A\"%+=!\"[=!'K5$$+=!$[9$%;9\"%+5&#[=!"
+ "$[-$#[-!#K9#'*Y'$[)!#ZQ!#Z]!#Z]!#ZU!%ZE\"#ZU!$JU$$:Q$%JM!#ZA\"$JA!"
+ "#ZQ!#Z9\"#Z1\"#:5#%:9!\"J%!$:%$#I]!#J-!#J!!#:)#!YY!&9U##YY\"\"IU!#9E$"
+ "$)U##YE#%9=*#YA\"#I=\"#Y9&!Y9*\"I5!$YA#\"Y-\"\"I-!\"I%%&9!.$(]'#X]!\"8Q!"
+ "!X9!#(I!$XA+#8=$#8M%\"XQ\"$XA\"#8]$$HU)\"I!!$)1$\"Y-\"\"I1$$)1$!Y9!\"Y5\""
+ "!9E\"!YE!$IE\"%IA##YE##IA\"$)=$!YM!%)U(\"IU!$9U!%*)#%Y]#%:-!$*%##:)#"
+ "#J1!#*5\"#*1\"$:-$$*!#%:E!$ZA%$ZA\"%:E!#JM(&*A'%*I'$:=$$*Q\"$*U\"#ZU!"
+ "%Z]\"&+%\"$*Y\"#[1!#;1\"%+-\"%;='$K-($+5\"#[9$$+=%%+5\"\"[A!&[9!&+Q!%KE$"
+ "$;=\"$KI##KQ#%[U$%+]!#+]!'L%\"%+U!%\\)#$<)\"%,!!(\\)1'\\-,&<9%'LA&&<1%"
+ "&L9&&,1%&,9$'LE!),E#%<A!$LM\"%<I!%\\M#&,M##<I!%<Q!%<I!%\\Q\"%<Q!%\\]'"
+ "',Q($<U!\"-)!'-)\"\"=!&&-)#&-1'$=)!&]-!&M-%&]-&%])\"&M=$%M1!&=1$(MQ\""
+ "!-5!%]-!'-1'']9!$]=\"%]A!%M5!%-9#%M1!&=5$)M=-&=A$#M1\"(M=-&-=\"%MA!"
+ "%M5%(M=#&M=$%M5!&-=\"(=5''==#&-U\"'-=\"&M=%#M=\"'-A\"&M9$&M=%$M=!%]I!"
+ "$=5!)-9+%M=!(=1-&M1%&-5#%M1!%M5!%M1!'--\"&--#']%+%M%!$M)!%M)!$<U!"
+ "&]5!#,]$&M!!)<]-%<]!%M-%%<Y!%,U#&\\M'#L]\"(,M#'\\5#&LM&&<Q$'LE&%<I!"
+ "%<I%(LE+%<9!(\\A\"%\\I#&L9\"&<5!%\\1#&,-%%,1!$,=!%\\)$&<%!&;M\"'L%,&[Q)"
+ "$K]#%K]#%<%\"(K]'#;]\"\"KI#!+A!#[E!([5*$[E!$[A!#[=!%[9!'+9\"%[9$#+5\""
+ "$;-\"$+5\"$K)+#K)##[)!$[!!$*Y\"#Z]!$+%\"$*U\"$JM$#JM!#ZA\"#JI!'JM%%:5$"
+ "#ZQ!%*='#J=!$J=!$J1\"#J%!\"Z=!&*)%&*)!#9U#$*%#%IY\"%IY#$YU&&)Q%#YE#"
+ "!9Q\"%IQ#%YE!\"YI!#Y=##Y=##99$!YE!!Y!!%9-##)%&$Y)$$99%#I%\"\"XI\"#8Y!"
+ "%8Q$$HE*#8I$\"8Q!#HQ%!Y!)$(U$!H]!#HM&%I%!#9%!\"I)!$Y-*#95!$))!!Y5!"
+ "!Y9!#IQ$#Y=#%9U(\"IE!#YI\"%YQ!$IU%#Y]\"$)Y#&)U%!Y]($Z!'\"I]!#J)!#J%!"
+ "$Z-\"\"J1!#J-!$J9!%:9+%*1#$*Q\"$JE$$JE!#ZI\"$JM%\"ZM$\"+!\"$;!#\"*Y\"\"J]#"
+ "$*]\"$+9!\"[%!!+)!%[-&$K5#$[1!&*]\"$[1!&KA(%[A$'+=*%;M\"$[I$#+M!#+M!"
+ "%,%!%[M$%+]!%+Y!&+Y!);U\"#,!!&L%\"%+Q!'K]'%,1!&<1!(<5!%<5%%<1!&<-%"
+ "(LE!&<5!$,9!%L9\"&\\A'#LA#%<E!$\\A#&<I!'LQ!#LQ#%\\U\"'<Q$)M!.%<M!$\\]#"
+ "&<A!%M!!(=!-&]%'%M!!']5!&--#&M%!&=-$(-='%M-!#M-\"%M)!'-5\"$=1!%MA!"
+ "%]I!$M9!(=5'$=9!$M9!'-=\"%M=!&]5!'-9\"&-=#)MA-']=%'=E,%]A!&]Q!\"-5!"
+ "&]A%%MA!&]9&%MA!%MA!$MQ!'-A\"&-A##=Q!'MA$%MA!)]A3'-9\")-A/']5&%]E!"
+ "&-1#&]E!%M=!%M9!%M5!%]Q!%ME!\"MA\"&]5!%M9!'-1\"'M1*'LY*&--#(=-'&=)$"
+ "$]-\"$\\]#'--\"&,Y#']!!'<]$&-!$\"<Q+%M%!%\\Y##,Q!&,U,$,=!&LQ!&\\A'%,U#"
+ "&\\Y\"%LA\"&<A&%<E!%<A!%<=&(,9#&<9!%,=$%<1!'L5*%L-\"&L%\"'<)%(<%&%;]\""
+ "(+]%%,!!%KY#'KU#&+U%%+M!%+Q!%;M#(+M!&+I)$[I!&+A\"%K=#%+=!$[-!$+9*"
+ "$;1#%+1&#[-!$;)\"$[!!#[%!$K!$%*]\"(*U,$ZY%$JY$$ZU!$*M\"(*E)$*I\"#ZI\""
+ "#ZA%%:5!#Z9\"\"Z=$#J-!$J1(#Z-\"&Z9##Z)%$*1#\":%#$*%#$:-$$)Y#$*)#%YI!"
+ "$)A!\"Y9\"#9E!#IA%#YA#%)9+\"I-!\"I5!&Y1)%9)##)9#\"99#%9%$!Y!\"$HY'\"8]!"
+ "$8Q##XI'#8M$%HQ+#XQ&#8U!#8]$\"H]$#Y%##9%!\"Y%\"#))#$9-\"$I1&#)1#\"Y9%"
+ "$)=$%I5!\"IE!#IE\"$)]#(9M(#YI\"$IQ\"')Q'#9U!#I]!\"Z%%!*!!#J%!$:%!%*1'"
+ "$Z-&#J9!#J5%#Z5\"$JE%'*A(\"ZA!%ZM*$*I\"%ZU\"%JQ!#ZI\"#:U\"$:Y#'J]*#[%!"
+ "$JQ$%;1\"%ZU\"$+)\"#+)\"%K1$&K9$%[9!$[9!$[9!%K=#&+E%%[E$%+I%$+M!%+]%"
+ "%K]#%+U!&<!&(KQ0%;]\"%L!'',!)'+Y!',9$%L)\"&<-!&<5!&<-&%<9!%L5\"&\\5#"
+ "%L=\"%<I!'LE!&<E%%LE\"',M(&<M!',E('LQ&'\\Q\"'-!'%\\Y\"%<M!*-!''LU*&-%#"
+ "#,]!']!!%<]!'M1$%])\")-%!(-1,%M)!$=1!&M%%%M)!$MM!&==$%==$'=9#%M1!"
+ "$]9\"#=9!&M=$&]%'&ME$(-A!*-I*#=A!$MA!$M9!&=M$%]I!&=E$%]9!%MA!(-I!"
+ "$ME!&MI$%ME!%ME!'-I'&-],'-=\"$ME!$=9$%]I!%ME!&-A#*MI'$MI!#==!%M9!"
+ "'-I&\"]A##M9\"&M1*%MA!&-=#)=1\"&==$$M5&%]-\"']5&&--#(M1.&-9\")=11'M1)"
+ "(-1!&-)#(=%#%])\"&-!#'=!$&M!!%<]!(LU)%M)!%M!!%])\"(]%%'<Q)%<M!%L=\""
+ "',]'$\\M#%<M!%,1!%LA\"$,A!%<=!'L9\"%<5!%,)!#<-\"%<=!#<-!&\\%#%,-!#,%!"
+ "%<5!$,-!',!!$+Y!&<%%%+U!'+]%$+M!#[I!%+=\"&;A\"%+M!$[A!&K1$$[9!'+=\""
+ "$+1\"#[)!#[-!$;-#$+-!#+)\"#JM!#[-!#ZY!#JI!$*M\"$*Y\"%JA%%:M'#ZI\"$*E\""
+ "#ZE!#ZA!$JE%$:9$#Z5\"#*9\"$:)$$*5&#J!!#J%!#I]!$Z)&$*%#\"IU!$9U!$IU\""
+ "#9Q!#9M!$YQ#\"YA\"'9A'$Y='#9=!\"I5!\")9\"\"I!!%)1%\"Y5\"$)%$#Y%$$)1$#8Y$"
+ "#(E!#(I!!HI!#HQ)!Y!\"#HY%\"XY%#X]!\"8Y!\"H]!#9)!\"Y1\"$91\"!Y-'$)-!$I)*"
+ "#Y1#$9=%#YI##9I!&)U($9]$#YQ#\"IQ!#Y]&%YY'#YU%#J!$%Z)'!*%!#Y]\"#J9!"
+ "#J9!#*=\"$*9##Z9%#Z1\"\"ZA!%ZE\"':I)$JM$#JM!$*Q\"$*U\"%J]!$J]!$ZU%#[)!"
+ "#[-!$[5$#[5!$[5!#+)\"%+1\"%+=!![9!&[=!&[I)$[9!$[-!%[I$#[I!$;I\"\"[I!"
+ "'[U)%+Y!&;M\"&+]!%+Q!&KQ,&,%!%,%!%\\)'%L-\"%<5!%,1!&<I%&,5%&<9!%<9!"
+ "%LA\"%<M!\",E!'=!)%<9!%<M!&\\M\"%<]!+L5+%<Y!\",Q!'<I$$<Y!&,]#&=))%LY!"
+ "'=!)(M%.'=)(%]%\"$,]$']%*%]-\"&-9\"%M1!%])\"&=9$%MA%$=9!%M9!%M5&&-=#"
+ "(-=&$-9$'=A((]=$)=I!'-I!!-E!%ME!'MI)$=1!&MM$%]M!%M9!'=I((=Y!%ME!"
+ "%]I!(-I!%ME!%ME!&]E!$MM!$MQ!%]I!'=I('-I!)-Q*%]Q!'=E(%MA!%]M!%MA!"
+ "%]E!)=E!&-9\"$=1!'=A(&MA$+=91']1!'-5'']1&&M9%&-E\"&-I\"$]=\"(--,%<]!"
+ "'-1\"%M1!%]-\"#]!$'])!%M%!&]%'(-!''=!$%<]!%<]!%\\Q\"&LY!%<E!'=!$(,M,"
+ "'<M$)\\M&%LI\"&<M!&L=&&<=&#,)!%<E!&\\9#&,=$%<=!&L5\"%,1!%L-\"%,1!%\\%$"
+ "'<-%)+Y%&,!%#+Y!%[Q$&+Q!&+Q!%+Q!$KM##+M!$[I!%+M!$KA$\"[E!%[=!\"[9!"
+ "%[5!&[5!#[)!$[5!\"[%!%[)!$K)$\"[1!#*Y!$;)\"$ZY\"#JE!%K!$$ZM%$ZM!\"ZI!"
+ "%*I*#JA!#Z=\"$JI!#J-!#J9!#*-\"$:!!#Z-\"&*),\"J)$#J!!!YY$#9Q!$9M!#IQ\""
+ "!IQ)#99!#I=\"#IM\"%9A(!Y9$#)5#\"I9!#Y%$\"Y9\"\"91#\"Y-\"#)-#&9)!$95%#H]%"
+ "#(E!\"XM\"\"XQ\"!HE&\"8U#\"8]!\"XY\"%H]$$(]'#9!!%8]#\"I%!#)A&#)5#$)=!$IE&"
+ "#9=!%I5'$IE&%9M\"%)M$%)Q($)M$%)U'\"I]!%9])!Z%$$J%&$J%&$J)\"$*)#$*1\""
+ "#J9!&*5,%Z9*#JA!&:=!$JQ%\"ZE!#JA!&ZI#$JI%#ZM!'JY%#Z]!$;)\"$;!#&[%!"
+ "%+%\"\"+!\"#[5!#[-!#[1!$[5!$[9!&+=\"&[=)&[=-%[I$$+Q!#+U!$[Q%$+Q!&;U&"
+ "$+Q!%+Y!&L%#$[Y$%+]!%L%#$,)!'+]%%L-\"%,%!(L1&&<5!%L9\"$<5!%<A!&<A!"
+ "%<I!%\\Y#&\\I'%LE!%LM\"'LM+%=%$&LU&&LU!%LQ!%<U!%<Y!%\\]\"%<Y!%M%!%<]!"
+ "$<Y!%M)!)M-)'M-$$]5\"%M5!)=5\"&]5!%M1&$=5!']9+%M1!&]A&%]Q!,M=1%ME!"
+ ")-=%%]A!%]Q!%-Q#%MA!&-A#)-A!&]9!%]M!%]I!%]I!%]M!&]Q!'-U!%]M!&]M!"
+ "#=U!$MM!%ME*%]M!'MI)&]5!%]M!'=Q(%MA!&=M#'-M&%M=!%]I!%]I!%=I$&-U!"
+ "%M9!%ME!%M=!$MM!'M=)%MA!%M9!#]Q#'=E\"%M9!%MA!'=9(%]9!%]5\"&=-$%M-!"
+ "&]-!&]1!'=-)%M-!']1*&=%$#,]!%M%!(-%\"%M!!#=!!(--!'L]!&<Q$#,Y$%\\U\""
+ "%<]!$,I$%<E!&<I!#,I!%LA\"%<A!&<A!%<=!&<E!'\\A'%<9!'L%+%,1!',)%&,5$"
+ "%,)!&,%%%\\!#%,!!'+]%%K]##+Y%%+U!#+]!$+I!%KM+%[A%%KQ#%[A!%KA#(+=&"
+ "\"+5!#[5!#K-#\"[-!\"[-!$+)!#Z]!#[)!#+%!$*U\"$*Y\"#ZQ!#Z]!#JM!#ZE\"#ZQ!"
+ "'ZE($:E$%*A&\"Z=!#Z9\"#Z%\"%:5!$J5%\"*5%\"I]!&*%+#:-#\"IY!#YY\"$)Y##IM!"
+ "'IM,':%&$)E##IE(%IE$$I5#$9A\"!Y=!\"I9$$)9!!Y1$#)-##))##I%##9%!$I-'"
+ "\"81!#HM\"#(Q##(U#\"X]\"%9)#%XY&!(U!&I5\"\"I)!\"99&!I5##Y)'%YA!$99($9=("
+ "#9A!%)I%#YA\"#YE##IE!$)E!#YY\"#J%!#Y]%&*-%%:!!#J1!$:%!%:5!#J-!$:1!"
+ "#J!!\"*9!$J=!#Z9\"$JA$$ZQ\"%JI!$ZM\"#ZY,&:Q(%:U$$K%$#K%'%J]!%;)'!;%\""
+ "%[1!#K1#$[5!$+9\"'+I*\"+1!$K=#&+A&&[A$$[I!%[I!%;I\"\"[=!$[]$&[M)%<!!"
+ "%;Y\"&[I!'KY''+Y!&\\-(%<)!&,)!%<)%'L5*&\\9#%<%\"%L9\"(<%!%\\=#&<A%%LM!"
+ "%\\Y\"(,U,'\\I\"&,M#%\\Q\"%<=!%LM\"%-!$)\\Q!&L]!%]%\"']%!%]5\"&M%&%]%\"%M)!"
+ "&]1&&M-%%--$&--#%-1$&])'&=)$%]%\"&M9%#=I!%MA!']E*$]M\"&ME$']1!(-E!"
+ "#=E!%ME!%M1!&]M!%]I!']5!%]M!%]M!$=9!&-M\"%ME!$MQ!%]Q!'=]'%]M!%=Q$"
+ "(]Q.&-U!&==$&]I!%]M!%]Q!(-I+&]M!%]M!'-Y!%]Q!(-Q!*-I$#MM!%]Q!%]U!"
+ "&]M!%]I!%]U!%]I!%M=!%ME!&]M!%ME!$=9*)-A!&-A\"%]5\"%=E$&M=%%=A$%M9!"
+ "&=5$%]5!#=!!'-)\"\"-%!%M5!%]1\"&=%$(-),&=%$%M!!$=!!&,]#(<]-)\\Q!%<Q!"
+ "'<Q.#LM&&LQ!%\\Q\"$<M!%LI\"(LE!(<9.&\\='%<=!%<A!%L9\"'<)&\"L1#%L)#'<)&"
+ "'L9\"'\\),',%));M\"#;Q\"%;Y\"'+Y)',!!&;Q'&+Y!#[I!%[I!$;I&![E!#[A!%;I\""
+ "(+M&%+A%#[-!%K5(%[5!$;-&\"[)!#[1!#;%#$*]\"$Z]%!ZY!&:Y'#ZQ!$ZM%%JM%"
+ "$ZI%#*E\"#ZA!#JA!#ZA\"#J9$$:-#$*1#%*-'$*-#$*)#%J%*#)U#$)Y#%)]$#I]!"
+ "$9]$#IQ\"$Z!&#Y=##9=!$YA'$YI#\"I9!\"I5!$))$\"I1!$91(#)=#\"I5!$))$#Y)#"
+ "!(5)!HM!#8M$\"H]!\"I%!#XU&!9-\"!Y%!$I%##))#$)='$Y-$!)5$#I9%\"I9!$)-$"
+ "!YA!%YE+%YE%#9M!#9M!$9U$#9U!$)Y#!Z)!%:%+#:%#&*%,#J-!$*)'%:5$#J5!"
+ "%:9%%J9%#Z=\"#JM!\"JE*#J=!$ZI\"\"Z]!!ZQ!$JU!%*I##ZU!#ZQ!$+%\"#[-!%;)'"
+ "$K)'&+-\"$[1!&;)'%;1\"$;E\"%+=!%[I$&+A\"%;I\"&;I\"&+M!\"+Y!%+Q%&;U\"%KY#"
+ "%K]##KY#'L!#%\\1#%\\)$&+U!'\\5(#\\9$$,-!%,-!&<9%&<9!&LA&&,9)%<9!&<=%"
+ "&\\I\"%<E!$<I!&,Y#$\\Q#&LU&\",]!(\\U/#\\]#&\\E#%M!!%M!!&M%!%]!\"%M)!)=%'"
+ "&]1!$=)!%]A!']=+&=)$%M1!'M9$$MA!)]E()-=0'-=!#MI+#=A!&-A#&]E!%ME!"
+ "%ME!%M=!\"-I!%]A!&]M!'MM(\"-M!%]Q!#-M$'-Q&']E$%]Q!'-U&'-Y!'-U!&]Y%"
+ "\"-U!%]U!%]U!'-Y&%]]!&MU$%]Q!'MY)%]U!%]U!%]U!(=]!']Q.%]Q!%]U!#=M!"
+ "%ME!%]I!)=I''-I&%]I!(-I!(]E$%M9!%]M!&]Q!$MM*(-I!$MA!$M=!&]=&%M1!"
+ "%]=!$=1!(]5.&]5&%])\"'-)\"%M-!%]-!)<Y(#=9%%]!\"&L]%$=%!&L]!%M!!%<Y!"
+ "%,Y$'-!'*LQ)&<Q%$<I!)\\I!%<I!&,E$',A(%<A!%<A!%,)!&<9%$,=%!L5#\",-!"
+ "'<-%%,%!%,%!%+Q!&,!!%;]\"&L%'%;Y\"&KU#$KU#([=!$KM#&[Y,(;A''+E&$[A!"
+ "%+=!';-(&K9(&K9$$K5##K9(#[%!$;-+#[!!$K%$#[!!$J]!&ZU*$+!\"$JQ$%ZM\""
+ "$*Q\"#JI!%:E(&:E$$*9\"%Z9#%:A!\"Z5!$:1$$J-%#Z)\"$)]'%*)'#J!!%:)!\"YU\""
+ "#YM\"#9M!#IQ!#II\"%)Q($YE'#)A##I=%#II$#)9##95!\"I-!\"9-##I-%\"Y%\"#9)!"
+ "!HA##XQ&#XU)\"XU\"#HU%\"9!##I%#%I)'#Y)##9-$#9-$#9)$#IE!#9A$$I=&%IA*"
+ "#9M!$9M%$95%&IE$#9Q!#YU\"#IY!$)U##I]!$:!$!J1#\"9]##J-!$J)%#JA!!Z5!"
+ "%*5'&Z9'#JE!#J=!&:U$#JI!#JE!$JQ%\"Z]!#Z]!#[-!#Z]!$+5%$K)$\"[!!%K-$"
+ "#+)\"$+9!%[-!&+5\"$[5!%+-\"$KA'%;A\"!+A!#;I*&[]$%+U!&+Q!&;Y&%+U!&[M)"
+ "%[]$'<%.$L1\"&<)!%\\-#$<-\"&<5%%<5!&,5$%\\=#%<9!&,=$&<A%%,1!%<5!&<I!"
+ "&<M!&<9!(,Q#%<Q!\",U!(LU)&\\U\"&-)#%<]!%<Y!%M%!(=!$']!!)=!1'M-$$<]!"
+ "&-A#(--,%]1!*==+%M5!%]9!%M=!%]E!'=9()-A!\"-=!$=5!&-I'%MA!#=M!%]M!"
+ ")-M$%]I!&-U!&]M!$MM!%^!!%]M!&]U%%-Y\"&>%#&]A&$]Y!%]Y!'=U(&-U!$MY!"
+ "%]Y!'MY#%^!!%^%%%]]!%]Y!(-Y+%N)%%^!!&-Y!$MU!%]U!$>%%(-Q+%]U!$MU!"
+ "%]M!#MY!%]M!&]M!#=E!%]Q!(=I,%M=!&N!$%]Q!&]E!&]E!&=A$#MA!&-A\"'-=\""
+ "(=1(&M9%$=9!&]1!%]=!%M1!&=1$']-!'M)%%]9!&M)!'M%$%]%\"$=!!%<Y!&M!%"
+ "#LU\"%<Y!',Y('LQ&(<Q)%<Y!%<I!#LE\"(<E.%,E$)<=*%L=\"&<9%%,9$&\\-(&<-*"
+ "$<-!%L)#%<1!%<%!&L5+%+U!$,%!&[Y(%+Y%&KU#';M+![A!\"+M!%;=\"$KE#$+A!"
+ "&[1*&+=!%+=\"#K-$&;9'!+1,#[-!'+1/#[)!';%(%*]&#JI!#JY$#Z]!%JU!#ZU!"
+ "\"*I\"$JM%!:E\"$J=!#Z9\"#Z9\"#J9!$:)$#J-!#Z1\"%:-!#Z1\"%*1'\"IY!$J%&#9Y$"
+ "$YY##9U!$YQ#&9M-$)U#$)I!#Y=&\"Y=\"$9=(%)5%#)5##9)$#)-#$I))\"Y!\"#I!\""
+ "!HM##HQ(#(Y&!XY!%X]+#XY&#I!\"%X],\"Y!#\"I-$$)1$#91$\"9)#%)9(\"IA!$)=$"
+ "#YE\"$)=$#9Q!&9I#$IQ%$IU%%)Y$$*%#%*%'$*!##J-!%J-\"#Z-\"\"*1\"#J5!%Z1#"
+ "\"*9!#J=$#ZA\"$:E##J=!\"*M!$*M\"$JQ$#ZU!#ZY!#Z]!#ZY!$;!#%*]\"&[-.#K-#"
+ "%[1!&+1&%;5&%;A\"$[=!$[9!&;A&)+E&\"+Q!%;A\"\"[E$$+Q!%+U!%,)!&KA(&,!)"
+ "%\\!#%\\%$%,-!&,5)%L-\"'<=)',I)%\\5#%L5\"&<5!'<E%%L=\"%L5\"\"\\9#&LI&&<M!"
+ "%<]!%<Q!%<Q!&LM*%<U!(\\Y&%LM\"%=!$(])!%M-!%]%\"&M%&&=)$'=-(%M5!$M1&"
+ "$]%#$M-!&]9!'=5(\"-=!'-9\"&=I#&=A$%]E!&=E$*=E!%MM%%]Q!%]]!+=U$&]=!"
+ "%]Q!(-E!%]I!%]M!&M]$'-U!%]Q!%]Y!#]Y\"(=Y!%^%!'MY)%]I!(>!!%^%!%]]!"
+ "'-]!&]Q!&N!$&MU$&=]#%]M!%]]!(-]%$N%!%]]!(-Y+%]Y!%^%!)]Y(\"-Y!(-Q!"
+ "%]U+%]Y!%]]!&=Q#&-Q\"'-U!)-U%%]Q!&]M!*=M+&M=$'=A($ME!%]Q!&]E!#]E#"
+ "'-E!$MA!'==(*=5+(]=$$]5\"&-=#)-E+&]I!']-*%]5!\"M1\"&M1%(])/%M1!&-!#"
+ "%<]!%<Y!%]!\")L])&\\I'*LQ/%LM\"&<I!#,I!%<I!#<-!%<A!%<A!%<%\"(,9#'<9!"
+ "%LI\"%,-!\"<)\"$L-#%,%!',%!&L%'%K]#&+Y!%+Y!%+U!!+Q!$KQ##[I!'[]#%;E\""
+ "%[=!#[=!$[9%%[9!$+9!#[1!#[-!%[E!$[)!%K%!#:]#%K%$$:Q#$JY$#ZU!$JI$"
+ "#ZI!':U!$JM$!:E\"#J=!#ZA!%Z9*#J=!&ZA'#JA!#Z5\"$Z)&$*%#!Z%!#I]!$Z1*"
+ "$)Y##9Q$#9Y$%)]'#9A!$9E\"#YI#$)A$$Y='%9E&!Y9!%9=\"#)A#\"I%!#9)!%))%"
+ "!HI!$8I&!(U!#HI&$))*#9%!%I%(%I9.!I!%$I-)#)5#&9-$\"I1!#)=#$)A##9I'"
+ "$YE&$)I!\"YM!#9Q!$)]##YQ#$)Y##Y]\"#Z!%%:%(#J1!#Z9!\"J-!$:-!$:1!%:9("
+ "$J5!#JA!%ZA)$JE%$:E$\"ZM!#ZQ!$:U+\"ZM!$*]\"#[!!$K%'$;%#&[-%#[)!&K)-"
+ "![)!![5!%+5\"%;9#'+=\"%[9%)KQ#';U+([U$%+A!%[Q)%;M\"%+U!(+]%%+]!%+]!"
+ "%K]#%,%!&,1$%\\9#%,1!$,5!$<-\"&,5$%L5#%\\=#%\\A#$,A!%LI\"',Q#&LE&#,U%"
+ "%<I!%<I!'\\]&$<]!%\\Q\"%M!!&LU!&M!!&]-'&]!!%]5\"%--($]-\"%M5!$M1!%M1!"
+ "%M)*&=9$%]5!%M9!%M9!&MI$&M5$#=I!%]M!%]M!$M=!(=Y!&=U#']M$$MU!&=Q#"
+ "#=Q!\"-U!&]Q!#=Q!)MY!)-]/&-Y\"%]Q!%]Q!\"-Y!%^!!&=]('-]!&>%(%^-!(=Y!"
+ "&-]!$^!!'-M''>)''.!%$N!!'.!!'.!+&>%#&-Y\"&-]!%]]!#]]\"$N%!%^!!%^%!"
+ "%=Y$'-Y!%]M!%]Q!$M]!'-U&(>%!&]A!\"-Q!%=E$%]I!%ME!%M=!%=I$)=I!'-1'"
+ "%M9!%MA!%]-\"#=9!(M=$&]9&%]9!'-5'&]A!%]1\"%M%*(M-$'\\]&%])\"$=)!%<]!"
+ "%M5!'<E)&LY!'LU!%\\U\"(\\Q/&<M!%LM!%LI!%<A%%LI\"&<=&\",9!%<=!$L1\"&<5!"
+ "'LI*(,9##,)!$<)!%\\)$#L!'%,!!&<-&\"+Y!(;Y!%;Y\"$+Q!!+Q!%KY'$[I!&KI#"
+ "#+M!&[E!&;=&#[5!%;5\"&[=!%[1!!;%\"$+%\"%[)!#[-!$+)\"$+5&$;)\"%K%($*E\""
+ "$*U\"$;!#$:I#$:E$&*A'$J=!#J1!!Z9!$Z1&#Z1\"#Z5\"#J9!'J%$#Z)\"$IY%$9U$"
+ "#Y]\"%9U(&)U%\"IQ!#IM\"$)A$#9E!#IA\"#I=\"$)1'\"Y9+%)5+\"I5!\"I!!\")-\"!)!!"
+ "\"HQ!#(M!#(Y#&(])$8]\"\"))\"$)%(!I!%#I)%#Y=&#9-!!91%\"IA$!Y-!\"I1!%9E%"
+ "#YI#&9M\"$J%%#9A!#YQ\"%9U%\"9])#*!##J!!&J-'#Z%\"$:5$\"Z)\"#J5!\"*=\"#Z9\""
+ "#J=!&:A!%:E!$ZA\"#ZQ!#JM!#:Q\"#JA!#ZQ!#Z]!$+!\"$[!&$+%\"#[)!$;1#$+=!"
+ "$+1\"%[5!$[9!&+=!';U&%;5#$[=!%;M\"%;A'$;Y\"&+Q!';I\"*;]'%+U!%;Y\"\"+U!"
+ "&,%!',)$%,)!%,-!%L5\"'<5!#\\9$'\\5(%<A!',A$&<A!'LQ!%LM!%<M!(,M,%LY!"
+ "&,E(%<Y!%<Y!'\\A\"'<Y)%M!!$L]!%M!!&]-&'=%)&LU!$=1!']%!'--'']5!&=)$"
+ "(MU-%M)!&==$#=A!%M1!'=E(&==$%]U!$MM!#]Q#&=Q#&]Q%(-Q!%]]!%]U!'-U!"
+ "&=M$%]Y!$N!!%^!!&=]#&-]!$MY!%^%!(>)!!^!)%^)!&.!!'-]!&-U\"'N-\"%^!!"
+ "&.!!%^-!'.%!%]Y!$N)!'-Y!$N!!$N!!)]U)%]]!&]]%#>!!%^-!%^!!'^-$$MY!"
+ "%]Y!#=Y!%]Y!%^!!%]M!'.!!%]Y!%]Y!$M]!*MY!%]Q!%]Q!$=9!$MQ!&]E!&]I!"
+ "%]Y!&-=#'=E\"#]9#%M5!&=9$#=A!&=9)\"=9!)--!\"-)!#=)!#M%\"(M%$#=5!\"-)!"
+ "%=!$&M!%&M!!&\\Y'&LY&%,U#$,M)%<U!%<U!$<Q!&,I#%<E!+<=#%<A!%<I!%\\A#"
+ "&L5&$,5!#<)\"#\\1$)L)\"%,)%$\\1$#,)!(+Y!&KY'$<)\"$[Y$$;M\"%KQ#$;M'%;M#"
+ "%[1%&[9!$[A!$[-!%[-!$[5!\"[9!%+1&%[)&&+)+$K!'%:Q$$;!\"&*]#%*Y&&K!!"
+ "$JY!$:I$#JM!':E!#ZQ!%:A!\"ZE(%JE)#J9!#J9$#Z5\"#Z)\"&Z)##Z%\"!Z%!$:!("
+ "$J!%$)U##9U#&Y](#IE!$IA%%)I%$IE##)E##)1##Y9#\")5\"$I1)#)5##9-$$HY)"
+ "!HM!!(M!#I!(\"X]\"\"8U!#Y9&$))$#)%#\"IA!#Y1#\"Y=\"%IE-%)=!#9A!#Y=##Y5#"
+ "#9A!!YU!$YU#$9Y$#I]!$:!$%9])#J!!$*!##Z1\"$*)&#J!!#JE!$Z5\"#Z9\"!ZE!"
+ "%*A##Z=!$*E)#ZI\"'ZM+\"ZQ!%JY!&*Y'$JY$#Z]!$;!##[%!$[!!!+)!'+1+$+!\""
+ "%[1!\"[9!&+-\"%;=&%[A!&+E!&[E%\"+M!$[Q%$+U!#;U&$[Q(%<!\"%+]!%,!!%<!\""
+ "#<%\"&,!%%L5#%,)!#\\1#%<5!%<9!%L9\"%<=!%<A!*,=((,I)'<I%$LY\"&<M%&,U#"
+ "(<Q.$=!!$\\]#%L]!%]-!$L]\"%]5\"%M-!%<]!%M1!&]-+%M5&%M-!$M5!'-9\"&]A&"
+ "%M=!']9%#MA\"&MM$(=E(&-U!$MM!&]Q!$MM!%]M!$=Y%#=U!%]U!$]Q!%]Y!&-U!"
+ "'-Y&!-Q!&-]\"'-M&'.%%%]Y!&>!-%^!!(M]'%^!!%^%!!.-&%^)!%^%!#>%!&^%%"
+ "&.9!%^!!$N-%%^%!$N%!%.9\"$M]!%^!!'.%!%]]!%^%!%^%!'N%('.%&%]Y!$>1$"
+ "*^!!%]]!']])%.!(&-U!(=]!%^%!)>!*)-U*%]Q!%]M!&=U#%]Q!%^!!%]M!$MM!"
+ "%]I!%ME!'-=!']E$\"-E!'=A(&-E\")=9!%M-!&])&%M5!%M%!%]1\"(-1+%]!\"&=)$"
+ "'<Y)%M!!&=!$(LY%)<Y(&LU!&<U%%<Q!&,U#$<M!%<M!&,=$%L9\"&<A&&,1%%<E%"
+ "%L1#',1)%\\1#)<1*%L-#$,)!&\\%(#L%#%,!%$+]!%[I!$;U\"%<!!$[M%%+M!$[I!"
+ "$[I!\"[E!(K1$$[=!&+5&&[1&$;)#%[-)$[-%%K-(#[)!$[)!$Z]%#ZQ!!*Y!%JY!"
+ "%ZQ&%*Q#%:M$%JI!$:E$#JI!#ZA\"%ZE\"\"J9##Z=!$*9\"!J-'$Z-&&Z)$#J!!\"J%!"
+ "#I]!$9M$#)Q\"#YM#$)U##YM\"#II($)E'#9A!#9M!\"I=!$99(\"8]!\")!#%)-\"#I)\""
+ "#8Q$\"HQ$#(U#$8U#$8U#%)))#91$#9-$\"Y-(#)-##)9#!Y-!\"9A)#Y9##YE#$9I%"
+ "#IM!$)Y#$)Y#%)A'%J!#\"YU%$*)#\"IU!%:9($:)$#Z-\"#Z5\"\"J1!#JA!$:9$#J1!"
+ "$JA!#JA!$JI$#JM!$*Y\"#:I#!ZU!'ZY.'[%2$J]$$JU$$K%$$;-#%[5!\"[9!$[=!"
+ "%K=$%;%#$[=!$[9!&KA$%;Q\"%[E!'+A\"#;I\"'KU#%+Y%#+Q!'+Y)&\\)'%,%!'L)#"
+ "%<)!%<5!#;U\"%,1!%L5#&<9!%L=\"*,5)%\\A#(LM!&<E%%L9\"#LI\"%\\Y\"%LM\"%<U!"
+ "%<Y!%<Y!%]!\"%M!!(-!\"%])\")]1*&])&&M-%(-1,&M5%%M1*%M-!$MI!%M=!(==("
+ "&]=!%MA!&]E!%MA!&]M!&]I!(]Q)$]M\"(-I!)=U!(-U!$MQ!%]]!%MQ%(=Y!(^%."
+ "#>1!'-]!%^!+%]Y!%]Q!!.5!&>!#(>%!*^!!&.=!%^!!'.)!%^)!%^)!&>)\"%^!!"
+ "&.5!%^5&$^5!%^-!#>%!%^)!%^-!%^)!,N)**.%)'.%&%^!!#^)\"&.)&*.%#%]U&"
+ "&N!$\"-]!&>1\"%^)!%]Y!%]]!&.5!%]]!#MY+%MY%*-Y)%^%!&=Q(%]U!%]Q!%]I!"
+ "&-9\"%]M!&]A!&]E!\"-A!(-=!(]A)%]I!&-=\"*-I4&M5$%M5!&-E\"%\\]&']-!$]!'"
+ "'-)\"%]%\"$=!!&=!$)-!\"(\\Y!%<Y!%M!!&<M!%\\Q''<U)#,M!'LM+%L5\"',A(%<I!"
+ "%L5#%\\9#'<A%%L1\"&<1!%<=!&L-\"'<-*%\\!$%L-\"'+]))+U!$,!!'KU'$KU##[I!"
+ "$[I!&;M#%;I\"&KM'$[A!%[9!$;1##K5($+5!#[%!$*]\"#:]\"$;)\"';%$!*Y!#ZY!"
+ "\"ZY%#*]\"$JE%\"*Q\"$*Q\"#JE!\"Z=!$ZA&$J9!'*9!$:-!%:1!$Z)\"$:-!!Z%$#9U!"
+ "&Z!!$)]#\"J!!#9U##9U!$)M#!YE!\"IQ!#YE#$)A!\"Y=\"#)9##I5\"\"Y!#!Y!!#I-%"
+ "$(Q'#8Y$$(Y'\"HU!#XY##XU!\"Y!\"\"Y!#\"I1!#Y=&\"I9!\"YE\"#9E!#IA!$)M##9M!"
+ "#)Q#$9M!!YQ!#)U&!IQ#$*!#%:!(!Z%!\"J)!$:%!!:%%$:1!#Z5!#J5!$Z=\"#:A#"
+ "#JA!$JI!#JI!'*Q$%JQ!%[!\"$JU!$ZQ\"$*]\"%:]'%;%'%+5\"$K5$#+!\"$+1\"$;5\""
+ "$K9#%;=\"#[9!$[A!%+A!&KI'$[M$&+Q!&KQ#%,!!&;Q\"%;Y&$;]\"&<!\"$K]#&+Y!"
+ "&<)!%<A!(L1\"\",5!%,1!$<E!$L=\"'\\E\"&<E%&LQ!%LE\"'L]!%LQ!$<U)%<E!%<Y!"
+ "(L]$&=!$']!!%\\Q\"&]%!%M-!#M)\"&M!%&=%$'=5$&-5,'-5''ME)%]=!%-=#'-A'"
+ "(-=!&]E!&]Q!%]A!$MM!%ME!'=]'%]Q!&=Q(%]Y!)>!%&=]#'-Y!#=]!&M]$$N%!"
+ "%^!!%]]!'-Y!(>)!'^!)'.-!%^-!&N1#%]]!&>1\"%^)!)>-%'.!!%^1!&.9!$N-!"
+ "&.=!'>)'%^-!%^)!&.-!'-]!'>5&(=]!%^!!'>-!'>9!%^1!&N1$&N)#%^%!'>5!"
+ "$N)!(>%!%^%!'-Y!$N!!%^%!'.-!%]Y!'-]!%]]!'-Y!%]]!%]Q!&-U\"%^!!#]1#"
+ "(]I$%]M!\"-U!%MM%(-I!&]E!&]A!%MA!$MQ!&]=!%-5#%]=+&M5$(MA$&M-!\"M5\""
+ "'=%)$]5\"'M%*%M!!#\\](%LU!%]!\"&LM!$<E!#\\Q#%<A!%\\U#&<Y%$LE\"&<E%&L9\""
+ "'<=&%\\5(%<9!&L1&%,1!(\\-#%,5$%,)!&,!%%,)!%,%!)KQ(&+U%%;M\"$K9$%+U%"
+ "&;M+&KI$%;M#$[A!&;A'$;A\")K5)#K5$#[1!$[!!#[%%&+-\"&K%)#[!!![!!$J]$"
+ "$ZU!\"ZI!!:Q\"#ZU!#Z1%#ZI!#JA!&*A+#ZE\"#J9!$Z1&#J1!#J-!%*)$%Z%#$)Y#"
+ "%I])$)]#$9Y!#9U!\")Q\"#9M!$)M#$YI'#9U!#YA#%99&$I-#\"I9!\"I1!\"I5!\"I)!"
+ "$8U##(Q##I%&!HY!#9!!!I1#\"HY!!))!$)1'!)5!#)-#\"I=!$9=\"%)=$&IE!#YE#"
+ "#YM#()I.!IU#$YY'#Z!%!Z)!#Y]\"#I]!%:%(#J-!%*1#(*5!#J=!#Z9\"\"ZA!#JA!"
+ "#Z=\"#J=!![!!(ZI(#ZQ!%*Y&$:U#'[-&$+!\"#[!!#[%!$ZY\"$*Y\"$*]\"%;5'%[5!"
+ "%;9*&[=!%;A\"$[E!$[E!%+A!$KQ#&+Q!&[I(\"+Y!$;U\"%K]#',%!%L)#%+Y!%<5!"
+ "%\\5#%L1\"%<A!$\\9#%L-#%<5!'<A!&,M$%<M!%L=\"$LM\"%LU!&LM&$LU\"&<Y%$<M!"
+ "&L]&$\\I#%M)!(=%(%<Y!(-)'%]-!(=1')-9+%M=!#=9!&-9\"#=9!'-=!&]A!&ME$"
+ "$ME!$MM!&-A\"$MM!\"-Q!%]Q!%]U!%]Q!$MU!']Y$&N%$%^!!&-]'#>!!$N!!%^!!"
+ "%.%\"'^)$'-U!%^)!&.%!'.)!'.)!%^-!%]]!%^)!'.1!&^5%'^1)'>1!#>-!%^1!"
+ "&>1($N-!(.9*'.1!).1#)^9,&>%#(.1%(^--'>1'&^5*&.5!#>!!#N-!(^)#$N1!"
+ "(^-#'.)!\".!!#N)&&^)%'>9!'.!!'.)%%]]!(>%+%^!!&]]%'.!!'N%#&-U!$ME!"
+ "&=Q#$MQ!$MQ!&]Q%%]I!%]Q!&-=\"$MI!#=I!(-A!$]-\"&M9$$-1$&]1!)=-\"$]1#"
+ ")--&%M-!&=)$'M)$(\\Y!'-!,&=)$%\\Y#&=%$*<Y#%<M!',U#%<E!%L]!'LE!&\\A("
+ "&\\A($L9\"%<9!%,!!&,5$&\\9#&L9\"%<%!%,)!%,%!&<!&%+M!%+Y!&;]\"&KU#(+Q!"
+ "$[M(%;E\"!+]%%[I!'[A%%+=\"%+9!$+5\"![E!%K1$![-!$+5\"%+%\"$;)##[1!&:]+"
+ "$*U&&*]\"$:U$%JM)&:E!$*U\"#ZE\"%:=!\"*=%\"J1!&:5!\"J-!\"J1!%:9!$:)!%:)!"
+ "!Z!!$)]##Z%\"#IY!%IU#%YU#$II#%)Q'#Y9#\"9E#$Y=!\"I=!%I9*#Y5#&9A&#91!"
+ "!(I!\"8Y!$(]$#9!!$9-%#9)$!Y)!#9-$#)1##91!#9='!YA!#IA\"\"IE!%)I($II&"
+ "$)M$#9Q!#IY!%I]&#J!!\"Z!\"#IU%#Z)\"$J)%$:!$$*1#!Z5!$*1&(*9%#J-!$JA$"
+ "#ZA\"$:I##ZQ!$JQ!#ZU!#ZU!$*Y\"\"[!!&K!!#[%!$+)!\"[-!#[)!&;-$$[5!#[1!"
+ "#;I\"$[A!&[9!#[9!%+A!$[I$$KQ#$KQ#%;]!&,-%&L)'&+M!(L%,%;]\"$,)!(,%%"
+ "(,1$%,1!$,5!'<5%$L=''<1*&<A!$<E!%<9!&\\M\"*<Q-%<Q%&-!$#=%!%M%!),]\""
+ "%]-!&M!!$-)$&M)!#=)!%M1!&M-*'M)%'=5((-5')-90'-A\"%]A''-A'%]I!$MM!"
+ "%]I!%]M!%ME!'MY#&]Q!&-A#&-U!%^!*'-]!%]U!'M])&]]%%]Q!#>%!$]Y!&N%$"
+ "%^%!(>)!'.)!%^-!%^-!%^%!&.9!$N1!%^)!'.%!&N1$$^5!&>)\"'>5!%^-!&.5!"
+ "'^E#%]]!)^5&&.5!(N9!&.9!$^A!,^1*%^1!'.)&&>5\"&>1\"$^5!&>=\"&N)$%^1!"
+ "'>1!%^-!%^-%&.9!%^)!'.)!%>)$'^1$&^!%&>!#$N!!$N!!%]Y!#=]!$MY!&>!#"
+ "&]M%&-Y\"'-U&'=E((-Q%%]M!&-I\"&]E+'ME(%MA!%]5\"&MA$&=1)(=9#%]%'&-1#"
+ "%MA!&M-!%M%!&=5((M!%$<]!&M!!'L]!%<U!&<]$%<U!%LQ!%<M!%LE\"%\\Q#%<A!"
+ "%<A!%<=!#,5!'\\1##\\5#%<9!%L1#$\\%##,-!%\\%$&,!!%+Y!'[]-&+M!$[Q)%;U&"
+ "%+M%%+M!(KM('[M-$[A$$;Y\"'+I&%[E!$+9\"'[1%'+-'$+%\"$K)$%;%'$;%##ZY!"
+ "#JY$$*]\"&*U+&ZQ*#JE!%JI(#JE!#*A\"#JI!#Z=\"$:9##Z-\"!Z1!%Z-'$Z)\"$Z%*"
+ "$*1##J!!%I]#%J!\"&)U%$Y]#$9M%#9M!%YI$#YE\"#YA#%9=##9=!\"95&\"I5!#Y5&"
+ "\"8]!\"8]!#HY%!(U!%)1%$I!'\"I1!#I1\"#Y5##I9%\"95##Y=\"#9A!&9A#$)I##9M!"
+ "%IQ)#I]!%IU\"#YY\"\"I]!!J%#\"Z%\"#J)!$J-%$J5)#J1!':1\"$:9$$:=#!ZI(%ZE'"
+ "#ZQ!&ZM*#JM!&*U'$Z]%%*Q'\"Z]!'J]-\"[!!\"[1$!;)\"$+%\"#[1!!+5(%K=$%;-#"
+ "%K=$)K5*&+Q!%;U\"'KQ(\"[E!%;U&&\\!(%+Y!'+]%$[I!%\\!#%,%!%\\-(%<!\"%,-!"
+ "\",1!$,5!%\\=#!<9&&\\E($\\A#%<E!\"<I!(,A-%<M!%\\Q,%M!!%M%!%<Q!$,A!'-%\""
+ "%M!!%M)!&]9+$=%!&--'&]=&'M5)#=9!']9+$M1!&==$%ME!%MA!#M9\"(MA#%]I!"
+ "%]M!)-Y%$]U!%]Q!%]Q!%]U!%]Y!#=]!%]Y!*.-)'^!$&N-$%^-!$N)!%>-#'.)%"
+ "%^-!%^)!(>-!&.9!%^1!&.9!%^!!&.5!&N-#\">5!&>5-&.=!&.9!).9)&.9!&.9!"
+ "$^E!&.A!%.=\"&.9!%^1!&N9#&NA#'>9!&N-##N9!%^1!'^9)%^)!&.9!*NI$'.-!"
+ "'>5!%^-!(>)&&^-%%^-!%^-!(N9!&>%#%^1!(^)\"%]]!)=M,%^)!)=Y%%]]!&N!$"
+ "\"^!#%]M!%^%!%]M!'-U!%MA!(-M!(=I!%]M!(=U!%MA!\"-=*'M5$%==$%ME!%]5'"
+ "%M1!%M1!%M-!%=%$%M)!%=-$$-!)&M%%(,Y,%\\Y\"&LU!%<M!&\\M\"',Q($\\A#%\\E#"
+ "(LE&(LA!%<A!&LI+$,9!$,-!%L5#%,-!%L-\"%,-!%;]\"&,!%&K]'$;Y\"*,-$';U\""
+ "%+Q!'+Q*&KM#$[I!\"[I$#[M$%+5\"%;=\"&K5$$+9\"#[!!#+5\"#K)##+-!$+)\"$+!\""
+ "$JQ%':]$#Z]!\"ZQ!$:M*%*E\"#JI!%Z=&$ZA&$:='$:9$#JI!$:-!#J-!$J-%#J)!"
+ "#Z-\"%:%!$I]%\"YY!$IU%%:-!%IU#\"IM!%YI$%9M%\"9A#$95%\"Y9\"\"I1!\"Y9\"#)-#"
+ "#(Q#\"8]#$8Y\"\"9!$#I%\"$))$$95(\"I5!#9A$$Y9$#Y9&#9E!\"I=!$9E\"#YI&#)M#"
+ "#)U#\"IM!#IY!#I]!&*!!\"J%!#Z%\"$J)\"$Z-&!J1'%J1%&:9!#JI!(*I,\"ZA!$:=#"
+ "$JA$$JI!$:M#$*Q\"$JM!$J]!#:]#$K=#&[!\"%+-)&K),#[!!$[1$$[9%%[9!'K=$"
+ "%;A\"$[A!%+U!$[I!$+M!$+U!$KU#%+Y!$;]\"%<!\"%<)!%L-\"!,-!%+Y!',-%%<5!"
+ "$,5!%<=!%<9!\"<=\"&<-&%<Q!#LE\"%LI\"$,A!%\\Q\"&,I#&]!\"&]!\"&,](&LY&'=%$"
+ "$L]!']!!%]%\"%]-!%M)!&=E$(-=!%ME!%M-!&M=$&=E#&MA)'=U'(-E!!-A!%]M!"
+ "&]I!%]U!%]U!#=Q!\".!!)]U#%]Y!&MQ$'>!!&^-%)N%!%^-!)N%&&^-%$.!$(>-%"
+ "(^)($^!!%^1!'.%!\".-!&.5!$^5!&.I!(>-!&.5!&.9!&.5!&.=!%^)!&.=!&.=!"
+ "$^E!&.M!'.1!&.=!'.1%&.5!#N=!&.=!&.9!&.=!%N9$&.9!'>M&#NA!$^5&*.9\""
+ "&.9!(.9%(^-(%^-!%^1!&N-#$^5!'.-!+.A,&>)\"%^%!%^%!%]M!%^-!'N)('-U!"
+ "(=]!'MY-%^!!(MY\"%]Y!%]I!+-M#(-M+(=U&(-=!&]M!(MQ,&MA$'ME(']=/%M1!"
+ "'M5*(-1'']5&'--\"&M=$$=1!%M)!%])\"$<]!%<Y!&-!#&\\U'%LQ!&<M!%<I!$,=%"
+ "&LY!'LA&&<A%%<=!%<5!%L5\"%<1!&<1!\",)!%,)!$,-!$<-!&<!\"&+]!$<%\"$+U!"
+ "'KQ#!;I\"$[E!%;I\"'[A%$[=!%[A%%;9\"%+9!$[5!\";5\"%+A%$K%$$K!$#Z]!$*U\""
+ "%J])#ZY!$ZQ\"%JQ!$ZU\"#JI!\"JY+$JU!$J5!$Z9\"$:9$!ZA!\"*A\"$J1%#Z-\"&*)!"
+ "#J%!#I]!#J!!#J%!#YQ##9U!$)M'$)M#$)I!\"9M#$9E%')9*\"IA!#I)\"$Y9*%)-\""
+ "#HQ\"$Y%+#)-#%(]\"\"Y%\"!9=\"\"I1!#)!$#I5\"#9-'$)M&$YE&#YA##91!%)Y($9M$"
+ "%)Q'#Z%\"$9Y$\"Z%!$Z!#&:%%#Z)\"$:%$#Z!\"$:1$!Z1!%*=#%JA\"$*Q\"\"ZA!$*E'"
+ "#JI!\"ZU!$JU!$ZI!$*Y\"$J]$#*]\"#Z]!\"+!!([)&$[5!%+-&'+5\"&+-&%+1&%;M\""
+ "%[A!([A*!;=*$[I!%;I&$;U\"&;U'%+Q!#K]#'<)!'<!&#<!\"'\\),&L-\"%;Y\"!<-&"
+ "%<A!&,A$%<=!%<E!$<=!'\\Q,$LQ\"&\\M\"&LU&%<U!'LU!%<]!&LY&'-!(%<]!'M)*"
+ "&\\]&&=)$#=9!&M!%%]-!%M-!$-9$$M9&$-=$&]E!%]I!$ME!%M5!']E$(]I.%]M!"
+ "(-Q!#>!!%]Q!#=Q!%]Y!%]]!#>-!%^)!!>-\"$N)%#>)!(=Y!(>-!'>1&%^-!&N%$"
+ "'N9(&.9!%^1!&.=!&.5!&.9!)^Q&&>5\"(NA,)>=/&.=!&.5!$^=!$^A!&.A!(NA!"
+ "&.A!&.A!'N=\"\">A!&.=!&^A$&.U!&.=!(N5!'NI'&^A$%N=$&.A!(N=!%>-$$^9!"
+ "&.9!$^5!&.I!+N9*&.5!&>5\"&.5!$>1$%^)!%^-!%^-!(N!!$N%!%^%!%^%!&.!!"
+ "!.!%'=]\")M]!'-Y!%]U!$MU!&MQ$(-M!%]M!%]M!%]I!(]E.$MA!'M=$#=5!%MA!"
+ "&M=)#=5!%M1!%]5\"'M-*(-)\"&M%%$=1!(\\]!%\\]\"&,]#&L]!%<M!%\\Q\"&-!$%]%\""
+ "%LM\"%<E!'LA+%<=!'<=!%<=!%L5#%\\9#%<%\"&L5'#<=&$,%!%L!'%+Y!%;]\"%;U\""
+ "&KQ#%;M\"$;I\"$[Q$$[E!%;=\"%+Q!%+=\"&K5$$[5!#[5!$;1##+)\"$[1!#;%\"%:Y#"
+ "$J]'%;!'$JY!$J]$$*Y\"\":U&!:I\"&:E!$ZM%#JA!#ZA!#JE$\"*1%$Z-&&YY!%J-)"
+ "#YY\"#J-!$J!%#)]#$9U$#9U!\"YE\"$II&#YM\"#YI#%9M%\"IA!$95(#99$!9=\"$91("
+ "\"8]#\"8I!&)1-#HU\"!9)\"#9!$\"I1!!I9#\"IE!#I=%#IA\"!IA#&9E&&)I\"$IM\"#9Q!"
+ "#J!!$YU'$)Y#$9M!#J%!\":!##Z-\"$J5!#J%!#J5!$ZE&#J-!&JI!$ZA%#ZQ!#J9!"
+ "&ZM&$ZI%$:Q##JU'\"Z]!$*Y\"$+!\"%:]##K)$#+%!\"[-!#[-!%+5\");9(&;A'%[A$"
+ "$[E!%;=\"&[E!$;Y\"$+Q!&+U!#+U%(+I.%[]$%,)!&L%#$<%&&L1\"%L1+%<5!%L)\""
+ "'<5!%,9$%<=!%<=!%<E%#,I!%LI\"%\\I#&LQ!%\\U\"&\\U'$<Y!&<Y%%M!!&]!!&]%'"
+ "%-)($=)!&M-%)-)!(=5\"&-E\"&]9!)=A'%MA!%MA!&M9$%]M!&]I!(>!!#M]!(-Q!"
+ "(-U*&-Y\"%^)!(=]!$M]!%^!!)=U0&>!\"%^%!%^-!%^)!'M](%^-!(N1!(.-*%^1!"
+ ").9)'>9!'^9#'>5&(>%!(N=!'NM'&N9#*.A''NA''>A!'>9!(NM!&.E!&>E\"(^='"
+ "'>E&#^M'&.9!).E#*.M!&.Q!'>A!&.E!\">M!&.E!&.]!&>A!&.=!#^A\"&.A!&.E!"
+ "&.=!#>=%&>=\"&.9!(>1!&.=!&.5!'>9!&.5!(>1%&>-')N10%^%!&N)$&.)!#>1!"
+ ")>)%%>%#(-U!(=Y&$MQ!(=U'%^%!%]Q!$MM!&MQ$%M1&)=M!*-=$&]E!%M9*$]E\""
+ "%=9$#=A!%M9!$<]!%]-\"(=5-#=1!$=%!(M%$%LU!'--\"&]!!%LM\"%\\U\"%<A!%<M!"
+ "%LI\"&<M%'LE&&,9$(\\90&,)!$LE\"$,5!(<9%$,1!#,)!%\\5#%,!!%<!!%L)#%;M\""
+ "%;M\"&L!'%+Y!%;M'&[I($[A!%KM#$[-!$[A!&+9!$[5!\";-\"#[1!$[-!#[)!%K!!"
+ "#*]\"$*]\"#:Y\"$ZY\"#Z]!$*Q\"%*M##Z=\"$JA$%:A!':9&$*M&$J1\"#Z=)#*1\"&*5("
+ "$Z)&#*%##*!#%*-'$IY&$)Y#$YU'$)I##YM\"#YI##YI#&IA$')=##91!$)I#\"I1!"
+ "#XU&#I)\"#91!$Y%!#I)&%I-+#)1#!Y!!\"I9!\"I='$)A$#9E!%)E!$9I$\"IQ!$J!%"
+ "\"IU!$:)!$:!'%J%)#Z5\"$)Y##J)!\"Z%\"%*-$!:9\"\"Z9!#*9\"$JA!\"ZA!'*A$%JI!"
+ "$JQ!\"ZY!#ZY!\"JY$$;!\"$ZY\"#+%%$K-$$K)$#+%\"#[9!%[9!\"[I!'K5)&[5!$+A!"
+ "%;E&%[I!&[I$%;Q'&KU,%KI''+Y%%;]!)K]\"%L!#%<%\"&\\)#&,-$%<A!%<5!&<9!"
+ "%\\M'%<=!%,=(%,1!%LE\"(<M$$,A!'LQ!%<Q!&\\U\"&\\Y&%\\Y#&M%&%M%!$M%!%])\""
+ "%M)!'-%#'-5\"%]1\"%M5!%M9!&-=#%MA!&]A!%MA!%]Q!%ME!&]M!&=E$%]Q!%]U!"
+ "&MM$%]Y!%]]!%]]!(>!&%^!&%^%!%^)!'.)!%^1!$N%!*^!!'.1!%^1!$^=!%^1!"
+ "$^E!&.E&&.=!&.5!#NA!'>9!'>E!&.5!%>U\")NQ0%^A*&NQ\"'.I%(^M'(NI!'.=%"
+ "(>I+&.I&&.A!&.M!&^I)&.E!)^E!&.A!'>I,'>A!&.=!$^E!&.E!&>I!%.Q'(NI&"
+ "'>A!&.A!&.=!&.=!$^E&&.9!#^5\"'N9'#>-!%^)!$N1!%^-!&>!\"%^)!)N)&'.%!"
+ "$N!!'.)!%ME!$]M!$MY!)-Y)$M]!(=Y!%]Q!']Y))-A+$MQ!&]=!'ME)$ME!(-=!"
+ "$MA!*=9!%M9%#M9\"&M%!%]-\"%M)!%]=!&-%$']%!%-%$'=!)%\\]\"%<Q!(,Q(%<Q!"
+ "%M!&&<=%(\\E0%<A!\",A!%<=!%<9!'<-!%,1!%L5\"&,)!&\\)'%L%#%L!#&[Y$$+M!"
+ "%+]!(+I!&;Y+$+U!%+Q!%+Y!%+E!%;A\"$+5\"%+9\"#K=$\"[=$#[)!$[%%#;-\"$JY!"
+ "#:M#\"[%!#[)!#;%##JI!#ZQ!#ZI!$*Q\"$JM!$JY$$Z)&#J9!#JE!$Z1\"#J1!#J9!"
+ "$J9!$J%!#*%#!J!#!YQ!!YU!#Z%\"$9]$%IQ*#YI##IM\"#IE\"#9A$$Y5'#I9%#)))"
+ "$(]*#H]\"$(Y$#91$#(U##I%%\"I1!\"I5!#99$\"Y5(#IM!#YE#$)I#&9I'$)A##9Q#"
+ "#)Y##YY\"#YQ)$:-##*!\"#Z)\"#J1!#Z)\"\"J1!!*1%%J9)\"J%!%JI!#J9!%:M$!ZQ!"
+ "&:Q($ZE\"#ZU!$*Y\"%*]\"%*]\"&*Q'%+)\"#[)!%+9!\"[1!#[I!\";9\"%[9!'+=\"(;=0"
+ "$;E\"![I!'KM($[Q%$+Q!%+U!&+]%%+]!%<!\"%,!!%\\%(%L)\"&L1&&,1%%<=!%<=!"
+ "&,)!&<=&&<A!%<E!%LI!&\\M\"%LM!&<M!*,U'&LY!%<Q!!-%%%LY!&\\]&'-)\"#M1\""
+ "&]1!%M-!&=1$)-9!&]9&#=A!*-=+*]A('-='%M9!%]]!%]M!%]Q!&MY$%-Y#%]U!"
+ "'.!%(M]-'-Y!%^!!'-U!&.=!%^-!'.)!&.%!&^-%%^)!'>1'$^I!&.5!&.A!$>)$"
+ "(.5*&.=!&>E'&.A!&NA#'>E!'NA''>=!'^I\"(^A\"'.I%#NI!&.I!+^M#'NM'$^M!"
+ "%^M%*.A'&.M!'>M!&.I!&.M!&.M!&^I$\">M!'>E!'>I!&.M!&NI()^I,$^E!(^E'"
+ "&>E!#NI!\">E!)^A!'>E!%^1!&.=!&>5\"#N5!'>5!%N5$&.9!(.A*'^5)#^1'&.)!"
+ "'>-'%^1!$N%!'N!)'.!!$M]!&-Y'*MY&&]M%#ME\"%]I!%]I!%]I!%M=!'-Y&$MI!"
+ "&-=#'-5\"%M9!%M5!\"M=#']-*%]9&$=)!'-%#&M-%&\\Y&&L]&$\\]#$=!!&\\U&%<I!"
+ "%<M!&\\Q\"%<I!',E(%L=\"&<=&!,9!%<9!%,%!\"L1#&\\1(&L1'$<!!&<%%&;]!'[Y-"
+ "%;Q\"*[M%'KQ#$+U!!;=*%;I\"#[=!#;A\"$;=\"#;I\"';9\"%+9\"$[1!%+-&#[)!$*]%"
+ "%ZU)%[1!%:]##+)!#ZU!#JM!$ZI\"$*Q\"!*I!#JA!(*A%#J5!\"Z5!%JA\"$J5!#J-!"
+ "$*-#$I]&&*-($J!!#IY!%)]!$)M#$YQ#$IQ&$IM&$)I$#9A!\"I=$\"9=#\"YM!\"9)#"
+ "$H]##8Y!#(Y!\"I1!#9-$#91!#95$$)9!#9A!#Y9#\")E\"$9E%#9I!%9U!#9E!#J)!"
+ "#J1!$)Y##YQ\"&)Y!!J5&#J)!!*-!#Z9\"#J5!#J=!$Z1&$:=$#Z=\"&ZA+#JI!$*I&"
+ "#ZU!%*Y*#ZU!'+%.#:Y\"$:U$%+%&'J]%$+-!%;9&#[5!%[5!#[=!([=!\"[=!%;E\""
+ "%KU#%[I!$KE#$[I$$+Q!%+]!&;U'&KY'&,!!%,%!$;Y\"&L5'$L5\"&<-!%L%#&<1!"
+ "'<=!$LM\"$\\M#&,E#%<E!%\\M#%\\Q\"&L]!',U##,Y!&L]%\"-%!'L]!)=!-%M-!&M)!"
+ "']-!'-1\"'--\"&-9\")M=-%]9&#=A!!-U!&]5!&MQ$%]Y!&MQ$(=Y!&-]!$MY!%]Y!"
+ ")>!0&]Y%%^%!%>%#(>1!'>1,%^)!*N-%&.5!%^)!'.1!+.5'#^9\"&^9%$.A#'.=%"
+ "'>Q!&^A$&>=\"'.A&(>A+&.M!%.9\"&.=&&.M!#NM!&.I!&.Q!&.I&&.Q!$_)!\"^Q#"
+ ").Q-&?!!(NM!'>Q!&^I$'^U\"'>M!&.]!#^Q!'>U!).I.(N=!&.M!'>I&)^I!'>I!"
+ "&^I$(NA!)^A!&.M&&^9$'^9#&.A!&.I!$^=!'>5!'>5!'>9!%N-%&.5!&.5!&>1\""
+ "'>-&'-Y&#^)\"$^!&'.!!'.!&&-]\"&]=!'=Y'&-Y\"%]Q!&=M#%]Q!%ME!$MA!%ME!"
+ "%]M!%]E!&M9$%M9!(-E!'-1'&=1$%M-&'])!%M%!&M)!%])\"&L]!$=!!),]!%\\U\""
+ "%LM!%<M!%<I!&<E!&\\E'$\\Q#%<E!$,9!%,-!%,1!%,-!%L-##\\5$'<-*#+]!%<!\""
+ "%+]!%+Y!'L!\"'+M*#KU#%;U\"#;M\"\";E&%[A!(+=\"&[5!$[A!&;-'\"[=!#[%!%[!&"
+ "#ZU!\"ZY!$Z]!\"[!!#ZU!#ZQ!%ZU*%:A!%JI!%ZE\"#ZA%$*=\"#*9\"$J=%$J=%#J5!"
+ "#J)!\"Z5!\"Y]%!)]$$9]$&J!*#I]!&9M#!YU!#YM##YI\"$)E!%YE!%)E%%)),\"Y9\""
+ "\"I%!#X]#\"I%!\"I-!\"I%!\"IE$#)5#$)='!)=!#Y=##)1#$IE#\"YE\"%)I!\"IQ!$YQ#"
+ "\"IY!#I]!\"J!!#Z)\"#Z%\"#J%!#J-!$:1!#Z1\"\"Z9!#J=!#J=!$*E\"$JE!!*E($*M\""
+ "%*Q\"\"JY$![!!\"J]#%*]&$+%&#[)!*[)'#[1!&[5-#[5!&;E\"'[9!%+=\"%K=$&KA("
+ "$[I!%;M\"&+M%%;Y\"$;U\"(;E\"&,%%#K]#$[M%#,%%&,!%&\\9#%L1'%<5!'L9&$LA\""
+ "%L=\"%<A!%<A!(,U,%<Y!',I(#,Q!'<U-&,Y#&,M#'-)#$=-!$=%!%])\"%]-!%M-!"
+ "%=-*(M5)&-9\"*-A+%]1'$ME!%ME!%M9!%ME!&MQ$'-M'%ME!%]Q!#>%!%]Q!'M])"
+ "%^!!%]U!\"^!#$N1!'-]+$>)$'.-!'.1!&>1\"&.%!&^9%)^=!(.5$$^=!&.A!&.Q!"
+ "$^E!&.E!$^Q!&.Q!(^Q!'^I#&.A!(>M*$^M!'^E#+NY.\">U!'NM''>Q!(N]&(>U$"
+ "(>U%&.U&&.Y!'.]$(/)().I#(>Y*(^U'&.U!'>I!&.Q!(>U/&.Q!&.I!)^I!&.M!"
+ "&>I!$^A!*.M!#>=%&>I!&NM#$.A#*^E%'>9!(NA!'.=%&.9!(NA!&.=&&>-\"&N1$"
+ "(.1*#^-\"&.-!%]]!)>)*'^!)%^1!#>1!%]Q!%]Y!(-M!&]I!'-A!#=M!$MM!%M=!"
+ ",]E!']9+$MM!#M5\")-9!%M5!(]5$)--!'=-$&]-'%M)!%-9#%M)!&]!'%]%\"(LU%"
+ "'LU!&,U#$LM\"(<I)%<E!&<A%&<)%&<=!*<9)&,5$$,1!%,)!%K]##,%!%L-\"%,%!"
+ "([U-%[Y$&,!)'+Q!$KQ#$;I\"%KE'*;E'%[5!%KE$&[9!%+=\"\";1\"%[1)!;-)\"K)$"
+ "$;%#$K%$#[%!%+!\"$JU!#JQ$\"ZM!$*M\"'ZI##ZA!&*=+&Z9'#J=!#JA!&*5+%:=$"
+ "\"J-!#J-!#9U!$)]##J%!&)]($YY#%9Q%\"II$\"9A#$9I$#9=!%)I+\"IE!#9=$\"I=!"
+ "!(]!#9-!\"Y)\"\"I)!\"I-!\"9-#\")A\"\"IE!\"IA!\"IE!!9Q\"&9M\"$)Y#$9Q!$9Q$%YQ("
+ "#J!!\"J1!#Z!\"$J1!$IY\"#Z-\"%*-'\"*-\"#Z5!#ZA\"#J9!\"ZI!$*E\"#*I\"!Z](%*Y'"
+ "\"ZU$$JY!$+%\"$[)%\"*Y\"&+!'#+%\"&;)$#+1\"$[-$'[5&%;5\"&;='%KU#'+E&&[I!"
+ ")+I&%[M%%;U'&KU#&+Y!$;]\"%KU#%L)#%,!!%\\)#%,-!$,-!%<5!&,1%#<9\"'\\A\""
+ "&L=&$,9!%\\E#(,I-!,I!$LQ\"#\\U#&L]%',Y#&L]!$=%*&M%!%=%%%]-\"%M!!']%!"
+ "%]1!&==$(-1\"&-=\"&MA$#MA!%ME!'MI)%-Q#%ME!%]]!#=Q!$N!!)>%/%]]!*^%!"
+ "!-M!&.%!$N1!$^9&(>)!'>)'%^1!&.1!\"N1'(N9+$^9!(^1-(>5+&.A!'NE''.I%"
+ "&NE#&NI\"&^=$&.Q!&>Y!&>Y!&NQ\"*.Q'&^U)$^Y!'^]\"&^Y#'NM!'>=!&.U!'NY'"
+ "'NY!(^U!*.Y'&.U!&.Q!'^Y\"&.Y!%/!!+>U'!.U!'>E&&>Q!).U''.Q%&.E!$^M!"
+ "'>M!(^Q!&NI#(>M%'.Q%&.A!#^E\"&.A!$^5!)^Q&$^=!'>-&$^A!$N)!'>5!&^5%"
+ "&.5!%^1!).-$'.)%%^)!%^-!'N5(%^!!%-]#$MQ!'-Y!'-U!'-M&'-M!%ME!'-M'"
+ "%]A!%]I!&-M\"%MA!%M=!%M5&\"-1%&-=#%M-!'\\M'$=)!&<]$%M!!(,U#%<Y!(,U#"
+ "%<I!&LY!&\\E\"%LI!%<E!%,=%%<=!&L=!&<-%%L5\"&L5\"%L5\"&<E!%<!!&+]!%<!!"
+ "'+]!#+]!$[A!$K]#&;Q&&[M-\";I\"'[A!$[E!'+A&$[9!&+9\"$[1!$K)$$;1\"$+)!"
+ "#+)\"%[!)#[!!$*]\"$JY!%*M&#JE!%*U&#JM!$*Y&$JI!$:1$#J5!\"Z9!#Z5\"#*1\""
+ "$J-%$J-%#J-!!Z!!#YM#$)]#\"YY\"#)U##9U!&)](#9I#\"YE(\"I9!#IE\"!YA!!Y9$"
+ "!9!\"$I!&#))##)-&\")-\"#9-!#I9\"\")9\"#IA\"#Y=##IA\"&)I,$)I$$)Q$#9U!#9U$"
+ "#)Y\"$*!##J%!%:5!#Z)\"#J-!\"J1!$Z5\"$:9##Z9%$J=!\"Z=!#J=!#JI!&ZA##ZI!"
+ "#ZY!$ZU!$Z]%%*]*%*Y&$[%%%K-$$+)\"$+9!%K)$%[5$#[9!#;=\"#+=)%+M!#[E!"
+ "$KU#$,!!%+Y!%;Y\"%<%\"&;]\"&\\!(#L%#%L)#%<-!',-)'L1+#\\5#%L5\"'<9!%\\9#"
+ "%<I!$<I!%<I!(,I#'LY!'<U)&L]!%<Y!$<]!%M%!&]!\"%M%!$])#&-1#%]1\"&=)$"
+ "&-5#'M9)%M9!&]A!%M=!&-E,%ME!$MU!#=Q!)MU,&]E!&=U#(=Y!(=]!'^!))>!%"
+ "%^%!).1$'>)'%^-!&>!##N=!$^5!'>1&(.9*#NI!%N=$&.9!$^A!#N9!&>E!*NM4"
+ "&.A!&.Q!&.M!#^=\"$^Q!#NE!(^Q!)O%#$^Q!&^U#&.Y!'NY!'^Y\"&.Y!&.Y!*>]-"
+ "'_)(*.]!&.]!&.]!&?%!*?!(&.U!&?!!$^U!\"^Y#&.Y!*?!!&.U!&.]!&N]\"&.I&"
+ "&.]!&.Q!'>U!&.M!&.M!'>I&%.Q!'>A!&.I!&NI\"&>A!&.A!(NA!%^)!&.A!'N-\""
+ "#>-!$N%!%>-$&N-#%^%!&.5!%]]!%^!!$N!!']])%]Y!%]M!)-]%#=Q!%]]!&MY$"
+ "%-=($MI!$M9!&-A\"%]5\"&-A\"&-A#%M-!%]1\"'--#$]%\"%M%!'\\M\"%M)!$,Y$'L]%"
+ "%LU!&\\Q&%<Q!$\\M#%LI\"%LE\"%<=!&L=!%<M!%<9!&<5%&\\1#%\\%#'L5!&,!%%,%!"
+ "',!!$+Q!&[E(%+]!%+Q!#[I!)+M*(K9$&[A)%[=!$[I!%K=$'[5%$;=\"#+1\"$K1$"
+ "&K)!$K!$#[)!\"*]\"$+!&$*Y\"\"[!!$JU!$ZU)#JM$#ZQ!#JA!#J=!%:9%&*=(#Z%\""
+ "%J1&#*9%&*)(!*1$%:%($YY#$9Y$$)U##9Q!%9M%#9M!$Y='#YE#$YA&#)5##99$"
+ "\"I!\"$HQ'\"I=$#))#!I1&\"Y1\"!Y9$\"Y5\"#91!$)A$$)=$$9I%#II\"$IQ&%Z)'$Y]#"
+ "#9]'\"J!!%J!&#J)!#J5!$:%!#J5!$J9!#J9!#JE!$ZE&#:Q#$JE$#JE!!ZM!'*Q/"
+ "!*U!%JY!%*Q\"&K%!%+%\"#[!!$+)\"$+-!$K5#!+%!&;=\"$[=!&[I,$[A!&+E%%KI#"
+ "%+M!&;E&%;U\"$+U!%KY#%K]#%,%!$<)!$\\)#&\\5(&\\1(&L)#$,5!&\\1(&,I$'\\A,"
+ "%LE!(<M.&,I$%<U!&,Y#%<U!&L]&)--!'L]!%\\U#%M%!%M-!&M9*$]1\"']1*&M)%"
+ "$MA!'ME$$]9\"%MA!&ME$'-I!#MQ!&]M!'=Q\"&=I#%]U!%.%\"(>!!%]]!%^-!%]]!"
+ "(>!!$>)%%N5%'^-)'>1&!.9!$N1!'>9&(.=$&.I!&.=!%^A&&.I!&.E!&.E!&.E!"
+ "(NM,'>=&&NQ\"(>A+&?!!)^U,&.U!&?1!*^Y$$.Q#-_-+$^]!&?!!&.]!&.]!&.]!"
+ "&?!!$_!!'O-!&^Y#&?-!(_%!'O-!&?!!'^]'%^]%$_!!%N]$*.]!&.Y!&?!!&.Y!"
+ "(^U!$^U!(^Y!'NQ'*NQ##.Q)*.M!&.I&(.E)*NA0&.I!&.=!$^9!(^-\"%^1!&^9%"
+ "&.=!&.9!#N9!$N1!%.9\"+^)+%^)!&.%!%^!!&N-)'.!%&=]#$MQ!&-]!(-U!&=E$"
+ "'-A'%]I!(]A$%MA!&-=\"#=-!&-E\"$]9'']1*#=A!%]-\"%-1$#M%\"%<U!&--#&<Q%"
+ "'\\Q+'\\]&%<Q!#\\M#%<A!&<A&%LE\"$LA\"&LE&#L=#%,1!(,5(&,1$$L%#\"\\)$%+Q!"
+ "#[Y$'\\%,#<!\"&+M!$,!!\"[Q%$+Q!)+M!&[=)'[A%$+1\"%+=\"&+=\"!+5!$;1\"%;1\""
+ "#[1!#[)!#K1'#ZU!%*U&$Z]%#ZU!#ZQ!#JM!$:M$\"ZE!$:Q#%:5(#Z=!%:)!%JM)"
+ "#J9!#:-&#J)!#Z%\"$:!$$YY'$IM&%9Y)$9U!\")Q\"&IQ.#9=!#IQ!$9M$#9A!#I=%"
+ "$)%$$)!!\"I)!#)1#$)%!!)1'#I=%#Y9&$IA%$IE##Y9#\"IE!%IM#$YY#$9I$&9Q'"
+ "\"Y]$#)]\"$Y]'#J-!%JA)#J1$$Z5&$:1!#ZA\"%JA)!*M!%*E+'ZM+$JM!$JE%$*M\""
+ "#ZQ!#Z]!\"K!$&+)\"&ZY\"$K)$\"*Y\"#[5!#[1!$[)!%K=#%+5\"%[M)%+Q!%;I\"%;A\""
+ "$+M!$;I\"([M)$+Y!%K]#&;].%,%!&,%!&\\5($+]!#<5%%<9!%\\5#%<=!%<A!%,9)"
+ "%<=!%LI\"%<I!&<E!#,Q!%<U!'<Y)%LQ!&=-$\"-%!%M-!%M)!%]-!%M-!%M5!%M1!"
+ "%]5\"%==$$M=+&-E\"%]]!$M=!\"-U!'-Y!&MQ$&.!!'MY#%]]!%M]%%>!$'.1!&N-$"
+ "%^%!#^!\"&.5!$N1!)>5*&>E\"&.A!&.=!%^1!'.=%$^M!&NA#).I\"&.M!&.U!)^M1"
+ "'>Q+'>Q&(.U)&.M!&.Q!$_%!&>]!&.Y!&N]\"&.Y!'O!!&_!)&?!!(_!!&?-!#O1!"
+ "'_)(&O!\"'N]!'?%%&_9\"&O%\"&?!!&.]!&_!#%O!#$.Y#'/!*%_%$&.Q!'N]!&.]!"
+ ").]-+NU'*.U!&.Y&&.Y!%>Q#$^Y!&_!#'NI!'>I!&NI\")NA%&.E!'^)*(.A$(.=$"
+ "&.9!&N-#'>9!&^1%%^)!#>-!&>)\"\">!!%^)!%]]!%]]!%.!\"%]Y!(-U%(=Y!%]]!"
+ "%ME!%]I!+M5'%M9!#M9!(==\"&-5#%M5!&-9\"%]I!&]=!%M%!,M=&'LM!(]!!&\\]&"
+ "&<Y$%\\U\"%<E!$\\I'$<M!#,M!',I(&\\E\"$LA\"'L9\"%\\=#\",5!&,5%%<1!!L!#&\\%("
+ "(<%!%,!!$+Y!%+Y!#KU#%+Q!!;I\"$[I!%+M!([A*%KA#%+M!$[-!%[5!%;1'\"Z]$"
+ "$+-\"$JY!%;)#$;!#!*]!%Z]%%*U'$*U\"\"ZY!'*M$$*=##JE!$*A\"%:=(\"J9$#J1!"
+ "#J1!$J-%\"*1\"$:)!'*%-$Z!\"$:!$&Y],$)U#$)Q$$9M!%)I$#9I#$9A$$YE#$)A#"
+ "&)1#\"Y%#\"Y-\"\"I5!!Y9!\"I1!\"II!!9A\"#YA##YE#!YU!!YM!$)Q#&)Q%#)M#&IY'"
+ "#Z!\"$9Y!#J%$$*%##J5!$:!!\"ZE!#Z5\"$Z9\"#ZA!&:9!#ZI\"$:I$#ZI\"$ZM\"!:Q\""
+ "#*]!#ZU!#Z]!%*]\"$;%\"$+!\"#[1$%K9$$[5!%K9$#[9!%K=($[I!\";A\"%+U!$;M#"
+ "$+U!%[M$%,%!#;Y\"';M#%+]!#\\!$%\\)$%,%!'<9*\",=!%<5!%L5#&<1!(LA!&\\M'"
+ "$,A%&,M(%LM\"%\\Q#$\\U#%<]!%\\]\"'L]!%<]!%M!!$]-\"$M-!']-!&M1%&]1&&M9$"
+ "%M5!(]9.%ME!%M=!$MI!'-]&%]U!'-U!%]Q!#]M\"(=Y!*MY!'.!%&.)!%^!!#N%&"
+ "'.%!%^-!%^-!&^5%&.=!'>9!'^=(+NE4$.I#&.E&'^M\"'^=(!>I''>M&#^Q\"'NY!"
+ "&.Y!&.]!$_!!&.Y!&.]!'^U(&^Y#&NU\"'O!'!/!!&.]!&?!!%/-!(_)!&?%!*>Y3"
+ "&?%!&?%!$_)!'O)!*_%#%_%%&?)!'/)$&/9%&?)!'O1!'O)!&?!!&O!\"&?!!&^]#"
+ "%/-!&.]!'>Q!&.Q!'NY!*.U!*^M**.M2)?!('NE!#NE!&.I!$^A!'^E\"#NA!&N=#"
+ ")>=/'.=&$^9!'.!!#>1!%>-$'>-!&N%$$N)!%^-!$^%!%^!!%]Y!%]M!%]Q!%]Q!"
+ "'MM.%]M!&-I\"#=E!&]A%%M9!&-=\"$]9\"&-A\"(=1#\"M-#(])&&=9$%M%!'\\Y!%M%!"
+ "%\\]\"$L]\"%LQ!&LM&%,]#%<M!$<M!$\\E#%<A%$<E!&L1'%<5!%<%\"%,%!%\\%#$,!%"
+ "%,%!%+Y!(;U+%;M\"&+Y%%KY'#;Q\"$KI#%+I%%+M!&K=(&KU'#[9!&[9!&+)+%;1\""
+ "'+)'$+)!%;%#$;!\"#Z]($+!\"!*Y!$*U\"\"ZM%\"JQ##JI!%:E$#ZA\"$*A\"'*9$%:5%"
+ "#J9!\":-\"#J5!$J1%#J1!%*!$$:-'$9Y$$9U!$9]!$9Y!%9Q\"#YQ%#IE$$)I#\"IA!"
+ "#I%#\"9-##)-#%I)!$Y5'!Y9!%9A,#9E!#YI#$9E!$)E#!Y=!%YQ$$YU'$9I%$)Y#"
+ "!Y]!\"YY\"#*%\"#9U!$J)%%:-!#JA!#J-!&ZM+#:9#\"ZA!#ZA\"#ZE\"#ZE\"\"JQ$#JM!"
+ "#ZQ!![5!#[!!%+!*$[%%'[)&#[)!$+1\"%+5\"$K9#!;=&&[=!%;5#$;M\"&KI($;I\""
+ "$KU#(;U\"%+M!%+]%%KU#%+]!%<%\"$,)!%L-\"$,5!$,5!%<=!%L9\"%<E!\"<=\"#LE\""
+ "%<Q!%<M!%<Q!%]%\"(LU%%<Y!&\\U\"%M!!%M)!&M!%&])&%M)!(-A!&-9\"&]1!&-%$"
+ "&-=\"%]A!$=A$'-A\"&MI$(]M$%]M!$MU!(M]-&]I*'=M#'>!!'=U''^%)'.%!%^%!"
+ "%^-!'>)'%^-!(^)(&.)'&.=!&.5!\"N5\"\">I!$^A!$^I!$^E!&>A')NY$&.Q!+NU!"
+ "\">U!)>Y)%^A&).U-(_%!&.]!'/5$&.Q!$_%!&?)!&?%!&O-!&?!!#O-!&?)!$_)!"
+ "(_%!&_)#&?-!#O!!&?)!&?)!&?%!(/A!*?)!'O),(_)!(>Y*'_%((^U!#O%!+>Q!"
+ "(O!%(_%!%?%\"&.]!&.]!&?!!'.M%&>U!$^U!'NM'\">M!*NM)'>I!(^Q!&.E!-NA&"
+ "%>=(&.A!&.9!%N5%&>5\"%^1!$>-$%^)!%^-!'.!!#>)!,>!)&=]#$]Y!&=E#$MM!"
+ "(=Y&&=U#\"MU\"#=I!'-I&&]=!&-A\"(]A$%]5!%M5!%]5\"(--'&=)$\"-%!(LQ!%]!\""
+ "&LY!&<Y$%\\U#'\\U\"#,Q!%<M!(LI%%<E!(\\=(%,1!&<E!'<5!%L5\"%L1\"%<%!$,)!"
+ "'\\%,&KY##,!!%L%#(+Q!%+Y!$+Y!%[Q)%[E$$[E!$[A!&+=!%;-\"#[9!#[5!&[=%"
+ "#+-\"\"[)!%K)$%[)!&+!&$Z]%$K!$#*U\"#ZQ!![!!#ZM%\"*U\"!ZE!#ZE%#J=!!*9!"
+ "\"J5#(:1'\"Z%$#Z)\"%J)\"\"Z!!%9]%$:)!#)Y#$)Q'&IY.%9M\"#YE\"#IA!$)A$#Y5#"
+ "%9)&#))#\"Y-\"\"I!!\"Y=\"\"I9!#99$$)=$#9A!$)Q$$IQ%$IE&#IQ!#YQ\"#9Y#\"I]!"
+ "$:1$(:%.#J)!%Z1#\"*1\"#J%!#J1!%Z=##*=\"$*9#$:E#$JQ!#ZU!%JQ%$*M\"$ZQ!"
+ "%:Q$#ZU!#[!!![!!#[)!#[-!$+%\"#[9!$[5!%+9!%+=\"%;I\"%;E\"&[I$#;M##KM#"
+ "(;U&&K]+&[Y$%,!!&+U%',)%&,)%%,)!#,-!',1%)\\%-&<9!%<9!%<=!&,E#&,E("
+ "$LM\"%<M!&=)$&M%!'<U)&<Y$',Q(%M1&%]%\"'-1'$]5'&]5!(=5\"%]5\"$])#(==\""
+ "$]A\"%]I!'-Q&$M=!$MM!']M)\"-Y!&-U!%]U!(-Y%(N!!$MU!%^-!'.-!$N1!$N-!"
+ "&^1%)^5,&.5!&.9!&.=!\"^=(#N9!$^E&'>5&&.Q!&.Y!&.M!&.Q!+>A'$^Q!&.U!"
+ "(^Y!)^U,'>U!&?)!'N]'#N]!(_%!$_)!&NU\"&.]!'O)'&?%!&?5!&?1!'/9$%/5!"
+ "&_-#$^]!%/5!'_A''O-!&?1!'/1$'/5$*_1)+O-!&?-!%/-!'O)!&?)!)?5\")?%("
+ "$O!%*O!/&?%!&.]!'O!!%/!!$^Y!'>U!'.Y$'NY!(^Q!&.M!$^M!&>1\"&.E!+>M!"
+ "&>A\"&.9!&.9!&>=\"&.5!&.-!&.9!&N-)(.1*'.-!&>%\"&]]%%]Y!%]]!'>!')^!("
+ "(-M!%]Q!$]M!%]I!\"-E!#MA!'-1'%M=!%M9!%=-$&=1$(=1('=!)%]%\"%M%!'=%("
+ "']!!%LU!%M!!*<A-%LU!&,I#'<I)%<A!%<U!*<=)'L-\"&<E*%<5!&\\-(%,!!%L)\""
+ "%L)\"$,%%$,)!&<!&%KU#%,!!&[Q-$+M!%[Q%';I+%;E\"$[5!%KA#\"[5!%[5!&+1&"
+ "\"[)!%K9(%K-(![)!#[!!#;!\"'*Y'#ZU!$ZQ\"$:E'#J=!#ZI\"$J9!$*E\"#ZE\"\"Z=!"
+ "%:1$#:9'#J-!%J)&#Z%\"$:%$$*!#$I]\"%)Y!#IU$$9Q$#9A!#9I!$9A%#I=%$)=!"
+ "'(U)$Y)%$))'#)9##)E#\"99##9=$$)=$#YA#$II\"%9=)&)U,%9Y&&)U%!)Q!$I]%"
+ "\"Z-!&:%)\"J%'#J%!$:)$!Z1!\"Z9!$Z9&#J9!':I)$:E#$JA%%*M'%JQ!$ZY%\"Z]!"
+ "#Z]!#ZY!%+)\"%K!!\"[-!%+1&#[5!\"[5!)+5+$[E!%KA$%[A%'[A!'+E\"%;M'%+U!"
+ "$;Y\"%,%!%,%!%+]!#,!!&,!%(,%.&<-!&<-%$KY#%<5!&\\5#$,A!%LA\"%LA\"#\\Y#"
+ "%\\U\"%LI+!\\A$\"<U\"%<U!%LM!'M!*%M%!&,Y,#=)!%M1!&-A\"$M5!#M1'%]='%M9!"
+ "%M=!%]A!&]M!'=M(%]M!'-U&%]Q!'-Y!&-Y'&-Y!%^-!'^%$%^)!$^5!%^)!%>1#"
+ "&.5!&N5#&.9!'.I/&.A!&.=!%.I!&.E!%NI$#^M!&.E!'NU!&.Y!&^A$&.Y!#>Y%"
+ "'N]''^]!&.M!%O%#&?%!$O5$%/-!&?)!(_!!%/-!)/5-%/-!&?1!'O)!#O1!&?1!"
+ "$?1#*_-)&?-!&_1#(?))'_1!&O-\"*?1'&?!!*?5''O1!&?9!(O9$&?%!'?)%&?)!"
+ "'/)$#NY!&?5!&?!!&.U!,/)/'O%!'/!$&.Y!&.Q!&.M!(NQ&&.M!'O!!(.E)&^E)"
+ "&.=!&.A!&N=#&.=!'^5#&.5!(^1-%^1!$.-#$N)!&MU$&]]%%.!\")M]!%]]!(=],"
+ "#=Q!%MQ$%]Q!\"-Q!%ME!%MA!%ME!$M=!%M9!&-=\"%]=!$]=\"%]5!#=)!'])+#]%#"
+ "&M!%(]%!)\\Y!&LQ!%LM\"%\\Q\"$<E!%\\I#&LE&',A(&\\E(%\\9#&<A%&\\5#%<9!%,-!"
+ "%,-!'+]!&L!#%,!!%+Y!%+Y!&+U!&[Q)$;M\"%[E!(+=&'K=$'+=\"$[1!'[9!%+1*"
+ "$+9\"#[1!\"[)!#[%!%+!&%:A!#ZQ!$:Y#\"*]!&ZM##ZI%#ZQ!\"Z9!#JI!%:5!#J9$"
+ "!Z5!#J%!#J1!$J9%\"J)!#J!!$:)$$)]#\"IY!&)]$#YM#\"YM!!YI!$)A!#I9\"\"9I#"
+ "$H]&#I%%\"I-!!Y-!#)5#!)9!#)=&#9A!#YE)\"YA\"%)E'#)Q&$IQ%#9U!$Z!&#I]!"
+ "\"*!\"&:%&#J%!%J5)!Z=!%:5!%Z9*$:M#'*=%#J9!#ZA!%*I\"%*Y'$*Q\"#ZQ!$*]\""
+ "$ZY)\"*]!$[%!![!(\"[)!$+-!$+9%%[5$$[5!$;M\"%+=!%K1$$[E!&;I\"$;E\"!+]%"
+ "\"+U!%+M!(+]!#+]%%L%#&<%&$L1#)L-!#,%!'L5\"%<A!&<=&%<=!%<A!&\\A(%LE\""
+ "%<M!&<U$%<U!'<Q)$,Y)',](&<]$',]'%])\"*==&%M1!%M5!(=M,#M-\"&]=&'=I#"
+ "%]E&%ME!%]U!%]A!%M9!%]U!%]U!'.%%%^!!$N!!&-]\"&>%\"'.%&'N-('>1''.1!"
+ "%^)!)^9&&>9\"\">=!'>=!'>E!&.E!#^5\"&^Q#\">Y!'.Y%#NM!->Y*'^Y\"#NY!&.U!"
+ "$_%!&?!!%/5!&?1!#O)!&?)!&.Y!&/)&'_-(&?-!)/1!(?1$&_5\")/1!(/=\"(O5*"
+ "&O%\"&?A+%/1'%/5!&?9!&?5!)?5(&O)\"&?5!&?A!&?5!&?9!&?9!#O)!&?)!)/-!"
+ "&?)!)/)''/!$&?-!'NY!(_%!&?!!)/!-'>Q!$^Y&&.M!&?!!&.U!).A#'NM'(NI!"
+ "&.A!&.I!%N=$+>9((N5!'.A%&.5!%.-\"'.1%%^-!&>%#&=Y#%^%!*^!''-]!%]I!"
+ "%]Q!'>%'&-Q\"$MM!%]M!&M5%$=9!%]I!&-9\"&-E\"'=5(&-)#&-A\"%M5!&]5!%]-\""
+ "&-%#']%&%<Y!!,Y!),Q#$LY\"%LM\"&LY!'\\M\"*<%+&L9'&,I$%<9!&L)'$,-!&,-$"
+ "&,)!#L!#',!!%,!!&[])%;]\"&+Y%$[Q$%;I&%[M%%+E!%[=%&;A&&+=&&K=($;5\""
+ "%[!&#[)!%;)'#[%!$;!\"&;-$#Z]!\"ZU!$K!$!ZM!#ZU!$JI$&*U\"#JA!&J=*\"Z9!"
+ "$*1\"#JM!#Z5\"#J1!$J1%%9])%J!#\"YQ\"%J%*$Z)&$)Q#%)Q$$9U!$)A'#9E!%)A'"
+ "\"I%!\"Y%#!)-!\"I1!$9E!!Y9!$9A($IA%#Y1#$IE%\"YE\"\"YQ!$9U$$)Y##9U!$)]#"
+ "#J)!\"Z%\"$:-$%:-)%*)##J9!#ZA\"$*A\"$*A#$ZA\"#ZE\"%:I$%JM)%ZU!%:U##ZY!"
+ "(J]&![!$$[)!!+)!#[%!#[9!%;1\"%[1!%K%!$[=!$;E\"%KE#%;Q\"!;Y&#[I!%;M'"
+ "$+Q!%;Y\"%+Y!%+]!$\\)#$<)&%L)#$<%\"%L-\"#<5\"%,1!%,-!$<A!#,E!%<M&&<M%"
+ "(LU/&<M!%<Q!\"<Y!%M!!'-!('-!'%<Q!$])\"&M)!,-9$%M-!(]9$%]9''M=$&]A!"
+ "%]I!$ME!$MI!&-M\"\"-Q%%]U!#=Y!*-])%]Y!%^)!$N%!(>%&$^1!$N%!%^1!\">5!"
+ "\"N)\"&.5!&>9\"&.A!&.I!$^E!&.Q!&.Q!&.I!'NY!$^U!&^U$(^U!(^Y!(_)!&.]!"
+ "#NU!&N]\"&.]!&O1!%/5!&?-!*/!!&?=!%?1\"%/1!'O9&%_9*&?1!*?9!&?9!%/-!"
+ "&O1!%/=!)O9\"'/-$&O5!'_5'&_9\"&?E!&_M\"#OA!&_5#&?-!,_5&&?!!'O1!)_A*"
+ "&?5!(_-+'O)!&?)!%O)#'?-%&?!!%_!$\">]!&?)!&.Y!#NU!'>U!&.M!'>I&&.M!"
+ "&.I!'.E+&.A!&.A!&.9!&.A!$N1!#N=!'.1!%^-!'^))'.)!\"-Q!&>%#%]]!&.!!"
+ "$MU!\".%!'-A\"%]Q!%-M#']=%'-E''=A(%M=!&-9\"$]1\"%M5!(])/+M%3%M%!%]!\""
+ ")=='%]!\"\",M!%\\E##\\U#$\\E#%<M!&L]&%LI\"&LE!%<A!&\\A#%<9!$L=\"'L5&%L-\""
+ "&<A%%,)!&L1\"&+]%%L1\"&;U\"(+Y!';]!$+Q!%KI'$[I!'+=*%;A\"%;M\"%K1,%;5\""
+ "&+1&&+-.\"K)##+5!!:U\"%JY$#[!!%;!$#ZQ!&JM!%:M$#JI!\"Z=$$:M#$JQ!$*=#"
+ "#ZI\"&ZI\"#Z1&$:1'\"J1!#J)!$:!!#I]!$)Q##YY\"#Z!\"$)I##*!##9E!$9A%#9A!"
+ "#Y-#\"))\"\"91#\"I9!!YE!#Y9&#I5\"$95%$II#\")A\"#YU\"#:-&%YM(#)Y)\"I]!#Z)\""
+ "#J!!%*%##J5!#J-!$J-%\"Z9!$:=#$JM!#JA!&:=(&*M'&ZE'#*I\"$*M\"$:U$$[)!"
+ "$Z]%#:Q#%+%&#[-!#;-\"%;5#!;1\"#;9\"$[=!$+1\"$[I!%[E$#[A!$+Q!%KE'$<%!"
+ "$+U%&KU#&,!!)<!!\",)!&<)!%K]#&,!%&L-'&LI&%<9%(,I,'<A*(\\Q!),A(%<M!"
+ "%<Q!*,Q'%<E!),]\"%<M!(-!-%M!!#=9!)-9!%=-)'-1'&==(&]=!&-A\"*MI'&-I("
+ "%MA!&ME$&MQ$(-M+'-M'%^-!$MY!&-]!&.=!'-M&'.)!%^-!%^)!(.5*&.5!&.9!"
+ "$N-!&N5#&.I!&.=!$^9!'.I%%.M!&.Y!&.U!'>U!#NU!(>]$$_%!'?!%'.]/#O%!"
+ "&?-!&?)!&O)!#O1!\"?9!&?=!&O1(&?1!'?=%&_5\"&O=')/E!&?5!&?5!(/M!&?=!"
+ "%/=!&?A!'?=%&O=!'O=&&?=!&?9!)/A,&?=!)?=(%/9!&?9!&_9)(OA+'/1$&?)!"
+ "&?1!&?=!)/-!#O-!(?))%/-!$/%-&?%!&.U!#O)!#O!!(^]!&.I!'.Q*(.Q$&.U!"
+ "&.I!&.I!&>E!'.-%&.=!&.9!(N9!%^-!'NA!$>5)*N)%%]Y!'.-!(>%!)M]!%^!!"
+ "'MY#$]]&%]U!&=Q#%]M!$=E$\"-I!#=A!%]A!%M=!+M=!%]I!(-1+'-)\"'])+'--'"
+ "%]-!%M!&\"<]\"',Q#$\\I#'<=!$\\I#%LQ!\",I!%LI\"%\\A#%L=\"$,=!&<1!%L5'&LA\""
+ "%,!!%\\)##<1\"#+Y!&+]!'+Y!&L!'%[E!$[E!%+]%%;E\"%[E$'KE($[=!$[5!&[M-"
+ "#[1!%;5\"%+%\"$;5\"%[%%%;!$#[%!#[!!$:Q$#JI!\"JM##ZA\"%ZI*\"ZE!%*=&$JE("
+ "\"Z9!$J9!$J5!#J%!$*!##J1!%I]\"#J!!%:%(#)M#%9]%#9Q!$9M%#YM##IE\"#I=!"
+ "%I)(\"Y1\"%I5*%)-%&9A*$Y=#\"II!%IA##9A!#II!#YI#%9U%$)Y##IY!$:-#$IU\""
+ "$:5$#J-!$J1%#Z)\"#J-!#J%!\"Z9!#Z=\"\"ZA!%ZQ&%*Q'$ZM\"$:I$'ZU\"!:A\"#[!!"
+ "\"Z]!#[!!#[%!#[%!![9!$+=!$+5!%[9!&+M%%+A%&;A&![I!$[I!'+M!$K]#';U+"
+ "%KM#&+]!&\\%#$,%!%<9!$<)\"',5-%\\9#%LM\"'<5*&LA\"%\\A##,5!$LA\"$LA\"&\\Q&"
+ "%<E!&\\Y&%\\U##,]!&,]#%<Y!%<]!'-1\"(=1(%]5\"&M5$%M-!(=9,$MA&%M9!%]M!"
+ "%]I!%]Q!%]Q!%ME!'-U!%]Y!%^!!%^)!&]Y%'>)'%^%!%^!!%^1!\">-!(>%!\".1!"
+ "&^9$&.I!&NE#%^I%'>E&&.M!&>M!$^Q!%>]\"%>U((.Y)'O!!&.U!&.]!&?)!&?-!"
+ "&?-!#O)!&?)!$_!!)/%!)/E!&?5!%/9!#O=!&?9!&?E!&?=!&_E\"&?=!%/E!&_M("
+ "&_A\"&OE!'_A!'/U#&?5!'?E$(O9$)_A#&?9!&?A!&_A\"&?=!)?-.&?9!&?=!&?5!"
+ "&_%#'?5%&?1!(/1)&?1!'O)!&?)!&O%\"$.Y##/1$&.]!'>E!$^Y!&.U!)NU/\">]!"
+ "*.M!&.Q!&.I!&^I$&.M!(.A*(^-.&.A!'N5'&.=!&>%(&.-!\".%!%^!!&-]\")]]("
+ "$MY!']Y%&-U\"'-U!']M*%]I!&-I\"%ME!%ME!$]-\"%M=!#=5!%]5\"'M-.%]1\"&M%!"
+ "%]!\"'-!'%L]!%M%!'M!*$<U!&LQ&'\\I\"'\\I\"&<I!%<A!\",A!#,=!$\\A#%<=!%L5\""
+ "',-$%<%&%,%!&;Q/#,%!(;]\"&L!'%;]\"&KQ+$;M\"%+U!$;E*&[A$$[9!$+=&%+E!"
+ "$+1\"%+1\"#[9!%;)#%K)$#+!\"#ZY!#ZI\"%JQ)#ZU!$*A\"#ZI!#Z9\"#JE!!ZA!\"*E!"
+ "!*=!#J=!$:5$$:%$&J-&\"J-!#J%$$*!#$)]##)Y\"#YQ##IU!#9E!$)I#$IE&$I=\""
+ "!Y)!\"Y-\"#Y=&#)%)#Y9#!)=!&99*#IE%%)A'$9E\"%)Y!#J!!$)U#%)U$$J)\"#J!!"
+ "#IU\"#:)#$J1\"':1\"&:5!&:=,$*5\"$JA!\"ZA!#JE!%ZQ*$*M\"$*M\"$*E\"#ZY!#*U\""
+ "#*Y\"#ZU!#[%!%+%\"';5(#[5!$[5%%[=!&[=!$[5!&[I!%;E\"%+E!$KM#$+Q!%+U!"
+ "%+]!&+M&&\\%($<%\"%<!!%L)\"%L1\"#,1%%L-\"%L-\"%L9\"&L=!%,1!%LI!%\\M#%<M!"
+ "&<M!$<U&'=!$%<Y!&M%&%M)!'])&%\\Y#&-A\"']9+'=5#%=M$&-=#(M=)%MA!&-E\""
+ "%ME!!-E&%^!!%]U!%]M!&]U%!-]!%]]!%=Y)(=Y!%^-!'>A!'.)&&.5!$^9!&.9!"
+ "&.9!(^A!)^E!&.I!&.U!&.A!&^U#'.Y$#^I\"&?!!'NY!'.]%%/-!&?)!'O%''O)!"
+ "'O-!(_)!&?-!)?1))?5!'_9!&?E!)?I!&?=!#O1!&/E%'/A##OA!)?E'*OA!*_U("
+ "&OI')_A*'_E!)/9!#OA!(/A!+_E!'_I!)/A!*O=!'_A!&_=\"%/=!&?=!&?-!'/9$"
+ "#O9!'?5*%?5\",_1&&_1)'>Y&'/-$&O-!&.Y!&?)!$_%!'>]&$^M!$^]!&.U!+.Q,"
+ "&.U!(NI!)^I&&.Y!&.E!(.A)&.9!&.9!'>1&'N%\"%^1!$N)!%N-%'.%!\".1!'.!!"
+ "&=M$%^-!&]Q%'-]!%]U!#=E!(-M%&=E#$ME!)MA-(=I,%M9!'=9('=1-$=-!']5!"
+ "%-=#%M)!'-!(%<]!&LY&$<U!%\\Q\"%,U)$LM\"&\\U\"$<I!%LA\"%<=!&L9&#<!\"&,1%"
+ "&<1!$\\-(&L)'#<%\"&+]%%+Y!%[Y$%+U!#[E!%[E!#+9!#[I!%[=!%;=&%;=\"(+9\""
+ "&[5%$[9$#[-!$;=\"#[%!#[-!%K!!\"+!\"%JQ$&[%!%JY)$ZA&$*M\"#ZI\"#ZE\"$J5!"
+ "#J9!#*1\"#J=!$:1!#J5%!Z)!%IY&\"YQ\"%9],%:)%%IU\"$)Y#%9A\"\"II!$Y1'\"9E#"
+ "\"I-!#Y=&#)9#!Y9!$Y9'#YE#&YQ!#YE\"#95!#)I##)Q#!)Q$&9U-$IE%$*!&#Z%\""
+ "$:%$$J9%\"*%\"#*=\"$J5!#J9!$J=%!ZA!#JA!\"ZI!$:I'%JE!#ZQ!#[!!#ZU!$*Y&"
+ "&+!&#[%!#[)!&+5&%K%!$[1($[=!$+9\"%+5\"%KE#%KI#%;E\"&+M*!KU#&KQ#\";I\""
+ "%+U%%+]!&\\!(%,!!&,)!&L-\"&,1%%<9!&L5&&<9!$,=!&<=!&\\E,%LI\"%<M!+\\Y*"
+ "'<])*,U,%<I!%=%%$=!!&M%%%M1!#]!$&-1#(]9$$=1!(M5.)M9-\"-1!%]A&(=I!"
+ "#MM!%]Q!!=Y'*MU!&-Y!'-Y!%^!!(.%%'.)!$N-!%>-$&N=#'N5').5/*^A%(>5+"
+ "(^A-(^E-$>1*&.=!&^M$#^E\"&.Q!(NU&(N]+&NY'\"NU!*_!#&.]!&?-!&_)#&?-!"
+ "(_1,&O1!&?-!&?=!&?=!&O9!&?=+%?A!%/=!&?E!'_A!*_Y!'_A!*O=!*_E(&OI!"
+ "&_I\"+_=!'?I$&?E!%/]!&OI!'_I!&OU!)/E!&?A!*OE!'_E!-?I!#O=!'_A!'_A!"
+ "#O=!&O-\"&OQ!&/Q$)/5!&?=!&?)!&?E!%/)!%/%!$_!!&.]!&.]!&?%!(/)('>U!"
+ "(^Q!'_!(*>U\"&.M!&>E!)^E!(>A&'.5&'>=&'.I*(N5,&.5!%^%!$>)*%^)!'^%)"
+ "\".!!'.!!%^!!\"-U!&]M!%]Q!&=Q(#=I!$=9!%MA!$M=!$]9\"'-9\"%]M!$]1\"']-!"
+ "%M%!'M)$*-!!$L]\"&,Y(%-%$%\\U\"%\\Y\"%LM\"&<I%&\\I\"%\\A#$L=\"&<A%&LA&#L1#"
+ "%\\%#$,)!$<1%$,)!\"KY#&KI#&[I!%+U!$+Q!#+Q!&+M)&;I\"&;E\"&[I!%KQ#(;9#"
+ "%+5&$+1\"$+-!$;)#%+!\"!+-!$;%'\";!*$*Y\"#ZU!\"JQ$'*Q,!Z=!&:9%#JA!%:5$"
+ "#JI!$:1##*5\"!*1$#J-!!*5$$*%#$9]$#9U!$9Y$&)]!#9A!#91!#YA\"%YM+#9A!"
+ "!Y1!!)1!\"I-!&Y)&#Y9##IE$()=(%9=##)M&&YU!$9Q$#)U##J!!%)Y$$*%#$J9!"
+ "#YY\"#J1$$J-%#Z-\"%*1##J%!%J5)%*9&%JE!#J9!%*E\"#ZQ!$*Q\"#ZU!$:Y*%+)\""
+ "$JQ!#[!!#[-!$[1!%+1&#[I!(+5'&+5\"&+=**;=(%[I!$KE#&KU+)+M&)[I!$;Y&"
+ "&+Y!$+]!%;]!%,!!%,-!&,1%$,A!',1)%<5!%<A!&,=$#LE\"%LE\"',I)$L=\"&<M!"
+ "&LM&',Y#&,]#%]-\"']!!$M%!'-!'&M-!%M5!'M5)'-%-%M=!&-=\"\"M1\"$ME!(]I."
+ "%]I!%]M!\".!!(]M$(M]')MI(%]Y!&N)#(>!!&N5#%^-!%^)!#N=!$^E!&.A!&.I&"
+ "(NE&'^A('NM''^Y('^U(&.Q!(NA,'N]!&?-!'O!!&?1!&?-!&?1!&N]\"&_%#)/=!"
+ "&?5!!O9#$_%!&?9!%/9!)/5!&?=!%/Q!*OA!*/E%*/E+*OM!,_E+#OE!&OI!%O=#"
+ "&OM!'_Q!&OM!'_M'(_E+(/Q!&_=\"'OM%\"?E!'/M#&?E!'_I!)/9!)/E!'_I!'_I&"
+ "&_I\")/=,(?9)&_9\"\"OE!'_5'&O)!(/=(&?-!'_!!)O%#$_%!$_!&&N]\"&>]!&.U!"
+ "'NY!&.Q!&.M!$>Q$&.M!(NM!%^1!%^-!%^%!&N9#&>-\"'N1('^-#%^5&).-$%^!!"
+ "'-U!&]]%$MY!'=Y((=Y!%]U!!-I!%]I!!-E!'=U\"&]=!!]A$']5!%M5!'-%#\"--!"
+ "(])&&-%$%M!!&\\]&&-!($<Y!&LU!&<M!&,U#&<5%#<E!&,A(%\\=('<=!&<9!'<5!"
+ "#,5!$,)!(L1\"%<%\"%L%#%<%\"$[I!%+Q!%+U!$KQ#$;M#%[I!&KQ#%;1\"*K9%&+I&"
+ "#[9!![9!$[=,%K)$&;-'&:]+$[!!\"+!\"%*A&%*Q\"%JQ!\"*E\"#JE!%*E'$JE$#ZA%"
+ "$ZE%#J5%$:1!#Z-\"#J%!$:)!%*)'$:9$%:!$%I]\"#Z1\"#9M!%9M%$9M%%)I!&YE/"
+ "#I-%#Y)#&)A(#)-##)9#\"I=$\"99##)E#%IM&&)U($)=$$9U($IY\"#IY!#Z5!'Z!("
+ "#I]!#J-!!Z)!$:1!$:=#':1&#Z=\"$*A\"#JE!!ZI$&:Q,#ZM!$*I&#ZQ!$*]\"#Z]!"
+ "&K-)&+%\"%+)&\"ZU!#[E!$;)&$[9!%;1#&;=&%+U!%;I\"&KU#$KQ#'+Q!&[U($+U%"
+ "&,!!$,-!%,!!&\\)'&L)\"$<-!%<5!%L5\"%<=!%<A!%<=!%<E!&\\M+%\\M#%LU!$LU!"
+ "&LQ&%<U!)M-$%M!!']1&&=5$%M)!#]-'$=5!*=9+%M9!%]=!)-Y*%ME!&]I!%ME!"
+ "$]I\"*>!%$MQ!&MY$%]U!$MU!&-Q'-N%.&M]$'.-!$N1!&>5\")^9'&.9!)>5%&.M!"
+ "&.E!(.M)&.M!&.Q!&.U!&.U!$^M!(NI!'N]'(?!)&?%!&?%!'?)%&?-!'/-$+O1'"
+ "(?5#&?5!&?A!'O5!&?=!'/E#+OI%+_E!&_E(%/I!&OM!&OQ!&OI!&O]!)?M!&OQ!"
+ "&OI!%/E!&OU!!/Q!*OM''_U!&OU!&OQ!&OM!)OM\")OM((_I+&OI!'_E!'_A!\"?5!"
+ "*?E&&?9!&OM!&?=!'?9%!/5!&?%!&?)!&?-!&?E!#O)!'?-%'_-'&.]!(/)(&.Y!"
+ "'^U(&.Q!&.Q!'>M!(NE!&.I!&>-\"+NQ-\">I!(^='(.=$$^A!+>E!(>-&#>)!)>%+"
+ "#^!\"&-]!&>!\"'MQ#%]Q!&]M!%]M!%ME!)=I!$=9!%ME!&-9#$M=!&M)!%<])&M-!"
+ "%M)!&]5!',Q#%=%$%\\]\"%\\]\"(-!-'LI+&<M!'\\M&&<M%%<E!%\\5#'\\M+$L1'&<5!"
+ "&\\1#%L)\"'<)!'KU#$,%!%,!!%+]!%+U%&;U+$[I$';M\"%+I%([A%$[A!&;='#[5!"
+ "%;9&%;E&#[)!$+5\"#[-!$K!$\"[!!#*]!$:Y'&JY!$JQ$$JY!$JA!#JA!#ZE%%:A("
+ "':=%$J=!#J5!#J%!\"Z5!!*%$$J)%$:!$#J!!$I]%#Z)\"')U%$9Q!$IA##IU\"#YE#"
+ "\"9)#\"Y1\"!)%$#I-%#Y9#%Y9+%IA'!IA#!YI!#9Q!#IQ\"%:)+$YU'%I])$*%#$I]\""
+ "#J)!$*%#$:-$#Z5\"\":5&#Z5\"&*1$%ZA\"%JI%$:I$#ZU!$*Q\"$*U\"'*]#$;!##Z]!"
+ "$[!&\";%\"%+)\"![-!#[=!$[1!$[A(#[1!#[A!)KQ#%+=\"%;I\"%[I(\"[E!$KU#'+]%"
+ "&<!!%+Q!)\\%(#+Y!&\\9#(L1&%L9\"&<1!%\\9#'<=!%LA\"$,A!#LE\"&<]$%<Y!%<U)"
+ "',U(&,U($=!!&]!\"%M-%#=%!%]1!'M1)&-9\"&=5$$=5!%M9!%MA!&MI$(=I1%]I!"
+ "$MM!)=Y!%ME!#=Y!%]M!'.)%(>%!%^)!$^9!$N-!'^9#&.9!$^9!&.=!$^A!&.E!"
+ "&.M!&.U!$^M!&^Q#&.M!&?1&&.M!&N]\"&?!!&?!!&?)'&?)!'O%!'O-&&?%!,O9%"
+ "'O)!#O9!(_=%'OA&#OA!'_=!&OM!&?E!%/E!&OI!&OM!'?]$'_M!%_U#&_U\"&OI!"
+ "#_M!-/Y,&OM!&OY!'/U)&_U\"(OM$%_M#(?Q)&/U$'_Q!&OY!&OI!#_Q!%/=!*_A\""
+ "'_E!(/A\"$/Q\"&?=!&OE!&?9!&?9!'?-%%/1!&?5!,?A\"'O)&'O%!$_)!._!1&.Y!"
+ "#.U)&.Q!$^Q!&.Q!%^M%&.Q!&.A!&^=$&NM\"(N=!%^1!(>5&'.-*$]U''.-!&=]#"
+ "$N-!%]U!'-Y!%]Y!'-U!%^!!&-U\"%]M!%]I!']E$%]A!&M=$&M9%(]%*$M5!%M-!"
+ "(M1)%]-!&=-$&\\]!%<Q!%,Y$%LY!%LU!)<A2%\\Q\"\"<E\"&\\I\"&LA\"#<9\")L9!'L5\""
+ "&L1\"'<-%%,-!'<)!%<%!&<-!%K]##+M!&+]!$+M!%[M$';E\"%+=!\"+E!%+E!\"[=!"
+ "$[9$%[-!$+9\"$+9\"%+%&%;=&#+!!$K%$#JY(%ZY\"(Z]/%*Y\"&*M$\"ZI!$ZE\"$*A\""
+ "#Z5)(J5$#Z%\"\"J1$#J-!#J%!#J)!#J)!$J%&\"Z!$%)Y!#9U!#YM\"#YQ#\"YM\"$)E#"
+ "$I!&#9)$#Y=&\"Y5\"\"IM!$YI&#I5%%Y=$$9I$$IM)#9U'#9U!$YY'\":-##Y]\"$)]#"
+ "#J%!!Y]!\"J-!%:-!$Z5&#*9\"$JI!#JI$%:E+$ZQ\"#JA!%*I#$*U\"$*U\"$:Y'$;!#"
+ "$[!!#Z]!&:Y'%+5&%;1'$+1!$[I!%[=%&+A\"$[E!(+Y-#[=!#+M!%;I\"(KU#&+Y%"
+ "$+Q!(;U\"!\\)$#+]!$<-\"&\\1($,5!%L5''<)%',E(%\\A#&,E$&\\]\"%LM\"(LI/(<=."
+ "%\\U\"'LQ/%<U!$=!!&\\Y\"(])&%]-\"%=1$%M5!%M9!&]=+&]A!,M=,%M=!*MI,)MM\""
+ "'-U!%]U!'-Q'%]]!%^%!'=Y''>5!&N)$%^-!%^1!&>1\"&.9!'>9&'>A!&^Q#'>I!"
+ "%.I!&.M!&.E!+>U!&.E!&.U!(_!&&.U!'_!\"\"N]!$^]!#O%!'O1!&?1!'O1!)/5!"
+ "&?5!'_E!'_=!)?M!'_E!'_A!)_I*'_Q!&OI!%/E!'/9#+_Q&&?E!\"OM!&OU!)_Q#"
+ "!/]!&P-!&OY!&P)!(/]!)?I!'_Y!)/M,(/]!&OU!&OU!(_Q$&OY!(_U+'_M!(?=)"
+ "%/=!-/M&)/=!&OA!%?=!'O=&&OI!'O1!'O%!'/5$(O9*&?1!(/-)&?!!&?%!&.Q!"
+ "&.Q!'^Y'(NE!$^Q!&.M!%.Q!+^M)&NI#'NA'&.=!'>9!&^9$&^5%(>A+%^-!%^)!"
+ "$^%!%^!!%]]!&]U*&N)#&-U'%=I$'-U!%M9!*=A&#=A!&]A&(=9,'M5)&M5%'M5)"
+ "%]%\"%]!\")-1&'-%\"$<U!$\\]#%LY!%\\I#'<Q)$LQ\")<U2%LE!&L=!%LE\"-<5/&\\1#"
+ "$LA&&,-%)L-!%\\)$$,%!(K]'&;U&#<%\"%[U$(+Q&$;I\"&KM'%;I\"%+A%%;A\"#[9!"
+ "%+5\"%[5!&+1&\"[-!#;%#$+)!';)(#[!!%+)&&:E!#ZU!$JQ!!ZQ!\":M\"$:I$#JI!"
+ "$Z=\"#:=#$Z9\"$:1!%*!!#Z-\"%:1!$*%&&Z!(%Z%##IM\"#9M!\"9U)#YM\"$II%#I9\""
+ "$IA#$Y5*\"IE$!Y=!\"IA!%9-)#)A#\"II!#9I!$9M!#)E#$9Y!#IQ!%)Y($:)$$Z%*"
+ "%J))%:)(#Z5\"&J5-#Z9\"&*A(#J5!$JA%#J5!\"*M\"$JA!':Q!!ZM!%JY)$[-!%;!#"
+ "%;%'#[)$'K)-#[%!$+-!%K1$$[A!![=!&+A\"$[I!'KA(%+I%$+Y!#+U!%+U!$;M#"
+ "&+]%&K]#'<9%$<)!&\\-(%<9!$,5!%<5!&<=!$<E!$,A!&LE!'<I%#LQ\"%<Q!&-%$"
+ "&LY&(])**-%!%M!!&--#%])\"#=-!(M1.%]5\"&]E&$M=!&]A&%]Y!'MQ#$ME!&]M!"
+ "%]U!&-Y!!]Y$&N-#%]Y!#>!!'>9!'>5!'^-#'N1\"'>5+&NE#$^I!&.A!'>A&'^E#"
+ "&.I!#^E!%>M\"*NY\"(NA,&.U!'O!!$^]!&?%!&?%!'O)!&?9!&?1&'_A''O5!)?9!"
+ ")/=!'?=$)/A!*OM!&?5!#/I#(OI$)/E!)?M!&OI!$/U(&_U!&OU!'_Y!%_Y#'_U!"
+ "&OI!+?]*&P!!%/]!%0!!(/]!&O]!&_Y!'/]\"(OY*(/Q')?U!$/U\"#_M!\"_I\")OQ\""
+ "'_U!(?E)%/I!'_E!&OM!&?=!+OA7$_Q%*O=!'?-+(?1#&?1!$/1\"&?=!&?%!'O)!"
+ "(^M-&?!!#NU!&.U!&.]!(>I+'>U!(NI!&>I!&>E\"%^)!&.!!&.I!%^-!%^!!'.)!"
+ "(>!!'.%!$N1!%]Y!)-]*%]Y!']Q$%]Q!&]M!%]U!%ME!'-=\"%M=!&-5#%-5#&=12"
+ "(M)$%M)!$M-!(]%!%-!$&-%$%L]!'LQ!%<M!&\\Y!',I#',=(%<A!%<A!',9)$<Q&"
+ "$<5&%,1!&L-#\",)!&,)!&;U'%;M&%+U!';U\"&+Y%%+Q!#[E!%[E!%[E$&+A&&KE$"
+ "#K9$%+1&#+1\"#ZQ!#[5!\";%&$+%\"#[!!$K)$$JY$$*U\"#ZQ!#ZM!\"ZQ!#ZE\"\"ZE!"
+ "%:9(%:9!%:1!$*5\"#J1$#J1!#Z)\"%J%*\":!-!Y]!#J!!$YQ'#9Q!#IM$%YI$$9I!"
+ "\"I)!$Y-$#I5\"%)5(#)9#$9A$#Y5&#IM!#YE\"#YI#&IQ'$:%$$)Y#%*%'$Z!&$:%$"
+ "\"J%!#Z-\"\"*9!#Z1\"$:9#%:9!$Z=\"\"Z9!$JE!$ZM%#:M#%JQ!#Z]!\"JY$$J]!$;-\""
+ "#[!!\"[)!'+-\"#[)!%+1*%+9\"$[9!%+=\"%+I!&KE#&;I&!;I&$KM##+]!$[I!%[]$"
+ "%+Y!'+]%%<%\"%<!\"(,1$'L1\"'L5&',=#&<=%)<A-%LI!&LA\"&,A$&<M%),Q'']!!"
+ "%LY!#,]!#=-!&M!!&LY!)=9'#M1\"#M5\"&=-)&]9!$=5!&MA$&=E#%]I!#=I!#=Q!"
+ "%]Q!#-Y%$MY!%]Y!&.5!%^)!'.)*%^%!'>1&'^1)(N5!'>A!&>A\"%.I\"&.I!&.]!"
+ "(NI!%>I()NQ*(>I%$^Y!(_!,&/!&&.]!)/-(&?)!$_%!'/1$'^]!%/5!'O1!'O9&"
+ ")_A/)/A!-?1)+/E#&OI!&OM!$/Y!'OU%&_Q\"&P!!\"?U!#_]!'?Y$&OU!(/]!#_]!"
+ ")/],(_Y$'@!#%`1\"&P)!%0!!&P%!&O]!&OU!'/]/'/Y#&OU!&OY!&OU!'P!%(/]'"
+ "#_M!%/]!'_E!(/I!'_=!&?=!%/A!&?A!'O1!&?5!&?1!&?A!%/-!&?)!&?%!'>Q&"
+ "%NM$+N]'(NM!'>A!'>Q!'>M!&.E!&>Q!'>E&+^=+&.=!%N1$%N9$(>-!&N-#$^9!"
+ "&^)%'>!\"%^!!%]U!$MY!%]U!$MY!%]Q!%]Q!%]I!%ME!%]I!#]E#%M1*%M5!']-*"
+ "'-9'']-!'])+%M1!'=))'<Q)&,Y#$LU\"%<Q!%<Q!(<I$%LI!#,E!'L9!%<=!(L5&"
+ "%\\9(',1$&,=$%,)!&,1%&,!!&,%%#,!!&+Y!%<!\"&KQ(#+M!%[I!$[E!%;E\"&[Q$"
+ "$[9!%[5!%;5\"![1$$[-$$[!%%:Y$#K!$&:Y$$;!\"#ZI\"$JM%#JM!$:I'$ZE&$:E#"
+ "#ZA!$*5\"%*E'\"Z5!#J1%$*-#$J)%%Z%'#*!&$)]#&)Y$#IQ\"$IQ%$9M!&9M&!YI!"
+ "#Y-&\"Y1\"\"Y1%\"Y9\"%9A#$9A!%Y1(#YM#%9I%$)Q#!)U!$IQ)#YU\"#IY!$Z!'\"J!!"
+ "#J%!#J)!$J-%\"Z5!#J1!#J=!%:A!%JE%#:M#%ZI*$ZY\"#*Q\"%ZU\"%:Y'#JM!%+!\""
+ "%+1&%[)!$;=\"\"[1!#[9!&KE$&+9&';=#$KA'%+E!!+M!&;Q'$+M!$;U\"&+Y!\";U\""
+ "'L),!<%&%;]\"&,)!\",)!%L5\"%L1#$,5!!LE#%<5!%<E!&\\I'#LM#%<M!&<I!&LU!"
+ "&<Y%%\\U#%]%\"&]%'$LY\"(=-#&-1#&-9\"'-1\"%M9!&]=+%MA!%]A!$MI!&]A!%MA!"
+ "#>%!%]U!#MM!%]]!&-U!%^%!)N)1(>)!'.%!&.=!&.9!&.=!'>E!&>A!&.Q!$^I!"
+ "&NA##NY!,.]$&.M!&.U!&.U!&?)!$_%!'O)!&_1\"&?1!'O1!(/9(%?9\")/=!&?=!"
+ "&OI!'_E!*_E\"%/M!'OI%(_Q$'OM%&_U\")/U,&OU!&OY!&_]!&O]!&OY!)P-!(@!\""
+ ",@%!&OQ!(0!!'`!,-`1!(?]\"'_U!'0-\")@!!(O]))OU.&`%'&_Y!'@!$&_U!&/Q%"
+ "'_Q!&_M\"#_E!%/M!,/E!'_9!&?1!\"?1!%/9!&?9!&_5#)/1!&O)!&?-!$_)!&?%!"
+ "&O!\"&.Y!*?%!&.Q!&^U$\">Y!$^M!'^Q\"&>M!$^=!&>A!&.9!(NI!$^5!*.-.&.)'"
+ "%]Y!&^-%%^!!$M]!\".%!%]A!%]U!$MQ!%]M!&]I%%M5!%]I!'==#&-A\"%-=$(-A!"
+ "'-1'#M-\"$=%!$]%#&,]#%<]!%LQ!%\\Q\"&<Q$',U#%,=%$,=!),E($<I!%<=!$L=\""
+ "'<5.&<=%$,%!%<5!&,%!&<%&&+Y%%K]##+Y!'+Y!$;Q\"#[E!$KA$$[E!%;E\"&+M!"
+ "%;1\"#;-\"%+9\"\";-\"\"[!!$;-\"\"[!!'+%'$J]!\"ZQ!$:Q'$ZM\"$JA$!ZE!#J=!$ZM%"
+ "!*A$\"JA##J5!%*A'%9]($Z)&$J)\"#9Q!#Z!&$I]&#*!##9U!#*)&$)M#%9M%$II)"
+ "#9-$%I=-\"I5!\"Y%#\"9E##)=#$IE#$)Y#$9]!%)Q($Y]##YY\"#I]!#I]!#J!!$J-("
+ "%Z)*$:-!$Z1&#J9!#J5!%:9%$JA$#ZQ!%JU!$:A(%*E\"'*Q$$*U\"$;!\"\"ZY!$*]\""
+ "%;%'![-!#[-!!;1\"%;5\"';=#$[5)%[A!%+5\"$+Q!\";5\"$+M!#[A!%KY#%[]$%;U\""
+ "%,!%%<5!&\\%$&<-!%,1!%<9!'<-*(\\A0%L1#%<A!&\\E'&,I#%,Q$&-!#'<I%%L]!"
+ "%M-!\"LU#%]%\"$M!\"%M)!&L]&&]1!%M5!'=1(#]I\"(M=)#MY!$ME!%ME!'-M!%]U!"
+ "'-I'$MY!%-]#(>)!%]Y!'N-(#>)!'>5!$N1!'^-#'N9'&.9!%^1!&.E!#NU!&.M!"
+ "&NI#%>Q\"#NY!*.U!(^]1!/%!(?!$&?5!&_1\"&?1!&_1\"'_5'&?=!&?-!+_=!(?9)"
+ "'O-!'_A!*/M$%OE#(OM$(?M\"'_Y!)?Y!(@!\"&OU!-0-#%O]\")@-&(0)!*`)!,@-'"
+ ")`%)&P%!(0!!'_U!(@%!)P-!(/]!(0%!(OQ#,@!!)@!!&O]!&P1!&O]!%/Y!&OU'"
+ "%/]!&/Q%&OM!)?M'&OI!,?E/'_E!\"?Q!'_=!&?A!&O1!*O=-%?1\"%?!($_)!(/1)"
+ "&O!\"&.]!&.]!$^Y!&NU\",NQ!&.]!'N]!'>M!&.E!\">A!&.5!%^-!%^)!&.-!%^)!"
+ "%>1#$N)!&.%!&.)!'-Y!%]U!)=Y&%^!!&]A!$MI!']9%'-U!$MA!%M=%%M9!&M5%"
+ "'-9,&-A\"%]-!#=%!&,M#%M!!%<]!&,Y#',Y##LI\"%<I!'LI!%<9!%\\A#&\\=('<9%"
+ "#\\-(%L1#%<1!%,!!%,!!(L-\"%+U!$+]!$[Y($KY##[E!#+Y!%+M!&;M\"';I+%;M#"
+ "%;5#&[=)![A!#[1!#[-!$[)%#[%!&:]+$*]\"$ZY%#[%!$*Q\"$JM$#ZY!!ZA!#J9!"
+ "#ZA\"#Z5\"#Z9!$9]!$:=##J-!#J)!#Z!\"%)Y$$)]##IU$#YY\"$)U#$9I%#99!$)M$"
+ "$))$#I1%\"Y5\"!I1##)%$!YM!#II!$)Y##Z!\"!)I!$YY'#:)##I]!\"J!!$J)%#Z%\""
+ "\"IU!!Z)!$J1\"$Z5&%ZE\"$Z)&$:='$*Q&$:9$#JM!&ZQ&$:U#%*M&#;!&$;%\"$[%!"
+ "$K!$$+-\"#[5!$K)'$+5\"$[A!'+A*%+E!%KE$&+I!%[I$$[E!$;Q\"';Y+%;]\"'L)\""
+ "$K]'%+]!&+Y!%,-!'L-\"'\\5(%,1!$L9\"&LI&%<A!%<M!$\\E##,M!%<E!&,Y#'LU!"
+ "%]1\"%\\]&%<Q!&LM&'-)#\"-1!']-&(M)$%M9!&-=\"%]Q!%ME*&=I(&]M!'-Q&%]I!"
+ "%]I!%ME!&]]%%.!\")]]\"(>-!%^)!(>1+*^1%&>5\").93#NA!'^A(&.Y!$^I!)^E!"
+ "'NQ'%NY$*.Q!$^Y!&.]!(NQ&%?%\",O),'/-$&?!!&_5\"'_E!(?%*)/5!'_5'&?=!"
+ "&?E!(/9(&OI!)/Q&&OM!&_Y!(/Q-)_Y.)?]!&P!!(0!!,?Y4(09!'_I!(@!\"(09!"
+ "(0-!(0)!+0-!(@)!-`)!)@!!(0)!(P9\"(0-!)0%%)P)!(@!\"%0!!&OY!&O]!&OY!"
+ "(_Q+-OY!&OI!$?M#$OE$(/E!*OI!'?=%'_I&%OM\"&O9!#OA!&?1!(/=((/%#'_)!"
+ "$^Y!&.Q!&?%!$^U!'>U!&.Q!&NQ\"'>M!&.9!&^Q$$^A!&>=\"%.9\"&.5!&>5\"%^1!"
+ ",.%-&N1##>!!\".!!&-]'&-]!&]U%'-]!&-M\"&=I#'=I('=E\"&]A!%M=!&M9$%M-!"
+ "&]1!&]1+%M%!%M%!*-%&%M)!)-!,%<Y!%]-\"%,Q$%<M!\"<9\"\"<M\"%<=!&LA\"#\\9$"
+ "&<=!&,5$%,1!&L1\"&,)%%\\-#(L!\"%<%!#[Y$%+U!$[Q$&+M!(;I&&+I&%[E!$[A!"
+ "%[=!&+E%$+5!$+1\"#[-!#+)\"$[%%%;!'%:]#%JU)\"ZI!#[!!'*I$%JM!$*I\"&*Q*"
+ "#ZA!$JU!$*=\"#J5!#JE!#Z-)$*!#$YY#$*!##Z1&!*!!$9]$#I]!$YE'$9M$\"YE\""
+ "$)-'!I1##)E#\"I9!#I-\"#9A!\")E\"&)E,$9I$#YM##J%!\"J)!%Y]#%YQ*#J)!%*-'"
+ "$Z5&#J-!$J1%#J1!#J=!%*1#&:E$$JM!#J9!$JM!$*Q\"\"ZU!&JY!%J]%$J]!'J]%"
+ "#[)!#[%,#[1!#+-\"%;9#%[=$$[5!(;A0&KE#%+M!%+M!%+M!$;Q\"%+U!%;Y\"%;]\""
+ "%<)!'L!#&<)%'<-!%,-!&,E$$<%\"%<M!'L1'%<A!(,U($,A!&<M!&LY&'LU!$=%!"
+ "#M!\"'--#']!!%]%\"%M5!%]-\"&M-!&-9\"%]5\"$M=!%]I!%]M!%]E!%]Q!(=Q!&-U\""
+ "&-]\"%]Y!%]]!(>)!%^%!'N5(%^-!%^-!(>)!&.=!&^9%'^=#&.5!&NM\"&.=!&.U!"
+ "&.I!+>U!&^Q#&.]!#^]!&_)(&?)!$O1$'O)!&?1!'/=#'O5!(/5((?=#*OA!'_I!"
+ "(?I#%?I!)?I!'_Q!%/]!'_Q!%@%!(?M\"'P%$(/]!(0)!$0)!(0)!\"@!!)@!!(09!"
+ "(0-!/?Y)(@A!(0-!(0%!+@-),@-!)01%)@!!)P)!+@-/#`%!*?Y,'_Y!'?U$(_]+"
+ "&O]!)O].)?Y'\"?Q!&OI!&OI!'_Q!)?Q!&?A!&?=!&?-!&?-!%_5$&?1!&O-\"'_)!"
+ "&?5&&?!!&.]!&.I!\">]!$^Q!&.Q!&.M!'.=%'>U&&.=!$^=!\"N=\"&.9!%^-!&>5\""
+ "&.5!%>-$%^!!$N%!&]]%%]Q!$MY!(=U!!-Q!&]M!%ME!)-=!&]A!&]A&&-E\"$=A$"
+ "%M1!%M-!%]5\"$<]!$=%!%\\]\"%\\Q\"%LY!&\\]&'LI*%<M!%<E!%<5!'\\9#&LA\"%L=\""
+ "%<=!%,1!&L)#$,-!%,%!%;]\"&<!\"&+]!%+U!$[I!$[Q$&K-$&;Q&#[9!$[E!%+A!"
+ "#;=\"![=!#[=!&+5*#[)!!;-\"$K%$$*]\"#[1!!*]%\"*]\"#ZU!$*Q\"!ZI!$JQ!%:E("
+ "%*E'!Z1!$J=!$J5%#Z=\"#J-$#Z%\"!:!\"#IQ%$:)!$)Y#%IY&#9U!#IQ(#)I\"#9M!"
+ "$9A(#9)!#99!#I9%!Y1!$IA##IE!$)I#$)U##)M#$YU#')U&$)]#%I]*\"IY!%Z)'"
+ "#J-$%:1!!*9!$*1\"#J=!%:=!\"ZE!$:5$):I+&JI-\"ZQ$$+!\"\"ZY!\"ZY!#[%!#[!!"
+ "$[%!$+-\"';)'$+)\"$+1!%KI#\";9\"%;A\"#[A!\"[I!$+M!\";=*#;U\"%+U!%,!!&[M$"
+ "%<!\"&,%%#\\-#(,1($,-!&,5%%LA\"\",5!%<A!%LA\"%,-!&<E%&<I!#,Q!%<Y!),Q'"
+ "&<Y$&\\]\"%]%\"$=)!'-%\"'=-()M9(&M5$&M9$)-A!%M9!$N!!'-9'&]M!$MQ!%]]!"
+ "%]Q!%]Y!%^!!%>!$%^%!%^-!$N%!'.)!%^-!&.9!$^I!'NE!(>E%'>A&)^I!&.I!"
+ "&.U!&>I!'^Y'*.Y!&?!!'O!!$_)!&O)!(O5%'/-)*?5,&?9!'_=!*OI!!/A!)/A'"
+ "(?E#&OI!&OQ!(_9%!/U!%OY('`!&&P!!(0!!(`!$(0!!(@!!(05!(0-!-0)1&01$"
+ "#`1!\"@1!'01\"(01!(01!(/]!(P)\"*`%!&`-!*0-**P-,'0)\"(_U%(@%!+/]!)@!!"
+ "&O]!*/U+(/Y'%/U!&OQ!'_]&&?=!'_M!%/I!#_I!&_A\"&?9!&?5!&?1!&?1!#O-!"
+ "+_)(\"?%&$_!!'N]!&^U#'NU'&>I!&>M!#NI!&.E!$^E!&.A!'.A&)^9!)N1!#N9!"
+ "%^)!'.-!%^%!&.%!$N!!$M]!$]M\"%]U!'MI)(-E&%M5!%]M!&MA$&-=\"$=9!%]5\""
+ ")MA(']1/%M1!%M5!#M%\"&,]#%-!$&L]&$\\Q#$LA\"'<I$$<I!%<9!'LE!%\\A#%\\=#"
+ "$\\I#%,1!&<1%'<)!&,)!%,%!&,!!%+Y!%;Y\"&[U(#+I%$+Q!%+]%$+M!&;E'$[I!"
+ "$+=%(;%)$+5\"\"[5!&K-)$;)#&+%&$;!+$*]\"(J].'JY!#*M\"%JA%\"ZM!#ZI\"\"ZI!"
+ "#JI!$*Q\"$Z=&%J5&%*1#$*5#$Z-&'*))\"Z!!%*!($Y]&$IQ&#J!$%)Q$$)M#!YI!"
+ "!)1$#)9#\"Y9\"\"I9!#99!%YA%#Y5##YI\"#9U!$9Q(!)U!$9Q($)]#\"Y]\"&*%$#J!!"
+ "$*5##Z-\"%J5\"#J5!#Z1\"$:I$!Z=!%:I$#JA!$*M\"\"ZQ!!JE&#[-!#;%##+!!#[!!"
+ "$+%\"!;)\"%K)$%[1)([5!$[9$$[=!\"[-!%+=!%+Q!$KM##+M!$+Y!&[M%'+]!&<%%"
+ "%,!!%<!\"'<)&%L-\"%+])$L5\"%\\=##,A!&<E!$LE\"&<E!'LE!(LI+'LU!$\\M#%<]!"
+ "(,]#%M!!&<Y)(])!$=5!(-)'&-E\"'M-%&-=\"&M5$'M9$%]=!%=A$%]M!%]Q!(-Q!"
+ "'-Y!%]Y!%]]!&>)\"(^)(%^%%'^-#$^5!%^-!(>1!&.=!)^9''>A!&.I!&.M!%.Q!"
+ "*^U5'.Y$(^Y!#NY!%/%!)?!#(?-#&?-!%/1!&_1##/5$&?9!&?=!)/A!&?9!&OQ!"
+ "&?E!&OM!&?9!'/Y\"&OM!&OQ!+0!!*0)0#?]$&P%!'@1#&P-!(09!&`9!(01!)`-("
+ "&P1!)@A%'`-%#`5!%`5#&`5!%@%!)@A%+01!(0-!)P-!,@9&+0!!%@1!%@%!(0!!"
+ "%?]!(0!!*OY&&_U!&P!!&?A!)_I*&?E!'_=!)OA.(_5&&?5!&?%!&O1('_A!&N]\""
+ "*/!2\"?=!*>]''O%!&.Y!(/%('^Y\"#NQ!$N=%-.E0#NA!&>=\"(.%*&.A!&.9!'>5!"
+ "&^!%&N)#%^)!&.5!%]Y!$]Y!&]Y*&-U!(-Q%%]M!%]Q!&=A($MA!(]A/%]='(-9'"
+ "'-5'$]1\"%M-!%M1!(M%$&-%#&M!%'LY!&,U#%LQ!$<M!'\\Q\"%\\I#)<E$',=('\\=\""
+ "%\\5#$L5#$,-!%,-!%<1!%,%!%<%\"%;]\"'L%#%,!!%+U!!;Q\"$[M$%KI'$;I\"$[A!"
+ "$[A!$[)!%K-(#;-&\"+1!$;)#\"ZM(%JY)$[!%%K!!$JY!$*U\"$*U\"%ZQ\"%JU!!:A\""
+ "$ZA\"%J9!&*9+#Z5\"%*1##J-!%:9$%*)'#J%!#J!'%:-(&:!)$YM##IY$$)M#\"YQ\""
+ "\"Y=\"\"9%$!)9!#Y9&#Y=#$IA#\"YE\"$9M!\")E%$YM#\"I]!'YU)$:%!#J%!#Z%%\"9]\""
+ "%*%+$J9!#:1##J5%#J=!#J=!#ZA\"$*E\"#JA!#JI!%+)&$JI!%J]!%K!!$;!#$[!!"
+ "%[%%%K1(!+1!$[-!#[5!%;5\"$[A!'[A!$;M\"$;A\"#[M)(;Q+%+U!#;Y\"(+Y!'KU#"
+ "%;]\"%+]!%;U\"%+]!%,1!%<5!&L9!&\\E##,9!%<Q!%LI\"',M)'<U$%<Q!%<U!%\\Y\""
+ "%L]!']!&&,]#'-)'\"M5#,=%1(=5#)M1.#==!&]I!%MA!(=E!'-I'%-Y(%]Q!%]U!"
+ "'=Y''-]!&.!'&-Y\"%^)!%^-!!^-$'>5&&N5#&.9&!.=!(NA&)>A$&.E!&.Q!(NM!"
+ "'>Q!'.U%'^]\"&.U!'O!!(_%&&O-!'_-!&?9!#_9!\"?=!#_-!*_9))?I!)?E')?M'"
+ "&?E!'/U#&P!!-?E'(/]!\"_]((/]!+@)/)0%%(@)!(09!)@1&+`11&01$)P1!'P5$"
+ "+P90(05!&`9!'@A)(09!&`5!&`9!%P5!'05\"#`5!,P5!)01%&P-!(0%!)P)!(0%!"
+ "(0!!(0-&&OU!&OU!&OU!'_I!&_I\"\"?Q!%/U!'_A!#OA!&O=!&O9!%/5!'/1$)_)*"
+ ")/5!'^]\"#O!!'N]!'.]%'?%&*>E)&.Y!&.I!&NI\"&.=!\"^A#(N=!&.A!&.5!&^9$"
+ "&.5!&N1#(>)+).-)%^!!%^!!(-M+'=I(#]U#%]M!%=A$)-9+)=M!&-A\"(MI-!==\""
+ ")\\]%#=1!%M)!%LY!\"=!\"%,Y,',U#$L]\"%<U!'LU*&<Q%&<M!&,M$$<E!$<M!$L=#"
+ "',I#'\\5,'\\1#%L1\"%<5!&L%'%,%!%,!!'+M%#;M\"\"KU#$;Q\"'+U!(KI#%;A\"%[9!"
+ "$[=!%;9\"%;9&&[!.!+-!$K-$$[)!$;%##[1!#Z]!#JI!%ZU*\"J]##ZQ!#JI!#ZQ!"
+ "&ZI##:A#%*1'$JA$%*=##Z=!#J-!#Z-\"#J%!&:%)$J!%$9U!#9U!\"YQ!\"YI%\"9M#"
+ "#)1##91!#)=#!)9!$)=$\"IA!#YE#$9I%#9E!$)Q##IU!#IY!#J!!$9]$%J%\"$9]$"
+ "#J-!#J1!%Z1##ZE\"#J=!#Z5\"#*E\"&:E!!ZI!$ZY!\":Q\"%*U'\"ZY!#*]\"$[!&#[1!"
+ "$;)\"#[-!![9!%+)\"#K9#%[A$$[=!$[I!&+A&(;I&\"+M!#;M\"$+Q!%,!%%+]%%L)#"
+ "%,%!'\\%#%<%\"%,)!#L-##L5#%\\9#$,9!&LA\"%LM\"#,I!$\\M,#\\M((<Q.$<Q!%\\]\""
+ "%M!!(,],$M!\"&])&'])&\"==!%M-!+=-'(=A\"'=M\"$]9\"&-I\"*==&%]M!']Q)(-M!"
+ "$]Q\"'MU)'.!%%^!!%^!!$N-!%^1!&.5!&.9!(NE,,.I%(.A)'NE'&NE#(.M#&.I!"
+ ").U-&.Y!(_!!'>]&'O!'$^]!$_)!&?-!&?5!(/A('?E$&?=!'_=!(?I#&/E%&OI'"
+ "&OM!+/Y)\"OU''OY%)/Y&&O]!(0%!'P)$(0!!.@A/&P%!*0-#&P-!$`A$&`9!'01\""
+ "%@9!&`9!\"P-'&`5!(05!&`5!!0=!(`9#&`9!&`9!&`5!)`5((0-!&P!!(0)!'_U!"
+ ",/]!&O]!&_]!)?]'%/U!&OQ!'?I$&OI!'_E!'_E!%/9!&?=!&?9!(_)!&?-!&?%!"
+ "$^]!'/%$%/5!(^]!#NU!(NY&&.]!'O!!\">Q!&.]!&.A!&NA#&N=#&>=')^9!&.5!"
+ "(.5*%>-(&>-\"&.!!\"-]!(>!,$MY!&MU$%]U!&=M#&-Q\"'MA$$MI!'M=$&-E\"&-9\""
+ "%M-!*=1,$]1\"%=)%%]%''=%$$<]!(<U$%<Y!&<Y%',Q(%<Y!&L5&%\\E#%<9!&<1!"
+ "%<9!'\\-(&<5!%,1!%L)\"%[Y$\"<%\"',!%%;Y\"%L)#\"+U!$;Q\"#+Y!(KE(%;I\"$[=!"
+ "(+9.%;M\"&;)'#[5!#[-%#+-!%[)!#Z]!&[1!%+%\"\"ZM!%JY!&*Q'%:M'%*A&%:I("
+ "#ZE\"$*5\"$Z9\"#Z5\"\"J5#\"J1!#J)!\"J)!%:%(%)Y($9M$$)]#$IM%!YQ$#9Q!#YE#"
+ "#)5&\"Y)\"!Y5!$99%$9A%#YI##9A!')U\"#IY!#YQ#%)M$$)Y#$)Y#$*)#!Y]$'J)$"
+ "#J)!#J5!!Z)!#J1!#J=!#*Q\"!ZI!#*9\"%JI)$:Q$\"ZQ!$*I\"!:M\"%:]'#[%!#Z]!"
+ "%[)!\";)\"\";=\"$[%!#;5&%+1!%[E$'+A*\";5\"&[I($K]#&;U*%[U$#KY#\"<!\"%+U!"
+ "%<!\"&<-!%,-!'<1*%L5#%,-!&,=$%<9!%<M!%L=\"%\\E#%<Q!%\\I'%LU!%<U!$<]!"
+ "#]!$%<Y!%M%!'-)\"'=1#$=1!)]=)%]E!$]9\"(M=$'=E#&]E!%]M!%]Q!'MU)%]Y!"
+ "#=Y!'-]!&-],%^%!#>)!%^-!%^)!)>-%&.9!'.M%*.U!%^1!$^E!&.I!&.U!%.Q!"
+ "'>U!&>A!$?!#$^]&&?%!'?!&%NY#&?-!&?)'&?5!&?5!&?9!&?E!)/E!#`!!!/M!"
+ "(/Q('?M$&OU!'/Y#(/]!&OU!(0!!(`!$)0%%)_]))P5!(0)!'P1$'01\")P=!&`A!"
+ "(@=!(@A!+0A')`A!*@A*(PI!&`-!&`=')0=*'@1#(P5\"(@1!&P1!(0)!)@!!(P)\""
+ ")`%\"(_Y$%/U!(0!!'_U!&OM!$/U\"&OQ!&?A!'_=!&?A!&?9!'O5!(O5$&?-!&?1!"
+ "&O-!&?!!&.Y!%>]($_%!&?%!%NQ))>Q#(NM!&.M!$^9!'>I!$^A&(.=$(.9*%^%!"
+ "%^1!&>%#(^92&>1\"%^%!(>!!(-M0+-U#(>!!%M=!%]M!&=I#%-=#$]=\"$M=!%MA!"
+ "&-=\"'-A\"&-=#)M!.*-%!'-%\"'-!'\"<Q\"'\\]&%\\U\"*\\M!%LM\"'<I%#<A!!,A!%L9\""
+ "%<=!',=(%<=!'L%+%L-\"'<)!%L)#$<!\"'\\!-%+M!%[I!%+Q%$;M\"$[I$&;M'&;A\""
+ "%K=($[9!%+=\"#[=!%[1%$*Y\"$+5%%;!'$+!\"\"J]$&JU%$JU$#JM!$ZQ%%:I(\"*E\""
+ "#JA!\"Z=!\"Z=!$JA!#ZI!#J)!\"J)!#J)!$*)##Y]\"$I]&$)Y#$IQ,%IM&#YM#$I5&"
+ "#)1#\"I5!$I9#$IM)$91%\")E\"$9Q!#YQ#$*-#'9Q($YU&%IQ'!)]!$J!%$Y]##J)!"
+ "$Z5\"#Z1\"':I)#J9!$J9%$ZA\"#*5\"!*M!#JI!$*U\"#ZQ!%;)'#J]$&J]!#*Y\"':Y)"
+ "#[!!$;=\"$+=!%+-\"&K1$%;1#&;5'&+A&([I-$;I\"%+Q%%KI(%;U\"%[M%',!)#+Q!"
+ "$,)!'\\9'%,-!(<1*%L1#$,1!&<9%%<A!%<A!%\\9#%<I!$LQ\"%<U!%<U!&LY!&LU!"
+ "&=))%M%!&-1'%M)!%M)!$M1!&-A\"%M5!%]I!&-A\"'-E!%M9!(MU-%]]!(=Y&%-Y\""
+ "%]Q!#=M!%^!!&.5!%^1!(.1*&>5\"&.5!&.9!&.I!&.Q!&NI().U\"&>E!(N=!&.Y!"
+ ")O!*(N]+&^]#&.Y!\"?)!$_!!'O1&&?5!&O)!&?9!'_9!&O=!(OE$)?Q!%/M&&OM!"
+ "*OQ!&OU!(/Q!%/]!'?]#)/]%(0!!(09!-`9'*@1+(`5#'P1$)P1-%@=!(@=!(@=!"
+ "&`A!'`I%(@Q!(@E!*PM*)@E%&`A!)`Q!(@A!&`Y!&`=!'PA*(01!)`%)(01!(`=#"
+ "(0)!'_Y!#_Q!)/Y&#_I!(?]('_Y&&OM!#_M!(?M\"&?A!(_=&#/9)&?9!&?5!&?1&"
+ "'O-!%/-!&?%!'NY'&NY\"*?!!*>U\"'.U%$^E!&.I!(.E)'>A!&.A!$N1!(>9+(^-#"
+ "#N!!$N-!'.)!(>!!&^!%$M]!&=I#%]Y!%^!!$=U%%]M!%]I!*]Q!'=E(\"])$$=5!"
+ "&-9\"%]1!&LY!$M9!'M%%%=%%&=!$%M%!&M!%%<I!%<Q!%LM\"%LI\"%<U!%LI!'\\=("
+ ")L9!&<1%$<1!%L1#&<-&&<%%$,%!%+]!&+Y!#+Y!$KQ#%;]!#[A!%[E$%+M!$[1%"
+ "%;9\"'+1*'+E*#;A\"$;-\"\"[-!%K1$#[-!$+%\"%+)&#ZY!\"ZU!%*M'$*]\"&:M%$*A#"
+ "!*9!$:E#%*=&\"Z=!$:1##Z1\"#J-!#J)!#J%!#Z!\"$9]$&YY,%)Y!%IE'$IM\"#IE!"
+ "#)-##)9#\"I9$$I=#$)A$$I9&$IA#%)I!%IQ*$)Y'\"IE$%IY)%Y]$#J)!&*%!&*-$"
+ "#Z-\"%*-#$Z=\"$:=$$ZM\"#ZI\"#ZE%\"ZQ!$:I##*M,$JY!%*Q\"$JY!&:Y$$+!\"#[!!"
+ "$:]#([-.$+1!#[%!%KE(%[=!$;5\"&[-%#[E!%;I\"$+M!!+Q!&[U($+M!#K]##<!\""
+ "$,%!%,)!%,-!%,1!%<A!(<5/%L5#%\\9#$\\A#(<E)',I#$<M!&<Q$$<Y!%<Y!#\\U#"
+ "%M-!&-%$'M5*&M)!%])\"&-1#%]1!)M92$MM!%M9!&]E!%-Q('-Y!$MQ!%]Y!#=I!"
+ "'-Y!'.%%&.=!%^%!).).&.1!&^=$$^5!'N='%^1!).I\"&.I!&.=!$^M!$^U!(^U'"
+ ").Y!)^Y0(?-#*>]'&?5!(_)!'O)'&?!!%O-#&?9!(?9*%/E&)OE\"'_E!(?I\"'_=!"
+ "%/U!(`%*%/]!+`)%&P)!(0)!+P96,@)!+0-!(0--'P5$)`9.'05\",P=!(@=!(`I\""
+ "+@E')`A!&`Q!+@A!)0I$#0U#&`9!(@E!(@I!+01!&`9!&`A!#`5!+`%2(0-!(/]!"
+ "(0)!)P%!&P%!(/]!#_]!#`%!$?Q#&OI!&?A!'_E!*?9&(_I%&OA!'O5&*?5!'/1$"
+ "&?-!).U\"&?%!'/!$#N]!%NY.&.]&$^Q!'>Q&#NI!&.A!'>E!&>A!&^1%&.5!'>9!"
+ "%^%!%^-!$>)%%.)\").!%'^%*)M]!%]I!%-U#&]M!&]M%']I$&MQ$&]A&*-=%$]9\""
+ "%M9+(-%,$]1\"']%!&]-&#\\]#&\\Q\"$\\E#'\\Y+',U#&<Y$#LM#'L1&*<U##,9!)<A%"
+ ",LA*#,1!\",1!$<-\"%,1!';Y&%<%\"&,!!%;]!$;Y\"&[U$%+Y!!+M%$[I$%[M%%[A$"
+ "%+9\"(+A*$+9%&+=\"#[-!%[-&#+!\"\"[)!$[-%#Z](#:A#\"[)!#Z]!$ZM\"$*A\"%JQ!"
+ "$JE$&:A($JA!&:5%&Z9#$J%\"$:1!#Z%\"#J%!&9M&$)M$$)]##9U!$)M$&)M%$9U$"
+ "\"I1!\")5\"&)9\"\"I9!#)A)%YE$#9Q!$9E$$YM##Y]\"$YA'%Z%'$Y]#%:%$#Z%%\"J-!"
+ "!*9!!Z)!#Z5\"%:!,#J=!$K!$$JI$#ZQ!#J5!!*Q!#ZI\"$*Q\"$*]\"&JU!#ZY!%;9&"
+ "#[5!%K%$#+5!$;E\"#+A!%+A&&+A&$[I!%;E\"\";I\"$+M!$;I\"&KM'$KY'&,%!',!!"
+ "%,)!#,)!&,-$$L1\"&<5!'<5!#\\-,)<1!#<-!%LM\"(LA!',M-+<Q)&<Y%%LI\"%LI\""
+ "%]9!'M%%&])!'=-)&L]!%]1!%]M!#M5!']=+%]E!(-E!&-E\"']U)&]M!%]U!'.%!"
+ "%]]!&.!!(-Q!).%*'.)%&N=#&^A$#NE!(N5&&.9!&>A!&.E!'>A!&.M&'^U($^A!"
+ "$^U!&.]!$>]$&.Y!&?=!&?)!&O-!'O9&)/A&'O1!&?E!&?A!+?=+&_I\"&OM!#OE!"
+ "&P!!%_U)'O]%)P)'#`%!(0%!&P%!+@-\"&P1!#`1!,P5!(`1#(@=!(@A!+@]!(`A#"
+ "(@E!*PM$)`M!&`E!%@M&(@I!'P9*'0E((@E!*PE+&`9!*@9#%@A!,@-!(P-)(0-!"
+ "+P)1,@)!(0!!'_]&(/E!&OM!%_U)&_M\"&?A!'_Q&'_E!&_A\"&O=!'O=&#O5!%/5!"
+ "\"?9!#O!!)_%%*O-!(^U!$_!!&.Q!%>Q($^=!&.E!$^Y!(NE!&N-$&.A!&.I!'.5&"
+ "$N%!%^)!)>-*)>%0(-U+&N!$%^%!%^!!'=Q\"#]Q##=M!%]I!'=A#&M=%'-5'$=5!"
+ "%M5+%M1!&=-$$=-!%])\"$=5!'<])&])&%M!!$<U!&\\Q\"%\\U\"!LI#),M,%<Q!&L)\""
+ "%<9!&,)%(<5*$L=#&\\-,%<!\"&L%\"#,%!$+Q!%L1\"%+U!%[I!#[E!%;I\"%KI#%[A$"
+ "#K5'$[=!%[I$$+5\"$+9\"%*Q'#;)\"#[!!&K!,%Z]%$:Y#%ZU\"$*Q\"&ZQ\"#:I##ZE\""
+ "#ZQ!#Z9!$Z=&#ZA\"$J5!%J%&#Z-\"!*)$%:))#Z!\"%)]!#9]'%9U)%)Q$#9U!\"IM!"
+ "\")1%#95!$)9'\"I5!#9A!%IA&'YI&$)E!%)I!#II!#YQ#$9Y$#Z)\"#J%!$Z%##J)!"
+ "#J-%!Z1!$J1%!*1!#*5\"#ZA\"&:=%#JI!$*A&$:M$%ZQ\"&:U$%K!!$ZY%$;!\"(K1*"
+ "![)!&[5-'+1\"&[5!&[9!%[=!&[A)$[1!&+E%&[Q)#+Q!&+M!%+Y!%;Q\"&,)!);Y+"
+ "#,)!$\\)#%\\!#&,)%%<A!&<1!)<A)%<=!%\\9#$\\E#(LA+(L]%$<Q!%LU!$<Q)%<Y!"
+ "&]%'&-%#&M)!%M-!(]1%)]13#==!'=5(&-9#'=A##=E!$MI!%]M!#=M!'-U!%ME!"
+ "(.!%&N!)(N%,'.)!'.)!&>1\"*^-!$^5!&.I!&.=!&.9!*.I-#^I\"&.M!'>Q!).U\""
+ "&.]!'O!')/!-&.Q!'/9##O-!'O-!'O1&&.]!'_9!&?A!&?E!(?M\"&OM!$/Y\"%OQ\""
+ "&P-!%/9!%/Y&&_]!*@!$(0-!(0%!)P9!(01!&`9!(09&)`9(+P5*(09!)`I!(@I!"
+ "&`M!)`E!*0]!'@Y\",@M%(@I!%@M!(@A!#`9!(@Q!+@=/&`M!(`A#&`9!(@1!(0-!"
+ "*0)))@%&%/]!'_Q!+?Y#)OU!&OU!&OQ!&_M\"&OE!&OE!&?A!)/='$OE$*/1+)/9!"
+ "&?5!$O1%'/%$)/%!&?!!$^]!&?)!#O!!%.U!&.Q!$^E!).I.$^A!&N1#&N1$%N1$"
+ "&.%!$^I!&.)!&.9!'.%!'.!%%]Q!$MU!&-U!%]U!'=M\"'-Y!)-9&(-A!'=5##M9\""
+ "%])\"&M1%#=-!&]-!%M)!%]%\"%]!\"%M!!&\\Y!#<U!&LY!%<I!&,Y(&<E!%L9\"$,=!"
+ "$<=!'\\E,(L5/%<1&%<5!',))%;]\"%L)\"&[]$%KU#&KQ#$+Y!$[M$%[I!'+=\"&;Q\""
+ "'K=(%;I\"%;9\"%;9'&;9'$+5\"#[1!%K%)$K%$%Z]%$*]\"\"ZU!#ZQ!#Z]!#JE!$ZU%"
+ "!*E!$*A\"&*1'#ZA!$*-#$J1!\"J)!#J-%&*)+$J%%$9]!$)Y#\"Z)\"#9Q!\")M\"%)M!"
+ "!Y)!%Y5(!)9!\"I1!%IY-#9E$%)I%$9M%#9Q!#YM#$YU'\"IE!\")Y\"#J)!%Y]+#J)!"
+ "$:-#\"Z5!$:9#&*1!#ZI\"#ZA!#:E#$*U\"#JM!#ZQ!$:Q#!*]!$ZY%%J]!!+!!#;!\""
+ "&+-*%;-##;9\"!K5#'+=!%+9\"#[A$([9!#[E!&;I&';M\"$+M!%KM#%+Y!',9)%+Y!"
+ "$\\1($,%!$<-!&,-%%L5\"$<-\"&<M!)L=&&<I%%<A!',M)%<E!%<Q!%]%\"',I(%M!!"
+ "%LI\"',M)#]!'%-%$%M5!']9%%M5!&]5!&]9&$MQ*&-E\"&-U!$MU%%]U!&-Q\"%]Y!"
+ "%]M!'^1#%^%!#=]!%^)!(>)+(>A%&.5!%.A!'>5!'>9&#NA!*>I\"&.M!$^I!(^U!"
+ "(_%!&?!!)/!($_%+'O%'&?9!&_1\")/5!'?-%&?1!\"?=!&?9!'_E!'OM%&OM!&OQ!"
+ ")_Y\"&OY!&_]!&P)!(0!!*_Y!%@)!\"@-!(0-!%@5!&`9!&`I!,0E$)PI&&`A!(@E!"
+ "(@M!)0I$+0Q,(@]!&`Q!+`Q\"(@]!*@I)(@M!&09#&`M!+PM/(05!(P1)(01!(@-!"
+ ".P)$'_Y!(/]!&OQ!&OY!(?]/&OQ!&OQ!'_M!)_E/+_E,&?A!&?=!&?5!'O!!&_5#"
+ ")/-!'/)$(/%((_!!&O%\"&?!!'>Q!&.I!&^M)&.U!'>E&'>M!&.A!&.I!'NA'&>5\""
+ "(N1,'.-*(>-!*>%*,.%-%]Q!%^!!'=U\"'-U!(-U*(=Y!'=I()=E1$MA!'-=!&M9$"
+ "'M5$$]A\"&]1&&M-!&]-!'M%%\"-%!'-%''LY%),Q'#,M!&,I#%\\A#$LA\"&,I$&\\9("
+ "%L=\"%\\=#%<5!%,1!$,5!%+Q!%,)!%<!\"%;]\"&;M\"%;Q'#KE#$+U!%KU#';Q/\"[A!"
+ "%[E!#;9\"%;9+%+1&$[=!$+1\"$*]\"$+%&%;!#\"ZY!#ZY!$K)$#ZA\"#JQ$#JI!#ZU!"
+ "\"ZE!$*E\"%*5'\"*5!#Z=\"$J1%\"J1##Z-\"\"J-!$9Y$#Y]\"#9U!%:-)#YQ\"$Z!\"%Y=$"
+ "$))'&)9#\"I%!\"I5!$IM\"$I=#$IE\"$)I!#II$$IU%\"IU$#9Q!$*!#\"J)!$:%!#J%!"
+ "#Z-\"#Z)\"#J!!#J=!#ZA\"%J=)#JE!':I!\"Z=!%:Y'#ZM%%*Y&&;!+&;)##[%!$[1%"
+ "%K)(%+5\"#;)\"(;5#\"[=$$KM#%[A%#[5!&KA##[9!%;I&#+U!%\\!#%<!\"%KY##L)#"
+ "%,%!&+]))\\-(&<1!&LA\"',5)\",9!%\\A#'L1\"%LA\"%LI\"%<M!%LA\"),Q'%M%!%M!!"
+ "%M1!\",Y!&M)!$]-'%])\"$]9\"%M5!%=9)%M9!%MA!&=E#&-A#%]Q!%]Q!&MY$)MY1"
+ "&^%%'-Q''>9!%^)!'-]!%^!!&>1\"&.5!&N9#&>-\"#N=!&.=!%>=#(NQ,'^Q(#NU!"
+ "$.Y#$^]!&?!!&O)\")O!)(/)(&?-!%/9!&?=!&?9!&?5!$_5*+?5+&OI!*_M(*@!%"
+ "\"?U!&OY!&P)!&`-!/0!!)P%!(0%!&P-!(/]!(`=#(`9#%@=!(@I!(@E!,@U+&`U!"
+ "*0U!*`Q+(@Q!)0Y#)`Q!+@I!/`Q!(`E\"(@I!)@E%*PY*(P-\"&`9!%@9!(01!(`-$"
+ ")?]&(@)!(O]#&P-!&P%!&P%!&O]!&?U%&/E%'_M!'_E!&/A%#O9!*OA!)?=('O1!"
+ ")_-%%/1!'_1''?!&+O!!(/%\"%^I%\">Q!$^U!'>E!$^I!%.E\"'NA'$^=!&.=!#>1!"
+ "$^-!&^-%%^-!%^%!#>%!$N!!%]]!(>-!%]U!'-Q&(-M!%=I$'ME$(-=!'-5'$=-%"
+ "%M-!&=5$%M1!%])\"&M-!&=)$',U##,U!*\\Y*$<Y!&LQ!%LE\"$<I!%<E!#LE\"%<=&"
+ "$,5!!L9#%<1!$,9!&<)%%L)\"%;U\"%L)\")<%.'KY#%KU#$+Q!#[=!&[I!&[I!#[I!"
+ "#[=!$[=!&K9(#[5!#K1'$;-\"\"[)!#+%\"\";!&#[1!$Z]%#ZU!$JU!#JI!#ZU!%:A#"
+ "%*I'#:E#$*5##J%!#J=!#J1!#Z-\"#J9!\"J-!#J%!%9U\"$*%#\"9M#%IQ##YM##IE$"
+ "\"Y1\"\"II!#I1%\"I5!\"YE\"%)A(#)I#$IM&#II!%)Q!'YY%#IY!$YY##IY!$IQ&#Z)%"
+ "$J1%#Z9!%*9&#Z5%#J=!\"ZE!%:E$$JM!#JI!%:Q'#Z]!%JM!%:Y'$*]\"$[%!$;%\""
+ "'K))'+-\"%K1($+1!%+A!%[=!%+=\"$[E!$[=!(;E/\"[9!$+Y!#+U!&[I$&L)\"%<%\""
+ "#,%!&L-\"%,)!%\\A(&<9!&<9!#<5\"%L=\"#,E!#,I!'\\A'$<M!),M\"%\\U\"%\\Y##,Y!"
+ "$=!!%M%!'-1\")-9+%]-\")M5#$=9!'-9'%]I!(-=!%ME!&]A!'MM(&]Q%&]Q!!]U$"
+ "#-].#>!*'.-!&^5$(>)!$^1&(.1*'.-!&^5%'>A!&.A!'^E\"&.A!&.Q!'>U!'NU,"
+ "&.Y!&?!!(?!)&?)!%/1'#O)!#_1!\"?-!'/!$&?9!%/=!&?E!%/A!&OI!'OM%)OI)"
+ "#_U!'O]%)?]!$P%#(/]!(0-!(0)!(05!+01!&`5!,P9!%@5!&`A!(PI!*0I\"(@M!"
+ ")PQ&(@U!+@Y!+P]!(@]!)PY%-@]\")`M!)`E')`I!&`=!%@A!%@9!#`9!)01$(01!"
+ "(P)\")P%!(0!!(/]!+@!0&OY!&OU!*OM!#OE!)_Q)&OM!'_=!'/=#'_9!+O1!\"?1!"
+ "(>]*)?)()_-1'/9$&?%!&_!)&.Y!'?)%&NY\"&.M!)^E!$^I!'^=)(N5!'>=!&.=!"
+ "%N5%&.5!%^!!%N5%'.%!%^!!%]]!#-Y$)-=!'-M&#]M(&=E$&]E&&M=%'-E'%M9!"
+ "&M%&&M5*%M%!']-!%M)!%<U!&L]%&L]&%<]!$<Q!&\\M#%\\I#&\\I'&<E%$\\A#(LI!"
+ "&<9%$L9#%<5!%<5!%<=!$,5!#<%\"%,!!%[U$#+U!%+Q!(,!!$[I!&[E%$[E!#[E!"
+ "$[5!#;9\"&[5!#[9$&[1%';-/$;1&$J]!#[!!#:]##Z]!$J]!#Z]!$ZM\"%:I($JE%"
+ "$:E##Z=\"#JM!%*5#$:5##JI!%J-*#Y]\"$J-%\"J!##9M!&)U,%9A&!YQ!$II&#)1#"
+ "\"I5!\"95#$Y=$\"I)!#9A!#9E!$9=%\"YM\"$YU'$IQ%')U%$9Y!$9]$$*!##J%!#J5!"
+ "$Z9&#J9!#J5!#JI!#ZA!$*A\"&:E!$*Q\"#JI!%ZM\"%ZQ*'*U,%:U$\"[%!#ZY!%+)\""
+ "$;%##[5!$+1!\"[1!%[=%(K=(';A,&[E%&+E&'+I%$;M\"%KQ#$,!!$KY#%;Q\"&;]\""
+ "$,)!$<)\"%,)!'<9!$\\M#%L1#(,=-$<=&%<A!$L9\"%LM!#<=&#,M!%\\U#'LA!%L]*"
+ "&M!&%M%!%]5\"$=5!%M-!&-9#%M5!%]I!%M=!%=A$%]I!'=9(%]M!%]U!'.!!%]Y!"
+ "(M]-&]Q!%^!!'.)!&>1\"&>!\"%^-!(^M'(.9$'>A!'N='*N5+&.I!'NM''>Q!%^U%"
+ "+>Y-'O!!&O-\"%_!$(/%#(_!!'/1$(/1\"&?9!$?1#&OI!)_A#'_M!(_I%&OM!&P!!"
+ "(OY*&P-!%?]'*_]!(0)!%0!!,@)!)@5&%@-!(05!%@=!&`E!(09!(@E!'@I\")`A!"
+ "(@I!)`U!&`U!*@E)(@M!.@]!*`]+(@M!/P=!&`M!,`A!(@=!)P=!&`5!+05!)P-'"
+ "(P)\"*P%,*`!-&P!!&O]!&OY!%OU\"&?E!&OM!*OM!(_Q$./A%&OA!&?9!&?9!&?1!"
+ "&?1!&O)!*O)($_!!)?%.&>]!'NY!&>U'&.Q!&^Q$&.I!(.U##N=!$^=!&.A!(N1'"
+ "#NA!%^1!%^-!$MY!(=Y!%^!!%]]!%-Y\")=Q!(=M'%ME!)=I!&M=$%MA!&-=#(=9,"
+ "&]5&%]5!+])4*-1%%]-\")=%\"$=!!&\\Y!%<U!&-)#'LQ!(\\U!#,E!&,E#%<E!&<=!"
+ "#<=!$,5!$,5!'\\1#%L-#&,%%$<%\"&,!!&<!!%+Y!%+U!$;]\"%+1&#;A\"\"[E!(+=!"
+ "$;M\"$[=!&+9&&[%&$[1$\"[-!#[%!%K%$$*U\"#ZY!$*Y\"#ZQ!$:M$%:I$\"Z5!#ZE\""
+ "$JE!#ZA\"\"Z=!#Z9\"\"ZA!$J-%#Z-\"$:%$&J%+\"I]#$)Y#&9])#IM!#IY!'IY$#IE\""
+ "!Y!!\")9\"$)1'$)E$$9I%#YE\"%IE##YA\"#9U!$)Y#\"I]!%)Y$#:1#%Z1*$*%##J)!"
+ "$J)\"#J1!$J=!\"Z9!%:5!#J=!%*I\"':Q$!*M!#JE!%ZE*$:]#&[!*\"ZU!#Z]!'+1+"
+ "$[-!$+-!#+5!#[5!%K9(%;=\"&KA#%[A!$[1!%;I&%+Y!';E+#KY+%+U!$+]!&,!%"
+ "$<1!%K]#\"L-'$<-\"%<9!&<Q$%<=!%LE\"%<A!'LE&&<Q$&,M#%LM\"%<M!#,Y!&L]&"
+ "&M%!&=%$)])%&]-&&M-%%]5\"(=9,#=9%&]A!(-A+%M=!%^)!&=M#&-U!&>!#(=Y!"
+ "&MU%%]M!\">5!'>)!&^-%%^)!&.9!'.)!&.9!'^=#$^=!'>E&'>I!&.A!'.U*&N]\""
+ "%O!)&.]!%O-#+O%!&.Q!'O%!&_5\"&?-!(O5*%/-!&?=!&?9!#OE!&OM!&OM!)?Q'"
+ ")?Y!&OY!*@)+'?Y$&OY!&OQ!(/]!(P-\"&`5!&`5!%`)#&`A!(@A!(@I!&`E!(@I!"
+ "(@A!(@Q!*0U!)0M#(@E!)`M!&`Q!%@Q!(@E!)P5')0E$&`=!,@1-&`5!#`!!(@)("
+ "(0!!(0%!&OY!(P))%@)!&P!!&OM!&O]!\"_U\"%/A!(/M!&OA!%/=!'_9'*O5-%/1!"
+ "&?)!(_-&$_%!&?%!&.Y!&>Y!&?%!&?!!$^Q!)>M.#^M\"&.M!&.=!$^=!%N=$&.5!"
+ "&.9!'^%)(.-%%>1#%^!!)M]!%]Y!$M]!&]]%%]U!%]Y!'-A\"%ME!$ME!#=9!$=1!"
+ "%,]#&M5*']5!#,]!%M1!&-!$&=%$&,]#$<Y!'\\I+',]#%<Q!)<I$&<M!',=((\\=("
+ "%<9!%<=!%,-!&<9%%L5#\",)!#\\5#%<%!'K]+$+Y!&KQ($;I\"%+E)%+M!'[I$&KA("
+ "(+A&&;U\"$[9!$;5'$+1!$+-\"%K1$$[%%#[!!$+)\"#JM!%:U$$Z=\"$*U\"#ZA\"#JE!"
+ "#JE!%ZA\"$*=)%*A&#J=!$:)!#J-!#*5&$J%%%Z!*&9U'$9Y!#IU!#IQ!#YI#\"IM!"
+ "#)1#$)5'#)9#\"I!!#9A!#)=&$9I$$)M##9M!#9U!#J!!#YY\"\"9Y##IY!$Z1&#Z1\""
+ "#J-!$*1##*9\"#Z9!#*9\"#ZQ!%JE%#JM!%Z5##JE!\"ZU!#ZU!\"ZY!#JQ$$[!%\";%&"
+ "$[)!&[-!%[1!$+5%&KE$$[=!'KA,&;A&*;M,(;I\"$KU#!+Q!%+M!%+Y!$+Y!%KY#"
+ "%,%!$,)!%,1!%L1\"%,)!%<9!&,9$&<=&)<A)%<E%%<]!&,Q#'\\Q\"'\\]!'LY&&]!'"
+ "$M!\"%M%!'\\Y!%--(']1!$=1!'=9(%M5!$M=!%MA!&=A$(MI#%]M!&]Q!#=Q!%]U!"
+ "&>!\"$^)!*>!%%^)!&.=!'.-!'.-!'>E!'>=!%^1!&.=!'^I-'.I%'.Q%#NU!&.U!"
+ "&^Y#*.]1$_!!&O1!&.Y!(_%'&O-\")/-!&?5!!/5!&?A!'?9*'_E!%/I!&OM!)?Q-"
+ "'?M*&?E!&/M%%/Q!(0)!(`)$,@-!)P)!'P1$%`1\"&`9!&`I!(@=!(PA!+0I-(@E!"
+ ")`M!(@M!+@Q'(@Q!(PQ!(@Q!(@M!&`=!)PQ&#`9!$@9\"&`=!(09!%@5!&P1!\"`-\""
+ "(0%!(0%!(`%$&OY!&OM!&OU!*/U+&OQ!&O]!&?=!)?E(&?A!&?E!#/9#%O5#&?)!"
+ "'_-'%/-!&.Y!\"NY!$_!!,/%#%NY#&.U!#^Q!&.I!).A($^E!%.Q!(NA,&N9#'>=!"
+ "(^!)$N!!%^)!%^1!&-U!%]Y!%^!!%]U!'-Q'(MQ\"%]I!&]Q!%ME!%M=%&]A!*-=/"
+ "&=5$(M1.%]5\"&=-$%M)!%]%\"%<U!%\\Y#$LU\"&<Q%%\\U\"&LQ&%<I!%LE\"%<=!'<=)"
+ "&,5(%LA\"$L9\"&\\1#%\\-#$L)'%<%\"#<)\"&;]\"&+M%\"+]!$;Q\"#[M(%;E\"&[=!%[A$"
+ "(;U'%[=!$[9!%+9&\"[1!#[-!&;)#%+!\"#[!!$Z]%%JI!%*I#'ZQ+&:](#JI!#*I)"
+ "\"ZE!$:A($JA!$Z9\"$*5##Z5\"#Z-\"\"J%!#:)'\"J)!$9]$#9I!#I]!&9Q&#YM#&9I-"
+ "$99(#Y)#\"I9!#99!#)5&#9I!%YI+%)U$#IY!$J!%%*!!&:)\"$)Q$\"J-!$Z5)#*1\""
+ "&*-$#J=!#J5!!Z9!\"Z=!$JA!$JQ!$ZE\"#JI!#ZM!%[!%$*Y\"%ZY%&J]$#[%!#[%!"
+ "#[%!#ZY!$*]\"#[)!#K9$&;5#$[=!%KA#&KE,#;U\"$;I\"$[]$&KU'&+Y%&\\%#%\\%$"
+ "&<1!&,)!%,-!&\\=##LA\"'<=!%<A!$,=!%LA\"%LE\"&<U$#\\I#$<Y!%<U!&\\U&&M%&"
+ "%<U!#=%!%]1!#]%#$=-!'-5'&-1#&-A\"'-A'$ME!&]E!(-E!$MM*(-U!#=Y!%]Q!"
+ "%]U!'.!!$N)!#>-!$^5!%^%!'>-&$N-!'^5)%^=&'>9!$^E!#^I\"#NM!(NE!+^U4"
+ "*NI$(.Q#$>Y$&^Q##O!!(_-,&?-!#O-!%/-'&?A!&?=!#OE!'_I!'/I#'OU%%/A!"
+ "(/M(&OU!&OY!'_U!(0%!(P)\"(@)!-0)2)P9&(01!'`5%(@1'&`9!)P9!(@M!(@=!"
+ "(@U!)`I!*0M((`M\"*@I#(@E!&`E!)`E'#`M!,0A2+@1)'@5#&`A!)@!!)P1'(0-!"
+ "'`)&+/U\"&P!!'P-$)?]!*_M4'_M!&OM!'OE&)?M-(_9%&OA!'_9!%/1!&?)!)/A!"
+ "&?5!&?)!\"?)!#O%!#N]!&?!!&.Y!&^M$&.Q!'>M+&^E$'.E%&.9!'>=!&^9$$^5!"
+ "%^-!*^)!'>)!\"-]!&^5$'.!!(=]!'-Q&%]M!$MI!&]=!#=I!)-E+#]I\"'=E\"%M=!"
+ "$=9!(=9\"%]!\"%M%!']-!&M)!&]!\"%M!!'<]$(,Y#$<Q!'\\A#$LA\"$,A!%<=!&LI&"
+ "%,1!$<E!&<5%&L1\"#,1!%+]!&\\%#%+Y!$;]\"%+Y!%;I\"$+U%&;Y\"%[A%&;E&$[9!"
+ "%[-!%;A\"';A'&[-!#[5!$[%!\";%\"$[%!!ZY!#+!\"$*]\"%JM!%*Q&%JE!#JM!%*E'"
+ "&*9+'JM\"$J5!#Z9\"#J5!#J1!#Z%\"#IQ!#Z%\"$:!!#9M!%)]!%)Y'$)]#$9M!#9M!"
+ "#)1#\"I5!#YQ#&)A(#YI#%Y9%$YM'#YM)#Y=##IM!#)U0\"9]#$)U#!Y]!%:1($:!!"
+ "%JA\"#J1!$J=%#J9!#*E\"\"ZA!#JE!$*E\"%JQ!#ZM!%ZQ\"!JY##ZY!#Z]!!;%\"$+-\""
+ "#[5!%[-)#[A!$[5$$;=\"%;=*$[E$&[A!%+M!%;I\"$+M!&+Q%%+Q!#KU#([]-&,!."
+ "$\\!$%L)\"&<-!%,-!%<=!)<!!%<5!\"<M\"&<A%%<I!&<M!\"-!!&<Q%%\\Y''=%($<]!"
+ "%M5!'=)(!-!!&M)!(-1,$=1!%M9!%]1\"$==$%M=!&=U#$MM!&]M!#=E!'-U!&]]%"
+ "#=M!'=]!'.!!%]Y!'=Y\"&.5!)N-!'.)%&.9!&^=$(>A&&NM\"&NI\"$^Y!$^Q!&.U!"
+ "$NU%(^Y!'O%'&?!!#O%!&?)!'O5!*O-(+_9!%/1!%/I!#?A%)OA\"&/=%'?M$&_M\""
+ "&OU!&_Y!&P1!&`%!(/]!)@)&)P%!)0)%(0)!)P1!&`5!%@I!)`A!)`=')@5%(@E!"
+ "(@E!(PI!(@U!(@I!(@A'*0=)(01!(@E!'P5$(09!%@A!'09!&P1!(@1((P-\")01$"
+ "(0-!,@%!)P!'&O]!%OI\"&OU!,OQ*&OM!%/I!)?I'&?=&'_I!*O=3&O=!)/5!&_1#"
+ "$_)!(/)#%/1!'/!$&.Q!'NY!$^U!'>U!%^Q%&.M!(>M+'.A%&.I!'.9&'>9!$^=!"
+ "%^-!#N=!%]]!(>)!'-Y!(N!-%]]!%]Y!(=Y,*MQ,&MY$&-I\"$-A$&]I!&]5&%M9!"
+ "'M5*#]-#&M5$)\\Y!(=5''-)\"&=1.%<]!&\\Y+&LU!(,U(*-!!$\\I#)<E.%<U!%LA\""
+ "\",=!(L-!#L-'%,1%',1$)\\-#\";Y\"',!!%+Y!&;Q\"$+]!\"+Q!%;M&%;I\"&;E\"!K9#"
+ "%;A\"%K=$\"[=!%[5!#[5!%;1'';E+$+)!%+1!#Z]!!ZY!#ZU!#ZY!#JM!\":I#$Z=%"
+ "#ZY!$*A&%:=!%Z5'$J9%#J1!#J%!#*5\"$*%#!Z5!$:!'$)Y#%IU##)Q#$IM%#IY!"
+ "\"91#!Y5!!Y9'#9E!$IE%%IE##II!#9I!#IU!#YY\"$)U#$9Y!$J%%!J!#$IQ\"!Z)!"
+ "#:-#$J1!%Z5&%J9\"$J9!%ZA\"#Z=%\"ZI!#JE!$JE!$*Q\"$*U\"![!!$[!%\"ZQ!#+%\""
+ "$+)!#[5!#K1$#+-\"&+A\"%;1\"&+A\"&+=\"$[Q%&+I!';U'%[E)%;]\"%;Y'%K]#&,!!"
+ "\",)!&<%&'<1!%,-!%<5!&L5&$LA\"$\\1#%<A!&<E%&LE&'\\M&$<E!%LU!%\\Q#&M-%"
+ "%]-\"%<Y!%]%\"'M!*&=-$$-1$%M5!'M9$%MA!%]Q!(-M!&M])%MA!&=U-%]M!&N))"
+ "\".!!'MY#'>!\"%^%!%^)!%>-#'>5!&.5!%^-!(NA!'>9!'>I!%.I!&.M!'^U'&.Q!"
+ "'_!('.]*(^],$^U!(O-*&_=\"&O-\"&?1!#OA!(_1+)/A!&?9!#OA!'_I!&OU!&OY!"
+ "'_Q!&OM!#_Y!&P%!&OQ!)/Y%(0!!(01!'@1#(01!(P%\"%@-!'0=!%@=!(09!$@E\""
+ "&`5!(@E!(@E!*PE+(@A!)`M!(@=!(@A'\"@A!&`=!'@=#+05!)P-!(05!(0-!)@%&"
+ "&OU!/0!!)0%%%/]!&OU!&OU!(_U%#_]!)?I!)/A!*_5)&_Q\"'_9!&O5!'?5%&/-%"
+ "'O5!'?)%'O1!&?%!&.M!&.A!&.Q!#^Q!$^M!$^M!#NI!&>M!'>E!&.=!&>=\"(>Q%"
+ "&.)!%^)!%^%!'.-!%^!!'N%()M]!%]Y!%]Q!&-U!%MA!&]E!']5!%MA!'M-*)==!"
+ "%]1\"%M-!$]1\"%M%!#,Y!&-%#']-*(,Y,%M!!%\\U#%LM!#<M!%LE!%<A!%LA\")<=$"
+ "!L9#'L5'%<1!&L1&'L1+%,%!),)%&L!##\\)#%+M!&KU#$KQ#\"+M!$[I!$[I$$[9!"
+ "%+A!%[1%%[A)%+9\"![=!%[))#[)!%;%##Z]!$JY$$:Q#$:U#\":M\"$*M\"\"ZY!$*M\""
+ "#J=!$:I##:A##Z5\"\":5\"#J-!\"J-!#JA!!Z%!$*!#\"IU!#)U\"!YY!#)M##9M!$)=$"
+ "$)1$$)1'%9=%#I=\"#IA!#9=!#9A!#YI\"\"YM!#9A!\"II$#IQ!%:%$#Y]\"%J-&$:1!"
+ "$:%!#J=!'J1'$Z9\"#ZQ!$:1#%*M'&*E##ZM!$:9##ZY!&;!#%J]!#[!!$*]\"$[%)"
+ "&[%&$+%\"\";1\"$+A!'[-&$K=$$[1!%+9!$KE#$[I!#+M!$;Q\"'+M!#KU#&<!&%,)!"
+ "&<1!%\\)$$,-!'<!&#,!!'\\5($<-&$\\=#%<A!\",M!&<I!$\\=#(LQ!$<U!%LY&%-!$"
+ "(=!)$]-\"#=!!&,]#%=%*%M1!%]-\"%M5!&]A%$=9!&]A!'=A(#=E!%]Q!&MU$#=M!"
+ "&]Y%$N!!%]Y!$N%!(N5&&.9!&>1\"'N1()^91&.E!)>E$&.E!&.I!'>9!&.M!&.U!"
+ "$^E!&.Y!&.]!&?5!(?-)&?-!$_)!%/1!$?1#&?=!$_)!&?E!%_E$+OA%%/Q!'/Q#"
+ "(_Q%&OQ!'_U&&O]!(/]!(0!!&`)!(@%!)P)!)0-%)P5!&`5!(P5)'/Y\")PA&&`9!"
+ "&`=!(`A#(@9'#`A!(@=!(@A!(P=\"&`=!(09!#`9!)@9%(05!&`=!(05!(0%!+01!"
+ "(0%!)@!&&OY!&P-!&OU!(OQ*)?Q!*OM!)/I,'_5!%/9!(/=\"*?9!(/5(%/1!&?1!"
+ "&?A!#NQ!&.U!'O!'&.U!(.Y)$_!!$^I!%>A#$^I!'>E&&>E!&.A!$^5!&.1!$>-$"
+ "#>1!'.1!%N)*%^-!#=Y!%]]!$MU!'-U!\"MU''=U'&N-$#=I!)=5\"&-A(%]I!$]A\""
+ "&M)!%MA!%MA!%=)$%M)!%]!\"#=)!%<]!%<U)&<U%%<Q!',Q-'<Q)%<E!#,A!%LI\""
+ "&,9$%LI\"%L1\"'[]$$,-!'L),$L!#%<!!&;Y''L%,%+U%$KQ#%+M!%;A\"$[5%$KA$"
+ "$[-%$[E!#+1\"$+=!%+1&$K)$#[!!#[)!#Z]!#ZY!%*Y'$*U&!*Q!$*Q\"#JI!\"ZE!"
+ "&JA*#Z9\"$Z)&#Z9\"%J9\"%Z)#\":-#\"Z%\"#)M#$J-%%J!#%YY(#IU!&:%\"%9U%%9I)"
+ "#9=$\"X]\"\")9\"#Y=&#9A!$)A!#IE%#YI#\"IM!#9U!%)U($IY&'I](#Y]\"$J%&#J)!"
+ "#:-##JA!%Z5&#Z9!#Z1\"%J5\"#*9\"%*E'$ZU%$*M\"&[!*#ZQ!$*Y\"$*]\"#ZQ!$;-#"
+ "\";1\"&K9($K5$#[1!#+1!'K9$#+=!&+A\"'+E.$[I!$+Y!$+Q!%+M!&KY'%;]!%,!!"
+ "(+Y!&<-!%,%!$\\-$&,1%%<5!$L5\"%,=%&<M!$<=!%LA&(<M$&,]##,U!&LY!&-%$"
+ "']%!&-%$%<Y!%M1!$-9$)--!%M)!$=9$%M1&&]=&$ME!$MY!#=A!%]M!$MQ!%]Q!"
+ "#]Y\"%M])$MU!'^-#(>)!'N-\"%^1!$N1!&.9!'>=!&>=\"$^E!&>E\"&.]!&.M!$_!!"
+ "'>M!$.Y\"&.]!'NY!&?!!&?!!%?5\"#O-!&?=!&?5!$?=#)/=!&?A!'_A!)OI('_I'"
+ "*OM!%/Q!&?E!&_Y!(/]!%?]!(@!!'_Y!)P)!)0-%+P5*)@1&&P)!*P)2(P9\"*050"
+ "&`9!(P=\"%@9!&`9!&`A!(`9#&`E!(`5#&`9!!0A!(@-!&P1!)P%!)P-!%@%!(0%!"
+ "&P!!&O]!&OM!)_Y\")?U!&OU!%/M!#_M!)/E!*OI!'OE&'_=!(O9*%/5!$_)!#_-!"
+ "%/1!&_%(#O-!#O%!(/!(&^Q#$^Y!+NY'&^U$+NQ(&.=!#NI!&.9!&.=!&^E$&.-!"
+ "'>1!%^!!'.=&&-]!&.!!$N)!%]Q!'=I(%]Q!%]M!%]M&&]M+$MA!&-E\"$=1!&M9$"
+ "(-)'%])\"%M-!%M1!$])#&M!&&,]#%])\"'\\Y!%<U!(LM&%<E!&\\I'%LE\"(LA&&LA!"
+ "&,9$&,-$&<1!%L)#'\\),$,!)%,!%'+Y!&+M%%KU#%+U!\"[A(%+=&$[I!$[E!#;A\""
+ "$[I!';9(%+5\"&K=$%:]'([1\"$JY!\"[%!$+!\"%[!!$*]\"'ZQ/$JI$$ZM%\"ZI!%:E$"
+ "$*-##J=!\"Z5!%Z9*#Z9\"%:A(#J-!$Z%&$:!!#J!!%)]$&)I%$:%$\"YQ!$IQ&%YM("
+ "\"Y-\"%95&\"Y=\"\"YA\"#91!$Y9'$IE%%9M%$99%\"IM!%Y]+#*!\"#YU\"#J!!%J-%#J)!"
+ "$:-##*5\"$:%$#J5!$JM!#JA!$:E#$:M$$JI$#ZQ!#JM!#ZU!#ZY!#[)!'*Y'!;1\""
+ "$;-\"#[%!#[9!%+5&%;5\"%;9\"%[=%$[1!$[A!$[I!$;M\"$+M!%;U\"'KY+&+]%%,!!"
+ "%;M\"',!!&<!!%,-!*L!'%\\=#%<5!%<=!%<U!&\\Q\"%LI\"#LQ#&<Q)%\\U#(<U$#,U!"
+ "%]!\"'LY!&=)$&M%%)])*%M1!%M5!&-A\"#M=&(-A!$MI!(-E!%M=!%]I!&MQ$'MU-"
+ "']Y$'=Y-%^%!&^%*%^)!%^-!'>A!#NA!&N5#$^9!&.=!&.E!&>I!$^Q!&^M$\">Q!"
+ "'_%!'O%!(O!%#^E\"&?!!*?)!&?)!)/%((O)*&?9!&/1%%?1\"&OI!'_E!)/E!(OE$"
+ "&OM!#_Q!#_Y!&P!!%?U!&O]!)@!!'_Y!)P).&P1!&P1!(0-!)01$(05!'@-#%@=!"
+ "(09!#`9!&0E#&P1!&`9!(09!)P5!(`5#*`)!(P1\"+01!,`-)*P%%)P)!-`%!+0)("
+ "(0%!&P%!(OY*(O]#&OU!'_I'&O5(&?E!'_E!\"?9!'/E)&?=!(?A)&?9!)?5.$_-&"
+ "#O-!&?!!$_%!&.Y!\"NY\"$.Y\"*>M((.Q)&.I!&NI#&.M!'>E&#NI!)^A!%^1!#>-!"
+ "\".1!%^)!%N-%'N)#&^%%!]]$%]U!%]Y!&MQ$&=M#)]]\"#=E!%MA!%=A$']=%&-A\""
+ "&M-!%M=!%=!*'])!&M%&%M!!&<U%$<Y!\"<U!%\\U\"#LQ#!LI#'L5+&\\E\"%<E%(\\=\""
+ "$,9!%\\E((L1'&<1!$L)#%,-!&+]%%<!!(KU#%+Y!%;Y\"&KM+#[M%%[I!%;E\"%+A&"
+ "&+=!'K5(%;5#%;5##[1!#[-!#K)$$+-\"#[-!!*Q!#Z]!&*M+%*Q\"!ZM!!ZI!\"ZM!"
+ "\"Z9!$*=#%*5##*1&#Z5\"$*%##*5\"#YQ\"%I]#$:!!$)]#\"IY*#YM##IQ!$)M$\"I5!"
+ "#I5%$Y5*#I9(\"Y9\"$)9$\"YE%\"II!!YY$$)E$#9U!%IU&#)I#':%&$:-$$*%##J1!"
+ "\"*5\"#J1!\"J1!#Z9\"&:=,$JA!$:A#$*E'$JU$%:A!$:Q#&JU)%JY!(+%'%;!'$J]$"
+ "$+)\"\"[)!\"[1!![%!%[5!%+M!%+=\"&;=''[E$&+M%!;U\"$;Q\"$+M!&+]!&[]#&+]!"
+ "&L!'%<%!)<-%%<-%&<!!'L1\"$\\9('<9!$,A!&\\E'\",M!&,Y#(<=.%LQ&%<U!\",Y!"
+ "#L]\"&]!\"%<Y!'=-(&-%#%M1!&-=#%]M!%]I!&-=\"+MA&'-E''ME)%]M!%]Q!'MI("
+ "\".-!%^!!&]]%%^)!'N-\"%^1!%^1!%^A&#N5!&.E!'.A%\".1!&NI#&.I!&>E!&.Q!"
+ "'>Q&'>U!&?!!&.U!\"?!!)?!\"&?)!&?1!&?1!&?9!&?-!$O)$'_=!'_E!%?A!$/U("
+ "&_U!&O]!'_M!&OU!'/Y#'_Q!&O]!'0!\"(/]!(0!!(`-$(01!)/Y&&P%!,@1!(0-!"
+ "&`9!&`5!(0-'#0-#&P1!(P5)&@1%+P=0(01!)PE&(`-$*`)!*`)!&P%!(@1'*_Y!"
+ "%/]!&OU!'/]\"&OI!&OQ!\"?U!&?9!)?I!'?I$)/A!'_=!&_A\"\"?5!&^]#&?-!&.Y!"
+ "(/=.#O%!'O%!&_-#(.Y)&NU\"&.Q!$^M!&>Q!%NI$'>E!&.A!'>9!'^9#)>5%&.9!"
+ "$^A!$M]!#N)!\".%!'>!\"(M]'%^-!&MU$%^!!']M*%ME!#=E!%MA!&]=!%-=#%M9!"
+ "&]5!%]1\"%M1!(--+*M%$']!!*-%!(\\Y&%\\Y#'\\Q+%<I!&LU!%LI!'<E*$,=!%L5\""
+ "&<)&%<=!%,1!';U&$+]!&;]!(,%.%+]!%;]\"&+Y%%L)\"$[I$$[M$\"+U%%+=\"%;9\""
+ "%;M\"%+=\"%;9\"&+5&%[1!&[5!#[!!$+)!&+!+%*Y&\"ZY!%*A'$*Q\"':A%#ZI\"#J9!"
+ "$ZA\"#*=\"$J9!#J5!$J5!\"Z9!!*-!\"IY!#Z%\"#J!$#9U!$9Q%#YM#$IQ%'9M'$)I!"
+ "\"I-!\"95#$I5&&)5)$9A(#9I!#YM#$YA'#YM##YI#%)Y!!)Y!$Y]#%Z-#!*-$#J-!"
+ "$*1\"$:-!#J-%$J9!%:5!#Z=($:E#':E)$ZI)!ZM!#JM!$JY$\"JY##[)!#[!!![!$"
+ "&+)\"$;)#$+)!#[9!&JY!$[9!(;I&'[A!%[E!%;Q\"&KM($+]!%+Y!'[U$%+Y!%KY#"
+ "'<-!$\\!$%\\)##\\1$%,1!&<5!&<A&'\\9#$LA\"&<E%$\\Y#&LA&&<M!&LY!$<E!#,Y$"
+ "$L]!&M!!%M%!(=-(\"]%$%]1!%=I(\"-5!&-9#%M=!#]=(&]I%%]Y!%]U!%]I!%]U!"
+ "&=I#(>%!%]Y!#=]!$N%!&N1#%^-!&.1!$.9#)N%!&.=!%^=%'>E!$^I!$.U\"$^M!"
+ "'NU'$^U!'.Y%$^]!'O!!&O%\")/-!&O)\"'O-&#O5!'/!$(O9*$/9\"(O=**O=!)/E!"
+ "'?I$#_Y!&P!!%/Q!\"_U\"(/U'&`!!(/]!+05!(0%!'@)#)P)!*`%!)P1!(@-!&P1!"
+ ",@-!(P)#*@1++01!%@1!%`1)(0-!(01!(`-#(P5\"&OY!(01!(`%$(P-\")?U!&OQ!"
+ "&O]!&O]!&_U!&OQ!%/Q!&OM!)OA)*_M-(OA$&?E!%/9'&O-\"'O5!(O9$#O-!&?)!"
+ "$_%!&.Y!&?!!)?%('NE!'>A!$^U!&.M!&.E!(.I$'>E!&.Q!&.=!(>A+(>1!&.9!"
+ "*N-%%^-!&.%!\".-!%^!&%]Y!$MY!(]U#&>!#']E*&-I0%MA!%M-!'M5$&=9$%-9$"
+ ")]93%M-!%M%!$=%!&,]#%M!!%<Y!',Y#(<U-',Q#&LQ&%<I!#<E&$L=\"%\\A#$,5!"
+ "!,A!%<-!$<-!%<5!%,)!%\\)#%<!!%+]%#+U%&+U%%;U\"$KU#\"[I!&+Y%%KE#%+Q!"
+ "$;=\"&K9$$+5\"%+)\"#[-!#[)!$[)!#[!!$;!\"%:]$$*Q\"%ZQ*$*I\"#ZY!\"ZE!#Z9\""
+ "\"*A!%Z=#%*1'#J5!$:1'!*9!$Z)#$*-#$Z%\"#I]!\"I]!$IY\"#9I!#9Q!#IY!!YE!"
+ "#Y1#\"I1!\"I5!!)=!$I=#\"9A#$I=*$9I$#9M!&IQ.$9Y!$IQ%%J!)$Z!&#J%$$J-\""
+ "\"J)!#J-!!Z%!%:5!!:9\"#*9\"$:U$$ZE\"#JE!#ZQ!&JQ*#+)\"\"ZY!%+!&#[-!#[)!"
+ "#Z]!#+%!\"[-!%[5!$KE#$K=#%+5\"&[=!$[E!%;I\"&KM,'+M!!+Q%&;Y&%+Y!'[]$"
+ "$+]!&L-'%L)\"&\\-()L5+%<5!%<-!',9)%<E!&\\9(%<=!%\\I#%<M!(<Q$&LQ&&\\Y'"
+ "%<Y!&LQ!%\\U\"'M)*%M)!&]-&*-!!(=5,%M9!&]=!&]E!&]E!&=E##==!'-I&%]I!"
+ "'MY#%]Y!%]Y!#>!!'>%'&.)!'.-!'>)''-]&&.5!&N=#&.=!&.A!%^=&'NI''>M!"
+ "&.Q!&.I!&?!!&>Y!&?%!)O!$&?%!$_)!%?-\"%/1!&?9!&?5!'_M&(/=(&?A!)/E!"
+ ",?E\")_U\"*_Y!'OI%&_U!)?U!&?E!'?]#&OY!(0%!&OY!+01!,`)#)`-\"$`-%,@-!"
+ "&`5!)P)!&`=!+@5('`1,.@-6(@-!,0-&'@)#(0)!*P)%'_U!+O]$(0!!\"?Q!(P!)"
+ "!/E!'0!\"&OQ!&OU!%/M!%O]\"\"_E\"'OE&'?I$'?=$&?9!%/5!%O5#&O1!'O)&&.]!"
+ "&?%!(?!$(^]!&_!#%.Y!&.Y!'NQ'&.Y!#NE!&^A$&.A!$^=!(>A+&.9!&.9!#NA!"
+ "'.)!'.%&$N)!(=],&-Y!'-Y&&-]\"'=U(%]Q!%^!!%]I!&=I$\"]A#'-='%M9!%M-!"
+ "'=%(&-)#'=5$*-)!%M%!&=!$%,U)&<]$%LM&%\\Q#',M#$LI\"&,I#\"<1\"\"L=#'<=%"
+ "%<9!&<5!%\\1#%,%!%K]#%,%%%<)!%;]&#,!!%;U\"$+U!\"[I(\";=\"%[A%%[E!\";A\""
+ "%KA#$K=$%+1\"&+1*'+-/%[))$[-$#ZY!#J]$&JY!$*U\"#ZU!$*I&$ZA\"$K!$#J9!"
+ "\"ZA!%Z=#%Z9\"$J5%&:1!%:-(\"J!!#J%!%J-&#J!!%*%$%YY#$)M##YU\"#9A!&9I*"
+ "#Y-#\"I5!$)='\")%\"#9=!!IA##Y=#\"II$$9I$\"IQ!#)]&#IM%$9]$%:!$$Z-&#J%!"
+ "#*%\"#J-!%J5\"#J9!#JE!$*=\"#JI!#:M#$JM%\"ZQ!#[!!%:]'#*Y\"$[!)\"Z]!\"ZU!"
+ "![1!#K5#%K1$&+%'%K9($[=!%;A\"%K=#&[I!';I\"\"KQ#$+M!$+Q!'L!#$;Y\"%+U!"
+ "'[Q-%<%\"&,%)&L1&&\\1(&<5%#<1!%\\%,&<=!%\\A#%LI\"&,Q#&\\M\"%<I!%\\U\"'\\Q&"
+ "$L]\"%M!!&M%!'-)\"&])&%]%\"'=5(%M)!$]9\"%M=!%]A!)=E!%]I!&=Q(%]Q!'MU)"
+ "%]Q!&-Y')>%%%^%!$N%!%^)!'^-$&N1#&.)!&^5%&^%%&.=!'NM'(>E+'>I!&NI("
+ "(^Q!(>I%&.Y!&.Y!(^Y!'_!!&?!!'/))%^Y%'_A!#O1!&?=!&?=&&O=!(?=**/5+"
+ "(/E!#_M!&OE'&OQ!)?I!&OQ!'OM%&OU!&O]!%?]!)@%&*_Y!%@%!*`%!)P-!(0)!"
+ "*@1$(/]!\"@9!&P-!*`1&,@)!(0-!&P!!)P%!*`%!&/]$(/]!*@!%&_I\"(/]!#_Y'"
+ "\"?]!%/U!&OQ!*_Q(&_I\"%/I!'/E*(_A%&?A!&?=!&?9!'O5!&?1!)/-!(?-)\"?)!"
+ "'/%$*/!!&.U!&>]!&.Q!'NY'&>Q!'.M%&>Y!&.E!#NI!&.9!'>9!&.%!&.=!'>-!"
+ "%^-!'.%%'.%%$N!!%]Y!%]E!&MU$$MM!(-U*+-I)$MI!%ME!%ME!#=5!%-5$&-1#"
+ "&-=\"&M5%%=)%#=%!(-)\"%M!!'-!(%\\Q\"#LE\"&LQ&$<I!%<U!(\\A0'\\I&'<=&$L9&"
+ "(\\=,&<)*$,1!'<)!%L%'\"<1\"%\\%#%+Q!%+U!%;U\"$KY#)+M!$[I!%[I!%;U&%+A!"
+ "$+=&$;5\"\"[=!\"[!!#[!!&;-(%;%'#Z]!%:]'#ZY!$K%'$*Y\"&*Q'&JI*&*A(#:M#"
+ "$J5!#Z=!$:9#$J5!#Z)\"\"Z9!$*1\"%)]!#9U!#J%$%)]'\"9U#\"I]!$9Q!%9M%#I9\""
+ "#)1#$(]$\"Y5\"#YI#&91'#YA#$9Q!#9Q##YM#&9Q*%YU+$Y]#$)]##J%!#J!!%:1$"
+ "$Z)\"#*5\"\"J1!#J5!#J-!$*)#%ZA*$JE!'+!/%JA%$:E$!ZU!#ZU!&[!&$J]!$[-!"
+ "$K!$$+)\"#;9\"$;1\"#+5\"$[%!$[-!%;A\"'K9$#[A!$[E!$[Q%$;Q'&;U'%;Y\"&;]\""
+ "!+Y%%\\)#$<%!%\\%$&L1\"%,1!&L)#%<9!$,=!$<)\"%L=\"%\\I##,E!&<M!(\\U&&,Y#"
+ "$<U!*-%&%M!!']%+%M)!%M1!&=1$&M)!%M9!%]Q!*MA,%]I!%]Q!%]Q!$MM!%]I!"
+ ").!%%^%!%]]!#>!!%N%%\".%!&-U!'.!!&^1%&NE#&.9!'.=&&.A!&.E!)^E&(.Q$"
+ "+>M!'NQ!&.M!&NY\"&?!!#N]!&?!!'/-$(_)!'O-&%O1#+/%%&?5!#O=!$/E\"*OA!"
+ "'_A!(?U\"&?E!'_E!&OU!&OQ!%/U!#_M!$@!\"'_Y!&O]!\"@%&&`-!&P)&#_]!(0!!"
+ "(0%!(0%!(0!!&/U$&P1!*0%*(0!!)P%!(01!+/]((0%!&`!!(/]!&OY&%?]!!/]!"
+ "&OY!$OU$&_M\"&OQ!%/E!)/A!+/A#%O9#&_9)&?5!&?-!&?5!&/-&$_%!&O)(&?%!"
+ "(/!.&.Q!&.]!&>Y!&.]!&.Q!&.M!).I\"'>I!&.I!&.A!#N=!).=#$N1!#>)!&.=!"
+ "'>9!%^%!%^%!&]]%%]Q!%]U!#]]\"$MQ!$]E,#=U!&]A!$MQ!%ME!%M5!#-9$%M)!"
+ "%M1!$]9')M)2&=)$#=)!&<]$%<]!&,I#&<U$'LU!'L]!&<A%&\\E\"%<I!&<E%&<9!"
+ "%<5!%\\A#%,%!'<-!#L)#%,!!$+U!\"[M$$KY'%;U\"\"+Q!$KM#%+U!&+E&%;E\"$+1%"
+ "$[E!&+9*#[E!$;)#$+-)#[!!#[%!!+!$$*]\"#[%!$:M'#ZI!$ZM%!ZY!#JI!!ZU!"
+ "$:E##J5('*9)%J1\"$J1%&*-%#J!!%*)'$*%#%)Y''*1-\"J)##)Q%#9Q!$*!#$II%"
+ "#9)'\")5\"#Y=#\")=\"$9=%$Y='\"9M##YI&#IY!%I]&!YQ!#*!#\"IU$#YQ#&J!#$*-#"
+ "$J=!#Z-%$:)(#Z-\"$J9!$*M\"$:=#$Z5\"#JE!\"ZI!%:M+$*A\"%J]!#ZU!$Z]%#+!%"
+ "$*U\"\"[!!%;-'#+1\"$[I!&K1(&K9('[=!%+E!%;M\"%[I$$[I!&+U!&[U)$<%\"&,!!"
+ "%,!!(,)-$<)\"%<%\"#<)\"&,1%(<1*%<9!%<=!&<A%%,9%'LE!$LU\"'<Q)%<Q!$<M!"
+ "$=!!#<]!%M!!'=%$%M%!%M-%%])\"&=1$&]A!$M=+&=E$&-A#&=A$&]E!%]I!$MQ!"
+ "'.!%)=Y!&]M!(-]*%^!!&.)!'N-(&>!#&N-$%^-%\".%!&.=!&.5!%N=$&^=$&.E!"
+ "&.Q!&.Q!).]-'^U().Y!(^]!$^]!&?!!&?%!&?-!&_-#&O1!'O%!'_5''O-!%O-#"
+ "&_A\"*/U+&?E!&OI!'OE&&OQ!(/]!%/]!&_U!&OU!&OY!&OQ!&OY!*0!#)?]!&OY!"
+ ")`!))@!!)?]!(/]!)P%!%`%#)?]')@!!(_Y$&O]!,P!0*?Y1&_Y!&OY!&_Q!(/Y'"
+ "&OU!&OI!\"?I!&OQ!'_9''_9!&?E!%/=!&_1\"&_5#+?1%&^]#&?-!&?)!*?1!&?%!"
+ "'.]%'O%!'NY!*N]\"'.Y%&.M!(^Q!$.M##NE!&.A!'>A!#NE!&.5!&>E\"'^-#%^)!"
+ "%^1!%.1')M],%]]!#^!\"(=Y!&]M!%]I!%]M!$MI!&]E!)-Q*%M1!%M5!)-5&%]5!"
+ "#=1!$=-!'-1''])!'-!(%<]!%\\]\"&LU!%<Q!%]%\"%<=!$,9)$<M!%<A!$L=\"$,=!"
+ "#<-\"$,A!&<)&%L1\"%L)\"(<%/$<!\"%KY#%+Y!&+U!&+Q!#KU#&[E!$[E!&KA(#[=!"
+ "%+9\"'+=&$+5\"$;1\"%K1((+)'$;%#$+!\"\"ZY!$JY!#ZU!#ZQ!$*M\"\"*I!\":E\"$ZU%"
+ "#:E#$:M'#*=\"\"J1#\"J!$#J-!$:%!#Z)\"&Y]!')Q'$9M!$)U##IU\"\"IQ!\"IY!#YI#"
+ "\"Y=\"%95&\"I9!#Y9&$YQ#$)I!$9M!#YM#%IQ'%IU-$)M$!IU##IY!\"9]#$)]##J!!"
+ "$J)\"#Z1\"#Z1\"$:1#$Z9\"!*9$\"Z=!$:=##JI!$ZE\"%*I\"$*U\"%[)!#ZQ!!ZQ!&+!*"
+ "&[%&#[1!%[1)\"[=!\"+%!$[5!%;5\"%+=\"$;A\"%;I\"%KI');M+$+Q!#+U!%+Q!%<!\""
+ "',))*+Y%&,%!$\\)#%,-!%,-!%\\5#%L-#%<1&&<A%%<E!%<I!&\\M'%L5&&<M!#LY\""
+ "#<M!%\\]\"$LU\"#=)!%<U!\"-5!']9+%]1!%]A'%M1!&-=#$]5'#=I!&]Q!%-]#%]M!"
+ "'-M'%]U!%]]!%]Y!%^!%%>%#)^)!%.)\"$^9!%^1!%N5%&>E\"(NA!&.A!&.E!\"^E#"
+ "'>M!$^M!&.Q!'>M!*NU.\"_)\"*.]!(^U!,/%/'?)%'_-(%/=!&?5!'/9#&?9!&?9!"
+ "*OA!&?A!%/E!&?A!&OM!)OU.'OE%'?M$#_I!,?Q\"'_U!&P!!\"?Y!\"?Y!*/]#&O]!"
+ "(O]*(?](&P!!(0%!(0!!'@!#*OM!)P!!&O]!'P%$*OU2&OY!&OY!&OU!'@!##_Q!"
+ "*OQ&&OI!%OM\")/A!(/E!&_Q!#OA!'O5!'/A#*?)!&?-!&O-\"&>Y!&?%!&_1\"(/!("
+ "(_%!%.Q!'NY!&^M$(NQ+(>I*(NM!&NI#)^E!%^1!)N%!%^)!&.5!(>%!&>5''>-'"
+ ")=Y!'.)!%^!!&.%!'MU#$]M!%]U!%]U!&-I\"%]I!&-E\"'-A!$M=!%MA!&=5$'M=$"
+ "%]5\"&=-)$<]!%M9!%<Y!(,]\"$<Y!%M!!&<Q$%<M!%L9\"&<=&%<E!\"\\=$%<=!$,A!"
+ "'<5%%<5!%L!#%;Y\"&L%')<!%&;]\"$<)!%+U!$+U!$[Q$$KM#%;5\"%+9\"#KA#&[E!"
+ "#[9!'K=-%+1!#[1!&+%\"\"[)!#[-$\"[)!#+!\"$ZY%%+%&$ZQ!$JE!#*A%#JE!#Z=\""
+ "#JM$!JA'#J=!#ZA\"!:-\"#J%!#Z-\"\"J%!#J%!&YY(!Y]!\"YU%#YQ#!)E!\"YI($)I!"
+ "#99!\")%\"#95$\"I9!%9=&#9A$#YE#\")A\"#IQ\"%9M%#)Q\"&YQ$%:!!%I])$Z!'#Z%\""
+ "$:-#$*-&#J1!#J=!#J5!%J5)&:=,#*E%\"Z5!$*M\"%JU$&*U'%:U($+!\"\"ZY!%;)#"
+ "#[1!#[-!$+-!$[-!%+1\"&+5&%+=\"$[9!'+1\"%+A!$+I!$+M!'+Y!#+U!$,!!#+Y!"
+ "%+]!%[](!,-%&\\-(%\\%$%<)!%L5\"#<=\"%L=\"&<Q$%<]!%LE\"'LI*&\\M'%LE\"$\\U#"
+ "&LY!'<I)%<U!%]%\"%M)!'=9#%-%$&=-$&-E\"(-1!%M=!&-A\"$ME!(-I!']I*%]M!"
+ "&-M\"'-]!&-]!%]Y!&.!!%]Y!(>)!$N-!(>)%%^1!'>5!'>-'&.A!'>I!)^A!$^=!"
+ "&.Q!&.M!&.M!&?!!&.Q!&?%!&?!!#O!!&?!!'?1*#O-!&?)!#/5$)/5!'?1*&O9'"
+ "(_M0(/=\"&?A!)?E!)_9*'/I#&OI!&_M\"#_Q!(/]!*_U!'_Y!)?U-&P!!(0-'(/]!"
+ "'?Q$$?]\"&O]!'P)$(/]!'@!$+OU+&OY!&O]!'OQ%&O]!&OY!'_U!)?I!&OQ!(OM*"
+ "+/I)+OA+&?=!)?E('_E!%/=!&_=\"%_=$*/5%&?1!'?)%&?-!(O)0'O!!&?)!'.]$"
+ "&>]!&N]\"&^U#$^M!$^Q!&NE#'O!!*.E2&.Y!'>A!'N=,%^-!&.5!%^1!'.1!).)*"
+ "%.!\"(^-#']Y$%]]!%^%!'-U!%]Q!&=Q#&]A!'MI))-A+%=A$(==\"$=5!%]-\"%]1\""
+ "$=1!&-5#%-)(\"])$&M!%$L]\"%<U!%,U$$<M!(,Y\"$<A!)\\I+%LA\"#LI#%,-!%,-!"
+ "'<%&%,1!$<-!'\\-##<!*#,!!#,%!%,%!'+]!&[U(&+U%$[Q%%[I!&+U%$[5!%[I!"
+ "$+9\"$[A!&+1\"$[1!![%!$;)\"#[%!!Z]!#Z]!$JE($*Q\"$*Q\"%JM%$:M$%JE%#ZA!"
+ "#ZA!#JM!\"*1\"$JA$#ZI\"%:5!#Z%\"&J%#$I]\"$)]#%)]$$YY'#IY!!I]##9I!$IU%"
+ "\"I%!!)%'$)9!$)9!#9A$#)=#$9A!$9E!#II!$YM&#YM#$II#%IY'#IY!$)M#!*%!"
+ "#:%'#J-!#Z-\"%*1'&ZI'$J1%#J=!%*A&$*U\"#ZQ!\"*Q!#JI!#:U\"\"*Y\"$[!!$[!!"
+ "#[!%&[!&&K)!$K1$$;)#&;A'&[5!%[=!%+E!%[A!%[U$&+I)$+I)&+Y!%;U\"$[Y$"
+ "&[M)%;]\"),%%#,)!#,-!&<1!%<=!\",5!&<9%)<=2$,=!%<E!&<=!&,U#%\\Y\"&,I$"
+ "&LY!$=!!&=!$%M)!%<U!%M9!'-1'%=5$%M)!%M9!%]A!)]E)%ME%%]I!'-Q!%ME!"
+ "&=M#&=Q#']Y$'=]'(>%!(N!()N%!%^)!'N%.(.1*%^1!'>9!(NA!$^I!'>E&%>E#"
+ "$^I&(.M)&^Y#(NU&(NQ+#>I%*?1!&^]#&?!!&.]!&?1!&N]\"%/=!'?)%&?5!'O)'"
+ "&?5!*?9')/=!&?A!'_A!'_E!*O],&?=!'_Q!'_I!)/Q,&OI!%?Q!(0-!&OY!'/M#"
+ "!0!!)?U!,OY*&OU!'_Y!(_Q+(?Q\"$/U!%/U!&OY!&_I\"&OQ!&OQ!$OE$'_I&#_9!"
+ "%/=!'_I!'_M!-/A'&OA'(/A!&?9!&_5\"&?9!&?1!&?-!&?-!&.]!$_!!&O!\"$^Y!"
+ "$^]!'?%&&>Q'&^U$'.M%$^M!)>M#(NI!)^E&&.A!&.=!(N9&&.5!&.9!%^)!&N%$"
+ "&N1#%^!!&-]!&M])%]Y!(>!!+=U*%]I!#]I#%]I!%MA!'-A!&-=#$]9\"$M1!%M)!"
+ "&M)%$=1!&-%$%<Q!%M-!%M-!%\\Y##LU\"\"LU#%\\U#(\\I\"%<=&$<=!%<A!&<Q$%<A!"
+ "%<5!&L1&&<%!'<)!&,%!'[U%#;]&\"+Q!%+Y!\"+M!$[I$$[M%&+A&$[5!%[A$$[I!"
+ "&;5\"%;!'#[1!#[1!$;)#![1!#;%&$+!\"$JU!\"ZY!$K!$%*M\"$JM$!*E$$JA!%JM("
+ "#J=!#*9\"#*9\"$J5!#:1##J-!!J)#$*!##J!!$)]'$IU%$Z%\"#II(\")I\"#9Q!\"IE!"
+ "#9)!\"I-$#Y-&#YI%#YE&$99%\"YA%#9A!\"I=!#YE#%IM&&IU$$9Y!&9])$)Y#$J)!"
+ "\"J-!!*%!$Z-&$*9&%:-!#ZA\"#Z=!':A)$:A#%:5!#JI!#JI!#ZU!$*Y\"%*U&\"Z]!"
+ "#:]\"#[%!$+5\"$;-#&+1&#+5\"$[5!#[E!$[I$#[A!$[E!%[5!\"+M!$+Q!$+Q!',)%"
+ "%,%!%,%!&,%%%,!!&<)%%,)!&,1$#,-!#\\9(%L9\"$LE\"&<M)%<1!&,E(%\\]\"#,]!"
+ "&<U$',U#$=%!*<Y#%]!\"&M)!%M!!%M1!%M1!&==$&-=#%]I!%MA!%MA!%]M!%]M!"
+ "'-U!&-]!%]Q!)=Y&%]Q!'.!!%^!!%^)!%^1!\">-!&N-$'.)!'>9!(^=!$^5!'^A("
+ "'>A!&.E!$^Q!%>Y\"(^Q!'>U!&>Y!&.]!'O!!#_!!$_)!#O9!&O)!&?)!)O9#&?1!"
+ "&?9!&?5!%OM\"'/=#&?E!)/=!'_E!'_A!(O=$*OI!%?M!'?M$%/=!'?Y$&OQ!(/Q("
+ "(_U+&OU!&_U\"#OY%&OI'&?A!&_U!#`!&(_Q%&OQ!&OQ!&OM!&OI!'_I!%_I*)/E!"
+ "&?E!%OA#)?9!&?=!\"?Q!+/5*&?5!#O5!&?1!&?-!(?-/'O)&&?)!&?!!&?!!&.]!"
+ "'.]$(.U#&.Q!(^Q'&.M!&.I!&NI#&^U)&NI#&.=!$^9!'N9'&.5!%^-!&>-\"$N!!"
+ "+.)(&>!\"$N%!%]]!%]U!%]U!(-Q%&-Y\"%ME!\"]E#$MA!%]1\"(=9\"'M=$&=5$%]A!"
+ "'--#%M!!&-%$'<]$$\\U((LY*',Y#%\\Q\"*,U&%LM\"%<M!&,M#'<A!&L=\"$\\-#',9)"
+ "&<1!&KY'&,1$#,)!%+M!'<1!%,%!%+Y!&;U&$+Q!$;M\"%+I%%;M#&K-$&[I!'[=%"
+ "%[9!#[-!#[5!%K1$%J]!#[)!\"[!$$J]$$JQ%$ZU%%:Q$$JM$%*E'%JA)$JE!'*=("
+ "#J=!#ZA\"\"Z5!#JA!\"Z)!%:%(%Z)##J%!#J!!!Y]!#IY!%)U$\"9M)#9E!#9I!%)E$"
+ "#I-%#9%$$9A%\"I5*!I9&\"YA%$Y='$YI&#IA!\"YE\"$)Q$#IY!#IY!$*%#$*!#$:!$"
+ "\"J%!#J)!#J-!!Z1!$:)!#JE!#JI!#J9!%:Y#$*I\"%ZM*$ZI&#*E&$ZY\"$Z]%#ZQ!"
+ "#[!!#[)!%[)!#[-!$[-!#[1!%[9!)[E!#+Q!%;A\"%KQ#%+E!$;M\"$+]!'L%#%+]!"
+ "(+]%&L)'%,%!%L5#);]'\",%!%,1!$,)!&,5%%,A$%\\=#%<E!%<I!$,E%#,M!$<I!"
+ "(-%''LE&%<Y!$M!&%-%$&M)!$])\"%M5!$=9!&-5#'-9\"'=9(&ME)'=E\"%]I!$MI!"
+ "%]M!(-U%&]U*\"-Y!&]]%%]]!$MY!'>!!*.!$'.%!&N1$\"^)#)>9/&.9!$^=!&.A!"
+ "&^=$&^I$%N]#&N=#(^U!$^Y!'>M!&.Y!$^]!$_)!&_)#&O!\"&?)!$/!\"%/-!'_A!"
+ "(/5)#OA&'_9!'_=!'?=$#OA!(O9$&?=!'_E!*_E)&?9!&OQ!)?M!&?E!*/M+&OM'"
+ "%/I!'_Q!%/U!'OQ%'0%)&OQ!&_U\"(/E(&OU!&OY!&OM!\"_I\"(?I#'/E#'_E!'_E!"
+ ")/A&&?A!'?E$&?=!&?9!&?E!&?9!&/A%&?1!%/=!&?)!%/1!&>Q!$_!!&.]!'>M&"
+ "&^Y#&.U!&.Q!'O)!&.E!&.I!'NE!$^M!'^9)'^1#&.9!%.5\"%^1!(N-!%^)!%]]!"
+ ")=Q,%^!!&=]#&]Q!%]Q!\"=Q!%]M!(]I$(M9)$MA!%M=!&]=!%M9!%M)!&=1$%M)!"
+ "(-)\"'=-)\"M-\"),]\"%L]&#,Q!$<U!),Q($<M!&\\I+%<M!(,=-)<E3&<=!',9(&L-'"
+ "%L1#(\\-(&,)%&<-!',))$<!!%+]!%;Y\"$+U!#+Q!$KY#%;A\"'[E$&KA(%[=!&[9*"
+ "%+%\"\"[5!$[%%#[1!#[-!&+%+$[!&$*Y\"$JY$%*U&#:U#%ZQ*&:Y,$JI$$*=\"'*A#"
+ "$*M\"$J9!$J5!!*%$#J5$#Z)\"$)]##9Q!$)]#$IY%%9Y(%9M\"#YQ\"$IM%\"Y=%%YE!"
+ "%I)!\"I5!#I5\"#9A$\"9E##)E##95!&9M#!)Y!%9M%#IQ\"#YU\"$9Y!')]0%*%$$Y]&"
+ "#)]#$*)##:5#'J1.%:1(#J%!&:=!#JA!#ZE!#J1%!JA##*E\"\"JQ#$*U%$JY!$*]\""
+ "$*U\"$[5%$+5\"#;5\"%Z]\"$+-!$+5\"%;5\"%+E!$;E\"%[E!%;A\"$[I!$;Q\"%[U%&[Y)"
+ "&KY'%;]\"%\\!#%<%\"$<%!$\\)$&L)\"%<5!(<A%%\\=#%L1\"%\\9#!LE#%<I!%<I!$<Q!"
+ "%<]!%,Y-$=%!&-!((<U)'L]!%M)!(=-#$=)!$=5%'=5##==!&]A!(-=!(]E/&]E!"
+ "'=A(%]Q!$MU!%]U!$MY!&-]\"'N!($N%!(.%%%^-!%^)!%^1!%]Y!)>I/%^9&&.A!"
+ "&.A!&.E!*^Q+&.U!&.Q!&.M!$^=!&.Y!'.U%&.]!&_!#$_%!(?%*'O-!&?-''?%&"
+ "+?5+(O5*&?A!&?5!(/%(&?A!&?=!'?E$'_A!&/E%(/I!'_E'&OQ!)OE\"&_9.&OM!"
+ "&OM!&OI!&OM!%/U!&OQ!%OM)&_U\"%/M!'_I!$?I#&OU!&?E!%?E!&?A!'_E!)OM\""
+ "%/=!'_A!%/A&&?1!&?5!'O5!%/-!$_)!&?1!%_-$#O!!'/!$&?!!&?%!&.M!$_%!"
+ "\"_%#(.M)&.Q!'>M!'^E#'.Q%'>A!&>A\"&NA#&^=$&.A!&.5!(>-&&>)\"'>5!'.A&"
+ "%^!!%>%#&-Y!&]Y%(=I'%]I!%]I!*MI!%]I!&]E%%]5!%M=!'M5$&-1#%M1!&]5!"
+ "(=9'%M%&%M1!']!&%L]!%\\U\"%<Q!%<Q!&<Q%%<5!&,E#$<A!&<9%&,E-\",1!%,1!"
+ "%,1!'<)!',!)&\\!#(<)!%,!!%+Q!&,!)\"+U!'KQ'$[M$$[9!&;E\"%+M!(;='&K9("
+ "%+-\"!+1!$+1\"#+-\"#[)!$;%#\"[!!#:M#$ZU\"\"ZU!#ZQ!$*M\"#*I\"#ZE\"#ZI!%:I$"
+ "#*=\"$*5##*5\"#J1!%:%(#J%!$:1!%Z1#\")]%$IY&$)Y##9M!%9Y&#YM#%)E(%)E("
+ "!Y)$\"I-!$I9#\"I9!\"I9!$I%#$I=&#9A$#9I!%)M$$9Q!$:%!%)=%$9Y$\"J!!#Z!\""
+ "!:%&&*)(#J-!&:5)%*9##:9##*=\"!*1!\"ZA!$*A##JI!$JM%$*Q\"%JQ!&:I$!Z]!"
+ "\"[!!#[%!%+%&#K)$\"[-!\"[1!$[5!$[9!$[5%%;A\"%+M!$;E\"#[I$%[E!#[Q(&<!\""
+ "%+Y!%;]\"'<!*%,1!%,)!'<%%&L1&%,)!%<5!(<9%%<A!&\\I\"#<=\"'LM!&\\E#&M!%"
+ "&<Q$&<U$&,]#']-&$L]+$]%\"%<]!(--\"&])'&--#'--'&-9\"%M=!&MA$'-Q&&]Q!"
+ "%]Q!&]E!&]M*)=U!)=Y!%]Y!$N%!'.%!%^%!%^)!$^-!)N1!(>-%&.9!%^-!(N=!"
+ "&.A!&.Q!&^=$)^Y+&.M!%.E\"&.M!%>A#'.Y%'NY!'N]!'?!%&?%!)?%(&O)!'O-!"
+ "-_),*/1+&_=\"&?5!$?9#'_=!'_=!'_=!&?=!'OA&%OA#)?E'\"_E\",?E6)?I!)?U!"
+ "&/I0'_9!&OI!&OM!(/]!&OM!'_M&)/I,'_M!*O=!&OQ!*OE!#O1!&?A!&?A!&?1!"
+ "'_=!(_5&*?=&&?1!&?-!$/-\"&?-!'?9%&.]!&?%!)O%$#O!!(.U)&.]!&.U!$^U!"
+ "&.U!#NU!&.Q!&.E!'>9!$^M!(>A+&.=!(>A+&.9!'.E%%^1!$N!!'.)!(>)!%^%!"
+ "'.!!#-])#>-!&MU%$MQ!&=E$%-]#%]M!']E*(-A!'-='&]9!&=1$&]1!%]5\"$=-!"
+ "%]%\"(M9.!=5\"%<U!%=%)&\\U&&<=&(]!!%\\I#&\\Q\"&LE!%<A!&,=(%<5!%<5!'<9%"
+ "&,1%%,-!%,-!$,%!%+]!&<)&$,%!&[U)$KU##<%\"$+M!$KI#&;=#$;A\"#;I&$[A!"
+ "$+5\"%K5$#;-\"#[)%\"Z]!%[%%$[!!#Z]!&JY,$+%\"#ZQ!$JA$%:A##ZE\"$J9!#J=!"
+ "$*=\"#*1%\"Z=!$*1##J-!$:)!\"Z%\"#I]!$*%#&9Y)#YQ##9M#$9U!!)M$\"IE!$9E%"
+ "\"I)!&I-(#Y1##I9%\"Y-\"\"I5!\"IA!$)9!#9I!%)I!$)M$\"IE$#IU!#YY)#YY\"$J!\""
+ "\"*)%\"J)!$:1$$Z)&$:1'$J5!#J-!$JI$$*M\"\"ZE!#JI!#*Q\"%*Q'#;!#$JM$#Z]!"
+ "%+1\"&+!&$+%\"#[)!%;-'#K!$$+1\"$+9\"';9,%+I!&+I%$[E!%[A!$;I\"%;U&#+]!"
+ "%L%''KY+%,1!(<%/%,%!&,!!%L-\"&,-$%\\1#%<=!%<A!&L=&&LI!%<Y!&LQ&'\\Q+"
+ "&<I!%LQ&%M-!%<]!&\\]&&]%''L]!&])&(<Y-']1&&==$$=9!'==#&-=#(-=!%]I!"
+ "$]I\"&MM$)MM!#=]!'M](\"MY'$MY!%^!!%^)!%^)!'.)!'.-!%^1!'.1!'>9!%^)!"
+ "$^5!%.E\"&.A!'>A!(.Q#&^Q$&^U#'.Y%&^U#%NY#&.M!&.]!(>U*'O)&(.])&/)&"
+ ")O-#'O!!%O1#&?)!'O5!'?1%'_=!)/9!&_5#&?9!&?E!#O-!'_9!'_E!-/A&)/E!"
+ "'_E!(_U$'_I!'_E!&OM!*OE!(OE$'_=!'O1!+/A0&OI!&O9!&?=!%/-!(_9%&?9!"
+ "%/1!)_5$+/5$'O)!(?1$)/1-*_1\"'O%'&?!!$_)!*.]2'N]!'>Q&&.Q!(_)!&.Q!"
+ "&.M!&NQ\"(NI!'NE''>E&&NA#$^=!\"^=#&.9!\"NA\"'.1!'.)!%^1!'-]!$N%!%^%!"
+ "%]Y!%]U!\">!!%]Q!%]Q!%]Q!$MA!&]E!(-=!&]A%)-5!']9*&=5$%M)!%M!!$])\""
+ "%]1\"%\\]\")\\]!',Y#'<Y$'LU!',9('\\]+%<M!%L9\"'LE!&<A!&<-!'L=!%<1%%L=\""
+ "$<-\"%L%#%L)'$,%!#,!!';Y!&+M!&[I!%K]'\"+M!&[I!$[9!';M'';A+$[5!(;9#"
+ "$[1!\"[1!&[1*#[5$%+%\"'J])%[))%Z]%%JY!$*Y\"#ZY!!ZM!%JI%#JE!$JE%#Z=!"
+ "%*5#%*5'\"ZE!#J1!#J)!#J-!\"J!$$Y]#$)]#\")Q\"&)I%$YM#%9M,#IU!#IE\"&)E)"
+ "#9)!\"I)!\"Y9\"!Y5!#91!!)5!\"9A##IA\"#9A!$)I##YM##9U!$9]$\"Y]\"#I]!!)]$"
+ "#:9#$:)(\"J%!%Z1*%*%$$:5$%Z9\"#JA!#ZA\"':E!#JM!!ZY!$JQ$!ZU!%:U'#ZY!"
+ "!ZY!$K!$$+%\"$[)%$K9$\"[1!#[=$%+9!%[A$\"[)!&[A)&+E%$[I!$+M!%\\!$%;U\""
+ "%+]!&,!%&;Q\"%<!!&+]!%L1\"%+Y!(L1!)\\9\"&<=!%L=\"),E##,A!%LI\"%LI\"%<Y!"
+ "%\\M#%<Y!)M%)'LU!(,Y'%M!!&M%!%]-\"%L]!%M1!%M-&$MA!%M9!%]I!(]A*#=E!"
+ "%]I!$-Y##=M!(-Q!&^%%%N%%$]]!&>!\"%^)!%]U!'.)!&^-*'N)\"'.-!&.=!'N5("
+ "&.=!'.1%(NA!'N='&>A\"$^M!&.A!&.Q!&.Y!'^U(#NQ!&.]!#^]!'_1('O%!)_)0"
+ "$_)!&/1%&?-!'O1!&?5!\"?=!&/5*'?=$)?A!&?9!&?=!%/A!&O5!&?=!&?E!'OA&"
+ "%/M!&_A\"'?Q$&?A!#OA!&?=!%/A!)/A!'?=$\"?=!&?=!(?=)'/E#&O9!&?9!&?5!"
+ "&?5!%/A!&_1\"&?1!(O-*'?)%'?%%'O%!'_)!(O!+&?!!*N])'.]$$^U!&^U$&.]!"
+ "'>A!$^Q!&.=!&.E!'>I!'.I%&.9!&.I!$N1!&.1!'N1('>9!$M]!$N%!&>!\"(N!-"
+ "\"]Y#%]U!&>%#\"-Q!%]M!&-9#&]]%)-A&%MA!%]=!&-9\"&=9$%]5!(-E!&\\Y\"%<Y!"
+ "%]1!&M!&&,]#&,]#',](&LU!#,Q!'LU!%<I!'LI!$<9!$,=!(<5%'<9*',9$#,5!"
+ "&,%!%<%\"$,!!(<!+&\\!(#,%!%+U!%+U!$[=$$;M\"%;A\"'+A!$[E!'[=.%[=$$;5\""
+ "\"[5!'[1*$+)!#[%!$+)!#ZU!$*]\"!*U!#ZU!&ZI##ZY!%ZU)#JM!\"ZA!$:E$$:I$"
+ "%:9!\"ZA!&:1!#*50#Z1\"#Z-\"$*%#%)]'%J-\"#YY\"#9U!#I]!%9A##9I!%IE&#9E!"
+ "#))#\"I-!\"I-!#)1#\"I9!!)9!#9I!$9A$$)I#%9I&$YM#$)Q*$IU%$*!##J1!$:!$"
+ "#IY!#Y]\"%:)!$J-\"#J)$%J!&#JI!#J=!\"*I\"$Z=\"%JE(!ZQ!$JM!%:Q(%*U&$ZY\""
+ "*+%,#[-!&Z]\"$+%\"$+)\"\"[)!\"[1!%[E!$[9!&+=!$+9\"%[E$$[=!$+Y!$;Y\"'K]+"
+ "&;U'$;U\"&;]*#;]\"(;]!%,)!',-%%\\1#%<9!%\\=#'\\%,%<9!'\\A\"%<E!&,I#&,E$"
+ "&L]!'<Y)$,Q$']!!%<Y!&L]!$M!!%-)$&M-!&=)$'-9'$]5'%]9''MA)&MA$$]M\""
+ "%ME!%]I!%]Q!$MY!%^!!(]Y-&=Q#(M]\"%]Y%'^5#%^)!'>5!%^)!'.1!&N5(&.9!"
+ "'>9!(^=!'>=!&.E!&^A$&.E!(NE!&.M!&.U!&.U!$_%!'>M!&?!!(?!$&?!!(_%!"
+ "&?%!'/)$-/5!%/-!&?-!+?-+'_9!'?-%&?1!&?-!&_9\"'_A!&?5!&?-!!/)!+_=!"
+ "&_5#'_)((?=*&?=!(OA0'?A%(_=+*_=\"*/A1)/5!&?9!(?9*&?=!&_9\"#O1!'O5!"
+ "'?)%&?9!'/%$\"?-!&?%!\"?)!(?%)'O%!)?!(&.Y!(_!!&.]!'>A!$^Y!(>U%&.Y!"
+ "&^U#&.I!&.I!$>M)&.A!(>=&&>9\"'.-!&^1%'.1!'-]&$N1!%N5$(N5!%^!!%^!!"
+ "$N!!%]]!%]I!%]Y!%]M!'MQ$&=E#&]A!)-A+&MQ$%M9!#MA&&-9\"%M-!\"M!'%])\""
+ "%\\Y#$]1\"#=!!&,U#%<U!$\\U#%<Q!%<Q!%<5!&\\=(%LI&'\\=\"$,5!'\\9,'<5!#<1!"
+ "'\\-#%,)!%,)!*<%!%;U\"$\\!$%KQ'%+U!$+M!$+M!&[I!%KE$'[I!$[A!#[9!'K=$"
+ "\"[5!#[-!\"[=!$;%\"%+%&#ZU!%ZY&$*]\"&*I.&JM%$ZI\"#:M\"%*='#*E\"\":I)$J9!"
+ "!*9!\"Z)\"$*9##Z-\"\"J)!#I]!\"J!!$YY#$I]%$IY\"#9U!&Z!$#IU!\"IE!%)Q!$)1$"
+ "!Y%!$I1)#))#\"I%!#9-!#9E#%Y=$#Y=#$)E$#IM\"!YM!#YU\"%9U%%IY'$YY#$Y]&"
+ "#IQ\"#I]!\"J)!#Z-\"%:1(%J5)&*%!\"Z9!%JI!#J=!&*M+#JM!':M%$*U\"%ZU%#JM!"
+ "(;%$$;!\"&;!(#[1!$K!$#[)!%[1!#;5\"(K=$(;=\"\"[I!$[E!&KI#$;M\"$+M!#KQ#"
+ "$+U!';Y+%<!\"&;Y!&<5!%<1!%,1!&L9\"&,1%&L5\"%\\9#&<A!$L9\"&L9&$,A!%<E!"
+ "%<M!%<E!&LU&%<Y!&]%!&M!%'L]!%<U!%M%!']=+%]1!%M1!#-9$(-9+$]9\"#=A!"
+ "#=E!%]I&%]I!%]M!%]Y!(]U.(-U!'M])&>!\"&>)\"%^!!(>!!&.=!$N-!'>5!%^1!"
+ "&.M!'>9+&.=!'>=+$^E!%.Q!(^A2&NM\"(NM!&.Q!&.M!%/!!(^]!&.M!(>]*&.Y!"
+ "&.U!&?9!%/1!)/1!$_)!&?-!#^U!$_)!&_9\"'O1!&?5!)?5.&?-!&?A!#O9!'_E!"
+ "%/-!#O9!(?9#&?1!'_9!#O9!&_5\"(?A#%O9)'_1''_=!'?%&'_1'%/I!&?1!'/5$"
+ "&?-!)?-\"(?))'O)!&_%#'?-%)_!0&O%\"'N]!#O!!$_!!&>U!*^U*&?!!&NM#'^M("
+ "$^M!'^E(!.E!&.A!$^9!%N5%%^)%$N%!#>!!(>-!$N-!%^%!(.-*(N!!%^%!'-]!"
+ "%^!!%-U#%]Q!'-Q&&]M!&-I\"%ME!$MA!&-A\"%M9!'-9'#M5\"%M1!'])+%]-\"(--!"
+ ")=%\"'=!)%<]!$<M!%M%!&<U%%<M!&,M$%<I!%<E!&,M$+,I,'<-!(<9!&<)%%\\!#"
+ "%<5!$,-!(K]'%,)!%+Y!$[A!%;]!%+I!$;Q\"!+M%%KE#&KI($[A!&[=!'+=*%;5\""
+ "\"[5!#[-!$K)$$[)%#[%!\"[!!$:M$#ZY!%JQ!%*I#&JM)#JI!\"ZI!#JE!#J=!#Z=\""
+ "&J1#$J5!#J-!\"Z%\"$*)#\"*1!$I]%&*!$\"YE%%J!&\")Y%#9Q!$IA%#Y9#\")E%#YA&"
+ "$9%&#))#\"Y%&')1+&95!#)1##Y=##YA##YI\"#9I!#9A!%IQ)#9Q$$9U!#IY!\"*!\""
+ "\"J!'&Z%!#*=\"\":-#'J=&$J)\"#*9\"!Z9!#Z5\"%JM!&*E#$:E#%JM(#JM!#ZU!#ZY!"
+ "$+!\"$;)#%;%'$[-%$;%#\"[%!#+!\"#[=!%+9\"$[E!%K1$&[A!%;I\"%[I!!KM#$+Q!"
+ "%+M!%+Y!%L%#',!!%L!##,%!%,1!%\\-#&<9!%<5!$<9!$L=#$\\A#%<5!'\\I')<9)"
+ "%<M!%\\U#)<U2'<Y$%<Y!%M-!&M-!%M%!(-),&M-%%M1!&]1&&-)#!-9!(-=+'M9$"
+ "&=A$%MA!$ME!&MU$)=Q!$MU!&]Q!%]Y!'.!!(.!%#>%!%^%!$N%!%^-!(>)!&>1\""
+ "'>9!$^5!'^=((^=\"(N=!\">E!&.M!&.I!&.9!&.M!&.M!&>Q!#NU!+.Y1%NY)$^]!"
+ "$_!!'O)&#O)!\">]!'O1&&?-!#O)!&.Y!)/-!&?=!&?%!'_I!'O1!%/5!(O5$'O1!"
+ "&?1!'_5!*O5-%/A!&?5!%/5!'O5&%/5!'_9!'O5&%/-!&?1!$_5&&?1!%/9!&?%!"
+ ")/%(&?1!$_)!&?)!#N]!'/!$&.M!&?!!&.Q!'>]&$^Q!).Y!'>U!(.E$&.A!'>Q!"
+ "+>=\"&.A!&.=!&.A!'NI'&.9!&^9%&>)('.)!&N9#&.-!%^%!$N%!'>)!\"-]!'MM("
+ "'=U\"%]U!%]Q!\"-I!'MM(%]U!%ME!']=*$M=!%]5!$=-!&]9&'-1''M-$%M9!%M!!"
+ "%M-!']!+%L]!'<Q)$\\U#(\\I'\"\\M#$<I!%<5!'\\I\"%LE!%<=!(\\9\"%,)!\",%!%,-!"
+ "%,-%#<1\"%\\!((L%\"$K]#%<!\"%+U!%KQ#$+Q!&+=&![E!%+=\"%K=($[9!$[9!$KA#"
+ "$;1\"$+-\"#[)!%;%'$+!\"$Z]-![!!'JU%#ZU!&:Q($*A\"%J9&\"ZU!#JE!!ZE$&*9#"
+ "!Z5!$:%$$:-!$:1##J-!#Z)\"$9Y$%:-%#YQ#')]&#YE##)E#$IU%#IY!$)A$$9Q!"
+ "#I%\"\"Y)\"\"91#\"I-!\"Y9\"\"I9!!YA!#Y=#\"I5$$)Q#$)U#%)M($IE)$)Y##IQ\"$YQ'"
+ "$*!#$J)%!*1$&:1\"\"Z-!$:1!\"Z5!%*=&$:5##J=!#JE!%:Q(#ZU!\"Z=!$:Q$#*U\""
+ "%JQ!$JY!\"K)#%K!($+)&$[-!#[)%\"[A!%K9$%KA$$;I\"%KA$#[I$';I&&+M!$[I!"
+ "([Q)%+Q!&+Y!'K]#%[]$!L%#%<1!&<5!&<=%&<=!%L5\"',5$$\\9#'<A*&\\E\"%\\M#"
+ "&<M%$LA\"%<Q!%,U#'M!/',]'#,])#=%!$]%#%M)!\"--!%]1\"&]1&$]1#%M=!(=A'"
+ "(=I!&]E%%M9!(-M&%]M!%]M!%]U!)>%%)M]!$M]!&M]$!-]*%^%!&>-\"%.-\"&^5$"
+ "&N1#&.E!)>9*(>-!&.9!&.I!!>E\"&.=!&>I!'>I!(^Y!&.I!'NY'$^Y!(_!'&.Q!"
+ "$NU%$_!!&>U!$_!!$_)!%O)#'O-&#O)!&?-!&?-!&?-!&?9!'_1('/-)(_!!&?-!"
+ "'O1!%/5!'O-&&?-'%/-!'O5&\"O9!'_1!&_1#&?)!)/%(&?1!&O)\"'NY!'_-'&?%!"
+ "'_1(&?!!&?%!&?)!&O1!'N]!&.]!&.U!(?!)&>U!).Y!(>U*)^I!&NM\"'^U'+NI("
+ "$^E!(NA!(N=!&.9!$^9!&.9!&.5!&>1\"%^-!'>)'%]Q!%^1!'M])%^!!%.9\"#>!!"
+ "'-U!%ME!#]I\"&]M!)M9#'ME.&]A!%M1!\"-1!%M9!%]5\"'-1'%]5!&=)$#=)!&M%!"
+ "%M%!'-)'(,Y,&,Y#(,Q1#,I%%<M!#LE\"&<E%),A#%<9!%<5!&<A!%\\9#%[]$#<)\""
+ "%<)!$\\%$%<!!%+U!%+Y!&+]%$[I!#[A!$;M\"$[E!\";E\"#[A!$[5!#[9$$[9!$;-#"
+ "$+1&%+!&&+-\"\"[5!$ZU!#ZU!%*M'#ZQ!$:U$%JQ%$:Q$%*I#&*E$\"ZE!#J9!#J=!"
+ "#J1!#J-!$Z-*%*%#&:)%%:%(#J)!$9]!$9Y$$9U(%9Q($IM%\"I9!#9=!%)=%&9A#"
+ "#9)!$))!#)-#\"I1!!91\"#I9\"#IU!\"I=!#I=\"#9E$$YE'#IQ\"#YM%#9U!$:!$#Z!\""
+ "%J5)\"J1!#J!!#J5!#:)#%:)!%J9)#:=##Z=!#JA!\"ZA!%JI!\"ZQ!$:=#(:Q)$*U\""
+ "#[!!$[!!$[!%#[%$$+9\"\";5\"$+-\"%+)\"%K1$'K9)%[5!%+M!%[I!&KQ'$;A\"$;M#"
+ "$+Y!%+]!&;Y'$+]!%,!!)<1*%,)!%<)!'<)!%,1!%<5!),=2',5$#<=\"&<A&'\\Q'"
+ "%LA\"&LY!#,]!&LU!%-!$%\\]\"$<]!',]#&M%%&M1%$M-!%M5!']!!#==!'=5$%M1!"
+ "%M5!&-9#(=M!%ME!(]I$&]M!&MY$&]]%%^%!$M]!(N!''N!)).%*%^-!).1)%^%!"
+ "&>%\"&.5!#N5!$^E!&.=!!.9!&^A$'>I!&.=!&.M!&.U&&NM\"&.]!&?!!&.Q!&.]!"
+ "&.U!'>U!\"O%!$_!!$/%\"'O%!&O-\"&?-!\"?)!'_!('O!!'O)!&?1!+?!1&?-!$O5)"
+ "$_)!)/1!&?A!(?5/'O-!#O5!%/5!*?)!'O)!'>Q!*_-))/5!&?)!'?)%'O)''O%!"
+ "&?5!(^Q!&.Y!'^Y''>U!&?!!'>Q!,.Y5&.U!%^M**>Q\"&.M!#^M\"&.M!'N='&.I!"
+ "'.1!&NE##NE!&.9!&.5!$^9!%^1!$N!!$N-!(>!&'.%%$N)!%^!!*>!)'=Y\"%]U!"
+ "%]M!&-U!&-I\"\"MI+%]Q!%M1%(]9.$-Q$%M9!&]5&\"-)!%]1\"&]-'%<Y!#M)\")<Y("
+ "$<Q!%=!%']%*%<U!$<Y!),I#%<I!%LE\"$LE\")LE!&,=$%L9\"$,9!&<1!$,-!%L=\""
+ "\",-!#L!'#,%!&[U)&<!&&;]!$+U!$[I!$+M!%<!\"%;E\"%+=\"%;5#$[=!&+=!%+1&"
+ "!+-!#[%!$*Y\"%K1$$+!\")J]/%:Y##ZQ!&JU!$ZM!\"ZU!#ZI\"$:Q#$JA%#J9!$J9%"
+ "$J5!%Z%'#J)!#J-!!:%\"\"Z%!$IQ\"$:!$!IU##9U!#YQ#$YM&$9I(#YE#%)Y'#99!"
+ "%9!$%9))\"Y-\"!I1##95$\"I5!$IA##I5\"\"IM!$IE&#YQ##IU!%)U$$9Y!$9Y!$:!$"
+ "$Y]'$J%!$9Q!$:%!%:-!$:%!$:)$%JI,$*A&$:I#\"J1!$JE!#ZU!$JM%$JY$#JM!"
+ "$+%\"$;!#!;!\"$:Y#$;!#&;)$$+-\"$;1\"(+5\"&K1$$[=!&+E%$[A!\"KE#&[I!\"[I!"
+ "%\\%(#,!!'K]'([]$%,%!&KY'&L%\"&,)!!<)\"&\\1#%<5!',M)),=-&,9$%<E%$,E%"
+ "%<A!%L=\")LU$(\\U/%<U!'\\M'&\\]\"#M!\"&=-$&]!!'])*\"=9!%M5!#=1!%M9!(=9,"
+ "(=E'%M9!$ME!)MI(%]M!&-M\"&-M\"$=Q$%MQ$'MU))=U&#.!$'.%!'N%\"%^)!(.-%"
+ "%^)!%^-!&.5!'^M(&.M!(>9+!.9!&.9!&.E!&NE#+.E,&.E!&.M!&.Q!&>Q!&.Y!"
+ "&^U$$_!!&?)!&?)!&?-!&.U!$_!!&?!!&.Q!&.M!&^])'O-!&O)!'O9&'O)!'O)!"
+ "'O)!#NU&&?5!(_)!(?))&?!!&?1!&O1!&?=!&?%!(?-#&?%!&?%!'.]*)?)\"'?!&"
+ "'.Y$#O%!$_!!&?!!'.U%&.Y!$NI%&.Y!&.Y!$^Y!'>M!'>M!'^I#&>E'(NE&&.E!"
+ "$^A!'>=!&.E!&>E\"%^%!(>1%'>-&'.-!'>)'(>)&%]U!$.)#%^!!%]Y!'MM$'-]!"
+ "&-A\"'-I'%]Q!%]I!&=A$(-A!$]='&-9#(-A+)]E#&M%!&=)$%M)!%M%!',],%<]!"
+ "&M-!(<M)%LU!&LY!#,Q!%<=!#,E!%<Q!$,A!%<9*&L5\")<1*#LA\"%L5\"%<=!%L1\""
+ "%+])(\\!$$+U!';Q\"'+Y!'[M$$+Q!$+M!%;I\"&+E&&+A&%;A\"$[9$$[9!&+%\"#[5!"
+ "$[-!$[)!$[%!%+!*$+!\"#ZY!%K%!$*A#$*U\"$:I$#J9!#JA!\"ZA!#JM!\"Z=!$*9#"
+ "\"Z5!$:-!#J)%$J%\"#)Y##Y]\"%YU!$J!%$IU\"$9U$%9Y&#9I!#YI\"%)E%!YI!!YM!"
+ "&)9)$99(#9)!\"I-!\"I1!\"95&\"I=!!IA##YE##I=!'9I'$)M$$)Y'$YE$#IU!#IY!"
+ "#I]!\"J%!')]&#J)!#J%!#Z9\"$J5!$Z1&\"Z9!#*=\"#JE!\"ZI!#ZE\"%:Q(#ZQ!$[)!"
+ "#[!!$[!&#Z]!\"ZY!%;%'&+1*$[-)$[)!%;5&$[9!([9!\"[9!#[A!%+5\"%+M!$+M!"
+ "$+Q!);M,%[U$$+]!',!)$,!!$<!\"&\\-#%,-!%,!!$<%\"'<9!&LI&%<=!$,=!$,A!"
+ "#,=!'LQ!%LM!&,I$%\\U#&<Y%&]!!%<]!&M1%%<U!#=)!\"-5!#,Y!'M)*'-5'#==!"
+ "&==$&]1!%]M!$MI!\"]I$#=A!%]M!%]]!%]]!(M](\"-Y!'-]!%^)!'N%()N%!&>1\""
+ "'.-!%^=%&.5!#N5!#>)!%^)!'N1(&.A!&.9!&.M!#NE!&>E\"(^M!&.I!'>U!'.Q%"
+ "&>I!&.U!).U'(_%!'NY!\">Y!).Y'&?%!&?)!&N]\"&.Y!&O%\"\"?)!+/%+&?%!*O%."
+ "'O)''O)!\"_1\"+O!!&?)!%/-!&?%!)/-!'O1!&?-!)/%-%?%\"'^Y(%/-!&O)\"(_!!"
+ "(?!)\"O%!&.Y!'NY!'_!!&.Q!*.Q!&.U!'.E%&>M''NY!'^=('>E!$^E!&.I!%^)!"
+ "\">=!$^9!'>9!&.5!%^1!&^!%&>-\"(.9%#>!!'.!!+-]\"%]]!%]Y!(=]!'-Y!%ME!"
+ "%]M!%]Q!(]I)%M=!&]M!']5%&]=!$]9\"']9%%M1!%]1\"&M-%%]!\"%M%!%M!!%<]!"
+ ")-)0%\\Q\"$<U&%LM\"&<M%&<E%$\\E#%<9!&LM!&<A&&,9$'\\%-%<5!%L-\"%,-!%L)\""
+ "&KY#&;Q''+])&+Y%#+U!&+Y%$+=!$;]\"$[I!%;=\"%[A!%K=#\";9\"%+5!\"[5!#+1\""
+ "&;%#$+)\"$[!&&K)!$*Q\"$:Q$$*Y\"#ZQ!\"ZM!#*Y\"%JI!%*Q'#JM!#J9$$Z9&%*9&"
+ "#Z5\"#9U$$*)&$Z)&'J%#$*%#%*!#$IQ%#I]!#J%!#YQ#!YM!!YA!$)E#!YE$$YM#"
+ "$Y%%#Y!$!Y-$#I-%%I)%#)5##)5#$I=\"$YA!#9=!$YA&%)I(#9M!#9U!$IU\"%)U$"
+ "$9Y$$:!(#Z!\"#J)!$:)$$*-#%Z1#\"Z5!#J5!#J9!$J=!\"*=\"#ZU!#JM!#JM!%JQ("
+ "$ZU%$*]\"\"ZY!\"[!!%*Y'$;!\"#;-&%K5($KA$&;5#%K9$$;=\"%[=!%KA#%KU#%;I\""
+ "$;I\"%,!!%\\!$&,)!%K]#'+]%&+Y%&<=%%,)!%,-%*<1%'L%+$,=$%\\A##<)\"#LA#"
+ ")\\E0(LQ/'<M)&<Q$#LQ\"']!!$<Y!%<]!&-9\"%M%!%M%!&])'%M)!%M1!'-5'%M5!"
+ "%]9&&-=\"&=M$%]E!'=E\"(MI-(=E!(-I!$MQ!%^-!'.!%%]Y!)M]!&.5!(.!%#N9!"
+ "(.-%%^-!%^1!$N1!$^5!&.9!&.5!'N=\"'.=%)NA%'.M%'.1!'.I%&.I!&.M!'>A!"
+ "&.U!&.E!(?!)'>U&\">Q!&.U!'NY!&?%!%.M!*>]'&>Y!&.]!#O!!&?)!%O)#'.]$"
+ "&?!!'O)''O%!'O!!&_%#)^U,'^]!&?!!&/)&$.Y##NY!&O%\"%O%#\">Q!,.]*\"N]!"
+ "&?!!'/1$&.]!(_)!$.U\"$^Q!'>U&$^M!&.U!&.E!&^M$#NI!&.9!&.A!&.=!$^=!"
+ "#N9!$^9!&.5!'.-!*.))%^1!'>9!%^%!$>5$%.!\"$MY!$M]!$M]!%]U!(-Q!&]Q!"
+ "'-U!%M9!$ME!&=I(%MA!%]1!%]-\"%]1\"#\\](&M%*'--\"%]%\"']%*%]%\"&L]&%M!!"
+ "%M!!&<U$&,Q#$LQ\"&<I!'LI!#,E!$\\5#%<I!$,=!&L1'&<5!&<9%%;Y\"%,-!#,=!"
+ "&,)!%<!\"&+Y!%;Y\"&L%#\"[E!$;M\"%;A\"#[9!%+E!$K=#%K1$%[9!$+-\"$K)$$K%$"
+ ");-$#;-\"!+%!![!$#Z]!$+!\"#ZU!$JM!#ZY!$*Q\"#JI!#*Y\"#Z9\"!Z=$#J1!%:5$"
+ "#*1\"#Z1\"%Z-'$J-%$:!$$:!!$)Y'$)Y##YQ##9Q!%Y=$#YM#$9I$!YE!\"IA!\"I=!"
+ "#I!%#9!\"\"I)!\"I=!\"I=!#9E#%)5+#)Q#%Y=$#9E!$YE'#9I!$)I#%II#$Z!#$IM%"
+ "\"IQ!#YI#%*!#$J%&#Z!\"#IY!!Z5!#JA!$J-\"%*9'#J=!$*Q\"%JQ!!:A\"!:E%#JE!"
+ "$[)!%*Y'$J]!#[!!%:U(%JY)$;1\"#[-!#[1!#[1!$[E!%[=$%KE$&[E!$[A!'[I!"
+ "#+Q!#+Y!#+]!%+]!%+Y!%+]!$,)!&<)*$\\%$&<1!&,1%(L1+&<A!%<=!&<)!&<A!"
+ "&<I%'<I$)\\E'&,Q#$LY!%LY!%LY!(M).*,U\"&-%#%<Y!(<]-'-5\"&]5/&-1'%]5!"
+ "%M5!&=M(%M=!&]A%%]I!'=M#%]I!&]Q!%]Q!'-M&%MA!']M)%M])&N5#%]]!%N1$"
+ "%^)%'.)!%^1!%^)!'.!!)^5!%^1!&.E!'.A%&.9!(NI&&.=!$^E!&N9#&.I!(NI&"
+ "&.M!+^I#&.A!'NY!&.U!(.M)#NU!&>Y!&.Y!*.Y,&.]!&?!!'O!').].#NU!&.]!"
+ "#_!!'_!(&?1!(^Y''O%!(_!&&?!!&_!#&N]\"*.],'N]!&.Y!#N]!'.Q%&>Y!'.Y%"
+ "'>U!'>U!'NQ!&.Q!)>Y)&>A\"&.M!&.I!$^I!&.E!(^E-&.A!&>E!&N5#(>=%'.=%"
+ "'.%!&.5!$^E!$N1!%^-!%^)!%^%!$N%!$^!!$M]!%]]!']Y)'-U!&]]%%]U!%M5!"
+ "&-A#%]I!%ME!)]Q-$-=$%M=!'-9'%M5!&-1'&M5%&=9$&=-$(=%(&]!\"%M%&(,Y("
+ "(<Y)'<U)&,E$%<U!'LQ%%\\U\"%<E!&,5(%LA\"&<9%%L1\"%,1!%,-!%L)\"&<-!$,%!"
+ "(\\%(%KY#&;Y&'+Y!$[U$$[Y$&+M)'+E*$K=#'KE,$[9!&[=)&KE('[5*&+5&%K1("
+ "\"[9!#+5!#[)!%+!&#Z]!$*Q\"#ZU!!ZE!#JE!#Z=\"$JE!%*E'!*I$#Z1\"#JI!%:5!"
+ "#J1!#J)!#Z)\"!Z!!#IY!#I]!$)Y##Z!\"\"YQ%$YQ##9U!&)I\"$)E$#91!\"II!#)I#"
+ "#XU!\"I%!#Y!'!Y=!#9)$#Y5&#)-&\"I9!\"IA!$Y5'#IM\"\"Y]\"#9M##J%!%*!'#I]!"
+ "&9Y)#9]#$*%#%)Q!$*)#$)U'#J1!#J5!#J)!#Z=!#*A\"&:9(#*M\"\"Z=!%JU!\"ZI!"
+ "$*E&$+%\"#:Q\"$;%#$*U)#[%$$K)$$[9!#[9!&;1#%K1(%K9,#+5\"#[A$%;A\"'+Q*"
+ "![=!$+U!%[Y(%+Q!&+E%%K]#'L)\"%,)!(<1%&,)!&<1%&L-#%L-\"%,1!%L=\"&<E%"
+ "\"<I\"%LA\"%,1!(,Y#',Q(%\\U#%<]!#,U!$=!!',]#'M%%#=)!&-!#%M)!%M5!)-10"
+ "&-1#&=E#%]=!&-U\"%M=!%]M!)-9!&MI$%MA!'-U!&]]*%]Y!(N!'&M]$%N5%'>!\""
+ "(N),%^%!$N%!$^9!'N-\"$^5!*.=('>5!'.-!&>)\"&.=!&.A!)^Q,(NM!#N=!&.I!"
+ "#NA!'>=!&.U!&.A!(>M+'>E!(NU+'^U\"&>Q!'>U!(?!$&.Y!'O%!)>Y##NY!\"?-!"
+ "'O)&&>U!&.Y!$^]!&?%!&?!!#N]!'>]&(^Y!'^Y'&.U!(>U%&.U!'NY-+>M3'>I!"
+ "%>Y\"&.I&&^Q#\">I!&.Q!&.]!&.I!&.U!'NM!&.M!&.5!&.5!(>M+&.5!'>9!\">5!"
+ "&.5!&.=!%^-!$^9!'.)!'.)!$N%!%^%!(-Y*'-]!$ME!'-U&&]Y*%]]!']M$%M=!"
+ "(=I!#]E#'-A!&]I%&MA$&=-$%M5!$=%%%M9!\"--!%<Y%(]%!&L]!'-!#$M!\"&<Y%"
+ "&-)(&LA&&]%+$\\I#&<I!%L1#%<A!%<1%'<=!%<A!$,)!%,1!&<)!#\\1((\\)'%<%!"
+ "$+]!%<!!([Y$';E\"$;M#$+]!\"[A$&[E(#[-!$[E!%[E!\";=\"$[5!#[5!%;1\"#[1!"
+ "\";)\"#[!!$[1!&:U$%:U'%:]$%*Y'#*9&#JI!\"*]\"%:E$#JA(#*=\"#Z)\"&:9)$J9!"
+ "$J=!#Z-\"#J-!%J-\"&Z-'$:!!%:!%#I]!%9M)&II(%9I\"%)A'\"I9!$)A$#)M\"\"IA!"
+ "#Y)'#9%!\"I-!\"9)&\"I-!\"Y1\"#I1%#Y5&\"9=##99!%9E&#YI&!YQ!#9M!$J!%$*!#"
+ "#YY\"$9]$!:!\"$Z!#%:!!%:)!\":-\"$J1%%J5)#J)!%*M\"$:E$#JI!\"ZI!\"ZI!%JY%"
+ "\"[!!#ZU!\"ZY!$+!\"\"*]\"\";5\"$;)\"%K5(%;5\"#[A!'[1!%[5!#+M!%[=!$[E!%[E$"
+ "&[M%#+Y!$+Q!#+U!'KY'%;Q\"'L%'#,!!#;]\"%,1!(,!)%L9\"&\\-(%\\A#&LE&%L5\""
+ "&<E!&,I#'\\Q\"#,Q!',A#%\\Y\"\",Y!&M!%(=!$%<Q!%<]!$=!!&=)$'-='$]!#)=%\""
+ "%M)!%M5!&]5!$=9!&-A\"#=A!%]A!$=9!$MQ!&]M!%]Q!'-U!&-Y\"'-]&%^%!&]Y%"
+ "%]]!&=]#$MY!$MY!%^%!\".)%#>!!&.5!$N1!'.9&$^9!&.=!$N)!&.I!&.E!&.=!"
+ "&.M!&>1\"&>I!&.Q!!.M!'/!$(N=!'>U!&.]!'>Q&'>Q!&>]!#NM!&.Q!&NM#'^Y'"
+ "&.]!&.]!(^Y!(>Q*(NQ+(^Y!&O)!*NY#'>M!&>M!&.Q!&.M!&^U#*^Y*'>Q&&.A!"
+ "&.Q!&.Q!\">U!&.I!&^-%'.I%#^E!&.I!'>5!%^1!'.9&'>5!\">E!(>)&&N5#$^5!"
+ "&N)$&.=!&^-%'>9!&.5!#>%!).)*#>%!%^!!&^%%%]Y!'-U!&-Q\"$MQ!%]Q!%-=$"
+ "$ME!$M-!)-A&&-=\"%]9!&=A$%M!!)=A0&=-$%<Y!%<]!(-%\"#=!!'L]!%\\Q\"&<Y$"
+ "&\\U&$<I!%<I!&<M!%\\9#%LE\"'<=!)\\A+&<5!'<A!%L9\"%L1\"%;]!%\\-#%,%!%K]#"
+ "&;]!'+]!%;Y\"([U)$;I\"#;Y\"([I%#[I!%;E\"';A'&+=!$+)&%K9(#[1!%+)&\"[=!"
+ "$[)%$;-\"$+!\"#:]\"\";%)#*M\"!:U\"#JI!#ZQ!&*E(#:E#%JQ%%:9!$JE!$J5%#Z1\""
+ "#J-!$:5##J)!$J%\"&:-&#Y]\"\"II$#YU\"#9Q!!YM$%)M!!II#$9A%$)=$!II#\"Y9\""
+ "#9%$#I%##I!\"!))!$Y-!'95+%91)%I9'$95($9I$$YA'#9E!#YI##YM#$)U##Z-\""
+ "#YY&\"I]!%)Y$\"*%\"#J!!!J%*%*!!#Z-%#J9!#JM!\"J)!#Z=!#JE!#JE!&:=%$*M\""
+ "%JM%$;!\"$K-$#Z]!$*]\"$*U\"#[!!#[-!#[-!\"[5$%Z]%%[)&%+A!%+5\"%;A\"#KI#"
+ "&[E%$KM#'+U!%[Q$$KY#%+U!$[]$'+]!$,%!$<)\"%<%\"&L)'&,=$&\\5(&<1!$<1!"
+ "'\\A\"(LA!&\\E\"%<I!&,I#&<=!%LI!%LM\"#-%$&-!#%<]%'<Y-&-%$(])&'-)''=1("
+ "&=1$(=1#(=9\"(-9&$]5'']5%#=I!$=E$$]M\"%]M!%]U!&MM$)=U!%]U!'-Y!)N!&"
+ "'>!!%^%!#^5\"%^%!\".)!%^%!&^-%'>1'$N1!%N5%&N=#%^-!%^1!(NA!#NA!$^=!"
+ "&.5!&.A!'>E!&>E!'>I!&.M!&>I!&.M!'>M!(_)!)NQ%&.U!&^Q##NQ!&.U!&.Y!"
+ "'.Y%'.]$&.I!&.I!&.U!#O%!&.U!&_%#,>I&&.I!&.Q!&.Q!(.Q$&>Q!&.Q!)^Q&"
+ "#NM!(NI&&.=!(.M)#NI!&^Q#&NA#!N9#)^A!#N9!&>9\"%.9\")^=!'N)('N5(&.1!"
+ "&N-)&^-%%^)!%^%!%^!!$N!!+>%)&>!#*-Y$&-]\"'.!!\"-Q!%=M$%]M!%ME!']A*"
+ "&-9#%MA!&-A#%]5\"&]9!(=9'$=1!%]!'$])\"#=%!$<]!$M!\"(<Q)\",]!%M!!(,U,"
+ "#<]!#\\U#&<E!&<I%$<M!!,A!$L=#%L1\"$,9!%<1!'\\5($<-\"&\\%($,!%%,%!%+U!"
+ "%L!'%+Y!([Y-$+Y!%;M\"#KU#$;E\"&;Y!&+M%$K=$%[)!#[1!#[1!$;%\"%+)\"$K)$"
+ "&+)&&K!$#Z]!$*U\"#[%!#ZQ!$*Q\"!*M!#*E\"#JA!#ZE%&JA\"$:=$#J9!$JE%$*1\""
+ "#J!!\"9]#$Z!&$*%##IY!!*!$\"YY!$9]$%9Q\"$YY##IY!%)E$$YU)#9=!$9A(\"Y1%"
+ "#I-%$)%!#8U!#))##91$$I5&!Y5!\"I=!!)5!#YA#$YM#$9I%%YI($)I''9M+&IU."
+ "#IY!#9Y'#J%!%Z)##*!&#YU\"#J!!%Z1*#JA!%*9#!*9!$*M\"%JE%'ZM#%ZE\"$ZU\""
+ "#ZQ!%JI)#J]$\"ZY!%J]!&K%(&[)\"$K-$#+5\"%;)'#ZU!$[5!$K9'%[A!#[A$#[A!"
+ "%;M#%KI#$;M#!+Q!%<!!&+Y!\"[]$'[](#,)!%,)!$<%!%L-#$L1\"&\\1#%<9!$LA&"
+ "'\\Q'#,A)&<-!&<M!#,I!%LI\"%<I!%<A!',Q(%LU!&L]&$L]\"']%+%M%!%M)!)-1!"
+ "&M%&#=1!%M9!']9!)M=\"#=1!'-I'$MQ!'-U!&]I!&]I!\"=]&%M=!&MQ$(=Y''M])"
+ "%]Q!%^%!&N!$%^%!$N!!%^!!&.-!&.%&#>)!(^-.'>1&%^-!&.9!)^=!&.5!&.5!"
+ "$^I!$^A!'>A!#^E!&.Q!&.Q!)NU%'>I&$^I!&.M!%NM$%.M'&.M!'>Q!&.E!&.M!"
+ "'>Q!&^=$&^M)&.E!&>Q!&NQ\"$^Q!#NQ!&.Y!(NI!'>M+*.M!&.M!'NQ'%.Q!$^M!"
+ "\">E!'>I!(^E-(^I'&.I!'^=)&.A!$^=!&^=*%^-!&.9!&.5!'>5!*^5&$N)!%^-!"
+ "(.9*&MY$%^1!'N!#(MY(%]U!%]]!$MQ!%]Y!&MY$$MU!&-]!%]M!'-Y!%ME!$ME!"
+ "%MA!%M=!$M1*)=I!%]5!&])&&=9$']1!%M)!%]-!'=%)%\\U\"%M-!%<=!',I(&LU!"
+ "&\\Q\"%<U!%<M!%<A!'<=*&<=!&<-!&<E!&L9\"%,1!&<1!(,-$$<-\"%+U!&,!!(,!!"
+ "%+Y!\";Y\"%;M\"$[Q$#;M'#KE#$;M+&;=&%+5\"%+1!!+=$&+5*$+1!$+1\"#+5\"$[-!"
+ "$;-\"#ZY!$[!&!ZY!$*U\"$:U*%JY!#JA!\"ZM!$ZQ\"#JA!$JE!$*1\"#Z9\"$J5!#J1!"
+ "#J-!\"J-!#*)\"$*!*#Y])\"YY$#I]!#YU%#IQ!$)Q'$II)#YE#$IE&#Y-#\"I9!#YA\""
+ "\"8]!#HY\"#9-!\"I%!\")%\"#9-$\"I1!#)9#!Y9!!)E!#9A!%)I!%)A%$)M#!YQ!\"II!"
+ "#IU!%:)%(*!*$IY&!YY!\"IU!\"J)!&*),\"*1!&:5!%J9)#Z1\"$JA!#JI!#JI!%*E'"
+ "\"ZI!$:E$$*A\"#[%!#JI!![)!%;%'\"Z]!#ZU!%+=%$+1\"$;9\"%KI#$[1!\"[9!%+1\""
+ "$[=!\"[I!&;U\"$,!!&+U!'<)%%[I$&,%!#L!#%,)!%<A!%<)!&L)\"#<5!%,=%&L=&"
+ "'\\=\"%,-%$,A%(L=&$<I!%\\M#&\\I'%<U!&M%!#LU\"%<U!&L]&%M!!&]9!!]%$&])&"
+ "#]!''M1*%M5!%]-\"\"-9!&ME$%=E$%M=!&]Q%#MQ!'=9-(]M$$MY!*-Q$%=Q$&=M$"
+ "%]Y!%]]!%^!!(>!!$N%!'.-!&-]!&>!\"%>-#%>)$)>9%%^1!%.5\"#N9!&.=!&>A\""
+ "&.9!&.A,&NA#&>A\"'NI'&.9!&>Q!#NE!&NI\"'>I!'>I!#NE!)>I$&.Q!&.M!&>I'"
+ "&.]!)^I!(.M$(.I)&.M!)>M$&.A!'^Q\"&>Q!&.M!&NI\"&N5#&.I!(.I$&NI\"'.A%"
+ ").M3&.E!#>A%#NA!&>=\"%^-!*^A&)>9%&.9!'.-!#N1&$N1!&^5$%^)!%^-!\">)!"
+ "(N)'&.%!%^%!$N!!#=]!%^!!$MU!%]U!)=]%%]Q!%]E!$=9!&-A\"&]I%%MA!%M=!"
+ "&M9%']I$(-50&]5!'=5($-1$%M-!'-)#$M)!'M%%&M%&%]!\"%<]!%])\"&]5!$LQ\""
+ "$L=\"%LQ!&LE&%LE\"%<A!(<1!',I#'L5+'<5*%,1!&<9!&,)%%L)#%,%!%,%!&L%'"
+ "&+Y%&+]%%KU#$;U\"#+M!&+Y!%[E$#KA#%;5#%;E\"([9!&;5+%K1(%[)!#+)\"%+-\""
+ "$[%!$[!!\":]\"'ZY'$:I$#ZQ!#ZI\"#ZU!%*A'%*A#%*A'$ZM%#J9!$Z5\"!Z5!$J-%"
+ "$JA%%*%'\"Z%\"#J5!$9]!$IY&$)U#%)]'%)Y$$9M$%9I)#)I\"$YA!!Y9!#Y)##95$"
+ "\"Y!\"$)-'$9%#\"Y%\"#9)$\"Y-%%I%(#)9##9-$#99!$)=$$)E##YE\"$)M$$9I$$9Q!"
+ "&9U'%9U)#J)!#J)!$*%#$:%!#J5!#Z-\"!Z9!%:9!%J1\"#J=!\"Z5!#*A\"\"ZM!$JE%"
+ "\"JM#$*E&$*I&\"ZU!#[!!$JY$#[%!#Z]!\"[%!#[-!$[1!\";1\"&;9'%[=%$[5!%+=\""
+ "&K9(&[I!$[=!$+M!$+U!#KY'&,!!$+Q!$+Q!(L%'%<%\"&\\)#%,-!&,-$%,1!$,1!"
+ "&<9!$LA\"'LA&$\\=#$<Q!&\\Y!$<M!#,Q!)<Q)%\\U#$<U!\",]!',]'#]!#(M%*'M)$"
+ "&LY&%M-!$=1!&]5!(=5'&-=\"&]1!&-A##=A!$]E\"#=E!%]I!%]M!&=E#'-]!'.!!"
+ "%-Y\"%-M#&MU)']])'>!!$N%!%^%!%^-!(>%!#>!!%^)!&.5!%^)!'>A!%^%!'>A&"
+ "%.5\"&.=!&.A!(>I+&.=!&.=!'NA\"(NA!#NI!&^I)$^E!&^E$%.E!*>I\"&.Q!&>E\""
+ "&.U!&.I!&.I!&.Y!(^U!#>I%&.I!#.M)*NA*&.I!%^1!&.E!&.A!%NE$$^E!'NA\""
+ "&>E!*N9+&.=!(>E+%^=&'N='&.5!&>1\"&.=!&.5!$^9!'N1((>-!&.-!(>!,\".)!"
+ "%N%*&.%!#>-!$M]!%]]!%]]!%]Y!'-U!$MM!%]Q!&]M+$MI!%ME!%]I!%MA!%MA!"
+ "(=E\"%M9%&M1%'-5'%M-!&]1!%M!!%])''-%''=!$%M%!%<Q!',Y#&LM&\",E!%LQ&"
+ "&,M$(LA!%<I!&,I#&,=$%\\A#%\\9($\\)$'<=%#<1\"%L1\"&,)!',)%$<%\"%[]$%[U$"
+ "%;U\"%;M\"%;Q'%;Q\"%+Q!$[I!([I%';9,'K9$%[9!%+%\"%[E!\"[1!\"[-!%[-!$[!!"
+ "$+!\"%J])!*Y!\"ZY!#ZY!#[!!#JI$#JI$#JE!#*9\"#JE!!:Y)#J=!$:1'$J1\"&:--"
+ "#J)!$*%&#J-!$:!$%:)!!Z!(%9I\"$IY)$)M$#9E!$II%#YI##YA\"!Y=!#Y=&#))#"
+ "$Y!%\"(U\"$(Y$#9%!\"Y)\"#)-#\"I)!#)9#\"9=#\")1\"#YA\"$)5$#YE\"!)I!#IY!#J%!"
+ "#II\"#Z!%\"J!!%)Y(\"J)!$:%(#Z)%$Z1&%:1!$J5%$:)$&:9)#J=!!ZA!#*=\"!ZI!"
+ "#ZQ!#JE!%JQ)$*U\"\"JY$#ZY!#[!!#*]!$+5!$*]\"%KA#!+)$#[%!$;=\"%;A\"$[9!"
+ "$[A!%[=!&+I%#[E!$+Q!#;Q&%KM+)+])&;Q\"'K]'&<-!#L5#%,)!$L1\"%<A!$L-#"
+ "+\\),&L%\"&<A%%LA\"&\\E(#LE\"$<I!(,Y\"'LQ!&,Q#&<Q%$]%\"%<U!%<U!%]1\"%M%!"
+ "&])&*--!&--#'=1$%M9!\"M9#&]9+%=E)&]E%&=A$$ME!&]I!'=I\"#=U!)=U!%]Q!"
+ "$MY!%]U!'-Y&%]]!*>!%(N!\"%^)!%^1!(]]-%^!!(>%!%]]!'.1!%^-!&.)!&.5!"
+ "(.E)&N9#'>9!&.9!&.A!'>A!)N10'.=%&.U!&>E!'^E\"&.I!&>E\"&.M!'^5#&.I!"
+ "$^=!&.E!&NI#(NE!&.E!(.E*(NM!'N=!&.E!&.M!(^M-'>A!'>E,#NA!(.A$&N=#"
+ "(N=,(N=!(>=&&.=!(>1!&.5!'>A!&.5!%.1\"&.5!&.-!&.9!%]Y!%^-!%.-\"'.%!"
+ "(=]!&>!\"'-Y!%]Q!)=Q0(N-'(-M!'=Q\"'-E!&=I$%]E!'MI(%M=!'-9\"\"ME\"$]9\""
+ "&-9\"$=5!&M5%$=1!&-%#$M=!'=)(%]!'\"=)!'=!$\"]-$%M%!\"L]#&,]#'LQ&*,U!"
+ "%<I!%<U)%<5!&,E#!,9!$,1!(\\9\"&,%%'<1%%,-!%<%\"#L%#'<-!&K]'#,)!%+Q!"
+ "'KU(&L!'%+Q%$[M$%+]!#[5!$[A!&;9'%K=$$[E!$K=$#[9!$[-!%+)\"%K)$$+)!"
+ "#[!!&J]!#ZY!#Z=\"%:Q$#ZQ!%ZM\"&:I(#J=!#ZA!#J=!#Z-\"$*=&#J=!#J-!\"J-!"
+ "$:)!&J%#(*!*#9M!&:!,!J1##YI\"$)Q#$9Q!#IM$%9=*#I1\"#9=!!Y9!#)9##95$"
+ "#(]##(]#%)!%$9%%!HU!\"I-!!Y1!#)-#$91%#99!#9=!$IA#$)A#$)E#$YM#%YU*"
+ "$9Q%#9M!%)Q$#)Y\"#J%!#)I%%*1'\"Z%!$J1\"$J9%#Z1\"#J9!%Z9*$*A\"$ZE\"%JI!"
+ "%ZI\"#JM!%JY(&ZQ\"#ZY!#J]$\"ZU!%ZU&#[%!#+1\"#[%!$K1$#[5!$[-!%;9#$[=!"
+ "%+A!%;I\"&+E%&+E!%;]&&[Y,#+]!&+M!&,%%(K]'%,%!#,%!%L-\"&<!\"%,-!$<1%"
+ "%,%!%<5!&L=\"%L=\"&\\E\"$LM\"\",E!%LE\"'LQ!'LQ&&\\]\"%\\Y\"#,Y!%<]!&M!!&L]%"
+ "%M-!#=)!&M)!(=-('-1')-5&%M9!&]9!#=A!&-A\"(=9\"%]M!%]I!\"MI\"#=M!&=Y#"
+ "\"-M!&.%!%-M#%]Q!+=]$%]U!&-U\"%^%!%^)!%]Q!$N1!%^%!%^-!%^-!$^%!&N1#"
+ "&.9!%^-!$^9!(N9!'>A!(^).(N9!&.A!%>%#&.5!'>E&&.9!)>=$%N5%$^5!&.M!"
+ "%^A*&.A!&.=!&.=!&.A!\">=!&.=!'NA\"'>A!+>A(&^A$$^=!'^=($^E!&.=!%^9+"
+ "*>=#'.1!(>5+$^5!*.=('.-!%^-!%^1!%.1\"$>!%'>-&\".1!%^%!%^!!%.%\"$M]!"
+ "(.%%&=]#'.%!'=Y(%]M!&]Q!'-U!%]I!'MI)%]I!&=M$#=M!&-A#%]5!$==%#=A!"
+ "%M9!&-%$)]1*%]-\"%M5&%M%!(-)\"(=-('-%#&M!&%<E!%<Y!%\\U'%\\Q\"&<=%'LU%"
+ "&LQ!&<E!&\\E'&<9!&,1%#,)!%<9!&,1%'<9%'<5%&,-%$<)!\"+Y!(+Q!'[]$%[U%"
+ "&KI(!KQ'#[9!%KU#$[E!%KM#%;A\"$;A\"%[1!%;E\"(+-#%+1&$K5$%+A%#[!!#[-!"
+ "'*]'&+%\"$ZY%%ZU\"$ZU%\"Z9!$J9!!*I!%:I$$:A#$:1#$*A#&J-\"#Z1\"#Z-\"#Z-\""
+ "\"J%!\"IY!%J%&$*!#$*%#%IY\"&IA!#II!$)M#$)Y##I=!#)A#$)='#)9##)5#!Y1$"
+ "$HY&#HY\"#XU!$))%#Y5#\"I!!%(]&#I)(\"I9!#Y9&\"I=!$)5$$)M$$)A$#9I!%YI!"
+ "#9E!#*!\"$9]!%9U)#J!!#)]&$*!##Z-\"%J5)!*1%$Z5\"&*-%#ZA!#:E##ZA!$ZI!"
+ "#JA!$*M\"#:U##ZU%%:U'!*Y!#Z]!#[!!#[!!$J]!![-!%[1!![!!$+=!%;=\"%;9\""
+ "$[I!(+A!&+M!%KI#$+M%%+M%$[E!$[I!%K]#%;]!%L!#!,)!#L!#\",!!$\\1#%,1!"
+ "%<1!*<9$%<=!%LM\"%<A!!,E%)\\I&%LA\"&,M#&\\U'&,U#&,]#%LY&'<M$&]1&%M!!"
+ "&M-%%M%!$<]!&]1!&LY!%M5+%-=((-=!#M9\"&=-$'-A\"'-=\"#==!']9!'==(&=M$"
+ "(-M+%ME!%^)!%]U!+MU%%]]!'^!$%]]!%^)!)N!!)^)'(>)!(>%!%^-!(.-*&.-!"
+ "&.=!*.E'\">5!%^1!&N1#'.1!&.1!%^-!&>9\"&.A!&^=$'>E!&.9!(>A+$^M!(NA!"
+ "$^5!&.A!'>9!'>9!&.9!%^%!$N9&$^=!'>5!$^=!&.=!&.A!'.=%&.9!&.9!&^I$"
+ "#N5!&.5!%N1*%^1!$N-!'>)'\".-!&N-#&.E!(>)+&^)%%^%!&N%$%^!!&^!%%]]!"
+ "'-]&%]Y!&-Y!&-Y!'-U!(-Q!$MM!%]I!#=I!&]M!&M9%&ME$&M9%&]I%'-9'%]=!"
+ "%]5!$M=!)-1&%M-!&=!$#=!!%M%!%=!%%L]!'<]#$<U*&<M!%<U!#,Q!%<M!&LM!"
+ "\",M!\"<I!%<A!$,A!$,9!&,5%%,1!'<1*#\\=#%<!!'L-+%,!!&<%%%+]!';E&);M'"
+ "%[U%$;Y&'+M!&;I\"#[A!%[A-%[=$$[I!%+=!$+9!#KA'%+-\"%;1\"#[)!#;9\"$K!$"
+ "%ZY*'*Y##[%!%ZU&\"ZQ!$*Q\"&ZI'#ZE!!*U$$JA!#J=$#Z%\"#J-!$J-!$:-!#J)!"
+ "#J-!#J)!$IQ&#I]!#IY!$IQ&#9M!&)M\"$)M&#I=\"#)A#$I=##9=$\"Y=%$91(!Y9!"
+ "\"(U\"\"I!!!H]!%(]\"#I%\"\"Y-\"\"I5!\"I=!#Y9#\"Y9\"\")9%%I9#\"I9!$9Q%%)I!#9M!"
+ "$9I%%:))$Z%&#9I#'9U+#J!!#*-\"$)Y##Z%\"#J%!$J5!%J9)$Z-\"$J=!\":A\"\"ZE!"
+ "#ZI!$JE%$JM$#ZU!$*]\"#ZY!$[!!%K!)$*]\"$[!!$K!$![-!!*]!%;=&&+)\"';9+"
+ "%;=\"&[A$%+E%%KQ#%[I(&KM'(+Q.$+U!$;Y\"';U+#K]#%,!!%,%!$,)!%,1!%L-\""
+ "',-$&,-%$L=\"%L9\"&\\A#%<A!#LI\"\",]!#,A!%<M&!-!!%<Q!'<U)%<Y!&]5!%<M!"
+ "'<])(=-'&=)$&=-$&]1!%M9!%M9!']5!\"-=!*=5!%M=!'-I'&ME$%]M!&-9\"%=E$"
+ "(]U.%]M!#=Q!(=Y!&MQ$&]I!%]]!$MY!$M]%%]I!&.!!%>)#$=U%).%$'.-!&>)("
+ "%^)!%^)!&.9!$^9!)>9%'.-%'.)%$N5%#>1!(N9!(N5!&.E!&^9$&.=!'NI''>9!"
+ "'N5()>1*$^=!&>9\"#N5!%N9$&.5!(N9!,>A,'>5!&.9!&.A!(N5!#N5!\"^1#\".1!"
+ "&>5\"&.A!%^%!%N1$(NA!(^-#$^%!'^)*)N%&#M]!)>%*&.-!\"N!\"(MU-%]]!%]Q!"
+ "&-Y!%]U!%]U!%]Q!%]Q!$MI!&MU$\"-I!(MQ($MI!$MQ!&]Q%%=A$%]5\"'-9'&M=$"
+ "$-1$&M-!%]5\"&-%$(])!%M)!&-!(&LU!%<]!%<Y!%\\U#)LU/&LU&%<M!%LM\"',=("
+ "#<=!$<A*&<5!*<A-%<9!$\\A#$\\-$$,-!$,%!!,!!#+U!$<!\"&+]%%L!,(+Y!%[U$"
+ "%+Q%\"[I$&;I\"%+I!%+Q!&+A\"%+=\"%[5!%+1\"$[5%%K1$&+-\"$[)!$+)\"$+!\"#[!!"
+ "&J]-$JY!$J]!$JQ!#JQ($*M\"\"ZA!&:M,&*I##ZA%$J9!#Z%\"\"J1!'J5##Z)\"!J)&"
+ "#IY!%*!!$)]##9Q!$9E$#9U!$)U#\"9M##9E!%YI+!IA&#99!$)9$#)1#%)%&\")1%"
+ "\"8U!#(U!\"I!\"#Y1##Y%##Y-)\"I-!%9%#\"I-!\"YE\"%91&$I=\"#Y=#\"9E##YQ#$9Q!"
+ "#9M!%)U!#YU)#IY!$)Y##J!!#*5\"#IQ\"(J!,#:-##J!!$Z5&#Z=\"%:=!%:9!#ZQ!"
+ "$:E#%JI!$JM$$:M$#ZU!':U$&*Q'#:]#$;!#&+9*!;-&$[1%$[5$&;-(#[)!&+9&"
+ "#[=!$[A!\"[A!$[A!#[I(%+A!$;Y\"\"+I!%[U)%;Y\"%+]!$+Y!'\\!$&\\%$%,)!%,-!"
+ "',9$&<9*#L9#&<9%%<=!%<=!%LI!$\\E#&,M$&<I!(<M$$<Q!%<M!'LQ%%LM\"&\\]&"
+ "&M!!%M!!'-%#%M-!(-9&$=5!&M5%%M-!%M5!%]%\"%MA!!MA#&-=#(-=!%MA!%MA!"
+ "%]I!'MQ((-I&#=M!%]Q!%]U!'-U!(]Y##=Y!%]U!(=]!'.!!&>%\"&>%\"%^%!%.%\""
+ "\".!!%^1!$^9!(N9!'>1'#>)!&N1#'.9&'.1!&N1#*.93%^)!$N1!%^1!'.1*'>5!"
+ "%^1!&N-$&.5!&>I!#N1!&.5!&^9$&.A!&.5!&.5!(N-'&.5!'>1''.1!).1)'.1!"
+ "%^-!%^)!%.1\"(N5,&N5))N!!&.5!$N%!%^%!&>%#(]]-'M])%]]!%]]!&-Y!(]Q("
+ "&^%%%ME!(]I)$MY!'=]!'MA$%M1!%ME!(-A!%MA!&-9\"&-9\"'M1*%M9!%ME*$M5!"
+ "%M=!&]-&%<]!%M-!'=%)\"\\E$+-!+'LQ!#=!!%\\]\"&LU!#LQ#'<M%&,I#%<I!%<5!"
+ "%<I!%L=\"%<=!(,9)&<5%&,A$%<1!&,1%%<!\"%<%\"&,)%%L%''+]!&[Y$$[I!$KU'"
+ "&;Q+$;M\"%;I\"%[E!#+5%%[9%'[=*%+-\"(+A/#;1\"%K-$$+)!%+-&&[%&$+)\"$*]\""
+ "#*I)%JU!#ZQ!!ZQ!$JQ!#JI'$ZE)$JA%$J9!#Z1\"#Z)\"%Z5\"%*1'#Z-\"$:)(#Z!\""
+ "#J!!#J-!$9]$$YM'#9U!#IY!#)M\"#IM\"&9='%9A##I5\"$II##)M%#I5%\"I-!\"I1!"
+ "$8Y&&HI*\"H]!\"(]\"$)%$#9!%\"I-!$Y1$#I=%#))&#Y1##)=##IM!\")A%#YE##YI%"
+ "#9M!!9I\"#YM##J%!$)]#%)]'%9](#J)!$J!\"%*-'\"Z)\"$J%%'I]$%*9&\"J=##ZI!"
+ "\":E\"%*I'%:A$%Z9\"$ZA\"$JM!$JY!#Z]!$[!)%*Y*$J]$#[)!#K9$%[=$\"[E$%[9!"
+ "&[9!#[=!';9#$[E!#[9!'KU#%;M&\"[Q%%;M#%;Y\"(\\!$%,!!%<!\"%K]'&\\5-&,-$"
+ "$<-%%,)!&,9)%,1!'<E%*<1*%LM!%,5)%<E!$<M!&LM*%<M!%\\]\"$L]\"&\\U\"%\\Y#"
+ "%\\Y\"'-!(%<U!$M%!&-%$(]%*'M5)'-1'(M-$$=9!&-9\"&M9%&MU%(=M,&-A\"#=M!"
+ "%M=!$]I\"(-M&%MA!(-A!(MM('-Q&#=A!'-U&&=M$%-Y\"(=Y,'-Y!$MU!$N!!%^!!"
+ "%^%!'.)*).5$$N1!&>%#&>)\"&^5%%^-!&>-\"%^-!&N-#'^!$(>1!'^-#'.)!\".1!"
+ "%^1!'NA''^)*'>5!&.5!%^1!&N)#'.1!$N1%%^)!$^5!&.9!\">E!$N-!-N-(&.5!"
+ "%^1!#^)\"'.)&&N-$'.-%%^)!%^1!(N!'\"-]!!.%!%]Q!&-]!$MY!)MI,$MY!%^!!"
+ "&-]\"#MA!$MM!%]M!%]M!&-I\"%]M!&=I$$MU!'-A\"'M=)&-9\"%]E!&-1,'=)($=-!"
+ "'M-$&M!&%M)!%]5\"#=%!%<]!(=%$%M!!%<]!%\\U#&LU!&LM*'<9!%<I%$,A!%\\=#"
+ "%<A!',=#%<9!'L5&%<E!%;]\"%,1!&[]$'L5!&,!%'<%*%L%#&[Y)'+Y!%;Q\"%+]%"
+ "';U!%KU#%[E$#[E!%+A!%;E\"%[=$&;5\"$[5%$+1\"'K-!#+!!$K!$&;)'$J]$&JQ!"
+ "!ZM!&JY,$*Q\"#ZQ!#JI!%JI!#JE!%*A&$:9$$:-!$*5\"%*1'$J1(#J-!#*-\"#*%&"
+ "#YY\"!Z!!%*!!#9U##IU!&)](\"IM!%IQ)#9U!%Y=,#I=\"!)I!\"I=!\"I5!#IE%%)-("
+ "#8Y'$HY##HY\"#)%#$)!$#9%!\"Y)\"#9-!!Y1!\"Y)\"#IM!\"Y5\"\"95#$YA&%YQ$%Y9("
+ "#YI##9M!#IQ$\"YU%$)U*#Z-\"\"J!!#9Y$%J-\"#J1!\"Z9!%*1'#Z5!%*=#$J9%!ZA!"
+ "#J9!#ZE\"#ZI!#Z1\"#ZI\"#ZI!\"Z]!#Z]!#Z]!$+%\"%;%'$+)!#[)!#[-!%K9($+5!"
+ "&;-$%[=!$[E!%;M\"$[E!%[=!#[I!&+Q%$+Q!$;U\"%<%\"&K]'#,%%%\\!#%\\%#&,)!"
+ "&L1\"%,-!%,)!&L5'%L1\"(L=!$,=!#<9\"%L=\"$\\E($<I&),U\"%L]!%LM\"%<Q!$<Y!"
+ "$<U%\",]!#M!'$=!!(M=.%])\"%L]!&M)!%M)!$=1!%M5!$=%!$M!\"#-1$&=A$#]I\""
+ "%ME!%ME!)]Q(%ME!\"-I!#]E#'-M&%]Q!'=U'#=U!%]Y!&-Y!&]Q!\"-Y!&]]%$N)!"
+ "&>!\"%^!!%.)\"$>-$)>!%%^-!(>!!'.)!#^%\"'.%!%^1!'>=!(^%(%^)!%^-!$^%!"
+ "(N%,%^%!&>1\"%^1!&N)$&.9!(>-!%^)!$N1!&N)#*^1!).1$%^-!#>-!&.)!(>)%"
+ "%^%!,>9'(^%#'-Y!).%$$.%#%^!!(>!!&-Y!%]]!(=U!%]Y!&MY$$]U&%^)!'.!&"
+ "&=I($MI!%]M!$ME!#=U!&]E!%M=!$MA!$-=$']5!%M9!'=Q\"%]5\"%M-!%M1!$]9\""
+ "$])\"#=%!%<]!%<Q!%M!!$M%!&L]!'-!'%<Y%&<Q%'\\E#%<I!%\\A((\\E'%<E!%LA\""
+ "$<5!%<9!',=-$,%%%L1#&\\-(&<1!&[])%,%!&\\!$%,%!&+]%(+]%&+I!%+Q!#[I!"
+ "$+M!'[M%%+M!$KA#%+=\"&+U%&[A)%[-!$;=\"%;-'%+1&#[)!$+)\"%+!\"#ZQ!%JU!"
+ "!*Q!&JU!#JI!#ZM!#ZE!$*Q\"#:9##ZQ!%J=!$J9!#J5!\"Z%\"#Z5!#Z)\"$9]!#*%&"
+ "!9]\"$9]!$YU*%)Q'\"9=#$9U$#9M!%9I)$)E$#99$\"I=!#99$!)='\"95#\"Y-\"$Y-$"
+ "#HQ\"#(U##8Y$!)%!$Y!!#9%!\"I%$$)9!#I-\"#Y1&\"I5!#)1##))&$Y9'$)E#$YI$"
+ "$YA$#YI##YQ##IU\"&IQ*$*-#%Z%##I]!#J-!\"Z)%!Z-!#J1!#J5!'*-!!Z5!#J9!"
+ "$J9!$JU$$Z=\"#ZE!#JM!$ZU%\"ZU$$ZU%#Z]!$[5!%*Q\"$[%%#[-!$ZY%%K1(\"[5+"
+ "%[=%\"[5!%+9\"\"[9!%+U!%;E\"$[A!%+E%(K]'%+U!%+]!%+U!&[]#%+M!%\\%$%L)#"
+ "&L)'%,-!$\\!$$\\1#&L5&%<9!%<E!%L=\"#LE#%<E!*,E\"#<E!%<M!(,I#&LI+%<U!"
+ "#,M!%\\U#%<]!%-1$']!!&=)$&=-$$-)$%M5!\"=I!%=1$&M1%#M5\"#=M!*=5'']1!"
+ "(=5#%]A!%ME!&-A#%]I!$]I\"$MM!$MQ!&]Q!\"-Q!%]U!&N!$'-Y!&-Q\"%.)(%]]!"
+ "&-Y\"%^%!'=Y'%^!!#>!!%^)!(^%#'.%!$N)!%^-!%^)!'>-'%^-!&^)%$N-!&.5!"
+ "#>)!&.)'&.5!%^%!$N!!$N)!%^%!'^-$%^-!$N-!%^-!$N)!&N5(%]]!%]U!%^1!"
+ "%^)!'.%!'.!&*^!!'>!''.)!%]U!$]Q!&-Y!%M]%*.!)&]Y%'.%&%]Q!'-Q'%]I!"
+ "\"-I!#=E!%]A!$M=!$ME!%M9!%-A('M1)$-A$']9!*-5&%M5!#=)%\"-1!%--$%]%\""
+ "'=)$%]%\"$=-!',]'&LQ&&\\Q&%M-!%\\U#$,M)%LM\"&LQ!%LQ!%,A$%<Q!'\\E+\",E!"
+ "#<5\"%\\9#'L%,$<5!%L=\"%,5%%L5#&+]%%\\!#$;U''[]#%K]##;U\"%+U!#;M\"&+E*"
+ "%[I,%K1$#+M!&+A\"&;A&%+-\"$K5#$[5!#[%!!;-&$[!!#ZY!%;5&$;!#![%!$JU!"
+ "$JY$#:U##JA!%Z=&%:I$\"ZE!&ZE*#J=!%J=)$J1%%:9!$*1##J!!#Z%\"$J%!#*!#"
+ "$:!+$)Q#%)U$%)U(%9Q(\"IM$%)A$$9I%$)=$$)I!#I1(%YA+$I-##)-##Y=&$9I("
+ "$XU$!(U!#(Y#\"9!#$)-'#9!!#(U!#)-##I)\"$9-\"#Y-&\"Y9\"#I=%$I=&#9M!$IA#"
+ "\"II!$)=$$9Q!\"9I#$IU%!YY$$*!##J!$!)]!%:1!#Z-\"$:=##:9&$J9!#Z9\"\"J=#"
+ "#ZA\"#ZA!$ZI\"#JE!#JI!$J]!#*U\"'JU%#ZU!$[!!'+%'#[9!$+%\"$+)\"#[9$!;1\""
+ "&K1$%;5\"%+9!%[9!#;A\"%+M!%KI#%+Y!%+=\"#;Q\"#+U!%+Y!%+Y!$+U%\",)!&,!%"
+ "%,!%%L)\"$<-\"%L)\"\",1!)<5%%\\=#&<=%&\\9#'<5!#LE\"&<9!%<M!'LI!%\\Q\"%<]!"
+ "%\\Y#&LY!%<U!&M%%(\\Y&&]!'(]%!']%!(M9$$]1'&]-!%M1!$=1!&-9#%M9!$=5!"
+ "%M=!,-E(%M=!(-E!%]M!%]U!)=I!$MU!$MY!#=M!(=U'$]Q\"'=]'&M]$'-U!\"-Y!"
+ "%]M!%]U!%]]!%]]!'=]!\"-Y!*^!!%^!!!-Y!#>)!$N%!'.%!&>-\"%^%!%^%!%^%!"
+ "%^1!%^-!&^!%'N='%^%!#^)\"(^))$N%!&N)#'.!!(>)!+>%)'.)%(N5!%-]\"%^-!"
+ "(N!(&>!#'-]!%]Q!)M]2'.!%%]Q!&MY$(=Y!%=Y)$]M!'=I((-Q!+-M('=M#(-M!"
+ "%]U!\"MQ\"(]E/%ME!%MA!%MA!%M=!(MA.%M1!&]5!$--$&--#%M)!'=%$%]-''--#"
+ "%\\Y\"%-5#%M!!%M!!'<Y)#LY\"%<U!'<=%%<I!$LI\"%\\Q\"&<I%&,E$%LA\"%<=!$,=!"
+ "&,A$%L5\"#,1!$+]!%\\-#%\\)$&L5\"(,%)$;]\"%K]#&;]!%+Y!&+U%$KQ#$+M!%+M!"
+ "%[I$$;M\"(;M#&+=&&+5&&+9!$[5$$+1\"#[-!#[!!$+)&%[5!$[!!%*]\"$J]!%JY!"
+ "%ZY%$JU!#JM!#[!!%K!(#ZQ!$:A#$:5#!*=$&J=-$J=!#J5!#Z%\"#J1!#J)!%*!'"
+ "$Y]#$9Y(#I]!$IU%\"YQ$$)Q#%IA&#IE!#9M!#Y5#!9-%\"I1!\"Y5\"$9-(#9-!!Y!!"
+ "\"8Q##XI!#(Y&#(U!\"I%!#8M$$9%#\"I)$#99'#I1%!Y1!#I1\"$I9#$)5$#I9\"#YE\""
+ "$)Q##IM!#IE!$9U!\"IU!#J!!%IU'#J%!$YY##IU!&*)$$:-!#:-#!J=#\"J1!\"*5\""
+ "#Z9\"%ZA&'*E$$*A#!ZM!#ZQ!%:I(%JU!$*Q\"#Z]!%+-&$[!!\"[%!#[%!$;-'$+1!"
+ "#K5$$KA$&[9!$+E%%+E%\"[A!&[=$#[5$%;M\"#;Q\"!+I!%<!!&<)&&<%%$[]$%;E\""
+ ")L%'%\\)$%K]#%<%\"#\\)#'L9+&\\5,&\\1('LI*$<M!$<E!*\\E&$,I$%LI\"%<I!$LU!"
+ "&,]#$<Q!'LY*'\\Y+',]'%]!\"#=!!']%!%M%!$=1!%M-!%])\"']9%&]5!'=-((==("
+ "&=M$'M=$&-E\"&M5%&]=!(-I!%ME!&]I!%ME!'ME$$MM!&]M!$M]!%]Q!'-]!%]]!"
+ "$MQ&%]Y!'-Y&.]]0'-]!%]]!&.!!#.!%'.!%$MU!%]]!%]]!%]Y!%^!!\".!!'>!'"
+ "%^1!%]Q!%^%!&MY)%^%!$N%!%^%!%^)!(^!#(.!%%]U!)MU'&.)!(.%%%]Y!%]Y!"
+ "&=]#(=]!%]]!%]Y!$M]!%]U!$]]!&=U#&]Q!%]Q!%]U!&=M$$MU!%]M!'=A#$MI!"
+ "\"-Y!$MI!&]M!&]E!$ME!&MA$$=9!&-E\"%M1!'=1#&-5#&=)$*M1'%M)!%]!\"%--$"
+ "$M!\"'L]!'<]$$,]$%<]!&<U$%<M!%\\I'&\\I\"&,I$&LM&&,E#&<9%&<A%'\\=#&<-!"
+ "',A(%<A!',1)$,%!%<!\"&,)!%<!!%,-!%KY#%,!%'+Y%%+U!$+Q!%;I\"#+M!$+I!"
+ "#;I\"$[9!%+)\"#[=!$[9!&[5%$+-\"$+)\"$;-#!;)\"#+)\"#[!!%K!(%*]\"\"JY'%ZY\""
+ "$*U%\"ZQ!#:I##ZI\"%*]\"%JA!#J=!#J9!%*9'$:-$$Z5&#J=!$Z)\"#YY\"\"Z!!&I]+"
+ "#J)%$)]#$)U##9Q!#9I!%9M)$9I$#9A'#9E!\"IA!%)A'!)5!#Y9#\"99&\"Y)\"\"I)!"
+ "%(M\"\"8Q!#(M!#HY%!XI'#I!\"#I%\"#))&$I),$Y-$#))##Y1#$)5'#9I#$9U$#9A!"
+ "$II#$)E$$IM\"&9M*$)]#\"YY\"$)Y##9Q!$:5$'9Y#$Z5\"\"Z9!#Z%\"$*1\"#Z5\"&*5,"
+ "%Z-&$ZE%#JA!%*M\"$*M-#J=!$JQ$\"Z]!#ZU!$J]!#ZU!#+!\"$*]\"$+1\"\";%\"$K1$"
+ "#[1!$+5\"#+Q!&K=$%[=!\"[A!$[E!$[E!%;=\"\"+U!$;Q\"&\\!,%+U!'L!\"%,%!%;I\""
+ "%+Y!(,).$<-\"&<-&$\\-$\",5!%<9!&L%+&L9!'<E%\"<E\"&<9%%<=!&,E#&LI&&\\Y&"
+ "%LM\"(,Q#&<Y%(\\Q!%LY!$L]!%])\"%M!!%M%!$=)%%])\"%M-!(-=0'-)\"']1*&]9!"
+ "%]!\"&==$)-A!%ME!'=A($MA!#=A!#=5!(=I!%]I!%ME!#]M\"%]M!$MM!'=Q\"%]Y!"
+ "(>)!%]U!%]U!%]U!&-Y!&.!'%]]!%]U!$MU!'-Y!(=]!%^!!%]]!$M]!'N)#%>)$"
+ "'N!)#>!!'^-#'-]!&>!#%^!!%^)!'>!\"&^!%'>!''.!!%]]!%]M!%=]$)-]%#=]!"
+ "%^!!)]]-%]]!'-Y&(-Q!!-]%&=I#%]Q!%]Q!'=Q(&=I#(-Q!#=I!&=M#']M)&]E!"
+ "%MA!(-E!&]9!&-9#&]9!%]E!%]1\"&-9#$]1\"%]-!'M-*$MI!%M%!(-)!&M-!%M%!"
+ "%\\]\"(L]%$-!$$<U!$L]\"%<E!&<Q$%<Q!%LM\"'LM!%<5%&LI&&<9%(\\M&%\\=#%<5!"
+ "%<5!%\\1#%,1!(L-!$,-!%<!\"&+]%';]*%+Y!$[I!$+U!%+]!$+U!$+M)%+A!#[E!"
+ "$[I!&KE#&[A!$[=!$[)!%+=\"%+1\"#+1&\"JU$%;%'#[!!%:U##:Q#$*Y\"$JI%$*U\""
+ "#ZQ!#JE!\"Z5!$*A##J5!'*=%%:=$$Z)&#J1!\"*A!#I]!$Z-&$J!&%Z%'#J!!$IM%"
+ "%9Y\"%9Q%#IU\"\"IQ!#II%#)I\"#YE#!)A$\"9A#$)9$#)%#\"Y9\"%I1'\"I-!\"I)!#9!!"
+ "#8M%#HQ%%8U*#8E\"#)!##(U#!)!!\"I!!#9)!!)1!$)%!\"9-&#95$$9-%#9=$#YA#"
+ "$IE&$)I#\"YQ$#9M!#IY!%J!)$IY%%9I\"$*!#$*%##J%!#*)&!:1\"%:-!$Z5&$*5#"
+ "#J1!#Z5\"#ZI!\"Z]!$:M#'ZE(\"ZI!%ZU*%ZY)#ZY!%+%&'+%#$[!&#[)!!ZY!%[))"
+ "#[-!%+=%$;5\"';5(\"K=#&+1&%+1\"%[E!%+M!&;5\"#KM'$+Q!%+U!%KU#'KY#%+]!"
+ "&,%)$,%!&[]$&\\!$%L-\"$,-%#<5&(,%%%<9!&<9%&LA&$,A-%<=!%<9!&<A!%<A!"
+ "%M!!',Q((LQ!%M!!%<M!$\\Q'&L]&%]%\"',]#%M%!&M-!%-)($=%!%M5!$]1\"!-)!"
+ "&M%!'-5\"\"-9!$M9!)=E!&-A\"%]A!&]A!%ME!'=E(%]E!&=Y-&]9!(-Q!&MU%'MY)"
+ "#]Q#(MY(&M]$$-Q$%]U!%]U!'-U!%M=!%]Y!%]Y!'N!#%]Y!'-Q'']])(-]%'.%!"
+ "(N!!%]]!#=]!%]]!(-]%'>)!%^!!$]]!#=Q!%]]!'-Q!%]Y!$MY!&]Y%'.!!&=Y#"
+ "'-U!%]M!%]U!%=Y$%]Q!$]Q'%]M!'=Y'&-M,&-M\"%ME!%-I#']A%#=I!$MI/&ME$"
+ "&MA$#=A!(=5,&=E#'-9'&]E!'-5''-=!!=1\"(M1$&])&%M)!'M%%$=%!%M!!'--#"
+ "#,]!%<M!%<Y!%\\U\"&\\Q'%<M!(\\M!&LI&%<I!%LM\"&<=!&LA&&<=!%<=!%L5#(<5/"
+ "%L5#(,!!#<9\"$KY#%<-%%,!!$+]!&+U!!+M!';I\"#+M!$[Q$%+]!&+I%\"[=!$[A!"
+ "%;A\"&KE#&[-!%[-!$[5%#[5!#[-%%+)&!+%$#;9\"#*]%%Z]*$+%\"$*Y\"&JU)$JI!"
+ "#JM!$ZI!#JI!$JE!!ZA!#Z%\"$*=#&*1!\"J-!$J9!#J-!#J9!#J%!%J%)#Z!\"#I]!"
+ "$*!#&9U#$IQ%$)Y#')M.#YM##I9\"&)5#\"Y=\"#9=$$9=\"$Y1!\"I1!!Y9$#I)%&Y!'"
+ "\"8M#!HM#\"X]\"#HU%!8Y%\"H]!#9!'$)!!#)-##9%!#I-%#Y=&#)A#!)A!!YA!&IA'"
+ "#YE\"'YM-#95$!Y]!#IY!%YY+$)U#%)](#IU$$:!'#J-!#:9#%J-&%*1#$J5!\"Z5!"
+ "%:9!$Z5\"%:=(\"ZA!#JM!%JI!':E!$*E\"$+%\"%:U##JE!$;%#'+!/'+5\"&ZY\"&;%#"
+ "$+!\"#[1!#[%!';5'%[=!$[=!%+A!%K5$$[=!%KI##[=!%;M\"%+M!%[Y$!+I!(+Y*"
+ "%+]!&\\!$$\\)#%,%!%,)!%,1!$<I*%<%!&L5''L%'%<=!#<5\"'<I$'L5'$LM\"&LM&"
+ "%\\M'%<Q!(\\Q&$,Q$(\\Q,%<]!%M!!'-!''=%)%M!!&=-$&=1$'-1'(\\]!$M%!\"--!"
+ "%]1\"&M1%&M9%!]-$%M9!$=9!&-A#(-I!&]1!'==#&]E!&-I\"%MA!$MI!%]I!(=I'"
+ "&]M!']Y$&=Q((-Q!%]]!%]M!%]Q!%]U!$MY!&-Y!'-U!&MY$(M9.$MY!&-Y!(=Y!"
+ "&=Y#)-Y/&]Y%%-U#&M]$%^%!#.!%%]Y!%]Q!%^!!&MU$$MQ!&]Q!(-M!&-U\"%]U!"
+ "%]Y!%]U!%]M!'MM$%]M!&-M\"(=E')-=%'MM((-Q+&]M!%]I!%]U!$=9!%-=$#==!"
+ "'-=,&]9!)]9$)]5)&]=&&M9$$M1&$=%!&]9!&=-$&--#%M)!%M%!%<]!$<]!%\\]\""
+ "%LY!%\\]\"#<M!&,Y#(\\M&(\\Y!&LI&#LI#%LI\"$LA\"&,E#%LI\"&,=$&,5$%,A$%,1!"
+ "%<=!+,).%L)\"&L%\"#;Y\"$,!!'[Y-#+Y!&;Y\"%KU'&;U&$+M!$KM#$+9\"%[E!#;E\""
+ "%+I!%[A!$[5!%[1!%;-'$+5\"$;1\"$K1$#Z]!&K!$%K!$%:Y#$[!%$:M'#ZQ!$ZM\""
+ "#ZU!#JE!%*E'%JE%#JA!!:5\"\"Z9!$*1\"!J-##J1!%*)'!Z%(&Z).!Y]!#*%\"%)Q$"
+ "%9U%#YM##)Q#!IM#\"IM$$YE$$YI&#9E!#)-##9=$#95!#)1#\"Y%\"#Y1&\"Y%\"#Y%&"
+ "\"8U#\"XU\"#(U!\"8Q!\"HI'\"HY!\"I-$$9!&$)9$#XY&!)-$!Y%$!I5#\"I=$#99$$)=$"
+ "#II$%IE$$9I%#9Q!#YI#$)I!#YQ%$9U!#J!!%:!(#J%!$*%#$*1##J5!$*1\"#ZU!"
+ "#Z=\"#ZA!#:='#ZA\"#:=##JI!#J9%$:M#$JQ!&*U#$JY!!ZY!$+)!%+!&!*]$$+-\""
+ "$+)\"%[-&$[1%$+5!$[1!%[9!%+=!$[A!%KE$$+M!#;I\"#;A\"$+Q!$;Q\"%;Y\"%+U!"
+ "%;]\"',)$%,%!%<-!%,)!%<)!',-)%<1!)<5*&L9&),5)#<9\"%L-\"'LU!'<A!%\\Q\""
+ "%\\=#&,I$!,=!&,Q#&\\M\"%<U!'<U)(\\Y!%<U!&LQ&%M%!']!'&-%#$MA!$=%!&-)#"
+ "%M1!&M%!$=5!%M1!%M5!$-A$&M5%$MA!#=9!&==$%MA!%]M!%]1\"%-=$%ME!%-A("
+ "%MA!'.!!&-M\"'-I''MI)&=M#'MM((-Q!)-]%)=Q!&]Q!%]U!%]U!%]U!%MU%(MU\""
+ "%]Y!%]]!%]Q!%]U!#=U!%]U!%]U!%]U!$MU%%]U!%]Y!%M=!%-9$%]M!%]U!$MQ!"
+ "\"-M!%]I!*MQ0%]M!%MA!#=E!'-U!)=Q!%ME!%M1!%MA!$]U''M=$&M9%&-E\"'=A("
+ "%M9!&-=\"&]A!$-!)&=1$$]1\"'-)#%<Y!%M)!&=)$%M-!)-!'%M!!&-%#&=!$(L]$"
+ "%<]!%\\Y\"%\\I#!,Q!(\\E'%<=!&LE&'\\E\"'LM!\"<E\"&,=$%L5#'<9!%<A&&<-!&<1!"
+ "%L1\"$[U%$+]!%\\!#$,!!%K]'%K]#%+Y!$;Q\"\"+I%#+Q!%;M'&[U((+E*&+A\"$[=!"
+ "#[I!$[9!$[A!'+5*$JY!#[)!$+)\"![)!&+)\"$[%!'K-!$*]\"$*Y\"\"Z]$$JQ$$JQ!"
+ "\"ZM!$J=!#Z=\"$*A##J=!#*5\"%*9#$J5%\"J-!%J1%#J)!%J%\"#J)!$YY'%)]!%9Y)"
+ "#YU\"$IQ%$YQ##9M!#YM\"\"I=!#I=\"#91!%I1!$99(\"Y1\"!)A!#)9#\"I!!#9%!$)!$"
+ "\"XI\"#HQ%#XE#\"HU$#(Y##8]$\"(Y\"%Y!\"#I)\"#I%##I%#\"I%!\"I1!#I5\"$)9'#)=#"
+ "&9M&%)M!$9E$\"IM!!YM!#IQ\"#9M!!YM!&)Y($)]#$*%#%J%&#J)!\":5#!YY!'*9)"
+ "$J9!\"Z9!#Z5!%*A''ZA+#ZQ!\"ZI!$*M\"$JM$#ZQ!#ZU!&Z]%#Z]!#ZU!%+%&)+),"
+ "\"[)!#[-$$K1$$;1#$[5!(;9,&;9#&+5\"%;A&%KA#&+9&';A'$+M!$,!!'[I($+M!"
+ "%+Q!&+]!'+]%%<%\"&+Q!)<1!%L)\"%<-!&L-''L5'&<=!%L=\"'<9*&,5$$<M!#,A!"
+ "%<I!%<M!&<5!%\\E#%<M!%<Q!%<Y!&,Y#%L]!*<M#&\\Y\"#M!\"%M!!%M%!'-1''=)("
+ "$])\"'M-$$=9!'ME$#=-&%]9&&]1!(]5.'=9#&M9%%-=$#==!&-A\"']A%'-A!%MA!"
+ "$ME!%]I!%]U!%]I!%]I&(=E'%]M!%]Q!%]M!%]M!$MQ!&>!\"']Q$%]I!(-Q!#=Q%"
+ "$MM!%]Q!$MQ!&MU%&]Q!'-]!#=E!%]M!&]Q!(-Q%$MY!&MI$(=M!%]I!#=]!&]E%"
+ "%]Q!\"-U!*>!4'=I(&]Q!$MA!%]M!)=A+%]5\"(-E!&=M$&-1#(=9-%-5(%]9!'==("
+ "'=5#%]5\"%]1!*-1*%]%\"(]5$$=)!%]-\"#M%\"%M!!%M-!&L]!&LQ&(,],'-)'&LY!"
+ "'M%$%LE\"&\\Q'&<M!(,I,&,E#)<E.&<9%&\\Y&%<9!'<1*%<9!$,5!%,-!$<1%$,1%"
+ "%L!#(<5%%,%!$;Y\"&K]'%,%!&,!!#+U%'[Q%$[A$&+M!&KU'';I\"&;M\"%+A!%;E\""
+ "%+=\"$[E!%[A(%+5!#[1!#[A!#[5!#[9!$+)!(+!'#Z]!%JY!#[!!#JI!&JU!$*M*"
+ "\"ZE!#ZE\"#Z=\"\"*A\"#J=!\"Z9!&:9!#Z5\"#J-!&:)%\"9]&$:!$%J)\"\"I]!!YY*#9Y$"
+ "$)Q$#YI#\"9M#$II&!YI!\"II'%)M$#)1##I=(\"95#\"91#$)=$#I!#!9)\"#XY#$(U$"
+ "\"8I!\"8M!#(I#\"8U!$8U&!HU!#(]##(]!\"I-!%99)\"I%!#Y-&%))%\"I1!#99!\"I=!"
+ "#YE\"%IA#\"IM$#IQ!!YM!#I]!#YQ##9U!#IY!$9U$#YU\"#J!!#J%!$J1\"%:%%#J1!"
+ "%Z9*%:1!\"Z9!#J=!#ZQ!$*E\"#JI!%*I'$:U$\"ZM!!:U\"#[!!&*Y\"$;%##[!!%;-'"
+ "!+%!%+)&';)#\"[!!%[5)(K1!%+1\")+A&%;E\"$[=!'[I!$[E!$KA##KE#!+Q!$[U$"
+ "%[I!%+Y!%+Y!%<%\"&<=!%,%!%,)!$,)%%,-!$<1&$L1\"%\\5#%L)\"&,1%)L=!$LA\""
+ "%\\E(&,E#%LI\"#,M!$,Q-%LQ!'<Q$&\\U'',Q#(<Y-$,A!&<]$&,]#&-%#&-!#$M%!"
+ "*]%/(]%*'--'$-)$&]1!%M)!)=%\"#M9\"'=1.%MA!'-9'#=U!'--#%M5!'==(%MA!"
+ "(-='%-A,&=I('MM$%]M!%ME!(-M!%ME!%]I!%]I!&MI$\"-A!'=M\"&]M!'-I&%]M!"
+ "'=M#$MM!\"-I!(=M,&MM$%]Q!%ME!&-U!#-E$&M]$%]Q!(]M.$M]!%]I!&]E!']I%"
+ "$ME+&]M!%]I!$M9!&]A!$MA&#=1!%M9!$M9!(-A!'-='&--(%M5!%M1!)-5!&=9$"
+ "&M-!'M5$'-1'&])'%M1!&--#&=)$'-%\"&M%!%<]!',Y(%]!\"%\\Y#%]!\"$<Y!%LU!"
+ "#,U!%<M!%\\M#%<A!&LA\")<A)&,E$$,A$(L5!&<9%$<E!%LA\"$L9\"&,-%%,-!\",)%"
+ "%,)!'L%'\",)!%[M%&+]!%;U\"%KU#'KM'%+Y!%[Y(%;M''+M!\"[I!$[A!&+Q!$[5!"
+ "$+=!&[9)%;9&%+1&#[5!\"[)!%K!(\"[1!#[%!$*]%$*U\"\";%\"#ZY!\"ZQ!$JA!%ZM\""
+ "%:5!%:=$$*M\"#:9#\"Z9!%:5(#Z5\"#Z1\"\":1&$J)\"#J!!%*!$#Z!\"$:)$&J1*#9U!"
+ "%IU&#9Q!#9M!$9E$%YE!$)E#$I9&$YA*#I9\"\"I-!\"I1$\"9-#\"I-!%9%)#9%!\"HU!"
+ "!(E&$8I)\"(I\"$XY*\"8Q!#(Y#\"(Y\"!H]##XQ##9!'\"I)!#I5%\"I1!!9%%\")1\"%Y5."
+ "\"I=!#9A!%)A'#95!#IA%\"IU!#9E!$II&$)Y##IY!$Y]&\"IQ!$J)!#J)!&*-''*-)"
+ "#J9!$J=!\"J)!#ZA\"#J=!#JA!#Z=!#JI!%JQ!$:M$#Z=!$ZU\"%ZU&%*]\"$Z])#ZY!"
+ "#;%##[)!%J](%+!&$;=\"$K1$%[5!\"[1!#;=&&;=\"&+E&$[A!&KA($+M!%+I)'+Y-"
+ "&;U&%L!#%+U!%L)#%+M!%,!!$\\!(%L!,'<!&$<)\"$,1!%<5!&\\%#',9$%LA\"'<=!"
+ "%<A!&<=!',M(&LM&%\\Y\"(L]$&\\M'%LQ!%<U!'LM.&\\Y\"(,Y\"%<I!&,U#$=)!&]!'"
+ "&]%''-)'%M-!%M)!&]!'&--,(-1!(=9\"%]1\"%M1!%M=!%M9!)=5\"$=5!&]=!%]=!"
+ "%=9$(]5.%]I!'M=$%]5'*=9!&]E!*M=\"'=E\"(-E!%M9!#=Q!)]I(*-I*)-I0%]M!"
+ "%MA!&-E\"(-M!$MI!\"-A!%]I!'MI)&-Q\"'-I'%]M!%]Q!%]E!(-I!$=E*(M9.&]5!"
+ "%MA!(-E!&=A$%MA!&]I!(-E!(M1)&-Q\"%M=!%]5\"#=)!%M5!(-E!&-5#$=1*'=1("
+ "&]9!%M-!'-1\"&=%$&=%$']%&&=)$%<Y!$<]!$LY\"&-!$%,U#$<]!&LU!'LY&&LY!"
+ "%\\M#%<Q!%LI\"(LI!%<5!',I)#\\A#$<I!%L9\"$\\1(%<5!%<5!&<A!&<1!%\\%$%\\1#"
+ "%<%!%+Y!$L!#&KU'%+]!#KY'%+Y%$;Q\"$;E\"$;M#&;A'&+A\"&+E%$[A!'+=&&[A!"
+ "%;9\"$;=\"\"[-!$+-\"%;-#$K-$![%!!+!$#Z]!#[)!%K%!#Z]!$:I##ZQ!$ZM%\"ZI!"
+ "#*Q\"$JA!%Z=&$JI%'*=%#J1%$J5!#Z-\"#:-#$Z5\"$:%$$J!&%9]\"%9Y%\"IU#!)Y!"
+ "%9I\"#YM\"#9M!#IE!$)E##9A!#I5%#I=%#)1#\"Y1\"#I1%!Y-!$I!$%8]##)%'\"8Y!"
+ "#(A#\"XM%!HM##HQ&#HI%#HQ%\"8]!!Y!!\"I=!!Y)!$9)\"\"I-!#9-$#I-%#99$!Y9!"
+ "\"I1!$9=%#9A!#9E!$9M!#IM!%YQ$&)](#9U!$9Y!&Z)$$Z!&#*%#\"J%!\":)\"$:)!"
+ "#*5\"&:5)$*5##Z9\"#J=!!ZA!$:E'#JE!%:E!#JI!#ZQ!$*U\"$K)$#ZY!$K!$&K!!"
+ "#[!!$*Y\"$[)!%+5!$K5$\"[-$$K=#%[A%%+9\"%;=\"&+A\"'+Y!%+M!$;A\"$+I!'+U*"
+ "%+U!%,!!&KY#%+]!$,!!%,!!#L1#%,%!%,-!%,)!&,-$%LE\"%L)##,1!#,9!%\\9#"
+ "$\\M#$<A!'L=+&\\E\"&,I#(\\E!#LI#'L=+&]%!%,Q$%<U!%<U!&<Y)%]!\"'\\]&%\\]\""
+ "&-5#%M!!&-%##,]%'=)-$=)!%M-!$]1\"%M1!%M9!&=9$'ME)'-A\"(]5%%-9$%M-!"
+ "\"M9'&M=$'=9(&]=&&-=\"'-A'\"-A!$=M$%MA!$MA!(]E.%M9!&-M'%MA!%]Q!%]M!"
+ "#=E!'=Y\"'-E!$MI!%]I!%ME!\"-E!(-9'%]I!$]E\"%ME!&-M(#=E!%M=!'==(&M9$"
+ "'M9$$ME!%M=!%]=!$M=!'-E!#=A!%-9#%M5!(=9#&-=\"&-=\"%M)&$M5!'-1'$M)'"
+ "%]-\"%])\"%M5!%]-!(-%\"#=!&'M)$&L]!(,U'&\\U&%<Y!&LU**M%$&LQ!&<Q$&,Q#"
+ "!,Q!$<Y!%LE!&LY&'<9*%<9!%<=!&<1!%<5!&<=!&<1!&<1!%L-\"&,!!%,)!#+]!"
+ "%<%!%,!!$;]\"$+U!&;M#'+U*#[I!%+Q!$[Y$%KA#%K9$&+A&%KA$$[E!%;9#$[5!"
+ "\"[9!&[5!$K-$$[-!$;%#&ZY.#:Q#$*]\"$JY!#[!!#ZE!%:A!%ZQ%$JM!$ZI!#J5!"
+ "%:A($*A\"#J1!#Z9\"(*5&#J=!#Z-\"$JA!#J)!$J%\"#IU$#J)!#I]!$YY)$IY&\"YA%"
+ "#YQ\"$YI*$9I(#)E##9A$$Y='\"II!\"I5!\"9-##)!$\"I-!$Y1!%)%)$)-$#9!\"\"H]!"
+ "&XU$\"8E!\"(E\"#(M##XY&#(U#\"8U!$8Q&%8]*#8Y!#XY!\"I%!\"I1!!9-\"\"I1!\"II!"
+ "\"99#!Y9!()9%'IA-#9E!%)9(&9M&$)Q$$YY&$IU%#9U!#)]\"&*%$#J%!$Z!'!Z)!"
+ "#J%!#Z9!#J=!#J9!%Z9'#J=!#J=!#ZA\"\"ZI!\"ZI!$*M\"(*I%\"ZU$%JU!$*U\"%+!\""
+ "#;%\"#[%!\"*Y)%;-\"$+)\"#[1!![1!%+=!$[A!'[9!%;A\"'+A.$KI'\"+5!$[I!$KI#"
+ "%;Q&\"\\!$%;I\"%<%\"&,%!&+]!#,!!'L!'),)-%\\9#%\\!$'<-%%<1!%,1!%<5!$,=$"
+ "&<9%$,9!&<A!&<=%%<I!%LE!&<I%%LI!'LI*&LQ!%<M!'<U)$LQ\"%L]!&\\Q&%<]!"
+ "%L]&%M!!&,U($=%*'-%#%<]!$]1\"&M)!$=%!&M9$'])&'-5'%-1$%M=!%M1!%]-\""
+ "%]5\"$M=!&]1&%=I$&]I%%M=!%ME!&-9#%M5!\"M=\"%]=&&=E#$MA!%]=!#==!&]E!"
+ "&]A&#=M!%MA!&MQ$%M=!%]M!%]Q!$MA!#]Q(%MA!&=A$%-=$'-A'#]9##M9!&]9!"
+ "&]=!#==!&-=#']9!&]5&(=9\"&M1%)--1(-9&&M1%(M=#$-5$&]!\"&--#&])''-1\""
+ "'-)'(-%\"'=)$%<U!%M)!$=)!$]%\"(,]'#LM&',Q#%\\Q\"%\\]\"%<Q!%<M!%\\Q#%<M!"
+ "%<A!&<E!%LI\"%<A!&\\E(%<1!%L9\"%,=%!,5!$<-\"&,5$)<-%&,)!%<1!'\\=,$L!#"
+ "%,)!%,)!%+Y!(+]%&+I%%[I!#+U!%;I&%[I$%;A\"%;E\"%;M\"&[9!\"[E!$[9!%[5!"
+ "&[9!$+5\"\"[1!&+-\"#[%!\"[%!$;!##JI!#*U\"%*Y\"$ZY%#ZY!&:I!#JE!&*E(%JE)"
+ "$JE$#Z=\"!ZI!#J1!!Z%!#J5!$:-!#J-!#J1!#J%$&9]&%*1+#9U!$)Y#$9U$\"IE!"
+ "%YI!$9M$&IE'#99$$)I#!)5!!I1&#)5##I1\"%)9%#)-##)-#%HY$#9!!\"I!!!8]%"
+ "!HE##(M!#HI%!XM!!HQ!!HQ&\"8M!#HE&\"I%!$)!%#9-!#I)%#95!%9))\"I1$#)5#"
+ "#9=$#Y=#\")9\"#IA!\"YE%#YE##9U!%IQ)#9M!!YU!%J)&$YY#%J!#\"IQ'#Z!\"!Z)$"
+ "$*-#\"*9!#:1#$:5$$*9##J=!&:A!#JM!#ZE\"!*Y!\"ZI!$*M\"#ZQ!#:U\"&JY%%;)#"
+ "$*U\"$[!!#[!!%K)(#[)!$+-\"$+-\"#[5!%+1\"$[E!#[5!$[)!%[A!'+E*#[I!%;M\""
+ "$+M!$;Q\"$[5!%+U!&;U\"%+U!%+]!%L!#%\\%($<%\"%\\)#)\\!)&<1!%,1!&,9$%L5&"
+ "'L9+$\\A#$L=&%\\E#%L-#%L=\"(\\A'%<I!',=('<A!%LM!(LY$%\\U#%M%!*<]#%])\""
+ "&LY!%M)!%<]%&=)$&-)#$=)!)=%'&LY&&=9)%])\")M-#%]-\")--+#=1!%]1\"%]-\""
+ "'--\"&]1!%]5\"'=5(%<]!(M9)%M-&&=9$'MA$%]=!(==\"&]9!$=5!$M=!&]=&%MI%"
+ "&]A%%]=+(M=#%M9!$M=!(]=$%M=!(M=.$]9\"&-=#%]M!']5!%M=!%MA!'-Q&&-=\""
+ "&=5$$=9!$=9!']5!%]=&&]5!$=1!%]5\"%M5!$=9!+=-&&M)!%--$%M!!)-)0%M1!"
+ "'M)*&-%-%M%!(-!'#L]\"#,]!&LY!)LQ%&<=%'\\Y!%\\M'&<U$&,Y#&,M$&LQ!&LI&"
+ ")<9%%<E!%<=!)<A.%<=!%LA\"&,)!&<5!&<)!&L9'$,5!'L%'%L)\"$+Y!)<%!';]!"
+ "%,)!#,!!%,!!&[A!(+U%$+I!$,)!$+M!%[I!&[E(&[1&%+1\"%+=%%K!$%[)!%J]!"
+ "$;-#$;-\"#[)!#+!!#[%!#[-!#*]\"$ZU%%;!'#[!!#ZU!!ZE!\"*M\"$:M#$*=\"%ZA#"
+ "$*=##Z=\"$:1!\":5#\"Z-%%J1\"$J)\"#J-$#J)!\"Z%\"\"Z!$$IY\"$9Y$!YY!%*!'$9Q%"
+ "#9I!&)M%$)9!\"I=!%YM(\"I=!!)5$#I9%#Y1#%(Y%%9)#\"Y-%#9%!$H]&!(]!!XQ!"
+ "\"HA\"&8E%$8M&%HM+#HM##H]\"\"HY!$8Y%\"I!!\"8]!#)!##XY##(]##9-$\"I-!\"I-!"
+ "\"I5!\"Y5\"#II!%Y=,$Y9$\"IQ!&II!#YM#$)U#$9U$%)U!%)Y$$)]#$*%#$*)##J%!"
+ "$*)##Z-\"#J5!#ZM!$Z=&#J1!\"Z5!#Z=\"%:A##JE!%*M#\"JU#$*U%#JM!$JY$$:Y#"
+ "#Z]!#ZY!%+=!$ZY%#[)$#[1!%J]!#[=!#[=!%[=$#;1\"%KA$#[1!$[A!&KI''KE("
+ "$[E!%[M)$+Q!$KQ#$[U%'L%\"%[U$%[U$#\\!$%<!!%\\-##\\-#%\\)#%,9$(L1\"%,-!"
+ "%L9\"%<-!#<9\"%<A!%<9!%LA&&<A%&,M#$LA\"%L1#%LI\"(LI!&LQ&%\\Q\"\"\\M#'\\U!"
+ "%\\Y#&LY!&LQ*%<]!%<]!$=!!&M!!%M-!%M)!'-%\"&]1&&M!%&=)$$]-\"%]-!&]5!"
+ ")=1'']5%&--#&]-!*]5)$=5!'M1*&=1$$M%!%M5!']5+&-9\"']9+&=A$(=5(&]5!"
+ "(M-)&=1$%]I!$]5\"\"M=#'-9'&-A\"%M=!#==!'-9\"#]9#$=-!)]A$%M9!*MA\"(=)-"
+ "%]5\"&]-&&]Q!%]1\"%M1!)]=$%M)!$]%\"%M-!&M-!'--\"%,Y$%M)!'=)-'--\"&-%$"
+ "%M!!%]!\"%\\Q\"'LY%&<Q)',Y#&,Y#%\\U#',U#',Q#(LQ*',M)\"<M\"%<I!%<I!&<E!"
+ "%<A!%<Y!%\\=#%\\=#&,9$&\\-((\\5,%,1!'L-&#<-\"!,)!&\\)#&<!&%\\!#&,-$%+Q%"
+ "%[Y$%+Y!%+M!$+U!$+M!!;M\"#+=!$+M!%;M#&;Q'\"[A!$[5!$;A\"#[5!%+1\"';9\""
+ "#[)!#[-!$[)!$[%!#ZU!';!0&:]'$+!&%J])\":E\"#ZU!$JM!#JM!#ZU!&*E$#ZI!"
+ "$ZE)%JA%#JA!$J%!#J5!#Z-\"$:!!$Z%#&)],%*%*$9U$\"YY!\"IY!$)I#$9Q%%YE'"
+ "\"IM!$9E$$I9&$9A!$)='\"I9!$95%#I1\"#)1##I1\"\"Y%\"%Y%\"$8U\"$H]#\"9%##8U$"
+ "\"H=\"#8=%#XE$!HE!\"HM!#X]#\"8Q!!HM!!8E\"#(U##9!%\"I!\"\"Y)(\")1\"$)1!\"Y%#"
+ "!)=!&9=$\"I9$%)=(#)Q##9E!$9I%$YM'%9Q%$:!!#9M!$9Y$$9]!$IU%%J%)#Z%\""
+ "#J-!%:-!#Y]\"!Z-!$J5!%:A!#J1!$:1!#J=!$Z5\"$*Y\"$ZQ\"$JM!(:U%#[!!#JM!"
+ "#J]$&;!(#[1!#[%!$;%#&;)$\"+)!#K-$$+1\"%;A\"%+E!%K1$%+=\"%K9$$+A!$+M!"
+ "%;M\"%+M!%+M!$+Q!$[I!&;Y\"%+Q!%[](#+]!'\\)($,)!%,%!%\\%#%<)&*L%'&<5!"
+ "%\\5#%L5#',1$&<)%&,9$%LA\"',A(%<M!%<E!&<E!'<A!'\\I\"%<Q!'L=+\",I!%=!*"
+ "'\\M'*,Q,%\\U\"'<Q$',]'&=!$%M1!%<]!&]!'$=%!&-!#%]%\"&]1!&=)$']1%'=-$"
+ "(]-%&-)'&=1$%]1!%]1\"']9!\"-1!&M-!%M5!%M5!%MA!)M5(&=5.*==0&]9&%M1!"
+ "%M)!&M5$*]5.%MI%$=1!%M1!&]9!%M5!(=1'(]5*%]5\"'-5'\"M9\"&M5%'M-%%M9!"
+ "#=1!%M5!$]5\"%M1!&-1#&=-$%M-!&-)#&,]#'-%#(]9*$M!''\\Q+&,Q,%\\U#&\\]\""
+ ")<]-&M)%%\\Y\"$LY\"%<Y!)LU3%<Q%%\\Q\"%<Q!%<E!$<M!)<A$(,E-'LE&(<9%&<A%"
+ "%\\9#%<=!%L=\"%<9!'<1%&<1!%<=!&,1$'<1!%L)\"%<%\"&,%%&,!!&,%!%K]#&<-!"
+ "%;Y\"$KQ#%;]\"!;E\"(;Q\"#+I%&;E&%+5\"&+9&\"[E!$[=!$[9!$[A!#[5!#[1!%+)&"
+ "%K%!$K5#%+)\"%*]\"$+!\"%JY$&:U$$;%\"#ZY!$JQ%#JE!$JA!$JQ!%JE(#JA!#J=!"
+ "%Z5*!Z9!#J%!#J9!#J)%$J1%'Z)-$:1$$9]$#9Q#%I]&$:!!#YU\"$)I##II!$9]!"
+ "!IA##9I!#9I'%)=(%Y=(#Y9##)=#\"8]!\"Y%%$Y5*#I9%%9!#%I!(#)!#$(Y(#8Q!"
+ "#(-$#(E!\"X9(\"XE#\"HE!#HM%%XU&$(U!#XY)#X]&\"X]%#I%#$I)'$)%!#))#\"I5!"
+ "#I%#$)5'\"IA!!I=##9E!#IU!%IA#!YA!\"9M#&YY,$IY\"$J%%$9Y!&*-'$Z1&$9]$"
+ "$J%%#Z)\"$J)%#J5!%*9&$:1!$*9\"&J9*$J5!%:=!%:E(#ZI!$JQ$$JI!$:M#$ZU)"
+ "\"ZY!$:Y#\"*]%&+!*$[!!$*]\"%*Y\"$+)!%+%&#[1!#[5!%;9#%[1!'[=)#[9!'+A\""
+ "%+A!&[=!$[U$#KM'#+Q!$+U!$+M!%[Y$$,!!%,%!&,!!%,%!#,%!#<1\"$+]!&[]$"
+ "&<-!&;]\"%,1!(<9!%L9\"&L9!(,A##,1!%<A!'\\=#%<I!',I#(\\I!),M'%LY!\"LM#"
+ "$\\Q#)\\Q4%\\Y\"#LU\"\",Q!&<Y$(<]##LU\"%<]!%M-!&M!!%M)!$M%&#-%%%M%!$=-!"
+ "\"M)\"&=)$%M)!%]!\"%M5!$-5$%M5!#=1!'-1\"#=1!%M-!#=1!(-9+%M1%$=1!%M1!"
+ "#=1!(-1,(,Y(&-1#%-5$%M5!%M9!%=)%%]5\"%M9!%M1!)-9!%M9!%M9!*-1!'M1*"
+ "'M5$&=-$&M9$&=%$(M!.%M-!(-9+'-!(%L]!$=%!&=)$%M!!']!'&L]%%<U!$<]!"
+ "&]1!%\\U\"%M!!%LU&$LU\"%,Q)%,Q)\",Y!'LM!%<M!)<M)%\\I#&,M$#\\=#%LI!%<=!"
+ "(\\-#%<9!&<9!$<I!\"L5+%LE\"$<-!%<9!$,1!%L)\"%L!#%\\-#%+]%%KU#%,%!$,!!"
+ "'+U-%+U!&+M&&;M\"%+U%$[I!%[E$%K=#&;E\"$[=!&[9%#[9!&;5'$+1\"$+5!#[A!"
+ "#[5!#[%!%;-\"$+)!#Z]!&:Q($JY$%ZU\"$:Q$$*Q\"#JM!%ZM*$:Q##J1!#J=!\"ZA!"
+ "#Z9\"#J5!$IY\"%:1!$*)##I]!!:%\"%Z)##J!!$:)$$)Y#!IU&!9Q\"#IQ\"$IE&#99!"
+ "%9E\"\"IY!#9A!#I=%\"IA!#Y1)#)1&\"Y9\"$)%!\"I!!$9%%&Y%#\"XY\"!8U%\"HY$#XM&"
+ "\"8E!\"(E\"#8=%!XE!\"HI!%(M,!8U\"#H]\"!XM!$HY#$8M&#I!#%)%(#Y%$$I%&\"I9'"
+ "$95%$)5$\"I9!!))$#)A##9=!#9=!#Y9#\")I%$9M!#)Q#%)U'#9U!#I]!%9],\"J!!"
+ "$:%$\"Z%\"%:-($*5\"#Z5\"%:5!#J9!%JQ!#Z=\"#JA!$ZE%&*E#%ZI&%JM!$:M'$ZY\""
+ "#:Y#%+!\"&*U\"#*]!#[!!#ZY!&[1&$[)!$[%!!+1!%+=&$[9!$;5\"%;1\"![1!%[5!"
+ "%+Q!$[9!'[M%$;U\"$+E!&+Q!!+M%%;I\"#KM')+Y))+])%,)!%,!!%\\!$%,-!%L)\""
+ "%,)!%L5\"&\\1(#<1\"%<5!#,=!%L9\"$,9!%<E!&<A&&<A!%L5\"%<E!%<I!%<U!$<Y!"
+ "%LA\"%LQ!&,I#(LM/%<A!$LU\"&\\Y&*<]($LY!%L]!%<Y!&<]$%LI\"&LU!']%+'=%$"
+ "%]-\"%L]*'M%%$--$%-)($=!!&-%$&--#$=%!']-!%M-&'=-$$=-!(M-$%]-\"&--#"
+ "'--\"%M%!%M%!'-!#%M-!%M-!'-1'']-*(=--&M%!%M%!%]-\"&M%&%M-!%M!!&M)%"
+ "'M)%%M)!(-!\"%M-!%M!!$=!!%M)!'M-*&-%#&-!#%]%\"%<]!'=%)$<M!#L]\"%<Y!"
+ "%<U!'LY*&LU!%\\U\"%<U!$<U!%\\U\"']%!&LE&%<9!&LE&&<M%%\\9#*L9*$\\5#(LI%"
+ "&<9!%<9!'<1!%L-#%L-\"%<-!%,-!'L)#$,)!%L%#%\\!#$,-!&L%'$+U!'[M-%+M!"
+ "'+Q*$KQ#%+Q!$[I!'+U)%;=\"&;I\"&+A&#[=$&;E&%;9&%;1\"!;)\"$+)\"%+%&$Z]-"
+ "%+)\"%K%!$*Q*#Z]!$[1!#*]\"%ZI*$JQ!':Q!#JM!$:M##ZI\"$:U#$:E$#ZI\"#J=!"
+ "&*1$$J5%\"*1\"#ZA\"$J%(!Z)!$*)##J%!%9])$9Y!#Y]\"!IU##)Q#\"YE\"%9](\"YQ!"
+ "$9E%#9E$!Y5!!)=!#)9#\"Y5\"$Y-*#XU!\"I1!#H]\"#9)!#(U!\"8U#$(Y'\"8Q!#XQ#"
+ "\"H9!$X=(#(M#\"8I!\"HE$#(=&#XE##8Q'\"8I!\"8Y!#8]$$I-'&I!)\"I%%\"Y)\"\"Y-%"
+ "$)!'#91$#Y5&#Y5&#Y)##Y=\"$I5&\")5\"%I=#\"IU!#II%#YA\"$YU##J)!%J-\"%J!#"
+ "#J!!$:%$#J!!#J%!#J-!$J-%#J5(%*5#$*=#'JA\"#JA!$JA%&:E!#JI$#*M\"#ZQ!"
+ "$ZU\"#ZQ!!ZU!'J]!#+!\"\"+!\"%+!.%K)$%[9$#[-!%[1!$K1$&+A&$[%!$[=!'+A\""
+ "&[A)%;E&&KE$$[I!$+I!#KQ##;U\"$;U\"%+E%%+M!';Y*%+U!%\\)(#+]!%L-\"&<%&"
+ "'\\!-'<-!&<-%&\\1#'L-\"%<5!$L9\"%<5!&<5!%\\=#%L9\"%<1!$\\A#%LA\"%<=!#LA\""
+ "&\\I\"'LM+%<M!%<M!%\\Q\"&\\5(&<M!&<U%%M%!%<Y!$LY\"&L]&%L]!'L]*(=)-&]!!"
+ "%]!\"'=%)%M!!%M1!%]%\"%M%!&-%$%]-!(--\"%M-!&]1&&]1!$M)!%M)!'M%$&=1$"
+ "%M1!%M-!\"--!%])\"#--$%]-\"%M-!&M!*#M)\"&-)#(])*&-!$%M)!(,],\"--!'-%\""
+ "&M)!&--#*-)+&-%$&]!!%M1!%M)!%\\]\"%M)!&\\Y&'-1\"%\\]\"&LY&'<M)%<Y!$<Q!"
+ "&<U%%<E!%LI!&,U#'<Q)$<Q!%\\I#'<M%#<E!&\\I\"$,=!%<I!%<=!%<A!$LA\"#,9!"
+ "(L-&$\\5#(L-'%L1\"%,)!&,5%$,!!',!%%L1#&L%'&;]\"&;]\"%,)!%+Y!&[Y)$[I$"
+ "%+Q!%;M&';M\"&;M\"%;E\"(;I&$[E!&+9\"$[=!$[1!$+5\"%+9&\"[9!$;%##K1#!+5!"
+ "%+!\"$:Q#$*]\"#[!!%JY!%;)'$JU$#:E#$*Q\"$ZE&#JI!%:A$&*A#\"Z=!!ZE($*9\""
+ "#Z5\"#J5!$*1#':A!%J5)#Z%\"$*!##Z!\"$)]&%IY*%IE$&)]($)E##9M!#YI#%9M)"
+ "#IA\"#9M!!)=!()I'#Y5#\")1\"\"I)$$)A'\"I)!#I%#$)!%!))!\"9%##8U$\"HQ$\"XM\""
+ "!(=!\"81!#H=\"\"8E!#(E!\"XM\"\"(9*\"8Q!$H]#$H])#XQ$#Y!&#I%##Y)#$8]\"#9)!"
+ "\"I-!\"I1!\"Y)\"#95$#Y9#\"IA!#9E!%YM$\"9A#$)=!#YI#%)Y!#IY!!YY!$9]$\"I]#"
+ "$YQ##Z)\"%:1!\"Z)!#J-!%:1!!Z9!\"Z5!#J-!#JI!#ZA\"%ZM\"#JI$#JI!#*I\"#ZU!"
+ "$*Y\"&ZU*%*U'%ZU)!+!!#[-!%[!&$+%&$;%\"#[5!#[-!#[1!$[5%&[5!%K=#'[A!"
+ "&K=(%+A!%+9\"'KE('[I!%+E&#KM##[E!#[I!%;Y\"%+Y!$[Y$&KY'#\\!$%<!\"&L!#"
+ "&L%'%<9!%\\!$$,-!%L!'#,1!&<5%$L=\"%L1\"$<9!%L='',=#%<E!&,E##,E!&<E!"
+ "%<=!#LI\"%<E!+LM*%<M!(LM!$<E!%\\Q\"%\\U\"%<U!&LU!',Y(&\\Q\"&]5!)-1!(\\Y!"
+ "&,]#%]!\"&\\]\"&]!'\"M!#&M!&$<Y!%M)!'-)\"%M-!\"M%\"%\\Y\"%M%!%M1!$=5!'-)\""
+ "%]9&%M)!%=!$%M5!%M%!%]-\"%M-!(])%']!!%M%!(=%(&]-&%<]!#M%\"%]%\"\"])$"
+ "&]-&$=!!$\\]#%]1!%M)!%M!!&-%$%M)!%\\Y\"&M!!'-!-&LY&%LQ!&LU!%\\U\"'LQ%"
+ "$\\I#)\\Q&'LM*#,A!&\\Q'#\\Y#%<E!&L=\"%,Q$&<5%',A-%<=!\"<A\"&<=%)<1!(,9-"
+ "(LA!%,1!%,1!%,-!$<)\"%,%!'<%!$KY'';Y+&,!!'+Y!&<!\"%+Y!%\\5#$+Q!&KQ+"
+ "$+Q!#[E!%;I\"';M+%[A!#;I\"\"[9!#[=!&+A\"%;5#$+)\")[1*$+-\"#[-!$+1\"$Z]%"
+ "&+!*\"K!$#[!!#ZU!#Z]!$ZE\"':U)\"ZI!#JI!#J5!%*A#$:Q##JE!%:A#%:1)!J9'"
+ "$J)!$J9!#J-!\"J1!#:%##)]#%*!!#)]#$YY#$9Q(#Z%\"#IU!#9Q!%YQ+\"YU\"#)Q#"
+ "#9A$\"Y9\"!)A!\"I5'#I5%#91$\"Y)\"!Y1!%)!($9)%\"Y!\"#8M$$HU)#HQ\"\"8Q!\"8I#"
+ "\"85!\"8A!#(=#\"8=!!(E!\"89!!HI!\"XM%#8Q!\"8Y!!(Y$!I))\"8M!#I!%$I%*$))!"
+ "\"I9!#Y!$$)1'\"I5!$Y9!!Y9!%)=(\")Q\"$IQ%$YM#\"IM$$YI$#YM#$9]!$)Y#$I]&"
+ "%YM!'*1-$)Y#'*)%$J%&\"Z9!#Z-\"\"J)!#Z%\"$*9)#J5!':!'#J=$$Z=)#J-!#JM!"
+ "&*M+!Z=!#ZQ!&*Y#\"ZY!#Z]!&JY)$;!\"%+%&\"[%!#[!!#K-$%+1&%+5!$[5!'[E!"
+ "$[9!#[=!!+9!%;Q\"%[A!&;M'';A,#+I!#[9!'+Q*%[U%%;M\"%+Y!);Y+#K]#&<!\""
+ "',%%'<!+%+M!&L%\"',%*%L-\"%,1!%<1%'<1!(<5!$,9!%<)!&<9!%,1!%<A!$,9!"
+ "#,I!$<E!',A(\"\\I#),M\"%LM\"&<Q$'-!'%<=!&<Q$%<U!%<Y!$\\Q#',](%<I!%L]!"
+ "#,Q!$<]!']%!'L]*'\\]&%M!!%<M!']A%%<U!%M!!'-!#&=!$&LU!%]%\"%M!!%M)!"
+ "%=)%']!!%M%!(=!-&M%!&M%%&L]!$<U!$]%##-%$(-%\"+=5+#]%$&M)!%,U$']5+"
+ "%L]!(\\]!&L]%$<]!%M!!%\\]\"*,U'&,Q-%L]!&LU&)LQ*#,Y!%<M!&LQ!&<A&*<U)"
+ "'\\M+$L9\"&,I$'L]!%<A!&LI!(,Q((\\A\"%<A!%<%\"&,9$',=#%<M!'<1%%<5!&,-$"
+ "&,1%&,-)%,=$%<5!%<)!%;]!#,%!%,!!$+]!%<!\"%+Y!&[Y$%[U$&+Q!\"[E!$;=\""
+ "'+A\"%KQ#$+U!%;E\"%[A$&K=($[E!&[9!&[A!![A!#[1!$[)!%+%\"#[!$#[-!$K!$"
+ "\"J]#%JY!#ZU!$Z]%#*]!#ZI!#JE!%ZU%#JQ$#ZA!#ZA!#JA!\":=\"!Z9!$:1!#Z9\""
+ "$*1\"\"Z=!#Z%\"&J%##J%!#J!!%I]##J!!#YU\"$)U#$YU&#9Q!%IM&#YA#$9I%\"I=!"
+ "#9=!\"YA\"#Y9#$)!$%Y1(\"I5!\"Y%%#)1#$Y!'!Y!!%8]-$HU)\"8U!#(]#!(M#%(Q,"
+ "!H5!#(9$#X='\"X)&\"8=$\"HE$#8Q!\"8M&\"8A!\"8U!\"8U!#(Y##8]$#I!&#XY##I%#"
+ "\"I)!#(Q!#91!$))$#9)'\"Y5%!)=!$I9\"#99!#9E!#IM\"'9I+&*%$$IU%%)U$#)]#"
+ "$J!\"$:!$$:!$$Y]&#J-!$JA!!:1\"$:)$#*5\"\"Z9!%JI!#*U\"#JA!#J1!$:M$$*=&"
+ "#ZM!$*U\"#ZQ!#Z]!#ZY!&J]!$[!!$+!\"$+!&([1\"#[5!$[-!$K5#$K5$#[9!%;E\""
+ "%+9!$+9\"&[=$%KA#%KA#';=\"#[I!%KM('+M!$KQ'#;U\"%;U\"%+U!&;Y\"%,!!#[]$"
+ "%<!\"%,!!$<-\"'L)\"$<-\"$,1!!<)\"$,-!&L1'&,5$%<5!'<1*\",5!%,1!%<=!#,=!"
+ "$,9!&<M%(,],&<=&#,E!$<I!%\\Q\"',M#%<I!$LU+%,Q$&\\E(%<]!(LM/(LY$'\\U&"
+ "$<U!(,]1\"LY'#,Y!$<Y!%,]$%<])%M%!',]')<Y('=-($<]!$])\"%M!!\"M=\"!-!!"
+ "&=)$&LY&$=!!%]%\"$]!#(<Q-%]!'%]!\"%]-!\"M!'&-%$&\\Y&%<]!&M!%&<]$'\\]&"
+ "\"=!!%<Y!%<Y!'L]!%=!%%LY!%<Q!%<Y!%<U!#\\M#%LM\"%\\Q#(LU)&LM!(LM!'<Y)"
+ "&\\=#',M#&\\E'%LA\"$,=%$L=\"&<9%$L9\"%<=!%LM\"&<9!%<9!&L9&'<=!&\\1#%\\=#"
+ "&,-$$L-#%\\)#(,!!'<-*\"+Y!&+]%'L%+';]+&;Y&%[M%'KU##[Q%$+M!$K9#'[M$"
+ "%[M%&[E$%[E!$;=\"%K=$$[1!%+-\"$[)!$K5$#[)!$;=&#[1!%+)&#[%!#ZY!\"ZY%"
+ "#[%!#ZY!&:Y(#ZQ!$JQ!#ZQ!$*M\"%:E$#ZE\"$*E\"#*E\"#J=!#J9!#Z=%#Z5!$J1\""
+ "$*)##*%\"!Z)!&:-,$Z!&!Z!!#I]!$)U##I]!%9M)#9Q!$9U$$)U#$)Q#$YE*$I=&"
+ "$)I'#)1#!YA'#99$#I1%\"Y%##))#!I%(#(Y!#9!!#8]$#I!%#HE#\"XE\"\"(Y%\"XM\""
+ "\"(!\"\"8-!!(E##X='#H1!$XA($8I#$XQ$$(M\"#(E!\"XM-#I)%!HY!#8Q$\"Y!#$9!%"
+ "!))!#Y)'\"I%!$I1)\"I5!\"I=!\"I)!\"I1!#9M!%IE##YM\"\"IA!#9M!&II+#YM#%YU#"
+ "#I]!$9Y$!Y]!$)]#!Z%!#Z)\"!Z1!!:%\"#Z-\"#*5\"&*5#$*=#$JA$\"ZA!#:M\"$*Q\""
+ "\"ZU!\"ZI!#ZQ!$JI!%*I*$*Y\"!*M!$;!\"#[%!$+-!%;%'$K%$![5!#[-!#[1!$;5\""
+ "%;1#&K5($[=!';9(%;A\"%K=##;E.%[E$\"[I!$+M!#[M,&+Q%%+U!%+U!%<%!%\\!#"
+ "&\\%($,!!$,!!&<)&%L1\"&,%!$,5!%,-!%<1!'L1&&,1%%<5!',I(#\\5$#,5!%<A!"
+ "%<U!%<=!%<=!(LA!%LE\"#,I!$<I!%<Q!)<M$&<I%%LQ&%<Q!\"<=!%\\Q#',Q#%\\Y#"
+ "%\\Q\"'LU/\",U!%LU!%LU!%]!'&M!!'<]$#<Y!#,]!$L]\"(=%#%\\]\"%LE\"$]!#&<U%"
+ "%<]!&<]$(\\]/&,Y#$<U!#,]!%LU!#=!!%\\Y#(<]-&-1(%LU&%LE\"#,Y!%]!'%<U!"
+ "%<Y%&-!$&\\U\"$LM\"&LU!%<U!\"<U\"%\\Q#&<Q%&<Q%%<M!),Q'#,U!'\\I&$<I!(,I,"
+ "&\\E\"%LE\"&\\E,%\\A#'<E))\\A&'L9\"%<E!#<9\"%<A!%L9\"%L9\"%,A$%L1\"&<1%%;]!"
+ "%,)!#<%\"(<%!%,!!'L!,%L!#$KU#$+Y!%KU##[U$%KU#$;M#\"+Q!#[I!&+I%&;I&"
+ "%;E\"%+M!#KA#';9##[=!%;9#%;9\"%;9#\"[1!&+1&#[1!$+)\"%J])#[1!$[!%$*]\""
+ "%[)!$Z]%#ZQ!%*U\"\"ZE!!*M!#ZI\"!ZM!'ZA/$*A#$:5$#*I\"#J=!#J5!\"J1!#J-!"
+ "&J1*#J)!#Z1\"#Y]\"\"Z)\"%I]#!YY!$9Y$$I]%#IU\"#IY!$IU\"#IE\"#YA##YE##)5#"
+ "!I5&#)9#\"I5!#)1#\"I5$#9-!#9)!\"Y%\"#9!!#(]#\"I!!$XQ(#HU%\"HQ!\"XQ\"\"HI$"
+ "\"GY\"\"8)!\"HE!\"8=&#8=$#H=#\"XI\"!HI!#(M#\"8M!#8M$\"8U!#XU&\"I!!!9!\"#X]#"
+ "$I%)!Y)!\"I-!\"Y1\"\"Y-\"\"I5!$)=$#)A#\"Y9\"%9=%#YI&#9I!$)M##9I!%I]&#9M!"
+ "%9Y)$IQ%$Y]&#9Q!#Z!\"#J)!$:-!#J1!%*1#$:-#$I]\"$:)!$*5##J1%#JE!#*E\""
+ "#JE!#JI$$ZA\"&ZU\"#*I\"$*U\"$*Y\"$*]\"%*]&'[!&'+)+$[1$(K!2$K-($[1%%+1&"
+ "$+5\"&+5\"$[5!%K=$%KE#%[M$%[A$#[E!*KI($[I!#+Q!$+Q!%+Q%%KU#%KU#$+Y!"
+ "&[Y(#+]!'<)&(<!+$;]\"%\\%$'L5*$L)#%<1!&,-%&,-%&<1!$<5%&L%\"&<9%',9)"
+ "%<9!#\\=#$L9*$\\=#$LA\"*,A('<E%&\\E(%<M!$LI\"&]!\"%<A!%\\M#%\\U\"%<M!&LM&"
+ "&LQ!&LM!%<U!%<]!$<]!$<Y!&\\U\"&<E!%\\Q\"%\\U\"%<U!#\\]#%<]!&\\Y\"&LU&(\\]+"
+ "'\\Y!%\\U\"%<U!%,U#\",]!'\\U&%<Y!&<Q%$M!!(LY.%M!!%<Y!'\\Q''\\U\"%<U!&LU!"
+ "(<]-*\\U/)LM*%\\Q\"(,U(&LQ&#<Q!+,Q'%\\Q\"#,U!&,E#%LA\"%<E!&<I!(\\A\"%LE\""
+ "$<E!$,A!#,A!'LE/(\\=0&,1%(<=*&L1\"&<1!&\\5#%\\1#%,1!%<9!&<-!(<-!%K]#"
+ "%,)!'L%+&<-%%[Y$%;M\"&+]%'+]!&;Y\"#;M'&+U!$;A\"$;E\"&+A\"&;M\"&;I\"&+M!"
+ "$[A!%[A!%;)#%+)\"&[=!&[5!'K-!#[-!$*]\"#[-!$[-)#[1!!;%\"#[%!$J]!\"ZU!"
+ "$*Y\"\"*Q\"&*Q'$*U\"%*A'#*=\"&*A+%:Q$\":A#%J1\"\"Z=$#J5!#Z-\"\"J1!$:9##Z-\""
+ "#J%!\"*1\"\"J-!#J!!%Z!'$)Y#$)Y##IQ!$)M#&IM$#YI#%Y=$#9E!$YA'#Y9##Y5&"
+ "%)E(#I9\"%9-*\"I1!\"9-&#I1%#Y9#\")!\"\"I!\"#(Y#%8Y!\"HA\"\"HE!\"(Y%#(Q&$8I)"
+ "#X5!$X)#$89#\"H=\"!HE!\"XM\"\"8I#\"(I\"#(M##XM##(Q!$HU#\"8Y!!HY!\"I!!$8Y&"
+ "#)%#$(Y!#8]$\"9-&$I1##)1#\"I5!\"I9!#95$!YI!#9E!\"IE$$IE)%)Q!%)U(#9Y$"
+ "#IU\"#Z)\"#I]!$:%$#J!!#J1!$YY#$:5$#J)!':A%#J5!&:1)!Z9!#JA!#J9!#ZA%"
+ "$JA%!ZE!\"ZU!#JI!#JI!%ZI\"$:U$$JY!$:Y#$J]$&[!\"$+-!#ZY!\"[!!&K1$$;-#"
+ "#[-!%+-\");5(%[5!(+M%%KA$&+I!)+5\"'+A\"%;I\"&KM'$KA#$+M!$;]&$+Q!%;Q\""
+ "$+U!$+Y!'+U!&+]%&,!!&[U$$,)!$L1\"&,5%',))%,1!%\\-(&L9\"%<1!%,1!%L1'"
+ "%<5!&,9$'<9!$L9##<1\"%\\9#$<E!&<E!%<E&%LE!$,9!%<U!%\\I#(LM&'LU!(<I$"
+ "%<M!'LE!%LM\"%\\U\"&<M%%LI\"&,M$%<Q)%<E!%\\Q#%\\]\"%\\Q\"&\\Y!&\\M\"&\\]&&<U$"
+ "%LQ!$\\Q#&<Y$%<M!%\\Q\"%<Q!&<]$&\\U&#,Y!%<U!)-!\"&]!\"%LU!$<Q!'\\I\"'<Q)"
+ "%\\Q\"'<]#%,Q#),=-#LE\"&<M%%<I!(,I)&LI!\"\\M$%\\Q\"%<E!%<Q!&,M#&LA\"&\\A#"
+ "!LA#(\\A'%,1!&<=!$,1!(<5%'<5%'\\E\"%,1!(L1\"&<5!&\\)#%,-!%,))%,)!%,!!"
+ "%+Y!'L%\"%<!\"&<%%$+]!&+Q!$+U!&+Y%$KQ'$;Y\"$KQ#$KQ#%;M&$[I!#[E!%+M!"
+ "$+9\"'K-%$+=%$+9!$+9!#+9!$+1\"%;5'%+)&%;)'#[%!!;-&%;!'#Z]!$[!!%*]\""
+ "#ZU!$*Y%#JI!%JM!%:U'%JU!#JA!!:A\"#*A\"$Z=\"\"J1!$:E$#*E%$J1\"#Z-\"$Z)\""
+ "$Z)&$)Y#%J)&%)]($:!$!YY!#9U'#IU\"!YY!$IM\"%YA+$)M$$IM\"#9A!#)1##Y9#"
+ "!Y9!\"I1!#I9\"#Y-#\"Y9\"#I%#$(]$#HQ\"#9)!#8]!#XE'#(U##(Y#\"8Y#\"8Q!$(I'"
+ "\"81##H1&!H%#$X5##89\"\"X=\"\"HE!\"8E!\"XE\"#(M)\"XQ\"!HU!#(Q#&I)/\"8]!\"I)$"
+ "#9!!#I%\"\"Y%\"#)-#$)-$\"I5!#)9#\"Y9\"\"I9!!)9!#YE##9I!\"YI\"#9I$$9M$'9E$"
+ "#)U)!YQ!#IU!%*-#%*!!$*!#$:%$#Z)\"%J)\"\"Z%%%*!!\"Z5!%Z9*$Z9\"&:5!#ZQ!"
+ "'*M'#ZA!$JI$$*U\"\"ZM($:Y##ZU!#[!!$*Y\"$*U\"$JU!#[!!$;!\"%*]\"%JY!$[)!"
+ "#[)!$[!&![=!$[5!&[9!$[5!*+=+)[I*&KI(&KA$%[A!$[E!#[E!&+I*#[E!$KQ#"
+ "'+Q!%+U!%;Y\"%KY#$[I!%K]#%,!%&<%%%L-\"%,!!%<%\"%\\%$%,)!&<-!%,1!$,1!"
+ "(,)-$,-!%LA\"%,1!'<-%%\\=#(LA&(L9&#,=!$,A!&LA&(,M#&\\E(%<E!&,A$%<I!"
+ "'<I)'<I$'\\M!&<I!&<Y$*,M#&<M%$\\M#%<I!&<I%&,U#&<E%%<M!(,Q#%\\Q\"%\\Q\""
+ "%LE!&L]%%<U!%\\Y\"$<I!%M)!'\\U\"$<Y!%<U!%\\]\"$<Y!%]!\"$L]\"(,M#$\\M#%,I$"
+ "&<M!\",=!#LI#%\\I(%<I!%\\Q\"%<I!%\\E(%<E!%\\E#%<9!&<9!%L=\"&<=!%,=$%LA\""
+ "',M)%\\9##<=\"%<9!&<=&%<9!%<5!%<5!%L%#(L-\"'L=&%L5\"&,)%',%*'<%%(KU#"
+ "%<%\"%+Y!),-$'+]!%;]\"%+M!&+Q!#;]\"%;I&%<!\"$;I\"&;A&%;E\"&+9\")KA$&;A'"
+ "&[9)'+9*\"[9$&;9\"%;E\"$;)\"%K-$$K-$$[)!\"[)!$+1\"#ZY!#ZQ!$:Y#![!!%*U&"
+ "$:]##JE!#JI!&JQ!#JI!$JE!$:A#$:9##JA!&:9!#J1!$:5$#J=$#J-!&:5!%*!$"
+ "#J1!#Z!\"\"J!$#I]!#9U!#9]#%)U!$)M$#YI##II$#I]!$)E!$)9$!YA!\"I9!#)9#"
+ "$Y1$#I%\"#)-#\"I!!\"Y)\"&)%'!Y!!\"8]!!Y)!!Y!!#(U!#(Q#$(U%\"HY!\"8I!#X5&"
+ "#8-\"#81%\"X=#$(5&\"X)\"$8=&!(A!$85)!XY$!HI!$(M(#(Q#\"8Q##HU%\"XY\"$(Q%"
+ "\"X]%#(U!\"H]!\"9)&#9)!\"XY\"#9-$\"Y%\"!Y9!$)-'#YM\"#IA!&II($9M!#YE\"$IE,"
+ "#YQ#$)M$#9U!&)]!%IM*$9Q%$J%%$9U$\"J1$$Z)&$*9\"\"J-$#J-!#Z9\"$*=\"\"Z9!"
+ "$ZI)$JA%$J=%$:E$$*M\"#JE!#ZQ!#ZQ!$J]$#*Q\"$*Y\"#ZQ!#;!##+-\"$;!\"#+)\""
+ "![-!%+)&#;9\"$[1!%KA$%K1($[9!%[=!$[=!&[A!%[9!![E!%+A!&KI$$+Y!&[M-"
+ "$;Q&%+U!%[M%%+Y!#+]%&+Q!$;U\"$L!#&+]%'L%\"%\\%(%<!!%,)!$L)#%<=!%\\E'"
+ "%<5!'\\E'%<1!#,I!%,)!%\\=#%<9!\"\\=$$<-%%<=!(,%*%<A!%LA\"%\\=#&<E!&<E!"
+ "%L9\"%LM\"%LI\"&=!$%\\Q\"$LI&&LI&'<A)$LM\"%,Q$%<M!%LE\"%<Y!&<M!%<Q!%<M!"
+ "%\\Y\"%<Y!\"<M\"%<U!(\\E\"%LI&'LM!%<M!'LM!%<M!%\\=#$<U!#,9!&\\M\"%<I!$<I!"
+ "&LU&(,I#%<E!&LI&(<9!$,A!%\\A#&,E$',I)#\\)'%\\E#$,A!%\\9#&LE&'<=!%<=!"
+ "&L9+%<9!%<5!&\\5(%,1!&,))&<%&%<9!$+]!$,)!',%%%L)\"$,%!&,1$',))'L!\""
+ "&;]\"$;E&&K]+$[I!$;M\"'KQ#!;Q\"$+Y!&+U)%+=\"&;I&#[E!%[M)%;A\"\"[5!%+I&"
+ "(+=&%+9\"%[%)#[1!$[)!#[5!#K5$$+!\"#[%$$;%#%;-'&K5$$:]#!JY#\"Z]!%ZQ&"
+ "#JM!#JA!%:I$%ZI'$*E\"$:=##Z=%$JI%%*9'&:M!$:1!$JA$$J-%#J-!#J-!$J)%"
+ "\"J%!#)]\"#9U!#IY!$)U#\"I]!#YQ\"#9I#$YQ#$IE##9A!#YA#$)I#!)=$\"I)!!Y5!"
+ "#I-%\"I!%\"I-!\"Y!\"!Y%!$91\"#))&\"H]$\"8U!#(I#\"8Q!%(E&\"XE##HI%#8E%\"8A!"
+ "#(-$$(-#$(9%#89\"#(9$\"8)!#(=$#HE#\"X=#\"8U!\"HQ!$(M!\"XE\"!XU!\"8]&#X]&"
+ "#Y!&#I!\"$Y!'\"Y%\"\"95##)5&#91!#95$#9)$#9=$$I-#\"YA\"#YE#\"IU!$9I!$9U$"
+ "(YU'()Q+#9M!\"YY$#J%!!*!!\"YU\"#Z-&%J%\"#J!!$*!#\"J1!#J)!$Z5\"\"Z9!#J-!"
+ "#J=!#*A\"#*A&%JM!!ZI!$*Q&$:Q#\":Y\"$:U$#ZU!#[)!#Z]!$ZY%#Z]!$*]\"#[!!"
+ "#*]\"$+!\"$[5%#+1%$;1\"#[5!%K=$%;9\"'[=*$[=!&;E'%;U\"$[E!$[I!'[I-$<!\""
+ "';M\"$+Q!$KA$#;M&$+U!$[A!'+Y!&+]-\"+]!%+Y%$,!!%,)!$,%!%\\%#%,%!&<)!"
+ "%,-!'<-!&,!!%\\E#%,-!$L5\"$,9!%,1!%<5!&LM&\"\\A#$LA\"%<I!%<9!%<5!#LA\""
+ "$<1!$LE\"',E(%<E!%\\I#)\\M&%LI\"%LE!&\\A(%L=\"'\\5,%<E!%<A!&,I#)<I)$<I&"
+ "%\\A#&-!$%\\Q\"%LI\"&<I%'<M.%\\Q\"%LI\"#,I!%<M!#LI#&LE&',E#%LI!'\\9'&<E!"
+ "&,U#%<E!'<5!',9$&<A*&L=!'<A%\"<A\"&<A&&L=&$<1!(,9#%,-!%<9!',5-%<5!"
+ "',E#'<1!%<1!&,1%$L=\"%,1!)\\-#%+U!&+Q!%,!!%L5\"%,%!%<%!'L%,&+]!&;]+"
+ "%;M\"%+Y!$KQ#%+U!&;Y\"%[Q$$[A$$[]$%;I\"%[E!&[E!#[I!&;E&$[=!%+A&\"[9!"
+ "%[5!&+1*%+1\"![1!#[-!$+-\"#[!!%JY!%[-)$+%&$[!%$;)\"!ZY!&:I!%*Q*#ZU!"
+ "$JM!$*M\"%*I\"#ZQ!#JE!%*A'!*9!$Z%&&:=,#*5\"\"J1!!:9\"$I]\"%J-\"#I]!$*%#"
+ "$Z)&&)]%\"Y]!'Y])#YQ#&9U#()Q.%IQ#')=+#Y=#$)9!%)A($)I&#)9#!Y5!!H]!"
+ "\"Y1\"#I1%\"I-!#Y))#I%\"#I%#\"HU$#(M#\"(]\"%8U##XI'\"(M(\"8I!#(U!#(E!\"8=#"
+ "\"8)!\"H)!\"(-\"#H5#\"XA#\"89!\"8=#!(Y!$HI*#HE\"$XU*#X]&#(Q#$8Q(!XY!#(M#"
+ "\"8]!\"HU!#9!$$Y!$#))#\"Y1\"#)5##9-$\"I9!$95(!Y9$\"I9!%YA.%)A\"$)E#$9M!"
+ "!YY!')E-$)A$#IU!#9U!%9]($:!$$9]!#:1#$Z-\"#J)$\"Z-!$*-#%:=+#J5!#J5!"
+ "!Z=!#J=!%ZI*#JI!\"ZE!#ZI\"$JM$%ZE\"$JQ!$*U\"$*U\"$*Y\"$*]\"#Z]!#[%!$;!#"
+ "%+%&#[)!!;)&'[)&$[1$#;9\"#[9!'[=%%K9($[=!\"[=!'+A.$[I!%;E\"&;E\"%;]!"
+ "$[I!\";M\"$+M!$+Q!$+U!&+I%%,%!&\\-(%+]!%K]#'KY#%<%\"&<%%%[]$#L%#&L!'"
+ "$,1!$+U!%,)!%<=!$,1!$,1!&,%*#<5\"&<5%&<5!%\\9#$,=$&L9'%<9!(LA&&LE!"
+ "%<E!#LM\"$<E!&LA&#LA#%LA\"%LE\"%\\A(#,E!'LE!%\\M#$<E!%<A!%<9!&,E#&,I#"
+ "%<I!%<5!&<5!%<U!'LE!&LM!$<E!$LI\"%<A!'<Y$&,E$%,=('<M)'<E))<E)%<A!"
+ "%<A!$,A!&\\E'%<A!%LA\"%L)\"%L='$LI\"%<=!'<A*%<5!%<=!&,1$%L-\"$L1\"%L9\""
+ "&<5!(LA/%\\)$%,-!'<1*&,)%%L)\"%L1\"',%!$,-!%+Y!%,1!'[])%+]%';U\"%+U!"
+ "%L!#%+I!&;U\"#[M%)KI,$;A\"%+M!&K9($[A!$[E!'K5$#KE#%+=\"%+=\"%[-!%[9!"
+ "$;5\"$K5$#[1!![-!%+)\"$;)\"%[)!$[!!$K1$$*]\"#[-!#Z]!#ZQ!%JI!$*Q\"$JM("
+ "#ZI\"$ZI\"#:E'$JQ!$ZI%\"Z=!\"Z=!\"Z9($J%!#J1!$J%\"\"Z!\"#J)!$*)##J!!%9Y&"
+ "#)]#$Z!\"#IY!\":%\"\"IM!#IQ!#9M!$II)#9A!'9E$#Y=##I=\"\"Y9\"!Y9!\"I)!\"Y-\""
+ "\"I!\"\"91#$Y)$#9-!#(]##(]#$))'#95$#(U#$(M\"#HE%!8E\"$8E&\"XE#\"8A!#(A$"
+ "#(%$\"H)\"\"X)%%89$#H5&#(5!!H9!$(=!#XA!#XI!#(E$$(U$$8Q(!(U!#8U$#(U#"
+ "#(Y#\"I-!#9!$#Y1##9%!!Y1!#I1(\"Y5\"$I=#!I=##9=$\"I9$$IE%$)9$$)A!$II%"
+ "#IE\"$9Y$%9I)%*!(#9U!$*!'$)]#$:!$&Z5#$*%#$9]!\"Z9!#J1!#Z-\"$J9%#Z-\""
+ "#J9!$*5#$JE!#JE!#JE!#Z1\"&ZU*#JM!#*M\"%*E'#Z]!$;%##+!!%*M&#Z]!$;!#"
+ "$K!$$+%\"#[)!#+%!#[)!\"[1!$K9#%;-\"%;5'#[-!%[9!$[=!%;A\"$[1!%;A\"%KA#"
+ "(+I.';M+&+I!#[E!#[I!!+M%'[Q$);U\"%;Y\"'+I!&,%%&+]!(+Y-%,)!%[]$%L)\""
+ "%L!#'\\!$&L-\"%L)'&<1!&<1%&\\1(%LA\"&,5$%<5!'\\1#$<5%%L9\"$,1%%\\5#%<9!"
+ "\"\\E#%,=%$L9#%<=!'<=%%<9!%<M!&<9!&\\E\"#<A!%<E!(,M-&<I%'LM!%<A!(L=!"
+ "%\\9#&LE&#<=!$LA\"%<9!'<A!$LM\"'\\=\"(\\=\"%\\A#%\\A#%<9!&LE&'<=)%<A!%LA\""
+ "%,1!%LI!&<=!(LU)%L9\"%\\9#&<E%&,9$%\\=#%<5!#,9)$,=!'\\M\"%<1!&L%'&LE&"
+ "&,-)&<1!$+]!\"<)\"$,-!%L)\"$<-\"%L-\"$;]\"&K]#)[]#&+M!%+Y!$+Y!$+Y!%+A!"
+ "$,%!$KQ#\",)!%+M%$;=\"%+I!&+Q%'+E\"';E\"%;1\"%+A&%+5\"$[A!$[I!%;!$%;5#"
+ "\";1\"\"K1##K!$$;1\"\"[!!%+%\"$+!\"&*U+$Z]%$:Q#$JY$\"ZQ!%ZY!&JQ!#JM!$ZI\""
+ "%J9\"#JI!#Z=\"(JY*$JA!$*E\"$ZA\"\"J9'$JA!#J-!$Z9\"#J%!#J)!$)Y#$:!$%)]("
+ "#J!!#)]\"$)U#$)U##)U#()].%YY$&YQ,#9A!$)A#!YQ'!)5!#)1#\"IA!\"I-!$Y9'"
+ "$Y!!#I)%$Y%$\"I%!\"HQ$!X]!#HQ\"\"8U!$(U$#(M#\"8M!\"XU\"!8A\"$(A!$(5(#85\""
+ "\"8%$#(1##(1!\"X%##(9$%(5'\"85!#X=$\"H=\"\"H9!#(Q&\"XI\"\"(M\"\"(Q\"#(M#$8U)"
+ "$XY*\"8Y#\"I!!#(]!#9!!\"Y).$)5!\"Y!#\"I9!!Y5!\"I9!#)A&!9A%!)A!#IA\"$)M#"
+ "$YI&$IQ%#IQ\"&II(%Z!$#J!!#YY\"$IM&%*!$#Z%\"#9U!#J)!#)]#\"J-!#J1!$*9&"
+ "%J5%#:9#%:-!#JI!$JA$#JI!$:I##ZU!!*M!#JM!%JQ!$*U\"%JU!#Z]!![!!%;%'"
+ "\"[!!#Z]!&K),%+)\"$K)$#[)!#[1!%+A&$KM#&[5!$[5!&+I&(K=$%[9!%[I!$;E\""
+ "%KA$%+A!%+I!'+E\"$;U\"$+M!$+M!$+M!&;Q\"%;Y\"%+]!%\\!$%,!!(;]&%;]!%;]&"
+ "'L!#&,1$%,%!%+Q!$K]'%<)!$,%!',9($,1!$L1#$\\-$&L9'&<-!%,1!%<=!(<1*"
+ "$\\1#%L9'%<5!'<9%&<=&&,5$%L1\"$,-!&L9!&<A!$LE\"%<A!&\\1(%,=$$,=!\",A!"
+ "%<=!(LE!'\\=,&<=&%<A!&<E%$L9#(,=#%<=!%<=!%\\9('\\-#(<9%&,=)%,-!'<9*"
+ "'<-*%<9!%<9!&<5%$L9\"$,1!&,9(%\\9#(<5/'<9*(\\E&$L1\"'L=+&\\)(%,-!%L-\""
+ "$<)\"&L)\"%,!!&L!''<%*%<%\"&+Y%%,!!'<%%%<!\"#+]!%+Y!%+Y!#+Y!%K]##+E!"
+ "&;Y*$+Y!$[M%%+=\"&[=!%;E\"%+Q!%+=\"%+=\"%+=\"#[=!(;%(([=!%K5(%[=!$[-!"
+ "%+1&![-!#+-!$K%$%;%'#Z]!%;)'#ZY!$ZQ\"&*Y'#ZQ!%*I#$*M\"$JI!$ZU%#Z=!"
+ "$JE$%*M&#J-!#J1!&J=\"#J9!$*5##J1!$J-\"#Z-\"#I]!\"J1!$J!&#*!##Z!\"%*%'"
+ "\"IQ!\"IQ!$IY\"#J!!%)M!%9M%!)M!#9E!\")=%$)=!$I1##99'#)5#$Y9!#)1)#95!"
+ "#)%$#9)$\"I%!#9!!#X]##HY%#HY\"\"I!!!XQ$$(A!!8E\"#(I#\"8A!\"8I!\"X=\"#H=#"
+ "$(%(#']$\"X%#\"H)!#(1$\"81!!H5%#H5#\"8=!#XA'$HE!#8I%#89%$8M##XQ#%XY#"
+ "#8U$#(Y)#Y!&\"8Y!$8Y%$9!&$I!*\"I1$$I1)\"YA\"#9A!\"I5!#I9\"%)E($)=$#)M#"
+ "\"IE!#)Q\"#9M!#IU!$9M!!*!!$)]#&)U%#)U#$*!#$9Q!&*%,#J)!#Z)\"#Z-\"#J1!"
+ "#J=!$J=%\"Z9!%:=%$*A\"\"ZA!&JA\"%:I'#ZQ!&*U+\":E\"$:M$\"*U!$JU!#[!!%ZU\""
+ "'K!!%JY)!;%&#[!!$+)\"$+%\"%[-!\"+!\"$+5\"$+%&$+5\"&+1&(+9+%[=$#[A!#[A!"
+ "'[9.$[I!%KI#%+M!$+Q!\"[E!$+M!$+U!);M/$+U!%,!!%;E\"&[],%+Y!%+]!'+]%"
+ ")+])%\\)'';Y/%<%\"&L%#',%!)\\),%L%#%,!!%\\)$&L-'%\\)#%L-\")<1/%L=\"%L)\""
+ "'L1\"%\\)#%<A!$L5\"%\\1#%L1\"%<=!'<9!(<-%$,9!%<5!',9)%LA\"&\\=#\",9!$<=!"
+ "&L5\"%<=!'LA+%<=!&,=$%<A!)\\94%L5\"'\\A,(<9%&<=&%,1!%<9!$L9&%<=!%<5!"
+ "%<9!%<9!&L1'(<5!%\\I#&<=*$\\-$\",9!%\\!#%,1!&L%\"&<1!'L5\"%,%!&\\)(%,-!"
+ "$,%!$,%!&<-*#L%''<-*',!!&;]\"&K]#%\\!('L!'&<)!&;U&#+Q!%;M#$;]\"$;U\""
+ "%;U'%KM'%+=!&+A\"%+E&&;A+'+A\"&;E''[E$\"[A!$[A!%;9*$;E&%[1!$[5%%+-\""
+ "#+-\"$[)%$;1#&[1)#ZU!'JY!$JQ!#:U\"!ZY!\"ZY!#JA!%J=\"#JI!&:9!%JI)$ZI\""
+ "#Z5\"$JU$#Z9!$:I$!*)!'*9(#J-!#J5!#Z-\"$*)##J)!#J)$$9U!$:!$$Y]#!)]!"
+ "\"IQ!\"YY!$)Q#$YM#$)=!$IU%#9A!%9M\"!I5##9=$\"I=!#95$!Y5!$)9'!Y-!#)5#"
+ "#Y%'$(Q!$8Y%%(Y\"\"8]!\"X]\"\"8U#\"8I!#8Y$$8I#$H=$\"HA$#H5#!HI##(=#\"89!"
+ "#8!$\"H-\"!X)!\"X)#$H1+\"X1\"\"89!\"XA\"$X1\"#(E#!(A##XI!\"HI!#HI&#HQ&#XQ$"
+ "$8]%%9%-\"X]\"$H]#\"8]!#(]#&9)(#Y)&\"Y-\"\"I-!#91$!Y9!\"I9!#Y1&$Y=#\")I\""
+ "\"IA!$9E$$)M&$)M#$IQ)%IQ#%IU)$I]&%)U'$9]$#YQ\"\"J9'#J-!#*=\"#J-!$:5#"
+ "$J9!#J-!%J1\"\"ZE!%:1$#ZI%#J5!$JE!!ZA!$*=\"#JM!%:U$\"ZQ!!JU##JU+%*Y'"
+ "#ZU!$:]'\";)\"#;-\"$;%\"$J]$#[)!#+1\"#+-!#[5!#K1$'+1&%+9&$+=*%+=\"&[=!"
+ "(K=$#[A!$[A!$;I\"&+E%$+I!&KM($+Y!%+M!\"[I!#+E!$,)!%;Q\"%+Q!&KY'%KE#"
+ "$<%!%<!\"%+Y!&\\5#&<!\"%<!!'[],#,!!&,%%'<)!%,)!%\\!$%K]#%L-#$\\)#*,9-"
+ "&,!%%,1!%,1!%L-\"$,=!&<5!'\\1(%L9\"$+]!&,5$%\\5#%<5!&\\E\"%L)\"%<9!'LE!"
+ "%LI\"%<I!'<)!(\\5-%<=!&<9%$,9!%<5!$,1!*L9+$,5!%<9!%L9'$\\5#&,5$%L5\""
+ "%L1#%,-!%<1!$L1\"'L5\"$<1*$,5!&<-!$<-\"\",)!$,5!%,)!%<!\"%,)!%\\)#&,!%"
+ "(;Y&%,!!%<!!%<%%';Y+%<!\"\"+]!%+Y!&+U!%+Y!&+U!%[U$$+M!#<!\"$[M$\"[Y$"
+ "%;=*(+M*$[I!%+=!![Y$%KE##[5!%+9!$[9!&[1!%[-!(;1(%K5(%+1\"%K)$#[5!"
+ "#[-!#[)!$+)\"#Z]!#ZY!#ZY!$*Y\"$*M\"#*U%#ZU!$ZU%#Z=\"$:9#%*I'$JE$$:=#"
+ "$ZA&\"Z9!%*=&#J9!$Z5&#J5!#J1!#ZA\"$*5\"$:)!#J%!#Z%\"$*!#$)]#&:!\"&IU#"
+ "$IQ\"%IA*\"YU!$9M!$9I$!Y=!%YI+$Y='\"Y9\"\"9=##)=#\"I)!\"91##I5(#)1#$Y!!"
+ "$Y5'$9!%!I%#$X](\"8]!%(U(#XY&$(]$#X='\"8Q!!HM#!XA!#H=&%H=#\"H=$#XE#"
+ "\"8!!#X%'$()(\"X%#\"81#!(-!#H-##X5!#H5&\"8=!\"(-\"\"X=&#HE%\"XI\"\"8E!\"HQ!"
+ "#(Q#&(U$#8]$#HQ%\"I!!#9!!#I!##91!$Y-!\"Y=\"#Y-&!95($I9#\")9\"$)9$#9=!"
+ "#YA&%IA$#9A!#9M$$)M$#9Q$#9Q!%IU\"&IQ.$:!!!Y]$%:))$:%$!YY!#Z)\"#Z-\""
+ "#J5!$J1%#Z5\"#*5\"$JA$\"ZA!$Z=%#*A\"&ZA&%:E!%:E($:9##:M\"#ZQ!$[!!#*U\""
+ "$J]!$ZU%#[!!#ZQ!$;%*#[%!%+-&%+)\"$[1!![-!!;-\"%;1\"&+A&&[E(%;9\"%;='"
+ "$;=\"';1(#K=$)KI$\"[E!&;E\"&;5#%+M!$[A!#+M!#[I!$+Q!$[Q$%[U$%;Q\"&+U%"
+ "%,!%%;Y\"&L!#%+]!%,%!%<!\"$;Y\"%,)!&+]!#<%\"%L)\"%,!!%L-\"%,!!%L)\"#\\9#"
+ "%L-\"%L-#'L-&&L1'$,)!$L1\"%,1!%L5\"#<1\"'L-\"#L)+%L1\"&<-%%L5#&L1+!<!\""
+ "'L5!#\\5#&\\1($,5!&<9%',5$',5$%,1!'L1\"(,).&<1!(\\1#%L)\"#,1!&L5\"$,1!"
+ "'<=!%L5\"%<%\"%\\-#%,-!%\\-(%<)!#,=!%L)#&<5!&K]'%<%\"&L%\"!,9!&KY#',%!"
+ "%,!!',!)$;]\"&\\%(&+U!#+]!'K]+$+U!%+M!%+Q!%+U!&KE(#[E!%[M$&+A&%KI#"
+ "%KQ#$[E!&[A)'+1+%+M!&KA#%[A!%K=#&[A)%[1!$+5\"%+9\"$+-!$[9%#+1\"$+-\""
+ "$K!+$K%$$*Y\"#Z]!!ZQ!$Z]%$JY!\"ZU!!*]!#JE!$ZI\"%J=)&*I$$*A\"#JM!$ZA\""
+ "#JA!#ZI\"#Z1\"!:5\"%:-(%J1\"#J-!$*1#\"Y]\"$9]!%*!$\")]\"\")Y\"#Y]\"\")Y\"#9U!"
+ "%II*$YM&#9U!#II!#YI##9A!$IE%%YE$\"I=!!)A!\"I5$#95$%Y)&!I%#!))!#X]#"
+ "$)5!#9!!\"X]\"$(Y!%HY.#(U##8Q'$(M\"#(M#\"8I!\"8A!#(A$#H=#$(=%!XA$\"X1#"
+ "\"GY\"%(%$#GY!\"G]%\"H1!$8))\"X)#\"85!#81%$89#$(=!$XA+!(A!#XE&!HU#$HM)"
+ "$HY#!HM#!(U!$(Y!!X]!%I!!#9!!$I%$#)5&#9)!#)-##)-#$I5#\"II'$99%!I=&"
+ "$)A$#II!%)E(#IA\"$YE$#YE##IQ!#9U!$Z!'#YI\"#9I!\"Z%\"%*!!%:%(%Z%##J)!"
+ "%:-)#J1!#J1!$*M\"%:5!%*5##Z=\"$*5\"!ZU!#JE!#:=#$:I##ZE\"$+%\"$:U$$JM!"
+ "$JU!!ZU(%JU!$J]$#Z]!#ZU!%:]'$+-!$[1%\"[)!$;=\"#[)!![)'#;1\"#[5!%[1%"
+ "%K9$%;9\"%;1#$K='&;A'%[A!%;M\"%KI'';I\"%KU#&[E)#;M\"#+M!$;Q\"#+Y!&;U."
+ "%+Y!%;Y\"$+Y!%+Y!%+Y!%[]$'+Y!(<!+%,!!$L9#$L!'#L!'&+]!'<)!(,!%%,%!"
+ "%L%#&,)%#<)\"$L)#'<-*$<-!&,%!&<-%&+]!',-%&<-!&<-!%,-!%,!!$,1!&\\%("
+ "%,1%&<1!$,-!%\\1#'<5*&,1$',))#L5#%,-!%,)!&<1!&<=&%L-\"$,-!%L-#%<-!"
+ "%L-\"%,-!$L-''L1&%,1!&,!%%,)!%L)\"%\\%#%<%!&L!'%<%\"$\\%#&<-!*+])&+M%"
+ "\";]\"';Y*#,%!&+Y!%KU'%+U!(;U+%KU'$+Q!$;]\"$+U)%+M!$[I!%[E!&;I\"%;E\""
+ "%;5#$[A!%[M$';Q/$[=!#K9#%;9#%;5\"!KE#%+1\"'+1\"%[-)$[)%$[)!%+)\"$+%\""
+ "%+!&#[!%$J]!%ZY\"$JU!\"ZY!#ZU!$*U&$*Q&#*Q\"$JI%\"JI$#J9!#:E'%ZI*$*=#"
+ "#JI$#:-##J5!!*5($*1\"$:!$(*)\"\"*9\"!)]!$)]##:!##)]\"#Z)\"!YY$#IE\"#Z!\""
+ "$YQ#%II#$)I$#YI\"#9E!#YQ#%IE#$IA(\"I-!\"Y5\"%IM&#9-'\"I9!!Y)!#9)$#(]!"
+ "#Y)##(]#\"9%#$XY%#8Y!\"8]!#X]!\"8M!\"8M!#HQ%\"HU!\"XA\"\"H9!$81&\"85!%(A#"
+ "#']$$']##()$!H%!\"X)\"\"H%\"\"8-!\"X)#\"89!$(=%\"X9\"#(Q#$(A%%(E#\"XE\"#XE'"
+ "$XQ+%XQ)\"XU\"$)!!#(Q##I%&#I!#$I1##I%\"!I5)\"Y-\"$9-%!I5#!Y5$#Y5&$)-$"
+ "\"I9!#)A&#)1#$)E#$9M!#YM#$IM&#9M!$)I$$IU\"#)U#$)Y##J)!%*!(&Z%$%:1!"
+ "#:)##Z!\"$:)!$:1!#Z%&#J1!$:-!%JI!%J=)\"ZQ!#ZA!$*I\"%*I\"$JI!#ZU!#[!!"
+ "$*]\"#ZU!%ZY*!Z]!\"+!\"#Z]!%+%&#[!!$[%!#+%\"%+1\"&K)(#K-$#[9!&;)+![1!"
+ "#[5!';9,$[I!%K=#%[=!%[=%$[A!&;M'%+E!%[E!%;Y\"%+Y!&+M*&[M$#+M!&;I*"
+ "%KI'%K]##[I!%+Y!$[A!%+U!&KY'([]-%;]!$;]\"#,)!&<-%&,!!&L!'$;Y\"&;Y!"
+ "&;U&&;]!$<)!(<!+'<-!%[]$&L)\"$,)!&L)#$<-\"&,)!%+Y!%,1!%L-\"$,-!%L9\""
+ "%<5!%,!!(<!*&,-%'L1\"%,5%&\\-((<-!%\\-#&L%'&\\1#&,-$%L)#!K]'$+]!$,)!"
+ "%,%!(<)%'<1!%\\%$$K]#&;]\"%<)!%<-!&,!!$+Q!%,)!%,!!&;Y!%+]!%+]!$;U\""
+ "$KY#',!!%+U!\"+U!%+M!#L%'%;U&$+Q!$+Q!&;U&&+E!$[I!$[=$#;E\"$[=!$[E!"
+ "'[U$$;=\"%[A%%[9$%;5\"\"K9##[1!#K5#%+1\"%[9!$[-!#[)!#[)!#Z]!#JY$$*U\""
+ "$;!\"%;-+$J]!%ZY\"#*M\"%*Q\"#*]\"\"ZQ!$JI!$ZI\"#ZY!$*Y\"#JE!#JA!%JM!\"*=!"
+ "&Z=+!Z5!#:5#%Z1*%JA\"\":1#$J!(#Z%\"#I]!#YU\"\"*%\"$Z)#$II%#IU\"$J!!&)M!"
+ "#IM!#IE\"$YI'#9Q!\"I=!#)A##9E!#99$$IA#\"I=!!I-#$I5)\"I)!%9)$$I%&#(Y#"
+ "%I!(\"8]!\"HU!#(]#\"Y!%\"H]$#(I#\"H]!#8A$#(E!#8I%#(=#\"89!\"H9$\"8%!$HA'"
+ "\"7Y!\"WA!!(!#\"X!##H)&\"8)!!WU$\"81!#8-%\"X9##8%(#H=%#H5&!8I\"\"8E#\"8=#"
+ "\"XE%\"8Q##8U$\"8Q!$(]'#(Y#\"X]\"\"X]\"#I)%$I)#\")1\"\"I%!!Y)$$91(\"I1!$)I!"
+ "$Y9*#)=##9M!$)M$#Y9#\"9E#%)M!#YM#$)U##9Y'%II'%9Y%#*!\"$)]#$9Q%!*%!"
+ "#I]!!Z)!\"Z!\"$:-#\"J1!\"J1!$JA!#Z=\"$*=\"\"Z9!#:E##J1!$*E\"$*Q\"%*I\"$ZM\""
+ "!ZQ!#ZQ!$J]!$JU!\"ZY!%;)+$;!\"$+!\"$+%\"#[%!#+%\"$K)$$+5\"\"K-$#[5!%;-#"
+ "\";%\"$K5$$[1!%[E$&;5'&+-\"$[=!%[9%&[A$%[=%&+E!#KE#'+I*&;=&%;E\"$;I\""
+ "\"+I)#[I!$+Q!';Q'&+U%%+Q!%[]$&+U!%+Y!$;U\"&KY#&K]'#\\!$&K]'&K]'%;Y\""
+ "%,!!$\\!$$+]!&;]\"$<)\"(,%*&\\1(%L-#'\\%#&+U!&<1!&\\%(&,-$&,%!'<-!%,%!"
+ "',)%%,1!%,)!&,%!%,)!%[Q%%<)!%<5!(,=-&,5%#,)!&,%!%,%!&<%%$<%\"%,%!"
+ "%\\9#%L5#&+]!%\\!#%+Y!%;]\"$<%\"%L!'#,!!&;Q&%,!!%L5##+Y!%KY''+Y!%[U%"
+ "%+Q!&+Q)$+U!$+M!\";Y\"&KQ#$+M!#[=!&[Q)&+M!%+M!#[I$'+-\"%[A%#[A$$[1!"
+ "$[A!$[=!%K1$$+9%$[)!$K='%+A&![A$$[9!'K-!$[)!!Z]!%+9!\"[%!#K)#$;5\""
+ "$+)\"$K!$$*Y\"&+)\"$JM$$ZU%#JA!%:E+#JE!#JI!#JA!&:A!$J9!#Z5\"#Z=\"$J=!"
+ "\":5\"#J9!!Z1!%J5!#Z-\"%9U\"#J)!\"Z-%#*)\"#9Q!$J%&#YY\"#)U&$)U##IQ\"%)U!"
+ "#9M!%YI(#YE#$IA\"\"9A##9-$\"I5!#)5#\"I-!#9=$!I=&\"Y)\"#I%#$Y%'$HY&!H]&"
+ "\"H]!!XY$$HY'!8Q\"!(M!$(M%\"XI\"$(U$\"8E#\"X9%\"8E(#X=!\"H9$\"81&!X1'!H1#"
+ "\"7]!\"W]!\"W]#$(!#$(%($(%(\"H)!#X=$%X5!#(A#\"85!\"H9!$(A(\"89#\"(5#\"HE$"
+ "\"HI!#(U#\"8M!#(Y##HQ&\"8Y!\"8Y!#(I##Y9#%)-\"#Y%##I)%!9!(#95!$I1#\"I5!"
+ "$I9\"$Y9$\"IA!!Y1!#91!$)M#$)U#$9M!#IM%$Y]##)U\"$YU##9U!%)M($9]$#IU!"
+ "\"J!!%:%(#*%##Z9\"$J1\"$J-\"#Z=\"$J5!&*9#$:1#&:=!$:9#%*A&#JA!$:I$$:A#"
+ "$ZM\"!ZU!%*A&$*U\"#ZY!$*U\"#ZY!!ZY!#Z]!$+)\"%+)&!;%\"#;1&&+5\"$[1%#[)!"
+ "&+9&$K5$#[1!$[5!%[5%$[=$'[9*%+=\"$;=\"%+=\"%[A$\"[=!';E+'KI$$[E!%;I\""
+ "$[E!$+Q!!+I!$;I\"$;Q\"%KI(#+Q!#,)!%+]!%[U(#+U!%KY#&+Y!#[E!%+Y!)L!\""
+ "&[]#%;]!!K]''+Y!',%!%L%'%L)#&<-!%,!!%,!!(+Y!%<%!&\\-#&+Y%%<5!%,!!"
+ "$,%!%,-!&<%%%+Y!%,%!$<%!%,!!$K]#%<1!',%)$,%!%+]!'<%*%<%\"',!.&<)%"
+ "&<1!#,!!&+]%'<-*&[])$<!&%\\%#(+]%%;Q\"%+Q!%+Y!$\\!$%+Y!#+Y!'KU#&;Y'"
+ "$KY#$;U\"&+Q!#;M&#L!#%+M!%KA#%KE#$;M#&+5\"%[I!#[I!%[A%(K=$%+-\"$[=!"
+ "$[9!&;E&%+5\"$;A\"#K1#\"[1!%;-#$;-#%+!&#[1!$Z]%#[%!$:M##[%!$JU!&*]&"
+ "$ZY\"'Z]\"$ZM\"\":Q&$*]\"$*U\"$JM!#:A#$JQ%#J=!$:9$%:A(#J=!%J9%\"JA#\"J-!"
+ "#Z5\"$*5\"#Z1\"\"J%!#Z=\"$J%\"$J1%#J)!$Y]#$9Q!#Y]\"%Z%*#IE\"\"YM!$YQ#$)M#"
+ "#YQ#%IE$$9I%$YE##I=\"\"Y9\"\"I9!#I9%\"I=!$Y5$\"Y%#\"I-!%)1\"!)%!!)-!!H]!"
+ "\"8Y!\"8Y!\"8M!#8]$\"8]!\"8M&\"8Y!\"XE\"#(A$#(A!#(9!\"85!&89,#(5#\"H1!#89$"
+ "#H%&\"WY#!7]\"#X)!\"7]&!H%!\"8)!%(-*\"81!\"X1#\"H9\"\"X1#$X5##(E$\"XA#\"8Q#"
+ "\"8M##(I##HM#\"HQ!\"8Q#\"8U!%(Y\"!HU##HY%#XY#$I%$!Y)!\"Y%\"#I-\"$9))\"I5!"
+ "#9E##9A$\"YA(!Y1!#9A$$9E%\"II!\"9M##IM\"&)Y,#9]$%)Y+$)U#$J)%#I]!#Y]&"
+ "$9]$!*-!#Z%\"%Z)#\"ZA!$:-$%:-!#Z5\"\"J%!#J9!#JE!#JM!#JA!#Z=\"%Z5.*:I'"
+ "#ZI\"$ZM%#ZY!#ZE\"$:M+#ZU!%ZU)%ZY\"$*]%#Z]$#[)!%+!\"\"[%!%K%!&+!*%K%!"
+ "$:]##;-\"#[1!#[-!%[5!%[5!$[5!&[=)&;9'%+=\"$;)\"'+A!\";E\"'+)\"'+E\"&+M!"
+ "#[5$&;I&(;A#%;Q\"%[I$$[M$&+M!\";Q\"$L!#'[I!&+U%&;U'%KU#(+Q%%[M$%+Y!"
+ "&+Y%&+]%'[U)%+U!&K]'&+]!%+]!%+]!&[](%+]!&,!!%K]##,!!$L!#)<!+'<9%"
+ "'<!&#<!&$L1\"&,!!',%*%+]!%+]!)<%&&L%'&,%!&KY#%,!!&<-!%\\!$$[Y$\";Q\""
+ "%;]!&+]!%;Y\"\"K]#%+Y!%;Y\"%;Y&#[Y$%;]!$;U\"\"+Y!&;]\"%<!\"![=!$[U$%[Q("
+ "$;]\"&KM(#+Q!$[I!%KM#$[A!%[I!&KM#$;E\"&;I\"$[5('+A\"$[A!#[-!%;9#(+A&"
+ "\"[5!%+5&$;9\"#[1!$;)\"#;-\"$JY$$[%)#[)!$[)!'+%'&K%,#:Y\"%JU)$J]$$*]\""
+ "$*Y\"#ZU!#ZA\"$ZQ!#JI!&:E!!*Q!&:I%#J9!$*A#!*1!#*9\"$*9##:5##:)##Z9\""
+ "#*1\"\"9]\"!Z5!\"Z!\"$J%&%Z9##J!$$9]$&*%$%Z-#%9U%#9U!\"YY\"#9U!#9M!#9A!"
+ "#)E##9A!$99%#9A!#)A##9=$#9)!\"I1!!Y9'#9!!\"I%!#)%##Y!$$)-$#(]##)%#"
+ "#X]##HU%#8Y$#(Q##H=#!H]!\"XE#!H5##8M%\"8E!#H9#\"H=!\"89!#X-'\"X-#\"WY#"
+ "%'U*\"7U!\"X!##7]%\"H!'!H!!\"WY!\"X1#\"X-#$85$$8)$#H)##(9&\"H=\"%(=)#8E'"
+ "#X='#XI#$8M##(E$\"8U!!HM)\"Y!##(Y##)!#\"8])!I%##9%!\"I!!\"Y=\"$)5'$I1)"
+ "#Y5#\"Y1\"\"I=!\"I9!&9='\"Y=\"!IE&#IE%#YM#%YM$!9U)\")M(!YU!\"YQ\"&YQ%\"I]$"
+ "$9]$$Z)##J)!#J)!&*)!#*-&!Z1!%:9(&:5,%JA%$Z5&%*=&$:5##ZE!#J=!!ZM!"
+ "&:=!%:I(#:Q\"%ZM\"#ZQ!#ZA!$J]$#[%!$*U\"#[!!%:]$$[-!$K)$';%$%K-$&[%*"
+ "&+-\"![)!$K5$$[-!$;%#'+1&$[5!#[5!![=!'K9,#[1!%+9\"$[9!%;M#$[A!%[A%"
+ "%KI##[E!'KQ#'KA$$[E!$[E!#L!#$;M\"$+M!%+E!$KQ#%;Q'$,!!$+9\"&KU'%+Q!"
+ "%\\)#&+U!&KY+#+Y!%,!!(+Y*'KY,&;Y\"%+U!%L%#$+Y!#;Y\"%;]!#[]$';]*$;Q\""
+ "*+U%%+Y!%,%!&KQ#%+Q!&KU#$+Q!&,!%&K]'&,!!\";]\"%+]!%+]!'K]'%,)!%+]!"
+ "%+Y!&;Y\"&;Y&'+U*$;U'$KU#%K]#'KU'$[M$%+Q!#KQ#\"+]!$[M%#[A!$+M!'+M%"
+ "&+M!%+Q!$[Y$&+I!$[E!&[E!*;E'(+A&'K9$$[9!&;A\"%K=#!;A\"%;9'%+5\"%+I)"
+ "$+5\"%+1!#+!%!+-!\";-\"'J]%![-!#[%!$*Q\"%K%!$*]%!*]!%+%&#Z]!%*Y&$ZY\""
+ "%ZU\"#ZU%$:U$%:I$!ZM!#JM!#ZI\"$*=##JA!#JA!$Z=\"$*5\"#J9!$:%$#J%!#J-!"
+ "#J-!$J-\"%J-\"#J%!$)Q#\":%\"#J!'$Y])%*!!$9M$$9U!$*!##)Q#$9U$\"IM!#IE$"
+ "#YI#$I1##)A&#)5#\"Y=(!Y9!\"I1!%I5*\"I-!\"I)!#Y)'$)%!#(Y!\"Y!\"$)!(#(Q#"
+ "!HM!\"X]\"$8I#!H9#\"XI%\"XI\"#(Q#&HE*#(-$#X9*#H=##X1&!H!!#(%$\"X-\"\"X-\""
+ "\"GM\"\"'U#\"7Y!\"WY#\"W]#!7U%\"H%%\"G]!&85,!H1)#(1$\"H=\"#(5#\"8=!\"HE'!XA!"
+ "#HA\"!(U!$XA%\"8=!#8Q!\"8Q!#(U##(U!#(Q#\"8I#\"Y%\"#X]#$(]$&9!(\"I%!\"Y%\""
+ "$Y-$$91(\"X]\"#I5%%99##IA%#)9#%)E'!YA!$)I$$9Q%$IM&#YQ\"\"YU%$)U#&IY+"
+ "#:!##Z!\"$*!##*%#%J!)#*-&#J-!#Z-\"$J1%$:1$$J=!$Z9&#JE!\"ZI!#J9!#JA!"
+ "#ZA\"#JA!%ZI*#J=!%ZQ\"\"ZY!&JY!%ZQ\"#ZQ!$:Y#%*U'$J]$&Z]\"!Z]!&[!&#;)\""
+ "#ZY!%+!\"#[%!#K)#![)!%;!#$;-&%+1&#[5!#K)'&+5&&+9&(+%/$[=!&[1)$[=!"
+ "&KA(%[A!$KA##[9!&;E'#;E\"$[E!$[A!$+Y!&;Y&$+]!%;U'\"[I$$KU'$+]!#;U\""
+ "$K]#$;U\"%+M!%+U!';E'';Y!$+U!%+U!#,!!$;U\"#+U!%,%!$,!%&[Y$$+U!%[U("
+ "';Y+*+Y*\"<!\"$KY#%,!!%;Y\"%KY#%K]#%+Y!%;Y\"\"<!\"'+U!)+]!\"+]!&KU#\"[U$"
+ "&+U!&+]%(+U)'+]%$[I!$[I!&+M!$+Q!#[=!$+M!%[Q)\"[I$$KA$(+Q.$[I!%[U$"
+ "&KE#&KA($[5!\"[E!&[=)$[-!)+I/$[A!$[=!$+9\"'+9&$[9!#[5!%K9(%[)!#+1\""
+ "#K-$\"+-%%[%)#Z]!%[)!%;-##+-%$+-\"%:]'$[!!$*]\"\"ZU!#ZY!$*Y\"$*]\"%ZU%"
+ "$JQ!\"ZM!&*I.%*I\"%*M\"\"ZE!$:E$$*A\"#JA!#Z5\"!Z=!$*)#$*=#$Z5\"#Z-\"$Z-&"
+ "$*!#$Z)&#J%!$:!$$:!!%IY##)]&#IQ\"$:)$%:!%%IQ##YI%!IM#$9Q$%9I\"$9M%"
+ "&II!$I=&#)E&!Y9!$)5$\"I5'$Y1*!Y-!\"I)!!)1!#(Y!$9!%\"I!'#8]$#)%##Y!'"
+ "\"8Q!$8M(!(U!#HI&#(I!\"H9\"\"8=!#(E!#(=$\"89!\"X1\"$W]+!H9##8)%!X!$\"X%!"
+ "#7Q%$'Y(\"7U!$']##G]&#W]$\"X!#$X9\"#X)'\"(!##(1#$85)!H5!\"85!\"89#\"8=!"
+ "#8A$#(=##HI%\"(I\"\"XM\"#(I#\"8E!\"8U!!HY!#)!##8]'\"I1!#(U#\"I%!\")1%#Y)#"
+ "\"X]\"#9-$\"9)1\"95##Y5#$I=&$9=\"#YE\"&IE!$YE&#9I!#9I!#YM#\"YU$$)U##YQ\""
+ "#9U!':)*%Y]'%*!!$*%#%:!\"\"J)!#J-!&:A)#Z9\"#:1#%:1!$Z9\"#JE!%:A,#J9!"
+ "%:A!#ZA\"#JA!%JI!$*Q\"$:Q*#:Q\"&*M'&*Y+#ZQ!$:U$!*Y!$*Y\"#Z]!%+%\"#[%!"
+ "';!$#[)%$;)#$K5$&;)'#[1!%[-%$+-\"$[%!%[5!!+1$%;5&&;)$$[A!%+1\"'K9)"
+ "%[=$$[I!![U(#[5!&+A!';I'&+=\"&+A\"$[E!#[I!&;A\"%;E\"&+M!\"+]!$[M$%KM'"
+ "$+M!\"[E!\"KQ#&;]&!KI#%+Q!$+Q!#[E!$+U!&;U&%;I\"%KU#$[I$!+U!#[Y$%+]!"
+ "&;M#\";E\"%<!\"([](%;U\"'KM'\"+M!$K]#%;]!%+Y!%+Q!%KQ#$[I!);I+%;Q\"%+I%"
+ "$+U!#[I!$+Q!'+Y%$+Q!$+M!$;M\"%KM(%KE0!+M!\"[E!&+Q!#;E\"%+M!$;E\"%+A!"
+ "'KE,%;A\"$[A!%;A\"#[9!$+=!&+A\"&[1%([-&$;=\"%;1\"%K)$%;9&$+1\"$;5\"$+1!"
+ "$K-$$;-\"!+1$%+)&#[)!$;-&#[!!$+!\"%ZU&\"Z]!#:M##ZY!%JQ!$ZU%#ZQ!#ZQ!"
+ "$ZM%$JM!$JI%#ZI\"$JE!#JE$#JE$$:E##ZA\"&JI*$Z9\"$:5##*5&#J-!$J5!#J)!"
+ "'*)!#Z%\"#Z%\"$Z1&!YY!#YE#$9]$%YQ!#YM\"#YQ##)M\"#9Q!$9A$#II!#IA!$IA%"
+ "#IA!$99(#)5#\"I1!#Y9#\"Y%##))#\"I!!#9)!#I%\"#8Y!\"9)#\"X]\"#(M#\"8Y!\"8I!"
+ "$HY$$(E'#XM!%(A)\"8A#\"8A!#XE'\"8=!#(1##H!!\"89!#X1'#X5$#WM)\"H1\"#(5#"
+ "#GM$$'Y)\"GU\"\"'Q#\"7]!#W]$\"H%$#X!$#(-'\"8)!!H=!\"X-#\"(-#\"X5#$8E)$H=$"
+ "\"8)!$XE($(E(#(E#\"XA#\"H]!$XY%#8]$\"(I\"\"8U!#XU!!Y!!#9!!#9)!#I1%#))#"
+ "#Y-#$)1'\"II!#9)!\"II!#Y9#$)='!YY$%)I!&Y-&#YE\"$Y=!$)I#!)5!#IU\"$Y]*"
+ "#)Q&#9A!$IU%#I]!#J!$%:!%%:1$$Z)&#Z)\"%:A(!Z1!%J1\"#J5!$:9##J9!%J1\""
+ "#:-##ZA!%JE!&J=*#JI!$:I##JE!!*M!$*E\"#JM!#JQ$$:U##ZQ!$:Y##ZY!$*]\""
+ "#Z]!!ZU!#[!!&;E+$K!$\"[5!$[-!&+1\"![5!%[-!&[=%#[%!#[5!$+5\"%;)#%[E!"
+ "\"[=!(+=!\";=\"%[9%%+9\"%;U'$[A!&+E%'[5&#[A$$+E!%[E!%;A\"&KA##;E\"&[I$"
+ "$[I$#;]\"&+M%&+Q*$+Q!$[I$$KQ#$+M!$+]!&K]+&KQ'\"K]#$+Q!'+U.$KY#$KQ#"
+ "%KQ#&+Y!#KQ#$;]\"&+Q!$+Y!#+Q!$;Q\"&;M\"$;Q\"#[A!%[I$&+Q1$[I$$KM#$[5$"
+ "$[U%$+U!%[Q(#[I!$+Q!$;Y\"%+A%#[I!%;I.$[E!![=!\"[E!&;1(%+Q%%+9\"%+U!"
+ "#+I!'[A!$[A!&+=\"#[5!&[9!%K9$%+1\"#[9!\"[=!$K9$$+1!%K1$%+)\"%[)!#[1!"
+ "\"K-$$[%!#+%\"%[)&%:Y'!K!#&+1&#[%!$*M\"$JY$%ZY&%K!)$*Q\"$JU$%ZQ\"$JA$"
+ "%ZY&%JQ(#ZE%#*E\"$J5(#ZA!$*9&\"ZM!%:-%$J9($J1\"#J-!$J1!#Z-\"#J)%#J!!"
+ "\"J)!&*-+#J-!$*%##IY!#*%##)E##YY\"#YQ\"\"IM!\"IQ!%II##YM##IE\"%9Q(!Y5!"
+ "#9=$#YE)#95$\")5%\"I1!\"I)!\"Y)\"!HY!#I)\"#I%\"$(Y!#(]#\"8Y!\"8U#\"Y!#!HQ!"
+ "#XQ#\"8M!#HM%#(Q#\"XE\"#(A$!(9#\"89#\"X5#!H5#$8-!%())!(-##X%!\"8%!\"7]!"
+ "\"7I!\"WM##'Q'#X)'!X!\"\"X!#\"GY\"\"']%$(%(\"8!#\"8)!\"89!!(5#\"X-##(%$$85#"
+ "#(A##H=#\"XA#\"H=!\"8I!\"8U!\"HM!!HQ##XQ'#(U#\"8Y!!H]#!9!\"#Y!##Y9##9%%"
+ "!)%!%)-&#)9#%)1%#Y9#$)9!\"YI\"$9I$$)U##YI\"#YA##)M\"\"II$#)A##YI\"$YQ#"
+ "$9U!%)U!#Y]\"#Y]\"#)Y##J%!#J!!&:%-#J%!$*)&#Z%%%:-!%Z9\"#J9!$*5\"%*9&"
+ "#J1!$*A##J=!%:E!#JI!!*E!'ZI'#JI!%JI-\"JQ#%JQ!$:Q$$:U#%:U$#ZY!\"ZI!"
+ "%*]&#+)\"$:]#%+!\"'K)%&Z]*';%(#[9!#[)!%[-%#[-)%;)'$K5#%[!&$+1\"&[5*"
+ "#+9!([-&$[-!#[9$#[=!%[=!&;1'$[E!%;A\"%;A\"$[A!%+9\"&;I\"%;E\"$[E$\"[=$"
+ "#;9\"$+U!%;I\"&+I)&KM''+M%%;E\"$+M!$+M!\"+M!$+M!#+]!$+M!&;I\"\"+M!$+M!"
+ "%[M$%+E%%;=&#+U!$<%\"$;E\"%;E\"$;M\"%+E%#;M\"$+M!';I+$+M!$+M!$+M!&[A$"
+ "([I%'+U*&+M!\"[I!%+1\"%[I$%+1\"%+E!%+E!&;E'#K=#%KA#(;=##[I!#[A!$KE#"
+ "&KE$$+E!';1,\"[9!$[=!&K5($[)!$[5%%K1(&+=&\"K1#\"[)!$+-!%[-&&[)-$;)'"
+ "$J]!#+!\"!Z]!%K!!\";%\"'*]/%[))#JI!$;!#\"ZY!#ZY!%*Q'\"ZM!#Z=(#:M##ZI!"
+ "\"ZE%\"Z9%#ZI!$*9#$JA!$J9!#Z9!#Z5\"%*1#$*I&#J%!#J=!#Z)\"&:)\"\"Z%\"#:-#"
+ "%*!(#)Q#$)Y#\"Y]!$)I$#9Q!#9U!$IE#\"IA!%9I\"#IQ\"#Y5#%9M\"$9A%\"IA!$IE\""
+ "$Y5$\")1\"%9I)\")1\"#))#\"I-!!))!$Y%'$)5$#Y)##X]!\"8])\"I!$\"8M!#(I#%(U+"
+ "$XM$#HM%\"HI!\"HE!#(I'!(=!#89%$8A#\"89!!H5#\"X1##8-(\"81!\"8E#\"X%#\"X!#"
+ "\"'A\"%7U#$'Y)!GQ&$'U#!GY!\"W]#\"WQ!!(-!\"7]!#8%%#()$#H!$\"X-#!X1!#H9#"
+ "%X9'#(=#$X9(\"XI\"\"8M##(I#\"HI!#HM\"\"HA%\"HU!\"(]\"$HM)#8Q$#(]&#I!\"!)%!"
+ "$9%%#))##95!#I)&$95($95%\"Y9\"$95%#I=!$IA#&)5,!YA!\"95##9I!#IM!%)Q'"
+ "!YQ!#Z!\"%IU''9Y+#J!!#J!!#J!!\"I]##I]!%:)%\"Z-!$:-#\"J)!$Z5&#*9\"!Z=!"
+ "#J9!#J=!$J9!#Z=!\"Z=!#ZQ!#Z9\"\"*M!$*Q\"#ZQ!#ZI\"&:M!!ZQ$\"ZE!#JI!#ZY!"
+ "\"*Y\"\"JY$&*]'$+-\"$[!%$:U##[!!%[))#[%!#[9!%;)'\"[)!$;-##[E!%+1&&;1#"
+ "#[5!$;1\"$[5!%;5##[=!%+A!%[5$$;A\"%+E!$[5!%;=\"(K=$&[A)#;M#%;A\"\";Q\""
+ "'[E))+5+\"[E!$+E!&[-!&[E!&KM(#[E!(KE($[9!'[I!&+9&%[E!$[E!%KQ#&;M\""
+ "$[I!'+U*%+M*&;Q'#[E!&;M#$[I!%+Y!%KI#'+I*%;M\"#[Q$%;I\"$[I$$[I!$;E\""
+ "$[I!$;E\"(+I.$[I!%[I$#[E!$[I!'KA(%+E!$[A!$[E!$[=!%+=\"%;=\"![=!'+9\""
+ "$[9!%[1!#[1!%[5%\"K!$%[5$$+M!#[1!\"[1!\"K)#%+1&(+1'#[)!&;%,#[%!#[%!"
+ "\"[-!#+!\"\"ZQ!$ZY%#*Y,#:Y#%*I\"!*Q!$*Q\"#ZU!%*Q##ZU!#JQ$$*M\"#JI!#*Q\""
+ "\"*Q\"\":A\"#ZA\"$ZA%#Z=!\"Z=!&*9,$Z5&#J%!$J1%$:)$%*)'$*%#$Z)#$*)#\"Z-!"
+ "\"IQ$$Y]*#IY!\"J-$&9U-\")U%$9Q!%YM$#YY\"%)M$#YY\"$IE#$)A!#IA!\"Y=\"#Y5&"
+ "#)5##I5%#I1%#I!#\"H]!\"I%!#I%##Y)##(U!#X]##(]##(Q#\"HY!\"XQ\"\"XQ%#(E!"
+ "$8Q($(I$\"HE!#8A%!X9!\"XI\"#X5$\"89#\"X5\"\"81!#(-,!8-\"#(-!\"H5*#8!\"#7]#"
+ "#7A#\"G=\"\"GI#\"7M$\"WQ#\"7U!!7Y\"\"8)!\"W]#\"7Y#\"8%!\"89$\"H1!\"X%%#(5$!H9#"
+ "\"X9\"\"H9!#HA%\"XU\"#(A$#HE\"#(I#\"I)$#8I%#XI&$(U'\"8U!\"8U#!)!!!(I!#Y-#"
+ "#I%\"#HU\"!))!\"Y-\"#)1&\"Y%\"!Y5!$Y9$#)=#!)=$#YM##9=!\"YE\"%IQ#%)E%#YM\""
+ "$IA#\"IQ!$)U#$)U#\"YQ!\"9Y&$9]'$9]$$J!%%)](':!&#J)!#Z1\"$Z1\"!Z-!&:5!"
+ "#J1!%:5!#J9!\"Z=!$ZA%#JA!#Z1\"\"ZE!$JI$#ZI\"#JI!$*Q\"#JM!%*U'#*E\"#*U%"
+ "#ZY!#ZU!%J]!#:Y'#Z]!#Z]!$[5!$[!!$Z]!#[%!#[!!#ZY!#*U)#[-!%K)($K-$"
+ "$[1!$;1\"#[%!![1!$+5\"$;=\"%;)#%+=!$;=\"&K%,&+=\"&+1\"%+=%&;E\"$[=!%;A\""
+ "$[E!&;A'$[I!$[=!$[A!$[A!#[I!%[=!%+I!%+E!$[I!#;=\"$;E\"%KA$$;E\"$[E!"
+ "\"[I!$[E!$;9\"&+E&%KI##;M#$[A!%<!\"%KE$%;A&%;E\"%;E\"#[E!%[I$$[A!'[I("
+ "%;E\"&K5($+A)$+1!'[I$\"[A!%KA$$[1!&+=&%K5$&+=\"&;9'$[=!$[5!%;=\"'+5&"
+ "#[9!&[9!\"[)!%+-*%+1\"$;1\"$;-#$+-\"$K)'$+-!#+)\"$+%\"#[%!%K%$%[!)$[!!"
+ "$;%##Z]!#Z]!$*]\"%ZY&\"*U%#ZY!$:Q$#[-!#:U##ZQ!!*M!#ZI\"$:I#\"*A\"#ZE!"
+ "\"*I\"$ZA&#J=$#J=!#*9\"#J-!\"Z=!$Z-#!*1!!Z%!$*%*%Z!*$*%#$:-#$IQ&&*%!"
+ "%*!(!YI!$I]\"%YU$%IY&#IU\"$9M%$9M$$9I%$)E$$IE%$IA#$IA&#))##Y=&\"Y9\""
+ "#))##I1%$)1!\"I1!!)%'#Y%##I-\"%Y%\"#XY#!9!\"#(Y!#(U#%HU%!HE!#(U##(A!"
+ "!(5!#(A##(M#!(I!#(A!#(9!!H9#\"XM\"#85\"#(-$\"X%##H))\"H)!#8!%!WY!\"WU%"
+ "\"'E#\"'I!$WI!\"WQ#\"7Y!#7U#\"7U!\"7]$#W]'\"H!\"\"X!#!H%#!()!$(-\"\"8)!\"H5\""
+ "\"H5!#H9(#(9!\"H=!#8A$$8I)\"HE'\"8I#\"(U%#(]#%HQ($8](#8U'#(U#%Y)%\"8U!"
+ "#I!#$Y!%\"I-!!I!%\"I-!!)-'#)=##9!$#Y=##YI#$YE#&9A#$I1##9E!#II!&II$"
+ "#YM##Y=##)Q#&)Y!#)I#!YY!#YY\"#)]##J!!%J!&$J%&%*!'\"J)!$Z)&$*A\"\"J)!"
+ "#J1!$:-!!ZE!$J9%$:9#%JA)#J)!#ZE%!ZA$$J=!$J=%%*I#$ZI%%ZI\"#ZM%$JM!"
+ "#ZQ!#ZU!$+!\"$+%&$J]$%*Y&!*]!$;-\"#[!!$:Y'%*]&$[!%#ZU!#[%%%[1!#ZY!"
+ "%;!'$[9%#*]%![1!%K5(#[)!#;E\"&+%\"$[-$%;1'#[9$%K=#$K9$$[=!&J]!&K9("
+ "$[=$%[9!&KE$&[A$%[=$%[A$&[A!%;A\"$[9!&;E'%KE#%;1\"\"[A!#[A!'+A*\"+M!"
+ "$[=!$[E!&[I$%;E\"&;I&\"[)!%;Q\"%;A\"$[=!%;A\"%;E\"&;='$+A!%[=%%[=!%+Q!"
+ "$[I!'+=\"$[A!%+9\"$[=!&+A&(+=\"$K9#$+9\"(;1(%;)#'K9)%+5!$[5!$;1#%;5'"
+ "$+)\"#[5!#[-%#[-!![-$$[-!#[-!#K)##[),$J]$$;%\"#[!!#ZU!#+1-%[%&$+%\""
+ "$+%\"#JI!#JQ$\"*Y!!*]$#Z=\"'K!!$:Q$%JY$$JM!$*I\"$JA!\"JE'\"Z9!\":A\"#J=!"
+ "#J9!#Z=\"$*9\"#J9!%J%*#ZA!#:1#\"Z5!$Y]'!*%!\"J%!#Z)\"!:%\"!*!!&*%!$)U#"
+ "#YM#$*%#%)E'$9](#9Q!$YM'%9M)#9A!#IE!%IE#$)E!$IA&\"IA!\"YM\"#YA#!I)#"
+ "#I1%#91$\"I%!!)-!\"I1!$)!$#HY\"#)%$!(Q#!XU!\"HQ!$XM\"#(M#\"8U!#(M#\"(I\""
+ "#H9&\"HQ!\"XA#\"XA%$X1&#W]$\"H5\"\"X)##8-%\"7Y!#H)%$H5*#()$$8!$\"H%\"!H!#"
+ "!GA#\"WE!!WA$\"7Q!!GI!\"'Q\"#GU##W]$$'Y##H!#\"'U##(%'$(%#\"()##H)$$(1\""
+ "!H%!\"X5#$X)+\"85!\"H9!#(A$%(E&$HE'#HQ(\"HQ!$HU)$(Q'\"HU$#9!$\"8]#\")-\""
+ "%8U,#)%'%I%!#I%#\"Y-%$)-$#)1##)=&!I9##)5##)9#\"II!&)=&$9=%$IY\"$9A\""
+ "%II##YM##9U!$9M!&9Q#%:!($9Q!#IY!%:1(%)Y$$*!##J%!!*%!#Z1\"%Z)*\"ZA!"
+ "#J-!\"J1!$JA$%ZE\"$*5#$Z9\"\"Z=!%ZA#!ZM!#Z=\"'JE&#JI!!*I$!*=(#JI!(JY*"
+ "#ZQ!$*U\"$[!!#ZY!#ZU!#ZY!%ZU*!*E!#*]\"\"*M\"$*]\"%ZU)&+%\"\"ZY!$+-\"&;)'"
+ "\"[)!!;)\"#;)\"$K)$#K-$#[-!%+1&%[-!&[5-$+5\"$K=#\"[5!&+1&$[A!$K5#'KE("
+ "%;5\")+9+%[5!$+9\"#+-\"$;E\"%[=!#[A!%[A!%+=!%+=\"&+=&$[=!$[9!%[=!$[I!"
+ "&+A&%[I$%+M!%;A\"&KA($KA#$[I!&[9!$[=!%;E\"&+=\"%+=\"$+=)#[=!%K5$![E!"
+ "&K9$&+9&&;5'$KE+%+9!%;9\"#K=();A,$[9)$[)!$ZY%&+9\"$[5$$[E$%K-(%[1%"
+ "#[!!$[-!#+)%$[-!$K!(#[%!#[)!![9!';%$$+%\"$K%$$JU!$:U$%J]!#:M*$JY$"
+ "$J]!#+!%$:M#\"Z]!$ZU%$ZU\"%JE%#JM!!:I\"%*I\"$ZM)#JI!$ZA&#J5!$*E\"#J=!"
+ "#JE!&*=+#Z-\"$Z1\"#Z1\"'*),#J-!#J)!\"J%!#J)!#:%'$:%$!Z%!$J%%#I]!$9Y$"
+ "#IQ\"#9U$\"9Q##YM&#YI\"$)E$\"9I#$YE&$IE&$)A$$9I$$IA%#9A$#)9#%9-,\"9)&"
+ "#I)%\"I%!!Y!!\"I)!$9!#\"I%!%(Y\"\"8]!\"8Y!#(]##HQ%#(M##(]#\"(M\"$HI'$(E%"
+ "\"XE\"\"8A!!HE)#(9&#(5##85$\"H1!\"85!\"X-#\"8A#\"H%!$H%%\"7M!#G]!\"7Y!\"GA\""
+ "#'A)!G5!!'E%#GI'!GU!#'U$\"7Q!\"GU\"\"X%#$7Y)#WQ(\"8)!!H%%\"7Q!\"7]!\"X)#"
+ "#(1!\"8-!#XA!#(=$\"8=$\"H=!#XI&#(A$$(E$$HE!#(Y##8M!$XU'$)!$\"8I!$)%("
+ "$I-'\"I!!%(U&#9%!\"I)!#HY\"\"I%!$I1)\"I%!\"I)!$)A!!)=!#)=##Y=##99!#9I!"
+ "#YM%$)U#\"IY!%)M($)A$!YQ!%)Y($J%%#YM%#J%!%)]'$*!##J!!\"J%!$:)!#Z)\""
+ "#J)!\"Z1!$Z5\"%J-&%*=&#Z1\"\"Z5!':A!#Z=\"#J=!#JE!#ZU!%J5\"#JI!!*E!$:M#"
+ "$*Q\"\"ZI!\"JE'%ZQ-#ZU!%K!$#ZY!#ZQ!%JY!#ZY!#[!!%+!\"%Z]\"&+!\"$[!&#[!!"
+ "#+%\"#[%!$*]\"$K%$$;)\"#[!!%[-!%K-$#[)!#[-!%;5\"%[1%%;-'#[5!%;5&![1!"
+ "$;5\"\"[5$%+5\"&+E%$[5!$[9!%+9\"([)+%+9\"#[9!$K9$$[1!%[9%%K=$#[-!#;=\""
+ "$[=!&;9''KE#%+9\"';=#%;1#%+5\"%+1\"([A!%;5#$J]!$;5\"$+9\"$;A\"%[9%&;9\""
+ "$[1!%[9%&;1($[A!#[5!$K5$%[9%$K5#$;-'%+)\"%;!$$[A!#[-!&[-&&K-)!;5&"
+ "#[)!$[1%#[)!$K9$#[%!#[%!$[%!(JQ.$+!\"#[!!%JY!\"[%!\"*Y\"\"ZU!$;!\"#[!!"
+ "$JM%%:M'#ZE%\"ZI!#ZQ!$:M$$:M#$Z=%$:M$#ZE!\"JE$#Z9\"#JI!&Z9##J=!#J)!"
+ "$Z9\"#J1!#Z5\"\"J1!!Z1!#J5!$Z9&#Z1\"\"J)!\"9Y&$9]$#YU&$9]$$I]%$9Y$#IU("
+ "%9I\"\"9Q##YQ%$YM#%)U($9E$%II#%YA+#9A!#9=!$IA)%)5%#I5%\")5\"#Y=\"$)9'"
+ "\"Y-\"#Y)'\"9)#$I9\"$Y!!$X]!#)%#$(]$\"8Q##(]#\"(U(#8Q$\"XQ\"\"8E!#HE#$8E#"
+ "#(A#\"X=##X9!#8!##85%#H1&#8%\"\"89!\"X%\"#']!\"H)!!H)!!H!!$']%\"WQ#\"7U!"
+ "\"'I\"!WA\"#WA*\"WM#\"'I!\"7M!\"WI!$7U\"\"7]!#'Y$\"8)!\"G]$\"H!\"\"8%!\"8)!!X-!"
+ "#']$\"X)##(5$\"X5##8-%#(A$\"H=\"#(I##HE#$(M'$8I%\"8Q!#8I$#(M##HU\"\"I!!"
+ "$XY$\"HQ!!HY!#8]!%(](\"I1!\"I-!\"I)!#95!\"Y1\"#I%#!Y5$\"9A#\"YM!%I=*#YA\""
+ "%)I(%9Q)$)Q$$II&\"IM!#9Q!\")A\"$Y=#$)M$!YY!!)U!%I]&#J!!$Z!\"#Z!\"&*-$"
+ "&:)\"%:1(&Z-'#J)!#J1!$J5!\":)&$*5\"#Z=\"%*A'#J=!&J=\"$:9##Z1\"%JM!#ZA\""
+ "#JM!%JM!#ZE!&*]\"#*A\"$ZQ%$*Q\"\"ZY!'*U'$*M\"&*Y'\"ZY!$+!\"$J]$#[!!#[!!"
+ "%*]\"%ZY\"$[!&%JY!$[9!$+!\"$[1$#[1!$;%#$+)!#K)'#[!%#[-!#K-#';=\"\"K9'"
+ "$[1!![-(%[5!#K=#$[5$#[-!$+A!&+5\"$[5!&+5&'+E!&+1\"$[5!$[=!$+=!%;E\""
+ "&KE($[9!(+-\"&;E*$[E!%[9!$[9!%[-!%+9\"%[5$'K-!$;1#(:])';9#$[=)$K-$"
+ "$;1#$;M##[I!$+5!&[1!%;-\"$[5$$+1!%[1!$[1!$[-%%K!)#Z]!!+%!%+)\"$[)!"
+ "%[)!$K%$%K%$#+1\"%K!)%Z]%!+!!$[-!$J]$#+!\"(*]#%*E'%K!$#ZQ!\"ZY!#ZU!"
+ "#ZU!$*Q\"$:M##ZM!$JI!$:I$#ZI\"\"ZE$#ZE\"#ZU!#*I\"#ZA%$J1(&*9($JA$#J5!"
+ "#J5!$J1\"\"Z5!$*!#!Z%!#J%!#J!$$J!\"#Z!\"#IY!$9]$#J%!$)]##IY!$)]##9U!"
+ "#IU(#)E#!9M\"#9A!#9M!#YM\"\"YE%\"I5!#)=#$I=*\"I9!#91!\"I5!!Y%!#95$$)!\""
+ "$)-!$99\"#9%!$8U%!I!##(Y#\"8U!!XY$$(]*\"8Q!#HQ+\"XE\"#8E%#(E!$(E$\"(9\""
+ "\"8M!#(=!\"X9\"\"H5\"$85)\"81!\"H%\"\"X)%#H)#\"X%#$8!!$G]'!W]$#WM\"\"7U!\"7Y!"
+ "\"WM!\"'=#\"'I!#'M&#'I$\"7M!\"7U!\"WI#\"GU\"\"X!!#GY'\"G]\"!H!!\"8)!$8%$!()#"
+ "!H)!\"H-!$()\"\"81!\"81&\"89!\"H=!\"85!\"8A#\"X=%\"XA\"\"XE#\"(]%#8Y'#H=%\"8U!"
+ "%8Y#\"XY\"#8]$\"X]\"!I!##XU!\"9)#!)-!!Y1!\"9=#\"I5!!Y5!\"I9!#)5&#)-&#)9#"
+ "#YE&%I=##IM\"%IE*#IM!#9I!#9U!#IY!%IU&#)]##9U!$II&#9U!#Z%\"\":!&%)Q$"
+ "$)Y'%*)$%:)%#Z-\"$:%!$Z1&%*1#&:5%\":5#%J5%&*A'&J=\"&:5)$ZI%#JE$#JA!"
+ "$ZI%%:U##JM!$ZI&#ZY!$J]!$*Q\"\"*Y!&JE!$*U\"#ZY!#ZU!#ZU!#Z]%#ZY!$*M\""
+ "#[%!$ZU\"$JY$#ZY!#[!!&J])&;-'#[)!#Z]!\"JU##[-!$K1$$:Y##K)$$[-!\"[-!"
+ "$[5$$[9%%+-&![5!#[9!#[!!$[1!$+5\"#[9!%;1'#[=!#[-!$;9\"![5!$[1!#[9!"
+ "$+1\"$+5!$[5!$K5$$+5\"%;5\"%+=&#[9!$+5\"#[=!%K1(\";)\"&[1%$+1%#[)!%+1\""
+ "%+)&#[5!$+5%';1(#+1!#[)!%;='$;=\"%;%#%+%\"$+)\"$[!%$+9!#+)!$[9!#[!!"
+ "&+!+$[!!#[!!%JQ!#ZU!$[1!#;%#%*]\"$*Y\"#[-!$ZQ\"%*U&!*M%!ZM!%*Q#!*U!"
+ "#JA!$JI%%ZQ\"$ZI%#JI!$JE!$*E\"#J=!#ZI!%:A!&:A%#ZA!#Z9!$JI$'*-)%:5$"
+ "#J1!%*1'$J-\"$Z)&\"J-!$Z=\"!YY!&:%\"\"*!\"#)Y&\"9]#$*%#\"IU!#9E!')Q%$9Q%"
+ "#9Q!#9M!#9I!$IQ%#9=!%YA($I=&%IA'\"I=!!Y5!$)-'\"YA\"$)1$#I)%#)5&\"8]!"
+ "\"I)!%)1(#(]!#8U$\"Y!##(U!\"8Y!#8U$$HQ#\"HQ!$8M)!XI!\"8M!$8E)\"XA##85%"
+ "\"8=!%(9#\"H5\"#X1'$81$\"X-#\"8=!!'Y($H!(\"']\"#8!%!G]#!'I!\"WU#\"WQ#\"7Y#"
+ "#75%#75(!GE!!W=\"\"GQ$\"WI##GA'\"7M(\"7Q!!WU'#GY&#W]'\"G]$\"WU#!H5!$8%$"
+ "$(%##8%%$8-!!H9!%(=)#81%#H9#\"(1\"$HA)\"H=!#85$\"XI\"\"HI!\"XM\"\"Y)%$HQ'"
+ "$8U(\"Y!\"\"8Y!\"H]!\"H]!%I)$$9%#\"Y!#!Y)!&)9,\"I5$\"Y1\"$)-$!(]!#95$\"I5!"
+ "\"IE!$)A$#IA%%IM##IU\"#9I!&)I)$:!$!9M%$II\"%)U$!YY!\"J!!\"Y]$#)]\"#Z!\""
+ "$*)##Y]\"$J5!!:)\"$9]$\"Z5!!Z-!#*9\"#*I\"\"Z5!$J5!$*E&#Z9!&*='%ZI\"$Z9\""
+ "#JA!$J=!#JI!&:E!$:Q#$J=%$JQ!$JQ!#J=!$JQ%#*U\"#ZQ!\"ZU$%:Q(&Z]\"#ZQ!"
+ "$ZU%#ZY!#ZY!%Z]*&J]$#[)!#+!0#;)\"$+!\"$[%!\"[%!#[)!#[%%%+)\"$K5$'K!)"
+ "%;5'#+1%\"[-!%[1!#[-!$K!$!+-!#[1!&+-&#[-!#[-!$[-!%+-&$+-\"$K-$\"K-#"
+ "#Z]%#;)&$[-!#;1\"$[-!#K1##[1!)K1.$[5!$[9!$[1!#[1!%;)'#[%!$JU$%[M$"
+ "$;)\"$;1\"%+-&![9!\"*]\"&;)'$;)\"#[-!#[)!$[!!%[1!$[1!$[)!\"[%!&Z]\"%JY!"
+ "$Z]%#[)%$*]\"#[-!#Z]!$JY$#[%!!ZQ!#ZU!#[%$$ZU%&*M'\"ZY!'ZM'\"ZE!$:M$"
+ "%:M'!ZQ$$:I##J1!\"*E\"%*E'$:A##J1!#J=!%*='$J9%#Z1\"%:1!$J1!#*1\"$:9$"
+ "$Z=%&Z-'!:-\"$Z))$J!%&J1#%J!#!9Q\"$YY'\"J!$#YY\"%9M%#I]!$)I#%9Q\"#II\""
+ "$9U$$9I\"$)E#$)I#%)U'#9=!!I=&\"Y=\"\"I9!#99$#9-$!I1#\")=\"#I-%#9-!\"Y-\""
+ "$9-%$)!%$9%&\"8]!#8Y$!HY!#XU'!HQ##(Q##(M#%(I#\"(I\"$X5##(A#$XA&!(1!"
+ "\"89!#X1&\"8=##X1'#H1&$89+\"8-!!X%!$(%(!7M$#']$\"7Y!\"WY#\"7U!$8!)#GY'"
+ "$&]'!G=!\"G=#!WA\"\"GE#!'E!\"GI\"$G](\"GA\"\"7U!!H)!$'M#\"GI#\"GU\"#(!!#X%$"
+ "#X-!#())$H-$\"H%\"!X5$#89%%X5$\"89!#(=!\"(A\"\"(A\"\"XE%#(=!#8I!%(M&$8Q)"
+ "#8M$#(U!!I)#$HU&$8]%#9%%\"8]!\"9%#&I!&\"Y1\"#Y-&\"Y-\"!Y=!#99!#9E!!99\""
+ "\"99#\"Y=%!YA!\")A\"%YI!$)Q#(9U$#9M!#IY!\"IQ!%YQ!$9Y!$)U#\"Y]!%IY#$9Y!"
+ "$YY&#I]!!:%\"#J5!#J5!$J=!#*-\"$J9!\"J1!$*1#$Z5&$Z9\"!ZE!#J=!$J-\"$JA%"
+ "&:9!#*1\"#ZE\"#ZA\"%:E$$JA$#:Q#&JM\"'*Q'#JI!#[!!$[!!$JA%%*Q'$JU!#ZY!"
+ "#ZU!#ZY%\"Z]!#ZY!$JY($Z]%#Z]!%*Y'#ZY!&:],\"+!\"$;!\"$:Y##[%!#K%$#[%!"
+ "$;5\"%+%\"#[)!(;)(':]$#Z]!$+)!$;5&$+%\"$+5\"$+5\"#[!!\";5\"#[9!$+-\"$+-\""
+ "#Z]!%;-#$+%\"#[-!%K%!![1!#+-&&[).#[1$$[5!\"[)!$+1!$[9!![-!*+%,&+-\""
+ "#[)!$+)\"'+)\"\"[1!$K!(\"ZU$#[%!$K%$&+)+%+%\"%K!(!*]!$K!$\"Z]!#ZY!\"[%!"
+ "#Z]$!;%\"\"[!!%:Y$$JY!&K!!%*]\"#Z]!$:U#$JM!$JE!#*Q%%JQ$$*M\"$JE%#ZI!"
+ "#JA!'*=!#ZA\"#ZI!!Z=!\"ZE!#JA!#J=!%:9!!:9\"#*-\"&Z5.$:=#&ZA+$*1\"$J))"
+ "$*-#$*)#%9](%Z)*$*!*$J!%$*!'$Z!#\"J!!$YY#!)I!!)]!$)Q#$)U##IM$%)Y$"
+ "%I=+#YE#\"IE$#99!#YE#\"I=!%)M(\"I5!#95!!II#\"I1!#9-!#9%%\"HQ!$Y%'\")%\""
+ "#9!\"$)%'\"HU$#(Y#\"H]$\"XQ%#HI&!HQ&\"8M!#XA'#(I$$XE!!HA&\"XA#\"X=##X1&"
+ "\"85!\"85!\"(1\"%8--!(9!\"8)!\"X%#\"7]!!H!!\"7U!$GA&!8!\"#'Y$$'](\"WQ#\"7Y!"
+ "!'1!\"79!!'9#!WA\"#'A'!'M!\"WE*\"'A!#GM!!'U!\"WU##'Y\"\"WY-#X!(%(!$$GY#"
+ "\"X%##(-$$X)&\"X-#$(%(\"H)\"&8E\"\"(1\"#8A\"!(=!!HE&\"XA#\"XE##HE\"#X=!#X]&"
+ "&8U+!HU!$(]$#(I##(U#!Y%!#Y!'#8Q!#I%#$)-!!)1!$Y)!!)!!!Y1!#99!\"I-!"
+ "#)A#$IA#$Y5$$9A%#9E!#Y9##9E!#IE!#9I!&)A,#9Q!$)]#\"IM!#IU!$9I%$IY%"
+ "#J!$#YI#%Z)##YY&%J1&#J!!\"J-!#Z1\"#Z)\"#Z-\"$:-!#:--%:!!$*)##JA!\"ZA!"
+ "!*9!#*=\"%:=!%*A'#:A-%:=!#ZI\"!*E!#JI!#JA!#JE!$*U\"$*Q\"\"*M\"$*Q\"%:U'"
+ "$JM$%*U\"#Z]!'+!#%JI!$*Q\"$;)#%JY!'*Y$#Z]!#+)\"\"ZU!$+%\"#[!!%*]\"$*Q\""
+ "\":Y\"&ZU*$;1##[)!#[5!$;1\"$*U\"$;!\"\"[!!$K%'#[1!%;%'%K%$$[%%$*M\"%[1!"
+ "$K)$'*Y'$:U$\"+-!%[%%#+!\"$K)$$+-\"%K)(#;5\"#[)!$[5%$[1!%[%&#Z]!$*Y\""
+ "$[%!$[)!';!$%+%\"#[!%#[!!$[!&%;!'\"*Q!$+!&\"*]\"#ZY!#Z]!\"[!!$J]!\"ZU!"
+ "%JU!$:Y#$*U\"\"ZU!$*]\"\"ZY!$*Q\"$JQ!#*Q\"#ZM!%*M&$JA!!:I%$K!$\":M&#ZE\""
+ "#JE!#:A#$*I\"%JI(!Z=!#J=!\"ZA!#*9\"$Z9\"$J-%$:5#$:1#$:E$#J5!\"Z=!%9])"
+ "$:)$$*1#$)]##YY\"#*!#%)]'$Z%\"$9Y!#J!!#YU\"#J!!#IU\"#YM##)U#!YI$%)I("
+ "\"I]!$)E*$I9&$9=%\"I=!!YA!#9I!#)5##)-#$I1#\"X]%\"I-!#9-!%)%\"#I%\"#I!\""
+ "#9!\"!HY&!(]!\"8Y#\"XY\"#HY%$8Q&\"HY!$8I##(I#\"XI\"\"8A!\"HE!$H='$XA(#H9#"
+ "#X9!#(1&\"(-##(1#\"X5#!(!!#X)$!GY!\"G]%\"G]\"\"W]#\"7U!\"7I!\"WQ#\"7M!#'I!"
+ "!'1!!71$\"79!\"GA#!W9\"\"7A&!GE!$'A$\"GE%\"GA\"#'Q$#GA'\"WU#\"7]!!'Q&\"WY!"
+ "!H%#$()(#81!$H1*\"X-#\"81!\"H-!\"8)!$89)\"81!\"8=!#8A$$(E%#HE#\"8Q!!HI!"
+ "\"8M!\"8U!$(Q%%(Y&\"8U!!HY!#H]%!H]##9!\"#9%!#I%\"#9)!\"I1!!Y-!#))#%)9!"
+ "\"I5!#Y9&\"I9!$)E'#9E!$9A+\"IA!$)U#$)A##)M#$)M#$)I#$)E!%IQ#!Y]!%)U!"
+ "\"YQ%#J!!$)]#$*)##I]!$Z%&&:1\"$J%%#J)%#J9!#J-!$J5!!:1\"$*%#$:1##ZE!"
+ "%J9!%:9(#Z9!#Z=\"$JI!#J-!#JA!$*E\"\"ZE!#Z=\"!J1#!*E!#*I&&:Q$$:M$\"ZM!"
+ "%*U'':I!#ZQ!#Z]!\"Z]!\"ZM!#ZU!$:Q$#ZY!&:U$!+!$$JY$#ZU!$*]\"$JQ!#+%\""
+ "#:]\"&K!$#[%$#[!!%J]($+%\"#ZY!&JY,#K!$#[%!$;%#$+)\"%+%&\"[%!%[1!%;%'"
+ "%+%&&[%!$[-!\"[-!$;%##[)!#ZQ!$+%&#[%!%;%'#Z]!#[)%#[%!\"K-$%:Y$$;!\""
+ "#[9!$[!%#JM!$;%\"#[!!&;!#%ZY\"$Z])$:U'$K%$#Z]!%*Y\"&ZU'#K%$#ZQ!$ZU\""
+ "%:E($ZI&$*M\"$*Q\"$*M\"#*Q\"#JI!\"ZM!#ZQ!!*M!&:=!#*E\"#ZE\"%JM)!ZA!$*A\""
+ "#JA!#*A\"\"Z9(#J=!#Z1\"$*E\"\"Z9!#Z5!#Z5\"%*%#$:1!%J1)$*)'\"J)!#*1\"$J)%"
+ "$:1#%)U!#J!$$:!!&*-+$:)$$IU)\"IU!$)U##YM\"#IA!#YM#$9I$#9Q!#YI#%9I)"
+ "$IM\"#IA%&)A,#9=$\"I1!$9A%#)9#!I1##Y9##)5#!Y-!!Y-!#(Y!#H]\"$8Y%$(]$"
+ "\"8]!\"HY!\"8U#$8U(#8Y$#(M##XQ$%8I'#XI!#8I%#XA$\"X=##8E$#(=#$(E'\"H5\""
+ "\"XA#\"81+\"8-!%()!\"8%!#X-$#H!&\"X!#\"W]%#GY)\"WM!\"X%#\"WU#!WQ$!WE!\"GI#"
+ "\"79$$7-\"\"'1#\"79\"#'A$!GA!\"G9\"\"'I#\"GI#\"GI##7M%#7U#$(%(#7Q\"\"H!\"\"7]!"
+ "#'E!#X!$%']!$7]'\"X)#\"X5&\"X9##H1##X5&\"89!#(9#\"8M!$HE$\"X5#$8E)#HI\""
+ "$HI'\"HY*\"XI\"#8I%$(Q%$(]!#(U&#(Y#\"8]!%9!*#9%!#(]!\"I)!\"IE!#91$$Y)("
+ "#91!#9)!!95\"\")E(\"Y1\"!YE!#YA##Y9#$9A%#IM%%)I+#9Q!#9M!$YM##IY!%IU&"
+ "$IY&#IY!#Y]\"#YU\"#Y]\"!Z)!$Z%#$*)#%Z%'\":%##J-!%:-!#J)!#J-!#Z1\"$:1!"
+ "(*-*#Z)\"%JA!&J9\"#Z9\"#Z9\"%*=#$JI%!*A$$:Q$#ZQ!$JM$#JE!\"*I!$JI!#JE$"
+ "&:=!#JI!#J=!#JM$#*I\"$*Q\"&*Q'%*M#%*Y&\":]\"#ZQ!$:U##ZY!#ZY!$ZY!$ZU\""
+ "%*Y'\"[!!\"JY$#[!!$[%!\"J]##*Y!$*Q\"%+!&!K%#&J]!#[!!$ZY\"#+!\"!+!!#[!!"
+ "$[!)#[-!\"[1!$Z]!%;%'#Z]!\"K!$$J]'#[!!%;!'#[!!%:]'![5!$K!(#*]%\"[-!"
+ "$Z]%\"ZM!$:]#%+-)\";%&&Z]\"#;!\"\"ZY!%ZQ\"#[!!$*Y\"&*U'$:U$%ZU%$K)$\"ZY!"
+ "#ZA!#JU$\":Q\"$*M\"$ZM%$JY!#JM!%*I\"%*I*%:=$$JQ!#ZM!%:E$#JE!$JA!#J9!"
+ "#J-!#J1!#Z)\"%*5#$JA!#Z5\"#J)!$J9!$*1\"$:-##*-\"$*1\"$Z)&$J%%#J)!#J!!"
+ "$Z!##IY!#J!!#9Y#$)U#$Z!&$)U##IU\"#)I#%9Q(#9E!#9E!#9I!$9I%&IA$%YA("
+ "!)=!\"I9!!IQ#\"I9!$95\"!Y-$\"I-!!Y1!!)5!#91$#Y)#%I)($9-\"#I!##(]!%(Y\""
+ "%(Y%&(]-$HU$#(I!$H]#!HM!\"8I!#XE$\"XE\"#(A!#(E##(=!\"85!#X9'!H9!$H-%"
+ "!89\"\"X1%!GU!$8-)\"X)&#H-##'Y'#7](#7Y%$W]&\"7U&!7U\"!WI!\"WI!\"GE#\"7=$"
+ "#W9%!G)!\"'9#\"GE$\"G5\"!W=!\"WQ&#G-\"\"GA#\"GM\"$'Q##'I%#7]#$'Y&#WU$$'Y%"
+ "\"7Y!!H5#\"8!!#7]%\"H-!#H5&$89)\"8)$#X1'!XA!$(9\"#(=$%(1$\"HA$\"HA!\"XQ\""
+ "$(A%$HI##XM'#HQ\"%8U)#XM'#XU#\"8Y!%8Q'#H]%$(U$$8Y%#))#\"I!\"#X]&$)-'"
+ "!)1!#I)%!Y5!#95!#I9%$Y='#9I#%IE*%IA$&)E,#9I!%YM!%9I%$)M##9M!#YQ#"
+ "\"YQ\"$9U$')U*&9M#&)Y$#9U!%9])&*%$#J-!$*%#\":%\"#Z%\"':5)\"*=!'*1!#:1#"
+ "\"J1!\"*1\"'J9/#*5%#J9!#J5!#J=!$:=$#J=!!Z=!$*=\"\"ZE!#Z5!$ZA\"':I)$*5#"
+ "!ZA(#JI!#ZY!#ZQ!$ZA\"%*M\"#ZU!!JU'#JI!%:Y$#ZQ!#ZU!&JM)$*U\"#*U\"%ZI'"
+ "$JI%$JY!$[%!'JY%$ZY%#*Y\"\":I#%K%$$+!\"#[%!#ZU!$*]\"\"JY#$*]\"#:Y#$ZY\""
+ "!*]$$*]\"#ZY!#Z]!#ZY!$[%%$:]##Z]!#Z]!#[!!$:M$$K!$$J]!#Z]!#ZU!#:]#"
+ "#ZY!!:Q\"&:Q$$Z]%#ZY!%ZU-$ZU%$:Y#$JU$$JQ!&ZY\"%:]''JQ&#JM!%;!##ZQ!"
+ "#JA!$J=!#JI!\"Z9!#JI'$:Q##JE!#J9!%ZE)#JE!$*5\"#JA!#ZA\"%JE(!ZA!#Z1\""
+ "$J=%&:-\"#ZA\"#J5!!Z5!$*1#\"J1!#J-!\"J)!&*-%$*)#$Z=&#J9!#Y]\"$*!#$)Q$"
+ "$Y]&#J!!#9U!$I]&\"YU($9U*%II#$IQ%#9M!#9M#$)I$&YQ(&9E-!YE!#9I$#)M&"
+ "$I=*\"I9!#Y=#\"I=!!Y=!$I-#\"I-!&Y--#)!#$I)*#9!!#I%#$Y)'#(U!$91\"#HU\""
+ "\"HU!#XU&\"Y)+#XA$\"XM\"$8A#%(E&\"8I!$(E'\"8A!%8=$#H=&#(5!\"X%#\"(1#\"(5#"
+ "\"8)!\"WY!\"8-!\"H1'\"8%!#X!'#7M&\"7Y!\"7M!#'Y$#WU\"#'M$!WM!\"GA#\"WE#\"7A#"
+ "\"'-!!GA#\"'9#\"7!$\"WE!\"'9\"#'=%!GI!#'I&\"GE$\"GM\"\"WM#\"'I!\"WE##GY)\"7]!"
+ "#7Q%\"X!#\"H%\"#H!$#X%'\"8)!\"H%'\"X-\"!H5!\"8!##X5$$(9%\"X%##X=$\"HA\"#8I%"
+ "\"(Q%#(9#\"8I!!(Y&\"HQ!\"H]$\"8U!\"XU\"#XY!\"8Q!#(]##Y!$\"))%$)!$%I)'\"I-!"
+ "!Y-!!I9&#)5#!Y9!#)5#$99(!Y9!#I=\"!I=&$)9'')A.#9E!#II+$)I&$9Q%$9Q$"
+ "\"IQ$!)Y!#9U$$)Y##YY\"%)Q$$:)!&Y]$$)]#$:-##9U!#Z%\"$J%%#Z)\"#J)!%:-)"
+ "$Z-&#Z-\"#:1#\"J1'#JE!#J5!$*5\"#J9!#J=!%:=(#Z=\"#JA!#Z9!$*5##Z=%#JE!"
+ "\"ZA!\"ZM!%*M\"#ZI!#JE!&*Q'%*Q#%ZU&$*U\"$ZI%\"Z]!#ZQ!#ZU!%*Y\"!ZY!$:Q#"
+ "\"ZU!%ZU!$*U\"#Z]!#:Q'%JY)%*M'#JY$%:Y$$J]$%+!&#JM!$;%##Z]!$ZY%\"Z]!"
+ "$JY$#*Y\"$*Y\"$[!&%:U'$*U\"$ZY\"#[)!$JU$#Z]!#[)!$JY!\"JY'$*Y&%JU!%;!'"
+ "$K!$\"ZU!#ZU!\"ZI!%JY%\"[!!#*=\"%ZQ%$*Y\"#JI!%:U(#ZQ!#JE$$:M#$ZE\"$JM%"
+ "\"*E!$ZM!\"ZI!%*Q##ZE\"!ZY'#*I\"#JI!$:-##JA!$*A\"&JA*$J=!$*E\"$Z9\"$J9%"
+ "#J=!#:9#%J)\"#J!!!Z1!$:-!#Z)\"#Z1\"\"*)\"!Z!!%IY&$:%!\"J)$$:%$&J)#$9U$"
+ "$I])$J!($*%'$9]!#Y]&!99%$YQ'#YY\"$YI&%YI!$)=!#9E!$I1##I9\"$YI'\")=\""
+ "%9=#\"I1!#)5#$I%&#9)$#9%$!Y)!\"I1!#I)%#9%!!9!%$(Q!\"8]!\"8]!#X]&\"XU\""
+ "$8M&\"8Q!\"8Q!#XM!\"HA!#HI#$(E(#(=#!(A#\"H5!#(=$\"(-\"#H-)\"85!#81%\"X-%"
+ "\"X)#\"X)\"\"8%!\"H!'\"G]\"#8!%\"X!#\"H!\"\"7E!\"GM\"\"7M!\"7M!\"X!#\"'E#\"'A\"\"'A#"
+ "\"71\"\"'-#\"7=$\"7%&!G5!\"79$\"W9&!G=%\"GE%#7E(\"G1%\"WI!#WM'\"WM##'A%#'I\""
+ "#X!\"\"WY#\"7]!#(!$\"X!#\"8%!\"X!!\"8)!\"X=#\"8)!\"X9\"\"X9#\"8=!#(9#$(9'\"8I#"
+ "#8A$#(A#\"HA\"\"HI!#(A'#(=$\"8U##(U##HU\"\"HY!$(]*\"8Y!\"HY!%9!*#X]!\"Y)\""
+ "!Y)!#Y-#\"I9!\"Y-%#)-#$)E'$I5##99!#)=#\"YI!#9I!#II!#9=!#YE#\"IM!$II%"
+ "$99%$IE\"#IM\"$YM#\"I]!#IQ\"!)Y'%J%&#I]!#9]$#J!!$J)!#*%\"%*%'#YY\"#Z%\""
+ "#J)!#Z-\"#Z!\"$J-%$*5#$Z1&#J)!#:5#\"J1!#J5!!*1!$:5##J=!%ZE)$JA%#J=!"
+ "$:A#&:A%#:A#!*E$%ZE&$J=!%*M&#ZQ!#ZI\"$JE!%:Q$%ZI&&*M'$:Q#$JY$$JQ!"
+ "#ZU!\"ZQ!$*Q\"#ZU!#ZU!&:Q,$ZU\"(:Y)!ZY!#ZU!$*U\"$:U#$*U\"#ZY!#*Q%#ZQ!"
+ "$:U$!+%!%Z]!\"*]%$ZU)&JU!#ZY!(:I%\"K%#%ZY!%Z]*%ZY%$:Q##ZU!$:I$$ZU\""
+ "#*Q\"$ZQ\"%JQ!%*M&#JM!$*Y\"\"[%!'Z9$%ZU\"%*I\"&ZM.$JE$%*M&$:M#\"ZQ!$JU!"
+ "$ZU%#*A\"%:9!$*Q\"&JE!':A!\":A&$:=#%:=%'J=*#JA!$:5'%*9'\"Z9!&:-!#Z5\""
+ "#:9##J5!#J-!%:)!#J-!%*-##J!!!Z1!$9]!#:!#$J%%#J!$$Y]#%Z)#$9Y!$)U#"
+ "$IM&$*!#$)U#$YM'#9Q!$)Q##YQ\"&)I)$YI$#YE#!Y5!\"I5!!Y=!#I=%$Y=!\"Y=\""
+ "#I9\"%I9-%91,%91#\"I1!#I!%#))#%I-!!Y!\"$))$\"8U!$8I&\"8Y!\"8M##(U##8U$"
+ "!XQ$\"XQ\"#(I##(I!#8Q$!HA!\"8I!\"XA#$HM)$(9+\"H5!\"X=#\"8E&#X1$\"X-##8%%"
+ "$8))\"8%!#H%&\"X!#\"7]!$8!!\"WY!\"WU!%'A(\"7Q!\"7Y!\"GI#\"7I$#7M'$7E$!GA!"
+ "\"'9!\"7-$\"G)\"!W9($7%!!GM!!G9!!W5+\"')\"\"'1\"\"GE%#GA$\"'9#\"7U!#'Q$\"7Q!"
+ "#7]%\"WY#\"7]!\"X!#\"X!#$WI#!H-%#X%'#8!#\"8-!\"81!#(1'\"89#%8-*\"X5#$H1\""
+ "\"8E!#8=%!HA!\"XI\"#8A\"\"HU$\"8M!\"HQ!\"8Q#\"8Q##(Y##8U$\"8]!#9-!$9!&#I5\""
+ "#I%##))##I)%\"Y-%\"I1!#)1#\"I9!\"Y1\"\"9=##99!#)=#$Y=#'YE&!99%#99!%YI+"
+ "%IQ)$IM%$9E\"#YQ#%)Q$#9U!#YY\"#9I!$IU\"%YY$$)U'&9U&$)Y#%J!\"#Z-\"$9Q!"
+ "&*)!$J)%%*1'#Z-\"\"J-!#J-!#J1!%*1'#J)!#Z=\"#J5!$*=\"\"Z9!#:9#$*)##:=#"
+ "\"Z1!!*5!$*A\"':A)$J5%$J9!#ZQ!%:I$%ZE\"$:A##ZE!$JA%#JI!':U%%JI!#JM!"
+ "%ZM\"#ZE\"\"ZM!\"ZI!%Z]\"#Z]!$J]$\"ZQ!$*Q&$ZU!$ZQ!$:Q##ZQ!%*I#$:Q$#ZA!"
+ "&:Q(#ZU%#ZQ!%:U#&:Q($ZU%$:M#\"Z]!\"ZI!%+!&\"ZQ!$JQ%$JI!#JM!&:U$#ZQ!"
+ "&JU!%JE%%:I$\":Q\"\"JQ#$:U##ZA\"#ZU!$JA$$:E#$*A\"$ZU\"!*=!$Z1\"%*I#\":I#"
+ "$*I\"#ZI\"%:A$!:A\"\"Z9!#J=!!*=$#JI!#JA!#Z5!#Z5\"#*5\"$JA$&J5*%:5(%*E+"
+ "$:1!$*)#$:1!#Z-\"%:1$$:-#$9]!$)]#%)Y'#*!#\"YU\"#Y]\"$)]#$9Y!#YM\"#9I!"
+ "#YM#$I]($9U!$9]!#I]!%YM$#9I!$)Q$$)A##YA#$II%#99!#)9##99$#9A!\"I1!"
+ "\"I5!#I1%#91!\"9)#\"I-!!91(\"I!!!I9##9!!!Y!$#8]'#HY%$(]-#XU&%HU+%HQ%"
+ "#HY%#HM&\"XA#\"XA+\"XE##(I##HI%!X=$\"XA#\"XE\"\"H)!\"8-!\"X9\"!8-%\"H5\"\"X%%"
+ "!H!!!H!!\"7U$\"X!##7Q&\"H!\"\"7Q!!'I#\"7Y!\"WM!\"7=$\"'Y(!G=!!GA#\"GA$\"79$"
+ "!W)!\"7=#\"G)!\"'-#!W-$\"W5#\"75#\"'1#!G=!!W=!!'A%\"'E##7M%!7Y\"#7M%\"WM#"
+ "\"7E!\"GQ\"#W]$!WY\"#H!!#8!%$8!$\"8!!!H!!\"H!\"#H)##X-$\"H-!\"H5\"$X1%#(='"
+ "\"XI\"\"XM\"\"XA#$8E)#HE%!HQ!#(M##XE#%8M##XU!\"8U#%8Y!\"8Q!#HY%\"HY!$8Y\""
+ "#)%$#9)!\"I%!\"Y-\"#)-#\"Y%#$)='\"II$#)5#\"Y9\"\"Y9%$)='#Y=\"$)E##Y=&#9M!"
+ "$YE'#9E$#IQ!!9I(#)M#\"IU!#9U!\"YQ!$)M#%YM+$IM&%)Q$%J%*#I]!&*!!$:!!"
+ "#*!#&J%'#I]!$*)#\"J)!#J)!$J-%#Z-\"#J9!#J!!\"IY!$J5)&:5!#J5$&:9%%:9%"
+ "!*=!$*9#$*=#%*9#$Z=)$Z9\"$*A&%*=&#JE!$:A#\"ZA!#J9!$JE!#ZI\"!ZE!#:I'"
+ "%:=($JI!\"*I\"#*I\"$:I$$JM!%JM)%ZQ\"$:M#\"JM'$ZU%#J9!$JY$%ZI*%JI($JM!"
+ "%ZI*\"*E!#ZE%#JM!$J=%\"ZE!\"ZI!!:I\"#ZM!$*=\"&ZU-%ZQ*%:M(&:M!#ZU!$:I#"
+ "'Z]'%JU$#JI!#*I\"$J9%$Z=\"#ZI!$*I\"#*E\"$:I$$*I\"%JA%#*E\"#JA!#JA!\"ZA!"
+ "#JA$$*5&$Z=&%*='#J=!%*=&$*A\"#J9!!*9!%*5##Z5\"#J5!#J1!%ZA)%:1!#J)!"
+ "#J%!\"J)!$Z=\"$Z!#%*%'\"J%!\"Z)!$Z!#!J!#$*!#'I]$#II!$*!#$YA'%9Y%$9U!"
+ "%YM(#IE!$YM*#)I\"#YI\"!YI!$99%$9M$&I)(#9E!%)=\"$9A+#)=#$9A%#)1#\"I5!"
+ "\"I-!\"I-!\"))\"\"91#$)-'$)%$$9%##HY\"#)%#$8]%!HY!#(]!\"(]\"#HU%#(M#\"XE#"
+ "%XI/#XI!#(I$$(E'#(]!$8A)#H-%#X1%\"()#\"XA#!(9!\"X1#\"8-!\"()\"!H1!$(%("
+ "\"7Q(\"X!#\"X%#!H!!\"7U!#7Y\"\"7Q!\"GE\"\"7M!!'M&$GI%\"'E#\"'A#!G9!!W=\"!79\""
+ "!G!!#'!'\"')\"!G-!\"'-#\"'1\"\"G9\"!'5#\"'=#!W9\"\"GI$!G=*!GE!$']#\"7E$\"WI#"
+ "$7Q*\"7Q!#'M$#GY&\"WY#\"8!!\"X%(#8!%\"(!%!H%!#H)$\"8%!#(1$#(1##(9$!HE!"
+ "#H9#\"89!\"H9\"$(A%\"(A\"%(E&!XQ'$HM&!HQ!!XU$$8Q#!(Y#!)!!!8]%\"Y!%#8U'"
+ "#9!!$Y!$#Y)##Y)##9)$!)-!\"I1!!Y1!\"I-!#)I#%9%&!Y5$\"IE!#99$$)5$!9Q%"
+ "$9E\"$9A$$)=$&YI,%)9($)Y#%)A'\"9I#%)Q!$IU%$IQ\"#Z)\"#IY!$)Y#$I]&#9U!"
+ "#J!!$J-%$J!!#Z%\"$9U!#J)!$J1\"'J)$#J-!\"J-!#J=!$:1##Z1)#ZE%#J5!#J5%"
+ "\"J1!$JA!$*5\"%:)(#Z9\"$Z=&#*9\"#J=!\"ZQ$#JA!#JI!#J=!$:Q#$J=!$*E\"#JE!"
+ "&*E(#JA!#*E\"!ZQ!%:9($*I&#JI!#JE!!ZI!#ZU!$:E#\":I#$*M\"#JE!#ZI\"$JM!"
+ "#ZE\"#JM!$JA!%*I\"$JI%\"ZQ/&J=\"#ZE\"\"ZI!#JI!#JE!$*I\"%JM!#*E\"#*I\"#*I\""
+ "%*U\"$:Q$#JM!$:M#\"ZA$%*Q&#JE!%*A##JE!%JE-$ZA\"#JI!%:A$$ZA%#J1!!Z=!"
+ "#*A\"\"*9%#*1%#*-\"#Z1\"#*9\"#:)##:5#\"Z5!#*9&%J5)\"J1!$:-#\"*)\"\"J-!\"*%\""
+ "#Z)&$J1%#Z%\"%J-)\"J)!%J!\"#9Q!%)]!$*!#%)Y!#J)$#9U!!9U\"#YQ##9=$#IU\""
+ "#9M!#9M!!YM!#YA&!YE!\"IM!#YA#$)5$#Y=##9=$%I-'\"I5!$I5#\"IE!\"91&#91'"
+ "\"I!!\"I-!$8]\"#Y%&$)!!#91!#8]!$(Y($X]*\"XE#!XY!\"XQ\"!I!#!(Y!#HQ&#(M)"
+ "%H=.\"8I#!8Q%#HE&\"8A!#XA#\"H9\"\"(9%\"X5\"#(1&\"(1\"$X%%\"X-#\"()#\"7Q!\"X!#"
+ "$(!+\"'U#\"7Y$\"X)#!GU##WM'\"WQ#\"7Q##7I#\"WM#\"'A#!GA!\"WA%!G9!#'='\"')#"
+ "\"'!#!G1#\"W5%#'5$\"')!\"'1!\"'1'#'A'\"W5#!G9!!79\"!W5\"\"'A#\"'M#$'9)!GM!"
+ "\"7M!\"'Q##'U)#GY!\"7Y!#'Y$\"X%#\"8!!!7]%\"81!\"8!!!()!#(-'!(-!\"7]#\"X5#"
+ "#(9##(=##81\"\"81!#(A$#XE#!HQ!#HI%\"HI!#HM%\"HQ!!HU!\"8U!#(Q!\"8Y!\"8U#"
+ "\"8U!$9!%#I%#$9)%#9-!#9)!#9-!%8Y-$)1!#)1#$)A!#)9#\"I=!#Y9##YA##)=#"
+ "%)E!\"I=!$)A#')I\"$9Q%#II\"#IY!$)M$#)I##9Q!!IM#$)U#')U-\")Y\"$)Y#$9Y$"
+ "#J%!%)]'$*!#$9Y$#IY$#J%!$)]##Z%\"%:)%#J-!#J-!'*9!$J%&%:-%'*1!#Z1\""
+ "$Z-##Z-\"$J=%$*1#$*5##JA!$Z=&&*9$\"Z5!$Z=\"#Z5\"$Z=%#*A\"%*-'#JA!%ZA)"
+ "#ZA\"$ZA%$*I\"#Z9\"!ZE!!*I$#*M\"#JA!%*E\"!:5\"$JE(#Z5\"#*I\"$:E$%JM!%:E$"
+ "$:I#!:M%$JI!%JI!$JA!#JI!#ZQ!\"Z]!#J=!#ZU!$*=#$JI!#J=!#*=\"$JE%#*Q\""
+ "#JA!$JA!$JA$$:I##ZQ!#:E#$*=\"%JA!$*1##:Q##ZM%#ZA\"$JA%!ZE!#J9!\"*9\""
+ "#J1!\"Z9!&*-$#Z5\"#J9!%:5!$:1$#J-!%:1!\"J-!$:5$&*-%#Z1\"#J-!#J)!%J!&"
+ "$J%!#Z%%$J!&$YY#$J!\"%9U(\"Z!%%9Y%#J!!%)M!\"IU!$9U!#IM!&)Q,#)M\"#9Q!"
+ "\"IA!\"IM*%9U)\"YE\"#9I!$)A!#9A!$)9!%YA+#99$%IE##)5#\"I5!#)1#\"Y1\"!Y)!"
+ "$Y-(\"Y)\"$9%\"$)5!#H]\"\"I!!$H])#H]+&X]-\"8Y#\"XU\"\"XM\"\"8Q!!HI!#8M%#XM$"
+ "#XQ!#(A$!X5!\"89!\"8=!#X1&!H9&\"85!!H9!$X-##(-$#()!\"8!!\"8%!$8)$!G]!"
+ "$7Y$\"7Y!\"'E!!'M!\"7Q$$7Q$#'M$!GE!\"'M#\"75!!G=!#'I'\"'=%#'A'!W5\"\"'9%"
+ "\"&]!!FU#\"G%%\"'%#!'!##'-'!W5\"!G-!\"'5\"\"71$\"79$!G1!!'9%!W=!\"GE$\"'=!"
+ "!GI!#7E##7Q&\"GQ\"\"7U!!WY!#7Y%\"H)\"\"7]!\"8%!\"X%##H)#!H)!#85%#8=%\"H5!"
+ "\"85!#(=#\"(A%$XA\"\"8E!%(A!%(E)$HE'#8=$#(I$\"(I\"#9!!\"XM\"\"XU%#(U#\"XU("
+ "!XY$#8Y'\"8]!\"Y!\"%9%'$9)&$I)##))#$)-$#)1#&)-)!Y1'\"I-!!91\"#Y5&#)5#"
+ "#I=%%Y5(%)A%#Y5#$9M%$)E!$II&%)I(%)M('9M$#II!%)Q(\"YM!$)U#$YY&#9Q!"
+ "\"9]#!YY!#)]#'*!!%*!'#J!!%:)!%*%'#J)!#IY!&:)\"#J%!$:-!\"*-%#J-!$*)#"
+ "&Z-$#J1!#J1!#ZA!#*5%%J5%#J5!#Z5!#Z9\"%:9%#*A\"&*9+$:9$$ZE&#ZE\"#ZM!"
+ "$Z-&#J9!'J='#J=!$Z=\"#J=!%JM)$J=!#Z=!#JA!\"ZE!$*A#%*=#&:1)#J5!#JA!"
+ "$JA$$JI!$ZE\"#JE!\"ZE!&:=,#JE!'ZE+#Z=\"%ZM\"!ZA$$J1%!ZI$\"Z9!\"ZA!$ZM\""
+ "$JE!$ZE)#ZE!\"ZA!%*-'#JA!\"Z=!$J-%%*E#\"Z=!#J5%$*9##JA!&*9$$J9%#J5!"
+ "#9]#!:A\"#J9!\"J1!!Z%!\"ZA!#J-!\"Z)\"%Z9\"#J)!#J)!#Z)\"#J)!#J!!%:-!%*%'"
+ "\":!#$Z!#%*)'#9Q!&:!,$I]\"$Y]#\"IY!$)U##9U!#IE\"#IQ!%YM!!Y=!$9M(%)I("
+ "$)9$#IE!$II&$99\"$)E!#Y=#!)I'#Y)#!Y)!\"I9$#95$!)1!!)9!#9-!#)1##))#"
+ "#9)$#I%##9-!$HU'#)!#\"X]\"!H]##XQ#!H]&#(Y##XQ'\"XQ\"#HM#!(I##(=!\"8E!"
+ "%8E$$8A)\"89!\"X=#$X1#\"85!#X5$$H%(\"X1#\"8)!#()$\"H)\"!8!\"\"X%##7]\"$8%$"
+ "\"WY##WY'\"7Q!!GQ!\"WQ##7M%#7M%#'E$!GE#\"GA\"!WA\"\"W=(!'9!\"7I$\"71*#6]#"
+ "#V]&!VY$!W)\"#FY%\"G!%\"G)%#W1(!W%$\"W5#\"'1#\"W9$!G9!#'1$\"'A#!GA!\"'A#"
+ "#'E$#'=%!GM!$W]&#H%!\"7U!\"WU#!GY!$7]!!WU!\"7Y!\"X)#\"81!#H)!!(1&$']\""
+ "\"X1#$(-#\"X9#\"H=\"\"(='\"X=\"#HA\"#(A#\"XE\"\"8M!#H=&\"XM\"#(Q#$XQ!\"HQ!\"HU!"
+ "#)%#\"8Y##9%'$9!%#(Y!#9!!#9%!#I!\"\"I)!\"I9!#I-\"\"Y1%#)1#$Y5'#95$\"I5!"
+ "#)9##9E'#)A#$YI&#9I##Y=##YE#!YE!$)M#%)I(#9M!%)M!%9=%$)M##YQ\"$YE'"
+ "\"IQ!$YY#$9U!%)Y+#J1!#I]!#I]!#Z9\"!)]!#Z%\"#J)!$)Y#$:%!%:1%#J!!$:!!"
+ "%:-!'*))$:-$&J!'\"J1!$*1\"!*%$&:=%$J5!#J1!#J=!!*9!#J9!(:9&%Z1'#J9!"
+ "#ZI!#J9!\"*5\"#JA!$J9%#Z-\"$Z=&$:5$#JA!#ZE\"%*%##Z9\"$Z1&':A!\"Z9!%*Y'"
+ "$:Q##JA!\"ZA!$JA!#Z9!#JA!\":M\"#JE!#J9!#J9!&J=\"$:1!%J=)&*='#Z=\"$J=!"
+ "\"Z=$#Z=\"$JE!#J1!\"Z9!$J9%\"JA#$J9!#J5!%:)!$ZA%\"Z9!\"J5#%Z5*$Z5\"%:1)"
+ "#J1!$Z=&\"J1!\"*-!#Z)\"#J5!#J%!#J)!!*)!%Z)'!J!#\":!##I]!&)]$$I]&%Z!*"
+ "#Z%\"%)U'$IQ%%*!!%YU$$9Q%$)Q##IY!#9Q!#IE\"$Z%##II!#YM#\"YY\"#)U\"%Y9%"
+ "#I9\"$)1'\"I=!%YA+!)I!#)=#\"Y9\"\"I9!\")9\"\"I5!#)%#$Y1*$)--\"I-$\"I)!#))&"
+ "#(]!$(Y!%I!$!(U&\"HU!\"8Y!\"H]'#(U#\"Y-\"#X]##XM&\"XE\"#(I!#(E$\"XI\"\"X1#"
+ "\"HA!\"8E!\"8=!#89$#(5#\"H-%\"85&\"X9#\"X1#\"X)##(5$!(%!!X)$$(!#\"WY#\"7Y!"
+ "\"WU##7I%\"WQ#!'U!$'](#'Y$#'Q+\"'A,\"7E$$'9*!G=!\"7=$!'9!!'%!!G-!!G)!"
+ "!&]!#7!%\"VQ&!G!#!W-(\"&]%#'-&\"'-#\"'-#!W1$!'5!\"'=#\"'E%\"7E$!G=!!GI%"
+ "\"GA%#WY'\"'A!#'M!\"GQ\"#GE&#WQ%\"8!!#W]$!8%\"\"']%\"8!!\"8-!\"8)&\"X)\"\"(%#"
+ "\"XA&#H-##H9&\"X5\"#(5!$H=!\"X-\"\"XQ\"$8E##XU!#(I$\"8I!#HY%\"HQ!#8Y$#(Q#"
+ "$HU'#(Y##I!&#9-!$)!%#I!\"#X]##))#$)%!\"I)!#))#\"I!!\"X]\"#I1\"\"I1!#Y5&"
+ "!Y5!!Y9$#)5&!)=!\"I=!#YA#$I=&\"II!#9E!%9M%#YE##I9\"\"9I##II\"%)U$#YQ#"
+ "$9Q$$IM\"'9U#%)]'$Y]##9U!$9]$\"*!($I]%#Z)\"$9Q%#Y]\"%*5#&*%(%*!##J%!"
+ "%)]!\"J)!#*%&\"*-%#Z-\"#*9\"$J5!#Z-\"$J9%#J1!#:9&#J=!#J5!#J1!#ZE\"$Z5\""
+ "$*1##J5!$J=(#Z9!!*5!%*9##J9!!Z9!$J9!$Z5&&*9#%J)\"$Z9\"#J5!#*5\"$:=$"
+ "%*='#Z=\"#JA!#:9#$:M$#*A\"%JA)$JA!#J=!#J5!$*=\"$:=##ZA\"$*9#\"Z9!!Z=!"
+ "$J1%$*9#&J9)$*9\"%:=!%J)&#ZE!#J9!\"Z%\"$ZA\"$Z5&#Z5\"#J1!#J1!#Z1\"#Z1%"
+ "!:-\"$J1\"#J-!#J%!#J)!#J)!#J%!!9Y\"#J)!#J%!$Z%&#J!!$I]\"$)U##)]#$9]!"
+ "$I]%$*!##YQ\"#)Y\"\"YY!#I]!$IQ&#9U!$)Q#$)U#&IM(#9I!#IQ\"$YI&#9Q!#IA\""
+ "#)A##YA\"#II%$I=#!Y-!$Y9'\")=%\")5\"\"I=!$9A!%(]%$Y1!$I-&\"I%!#9%!$I%'"
+ "#I!&\"8Y!\"I)!\"H]*!HY#\"X]\"#HM&#XQ'#(U##HM#!HY!#(A#\"8Q!!HE&#HE(!(=#"
+ "!H=#\"8=!#85%\"85!\"85!#H)%#81%\"X1#\"X!!\"8)!\"H%!#8!'\"8=!#7]'\"X%##GY#"
+ "\"7]!\"GQ,\"7Q$\"GI#\"GA\"!GE#!G=!!'A!#WA%!'=#\"'9\"\"G9$#7E#!W-\"!G%!#'=$"
+ "\"G)#\"6U$!F]#!'1#\"6U$\"&]#!G)!\"7-$!G%!#G1\"#75#!G=!#G9!!W5\"#'=$!G9#"
+ "#'E'\"GI##'A$!GQ!$GI#!GE!\"GQ\"#WE\"!'Y!!W]!#(%$\"GU\"\"H!\"%(%*\"8%!\"89$"
+ "\"X!#!(5!$(1&$(5%#X)'#XE&\"81!\"XA&#HA#\"XE\"#(A$$8E)!XE'#(M##(M!#HQ&"
+ "!(Q$!(M#\"HU!#(U#$8Y\"#(]#\"8]!$)!$$H]&#9%!#Y9&!Y9!#)-##)-##I9%\"Y1\""
+ "#95$!)9!\"I5!\"I9!!Y9!\"Y=\"$I-&#I=\"#YA\"%9E\"&II(%II-%9A($II%\"IM!\"IA!"
+ "#)Q##IY!$)Q##IY!#I]!%YM$$IM\"%)]('9Y#$*!&%9Y%#I]!%:%%#J-!#IY!'*%("
+ "!:%\"%J))&*!!#J)!\":-\"!Z%!#J%!\"J1!#J-!\"J%!#Z5\"#ZA\"$*%#!:1%$:1$\"J-!"
+ "#J9!$JE%&*1$#J5!#*5\"\"Z5!$*5#$J5!$:5#%:5%#*5\"$:9$%*9#%:1!%:E$&*A+"
+ "#J9!\"*9\"#Z=!$J-\"$:M$#J9!\"ZA!&:5!#J-!%:9$#*1\"%*9##J1!%:5%$J%\"\"ZA!"
+ "$*=#%Z5*\":9*#J-!#ZQ!\"J-!#J1!\"J1!$:)!&*1!#J5!#JI!\"J)!$J9!#J-!$:%!"
+ "%J-%$*)#\"I]!$*-#$Z)\"$*%##Z-\"\"I]$$*!#\"IY!!Z%$#9U!!IU#\"I]!$)Y#$)]#"
+ "%*%'$I]%#9U!#)U%%IQ#$)U##9E!$9Q($)]##9U!$)1$%YI($)E!%IE&#YA##9A!"
+ "$91%#9=$%)I%'99/$Y5'$I1)#95$\"I)!!)-!\"I-!\"Y)%\"I1$$))'\"8U!#XY!$I!'"
+ "$(Q(#Y%$#(Y!#(I$#XQ#\"HU!!HU&#8U$$XM+#8M$#(M#\"XE\"!(E!\"85!!(A!#HI&"
+ "\"8=!\"X=\"$8-)\"X9\"\"H1\"\"8-!%X-,\"8)$!H5&$X%&#8!##']$\"H!!!X!\"$(!(\"WA#"
+ "#7Q'$7Q&\"WQ#\"W=!\"GQ\"!GE##GI!#G9)\"7=!!G=!\"WA!\"'1#\"G1$\"W%&#7-(!G%%"
+ "\"&Q!!VU\"#&Y%!&Y!#7!$\"G!%\"V]#\"7%$#G1)$'-+\"G=%\"'1\"!GA!!79\"\"GA'\"W9#"
+ "#'A$\"7=$!GE!#G-'#7A#\"7M!#WQ'\"WU##GU&$8!!\"GY\"%G]'\"8)!\"X!#\"X!#\"'U\""
+ "\"8-!#H-&\"X1\"\"X1#%(1,#85%\"89!#89%\"X=#\"XI\"!(A!\"89!#(9!#HQ%#XI&\"8M!"
+ "#(Y##)!##XQ'\"HI!!8=\"$Y)$#)%#\"8Q##HY%$Y!%\"Y%\"%I-!\"I1!!Y!!#I)%\"9-#"
+ "\")9\"#)1##)5#!YA!#99!%Y9$$)E&$9=(%9=#$9A$\")E%%)E$#9E!#YE##9Q!#YE#"
+ "#9M!$Y='#9Q!#IY!$9Y'$YY&$9U$#IU\"$YU'$YM&!IU#\"I]!#YY\"$Z)&\"IY!$)]#"
+ "#YQ\"%:-)$*!'!*%!!YY!$*)&\"J1!$J-!$:-!#J-!%*!!#*-\"$*-#!)]!!*)!#Z-\""
+ "$J9!#J!!#Z5\"#J1!#J1!&Z1'\"J1!#Z5\"$Z1&\"J1!%Z1*\"*=\"$*=#$J5!#*5\"$J5!"
+ "$:1!#J-$#Z5!$J5!\"Z5!#Z1\"#*-\"#J=!#J1!%*9&&*5($J5!$:5$#J5(#J)!&:1%"
+ "#Z5!%Z)#%*9#$J5%$:5#$Z=%$:%$#Z)\"#*)&#*9\"#*-\"#J-!$:)$#Z)\"#J9!$)]#"
+ "&*%!#Z%\"$:%!\"J%!$II&\"YY!$Z!&&)],\"Z5!$*!#$Y]##J-!#J)!$9Y$%IU#%I])"
+ "#J%!$Y]&$)E!#9M!$YM&#9M!#YM#!)I!$IM%#YE\"#IE\"#9E!%9A\"#I=!$I5#\"Y9\""
+ "#I=!%YM+%)9%\"Y5\"#)9&\"9-)#95!#Y1##I)%$Y)!!)-!$9!\"#8]!#H]\"\"9!$!Y!!"
+ "#9!!!(I!#(U#\"XU(#(Q#!HI#!8A\"\"HE$!(I!#HE&\"8=!\"HA!$8A)\"8=!\"X=#\"X9%"
+ "!(9)\"H1\"%H5&$81!$8%)#X)'#8)\"#']$$H%*\"X)#\"7]!#G]##'Y$#H)!\"WY##GY&"
+ "#GQ$\"7M!!7I'\"GI#!'E*!WA+$'A#!W5\"\"'I!\"G=%!75\"\"W=#\"'=\"!W-$!G-%\"7%$"
+ "\"FU%!FM!!6Y\"\"&Y#!VU&!'!!!F]!\"V](\"G)\"#7)#!G5%\"')%!'1!!W5$!'9##W=#"
+ "\"'=\"!G5!\"7A!#WE%\"WM#\"GE#\"7M!\"WM#\"GM\"\"WQ!!GY#\"WY#\"81!$8!!\"GU\"!X%\""
+ "#(%$#()!\"81!$(9'\"X-&\"H1\"#89$\"H5!%HM(#H=\"#8=%$H9*#8A$\"XE\"$8I&$(U'"
+ "#XM!#(=#\"HY!#(]##H]\"$(U$\"8Y##)!#\"9!##(]#&)!#\"(U\"#Y%$#))##91$!Y)$"
+ "#9)!\"I)!#95$\"Y5\"!)5!#Y9&$)1'%9A\"#)5#$YI&\")A%$)A##YI\"#9M!#)E##9=!"
+ "$)Y##YA#\"9]##YM\"$)Q$#YA#$*!#$YY#&:!,$9U$&)M%$9Q(#YU\"$Z%#$9U!\"Y]\""
+ "#Z%%\":)#$)Q'!Z%!%*%'&Z!/#*%\"%:%($*%##YY\"#I]!%Z1*$:-#&*1(\"Z5!%J-%"
+ "%:)!$:1!#J5!$*)##J!!&*-+$J5%'*-!#J!!$J9%#*1\"#J1!!Z9!$:-!%J1)\"I]!"
+ "#*1\"$:%!#J5!\"*)\"':-&#Z1\"#Z1%%:-!#J5!#Z1\"#J-!#J-!%J1%%:5$$J-%$Z5&"
+ "$:=#$:-!$JA!$Z1\"$J)%$J-\"$:1#$J)%#Z)%%:1!$J%\"!Z)!$:)$#I]!#J!'$)U#"
+ "$J1%%J!&#:!#$:!!%J%*$)Q$%J!)#Y]\"&9U\"$*%##9M&#)M#%:!$#9Q!#9I##9U!"
+ "$)E#&9I'#9Q'#YE#&YI%\"9M#$IU\"%)I$!YI!$9E%\"Y-\"$)I$%IA'\"Y1\"%))\"\"I9!"
+ "#9)!$)Q'\"Y5%#95!!I=#\")-%$Y9!#))#\"I1!#X]##Y%##I!\"%9!'#8Y$\"Y5\"#8Y$"
+ "#8]$!HU!#HU%#(Q#$HQ##XU##XM!\"8I!#8M$#XA&$(A\"#(Q#\"X5\"\"HE)\"X9#\"HI!"
+ "%(='$(-(\"H%\"\"H-!\"X-&#(!$\"X1\"#H)$\"8!!\"X!#\"WU#$'Y#!H%#\"7U&$'Q&#'E$"
+ "#GM$\"'I!!GI#\"'I!\"W9%\"'A#!75\"#'9$#G9$#W5(!G1!!G1!!G-!\"G%\"#F])\"G1%"
+ "\"6Y$!&I!!&Q#\"&Y#!6U$\"6M\"$&U\"\"7)$\"7)$#G='!W%\"\"W-&\"'1\"!G1!\"'A#\"75#"
+ "\"75$\"'-#\"'A##7A#\"WE#!GI#!WM\"\"7U(\"WY#\"GI\"%8!(\"W]##GY$#H!!\"7]!\"H!\""
+ "\"X9(\"G]\"\"H)\"#H)##(-!\"81!\"8)!#89%\"X9#%89'#8A$#(=$\"(E\"$8A)\"8U!#(M!"
+ "$8I#\"HI$\"XY\"#(Y##(Q!\"8Q!\"HI!#8Y!\"I)!#8]$#8]$\"I!!#9!\"$Y%($I1&#95!"
+ "#9)$$I1)$Y!!\"9)##Y1&\")1(\"I9!\")E\"#)9##I1\"$)9!$)9'%I9'#YA\"#99!#9A!"
+ "$9E%$YE'$)I$&)I%#YM##)U\"$9M$!)E!!IM##9Q!!YY!$9U$$Z)##)Q#$YY'%J%&"
+ "!YE!%)U!\"IY#$IQ\"#IY$%IY*$J1)$:1##J%!&Z-$%J!&%J%*#J%!$J%!#J!!\"J%!"
+ "#J)$#J%!#Y]\"#J-!&:)\"#:)##J)!%*)'$J9%%:-!$Z-&$*5\"\"Z%!\"*-\"\"J1!%Z5&"
+ "%Z-&\"J)!#*%#%:5%#J)!$:-##J1!$*-#'Z)(\"Z5!#Z%\"\"J-!#Z1\"#Z5\"#J-!#J5!"
+ "%J!##I]!#J1$$:)$%Z)##J)!%*-#$*1\"!:A\"$9]$$:9$$:%$$)Y##IU!$*)##J!!"
+ "#)U#&*%+$Y]'#Z%&%9U(\"9Y&#9Q!$YU#&9U-$)I!\")Y($IU%$)M$&IQ$#9M!#)=#"
+ "$)Q$!)1!#95!$)I#\"9I#$YA&$IE\"#9E!#9Q!#YA#%9=%#Y9##)9##I1\"$)1$\"I=!"
+ "#)5##91!#Y1#\"I-!#91$#Y)#$9%&\"I-!$9%#\"I5$#9!!\"Y!\"\"8]#\"H]!$(Y(\"(U%"
+ "!HM!$(I%#(U##XU#$(U(#(E$\"HI$\"89!\"8Q!\"(A\"\"XA#\"XA#\"XA#\"H1\"\"X1##H9&"
+ "\"(1#!H)##81\"\"X%##X1'\"G]\"\"']%\"X%!$7]!\"G]!\"X)\"#'Y$\"7Q!\"GE\"$'U#\"'M#"
+ "\"'E!#WI'\"'E!\"'Q#!W=\"!G=!!'=#!W=\"!W1!\"'5\"$'1&\"G-!#W)%#G))\"F]#\"&]'"
+ "\"6M&\"6M\"\"6Y&!VU\"\"G!%!FM!\"W!&\"6]&$7)#\"'%#!'5!!W)+!7)\"\"'=#!W1$!75$"
+ "!G9!\"'9\"#'A%#GI)!7Q\"!'I!#'U$\"'Q\"\"'I!\"GI\"$'I%$'U!#7Q\"$'Y(#7]\"\"GY\""
+ "$8!!#(!$\"8%!$X!##'Y$\"H!\"!(1!\"81!\"X5\"#X9!$H9'#H9&\"8=!#XA##XE*\"8E!"
+ "\"8I!#HI&#XE##HM%\"8M!\"XI\"\"HU!#XY#\"8U!#9!\"$H])#X]&\"8]!#9%!!XY!#I!#"
+ "#9%!$))!!Y)'$Y-$#95!\"9-#\"I1!#Y!&!)=$#I=%\"YI%!I5&$Y=*\"YE\"%91&#9E!"
+ "#YM#$IA&%9=#%YI$$)Q#!YA!%IE#\"YQ%$IE%$YY##)M#!YU!#YM#$IU%\"IU!%9M\""
+ "\")U(%IY#$9Q%&:!&$9Y!$IY&#IY!!Z)!$:%!%*!#\")]%\"J!!&9U##J!!$I]%!Z%!"
+ "$*%#%:%!%*%'\"9Y##Z%%$)U##J)!$*1\"#J)!#Y]\"%J!\"#J)!%*-$\"Z)\"%:))#J)!"
+ "#J!!&:)!#*)\"$:5##J%!!J)#\"*%\"#J1!\"J%!$:!$$:1##J)!$J!\"%Z5*&:-\"%*%'"
+ "!*%!#J%!$*%'&J%##Z!\"%*1#$*)##J!!#J!!#J!!$:%!$*!##J!!&9Y&$YY'#J%!"
+ "\"I]!!)Y$$)I$%9U%$)Y#\"YY\"$YQ#\"IU!%)U!$)I&#9Q!\"9Q##YM#$)Q##YM&#9M$"
+ "$YI$$9I$\"IA!%YE+#)A#$9=%&)E,#)M#$)=$#YA&!YE!\"I5!\"I=!\"I1$\"Y-\"\"I1!"
+ "#)!##I)%#)-#!I-#$9))!95\"%)-&$XQ(\"Y!##Y!'$H]##8]$!(M!$XQ$$8U##8E%"
+ "!(Y!#8Y$#(I#\"XQ\"\"8Q!#(I!\"XE#%8I!\"H=!#8A%#(9!\"X5##(-$#(9##(=!#(1$"
+ "#X1'%8E!\"8!!#()$#H%##H%&\"X)\"\"8!!#()!!X!$\"WU#$'Q!\"GI#\"WY#$7M)\"7M!"
+ "\"7A#\"'E!!79\"#'A'#W9'$79)!G5##'5\"\"'1#!75\"\"'-\"\"75$\"V]&\"'1\"\"G%%!W-\""
+ "#6I&!FU!!&E!!G!!!VU\"!VY\"!VY\"!FY#!G1!!G!!!W%$#7)'!VU\"\"G)%$'-$#71("
+ "\"GA'!G=#!GI!\"7A!#WY$!GA!$WE%!GI##'='\"7M!!'Q#\"7Q!\"7U!#WU%\"WY#\"G]\""
+ "#8%\"\"X%#\"7Y!#7U%#(1$!H)!\"H-\"$H-'\"H1!#(5!!H!!\"X5\"\"85!#(=#!89%!XA!"
+ "\"X9#\"HA$#(I$#HI%#(M#\"XM\"!XE)#8U$\"8Y!#(Y#\"XU\"#(U#$)%'#8Y'\"Y!#%(]\""
+ "$Y)'$Y%'#I)%#I)&#Y)&\"I-!$9=(%99&\"95#\"Y1\"\"I5!#)-#\"Y5\"#I9%\"Y9\"#)9#"
+ "!Y=!$)5$$)A$#IA\"%YQ*&)M,%IE##YI\"#9A!$YM#$YM'$YM'$9Y!#YU&\"IM!\"YY!"
+ "$)U#%II*#9Y'%)I$!)U$!Z!!$Z!\"\"IY!!Y]!!:!\"#9]'$9U$$Z-\"\"I]!$9Y($9]("
+ "':)1$Z!#$IY&#*!#!Y]!$J!\"$9]$$J%\"%9]!&YU!$Z!&$:%!$)]#%J%&#I]$$*%#"
+ "\":!\"#J%!!*%!$:%!%:!%$:%!&J).$:%$#Z%\"%YY+#J%$\":)##YQ\"#J%!#9U!#:%#"
+ "#J!!$Z!'#Z!\"%:%!$Y]'%:%!#Z!\"!Y]!$)]#&I]+$J-%$I]&#I]!$Z)##IU\"#9Q!"
+ "#YY\"$)]#$)U##9U!#IY!#9U!$YU#!YQ!#YI%%YU!%)Q$#YQ#\"IM!$YQ*$)E!$YI$"
+ "\"I=$%I9*#95!$Y1$#I=\"\"IA$!)=!\"95&!Y1!#I9%\"9=#\")5%#)9##95$%I1!#Y%&"
+ "!)-$#9%!#Y)&\"I5$#I%#!XY!#8U!\"(U\"$(Q'\"X]%\"8]!#8M$$I!)\"HQ!#(U#!XM$"
+ "\"XE\"#(M##(M&#(I#!(=!\"HQ!#HA%#8I$#(=#$(='$(9\"\"89#!H9#$85&$8=!!H-#"
+ "#X)'\"8-#$(9(#H%&\"8)!\"X!#\"G]%#WY%\"GY\"!GQ!\"7Y##'Y!\"GQ\"\"WM#\"WI!\"GI#"
+ "\"WA&!W5!\"'E#!W1!\"79!$W='#W5&\"G1$\"G)\"\"&Y#\"7)$!W%&#6U$\"G!#\"'%#\"'!*"
+ "!FM%\"6I\"!VM\"!FQ%!6U\"!&U#\"6Y$\"G)*!F]!!7%\"!G1#\"W%&!G!!\"G-#\"'5!!7%\""
+ "\"71\"\"G=%\"79#\"'9\"!'=##'='!GA!\"GM\"!'I#!WI!!'Q!\"GM%\"WQ#\"WM#!GI!\"7]!"
+ "\"G]$#'Y$$W])\"X-\"#(-$#X)'#']$\"8-!!(-!!85\"\"(1%\"85!$X1#\"8=!#81\"\"X5#"
+ "#(9#!XA!\"HE!$H=)\"(Y\"\"(5\"#8M%\"8M!#(U#$(U%#Y!$#(U#!HY#\"X]\"#8]$\"X]\""
+ "\"Y!#$XU'$95%#9!%\"Y!##(]&$9!##)9##I%##91!\"Y1\"#95$\"I5!#Y)#\")5%\"IA!"
+ "\"IA!$9M(#YU&%I=+#IA%$9=%#I=!#YE##9E!\"9A#$9]$#YE\"\"YQ(#Y=##9E!#9U!"
+ "(:%'#YM#&J--$Y]##9Q!%)E$#YU\"#9M!$YI&#IY!$9]'#)Y#&9Y&\"IQ!$9U!$Y]'"
+ "#I]!$*!*%I]&#)]#&I]##I]!!IQ##J%!#J!!#Y]\"$*1##YM#!J!'$9M!$:%$$J!%"
+ "$:5$\"IU!#J!!$*!#\"Z-%$:%!#*!##J!!$)U#$Z!&$Z%&#Z%&\"IQ!#I]!$Z!'$Z)#"
+ "#J5!#Y]%$IU\"$*!##IY!#J-!%)Y'%9M\"&:%&#I]!\"9M#$9Y!$YY&#IY!$9U!#Z!\""
+ "$)U#%YU##YQ##YE#$)Q$$9M%#IM$#9M!#9=!$)M$\"IE!!YM!#9I!$)E!$YA!#99!"
+ "!IA##YM#$)E!\"9=#\"I=!\"Y=\"\"YE\"\"Y)\"!Y1!$)5!$91%\"91#%)1(#Y-&\"I-!#I5%"
+ "\"8]!\"Y)\"\"Y%\"#I%\"%X]%$)%%#H]\"#HM&$(Y$\"8Q&#8Y$\"8U!\"8U#!HE#\"8Q!#8M%"
+ "#(M#!HU!#XI$$(I$#8E$\"XA\"\"8=!\"(=%$81$\"X9#!H1!\"H5\"#(9##(1$\"8-$\"81!"
+ "#H1#\"H%\"\"G]\"#8%%#H-&#(!$\"W]#!'U!\"G]!\"'E!$WM$$'U&#W=(\"GU\"#GQ!\"WE#"
+ "\"7=$!7A'!'9!!G-!!7-'!75$!W1!!')!\"'-#!W1\"#G%%#G!\"\"G%)!G!!\"FY%\"&]!"
+ "!&Q!!&Y#!VM$#6M%!FQ#\"6]#!FU##FY'!G!#!FQ#$'))!'%!!'!#!G%!!75$!G1!"
+ "\"W1$!W1!!'-!#GM)#'=%!GE!!GA!!'I#!GE!!GE%\"'I!#'E\"#7Q%%GQ'\"'U\"$GU+"
+ "!GY!\"'I\"\"8!!\"X!!!'U!\"8%##(!'#()$$()#$(-#\"X9\"\"(1\"\"X5\"\"X5#\"8A!\"85!"
+ "\"89!$81)\"8I!#8E%$HE'#(A#$8E##(M#$HM&$8Q#\"XU\"!(Y&\"8Y!#8U$\"8Q#\"I!\""
+ "$H])#)!##8]$$)%$#9%!#I%\"%I)(!Y1!!Y)!#Y)&!)5!\"I)!#Y-#\"I1!\"9=##Y5&"
+ "#95!#))##YE#\"9=##Y=#&)-##YQ\"$)1$!Y='#9=!#YE##YA#$YM'#9I!#9A!%)E!"
+ "\"IA!#IM!%)M(#YM#$IQ%$)Y##)Q#$IY%$9M$#J)!$)U#$IQ\"$)U##9Q##IY!%9I&"
+ "\"IY#$)Y#$9Y$$)Y#%YY'&)]!$Y]*$YY#!Z!!#9Y#$9]$#I]!#I]!#Z!&#Y]\"&:%&"
+ "$*!#$)U#$:)!\"Z)!#)]##9U!#YQ%\"YY!%9]%#I]!%Z%#$9]$%Y]#%)M$#J)!#J)!"
+ "&Y]!#9]$#IY!\"IY!$YY#$I]%%*%$%IU#%IQ#!Y]!!)U!$9U!$IQ%$9U$#YY\"&YY!"
+ "$YQ'#II\"#9I!#9M!$)I$&II!#IQ!$II#$)I$\"IE!#Y=#$IA##IA!$)E##Y-#(9Q+"
+ "%95)$I5&\"95#%I5.#I9%#)=#\"I!!\"I5'\"I1!\")-\"!)-!#91!#I!&\"I1!$9)(#)9#"
+ "\"I-!$9%#$I%&$(Y'\"Y%&\"XY\"\"H]!\"HY!\"H]!#HU%&HU)!HQ!#(I##(Q#!HI)\"8Q!"
+ "#(I&$8I##(A#\"H9!#(E#\"8A!!H%!#81%#X='$(%%\"85!\"X1##X1$$(-%#H5)!H1!"
+ "\"7Y!\"81!\"WY!\"H!$#8-\"#8!%$'U!!7I\"\"G]$\"7M!#'Y$#'A!#GM&\"WM#\"'9%\"WE%"
+ "\"'M\"!GA#\"W9##G5&\"'E#!GA!\"G1'\"75!!'%!#G)$!7-\"\"'!#!&]#\"&]!!6]\"#FY'"
+ "!FM#!6Y$!6M\"!G)!!&Q!!7%&!FU!\"&U#\"VY&\"&]#!FY#\"6]$\"')%!G!!\"W)&#75#"
+ "\"7%$\"7-&\"'1#!W=(\"WI!!G1!!GA!\"GA%#'=\"\"'=#\"'E!\"7A!\"WY!\"WM#\"X%##'U+"
+ "!GU%\"WY#\"WU#\"G]\"%H!,#8-\"#H)!$8!!$G]%%8)%%H-$#(-$\"X5\"\"X5##(-$#X5!"
+ "$(9\"$(=\"\"89!!H5##XE&\"8A!$XE+%(U&\"XM%\"8I#\"XM\"%)!,!HM##HM\"#(Y#$Y%'"
+ "#9)$#(5$#(U#!8Y\"$(Y$%8Y#&Y)$#I%#\"Y1(\"Y)\"#I)\"#)9#\"Y5\"$Y9!#I1%\"Y)\""
+ "#)5#\"I1$%99##)9##9=$#9-!\"9=#!Y=!#9=!\"9A#$)A*$IA##Y5#\"IQ!!YI!#YE\""
+ "$9I!$IA&$9Y!%9M\"$91%#9M!#YE\"#9U!#9Y#$IQ&#IQ\"#)U#&)Q%$YQ#%)]('YU&"
+ "\"IY!%)U'$J)%%IU)#IE%$9Y$$9Y$$)Y#%IY##9Q!#9Q!\"9Y##IY!$YY##YY)$YY&"
+ "$)Y#%9U)\"I]##9I!$9]!&)Y%#)Y#%)Q'#)Y&$I](#YU\"#IY!&IY$$)]##J!!#)Y#"
+ "$)U#(9]+&9U&$IY\"#9U!!)U!$YU&\"YU!&9U\"$9Q%#9I!$:%$$9Y$%9M%!YI!%IQ*"
+ "%II#$IQ\"#IM%')Q*&)Q($)I#!YQ$&I=!$)9$#YI\"#99!%9=%$)A$\"IA!$Y=$!)='"
+ "\"I9!#)9#\"99##)=##9)!\"I5!%I1(\"I-!#I)&\"Y1%#9%$#)-#\"9)#\"Y%#\"(]\"#I%#"
+ "%(])$XQ(#(Y!#9!$\"Y1\"\"Y!##XY##(Y#!HU!$Y%($8Q)$HY##(A!#(M#\"HA\"\"8M&"
+ "$(9(#HM&!HA&#XA'\"HA!#(=!\"(5#$(1#\"H5$\"85!\"X9%\"X-#\"X%#!X!\"\"X!#$X%+"
+ "\"H%!!(!!#']&\"W]!$7Y'#WY!\"'U\"\"GM\"#7Q%$WM&#'A$#7I#\"7E#\"'E!!WA$!W9\""
+ "!G=!\"79)\"79$\"75$!71\"\"'%#\"G!!\"W)&!V]\"\"G)%!G1!!7!\"\"FM!!&U#!FU%!VU\""
+ "\"FM%\"FM'!6M&\"&I%!FM#\"VU&!FQ)\"FU%!FU#\"6U$\"&Q!\"'!\"#&]'!G!%\"'%\"#79!"
+ "!G)!!G-%#G1)!G)!#79'\"71$#79%\"'I#\"WE!#W5'\"WE&\"'E\"#'Q$\"7M!\"GM'\"7Q$"
+ "#'U$$8))!GI#\"WM#\"GY\"\"H%!!GY!$H!(%(5'\"8%!\"H)\"\"(%'#8-%$81&#H1##H5&"
+ "$(1#\"H9'$H9!#8=%\"X=%#H9&$H1'#(I!\"(I\"#(I!#XY#\"8M##HQ%#8U$\"8U!#(U#"
+ "#(I#\"HY$\"HQ!\"HY!#(]!\"I!\"\"Y%&\"8U!&)5&#9-!$I%'$Y%$#))##)1#\"I1!$)5!"
+ "\"I1!#)5##)1##)A#\"Y5\"\"I9$$I-'&)90#)-##)1##9I#!YA!\"Y1\"#IE!$)9$\"9A#"
+ "#Y=#&)I,#9U!$)E!\"IM$\"II!%9A)#)A#$)M$&9I'$)E!#YM\"%)M$%IQ#$IU%#YQ#"
+ "#YQ\"!)A!$)A$$9Q!\"Z%!%)U($)U#\"IU!#IY!$Y]#$)]##)M##9I!\")U\"$9U$#YM#"
+ "%)U$%)Y'#)M#\")U\"$Y]'$)U#%IU'$9U$$I])%9U\"#9M!$9Q!$)]##)Q#%YU#$)U#"
+ "$*!&\"YU\"$9Y$$9Q%$IM&#YQ\"#IU!$YQ#$YM&$)M##9A!$9Q!%9Q%&)M)#9A!%)I!"
+ "$9Y!&IM$#)M#$9M!$9I$#)M#$)E$#91!#YA\"#IA!\"Y-\"\"9=##)5#\")5\"#)5#\"I9!"
+ "#)E#%9=-#I9\"#I=%#)I#\"Y9\"$I)*#I-%#Y1##Y-&\"Y-\"$Y!.#HY\"#91!$X]!#I!\""
+ "#9!!#8Q$#(]#$8]%#8]!$8M#\"8U&!)!$!HI!#HQ%#(M#\"XI\"!HA!\"XE#\"XE#$8E\""
+ "#8A$%8A$\"81!\"8=!#H9&#X9$\"(5\"#85%\"(5#\"(1\"\"X-#\"X1%$X)##(%$\"8!$\"G]$"
+ "\"(!#\"7]!\"WY#\"W]##(!$!GI%$GQ*\"'I\"#GM&$7A%#WE\"\"G=#\"7M)\"'A#!'A#\"'=#"
+ "\"G1-\"W=&!G=%\"'1\"!W1\"!')#\"G1$\"G%!\"7%!!FY#!W!\"#&]%!V]\"\"F]%\"&U#!'!!"
+ "!6]\"#&M$!6Y\"!6I\"\"6M$\"&M#\"&M#\"6U$\"F]+!FY!!FY&#'!'!F]!#&U%\"'%#!'1#"
+ "!G)'\"G)$\"'1#\"G)#\"'9#\"'1#!G=!!79\"!G1#\"'E#\"'A#\"7I##7A'\"WI#$'I#!'I!"
+ "$'Q!!G=!#X%!\"GQ\"#WQ\"\"W]##'Y$!']$\"'Y%#X%$\"X)#\"8)&#X)'$(!(!(%$\"X%\""
+ "\"XE\"\"X5##(5#\"X9#\"X9##HA#\"XA#\"X5\"\"XE#\"(M%\"XE\"$HM'\"XM\"!HY!\"8M##HU\""
+ "#(M!#(M#!HU!#(]##I%\"\"(](\"9!##H]%#Y%$$)!$#I%#$)-!$9)\"#)%##))#\"95&"
+ "$9)(\"I9!\"Y9\"\"IM'\"I1!\"I5!\"I5!#)5##)1#\"I9!#Y9&\"I-!\"I=!#9A$\")=\"$IQ&"
+ "#YA##9I$$)9!$9E%#YI#$9=%#9M!$)E#$YM#$9A%&)M\"$9M$#)M#$)U#!II&$YQ#"
+ "$YQ'$YU'#99!$9M!#IU!$)U##)M#$9Q$#9Q$%IY'#9M!$)E##9Q!#)Q#$)]#%9M)"
+ "'*!&!YE!#Y]\"%)E(#9Q!$9Q!&YQ/%YQ'$9Q$%9U)#9U!%*!!$IQ\"$YU&$YQ#$9E!"
+ "$YE'!IY##IY!$9A%$YM&$9I(#9M!$I])$)I#&IM+#Y9#$YE&#9I!$II)$II%#9A!"
+ "\"YE%$9E%$9E(%9E)%YE$&)E,$9A'#9A!%)=(#Y=#%IM##)A#\"IE!'95(#I=%#Y=&"
+ "\"I5!$)5$!Y9$#91$#)1#%)1+!Y1$\"Y-\"#9%$\"I)$&(]$!9%($9%##I%#$I%'#(]!"
+ "!XM$#X]&\"XQ\"&8M\"!(U&#8U'$HU)#(M##(]#%(M&!XM'\"HA!#(M#!(Q!\"XQ\"\"8A!"
+ "\"HA$\"XE##89%#(5!#()$#(A#!H-%#(1#\"81!$(-#!X)!\"()#\"X%#!H%#$X!$!WM\""
+ "#8!$#8!'#'Y$#7Y#!'M#\"WI!#']$\"WM##'M$\"'E\"#7M#!'I&\"GE$\"G=%\"'=#\"G9$"
+ "\"W5##7!#\"'1#\"79\"!'-!!G%#\"7!$!G1!\"W1&\"&]\"!VU\"!7!\"!FU#\"&]#!FU!\"&Y#"
+ "\"FM'!FM#!6U'!FM#!FU#!FQ#\"FQ%\"VM#!&Q#!FU#\"6E$\"6U!!'%!\"')#\"&]\"#')\""
+ "#'%'\"W9%\"G)%!7-\"$7-(\"'1\"\"75#!W1$\"G='!G5#\"7Q!!GE!#7E(\"GE\"!GI!#GI&"
+ "!'Q&#GM$#'Q$$']%\"7Q!#7U#\"8!!#'Y$!H!#$(!+#()!#W]%%(!(#()&\"H)\"!H-#"
+ "\"X-\"\"X1\"\"H5%\"XE#\"X9##H-%\"X=\"#(E$#8M$#H1##8I$#H9\"\"XI\"\"XY\"#HU%#HM#"
+ "#XQ!$HU&\"XQ\"#Y!'\"HU!\"I5!#Y-#$)!'\"XY\"#9%$\"Y!#%Y!)%(](#8]$\"I)!\"I-!"
+ "$)-'#I!%#99!\"Y9\"#9-$#91!\"I1!\"I1!\"I5!%)9!\"I)!$YA!\"I=!$I9&#I=!#I=!"
+ "#9I$%)-+&95'#95!#9A!$9A%#9A!$II##9E!&)E,&YI)#Y9#$YE'$9I$$YQ##YM#"
+ "&)Y!$YI#$9Y$%)M!!II&$IM%$)U#%9U)$)U#%IQ&#9M#$:!!#)M#\"IM!#)I#!YM!"
+ "$)U##IQ\"'IE)%IU&#9I!$9Q$#)U##YY\"$II#%IM##)M\"$9M$&IM!#9M##IM\"#IM!"
+ "#9I!#YM##9U#%)M($YI'%YI$#YE%$)M$#YI##)I##9M!&)E%#9A!$II##Y=\"#IY!"
+ "$II##9I!%YE!%)E!\"Y9%$)5!$9=(\"Y1%\"Y9%\"9=#$)9!\"I9$\"95#\"I9!!)!!#99$"
+ "#(]##I9%\"9-#$Y!!!Y%!$9-\"$I-#\"Y-\"$8]%$Y!!#9!!#X]#$8Y\"#(U!$Y!$!HQ!"
+ "$HY*\"XY\"$8U\"%HU($XQ$#HQ)#(U##(I!#8A$!HI!\"XI\"\"XQ\"%(M\"#(M##HE&%89!"
+ "\"8A#$(9%\"X1##X5$#X1&#(1$!H=#\"X-##(-!!X9$\"8)!\"X%#\"8%!#H!!\"X%#\"H!!"
+ "\"GY\"\"WY##7M%!GE!#'M$\"X!#\"G=)\"'=\"\"GE\"!GE!\"7E##W5%$'E##'A)#G1)!G9!"
+ "#G9(\"W9#!W1$#W-&!G-!!VY\"\"'%#\"W1!\"W!$!FY!!F]!\"'!)\"FY##&U%\"6Q&#F9'"
+ "";
diff --git a/hacks/glx/boxed.man b/hacks/glx/boxed.man
new file mode 100644
index 0000000..4233446
--- /dev/null
+++ b/hacks/glx/boxed.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+boxed - draws a box full of 3D bouncing balls that explode.
+.SH SYNOPSIS
+.B boxed
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a box full of 3D bouncing balls that explode.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Sander van Grieken. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Sander van Grieken.
diff --git a/hacks/glx/bubble3d.c b/hacks/glx/bubble3d.c
new file mode 100644
index 0000000..9cd2afc
--- /dev/null
+++ b/hacks/glx/bubble3d.c
@@ -0,0 +1,281 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* bubble3d.c - 3D bubbles */
+
+#if 0
+static const char sccsid[] = "@(#)bubble3d.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 16-Jun-98: Written.
+ *
+ * bubble.c: This code is responsible for creating and managing
+ * bubbles over their lifetime.
+ * The bubbles may be drawn inside out.
+ */
+
+#include "bubble3d.h"
+
+typedef struct bubble {
+ GLfloat *contributions; /* List of contributions from each
+ * nudge to each vertex. This list has
+ * length nr_vertices * nr_nudge_axes.
+ */
+ GLfloat x, y, z; /* (x,y,z) location of the bubble. */
+ GLfloat scale; /* Scaling factor applied to bubble. */
+ GLfloat y_incr, scale_incr; /* Change in y and scale each frame. */
+ GLfloat rotx, roty, rotz; /* Current rotation. */
+ GLfloat rotx_incr, roty_incr, rotz_incr; /* Amount by which we increase
+ * rotation each step.
+ */
+ GLfloat *nudge_angle; /* Current angle (radians) of each
+ * nudge. This list has length nr_nudge_axes.
+ */
+ GLfloat *nudge_angle_incr; /* Amount by which we increase each nudge
+ * angle in each frame.
+ */
+ GLfloat color[4];
+} bubble;
+
+/* Should be taken care of already... but just in case */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+static inline void
+normalize(GLfloat v[3])
+{
+ GLfloat d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] +
+ v[2] * v[2]));
+
+ if (d != 0) {
+ v[0] /= d;
+ v[1] /= d;
+ v[2] /= d;
+ } else {
+ v[0] = v[1] = v[2] = 0;
+ }
+}
+
+static inline GLfloat
+dotprod(GLfloat * v1, GLfloat * v2)
+{
+ return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
+}
+
+static inline GLfloat
+max(GLfloat a, GLfloat b)
+{
+ return a > b ? a : b;
+}
+
+/* Create a new bubble. */
+void *
+glb_bubble_new(glb_data *d, GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
+ GLfloat y_incr, GLfloat scale_incr)
+{
+ int i, j;
+
+ /* GLfloat axes [glb_config.nr_nudge_axes][3]; */
+ GLfloat axes[5][3]; /* HARD CODED for SunCC */
+ int nr_vertices;
+ glb_vertex *vertices = glb_sphere_get_vertices(d, &nr_vertices);
+
+ bubble *b = (bubble *) malloc(sizeof *b);
+
+ if (b == 0)
+ return 0;
+
+ if (glb_config.bubble_colour[0] == -1.0) {
+ b->color[0] = ((float) (NRAND(100)) / 100.0);
+ b->color[1] = ((float) (NRAND(100)) / 100.0);
+ b->color[2] = ((float) (NRAND(100)) / 100.0);
+ } else {
+ b->color[0] = glb_config.bubble_colour[0];
+ b->color[1] = glb_config.bubble_colour[1];
+ b->color[2] = glb_config.bubble_colour[2];
+ }
+ b->color[3] = glb_config.bubble_colour[3];
+
+
+ b->contributions = (GLfloat *) malloc(sizeof (GLfloat) * nr_vertices *
+ glb_config.nr_nudge_axes);
+ if (b->contributions == 0) {
+ (void) free((void *) b);
+ return 0;
+ }
+ b->nudge_angle = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
+ if (b->nudge_angle == 0) {
+ (void) free((void *) b->contributions);
+ (void) free((void *) b);
+ return 0;
+ }
+ b->nudge_angle_incr = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
+ if (b->nudge_angle_incr == 0) {
+ (void) free((void *) b->nudge_angle);
+ (void) free((void *) b->contributions);
+ (void) free((void *) b);
+ return 0;
+ }
+ /* Initialize primitive elements. */
+ b->x = x;
+ b->y = y;
+ b->z = z;
+ b->scale = scale;
+ b->y_incr = y_incr;
+ b->scale_incr = scale_incr;
+ b->rotx = b->roty = b->rotz = 0;
+ b->rotx_incr = glb_drand() * glb_config.rotation_factor * 2
+ - glb_config.rotation_factor;
+ b->roty_incr = glb_drand() * glb_config.rotation_factor * 2
+ - glb_config.rotation_factor;
+ b->rotz_incr = glb_drand() * glb_config.rotation_factor * 2
+ - glb_config.rotation_factor;
+
+ /* Initialize the nudge angle arrays. */
+ for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
+ b->nudge_angle[i] = 0;
+ b->nudge_angle_incr[i] = glb_drand() * glb_config.nudge_angle_factor;
+ }
+
+ /* Choose some random nudge axes. */
+ for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
+ axes[i][0] = glb_drand() * 2 - 1;
+ axes[i][1] = glb_drand() * 2 - 1;
+ axes[i][2] = glb_drand() * 2 - 1;
+ normalize(axes[i]);
+ }
+
+ /* Calculate the contribution that each nudge axis has on each vertex. */
+ for (i = 0; i < nr_vertices; ++i)
+ for (j = 0; j < glb_config.nr_nudge_axes; ++j)
+ b->contributions[i * glb_config.nr_nudge_axes + j]
+ = max(0, dotprod(vertices[i], axes[j]));
+
+ return (void *) b;
+}
+
+/* Delete a bubble and free up all memory. */
+void
+glb_bubble_delete(void *bb)
+{
+ bubble *b = (bubble *) bb;
+
+ if (b != NULL) {
+ if (b->nudge_angle_incr) {
+ (void) free((void *) b->nudge_angle_incr);
+ b->nudge_angle_incr = NULL;
+ }
+ if (b->nudge_angle) {
+ (void) free((void *) b->nudge_angle);
+ b->nudge_angle = NULL;
+ }
+ if (b->contributions) {
+ (void) free((void *) b->contributions);
+ b->contributions = NULL;
+ }
+ (void) free((void *) b);
+ b = NULL;
+ }
+}
+
+/* Rotate and wobble a bubble by a single step. */
+void
+glb_bubble_step(void *bb)
+{
+ int i;
+ bubble *b = (bubble *) bb;
+
+ /* Update the rotation. */
+ b->rotx += b->rotx_incr;
+ b->roty += b->roty_incr;
+ b->rotz += b->rotz_incr;
+
+ /* Update the nudge angles. */
+ for (i = 0; i < glb_config.nr_nudge_axes; ++i)
+ b->nudge_angle[i] += b->nudge_angle_incr[i];
+
+ /* Move it upwards & outwards. */
+ b->y += b->y_incr;
+ b->scale += b->scale_incr;
+}
+
+/* Draw a bubble. */
+void
+glb_bubble_draw(glb_data *d, void *bb)
+{
+ int i, j;
+ bubble *b = (bubble *) bb;
+ int nr_vertices;
+ glb_vertex *vertices = glb_sphere_get_vertices(d, &nr_vertices);
+ int nr_triangles;
+ glb_triangle *triangles = glb_sphere_get_triangles(d, &nr_triangles);
+ glb_vertex *new_vertices;
+
+ new_vertices = (glb_vertex *) malloc(sizeof (glb_vertex) * nr_vertices);
+ /* Calculate the vertices of this bubble, factoring in each nudge axis. */
+ for (i = 0; i < nr_vertices; ++i) {
+ GLfloat s = 0;
+
+ for (j = 0; j < glb_config.nr_nudge_axes; ++j)
+ s += ((GLfloat) cos((double) (b->nudge_angle[j])) *
+ glb_config.nudge_factor - glb_config.nudge_factor / 2) *
+ b->contributions[i * glb_config.nr_nudge_axes + j];
+
+ new_vertices[i][0] = vertices[i][0] * (s + 1);
+ new_vertices[i][1] = vertices[i][1] * (s + 1);
+ new_vertices[i][2] = vertices[i][2] * (s + 1);
+ }
+
+ glPushMatrix();
+
+ /* Apply translation, rotation and scalings. */
+ glTranslatef(b->x, b->y, b->z);
+
+ glRotatef(b->rotx, 1, 0, 0);
+ glRotatef(b->roty, 0, 1, 0);
+ glRotatef(b->rotz, 0, 0, 1);
+
+ glScalef(b->scale, b->scale, b->scale);
+
+ /* Draw the bubble. */
+ glFrontFace(GL_CW);
+ glBegin(GL_TRIANGLES);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, b->color);
+
+ for (i = 0; i < nr_triangles; ++i) {
+ glNormal3fv(new_vertices[triangles[i][0]]);
+ glVertex3fv(new_vertices[triangles[i][0]]);
+ glNormal3fv(new_vertices[triangles[i][1]]);
+ glVertex3fv(new_vertices[triangles[i][1]]);
+ glNormal3fv(new_vertices[triangles[i][2]]);
+ glVertex3fv(new_vertices[triangles[i][2]]);
+ }
+ glEnd();
+ glPopMatrix();
+ (void) free((void *) new_vertices);
+ glb_config.polygon_count += nr_triangles;
+}
+
+/* Return y value. */
+GLfloat
+glb_bubble_get_y(void *bb)
+{
+ bubble *b = (bubble *) bb;
+
+ return b->y;
+}
diff --git a/hacks/glx/bubble3d.h b/hacks/glx/bubble3d.h
new file mode 100644
index 0000000..92ccbbd
--- /dev/null
+++ b/hacks/glx/bubble3d.h
@@ -0,0 +1,100 @@
+/* GLBUBBLES (C) 1998 Richard W.M. Jones. */
+
+#ifndef __bubbles3d_h__
+#define __bubbles3d_h__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef STANDALONE
+# include <math.h>
+# include "xlockmoreI.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#if !defined(HAVE_JWXYZ) && !defined(HAVE_JWZGLES)
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+/* Static configuration. */
+#define GLB_SLOW_GL 0 /* Set this if you have a slow GL
+ * implementation. If you have an accelerated
+ * graphics card, set this to 0.
+ */
+#define GLB_VERTICES_EPSILON 0.0005 /* How close are identical vertices? */
+
+/* Configuration structure. */
+struct glb_config {
+ int transparent_p; /* Whether to use alpha blending */
+
+ int subdivision_depth; /* Controls how many triangles are in
+ * each bubble. 2 and 3 are good values.
+ */
+ int nr_nudge_axes; /* Number of directions in which each
+ * bubble gets stretched. Values between
+ * 3 and 7 seem to produce good results.
+ */
+ GLfloat nudge_angle_factor; /* Max. amount of rotation in nudge angles.
+ * Controls the amount of `wobble' we see,
+ * and 0.3 seems to work well.
+ */
+ GLfloat nudge_factor; /* Max. displacement of any single nudge.
+ * Controls the amount of the wobble. Depends
+ * on NR_NUDGE_AXES, and must not exceed
+ * 1 / NR_NUDGE_AXES. 0.1 is good.
+ */
+ GLfloat rotation_factor; /* Max. amount by which bubbles rotate. */
+ int create_bubbles_every; /* How often to create new bubbles. */
+ int max_bubbles; /* Max. number of bubbles to create. */
+ double p_bubble_group[4]; /* Probabilities of creating 1, 2, 3, 4
+ * bubbles in a group. Cumulative.
+ */
+ GLfloat max_size; /* Max. size. */
+ GLfloat min_size; /* Min. size of bubbles. */
+ GLfloat max_speed; /* Max. speed. */
+ GLfloat min_speed; /* Min. speed of bubbles. */
+ GLfloat scale_factor; /* Factor by which bubbles scale from bottom
+ * of screen to top. 1.5 - 2.0 are OK.
+ */
+ GLfloat screen_bottom; /* Bottom of screen. */
+ GLfloat screen_top; /* Top of screen. */
+ GLfloat bubble_colour[4]; /* Colour of the bubbles. */
+
+ int polygon_count;
+};
+
+extern struct glb_config glb_config;
+
+#define glb_drand() ((double)LRAND() / (double)MAXRAND)
+
+/*-- From glb_sphere.c. --*/
+typedef struct glb_data glb_data;
+typedef GLfloat glb_vertex[3];
+typedef GLuint glb_triangle[3];
+extern glb_data * glb_sphere_init(void);
+extern glb_vertex *glb_sphere_get_vertices(glb_data *, int *nr_vertices);
+extern glb_triangle *glb_sphere_get_triangles(glb_data *, int *nr_triangles);
+extern void glb_sphere_end(glb_data *);
+
+/*-- From glb_bubble.c. --*/
+extern void *glb_bubble_new(glb_data *d,
+ GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
+ GLfloat y_incr, GLfloat scale_incr);
+extern void glb_bubble_delete(void *);
+extern void glb_bubble_step(void *);
+extern void glb_bubble_draw(glb_data *d, void *);
+extern GLfloat glb_bubble_get_y(void *);
+
+/*-- From glb_draw.c. --*/
+extern void *glb_draw_init(void);
+extern void glb_draw_step(void *);
+extern void glb_draw_end(void *);
+
+#endif /* __bubbles3d_h__ */
diff --git a/hacks/glx/bubble3d.man b/hacks/glx/bubble3d.man
new file mode 100644
index 0000000..f847e12
--- /dev/null
+++ b/hacks/glx/bubble3d.man
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+bubble3d - 3d rising bubbles.
+.SH SYNOPSIS
+.B bubble3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-transparent]
+[\-color \fIcolor\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a stream of rising, undulating 3D bubbles, rising toward the top of
+the screen, with nice specular reflections.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-transparent
+Draw transparent bubbles instead of solid ones.
+.TP 8
+.B \-color \fIcolor\fP
+Draw bubbles of the specified color. "Random" means a different color
+for each bubble.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 15000 (0.015 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Richard Jones. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Richard Jones.
diff --git a/hacks/glx/buildlwo.c b/hacks/glx/buildlwo.c
new file mode 100644
index 0000000..c20c9e2
--- /dev/null
+++ b/hacks/glx/buildlwo.c
@@ -0,0 +1,96 @@
+
+#if 0
+static const char sccsid[] = "@(#)buildlwo.c 4.02 97/04/20 xlockmore";
+#endif
+
+/*-
+ * buildlwo.c: Lightwave Object Display List Builder for OpenGL
+ *
+ * This module can be called by any GL mode wishing to use
+ * objects created in NewTek's Lightwave 3D. The objects must
+ * first be converted to C source with my converter "lw2ogl".
+ * If other people are interested in this, I will put up a
+ * web page for it at http://www.netaxs.com/~emackey/lw2ogl/
+ *
+ * by Ed Mackey, 4/19/97
+ *
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#include "buildlwo.h"
+
+GLuint
+BuildLWO(int wireframe, const struct lwo *object)
+{
+ GLuint dl_num;
+ const GLfloat *pnts, *normals, *grab;
+ const unsigned short int *pols;
+ GLfloat three[3];
+ int p, num_pnts = 0;
+
+ dl_num = glGenLists(1);
+ if (!dl_num)
+ return (0);
+
+ pnts = object->pnts;
+ normals = object->normals;
+ pols = object->pols;
+
+ glNewList(dl_num, GL_COMPILE);
+
+ if (!pols) {
+ num_pnts = object->num_pnts;
+ glBegin(GL_POINTS);
+ for (p = 0; p < num_pnts; ++p) {
+ three[0] = *(pnts++);
+ three[1] = *(pnts++);
+ three[2] = *(pnts++);
+ glVertex3fv(three);
+ }
+ glEnd();
+ } else
+ for (;;) {
+ if (num_pnts <= 0) {
+ num_pnts = *pols + 2;
+ if (num_pnts < 3)
+ break;
+ if (num_pnts == 3) {
+ glBegin(GL_POINTS);
+ } else if (num_pnts == 4) {
+ glBegin(GL_LINES);
+ } else {
+ three[0] = *(normals++);
+ three[1] = *(normals++);
+ three[2] = *(normals++);
+ glNormal3fv(three);
+ if (wireframe)
+ glBegin(GL_LINE_LOOP);
+ else
+ glBegin(GL_POLYGON);
+ }
+ } else if (num_pnts == 1) {
+ glEnd();
+ } else {
+ grab = pnts + ((int) (*pols) * 3);
+ three[0] = *(grab++);
+ three[1] = *(grab++);
+ three[2] = *(grab);
+ glVertex3fv(three);
+ }
+ --num_pnts;
+ ++pols;
+ }
+
+ glEndList();
+
+ return (dl_num);
+}
+
+#endif /* USE_GL */
+
+/* End of buildlwo.c */
diff --git a/hacks/glx/buildlwo.h b/hacks/glx/buildlwo.h
new file mode 100644
index 0000000..b7fbbd9
--- /dev/null
+++ b/hacks/glx/buildlwo.h
@@ -0,0 +1,43 @@
+/*-
+ * buildlwo.h: Header file for Lightwave Object Display List Builder
+ * for OpenGL
+ *
+ * by Ed Mackey, 4/19/97
+ *
+ */
+
+#ifndef __BUILD_LWO_H__
+#define __BUILD_LWO_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef STANDALONE
+# ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# endif
+#endif
+
+#ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+struct lwo {
+ int num_pnts;
+ const GLfloat *pnts;
+ const GLfloat *normals;
+ const unsigned short int *pols;
+ const GLfloat *smoothnormals;
+};
+
+GLuint BuildLWO(int wireframe, const struct lwo *object);
+
+#endif
+
+/* End of buildlwo.h */
diff --git a/hacks/glx/cage.c b/hacks/glx/cage.c
new file mode 100644
index 0000000..66f48aa
--- /dev/null
+++ b/hacks/glx/cage.c
@@ -0,0 +1,480 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* cage --- the Impossible Cage, an Escher like scene. */
+
+#if 0
+static const char sccsid[] = "@(#)cage.c 5.01 2001/03/01 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The RotateAroundU() routine was adapted from the book
+ * "Computer Graphics Principles and Practice
+ * Foley - vanDam - Feiner - Hughes
+ * Second Edition" Pag. 227, exercise 5.15.
+ *
+ * This mode shows some interesting scenes that are impossible OR very
+ * wierd to build in the real universe. Much of the scenes are inspirated
+ * on Mauritz Cornelis Escher's works which derivated the mode's name.
+ * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
+ * say he was a mathematician.
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistakes.
+ *
+ * My e-mail address is
+ * mfvianna@centroin.com.br
+ *
+ * Marcelo F. Vianna (Jun-01-1997)
+ *
+ * Revision History:
+ * 05-Apr-2002: Removed all gllist uses (fix some bug with nvidia driver)
+ * 01-Mar-2001: Added FPS stuff E.Lassauge <lassauge@mail.dotcom.fr>
+ * 01-Nov-2000: Allocation checks
+ * 01-Jan-1998: Mode separated from escher and renamed
+ * 08-Jun-1997: New scene implemented: "Impossible Cage" based in a M.C.
+ * Escher's painting with the same name (quite similar). The
+ * first GL mode to use texture mapping.
+ * The "Impossible Cage" scene doesn't use DEPTH BUFFER, the
+ * wood planks are drawn consistently using GL_CULL_FACE, and
+ * the painter's algorithm is used to sort the planks.
+ * Marcelo F. Vianna.
+ * 07-Jun-1997: Speed ups in Moebius Strip using GL_CULL_FACE.
+ * Marcelo F. Vianna.
+ * 03-Jun-1997: Initial Release (Only one scene: "Moebius Strip")
+ * The Moebius Strip scene was inspirated in a M.C. Escher's
+ * painting named Moebius Strip II in wich ants walk across a
+ * Moebius Strip path, sometimes meeting each other and sometimes
+ * being in "opposite faces" (note that the moebius strip has
+ * only one face and one edge).
+ * Marcelo F. Vianna.
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#ifdef STANDALONE
+# define MODE_cage
+# define DEFAULTS "*delay: 25000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cage 0
+# define release_cage 0
+# define cage_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_cage
+
+#if 0
+#include "e_textures.h"
+#else
+#include "ximage-loader.h"
+#include "images/gen/wood_png.h"
+#endif
+
+ENTRYPOINT ModeSpecOpt cage_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct cage_description =
+{"cage", "init_cage", "draw_cage", NULL,
+ "draw_cage", "change_cage", (char *) NULL, &cage_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows the Impossible Cage, an Escher-like GL scene", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#define ObjWoodPlank 0
+#define MaxObj 1
+
+/*************************************************************************/
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLXContext *glx_context;
+} cagestruct;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const float position0[] = {1.0, 1.0, 1.0, 0.0};
+static const float position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
+
+static cagestruct *cage = (cagestruct *) NULL;
+
+#define PlankWidth 3.0
+#define PlankHeight 0.35
+#define PlankThickness 0.15
+
+static Bool
+draw_woodplank(ModeInfo *mi, cagestruct * cp, int wire)
+{
+ glBegin(wire ? GL_LINES : GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(0, 0, -1);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(0, 1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(0, -1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(1, 0, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(-1, 0, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glEnd();
+
+ return True;
+}
+
+static Bool
+draw_impossiblecage(ModeInfo *mi, cagestruct * cp, int wire)
+{
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankHeight - PlankWidth, -PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankWidth - PlankHeight, -PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankWidth - PlankHeight, 3 * PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - 3 * PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankHeight - PlankWidth, 3 * PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - 3 * PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth + PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth + PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ return True;
+}
+
+static void
+reshape_cage(ModeInfo * mi, int width, int height)
+{
+ cagestruct *cp = &cage[MI_SCREEN(mi)];
+ int i;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ }
+
+ glViewport(0, y, cp->WindW = (GLint) width, cp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+ glMatrixMode(GL_MODELVIEW);
+ i = width / 512 + 1;
+ glLineWidth(i);
+ glPointSize(i);
+}
+
+static void
+pinit(ModeInfo *mi)
+{
+ /* int status; */
+
+ if (MI_IS_WIREFRAME(mi))
+ return;
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+ glCullFace(GL_BACK);
+
+ /* cage */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ glShadeModel(GL_FLAT);
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_CULL_FACE);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+#if 0
+ clear_gl_error();
+ if (MI_IS_MONO(mi))
+ status = 0;
+ else
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
+ WoodTextureWidth, WoodTextureHeight,
+ GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
+ if (status)
+ {
+ const char *s = (char *) gluErrorString (status);
+ fprintf (stderr, "%s: error mipmapping texture: %s\n",
+ progname, (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ {
+ XImage *img = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ wood_png, sizeof(wood_png));
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ img->width, img->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, img->data);
+ check_gl_error("texture");
+ XDestroyImage (img);
+ }
+#endif
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+ENTRYPOINT void
+init_cage (ModeInfo * mi)
+{
+ cagestruct *cp;
+
+ MI_INIT (mi, cage);
+ cp = &cage[MI_SCREEN(mi)];
+
+ cp->step = NRAND(90);
+ if ((cp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_cage(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_cage (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ cagestruct *cp;
+
+ if (cage == NULL)
+ return;
+ cp = &cage[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!cp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(cp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glTranslatef(0.0, 0.0, -10.0);
+
+ if (!MI_IS_ICONIC(mi)) {
+ glScalef(Scale4Window * cp->WindH / cp->WindW, Scale4Window, Scale4Window);
+ } else {
+ glScalef(Scale4Iconic * cp->WindH / cp->WindW, Scale4Iconic, Scale4Iconic);
+ }
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ if (o != 0 && o != 180 && o != -180) {
+ glScalef (1/h, h, 1/h); /* #### not quite right */
+ h = 1.7;
+ glScalef (h, h, h);
+ }
+ }
+# endif
+
+ /* cage */
+ glRotatef(cp->step * 100, 0, 0, 1);
+ glRotatef(25 + cos(cp->step * 5) * 6, 1, 0, 0);
+ glRotatef(204.5 - sin(cp->step * 5) * 8, 0, 1, 0);
+ if (!draw_impossiblecage(mi, cp, MI_IS_WIREFRAME(mi))) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ cp->step += 0.025;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_cage (ModeInfo * mi)
+{
+ cagestruct *cp = &cage[MI_SCREEN(mi)];
+
+ if (!cp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+ pinit(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Cage", cage)
+
+#endif
diff --git a/hacks/glx/cage.man b/hacks/glx/cage.man
new file mode 100644
index 0000000..dc5595b
--- /dev/null
+++ b/hacks/glx/cage.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cage - Escher's impossible cage, for xscreensaver.
+.SH SYNOPSIS
+.B cage
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-mono]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws Escher's "Impossible Cage", a 3d analog of a moebius strip,
+and rotates it in three dimensions.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 25000 (0.03 seconds.).
+.TP 8
+.B \-mono
+Render solid instead of textured.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of textured.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Marcelo Vianna.
diff --git a/hacks/glx/carousel.c b/hacks/glx/carousel.c
new file mode 100644
index 0000000..863b1a5
--- /dev/null
+++ b/hacks/glx/carousel.c
@@ -0,0 +1,941 @@
+/* carousel, Copyright (c) 2005-2018 Jamie Zawinski <jwz@jwz.org>
+ * Loads a sequence of images and rotates them around.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 21-Feb-2005
+ */
+
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define DEF_FONT "OCR A Std 48, Lucida Console 48, Monaco 48"
+#elif 0 /* real X11, XQueryFont() */
+# define DEF_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+#else /* real X11, load_font_retry() */
+# define DEF_FONT "-*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*"
+#endif
+
+#define DEF_TITLE_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+
+#define DEFAULTS "*count: 7 \n" \
+ "*delay: 10000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*useSHM: True \n" \
+ "*font: " DEF_FONT "\n" \
+ "*titleFont: " DEF_TITLE_FONT "\n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n"
+
+# define free_carousel 0
+# define release_carousel 0
+# include "xlockmore.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef USE_GL
+
+# define DEF_SPEED "1.0"
+# define DEF_DURATION "20"
+# define DEF_TITLES "True"
+# define DEF_ZOOM "True"
+# define DEF_TILT "XY"
+# define DEF_MIPMAP "True"
+# define DEF_DEBUG "False"
+
+#include "rotator.h"
+#include "gltrackball.h"
+#include "grab-ximage.h"
+#include "texfont.h"
+
+# ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h> /* for XrmDatabase in -debug mode */
+# endif
+
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
+
+typedef struct {
+ double x, y, w, h;
+} rect;
+
+typedef enum { EARLY, NORMAL, LOADING, OUT, IN, DEAD } fade_mode;
+static int fade_ticks = 60;
+
+typedef struct {
+ char *title; /* the filename of this image */
+ int w, h; /* size in pixels of the image */
+ int tw, th; /* size in pixels of the texture */
+ XRectangle geom; /* where in the image the bits are */
+ GLuint texid;
+} image;
+
+typedef struct {
+ ModeInfo *mi;
+ image current, loading;
+ GLfloat r, theta; /* radius and rotation on the tube */
+ rotator *rot; /* for zoomery */
+ Bool from_top_p; /* whether this image drops in or rises up */
+ time_t expires; /* when this image should be replaced */
+ fade_mode mode; /* in/out animation state */
+ int mode_tick;
+ Bool loaded_p; /* whether background load is done */
+} image_frame;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ GLfloat anisotropic;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ time_t button_down_time;
+
+ int nframes; /* how many frames are loaded */
+ int frames_size;
+ image_frame **frames; /* pointers to the frames */
+
+ Bool awaiting_first_images_p;
+ int loads_in_progress;
+
+ texture_font_data *texfont, *titlefont;
+
+ fade_mode mode;
+ int mode_tick;
+
+ int loading_sw, loading_sh;
+
+ time_t last_time, now;
+ int draw_tick;
+
+} carousel_state;
+
+static carousel_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static GLfloat speed; /* animation speed scale factor */
+static int duration; /* reload images after this long */
+static Bool mipmap_p; /* Use mipmaps instead of single textures. */
+static Bool titles_p; /* Display image titles. */
+static Bool zoom_p; /* Throb the images in and out as they spin. */
+static char *tilt_str;
+static Bool tilt_x_p; /* Tilt axis towards the viewer */
+static Bool tilt_y_p; /* Tilt axis side to side */
+static Bool debug_p; /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+ {"-zoom", ".zoom", XrmoptionNoArg, "True" },
+ {"-no-zoom", ".zoom", XrmoptionNoArg, "False" },
+ {"-tilt", ".tilt", XrmoptionSepArg, 0 },
+ {"-no-tilt", ".tilt", XrmoptionNoArg, "" },
+ {"-titles", ".titles", XrmoptionNoArg, "True" },
+ {"-no-titles", ".titles", XrmoptionNoArg, "False" },
+ {"-mipmaps", ".mipmap", XrmoptionNoArg, "True" },
+ {"-no-mipmaps", ".mipmap", XrmoptionNoArg, "False" },
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+ {"-font", ".font", XrmoptionSepArg, 0 },
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ { &mipmap_p, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+ { &titles_p, "titles", "Titles", DEF_TITLES, t_Bool},
+ { &zoom_p, "zoom", "Zoom", DEF_ZOOM, t_Bool},
+ { &tilt_str, "tilt", "Tilt", DEF_TILT, t_String},
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float},
+ { &duration, "duration", "Duration", DEF_DURATION, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt carousel_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Allocates a frame structure and stores it in the list.
+ */
+static image_frame *
+alloc_frame (ModeInfo *mi)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ image_frame *frame = (image_frame *) calloc (1, sizeof (*frame));
+
+ frame->mi = mi;
+ frame->mode = EARLY;
+ frame->rot = make_rotator (0, 0, 0, 0, 0.04 * frand(1.0) * speed, False);
+
+ glGenTextures (1, &frame->current.texid);
+ glGenTextures (1, &frame->loading.texid);
+ if (frame->current.texid <= 0) abort();
+ if (frame->loading.texid <= 0) abort();
+
+ if (ss->frames_size <= ss->nframes)
+ {
+ ss->frames_size = (ss->frames_size * 1.2) + ss->nframes;
+ ss->frames = (image_frame **)
+ realloc (ss->frames, ss->frames_size * sizeof(*ss->frames));
+ if (! ss->frames)
+ {
+ fprintf (stderr, "%s: out of memory (%d images)\n",
+ progname, ss->frames_size);
+ exit (1);
+ }
+ }
+
+ ss->frames[ss->nframes++] = frame;
+
+ return frame;
+}
+
+
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure);
+
+
+/* Load a new file into the given image struct.
+ */
+static void
+load_image (ModeInfo *mi, image_frame *frame)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (debug_p && !wire && frame->current.w != 0)
+ fprintf (stderr, "%s: dropped %4d x %-4d %4d x %-4d \"%s\"\n",
+ progname,
+ frame->current.geom.width,
+ frame->current.geom.height,
+ frame->current.tw, frame->current.th,
+ (frame->current.title ? frame->current.title : "(null)"));
+
+ switch (frame->mode)
+ {
+ case EARLY: break;
+ case NORMAL: frame->mode = LOADING; break;
+ default: abort();
+ }
+
+ ss->loads_in_progress++;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, frame);
+ else
+ {
+ int w = (MI_WIDTH(mi) / 2) - 1;
+ int h = (MI_HEIGHT(mi) / 2) - 1;
+ if (w <= 10) w = 10;
+ if (h <= 10) h = 10;
+
+ if (w > h * 5) { /* tiny window: use 16:9 boxes */
+ h = w * 9/16;
+ }
+
+ load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context, w, h,
+ mipmap_p, frame->loading.texid,
+ image_loaded_cb, frame);
+ }
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ image_frame *frame = (image_frame *) closure;
+ ModeInfo *mi = frame->mi;
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (wire)
+ {
+ frame->loading.w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+ frame->loading.h = MI_HEIGHT (mi);
+ frame->loading.geom.width = frame->loading.w;
+ frame->loading.geom.height = frame->loading.h;
+ goto DONE;
+ }
+
+ if (image_width == 0 || image_height == 0)
+ exit (1);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
+
+ if (ss->anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ ss->anisotropic);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ frame->loading.w = image_width;
+ frame->loading.h = image_height;
+ frame->loading.tw = texture_width;
+ frame->loading.th = texture_height;
+ frame->loading.geom = *geom;
+
+ if (frame->loading.title)
+ free (frame->loading.title);
+ frame->loading.title = (filename ? strdup (filename) : 0);
+
+ /* xscreensaver-getimage returns paths relative to the image directory
+ now, so leave the sub-directory part in. Unless it's an absolute path.
+ */
+ if (frame->loading.title && frame->loading.title[0] == '/')
+ { /* strip filename to part after last /. */
+ char *s = strrchr (frame->loading.title, '/');
+ if (s) strcpy (frame->loading.title, s+1);
+ }
+
+ if (debug_p)
+ fprintf (stderr, "%s: loaded %4d x %-4d %4d x %-4d \"%s\"\n",
+ progname,
+ frame->loading.geom.width,
+ frame->loading.geom.height,
+ frame->loading.tw, frame->loading.th,
+ (frame->loading.title ? frame->loading.title : "(null)"));
+
+ DONE:
+
+ frame->loaded_p = True;
+
+ if (ss->loads_in_progress <= 0) abort();
+ ss->loads_in_progress--;
+
+ /* This image expires N seconds after it finished loading. */
+ frame->expires = time((time_t *) 0) + (duration * MI_COUNT(mi));
+
+ switch (frame->mode)
+ {
+ case EARLY: /* part of the initial batch of images */
+ {
+ image swap = frame->current;
+ frame->current = frame->loading;
+ frame->loading = swap;
+ }
+ break;
+ case LOADING: /* start dropping the old image out */
+ {
+ frame->mode = OUT;
+ frame->mode_tick = fade_ticks / speed;
+ frame->from_top_p = random() & 1;
+ }
+ break;
+ default:
+ abort();
+ }
+}
+
+
+static void loading_msg (ModeInfo *mi, int n);
+
+static Bool
+load_initial_images (ModeInfo *mi)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ Bool all_loaded_p = True;
+ for (i = 0; i < ss->nframes; i++)
+ if (! ss->frames[i]->loaded_p)
+ all_loaded_p = False;
+
+ if (all_loaded_p)
+ {
+ if (ss->nframes < MI_COUNT (mi))
+ {
+ /* The frames currently on the list are fully loaded.
+ Start the next one loading. (We run the image loader
+ asynchronously, but we load them one at a time.)
+ */
+ load_image (mi, alloc_frame (mi));
+ }
+ else
+ {
+ /* The first batch of images are now all loaded!
+ Stagger the expire times so that they don't all drop out at once.
+ */
+ time_t now = time((time_t *) 0);
+ int i;
+
+ for (i = 0; i < ss->nframes; i++)
+ {
+ image_frame *frame = ss->frames[i];
+ frame->r = 1.0;
+ frame->theta = i * 360.0 / ss->nframes;
+ frame->expires = now + (duration * (i + 1));
+ frame->mode = NORMAL;
+ }
+
+ /* Instead of always going clockwise, shuffle the expire times
+ of the frames so that they drop out in a random order.
+ */
+ for (i = 0; i < ss->nframes; i++)
+ {
+ image_frame *frame1 = ss->frames[i];
+ image_frame *frame2 = ss->frames[random() % ss->nframes];
+ time_t swap = frame1->expires;
+ frame1->expires = frame2->expires;
+ frame2->expires = swap;
+ }
+
+ ss->awaiting_first_images_p = False;
+ }
+ }
+
+ loading_msg (mi, ss->nframes-1);
+
+ return !ss->awaiting_first_images_p;
+}
+
+
+ENTRYPOINT void
+reshape_carousel (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (60.0, 1/h, 1.0, 8.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 2.6,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+carousel_handle_event (ModeInfo *mi, XEvent *event)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ if (! ss->button_down_p)
+ ss->button_down_time = time((time_t *) 0);
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ if (ss->button_down_p)
+ {
+ /* Add the time the mouse was held to the expire times of all
+ frames, so that mouse-dragging doesn't count against
+ image expiration.
+ */
+ int secs = time((time_t *) 0) - ss->button_down_time;
+ int i;
+ for (i = 0; i < ss->nframes; i++)
+ ss->frames[i]->expires += secs;
+ }
+ }
+
+ if (gltrackball_event_handler (event, ss->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &ss->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ int i = random() % ss->nframes;
+ ss->frames[i]->expires = 0;
+ return True;
+ }
+
+ return False;
+}
+
+
+/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
+ */
+static void
+hack_resources (Display *dpy)
+{
+# ifndef HAVE_JWXYZ
+ char *res = "desktopGrabber";
+ char *val = get_string_resource (dpy, res, "DesktopGrabber");
+ char buf1[255];
+ char buf2[255];
+ XrmValue value;
+ XrmDatabase db = XtDatabase (dpy);
+ sprintf (buf1, "%.100s.%.100s", progname, res);
+ sprintf (buf2, "%.200s -v", val);
+ value.addr = buf2;
+ value.size = strlen(buf2);
+ XrmPutResource (&db, buf1, "String", &value);
+# endif /* !HAVE_JWXYZ */
+}
+
+
+static void
+loading_msg (ModeInfo *mi, int n)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ char text[100];
+
+ if (wire) return;
+
+ if (n == 0)
+ sprintf (text, "Loading images...");
+ else
+ sprintf (text, "Loading images... (%d%%)",
+ (int) (n * 100 / MI_COUNT(mi)));
+
+ if (ss->loading_sw == 0)
+ {
+ /* only do this once, so that the string doesn't move. */
+ XCharStruct e;
+ texture_string_metrics (ss->titlefont, text, &e, 0, 0);
+ ss->loading_sw = e.width;
+ ss->loading_sh = e.ascent + e.descent;
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+/*
+ {
+ double rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ }
+*/
+
+# ifdef HAVE_MOBILE
+ if (MI_WIDTH(mi) < MI_HEIGHT(mi)) /* portrait orientation */
+ {
+ GLfloat s = (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi));
+ glScalef (s, s, s);
+ glTranslatef(-s/2, 0, 0);
+ }
+# endif
+
+ glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
+ glTranslatef ((MI_WIDTH(mi) - ss->loading_sw) / 2,
+ (MI_HEIGHT(mi) - ss->loading_sh) / 2,
+ 0);
+ glColor3f (1, 1, 0);
+ glEnable (GL_TEXTURE_2D);
+ glDisable (GL_DEPTH_TEST);
+ print_texture_string (ss->titlefont, text);
+ glEnable (GL_DEPTH_TEST);
+ glPopMatrix();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+
+ENTRYPOINT void
+init_carousel (ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ carousel_state *ss;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sss);
+ ss = &sss[screen];
+
+ if ((ss->glx_context = init_GL(mi)) != NULL) {
+ reshape_carousel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ if (!tilt_str || !*tilt_str)
+ ;
+ else if (!strcasecmp (tilt_str, "0"))
+ ;
+ else if (!strcasecmp (tilt_str, "X"))
+ tilt_x_p = 1;
+ else if (!strcasecmp (tilt_str, "Y"))
+ tilt_y_p = 1;
+ else if (!strcasecmp (tilt_str, "XY"))
+ tilt_x_p = tilt_y_p = 1;
+ else
+ {
+ fprintf (stderr, "%s: tilt must be 'X', 'Y', 'XY' or '', not '%s'\n",
+ progname, tilt_str);
+ exit (1);
+ }
+
+ {
+ double spin_speed = speed * 0.2; /* rotation of tube around axis */
+ double spin_accel = speed * 0.1;
+ double wander_speed = speed * 0.001; /* tilting of axis */
+
+ spin_speed *= 0.9 + frand(0.2);
+ wander_speed *= 0.9 + frand(0.2);
+
+ ss->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel, wander_speed, True);
+
+ ss->trackball = gltrackball_init (False);
+ }
+
+ if (strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &ss->anisotropic);
+ else
+ ss->anisotropic = 0.0;
+
+ glDisable (GL_LIGHTING);
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+
+ if (! wire)
+ {
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_LINE_SMOOTH);
+ /* This gives us a transparent diagonal slice through each image! */
+ /* glEnable (GL_POLYGON_SMOOTH); */
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_ALPHA_TEST);
+
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+
+ }
+
+ ss->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+ ss->titlefont = load_texture_font (MI_DISPLAY(mi), "titleFont");
+
+ if (debug_p)
+ hack_resources (MI_DISPLAY (mi));
+
+ ss->nframes = 0;
+ ss->frames_size = 10;
+ ss->frames = (image_frame **)
+ calloc (1, ss->frames_size * sizeof(*ss->frames));
+
+ ss->mode = IN;
+ ss->mode_tick = fade_ticks / speed;
+
+ ss->awaiting_first_images_p = True;
+}
+
+
+static void
+draw_frame (ModeInfo *mi, image_frame *frame, time_t now, Bool body_p)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat texw = frame->current.geom.width / (GLfloat) frame->current.tw;
+ GLfloat texh = frame->current.geom.height / (GLfloat) frame->current.th;
+ GLfloat texx1 = frame->current.geom.x / (GLfloat) frame->current.tw;
+ GLfloat texy1 = frame->current.geom.y / (GLfloat) frame->current.th;
+ GLfloat texx2 = texx1 + texw;
+ GLfloat texy2 = texy1 + texh;
+ GLfloat aspect = ((GLfloat) frame->current.geom.height /
+ (GLfloat) frame->current.geom.width);
+
+ glBindTexture (GL_TEXTURE_2D, frame->current.texid);
+
+ glPushMatrix();
+
+ /* Position this image on the wheel.
+ */
+ glRotatef (frame->theta, 0, 1, 0);
+ glTranslatef (0, 0, frame->r);
+
+ /* Scale down the image so that all N frames fit on the wheel
+ without bumping in to each other.
+ */
+ {
+ GLfloat t, s;
+ switch (ss->nframes)
+ {
+ case 1: t = -1.0; s = 1.7; break;
+ case 2: t = -0.8; s = 1.6; break;
+ case 3: t = -0.4; s = 1.5; break;
+ case 4: t = -0.2; s = 1.3; break;
+ default: t = 0.0; s = 6.0 / ss->nframes; break;
+ }
+ glTranslatef (0, 0, t);
+ glScalef (s, s, s);
+ }
+
+ /* Center this image on the wheel plane.
+ */
+ glTranslatef (-0.5, -(aspect/2), 0);
+
+ /* Move as per the "zoom in and out" setting.
+ */
+ if (zoom_p)
+ {
+ double x, y, z;
+ /* Only use the Z component of the rotator for in/out position. */
+ get_position (frame->rot, &x, &y, &z, !ss->button_down_p);
+ glTranslatef (0, 0, z/2);
+ }
+
+ /* Compute the "drop in and out" state.
+ */
+ switch (frame->mode)
+ {
+ case EARLY:
+ abort();
+ break;
+ case NORMAL:
+ if (!ss->button_down_p &&
+ now >= frame->expires &&
+ ss->loads_in_progress == 0) /* only load one at a time */
+ load_image (mi, frame);
+ break;
+ case LOADING:
+ break;
+ case OUT:
+ if (--frame->mode_tick <= 0) {
+ image swap = frame->current;
+ frame->current = frame->loading;
+ frame->loading = swap;
+
+ frame->mode = IN;
+ frame->mode_tick = fade_ticks / speed;
+ }
+ break;
+ case IN:
+ if (--frame->mode_tick <= 0)
+ frame->mode = NORMAL;
+ break;
+ default:
+ abort();
+ }
+
+ /* Now translate for current in/out state.
+ */
+ if (frame->mode == OUT || frame->mode == IN)
+ {
+ GLfloat t = (frame->mode == OUT
+ ? frame->mode_tick / (fade_ticks / speed)
+ : (((fade_ticks / speed) - frame->mode_tick + 1) /
+ (fade_ticks / speed)));
+ t = 5 * (1 - t);
+ if (frame->from_top_p) t = -t;
+ glTranslatef (0, t, 0);
+ }
+
+ if (body_p) /* Draw the image quad. */
+ {
+ if (! wire)
+ {
+ glColor3f (1, 1, 1);
+ glNormal3f (0, 0, 1);
+ glEnable (GL_TEXTURE_2D);
+ glBegin (GL_QUADS);
+ glNormal3f (0, 0, 1);
+ glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+ glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+ glTexCoord2f (texx2, texy1); glVertex3f (1, aspect, 0);
+ glTexCoord2f (texx1, texy1); glVertex3f (0, aspect, 0);
+ glEnd();
+ }
+
+ /* Draw a box around it.
+ */
+ glLineWidth (2.0);
+ glColor3f (0.5, 0.5, 0.5);
+ glDisable (GL_TEXTURE_2D);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (1, aspect, 0);
+ glVertex3f (0, aspect, 0);
+ glEnd();
+
+ }
+ else /* Draw a title under the image. */
+ {
+ XCharStruct e;
+ int sw, sh;
+ GLfloat scale = 0.05;
+ char *title = frame->current.title ? frame->current.title : "(untitled)";
+ texture_string_metrics (ss->texfont, title, &e, 0, 0);
+ sw = e.width;
+ sh = e.ascent + e.descent;
+
+ glTranslatef (0, -scale, 0);
+
+ scale /= sh;
+ glScalef (scale, scale, scale);
+
+ glTranslatef (((1/scale) - sw) / 2, 0, 0);
+ glColor3f (1, 1, 1);
+
+ if (!wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ print_texture_string (ss->texfont, title);
+ }
+ else
+ {
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (sw, 0, 0);
+ glVertex3f (sw, sh, 0);
+ glVertex3f (0, sh, 0);
+ glEnd();
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+ENTRYPOINT void
+draw_carousel (ModeInfo *mi)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ if (!ss->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ss->glx_context));
+
+ if (ss->awaiting_first_images_p)
+ if (!load_initial_images (mi))
+ return;
+
+ /* Only check the wall clock every 10 frames */
+ {
+ if (ss->now == 0 || ss->draw_tick++ > 10)
+ {
+ ss->now = time((time_t *) 0);
+ if (ss->last_time == 0) ss->last_time = ss->now;
+ ss->draw_tick = 0;
+ }
+ }
+
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+
+ /* Run the startup "un-shrink" animation.
+ */
+ switch (ss->mode)
+ {
+ case IN:
+ if (--ss->mode_tick <= 0)
+ {
+ ss->mode = NORMAL;
+ ss->last_time = time((time_t *) 0);
+ }
+ break;
+ case NORMAL:
+ break;
+ default:
+ abort();
+ }
+
+
+ /* Scale as per the startup "un-shrink" animation.
+ */
+ if (ss->mode != NORMAL)
+ {
+ GLfloat s = (ss->mode == OUT
+ ? ss->mode_tick / (fade_ticks / speed)
+ : (((fade_ticks / speed) - ss->mode_tick + 1) /
+ (fade_ticks / speed)));
+ glScalef (s, s, s);
+ }
+
+ /* Rotate and tilt as per the user, and the motion modeller.
+ */
+ {
+ double x, y, z;
+ gltrackball_rotate (ss->trackball);
+
+ /* Tilt the tube up or down by up to 30 degrees */
+ get_position (ss->rot, &x, &y, &z, !ss->button_down_p);
+ if (tilt_x_p)
+ glRotatef (15 - (x * 30), 1, 0, 0);
+ if (tilt_y_p)
+ glRotatef (7 - (y * 14), 0, 0, 1);
+
+ /* Only use the Y component of the rotator. */
+ get_rotation (ss->rot, &x, &y, &z, !ss->button_down_p);
+ glRotatef (y * 360, 0, 1, 0);
+ }
+
+ /* First draw each image, then draw the titles. GL insists that you
+ draw back-to-front in order to make alpha blending work properly,
+ so we need to draw all of the 100% opaque images before drawing
+ any of the not-100%-opaque titles.
+ */
+ for (i = 0; i < ss->nframes; i++)
+ draw_frame (mi, ss->frames[i], ss->now, True);
+ if (titles_p)
+ for (i = 0; i < ss->nframes; i++)
+ draw_frame (mi, ss->frames[i], ss->now, False);
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+XSCREENSAVER_MODULE ("Carousel", carousel)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/carousel.man b/hacks/glx/carousel.man
new file mode 100644
index 0000000..d5c9e43
--- /dev/null
+++ b/hacks/glx/carousel.man
@@ -0,0 +1,109 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+carousel - displays multiple images rotating in a circular formation
+.SH SYNOPSIS
+.B carousel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fIint\fP]
+[\-zoom | \-no\-zoom]
+[\-tilt \fIXY\fP]
+[\-titles | \-no\-titles]
+[\-font \fIfont\fP]
+[\-speed \fIratio\fP]
+[\-duration \fIseconds\fP]
+[\-fps]
+[\-debug]
+[\-wireframe]
+.SH DESCRIPTION
+Loads several random images, and displays them flying in a circular
+formation. The circle changes speed and direction randomly, tilts on
+its axis, and the images move in and out.
+
+This program requires a good video card capable of supporting large
+textures.
+
+To specify the directory that images are loaded from, run
+.BR xscreensaver-demo (1)
+and click on the "Advanced" tab.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fIint\fP
+How many images to display. Default 7.
+.TP 8
+.B \-zoom \fB| \-no\-zoom\fP
+Whether the images should move in and out (toward and away from the
+axis of rotation). Default true.
+.TP 8
+.B \-tilt \fIXY\fP \fB| \-no\-tilt\fP
+Whether the axis of rotation should tilt, and how. \fB-tilt X\fP
+means that it will tilt toward and away from the viewer.
+\fB-tilt Y\fP means that it will tilt to the left and right of the
+screen. \fB-tilt XY\fP (the default) means it will do both.
+.TP 8
+.B \-titles \fB| \-no\-titles\fP
+Whether to display the file names of the images beneath them. Default: yes.
+.TP 8
+.B \-font \fIfont-name\fP
+The font to use for titles. Note that the size of the font affects
+the clarity of the characters, not their size (it is auto-scaled.)
+.TP 8
+.B \-duration \fIseconds\fP
+Every \fIduration\fP seconds, one of the images will be replaced
+with a new one. Default 20 seconds.
+.TP 8
+.B \-speed \fIratio\fP
+Speed up or slow down the animation. 0.5 means half as fast as the
+default; 2.0 means twice as fast.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-debug
+Prints debugging info to stderr.
+.TP 8
+.B \-wireframe
+Another debug mode.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver-demo (1)
+.BR xscreensaver-getimage (1)
+.BR xscreensaver (1)
+.BR glslideshow (MANSUFFIX)
+.BR photopile (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/chessgames.h b/hacks/glx/chessgames.h
new file mode 100644
index 0000000..28f5c57
--- /dev/null
+++ b/hacks/glx/chessgames.h
@@ -0,0 +1,343 @@
+/*
+ * endgame -- plays through a chess game ending. enjoy.
+ *
+ * Copyright (C) 2002 Blair Tennessy (tennessy@cs.ubc.ca)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __CHESSGAMES_H__
+#define __CHESSGAMES_H__
+
+/** structure for a chess game */
+typedef struct {
+
+ /** original board configuration */
+ int board[BOARDSIZE][BOARDSIZE];
+
+ /** total moves */
+ int movecount;
+
+ /**
+ moves in game. this is a slight hack: moves are encoded in
+ integer pairs (x,y). the first pair, _from_, determines the
+ piece to move. the second pair, _to_, determines where to move.
+
+ in case _to_ is held by another piece, that piece is taken.
+ (see drawTakePiece(), draw_chess())
+
+ in case the move promotes a pawn, we assume a queening.
+ (see drawMovingPiece())
+
+ what's lacking?
+ castling, en passant, under-promotions.
+ */
+ int moves[40][4];
+} ChessGame;
+
+#define GAMES 7
+static ChessGame games[GAMES] = {
+
+ /**
+ game 1:
+
+ E. N. Somov-Nasimovitsch
+ White to play and win.
+
+ "Zadachi I Etiudi"
+ 1928
+ */
+ {
+ {
+ { 0, 0, 0, 0, 0, BKING, 0, 0},
+ { BPAWN, 0, BPAWN, 0, BPAWN, 0, 0, 0},
+ { 0, 0, BPAWN, 0, BPAWN, 0, 0, KNIGHT},
+ { PAWN, 0, ROOK, 0, 0, 0, 0, 0},
+ { PAWN, 0, 0, 0, KING, PAWN, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { BPAWN, 0, 0, 0, 0, 0, 0, PAWN},
+ { BBISHOP,0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 24,
+
+ {
+ {3, 2, 6, 2},
+ {7, 0, 6, 1},
+ {6, 2, 6, 6},
+ {0, 5, 0, 4},
+ {6, 6, 0, 6},
+ {0, 4, 1, 3},
+ {2, 7, 1, 5},
+ {2, 2, 3, 2},
+ {0, 6, 0, 3},
+ {1, 3, 2, 2},
+ {0, 3, 6, 3},
+ {3, 2, 4, 2}, /* pawn to bishop 5 */
+ {1, 5, 0, 3}, /* check */
+ {2, 2, 3, 2},
+ {0, 3, 2, 4}, /* takes pawn */
+ {3, 2, 2, 2},
+ {2, 4, 0, 3},
+ {2, 2, 3, 2},
+ {6, 3, 6, 1}, /* rook takes bishop */
+ {6, 0, 7, 0},
+ {6, 1, 3, 1},
+ {3, 2, 2, 3},
+ {3, 1, 3, 3},
+ {0, 0, 2, 3},
+ }
+ },
+
+ /**
+ game 2:
+
+ K. A. L. Kubbel
+ White to play and win.
+
+ "Chess in the USSR"
+ 1936
+ */
+ {
+ {
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, BPAWN},
+ { 0, 0, 0, 0, BPAWN, KING, 0, BKING},
+ { 0, 0, 0, 0, 0, ROOK, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0,BBISHOP, 0, 0, BROOK, 0, PAWN, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0,BISHOP, 0, 0},
+ },
+
+ 10,
+
+ {
+ {3, 5, 6, 5},
+ {5, 1, 7, 3},
+ {6, 5, 6, 7}, /* check */
+ {7, 3, 3, 7},
+ {7, 5, 6, 4},
+ {5, 4, 6, 4},
+ {5, 6, 4, 6}, /* ! */
+ {6, 4, 6, 7},
+ {4, 6, 3, 6},
+ {0, 0, 2, 7}
+ }
+ },
+
+ /**
+ game 3:
+
+ J. Hasek
+ White to play and win.
+
+ "Le Strategie"
+ 1929
+ */
+ {
+ {
+ { 0, 0, 0, KNIGHT, 0, 0, 0, KNIGHT},
+ { 0, KING, BPAWN, BPAWN, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, BKING, 0, 0, 0, 0, 0, 0},
+ { 0, PAWN, 0, 0, 0, BPAWN, 0, 0},
+ { PAWN, 0, PAWN, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 11,
+
+ {
+ {0, 3, 2, 2},
+ {1, 3, 2, 2},
+ {0, 7, 2, 6},
+ {4, 5, 5, 5},
+ {2, 6, 3, 4},
+ {5, 5, 6, 5},
+ {3, 4, 5, 3}, /* ! */
+ {6, 5, 7, 5},
+ {5, 3, 6, 1},
+ {0, 0, 0, 0}, /* mull it over... */
+ {0, 0, 3, 1}
+ }
+ },
+
+ /**
+ game 4:
+
+ M.B. Newman
+ White to play and win.
+
+ "Chess Amateur"
+ 1913
+ */
+ {
+ {
+ { 0, 0, 0, 0, BQUEEN, 0, 0, 0},
+ {BKNIGHT, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, PAWN},
+ { BKING, 0, BISHOP, 0, KNIGHT, 0, 0, 0},
+ { PAWN, 0, 0, 0, KNIGHT, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { KING, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 15,
+
+ {
+ {4, 2, 3, 1},
+ {0, 4, 3, 1}, /* queen wins bishop */
+ {4, 4, 5, 2},
+ {4, 0, 5, 0}, /* king takes pawn */
+ {5, 2, 3, 1}, /* knight takes queen, check */
+ {1, 0, 3, 1}, /* knight takes knight */
+ {3, 7, 2, 7}, /* pawn advances */
+ {3, 1, 2, 3},
+ {5, 4, 4, 2},
+ {2, 3, 4, 2},
+ {2, 7, 1, 7}, /* pawn advances */
+ {4, 2, 2, 3},
+ {1, 7, 0, 7},
+ {0, 0, 0, 0},
+ {0, 0, 5, 0}
+ }
+ },
+
+ /**
+ game 5:
+
+ V.A. Korolikov
+ White to play and win
+
+ First Prize - "Truda"
+ 1935
+ */
+ {
+ {
+ { 0, 0, BISHOP, 0, 0, 0, 0, 0},
+ { BPAWN, ROOK, 0, 0, 0, 0, 0, 0},
+ { 0, 0, BPAWN, PAWN, 0, BKING, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, KING, BBISHOP},
+ { 0, 0, 0, 0, BPAWN, 0, PAWN, 0},
+ { 0, 0, 0, 0, 0, BPAWN, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 21,
+
+ {
+ {2, 3, 1, 3}, /* pawn to q7 */
+ {2, 5, 1, 4}, /* cover with king */
+ {1, 1, 0, 1},
+ {4, 7, 5, 6}, /* bishop takes pawn */
+ {0, 1, 0, 0}, /* r - r8 */
+ {6, 5, 7, 5}, /* queened */
+ {1, 3, 0, 3}, /* white pawn promoted */
+ {1, 4, 0, 3}, /* king takes queen */
+ {0, 2, 2, 0}, /* discovered check */
+ {5, 6, 0, 1}, /* pull back bishop */
+ {2, 0, 7, 5}, /* bishop takes queen */
+ {0, 3, 1, 2},
+ {7, 5, 2, 0}, /* save rook */
+ {5, 4, 6, 4},
+ {2, 0, 6, 4}, /* bishop takes pawn */
+ {1, 2, 1, 1}, /* king moves in */
+ {6, 4, 5, 5},
+ {1, 1, 0, 0},
+ {5, 5, 2, 2},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0}
+ }
+ },
+
+ /**
+ game 6:
+
+ T.B. Gorgiev
+ White to play and win
+
+ First Prize - "64"
+ 1929
+ */
+ {
+ {
+ { 0, 0, 0, 0, 0, 0, KNIGHT, 0},
+ { BKNIGHT, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, BKING, BKNIGHT, 0, 0, 0},
+ { KING, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, KNIGHT, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, BISHOP, 0, 0, 0},
+ },
+
+ 13,
+
+ {
+ {3, 0, 2, 1}, /* king on move */
+ {1, 0, 0, 2}, /* check */
+ {2, 1, 1, 1},
+ {0, 2, 1, 4}, /* knight moves on */
+ {7, 4, 5, 6}, /* bishop puts king in check */
+ {2, 3, 1, 3}, /* king moves back */
+ {0, 6, 2, 5}, /* knight moves in, check */
+ {1, 3, 0, 3}, /* king moves back queen */
+ {5, 6, 1, 2}, /* bishop - b7 ch!! */
+ {2, 4, 1, 2}, /* black knight takes bishop */
+ {4, 6, 3, 4}, /* knight to k5 */
+ {0, 0, 0, 0}, /* mate */
+ {0, 0, 0, 0}
+ }
+ },
+
+ /**
+ game 7:
+
+ K. A. L. Kubbel
+ White to play and win
+
+ "Schachmatny Listok"
+ 1922
+ */
+ {
+ {
+ { 0, KNIGHT, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { KING, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, BKING, 0, 0, 0, 0},
+ { 0, 0, 0, BPAWN, 0, 0, 0, BISHOP},
+ { BPAWN, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, PAWN, PAWN, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 12,
+
+ {
+ {0, 1, 2, 2}, /* kt-b6 */
+ {3, 3, 2, 2}, /* k x kt */
+ {4, 7, 2, 5}, /* b-b6 */
+ {2, 2, 3, 3}, /* king back to original position */
+ {6, 3, 5, 3}, /* p-q3! */
+ {5, 0, 6, 0}, /* p-r7 */
+ {6, 2, 4, 2}, /* p-b4ch */
+ {3, 3, 3, 2}, /* king moves, black cannot capture in passing */
+ {2, 0, 1, 1}, /* k-kt7! */
+ {6, 0, 7, 0}, /* promo */
+ {2, 5, 1, 4}, /* mate */
+ {0, 0, 3, 2},
+ }
+ },
+};
+
+#endif /* __CHESSGAMES_H__ */
diff --git a/hacks/glx/chessmodels.c b/hacks/glx/chessmodels.c
new file mode 100644
index 0000000..7dd7eca
--- /dev/null
+++ b/hacks/glx/chessmodels.c
@@ -0,0 +1,1738 @@
+/*
+ * models for the xss chess screensavers
+ * hacked from:
+ *
+ * glChess - A 3D chess interface
+ *
+ * Copyright (C) 2006 John-Paul Gignac <jjgignac@users.sf.net>
+ *
+ * Copyright (C) 2002 Robert Ancell <bob27@users.sourceforge.net>
+ * Michael Duelli <duelli@users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* chessmodels.c: Contains the code for piece model creation */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <math.h>
+#include <stdlib.h>
+
+#ifndef HAVE_JWXYZ
+# include <GL/glx.h>
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#define Bool int
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "chessmodels.h"
+
+/* End of Data */
+#define ENDOFDATA 65535
+
+/* Section headers */
+#define SPIN 65534
+#define VERTICES 65533
+#define QUADS 65532
+#define TRIANGLES 65531
+#define POLARQUADSTRIP 65530
+#define QUADSTRIP 65529
+
+/* Special spin-related commands */
+#define SEAM 65528
+#define PATTERN 65527
+#define STEPUP 65526
+#define STEPDOWN 65525
+#define SETBACKREF 65524
+#define BACKREF 65523
+
+static unsigned short classic_pawn_data[] = {
+ SPIN,16,
+ 350,0,SEAM,350,200,SEAM,250,300,SEAM,250,400,SEAM,150,600,SEAM,100,880,
+ SEAM,180,880,SEAM,100,920,SEAM,200,1160,SEAM,100,1340,0,1340,
+ ENDOFDATA
+};
+
+static unsigned short classic_rook_data[] = {
+ SPIN,16,
+ 380,0,SEAM,380,200,SEAM,260,500,SEAM,200,1020,SEAM,280,1020,SEAM,280,1360,SEAM,220,1360,SEAM,220,1300,0,1300,
+ ENDOFDATA
+};
+
+static unsigned short classic_knight_data[] = {
+ SPIN,16,
+ 410,0,SEAM,410,200,SEAM,200,360,SEAM,200,480,260,580,
+
+ VERTICES,
+ 260,580,260, -260,580,260, -260,580,-80, 260,580,-80, 80,1620,400,
+ 100,1680,340, -100,1680,340, -80,1620,400, 100,1680,340, 100,1680,300,
+ -100,1680,300, -100,1680,340, 100,1680,300, 50,1680,160, -50,1680,160,
+ -100,1680,300, 50,1680,160, 100,1680,20, -100,1680,20, -50,1680,160,
+ 100,1680,20, 100,1680,-20, -100,1680,-20, -100,1680,20, 100,1680,-20,
+ 40,1680,-110, -40,1680,-110, -100,1680,-20, 40,1680,-110,
+ 100,1680,-200, -100,1680,-200, -40,1680,-110, 100,1680,-200,
+ 100,1680,-440, -100,1680,-440, -100,1680,-200, -100,1680,-440,
+ 100,1680,-440, 100,1500,-440, -100,1500,-440, -100,1500,-440,
+ 100,1500,-440, 55,1480,-280, -55,1480,-280, -100,1680,300, -50,1680,160,
+ -100,1400,130, -120,1380,240, -50,1680,160, -80,1680,20, -120,1380,20,
+ -100,1400,130, -83,1660,20, -80,1680,20, -100,1680,-20, -100,1660,-38,
+ -120,1380,20, -88,1620,20, -100,1620,-74, -120,1360,-20, -120,1360,-20,
+ -100,1620,-74, -100,1580,-110, -60,1400,-140, -100,1680,-200,
+ -55,1480,-280, -60,1400,-140, -100,1580,-110, -100,1680,-200,
+ -100,1680,-440, -100,1500,-440, -55,1480,-280, 100,1680,300,
+ 120,1380,240, 100,1400,130, 50,1680,160, 50,1680,160, 100,1400,130,
+ 120,1380,20, 80,1680,20, 83,1660,20, 100,1660,-38, 100,1680,-20,
+ 80,1680,20, 120,1380,20, 120,1360,-20, 100,1620,-74, 88,1620,20,
+ 120,1360,-20, 60,1400,-140, 100,1580,-110, 100,1620,-74, 100,1680,-200,
+ 100,1580,-110, 60,1400,-140, 55,1480,-280, 100,1680,-200, 55,1480,-280,
+ 100,1500,-440, 100,1680,-440, 88,1620,20, 100,1620,-74, 80,1640,-56,
+ 61,1640,20, 61,1640,20, 80,1640,-56, 100,1660,-38, 83,1660,20,
+ -88,1620,20, -61,1640,20, -80,1640,-56, -100,1620,-74, -61,1640,20,
+ -83,1660,20, -100,1660,-38, -80,1640,-56, 35,1780,-80, 35,1780,-440,
+ -35,1780,-440, -35,1780,-80, 35,1780,-80, 35,1680,-80, 35,1680,-440,
+ 35,1780,-440, -35,1780,-80, -35,1780,-440, -35,1680,-440, -35,1680,-80,
+ 35,1780,-80, -35,1780,-80, -35,1680,-80, 35,1680,-80, 35,1780,-440,
+ 35,1680,-440, -35,1680,-440, -35,1780,-440, -100,1400,130, -120,1380,20,
+ 120,1380,20, 100,1400,130, -100,1400,130, 100,1400,130, 120,1380,240,
+ -120,1380,240, -260,580,-80, -55,1480,-280, 0,1500,-360, 0,780,-400,
+ 260,580,-80, 0,780,-400, 0,1500,-360, 55,1480,-280, -50,1380,40,
+ -200,880,400, 200,880,400, 50,1380,40, -200,880,400, -260,580,260,
+ 260,580,260, 200,880,400, -50,1380,40, -140,1220,-40, -260,580,260,
+ -200,880,400, -140,1220,-40, -114,1220,-222, -260,580,-80, -260,580,260,
+ -55,1480,-280, -114,1220,-222, -140,1220,-40, -60,1400,-140,
+ 50,1380,40, 200,880,400, 260,580,260, 140,1220,-40, 140,1220,-40,
+ 260,580,260, 260,580,-80, 114,1220,-222, 55,1480,-280, 60,1400,-140,
+ 140,1220,-40, 114,1220,-222, 260,580,-80, 144,580,-260, 0,780,-400,
+ 144,580,-260, -144,580,-260, 0,780,-400, -260,580,-80, 0,780,-400,
+ -144,580,-260, 0,1400,400, 80,1620,400, -80,1620,400, 0,1400,400,
+ -80,1620,400, -120,1380,240, -120,1380,240, -80,1620,400, -100,1680,340,
+ -120,1380,240, -100,1680,340, -100,1680,300, 0,1400,400, 120,1380,240,
+ 80,1620,400, 120,1380,240, 100,1680,340, 80,1620,400, 120,1380,240,
+ 100,1680,300, 100,1680,340, 0,1400,400, -120,1380,240, 120,1380,240,
+ -60,1400,-140, -140,1220,-40, -45,1380,-20, -45,1380,-20, -140,1220,-40,
+ -50,1380,40, 60,1400,-140, 45,1380,-20, 140,1220,-40, 45,1380,-20,
+ 50,1380,40, 140,1220,-40, 60,1400,-140, 120,1360,-20, 45,1380,-20,
+ 50,1380,40, 45,1380,-20, 120,1360,-20, 50,1380,40, 120,1360,-20,
+ 120,1380,20, -60,1400,-140, -45,1380,-20, -120,1360,-20, -50,1380,40,
+ -120,1360,-20, -45,1380,-20, -50,1380,40, -120,1380,20, -120,1360,-20,
+ 88,1620,20, 61,1640,20, 83,1660,20, 100,1620,-74, 100,1660,-38,
+ 80,1640,-56, -88,1620,20, -83,1660,20, -61,1640,20, -100,1620,-74,
+ -80,1640,-56, -100,1660,-38, -40,1680,-110, -100,1680,-200,
+ -100,1580,-110, -100,1680,-20, -40,1680,-110, -100,1580,-110,
+ 40,1680,-110, 100,1580,-110, 100,1680,-200, 100,1680,-20, 100,1580,-110,
+ 40,1680,-110,
+
+ QUADS, 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15, 16,17,18,19,
+ 20,21,22,23, 24,25,26,27, 28,29,30,31, 32,33,34,35, 36,37,38,39,
+ 40,41,42,43, 44,45,46,47, 48,49,50,51, 52,53,54,55, 56,57,58,59,
+ 60,61,62,63, 64,65,66,67, 68,69,70,71, 72,73,74,75, 76,77,78,79,
+ 80,81,82,83, 84,85,86,87, 88,89,90,91, 92,93,94,95, 96,97,98,99,
+ 100,101,102,103, 104,105,106,107, 108,109,110,111, 112,113,114,115,
+ 116,117,118,119, 120,121,122,123, 124,125,126,127, 128,129,130,131,
+ 132,133,134,135, 136,137,138,139, 140,141,142,143, 144,145,146,147,
+ 148,149,150,151, 152,153,154,155, 156,157,158,159, 160,161,162,163,
+ 164,165,166,167, 168,169,170,171, 172,173,174,175, 176,177,178,179,
+ 180,181,182,183,
+
+ TRIANGLES, 184,185,186, 187,188,189, 190,191,192, 193,194,195,
+ 196,197,198, 199,200,201, 202,203,204, 205,206,207, 208,209,210,
+ 211,212,213, 214,215,216, 217,218,219, 220,221,222, 223,224,225,
+ 226,227,228, 229,230,231, 232,233,234, 235,236,237, 238,239,240,
+ 241,242,243, 244,245,246, 247,248,249, 250,251,252, 253,254,255,
+ 256,257,258, 259,260,261, 262,263,264, 265,266,267, 268,269,270,
+
+ ENDOFDATA
+};
+
+static unsigned short classic_bishop_data[] = {
+ SPIN,16,
+ 400,0,SEAM,400,200,SEAM,250,300,SEAM,250,400,SEAM,150,700,SEAM,120,940,
+ SEAM,250,940,SEAM,170,1100,SEAM,170,1220,SEAM,220,1320,SEAM,220,1480,
+ SEAM,100,1600,SEAM,80,1700,SEAM,120,1770,SEAM,80,1840,0,1840,
+ ENDOFDATA
+};
+
+static unsigned short classic_queen_data[] = {
+ SPIN,16,
+ 480,0,SEAM,480,220,SEAM,340,400,SEAM,340,500,SEAM,180,800,SEAM,140,1180,
+ SEAM,290,1180,SEAM,180,1360,SEAM,180,1520,SEAM,200,1780,SEAM,270,1920,
+ SEAM,240,2000,SEAM,170,2000,SEAM,95,2080,SEAM,70,2080,SEAM,90,2140,
+ SEAM,70,2200,0,2200,
+ ENDOFDATA
+};
+
+static unsigned short classic_king_data[] = {
+ SPIN,16,
+ 500,0,SEAM,500,200,SEAM,350,300,SEAM,350,460,SEAM,200,760,SEAM,140,1260,
+ SEAM,300,1260,SEAM,200,1460,SEAM,200,1560,SEAM,280,1910,SEAM,160,1970,
+ SEAM,160,2010,0,2010,
+
+ VERTICES,
+ -30,2010,35, 30,2010,35, 30,2310,35, -30,2310,35, -90,2110,35,
+ -30,2110,35, -30,2210,35, -90,2210,35, 90,2110,35, 90,2210,35,
+ 30,2210,35, 30,2110,35, 30,2010,-35, -30,2010,-35, -30,2310,-35,
+ 30,2310,-35, -30,2110,-35, -90,2110,-35, -90,2210,-35, -30,2210,-35,
+ 30,2110,-35, 30,2210,-35, 90,2210,-35, 90,2110,-35, -90,2110,35,
+ -90,2210,35, -90,2210,-35, -90,2110,-35, -30,2010,35, -30,2110,35,
+ -30,2110,-35, -30,2010,-35, -30,2210,30, -30,2310,30, -30,2310,-30,
+ -30,2210,-30, 90,2110,-35, 90,2210,-35, 90,2210,35, 90,2110,35,
+ 30,2010,-35, 30,2110,-35, 30,2110,35, 30,2010,35, 30,2210,-35,
+ 30,2310,-35, 30,2310,35, 30,2210,35, -90,2210,-35, -90,2210,35,
+ -30,2210,35, -30,2210,-35, 30,2210,-35, 30,2210,35, 90,2210,35,
+ 90,2210,-35, -30,2310,-35, -30,2310,35, 30,2310,35, 30,2310,-35,
+
+ QUADS, 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15, 16,17,18,19,
+ 20,21,22,23, 24,25,26,27, 28,29,30,31, 32,33,34,35, 36,37,38,39,
+ 40,41,42,43, 44,45,46,47, 48,49,50,51, 52,53,54,55, 56,57,58,59,
+
+ ENDOFDATA
+};
+
+static unsigned short knight_data[] = {
+ VERTICES, SETBACKREF,0, 7910,8863,0, 7790,8863,1326, 7433,8863,2611,
+ 6850,8863,3817, 6059,8863,4907, 5084,8863,5847, 3955,8863,6611,
+ 2705,8863,7173, 1373,8863,7517, 0,8863,7633, -1373,8863,7517,
+ -2705,8863,7173, -3955,8863,6611, -5084,8863,5847, -6059,8863,4907,
+ -6850,8863,3817, -7433,8863,2611, -7790,8863,1326, -7910,8863,0,
+ -7790,8863,-1326, -7433,8863,-2611, -6850,8863,-3817,
+ -6059,8863,-4907, -5066,8863,-5896, -3955,8863,-6611,
+ -2705,8863,-7173, -1373,8863,-7517, 0,8863,-7633, 1373,8863,-7517,
+ 2705,8863,-7173, 3955,8863,-6611, 5066,8863,-5896, 6059,8863,-4907,
+ 6850,8863,-3817, 7433,8863,-2611, 7790,8863,-1326, -1183,11744,7939,
+ -1183,12003,7939, -1183,14019,6547, -1183,16307,5288,
+ -1183,16555,5281, -1183,20128,2191, -1134,20304,2131,
+ -1183,20516,2156, -1417,21874,1842, -1417,23109,2185,
+ -1417,23961,3121, -1417,24001,4252, 0,23917,5637, -1418,23893,5418,
+ -1151,23389,6664, -1151,23501,6906, -1151,23806,6987,
+ -1151,24102,6987, -1151,24209,7189, -1151,24371,7513,
+ -1151,24605,7715, -1151,24939,7674, -1313,25568,7149,
+ -1313,25695,7149, -1598,26707,7610, 0,26837,7841, 0,27354,8076,
+ -1598,27262,7839, -1598,27842,7723, 0,27919,7998, 0,28449,7606,
+ -1598,28309,7303, -1302,28414,6723, 0,28544,6980, 0,28540,6197,
+ -1187,28523,5990, -1304,28447,4204, -1158,28789,1627,
+ -561,28931,-1220, -357,29608,-1244, -357,30527,-1441,
+ -357,31249,-1837, -357,31511,-2627, -357,31511,-3484,
+ -357,31118,-4143, -357,30264,-4538, -436,29406,-5256, 0,29409,-5243,
+ -2207,29018,-6763, -914,28658,-6964, 0,26292,-7237, -1305,26324,-7143,
+ -806,23401,-6784, -812,20723,-6228, -796,16757,-6210,
+ -1559,24934,7435, -1566,24633,7460, -1531,24429,7334,
+ -1475,24293,7131, -1440,24203,7004, -1372,23935,7015,
+ -1364,23606,6868, -1389,23515,6705, -1687,28010,6952,
+ -1687,27926,7343, -1687,27629,7491, -1687,27324,7552,
+ -1687,27032,7432, -1687,26791,7148, -1642,27135,7165,
+ -1642,27254,7304, -1642,27397,7364, -1642,27546,7334,
+ -1642,27693,7261, -1642,27737,7088, -1611,10591,8159,
+ -888,9327,-8560, -4491,13292,1032, -3840,15084,786, -3412,17397,397,
+ -2937,20005,-35, -5108,11669,1240, -6344,10251,1395, -6345,10246,1248,
+ -5109,11664,1092, -2964,20022,-132, -3413,17393,250, -3841,15079,638,
+ -4491,13288,885, -3743,13207,-535, -3085,15092,-710, -2727,17642,-878,
+ -2569,20636,-797, -4348,11575,-324, -5584,10108,-169,
+ -5403,10079,-1732, -4167,11644,-1888, -2465,20842,-2651,
+ -2522,18130,-2392, -2905,15407,-2077, -3562,13227,-1951,
+ -3901,13568,-3294, -3243,15993,-3519, -2861,18863,-3735,
+ -2776,22447,-4309, -4486,11792,-3132, -5783,9930,-2931,
+ -5783,9930,-3054, -4486,11792,-3255, -2776,22438,-4430,
+ -2861,18863,-3858, -3243,15993,-3641, -3901,13568,-3417,
+ -6199,9466,4558, -5766,10642,5726, -5228,11829,6090, -4801,12891,6048,
+ -4155,14560,5246, -3546,16847,3719, -3334,17643,2937,
+ -2860,20062,1230, -4822,12054,7102, -5325,10909,7208,
+ -5732,9938,6026, -4026,14701,5522, -2852,20170,1447, -3319,17801,3175,
+ -3538,16955,3935, -4090,13256,1679, -2874,20073,676, -3706,15083,1464,
+ -3301,17348,1117, -5931,10206,1996, -4695,11624,1840,
+ -4445,11658,2844, -5681,10240,3000, -3074,17398,2202,
+ -3456,15117,2468, -3840,13290,2683, -4642,13358,4019,
+ -4257,15194,3908, -6017,10188,3746, -5237,11714,4039,
+ -5621,11218,5077, -5026,12862,5058, -5134,10861,-3154,
+ -4193,12680,-3336, -2832,20609,-4118, -3052,17428,-3750,
+ -3572,14780,-3529, -3579,14774,-3623, -3059,17422,-3843,
+ -2839,20596,-4211, -4200,12674,-3429, -5141,10855,-3248,
+ -3908,13562,-3510, -3250,15987,-3735, -2868,18857,-3952,
+ -4492,11786,-3348, -5789,9924,-3148, -4817,11321,-3298,
+ -5465,10389,-3198, -4054,13118,-3470, -4346,12230,-3389,
+ -2853,19681,-4056, -2825,21511,-4367, -3155,16705,-3789,
+ -2963,18140,-3897, -3744,14168,-3567, -3415,15381,-3679,
+ -845,13482,-6604, -945,10997,-7893, -981,11110,-7735,
+ -859,13469,-6526, -899,9307,-8439, -813,16486,-6146, -832,20681,-6100,
+ -826,23358,-6656, -882,10149,-8148, -913,12323,-7139,
+ -822,14910,-6353, -817,18235,-6210, -827,21937,-6382,
+ -846,21937,-6341, -841,14912,-6313, -931,12326,-7098,
+ -901,10152,-8107, -844,23359,-6615, -851,20681,-6059,
+ -831,16487,-6105, -919,9307,-8399, -869,13482,-6492, -999,11113,-7694,
+ -860,9726,-8255, -942,10578,-7958, -962,11715,-7413, -900,12896,-6796,
+ -863,14065,-6404, -818,15760,-6221, -828,17367,-6171,
+ -854,19800,-5994, -848,21309,-6200, -843,22566,-6482,
+ -3407,15409,-3785, -3736,14196,-3673, -2911,18365,-4048,
+ -3147,16733,-3895, -2726,21608,-4455, -2808,19905,-4191,
+ -4338,12259,-3495, -4046,13146,-3576, -5457,10418,-3304,
+ -4809,11349,-3404, -4484,11815,-3454, -2715,22288,-4534,
+ -2832,19035,-4066, -3242,16015,-3841, -3900,13590,-3616,
+ -5133,10883,-3354, -4171,12742,-3524, -2803,20773,-4339,
+ -3051,17450,-3949, -3571,14803,-3729, -4979,11072,-3368,
+ -5619,10185,-3279, -4119,12924,-3556, -4411,12037,-3475,
+ -2801,20363,-4269, -2721,21826,-4489, -3099,17092,-3922,
+ -2887,18618,-4038, -3653,14499,-3701, -3325,15712,-3813,
+ -3489,15106,-3757, -3818,13893,-3645, -3011,17758,-3971,
+ -3194,16374,-3868, -2755,21085,-4385, -2815,19494,-4139,
+ -4265,12481,-3515, -3973,13368,-3596, -5304,10595,-3318,
+ -4664,11477,-3407, -5441,10207,-3361, -5350,10338,-3375,
+ -5139,10672,-3428, -5058,10742,-3431, -4831,11101,-3457,
+ -4742,11228,-3470, -4516,11559,-3504, -4423,11693,-3518,
+ -4277,12079,-3558, -4232,12180,-3571, -4138,12522,-3597,
+ -4094,12603,-3609, -3979,12935,-3675, -3943,13043,-3671,
+ -3852,13383,-3699, -3813,13496,-3705, -3692,13947,-3767,
+ -3653,14073,-3790, -3506,14587,-3772, -3467,14685,-3777,
+ -3349,15192,-3888, -3308,15317,-3887, -3162,15800,-3957,
+ -3119,15954,-3961, -3009,16528,-3946, -3002,16637,-3937,
+ -2914,17260,-4014, -2909,17347,-4006, -2834,17893,-4049,
+ -2813,18060,-4060, -2760,18849,-4232, -2746,18968,-4242,
+ -850,22569,-6438, -855,21313,-6156, -861,19804,-5949,
+ -834,17371,-6127, -824,15765,-6176, -869,14070,-6360,
+ -906,12901,-6751, -968,11720,-7368, -948,10645,-7895, -865,9731,-8211,
+ -1006,11164,-7630, -875,13487,-6447, -926,9310,-8354,
+ -837,16490,-6061, -857,20684,-6015, -867,23379,-6515,
+ -907,10157,-8062, -937,12331,-7053, -847,14917,-6268,
+ -842,18236,-6111, -852,21941,-6297, -885,9891,-8156, -985,10905,-7724,
+ -947,11969,-7255, -885,13125,-6649, -858,14493,-6314,
+ -839,16049,-6111, -836,17735,-6083, -859,20244,-5982,
+ -891,21559,-6157, -848,22883,-6508, -851,22255,-6367,
+ -856,20999,-6085, -867,19042,-6000, -836,16930,-6094,
+ -835,15341,-6222, -880,13646,-6405, -916,12540,-6953,
+ -981,11337,-7564, -927,10370,-7988, -932,9518,-8285, -931,9583,-8174,
+ -863,9671,-8145, -892,9982,-8037, -903,10075,-7996, -952,10454,-7865,
+ -961,10550,-7832, -1008,10963,-7617, -1018,11105,-7567,
+ -996,11458,-7405, -992,11582,-7342, -972,12080,-7057,
+ -968,12210,-6984, -935,12620,-6792, -931,12759,-6714,
+ -914,13199,-6441, -910,13346,-6359, -915,13767,-6194,
+ -910,13941,-6175, -890,14633,-6107, -886,14783,-6091,
+ -864,15476,-6035, -859,15645,-6017, -870,16062,-5957,
+ -873,16231,-5936, -853,17048,-5965, -861,17185,-5974,
+ -879,17812,-5997, -885,17961,-5997, -851,18486,-6138,
+ -865,18526,-5933, -872,18761,-5875, -870,19337,-5971,
+ -864,19470,-5784, -937,19590,-5786, -833,19023,-6126,
+ -851,20344,-5894, -851,20576,-5912, -855,21086,-5973,
+ -854,21224,-6003, -871,21651,-6070, -852,21853,-6116,
+ -850,22332,-6224, -849,22490,-6259, -831,22924,-6338,
+ -834,23240,-6364, -2743,19661,-4287, -2740,19863,-4312,
+ -2723,20501,-4469, -2705,20711,-4503, -2661,21262,-4565,
+ -2658,21427,-4593, -2687,22088,-4631, -2695,22209,-4643,
+ -2774,23170,-4392, -2633,23103,-4527, -2681,22439,-4516,
+ -2656,22665,-4573, -2552,22727,-4653, -2534,23015,-4628,
+ -2607,23397,-4556, -2759,23681,-4398, -2740,24136,-4370,
+ -2610,24100,-4580, -2412,24481,-5089, -2671,24389,-4569,
+ -2397,24935,-5652, -2562,25022,-5528, -939,23708,-6566,
+ -1009,24359,-6776, -1095,24912,-6886, -1049,24117,-6493,
+ -990,23894,-6415, -2290,23837,-4814, -2312,23612,-4723,
+ -2183,24804,-5574, -2191,24632,-5391, -1156,24771,-6650,
+ -1154,24624,-6586, -1104,24526,-6656, -1281,9161,-8432,
+ -2524,9161,-8046, -3691,9161,-7572, -4745,9161,-6945,
+ -5662,9127,-6096, -3697,9192,-7581, -2531,9192,-8056,
+ -4753,9183,-6951, -5664,9161,-6101, -5664,9185,-6101,
+ -4753,9207,-6951, -2531,9216,-8055, -3697,9216,-7581,
+ -3684,9232,-7560, -2518,9232,-8034, -4740,9223,-6930,
+ -5651,9200,-6080, -2828,20259,1366, -2798,20256,1187, -2820,20237,692,
+ -2843,20292,-25, -2874,20473,735, -2975,20508,90, -2474,20772,-759,
+ -2660,20879,-691, -2471,21553,-1445, -2498,22175,-1940,
+ -2471,24346,-2830, -2556,22373,-1903, -2528,21595,-1351,
+ -2493,24314,-2936, -2576,22239,-2123, -2548,21461,-1571,
+ -2823,20635,1307, -2741,20503,1328, -1490,23972,5392,
+ -1489,24080,4226, -1489,24040,3095, -1489,23188,2159,
+ -1489,21953,1816, -2479,22156,182, -1515,23830,2117, -1605,24415,3131,
+ -1599,24460,4263, -1580,24357,5431, -1448,23885,6743,
+ -1252,24770,5442, -1271,24873,4274, -1277,24828,3142,
+ -1389,24618,2016, -1479,24733,1993, -1301,25010,3165,
+ -1295,25055,4297, -1391,24890,5460, -1512,25216,5507,
+ -1602,25353,4317, -1608,25308,3186, -1979,23458,-29, -1320,25312,1928,
+ -1495,25055,546, -2438,25790,-488, -1605,25585,5599, -1583,26793,6150,
+ -1850,26272,4298, -1578,27435,7117, -1658,27625,6884,
+ -1671,27398,6846, -1678,27176,6937, -1715,27784,6626,
+ -1744,27323,6551, -1753,26904,6776, -1884,28809,-1688,
+ -1555,28655,1620, -1658,28252,4204, -1581,28263,5997,
+ -1567,28312,6790, -1935,27827,4220, -1818,28249,1603,
+ -1570,27742,6195, -1532,27288,6120, -2038,27074,4245, -1418,28416,228,
+ -413,30264,-4539, -424,31094,-4152, -418,31478,-3497,
+ -410,31453,-2653, -410,31190,-1863, -410,30468,-1467,
+ -410,29550,-1270, -411,31041,-1902, -448,31253,-2696,
+ -449,31323,-3466, -425,31182,-3496, -411,31060,-2738,
+ -387,30899,-1932, -316,30806,-1957, -335,30952,-2766,
+ -353,31089,-3521, -322,31007,-3540, -303,30871,-2786,
+ -284,30725,-1976, -304,30630,-1993, -323,30776,-2802,
+ -342,30912,-3557, -396,30843,-3565, -378,30707,-2811,
+ -358,30561,-2001, -414,30477,-2013, -433,30623,-2822,
+ -452,30759,-3576, -474,30560,-3616, -456,30424,-2861,
+ -436,30278,-2052, -349,30194,-2077, -368,30340,-2886,
+ -386,30477,-3641, -309,30389,-3665, -291,30253,-2911,
+ -271,30107,-2102, -267,29996,-2124, -286,30142,-2933,
+ -305,30278,-3688, -376,30179,-3700, -357,30043,-2945,
+ -338,29897,-2136, -420,29789,-2150, -439,29935,-2959,
+ -458,30071,-3713, -500,29883,-3751, -463,29601,-2187,
+ -470,30974,-4049, -462,30153,-4391, -466,30563,-4220,
+ -410,30009,-1368, -725,29372,-3225, -677,29335,-5130,
+ -908,29205,-3300, -632,29533,-4803, -2587,28768,-3408,
+ -2730,28611,-3456, -2404,28568,-6916, -2413,28849,-6612,
+ -1904,26715,1801, -1394,25919,831, -2224,27270,-3994,
+ -2730,28438,-3011, -2587,28570,-2864, -2826,28152,-3163,
+ -2476,28668,-6523, -2476,28433,-6776, -2787,28338,-3507,
+ -2216,27658,-3972, -2207,27950,-5907, -2311,28216,-6128,
+ -2320,27876,-3971, -2311,28118,-6301, -2311,27845,-6252,
+ -2320,27703,-3749, -2320,27084,-3798, -2320,26986,-4070,
+ -2698,26705,-4014, -2557,26974,-3547, -2557,27739,-3485,
+ -2572,27738,-6362, -2436,28204,-6533, -2436,28421,-6303,
+ -2556,28092,-3822, -2431,28142,-6975, -2544,27863,-6726,
+ -2266,28229,-1686, -1939,28156,-1065, -2569,27943,-2270,
+ -2381,27545,-1682, -2799,27594,-3104, -2750,27866,-2738,
+ -2539,27578,-6309, -2720,26853,-3133, -2788,26461,-3776,
+ -1061,27543,-7078, -1780,27941,135, -1859,27747,-527, -1756,27784,691,
+ -1855,27001,736, -1950,26711,19, -1964,27006,-630, -2342,26955,-1898,
+ -2595,25515,-3113, -2147,27855,132, -2126,27722,601, -2213,27691,-428,
+ -2210,27061,639, -2290,26816,34, -2302,27065,-515, -2347,27680,100,
+ -2335,27602,376, -2386,27584,-229, -2385,27213,398, -2432,27069,42,
+ -2439,27215,-281, -2481,27452,103, -1786,24263,399, -2278,24851,-562,
+ -2372,25143,-1163, 7383,9172,0, 7270,9172,-1487, 6937,9172,-2929,
+ 6393,9172,-4281, 1282,9172,-8433, 0,9172,-8563, 1301,9439,8159,
+ 2371,9313,7844, 3857,9286,7355, 4477,9172,6559, 5704,9174,5179,
+ 6393,9172,4281, 6937,9172,2929, 7270,9172,1487, -7270,9172,-1487,
+ -6937,9172,-2929, -6393,9172,-4281, -1282,9172,-8433, 0,9339,8274,
+ -1301,9439,8159, -2371,9313,7844, -3857,9286,7355, -4477,9172,6559,
+ -5704,9174,5179, -6393,9172,4281, -6937,9172,2929, -7270,9172,1487,
+ -796,9467,8260, 0,9503,8356, 0,9667,8438, -796,9666,8325,
+ -807,10584,8327, -7383,9172,0, 796,9467,8260, 796,9666,8325,
+ 807,10584,8327, 0,10584,8457, 0,11744,8130, 1183,11744,7939,
+ 1183,12003,7939, 0,12003,8130, 0,14019,6737, 1183,14019,6547,
+ 1183,16307,5288, 0,16307,5479, 0,16555,5472, 1183,16555,5281,
+ 1183,20128,2191, 0,20128,2382, 0,20304,2322, 1134,20304,2131,
+ 1183,20516,2156, 0,20516,2346, 0,21898,2060, 1417,21874,1842,
+ 1417,23109,2185, 0,23133,2404, 0,23985,3339, 1417,23961,3121,
+ 1417,24001,4252, 0,24025,4470, 1418,23893,5418, 1151,23389,6664,
+ 0,23394,6882, 0,23506,7125, 1151,23501,6906, 1151,23806,6987,
+ 0,23811,7205, 0,24107,7205, 1151,24102,6987, 1151,24209,7189,
+ 0,24213,7407, 0,24376,7731, 1151,24371,7513, 1151,24605,7715,
+ 0,24610,7933, 0,24944,7892, 1151,24939,7674, 1313,25568,7149,
+ 0,25562,7367, 0,25689,7367, 1313,25695,7149, 1598,26707,7610,
+ 1598,27262,7839, 1598,27842,7723, 1598,28309,7303, 1302,28414,6723,
+ 1187,28523,5990, 1304,28447,4204, 0,28469,4435, 0,28654,1893,
+ 1158,28789,1627, 561,28931,-1220, 0,29310,-864, 0,29574,-1062,
+ 357,29608,-1244, 357,30527,-1441, 0,30496,-1259, 0,31221,-1655,
+ 357,31249,-1837, 357,31511,-2627, 0,31485,-2445, 0,31485,-3302,
+ 357,31511,-3484, 357,31118,-4143, 0,31089,-3961, 0,30233,-4356,
+ 357,30264,-4538, 436,29406,-5256, 0,29018,-6407, 2207,29018,-6763,
+ 914,28658,-6964, 0,28472,-7040, 1305,26324,-7143, 806,23401,-6784,
+ 0,23246,-6890, 0,20735,-6319, 812,20723,-6228, 796,16757,-6210,
+ 0,17171,-6133, 1559,24934,7435, 1566,24633,7460, 1531,24429,7334,
+ 1475,24293,7131, 1440,24203,7004, 1372,23935,7015, 1364,23606,6868,
+ 1389,23515,6705, 1687,28010,6952, 1687,27926,7343, 1687,27629,7491,
+ 1687,27324,7552, 1687,27032,7432, 1687,26791,7148, 1642,27135,7165,
+ 1642,27254,7304, 1642,27397,7364, 1642,27546,7334, 1642,27693,7261,
+ 1642,27737,7088, 1611,10591,8159, 888,9327,-8560, 4491,13292,1032,
+ 3840,15084,786, 3412,17397,397, 2937,20005,-35, 5108,11669,1240,
+ 6344,10251,1395, 6345,10246,1248, 5109,11664,1092, 2964,20022,-132,
+ 3413,17393,250, 3841,15079,638, 4491,13288,885, 3743,13207,-535,
+ 3085,15092,-710, 2727,17642,-878, 2569,20636,-797, 4348,11575,-324,
+ 5584,10108,-169, 5403,10079,-1732, 4167,11644,-1888,
+ 2465,20842,-2651, 2522,18130,-2392, 2905,15407,-2077,
+ 3562,13227,-1951, 3901,13568,-3294, 3243,15993,-3519,
+ 2861,18863,-3735, 2776,22447,-4309, 4486,11792,-3132, 5783,9930,-2931,
+ 5783,9930,-3054, 4486,11792,-3255, 2776,22438,-4430, 2861,18863,-3858,
+ 3243,15993,-3641, 3901,13568,-3417, 6199,9466,4558, 5766,10642,5726,
+ 5228,11829,6090, 4801,12891,6048, 4155,14560,5246, 3546,16847,3719,
+ 3334,17643,2937, 2860,20062,1230, 4822,12054,7102, 5325,10909,7208,
+ 5732,9938,6026, 4026,14701,5522, 2852,20170,1447, 3319,17801,3175,
+ 3538,16955,3935, 4090,13256,1679, 2874,20073,676, 3706,15083,1464,
+ 3301,17348,1117, 5931,10206,1996, 4695,11624,1840, 4445,11658,2844,
+ 5681,10240,3000, 3074,17398,2202, 3456,15117,2468, 3840,13290,2683,
+ 4642,13358,4019, 4257,15194,3908, 6017,10188,3746, 5237,11714,4039,
+ 5621,11218,5077, 5026,12862,5058, 5134,10861,-3154, 4193,12680,-3336,
+ 2832,20609,-4118, 3052,17428,-3750, 3572,14780,-3529,
+ 3579,14774,-3623, 3059,17422,-3843, 2839,20596,-4211,
+ 4200,12674,-3429, 5141,10855,-3248, 3908,13562,-3510,
+ 3250,15987,-3735, 2868,18857,-3952, 4492,11786,-3348, 5789,9924,-3148,
+ 4817,11321,-3298, 5465,10389,-3198, 4054,13118,-3470,
+ 4346,12230,-3389, 2853,19681,-4056, 2825,21511,-4367,
+ 3155,16705,-3789, 2963,18140,-3897, 3744,14168,-3567,
+ 3415,15381,-3679, 0,14037,-6616, 845,13482,-6604, 945,10997,-7893,
+ 0,11066,-7866, 981,11110,-7735, 859,13469,-6526, 899,9307,-8439,
+ 813,16486,-6146, 832,20681,-6100, 826,23358,-6656, 882,10149,-8148,
+ 913,12323,-7139, 822,14910,-6353, 817,18235,-6210, 827,21937,-6382,
+ 846,21937,-6341, 841,14912,-6313, 931,12326,-7098, 901,10152,-8107,
+ 844,23359,-6615, 851,20681,-6059, 831,16487,-6105, 919,9307,-8399,
+ 869,13482,-6492, 999,11113,-7694, 860,9726,-8255, 942,10578,-7958,
+ 962,11715,-7413, 900,12896,-6796, 863,14065,-6404, 818,15760,-6221,
+ 828,17367,-6171, 854,19800,-5994, 848,21309,-6200, 843,22566,-6482,
+ 3407,15409,-3785, 3736,14196,-3673, 2911,18365,-4048,
+ 3147,16733,-3895, 2726,21608,-4455, 2808,19905,-4191,
+ 4338,12259,-3495, 4046,13146,-3576, 5457,10418,-3304,
+ 4809,11349,-3404, 4484,11815,-3454, 2715,22288,-4534,
+ 2832,19035,-4066, 3242,16015,-3841, 3900,13590,-3616,
+ 5133,10883,-3354, 4171,12742,-3524, 2803,20773,-4339,
+ 3051,17450,-3949, 3571,14803,-3729, 4979,11072,-3368,
+ 5619,10185,-3279, 4119,12924,-3556, 4411,12037,-3475,
+ 2801,20363,-4269, 2721,21826,-4489, 3099,17092,-3922,
+ 2887,18618,-4038, 3653,14499,-3701, 3325,15712,-3813,
+ 3489,15106,-3757, 3818,13893,-3645, 3011,17758,-3971,
+ 3194,16374,-3868, 2755,21085,-4385, 2815,19494,-4139,
+ 4265,12481,-3515, 3973,13368,-3596, 5304,10595,-3318,
+ 4664,11477,-3407, 5441,10207,-3361, 5350,10338,-3375,
+ 5139,10672,-3428, 5058,10742,-3431, 4831,11101,-3457,
+ 4742,11228,-3470, 4516,11559,-3504, 4423,11693,-3518,
+ 4277,12079,-3558, 4232,12180,-3571, 4138,12522,-3597,
+ 4094,12603,-3609, 3979,12935,-3675, 3943,13043,-3671,
+ 3852,13383,-3699, 3813,13496,-3705, 3692,13947,-3767,
+ 3653,14073,-3790, 3506,14587,-3772, 3467,14685,-3777,
+ 3349,15192,-3888, 3308,15317,-3887, 3162,15800,-3957,
+ 3119,15954,-3961, 3009,16528,-3946, 3002,16637,-3937,
+ 2914,17260,-4014, 2909,17347,-4006, 2834,17893,-4049,
+ 2813,18060,-4060, 2760,18849,-4232, 2746,18968,-4242, 850,22569,-6438,
+ 855,21313,-6156, 860,19804,-5949, 834,17371,-6127, 824,15765,-6176,
+ 869,14070,-6360, 906,12901,-6751, 968,11720,-7368, 948,10645,-7895,
+ 865,9731,-8211, 1006,11164,-7630, 875,13487,-6447, 926,9310,-8354,
+ 837,16490,-6061, 857,20684,-6015, 867,23379,-6515, 907,10157,-8062,
+ 937,12331,-7053, 847,14917,-6268, 842,18236,-6111, 852,21941,-6297,
+ 885,9891,-8156, 985,10905,-7724, 947,11969,-7255, 885,13125,-6649,
+ 858,14493,-6314, 839,16049,-6111, 836,17735,-6083, 859,20244,-5982,
+ 891,21559,-6157, 848,22883,-6508, 851,22255,-6367, 856,20999,-6085,
+ 867,19042,-6000, 836,16930,-6094, 835,15341,-6222, 880,13646,-6405,
+ 916,12540,-6953, 981,11337,-7564, 927,10370,-7988, 932,9518,-8285,
+ 931,9583,-8174, 863,9671,-8145, 892,9982,-8037, 903,10075,-7996,
+ 952,10454,-7865, 961,10550,-7832, 1008,10963,-7617, 1018,11105,-7567,
+ 996,11458,-7405, 992,11582,-7342, 972,12080,-7057, 968,12210,-6984,
+ 935,12620,-6792, 931,12759,-6714, 914,13199,-6441, 910,13346,-6359,
+ 915,13767,-6194, 910,13941,-6175, 890,14633,-6107, 886,14783,-6091,
+ 864,15476,-6035, 859,15645,-6017, 870,16062,-5957, 873,16231,-5936,
+ 853,17048,-5965, 861,17185,-5974, 879,17812,-5997, 885,17961,-5997,
+ 851,18486,-6138, 865,18526,-5933, 872,18761,-5875, 870,19337,-5971,
+ 864,19470,-5784, 937,19590,-5786, 833,19023,-6126, 851,20344,-5894,
+ 851,20576,-5912, 855,21086,-5973, 854,21224,-6003, 871,21651,-6070,
+ 852,21853,-6116, 850,22332,-6224, 849,22490,-6259, 831,22924,-6338,
+ 834,23240,-6364, 2743,19661,-4287, 2740,19863,-4312, 2723,20501,-4469,
+ 2705,20711,-4503, 2661,21262,-4565, 2658,21427,-4593,
+ 2687,22088,-4631, 2695,22209,-4643, 2774,23170,-4392,
+ 2633,23103,-4527, 2681,22439,-4516, 2656,22665,-4573,
+ 2552,22727,-4653, 2534,23015,-4628, 2607,23397,-4556,
+ 2759,23681,-4398, 2740,24136,-4370, 2610,24100,-4580,
+ 2412,24481,-5089, 2671,24389,-4569, 2397,24935,-5652,
+ 2562,25022,-5528, 939,23708,-6566, 1009,24359,-6776, 1095,24912,-6886,
+ 1049,24117,-6493, 990,23894,-6415, 2290,23837,-4814, 2312,23612,-4723,
+ 2183,24804,-5574, 2191,24632,-5391, 1156,24771,-6650,
+ 1154,24624,-6586, 1104,24526,-6656, 0,9161,-8562, 1281,9161,-8432,
+ 2524,9161,-8046, 3691,9161,-7572, 4745,9161,-6945, 5662,9127,-6096,
+ 3697,9192,-7581, 2531,9192,-8056, 4753,9183,-6951, 5664,9161,-6101,
+ 5664,9185,-6101, 4753,9207,-6951, 2531,9216,-8055, 3697,9216,-7581,
+ 3684,9232,-7560, 2518,9232,-8034, 4740,9223,-6930, 5651,9200,-6080,
+ 2828,20259,1366, 2798,20256,1187, 2820,20237,692, 2843,20292,-25,
+ 2874,20473,735, 2975,20508,90, 2474,20772,-759, 2660,20879,-691,
+ 2471,21553,-1445, 2498,22175,-1940, 2471,24346,-2830,
+ 2556,22373,-1903, 2528,21595,-1351, 2493,24314,-2936,
+ 2576,22239,-2123, 2548,21461,-1571, 2823,20635,1307, 2741,20503,1328,
+ 1490,23972,5392, 1489,24080,4226, 1489,24040,3095, 1489,23188,2159,
+ 1489,21953,1816, 2479,22156,182, 1515,23830,2117, 1605,24415,3131,
+ 1599,24460,4263, 1580,24357,5431, 1448,23885,6743, 1252,24770,5442,
+ 1271,24873,4274, 1277,24828,3142, 1389,24618,2016, 1479,24733,1993,
+ 1301,25010,3165, 1295,25055,4297, 1391,24890,5460, 1512,25216,5507,
+ 1602,25353,4317, 1608,25308,3186, 1979,23458,-29, 1320,25312,1928,
+ 1495,25055,546, 2438,25790,-488, 1605,25585,5599, 1583,26793,6150,
+ 1850,26272,4298, 1578,27435,7117, 1658,27625,6884, 1671,27398,6846,
+ 1678,27176,6937, 1715,27784,6626, 1744,27323,6551, 1753,26904,6776,
+ 1884,28809,-1688, 1555,28655,1620, 1658,28252,4204, 1581,28263,5997,
+ 1567,28312,6790, 1935,27827,4220, 1818,28249,1603, 1570,27742,6195,
+ 1532,27288,6120, 2038,27074,4245, 1418,28416,228, 413,30264,-4539,
+ 424,31094,-4152, 418,31478,-3497, 410,31453,-2653, 410,31190,-1863,
+ 410,30468,-1467, 410,29550,-1270, 411,31041,-1902, 448,31253,-2696,
+ 449,31323,-3466, 425,31182,-3496, 411,31060,-2738, 387,30899,-1932,
+ 316,30806,-1957, 335,30952,-2766, 353,31089,-3521, 322,31007,-3540,
+ 303,30871,-2786, 284,30725,-1976, 304,30630,-1993, 323,30776,-2802,
+ 342,30912,-3557, 396,30843,-3565, 378,30707,-2811, 358,30561,-2001,
+ 414,30477,-2013, 433,30623,-2822, 452,30759,-3576, 474,30560,-3616,
+ 456,30424,-2861, 436,30278,-2052, 349,30194,-2077, 368,30340,-2886,
+ 386,30477,-3641, 309,30389,-3665, 291,30253,-2911, 271,30107,-2102,
+ 267,29996,-2124, 286,30142,-2933, 305,30278,-3688, 376,30179,-3700,
+ 357,30043,-2945, 338,29897,-2136, 420,29789,-2150, 439,29935,-2959,
+ 458,30071,-3713, 500,29883,-3751, 463,29601,-2187, 470,30974,-4049,
+ 462,30153,-4391, 466,30563,-4220, 410,30009,-1368, 725,29372,-3225,
+ 677,29335,-5130, 908,29205,-3300, 632,29533,-4803, 2587,28768,-3408,
+ 2730,28611,-3456, 2404,28568,-6916, 2413,28849,-6612,
+ 1904,26715,1801, 1394,25919,831, 2224,27270,-3994, 2730,28438,-3011,
+ 2587,28570,-2864, 2826,28152,-3163, 2476,28668,-6523,
+ 2476,28433,-6776, 2787,28338,-3507, 2216,27658,-3972,
+ 2207,27950,-5907, 2311,28216,-6128, 2320,27876,-3971,
+ 2311,28118,-6301, 2311,27845,-6252, 2320,27703,-3749,
+ 2320,27084,-3798, 2320,26986,-4070, 2698,26705,-4014,
+ 2557,26974,-3547, 2557,27739,-3485, 2572,27738,-6362,
+ 2436,28204,-6533, 2436,28421,-6303, 2556,28092,-3822,
+ 2431,28142,-6975, 2544,27863,-6726, 2266,28229,-1686,
+ 1939,28156,-1065, 2569,27943,-2270, 2381,27545,-1682,
+ 2799,27594,-3104, 2750,27866,-2738, 2539,27578,-6309,
+ 2720,26853,-3133, 2788,26461,-3776, 1061,27543,-7078, 1780,27941,135,
+ 1859,27747,-527, 1756,27784,691, 1855,27001,736, 1950,26711,19,
+ 1964,27006,-630, 2342,26955,-1898, 2595,25515,-3113, 2147,27855,132,
+ 2126,27722,601, 2213,27691,-428, 2210,27061,639, 2290,26816,34,
+ 2302,27065,-515, 2347,27680,100, 2335,27602,376, 2386,27584,-229,
+ 2385,27213,398, 2432,27069,42, 2439,27215,-281, 2481,27452,103,
+ 1786,24263,399, 2278,24851,-562, 2372,25143,-1163, -2567,23141,-2607,
+ -2513,23156,-2494, 2513,23156,-2494, 2567,23141,-2607,
+
+ TRIANGLES, 657,656,159, 100,506,99, 1003,900,995, 1048,1009,901,
+ 1051,901,1009, 1070,1073,1071, 1070,803,808, 1071,1077,1070,
+ 1072,1006,1073, 1072,808,915, 1073,808,1072, 1077,1071,1076,
+ 1078,1283,1127, 1081,1078,1079, 1081,1079,1080, 1083,1082,1086,
+ 1083,747,1274, 1084,888,1085, 1085,878,1086, 1085,1086,1095,
+ 1086,747,1083, 1093,1095,1086, 1094,1095,1093, 658,657,149,
+ 1101,637,32, 1103,638,1108, 1105,637,1101, 1106,637,1105,
+ 1108,638,1111, 111,36,158, 111,653,665, 111,665,36, 1110,858,1112,
+ 1111,988,1110, 1111,638,891, 1111,891,988, 1112,858,1113,
+ 1113,637,1106, 1117,779,784, 112,214,207, 112,651,210, 1124,1297,1154,
+ 1125,1123,1128, 1125,1302,1154, 1127,1077,1078, 1129,791,796,
+ 1130,1118,1137, 1136,1130,1137, 1137,1118,1119, 1137,1119,1121,
+ 1137,1121,1126, 1142,758,759, 1142,759,760, 1142,760,761,
+ 1147,1146,1154, 1150,755,756, 1150,756,757, 1154,1302,1124,
+ 1155,1147,1154, 1155,1297,1156, 1155,1154,1297, 1156,1240,1155,
+ 1156,1298,1157, 1157,1240,1156, 1157,1299,1273, 1157,1282,1281,
+ 1158,1151,1152, 1161,768,1164, 1162,773,1161, 1162,1161,1163,
+ 1163,1161,1164, 1165,1172,762, 1168,726,1178, 1168,1267,1266,
+ 1169,1178,725, 1171,1172,1165, 1171,720,1172, 1171,1165,1175,
+ 1178,1169,1174, 1178,1174,1278, 1179,1229,1228, 118,660,168,
+ 1180,1229,1179, 1185,726,1226, 1186,1183,1184, 1186,1184,1191,
+ 119,660,118, 1191,1184,1192, 1192,1184,1197, 1197,1184,1198,
+ 1198,1184,1203, 1203,1184,1204, 121,116,451, 1210,1209,1230,
+ 1215,1210,1230, 1216,1215,1230, 1221,1216,1230, 1222,1185,1226,
+ 1222,1221,1230, 1223,1222,1226, 1224,1223,1225, 1225,1223,1226,
+ 1226,726,1231, 1227,1188,1189, 1227,1189,1194, 1227,1194,1195,
+ 1227,1195,1200, 1227,1200,1201, 1227,1201,1206, 1228,1224,1225,
+ 1228,1225,1234, 1229,1207,1212, 1229,1212,1213, 1229,1213,1218,
+ 1229,1218,1219, 1229,1219,1224, 1229,1180,1227, 1229,1224,1228,
+ 1230,729,1185, 1230,1185,1222, 1231,1225,1226, 1232,1179,1234,
+ 1233,744,1232, 1234,1179,1228, 1234,1225,1231, 1235,744,1233,
+ 1237,744,1238, 1239,1155,1240, 1240,1157,1239, 1243,1168,1266,
+ 1248,1241,1249, 1250,1249,1252, 1252,1249,1253, 1254,1248,1251,
+ 1256,1241,1255, 1259,1244,1270, 1264,745,1237, 1265,1260,1272,
+ 1267,1168,1178, 1267,1178,1277, 1269,1282,1270, 1270,1282,1273,
+ 1271,1268,1269, 1271,1269,1270, 1273,1283,1274, 1274,1078,1081,
+ 1274,1081,1083, 1274,747,1275, 1275,745,1264, 1275,1264,1265,
+ 1275,1265,1272, 1275,1272,1274, 1276,1178,1278, 1277,1178,1276,
+ 1280,1157,1281, 1281,1269,1277, 1282,1157,1273, 1282,1269,1281,
+ 1283,1078,1274, 1292,1290,1296, 1295,1292,1296, 1296,1290,1291,
+ 1296,1291,1293, 1296,1293,1294, 1296,1294,1295, 1297,1298,1156,
+ 1297,1124,1298, 1298,1124,1299, 1299,1124,1273, 1299,1157,1298,
+ 660,659,168, 133,128,463, 137,182,141, 138,185,137, 139,184,138,
+ 140,183,139, 141,181,142, 141,182,144, 142,181,143, 143,649,142,
+ 143,197,195, 144,196,181, 144,199,194, 145,183,140, 145,201,183,
+ 145,140,405, 146,184,139, 146,139,183, 146,203,184, 147,185,138,
+ 147,138,184, 147,205,185, 148,198,182, 148,137,185, 149,657,159,
+ 150,149,159, 151,150,157, 152,151,157, 153,152,157, 157,150,158,
+ 157,38,160, 157,37,38, 158,150,159, 160,153,157, 160,39,163,
+ 160,38,39, 162,41,161, 163,39,40, 168,659,171, 172,155,156,
+ 176,153,154, 176,154,155, 177,658,149, 179,149,150, 179,150,151,
+ 180,152,153, 181,197,143, 181,141,144, 181,196,190, 182,199,144,
+ 182,137,148, 182,198,189, 183,200,146, 184,202,147, 185,204,148,
+ 186,204,185, 186,267,204, 186,185,205, 187,202,184, 187,265,202,
+ 187,184,203, 188,200,183, 188,263,200, 188,183,201, 189,275,199,
+ 189,261,255, 190,277,197, 190,259,254, 191,276,198, 191,148,204,
+ 192,205,147, 192,147,202, 192,268,205, 193,203,146, 193,146,200,
+ 193,266,203, 194,278,196, 194,262,249, 196,259,190, 196,144,194,
+ 196,278,248, 197,181,190, 197,260,195, 197,277,247, 198,261,189,
+ 198,148,191, 198,276,246, 199,182,189, 199,262,194, 199,275,245,
+ 200,274,193, 201,273,188, 202,272,192, 203,271,187, 204,270,191,
+ 205,269,186, 206,215,209, 206,216,90, 207,215,206, 207,214,208,
+ 208,231,215, 208,230,228, 209,233,216, 209,232,227, 210,229,214,
+ 210,651,226, 211,235,217, 211,234,225, 212,237,218, 212,236,224,
+ 212,386,236, 213,238,223, 213,421,88, 214,230,208, 214,112,210,
+ 214,229,222, 215,207,208, 215,232,209, 215,231,221, 216,206,209,
+ 216,234,211, 216,233,220, 217,90,211, 217,386,212, 218,89,212,
+ 218,238,213, 218,237,219, 219,342,238, 219,340,331, 220,346,234,
+ 220,336,329, 221,348,232, 221,334,328, 222,350,230, 222,332,327,
+ 223,341,326, 224,343,237, 224,339,325, 225,345,235, 225,337,324,
+ 226,351,229, 226,651,445, 227,347,233, 227,335,322, 228,349,231,
+ 228,333,321, 229,332,222, 229,210,226, 229,351,320, 230,214,222,
+ 230,333,228, 230,350,319, 231,334,221, 231,208,228, 231,349,318,
+ 232,215,221, 232,335,227, 232,348,317, 233,336,220, 233,209,227,
+ 233,347,316, 234,216,220, 234,337,225, 234,346,315, 235,211,225,
+ 235,345,314, 236,339,224, 236,383,313, 236,344,383, 237,340,219,
+ 237,212,224, 237,343,312, 238,218,219, 238,341,223, 238,342,311,
+ 239,269,205, 239,205,268, 240,270,204, 240,204,267, 241,271,203,
+ 241,203,266, 242,272,202, 242,202,265, 243,273,201, 243,201,264,
+ 244,274,200, 244,200,263, 250,145,407, 251,266,193, 251,193,274,
+ 252,268,192, 252,192,272, 253,191,270, 256,263,188, 256,188,273,
+ 257,265,187, 257,187,271, 258,267,186, 258,186,269, 259,196,248,
+ 22,650,435, 260,197,247, 261,198,246, 262,199,245, 21,650,22,
+ 275,189,255, 276,191,253, 277,190,254, 278,194,249, 323,226,445,
+ 330,217,235, 330,235,338, 332,229,320, 333,230,319, 334,231,318,
+ 335,232,317, 336,233,316, 337,234,315, 338,235,314, 339,236,313,
+ 664,653,661, 340,237,312, 341,238,311, 342,219,331, 343,224,325,
+ 344,236,386, 345,225,324, 346,220,329, 347,227,322, 348,221,328,
+ 349,228,321, 665,653,664, 350,222,327, 351,226,323, 380,217,330,
+ 405,408,145, 405,412,406, 406,408,405, 407,145,408, 408,341,407,
+ 411,406,412, 413,412,461, 414,413,416, 415,414,416, 416,413,608,
+ 418,87,421, 418,416,608, 419,223,326, 420,213,223, 420,223,419,
+ 421,417,418, 421,213,420, 421,430,428, 421,87,88, 428,430,429,
+ 430,421,420, 435,650,439, 439,650,440, 440,650,447, 442,651,437,
+ 444,195,323, 444,323,445, 445,651,442, 446,195,444, 447,650,195,
+ 447,195,446, 453,452,471, 455,453,471, 460,455,471, 461,617,413,
+ 462,457,459, 465,43,44, 471,452,464, 471,464,470, 486,485,492,
+ 488,458,1301, 488,631,458, 488,1301,459, 488,480,481, 488,481,489,
+ 489,574,490, 490,631,489, 490,574,491, 490,632,631, 491,632,490,
+ 495,105,106, 495,106,107, 495,107,108, 495,108,109, 495,109,110,
+ 495,110,496, 497,495,496, 498,105,495, 498,495,497, 499,506,505,
+ 505,68,71, 506,68,505, 506,67,68, 508,503,512, 509,499,505,
+ 512,74,502, 512,502,601, 513,563,514, 518,517,520, 518,564,76,
+ 519,75,564, 519,74,75, 523,522,561, 525,518,520, 526,518,525,
+ 528,523,561, 529,528,561, 531,518,526, 532,518,531, 534,529,561,
+ 535,534,561, 537,518,532, 538,518,537, 540,535,561, 546,541,563,
+ 547,546,563, 552,547,563, 553,552,563, 556,519,564, 558,553,563,
+ 559,557,558, 559,558,562, 560,74,519, 560,519,556, 560,556,557,
+ 560,557,559, 560,559,565, 561,514,563, 562,563,513, 562,558,563,
+ 562,513,568, 564,543,544, 564,544,549, 564,549,550, 564,550,555,
+ 564,555,556, 565,74,560, 565,559,568, 566,84,567, 567,84,569,
+ 568,559,562, 568,513,566, 571,85,598, 571,84,85, 572,84,571,
+ 573,491,574, 574,489,573, 583,575,582, 585,582,588, 586,583,584,
+ 587,583,586, 589,575,590, 598,85,609, 599,598,609, 653,111,654,
+ 600,601,502, 600,502,577, 603,602,605, 604,578,593, 604,616,603,
+ 604,603,605, 606,594,599, 606,599,609, 607,633,491, 607,616,604,
+ 607,491,616, 607,458,633, 608,87,418, 608,617,607, 608,606,609,
+ 608,413,617, 609,87,608, 609,86,87, 610,512,611, 611,512,601,
+ 611,603,615, 612,508,512, 612,512,610, 615,616,491, 615,491,614,
+ 615,603,616, 625,624,630, 627,625,630, 628,627,630, 629,628,630,
+ 630,624,626, 630,626,629, 631,488,489, 632,458,631, 632,491,633,
+ 633,458,632, 639,651,112, 641,774,640, 32,637,33, 667,640,668,
+ 668,640,669, 669,640,774, 67,506,100, 672,669,774, 676,673,820,
+ 677,676,823, 680,677,826, 688,685,1131, 712,711,754, 720,719,1172,
+ 721,720,1171, 725,1178,726, 729,726,1185, 729,1230,730, 73,512,503,
+ 730,1230,1184, 74,512,73, 743,82,83, 745,744,1237, 745,743,744,
+ 745,1275,746, 746,85,743, 746,743,745, 746,609,85, 746,1275,86,
+ 747,86,1275, 748,747,1086, 748,883,751, 748,1086,878, 751,882,752,
+ 752,881,870, 76,564,75, 762,1172,763, 763,1172,719, 769,768,1161,
+ 770,769,1161, 771,770,1161, 772,771,1161, 773,772,1161, 774,641,642,
+ 775,638,639, 781,647,782, 655,654,111, 800,848,801, 801,847,802,
+ 801,848,810, 802,846,803, 802,847,809, 803,846,808, 804,845,800,
+ 805,844,804, 805,636,806, 806,844,805, 806,860,844, 807,845,804,
+ 807,804,844, 807,862,845, 808,1073,1070, 809,863,846, 809,866,856,
+ 810,865,847, 810,868,855, 811,800,845, 811,867,848, 812,644,645,
+ 812,645,840, 813,812,842, 814,813,842, 816,815,843, 817,816,839,
+ 818,817,839, 819,818,835, 820,813,814, 820,814,815, 820,815,816,
+ 820,816,823, 821,672,774, 821,813,820, 822,642,643, 822,643,644,
+ 822,644,812, 822,812,813, 822,813,821, 823,676,820, 824,681,825,
+ 826,677,823, 83,742,743, 831,646,647, 831,647,781, 834,646,831,
+ 844,859,807, 845,861,811, 846,864,808, 846,802,809, 846,863,851,
+ 847,866,809, 847,801,810, 847,865,850, 848,868,810, 848,800,811,
+ 848,867,849, 849,934,868, 849,932,923, 85,84,743, 850,936,866,
+ 850,930,922, 851,938,864, 851,928,921, 852,861,845, 852,926,861,
+ 852,845,862, 853,859,844, 853,924,859, 853,844,860, 854,811,861,
+ 854,935,867, 855,937,865, 855,933,917, 856,939,863, 856,931,916,
+ 857,862,807, 857,807,859, 857,927,862, 858,637,1113, 858,860,806,
+ 858,925,860, 859,943,857, 86,609,746, 860,942,853, 861,941,854,
+ 862,940,852, 863,928,851, 863,809,856, 863,939,909, 864,846,851,
+ 864,938,908, 865,930,850, 865,810,855, 865,937,907, 866,847,850,
+ 866,931,856, 866,936,906, 867,932,849, 867,811,854, 867,935,905,
+ 868,848,849, 868,933,855, 868,934,904, 870,880,871, 871,879,775,
+ 873,879,871, 873,895,879, 873,871,880, 874,880,870, 874,897,880,
+ 874,870,881, 875,638,775, 875,775,879, 876,881,752, 876,899,881,
+ 876,752,882, 877,882,751, 877,1051,882, 877,751,883, 878,883,748,
+ 878,903,883, 879,894,875, 88,218,213, 880,896,873, 881,898,874,
+ 882,900,876, 883,902,877, 884,902,883, 884,1005,902, 884,883,903,
+ 885,898,881, 885,1001,898, 885,881,899, 886,896,880, 886,999,896,
+ 886,880,897, 887,894,879, 887,997,894, 887,879,895, 888,878,1085,
+ 888,903,878, 888,1006,903, 889,901,877, 889,1004,901, 889,877,902,
+ 89,217,212, 89,218,88, 890,899,876, 890,1002,899, 890,876,900,
+ 891,638,875, 891,875,894, 892,897,874, 892,1000,897, 892,874,898,
+ 893,895,873, 893,998,895, 893,873,896, 894,1016,891, 895,1015,887,
+ 896,1014,893, 897,1013,886, 898,1012,892, 899,1011,885, 656,655,159,
+ 90,216,211, 90,217,89, 900,1010,890, 900,882,995, 901,1051,877,
+ 902,1008,889, 903,1007,884, 91,57,58, 910,940,862, 910,862,927,
+ 911,941,861, 911,861,926, 912,942,860, 912,860,925, 913,943,859,
+ 913,859,924, 914,927,857, 914,857,943, 918,854,941, 919,924,853,
+ 919,853,942, 920,926,852, 920,852,940, 928,863,909, 929,864,908,
+ 93,92,484, 930,865,907, 931,866,906, 932,867,905, 933,868,904,
+ 934,849,923, 935,854,918, 936,850,922, 937,855,917, 938,851,921,
+ 939,856,916, 94,93,484, 96,95,476, 97,96,476, 976,903,1006,
+ 976,1007,903, 977,902,1005, 977,1008,902, 978,901,1004, 978,1048,901,
+ 979,900,1003, 979,1010,900, 98,97,476, 980,899,1002, 980,1011,899,
+ 981,898,1001, 981,1012,898, 982,897,1000, 982,1013,897, 983,1014,896,
+ 983,896,999, 984,1015,895, 984,895,998, 985,1016,894, 985,894,997,
+ 986,893,1014, 986,998,893, 987,892,1012, 987,1000,892, 988,891,1016,
+ 988,858,1110, 989,890,1010, 989,1002,890, 99,506,499, 990,889,1008,
+ 990,1004,889, 991,888,1084, 991,1006,888, 992,887,1015, 992,997,887,
+ 993,886,1013, 993,999,886, 994,885,1011, 994,1001,885, 995,882,1045,
+ 996,884,1007, 996,1005,884,
+
+ QUADS, 648,666,130,131, 648,649,20,19, 657,658,15,14,
+ 1000,987,1032,1031, 1001,994,1036,1035, 1002,989,1040,1039,
+ 1003,995,1044,1043, 1004,990,1053,1052, 1005,996,1057,1056,
+ 1006,991,1061,1060, 1007,976,1059,1058, 1008,977,1055,1054,
+ 1009,906,973,1047, 101,64,67,100, 1010,979,1042,1041,
+ 1011,980,1038,1037, 1012,981,1034,1033, 1013,982,1030,1029,
+ 1014,983,1026,1025, 1015,984,1022,1021, 1016,985,1018,1017,
+ 102,63,64,101, 103,60,63,102, 104,59,60,103, 1045,882,1051,1009,
+ 1045,1009,1047,1046, 1048,978,1050,1049, 105,104,103,106,
+ 106,103,102,107, 1061,991,1071,1075, 1062,939,1004,1052,
+ 1062,1052,1053,1063, 1063,909,939,1062, 1064,928,1008,1054,
+ 1064,1054,1055,1065, 1065,921,928,1064, 1066,938,1005,1056,
+ 1066,1056,1057,1067, 1067,908,938,1066, 1068,929,1007,1058,
+ 1068,1058,1059,1069, 1069,915,929,1068, 107,102,101,108,
+ 1071,991,1084,1076, 1072,915,976,1006, 1073,1006,1060,1074,
+ 1074,1060,1061,1075, 1075,1071,1073,1074, 1078,1077,1076,1079,
+ 108,101,100,109, 1080,1079,1085,1095, 1081,1080,1082,1083,
+ 1082,1080,1092,1091, 1084,1085,1087,1088, 1085,1079,1089,1087,
+ 1086,1082,1091,1093, 1088,1087,1089,1090, 1089,1079,1076,1090,
+ 109,100,99,110, 1090,1076,1084,1088, 1092,1080,1095,1094,
+ 1093,1091,1092,1094, 1096,27,26,431, 1097,638,1103,1098,
+ 658,659,16,15, 110,99,499,496, 1100,1099,1102,1104,
+ 1101,1100,1104,1105, 1102,1099,1098,1103, 1106,1105,1104,1107,
+ 1107,1104,1102,1109, 1109,1102,1103,1108, 1110,1109,1108,1111,
+ 1112,1107,1109,1110, 1113,1106,1107,1112, 1115,819,828,1116,
+ 1117,784,791,1120, 1118,1116,1117,1119, 1119,1117,1120,1121,
+ 1120,791,1129,1122, 1121,1120,1122,1126, 1122,1123,1125,1126,
+ 1126,1125,1154,1137, 1127,1124,1302,1303, 1128,1123,1122,1129,
+ 1128,803,1070,1303, 1129,796,803,1128, 113,114,123,124,
+ 1130,1115,1116,1118, 1131,1114,1115,1130, 1132,1133,1140,1141,
+ 1133,1134,1139,1140, 1134,1135,1138,1139, 1136,688,1131,1130,
+ 1138,1135,1136,1137, 1138,1137,1154,1146, 1139,1138,1146,1145,
+ 114,115,122,123, 1140,1139,1145,1144, 1141,1140,1144,1143,
+ 1142,761,1132,1141, 1143,758,1142,1141, 1143,1144,1149,1150,
+ 1144,1145,1148,1149, 1145,1146,1147,1148, 1148,1147,1155,1153,
+ 1149,1148,1153,1152, 115,116,121,122, 115,114,166,167,
+ 1150,757,758,1143, 1150,1149,1152,1151, 1151,754,755,1150,
+ 1158,712,754,1151, 1158,1152,1160,1159, 1160,1152,1153,1155,
+ 1160,1155,1239,1177, 1165,762,773,1162, 1165,1162,1163,1166,
+ 1166,1163,1164,1167, 1167,1159,1176,1166, 1169,1170,1173,1174,
+ 1173,1170,1171,1175, 1174,1173,1177,1239, 1175,1165,1166,1176,
+ 1176,1159,1160,1177, 1177,1173,1175,1176, 1182,1183,1186,1187,
+ 1187,1186,1191,1190, 1188,1181,1182,1187, 1189,1188,1187,1190,
+ 119,118,117,120, 1190,1191,1192,1193, 1193,1192,1197,1196,
+ 1194,1189,1190,1193, 1195,1194,1193,1196, 1196,1197,1198,1199,
+ 1199,1198,1203,1202, 659,660,17,16, 659,658,177,171, 120,117,113,124,
+ 1200,1195,1196,1199, 1201,1200,1199,1202, 1202,1203,1204,1205,
+ 1204,1184,1230,1209, 1205,1204,1209,1208, 1206,1201,1202,1205,
+ 1207,1206,1205,1208, 1208,1209,1210,1211, 1211,1210,1215,1214,
+ 1212,1207,1208,1211, 1213,1212,1211,1214, 1214,1215,1216,1217,
+ 1217,1216,1221,1220, 1218,1213,1214,1217, 1219,1218,1217,1220,
+ 122,121,128,127, 1220,1221,1222,1223, 1224,1219,1220,1223,
+ 1227,1180,1181,1188, 1227,1206,1207,1229, 123,122,127,126,
+ 1231,726,1168,1233, 1233,1168,1243,1235, 1234,1231,1233,1232,
+ 1236,1235,1243,1242, 1236,1242,1244,1247, 1237,1238,1245,1246,
+ 1238,744,1235,1236, 1239,1157,1280,1279, 124,123,126,125,
+ 1244,1242,1271,1270, 1245,1238,1236,1247, 1246,1245,1262,1261,
+ 1247,1244,1259,1263, 1249,1241,1256,1253, 125,126,135,136,
+ 1251,1248,1249,1250, 1251,1250,1262,1263, 1254,1251,1263,1259,
+ 1255,1241,1248,1254, 1257,1256,1255,1258, 1258,1255,1254,1259,
+ 126,127,134,135, 1260,1253,1256,1257, 1261,1252,1253,1260,
+ 1262,1250,1252,1261, 1262,1245,1247,1263, 1264,1237,1246,1265,
+ 1265,1246,1261,1260, 1268,1243,1266,1269, 1269,1266,1267,1277,
+ 127,128,133,134, 1271,1242,1243,1268, 1272,1260,1257,1274,
+ 1273,1258,1259,1270, 1273,1124,1127,1283, 1274,1257,1258,1273,
+ 1278,1174,1239,1279, 128,121,451,454, 1284,1276,1278,1285,
+ 1285,1278,1279,1287, 1286,1277,1276,1284, 1287,1279,1280,1288,
+ 1288,1280,1281,1289, 1289,1281,1277,1286, 129,120,124,125,
+ 1290,1284,1285,1291, 1291,1285,1287,1293, 1292,1286,1284,1290,
+ 1293,1287,1288,1294, 1294,1288,1289,1295, 1295,1289,1286,1292,
+ 660,666,18,17, 130,666,660,119, 130,119,120,129, 1301,458,461,1300,
+ 1301,1300,462,459, 1303,1070,1077,1127, 1303,1302,1125,1128,
+ 131,130,129,132, 132,129,125,136, 134,133,140,139, 135,134,139,138,
+ 136,135,138,137, 140,133,463,462, 141,132,136,137, 142,131,132,141,
+ 154,153,160,163, 158,36,37,157, 159,655,111,158, 161,156,155,162,
+ 161,41,42,448, 162,155,154,163, 163,40,41,162, 164,113,117,169,
+ 164,169,170,174, 165,116,115,167, 165,156,449,450, 166,114,113,164,
+ 167,166,173,172, 169,117,118,168, 170,169,168,171, 172,156,165,167,
+ 173,166,164,174, 174,170,178,175, 175,178,179,180, 176,155,172,173,
+ 176,173,174,175, 177,149,179,178, 178,170,171,177, 179,151,152,180,
+ 180,153,176,175, 649,648,131,142, 649,650,21,20, 201,145,250,264,
+ 206,90,753,869, 207,206,869,872, 263,256,400,399, 264,250,404,403,
+ 265,257,306,305, 266,251,310,309, 267,258,298,297, 268,252,302,301,
+ 269,239,300,299, 270,240,296,295, 271,241,308,307, 272,242,304,303,
+ 273,243,402,401, 274,244,398,397, 279,260,247,280, 280,247,320,353,
+ 281,277,254,282, 282,254,327,355, 283,259,248,284, 284,248,319,357,
+ 285,278,249,286, 286,249,321,359, 287,262,245,288, 288,245,318,361,
+ 289,275,255,290, 19,18,666,648, 290,255,328,363, 291,261,246,292,
+ 292,246,317,365, 293,276,253,294, 294,253,322,367, 296,240,316,369,
+ 298,258,329,371, 650,649,143,195, 300,239,315,373, 302,252,324,375,
+ 304,242,314,377, 306,257,330,379, 308,241,344,382, 661,653,652,662,
+ 310,251,313,385, 311,250,407,341, 312,256,273,340, 313,251,274,339,
+ 314,242,265,338, 315,239,268,337, 316,240,267,336, 317,246,276,335,
+ 318,245,275,334, 319,248,278,333, 662,667,668,663, 320,247,277,332,
+ 321,249,262,349, 322,253,270,347, 323,195,260,351, 324,252,272,345,
+ 325,244,263,343, 327,254,259,350, 328,255,261,348, 329,258,269,346,
+ 663,668,669,670, 330,257,271,380, 331,243,264,342, 332,277,281,354,
+ 333,278,285,358, 334,275,289,362, 335,276,293,366, 336,267,297,370,
+ 337,268,301,374, 338,265,305,378, 339,274,397,387, 664,661,662,663,
+ 340,273,401,391, 342,264,403,393, 343,263,399,389, 344,241,266,383,
+ 345,272,303,376, 346,269,299,372, 347,270,295,368, 348,261,291,364,
+ 349,262,287,360, 665,664,663,670, 350,259,283,356, 351,260,279,352,
+ 352,279,280,353, 353,320,351,352, 354,281,282,355, 355,327,332,354,
+ 356,283,284,357, 357,319,350,356, 358,285,286,359, 359,321,333,358,
+ 36,665,670,671, 360,287,288,361, 361,318,349,360, 362,289,290,363,
+ 363,328,334,362, 364,291,292,365, 365,317,348,364, 366,293,294,367,
+ 367,322,335,366, 368,295,296,369, 369,316,347,368, 37,36,671,674,
+ 370,297,298,371, 371,329,336,370, 372,299,300,373, 373,315,346,372,
+ 374,301,302,375, 375,324,337,374, 376,303,304,377, 377,314,345,376,
+ 378,305,306,379, 379,330,338,378, 38,37,674,675, 380,271,307,381,
+ 381,307,308,382, 382,344,380,381, 383,266,309,384, 384,309,310,385,
+ 385,313,383,384, 386,217,380,344, 388,325,339,387, 388,387,397,398,
+ 39,38,675,678, 390,312,343,389, 390,389,399,400, 392,331,340,391,
+ 392,391,401,402, 394,311,342,393, 394,393,403,404, 395,341,408,409,
+ 396,326,341,395, 396,395,409,410, 398,244,325,388, 40,39,678,679,
+ 400,256,312,390, 402,243,331,392, 404,250,311,394, 405,140,462,1300,
+ 406,326,396,410, 408,406,410,409, 41,40,679,682, 411,412,413,414,
+ 411,414,424,425, 412,405,1300,461, 417,415,416,418, 419,326,406,411,
+ 419,411,425,423, 42,41,682,683, 420,414,415,430, 422,420,419,423,
+ 424,414,420,422, 424,422,423,425, 426,417,421,428, 427,415,417,426,
+ 427,426,428,429, 43,42,683,686, 430,415,427,429, 431,651,639,1096,
+ 431,26,25,432, 432,25,24,433, 432,433,436,437, 433,24,23,434,
+ 434,23,22,435, 436,433,434,438, 436,438,441,443, 437,651,431,432,
+ 437,436,443,442, 438,434,435,439, 438,439,440,441, 44,43,686,687,
+ 441,440,447,446, 442,443,444,445, 443,441,446,444, 448,42,43,465,
+ 449,156,161,448, 449,448,465,464, 45,44,687,690, 450,449,464,452,
+ 451,116,165,450, 451,450,452,453, 454,451,453,455, 456,454,455,460,
+ 456,457,462,463, 459,457,456,460, 46,45,690,691, 461,458,607,617,
+ 463,128,454,456, 465,44,470,464, 466,98,476,475, 466,49,50,98,
+ 467,47,49,466, 468,46,47,467, 469,45,46,468, 47,46,691,694,
+ 470,44,45,469, 470,469,472,471, 472,469,468,473, 473,468,467,474,
+ 474,467,466,475, 476,95,477,475, 478,474,475,477, 479,473,474,478,
+ 48,695,696,697, 480,472,473,479, 481,480,479,482, 482,479,478,483,
+ 483,478,477,484, 486,483,484,485, 487,482,483,486, 487,486,494,489,
+ 488,459,460,471, 488,471,472,480, 489,481,482,487, 49,47,694,48,
+ 492,58,59,493, 493,59,104,501, 494,486,492,493, 494,493,510,511,
+ 497,496,499,500, 498,497,500,501, 652,640,667,662, 652,653,10,9,
+ 50,49,48,697, 500,499,509,510, 501,104,105,498, 502,74,565,567,
+ 504,72,73,503, 505,71,72,504, 505,504,507,509, 507,504,503,508,
+ 509,507,511,510, 51,50,697,698, 510,493,501,500, 511,507,508,573,
+ 513,81,82,566, 514,80,81,513, 515,79,80,514, 515,514,561,522,
+ 516,78,79,515, 516,515,522,521, 517,77,78,516, 518,76,77,517,
+ 52,51,698,701, 520,517,516,521, 521,522,523,524, 524,523,528,527,
+ 525,520,521,524, 526,525,524,527, 527,528,529,530, 53,52,701,702,
+ 530,529,534,533, 531,526,527,530, 532,531,530,533, 533,534,535,536,
+ 536,535,540,539, 537,532,533,536, 538,537,536,539, 539,540,541,542,
+ 54,53,702,705, 541,540,561,563, 542,541,546,545, 543,538,539,542,
+ 544,543,542,545, 545,546,547,548, 548,547,552,551, 549,544,545,548,
+ 55,54,705,706, 550,549,548,551, 551,552,553,554, 554,553,558,557,
+ 555,550,551,554, 556,555,554,557, 56,55,706,709, 564,518,538,543,
+ 566,82,743,84, 567,565,568,566, 569,84,572,570, 57,56,709,710,
+ 570,572,579,581, 573,489,494,511, 573,508,612,613, 577,502,567,569,
+ 577,569,570,576, 577,576,605,602, 578,576,570,581, 579,572,571,580,
+ 58,57,710,713, 580,571,598,599, 581,579,596,597, 582,575,589,588,
+ 583,582,585,584, 586,584,596,595, 587,586,595,594, 588,589,592,593,
+ 589,590,591,592, 59,58,713,714, 590,575,583,587, 590,587,594,591,
+ 591,594,606,608, 592,591,608,607, 593,578,581,597, 593,592,607,604,
+ 595,580,599,594, 596,579,580,595, 596,584,585,597, 597,585,588,593,
+ 653,654,11,10, 60,59,714,61, 600,577,602,603, 601,600,603,611,
+ 605,576,578,604, 61,716,717,62, 610,611,620,618, 611,615,623,620,
+ 612,610,618,619, 613,612,619,621, 614,491,573,613, 614,613,621,622,
+ 615,614,622,623, 618,620,626,624, 619,618,624,625, 62,717,718,65,
+ 620,623,629,626, 621,619,625,627, 622,621,627,628, 623,622,628,629,
+ 63,60,61,62, 639,638,1097,1096, 64,63,62,65, 647,634,793,782,
+ 1,647,646,2, 2,646,645,3, 65,718,719,66, 3,645,644,4, 4,644,643,5,
+ 5,643,642,6, 6,642,641,7, 7,641,640,8, 8,640,652,9, 28,27,1096,1097,
+ 29,28,1097,1098, 66,719,720,69, 30,29,1098,1099, 31,30,1099,1100,
+ 32,31,1100,1101, 33,637,636,34, 34,636,635,35, 35,635,634,0,
+ 0,634,647,1, 67,64,65,66, 670,669,672,671, 671,672,673,674,
+ 673,672,821,820, 674,673,676,675, 675,676,677,678, 678,677,680,679,
+ 679,680,681,682, 68,67,66,69, 681,680,826,825, 682,681,684,683,
+ 683,684,685,686, 684,681,824,1114, 685,684,1114,1131,
+ 686,685,688,687, 687,688,689,690, 689,688,1136,1135, 69,720,721,70,
+ 690,689,692,691, 691,692,693,694, 692,689,1135,1134,
+ 693,692,1134,1133, 694,693,695,48, 695,693,1133,1132,
+ 696,695,1132,761, 697,696,699,698, 698,699,700,701, 699,696,761,760,
+ 654,655,12,11, 70,721,722,723, 700,699,760,759, 701,700,703,702,
+ 702,703,704,705, 703,700,759,758, 704,703,758,757, 705,704,707,706,
+ 706,707,708,709, 707,704,757,756, 708,707,756,755, 709,708,711,710,
+ 71,68,69,70, 710,711,712,713, 711,708,755,754, 713,712,715,714,
+ 714,715,716,61, 715,712,1158,1159, 716,715,767,766, 717,716,766,765,
+ 718,717,765,764, 719,718,764,763, 72,71,70,723, 722,721,1171,1170,
+ 723,722,725,724, 724,725,726,727, 725,722,1170,1169, 727,726,729,728,
+ 728,729,730,731, 73,72,723,724, 731,730,733,732, 732,733,734,735,
+ 733,730,1184,1183, 734,733,1183,1182, 735,734,737,736,
+ 736,737,738,739, 737,734,1182,1181, 738,737,1181,1180,
+ 739,738,741,740, 74,73,724,727, 740,741,742,83, 741,738,1180,1179,
+ 742,741,1179,1232, 743,742,1232,744, 749,748,751,750, 75,74,727,728,
+ 750,751,752,753, 753,752,870,869, 76,75,728,731, 762,763,772,773,
+ 763,764,771,772, 764,765,770,771, 765,766,769,770, 766,767,768,769,
+ 767,715,1159,1167, 768,767,1167,1164, 77,76,731,732, 774,642,822,821,
+ 775,639,872,871, 776,780,783,787, 776,777,829,827, 778,779,828,830,
+ 78,77,732,735, 780,781,782,783, 780,776,827,832, 781,780,832,831,
+ 783,782,793,792, 784,779,778,785, 785,778,777,786, 786,777,776,787,
+ 787,783,792,788, 788,792,795,799, 789,786,787,788, 79,78,735,736,
+ 790,785,786,789, 791,784,785,790, 792,793,794,795, 793,634,635,794,
+ 794,635,636,805, 795,794,805,804, 796,791,790,797, 797,790,789,798,
+ 798,789,788,799, 799,795,804,800, 655,656,13,12, 80,79,736,739,
+ 801,798,799,800, 802,797,798,801, 803,796,797,802, 806,636,637,858,
+ 81,80,739,740, 815,814,842,843, 817,818,825,826, 818,819,824,825,
+ 82,81,740,83, 823,816,817,826, 824,819,1115,1114, 827,829,836,837,
+ 828,779,1117,1116, 828,819,835,830, 829,777,778,830, 831,832,833,834,
+ 833,832,827,837, 834,833,841,840, 835,818,839,836, 836,829,830,835,
+ 837,836,839,838, 839,816,843,838, 840,645,646,834, 841,833,837,838,
+ 842,812,840,841, 842,841,838,843, 86,747,748,749, 869,870,871,872,
+ 872,639,112,207, 88,87,86,749, 89,88,749,750, 656,657,14,13,
+ 90,89,750,753, 91,58,492,485, 910,927,952,953, 911,926,956,957,
+ 912,925,944,945, 913,924,948,949, 914,943,950,951, 915,808,864,929,
+ 918,941,958,959, 919,942,946,947, 92,91,485,484, 92,56,57,91,
+ 920,940,954,955, 924,919,992,1015, 925,858,988,1016, 926,920,993,1013,
+ 927,914,986,1014, 928,909,990,1008, 929,908,996,1007, 93,55,56,92,
+ 930,907,979,1003, 931,906,1009,1048, 932,905,981,1001,
+ 933,904,980,1002, 934,923,994,1011, 935,918,987,1012,
+ 936,922,995,1045, 937,917,989,1010, 938,921,977,1005,
+ 939,916,978,1004, 94,54,55,93, 940,910,983,999, 941,911,982,1000,
+ 942,912,985,997, 943,913,984,998, 944,925,1016,1017,
+ 945,944,1017,1018, 946,942,997,1019, 947,946,1019,1020,
+ 948,924,1015,1021, 949,948,1021,1022, 95,94,484,477, 95,53,54,94,
+ 950,943,998,1023, 951,950,1023,1024, 952,927,1014,1025,
+ 953,952,1025,1026, 954,940,999,1027, 955,954,1027,1028,
+ 956,926,1013,1029, 957,956,1029,1030, 958,941,1000,1031,
+ 959,958,1031,1032, 96,52,53,95, 960,935,1012,1033, 961,960,1033,1034,
+ 961,905,935,960, 962,932,1001,1035, 963,962,1035,1036,
+ 963,923,932,962, 964,934,1011,1037, 965,964,1037,1038,
+ 965,904,934,964, 966,933,1002,1039, 967,966,1039,1040,
+ 967,917,933,966, 968,937,1010,1041, 969,968,1041,1042,
+ 969,907,937,968, 97,51,52,96, 970,930,1003,1043, 971,970,1043,1044,
+ 971,922,930,970, 972,936,1045,1046, 973,972,1046,1047,
+ 973,906,936,972, 974,931,1048,1049, 975,974,1049,1050,
+ 975,916,931,974, 976,915,1069,1059, 977,921,1065,1055,
+ 978,916,975,1050, 979,907,969,1042, 98,50,51,97, 980,904,965,1038,
+ 981,905,961,1034, 982,911,957,1030, 983,910,953,1026,
+ 984,913,949,1022, 985,912,945,1018, 986,914,951,1024,
+ 987,918,959,1032, 989,917,967,1040, 990,909,1063,1053,
+ 992,919,947,1020, 993,920,955,1028, 994,923,963,1036,
+ 995,922,971,1044, 996,908,1067,1057, 997,992,1020,1019,
+ 998,986,1024,1023, 999,993,1028,1027,
+
+ /* The base of the knight */
+ SPIN,18,
+ 9510,0, 9510,756, SEAM, 9134,1129, 9447,1487,
+ 9447,1951, 9103,2371, STEPDOWN, 8211,3083,
+ 7167,4242, 6662,5664, 7040,7142, STEPUP, SEAM, 7935,8560,
+ STEPUP, BACKREF,0,
+
+ ENDOFDATA
+};
+
+static unsigned short bishop_data[] = {
+ VERTICES, SETBACKREF,0, 5233,26960,0, 5154,26960,909, 4918,26960,1790,
+ 4532,26960,2617, 4009,26960,3364, 3364,26960,4009, 2617,26960,4532,
+ 1790,26960,4918, 909,26960,5154, 0,26833,5233, -909,26960,5154,
+ -1790,26960,4918, -2617,26960,4532, -3364,26960,4009,
+ -4009,26960,3364, -4532,26960,2617, -4918,26960,1790,
+ -5154,26960,909, -5233,26960,0, -5154,26960,-909, -4918,26960,-1790,
+ -4532,26960,-2617, -4009,26960,-3364, -3364,26960,-4009,
+ -2617,26960,-4532, -1790,26960,-4918, -909,26960,-5154, 0,26833,-5233,
+ 909,26960,-5154, 1790,26960,-4918, 2617,26960,-4532, 3364,26960,-4009,
+ 4009,26960,-3364, 4532,26960,-2617, 4918,26960,-1790, 5154,26960,-909,
+ SETBACKREF,1, 3812,31178,0, 3765,31144,729, 3624,31040,1435,
+ 3395,30872,2153, 3084,30642,2820, 2701,30360,3389, 2076,29899,4102,
+ 1492,30015,4340, 845,30033,4442, 0,30044,4511, -657,30063,4443,
+ -1481,30081,4214, -2190,30081,3884, -2830,30081,3435,
+ -3383,30081,2883, -3831,30081,2242, -4162,30081,1534,
+ -4364,30081,779, -4432,30081,0, -4364,30081,-779, -4162,30081,-1534,
+ -3831,30081,-2242, -3383,30081,-2883, -2830,30081,-3435,
+ -2190,30081,-3884, -1481,30081,-4214, -657,30063,-4443, 0,30044,-4511,
+ 845,30033,-4442, 1492,30015,-4340, 2076,29899,-4102, 2701,30360,-3388,
+ 3084,30642,-2820, 3395,30872,-2153, 3624,31040,-1435, 3765,31144,-729,
+ 240,28546,-4957, 884,29021,-4784, 1490,29467,-4537, 2076,29899,-4102,
+ 2701,30360,-3388, 3084,30642,-2820, 3395,30872,-2153,
+ 3624,31040,-1435, 3765,31144,-729, 2177,28477,4637, 1021,27605,5037,
+ 1021,27605,-5042, 2170,28478,-4644, 0,26833,-5233, 0,26833,5233,
+ -3153,28619,-3758, 240,28546,4957, 884,29021,4784, 2076,29899,4102,
+ 2701,30360,3389, 3084,30642,2820, 3395,30872,2153, 3624,31040,1435,
+ 3765,31144,729, -719,28582,4883, 4863,28569,977, 4560,28569,1925,
+ 4064,28569,2815, 3465,28569,3723, 2622,28569,4448, 2621,28583,-4401,
+ 3473,28588,-3691, 4064,28569,-2815, 4560,28569,-1925, 4863,28569,-977,
+ 4965,28569,0, -1678,28619,4610, -3153,28619,3758, -2453,28619,4248,
+ -4248,28619,2453, -3758,28619,3153, -4831,28619,852, -4906,28619,0,
+ -4831,28619,-852, -4610,28619,-1678, -4248,28619,-2453,
+ -3758,28619,-3153, -1678,28619,-4610, -2453,28619,-4248,
+ -644,27895,5037, -644,27895,-5037, -4610,28619,1678, -719,28582,-4883,
+ 2170,28478,-4644, 1021,27605,-5042, 1021,27605,5037, 2177,28477,4637,
+ 0,26833,-5233, 0,26833,5233, -644,27895,-5037, -644,27895,5037,
+ -644,27895,5037, -644,27895,-5037, 1490,29467,-4537, 884,29021,-4784,
+ 240,28546,-4957, 240,28546,4957, 884,29021,4784, 3812,31178,0,
+ 4349,30116,-867, 4197,30001,-1705, 3948,29813,-2492, 3610,29558,-3203,
+ 3193,29244,-3817, 2711,28880,-4315, 4349,30116,-867, 4197,30001,-1705,
+ 3948,29813,-2492, 3610,29558,-3203, 3193,29244,-3817,
+ 2711,28880,-4315, 1608,28047,-4906, 1608,28047,4901, 2711,28880,4310,
+ 3193,29244,3812, 3610,29558,3198, 3948,29813,2487, 4197,30001,1701,
+ 4349,30116,862, 4401,30155,-176, 1490,29467,4537, 1490,29467,4537,
+ 4401,30155,-176, 4349,30116,862, 4197,30001,1701, 3948,29813,2487,
+ 3610,29558,3198, 3193,29244,3812, 2711,28880,4310, 1608,28047,4901,
+ 1608,28047,-4906,
+
+ TRIANGLES, 8,127,9, 7,128,154, 2,98,3, 121,96,10, 121,10,9, 121,138,96,
+ 122,27,26, 27,126,28, 66,135,65, 162,42,43, 165,164,141, 80,140,95,
+ 103,151,150, 102,125,152, 101,155,128, 100,157,156, 124,137,122,
+ 33,105,34, 29,153,125, 26,124,122,
+
+ QUADS, 22,118,87,23, 21,117,118,22, 20,116,117,21, 19,115,116,20,
+ 18,114,115,19, 17,113,114,18, 16,123,113,17, 15,111,123,16, 14,112,111,15,
+ 13,109,112,14, 12,110,109,13, 11,108,110,12, 7,154,127,8, 110,108,47,48,
+ 135,136,64,65, 136,137,63,64, 138,139,44,45, 139,162,43,44, 109,110,48,49,
+ 147,161,107,106, 166,165,141,142, 167,166,142,143, 168,167,143,144,
+ 169,168,144,145, 112,109,49,50, 170,169,145,146, 171,81,84,172,
+ 111,112,50,51, 72,88,133,134, 73,89,88,72, 74,163,89,73, 75,90,163,74,
+ 76,91,90,75, 77,92,91,76, 78,93,92,77, 79,94,93,78, 80,95,94,79,
+ 81,170,146,84, 82,171,172,83, 86,82,83,85, 130,129,131,132, 123,111,51,52,
+ 113,123,52,53, 114,113,53,54, 115,114,54,55, 116,115,55,56, 117,116,56,57,
+ 118,117,57,58, 87,118,58,59, 120,87,59,60, 119,120,60,61, 107,161,160,97,
+ 106,107,0,35, 105,148,147,106, 105,106,35,34, 104,149,148,105,
+ 104,105,33,32, 103,150,149,104, 103,104,32,31, 102,152,151,103,
+ 102,103,31,30, 101,128,7,6, 100,101,6,5, 100,156,155,101, 99,100,5,4,
+ 99,158,157,100, 98,99,4,3, 98,159,158,99, 97,98,2,1, 97,160,159,98,
+ 96,108,11,10, 96,138,45,46, 124,119,61,62, 47,108,96,46, 63,137,124,62,
+ 0,107,97,1, 29,125,102,30, 28,126,153,29, 25,119,124,26, 24,120,119,25,
+ 23,87,120,24,
+
+ /* Everything above the slit */
+ SPIN,18,
+ 8870,0,8870,731,SEAM,8519,1091,8811,1438,8811,1886,8626,2292,
+ STEPDOWN,6989,2980,5927,4133,5548,5735,
+ STEPUP,5388,7642,5228,7807,STEPDOWN,4427,8149,4057,8434,
+ 3493,9185,2816,13524,SEAM,2690,18532,5301,18690,
+ STEPUP,6810,19005,6861,19277,6804,19625,STEPDOWN,6502,19845,
+ SEAM,4305,20394,STEPUP,4796,20522,4924,20759,4778,20979,
+ STEPDOWN,SEAM,3727,21207,SEAM,3726,22181,STEPUP,SEAM,4546,22705,
+ SEAM,3846,23385,4718,24227,5226,25516,STEPUP,BACKREF,0,
+
+ /* Everything below the slit */
+ SPIN,36,
+ BACKREF,1,STEPDOWN,3548,31590,STEPDOWN,2724,32633,SEAM,1581,33500,
+ 2013,33901,STEPUP,2281,34500,2281,34936,STEPDOWN,1947,35372,
+ STEPDOWN,1233,35734,STEPDOWN,0,35891,
+
+ ENDOFDATA
+};
+
+static unsigned short king_data[] = {
+ SPIN,20,
+ 11378,0,11378,856,SEAM,10928,1152,
+ 11302,1684,11302,2209,11065,2684,
+ STEPDOWN,8964,3490,7603,4841,7116,6717,
+ STEPUP,6911,8950,6705,9144,STEPDOWN,5678,9545,5204,9878,
+ 4481,10758,3696,14808,SEAM,3065,26979,
+ 5813,27155,STEPUP,7145,27507,7424,27812,7352,28288,7131,28533,
+ 5477,28882,5397,29010,5406,29363,4903,29934,
+ STEPDOWN,SEAM,3944,30227,
+ SEAM,3974,31478,4703,31849,STEPUP,4832,32092,4756,32370,
+ SEAM,3975,32620,6899,39055,6877,39351,2833,39514,
+ 2786,39612,2786,39807,2734,39856,STEPDOWN,STEPDOWN,2590,39905,0,39969,
+ /* The cross */
+ SETBACKREF,0,
+ QUADSTRIP,-1613,39866,0,-1543,39866,702,-1651,40481,0,-1580,40590,702,
+ -1531,40917,0,-1465,41008,702,
+ QUADSTRIP,-1531,40917,0,-1465,41008,702,-2956,41104,0,-2829,41187,702,
+ -3075,41520,0,-2943,41585,702,-3075,43849,0,-2943,43805,702,
+ -2862,44347,0,-2739,44282,702,-1116,44636,0,-1068,44554,702,
+ QUADSTRIP,-1116,44636,0,-1068,44554,702,-1102,45692,0,-1054,45576,702,
+ -973,45829,0,-973,45747,702,973,45829,0,973,45747,702,1102,45692,0,
+ 1054,45576,702,1116,44636,0,1068,44554,702,
+ QUADSTRIP,1116,44636,0,1068,44554,702,2862,44347,0,2739,44282,702,
+ 3075,43849,0,2943,43805,702,3075,41520,0,2943,41585,702,2956,41104,0,
+ 2829,41187,702,1531,40917,0,1465,41008,702,
+ QUADSTRIP,1531,40917,0,1465,41008,702,1651,40481,0,1580,40590,702,
+ 1613,39866,0,1543,39866,702,
+ QUADSTRIP,-1543,39866,702,1543,39866,702,-1580,40590,702,
+ 1580,40590,702,-1465,41008,702,1465,41008,702,-2829,41187,702,
+ 2829,41187,702,-2943,41585,702,2943,41585,702,-2943,43805,702,
+ 2943,43805,702,-2739,44282,702,2739,44282,702,-1068,44554,702,
+ 1068,44554,702,-1054,45576,702,1054,45576,702,-973,45747,702,
+ 973,45747,702,
+ QUADSTRIP,-1543,39866,-702,BACKREF,0,0,-1580,40590,-702,BACKREF,0,2,
+ -1465,41008,-702,BACKREF,0,4,
+ QUADSTRIP,-1465,41008,-702,BACKREF,0,6,-2829,41187,-702,BACKREF,0,8,
+ -2943,41585,-702,BACKREF,0,10,-2943,43805,-702,BACKREF,0,12,
+ -2739,44282,-702,BACKREF,0,14,-1068,44554,-702,BACKREF,0,16,
+ QUADSTRIP,-1068,44554,-702,BACKREF,0,18,-1054,45576,-702,
+ BACKREF,0,20,-973,45747,-702,BACKREF,0,22,973,45747,-702,BACKREF,0,24,
+ 1054,45576,-702,BACKREF,0,26,1068,44554,-702,BACKREF,0,28,
+ QUADSTRIP,1068,44554,-702,BACKREF,0,30,2739,44282,-702,
+ BACKREF,0,32,2943,43805,-702,BACKREF,0,34,2943,41585,-702,BACKREF,0,36,
+ 2829,41187,-702,BACKREF,0,38,1465,41008,-702,BACKREF,0,40,
+ QUADSTRIP,1465,41008,-702,BACKREF,0,42,1580,40590,-702,
+ BACKREF,0,44,1543,39866,-702,BACKREF,0,46,
+ QUADSTRIP,1543,39866,-702,-1543,39866,-702,1580,40590,-702,
+ -1580,40590,-702,1465,41008,-702,-1465,41008,-702,2829,41187,-702,
+ -2829,41187,-702,2943,41585,-702,-2943,41585,-702,2943,43805,-702,
+ -2943,43805,-702,2739,44282,-702,-2739,44282,-702,1068,44554,-702,
+ -1068,44554,-702,1054,45576,-702,-1054,45576,-702,973,45747,-702,
+ -973,45747,-702,
+ ENDOFDATA
+};
+
+static unsigned short queen_data[] = {
+ SPIN,24,
+ 11092,0,11092,914,SEAM,10653,1284,
+ 11018,1798,11018,2358,10787,2866,
+ STEPDOWN,8739,3726,7412,5168,6937,7171,
+ STEPUP,6737,9556,6537,9762,STEPDOWN,5536,10191,5073,10546,
+ 4368,11485,3678,15137,SEAM,3259,26879,
+ 5966,27091,STEPUP,7332,27515,7619,27882,7545,28455,7317,28751,
+ 5654,29177,5538,29326,5542,29982,5377,30278,
+ STEPDOWN,SEAM,4194,30585,
+ SEAM,4226,31822,5002,32218,STEPUP,5139,32477,5058,32774,
+ SEAM,4227,33040,STEPDOWN,4421,34778,5042,36612,5874,38429,
+ STEPUP,SEAM,PATTERN,3,6018,39660,6018,39660,6804,39977,
+ SEAM,PATTERN,3,5015,41139,5015,41139,5673,41460,
+ SEAM,4349,40044,
+ STEPDOWN,SEAM,1381,41188,
+ 1396,42332,STEPDOWN,1082,43072,481,43476,0,43543,
+ ENDOFDATA
+};
+
+static unsigned short pawn_data[] = {
+ SPIN,16,
+ 7395,0,7395,609,
+ SEAM,7102,910,7345,1199,7345,1572,7191,1910,
+ STEPDOWN,5826,2484,4941,3446,4625,4781,
+ STEPUP,4492,6371,4358,6508,
+ STEPDOWN,3691,6794,2912,7657,2473,10091,
+ SEAM,2100,15344,
+ STEPUP,4518,15697,4695,15900,4649,16218,4509,16382,
+ STEPDOWN,SEAM,3150,16755,STEPUP,3858,17678,4303,18752,4455,19905,
+ 4303,21058,3858,22132,
+ STEPDOWN,3150,23055,2227,23763,STEPDOWN,1153,24208,0,24360,
+ ENDOFDATA
+};
+
+static unsigned short rook_data[] = {
+ SPIN,20,
+ 9374,0,9374,756,SEAM,9003,1062,9311,1487,
+ 9311,1951,9116,2371,8521,3083,6701,5807,SEAM,6009,7595,
+ 6167,7812,6138,8066,5926,8460,5216,12608,
+ SEAM,4883,21434,
+ SEAM,5140,21608,
+ SEAM,5176,22792,
+ SEAM,5953,23030,
+/* SEAM,PATTERN,5,6103,26819,6143,27971,6143,27971,6143,27971,6103,26819, */
+/* SEAM,PATTERN,5, 5020,26819,5053,27971,5053,27971,5053,27971, 5020,26819, */
+ SETBACKREF,0,
+ 6103,26819,
+
+ SETBACKREF,1,
+ SPIN,20,
+ 5020,26819,5020,26114,4906,25858,0,25666,
+
+ POLARQUADSTRIP,20,BACKREF,0,1,1,6143,27971,BACKREF,0,2,2,6143,27971,
+ BACKREF,0,3,3,6143,27971,BACKREF,0,4,4,6143,27971,
+ POLARQUADSTRIP,20,BACKREF,0,6,6,6143,27971,BACKREF,0,7,7,6143,27971,
+ BACKREF,0,8,8,6143,27971,BACKREF,0,9,9,6143,27971,
+ POLARQUADSTRIP,20,BACKREF,0,11,11,6143,27971,BACKREF,0,12,12,6143,27971,
+ BACKREF,0,13,13,6143,27971,BACKREF,0,14,14,6143,27971,
+ POLARQUADSTRIP,20,BACKREF,0,16,16,6143,27971,BACKREF,0,17,17,6143,27971,
+ BACKREF,0,18,18,6143,27971,BACKREF,0,19,19,6143,27971,
+
+ POLARQUADSTRIP,20,1,5053,27971,BACKREF,1,1,2,5053,27971,BACKREF,1,2,
+ 3,5053,27971,BACKREF,1,3,4,5053,27971,BACKREF,1,4,
+ POLARQUADSTRIP,20,6,5053,27971,BACKREF,1,6,7,5053,27971,BACKREF,1,7,
+ 8,5053,27971,BACKREF,1,8,9,5053,27971,BACKREF,1,9,
+ POLARQUADSTRIP,20,11,5053,27971,BACKREF,1,11,12,5053,27971,BACKREF,1,12,
+ 13,5053,27971,BACKREF,1,13,14,5053,27971,BACKREF,1,14,
+ POLARQUADSTRIP,20,16,5053,27971,BACKREF,1,16,17,5053,27971,BACKREF,1,17,
+ 18,5053,27971,BACKREF,1,18,19,5053,27971,BACKREF,1,19,
+
+ POLARQUADSTRIP,20,1,5020,26819,1,6103,26819,
+ 0,5020,26819,0,6103,26819,19,5020,26819,19,6103,26819,
+ POLARQUADSTRIP,20,6,5020,26819,6,6103,26819,
+ 5,5020,26819,5,6103,26819,4,5020,26819,4,6103,26819,
+ POLARQUADSTRIP,20,11,5020,26819,11,6103,26819,
+ 10,5020,26819,10,6103,26819,9,5020,26819,9,6103,26819,
+ POLARQUADSTRIP,20,16,5020,26819,16,6103,26819,
+ 15,5020,26819,15,6103,26819,14,5020,26819,14,6103,26819,
+
+ POLARQUADSTRIP,20,1,5053,27971,1,6143,27971,1,5020,26819,1,6103,26819,
+ POLARQUADSTRIP,20,4,5020,26819,4,6103,26819,4,5053,27971,4,6143,27971,
+ POLARQUADSTRIP,20,6,5053,27971,6,6143,27971,6,5020,26819,6,6103,26819,
+ POLARQUADSTRIP,20,9,5020,26819,9,6103,26819,9,5053,27971,9,6143,27971,
+ POLARQUADSTRIP,20,11,5053,27971,11,6143,27971,11,5020,26819,11,6103,26819,
+ POLARQUADSTRIP,20,14,5020,26819,14,6103,26819,14,5053,27971,14,6143,27971,
+ POLARQUADSTRIP,20,16,5053,27971,16,6143,27971,16,5020,26819,16,6103,26819,
+ POLARQUADSTRIP,20,19,5020,26819,19,6103,26819,19,5053,27971,19,6143,27971,
+
+ POLARQUADSTRIP,20,1,6143,27971,1,5053,27971,2,6143,27971,2,5053,27971,
+ 3,6143,27971,3,5053,27971,4,6143,27971,4,5053,27971,
+ POLARQUADSTRIP,20,6,6143,27971,6,5053,27971,7,6143,27971,7,5053,27971,
+ 8,6143,27971,8,5053,27971,9,6143,27971,9,5053,27971,
+ POLARQUADSTRIP,20,11,6143,27971,11,5053,27971,12,6143,27971,12,5053,27971,
+ 13,6143,27971,13,5053,27971,14,6143,27971,14,5053,27971,
+ POLARQUADSTRIP,20,16,6143,27971,16,5053,27971,17,6143,27971,17,5053,27971,
+ 18,6143,27971,18,5053,27971,19,6143,27971,19,5053,27971,
+
+ ENDOFDATA
+};
+
+static double piece_size;
+
+static int
+enumerate_ring_vertices( int steps, unsigned short *data, void *h,
+ void (*process_vertex)(void *h,double x,double y,double z))
+{
+ int patlen = 1,i;
+ unsigned short *pts = data;
+ double dtheta = M_PI * 2 / steps;
+
+ if( data[0] == PATTERN) {
+ patlen = data[1];
+ pts += 2;
+ }
+
+ if( pts[0] == 0) steps = 1;
+
+ for( i=0; i < steps; i++) {
+ double r = pts[(i % patlen)*2] * piece_size;
+ double y = pts[(i % patlen)*2+1] * piece_size;
+ double theta = dtheta * i;
+
+ process_vertex( h, r * cos(theta), y, r * sin(theta));
+ }
+
+ return pts + patlen * 2 - data;
+}
+
+static void
+enumerate_vertices( unsigned short *data, void *h,
+ void (*process_vertex)(void *h,double x,double y,double z))
+{
+ while(1) {
+ if( data[0] == SPIN) {
+ int steps;
+ steps = data[1];
+ data += 2;
+
+ while(data[0] <= SEAM) {
+ if( data[0] == SETBACKREF || data[0] == BACKREF) {
+ data += 2;
+ continue;
+ } else if( data[0] == STEPUP) {
+ steps *= 2;
+ data++;
+ continue;
+ } else if( data[0] == STEPDOWN) {
+ steps /= 2;
+ data++;
+ continue;
+ } else if( data[0] == SEAM) {
+ data ++;
+ /* Visit seam vertices twice */
+ enumerate_ring_vertices( steps, data,
+ h, process_vertex);
+ data += enumerate_ring_vertices( steps, data,
+ h, process_vertex);
+ } else {
+ data += enumerate_ring_vertices( steps, data,
+ h, process_vertex);
+ }
+ }
+ } else if( data[0] == POLARQUADSTRIP) {
+ int steps = data[1];
+ double dtheta;
+ data += 2;
+
+ dtheta = M_PI * 2 / steps;
+
+ while(data[0] <= SEAM) {
+ if( data[0] != BACKREF) {
+ double theta = dtheta * data[0];
+ double r = data[1] * piece_size;
+ double y = data[2] * piece_size;
+ process_vertex( h, r * cos(theta), y, r * sin(theta));
+ }
+ data += 3;
+ }
+ } else if( data[0] == QUADSTRIP || data[0] == VERTICES) {
+ data ++;
+
+ while(data[0] <= SEAM) {
+ if( data[0] == SETBACKREF) {
+ data += 2;
+ continue;
+ }
+
+ if( data[0] != BACKREF) {
+ double x = (signed short)data[0] * piece_size;
+ double y = data[1] * piece_size;
+ double z = (signed short)data[2] * piece_size;
+ process_vertex( h, x, y, z);
+ }
+ data += 3;
+ }
+ } else if( data[0] == QUADS || data[0] == TRIANGLES) {
+ data ++;
+ while( data[0] <= SEAM) data++;
+ } else {
+ break;
+ }
+ }
+}
+
+static void
+enumerate_ring_faces( int basevertex, int steps,
+ int prevbase, int prevsteps, void *h, int *count_ret,
+ void (*process_face)(void *h,int v1,int v2,int v3,int v4))
+{
+ int i,j;
+
+ if( steps == 1) {
+ for( i=0; i < prevsteps; i++) {
+ process_face( h,
+ basevertex,
+ prevbase + i,
+ prevbase + (i ? i-1 : prevsteps-1),
+ -1);
+ if (count_ret) (*count_ret)++;
+ }
+ } else if( steps == prevsteps) {
+ for( i=0; i < steps; i++) {
+ process_face( h,
+ basevertex + i,
+ prevbase + i,
+ prevbase + (i ? i-1 : steps-1),
+ basevertex + (i ? i-1 : steps-1));
+ if (count_ret) (*count_ret)++;
+ }
+ } else {
+ j = 0;
+ for( i=0;; i++) {
+ while( j < prevsteps && steps*(1+2*j) < prevsteps*(1+2*i)) {
+ process_face( h,
+ basevertex + (i%steps),
+ prevbase + ((j+1)%prevsteps),
+ prevbase + j,
+ -1);
+ if (count_ret) (*count_ret)++;
+ j++;
+ }
+ if( i == steps) break;
+ process_face( h,
+ basevertex + i,
+ basevertex + ((i+1)%steps),
+ prevbase + (j%prevsteps),
+ -1);
+ if (count_ret) (*count_ret)++;
+ }
+ }
+}
+
+static void
+enumerate_faces( unsigned short *data, void *h, int *count_ret,
+ void (*process_face)(void *h,int v1,int v2,int v3,int v4))
+{
+ int basevertex = 0, startofvertices = 0;
+ int backrefs[5];
+
+ while(1) {
+ if( data[0] == SPIN) {
+ int steps;
+ int prevsteps = -1,prevbase = 0;
+
+ steps = data[1];
+ data += 2;
+
+ while( data[0] <= SEAM) {
+ if( data[0] == SETBACKREF) {
+ backrefs[data[1]] = basevertex;
+ data += 2;
+ continue;
+ }
+
+ if( data[0] == STEPUP) {
+ steps *= 2;
+ data++;
+ continue;
+ } else if( data[0] == STEPDOWN) {
+ steps /= 2;
+ data++;
+ continue;
+ }
+
+ if( data[0] == BACKREF) {
+ if( prevsteps != -1) {
+ enumerate_ring_faces( backrefs[data[1]], steps,
+ prevbase, prevsteps, h,
+ count_ret, process_face);
+ }
+
+ prevbase = backrefs[data[1]];
+ data += 2;
+ } else {
+ int isseam = 0;
+ if( data[0] == SEAM) {
+ isseam = 1;
+ data++;
+ }
+
+ if( data[0] == PATTERN) {
+ data += 2 + data[1]*2;
+ } else {
+ if( data[0] == 0) steps = 1;
+ data += 2;
+ }
+
+ if( prevsteps != -1) {
+ enumerate_ring_faces( basevertex, steps,
+ prevbase, prevsteps, h,
+ count_ret, process_face);
+ }
+
+ if( isseam) basevertex += steps;
+ prevbase = basevertex;
+ basevertex += steps;
+ }
+
+ prevsteps = steps;
+ }
+ } else if( data[0] == POLARQUADSTRIP || data[0] == QUADSTRIP) {
+ int v0=-1,v1=0,v2,v3;
+ if( data[0] == POLARQUADSTRIP) data += 2;
+ else data ++;
+ while(data[0] <= SEAM) {
+ if( data[0] == BACKREF) {
+ v2 = backrefs[data[1]]+data[2];
+ } else {
+ v2 = basevertex;
+ basevertex++;
+ }
+ if( data[3] == BACKREF) {
+ v3 = backrefs[data[4]]+data[5];
+ } else {
+ v3 = basevertex;
+ basevertex++;
+ }
+ data += 6;
+ if( v0 != -1) {
+ process_face( h, v0, v1, v3, v2);
+ if (count_ret) (*count_ret)++;
+ }
+ v0 = v2;
+ v1 = v3;
+ }
+ } else if( data[0] == VERTICES) {
+ data ++;
+ startofvertices = basevertex;
+ while( data[0] <= SEAM) {
+ if( data[0] == SETBACKREF) {
+ backrefs[data[1]] = basevertex;
+ data += 2;
+ continue;
+ }
+ data += 3;
+ basevertex ++;
+ }
+ } else if( data[0] == QUADS) {
+ data ++;
+ while( data[0] <= SEAM) {
+ process_face( h,
+ data[0] + startofvertices,
+ data[1] + startofvertices,
+ data[2] + startofvertices,
+ data[3] + startofvertices);
+ if (count_ret) (*count_ret)++;
+ data += 4;
+ }
+ } else if( data[0] == TRIANGLES) {
+ data ++;
+ while( data[0] <= SEAM) {
+ process_face( h,
+ data[0] + startofvertices,
+ data[1] + startofvertices,
+ data[2] + startofvertices, -1);
+ if (count_ret) (*count_ret)++;
+ data += 3;
+ }
+ } else {
+ break;
+ }
+ }
+}
+
+static void
+normalize( float v[3]) {
+ float d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
+
+ if( d == 0.0) {
+ /* The direction is undefined - normalize it anyway */
+ v[0] = 1.0;
+ v[1] = 0.0;
+ v[2] = 0.0;
+ return;
+ }
+
+ v[0] /= d;
+ v[1] /= d;
+ v[2] /= d;
+}
+
+static void
+normcrossprod( float v1[3], float v2[3], float out[3])
+{
+ out[0] = v1[1] * v2[2] - v1[2] * v2[1];
+ out[1] = v1[2] * v2[0] - v1[0] * v2[2];
+ out[2] = v1[0] * v2[1] - v1[1] * v2[0];
+ normalize( out);
+}
+
+#define vectordiff(v1,v2,out) \
+ ((out)[0] = (v1)[0] - (v2)[0], \
+ (out)[1] = (v1)[1] - (v2)[1], \
+ (out)[2] = (v1)[2] - (v2)[2])
+
+#define vectoradd(v1,v2) \
+ ((v1)[0] += (v2)[0], \
+ (v1)[1] += (v2)[1], \
+ (v1)[2] += (v2)[2])
+
+static int numverts;
+static float *vertices;
+static float *normals;
+
+static void
+count_vertex( void *dummy, double x, double y, double z)
+{
+ numverts++;
+}
+
+static void
+add_normal( void *dummy, int v1, int v2, int v3, int v4)
+{
+ float surfnormal[3],d1[3],d2[3];
+
+ if( v4 == -1) {
+ vectordiff( vertices + 3 * v2, vertices + 3 * v1, d1);
+ vectordiff( vertices + 3 * v3, vertices + 3 * v1, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v1, surfnormal);
+ vectoradd( normals + 3 * v2, surfnormal);
+ vectoradd( normals + 3 * v3, surfnormal);
+ } else {
+ vectordiff( vertices + 3 * v2, vertices + 3 * v1, d1);
+ vectordiff( vertices + 3 * v4, vertices + 3 * v1, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v1, surfnormal);
+ vectordiff( vertices + 3 * v3, vertices + 3 * v2, d1);
+ vectordiff( vertices + 3 * v1, vertices + 3 * v2, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v2, surfnormal);
+ vectordiff( vertices + 3 * v4, vertices + 3 * v3, d1);
+ vectordiff( vertices + 3 * v2, vertices + 3 * v3, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v3, surfnormal);
+ vectordiff( vertices + 3 * v1, vertices + 3 * v4, d1);
+ vectordiff( vertices + 3 * v3, vertices + 3 * v4, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v4, surfnormal);
+ }
+}
+
+static void
+collect_vertex( void *curvert, double x, double y, double z)
+{
+ (*(float**)curvert)[0] = x;
+ (*(float**)curvert)[1] = y;
+ (*(float**)curvert)[2] = z;
+ (*(float**)curvert) += 3;
+}
+
+static void
+draw_face( void *dummy, int v1, int v2, int v3, int v4)
+{
+ glBegin( v4 == -1 ? GL_TRIANGLES : GL_QUADS);
+ glNormal3f( normals[v1*3], normals[v1*3+1], normals[v1*3+2]);
+ glVertex3f( vertices[v1*3], vertices[v1*3+1], vertices[v1*3+2]);
+ glNormal3f( normals[v2*3], normals[v2*3+1], normals[v2*3+2]);
+ glVertex3f( vertices[v2*3], vertices[v2*3+1], vertices[v2*3+2]);
+ glNormal3f( normals[v3*3], normals[v3*3+1], normals[v3*3+2]);
+ glVertex3f( vertices[v3*3], vertices[v3*3+1], vertices[v3*3+2]);
+ if( v4 != -1) {
+ glNormal3f( normals[v4*3], normals[v4*3+1], normals[v4*3+2]);
+ glVertex3f( vertices[v4*3], vertices[v4*3+1], vertices[v4*3+2]);
+ }
+ glEnd();
+}
+
+static int
+draw_piece( unsigned short *piece_data)
+{
+ int i;
+ float *curvert;
+ int count = 0;
+
+ /* Count how many vertices this piece has */
+ enumerate_vertices( piece_data, NULL, count_vertex);
+
+ /* Allocate memory for the vertices and for the vertex normals */
+ vertices = malloc( sizeof(float) * 3 * numverts);
+ normals = malloc( sizeof(float) * 3 * numverts);
+ if( !vertices || !normals) exit(1);
+
+ /* Collect the vertex coordinates */
+ curvert = vertices;
+ enumerate_vertices( piece_data, &curvert, collect_vertex);
+
+ /* Zero out the normals */
+ for( i=0; i < numverts * 3; i++) {
+ normals[i] = 0.0;
+ }
+
+ /* Add up all the face normals at each vertex */
+ enumerate_faces( piece_data, NULL, NULL, add_normal);
+
+ /* Normalize the vertex normals */
+ for( i=0; i < numverts; i++) {
+ normalize( normals + i * 3);
+ }
+
+ /* Now draw the faces */
+ enumerate_faces( piece_data, NULL, &count, draw_face);
+
+ free( normals);
+ free( vertices);
+
+ if (count <= 1) abort();
+ return count;
+}
+
+void chessmodels_gen_lists( int classic, int poly_count[PIECES]) {
+
+ Bool queen_only_p = classic < 0;
+ if (classic < 0) classic = 0;
+
+ piece_size = classic ? 0.095 / 100 : 0.3 / 8192;
+
+ glGenLists (20); /* this is horrible! List numbers are hardcoded! */
+
+ glNewList(QUEEN, GL_COMPILE);
+ poly_count[QUEEN] = draw_piece( classic ? classic_queen_data : queen_data);
+ glEndList();
+
+ if (queen_only_p) return;
+
+ glNewList(KING, GL_COMPILE);
+ poly_count[KING] = draw_piece( classic ? classic_king_data : king_data);
+ glEndList();
+
+ glNewList(BISHOP, GL_COMPILE);
+ poly_count[BISHOP] = draw_piece( classic ? classic_bishop_data : bishop_data);
+ glEndList();
+
+ glNewList(KNIGHT, GL_COMPILE);
+ poly_count[KNIGHT] = draw_piece( classic ? classic_knight_data : knight_data);
+ glEndList();
+
+ glNewList(ROOK, GL_COMPILE);
+ poly_count[ROOK] = draw_piece( classic ? classic_rook_data : rook_data);
+ glEndList();
+
+ glNewList(PAWN, GL_COMPILE);
+ poly_count[PAWN] = draw_piece( classic ? classic_pawn_data : pawn_data);
+ glEndList();
+}
diff --git a/hacks/glx/chessmodels.h b/hacks/glx/chessmodels.h
new file mode 100644
index 0000000..6e41e22
--- /dev/null
+++ b/hacks/glx/chessmodels.h
@@ -0,0 +1,44 @@
+/*
+ * models for the xss chess screensavers
+ * hacked from:
+ *
+ * glChess - A 3D chess interface
+ *
+ * Copyright (C) 2006 John-Paul Gignac <jjgignac@users.sf.net>
+ *
+ * Copyright (C) 2002 Robert Ancell <bob27@users.sourceforge.net>
+ * Michael Duelli <duelli@users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ugggggggly */
+#define PIECES 7
+#define NONE 0
+#define KING 1
+#define QUEEN 2
+#define BISHOP 3
+#define KNIGHT 4
+#define ROOK 5
+#define PAWN 6
+#define BKING 8
+#define BQUEEN 9
+#define BBISHOP 10
+#define BKNIGHT 11
+#define BROOK 12
+#define BPAWN 13
+
+extern void chessmodels_gen_lists( int classic, int poly_count[PIECES]);
+
diff --git a/hacks/glx/circuit.c b/hacks/glx/circuit.c
new file mode 100644
index 0000000..744e4b6
--- /dev/null
+++ b/hacks/glx/circuit.c
@@ -0,0 +1,2094 @@
+/*
+ * circuit - Random electronic components floating around
+ *
+ * version 1.4
+ *
+ * Since version 1.1: added to-220 transistor, added fuse
+ * Since version 1.2: random display digits, LED improvements (flickering)
+ * Since version 1.3: ICs look better, font textures, improved normals to
+ * eliminate segmenting on curved surfaces, speedups
+ * Since version 1.4: Added RCA connector, 3.5mm connector, slide switch,
+ * surface mount, to-92 markings. Fixed ~5min crash.
+ * Better LED illumination. Other minor changes.
+ *
+ * Copyright (C) 2001-2015 Ben Buxton (bb@cactii.net)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Written over a few days in a (successful) bid to learn GL coding
+ *
+ * -seven option is dedicated to all the Slarkeners
+ *
+ * This hack uses lookup tables for sin, cos and tan - it can do a lot
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*componentFont: -*-courier-bold-r-normal-*-*-140-*-*-*-*-*-*"
+
+# define release_circuit 0
+# define circuit_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#define DEF_SPIN "True"
+#define DEF_SEVEN "False"
+#define DEF_PARTS "10"
+#define DEF_ROTATESPEED "1"
+#define DEF_LIGHT "True"
+
+/* lifted from lament.c */
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+
+#ifdef USE_GL
+
+#include "texfont.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static int maxparts;
+static int rotatespeed;
+static int spin;
+static int uselight;
+static int seven;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ {"-parts", ".circuit.parts", XrmoptionSepArg, 0 },
+ {"-rotate-speed", ".circuit.rotatespeed", XrmoptionSepArg, 0 },
+ {"+spin", ".circuit.spin", XrmoptionNoArg, "false" },
+ {"-spin", ".circuit.spin", XrmoptionNoArg, "true" },
+ {"+light", ".circuit.light", XrmoptionNoArg, "false" },
+ {"-light", ".circuit.light", XrmoptionNoArg, "true" },
+ {"+seven", ".circuit.seven", XrmoptionNoArg, "false" },
+ {"-seven", ".circuit.seven", XrmoptionNoArg, "true" },
+};
+
+static argtype vars[] = {
+ {&maxparts, "parts", "Parts", DEF_PARTS, t_Int},
+ {&rotatespeed, "rotatespeed", "Rotatespeed", DEF_ROTATESPEED, t_Int},
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&uselight, "light", "Light", DEF_LIGHT, t_Bool},
+ {&seven, "seven", "Seven", DEF_SEVEN, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt circuit_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct circuit_description =
+{"circuit", "init_circuit", "draw_circuit", NULL,
+ "draw_circuit", "init_circuit", "free_circuit", &circuit_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Flying electronic components", 0, NULL};
+
+#endif
+
+#define MAX_COMPONENTS 400
+#define MOVE_MULT 0.02
+
+static float f_rand(void)
+{
+ return ((float)RAND(10000)/(float)10000);
+}
+
+#define RAND_RANGE(min, max) ((min) + (max - min) * f_rand())
+
+/* Represents a band on a resistor/diode/etc */
+typedef struct {
+ float pos; /* relative position from start/previous band */
+ GLfloat r, g, b; /* colour of the band */
+ float len; /* length as a fraction of total length */
+} Band;
+
+typedef struct {
+ Band *b1, *b2, *b3, *b4; /* bands */
+ int b[4];
+} Resistor;
+
+typedef struct {
+ Band *band;
+ GLfloat r, g, b; /* body colour */
+} Diode;
+
+static const char * const transistortypes[] = {
+ "TIP2955",
+ "TIP32C",
+ "LM 350T",
+ "IRF730",
+ "ULN2577",
+ "7805T",
+ "7912T",
+ "TIP120",
+ "2N6401",
+ "BD239",
+ "2SC1590",
+ "MRF485",
+ "SC141D"
+};
+
+static const char * const to92types[] = {
+ "C\n548",
+ "C\n848",
+ "74\nL05",
+ "C\n858",
+ "BC\n212L",
+ "BC\n640",
+ "BC\n337",
+ "BC\n338",
+ "S817",
+ "78\nL12",
+ "TL\n431",
+ "LM\n35DZ",
+};
+
+static const char * const smctypes[] = {
+ "1M-",
+ "1K",
+ "1F",
+ "B10",
+ "S14",
+ "Q3",
+ "4A"
+};
+
+typedef struct {
+ int type; /* package type. 0 = to-92, 1 = to-220 */
+ const char *text;
+} Transistor;
+
+typedef struct {
+ GLfloat r,g,b; /* LED colour */
+ int light; /* are we the light source? */
+} LED;
+
+typedef struct {
+ int type; /* 0 = electro, 1 = ceramic */
+ float width; /* width of an electro/ceramic */
+ float length; /* length of an electro */
+} Capacitor;
+
+/* 3.5 mm plug */
+typedef struct {
+ int blah;
+} ThreeFive;
+
+/* slide switch */
+typedef struct {
+ int position;
+} Switch;
+
+typedef struct {
+ int pins;
+ const char *val;
+} ICTypes;
+
+static const ICTypes ictypes[] = {
+ {8, "NE 555"},
+ {8, "LM 386N"},
+ {8, "ADC0831"},
+ {8, "LM 383T"},
+ {8, "TL071"},
+ {8, "LM 311"},
+ {8, "LM393"},
+ {8, "LM 3909"},
+
+ {14, "LM 380N"},
+ {14, "NE 556"},
+ {14, "TL074"},
+ {14, "LM324"},
+ {14, "LM339"},
+ {14, "MC1488"},
+ {14, "MC1489"},
+ {14, "LM1877-9"},
+ {14, "4011"},
+ {14, "4017"},
+ {14, "4013"},
+ {14, "4024"},
+ {14, "4066"},
+
+ {16, "4076"},
+ {16, "4049"},
+ {16, "4094"},
+ {16, "4043"},
+ {16, "4510"},
+ {16, "4511"},
+ {16, "4035"},
+ {16, "RS232"},
+ {16, "MC1800"},
+ {16, "ULN2081"},
+ {16, "UDN2953"},
+
+ {24, "ISD1416P"},
+ {24, "4515"},
+ {24, "TMS6264L"},
+ {24, "MC146818"}
+};
+
+typedef struct {
+ int type; /* 0 = DIL, 1 = flat square */
+ int pins;
+ char text[100];
+} IC;
+
+/* 7 segment display */
+
+typedef struct {
+ int value; /* displayed number */
+} Disp;
+
+typedef struct {
+ GLfloat l, w;
+} Fuse;
+
+typedef struct {
+ GLfloat l, w;
+ int col;
+} RCA;
+
+typedef struct {
+ GLfloat x, y, z; /* current co-ordinates */
+ GLfloat dx, dy, dz; /* current direction */
+ GLfloat rotx, roty, rotz; /* rotation vector */
+ GLfloat drot; /* rotation velocity (degrees per frame) */
+ int norm; /* Normalize this component (for shine) */
+ int rdeg; /* current rotation degrees */
+ int angle; /* angle about the z axis */
+ int alpha; /* 0 if not a transparent component */
+ int type; /* 0 = resistor, 1 = diode, 2 = transistor, 3 = LED, 4 = cap, 5=IC,
+ 6 = 7 seg disp */
+ void * c; /* pointer to the component */
+} Component;
+
+/* standard colour codes */
+
+static const GLfloat colorcodes [12][3] = {
+ {0.0,0.0,0.0}, /* black 0 */
+ {0.49,0.25,0.08}, /* brown 1 */
+ {1.0,0.0,0.0}, /* red 2 */
+ {1.0,0.5,0.0}, /* orange 3 */
+ {1.0,1.0,0.0}, /* yellow 4 */
+ {0.0,1.0,0.0}, /* green 5 */
+ {0.0,0.5,1.0}, /* blue 6 */
+ {0.7,0.2,1.0}, /* violet 7 */
+ {0.5,0.5,0.5}, /* grey 8 */
+ {1.0,1.0,1.0}, /* white 9 */
+ {0.66,0.56,0.2}, /* gold 10 */
+ {0.8,0.8,0.8}, /* silver 11 */
+};
+
+/* base values for components - we can multiply by 0 - 1M */
+static const int values [9][2] = {
+ {1,0},
+ {2,2},
+ {3,3},
+ {4,7},
+ {5,6},
+ {6,8},
+ {7,5},
+ {8,2},
+ {9,1}
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+
+ int XMAX, YMAX;
+ int win_w, win_h;
+
+ /* one lucky led gets to be a light source , unless -no-light*/
+ int light;
+ int lighton;
+
+ /* stores refs to textures */
+ int s_refs[50];
+
+ GLfloat viewer[3];
+ GLfloat lightpos[4];
+
+ float sin_table[720];
+ float cos_table[720];
+ float tan_table[720];
+
+ Component *components[MAX_COMPONENTS];
+ int band_list[12];
+ int band_list_polys[12];
+
+ GLfloat grid_col[3], grid_col2[3];
+
+ int display_i;
+ GLfloat rotate_angle;
+
+ texture_font_data *font;
+ char *font_strings[50]; /* max of 40 textures */
+ int font_w[50], font_h[50];
+ int font_init;
+
+ GLfloat draw_sx, draw_sy; /* bright spot co-ords */
+ int draw_sdir; /* 0 = left-right, 1 = right-left, 2 = up->dn, 3 = dn->up */
+ int draw_s; /* if spot is enabled */
+ float draw_ds; /* speed of spot */
+
+} Circuit;
+
+static Circuit *circuit = NULL;
+
+
+static int DrawResistor(Circuit *, Resistor *);
+static int DrawDiode(Circuit *, Diode *);
+static int DrawTransistor(Circuit *, Transistor *);
+static int DrawLED(Circuit *, LED *);
+static int DrawIC(Circuit *, IC *);
+static int DrawCapacitor(Circuit *, Capacitor *);
+static int DrawDisp(Circuit *, Disp *);
+static int DrawFuse(Circuit *, Fuse *);
+static int DrawRCA(Circuit *, RCA *);
+static int DrawThreeFive(Circuit *, ThreeFive *);
+static int DrawSwitch(Circuit *, Switch *);
+
+static void reorder(Component *[]);
+static int circle(Circuit *, float, int,int);
+static int bandedCylinder(Circuit *,
+ float, float , GLfloat, GLfloat , GLfloat,
+ Band **, int);
+static int Rect(GLfloat , GLfloat , GLfloat, GLfloat , GLfloat ,GLfloat);
+static int ICLeg(GLfloat, GLfloat, GLfloat, int);
+static int HoledRectangle(Circuit *ci,
+ GLfloat, GLfloat, GLfloat, GLfloat, int);
+static Resistor *NewResistor(void);
+static Diode *NewDiode(void);
+static Transistor *NewTransistor(ModeInfo *);
+static LED * NewLED(Circuit *);
+static Capacitor *NewCapacitor(Circuit *);
+static IC* NewIC(ModeInfo *);
+static Disp* NewDisp(Circuit *);
+static Fuse *NewFuse(Circuit *);
+static RCA *NewRCA(Circuit *);
+static ThreeFive *NewThreeFive(Circuit *);
+static Switch *NewSwitch(Circuit *);
+
+/* we use trig tables to speed things up - 200 calls to sin()
+ in one frame can be a bit harsh..
+*/
+
+static void make_tables(Circuit *ci)
+{
+int i;
+float f;
+
+ f = 360 / (M_PI * 2);
+ for (i = 0 ; i < 720 ; i++) {
+ ci->sin_table[i] = sin(i/f);
+ }
+ for (i = 0 ; i < 720 ; i++) {
+ ci->cos_table[i] = cos(i/f);
+ }
+ for (i = 0 ; i < 720 ; i++) {
+ ci->tan_table[i] = tan(i/f);
+ }
+}
+
+
+static int createCylinder (Circuit *ci,
+ float length, float radius, int endcaps, int half)
+{
+ int polys = 0;
+ int a; /* current angle around cylinder */
+ int angle, norm;
+ float z1, y1, z2, y2,ex;
+ int nsegs;
+
+ glPushMatrix();
+ nsegs = radius*MAX(ci->win_w, ci->win_h)/20;
+ nsegs = MAX(nsegs, 4);
+ if (nsegs % 2)
+ nsegs += 1;
+ angle = (half) ? (180 - 90/nsegs) : 374;
+ z1 = radius; y1 = 0;
+ glBegin(GL_QUADS);
+ for (a = 0 ; a <= angle ; a+= angle/nsegs) {
+ y2=radius*(float)ci->sin_table[(int)a];
+ z2=radius*(float)ci->cos_table[(int)a];
+ glNormal3f(0, y1, z1);
+ glVertex3f(0,y1,z1);
+ glVertex3f(length,y1,z1);
+ glNormal3f(0, y2, z2);
+ glVertex3f(length,y2,z2);
+ glVertex3f(0,y2,z2);
+ polys++;
+ z1=z2;
+ y1=y2;
+ }
+ glEnd();
+ if (half) {
+ glBegin(GL_POLYGON);
+ glNormal3f(0, 1, 0);
+ glVertex3f(0, 0, radius);
+ glVertex3f(length, 0, radius);
+ glVertex3f(length, 0, 0 - radius);
+ glVertex3f(0, 0, 0 - radius);
+ polys++;
+ glEnd();
+ }
+ if (endcaps) {
+ for(ex = 0 ; ex <= length ; ex += length) {
+ z1 = radius; y1 = 0;
+ norm = (ex == length) ? 1 : -1;
+ glBegin(GL_TRIANGLES);
+ glNormal3f(norm, 0, 0);
+ for (a = 0 ; a <= angle ; a+= angle/nsegs) {
+ y2=radius*(float)ci->sin_table[(int)a];
+ z2=radius*(float)ci->cos_table[(int)a];
+ glVertex3f(ex,0, 0);
+ glVertex3f(ex,y1,z1);
+ glVertex3f(ex,y2,z2);
+ polys++;
+ z1=z2;
+ y1=y2;
+ }
+ glEnd();
+ }
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static int circle(Circuit *ci, float radius, int segments, int half)
+{
+ int polys = 0;
+ float x1 = 0, x2 = 0;
+ float y1 = 0, y2 = 0;
+ int i, t, s;
+
+ if (half) {
+ t = 270; s = 90;
+ x1 = radius, y1 = 0;
+ } else {
+ t = 360, s = 0;
+ }
+ glBegin(GL_TRIANGLES);
+ glNormal3f(1, 0, 0);
+ for(i=s;i<=t;i+=10)
+ {
+ float angle=i;
+ x2=radius*(float)ci->cos_table[(int)angle];
+ y2=radius*(float)ci->sin_table[(int)angle];
+ glVertex3f(0,0,0);
+ glVertex3f(0,y1,x1);
+ glVertex3f(0,y2,x2);
+ polys++;
+ x1=x2;
+ y1=y2;
+ }
+ glEnd();
+ return polys;
+}
+
+static int wire(Circuit *ci, float len)
+{
+ int polys = 0;
+ GLfloat col[] = {0.3, 0.3, 0.3, 1.0};
+ GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
+ GLfloat nospec[] = {0.4, 0.4, 0.4, 1.0};
+ GLfloat shin = 30;
+ int n;
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ n = glIsEnabled(GL_NORMALIZE);
+ if (!n) glEnable(GL_NORMALIZE);
+ polys += createCylinder(ci, len, 0.05, 1, 0);
+ if (!n) glDisable(GL_NORMALIZE);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, nospec);
+ return polys;
+}
+
+static int sphere(Circuit *ci, GLfloat r, float stacks, float slices,
+ int startstack, int endstack, int startslice,
+ int endslice)
+{
+ int polys = 0;
+ GLfloat d, d1, dr, dr1, Dr, Dr1, D, D1, z1, z2, y1, y2, Y1, Z1, Y2, Z2;
+ int a, a1, b, b1, c0, c1;
+ GLfloat step, sstep;
+
+ step = 180/stacks;
+ sstep = 360/slices;
+ a1 = startstack * step;
+ b1 = startslice * sstep;
+ y1 = z1 = Y1 = Z1 = 0;
+ c0 = (endslice / slices) * 360;
+ c1 = (endstack/stacks)*180;
+ glBegin(GL_QUADS);
+ for (a = startstack * step ; a <= c1 ; a+= step) {
+ d=ci->sin_table[a];
+ d1=ci->sin_table[a1];
+ D=ci->cos_table[a];
+ D1=ci->cos_table[a1];
+ dr = d * r;
+ dr1 = d1 * r;
+ Dr = D * r;
+ Dr1 = D1 * r;
+ for (b = b1 ; b <= c0 ; b+= sstep) {
+ y2=dr*ci->sin_table[b];
+ z2=dr*ci->cos_table[b];
+ Y2=dr1*ci->sin_table[b];
+ Z2=dr1*ci->cos_table[b];
+ glNormal3f(Dr, y1, z1);
+ glVertex3f(Dr,y1,z1);
+ glNormal3f(Dr, y2, z2);
+ glVertex3f(Dr,y2,z2);
+ glNormal3f(Dr1, Y2, Z2);
+ glVertex3f(Dr1,Y2,Z2);
+ glNormal3f(Dr1, Y1, Z1);
+ glVertex3f(Dr1,Y1,Z1);
+ polys++;
+ z1=z2;
+ y1=y2;
+ Z1=Z2;
+ Y1=Y2;
+ }
+ a1 = a;
+ }
+ glEnd();
+ return polys;
+}
+
+static int DrawComponent(Circuit *ci, Component *c, unsigned long *polysP)
+{
+ int polys = *polysP;
+ int ret = 0; /* return 1 if component is freed */
+
+ glPushMatrix();
+ glTranslatef(c->x, c->y, c->z);
+ if (c->angle > 0) {
+ glRotatef(c->angle, c->rotx, c->roty, c->rotz);
+ }
+ if (spin) {
+ glRotatef(c->rdeg, c->rotx, c->roty, c->rotz);
+ c->rdeg += c->drot;
+ }
+
+ if (c->norm)
+ glEnable(GL_NORMALIZE);
+ else
+ glDisable(GL_NORMALIZE);
+
+ /* call object draw routine here */
+ if (c->type == 0) {
+ polys += DrawResistor(ci, c->c);
+ } else if (c->type == 1) {
+ polys += DrawDiode(ci, c->c);
+ } else if (c->type == 2) {
+ polys += DrawTransistor(ci, c->c);
+ } else if (c->type == 3) {
+ if (((LED *)c->c)->light && ci->light) {
+ GLfloat lp[] = {0.1, 0, 0, 1};
+ glEnable(GL_LIGHT1);
+ glLightfv(GL_LIGHT1, GL_POSITION, lp);
+ }
+ polys += DrawLED(ci, c->c);
+ } else if (c->type == 4) {
+ polys += DrawCapacitor(ci, c->c);
+ } else if (c->type == 5) {
+ polys += DrawIC(ci, c->c);
+ } else if (c->type == 6) {
+ polys += DrawDisp(ci, c->c);
+ } else if (c->type == 7) {
+ polys += DrawFuse(ci, c->c);
+ } else if (c->type == 8) {
+ polys += DrawRCA(ci, c->c);
+ } else if (c->type == 9) {
+ polys += DrawThreeFive(ci, c->c);
+ } else if (c->type == 10) {
+ polys += DrawSwitch(ci, c->c);
+ }
+ c->x += c->dx * MOVE_MULT;
+ c->y += c->dy * MOVE_MULT;
+ if (c->x > ci->XMAX/2 || c->x < 0 - ci->XMAX/2 ||
+ c->y > ci->YMAX/2 || c->y < 0 - ci->YMAX/2) {
+ if (c->type == 3 && ((LED *)c->c)->light && ci->light) {
+ glDisable(GL_LIGHT1);
+ ci->light = 0; ci->lighton = 0;
+ }
+ if (c->type == 1)
+ free(((Diode *)c->c)->band); /* remember to free diode band */
+ free(c->c);
+ ret = 1;
+ }
+
+ glPopMatrix();
+ glDisable(GL_NORMALIZE);
+ *polysP = polys;
+ return ret;
+}
+
+/* draw a resistor */
+
+static int DrawResistor(Circuit *ci, Resistor *r)
+{
+ int polys = 0;
+ int i;
+ GLfloat col[] = {0.74, 0.62, 0.46, 1.0};
+ GLfloat spec[] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat shine = 30;
+
+ glTranslatef(-4, 0, 0);
+ polys += wire(ci, 3);
+ glTranslatef(3, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ polys += createCylinder(ci, 1.8, 0.4, 1, 0);
+ glPushMatrix();
+ for (i = 0 ; i < 4 ; i++) {
+ glTranslatef(0.35, 0, 0);
+ glCallList(ci->band_list[r->b[i]]);
+ polys += ci->band_list_polys[r->b[i]];
+ }
+ glPopMatrix();
+ glTranslatef(1.8, 0, 0);
+ polys += wire(ci, 3);
+ return polys;
+}
+
+static int DrawRCA(Circuit *ci, RCA *rca)
+{
+ int polys = 0;
+ GLfloat col[] = {0.6, 0.6, 0.6, 1.0}; /* metal */
+ GLfloat red[] = {1.0, 0.0, 0.0, 1.0}; /* red */
+ GLfloat white[] = {1.0, 1.0, 1.0, 1.0}; /* white */
+ GLfloat spec[] = {1, 1, 1, 1}; /* glass */
+
+ glPushMatrix();
+ glTranslatef(0.3, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMateriali(GL_FRONT, GL_SHININESS, 40);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ polys += createCylinder(ci, 0.7, 0.45, 0, 0);
+ glTranslatef(0.4, 0, 0);
+ polys += createCylinder(ci, 0.9, 0.15, 1, 0);
+ glTranslatef(-1.9, 0, 0);
+ glMateriali(GL_FRONT, GL_SHININESS, 20);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, rca->col ? white : red);
+ polys += createCylinder(ci, 1.5, 0.6, 1, 0);
+ glTranslatef(-0.9, 0, 0);
+ polys += createCylinder(ci, 0.9, 0.25, 0, 0);
+ glTranslatef(0.1, 0, 0);
+ polys += createCylinder(ci, 0.2, 0.3, 0, 0);
+ glTranslatef(0.3, 0, 0);
+ polys += createCylinder(ci, 0.2, 0.3, 1, 0);
+ glTranslatef(0.3, 0, 0);
+ polys += createCylinder(ci, 0.2, 0.3, 1, 0);
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawSwitch(Circuit *ci, Switch *f)
+{
+ int polys = 0;
+ GLfloat col[] = {0.6, 0.6, 0.6, 0}; /* metal */
+ GLfloat dark[] = {0.1, 0.1, 0.1, 1.0}; /* dark */
+ GLfloat brown[] = {0.69, 0.32, 0, 1.0}; /* brown */
+ GLfloat spec[] = {0.9, 0.9, 0.9, 1}; /* shiny */
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_AMBIENT, dark);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMateriali(GL_FRONT, GL_SHININESS, 90);
+ polys += Rect(-0.25, 0, 0, 1.5, 0.5, 0.75);
+/* polys += Rect(-0.5, 0.5, 0, 2, 0.1, 0.75); */
+ glPushMatrix();
+ glRotatef(90, 1, 0, 0);
+ glTranslatef(-0.5, -0.4, -0.4);
+ polys += HoledRectangle(ci, 0.5, 0.75, 0.1, 0.15, 8);
+ glTranslatef(2, 0, 0);
+ polys += HoledRectangle(ci, 0.5, 0.75, 0.1, 0.15, 8);
+ glPopMatrix();
+ polys += Rect(0.1, -0.4, -0.25, 0.1, 0.4, 0.05);
+ polys += Rect(0.5, -0.4, -0.25, 0.1, 0.4, 0.05);
+ polys += Rect(0.9, -0.4, -0.25, 0.1, 0.4, 0.05);
+ polys += Rect(0.1, -0.4, -0.5, 0.1, 0.4, 0.05);
+ polys += Rect(0.5, -0.4, -0.5, 0.1, 0.4, 0.05);
+ polys += Rect(0.9, -0.4, -0.5, 0.1, 0.4, 0.05);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, dark);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ polys += Rect(0, 0.5, -0.1, 1, 0.05, 0.5);
+ polys += Rect(0, 0.6, -0.1, 0.5, 0.6, 0.5);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, brown);
+ polys += Rect(-0.2, -0.01, -0.1, 1.4, 0.1, 0.55);
+ glPopMatrix();
+ return polys;
+}
+
+
+static int DrawFuse(Circuit *ci, Fuse *f)
+{
+ int polys = 0;
+ GLfloat col[] = {0.5, 0.5, 0.5, 1.0}; /* endcaps */
+ GLfloat glass[] = {0.4, 0.4, 0.4, 0.3}; /* glass */
+ GLfloat spec[] = {1, 1, 1, 1}; /* glass */
+
+ glPushMatrix();
+ glTranslatef(-1.8, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMateriali(GL_FRONT, GL_SHININESS, 40);
+ polys += createCylinder(ci, 0.8, 0.45, 1, 0);
+ glTranslatef(0.8, 0, 0);
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, glass);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 40);
+ polys += createCylinder(ci, 2, 0.4, 0, 0);
+ polys += createCylinder(ci, 2, 0.3, 0, 0);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMateriali(GL_FRONT, GL_SHININESS, 40);
+ glBegin(GL_LINES);
+ glVertex3f(0, 0, 0);
+ glVertex3f(2, 0. ,0);
+ glEnd();
+ glTranslatef(2, 0, 0);
+ polys += createCylinder(ci, 0.8, 0.45, 1, 0);
+ glPopMatrix();
+ return polys;
+}
+
+
+static int DrawCapacitor(Circuit *ci, Capacitor *c)
+{
+ int polys = 0;
+ GLfloat col[] = {0, 0, 0, 0};
+ GLfloat spec[] = {0.8, 0.8, 0.8, 0};
+ GLfloat brown[] = {0.84, 0.5, 0};
+ GLfloat shine = 40;
+
+ glPushMatrix();
+ if (c->type) {
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, brown);
+ polys += sphere(ci, c->width, 15, 15, 0, 4 ,0, 15);
+ glTranslatef(1.35*c->width, 0, 0);
+ polys += sphere(ci, c->width, 15, 15, 11, 15, 0, 15);
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0, 0.7*c->width, 0.3*c->width);
+ polys += wire(ci, 3*c->width);
+ glTranslatef(0, 0, -0.6*c->width);
+ polys += wire(ci, 3*c->width);
+ } else {
+ glTranslatef(0-c->length*2, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &shine);
+ glBegin(GL_POLYGON);
+ glVertex3f(0, 0.82*c->width, -0.1);
+ glVertex3f(3*c->length, 0.82*c->width, -0.1);
+ glVertex3f(3*c->length, 0.82*c->width, 0.1);
+ glVertex3f(0, 0.82*c->width, 0.1);
+ glEnd();
+ col[0] = 0.0;
+ col[1] = 0.2;
+ col[2] = 0.9;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(1.0, 1.0);
+ polys += createCylinder(ci, 3.0*c->length, 0.8*c->width, 1, 0);
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ col[0] = 0.7;
+ col[1] = 0.7;
+ col[2] = 0.7;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += circle(ci, 0.6*c->width, 30, 0);
+ col[0] = 0;
+ col[1] = 0;
+ col[2] = 0;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glTranslatef(3.0*c->length, 0.0, 0);
+ polys += circle(ci, 0.6*c->width, 30, 0);
+ glTranslatef(0, 0.4*c->width, 0);
+ polys += wire(ci, 3*c->length);
+ glTranslatef(0.0, -0.8*c->width, 0);
+ polys += wire(ci, 3.3*c->length);
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawLED(Circuit *ci, LED *l)
+{
+ int polys = 0;
+ GLfloat col[] = {0, 0, 0, 0.6};
+ GLfloat black[] = {0, 0, 0, 0.6};
+
+ col[0] = l->r; col[1] = l->g; col[2] = l->b;
+ if (l->light && ci->light) {
+ GLfloat dir[] = {-1, 0, 0};
+ glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, dir);
+ if (!ci->lighton) {
+ glLightfv(GL_LIGHT1, GL_SPECULAR, col);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, black);
+ col[0] /= 1.5; col[1] /= 1.5; col[2] /= 1.5;
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, col);
+ glLighti(GL_LIGHT1, GL_SPOT_CUTOFF, (GLint) 90);
+ glLighti(GL_LIGHT1, GL_CONSTANT_ATTENUATION, (GLfloat)1);
+ glLighti(GL_LIGHT1, GL_LINEAR_ATTENUATION, (GLfloat)0);
+ glLighti(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, (GLfloat)0);
+ glLighti(GL_LIGHT1, GL_SPOT_EXPONENT, (GLint) 20);
+ ci->lighton = 1;
+ }
+ }
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
+ /* no transparency when LED is lit */
+ if (!l->light) {
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
+ }
+ glTranslatef(-0.9, 0, 0);
+ polys += createCylinder(ci, 1.2, 0.3, 0, 0);
+ if (l->light && ci->light) {
+ glDisable(GL_LIGHTING);
+ glColor3fv(col);
+ }
+ polys += sphere(ci, 0.3, 7, 7, 3, 7, 0, 7);
+ if (l->light && ci->light) {
+ glEnable(GL_LIGHTING);
+ } else {
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+
+ glTranslatef(1.2, 0, 0);
+ polys += createCylinder(ci, 0.1, 0.38, 1, 0);
+ glTranslatef(-0.3, 0.15, 0);
+ polys += wire(ci, 3);
+ glTranslatef(0, -0.3, 0);
+ polys += wire(ci, 3.3);
+ if (random() % 50 == 25) {
+ if (l->light) {
+ l->light = 0; ci->light = 0; ci->lighton = 0;
+ glDisable(GL_LIGHT1);
+ } else if (!ci->light) {
+ l->light = 1;
+ ci->light = 1;
+ }
+ }
+ return polys;
+}
+
+
+static int DrawThreeFive(Circuit *ci, ThreeFive *d)
+{
+ int polys = 0;
+ GLfloat shine = 40;
+ GLfloat const dark[] = {0.3, 0.3, 0.3, 0};
+ GLfloat const light[] = {0.6, 0.6, 0.6, 0};
+ GLfloat const cream[] = {0.8, 0.8, 0.6, 0};
+ GLfloat const spec[] = {0.7, 0.7, 0.7, 0};
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cream);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+
+ glTranslatef(-2.0, 0, 0);
+ polys += createCylinder(ci, 0.7, 0.2, 0, 0);
+ glTranslatef(0.7, 0, 0);
+ polys += createCylinder(ci, 1.3, 0.4, 1, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light);
+ glTranslatef(1.3, 0, 0);
+ polys += createCylinder(ci, 1.3, 0.2, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, dark);
+ glTranslatef(0.65, 0, 0);
+ polys += createCylinder(ci, 0.15, 0.21, 0, 0);
+ glTranslatef(0.3, 0, 0);
+ polys += createCylinder(ci, 0.15, 0.21, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light);
+ glTranslatef(0.4, 0, 0);
+ polys += sphere(ci, 0.23, 7, 7, 0, 5, 0, 7);
+
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawDiode(Circuit *ci, Diode *d)
+{
+ int polys = 0;
+ GLfloat shine = 40;
+ GLfloat col[] = {0.3, 0.3, 0.3, 0};
+ GLfloat spec[] = {0.7, 0.7, 0.7, 0};
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glTranslatef(-4, 0, 0);
+ polys += wire(ci, 3);
+ glTranslatef(3, 0, 0);
+ polys += bandedCylinder(ci, 0.3, 1.5, d->r, d->g, d->b, &(d->band), 1);
+ glTranslatef(1.5, 0, 0);
+ polys += wire(ci, 3);
+ glPopMatrix();
+ return polys;
+}
+
+static int Rect(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat t)
+{
+ int polys = 0;
+ GLfloat yh;
+ GLfloat xw;
+ GLfloat zt;
+
+ yh = y+h; xw = x+w; zt = z - t;
+
+ glBegin(GL_QUADS); /* front */
+ glNormal3f(0, 0, 1);
+ glVertex3f(x, y, z);
+ glVertex3f(x, yh, z);
+ glVertex3f(xw, yh, z);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* back */
+ glNormal3f(0, 0, -1);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, y, zt);
+ polys++;
+ /* top */
+ glNormal3f(0, 1, 0);
+ glVertex3f(x, yh, z);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ /* bottom */
+ glNormal3f(0, -1, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* left */
+ glNormal3f(-1, 0, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(x, yh, z);
+ polys++;
+ /* right */
+ glNormal3f(1, 0, 0);
+ glVertex3f(xw, y, z);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ glEnd();
+ return polys;
+}
+
+/* IC pins */
+
+static int ICLeg(GLfloat x, GLfloat y, GLfloat z, int dir)
+{
+ int polys = 0;
+ if (dir) {
+ polys += Rect(x-0.1, y, z, 0.1, 0.1, 0.02);
+ polys += Rect(x-0.1, y, z, 0.02, 0.1, 0.1);
+ polys += Rect(x-0.1, y+0.03, z-0.1, 0.02, 0.05, 0.3);
+ } else {
+ polys += Rect(x, y, z, 0.1, 0.1, 0.02);
+ polys += Rect(x+0.8*0.1, y, z, 0.02, 0.1, 0.1);
+ polys += Rect(x+0.8*0.1, y+0.03, z-0.1, 0.02, 0.05, 0.3);
+ }
+ return polys;
+}
+
+
+static int DrawIC(Circuit *ci, IC *c)
+{
+ int polys = 0;
+ GLfloat w, h, d;
+ int z;
+ GLfloat col[] = {0.1, 0.1, 0.1, 0};
+ GLfloat col2[] = {0.2, 0.2, 0.2, 0};
+ GLfloat spec[] = {0.6, 0.6, 0.6, 0};
+ GLfloat shine = 40;
+ GLfloat lspec[] = {0.6, 0.6, 0.6, 0};
+ GLfloat lcol[] = {0.4, 0.4, 0.4, 0};
+ GLfloat lshine = 40;
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ switch(c->pins) {
+ case 8:
+ w = 1.0; h = 1.5;
+ break;
+ case 14:
+ w = 1.0; h = 3;
+ break;
+ case 16:
+ w = 1.0; h = 3;
+ break;
+ case 24:
+ default:
+ w = 1.5; h = 3.5;
+ break;
+ }
+ w = w/2; h = h/2;
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(1.0, 1.0);
+ glBegin(GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glVertex3f(w, h, 0.1);
+ glVertex3f(w, -h, 0.1);
+ glVertex3f(-w, -h, 0.1);
+ glVertex3f(-w, h, 0.1);
+ polys++;
+ glNormal3f(0, 0, -1);
+ glVertex3f(w, h, -0.1);
+ glVertex3f(w, -h, -0.1);
+ glVertex3f(-w, -h, -0.1);
+ glVertex3f(-w, h, -0.1);
+ polys++;
+ glNormal3f(1, 0, 0);
+ glVertex3f(w, h, -0.1);
+ glVertex3f(w, -h, -0.1);
+ glVertex3f(w, -h, 0.1);
+ glVertex3f(w, h, 0.1);
+ polys++;
+ glNormal3f(0, -1, 0);
+ glVertex3f(w, -h, -0.1);
+ glVertex3f(w, -h, 0.1);
+ glVertex3f(-w, -h, 0.1);
+ glVertex3f(-w, -h, -0.1);
+ polys++;
+ glNormal3f(-1, 0, 0);
+ glVertex3f(-w, h, -0.1);
+ glVertex3f(-w, h, 0.1);
+ glVertex3f(-w, -h, 0.1);
+ glVertex3f(-w, -h, -0.1);
+ polys++;
+ glNormal3f(0, -1, 0);
+ glVertex3f(-w, h, -0.1);
+ glVertex3f(w, h, -0.1);
+ glVertex3f(w, h, 0.1);
+ glVertex3f(-w, h, 0.1);
+ polys++;
+ glEnd();
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ {
+ GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+ GLfloat s = 0.015;
+ XCharStruct e;
+ texture_string_metrics (ci->font, c->text, &e, 0, 0);
+
+ glPushMatrix();
+ glTranslatef (0, 0, 0.1);
+ glRotatef (90, 0, 0, 1);
+ glScalef (s, s, s);
+ glTranslatef (-w/2, 0, 0);
+ glColor4fv (texfg);
+ print_texture_string (ci->font, c->text);
+ glPopMatrix();
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ d = (h*2-0.1) / c->pins;
+ d*=2;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lcol);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, lspec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &lshine);
+ for (z = 0 ; z < c->pins/2 ; z++) {
+ polys += ICLeg(w, -h + z*d + d/2, 0, 0);
+ }
+ for (z = 0 ; z < c->pins/2 ; z++) {
+ polys += ICLeg(-w, -h + z*d + d/2, 0, 1);
+ }
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col2);
+ glTranslatef(-w+0.3, h-0.3, 0.1);
+ glRotatef(90, 0, 1, 0);
+ polys += circle(ci, 0.1, 7, 0);
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawDisp(Circuit *ci, Disp *d)
+{
+ int polys = 0;
+ GLfloat col[] = {0.8, 0.8, 0.8, 1.0}; /* body colour */
+ GLfloat front[] = {0.2, 0.2, 0.2, 1.0}; /* front colour */
+ GLfloat on[] = {0.9, 0, 0, 1}; /* 'on' segment */
+ GLfloat off[] = {0.3, 0, 0, 1}; /* 'off' segment */
+ int i, j, k;
+ GLfloat x, y; /* for the pins */
+ GLfloat spec[] = {0.6, 0.6, 0.6, 0};
+ GLfloat lcol[] = {0.4, 0.4, 0.4, 0};
+ GLfloat shine = 40;
+ static const GLfloat vdata_h[6][2] = {
+ {0, 0},
+ {0.1, 0.1},
+ {0.9, 0.1},
+ {1, 0},
+ {0.9, -0.1},
+ {0.1, -0.1}
+ };
+ static const GLfloat vdata_v[6][2] = {
+ {0.27, 0},
+ {0.35, -0.1},
+ {0.2, -0.9},
+ {0.1, -1},
+ {0, -0.9},
+ {0.15, -0.15}
+ };
+
+ static const GLfloat seg_start[7][2] = {
+ {0.55, 2.26},
+ {1.35, 2.26},
+ {1.2, 1.27},
+ {0.25, 0.25},
+ {0.06, 1.25},
+ {0.25, 2.25},
+ {0.39, 1.24}
+ };
+
+ static const int nums[10][7] = {
+ {1, 1, 1, 1, 1, 1, 0}, /* 0 */
+ {0, 1, 1, 0, 0, 0, 0}, /* 1 */
+ {1, 1, 0, 1, 1, 0, 1}, /* 2 */
+ {1, 1, 1, 1, 0, 0, 1}, /* 3 */
+ {0, 1, 1, 0, 0, 1, 1}, /* 4 */
+ {1, 0, 1, 1, 0, 1, 1}, /* 5 */
+ {1, 0, 1, 1, 1, 1, 1}, /* 6 */
+ {1, 1, 1, 0, 0, 0, 0}, /* 7 */
+ {1, 1, 1, 1, 1, 1, 1}, /* 8 */
+ {1, 1, 1, 0, 0, 1, 1} /* 9 */
+ };
+
+ glTranslatef(-0.9, -1.8, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += Rect(0, 0, -0.01, 1.8, 2.6, 0.7);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, front);
+ glBegin(GL_QUADS);
+ glVertex2f(-0.05, -0.05);
+ glVertex2f(-0.05, 2.65);
+ glVertex2f(1.85, 2.65);
+ glVertex2f(1.85, -0.05);
+ polys++;
+ glEnd();
+ glDisable(GL_LIGHTING); /* lit segments dont need light */
+ if (!seven && (random() % 30) == 19) { /* randomly change value */
+ d->value = random() % 10;
+ }
+ for (j = 0 ; j < 7 ; j++) { /* draw the segments */
+ GLfloat xx[6], yy[6];
+ if (nums[d->value][j])
+ glColor3fv(on);
+ else
+ glColor3fv(off);
+ for (k = 0 ; k < 6 ; k++) {
+ if (j == 0 || j == 3 || j == 6) {
+ xx[k] = seg_start[j][0] + vdata_h[k][0];
+ yy[k] = seg_start[j][1] + vdata_h[k][1];
+ } else {
+ xx[k] = seg_start[j][0] + vdata_v[k][0];
+ yy[k] = seg_start[j][1] + vdata_v[k][1];
+ }
+ }
+ glBegin(GL_POLYGON);
+ for(i = 0 ; i < 6 ; i++) {
+ glVertex3f(xx[i], yy[i], 0.01);
+ }
+ polys++;
+ glEnd();
+ }
+ glColor3fv(on);
+ glPointSize(4);
+ glBegin(GL_POINTS);
+ glVertex3f(1.5, 0.2, 0.01);
+ polys++;
+ glEnd();
+ glEnable(GL_LIGHTING);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lcol);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ for (x = 0.35 ; x <= 1.5 ; x+= 1.15) {
+ for ( y = 0.2 ; y <= 2.4 ; y += 0.3) {
+ polys += ICLeg(x, y, -0.7, 1);
+ }
+ }
+ return polys;
+}
+
+static int HoledRectangle(Circuit *ci,
+ GLfloat w, GLfloat h, GLfloat d, GLfloat radius,
+ int p)
+{
+ int polys = 0;
+ int step, a;
+ GLfloat x1, y1, x2, y2;
+ GLfloat yr, yr1, xr, xr1, side, side1;
+ GLfloat nx, ny;
+
+ step = 360 / p;
+ x1 = radius; y1 = 0;
+ xr1 = w/2; yr1 = 0;
+ side = w/2;
+ side1 = h/2;
+ glBegin(GL_QUADS);
+ for (a = 0 ; a <= 360 ; a+= step) {
+ y2=radius*(float)ci->sin_table[(int)a];
+ x2=radius*(float)ci->cos_table[(int)a];
+
+ if (a < 45 || a > 315) {
+ xr = side;
+ yr = side1 * ci->tan_table[a];
+ nx = 1; ny = 0;
+ } else if (a <= 135 || a >= 225) {
+ xr = side/ci->tan_table[a];
+ if (a >= 225) {
+ yr = -side1;
+ xr = 0 - xr;
+ nx = 0; ny = -1;
+ } else {
+ yr = side1;
+ nx = 0; ny = 1;
+ }
+ } else {
+ xr = -side;
+ yr = -side1 * ci->tan_table[a];
+ nx = -1; ny = 0;
+ }
+
+ glNormal3f(-x1, -y1, 0); /* cylinder */
+ glVertex3f(x1,y1,0);
+ glVertex3f(x1,y1,-d);
+ glVertex3f(x2,y2,-d);
+ glVertex3f(x2,y2,0);
+ polys++;
+
+ glNormal3f(0, 0, 1); /* front face */
+ glVertex3f(x1,y1,0);
+ glVertex3f(xr1, yr1, 0);
+ glVertex3f(xr, yr, 0);
+ glVertex3f(x2, y2, 0);
+ polys++;
+
+ glNormal3f(nx, ny, 0); /* side */
+ glVertex3f(xr, yr, 0);
+ glVertex3f(xr, yr, -d);
+ glVertex3f(xr1, yr1, -d);
+ glVertex3f(xr1, yr1, 0);
+ polys++;
+
+ glNormal3f(0, 0, -1); /* back */
+ glVertex3f(xr, yr, -d);
+ glVertex3f(x2, y2, -d);
+ glVertex3f(x1, y1, -d);
+ glVertex3f(xr1, yr1, -d);
+ polys++;
+
+ x1=x2;
+ y1=y2;
+ xr1 = xr; yr1 = yr;
+ }
+ glEnd();
+ return polys;
+}
+
+static int DrawTransistor(Circuit *ci, Transistor *t)
+{
+ int polys = 0;
+ GLfloat col[] = {0.3, 0.3, 0.3, 1.0};
+ GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
+ GLfloat nospec[] = {0.4, 0.4, 0.4, 1.0};
+ GLfloat shin = 30;
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (t->type == 1) { /* TO-92 style */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
+ glRotatef(90, 0, 1, 0);
+ glRotatef(90, 0, 0, 1);
+ polys += createCylinder(ci, 1.0, 0.4, 1, 1);
+ polys += Rect(0, -0.2, 0.4, 1, 0.2, 0.8);
+/* Draw the markings */
+
+ {
+ GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+ GLfloat s = 0.015;
+ XCharStruct e;
+ int w;
+ texture_string_metrics (ci->font, t->text, &e, 0, 0);
+ w = e.width;
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0.5, -0.05, 0.21);
+ glScalef (s, s, s);
+ glTranslatef (-w/2, 0, 0);
+ glColor4fv (texfg);
+ print_texture_string (ci->font, t->text);
+ glPopMatrix();
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ glTranslatef(-2, 0, -0.2);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0, 0.2);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0, 0.2);
+ polys += wire(ci, 2);
+ } else if (t->type == 0) { /* TO-220 Style */
+ polys += Rect(0, 0, 0, 1.5, 1.5, 0.5);
+ {
+ GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+ GLfloat s = 0.015;
+ XCharStruct e;
+ int w;
+ texture_string_metrics (ci->font, t->text, &e, 0, 0);
+ w = e.width;
+ glPushMatrix();
+ glTranslatef (0.75, 0.75, 0.01);
+ glScalef (s, s, s);
+ glTranslatef (-w/2, 0, 0);
+ glColor4fv (texfg);
+ print_texture_string (ci->font, t->text);
+ glPopMatrix();
+ }
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ polys += Rect(0, 0, -0.5, 1.5, 1.5, 0.30);
+ if (!glIsEnabled(GL_NORMALIZE)) glEnable(GL_NORMALIZE);
+ glTranslatef(0.75, 1.875, -0.55);
+ polys += HoledRectangle(ci, 1.5, 0.75, 0.25, 0.2, 8);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, nospec);
+ glTranslatef(-0.375, -1.875, 0);
+ glRotatef(90, 0, 0, -1);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0.375, 0);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0.375, 0);
+ polys += wire(ci, 2);
+ } else { /* SMC transistor */
+/* Draw the body */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
+ glTranslatef(-0.5, -0.25, 0.1);
+ polys += Rect(0, 0, 0, 1, 0.5, 0.2);
+/* Draw the markings */
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBegin (GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(0, 1);
+ glVertex3f(0.2, 0, 0.01);
+ glTexCoord2f(1, 1);
+ glVertex3f(0.8, 0, 0.01);
+ glTexCoord2f(1, 0);
+ glVertex3f(0.8, 0.5, 0.01);
+ glTexCoord2f(0, 0);
+ glVertex3f(0.2, 0.5, 0.01);
+ polys++;
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+/* Now draw the legs */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ polys += Rect(0.25, -0.1, -0.05, 0.1, 0.1, 0.2);
+ polys += Rect(0.75, -0.1, -0.05, 0.1, 0.1, 0.2);
+ polys += Rect(0.5, 0.5, -0.05, 0.1, 0.1, 0.2);
+ polys += Rect(0.25, -0.2, -0.2, 0.1, 0.15, 0.1);
+ polys += Rect(0.75, -0.2, -0.2, 0.1, 0.15, 0.1);
+ polys += Rect(0.5, 0.5, -0.2, 0.1, 0.15, 0.1);
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static Component * NewComponent(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ Component *c;
+ float rnd;
+
+ c = malloc(sizeof(Component));
+ c->angle = RAND_RANGE(0,360);
+ rnd = f_rand();
+ if (rnd < 0.25) { /* come from the top */
+ c->y = ci->YMAX/2;
+ c->x = RAND_RANGE(0, ci->XMAX) - ci->XMAX/2;
+ if (c->x > 0)
+ c->dx = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dx = RAND_RANGE(0.5, 2);
+ c->dy = 0 - RAND_RANGE(0.5, 2);
+ } else if (rnd < 0.5) { /* come from the bottom */
+ c->y = 0 - ci->YMAX/2;
+ c->x = RAND_RANGE(0, ci->XMAX) - ci->XMAX/2;
+ if (c->x > 0)
+ c->dx = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dx = RAND_RANGE(0.5, 2);
+ c->dy = RAND_RANGE(0.5, 2);
+ } else if (rnd < 0.75) { /* come from the left */
+ c->x = 0 - ci->XMAX/2;
+ c->y = RAND_RANGE(0, ci->YMAX) - ci->YMAX/2;
+ c->dx = RAND_RANGE(0.5, 2);
+ if (c->y > 0)
+ c->dy = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dy = RAND_RANGE(0.5, 2);
+ } else { /* come from the right */
+ c->x = ci->XMAX/2;
+ c->y = RAND_RANGE(0, ci->YMAX) - ci->YMAX/2;
+ c->dx = 0 - RAND_RANGE(0.5, 2);
+ if (c->y > 0)
+ c->dy = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dy = RAND_RANGE(0.5, 2);
+ }
+ c->z = RAND_RANGE(0, 7) - 9;
+ c->rotx = f_rand();
+ c->roty = f_rand();
+ c->rotz = f_rand();
+ c->drot = f_rand() * 3;
+ c->rdeg = 0;
+ c->dz = f_rand()*2 - 1;
+ c->norm = 0;
+ c->alpha = 0; /* explicitly set to 1 later */
+ rnd = random() % 11;
+ if (rnd < 1) {
+ c->c = NewResistor();
+ c->type = 0;
+ if (f_rand() < 0.4)
+ c->norm = 1; /* some resistors shine */
+ } else if (rnd < 2) {
+ c->c = NewDiode();
+ if (f_rand() < 0.4)
+ c->norm = 1; /* some diodes shine */
+ c->type = 1;
+ } else if (rnd < 3) {
+ c->c = NewTransistor(mi);
+ c->norm = 1;
+ c->type = 2;
+ } else if (rnd < 4) {
+ c->c = NewCapacitor(ci);
+ c->norm = 1;
+ c->type = 4;
+ } else if (rnd < 5) {
+ c->c = NewIC(mi);
+ c->type = 5;
+ c->norm = 1;
+ } else if (rnd < 6) {
+ c->c = NewLED(ci);
+ c->type = 3;
+ c->norm = 1;
+ c->alpha = 1;
+ } else if (rnd < 7) {
+ c->c = NewFuse(ci);
+ c->norm = 1;
+ c->type = 7;
+ c->alpha = 1;
+ } else if (rnd < 8) {
+ c->c = NewRCA(ci);
+ c->norm = 1;
+ c->type = 8;
+ } else if (rnd < 9) {
+ c->c = NewThreeFive(ci);
+ c->norm = 1;
+ c->type = 9;
+ } else if (rnd < 10) {
+ c->c = NewSwitch(ci);
+ c->norm = 1;
+ c->type = 10;
+ } else {
+ c->c = NewDisp(ci);
+ c->type = 6;
+ }
+ return c;
+}
+
+static Transistor *NewTransistor(ModeInfo *mi)
+{
+ Transistor *t;
+
+ t = malloc(sizeof(Transistor));
+ t->type = (random() % 3);
+ if (t->type == 0) {
+ t->text = transistortypes[random() % countof(transistortypes)];
+ } else if (t->type == 2) {
+ t->text = smctypes[random() % countof(smctypes)];
+ } else if (t->type == 1) {
+ t->text = to92types[random() % countof(to92types)];
+ }
+ return t;
+}
+
+static Capacitor *NewCapacitor(Circuit *ci)
+{
+ Capacitor *c;
+
+ c = malloc(sizeof(Capacitor));
+ c->type = (f_rand() < 0.5);
+ if (!c->type) {
+ c->length = RAND_RANGE(0.5, 1);
+ c->width = RAND_RANGE(0.5, 1);
+ } else {
+ c->width = RAND_RANGE(0.3, 1);
+ }
+ return c;
+}
+
+/* 7 segment display */
+
+static Disp *NewDisp(Circuit *ci)
+{
+ Disp *d;
+
+ d = malloc(sizeof(Disp));
+ if (seven)
+ d->value = 7;
+ else
+ d->value = RAND_RANGE(0, 10);
+ return d;
+}
+
+
+static IC *NewIC(ModeInfo *mi)
+{
+ IC *c;
+ int pins;
+ const char *val;
+ int types[countof(ictypes)], i, n = 0;
+
+ c = malloc(sizeof(IC));
+ c->type = 0;
+ switch((int)RAND_RANGE(0,4)) {
+ case 0:
+ pins = 8;
+ break;
+ case 1:
+ pins = 14;
+ break;
+ case 2:
+ pins = 16;
+ break;
+ case 3:
+ default:
+ pins = 24;
+ break;
+ }
+ for (i = 0 ; i < countof(ictypes) ; i++) {
+ if (ictypes[i].pins == pins) {
+ types[n] = i;
+ n++;
+ }
+ }
+
+ if (n > countof(types)) abort();
+ val = ictypes[types[random() % n]].val;
+ sprintf(c->text, "%s\n%02d%02d", val,
+ (int)RAND_RANGE(80, 100), (int)RAND_RANGE(1,53));
+ c->pins = pins;
+ return c;
+}
+
+static LED *NewLED(Circuit *ci)
+{
+ LED *l;
+ float r;
+
+ l = malloc(sizeof(LED));
+ r = f_rand();
+ l->light = 0;
+ if (!ci->light && (f_rand() < 0.4)) {
+ ci->light = 1;
+ l->light = 1;
+ }
+ if (r < 0.2) {
+ l->r = 0.9; l->g = 0; l->b = 0;
+ } else if (r < 0.4) {
+ l->r = 0.3; l->g = 0.9; l->b = 0;
+ } else if (r < 0.6) {
+ l->r = 0.8; l->g = 0.9; l->b = 0;
+ } else if (r < 0.8) {
+ l->r = 0.0; l->g = 0.2; l->b = 0.8;
+ } else {
+ l->r = 0.9, l->g = 0.55, l->b = 0;
+ }
+ return l;
+}
+
+static Fuse *NewFuse(Circuit *ci)
+{
+ Fuse *f;
+
+ f = malloc(sizeof(Fuse));
+ return f;
+}
+
+static RCA *NewRCA(Circuit *ci)
+{
+ RCA *r;
+
+ r = malloc(sizeof(RCA));
+ r->col = (random() % 10 < 5);
+ return r;
+}
+
+static ThreeFive *NewThreeFive(Circuit *ci)
+{
+ ThreeFive *r;
+
+ r = malloc(sizeof(ThreeFive));
+ return r;
+}
+
+static Switch *NewSwitch(Circuit *ci)
+{
+ Switch *s;
+
+ s = malloc(sizeof(Switch));
+ s->position = 0;
+ return s;
+}
+
+static Diode *NewDiode(void)
+{
+ Band *b;
+ Diode *ret;
+
+ ret = malloc(sizeof(Diode));
+ b = malloc(sizeof(Band));
+ b->pos = 0.8;
+ b->len = 0.1;
+ if (f_rand() < 0.5) {
+ b->r = 1;
+ b->g = 1;
+ b->b = 1;
+ ret->r = 0.7; ret->g = 0.1 ; ret->b = 0.1;
+ } else {
+ b->r = 1;
+ b->g = 1;
+ b->b = 1;
+ ret->r = 0.2; ret->g = 0.2 ; ret->b = 0.2;
+ }
+ ret->band = b;
+ return ret;
+}
+
+
+static Resistor * NewResistor(void)
+{
+ int v, m, t; /* value, multiplier, tolerance */
+ Resistor *ret;
+
+ v = RAND(9);
+ m = RAND(5);
+ t = (RAND(10) < 5) ? 10 : 11;
+ ret = malloc(sizeof(Resistor));
+
+ if (seven) {
+ ret->b[0] = ret->b[1] = ret->b[2] = 7;
+ } else {
+ ret->b[0] = values[v][0];
+ ret->b[1] = values[v][1];
+ ret->b[2] = m;
+ }
+ ret->b[3] = t;
+
+ return ret;
+}
+
+static void makebandlist(Circuit *ci)
+{
+ int i;
+ GLfloat col[] = {0,0,0,0};
+ GLfloat spec[] = {0.8,0.8,0.8,0};
+ GLfloat shine = 40;
+
+ for (i = 0 ; i < 12 ; i++) {
+ ci->band_list[i] = glGenLists(1);
+ glNewList(ci->band_list[i], GL_COMPILE);
+ col[0] = colorcodes[i][0];
+ col[1] = colorcodes[i][1];
+ col[2] = colorcodes[i][2];
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &shine);
+ ci->band_list_polys[i] = createCylinder(ci, 0.1, 0.42, 0, 0);
+ glEndList();
+ }
+}
+
+
+static int bandedCylinder(Circuit *ci,
+ float radius, float l,
+ GLfloat r, GLfloat g, GLfloat bl,
+ Band **b, int nbands)
+{
+ int polys = 0;
+ int n; /* band number */
+ GLfloat col[] = {0,0,0,0};
+
+ col[0] = r; col[1] = g; col[2] = bl;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += createCylinder(ci, l, radius, 1, 0); /* body */
+ for (n = 0 ; n < nbands ; n++) {
+ glPushMatrix();
+ glTranslatef(b[n]->pos*l, 0, 0);
+ col[0] = b[n]->r; col[1] = b[n]->g; col[2] = b[n]->b;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += createCylinder(ci, b[n]->len*l, radius*1.05, 0, 0); /* band */
+ glPopMatrix();
+ }
+ return polys;
+}
+
+static int drawgrid(Circuit *ci)
+{
+ int polys = 0;
+ GLfloat x, y;
+ GLfloat col3[] = {0, 0.8, 0};
+
+ if (!ci->draw_s) {
+ if (f_rand() < ((rotatespeed > 0) ? 0.05 : 0.01)) {
+ ci->draw_sdir = RAND_RANGE(0, 4);
+ ci->draw_ds = RAND_RANGE(0.4, 0.8);
+ switch (ci->draw_sdir) {
+ case 0:
+ ci->draw_sx = -ci->XMAX/2;
+ ci->draw_sy = ((int)RAND_RANGE(0, ci->YMAX/2))*2 - ci->YMAX/2;
+ break;
+ case 1:
+ ci->draw_sx = ci->XMAX/2;
+ ci->draw_sy = ((int)RAND_RANGE(0, ci->YMAX/2))*2 - ci->YMAX/2;
+ break;
+ case 2:
+ ci->draw_sy = ci->YMAX/2;
+ ci->draw_sx = ((int)RAND_RANGE(0, ci->XMAX/2))*2 - ci->XMAX/2;
+ break;
+ case 3:
+ ci->draw_sy = -ci->YMAX/2;
+ ci->draw_sx = ((int)RAND_RANGE(0, ci->XMAX/2))*2 - ci->XMAX/2;
+ break;
+ }
+ ci->draw_s = 1;
+ }
+ } else if (rotatespeed <= 0) {
+ if (ci->grid_col[1] < 0.25) {
+ ci->grid_col[1] += 0.025; ci->grid_col[2] += 0.005;
+ ci->grid_col2[1] += 0.015 ; ci->grid_col2[2] += 0.005;
+ }
+ }
+
+ glDisable(GL_LIGHTING);
+ if (ci->draw_s) {
+ glColor3fv(col3);
+ glPushMatrix();
+ glTranslatef(ci->draw_sx, ci->draw_sy, -10);
+ polys += sphere(ci, 0.1, 10, 10, 0, 10, 0, 10);
+ if (ci->draw_sdir == 0)
+ glTranslatef(-ci->draw_ds, 0, 0);
+ if (ci->draw_sdir == 1)
+ glTranslatef(ci->draw_ds, 0, 0);
+ if (ci->draw_sdir == 2)
+ glTranslatef(0, ci->draw_ds, 0);
+ if (ci->draw_sdir == 3)
+ glTranslatef(0, -ci->draw_ds, 0);
+ polys += sphere(ci, 0.05, 10, 10, 0, 10, 0, 10);
+ glPopMatrix();
+ if (ci->draw_sdir == 0) {
+ ci->draw_sx += ci->draw_ds;
+ if (ci->draw_sx > ci->XMAX/2)
+ ci->draw_s = 0;
+ }
+ if (ci->draw_sdir == 1) {
+ ci->draw_sx -= ci->draw_ds;
+ if (ci->draw_sx < -ci->XMAX/2)
+ ci->draw_s = 0;
+ }
+ if (ci->draw_sdir == 2) {
+ ci->draw_sy -= ci->draw_ds;
+ if (ci->draw_sy < ci->YMAX/2)
+ ci->draw_s = 0;
+ }
+ if (ci->draw_sdir == 3) {
+ ci->draw_sy += ci->draw_ds;
+ if (ci->draw_sy > ci->YMAX/2)
+ ci->draw_s = 0;
+ }
+ } else if (rotatespeed <= 0) {
+ if (ci->grid_col[1] > 0) {
+ ci->grid_col[1] -= 0.0025; ci->grid_col[2] -= 0.0005;
+ ci->grid_col2[1] -= 0.0015 ; ci->grid_col2[2] -= 0.0005;
+ }
+ }
+ for (x = -ci->XMAX/2 ; x <= ci->XMAX/2 ; x+= 2) {
+ glColor3fv(ci->grid_col);
+ glBegin(GL_LINES);
+ glVertex3f(x, ci->YMAX/2, -10);
+ glVertex3f(x, -ci->YMAX/2, -10);
+ glColor3fv(ci->grid_col2);
+ glVertex3f(x-0.02, ci->YMAX/2, -10);
+ glVertex3f(x-0.02, -ci->YMAX/2, -10);
+ glVertex3f(x+0.02, ci->YMAX/2, -10);
+ glVertex3f(x+0.02, -ci->YMAX/2, -10);
+ glEnd();
+ }
+ for (y = -ci->YMAX/2 ; y <= ci->YMAX/2 ; y+= 2) {
+ glColor3fv(ci->grid_col);
+ glBegin(GL_LINES);
+ glVertex3f(-ci->XMAX/2, y, -10);
+ glVertex3f(ci->XMAX/2, y, -10);
+ glColor3fv(ci->grid_col2);
+ glVertex3f(-ci->XMAX/2, y-0.02, -10);
+ glVertex3f(ci->XMAX/2, y-0.02, -10);
+ glVertex3f(-ci->XMAX/2, y+0.02, -10);
+ glVertex3f(ci->XMAX/2, y+0.02, -10);
+ glEnd();
+ }
+ glEnable(GL_LIGHTING);
+ return polys;
+}
+
+static void display(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ GLfloat light_sp[] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat black[] = {0, 0, 0, 1.0};
+ int j;
+
+ mi->polygon_count = 0;
+
+ if (ci->display_i == 0) {
+ for (ci->display_i = 0 ; ci->display_i < maxparts ; ci->display_i++) {
+ ci->components[ci->display_i] = NULL;
+ }
+ }
+ glEnable(GL_LIGHTING);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ gluLookAt(ci->viewer[0], ci->viewer[1], ci->viewer[2],
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+ glPushMatrix();
+ glRotatef(ci->rotate_angle, 0, 0, 1);
+ ci->rotate_angle += 0.01 * (float)rotatespeed;
+ if (ci->rotate_angle >= 360) ci->rotate_angle = 0;
+
+ glLightfv(GL_LIGHT0, GL_POSITION, ci->lightpos);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_sp);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_sp);
+ glLighti(GL_LIGHT0, GL_CONSTANT_ATTENUATION, (GLfloat)1);
+ glLighti(GL_LIGHT0, GL_LINEAR_ATTENUATION, (GLfloat)0.5);
+ glLighti(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, (GLfloat)0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ h = 2;
+ glScalef (h, h, h);
+ }
+# endif
+
+ mi->polygon_count += drawgrid(ci);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light_sp);
+ if (f_rand() < 0.05) {
+ for (j = 0 ; j < maxparts ; j++) {
+ if (ci->components[j] == NULL) {
+ ci->components[j] = NewComponent(mi);
+ j = maxparts;
+ }
+ }
+ reorder(&ci->components[0]);
+ }
+ for (j = 0 ; j < maxparts ; j++) {
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, black);
+ glMaterialfv(GL_FRONT, GL_EMISSION, black);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, black);
+ if (ci->components[j] != NULL) {
+ if (DrawComponent(ci, ci->components[j], &mi->polygon_count)) {
+ free(ci->components[j]); ci->components[j] = NULL;
+ }
+ }
+ }
+ glPopMatrix();
+ glFlush();
+}
+
+/* ensure transparent components are at the end */
+static void reorder(Component *c[])
+{
+ int i, j, k;
+ Component *c1[MAX_COMPONENTS];
+ Component *c2[MAX_COMPONENTS];
+
+ j = 0;
+ for (i = 0 ; i < maxparts ; i++) { /* clear old matrix */
+ c1[i] = NULL;
+ c2[i] = NULL;
+ }
+ for (i = 0 ; i < maxparts ; i++) {
+ if (c[i] == NULL) continue;
+ if (c[i]->alpha) { /* transparent parts go to c1 */
+ c1[j] = c[i];
+ j++;
+ } else { /* opaque parts go to c2 */
+ c2[i] = c[i];
+ }
+ }
+ for (i = 0 ; i < maxparts ; i++) { /* clear old matrix */
+ c[i] = NULL;
+ }
+ k = 0;
+ for (i = 0 ; i < maxparts ; i++) { /* insert opaque part */
+ if (c2[i] != NULL) {
+ c[k] = c2[i];
+ k++;
+ }
+ }
+ for (i = 0 ; i < j ; i++) { /* insert transparent parts */
+ c[k] = c1[i];
+ k++;
+ }
+}
+
+ENTRYPOINT void reshape_circuit(ModeInfo *mi, int width, int height)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ int y = 0;
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0,y,(GLint)width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0,1.0,-h,h,1.5,35.0);
+ glMatrixMode(GL_MODELVIEW);
+ ci->win_h = height;
+ ci->win_w = width;
+ ci->YMAX = ci->XMAX * h;
+}
+
+
+ENTRYPOINT void init_circuit(ModeInfo *mi)
+{
+int screen = MI_SCREEN(mi);
+Circuit *ci;
+
+ MI_INIT(mi, circuit);
+ ci = &circuit[screen];
+ ci->window = MI_WINDOW(mi);
+
+ ci->XMAX = ci->YMAX = 50;
+ ci->viewer[2] = 14;
+ ci->lightpos[0] = 7;
+ ci->lightpos[1] = 7;
+ ci->lightpos[2] = 15;
+ ci->lightpos[3] = 1;
+
+ ci->grid_col[1] = 0.25;
+ ci->grid_col[2] = 0.05;
+ ci->grid_col2[1] = 0.125;
+ ci->grid_col2[2] = 0.05;
+
+ ci->font = load_texture_font (MI_DISPLAY(mi), "componentFont");
+
+ if (maxparts >= MAX_COMPONENTS)
+ maxparts = MAX_COMPONENTS-1;
+
+ if ((ci->glx_context = init_GL(mi)) != NULL) {
+ reshape_circuit(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+ if (uselight == 0)
+ ci->light = 1;
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ make_tables(ci);
+ makebandlist(ci);
+
+}
+
+ENTRYPOINT void draw_circuit(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if (!ci->glx_context)
+ return;
+
+ glXMakeCurrent(disp, w, *(ci->glx_context));
+
+ display(mi);
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+ENTRYPOINT void free_circuit(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ if (ci->font)
+ free_texture_font (ci->font);
+ FreeAllGL(mi);
+}
+
+XSCREENSAVER_MODULE ("Circuit", circuit)
+
+#endif
diff --git a/hacks/glx/circuit.man b/hacks/glx/circuit.man
new file mode 100644
index 0000000..794f97b
--- /dev/null
+++ b/hacks/glx/circuit.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+circuit - animates a number of 3D electronic components.
+.SH SYNOPSIS
+.B circuit
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-parts \fInumber\fP]
+[\-no-spin]
+[\-rotate]
+[\-speed \fInumber\fP]
+[\-no-light]
+[\-fps]
+.SH DESCRIPTION
+Animates a number of 3D electronic components.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-parts \fInumber\fP
+Number of parts. Default: 10.
+.TP 8
+.B \-spin | \-no-spin
+Whether the objects should spin.
+.TP 8
+.B \-rotate | \-no-rotate
+Whether the scene should spin.
+.TP 8
+.B \-speed \fInumber\fP
+Rotation speed, 0 - 100. Default: 1.
+.TP 8
+.B \-light | \-no-light
+Whether to us lighting, or flat coloring.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ben Buxton.
diff --git a/hacks/glx/cityflow.c b/hacks/glx/cityflow.c
new file mode 100644
index 0000000..2b3bd4f
--- /dev/null
+++ b/hacks/glx/cityflow.c
@@ -0,0 +1,545 @@
+/* cityflow, Copyright (c) 2014-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 800 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SKEW "12"
+
+#define DEF_WAVES "6"
+#define DEF_WAVE_SPEED "25"
+#define DEF_WAVE_RADIUS "256"
+static int texture_size = 512;
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat w, h, d;
+ GLfloat cth, sth;
+} cube;
+
+typedef struct {
+ int x, y;
+ double xth, yth;
+} wave_src;
+
+typedef struct {
+ int nwaves;
+ int radius;
+ int speed;
+ wave_src *srcs;
+ int *heights;
+} waves;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLuint cube_list;
+ int cube_polys;
+ int ncubes;
+ cube *cubes;
+ waves *waves;
+ GLfloat min_x, max_x, min_y, max_y;
+ int texture_width, texture_height;
+ int ncolors;
+ XColor *colors;
+
+} cube_configuration;
+
+static cube_configuration *ccs = NULL;
+
+static int wave_count;
+static int wave_speed;
+static int wave_radius;
+static int skew;
+
+static XrmOptionDescRec opts[] = {
+ {"-waves", ".waves", XrmoptionSepArg, 0 },
+ {"-wave-speed", ".waveSpeed", XrmoptionSepArg, 0 },
+ {"-wave-radius", ".waveRadius", XrmoptionSepArg, 0 },
+ {"-skew", ".skew", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&wave_count, "waves", "Waves", DEF_WAVES, t_Int},
+ {&wave_speed, "waveSpeed", "WaveSpeed", DEF_WAVE_SPEED, t_Int},
+ {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
+ {&skew, "skew", "Skew", DEF_SKEW,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 2) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ /* For this one it's really important to minimize the distance between
+ near and far. */
+ gluPerspective (30, 1/h, 10, 50);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+reset_colors (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ make_smooth_colormap (0, 0, 0,
+ cc->colors, &cc->ncolors,
+ False, 0, False);
+ if (! MI_IS_WIREFRAME(mi))
+ glClearColor (cc->colors[0].red / 65536.0,
+ cc->colors[0].green / 65536.0,
+ cc->colors[0].blue / 65536.0,
+ 1);
+}
+
+
+static void
+tweak_cubes (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ cube->x += (frand(2)-1)*0.01;
+ cube->y += (frand(2)-1)*0.01;
+ cube->z += (frand(2)-1)*0.01;
+ }
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+ /* Neutralize any vertical motion */
+ GLfloat rot = current_device_rotation();
+ Bool rotp = ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135));
+
+ if (event->xany.type == ButtonPress ||
+ event->xany.type == ButtonRelease)
+ {
+ if (rotp)
+ event->xbutton.x = MI_WIDTH(mi) / 2;
+ else
+ event->xbutton.y = MI_HEIGHT(mi) / 2;
+ }
+ else if (event->xany.type == MotionNotify)
+ {
+ if (rotp)
+ event->xmotion.x = MI_WIDTH(mi) / 2;
+ else
+ event->xmotion.y = MI_HEIGHT(mi) / 2;
+ }
+
+ if (gltrackball_event_handler (event, cc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cc->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ reset_colors (mi);
+ tweak_cubes (mi);
+ gltrackball_reset (cc->trackball, 0, 0);
+ return True;
+ }
+
+ return False;
+}
+
+
+/* Waves.
+ Adapted from ../hacks/interference.c by Hannu Mallat.
+ */
+
+static void
+init_wave (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww;
+ int i;
+ cc->waves = ww = (waves *) calloc (sizeof(*cc->waves), 1);
+ ww->nwaves = wave_count;
+ ww->radius = wave_radius;
+ ww->speed = wave_speed;
+ ww->heights = (int *) calloc (sizeof(*ww->heights), ww->radius);
+ ww->srcs = (wave_src *) calloc (sizeof(*ww->srcs), ww->nwaves);
+
+ for (i = 0; i < ww->radius; i++)
+ {
+ float max = (cc->ncolors * (ww->radius - i) / (float) ww->radius);
+ ww->heights[i] = ((max + max * cos(i / 50.0)) / 2.0);
+ }
+
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth = frand(2.0) * M_PI;
+ ww->srcs[i].yth = frand(2.0) * M_PI;
+ }
+
+ cc->texture_width = texture_size;
+ cc->texture_height = texture_size;
+}
+
+
+static int
+interference_point (cube_configuration *cc, int x, int y)
+{
+ /* Compute the effect of the waves on a pixel. */
+
+ waves *ww = cc->waves;
+ int result = 0;
+ int i;
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ int dx = x - ww->srcs[i].x;
+ int dy = y - ww->srcs[i].y;
+ int dist = sqrt (dx*dx + dy*dy);
+ result += (dist >= ww->radius ? 0 : ww->heights[dist]);
+ }
+ result *= 0.4;
+ if (result > 255) result = 255;
+ return result;
+}
+
+
+static void
+interference (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww = cc->waves;
+ int i;
+
+ /* Move the wave origins around
+ */
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth += (ww->speed / 1000.0);
+ if (ww->srcs[i].xth > 2*M_PI)
+ ww->srcs[i].xth -= 2*M_PI;
+ ww->srcs[i].yth += (ww->speed / 1000.0);
+ if (ww->srcs[i].yth > 2*M_PI)
+ ww->srcs[i].yth -= 2*M_PI;
+
+ ww->srcs[i].x = (cc->texture_width/2 +
+ (cos (ww->srcs[i].xth) *
+ cc->texture_width / 2));
+ ww->srcs[i].y = (cc->texture_height/2 +
+ (cos (ww->srcs[i].yth) *
+ cc->texture_height / 2));
+ }
+}
+
+
+/* qsort comparator for sorting cubes by y position */
+static int
+cmp_cubes (const void *aa, const void *bb)
+{
+ const cube *a = (cube *) aa;
+ const cube *b = (cube *) bb;
+ return ((int) (b->y * 10000) -
+ (int) (a->y * 10000));
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ int i;
+ cube_configuration *cc;
+
+ MI_INIT (mi, ccs);
+
+ cc = &ccs[MI_SCREEN(mi)];
+
+ if ((cc->glx_context = init_GL(mi)) != NULL) {
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ cc->trackball = gltrackball_init (False);
+
+ cc->ncolors = 256;
+ cc->colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+
+ reset_colors (mi);
+ init_wave (mi);
+
+ cc->ncubes = MI_COUNT (mi);
+
+ if (cc->ncubes < 1) cc->ncubes = 1;
+
+ cc->cubes = (cube *) calloc (sizeof(cube), cc->ncubes);
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ /* Set the size to roughly cover a 2x2 square on average. */
+ GLfloat scale = 1.8 / sqrt (cc->ncubes);
+ cube *cube = &cc->cubes[i];
+ double th = -(skew ? frand(skew) : 0) * M_PI / 180;
+
+ cube->x = (frand(1)-0.5);
+ cube->y = (frand(1)-0.5);
+
+ cube->z = frand(0.12);
+ cube->cth = cos(th);
+ cube->sth = sin(th);
+
+ cube->w = scale * (frand(1) + 0.2);
+ cube->d = scale * (frand(1) + 0.2);
+
+ if (cube->x < cc->min_x) cc->min_x = cube->x;
+ if (cube->y < cc->min_y) cc->min_y = cube->y;
+ if (cube->x > cc->max_x) cc->max_x = cube->x;
+ if (cube->y > cc->max_y) cc->max_y = cube->y;
+ }
+
+ /* Sorting by depth improves frame rate slightly. With 6000 polygons we get:
+ 3.9 FPS unsorted;
+ 3.1 FPS back to front;
+ 4.3 FPS front to back.
+ */
+ qsort (cc->cubes, cc->ncubes, sizeof(*cc->cubes), cmp_cubes);
+}
+
+
+static void
+animate_cubes (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ GLfloat fx = (cube->x - cc->min_x) / (cc->max_x - cc->min_x);
+ GLfloat fy = (cube->y - cc->min_y) / (cc->max_y - cc->min_y);
+ int x = (int) (cc->texture_width * fx) % cc->texture_width;
+ int y = (int) (cc->texture_height * fy) % cc->texture_height;
+ unsigned char v = interference_point (cc, x, y);
+ cube->h = cube->z + (v / 256.0 / 2.5) + 0.1;
+ }
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!cc->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cc->glx_context));
+
+ interference (mi);
+ animate_cubes (mi);
+
+ glShadeModel(GL_FLAT);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ /* glEnable (GL_POLYGON_OFFSET_FILL); */
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ gltrackball_rotate (cc->trackball);
+ glRotatef (-180, 1, 0, 0);
+
+ {
+ GLfloat s = 15;
+ glScalef (s, s, s);
+ }
+ glRotatef (-90, 1, 0, 0);
+
+ glTranslatef (-0.18, 0, -0.18);
+ glRotatef (37, 1, 0, 0);
+ glRotatef (20, 0, 0, 1);
+
+ glScalef (2.1, 2.1, 2.1);
+
+ /* Position lights after device rotation. */
+ if (!wire)
+ {
+ static const GLfloat pos[4] = {0.0, 0.25, -1.0, 0.0};
+ static const GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ static const GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ }
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ GLfloat cth = cube->cth;
+ GLfloat sth = cube->sth;
+ GLfloat x = cth*cube->x + sth*cube->y;
+ GLfloat y = -sth*cube->x + cth*cube->y;
+ GLfloat w = cube->w/2;
+ GLfloat h = cube->h/2;
+ GLfloat d = cube->d/2;
+ GLfloat bottom = 5;
+
+ GLfloat xw = cth*w, xd = sth*d;
+ GLfloat yw = -sth*w, yd = cth*d;
+
+ GLfloat color[4];
+ int c = cube->h * cc->ncolors * 0.7;
+ c %= cc->ncolors;
+
+ color[0] = cc->colors[c].red / 65536.0;
+ color[1] = cc->colors[c].green / 65536.0;
+ color[2] = cc->colors[c].blue / 65536.0;
+ color[3] = 1.0;
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ /* Putting this in a display list makes no performance difference. */
+
+ if (! wire)
+ {
+ glNormal3f (0, 0, -1); /* top */
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ mi->polygon_count++;
+
+ glNormal3f (sth, cth, 0); /* front */
+ glVertex3f (x+xw+xd, y+yw+yd, bottom);
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, bottom);
+ mi->polygon_count++;
+
+ glNormal3f (cth, -sth, 0); /* right */
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x+xw+xd, y+yw+yd, bottom);
+ glVertex3f (x+xw-xd, y+yw-yd, bottom);
+ mi->polygon_count++;
+
+# if 0 /* Omitting these makes no performance difference. */
+
+ glNormal3f (-cth, sth, 0); /* left */
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, bottom);
+ glVertex3f (x-xw+xd, y-yw+yd, bottom);
+ mi->polygon_count++;
+
+ glNormal3f (-sth, -cth, 0); /* back */
+ glVertex3f (x-xw-xd, y-yw-yd, bottom);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, bottom);
+ mi->polygon_count++;
+# endif
+ }
+ else
+ {
+ glNormal3f (0, 0, -1); /* top */
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ mi->polygon_count++;
+ }
+ }
+ glEnd();
+
+ glPolygonOffset (0, 0);
+
+# if 0
+ glDisable(GL_DEPTH_TEST); /* Outline the playfield */
+ glColor3f(1,1,1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f (-0.5, -0.5, 0);
+ glVertex3f (-0.5, 0.5, 0);
+ glVertex3f ( 0.5, 0.5, 0);
+ glVertex3f ( 0.5, -0.5, 0);
+ glEnd();
+# endif
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+XSCREENSAVER_MODULE_2 ("Cityflow", cityflow, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cityflow.man b/hacks/glx/cityflow.man
new file mode 100644
index 0000000..eabcdc2
--- /dev/null
+++ b/hacks/glx/cityflow.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cityflow - waves of boxes.
+.SH SYNOPSIS
+.B cityflow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-wave-speed \fInumber\fP]
+[\-wave-radius \fInumber\fP]
+[\-waves \fInumber\fP]
+[\-skew \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Waves move across a sea of boxes. The city swells. The walls are closing
+in.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-count \fInumber\fP
+Boxes. 50 - 4000. Default: 800.
+.TP 8
+.B \-wave-speed \fInumber\fP
+Wave speed. 5 - 150. Default: 25.
+.TP 8
+.B \-wave-radius \fInumber\fP
+Wave overlap. 5 - 512. Default: 256.
+.TP 8
+.B \-waves \fInumber\fP
+Wave complexity. 1 - 20. Default: 6.
+.TP 8
+.B \-skew \fInumber\fP
+Skew. 0 - 45. Default: 12.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2012 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/companion.c b/hacks/glx/companion.c
new file mode 100644
index 0000000..3c004a5
--- /dev/null
+++ b/hacks/glx/companion.c
@@ -0,0 +1,592 @@
+/* companioncube, Copyright (c) 2011-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* The symptoms most commonly produced by Enrichment Center testing are
+ superstition, perceiving inanimate objects as alive, and hallucinations.
+ The Enrichment Center reminds you that the weighted companion cube will
+ never threaten to stab you and, in fact, cannot speak. In the event that
+ the Weighted Companion Cube does speak, the Enrichment Center urges you to
+ disregard its advice.
+ */
+
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*count: 3 \n" \
+ "*wireframe: False \n" \
+
+/* #define DEBUG */
+
+
+# define free_cube 0
+# define release_cube 0
+#define DEF_SPEED "1.0"
+#define DEF_SPIN "False"
+#define DEF_WANDER "False"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern const struct gllist *companion_quad, *companion_disc, *companion_heart;
+static const struct gllist * const *all_objs[] = {
+ &companion_quad, &companion_disc, &companion_heart
+};
+#define BASE_QUAD 0
+#define BASE_DISC 1
+#define BASE_HEART 2
+#define FULL_CUBE 3
+
+#define SPEED_SCALE 0.2
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat ix, iy, iz;
+ GLfloat dx, dy, dz;
+ GLfloat ddx, ddy, ddz;
+ GLfloat zr;
+ rotator *rot;
+ Bool spinner_p;
+} floater;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint *dlists;
+ int cube_polys;
+
+ int nfloaters;
+ floater *floaters;
+
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static GLfloat speed;
+static Bool do_spin;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+#define BOTTOM 28.0
+
+static void
+reset_floater (ModeInfo *mi, floater *f)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ f->y = -BOTTOM;
+ f->x = f->ix;
+ f->z = f->iz;
+
+ /* Yes, I know I'm varying the force of gravity instead of varying the
+ launch velocity. That's intentional: empirical studies indicate
+ that it's way, way funnier that way. */
+
+ f->dy = 5.0;
+ f->dx = 0;
+ f->dz = 0;
+
+ /* -0.18 max -0.3 top -0.4 middle -0.6 bottom */
+ f->ddy = speed * SPEED_SCALE * (-0.6 + BELLRAND(0.45));
+ f->ddx = 0;
+ f->ddz = 0;
+
+ if (do_spin || do_wander)
+ f->spinner_p = 0;
+ else
+ f->spinner_p = !(random() % (3 * bp->nfloaters));
+
+ if (! (random() % (30 * bp->nfloaters)))
+ {
+ f->dx = BELLRAND(1.8) * RANDSIGN();
+ f->dz = BELLRAND(1.8) * RANDSIGN();
+ }
+
+ f->zr = frand(180);
+ if (do_spin || do_wander)
+ {
+ f->y = 0;
+ if (bp->nfloaters > 2)
+ f->y += frand(3.0) * RANDSIGN();
+ }
+}
+
+
+static void
+tick_floater (ModeInfo *mi, floater *f)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->button_down_p) return;
+
+ if (do_spin || do_wander) return;
+
+ f->dx += f->ddx;
+ f->dy += f->ddy;
+ f->dz += f->ddz;
+
+ f->x += f->dx * speed * SPEED_SCALE;
+ f->y += f->dy * speed * SPEED_SCALE;
+ f->z += f->dz * speed * SPEED_SCALE;
+
+ if (f->y < -BOTTOM ||
+ f->x < -BOTTOM*8 || f->x > BOTTOM*8 ||
+ f->z < -BOTTOM*8 || f->z > BOTTOM*8)
+ reset_floater (mi, f);
+}
+
+
+
+
+
+static int
+build_corner (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat s;
+ const struct gllist *gll = *all_objs[BASE_QUAD];
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, -0.5);
+ s = 0.659;
+ glScalef (s, s, s);
+
+ glRotatef (180, 0, 1, 0);
+ glRotatef (180, 0, 0, 1);
+ glTranslatef (-0.12, -1.64, 0.12);
+ glCallList (bp->dlists[BASE_QUAD]);
+ glPopMatrix();
+
+ return gll->points / 3;
+}
+
+
+static int
+build_face (ModeInfo *mi)
+{
+ int polys = 0;
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat s;
+ const struct gllist *gll;
+
+ GLfloat base_color[4] = {0.53, 0.60, 0.66, 1.00};
+ GLfloat heart_color[4] = {0.92, 0.67, 1.00, 1.00};
+ GLfloat disc_color[4] = {0.75, 0.92, 1.00, 1.00};
+ GLfloat corner_color[4] = {0.75, 0.92, 1.00, 1.00};
+
+ if (!wire)
+ {
+ GLfloat w = 0.010;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, base_color);
+ glPushMatrix();
+ glNormal3f (0, 0, -1);
+ glTranslatef (-0.5, -0.5, -0.5);
+
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 0.5-w, 0);
+ glVertex3f (0.5-w, 0.5-w, 0);
+ glVertex3f (0.5-w, 0, 0);
+
+ glVertex3f (0.5+w, 0, 0);
+ glVertex3f (0.5+w, 0.5-w, 0);
+ glVertex3f (1, 0.5-w, 0);
+ glVertex3f (1, 0, 0);
+
+ glVertex3f (0, 0.5+w, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (0.5-w, 1, 0);
+ glVertex3f (0.5-w, 0.5+w, 0);
+
+ glVertex3f (0.5+w, 0.5+w, 0);
+ glVertex3f (0.5+w, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0.5+w, 0);
+ glEnd();
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
+
+ glNormal3f (0, -1, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0.5+w, 0);
+ glVertex3f (1, 0.5+w, 0);
+ glVertex3f (1, 0.5+w, w);
+ glVertex3f (0, 0.5+w, w);
+ glEnd();
+
+ glNormal3f (0, 1, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0.5-w, w);
+ glVertex3f (1, 0.5-w, w);
+ glVertex3f (1, 0.5-w, 0);
+ glVertex3f (0, 0.5-w, 0);
+ glEnd();
+
+ glNormal3f (-1, 0, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0.5+w, 0, w);
+ glVertex3f (0.5+w, 1, w);
+ glVertex3f (0.5+w, 1, 0);
+ glVertex3f (0.5+w, 0, 0);
+ glEnd();
+
+ glNormal3f (1, 0, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0.5-w, 0, 0);
+ glVertex3f (0.5-w, 1, 0);
+ glVertex3f (0.5-w, 1, w);
+ glVertex3f (0.5-w, 0, w);
+ glEnd();
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
+
+ glNormal3f (0, 0, -1);
+ glTranslatef (0, 0, w);
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ glPopMatrix();
+ }
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, corner_color);
+
+ glPushMatrix();
+ polys += build_corner (mi); glRotatef (90, 0, 0, 1);
+ polys += build_corner (mi); glRotatef (90, 0, 0, 1);
+ polys += build_corner (mi); glRotatef (90, 0, 0, 1);
+ polys += build_corner (mi);
+
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (0.585, -0.585, -0.5655);
+
+ s = 10.5;
+ glScalef (s, s, s);
+ glRotatef (180, 0, 1, 0);
+
+ if (! wire)
+ {
+ gll = *all_objs[BASE_HEART];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
+ glCallList (bp->dlists[BASE_HEART]);
+ polys += gll->points / 3;
+ }
+
+ gll = *all_objs[BASE_DISC];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, disc_color);
+ glCallList (bp->dlists[BASE_DISC]);
+ polys += gll->points / 3;
+
+ glPopMatrix();
+ return polys;
+}
+
+
+static int
+build_cube (ModeInfo *mi)
+{
+ int polys = 0;
+ glPushMatrix();
+ polys += build_face (mi); glRotatef (90, 0, 1, 0);
+ polys += build_face (mi); glRotatef (90, 0, 1, 0);
+ polys += build_face (mi); glRotatef (90, 0, 1, 0);
+ polys += build_face (mi); glRotatef (90, 1, 0, 0);
+ polys += build_face (mi); glRotatef (180,1, 0, 0);
+ polys += build_face (mi);
+ glPopMatrix();
+ return polys;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.7, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ bp->trackball = gltrackball_init (False);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+2, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs)+1; i++)
+ bp->dlists[i] = glGenLists (1);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+ glNewList (bp->dlists[i], GL_COMPILE);
+ renderList (gll, wire);
+ glEndList ();
+ }
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+ bp->cube_polys = build_cube (mi);
+ glEndList ();
+
+
+ bp->nfloaters = MI_COUNT (mi);
+ bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ double spin_speed = do_spin ? 0.7 : 10;
+ double wander_speed = do_wander ? 0.02 : 0.05 * speed * SPEED_SCALE;
+ double spin_accel = 0.5;
+ f->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel,
+ wander_speed,
+ True);
+ if (bp->nfloaters == 2)
+ {
+ f->x = (i ? 2 : -2);
+ }
+ else if (i != 0)
+ {
+ double th = (i - 1) * M_PI*2 / (bp->nfloaters-1);
+ double r = 3;
+ f->x = r * cos(th);
+ f->z = r * sin(th);
+ }
+
+ f->ix = f->x;
+ f->iy = f->y;
+ f->iz = f->z;
+ reset_floater (mi, f);
+ }
+}
+
+
+static void
+draw_floater (ModeInfo *mi, floater *f)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat n;
+ double x, y, z;
+
+ get_position (f->rot, &x, &y, &z, !bp->button_down_p);
+
+ glPushMatrix();
+ glTranslatef (f->x, f->y, f->z);
+
+ if (do_wander)
+ glTranslatef (x, y, z);
+
+ if (do_spin)
+ get_rotation (f->rot, &x, &y, &z, !bp->button_down_p);
+
+ if (do_spin || f->spinner_p)
+ {
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ }
+ else
+ {
+ glRotatef (f->zr * 360, 0, 1, 0);
+ }
+
+ n = 1.5;
+ if (bp->nfloaters > 99) n *= 0.05;
+ else if (bp->nfloaters > 25) n *= 0.18;
+ else if (bp->nfloaters > 9) n *= 0.3;
+ else if (bp->nfloaters > 1) n *= 0.7;
+
+ n *= 2;
+
+ if ((do_spin || do_wander) && bp->nfloaters > 1)
+ n *= 0.7;
+
+ glScalef(n, n, n);
+
+ glCallList (bp->dlists[FULL_CUBE]);
+ mi->polygon_count += bp->cube_polys;
+/* build_cube (mi);*/
+
+ glPopMatrix();
+}
+
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ gltrackball_rotate (bp->trackball);
+
+ glScalef (2, 2, 2);
+
+ mi->polygon_count = 0;
+
+# if 0
+ {
+ floater F;
+ F.x = F.y = F.z = 0;
+ F.dx = F.dy = F.dz = 0;
+ F.ddx = F.ddy = F.ddz = 0;
+ F.rot = make_rotator (0, 0, 0, 1, 0, False);
+ glRotatef (45, 0, 1, 0);
+ draw_floater (mi, &F);
+ }
+# else
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ draw_floater (mi, f);
+ tick_floater (mi, f);
+ }
+# endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("CompanionCube", companioncube, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/companion_disc.c b/hacks/glx/companion_disc.c
new file mode 100644
index 0000000..b2f1830
--- /dev/null
+++ b/hacks/glx/companion_disc.c
@@ -0,0 +1,9593 @@
+#include "gllist.h"
+static const float data[]={
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ 0,0,1,0.043898,0.062655,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ 0,0,1,0.043898,0.062655,-0.004818,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ 0,0,1,0.043898,0.062655,-0.004818,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ 0,0,1,0.043409,0.05966,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ 0,0,1,0.043409,0.05966,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ 0,0,1,0.043472,0.058741,-0.004818,
+ 0,0,1,0.043409,0.05966,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ 0,0,1,0.043472,0.058741,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ 0,0,1,0.04361,0.057831,-0.004818,
+ 0,0,1,0.043472,0.058741,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ 0,0,1,0.043821,0.056936,-0.004818,
+ 0,0,1,0.04361,0.057831,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ 0,0,1,0.043821,0.056936,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ 0,0,1,0.044105,0.056061,-0.004818,
+ 0,0,1,0.043821,0.056936,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ 0,0,1,0.044105,0.056061,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ 0,0,1,0.044458,0.055214,-0.004818,
+ 0,0,1,0.044105,0.056061,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ 0,0,1,0.044458,0.055214,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ 0,0,1,0.044879,0.054399,-0.004818,
+ 0,0,1,0.044458,0.055214,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ 0,0,1,0.044879,0.054399,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ 0,0,1,0.045365,0.053623,-0.004818,
+ 0,0,1,0.044879,0.054399,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ 0,0,1,0.045912,0.05289,-0.004818,
+ 0,0,1,0.045365,0.053623,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ 0,0,1,0.045912,0.05289,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ 0,0,1,0.046517,0.052206,-0.004818,
+ 0,0,1,0.045912,0.05289,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ 0,0,1,0.046517,0.052206,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ 0,0,1,0.047175,0.051576,-0.004818,
+ 0,0,1,0.046517,0.052206,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ 0,0,1,0.047882,0.051003,-0.004818,
+ 0,0,1,0.047175,0.051576,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ 0,0,1,0.047882,0.051003,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ 0,0,1,0.048634,0.050493,-0.004818,
+ 0,0,1,0.047882,0.051003,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ 0,0,1,0.049354,0.050026,-0.004818,
+ 0,0,1,0.048634,0.050493,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ 0,0,1,0.049354,0.050026,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ 0,0,1,0.050057,0.049532,-0.004818,
+ 0,0,1,0.049354,0.050026,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ 0,0,1,0.050057,0.049532,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ 0,0,1,0.050741,0.049011,-0.004818,
+ 0,0,1,0.050057,0.049532,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ 0,0,1,0.051404,0.048464,-0.004818,
+ 0,0,1,0.050741,0.049011,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ 0,0,1,0.051404,0.048464,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ 0,0,1,0.052047,0.047891,-0.004818,
+ 0,0,1,0.051404,0.048464,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ 0,0,1,0.052047,0.047891,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ 0,0,1,0.052668,0.047293,-0.004818,
+ 0,0,1,0.052047,0.047891,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ 0,0,1,0.053266,0.046673,-0.004818,
+ 0,0,1,0.052668,0.047293,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ 0,0,1,0.053266,0.046673,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ 0,0,1,0.05384,0.046029,-0.004818,
+ 0,0,1,0.053266,0.046673,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ 0,0,1,0.05384,0.046029,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ 0,0,1,0.05439,0.045363,-0.004818,
+ 0,0,1,0.05384,0.046029,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ 0,0,1,0.05439,0.045363,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ 0,0,1,0.054915,0.044676,-0.004818,
+ 0,0,1,0.05439,0.045363,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ 0,0,1,0.054915,0.044676,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ 0,0,1,0.055414,0.04397,-0.004818,
+ 0,0,1,0.054915,0.044676,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ 0,0,1,0.055414,0.04397,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ 0,0,1,0.055414,0.04397,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0,0,1,0.056357,0.04397,-0.004818,
+ 0,0,1,0.056357,0.04397,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0,0,1,0.056357,0.04397,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0,0,1,0.056856,0.044676,-0.004818,
+ 0,0,1,0.056856,0.044676,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0,0,1,0.056856,0.044676,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0,0,1,0.05738,0.045363,-0.004818,
+ 0,0,1,0.05738,0.045363,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0,0,1,0.05738,0.045363,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0,0,1,0.05793,0.046029,-0.004818,
+ 0,0,1,0.05793,0.046029,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0,0,1,0.05793,0.046029,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0,0,1,0.058505,0.046673,-0.004818,
+ 0,0,1,0.058505,0.046673,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0,0,1,0.058505,0.046673,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0,0,1,0.059103,0.047293,-0.004818,
+ 0,0,1,0.059103,0.047293,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0,0,1,0.059724,0.047891,-0.004818,
+ 0,0,1,0.059724,0.047891,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0,0,1,0.059724,0.047891,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0,0,1,0.060366,0.048464,-0.004818,
+ 0,0,1,0.060366,0.048464,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0,0,1,0.060366,0.048464,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0,0,1,0.06103,0.049011,-0.004818,
+ 0,0,1,0.06103,0.049011,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0,0,1,0.061714,0.049532,-0.004818,
+ 0,0,1,0.061714,0.049532,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0,0,1,0.061714,0.049532,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0,0,1,0.062416,0.050026,-0.004818,
+ 0,0,1,0.062416,0.050026,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0,0,1,0.062416,0.050026,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0,0,1,0.063137,0.050493,-0.004818,
+ 0,0,1,0.063137,0.050493,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0,0,1,0.063888,0.051003,-0.004818,
+ 0,0,1,0.063888,0.051003,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0,0,1,0.063888,0.051003,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0,0,1,0.064596,0.051576,-0.004818,
+ 0,0,1,0.064596,0.051576,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0,0,1,0.065254,0.052206,-0.004818,
+ 0,0,1,0.065254,0.052206,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0,0,1,0.065254,0.052206,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0,0,1,0.065859,0.05289,-0.004818,
+ 0,0,1,0.065859,0.05289,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0,0,1,0.065859,0.05289,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0,0,1,0.066406,0.053623,-0.004818,
+ 0,0,1,0.066406,0.053623,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0,0,1,0.066892,0.054399,-0.004818,
+ 0,0,1,0.066892,0.054399,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0,0,1,0.066892,0.054399,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0,0,1,0.067313,0.055214,-0.004818,
+ 0,0,1,0.067313,0.055214,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0,0,1,0.067313,0.055214,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0,0,1,0.067666,0.056061,-0.004818,
+ 0,0,1,0.067666,0.056061,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0,0,1,0.067666,0.056061,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0,0,1,0.067949,0.056936,-0.004818,
+ 0,0,1,0.067949,0.056936,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0,0,1,0.067949,0.056936,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0,0,1,0.068161,0.057831,-0.004818,
+ 0,0,1,0.068161,0.057831,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0,0,1,0.068298,0.058741,-0.004818,
+ 0,0,1,0.068298,0.058741,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0,0,1,0.068298,0.058741,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0,0,1,0.068362,0.05966,-0.004818,
+ 0,0,1,0.068362,0.05966,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0,0,1,0.068362,0.05966,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0,0,1,0.067873,0.062655,-0.004818,
+ 0,0,1,0.067873,0.062655,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0,0,1,0.067873,0.062655,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0,0,1,0.06617,0.065145,-0.004818,
+ 0,0,1,0.06617,0.065145,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0,0,1,0.06617,0.065145,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0,0,1,0.064959,0.066043,-0.004818,
+ 0,0,1,0.064959,0.066043,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0,0,1,0.064959,0.066043,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0,0,1,0.063583,0.066646,-0.004818,
+ 0,0,1,0.063583,0.066646,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0,0,1,0.063583,0.066646,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ 0,0,1,0.048188,0.066646,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ 0,0,1,0.048188,0.066646,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ 0,0,1,0.046812,0.066043,-0.004818,
+ 0,0,1,0.048188,0.066646,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ 0,0,1,0.046812,0.066043,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ 0,0,1,0.0456,0.065145,-0.004818,
+ 0,0,1,0.046812,0.066043,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ 0,0,1,0.0456,0.065145,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ 0,0,1,0.0456,0.065145,-0.004818,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ 0,0,1,0.060613,0.066867,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0,0,1,0.051157,0.066867,-0.004818,
+ 0,0,1,0.060613,0.066867,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ 0,0,1,0.051157,0.066867,-0.004818,
+ 0,0,1,0.059165,0.066474,-0.004818,
+ 0,0,1,0.060613,0.066867,-0.004818,
+ 0,0,1,0.052605,0.066474,-0.004818,
+ 0,0,1,0.059165,0.066474,-0.004818,
+ 0,0,1,0.051157,0.066867,-0.004818,
+ 0,0,1,0.052605,0.066474,-0.004818,
+ 0,0,1,0.057837,0.065766,-0.004818,
+ 0,0,1,0.059165,0.066474,-0.004818,
+ 0,0,1,0.053934,0.065766,-0.004818,
+ 0,0,1,0.057837,0.065766,-0.004818,
+ 0,0,1,0.052605,0.066474,-0.004818,
+ 0,0,1,0.053934,0.065766,-0.004818,
+ 0,0,1,0.056739,0.064761,-0.004818,
+ 0,0,1,0.057837,0.065766,-0.004818,
+ 0,0,1,0.055031,0.064761,-0.004818,
+ 0,0,1,0.056739,0.064761,-0.004818,
+ 0,0,1,0.053934,0.065766,-0.004818,
+ 0,0,1,0.056739,0.064761,-0.004818,
+ 0,0,1,0.055031,0.064761,-0.004818,
+ 0,0,1,0.055885,0.063727,-0.004818,
+ -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.860742,-0.509041,0,0.040845,0.047263,-0.007708,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.860742,-0.509041,0,0.040845,0.047263,-0.007708,
+ -0.860742,-0.509041,0,0.040904,0.047163,-0.007708,
+ -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.707107,-0.707107,0,0.043581,0.043673,-0.007708,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.707107,-0.707107,0,0.043581,0.043673,-0.007708,
+ -0.707107,-0.707107,0,0.043673,0.043581,-0.007708,
+ -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.509041,-0.860742,0,0.047163,0.040904,-0.007708,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.509041,-0.860742,0,0.047163,0.040904,-0.007708,
+ -0.509041,-0.860742,0,0.047263,0.040845,-0.007708,
+ -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.278991,-0.960294,0,0.051356,0.039149,-0.007708,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.278991,-0.960294,0,0.051356,0.039149,-0.007708,
+ -0.278991,-0.960294,0,0.051428,0.039128,-0.007708,
+ -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
+ -0.094108,-0.995562,0,0.054796,0.038576,-0.007708,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.094108,-0.995562,0,0.054796,0.038576,-0.007708,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.960294,-0.278991,0,0.039128,0.051428,-0.007708,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.960294,-0.278991,0,0.039128,0.051428,-0.007708,
+ -0.960294,-0.278991,0,0.039149,0.051356,-0.007708,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
+ -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
+ -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.995562,-0.094108,0,0.038576,0.054796,-0.007708,
+ -0.995562,0.094108,0,0.038576,0.056974,-0.007708,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.995562,0.094108,0,0.038576,0.056974,-0.007708,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
+ -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
+ -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.960294,0.278991,0,0.039149,0.060414,-0.007708,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.960294,0.278991,0,0.039149,0.060414,-0.007708,
+ -0.960294,0.278991,0,0.039128,0.060343,-0.007708,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
+ -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
+ -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.860742,0.509041,0,0.040904,0.064607,-0.007708,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.860742,0.509041,0,0.040904,0.064607,-0.007708,
+ -0.860742,0.509041,0,0.040845,0.064507,-0.007708,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
+ -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
+ -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.707107,0.707107,0,0.043673,0.068189,-0.007708,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.707107,0.707107,0,0.043673,0.068189,-0.007708,
+ -0.707107,0.707107,0,0.043581,0.068097,-0.007708,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
+ -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
+ -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.509041,0.860742,0,0.047263,0.070926,-0.007708,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.509041,0.860742,0,0.047263,0.070926,-0.007708,
+ -0.509041,0.860742,0,0.047163,0.070867,-0.007708,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
+ -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
+ -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.278991,0.960294,0,0.051428,0.072642,-0.007708,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.278991,0.960294,0,0.051428,0.072642,-0.007708,
+ -0.278991,0.960294,0,0.051356,0.072621,-0.007708,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
+ -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
+ -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.094108,0.995562,0,0.054796,0.073195,-0.007708,
+ 0.094108,0.995562,0,0.056974,0.073195,-0.007708,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.094108,0.995562,0,0.056974,0.073195,-0.007708,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
+ 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
+ 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.278991,0.960294,0,0.060414,0.072621,-0.007708,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.278991,0.960294,0,0.060414,0.072621,-0.007708,
+ 0.278991,0.960294,0,0.060343,0.072642,-0.007708,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
+ 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
+ 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.509041,0.860742,0,0.064607,0.070867,-0.007708,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.509041,0.860742,0,0.064607,0.070867,-0.007708,
+ 0.509041,0.860742,0,0.064507,0.070926,-0.007708,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
+ 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
+ 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.707107,0.707107,0,0.068189,0.068097,-0.007708,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.707107,0.707107,0,0.068189,0.068097,-0.007708,
+ 0.707107,0.707107,0,0.068097,0.068189,-0.007708,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
+ 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
+ 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.860742,0.509041,0,0.070926,0.064507,-0.007708,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.860742,0.509041,0,0.070926,0.064507,-0.007708,
+ 0.860742,0.509041,0,0.070867,0.064607,-0.007708,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
+ 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
+ 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.960294,0.278991,0,0.072642,0.060343,-0.007708,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.960294,0.278991,0,0.072642,0.060343,-0.007708,
+ 0.960294,0.278991,0,0.072621,0.060414,-0.007708,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
+ 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
+ 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.995562,0.094108,0,0.073195,0.056974,-0.007708,
+ 0.995562,-0.094108,0,0.073195,0.054796,-0.007708,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.995562,-0.094108,0,0.073195,0.054796,-0.007708,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
+ 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
+ 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.960294,-0.278991,0,0.072621,0.051356,-0.007708,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.960294,-0.278991,0,0.072621,0.051356,-0.007708,
+ 0.960294,-0.278991,0,0.072642,0.051428,-0.007708,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
+ 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
+ 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.860742,-0.509041,0,0.070867,0.047163,-0.007708,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.860742,-0.509041,0,0.070867,0.047163,-0.007708,
+ 0.860742,-0.509041,0,0.070926,0.047263,-0.007708,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
+ 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
+ 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.707107,-0.707107,0,0.068097,0.043581,-0.007708,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.707107,-0.707107,0,0.068097,0.043581,-0.007708,
+ 0.707107,-0.707107,0,0.068189,0.043673,-0.007708,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
+ 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
+ 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.509041,-0.860742,0,0.064507,0.040845,-0.007708,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.509041,-0.860742,0,0.064507,0.040845,-0.007708,
+ 0.509041,-0.860742,0,0.064607,0.040904,-0.007708,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
+ 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
+ 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.278991,-0.960294,0,0.060343,0.039128,-0.007708,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.278991,-0.960294,0,0.060343,0.039128,-0.007708,
+ 0.278991,-0.960294,0,0.060414,0.039149,-0.007708,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
+ 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
+ 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.094108,-0.995562,0,0.056974,0.038576,-0.007708
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,9588,data,NULL};
+const struct gllist *companion_disc=&frame;
diff --git a/hacks/glx/companion_heart.c b/hacks/glx/companion_heart.c
new file mode 100644
index 0000000..1786a62
--- /dev/null
+++ b/hacks/glx/companion_heart.c
@@ -0,0 +1,653 @@
+#include "gllist.h"
+static const float data[]={
+ -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
+ -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781,
+ -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055116,0.063504,-0.005781,
+ 0,0,1,0.054127,0.064391,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.054127,0.064391,-0.005781,
+ 0,0,1,0.052967,0.065039,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.052967,0.065039,-0.005781,
+ 0,0,1,0.051693,0.065415,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.051693,0.065415,-0.005781,
+ 0,0,1,0.050367,0.065502,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.050367,0.065502,-0.005781,
+ 0,0,1,0.049054,0.065295,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.049054,0.065295,-0.005781,
+ 0,0,1,0.04782,0.064804,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04782,0.064804,-0.005781,
+ 0,0,1,0.046724,0.064053,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.046724,0.064053,-0.005781,
+ 0,0,1,0.04582,0.063079,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04582,0.063079,-0.005781,
+ 0,0,1,0.045152,0.06193,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.045152,0.06193,-0.005781,
+ 0,0,1,0.044754,0.060662,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044754,0.060662,-0.005781,
+ 0,0,1,0.044645,0.059338,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044645,0.059338,-0.005781,
+ 0,0,1,0.044702,0.058527,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044702,0.058527,-0.005781,
+ 0,0,1,0.044827,0.057723,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044827,0.057723,-0.005781,
+ 0,0,1,0.045017,0.056932,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.045017,0.056932,-0.005781,
+ 0,0,1,0.045272,0.05616,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.045272,0.05616,-0.005781,
+ 0,0,1,0.04559,0.055411,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04559,0.055411,-0.005781,
+ 0,0,1,0.04597,0.054691,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04597,0.054691,-0.005781,
+ 0,0,1,0.046407,0.054006,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.046407,0.054006,-0.005781,
+ 0,0,1,0.0469,0.053359,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.0469,0.053359,-0.005781,
+ 0,0,1,0.047445,0.052755,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.047445,0.052755,-0.005781,
+ 0,0,1,0.048038,0.052198,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.048038,0.052198,-0.005781,
+ 0,0,1,0.048675,0.051693,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.048675,0.051693,-0.005781,
+ 0,0,1,0.049352,0.051241,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.049352,0.051241,-0.005781,
+ 0,0,1,0.050001,0.050829,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.050001,0.050829,-0.005781,
+ 0,0,1,0.050634,0.050393,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.050634,0.050393,-0.005781,
+ 0,0,1,0.05125,0.049933,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05125,0.049933,-0.005781,
+ 0,0,1,0.051848,0.049449,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.051848,0.049449,-0.005781,
+ 0,0,1,0.052427,0.048943,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.052427,0.048943,-0.005781,
+ 0,0,1,0.052987,0.048416,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.052987,0.048416,-0.005781,
+ 0,0,1,0.053525,0.047867,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.053525,0.047867,-0.005781,
+ 0,0,1,0.054043,0.047299,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.054043,0.047299,-0.005781,
+ 0,0,1,0.054538,0.046711,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.054538,0.046711,-0.005781,
+ 0,0,1,0.055011,0.046104,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055011,0.046104,-0.005781,
+ 0,0,1,0.05546,0.04548,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05546,0.04548,-0.005781,
+ 0,0,1,0.055885,0.044839,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055885,0.044839,-0.005781,
+ 0,0,1,0.05631,0.04548,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05631,0.04548,-0.005781,
+ 0,0,1,0.05676,0.046104,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05676,0.046104,-0.005781,
+ 0,0,1,0.057232,0.046711,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.057232,0.046711,-0.005781,
+ 0,0,1,0.057728,0.047299,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.057728,0.047299,-0.005781,
+ 0,0,1,0.058245,0.047867,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.058245,0.047867,-0.005781,
+ 0,0,1,0.058784,0.048416,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.058784,0.048416,-0.005781,
+ 0,0,1,0.059343,0.048943,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.059343,0.048943,-0.005781,
+ 0,0,1,0.059922,0.049449,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.059922,0.049449,-0.005781,
+ 0,0,1,0.06052,0.049933,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.06052,0.049933,-0.005781,
+ 0,0,1,0.061136,0.050393,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.061136,0.050393,-0.005781,
+ 0,0,1,0.061769,0.050829,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.061769,0.050829,-0.005781,
+ 0,0,1,0.062418,0.051241,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.062418,0.051241,-0.005781,
+ 0,0,1,0.063095,0.051693,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.063095,0.051693,-0.005781,
+ 0,0,1,0.063732,0.052198,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.063732,0.052198,-0.005781,
+ 0,0,1,0.064326,0.052755,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.064326,0.052755,-0.005781,
+ 0,0,1,0.06487,0.053359,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.06487,0.053359,-0.005781,
+ 0,0,1,0.065363,0.054006,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065363,0.054006,-0.005781,
+ 0,0,1,0.065801,0.054691,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065801,0.054691,-0.005781,
+ 0,0,1,0.06618,0.055411,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.06618,0.055411,-0.005781,
+ 0,0,1,0.066498,0.05616,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066498,0.05616,-0.005781,
+ 0,0,1,0.066754,0.056932,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066754,0.056932,-0.005781,
+ 0,0,1,0.066944,0.057723,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066944,0.057723,-0.005781,
+ 0,0,1,0.067068,0.058527,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.067068,0.058527,-0.005781,
+ 0,0,1,0.067125,0.059338,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.067125,0.059338,-0.005781,
+ 0,0,1,0.067016,0.060662,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.067016,0.060662,-0.005781,
+ 0,0,1,0.066618,0.06193,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066618,0.06193,-0.005781,
+ 0,0,1,0.065951,0.063079,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065951,0.063079,-0.005781,
+ 0,0,1,0.065047,0.064053,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065047,0.064053,-0.005781,
+ 0,0,1,0.063951,0.064804,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.063951,0.064804,-0.005781,
+ 0,0,1,0.062716,0.065295,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.062716,0.065295,-0.005781,
+ 0,0,1,0.061404,0.065502,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.061404,0.065502,-0.005781,
+ 0,0,1,0.060078,0.065415,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.060078,0.065415,-0.005781,
+ 0,0,1,0.058804,0.065039,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.058804,0.065039,-0.005781,
+ 0,0,1,0.057644,0.064391,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.057644,0.064391,-0.005781,
+ 0,0,1,0.056655,0.063504,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.056655,0.063504,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055116,0.063504,-0.005781,
+ 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
+ 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
+ 0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
+ 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
+ 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
+ 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
+ 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
+ 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
+ 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
+ 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
+ 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
+ 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
+ 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
+ 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
+ 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
+ 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.525024,0.459644,0.716294,0.054043,0.047299,-0.005781,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
+ 0.525024,0.459644,0.716294,0.054043,0.047299,-0.005781,
+ 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
+ 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
+ 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
+ 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
+ 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
+ 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
+ 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
+ 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
+ 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
+ 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
+ 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
+ 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
+ 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
+ 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
+ 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
+ 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
+ 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
+ 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
+ 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
+ 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
+ 0.42249,0.532759,0.73326,0.050741,0.049011,-0.004818,
+ 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.42249,0.532759,0.73326,0.050741,0.049011,-0.004818,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
+ 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
+ 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
+ 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
+ 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
+ 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
+ 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
+ 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
+ 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
+ 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
+ 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
+ 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
+ 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
+ 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
+ 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
+ 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.403275,0.554082,0.72826,0.048675,0.051693,-0.005781,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
+ 0.403275,0.554082,0.72826,0.048675,0.051693,-0.005781,
+ 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
+ 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
+ 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
+ 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
+ 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
+ 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
+ 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
+ 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
+ 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
+ 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
+ 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
+ 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
+ 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
+ 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
+ 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
+ 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
+ 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
+ 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
+ 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
+ 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
+ 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
+ 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
+ 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
+ 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
+ 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
+ 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
+ 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
+ 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
+ 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
+ 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
+ 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
+ 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
+ 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
+ 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
+ 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
+ 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
+ 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
+ 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
+ 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
+ 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
+ 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
+ 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
+ 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
+ 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
+ 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
+ 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
+ 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
+ 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
+ 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
+ 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
+ 0.622674,0.06887,0.779444,0.043472,0.058741,-0.004818,
+ 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
+ 0.622674,0.06887,0.779444,0.043472,0.058741,-0.004818,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
+ 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
+ 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
+ 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
+ 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
+ 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
+ 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
+ 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
+ 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
+ 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
+ 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
+ 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
+ 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
+ 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
+ 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
+ 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
+ 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
+ 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
+ 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
+ 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
+ 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
+ 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
+ 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
+ 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
+ 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
+ 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
+ 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
+ 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
+ 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
+ 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
+ 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
+ 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
+ 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
+ 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
+ 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
+ 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
+ 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
+ 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
+ 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
+ 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
+ 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
+ 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
+ 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
+ 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
+ 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
+ -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
+ -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
+ -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
+ 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
+ -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
+ -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.248853,-0.582215,0.774014,0.052967,0.065039,-0.005781,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
+ -0.248853,-0.582215,0.774014,0.052967,0.065039,-0.005781,
+ -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
+ -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
+ -0.558162,-0.527957,0.640091,0.055031,0.064761,-0.004818,
+ -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ -0.558162,-0.527957,0.640091,0.055031,0.064761,-0.004818,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ -0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ -0.641198,-0.455323,0.617694,0.055885,0.06242,-0.005781,
+ -0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ 0.641198,-0.455323,0.617694,0.055885,0.06242,-0.005781,
+ 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
+ 0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
+ 0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
+ 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
+ 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
+ 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
+ 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
+ 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
+ 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
+ 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
+ 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
+ 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
+ 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
+ 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
+ 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
+ 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
+ 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
+ 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
+ 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
+ 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
+ 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
+ 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
+ -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
+ 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
+ -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
+ 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
+ -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
+ -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
+ -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
+ -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
+ -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
+ -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
+ -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
+ 0.622274,0.404734,0.670049,0.055885,0.043244,-0.004818,
+ 0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
+ -0.622274,0.404734,0.670049,0.055885,0.043244,-0.004818,
+ -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
+ -0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
+ -0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
+ -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
+ -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
+ -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
+ -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
+ -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
+ -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
+ -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
+ -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
+ -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
+ -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
+ -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
+ -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
+ -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
+ -0.525024,0.459644,0.716294,0.057728,0.047299,-0.005781,
+ -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.525024,0.459644,0.716294,0.057728,0.047299,-0.005781,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
+ -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
+ -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
+ -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
+ -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
+ -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
+ -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
+ -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
+ -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
+ -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
+ -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
+ -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
+ -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
+ -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
+ -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
+ -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
+ -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
+ -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
+ -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
+ -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
+ -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
+ -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
+ -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
+ -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
+ -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
+ -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
+ -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
+ -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
+ -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
+ -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
+ -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
+ -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
+ -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
+ -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
+ -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
+ -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
+ -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
+ -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
+ -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
+ -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.379372,0.571846,0.727371,0.063137,0.050493,-0.004818,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
+ -0.379372,0.571846,0.727371,0.063137,0.050493,-0.004818,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.403275,0.554082,0.72826,0.063095,0.051693,-0.005781,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.403275,0.554082,0.72826,0.063095,0.051693,-0.005781,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
+ -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
+ -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
+ -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
+ -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
+ -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
+ -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
+ -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
+ -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
+ -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
+ -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
+ -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
+ -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
+ -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
+ -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
+ -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
+ -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
+ -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
+ -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
+ -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
+ -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
+ -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
+ -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
+ -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
+ -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
+ -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
+ -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
+ -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
+ -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
+ -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
+ -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
+ -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
+ -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
+ -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
+ -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
+ -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
+ -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
+ -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
+ -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
+ -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
+ -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
+ -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
+ -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
+ -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
+ -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
+ -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
+ -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
+ -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
+ -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
+ -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
+ -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
+ -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.622674,0.06887,0.779444,0.068298,0.058741,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.622674,0.06887,0.779444,0.068298,0.058741,-0.004818,
+ -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
+ -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
+ -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
+ -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
+ -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
+ -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
+ -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
+ -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
+ -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
+ -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
+ -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
+ -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
+ -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
+ -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
+ -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
+ -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
+ -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
+ -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
+ -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
+ -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
+ -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
+ -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
+ -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
+ -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
+ -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
+ -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
+ -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
+ -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
+ -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
+ -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781,
+ -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
+ -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
+ -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
+ -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
+ -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,648,data,NULL};
+const struct gllist *companion_heart=&frame;
diff --git a/hacks/glx/companion_quad.c b/hacks/glx/companion_quad.c
new file mode 100644
index 0000000..3cfd230
--- /dev/null
+++ b/hacks/glx/companion_quad.c
@@ -0,0 +1,389 @@
+#include "gllist.h"
+static const float data[]={
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.138522,0.464654,-0.87459,0.773415,1.636364,-0.251499,
+ 0.138522,0.464654,-0.87459,0.775033,1.681818,-0.227094,
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.138522,0.464654,-0.87459,0.775033,1.681818,-0.227094,
+ 0.11097,0.464834,-0.878416,0.796039,1.681818,-0.223767,
+ -0.917485,0.21303,-0.335916,0.757576,1.636364,-0.208242,
+ -0.917485,0.21303,-0.335916,0.757576,1.681818,-0.179415,
+ -0.917485,0.21303,-0.335916,0.775033,1.681818,-0.227094,
+ -0.917485,0.21303,-0.335916,0.757576,1.636364,-0.208242,
+ -0.917485,0.21303,-0.335916,0.775033,1.681818,-0.227094,
+ -0.917485,0.21303,-0.335916,0.773415,1.636364,-0.251499,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.636364,-0.121212,
+ -1,0,0,0.757576,1.549333,-0.121212,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.549333,-0.121212,
+ -1,0,0,0.757576,1.578161,-0.075758,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.578161,-0.075758,
+ -1,0,0,0.757576,1.636364,-0.075758,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.636364,-0.075758,
+ -1,0,0,0.757576,1.681818,-0.121212,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.681818,-0.121212,
+ -1,0,0,0.757576,1.681818,-0.179415,
+ -0.917485,-0.335916,0.21303,0.757576,1.578161,-0.075758,
+ -0.917485,-0.335916,0.21303,0.757576,1.549333,-0.121212,
+ -0.917485,-0.335916,0.21303,0.773415,1.506076,-0.121212,
+ -0.917485,-0.335916,0.21303,0.757576,1.578161,-0.075758,
+ -0.917485,-0.335916,0.21303,0.773415,1.506076,-0.121212,
+ -0.917485,-0.335916,0.21303,0.775033,1.530482,-0.075758,
+ 0.138522,-0.87459,0.464654,0.773415,1.506076,-0.121212,
+ 0.11097,-0.878416,0.464834,0.79903,1.510133,-0.121212,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.138522,-0.87459,0.464654,0.773415,1.506076,-0.121212,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.138522,-0.87459,0.464654,0.775033,1.530482,-0.075758,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.11097,-0.878416,0.464834,0.79903,1.510133,-0.121212,
+ 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
+ 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
+ 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
+ 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
+ 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
+ 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
+ 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
+ 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
+ -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
+ -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
+ 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
+ -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
+ 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
+ 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.11097,-0.878416,0.464834,0.961536,1.533809,-0.075758,
+ -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
+ -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.138522,-0.87459,0.464654,0.984161,1.506076,-0.121212,
+ -0.138522,-0.87459,0.464654,0.982542,1.530482,-0.075758,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.138522,-0.87459,0.464654,0.982542,1.530482,-0.075758,
+ -0.11097,-0.878416,0.464834,0.961536,1.533809,-0.075758,
+ 0.917485,-0.335916,0.21303,1,1.549333,-0.121212,
+ 0.917485,-0.335916,0.21303,1,1.578161,-0.075758,
+ 0.917485,-0.335916,0.21303,0.982542,1.530482,-0.075758,
+ 0.917485,-0.335916,0.21303,1,1.549333,-0.121212,
+ 0.917485,-0.335916,0.21303,0.982542,1.530482,-0.075758,
+ 0.917485,-0.335916,0.21303,0.984161,1.506076,-0.121212,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.636364,-0.208242,
+ 1,0,0,1,1.681818,-0.179415,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.681818,-0.179415,
+ 1,0,0,1,1.681818,-0.121212,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.681818,-0.121212,
+ 1,0,0,1,1.636364,-0.075758,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.636364,-0.075758,
+ 1,0,0,1,1.578161,-0.075758,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.578161,-0.075758,
+ 1,0,0,1,1.549333,-0.121212,
+ 0.917485,0.21303,-0.335916,1,1.681818,-0.179415,
+ 0.917485,0.21303,-0.335916,1,1.636364,-0.208242,
+ 0.917485,0.21303,-0.335916,0.984161,1.636364,-0.251499,
+ 0.917485,0.21303,-0.335916,1,1.681818,-0.179415,
+ 0.917485,0.21303,-0.335916,0.984161,1.636364,-0.251499,
+ 0.917485,0.21303,-0.335916,0.982542,1.681818,-0.227094,
+ -0.138522,0.464654,-0.87459,0.984161,1.636364,-0.251499,
+ -0.11097,0.464834,-0.878416,0.958545,1.636364,-0.247442,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.138522,0.464654,-0.87459,0.984161,1.636364,-0.251499,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.138522,0.464654,-0.87459,0.982542,1.681818,-0.227094,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.11097,0.464834,-0.878416,0.958545,1.636364,-0.247442,
+ -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
+ -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
+ -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
+ -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
+ 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
+ -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
+ 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
+ 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
+ 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
+ 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
+ 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
+ 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
+ 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
+ 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.11097,0.464834,-0.878416,0.796039,1.681818,-0.223767,
+ 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
+ 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.878788,1.681818,-0.218561,
+ 0,1,0,0.837333,1.681818,-0.219863,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.837333,1.681818,-0.219863,
+ 0,1,0,0.796039,1.681818,-0.223767,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.796039,1.681818,-0.223767,
+ 0,1,0,0.775033,1.681818,-0.227094,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.775033,1.681818,-0.227094,
+ 0,1,0,0.757576,1.681818,-0.179415,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.757576,1.681818,-0.179415,
+ 0,1,0,0.757576,1.681818,-0.121212,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.757576,1.681818,-0.121212,
+ 0,1,0,1,1.681818,-0.121212,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,1,1.681818,-0.121212,
+ 0,1,0,1,1.681818,-0.179415,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,1,1.681818,-0.179415,
+ 0,1,0,0.982542,1.681818,-0.227094,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.982542,1.681818,-0.227094,
+ 0,1,0,0.961536,1.681818,-0.223767,
+ 0,0.707107,0.707107,0.757576,1.681818,-0.121212,
+ 0,0.707107,0.707107,0.757576,1.636364,-0.075758,
+ 0,0.707107,0.707107,1,1.636364,-0.075758,
+ 0,0.707107,0.707107,0.757576,1.681818,-0.121212,
+ 0,0.707107,0.707107,1,1.636364,-0.075758,
+ 0,0.707107,0.707107,1,1.681818,-0.121212,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,1,1.636364,-0.075758,
+ 0,0,1,0.757576,1.636364,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.757576,1.636364,-0.075758,
+ 0,0,1,0.757576,1.578161,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.757576,1.578161,-0.075758,
+ 0,0,1,0.775033,1.530482,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.775033,1.530482,-0.075758,
+ 0,0,1,0.796039,1.533809,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.796039,1.533809,-0.075758,
+ 0,0,1,0.837333,1.537712,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.837333,1.537712,-0.075758,
+ 0,0,1,0.878788,1.539015,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.878788,1.539015,-0.075758,
+ 0,0,1,0.920242,1.537712,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.920242,1.537712,-0.075758,
+ 0,0,1,0.961536,1.533809,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.961536,1.533809,-0.075758,
+ 0,0,1,0.982542,1.530482,-0.075758,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.125055,0,
+ 0,0,1,0.223833,1.125055,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.223833,1.125055,0,
+ 0,0,1,0.227944,1.136476,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.227944,1.136476,0,
+ 0,0,1,0.245409,1.176833,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.245409,1.176833,0,
+ 0,0,1,0.265373,1.216015,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.265373,1.216015,0,
+ 0,0,1,0.287758,1.253867,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.287758,1.253867,0,
+ 0,0,1,0.312476,1.290236,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.312476,1.290236,0,
+ 0,0,1,0.339427,1.324985,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.339427,1.324985,0,
+ 0,0,1,0.368509,1.35797,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.368509,1.35797,0,
+ 0,0,1,0.399606,1.389067,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.399606,1.389067,0,
+ 0,0,1,0.432591,1.418148,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.432591,1.418148,0,
+ 0,0,1,0.467339,1.4451,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.467339,1.4451,0,
+ 0,0,1,0.503709,1.469818,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.503709,1.469818,0,
+ 0,0,1,0.541561,1.492203,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.541561,1.492203,0,
+ 0,0,1,0.580742,1.512167,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.580742,1.512167,0,
+ 0,0,1,0.6211,1.52963,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.6211,1.52963,0,
+ 0,0,1,0.632521,1.533742,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.632521,1.533742,0,
+ 0,0,1,0.632521,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.632521,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.125055,0,
+ 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
+ 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
+ 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
+ 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
+ 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
+ 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
+ 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
+ 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
+ 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
+ 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
+ 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
+ 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
+ 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
+ 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
+ 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
+ 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
+ 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
+ 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
+ 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
+ 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
+ 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
+ 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
+ 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
+ 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
+ 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
+ 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
+ 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
+ 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
+ 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
+ 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
+ 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
+ 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
+ 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
+ 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
+ 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
+ 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
+ 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
+ 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
+ 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
+ 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
+ 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
+ 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
+ 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
+ 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.325937,-0.823222,0.464834,0.6211,1.52963,0,
+ 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
+ 0.325937,-0.823222,0.464834,0.6211,1.52963,0,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
+ 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
+ 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
+ 0.273603,-0.842063,0.464834,0.67563,1.504045,-0.081077,
+ 0.273603,-0.842063,0.464834,0.67563,1.504045,-0.081077,
+ 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
+ 0.247044,-0.850333,0.464654,0.69697,1.488315,-0.121212,
+ 0.882948,0,0.469472,0.632521,1.636364,0,
+ 0.882948,0,0.469472,0.632521,1.533742,0,
+ 0.882948,0,0.469472,0.67563,1.504045,-0.081077,
+ 0.882948,0,0.469472,0.632521,1.636364,0,
+ 0.882948,0,0.469472,0.67563,1.504045,-0.081077,
+ 0.882948,0,0.469472,0.69697,1.488315,-0.121212,
+ 0.882948,0,0.469472,0.632521,1.636364,0,
+ 0.882948,0,0.469472,0.69697,1.488315,-0.121212,
+ 0.882948,0,0.469472,0.69697,1.636364,-0.121212,
+ 0.799251,0.424969,0.424969,0.69697,1.636364,-0.121212,
+ 0.799251,0.424969,0.424969,0.632521,1.757576,-0.121212,
+ 0.799251,0.424969,0.424969,0.632521,1.636364,0,
+ 0,0.707107,0.707107,0.632521,1.757576,-0.121212,
+ 0,0.707107,0.707107,0.121212,1.757576,-0.121212,
+ 0,0.707107,0.707107,0.121212,1.636364,0,
+ 0,0.707107,0.707107,0.632521,1.757576,-0.121212,
+ 0,0.707107,0.707107,0.121212,1.636364,0,
+ 0,0.707107,0.707107,0.632521,1.636364,0,
+ -0.57735,0.57735,0.57735,0.121212,1.757576,-0.121212,
+ -0.57735,0.57735,0.57735,0,1.636364,-0.121212,
+ -0.57735,0.57735,0.57735,0.121212,1.636364,0,
+ -0.707107,0,0.707107,0,1.636364,-0.121212,
+ -0.707107,0,0.707107,0,1.125055,-0.121212,
+ -0.707107,0,0.707107,0.121212,1.125055,0,
+ -0.707107,0,0.707107,0,1.636364,-0.121212,
+ -0.707107,0,0.707107,0.121212,1.125055,0,
+ -0.707107,0,0.707107,0.121212,1.636364,0,
+ -0.424969,-0.799251,0.424969,0,1.125055,-0.121212,
+ -0.424969,-0.799251,0.424969,0.121212,1.060606,-0.121212,
+ -0.424969,-0.799251,0.424969,0.121212,1.125055,0,
+ 0,-0.882948,0.469472,0.223833,1.125055,0,
+ 0,-0.882948,0.469472,0.121212,1.125055,0,
+ 0,-0.882948,0.469472,0.121212,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.223833,1.125055,0,
+ 0,-0.882948,0.469472,0.121212,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.269262,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.223833,1.125055,0,
+ 0,-0.882948,0.469472,0.269262,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.25353,1.081945,-0.081077,
+ 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
+ 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
+ 0.850333,-0.247044,0.464654,0.269262,1.060606,-0.121212,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.833143,-0.29995,0.464654,0.223833,1.125055,0,
+ 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
+ 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
+ 0.823222,-0.325937,0.464834,0.287112,1.113048,-0.121212,
+ 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
+ 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.823222,-0.325937,0.464834,0.287112,1.113048,-0.121212,
+ 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
+ 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
+ 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
+ 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
+ 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
+ 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
+ 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
+ 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
+ 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
+ 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
+ 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
+ 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
+ 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212,
+ 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
+ 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
+ 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212,
+ 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
+ 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
+ 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
+ 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
+ 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
+ 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
+ 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
+ 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,384,data,NULL};
+const struct gllist *companion_quad=&frame;
diff --git a/hacks/glx/companioncube.man b/hacks/glx/companioncube.man
new file mode 100644
index 0000000..e15b15e
--- /dev/null
+++ b/hacks/glx/companioncube.man
@@ -0,0 +1,85 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+companioncube - a vital aparatus.
+.SH SYNOPSIS
+.B companioncube
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-spin]
+[\-wander]
+[\-count \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The symptoms most commonly produced by Enrichment Center testing are
+superstition, perceiving inanimate objects as alive, and hallucinations.
+The Enrichment Center reminds you that the weighted companion cube will
+never threaten to stab you and, in fact, cannot speak. In the event that
+the Weighted Companion Cube does speak, the Enrichment Center urges you to
+disregard its advice.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the animation should run.
+Less than 1 for slower, greater than 1 for faster.
+.TP 8
+.B \-count \fInumber\fP
+How many cubes. Default 3.
+.TP 8
+.B \-spin
+.B \-no\-spin
+Instead of bouncing, float and spin.
+.TP 8
+.B \-wander
+.B \-no\-wander
+Instead of bouncing, float and drift.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR tronbit (1),
+.BR lament (1),
+.BR dangerball (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2011 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski, with apologies to the fine folks at Valve Software
+and Aperture Science.
diff --git a/hacks/glx/cow_face.c b/hacks/glx/cow_face.c
new file mode 100644
index 0000000..e57d2bb
--- /dev/null
+++ b/hacks/glx/cow_face.c
@@ -0,0 +1,341 @@
+#include "gllist.h"
+static const float data[]={
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,336,data,NULL};
+const struct gllist *cow_face=&frame;
diff --git a/hacks/glx/cow_hide.c b/hacks/glx/cow_hide.c
new file mode 100644
index 0000000..3728eef
--- /dev/null
+++ b/hacks/glx/cow_hide.c
@@ -0,0 +1,13055 @@
+#include "gllist.h"
+static const float data[]={
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
+ -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,13050,data,NULL};
+const struct gllist *cow_hide=&frame;
diff --git a/hacks/glx/cow_hoofs.c b/hacks/glx/cow_hoofs.c
new file mode 100644
index 0000000..b66ef88
--- /dev/null
+++ b/hacks/glx/cow_hoofs.c
@@ -0,0 +1,1037 @@
+#include "gllist.h"
+static const float data[]={
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1032,data,NULL};
+const struct gllist *cow_hoofs=&frame;
diff --git a/hacks/glx/cow_horns.c b/hacks/glx/cow_horns.c
new file mode 100644
index 0000000..2d5dbe9
--- /dev/null
+++ b/hacks/glx/cow_horns.c
@@ -0,0 +1,1025 @@
+#include "gllist.h"
+static const float data[]={
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1020,data,NULL};
+const struct gllist *cow_horns=&frame;
diff --git a/hacks/glx/cow_tail.c b/hacks/glx/cow_tail.c
new file mode 100644
index 0000000..895f05c
--- /dev/null
+++ b/hacks/glx/cow_tail.c
@@ -0,0 +1,464 @@
+#include "gllist.h"
+static const float data[]={
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664,
+ -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,459,data,NULL};
+const struct gllist *cow_tail=&frame;
diff --git a/hacks/glx/cow_udder.c b/hacks/glx/cow_udder.c
new file mode 100644
index 0000000..46df87c
--- /dev/null
+++ b/hacks/glx/cow_udder.c
@@ -0,0 +1,1520 @@
+#include "gllist.h"
+static const float data[]={
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1515,data,NULL};
+const struct gllist *cow_udder=&frame;
diff --git a/hacks/glx/crackberg.c b/hacks/glx/crackberg.c
new file mode 100644
index 0000000..74c6915
--- /dev/null
+++ b/hacks/glx/crackberg.c
@@ -0,0 +1,1468 @@
+/***************************
+ ** crackberg; Matus Telgarsky [ catachresis@cmu.edu ] 2005
+ ** */
+#ifndef HAVE_JWXYZ
+# define XK_MISCELLANY
+# include <X11/keysymdef.h>
+#endif
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_crackberg 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#ifdef USE_GL /* whole file */
+
+#define DEF_NSUBDIVS "4"
+#define DEF_BORING "False"
+#define DEF_CRACK "True"
+#define DEF_WATER "True"
+#define DEF_FLAT "True"
+#define DEF_COLOR "random"
+#define DEF_LIT "True"
+#define DEF_VISIBILITY "0.6"
+#define DEF_LETTERBOX "False"
+
+
+/***************************
+ ** macros
+ ** */
+
+#define M_RAD7_4 0.661437827766148
+#define M_SQRT3_2 0.866025403784439
+#define M_PI_180 0.0174532925199433
+#define M_180_PI 57.2957795130823
+#define MSPEED_SCALE 1.1
+#define AVE3(a,b,c) ( ((a) + (b) + (c)) / 3.0 )
+#define MAX_ZDELTA 0.35
+#define DISPLACE(h,d) (h+(random()/(double)RAND_MAX-0.5)*2*MAX_ZDELTA/(1<<d))
+#define MEAN(x,y) ( ((x) + (y)) / 2.0 )
+#define TCOORD(x,y) (cberg->heights[(cberg->epoints * (y) - ((y)-1)*(y)/2 + (x))])
+#define sNCOORD(x,y,p) (cberg->norms[3 * (cberg->epoints * (y) - ((y)-1)*(y)/2 + (x)) + (p)])
+#define SET_sNCOORD(x,y, down, a,b,c,d,e,f) \
+ sNCOORD(x,y,0) = AVE3(a-d, 0.5 * (b-e), -0.5 * (c-f)); \
+ sNCOORD(x,y,1) = ((down) ? -1 : +1) * AVE3(0.0, M_SQRT3_2 * (b-e), M_SQRT3_2 * (c-f)); \
+ sNCOORD(x,y,2) = (2*dx)
+#define fNCOORD(x,y,w,p) \
+ (cberg->norms[3 * (2*(y)*cberg->epoints-((y)+1)*((y)+1) + 1 + 2 * ((x)-1) + (w)) + (p)])
+#define SET_fNCOORDa(x,y, down, dz00,dz01) \
+ fNCOORD(x,y,0,0) = (down) * (dy) * (dz01); \
+ fNCOORD(x,y,0,1) = (down) * ((dz01) * (dx) / 2 - (dx) * (dz00)); \
+ fNCOORD(x,y,0,2) = (down) * (dx) * (dy)
+#define SET_fNCOORDb(x,y, down, dz10,dz11) \
+ fNCOORD(x,y,1,0) = (down) * (dy) * (dz10); \
+ fNCOORD(x,y,1,1) = (down) * ((dz11) * (dx) - (dx) * (dz10) / 2); \
+ fNCOORD(x,y,1,2) = (down) * (dx) * (dy)
+
+
+/***************************
+ ** types
+ ** */
+
+
+typedef struct _cberg_state cberg_state;
+typedef struct _Trile Trile;
+
+typedef struct {
+ void (*init)(Trile *);
+ void (*free)(Trile *);
+ void (*draw)(Trile *);
+ void (*init_iter)(Trile *, cberg_state *);
+ void (*dying_iter)(Trile *, cberg_state *);
+} Morph;
+
+typedef struct {
+ char *id;
+ void (*land)(cberg_state *, double);
+ void (*water)(cberg_state *, double);
+ double bg[4];
+} Color;
+
+enum { TRILE_NEW, TRILE_INIT, TRILE_STABLE, TRILE_DYING, TRILE_DELETE };
+
+struct _Trile {
+ int x,y; /*center coords; points up if (x+y)%2 == 0, else down*/
+ short state;
+ short visible;
+ double *l,*r,*v; /*only edges need saving*/
+ GLuint call_list;
+
+ void *morph_data;
+ const Morph *morph;
+
+ struct _Trile *left, *right, *parent; /* for bst, NOT spatial */
+ struct _Trile *next_free; /* for memory allocation */
+};
+
+enum { MOTION_AUTO = 0, MOTION_MANUAL = 1, MOTION_LROT= 2, MOTION_RROT = 4,
+ MOTION_FORW = 8, MOTION_BACK = 16, MOTION_DEC = 32, MOTION_INC = 64,
+ MOTION_LEFT = 128, MOTION_RIGHT = 256 };
+
+struct _cberg_state {
+ GLXContext *glx_context;
+ Trile *trile_head;
+
+ double x,y,z, yaw,roll,pitch, dx,dy,dz, dyaw,droll,dpitch, elapsed;
+ double prev_frame;
+ int motion_state;
+ double mspeed;
+
+ double fovy, aspect, zNear, zFar;
+
+ const Color *color;
+
+ int count;
+
+ unsigned int epoints, /*number of points to one edge*/
+ tpoints, /*number points total*/
+ ntris, /*number triangles per trile*/
+ tnorms; /*number of normals*/
+
+ double *heights, *norms;
+ Trile *free_head; /* for trile_[alloc|free] */
+
+ double draw_elapsed;
+
+ double dx0;
+
+ double vs0r,vs0g,vs0b, vs1r, vs1g, vs1b,
+ vf0r,vf0g,vf0b, vf1r, vf1g, vf1b;
+
+ Bool button_down_p;
+ int mouse_x, mouse_y;
+ struct timeval paused;
+};
+
+
+
+/***************************
+ ** globals
+ ** */
+
+static unsigned int nsubdivs;
+static Bool crack, boring, do_water, flat, lit, letterbox;
+static float visibility;
+static char *color;
+
+static cberg_state *cbergs = NULL;
+
+static XrmOptionDescRec opts[] = {
+ {"-nsubdivs", ".nsubdivs", XrmoptionSepArg, 0},
+ {"-boring", ".boring", XrmoptionNoArg, "True"},
+ {"-crack", ".crack", XrmoptionNoArg, "True"},
+ {"-no-crack", ".crack", XrmoptionNoArg, "False"},
+ {"-water", ".water", XrmoptionNoArg, "True"},
+ {"-no-water", ".water", XrmoptionNoArg, "False"},
+ {"-flat", ".flat", XrmoptionNoArg, "True"},
+ {"-no-flat", ".flat", XrmoptionNoArg, "False"},
+ {"-color", ".color", XrmoptionSepArg, 0},
+ {"-lit", ".lit", XrmoptionNoArg, "True"},
+ {"-no-lit", ".lit", XrmoptionNoArg, "False"},
+ {"-visibility", ".visibility", XrmoptionSepArg, 0},
+ {"-letterbox", ".letterbox", XrmoptionNoArg, "True"}
+};
+
+static argtype vars[] = {
+ {&nsubdivs, "nsubdivs", "nsubdivs", DEF_NSUBDIVS, t_Int},
+ {&boring, "boring", "boring", DEF_BORING, t_Bool},
+ {&crack, "crack", "crack", DEF_CRACK, t_Bool},
+ {&do_water, "water", "water", DEF_WATER, t_Bool},
+ {&flat, "flat", "flat", DEF_FLAT, t_Bool},
+ {&color, "color", "color", DEF_COLOR, t_String},
+ {&lit, "lit", "lit", DEF_LIT, t_Bool},
+ {&visibility, "visibility", "visibility", DEF_VISIBILITY, t_Float},
+ {&letterbox, "letterbox", "letterbox", DEF_LETTERBOX, t_Bool}
+};
+
+ENTRYPOINT ModeSpecOpt crackberg_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/***************************
+ ** Trile functions.
+ ** first come all are regular trile functions
+ ** */
+
+
+/* forward decls for trile_new */
+static Trile *triles_find(Trile *tr, int x, int y);
+static Trile *trile_alloc(cberg_state *cberg);
+static const Morph *select_morph(void);
+static const Color *select_color(cberg_state *);
+
+static void trile_calc_sides(cberg_state *cberg,
+ Trile *new, int x, int y, Trile *root)
+{
+ unsigned int i,j,k;
+ int dv = ( (x + y) % 2 ? +1 : -1); /* we are pointing down or up*/
+ Trile *l, *r, *v; /* v_ertical */
+
+
+ if (root) {
+ l = triles_find(root, x-1, y);
+ r = triles_find(root, x+1, y);
+ v = triles_find(root, x,y+dv);
+ } else
+ l = r = v = NULL;
+
+ if (v) {
+ for (i = 0; i != cberg->epoints; ++i)
+ new->v[i] = v->v[i];
+ } else {
+ if (l) new->v[0] = l->l[0];
+ else if (!root) new->v[0] = DISPLACE(0,0);
+ else {
+ Trile *tr; /* all of these tests needed.. */
+ if ( (tr = triles_find(root, x-1, y + dv)) )
+ new->v[0] = tr->l[0];
+ else if ( (tr = triles_find(root, x-2, y)) )
+ new->v[0] = tr->r[0];
+ else if ( (tr = triles_find(root, x-2, y + dv)) )
+ new->v[0] = tr->r[0];
+ else
+ new->v[0] = DISPLACE(0,0);
+ }
+
+ if (r) new->v[cberg->epoints-1] = r->l[0];
+ else if (!root) new->v[cberg->epoints-1] = DISPLACE(0,0);
+ else {
+ Trile *tr;
+ if ( (tr = triles_find(root, x+1, y + dv)) )
+ new->v[cberg->epoints-1] = tr->l[0];
+ else if ( (tr = triles_find(root, x+2, y)) )
+ new->v[cberg->epoints-1] = tr->v[0];
+ else if ( (tr = triles_find(root, x+2, y + dv)) )
+ new->v[cberg->epoints-1] = tr->v[0];
+ else
+ new->v[cberg->epoints-1] = DISPLACE(0,0);
+ }
+
+ for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
+ for (j = i; j < cberg->epoints; j += i * 2)
+ new->v[j] = DISPLACE(MEAN(new->v[j-i], new->v[j+i]), k);
+ }
+
+ if (l) {
+ for (i = 0; i != cberg->epoints; ++i)
+ new->l[i] = l->r[i];
+ } else {
+ if (r) new->l[0] = r->v[0];
+ else if (!root) new->l[0] = DISPLACE(0,0);
+ else {
+ Trile *tr;
+ if ( (tr = triles_find(root, x-1, y-dv)) )
+ new->l[0] = tr->r[0];
+ else if ( (tr = triles_find(root, x+1, y-dv)) )
+ new->l[0] = tr->v[0];
+ else if ( (tr = triles_find(root, x, y-dv)) )
+ new->l[0] = tr->l[0];
+ else
+ new->l[0] = DISPLACE(0,0);
+ }
+
+ new->l[cberg->epoints - 1] = new->v[0];
+
+ for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
+ for (j = i; j < cberg->epoints; j += i * 2)
+ new->l[j] = DISPLACE(MEAN(new->l[j-i], new->l[j+i]), k);
+ }
+
+ if (r) {
+ for (i = 0; i != cberg->epoints; ++i)
+ new->r[i] = r->l[i];
+ } else {
+ new->r[0] = new->v[cberg->epoints - 1];
+ new->r[cberg->epoints - 1] = new->l[0];
+
+ for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
+ for (j = i; j < cberg->epoints; j += i * 2)
+ new->r[j] = DISPLACE(MEAN(new->r[j-i], new->r[j+i]), k);
+ }
+}
+
+static void trile_calc_heights(cberg_state *cberg, Trile *new)
+{
+ unsigned int i, j, k, h;
+
+ for (i = 0; i < cberg->epoints - 1; ++i) { /* copy in sides */
+ TCOORD(i,0) = new->v[i];
+ TCOORD(cberg->epoints - 1 - i, i) = new->r[i];
+ TCOORD(0, cberg->epoints - 1 - i) = new->l[i];
+ }
+
+ for (i = ((1 << nsubdivs) >> 2), k =1; i; i >>= 1, ++k)
+ for (j = 1; j < (1 << k); ++j)
+ for (h = 1; h <= (1<<k) - j; ++h) {
+ TCOORD( i*(2*h - 1), i*(2*j - 1) ) = /*rights*/
+ DISPLACE(MEAN(TCOORD( i*(2*h - 2), i*(2*j + 0) ),
+ TCOORD( i*(2*h + 0), i*(2*j - 2) )), k);
+
+ TCOORD( i*(2*h + 0), i*(2*j - 1) ) = /*lefts*/
+ DISPLACE(MEAN(TCOORD( i*(2*h + 0), i*(2*j - 2) ),
+ TCOORD( i*(2*h + 0), i*(2*j + 0) )), k);
+
+ TCOORD( i*(2*h - 1), i*(2*j + 0) ) = /*verts*/
+ DISPLACE(MEAN(TCOORD( i*(2*h - 2), i*(2*j + 0) ),
+ TCOORD( i*(2*h + 0), i*(2*j + 0) )), k);
+ }
+}
+
+static void trile_calc_flat_norms(cberg_state *cberg, Trile *new)
+{
+ unsigned int x, y;
+ int down = (((new->x + new->y) % 2) ? -1 : +1);
+ double dz00,dz01,dz10,dz11, a,b,c,d;
+ double dy = down * M_SQRT3_2 / (1 << nsubdivs);
+ double dx = cberg->dx0;
+
+ for (y = 0; y < cberg->epoints - 1; ++y) {
+ a = TCOORD(0,y);
+ b = TCOORD(0,y+1);
+ for (x = 1; x < cberg->epoints - 1 - y; ++x) {
+ c = TCOORD(x,y);
+ d = TCOORD(x,y+1);
+
+ dz00 = b-c;
+ dz01 = a-c;
+ dz10 = b-d;
+ dz11 = c-d;
+
+ SET_fNCOORDa(x,y, down, dz00,dz01);
+ SET_fNCOORDb(x,y, down, dz10,dz11);
+
+ a = c;
+ b = d;
+ }
+
+ c = TCOORD(x,y);
+ dz00 = b-c;
+ dz01 = a-c;
+ SET_fNCOORDa(x,y, down, dz00, dz01);
+ }
+}
+
+static void trile_calc_smooth_norms(cberg_state *cberg, Trile *new)
+{
+ unsigned int i,j, down = (new->x + new->y) % 2;
+ double prev, cur, next;
+ double dx = cberg->dx0;
+
+ /** corners -- assume level (bah) **/
+ cur = TCOORD(0,0);
+ SET_sNCOORD(0,0, down,
+ cur,cur,TCOORD(0,1),TCOORD(1,0),cur,cur);
+ cur = TCOORD(cberg->epoints-1,0);
+ SET_sNCOORD(cberg->epoints-1,0, down,
+ TCOORD(cberg->epoints-2,0),TCOORD(cberg->epoints-2,1),cur,cur,cur,cur);
+ cur = TCOORD(0,cberg->epoints-1);
+ SET_sNCOORD(0,cberg->epoints-1, down,
+ cur,cur,cur,cur,TCOORD(1,cberg->epoints-2),TCOORD(0,cberg->epoints-2));
+
+
+ /** sides **/
+ /* vert */
+ prev = TCOORD(0,0);
+ cur = TCOORD(1,0);
+ for (i = 1; i < cberg->epoints - 1; ++i) {
+ next = TCOORD(i+1,0);
+ SET_sNCOORD(i,0, down, prev,TCOORD(i-1,1),TCOORD(i,1), next,cur,cur);
+ prev = cur;
+ cur = next;
+ }
+
+ /* right */
+ prev = TCOORD(cberg->epoints-1,0);
+ cur = TCOORD(cberg->epoints-2,0);
+ for (i = 1; i < cberg->epoints - 1; ++i) {
+ next = TCOORD(cberg->epoints-i-2,i+1);
+ SET_sNCOORD(cberg->epoints-i-1,i, down, TCOORD(cberg->epoints-i-2,i),next,cur,
+ cur,prev,TCOORD(cberg->epoints-i-1,i-1));
+ prev = cur;
+ cur = next;
+ }
+
+ /* left */
+ prev = TCOORD(0,0);
+ cur = TCOORD(0,1);
+ for (i = 1; i < cberg->epoints - 1; ++i) {
+ next = TCOORD(0,i+1);
+ SET_sNCOORD(0,i, down, cur,cur,next,TCOORD(1,i),TCOORD(1,i-1),prev);
+ prev = cur;
+ cur = next;
+ }
+
+
+ /** fill in **/
+ for (i = 1; i < cberg->epoints - 2; ++i) {
+ prev = TCOORD(0,i);
+ cur = TCOORD(1,i);
+ for (j = 1; j < cberg->epoints - i - 1; ++j) {
+ next = TCOORD(j+1,i);
+ SET_sNCOORD(j,i, down, prev,TCOORD(j-1,i+1),TCOORD(j,i+1),
+ next,TCOORD(j+1,i-1),TCOORD(j,i-1));
+ prev = cur;
+ cur = next;
+ }
+ }
+}
+
+static inline void trile_light(cberg_state *cberg,
+ unsigned int x, unsigned int y,
+ unsigned int which)
+{
+ if (flat) {
+ if (x) {
+ glNormal3d(fNCOORD(x,y,which,0),
+ fNCOORD(x,y,which,1),
+ fNCOORD(x,y,which,2));
+ } else { /* I get mesa errors and bizarre glitches without this!! */
+ glNormal3d(fNCOORD(1,y,0,0),
+ fNCOORD(1,y,0,1),
+ fNCOORD(1,y,0,2));
+ }
+ } else {
+ glNormal3d(sNCOORD(x,y+which,0),
+ sNCOORD(x,y+which,1),
+ sNCOORD(x,y+which,2));
+ }
+}
+
+static inline void trile_draw_vertex(cberg_state *cberg, unsigned int ix,
+ unsigned int iy, unsigned int which, double x,double y,
+ double zcur, double z1, double z2)
+{
+ glColor3d(0.0, 0.0, 0.0); /* don't ask. my card breaks otherwise. */
+
+ if (do_water && zcur <= 0.0) {
+ cberg->color->water(cberg, zcur); /* XXX use average-of-3 for color when flat?*/
+ if (lit) glNormal3d(0.0,0.0,1.0);
+ glVertex3d(x, y, 0.0);
+ } else {
+ cberg->color->land(cberg, zcur);
+ if (lit) trile_light(cberg,ix,iy,which);
+ glVertex3d(x, y, zcur);
+ }
+}
+
+static void trile_render(cberg_state *cberg, Trile *new)
+{
+ double cornerx = 0.5 * new->x - 0.5, cornery;
+ double dy = M_SQRT3_2 / (1 << nsubdivs);
+ double z0,z1,z2;
+ int x,y;
+
+ new->call_list = glGenLists(1);
+ glNewList(new->call_list, GL_COMPILE);
+
+ if ((new->x + new->y) % 2) { /*point down*/
+ cornery = (new->y + 0.5)*M_SQRT3_2;
+ glFrontFace(GL_CW);
+ dy = -dy;
+ } else
+ cornery = (new->y - 0.5) * M_SQRT3_2;
+
+ for (y = 0; y < cberg->epoints - 1; ++y) {
+ double dx = cberg->dx0;
+ glBegin(GL_TRIANGLE_STRIP);
+ /* first three points all part of the same triangle.. */
+ z0 = TCOORD(0,y);
+ z1 = TCOORD(0,y+1);
+ z2 = TCOORD(1,y);
+ trile_draw_vertex(cberg, 0,y,0,
+ cornerx,cornery, z0, z1, z2);
+ trile_draw_vertex(cberg, 0,y,1,
+ cornerx+0.5*dx,cornery+dy, z1, z0, z2);
+
+ for (x = 1; x < cberg->epoints - 1 - y; ++x) {
+ trile_draw_vertex(cberg, x,y,0,
+ cornerx+x*dx,cornery, z2, z1, z0);
+
+ z0 = TCOORD(x, y+1);
+
+ trile_draw_vertex(cberg, x,y,1,
+ cornerx+(x+0.5)*dx,cornery+dy, z0, z2, z1);
+
+ z1 = z0;
+ z0 = z2;
+ z2 = TCOORD(x+1,y);
+ }
+ trile_draw_vertex(cberg, x,y,0,
+ cornerx + x*dx, cornery, z2, z1, z0);
+ glEnd();
+
+ cornerx += dx/2;
+ cornery += dy;
+ }
+
+ if ((new->x + new->y) % 2) /*point down*/
+ glFrontFace(GL_CCW);
+ glEndList();
+}
+
+static Trile *trile_new(cberg_state *cberg, int x,int y,Trile *parent,Trile *root)
+{
+ Trile *new;
+
+ new = trile_alloc(cberg);
+
+ new->x = x;
+ new->y = y;
+ new->state = TRILE_NEW;
+ new->parent = parent;
+ new->left = new->right = NULL;
+ new->visible = 1;
+
+ new->morph = select_morph();
+ new->morph->init(new);
+
+ trile_calc_sides(cberg, new, x, y, root);
+ trile_calc_heights(cberg, new);
+
+ if (lit) {
+ if (flat) trile_calc_flat_norms(cberg, new);
+ else trile_calc_smooth_norms(cberg, new);
+ }
+
+ trile_render(cberg, new);
+ return new;
+}
+
+static Trile *trile_alloc(cberg_state *cberg)
+{
+ Trile *new;
+
+ if (cberg->free_head) {
+ new = cberg->free_head;
+ cberg->free_head = cberg->free_head->next_free;
+ } else {
+ ++cberg->count;
+ if (!(new = malloc(sizeof(Trile)))
+ || !(new->l = (double *) malloc(sizeof(double) * cberg->epoints * 3))) {
+ perror(progname);
+ exit(1);
+ }
+ new->r = new->l + cberg->epoints;
+ new->v = new->r + cberg->epoints;
+#ifdef DEBUG
+ printf("needed to alloc; [%d]\n", cberg->count);
+#endif
+ }
+ return new;
+}
+
+static void trile_free(cberg_state *cberg, Trile *tr)
+{
+ glDeleteLists(tr->call_list, 1);
+ tr->morph->free(tr);
+ tr->next_free = cberg->free_head;
+ cberg->free_head = tr;
+}
+
+
+static void trile_draw_vanilla(Trile *tr)
+{ glCallList(tr->call_list); }
+
+static void trile_draw(Trile *tr, void *ignore)
+{
+ if (tr->state == TRILE_STABLE)
+ trile_draw_vanilla(tr);
+ else
+ tr->morph->draw(tr);
+}
+
+
+/***************************
+ ** Trile morph functions.
+ ** select function at bottom (forward decls sucls)
+ ** */
+
+
+/*** first the basic growing morph */
+
+static void grow_init(Trile *tr)
+{
+ tr->morph_data = (void *) malloc(sizeof(double));
+ *((double *)tr->morph_data) = 0.02; /* not 0; avoid normals crapping */
+}
+
+static void grow_free(Trile *tr)
+{
+ free(tr->morph_data);
+}
+
+static void grow_draw(Trile *tr)
+{
+ glPushMatrix();
+ glScaled(1.0,1.0, *((double *)tr->morph_data));
+ trile_draw_vanilla(tr);
+ glPopMatrix();
+}
+
+static void grow_init_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
+ if (*((double *)tr->morph_data) >= 1.0)
+ tr->state = TRILE_STABLE;
+}
+
+static void grow_dying_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
+ if (*((double *)tr->morph_data) <= 0.02) /* XXX avoid fast del/cons? */
+ tr->state = TRILE_DELETE;
+}
+
+/**** falling morph ****/
+
+static void fall_init(Trile *tr)
+{
+ tr->morph_data = (void *) malloc(sizeof(double));
+ *((double *)tr->morph_data) = 0.0;
+}
+
+static void fall_free(Trile *tr)
+{
+ free(tr->morph_data);
+}
+
+static void fall_draw(Trile *tr)
+{
+ glPushMatrix();
+ glTranslated(0.0,0.0,(0.5 - *((double *)tr->morph_data)) * 8);
+ trile_draw_vanilla(tr);
+ glPopMatrix();
+}
+
+static void fall_init_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
+ if (*((double *)tr->morph_data) >= 0.5)
+ tr->state = TRILE_STABLE;
+}
+
+static void fall_dying_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
+ if (*((double *)tr->morph_data) <= 0.0) /* XXX avoid fast del/cons? */
+ tr->state = TRILE_DELETE;
+}
+
+/**** yeast morph ****/
+
+static void yeast_init(Trile *tr)
+{
+ tr->morph_data = (void *) malloc(sizeof(double));
+ *((double *)tr->morph_data) = 0.02;
+}
+
+static void yeast_free(Trile *tr)
+{
+ free(tr->morph_data);
+}
+
+static void yeast_draw(Trile *tr)
+{
+ double x = tr->x * 0.5,
+ y = tr->y * M_SQRT3_2,
+ z = *((double *)tr->morph_data);
+
+ glPushMatrix();
+ glTranslated(x, y, 0);
+ glRotated(z*360, 0,0,1);
+ glScaled(z,z,z);
+ glTranslated(-x, -y, 0);
+ trile_draw_vanilla(tr);
+ glPopMatrix();
+}
+
+static void yeast_init_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
+ if (*((double *)tr->morph_data) >= 1.0)
+ tr->state = TRILE_STABLE;
+}
+
+static void yeast_dying_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
+ if (*((double *)tr->morph_data) <= 0.02) /* XXX avoid fast del/cons? */
+ tr->state = TRILE_DELETE;
+}
+
+/**** identity morph ****/
+
+static void identity_init(Trile *tr)
+{ tr->state = TRILE_STABLE; }
+
+static void identity_free(Trile *tr)
+{}
+
+static void identity_draw(Trile *tr)
+{ trile_draw_vanilla(tr); }
+
+static void identity_init_iter(Trile *tr, cberg_state *cberg)
+{}
+
+static void identity_dying_iter(Trile *tr, cberg_state *cberg)
+{ tr->state = TRILE_DELETE; }
+
+/** now to handle selection **/
+
+static const Morph morphs[] = {
+ {grow_init, grow_free, grow_draw, grow_init_iter, grow_dying_iter},
+ {fall_init, fall_free, fall_draw, fall_init_iter, fall_dying_iter},
+ {yeast_init, yeast_free, yeast_draw, yeast_init_iter, yeast_dying_iter},
+ {identity_init, /*always put identity last to skip it..*/
+ identity_free, identity_draw, identity_init_iter, identity_dying_iter}
+};
+
+static const Morph *select_morph()
+{
+ int nmorphs = countof(morphs);
+ if (crack)
+ return &morphs[random() % (nmorphs-1)];
+ else if (boring)
+ return &morphs[nmorphs-1];
+ else
+ return morphs;
+}
+
+
+/***************************
+ ** Trile superstructure functions.
+ ** */
+
+
+static void triles_set_visible(cberg_state *cberg, Trile **root, int x, int y)
+{
+ Trile *parent = NULL,
+ *iter = *root;
+ int goleft=0;
+
+ while (iter != NULL) {
+ parent = iter;
+ goleft = (iter->x > x || (iter->x == x && iter->y > y));
+ if (goleft)
+ iter = iter->left;
+ else if (iter->x == x && iter->y == y) {
+ iter->visible = 1;
+ return;
+ } else
+ iter = iter->right;
+ }
+
+ if (parent == NULL)
+ *root = trile_new(cberg, x,y, NULL, NULL);
+ else if (goleft)
+ parent->left = trile_new(cberg, x,y, parent, *root);
+ else
+ parent->right = trile_new(cberg, x,y, parent, *root);
+}
+
+static unsigned int triles_foreach(Trile *root, void (*f)(Trile *, void *),
+ void *data)
+{
+ if (root == NULL)
+ return 0;
+
+ f(root, data);
+ return 1 + triles_foreach(root->left, f, data)
+ + triles_foreach(root->right, f, data);
+}
+
+static void triles_update_state(Trile **root, cberg_state *cberg)
+{
+ int process_current = 1;
+ if (*root == NULL)
+ return;
+
+ while (process_current) {
+ if ( (*root)->visible ) {
+ if ( (*root)->state == TRILE_INIT )
+ (*root)->morph->init_iter(*root, cberg);
+ else if ( (*root)->state == TRILE_DYING ) {
+ (*root)->state = TRILE_INIT;
+ (*root)->morph->init_iter(*root, cberg);
+ } else if ( (*root)->state == TRILE_NEW )
+ (*root)->state = TRILE_INIT;
+
+ (*root)->visible = 0;
+ } else {
+ if ( (*root)->state == TRILE_STABLE )
+ (*root)->state = TRILE_DYING;
+ else if ( (*root)->state == TRILE_INIT ) {
+ (*root)->state = TRILE_DYING;
+ (*root)->morph->dying_iter(*root, cberg);
+ } else if ( (*root)->state == TRILE_DYING )
+ (*root)->morph->dying_iter(*root, cberg);
+ }
+
+ if ( (*root)->state == TRILE_DELETE ) {
+ Trile *splice_me;
+ process_current = 1;
+
+ if ((*root)->left == NULL) {
+ splice_me = (*root)->right;
+ if (splice_me)
+ splice_me->parent = (*root)->parent;
+ else
+ process_current = 0;
+ } else if ((*root)->right == NULL) {
+ splice_me = (*root)->left;
+ splice_me->parent = (*root)->parent;
+ } else {
+ Trile *tmp;
+ for (splice_me = (*root)->right; splice_me->left != NULL; )
+ splice_me = splice_me->left;
+ tmp = splice_me->right;
+
+ if (tmp) tmp->parent = splice_me->parent;
+
+ if (splice_me == splice_me->parent->left)
+ splice_me->parent->left = tmp;
+ else
+ splice_me->parent->right = tmp;
+
+ splice_me->parent = (*root)->parent;
+ splice_me->left = (*root)->left;
+ (*root)->left->parent = splice_me;
+ splice_me->right = (*root)->right;
+ if ((*root)->right)
+ (*root)->right->parent = splice_me;
+ }
+ trile_free(cberg, *root);
+ *root = splice_me;
+ } else
+ process_current = 0;
+ }
+
+ if (*root) {
+ triles_update_state(&((*root)->left), cberg);
+ triles_update_state(&((*root)->right), cberg);
+ }
+}
+
+static Trile *triles_find(Trile *tr, int x, int y)
+{
+ while (tr && !(tr->x == x && tr->y == y))
+ if (x < tr->x || (x == tr->x && y < tr->y))
+ tr = tr->left;
+ else
+ tr = tr->right;
+ return tr;
+}
+
+
+/***************************
+ ** Trile superstructure visibility functions.
+ ** strategy fine, implementation lazy&retarded =/
+ ** */
+
+#ifdef DEBUG
+static double x_shit, y_shit;
+#endif
+
+static void calc_points(cberg_state *cberg, double *x1,double *y1,
+ double *x2,double *y2, double *x3,double *y3, double *x4,double *y4)
+{
+ double zNear, x_nearcenter, y_nearcenter, nhalfwidth, x_center, y_center;
+
+
+ /* could cache these.. bahhhhhhhhhhhhhh */
+ double halfheight = tan(cberg->fovy / 2 * M_PI_180) * cberg->zNear;
+ double fovx_2 = atan(halfheight * cberg->aspect / cberg->zNear) * M_180_PI;
+ double zFar = cberg->zFar + M_RAD7_4;
+ double fhalfwidth = zFar * tan(fovx_2 * M_PI_180)
+ + M_RAD7_4 / cos(fovx_2 * M_PI_180);
+ double x_farcenter = cberg->x + zFar * cos(cberg->yaw * M_PI_180);
+ double y_farcenter = cberg->y + zFar * sin(cberg->yaw * M_PI_180);
+ *x1 = x_farcenter + fhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y1 = y_farcenter + fhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+ *x2 = x_farcenter - fhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y2 = y_farcenter - fhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+
+#ifdef DEBUG
+ printf("pos (%.3f,%.3f) @ %.3f || fovx: %f || fovy: %f\n",
+ cberg->x, cberg->y, cberg->yaw, fovx_2 * 2, cberg->fovy);
+ printf("\tfarcenter: (%.3f,%.3f) || fhalfwidth: %.3f \n"
+ "\tp1: (%.3f,%.3f) || p2: (%.3f,%.3f)\n",
+ x_farcenter, y_farcenter, fhalfwidth, *x1, *y1, *x2, *y2);
+#endif
+
+ if (cberg->z - halfheight <= 0) /* near view plane hits xy */
+ zNear = cberg->zNear - M_RAD7_4;
+ else /* use bottom of frustum */
+ zNear = cberg->z / tan(cberg->fovy / 2 * M_PI_180) - M_RAD7_4;
+ nhalfwidth = zNear * tan(fovx_2 * M_PI_180)
+ + M_RAD7_4 / cos(fovx_2 * M_PI_180);
+ x_nearcenter = cberg->x + zNear * cos(cberg->yaw * M_PI_180);
+ y_nearcenter = cberg->y + zNear * sin(cberg->yaw * M_PI_180);
+ *x3 = x_nearcenter - nhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y3 = y_nearcenter - nhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+ *x4 = x_nearcenter + nhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y4 = y_nearcenter + nhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+
+#ifdef DEBUG
+ printf("\tnearcenter: (%.3f,%.3f) || nhalfwidth: %.3f\n"
+ "\tp3: (%.3f,%.3f) || p4: (%.3f,%.3f)\n",
+ x_nearcenter, y_nearcenter, nhalfwidth, *x3, *y3, *x4, *y4);
+#endif
+
+
+ /* center can be average or the intersection of diagonals.. */
+#if 0
+ {
+ double c = nhalfwidth * (zFar -zNear) / (fhalfwidth + nhalfwidth);
+ x_center = x_nearcenter + c * cos(cberg->yaw * M_PI_180);
+ y_center = y_nearcenter + c * sin(cberg->yaw * M_PI_180);
+ }
+#else
+ x_center = (x_nearcenter + x_farcenter) / 2;
+ y_center = (y_nearcenter + y_farcenter) / 2;
+#endif
+#ifdef DEBUG
+ x_shit = x_center;
+ y_shit = y_center;
+#endif
+
+#define VSCALE(p) *x##p = visibility * *x##p + (1-visibility) * x_center; \
+ *y##p = visibility * *y##p + (1-visibility) * y_center
+
+ VSCALE(1);
+ VSCALE(2);
+ VSCALE(3);
+ VSCALE(4);
+#undef VSCALE
+}
+
+/* this is pretty stupid.. */
+static inline void minmax4(double a, double b, double c, double d,
+ double *min, double *max)
+{
+ *min = *max = a;
+
+ if (b > *max) *max = b;
+ else if (b < *min) *min = b;
+ if (c > *max) *max = c;
+ else if (c < *min) *min = c;
+ if (d > *max) *max = d;
+ else if (d < *min) *min = d;
+}
+
+typedef struct {
+ double min, max, start, dx;
+} LS;
+
+#define check_line(a, b) \
+ if (fabs(y##a-y##b) > 0.001) { \
+ ls[count].dx = (x##b-x##a)/(y##b-y##a); \
+ if (y##b > y##a) { \
+ ls[count].start = x##a; \
+ ls[count].min = y##a; \
+ ls[count].max = y##b; \
+ } else { \
+ ls[count].start = x##b; \
+ ls[count].min = y##b; \
+ ls[count].max = y##a; \
+ } \
+ ++count; \
+ }
+
+static unsigned int build_ls(cberg_state *cberg,
+ double x1, double y1, double x2, double y2,
+ double x3, double y3, double x4, double y4, LS *ls,
+ double *trough, double *peak)
+{
+ unsigned int count = 0;
+
+ check_line(1, 2);
+ check_line(2, 3);
+ check_line(3, 4);
+ check_line(4, 1);
+
+ minmax4(y1, y2, y3, y4, trough, peak);
+ return count;
+}
+
+#undef check_line
+
+/*needs bullshit to avoid double counts on corners.*/
+static void find_bounds(double y, double *left, double *right, LS *ls,
+ unsigned int nls)
+{
+ double x;
+ unsigned int i, set = 0;
+
+ for (i = 0; i != nls; ++i)
+ if (ls[i].min <= y && ls[i].max >= y) {
+ x = (y - ls[i].min) * ls[i].dx + ls[i].start;
+ if (!set) {
+ *left = x;
+ ++set;
+ } else if (fabs(x - *left) > 0.001) {
+ if (*left < x)
+ *right = x;
+ else {
+ *right = *left;
+ *left = x;
+ }
+ return;
+ }
+ }
+
+ /* just in case we somehow blew up */
+ *left = 3.0;
+ *right = -3.0;
+}
+
+static void mark_visible(cberg_state *cberg)
+{
+ double trough, peak, yval, left=0, right=0;
+ double x1,y1, x2,y2, x3,y3, x4,y4;
+ int start, stop, x, y;
+ LS ls[4];
+ unsigned int nls;
+
+ calc_points(cberg, &x1,&y1, &x2,&y2, &x3,&y3, &x4,&y4);
+ nls = build_ls(cberg, x1,y1, x2,y2, x3,y3, x4,y4, ls, &trough, &peak);
+
+ start = (int) ceil(trough / M_SQRT3_2);
+ stop = (int) floor(peak / M_SQRT3_2);
+
+ for (y = start; y <= stop; ++y) {
+ yval = y * M_SQRT3_2;
+ find_bounds(yval, &left, &right, ls, nls);
+ for (x = (int) ceil(left*2-1); x <= (int) floor(right*2); ++x)
+ triles_set_visible(cberg, &(cberg->trile_head), x, y);
+ }
+}
+
+
+/***************************
+ ** color schemes
+ ** */
+
+static void plain_land(cberg_state *cberg, double z)
+{ glColor3f(pow((z/0.35),4), z/0.35, pow((z/0.35),4)); }
+static void plain_water(cberg_state *cberg, double z)
+{ glColor3f(0.0, (z+0.35)*1.6, 0.8); }
+
+static void ice_land(cberg_state *cberg, double z)
+{ glColor3f((0.35 - z)/0.35, (0.35 - z)/0.35, 1.0); }
+static void ice_water(cberg_state *cberg, double z)
+{ glColor3f(0.0, (z+0.35)*1.6, 0.8); }
+
+
+static void magma_land(cberg_state *cberg, double z)
+{ glColor3f(z/0.35, z/0.2,0); }
+static void magma_lava(cberg_state *cberg, double z)
+{ glColor3f((z+0.35)*1.6, (z+0.35), 0.0); }
+
+static void vomit_solid(cberg_state *cberg, double z)
+{
+ double norm = fabs(z) / 0.35;
+ glColor3f(
+ (1-norm) * cberg->vs0r + norm * cberg->vs1r,
+ (1-norm) * cberg->vs0g + norm * cberg->vs1g,
+ (1-norm) * cberg->vs0b + norm * cberg->vs1b
+ );
+}
+static void vomit_fluid(cberg_state *cberg, double z)
+{
+ double norm = z / -0.35;
+ glColor3f(
+ (1-norm) * cberg->vf0r + norm * cberg->vf1r,
+ (1-norm) * cberg->vf0g + norm * cberg->vf1g,
+ (1-norm) * cberg->vf0b + norm * cberg->vf1b
+ );
+}
+
+
+static const Color colors[] = {
+ {"plain", plain_land, plain_water, {0.0, 0.0, 0.0, 1.0}},
+ {"ice", ice_land, ice_water, {0.0, 0.0, 0.0, 1.0}},
+ {"magma", magma_land, magma_lava, {0.3, 0.3, 0.0, 1.0}},
+ {"vomit", vomit_solid, vomit_fluid, {0.3, 0.3, 0.0, 1.0}}, /* no error! */
+};
+
+static const Color *select_color(cberg_state *cberg)
+{
+ unsigned int ncolors = countof(colors);
+ int idx = -1;
+ if ( ! strcmp(color, "random") )
+ idx = random() % ncolors;
+ else {
+ unsigned int i;
+ for (i = 0; i != ncolors; ++i)
+ if ( ! strcmp(colors[i].id, color) ) {
+ idx = i;
+ break;
+ }
+
+ if (idx == -1) {
+ printf("invalid color scheme selected; valid choices are:\n");
+ for (i = 0; i != ncolors; ++i)
+ printf("\t%s\n", colors[i].id);
+ printf("\t%s\n", "random");
+ idx = 0;
+ }
+ }
+
+ if ( ! strcmp(colors[idx].id, "vomit") ) { /* need to create it (ghetto) */
+ cberg->vs0r = random()/(double)RAND_MAX;
+ cberg->vs0g = random()/(double)RAND_MAX;
+ cberg->vs0b = random()/(double)RAND_MAX;
+ cberg->vs1r = random()/(double)RAND_MAX;
+ cberg->vs1g = random()/(double)RAND_MAX;
+ cberg->vs1b = random()/(double)RAND_MAX;
+ cberg->vf0r = random()/(double)RAND_MAX;
+ cberg->vf0g = random()/(double)RAND_MAX;
+ cberg->vf0b = random()/(double)RAND_MAX;
+ cberg->vf1r = random()/(double)RAND_MAX;
+ cberg->vf1g = random()/(double)RAND_MAX;
+ cberg->vf1b = random()/(double)RAND_MAX;
+
+ glClearColor(random()/(double)RAND_MAX,
+ random()/(double)RAND_MAX,
+ random()/(double)RAND_MAX,
+ 1.0);
+ } else {
+ glClearColor(colors[idx].bg[0],
+ colors[idx].bg[1],
+ colors[idx].bg[2],
+ colors[idx].bg[3]);
+ }
+ return colors + idx;
+}
+
+
+/***************************
+ ** misc helper functions
+ ** */
+
+
+/* simple one for now.. */
+static inline double drunken_rando(double cur_val, double max, double width)
+{
+ double r = random() / (double) RAND_MAX * 2;
+ if (cur_val > 0)
+ if (r >= 1)
+ return cur_val + (r-1) * width * (1-cur_val/max);
+ else
+ return cur_val - r * width;
+ else
+ if (r >= 1)
+ return cur_val - (r-1) * width * (1+cur_val/max);
+ else
+ return cur_val + r * width;
+}
+
+
+/***************************
+ ** core crackberg routines
+ ** */
+
+ENTRYPOINT void reshape_crackberg (ModeInfo *mi, int w, int h);
+
+ENTRYPOINT void init_crackberg (ModeInfo *mi)
+{
+ cberg_state *cberg;
+
+ nsubdivs %= 16; /* just in case.. */
+
+ MI_INIT(mi, cbergs);
+
+ if (visibility > 1.0 || visibility < 0.2) {
+ printf("visibility must be in range [0.2 .. 1.0]\n");
+ visibility = 1.0;
+ }
+
+ cberg = &cbergs[MI_SCREEN(mi)];
+
+ cberg->epoints = 1 + (1 << nsubdivs);
+ cberg->tpoints = cberg->epoints * (cberg->epoints + 1) / 2;
+ cberg->ntris = (1 << (nsubdivs << 1));
+ cberg->tnorms = ( (flat) ? cberg->ntris : cberg->tpoints);
+ cberg->dx0 = 1.0 / (1 << nsubdivs);
+
+ cberg->heights = malloc(cberg->tpoints * sizeof(double));
+ cberg->norms = malloc(3 * cberg->tnorms * sizeof(double));
+
+ cberg->glx_context = init_GL(mi);
+ cberg->motion_state = MOTION_AUTO;
+ cberg->mspeed = 1.0;
+ cberg->z = 0.5;
+
+ cberg->fovy = 60.0;
+ cberg->zNear = 0.5;
+ cberg->zFar = 5.0;
+
+ cberg->draw_elapsed = 1.0;
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glShadeModel((flat) ? GL_FLAT : GL_SMOOTH);
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glPolygonMode(GL_FRONT_AND_BACK, (MI_IS_WIREFRAME(mi)) ? GL_LINE : GL_FILL);
+# endif
+
+ if (lit) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_COLOR_MATERIAL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_RESCALE_NORMAL);
+ }
+
+ cberg->color = select_color(cberg);
+
+ reshape_crackberg(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+ENTRYPOINT void reshape_crackberg (ModeInfo *mi, int w, int h)
+{
+ int h2;
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+
+ if (letterbox && (h2 = w * 9 / 16) < h) {
+ glViewport(0, (h-h2)/2, w, h2);
+ cberg->aspect = w/(double)h2;
+ } else {
+ glViewport (0, 0, w, h);
+ cberg->aspect = w/(double)h;
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(cberg->fovy, cberg->aspect, cberg->zNear, cberg->zFar);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+ENTRYPOINT Bool crackberg_handle_event (ModeInfo *mi, XEvent *ev)
+{
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+ KeySym keysym = 0;
+ char c = 0;
+ if (ev->xany.type == KeyPress || ev->xany.type == KeyRelease)
+ XLookupString (&ev->xkey, &c, 1, &keysym, 0);
+
+ if (ev->xany.type == KeyPress) {
+ switch (keysym) {
+ case XK_Left: cberg->motion_state |= MOTION_LROT; break;
+ case XK_Prior: cberg->motion_state |= MOTION_LROT; break;
+ case XK_Right: cberg->motion_state |= MOTION_RROT; break;
+ case XK_Next: cberg->motion_state |= MOTION_RROT; break;
+ case XK_Down: cberg->motion_state |= MOTION_BACK; break;
+ case XK_Up: cberg->motion_state |= MOTION_FORW; break;
+ case '1': cberg->motion_state |= MOTION_DEC; break;
+ case '2': cberg->motion_state |= MOTION_INC; break;
+ case 'a': cberg->motion_state |= MOTION_LEFT; break;
+ case 'd': cberg->motion_state |= MOTION_RIGHT; break;
+ case 's': cberg->motion_state |= MOTION_BACK; break;
+ case 'w': cberg->motion_state |= MOTION_FORW; break;
+ default: return False;
+ }
+ cberg->motion_state |= MOTION_MANUAL;
+ } else if (ev->xany.type == KeyRelease) {
+#if 0
+ XEvent peek_ev;
+ if (XPending(mi->dpy)) {
+ XPeekEvent(mi->dpy, &peek_ev);
+ if (peek_ev.type == KeyPress
+ && peek_ev.xkey.keycode == ev->xkey.keycode
+ && peek_ev.xkey.time - ev->xkey.time < 2) {
+ XNextEvent(mi->dpy, &peek_ev); /* drop bullshit repeat events */
+ return False;
+ }
+ }
+#endif
+
+ switch (keysym) {
+ case XK_Left: cberg->motion_state &= ~MOTION_LROT; break;
+ case XK_Prior: cberg->motion_state &= ~MOTION_LROT; break;
+ case XK_Right: cberg->motion_state &= ~MOTION_RROT; break;
+ case XK_Next: cberg->motion_state &= ~MOTION_RROT; break;
+ case XK_Down: cberg->motion_state &= ~MOTION_BACK; break;
+ case XK_Up: cberg->motion_state &= ~MOTION_FORW; break;
+ case '1': cberg->motion_state &= ~MOTION_DEC; break;
+ case '2': cberg->motion_state &= ~MOTION_INC; break;
+ case 'a': cberg->motion_state &= ~MOTION_LEFT; break;
+ case 'd': cberg->motion_state &= ~MOTION_RIGHT; break;
+ case 's': cberg->motion_state &= ~MOTION_BACK; break;
+ case 'w': cberg->motion_state &= ~MOTION_FORW; break;
+ case ' ':
+ if (cberg->motion_state == MOTION_MANUAL)
+ cberg->motion_state = MOTION_AUTO;
+ break;
+ default: return False;
+ }
+ } else if (ev->xany.type == ButtonPress &&
+ ev->xbutton.button == Button1) {
+ cberg->button_down_p = True;
+ cberg->mouse_x = ev->xbutton.x;
+ cberg->mouse_y = ev->xbutton.y;
+ cberg->motion_state = MOTION_MANUAL;
+ cberg->paused.tv_sec = 0;
+ } else if (ev->xany.type == ButtonRelease &&
+ ev->xbutton.button == Button1) {
+ cberg->button_down_p = False;
+ cberg->motion_state = MOTION_AUTO;
+ /* After mouse-up, don't go back into auto-motion mode for a second, so
+ that repeated click-and-drag gestures don't fight with auto-motion. */
+ gettimeofday(&cberg->paused, NULL);
+ } else if (ev->xany.type == MotionNotify &&
+ cberg->button_down_p) {
+ int dx = ev->xmotion.x - cberg->mouse_x;
+ int dy = ev->xmotion.y - cberg->mouse_y;
+ cberg->mouse_x = ev->xmotion.x;
+ cberg->mouse_y = ev->xmotion.y;
+ cberg->motion_state = MOTION_MANUAL;
+
+ /* Take the larger dimension, since motion_state doesn't scale */
+ if (dx > 0 && dx > dy) dy = 0;
+ if (dx < 0 && dx < dy) dy = 0;
+ if (dy > 0 && dy > dx) dx = 0;
+ if (dy < 0 && dy < dx) dx = 0;
+
+ {
+ int rot = current_device_rotation();
+ int swap;
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+ if (rot > 135 || rot < -135) /* 180 */
+ dx = -dx, dy = -dy;
+ else if (rot > 45) /* 90 */
+ swap = dx, dx = -dy, dy = swap;
+ else if (rot < -45) /* 270 */
+ swap = dx, dx = dy, dy = -swap;
+ }
+
+ if (dx > 0) cberg->motion_state |= MOTION_LEFT;
+ else if (dx < 0) cberg->motion_state |= MOTION_RIGHT;
+ else if (dy > 0) cberg->motion_state |= MOTION_FORW;
+ else if (dy < 0) cberg->motion_state |= MOTION_BACK;
+ } else
+ return False;
+ return True;
+}
+
+ENTRYPOINT void draw_crackberg (ModeInfo *mi)
+{
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+ struct timeval cur_frame_t;
+ double cur_frame;
+ static const float lpos[] = {2.0,0.0,-0.3,0.0};
+
+ if (!cberg->glx_context) /*XXX does this get externally tweaked? it kinda*/
+ return; /*XXX can't.. check it in crackberg_init*/
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cberg->glx_context));
+
+ gettimeofday(&cur_frame_t, NULL);
+ cur_frame = cur_frame_t.tv_sec + cur_frame_t.tv_usec / 1.0E6;
+ if ( cberg->prev_frame ) { /*not first run */
+
+ cberg->elapsed = cur_frame - cberg->prev_frame;
+
+ if (cberg->motion_state == MOTION_AUTO &&
+ cberg->paused.tv_sec < cur_frame_t.tv_sec) {
+ cberg->x += cberg->dx * cberg->elapsed;
+ cberg->y += cberg->dy * cberg->elapsed;
+ /* cberg->z */
+ /* cberg->pitch */
+ /* cberg->roll */
+ cberg->yaw += cberg->dyaw * cberg->elapsed;
+
+ cberg->draw_elapsed += cberg->elapsed;
+ if (cberg->draw_elapsed >= 0.8) {
+ cberg->draw_elapsed = 0.0;
+ cberg->dx = drunken_rando(cberg->dx, 2.5, 0.8);
+ cberg->dy = drunken_rando(cberg->dy, 2.5, 0.8);
+ /* cberg->dz */
+ /* cberg->dpitch */
+ /* cberg->droll */
+ cberg->dyaw = drunken_rando(cberg->dyaw, 40.0, 8.0);
+ }
+ } else {
+ double scale = cberg->elapsed * cberg->mspeed;
+ if (cberg->motion_state & MOTION_BACK) {
+ cberg->x -= cos(cberg->yaw * M_PI_180) * scale;
+ cberg->y -= sin(cberg->yaw * M_PI_180) * scale;
+ }
+ if (cberg->motion_state & MOTION_FORW) {
+ cberg->x += cos(cberg->yaw * M_PI_180) * scale;
+ cberg->y += sin(cberg->yaw * M_PI_180) * scale;
+ }
+
+ if (cberg->motion_state & MOTION_LEFT) {
+ cberg->x -= sin(cberg->yaw * M_PI_180) * scale;
+ cberg->y += cos(cberg->yaw * M_PI_180) * scale;
+ }
+ if (cberg->motion_state & MOTION_RIGHT) {
+ cberg->x += sin(cberg->yaw * M_PI_180) * scale;
+ cberg->y -= cos(cberg->yaw * M_PI_180) * scale;
+ }
+
+ if (cberg->motion_state & MOTION_LROT)
+ cberg->yaw += 45 * scale;
+ if (cberg->motion_state & MOTION_RROT)
+ cberg->yaw -= 45 * scale;
+
+ if (cberg->motion_state & MOTION_DEC)
+ cberg->mspeed /= pow(MSPEED_SCALE, cberg->draw_elapsed);
+ if (cberg->motion_state & MOTION_INC)
+ cberg->mspeed *= pow(MSPEED_SCALE, cberg->draw_elapsed);
+
+ }
+ }
+ cberg->prev_frame = cur_frame;
+
+ mark_visible(cberg);
+ triles_update_state(&(cberg->trile_head), cberg);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ gluLookAt(0,0,0, 1,0,0, 0,0,1);
+ glLightfv(GL_LIGHT0, GL_POSITION, lpos);
+ /*glRotated(cberg->roll, 1,0,0); / * XXX blah broken and unused for now..* /
+ glRotated(cberg->pitch, 0,1,0); */
+ glRotated(-cberg->yaw, 0,0,1); /* camera sees ->yaw over */
+ glTranslated(-cberg->x, -cberg->y, -cberg->z);
+
+ mi->polygon_count = cberg->ntris *
+ triles_foreach(cberg->trile_head, trile_draw,(void *) cberg);
+
+ if (mi->fps_p)
+ do_fps(mi);
+
+#ifdef DEBUG
+ glBegin(GL_LINES);
+ glColor3f(1.0,0.0,0.0);
+ glVertex3d(x_shit, y_shit, 0.0);
+ glVertex3d(x_shit, y_shit, 1.0);
+ glEnd();
+#endif
+
+ glFinish();
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+/* uh */
+ENTRYPOINT void free_crackberg (ModeInfo *mi)
+{
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+ if (cberg->norms)
+ free(cberg->norms);
+ free(cberg->heights);
+}
+
+XSCREENSAVER_MODULE ("Crackberg", crackberg)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/crackberg.man b/hacks/glx/crackberg.man
new file mode 100644
index 0000000..5183baa
--- /dev/null
+++ b/hacks/glx/crackberg.man
@@ -0,0 +1,123 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+crackberg - Lose your way wandering some height fields, and enjoy candy.
+.SH SYNOPSIS
+.B crackberg
+[\-root]
+[\-window]
+[\-install]
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window-id \fIid\fP]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-crack]
+[\-lit]
+[\-boring]
+[\-letterbox]
+[\-flat]
+[\-wire]
+[\-nowater]
+[\-visibility \fIfloat\fP]
+[\-color \fIstring\fP]
+[\-nsubdivs \fIinteger\fP]
+.SH DESCRIPTION
+Flies through height maps, optionally animating the instantiation and
+destruction of generated tiles; by default, tiles 'grow' into place (height
+gradually increased up to correct value). In windowed mode the following key
+controls are available:
+.TP 8
+.B left, right
+Turn left and right.
+.TP 8
+.B a,w,s,d
+Move left, forwards, backwards, and to the right, respectively.
+.TP 8
+.B 1,2
+Decrease and increase manual speed, respectively.
+.TP 8
+.B Spacebar
+Return to automatic control.
+.SH OPTIONS
+.I crackberg
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Delay between frames; default 20000 (1/50th of a second).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-crack
+Use all possible methods to animate tile instantiation.
+.TP 8
+.B \-boring
+Do not animate instatiation at all; use this to get standard landscape
+generator behavior.
+.TP 8
+.B \-letterbox
+Drawable window region has a 16:9 aspect ratio, regardless of actual
+window size.
+.TP 8
+.B \-lit
+Enable lighting.
+.TP 8
+.B \-flat
+Flat shading (OpenGL will use one color per primitive, rather than
+interpolating betwixt vertices).
+.TP 8
+.B \-wire
+Wireframe.
+.TP 8
+.B \-nowater
+Do not display 'water' (forces negative values to zero, and selects a
+different coloring method).
+.TP 8
+.B \-visibility \fIfloat\fP
+Value in range [0.2,1.0] (default 0.6) specifying proportion of viewable
+XY plane which is to be drawn upon.
+.TP 8
+.B \-color \fIstring\fP
+Selects color scheme. Use with no or bogus argument for current list.
+.TP 8
+.B \-nsubdivs \fIinteger\fP
+Number of times to recursively subdivide each triangular tile. Each
+increment increases total triangles by a factor of 4; for instance the default
+setting 4 results in 256 triangles per tile.
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Matus Telgarsky. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Matus Telgarsky <catachresis@cmu.edu>, 2005.
diff --git a/hacks/glx/crumbler.c b/hacks/glx/crumbler.c
new file mode 100644
index 0000000..8e783db
--- /dev/null
+++ b/hacks/glx/crumbler.c
@@ -0,0 +1,875 @@
+/* crumbler, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_crumbler 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "quickhull.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_DENSITY "1.0"
+#define DEF_FRACTURE "0"
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+typedef struct {
+ qh_vertex_t *verts; /* interior point cloud */
+ int nverts, onverts;
+ qh_vertex_t min, max; /* enclosing box */
+ qh_vertex_t mid, vec;
+ int polygon_count;
+ GLuint dlist;
+ int color;
+ int color_shift;
+} chunk;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ enum { IDLE, SPLIT, PAUSE, FLEE, ZOOM } state;
+ GLfloat tick;
+ Bool button_down_p;
+ int nchunks;
+ chunk **chunks;
+ chunk *ghost;
+
+ int ncolors;
+ XColor *colors;
+} crumbler_configuration;
+
+static crumbler_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static GLfloat density;
+static int fracture;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-fracture",".fracture",XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&density, "density", "Density", DEF_DENSITY, t_Float},
+ {&fracture, "fracture","Fracture",DEF_FRACTURE,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt crumbler_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Create a roughly spherical cloud of N random points.
+ */
+static void
+make_point_cloud (qh_vertex_t *verts, int nverts)
+{
+ int i = 0;
+ while (i < nverts)
+ {
+ verts[i].x = (0.5 - frand(1.0));
+ verts[i].y = (0.5 - frand(1.0));
+ verts[i].z = (0.5 - frand(1.0));
+ if ((verts[i].x * verts[i].x +
+ verts[i].y * verts[i].y +
+ verts[i].z * verts[i].z)
+ < 0.25)
+ i++;
+ }
+}
+
+
+static chunk *
+make_chunk (void)
+{
+ chunk *c = (chunk *) calloc (1, sizeof(*c));
+ c->dlist = glGenLists (1);
+ c->color_shift = 1 + (random() % 3) * RANDSIGN();
+ return c;
+}
+
+static void
+render_chunk (ModeInfo *mi, chunk *c)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int i, j;
+ qh_mesh_t m;
+ GLfloat d;
+
+ if (c->nverts <= 3)
+ {
+ fprintf (stderr, "%s: nverts %d\n", progname, c->nverts);
+ abort();
+ }
+
+ c->polygon_count = 0;
+ c->min.x = c->min.y = c->min.z = 999999;
+ c->max.x = c->max.y = c->max.z = -999999;
+
+ for (i = 0; i < c->nverts; i++)
+ {
+ if (c->verts[i].x < c->min.x) c->min.x = c->verts[i].x;
+ if (c->verts[i].y < c->min.y) c->min.y = c->verts[i].y;
+ if (c->verts[i].z < c->min.z) c->min.z = c->verts[i].z;
+ if (c->verts[i].x > c->max.x) c->max.x = c->verts[i].x;
+ if (c->verts[i].y > c->max.y) c->max.y = c->verts[i].y;
+ if (c->verts[i].z > c->max.z) c->max.z = c->verts[i].z;
+ }
+
+ c->mid.x = (c->max.x + c->min.x) / 2;
+ c->mid.y = (c->max.y + c->min.y) / 2;
+ c->mid.z = (c->max.z + c->min.z) / 2;
+
+ /* midpoint as normalized vector from origin */
+ d = sqrt (c->mid.x * c->mid.x +
+ c->mid.y * c->mid.y +
+ c->mid.z * c->mid.z);
+ c->vec.x = c->mid.x / d;
+ c->vec.y = c->mid.y / d;
+ c->vec.z = c->mid.z / d;
+
+ if (c->nverts <= 3)
+ {
+ fprintf (stderr, "%s: nverts %d\n", progname, c->nverts);
+ abort();
+ }
+
+ m = qh_quickhull3d (c->verts, c->nverts);
+
+ glNewList (c->dlist, GL_COMPILE);
+ if (! wire) glBegin (GL_TRIANGLES);
+ for (i = 0, j = 0; i < m.nindices; i += 3, j++)
+ {
+ qh_vertex_t *v0 = &m.vertices[m.indices[i+0]];
+ qh_vertex_t *v1 = &m.vertices[m.indices[i+1]];
+ qh_vertex_t *v2 = &m.vertices[m.indices[i+2]];
+ qh_vec3_t *n = &m.normals[m.normalindices[j]];
+
+ if (i+2 >= m.nindices) abort();
+ if (j >= m.nnormals) abort();
+
+ glNormal3f (n->x, n->y, n->z);
+ if (wire) glBegin(GL_LINE_LOOP);
+ glVertex3f (v0->x, v0->y, v0->z);
+ glVertex3f (v1->x, v1->y, v1->z);
+ glVertex3f (v2->x, v2->y, v2->z);
+ if (wire) glEnd();
+ c->polygon_count++;
+ }
+ if (! wire) glEnd();
+
+ if (wire)
+ {
+ glPointSize (1);
+ glColor3f (0, 1, 0);
+ glBegin (GL_POINTS);
+ for (i = 0; i < c->nverts; i++)
+ {
+ if (i > 0 && i == c->onverts)
+ {
+ glEnd();
+ glColor3f (1, 0, 0);
+ glBegin (GL_POINTS);
+ }
+ glVertex3f (c->verts[i].x, c->verts[i].y, c->verts[i].z);
+ }
+ glEnd();
+ }
+
+ glEndList();
+
+ qh_free_mesh (m);
+}
+
+
+static void
+free_chunk (chunk *c)
+{
+ if (c->dlist)
+ glDeleteLists (c->dlist, 1);
+ free (c->verts);
+ free (c);
+}
+
+
+/* Make sure the chunk contains at least N points.
+ As we subdivide, the number of points is reduced.
+ This adds new points to the interior that do not
+ affect the shape of the outer hull.
+ */
+static void
+pad_chunk (chunk *c, int min)
+{
+ /* Allocate a new array of size N
+ Copy the old points into it
+ while size < N
+ pick two random points
+ add a point that is somewhere along the line between them
+ (that point will still be inside the old hull)
+ */
+ qh_vertex_t *verts;
+ int i;
+ if (c->nverts >= min) return;
+ if (c->nverts <= 3) abort();
+ verts = (qh_vertex_t *) calloc (min, sizeof(*verts));
+ if (!verts) abort();
+ memcpy (verts, c->verts, c->nverts * sizeof(*verts));
+ i = c->nverts;
+ while (i < min)
+ {
+ qh_vertex_t v;
+ int j0, j1;
+ GLfloat r;
+ j0 = random() % c->nverts;
+ do {
+ j1 = random() % c->nverts;
+ } while (j0 == j1);
+
+ r = 0.2 + frand(0.6);
+# undef R
+# define R(F) v.F = c->verts[j0].F + \
+ r * (fabs (c->verts[j1].F - c->verts[j0].F)) \
+ * (c->verts[j0].F > c->verts[j1].F ? -1 : 1)
+ R(x);
+ R(y);
+ R(z);
+# undef R
+
+ /* Sometimes quickhull.c is giving us concave and un-closed polygons.
+ Maybe it gets confused if there are duplicate points? So reject
+ this point if it is within epsilon of any earlier point.
+ */
+# if 0 /* Nope, that's not it. */
+ {
+ Bool ok = True;
+ int j;
+ for (j = 0; j < i; j++)
+ {
+
+ double X = c->verts[j].x - v.x;
+ double Y = c->verts[j].y - v.y;
+ double Z = c->verts[j].z - v.z;
+ double d2 = X*X + Y*Y + Z*Z;
+ if (d2 < 0.0001)
+ {
+ /* fprintf (stderr, "## REJ %f\n",d2); */
+ ok = False;
+ break;
+ }
+ }
+ if (! ok) continue;
+ }
+# endif
+
+ verts[i++] = v;
+ }
+
+#if 0
+ fprintf (stdout, " int n = %d;\n", min);
+ fprintf (stdout, " qh_vertex_t v[] = {");
+ for (i = 0; i < min; i++)
+ fprintf(stdout,"{%f,%f,%f},", verts[i].x, verts[i].y, verts[i].z);
+ fprintf (stdout, "};\n\n");
+#endif
+
+ free (c->verts);
+ c->verts = verts;
+ c->onverts = c->nverts;
+ c->nverts = min;
+
+#if 0
+ qh_vertex_t *verts2 = (qh_vertex_t *) calloc (n, sizeof(*verts2));
+ memcpy (verts2, v, n * sizeof(*verts2));
+ free (c->verts);
+ c->verts = verts2;
+ c->onverts = 0;
+ c->nverts = n;
+#endif
+}
+
+
+/* Returns a list of N new chunks.
+ */
+static chunk **
+split_chunk (ModeInfo *mi, chunk *c, int nchunks)
+{
+ /* Pick N key-points from the cloud.
+ Create N new chunks.
+ For each old point:
+ It goes in chunk N if it is closest to key-point N.
+ Free old chunk.
+ for each new chunk
+ render_chunk
+ */
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ chunk **chunks;
+ int *keys;
+ int i, j;
+ int retries = 0;
+
+ RETRY:
+ chunks = (chunk **) calloc (nchunks, sizeof(*chunks));
+ keys = (int *) calloc (nchunks, sizeof(*keys));
+
+ for (i = 0; i < nchunks; i++)
+ {
+ /* Fill keys with random numbers that are not duplicates. */
+ Bool ok = True;
+ chunk *c2 = 0;
+ if (nchunks >= c->nverts)
+ {
+ fprintf (stderr, "%s: nverts %d nchunks %d\n", progname,
+ c->nverts, nchunks);
+ abort();
+ }
+ do {
+ keys[i] = random() % c->nverts;
+ ok = True;
+ for (j = 0; j < i; j++)
+ if (keys[i] == keys[j])
+ {
+ ok = False;
+ break;
+ }
+ } while (!ok);
+
+ c2 = make_chunk();
+ chunks[i] = c2;
+ chunks[i]->nverts = 0;
+ c2->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c2->verts));
+ c2->color = (c->color + (random() % (1 + (bp->ncolors / 3))))
+ % bp->ncolors;
+ }
+
+ /* Add the verts to the approprate chunks
+ */
+ for (i = 0; i < c->nverts; i++)
+ {
+ qh_vertex_t *v0 = &c->verts[i];
+ int target_chunk = -1;
+ double target_d2 = 9999999;
+ chunk *c2 = 0;
+
+ for (j = 0; j < nchunks; j++)
+ {
+ qh_vertex_t *v1 = &c->verts[keys[j]];
+ double X = v1->x - v0->x;
+ double Y = v1->y - v0->y;
+ double Z = v1->z - v0->z;
+ double d2 = X*X + Y*Y + Z*Z;
+ if (d2 < target_d2)
+ {
+ target_d2 = d2;
+ target_chunk = j;
+ }
+ }
+ if (target_chunk == -1) abort();
+
+ c2 = chunks[target_chunk];
+ c2->verts[c2->nverts++] = *v0;
+ if (c2->nverts > c->nverts) abort();
+ }
+
+ free (keys);
+ keys = 0;
+
+ for (i = 0; i < nchunks; i++)
+ {
+ chunk *c2 = chunks[i];
+
+ /* It is possible that the keys we have chosen have resulted in one or
+ more cells that have 3 or fewer points in them. If that's the case,
+ re-randomize.
+ */
+ if (c2->nverts <= 3)
+ {
+ for (j = 0; j < nchunks; j++)
+ free_chunk (chunks[j]);
+ free (chunks);
+ chunks = 0;
+ if (retries++ > 100)
+ {
+ fprintf(stderr, "%s: unsplittable\n", progname);
+ abort();
+ }
+ goto RETRY;
+ }
+
+ if (i == 0) /* The one we're gonna keep */
+ pad_chunk (c2, c->nverts);
+ render_chunk (mi, c2);
+ }
+
+ return chunks;
+}
+
+
+static void
+tick_crumbler (ModeInfo *mi)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat ts;
+
+ if (bp->button_down_p) return;
+
+ switch (bp->state) {
+ case IDLE: ts = 0.02; break;
+ case SPLIT: ts = 0.01; break;
+ case PAUSE: ts = 0.008; break;
+ case FLEE: ts = 0.005; break;
+ case ZOOM: ts = 0.03; break;
+ default: abort(); break;
+ }
+
+ bp->tick += ts * speed;
+
+ if (bp->tick < 1) return;
+
+ bp->tick = 0;
+ bp->state = (bp->state + 1) % (ZOOM + 1);
+
+ switch (bp->state) {
+ case IDLE:
+ {
+ chunk *c = bp->chunks[0];
+ int i;
+
+ /* We already animated it zooming to full size. Now make it real. */
+ GLfloat X = (c->max.x - c->min.x);
+ GLfloat Y = (c->max.y - c->min.y);
+ GLfloat Z = (c->max.z - c->min.z);
+ GLfloat s = 1 / MAX(X, MAX(Y, Z));
+
+ for (i = 0; i < c->nverts; i++)
+ {
+ c->verts[i].x *= s;
+ c->verts[i].y *= s;
+ c->verts[i].z *= s;
+ }
+
+ /* Re-render it to move the verts in the display list too.
+ This also recomputes min, max and mid.
+ */
+ render_chunk (mi, c);
+ break;
+ }
+
+ case SPLIT:
+ {
+ chunk *c = bp->chunks[0];
+ int frac = (fracture >= 2 ? fracture : 2 + (2 * (random() % 5)));
+ chunk **chunks = split_chunk (mi, c, frac);
+ if (bp->nchunks != 1) abort();
+ if (bp->ghost) abort();
+ bp->ghost = c;
+ free (bp->chunks);
+ bp->chunks = chunks;
+ bp->nchunks = frac;
+ break;
+ }
+
+ case PAUSE:
+ break;
+
+ case FLEE:
+ if (bp->ghost) free_chunk (bp->ghost);
+ bp->ghost = 0;
+ break;
+
+ case ZOOM:
+ {
+ chunk *c = bp->chunks[0];
+ int i;
+ for (i = 1; i < bp->nchunks; i++)
+ free_chunk (bp->chunks[i]);
+ bp->nchunks = 1;
+
+ /* We already animated the remaining chunk moving toward the origin.
+ Make it real.
+ */
+ for (i = 0; i < c->nverts; i++)
+ {
+ c->verts[i].x -= c->mid.x;
+ c->verts[i].y -= c->mid.y;
+ c->verts[i].z -= c->mid.z;
+ }
+
+ /* Re-render it to move the verts in the display list too.
+ This also recomputes min, max and mid (now 0).
+ */
+ render_chunk (mi, c);
+ break;
+ }
+
+ default: abort(); break;
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.35;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_crumbler (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+crumbler_handle_event (ModeInfo *mi, XEvent *event)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_crumbler (ModeInfo *mi)
+{
+ crumbler_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_crumbler (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ {
+ double spin_speed = 0.5 * speed;
+ double spin_accel = 0.3;
+ double wander_speed = 0.01 * speed;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->ncolors = 1024;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ /* brighter colors, please... */
+ for (i = 0; i < bp->ncolors; i++)
+ {
+# undef R
+# define R(F) F = 65535 * (0.3 + 0.7 * ((F) / 65535.0))
+ R (bp->colors[i].red);
+ R (bp->colors[i].green);
+ R (bp->colors[i].blue);
+# undef R
+ }
+
+# ifdef HAVE_MOBILE
+# ifdef USE_IPHONE
+ density *= 0.5; /* iPhone 6s runs out of memory at 4500 nverts. */
+# else
+ density *= 0.3; /* Android Nexus_5_8.1 emulator runs out earlier. */
+# endif
+# endif
+
+ {
+ chunk *c;
+ bp->nchunks = 1;
+ bp->chunks = (chunk **) calloc (bp->nchunks, sizeof(*bp->chunks));
+ c = make_chunk();
+ bp->chunks[0] = c;
+ c->nverts = 4500 * density;
+ c->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c->verts));
+ make_point_cloud (c->verts, c->nverts);
+
+ /* Let's shrink it to a point then zoom in. */
+ bp->state = ZOOM;
+ bp->tick = 0;
+ for (i = 0; i < c->nverts; i++)
+ {
+ c->verts[i].x /= 500;
+ c->verts[i].y /= 500;
+ c->verts[i].z /= 500;
+ }
+
+ render_chunk (mi, c);
+ }
+}
+
+
+static void
+draw_chunk (ModeInfo *mi, chunk *c, GLfloat alpha)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat color[4];
+
+ color[0] = bp->colors[c->color].red / 65536.0;
+ color[1] = bp->colors[c->color].green / 65536.0;
+ color[2] = bp->colors[c->color].blue / 65536.0;
+ color[3] = alpha;
+ glColor4fv (color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ c->color += c->color_shift;
+ while (c->color < 0) c->color += bp->ncolors;
+ while (c->color >= bp->ncolors) c->color -= bp->ncolors;
+
+ glCallList (c->dlist);
+ mi->polygon_count += c->polygon_count;
+}
+
+
+ENTRYPOINT void
+draw_crumbler (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GLfloat alpha = 1;
+ int i;
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ tick_crumbler (mi);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+
+ if (do_wander)
+ glScalef (10, 10, 10);
+ else
+ glScalef (13, 13, 13);
+
+ alpha = 1;
+ for (i = 0; i < bp->nchunks; i++)
+ {
+ chunk *c = bp->chunks[i];
+
+ glPushMatrix();
+
+ switch (bp->state) {
+ case FLEE:
+ {
+ GLfloat r = ease_ratio (bp->tick);
+ /* Move everybody toward the origin, so that chunk #0 ends up
+ centered there. */
+ glTranslatef (-r * c->mid.x,
+ -r * c->mid.y,
+ -r * c->mid.z);
+ if (i != 0)
+ {
+ /* Move this chunk away from the center, along a vector from
+ the origin to its midpoint. */
+ GLfloat d2 = r * 6;
+ glTranslatef (c->vec.x * d2, c->vec.y * d2, c->vec.z * d2);
+ alpha = 1 - r;
+ }
+ }
+ break;
+
+ case ZOOM:
+ {
+ chunk *c = bp->chunks[0];
+ GLfloat X = (c->max.x - c->min.x);
+ GLfloat Y = (c->max.y - c->min.y);
+ GLfloat Z = (c->max.z - c->min.z);
+ GLfloat size0 = MAX(X, MAX(Y, Z));
+ GLfloat size1 = 1.0;
+ GLfloat r = 1 - ease_ratio (bp->tick);
+ GLfloat s = 1 / (size0 + r * (size1 - size0));
+ glScalef (s, s, s);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ draw_chunk (mi, c, alpha);
+ glPopMatrix();
+ }
+
+ /* Draw the old one, fading out. */
+ if (!wire && bp->state == SPLIT && bp->ghost)
+ {
+ GLfloat s;
+ /* alpha = 1 - bp->tick; */
+ alpha = 1;
+ /* s = 0.7 + (0.3 * ease_ratio (1-bp->tick)); */
+ s = 2 * ease_ratio ((1-bp->tick) / 2);
+ s *= 1.01;
+ glScalef (s, s, s);
+ draw_chunk (mi, bp->ghost, alpha);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_crumbler (ModeInfo *mi)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ free (bp->trackball);
+ free (bp->rot);
+ free (bp->colors);
+ for (i = 0; i < bp->nchunks; i++)
+ free_chunk (bp->chunks[i]);
+ free (bp->chunks);
+}
+
+
+XSCREENSAVER_MODULE ("Crumbler", crumbler)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/crumbler.man b/hacks/glx/crumbler.man
new file mode 100644
index 0000000..a608d9d
--- /dev/null
+++ b/hacks/glx/crumbler.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+crumbler - voronoi divisions of a sphere.
+.SH SYNOPSIS
+.B crumbler
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-density \fInumber\fP]
+[\-fracture \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Randomly subdivides a ball into voronoi chunks, then further subdivides one
+of the remaining pieces.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-density \fInumber\fP
+Density of the polygons mesh. 2.0 means twice as dense, 0.5 means half.
+.TP 8
+.B \-fracture \fInumber\fP
+How many times to fracture each object. 0 means random.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cube21.c b/hacks/glx/cube21.c
new file mode 100644
index 0000000..451a523
--- /dev/null
+++ b/hacks/glx/cube21.c
@@ -0,0 +1,941 @@
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Cube 21 - a Rubik-like puzzle. It changes its shape and has more than
+ * 200 configurations. It is known better as Square-1, but it is called
+ * Cube 21 in the Czech republic, where it was invented in 1992.
+ *
+ * This file is derived from cage.c,
+ * "cage --- the Impossible Cage, an Escher like scene",
+ * by Marcelo F. Vienna,
+ * parts from gltext.c by Jamie Zawinski
+ *
+ * Vaclav (Vasek) Potocek
+ * vasek.potocek@post.cz
+ */
+
+/* TODO:
+ * some simple "solve mode"
+ * use rotator
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping should work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define free_cube21 0
+# define release_cube21 0
+#include "xlockmore.h"
+
+#include "gltrackball.h"
+
+#ifdef USE_GL
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_TEXTURE "True"
+#define DEF_RANDOMIZE "True"
+#define DEF_SPINSPEED "1.0"
+#define DEF_ROTSPEED "3.0"
+#define DEF_WANDERSPEED "0.02"
+#define DEF_WAIT "40.0"
+#define DEF_CUBESIZE "0.7"
+#define DEF_COLORMODE "six"
+
+#ifdef Pi
+#undef Pi
+#endif
+#define Pi M_PI
+
+#define SHUFFLE 100
+
+#define COS15 0.9659258263
+#define SIN15 0.2588190451
+#define COS30 0.8660254038
+#define SIN30 0.5000000000
+
+#define TEX_WIDTH 128
+#define TEX_HEIGHT 128
+#define TEX_GRAY 0.7, 0.7
+#define BORDER 3
+#define BORDER2 9
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define rnd01() (random()%2)
+#define rndcolor() (frand(0.5)+0.3)
+
+/*************************************************************************/
+
+static Bool spin, wander, rndstart, tex;
+static float spinspeed, tspeed, wspeed, twait, size;
+static char *colmode_s;
+static int colmode;
+
+static argtype vars[] = {
+ { &spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ { &wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ { &rndstart, "randomize", "Randomize", DEF_RANDOMIZE, t_Bool},
+ { &tex, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ { &spinspeed, "spinspeed", "SpinSpeed", DEF_SPINSPEED, t_Float},
+ { &tspeed, "rotspeed", "RotSpeed", DEF_ROTSPEED, t_Float},
+ { &wspeed, "wanderspeed", "WanderSpeed", DEF_WANDERSPEED, t_Float},
+ { &twait, "wait", "Wait", DEF_WAIT, t_Float},
+ { &size, "cubesize", "CubeSize", DEF_CUBESIZE, t_Float},
+ { &colmode_s, "colormode", "ColorMode", DEF_COLORMODE, t_String}
+};
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-randomize", ".randomize", XrmoptionNoArg, "True" },
+ { "+randomize", ".randomize", XrmoptionNoArg, "False" },
+ { "-texture", ".texture", XrmoptionNoArg, "True" },
+ { "+texture", ".texture", XrmoptionNoArg, "False" },
+ { "-spinspeed", ".spinspeed", XrmoptionSepArg, 0 },
+ { "-wanderspeed", ".wanderspeed", XrmoptionSepArg, 0 },
+ { "-rotspeed", ".rotspeed", XrmoptionSepArg, 0 },
+ { "-wait", ".wait", XrmoptionSepArg, 0 },
+ { "-cubesize", ".cubesize", XrmoptionSepArg, 0 },
+ { "-colormode", ".colormode", XrmoptionSepArg, 0 }
+};
+
+ENTRYPOINT ModeSpecOpt cube21_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct cube21_description =
+{ "cube21", "init_cube21", "draw_cube21", NULL,
+ "draw_cube21", "change_cube21", NULL, &cube21_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows randomly shuffling Cube 21", 0, NULL
+};
+#endif
+
+typedef enum {
+ CUBE21_STATE_BASIC,
+ CUBE21_PAUSE1 = CUBE21_STATE_BASIC,
+ CUBE21_ROT_BASE,
+ CUBE21_ROT_TOP = CUBE21_ROT_BASE,
+ CUBE21_ROT_BOTTOM,
+ CUBE21_PAUSE2,
+ CUBE21_HALF_BASE,
+ CUBE21_HALF1 = CUBE21_HALF_BASE,
+ CUBE21_HALF2
+} cube21_state;
+
+typedef enum {
+ CUBE21_COLOR_WHITE,
+ CUBE21_COLOR_RANDOM,
+ CUBE21_COLOR_SILVER,
+ CUBE21_COLOR_TWORND,
+ CUBE21_COLOR_CLASSIC,
+ CUBE21_COLOR_SIXRND
+} cube21_cmode;
+
+typedef int pieces_t[2][13];
+typedef int cind_t[5][12];
+typedef GLfloat col_t[6][3];
+
+typedef struct {
+ GLXContext *glx_context;
+ GLfloat ratio;
+ cube21_state state; /* type of "rotation" - shuffling */
+ GLfloat xrot, yrot; /* "spin" - object rotation around axis */
+ GLfloat posarg; /* position argument (for sine function) */
+ GLfloat t, tmax; /* rotation clock */
+ int hf[2], fr[2]; /* half flipped / face rotated flags */
+ int rface, ramount; /* selected face and amount of rotation in multiplies of 30deg */
+ int pieces[2][13]; /* locations of "narrow" and "wide" pieces */
+ int cind[5][12]; /* color indices */
+ GLfloat colors[6][3]; /* color map */
+
+ Bool wire, cmat;
+ unsigned char texture[TEX_HEIGHT][TEX_WIDTH];
+
+ GLfloat texp, texq, posc[6];
+ GLfloat color_inner[4];
+
+ Bool button_down_p;
+ trackball_state *trackball;
+
+} cube21_conf;
+
+static cube21_conf *cube21 = NULL;
+
+static const GLfloat shininess = 20.0;
+static const GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
+static const GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
+static const GLfloat material_ambient[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat material_diffuse[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat material_specular[] = {0.2, 0.2, 0.2, 1.0};
+static const GLfloat zpos = -18.0;
+
+/*************************************************************************/
+
+static void find_matches(pieces_t pieces, int matches[12], int s)
+{
+ int i, j = 1;
+ for(i = 1; i<6; i++) {
+ if(pieces[s][i] && pieces[s][i+6]) {
+ matches[j++] = i;
+ }
+ }
+ matches[0] = j;
+ for(i = 1; i<matches[0]; i++) {
+ matches[j++] = matches[i]-6;
+ }
+ matches[j++] = 6;
+ matches[0] = j;
+}
+
+static void rot_face(pieces_t pieces, cind_t colors, int s, int o)
+{
+ int i;
+ int tmp[12], tmpc[2][12];
+ int c0 = 2*s, c1 = c0+1;
+ for(i = 0; i<12; i++) {
+ tmp[i] = pieces[s][i];
+ tmpc[0][i] = colors[c0][i];
+ tmpc[1][i] = colors[c1][i];
+ }
+ if(o<0) o += 12;
+ for(i = 0; i<12; i++, o++) {
+ if(o==12) o = 0;
+ pieces[s][i] = tmp[o];
+ colors[c0][i] = tmpc[0][o];
+ colors[c1][i] = tmpc[1][o];
+ }
+}
+
+static void rot_halves(pieces_t pieces, cind_t colors, int hf[2], int s)
+{
+ int ss = 6*s, i, j, k, t;
+ for(i = 0; i<6; i++) {
+ j = ss+i; k = ss+6-i;
+ t = pieces[0][j];
+ pieces[0][j] = pieces[1][k];
+ pieces[1][k] = t;
+ k--;
+ t = colors[0][j];
+ colors[0][j] = colors[2][k];
+ colors[2][k] = t;
+ t = colors[1][j];
+ colors[1][j] = colors[3][k];
+ colors[3][k] = t;
+ }
+ hf[s] ^= 1;
+}
+
+static void randomize(cube21_conf *cp)
+{
+ int i, j, s;
+ int matches[12];
+ for(i = 0; i<SHUFFLE; i++) {
+ s = rnd01();
+ find_matches(cp->pieces, matches, s);
+ j = matches[0]-1;
+ j = random()%j;
+ j = matches[j+1];
+ rot_face(cp->pieces, cp->cind, s, j);
+ s = rnd01();
+ rot_halves(cp->pieces, cp->cind, cp->hf, s);
+ }
+}
+
+static void finish(cube21_conf *cp)
+{
+ int j, s;
+ int matches[12];
+ switch(cp->state) {
+ case CUBE21_PAUSE1:
+ s = rnd01();
+ find_matches(cp->pieces, matches, s);
+ j = matches[0]-1;
+ j = random()%j;
+ j = matches[j+1];
+ if(j==6 && rnd01()) j = -6;
+ cp->state = CUBE21_ROT_BASE+s;
+ cp->tmax = 30.0*abs(j);
+ cp->fr[0] = cp->fr[1] = 0;
+ cp->rface = s;
+ cp->ramount = j;
+ break;
+ case CUBE21_ROT_TOP:
+ case CUBE21_ROT_BOTTOM:
+ rot_face(cp->pieces, cp->cind, s = cp->rface, cp->ramount);
+ cp->fr[s] = 1;
+ s ^= 1;
+ if(!cp->fr[s] && rnd01()) {
+ find_matches(cp->pieces, matches, s);
+ j = matches[0]-1;
+ j = random()%j;
+ j = matches[j+1];
+ if(j==6 && rnd01()) j = -6;
+ cp->state = CUBE21_ROT_BASE+s;
+ cp->tmax = 30.0*abs(j);
+ cp->rface = s;
+ cp->ramount = j;
+ break;
+ } else {
+ cp->state = CUBE21_PAUSE2;
+ cp->tmax = twait;
+ break;
+ }
+ case CUBE21_PAUSE2:
+ s = rnd01();
+ cp->ramount = -rnd01(); /* 0 or -1, only sign is significant in this case */
+ cp->state = CUBE21_HALF_BASE+s;
+ cp->tmax = 180.0;
+ cp->rface = s;
+ break;
+ case CUBE21_HALF1:
+ case CUBE21_HALF2:
+ rot_halves(cp->pieces, cp->cind, cp->hf, cp->rface);
+ cp->state = CUBE21_PAUSE1;
+ cp->tmax = twait;
+ break;
+ }
+ cp->t = 0;
+}
+
+static void draw_narrow_piece(ModeInfo *mi, cube21_conf *cp, GLfloat s, int c1, int c2, col_t colors)
+{
+ GLfloat s1 = cp->posc[0]*s;
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.0, 0.0, s);
+ if(cp->cmat) glColor3fv(colors[c1]);
+ glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
+ glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(cp->texp, 0.0); glVertex3f(cp->posc[2], cp->posc[3], s);
+ mi->polygon_count++;
+ glNormal3f(0.0, 0.0, -s);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s1);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(cp->posc[2], cp->posc[3], s1);
+ mi->polygon_count++;
+ glEnd();
+ glBegin(GL_QUADS);
+ glNormal3f(0.0, -1.0, 0.0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(0.0, 0.0, s1);
+ mi->polygon_count++;
+ glNormal3f(COS15, SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[c2]);
+ glTexCoord2f(cp->texq, cp->texq); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[2], cp->posc[3], s);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[2], cp->posc[3], s1);
+ glTexCoord2f(1.0, cp->texq); glVertex3f(cp->posc[1], 0.0, s1);
+ mi->polygon_count++;
+ glNormal3f(-SIN30, COS30, 0.0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[2], cp->posc[3], s);
+ glVertex3f(cp->posc[2], cp->posc[3], s1);
+ glVertex3f(0.0, 0.0, s1);
+ mi->polygon_count++;
+ glEnd();
+ glRotatef(30.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_wide_piece(ModeInfo *mi, cube21_conf *cp, GLfloat s, int c1, int c2, int c3, col_t colors)
+{
+ GLfloat s1 = cp->posc[0]*s;
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.0, 0.0, s);
+ if(cp->cmat) glColor3fv(colors[c1]);
+ glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
+ glTexCoord2f(cp->texp, 0.0); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(0.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(0.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(0.0, cp->texp); glVertex3f(cp->posc[3], cp->posc[2], s);
+ glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
+ glNormal3f(0.0, 0.0, -s);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s1);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glVertex3f(cp->posc[3], cp->posc[2], s1);
+ glVertex3f(0.0, 0.0, s1);
+ glEnd();
+ glBegin(GL_QUADS);
+ glNormal3f(0.0, -1.0, 0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(0.0, 0.0, s1);
+ glNormal3f(COS15, -SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[c2]);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(1.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[1], 0.0, s1);
+ glNormal3f(SIN15, COS15, 0.0);
+ if(cp->cmat) glColor3fv(colors[c3]);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[3], cp->posc[2], s);
+ glTexCoord2f(1.0, 0.0); glVertex3f(cp->posc[3], cp->posc[2], s1);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glNormal3f(-COS30, SIN30, 0.0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[3], cp->posc[2], s);
+ glVertex3f(cp->posc[3], cp->posc[2], s1);
+ glVertex3f(0.0, 0.0, s1);
+ glEnd();
+ glRotatef(60.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_middle_piece(cube21_conf *cp, int s, cind_t cind, col_t colors)
+{
+ s *= 6;
+ glBegin(GL_QUADS);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glNormal3f(0.0, 0.0, 1.0);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
+ glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
+ glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
+ glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
+ glNormal3f(0.0, 0.0, -1.0);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
+ glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
+ glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
+ glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
+ glNormal3f(0.0, -1.0, 0.0);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
+ glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
+ glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
+ glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
+ glNormal3f(COS15, -SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[cind[4][s]]);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
+ glTexCoord2f(1.0, cp->texq); glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
+ glTexCoord2f(cp->texq, cp->texq); glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
+ glNormal3f(SIN15, COS15, 0.0);
+ if(cp->cmat) glColor3fv(colors[cind[4][s+1]]);
+ glTexCoord2f(0.0, 0.5); glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
+ glTexCoord2f(cp->texq, 0.5); glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
+ glTexCoord2f(cp->texq, 0.75); glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
+ glTexCoord2f(0.0, 0.75); glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
+ glNormal3f(-COS15, SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[cind[4][s+4]]);
+ glTexCoord2f(0.0, 0.75); glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
+ glTexCoord2f(1.0, 0.75); glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
+ glEnd();
+}
+
+static void draw_middle(cube21_conf *cp)
+{
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 0, cp->cind, cp->colors);
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 1, cp->cind, cp->colors);
+ if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+}
+
+static void draw_half_face(ModeInfo *mi, cube21_conf *cp, int s, int o)
+{
+ int i, s1 = 1-s*2, s2 = s*2;
+ for(i = o; i<o+6; i++) {
+ if(cp->pieces[s][i+1])
+ draw_narrow_piece(mi, cp, s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->colors);
+ else {
+ draw_wide_piece(mi, cp, s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->cind[s2+1][i+1], cp->colors);
+ i++;
+ }
+ }
+}
+
+static void draw_top_face(ModeInfo *mi, cube21_conf *cp)
+{
+ draw_half_face(mi, cp, 0, 0);
+ draw_half_face(mi, cp, 0, 6);
+}
+
+static void draw_bottom_face(ModeInfo *mi, cube21_conf *cp)
+{
+ draw_half_face(mi, cp, 1, 0);
+ draw_half_face(mi, cp, 1, 6);
+}
+
+static Bool draw_main(ModeInfo *mi, cube21_conf *cp)
+{
+ GLfloat theta = cp->ramount<0?cp->t:-cp->t;
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ if(wander)
+ glTranslatef(3.0*cp->ratio*sin(13.0*cp->posarg), 3.0*sin(17.0*cp->posarg), zpos);
+ else
+ glTranslatef(0, 0, zpos);
+ glScalef(size, size, size);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glRotatef(cp->xrot, 1.0, 0.0, 0.0);
+ glRotatef(cp->yrot, 0.0, 1.0, 0.0);
+
+ gltrackball_rotate (cp->trackball);
+
+ if(cp->wire) glColor3f(0.7, 0.7, 0.7);
+ switch(cp->state) {
+ case CUBE21_PAUSE1:
+ case CUBE21_PAUSE2:
+ draw_top_face(mi, cp);
+ draw_bottom_face(mi, cp);
+ draw_middle(cp);
+ break;
+ case CUBE21_ROT_TOP:
+ glRotatef(theta, 0.0, 0.0, 1.0);
+ draw_top_face(mi, cp);
+ glRotatef(-theta, 0.0, 0.0, 1.0);
+ draw_bottom_face(mi, cp);
+ draw_middle(cp);
+ break;
+ case CUBE21_ROT_BOTTOM:
+ draw_top_face(mi, cp);
+ glRotatef(theta, 0.0, 0.0, 1.0);
+ draw_bottom_face(mi, cp);
+ glRotatef(-theta, 0.0, 0.0, 1.0);
+ draw_middle(cp);
+ break;
+ case CUBE21_HALF1:
+ glRotatef(theta, 0.0, 1.0, 0.0);
+ case CUBE21_HALF2:
+ draw_half_face(mi, cp, 0, 0);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ draw_half_face(mi, cp, 1, 0);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 0, cp->cind, cp->colors);
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ if(cp->state==CUBE21_HALF1)
+ glRotatef(-theta, 0.0, 1.0, 0.0);
+ else
+ glRotatef(theta, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ draw_half_face(mi, cp, 0, 6);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ draw_half_face(mi, cp, 1, 6);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 1, cp->cind, cp->colors);
+ break;
+ }
+ if(spin) {
+ if((cp->xrot += spinspeed)>360.0) cp->xrot -= 360.0;
+ if((cp->yrot += spinspeed)>360.0) cp->yrot -= 360.0;
+ }
+ if(wander)
+ if((cp->posarg += wspeed/1000.0)>360.0) cp->posarg -= 360.0;
+ if((cp->t += tspeed)>cp->tmax) finish(cp);
+ return True;
+}
+
+static void parse_colmode(void)
+{
+ if(!colmode_s) {
+ colmode = CUBE21_COLOR_WHITE;
+ return;
+ }
+ if(strstr(colmode_s, "se") || strstr(colmode_s, "sil")) colmode = CUBE21_COLOR_SILVER;
+ else if(strstr(colmode_s, "ce") || strstr(colmode_s, "cla")) colmode = CUBE21_COLOR_CLASSIC;
+ else if(strstr(colmode_s, "2") || strstr(colmode_s, "two")) colmode = CUBE21_COLOR_TWORND;
+ else if(strstr(colmode_s, "6") || strstr(colmode_s, "six")) colmode = CUBE21_COLOR_SIXRND;
+ else if(strstr(colmode_s, "1") || strstr(colmode_s, "ran") || strstr(colmode_s, "rnd")) colmode = CUBE21_COLOR_RANDOM;
+ else colmode = CUBE21_COLOR_WHITE;
+}
+
+static void init_posc(cube21_conf *cp)
+{
+ cp->texp = (1.0-tan(Pi/12.0))/2.0;
+ cp->texq = 1.0-cp->texp;
+ /* Some significant non-trivial coordinates
+ * of the object. We need them exactly at GLfloat precision
+ * for the edges to line up perfectly. */
+ cp->posc[0] = tan(Pi/12); /* 0.268 */
+ cp->posc[1] = 1.0/cos(Pi/12); /* 1.035 */
+ cp->posc[2] = cos(Pi/6)/cos(Pi/12); /* 0.897 */
+ cp->posc[3] = sin(Pi/6)/cos(Pi/12); /* 0.518 */
+ cp->posc[4] = sqrt(2)*cos(Pi/6); /* 1.225 */
+ cp->posc[5] = sqrt(2)*sin(Pi/6); /* 0.707 = 1/sqrt(2) */
+}
+
+static void draw_horz_line(cube21_conf *cp, int x1, int x2, int y)
+{
+ int x, y0 = y, w;
+ if(y<BORDER) y = -y;
+ else y = -BORDER;
+ for(; y<BORDER; y++) {
+ if(y0+y>=TEX_HEIGHT) break;
+ w = y*y*255/BORDER2;
+ for(x=x1; x<=x2; x++)
+ if(cp->texture[y0+y][x]>w) cp->texture[y0+y][x] = w;
+ }
+}
+
+static void draw_vert_line(cube21_conf *cp, int x, int y1, int y2)
+{
+ int x0 = x, y, w;
+ if(x<BORDER) x = -x;
+ else x = -BORDER;
+ for(; x<BORDER; x++) {
+ if(x0+x>=TEX_WIDTH) break;
+ w = x*x*255/BORDER2;
+ for(y=y1; y<=y2; y++)
+ if(cp->texture[y][x0+x]>w) cp->texture[y][x0+x] = w;
+ }
+}
+
+static void draw_slanted_horz(cube21_conf *cp, int x1, int y1, int x2, int y2)
+{
+ int x, y, dx = x2-x1, dy = y2-y1, y0, w;
+ for(x=x1; x<=x2; x++) {
+ y0 = y1+(y2-y1)*(x-x1)/(x2-x1);
+ for(y=-1-BORDER; y<2+BORDER; y++) {
+ w = dx*(y0+y-y1)-dy*(x-x1);
+ w = w*w/(dx*dx+dy*dy);
+ w = w*255/BORDER2;
+ if(cp->texture[y0+y][x]>w) cp->texture[y0+y][x] = w;
+ }
+ }
+}
+
+static void draw_slanted_vert(cube21_conf *cp, int x1, int y1, int x2, int y2)
+{
+ int x, y, dx = x2-x1, dy = y2-y1, x0, w;
+ for(y=y1; y<=y2; y++) {
+ x0 = x1+(x2-x1)*(y-y1)/(y2-y1);
+ for(x=-1-BORDER; x<2+BORDER; x++) {
+ w = dy*(x0+x-x1)-dx*(y-y1);
+ w = w*w/(dy*dy+dx*dx);
+ w = w*255/BORDER2;
+ if(cp->texture[y][x0+x]>w) cp->texture[y][x0+x] = w;
+ }
+ }
+}
+
+static void make_texture(cube21_conf *cp)
+{
+ int x, y, x0, y0;
+ float grayp[2] = {TEX_GRAY};
+ for(y=0; y<TEX_HEIGHT; y++)
+ for(x=0; x<TEX_WIDTH; x++)
+ cp->texture[y][x] = 255;
+ draw_horz_line(cp, 0, TEX_WIDTH-1, 0);
+ draw_horz_line(cp, cp->texq*TEX_WIDTH, TEX_WIDTH-1, cp->texp*TEX_HEIGHT);
+ draw_horz_line(cp, cp->texq*TEX_WIDTH, TEX_WIDTH-1, cp->texq*TEX_HEIGHT);
+ draw_horz_line(cp, 0, cp->texq*TEX_WIDTH, TEX_HEIGHT/2);
+ draw_horz_line(cp, 0, TEX_WIDTH-1, TEX_HEIGHT*3/4);
+ draw_horz_line(cp, 0, TEX_WIDTH-1, TEX_HEIGHT-1);
+ draw_vert_line(cp, 0, 0, TEX_HEIGHT-1);
+ draw_vert_line(cp, cp->texq*TEX_WIDTH, 0, TEX_HEIGHT*3/4);
+ draw_vert_line(cp, TEX_WIDTH-1, 0, TEX_HEIGHT-1);
+ draw_slanted_horz(cp, 0, cp->texp*TEX_HEIGHT, TEX_WIDTH/2, TEX_HEIGHT/2);
+ draw_slanted_vert(cp, cp->texp*TEX_WIDTH, 0, TEX_WIDTH/2, TEX_HEIGHT/2);
+ draw_slanted_vert(cp, cp->texq*TEX_WIDTH, 0, TEX_WIDTH/2, TEX_HEIGHT/2);
+ x0 = grayp[0]*TEX_WIDTH;
+ y0 = grayp[1]*TEX_HEIGHT;
+ for(y=-1; y<=1; y++)
+ for(x=-1; x<=1; x++)
+ cp->texture[y0+y][x0+x] = 100;
+}
+
+/* It doesn't look good */
+/*#define MIPMAP*/
+
+static void init_gl(ModeInfo *mi)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+#ifdef MIPMAP
+ int status;
+#endif
+ parse_colmode();
+ cp->wire = MI_IS_WIREFRAME(mi);
+ cp->cmat = !cp->wire && (colmode != CUBE21_COLOR_WHITE);
+ if(MI_IS_MONO(mi)) {
+ tex = False;
+ cp->cmat = False;
+ }
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ cp->wire = 0;
+# endif
+
+ if(cp->wire) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ return;
+ }
+ if(!tex)
+ cp->color_inner[0] = cp->color_inner[1] = cp->color_inner[2] = 0.4;
+ else
+ cp->color_inner[0] = cp->color_inner[1] = cp->color_inner[2] = 1.0;
+
+ glClearDepth(1.0);
+ glDrawBuffer(GL_BACK);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glShadeModel(GL_FLAT);
+ glDepthFunc(GL_LESS);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_COLOR_MATERIAL);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
+ glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ if(!tex) return;
+ glEnable(GL_TEXTURE_2D);
+#ifdef MIPMAP
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEX_WIDTH, TEX_HEIGHT,
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, texture);
+ if (status) {
+ const char *s = gluErrorString(status);
+ fprintf (stderr, "%s: error mipmapping texture: %s\n", progname, (s?s:"(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ glTexImage2D(GL_TEXTURE_2D, 0, 1, TEX_WIDTH, TEX_HEIGHT,
+ 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, cp->texture);
+#endif
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+#ifdef MIPMAP
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+#else
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+#endif
+}
+
+static void init_cp(cube21_conf *cp)
+{
+ int i, j;
+ GLfloat ce_colors[6][3] = {
+ {1.0, 1.0, 1.0},
+ {1.0, 0.5, 0.0},
+ {0.0, 0.9, 0.0},
+ {0.8, 0.0, 0.0},
+ {0.1, 0.1, 1.0},
+ {0.9, 0.9, 0.0}
+ };
+ cp->state = CUBE21_STATE_BASIC;
+ cp->xrot = -65.0; cp->yrot = 185.0;
+ cp->posarg = (wspeed?random()%360:0.0);
+ cp->t = 0.0; cp->tmax = twait;
+ cp->hf[0] = cp->hf[1] = 0;
+ cp->fr[0] = cp->fr[1] = 0;
+ for(i=0;i<13;i++)
+ cp->pieces[0][i] = cp->pieces[1][i] = (i%3==1?0:1);
+ switch(colmode) {
+ case CUBE21_COLOR_RANDOM:
+ case CUBE21_COLOR_TWORND:
+ case CUBE21_COLOR_SIXRND:
+ for(i=0; i<6; i++)
+ for(j=0; j<3; j++)
+ cp->colors[i][j] = rndcolor();
+ break;
+ case CUBE21_COLOR_SILVER:
+ cp->colors[0][0] = 1.0;
+ cp->colors[0][1] = 1.0;
+ cp->colors[0][2] = 1.0;
+ cp->colors[1][0] = rndcolor();
+ cp->colors[1][1] = rndcolor();
+ cp->colors[1][2] = rndcolor();
+ break;
+ case CUBE21_COLOR_CLASSIC:
+ for(i=0; i<6; i++)
+ for(j=0; j<3; j++)
+ cp->colors[i][j] = 0.2+0.7*ce_colors[i][j];
+ break;
+ }
+ switch(colmode) {
+ case CUBE21_COLOR_SILVER:
+ case CUBE21_COLOR_TWORND:
+ for(i=0; i<5; i++)
+ for(j=0; j<12; j++)
+ if(i==0) cp->cind[i][j] = 0;
+ else if(i==2) cp->cind[i][j] = 1;
+ else cp->cind[i][j] = ((j+5)%12)>=6?1:0;
+ break;
+ case CUBE21_COLOR_CLASSIC:
+ case CUBE21_COLOR_SIXRND:
+ for(i=0; i<5; i++)
+ for(j=0; j<12; j++)
+ if(i==0) cp->cind[i][j] = 4;
+ else if(i==2) cp->cind[i][j] = 5;
+ else cp->cind[i][j] = ((j+5)%12)/3;
+ break;
+ case CUBE21_COLOR_RANDOM:
+ for(i=0; i<5; i++)
+ for(j=0; j<12; j++)
+ cp->cind[i][j] = 0;
+ break;
+ }
+ if(rndstart) randomize(cp);
+}
+
+/*************************************************************************/
+
+ENTRYPOINT void reshape_cube21(ModeInfo *mi, int width, int height)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+ int y = 0;
+ if(!height) height = 1;
+ cp->ratio = (GLfloat)width/(GLfloat)height;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ cp->ratio = width / (GLfloat) height;
+ cp->posarg = 0;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, cp->ratio, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT Bool
+cube21_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void init_cube21(ModeInfo *mi)
+{
+ cube21_conf *cp;
+ MI_INIT(mi, cube21);
+ cp = &cube21[MI_SCREEN(mi)];
+
+ cp->trackball = gltrackball_init (False);
+
+ if(!cp->texp) {
+ init_posc(cp);
+ make_texture(cp);
+ }
+
+#ifdef HAVE_MOBILE
+ size *= 2;
+#endif
+
+ if ((cp->glx_context = init_GL(mi)) != NULL) {
+ init_gl(mi);
+ init_cp(cp);
+ reshape_cube21(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void draw_cube21(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ cube21_conf *cp;
+ if (!cube21) return;
+ cp = &cube21[MI_SCREEN(mi)];
+ MI_IS_DRAWN(mi) = True;
+ if (!cp->glx_context) return;
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(cp->glx_context));
+ if (!draw_main(mi, cp)) {
+ MI_ABORT(mi);
+ return;
+ }
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_cube21(ModeInfo * mi)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+ if (!cp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+ init_gl(mi);
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("Cube21", cube21)
+
+#endif
diff --git a/hacks/glx/cube21.man b/hacks/glx/cube21.man
new file mode 100644
index 0000000..d90c0fb
--- /dev/null
+++ b/hacks/glx/cube21.man
@@ -0,0 +1,147 @@
+.TH XScreenSaver 1 "30-Aug-05" "X Version 11"
+.SH NAME
+cube21 - animates the Cube 21 puzzle
+.SH SYNOPSIS
+.B cube21
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-delay \fImicroseconds\fP]
+[\-texture] [\-no\-texture]
+[\-mono]
+[\-wireframe]
+[\-spin] [\-no\-spin]
+[\-wander] [\-no\-wander]
+[\-randomize] [\-no\-randomize]
+[\-spinspeed \fInumber\fP]
+[\-rotspeed \fInumber\fP]
+[\-wanderspeed \fInumber\fP]
+[\-wait \fInumber\fP]
+[\-cubesize \fInumber\fP]
+[\-colormode \fIarg\fP]
+[\-fps]
+.SH DESCRIPTION
+This program animates a puzzle known as Cube 21 or Square-1.
+Its moves are chosen randomly.
+.P
+Cube 21 is a Rubik-like puzzle invented in 1992. Its specialities are that
+it can change its shape and even the number of possible moves. It can have
+more than 200 different shapes and the total number of configurations
+(assuming colors) is several tens of billions.
+.SH OPTIONS
+.I cube21
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-texture
+Use texture maps. This is the default.
+.TP 8
+.B \-no\-texture
+Use solid colors.
+.TP 8
+.B \-mono
+Disable both texture maps and colors.
+.TP 8
+.B \-wireframe
+Only draw outlines. Outlines of all pieces, not only the whole object, are drawn.
+.TP 8
+.B \-spin
+Spin the whole object around X, Y and Z axes. This is the default.
+.TP 8
+.B \-no\-spin
+Do not spin, showing the same three faces all the time.
+.TP 8
+.B \-wander
+Move the object around the screen. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the object centered on the screen.
+.TP 8
+.B \-randomize
+Shuffle the puzzle randomly at startup. This is the default.
+.TP 8
+.B \-no\-randomize
+Do not shuffle at startup, begin at the shape of cube.
+.TP 8
+.B \-spinspeed \fInumber\fP
+The relative speed of spinning. Default is 1.0.
+.TP 8
+.B \-rotspeed \fInumber\fP
+The relative speed of the moves. Default is 3.0. Setting to \(<= 0.0
+makes the object stay at one configuration.
+.TP 8
+.B \-wanderspeed \fInumber\fP
+The relative speed of wandering around the screen. Default is 1.0.
+.TP 8
+.B \-wait \fInumber\fP
+How long to stay at ending position after each move. The meaning of
+the argument is again relative. Default is 40.0.
+.TP 8
+.B \-cubesize \fInumber\fP
+Size of the object. Value of 3.0 fills roughly all the screen (its height). Default is 0.7.
+.TP 8
+.B \-colormode \fIargument\fP
+How many and which colors should the object have. The colors are put on the piece
+faces so that the puzzle is solvable. The inner faces are not influenced.
+.RS
+.TP 8
+.BR se " or " silver
+Simulate the "Silver Edition" \- white and one random color.
+.TP 8
+.BR 2 " or " two
+Two random colors.
+.TP 8
+.BR ce " or " classic
+Simulate the "Classic Edition" \- white, yellow, orange, red, green and blue.
+.TP 8
+.BR 6 " or " six
+Six random colors.
+.TP 8
+.BR 1 " or " random " or " rnd
+One random color.
+.TP 8
+Anything else
+All faces white.
+.RE
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Vaclav Potocek. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Vaclav (Vasek) Potocek <vasek.potocek@post.cz>, 30-Aug-05.
diff --git a/hacks/glx/cubenetic.c b/hacks/glx/cubenetic.c
new file mode 100644
index 0000000..cc9b0d6
--- /dev/null
+++ b/hacks/glx/cubenetic.c
@@ -0,0 +1,598 @@
+/* cubenetic, Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 5 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_TEXTURE "True"
+
+#define DEF_WAVES "3"
+#define DEF_WAVE_SPEED "80"
+#define DEF_WAVE_RADIUS "512"
+
+typedef struct {
+ int color;
+ GLfloat x, y, z;
+ GLfloat w, h, d;
+ int frame;
+ GLfloat dx, dy, dz;
+ GLfloat dw, dh, dd;
+} cube;
+
+typedef struct {
+ int x, y;
+ double xth, yth;
+} wave_src;
+
+typedef struct {
+ int nwaves;
+ int radius;
+ int speed;
+ wave_src *srcs;
+ int *heights;
+} waves;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint cube_list;
+ GLuint texture_id;
+ int cube_polys;
+ int ncubes;
+ cube *cubes;
+ waves *waves;
+
+ int texture_width, texture_height;
+ unsigned char *texture;
+
+ int ncolors;
+ XColor *cube_colors;
+ XColor *texture_colors;
+
+} cube_configuration;
+
+static cube_configuration *ccs = NULL;
+
+static char *do_spin;
+static Bool do_wander;
+static Bool do_texture;
+
+static int wave_count;
+static int wave_speed;
+static int wave_radius;
+static int texture_size = 256;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ {"-texture", ".texture", XrmoptionNoArg, "true" },
+ {"+texture", ".texture", XrmoptionNoArg, "false" },
+ {"-waves", ".waves", XrmoptionSepArg, 0 },
+ {"-wave-speed", ".waveSpeed", XrmoptionSepArg, 0 },
+ {"-wave-radius", ".waveRadius", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&wave_count, "waves", "Waves", DEF_WAVES, t_Int},
+ {&wave_speed, "waveSpeed", "WaveSpeed", DEF_WAVE_SPEED, t_Int},
+ {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static int
+unit_cube (Bool wire)
+{
+ int polys = 0;
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* front */
+ glNormal3f (0, 0, 1);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* back */
+ glNormal3f (0, 0, -1);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, -0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* left */
+ glNormal3f (-1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* right */
+ glNormal3f (1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+
+ if (wire) return polys;
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* top */
+ glNormal3f (0, 1, 0);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, 0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* bottom */
+ glNormal3f (0, -1, 0);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+ return polys;
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+/* Waves.
+ Adapted from ../hacks/interference.c by Hannu Mallat.
+ */
+
+static void
+init_wave (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww;
+ int i;
+ cc->waves = ww = (waves *) calloc (sizeof(*cc->waves), 1);
+ ww->nwaves = wave_count;
+ ww->radius = wave_radius;
+ ww->speed = wave_speed;
+ ww->heights = (int *) calloc (sizeof(*ww->heights), ww->radius);
+ ww->srcs = (wave_src *) calloc (sizeof(*ww->srcs), ww->nwaves);
+
+ for (i = 0; i < ww->radius; i++)
+ {
+ float max = (cc->ncolors * (ww->radius - i) / (float) ww->radius);
+ ww->heights[i] = ((max + max * cos(i / 50.0)) / 2.0);
+ }
+
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth = frand(2.0) * M_PI;
+ ww->srcs[i].yth = frand(2.0) * M_PI;
+ }
+}
+
+static void
+interference (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww = cc->waves;
+ int x, y, i;
+
+ /* Move the wave origins around
+ */
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth += (ww->speed / 1000.0);
+ if (ww->srcs[i].xth > 2*M_PI)
+ ww->srcs[i].xth -= 2*M_PI;
+ ww->srcs[i].yth += (ww->speed / 1000.0);
+ if (ww->srcs[i].yth > 2*M_PI)
+ ww->srcs[i].yth -= 2*M_PI;
+
+ ww->srcs[i].x = (cc->texture_width/2 +
+ (cos (ww->srcs[i].xth) *
+ cc->texture_width / 2));
+ ww->srcs[i].y = (cc->texture_height/2 +
+ (cos (ww->srcs[i].yth) *
+ cc->texture_height / 2));
+ }
+
+ /* Compute the effect of the waves on each pixel,
+ and generate the output map.
+ */
+ for (y = 0; y < cc->texture_height; y++)
+ for (x = 0; x < cc->texture_width; x++)
+ {
+ int result = 0;
+ unsigned char *o;
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ int dx = x - ww->srcs[i].x;
+ int dy = y - ww->srcs[i].y;
+ int dist = sqrt (dx*dx + dy*dy);
+ result += (dist > ww->radius ? 0 : ww->heights[dist]);
+ }
+ result %= cc->ncolors;
+
+ o = cc->texture + (((y * cc->texture_width) + x) << 2);
+ o[0] = (cc->texture_colors[result].red >> 8);
+ o[1] = (cc->texture_colors[result].green >> 8);
+ o[2] = (cc->texture_colors[result].blue >> 8);
+ /* o[3] = 0xFF; */
+ }
+}
+
+
+/* Textures
+ */
+
+static void
+init_texture (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+
+ glEnable(GL_TEXTURE_2D);
+
+ clear_gl_error();
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glGenTextures (1, &cc->texture_id);
+ glBindTexture (GL_TEXTURE_2D, cc->texture_id);
+ check_gl_error("texture binding");
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ check_gl_error("texture initialization");
+
+ cc->texture_width = texture_size;
+ cc->texture_height = texture_size;
+
+ i = texture_size * texture_size * 4;
+ cc->texture = (unsigned char *) malloc (i);
+ memset (cc->texture, 0xFF, i);
+}
+
+
+static void
+shuffle_texture (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ interference (mi);
+ clear_gl_error();
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ cc->texture_width, cc->texture_height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ cc->texture);
+ check_gl_error("texture");
+}
+
+
+static void
+reset_colors (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ double H[3], S[3], V[3];
+ int shift = 60;
+ H[0] = frand(360.0);
+ H[1] = ((H[0] + shift) < 360) ? (H[0]+shift) : (H[0] + shift - 360);
+ H[2] = ((H[1] + shift) < 360) ? (H[1]+shift) : (H[1] + shift - 360);
+ S[0] = S[1] = S[2] = 1.0;
+ V[0] = V[1] = V[2] = 1.0;
+ make_color_loop(0, 0, 0,
+ H[0], S[0], V[0],
+ H[1], S[1], V[1],
+ H[2], S[2], V[2],
+ cc->texture_colors, &cc->ncolors,
+ False, False);
+
+ make_smooth_colormap (0, 0, 0,
+ cc->cube_colors, &cc->ncolors,
+ False, 0, False);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cc->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ reset_colors (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ int i;
+ cube_configuration *cc;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, ccs);
+
+ cc = &ccs[MI_SCREEN(mi)];
+
+ if ((cc->glx_context = init_GL(mi)) != NULL) {
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ if (!wire)
+ {
+ static const GLfloat pos[4] = {1.0, 0.5, 1.0, 0.0};
+ static const GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ static const GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ }
+
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 1.0;
+ double wander_speed = 0.05;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ cc->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ (spinx && spiny && spinz));
+ cc->trackball = gltrackball_init (True);
+ }
+
+ cc->ncolors = 256;
+ cc->texture_colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+ cc->cube_colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+
+ reset_colors (mi);
+
+ cc->ncubes = MI_COUNT (mi);
+ cc->cubes = (cube *) calloc (sizeof(cube), cc->ncubes);
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ cube->color = random() % cc->ncolors;
+ cube->w = 1.0;
+ cube->h = 1.0;
+ cube->d = 1.0;
+ cube->dx = frand(0.1);
+ cube->dy = frand(0.1);
+ cube->dz = frand(0.1);
+ cube->dw = frand(0.1);
+ cube->dh = frand(0.1);
+ cube->dd = frand(0.1);
+ }
+
+ if (wire)
+ do_texture = False;
+
+ if (do_texture)
+ {
+ init_texture (mi);
+ init_wave (mi);
+ shuffle_texture (mi);
+ }
+
+ cc->cube_list = glGenLists (1);
+ glNewList (cc->cube_list, GL_COMPILE);
+ cc->cube_polys = unit_cube (wire);
+ glEndList ();
+}
+
+
+static void
+shuffle_cubes (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < cc->ncubes; i++)
+ {
+# define SINOID(SCALE,FRAME,SIZE) \
+ ((((1 + sin((FRAME * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
+
+ cube *cube = &cc->cubes[i];
+ cube->x = SINOID(cube->dx, cube->frame, 0.5);
+ cube->y = SINOID(cube->dy, cube->frame, 0.5);
+ cube->z = SINOID(cube->dz, cube->frame, 0.5);
+ cube->w = SINOID(cube->dw, cube->frame, 0.9) + 1.0;
+ cube->h = SINOID(cube->dh, cube->frame, 0.9) + 1.0;
+ cube->d = SINOID(cube->dd, cube->frame, 0.9) + 1.0;
+ cube->frame++;
+# undef SINOID
+ }
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!cc->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cc->glx_context));
+
+ glShadeModel(GL_FLAT);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (cc->rot, &x, &y, &z, !cc->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 6,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (cc->trackball);
+
+ get_rotation (cc->rot, &x, &y, &z, !cc->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ glScalef (2.5, 2.5, 2.5);
+
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ GLfloat color[4];
+ color[0] = cc->cube_colors[cube->color].red / 65536.0;
+ color[1] = cc->cube_colors[cube->color].green / 65536.0;
+ color[2] = cc->cube_colors[cube->color].blue / 65536.0;
+ color[3] = 1.0;
+ cube->color++;
+ if (cube->color >= cc->ncolors) cube->color = 0;
+
+ glPushMatrix ();
+ glTranslatef (cube->x, cube->y, cube->z);
+ glScalef (cube->w, cube->h, cube->d);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glCallList (cc->cube_list);
+ mi->polygon_count += cc->cube_polys;
+ glPopMatrix ();
+ }
+
+ shuffle_cubes (mi);
+ if (do_texture)
+ shuffle_texture (mi);
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("Cubenetic", cubenetic, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubenetic.man b/hacks/glx/cubenetic.man
new file mode 100644
index 0000000..e11d479
--- /dev/null
+++ b/hacks/glx/cubenetic.man
@@ -0,0 +1,89 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubenetic - cubist 3D undulating blob.
+.SH SYNOPSIS
+.B cubenetic
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-wireframe]
+[\-no-texture]
+[\-wave-speed \fInumber\fP]
+[\-wave-radius \fInumber\fP]
+[\-waves \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a pulsating set of overlapping boxes with ever-chaning blobby
+patterns undulating across their surfaces.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+How many boxes make up the object. Default: 5.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin \fI[XYZ]\fP
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+Don't spin.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-texture | \-no-texture
+Display Solid Colors.
+.TP 8
+.B \-wave-speed \fInumber\fP
+Surface Pattern Speed. 5 - 150. Default: 80.
+.TP 8
+.B \-wave-radius \fInumber\fP
+Surface Pattern Overlap. 5 - 600. Default: 512.
+.TP 8
+.B \-waves \fInumber\fP
+Surface Pattern Complexity. 1 - 20. Default: 3.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubestack.c b/hacks/glx/cubestack.c
new file mode 100644
index 0000000..70883f6
--- /dev/null
+++ b/hacks/glx/cubestack.c
@@ -0,0 +1,462 @@
+/* cubestack, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.13"
+#define DEF_OPACITY "0.7"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLfloat state;
+ GLfloat r;
+ int length;
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static GLfloat speed;
+static GLfloat thickness;
+static GLfloat opacity;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-opacity", ".opacity", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&opacity, "opacity", "Opacity", DEF_OPACITY, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static int
+draw_strut (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ GLfloat h;
+
+ glPushMatrix();
+ glFrontFace (GL_CCW);
+ glNormal3f (0, 0, -1);
+ glTranslatef (-0.5, -0.5, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0, 0, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (1 - thickness, thickness, 0);
+ glVertex3f (thickness, thickness, 0);
+ glEnd();
+ polys += 2;
+
+ h = 0.5 - thickness;
+ if (h >= 0.25)
+ {
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0.5, 0.5, 0);
+ glVertex3f (0.5 - thickness/2, 0.5 - thickness/2, 0);
+ glVertex3f (0.5 - thickness/2, 0.5 - h/2, 0);
+ glVertex3f (0.5 + thickness/2, 0.5 - h/2, 0);
+ glVertex3f (0.5 + thickness/2, 0.5 - thickness/2, 0);
+ glEnd();
+ polys += 3;
+ }
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static int
+draw_face (ModeInfo *mi)
+{
+ int i;
+ int polys = 0;
+ for (i = 0; i < 4; i++)
+ {
+ polys += draw_strut (mi);
+ glRotatef (90, 0, 0, 1);
+ }
+ return polys;
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.5;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+static int
+draw_cube_1 (ModeInfo *mi, GLfloat state, GLfloat color[4], Bool bottom_p)
+{
+ int polys = 0;
+ int istate = state;
+ GLfloat r = state - istate;
+ GLfloat a = color[3];
+
+ r = ease_ratio (r);
+
+# define COLORIZE(R) \
+ color[3] = a * R; \
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); \
+ glColor4fv (color)
+
+ if (bottom_p)
+ {
+ GLfloat r2 = (state < 0 ? 1 + state : 1);
+ COLORIZE(r2);
+ polys += draw_face (mi); /* Bottom */
+ }
+
+ if (state >= 0) /* Left */
+ {
+ GLfloat r2 = (istate == 0 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (-0.5, 0.5, 0);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 1) /* Back */
+ {
+ GLfloat r2 = (istate == 1 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (-0.5, 0.5, 0);
+ glRotatef ( 90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 2) /* Right */
+ {
+ GLfloat r2 = (istate == 2 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef ( 90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glRotatef (-90, 0, 1, 0);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (-0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 3) /* Front */
+ {
+ GLfloat r2 = (istate == 3 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef ( 90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glRotatef (-180, 0, 1, 0);
+ glTranslatef (-1, 0, 0);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 4) /* Top */
+ {
+ GLfloat r2 = (istate == 4 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (0, 0, 1);
+ glRotatef (-90, 0, 0, 1);
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (-90, 0, 1, 0);
+ glRotatef (r2 * 90, 0, 1, 0);
+ glTranslatef (-0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ return polys;
+}
+
+
+static int
+draw_cubes (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ int polys = 0;
+ GLfloat z = bp->state / 6;
+ int i;
+ GLfloat c[4];
+ int c0 = bp->ccolor;
+ GLfloat alpha = opacity;
+
+ glPushMatrix();
+ glTranslatef (0, 0, -1.5 - z);
+
+ glTranslatef (0, 0, -bp->length);
+ for (i = bp->length-1; i >= 0; i--)
+ {
+ int c1 = c0 - i - 1;
+ if (c1 < 0) c1 += bp->ncolors;
+ c[0] = bp->colors[c1].red / 65536.0;
+ c[1] = bp->colors[c1].green / 65536.0;
+ c[2] = bp->colors[c1].blue / 65536.0;
+ c[3] = alpha;
+
+ glTranslatef (0, 0, 1);
+ polys += draw_cube_1 (mi, 5, c, i == bp->length - 1);
+ }
+
+ c[0] = bp->colors[c0].red / 65536.0;
+ c[1] = bp->colors[c0].green / 65536.0;
+ c[2] = bp->colors[c0].blue / 65536.0;
+ c[3] = alpha;
+ glTranslatef (0, 0, 1);
+ polys += draw_cube_1 (mi, bp->state, c, bp->length == 0);
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ bp->ncolors = 32;
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ return True;
+ }
+ }
+
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ glDisable (GL_LIGHTING);
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_NORMALIZE);
+ glDisable (GL_CULL_FACE);
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ }
+
+ {
+ double wander_speed = 0.005;
+ bp->rot = make_rotator (0, 0, 0, 0,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (thickness > 0.5)
+ thickness = 0.5;
+ if (thickness < 0.001)
+ thickness = 0.001;
+
+ bp->ncolors = 32;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ bp->state = -1;
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 4,
+ (y - 0.5) * 4,
+ (z - 0.5) * 2);
+
+ gltrackball_rotate (bp->trackball);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (6, 6, 6);
+ glRotatef (-45, 1, 0, 0);
+ glRotatef (20, 0, 0, 1);
+ glRotatef (bp->r, 0, 0, 1);
+
+ mi->polygon_count = draw_cubes (mi);
+ glPopMatrix ();
+
+ if (!bp->button_down_p)
+ {
+ int max = 6;
+ bp->state += speed * 0.015;
+ bp->r += speed * 0.05;
+ while (bp->r > 360)
+ bp->r -= 360;
+ while (bp->state > max)
+ {
+ bp->state -= max;
+ bp->length++;
+ bp->ccolor++;
+ if (bp->ccolor > bp->ncolors)
+ bp->ccolor = 0;
+ }
+
+ if (bp->length > 20)
+ bp->length = 20;
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("CubeStack", cubestack, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubestack.man b/hacks/glx/cubestack.man
new file mode 100644
index 0000000..511d116
--- /dev/null
+++ b/hacks/glx/cubestack.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubestack - An endless stack of unfolding, translucent cubes.
+.SH SYNOPSIS
+.B cubestack
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-opacity \fInumber\fP]
+[\-no-wander]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+An endless stack of unfolding, translucent cubes.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of the face edges. 0.0 - 0.5. Default: 0.13.
+.TP 8
+.B \-opacity \fInumber\fP
+Opacity of the cubes. 0.01 - 1.0. Default: 0.7.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubestorm.c b/hacks/glx/cubestorm.c
new file mode 100644
index 0000000..cf973c9
--- /dev/null
+++ b/hacks/glx/cubestorm.c
@@ -0,0 +1,469 @@
+/* cubestorm, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: " DEF_COUNT "\n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.06"
+#define DEF_COUNT "4"
+#define DEF_LENGTH "200"
+
+typedef struct {
+ GLfloat px, py, pz;
+ GLfloat rx, ry, rz;
+ int ccolor;
+} histcube;
+
+typedef struct {
+ rotator *rot;
+ int ccolor;
+} subcube;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool clear_p;
+
+ GLuint cube_list;
+
+ int ncolors;
+ XColor *colors;
+
+ subcube *subcubes;
+
+ int hist_size, hist_count;
+ histcube *hist;
+
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static Bool do_spin;
+static Bool do_wander;
+static GLfloat speed;
+static GLfloat thickness;
+static int max_length;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True"},
+ { "+db", ".doubleBuffer", XrmoptionNoArg, "False"},
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-length", ".length", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&max_length, "length", "Length", DEF_LENGTH, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+draw_face (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ int i;
+ GLfloat t = thickness / 2;
+ GLfloat a = -0.5;
+ GLfloat b = 0.5;
+
+ if (t <= 0) t = 0.001;
+ else if (t > 0.5) t = 0.5;
+
+ glPushMatrix();
+ glFrontFace(GL_CW);
+
+ for (i = 0; i < 4; i++)
+ {
+ glNormal3f (0, 0, -1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (a, a, a);
+ glVertex3f (b, a, a);
+ glVertex3f (b-t, a+t, a);
+ glVertex3f (a+t, a+t, a);
+ glEnd();
+
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (b-t, a+t, a);
+ glVertex3f (b-t, a+t, a+t);
+ glVertex3f (a+t, a+t, a+t);
+ glVertex3f (a+t, a+t, a);
+ glEnd();
+
+ glRotatef(90, 0, 0, 1);
+ }
+ glPopMatrix();
+}
+
+static void
+draw_faces (ModeInfo *mi)
+{
+ glPushMatrix();
+ draw_face (mi);
+ glRotatef (90, 0, 1, 0); draw_face (mi);
+ glRotatef (90, 0, 1, 0); draw_face (mi);
+ glRotatef (90, 0, 1, 0); draw_face (mi);
+ glRotatef (90, 1, 0, 0); draw_face (mi);
+ glRotatef (180, 1, 0, 0); draw_face (mi);
+ glPopMatrix();
+}
+
+
+static void
+new_cube_colors (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ bp->ncolors = 128;
+ if (bp->colors) free (bp->colors);
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ for (i = 0; i < MI_COUNT(mi); i++)
+ bp->subcubes[i].ccolor = random() % bp->ncolors;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 45.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ')
+ {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ new_cube_colors (mi);
+ return True;
+ }
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (MI_COUNT(mi) <= 0) MI_COUNT(mi) = 1;
+
+ bp->trackball = gltrackball_init (True);
+ bp->subcubes = (subcube *) calloc (MI_COUNT(mi), sizeof(subcube));
+
+ bp->hist_count = 0;
+ bp->hist_size = 100;
+ bp->hist = (histcube *) malloc (bp->hist_size * sizeof(*bp->hist));
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ double wander_speed, spin_speed, spin_accel;
+
+ if (i == 0)
+ {
+ wander_speed = 0.05 * speed;
+ spin_speed = 10.0 * speed;
+ spin_accel = 4.0 * speed;
+ }
+ else
+ {
+ wander_speed = 0;
+ spin_speed = 4.0 * speed;
+ spin_accel = 2.0 * speed;
+ }
+
+ bp->subcubes[i].rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ }
+
+ bp->colors = 0;
+ new_cube_colors (mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ bp->cube_list = glGenLists (1);
+ glNewList (bp->cube_list, GL_COMPILE);
+ draw_faces (mi);
+ glEndList ();
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+/* Originally, this program achieved the "accumulating cubes" effect by
+ simply not clearing the depth or color buffers between frames. That
+ doesn't work on modern systems, particularly mobile: you can no longer
+ rely on your buffers being unmolested once you have yielded. So now we
+ must save and re-render every polygon. Noof has the same problem and
+ solves it by taking a screenshot of the frame buffer into a texture, but
+ cubestorm needs to restore the depth buffer as well as the color buffer.
+ */
+static void
+push_hist (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ double px, py, pz;
+ double rx = 0, ry = 0, rz = 0;
+ int i;
+
+ if (bp->hist_count > max_length &&
+ bp->hist_count > MI_COUNT(mi) &&
+ !bp->button_down_p)
+ {
+ /* Drop history off of the end. */
+ memmove (bp->hist,
+ bp->hist + MI_COUNT(mi),
+ (bp->hist_count - MI_COUNT(mi)) * sizeof(*bp->hist));
+ bp->hist_count -= MI_COUNT(mi);
+ }
+
+ if (bp->hist_count + MI_COUNT(mi) >= bp->hist_size)
+ {
+ bp->hist_size = bp->hist_count + MI_COUNT(mi) + 100;
+ bp->hist = (histcube *)
+ realloc (bp->hist, bp->hist_size * sizeof(*bp->hist));
+ }
+
+ get_position (bp->subcubes[0].rot, &px, &py, &pz, !bp->button_down_p);
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ subcube *sc = &bp->subcubes[i];
+ histcube *hc = &bp->hist[bp->hist_count];
+ double rx2, ry2, rz2;
+
+ get_rotation (sc->rot, &rx2, &ry2, &rz2, !bp->button_down_p);
+
+ if (i == 0) /* N+1 cubes rotate relative to cube 0 */
+ rx = rx2, ry = ry2, rz = rz2;
+ else
+ rx2 += rx, ry2 += ry, rz2 += rz;
+
+ hc->px = px;
+ hc->py = py;
+ hc->pz = pz;
+ hc->rx = rx2;
+ hc->ry = ry2;
+ hc->rz = rz2;
+ hc->ccolor = sc->ccolor;
+ sc->ccolor++;
+ if (sc->ccolor >= bp->ncolors)
+ sc->ccolor = 0;
+ bp->hist_count++;
+ }
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (bp->clear_p) /* we're in "no vapor trails" mode */
+ {
+ bp->hist_count = 0;
+ if (! (random() % (int) (25 / speed)))
+ bp->clear_p = False;
+ }
+ else
+ {
+ if (! (random() % (int) (200 / speed)))
+ {
+ bp->clear_p = True;
+ new_cube_colors (mi);
+ }
+ }
+
+ push_hist (mi);
+ mi->polygon_count = 0;
+ for (i = 0; i < bp->hist_count; i++)
+ {
+ GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat bshiny = 128.0;
+
+ histcube *hc = &bp->hist[i];
+
+ glPushMatrix();
+ glScalef (1.1, 1.1, 1.1);
+
+ glTranslatef((hc->px - 0.5) * 15,
+ (hc->py - 0.5) * 15,
+ (hc->pz - 0.5) * 30);
+ gltrackball_rotate (bp->trackball);
+
+ glScalef (4.0, 4.0, 4.0);
+
+ glRotatef (hc->rx * 360, 1.0, 0.0, 0.0);
+ glRotatef (hc->ry * 360, 0.0, 1.0, 0.0);
+ glRotatef (hc->rz * 360, 0.0, 0.0, 1.0);
+
+ bcolor[0] = bp->colors[hc->ccolor].red / 65536.0;
+ bcolor[1] = bp->colors[hc->ccolor].green / 65536.0;
+ bcolor[2] = bp->colors[hc->ccolor].blue / 65536.0;
+
+ if (wire)
+ glColor3f (bcolor[0], bcolor[1], bcolor[2]);
+ else
+ {
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+ }
+
+ glCallList (bp->cube_list);
+ mi->polygon_count += (4 * 2 * 6);
+
+ glPopMatrix();
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("CubeStorm", cubestorm, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubestorm.man b/hacks/glx/cubestorm.man
new file mode 100644
index 0000000..9d912fd
--- /dev/null
+++ b/hacks/glx/cubestorm.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubestorm - a series of 3D boxes that fill space
+.SH SYNOPSIS
+.B cubestorm
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIfloat\fP]
+[\-count \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a series of rotating 3D boxes that intersect each other and
+eventually fill space.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-count \fInumber\fP
+Number of cubes. Default 4.
+.TP 8
+.B \-thickness \fIfloat\fP
+How thick the struts making up the cubes should be (0.0-1.0). Default 0.06.
+.TP 8
+.B \-wander | \-no-wander
+Whether the cubes should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the cubes should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubetwist.c b/hacks/glx/cubetwist.c
new file mode 100644
index 0000000..61af287
--- /dev/null
+++ b/hacks/glx/cubetwist.c
@@ -0,0 +1,595 @@
+/* cubetwist, Copyright (c) 2016-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_FLAT "True"
+#define DEF_THICKNESS "0.0"
+#define DEF_DISPLACEMENT "0.0"
+
+typedef struct cube cube;
+struct cube {
+ GLfloat size, thickness;
+ XYZ pos, rot;
+ GLfloat color[4];
+ cube *next;
+};
+
+typedef struct oscillator oscillator;
+struct oscillator {
+ double ratio, from, to, speed, *var;
+ int remaining;
+ oscillator *next;
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ cube *cubes;
+ oscillator *oscillators;
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static Bool do_flat;
+static Bool do_spin;
+static GLfloat speed;
+static GLfloat thickness;
+static GLfloat displacement;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-flat", ".flat", XrmoptionNoArg, "True" },
+ { "+flat", ".flat", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-displacement", ".displacement", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_flat, "flat", "flat", DEF_FLAT, t_Bool},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&displacement, "displacement", "Displacement", DEF_DISPLACEMENT, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static int
+draw_strut (ModeInfo *mi, cube *c)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ glPushMatrix();
+ glFrontFace (GL_CW);
+ glNormal3f (0, 0, -1);
+ glTranslatef (-c->size/2, -c->size/2, -c->size/2);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0, 0, 0);
+ glVertex3f (c->size, 0, 0);
+ glVertex3f (c->size - c->thickness, c->thickness, 0);
+ glVertex3f (c->thickness, c->thickness, 0);
+ glEnd();
+ polys += 2;
+
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (c->thickness, c->thickness, 0);
+ glVertex3f (c->size - c->thickness, c->thickness, 0);
+ glVertex3f (c->size - c->thickness, c->thickness, c->thickness);
+ glVertex3f (c->thickness, c->thickness, c->thickness);
+ glEnd();
+ polys += 2;
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static int
+draw_cubes (ModeInfo *mi, cube *c)
+{
+ int polys = 0;
+ int i, j;
+
+ glColor4fv (c->color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c->color);
+
+ glPushMatrix();
+ for (j = 0; j < 6; j++)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ polys += draw_strut (mi, c);
+ glRotatef (90, 0, 0, 1);
+ }
+ if (j == 3)
+ glRotatef (90, 0, 0, 1);
+ if (j < 4)
+ glRotatef (90, 0, 1, 0);
+ else
+ glRotatef (180, 1, 0, 0);
+ }
+ glPopMatrix();
+
+ if (c->next)
+ {
+ /* This leaves rotations on the prevailing matrix stack, but since
+ this is a tail-call, that's fine. Don't blow the matrix stack. */
+ glRotatef (c->rot.x, 1, 0, 0);
+ glRotatef (c->rot.y, 0, 1, 0);
+ glRotatef (c->rot.z, 0, 0, 1);
+ glTranslatef (c->pos.x, c->pos.y, c->pos.z);
+ c->next->pos = c->pos;
+ c->next->rot = c->rot;
+ polys += draw_cubes (mi, c->next);
+ }
+
+ check_gl_error("cubetwist");
+ return polys;
+}
+
+
+static void
+make_cubes (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat step = 2 * (thickness + displacement);
+ GLfloat size = 1.0;
+ cube *tail = 0;
+ GLfloat cc[4], cstep;
+ int depth = 0;
+ cube *c;
+
+ cc[0] = 0.3 + frand(0.7);
+ cc[1] = 0.3 + frand(0.7);
+ cc[2] = 0.3 + frand(0.7);
+ cc[3] = 1;
+
+ if (bp->cubes) abort();
+ while (1)
+ {
+ cube *c = (cube *) calloc (1, sizeof (*c));
+ c->size = size;
+ c->thickness = thickness;
+ if (tail)
+ tail->next = c;
+ else
+ bp->cubes = c;
+ tail = c;
+
+ depth++;
+ size -= step;
+ if (size <= step)
+ break;
+ }
+
+ cstep = 0.8 / depth;
+ for (c = bp->cubes; c; c = c->next)
+ {
+ memcpy (c->color, cc, sizeof(cc));
+ cc[0] -= cstep;
+ cc[1] -= cstep;
+ cc[2] -= cstep;
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.5;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+static void
+tick_oscillators (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ oscillator *prev = 0;
+ oscillator *a = bp->oscillators;
+ GLfloat tick = 0.1 / speed;
+
+ while (a)
+ {
+ oscillator *next = a->next;
+ a->ratio += tick * a->speed;
+ if (a->ratio > 1)
+ a->ratio = 1;
+
+ *a->var = a->from + (a->to - a->from) * ease_ratio (a->ratio);
+
+ if (a->ratio < 1) /* mid cycle */
+ prev = a;
+ else if (--a->remaining <= 0) /* ended, and expired */
+ {
+ if (prev)
+ prev->next = next;
+ else
+ bp->oscillators = next;
+ free (a);
+ }
+ else /* keep going the other way */
+ {
+ GLfloat swap = a->from;
+ a->from = a->to;
+ a->to = swap;
+ a->ratio = 0;
+ prev = a;
+ }
+
+ a = next;
+ }
+}
+
+
+static void
+add_oscillator (ModeInfo *mi, double *var, GLfloat speed, GLfloat to,
+ int repeat)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ oscillator *a;
+
+ /* If an oscillator is already running on this variable, don't
+ add another. */
+ for (a = bp->oscillators; a && a->next; a = a->next)
+ if (a->var == var)
+ return;
+
+ a = (oscillator *) calloc (1, sizeof (*a));
+ if (repeat <= 0) abort();
+ a->ratio = 0;
+ a->from = *var;
+ a->to = to;
+ a->speed = speed;
+ a->var = var;
+ a->remaining = repeat;
+ a->next = bp->oscillators;
+ bp->oscillators = a;
+# if 0
+ fprintf (stderr, "%s: %3d %6.2f -> %6.2f %s\n",
+ progname, repeat, *var, to,
+ (var == &bp->midpoint.z ? "z" :
+ var == &bp->tilt ? "tilt" :
+ var == &bp->axial_radius ? "r" :
+ var == &bp->speed ? "speed" : "?"));
+# endif
+}
+
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+static void
+add_random_oscillator (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ cube *c = bp->cubes;
+ double s1 = speed * 0.07;
+ double s2 = speed * 0.3;
+ double disp = (thickness + displacement);
+ int c1 = 1 + ((random() % 4) ? 0 : (random() % 3));
+ int c2 = 2;
+ int n = random() % 6;
+
+ switch (n) {
+ case 0: add_oscillator (mi, &c->rot.x, s1, 90 * RANDSIGN(), c1); break;
+ case 1: add_oscillator (mi, &c->rot.y, s1, 90 * RANDSIGN(), c1); break;
+ case 2: add_oscillator (mi, &c->rot.z, s1, 90 * RANDSIGN(), c1); break;
+ case 3: add_oscillator (mi, &c->pos.x, s2, disp * RANDSIGN(), c2); break;
+ case 4: add_oscillator (mi, &c->pos.y, s2, disp * RANDSIGN(), c2); break;
+ case 5: add_oscillator (mi, &c->pos.z, s2, disp * RANDSIGN(), c2); break;
+ default: abort(); break;
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ while (bp->cubes)
+ {
+ cube *c = bp->cubes->next;
+ free (bp->cubes);
+ bp->cubes = c;
+ }
+
+ while (bp->oscillators)
+ {
+ oscillator *o = bp->oscillators->next;
+ free (bp->oscillators);
+ bp->oscillators = o;
+ }
+
+ if (random() & 1)
+ {
+ thickness = 0.03 + frand(0.02);
+ displacement = (random() & 1) ? 0 : (thickness / 3);
+ }
+ else
+ {
+ thickness = 0.001 + frand(0.02);
+ displacement = 0;
+ }
+
+ make_cubes (mi);
+
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire && !do_flat)
+ {
+ GLfloat color[4] = {1, 1, 1, 1};
+ GLfloat cspec[4] = {1, 1, 0, 1};
+ static const GLfloat shiny = 30;
+
+ static GLfloat pos0[4] = { 0.5, -1, -0.5, 0};
+ static GLfloat pos1[4] = {-0.75, -1, 0, 0};
+ static GLfloat amb[4] = {0, 0, 0, 1};
+ static GLfloat dif[4] = {1, 1, 1, 1};
+ static GLfloat spc[4] = {1, 1, 1, 1};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ }
+
+ {
+ double spin_speed = 0.05;
+ double wander_speed = 0.005;
+ double spin_accel = 1.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (thickness > 0.5)
+ thickness = 0.5;
+ if (displacement > 0.5)
+ displacement = 0.5;
+
+ if (thickness <= 0.0001)
+ {
+ if (random() & 1)
+ {
+ thickness = 0.03 + frand(0.02);
+ displacement = (random() & 1) ? 0 : (thickness / 3);
+ }
+ else
+ {
+ thickness = 0.001 + frand(0.02);
+ displacement = 0;
+ }
+ }
+
+ make_cubes (mi);
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 4,
+ (y - 0.5) * 4,
+ (z - 0.5) * 2);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (6, 6, 6);
+
+ mi->polygon_count = draw_cubes (mi, bp->cubes);
+ glPopMatrix ();
+
+ if (!bp->button_down_p)
+ tick_oscillators (mi);
+
+ if (! bp->oscillators &&
+ !bp->button_down_p &&
+ !(random() % 60))
+ {
+ bp->cubes->pos.x = bp->cubes->pos.y = bp->cubes->pos.z = 0;
+ bp->cubes->rot.x = bp->cubes->rot.y = bp->cubes->rot.z = 0;
+ add_random_oscillator (mi);
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ while (bp->cubes)
+ {
+ cube *c = bp->cubes->next;
+ free (bp->cubes);
+ bp->cubes = c;
+ }
+
+ while (bp->oscillators)
+ {
+ oscillator *o = bp->oscillators->next;
+ free (bp->oscillators);
+ bp->oscillators = o;
+ }
+}
+
+
+XSCREENSAVER_MODULE_2 ("CubeTwist", cubetwist, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubetwist.man b/hacks/glx/cubetwist.man
new file mode 100644
index 0000000..3a6574b
--- /dev/null
+++ b/hacks/glx/cubetwist.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubetwist - A series of nested cubes rotate and slide recursively.
+.SH SYNOPSIS
+.B cubetwist
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-displacement \fInumber\fP]
+[\-no-flat]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+A series of nested cubes rotate and slide recursively.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of the cube edges. 0.005 - 0.2. Default: 0.05.
+.TP 8
+.B \-displacement \fInumber\fP
+Displacement between nested cubes. 0.0 - 0.2. Default: 0.01.
+.TP 8
+.B \-flat | \-no-flat
+Whether to use flat shading, or lighting. Default flat.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubicgrid.c b/hacks/glx/cubicgrid.c
new file mode 100644
index 0000000..34b6c34
--- /dev/null
+++ b/hacks/glx/cubicgrid.c
@@ -0,0 +1,269 @@
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Cubic Grid - a 3D lattice. The observer is located in the centre of
+ * a spinning finite lattice. As it rotates, various view-throughs appear and
+ * evolve. A simple idea with interesting results.
+ *
+ * Vasek Potocek (Dec-28-2007)
+ * vasek.potocek@post.cz
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cubicgrid 0
+# define release_cubicgrid 0
+#include "xlockmore.h"
+
+#ifdef USE_GL
+
+#define DEF_SPEED "1.0"
+#define DEF_DIV "30"
+#define DEF_ZOOM "20"
+#define DEF_BIGDOTS "True"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "rotator.h"
+#include "gltrackball.h"
+
+/*************************************************************************/
+
+static int ticks;
+static float size;
+static float speed;
+static Bool bigdots;
+
+static argtype vars[] = {
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float },
+ { &size, "zoom", "Zoom", DEF_ZOOM, t_Float },
+ { &ticks, "ticks", "Ticks", DEF_DIV, t_Int },
+ { &bigdots, "bigdots", "BigDots", DEF_BIGDOTS, t_Bool },
+};
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-zoom", ".zoom", XrmoptionSepArg, 0 },
+ { "-ticks", ".ticks", XrmoptionSepArg, 0 },
+ { "-bigdots", ".bigdots", XrmoptionNoArg, "True" },
+ { "+bigdots", ".bigdots", XrmoptionNoArg, "False" },
+};
+
+ENTRYPOINT ModeSpecOpt cubicgrid_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct cubicgrid_description =
+{ "cubicgrid", "init_cubicgrid", "draw_cubicgrid", NULL,
+ "draw_cubicgrid", "change_cubicgrid", NULL, &cubicgrid_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows a rotating 3D lattice from inside", 0, NULL
+};
+#endif
+
+typedef struct {
+ GLXContext *glx_context;
+ GLfloat ratio;
+ GLint list;
+
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int npoints;
+} cubicgrid_conf;
+
+static cubicgrid_conf *cubicgrid = NULL;
+
+static const GLfloat zpos = -18.0;
+
+/*************************************************************************/
+
+ENTRYPOINT Bool
+cubicgrid_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+static Bool draw_main(ModeInfo *mi)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ double x, y, z;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ glLoadIdentity();
+
+ glRotatef (180, 1, 0, 0); /* Make trackball track the right way */
+ glRotatef (180, 0, 1, 0);
+
+ glTranslatef(0, 0, zpos);
+
+ glScalef(size/ticks, size/ticks, size/ticks);
+
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1);
+ }
+# endif
+
+ gltrackball_rotate (cp->trackball);
+
+ get_rotation (cp->rot, &x, &y, &z, !cp->button_down_p);
+ glRotatef (-x * 360, 1.0, 0.0, 0.0);
+ glRotatef (-y * 360, 0.0, 1.0, 0.0);
+ glRotatef (-z * 360, 0.0, 0.0, 1.0);
+
+ glTranslatef(-ticks/2.0, -ticks/2.0, -ticks/2.0);
+ glCallList(cp->list);
+ return True;
+}
+
+static void init_gl(ModeInfo *mi)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ int x, y, z;
+ float tf = ticks;
+
+ glDrawBuffer(GL_BACK);
+ if(bigdots) {
+ glPointSize(2.0);
+ }
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glShadeModel(GL_FLAT);
+
+ cp->list = glGenLists(1);
+ glNewList(cp->list, GL_COMPILE);
+ if(MI_IS_MONO(mi)) {
+ glColor3f(1.0, 1.0, 1.0);
+ glBegin(GL_POINTS);
+ for(x = 0; x < ticks; x++) {
+ for(y = 0; y < ticks; y++) {
+ for(z = 0; z < ticks; z++) {
+ glVertex3f(x, y, z);
+ cp->npoints++;
+ }
+ }
+ }
+ glEnd();
+ }
+ else
+ {
+ glBegin(GL_POINTS);
+ for(x = 0; x < ticks; x++) {
+ for(y = 0; y < ticks; y++) {
+ for(z = 0; z < ticks; z++) {
+ glColor3f(x/tf, y/tf, z/tf);
+ glVertex3f(x, y, z);
+ cp->npoints++;
+ }
+ }
+ }
+ glEnd();
+ }
+ glEndList();
+}
+
+/*************************************************************************/
+
+ENTRYPOINT void reshape_cubicgrid(ModeInfo *mi, int width, int height)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ int y = 0;
+ if(!height) height = 1;
+ cp->ratio = (GLfloat)width/(GLfloat)height;
+
+ if (width > height * 3) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ cp->ratio = (GLfloat)width/(GLfloat)height;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, cp->ratio, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT void init_cubicgrid(ModeInfo *mi)
+{
+ cubicgrid_conf *cp;
+ MI_INIT(mi, cubicgrid);
+ cp = &cubicgrid[MI_SCREEN(mi)];
+
+ if ((cp->glx_context = init_GL(mi)) != NULL) {
+ init_gl(mi);
+ reshape_cubicgrid(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ {
+ double spin_speed = 0.045 * speed;
+ double spin_accel = 0.005 * speed;
+
+ cp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel, 0, True);
+ cp->trackball = gltrackball_init (True);
+ }
+}
+
+ENTRYPOINT void draw_cubicgrid(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ cubicgrid_conf *cp;
+ if (!cubicgrid) return;
+ cp = &cubicgrid[MI_SCREEN(mi)];
+ MI_IS_DRAWN(mi) = True;
+ if (!cp->glx_context) return;
+ glXMakeCurrent(display, window, *(cp->glx_context));
+ if (!draw_main(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+ mi->polygon_count = cp->npoints;
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_cubicgrid(ModeInfo * mi)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ if (!cp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+ init_gl(mi);
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("CubicGrid", cubicgrid)
+
+#endif
diff --git a/hacks/glx/cubicgrid.man b/hacks/glx/cubicgrid.man
new file mode 100644
index 0000000..d267bc3
--- /dev/null
+++ b/hacks/glx/cubicgrid.man
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "Dec-28-07" "X Version 11"
+.SH NAME
+cubicgrid - rotating 3D lattice seen from inside
+.SH SYNOPSIS
+.B cubicgrid
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-delay \fImicroseconds\fP]
+[\-mono]
+[\-speed \fInumber\fP]
+[\-zoom \fInumber\fP]
+[\-ticks \fInumber\fP]
+[\-bigdots]
+[\-fps]
+.SH DESCRIPTION
+This program shows the view of an observer located inside a set of points
+arranged to a 3D lattice. As the lattice rotates, various view-throughs appear
+and evolve. A simple idea with interesting results.
+.SH OPTIONS
+.I cubicgrid
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-mono
+Draw in black and white. If not used, a fixed all-color scheme is chosen.
+.TP 8
+.B \-speed \fInumber\fP
+The maximum speed of the rotation. The actual speed and axis change smoothly
+for better effect. 0.5 - 10. The default is 1.0.
+.TP 8
+.B \-zoom \fInumber\fP
+Size of the lattice. Ideally it should fill all the screen, but one may find
+other values also interesting. 5 - 50. The default of 20 should do for common
+screen aspect ratios.
+.TP 8
+.B \-ticks \fInumber\fP
+The count of points drawn along every axis. 10 - 100. The default is 30.
+.TP 8
+.B \-bigdots
+Draw the points twice as big.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Vasek Potocek. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear in
+all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Vasek Potocek <vasek.potocek@post.cz>, Dec-28-07.
diff --git a/hacks/glx/curlicue.h b/hacks/glx/curlicue.h
new file mode 100644
index 0000000..0963d6e
--- /dev/null
+++ b/hacks/glx/curlicue.h
@@ -0,0 +1,261 @@
+/* curlicue.h --- A texture map containing a "curlicue" */
+
+#define TEX_DIMENSION 64
+static const unsigned char texture[TEX_DIMENSION*TEX_DIMENSION] = {
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 58, 43, 43, 43, 43, 45, 70, 70, 70,
+ 70, 70, 70, 70, 74, 98, 98, 98,100,194,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 30,186,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1,111,244,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43,198,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 5,123,248,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 50,209,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,138, 4,
+ 66,229,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,170,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,153, 0, 0,
+ 0, 53,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 6,188,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,213, 7, 0, 0,
+ 0, 0,226,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0, 0, 0, 47, 0, 0,
+ 0, 0, 22,225,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,254, 54, 0, 0, 0,
+ 0, 81,254,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0, 0, 56,247, 82, 0,
+ 0, 0, 0, 59,253,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,152, 0, 0, 0, 0,
+ 52,243,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0, 8,215,255,250, 56,
+ 0, 0, 0, 0,142,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,241, 19, 0, 0, 0, 15,
+ 220,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0,129,255,255,255,230,
+ 23, 0, 0, 0, 12,230,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,131, 0, 0, 0, 0,157,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 49,250,255,255,255,255,
+ 171, 0, 0, 0, 0,112,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,246, 19, 0, 0, 0, 54,253,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 5,208,255,255,255,255,255,
+ 255, 77, 0, 0, 0, 9,231,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,163, 0, 0, 0, 0,186,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0,121,255,255,255,255,255,255,
+ 255,211, 2, 0, 0, 0,134,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255, 69, 0, 0, 0, 50,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 41,247,255,255,255,255,255,255,
+ 255,255, 73, 0, 0, 0, 38,254,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,237, 4, 0, 0, 0,145,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 52,201,255,255,255,255,255,255,255,
+ 255,255,169, 0, 0, 0, 0,216,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,181, 0, 0, 0, 0,229,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,186,255,255,255,255,255,255,255,255,
+ 255,255,247, 7, 0, 0, 0,150,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,130, 0, 0, 0, 42,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255, 67, 0, 0, 0, 91,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 79, 0, 0, 0, 95,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,120, 0, 0, 0, 56,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 55, 0, 0, 0,130,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,157, 0, 0, 0, 21,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 34, 0, 0, 0,161,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,179, 0, 0, 0, 2,250,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 27, 0, 0, 0,168,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,200, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 27, 0, 0, 0,168,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,200, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 27, 0, 0, 0,163,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,183, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 42, 0, 0, 0,135,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,161, 0, 0, 0, 17,254,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 76, 0, 0, 0,100,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,126, 0, 0, 0, 48,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,114, 0, 0, 0, 53,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255, 78, 0, 0, 0, 84,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,165, 0, 0, 0, 3,241,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,252, 16, 0, 0, 0,139,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,228, 0, 0, 0, 0,161,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,192, 0, 0, 0, 0,198,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255, 46, 0, 0, 0, 67,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255, 93, 0, 0, 0, 21,250,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,139, 0, 0, 0, 1,211,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,226, 7, 0, 0, 0,108,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,230, 6, 0, 0, 0, 79,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,106, 0, 0, 0, 1,206,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255, 97, 0, 0, 0, 0,183,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 202, 3, 0, 0, 0, 67,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,221, 8, 0, 0, 0, 27,
+ 235,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,
+ 40, 0, 0, 0, 0,198,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,126, 0, 0, 0, 0,
+ 71,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,253, 85,
+ 0, 0, 0, 0, 96,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,247, 44, 0, 0, 0,
+ 0, 91,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,116, 0,
+ 0, 0, 0, 25,233,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,216, 11, 0, 0,
+ 0, 0, 90,251,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,252,112, 0, 0,
+ 0, 0, 4,191,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,174, 4, 0,
+ 0, 0, 0, 72,235,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,242, 84, 0, 0, 0,
+ 0, 0,146,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,150, 1,
+ 0, 0, 0, 0, 27,181,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,194, 39, 0, 0, 0, 0,
+ 0,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,151,
+ 4, 0, 0, 0, 0, 0, 77,209,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,216, 92, 1, 0, 0, 0, 0, 0,
+ 125,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 175, 12, 0, 0, 0, 0, 0, 1, 70,164,241,255,255,255,255,255,
+ 255,255,255,255,255,242,171, 77, 2, 0, 0, 0, 0, 0, 4,150,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,214, 41, 0, 0, 0, 0, 0, 0, 0, 4, 48, 98,138,163,163,
+ 163,163,140,103, 55, 5, 0, 0, 0, 0, 0, 0, 0, 30,199,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,245,125, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105,240,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,222,100, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 83,210,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,228,136, 45, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 37,125,220,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,225,166,112, 74, 43, 32, 12,
+ 8, 32, 40, 71,105,162,218,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+};
diff --git a/hacks/glx/dangerball.c b/hacks/glx/dangerball.c
new file mode 100644
index 0000000..e40ccc5
--- /dev/null
+++ b/hacks/glx/dangerball.c
@@ -0,0 +1,364 @@
+/* dangerball, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_ball 0
+# define release_ball 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "0.05"
+
+#define SPIKE_FACES 12 /* how densely to render spikes */
+#define SMOOTH_SPIKES True
+#define SPHERE_SLICES 32 /* how densely to render spheres */
+#define SPHERE_STACKS 16
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint ball_list;
+ GLuint spike_list;
+
+ GLfloat pos;
+ int *spikes;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+ int color_shift;
+
+} ball_configuration;
+
+static ball_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_ball (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+randomize_spikes (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ bp->pos = 0;
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ bp->spikes[i*2] = (random() % 360) - 180;
+ bp->spikes[i*2+1] = (random() % 180) - 90;
+ }
+
+# define ROT_SCALE 22
+ for (i = 0; i < MI_COUNT(mi) * 2; i++)
+ bp->spikes[i] = (bp->spikes[i] / ROT_SCALE) * ROT_SCALE;
+
+ if ((random() % 3) == 0)
+ bp->color_shift = random() % (bp->ncolors / 2);
+ else
+ bp->color_shift = 0;
+}
+
+static void
+draw_spikes (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat diam = 0.2;
+ GLfloat pos = bp->pos;
+ int i;
+
+ if (pos < 0) pos = -pos;
+
+ pos = (asin (0.5 + pos/2) - 0.5) * 2;
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ glPushMatrix();
+ glRotatef(bp->spikes[i*2], 0, 1, 0);
+ glRotatef(bp->spikes[i*2+1], 0, 0, 1);
+ glTranslatef(0.7, 0, 0);
+ glRotatef(-90, 0, 0, 1);
+ glScalef (diam, pos, diam);
+ glCallList (bp->spike_list);
+ glPopMatrix();
+
+ mi->polygon_count += (SPIKE_FACES + 1);
+ }
+}
+
+
+static void
+move_spikes (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->pos >= 0) /* moving outward */
+ {
+ bp->pos += speed;
+ if (bp->pos >= 1) /* reverse gears at apex */
+ bp->pos = -1;
+ }
+ else /* moving inward */
+ {
+ bp->pos += speed;
+ if (bp->pos >= 0) /* stop at end */
+ randomize_spikes (mi);
+ }
+}
+
+
+ENTRYPOINT Bool
+ball_handle_event (ModeInfo *mi, XEvent *event)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_ball (ModeInfo *mi)
+{
+ ball_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ double spin_speed = 10.0;
+ double wander_speed = 0.12;
+ double spin_accel = 2.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->ncolors = 128;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ bp->spikes = (int *) calloc(MI_COUNT(mi), sizeof(*bp->spikes) * 2);
+
+ bp->ball_list = glGenLists (1);
+ bp->spike_list = glGenLists (1);
+
+ glNewList (bp->ball_list, GL_COMPILE);
+ unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
+ glEndList ();
+
+ glNewList (bp->spike_list, GL_COMPILE);
+ cone (0, 0, 0,
+ 0, 1, 0,
+ 1, 0, SPIKE_FACES, SMOOTH_SPIKES, False, wire);
+ glEndList ();
+
+ randomize_spikes (mi);
+}
+
+
+ENTRYPOINT void
+draw_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int c2;
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat sspec[4] = {0.0, 0.0, 0.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+ static const GLfloat sshiny = 0.0;
+
+ GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat scolor[4] = {0.0, 0.0, 0.0, 1.0};
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ bcolor[0] = bp->colors[bp->ccolor].red / 65536.0;
+ bcolor[1] = bp->colors[bp->ccolor].green / 65536.0;
+ bcolor[2] = bp->colors[bp->ccolor].blue / 65536.0;
+
+ c2 = (bp->ccolor + bp->color_shift) % bp->ncolors;
+ scolor[0] = bp->colors[c2].red / 65536.0;
+ scolor[1] = bp->colors[c2].green / 65536.0;
+ scolor[2] = bp->colors[c2].blue / 65536.0;
+
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+ mi->polygon_count = 0;
+
+ glScalef (2.0, 2.0, 2.0);
+
+ move_spikes (mi);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+ glCallList (bp->ball_list);
+ mi->polygon_count += (SPHERE_SLICES * SPHERE_STACKS);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, sspec);
+ glMaterialf (GL_FRONT, GL_SHININESS, sshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, scolor);
+ draw_spikes (mi);
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("DangerBall", dangerball, ball)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/dangerball.man b/hacks/glx/dangerball.man
new file mode 100644
index 0000000..3e33f82
--- /dev/null
+++ b/hacks/glx/dangerball.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+dangerball - a 3D ball that periodically extrudes spikes. Ouch!
+.SH SYNOPSIS
+.B dangerball
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a ball that periodically extrudes many random spikes. Ouch!
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Spike growth frequency. 0.0 - 0.25. Default: 0.05.
+.TP 8
+.B \-count \fInumber\fP
+Number o spikes. Default: 30.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/discoball.c b/hacks/glx/discoball.c
new file mode 100644
index 0000000..4085c56
--- /dev/null
+++ b/hacks/glx/discoball.c
@@ -0,0 +1,707 @@
+/* discoball, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_ball 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "False"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+
+typedef struct tile tile;
+struct tile {
+ XYZ position, normal;
+ GLfloat size, tilt;
+ tile *next;
+};
+
+
+typedef struct {
+ XYZ normal;
+ GLfloat color[4];
+} ray;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ GLfloat th;
+ trackball_state *trackball;
+ Bool button_down_p;
+ tile *tiles;
+ int nrays;
+ ray *rays;
+} ball_configuration;
+
+static ball_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static XYZ
+normalize (XYZ p)
+{
+ GLfloat d = sqrt(p.x*p.x + p.y*p.y * p.z*p.z);
+ if (d < 0.0000001)
+ p.x = p.y = p.z = 0;
+ else
+ {
+ p.x /= d;
+ p.y /= d;
+ p.z /= d;
+ }
+
+ return p;
+}
+
+
+static void
+build_texture (ModeInfo *mi)
+{
+ int x, y;
+ int size = 128;
+ int bpl = size * 2;
+ unsigned char *data = malloc (bpl * size);
+
+ for (y = 0; y < size; y++)
+ {
+ for (x = 0; x < size; x++)
+ {
+ unsigned char *c = &data [y * bpl + x * 2];
+ GLfloat X = (x / (GLfloat) (size-1)) - 0.5;
+ GLfloat Y = (y / (GLfloat) (size-1)) - 0.5;
+ X = cos (X * X * 6.2);
+ Y = cos (Y * Y * 6.2);
+ X = X < Y ? X : Y;
+ X *= 0.4;
+ c[0] = 0xFF;
+ c[1] = 0xFF * X;
+ }
+ }
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ check_gl_error ("texture param");
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, size, size, 0,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);
+ check_gl_error ("light texture");
+ free (data);
+}
+
+
+static int
+draw_rays (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ int i;
+
+ glEnable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+
+ for (i = 0; i < bp->nrays; i++)
+ {
+ GLfloat x = bp->rays[i].normal.x;
+ GLfloat y = bp->rays[i].normal.y;
+ GLfloat z = bp->rays[i].normal.z;
+ glPushMatrix();
+
+ /* Orient to direction of ray. */
+ glRotatef (-atan2 (x, y) * (180 / M_PI), 0, 0, 1);
+ glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180 / M_PI), 1, 0, 0);
+
+ glScalef (5, 5, 10);
+ glTranslatef(0, 0, 1.1);
+ glColor4fv (bp->rays[i].color);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f (0, 0); glVertex3f (-0.5, 0, -1);
+ glTexCoord2f (1, 0); glVertex3f ( 0.5, 0, -1);
+ glTexCoord2f (1, 1); glVertex3f ( 0.5, 0, 1);
+ glTexCoord2f (0, 1); glVertex3f (-0.5, 0, 1);
+ glEnd();
+ polys++;
+ glPopMatrix();
+ }
+
+ glDisable (GL_TEXTURE_2D);
+ glEnable (GL_LIGHTING);
+ glDisable (GL_BLEND);
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_FOG);
+
+ return polys;
+}
+
+
+static int
+draw_ball_1 (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ tile *t;
+ GLfloat m[4][4];
+
+ glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]);
+
+ glFrontFace (GL_CW);
+
+#if 0
+ /* Draw the back rays.
+ */
+ if (! wire)
+ {
+ glPushMatrix();
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+ glTranslatef(0, 0, -4.1);
+ glRotatef (bp->th, 0, 0, 1);
+ polys += draw_rays (mi);
+ glPopMatrix();
+ }
+ glClear(GL_DEPTH_BUFFER_BIT);
+#endif
+
+
+ /* Instead of rendering polygons for the foam ball substrate, let's
+ just billboard a quad down the middle to mask out the back-facing
+ tiles. */
+ {
+ glPushMatrix();
+ m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
+ m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
+ m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+ glScalef (40, 40, 40);
+ glTranslatef (-0.5, -0.5, -0.01);
+ if (! wire)
+ glDisable (GL_LIGHTING);
+ /* Draw into the depth buffer but not the frame buffer */
+ glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glColor3f (0, 0, 0);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+ polys++;
+ glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ if (! wire)
+ glEnable (GL_LIGHTING);
+ glPopMatrix();
+ glColor3f (1, 1, 1);
+ }
+
+ /* Draw all the tiles.
+ */
+ for (t = bp->tiles; t; t = t->next)
+ {
+ GLfloat x = t->normal.x;
+ GLfloat y = t->normal.y;
+ GLfloat z = t->normal.z;
+ GLfloat s = t->size / 2;
+ glPushMatrix();
+
+ /* Move to location of tile. */
+ glTranslatef (t->position.x, t->position.y, t->position.z);
+
+ /* Orient to direction tile is facing. */
+ glRotatef (-atan2 (x, y) * (180 / M_PI), 0, 0, 1);
+ glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180 / M_PI), 1, 0, 0);
+
+ glRotatef (t->tilt, 0, 1, 0);
+
+ glScalef (s, s, s);
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-1, 0, -1);
+ glVertex3f ( 1, 0, -1);
+ glVertex3f ( 1, 0, 1);
+ glVertex3f (-1, 0, 1);
+ glEnd();
+ polys++;
+
+ if (! wire)
+ {
+ GLfloat d = 0.2;
+ glNormal3f (0, 0, -1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-1, 0, -1);
+ glVertex3f (-1, -d, -1);
+ glVertex3f ( 1, -d, -1);
+ glVertex3f ( 1, 0, -1);
+ glEnd();
+ polys++;
+
+ glNormal3f (0, 0, 1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f ( 1, 0, 1);
+ glVertex3f ( 1, -d, 1);
+ glVertex3f (-1, -d, 1);
+ glVertex3f (-1, 0, 1);
+ glEnd();
+ polys++;
+
+ glNormal3f (1, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f ( 1, 0, -1);
+ glVertex3f ( 1, -d, -1);
+ glVertex3f ( 1, -d, 1);
+ glVertex3f ( 1, 0, 1);
+ glEnd();
+ polys++;
+
+ glNormal3f (-1, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-1, 0, 1);
+ glVertex3f (-1, -d, 1);
+ glVertex3f (-1, -d, -1);
+ glVertex3f (-1, 0, -1);
+ glEnd();
+ polys++;
+ }
+
+ glPopMatrix();
+ }
+
+ /* Draw the front rays.
+ */
+ if (! wire)
+ {
+ glPushMatrix();
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+ glTranslatef(0, 0, 4.1);
+ glRotatef (-bp->th, 0, 0, 1);
+ polys += draw_rays (mi);
+ glPopMatrix();
+ }
+
+ return polys;
+}
+
+
+static GLfloat
+vector_angle (XYZ a, XYZ b)
+{
+ double La = sqrt (a.x*a.x + a.y*a.y + a.z*a.z);
+ double Lb = sqrt (b.x*b.x + b.y*b.y + b.z*b.z);
+ double cc, angle;
+
+ if (La == 0 || Lb == 0) return 0;
+ if (a.x == b.x && a.y == b.y && a.z == b.z) return 0;
+
+ /* dot product of two vectors is defined as:
+ La * Lb * cos(angle between vectors)
+ and is also defined as:
+ ax*bx + ay*by + az*bz
+ so:
+ La * Lb * cos(angle) = ax*bx + ay*by + az*bz
+ cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
+ angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
+ */
+ cc = (a.x*b.x + a.y*b.y + a.z*b.z) / (La * Lb);
+ if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
+ angle = acos (cc);
+
+ return (angle);
+}
+
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+static void
+build_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int rows = MI_COUNT (mi);
+
+ GLfloat tile_size = M_PI / rows;
+ GLfloat th0, th1;
+
+ struct { XYZ position; GLfloat strength; } dents[5];
+ int dent_count = random() % countof(dents);
+ int i;
+ for (i = 0; i < dent_count; i++)
+ {
+ GLfloat dist;
+ dents[i].position.x = RANDSIGN() * (2 - BELLRAND(0.2));
+ dents[i].position.y = RANDSIGN() * (2 - BELLRAND(0.2));
+ dents[i].position.z = RANDSIGN() * (2 - BELLRAND(0.2));
+ dist = sqrt (dents[i].position.x * dents[i].position.x +
+ dents[i].position.y * dents[i].position.y +
+ dents[i].position.z * dents[i].position.z);
+ dents[i].strength = dist - (1 - BELLRAND(0.3));
+ dents[i].strength = dist - (1 - BELLRAND(0.3));
+ }
+
+
+ for (th1 = M_PI/2; th1 > -(M_PI/2 + tile_size/2); th1 -= tile_size)
+ {
+ GLfloat x = cos (th1);
+ GLfloat y = sin (th1);
+ GLfloat x0 = cos (th1 - tile_size/2);
+ GLfloat x1 = cos (th1 + tile_size/2);
+ GLfloat circ0 = M_PI * x0 * 2;
+ GLfloat circ1 = M_PI * x1 * 2;
+ GLfloat circ = (circ0 < circ1 ? circ0 : circ1);
+ int row_tiles = floor ((circ < 0 ? 0 : circ) / tile_size);
+ GLfloat spacing;
+ GLfloat dropsy = 0.13 + frand(0.04);
+
+ if (row_tiles <= 0) row_tiles = 1;
+ spacing = M_PI*2 / row_tiles;
+
+ for (th0 = 0; th0 < M_PI*2; th0 += spacing)
+ {
+ tile *t = (tile *) calloc (1, sizeof(*t));
+ t->size = tile_size * 0.85;
+ t->position.x = cos (th0) * x;
+ t->position.y = sin (th0) * x;
+ t->position.z = y;
+
+ t->normal = t->position;
+
+ /* Apply pressure on position from the dents. */
+ for (i = 0; i < dent_count; i++)
+ {
+ GLfloat dist;
+ XYZ direction;
+
+ if (! (random() % 150)) /* Drop tiles randomly */
+ {
+ free (t);
+ goto SKIP;
+ }
+
+ direction.x = t->position.x - dents[i].position.x;
+ direction.y = t->position.y - dents[i].position.y;
+ direction.z = t->position.z - dents[i].position.z;
+ dist = sqrt (direction.x * direction.x +
+ direction.y * direction.y +
+ direction.z * direction.z);
+ if (dist < dents[i].strength)
+ {
+ GLfloat s = 1 - (dents[i].strength - dist) * 0.66;
+ XYZ n2 = t->normal;
+ GLfloat angle = vector_angle (t->position, dents[i].position);
+
+ /* Drop out the tiles near the apex of the dent. */
+ if (angle < dropsy)
+ {
+ free (t);
+ goto SKIP;
+ }
+
+ t->position.x *= s;
+ t->position.y *= s;
+ t->position.z *= s;
+
+ direction = normalize (direction);
+ n2.x -= direction.x;
+ n2.y -= direction.y;
+ n2.z -= direction.z;
+
+ t->normal.x = (t->normal.x + n2.x) / 2;
+ t->normal.y = (t->normal.y + n2.y) / 2;
+ t->normal.z = (t->normal.z + n2.z) / 2;
+ }
+ }
+
+ /* Skew the direction the tile is facing slightly. */
+ t->normal.x += 0.12 - frand(0.06);
+ t->normal.y += 0.12 - frand(0.06);
+ t->normal.z += 0.12 - frand(0.06);
+ t->tilt = 4 - BELLRAND(8);
+
+ t->next = bp->tiles;
+ bp->tiles = t;
+ SKIP: ;
+ }
+ }
+
+ bp->nrays = 5 + BELLRAND(10);
+ bp->rays = (ray *) calloc (bp->nrays, sizeof(*bp->rays));
+ for (i = 0; i < bp->nrays; i++)
+ {
+ GLfloat th = frand(M_PI * 2);
+ bp->rays[i].normal.x = cos (th);
+ bp->rays[i].normal.y = sin (th);
+ bp->rays[i].normal.z = 1;
+ bp->rays[i].normal = normalize (bp->rays[i].normal);
+ bp->rays[i].color[0] = 0.9 + frand(0.1);
+ bp->rays[i].color[1] = 0.6 + frand(0.4);
+ bp->rays[i].color[2] = 0.6 + frand(0.2);
+ bp->rays[i].color[3] = 1;
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_ball (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+ball_handle_event (ModeInfo *mi, XEvent *event)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_ball (ModeInfo *mi)
+{
+ ball_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (! wire)
+ build_texture (mi);
+
+ reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ bp->th = 180 - frand(360);
+
+ if (MI_COUNT(mi) < 10)
+ MI_COUNT(mi) = 10;
+ if (MI_COUNT(mi) > 200)
+ MI_COUNT(mi) = 200;
+
+ {
+ double spin_speed = 0.1;
+ double wander_speed = 0.003;
+ double spin_accel = 1;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ build_ball (mi);
+
+ if (!wire)
+ {
+ GLfloat color[4] = {0.5, 0.5, 0.5, 1};
+ GLfloat cspec[4] = {1, 1, 1, 1};
+ static const GLfloat shiny = 10;
+
+ static GLfloat pos0[4] = { 0.5, -1, -0.5, 0};
+ static GLfloat pos1[4] = {-0.75, -1, 0, 0};
+ static GLfloat amb[4] = {0, 0, 0, 1};
+ static GLfloat dif[4] = {1, 1, 1, 1};
+ static GLfloat spc[4] = {1, 1, 1, 1};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ color[0] += frand(0.2);
+ color[1] += frand(0.2);
+ color[2] += frand(0.2);
+
+ cspec[0] -= frand(0.2);
+ cspec[1] -= frand(0.2);
+ cspec[2] -= frand(0.2);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ }
+}
+
+
+ENTRYPOINT void
+draw_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 6,
+ (y - 0.5) * 6,
+ (z - 0.5) * 2);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glRotatef (50, 1, 0, 0);
+
+ glScalef (4, 4, 4);
+ glRotatef (bp->th, 0, 0, 1);
+ if (! bp->button_down_p)
+ {
+ bp->th += (bp->th > 0 ? speed : -speed);
+ while (bp->th > 360) bp->th -= 360;
+ while (bp->th < -360) bp->th += 360;
+ }
+
+ mi->polygon_count += draw_ball_1 (mi);
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ while (bp->tiles)
+ {
+ tile *t = bp->tiles->next;
+ free (bp->tiles);
+ bp->tiles = t;
+ }
+ free (bp->rays);
+}
+
+XSCREENSAVER_MODULE_2 ("Discoball", discoball, ball)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/discoball.man b/hacks/glx/discoball.man
new file mode 100644
index 0000000..041cbd2
--- /dev/null
+++ b/hacks/glx/discoball.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+discoball - A dusty, dented disco ball screen saver.
+.SH SYNOPSIS
+.B discoball
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+A dusty, dented disco ball. Woop woop.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Number of rows of tiles on the ball. 10 - 100. Default: 30.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the scene should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/dnalogo.c b/hacks/glx/dnalogo.c
new file mode 100644
index 0000000..2b24f83
--- /dev/null
+++ b/hacks/glx/dnalogo.c
@@ -0,0 +1,3639 @@
+/* DNA Logo, Copyright (c) 2001-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * DNA Lounge
+ *
+ * Restaurant -- Bar -- Nightclub -- Cafe -- Est. 1985.
+ *
+ * 375 Eleventh Street
+ * San Francisco, CA
+ * 94103
+ *
+ * https://www.dnalounge.com/
+ * http://www.dnapizza.com/
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS __extension__ \
+ "*delay: 25000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*doGasket: True \n" \
+ "*doHelix: True \n" \
+ "*doLadder: True \n" \
+ "*doFrame: True \n" \
+ "*wallFacets: 360 \n" \
+ "*barFacets: 90 \n" \
+ "*clockwise: False \n" \
+ "*turns: 0.72 \n" \
+ "*turnSpacing: 2.3 \n" \
+ "*barSpacing: 0.268 \n" \
+ "*wallHeight: 0.42 \n" \
+ "*wallThickness: 0.12 \n" \
+ "*barThickness: 0.058 \n" \
+ "*wallTaper: 0.95 \n" \
+ "*gasketSize: 2.0 \n" \
+ "*gasketDepth: 0.15 \n" \
+ "*gasketThickness: 0.4 \n" \
+ "*frameSize: 1.28 \n" \
+ "*frameDepth: 0.01 \n" \
+ "*frameThickness: 0.03 \n" \
+ "*triangleSize: 0.045 \n" \
+ "*cwFacets: 3 \n" \
+ "*cwDiscFacets: 64 \n" \
+ "*cwSpread: 0.5 \n" \
+ "*cwLineWidth: 0.18 \n" \
+ "*cwThickness: 0.15 \n" \
+ "*cwCapSize: 0.4 \n" \
+ "*text: CODEWORD\n" \
+ "*speed: 1.0 \n" \
+ "*mode: both" "\n" \
+ ".background: #000000\n" \
+ ".foreground: #00AA00\n" \
+ ".cwForeground: #FCA816\n" \
+ ".cwBackground: #943225\n" \
+ "*cwFont: " CWFONT "\n" \
+ "*geometry: =640x640\n" \
+
+# if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define CWFONT "Yearling 28, OCR A Std 24"
+# else
+# define CWFONT "-*-helvetica-medium-r-normal-*-*-240-*-*-*-*-*-*"
+# endif
+
+# define free_logo 0
+# define release_logo 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef DXF_OUTPUT_HACK
+
+#ifdef DXF_OUTPUT_HACK /* When this is defined, instead of rendering
+ to the screen, we write a DXF CAD file to stdout.
+ This is a kludge of shocking magnitude...
+ Maybe there's some other way to intercept all
+ glVertex3f calls than with a #define? */
+# define unit_tube dxf_unit_tube
+# define unit_cone dxf_unit_cone
+# define tube_1 dxf_tube_1
+# define tube dxf_tube
+# define cone dxf_cone
+#endif /* DXF_OUTPUT_HACK */
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "tube.h"
+#include "sphere.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "utf8wc.h"
+#include "texfont.h"
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_JWZGLES
+# include "dnapizza.h"
+#else
+# define HAVE_TESS
+#endif
+
+typedef enum {
+ HELIX_IN, HELIX, HELIX_OUT,
+ PIZZA_IN, PIZZA, PIZZA_OUT,
+ HELIX_AND_PIZZA,
+# ifdef CW
+ CODEWORD_IN, CODEWORD, CODEWORD_OUT, CODEWORD_BLANK
+# endif
+} glyph_mode;
+
+typedef struct {
+ Bool spinning_p;
+ GLfloat position; /* 0.0 - 1.0 */
+ GLfloat position_eased; /* 0.0 - 1.0, eased in and out */
+ GLfloat easement; /* portion of path that is eased. <= 0.5 */
+ GLfloat speed; /* how far along the path (may be negative) */
+ GLfloat probability; /* relative likelyhood to start spinning */
+} spinner;
+
+typedef struct {
+ GLXContext *glx_context;
+
+ GLuint helix_list, helix_list_wire, helix_list_facetted;
+ GLuint pizza_list, pizza_list_wire, pizza_list_facetted;
+ GLuint gasket_list, gasket_list_wire;
+ GLuint frame_list, frame_list_wire;
+ int polys[7];
+
+ int wall_facets;
+ int bar_facets;
+ Bool clockwise;
+ GLfloat color[4];
+
+ GLfloat turns;
+ GLfloat turn_spacing;
+ GLfloat bar_spacing;
+ GLfloat wall_height;
+ GLfloat wall_thickness;
+ GLfloat bar_thickness;
+ GLfloat wall_taper;
+
+ GLfloat gasket_size;
+ GLfloat gasket_depth;
+ GLfloat gasket_thickness;
+
+ GLfloat frame_size;
+ GLfloat frame_depth;
+ GLfloat frame_thickness;
+ GLfloat triangle_size;
+
+# ifdef CW
+ int codeword_facets, codeword_disc_facets;
+ GLfloat codeword_spread, codeword_line_width, codeword_thickness;
+ GLfloat codeword_cap_size;
+ const char *codeword_text;
+ char *codeword_text_out;
+ int *codeword_text_points;
+ XYZ *codeword_path;
+ int codeword_path_npoints;
+ int codeword_nguides;
+ XYZ *codeword_guides;
+ GLfloat codeword_color[4], codeword_bg[4];
+ texture_font_data *font;
+# endif
+
+# ifdef DEBUG
+ GLfloat persp_off, pos_off;
+ texture_font_data *label_font;
+# endif
+
+ GLfloat speed;
+ glyph_mode mode;
+ glyph_mode anim_state;
+ GLfloat anim_ratio;
+
+ spinner gasket_spinnerx, gasket_spinnery, gasket_spinnerz;
+ spinner scene_spinnerx, scene_spinnery; /* for DNA */
+# ifdef CW
+ rotator *scene_rot; /* for Codeword */
+# endif
+ spinner helix_spinnerz;
+ spinner pizza_spinnery, pizza_spinnerz;
+ spinner frame_spinner;
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int wire_overlay; /* frame countdown */
+
+} logo_configuration;
+
+static logo_configuration *dcs = NULL;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-pizza", ".mode", XrmoptionNoArg, "pizza" },
+ { "-helix", ".mode", XrmoptionNoArg, "helix" },
+ { "-both", ".mode", XrmoptionNoArg, "both" },
+# ifdef CW
+ { "-codeword", ".mode", XrmoptionNoArg, "codeword" },
+ { "-cw", ".mode", XrmoptionNoArg, "codeword" },
+ { "-text", ".text", XrmoptionSepArg, 0 },
+# endif
+};
+
+ENTRYPOINT ModeSpecOpt logo_opts = {countof(opts), opts, 0, NULL, NULL};
+
+#define PROBABILITY_SCALE 600
+
+
+#ifdef DXF_OUTPUT_HACK
+
+# define glBegin dxf_glBegin
+# define glVertex3f dxf_glVertex3f
+# define glVertex3dv dxf_glVertex3dv
+# define glEnd dxf_glEnd
+# define glVertexPointer dxf_glVertexPointer
+# define glDrawArrays dxf_glDrawArrays
+
+static int dxf_type, dxf_point, dxf_point_total, dxf_layer, dxf_color;
+static GLfloat dxf_quads[4*4];
+
+static void
+dxf_glBegin (int type)
+{
+ dxf_type = type;
+ dxf_point = 0;
+ dxf_point_total = 0;
+}
+
+static void
+dxf_glVertex3f (GLfloat ox, GLfloat oy, GLfloat oz)
+{
+ int i = 0;
+ GLfloat m[4*4];
+ GLfloat x, y, z;
+
+ /* Transform the point into modelview space. */
+ glGetFloatv (GL_MODELVIEW_MATRIX, m);
+ x = ox * m[0] + oy * m[4] + oz * m[8] + m[12];
+ y = ox * m[1] + oy * m[5] + oz * m[9] + m[13];
+ z = ox * m[2] + oy * m[6] + oz * m[10] + m[14];
+
+ dxf_quads[dxf_point*3+0] = x;
+ dxf_quads[dxf_point*3+1] = y;
+ dxf_quads[dxf_point*3+2] = z;
+ dxf_point++;
+ dxf_point_total++;
+
+ switch (dxf_type) {
+ case GL_QUADS:
+ if (dxf_point < 4) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
+ dxf_point = 0;
+ break;
+
+ case GL_QUAD_STRIP:
+ if (dxf_point < 4) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i+3]); /* funky quad strip */
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i+4]); /* vert order: 1243. */
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i+5]);
+
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i]);
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i+1]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i+2]);
+ i += 6;
+
+ dxf_quads[0] = dxf_quads[6]; /* copy point 3 to pos 1 */
+ dxf_quads[1] = dxf_quads[7];
+ dxf_quads[2] = dxf_quads[8];
+ dxf_quads[3] = dxf_quads[9]; /* copy point 4 to pos 2 */
+ dxf_quads[4] = dxf_quads[10];
+ dxf_quads[5] = dxf_quads[11];
+ dxf_point = 2; /* leave those two points in queue */
+ break;
+
+ case GL_TRIANGLES:
+ case GL_TRIANGLE_FAN:
+ if (dxf_point < 3) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
+
+ i -= 3;
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]); /* dup pt 4 as pt 3. */
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
+
+ dxf_point = 0;
+ if (dxf_type == GL_TRIANGLE_FAN)
+ {
+ dxf_quads[3] = dxf_quads[6]; /* copy point 3 to point 2 */
+ dxf_quads[4] = dxf_quads[7];
+ dxf_quads[5] = dxf_quads[8];
+ dxf_point = 2; /* leave two points in queue */
+ }
+ break;
+
+ case GL_TRIANGLE_STRIP:
+ if (dxf_point < 3) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
+
+ i -= 3;
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]); /* dup pt 4 as pt 3. */
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
+
+ dxf_quads[0] = dxf_quads[3]; /* copy point 2 to pos 1 */
+ dxf_quads[1] = dxf_quads[4];
+ dxf_quads[2] = dxf_quads[5];
+ dxf_quads[3] = dxf_quads[6]; /* copy point 3 to pos 2 */
+ dxf_quads[4] = dxf_quads[7];
+ dxf_quads[5] = dxf_quads[8];
+ dxf_point = 2; /* leave those two points in queue */
+ break;
+
+ case GL_LINES:
+ case GL_LINE_STRIP:
+ case GL_LINE_LOOP:
+
+ if (dxf_point_total == 1)
+ {
+ dxf_quads[6] = ox;
+ dxf_quads[7] = oy;
+ dxf_quads[8] = oz;
+ }
+
+ if (dxf_point < 2) return;
+
+ fprintf (stdout, "0\nLINE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ dxf_point = 0;
+ if (dxf_type != GL_LINES)
+ {
+ dxf_quads[0] = dxf_quads[3];
+ dxf_quads[1] = dxf_quads[4];
+ dxf_quads[2] = dxf_quads[5];
+ dxf_point = 1;
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+}
+
+
+static void
+dxf_glVertex3dv (const GLdouble *v)
+{
+ glVertex3f (v[0], v[1], v[2]);
+}
+
+
+static void
+dxf_glEnd(void)
+{
+ if (dxf_type == GL_LINE_LOOP) /* close loop */
+ glVertex3f (dxf_quads[6], dxf_quads[7], dxf_quads[8]);
+ dxf_type = -1;
+ dxf_point = 0;
+ dxf_point_total = 0;
+}
+
+
+static void
+dxf_start (void)
+{
+ fprintf (stdout, "0\nSECTION\n2\nHEADER\n0\nENDSEC\n");
+ fprintf (stdout, "0\nSECTION\n2\nENTITIES\n");
+}
+
+static void
+dxf_end (void)
+{
+ fprintf (stdout, "0\nENDSEC\n0\nEOF\n");
+ exit (0);
+}
+
+
+static const GLvoid *dxf_vp;
+static GLsizei dxf_vp_size;
+static GLsizei dxf_vp_stride;
+
+static void
+dxf_glVertexPointer (GLint size, GLenum type, GLsizei stride,
+ const GLvoid *pointer)
+{
+ if (type != GL_FLOAT) abort();
+ if (stride <= 0) abort();
+ dxf_vp = pointer;
+ dxf_vp_size = size;
+ dxf_vp_stride = stride;
+}
+
+static void
+dxf_glDrawArrays (GLenum mode, GLint first, GLsizei count)
+{
+ int i;
+ unsigned char *a = (unsigned char *) dxf_vp;
+ dxf_glBegin (mode);
+ for (i = first; i < first+count; i++)
+ {
+ GLfloat *fa = (GLfloat *) a;
+ dxf_glVertex3f (fa[0], fa[1], fa[2]);
+ a += dxf_vp_stride;
+ }
+ dxf_glEnd();
+}
+
+
+# define XYZ tube_XYZ /* avoid conflict with normals.h */
+# include "tube.c" /* Yes, I really am including a C file. */
+# undef XYZ
+# define XYZ sphere_XYZ
+# define unit_sphere unit_sphere_dxf
+# define unit_dome unit_dome_dxf
+# include "sphere.c"
+# undef XYZ
+
+#endif /* DXF_OUTPUT_HACK */
+
+
+
+/* Calculate the angle (in radians) between two vectors.
+ */
+static GLfloat
+vector_angle (double ax, double ay, double az,
+ double bx, double by, double bz)
+{
+ double La = sqrt (ax*ax + ay*ay + az*az);
+ double Lb = sqrt (bx*bx + by*by + bz*bz);
+ double cc, angle;
+
+ if (La == 0 || Lb == 0) return 0;
+ if (ax == bx && ay == by && az == bz) return 0;
+
+ /* dot product of two vectors is defined as:
+ La * Lb * cos(angle between vectors)
+ and is also defined as:
+ ax*bx + ay*by + az*bz
+ so:
+ La * Lb * cos(angle) = ax*bx + ay*by + az*bz
+ cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
+ angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
+ */
+ cc = (ax*bx + ay*by + az*bz) / (La * Lb);
+ if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
+ angle = acos (cc);
+
+ return (angle);
+}
+
+
+# ifdef CW
+
+static void
+normalize (XYZ *p)
+{
+ GLfloat d = sqrt (p->x*p->x + p->y*p->y + p->z*p->z);
+ if (d != 0)
+ {
+ p->x /= d;
+ p->y /= d;
+ p->z /= d;
+ }
+ else
+ {
+ p->x = p->y = p->z = 0;
+ }
+}
+
+
+static double
+dot (const XYZ u, const XYZ v)
+{
+ return (u.x * v.x) + (u.y * v.y) + (u.z * v.z);
+}
+
+#endif /* CW */
+
+
+/* Make the helix
+ */
+
+static int
+make_helix (logo_configuration *dc, int facetted, int wire)
+{
+ int polys = 0;
+ int wall_facets = dc->wall_facets / (facetted ? 10 : 1);
+ GLfloat th;
+ GLfloat max_th = M_PI * 2 * dc->turns;
+ GLfloat th_inc = M_PI * 2 / wall_facets;
+
+ GLfloat x1=0, y1=0, x2=0, y2=0;
+ GLfloat x1b=0, y1b=0, x2b=0, y2b=0;
+ GLfloat z1=0, z2=0;
+ GLfloat h1=0, h2=0;
+ GLfloat h1off=0, h2off=0;
+ GLfloat z_inc = dc->turn_spacing / wall_facets;
+
+ th = 0;
+ x1 = 1;
+ y1 = 0;
+ x1b = 1;
+ y1b = 0;
+
+ z1 = -(dc->turn_spacing * dc->turns / 2);
+
+ h1 = (dc->wall_taper > 0 ? 0 : dc->wall_height / 2);
+ h1off = (dc->wall_taper > 0 ? -dc->wall_height / 2 : 0);
+
+ if (!dc->clockwise)
+ z1 = -z1, z_inc = -z_inc, h1off = -h1off;
+
+ /* Leading end-cap
+ */
+ if (!wire && h1 > 0)
+ {
+ GLfloat nx, ny;
+ glFrontFace(GL_CCW);
+ glBegin(GL_QUADS);
+ nx = cos (th + M_PI/2);
+ ny = sin (th + M_PI/2);
+ glNormal3f(nx, ny, 0);
+ glVertex3f( x1, y1, z1 - h1 + h1off);
+ glVertex3f( x1, y1, z1 + h1 + h1off);
+ glVertex3f(x1b, y1b, z1 + h1 + h1off);
+ glVertex3f(x1b, y1b, z1 - h1 + h1off);
+ polys++;
+ glEnd();
+ }
+
+ while (th + th_inc <= max_th)
+ {
+ GLfloat thick = dc->wall_thickness;
+
+ th += th_inc;
+
+ x2 = cos (th);
+ y2 = sin (th);
+ z2 = z1 + z_inc;
+
+ h2 = h1;
+ h2off = h1off;
+
+ if (dc->wall_taper > 0)
+ {
+ h2off = 0;
+ if (th < dc->wall_taper)
+ {
+ h2 = dc->wall_height/2 * cos (M_PI / 2
+ * (1 - (th / dc->wall_taper)));
+ if (dc->clockwise)
+ h2off = h2 - dc->wall_height/2;
+ else
+ h2off = dc->wall_height/2 - h2;
+
+ if (th + th_inc <= 0)
+ thick = 0;
+ else
+ thick *= cos (M_PI / 2 * (1 - (th / dc->wall_taper)));
+ }
+ else if (th >= max_th - dc->wall_taper)
+ {
+ if (th + th_inc > max_th) /* edge case: always come to a point */
+ h2 = 0;
+ else
+ h2 = dc->wall_height/2 * cos (M_PI / 2
+ * (1 - ((max_th - th)
+ / dc->wall_taper)));
+ if (dc->clockwise)
+ h2off = dc->wall_height/2 - h2;
+ else
+ h2off = h2 - dc->wall_height/2;
+
+ if (th + th_inc > max_th)
+ thick = 0;
+ else
+ thick *= cos(M_PI / 2 * (1 - ((max_th - th)/dc->wall_taper)));
+ }
+ }
+
+ x2b = x2 * (1 - thick);
+ y2b = y2 * (1 - thick);
+
+ /* outer face
+ */
+ glFrontFace(GL_CW);
+ glBegin(wire ? GL_LINES : GL_QUADS);
+ glNormal3f(x1, y1, 0);
+ glVertex3f(x1, y1, z1 - h1 + h1off);
+ glVertex3f(x1, y1, z1 + h1 + h1off);
+ glNormal3f(x2, y2, 0);
+ glVertex3f(x2, y2, z2 + h2 + h2off);
+ glVertex3f(x2, y2, z2 - h2 + h2off);
+ polys++;
+ glEnd();
+
+ /* inner face
+ */
+ glFrontFace(GL_CCW);
+ glBegin(wire ? GL_LINES : GL_QUADS);
+ glNormal3f(-x1b, -y1b, 0);
+ glVertex3f( x1b, y1b, z1 - h1 + h1off);
+ glVertex3f( x1b, y1b, z1 + h1 + h1off);
+ glNormal3f(-x2b, -y2b, 0);
+ glVertex3f( x2b, y2b, z2 + h2 + h2off);
+ glVertex3f( x2b, y2b, z2 - h2 + h2off);
+ polys++;
+ glEnd();
+
+ /* top face
+ */
+ glFrontFace(GL_CCW);
+ /* glNormal3f(0, 0, 1);*/
+ do_normal (x2, y2, z2 + h2 + h2off,
+ x2b, y2b, z2 + h2 + h2off,
+ x1b, y1b, z1 + h1 + h1off);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f( x2, y2, z2 + h2 + h2off);
+ glVertex3f( x2b, y2b, z2 + h2 + h2off);
+ glVertex3f( x1b, y1b, z1 + h1 + h1off);
+ glVertex3f( x1, y1, z1 + h1 + h1off);
+ polys++;
+ glEnd();
+
+ /* bottom face
+ */
+ glFrontFace(GL_CCW);
+ do_normal ( x1, y1, z1 - h1 + h1off,
+ x1b, y1b, z1 - h1 + h1off,
+ x2b, y2b, z2 - h2 + h2off);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 0, -1);
+ glVertex3f( x1, y1, z1 - h1 + h1off);
+ glVertex3f( x1b, y1b, z1 - h1 + h1off);
+ glVertex3f( x2b, y2b, z2 - h2 + h2off);
+ glVertex3f( x2, y2, z2 - h2 + h2off);
+ polys++;
+ glEnd();
+
+ x1 = x2;
+ y1 = y2;
+ x1b = x2b;
+ y1b = y2b;
+ z1 += z_inc;
+ h1 = h2;
+ h1off = h2off;
+ }
+
+ /* Trailing end-cap
+ */
+ if (!wire && h2 > 0)
+ {
+ GLfloat nx, ny;
+ glFrontFace(GL_CW);
+ glBegin(GL_QUADS);
+ nx = cos (th + M_PI/2);
+ ny = sin (th + M_PI/2);
+ glNormal3f(nx, ny, 0);
+ glVertex3f(x2, y2, z1 - h2 + h2off);
+ glVertex3f(x2, y2, z1 + h2 + h2off);
+ glVertex3f(x2b, y2b, z1 + h2 + h2off);
+ glVertex3f(x2b, y2b, z1 - h2 + h2off);
+ polys++;
+ glEnd();
+ }
+ return polys;
+}
+
+
+static int
+make_ladder (logo_configuration *dc, int facetted, int wire)
+{
+ int polys = 0;
+ GLfloat th;
+ GLfloat max_th = dc->turns * M_PI * 2;
+ GLfloat max_z = dc->turns * dc->turn_spacing;
+ GLfloat z_inc = dc->bar_spacing;
+ GLfloat th_inc = M_PI * 2 * (dc->bar_spacing / dc->turn_spacing);
+ GLfloat x, y, z;
+
+ /* skip forward to center the bars in the helix... */
+ int i;
+ GLfloat usable_th = max_th - dc->wall_taper;
+ GLfloat usable_z = max_z / (max_th / usable_th);
+ int nbars = usable_z / dc->bar_spacing;
+ GLfloat used_z, pad_z, pad_ratio;
+
+ if (! (nbars & 1)) nbars--; /* always an odd number of bars */
+
+ used_z = (nbars - 1) * dc->bar_spacing;
+ pad_z = max_z - used_z;
+ pad_ratio = pad_z / max_z;
+
+ th = (max_th * pad_ratio/2);
+ z = -(max_z / 2) + (max_z * pad_ratio/2);
+
+ /* ##### WHYYYYYY */
+ /* The image is not reflected across line y = -x and I don't know why. */
+ th += M_PI * -0.035;
+ z -= 0.08;
+
+ if (!dc->clockwise)
+ z = -z, z_inc = -z_inc;
+
+ glFrontFace(GL_CCW);
+ for (i = 0; i < nbars; i++)
+ {
+ int facets = dc->bar_facets / (facetted ? 14 : 1);
+ if (facets <= 3) facets = 3;
+ x = cos (th) * (1 - dc->wall_thickness);
+ y = sin (th) * (1 - dc->wall_thickness);
+ polys += tube ( x, y, z,
+ -x, -y, z,
+ dc->bar_thickness, 0, facets,
+ True, True, wire);
+ z += z_inc;
+ th += th_inc;
+ }
+ return polys;
+}
+
+
+
+/* Make the gasket
+ */
+
+
+static int
+make_gasket (logo_configuration *dc, int wire)
+{
+ int polys = 0;
+ int i;
+ int points_size;
+ int npoints = 0;
+ int nctrls = 0;
+ int res = 360/8;
+ GLfloat d2r = M_PI / 180;
+
+ GLfloat thick2 = (dc->gasket_thickness / dc->gasket_size) / 2;
+
+ GLfloat *pointsx0, *pointsy0, *pointsx1, *pointsy1, *normals;
+
+ GLfloat r0 = 0.750; /* 395 */
+ GLfloat r1a = 0.825; /* bottom of wall below upper left hole */
+ GLfloat r1b = 0.867; /* center of upper left hole */
+ GLfloat r1c = 0.909; /* top of wall above hole */
+ GLfloat r1 = 0.916; /* 471 */
+ GLfloat r2 = 0.963; /* 490 */
+ GLfloat r3 = 0.960; /* 499 */
+ GLfloat r4 = 1.000; /* 507 */
+ GLfloat r5 = 1.080; /* 553 */
+
+ GLfloat ctrl_r[100], ctrl_th[100];
+
+ glPushMatrix();
+
+# ifdef DXF_OUTPUT_HACK
+ if (! wire) res *= 8;
+# endif
+
+# define POINT(r,th) \
+ ctrl_r [nctrls] = r, \
+ ctrl_th[nctrls] = (th * d2r), \
+ nctrls++
+
+ POINT (0.829, 0); /* top indentation, right half */
+ POINT (0.831, 0.85);
+ POINT (0.835, 1.81);
+ POINT (0.841, 2.65);
+ POINT (0.851, 3.30);
+ POINT (0.862, 3.81);
+ POINT (0.872, 3.95);
+
+ POINT (r4, 4.0); /* moving clockwise... */
+ POINT (r4, 47.0);
+ POINT (r1, 47.0);
+ POINT (r1, 53.0);
+ POINT (r2, 55.5);
+ POINT (r2, 72.3);
+ POINT (r1, 74.0);
+ POINT (r1, 100.0);
+ POINT (r3, 102.5);
+ POINT (r3, 132.0);
+ POINT (r1, 133.0);
+
+ POINT (r1, 180.7);
+ POINT (r2, 183.6);
+ POINT (r2, 210.0);
+ POINT (r1, 212.0);
+ POINT (r1, 223.2);
+ POINT (r5, 223.2);
+ POINT (r5, 225.0);
+ POINT (r4, 225.0);
+
+ POINT (r4, 316.8); /* upper left indentation */
+ POINT (0.990, 316.87);
+ POINT (0.880, 317.21);
+ POINT (0.872, 317.45);
+ POINT (0.869, 317.80);
+ POINT (0.867, 318.10);
+
+ POINT (0.867, 318.85);
+ POINT (0.869, 319.15);
+ POINT (0.872, 319.50);
+ POINT (0.880, 319.74);
+ POINT (0.990, 320.08);
+
+ POINT (r4, 338.0);
+ if (! wire)
+ {
+ POINT (r1a, 338.0); /* cut-out disc */
+ POINT (r1a, 344.0);
+ }
+ POINT (r4, 344.0);
+ POINT (r4, 356.0);
+
+ POINT (0.872, 356.05); /* top indentation, left half */
+ POINT (0.862, 356.19);
+ POINT (0.851, 356.70);
+ POINT (0.841, 357.35);
+ POINT (0.835, 358.19);
+ POINT (0.831, 359.15);
+ POINT (0.829, 360);
+# undef POINT
+
+ points_size = res + (nctrls * 2);
+ pointsx0 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ pointsy0 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ pointsx1 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ pointsy1 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ normals = (GLfloat *) malloc (points_size * sizeof(GLfloat) * 2);
+
+ npoints = 0;
+ for (i = 1; i < nctrls; i++)
+ {
+ GLfloat from_r = ctrl_r [i-1];
+ GLfloat from_th = ctrl_th[i-1];
+ GLfloat to_r = ctrl_r [i];
+ GLfloat to_th = ctrl_th[i];
+
+ GLfloat step = 2*M_PI / res;
+ int nsteps = 1 + ((to_th - from_th) / step);
+ int j;
+
+ for (j = 0; j < nsteps + (i == nctrls-1); j++)
+ {
+ GLfloat r = from_r + (j * (to_r - from_r) / nsteps);
+ GLfloat th = from_th + (j * (to_th - from_th) / nsteps);
+
+ GLfloat cth = cos(th) * dc->gasket_size;
+ GLfloat sth = sin(th) * dc->gasket_size;
+
+ pointsx0[npoints] = r0 * cth; /* inner ring */
+ pointsy0[npoints] = r0 * sth;
+ pointsx1[npoints] = r * cth; /* outer ring */
+ pointsy1[npoints] = r * sth;
+ npoints++;
+
+ if (npoints >= points_size) abort();
+ }
+ }
+
+ /* normals for the outer ring */
+ for (i = 1; i < npoints; i++)
+ {
+ XYZ a, b, c, n;
+ a.x = pointsx1[i-1];
+ a.y = pointsy1[i-1];
+ a.z = 0;
+ b.x = pointsx1[i];
+ b.y = pointsy1[i];
+ b.z = 0;
+ c = b;
+ c.z = 1;
+ n = calc_normal (a, b, c);
+ normals[(i-1)*2 ] = n.x;
+ normals[(i-1)*2+1] = n.y;
+ }
+
+ glRotatef(-90, 0, 1, 0);
+ glRotatef(180, 0, 0, 1);
+
+ if (wire)
+ {
+ GLfloat z;
+ for (z = -thick2; z <= thick2; z += thick2*2)
+ {
+# if 1
+ /* inside edge */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], pointsy0[i], z);
+ polys += npoints;
+ glEnd();
+
+ /* outside edge */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx1[i], pointsy1[i], z);
+ polys += npoints;
+ glEnd();
+# else
+ for (i = 1; i < npoints; i++)
+ {
+ glBegin (GL_LINE_STRIP);
+ glVertex3f (pointsx0[i-1], pointsy0[i-1], z);
+ glVertex3f (pointsx0[i ], pointsy0[i ], z);
+ glVertex3f (pointsx1[i ], pointsy1[i ], z);
+ glVertex3f (pointsx1[i-1], pointsy1[i-1], z);
+ glEnd();
+ }
+ polys += npoints;
+# endif
+ }
+#if 1
+ glBegin (GL_LINES);
+ for (i = 0; i < npoints; i++)
+ {
+ /* inside rim */
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ /* outside rim */
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ }
+ polys += npoints;
+ glEnd();
+#endif
+ }
+ else
+ {
+ /* top */
+ glFrontFace(GL_CW);
+ glNormal3f(0, 0, -1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* bottom */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 0, 1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* inside edge */
+ glFrontFace(GL_CW);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (-pointsx0[i], -pointsy0[i], 0);
+ glVertex3f ( pointsx0[i], pointsy0[i], thick2);
+ glVertex3f ( pointsx0[i], pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* outside edge */
+ glFrontFace(GL_CCW);
+ glBegin (GL_QUADS);
+ {
+ for (i = 0; i < npoints-1; i++)
+ {
+ int ia = (i == 0 ? npoints-2 : i-1);
+ int iz = (i == npoints-2 ? 0 : i+1);
+ GLfloat x = pointsx1[i];
+ GLfloat y = pointsy1[i];
+ GLfloat xz = pointsx1[iz];
+ GLfloat yz = pointsy1[iz];
+
+ GLfloat nxa = normals[ia*2]; /* normal of [i-1 - i] face */
+ GLfloat nya = normals[ia*2+1];
+ GLfloat nx = normals[i*2]; /* normal of [i - i+1] face */
+ GLfloat ny = normals[i*2+1];
+ GLfloat nxz = normals[iz*2]; /* normal of [i+1 - i+2] face */
+ GLfloat nyz = normals[iz*2+1];
+
+ GLfloat anglea = vector_angle (nx, ny, 0, nxa, nya, 0);
+ GLfloat anglez = vector_angle (nx, ny, 0, nxz, nyz, 0);
+ GLfloat pointy = 0.6;
+
+ if (anglea > pointy)
+ {
+ glNormal3f (nx, ny, 0);
+ glVertex3f (x, y, thick2);
+ glVertex3f (x, y, -thick2);
+ }
+ else
+ {
+ glNormal3f ((nxa + nx) / 2, (nya + ny) / 2, 0);
+ glVertex3f (x, y, thick2);
+ glVertex3f (x, y, -thick2);
+ }
+
+ if (anglez > pointy)
+ {
+ glNormal3f (nx, ny, 0);
+ glVertex3f (xz, yz, -thick2);
+ glVertex3f (xz, yz, thick2);
+ }
+ else
+ {
+ glNormal3f ((nx + nxz) / 2, (ny + nyz) / 2, 0);
+ glVertex3f (xz, yz, -thick2);
+ glVertex3f (xz, yz, thick2);
+ }
+ }
+ polys += npoints;
+ }
+ glEnd();
+ }
+
+ /* Fill in the upper left hole...
+ */
+ {
+ GLfloat th;
+ npoints = 0;
+
+ th = 338.0 * d2r;
+ pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
+ npoints++;
+ pointsx0[npoints] = r4 * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
+ npoints++;
+
+ th = 344.0 * d2r;
+ pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
+ npoints++;
+ pointsx0[npoints] = r4 * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
+
+ if (! wire)
+ {
+ /* front wall */
+ glNormal3f (0, 0, -1);
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (pointsx0[0], pointsy0[0], -thick2);
+ glVertex3f (pointsx0[1], pointsy0[1], -thick2);
+ glVertex3f (pointsx0[3], pointsy0[3], -thick2);
+ glVertex3f (pointsx0[2], pointsy0[2], -thick2);
+ glEnd();
+ polys++;
+
+ /* back wall */
+ glNormal3f (0, 0, 1);
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (pointsx0[0], pointsy0[0], thick2);
+ glVertex3f (pointsx0[1], pointsy0[1], thick2);
+ glVertex3f (pointsx0[3], pointsy0[3], thick2);
+ glVertex3f (pointsx0[2], pointsy0[2], thick2);
+ glEnd();
+ polys++;
+ }
+
+ /* top wall */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f (pointsx0[1], pointsy0[1], 0);
+ glVertex3f (pointsx0[1], pointsy0[1], thick2);
+ glNormal3f (pointsx0[3], pointsy0[3], 0);
+ glVertex3f (pointsx0[3], pointsy0[3], thick2);
+ glVertex3f (pointsx0[3], pointsy0[3], -thick2);
+ glNormal3f (pointsx0[1], pointsy0[1], 0);
+ glVertex3f (pointsx0[1], pointsy0[1], -thick2);
+ glEnd();
+ polys++;
+
+
+ /* Now make a donut.
+ */
+ {
+ int nsteps = (wire ? 12 : 64);
+ GLfloat r0 = 0.04;
+ GLfloat r1 = 0.070;
+ GLfloat th, cth, sth;
+
+ glPushMatrix ();
+
+ th = ((339.0 + 343.0) / 2) * d2r;
+
+ glTranslatef (r1b * cos(th) * dc->gasket_size,
+ r1b * sin(th) * dc->gasket_size,
+ 0);
+
+ npoints = 0;
+ for (i = 0; i < nsteps; i++)
+ {
+ th = 2 * M_PI * i / nsteps;
+ cth = cos (th) * dc->gasket_size;
+ sth = sin (th) * dc->gasket_size;
+ pointsx0[npoints] = r0 * cth;
+ pointsy0[npoints] = r0 * sth;
+ pointsx1[npoints] = r1 * cth;
+ pointsy1[npoints] = r1 * sth;
+ npoints++;
+ polys++;
+ }
+
+ pointsx0[npoints] = pointsx0[0];
+ pointsy0[npoints] = pointsy0[0];
+ pointsx1[npoints] = pointsx1[0];
+ pointsy1[npoints] = pointsy1[0];
+ npoints++;
+
+ if (wire)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ polys += npoints;
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ polys += npoints;
+ glEnd();
+# if 0
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ polys += npoints;
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ polys += npoints;
+ glEnd();
+# endif
+ }
+ else
+ {
+ /* top */
+ glFrontFace(GL_CW);
+ glNormal3f(0, 0, -1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* bottom */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 0, 1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ }
+ polys += npoints;
+ glEnd();
+ }
+
+ /* inside edge */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (-pointsx0[i], -pointsy0[i], 0);
+ glVertex3f ( pointsx0[i], pointsy0[i], thick2);
+ glVertex3f ( pointsx0[i], pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ glPopMatrix();
+ }
+ }
+
+
+ /* Attach the bottom-right dingus...
+ */
+ {
+ GLfloat w = 0.05;
+ GLfloat h = 0.19;
+ GLfloat th;
+
+ glRotatef (49.5, 0, 0, 1);
+ glScalef (dc->gasket_size, dc->gasket_size, 1);
+ glTranslatef (0, (r0+r1)/2, 0);
+
+ /* buried box */
+ if (! wire)
+ {
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_STRIP : GL_QUADS);
+ glNormal3f (0, 0, -1);
+ glVertex3f (-w/2, -h/2, -thick2); glVertex3f (-w/2, h/2, -thick2);
+ glVertex3f ( w/2, h/2, -thick2); glVertex3f ( w/2, -h/2, -thick2);
+ glNormal3f (1, 0, 0);
+ glVertex3f ( w/2, -h/2, -thick2); glVertex3f ( w/2, h/2, -thick2);
+ glVertex3f ( w/2, h/2, thick2); glVertex3f ( w/2, -h/2, thick2);
+ glNormal3f (0, 0, 1);
+ glVertex3f ( w/2, -h/2, thick2); glVertex3f ( w/2, h/2, thick2);
+ glVertex3f (-w/2, h/2, thick2); glVertex3f (-w/2, -h/2, thick2);
+ glNormal3f (-1, 0, 0);
+ glVertex3f (-w/2, -h/2, thick2); glVertex3f (-w/2, h/2, thick2);
+ glVertex3f (-w/2, h/2, -thick2); glVertex3f (-w/2, -h/2, -thick2);
+ polys++;
+ glEnd();
+ }
+
+ npoints = 0;
+ for (th = (wire ? 0 : -0.1);
+ th <= M_PI + 0.1;
+ th += (M_PI / (wire ? 5 : 32)))
+ {
+ pointsx0[npoints] = w/2 * cos(th);
+ pointsy0[npoints] = w/2 * sin(th);
+ npoints++;
+ polys++;
+ }
+
+ /* front inside curve */
+ glNormal3f (0, 0, -1);
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, h/2, -thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], -thick2);
+ polys += npoints;
+ glEnd();
+
+ /* front outside curve */
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, -h/2, -thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], -thick2);
+ polys += npoints;
+ glEnd();
+
+ /* back inside curve */
+ glNormal3f (0, 0, 1);
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, h/2, thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], thick2);
+ polys += npoints;
+ glEnd();
+
+ /* back outside curve */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, -h/2, thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], thick2);
+ polys += npoints;
+ glEnd();
+
+ /* inside curve */
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (pointsx0[i], pointsy0[i], 0);
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], thick2);
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* outside curve */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (pointsx0[i], -pointsy0[i], 0);
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], thick2);
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+ }
+
+ free (pointsx0);
+ free (pointsy0);
+ free (pointsx1);
+ free (pointsy1);
+ free (normals);
+
+ glPopMatrix();
+ return polys;
+}
+
+static int
+make_frame (logo_configuration *dc, int wire)
+{
+ int polys = 0;
+ int i, j;
+ GLfloat x[20], y[20];
+ GLfloat corner_cut = 0.5;
+
+ glPushMatrix();
+ glRotatef (90, 0, 1, 0);
+ glScalef (4 * dc->frame_size,
+ 4 * dc->frame_size,
+ 4 * dc->frame_size);
+
+ x[0] = -dc->frame_thickness;
+ x[1] = -dc->frame_thickness * corner_cut;
+ x[2] = 0;
+ x[3] = 0.5 - dc->triangle_size;
+ x[4] = 0.5;
+ x[5] = 0.5 + dc->triangle_size;
+ x[6] = 1;
+ x[7] = 1 + dc->frame_thickness * corner_cut;
+ x[8] = 1 + dc->frame_thickness;
+
+ y[0] = -dc->frame_thickness;
+ y[1] = -dc->frame_thickness * corner_cut;
+ y[2] = 0;
+ y[3] = dc->triangle_size;
+
+ /* front and back
+ */
+ glTranslatef (-0.5, -0.5, dc->frame_depth / 4);
+ if (! wire)
+ for (j = 0; j <= 1; j++)
+ {
+ if (j) glTranslatef (0, 0, -dc->frame_depth / 2);
+ glFrontFace (j ? GL_CCW : GL_CW);
+ for (i = 0; i < 4; i++)
+ {
+ glNormal3f (0, 0, (j ? -1 : 1));
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ glVertex3f (x[0], y[1], 0); glVertex3f (x[0], y[2], 0);
+ glVertex3f (x[1], y[0], 0); glVertex3f (x[1], y[2], 0);
+ glVertex3f (x[3], y[0], 0); glVertex3f (x[3], y[2], 0);
+ glVertex3f (x[4], y[0], 0); glVertex3f (x[4], y[3], 0);
+ glVertex3f (x[5], y[0], 0); glVertex3f (x[5], y[2], 0);
+ glVertex3f (x[7], y[0], 0); glVertex3f (x[7], y[2], 0);
+ glVertex3f (x[8], y[1], 0); glVertex3f (x[8], y[2], 0);
+ polys += 6;
+ glEnd ();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (-0.5, -0.5, 0);
+ }
+ }
+
+ /* ledges
+ */
+ glFrontFace (GL_CCW);
+ for (i = 0; i < 4; i++)
+ {
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ glVertex3f (x[2], y[2], 0); glVertex3f (x[2], y[2], dc->frame_depth/2);
+ glVertex3f (x[3], y[2], 0); glVertex3f (x[3], y[2], dc->frame_depth/2);
+ glVertex3f (x[4], y[3], 0); glVertex3f (x[4], y[3], dc->frame_depth/2);
+ glVertex3f (x[5], y[2], 0); glVertex3f (x[5], y[2], dc->frame_depth/2);
+ glVertex3f (x[6], y[2], 0); glVertex3f (x[6], y[2], dc->frame_depth/2);
+ polys += 4;
+ glEnd ();
+
+ glNormal3f (0, -1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (x[7], y[0], 0);
+ glVertex3f (x[7], y[0], dc->frame_depth/2);
+ glVertex3f (x[1], y[0], dc->frame_depth/2);
+ glVertex3f (x[1], y[0], 0);
+ polys++;
+ glEnd ();
+
+ glNormal3f (1, -1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (x[8], y[1], 0);
+ glVertex3f (x[8], y[1], dc->frame_depth/2);
+ glVertex3f (x[7], y[0], dc->frame_depth/2);
+ glVertex3f (x[7], y[0], 0);
+ polys++;
+ glEnd ();
+
+ if (wire)
+ {
+ glNormal3f (0, 1, 0);
+ for (j = 0; j <= 1; j++)
+ {
+ glBegin (GL_LINE_STRIP);
+ glVertex3f (x[2], y[2], j*dc->frame_depth/2);
+ glVertex3f (x[3], y[2], j*dc->frame_depth/2);
+ glVertex3f (x[4], y[3], j*dc->frame_depth/2);
+ glVertex3f (x[5], y[2], j*dc->frame_depth/2);
+ glVertex3f (x[6], y[2], j*dc->frame_depth/2);
+ polys += 4;
+ glEnd ();
+ }
+ }
+
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (-0.5, -0.5, 0);
+ }
+
+ glPopMatrix();
+ return polys;
+}
+
+
+/* Make some pizza.
+ */
+
+#ifdef HAVE_TESS
+
+typedef struct {
+ GLdouble *points;
+ int i;
+} tess_out;
+
+
+static void
+tess_error_cb (GLenum errorCode)
+{
+ fprintf (stderr, "%s: tesselation error: %s\n",
+ progname, gluErrorString(errorCode));
+ exit (0);
+}
+
+static void
+tess_combine_cb (GLdouble coords[3], GLdouble *d[4], GLfloat w[4],
+ GLdouble **data_out)
+{
+ GLdouble *new = (GLdouble *) malloc (3 * sizeof(*new));
+ new[0] = coords[0];
+ new[1] = coords[1];
+ new[2] = coords[2];
+ *data_out = new;
+}
+
+
+#if 0
+static void
+tess_vertex_cb (void *vertex_data, void *closure)
+{
+ tess_out *to = (tess_out *) closure;
+ GLdouble *v = (GLdouble *) vertex_data;
+ to->points[to->i++] = v[0];
+ to->points[to->i++] = v[1];
+ to->points[to->i++] = v[2];
+}
+#endif
+
+static void
+tess_begin_cb (GLenum which)
+{
+ glBegin(which);
+}
+
+static void
+tess_end_cb (void)
+{
+ glEnd();
+}
+
+#endif /* HAVE_TESS */
+
+
+static int
+make_pizza (logo_configuration *dc, int facetted, int wire)
+{
+ int polys = 0;
+ int topfaces = (facetted ? 48 : 120);
+ int discfaces = (facetted ? 12 : 120);
+ int npoints = topfaces * 2 + 100;
+ GLdouble *points = (GLdouble *) calloc (npoints * 3, sizeof(GLdouble));
+ int nholes = 3;
+ GLdouble *holes = (GLdouble *) calloc (topfaces*nholes*3, sizeof(GLdouble));
+
+ GLfloat step = M_PI * 2 / 6 / topfaces;
+ GLfloat thick2 = (dc->gasket_thickness / dc->gasket_size) / 4;
+ GLfloat th, x, y, s;
+ int i, j, k;
+ int endpoints;
+
+# ifdef HAVE_TESS
+ tess_out TO, *to = &TO;
+ GLUtesselator *tess = gluNewTess();
+
+ to->points = (GLdouble *) calloc (topfaces * 20, sizeof(GLdouble));
+ to->i = 0;
+
+# ifndef _GLUfuncptr
+# define _GLUfuncptr void(*)(void)
+# endif
+
+ gluTessCallback(tess,GLU_TESS_BEGIN, (_GLUfuncptr)tess_begin_cb);
+ gluTessCallback(tess,GLU_TESS_VERTEX, (_GLUfuncptr)glVertex3dv);
+ gluTessCallback(tess,GLU_TESS_END, (_GLUfuncptr)tess_end_cb);
+ gluTessCallback(tess,GLU_TESS_COMBINE, (_GLUfuncptr)tess_combine_cb);
+ gluTessCallback(tess,GLU_TESS_ERROR, (_GLUfuncptr)tess_error_cb);
+
+ gluTessProperty (tess, GLU_TESS_BOUNDARY_ONLY, wire);
+ gluTessProperty (tess,GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
+
+# endif /* HAVE_TESS */
+
+ glPushMatrix();
+
+ s = 1.9;
+ glRotatef (180, 0, 0, 1);
+ glScalef (s, s, s);
+ glRotatef (90, 0, 1, 0);
+ glTranslatef (-0.53, 0, 0);
+ glRotatef (-30, 0, 0, 1);
+
+ /* Compute the wedge */
+ th = 0;
+ j = 0;
+
+ /* Edge 1 */
+ {
+ GLfloat edge[] = {
+ 0.000, 0.000,
+ 0.000, 0.210,
+ 0.042, 0.230,
+ 0.042, 0.616,
+ 0.000, 0.641,
+ };
+ for (i = 0; i < countof(edge)/2; i++)
+ {
+ points[j++] = edge[i*2+1];
+ points[j++] = edge[i*2];
+ points[j++] = 0;
+ }
+ }
+
+ s = 0.798; /* radius of end of slice, before crust gap */
+ for (i = 0; i < topfaces; i++)
+ {
+ points[j++] = cos(th) * s;
+ points[j++] = sin(th) * s;
+ points[j++] = 0;
+ th += step;
+ }
+
+ /* Edge 2 */
+ {
+ GLfloat edge[] = {
+ 0.613, 0.353,
+ 0.572, 0.376,
+ 0.455, 0.309,
+ 0.452, 0.260,
+ 0.332, 0.192,
+ 0.293, 0.216,
+ 0.178, 0.149,
+ 0.178, 0.102,
+ };
+ for (i = 0; i < countof(edge)/2; i++)
+ {
+ points[j++] = edge[i*2+1];
+ points[j++] = edge[i*2];
+ points[j++] = 0;
+ }
+ endpoints = j/3;
+ }
+
+
+ /* Draw the rim of the slice */
+ glBegin (wire ? GL_LINES : GL_QUADS);
+ x = points[0];
+ y = points[1];
+ for (i = (wire ? 0 : 1); i < endpoints; i++)
+ {
+ GLdouble *p = points + (i*3);
+
+ do_normal (p[0], p[1], -thick2,
+ p[0], p[1], thick2,
+ x, y, thick2);
+ if (!wire)
+ {
+ glVertex3f (x, y, -thick2);
+ glVertex3f (x, y, thick2);
+ }
+ glVertex3f (p[0], p[1], thick2);
+ glVertex3f (p[0], p[1], -thick2);
+ x = p[0];
+ y = p[1];
+ polys++;
+ }
+
+ do_normal (points[0], points[1], -thick2,
+ points[0], points[1], thick2,
+ x, y, thick2);
+ glVertex3f (x, y, -thick2);
+ glVertex3f (x, y, thick2);
+ glVertex3f (points[0], points[1], thick2);
+ glVertex3f (points[0], points[1], -thick2);
+ polys++;
+ glEnd();
+
+# ifndef HAVE_TESS
+ if (wire)
+ {
+ /* Outline of slice */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < endpoints; i++)
+ glVertex3f (points[i*3], points[i*3+1], -thick2);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < endpoints; i++)
+ glVertex3f (points[i*3], points[i*3+1], thick2);
+ glEnd();
+ }
+# endif /* HAVE_TESS */
+
+ /* Compute the holes */
+ step = M_PI * 2 / discfaces;
+ for (k = 0; k < nholes; k++)
+ {
+ GLdouble *p = holes + (discfaces * 3 * k);
+ th = 0;
+ j = 0;
+ switch (k) {
+ case 0: x = 0.34; y = 0.17; s = 0.05; break;
+ case 1: x = 0.54; y = 0.17; s = 0.06; break;
+ case 2: x = 0.55; y = 0.36; s = 0.06; break;
+ default: abort(); break;
+ }
+ for (i = 0; i < discfaces; i++)
+ {
+ p[j++] = x + cos(M_PI*2 - th) * s;
+ p[j++] = y + sin(M_PI*2 - th) * s;
+ p[j++] = 0;
+ th += step;
+ }
+ }
+
+
+ /* Draw the inside rim of the holes */
+ for (k = 0; k < nholes; k++)
+ {
+ GLdouble *p = holes + (discfaces * 3 * k);
+
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < discfaces; i++)
+ {
+ GLdouble *p2 = p + (i*3);
+ if (i > 0)
+ do_normal (p2[0], p2[1], -thick2,
+ p2[0], p2[1], thick2,
+ p2[-3], p2[-2], thick2);
+ glVertex3f (p2[0], p2[1], -thick2);
+ glVertex3f (p2[0], p2[1], thick2);
+ polys++;
+ }
+ glVertex3f (p[0], p[1], -thick2);
+ glVertex3f (p[0], p[1], thick2);
+ polys++;
+ glEnd();
+# ifndef HAVE_TESS
+ if (wire)
+ {
+ /* Outline of holes */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < discfaces; i++)
+ glVertex3f (p[i*3], p[i*3+1], -thick2);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < discfaces; i++)
+ glVertex3f (p[i*3], p[i*3+1], thick2);
+ glEnd();
+ }
+# endif /* !HAVE_TESS */
+ }
+
+# ifdef HAVE_TESS
+ glTranslatef (0, 0, -thick2);
+ for (y = 0; y <= 1; y++)
+ {
+ if (y) glTranslatef (0, 0, thick2*2);
+
+ /* A non-convex polygon */
+ gluTessBeginPolygon (tess, to);
+
+ glNormal3f (0, 0, (y > 0 ? 1 : -1));
+ gluTessNormal (tess, 0, 0, (y > 0 ? 1 : -1));
+ glFrontFace (GL_CCW);
+
+ /* Tess the wedge */
+ gluTessBeginContour (tess);
+ for (i = 0; i < endpoints; i++)
+ {
+ GLdouble *p = points + (i*3);
+ gluTessVertex (tess, p, p);
+ polys++;
+ }
+ gluTessVertex (tess, points, points);
+ gluTessEndContour (tess);
+
+ /* Tess the holes */
+ for (k = 0; k < nholes; k++)
+ {
+ GLdouble *p = holes + (discfaces * 3 * k);
+ gluTessBeginContour (tess);
+ for (i = 0; i < discfaces; i++)
+ {
+ GLdouble *p2 = p + (i*3);
+ gluTessVertex (tess, p2, p2);
+ polys++;
+ }
+ gluTessEndContour (tess);
+ }
+
+ gluTessEndPolygon (tess);
+ }
+
+ glTranslatef (0, 0, -thick2);
+
+# else /* !HAVE_TESS */
+ if (! wire)
+ {
+ glTranslatef(0, 0, thick2);
+ glNormal3f (0, 0, 1);
+ glFrontFace (GL_CW);
+
+ /* Sadly, jwzgl's glVertexPointer seems not to be recordable inside
+ display lists. */
+# if 0
+ glDisableClientState (GL_COLOR_ARRAY);
+ glDisableClientState (GL_NORMAL_ARRAY);
+ glDisableClientState (GL_TEXTURE_COORD_ARRAY);
+ glEnableClientState (GL_VERTEX_ARRAY);
+ glVertexPointer (3, GL_FLOAT, 0, dnapizza_triangles);
+ glDrawArrays (GL_TRIANGLES, 0, countof (dnapizza_triangles) / 3);
+# else
+ glBegin (GL_TRIANGLES);
+ for (i = 0; i < countof (dnapizza_triangles); i += 3)
+ glVertex3fv (dnapizza_triangles + i);
+ glEnd();
+# endif
+
+ glTranslatef(0, 0, -thick2*2);
+ glNormal3f (0, 0, -1);
+ glFrontFace (GL_CCW);
+
+# if 0
+ glDrawArrays (GL_TRIANGLES, 0, countof (dnapizza_triangles) / 3);
+# else
+ int i;
+ glBegin (GL_TRIANGLES);
+ for (i = 0; i < countof (dnapizza_triangles); i += 3)
+ glVertex3fv (dnapizza_triangles + i);
+ glEnd();
+# endif
+
+ glTranslatef(0, 0, thick2);
+ }
+# endif /* !HAVE_TESS */
+
+
+ /* Compute the crust */
+
+ s = 0.861; /* radius of inside of crust */
+ step = M_PI * 2 / 6 / topfaces;
+ th = 0;
+ j = 0;
+ for (i = 0; i < topfaces; i++)
+ {
+ points[j++] = cos(th) * s;
+ points[j++] = sin(th) * s;
+ points[j++] = 0;
+ th += step;
+ }
+
+ s = 1;
+ for (i = 0; i < topfaces; i++)
+ {
+ points[j++] = cos(th) * s;
+ points[j++] = sin(th) * s;
+ points[j++] = 0;
+ th -= step;
+ }
+
+ /* Draw the rim of the crust */
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < topfaces * 2; i++)
+ {
+ GLdouble *p = points + (i*3);
+ if (i == 0 || i == (topfaces*2)-1)
+ glNormal3f (0, -1, 0);
+ else if (i == topfaces-1 || i == topfaces)
+ glNormal3f (0, 1, 0);
+ else
+ do_normal (p[-3], p[-2], thick2,
+ p[0], p[1], thick2,
+ p[0], p[1], -thick2);
+ glVertex3f (p[0], p[1], -thick2);
+ glVertex3f (p[0], p[1], thick2);
+ polys++;
+ }
+ glVertex3f (points[0], points[1], -thick2);
+ glVertex3f (points[0], points[1], thick2);
+ polys++;
+ glEnd();
+
+ if (wire)
+ {
+ glBegin (GL_LINE_STRIP);
+ for (i = 0; i < topfaces * 2; i++)
+ {
+ GLdouble *p = points + (i*3);
+ glVertex3f (p[0], p[1], -thick2);
+ polys++;
+ }
+ glVertex3f (points[0], points[1], -thick2);
+ glEnd();
+
+ glBegin (GL_LINE_STRIP);
+ for (i = 0; i < topfaces * 2; i++)
+ {
+ GLdouble *p = points + (i*3);
+ glVertex3f (p[0], p[1], thick2);
+ polys++;
+ }
+ glVertex3f (points[0], points[1], thick2);
+ glEnd();
+ }
+
+ /* Draw the top of the crust */
+ if (! wire)
+ {
+ glFrontFace (GL_CW);
+ glBegin (wire ? GL_LINE_STRIP : GL_QUAD_STRIP);
+ glNormal3f (0, 0, -1);
+ if (!wire)
+ for (i = 0; i < topfaces; i++)
+ {
+ int ii = topfaces + (topfaces - i - 1);
+ GLdouble *p1 = points + (i*3);
+ GLdouble *p2 = points + (ii*3);
+ glVertex3f (p1[0], p1[1], -thick2);
+ glVertex3f (p2[0], p2[1], -thick2);
+ polys++;
+ }
+ polys++;
+ glEnd();
+
+ /* Draw the bottom of the crust */
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ glNormal3f (0, 0, 1);
+ for (i = 0; i < topfaces; i++)
+ {
+ int ii = topfaces + (topfaces - i - 1);
+ GLdouble *p1 = points + (i*3);
+ GLdouble *p2 = points + (ii*3);
+ glVertex3f (p1[0], p1[1], thick2);
+ glVertex3f (p2[0], p2[1], thick2);
+ polys++;
+ }
+ polys++;
+ glEnd();
+ }
+
+# ifdef HAVE_TESS
+ gluDeleteTess (tess);
+ free (to->points);
+# endif /* HAVE_TESS */
+
+ free (points);
+ free (holes);
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+# ifdef CW
+
+/* Upcase string, convert Unicrud to ASCII, remove any non-letters.
+ */
+static char *
+codeword_simplify_text (const char *s0)
+{
+ char *s1 = utf8_to_latin1 ((s0 ? s0 : ""), True);
+ int L = strlen(s1);
+ char *s2 = (char *) malloc (L + 10);
+ char *s3 = s2;
+ int i;
+ for (i = 0; i < L; i++)
+ {
+ char c = s1[i];
+ if (c >= 'a' && c <= 'z')
+ c -= 'a'-'A';
+ if (c >= 'A' && c <= 'Z')
+ *s3++ = c;
+ }
+ *s3 = 0;
+ if (! *s2)
+ strcpy (s2, "CODEWORD");
+ return s2;
+}
+
+
+static void
+make_codeword_path (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int letters = strlen (dc->codeword_text);
+
+ GLfloat rtick = dc->codeword_spread;
+ GLfloat iradius = rtick * dc->codeword_cap_size;
+
+ int dial = 0;
+ int letter;
+ GLfloat last_r = 0;
+
+ GLfloat inner_circum = M_PI * 2 * (iradius + rtick * 2);
+ GLfloat outer_circum = M_PI * 2 * (iradius + rtick * (letters + 1));
+ GLfloat facet_length = inner_circum / (26 * dc->codeword_facets);
+ int outer_facets = ceil (outer_circum / facet_length);
+
+ int *histo = (int *) calloc (letters * 26, sizeof(*histo));
+ XYZ *points = (XYZ *) calloc (letters * outer_facets, sizeof (*points));
+ int npoints = 0;
+
+ for (letter = -1; letter < letters; letter++)
+ {
+ if (letter == -1) /* Inner starting point */
+ {
+ points[npoints].x = iradius;
+ points[npoints].y = 0;
+ last_r = iradius;
+ npoints++;
+ }
+ else /* Add arc for this letter */
+ {
+ int direction = (letter & 1 ? -1 : 1);
+ int v = (dc->codeword_text[letter] - 'A' + 1);
+ int dial1 = dial + v * direction;
+
+ GLfloat th;
+ GLfloat th0 = M_PI * 2 / 26 * dial;
+ GLfloat th1 = M_PI * 2 / 26 * dial1;
+ GLfloat r = iradius + rtick * (letter + 2);
+ GLfloat circum = M_PI * 2 * r;
+ GLfloat arc_length = circum * v / 26;
+ int arc_facets = ceil (fabs (arc_length / facet_length));
+ GLfloat facet_th = (th1 - th0) / arc_facets;
+
+ if (arc_facets > outer_facets) abort();
+
+ /* Let's put some intermediate facets on the crossbars too,
+ so that the animation doesn't speed up on those. */
+ {
+ GLfloat rr;
+ for (rr = last_r + facet_length;
+ rr <= r - facet_length;
+ rr += facet_length)
+ {
+ points[npoints].x = rr * cos (th0);
+ points[npoints].y = rr * sin (th0);
+ npoints++;
+ }
+ last_r = r;
+ }
+
+
+ for (th = th0;
+ (th0 < th1
+ ? th <= th1 + facet_th
+ : th >= th1 + facet_th);
+ th += facet_th)
+ {
+ GLfloat th2 = th;
+ if (th0 < th1 && th > th1)
+ th2 = th1;
+ if (th0 > th1 && th < th1)
+ th2 = th1;
+ points[npoints].x = r * cos (th2);
+ points[npoints].y = r * sin (th2);
+
+ /* Ugh, add point only if it differs from prev.
+ Not sure how this happens. */
+ if (npoints == 0 ||
+ points[npoints-1].x != points[npoints].x ||
+ points[npoints-1].y != points[npoints].y)
+ npoints++;
+ }
+
+ /* Mark up the histo array to find the outer border. */
+ {
+ int i;
+ for (i = dial;
+ (direction > 0
+ ? i <= dial1
+ : i >= dial1);
+ i += direction)
+ {
+ int x = (i + 26) % 26;
+ int y;
+ for (y = 0; y <= letter; y++)
+ histo[y * 26 + x]++;
+ }
+ }
+
+ dc->codeword_text_points[letter] = npoints;
+
+ dial = dial1;
+ }
+ }
+
+ if (npoints >= letters * outer_facets) abort();
+
+# if 0
+ { /* Print histo */
+ int x, y;
+ for (y = 0; y < letters; y++)
+ {
+ fprintf (stderr, "%2d: ", y);
+ for (x = 0; x < 26; x++)
+ fprintf (stderr, "%x", histo[y * 26 + x]);
+ fprintf (stderr, "\n");
+ }
+ fprintf (stderr, "\n");
+ }
+# endif
+
+
+ /* Find a gap in the outer edge, to draw guide dots. */
+ {
+ int x, y;
+ int last_row = letters;
+ int start_dial = -1, end_dial = -1;
+
+ for (y = letters-1; y >= 0; y--)
+ {
+ for (x = 0; x < 26; x++)
+ {
+ if (histo[y * 26 + x] == 0)
+ {
+ if (last_row != y)
+ start_dial = end_dial = -1;
+ last_row = y;
+ if (start_dial == -1)
+ start_dial = x;
+ end_dial = x;
+ }
+ }
+ }
+
+ if (last_row < letters-1 && start_dial >= 0)
+ {
+ GLfloat r = iradius + rtick * (last_row + 2);
+ int i;
+
+ dc->codeword_nguides = 0;
+ dc->codeword_guides = (XYZ *)
+ calloc (end_dial - start_dial + 1, sizeof (*dc->codeword_guides));
+ for (i = start_dial; i <= end_dial; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 26;
+ GLfloat x = r * cos (th);
+ GLfloat y = r * sin (th);
+ dc->codeword_guides[dc->codeword_nguides].x = x;
+ dc->codeword_guides[dc->codeword_nguides].y = y;
+ dc->codeword_nguides++;
+ }
+ }
+ free (histo);
+ histo = 0;
+ }
+
+ dc->codeword_path_npoints = npoints;
+ dc->codeword_path = points;
+}
+
+
+static int
+draw_codeword_cap (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ int segments = dc->codeword_disc_facets;
+ GLfloat size = dc->codeword_spread * dc->codeword_cap_size;
+ GLfloat width = dc->codeword_line_width / 2;
+ GLfloat thick = dc->codeword_thickness / 2;
+ GLfloat r1 = size + width/2;
+ GLfloat r2 = size - width/2;
+ GLfloat facet, th, z;
+
+ if (wire) segments = 12;
+ facet = M_PI * 2 / segments;
+
+ glPushMatrix();
+
+ /* Top and bottom */
+
+ for (z = -thick; z <= thick; z += thick*2)
+ {
+ glNormal3f (0, 0, (z < 0 ? -1 : 1));
+ glFrontFace (z < 0 ? GL_CCW : GL_CW);
+
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ glVertex3f (r1 * x, r1 * y, z);
+ glVertex3f (r2 * x, r2 * y, z);
+ }
+ glEnd();
+
+ if (wire)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ glVertex3f (r1 * x, r1 * y, z);
+ }
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ glVertex3f (r2 * x, r2 * y, z);
+ }
+ glEnd();
+ }
+ }
+
+ /* Inside and outside */
+
+ for (z = -1; z <= 1; z += 2)
+ {
+ glFrontFace (z < 0 ? GL_CCW : GL_CW);
+
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat th1 = th + facet;
+ GLfloat x0 = cos (th);
+ GLfloat y0 = sin (th);
+ GLfloat x1 = cos (th1);
+ GLfloat y1 = sin (th1);
+ GLfloat r = z < 0 ? r1 : r2;
+
+ if (z < 0)
+ do_normal (r * x0, r * y0, thick,
+ r * x0, r * y0, -thick,
+ r * x1, r * y1, -thick);
+ else
+ do_normal (r * x1, r * y1, thick,
+ r * x1, r * y1, -thick,
+ r * x0, r * y0, -thick);
+
+ glVertex3f (r * x0, r * y0, thick);
+ glVertex3f (r * x0, r * y0, -thick);
+ }
+ glEnd();
+ }
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static int
+draw_codeword_guides (ModeInfo *mi, GLfloat anim_ratio)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ int segments = dc->codeword_disc_facets;
+ GLfloat s = dc->codeword_line_width / 2;
+ GLfloat each = 1.0 / dc->codeword_nguides;
+ int i;
+
+ if (wire) segments = 6;
+
+ for (i = 0; i < dc->codeword_nguides; i++)
+ {
+ GLfloat ratio;
+ if (anim_ratio < i*each) ratio = 0;
+ else if (anim_ratio >= (i+1)*each) ratio = 1;
+ else ratio = (anim_ratio - i*each) / each;
+
+ if (ratio <= 0) continue;
+ if (ratio == 0) ratio = 0.001;
+
+ glPushMatrix();
+ glTranslatef (dc->codeword_guides[i].x,
+ dc->codeword_guides[i].y,
+ dc->codeword_guides[i].z);
+
+ glScalef (ratio, ratio, ratio);
+
+ /* If the line width and thickness are pretty close to each other,
+ use spheres. Otherwise use tubes.
+ */
+ if (dc->codeword_thickness < dc->codeword_line_width * 1.3 &&
+ dc->codeword_thickness > dc->codeword_line_width / 1.3)
+ {
+ glScalef (s, s, s);
+ glFrontFace (GL_CCW);
+ polys += unit_sphere (segments, segments, wire);
+ }
+ else
+ {
+ polys += tube (0, 0, -dc->codeword_thickness / 2,
+ 0, 0, dc->codeword_thickness / 2,
+ s, 0, segments, True, True, wire);
+ }
+
+ glPopMatrix();
+ }
+
+ return polys;
+}
+
+
+/* Compute the characters at which the cursor is currently pointing,
+ and render it on the logo.
+ */
+static void
+codeword_text_output (ModeInfo *mi, GLfloat anim_ratio)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int i;
+ int L = strlen (dc->codeword_text);
+ int point = dc->codeword_path_npoints * anim_ratio;
+ Bool hit = False;
+
+ if (dc->anim_state == CODEWORD_BLANK)
+ point = 0;
+
+ for (i = 0; i < L; i++)
+ {
+ if (point >= dc->codeword_text_points[i])
+ dc->codeword_text_out[i] = dc->codeword_text[i];
+ else if (hit)
+ dc->codeword_text_out[i] = 0;
+ else
+ {
+ int steps = dc->codeword_text[i] - 'A' + 1;
+ int last = (i > 0 ? dc->codeword_text_points[i-1] : 0);
+ double ratio = ((point - last) /
+ (double) (dc->codeword_text_points[i] - last));
+ char chr = 'A' + (ratio * steps);
+ if (ratio < 0.1) chr = 0;
+ dc->codeword_text_out[i] = chr;
+ hit = True;
+ }
+ }
+ dc->codeword_text_out[i] = 0;
+
+ if (*dc->codeword_text_out &&
+ !strcmp (dc->codeword_text, "CODEWORD"))
+ {
+ int i;
+ int L2 = strlen (dc->codeword_text_out);
+ GLfloat ss = 0.01;
+ int ascent, descent;
+
+ glPushMatrix();
+ glColor4fv (dc->codeword_color);
+ glRotatef (90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+
+ for (i = 0; i < L2; i++)
+ {
+ XCharStruct e;
+ char buf[2];
+ glPushMatrix();
+ glRotatef ((i + 0.5) * 360 / 26.0, 0, 0, 1);
+
+# if 0
+ {
+ GLfloat th;
+ glDisable(GL_LIGHTING);
+ glBegin(GL_LINES);
+ glVertex3f(0,0,0);
+ glVertex3f(0,-4,0);
+ glEnd();
+ glBegin(GL_LINE_STRIP);
+ for (th = M_PI * 1.45; th < M_PI * 1.55; th += 0.1)
+ {
+ GLfloat r = 3.85;
+ glVertex3f (r * cos(th), r * sin(th), 0);
+ }
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ }
+# endif
+
+ glTranslatef (0, -dc->codeword_spread * (L - 1), 0);
+ glScalef (ss, ss, ss);
+ buf[0] = dc->codeword_text_out[i] + ('a' - 'A');
+ buf[1] = 0;
+ texture_string_metrics (dc->font, buf, &e, &ascent, &descent);
+
+# ifdef HAVE_MOBILE
+ /* #### Magic magic magic WTF... */
+ glScalef (0.5, 0.5, 0.5);
+# endif
+
+ glTranslatef (-e.width * 1.0,
+ -(ascent + descent + e.descent * 2.4), /* #### WTF */
+ 0);
+
+ glScalef (2, 2, 2);
+
+# if 0
+ glDisable(GL_LIGHTING);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0, 0, 0);
+ glVertex3f(e.width, 0, 0);
+ glVertex3f(e.width, e.ascent + e.descent, 0);
+ glVertex3f(0, e.ascent + e.descent, 0);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+# endif
+
+ glDisable(GL_CULL_FACE); /* tell texfont.c to draw both sides */
+ print_texture_string (dc->font, buf);
+ glEnable(GL_CULL_FACE);
+
+ glPopMatrix();
+ }
+ glPopMatrix();
+ }
+}
+
+
+/* Convert the precomputed path to a thick line of polygons.
+ We could actually precompute all of these polygons too,
+ but it's fast enough.
+ */
+static int
+draw_codeword_path (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ GLfloat anim_ratio = (dc->anim_state == CODEWORD_IN ? dc->anim_ratio :
+ dc->anim_state == CODEWORD_OUT ? 1 - dc->anim_ratio :
+ dc->anim_state == CODEWORD_BLANK ? 0 :
+ 1);
+ int last_anim_point = 0;
+
+ GLfloat width = dc->codeword_line_width / 2;
+ GLfloat thick = dc->codeword_thickness / 2;
+ int i, k;
+ GLfloat j;
+
+ int quad_size = (dc->codeword_path_npoints + 1) * 2;
+ XYZ *quads = (XYZ *) calloc (quad_size, sizeof(*quads));
+ XYZ *norms = (XYZ *) calloc (quad_size, sizeof(*norms));
+ int nquads = 0;
+
+ for (i = 0; i < dc->codeword_path_npoints; i++)
+ {
+ XYZ p1 = dc->codeword_path[i];
+ XYZ p2 = (i < dc->codeword_path_npoints-1
+ ? dc->codeword_path[i+1]
+ : dc->codeword_path[i-1]);
+ XYZ p1a, p1b;
+
+ XYZ n; /* normal of the first line segment */
+ n.x = -(p2.y - p1.y);
+ n.y = (p2.x - p1.x);
+ n.z = 0;
+ normalize (&n);
+
+ if (i == 0)
+ {
+ p1a.x = p1.x - width / 2 * n.x;
+ p1a.y = p1.y - width / 2 * n.y;
+ p1a.z = 0;
+
+ p1b.x = p1.x + width / 2 * n.x;
+ p1b.y = p1.y + width / 2 * n.y;
+ p1b.z = 0;
+ }
+ else if (i == dc->codeword_path_npoints - 1)
+ {
+ p1b.x = p1.x - width / 2 * n.x;
+ p1b.y = p1.y - width / 2 * n.y;
+ p1b.z = 0;
+
+ p1a.x = p1.x + width / 2 * n.x;
+ p1a.y = p1.y + width / 2 * n.y;
+ p1a.z = 0;
+ }
+ else
+ {
+ XYZ p0 = dc->codeword_path[i-1];
+
+ XYZ t, t0, t1; /* tangent of corner between two line segments */
+ XYZ m; /* miter line: normal of tangent */
+ GLfloat d; /* length of miter */
+
+ t0.x = p2.x - p1.x;
+ t0.y = p2.y - p1.y;
+ t0.z = p2.z - p1.z;
+ normalize (&t0);
+
+ t1.x = p1.x - p0.x;
+ t1.y = p1.y - p0.y;
+ t1.z = p1.z - p0.z;
+ normalize (&t1);
+
+ t.x = t0.x + t1.x;
+ t.y = t0.y + t1.y;
+ t.z = t0.z + t1.z;
+ normalize (&t);
+
+ m.x = -t.y;
+ m.y = t.x;
+ m.z = 0;
+
+ /* find length of miter by projecting it on one of the normals */
+ d = width / 2 / dot (m, n);
+
+ p1a.x = p1.x - d * m.x;
+ p1a.y = p1.y - d * m.y;
+ p1a.z = 0;
+
+ p1b.x = p1.x + d * m.x;
+ p1b.y = p1.y + d * m.y;
+ p1b.z = 0;
+ }
+
+ quads[nquads++] = p1a;
+ quads[nquads++] = p1b;
+
+ if (nquads >= quad_size) abort();
+
+ if (i / (double) dc->codeword_path_npoints > anim_ratio)
+ break;
+
+ last_anim_point = i;
+ }
+
+
+ /* Compute normals for each point along the interior edge */
+ for (k = 0; k <= 1; k++)
+ {
+ for (i = k; i < nquads-2; i += 2)
+ {
+ XYZ p1a = quads[i];
+ XYZ p2a = quads[i+2];
+ XYZ p1b = p1a;
+ XYZ p2b = p2a;
+ p1a.z = thick; /* a: top */
+ p1b.z = -thick; /* b: bottom */
+ p2a.z = thick;
+ p2b.z = -thick;
+
+ norms[i] = (k == 0
+ ? calc_normal (p1a, p1b, p2b)
+ : calc_normal (p2a, p2b, p1a));
+ }
+ }
+
+ glPushMatrix();
+ glColor4fv (dc->codeword_color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dc->codeword_color);
+
+# ifdef HAVE_MOBILE /* Make the whole thing fit on the phone screen */
+ {
+ GLfloat size = MI_WIDTH(mi) < MI_HEIGHT(mi) ? MI_WIDTH(mi) : MI_HEIGHT(mi);
+ glScalef (0.9, 0.9, 0.9);
+ if (size <= 768) /* iPad retina / iPhone 6 */
+ glScalef (0.7, 0.7, 0.7);
+ }
+# endif
+
+ codeword_text_output (mi, anim_ratio);
+
+ glRotatef (90, 1, 0, 0);
+ glRotatef (90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glScalef (0.8, 0.8, 0.8);
+
+ glNormal3f (0, 0, -1);
+
+ if (anim_ratio <= 0)
+ {
+ polys += draw_codeword_cap (mi);
+ goto DONE;
+ }
+
+# if 0
+ glColor3f (1, 0, 0);
+ glBegin(GL_LINE_STRIP);
+ for (i = 0; i < dc->codeword_path_npoints; i++)
+ {
+ glVertex3f (dc->codeword_path[i].x,
+ dc->codeword_path[i].y,
+ dc->codeword_path[i].z);
+ polys++;
+ }
+ glEnd();
+ glColor4fv (dc->codeword_color);
+# endif
+
+ if (wire)
+ {
+ int k;
+ GLfloat j;
+ for (i = 0; i <= 1; i++)
+ for (j = -thick; j <= thick; j += thick*2)
+ {
+ glBegin (GL_LINE_STRIP);
+ for (k = i; k < nquads; k += 2)
+ {
+ glVertex3f (quads[k].x, quads[k].y, j);
+ polys++;
+ }
+ glEnd();
+ }
+ }
+
+ /* Top and bottom */
+
+ for (j = -thick; j <= thick; j += thick*2)
+ {
+ if (j < 0)
+ {
+ glNormal3f (0, 0, -1);
+ glFrontFace (GL_CW);
+ }
+ else
+ {
+ glNormal3f (0, 0, 1);
+ glFrontFace (GL_CCW);
+ }
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < nquads; i += 2)
+ {
+ glVertex3f (quads[i+1].x, quads[i+1].y, j);
+ glVertex3f (quads[i].x, quads[i].y, j);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* Edges */
+
+ for (k = 0; k <= 1; k++)
+ {
+ if (k > 0)
+ {
+ glNormal3f (0, 0, -1);
+ glFrontFace (GL_CW);
+ }
+ else
+ {
+ glNormal3f (0, 0, 1);
+ glFrontFace (GL_CCW);
+ }
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+ for (i = k; i < nquads; i += 2)
+ {
+ XYZ p1a = quads[i];
+ XYZ p2a = (i < nquads-2) ? quads[i+2] : p1a;
+ XYZ p1b = p1a;
+ XYZ p2b = p2a;
+
+ XYZ n1 = norms[i];
+ XYZ n2 = (i < nquads-2) ? norms[i+2] : n1;
+
+ /* If the two normals are very similar, smooth the face.
+ If they are different, it's a sharp turn, and use the
+ same normal for both edges (not quite right, but close).
+ */
+ GLfloat angle = vector_angle (n1.x, n1.y, n1.z,
+ n2.x, n2.y, n2.z);
+ GLfloat pointy = 0.8;
+
+ p1a.z = thick;
+ p1b.z = -thick;
+ p2a.z = thick;
+ p2b.z = -thick;
+
+ glNormal3f (n1.x, n1.y, n1.z);
+ glVertex3f (p1a.x, p1a.y, p1a.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+
+ if (angle < pointy)
+ glNormal3f (n2.x, n2.y, n2.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p2a.x, p2a.y, p2a.z);
+ polys++;
+ }
+ glEnd();
+ }
+
+
+ /* Only draw the guides when the path is almost complete;
+ fade them in and out based on completeness. */
+ {
+ GLfloat size = 0.95;
+ GLfloat r = (anim_ratio > size
+ ? (anim_ratio - size) / (1 - size)
+ : 0);
+ polys += draw_codeword_guides (mi, r);
+ }
+
+
+ /* Draw the start and end caps */
+ {
+ int i;
+ GLfloat x, y, z, x2, y2, z2, X, Y, Z;
+ GLfloat r = dc->codeword_spread * dc->codeword_cap_size;
+
+ i = 0;
+ x = dc->codeword_path[i].x;
+ y = dc->codeword_path[i].y;
+ z = dc->codeword_path[i].z;
+
+ x -= r;
+
+ glPushMatrix();
+ glTranslatef (x, y, z);
+ polys += draw_codeword_cap (mi);
+ glPopMatrix();
+
+ /* end cap */
+
+ i = last_anim_point + 1;
+ if (i > dc->codeword_path_npoints - 1)
+ i = dc->codeword_path_npoints - 1;
+
+ x = dc->codeword_path[i].x;
+ y = dc->codeword_path[i].y;
+ z = dc->codeword_path[i].z;
+
+ i--;
+ x2 = dc->codeword_path[i].x;
+ y2 = dc->codeword_path[i].y;
+ z2 = dc->codeword_path[i].z;
+
+ X = (x2 - x);
+ Y = (y2 - y);
+ Z = (z2 - z);
+
+ glPushMatrix();
+ glTranslatef (x, y, z);
+ glRotatef (-atan2 (X, Y) * (180 / M_PI), 0, 0, 1);
+ glRotatef ( atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI), 1, 0, 0);
+ glTranslatef (0, -r, 0);
+ polys += draw_codeword_cap (mi);
+ glPopMatrix();
+ }
+
+ DONE:
+
+ glPopMatrix();
+
+ free (quads);
+ free (norms);
+
+ return polys;
+}
+
+#endif /* CW */
+
+
+ENTRYPOINT void
+reshape_logo (ModeInfo *mi, int width, int height)
+{
+# ifdef DEBUG
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+# endif
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ GLfloat persp = 64; /* 30 */
+ GLfloat pos = 13; /* 30 */
+
+# ifdef DEBUG
+ persp += dc->persp_off;
+ pos += dc->pos_off;
+# endif
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (persp, 1/h, 1, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0, 0, pos,
+ 0, 0, 0,
+ 0, 1, 0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h); /* #### Why does this change the lighting? */
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+/* logo_configuration *dc = &dcs[MI_SCREEN(mi)]; */
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat position[] = {0, 0, 0, 0};
+ GLfloat direction[] = {3, -1, -3};
+
+ position[0] = -direction[0];
+ position[1] = -direction[1];
+ position[2] = -direction[2];
+
+ if (!wire)
+ {
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ }
+}
+
+
+ENTRYPOINT void
+init_logo (ModeInfo *mi)
+{
+ logo_configuration *dc;
+ int do_gasket = get_boolean_resource(mi->dpy, "doGasket", "Boolean");
+ int do_helix = get_boolean_resource(mi->dpy, "doHelix", "Boolean");
+ int do_ladder = (do_helix &&
+ get_boolean_resource(mi->dpy, "doLadder", "Boolean"));
+ int do_frame = get_boolean_resource(mi->dpy, "doFrame", "Boolean");
+ GLfloat helix_rot = 147.0;
+
+ if (!do_gasket && !do_helix)
+ {
+ fprintf (stderr, "%s: no helix or gasket?\n", progname);
+ exit (1);
+ }
+
+ MI_INIT (mi, dcs);
+
+ dc = &dcs[MI_SCREEN(mi)];
+
+ if ((dc->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ reshape_logo (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ dc->wall_facets = get_integer_resource(mi->dpy, "wallFacets", "Integer");
+ dc->bar_facets = get_integer_resource(mi->dpy, "barFacets", "Integer");
+ dc->clockwise = get_boolean_resource(mi->dpy, "clockwise", "Boolean");
+ dc->turns = get_float_resource(mi->dpy, "turns", "Float");
+ dc->turn_spacing = get_float_resource(mi->dpy, "turnSpacing", "Float");
+ dc->bar_spacing = get_float_resource(mi->dpy, "barSpacing", "Float");
+ dc->wall_height = get_float_resource(mi->dpy, "wallHeight", "Float");
+ dc->wall_thickness = get_float_resource(mi->dpy, "wallThickness", "Float");
+ dc->bar_thickness = get_float_resource(mi->dpy, "barThickness", "Float");
+ dc->wall_taper = get_float_resource(mi->dpy, "wallTaper", "Float");
+
+ dc->gasket_size = get_float_resource(mi->dpy,"gasketSize", "Float");
+ dc->gasket_depth = get_float_resource(mi->dpy,"gasketDepth", "Float");
+ dc->gasket_thickness = get_float_resource(mi->dpy,"gasketThickness","Float");
+
+ dc->frame_size = get_float_resource(mi->dpy, "frameSize", "Float");
+ dc->frame_depth = get_float_resource(mi->dpy, "frameDepth", "Float");
+ dc->frame_thickness = get_float_resource(mi->dpy, "frameThickness", "Float");
+ dc->triangle_size = get_float_resource(mi->dpy, "triangleSize", "Float");
+
+ dc->speed = get_float_resource(mi->dpy, "speed", "Float");
+# ifdef CW
+ dc->codeword_text = get_string_resource(mi->dpy, "text", "String");
+ dc->codeword_text = codeword_simplify_text (dc->codeword_text);
+ dc->codeword_text_out =
+ calloc (strlen(dc->codeword_text) + 1, sizeof(*dc->codeword_text_out));
+ dc->codeword_text_points =
+ (int *) calloc (strlen(dc->codeword_text) + 1,
+ sizeof(*dc->codeword_text_points));
+
+ dc->codeword_facets = get_integer_resource(mi->dpy, "cwFacets", "Integer");
+ dc->codeword_disc_facets = get_integer_resource(mi->dpy,
+ "cwDiscFacets", "Integer");
+ dc->codeword_spread = get_float_resource(mi->dpy, "cwSpread", "Float");
+ dc->codeword_line_width = get_float_resource(mi->dpy, "cwLineWidth", "Float");
+ dc->codeword_thickness = get_float_resource(mi->dpy, "cwThickness", "Float");
+ dc->codeword_cap_size = get_float_resource(mi->dpy, "cwCapSize", "Float");
+# endif
+
+ {
+ char *s = get_string_resource (MI_DISPLAY (mi), "mode", "String");
+ if (!s || !*s || !strcasecmp (s, "helix"))
+ dc->mode = HELIX;
+ else if (!strcasecmp (s, "pizza"))
+ dc->mode = PIZZA;
+ else if (!strcasecmp (s, "both"))
+ dc->mode = HELIX_AND_PIZZA;
+# ifdef CW
+ else if (!strcasecmp (s, "codeword"))
+ dc->mode = CODEWORD_IN;
+# endif
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be helix, pizza or both, not \"%s\"\n",
+ progname, s);
+ exit (1);
+ }
+ if (s) free (s);
+
+ dc->anim_state = (dc->mode == HELIX_AND_PIZZA
+ ? ((random() & 1) ? HELIX : PIZZA)
+ : dc->mode);
+ dc->anim_ratio = 0;
+ }
+
+# ifdef CW
+ if (dc->mode == CODEWORD_IN)
+ dc->font = load_texture_font (MI_DISPLAY(mi), "cwFont");
+# endif
+
+# ifdef DEBUG
+ dc->label_font = load_texture_font (MI_DISPLAY(mi), "fpsFont");
+# endif
+
+ {
+ XColor xcolor;
+
+ char *color_name =
+ get_string_resource (mi->dpy, "foreground", "Foreground");
+ char *s2;
+ for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
+ if (*s2 == ' ' || *s2 == '\t')
+ *s2 = 0;
+ else
+ break;
+
+ if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
+ {
+ fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
+ exit (1);
+ }
+
+ dc->color[0] = xcolor.red / 65535.0;
+ dc->color[1] = xcolor.green / 65535.0;
+ dc->color[2] = xcolor.blue / 65535.0;
+ dc->color[3] = 1.0;
+
+ color_name = get_string_resource (mi->dpy, "cwForeground", "Foreground");
+ for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
+ if (*s2 == ' ' || *s2 == '\t')
+ *s2 = 0;
+ else
+ break;
+
+ if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
+ {
+ fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
+ exit (1);
+ }
+
+# ifdef CW
+ dc->codeword_color[0] = xcolor.red / 65535.0;
+ dc->codeword_color[1] = xcolor.green / 65535.0;
+ dc->codeword_color[2] = xcolor.blue / 65535.0;
+ dc->codeword_color[3] = 1.0;
+
+ color_name = get_string_resource (mi->dpy, "cwBackground", "Background");
+ for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
+ if (*s2 == ' ' || *s2 == '\t')
+ *s2 = 0;
+ else
+ break;
+
+ if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
+ {
+ fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
+ exit (1);
+ }
+
+ dc->codeword_bg[0] = xcolor.red / 65535.0;
+ dc->codeword_bg[1] = xcolor.green / 65535.0;
+ dc->codeword_bg[2] = xcolor.blue / 65535.0;
+ dc->codeword_bg[3] = 1.0;
+# endif /* CW */
+ }
+
+ dc->trackball = gltrackball_init (False);
+
+ dc->gasket_spinnerx.probability = 0.1;
+ dc->gasket_spinnery.probability = 0.1;
+ dc->gasket_spinnerz.probability = 1.0;
+ dc->gasket_spinnerx.easement = 0.08;
+ dc->gasket_spinnery.easement = 0.08;
+ dc->gasket_spinnerz.easement = 0.08;
+
+ dc->helix_spinnerz.probability = 0.6;
+ dc->helix_spinnerz.easement = 0.2;
+
+ dc->pizza_spinnerz.probability = 0.6;
+ dc->pizza_spinnery.probability = 0.6;
+ dc->pizza_spinnerz.easement = 0.2;
+ dc->pizza_spinnery.easement = 0.2;
+
+ dc->frame_spinner.probability = 5.0;
+ dc->frame_spinner.easement = 0.2;
+
+ dc->scene_spinnerx.probability = 0.1;
+ dc->scene_spinnery.probability = 0.0;
+ dc->scene_spinnerx.easement = 0.1;
+ dc->scene_spinnery.easement = 0.1;
+
+# ifdef CW
+ if (dc->mode == CODEWORD_IN)
+ {
+ double tilt_speed = 0.003;
+ dc->scene_rot = make_rotator (0, 0, 0, 0, tilt_speed, True);
+ }
+# endif
+
+ /* start the frame off-screen */
+ dc->frame_spinner.spinning_p = True;
+ dc->frame_spinner.position = 0.3;
+ dc->frame_spinner.speed = 0.001;
+
+ if (dc->speed > 0) /* start off with the gasket in motion */
+ {
+ dc->gasket_spinnerz.spinning_p = True;
+ dc->gasket_spinnerz.speed = (0.002
+ * ((random() & 1) ? 1 : -1)
+ * dc->speed);
+ }
+
+# ifdef DXF_OUTPUT_HACK
+ {
+# if 0
+ dc->frame_depth = dc->gasket_depth;
+ dxf_layer = 1;
+ dxf_color = 3;
+ dxf_start();
+ glPushMatrix();
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+ make_pizza (dc, 0, 0);
+
+ glPushMatrix();
+ glRotatef(helix_rot, 0, 0, 1);
+ make_ladder (dc, 0, 0);
+ make_helix (dc, 0, 0);
+ glRotatef (180, 0, 0, 1);
+ make_helix (dc, 0, 0);
+ glPopMatrix();
+
+ dxf_layer++;
+ make_gasket (dc, 0);
+ dxf_layer++;
+ make_frame (dc, 0);
+ glPopMatrix();
+ dxf_end();
+# else
+ dxf_start();
+ glPushMatrix();
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+ dc->anim_state = CODEWORD;
+ make_codeword_path (mi);
+ draw_codeword_path (mi);
+ glPopMatrix();
+ dxf_end();
+# endif
+ }
+# endif
+
+ glPushMatrix();
+ dc->helix_list = glGenLists (1);
+ glNewList (dc->helix_list, GL_COMPILE);
+ glRotatef(helix_rot, 0, 0, 1);
+ if (do_ladder) dc->polys[0] += make_ladder (dc, 0, 0);
+ if (do_helix) dc->polys[0] += make_helix (dc, 0, 0);
+ glRotatef(180, 0, 0, 1);
+ if (do_helix) dc->polys[0] += make_helix (dc, 0, 0);
+ glEndList ();
+ glPopMatrix();
+
+ glPushMatrix();
+ dc->helix_list_wire = glGenLists (1);
+ glNewList (dc->helix_list_wire, GL_COMPILE);
+/* glRotatef(helix_rot, 0, 0, 1); wtf? */
+ if (do_ladder) dc->polys[1] += make_ladder (dc, 1, 1);
+ if (do_helix) dc->polys[1] += make_helix (dc, 1, 1);
+ glRotatef(180, 0, 0, 1);
+ if (do_helix) dc->polys[1] += make_helix (dc, 1, 1);
+ glEndList ();
+ glPopMatrix();
+
+ glPushMatrix();
+ dc->helix_list_facetted = glGenLists (1);
+ glNewList (dc->helix_list_facetted, GL_COMPILE);
+ glRotatef(helix_rot, 0, 0, 1);
+ if (do_ladder) dc->polys[2] += make_ladder (dc, 1, 0);
+ if (do_helix) dc->polys[2] += make_helix (dc, 1, 0);
+ glRotatef(180, 0, 0, 1);
+ if (do_helix) dc->polys[2] += make_helix (dc, 1, 0);
+ glEndList ();
+ glPopMatrix();
+
+ dc->pizza_list = glGenLists (1);
+ glNewList (dc->pizza_list, GL_COMPILE);
+ if (do_frame) dc->polys[5] += make_pizza (dc, 0, 0);
+ glEndList ();
+
+ dc->pizza_list_wire = glGenLists (1);
+ glNewList (dc->pizza_list_wire, GL_COMPILE);
+ if (do_frame) dc->polys[6] += make_pizza (dc, 1, 1);
+ glEndList ();
+
+ dc->pizza_list_facetted = glGenLists (1);
+ glNewList (dc->pizza_list_facetted, GL_COMPILE);
+ if (do_frame) dc->polys[6] += make_pizza (dc, 1, 0);
+ glEndList ();
+
+ dc->gasket_list = glGenLists (1);
+ glNewList (dc->gasket_list, GL_COMPILE);
+ if (do_gasket) dc->polys[3] += make_gasket (dc, 0);
+ glEndList ();
+
+ dc->gasket_list_wire = glGenLists (1);
+ glNewList (dc->gasket_list_wire, GL_COMPILE);
+ if (do_gasket) dc->polys[4] += make_gasket (dc, 1);
+ glEndList ();
+
+ dc->frame_list = glGenLists (1);
+ glNewList (dc->frame_list, GL_COMPILE);
+ if (do_frame) dc->polys[5] += make_frame (dc, 0);
+ glEndList ();
+
+ dc->frame_list_wire = glGenLists (1);
+ glNewList (dc->frame_list_wire, GL_COMPILE);
+ if (do_frame) dc->polys[6] += make_frame (dc, 1);
+ glEndList ();
+
+# ifdef CW
+ make_codeword_path (mi);
+# endif
+
+ /* When drawing both solid and wireframe objects,
+ make sure the wireframe actually shows up! */
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+}
+
+
+ENTRYPOINT Bool
+logo_handle_event (ModeInfo *mi, XEvent *event)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, dc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &dc->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+# ifdef DEBUG
+ {
+ GLfloat step = 0.1;
+ if (c == 'a') dc->persp_off += step;
+ else if (c == 'z') dc->persp_off -= step;
+ else if (c == 's') dc->pos_off += step;
+ else if (c == 'x') dc->pos_off -= step;
+ else return False;
+
+ /* dc->pos_off = -dc->persp_off; */
+ reshape_logo (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+# endif
+
+ if (c == ' ' || c == '\t')
+ {
+ switch (dc->anim_state) {
+ case HELIX:
+ dc->anim_state = HELIX_OUT;
+ dc->anim_ratio = 0.0;
+ return True;
+ case PIZZA:
+ dc->anim_state = PIZZA_OUT;
+ dc->anim_ratio = 0.0;
+ return True;
+# ifdef CW
+ case CODEWORD:
+ dc->anim_state = CODEWORD_OUT;
+ dc->anim_ratio = 0.0;
+ return True;
+# endif
+ default:
+ break;
+ }
+ }
+ }
+
+ return False;
+}
+
+
+static GLfloat
+spinner_ease (GLfloat x)
+{
+ /* Smooth curve up, ending at slope = 1. */
+ return cos ((x/2 + 1) * M_PI) + 1;
+}
+
+
+static void
+tick_spinner (ModeInfo *mi, spinner *s)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+
+ if (dc->speed == 0) return;
+ if (dc->button_down_p) return;
+
+ if (s->spinning_p)
+ {
+ s->position += s->speed;
+ if (s->position >= 1.0 || s->position <= 0.0)
+ {
+ s->position = 0;
+ s->position_eased = 0;
+ s->spinning_p = False;
+ }
+ else if (s->easement > 0 && s->position <= s->easement)
+ s->position_eased = (s->easement *
+ spinner_ease (s->position / s->easement));
+ else if (s->easement > 0 && s->position >= 1-s->easement)
+ s->position_eased = (1 - s->easement *
+ spinner_ease ((1 - s->position) / s->easement));
+ else
+ s->position_eased = s->position;
+ }
+ else if (s->probability &&
+ (random() % (int) (PROBABILITY_SCALE / s->probability)) == 0)
+ {
+ GLfloat ss = 0.004;
+ s->spinning_p = True;
+ s->position = 0;
+ do {
+ s->speed = dc->speed * (frand(ss/3) + frand(ss/3) + frand(ss/3));
+ } while (s->speed <= 0);
+ if (random() & 1)
+ {
+ s->speed = -s->speed;
+ s->position = 1.0;
+ }
+ }
+}
+
+
+static void
+link_spinners (ModeInfo *mi, spinner *s0, spinner *s1)
+{
+ if (s0->spinning_p && !s1->spinning_p)
+ {
+ GLfloat op = s1->probability;
+ s1->probability = PROBABILITY_SCALE;
+ tick_spinner (mi, s1);
+ s1->probability = op;
+ }
+}
+
+
+ENTRYPOINT void
+draw_logo (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat gcolor[4];
+ GLfloat specular[] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat shininess = 50.0;
+ Bool pizza_p;
+# ifdef CW
+ Bool codeword_p;
+# endif
+
+ if (!dc->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(dc->glx_context));
+
+ if (!wire &&
+ dc->wire_overlay == 0 &&
+ (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
+ dc->wire_overlay = ((random() % 200) +
+ (random() % 200) +
+ (random() % 200));
+
+# ifndef DEBUG
+ tick_spinner (mi, &dc->gasket_spinnerx);
+ tick_spinner (mi, &dc->gasket_spinnery);
+ tick_spinner (mi, &dc->gasket_spinnerz);
+ tick_spinner (mi, &dc->helix_spinnerz);
+ tick_spinner (mi, &dc->pizza_spinnery);
+ tick_spinner (mi, &dc->pizza_spinnerz);
+ tick_spinner (mi, &dc->scene_spinnerx);
+ tick_spinner (mi, &dc->scene_spinnery);
+ tick_spinner (mi, &dc->frame_spinner);
+ link_spinners (mi, &dc->scene_spinnerx, &dc->scene_spinnery);
+# endif /* DEBUG */
+
+ switch (dc->anim_state)
+ {
+ case HELIX:
+ if (dc->mode == HELIX_AND_PIZZA &&
+ (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
+ dc->anim_state = HELIX_OUT;
+ break;
+
+ case HELIX_OUT:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = PIZZA_IN;
+ }
+ break;
+
+ case PIZZA_IN:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = PIZZA;
+ }
+ break;
+
+ case PIZZA:
+ if (dc->mode == HELIX_AND_PIZZA &&
+ (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
+ dc->anim_state = PIZZA_OUT;
+ break;
+
+ case PIZZA_OUT:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = HELIX_IN;
+ }
+ break;
+
+ case HELIX_IN:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = HELIX;
+ }
+ break;
+
+
+# ifdef CW
+ case CODEWORD_IN:
+ dc->scene_spinnerx.probability = 0.2;
+ dc->scene_spinnery.probability = 0.05;
+ if (! dc->button_down_p)
+ dc->anim_ratio += 0.004 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_state = CODEWORD;
+ dc->anim_ratio = frand (0.5);
+ }
+ break;
+
+ case CODEWORD:
+ dc->scene_spinnerx.probability = 0.5;
+ dc->scene_spinnery.probability = 0.2;
+ if (! dc->button_down_p)
+ dc->anim_ratio += (0.0005 + frand(0.002)) * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = CODEWORD_OUT;
+ }
+ break;
+
+ case CODEWORD_OUT:
+ dc->scene_spinnerx.probability = 0;
+ dc->scene_spinnery.probability = 0;
+ if (! dc->button_down_p)
+ dc->anim_ratio += 0.02 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = CODEWORD_BLANK;
+ }
+ break;
+
+ case CODEWORD_BLANK:
+ dc->scene_spinnerx.probability = 0;
+ dc->scene_spinnery.probability = 0;
+ if (! dc->button_down_p)
+ dc->anim_ratio += 0.01 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = CODEWORD_IN;
+ }
+ break;
+# endif /* CW */
+
+ default:
+ abort();
+ break;
+ }
+
+# ifdef DEBUG
+ dc->anim_state = HELIX;
+ dc->wire_overlay = 0;
+# endif
+
+ pizza_p = (dc->anim_state == PIZZA ||
+ dc->anim_state == PIZZA_IN ||
+ dc->anim_state == PIZZA_OUT);
+
+# ifdef CW
+ codeword_p = (dc->anim_state == CODEWORD ||
+ dc->anim_state == CODEWORD_IN ||
+ dc->anim_state == CODEWORD_OUT ||
+ dc->anim_state == CODEWORD_BLANK);
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ {
+ GLfloat scale = 1.8;
+ glScalef(scale, scale, scale);
+
+ glColor3f(dc->color[0], dc->color[1], dc->color[2]);
+
+
+ /* Draw frame before trackball rotation */
+# ifdef CW
+ if (! codeword_p)
+# endif
+ {
+ GLfloat p = (dc->frame_spinner.position_eased >= 0
+ ? dc->frame_spinner.position_eased
+ : -dc->frame_spinner.position_eased);
+ GLfloat size = (p > 0.5 ? 1-p : p);
+ scale = 1 + (size * 10);
+ glPushMatrix();
+ /* gltrackball_rotate (dc->trackball); */
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+
+ glScalef (1, scale, scale);
+ if (wire)
+ {
+ glDisable (GL_LIGHTING);
+ glCallList (dc->frame_list_wire);
+ mi->polygon_count += dc->polys[6];
+ }
+ else if (dc->wire_overlay != 0)
+ {
+ glCallList (dc->frame_list);
+ glDisable (GL_LIGHTING);
+ glColor3fv (dc->color);
+ glCallList (dc->frame_list_wire);
+ mi->polygon_count += dc->polys[6];
+ if (!wire) glEnable (GL_LIGHTING);
+ }
+ else
+ {
+ glCallList (dc->frame_list);
+ mi->polygon_count += dc->polys[5];
+ }
+ glPopMatrix();
+ }
+
+ gltrackball_rotate (dc->trackball);
+
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+
+# ifdef CW
+ if (! codeword_p)
+# endif
+ {
+ glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0);
+ glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1);
+
+ glPushMatrix();
+
+ glRotatef (360 * dc->gasket_spinnerx.position_eased, 0, 1, 0);
+ glRotatef (360 * dc->gasket_spinnery.position_eased, 0, 0, 1);
+ glRotatef (360 * dc->gasket_spinnerz.position_eased, 1, 0, 0);
+
+ memcpy (gcolor, dc->color, sizeof (dc->color));
+ if (dc->wire_overlay != 0)
+ {
+ gcolor[0] = gcolor[1] = gcolor[2] = 0;
+ specular[0] = specular[1] = specular[2] = 0;
+ shininess = 0;
+ }
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, gcolor);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+
+ if (wire)
+ {
+ glDisable (GL_LIGHTING);
+ glCallList (dc->gasket_list_wire);
+ mi->polygon_count += dc->polys[4];
+ }
+ else if (dc->wire_overlay != 0)
+ {
+ glCallList (dc->gasket_list);
+ glDisable (GL_LIGHTING);
+ glColor3fv (dc->color);
+ glCallList (dc->gasket_list_wire);
+ mi->polygon_count += dc->polys[4];
+ if (!wire) glEnable (GL_LIGHTING);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, gcolor);
+ }
+ else
+ {
+ glCallList (dc->gasket_list);
+ mi->polygon_count += dc->polys[3];
+ }
+ glPopMatrix();
+
+ if (pizza_p)
+ {
+ glRotatef (360 * dc->pizza_spinnery.position_eased, 1, 0, 0);
+ glRotatef (360 * dc->pizza_spinnerz.position_eased, 0, 0, 1);
+ }
+ else
+ {
+ glRotatef (360 * dc->helix_spinnerz.position_eased, 0, 0, 1);
+ }
+
+ scale = ((dc->anim_state == PIZZA_IN || dc->anim_state == HELIX_IN)
+ ? dc->anim_ratio
+ : ((dc->anim_state == PIZZA_OUT || dc->anim_state == HELIX_OUT)
+ ? 1.0 - dc->anim_ratio
+ : 1.0));
+ if (scale <= 0) scale = 0.001;
+ glScalef (scale, scale, scale);
+
+ if (wire)
+ {
+ glDisable (GL_LIGHTING);
+ if (pizza_p)
+ glCallList (dc->pizza_list_wire);
+ else
+ glCallList (dc->helix_list_wire);
+ mi->polygon_count += dc->polys[1];
+ }
+ else if (dc->wire_overlay != 0)
+ {
+ if (pizza_p)
+ glCallList (dc->pizza_list_facetted);
+ else
+ glCallList (dc->helix_list_facetted);
+
+ glDisable (GL_LIGHTING);
+ glColor3fv (dc->color);
+
+ if (pizza_p)
+ glCallList (dc->pizza_list_wire);
+ else
+ glCallList (dc->helix_list_wire);
+
+ mi->polygon_count += dc->polys[2];
+ if (!wire) glEnable (GL_LIGHTING);
+ }
+ else
+ {
+ if (pizza_p)
+ glCallList (dc->pizza_list);
+ else
+ glCallList (dc->helix_list);
+ mi->polygon_count += dc->polys[0];
+ }
+ }
+# ifdef CW
+ else /* codeword_p */
+ {
+# if 0
+ double max = 70; /* face front */
+ double x, y, z;
+ get_position (dc->scene_rot, &x, &y, &z, !dc->button_down_p);
+ glRotatef (max/2 - x*max, 0, 0, 1);
+ glRotatef (max/2 - y*max, 0, 1, 0);
+ /* glRotatef (max/2 - z*max, 1, 0, 0); */
+# else
+ glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0);
+ glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1);
+# endif
+
+ glClearColor (dc->codeword_bg[0],
+ dc->codeword_bg[1],
+ dc->codeword_bg[2],
+ dc->codeword_bg[3]);
+ mi->polygon_count += draw_codeword_path (mi);
+ }
+# endif /* CW */
+ }
+ glPopMatrix();
+
+ if (dc->wire_overlay > 0)
+ dc->wire_overlay--;
+
+# ifdef DEBUG
+ {
+ char s[1024];
+ sprintf (s, "a/z, s/x; per = %0.2f pos = %0.2f",
+ dc->persp_off, dc->pos_off);
+ glColor3f (1,1,1);
+ print_texture_label (dpy, dc->label_font, MI_WIDTH(mi), MI_HEIGHT(mi),
+ 1, s);
+ }
+# endif
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("DNALogo", dnalogo, logo)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/dnapizza.h b/hacks/glx/dnapizza.h
new file mode 100644
index 0000000..6dd48b9
--- /dev/null
+++ b/hacks/glx/dnapizza.h
@@ -0,0 +1,122 @@
+/* DNA Pizza Logo, Copyright (c) 2011-2012 Jamie Zawinski <jwz@dnalounge.com>
+
+ Since GLUtesselator doesn't exist in the iOS build, the slice shape
+ of the DNA Pizza logo is hardcoded there, instead of being generated.
+ (These vertexes were generated by GLUtesselator and saved.)
+ */
+
+static const GLfloat dnapizza_triangles[]={
+ 0.315,0.213301,0, 0.296699,0.195,0, 0.309,0.455,0,
+ 0.296699,0.195,0, 0.29,0.17,0, 0.309,0.455,0,
+ 0.309,0.455,0, 0.29,0.17,0, 0.26,0.452,0,
+ 0.29,0.17,0, 0.23,0.042,0, 0.26,0.452,0,
+ 0.26,0.452,0, 0.23,0.042,0, 0.216,0.293,0,
+ 0.23,0.042,0, 0.21,0,0, 0.216,0.293,0,
+ 0.216,0.293,0, 0.21,0,0, 0.149,0.178,0,
+ 0.21,0,0, 0.102,0.178,0, 0.149,0.178,0,
+ 0.376,0.572,0, 0.353,0.613,0, 0.411,0.68402,0,
+ 0.376,0.572,0, 0.411,0.68402,0, 0.383301,0.195,0,
+ 0.376,0.572,0, 0.383301,0.195,0, 0.365,0.213301,0,
+ 0.376,0.572,0, 0.365,0.213301,0, 0.34,0.22,0,
+ 0.376,0.572,0, 0.34,0.22,0, 0.315,0.213301,0,
+ 0.376,0.572,0, 0.315,0.213301,0, 0.309,0.455,0,
+ 0.39,0.17,0, 0.383301,0.195,0, 0.411,0.68402,0,
+ 0.39,0.17,0, 0.411,0.68402,0, 0.48,0.17,0,
+ 0.39,0.17,0, 0.48,0.17,0, 0.488039,0.14,0,
+ 0.39,0.17,0, 0.488039,0.14,0, 0.51,0.118038,0,
+ 0.39,0.17,0, 0.51,0.118038,0, 0.616,0.042,0,
+ 0.39,0.17,0, 0.616,0.042,0, 0.383301,0.145,0,
+ 0.798,0,0, 0.641,0,0, 0.645595,0.469053,0,
+ 0.798,0,0, 0.645595,0.469053,0, 0.653683,0.457714,0,
+ 0.798,0,0, 0.653683,0.457714,0, 0.661572,0.446236,0,
+ 0.798,0,0, 0.661572,0.446236,0, 0.669259,0.434622,0,
+ 0.798,0,0, 0.669259,0.434622,0, 0.676742,0.422876,0,
+ 0.798,0,0, 0.676742,0.422876,0, 0.68402,0.411,0,
+ 0.798,0,0, 0.68402,0.411,0, 0.691088,0.399,0,
+ 0.798,0,0, 0.691088,0.399,0, 0.697947,0.386878,0,
+ 0.798,0,0, 0.697947,0.386878,0, 0.704592,0.374638,0,
+ 0.798,0,0, 0.704592,0.374638,0, 0.711023,0.362284,0,
+ 0.798,0,0, 0.711023,0.362284,0, 0.717238,0.34982,0,
+ 0.798,0,0, 0.717238,0.34982,0, 0.723234,0.337249,0,
+ 0.798,0,0, 0.723234,0.337249,0, 0.729009,0.324576,0,
+ 0.798,0,0, 0.729009,0.324576,0, 0.734563,0.311803,0,
+ 0.798,0,0, 0.734563,0.311803,0, 0.739893,0.298936,0,
+ 0.798,0,0, 0.739893,0.298936,0, 0.744997,0.285978,0,
+ 0.798,0,0, 0.744997,0.285978,0, 0.749875,0.272932,0,
+ 0.798,0,0, 0.749875,0.272932,0, 0.754524,0.259803,0,
+ 0.798,0,0, 0.754524,0.259803,0, 0.758943,0.246596,0,
+ 0.798,0,0, 0.758943,0.246596,0, 0.763131,0.233313,0,
+ 0.798,0,0, 0.763131,0.233313,0, 0.767087,0.219959,0,
+ 0.798,0,0, 0.767087,0.219959,0, 0.770809,0.206538,0,
+ 0.798,0,0, 0.770809,0.206538,0, 0.774296,0.193054,0,
+ 0.798,0,0, 0.774296,0.193054,0, 0.777547,0.179511,0,
+ 0.798,0,0, 0.777547,0.179511,0, 0.780562,0.165914,0,
+ 0.798,0,0, 0.780562,0.165914,0, 0.783338,0.152266,0,
+ 0.798,0,0, 0.783338,0.152266,0, 0.785877,0.138571,0,
+ 0.798,0,0, 0.785877,0.138571,0, 0.788175,0.124835,0,
+ 0.798,0,0, 0.788175,0.124835,0, 0.790234,0.11106,0,
+ 0.798,0,0, 0.790234,0.11106,0, 0.792052,0.097252,0,
+ 0.798,0,0, 0.792052,0.097252,0, 0.793628,0.083414,0,
+ 0.798,0,0, 0.793628,0.083414,0, 0.794963,0.06955,0,
+ 0.798,0,0, 0.794963,0.06955,0, 0.796056,0.055666,0,
+ 0.798,0,0, 0.796056,0.055666,0, 0.796906,0.041764,0,
+ 0.798,0,0, 0.796906,0.041764,0, 0.797514,0.02785,0,
+ 0.798,0,0, 0.797514,0.02785,0, 0.797878,0.013927,0,
+ 0.641,0,0, 0.616,0.042,0, 0.620162,0.502198,0,
+ 0.641,0,0, 0.620162,0.502198,0, 0.628833,0.491298,0,
+ 0.641,0,0, 0.628833,0.491298,0, 0.637311,0.480248,0,
+ 0.641,0,0, 0.637311,0.480248,0, 0.645595,0.469053,0,
+ 0.616,0.042,0, 0.51,0.118038,0, 0.54,0.11,0,
+ 0.616,0.042,0, 0.54,0.11,0, 0.57,0.118038,0,
+ 0.616,0.042,0, 0.57,0.118038,0, 0.591962,0.14,0,
+ 0.616,0.042,0, 0.591962,0.14,0, 0.6,0.17,0,
+ 0.616,0.042,0, 0.6,0.17,0, 0.601962,0.33,0,
+ 0.616,0.042,0, 0.601962,0.33,0, 0.61,0.36,0,
+ 0.616,0.042,0, 0.61,0.36,0, 0.611303,0.512945,0,
+ 0.616,0.042,0, 0.611303,0.512945,0, 0.620162,0.502198,0,
+ 0.48,0.17,0, 0.411,0.68402,0, 0.422875,0.676743,0,
+ 0.48,0.17,0, 0.422875,0.676743,0, 0.434622,0.669259,0,
+ 0.48,0.17,0, 0.434622,0.669259,0, 0.446236,0.661572,0,
+ 0.48,0.17,0, 0.446236,0.661572,0, 0.457714,0.653684,0,
+ 0.48,0.17,0, 0.457714,0.653684,0, 0.469052,0.645596,0,
+ 0.48,0.17,0, 0.469052,0.645596,0, 0.480248,0.637311,0,
+ 0.48,0.17,0, 0.480248,0.637311,0, 0.488038,0.2,0,
+ 0.616,0.042,0, 0.23,0.042,0, 0.315,0.126699,0,
+ 0.616,0.042,0, 0.315,0.126699,0, 0.34,0.12,0,
+ 0.616,0.042,0, 0.34,0.12,0, 0.365,0.126699,0,
+ 0.616,0.042,0, 0.365,0.126699,0, 0.383301,0.145,0,
+ 0.23,0.042,0, 0.29,0.17,0, 0.296699,0.145,0,
+ 0.23,0.042,0, 0.296699,0.145,0, 0.315,0.126699,0,
+ 0.58362,0.544235,0, 0.593029,0.533966,0, 0.601961,0.39,0,
+ 0.593029,0.533966,0, 0.602258,0.523535,0, 0.601961,0.39,0,
+ 0.601961,0.39,0, 0.602258,0.523535,0, 0.61,0.36,0,
+ 0.602258,0.523535,0, 0.611303,0.512945,0, 0.61,0.36,0,
+ 0.58,0.411962,0, 0.55,0.42,0, 0.554337,0.574033,0,
+ 0.58,0.411962,0, 0.554337,0.574033,0, 0.564271,0.564271,0,
+ 0.58,0.411962,0, 0.564271,0.564271,0, 0.574033,0.554338,0,
+ 0.58,0.411962,0, 0.574033,0.554338,0, 0.58362,0.544235,0,
+ 0.58,0.411962,0, 0.58362,0.544235,0, 0.601961,0.39,0,
+ 0.55,0.42,0, 0.52,0.411962,0, 0.523535,0.602258,0,
+ 0.55,0.42,0, 0.523535,0.602258,0, 0.533966,0.59303,0,
+ 0.55,0.42,0, 0.533966,0.59303,0, 0.544235,0.58362,0,
+ 0.55,0.42,0, 0.544235,0.58362,0, 0.554337,0.574033,0,
+ 0.51,0.221962,0, 0.488038,0.2,0, 0.49,0.36,0,
+ 0.488038,0.2,0, 0.491298,0.628833,0, 0.49,0.36,0,
+ 0.49,0.36,0, 0.491298,0.628833,0, 0.498038,0.39,0,
+ 0.491298,0.628833,0, 0.502197,0.620163,0, 0.498038,0.39,0,
+ 0.498038,0.39,0, 0.502197,0.620163,0, 0.52,0.411962,0,
+ 0.502197,0.620163,0, 0.512944,0.611304,0, 0.52,0.411962,0,
+ 0.52,0.411962,0, 0.512944,0.611304,0, 0.523535,0.602258,0,
+ 0.49,0.36,0, 0.498039,0.33,0, 0.51,0.221962,0,
+ 0.498039,0.33,0, 0.52,0.308039,0, 0.51,0.221962,0,
+ 0.51,0.221962,0, 0.52,0.308039,0, 0.54,0.23,0,
+ 0.52,0.308039,0, 0.55,0.3,0, 0.54,0.23,0,
+ 0.54,0.23,0, 0.55,0.3,0, 0.57,0.221962,0,
+ 0.55,0.3,0, 0.58,0.308039,0, 0.57,0.221962,0,
+ 0.57,0.221962,0, 0.58,0.308039,0, 0.591962,0.2,0,
+ 0.58,0.308039,0, 0.601962,0.33,0, 0.591962,0.2,0,
+ 0.591962,0.2,0, 0.601962,0.33,0, 0.6,0.17,0,
+ 0.488038,0.2,0, 0.480248,0.637311,0, 0.491298,0.628833,0,
+ 0.26,0.452,0, 0.216,0.293,0, 0.192,0.332,0,
+ 0.102,0.178,0, 0.21,0,0, 0,0,0,
+};
diff --git a/hacks/glx/dolphin.c b/hacks/glx/dolphin.c
new file mode 100644
index 0000000..2ef4e33
--- /dev/null
+++ b/hacks/glx/dolphin.c
@@ -0,0 +1,2061 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if 0
+static const char sccsid[] = "@(#)dolphin.c 1.2 98/06/16 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+/* *INDENT-OFF* */
+static const float N001[3] = {-0.005937, -0.101998, -0.994767};
+static const float N002[3] = {0.93678, -0.200803, 0.286569};
+static const float N003[3] = {-0.233062, 0.972058, 0.028007};
+#if 0
+static const float N004[3] = {0, 1, 0};
+#endif
+static const float N005[3] = {0.898117, 0.360171, 0.252315};
+static const float N006[3] = {-0.915437, 0.348456, 0.201378};
+static const float N007[3] = {0.602263, -0.777527, 0.18092};
+static const float N008[3] = {-0.906912, -0.412015, 0.088061};
+#if 0
+static const float N009[3] = {-0.015623, 0.999878, 0};
+static const float N010[3] = {0, -0.992278, 0.124035};
+static const float N011[3] = {0, -0.936329, -0.351123};
+#endif
+static const float N012[3] = {0.884408, -0.429417, -0.182821};
+static const float N013[3] = {0.921121, 0.311084, -0.234016};
+static const float N014[3] = {0.382635, 0.877882, -0.287948};
+static const float N015[3] = {-0.380046, 0.888166, -0.258316};
+static const float N016[3] = {-0.891515, 0.392238, -0.226607};
+static const float N017[3] = {-0.901419, -0.382002, -0.203763};
+static const float N018[3] = {-0.367225, -0.911091, -0.187243};
+static const float N019[3] = {0.339539, -0.924846, -0.171388};
+static const float N020[3] = {0.914706, -0.378617, -0.14129};
+static const float N021[3] = {0.950662, 0.262713, -0.164994};
+static const float N022[3] = {0.546359, 0.80146, -0.243218};
+static const float N023[3] = {-0.315796, 0.917068, -0.243431};
+static const float N024[3] = {-0.825687, 0.532277, -0.186875};
+static const float N025[3] = {-0.974763, -0.155232, -0.160435};
+static const float N026[3] = {-0.560596, -0.816658, -0.137119};
+static const float N027[3] = {0.38021, -0.910817, -0.160786};
+static const float N028[3] = {0.923772, -0.358322, -0.135093};
+static const float N029[3] = {0.951202, 0.275053, -0.139859};
+static const float N030[3] = {0.686099, 0.702548, -0.188932};
+static const float N031[3] = {-0.521865, 0.826719, -0.21022};
+static const float N032[3] = {-0.92382, 0.346739, -0.162258};
+static const float N033[3] = {-0.902095, -0.409995, -0.134646};
+static const float N034[3] = {-0.509115, -0.848498, -0.144404};
+static const float N035[3] = {0.456469, -0.880293, -0.129305};
+static const float N036[3] = {0.873401, -0.475489, -0.105266};
+static const float N037[3] = {0.970825, 0.179861, -0.158584};
+static const float N038[3] = {0.675609, 0.714187, -0.183004};
+static const float N039[3] = {-0.523574, 0.830212, -0.19136};
+static const float N040[3] = {-0.958895, 0.230808, -0.165071};
+static const float N041[3] = {-0.918285, -0.376803, -0.121542};
+static const float N042[3] = {-0.622467, -0.774167, -0.114888};
+static const float N043[3] = {0.404497, -0.908807, -0.102231};
+static const float N044[3] = {0.930538, -0.365155, -0.027588};
+static const float N045[3] = {0.92192, 0.374157, -0.100345};
+static const float N046[3] = {0.507346, 0.860739, 0.041562};
+static const float N047[3] = {-0.394646, 0.918815, -0.00573};
+static const float N048[3] = {-0.925411, 0.373024, -0.066837};
+static const float N049[3] = {-0.945337, -0.322309, -0.049551};
+static const float N050[3] = {-0.660437, -0.750557, -0.022072};
+static const float N051[3] = {0.488835, -0.87195, -0.027261};
+static const float N052[3] = {0.902599, -0.421397, 0.087969};
+static const float N053[3] = {0.938636, 0.322606, 0.12202};
+static const float N054[3] = {0.484605, 0.871078, 0.079878};
+static const float N055[3] = {-0.353607, 0.931559, 0.084619};
+static const float N056[3] = {-0.867759, 0.478564, 0.134054};
+static const float N057[3] = {-0.951583, -0.29603, 0.082794};
+static const float N058[3] = {-0.672355, -0.730209, 0.121384};
+static const float N059[3] = {0.528336, -0.842452, 0.105525};
+static const float N060[3] = {0.786913, -0.56476, 0.248627};
+#if 0
+static const float N061[3] = {0, 1, 0};
+#endif
+static const float N062[3] = {0.622098, 0.76523, 0.165584};
+static const float N063[3] = {-0.631711, 0.767816, 0.106773};
+static const float N064[3] = {-0.687886, 0.606351, 0.398938};
+static const float N065[3] = {-0.946327, -0.281623, 0.158598};
+static const float N066[3] = {-0.509549, -0.860437, 0.002776};
+static const float N067[3] = {0.462594, -0.876692, 0.131977};
+#if 0
+static const float N068[3] = {0, -0.992278, 0.124035};
+static const float N069[3] = {0, -0.970143, -0.242536};
+static const float N070[3] = {0.015502, 0.992159, -0.12402};
+#endif
+static const float N071[3] = {0, 1, 0};
+#if 0
+static const float N072[3] = {0, 1, 0};
+static const float N073[3] = {0, 1, 0};
+static const float N074[3] = {0, -1, 0};
+static const float N075[3] = {-0.242536, 0, -0.970143};
+static const float N076[3] = {-0.010336, -0.992225, -0.124028};
+#endif
+static const float N077[3] = {-0.88077, 0.461448, 0.106351};
+static const float N078[3] = {-0.88077, 0.461448, 0.106351};
+static const float N079[3] = {-0.88077, 0.461448, 0.106351};
+static const float N080[3] = {-0.88077, 0.461448, 0.106351};
+static const float N081[3] = {-0.571197, 0.816173, 0.087152};
+static const float N082[3] = {-0.88077, 0.461448, 0.106351};
+static const float N083[3] = {-0.571197, 0.816173, 0.087152};
+static const float N084[3] = {-0.571197, 0.816173, 0.087152};
+static const float N085[3] = {-0.88077, 0.461448, 0.106351};
+static const float N086[3] = {-0.571197, 0.816173, 0.087152};
+static const float N087[3] = {-0.88077, 0.461448, 0.106351};
+static const float N088[3] = {-0.88077, 0.461448, 0.106351};
+static const float N089[3] = {-0.88077, 0.461448, 0.106351};
+static const float N090[3] = {-0.88077, 0.461448, 0.106351};
+static const float N091[3] = {0, 1, 0};
+static const float N092[3] = {0, 1, 0};
+static const float N093[3] = {0, 1, 0};
+static const float N094[3] = {1, 0, 0};
+static const float N095[3] = {-1, 0, 0};
+#if 0
+static const float N096[3] = {0, 1, 0};
+#endif
+static const float N097[3] = {-0.697296, 0.702881, 0.140491};
+static const float N098[3] = {0.918864, 0.340821, 0.198819};
+static const float N099[3] = {-0.932737, 0.201195, 0.299202};
+static const float N100[3] = {0.029517, 0.981679, 0.188244};
+#if 0
+static const float N101[3] = {0, 1, 0};
+#endif
+static const float N102[3] = {0.813521, -0.204936, 0.544229};
+#if 0
+static const float N103[3] = {0, 1, 0};
+static const float N104[3] = {0, 1, 0};
+static const float N105[3] = {0, 1, 0};
+static const float N106[3] = {0, 1, 0};
+static const float N107[3] = {0, 1, 0};
+static const float N108[3] = {0, 1, 0};
+static const float N109[3] = {0, 1, 0};
+#endif
+static const float N110[3] = {-0.78148, -0.384779, 0.491155};
+static const float N111[3] = {-0.722243, 0.384927, 0.574627};
+static const float N112[3] = {-0.752278, 0.502679, 0.425901};
+static const float N113[3] = {0.547257, 0.36791, 0.751766};
+static const float N114[3] = {0.725949, -0.232568, 0.647233};
+static const float N115[3] = {-0.747182, -0.660786, 0.07128};
+static const float N116[3] = {0.931519, 0.200748, 0.30327};
+static const float N117[3] = {-0.828928, 0.313757, 0.463071};
+static const float N118[3] = {0.902554, -0.370967, 0.218587};
+static const float N119[3] = {-0.879257, -0.441851, 0.177973};
+static const float N120[3] = {0.642327, 0.611901, 0.461512};
+static const float N121[3] = {0.964817, -0.202322, 0.16791};
+static const float N122[3] = {0, 1, 0};
+#if 0
+static const float N123[3] = {-0.980734, 0.041447, 0.1909};
+static const float N124[3] = {-0.980734, 0.041447, 0.1909};
+static const float N125[3] = {-0.980734, 0.041447, 0.1909};
+static const float N126[3] = {0, 1, 0};
+static const float N127[3] = {0, 1, 0};
+static const float N128[3] = {0, 1, 0};
+static const float N129[3] = {0.96325, 0.004839, 0.268565};
+static const float N130[3] = {0.96325, 0.004839, 0.268565};
+static const float N131[3] = {0.96325, 0.004839, 0.268565};
+static const float N132[3] = {0, 1, 0};
+static const float N133[3] = {0, 1, 0};
+static const float N134[3] = {0, 1, 0};
+#endif
+static float P001[3] = {5.68, -300.95, 1324.7};
+static const float P002[3] = {338.69, -219.63, 9677.03};
+static const float P003[3] = {12.18, 474.59, 9138.14};
+#if 0
+static const float P004[3] = {-7.49, -388.91, 10896.74};
+#endif
+static const float P005[3] = {487.51, 198.05, 9350.78};
+static const float P006[3] = {-457.61, 68.74, 9427.85};
+static const float P007[3] = {156.52, -266.72, 10311.68};
+static const float P008[3] = {-185.56, -266.51, 10310.47};
+static float P009[3] = {124.39, -261.46, 1942.34};
+static float P010[3] = {-130.05, -261.46, 1946.03};
+static float P011[3] = {141.07, -320.11, 1239.38};
+static float P012[3] = {156.48, -360.12, 2073.41};
+static float P013[3] = {162, -175.88, 2064.44};
+static float P014[3] = {88.16, -87.72, 2064.02};
+static float P015[3] = {-65.21, -96.13, 2064.02};
+static float P016[3] = {-156.48, -180.96, 2064.44};
+static float P017[3] = {-162, -368.93, 2082.39};
+static float P018[3] = {-88.16, -439.22, 2082.39};
+static float P019[3] = {65.21, -440.32, 2083.39};
+static float P020[3] = {246.87, -356.02, 2576.95};
+static float P021[3] = {253.17, -111.15, 2567.15};
+static float P022[3] = {132.34, 51.41, 2559.84};
+static float P023[3] = {-97.88, 40.44, 2567.15};
+static float P024[3] = {-222.97, -117.49, 2567.15};
+static float P025[3] = {-252.22, -371.53, 2569.92};
+static float P026[3] = {-108.44, -518.19, 2586.75};
+static float P027[3] = {97.88, -524.79, 2586.75};
+static float P028[3] = {370.03, -421.19, 3419.7};
+static float P029[3] = {351.15, -16.98, 3423.17};
+static float P030[3] = {200.66, 248.46, 3430.37};
+static float P031[3] = {-148.42, 235.02, 3417.91};
+static float P032[3] = {-360.21, -30.27, 3416.84};
+static float P033[3] = {-357.9, -414.89, 3407.04};
+static float P034[3] = {-148.88, -631.35, 3409.9};
+static float P035[3] = {156.38, -632.59, 3419.7};
+static float P036[3] = {462.61, -469.21, 4431.51};
+static float P037[3] = {466.6, 102.25, 4434.98};
+static float P038[3] = {243.05, 474.34, 4562.02};
+static float P039[3] = {-191.23, 474.4, 4554.42};
+static float P040[3] = {-476.12, 111.05, 4451.11};
+static float P041[3] = {-473.36, -470.74, 4444.78};
+static float P042[3] = {-266.95, -748.41, 4447.78};
+static float P043[3] = {211.14, -749.91, 4429.73};
+static float P044[3] = {680.57, -370.27, 5943.46};
+static float P045[3] = {834.01, 363.09, 6360.63};
+static float P046[3] = {371.29, 804.51, 6486.26};
+static float P047[3] = {-291.43, 797.22, 6494.28};
+static float P048[3] = {-784.13, 370.75, 6378.01};
+static float P049[3] = {-743.29, -325.82, 5943.46};
+static float P050[3] = {-383.24, -804.77, 5943.46};
+static float P051[3] = {283.47, -846.09, 5943.46};
+static const float iP001[3] = {5.68, -300.95, 1324.7};
+#if 0
+static const float iP002[3] = {338.69, -219.63, 9677.03};
+static const float iP003[3] = {12.18, 624.93, 8956.39};
+static const float iP004[3] = {-7.49, -388.91, 10896.74};
+static const float iP005[3] = {487.51, 198.05, 9350.78};
+static const float iP006[3] = {-457.61, 199.04, 9353.01};
+static const float iP007[3] = {156.52, -266.72, 10311.68};
+static const float iP008[3] = {-185.56, -266.51, 10310.47};
+#endif
+static const float iP009[3] = {124.39, -261.46, 1942.34};
+static const float iP010[3] = {-130.05, -261.46, 1946.03};
+static const float iP011[3] = {141.07, -320.11, 1239.38};
+static const float iP012[3] = {156.48, -360.12, 2073.41};
+static const float iP013[3] = {162, -175.88, 2064.44};
+static const float iP014[3] = {88.16, -87.72, 2064.02};
+static const float iP015[3] = {-65.21, -96.13, 2064.02};
+static const float iP016[3] = {-156.48, -180.96, 2064.44};
+static const float iP017[3] = {-162, -368.93, 2082.39};
+static const float iP018[3] = {-88.16, -439.22, 2082.39};
+static const float iP019[3] = {65.21, -440.32, 2083.39};
+static const float iP020[3] = {246.87, -356.02, 2576.95};
+static const float iP021[3] = {253.17, -111.15, 2567.15};
+static const float iP022[3] = {132.34, 51.41, 2559.84};
+static const float iP023[3] = {-97.88, 40.44, 2567.15};
+static const float iP024[3] = {-222.97, -117.49, 2567.15};
+static const float iP025[3] = {-252.22, -371.53, 2569.92};
+static const float iP026[3] = {-108.44, -518.19, 2586.75};
+static const float iP027[3] = {97.88, -524.79, 2586.75};
+static const float iP028[3] = {370.03, -421.19, 3419.7};
+static const float iP029[3] = {351.15, -16.98, 3423.17};
+static const float iP030[3] = {200.66, 248.46, 3430.37};
+static const float iP031[3] = {-148.42, 235.02, 3417.91};
+static const float iP032[3] = {-360.21, -30.27, 3416.84};
+static const float iP033[3] = {-357.9, -414.89, 3407.04};
+static const float iP034[3] = {-148.88, -631.35, 3409.9};
+static const float iP035[3] = {156.38, -632.59, 3419.7};
+static const float iP036[3] = {462.61, -469.21, 4431.51};
+static const float iP037[3] = {466.6, 102.25, 4434.98};
+static const float iP038[3] = {243.05, 474.34, 4562.02};
+static const float iP039[3] = {-191.23, 474.4, 4554.42};
+static const float iP040[3] = {-476.12, 111.05, 4451.11};
+static const float iP041[3] = {-473.36, -470.74, 4444.78};
+static const float iP042[3] = {-266.95, -748.41, 4447.78};
+static const float iP043[3] = {211.14, -749.91, 4429.73};
+static const float iP044[3] = {680.57, -370.27, 5943.46};
+static const float iP045[3] = {834.01, 363.09, 6360.63};
+static const float iP046[3] = {371.29, 804.51, 6486.26};
+static const float iP047[3] = {-291.43, 797.22, 6494.28};
+static const float iP048[3] = {-784.13, 370.75, 6378.01};
+static const float iP049[3] = {-743.29, -325.82, 5943.46};
+static const float iP050[3] = {-383.24, -804.77, 5943.46};
+static const float iP051[3] = {283.47, -846.09, 5943.46};
+static const float P052[3] = {599.09, -300.15, 7894.03};
+static const float P053[3] = {735.48, 306.26, 7911.92};
+static const float P054[3] = {246.22, 558.53, 8460.5};
+static const float P055[3] = {-230.41, 559.84, 8473.23};
+static const float P056[3] = {-698.66, 320.83, 7902.59};
+static const float P057[3] = {-643.29, -299.16, 7902.59};
+static const float P058[3] = {-341.47, -719.3, 7902.59};
+static const float P059[3] = {252.57, -756.12, 7902.59};
+static const float P060[3] = {458.39, -265.31, 9355.44};
+#if 0
+static const float P061[3] = {433.38, -161.9, 9503.03};
+#endif
+static const float P062[3] = {224.04, 338.75, 9450.3};
+static const float P063[3] = {-165.71, 341.04, 9462.35};
+static const float P064[3] = {-298.11, 110.13, 10180.37};
+static const float P065[3] = {-473.99, -219.71, 9355.44};
+static const float P066[3] = {-211.97, -479.87, 9355.44};
+static const float P067[3] = {192.86, -491.45, 9348.73};
+static float P068[3] = {-136.29, -319.84, 1228.73};
+static float P069[3] = {1111.17, -314.14, 1314.19};
+static float P070[3] = {-1167.34, -321.61, 1319.45};
+static float P071[3] = {1404.86, -306.66, 1235.45};
+static float P072[3] = {-1409.73, -314.14, 1247.66};
+static float P073[3] = {1254.01, -296.87, 1544.58};
+static float P074[3] = {-1262.09, -291.7, 1504.26};
+static float P075[3] = {965.71, -269.26, 1742.65};
+static float P076[3] = {-900.97, -276.74, 1726.07};
+static const float iP068[3] = {-136.29, -319.84, 1228.73};
+static const float iP069[3] = {1111.17, -314.14, 1314.19};
+static const float iP070[3] = {-1167.34, -321.61, 1319.45};
+static const float iP071[3] = {1404.86, -306.66, 1235.45};
+static const float iP072[3] = {-1409.73, -314.14, 1247.66};
+static const float iP073[3] = {1254.01, -296.87, 1544.58};
+static const float iP074[3] = {-1262.09, -291.7, 1504.26};
+static const float iP075[3] = {965.71, -269.26, 1742.65};
+static const float iP076[3] = {-900.97, -276.74, 1726.07};
+static const float P077[3] = {1058, -448.81, 8194.66};
+static const float P078[3] = {-1016.51, -456.43, 8190.62};
+static const float P079[3] = {-1515.96, -676.45, 7754.93};
+static const float P080[3] = {1856.75, -830.34, 7296.56};
+static const float P081[3] = {1472.16, -497.38, 7399.68};
+static const float P082[3] = {-1775.26, -829.51, 7298.46};
+static const float P083[3] = {911.09, -252.51, 7510.99};
+static const float P084[3] = {-1451.94, -495.62, 7384.3};
+static const float P085[3] = {1598.75, -669.26, 7769.9};
+static const float P086[3] = {-836.53, -250.08, 7463.25};
+static const float P087[3] = {722.87, -158.18, 8006.41};
+static const float P088[3] = {-688.86, -162.28, 7993.89};
+static const float P089[3] = {-626.92, -185.3, 8364.98};
+static const float P090[3] = {647.72, -189.46, 8354.99};
+static float P091[3] = {0, 835.01, 5555.62};
+static float P092[3] = {0, 1350.18, 5220.86};
+static float P093[3] = {0, 1422.94, 5285.27};
+static float P094[3] = {0, 1296.75, 5650.19};
+static float P095[3] = {0, 795.63, 6493.88};
+static const float iP091[3] = {0, 835.01, 5555.62};
+static const float iP092[3] = {0, 1350.18, 5220.86};
+static const float iP093[3] = {0, 1422.94, 5285.27};
+static const float iP094[3] = {0, 1296.75, 5650.19};
+static const float iP095[3] = {0, 795.63, 6493.88};
+#if 0
+static const float P096[3] = {-447.38, -165.99, 9499.6};
+#endif
+static float P097[3] = {-194.91, -357.14, 10313.32};
+static float P098[3] = {135.35, -357.66, 10307.94};
+static const float iP097[3] = {-194.91, -357.14, 10313.32};
+static const float iP098[3] = {135.35, -357.66, 10307.94};
+static const float P099[3] = {-380.53, -221.14, 9677.98};
+static const float P100[3] = {0, 412.99, 9629.33};
+#if 0
+static const float P101[3] = {5.7, 567, 7862.98};
+#endif
+static float P102[3] = {59.51, -412.55, 10677.58};
+static const float iP102[3] = {59.51, -412.55, 10677.58};
+static const float P103[3] = {6.5, 484.74, 9009.94};
+#if 0
+static const float P104[3] = {-9.86, 567.62, 7858.65};
+#endif
+static const float P105[3] = {-41.86, 476.51, 9078.17};
+#if 0
+static const float P106[3] = {22.75, 568.13, 7782.83};
+static const float P107[3] = {58.93, 568.42, 7775.94};
+#endif
+static const float P108[3] = {49.2, 476.83, 9078.24};
+#if 0
+static const float P109[3] = {99.21, 566, 7858.65};
+#endif
+static float P110[3] = {-187.62, -410.04, 10674.12};
+static const float iP110[3] = {-187.62, -410.04, 10674.12};
+static float P111[3] = {-184.25, -318.7, 10723.88};
+static const float iP111[3] = {-184.25, -318.7, 10723.88};
+static const float P112[3] = {-179.61, -142.81, 10670.26};
+static const float P113[3] = {57.43, -147.94, 10675.26};
+static const float P114[3] = {54.06, -218.9, 10712.44};
+static const float P115[3] = {-186.35, -212.09, 10713.76};
+static const float P116[3] = {205.9, -84.61, 10275.97};
+static const float P117[3] = {-230.96, -83.26, 10280.09};
+static const float iP118[3] = {216.78, -509.17, 10098.94};
+static const float iP119[3] = {-313.21, -510.79, 10102.62};
+static float P118[3] = {216.78, -509.17, 10098.94};
+static float P119[3] = {-313.21, -510.79, 10102.62};
+static const float P120[3] = {217.95, 96.34, 10161.62};
+static float P121[3] = {71.99, -319.74, 10717.7};
+static const float iP121[3] = {71.99, -319.74, 10717.7};
+static float P122[3] = {0, 602.74, 5375.84};
+static const float iP122[3] = {0, 602.74, 5375.84};
+static const float P123[3] = {-448.94, -203.14, 9499.6};
+static const float P124[3] = {-442.64, -185.2, 9528.07};
+static const float P125[3] = {-441.07, -148.05, 9528.07};
+static const float P126[3] = {-443.43, -128.84, 9499.6};
+static const float P127[3] = {-456.87, -146.78, 9466.67};
+static const float P128[3] = {-453.68, -183.93, 9466.67};
+static const float P129[3] = {428.43, -124.08, 9503.03};
+static const float P130[3] = {419.73, -142.14, 9534.56};
+static const float P131[3] = {419.92, -179.96, 9534.56};
+static const float P132[3] = {431.2, -199.73, 9505.26};
+static const float P133[3] = {442.28, -181.67, 9475.96};
+static const float P134[3] = {442.08, -143.84, 9475.96};
+/* *INDENT-ON* */
+
+
+
+static void
+Dolphin001(GLenum cap)
+{
+ glNormal3fv(N071);
+ glBegin(cap);
+ glVertex3fv(P001);
+ glVertex3fv(P068);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P068);
+ glVertex3fv(P076);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P068);
+ glVertex3fv(P070);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P076);
+ glVertex3fv(P070);
+ glVertex3fv(P074);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P070);
+ glVertex3fv(P072);
+ glVertex3fv(P074);
+ glEnd();
+ glNormal3fv(N119);
+ glBegin(cap);
+ glVertex3fv(P072);
+ glVertex3fv(P070);
+ glVertex3fv(P074);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P074);
+ glVertex3fv(P070);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P070);
+ glVertex3fv(P068);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P076);
+ glVertex3fv(P068);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P068);
+ glVertex3fv(P001);
+ glVertex3fv(P010);
+ glEnd();
+}
+
+static void
+Dolphin002(GLenum cap)
+{
+ glNormal3fv(N071);
+ glBegin(cap);
+ glVertex3fv(P011);
+ glVertex3fv(P001);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P075);
+ glVertex3fv(P011);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P011);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P075);
+ glVertex3fv(P073);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P071);
+ glVertex3fv(P069);
+ glVertex3fv(P073);
+ glEnd();
+ glNormal3fv(N119);
+ glBegin(cap);
+ glVertex3fv(P001);
+ glVertex3fv(P011);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P009);
+ glVertex3fv(P011);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P011);
+ glVertex3fv(P069);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P073);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P071);
+ glVertex3fv(P073);
+ glEnd();
+}
+
+static void
+Dolphin003(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glEnd();
+}
+
+static void
+Dolphin004(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glEnd();
+}
+
+static void
+Dolphin005(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glEnd();
+}
+
+static void
+Dolphin006(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N093);
+ glVertex3fv(P093);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N093);
+ glVertex3fv(P093);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N122);
+ glVertex3fv(P122);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N122);
+ glVertex3fv(P122);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glEnd();
+}
+
+static void
+Dolphin007(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glEnd();
+}
+
+static void
+Dolphin008(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glEnd();
+}
+
+static void
+Dolphin009(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+}
+
+static void
+Dolphin010(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N080);
+ glVertex3fv(P080);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N090);
+ glVertex3fv(P090);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N080);
+ glVertex3fv(P080);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glNormal3fv(N090);
+ glVertex3fv(P090);
+ glEnd();
+}
+
+static void
+Dolphin011(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N082);
+ glVertex3fv(P082);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N082);
+ glVertex3fv(P082);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+}
+
+static void
+Dolphin012(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glEnd();
+}
+
+static void
+Dolphin013(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glNormal3fv(N113);
+ glVertex3fv(P113);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N114);
+ glVertex3fv(P114);
+ glNormal3fv(N113);
+ glVertex3fv(P113);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glNormal3fv(N115);
+ glVertex3fv(P115);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N114);
+ glVertex3fv(P114);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glNormal3fv(N113);
+ glVertex3fv(P113);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N114);
+ glVertex3fv(P114);
+ glNormal3fv(N007);
+ glVertex3fv(P007);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N007);
+ glVertex3fv(P007);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P002);
+ glVertex3fv(P007);
+ glVertex3fv(P008);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P007);
+ glVertex3fv(P114);
+ glVertex3fv(P115);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N115);
+ glVertex3fv(P115);
+ glEnd();
+}
+
+static void
+Dolphin014(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N111);
+ glVertex3fv(P111);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glNormal3fv(N121);
+ glVertex3fv(P121);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N111);
+ glVertex3fv(P111);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P098);
+ glVertex3fv(P097);
+ glVertex3fv(P111);
+ glVertex3fv(P121);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P002);
+ glVertex3fv(P099);
+ glVertex3fv(P097);
+ glVertex3fv(P098);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glNormal3fv(N121);
+ glVertex3fv(P121);
+ glEnd();
+}
+
+static void
+Dolphin015(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+}
+
+static void
+Dolphin016(GLenum cap)
+{
+
+ glDisable(GL_DEPTH_TEST);
+ glBegin(cap);
+ glVertex3fv(P123);
+ glVertex3fv(P124);
+ glVertex3fv(P125);
+ glVertex3fv(P126);
+ glVertex3fv(P127);
+ glVertex3fv(P128);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P129);
+ glVertex3fv(P130);
+ glVertex3fv(P131);
+ glVertex3fv(P132);
+ glVertex3fv(P133);
+ glVertex3fv(P134);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P103);
+ glVertex3fv(P105);
+ glVertex3fv(P108);
+ glEnd();
+ glEnable(GL_DEPTH_TEST);
+}
+
+void
+DrawDolphin(fishRec * fish, int wire)
+{
+ float seg0, seg1, seg2, seg3, seg4, seg5, seg6, seg7;
+ float pitch, thrash, chomp;
+ GLenum cap;
+
+ fish->htail = (int) (fish->htail - (int) (10 * fish->v)) % 360;
+
+ thrash = 70 * fish->v;
+
+ seg0 = 1 * thrash * sin((fish->htail) * RRAD);
+ seg3 = 1 * thrash * sin((fish->htail) * RRAD);
+ seg1 = 2 * thrash * sin((fish->htail + 4) * RRAD);
+ seg2 = 3 * thrash * sin((fish->htail + 6) * RRAD);
+ seg4 = 4 * thrash * sin((fish->htail + 10) * RRAD);
+ seg5 = 4.5 * thrash * sin((fish->htail + 15) * RRAD);
+ seg6 = 5 * thrash * sin((fish->htail + 20) * RRAD);
+ seg7 = 6 * thrash * sin((fish->htail + 30) * RRAD);
+
+ pitch = fish->v * sin((fish->htail + 180) * RRAD);
+
+/* if (fish->v > 2) {
+ chomp = -(fish->v - 2) * 200;
+ }*/
+ chomp = 100;
+
+ P012[1] = iP012[1] + seg5;
+ P013[1] = iP013[1] + seg5;
+ P014[1] = iP014[1] + seg5;
+ P015[1] = iP015[1] + seg5;
+ P016[1] = iP016[1] + seg5;
+ P017[1] = iP017[1] + seg5;
+ P018[1] = iP018[1] + seg5;
+ P019[1] = iP019[1] + seg5;
+
+ P020[1] = iP020[1] + seg4;
+ P021[1] = iP021[1] + seg4;
+ P022[1] = iP022[1] + seg4;
+ P023[1] = iP023[1] + seg4;
+ P024[1] = iP024[1] + seg4;
+ P025[1] = iP025[1] + seg4;
+ P026[1] = iP026[1] + seg4;
+ P027[1] = iP027[1] + seg4;
+
+ P028[1] = iP028[1] + seg2;
+ P029[1] = iP029[1] + seg2;
+ P030[1] = iP030[1] + seg2;
+ P031[1] = iP031[1] + seg2;
+ P032[1] = iP032[1] + seg2;
+ P033[1] = iP033[1] + seg2;
+ P034[1] = iP034[1] + seg2;
+ P035[1] = iP035[1] + seg2;
+
+ P036[1] = iP036[1] + seg1;
+ P037[1] = iP037[1] + seg1;
+ P038[1] = iP038[1] + seg1;
+ P039[1] = iP039[1] + seg1;
+ P040[1] = iP040[1] + seg1;
+ P041[1] = iP041[1] + seg1;
+ P042[1] = iP042[1] + seg1;
+ P043[1] = iP043[1] + seg1;
+
+ P044[1] = iP044[1] + seg0;
+ P045[1] = iP045[1] + seg0;
+ P046[1] = iP046[1] + seg0;
+ P047[1] = iP047[1] + seg0;
+ P048[1] = iP048[1] + seg0;
+ P049[1] = iP049[1] + seg0;
+ P050[1] = iP050[1] + seg0;
+ P051[1] = iP051[1] + seg0;
+
+ P009[1] = iP009[1] + seg6;
+ P010[1] = iP010[1] + seg6;
+ P075[1] = iP075[1] + seg6;
+ P076[1] = iP076[1] + seg6;
+
+ P001[1] = iP001[1] + seg7;
+ P011[1] = iP011[1] + seg7;
+ P068[1] = iP068[1] + seg7;
+ P069[1] = iP069[1] + seg7;
+ P070[1] = iP070[1] + seg7;
+ P071[1] = iP071[1] + seg7;
+ P072[1] = iP072[1] + seg7;
+ P073[1] = iP073[1] + seg7;
+ P074[1] = iP074[1] + seg7;
+
+ P091[1] = iP091[1] + seg3;
+ P092[1] = iP092[1] + seg3;
+ P093[1] = iP093[1] + seg3;
+ P094[1] = iP094[1] + seg3;
+ P095[1] = iP095[1] + seg3;
+ P122[1] = iP122[1] + seg3 * 1.5;
+
+ P097[1] = iP097[1] + chomp;
+ P098[1] = iP098[1] + chomp;
+ P102[1] = iP102[1] + chomp;
+ P110[1] = iP110[1] + chomp;
+ P111[1] = iP111[1] + chomp;
+ P121[1] = iP121[1] + chomp;
+ P118[1] = iP118[1] + chomp;
+ P119[1] = iP119[1] + chomp;
+
+ glPushMatrix();
+
+ glRotatef(pitch, 1, 0, 0);
+
+ glTranslatef(0, 0, 7000);
+
+ glRotatef(180, 0, 1, 0);
+
+ glEnable(GL_CULL_FACE);
+ cap = wire ? GL_LINE_LOOP : GL_POLYGON;
+ Dolphin014(cap);
+ Dolphin010(cap);
+ Dolphin009(cap);
+ Dolphin012(cap);
+ Dolphin013(cap);
+ Dolphin006(cap);
+ Dolphin002(cap);
+ Dolphin001(cap);
+ Dolphin003(cap);
+ Dolphin015(cap);
+ Dolphin004(cap);
+ Dolphin005(cap);
+ Dolphin007(cap);
+ Dolphin008(cap);
+ Dolphin011(cap);
+ Dolphin016(cap);
+ glDisable(GL_CULL_FACE);
+
+ glPopMatrix();
+}
+#endif
diff --git a/hacks/glx/dropshadow.c b/hacks/glx/dropshadow.c
new file mode 100644
index 0000000..0a5855c
--- /dev/null
+++ b/hacks/glx/dropshadow.c
@@ -0,0 +1,181 @@
+/* dropshadow.c, Copyright (c) 2009 Jens Kilian <jjk@acm.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
+#include "dropshadow.h"
+
+/* (Alpha) texture data for drop shadow.
+ */
+static int drop_shadow_width = 32;
+static int drop_shadow_height = 32;
+static unsigned char drop_shadow_data[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 3, 4, 6, 7, 9, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 9, 7, 6, 4, 3, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 3, 5, 9, 13, 16, 19, 19, 21, 21, 22, 22,
+ 22, 22, 21, 21, 19, 19, 16, 13, 9, 5, 3, 1, 1, 0, 0, 0,
+ 0, 0, 1, 1, 3, 5, 10, 16, 22, 28, 32, 35, 37, 37, 38, 38,
+ 38, 38, 37, 37, 35, 32, 28, 22, 16, 10, 5, 3, 1, 1, 0, 0,
+ 0, 0, 1, 1, 4, 9, 16, 25, 34, 43, 50, 55, 58, 59, 60, 60,
+ 60, 60, 59, 58, 55, 50, 43, 34, 25, 16, 9, 4, 1, 1, 0, 0,
+ 0, 0, 1, 3, 6, 13, 22, 34, 48, 61, 70, 77, 80, 82, 83, 84,
+ 84, 83, 82, 80, 77, 70, 61, 48, 34, 22, 13, 6, 3, 1, 0, 0,
+ 0, 0, 1, 3, 7, 16, 28, 43, 61, 76, 88, 97, 102, 103, 104, 104,
+ 104, 104, 103, 102, 97, 88, 76, 61, 43, 28, 16, 7, 3, 1, 0, 0,
+ 0, 1, 1, 4, 9, 19, 32, 51, 70, 88, 103, 112, 117, 120, 121, 121,
+ 121, 121, 120, 117, 112, 103, 88, 70, 51, 32, 19, 9, 4, 1, 1, 0,
+ 0, 1, 1, 4, 10, 20, 35, 55, 77, 97, 112, 122, 128, 130, 132, 133,
+ 133, 132, 130, 128, 122, 112, 97, 77, 55, 35, 20, 10, 4, 1, 1, 0,
+ 0, 1, 1, 4, 10, 21, 37, 58, 80, 101, 117, 128, 134, 137, 138, 139,
+ 139, 138, 137, 134, 128, 117, 101, 80, 58, 37, 21, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 21, 38, 59, 82, 103, 119, 130, 137, 139, 141, 142,
+ 142, 141, 139, 137, 130, 119, 103, 82, 59, 38, 21, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 59, 83, 104, 121, 132, 139, 141, 142, 142,
+ 142, 142, 141, 139, 132, 121, 104, 83, 59, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 60, 84, 104, 121, 133, 139, 142, 142, 142,
+ 142, 142, 142, 139, 133, 121, 104, 84, 60, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 60, 84, 104, 121, 133, 139, 142, 142, 142,
+ 142, 142, 142, 139, 133, 121, 104, 84, 60, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 59, 83, 104, 121, 132, 139, 141, 142, 142,
+ 142, 142, 141, 139, 132, 121, 104, 83, 59, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 21, 38, 59, 82, 103, 119, 130, 137, 139, 141, 142,
+ 142, 141, 139, 137, 130, 119, 103, 82, 59, 38, 21, 10, 4, 1, 0, 0,
+ 0, 1, 1, 4, 10, 21, 37, 58, 80, 101, 118, 128, 134, 137, 139, 139,
+ 139, 139, 137, 134, 128, 117, 102, 80, 58, 37, 21, 10, 4, 1, 0, 0,
+ 0, 1, 1, 4, 10, 20, 35, 55, 77, 97, 112, 122, 128, 130, 132, 133,
+ 133, 132, 130, 128, 122, 112, 97, 77, 55, 35, 20, 10, 4, 1, 1, 0,
+ 0, 1, 1, 4, 9, 19, 32, 51, 70, 88, 103, 112, 117, 120, 121, 121,
+ 121, 121, 120, 117, 112, 103, 88, 70, 51, 32, 19, 9, 4, 1, 1, 0,
+ 0, 0, 1, 3, 7, 16, 28, 43, 61, 76, 88, 97, 102, 103, 104, 104,
+ 104, 104, 103, 102, 97, 88, 76, 61, 43, 28, 16, 7, 3, 1, 0, 0,
+ 0, 0, 1, 3, 6, 13, 22, 34, 48, 61, 70, 77, 80, 82, 83, 84,
+ 84, 83, 82, 80, 77, 70, 61, 48, 34, 22, 13, 6, 3, 1, 0, 0,
+ 0, 0, 1, 1, 4, 9, 16, 25, 34, 43, 50, 55, 58, 59, 60, 60,
+ 60, 60, 59, 58, 55, 50, 43, 34, 25, 16, 9, 4, 1, 1, 0, 0,
+ 0, 0, 1, 1, 3, 5, 10, 16, 22, 28, 32, 35, 37, 37, 38, 38,
+ 38, 38, 37, 37, 35, 32, 28, 22, 16, 10, 5, 3, 1, 1, 0, 0,
+ 0, 0, 0, 1, 1, 3, 5, 9, 13, 16, 19, 19, 21, 21, 22, 22,
+ 22, 22, 21, 21, 19, 19, 16, 13, 9, 5, 3, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 3, 4, 6, 7, 9, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 9, 7, 6, 4, 3, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+GLuint
+init_drop_shadow(void)
+{
+ GLuint t;
+
+ glGenTextures (1, &t);
+ if (t <= 0) abort();
+
+ glBindTexture (GL_TEXTURE_2D, t);
+#if 0
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ gluBuild2DMipmaps (GL_TEXTURE_2D, GL_ALPHA,
+ drop_shadow_width, drop_shadow_height,
+ GL_ALPHA, GL_UNSIGNED_BYTE,
+ drop_shadow_data);
+#else
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA,
+ drop_shadow_width, drop_shadow_height, 0,
+ GL_ALPHA, GL_UNSIGNED_BYTE,
+ drop_shadow_data);
+#endif
+
+ return t;
+}
+
+void
+draw_drop_shadow (GLuint t,
+ GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat r)
+{
+ /* Inner and outer boundaries of shadow. */
+ const GLfloat li = x, lo = li - r;
+ const GLfloat ri = x + w, ro = ri + r;
+ const GLfloat bi = y, bo = bi - r;
+ const GLfloat ti = y + h, to = ti + r;
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, t);
+
+ glBegin (GL_QUADS);
+
+ /* There's likely a better way to do this... */
+ glTexCoord2f (0.0, 0.0); glVertex3f (lo, bo, z);
+ glTexCoord2f (0.5, 0.0); glVertex3f (li, bo, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, bi, z);
+
+ glTexCoord2f (0.5, 0.0); glVertex3f (li, bo, z);
+ glTexCoord2f (0.5, 0.0); glVertex3f (ri, bo, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
+
+ glTexCoord2f (0.5, 0.0); glVertex3f (ri, bo, z);
+ glTexCoord2f (1.0, 0.0); glVertex3f (ro, bo, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
+
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, bi, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, ti, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
+
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, ti, z);
+ glTexCoord2f (1.0, 1.0); glVertex3f (ro, to, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (ri, to, z);
+
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (ri, to, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (li, to, z);
+
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, ti, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (li, to, z);
+ glTexCoord2f (0.0, 1.0); glVertex3f (lo, to, z);
+
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, ti, z);
+
+ glEnd();
+}
diff --git a/hacks/glx/dropshadow.h b/hacks/glx/dropshadow.h
new file mode 100644
index 0000000..09af0c8
--- /dev/null
+++ b/hacks/glx/dropshadow.h
@@ -0,0 +1,40 @@
+/* dropshadow.h, Copyright (c) 2009 Jens Kilian <jjk@acm.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __DROPSHADOW_H__
+#define __DROPSHADOW_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "xlockmoreI.h"
+
+/* Initialize drop shadow texture, return a texture ID.
+ */
+GLuint
+init_drop_shadow(void);
+
+/* Draw a drop shadow around a rectangle.
+
+ t Texture ID (as returned by init_drop_shadow()).
+ x, y, z; w, h Position (left bottom), depth and size of rectangle.
+ r Radius of drop shadow.
+
+ The shadow will be drawn using the current color.
+ */
+
+void
+draw_drop_shadow (GLuint t,
+ GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat r);
+
+#endif /* __DROPSHADOW_H__ */
diff --git a/hacks/glx/dxf2gl.pl b/hacks/glx/dxf2gl.pl
new file mode 100755
index 0000000..9ed470c
--- /dev/null
+++ b/hacks/glx/dxf2gl.pl
@@ -0,0 +1,729 @@
+#!/usr/bin/perl -w
+# Copyright © 2003-2014 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Reads a DXF file, and emits C data suitable for use with OpenGL's
+# glInterleavedArrays() and glDrawArrays() routines.
+#
+# Options:
+#
+# --normalize Compute the bounding box of the object, and scale all
+# coordinates so that the object fits inside a unit cube.
+#
+# --smooth When computing normals for the vertexes, average the
+# normals at any edge which is less than 90 degrees.
+# If this option is not specified, planar normals will be
+# used, resulting in a "faceted" object.
+#
+# --wireframe Emit lines instead of faces.
+#
+# --layers Emit a separate set of polygons for each layer in the
+# input file, instead of emitting the whole file as a
+# single unit.
+#
+# Created: 8-Mar-2003.
+
+require 5;
+use diagnostics;
+use strict;
+
+use POSIX qw(mktime strftime);
+use Math::Trig qw(acos);
+use Text::Wrap;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.11 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+
+# convert a vector to a unit vector
+sub normalize($$$) {
+ my ($x, $y, $z) = @_;
+ my $L = sqrt (($x * $x) + ($y * $y) + ($z * $z));
+ if ($L != 0) {
+ $x /= $L;
+ $y /= $L;
+ $z /= $L;
+ } else {
+ $x = $y = $z = 0;
+ }
+ return ($x, $y, $z);
+}
+
+
+# Calculate the unit normal at p0 given two other points p1,p2 on the
+# surface. The normal points in the direction of p1 crossproduct p2.
+#
+sub face_normal($$$$$$$$$) {
+ my ($p0x, $p0y, $p0z,
+ $p1x, $p1y, $p1z,
+ $p2x, $p2y, $p2z) = @_;
+
+ my ($nx, $ny, $nz);
+ my ($pax, $pay, $paz);
+ my ($pbx, $pby, $pbz);
+
+ $pax = $p1x - $p0x;
+ $pay = $p1y - $p0y;
+ $paz = $p1z - $p0z;
+ $pbx = $p2x - $p0x;
+ $pby = $p2y - $p0y;
+ $pbz = $p2z - $p0z;
+ $nx = $pay * $pbz - $paz * $pby;
+ $ny = $paz * $pbx - $pax * $pbz;
+ $nz = $pax * $pby - $pay * $pbx;
+
+ return (normalize ($nx, $ny, $nz));
+}
+
+
+my $pi = 3.141592653589793;
+my $radians_to_degrees = 180.0 / $pi;
+
+# Calculate the angle (in degrees) between two vectors.
+#
+sub vector_angle($$$$$$) {
+ my ($x1, $y1, $z1,
+ $x2, $y2, $z2) = @_;
+
+ my $L1 = sqrt ($x1*$x1 + $y1*$y1 + $z1*$z1);
+ my $L2 = sqrt ($x2*$x2 + $y2*$y2 + $z2*$z2);
+
+ return 0 if ($L1 == 0 || $L2 == 0);
+ return 0 if ($x1 == $x2 && $y1 == $y2 && $z1 == $z2);
+
+ # dot product of two vectors is defined as:
+ # $L1 * $L1 * cos(angle between vectors)
+ # and is also defined as:
+ # $x1*$x2 + $y1*$y2 + $z1*$z2
+ # so:
+ # $L1 * $L1 * cos($angle) = $x1*$x2 + $y1*$y2 + $z1*$z2
+ # cos($angle) = ($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2)
+ # $angle = acos (($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2));
+ #
+ my $cos = ($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2);
+ $cos = 1 if ($cos > 1); # avoid fp rounding error (1.000001 => sqrt error)
+ my $angle = acos ($cos);
+
+ return ($angle * $radians_to_degrees);
+}
+
+
+# given a list of triangles ( [ X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, ]+ )
+# returns a list of the normals for each vertex. These are the smoothed
+# normals: the average of the normals of the participating faces.
+#
+sub compute_vertex_normals(@) {
+ my (@points) = @_;
+ my $npoints = ($#points+1) / 3;
+ my $nfaces = $npoints / 3;
+
+ my @face_normals = ();
+ my %point_faces;
+
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my ($ax, $ay, $az, $bx, $by, $bz, $cx, $cy, $cz) =
+ @points[($i*9) .. ($i*9)+8];
+
+ # store the normal for each face in the $face_normals array
+ # indexed by face number.
+ #
+ my @norm = face_normal ($ax, $ay, $az,
+ $bx, $by, $bz,
+ $cx, $cy, $cz);
+ $face_normals[$i] = \@norm;
+
+ # store in the %point_faces hash table a list of every face number
+ # in which a point participates
+
+ foreach my $p ("$ax $ay $az", "$bx $by $bz", "$cx $cy $cz") {
+ my @flist = (defined($point_faces{$p}) ? @{$point_faces{$p}} : ());
+ push @flist, $i;
+ $point_faces{$p} = \@flist;
+ }
+ }
+
+
+ # compute the normal for each vertex of each face.
+ # (these points are not unique -- because there might be multiple
+ # normals associated with the same vertex for different faces,
+ # in the case where it's a sharp angle.)
+ #
+ my @normals = ();
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my @verts = @points[($i*9) .. ($i*9)+8];
+ error ("overshot in points?") unless defined($verts[8]);
+
+ my @norm = @{$face_normals[$i]};
+ error ("no normal $i?") unless defined($norm[2]);
+
+ # iterate over the (three) vertexes in this face.
+ #
+ for (my $j = 0; $j < 3; $j++) {
+ my ($x, $y, $z) = @verts[($j*3) .. ($j*3)+2];
+ error ("overshot in verts?") unless defined($z);
+
+ # Iterate over the faces in which this point participates.
+ # But ignore any other faces that are at more than an N degree
+ # angle from this point's face. Those are sharp edges.
+ #
+ my ($nx, $ny, $nz) = (0, 0, 0);
+ my @faces = @{$point_faces{"$x $y $z"}};
+ foreach my $fn (@faces) {
+ my ($ax, $ay, $az, $bx, $by, $bz, $cx, $cy, $cz) =
+ @points[($fn*9) .. ($fn*9)+8];
+ my @fnorm = @{$face_normals[$fn]};
+
+ # ignore any adjascent faces that are more than N degrees off.
+ my $angle = vector_angle ($norm[0], $norm[1], $norm[2],
+ $fnorm[0], $fnorm[1], $fnorm[2]);
+ next if ($angle >= 30);
+
+ $nx += $fnorm[0];
+ $ny += $fnorm[1];
+ $nz += $fnorm[2];
+ }
+
+ push @normals, normalize ($nx, $ny, $nz);
+ }
+ }
+
+ return @normals;
+}
+
+
+sub parse_dxf($$$$$) {
+ my ($filename, $dxf, $normalize_p, $wireframe_p, $layers_p) = @_;
+
+ $dxf =~ s/\r\n/\n/gs; # CRLF
+ $dxf =~ s/^[ \t\n]+|[ \t\n]+$//s; # leading/trailing whitespace
+
+ # Convert whitespace within a line to _, e.g., "ObjectDBX Classes".
+ # What the hell is up with this file format!
+ 1 while ($dxf =~ s/([^ \t\n])[ \t]+([^ \t\n])/$1_$2/gs);
+
+ $dxf =~ s/\r/\n/gs;
+
+ # Turn blank lines into "", e.g., "$DIMBLK \n 1 \n \n 9 \n"
+ $dxf =~ s/\n\n/\n""\n/gs;
+
+ my @tokens = split (/[ \t\n]+/, $dxf); # tokenize
+
+ my @entities = (); # parse
+ while (@tokens) {
+ my @elts = ();
+ my $key = shift @tokens; # sectionize at "0 WORD"
+ do {
+ my $val = shift @tokens;
+ push @elts, [ $key, $val ]; # contents are [CODE VAL]
+ $key = shift @tokens;
+ } while ($key && $key ne 0);
+ unshift @tokens, $key if defined($key);
+ push @entities, \@elts;
+ }
+ my %triangles; # list of points, indexed by layer name
+ my %lines;
+ my $error_count = 0;
+
+ foreach my $entity (@entities) {
+ my $header = shift @$entity;
+ my ($code, $name) = @$header;
+
+ if ($name eq 'SECTION' ||
+ $name eq 'HEADER' ||
+ $name eq 'ENDSEC' ||
+ $name eq 'EOF') {
+ print STDERR "$progname: $filename: ignoring \"$code $name\"\n"
+ if ($verbose > 1);
+
+ } elsif ($name eq '3DFACE') {
+
+ my @points = ();
+ my $pc = 0;
+ my $layer = '';
+
+ foreach my $entry (@$entity) {
+ my ($key, $val) = @$entry;
+ if ($key eq 8) { $layer = $val; # layer name
+
+ } elsif ($key eq 10) { $pc++; $points[0] = $val; # X1
+ } elsif ($key eq 20) { $pc++; $points[1] = $val; # Y1
+ } elsif ($key eq 30) { $pc++; $points[2] = $val; # Z1
+
+ } elsif ($key eq 11) { $pc++; $points[3] = $val; # X2
+ } elsif ($key eq 21) { $pc++; $points[4] = $val; # Y2
+ } elsif ($key eq 31) { $pc++; $points[5] = $val; # Z2
+
+ } elsif ($key eq 12) { $pc++; $points[6] = $val; # X3
+ } elsif ($key eq 22) { $pc++; $points[7] = $val; # Y3
+ } elsif ($key eq 32) { $pc++; $points[8] = $val; # Z3
+
+ } elsif ($key eq 13) { $pc++; $points[9] = $val; # X4
+ } elsif ($key eq 23) { $pc++; $points[10] = $val; # Y4
+ } elsif ($key eq 33) { $pc++; $points[11] = $val; # Z4
+
+ } elsif ($key eq 62) { # color number
+ } elsif ($key eq 70) { # invisible edge flag
+ } else {
+ print STDERR "$progname: $filename: WARNING:" .
+ " unknown $name: \"$key $val\"\n";
+ $error_count++;
+ }
+ }
+
+ error ("got $pc points in $name") unless ($pc == 12);
+
+ if ($points[6] != $points[9] ||
+ $points[7] != $points[10] ||
+ $points[8] != $points[11]) {
+ error ("$filename: got a quad, not a triangle\n");
+ } else {
+ @points = @points[0 .. 8];
+ }
+
+ foreach (@points) { $_ += 0; } # convert strings to numbers
+
+ $layer = '' unless $layers_p;
+
+ $triangles{$layer} = [] unless defined ($triangles{$layer});
+ push @{$triangles{$layer}}, @points;
+
+ } elsif ($name eq 'LINE') {
+
+ my @points = ();
+ my $pc = 0;
+ my $layer = '';
+
+ foreach my $entry (@$entity) {
+ my ($key, $val) = @$entry;
+ if ($key eq 8) { $layer = $val; # layer name
+
+ } elsif ($key eq 10) { $pc++; $points[0] = $val; # X1
+ } elsif ($key eq 20) { $pc++; $points[1] = $val; # Y1
+ } elsif ($key eq 30) { $pc++; $points[2] = $val; # Z1
+
+ } elsif ($key eq 11) { $pc++; $points[3] = $val; # X2
+ } elsif ($key eq 21) { $pc++; $points[4] = $val; # Y2
+ } elsif ($key eq 31) { $pc++; $points[5] = $val; # Z2
+
+ } elsif ($key eq 39) { # thickness
+ } elsif ($key eq 62) { # color number
+ } else {
+ print STDERR "$progname: $filename: WARNING:" .
+ " unknown $name: \"$key $val\"\n";
+ $error_count++;
+ }
+ }
+
+ error ("got $pc points in $name") unless ($pc == 6);
+
+ foreach (@points) { $_ += 0; } # convert strings to numbers
+
+ $layer = '' unless $layers_p;
+
+ $lines{$layer} = [] unless defined ($lines{$layer});
+ push @{$lines{$layer}}, @points;
+
+ } elsif ($name =~ m/^\d+$/s) {
+ error ("sequence lost: \"$code $name\"");
+
+ } else {
+ print STDERR "$progname: $filename: WARNING: unknown: \"$code $name\"\n";
+ $error_count++;
+ }
+
+ error ("too many errors: bailing!") if ($error_count > 50);
+ }
+
+ if ($wireframe_p) {
+
+ # Convert faces to lines.
+ # Don't duplicate shared edges.
+
+ foreach my $layer (keys %triangles) {
+ my %dups;
+ my @triangles = @{$triangles{$layer}};
+ while (@triangles) {
+ my $x1 = shift @triangles; # 0
+ my $y1 = shift @triangles; # 1
+ my $z1 = shift @triangles; # 2
+ my $x2 = shift @triangles; # 3
+ my $y2 = shift @triangles; # 4
+ my $z2 = shift @triangles; # 5
+ my $x3 = shift @triangles; # 6
+ my $y3 = shift @triangles; # 7
+ my $z3 = shift @triangles; # 8
+
+ my $p = sub(@) {
+ my ($x1, $y1, $z1, $x2, $y2, $z2) = @_;
+ my $key1 = "$x1, $y1, $z1, $x2, $y2, $z2";
+ my $key2 = "$x2, $y2, $z2, $x1, $y1, $z1";
+ my $dup = $dups{$key1} || $dups{$key2};
+ $dups{$key1} = 1;
+ $dups{$key2} = 1;
+ push @{$lines{$layer}}, @_ unless $dup;
+ }
+ ;
+ $p->($x1, $y1, $z1, $x2, $y2, $z2);
+ $p->($x2, $y2, $z2, $x3, $y3, $z3);
+ $p->($x3, $y3, $z3, $x1, $y1, $z1);
+ }
+
+ @{$triangles{$layer}} = ();
+ }
+
+ } else {
+ foreach my $layer (keys %lines) {
+ my $n = @{$lines{$layer}};
+ @{$lines{$layer}} = ();
+ print STDERR "$progname: $filename: $layer: WARNING:" .
+ " ignored $n stray LINE" . ($n == 1 ? "" : "s") . ".\n"
+ if ($n);
+ }
+ }
+
+
+ # find bounding box, and normalize
+ #
+ if ($normalize_p || $verbose) {
+ my $minx = 999999999;
+ my $miny = 999999999;
+ my $minz = 999999999;
+ my $maxx = -999999999;
+ my $maxy = -999999999;
+ my $maxz = -999999999;
+ my $i = 0;
+
+ foreach my $layer (keys %triangles) {
+ my %dups;
+ my @triangles = @{$triangles{$layer}};
+
+ foreach my $n (@{$lines{$layer}}, @{$triangles{$layer}}) {
+ if ($i == 0) { $minx = $n if ($n < $minx);
+ $maxx = $n if ($n > $maxx); }
+ elsif ($i == 1) { $miny = $n if ($n < $miny);
+ $maxy = $n if ($n > $maxy); }
+ else { $minz = $n if ($n < $minz);
+ $maxz = $n if ($n > $maxz); }
+ $i = 0 if (++$i == 3);
+ }
+ }
+
+ my $w = ($maxx - $minx);
+ my $h = ($maxy - $miny);
+ my $d = ($maxz - $minz);
+ my $sizea = ($w > $h ? $w : $h);
+ my $sizeb = ($w > $d ? $w : $d);
+ my $size = ($sizea > $sizeb ? $sizea : $sizeb);
+
+ print STDERR "$progname: $filename: bbox is " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+ print STDERR "$progname: $filename: center is " .
+ sprintf("%.2f, %.2f, %.2f\n",
+ $minx + $w / 2,
+ $miny + $h / 2,
+ $minz + $d / 2)
+ if ($verbose);
+
+ if ($normalize_p) {
+ $w /= $size;
+ $h /= $size;
+ $d /= $size;
+
+ print STDERR "$progname: $filename: dividing by " .
+ sprintf("%.2f", $size) . " for bbox of " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+ foreach my $layer (keys %triangles) {
+ foreach my $n (@{$triangles{$layer}}) { $n /= $size; }
+ foreach my $n (@{$lines{$layer}}) { $n /= $size; }
+ }
+ }
+ }
+
+ return ($wireframe_p ? \%lines : \%triangles);
+}
+
+
+sub generate_c_1($$$$$@) {
+ my ($name, $outfile, $smooth_p, $wireframe_p, $normalize_p, @points) = @_;
+
+ my $ccw_p = 1; # counter-clockwise winding rule for computing normals
+
+ my $npoints = ($#points + 1) / 3;
+ my $nfaces = ($wireframe_p ? $npoints/2 : $npoints/3);
+
+ my @normals;
+ if ($smooth_p && !$wireframe_p) {
+ @normals = compute_vertex_normals (@points);
+
+ if ($#normals != $#points) {
+ error ("computed " . (($#normals+1)/3) . " normals for " .
+ (($#points+1)/3) . " points?");
+ }
+ }
+
+ my $code .= "\nstatic const float ${name}_data[] = {\n";
+
+ if ($wireframe_p) {
+ my %dups;
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my $ax = $points[$i*6];
+ my $ay = $points[$i*6+1];
+ my $az = $points[$i*6+2];
+
+ my $bx = $points[$i*6+3];
+ my $by = $points[$i*6+4];
+ my $bz = $points[$i*6+5];
+
+ my $lines = sprintf("\t" . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f,\n",
+ $ax, $ay, $az,
+ $bx, $by, $bz);
+ $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
+ $lines =~ s/\.,/,/g;
+ $lines =~ s/-0,/0,/g;
+
+ $code .= $lines;
+ }
+
+ } else {
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my $ax = $points[$i*9];
+ my $ay = $points[$i*9+1];
+ my $az = $points[$i*9+2];
+
+ my $bx = $points[$i*9+3];
+ my $by = $points[$i*9+4];
+ my $bz = $points[$i*9+5];
+
+ my $cx = $points[$i*9+6];
+ my $cy = $points[$i*9+7];
+ my $cz = $points[$i*9+8];
+
+ my ($nax, $nay, $naz,
+ $nbx, $nby, $nbz,
+ $ncx, $ncy, $ncz);
+
+ if ($smooth_p) {
+ $nax = $normals[$i*9];
+ $nay = $normals[$i*9+1];
+ $naz = $normals[$i*9+2];
+
+ $nbx = $normals[$i*9+3];
+ $nby = $normals[$i*9+4];
+ $nbz = $normals[$i*9+5];
+
+ $ncx = $normals[$i*9+6];
+ $ncy = $normals[$i*9+7];
+ $ncz = $normals[$i*9+8];
+
+ } else {
+ if ($ccw_p) {
+ ($nax, $nay, $naz) = face_normal ($ax, $ay, $az,
+ $bx, $by, $bz,
+ $cx, $cy, $cz);
+ } else {
+ ($nax, $nay, $naz) = face_normal ($ax, $ay, $az,
+ $cx, $cy, $cz,
+ $bx, $by, $bz);
+ }
+ ($nbx, $nby, $nbz) = ($nax, $nay, $naz);
+ ($ncx, $ncy, $ncz) = ($nax, $nay, $naz);
+ }
+
+ my $lines = sprintf("\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n",
+ $nax, $nay, $naz, $ax, $ay, $az,
+ $nbx, $nby, $nbz, $bx, $by, $bz,
+ $ncx, $ncy, $ncz, $cx, $cy, $cz);
+ $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
+ $lines =~ s/\.,/,/g;
+ $lines =~ s/-0,/0,/g;
+
+ $code .= $lines;
+ }
+ }
+
+ my $format = ($wireframe_p ? 'GL_V3F' : 'GL_N3F_V3F');
+ my $primitive = ($wireframe_p ? 'GL_LINES' : 'GL_TRIANGLES');
+
+ $code =~ s/,\n$//s;
+ $code .= "\n};\n";
+ $code .= "static const struct gllist ${name}_frame = {\n";
+ $code .= " $format, $primitive, $npoints, ${name}_data, 0\n};\n";
+ $code .= "const struct gllist *$name = &${name}_frame;\n";
+
+ print STDERR "$progname: $outfile: $name: $npoints points, $nfaces faces.\n"
+ if ($verbose);
+
+ return ($code, $npoints, $nfaces);
+}
+
+
+sub generate_c($$$$$$) {
+ my ($infile, $outfile, $smooth_p, $wireframe_p, $normalize_p, $layers) = @_;
+
+ my $code = '';
+
+ my $token = $outfile; # guess at a C token from the filename
+ $token =~ s/\<[^<>]*\>//;
+ $token =~ s@^.*/@@;
+ $token =~ s/\.[^.]*$//;
+ $token =~ s/[^a-z\d]/_/gi;
+ $token =~ s/__+/_/g;
+ $token =~ s/^_//g;
+ $token =~ s/_$//g;
+ $token =~ tr [A-Z] [a-z];
+ $token = 'foo' if ($token eq '');
+
+ my @layers = sort (keys %$layers);
+
+ $infile =~ s@^.*/@@s;
+ $code .= ("/* Generated from \"$infile\" on " .
+ strftime ("%d-%b-%Y", localtime ()) . ".\n" .
+ " " . ($wireframe_p
+ ? "Wireframe."
+ : ($smooth_p ?
+ "Smoothed vertex normals." :
+ "Faceted face normals.")) .
+ ($normalize_p ? " Normalized to unit bounding box." : "") .
+ "\n" .
+ (@layers > 1
+ ? wrap (" ", " ", "Components: " . join (", ", @layers)) . ".\n"
+ : "") .
+ " */\n\n");
+
+ $code .= "#include \"gllist.h\"\n";
+
+ my $npoints = 0;
+ my $nfaces = 0;
+
+ foreach my $layer (@layers) {
+ my $name = $layer ? "${token}_${layer}" : $token;
+ my ($c, $np, $nf) =
+ generate_c_1 ($name, $outfile,
+ $smooth_p, $wireframe_p, $normalize_p,
+ @{$layers->{$layer}});
+ $code .= $c;
+ $npoints += $np;
+ $nfaces += $nf;
+ }
+
+ print STDERR "$progname: $outfile: total: $npoints points, $nfaces faces.\n"
+ if ($verbose && @layers > 1);
+
+ return $code;
+}
+
+
+# Returns true if the two files differ (by running "cmp")
+#
+sub cmp_files($$) {
+ my ($file1, $file2) = @_;
+
+ my @cmd = ("cmp", "-s", "$file1", "$file2");
+ print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+ if ($verbose > 3);
+
+ system (@cmd);
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ return $exit_value;
+}
+
+
+sub dxf_to_gl($$$$$$) {
+ my ($infile, $outfile, $smooth_p, $normalize_p, $wireframe_p, $layers_p) = @_;
+
+ open (my $in, "<$infile") || error ("$infile: $!");
+ my $filename = ($infile eq '-' ? "<stdin>" : $infile);
+ print STDERR "$progname: reading $filename...\n"
+ if ($verbose);
+
+ local $/ = undef; # read entire file
+ my $dxf = <$in>;
+ close $in;
+
+ my $data = parse_dxf ($filename, $dxf, $normalize_p, $wireframe_p, $layers_p);
+
+ $filename = ($outfile eq '-' ? "<stdout>" : $outfile);
+ my $code = generate_c ($infile, $filename, $smooth_p, $wireframe_p,
+ $normalize_p, $data);
+
+ if ($outfile eq '-') {
+ print STDOUT $code;
+ } else {
+ my $tmp = "$outfile.tmp";
+ open (my $out, '>', $tmp) || error ("$tmp: $!");
+ print $out $code || error ("$filename: $!");
+ close $out || error ("$filename: $!");
+ if (cmp_files ($filename, $tmp)) {
+ if (!rename ($tmp, $filename)) {
+ unlink $tmp;
+ error ("mv $tmp $filename: $!");
+ }
+ print STDERR "$progname: wrote $filename\n";
+ } else {
+ unlink "$tmp" || error ("rm $tmp: $!\n");
+ print STDERR "$progname: $filename unchanged\n" if ($verbose);
+ }
+ }
+}
+
+
+sub error() {
+ ($_) = @_;
+ print STDERR "$progname: $_\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname " .
+ "[--verbose] [--normalize] [--smooth] [--wireframe] [--layers]\n" .
+ "[infile [outfile]]\n";
+ exit 1;
+}
+
+sub main() {
+ my ($infile, $outfile);
+ my $normalize_p = 0;
+ my $smooth_p = 0;
+ my $wireframe_p = 0;
+ my $layers_p = 0;
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif ($_ eq "--normalize") { $normalize_p = 1; }
+ elsif ($_ eq "--smooth") { $smooth_p = 1; }
+ elsif ($_ eq "--wireframe") { $wireframe_p = 1; }
+ elsif ($_ eq "--layers") { $layers_p = 1; }
+ elsif (m/^-./) { usage; }
+ elsif (!defined($infile)) { $infile = $_; }
+ elsif (!defined($outfile)) { $outfile = $_; }
+ else { usage; }
+ }
+
+ $infile = "-" unless defined ($infile);
+ $outfile = "-" unless defined ($outfile);
+
+ dxf_to_gl ($infile, $outfile, $smooth_p, $normalize_p, $wireframe_p, $layers_p);
+}
+
+main;
+exit 0;
diff --git a/hacks/glx/dymaxionmap-coords.c b/hacks/glx/dymaxionmap-coords.c
new file mode 100644
index 0000000..1eb064d
--- /dev/null
+++ b/hacks/glx/dymaxionmap-coords.c
@@ -0,0 +1,685 @@
+/* http://www.rwgrayprojects.com/rbfnotes/maps/graymap6.html
+ Slightly modified by jwz for xscreensaver
+ */
+
+
+/**************************************************************/
+/* */
+/* This C program is copyrighted by Robert W. Gray and may */
+/* not be used in ANY for-profit project without written */
+/* permission. */
+/* */
+/**************************************************************/
+
+/* (Note: Robert Gray has kindly given me his permission to include
+ this code in xscreensaver. -- Jamie Zawinski, Apr 2018.)
+ */
+
+
+/**************************************************************/
+/* */
+/* This C program contains the Dymaxion map coordinate */
+/* transformation routines for converting longitude/latitude */
+/* points to (X, Y) points on the Dymaxion map. */
+/* */
+/* This version uses the exact transformation equations. */
+/**************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "dymaxionmap-coords.h"
+
+/************************************************************************/
+/* NOTE: in C, array indexing starts with element zero (0). I choose */
+/* to start my array indexing with elemennt one (1) so all arrays */
+/* are defined one element longer than they need to be. */
+/************************************************************************/
+
+/************************************************************************/
+/* global variables accessable to all procedures */
+/************************************************************************/
+
+static double v_x[13], v_y[13], v_z[13];
+static double center_x[21], center_y[21], center_z[21];
+static double garc, gt, gdve, gel;
+
+/********************************************/
+/* function pre-definitions */
+/********************************************/
+
+static double radians(double degrees);
+static void rotate(double angle, double *x, double *y);
+static void r2(int axis, double alpha, double *x, double *y, double *z);
+static void init_stuff(void);
+/*static void convert_s_t_p(double lng, double lat, double *x, double *y);*/
+static void s_to_c(double theta, double phi, double *x, double *y, double *z);
+static void c_to_s(double *theta, double *phi, double x, double y, double z);
+static void s_tri_info(double x, double y, double z,
+ int *tri, int *lcd);
+static void dymax_point(int tri, int lcd,
+ double x, double y, double z,
+ double *dx, double *dy);
+static void conv_ll_t_sc(double lng, double lat, double *theta, double *phi);
+
+
+/****************************************/
+/* function definitions */
+/****************************************/
+
+
+void
+/* convert_s_t_p */
+dymaxion_convert
+(double lng, double lat, double *x, double *y)
+{
+ /***********************************************************/
+ /* This is the main control procedure. */
+ /***********************************************************/
+
+ double theta, phi;
+ double hx, hy, hz;
+ double px = 0, py = 0;
+ int tri, hlcd;
+
+ static int initted = 0;
+ if (! initted) {
+ init_stuff();
+ initted = 1;
+ }
+
+ /* Convert the given (long.,lat.) coordinate into spherical */
+ /* polar coordinates (r, theta, phi) with radius=1. */
+ /* Angles are given in radians, NOT degrees. */
+
+ conv_ll_t_sc(lng, lat, &theta, &phi);
+
+ /* convert the spherical polar coordinates into cartesian */
+ /* (x, y, z) coordinates. */
+
+ s_to_c(theta, phi, &hx, &hy, &hz);
+
+ /* determine which of the 20 spherical icosahedron triangles */
+ /* the given point is in and the LCD triangle. */
+
+ s_tri_info(hx, hy, hz, &tri, &hlcd);
+
+ /* Determine the corresponding Fuller map plane (x, y) point */
+
+ dymax_point(tri, hlcd, hx, hy, hz, &px, &py);
+ *x = px;
+ *y = py;
+
+} /* end convert_s_t_p */
+
+
+static void conv_ll_t_sc(double lng, double lat, double *theta, double *phi)
+{
+ /* convert (long., lat.) point into spherical polar coordinates */
+ /* with r=radius=1. Angles are given in radians. */
+
+ double h_theta, h_phi;
+
+ h_theta = 90.0 - lat ;
+ h_phi = lng;
+ if (lng < 0.0) {h_phi = lng + 360.0;}
+ *theta = radians(h_theta);
+ *phi = radians(h_phi);
+
+} /* end conv_ll_t_sc */
+
+
+static double radians(double degrees)
+{
+ /* convert angles in degrees into angles in radians */
+
+ double pi2, c1;
+
+ pi2 = 2 * 3.14159265358979323846;
+ c1 = pi2 / 360;
+ return(c1 * degrees);
+
+} /* end of radians function */
+
+
+static void init_stuff()
+{
+ /* initializes the global variables which includes the */
+ /* vertix coordinates and mid-face coordinates. */
+
+ double /* i, */ hold_x, hold_y, hold_z, magn;
+ /* double theta, phi; */
+
+ /* Cartesian coordinates for the 12 vertices of icosahedron */
+
+ v_x[1] = 0.420152426708710003;
+ v_y[1] = 0.078145249402782959;
+ v_z[1] = 0.904082550615019298;
+ v_x[2] = 0.995009439436241649 ;
+ v_y[2] = -0.091347795276427931 ;
+ v_z[2] = 0.040147175877166645 ;
+ v_x[3] = 0.518836730327364437 ;
+ v_y[3] = 0.835420380378235850 ;
+ v_z[3] = 0.181331837557262454 ;
+ v_x[4] = -0.414682225320335218 ;
+ v_y[4] = 0.655962405434800777 ;
+ v_z[4] = 0.630675807891475371 ;
+ v_x[5] = -0.515455959944041808 ;
+ v_y[5] = -0.381716898287133011 ;
+ v_z[5] = 0.767200992517747538 ;
+ v_x[6] = 0.355781402532944713 ;
+ v_y[6] = -0.843580002466178147 ;
+ v_z[6] = 0.402234226602925571 ;
+ v_x[7] = 0.414682225320335218 ;
+ v_y[7] = -0.655962405434800777 ;
+ v_z[7] = -0.630675807891475371 ;
+ v_x[8] = 0.515455959944041808 ;
+ v_y[8] = 0.381716898287133011 ;
+ v_z[8] = -0.767200992517747538 ;
+ v_x[9] = -0.355781402532944713 ;
+ v_y[9] = 0.843580002466178147 ;
+ v_z[9] = -0.402234226602925571 ;
+ v_x[10] = -0.995009439436241649 ;
+ v_y[10] = 0.091347795276427931 ;
+ v_z[10] = -0.040147175877166645 ;
+ v_x[11] = -0.518836730327364437 ;
+ v_y[11] = -0.835420380378235850 ;
+ v_z[11] = -0.181331837557262454 ;
+ v_x[12] = -0.420152426708710003 ;
+ v_y[12] = -0.078145249402782959 ;
+ v_z[12] = -0.904082550615019298 ;
+
+ /* now calculate mid face coordinates */
+
+ hold_x = (v_x[1] + v_x[2] + v_x[3]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[2] + v_y[3]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[2] + v_z[3]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[1] = hold_x / magn;
+ center_y[1] = hold_y / magn;
+ center_z[1] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[3] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[3] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[3] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[2] = hold_x / magn;
+ center_y[2] = hold_y / magn;
+ center_z[2] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[4] + v_x[5]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[4] + v_y[5]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[4] + v_z[5]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[3] = hold_x / magn;
+ center_y[3] = hold_y / magn;
+ center_z[3] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[5] + v_x[6]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[5] + v_y[6]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[5] + v_z[6]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[4] = hold_x / magn;
+ center_y[4] = hold_y / magn;
+ center_z[4] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[2] + v_x[6]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[2] + v_y[6]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[2] + v_z[6]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[5] = hold_x / magn;
+ center_y[5] = hold_y / magn;
+ center_z[5] = hold_z / magn;
+
+ hold_x = (v_x[2] + v_x[3] + v_x[8]) / 3.0 ;
+ hold_y = (v_y[2] + v_y[3] + v_y[8]) / 3.0 ;
+ hold_z = (v_z[2] + v_z[3] + v_z[8]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[6] = hold_x / magn;
+ center_y[6] = hold_y / magn;
+ center_z[6] = hold_z / magn;
+
+ hold_x = (v_x[8] + v_x[3] + v_x[9]) / 3.0 ;
+ hold_y = (v_y[8] + v_y[3] + v_y[9]) / 3.0 ;
+ hold_z = (v_z[8] + v_z[3] + v_z[9]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[7] = hold_x / magn;
+ center_y[7] = hold_y / magn;
+ center_z[7] = hold_z / magn;
+
+ hold_x = (v_x[9] + v_x[3] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[9] + v_y[3] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[9] + v_z[3] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[8] = hold_x / magn;
+ center_y[8] = hold_y / magn;
+ center_z[8] = hold_z / magn;
+
+ hold_x = (v_x[10] + v_x[9] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[10] + v_y[9] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[10] + v_z[9] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[9] = hold_x / magn;
+ center_y[9] = hold_y / magn;
+ center_z[9] = hold_z / magn;
+
+ hold_x = (v_x[5] + v_x[10] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[5] + v_y[10] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[5] + v_z[10] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[10] = hold_x / magn;
+ center_y[10] = hold_y / magn;
+ center_z[10] = hold_z / magn;
+
+ hold_x = (v_x[5] + v_x[11] + v_x[10]) / 3.0 ;
+ hold_y = (v_y[5] + v_y[11] + v_y[10]) / 3.0 ;
+ hold_z = (v_z[5] + v_z[11] + v_z[10]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[11] = hold_x / magn;
+ center_y[11] = hold_y / magn;
+ center_z[11] = hold_z / magn;
+
+ hold_x = (v_x[5] + v_x[6] + v_x[11]) / 3.0 ;
+ hold_y = (v_y[5] + v_y[6] + v_y[11]) / 3.0 ;
+ hold_z = (v_z[5] + v_z[6] + v_z[11]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[12] = hold_x / magn;
+ center_y[12] = hold_y / magn;
+ center_z[12] = hold_z / magn;
+
+ hold_x = (v_x[11] + v_x[6] + v_x[7]) / 3.0 ;
+ hold_y = (v_y[11] + v_y[6] + v_y[7]) / 3.0 ;
+ hold_z = (v_z[11] + v_z[6] + v_z[7]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[13] = hold_x / magn;
+ center_y[13] = hold_y / magn;
+ center_z[13] = hold_z / magn;
+
+ hold_x = (v_x[7] + v_x[6] + v_x[2]) / 3.0 ;
+ hold_y = (v_y[7] + v_y[6] + v_y[2]) / 3.0 ;
+ hold_z = (v_z[7] + v_z[6] + v_z[2]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[14] = hold_x / magn;
+ center_y[14] = hold_y / magn;
+ center_z[14] = hold_z / magn;
+
+ hold_x = (v_x[8] + v_x[7] + v_x[2]) / 3.0 ;
+ hold_y = (v_y[8] + v_y[7] + v_y[2]) / 3.0 ;
+ hold_z = (v_z[8] + v_z[7] + v_z[2]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[15] = hold_x / magn;
+ center_y[15] = hold_y / magn;
+ center_z[15] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[9] + v_x[8]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[9] + v_y[8]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[9] + v_z[8]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[16] = hold_x / magn;
+ center_y[16] = hold_y / magn;
+ center_z[16] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[9] + v_x[10]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[9] + v_y[10]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[9] + v_z[10]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[17] = hold_x / magn;
+ center_y[17] = hold_y / magn;
+ center_z[17] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[11] + v_x[10]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[11] + v_y[10]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[11] + v_z[10]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[18] = hold_x / magn;
+ center_y[18] = hold_y / magn;
+ center_z[18] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[11] + v_x[7]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[11] + v_y[7]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[11] + v_z[7]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[19] = hold_x / magn;
+ center_y[19] = hold_y / magn;
+ center_z[19] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[8] + v_x[7]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[8] + v_y[7]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[8] + v_z[7]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[20] = hold_x / magn;
+ center_y[20] = hold_y / magn;
+ center_z[20] = hold_z / magn;
+
+ garc = 2.0 * asin( sqrt( 5 - sqrt(5)) / sqrt(10) );
+ gt = garc / 2.0;
+
+ gdve = sqrt( 3 + sqrt(5) ) / sqrt( 5 + sqrt(5) );
+ gel = sqrt(8) / sqrt(5 + sqrt(5));
+
+} /* end of int_stuff procedure */
+
+
+static void s_to_c(double theta, double phi, double *x, double *y, double *z)
+{
+ /* Covert spherical polar coordinates to cartesian coordinates. */
+ /* The angles are given in radians. */
+
+ *x = sin(theta) * cos(phi);
+ *y = sin(theta) * sin(phi);
+ *z = cos(theta);
+
+ } /* end s_to_c */
+
+
+static void c_to_s(double *lng, double *lat, double x, double y, double z)
+ {
+ /* convert cartesian coordinates into spherical polar coordinates. */
+ /* The angles are given in radians. */
+
+ double a;
+
+ if (x>0.0 && y>0.0){a = radians(0.0);}
+ if (x<0.0 && y>0.0){a = radians(180.0);}
+ if (x<0.0 && y<0.0){a = radians(180.0);}
+ if (x>0.0 && y<0.0){a = radians(360.0);}
+ *lat = acos(z);
+ if (x==0.0 && y>0.0){*lng = radians(90.0);}
+ if (x==0.0 && y<0.0){*lng = radians(270.0);}
+ if (x>0.0 && y==0.0){*lng = radians(0.0);}
+ if (x<0.0 && y==0.0){*lng = radians(180.0);}
+ if (x!=0.0 && y!=0.0){*lng = atan(y/x) + a;}
+
+} /* end c_to_s */
+
+
+void s_tri_info(double x, double y, double z,
+ int *tri, int *lcd)
+{
+ /* Determine which triangle and LCD triangle the point is in. */
+
+ double h_dist1, h_dist2, h_dist3, h1, h2, h3;
+ int i, h_tri, h_lcd ;
+ int v1 = 0, v2 = 0, v3 = 0;
+
+ h_tri = 0;
+ h_dist1 = 9999.0;
+
+ /* Which triangle face center is the closest to the given point */
+ /* is the triangle in which the given point is in. */
+
+ for (i = 1; i <=20; i = i + 1)
+ {
+ h1 = center_x[i] - x;
+ h2 = center_y[i] - y;
+ h3 = center_z[i] - z;
+ h_dist2 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+ if (h_dist2 < h_dist1)
+ {
+ h_tri = i;
+ h_dist1 = h_dist2;
+ } /* end the if statement */
+ } /* end the for statement */
+
+ *tri = h_tri;
+
+ /* Now the LCD triangle is determined. */
+
+ switch (h_tri)
+ {
+ case 1: v1 = 1; v2 = 3; v3 = 2; break;
+ case 2: v1 = 1; v2 = 4; v3 = 3; break;
+ case 3: v1 = 1; v2 = 5; v3 = 4; break;
+ case 4: v1 = 1; v2 = 6; v3 = 5; break;
+ case 5: v1 = 1; v2 = 2; v3 = 6; break;
+ case 6: v1 = 2; v2 = 3; v3 = 8; break;
+ case 7: v1 = 3; v2 = 9; v3 = 8; break;
+ case 8: v1 = 3; v2 = 4; v3 = 9; break;
+ case 9: v1 = 4; v2 = 10; v3 = 9; break;
+ case 10: v1 = 4; v2 = 5; v3 = 10; break;
+ case 11: v1 = 5; v2 = 11; v3 = 10; break;
+ case 12: v1 = 5; v2 = 6; v3 = 11; break;
+ case 13: v1 = 6; v2 = 7; v3 = 11; break;
+ case 14: v1 = 2; v2 = 7; v3 = 6; break;
+ case 15: v1 = 2; v2 = 8; v3 = 7; break;
+ case 16: v1 = 8; v2 = 9; v3 = 12; break;
+ case 17: v1 = 9; v2 = 10; v3 = 12; break;
+ case 18: v1 = 10; v2 = 11; v3 = 12; break;
+ case 19: v1 = 11; v2 = 7; v3 = 12; break;
+ case 20: v1 = 8; v2 = 12; v3 = 7; break;
+ } /* end of switch statement */
+
+ h1 = x - v_x[v1];
+ h2 = y - v_y[v1];
+ h3 = z - v_z[v1];
+ h_dist1 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+
+ h1 = x - v_x[v2];
+ h2 = y - v_y[v2];
+ h3 = z - v_z[v2];
+ h_dist2 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+
+ h1 = x - v_x[v3];
+ h2 = y - v_y[v3];
+ h3 = z - v_z[v3];
+ h_dist3 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+
+ if ( (h_dist1 <= h_dist2) && (h_dist2 <= h_dist3) ) {h_lcd = 1; }
+ if ( (h_dist1 <= h_dist3) && (h_dist3 <= h_dist2) ) {h_lcd = 6; }
+ if ( (h_dist2 <= h_dist1) && (h_dist1 <= h_dist3) ) {h_lcd = 2; }
+ if ( (h_dist2 <= h_dist3) && (h_dist3 <= h_dist1) ) {h_lcd = 3; }
+ if ( (h_dist3 <= h_dist1) && (h_dist1 <= h_dist2) ) {h_lcd = 5; }
+ if ( (h_dist3 <= h_dist2) && (h_dist2 <= h_dist1) ) {h_lcd = 4; }
+
+ *lcd = h_lcd;
+
+} /* end s_tri_info */
+
+
+static void dymax_point(int tri, int lcd,
+ double x, double y, double z,
+ double *px, double *py)
+{
+ int axis, v1 = 0;
+ double hlng, hlat, h0x, h0y, h0z, h1x, h1y, h1z;
+
+ double gs;
+ double gx, gy, gz, ga1,ga2,ga3,ga1p,ga2p,ga3p,gxp,gyp/*,gzp*/;
+
+
+ /* In order to rotate the given point into the template spherical */
+ /* triangle, we need the spherical polar coordinates of the center */
+ /* of the face and one of the face vertices. So set up which vertex */
+ /* to use. */
+
+ switch (tri)
+ {
+ case 1: v1 = 1; break;
+ case 2: v1 = 1; break;
+ case 3: v1 = 1; break;
+ case 4: v1 = 1; break;
+ case 5: v1 = 1; break;
+ case 6: v1 = 2; break;
+ case 7: v1 = 3; break;
+ case 8: v1 = 3; break;
+ case 9: v1 = 4; break;
+ case 10: v1 = 4; break;
+ case 11: v1 = 5; break;
+ case 12: v1 = 5; break;
+ case 13: v1 = 6; break;
+ case 14: v1 = 2; break;
+ case 15: v1 = 2; break;
+ case 16: v1 = 8; break;
+ case 17: v1 = 9; break;
+ case 18: v1 = 10; break;
+ case 19: v1 = 11; break;
+ case 20: v1 = 8; break;
+ } /* end of switch statement */
+
+ h0x = x;
+ h0y = y;
+ h0z = z;
+
+ h1x = v_x[v1];
+ h1y = v_y[v1];
+ h1z = v_z[v1];
+
+ c_to_s(&hlng, &hlat, center_x[tri], center_y[tri], center_z[tri]);
+
+ axis = 3;
+ r2(axis,hlng,&h0x,&h0y,&h0z);
+ r2(axis,hlng,&h1x,&h1y,&h1z);
+
+ axis = 2;
+ r2(axis,hlat,&h0x,&h0y,&h0z);
+ r2(axis,hlat,&h1x,&h1y,&h1z);
+
+ c_to_s(&hlng,&hlat,h1x,h1y,h1z);
+ hlng = hlng - radians(90.0);
+
+ axis = 3;
+ r2(axis,hlng,&h0x,&h0y,&h0z);
+
+ /* exact transformation equations */
+
+ gz = sqrt(1 - h0x * h0x - h0y * h0y);
+ gs = sqrt( 5 + 2 * sqrt(5) ) / ( gz * sqrt(15) );
+
+ gxp = h0x * gs ;
+ gyp = h0y * gs ;
+
+ ga1p = 2.0 * gyp / sqrt(3.0) + (gel / 3.0) ;
+ ga2p = gxp - (gyp / sqrt(3)) + (gel / 3.0) ;
+ ga3p = (gel / 3.0) - gxp - (gyp / sqrt(3));
+
+ ga1 = gt + atan( (ga1p - 0.5 * gel) / gdve);
+ ga2 = gt + atan( (ga2p - 0.5 * gel) / gdve);
+ ga3 = gt + atan( (ga3p - 0.5 * gel) / gdve);
+
+ gx = 0.5 * (ga2 - ga3) ;
+
+ gy = (1.0 / (2.0 * sqrt(3)) ) * (2 * ga1 - ga2 - ga3);
+
+ /* Re-scale so plane triangle edge length is 1. */
+
+ x = gx / garc;
+ y = gy / garc;
+
+ /* rotate and translate to correct position */
+
+ switch (tri)
+ {
+ case 1: rotate(240.0,&x, &y);
+ *px = x + 2.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
+ case 2: rotate(300.0, &x, &y); *px = x + 2.0;
+ *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
+ case 3: rotate(0.0, &x, &y);
+ *px = x + 2.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 4: rotate(60.0, &x, &y);
+ *px = x + 3.0; *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
+ case 5: rotate(180.0, &x, &y);
+ *px = x + 2.5; *py = y + 4.0 * sqrt(3.0) / 3.0; break;
+ case 6: rotate(300.0, &x, &y);
+ *px = x + 1.5; *py = y + 4.0 * sqrt(3.0) / 3.0; break;
+ case 7: rotate(300.0, &x, &y);
+ *px = x + 1.0; *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
+ case 8: rotate(0.0, &x, &y);
+ *px = x + 1.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 9: if (lcd > 2)
+ {
+ rotate(300.0, &x, &y);
+ *px = x + 1.5; *py = y + 1.0 / sqrt(3.0);
+ }
+ else
+ {
+ rotate(0.0, &x, &y);
+ *px = x + 2.0; *py = y + 1.0 / (2.0 * sqrt(3.0));
+ }
+ break;
+
+ case 10: rotate(60.0, &x, &y);
+ *px = x + 2.5; *py = y + 1.0 / sqrt(3.0); break;
+ case 11: rotate(60.0, &x, &y);
+ *px = x + 3.5; *py = y + 1.0 / sqrt(3.0); break;
+ case 12: rotate(120.0, &x, &y);
+ *px = x + 3.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 13: rotate(60.0, &x, &y);
+ *px = x + 4.0; *py = y + 5.0 / (2.0 * sqrt(3.0)); break;
+ case 14: rotate(0.0, &x, &y);
+ *px = x + 4.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
+ case 15: rotate(0.0, &x, &y);
+ *px = x + 5.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
+ case 16: if (lcd < 4)
+ {
+ rotate(60.0, &x, &y);
+ *px = x + 0.5; *py = y + 1.0 / sqrt(3.0);
+ }
+ else
+ {
+ rotate(0.0, &x, &y);
+ *px = x + 5.5; *py = y + 2.0 / sqrt(3.0);
+ }
+ break;
+ case 17: rotate(0.0, &x, &y);
+ *px = x + 1.0; *py = y + 1.0 / (2.0 * sqrt(3.0)); break;
+ case 18: rotate(120.0, &x, &y);
+ *px = x + 4.0; *py = y + 1.0 / (2.0 * sqrt(3.0)); break;
+ case 19: rotate(120.0, &x, &y);
+ *px = x + 4.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 20: rotate(300.0, &x, &y);
+ *px = x + 5.0; *py = y + 5.0 / (2.0 * sqrt(3.0)); break;
+
+ } /* end switch statement */
+
+} /* end of dymax_point */
+
+
+static void rotate(double angle, double *x, double *y)
+{
+ /* Rotate the point to correct orientation in XY-plane. */
+
+ double ha, hx, hy ;
+
+ ha = radians(angle);
+ hx = *x;
+ hy = *y;
+ *x = hx * cos(ha) - hy * sin(ha);
+ *y = hx * sin(ha) + hy * cos(ha);
+
+} /* end rotate procedure */
+
+
+static void r2(int axis, double alpha, double *x, double *y, double *z)
+{
+ /* Rotate a 3-D point about the specified axis. */
+
+ double a, b, c;
+
+ a = *x;
+ b = *y;
+ c = *z;
+ if (axis == 1)
+ {
+ *y = b * cos(alpha) + c * sin(alpha);
+ *z = c * cos(alpha) - b * sin(alpha);
+ }
+
+ if (axis == 2)
+ {
+ *x = a * cos(alpha) - c * sin(alpha);
+ *z = a * sin(alpha) + c * cos(alpha);
+ }
+
+ if (axis == 3)
+ {
+ *x = a * cos(alpha) + b * sin(alpha);
+ *y = b * cos(alpha) - a * sin(alpha);
+ }
+
+} /* end of r2 */
+
diff --git a/hacks/glx/dymaxionmap-coords.h b/hacks/glx/dymaxionmap-coords.h
new file mode 100644
index 0000000..fad4a04
--- /dev/null
+++ b/hacks/glx/dymaxionmap-coords.h
@@ -0,0 +1,6 @@
+#ifndef __DYMAXIONMAP_COORDS_H__
+#define __DYMAXIONMAP_COORDS_H__
+
+void dymaxion_convert (double lng, double lat, double *x, double *y);
+
+#endif /* __DYMAXIONMAP_COORDS_H__ */
diff --git a/hacks/glx/dymaxionmap.c b/hacks/glx/dymaxionmap.c
new file mode 100644
index 0000000..711db2e
--- /dev/null
+++ b/hacks/glx/dymaxionmap.c
@@ -0,0 +1,1654 @@
+/* dymaxionmap --- Buckminster Fuller's unwrapped icosahedral globe.
+ * Copyright (c) 2016-2018 Jamie Zawinski.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#define LABEL_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*labelFont: " LABEL_FONT "\n"
+# define release_planet 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#include "sphere.h"
+#include "normals.h"
+#include "texfont.h"
+#include "dymaxionmap-coords.h"
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#define DEF_ROTATE "True"
+#define DEF_ROLL "True"
+#define DEF_WANDER "True"
+#define DEF_TEXTURE "True"
+#define DEF_STARS "True"
+#define DEF_GRID "True"
+#define DEF_SPEED "1.0"
+#define DEF_IMAGE "BUILTIN_FLAT"
+#define DEF_IMAGE2 "NONE"
+#define DEF_FRAMES "720"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+static int do_roll;
+static int do_wander;
+static int do_texture;
+static int do_stars;
+static int do_grid;
+static int frames;
+static GLfloat speed;
+static char *which_image;
+static char *which_image2;
+
+static XrmOptionDescRec opts[] = {
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+ {"-roll", ".roll", XrmoptionNoArg, "true" },
+ {"+roll", ".roll", XrmoptionNoArg, "false" },
+ {"-wander", ".wander", XrmoptionNoArg, "true" },
+ {"+wander", ".wander", XrmoptionNoArg, "false" },
+ {"-texture", ".texture", XrmoptionNoArg, "true" },
+ {"+texture", ".texture", XrmoptionNoArg, "false" },
+ {"-stars", ".stars", XrmoptionNoArg, "true" },
+ {"+stars", ".stars", XrmoptionNoArg, "false" },
+ {"-grid", ".grid", XrmoptionNoArg, "true" },
+ {"+grid", ".grid", XrmoptionNoArg, "false" },
+ {"-flat", ".image", XrmoptionNoArg, "BUILTIN_FLAT" },
+ {"-satellite",".image", XrmoptionNoArg, "BUILTIN_SAT" },
+ {"-image", ".image", XrmoptionSepArg, 0 },
+ {"-image2", ".image2", XrmoptionSepArg, 0 },
+ {"-frames", ".frames", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_roll, "roll", "Roll", DEF_ROLL, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_stars, "stars", "Stars", DEF_STARS, t_Bool},
+ {&do_grid, "grid", "Grid", DEF_GRID, t_Bool},
+ {&which_image, "image", "Image", DEF_IMAGE, t_String},
+ {&which_image2,"image2", "Image2", DEF_IMAGE2, t_String},
+ {&frames, "frames", "Frames", DEF_FRAMES, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct planet_description =
+{"planet", "init_planet", "draw_planet", NULL,
+ "draw_planet", "init_planet", "free_planet", &planet_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Buckminster Fuller's unwrapped icosahedral globe", 0, NULL};
+#endif
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the following XPM file... */
+# endif
+
+#include "images/gen/earth_flat_png.h"
+#include "images/gen/earth_png.h"
+#include "images/gen/earth_night_png.h"
+#include "images/gen/ground_png.h"
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+
+typedef struct {
+ GLXContext *glx_context;
+ GLuint starlist;
+ int starcount;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+ enum { STARTUP, FLAT, FOLD,
+ ICO, STEL_IN, AXIS, SPIN, STEL, STEL_OUT,
+ ICO2, UNFOLD } state;
+ GLfloat ratio;
+ GLuint tex1, tex2;
+ texture_font_data *font_data;
+ int loading_sw, loading_sh;
+
+ XImage *day, *night, *dusk, *cvt;
+ XImage **images; /* One image for each frame of time-of-day. */
+ int nimages;
+
+ double current_frame;
+ Bool cache_p;
+ long delay;
+
+} planetstruct;
+
+
+static planetstruct *planets = NULL;
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+/* Draw faint latitude and longitude lines into the RGBA XImage.
+ */
+static void
+add_grid_lines (XImage *image)
+{
+ int i;
+ int off = 24;
+ for (i = 0; i < 24; i++)
+ {
+ int x = (i + 0.5) * image->width / (double) 24;
+ int y;
+ for (y = 0; y < image->height; y++)
+ {
+ unsigned long rgba = XGetPixel (image, x, y);
+ int r = (rgba >> 24) & 0xFF;
+ int g = (rgba >> 16) & 0xFF;
+ int b = (rgba >> 8) & 0xFF;
+ int a = (rgba >> 0) & 0xFF;
+ int off2 = (((r + g + b) / 3) < 0x7F ? off : -off);
+ r = MAX (0, MIN (0xFF, r + off2));
+ g = MAX (0, MIN (0xFF, g + off2));
+ b = MAX (0, MIN (0xFF, b + off2));
+ XPutPixel (image, x, y, (r << 24) | (g << 16) | (b << 8) | a);
+ }
+ }
+
+ for (i = 1; i < 11; i++)
+ {
+ int y = i * image->height / (double) 12;
+ int x;
+ for (x = 0; x < image->width; x++)
+ {
+ unsigned long rgba = XGetPixel (image, x, y);
+ int r = (rgba >> 24) & 0xFF;
+ int g = (rgba >> 16) & 0xFF;
+ int b = (rgba >> 8) & 0xFF;
+ int a = (rgba >> 0) & 0xFF;
+ int off2 = (((r + g + b) / 3) < 0x7F ? off : -off);
+ r = MAX (0, MIN (0xFF, r + off2));
+ g = MAX (0, MIN (0xFF, g + off2));
+ b = MAX (0, MIN (0xFF, b + off2));
+ XPutPixel (image, x, y, (r << 24) | (g << 16) | (b << 8) | a);
+ }
+ }
+}
+
+
+static void
+adjust_brightness (XImage *image, double amount)
+{
+ uint32_t *in = (uint32_t *) image->data;
+ int i;
+ int end = image->height * image->bytes_per_line / 4;
+ for (i = 0; i < end; i++)
+ {
+ uint32_t p = *in;
+ /* #### Why is this ABGR instead of RGBA? */
+ uint32_t a = (p >> 24) & 0xFF;
+ uint32_t g = (p >> 16) & 0xFF;
+ uint32_t b = (p >> 8) & 0xFF;
+ uint32_t r = (p >> 0) & 0xFF;
+ r = MAX(0, MIN(0xFF, (long) (r * amount)));
+ g = MAX(0, MIN(0xFF, (long) (g * amount)));
+ b = MAX(0, MIN(0xFF, (long) (b * amount)));
+ p = (a << 24) | (g << 16) | (b << 8) | r;
+ *in++ = p;
+ }
+}
+
+
+static GLfloat
+vector_angle (XYZ a, XYZ b)
+{
+ double La = sqrt (a.x*a.x + a.y*a.y + a.z*a.z);
+ double Lb = sqrt (b.x*b.x + b.y*b.y + b.z*b.z);
+ double cc, angle;
+
+ if (La == 0 || Lb == 0) return 0;
+ if (a.x == b.x && a.y == b.y && a.z == b.z) return 0;
+
+ /* dot product of two vectors is defined as:
+ La * Lb * cos(angle between vectors)
+ and is also defined as:
+ ax*bx + ay*by + az*bz
+ so:
+ La * Lb * cos(angle) = ax*bx + ay*by + az*bz
+ cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
+ angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
+ */
+ cc = (a.x*b.x + a.y*b.y + a.z*b.z) / (La * Lb);
+ if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
+ angle = acos (cc);
+
+ return (angle);
+}
+
+
+/* Creates a grayscale image encoding the day/night terminator for a random
+ axial tilt.
+ */
+static XImage *
+create_daylight_mask (Display *dpy, Visual *v, int w, int h)
+{
+ XImage *image = XCreateImage (dpy, v, 8, ZPixmap, 0, 0, w, h, 8, 0);
+ int x, y;
+ XYZ sun;
+ double axial_tilt = frand(23.4) / (180/M_PI) * RANDSIGN();
+ double dusk = M_PI * 0.035;
+ sun.x = 0;
+ sun.y = cos (axial_tilt);
+ sun.z = sin (axial_tilt);
+
+ image->data = (char *) malloc (image->height * image->bytes_per_line);
+
+ for (y = 0; y < image->height; y++)
+ {
+ double lat = -M_PI_2 + (M_PI * (y / (double) image->height));
+ double cosL = cos(lat);
+ double sinL = sin(lat);
+ for (x = 0; x < image->width; x++)
+ {
+ double lon = -M_PI_2 + (M_PI * 2 * (x / (double) image->width));
+ XYZ v;
+ double a;
+ unsigned long p;
+ v.x = cos(lon) * cosL;
+ v.y = sin(lon) * cosL;
+ v.z = sinL;
+ a = vector_angle (sun, v);
+ a -= M_PI_2;
+ a = (a < -dusk ? 1 : a >= dusk ? 0 : (dusk - a) / (dusk * 2));
+ p = 0xFF & (unsigned long) (a * 0xFF);
+ XPutPixel (image, x, y, p);
+ }
+ }
+ return image;
+}
+
+
+static void
+load_images (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i;
+
+ if (which_image && !strcmp (which_image, "BUILTIN_FLAT"))
+ {
+ which_image = strdup("BUILTIN_FLAT");
+ which_image2 = strdup("BUILTIN_FLAT");
+ }
+ else if (which_image && !strcmp (which_image, "BUILTIN_SAT"))
+ {
+ which_image = strdup("BUILTIN_DAY");
+ which_image2 = strdup("BUILTIN_NIGHT");
+ }
+
+ if (!which_image) which_image = strdup("");
+ if (!which_image2) which_image2 = strdup("");
+
+ for (i = 0; i < 2; i++)
+ {
+ char *s = (i == 0 ? which_image : which_image2);
+ XImage *image;
+ if (!strcmp (s, "BUILTIN_DAY"))
+ image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ earth_png, sizeof(earth_png));
+ else if (!strcmp (s, "BUILTIN_NIGHT"))
+ image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ earth_night_png,sizeof(earth_night_png));
+ else if (!strcmp (s, "BUILTIN") ||
+ !strcmp (s, "BUILTIN_FLAT") ||
+ (i == 0 && !strcmp (s, "")))
+ image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ earth_flat_png, sizeof(earth_flat_png));
+ else if (!strcmp (s, "NONE"))
+ image = 0;
+ else if (*s)
+ image = file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi), s);
+ else
+ image = 0;
+
+ /* if (image) fprintf (stderr, "%s: %d: loaded %s\n", progname, i, s); */
+
+ if (i == 0)
+ gp->day = image;
+ else
+ gp->night = image;
+ }
+
+ if (gp->night && !gp->day)
+ gp->day = gp->night, gp->night = 0;
+
+ gp->nimages = frames;
+ gp->current_frame = random() % gp->nimages;
+
+ if (gp->nimages < 1)
+ gp->nimages = 1;
+
+ if (gp->nimages < 2 && gp->night)
+ {
+ XDestroyImage (gp->night);
+ gp->night = 0;
+ gp->nimages = 1;
+ }
+
+ if (! gp->night)
+ gp->nimages = 1;
+
+ if (do_grid)
+ {
+ if (gp->day) add_grid_lines (gp->day);
+ if (gp->night) add_grid_lines (gp->night);
+ }
+
+ if (gp->day && gp->night && !gp->dusk)
+ {
+ if (gp->day->width != gp->night->width ||
+ gp->day->height != gp->night->height)
+ {
+ fprintf (stderr, "%s: day and night images must be the same size"
+ " (%dx%d vs %dx%d)\n", progname,
+ gp->day->width, gp->day->height,
+ gp->night->width, gp->night->height);
+ exit (1);
+ }
+ gp->dusk = create_daylight_mask (MI_DISPLAY (mi), MI_VISUAL (mi),
+ gp->day->width, gp->day->height);
+ }
+
+ /* Make the day image brighter, because that's easier than doing it
+ with GL lights. */
+ adjust_brightness (gp->day, 1.4);
+
+ if (!strcmp (which_image, which_image2))
+ /* If day and night are the same image, make night way darker. */
+ adjust_brightness (gp->night, 0.2);
+ else if (gp->night)
+ /* Otherwise make it just a little darker. */
+ adjust_brightness (gp->night, 0.7);
+
+
+ gp->images = (XImage **) calloc (gp->nimages, sizeof(*gp->images));
+
+ /* Create 'cvt', a map that projects each pixel from Equirectangular to
+ Dymaxion. It is 2x the width/height of the source images. We iterate
+ by half pixel to make sure we hit every pixel in 'out'. It would be
+ cleaner to iterate over 'out' instead of over 'in' but
+ dymaxionmap-coords.c only goes forward. This is... not super fast.
+ */
+ {
+ double W = 5.5;
+ double H = 3 * sqrt(3)/2;
+ int x2, y2;
+ int w = gp->day->width;
+ int h = gp->day->height;
+ uint32_t *out;
+
+ gp->cvt = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi), 32, ZPixmap, 0, 0,
+ gp->day->width*2, gp->day->height*2, 32, 0);
+ gp->cvt->data = (char *)
+ malloc (gp->cvt->height * gp->cvt->bytes_per_line);
+ out = (uint32_t *) gp->cvt->data;
+
+ for (y2 = 0; y2 < h*2; y2++)
+ {
+ double y = (double) y2/2;
+ double lat = -90 + (180 * (y / (double) h));
+ for (x2 = 0; x2 < w*2; x2++)
+ {
+ double x = (double) x2/2;
+ double lon = -180 + (360 * x / w);
+ double ox, oy;
+ dymaxion_convert (lon, lat, &ox, &oy);
+ ox = w - (w * ox / W);
+ oy = (h * oy / H);
+
+ *out++ = (((((uint32_t) ox) & 0xFFFF) << 16) |
+ ((((uint32_t) oy) & 0xFFFF)));
+ }
+ }
+ }
+
+ /* A 128 GB iPhone 6s dies at around 540 frames, ~1 GB of XImages.
+ A 16 GB iPad Air 2 dies at around 320 frames, ~640 MB.
+ Caching on mobile doesn't matter much: we can just run at 100% CPU.
+
+ On some systems it would be more efficient to cache the images inside
+ a texture on the GPU instead of moving it from RAM to GPU every few
+ frames; but on other systems, we'd just run out of GPU memory instead. */
+ {
+ unsigned long cache_size = (gp->day->width * gp->day->height * 4 *
+ gp->nimages);
+# ifdef HAVE_MOBILE
+ unsigned long max = 320 * 1024 * 1024L; /* 320 MB */
+# else
+ unsigned long max = 2 * 1024 * 1024 * 1024L; /* 2 GB */
+# endif
+ gp->cache_p = (cache_size < max);
+ }
+}
+
+
+static void
+cache_current_frame (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ XImage *blended, *dymaxion;
+ int i, x, y, w, h, end, xoff;
+ uint32_t *day, *night, *cvt, *out;
+ uint8_t *dusk;
+
+ if (gp->images[(int) gp->current_frame])
+ return;
+
+ xoff = (gp->dusk
+ ? gp->dusk->width * ((double) gp->current_frame / gp->nimages)
+ : 0);
+
+ w = gp->day->width;
+ h = gp->day->height;
+
+ if (!gp->night)
+ blended = gp->day;
+ else
+ {
+ /* Blend the foreground and background images through the dusk map.
+ */
+ blended = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi),
+ gp->day->depth, ZPixmap, 0, 0, w, h, 32, 0);
+ if (!blended) abort();
+ blended->data = (char *) malloc (h * blended->bytes_per_line);
+ if (!blended->data) abort();
+
+ end = blended->height * blended->bytes_per_line / 4;
+ day = (uint32_t *) gp->day->data;
+ night = (uint32_t *) gp->night->data;
+ dusk = (uint8_t *) gp->dusk->data;
+ out = (uint32_t *) blended->data;
+
+ for (i = 0; i < end; i++)
+ {
+ uint32_t d = *day++;
+ uint32_t n = *night++;
+ uint32_t x = i % w;
+ uint32_t y = i / w;
+ double r = dusk[y * w + ((x + xoff) % w)] / 256.0;
+ double r2 = 1-r;
+# define ADD(M) (((unsigned long) \
+ ((((d >> M) & 0xFF) * r) + \
+ (((n >> M) & 0xFF) * r2))) \
+ << M)
+ /* #### Why is this ABGR instead of RGBA? */
+ *out++ = (0xFF << 24) | ADD(16) | ADD(8) | ADD(0);
+# undef ADD
+ }
+ }
+
+ /* Convert blended Equirectangular to Dymaxion through the 'cvt' map.
+ */
+ dymaxion = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi),
+ gp->day->depth, ZPixmap, 0, 0, w, h, 32, 0);
+ dymaxion->data = (char *) calloc (h, dymaxion->bytes_per_line);
+
+ day = (uint32_t *) blended->data;
+ out = (uint32_t *) dymaxion->data;
+ cvt = (uint32_t *) gp->cvt->data;
+
+ for (y = 0; y < h*2; y++)
+ for (x = 0; x < w*2; x++)
+ {
+ unsigned long m = *cvt++;
+ unsigned long dx = (m >> 16) & 0xFFFF;
+ unsigned long dy = m & 0xFFFF;
+ unsigned long p = day[(y>>1) * w + (x>>1)];
+ unsigned long p2 = out[dy * w + dx];
+ if (p2 & 0xFF000000)
+ /* RGBA nonzero alpha: initialized. Average with existing,
+ otherwise the grid lines look terrible. */
+ p = (((((p>>24) & 0xFF) + ((p2>>24) & 0xFF)) >> 1) << 24 |
+ ((((p>>16) & 0xFF) + ((p2>>16) & 0xFF)) >> 1) << 16 |
+ ((((p>> 8) & 0xFF) + ((p2>> 8) & 0xFF)) >> 1) << 8 |
+ ((((p>> 0) & 0xFF) + ((p2>> 0) & 0xFF)) >> 1) << 0);
+ out[dy * w + dx] = p;
+ }
+
+ /* Fill in the triangles that are not a part of The World with the
+ color of the ocean to avoid texture-tearing on the folded edges.
+ */
+ out = (uint32_t *) dymaxion->data;
+ end = dymaxion->height * dymaxion->bytes_per_line / 4;
+ {
+ double lat = -48.44, lon = -123.39; /* R'Lyeh */
+ int x = (lon + 180) * blended->width / 360.0;
+ int y = (lat + 90) * blended->height / 180.0;
+ unsigned long ocean = XGetPixel (gp->day, x, y);
+ for (i = 0; i < end; i++)
+ {
+ uint32_t p = *out;
+ if (! (p & 0xFF000000)) /* AGBR */
+ *out = ocean;
+ out++;
+ }
+ }
+
+ if (blended != gp->day)
+ XDestroyImage (blended);
+
+ gp->images[(int) gp->current_frame] = dymaxion;
+
+ if (!gp->cache_p) /* Keep only one image around; recompute every time. */
+ {
+ i = ((int) gp->current_frame) - 1;
+ if (i < 0) i = gp->nimages - 1;
+ if (gp->images[i])
+ {
+ XDestroyImage (gp->images[i]);
+ gp->images[i] = 0;
+ }
+ }
+}
+
+
+static void
+setup_texture (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ XImage *ground;
+
+ glGenTextures (1, &gp->tex1);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ load_images (mi);
+
+ glGenTextures (1, &gp->tex2);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ /* The underground image can go on flat, without the dymaxion transform. */
+ ground = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ ground_png, sizeof(ground_png));
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* glPixelStorei(GL_UNPACK_ROW_LENGTH, ground->width); */
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ ground->width, ground->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, ground->data);
+ check_gl_error ("ground texture");
+ XDestroyImage (ground);
+}
+
+
+static void
+init_stars (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i, j;
+ int width = MI_WIDTH(mi);
+ int height = MI_HEIGHT(mi);
+ int size = (width > height ? width : height);
+ int nstars = size * size / 80;
+ int max_size = 3;
+ GLfloat inc = 0.5;
+ int steps = max_size / inc;
+ GLfloat scale = 1;
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ scale *= 2;
+ nstars /= 2;
+ }
+
+ gp->starlist = glGenLists(1);
+ glNewList(gp->starlist, GL_COMPILE);
+ for (j = 1; j <= steps; j++)
+ {
+ glPointSize(inc * j * scale);
+ glBegin (GL_POINTS);
+ for (i = 0; i < nstars / steps; i++)
+ {
+ GLfloat d = 0.1;
+ GLfloat r = 0.15 + frand(0.3);
+ GLfloat g = r + frand(d) - d;
+ GLfloat b = r + frand(d) - d;
+
+ GLfloat x = frand(1)-0.5;
+ GLfloat y = frand(1)-0.5;
+ GLfloat z = ((random() & 1)
+ ? frand(1)-0.5
+ : (BELLRAND(1)-0.5)/12); /* milky way */
+ d = sqrt (x*x + y*y + z*z);
+ x /= d;
+ y /= d;
+ z /= d;
+ glColor3f (r, g, b);
+ glVertex3f (x, y, z);
+ gp->starcount++;
+ }
+ glEnd ();
+ }
+ glEndList ();
+
+ check_gl_error("stars initialization");
+}
+
+
+ENTRYPOINT void
+reshape_planet (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 200.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+static void
+do_normal2 (ModeInfo *mi, Bool frontp, XYZ a, XYZ b, XYZ c)
+{
+ XYZ n = (frontp
+ ? calc_normal (a, b, c)
+ : calc_normal (b, a, c));
+ glNormal3f (n.x, n.y, n.z);
+
+# if 0
+ if (frontp && MI_IS_WIREFRAME(mi))
+ {
+ glBegin (GL_LINES);
+ glVertex3f ((a.x + b.x + c.x) / 3,
+ (a.y + b.y + c.y) / 3,
+ (a.z + b.z + c.z) / 3);
+ glVertex3f ((a.x + b.x + c.x) / 3 + n.x,
+ (a.y + b.y + c.y) / 3 + n.y,
+ (a.z + b.z + c.z) / 3 + n.z);
+ glEnd();
+ }
+# endif
+}
+
+
+static void
+triangle0 (ModeInfo *mi, Bool frontp, GLfloat stel_ratio, int facemask,
+ XYZ *corners_ret)
+{
+ /* Render a triangle as six sub-triangles.
+ Facemask bits 0-5 indicate which sub-triangle to draw.
+
+ A
+ / \
+ / | \
+ / | \
+ / 0 | 1 \
+ E /_ | _\ F
+ / \_ | _/ \
+ / 5 \D/ 2 \
+ / / | \ \
+ / / 4 | 3 \ \
+ / / | \ \
+ B ----------------------- C
+ G
+ */
+
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat h = sqrt(3) / 2;
+ GLfloat h2 = sqrt(h*h - (h/2)*(h/2)) - 0.5;
+ XYZ A, B, C, D, E, F, G;
+ XYZ tA, tB, tC, tD, tE, tF, tG;
+ XYZ a, b, c;
+ XYZ ta, tb, tc;
+ A.x = 0; A.y = h; A.z = 0;
+ B.x = -0.5, B.y = 0; B.z = 0;
+ C.x = 0.5, C.y = 0; C.z = 0;
+ D.x = 0; D.y = h/3; D.z = 0;
+ E.x = -h2; E.y = h/2; E.z = 0;
+ F.x = h2; F.y = h/2; F.z = 0;
+ G.x = 0; G.y = 0; G.z = 0;
+
+ /* When tweaking object XY to stellate, don't change texture coordinates. */
+ tA = A; tB = B; tC = C; tD = D; tE = E; tF = F; tG = G;
+
+ /* Eyeballed this to find the depth of stellation that seems to most
+ approximate a sphere.
+ */
+ D.z = 0.193 * stel_ratio;
+
+ /* We want to raise E, F and G as well but we can't just shift Z:
+ we need to keep them on the same vector from the center of the sphere,
+ which means also changing F and G's X and Y.
+ */
+ E.z = F.z = G.z = 0.132 * stel_ratio;
+ {
+ double magic_x = 0.044;
+ double magic_y = 0.028;
+ /* G.x stays 0 */
+ G.y -= sqrt (magic_x*magic_x + magic_y*magic_y) * stel_ratio;
+ E.x -= magic_x * stel_ratio;
+ E.y += magic_y * stel_ratio;
+ F.x += magic_x * stel_ratio;
+ F.y += magic_y * stel_ratio;
+ }
+
+
+ if (facemask & 1<<0)
+ {
+ a = E; b = D; c = A;
+ ta = tE; tb = tD; tc = tA;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<1)
+ {
+ a = D; b = F; c = A;
+ ta = tD; tb = tF; tc = tA;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<2)
+ {
+ a = D; b = C; c = F;
+ ta = tD; tb = tC; tc = tF;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<3)
+ {
+ a = G; b = C; c = D;
+ ta = tG; tb = tC; tc = tD;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<4)
+ {
+ a = B; b = G; c = D;
+ ta = tB; tb = tG; tc = tD;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<5)
+ {
+ a = B; b = D; c = E;
+ ta = tB; tb = tD; tc = tE;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<6)
+ {
+ a = E; b = D; c = A;
+ ta = tE; tb = tD; tc = tA;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+
+ if (corners_ret)
+ {
+ corners_ret[0] = A;
+ corners_ret[1] = B;
+ corners_ret[2] = C;
+ corners_ret[3] = D;
+ corners_ret[4] = E;
+ corners_ret[5] = F;
+ corners_ret[6] = G;
+ }
+}
+
+
+/* The segments, numbered arbitrarily from the top left:
+ ________ _ ________
+ \ /\ /\ \ |\ /
+ \ 0 / \ / \3> | \ 5 /
+ \ / 1 \ / 2 \| ..|4 \ /-6-..
+ ___________\/______\/______\/______\/______\
+ | /\ /\ /\ /\ /\
+ |7 / \ 9 / \ 11 / \ 13 / \ 15 / \
+ | / 8 \ / 10 \ / 12 \ / 14 \ / 16 \
+ |/______\/______\/______\/______\/______\
+ \ /\ / /\ /\
+ \ 17 / \ 18 / / \ 20 / \
+ \ / \ / / 19 \ / 21 \
+ \/ \/ /______\/______\
+
+ Each triangle can be connected to at most two other triangles.
+ We start from the middle, #12, and work our way to the edges.
+ Its centroid is 0,0.
+
+ (Note that dymaxionmap-coords.c uses a different numbering system.)
+ */
+static void
+triangle (ModeInfo *mi, int which, Bool frontp,
+ GLfloat fold_ratio, GLfloat stel_ratio)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ const GLfloat fg[] = { 1, 1, 1, 1 };
+ const GLfloat bg[] = { 0.3, 0.3, 0.3, 1 };
+ int a = -1, b = -1;
+ GLfloat max = acos (sqrt(5)/3);
+ GLfloat rot = -max * fold_ratio / (M_PI/180);
+ Bool wire = MI_IS_WIREFRAME(mi);
+ XYZ corners[7];
+
+ glColor3fv (fg);
+ if (!wire)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fg);
+
+ switch (which) {
+ case 3: /* One third of the face. */
+ triangle0 (mi, frontp, stel_ratio, 1<<3 | 1<<4, corners);
+ break;
+ case 4: /* Two thirds of the face: convex. */
+ triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3 | 1<<4, corners);
+ break;
+ case 6: /* One half of the face. */
+ triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3, corners);
+ break;
+ case 7: /* One half of the face. */
+ triangle0 (mi, frontp, stel_ratio, 1<<2 | 1<<3 | 1<<4, corners);
+ break;
+ default: /* Full face. */
+ triangle0 (mi, frontp, stel_ratio, 0x3F, corners);
+ break;
+ }
+
+ if (wire)
+ {
+ char tag[20];
+ glColor3fv (bg);
+ sprintf (tag, "%d", which);
+ glPushMatrix();
+ glTranslatef (-0.1, 0.2, 0);
+ glScalef (0.005, 0.005, 0.005);
+ print_texture_string (gp->font_data, tag);
+ glPopMatrix();
+ mi->polygon_count++;
+ }
+
+
+ /* The connection hierarchy of the faces starting at the middle, #12. */
+ switch (which) {
+ case 0: break;
+ case 1: a = 0; b = -1; break;
+ case 2: a = -1; b = 3; break;
+ case 3: break;
+ case 4: a = -1; b = 5; break;
+ case 5: a = -1; b = 6; break;
+ case 7: break;
+ case 6: break;
+ case 8: a = 17; b = 7; break;
+ case 9: a = 8; b = -1; break;
+ case 10: a = 18; b = 9; break;
+ case 11: a = 10; b = 1; break;
+ case 12: a = 11; b = 13; break;
+ case 13: a = 2; b = 14; break;
+ case 14: a = 15; b = 20; break;
+ case 15: a = 4; b = 16; break;
+ case 16: break;
+ case 17: break;
+ case 18: break;
+ case 19: break;
+ case 20: a = 21; b = 19; break;
+ case 21: break;
+ default: abort(); break;
+ }
+
+ if (a != -1)
+ {
+ glPushMatrix();
+ glTranslatef (-0.5, 0, 0); /* Move model matrix to upper left */
+ glRotatef (60, 0, 0, 1);
+ glTranslatef ( 0.5, 0, 0);
+
+ glMatrixMode(GL_TEXTURE);
+ /* glPushMatrix(); */
+ glTranslatef (-0.5, 0, 0); /* Move texture matrix the same way */
+ glRotatef (60, 0, 0, 1);
+ glTranslatef ( 0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (rot, 1, 0, 0);
+ triangle (mi, a, frontp, fold_ratio, stel_ratio);
+
+ /* This should just be a PopMatrix on the TEXTURE stack, but
+ fucking iOS has GL_MAX_TEXTURE_STACK_DEPTH == 4! WTF!
+ So we have to undo our rotations and translations manually.
+ */
+ glMatrixMode(GL_TEXTURE);
+ /* glPopMatrix(); */
+ glTranslatef (-0.5, 0, 0);
+ glRotatef (-60, 0, 0, 1);
+ glTranslatef (0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ }
+
+ if (b != -1)
+ {
+ glPushMatrix();
+ glTranslatef (0.5, 0, 0); /* Move model matrix to upper right */
+ glRotatef (-60, 0, 0, 1);
+ glTranslatef (-0.5, 0, 0);
+
+ glMatrixMode(GL_TEXTURE);
+ /* glPushMatrix(); */
+ glTranslatef (0.5, 0, 0); /* Move texture matrix the same way */
+ glRotatef (-60, 0, 0, 1);
+ glTranslatef (-0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (rot, 1, 0, 0);
+ triangle (mi, b, frontp, fold_ratio, stel_ratio);
+
+ /* See above. Grr. */
+ glMatrixMode(GL_TEXTURE);
+ /* glPopMatrix(); */
+ glTranslatef (0.5, 0, 0);
+ glRotatef (60, 0, 0, 1);
+ glTranslatef (-0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ }
+
+
+ /* Draw a border around the edge of the world.
+ */
+ if (!wire && frontp && stel_ratio == 0 && fold_ratio < 0.95)
+ {
+ int edges = 0;
+ GLfloat c[] = { 0, 0.2, 0.5, 1 };
+ c[3] = 1-fold_ratio;
+
+ switch (which)
+ {
+ case 0: edges = 1<<0 | 1<<2; break;
+ case 1: edges = 1<<2; break;
+ case 2: edges = 1<<0; break;
+ case 3: edges = 1<<3 | 1<<4; break;
+ case 4: edges = 1<<3 | 1<<5; break;
+ case 5: edges = 1<<0 | 1<<6; break;
+ case 6: edges = 1<<2 | 1<<7; break;
+ case 16: edges = 1<<0 | 1<<2; break;
+ case 21: edges = 1<<0 | 1<<2; break;
+ case 19: edges = 1<<0 | 1<<2; break;
+ case 12: edges = 1<<1; break;
+ case 18: edges = 1<<0 | 1<<2; break;
+ case 17: edges = 1<<0 | 1<<2; break;
+ case 7: edges = 1<<8 | 1<<9; break;
+ case 9: edges = 1<<2; break;
+ default: break;
+ }
+
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glLineWidth (2);
+ glColor4fv (c);
+ glBegin (GL_LINES);
+ if (edges & 1<<0)
+ {
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ }
+ if (edges & 1<<1)
+ {
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ }
+ if (edges & 1<<2)
+ {
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ }
+ if (edges & 1<<3)
+ {
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ glVertex3f (corners[3].x, corners[3].y, corners[3].z);
+ }
+ if (edges & 1<<4)
+ {
+ glVertex3f (corners[3].x, corners[3].y, corners[3].z);
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ }
+ if (edges & 1<<5)
+ {
+ glVertex3f (corners[3].x, corners[3].y, corners[3].z);
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ }
+ if (edges & 1<<6)
+ {
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ glVertex3f (corners[5].x, corners[5].y, corners[5].z);
+ }
+ if (edges & 1<<7)
+ {
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ glVertex3f (corners[6].x, corners[6].y, corners[6].z);
+ }
+ if (edges & 1<<8)
+ {
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ glVertex3f (corners[5].x, corners[5].y, corners[5].z);
+ }
+ if (edges & 1<<9)
+ {
+ glVertex3f (corners[5].x, corners[5].y, corners[5].z);
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ }
+ glEnd();
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_LIGHTING);
+ }
+}
+
+
+static void
+draw_triangles (ModeInfo *mi, GLfloat fold_ratio, GLfloat stel_ratio)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat h = sqrt(3) / 2;
+ GLfloat c = h / 3;
+
+ glTranslatef (0, -h/3, 0); /* Center on face 12 */
+
+ /* When closed, center on midpoint of icosahedron. Eyeballed this. */
+ glTranslatef (0, 0, fold_ratio * 0.754);
+
+ glFrontFace (GL_CCW);
+
+ /* Adjust the texture matrix so that it has the same coordinate space
+ as the model. */
+
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ {
+ GLfloat texw = 5.5;
+ GLfloat texh = 3 * h;
+ GLfloat midx = 2.5;
+ GLfloat midy = 3 * c;
+ glScalef (1/texw, -1/texh, 1);
+ glTranslatef (midx, midy, 0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+
+
+
+ /* Front faces */
+
+ if (wire)
+ glDisable (GL_TEXTURE_2D);
+ else if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+ }
+ else
+ glDisable (GL_TEXTURE_2D);
+
+ triangle (mi, 12, True, fold_ratio, stel_ratio);
+
+ /* Back faces */
+
+ if (wire)
+ glDisable (GL_TEXTURE_2D);
+ else if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+ }
+ else
+ glDisable (GL_TEXTURE_2D);
+
+ glFrontFace (GL_CW);
+
+ triangle (mi, 12, False, fold_ratio, 0);
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+static void
+align_axis (ModeInfo *mi, int undo)
+{
+ /* Rotate so that an axis is lined up with the north and south poles
+ on the map, which are not in the center of their faces, or any
+ other easily computable spot. */
+
+ GLfloat r1 = 20.5;
+ GLfloat r2 = 28.5;
+
+ if (undo)
+ {
+ glRotatef (-r2, 0, 1, 0);
+ glRotatef ( r2, 1, 0, 0);
+ glRotatef (-r1, 1, 0, 0);
+ }
+ else
+ {
+ glRotatef (r1, 1, 0, 0);
+ glRotatef (-r2, 1, 0, 0);
+ glRotatef ( r2, 0, 1, 0);
+ }
+}
+
+
+static void
+draw_axis (ModeInfo *mi)
+{
+ GLfloat s;
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glPushMatrix();
+
+ align_axis (mi, 0);
+ glTranslatef (0.34, 0.39, -0.61);
+
+ s = 0.96;
+ glScalef (s, s, s); /* tighten up the enclosing sphere */
+
+ glLineWidth (1);
+ glColor3f (0.5, 0.5, 0);
+
+ glRotatef (90, 1, 0, 0); /* unit_sphere is off by 90 */
+ glRotatef (9.5, 0, 1, 0); /* line up the time zones */
+ glFrontFace (GL_CCW);
+ unit_sphere (12, 24, True);
+ glBegin(GL_LINES);
+ glVertex3f(0, -2, 0);
+ glVertex3f(0, 2, 0);
+ glEnd();
+
+ glPopMatrix();
+}
+
+
+
+
+ENTRYPOINT Bool
+planet_handle_event (ModeInfo *mi, XEvent *event)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+ {
+ int i;
+ double cf = gp->current_frame;
+
+ /* Switch between the satellite and flat map, preserving position. */
+ if (gp->day) XDestroyImage (gp->day);
+ if (gp->night) XDestroyImage (gp->night);
+ if (gp->cvt) XDestroyImage (gp->cvt);
+ gp->day = 0;
+ gp->night = 0;
+ gp->cvt = 0;
+
+ for (i = 0; i < gp->nimages; i++)
+ if (gp->images[i]) XDestroyImage (gp->images[i]);
+ free (gp->images);
+ gp->images = 0;
+
+ which_image = strdup (!strcmp (which_image, "BUILTIN_DAY")
+ ? "BUILTIN_FLAT" : "BUILTIN_DAY");
+ which_image2 = strdup (!strcmp (which_image2, "BUILTIN_NIGHT")
+ ? "BUILTIN_FLAT" : "BUILTIN_NIGHT");
+ load_images (mi);
+ gp->current_frame = cf;
+# if 0
+ switch (gp->state) {
+ case FLAT: case ICO: case STEL: case AXIS: case ICO2:
+ gp->ratio = 1;
+ break;
+ default:
+ break;
+ }
+# endif
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_planet (ModeInfo * mi)
+{
+ planetstruct *gp;
+ int screen = MI_SCREEN(mi);
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, planets);
+ gp = &planets[screen];
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ gp->state = STARTUP;
+ gp->ratio = 0;
+ gp->font_data = load_texture_font (mi->dpy, "labelFont");
+ gp->delay = MI_DELAY(mi);
+
+ {
+ double spin_speed = 0.1;
+ double wander_speed = 0.002;
+ gp->rot = make_rotator (do_roll ? spin_speed : 0,
+ do_roll ? spin_speed : 0,
+ 0, 1,
+ do_wander ? wander_speed : 0,
+ False);
+ gp->rot2 = make_rotator (0, 0, 0, 0, wander_speed, False);
+ gp->trackball = gltrackball_init (True);
+ }
+
+ if (wire)
+ do_texture = False;
+
+ if (do_texture)
+ setup_texture (mi);
+
+ if (do_stars)
+ init_stars (mi);
+
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_NORMALIZE);
+ glEnable (GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1, 1, 1, 0};
+ GLfloat amb[4] = {0, 0, 0, 1};
+ GLfloat dif[4] = {1, 1, 1, 1};
+ GLfloat spc[4] = {0, 1, 1, 1};
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.35;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+ENTRYPOINT void
+draw_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ long delay = gp->delay;
+ double x, y, z;
+
+ if (!gp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glXMakeCurrent (dpy, window, *(gp->glx_context));
+
+ mi->polygon_count = 0;
+
+ if (! gp->button_down_p)
+ switch (gp->state) {
+ case STARTUP: gp->ratio += speed * 0.01; break;
+ case FLAT: gp->ratio += speed * 0.005 *
+ /* Stay flat longer if animating day and night. */
+ (gp->nimages <= 1 ? 1 : 0.3);
+ break;
+ case FOLD: gp->ratio += speed * 0.01; break;
+ case ICO: gp->ratio += speed * 0.01; break;
+ case STEL_IN: gp->ratio += speed * 0.05; break;
+ case STEL: gp->ratio += speed * 0.01; break;
+ case STEL_OUT: gp->ratio += speed * 0.07; break;
+ case ICO2: gp->ratio += speed * 0.07; break;
+ case AXIS: gp->ratio += speed * 0.02; break;
+ case SPIN: gp->ratio += speed * 0.005; break;
+ case UNFOLD: gp->ratio += speed * 0.01; break;
+ default: abort();
+ }
+
+ if (gp->ratio > 1.0)
+ {
+ gp->ratio = 0;
+ switch (gp->state) {
+ case STARTUP: gp->state = FLAT; break;
+ case FLAT: gp->state = FOLD; break;
+ case FOLD: gp->state = ICO; break;
+ case ICO: gp->state = STEL_IN; break;
+ case STEL_IN: gp->state = STEL; break;
+ case STEL:
+ {
+ int i = (random() << 9) % 7;
+ gp->state = (i < 3 ? STEL_OUT :
+ i < 6 ? SPIN : AXIS);
+ }
+ break;
+ case AXIS: gp->state = STEL_OUT; break;
+ case SPIN: gp->state = STEL_OUT; break;
+ case STEL_OUT: gp->state = ICO2; break;
+ case ICO2: gp->state = UNFOLD; break;
+ case UNFOLD: gp->state = FLAT; break;
+ default: abort();
+ }
+ }
+
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_POINT_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ glPushMatrix();
+
+ gltrackball_rotate (gp->trackball);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+
+# ifdef HAVE_MOBILE /* Fill more of the screen. */
+ {
+ int size = MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? MI_WIDTH(mi) : MI_HEIGHT(mi);
+ GLfloat s = (size > 768 ? 1.4 : /* iPad */
+ 2); /* iPhone */
+ glScalef (s, s, s);
+ if (MI_WIDTH(mi) < MI_HEIGHT(mi))
+ glRotatef (90, 0, 0, 1);
+ }
+# endif
+
+ if (gp->state != STARTUP)
+ {
+ get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
+ x = (x - 0.5) * 3;
+ y = (y - 0.5) * 3;
+ z = 0;
+ glTranslatef(x, y, z);
+ }
+
+ if (do_roll && gp->state != STARTUP)
+ {
+ double max = 65;
+ get_position (gp->rot2, &x, &y, 0, !gp->button_down_p);
+ glRotatef (max/2 - x*max, 1, 0, 0);
+ glRotatef (max/2 - y*max, 0, 1, 0);
+ }
+
+ if (do_stars)
+ {
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_LIGHTING);
+ glPushMatrix();
+ glScalef (60, 60, 60);
+ glRotatef (90, 1, 0, 0);
+ glRotatef (35, 1, 0, 0);
+ glCallList (gp->starlist);
+ mi->polygon_count += gp->starcount;
+ glPopMatrix();
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+
+ if (! wire)
+ {
+ glEnable (GL_LIGHTING);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ if (do_texture)
+ glEnable(GL_TEXTURE_2D);
+
+ if (do_texture /* && !gp->button_down_p */)
+ {
+ int i;
+ int prev = gp->current_frame;
+
+ /* By default, advance terminator by about an hour every 5 seconds. */
+ gp->current_frame += 0.1 * speed * (gp->nimages / 360.0);
+ while (gp->current_frame >= gp->nimages)
+ gp->current_frame -= gp->nimages;
+ i = gp->current_frame;
+
+ /* Load the current image into the texture.
+ */
+ if (i != prev || !gp->images[i])
+ {
+ double start = double_time();
+ cache_current_frame (mi);
+
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ gp->images[i]->width,
+ gp->images[i]->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ gp->images[i]->data);
+ check_gl_error ("texture");
+
+ /* If caching the image took a bunch of time, deduct that from
+ our per-frame delay to keep the timing a little smoother. */
+ delay -= 1000000 * (double_time() - start);
+ if (delay < 0) delay = 0;
+ }
+ }
+
+ glTranslatef (-0.5, -0.4, 0);
+ glScalef (2.6, 2.6, 2.6);
+
+ {
+ GLfloat fold_ratio = 0;
+ GLfloat stel_ratio = 0;
+ switch (gp->state) {
+ case FOLD: fold_ratio = gp->ratio; break;
+ case UNFOLD: fold_ratio = 1 - gp->ratio; break;
+ case ICO: case ICO2: fold_ratio = 1; break;
+ case STEL: case AXIS: case SPIN: fold_ratio = 1; stel_ratio = 1; break;
+ case STEL_IN: fold_ratio = 1; stel_ratio = gp->ratio; break;
+ case STEL_OUT: fold_ratio = 1; stel_ratio = 1 - gp->ratio; break;
+ case STARTUP: /* Tilt in from flat */
+ glRotatef (-90 * ease_ratio (1 - gp->ratio), 1, 0, 0);
+ break;
+
+ default: break;
+ }
+
+# ifdef HAVE_MOBILE /* Enlarge the icosahedron a bit to make it more visible */
+ {
+ GLfloat s = 1 + 1.3 * ease_ratio (fold_ratio);
+ glScalef (s, s, s);
+ }
+# endif
+
+ if (gp->state == SPIN)
+ {
+ align_axis (mi, 0);
+ glRotatef (ease_ratio (gp->ratio) * 360 * 3, 0, 0, 1);
+ align_axis (mi, 1);
+ }
+
+ draw_triangles (mi, ease_ratio (fold_ratio), ease_ratio (stel_ratio));
+
+ if (gp->state == AXIS)
+ draw_axis(mi);
+ }
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+
+ MI_DELAY(mi) = delay;
+}
+
+
+ENTRYPOINT void
+free_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i;
+
+ if (gp->day) XDestroyImage (gp->day);
+ if (gp->night) XDestroyImage (gp->night);
+ if (gp->dusk) XDestroyImage (gp->dusk);
+ if (gp->cvt) XDestroyImage (gp->cvt);
+
+ for (i = 0; i < gp->nimages; i++)
+ if (gp->images[i]) XDestroyImage (gp->images[i]);
+ free (gp->images);
+
+ if (gp->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(gp->glx_context));
+
+ if (glIsList(gp->starlist))
+ glDeleteLists(gp->starlist, 1);
+ }
+}
+
+
+XSCREENSAVER_MODULE_2 ("DymaxionMap", dymaxionmap, planet)
+
+#endif
diff --git a/hacks/glx/dymaxionmap.man b/hacks/glx/dymaxionmap.man
new file mode 100644
index 0000000..9f3e794
--- /dev/null
+++ b/hacks/glx/dymaxionmap.man
@@ -0,0 +1,117 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+dymaxionmap - An animation of Buckminster Fuller's unwrapped icosahedral globe.
+.SH SYNOPSIS
+.B dymaxionmap
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-no-wander]
+[\-no-roll]
+[\-no-stars]
+[\-no-grid]
+[\-flat]
+[\-satellite]
+[\-image \fIfile\fP]
+[\-image2 \fIfile\fP]
+[\-frames \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Buckminster Fuller's map of the Earth projected onto the surface of an
+unfolded icosahedron. It depicts the Earth's continents as one island, or
+nearly contiguous land masses.
+
+This screen saver animates the progression of the dusk terminator across
+the flattened globe. It includes both satellite and flat-colored map
+imagery, and can load and convert other Equirectangular-projected maps.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fIratio\fP
+Speed of the animation. 0.5 means half as fast, 2 means twice as fast.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen. Default yes.
+.TP 8
+.B \-roll | \-no-roll
+Whether the object should roll randomly. Default yes.
+.TP 8
+.B \-stars | \-no-stars
+Whether to display a star field. Default yes.
+.TP 8
+.B \-grid | \-no-grid
+Whether to overlay a latitude/longitude grid over the map. Default yes.
+.TP 8
+.B \-flat
+Display a flat-colored map of the Earth. This is the default.
+.TP 8
+.B \-satellite
+Display a day-time satellite map of the Earth.
+.TP 8
+.B \-image \fIfile\fP
+An image to use for the day-time map.
+.TP 8
+.B \-image2 \fIfile\fP
+An image to use for the night-time map.
+The two images can be the same: the night-time one will be darkened.
+.TP 8
+.B \-frames \fInumber\fP
+The number of frames in the day/night animation. Default 720.
+Larger numbers are smoother, but use more memory.
+The day/night animation happens if \fIimage2\fP is set, or
+if \fIframes\fP is greater than 1.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR glplanet (1)
+.SH COPYRIGHT
+Copyright \(co 2016-2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+
+"Dymaxion Map" and "The Fuller Projection Map" are trademarks of
+The Buckminster Fuller Institute.
+
+The original Dymaxion Map image is copyright \(co 1982 by
+The Buckminster Fuller Institute. (This program does not use their
+imagery, only similar trigonometry.)
+
+The Dymaxion Map was covered by now-expired US Patent 2,393,676
+(Richard Buckminster Fuller, 1946).
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/e_textures.h b/hacks/glx/e_textures.h
new file mode 100644
index 0000000..7f9457e
--- /dev/null
+++ b/hacks/glx/e_textures.h
@@ -0,0 +1,1478 @@
+static unsigned char WoodTextureWidth = 199;
+static unsigned char WoodTextureHeight = 37;
+static unsigned char WoodTextureData[] =
+{
+ 84, 30, 12, 84, 26, 12, 108, 42, 28, 100, 38, 28, 108, 42, 28,
+ 108, 46, 28, 100, 38, 28, 108, 46, 28, 108, 42, 28, 108, 42, 20,
+ 108, 42, 28, 108, 38, 20, 108, 42, 20, 108, 42, 28, 116, 42, 28,
+ 108, 42, 20, 108, 46, 28, 100, 34, 12, 108, 42, 20, 108, 42, 20,
+ 108, 42, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20, 108, 42, 20,
+ 108, 42, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
+ 108, 42, 20, 108, 42, 20, 108, 42, 28, 108, 42, 20, 108, 42, 20,
+ 100, 38, 20, 100, 38, 20, 100, 38, 20, 108, 38, 20, 116, 50, 28,
+ 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 108, 42, 20,
+ 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
+ 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20,
+ 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 42, 20, 108, 42, 20,
+ 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 100, 38, 20,
+ 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
+ 108, 42, 20, 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
+ 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
+ 100, 38, 20, 100, 34, 12, 100, 34, 12, 100, 38, 20, 108, 38, 20,
+ 100, 38, 20, 108, 38, 20, 108, 42, 20, 100, 38, 20, 108, 42, 20,
+ 108, 42, 28, 108, 46, 20, 108, 38, 20, 108, 42, 20, 108, 46, 28,
+ 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
+ 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20,
+ 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 54, 36, 116, 54, 36,
+ 116, 54, 28, 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 42, 20,
+ 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+ 116, 46, 28, 108, 42, 28, 116, 50, 36, 116, 50, 36, 100, 38, 20,
+ 108, 42, 28, 108, 38, 20, 100, 38, 20, 108, 38, 20, 108, 42, 28,
+ 108, 46, 28, 116, 46, 28, 108, 42, 28, 108, 42, 28, 108, 42, 20,
+ 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+ 108, 42, 28, 108, 42, 20, 100, 38, 20, 116, 50, 28, 108, 46, 28,
+ 108, 42, 20, 108, 42, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+ 108, 46, 28, 108, 46, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+ 116, 50, 28, 108, 46, 28, 108, 46, 28, 108, 42, 20, 116, 46, 28,
+ 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 46, 28, 116, 50, 28,
+ 116, 50, 28, 116, 50, 36, 124, 54, 36, 116, 54, 36, 116, 54, 28,
+ 116, 50, 28, 116, 50, 28, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+ 116, 50, 28, 116, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+ 116, 50, 28, 108, 46, 28, 108, 46, 20, 124, 50, 36, 116, 54, 28,
+ 124, 54, 28, 116, 54, 28, 116, 54, 28, 116, 54, 28, 124, 54, 36,
+ 124, 58, 36, 124, 50, 36, 116, 46, 28, 116, 46, 28, 116, 42, 28,
+ 116, 50, 36, 124, 66, 44, 108, 58, 36, 84, 30, 12, 100, 42, 20,
+ 116, 54, 36, 140, 82, 68, 148, 86, 68, 148, 86, 68, 156, 90, 76,
+ 148, 86, 68, 156, 86, 76, 156, 86, 68, 148, 86, 68, 156, 86, 68,
+ 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
+ 164, 98, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 84,
+ 164, 98, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76,
+ 164, 94, 68, 164, 94, 68, 164, 98, 76, 172, 106, 84, 164, 98, 76,
+ 164, 98, 76, 164, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 68, 164, 98, 76, 164, 98, 76, 164, 102, 76,
+ 164, 94, 76, 156, 94, 68, 172, 102, 84, 172, 106, 84, 172, 102, 84,
+ 164, 98, 76, 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
+ 164, 94, 76, 156, 94, 68, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 102, 76,
+ 172, 106, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 172, 102, 84,
+ 172, 106, 84, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 110, 84,
+ 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 114, 92,
+ 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 122, 108, 188, 126, 108,
+ 188, 118, 100, 196, 130, 108, 204, 134, 116, 188, 126, 108, 196, 122, 108,
+ 180, 118, 100, 180, 110, 92, 180, 114, 100, 180, 118, 100, 188, 118, 100,
+ 188, 122, 108, 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 118, 100,
+ 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 180, 114, 92, 172, 106, 92, 172, 102, 84,
+ 172, 106, 84, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 106, 84,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+ 164, 102, 84, 164, 102, 76, 172, 106, 84, 172, 110, 92, 180, 110, 92,
+ 172, 110, 84, 172, 114, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
+ 172, 106, 92, 172, 106, 84, 172, 106, 84, 164, 102, 84, 180, 114, 100,
+ 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92,
+ 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 172, 110, 92, 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+ 196, 126, 100, 196, 122, 108, 196, 126, 108, 196, 130, 116, 196, 134, 116,
+ 204, 142, 124, 164, 106, 84, 100, 42, 20, 84, 26, 4, 132, 78, 68,
+ 188, 122, 108, 188, 122, 108, 188, 126, 116, 196, 134, 116, 188, 122, 108,
+ 188, 126, 108, 188, 126, 108, 188, 122, 108, 196, 126, 108, 196, 130, 108,
+ 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 126, 108, 188, 126, 108,
+ 196, 130, 108, 196, 130, 108, 196, 134, 116, 196, 130, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 188, 126, 108,
+ 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 196, 130, 108,
+ 196, 134, 116, 204, 142, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 100, 196, 134, 108, 196, 130, 108, 188, 126, 100,
+ 188, 122, 100, 188, 126, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100,
+ 188, 126, 100, 196, 130, 108, 204, 134, 108, 196, 134, 116, 196, 134, 108,
+ 196, 130, 108, 196, 126, 108, 196, 130, 108, 196, 130, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 108, 196, 134, 108, 196, 130, 108, 196, 130, 108,
+ 188, 122, 100, 196, 130, 108, 196, 130, 108, 196, 134, 108, 196, 130, 108,
+ 188, 126, 100, 196, 130, 108, 196, 134, 108, 204, 134, 116, 204, 138, 116,
+ 204, 138, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108, 196, 134, 108,
+ 204, 134, 116, 196, 134, 116, 196, 134, 108, 196, 130, 108, 196, 130, 108,
+ 204, 134, 116, 204, 138, 116, 204, 138, 116, 196, 130, 108, 196, 130, 108,
+ 188, 122, 100, 180, 118, 92, 188, 118, 100, 196, 130, 108, 196, 130, 108,
+ 188, 126, 100, 188, 122, 100, 188, 122, 100, 204, 134, 108, 196, 134, 116,
+ 204, 134, 116, 196, 134, 108, 196, 130, 108, 204, 134, 108, 204, 138, 116,
+ 204, 138, 116, 212, 142, 124, 204, 142, 116, 204, 134, 116, 204, 138, 116,
+ 204, 138, 116, 204, 138, 116, 204, 134, 108, 188, 126, 108, 196, 130, 108,
+ 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 138, 116, 212, 146, 124,
+ 204, 142, 116, 204, 138, 116, 212, 146, 124, 212, 142, 124, 204, 138, 124,
+ 204, 138, 124, 204, 138, 124, 204, 138, 116, 212, 142, 124, 204, 138, 124,
+ 196, 130, 116, 204, 134, 116, 204, 138, 116, 204, 138, 124, 204, 138, 116,
+ 204, 138, 124, 204, 134, 116, 204, 138, 124, 212, 142, 124, 204, 138, 116,
+ 196, 134, 116, 196, 130, 108, 196, 134, 116, 204, 138, 116, 204, 142, 124,
+ 212, 142, 124, 204, 138, 116, 204, 138, 116, 204, 138, 116, 204, 138, 116,
+ 204, 138, 124, 204, 142, 124, 204, 142, 116, 204, 138, 124, 196, 134, 108,
+ 196, 134, 116, 196, 134, 116, 196, 130, 116, 196, 130, 108, 188, 126, 108,
+ 196, 126, 108, 188, 130, 108, 188, 126, 108, 188, 122, 100, 180, 118, 100,
+ 188, 118, 100, 188, 126, 108, 196, 130, 108, 196, 126, 108, 188, 126, 108,
+ 188, 122, 100, 188, 122, 108, 188, 126, 108, 196, 126, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 134, 108, 196, 134, 116,
+ 196, 134, 108, 196, 130, 108, 196, 126, 108, 188, 122, 108, 188, 122, 100,
+ 188, 122, 100, 196, 130, 108, 196, 130, 100, 196, 130, 108, 196, 130, 100,
+ 188, 130, 108, 196, 130, 108, 196, 134, 108, 204, 138, 116, 204, 130, 108,
+ 204, 134, 116, 204, 134, 116, 204, 134, 116, 204, 138, 124, 204, 146, 124,
+ 156, 102, 84, 84, 26, 4, 84, 26, 4, 116, 58, 36, 164, 106, 92,
+ 164, 102, 84, 164, 106, 92, 172, 110, 92, 156, 98, 84, 172, 102, 84,
+ 172, 102, 84, 180, 110, 92, 180, 118, 100, 180, 118, 100, 180, 110, 92,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 92, 172, 110, 92,
+ 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 76,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 106, 84,
+ 172, 110, 84, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84,
+ 172, 102, 76, 172, 102, 84, 172, 102, 84, 164, 102, 76, 164, 94, 76,
+ 172, 102, 84, 172, 110, 92, 172, 110, 84, 172, 102, 84, 164, 98, 76,
+ 172, 102, 76, 172, 106, 84, 172, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 180, 110, 92, 172, 110, 84, 180, 118, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 180, 118, 92,
+ 188, 122, 100, 188, 118, 100, 180, 114, 92, 180, 118, 92, 180, 114, 92,
+ 180, 118, 92, 188, 118, 100, 180, 118, 92, 180, 114, 92, 180, 118, 92,
+ 180, 110, 84, 180, 110, 92, 180, 118, 92, 188, 122, 100, 188, 114, 100,
+ 180, 114, 92, 180, 114, 92, 196, 126, 108, 188, 126, 100, 188, 122, 100,
+ 188, 118, 100, 180, 118, 100, 180, 114, 92, 188, 118, 100, 188, 122, 100,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 188, 122, 100,
+ 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 110, 84, 172, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
+ 188, 122, 100, 180, 106, 92, 172, 110, 92, 172, 102, 84, 172, 102, 84,
+ 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84,
+ 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 92, 172, 110, 84, 164, 102, 84, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+ 180, 118, 100, 188, 122, 100, 180, 122, 108, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 126, 108,
+ 188, 122, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
+ 180, 118, 100, 180, 110, 92, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+ 180, 118, 92, 180, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 84,
+ 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
+ 180, 114, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+ 180, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 92,
+ 180, 118, 92, 188, 118, 100, 188, 122, 100, 180, 114, 100, 180, 110, 92,
+ 188, 114, 100, 180, 110, 92, 172, 110, 92, 180, 126, 108, 148, 98, 76,
+ 84, 26, 4, 84, 26, 12, 108, 50, 36, 164, 102, 84, 164, 98, 84,
+ 156, 94, 76, 164, 98, 84, 148, 86, 68, 156, 90, 76, 156, 94, 84,
+ 164, 90, 76, 164, 98, 84, 172, 102, 84, 164, 94, 76, 156, 90, 68,
+ 164, 94, 76, 164, 98, 84, 164, 94, 76, 164, 98, 76, 164, 98, 84,
+ 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 164, 102, 84, 164, 94, 68, 164, 94, 76, 156, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 98, 76,
+ 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84,
+ 172, 110, 84, 172, 106, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 106, 84,
+ 180, 114, 92, 172, 106, 84, 164, 102, 76, 164, 98, 76, 172, 106, 84,
+ 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
+ 180, 114, 92, 188, 118, 100, 180, 114, 92, 172, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 172, 110, 92, 172, 106, 84, 164, 102, 76,
+ 172, 102, 76, 164, 102, 84, 180, 110, 84, 180, 118, 92, 188, 118, 100,
+ 188, 122, 100, 180, 118, 92, 180, 110, 92, 180, 110, 84, 172, 106, 92,
+ 180, 114, 84, 180, 114, 100, 188, 122, 100, 188, 122, 100, 180, 114, 92,
+ 172, 110, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92,
+ 180, 118, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 102, 76,
+ 164, 102, 76, 172, 102, 84, 172, 110, 84, 180, 114, 92, 172, 110, 84,
+ 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 118, 100, 188, 118, 92,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 188, 118, 92,
+ 180, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+ 180, 114, 92, 188, 122, 100, 188, 126, 108, 188, 118, 100, 172, 110, 92,
+ 172, 102, 84, 172, 106, 84, 180, 106, 92, 164, 98, 76, 172, 102, 84,
+ 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 172, 102, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+ 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 122, 100,
+ 188, 122, 108, 196, 126, 108, 180, 118, 92, 188, 118, 100, 180, 118, 100,
+ 180, 118, 100, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 118, 100,
+ 180, 110, 92, 172, 110, 84, 172, 106, 92, 172, 110, 92, 188, 118, 100,
+ 180, 118, 100, 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 114, 92,
+ 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
+ 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 110, 92,
+ 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 172, 106, 84,
+ 180, 110, 84, 180, 118, 92, 188, 122, 100, 180, 118, 100, 180, 118, 92,
+ 180, 118, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92, 188, 118, 108,
+ 188, 118, 100, 188, 122, 100, 188, 130, 108, 156, 102, 84, 84, 26, 12,
+ 84, 30, 12, 108, 46, 28, 140, 82, 68, 156, 90, 76, 156, 94, 84,
+ 156, 94, 84, 156, 94, 76, 164, 94, 76, 156, 90, 76, 164, 94, 76,
+ 156, 94, 76, 156, 90, 68, 156, 90, 68, 164, 90, 76, 156, 90, 68,
+ 148, 82, 60, 148, 78, 60, 164, 98, 76, 164, 94, 76, 156, 90, 68,
+ 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 76,
+ 164, 94, 68, 156, 94, 76, 156, 94, 68, 156, 90, 68, 156, 90, 68,
+ 172, 102, 76, 180, 114, 92, 188, 118, 92, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 164, 98, 76, 164, 94, 68, 164, 98, 76, 172, 102, 84,
+ 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 180, 110, 92,
+ 172, 110, 84, 172, 98, 76, 164, 98, 76, 172, 106, 84, 180, 118, 92,
+ 180, 106, 84, 180, 106, 84, 172, 106, 84, 172, 110, 84, 180, 110, 92,
+ 180, 110, 84, 172, 102, 76, 164, 98, 76, 164, 94, 68, 172, 106, 84,
+ 180, 114, 92, 172, 106, 84, 164, 98, 76, 172, 98, 76, 172, 106, 84,
+ 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 188, 118, 92,
+ 188, 114, 92, 172, 106, 84, 172, 102, 76, 172, 106, 84, 188, 118, 92,
+ 188, 122, 100, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
+ 180, 114, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
+ 180, 106, 84, 180, 114, 84, 172, 102, 76, 164, 94, 76, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 172, 106, 84, 188, 122, 100, 188, 118, 92,
+ 180, 118, 92, 188, 118, 100, 196, 122, 100, 188, 122, 100, 180, 118, 92,
+ 180, 110, 84, 188, 114, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92,
+ 188, 114, 92, 180, 114, 92, 180, 114, 84, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 110, 92,
+ 188, 118, 100, 180, 118, 92, 180, 110, 92, 180, 114, 100, 180, 118, 100,
+ 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 102, 84,
+ 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 118, 92, 180, 118, 100,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100, 180, 118, 92,
+ 180, 118, 100, 188, 122, 108, 188, 122, 100, 188, 118, 100, 180, 114, 92,
+ 180, 114, 92, 172, 110, 92, 172, 110, 92, 172, 106, 84, 188, 122, 100,
+ 180, 114, 100, 172, 106, 84, 172, 110, 84, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
+ 164, 106, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 172, 110, 92,
+ 180, 110, 84, 172, 110, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 100, 188, 118, 92,
+ 188, 118, 100, 180, 110, 92, 180, 110, 92, 188, 118, 100, 188, 118, 100,
+ 180, 118, 100, 180, 122, 108, 148, 90, 68, 84, 30, 12, 92, 34, 12,
+ 116, 58, 44, 156, 90, 76, 156, 94, 76, 156, 94, 76, 156, 90, 76,
+ 148, 86, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68, 148, 78, 60,
+ 140, 74, 52, 148, 82, 68, 148, 82, 60, 148, 86, 68, 156, 90, 68,
+ 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 148, 86, 68,
+ 156, 86, 68, 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76,
+ 172, 106, 84, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
+ 172, 102, 84, 164, 94, 68, 164, 94, 76, 172, 102, 76, 180, 110, 84,
+ 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
+ 164, 98, 76, 164, 98, 76, 172, 102, 76, 180, 110, 92, 180, 110, 92,
+ 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84, 180, 110, 92,
+ 172, 102, 84, 164, 98, 76, 156, 94, 68, 172, 106, 84, 188, 114, 92,
+ 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 76,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+ 188, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 172, 106, 84,
+ 180, 114, 92, 172, 106, 84, 164, 94, 68, 172, 106, 84, 180, 114, 92,
+ 188, 118, 92, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 180, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 172, 106, 84,
+ 180, 114, 92, 180, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
+ 172, 102, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84, 164, 102, 84,
+ 172, 102, 84, 164, 94, 76, 156, 90, 68, 164, 94, 76, 180, 106, 92,
+ 172, 102, 84, 164, 98, 84, 180, 110, 84, 180, 110, 92, 164, 98, 84,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76, 164, 102, 84,
+ 164, 102, 84, 172, 102, 84, 164, 106, 84, 172, 106, 92, 172, 106, 92,
+ 172, 110, 92, 180, 110, 84, 180, 118, 100, 188, 118, 100, 180, 118, 100,
+ 180, 114, 92, 172, 114, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 118, 100, 180, 118, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 172, 114, 92, 188, 118, 100, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+ 164, 102, 84, 172, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
+ 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 92,
+ 188, 122, 92, 180, 122, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
+ 196, 122, 100, 188, 118, 100, 196, 122, 108, 180, 114, 100, 180, 114, 100,
+ 180, 126, 108, 148, 98, 76, 92, 34, 12, 84, 26, 12, 116, 58, 36,
+ 148, 90, 76, 148, 90, 76, 140, 82, 68, 148, 82, 68, 140, 78, 60,
+ 156, 86, 68, 148, 86, 68, 156, 90, 68, 156, 90, 76, 164, 94, 76,
+ 156, 90, 76, 156, 90, 68, 148, 82, 68, 148, 78, 60, 140, 78, 60,
+ 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 156, 94, 76,
+ 164, 94, 76, 156, 94, 76, 148, 86, 68, 148, 82, 60, 148, 86, 68,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 94, 76,
+ 164, 102, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+ 180, 114, 84, 180, 110, 84, 172, 102, 76, 180, 106, 84, 172, 106, 76,
+ 172, 98, 76, 164, 98, 68, 172, 106, 76, 172, 106, 84, 180, 110, 84,
+ 172, 98, 76, 180, 106, 84, 180, 110, 84, 180, 110, 84, 172, 98, 76,
+ 172, 98, 76, 180, 106, 84, 180, 114, 84, 188, 114, 92, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+ 164, 98, 68, 164, 94, 68, 180, 106, 84, 188, 118, 92, 180, 114, 92,
+ 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 76,
+ 180, 106, 84, 180, 110, 84, 180, 114, 92, 188, 114, 92, 180, 110, 84,
+ 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 180, 114, 84,
+ 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
+ 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 188, 118, 92,
+ 180, 118, 92, 188, 118, 92, 196, 122, 100, 172, 106, 84, 188, 114, 84,
+ 172, 106, 84, 164, 98, 68, 172, 102, 76, 180, 106, 84, 180, 110, 84,
+ 188, 118, 92, 188, 122, 92, 188, 114, 92, 180, 110, 92, 180, 114, 84,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 102, 84, 188, 122, 92,
+ 180, 110, 84, 164, 102, 76, 172, 102, 76, 172, 98, 76, 172, 102, 76,
+ 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84,
+ 172, 102, 76, 164, 90, 76, 172, 98, 76, 180, 110, 92, 172, 102, 76,
+ 172, 102, 84, 180, 106, 84, 180, 110, 84, 172, 102, 84, 172, 98, 76,
+ 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 164, 98, 76,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
+ 172, 106, 92, 172, 106, 84, 164, 106, 84, 172, 106, 84, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 172, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 118, 92, 172, 110, 92, 172, 106, 84,
+ 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84, 164, 94, 76,
+ 164, 98, 76, 172, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 92,
+ 172, 110, 84, 172, 106, 92, 164, 102, 84, 172, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
+ 180, 118, 92, 180, 114, 92, 188, 114, 92, 180, 118, 92, 180, 118, 100,
+ 180, 118, 92, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 110, 92,
+ 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 114, 92,
+ 140, 90, 68, 84, 26, 12, 84, 30, 12, 116, 58, 44, 156, 90, 76,
+ 156, 90, 76, 148, 86, 68, 148, 86, 76, 148, 86, 68, 156, 90, 76,
+ 156, 90, 76, 164, 94, 84, 164, 98, 76, 164, 94, 76, 156, 90, 68,
+ 156, 86, 68, 156, 86, 60, 156, 90, 68, 156, 90, 76, 164, 94, 76,
+ 156, 94, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 156, 94, 68, 148, 78, 60, 148, 86, 68, 156, 90, 68,
+ 156, 90, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 164, 98, 76,
+ 164, 94, 68, 172, 98, 76, 180, 106, 84, 188, 118, 92, 188, 118, 92,
+ 188, 118, 100, 180, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
+ 172, 98, 76, 172, 106, 84, 180, 106, 84, 164, 98, 68, 172, 102, 76,
+ 180, 114, 84, 196, 122, 100, 188, 118, 92, 172, 106, 76, 172, 102, 76,
+ 180, 110, 84, 188, 122, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84,
+ 188, 114, 84, 188, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
+ 164, 94, 68, 180, 110, 84, 188, 118, 92, 188, 118, 92, 188, 114, 92,
+ 180, 114, 92, 188, 114, 84, 180, 114, 92, 180, 106, 84, 180, 110, 84,
+ 180, 114, 84, 188, 114, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84,
+ 180, 106, 84, 180, 114, 84, 188, 114, 92, 188, 114, 92, 180, 114, 92,
+ 188, 118, 92, 196, 122, 100, 188, 122, 92, 180, 114, 92, 188, 114, 92,
+ 180, 110, 84, 180, 114, 84, 188, 118, 92, 188, 122, 92, 188, 118, 92,
+ 188, 118, 92, 188, 122, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
+ 188, 114, 92, 188, 122, 100, 196, 126, 100, 188, 118, 92, 188, 114, 92,
+ 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 180, 114, 84, 196, 126, 100, 188, 114, 92,
+ 180, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 76, 172, 106, 76,
+ 180, 110, 84, 188, 118, 92, 180, 110, 92, 180, 114, 92, 180, 106, 92,
+ 164, 98, 76, 180, 106, 84, 188, 114, 100, 180, 106, 84, 180, 110, 92,
+ 180, 110, 92, 188, 114, 92, 180, 110, 92, 172, 106, 84, 172, 98, 76,
+ 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 102, 84,
+ 172, 106, 84, 172, 110, 92, 180, 118, 92, 180, 114, 100, 180, 118, 100,
+ 188, 122, 108, 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 106, 84,
+ 164, 102, 84, 172, 102, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+ 172, 106, 92, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
+ 172, 106, 84, 180, 114, 92, 172, 106, 84, 164, 102, 84, 172, 110, 84,
+ 172, 106, 84, 164, 98, 76, 172, 102, 84, 164, 106, 84, 172, 106, 84,
+ 172, 106, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92,
+ 180, 106, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92, 180, 106, 84,
+ 188, 114, 100, 188, 118, 100, 180, 114, 100, 180, 126, 108, 148, 90, 68,
+ 84, 30, 12, 92, 34, 12, 124, 66, 44, 156, 98, 84, 164, 102, 84,
+ 164, 98, 84, 164, 98, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
+ 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68,
+ 156, 86, 68, 156, 86, 68, 164, 94, 68, 156, 90, 76, 156, 94, 68,
+ 156, 90, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 102, 84, 148, 82, 60, 148, 86, 68, 156, 90, 68, 156, 90, 68,
+ 148, 86, 68, 148, 82, 60, 156, 86, 68, 156, 94, 68, 156, 86, 68,
+ 164, 98, 68, 180, 110, 84, 188, 118, 92, 196, 122, 92, 196, 122, 100,
+ 188, 118, 92, 188, 118, 92, 180, 110, 92, 172, 106, 76, 172, 106, 76,
+ 180, 106, 84, 180, 106, 84, 172, 102, 76, 180, 110, 84, 188, 118, 92,
+ 196, 126, 100, 188, 118, 100, 180, 110, 84, 172, 106, 84, 188, 114, 84,
+ 188, 122, 100, 196, 122, 100, 188, 118, 92, 180, 114, 84, 180, 114, 92,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 172, 102, 76,
+ 180, 110, 84, 196, 122, 100, 188, 122, 92, 188, 118, 92, 188, 118, 92,
+ 188, 122, 92, 188, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
+ 180, 110, 92, 180, 114, 84, 188, 114, 92, 180, 114, 84, 188, 114, 92,
+ 180, 114, 92, 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84,
+ 188, 118, 92, 188, 114, 92, 180, 114, 84, 188, 118, 92, 180, 114, 92,
+ 188, 114, 92, 188, 122, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92,
+ 196, 122, 100, 180, 114, 92, 188, 118, 92, 180, 110, 84, 180, 110, 84,
+ 196, 130, 100, 204, 134, 108, 196, 126, 100, 188, 118, 100, 188, 122, 92,
+ 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 122, 100, 196, 122, 100,
+ 196, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 110, 84,
+ 180, 110, 92, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 94, 68,
+ 172, 106, 84, 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 110, 84,
+ 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 76, 164, 102, 84, 172, 110, 92,
+ 180, 114, 92, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 126, 108,
+ 188, 122, 100, 180, 118, 100, 172, 110, 92, 164, 106, 84, 172, 102, 84,
+ 172, 106, 84, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 172, 110, 92, 172, 110, 92, 172, 110, 84, 180, 110, 92, 172, 114, 92,
+ 180, 110, 92, 172, 106, 92, 172, 106, 84, 156, 94, 68, 172, 106, 92,
+ 180, 114, 92, 172, 102, 84, 164, 102, 84, 180, 110, 92, 172, 106, 92,
+ 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 106, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 180, 114, 100,
+ 188, 118, 100, 180, 118, 100, 188, 126, 100, 148, 94, 76, 92, 34, 12,
+ 92, 34, 12, 116, 62, 44, 156, 94, 76, 164, 94, 84, 156, 94, 76,
+ 156, 94, 76, 148, 86, 68, 148, 86, 76, 148, 82, 68, 148, 78, 60,
+ 148, 82, 68, 156, 90, 68, 156, 94, 76, 164, 90, 76, 156, 90, 68,
+ 148, 82, 68, 148, 82, 60, 164, 94, 76, 156, 94, 76, 156, 94, 68,
+ 164, 94, 76, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 156, 90, 68, 156, 90, 68, 156, 94, 76, 156, 90, 68, 148, 86, 68,
+ 148, 86, 68, 156, 90, 68, 156, 90, 68, 164, 98, 76, 172, 106, 84,
+ 180, 110, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 110, 84,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 180, 114, 84,
+ 180, 114, 84, 180, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
+ 188, 118, 92, 188, 114, 92, 180, 114, 92, 188, 114, 84, 180, 110, 84,
+ 196, 122, 100, 188, 118, 92, 188, 114, 92, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 106, 84, 188, 114, 92,
+ 196, 122, 100, 188, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 100,
+ 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 92, 188, 114, 92,
+ 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 92, 196, 122, 100,
+ 188, 126, 100, 188, 118, 92, 180, 110, 84, 188, 114, 92, 188, 122, 100,
+ 196, 126, 100, 188, 118, 100, 196, 122, 92, 188, 114, 92, 180, 114, 92,
+ 196, 122, 92, 188, 122, 100, 188, 118, 92, 196, 122, 100, 196, 126, 100,
+ 188, 118, 92, 188, 118, 92, 172, 98, 76, 164, 94, 68, 180, 110, 92,
+ 188, 122, 92, 188, 114, 92, 180, 114, 84, 204, 130, 108, 196, 126, 100,
+ 188, 118, 92, 188, 122, 92, 196, 122, 100, 188, 122, 92, 188, 122, 92,
+ 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
+ 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 106, 84, 180, 110, 92,
+ 180, 106, 84, 172, 102, 76, 172, 98, 76, 164, 94, 76, 180, 106, 84,
+ 180, 110, 92, 180, 106, 84, 172, 102, 76, 172, 98, 84, 172, 102, 76,
+ 180, 110, 84, 180, 110, 84, 180, 106, 84, 180, 110, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 118, 100,
+ 188, 122, 100, 180, 122, 100, 188, 118, 100, 188, 126, 108, 188, 118, 100,
+ 180, 114, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 180, 114, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 164, 102, 84,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84,
+ 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92,
+ 172, 114, 92, 180, 110, 92, 164, 98, 76, 172, 110, 92, 180, 114, 92,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84,
+ 172, 106, 84, 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+ 172, 110, 92, 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 172, 110, 84, 172, 114, 92, 172, 110, 92, 172, 110, 84,
+ 172, 110, 84, 180, 106, 92, 172, 102, 84, 180, 106, 92, 172, 106, 92,
+ 172, 106, 92, 180, 122, 100, 148, 98, 76, 92, 34, 12, 100, 42, 28,
+ 116, 54, 36, 148, 86, 68, 148, 90, 76, 148, 86, 76, 148, 86, 76,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60,
+ 148, 82, 60, 156, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68,
+ 148, 86, 68, 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
+ 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 98, 76, 180, 110, 84, 188, 114, 84, 188, 114, 92,
+ 180, 106, 84, 188, 114, 84, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 114, 92, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84, 196, 122, 100,
+ 188, 118, 92, 180, 114, 84, 188, 114, 92, 188, 122, 92, 196, 122, 100,
+ 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 118, 92, 196, 122, 100,
+ 196, 122, 92, 188, 118, 92, 188, 118, 100, 196, 122, 92, 188, 118, 92,
+ 196, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 92, 196, 122, 100,
+ 188, 122, 92, 196, 122, 100, 196, 122, 100, 196, 122, 100, 196, 122, 92,
+ 188, 114, 92, 180, 110, 84, 188, 114, 84, 188, 118, 92, 196, 122, 92,
+ 188, 118, 92, 188, 122, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+ 196, 122, 92, 188, 118, 92, 188, 118, 92, 196, 126, 100, 204, 130, 108,
+ 204, 134, 108, 188, 122, 92, 180, 106, 84, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 196, 122, 100, 204, 134, 108, 196, 130, 100, 196, 122, 100,
+ 188, 122, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
+ 188, 114, 84, 180, 110, 84, 180, 110, 84, 188, 114, 92, 180, 110, 84,
+ 180, 106, 84, 180, 106, 84, 188, 114, 92, 188, 118, 92, 188, 114, 92,
+ 180, 110, 92, 180, 106, 84, 172, 102, 84, 180, 110, 84, 188, 118, 92,
+ 180, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 92,
+ 188, 114, 92, 180, 110, 92, 180, 110, 84, 188, 114, 92, 188, 114, 100,
+ 180, 114, 92, 172, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 108,
+ 188, 122, 100, 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
+ 180, 110, 92, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
+ 164, 106, 84, 172, 106, 84, 180, 110, 92, 172, 114, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 110, 84,
+ 180, 110, 92, 164, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 106, 84, 180, 114, 92,
+ 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+ 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 114, 92, 180, 114, 92,
+ 188, 118, 100, 188, 114, 92, 196, 122, 108, 188, 118, 100, 180, 118, 100,
+ 188, 130, 108, 156, 106, 84, 100, 42, 28, 84, 30, 12, 116, 54, 36,
+ 156, 90, 76, 156, 90, 76, 156, 90, 68, 156, 94, 76, 148, 86, 68,
+ 164, 94, 84, 156, 94, 76, 156, 90, 76, 148, 86, 68, 148, 78, 60,
+ 148, 78, 60, 148, 86, 68, 164, 94, 76, 164, 94, 76, 172, 98, 84,
+ 164, 98, 76, 164, 102, 76, 172, 106, 84, 180, 110, 92, 180, 118, 100,
+ 180, 118, 100, 180, 110, 92, 172, 110, 92, 164, 98, 76, 164, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 172, 102, 84,
+ 164, 102, 76, 188, 118, 92, 188, 122, 100, 196, 122, 100, 188, 114, 92,
+ 180, 114, 92, 188, 114, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
+ 196, 122, 100, 196, 122, 100, 188, 122, 92, 196, 122, 100, 196, 126, 100,
+ 196, 122, 100, 188, 118, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 196, 122, 100, 196, 126, 100, 196, 122, 100,
+ 188, 118, 92, 188, 114, 84, 188, 122, 92, 196, 122, 100, 188, 122, 92,
+ 188, 118, 92, 196, 122, 100, 196, 122, 92, 188, 118, 92, 196, 122, 100,
+ 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 126, 100, 196, 126, 100,
+ 196, 122, 100, 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 122, 100,
+ 188, 118, 92, 188, 118, 100, 196, 126, 100, 196, 126, 100, 196, 122, 100,
+ 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 122, 100, 196, 122, 92,
+ 188, 114, 92, 188, 114, 92, 188, 122, 92, 188, 114, 92, 204, 130, 108,
+ 196, 126, 100, 188, 118, 92, 188, 118, 92, 188, 118, 92, 196, 122, 100,
+ 196, 126, 100, 204, 130, 108, 196, 126, 100, 196, 122, 100, 188, 118, 92,
+ 196, 122, 100, 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 114, 84,
+ 188, 114, 92, 196, 126, 100, 196, 122, 100, 188, 114, 92, 180, 110, 84,
+ 180, 106, 84, 172, 98, 76, 180, 110, 92, 188, 114, 92, 172, 102, 84,
+ 196, 126, 100, 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 114, 92,
+ 180, 110, 84, 188, 114, 92, 188, 114, 92, 188, 122, 100, 180, 118, 100,
+ 180, 114, 92, 180, 118, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100,
+ 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 110, 92, 180, 114, 100,
+ 180, 118, 100, 188, 118, 100, 172, 114, 92, 172, 106, 84, 172, 110, 92,
+ 172, 106, 92, 172, 102, 84, 164, 102, 84, 172, 102, 76, 172, 106, 84,
+ 172, 106, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+ 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 118, 100, 180, 118, 100,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92, 172, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+ 172, 106, 84, 180, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 118, 92, 180, 118, 92, 180, 114, 92, 180, 118, 92, 188, 114, 100,
+ 180, 110, 92, 188, 122, 108, 188, 122, 100, 180, 118, 108, 188, 126, 108,
+ 148, 90, 76, 84, 30, 12, 92, 38, 28, 140, 78, 60, 156, 90, 68,
+ 156, 90, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
+ 164, 94, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 86, 68,
+ 148, 86, 68, 156, 86, 68, 156, 94, 76, 164, 102, 76, 180, 110, 92,
+ 172, 102, 84, 172, 98, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100,
+ 188, 114, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 90, 68,
+ 156, 86, 68, 164, 94, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
+ 188, 114, 92, 196, 126, 100, 196, 126, 100, 188, 118, 92, 180, 110, 92,
+ 188, 118, 92, 196, 130, 108, 196, 126, 100, 196, 122, 100, 188, 126, 100,
+ 196, 126, 108, 196, 126, 100, 196, 122, 100, 180, 118, 92, 188, 114, 92,
+ 188, 118, 92, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 196, 126, 100, 188, 122, 100, 196, 122, 100,
+ 188, 122, 100, 196, 126, 100, 196, 130, 100, 196, 126, 108, 196, 130, 100,
+ 196, 122, 100, 188, 122, 100, 196, 126, 108, 196, 126, 100, 204, 130, 108,
+ 196, 130, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100, 196, 126, 100,
+ 188, 122, 100, 196, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 100,
+ 196, 130, 100, 196, 130, 108, 196, 130, 100, 196, 126, 100, 196, 126, 100,
+ 204, 130, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100, 196, 122, 100,
+ 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 126, 108, 196, 130, 100,
+ 196, 122, 100, 188, 122, 100, 196, 126, 100, 204, 134, 108, 204, 134, 108,
+ 196, 126, 100, 188, 114, 92, 188, 118, 92, 188, 122, 100, 196, 126, 100,
+ 196, 130, 108, 196, 126, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100,
+ 188, 122, 92, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
+ 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 100, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100,
+ 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 100,
+ 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 102, 84, 172, 106, 84,
+ 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
+ 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
+ 196, 130, 108, 180, 114, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 92, 164, 102, 84, 164, 98, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 106, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84,
+ 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
+ 180, 114, 92, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+ 180, 118, 100, 180, 114, 92, 180, 114, 92, 172, 102, 84, 172, 102, 84,
+ 180, 106, 92, 164, 94, 84, 156, 94, 76, 172, 110, 100, 140, 82, 68,
+ 92, 38, 28, 92, 34, 20, 124, 58, 44, 140, 78, 60, 148, 86, 68,
+ 156, 90, 68, 156, 94, 76, 164, 94, 76, 148, 90, 68, 156, 90, 68,
+ 164, 94, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 148, 86, 60,
+ 148, 86, 68, 156, 90, 68, 164, 94, 76, 164, 98, 76, 156, 94, 76,
+ 156, 94, 76, 172, 98, 84, 180, 110, 92, 180, 118, 100, 188, 114, 100,
+ 180, 114, 92, 172, 102, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76,
+ 156, 90, 68, 164, 94, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
+ 180, 110, 92, 196, 126, 100, 196, 126, 108, 204, 130, 100, 196, 126, 108,
+ 196, 130, 108, 196, 126, 100, 188, 122, 100, 196, 122, 100, 196, 126, 100,
+ 196, 126, 100, 188, 122, 100, 188, 118, 92, 196, 130, 108, 196, 134, 108,
+ 204, 134, 108, 204, 134, 108, 196, 130, 108, 196, 130, 108, 196, 126, 108,
+ 196, 130, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100, 196, 126, 100,
+ 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100,
+ 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
+ 196, 126, 100, 196, 126, 108, 204, 130, 108, 196, 130, 108, 196, 130, 108,
+ 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108, 204, 130, 108,
+ 196, 130, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100, 196, 126, 108,
+ 196, 130, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100, 188, 126, 100,
+ 196, 126, 100, 196, 126, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100,
+ 196, 122, 100, 188, 126, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100,
+ 180, 114, 92, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 122, 100, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100,
+ 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 122, 92, 188, 118, 100,
+ 188, 118, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 180, 118, 92,
+ 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 188, 118, 92, 196, 126, 100, 188, 118, 100,
+ 188, 122, 100, 188, 118, 92, 180, 110, 84, 180, 114, 92, 188, 122, 100,
+ 188, 122, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 106, 84,
+ 164, 94, 76, 164, 102, 84, 180, 114, 92, 180, 118, 100, 172, 106, 84,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84,
+ 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 172, 110, 92,
+ 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
+ 188, 118, 92, 180, 118, 100, 180, 118, 100, 188, 118, 100, 180, 110, 92,
+ 172, 110, 100, 180, 114, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
+ 188, 122, 100, 188, 118, 100, 180, 106, 84, 172, 102, 84, 188, 114, 100,
+ 164, 98, 76, 164, 98, 84, 172, 110, 100, 132, 78, 68, 92, 34, 20,
+ 92, 34, 20, 132, 70, 52, 156, 90, 68, 164, 102, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 156, 90, 68, 156, 94, 76, 148, 82, 60,
+ 148, 86, 68, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
+ 148, 82, 60, 148, 86, 68, 148, 82, 68, 148, 82, 60, 156, 82, 68,
+ 156, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 164, 102, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 156, 82, 60,
+ 140, 78, 60, 140, 70, 52, 132, 70, 52, 156, 82, 60, 172, 98, 76,
+ 188, 114, 92, 196, 122, 100, 196, 126, 100, 196, 126, 108, 196, 130, 108,
+ 196, 130, 108, 196, 126, 100, 188, 126, 100, 196, 126, 100, 188, 126, 100,
+ 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+ 196, 130, 108, 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100,
+ 196, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
+ 188, 126, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
+ 196, 126, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
+ 188, 126, 100, 196, 126, 100, 196, 126, 100, 196, 130, 108, 196, 126, 100,
+ 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 122, 100, 196, 130, 108,
+ 196, 130, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 204, 130, 108,
+ 196, 130, 108, 196, 126, 108, 196, 130, 108, 204, 134, 108, 196, 130, 108,
+ 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 134, 108,
+ 204, 130, 108, 204, 134, 116, 196, 130, 108, 196, 122, 100, 188, 122, 100,
+ 196, 126, 108, 196, 126, 100, 196, 126, 100, 188, 118, 100, 188, 118, 92,
+ 188, 118, 92, 188, 122, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 114, 92,
+ 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 122, 100,
+ 188, 122, 100, 180, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 100,
+ 188, 118, 100, 180, 118, 100, 180, 118, 100, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 164, 102, 76,
+ 164, 102, 84, 188, 118, 100, 180, 118, 100, 172, 106, 84, 164, 102, 84,
+ 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+ 172, 106, 84, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92, 180, 110, 84,
+ 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92,
+ 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 106, 92, 172, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 100, 180, 114, 92,
+ 180, 114, 92, 180, 114, 100, 180, 118, 92, 180, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 118, 100, 180, 110, 92, 188, 114, 100, 172, 102, 92,
+ 172, 106, 92, 180, 118, 100, 132, 78, 68, 92, 34, 20, 92, 34, 20,
+ 132, 74, 60, 156, 90, 68, 164, 94, 76, 148, 90, 68, 156, 86, 68,
+ 156, 90, 68, 156, 90, 68, 164, 98, 84, 156, 90, 68, 156, 90, 68,
+ 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 102, 76,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 164, 98, 84, 164, 94, 76,
+ 156, 90, 68, 156, 90, 68, 172, 102, 84, 180, 110, 92, 188, 118, 92,
+ 196, 122, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 188, 114, 92, 188, 118, 100,
+ 188, 118, 92, 196, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100,
+ 180, 118, 92, 188, 118, 92, 188, 122, 100, 196, 122, 100, 196, 126, 108,
+ 188, 126, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100, 196, 122, 100,
+ 188, 122, 100, 188, 118, 92, 180, 110, 92, 180, 114, 92, 188, 118, 92,
+ 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 114, 92, 188, 114, 92,
+ 188, 126, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 196, 126, 108,
+ 188, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100,
+ 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 126, 100, 188, 122, 100,
+ 188, 118, 92, 196, 130, 108, 196, 130, 108, 196, 126, 108, 196, 126, 100,
+ 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+ 196, 130, 100, 196, 122, 100, 180, 118, 92, 188, 118, 92, 188, 122, 100,
+ 196, 126, 100, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 114, 92,
+ 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 188, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 92,
+ 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 92, 188, 114, 92,
+ 188, 122, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 118, 92,
+ 196, 122, 100, 188, 118, 100, 180, 114, 92, 188, 122, 100, 188, 118, 92,
+ 180, 110, 92, 180, 114, 84, 188, 118, 100, 180, 118, 92, 188, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 122, 108, 188, 122, 100, 188, 122, 100,
+ 180, 114, 92, 172, 106, 84, 164, 98, 84, 156, 94, 76, 164, 94, 76,
+ 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 106, 84, 188, 122, 100,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92,
+ 180, 110, 84, 172, 110, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
+ 172, 106, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92,
+ 172, 106, 84, 172, 106, 92, 180, 110, 92, 172, 110, 92, 180, 106, 92,
+ 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
+ 188, 118, 100, 188, 114, 100, 188, 118, 100, 180, 110, 92, 180, 118, 108,
+ 180, 122, 108, 132, 78, 68, 92, 34, 20, 92, 34, 20, 108, 50, 28,
+ 132, 66, 52, 140, 74, 52, 132, 70, 52, 140, 74, 52, 140, 78, 60,
+ 148, 86, 60, 164, 94, 76, 156, 94, 68, 156, 94, 76, 164, 98, 76,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84,
+ 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 188, 114, 100,
+ 188, 122, 100, 180, 110, 84, 188, 114, 92, 180, 114, 92, 188, 114, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 84,
+ 180, 114, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
+ 180, 110, 92, 188, 118, 92, 188, 122, 100, 180, 114, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 106, 84,
+ 172, 106, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84,
+ 172, 110, 92, 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 118, 92,
+ 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 92, 188, 118, 100,
+ 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+ 188, 114, 92, 188, 118, 92, 188, 122, 92, 188, 118, 100, 196, 122, 92,
+ 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100, 188, 118, 92,
+ 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 118, 92, 188, 114, 92,
+ 172, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 92, 180, 110, 84,
+ 172, 110, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+ 172, 106, 76, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 76, 180, 106, 84, 180, 114, 92,
+ 188, 118, 92, 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 110, 84,
+ 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92, 172, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84, 164, 98, 84,
+ 156, 94, 76, 140, 74, 52, 140, 78, 60, 148, 86, 68, 156, 90, 68,
+ 156, 94, 76, 156, 98, 76, 172, 102, 84, 172, 110, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 172, 102, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 164, 102, 84, 172, 102, 84,
+ 164, 106, 84, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 92, 164, 102, 84, 172, 102, 84,
+ 164, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 106, 92, 180, 110, 92, 172, 102, 92, 172, 114, 100, 180, 118, 100,
+ 132, 74, 60, 92, 34, 20, 92, 34, 12, 124, 58, 44, 148, 78, 60,
+ 148, 90, 68, 156, 86, 68, 156, 94, 76, 156, 94, 76, 156, 90, 68,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 156, 98, 76, 164, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 84, 172, 102, 76, 164, 102, 84,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92, 180, 106, 84,
+ 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 180, 106, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
+ 188, 122, 100, 188, 122, 100, 188, 118, 92, 180, 118, 92, 188, 118, 92,
+ 188, 118, 100, 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 118, 92,
+ 188, 122, 100, 196, 130, 108, 188, 114, 92, 180, 114, 92, 180, 118, 92,
+ 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 180, 110, 84,
+ 180, 110, 92, 180, 114, 84, 180, 114, 92, 180, 114, 92, 188, 118, 92,
+ 188, 118, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
+ 188, 122, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100,
+ 196, 122, 100, 188, 126, 100, 188, 122, 100, 188, 122, 92, 188, 122, 100,
+ 196, 122, 100, 188, 126, 100, 196, 122, 100, 188, 118, 92, 180, 118, 92,
+ 188, 118, 100, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 114, 92,
+ 180, 110, 84, 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
+ 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84,
+ 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
+ 172, 110, 84, 172, 110, 84, 180, 110, 92, 188, 118, 92, 188, 118, 92,
+ 180, 114, 92, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
+ 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92,
+ 172, 110, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 94, 76,
+ 156, 94, 68, 172, 102, 76, 172, 110, 92, 172, 110, 84, 172, 106, 92,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 106, 84, 172, 106, 92, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 172, 102, 84, 172, 106, 92, 172, 102, 84, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 98, 76,
+ 172, 102, 84, 172, 102, 84, 172, 102, 84, 164, 98, 84, 164, 102, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 98, 76,
+ 172, 98, 84, 164, 94, 84, 172, 110, 92, 172, 110, 100, 116, 62, 52,
+ 92, 34, 12, 92, 34, 20, 148, 90, 68, 172, 106, 84, 172, 110, 92,
+ 172, 106, 84, 172, 110, 84, 180, 110, 92, 164, 102, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 110, 92, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+ 180, 110, 92, 188, 118, 100, 188, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
+ 188, 118, 92, 196, 122, 100, 196, 126, 108, 204, 130, 108, 188, 122, 100,
+ 188, 118, 100, 180, 118, 92, 180, 114, 92, 188, 122, 100, 196, 122, 100,
+ 188, 122, 100, 188, 118, 92, 180, 110, 92, 196, 122, 100, 188, 126, 100,
+ 196, 126, 100, 188, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 108,
+ 196, 130, 108, 196, 130, 108, 196, 126, 100, 196, 126, 108, 196, 130, 108,
+ 196, 134, 108, 204, 134, 108, 196, 130, 108, 188, 126, 108, 188, 118, 92,
+ 180, 114, 92, 180, 106, 84, 180, 110, 84, 180, 114, 92, 180, 118, 92,
+ 188, 118, 92, 180, 118, 92, 188, 126, 100, 188, 122, 100, 196, 126, 100,
+ 196, 126, 100, 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+ 196, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100, 188, 118, 92,
+ 180, 114, 92, 188, 118, 92, 188, 118, 100, 188, 122, 92, 188, 122, 100,
+ 196, 122, 100, 180, 118, 92, 188, 118, 92, 180, 114, 92, 172, 110, 84,
+ 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 118, 92,
+ 188, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 114, 84,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 84, 180, 114, 92, 180, 118, 92, 180, 110, 92, 172, 106, 84,
+ 180, 110, 84, 180, 110, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 172, 110, 84, 172, 106, 92, 172, 106, 84, 164, 98, 76, 180, 118, 100,
+ 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92, 172, 106, 92,
+ 172, 106, 84, 164, 102, 84, 180, 106, 84, 172, 106, 92, 180, 110, 92,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+ 172, 98, 84, 164, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+ 180, 106, 84, 172, 110, 92, 180, 106, 92, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 172, 102, 84, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 172, 102, 84,
+ 172, 102, 92, 164, 102, 84, 172, 102, 84, 164, 106, 84, 164, 106, 84,
+ 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 102, 84,
+ 164, 94, 84, 172, 106, 92, 164, 106, 92, 116, 62, 52, 92, 34, 20,
+ 100, 46, 28, 148, 86, 76, 164, 98, 76, 164, 98, 76, 156, 90, 76,
+ 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 164, 102, 84,
+ 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 110, 92,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 106, 92, 172, 106, 84,
+ 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
+ 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 180, 106, 92,
+ 180, 110, 84, 172, 106, 84, 172, 102, 84, 180, 110, 92, 172, 102, 76,
+ 172, 98, 76, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 76, 172, 110, 84, 172, 106, 84,
+ 172, 98, 76, 156, 94, 68, 164, 94, 68, 164, 94, 76, 164, 98, 76,
+ 164, 94, 68, 164, 94, 68, 156, 90, 68, 164, 94, 68, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 164, 98, 76,
+ 148, 86, 60, 148, 82, 60, 156, 90, 68, 164, 94, 76, 164, 98, 76,
+ 164, 94, 76, 172, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 102, 84, 172, 102, 76,
+ 164, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+ 172, 102, 76, 172, 106, 84, 172, 102, 84, 164, 94, 76, 164, 98, 76,
+ 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 172, 98, 76,
+ 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 164, 102, 76,
+ 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 102, 76, 164, 102, 76,
+ 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 84,
+ 172, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 76, 156, 90, 68, 164, 94, 68, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68,
+ 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 90, 68,
+ 156, 94, 76, 156, 86, 68, 156, 90, 68, 164, 98, 76, 164, 94, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 84, 180, 114, 92, 164, 102, 76,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92, 172, 110, 92,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 172, 110, 92, 172, 110, 84, 172, 106, 84, 172, 102, 92, 172, 106, 84,
+ 172, 106, 92, 172, 110, 92, 172, 110, 92, 172, 110, 92, 180, 106, 84,
+ 172, 106, 84, 180, 106, 92, 180, 110, 92, 180, 110, 100, 172, 102, 84,
+ 180, 114, 100, 172, 110, 100, 124, 66, 52, 100, 46, 28, 100, 42, 28,
+ 148, 78, 68, 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 156, 90, 68, 148, 82, 60, 148, 82, 68, 148, 86, 60,
+ 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 90, 68, 148, 86, 68,
+ 156, 90, 68, 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76,
+ 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+ 156, 90, 68, 164, 94, 76, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+ 156, 94, 76, 180, 110, 92, 172, 98, 76, 172, 102, 76, 172, 102, 84,
+ 164, 98, 76, 172, 98, 76, 180, 110, 84, 188, 122, 100, 188, 118, 92,
+ 180, 114, 92, 188, 118, 100, 188, 118, 92, 188, 122, 100, 180, 114, 92,
+ 180, 110, 92, 172, 102, 76, 172, 106, 84, 188, 118, 92, 188, 122, 100,
+ 188, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 172, 102, 76,
+ 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 114, 92, 188, 118, 92,
+ 188, 114, 92, 180, 114, 92, 188, 114, 92, 188, 118, 100, 188, 118, 92,
+ 180, 114, 92, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+ 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76, 164, 98, 76,
+ 172, 102, 76, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+ 180, 110, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 106, 84,
+ 180, 110, 92, 172, 106, 76, 172, 110, 84, 180, 110, 92, 180, 110, 84,
+ 180, 106, 84, 172, 106, 84, 180, 106, 84, 172, 110, 84, 180, 110, 84,
+ 172, 102, 84, 172, 102, 76, 172, 102, 76, 164, 94, 68, 164, 98, 76,
+ 172, 102, 76, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 94, 76,
+ 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76,
+ 164, 102, 84, 172, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
+ 156, 90, 68, 156, 90, 68, 164, 94, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76,
+ 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
+ 164, 94, 68, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 102, 76,
+ 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
+ 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 156, 86, 68, 148, 86, 68, 148, 82, 60,
+ 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 82, 60,
+ 148, 86, 68, 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68,
+ 148, 78, 60, 148, 82, 60, 156, 86, 68, 156, 90, 76, 156, 90, 68,
+ 156, 86, 68, 148, 86, 60, 156, 86, 68, 148, 86, 68, 148, 86, 68,
+ 156, 90, 68, 156, 90, 68, 164, 94, 76, 156, 94, 76, 156, 86, 68,
+ 156, 90, 68, 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+ 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68,
+ 156, 90, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 106, 84,
+ 172, 102, 84, 164, 90, 76, 172, 102, 84, 172, 102, 84, 164, 102, 92,
+ 164, 102, 92, 124, 70, 60, 100, 42, 28, 84, 30, 12, 132, 70, 52,
+ 140, 74, 60, 148, 78, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60,
+ 140, 78, 60, 140, 74, 52, 148, 78, 60, 148, 82, 60, 148, 82, 60,
+ 148, 82, 68, 156, 86, 60, 156, 90, 68, 156, 90, 68, 156, 90, 76,
+ 148, 82, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68,
+ 156, 86, 68, 156, 90, 68, 164, 90, 76, 172, 102, 84, 156, 94, 76,
+ 156, 90, 68, 172, 98, 84, 164, 102, 84, 164, 94, 76, 164, 94, 76,
+ 172, 102, 84, 180, 110, 84, 180, 110, 92, 188, 114, 92, 180, 110, 84,
+ 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 92, 180, 118, 92,
+ 188, 114, 92, 188, 118, 92, 180, 118, 92, 180, 114, 92, 180, 110, 84,
+ 180, 114, 92, 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 114, 92, 180, 114, 92,
+ 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84,
+ 172, 102, 84, 172, 106, 76, 180, 110, 92, 188, 118, 92, 188, 118, 100,
+ 188, 118, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84,
+ 180, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 106, 84, 180, 110, 84,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+ 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 172, 106, 84,
+ 172, 106, 84, 180, 106, 84, 180, 110, 92, 180, 110, 92, 172, 106, 76,
+ 172, 106, 84, 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 98, 76, 164, 102, 76,
+ 172, 102, 84, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 102, 76,
+ 164, 102, 84, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 94, 68,
+ 164, 94, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 76,
+ 172, 102, 76, 164, 98, 76, 172, 102, 84, 172, 106, 76, 164, 94, 76,
+ 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 84, 164, 98, 76,
+ 156, 94, 76, 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 94, 76,
+ 156, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 164, 94, 76, 156, 90, 68, 156, 86, 68,
+ 156, 86, 68, 156, 94, 76, 164, 98, 76, 164, 94, 76, 156, 90, 76,
+ 156, 86, 68, 148, 90, 68, 156, 90, 68, 156, 94, 68, 156, 94, 76,
+ 156, 94, 76, 156, 94, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76,
+ 164, 94, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
+ 156, 90, 68, 164, 94, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
+ 164, 102, 76, 156, 98, 76, 164, 98, 76, 164, 94, 68, 156, 82, 68,
+ 132, 66, 44, 140, 70, 52, 148, 78, 68, 156, 90, 76, 156, 102, 84,
+ 124, 66, 52, 84, 30, 12, 92, 38, 28, 132, 66, 52, 140, 74, 52,
+ 132, 74, 60, 132, 66, 44, 124, 66, 44, 140, 70, 52, 140, 78, 60,
+ 148, 82, 60, 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 86, 68,
+ 148, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76, 164, 90, 68,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84, 164, 98, 84,
+ 172, 98, 76, 164, 102, 84, 172, 102, 84, 172, 98, 84, 164, 98, 76,
+ 172, 102, 84, 180, 110, 84, 180, 110, 92, 172, 110, 92, 172, 102, 76,
+ 180, 106, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 106, 84,
+ 172, 102, 84, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 188, 114, 92, 180, 110, 92, 172, 110, 84, 188, 118, 100,
+ 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 92, 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 102, 84, 172, 102, 76,
+ 172, 102, 76, 172, 110, 84, 188, 118, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 100, 188, 122, 92, 188, 122, 100, 172, 110, 84, 180, 110, 92,
+ 180, 114, 84, 180, 114, 92, 188, 114, 92, 180, 118, 92, 188, 114, 92,
+ 180, 118, 92, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84,
+ 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 106, 84,
+ 180, 106, 84, 172, 110, 92, 180, 110, 84, 180, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 106, 84, 172, 110, 84,
+ 172, 102, 84, 172, 102, 84, 164, 102, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 98, 76, 172, 102, 76,
+ 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 106, 84, 180, 110, 92, 180, 110, 84, 172, 110, 84, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 180, 110, 84, 164, 98, 76, 164, 98, 76,
+ 172, 106, 84, 164, 102, 76, 172, 102, 84, 164, 98, 84, 164, 98, 76,
+ 172, 106, 84, 172, 110, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
+ 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 156, 94, 76, 164, 98, 76, 172, 106, 84, 172, 102, 76, 164, 98, 84,
+ 172, 102, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 172, 102, 84, 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 76, 164, 98, 76,
+ 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 94, 76,
+ 164, 98, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92, 164, 102, 84,
+ 164, 98, 76, 156, 94, 68, 156, 90, 68, 156, 86, 68, 132, 62, 44,
+ 140, 66, 52, 140, 74, 60, 156, 94, 84, 172, 110, 100, 132, 74, 60,
+ 92, 38, 28, 116, 58, 44, 164, 106, 84, 180, 114, 92, 180, 114, 92,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 188, 122, 100, 188, 126, 100,
+ 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 164, 102, 84, 172, 106, 84,
+ 180, 106, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 114, 100, 188, 122, 100, 188, 122, 100, 188, 114, 92, 180, 114, 92,
+ 188, 114, 92, 188, 114, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84,
+ 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
+ 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 114, 92,
+ 188, 118, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92,
+ 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 106, 76,
+ 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
+ 180, 106, 84, 172, 110, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84,
+ 164, 94, 68, 164, 98, 76, 172, 106, 84, 180, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 76, 172, 102, 76, 172, 102, 84, 164, 102, 76, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, 180, 110, 84,
+ 180, 110, 92, 180, 114, 84, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+ 172, 110, 84, 180, 106, 84, 172, 110, 92, 180, 106, 84, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 164, 98, 76, 172, 98, 76, 180, 110, 84,
+ 172, 106, 84, 172, 102, 84, 164, 98, 76, 164, 102, 84, 172, 106, 84,
+ 172, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
+ 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 98, 76, 156, 90, 68,
+ 156, 90, 68, 164, 98, 84, 164, 98, 84, 172, 102, 76, 172, 102, 84,
+ 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84, 172, 106, 84,
+ 172, 98, 84, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 106, 84,
+ 172, 106, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 164, 102, 76, 172, 102, 84, 164, 102, 84, 164, 102, 76,
+ 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 98, 84, 164, 98, 84,
+ 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 76, 172, 102, 84, 164, 90, 68, 164, 90, 76,
+ 164, 94, 76, 164, 102, 92, 172, 114, 100, 140, 82, 68, 116, 58, 44,
+ 116, 62, 52, 148, 86, 68, 164, 98, 76, 164, 102, 84, 164, 98, 76,
+ 156, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 164, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
+ 164, 98, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 172, 106, 84,
+ 180, 110, 84, 172, 110, 92, 180, 110, 84, 172, 106, 92, 172, 106, 84,
+ 164, 90, 76, 172, 106, 84, 180, 110, 92, 172, 98, 84, 164, 98, 76,
+ 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
+ 188, 114, 92, 188, 118, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
+ 180, 110, 84, 180, 114, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84,
+ 172, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
+ 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 110, 92,
+ 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 110, 84, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 110, 84,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 172, 106, 84, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+ 172, 102, 84, 172, 102, 76, 172, 106, 84, 172, 102, 76, 156, 90, 68,
+ 164, 94, 68, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 98, 76,
+ 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+ 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 180, 106, 84,
+ 172, 106, 84, 164, 102, 76, 172, 102, 76, 172, 110, 92, 180, 110, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 180, 114, 84, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 110, 84, 180, 114, 92,
+ 164, 98, 84, 156, 98, 76, 164, 98, 76, 172, 106, 84, 172, 110, 92,
+ 172, 106, 84, 164, 102, 76, 164, 102, 84, 156, 90, 68, 156, 90, 68,
+ 156, 94, 76, 164, 102, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76,
+ 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76,
+ 164, 98, 84, 172, 98, 76, 172, 102, 84, 172, 106, 92, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 102, 84,
+ 164, 98, 76, 156, 90, 68, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 98, 84, 164, 102, 76,
+ 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 102, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84,
+ 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 106, 84, 172, 102, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 92, 164, 98, 84,
+ 164, 102, 92, 156, 98, 84, 132, 74, 60, 116, 62, 52, 116, 58, 44,
+ 148, 86, 68, 164, 94, 76, 164, 102, 84, 164, 102, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 164, 98, 76, 172, 106, 84, 172, 106, 84,
+ 172, 106, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 114, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
+ 180, 110, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 84,
+ 180, 114, 92, 188, 122, 100, 180, 114, 92, 172, 102, 84, 180, 106, 92,
+ 188, 118, 100, 188, 122, 100, 172, 102, 84, 172, 106, 84, 180, 106, 84,
+ 180, 110, 84, 180, 110, 84, 180, 106, 92, 172, 102, 76, 172, 102, 84,
+ 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 76, 164, 98, 76,
+ 172, 102, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 172, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+ 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84,
+ 180, 110, 92, 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 84, 172, 102, 84, 172, 106, 76, 164, 98, 76,
+ 164, 98, 76, 172, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 76,
+ 164, 98, 76, 172, 106, 84, 172, 102, 84, 164, 94, 68, 164, 94, 76,
+ 172, 102, 76, 172, 102, 76, 164, 102, 84, 172, 102, 76, 164, 98, 76,
+ 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 164, 102, 76, 172, 98, 76, 164, 102, 76, 172, 106, 84, 172, 102, 76,
+ 172, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 84,
+ 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84,
+ 156, 90, 68, 164, 94, 68, 172, 110, 84, 180, 114, 92, 172, 102, 76,
+ 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 84, 156, 94, 76, 164, 98, 76, 164, 98, 84,
+ 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84,
+ 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 172, 102, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 164, 94, 76,
+ 156, 90, 68, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 98, 76, 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 102, 84,
+ 164, 98, 84, 164, 102, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 172, 98, 84, 164, 98, 76, 172, 98, 84, 164, 94, 76, 164, 98, 84,
+ 156, 98, 84, 124, 70, 60, 116, 58, 44, 116, 62, 44, 164, 98, 76,
+ 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 102, 84, 172, 102, 84,
+ 172, 106, 84, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 106, 92, 164, 102, 84, 180, 106, 84, 180, 114, 100,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 118, 100,
+ 188, 118, 100, 188, 114, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
+ 188, 114, 92, 188, 122, 100, 172, 106, 84, 172, 106, 84, 180, 110, 84,
+ 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84, 180, 110, 84,
+ 180, 114, 92, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+ 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84,
+ 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+ 180, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 106, 84, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+ 164, 98, 76, 172, 106, 76, 172, 102, 84, 164, 98, 76, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 98, 76,
+ 164, 102, 84, 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 172, 98, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84, 156, 94, 68,
+ 164, 90, 68, 172, 106, 84, 180, 110, 84, 164, 102, 84, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 172, 106, 84, 172, 106, 84, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
+ 164, 98, 84, 172, 102, 84, 172, 98, 76, 164, 98, 76, 164, 94, 76,
+ 164, 98, 76, 172, 102, 84, 164, 98, 84, 164, 94, 76, 164, 94, 76,
+ 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+ 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
+ 172, 102, 76, 164, 102, 84, 164, 102, 76, 172, 102, 84, 164, 102, 76,
+ 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 102, 76, 164, 102, 84, 172, 98, 84, 164, 102, 84, 164, 98, 76,
+ 164, 102, 84, 156, 98, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
+ 172, 98, 84, 172, 98, 84, 164, 90, 76, 172, 106, 92, 164, 106, 92,
+ 132, 70, 60, 116, 62, 44, 116, 58, 44, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 156, 90, 68, 156, 90, 68, 164, 98, 76, 164, 102, 84,
+ 164, 98, 76, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 92, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+ 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 110, 92,
+ 172, 106, 84, 164, 98, 76, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 188, 118, 92, 188, 118, 100, 180, 110, 84, 180, 110, 92,
+ 188, 118, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 180, 110, 92,
+ 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84, 180, 110, 92,
+ 180, 110, 84, 180, 118, 100, 188, 114, 92, 180, 114, 92, 180, 110, 92,
+ 188, 122, 100, 188, 118, 92, 180, 114, 100, 180, 114, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
+ 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
+ 172, 102, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 110, 84,
+ 180, 110, 84, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 110, 84, 180, 114, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+ 180, 110, 84, 172, 102, 76, 172, 102, 76, 172, 102, 76, 164, 94, 76,
+ 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 180, 110, 84, 180, 110, 92, 172, 106, 76, 172, 102, 84, 172, 106, 84,
+ 172, 106, 84, 172, 102, 76, 164, 102, 76, 180, 106, 84, 164, 98, 76,
+ 164, 102, 76, 180, 110, 84, 172, 110, 84, 164, 94, 76, 156, 94, 68,
+ 172, 102, 84, 172, 106, 84, 172, 106, 92, 164, 102, 84, 164, 98, 76,
+ 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 84,
+ 156, 90, 68, 164, 102, 84, 164, 102, 84, 156, 86, 68, 148, 86, 68,
+ 172, 102, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
+ 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 164, 98, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 164, 94, 76,
+ 172, 98, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68, 148, 90, 68,
+ 156, 94, 76, 164, 94, 76, 164, 102, 84, 164, 102, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 102, 76, 164, 98, 84,
+ 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
+ 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 94, 84,
+ 164, 98, 84, 156, 94, 76, 164, 106, 92, 164, 102, 92, 124, 66, 52,
+ 116, 58, 44, 116, 58, 36, 164, 106, 92, 172, 106, 84, 164, 106, 84,
+ 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 84,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84, 172, 106, 92,
+ 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 188, 118, 92, 188, 118, 100, 180, 114, 100,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
+ 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+ 180, 106, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100, 180, 110, 92,
+ 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 172, 106, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100, 188, 118, 100,
+ 180, 118, 92, 188, 114, 100, 180, 118, 92, 188, 118, 100, 188, 118, 100,
+ 188, 118, 100, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
+ 188, 118, 100, 180, 114, 92, 188, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 110, 92, 172, 106, 84, 188, 118, 92, 180, 114, 92, 172, 110, 84,
+ 172, 110, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84,
+ 172, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
+ 172, 102, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 110, 84, 172, 106, 84, 172, 106, 76, 172, 102, 84, 164, 102, 76,
+ 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76,
+ 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 180, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 106, 84, 180, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84, 172, 98, 76,
+ 164, 102, 76, 172, 110, 84, 180, 118, 92, 172, 106, 84, 172, 110, 84,
+ 172, 102, 84, 172, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 68, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76,
+ 164, 98, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 84, 164, 106, 84, 164, 98, 76, 164, 98, 76, 156, 94, 76,
+ 156, 94, 76, 164, 94, 76, 164, 98, 76, 172, 102, 84, 164, 102, 84,
+ 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 76, 164, 94, 76, 156, 94, 76, 148, 86, 68, 164, 94, 76,
+ 164, 102, 84, 164, 102, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 94, 84, 164, 90, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84,
+ 164, 94, 76, 164, 94, 76, 172, 102, 84, 164, 98, 76, 172, 98, 84,
+ 164, 98, 84, 172, 110, 92, 164, 102, 84, 124, 66, 52, 116, 58, 36,
+ 108, 46, 28, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84, 172, 110, 92,
+ 180, 114, 92, 180, 118, 100, 180, 110, 92, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 114, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92,
+ 180, 114, 100, 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 172, 106, 92, 180, 106, 84, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
+ 180, 110, 92, 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 106, 84,
+ 180, 106, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 84,
+ 180, 106, 92, 180, 114, 92, 188, 118, 100, 188, 118, 100, 180, 114, 92,
+ 180, 110, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 180, 118, 100,
+ 188, 118, 100, 188, 118, 100, 188, 118, 100, 196, 126, 108, 188, 122, 100,
+ 188, 118, 100, 188, 118, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
+ 180, 114, 92, 188, 118, 100, 180, 118, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 84, 180, 114, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 92, 188, 114, 84, 180, 110, 92,
+ 180, 110, 84, 188, 114, 92, 188, 114, 92, 180, 118, 92, 188, 118, 100,
+ 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 118, 92,
+ 180, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 164, 98, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+ 172, 106, 84, 172, 110, 92, 180, 106, 92, 172, 110, 92, 180, 110, 84,
+ 172, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84, 172, 106, 84,
+ 180, 114, 84, 180, 118, 92, 180, 110, 84, 172, 110, 84, 172, 110, 84,
+ 172, 106, 84, 164, 102, 76, 172, 102, 76, 164, 102, 76, 164, 102, 84,
+ 172, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 102, 84, 164, 98, 84,
+ 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 102, 84, 172, 106, 84,
+ 172, 110, 92, 172, 102, 84, 164, 102, 76, 172, 102, 84, 164, 106, 84,
+ 164, 98, 84, 164, 98, 76, 164, 98, 84, 156, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 84, 164, 98, 84, 164, 94, 76,
+ 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84, 164, 98, 84,
+ 164, 94, 76, 156, 94, 84, 156, 94, 76, 156, 94, 76, 156, 90, 76,
+ 164, 98, 84, 156, 90, 76, 116, 54, 36, 108, 46, 28, 116, 54, 36,
+ 172, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
+ 172, 106, 92, 164, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 188, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 92,
+ 172, 110, 84, 172, 106, 92, 180, 110, 84, 180, 110, 92, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84, 180, 114, 92,
+ 180, 114, 100, 180, 114, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+ 172, 106, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 110, 92, 172, 110, 84,
+ 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 110, 84, 172, 110, 84,
+ 180, 110, 92, 180, 114, 84, 172, 110, 84, 172, 102, 84, 172, 106, 76,
+ 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 84,
+ 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 92, 180, 110, 84,
+ 180, 110, 92, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 164, 102, 84, 172, 102, 76, 164, 102, 76, 172, 102, 84,
+ 172, 106, 76, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 106, 84,
+ 180, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
+ 180, 106, 84, 172, 106, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
+ 172, 114, 92, 180, 110, 84, 172, 114, 92, 180, 110, 84, 172, 114, 92,
+ 180, 110, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
+ 164, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76,
+ 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76,
+ 156, 94, 68, 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 156, 86, 68, 156, 94, 68, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 98, 76,
+ 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 156, 94, 76,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 76,
+ 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 94, 76,
+ 164, 98, 84, 164, 94, 76, 164, 98, 84, 156, 94, 76, 164, 102, 84,
+ 156, 94, 76, 116, 58, 36, 116, 54, 36, 116, 58, 36, 180, 114, 100,
+ 180, 118, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+ 180, 114, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 188, 122, 100,
+ 196, 126, 108, 188, 122, 108, 196, 126, 100, 188, 122, 108, 188, 122, 100,
+ 188, 118, 100, 180, 118, 100, 188, 114, 100, 180, 118, 100, 188, 118, 100,
+ 188, 118, 100, 196, 126, 108, 188, 126, 100, 196, 126, 108, 188, 122, 100,
+ 180, 114, 100, 180, 114, 92, 188, 122, 100, 196, 122, 108, 196, 126, 108,
+ 196, 126, 100, 188, 118, 100, 180, 114, 100, 188, 114, 92, 180, 118, 100,
+ 188, 122, 100, 188, 118, 100, 188, 114, 100, 188, 118, 100, 188, 122, 100,
+ 196, 122, 108, 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 130, 108,
+ 196, 130, 116, 196, 130, 108, 196, 126, 108, 188, 118, 100, 180, 114, 100,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 180, 106, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92,
+ 180, 118, 92, 180, 118, 92, 180, 118, 92, 188, 118, 92, 180, 118, 92,
+ 180, 118, 92, 188, 118, 100, 180, 114, 84, 180, 110, 92, 188, 114, 92,
+ 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84,
+ 180, 110, 92, 180, 110, 84, 180, 110, 84, 188, 118, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 122, 108,
+ 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 114, 92,
+ 180, 114, 92, 180, 114, 100, 188, 114, 92, 180, 118, 100, 188, 118, 100,
+ 188, 118, 100, 188, 118, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 180, 118, 92,
+ 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 76,
+ 164, 102, 76, 164, 102, 84, 172, 102, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 156, 98, 76, 164, 98, 84, 164, 98, 76, 156, 94, 76, 164, 94, 68,
+ 156, 94, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
+ 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 156, 98, 76, 164, 98, 76, 164, 98, 84, 156, 98, 76, 156, 94, 68,
+ 164, 94, 76, 164, 98, 76, 164, 102, 84, 164, 102, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 68,
+ 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 68,
+ 156, 94, 76, 172, 98, 84, 164, 98, 84, 172, 98, 76, 164, 94, 84,
+ 172, 98, 84, 164, 98, 84, 164, 98, 84, 172, 98, 84, 164, 98, 84,
+ 164, 98, 84, 164, 106, 84, 164, 102, 84, 172, 110, 92, 164, 98, 84,
+ 124, 66, 44, 116, 58, 36, 116, 50, 36, 172, 106, 84, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 106, 84, 172, 102, 84,
+ 164, 102, 76, 172, 102, 84, 164, 102, 84, 172, 106, 84, 172, 102, 84,
+ 180, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92,
+ 180, 118, 92, 180, 114, 100, 180, 110, 92, 180, 110, 92, 180, 106, 92,
+ 172, 102, 84, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 110, 92, 180, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 110, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 188, 114, 100, 188, 122, 100,
+ 188, 118, 100, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 76,
+ 172, 102, 84, 172, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84,
+ 172, 106, 84, 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
+ 172, 106, 84, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 106, 84,
+ 172, 110, 92, 180, 110, 84, 172, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 188, 114, 92, 188, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+ 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100,
+ 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84, 172, 110, 92,
+ 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84, 172, 106, 92,
+ 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 84, 164, 102, 76,
+ 164, 98, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 172, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 84, 164, 98, 76,
+ 172, 102, 76, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 84, 172, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 94, 68, 164, 94, 76, 164, 94, 76, 156, 94, 76,
+ 164, 94, 76, 164, 90, 76, 156, 94, 76, 164, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 164, 102, 84, 164, 102, 84, 172, 106, 92, 156, 94, 76, 124, 62, 44,
+ 116, 50, 36, 108, 50, 28, 156, 86, 68, 156, 90, 68, 148, 86, 68,
+ 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 86, 68, 148, 90, 68,
+ 156, 90, 68, 156, 90, 76, 156, 94, 76, 156, 90, 68, 148, 86, 68,
+ 156, 86, 68, 156, 90, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68,
+ 156, 90, 68, 164, 90, 76, 156, 90, 68, 156, 90, 76, 164, 90, 68,
+ 156, 90, 76, 164, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+ 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 86, 76,
+ 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 90, 68,
+ 164, 90, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
+ 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 90, 68, 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 76,
+ 156, 90, 68, 148, 86, 68, 156, 86, 68, 164, 94, 76, 164, 94, 76,
+ 156, 90, 68, 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
+ 164, 94, 76, 156, 94, 68, 156, 90, 68, 156, 94, 68, 164, 94, 68,
+ 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
+ 164, 90, 76, 164, 90, 68, 164, 90, 76, 164, 94, 76, 156, 94, 68,
+ 164, 94, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 164, 94, 76,
+ 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
+ 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68, 156, 90, 76,
+ 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 68, 156, 90, 76,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 86, 68,
+ 164, 90, 76, 156, 90, 68, 164, 90, 76, 156, 94, 68, 164, 94, 76,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 94, 76,
+ 156, 94, 76, 156, 90, 76, 148, 86, 68, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
+ 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 84,
+ 156, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+ 156, 94, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 148, 90, 68,
+ 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 90, 68, 156, 94, 76,
+ 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 68, 156, 82, 68,
+ 156, 86, 76, 156, 90, 76, 156, 86, 76, 148, 86, 68, 156, 86, 68,
+ 156, 86, 76, 156, 90, 68, 156, 94, 76, 164, 94, 84, 164, 98, 84,
+ 156, 94, 76, 156, 98, 76, 148, 86, 68, 116, 54, 36, 108, 50, 28,
+ 108, 50, 36, 140, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+ 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60,
+ 148, 82, 60, 148, 82, 60, 148, 78, 60, 140, 74, 52, 140, 74, 52,
+ 140, 78, 60, 148, 82, 60, 140, 70, 52, 140, 74, 52, 148, 74, 60,
+ 140, 78, 60, 148, 74, 60, 140, 74, 52, 140, 74, 52, 140, 78, 60,
+ 140, 74, 52, 148, 78, 60, 140, 74, 60, 148, 78, 60, 148, 74, 60,
+ 148, 78, 60, 148, 74, 60, 148, 78, 60, 140, 70, 52, 140, 70, 52,
+ 148, 74, 60, 140, 74, 60, 148, 78, 60, 148, 78, 68, 140, 78, 60,
+ 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60, 148, 74, 60,
+ 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
+ 148, 74, 60, 148, 78, 60, 140, 78, 60, 148, 74, 60, 140, 74, 52,
+ 140, 70, 52, 140, 74, 52, 140, 78, 60, 148, 78, 60, 148, 78, 60,
+ 148, 78, 60, 148, 78, 60, 148, 82, 60, 140, 74, 52, 140, 74, 52,
+ 140, 78, 60, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
+ 140, 78, 60, 140, 82, 60, 148, 82, 60, 148, 86, 68, 148, 86, 60,
+ 140, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 70, 52,
+ 140, 70, 52, 140, 74, 52, 140, 70, 52, 140, 74, 52, 140, 70, 52,
+ 140, 74, 52, 140, 74, 52, 140, 78, 60, 148, 74, 60, 140, 74, 52,
+ 140, 74, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60, 148, 78, 60,
+ 156, 82, 60, 148, 82, 68, 156, 82, 60, 148, 82, 68, 148, 82, 60,
+ 156, 82, 68, 148, 82, 60, 148, 82, 68, 148, 82, 60, 148, 82, 60,
+ 148, 82, 60, 148, 82, 68, 148, 78, 60, 156, 82, 60, 148, 82, 68,
+ 148, 82, 60, 156, 82, 60, 148, 82, 60, 156, 82, 68, 148, 82, 60,
+ 156, 86, 68, 148, 82, 60, 156, 82, 68, 148, 82, 60, 148, 82, 68,
+ 148, 82, 68, 148, 82, 68, 148, 86, 68, 148, 82, 68, 156, 86, 68,
+ 148, 82, 68, 148, 82, 60, 148, 82, 68, 140, 78, 60, 148, 78, 68,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+ 148, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
+ 140, 78, 60, 148, 78, 60, 148, 82, 60, 140, 78, 60, 148, 78, 60,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 78, 60,
+ 148, 82, 60, 140, 74, 52, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+ 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
+ 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60, 148, 82, 60,
+ 148, 78, 60, 140, 78, 60, 148, 86, 60, 148, 82, 68, 148, 82, 60,
+ 148, 82, 60, 140, 78, 60, 148, 82, 60, 148, 78, 60, 148, 78, 60,
+ 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 82, 68, 148, 82, 68,
+ 148, 86, 68, 156, 82, 68, 148, 82, 68, 148, 82, 68, 148, 82, 68,
+ 148, 86, 68, 148, 82, 68, 148, 78, 60, 140, 82, 60, 140, 74, 60,
+ 140, 78, 60, 140, 74, 60, 116, 50, 36, 108, 50, 36, 108, 50, 28,
+ 108, 42, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 116, 46, 28,
+ 108, 42, 20, 116, 46, 28, 108, 42, 20, 108, 46, 28, 108, 46, 28,
+ 116, 46, 28, 108, 46, 20, 108, 42, 20, 100, 42, 20, 108, 42, 20,
+ 108, 42, 28, 108, 42, 20, 116, 46, 28, 116, 46, 28, 116, 46, 28,
+ 108, 42, 20, 108, 38, 20, 108, 42, 28, 116, 42, 28, 108, 42, 20,
+ 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 50, 28, 108, 46, 28,
+ 116, 46, 28, 108, 42, 20, 108, 42, 28, 116, 42, 28, 108, 46, 28,
+ 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 42, 28, 108, 42, 20,
+ 116, 46, 28, 108, 42, 20, 116, 46, 28, 108, 46, 28, 108, 42, 20,
+ 116, 42, 28, 108, 38, 20, 108, 42, 28, 116, 46, 28, 108, 46, 28,
+ 116, 46, 28, 108, 42, 20, 108, 42, 20, 116, 42, 28, 116, 46, 28,
+ 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 46, 28, 116, 46, 28,
+ 116, 46, 28, 116, 50, 28, 116, 46, 28, 116, 50, 36, 124, 50, 36,
+ 116, 50, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28,
+ 108, 46, 20, 108, 50, 28, 116, 50, 28, 116, 54, 28, 108, 46, 28,
+ 108, 46, 20, 108, 42, 20, 108, 42, 20, 116, 50, 28, 116, 46, 28,
+ 116, 46, 28, 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 46, 28,
+ 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 42, 28,
+ 116, 46, 28, 116, 46, 28, 116, 50, 28, 124, 50, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
+ 124, 58, 36, 124, 54, 36, 132, 62, 44, 124, 54, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 54, 44, 124, 58, 36, 132, 62, 44,
+ 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
+ 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
+ 124, 58, 44, 124, 54, 36, 124, 58, 44, 124, 58, 36, 124, 58, 44,
+ 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44, 124, 58, 44,
+ 124, 58, 44, 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44,
+ 124, 62, 44, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 62, 44,
+ 124, 62, 44, 132, 62, 44, 116, 58, 36, 124, 58, 36, 124, 58, 44,
+ 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 58, 36,
+ 124, 62, 44, 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44,
+ 132, 62, 44, 124, 66, 44, 132, 62, 44, 124, 62, 44, 124, 58, 36,
+ 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44, 124, 62, 44,
+ 124, 58, 36, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 58, 44,
+ 124, 58, 36, 124, 58, 36, 116, 58, 36, 124, 58, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 50, 36, 124, 54, 36, 124, 54, 36,
+ 124, 54, 36, 116, 54, 36, 116, 50, 36, 124, 54, 36, 124, 54, 44,
+ 124, 54, 36, 116, 54, 36, 116, 54, 36, 108, 46, 28, 124, 58, 44,
+ 124, 58, 44, 100, 42, 20, 108, 50, 28
+};
diff --git a/hacks/glx/endgame.c b/hacks/glx/endgame.c
new file mode 100644
index 0000000..ddba7f9
--- /dev/null
+++ b/hacks/glx/endgame.c
@@ -0,0 +1,971 @@
+/*
+ * endgame.c
+ * plays through a chess game ending. enjoy.
+ *
+ * version 1.0 - June 6, 2002
+ *
+ * Copyright (C) 2002-2008 Blair Tennessy (tennessb@unbc.ca)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_chess 0
+# define release_chess 0
+# include "xlockmore.h"
+
+#else
+# include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#define BOARDSIZE 8
+#define WHITES 5
+
+#include "gltrackball.h"
+#include "chessmodels.h"
+#include "chessgames.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_ROTATE "True"
+#define DEF_REFLECTIONS "True"
+#define DEF_SHADOWS "True"
+#define DEF_SMOOTH "True"
+#define DEF_CLASSIC "False"
+
+
+static XrmOptionDescRec opts[] = {
+ {"+rotate", ".chess.rotate", XrmoptionNoArg, "false" },
+ {"-rotate", ".chess.rotate", XrmoptionNoArg, "true" },
+ {"+reflections", ".chess.reflections", XrmoptionNoArg, "false" },
+ {"-reflections", ".chess.reflections", XrmoptionNoArg, "true" },
+ {"+shadows", ".chess.shadows", XrmoptionNoArg, "false" },
+ {"-shadows", ".chess.shadows", XrmoptionNoArg, "true" },
+ {"+smooth", ".chess.smooth", XrmoptionNoArg, "false" },
+ {"-smooth", ".chess.smooth", XrmoptionNoArg, "true" },
+ {"+classic", ".chess.classic", XrmoptionNoArg, "false" },
+ {"-classic", ".chess.classic", XrmoptionNoArg, "true" },
+};
+
+static int rotate, reflections, smooth, shadows, classic;
+
+static argtype vars[] = {
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&reflections, "reflections", "Reflections", DEF_REFLECTIONS, t_Bool},
+ {&shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool},
+ {&smooth, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+ {&classic, "classic", "Classic", DEF_CLASSIC, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt chess_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct chess_description =
+{"chess", "init_chess", "draw_chess", NULL,
+ "draw_chess", "init_chess", NULL, &chess_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Chess", 0, NULL};
+
+#endif
+
+#define checkImageWidth 16
+#define checkImageHeight 16
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ ChessGame game;
+ int oldwhite;
+
+ /** definition of white/black (orange/gray) colors */
+ GLfloat colors[2][3];
+
+ GLubyte checkImage[checkImageWidth][checkImageHeight][3];
+ GLuint piecetexture, boardtexture;
+
+ int mpiece, tpiece, steps, done;
+ double from[2], to[2];
+ double dx, dz;
+ int moving, take, mc, count, wire;
+ double theta;
+
+ GLfloat position[4];
+ GLfloat position2[4];
+
+ GLfloat mod;
+
+ GLfloat ground[4];
+
+ int oldgame;
+
+ int poly_counts[PIECES]; /* polygon count of each type of piece */
+
+
+} Chesscreen;
+
+static Chesscreen *qs = NULL;
+
+static const GLfloat MaterialShadow[] = {0.0, 0.0, 0.0, 0.3};
+
+
+/* i prefer silvertip */
+static const GLfloat whites[WHITES][3] =
+ {
+ {1.0, 0.55, 0.1},
+ {0.8, 0.52, 0.8},
+ {0.43, 0.54, 0.76},
+ {0.2, 0.2, 0.2},
+ {0.35, 0.60, 0.35},
+ };
+
+static void build_colors(Chesscreen *cs)
+{
+
+ /* find new white */
+ int newwhite = cs->oldwhite;
+ while(newwhite == cs->oldwhite)
+ newwhite = random()%WHITES;
+ cs->oldwhite = newwhite;
+
+ cs->colors[0][0] = whites[cs->oldwhite][0];
+ cs->colors[0][1] = whites[cs->oldwhite][1];
+ cs->colors[0][2] = whites[cs->oldwhite][2];
+}
+
+/* build piece texture */
+static void make_piece_texture(Chesscreen *cs)
+{
+ int i, j, c;
+
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = ((j%2) == 0 || i%2 == 0) ? 240 : 180+random()%16;
+ cs->checkImage[i][j][0] = (GLubyte) c;
+ cs->checkImage[i][j][1] = (GLubyte) c;
+ cs->checkImage[i][j][2] = (GLubyte) c;
+ }
+ }
+
+ glGenTextures(1, &cs->piecetexture);
+ glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &cs->checkImage[0][0]);
+}
+
+/* build board texture (uniform noise in [180,180+50]) */
+static void make_board_texture(Chesscreen *cs)
+{
+ int i, j, c;
+
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = 180 + random()%51;
+ cs->checkImage[i][j][0] = (GLubyte) c;
+ cs->checkImage[i][j][1] = (GLubyte) c;
+ cs->checkImage[i][j][2] = (GLubyte) c;
+ }
+ }
+
+ glGenTextures(1, &cs->boardtexture);
+ glBindTexture(GL_TEXTURE_2D, cs->boardtexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &cs->checkImage[0][0]);
+}
+
+/** handle X event (trackball) */
+ENTRYPOINT Bool chess_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Chesscreen *cs = &qs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cs->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cs->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ cs->done = 1;
+ return True;
+ }
+
+ return False;
+}
+
+static const GLfloat diffuse2[] = {1.0, 1.0, 1.0, 1.0};
+/*static const GLfloat ambient2[] = {0.7, 0.7, 0.7, 1.0};*/
+static const GLfloat shininess[] = {60.0};
+static const GLfloat specular[] = {0.4, 0.4, 0.4, 1.0};
+
+/* configure lighting */
+static void setup_lights(Chesscreen *cs)
+{
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse2);
+ glEnable(GL_LIGHT0);
+
+/* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient2); */
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+
+ glLightfv(GL_LIGHT1, GL_SPECULAR, diffuse2);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2);
+ glEnable(GL_LIGHT1);
+}
+
+/* draw pieces */
+static void drawPieces(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ for(i = 0; i < BOARDSIZE; ++i) {
+ for(j = 0; j < BOARDSIZE; ++j) {
+ if(cs->game.board[i][j]) {
+ int c = cs->game.board[i][j]/PIECES;
+ glColor3fv(cs->colors[c]);
+ glCallList(cs->game.board[i][j]%PIECES);
+ mi->polygon_count += cs->poly_counts[cs->game.board[i][j]%PIECES];
+ }
+
+ glTranslatef(1.0, 0.0, 0.0);
+ }
+
+ glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0);
+ }
+
+ glTranslatef(0.0, 0.0, -1.0*BOARDSIZE);
+}
+
+/* draw pieces */
+static void drawPiecesShadow(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ for(i = 0; i < BOARDSIZE; ++i) {
+ for(j = 0; j < BOARDSIZE; ++j) {
+ if(cs->game.board[i][j]) {
+ glColor4f(0.0, 0.0, 0.0, 0.4);
+ glCallList(cs->game.board[i][j]%PIECES);
+ mi->polygon_count += cs->poly_counts[cs->game.board[i][j]%PIECES];
+ }
+
+ glTranslatef(1.0, 0.0, 0.0);
+ }
+
+ glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0);
+ }
+
+ glTranslatef(0.0, 0.0, -1.0*BOARDSIZE);
+}
+
+/* draw a moving piece */
+static void drawMovingPiece(ModeInfo *mi, Chesscreen *cs, int shadow)
+{
+ int piece = cs->mpiece % PIECES;
+
+ if (piece == NONE) return;
+
+ glPushMatrix();
+
+ if(shadow) glColor4fv(MaterialShadow);
+ else glColor3fv(cs->colors[cs->mpiece/PIECES]);
+
+ /** assume a queening. should be more general */
+ if((cs->mpiece == PAWN && fabs(cs->to[0]) < 0.01) ||
+ (cs->mpiece == BPAWN && fabs(cs->to[0]-7.0) < 0.01)) {
+ glTranslatef(cs->from[1]+cs->steps*cs->dx, 0.0, cs->from[0]+cs->steps*cs->dz);
+
+ glColor4f(shadow ? MaterialShadow[0] : cs->colors[cs->mpiece/7][0],
+ shadow ? MaterialShadow[1] : cs->colors[cs->mpiece/7][1],
+ shadow ? MaterialShadow[2] : cs->colors[cs->mpiece/7][2],
+ (fabs(50.0-cs->steps))/50.0);
+
+ piece = cs->steps < 50 ? PAWN : QUEEN;
+
+ /* what a kludge */
+ if(cs->steps == 99)
+ cs->mpiece = cs->mpiece == PAWN ? QUEEN : BQUEEN;
+ }
+ else if(cs->mpiece % PIECES == KNIGHT) {
+ /* If there is nothing in the path of a knight, move it by sliding,
+ just like the other pieces. But if there are any pieces on the
+ middle two squares in its path, the knight would intersect them,
+ so in that case, move it in an airborne arc. */
+ GLfloat y;
+ int i, j;
+ Bool blocked_p = False;
+ int fromx = MIN(cs->from[1], cs->to[1]);
+ int fromy = MIN(cs->from[0], cs->to[0]);
+ int tox = MAX(cs->from[1], cs->to[1]);
+ int toy = MAX(cs->from[0], cs->to[0]);
+ if (fromx == tox-2) fromx = tox = fromx+1;
+ if (fromy == toy-2) fromy = toy = fromy+1;
+ for (i = fromy; i <= toy; i++) {
+ for (j = fromx; j <= tox; j++) {
+ if (cs->game.board[i][j]) {
+ blocked_p = True;
+ break;
+ }
+ }
+ }
+
+ if (!blocked_p)
+ goto SLIDE;
+
+ /* Move by hopping. */
+ y = 1.5 * sin (M_PI * cs->steps / 100.0);
+ glTranslatef(cs->from[1]+cs->steps*cs->dx, y,
+ cs->from[0]+cs->steps*cs->dz);
+
+ } else {
+ SLIDE:
+ /* Move by sliding. */
+ glTranslatef(cs->from[1]+cs->steps*cs->dx, 0.0, cs->from[0]+cs->steps*cs->dz);
+ }
+
+
+ if(!cs->wire)
+ glEnable(GL_BLEND);
+
+ glCallList(piece);
+ mi->polygon_count += cs->poly_counts[cs->mpiece % PIECES];
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+
+ glPopMatrix();
+
+ if(!cs->wire)
+ glDisable(GL_BLEND);
+}
+
+/** code to squish a taken piece */
+static void drawTakePiece(ModeInfo *mi, Chesscreen *cs, int shadow)
+{
+ if(!cs->wire)
+ glEnable(GL_BLEND);
+
+ glColor4f(shadow ? MaterialShadow[0] : cs->colors[cs->tpiece/7][0],
+ shadow ? MaterialShadow[1] : cs->colors[cs->tpiece/7][1],
+ shadow ? MaterialShadow[2] : cs->colors[cs->tpiece/7][2],
+ (100-1.6*cs->steps)/100.0);
+
+ glTranslatef(cs->to[1], 0.0, cs->to[0]);
+
+ if(cs->mpiece % PIECES == KNIGHT)
+ glScalef(1.0+cs->steps/100.0, 1.0, 1.0+cs->steps/100.0);
+ else
+ glScalef(1.0, 1 - cs->steps/50.0 > 0.01 ? 1 - cs->steps/50.0 : 0.01, 1.0);
+ glCallList(cs->tpiece % 7);
+ mi->polygon_count += cs->poly_counts[cs->tpiece % PIECES];
+
+ if(!cs->wire)
+ glDisable(GL_BLEND);
+}
+
+/** draw board */
+static void drawBoard(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ glBegin(GL_QUADS);
+
+ for(i = 0; i < BOARDSIZE; ++i)
+ for(j = 0; j < BOARDSIZE; ++j) {
+ double ma1 = (i+j)%2 == 0 ? cs->mod*i : 0.0;
+ double mb1 = (i+j)%2 == 0 ? cs->mod*j : 0.0;
+ double ma2 = (i+j)%2 == 0 ? cs->mod*(i+1.0) : 0.01;
+ double mb2 = (i+j)%2 == 0 ? cs->mod*(j+1.0) : 0.01;
+
+ /*glColor3fv(colors[(i+j)%2]);*/
+ glColor4f(cs->colors[(i+j)%2][0], cs->colors[(i+j)%2][1],
+ cs->colors[(i+j)%2][2], 0.65);
+
+ glNormal3f(0.0, 1.0, 0.0);
+/* glTexCoord2f(mod*i, mod*(j+1.0)); */
+ glTexCoord2f(ma1, mb2);
+ glVertex3f(i, 0.0, j + 1.0);
+/* glTexCoord2f(mod*(i+1.0), mod*(j+1.0)); */
+ glTexCoord2f(ma2, mb2);
+ glVertex3f(i + 1.0, 0.0, j + 1.0);
+ glTexCoord2f(ma2, mb1);
+/* glTexCoord2f(mod*(i+1.0), mod*j); */
+ glVertex3f(i + 1.0, 0.0, j);
+ glTexCoord2f(ma1, mb1);
+/* glTexCoord2f(mod*i, mod*j); */
+ glVertex3f(i, 0.0, j);
+
+ mi->polygon_count++;
+ }
+ glEnd();
+
+ {
+ GLfloat off = 0.01;
+ GLfloat w = BOARDSIZE;
+ GLfloat h = 0.1;
+
+ /* Give the board a slight lip. */
+ /* #### oops, normals are wrong here, but you can't tell */
+
+ glColor3f(0.3, 0.3, 0.3);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, -h, w);
+ glVertex3f (0, 0, w);
+
+ glVertex3f (0, 0, w);
+ glVertex3f (0, -h, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, 0, w);
+
+ glVertex3f (w, 0, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, 0, 0);
+
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, 0, 0);
+
+ glVertex3f (0, -h, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, -h, w);
+ glVertex3f (0, -h, w);
+ glEnd();
+ mi->polygon_count += 4;
+
+ /* Fill in the underside of the board with an invisible black box
+ to hide the reflections that are not on tiles. Probably there's
+ a way to do this with stencils instead.
+ */
+ w -= off*2;
+ h = 5;
+
+ glPushMatrix();
+ glTranslatef (off, 0, off);
+ glDisable(GL_LIGHTING);
+ glColor3f(0,0,0);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, -h, w);
+ glVertex3f (0, 0, w);
+
+ glVertex3f (0, 0, w);
+ glVertex3f (0, -h, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, 0, w);
+
+ glVertex3f (w, 0, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, 0, 0);
+
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, 0, 0);
+
+ glVertex3f (0, -h, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, -h, w);
+ glVertex3f (0, -h, w);
+ glEnd();
+ mi->polygon_count += 4;
+ glPopMatrix();
+ if (!cs->wire)
+ glEnable(GL_LIGHTING);
+ }
+}
+
+static void draw_pieces(ModeInfo *mi, Chesscreen *cs, int wire)
+{
+ if (!cs->wire) {
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glColor4f(0.5, 0.5, 0.5, 1.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+ }
+
+ drawPieces(mi, cs);
+ if(cs->moving) drawMovingPiece(mi, cs, 0);
+ if(cs->take) drawTakePiece(mi, cs, 0);
+ glDisable(GL_TEXTURE_2D);
+}
+
+static void draw_shadow_pieces(ModeInfo *mi, Chesscreen *cs, int wire)
+{
+ if (!cs->wire) {
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ }
+
+ /* use the stencil */
+ glDisable(GL_LIGHTING);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+
+ glClear(GL_STENCIL_BUFFER_BIT);
+ glColorMask(0,0,0,0);
+ glEnable(GL_STENCIL_TEST);
+
+ glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFFL);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
+
+
+ glPushMatrix();
+ glTranslatef(0.0, 0.001, 0.0);
+
+ /* draw the pieces */
+ drawPiecesShadow(mi, cs);
+ if(cs->moving) drawMovingPiece(mi, cs, shadows);
+ if(cs->take) drawTakePiece(mi, cs, shadows);
+
+ glPopMatrix();
+
+
+ /* turn on drawing into colour buffer */
+ glColorMask(1,1,1,1);
+
+ /* programming with effect */
+ glDisable(GL_LIGHTING);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_TEXTURE_2D);
+
+ /* now draw the union of the shadows */
+
+ /*
+ <todo>
+ want to keep alpha values (alpha is involved in transition
+ effects of the active pieces).
+ </todo>
+ */
+ glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFFL);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+
+ glEnable(GL_BLEND);
+
+ glColor4fv(MaterialShadow);
+
+ /* draw the board generously to fill the shadows */
+ glBegin(GL_QUADS);
+
+ glVertex3f(-1.0, 0.0, -1.0);
+ glVertex3f(-1.0, 0.0, BOARDSIZE + 1.0);
+ glVertex3f(1.0 + BOARDSIZE, 0.0, BOARDSIZE + 1.0);
+ glVertex3f(1.0 + BOARDSIZE, 0.0, -1.0);
+
+ glEnd();
+
+ glDisable(GL_STENCIL_TEST);
+
+ /* "pop" attributes */
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_COLOR_MATERIAL);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_CULL_FACE);
+
+
+
+}
+
+enum {X, Y, Z, W};
+enum {A, B, C, D};
+
+/* create a matrix that will project the desired shadow */
+static void shadowmatrix(GLfloat shadowMat[4][4],
+ GLfloat groundplane[4],
+ GLfloat lightpos[4])
+{
+ GLfloat dot;
+
+ /* find dot product between light position vector and ground plane normal */
+ dot = groundplane[X] * lightpos[X] +
+ groundplane[Y] * lightpos[Y] +
+ groundplane[Z] * lightpos[Z] +
+ groundplane[W] * lightpos[W];
+
+ shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
+ shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
+ shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
+ shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];
+
+ shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
+ shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
+ shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
+ shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];
+
+ shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
+ shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
+ shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
+ shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];
+
+ shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
+ shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
+ shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
+ shadowMat[3][3] = dot - lightpos[W] * groundplane[W];
+}
+
+/** reflectionboard */
+static void draw_reflections(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ glEnable(GL_STENCIL_TEST);
+ glStencilFunc(GL_ALWAYS, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ glColorMask(0,0,0,0);
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_DEPTH_TEST);
+ glBegin(GL_QUADS);
+
+ /* only draw white squares */
+ for(i = 0; i < BOARDSIZE; ++i) {
+ for(j = (BOARDSIZE+i) % 2; j < BOARDSIZE; j += 2) {
+ glVertex3f(i, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j);
+ glVertex3f(i, 0.0, j);
+ mi->polygon_count++;
+ }
+ }
+ glEnd();
+ glEnable(GL_DEPTH_TEST);
+
+ glColorMask(1, 1, 1, 1);
+ glStencilFunc(GL_EQUAL, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+
+ glPushMatrix();
+ glScalef(1.0, -1.0, 1.0);
+ glTranslatef(0.5, 0.0, 0.5);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+ draw_pieces(mi, cs, cs->wire);
+ glPopMatrix();
+
+ glDisable(GL_STENCIL_TEST);
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glColorMask(1,1,1,1);
+}
+
+/** draws the scene */
+static void display(ModeInfo *mi, Chesscreen *cs)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /** setup perspectiv */
+ glTranslatef(0.0, 0.0, -1.5*BOARDSIZE);
+ glRotatef(30.0, 1.0, 0.0, 0.0);
+ gltrackball_rotate (cs->trackball);
+
+ if (rotate)
+ glRotatef(cs->theta*100, 0.0, 1.0, 0.0);
+ glTranslatef(-0.5*BOARDSIZE, 0.0, -0.5*BOARDSIZE);
+
+/* cs->position[0] = 4.0 + 1.0*-sin(cs->theta*100*M_PI/180.0); */
+/* cs->position[2] = 4.0 + 1.0* cos(cs->theta*100*M_PI/180.0); */
+/* cs->position[1] = 5.0; */
+
+ /* this is the lone light that the shadow matrix is generated from */
+ cs->position[0] = 1.0;
+ cs->position[2] = 1.0;
+ cs->position[1] = 16.0;
+
+ cs->position2[0] = 4.0 + 8.0*-sin(cs->theta*100*M_PI/180.0);
+ cs->position2[2] = 4.0 + 8.0* cos(cs->theta*100*M_PI/180.0);
+
+ if (!cs->wire) {
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+ glLightfv(GL_LIGHT1, GL_POSITION, cs->position2);
+ glEnable(GL_LIGHT0);
+ }
+
+ /** draw board, pieces */
+ if(!cs->wire) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_COLOR_MATERIAL);
+
+ if(reflections && !cs->wire) {
+ draw_reflections(mi, cs);
+ glEnable(GL_BLEND);
+ }
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, cs->boardtexture);
+ drawBoard(mi, cs);
+ glDisable(GL_TEXTURE_2D);
+
+ if(shadows) {
+ /* render shadows */
+ GLfloat m[4][4];
+ shadowmatrix(m, cs->ground, cs->position);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+ glEnable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_DEPTH_TEST);
+
+ /* display ant shadow */
+ glPushMatrix();
+ glTranslatef(0.0, 0.001, 0.0);
+ glMultMatrixf(m[0]);
+ glTranslatef(0.5, 0.01, 0.5);
+ draw_shadow_pieces(mi, cs, cs->wire);
+ glPopMatrix();
+
+ glEnable(GL_LIGHTING);
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+ }
+
+ if(reflections)
+ glDisable(GL_BLEND);
+ }
+ else
+ drawBoard(mi, cs);
+
+ glTranslatef(0.5, 0.0, 0.5);
+ draw_pieces(mi, cs, cs->wire);
+
+ if(!cs->wire) {
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_LIGHTING);
+ }
+
+ if (!cs->button_down_p)
+ cs->theta += .002;
+}
+
+/** reshape handler */
+ENTRYPOINT void reshape_chess(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0,y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1/h, 2.0, 30.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+/** initialization handler */
+ENTRYPOINT void init_chess(ModeInfo *mi)
+{
+ Chesscreen *cs;
+ int screen = MI_SCREEN(mi);
+
+ MI_INIT(mi, qs);
+
+ cs = &qs[screen];
+ cs->window = MI_WINDOW(mi);
+ cs->wire = MI_IS_WIREFRAME(mi);
+ cs->trackball = gltrackball_init (False);
+
+ cs->oldwhite = -1;
+
+ cs->colors[0][0] = 1.0;
+ cs->colors[0][1] = 0.5;
+ cs->colors[0][2] = 0.0;
+
+ cs->colors[1][0] = 0.6;
+ cs->colors[1][1] = 0.6;
+ cs->colors[1][2] = 0.6;
+
+ cs->done = 1;
+ cs->count = 99;
+ cs->mod = 1.4;
+
+/* cs->position[0] = 0.0; */
+/* cs->position[1] = 5.0; */
+/* cs->position[2] = 5.0; */
+/* cs->position[3] = 1.0; */
+
+ cs->position[0] = 0.0;
+ cs->position[1] = 24.0;
+ cs->position[2] = 2.0;
+ cs->position[3] = 1.0;
+
+
+ cs->position2[0] = 5.0;
+ cs->position2[1] = 5.0;
+ cs->position2[2] = 5.0;
+ cs->position2[3] = 1.0;
+
+ cs->ground[0] = 0.0;
+ cs->ground[1] = 1.0;
+ cs->ground[2] = 0.0;
+ cs->ground[3] = -0.00001;
+
+ cs->oldgame = -1;
+
+
+ if((cs->glx_context = init_GL(mi)))
+ reshape_chess(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ else
+ MI_CLEARWINDOW(mi);
+
+ if (!cs->wire) {
+ glDepthFunc(GL_LEQUAL);
+ glClearStencil(0);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ make_piece_texture(cs);
+ make_board_texture(cs);
+ }
+ chessmodels_gen_lists( classic, cs->poly_counts);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ cs->wire = 0;
+# endif
+
+ if(!cs->wire) {
+ setup_lights(cs);
+ glColorMaterial(GL_FRONT, GL_DIFFUSE);
+ glShadeModel(smooth ? GL_SMOOTH : GL_FLAT);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_DEPTH_TEST);
+ }
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+}
+
+/** does dirty work drawing scene, moving pieces */
+ENTRYPOINT void draw_chess(ModeInfo *mi)
+{
+ Chesscreen *cs = &qs[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if(!cs->glx_context)
+ return;
+
+ glXMakeCurrent(disp, w, *(cs->glx_context));
+
+ /** code for moving a piece */
+ if(cs->moving && ++cs->steps == 100) {
+ cs->moving = cs->count = cs->steps = cs->take = 0;
+ cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]] = cs->mpiece;
+ ++cs->mc;
+
+ if(cs->mc == cs->game.movecount) {
+ cs->done = 1;
+ cs->mc = 0;
+ }
+ }
+
+ if(++cs->count == 100) {
+ if(!cs->done) {
+ cs->mpiece = cs->game.board[cs->game.moves[cs->mc][0]][cs->game.moves[cs->mc][1]];
+ cs->game.board[cs->game.moves[cs->mc][0]][cs->game.moves[cs->mc][1]] = NONE;
+
+ if((cs->tpiece = cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]])) {
+ cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]] = NONE;
+ cs->take = 1;
+ }
+
+ cs->from[0] = cs->game.moves[cs->mc][0];
+ cs->from[1] = cs->game.moves[cs->mc][1];
+ cs->to[0] = cs->game.moves[cs->mc][2];
+ cs->to[1] = cs->game.moves[cs->mc][3];
+
+ cs->dz = (cs->to[0] - cs->from[0]) / 100;
+ cs->dx = (cs->to[1] - cs->from[1]) / 100;
+ cs->steps = 0;
+ cs->moving = 1;
+ }
+ else if(cs->done == 1) {
+ int newgame = cs->oldgame;
+ while(newgame == cs->oldgame)
+ newgame = random()%GAMES;
+
+ /* mod the mod */
+ cs->mod = 0.6 + (random()%20)/10.0;
+
+ /* same old game */
+ cs->oldgame = newgame;
+ cs->game = games[cs->oldgame];
+ build_colors(cs);
+ cs->done = 2;
+ cs->count = 0;
+ }
+ else {
+ cs->done = 0;
+ cs->count = 0;
+ }
+ }
+
+ /* set lighting */
+ if(cs->done) {
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION,
+ cs->done == 1 ? 1.0+0.1*cs->count : 100.0/cs->count);
+ glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION,
+ cs->done == 1 ? 1.0+0.1*cs->count : 100.0/cs->count);
+ glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.14);
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.14);
+ }
+
+ display(mi, cs);
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+XSCREENSAVER_MODULE_2 ("Endgame", endgame, chess)
+
+#endif
diff --git a/hacks/glx/endgame.man b/hacks/glx/endgame.man
new file mode 100644
index 0000000..93ca5c3
--- /dev/null
+++ b/hacks/glx/endgame.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "5-May-2004"
+.SH NAME
+endgame \- endgame chess screensaver
+.SH SYNOPSIS
+.B endgame
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+endgame replays a brilliant chess ending
+.SH OPTIONS
+.I endgame
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-shadows
+Project pieces against the board with dark blend.
+.TP 8
+.B \-reflections
+Reflect pieces in light board squares.
+.TP 8
+.B \-classic
+Use the original low-polygon piece models.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+It's not unknown for this and other OpenGL hacks to fail under hardware accelaration (UtahGLX) and take the X server with them. Texture images must be 16x16 or 32x32 or 64x64 etc.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessb@unbc.ca>, 20-April-2002.
+
diff --git a/hacks/glx/energystream.c b/hacks/glx/energystream.c
new file mode 100644
index 0000000..7221f0d
--- /dev/null
+++ b/hacks/glx/energystream.c
@@ -0,0 +1,534 @@
+/* energystream, Copyright (c) 2016 Eugene Sandulenko <sev@scummvm.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Based on Public Domain code by konrad "yoghurt" zagorowicz
+ * for Tesla demo by Sunflower (http://www.pouet.net/prod.php?which=33)
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_stream 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include "rotator.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+static float change_time = 0;
+static float change_time1 = 25;
+static float change_time2 = 40;
+static float change_time3 = 60;
+
+#define DEF_STREAMS "16"
+
+#include <sys/time.h>
+#include <time.h>
+
+typedef struct timeval streamtime;
+
+#define GETSECS(t) ((t).tv_sec)
+#define GETMSECS(t) ((t).tv_usec/1000)
+
+#define DEF_SPIN "False"
+#define DEF_WANDER "False"
+#define DEF_SPEED "1.0"
+
+
+typedef struct {
+ float x, y, z;
+} Vector;
+
+typedef struct {
+ Vector *flares;
+ int num_flares;
+ GLuint flare_tex;
+ float speed;
+} flare_stream;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ time_t start_time;
+
+ int num_streams;
+ flare_stream *streams;
+
+} stream_configuration;
+
+static stream_configuration *ess = NULL;
+
+static int num_streams;
+static Bool do_spin;
+static GLfloat global_speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-streams", ".streams", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&num_streams, "streams", "Streams", DEF_STREAMS, t_Int},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&global_speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt stream_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static void gettime(streamtime *t)
+{
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(t, &tzp);
+#else /* !GETTIMEOFDAY_TWO_ARGS */
+ gettimeofday(t);
+#endif /* !GETTIMEOFDAY_TWO_ARGS */
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_stream (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ gluLookAt (0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear (GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+stream_handle_event (ModeInfo *mi, XEvent *event)
+{
+ stream_configuration *es = &ess[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, es->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &es->button_down_p))
+ return True;
+
+ return False;
+}
+
+#define TEX_WIDTH 256
+#define TEX_HEIGHT 256
+#define COEFF 0.2
+
+static GLuint gen_texture (void)
+{
+ int x, y, i;
+ float color;
+ GLuint tex;
+
+ unsigned char *texture = (unsigned char *)calloc (TEX_WIDTH * TEX_HEIGHT, 4);
+ unsigned char *ptr = texture;
+
+ float tint[3];
+ for (i = 0; i < 3; i++)
+ tint[i] = 1.0 * random() / RAND_MAX;
+
+ for (y = 0; y < TEX_HEIGHT; y++) {
+ for (x = 0; x < TEX_WIDTH; x++) {
+ color = 255 - sqrt((x - TEX_WIDTH / 2) * (x - TEX_WIDTH / 2) / COEFF
+ + (y - TEX_HEIGHT / 2) * (y - TEX_HEIGHT / 2) / COEFF);
+
+ if (color < 0)
+ color = 0;
+
+ for (i = 0; i < 3; i++)
+ ptr[i] = (unsigned char)(color * tint[i]);
+ ptr[3] = color ? 255 : 0;
+
+ ptr += 4;
+ }
+ }
+
+ glGenTextures (1, &tex);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture (GL_TEXTURE_2D, tex);
+#endif /* HAVE_GLBINDTEXTURE */
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ clear_gl_error ();
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
+ check_gl_error ("texture");
+
+ /* Texture parameters, LINEAR scaling for better texture quality */
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ free (texture);
+
+ return tex;
+}
+
+static inline void vector_copy (Vector *a, Vector *b)
+{
+ a->x = b->x;
+ a->y = b->y;
+ a->z = b->z;
+}
+
+/* a += b */
+static inline void vector_add (Vector *a, Vector *b)
+{
+ a->x += b->x;
+ a->y += b->y;
+ a->z += b->z;
+}
+
+/* a -= b */
+static inline void vector_sub (Vector *a, Vector *b)
+{
+ a->x -= b->x;
+ a->y -= b->y;
+ a->z -= b->z;
+}
+
+static void init_flare_stream (flare_stream *s, int num_flares, float bx, float by, float bz, float speed)
+{
+ int i;
+
+ s->flares = (Vector *) calloc (num_flares, sizeof (Vector));
+ s->num_flares = num_flares;
+ s->flare_tex = gen_texture();
+ s->speed = speed;
+
+ for (i = 0; i != s->num_flares; i++)
+ {
+ s->flares[i].x = -800.0f * random() / RAND_MAX - 1150 + bx;
+ s->flares[i].y = 10.0f * random() / RAND_MAX - 20 + by;
+ s->flares[i].z = 10.0f * random() / RAND_MAX - 20 + bz;
+ }
+}
+
+static void render_flare_stream (flare_stream *s, float cur_time, Vector *vx, Vector *vy, float alpha)
+{
+ float fMultipler = 1;
+ int i;
+
+ if (s->flare_tex == -1)
+ return;
+ if (!s->num_flares)
+ return;
+
+ if (cur_time < change_time)
+ return;
+
+ cur_time -= change_time;
+
+ glColor4f (1.0, 1, 1, alpha);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture (GL_TEXTURE_2D, s->flare_tex);
+#endif
+
+ glBegin (GL_QUADS);
+
+ if (cur_time + change_time > change_time1)
+ {
+ if (cur_time + change_time > change_time2)
+ {
+ fMultipler = 2.5;
+ }
+ else
+ fMultipler = 2;
+ }
+
+ for (i = 0; i != s->num_flares; i++)
+ {
+ Vector flare_pos;
+ Vector cc;
+
+ flare_pos.x = fmod (s->flares[i].x + cur_time * s->speed * fMultipler, 800) - 400;
+ flare_pos.y = s->flares[i].y + 2 * sin (cur_time * 7 + s->flares[i].x);
+ flare_pos.z = s->flares[i].z + 2 * cos (cur_time * 7 + i * 3.14);
+
+ glTexCoord2f (0, 0);
+ vector_copy (&cc, &flare_pos);
+ vector_sub (&cc, vx);
+ vector_add (&cc, vy);
+ glVertex3fv ((float *)&cc);
+
+ glTexCoord2f ( 1, 0 );
+ vector_copy (&cc, &flare_pos);
+ vector_add (&cc, vx);
+ vector_add (&cc, vy);
+ glVertex3fv ((float *)&cc);
+
+ glTexCoord2f ( 1, 1 );
+ vector_copy (&cc, &flare_pos);
+ vector_add (&cc, vx);
+ vector_sub (&cc, vy);
+ glVertex3fv ((float *)&cc);
+
+ glTexCoord2f ( 0, 1 );
+ vector_copy (&cc, &flare_pos);
+ vector_sub (&cc, vx);
+ vector_sub (&cc, vy);
+ glVertex3fv ((float *)&cc);
+ }
+
+ glEnd ();
+}
+
+ENTRYPOINT void
+init_stream (ModeInfo *mi)
+{
+ stream_configuration *es;
+ streamtime current_time;
+
+ MI_INIT (mi, ess);
+
+ es = &ess[MI_SCREEN(mi)];
+
+ es->glx_context = init_GL (mi);
+
+ reshape_stream (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ gettime (&current_time);
+ es->start_time = GETSECS(current_time) * 1000 + GETMSECS(current_time);
+
+ es->num_streams = num_streams;
+
+ es->streams = (flare_stream *) calloc (es->num_streams, sizeof(flare_stream));
+
+ init_flare_stream (&es->streams[0], 150, 0, 50, 0, 300);
+ init_flare_stream (&es->streams[1], 150, 0, 0, 0, 150);
+ init_flare_stream (&es->streams[2], 150, 0, 90, 60, 250);
+ init_flare_stream (&es->streams[3], 150, 0, -100, 30, 160);
+ init_flare_stream (&es->streams[4], 150, 0, 50, -100, 340);
+ init_flare_stream (&es->streams[5], 150, 0, -50, 50, 270 );
+ init_flare_stream (&es->streams[6], 150, 0, 100, 50, 180);
+ init_flare_stream (&es->streams[7], 150, 0, -30, 90, 130);
+
+ init_flare_stream (&es->streams[8], 150, 0, 150, 10, 200);
+ init_flare_stream (&es->streams[9], 150, 0, 100, -100, 210);
+ init_flare_stream (&es->streams[10], 150, 0, 190, 160, 220);
+ init_flare_stream (&es->streams[11], 150, 0, -200, 130, 230);
+ init_flare_stream (&es->streams[12], 150, 0, 150, -200, 240);
+ init_flare_stream (&es->streams[13], 150, 0, -150, 250, 160);
+ init_flare_stream (&es->streams[14], 150, 0, 200, 150, 230);
+ init_flare_stream (&es->streams[15], 150, 0, -130, 190, 250);
+
+ {
+ double spin_speed = 0.5 * global_speed;
+ double wander_speed = 0.02 * global_speed;
+ double spin_accel = 1.1;
+
+ es->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ es->trackball = gltrackball_init (True);
+ }
+}
+
+ENTRYPOINT void
+free_stream (ModeInfo * mi)
+{
+ stream_configuration *es = &ess[MI_SCREEN(mi)];
+ int i;
+
+ if (es->glx_context) {
+ glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *(es->glx_context));
+
+ for (i = 0; i < es->num_streams; i++) {
+ free (es->streams[i].flares);
+ glDeleteTextures (1, &es->streams[i].flare_tex);
+ }
+
+ free (es->streams);
+ }
+}
+
+
+static void inverse_matrix (float m[16]) {
+ double a,b,c,d,e,f,g,h,i,j,k,l;
+ register double dW;
+
+ a = m[ 0]; b = m[ 1]; c = m[ 2];
+ d = m[ 4]; e = m[ 5]; f = m[ 6];
+ g = m[ 8]; h = m[ 9]; i = m[10];
+ j = m[12]; k = m[13]; l = m[14];
+
+ dW = 1.0 / (a * (e * i - f * h)
+ - (b * (d * i - f * g)
+ + c * (e * g - d * h)));
+
+ m[ 0]= (float)((e * i - f * h) * dW);
+ m[ 1]= (float)((c * h - b * i) * dW);
+ m[ 2]= (float)((b * f - c * e) * dW);
+
+ m[ 4]= (float)((f * g - d * i) * dW);
+ m[ 5]= (float)((a * i - c * g) * dW);
+ m[ 6]= (float)((c * d - a * f) * dW);
+
+ m[ 8]= (float)((d * h - e * g) * dW);
+ m[ 9]= (float)((b * g - a * h) * dW);
+ m[10]= (float)((a * e - b * d) * dW);
+
+ m[12]= (float)((e * (g * l - i * j)
+ + f * (h * j - g * k)
+ - d * (h * l - i * k)) * dW);
+ m[13]= (float)((a * (h * l - i * k)
+ + b * (i * j - g * l)
+ + c * (g * k - h * j)) * dW);
+ m[14]= (float)((b * (d * l - f * j)
+ + c * (e * j - d * k)
+ - a * (e * l - f * k)) * dW);
+}
+
+ENTRYPOINT void
+draw_stream (ModeInfo *mi)
+{
+ stream_configuration *es = &ess[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ streamtime current_time;
+ float cur_time;
+ int i;
+ float alpha = 1.0;
+ Vector vx;
+ Vector vy;
+ GLfloat m[4*4];
+
+ if (!es->glx_context)
+ return;
+
+ gettime (&current_time);
+
+ cur_time = (float)(GETSECS(current_time) * 1000 + GETMSECS(current_time) - es->start_time) / 1000.0;
+ cur_time *= global_speed;
+
+ glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *(es->glx_context));
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ glFrustum (-.6f, .6f, -.45f, .45f, 1, 1000);
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+
+ glEnable (GL_LIGHTING);
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (0);
+
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
+
+ glTranslatef (0, 0, -300);
+ glRotatef (cur_time * 30, 1, 0, 0);
+ glRotatef (30 * sin(cur_time / 3) + 10, 0, 0, 1);
+
+ {
+ double x, y, z;
+ get_position (es->rot, &x, &y, &z, !es->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (es->trackball);
+
+ get_rotation (es->rot, &x, &y, &z, !es->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ if (cur_time > change_time1)
+ {
+ if (cur_time > change_time2)
+ {
+ glRotatef (90, 0, 1, 0);
+
+ if (cur_time > change_time3)
+ es->start_time = GETSECS(current_time) * 1000 + GETMSECS(current_time) - 5000;
+ }
+ else
+ {
+ glRotatef (180, 0, 1, 0);
+ }
+ }
+
+ glEnable ( GL_FOG);
+ glFogf (GL_FOG_START, 200);
+ glFogf (GL_FOG_END, 500);
+ glFogf (GL_FOG_MODE, GL_LINEAR);
+
+ glGetFloatv (GL_MODELVIEW_MATRIX, m);
+
+ inverse_matrix (m);
+
+ vx.x = m[0] * 10;
+ vx.y = m[1] * 10;
+ vx.z = m[2] * 10;
+
+ vy.x = m[4] * 10;
+ vy.y = m[5] * 10;
+ vy.z = m[6] * 10;
+
+ mi->polygon_count = 0;
+
+ for (i = 0; i != es->num_streams; i++)
+ {
+ mi->polygon_count += es->streams[i].num_flares;
+ render_flare_stream (&es->streams[i], cur_time, &vx, &vy, alpha);
+ }
+
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_FOG);
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers (dpy, window);
+}
+
+XSCREENSAVER_MODULE_2("EnergyStream", energystream, stream)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/energystream.man b/hacks/glx/energystream.man
new file mode 100644
index 0000000..c2591f3
--- /dev/null
+++ b/hacks/glx/energystream.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+energystream - a flow of particles which form an energy stream
+.SH SYNOPSIS
+.B energystream
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-wander]
+[\-no-spin]
+[\-fps]
+.SH DESCRIPTION
+Draws a set of flowing particles with camera flying around and through it.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-wander | \-no-wander
+Whether the camera should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the camera should spin.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Eugene Sandulenko. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Eugene Sandulenko.
diff --git a/hacks/glx/engine.c b/hacks/glx/engine.c
new file mode 100644
index 0000000..0f39b8d
--- /dev/null
+++ b/hacks/glx/engine.c
@@ -0,0 +1,1006 @@
+/*
+ * engine.c - GL representation of a 4 stroke engine
+ *
+ * version 2.00
+ *
+ * Copyright (C) 2001 Ben Buxton (bb@cactii.net)
+ * modified by Ed Beroset (beroset@mindspring.com)
+ * new to 2.0 version is:
+ * - command line argument to specify number of cylinders
+ * - command line argument to specify included angle of engine
+ * - removed broken command line argument to specify rotation speed
+ * - included crankshaft shapes and firing orders for real engines
+ * verified using the Bosch _Automotive Handbook_, 5th edition, pp 402,403
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+
+# define free_engine 0
+# define release_engine 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#include "texfont.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+/* lifted from lament.c */
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+
+#ifdef USE_GL
+
+#define DEF_ENGINE "(none)"
+#define DEF_TITLES "False"
+#define DEF_SPIN "True"
+#define DEF_MOVE "True"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static char *which_engine;
+static int move;
+static int spin;
+static Bool do_titles;
+
+static XrmOptionDescRec opts[] = {
+ {"-engine", ".engine.engine", XrmoptionSepArg, DEF_ENGINE },
+ {"-move", ".engine.move", XrmoptionNoArg, "True" },
+ {"+move", ".engine.move", XrmoptionNoArg, "False" },
+ {"-spin", ".engine.spin", XrmoptionNoArg, "True" },
+ {"+spin", ".engine.spin", XrmoptionNoArg, "False" },
+ { "-titles", ".engine.titles", XrmoptionNoArg, "True" },
+ { "+titles", ".engine.titles", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&which_engine, "engine", "Engine", DEF_ENGINE, t_String},
+ {&move, "move", "Move", DEF_MOVE, t_Bool},
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt engine_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct engine_description =
+{"engine", "init_engine", "draw_engine", NULL,
+ "draw_engine", "init_engine", NULL, &engine_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "A four stroke engine", 0, NULL};
+
+#endif
+
+/* these defines are used to provide symbolic means
+ * by which to refer to various portions or multiples
+ * of a cyle in degrees
+ */
+#define HALFREV 180
+#define ONEREV 360
+#define TWOREV 720
+
+#define MOVE_MULT 0.05
+
+#define RAND_RANGE(min, max) ((min) + (max - min) * f_rand())
+
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ GLfloat x, y, z; /* position */
+ GLfloat dx, dy, dz; /* position */
+ GLfloat an1, an2, an3; /* internal angle */
+ GLfloat nx, ny, nz; /* spin vector */
+ GLfloat a; /* spin angle */
+ GLfloat da; /* spin speed */
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ texture_font_data *font_data;
+ char *engine_name;
+ int engineType;
+ int movepaused;
+
+ float crankOffset;
+ float crankWidth;
+
+ int win_w, win_h;
+
+ float sin_table[TWOREV];
+ float cos_table[TWOREV];
+ float tan_table[TWOREV];
+
+ GLfloat boom_red[4];
+ GLfloat boom_lpos[4];
+ GLfloat boom_d, boom_wd;
+ int boom_time;
+
+ GLfloat viewer[3], lookat[3];
+
+ int display_a;
+ GLfloat ln[730], yp[730], ang[730];
+ int ln_init;
+ int lastPlug;
+
+ GLuint shaft_list, piston_list;
+ int shaft_polys, piston_polys;
+
+} Engine;
+
+static Engine *engine = NULL;
+
+static const GLfloat lightpos[] = {7.0, 7.0, 12, 1.0};
+static const GLfloat light_sp[] = {0.8, 0.8, 0.8, 0.5};
+static const GLfloat red[] = {1.0, 0, 0, 1.0};
+static const GLfloat green[] = {0.0, 1, 0, 1.0};
+static const GLfloat blue[] = {0, 0, 1, 1.0};
+static const GLfloat white[] = {1.0, 1, 1, 1.0};
+static const GLfloat yellow_t[] = {1, 1, 0, 0.4};
+
+static GLvoid normal(GLfloat [], GLfloat [], GLfloat [],
+ GLfloat *, GLfloat *, GLfloat *);
+
+/*
+ * this table represents both the firing order and included angle of engine.
+ * To simplify things, we always number from 0 starting at the flywheel and
+ * moving down the crankshaft toward the back of the engine. This doesn't
+ * always match manufacturer's schemes. For example, the Porsche 911 engine
+ * is a flat six with the following configuration (Porsche's numbering):
+ *
+ * 3 2 1
+ * |= firing order is 1-6-2-4-3-5 in this diagram
+ * 6 5 4
+ *
+ * We renumber these using our scheme but preserve the effective firing order:
+ *
+ * 0 2 4
+ * |= firing order is 4-1-2-5-0-3 in this diagram
+ * 1 3 5
+ *
+ * To avoid going completely insane, we also reorder these so the newly
+ * renumbered cylinder 0 is always first: 0-3-4-1-2-5
+ *
+ * For a flat 6, the included angle is 180 degrees (0 would be a inline
+ * engine). Because these are all four-stroke engines, each piston goes
+ * through 720 degrees of rotation for each time the spark plug sparks,
+ * so in this case, we would use the following angles:
+ *
+ * cylinder firing order angle
+ * -------- ------------ -----
+ * 0 0 0
+ * 1 3 360
+ * 2 4 240
+ * 3 1 600
+ * 4 2 480
+ * 5 5 120
+ *
+ */
+
+typedef struct
+{
+ int cylinders;
+ int includedAngle;
+ int pistonAngle[12]; /* twelve cylinders should suffice... */
+ int speed; /* step size in degrees for engine speed */
+ const char *engineName; /* currently unused */
+} engine_type;
+
+static const engine_type engines[] = {
+ { 3, 0, { 0, 240, 480, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Honda Insight" },
+ { 4, 0, { 0, 180, 540, 360, 0, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "BMW M3" },
+ { 4, 180, { 0, 360, 180, 540, 0, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "VW Beetle" },
+ { 5, 0, { 0, 576, 144, 432, 288, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Audi Quattro" },
+ { 6, 0, { 0, 240, 480, 120, 600, 360,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "BMW M5" },
+ { 6, 90, { 0, 360, 480, 120, 240, 600,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Subaru XT" },
+ { 6, 180, { 0, 360, 240, 600, 480, 120,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Porsche 911" },
+ { 8, 90, { 0, 450, 90, 180, 270, 360,
+ 540, 630, 0, 0, 0, 0 }, 15,
+ "Corvette Z06" },
+ {10, 90, { 0, 72, 432, 504, 288, 360,
+ 144, 216, 576, 648, 0, 0 }, 12,
+ "Dodge Viper" },
+ {12, 60, { 0, 300, 240, 540, 480, 60,
+ 120, 420, 600, 180, 360, 660 }, 12,
+ "Jaguar XKE" },
+};
+
+/* this define is just a little shorter way of referring to members of the
+ * table above
+ */
+#define ENG engines[e->engineType]
+
+/* given a number of cylinders and an included angle, finds matching engine */
+static int
+find_engine(char *name)
+{
+ unsigned int i;
+ char *s;
+
+ if (!name || !*name || !strcasecmp (name, "(none)"))
+ return (random() % countof(engines));
+
+ for (s = name; *s; s++)
+ if (*s == '-' || *s == '_') *s = ' ';
+
+ for (i = 0; i < countof(engines); i++) {
+ if (!strcasecmp(name, engines[i].engineName))
+ return i;
+ }
+
+ fprintf (stderr, "%s: unknown engine type \"%s\"\n", progname, name);
+ fprintf (stderr, "%s: available models are:\n", progname);
+ for (i = 0; i < countof(engines); i++) {
+ fprintf (stderr, "\t %-13s (%d cylinders",
+ engines[i].engineName, engines[i].cylinders);
+ if (engines[i].includedAngle == 0)
+ fprintf (stderr, ")\n");
+ else if (engines[i].includedAngle == 180)
+ fprintf (stderr, ", flat)\n");
+ else
+ fprintf (stderr, ", V)\n");
+ }
+ exit(1);
+}
+
+/* we use trig tables to speed things up - 200 calls to sin()
+ in one frame can be a bit harsh..
+*/
+
+static void make_tables(Engine *e)
+{
+ int i;
+ float f;
+
+ f = ONEREV / (M_PI * 2);
+ for (i = 0 ; i < TWOREV ; i++) {
+ e->sin_table[i] = sin(i/f);
+ }
+ for (i = 0 ; i < TWOREV ; i++) {
+ e->cos_table[i] = cos(i/f);
+ }
+ for (i = 0 ; i < TWOREV ; i++) {
+ e->tan_table[i] = tan(i/f);
+ }
+}
+
+/* if inner and outer are the same, we draw a cylinder, not a tube */
+/* for a tube, endcaps is 0 (none), 1 (left), 2 (right) or 3(both) */
+/* angle is how far around the axis to go (up to 360) */
+
+static int cylinder (Engine *e, GLfloat x, GLfloat y, GLfloat z,
+ float length, float outer, float inner, int endcaps, int sang, int eang)
+{
+ int polys = 0;
+ int a; /* current angle around cylinder */
+ int b = 0; /* previous */
+ int angle, norm, step, sangle;
+ float z1, y1, z2, y2, ex=0;
+ float Z1, Y1, Z2, Y2, xl;
+ GLfloat y2c[TWOREV], z2c[TWOREV];
+ int nsegs, tube = 0;
+
+ glPushMatrix();
+ nsegs = outer*(MAX(e->win_w, e->win_h)/200);
+ nsegs = MAX(nsegs, 6);
+ nsegs = MAX(nsegs, 40);
+ if (nsegs % 2)
+ nsegs += 1;
+ sangle = sang;
+ angle = eang;
+ z1 = e->cos_table[sangle]*outer+z; y1 = e->sin_table[sangle] * outer+y;
+ Z1 = e->cos_table[sangle] * inner+z; Y1 = e->sin_table[sangle]*inner+y ;
+ Z2 = z;
+ Y2 = y;
+ xl = x + length;
+ if (inner < outer && endcaps < 3) tube = 1;
+ step = ONEREV/nsegs;
+
+ glBegin(GL_QUADS);
+ for (a = sangle ; a <= angle || b <= angle ; a+= step) {
+ y2=outer*(float)e->sin_table[a]+y;
+ z2=outer*(float)e->cos_table[a]+z;
+ if (endcaps) {
+ y2c[a] = y2;
+ z2c[a] = z2; /* cache for later */
+ }
+ if (tube) {
+ Y2=inner*(float)e->sin_table[a]+y;
+ Z2=inner*(float)e->cos_table[a]+z;
+ }
+ glNormal3f(0, y1, z1);
+ glVertex3f(x,y1,z1);
+ glVertex3f(xl,y1,z1);
+ glNormal3f(0, y2, z2);
+ glVertex3f(xl,y2,z2);
+ glVertex3f(x,y2,z2);
+ polys++;
+ if (a == sangle && angle - sangle < ONEREV) {
+ if (tube)
+ glVertex3f(x, Y1, Z1);
+ else
+ glVertex3f(x, y, z);
+ glVertex3f(x, y1, z1);
+ glVertex3f(xl, y1, z1);
+ if (tube)
+ glVertex3f(xl, Z1, Z1);
+ else
+ glVertex3f(xl, y, z);
+ polys++;
+ }
+ if (tube) {
+ if (endcaps != 1) {
+ glNormal3f(-1, 0, 0); /* left end */
+ glVertex3f(x, y1, z1);
+ glVertex3f(x, y2, z2);
+ glVertex3f(x, Y2, Z2);
+ glVertex3f(x, Y1, Z1);
+ polys++;
+ }
+
+ glNormal3f(0, -Y1, -Z1); /* inner surface */
+ glVertex3f(x, Y1, Z1);
+ glVertex3f(xl, Y1, Z1);
+ glNormal3f(0, -Y2, -Z2);
+ glVertex3f(xl, Y2, Z2);
+ glVertex3f(x, Y2, Z2);
+ polys++;
+
+ if (endcaps != 2) {
+ glNormal3f(1, 0, 0); /* right end */
+ glVertex3f(xl, y1, z1);
+ glVertex3f(xl, y2, z2);
+ glVertex3f(xl, Y2, Z2);
+ glVertex3f(xl, Y1, Z1);
+ polys++;
+ }
+ }
+
+ z1=z2; y1=y2;
+ Z1=Z2; Y1=Y2;
+ b = a;
+ }
+ glEnd();
+
+ if (angle - sangle < ONEREV) {
+ GLfloat nx, ny, nz;
+ GLfloat v1[3], v2[3], v3[3];
+ v1[0] = x; v1[1] = y; v1[2] = z;
+ v2[0] = x; v2[1] = y1; v2[2] = z1;
+ v3[0] = xl; v3[1] = y1; v3[2] = z1;
+ normal(&v2[0], &v1[0], &v3[0], &nx, &ny, &nz);
+ glBegin(GL_QUADS);
+ glNormal3f(nx, ny, nz);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y1, z1);
+ glVertex3f(xl, y1, z1);
+ glVertex3f(xl, y, z);
+ polys++;
+ glEnd();
+ }
+ if (endcaps) {
+ GLfloat end, start;
+ if (tube) {
+ if (endcaps == 1) {
+ end = 0;
+ start = 0;
+ } else if (endcaps == 2) {
+ start = end = length+0.01;
+ } else {
+ end = length+0.02; start = -0.01;
+ }
+ norm = (ex == length+0.01) ? -1 : 1;
+ } else {
+ end = length;
+ start = 0;
+ norm = -1;
+ }
+
+ for(ex = start ; ex <= end ; ex += length) {
+ z1 = outer*e->cos_table[sangle]+z;
+ y1 = y+e->sin_table[sangle]*outer;
+ step = ONEREV/nsegs;
+ glBegin(GL_TRIANGLES);
+ b = 0;
+ for (a = sangle ; a <= angle || b <= angle; a+= step) {
+ glNormal3f(norm, 0, 0);
+ glVertex3f(x+ex,y, z);
+ glVertex3f(x+ex,y1,z1);
+ glVertex3f(x+ex,y2c[a],z2c[a]);
+ polys++;
+ y1 = y2c[a]; z1 = z2c[a];
+ b = a;
+ }
+ if (!tube) norm = 1;
+ glEnd();
+ }
+ }
+ glPopMatrix();
+ return polys;
+}
+
+/* this is just a convenience function to make a solid rod */
+static int rod (Engine *e, GLfloat x, GLfloat y, GLfloat z, float length, float diameter)
+{
+ return cylinder(e, x, y, z, length, diameter, diameter, 3, 0, ONEREV);
+}
+
+static GLvoid normal(GLfloat v1[], GLfloat v2[], GLfloat v3[],
+ GLfloat *nx, GLfloat *ny, GLfloat *nz)
+{
+ GLfloat x, y, z, X, Y, Z;
+
+ x = v2[0]-v1[0];
+ y = v2[1]-v1[1];
+ z = v2[2]-v1[2];
+ X = v3[0]-v1[0];
+ Y = v3[1]-v1[1];
+ Z = v3[2]-v1[2];
+
+ *nx = Y*z - Z*y;
+ *ny = Z*x - X*z;
+ *nz = X*y - Y*x;
+
+}
+
+
+
+static int Rect(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat t)
+{
+ int polys = 0;
+ GLfloat yh;
+ GLfloat xw;
+ GLfloat zt;
+
+ yh = y+h; xw = x+w; zt = z - t;
+
+ glBegin(GL_QUADS); /* front */
+ glNormal3f(0, 0, 1);
+ glVertex3f(x, y, z);
+ glVertex3f(x, yh, z);
+ glVertex3f(xw, yh, z);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* back */
+ glNormal3f(0, 0, -1);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, y, zt);
+ polys++;
+ /* top */
+ glNormal3f(0, 1, 0);
+ glVertex3f(x, yh, z);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ /* bottom */
+ glNormal3f(0, -1, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* left */
+ glNormal3f(-1, 0, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(x, yh, z);
+ polys++;
+ /* right */
+ glNormal3f(1, 0, 0);
+ glVertex3f(xw, y, z);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ glEnd();
+ return polys;
+}
+
+static int makepiston(Engine *e)
+{
+ int polys = 0;
+ GLfloat colour[] = {0.6, 0.6, 0.6, 1.0};
+
+ /* if (e->piston_list) glDeleteLists(1, e->piston_list); */
+ if (! e->piston_list) e->piston_list = glGenLists(1);
+ glNewList(e->piston_list, GL_COMPILE);
+ glRotatef(90, 0, 0, 1);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colour);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, colour);
+ glMateriali(GL_FRONT, GL_SHININESS, 20);
+ polys += cylinder(e, 0, 0, 0, 2, 1, 0.7, 2, 0, ONEREV); /* body */
+ colour[0] = colour[1] = colour[2] = 0.2;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colour);
+ polys += cylinder(e, 1.6, 0, 0, 0.1, 1.05, 1.05, 0, 0, ONEREV); /* ring */
+ polys += cylinder(e, 1.8, 0, 0, 0.1, 1.05, 1.05, 0, 0, ONEREV); /* ring */
+ glEndList();
+ return polys;
+}
+
+static int CrankBit(Engine *e, GLfloat x)
+{
+ int polys = 0;
+ polys += Rect(x, -1.4, 0.5, 0.2, 1.8, 1);
+ polys += cylinder(e, x, -0.5, 0, 0.2, 2, 2, 1, 60, 120);
+ return polys;
+}
+
+static int boom(Engine *e, GLfloat x, GLfloat y, int s)
+{
+ int polys = 0;
+ int flameOut = 720/ENG.speed/ENG.cylinders;
+
+ if (e->boom_time == 0 && s) {
+ e->boom_red[0] = e->boom_red[1] = 0;
+ e->boom_d = 0.05;
+ e->boom_time++;
+ glEnable(GL_LIGHT1);
+ } else if (e->boom_time == 0 && !s) {
+ return polys;
+ } else if (e->boom_time >= 8 && e->boom_time < flameOut && !s) {
+ e->boom_time++;
+ e->boom_red[0] -= 0.2; e->boom_red[1] -= 0.1;
+ e->boom_d-= 0.04;
+ } else if (e->boom_time >= flameOut) {
+ e->boom_time = 0;
+ glDisable(GL_LIGHT1);
+ return polys;
+ } else {
+ e->boom_red[0] += 0.2; e->boom_red[1] += 0.1;
+ e->boom_d += 0.04;
+ e->boom_time++;
+ }
+ e->boom_lpos[0] = x-e->boom_d; e->boom_lpos[1] = y;
+ glLightfv(GL_LIGHT1, GL_POSITION, e->boom_lpos);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, e->boom_red);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, e->boom_red);
+ glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 1.3);
+ glLighti(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0);
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, e->boom_red);
+ e->boom_wd = e->boom_d*3;
+ if (e->boom_wd > 0.7) e->boom_wd = 0.7;
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ polys += rod(e, x, y, 0, e->boom_d, e->boom_wd);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ return polys;
+}
+
+static int display(ModeInfo *mi)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+ int polys = 0;
+ GLfloat zb, yb;
+ float rightSide;
+ int half;
+ int sides;
+ int j, b;
+
+ glEnable(GL_LIGHTING);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ gluLookAt(e->viewer[0], e->viewer[1], e->viewer[2],
+ e->lookat[0], e->lookat[1], e->lookat[2],
+ 0.0, 1.0, 0.0);
+ glPushMatrix();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_sp);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_sp);
+
+ if (move) {
+ double x, y, z;
+ get_position (e->rot, &x, &y, &z, !e->button_down_p);
+ glTranslatef(x*16-9, y*14-7, z*16-10);
+ }
+
+ if (spin) {
+ double x, y, z;
+
+ gltrackball_rotate (e->trackball);
+
+ get_rotation(e->rot, &x, &y, &z, !e->button_down_p);
+ glRotatef(x*ONEREV, 1.0, 0.0, 0.0);
+ glRotatef(y*ONEREV, 0.0, 1.0, 0.0);
+ glRotatef(x*ONEREV, 0.0, 0.0, 1.0);
+ }
+
+/* So the rotation appears around the centre of the engine */
+ glTranslatef(-5, 0, 0);
+
+/* crankshaft */
+ glPushMatrix();
+ glRotatef(e->display_a, 1, 0, 0);
+ glCallList(e->shaft_list);
+ polys += e->shaft_polys;
+ glPopMatrix();
+
+ /* init the ln[] matrix for speed */
+ if (e->ln_init == 0) {
+ for (e->ln_init = 0 ; e->ln_init < countof(e->sin_table) ; e->ln_init++) {
+ zb = e->sin_table[e->ln_init];
+ yb = e->cos_table[e->ln_init];
+ /* y ordinate of piston */
+ e->yp[e->ln_init] = yb + sqrt(25 - (zb*zb));
+ /* length of rod */
+ e->ln[e->ln_init] = sqrt(zb*zb + (yb-e->yp[e->ln_init])*(yb-e->yp[e->ln_init]));
+ /* angle of connecting rod */
+ e->ang[e->ln_init] = asin(zb/5)*57;
+ e->ang[e->ln_init] *= -1;
+ }
+ }
+
+ glPushMatrix();
+ sides = (ENG.includedAngle == 0) ? 1 : 2;
+ for (half = 0; half < sides; half++, glRotatef(ENG.includedAngle,1,0,0))
+ {
+ /* pistons */
+ /* glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white); */
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ b = (e->display_a + ENG.pistonAngle[j+half]) % ONEREV;
+ glPushMatrix();
+ glTranslatef(e->crankWidth/2 + e->crankOffset*(j+half), e->yp[b]-0.3, 0);
+ glCallList(e->piston_list);
+ polys += e->piston_polys;
+ glPopMatrix();
+ }
+ /* spark plugs */
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ polys += cylinder(e, 8.5, -e->crankWidth/2-e->crankOffset*(j+half), 0,
+ 0.5, 0.4, 0.3, 1, 0, ONEREV);
+ }
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white);
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ polys += rod(e, 8, -e->crankWidth/2-e->crankOffset*(j+half), 0, 0.5, 0.2);
+ polys += rod(e, 9, -e->crankWidth/2-e->crankOffset*(j+half), 0, 1, 0.15);
+ }
+
+ /* rod */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ b = (e->display_a+HALFREV+ENG.pistonAngle[j+half]) % TWOREV;
+ glPushMatrix();
+ glRotatef(e->ang[b], 0, 1, 0);
+ polys += rod(e,
+ -e->cos_table[b],
+ -e->crankWidth/2-e->crankOffset*(j+half),
+ -e->sin_table[b],
+ e->ln[b], 0.2);
+ glPopMatrix();
+ }
+ glPopMatrix();
+
+ /* engine block */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, yellow_t);
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ rightSide = (sides > 1) ? 0 : 1.6;
+ /* left plate */
+ polys += Rect(-e->crankWidth/2, -0.5, 1, 0.2, 9, 2);
+ /* right plate */
+ polys += Rect(0.3+e->crankOffset*ENG.cylinders-rightSide, -0.5, 1, 0.2, 9, 2);
+ /* head plate */
+ polys += Rect(-e->crankWidth/2+0.2, 8.3, 1,
+ e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 2);
+ /* front rail */
+ polys += Rect(-e->crankWidth/2+0.2, 3, 1,
+ e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 0.2);
+ /* back rail */
+ polys += Rect(-e->crankWidth/2+0.2, 3, -1+0.2,
+ e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 0.2);
+ /* plates between cylinders */
+ for (j=0; j < ENG.cylinders - (sides == 1); j += sides)
+ polys += Rect(0.4+e->crankWidth+e->crankOffset*(j-half), 3, 1, 1, 5.3, 2);
+ glDepthMask(GL_TRUE);
+ }
+ glPopMatrix();
+
+ /* see which of our plugs should fire now, if any */
+ for (j = 0; j < ENG.cylinders; j++)
+ {
+ if (0 == ((e->display_a + ENG.pistonAngle[j]) % TWOREV))
+ {
+ glPushMatrix();
+ if (j & 1)
+ glRotatef(ENG.includedAngle,1,0,0);
+ glRotatef(90, 0, 0, 1);
+ polys += boom(e, 8, -e->crankWidth/2-e->crankOffset*j, 1);
+ e->lastPlug = j;
+ glPopMatrix();
+ }
+ }
+
+ if (e->lastPlug != j)
+ {
+ /* this code causes the last plug explosion to dim gradually */
+ if (e->lastPlug & 1)
+ glRotatef(ENG.includedAngle, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+ polys += boom(e, 8, -e->crankWidth/2-e->crankOffset*e->lastPlug, 0);
+ }
+ glDisable(GL_BLEND);
+
+ e->display_a += ENG.speed;
+ if (e->display_a >= TWOREV)
+ e->display_a = 0;
+ glPopMatrix();
+ glFlush();
+ return polys;
+}
+
+static int makeshaft (Engine *e)
+{
+ int polys = 0;
+ int j;
+ float crankThick = 0.2;
+ float crankDiam = 0.3;
+
+ /* if (e->shaft_list) glDeleteLists(1, e->shaft_list); */
+ if (! e->shaft_list) e->shaft_list = glGenLists(1);
+ glNewList(e->shaft_list, GL_COMPILE);
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ /* draw the flywheel */
+ polys += cylinder(e, -2.5, 0, 0, 1, 3, 2.5, 0, 0, ONEREV);
+ polys += Rect(-2, -0.3, 2.8, 0.5, 0.6, 5.6);
+ polys += Rect(-2, -2.8, 0.3, 0.5, 5.6, 0.6);
+
+ /* now make each of the shaft bits between the cranks,
+ * starting from the flywheel end which is at X-coord 0.
+ * the first cranskhaft bit is always 2 units long
+ */
+ polys += rod(e, -2, 0, 0, 2, crankDiam);
+
+ /* Each crank is crankWidth units wide and the total width of a
+ * cylinder assembly is 3.3 units. For inline engines, there is just
+ * a single crank per cylinder width. For other engine
+ * configurations, there is a crank between each pair of adjacent
+ * cylinders on one side of the engine, so the crankOffset length is
+ * halved.
+ */
+ e->crankOffset = 3.3;
+ if (ENG.includedAngle != 0)
+ e->crankOffset /= 2;
+ for (j = 0; j < ENG.cylinders - 1; j++)
+ polys += rod(e,
+ e->crankWidth - crankThick + e->crankOffset*j, 0, 0,
+ e->crankOffset - e->crankWidth + 2 * crankThick, crankDiam);
+ /* the last bit connects to the engine wall on the non-flywheel end */
+ polys += rod(e, e->crankWidth - crankThick + e->crankOffset*j, 0, 0, 0.9, crankDiam);
+
+
+ for (j = 0; j < ENG.cylinders; j++)
+ {
+ glPushMatrix();
+ if (j & 1)
+ glRotatef(HALFREV+ENG.pistonAngle[j]+ENG.includedAngle,1,0,0);
+ else
+ glRotatef(HALFREV+ENG.pistonAngle[j],1,0,0);
+ /* draw wrist pin */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ polys += rod(e, e->crankOffset*j, -1.0, 0.0, e->crankWidth, crankDiam);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ /* draw right part of crank */
+ polys += CrankBit(e, e->crankOffset*j);
+ /* draw left part of crank */
+ polys += CrankBit(e, e->crankWidth-crankThick+e->crankOffset*j);
+ glPopMatrix();
+ }
+ glEndList();
+ return polys;
+}
+
+
+ENTRYPOINT void reshape_engine(ModeInfo *mi, int width, int height)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(40, 1/h, 1.5, 70.0);
+ glMatrixMode(GL_MODELVIEW);
+ e->win_h = height;
+ e->win_w = width;
+}
+
+
+ENTRYPOINT void init_engine(ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ Engine *e;
+
+ MI_INIT(mi, engine);
+ e = &engine[screen];
+ e->window = MI_WINDOW(mi);
+
+ e->x = e->y = e->z = e->a = e->an1 = e->nx = e->ny = e->nz =
+ e->dx = e->dy = e->dz = e->da = 0;
+
+ if (move) {
+ e->dx = (float)(random() % 1000)/30000;
+ e->dy = (float)(random() % 1000)/30000;
+ e->dz = (float)(random() % 1000)/30000;
+ } else {
+ e->viewer[0] = 0; e->viewer[1] = 2; e->viewer[2] = 18;
+ e->lookat[0] = 0; e->lookat[1] = 0; e->lookat[2] = 0;
+
+ }
+ if (spin) {
+ e->da = (float)(random() % 1000)/125 - 4;
+ e->nx = (float)(random() % 100) / 100;
+ e->ny = (float)(random() % 100) / 100;
+ e->nz = (float)(random() % 100) / 100;
+ }
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.01;
+
+ e->crankWidth = 1.5;
+ e->boom_red[3] = 0.9;
+ e->boom_lpos[3] = 1;
+
+ e->viewer[2] = 30;
+
+ e->rot = make_rotator (spin ? spin_speed : 0,
+ spin ? spin_speed : 0,
+ spin ? spin_speed : 0,
+ 1.0,
+ move ? wander_speed : 0,
+ True);
+
+ e->trackball = gltrackball_init (True);
+ }
+
+ if (!e->glx_context && /* re-initting breaks print_texture_label */
+ (e->glx_context = init_GL(mi)) != NULL) {
+ reshape_engine(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_NORMALIZE);
+ make_tables(e);
+ e->engineType = find_engine(which_engine);
+
+ if (!e->engine_name)
+ e->engine_name = malloc(200);
+ sprintf (e->engine_name,
+ "%s\n%s%d%s",
+ engines[e->engineType].engineName,
+ (engines[e->engineType].includedAngle == 0 ? "" :
+ engines[e->engineType].includedAngle == 180 ? "Flat " : "V"),
+ engines[e->engineType].cylinders,
+ (engines[e->engineType].includedAngle == 0 ? " Cylinder" : "")
+ );
+
+ e->shaft_polys = makeshaft(e);
+ e->piston_polys = makepiston(e);
+
+ if (!e->font_data)
+ e->font_data = load_texture_font (mi->dpy, "titleFont");
+}
+
+ENTRYPOINT Bool
+engine_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1) {
+ e->movepaused = 0;
+ }
+
+ if (gltrackball_event_handler (event, e->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &e->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ which_engine = NULL; /* randomize */
+ init_engine(mi);
+ return True;
+ }
+
+ return False;
+}
+
+ENTRYPOINT void draw_engine(ModeInfo *mi)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if (!e->glx_context)
+ return;
+
+ glXMakeCurrent(disp, w, *(e->glx_context));
+
+
+ mi->polygon_count = display(mi);
+
+ glColor3f (1, 1, 0);
+ if (do_titles)
+ print_texture_label (mi->dpy, e->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, e->engine_name);
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+XSCREENSAVER_MODULE ("Engine", engine)
+
+#endif
diff --git a/hacks/glx/engine.man b/hacks/glx/engine.man
new file mode 100644
index 0000000..af794e5
--- /dev/null
+++ b/hacks/glx/engine.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+engine - draws a 3D four-stroke engine.
+.SH SYNOPSIS
+.B engine
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-engine \fIname\fP]
+[\-delay \fInumber\fP]
+[\-no-move]
+[\-no-spin]
+[\-no-title]
+[\-fps]
+.SH DESCRIPTION
+Draws a simple four-stroke engine that floats around the screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-engine \fIname\fP
+What kind of engine to draw. Default: random.
+Known models are:
+"Honda Insight" (3),
+"BMW M3" (4),
+"VW Beetle" (flat 4),
+"Audi Quattro" (5),
+"BMW M5" (6),
+"Subaru XT" (V6),
+"Porsche 911" (flat 6),
+"Corvette Z06" (V8),
+"Dodge Viper" (V10),
+and
+"Jaguar XKE" (V12).
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-move | \-no-move
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-title | \-no-title
+Whether to display the name of the engine being rendered.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ben Buxton.
diff --git a/hacks/glx/erase-gl.c b/hacks/glx/erase-gl.c
new file mode 100644
index 0000000..8515dd9
--- /dev/null
+++ b/hacks/glx/erase-gl.c
@@ -0,0 +1,38 @@
+/* Copyright (c) 2017 Dave Odell <dmo2118@gmail.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * xlockmore.c has references to erase_window, but it never calls these when
+ * running OpenGL hacks. Using this in place of regular utils/erase.c saves a
+ * tiny bit of code/disk space with a native X11 build, where everything is
+ * statically linked together.
+ *
+ * (Linux, amd64, CFLAGS='-O2 -g')
+ * Before: -rwxr-xr-x 1 david david 545848 Aug 9 20:42 hilbert
+ * After: -rwxr-xr-x 1 david david 519344 Aug 9 20:41 hilbert
+ *
+ * (Linux, amd64, CFLAGS=-O2)
+ * Before: -rwxr-xr-x 1 david david 150168 Aug 9 20:40 hilbert
+ * After: -rwxr-xr-x 1 david david 141256 Aug 9 20:39 hilbert
+ */
+
+#include "utils.h"
+#include "erase.h"
+
+void
+eraser_free (eraser_state *st)
+{
+}
+
+
+eraser_state *
+erase_window (Display *dpy, Window window, eraser_state *st)
+{
+ return st;
+}
diff --git a/hacks/glx/esper.c b/hacks/glx/esper.c
new file mode 100644
index 0000000..7a0bb0b
--- /dev/null
+++ b/hacks/glx/esper.c
@@ -0,0 +1,2412 @@
+/* esper, Copyright (c) 2017-2018 Jamie Zawinski <jwz@jwz.org>
+ * Enhance 224 to 176. Pull out track right. Center in pull back.
+ * Pull back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left.
+ * Gimme a hardcopy right there.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ The Esper machine has a 4:3 display, about 12" diagonal.
+ The display is overlayed with a 10x7 grid of blue lines.
+ The scene goes approximately like this:
+
+ "Enhance 224 To 176."
+
+ ZM 0000 NS 0000 EW 0000
+
+ The reticle is displayed centered.
+ It moves in 8 steps with 3 frame blur to move to around to grid 1,4.
+
+ ZM 0000 NS 0000 EW 0000
+ ZM 0000 NS 0001 EW 0001
+ ZM 0000 NS 0001 EW 0002
+ ZM 0000 NS 0002 EW 0003
+ ZM 0000 NS 0003 EW 0005
+ ZM 0000 NS 0004 EW 0008
+ ZM 0000 NS 0015 EW 0011
+
+ These numbers appear to have little relation to what we are
+ actually seeing on the screen. Also the same numbers are
+ repeated later when looking at totally different parts of
+ the photograph.
+
+ ZM 0000 NS 0117 EW 0334
+
+ The box appears: 8 steps, final box is 1.5x2.25 at -0.5,4.0.
+
+ ZM 4086 NS 0117 EW 0334
+
+ The box blinks yellow 5x.
+ The image's zoom-and-pan takes 8 steps, with no text on the screen.
+ The zoom is in discreet steps, with flashes.
+ The grid stays the same size the whole time.
+ The flashes look like solarization to blue.
+ When the zoom is finished, there is still no text.
+
+ "Enhance." Goes 4 more ticks down the same hole?
+ "Stop." Moves up a little bit at the end.
+
+ Then with no instructions, it goes 20 ticks by itself, off camera.
+
+ "Move in." 10 ticks.
+ "Stop." (We are looking at a fist in the picture.)
+ "Pull out track right."
+ "Stop." (We are looking at a newspaper.)
+ "Center and pull back."
+ "Stop." (We just passed the round mirror.)
+ "Track 45 right."
+ "Stop."
+ "Center and stop."
+
+ This time there was no grid until it stopped, then the grid showed up.
+ There is video tearing at the bottom.
+
+ "Enhance 34 to 36."
+
+ ZM 0000 NS 0063 EW 0185
+ ZM 0000 NS 0197 EW 0334
+ ZM 3841 NS 0197 EW 0334
+
+ It kind of zooms in to the center wobbly and willy-nilly.
+ We are now looking at a glass.
+
+ "Pan right and pull back." (There is no grid while moving again.)
+ "Stop."
+
+ Ok, at this point, we enter fantasy-land. From here on, the images
+ shown are very high resolution with no noise. And suddenly the
+ UI on the Esper is *way* higher resolution. My theory is that from
+ this point on in the scene, we are not looking at the literal Esper
+ machine, but instead the movie is presenting Decard's perception of
+ it. We're seeing the room, not the photo of the room. The map has
+ become the territory.
+
+ "Enhance 34 to 46."
+
+ ZM 0000 NS 0197 EW 0334
+
+ This has the reticle and box only, no grid, ends with no grid.
+
+ "Pull back."
+ "Wait a minute. Go right."
+ "Stop."
+ Now it's going around the corner or something.
+
+ "Enhance 57 19."
+ This has a reticle then box, but the image started zooming early.
+
+ "Track 45 left."
+ zooms out and moves left
+
+ "Stop." (O hai Zhora.)
+ "Enhance 15 to 23."
+
+ ZM 3852 NS 0197 EW 0334
+
+ "Gimme a hardcopy right there."
+
+ The printer polaroid is WAY lower resolution than the image we see on
+ the "screen" -- in keeping with my theory that we were not seeing the
+ screen.
+
+
+ TODO:
+
+ * There's a glitch at the top/bottom of the texfont textures.
+ * "Pull back" isn't quite symmetric: zoom origin is slightly off.
+ * Maybe display text like "Pull right" and "Stop".
+*/
+
+
+/* Use a small point size to keep it nice and grainy. */
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define TITLE_FONT "OCR A Std 10, Lucida Console 10, Monaco 10"
+#elif 0 /* real X11, XQueryFont() */
+# define TITLE_FONT "-*-courier-bold-r-*-*-*-100-*-*-m-*-*-*"
+#else /* real X11, load_font_retry() */
+# define TITLE_FONT "-*-ocr a std-medium-r-*-*-*-100-*-*-m-*-*-*"
+#endif
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*fpsTop: True \n" \
+ "*useSHM: True \n" \
+ "*titleFont: " TITLE_FONT "\n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n" \
+ "*gridColor: #4444FF\n" \
+ "*reticleColor: #FFFF77\n" \
+ "*textColor: #FFFFBB\n" \
+
+# define free_esper 0
+# define refresh_esper 0
+# define release_esper 0
+# include "xlockmore.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#ifdef USE_GL
+
+#undef SMOOTH
+
+# define DEF_GRID_SIZE "11"
+# define DEF_GRID_THICKNESS "15"
+# define DEF_TITLES "True"
+# define DEF_SPEED "1.0"
+# define DEF_DEBUG "False"
+
+#include "grab-ximage.h"
+#include "texfont.h"
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h" /* to get <sys/shm.h> */
+#endif
+
+
+typedef struct {
+ double x, y, w, h;
+} rect;
+
+typedef struct {
+ ModeInfo *mi;
+ unsigned long id; /* unique */
+ char *title; /* the filename of this image */
+ int w, h; /* size in pixels of the image */
+ int tw, th; /* size in pixels of the texture */
+ XRectangle geom; /* where in the image the bits are */
+ Bool loaded_p; /* whether the image has finished loading */
+ Bool used_p; /* whether the image has yet appeared
+ on screen */
+ GLuint texid; /* which texture contains the image */
+ int refcount; /* how many sprites refer to this image */
+} image;
+
+
+typedef enum {
+ BLANK,
+ GRID_ON,
+ IMAGE_LOAD,
+ IMAGE_UNLOAD,
+ IMAGE_FORCE_UNLOAD,
+ REPOSITION,
+ RETICLE_ON,
+ RETICLE_MOVE,
+ BOX_MOVE,
+ IMAGE_ZOOM,
+ MANUAL_RETICLE_ON,
+ MANUAL_RETICLE,
+ MANUAL_BOX_ON,
+ MANUAL_BOX,
+} anim_state;
+
+typedef enum { NEW, IN, FULL, OUT, DEAD } sprite_state;
+typedef enum { IMAGE, RETICLE, BOX, GRID, FLASH, TEXT } sprite_type;
+
+typedef struct {
+ unsigned long id; /* unique */
+ sprite_type type;
+ image *img; /* type = IMAGE */
+ unsigned long text_id; /* type = TEXT */
+ char *text;
+ GLfloat opacity;
+ GLfloat thickness_scale; /* line and image types */
+ Bool throb_p;
+ double start_time; /* when this animation began */
+ double duration; /* lifetime of sprite in seconds; 0 = inf */
+ double fade_duration; /* speed of fade in and fade out */
+ double pause_duration; /* delay before fade-in starts */
+ Bool remain_p; /* pause forever before fade-out */
+ rect from, to, current; /* the journey this image is taking */
+ sprite_state state; /* the state we're in right now */
+ double state_time; /* time of last state change */
+ int frame_count; /* frames since last state change */
+ Bool fatbits_p; /* For image texture rendering */
+ Bool back_p; /* If BOX, zooming out, not in */
+} sprite;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ int nimages; /* how many images are loaded or loading now */
+ image *images[10]; /* pointers to the images */
+
+ int nsprites; /* how many sprites are animating right now */
+ sprite *sprites[100]; /* pointers to the live sprites */
+
+ double now; /* current time in seconds */
+ double dawn_of_time; /* when the program launched */
+ double image_load_time; /* time when we last loaded a new image */
+
+ texture_font_data *font_data;
+
+ int sprite_id, image_id; /* debugging id counters */
+
+ GLfloat grid_color[4], reticle_color[4], text_color[4];
+
+ anim_state anim_state; /* Counters for global animation state, */
+ double anim_start, anim_duration;
+
+ Bool button_down_p;
+
+} esper_state;
+
+static esper_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static int grid_size;
+static int grid_thickness;
+
+static Bool do_titles; /* Display image titles. */
+static GLfloat speed;
+static Bool debug_p; /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-titles", ".titles", XrmoptionNoArg, "True" },
+ { "-no-titles", ".titles", XrmoptionNoArg, "False" },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ { &grid_size, "gridSize", "GridSize", DEF_GRID_SIZE, t_Int},
+ { &grid_thickness,"gridThickness","GridThickness",DEF_GRID_THICKNESS, t_Int},
+ { &do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float},
+ { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt esper_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+static const char *
+state_name (anim_state s)
+{
+ switch (s) {
+ case BLANK: return "BLANK";
+ case GRID_ON: return "GRID_ON";
+ case IMAGE_LOAD: return "IMAGE_LOAD";
+ case IMAGE_UNLOAD: return "IMAGE_UNLOAD";
+ case IMAGE_FORCE_UNLOAD: return "IMAGE_FORCE_UNLOAD";
+ case REPOSITION: return "REPOSITION";
+ case RETICLE_ON: return "RETICLE_ON";
+ case RETICLE_MOVE: return "RETICLE_MOVE";
+ case BOX_MOVE: return "BOX_MOVE";
+ case IMAGE_ZOOM: return "IMAGE_ZOOM";
+ case MANUAL_BOX_ON: return "MANUAL_BOX_ON";
+ case MANUAL_BOX: return "MANUAL_BOX";
+ case MANUAL_RETICLE_ON: return "MANUAL_RETICLE_ON";
+ case MANUAL_RETICLE: return "MANUAL_RETICLE";
+ default: return "UNKNOWN";
+ }
+}
+
+
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure);
+
+
+/* Allocate an image structure and start a file loading in the background.
+ */
+static image *
+alloc_image (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = (image *) calloc (1, sizeof (*img));
+
+ img->id = ++ss->image_id;
+ img->loaded_p = False;
+ img->used_p = False;
+ img->mi = mi;
+
+ glGenTextures (1, &img->texid);
+ if (img->texid <= 0) abort();
+
+ ss->image_load_time = ss->now;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, img);
+ else
+ {
+ /* If possible, load images at much higher resolution than the window,
+ to facilitate deep zooms.
+ */
+ int max_max = 4096; /* ~12 megapixels */
+ int max = 0;
+
+# if defined(HAVE_XSHM_EXTENSION) && \
+ !defined(HAVE_MOBILE) && \
+ !defined(HAVE_COCOA)
+
+ /* Try not to ask for an image larger than the SHM segment size.
+ If XSHM fails in a real-X11 world, it can take a staggeringly long
+ time to transfer the image bits from the server over Xproto -- like,
+ *18 seconds* for 4096 px and 8 seconds for 3072 px on MacOS XQuartz.
+ What madness is this?
+ */
+ unsigned long shmmax = 0;
+
+# if defined(SHMMAX)
+ /* Linux 2.6 defines this to be 0x2000000, but on CentOS 6.9,
+ "sysctl kernel.shmmax" reports a luxurious 0x1000000000. */
+ shmmax = SHMMAX;
+# elif defined(__APPLE__)
+ /* MacOS 10.13 "sysctl kern.sysv.shmmax" is paltry: */
+ shmmax = 0x400000;
+# endif /* !SHMMAX */
+
+ if (shmmax)
+ {
+ /* Roughly, bytes => NxN. b = (n/8)*4n = n*n*4, so n^2 = 2b, so: */
+ unsigned long n = sqrt(shmmax)/2;
+ if (n < max_max)
+ max_max = n;
+ }
+# endif /* HAVE_XSHM_EXTENSION and real X11 */
+
+ glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max);
+ if (max > max_max) max = max_max;
+
+ /* Never ask for an image smaller than the window, even if that
+ will make XSHM fall back to Xproto. */
+ if (max < MI_WIDTH(mi) || max < MI_HEIGHT(mi))
+ max = 0;
+
+ load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
+ max, max, False, img->texid, image_loaded_cb, img);
+ }
+
+ ss->images[ss->nimages++] = img;
+ if (ss->nimages >= countof(ss->images)) abort();
+
+ return img;
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ image *img = (image *) closure;
+ ModeInfo *mi = img->mi;
+ int ow, oh;
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (wire)
+ {
+ img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+ img->h = MI_HEIGHT (mi);
+ img->geom.width = img->w;
+ img->geom.height = img->h;
+ goto DONE;
+ }
+
+ if (image_width == 0 || image_height == 0)
+ exit (1);
+
+ img->w = image_width;
+ img->h = image_height;
+ img->tw = texture_width;
+ img->th = texture_height;
+ img->geom = *geom;
+ img->title = (filename ? strdup (filename) : 0);
+
+ ow = img->geom.width;
+ oh = img->geom.height;
+
+ /* If the image's width doesn't come back as the width of the screen,
+ then the image must have been scaled down (due to insufficient
+ texture memory.) Scale up the coordinates to stretch the image
+ to fill the window.
+ */
+ if (img->w != MI_WIDTH(mi))
+ {
+ double scale = (double) MI_WIDTH(mi) / img->w;
+ img->w *= scale;
+ img->h *= scale;
+ img->tw *= scale;
+ img->th *= scale;
+ img->geom.x *= scale;
+ img->geom.y *= scale;
+ img->geom.width *= scale;
+ img->geom.height *= scale;
+ }
+
+ /* xscreensaver-getimage returns paths relative to the image directory
+ now, so leave the sub-directory part in. Unless it's an absolute path.
+ */
+ if (img->title && img->title[0] == '/')
+ {
+ /* strip filename to part between last "/" and last ".". */
+ char *s = strrchr (img->title, '/');
+ if (s) strcpy (img->title, s+1);
+ s = strrchr (img->title, '.');
+ if (s) *s = 0;
+ }
+
+# if !(__APPLE__ && TARGET_IPHONE_SIMULATOR || !defined(__OPTIMIZE__))
+ if (debug_p)
+# endif
+ fprintf (stderr, "%s: loaded %lu \"%s\" %dx%d\n",
+ progname, img->id, (img->title ? img->title : "(null)"),
+ ow, oh);
+ DONE:
+
+ img->loaded_p = True;
+}
+
+
+
+/* Free the image and texture, after nobody is referencing it.
+ */
+static void
+destroy_image (ModeInfo *mi, image *img)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ int i;
+
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->texid <= 0) abort();
+ if (img->refcount != 0) abort();
+
+ for (i = 0; i < ss->nimages; i++) /* unlink it from the list */
+ if (ss->images[i] == img)
+ {
+ int j;
+ for (j = i; j < ss->nimages-1; j++) /* pull remainder forward */
+ ss->images[j] = ss->images[j+1];
+ ss->images[j] = 0;
+ ss->nimages--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+
+ if (debug_p)
+ fprintf (stderr, "%s: unloaded img %2lu: \"%s\"\n",
+ progname, img->id, (img->title ? img->title : "(null)"));
+
+ if (img->title) free (img->title);
+ glDeleteTextures (1, &img->texid);
+ free (img);
+}
+
+
+/* Return an image to use for a sprite.
+ If it's time for a new one, get a new one.
+ Otherwise, use an old one.
+ Might return 0 if the machine is really slow.
+ */
+static image *
+get_image (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = 0;
+ image *loading_img = 0;
+ int i;
+
+ for (i = 0; i < ss->nimages; i++)
+ {
+ image *img2 = ss->images[i];
+ if (!img2) abort();
+ if (!img2->loaded_p)
+ loading_img = img2;
+ else
+ img = img2;
+ }
+
+ /* Make sure that there is always one unused image in the pipe.
+ */
+ if (!img && !loading_img)
+ alloc_image (mi);
+
+ return img;
+}
+
+
+/* Allocate a new sprite and start its animation going.
+ */
+static sprite *
+new_sprite (ModeInfo *mi, sprite_type type)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = (type == IMAGE ? get_image (mi) : 0);
+ sprite *sp;
+
+ if (type == IMAGE && !img)
+ {
+ /* Oops, no images yet! The machine is probably hurting bad.
+ Let's give it some time before thrashing again. */
+ usleep (250000);
+ return 0;
+ }
+
+ sp = (sprite *) calloc (1, sizeof (*sp));
+ sp->id = ++ss->sprite_id;
+ sp->type = type;
+ sp->start_time = ss->now;
+ sp->state_time = sp->start_time;
+ sp->thickness_scale = 1;
+ sp->throb_p = True;
+ sp->to.x = 0.5;
+ sp->to.y = 0.5;
+ sp->to.w = 1.0;
+ sp->to.h = 1.0;
+
+ if (img)
+ {
+ sp->img = img;
+ sp->img->refcount++;
+ sp->img->used_p = True;
+ sp->duration = 0; /* forever, until further notice */
+ sp->fade_duration = 0.5;
+
+ /* Scale the sprite so that the image bits fill the window. */
+ {
+ double w = MI_WIDTH(mi);
+ double h = MI_HEIGHT(mi);
+ double r;
+ r = ((img->geom.height / (double) img->geom.width) * (w / h));
+ if (r > 1)
+ sp->to.h *= r;
+ else
+ sp->to.w /= r;
+ }
+
+ /* Pan to a random spot */
+ if (sp->to.h > 1)
+ sp->to.y += frand ((sp->to.h - 1) / 2) * RANDSIGN();
+ if (sp->to.w > 1)
+ sp->to.x += frand ((sp->to.w - 1) / 2) * RANDSIGN();
+ }
+
+ sp->from = sp->current = sp->to;
+
+ ss->sprites[ss->nsprites++] = sp;
+ if (ss->nsprites >= countof(ss->sprites)) abort();
+
+ return sp;
+}
+
+
+static sprite *
+copy_sprite (ModeInfo *mi, sprite *old)
+{
+ sprite *sp = new_sprite (mi, (sprite_type) ~0L);
+ int id;
+ double tt = sp->start_time;
+ if (!sp) abort();
+ id = sp->id;
+ memcpy (sp, old, sizeof(*sp));
+ sp->id = id;
+ sp->state = NEW;
+ sp->state_time = sp->start_time = tt;
+ if (sp->img)
+ sp->img->refcount++;
+ return sp;
+}
+
+
+/* Free the given sprite, and decrement the reference count on its image.
+ */
+static void
+destroy_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ image *img;
+ int i;
+
+ if (!sp) abort();
+ if (sp->state != DEAD) abort();
+ img = sp->img;
+
+ if (sp->type != IMAGE)
+ {
+ if (img) abort();
+ }
+ else
+ {
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->refcount <= 0) abort();
+ }
+
+ for (i = 0; i < ss->nsprites; i++) /* unlink it from the list */
+ if (ss->sprites[i] == sp)
+ {
+ int j;
+ for (j = i; j < ss->nsprites-1; j++) /* pull remainder forward */
+ ss->sprites[j] = ss->sprites[j+1];
+ ss->sprites[j] = 0;
+ ss->nsprites--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+ if (sp->text) free (sp->text);
+ free (sp);
+ sp = 0;
+
+ if (img)
+ {
+ img->refcount--;
+ if (img->refcount < 0) abort();
+ if (img->refcount == 0)
+ destroy_image (mi, img);
+ }
+}
+
+
+/* Updates the sprite for the current frame of the animation based on
+ its creation time compared to the current wall clock.
+ */
+static void
+tick_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = sp->img;
+ double now = ss->now;
+ double secs;
+ double ratio;
+ GLfloat visible = sp->duration + sp->fade_duration * 2;
+ GLfloat total = sp->pause_duration + visible;
+
+ if (sp->type != IMAGE)
+ {
+ if (sp->img) abort();
+ }
+ else
+ {
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+ }
+
+ /* pause fade duration fade
+ |------------|------------|---------|-----------|
+ ....----====##########====----....
+ from current to
+ */
+
+ secs = now - sp->start_time;
+ ratio = (visible <= 0 ? 1 : ((secs - sp->pause_duration) / visible));
+ if (ratio < 0) ratio = 0;
+ else if (ratio > 1) ratio = 1;
+
+ sp->current.x = sp->from.x + ratio * (sp->to.x - sp->from.x);
+ sp->current.y = sp->from.y + ratio * (sp->to.y - sp->from.y);
+ sp->current.w = sp->from.w + ratio * (sp->to.w - sp->from.w);
+ sp->current.h = sp->from.h + ratio * (sp->to.h - sp->from.h);
+
+ sp->thickness_scale = 1;
+
+ if (secs < sp->pause_duration)
+ {
+ sp->state = IN;
+ sp->opacity = 0;
+ }
+ else if (secs < sp->pause_duration + sp->fade_duration)
+ {
+ sp->state = IN;
+ sp->opacity = (secs - sp->pause_duration) / (GLfloat) sp->fade_duration;
+ }
+ else if (sp->duration == 0 || /* 0 means infinite lifetime */
+ sp->remain_p ||
+ secs < sp->pause_duration + sp->fade_duration + sp->duration)
+ {
+ sp->state = FULL;
+ sp->opacity = 1;
+
+ /* Just after reaching full opacity, pulse the width up and down. */
+ if (sp->fade_duration > 0 &&
+ secs < sp->pause_duration + sp->fade_duration * 2)
+ {
+ GLfloat f = ((secs - (sp->pause_duration + sp->fade_duration)) /
+ sp->fade_duration);
+ if (sp->throb_p)
+ sp->thickness_scale = 1 + 3 * (f > 0.5 ? 1-f : f);
+ }
+ }
+ else if (secs < total)
+ {
+ sp->state = OUT;
+ sp->opacity = (total - secs) / sp->fade_duration;
+ }
+ else
+ {
+ sp->state = DEAD;
+ sp->opacity = 0;
+ }
+
+ sp->frame_count++;
+}
+
+
+/* Draw the given sprite at the phase of its animation dictated by
+ its creation time compared to the current wall clock.
+ */
+static void
+draw_image_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = sp->img;
+
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+
+ glPushMatrix();
+ {
+ GLfloat s = 1 + (sp->thickness_scale - 1) / 40.0;
+ glTranslatef (0.5, 0.5, 0);
+ glScalef (s, s, 1);
+ glTranslatef (-0.5, -0.5, 0);
+
+ glTranslatef (sp->current.x, sp->current.y, 0);
+ glScalef (sp->current.w, sp->current.h, 1);
+
+ glTranslatef (-0.5, -0.5, 0);
+
+ if (wire) /* Draw a grid inside the box */
+ {
+ GLfloat dy = 0.1;
+ GLfloat dx = dy * img->w / img->h;
+ GLfloat x, y;
+
+ if (sp->id & 1)
+ glColor4f (sp->opacity, 0, 0, 1);
+ else
+ glColor4f (0, 0, sp->opacity, 1);
+
+ glBegin(GL_LINES);
+ glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
+
+ for (y = 0; y < 1+dy; y += dy)
+ {
+ GLfloat yy = (y > 1 ? 1 : y);
+ for (x = 0.5; x < 1+dx; x += dx)
+ {
+ GLfloat xx = (x > 1 ? 1 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ for (x = 0.5; x > -dx; x -= dx)
+ {
+ GLfloat xx = (x < 0 ? 0 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ }
+ glEnd();
+ }
+ else /* Draw the texture quad */
+ {
+ GLfloat texw = img->geom.width / (GLfloat) img->tw;
+ GLfloat texh = img->geom.height / (GLfloat) img->th;
+ GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
+ GLfloat texy1 = img->geom.y / (GLfloat) img->th;
+ GLfloat texx2 = texx1 + texw;
+ GLfloat texy2 = texy1 + texh;
+ GLfloat o = sp->opacity;
+ GLint mag = (sp->fatbits_p ? GL_NEAREST : GL_LINEAR);
+
+ glBindTexture (GL_TEXTURE_2D, img->texid);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+
+ /* o = 1 - sin ((1 - o*o*o) * M_PI/2); */
+ glColor4f (1, 1, 1, o);
+
+ glNormal3f (0, 0, 1);
+ glBegin (GL_QUADS);
+ glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+ glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+ glTexCoord2f (texx2, texy1); glVertex3f (1, 1, 0);
+ glTexCoord2f (texx1, texy1); glVertex3f (0, 1, 0);
+ glEnd();
+
+ if (debug_p) /* Draw a border around the image */
+ {
+ if (!wire) glDisable (GL_TEXTURE_2D);
+ glColor4f (sp->opacity, 0, 0, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+ }
+ }
+ glPopMatrix();
+}
+
+
+static void
+draw_line_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+ int wh = (w > h ? w : h);
+ int gs = (sp->type == RETICLE ? grid_size+1 : grid_size);
+ int sx = wh / (gs + 1);
+ int sy;
+ int k;
+ GLfloat t = grid_thickness * sp->thickness_scale;
+ int fade;
+ GLfloat color[4];
+
+ GLfloat x = w * sp->current.x;
+ GLfloat y = h * sp->current.y;
+ GLfloat bw = w * sp->current.w;
+ GLfloat bh = h * sp->current.h;
+
+ if (MI_WIDTH(mi) > 2560) t *= 3; /* Retina displays */
+
+ if (sx < 10) sx = 10;
+ sy = sx;
+
+ if (t > sx/3) t = sx/3;
+ if (t < 1) t = 1;
+ fade = t;
+ if (fade < 1) fade = 1;
+
+ if (t <= 0 || sp->opacity <= 0) return;
+
+ glPushMatrix();
+ glLoadIdentity();
+
+ if (debug_p)
+ {
+ GLfloat s = 0.75;
+ glScalef (s, s, s);
+ }
+
+ glOrtho (0, w, 0, h, -1, 1);
+
+ switch (sp->type) {
+ case GRID: memcpy (color, ss->grid_color, sizeof(color)); break;
+ case RETICLE: memcpy (color, ss->reticle_color, sizeof(color)); break;
+ case BOX: memcpy (color, ss->reticle_color, sizeof(color)); break;
+ default: abort();
+ }
+
+ if (sp->type == GRID)
+ {
+ GLfloat s = 1 + (sp->thickness_scale - 1) / 120.0;
+ glTranslatef (w/2, h/2, 0);
+ glScalef (s, s, 1);
+ glTranslatef (-w/2, -h/2, 0);
+ }
+
+ glColor4fv (color);
+
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ for (k = 0; k < fade; k++)
+ {
+ GLfloat t2 = t * (1 - (k / (fade * 1.0)));
+ if (t2 <= 0) break;
+ color[3] = sp->opacity / fade;
+ glColor4fv (color);
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+
+ switch (sp->type) {
+ case GRID:
+ {
+ GLfloat xoff = (w - sx * (w / sx)) / 2.0;
+ GLfloat yoff = (h - sy * (h / sy)) / 2.0;
+ for (y = -sy/2+t2/2; y < h; y += sy)
+ for (x = -sx/2-t2/2; x < w; x += sx)
+ {
+ glVertex3f (xoff+x+t2, yoff+y, 0);
+ glVertex3f (xoff+x+t2, yoff+y+sy-t2, 0);
+ glVertex3f (xoff+x, yoff+y+sy-t2, 0);
+ glVertex3f (xoff+x, yoff+y, 0);
+ mi->polygon_count++;
+
+ glVertex3f (xoff+x, yoff+y-t2, 0);
+ glVertex3f (xoff+x+sx, yoff+y-t2, 0);
+ glVertex3f (xoff+x+sx, yoff+y, 0);
+ glVertex3f (xoff+x, yoff+y, 0);
+ mi->polygon_count++;
+ }
+ }
+ break;
+
+ case BOX:
+ glVertex3f (x-bw/2-t2/2, y-bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y-bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y-bh/2+t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y-bh/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-bw/2-t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y+bh/2+t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y+bh/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-bw/2+t2/2, y-bh/2+t2/2, 0);
+ glVertex3f (x-bw/2+t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y-bh/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x+bw/2+t2/2, y-bh/2+t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2-t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2-t2/2, y-bh/2+t2/2, 0);
+ mi->polygon_count++;
+ break;
+
+ case RETICLE:
+ glVertex3f (x+t2/2, y+sy/2-t2/2, 0);
+ glVertex3f (x+t2/2, h, 0);
+ glVertex3f (x-t2/2, h, 0);
+ glVertex3f (x-t2/2, y+sy/2-t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-t2/2, y-sy/2+t2/2, 0);
+ glVertex3f (x-t2/2, 0, 0);
+ glVertex3f (x+t2/2, 0, 0);
+ glVertex3f (x+t2/2, y-sy/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-sx/2+t2/2, y+t2/2, 0);
+ glVertex3f (0, y+t2/2, 0);
+ glVertex3f (0, y-t2/2, 0);
+ glVertex3f (x-sx/2+t2/2, y-t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x+sx/2-t2/2, y-t2/2, 0);
+ glVertex3f (w, y-t2/2, 0);
+ glVertex3f (w, y+t2/2, 0);
+ glVertex3f (x+sx/2-t2/2, y+t2/2, 0);
+ mi->polygon_count++;
+ break;
+
+ default: abort();
+ }
+ glEnd();
+ }
+
+ glPopMatrix();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+}
+
+
+static sprite * find_newest_sprite (ModeInfo *, sprite_type);
+static void compute_image_rect (rect *, sprite *, Bool);
+
+static void
+draw_text_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat w = MI_WIDTH(mi);
+ GLfloat h = MI_HEIGHT(mi);
+ GLfloat s;
+ int x, y, z;
+ XCharStruct e;
+ sprite *target = 0;
+ char text[255];
+ GLfloat color[4];
+ int i;
+
+ if (sp->opacity <= 0)
+ return;
+
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->id == sp->text_id && sp2->state != DEAD)
+ {
+ target = sp2;
+ break;
+ }
+ }
+
+ if (target)
+ {
+ rect r;
+ sprite *img;
+
+ if (target->opacity <= 0 &&
+ (target->state == NEW || target->state == IN))
+ return;
+
+ r = target->current;
+
+ img = find_newest_sprite (mi, IMAGE);
+ if (img)
+ compute_image_rect (&r, img, target->back_p);
+
+ mi->recursion_depth = (img
+ ? MIN (img->current.w, img->current.h)
+ : 0);
+
+ x = abs ((int) (r.x * 10000)) % 10000;
+ y = abs ((int) (r.y * 10000)) % 10000;
+ z = abs ((int) (r.w * 10000)) % 10000;
+
+ sprintf (text, "ZM %04d NS %04d EW %04d", z, y, x);
+
+ if ((x == 0 || x == 5000) && /* startup */
+ (y == 0 || y == 5000) &&
+ (z == 0 || z == 5000))
+ *text = 0;
+
+ if (do_titles &&
+ target->type == IMAGE &&
+ target->remain_p) /* The initial background image */
+ {
+ char *s = (target->img &&
+ target->img->title && *target->img->title
+ ? target->img->title
+ : "Loading");
+ int L = strlen (s);
+ int i = (L > 23 ? L-23 : 0);
+ sprintf (text, ">>%-23s", target->img->title + i);
+ for (s = text; *s; s++)
+ if (*s >= 'a' && *s <= 'z') *s += ('A'-'a');
+ else if (*s == '/' || *s == '-' || *s == '.') *s = '_';
+ }
+
+ if (!*text) return;
+
+ if (sp->text) free (sp->text);
+ sp->text = strdup (text);
+ }
+ else if (sp->text && *sp->text)
+ /* The target sprite might be dead, but we saved our last text. */
+ strcpy (text, sp->text);
+ else
+ /* No target, no saved text. */
+ return;
+
+ texture_string_metrics (ss->font_data, text, &e, 0, 0);
+
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho (0, 1, 0, 1, -1, 1);
+
+ /* Scale the text to fit N characters horizontally. */
+ {
+# ifdef HAVE_MOBILE
+ GLfloat c = 25;
+# else /* desktop */
+ GLfloat c = (MI_WIDTH(mi) <= 640 ? 25 :
+ MI_WIDTH(mi) <= 1280 ? 32 : 64);
+# endif
+ s = w / (e.ascent * c);
+ }
+ w /= s;
+ h /= s;
+ x = (w - e.width) / 2;
+ y = e.ascent + e.descent * 2;
+
+ glScalef (1.0/w, 1.0/h, 1);
+ glTranslatef (x, y, 0);
+
+ memcpy (color, ss->text_color, sizeof(color));
+ color[3] = sp->opacity;
+ glColor4fv (color);
+
+ if (wire)
+ glEnable (GL_TEXTURE_2D);
+
+ print_texture_string (ss->font_data, text);
+ mi->polygon_count++;
+
+ if (wire)
+ glDisable (GL_TEXTURE_2D);
+ glPopMatrix();
+}
+
+
+static void
+draw_flash_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ GLfloat o = sp->opacity;
+
+ if (o <= 0) return;
+ o = 0.7; /* Too fast to see, so keep it consistent */
+
+ glPushMatrix();
+ int wire = MI_IS_WIREFRAME(mi);
+ if (!wire)
+ glDisable (GL_TEXTURE_2D);
+ glColor4f (0, 0, 1, o);
+ glColorMask (0, 0, 1, 1); /* write only into blue and alpha channels */
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (0, 1, 0);
+ glEnd();
+ glColorMask (1, 1, 1, 1);
+ if (!wire)
+ glEnable (GL_TEXTURE_2D);
+ glPopMatrix();
+}
+
+
+static void
+draw_sprite (ModeInfo *mi, sprite *sp)
+{
+ switch (sp->type) {
+ case IMAGE:
+ draw_image_sprite (mi, sp);
+ break;
+ case RETICLE:
+ case BOX:
+ case GRID:
+ draw_line_sprite (mi, sp);
+ break;
+ case TEXT:
+ draw_text_sprite (mi, sp);
+ break;
+ case FLASH:
+ draw_flash_sprite (mi, sp);
+ break;
+ default:
+ abort();
+ }
+}
+
+
+static void
+tick_sprites (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ tick_sprite (mi, ss->sprites[i]);
+
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->state == DEAD)
+ {
+ destroy_sprite (mi, sp);
+ i--;
+ }
+ }
+}
+
+
+static void
+draw_sprites (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+/*
+ {
+ GLfloat rot = current_device_rotation();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ glTranslatef (-0.5, -0.5, 0);
+ }
+*/
+
+ /* Draw the images first, then the overlays. */
+ for (i = 0; i < ss->nsprites; i++)
+ if (ss->sprites[i]->type == IMAGE)
+ draw_sprite (mi, ss->sprites[i]);
+ for (i = 0; i < ss->nsprites; i++)
+ if (ss->sprites[i]->type != IMAGE)
+ draw_sprite (mi, ss->sprites[i]);
+
+ glPopMatrix();
+
+ if (debug_p) /* draw a white box (the "screen") */
+ {
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ glColor4f (1, 1, 1, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+}
+
+
+static void
+fadeout_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+
+ /* If it hasn't faded in yet, don't fade out. */
+ if (ss->now <= sp->start_time + sp->pause_duration)
+ sp->fade_duration = 0;
+
+ /* Pretend it's at the point where it should fade out. */
+ sp->pause_duration = 0;
+ sp->duration = 9999;
+ sp->remain_p = False;
+ sp->start_time = ss->now - sp->duration;
+}
+
+static void
+fadeout_sprites (ModeInfo *mi, sprite_type type)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->type == type)
+ fadeout_sprite (mi, sp);
+ }
+}
+
+
+static sprite *
+find_newest_sprite (ModeInfo *mi, sprite_type type)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ sprite *sp = 0;
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->type == type &&
+ (!sp ||
+ (sp->start_time < sp2->start_time &&
+ ss->now >= sp2->start_time + sp2->pause_duration)))
+ sp = sp2;
+ }
+ return sp;
+}
+
+
+/* Enqueue a text sprite describing the given sprite that runs at the
+ same time.
+ */
+static sprite *
+push_text_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ sprite *sp2 = new_sprite (mi, TEXT);
+ if (!sp2) abort();
+ sp2->text_id = sp->id;
+ sp2->fade_duration = sp->fade_duration;
+ sp2->duration = sp->duration;
+ sp2->pause_duration = sp->pause_duration;
+ return sp2;
+}
+
+
+/* Enqueue a flash sprite that fires at the same time.
+ */
+#ifndef SMOOTH
+static sprite *
+push_flash_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ sprite *sp2 = new_sprite (mi, FLASH);
+ if (!sp2) abort();
+ if (sp->type != IMAGE) abort();
+ sp2->text_id = sp->id;
+ sp2->duration = MAX (0.07 / speed, 0.07);
+ sp2->fade_duration = 0; /* Fading these is too fast to see */
+ sp2->pause_duration = sp->pause_duration + (sp->fade_duration * 0.3);
+ return sp2;
+}
+#endif /* !SMOOTH */
+
+
+/* Set the sprite's duration based on distance travelled.
+ */
+static void
+compute_sprite_duration (ModeInfo *mi, sprite *sp, Bool blink_p)
+{
+ /* Compute max distance traveled by any point (corners or center). */
+ /* (cpp is the devil) */
+# define L(F) (sp->F.x - sp->F.w/2) /* delta of left edge, from/to */
+# define R(F) (1-(sp->F.x + sp->F.w/2)) /* right */
+# define B(F) (sp->F.y - sp->F.h/2) /* top */
+# define T(F) (1-(sp->F.y + sp->F.h/2)) /* bottom */
+# define D(F,G) sqrt(F(from)*F(from) + G(to)*G(to)) /* corner traveled */
+ double BL = D(B,L);
+ double BR = D(B,R);
+ double TL = D(T,L);
+ double TR = D(T,R);
+ double cx = sp->to.x - sp->from.x;
+ double cy = sp->to.y - sp->from.y;
+ double C = sqrt(cx*cx + cy*cy);
+ double dist = MAX (BL, MAX (BR, MAX (TL, MAX (TR, C))));
+# undef L
+# undef R
+# undef B
+# undef T
+# undef D
+
+ int steps = 1 + dist * 28;
+ if (steps > 10) steps = 10;
+
+ sp->duration = steps * 0.2 / speed;
+
+# ifndef SMOOTH
+ sp->duration += 1.5 / speed; /* For linger added by animate_sprite_path() */
+ if (blink_p) sp->duration += 0.6 / speed;
+# endif
+}
+
+
+/* Convert the sprite to a jerky transition.
+ Instead of smoothly animating, move in discrete steps,
+ using multiple staggered sprites.
+ */
+static void
+animate_sprite_path (ModeInfo *mi, sprite *sp, Bool blink_p)
+{
+# ifndef SMOOTH
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ double dx = sp->to.x - sp->from.x;
+ double dy = sp->to.y - sp->from.y;
+ double dw = sp->to.w - sp->from.w;
+ double dh = sp->to.h - sp->from.h;
+ double linger = 1.5 / speed;
+ double blinger = 0.6 / speed;
+ double dur = sp->duration - linger - (blink_p ? blinger : 0);
+ int steps = dur / 0.3 * speed; /* step duration in seconds */
+ int i;
+
+ if (sp->type == IMAGE)
+ steps *= 0.8;
+
+ if (steps < 2) steps = 2;
+ if (steps > 10) steps = 10;
+
+ /* if (dur <= 0.01) abort(); */
+ if (dur < 0.01)
+ linger = blinger = 0;
+
+ for (i = 0; i <= steps; i++)
+ {
+ sprite *sp2 = copy_sprite (mi, sp);
+ if (!sp2) abort();
+
+ sp2->to.x = (sp->current.x + i * dx / steps);
+ sp2->to.y = (sp->current.y + i * dy / steps);
+ sp2->to.w = (sp->current.w + i * dw / steps);
+ sp2->to.h = (sp->current.h + i * dh / steps);
+ sp2->current = sp2->from = sp2->to;
+ sp2->duration = dur / steps;
+ sp2->pause_duration += i * sp2->duration;
+ sp2->remain_p = False;
+ sp2->fatbits_p = True;
+
+ if (i == steps)
+ sp2->duration += linger; /* last one lingers for a bit */
+
+ if (i == steps && !blink_p)
+ {
+ sp2->remain_p = sp->remain_p;
+ sp2->fatbits_p = False;
+ }
+
+ if (sp2->type == IMAGE && i > 0)
+ push_flash_sprite (mi, sp2);
+
+ if (sp2->type == RETICLE || sp2->type == BOX)
+ {
+ sp2 = push_text_sprite (mi, sp2);
+ if (i == steps)
+ sp2->duration += linger * 2;
+ }
+ }
+
+ if (blink_p && blinger) /* last one blinks before vanishing */
+ {
+ int blinkers = 3;
+ for (i = 1; i <= blinkers; i++)
+ {
+ sprite *sp2 = copy_sprite (mi, sp);
+ if (!sp2) abort();
+
+ sp2->current = sp2->from = sp->to;
+ sp2->duration = blinger / blinkers;
+ sp2->pause_duration += dur + linger + i * sp2->duration;
+ sp2->remain_p = False;
+ if (i == blinkers)
+ {
+ sp2->remain_p = sp->remain_p;
+ sp2->fatbits_p = False;
+ }
+ }
+ }
+
+ /* Fade out the template sprite. It might not have even appeared yet. */
+ fadeout_sprite (mi, sp);
+# endif
+}
+
+
+/* Input rect is of a reticle or box.
+ Output rect is what the image's rect should be so that the only part
+ visible is the part indicated by the input rect.
+ */
+static void
+compute_image_rect (rect *r, sprite *img, Bool inverse_p)
+{
+ double scale = (inverse_p ? 1/r->w : r->w);
+ double dx = r->x - 0.5;
+ double dy = r->y - 0.5;
+
+ /* Adjust size and center by zoom factor */
+ r->w = img->current.w / scale;
+ r->h = img->current.h / scale;
+ r->x = 0.5 + (img->current.x - 0.5) / scale;
+ r->y = 0.5 + (img->current.y - 0.5) / scale;
+
+ /* Move center */
+
+ if (inverse_p)
+ {
+ dx = -dx; /* #### Close but not quite right */
+ dy = -dy;
+ }
+
+ r->x -= dx / scale;
+ r->y -= dy / scale;
+}
+
+
+/* Sets 'to' such that the image zooms out so that the only part visible
+ is the part indicated by the box.
+ */
+static void
+track_box_with_image (ModeInfo *mi, sprite *sp, sprite *img)
+{
+ rect r = sp->current;
+ compute_image_rect (&r, img, sp->back_p);
+ img->to = r;
+
+ /* Never zoom out too far. */
+ if (img->to.w < 1 && img->to.h < 1)
+ {
+ if (img->to.w > img->to.h)
+ {
+ img->to.w = img->to.w / img->to.h;
+ img->to.h = 1;
+ }
+ else
+ {
+ img->to.h = img->to.h / img->to.w;
+ img->to.w = 1;
+ }
+ }
+
+ /* Never pan beyond the bounds of the image. */
+ if (img->to.x < -img->to.w/2+1) img->to.x = -img->to.w/2+1;
+ if (img->to.x > img->to.w/2) img->to.x = img->to.w/2;
+ if (img->to.y < -img->to.h/2+1) img->to.y = -img->to.h/2+1;
+ if (img->to.y > img->to.h/2) img->to.y = img->to.h/2;
+}
+
+
+static void
+tick_animation (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ anim_state prev_state = ss->anim_state;
+ sprite *sp = 0;
+ int i;
+
+ switch (ss->anim_state) {
+ case BLANK:
+ ss->anim_state = GRID_ON;
+ break;
+ case GRID_ON:
+ ss->anim_state = IMAGE_LOAD;
+ break;
+ case IMAGE_LOAD:
+ /* Only advance once an image has loaded. */
+ if (find_newest_sprite (mi, IMAGE))
+ ss->anim_state = RETICLE_ON;
+ else
+ ss->anim_state = IMAGE_LOAD;
+ break;
+ case RETICLE_ON:
+ ss->anim_state = RETICLE_MOVE;
+ break;
+ case RETICLE_MOVE:
+ if (random() % 6)
+ ss->anim_state = BOX_MOVE;
+ else
+ ss->anim_state = IMAGE_ZOOM;
+ break;
+ case BOX_MOVE:
+ ss->anim_state = IMAGE_ZOOM;
+ break;
+ case IMAGE_ZOOM:
+ {
+ sprite *sp = find_newest_sprite (mi, IMAGE);
+ double depth = (sp
+ ? MIN (sp->current.w, sp->current.h)
+ : 0);
+ if (depth > 20)
+ ss->anim_state = IMAGE_UNLOAD;
+ else
+ ss->anim_state = RETICLE_ON;
+ }
+ break;
+ case IMAGE_FORCE_UNLOAD:
+ ss->anim_state = IMAGE_UNLOAD;
+ break;
+ case IMAGE_UNLOAD:
+ ss->anim_state = IMAGE_LOAD;
+ break;
+ case MANUAL_BOX_ON:
+ ss->anim_state = MANUAL_BOX;
+ break;
+ case MANUAL_BOX:
+ break;
+ case MANUAL_RETICLE_ON:
+ ss->anim_state = MANUAL_RETICLE;
+ break;
+ case MANUAL_RETICLE:
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ ss->anim_start = ss->now;
+ ss->anim_duration = 0;
+
+ if (debug_p)
+ fprintf (stderr, "%s: entering %s\n",
+ progname, state_name (ss->anim_state));
+
+ switch (ss->anim_state) {
+
+ case GRID_ON: /* Start the grid fading in. */
+ if (! find_newest_sprite (mi, GRID))
+ {
+ sp = new_sprite (mi, GRID);
+ if (!sp) abort();
+ sp->fade_duration = 1.0 / speed;
+ sp->duration = 2.0 / speed;
+ sp->remain_p = True;
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration);
+ }
+ break;
+
+ case IMAGE_LOAD:
+ fadeout_sprites (mi, IMAGE);
+ sp = new_sprite (mi, IMAGE);
+ if (! sp)
+ {
+ if (debug_p) fprintf (stderr, "%s: image load failed\n", progname);
+ break;
+ }
+
+ sp->fade_duration = 0.5 / speed;
+ sp->duration = sp->fade_duration * 3;
+ sp->remain_p = True;
+ /* If we zoom in, we lose the pulse at the end. */
+ /* sp->from.w = sp->from.h = 0.0001; */
+ sp->current = sp->from;
+
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration);
+
+ sp = push_text_sprite (mi, sp);
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 0;
+ sp->duration = 2.5 / speed;
+ break;
+
+ case IMAGE_FORCE_UNLOAD:
+ break;
+
+ case IMAGE_UNLOAD:
+ sp = find_newest_sprite (mi, IMAGE);
+ if (sp)
+ sp->fade_duration = ((prev_state == IMAGE_FORCE_UNLOAD ? 0.2 : 3.0)
+ / speed);
+ fadeout_sprites (mi, IMAGE);
+ fadeout_sprites (mi, RETICLE);
+ fadeout_sprites (mi, BOX);
+ fadeout_sprites (mi, TEXT);
+ ss->anim_duration = (sp ? sp->fade_duration : 0) + 3.5 / speed;
+ break;
+
+ case RETICLE_ON: /* Display reticle at center. */
+ fadeout_sprites (mi, TEXT);
+ sp = new_sprite (mi, RETICLE);
+ if (!sp) abort();
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 1.0 / speed;
+ sp->duration = 1.5 / speed;
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration);
+ ss->anim_duration -= sp->fade_duration * 2;
+ break;
+
+ case RETICLE_MOVE:
+ /* Reticle has faded in. Now move it to somewhere else.
+ Create N new reticle sprites, wih staggered pause_durations.
+ */
+ {
+ GLfloat ox = 0.5;
+ GLfloat oy = 0.5;
+ GLfloat nx, ny, dist;
+
+ do { /* pick a new position not too near the old */
+ nx = 0.3 + BELLRAND(0.4);
+ ny = 0.3 + BELLRAND(0.4);
+ dist = sqrt ((nx-ox)*(nx-ox) + (ny-oy)*(ny-oy));
+ } while (dist < 0.1);
+
+ sp = new_sprite (mi, RETICLE);
+ if (!sp) abort();
+
+ sp->from.x = ox;
+ sp->from.y = oy;
+ sp->current = sp->to = sp->from;
+ sp->to.x = nx;
+ sp->to.y = ny;
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 0;
+ compute_sprite_duration (mi, sp, False);
+
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration - 0.1);
+ animate_sprite_path (mi, sp, False);
+ }
+ break;
+
+ case BOX_MOVE:
+ /* Reticle has moved, and faded out.
+ Start the box zooming into place.
+ */
+ {
+ GLfloat ox = 0.5;
+ GLfloat oy = 0.5;
+ GLfloat nx, ny;
+ GLfloat z;
+
+ /* Find the last-added reticle, for our destination position. */
+ sp = 0;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->type == RETICLE &&
+ (!sp || sp->start_time < sp2->start_time))
+ sp = sp2;
+ }
+ if (sp)
+ {
+ nx = sp->to.x;
+ ny = sp->to.y;
+ }
+ else
+ {
+ nx = ny = 0.5;
+ if (debug_p)
+ fprintf (stderr, "%s: no reticle before box?\n", progname);
+ }
+
+ z = 0.3 + frand(0.5);
+
+ /* Ensure that the selected box is contained within the screen */
+ {
+ double margin = 0.005;
+ double maxw = 2 * MIN (1 - margin - nx, nx - margin);
+ double maxh = 2 * MIN (1 - margin - ny, ny - margin);
+ double max = MIN (maxw, maxh);
+ if (z > max) z = max;
+ }
+
+ sp = new_sprite (mi, BOX);
+ if (!sp) abort();
+ sp->from.x = ox;
+ sp->from.y = oy;
+ sp->from.w = 1.0;
+ sp->from.h = 1.0;
+ sp->current = sp->from;
+ sp->to.x = nx;
+ sp->to.y = ny;
+ sp->to.w = z;
+ sp->to.h = z;
+
+ /* Maybe zoom out instead of in.
+ */
+ {
+ sprite *img = find_newest_sprite (mi, IMAGE);
+ double depth = MIN (img->current.w, img->current.h);
+ if (depth > 1 && /* if zoomed in */
+ (depth < 6 ? !(random() % 5) : /* 20% */
+ depth < 12 ? !(random() % 2) : /* 50% */
+ (random() % 3))) /* 66% */
+ {
+ sp->back_p = True;
+ if (depth < 1.5 && z < 0.8)
+ {
+ z = 0.8; /* don't zoom out much past 100% */
+ sp->to.w = z;
+ sp->to.h = z;
+ }
+ }
+ }
+
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 2.0 / speed;
+ compute_sprite_duration (mi, sp, True);
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration - 0.1);
+ animate_sprite_path (mi, sp, True);
+ }
+ break;
+
+ case IMAGE_ZOOM:
+
+ /* Box has moved, and faded out.
+ Or, if no box, then just a reticle.
+ Zoom the underlying image to track the box's position. */
+ {
+ sprite *img, *img2;
+
+ /* Find latest box or reticle, for our destination position. */
+ sp = find_newest_sprite (mi, BOX);
+ if (! sp)
+ sp = find_newest_sprite (mi, RETICLE);
+ if (! sp)
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: no box or reticle before image\n",
+ progname);
+ break;
+ }
+
+ img = find_newest_sprite (mi, IMAGE);
+ if (!img)
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: no image?\n", progname);
+ break;
+ }
+
+ img2 = copy_sprite (mi, img);
+ if (!img2) abort();
+
+ img2->from = img->current;
+
+ fadeout_sprite (mi, img);
+
+ track_box_with_image (mi, sp, img2);
+
+ img2->fade_duration = 0.2 / speed;
+ img2->pause_duration = 0.5 / speed;
+ img2->remain_p = True;
+ img2->throb_p = False;
+ compute_sprite_duration (mi, img2, False);
+
+ img->start_time += img2->pause_duration;
+
+ ss->anim_duration = (img2->pause_duration + img2->fade_duration * 2 +
+ img2->duration);
+ animate_sprite_path (mi, img2, False);
+ fadeout_sprites (mi, TEXT);
+ }
+ break;
+
+ case MANUAL_BOX_ON:
+ case MANUAL_RETICLE_ON:
+ break;
+
+ case MANUAL_BOX:
+ case MANUAL_RETICLE:
+ {
+ sprite_type tt = (ss->anim_state == MANUAL_BOX ? BOX : RETICLE);
+ sprite *osp = find_newest_sprite (mi, tt);
+ fadeout_sprites (mi, RETICLE);
+ fadeout_sprites (mi, BOX);
+
+ sp = new_sprite (mi, tt);
+ if (!sp) abort();
+ if (osp)
+ sp->from = osp->current;
+ else
+ {
+ sp->from.x = 0.5;
+ sp->from.y = 0.5;
+ sp->from.w = 0.5;
+ sp->from.h = 0.5;
+ }
+ sp->to = sp->current = sp->from;
+ sp->fade_duration = 0.2 / speed;
+ sp->duration = 0.2 / speed;
+ sp->remain_p = True;
+ sp->throb_p = False;
+ ss->anim_duration = 9999;
+ }
+ break;
+
+ default:
+ fprintf (stderr,"%s: unknown state %d\n",
+ progname, (int) ss->anim_state);
+ abort();
+ }
+}
+
+
+/* Copied from gltrackball.c, sigh.
+ */
+static void
+adjust_for_device_rotation (double *x, double *y, double *w, double *h)
+{
+ int rot = (int) current_device_rotation();
+ int swap;
+
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+
+ if (rot > 135 || rot < -135) /* 180 */
+ {
+ *x = *w - *x;
+ *y = *h - *y;
+ }
+ else if (rot > 45) /* 90 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *x = *w - *x;
+ }
+ else if (rot < -45) /* 270 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *y = *h - *y;
+ }
+}
+
+
+ENTRYPOINT Bool
+esper_handle_event (ModeInfo *mi, XEvent *event)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (event->xany.type == Expose ||
+ event->xany.type == GraphicsExpose ||
+ event->xany.type == VisibilityNotify)
+ {
+ return False;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ sprite *sp = 0;
+ double delta = 0.025;
+ double margin = 0.005;
+ Bool ok = False;
+
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+ if (c == '\t')
+ {
+ ss->anim_state = IMAGE_FORCE_UNLOAD;
+ return True;
+ }
+
+ if (! find_newest_sprite (mi, IMAGE))
+ return False; /* Too early */
+
+ ss->now = double_time();
+
+# define BONK() do { \
+ if (ss->anim_state != MANUAL_BOX_ON && \
+ ss->anim_state != MANUAL_BOX) { \
+ ss->anim_state = MANUAL_BOX_ON; \
+ tick_animation (mi); \
+ } \
+ sp = find_newest_sprite (mi, BOX); \
+ if (!sp) abort() ; \
+ sp->from = sp->current; \
+ sp->to = sp->from; \
+ sp->start_time = ss->now - sp->fade_duration; \
+ ok = True; \
+ } while(0)
+
+ if (keysym == XK_Left || c == ',' || c == '<')
+ {
+ BONK();
+ sp->to.x -= delta;
+ }
+ else if (keysym == XK_Right || c == '.' || c == '>')
+ {
+ BONK();
+ sp->to.x += delta;
+ }
+ else if (keysym == XK_Down || c == '-')
+ {
+ BONK();
+ sp->to.y -= delta;
+ }
+ else if (keysym == XK_Up || c == '=')
+ {
+ BONK();
+ sp->to.y += delta, ok = True;
+ }
+ else if (keysym == XK_Prior || c == '+')
+ {
+ BONK();
+ sp->to.w += delta;
+ sp->to.h = sp->to.w * sp->from.w / sp->from.h;
+ }
+ else if (keysym == XK_Next || c == '_')
+ {
+ BONK();
+ sp->to.w -= delta;
+ sp->to.h = sp->to.w * sp->from.w / sp->from.h;
+ }
+ else if ((c == ' ' || c == '\t') && debug_p &&
+ ss->anim_state == MANUAL_BOX)
+ {
+ BONK(); /* Null motion: just flash the current image. */
+ }
+ else if ((keysym == XK_Home || c == ' ' || c == '\t') &&
+ ss->anim_state == MANUAL_BOX)
+ {
+ BONK();
+ sp->to.x = 0.5;
+ sp->to.y = 0.5;
+ sp->to.w = 0.5;
+ sp->to.h = 0.5;
+ }
+ else if ((c == '\r' || c == '\n' || c == 033) &&
+ ss->anim_state == MANUAL_BOX)
+ {
+ BONK();
+ ss->anim_state = BOX_MOVE;
+ ss->anim_duration = 9999;
+ ss->anim_start = ss->now - ss->anim_duration;
+ fadeout_sprite (mi, sp);
+ return True;
+ }
+ else
+ return False;
+
+ if (! ok)
+ return False;
+
+ /* Keep it on screen */
+ if (sp->to.w > 1 - margin)
+ {
+ GLfloat r = sp->to.h / sp->to.w;
+ sp->to.w = 1-margin;
+ sp->to.h = (1-margin) * r;
+ }
+ if (sp->to.h > 1)
+ {
+ GLfloat r = sp->to.h / sp->to.w;
+ sp->to.w = (1-margin) / r;
+ sp->to.h = 1-margin;
+ }
+
+ if (sp->to.x - sp->to.w/2 < margin)
+ sp->to.x = sp->to.w/2 + margin;
+ if (sp->to.y - sp->to.h/2 < margin)
+ sp->to.y = sp->to.h/2 + margin;
+
+ if (sp->to.x + sp->to.w/2 >= 1 + margin)
+ sp->to.x = 1 - (sp->to.w/2 + margin);
+ if (sp->to.y + sp->to.h/2 >= 1 + margin)
+ sp->to.y = 1 - (sp->to.h/2 + margin);
+
+ /* Now let's give a momentary glimpse of what the image would do. */
+ if (debug_p)
+ {
+ sprite *img = 0;
+ int i;
+
+ /* Find the lingering image */
+ /* img = find__sprite (mi, IMAGE); */
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->type == IMAGE &&
+ sp2->remain_p &&
+ (!img ||
+ (img->start_time < sp2->start_time &&
+ ss->now >= sp2->start_time + sp2->pause_duration)))
+ img = sp2;
+ }
+
+ if (!img) abort();
+ img = copy_sprite (mi, img);
+ img->pause_duration = 0;
+ img->fade_duration = 0.1 / speed;
+ img->duration = 0.5 / speed;
+ img->start_time = ss->now;
+ img->remain_p = False;
+ track_box_with_image (mi, sp, img);
+ img->from = img->current = img->to;
+ }
+
+ return True;
+ }
+ else if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ ss->button_down_p = 1;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ ss->button_down_p = 0;
+
+ if (ss->anim_state == MANUAL_BOX)
+ {
+ sprite *sp = find_newest_sprite (mi, BOX);
+ if (sp) fadeout_sprite (mi, sp);
+ ss->anim_state = BOX_MOVE;
+ ss->anim_duration = 9999;
+ ss->anim_start = ss->now - ss->anim_duration;
+ }
+ else if (ss->anim_state == MANUAL_RETICLE)
+ {
+ sprite *sp = find_newest_sprite (mi, RETICLE);
+ if (sp) fadeout_sprite (mi, sp);
+ ss->anim_state = RETICLE_MOVE;
+ ss->anim_duration = 9999;
+ ss->anim_start = ss->now - ss->anim_duration;
+ }
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ ss->button_down_p &&
+ (ss->anim_state == MANUAL_RETICLE ||
+ ss->anim_state == RETICLE_MOVE))
+ {
+ sprite *sp = 0;
+ double x = event->xmotion.x;
+ double y = event->xmotion.y;
+ double w = MI_WIDTH(mi);
+ double h = MI_HEIGHT(mi);
+
+ adjust_for_device_rotation (&x, &y, &w, &h);
+ x = x/w;
+ y = 1-y/h;
+
+ if (ss->anim_state != MANUAL_RETICLE_ON &&
+ ss->anim_state != MANUAL_RETICLE)
+ {
+ ss->anim_state = MANUAL_RETICLE_ON;
+ tick_animation (mi);
+ }
+ sp = find_newest_sprite (mi, RETICLE);
+ if (!sp) abort();
+ sp->from = sp->current;
+ sp->to = sp->from;
+ sp->start_time = ss->now - sp->fade_duration;
+ sp->remain_p = True;
+
+ sp->current.x = MIN (0.95, MAX (0.05, x));
+ sp->current.y = MIN (0.95, MAX (0.05, y));
+ sp->from = sp->to = sp->current;
+
+ /* Don't update the text sprite more often than once a second. */
+ {
+ sprite *sp2 = find_newest_sprite (mi, TEXT);
+ if (!sp2 || sp2->start_time < ss->now-1)
+ {
+ fadeout_sprites (mi, TEXT);
+ sp = push_text_sprite (mi, sp);
+ sp->remain_p = True;
+ }
+ }
+
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ ss->button_down_p &&
+ (ss->anim_state == MANUAL_BOX ||
+ ss->anim_state == BOX_MOVE))
+ {
+ sprite *sp = 0;
+ double x = event->xmotion.x;
+ double y = event->xmotion.y;
+ double w = MI_WIDTH(mi);
+ double h = MI_HEIGHT(mi);
+ double max;
+ Bool ok = True;
+
+ adjust_for_device_rotation (&x, &y, &w, &h);
+ x = x/w;
+ y = 1-y/h;
+
+ BONK();
+ max = (2 * (0.5 - MAX (fabs (sp->current.x - 0.5),
+ fabs (sp->current.y - 0.5)))
+ * 0.95);
+
+ x = fabs (x - sp->current.x);
+ y = fabs (y - sp->current.y);
+
+ if (x > y)
+ sp->current.w = sp->current.h = MIN (max, MAX (0.05, 2*x));
+ else
+ sp->current.w = sp->current.h = MIN (max, MAX (0.05, 2*y));
+ sp->from = sp->to = sp->current;
+
+ /* Don't update the text sprite more often than once a second. */
+ {
+ sprite *sp2 = find_newest_sprite (mi, TEXT);
+ if (!sp2 || sp2->start_time < ss->now-1)
+ {
+ fadeout_sprites (mi, TEXT);
+ sp = push_text_sprite (mi, sp);
+ sp->remain_p = True;
+ }
+ }
+
+ return ok;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ ss->anim_state = IMAGE_FORCE_UNLOAD;
+ return True;
+ }
+# undef BONK
+
+ return False;
+}
+
+
+ENTRYPOINT void
+reshape_esper (ModeInfo *mi, int width, int height)
+{
+ GLfloat s;
+
+ glViewport (0, 0, width, height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity();
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity();
+
+ s = 2;
+
+ if (debug_p)
+ {
+ s *= 0.75;
+ if (s < 0.1) s = 0.1;
+ }
+
+ glScalef (s, s, s);
+ glTranslatef (-0.5, -0.5, 0);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* Stretch each existing image to match new window aspect. */
+ {
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp && sp->type == IMAGE && sp->img && sp->img->loaded_p)
+ {
+ GLfloat sp_asp = sp->current.h / sp->current.w;
+ GLfloat img_asp = (sp->img->geom.height /
+ (GLfloat) sp->img->geom.width);
+ GLfloat new_win = (MI_WIDTH(mi) / (double) MI_HEIGHT(mi));
+ GLfloat old_win = sp_asp / img_asp;
+ GLfloat r = old_win / new_win;
+ if (img_asp > 1)
+ {
+ sp->from.h /= r;
+ sp->current.h /= r;
+ sp->to.h /= r;
+ }
+ else
+ {
+ sp->from.w *= r;
+ sp->current.w *= r;
+ sp->to.w *= r;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+parse_color (ModeInfo *mi, char *key, GLfloat color[4])
+{
+ XColor xcolor;
+ char *string = get_string_resource (mi->dpy, key, "EsperColor");
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ key, string);
+ exit (1);
+ }
+
+ color[0] = xcolor.red / 65536.0;
+ color[1] = xcolor.green / 65536.0;
+ color[2] = xcolor.blue / 65536.0;
+ color[3] = 1;
+}
+
+
+ENTRYPOINT void
+init_esper (ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ esper_state *ss;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sss);
+ ss = &sss[screen];
+
+ if ((ss->glx_context = init_GL(mi)) != NULL) {
+ reshape_esper (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ parse_color (mi, "gridColor", ss->grid_color);
+ parse_color (mi, "reticleColor", ss->reticle_color);
+ parse_color (mi, "textColor", ss->text_color);
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (GL_FALSE);
+ glEnable (GL_CULL_FACE);
+ glCullFace (GL_BACK);
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ ss->font_data = load_texture_font (mi->dpy, "titleFont");
+
+ ss->now = double_time();
+ ss->dawn_of_time = ss->now;
+
+ alloc_image (mi);
+
+ ss->anim_state = BLANK;
+ ss->anim_start = 0;
+ ss->anim_duration = 0;
+}
+
+
+ENTRYPOINT void
+draw_esper (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (!ss->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ss->glx_context));
+
+ mi->polygon_count = 0;
+
+ ss->now = double_time();
+
+ tick_sprites (mi);
+ draw_sprites (mi);
+ if (ss->now >= ss->anim_start + ss->anim_duration)
+ tick_animation (mi);
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+XSCREENSAVER_MODULE ("Esper", esper)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/esper.man b/hacks/glx/esper.man
new file mode 100644
index 0000000..4d994d9
--- /dev/null
+++ b/hacks/glx/esper.man
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+esper - Enhance 224 to 176. Go right. Enhance 57 19. Track 45 left.
+.SH SYNOPSIS
+.B esper
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-titles]
+[\-fps]
+.SH DESCRIPTION
+"Enhance 224 to 176. Pull out track right. Center in pull back. Pull back.
+Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left. Gimme a
+hardcopy right there."
+
+The Esper Machine was a voice-controlled forensic device used by LAPD
+in 2019, as documented in the 1982 film, \fIBlade Runner.\fP It was
+capable of enhancing photographs to an extreme degree, including
+reconstructing different viewpoints within the space from the
+reflections on various objects in the photograph.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-titles | \-no-titles
+Show file names. Boolean.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the top of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2017 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/extrusion-helix2.c b/hacks/glx/extrusion-helix2.c
new file mode 100644
index 0000000..7a7152f
--- /dev/null
+++ b/hacks/glx/extrusion-helix2.c
@@ -0,0 +1,47 @@
+
+/*
+ * helicoid (gernalized torus) demo
+ *
+ * FUNCTION:
+ * This code provides a very simple example of the helicoid primitive.
+ * Most of this code is required to set up OpenGL and GLUT, and very
+ * very little to set up the helix drawer. Don't blink!
+ *
+ * =======> MOUSE HOOKED UP TO RADIUS, DELTA-RADIUS < ========
+ *
+ * HISTORY:
+ * Written by Linas Vepstas, March 1995
+ */
+
+#include "extrusion.h"
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_helix2 (void)
+{
+}
+
+/* draw the helix shape */
+void DrawStuff_helix2 (void)
+{
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.6, 0.3, 0.8);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* Phew. FINALLY, Draw the helix -- */
+ gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
+ gleHelicoid (0.01*lastx,
+ 6.0, (0.01*lasty - 2.0),
+ -3.0, 4.0, 0x0, 0x0, 0.0, 1080.0);
+
+ glPopMatrix ();
+
+}
+/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-helix3.c b/hacks/glx/extrusion-helix3.c
new file mode 100644
index 0000000..7650f46
--- /dev/null
+++ b/hacks/glx/extrusion-helix3.c
@@ -0,0 +1,46 @@
+
+/*
+ * helicoid (gernalized torus) demo
+ *
+ * FUNCTION:
+ * This code provides a very simple example of the helicoid primitive.
+ * Most of this code is required to set up OpenGL and GLUT, and very
+ * very little to set up the helix drawer. Don't blink!
+ *
+ * =======> MOUSE HOOKED UP TO SWEEP, HEIGHT < ========
+ *
+ * HISTORY:
+ * Written by Linas Vepstas, March 1995
+ */
+
+#include "extrusion.h"
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_helix3 (void)
+{
+}
+
+/* draw the helix shape */
+void DrawStuff_helix3 (void)
+{
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.8, 0.3, 0.6);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* Phew. FINALLY, Draw the helix -- */
+ gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
+ gleHelicoid (1.0, 6.0, -1.0,
+ 0.0, (0.02*lasty-2.0), 0x0, 0x0, 0.0, 6.0*lastx);
+
+ glPopMatrix ();
+
+}
+/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-helix4.c b/hacks/glx/extrusion-helix4.c
new file mode 100644
index 0000000..fbf1602
--- /dev/null
+++ b/hacks/glx/extrusion-helix4.c
@@ -0,0 +1,63 @@
+
+/*
+ * helicoid (gernalized torus) demo
+ *
+ * FUNCTION:
+ * This code provides a very simple example of the helicoid primitive.
+ * Most of this code is required to set up OpenGL and GLUT, and very
+ * very little to set up the helix drawer. Don't blink!
+ *
+ * =======> MOUSE HOOKED UP TO AFFINE < ========
+ *
+ * HISTORY:
+ * Written by Linas Vepstas, March 1995
+ */
+
+#include "extrusion.h"
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_helix4 (void)
+{
+}
+
+/* draw the helix shape */
+void DrawStuff_helix4 (void)
+{
+ double affine[2][3];
+ double delta_affine[2][3];
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.7, 0.5, 0.3);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* Phew. FINALLY, Draw the helix -- */
+ affine [0][0] = 1.0/ (0.01*lastx);
+ affine [1][0] = 0.0;
+ affine [0][1] = 0.0;
+ affine [1][1] = 0.01*lastx;
+ affine [0][2] = 0.0;
+ affine [1][2] = 0.0;
+
+ delta_affine [0][0] = 0.0;
+ delta_affine [1][0] = 0.03*lasty;
+ delta_affine [0][1] = -0.03*lasty;
+ delta_affine [1][1] = 0.0;
+ delta_affine [0][2] = 0.0;
+ delta_affine [1][2] = 0.0;
+
+ gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
+ gleHelicoid (1.0, 7.0, -1.0,
+ -4.0, 6.0, affine, delta_affine, 0.0, 980.0);
+
+ glPopMatrix ();
+
+}
+/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-joinoffset.c b/hacks/glx/extrusion-joinoffset.c
new file mode 100644
index 0000000..89a60e2
--- /dev/null
+++ b/hacks/glx/extrusion-joinoffset.c
@@ -0,0 +1,148 @@
+
+/* cylinder drawing demo */
+/* this demo demonstrates the various join styles */
+
+#include "extrusion.h"
+
+/* ------------------------------------------------------- */
+
+/* the arrays in which we will store the polyline */
+#define NPTS 100
+static double points [NPTS][3];
+static float colors [NPTS][3];
+static int idx = 0;
+
+/* some utilities for filling that array */
+#define PSCALE 0.5
+#define PNT(x,y,z) { \
+ points[idx][0] = PSCALE * x; \
+ points[idx][1] = PSCALE * y; \
+ points[idx][2] = PSCALE * z; \
+ idx ++; \
+}
+
+#define COL(r,g,b) { \
+ colors[idx][0] = r; \
+ colors[idx][1] = g; \
+ colors[idx][2] = b; \
+}
+
+/* the arrays in which we will store the contour */
+#define NCONTOUR 100
+static double contour_points [NCONTOUR][2];
+static int cidx = 0;
+
+/* some utilities for filling that array */
+#define C_PNT(x,y) { \
+ contour_points[cidx][0] = x; \
+ contour_points[cidx][1] = y; \
+ cidx ++; \
+}
+
+
+/* ------------------------------------------------------- */
+/*
+ * Initialize a bent shape with three segments.
+ * The data format is a polyline.
+ *
+ * NOTE that neither the first, nor the last segment are drawn.
+ * The first & last segment serve only to determine that angle
+ * at which the endcaps are drawn.
+ */
+
+void InitStuff_joinoffset (void)
+{
+ COL (0.0, 0.0, 0.0);
+ PNT (16.0, 0.0, 0.0);
+
+ COL (0.2, 0.8, 0.5);
+ PNT (0.0, -16.0, 0.0);
+
+ COL (0.0, 0.8, 0.3);
+ PNT (-16.0, 0.0, 0.0);
+
+ COL (0.8, 0.3, 0.0);
+ PNT (0.0, 16.0, 0.0);
+
+ COL (0.2, 0.3, 0.9);
+ PNT (16.0, 0.0, 0.0);
+
+ COL (0.2, 0.8, 0.5);
+ PNT (0.0, -16.0, 0.0);
+
+ COL (0.0, 0.0, 0.0);
+ PNT (-16.0, 0.0, 0.0);
+
+ C_PNT (-0.8, -0.5);
+ C_PNT (-1.8, 0.0);
+ C_PNT (-1.2, 0.3);
+ C_PNT (-0.7, 0.8);
+ C_PNT (-0.2, 1.3);
+ C_PNT (0.0, 1.6);
+ C_PNT (0.2, 1.3);
+ C_PNT (0.7, 0.8);
+ C_PNT (1.2, 0.3);
+ C_PNT (1.8, 0.0);
+ C_PNT (0.8, -0.5);
+
+ gleSetJoinStyle (TUBE_JN_ANGLE | TUBE_CONTOUR_CLOSED | TUBE_JN_CAP);
+}
+
+static double up_vector[3] = {1.0, 0.0, 0.0};
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+/* ------------------------------------------------------- */
+/* draw the extrusion */
+
+void DrawStuff_joinoffset (void)
+{
+ double moved_contour [NCONTOUR][2];
+ int style, save_style;
+ int i;
+
+ for (i=0; i<cidx; i++) {
+ moved_contour[i][0] = contour_points [i][0];
+ moved_contour[i][1] = contour_points [i][1] + 0.05 * (lasty-200.0);
+ }
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (0, 4, 0);
+ /* glTranslatef (0.0, 4.0, -80.0); */
+ /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
+
+ gleExtrusion (cidx, moved_contour, contour_points, up_vector,
+ idx, points, colors);
+
+ glPopMatrix ();
+
+
+ /* draw a seond copy, this time with the raw style, to compare
+ * things against */
+ glPushMatrix ();
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (0, -4, 0);
+ /* glTranslatef (0.0, -4.0, -80.0); */
+ /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
+
+ save_style = gleGetJoinStyle ();
+ style = save_style;
+ style &= ~TUBE_JN_MASK;
+ style |= TUBE_JN_RAW;
+ gleSetJoinStyle (style);
+
+ gleExtrusion (cidx, moved_contour, contour_points, up_vector,
+ idx, points, colors);
+
+ gleSetJoinStyle (save_style);
+ glPopMatrix ();
+
+}
+
+/* ------------------ end of file ----------------------------- */
diff --git a/hacks/glx/extrusion-screw.c b/hacks/glx/extrusion-screw.c
new file mode 100644
index 0000000..6724476
--- /dev/null
+++ b/hacks/glx/extrusion-screw.c
@@ -0,0 +1,114 @@
+/*
+ * screw.c
+ *
+ * FUNCTION:
+ * Draws a screw shape.
+ *
+ * HISTORY:
+ * -- created by Linas Vepstas October 1991
+ * -- heavily modified to draw more texas shapes, Feb 1993, Linas
+ * -- converted to use GLUT -- December 1995, Linas
+ *
+ */
+
+#include "extrusion.h"
+#include <stdlib.h>
+#include <math.h>
+
+/* =========================================================== */
+
+#define SCALE 1.3
+#define CONTOUR(x,y) { \
+ double ax, ay, alen; \
+ contour[i][0] = SCALE * (x); \
+ contour[i][1] = SCALE * (y); \
+ if (i!=0) { \
+ ax = contour[i][0] - contour[i-1][0]; \
+ ay = contour[i][1] - contour[i-1][1]; \
+ alen = 1.0 / sqrt (ax*ax + ay*ay); \
+ ax *= alen; ay *= alen; \
+ norms [i-1][0] = ay; \
+ norms [i-1][1] = -ax; \
+ } \
+ i++; \
+}
+
+#define NUM_PTS (25)
+
+static double contour [NUM_PTS][2];
+static double norms [NUM_PTS][2];
+
+static void init_contour (void)
+{
+ int i;
+
+ /* outline of extrusion */
+ i=0;
+ CONTOUR (1.0, 1.0);
+ CONTOUR (1.0, 2.9);
+ CONTOUR (0.9, 3.0);
+ CONTOUR (-0.9, 3.0);
+ CONTOUR (-1.0, 2.9);
+
+ CONTOUR (-1.0, 1.0);
+ CONTOUR (-2.9, 1.0);
+ CONTOUR (-3.0, 0.9);
+ CONTOUR (-3.0, -0.9);
+ CONTOUR (-2.9, -1.0);
+
+ CONTOUR (-1.0, -1.0);
+ CONTOUR (-1.0, -2.9);
+ CONTOUR (-0.9, -3.0);
+ CONTOUR (0.9, -3.0);
+ CONTOUR (1.0, -2.9);
+
+ CONTOUR (1.0, -1.0);
+ CONTOUR (2.9, -1.0);
+ CONTOUR (3.0, -0.9);
+ CONTOUR (3.0, 0.9);
+ CONTOUR (2.9, 1.0);
+
+ CONTOUR (1.0, 1.0); /* repeat so that last normal is computed */
+}
+
+/* =========================================================== */
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_screw (void)
+{
+ int style;
+
+ /* configure the pipeline */
+ style = TUBE_JN_CAP;
+ style |= TUBE_CONTOUR_CLOSED;
+ style |= TUBE_NORM_FACET;
+ style |= TUBE_JN_ANGLE;
+ gleSetJoinStyle (style);
+
+ init_contour();
+}
+
+/* =========================================================== */
+
+void DrawStuff_screw (void) {
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.5, 0.6, 0.6);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+ /* glTranslatef (0.0, 0.0, -80.0); */
+ /* glRotatef (130.0, 0.0, 1.0, 0.0); */
+ /* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* draw the brand and the handle */
+ gleScrew (20, contour, norms,
+ NULL, -6.0, 9.0, lasty);
+
+ glPopMatrix ();
+}
+
+/* ===================== END OF FILE ================== */
diff --git a/hacks/glx/extrusion-taper.c b/hacks/glx/extrusion-taper.c
new file mode 100644
index 0000000..d2d05a1
--- /dev/null
+++ b/hacks/glx/extrusion-taper.c
@@ -0,0 +1,218 @@
+/*
+ * taper.c
+ *
+ * FUNCTION:
+ * Draws a tapered screw shape.
+ *
+ * HISTORY:
+ * -- created by Linas Vepstas October 1991
+ * -- heavily modified to draw more texas shapes, Feb 1993, Linas
+ * -- converted to use GLUT -- December 1995, Linas
+ *
+ */
+
+#include "extrusion.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#ifndef NULL
+#define NULL ((void *) 0x0)
+#endif /* NULL */
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/* =========================================================== */
+
+#define SCALE 3.33333
+#define CONTOUR(x,y) { \
+ double ax, ay, alen; \
+ contour[i][0] = SCALE * (x); \
+ contour[i][1] = SCALE * (y); \
+ if (i!=0) { \
+ ax = contour[i][0] - contour[i-1][0]; \
+ ay = contour[i][1] - contour[i-1][1]; \
+ alen = 1.0 / sqrt (ax*ax + ay*ay); \
+ ax *= alen; ay *= alen; \
+ norms [i-1][0] = ay; \
+ norms [i-1][1] = -ax; \
+ } \
+ i++; \
+}
+
+#define NUM_PTS (25)
+
+static double contour [NUM_PTS][2];
+static double norms [NUM_PTS][2];
+
+static void init_contour (void)
+{
+ int i;
+
+ /* outline of extrusion */
+ i=0;
+ CONTOUR (1.0, 1.0);
+ CONTOUR (1.0, 2.9);
+ CONTOUR (0.9, 3.0);
+ CONTOUR (-0.9, 3.0);
+ CONTOUR (-1.0, 2.9);
+
+ CONTOUR (-1.0, 1.0);
+ CONTOUR (-2.9, 1.0);
+ CONTOUR (-3.0, 0.9);
+ CONTOUR (-3.0, -0.9);
+ CONTOUR (-2.9, -1.0);
+
+ CONTOUR (-1.0, -1.0);
+ CONTOUR (-1.0, -2.9);
+ CONTOUR (-0.9, -3.0);
+ CONTOUR (0.9, -3.0);
+ CONTOUR (1.0, -2.9);
+
+ CONTOUR (1.0, -1.0);
+ CONTOUR (2.9, -1.0);
+ CONTOUR (3.0, -0.9);
+ CONTOUR (3.0, 0.9);
+ CONTOUR (2.9, 1.0);
+
+ CONTOUR (1.0, 1.0); /* repeat so that last normal is computed */
+}
+
+/* =========================================================== */
+
+#define PSIZE 40
+static double path[PSIZE][3];
+static double twist[PSIZE];
+static double taper[PSIZE];
+
+static void init_taper (void) {
+ int j;
+ double z, deltaz;
+ double ang, dang;
+
+ z = -10.0;
+ deltaz = 0.5;
+
+ ang = 0.0;
+ dang = 20.0;
+ for (j=0; j<40; j++) {
+ path[j][0] = 0x0;
+ path[j][1] = 0x0;
+ path[j][2] = z;
+
+ twist[j] = ang;
+ ang += dang;
+
+ taper[j] = 0.1 * sqrt (9.51*9.51 - z*z);
+
+ z += deltaz;
+ }
+
+ taper[0] = taper[1];
+ taper[39] = taper[38];
+
+}
+
+/* =========================================================== */
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_taper (void)
+{
+ int style;
+
+ /* configure the pipeline */
+ style = TUBE_JN_CAP;
+ style |= TUBE_CONTOUR_CLOSED;
+ style |= TUBE_NORM_FACET;
+ style |= TUBE_JN_ANGLE;
+ gleSetJoinStyle (style);
+
+ init_contour();
+ init_taper();
+}
+
+/* =========================================================== */
+
+static void gleTaper (int ncp,
+ gleDouble contour[][2],
+ gleDouble cont_normal[][2],
+ gleDouble up[3],
+ int npoints,
+ gleDouble point_array[][3],
+ float color_array[][3],
+ gleDouble taper[],
+ gleDouble twist[])
+{
+ int j;
+ gleAffine *xforms;
+ double co, si, angle;
+
+ /* malloc the extrusion array and the twist array */
+ xforms = (gleAffine *) malloc (npoints * sizeof(gleAffine));
+
+ for (j=0; j<npoints; j++) {
+ angle = (M_PI/180.0) * twist[j];
+ si = sin (angle);
+ co = cos (angle);
+ xforms[j][0][0] = taper[j] * co;
+ xforms[j][0][1] = - taper[j] * si;
+ xforms[j][0][2] = 0.0;
+ xforms[j][1][0] = taper[j] * si;
+ xforms[j][1][1] = taper[j] * co;
+ xforms[j][1][2] = 0.0;
+ }
+
+ gleSuperExtrusion (ncp, /* number of contour points */
+ contour, /* 2D contour */
+ cont_normal, /* 2D contour normals */
+ up, /* up vector for contour */
+ npoints, /* numpoints in poly-line */
+ point_array, /* polyline */
+ color_array, /* color of polyline */
+ xforms);
+
+ free (xforms);
+}
+
+/* =========================================================== */
+
+void DrawStuff_taper (void) {
+ int j;
+ double ang, dang;
+ double z, deltaz;
+ double ponent;
+ z=-1.0;
+ deltaz = 1.999/38;
+ ang = 0.0;
+ dang = lasty/40.0;
+ ponent = fabs (lastx/540.0);
+ for (j=1; j<39; j++) {
+ twist[j] = ang;
+ ang += dang;
+
+ taper[j] = pow ((1.0 - pow (fabs(z), 1.0/ponent)), ponent);
+ z += deltaz;
+ }
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.5, 0.6, 0.6);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+ /* glTranslatef (0.0, 0.0, -80.0); */
+ /* glRotatef (130.0, 0.0, 1.0, 0.0); */
+ /* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* draw the brand and the handle */
+ gleTaper (20, contour, norms, NULL, 40, path, NULL, taper, twist);
+
+ glPopMatrix ();
+}
+
+/* ===================== END OF FILE ================== */
diff --git a/hacks/glx/extrusion-twistoid.c b/hacks/glx/extrusion-twistoid.c
new file mode 100644
index 0000000..82034af
--- /dev/null
+++ b/hacks/glx/extrusion-twistoid.c
@@ -0,0 +1,215 @@
+/*
+ * twistoid.c
+ *
+ * FUNCTION:
+ * Show extrusion of open contours. Also, show how torsion is applied.
+ *
+ * HISTORY:
+ * -- linas Vepstas October 1991
+ * -- heavily modified to draw corrugated surface, Feb 1993, Linas
+ * -- modified to demo twistoid March 1993
+ * -- port to glut Linas Vepstas March 1995
+ */
+
+#include "extrusion.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+#define OPENGL_10
+/* =========================================================== */
+
+#define NUM_TOID1_PTS 5
+static double toid1_points[NUM_TOID1_PTS][3];
+static float toid1_colors [NUM_TOID1_PTS][3];
+static double toid1_twists [NUM_TOID1_PTS];
+
+#define TSCALE (6.0)
+
+#define TPTS(x,y) { \
+ toid1_points[i][0] = TSCALE * (x); \
+ toid1_points[i][1] = TSCALE * (y); \
+ toid1_points[i][2] = TSCALE * (0.0); \
+ i++; \
+}
+
+#define TCOLS(r,g,b) { \
+ toid1_colors[i][0] = (r); \
+ toid1_colors[i][1] = (g); \
+ toid1_colors[i][2] = (b); \
+ i++; \
+}
+
+#define TXZERO() { \
+ toid1_twists[i] = 0.0; \
+ i++; \
+}
+
+static void init_toid1_line (void)
+{
+ int i;
+
+ i=0;
+ TPTS (-1.1, 0.0);
+ TPTS (-1.0, 0.0);
+ TPTS (0.0, 0.0);
+ TPTS (1.0, 0.0);
+ TPTS (1.1, 0.0);
+
+ i=0;
+ TCOLS (0.8, 0.8, 0.5);
+ TCOLS (0.8, 0.4, 0.5);
+ TCOLS (0.8, 0.8, 0.3);
+ TCOLS (0.4, 0.4, 0.5);
+ TCOLS (0.8, 0.8, 0.5);
+
+ i=0;
+ TXZERO ();
+ TXZERO ();
+ TXZERO ();
+ TXZERO ();
+ TXZERO ();
+}
+
+/* =========================================================== */
+
+#define SCALE 0.6
+#define TWIST(x,y) { \
+ double ax, ay, alen; \
+ twistation[i][0] = SCALE * (x); \
+ twistation[i][1] = SCALE * (y); \
+ if (i!=0) { \
+ ax = twistation[i][0] - twistation[i-1][0]; \
+ ay = twistation[i][1] - twistation[i-1][1]; \
+ alen = 1.0 / sqrt (ax*ax + ay*ay); \
+ ax *= alen; ay *= alen; \
+ twist_normal [i-1][0] = - ay; \
+ twist_normal [i-1][1] = ax; \
+ } \
+ i++; \
+}
+
+#define NUM_TWIS_PTS (20)
+
+static double twistation [NUM_TWIS_PTS][2];
+static double twist_normal [NUM_TWIS_PTS][2];
+
+static void init_tripples (void)
+{
+ int i;
+ double angle;
+ double co, si;
+
+ /* outline of extrusion */
+ i=0;
+ /* first, draw a semi-curcular "hump" */
+ while (i< 11) {
+ angle = M_PI * ((double) i) / 10.0;
+ co = cos (angle);
+ si = sin (angle);
+ TWIST ((-7.0 -3.0*co), 1.8*si);
+ }
+
+ /* now, a zig-zag corrugation */
+ while (1) {
+ if (i >= NUM_TWIS_PTS) break;
+ TWIST ((-10.0 +(double) i), 0.0);
+ if (i >= NUM_TWIS_PTS) break;
+ TWIST ((-9.5 +(double) i), 1.0);
+ }
+}
+
+
+/* =========================================================== */
+
+#define V3F(x,y,z) { \
+ float vvv[3]; \
+ vvv[0] = x; vvv[1] = y; vvv[2] = z; v3f (vvv); \
+}
+
+#define N3F(x,y,z) { \
+ float nnn[3]; \
+ nnn[0] = x; nnn[1] = y; nnn[2] = z; n3f (nnn); \
+}
+
+/* =========================================================== */
+
+void DrawStuff_twistoid (void) {
+ int i;
+
+ toid1_twists[2] = (lastx-121.0) / 8.0;
+
+ i=3;
+/*
+ TPTS (1.0, lasty /400.0);
+ TPTS (1.1, 1.1 * lasty / 400.0);
+*/
+ TPTS (1.0, -(lasty-121.0) /200.0);
+ TPTS (1.1, -1.1 * (lasty-121.0) / 200.0);
+
+#ifdef IBM_GL_32
+ rotate (230, 'x');
+ rotate (230, 'y');
+ scale (1.8, 1.8, 1.8);
+
+ if (mono_color) {
+ RGBcolor (178, 178, 204);
+ twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal,
+ NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
+ } else {
+ twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal,
+ NULL, NUM_TOID1_PTS, toid1_points, toid1_colors, toid1_twists);
+ }
+#endif
+
+#ifdef OPENGL_10
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glFrontFace(GL_CW); /* jwz */
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotated (43.0, 1.0, 0.0, 0.0); */
+/* glRotated (43.0, 0.0, 1.0, 0.0); */
+ glScaled (1.8, 1.8, 1.8);
+ gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal,
+ NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
+ glPopMatrix ();
+#endif
+
+}
+
+/* =========================================================== */
+
+void InitStuff_twistoid (void)
+{
+ int js;
+
+ init_toid1_line ();
+ init_tripples ();
+
+#ifdef IBM_GL_32
+ js = getjoinstyle ();
+ js &= ~TUBE_CONTOUR_CLOSED;
+ setjoinstyle (js);
+#endif
+
+#ifdef OPENGL_10
+ js = gleGetJoinStyle ();
+ js &= ~TUBE_CONTOUR_CLOSED;
+ gleSetJoinStyle (js);
+#endif
+
+}
+
+/* ------------------ end of file -------------------- */
diff --git a/hacks/glx/extrusion.c b/hacks/glx/extrusion.c
new file mode 100644
index 0000000..3dee71c
--- /dev/null
+++ b/hacks/glx/extrusion.c
@@ -0,0 +1,556 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* extrusion --- extrusion module for xscreensaver */
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+
+ * Revision History:
+ * Tue Oct 19 22:24:47 PDT 1999 Initial creation by David Konerding
+ * <dek@cgl.ucsf.edu>
+ *
+ * Notes:
+ * This screensaver requires the GLE ("OpenGL Tubing and Extrusion Library")
+ * which can be obtained from http://www.linas.org/gle/index.html
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define free_extrusion 0
+# define release_extrusion 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "extrusion.h"
+
+#define checkImageWidth 64
+#define checkImageHeight 64
+
+
+#define WIDTH 640
+#define HEIGHT 480
+
+#define DEF_LIGHT "True"
+#define DEF_TEXTURE "False"
+#define DEF_TEX_QUAL "False"
+#define DEF_MIPMAP "False"
+#define DEF_NAME "RANDOM"
+#define DEF_IMAGE "BUILTIN"
+
+static int do_light;
+static int do_texture;
+static int do_tex_qual;
+static int do_mipmap;
+static char *which_name;
+static char *which_image;
+
+static XrmOptionDescRec opts[] = {
+ {"-light", ".extrusion.light", XrmoptionNoArg, "true" },
+ {"+light", ".extrusion.light", XrmoptionNoArg, "false" },
+ {"-texture", ".extrusion.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".extrusion.texture", XrmoptionNoArg, "false" },
+ {"-texture", ".extrusion.texture", XrmoptionNoArg, "true" },
+ {"+texture_quality", ".extrusion.texture", XrmoptionNoArg, "false" },
+ {"-texture_quality", ".extrusion.texture", XrmoptionNoArg, "true" },
+ {"+mipmap", ".extrusion.mipmap", XrmoptionNoArg, "false" },
+ {"-mipmap", ".extrusion.mipmap", XrmoptionNoArg, "true" },
+ {"-name", ".extrusion.name", XrmoptionSepArg, 0 },
+ {"-image", ".extrusion.image", XrmoptionSepArg, 0 },
+};
+
+
+static argtype vars[] = {
+ {&do_light, "light", "Light", DEF_LIGHT, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_tex_qual, "texture_quality", "Texture_Quality", DEF_TEX_QUAL, t_Bool},
+ {&do_mipmap, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ {&which_name, "name", "Name", DEF_NAME, t_String},
+ {&which_image, "image", "Image", DEF_IMAGE, t_String},
+};
+
+
+static OptionStruct desc[] =
+{
+ {"-name num", "example 'name' to draw (helix2, helix3, helix4, joinoffset, screw, taper, twistoid)"},
+ {"-/+ light", "whether to do enable lighting (slower)"},
+ {"-/+ texture", "whether to apply a texture (slower)"},
+ {"-image <filename>", "texture image to load"},
+ {"-/+ texture_quality", "whether to use texture smoothing (slower)"},
+ {"-/+ mipmap", "whether to use texture mipmap (slower)"},
+};
+
+ENTRYPOINT ModeSpecOpt extrusion_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct extrusion_description =
+{"extrusion", "init_extrusion", "draw_extrusion", NULL,
+ "draw_extrusion", "init_extrusion", NULL, &extrusion_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL extrusion", 0, NULL};
+#endif
+
+
+/* structure for holding the extrusion data */
+typedef struct {
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool button2_down_p;
+ int mouse_start_x, mouse_start_y;
+ int mouse_x, mouse_y;
+ int mouse_dx, mouse_dy;
+ Window window;
+ XColor fg, bg;
+ int extrusion_number;
+} extrusionstruct;
+
+static extrusionstruct *Extrusion = NULL;
+
+
+
+/* set up a light */
+static const GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
+static const GLfloat lightOneColor[] = {0.99, 0.99, 0.00, 1.0};
+
+static const GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
+static const GLfloat lightTwoColor[] = {0.00, 0.99, 0.99, 1.0};
+
+float rot_x=0, rot_y=0, rot_z=0;
+float lastx=0, lasty=0;
+
+static float max_lastx=400, max_lasty=400;
+static float min_lastx=-400, min_lasty=-400;
+
+struct functions {
+ void (*InitStuff)(void);
+ void (*DrawStuff)(void);
+ char *name;
+};
+
+/* currently joinoffset and twistoid look funny-
+ like we're looking at them from the back or something
+*/
+
+static const struct functions funcs_ptr[] = {
+ {InitStuff_helix2, DrawStuff_helix2, "helix2"},
+ {InitStuff_helix3, DrawStuff_helix3, "helix3"},
+ {InitStuff_helix4, DrawStuff_helix4, "helix4"},
+ {InitStuff_joinoffset, DrawStuff_joinoffset, "joinoffset"},
+ {InitStuff_screw, DrawStuff_screw, "screw"},
+ {InitStuff_taper, DrawStuff_taper, "taper"},
+ {InitStuff_twistoid, DrawStuff_twistoid, "twistoid"},
+};
+
+static int num_extrusions = countof(funcs_ptr);
+
+
+/* BEGINNING OF FUNCTIONS */
+
+
+static GLubyte *
+Generate_Image(int *width, int *height, int *format)
+{
+ GLubyte *result;
+ int i, j, c;
+ int counter=0;
+
+ *width = checkImageWidth;
+ *height = checkImageHeight;
+ result = (GLubyte *)malloc(4 * (*width) * (*height));
+
+ counter = 0;
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = (((((i&0x8)==0))^(((j&0x8))==0)))*255;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) 255;
+ }
+ }
+
+ *format = GL_RGBA;
+ return result;
+}
+
+
+/* Create a texture in OpenGL. First an image is loaded
+ and stored in a raster buffer, then it's */
+static void Create_Texture(ModeInfo *mi, const char *filename)
+{
+ int height, width;
+ GLubyte *image;
+ int format;
+
+ if ( !strncmp(filename, "BUILTIN", 7))
+ {
+ BUILTIN:
+ image = Generate_Image(&width, &height, &format);
+ }
+ else
+ {
+ XImage *ximage = file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ filename);
+ if (!ximage)
+ goto BUILTIN;
+ image = (GLubyte *) ximage->data;
+ width = ximage->width;
+ height = ximage->height;
+ format = GL_RGBA;
+ }
+
+ /* GL_MODULATE or GL_DECAL depending on what you want */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* perhaps we can edge a bit more speed at the expense of quality */
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+
+ if (do_tex_qual) {
+ /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ }
+ else {
+ /* default is to do it quick and dirty */
+ /* if you have mipmaps turned on, but not texture quality, nothing will happen! */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
+
+ /* mipmaps make the image look much nicer */
+ if (do_mipmap)
+ {
+ int status;
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, format,
+ GL_UNSIGNED_BYTE, image);
+ if (status)
+ {
+ const char *s = (char *) gluErrorString (status);
+ fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
+ progname, width, height,
+ (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+ }
+ else
+ {
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0,
+ format, GL_UNSIGNED_BYTE, image);
+ check_gl_error("texture");
+ }
+}
+
+
+static void
+init_rotation (ModeInfo *mi)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+ double spin_speed = 0.5;
+ gp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ 0.2,
+ 0.005,
+ True);
+ gp->trackball = gltrackball_init (True);
+
+ lastx = (random() % (int) (max_lastx - min_lastx)) + min_lastx;
+ lasty = (random() % (int) (max_lasty - min_lasty)) + min_lasty;
+}
+
+
+/* draw the extrusion once */
+ENTRYPOINT void
+draw_extrusion(ModeInfo * mi)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ static const GLfloat color[4] = {0.6, 0.6, 0.4, 1.0};
+ /* static const GLfloat spec[4] = {0.6, 0.6, 0.6, 1.0}; */
+ /* static const GLfloat shiny = 40.0; */
+
+ double x, y, z;
+
+ if (!gp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(gp->glx_context));
+
+ glPushMatrix();
+
+ gltrackball_rotate (gp->trackball);
+
+ get_rotation (gp->rot, &x, &y, &z,
+ !(gp->button_down_p || gp->button2_down_p));
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+
+ /* track the mouse only if a button is down. */
+ if (gp->button2_down_p)
+ {
+ gp->mouse_dx += gp->mouse_x - gp->mouse_start_x;
+ gp->mouse_dy += gp->mouse_y - gp->mouse_start_y;
+ gp->mouse_start_x = gp->mouse_x;
+ gp->mouse_start_y = gp->mouse_y;
+ }
+
+ {
+ float scale = (max_lastx - min_lastx);
+ get_position (gp->rot, &x, &y, &z,
+ !(gp->button_down_p || gp->button2_down_p));
+ lastx = x * scale + min_lastx + gp->mouse_dx;
+ lasty = y * scale + min_lasty + gp->mouse_dy;
+ }
+
+ glScalef(0.5, 0.5, 0.5);
+
+ /* glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); */
+ /* glMateriali (GL_FRONT_AND_BACK, GL_SHININESS, shiny); */
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glFrontFace(GL_CCW);
+
+ funcs_ptr[gp->extrusion_number].DrawStuff();
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glXSwapBuffers(display, window);
+}
+
+
+/* set up lighting conditions */
+static void
+SetupLight(void)
+{
+ glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
+ glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
+ glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition);
+ glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor);
+
+ glEnable (GL_LIGHT0);
+ glEnable (GL_LIGHT1);
+ glEnable (GL_LIGHTING);
+
+ glColorMaterial (GL_FRONT, GL_DIFFUSE);
+ glColorMaterial (GL_BACK, GL_DIFFUSE);
+ glEnable (GL_COLOR_MATERIAL);
+}
+
+/* Standard reshape function */
+ENTRYPOINT void
+reshape_extrusion (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+/* decide which extrusion example to run */
+static void
+chooseExtrusionExample (ModeInfo *mi)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+ int i;
+ /* call the extrusion init routine */
+
+ if (!strncmp(which_name, "RANDOM", strlen(which_name))) {
+ gp->extrusion_number = random() % num_extrusions;
+ }
+ else {
+ gp->extrusion_number=-1;
+ for (i=0; i < num_extrusions; i++) {
+ if (!strncmp(which_name, funcs_ptr[i].name, strlen(which_name))) {
+ gp->extrusion_number = i;
+ }
+ }
+ }
+
+ if (gp->extrusion_number < 0 || gp->extrusion_number >= num_extrusions) {
+ fprintf(stderr, "%s: invalid extrusion example number!\n", progname);
+ fprintf(stderr, "%s: known extrusions:\n", progname);
+ for (i=0; i < num_extrusions; i++)
+ fprintf(stderr,"\t%s\n", funcs_ptr[i].name);
+ exit(1);
+ }
+ init_rotation(mi);
+ funcs_ptr[gp->extrusion_number].InitStuff();
+}
+
+
+/* main OpenGL initialization routine */
+static void
+initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
+{
+ int style;
+ int mode;
+
+ reshape_extrusion(mi, width, height);
+ glViewport( 0, 0, width, height );
+
+ glEnable(GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+ glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, True);
+ glShadeModel(GL_SMOOTH);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ MI_IS_WIREFRAME(mi) = 0;
+# endif
+
+ if (do_light)
+ SetupLight();
+ if (MI_IS_WIREFRAME(mi)) {
+ glPolygonMode(GL_FRONT,GL_LINE);
+ glPolygonMode(GL_BACK,GL_LINE);
+ }
+ if (do_texture) {
+ Create_Texture(mi, which_image);
+ glEnable(GL_TEXTURE_2D);
+
+ /* configure the pipeline */
+ style = TUBE_JN_CAP;
+ style |= TUBE_CONTOUR_CLOSED;
+ style |= TUBE_NORM_FACET;
+ style |= TUBE_JN_ANGLE;
+ gleSetJoinStyle (style);
+
+ if (do_texture) {
+ mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_MODEL_FLAT;
+ glMatrixMode (GL_TEXTURE); glLoadIdentity ();
+ glScalef (0.25, 0.1, 1); glMatrixMode (GL_MODELVIEW);
+ gleTextureMode (mode);
+ }
+ }
+
+}
+
+ENTRYPOINT Bool
+extrusion_handle_event (ModeInfo *mi, XEvent *event)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button5 ||
+ event->xbutton.button == Button6 ||
+ event->xbutton.button == Button7))
+ {
+ }
+ else if (event->xany.type == ButtonPress && /* rotate with left button */
+ !event->xbutton.state) /* if no modifier keys */
+ {
+ }
+ else if (event->xany.type == ButtonPress) /* deform with other buttons */
+ { /* or with modifier keys */
+ gp->button2_down_p = True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ gp->button_down_p = False;
+ gp->button2_down_p = False;
+ }
+ else if (event->xany.type == MotionNotify)
+ {
+ if (gp->button2_down_p)
+ {
+ gp->mouse_x = event->xmotion.x;
+ gp->mouse_y = event->xmotion.y;
+ }
+ }
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+/* xextrusion initialization routine */
+ENTRYPOINT void
+init_extrusion (ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ extrusionstruct *gp;
+
+ if (MI_IS_WIREFRAME(mi)) do_light = 0;
+
+ MI_INIT(mi, Extrusion);
+ gp = &Extrusion[screen];
+
+ gp->window = MI_WINDOW(mi);
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_extrusion(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ chooseExtrusionExample(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+}
+
+XSCREENSAVER_MODULE ("Extrusion", extrusion)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/extrusion.h b/hacks/glx/extrusion.h
new file mode 100644
index 0000000..226a442
--- /dev/null
+++ b/hacks/glx/extrusion.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* extrusion --- extrusion module for xscreensaver */
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#ifndef __XSCREENSAVER_EXTRUSION_H__
+#define __XSCREENSAVER_EXTRUSION_H__
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_COCOA
+# include <GLUT/tube.h> /* gle is included with GLUT on OSX */
+#else /* !HAVE_COCOA */
+# include <GL/gl.h>
+# include <GL/glu.h>
+# ifdef HAVE_GLE3
+# include <GL/gle.h>
+# else
+# include <GL/tube.h>
+# endif
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+extern void InitStuff_helix2(void);
+extern void DrawStuff_helix2(void);
+extern void InitStuff_helix3(void);
+extern void DrawStuff_helix3(void);
+extern void InitStuff_helix4(void);
+extern void DrawStuff_helix4(void);
+extern void InitStuff_joinoffset(void);
+extern void DrawStuff_joinoffset(void);
+extern void InitStuff_screw(void);
+extern void DrawStuff_screw(void);
+extern void InitStuff_taper(void);
+extern void DrawStuff_taper(void);
+extern void InitStuff_twistoid(void);
+extern void DrawStuff_twistoid(void);
+
+#endif /* __XSCREENSAVER_EXTRUSION_H__ */
diff --git a/hacks/glx/extrusion.man b/hacks/glx/extrusion.man
new file mode 100644
index 0000000..e01d573
--- /dev/null
+++ b/hacks/glx/extrusion.man
@@ -0,0 +1,71 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+extrusion - various rotating extruded shapes.
+.SH SYNOPSIS
+.B extrusion
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-name \fIwhich\fP]
+[\-no-light]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws various rotating extruded shapes that twist around, lengthen, and
+turn inside out.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-name \fIwhich\fP
+Which object to draw. Choices are: helix2, helix3, helix4, joinoffset,
+screw, taper, and twistoid.
+.TP 8
+.B \-light | \-no-light
+Whether to light the scene, or use flat coloring.
+.TP 8
+.B \-bitmap \fIfile\fP
+The texture map to use.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Linas Vepstas and David Konerding. Permission
+to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+This screensaver was created by David Konerding from the samples that
+come with the GL Extrusion library by Linas Vepstas.
diff --git a/hacks/glx/flipflop.c b/hacks/glx/flipflop.c
new file mode 100644
index 0000000..c26458c
--- /dev/null
+++ b/hacks/glx/flipflop.c
@@ -0,0 +1,859 @@
+/* flipflop, Copyright (c) 2003 Kevin Ogden <kogden1@hotmail.com>
+ * (c) 2006 Sergio Gutiérrez "Sergut" <sergut@gmail.com>
+ * (c) 2008 Andrew Galante <a.drew7@gmail.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ *
+ * 2003 Kevin Odgen First version
+ * 2006 Sergio Gutiérrez "Sergut" Made several parameters dynamic and selectable
+ * from the command line: size of the board,
+ * rotation speed and number of free squares; also
+ * added the "sticks" mode.
+ * 2008 Andrew Galante Added -textured option: textures the board with
+ * an image which gets scrambled as the tiles move
+ *
+ */
+
+#define DEF_MODE "tiles" /* Default mode (options: "tiles", "sticks") */
+#define DEF_SIZEX "9" /* Default width of the board */
+#define DEF_SIZEY "9" /* Default length of the board */
+
+#define DEF_BOARD_SIZE "0" /* "0" means "no value selected by user". It is changed */
+#define DEF_NUMSQUARES "0" /* in function init_flipflop() to its correct value (that */
+#define DEF_FREESQUARES "0" /* is a function of the size of the board and the mode)*/
+
+#define DEF_SPIN "0.1" /* Default angular velocity: PI/10 rads/s */
+
+#define DEF_TEXTURED "False" /* Default: do not grab an image for texturing */
+
+#define DEF_STICK_THICK 54 /* Thickness for the sticks mode (over 100) */
+#define DEF_STICK_RATIO 80 /* Ratio of sticks/total squares (over 100) */
+#define DEF_TILE_THICK 4 /* Thickness for the tiles mode (over 100) */
+#define DEF_TILE_RATIO 95 /* Ratio of tiles/total squares (over 100) */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define release_flipflop 0
+# include "xlockmore.h"
+
+#else
+# include "xlock.h"
+#endif /* STANDALONE */
+
+#ifdef USE_GL
+
+#include "gltrackball.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ {"-sticks", ".mode", XrmoptionNoArg, "sticks"},
+ {"-tiles", ".mode", XrmoptionNoArg, "tiles" },
+ {"-mode", ".mode", XrmoptionSepArg, 0 },
+ {"-size", ".size", XrmoptionSepArg, 0 },
+ {"-size-x", ".sizex", XrmoptionSepArg, 0 },
+ {"-size-y", ".sizey", XrmoptionSepArg, 0 },
+ {"-count", ".numsquares", XrmoptionSepArg, 0 },
+ {"-free", ".freesquares", XrmoptionSepArg, 0 },
+ {"-spin", ".spin", XrmoptionSepArg, 0 },
+ {"-texture", ".textured", XrmoptionNoArg, "True" },
+ {"+texture", ".textured", XrmoptionNoArg, "False" },
+};
+
+static int wire, clearbits;
+static int board_x_size, board_y_size, board_avg_size;
+static int numsquares, freesquares;
+static float half_thick;
+static float spin;
+static char* flipflopmode_str="tiles";
+static int textured;
+
+static argtype vars[] = {
+ { &flipflopmode_str, "mode", "Mode", DEF_MODE, t_String},
+ { &board_avg_size, "size", "Integer", DEF_BOARD_SIZE, t_Int},
+ { &board_x_size, "sizex", "Integer", DEF_SIZEX, t_Int},
+ { &board_y_size, "sizey", "Integer", DEF_SIZEY, t_Int},
+ { &numsquares, "numsquares", "Integer", DEF_NUMSQUARES, t_Int},
+ { &freesquares, "freesquares", "Integer", DEF_NUMSQUARES, t_Int},
+ { &spin, "spin", "Float", DEF_SPIN, t_Float},
+ { &textured, "textured", "Bool", DEF_TEXTURED, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt flipflop_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct flipflop_description =
+ {"flipflop", "init_flipflop", "draw_flipflop", NULL,
+ "draw_flipflop", "init_flipflop", "free_flipflop", &flipflop_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Flipflop", 0, NULL};
+
+#endif /* USE_MODULES */
+
+typedef struct {
+ /* array specifying which squares are where (to avoid collisions) */
+ /* -1 means empty otherwise integer represents square index 0 - n-1 */
+ /* occupied[x*board_y_size+y] is the tile [x][y] (i.e. that starts at column x and row y)*/
+ int *occupied; /* size: size_x * size_y */
+ /* an array of xpositions of the squares */
+ int *xpos; /* size: numsquares */
+ /* array of y positions of the squares */
+ int *ypos; /* size: numsquares */
+ /* integer representing the direction of movement of a square */
+ int *direction; /* 0 not, 1 x+, 2 y+, 3 x-, 4 y-*/ /* size: numsquares */
+ /* angle of moving square (during a flip) */
+ float *angle; /* size: numsquares */
+ /* array of colors for a square (RGB) */
+ /* eg. color[ 3*3 + 0 ] is the red component of square 3 */
+ /* eg. color[ 4*3 + 1 ] is the green component of square 4 */
+ /* eg. color[ 5*3 + 2 ] is the blue component of square 5 */
+ /* ^-- n is the number of square */
+ float *color; /* size: numsquares * 3 */
+ /* array of texcoords for each square */
+ /* tex[ n*4 + 0 ] is x texture coordinate of square n's left side */
+ /* tex[ n*4 + 1 ] is y texture coordinate of square n's top side */
+ /* tex[ n*4 + 2 ] is x texture coordinate of square n's right side */
+ /* tex[ n*4 + 3 ] is y texture coordinate of square n's bottom side */
+ float *tex; /* size: numsquares * 4 */
+} randsheet;
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ randsheet *sheet;
+
+ float theta; /* angle of rotation of the board */
+ float flipspeed; /* amount of flip; 1 is a entire flip */
+ float reldist; /* relative distace of camera from center */
+ float energy; /* likelyhood that a square will attempt to move */
+
+ /* texture rectangle */
+ float tex_x;
+ float tex_y;
+ float tex_width;
+ float tex_height;
+
+ /* id of texture in use */
+ GLuint texid;
+
+ Bool mipmap;
+ Bool got_texture;
+
+ GLfloat anisotropic;
+
+} Flipflopcreen;
+
+static Flipflopcreen *qs = NULL;
+
+#include "grab-ximage.h"
+
+static void randsheet_create( randsheet *rs );
+static void randsheet_initialize( randsheet *rs );
+static void randsheet_free( randsheet *rs );
+static int randsheet_new_move( randsheet* rs );
+static void randsheet_move( randsheet *rs, float rot );
+static int randsheet_draw( randsheet *rs );
+static void setup_lights(void);
+static int drawBoard(Flipflopcreen *);
+static int display(ModeInfo *mi);
+static int draw_sheet(float *tex);
+
+
+/* configure lighting */
+static void
+setup_lights(void)
+{
+ /* GLfloat position0[] = { board_avg_size*0.5, board_avg_size*0.1, board_avg_size*0.5, 1.0 }; */
+
+ /* GLfloat position0[] = { -board_avg_size*0.5, 0.2*board_avg_size, -board_avg_size*0.5, 1.0 }; */
+ GLfloat position0[4];
+ position0[0] = 0;
+ position0[1] = board_avg_size*0.3;
+ position0[2] = 0;
+ position0[3] = 1;
+
+ if (wire) return;
+
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glEnable(GL_LIGHT0);
+}
+
+static void get_texture(ModeInfo *);
+
+
+ENTRYPOINT Bool
+flipflop_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, c->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &c->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ if (!textured || c->got_texture)
+ {
+ textured = 1;
+ c->got_texture = False;
+ get_texture (mi);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+/* draw board */
+static int
+drawBoard(Flipflopcreen *c)
+{
+ int i;
+ for( i=0; i < (c->energy) ; i++ ) {
+ randsheet_new_move( c->sheet );
+ }
+ randsheet_move( c->sheet, c->flipspeed * 3.14159 );
+ return randsheet_draw( c->sheet );
+}
+
+
+static int
+display(ModeInfo *mi)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ GLfloat amb[] = { 0.8, 0.8, 0.8, 1.0 };
+ int polys = 0;
+
+
+ glClear(clearbits);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.2);
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.15/board_avg_size );
+ glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.15/board_avg_size );
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /** setup perspectif */
+ glTranslatef(0.0, 0.0, -c->reldist*board_avg_size);
+ glRotatef(22.5, 1.0, 0.0, 0.0);
+ gltrackball_rotate (c->trackball);
+ glRotatef(c->theta*100, 0.0, 1.0, 0.0);
+ glTranslatef(-0.5*board_x_size, 0.0, -0.5*board_y_size); /* Center the board */
+
+ /* set texture */
+ if(textured)
+ glBindTexture(GL_TEXTURE_2D, c->texid);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ polys = drawBoard(c);
+
+ if (!c->button_down_p) {
+ c->theta += .01 * spin;
+ }
+
+ return polys;
+}
+
+ENTRYPOINT void
+reshape_flipflop(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0,y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1/h, 1.0, 300.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ Flipflopcreen *c = (Flipflopcreen *)closure;
+ int i, j;
+ int index = 0;
+ randsheet *rs = c->sheet;
+
+ c->tex_x = (float)geometry->x / (float)texture_width;
+ c->tex_y = (float)geometry->y / (float)texture_height;
+ c->tex_width = (float)geometry->width / (float)texture_width;
+ c->tex_height = (float)geometry->height / (float)texture_height;
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (c->mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ if(c->anisotropic >= 1)
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, c->anisotropic);
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for(i = 0; i < board_x_size && index < numsquares; i++)
+ for(j = 0; j < board_y_size && index < numsquares; j++)
+ {
+ /* arrange squares to form loaded image */
+ rs->tex[ index*4 + 0 ] = c->tex_x + c->tex_width / board_x_size * (i + 0);
+ rs->tex[ index*4 + 1 ] = c->tex_y + c->tex_height / board_y_size * (j + 1);
+ rs->tex[ index*4 + 2 ] = c->tex_x + c->tex_width / board_x_size * (i + 1);
+ rs->tex[ index*4 + 3 ] = c->tex_y + c->tex_height / board_y_size * (j + 0);
+ rs->color[ index*3 + 0 ] = 1;
+ rs->color[ index*3 + 1 ] = 1;
+ rs->color[ index*3 + 2 ] = 1;
+ index++;
+ }
+
+ c->got_texture = True;
+}
+
+static void
+get_texture(ModeInfo *modeinfo)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(modeinfo)];
+
+ c->got_texture = False;
+ c->mipmap = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ *c->glx_context, 0, 0, c->mipmap, c->texid,
+ image_loaded_cb, c);
+}
+
+ENTRYPOINT void
+init_flipflop(ModeInfo *mi)
+{
+ int screen;
+ Flipflopcreen *c;
+
+ if (MI_IS_WIREFRAME(mi)) textured = 0;
+
+ /* Set all constants to their correct values */
+ if (board_avg_size != 0) { /* general size specified by user */
+ board_x_size = board_avg_size;
+ board_y_size = board_avg_size;
+ } else {
+ board_avg_size = (board_x_size + board_y_size) / 2;
+ }
+ if ((numsquares == 0) && (freesquares != 0)) {
+ numsquares = board_x_size * board_y_size - freesquares;
+ }
+ if (strcmp(flipflopmode_str, "tiles")) {
+ textured = 0; /* textures look dumb in stick mode */
+ half_thick = 1.0 * DEF_STICK_THICK / 100.0;
+ if (numsquares == 0) { /* No value defined by user */
+ numsquares = board_x_size * board_y_size * DEF_STICK_RATIO / 100;
+ }
+ } else {
+ half_thick = 1.0 * DEF_TILE_THICK / 100.0;
+ if (numsquares == 0) { /* No value defined by user */
+ numsquares = board_x_size * board_y_size * DEF_TILE_RATIO/ 100;;
+ }
+ }
+ if (board_avg_size < 2) {
+ fprintf (stderr,"%s: the board must be at least 2x2.\n", progname);
+ exit(1);
+ }
+ if ((board_x_size < 1) || (board_y_size < 1) || (numsquares < 1)) {
+ fprintf (stderr,"%s: the number of elements ('-count') and the dimensions of the board ('-size-x', '-size-y') must be positive integers.\n", progname);
+ exit(1);
+ }
+ if (board_x_size * board_y_size <= numsquares) {
+ fprintf (stderr,"%s: the number of elements ('-count') that you specified is too big \n for the dimensions of the board ('-size-x', '-size-y'). Nothing will move.\n", progname);
+ }
+
+ screen = MI_SCREEN(mi);
+ wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT(mi, qs);
+
+ c = &qs[screen];
+ c->window = MI_WINDOW(mi);
+ c->trackball = gltrackball_init (False);
+
+ c->flipspeed = 0.03;
+ c->reldist = 1;
+ c->energy = 40;
+
+ if((c->glx_context = init_GL(mi)))
+ reshape_flipflop(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ else
+ MI_CLEARWINDOW(mi);
+
+ /* At this point, all the constants have already been set, */
+ /* so we can create the board */
+ c->sheet = (randsheet*) malloc(sizeof(randsheet));
+ randsheet_create( c->sheet );
+
+ clearbits = GL_COLOR_BUFFER_BIT;
+
+ glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ setup_lights();
+
+ glEnable(GL_DEPTH_TEST);
+ clearbits |= GL_DEPTH_BUFFER_BIT;
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ randsheet_initialize( c->sheet );
+ if( textured ){
+ /* check for anisotropic filtering */
+ if(strstr((char *)glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
+ else
+ c->anisotropic = 0;
+
+ /* allocate a new texture and get it */
+ glGenTextures(1, &c->texid);
+ get_texture(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_flipflop(ModeInfo *mi)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if(!c->glx_context || (textured && !c->got_texture))
+ return;
+
+ glXMakeCurrent(disp, w, *(c->glx_context));
+
+ mi->polygon_count = display(mi);
+
+ if(mi->fps_p){
+ do_fps(mi);
+ }
+
+ glFinish();
+ glXSwapBuffers(disp, w);
+
+
+}
+
+ENTRYPOINT void
+free_flipflop(ModeInfo *mi)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ if (c->sheet) {
+ randsheet_free(c->sheet);
+ free (c->sheet);
+ }
+}
+
+/*** ADDED RANDSHEET FUNCTIONS ***/
+
+static int
+draw_sheet(float *tex)
+{
+ int polys = 0;
+ glBegin( wire ? GL_LINE_LOOP : GL_QUADS );
+
+ glNormal3f( 0, -1, 0 );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, -half_thick, 1-half_thick);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, -half_thick, 1-half_thick );
+ polys++;
+
+ if (wire) { glEnd(); glBegin (GL_LINE_LOOP); }
+
+ /* back */
+ glNormal3f( 0, 1, 0 );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, half_thick, 1-half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, half_thick, half_thick );
+ polys++;
+
+ if (wire) { glEnd(); return polys; }
+
+ /* 4 edges!!! weee.... */
+ glNormal3f( 0, 0, -1 );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, -half_thick, half_thick );
+ polys++;
+ glNormal3f( 0, 0, 1 );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, -half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, -half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, half_thick, 1-half_thick );
+ polys++;
+ glNormal3f( 1, 0, 0 );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, -half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, half_thick, half_thick );
+ polys++;
+ glNormal3f( -1, 0, 0 );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, -half_thick, 1-half_thick );
+ polys++;
+ glEnd();
+
+ return polys;
+}
+
+/* Reserve memory for the randsheet */
+static void
+randsheet_create( randsheet *rs )
+{
+ rs -> occupied = (int*) malloc(board_x_size*board_y_size * sizeof(int));
+ rs -> xpos = (int*) malloc(numsquares * sizeof(int));
+ rs -> ypos = (int*) malloc(numsquares * sizeof(int));
+ rs -> direction = (int*) malloc(numsquares * sizeof(int));
+ rs -> angle = (float*) malloc(numsquares * sizeof(float));
+ rs -> color = (float*) malloc(numsquares*3 * sizeof(float));
+ rs -> tex = (float*) malloc(numsquares*4 * sizeof(float));
+}
+
+/* Free reserved memory for the randsheet */
+static void
+randsheet_free( randsheet *rs )
+{
+ free(rs->occupied);
+ free(rs->xpos);
+ free(rs->ypos);
+ free(rs->direction);
+ free(rs->angle);
+ free(rs->color);
+ free(rs->tex);
+}
+
+static void
+randsheet_initialize( randsheet *rs )
+{
+ int i, j, index;
+ index = 0;
+ /* put the moving sheets on the board */
+ for( i = 0; i < board_x_size; i++ )
+ {
+ for( j = 0; j < board_y_size; j++ )
+ {
+ /* initially fill up a corner with the moving squares */
+ if( index < numsquares )
+ {
+ rs->occupied[ i * board_y_size + j ] = index;
+ rs->xpos[ index ] = i;
+ rs->ypos[ index ] = j;
+ /* have the square colors start out as a pattern */
+ rs->color[ index*3 + 0 ] = ((i+j)%3 == 0)||((i+j+1)%3 == 0);
+ rs->color[ index*3 + 1 ] = ((i+j+1)%3 == 0);
+ rs->color[ index*3 + 2 ] = ((i+j+2)%3 == 0);
+ index++;
+ }
+ /* leave everything else empty*/
+ else
+ {
+ rs->occupied[ i * board_y_size + j ] = -1;
+ }
+ }
+ }
+ /* initially everything is at rest */
+ for( i=0; i<numsquares; i++ )
+ {
+ rs->direction[ i ] = 0;
+ rs->angle[ i ] = 0;
+ }
+}
+
+/* Pick and random square and direction and try to move it. */
+/* May not actually move anything, just attempt a random move. */
+/* Returns true if move was sucessful. */
+/* This could probably be implemented faster in a dequeue */
+/* to avoid trying to move a square which is already moving */
+/* but speed is most likely bottlenecked by rendering anyway... */
+static int
+randsheet_new_move( randsheet* rs )
+{
+ int i, j;
+ int num, dir;
+ /* pick a random square */
+ num = random( ) % numsquares;
+ i = rs->xpos[ num ];
+ j = rs->ypos[ num ];
+ /* pick a random direction */
+ dir = ( random( )% 4 ) + 1;
+
+ if( rs->direction[ num ] == 0 )
+ {
+ switch( dir )
+ {
+ case 1:
+ /* move up in x */
+ if( ( i + 1 ) < board_x_size )
+ {
+ if( rs->occupied[ (i + 1) * board_y_size + j ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ (i + 1) * board_y_size + j ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 2:
+ /* move up in y */
+ if( ( j + 1 ) < board_y_size )
+ {
+ if( rs->occupied[ i * board_y_size + (j + 1) ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ i * board_y_size + (j + 1) ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 3:
+ /* move down in x */
+ if( ( i - 1 ) >= 0 )
+ {
+ if( rs->occupied[ (i - 1) * board_y_size + j ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ (i - 1) * board_y_size + j ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 4:
+ /* move down in y */
+ if( ( j - 1 ) >= 0 )
+ {
+ if( rs->occupied[ i * board_y_size + (j - 1) ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ i * board_y_size + (j - 1) ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ default:
+ break;
+ }
+ }
+ return 0;
+}
+
+/* move a single frame. */
+/* Pass in the angle in rads the square rotates in a frame. */
+static void
+randsheet_move( randsheet *rs, float rot )
+{
+ int index;
+ float tmp;
+ for( index = 0 ; index < numsquares; index++ )
+ {
+ switch( rs->direction[ index ] )
+ {
+ case 0:
+ /* not moving */
+ break;
+ case 1:
+ /* move up in x */
+ if( textured && rs->angle[ index ] == 0 )
+ {
+ tmp = rs->tex[ index * 4 + 0 ];
+ rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
+ rs->tex[ index * 4 + 2 ] = tmp;
+ }
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->xpos[ index ] += 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ }
+ break;
+ case 2:
+ /* move up in y */
+ if( textured && rs->angle[ index ] == 0 )
+ {
+ tmp = rs->tex[ index * 4 + 1 ];
+ rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
+ rs->tex[ index * 4 + 3 ] = tmp;
+ }
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->ypos[ index ] += 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ }
+ break;
+ case 3:
+ /* down in x */
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->xpos[ index ] -= 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ if( textured )
+ {
+ tmp = rs->tex[ index * 4 + 0 ];
+ rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
+ rs->tex[ index * 4 + 2 ] = tmp;
+ }
+ }
+ break;
+ case 4:
+ /* down in y */
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->ypos[ index ] -= 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ if( textured )
+ {
+ tmp = rs->tex[ index * 4 + 1 ];
+ rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
+ rs->tex[ index * 4 + 3 ] = tmp;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+
+/* draw all the moving squares */
+static int
+randsheet_draw( randsheet *rs )
+{
+ int i, j, polys = 0;
+ int index;
+
+ /* for all moving squares ... */
+ for( index = 0; index < numsquares; index++ )
+ {
+ /* set color */
+ glColor3f( rs->color[ index*3 + 0 ],
+ rs->color[ index*3 + 1 ],
+ rs->color[ index*3 + 2 ] );
+ /* find x and y position */
+ i = rs->xpos[ index ];
+ j = rs->ypos[ index ];
+ glPushMatrix();
+ switch( rs->direction[ index ] )
+ {
+ case 0:
+
+ /* not moving */
+ /* front */
+ glTranslatef( i, 0, j );
+ break;
+ case 1:
+ glTranslatef( i+1, 0, j );
+ glRotatef( 180 - rs->angle[ index ]*180/M_PI, 0, 0, 1 );
+
+ break;
+ case 2:
+ glTranslatef( i, 0, j+1 );
+ glRotatef( 180 - rs->angle[ index ]*180/M_PI, -1, 0, 0 );
+
+ break;
+ case 3:
+ glTranslatef( i, 0, j );
+ glRotatef( rs->angle[ index ]*180/M_PI, 0, 0, 1 );
+ break;
+ case 4:
+ glTranslatef( i, 0, j );
+ glRotatef( rs->angle[ index ]*180/M_PI, -1, 0, 0 );
+ break;
+ default:
+ break;
+ }
+ polys += draw_sheet( rs->tex + index*4 );
+ glPopMatrix();
+
+ }
+ return polys;
+}
+
+/**** END RANDSHEET_BAK FUNCTIONS ***/
+
+XSCREENSAVER_MODULE ("FlipFlop", flipflop)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/flipflop.man b/hacks/glx/flipflop.man
new file mode 100644
index 0000000..17691bc
--- /dev/null
+++ b/hacks/glx/flipflop.man
@@ -0,0 +1,95 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flipflop - draws a grid of 3D squares that change positions
+.SH SYNOPSIS
+.B flipflop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-count \fInumber\fP | \-free \fInumber\fP]
+[\-size \fInumber\fP]
+[\-size-x \fInumber\fP]
+[\-size-y \fInumber\fP]
+[\-spin \fInumber\fP]
+[\-mode sticks | tiles]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+[\-texture]
+.SH DESCRIPTION
+Flipflop draws a grid of 3D colored tiles that change positions with
+each other.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Number of tiles on the board. A value of "0" means "default". The
+default number of tiles depends on the size of the board and the mode:
+95% of total tiles for "tiles" mode and 80% of total sticks for
+"sticks" mode (e.g. 76 tiles or 64 sticks for a 9x9 board).
+.TP 8
+.B \-free \fInumber\fP
+Number of tiles missing from the board. See -count.
+.TP 8
+.B \-size \fInumber\fP
+Number of tiles on each side of the board. Takes precedence over
+-size-x and -size-y. Default: 9.
+.TP 8
+.B \-size-x \fInumber\fP
+Width (in tiles) of the board. Default: 9.
+.TP 8
+.B \-size-y \fInumber\fP
+Length (in tiles) of the board. Default: 9.
+.TP 8
+.B \-spin \fInumber\fP
+Angular velocity for the rotation of the board.
+.TP 8
+.B \-mode sticks
+Draw hopping sticks instead of flipping tiles.
+.TP 8
+.B \-mode tiles
+Draw flipping tiles. This is the default.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-fps | \-no\-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.TP 8
+.B \-texture | \-no\-texture
+Whether to texture the tiles with a screen grab or an image.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Kevin Ogden. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Kevin Ogden <kogden1@hotmail.com>. Some additional code by Sergio
+Gutierrez <sergut@gmail.com>.
diff --git a/hacks/glx/flipscreen3d.c b/hacks/glx/flipscreen3d.c
new file mode 100644
index 0000000..e4db5df
--- /dev/null
+++ b/hacks/glx/flipscreen3d.c
@@ -0,0 +1,518 @@
+/*
+ * flipscreen3d - takes snapshots of the screen and flips it around
+ *
+ * version 1.0 - Oct 24, 2001
+ *
+ * Copyright (C) 2001 Ben Buxton (bb@cactii.net)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*useSHM: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_screenflip 0
+# define release_screenflip 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+# include "gltrackball.h"
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+/* lifted from lament.c */
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+
+#ifdef USE_GL
+
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
+
+#define DEF_ROTATE "True"
+static int rotate;
+
+#define QW 12
+#define QH 12
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+static XrmOptionDescRec opts[] = {
+ {"+rotate", ".screenflip.rotate", XrmoptionNoArg, "false" },
+ {"-rotate", ".screenflip.rotate", XrmoptionNoArg, "true" },
+};
+
+
+static argtype vars[] = {
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+};
+
+
+
+ENTRYPOINT ModeSpecOpt screenflip_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+#ifdef USE_MODULES
+ModStruct screenflip_description =
+{"screenflip", "init_screenflip", "draw_screenflip", NULL,
+ "draw_screenflip", "init_screenflip", NULL, &screenflip_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Screenflips", 0, NULL};
+
+#endif
+
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+
+ int winw, winh;
+ int tw, th; /* texture width, height */
+ GLfloat min_tx, min_ty;
+ GLfloat max_tx, max_ty;
+ GLfloat qx, qy, qw, qh; /* the quad we'll draw */
+
+ int regrab;
+ int fadetime; /* fade before regrab */
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat show_colors[4];
+ GLfloat stretch_val_x, stretch_val_y;
+ GLfloat stretch_val_dx, stretch_val_dy;
+
+ GLfloat curx, cury, curz;
+
+ GLfloat rx, ry, rz;
+ GLfloat rot, drot, odrot, ddrot, orot;
+ float theta, rho, dtheta, drho, gamma, dgamma;
+
+ GLuint texid;
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+ Bool first_image_p;
+
+ GLfloat anisotropic;
+
+} Screenflip;
+
+static Screenflip *screenflip = NULL;
+
+#include "grab-ximage.h"
+
+static const GLfloat viewer[] = {0.0, 0.0, 15.0};
+
+
+static void getSnapshot (ModeInfo *);
+
+
+ENTRYPOINT Bool
+screenflip_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, c->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &c->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ if (!c->waiting_for_image_p)
+ {
+ getSnapshot (mi);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+/* draw the texture mapped quad (actually two back to back)*/
+static void showscreen(Screenflip *c, int frozen, int wire)
+{
+ GLfloat x, y, w, h;
+
+ if (c->fadetime) {
+/* r -= 0.02; g -= 0.02; b -= 0.02; */
+ c->show_colors[3] -= 0.02;
+ if (c->show_colors[3] < 0) {
+ c->regrab = 1;
+ c->fadetime = 0;
+ }
+ } else if (c->show_colors[3] < 0) {
+ c->show_colors[0] = c->show_colors[1] =
+ c->show_colors[2] = c->show_colors[3] = 1;
+ c->stretch_val_x = c->stretch_val_y =
+ c->stretch_val_dx = c->stretch_val_dy = 0;
+ }
+ if (c->stretch_val_dx == 0 && !frozen && !(random() % 25))
+ c->stretch_val_dx = (float)(random() % 100) / 5000;
+ if (c->stretch_val_dy == 0 && !frozen && !(random() % 25))
+ c->stretch_val_dy = (float)(random() % 100) / 5000;
+
+ x = c->qx;
+ y = c->qy;
+ w = c->qx+c->qw;
+ h = c->qy-c->qh;
+
+ if (!frozen) {
+ w *= sin (c->stretch_val_x) + 1;
+ x *= sin (c->stretch_val_x) + 1;
+ if (!c->button_down_p) {
+ if (!c->fadetime) c->stretch_val_x += c->stretch_val_dx;
+ if (c->stretch_val_x > 2*M_PI && !(random() % 5))
+ c->stretch_val_dx = (float)(random() % 100) / 5000;
+ else
+ c->stretch_val_x -= 2*M_PI;
+ }
+
+ if (!c->button_down_p && !c->fadetime) c->stretch_val_y += c->stretch_val_dy;
+ h *= sin (c->stretch_val_y) / 2 + 1;
+ y *= sin (c->stretch_val_y) / 2 + 1;
+ if (!c->button_down_p) {
+ if (c->stretch_val_y > 2*M_PI && !(random() % 5))
+ c->stretch_val_dy = (float)(random() % 100) / 5000;
+ else
+ c->stretch_val_y -= 2*M_PI;
+ }
+ }
+
+ glColor4f(c->show_colors[0], c->show_colors[1],
+ c->show_colors[2], c->show_colors[3]);
+
+ if (!wire)
+ {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(GL_FALSE);
+ }
+
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, 0);
+ glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, 0);
+ glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, 0);
+ glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, 0);
+
+ glNormal3f(0, 0, -1);
+ glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, -0.05);
+ glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, -0.05);
+ glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, -0.05);
+ glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, -0.05);
+ glEnd();
+
+
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(GL_TRUE);
+
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(x, y, 0);
+ glVertex3f(x, h, 0);
+ glVertex3f(w, h, 0);
+ glVertex3f(w, y, 0);
+ glEnd();
+ glDisable(GL_BLEND);
+
+}
+
+/* This function is responsible for 'zooming back' the square after
+ * a new chunk has been grabbed with getSnapshot(), and positioning
+ * it suitably on the screen. Once positioned (where we begin to rotate),
+ * it just does a glTranslatef() and returns 1
+ */
+
+static int inposition(Screenflip *c)
+{
+ GLfloat wx;
+ GLfloat wy;
+ wx = 0 - (c->qw/2);
+ wy = (c->qh/2);
+
+ if (c->curx == 0) c->curx = c->qx;
+ if (c->cury == 0) c->cury = c->qy;
+ if (c->regrab) {
+ c->curz = 0;
+ c->curx = c->qx;
+ c->cury = c->qy;
+ c->regrab = 0;
+ }
+ if (c->curz > -10 || c->curx > wx + 0.1 || c->curx < wx - 0.1 ||
+ c->cury > wy + 0.1 || c->cury < wy - 0.1) {
+ if (c->curz > -10)
+ c->curz -= 0.05;
+ if (c->curx > wx) {
+ c->qx -= 0.02;
+ c->curx -= 0.02;
+ }
+ if (c->curx < wx) {
+ c->qx += 0.02;
+ c->curx += 0.02;
+ }
+ if (c->cury > wy) {
+ c->qy -= 0.02;
+ c->cury -= 0.02;
+ }
+ if (c->cury < wy) {
+ c->qy += 0.02;
+ c->cury += 0.02;
+ }
+ glTranslatef(0, 0, c->curz);
+ return 0;
+ }
+ glTranslatef(0, 0, c->curz);
+ return 1;
+
+}
+
+#if 0
+static void drawgrid(void)
+{
+ int i;
+
+ glColor3f(0, 0.7, 0);
+ glBegin(GL_LINES);
+ for (i = 0 ; i <= 50; i+=2) {
+ glVertex3f( -25, -15, i-70);
+ glVertex3f( 25, -15, i-70);
+ glVertex3f( i-25, -15, -70);
+ glVertex3f( i-25, -15, -20);
+ }
+ glEnd();
+}
+#endif
+
+
+static void display(Screenflip *c, int wire)
+{
+ int frozen;
+ GLfloat rot = current_device_rotation();
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+ glPushMatrix();
+
+/*
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = c->winw / (GLfloat) c->winh;
+ glScalef (s, 1/s, 1);
+ }
+*/
+
+ if (inposition(c)) {
+ frozen = 0;
+ glTranslatef(5 * sin(c->theta), 5 * sin(c->rho), 10 * cos(c->gamma) - 10);
+/* randomly change the speed */
+ if (!c->button_down_p && !(random() % 300)) {
+ if (random() % 2)
+ c->drho = 1/60 - (float)(random() % 100)/3000;
+ if (random() % 2)
+ c->dtheta = 1/60 - (float)(random() % 100)/3000;
+ if (random() % 2)
+ c->dgamma = 1/60 - (float)(random() % 100)/3000;
+ }
+ glRotatef(rot, 0, 0, 1);
+ gltrackball_rotate (c->trackball);
+ glRotatef(-rot, 0, 0, 1);
+ if (rotate) glRotatef(c->rot, c->rx, c->ry, c->rz);
+/* update variables with each frame */
+ if(!c->button_down_p && !c->fadetime) {
+ c->theta += c->dtheta;
+ c->rho += c->drho;
+ c->gamma += c->dgamma;
+ c->rot += c->drot;
+ c->drot += c->ddrot;
+ }
+/* dont let our rotation speed get too high */
+ if (c->drot > 5 && c->ddrot > 0)
+ c->ddrot = 0 - (GLfloat)(random() % 100) / 1000;
+ else if (c->drot < -5 && c->ddrot < 0)
+ c->ddrot = (GLfloat)(random() % 100) / 1000;
+ } else { /* reset some paramaters */
+ c->ddrot = 0.05 - (GLfloat)(random() % 100) / 1000;
+ c->theta = c->rho = c->gamma = 0;
+ c->rot = 0;
+ frozen = 1;
+ }
+ if (!c->button_down_p && !c->fadetime && (c->rot >= 360 || c->rot <= -360) && !(random() % 7)) { /* rotate change */
+ c->rx = (GLfloat)(random() % 100) / 100;
+ c->ry = (GLfloat)(random() % 100) / 100;
+ c->rz = (GLfloat)(random() % 100) / 100;
+ }
+ if (c->odrot * c->drot < 0 && c->tw < c->winw && !(random() % 10)) {
+ c->fadetime = 1; /* randomly fade and get new snapshot */
+ }
+ c->orot = c->rot;
+ c->odrot = c->drot;
+ if (c->rot > 360 || c->rot < -360) /* dont overflow rotation! */
+ c->rot -= c->rot;
+ showscreen(c, frozen, wire);
+ glPopMatrix();
+ glFlush();
+}
+
+ENTRYPOINT void reshape_screenflip(ModeInfo *mi, int width, int height)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
+ glViewport(0,0,(GLint)width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1, 2.0, 85);
+ glMatrixMode(GL_MODELVIEW);
+ c->winw = width;
+ c->winh = height;
+}
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ Screenflip *c = (Screenflip *) closure;
+
+ c->tw = texture_width;
+ c->th = texture_height;
+ c->min_tx = (GLfloat) geometry->x / c->tw;
+ c->min_ty = (GLfloat) geometry->y / c->th;
+ c->max_tx = (GLfloat) (geometry->x + geometry->width) / c->tw;
+ c->max_ty = (GLfloat) (geometry->y + geometry->height) / c->th;
+
+ c->qx = -QW/2 + ((GLfloat) geometry->x * QW / image_width);
+ c->qy = QH/2 - ((GLfloat) geometry->y * QH / image_height);
+ c->qw = QW * ((GLfloat) geometry->width / image_width);
+ c->qh = QH * ((GLfloat) geometry->height / image_height);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (c->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ if (c->anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ c->anisotropic);
+
+ c->waiting_for_image_p = False;
+ c->first_image_p = False;
+}
+
+
+static void getSnapshot (ModeInfo *modeinfo)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(modeinfo)];
+
+ if (MI_IS_WIREFRAME(modeinfo))
+ return;
+
+ c->waiting_for_image_p = True;
+ c->mipmap_p = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ *c->glx_context, 0, 0, c->mipmap_p, c->texid,
+ image_loaded_cb, c);
+}
+
+ENTRYPOINT void init_screenflip(ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ Screenflip *c;
+
+ MI_INIT(mi, screenflip);
+ c = &screenflip[screen];
+ c->window = MI_WINDOW(mi);
+
+ c->trackball = gltrackball_init (False);
+
+ if ((c->glx_context = init_GL(mi)) != NULL) {
+ reshape_screenflip(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+ c->winh = MI_WIN_HEIGHT(mi);
+ c->winw = MI_WIN_WIDTH(mi);
+ c->qw = QW;
+ c->qh = QH;
+ c->qx = -6;
+ c->qy = 6;
+
+ c->rx = c->ry = 1;
+ c->odrot = 1;
+
+ c->show_colors[0] = c->show_colors[1] =
+ c->show_colors[2] = c->show_colors[3] = 1;
+
+ if (! MI_IS_WIREFRAME(mi))
+ {
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glDisable(GL_LIGHTING);
+ }
+
+ if (strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
+ else
+ c->anisotropic = 0.0;
+
+ glGenTextures(1, &c->texid);
+
+ c->first_image_p = True;
+ getSnapshot(mi);
+}
+
+ENTRYPOINT void draw_screenflip(ModeInfo *mi)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if (!c->glx_context)
+ return;
+
+ /* Wait for the first image; for subsequent images, load them in the
+ background while animating. */
+ if (c->waiting_for_image_p && c->first_image_p)
+ return;
+
+ glXMakeCurrent(disp, w, *(c->glx_context));
+
+ glBindTexture(GL_TEXTURE_2D, c->texid);
+
+ if (c->regrab)
+ getSnapshot(mi);
+
+ display(c, MI_IS_WIREFRAME(mi));
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+XSCREENSAVER_MODULE_2 ("FlipScreen3D", flipscreen3d, screenflip)
+
+#endif
diff --git a/hacks/glx/flipscreen3d.man b/hacks/glx/flipscreen3d.man
new file mode 100644
index 0000000..fecd005
--- /dev/null
+++ b/hacks/glx/flipscreen3d.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flipscreen3d - rotates an image of the screen through 3 dimensions.
+.SH SYNOPSIS
+.B flipscreen3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-no-rotate]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Grabs an image of the desktop, turns it into a GL texture map, and spins it
+around and deforms it in various ways.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-rotate | \-no-rotate
+Whether to rotate.
+.TP 8
+.B \-wireframe
+Just render boxes instead of textures (for debugging).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ben Buxton.
diff --git a/hacks/glx/fliptext.c b/hacks/glx/fliptext.c
new file mode 100644
index 0000000..c233e8b
--- /dev/null
+++ b/hacks/glx/fliptext.c
@@ -0,0 +1,1001 @@
+/*
+ * fliptext, Copyright (c) 2005-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#define DEF_FONT "-*-utopia-bold-r-normal-*-*-720-*-*-*-*-*-*"
+#define DEF_COLOR "#00CCFF"
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*usePty: False \n" \
+ "*texFontCacheSize: 60 \n" \
+ "*font: " DEF_FONT "\n" \
+ ".foreground: " DEF_COLOR "\n" \
+ "*program: xscreensaver-text --cols 0" /* don't wrap */
+
+# define release_fliptext 0
+# define fliptext_handle_event xlockmore_no_events
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "texfont.h"
+#include "textclient.h"
+
+#ifdef USE_GL /* whole file */
+
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
+
+
+#define DEF_LINES "8"
+#define DEF_FONT_SIZE "20"
+#define DEF_COLUMNS "80"
+#define DEF_ALIGNMENT "random"
+#define DEF_SPEED "1.0"
+#define TAB_WIDTH 8
+
+#define FONT_WEIGHT 14
+#define KEEP_ASPECT
+
+typedef enum { NEW, HESITATE, IN, LINGER, OUT, DEAD } line_state;
+typedef enum { SCROLL_BOTTOM, SCROLL_TOP, SPIN } line_anim_type;
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+typedef struct {
+ char *text;
+ GLfloat width, height; /* size */
+ XYZ from, to, current; /* start, end, and current position */
+ GLfloat fth, tth, cth; /* rotation around Z */
+
+ int cluster_size; /* how many lines in this cluster */
+ int cluster_pos; /* position of this line in the cluster */
+
+ line_state state; /* current motion model */
+ int step, steps; /* progress along this path */
+ GLfloat color[4];
+
+} line;
+
+
+typedef struct {
+ Display *dpy;
+ GLXContext *glx_context;
+
+ texture_font_data *texfont;
+ text_data *tc;
+
+ int alignment;
+
+ char *buf;
+ int buf_size;
+ int buf_tail;
+
+ int char_width; /* in font units */
+ int line_height; /* in font units */
+ double font_scale; /* convert font units to display units */
+
+ int font_wrap_pixels; /* in font units (for wrapping text) */
+
+ int top_margin, bottom_margin;
+ int left_margin, right_margin;
+
+ int nlines;
+ int lines_size;
+ line **lines;
+
+ line_anim_type anim_type;
+ XYZ in, mid, out;
+ XYZ rotation;
+ GLfloat color[4];
+
+} fliptext_configuration;
+
+
+static fliptext_configuration *scs = NULL;
+
+static int max_lines, min_lines;
+static float font_size;
+static int target_columns;
+static char *alignment_str;
+static int alignment_random_p;
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+ {"-lines", ".lines", XrmoptionSepArg, 0 },
+ {"-size", ".fontSize", XrmoptionSepArg, 0 },
+ {"-columns", ".columns", XrmoptionSepArg, 0 },
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+/*{"-font", ".font", XrmoptionSepArg, 0 },*/
+ {"-alignment", ".alignment", XrmoptionSepArg, 0 },
+ {"-left", ".alignment", XrmoptionNoArg, "Left" },
+ {"-right", ".alignment", XrmoptionNoArg, "Right" },
+ {"-center", ".alignment", XrmoptionNoArg, "Center" },
+};
+
+static argtype vars[] = {
+ {&max_lines, "lines", "Integer", DEF_LINES, t_Int},
+ {&font_size, "fontSize", "Float", DEF_FONT_SIZE, t_Float},
+ {&target_columns, "columns", "Integer", DEF_COLUMNS, t_Int},
+ {&alignment_str, "alignment", "Alignment", DEF_ALIGNMENT, t_String},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt fliptext_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Tabs are bad, mmmkay? */
+
+static char *
+untabify (const char *string)
+{
+ const char *ostring = string;
+ char *result = (char *) malloc ((strlen(string) * 8) + 1);
+ char *out = result;
+ int col = 0;
+ while (*string)
+ {
+ if (*string == '\t')
+ {
+ do {
+ col++;
+ *out++ = ' ';
+ } while (col % TAB_WIDTH);
+ string++;
+ }
+ else if (*string == '\r' || *string == '\n')
+ {
+ *out++ = *string++;
+ col = 0;
+ }
+ else if (*string == '\010') /* backspace */
+ {
+ if (string > ostring)
+ out--, string++;
+ }
+ else
+ {
+ *out++ = *string++;
+ col++;
+ }
+ }
+ *out = 0;
+
+ return result;
+}
+
+static void
+strip (char *s, Bool leading, Bool trailing)
+{
+ int L = strlen(s);
+ if (trailing)
+ while (L > 0 && (s[L-1] == ' ' || s[L-1] == '\t'))
+ s[L--] = 0;
+ if (leading)
+ {
+ char *s2 = s;
+ while (*s2 == ' ' || *s2 == '\t')
+ s2++;
+ if (s == s2)
+ return;
+ while (*s2)
+ *s++ = *s2++;
+ *s = 0;
+ }
+}
+
+
+static int
+char_width (fliptext_configuration *sc, char c)
+{
+ XCharStruct e;
+ char s[2];
+ s[0] = c;
+ s[1] = 0;
+ texture_string_metrics (sc->texfont, s, &e, 0, 0);
+ return e.width;
+}
+
+
+/* Returns a single line of text from the output buffer of the subprocess,
+ taking into account wrapping, centering, etc. Returns 0 if no complete
+ line is currently available.
+ */
+static char *
+get_one_line (fliptext_configuration *sc)
+{
+ char *result = 0;
+ int wrap_pix = sc->font_wrap_pixels;
+ int col = 0;
+ int col_pix = 0;
+ char *s = sc->buf;
+ int target = sc->buf_size - sc->buf_tail - 2;
+
+ /* Fill as much as we can into sc->buf, but stop at newline.
+ */
+ while (target > 0)
+ {
+ int c = textclient_getc (sc->tc);
+ if (c <= 0)
+ break;
+ sc->buf[sc->buf_tail++] = (char) c;
+ sc->buf[sc->buf_tail] = 0;
+ target--;
+ if (c == '\r' || c == '\n')
+ break;
+ }
+
+ while (!result)
+ {
+ int cw;
+
+ if (s >= sc->buf + sc->buf_tail)
+ /* Reached end of buffer before end of line. Bail. */
+ return 0;
+
+ cw = char_width (sc, *s);
+
+ if (*s == '\r' || *s == '\n' ||
+ col_pix + cw >= wrap_pix)
+ {
+ int L = s - sc->buf;
+
+ if (*s == '\r' || *s == '\n')
+ {
+ if (*s == '\r' && s[1] == '\n') /* swallow CRLF too */
+ *s++ = 0;
+
+ *s++ = 0;
+ }
+ else
+ {
+ /* We wrapped -- try to back up to the previous word boundary. */
+ char *s2 = s;
+ int n = 0;
+ while (s2 > sc->buf && *s2 != ' ' && *s2 != '\t')
+ s2--, n++;
+ if (s2 > sc->buf)
+ {
+ s = s2;
+ *s++ = 0;
+ L = s - sc->buf;
+ }
+ }
+
+ if (result) abort();
+ result = (char *) malloc (L+1);
+ memcpy (result, sc->buf, L);
+ result[L] = 0;
+
+ {
+ char *t = result;
+ char *ut = untabify (t);
+ strip (ut, (sc->alignment == 0), 1); /* if centering, strip
+ leading whitespace too */
+ result = ut;
+ free (t);
+ }
+
+ if (sc->buf_tail > (s - sc->buf))
+ {
+ int i = sc->buf_tail - (s - sc->buf);
+ memmove (sc->buf, s, i);
+ sc->buf_tail = i;
+ sc->buf[sc->buf_tail] = 0;
+ }
+ else
+ {
+ sc->buf_tail = 0;
+ }
+
+ sc->buf[sc->buf_tail] = 0;
+ s = sc->buf;
+ col = 0;
+ col_pix = 0;
+ }
+ else
+ {
+ col++;
+ col_pix += cw;
+ if (*s == '\t')
+ {
+ int tab_pix = TAB_WIDTH * sc->char_width;
+ col = TAB_WIDTH * ((col / TAB_WIDTH) + 1);
+ col_pix = tab_pix * ((col / tab_pix) + 1);
+ }
+ s++;
+ }
+ }
+
+ return result;
+}
+
+
+static Bool
+blank_p (const char *s)
+{
+ for (; *s; s++)
+ if (*s != ' ' && *s != '\t' && *s != '\r' && *s != '\n')
+ return False;
+ return True;
+}
+
+/* Reads some text from the subprocess, and creates and returns a `line'
+ object. Adds that object to the lines list. Returns 0 if no text
+ available yet.
+
+ If skip_blanks_p, then keep trying for new lines of text until we
+ get one that is not empty.
+ */
+static line *
+make_line (fliptext_configuration *sc, Bool skip_blanks_p)
+{
+ XCharStruct e;
+ line *ln;
+ char *s;
+
+ AGAIN:
+ s = get_one_line (sc);
+ if (s && skip_blanks_p && blank_p (s))
+ {
+ free (s);
+ goto AGAIN;
+ }
+
+ if (!s) return 0;
+
+ ln = (line *) calloc (1, sizeof(*ln));
+ ln->text = s;
+ ln->state = NEW;
+ texture_string_metrics (sc->texfont, s, &e, 0, 0);
+ ln->width = sc->font_scale * e.width;
+ ln->height = sc->font_scale * sc->line_height;
+
+ memcpy (ln->color, sc->color, sizeof(ln->color));
+
+ sc->nlines++;
+ if (sc->lines_size <= sc->nlines)
+ {
+ sc->lines_size = (sc->lines_size * 1.2) + sc->nlines;
+ sc->lines = (line **)
+ realloc (sc->lines, sc->lines_size * sizeof(*sc->lines));
+ if (! sc->lines)
+ {
+ fprintf (stderr, "%s: out of memory (%d lines)\n",
+ progname, sc->lines_size);
+ exit (1);
+ }
+ }
+
+ sc->lines[sc->nlines-1] = ln;
+ return ln;
+}
+
+
+/* frees the object and removes it from the list.
+ */
+static void
+free_line (fliptext_configuration *sc, line *line)
+{
+ int i;
+ for (i = 0; i < sc->nlines; i++)
+ if (sc->lines[i] == line)
+ break;
+ if (i == sc->nlines) abort();
+ for (; i < sc->nlines-1; i++)
+ sc->lines[i] = sc->lines[i+1];
+ sc->lines[i] = 0;
+ sc->nlines--;
+
+ free (line->text);
+ free (line);
+}
+
+
+static void
+draw_line (ModeInfo *mi, line *line)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ if (! line->text || !*line->text ||
+ line->state == NEW || line->state == HESITATE || line->state == DEAD)
+ return;
+
+ glPushMatrix();
+ glTranslatef (line->current.x, line->current.y, line->current.z);
+
+ glRotatef (line->cth, 0, 1, 0);
+
+ if (sc->alignment == 1)
+ glTranslatef (-line->width, 0, 0);
+ else if (sc->alignment == 0)
+ glTranslatef (-line->width/2, 0, 0);
+
+ glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
+
+ glColor4f (line->color[0], line->color[1], line->color[2], line->color[3]);
+
+ if (!wire)
+ print_texture_string (sc->texfont, line->text);
+ else
+ {
+ int w, h;
+ char *s = line->text;
+ char c[2];
+ c[1]=0;
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (0.4, 0.4, 0.4);
+ while (*s)
+ {
+ XCharStruct e;
+ *c = *s++;
+ texture_string_metrics (sc->texfont, c, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, h, 0);
+ glVertex3f (0, h, 0);
+ glEnd();
+ glTranslatef (w, 0, 0);
+ }
+ }
+
+#if 0
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (0.4, 0.4, 0.4);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (line->width/sc->font_scale, 0, 0);
+ glVertex3f (line->width/sc->font_scale, line->height/sc->font_scale, 0);
+ glVertex3f (0, line->height/sc->font_scale, 0);
+ glEnd();
+ if (!wire) glEnable (GL_TEXTURE_2D);
+#endif
+
+ glPopMatrix();
+
+ mi->polygon_count += strlen (line->text);
+}
+
+static void
+tick_line (fliptext_configuration *sc, line *line)
+{
+ int stagger = 30; /* frames of delay between line spin-outs */
+ int slide = 600; /* frames in a slide in/out */
+ int linger = 0; /* frames to pause with no motion */
+ double i, ii;
+
+ if (line->state >= DEAD) abort();
+ if (++line->step >= line->steps)
+ {
+ line->state++;
+ line->step = 0;
+
+ if (linger == 0 && line->state == LINGER)
+ line->state++;
+
+ if (sc->anim_type != SPIN)
+ stagger *= 2;
+
+ switch (line->state)
+ {
+ case HESITATE: /* entering state HESITATE */
+ switch (sc->anim_type)
+ {
+ case SPIN:
+ line->steps = (line->cluster_pos * stagger);
+ break;
+ case SCROLL_TOP:
+ line->steps = stagger * (line->cluster_size - line->cluster_pos);
+ break;
+ case SCROLL_BOTTOM:
+ line->steps = stagger * line->cluster_pos;
+ break;
+ default:
+ abort();
+ }
+ break;
+
+ case IN:
+ line->color[3] = 0;
+ switch (sc->anim_type)
+ {
+ case SCROLL_BOTTOM: /* entering state BOTTOM IN */
+ line->from = sc->in;
+ line->to = sc->mid;
+ line->from.y = (sc->bottom_margin -
+ (line->height *
+ (line->cluster_pos + 1)));
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+ line->steps = slide;
+ break;
+
+ case SCROLL_TOP: /* entering state TOP IN */
+ line->from = sc->in;
+ line->to = sc->mid;
+ line->from.y = (sc->top_margin +
+ (line->height *
+ (line->cluster_size - line->cluster_pos)));
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+ line->steps = slide;
+ break;
+
+ case SPIN: /* entering state SPIN IN */
+ line->from = sc->in;
+ line->to = sc->mid;
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+ line->from.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+
+ line->fth = 270;
+ line->tth = 0;
+ line->steps = slide;
+ break;
+
+ default:
+ abort();
+ }
+ break;
+
+ case OUT:
+ switch (sc->anim_type)
+ {
+ case SCROLL_BOTTOM: /* entering state BOTTOM OUT */
+ line->from = line->to;
+ line->to = sc->out;
+ line->to.y = (sc->top_margin +
+ (line->height *
+ (line->cluster_size - line->cluster_pos)));
+ line->steps = slide;
+ break;
+
+ case SCROLL_TOP: /* entering state TOP OUT */
+ line->from = line->to;
+ line->to = sc->out;
+ line->to.y = (sc->bottom_margin -
+ (line->height *
+ (line->cluster_pos + 1)));
+ line->steps = slide;
+ break;
+
+ case SPIN: /* entering state SPIN OUT */
+ line->from = line->to;
+ line->to = sc->out;
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+
+ line->fth = line->tth;
+ line->tth = -270;
+ line->steps = slide;
+ break;
+
+ default:
+ abort();
+ }
+ break;
+
+ case LINGER:
+ line->from = line->to;
+ line->steps = linger;
+ break;
+
+ default:
+ break;
+ }
+
+ line->steps /= speed;
+ }
+
+ switch (line->state)
+ {
+ case IN:
+ case OUT:
+ i = (double) line->step / line->steps;
+
+ /* Move along the path exponentially, slow side towards the middle. */
+ if (line->state == OUT)
+ ii = i * i;
+ else
+ ii = 1 - ((1-i) * (1-i));
+
+ line->current.x = line->from.x + (ii * (line->to.x - line->from.x));
+ line->current.y = line->from.y + (ii * (line->to.y - line->from.y));
+ line->current.z = line->from.z + (ii * (line->to.z - line->from.z));
+ line->cth = line->fth + (ii * (line->tth - line->fth));
+
+ if (line->state == OUT) ii = 1-ii;
+ line->color[3] = sc->color[3] * ii;
+ break;
+
+ case HESITATE:
+ case LINGER:
+ case DEAD:
+ break;
+ default:
+ abort();
+ }
+}
+
+
+/* Start a new cluster of lines going.
+ Pick their anim type, and in, mid, and out positions.
+ */
+static void
+reset_lines (ModeInfo *mi)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+ int i;
+ line *prev = 0;
+ GLfloat minx, maxx, miny, maxy, minz, maxz, maxw, maxh;
+
+ sc->rotation.x = 5 - BELLRAND(10);
+ sc->rotation.y = 5 - BELLRAND(10);
+ sc->rotation.z = 5 - BELLRAND(10);
+
+ switch (random() % 8)
+ {
+ case 0: sc->anim_type = SCROLL_TOP; break;
+ case 1: sc->anim_type = SCROLL_BOTTOM; break;
+ default: sc->anim_type = SPIN; break;
+ }
+
+ minx = sc->left_margin * 0.9;
+ maxx = sc->right_margin * 0.9;
+
+ miny = sc->bottom_margin * 0.9;
+ maxy = sc->top_margin * 0.9;
+
+ minz = sc->left_margin * 5;
+ maxz = sc->right_margin * 2;
+
+ maxw = sc->font_wrap_pixels * sc->font_scale;
+ maxh = max_lines * sc->line_height * sc->font_scale;
+
+ if (maxw > maxx - minx)
+ maxw = maxx - minx;
+ if (maxh > maxy - miny)
+ maxh = maxy - miny;
+
+ if (alignment_random_p)
+ sc->alignment = (random() % 3) - 1;
+
+ if (sc->alignment == -1) maxx -= maxw;
+ else if (sc->alignment == 1) minx += maxw;
+ else minx += maxw/2, maxx -= maxw/2;
+
+ miny += maxh/2;
+ maxy -= maxh/2;
+
+ sc->mid.x = minx + frand (maxx - minx);
+ if (sc->anim_type == SPIN)
+ sc->mid.y = miny + BELLRAND (maxy - miny);
+ else
+ sc->mid.y = miny + frand (maxy - miny);
+
+ sc->in.x = BELLRAND(sc->right_margin * 2) - sc->right_margin;
+ sc->out.x = BELLRAND(sc->right_margin * 2) - sc->right_margin;
+
+ sc->in.y = miny + frand(maxy - miny);
+ sc->out.y = miny + frand(maxy - miny);
+
+ sc->in.z = minz + frand(maxz - minz);
+ sc->out.z = minz + frand(maxz - minz);
+
+ sc->mid.z = 0;
+
+ if (sc->anim_type == SPIN && sc->in.z > 0) sc->in.z /= 4;
+ if (sc->anim_type == SPIN && sc->out.z > 0) sc->out.z /= 4;
+
+ for (i = 0; i < max_lines; i++)
+ {
+ line *line = make_line (sc, (i == 0));
+ if (!line) break; /* no text available */
+ if (i >= min_lines &&
+ (!line->text || !*line->text)) /* blank after min */
+ break;
+ }
+
+ for (i = 0; i < sc->nlines; i++)
+ {
+ line *line = sc->lines[i];
+ if (!prev)
+ {
+ line->from.y = sc->bottom_margin;
+ line->to.y = 0;
+ }
+ else
+ {
+ line->from.y = prev->from.y - prev->height;
+ line->to.y = prev->to.y - prev->height;
+ }
+ line->cluster_pos = i;
+ line->cluster_size = sc->nlines;
+ prev = line;
+ }
+}
+
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+ a[3] = 1.0;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_fliptext (ModeInfo *mi, int width, int height)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (60.0, 1/h, 0.01, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 2.6,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ sc->right_margin = sc->top_margin / h;
+ sc->left_margin = -sc->right_margin;
+}
+
+
+ENTRYPOINT void
+init_fliptext (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ fliptext_configuration *sc;
+
+ MI_INIT(mi, scs);
+
+ sc = &scs[MI_SCREEN(mi)];
+ sc->lines = (line **) calloc (max_lines+1, sizeof(char *));
+
+ sc->dpy = MI_DISPLAY(mi);
+
+ if ((sc->glx_context = init_GL(mi)) != NULL) {
+ reshape_fliptext (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+ }
+
+ {
+ XCharStruct e;
+ int cw, lh, ascent, descent;
+ sc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+ check_gl_error ("loading font");
+ texture_string_metrics (sc->texfont, "n", &e, &ascent, &descent);
+ cw = e.width;
+ lh = ascent + descent;
+ sc->char_width = cw;
+ sc->line_height = lh;
+ }
+
+ if (!wire)
+ {
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+ glEnable (GL_ALPHA_TEST);
+ glEnable (GL_TEXTURE_2D);
+
+ /* "Anistropic filtering helps for quadrilateral-angled textures.
+ A sharper image is accomplished by interpolating and filtering
+ multiple samples from one or more mipmaps to better approximate
+ very distorted textures. This is the next level of filtering
+ after trilinear filtering." */
+ if (strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ {
+ GLfloat anisotropic = 0.0;
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisotropic);
+ if (anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ anisotropic);
+ }
+ }
+
+ /* The default font is (by fiat) "18 points".
+ Interpret the user's font size request relative to that.
+ */
+ sc->font_scale = 3 * (font_size / 18.0);
+
+ if (target_columns <= 2) target_columns = 2;
+
+ /* Figure out what the wrap column should be, in font-coordinate pixels.
+ Compute it from the given -columns value, but don't let it be wider
+ than the screen.
+ */
+ {
+ GLfloat maxw = 110 * sc->line_height / sc->font_scale; /* magic... */
+ sc->font_wrap_pixels = target_columns * sc->char_width;
+ if (sc->font_wrap_pixels > maxw ||
+ sc->font_wrap_pixels <= 0)
+ sc->font_wrap_pixels = maxw;
+ }
+
+ sc->buf_size = target_columns * max_lines;
+ sc->buf = (char *) calloc (1, sc->buf_size);
+
+ alignment_random_p = False;
+ if (!alignment_str || !*alignment_str ||
+ !strcasecmp(alignment_str, "left"))
+ sc->alignment = -1;
+ else if (!strcasecmp(alignment_str, "center") ||
+ !strcasecmp(alignment_str, "middle"))
+ sc->alignment = 0;
+ else if (!strcasecmp(alignment_str, "right"))
+ sc->alignment = 1;
+ else if (!strcasecmp(alignment_str, "random"))
+ sc->alignment = -1, alignment_random_p = True;
+
+ else
+ {
+ fprintf (stderr,
+ "%s: alignment must be left/center/right/random, not \"%s\"\n",
+ progname, alignment_str);
+ exit (1);
+ }
+
+ sc->tc = textclient_open (sc->dpy);
+
+ if (max_lines < 1) max_lines = 1;
+ min_lines = max_lines * 0.66;
+ if (min_lines > max_lines - 3) min_lines = max_lines - 4;
+ if (min_lines < 1) min_lines = 1;
+
+ parse_color (mi, "foreground",
+ get_string_resource(mi->dpy, "foreground", "Foreground"),
+ sc->color);
+
+ sc->top_margin = (sc->char_width * 100);
+ sc->bottom_margin = -sc->top_margin;
+ reshape_fliptext (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); /* compute left/right */
+}
+
+
+ENTRYPOINT void
+draw_fliptext (ModeInfo *mi)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+/* XtAppContext app = XtDisplayToApplicationContext (sc->dpy);*/
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!sc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->glx_context));
+
+#if 0
+ if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+ XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+#endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ {
+ GLfloat s = 3.0 / (sc->top_margin - sc->bottom_margin);
+ glScalef(s, s, s);
+ }
+
+ glRotatef (sc->rotation.x, 1, 0, 0);
+ glRotatef (sc->rotation.y, 0, 1, 0);
+ glRotatef (sc->rotation.z, 0, 0, 1);
+
+#if 0
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (1,1,1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (sc->left_margin, sc->top_margin, 0);
+ glVertex3f (sc->right_margin, sc->top_margin, 0);
+ glVertex3f (sc->right_margin, sc->bottom_margin, 0);
+ glVertex3f (sc->left_margin, sc->bottom_margin, 0);
+ glEnd();
+ glBegin (GL_LINES);
+ glVertex3f (sc->in.x, sc->top_margin, sc->in.z);
+ glVertex3f (sc->in.x, sc->bottom_margin, sc->in.z);
+ glVertex3f (sc->mid.x, sc->top_margin, sc->mid.z);
+ glVertex3f (sc->mid.x, sc->bottom_margin, sc->mid.z);
+ glVertex3f (sc->out.x, sc->top_margin, sc->out.z);
+ glVertex3f (sc->out.x, sc->bottom_margin, sc->out.z);
+ glEnd();
+ glEnable (GL_TEXTURE_2D);
+#endif
+
+ for (i = 0; i < sc->nlines; i++)
+ {
+ line *line = sc->lines[i];
+ draw_line (mi, line);
+ tick_line (sc, line);
+ }
+
+ for (i = sc->nlines-1; i >= 0; i--)
+ {
+ line *line = sc->lines[i];
+ if (line->state == DEAD)
+ free_line (sc, line);
+ }
+
+ if (sc->nlines == 0)
+ reset_lines (mi);
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_fliptext (ModeInfo *mi)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+ if (sc->tc)
+ textclient_close (sc->tc);
+ free(sc->lines);
+
+ /* #### there's more to free here */
+}
+
+XSCREENSAVER_MODULE ("FlipText", fliptext)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/fliptext.man b/hacks/glx/fliptext.man
new file mode 100644
index 0000000..8d2915e
--- /dev/null
+++ b/hacks/glx/fliptext.man
@@ -0,0 +1,114 @@
+.TH XScreenSaver 1 "20-Mar-2005" "X Version 11"
+.SH NAME
+fliptext - draws pages of text whose lines transparently flip around
+.SH SYNOPSIS
+.B fliptext
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
+[\-program \fIcommand\fP]
+[\-size \fIinteger\fP ]
+[\-columns \fIinteger\fP]
+[\-left | \-center | \-right]
+[\-lines \fIinteger\fP]
+[\-speed \fIfloat\fP]
+[\-delay \fIusecs\fP]
+[\-font \fIxlfd\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIfliptext\fP program runs another program to generate a stream of
+text, then animates the lines of that text transparently flipping in
+and out in 3D.
+.SH OPTIONS
+.I fliptext
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-program \fIsh-command\fP
+This program will be run periodically, and its output will be the text
+that is displayed. Default \fIxscreensaver\-text\fP.
+
+You can configure the text printed through the "Advanced" tab of
+.BR xscreensaver\-demo (1),
+or by editing your ~/.xscreensaver file.
+.TP 8
+.B \-size \fIinteger\fP
+How large a font to use, in points. (Well, in some arbitrary unit
+we're calling "points" for the sake of argument.) Default: 20.
+.TP 8
+.B \-columns \fIinteger\fP
+At (approximately) what column to wrap lines. Default 80. Wrapping is
+done by pixels, not characters, and lines will always wrap at the
+edge of the screen regardless.
+.TP 8
+.B \-left | \-center | \-right
+Whether to align the text flush left, centered, or flush right.
+The default is to choose randomly each time a new screen of text
+is displayed.
+.TP 8
+.B \-lines \fIinteger\fP
+How many lines of text should be shown at once. Default 8.
+.TP 8
+.B \-speed \fIratio\fP
+Change the animation speed; 0.5 to go half as fast, 2.0 to go twice as fast.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation; default is 10000 (1/10th second.)
+.TP 8
+.B \-font \fIfont-name\fP
+The name of the font to use. For best effect, this should be a large
+font (at least 36 points.) The bigger the font, the better looking the
+characters will be. Note that the size of this font affects only the
+clarity of the characters, not their size on the screen: for that, use
+the \fI\-size\fP or \fI\-columns\fP options.
+
+Default: -*-utopia-bold-r-normal-*-*-720-*-*-*-*-iso8859-1
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR fontglide (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/flurry-smoke.c b/hacks/glx/flurry-smoke.c
new file mode 100644
index 0000000..245e9f1
--- /dev/null
+++ b/hacks/glx/flurry-smoke.c
@@ -0,0 +1,1441 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+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 author 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.
+
+*/
+
+/* Smoke.cpp: implementation of the Smoke class. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+#define MAXANGLES 16384
+#define NOT_QUITE_DEAD 3
+
+#define intensity 75000.0f;
+
+void InitSmoke(SmokeV *s)
+{
+ int i;
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ s->lastParticleTime = 0.25f;
+ s->firstTime = 1;
+ s->frame = 0;
+ for (i=0;i<3;i++) {
+ s->old[i] = RandFlt(-100.0, 100.0);
+ }
+}
+
+void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
+{
+ int i,j,k;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ double frameRateModifier;
+
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier = 42.5f / frameRate;
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ for(k=0; k<4; k++) {
+ float dx,dy,dz;
+ float f;
+ float rsquared;
+ float mag;
+ float deltax;
+ float deltay;
+ float deltaz;
+
+ if (s->p[i].dead.i[k]) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].f[k];
+ deltay = s->p[i].delta[1].f[k];
+ deltaz = s->p[i].delta[2].f[k];
+
+ for(j=0;j<flurry->numStreams;j++) {
+ dx = s->p[i].position[0].f[k] - flurry->spark[j]->position[0];
+ dy = s->p[i].position[1].f[k] - flurry->spark[j]->position[1];
+ dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+
+ f = (gravity/rsquared) * frameRateModifier;
+
+ if ((((i*4)+k) % flurry->numStreams) == j) {
+ f *= 1.0f + streamBias;
+ }
+ mag = f / (float) sqrt(rsquared);
+
+ deltax -= (dx * mag);
+ deltay -= (dy * mag);
+ deltaz -= (dz * mag);
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax *= flurry->drag;
+ deltay *= flurry->drag;
+ deltaz *= flurry->drag;
+
+ if((deltax*deltax+deltay*deltay+deltaz*deltaz) >= 25000000.0f) {
+ s->p[i].dead.i[k] = 1;
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].f[k] = deltax;
+ s->p[i].delta[1].f[k] = deltay;
+ s->p[i].delta[2].f[k] = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].f[k] = s->p[i].position[j].f[k];
+ s->p[i].position[j].f[k] += (s->p[i].delta[j].f[k])*flurry->fDeltaTime;
+ }
+ }
+ }
+}
+
+#if 0
+#ifdef __ppc__
+
+void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
+{
+ int i,j,k;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ double frameRateModifier;
+
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+ /*
+ reciprocal square-root estimate replaced above divide and call to system sqrt()
+
+ asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+ mag *= f;
+ */
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier = 42.5f / frameRate;
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ for(k=0; k<4; k++) {
+ float dx,dy,dz;
+ float f;
+ float rsquared;
+ float mag;
+ float deltax;
+ float deltay;
+ float deltaz;
+
+ if (s->p[i].dead.i[k]) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].f[k];
+ deltay = s->p[i].delta[1].f[k];
+ deltaz = s->p[i].delta[2].f[k];
+
+ for(j=0;j<flurry->numStreams;j++) {
+ dx = s->p[i].position[0].f[k] - flurry->spark[j]->position[0];
+ dy = s->p[i].position[1].f[k] - flurry->spark[j]->position[1];
+ dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+
+ /*
+ asm("fres %0, %1" : "=f" (f) : "f" (rsquared));
+ f *= gravity*frameRateModifier;
+ */
+ f = ( gravity * frameRateModifier ) / rsquared;
+
+ if((((i*4)+k) % flurry->numStreams) == j) {
+ f *= 1.0f + streamBias;
+ }
+
+ mag = f / (float) sqrt(rsquared);
+
+ /* reciprocal square-root estimate replaced above divide and call to system sqrt() */
+
+ deltax -= (dx * mag);
+ deltay -= (dy * mag);
+ deltaz -= (dz * mag);
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax *= flurry->drag;
+ deltay *= flurry->drag;
+ deltaz *= flurry->drag;
+
+ if((deltax*deltax+deltay*deltay+deltaz*deltaz) >= 25000000.0f) {
+ s->p[i].dead.i[k] = 1;
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].f[k] = deltax;
+ s->p[i].delta[1].f[k] = deltay;
+ s->p[i].delta[2].f[k] = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].f[k] = s->p[i].position[j].f[k];
+ s->p[i].position[j].f[k] += (s->p[i].delta[j].f[k])*flurry->fDeltaTime;
+ }
+ }
+ }
+}
+
+#endif
+
+#ifdef __VEC__
+
+void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
+{
+ unsigned int i,j;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ floatToVector frameRateModifier;
+ floatToVector gravityV;
+ floatToVector dragV;
+ floatToVector deltaTimeV;
+ const vector float deadConst = (vector float) (25000000.0,25000000.0,25000000.0,25000000.0);
+ const vector float zero = (vector float)(0.0, 0.0, 0.0, 0.0);
+ const vector float biasConst = (vector float)(streamBias);
+
+ gravityV.f[0] = gravity;
+ gravityV.v = (vector float) vec_splat((vector unsigned int)gravityV.v, 0);
+
+ dragV.f[0] = flurry->drag;
+ dragV.v = (vector float) vec_splat((vector unsigned int)dragV.v, 0);
+
+ deltaTimeV.f[0] = flurry->fDeltaTime;
+ deltaTimeV.v = (vector float) vec_splat((vector unsigned int)deltaTimeV.v, 0);
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+ /*
+ asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+ mag *= f;
+ */
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier.f[0] = 42.5f / frameRate;
+ frameRateModifier.v = (vector float) vec_splat((vector unsigned int)frameRateModifier.v, 0);
+
+ frameRateModifier.v = vec_madd(frameRateModifier.v, gravityV.v, zero);
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ /* floatToVector f; */
+ vector float deltax, deltay, deltaz;
+ vector float distTemp;
+ vector unsigned int deadTemp;
+ /* floatToVector infopos0, infopos1, infopos2; */
+ intToVector mod;
+ vector unsigned int jVec;
+
+
+ vec_dst((int *)(&(s->p[i+4])), 0x00020200, 3);
+
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].v;
+ deltay = s->p[i].delta[1].v;
+ deltaz = s->p[i].delta[2].v;
+
+ mod.i[0] = (i<<2 + 0) % flurry->numStreams;
+ if(mod.i[0]+1 == flurry->numStreams) {
+ mod.i[1] = 0;
+ } else {
+ mod.i[1] = mod.i[0]+1;
+ }
+ if(mod.i[1]+1 == flurry->numStreams) {
+ mod.i[2] = 0;
+ } else {
+ mod.i[2] = mod.i[1]+1;
+ }
+ if(mod.i[2]+1 == flurry->numStreams) {
+ mod.i[3] = 0;
+ } else {
+ mod.i[3] = mod.i[2]+1;
+ }
+
+ jVec = vec_xor(jVec, jVec);
+
+ vec_dst( &flurry->spark[0]->position[0], 0x16020160, 3 );
+ for(j=0; j<flurry->numStreams;j++) {
+ vector float ip0, ip1 = (vector float)(0.0), ip2;
+ vector float dx, dy, dz;
+ vector float rsquared, f;
+ vector float one_over_rsquared;
+ vector float biasTemp;
+ vector float mag;
+ vector bool int biasOr;
+
+ ip0 = vec_ld(0, flurry->spark[j]->position);
+ if(((int)(flurry->spark[j]->position) & 0xF)>=8) {
+ ip1 = vec_ld(16, flurry->spark[j]->position);
+ }
+
+ ip0 = vec_perm(ip0, ip1, vec_lvsl(0, flurry->spark[j]->position));
+ ip1 = (vector float) vec_splat((vector unsigned int)ip0, 1);
+ ip2 = (vector float) vec_splat((vector unsigned int)ip0, 2);
+ ip0 = (vector float) vec_splat((vector unsigned int)ip0, 0);
+
+ dx = vec_sub(s->p[i].position[0].v, ip0);
+ dy = vec_sub(s->p[i].position[1].v, ip1);
+ dz = vec_sub(s->p[i].position[2].v, ip2);
+
+ rsquared = vec_madd(dx, dx, zero);
+ rsquared = vec_madd(dy, dy, rsquared);
+ rsquared = vec_madd(dz, dz, rsquared);
+
+ biasOr = vec_cmpeq(jVec, mod.v);
+ biasTemp = vec_add(vec_and(biasOr, biasConst), (vector float)(1.0));
+
+ f = vec_madd(biasTemp, frameRateModifier.v, zero);
+ one_over_rsquared = vec_re(rsquared);
+ f = vec_madd(f, one_over_rsquared, zero);
+
+ mag = vec_rsqrte(rsquared);
+ mag = vec_madd(mag, f, zero);
+
+ deltax = vec_nmsub(dx, mag, deltax);
+ deltay = vec_nmsub(dy, mag, deltay);
+ deltaz = vec_nmsub(dz, mag, deltaz);
+
+ jVec = vec_add(jVec, (vector unsigned int)(1));
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax = vec_madd(deltax, dragV.v, zero);
+ deltay = vec_madd(deltay, dragV.v, zero);
+ deltaz = vec_madd(deltaz, dragV.v, zero);
+
+ distTemp = vec_madd(deltax, deltax, zero);
+ distTemp = vec_madd(deltay, deltay, distTemp);
+ distTemp = vec_madd(deltaz, deltaz, distTemp);
+
+ deadTemp = (vector unsigned int) vec_cmpge(distTemp, deadConst);
+ deadTemp = vec_and((vector unsigned int)vec_splat_u32(1), deadTemp);
+ s->p[i].dead.v = vec_or(s->p[i].dead.v, deadTemp);
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].v = deltax;
+ s->p[i].delta[1].v = deltay;
+ s->p[i].delta[2].v = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].v = s->p[i].position[j].v;
+ s->p[i].position[j].v = vec_madd(s->p[i].delta[j].v, deltaTimeV.v, s->p[i].position[j].v);
+ }
+ }
+}
+
+void UpdateSmoke_VectorUnrolled(global_info_t *info, SmokeV *s)
+{
+ unsigned int i,j;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ floatToVector frameRateModifier;
+ floatToVector gravityV;
+ floatToVector dragV;
+ floatToVector deltaTimeV;
+ const vector float deadConst = (vector float) (25000000.0,25000000.0,25000000.0,25000000.0);
+ const vector float zero = (vector float)(0.0, 0.0, 0.0, 0.0);
+ const vector float biasConst = (vector float)(streamBias);
+
+ gravityV.f[0] = gravity;
+ gravityV.v = (vector float) vec_splat((vector unsigned int)gravityV.v, 0);
+
+ dragV.f[0] = flurry->drag;
+ dragV.v = (vector float) vec_splat((vector unsigned int)dragV.v, 0);
+
+ deltaTimeV.f[0] = flurry->fDeltaTime;
+ deltaTimeV.v = (vector float) vec_splat((vector unsigned int)deltaTimeV.v, 0);
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+ /*
+ asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+ mag *= f;
+ */
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier.f[0] = 42.5f / frameRate;
+ frameRateModifier.v = (vector float) vec_splat((vector unsigned int)frameRateModifier.v, 0);
+
+ frameRateModifier.v = vec_madd(frameRateModifier.v, gravityV.v, zero);
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ /* floatToVector f; */
+ vector float deltax, deltay, deltaz;
+ vector float distTemp;
+ vector unsigned int deadTemp;
+ /* floatToVector infopos0, infopos1, infopos2; */
+ intToVector mod;
+ vector unsigned int jVec;
+ vector unsigned int intOne = vec_splat_u32(1);
+ vector float floatOne = vec_ctf(intOne, 0);
+
+
+ vec_dst((int *)(&(s->p[i+4])), 0x00020200, 3);
+
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].v;
+ deltay = s->p[i].delta[1].v;
+ deltaz = s->p[i].delta[2].v;
+
+ mod.i[0] = (i<<2 + 0) % flurry->numStreams;
+ if(mod.i[0]+1 == flurry->numStreams) {
+ mod.i[1] = 0;
+ } else {
+ mod.i[1] = mod.i[0]+1;
+ }
+ if(mod.i[1]+1 == flurry->numStreams) {
+ mod.i[2] = 0;
+ } else {
+ mod.i[2] = mod.i[1]+1;
+ }
+ if(mod.i[2]+1 == flurry->numStreams) {
+ mod.i[3] = 0;
+ } else {
+ mod.i[3] = mod.i[2]+1;
+ }
+
+ jVec = vec_xor(jVec, jVec);
+
+ vec_dst( &flurry->spark[0]->position[0], 0x16020160, 3 );
+ for(j=0; j + 3 < flurry->numStreams;j+=4)
+ {
+ vector float dxa, dya, dza;
+ vector float dxb, dyb, dzb;
+ vector float dxc, dyc, dzc;
+ vector float dxd, dyd, dzd;
+ vector float ip0a, ip1a;
+ vector float ip0b, ip1b;
+ vector float ip0c, ip1c;
+ vector float ip0d, ip1d;
+ vector float rsquaredA;
+ vector float rsquaredB;
+ vector float rsquaredC;
+ vector float rsquaredD;
+ vector float fA, fB, fC, fD;
+ vector float biasTempA;
+ vector float biasTempB;
+ vector float biasTempC;
+ vector float biasTempD;
+ vector float magA;
+ vector float magB;
+ vector float magC;
+ vector float magD;
+
+ vector float one_over_rsquaredA;
+ vector float one_over_rsquaredB;
+ vector float one_over_rsquaredC;
+ vector float one_over_rsquaredD;
+ vector bool int biasOrA,biasOrB,biasOrC,biasOrD;
+
+ /* load vectors */
+ ip0a = vec_ld(0, flurry->spark[j]->position);
+ ip0b = vec_ld(0, flurry->spark[j+1]->position);
+ ip0c = vec_ld(0, flurry->spark[j+2]->position);
+ ip0d = vec_ld(0, flurry->spark[j+3]->position);
+ ip1a = vec_ld( 12, flurry->spark[j]->position );
+ ip1b = vec_ld( 12, flurry->spark[j+1]->position );
+ ip1c = vec_ld( 12, flurry->spark[j+2]->position );
+ ip1d = vec_ld( 12, flurry->spark[j+3]->position );
+
+ /* align them */
+ ip0a = vec_perm(ip0a, ip1a, vec_lvsl(0, flurry->spark[j]->position));
+ ip0b = vec_perm(ip0b, ip1b, vec_lvsl(0, flurry->spark[j+1]->position));
+ ip0c = vec_perm(ip0c, ip1c, vec_lvsl(0, flurry->spark[j+2]->position));
+ ip0d = vec_perm(ip0d, ip1d, vec_lvsl(0, flurry->spark[j+3]->position));
+
+ dxa = vec_splat( ip0a, 0 );
+ dxb = vec_splat( ip0b, 0 );
+ dxc = vec_splat( ip0c, 0 );
+ dxd = vec_splat( ip0d, 0 );
+ dxa = vec_sub( s->p[i].position[0].v, dxa );
+ dxb = vec_sub( s->p[i].position[0].v, dxb );
+ dxc = vec_sub( s->p[i].position[0].v, dxc );
+ dxd = vec_sub( s->p[i].position[0].v, dxd );
+
+ dya = vec_splat( ip0a, 1 );
+ dyb = vec_splat( ip0b, 1 );
+ dyc = vec_splat( ip0c, 1 );
+ dyd = vec_splat( ip0d, 1 );
+ dya = vec_sub( s->p[i].position[1].v, dya );
+ dyb = vec_sub( s->p[i].position[1].v, dyb );
+ dyc = vec_sub( s->p[i].position[1].v, dyc );
+ dyd = vec_sub( s->p[i].position[1].v, dyd );
+
+ dza = vec_splat( ip0a, 2 );
+ dzb = vec_splat( ip0b, 2 );
+ dzc = vec_splat( ip0c, 2 );
+ dzd = vec_splat( ip0d, 2 );
+ dza = vec_sub( s->p[i].position[2].v, dza );
+ dzb = vec_sub( s->p[i].position[2].v, dzb );
+ dzc = vec_sub( s->p[i].position[2].v, dzc );
+ dzd = vec_sub( s->p[i].position[2].v, dzd );
+
+ rsquaredA = vec_madd( dxa, dxa, zero );
+ rsquaredB = vec_madd( dxb, dxb, zero );
+ rsquaredC = vec_madd( dxc, dxc, zero );
+ rsquaredD = vec_madd( dxd, dxd, zero );
+
+ rsquaredA = vec_madd( dya, dya, rsquaredA );
+ rsquaredB = vec_madd( dyb, dyb, rsquaredB );
+ rsquaredC = vec_madd( dyc, dyc, rsquaredC );
+ rsquaredD = vec_madd( dyd, dyd, rsquaredD );
+
+ rsquaredA = vec_madd( dza, dza, rsquaredA );
+ rsquaredB = vec_madd( dzb, dzb, rsquaredB );
+ rsquaredC = vec_madd( dzc, dzc, rsquaredC );
+ rsquaredD = vec_madd( dzd, dzd, rsquaredD );
+
+ biasOrA = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+ biasOrB = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+ biasOrC = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+ biasOrD = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+
+ biasTempA = vec_add( vec_and( biasOrA, biasConst), floatOne);
+ biasTempB = vec_add( vec_and( biasOrB, biasConst), floatOne);
+ biasTempC = vec_add( vec_and( biasOrC, biasConst), floatOne);
+ biasTempD = vec_add( vec_and( biasOrD, biasConst), floatOne);
+
+ fA = vec_madd( biasTempA, frameRateModifier.v, zero);
+ fB = vec_madd( biasTempB, frameRateModifier.v, zero);
+ fC = vec_madd( biasTempC, frameRateModifier.v, zero);
+ fD = vec_madd( biasTempD, frameRateModifier.v, zero);
+ one_over_rsquaredA = vec_re( rsquaredA );
+ one_over_rsquaredB = vec_re( rsquaredB );
+ one_over_rsquaredC = vec_re( rsquaredC );
+ one_over_rsquaredD = vec_re( rsquaredD );
+ fA = vec_madd( fA, one_over_rsquaredA, zero);
+ fB = vec_madd( fB, one_over_rsquaredB, zero);
+ fC = vec_madd( fC, one_over_rsquaredC, zero);
+ fD = vec_madd( fD, one_over_rsquaredD, zero);
+ magA = vec_rsqrte( rsquaredA );
+ magB = vec_rsqrte( rsquaredB );
+ magC = vec_rsqrte( rsquaredC );
+ magD = vec_rsqrte( rsquaredD );
+ magA = vec_madd( magA, fA, zero );
+ magB = vec_madd( magB, fB, zero );
+ magC = vec_madd( magC, fC, zero );
+ magD = vec_madd( magD, fD, zero );
+ deltax = vec_nmsub( dxa, magA, deltax );
+ deltay = vec_nmsub( dya, magA, deltay );
+ deltaz = vec_nmsub( dza, magA, deltaz );
+
+ deltax = vec_nmsub( dxb, magB, deltax );
+ deltay = vec_nmsub( dyb, magB, deltay );
+ deltaz = vec_nmsub( dzb, magB, deltaz );
+
+ deltax = vec_nmsub( dxc, magC, deltax );
+ deltay = vec_nmsub( dyc, magC, deltay );
+ deltaz = vec_nmsub( dzc, magC, deltaz );
+
+ deltax = vec_nmsub( dxd, magD, deltax );
+ deltay = vec_nmsub( dyd, magD, deltay );
+ deltaz = vec_nmsub( dzd, magD, deltaz );
+ }
+
+
+ for(;j<flurry->numStreams;j++) {
+ vector float ip0, ip1 = (vector float)(0.0), ip2;
+ vector float dx, dy, dz;
+ vector float rsquared, f;
+ vector float one_over_rsquared;
+ vector float biasTemp;
+ vector float mag;
+ vector bool int biasOr;
+
+ ip0 = vec_ld(0, flurry->spark[j]->position);
+ if(((int)(flurry->spark[j]->position) & 0xF)>=8) {
+ ip1 = vec_ld(16, flurry->spark[j]->position);
+ }
+
+ ip0 = vec_perm(ip0, ip1, vec_lvsl(0, flurry->spark[j]->position));
+ ip1 = (vector float) vec_splat((vector unsigned int)ip0, 1);
+ ip2 = (vector float) vec_splat((vector unsigned int)ip0, 2);
+ ip0 = (vector float) vec_splat((vector unsigned int)ip0, 0);
+
+ dx = vec_sub(s->p[i].position[0].v, ip0);
+ dy = vec_sub(s->p[i].position[1].v, ip1);
+ dz = vec_sub(s->p[i].position[2].v, ip2);
+
+ rsquared = vec_madd(dx, dx, zero);
+ rsquared = vec_madd(dy, dy, rsquared);
+ rsquared = vec_madd(dz, dz, rsquared);
+
+ biasOr = vec_cmpeq(jVec, mod.v);
+ biasTemp = vec_add(vec_and(biasOr, biasConst), (vector float)(1.0));
+
+ f = vec_madd(biasTemp, frameRateModifier.v, zero);
+ one_over_rsquared = vec_re(rsquared);
+ f = vec_madd(f, one_over_rsquared, zero);
+
+ mag = vec_rsqrte(rsquared);
+ mag = vec_madd(mag, f, zero);
+
+ deltax = vec_nmsub(dx, mag, deltax);
+ deltay = vec_nmsub(dy, mag, deltay);
+ deltaz = vec_nmsub(dz, mag, deltaz);
+
+ jVec = vec_add(jVec, (vector unsigned int)(1));
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax = vec_madd(deltax, dragV.v, zero);
+ deltay = vec_madd(deltay, dragV.v, zero);
+ deltaz = vec_madd(deltaz, dragV.v, zero);
+
+ distTemp = vec_madd(deltax, deltax, zero);
+ distTemp = vec_madd(deltay, deltay, distTemp);
+ distTemp = vec_madd(deltaz, deltaz, distTemp);
+
+ deadTemp = (vector unsigned int) vec_cmpge(distTemp, deadConst);
+ deadTemp = vec_and((vector unsigned int)vec_splat_u32(1), deadTemp);
+ s->p[i].dead.v = vec_or(s->p[i].dead.v, deadTemp);
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].v = deltax;
+ s->p[i].delta[1].v = deltay;
+ s->p[i].delta[2].v = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].v = s->p[i].position[j].v;
+ s->p[i].position[j].v = vec_madd(s->p[i].delta[j].v, deltaTimeV.v, s->p[i].position[j].v);
+ }
+ }
+}
+
+#endif
+#endif /* 0 */
+
+void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
+{
+ int svi = 0;
+ int sci = 0;
+ int sti = 0;
+ int si = 0;
+ float width;
+ float sx,sy;
+ float u0,v0,u1,v1;
+ float w,z;
+ float screenRatio = global->sys_glWidth / 1024.0f;
+ float hslash2 = global->sys_glHeight * 0.5f;
+ float wslash2 = global->sys_glWidth * 0.5f;
+ int i,k;
+
+ width = (streamSize+2.5f*flurry->streamExpansion) * screenRatio;
+
+ for (i=0;i<NUMSMOKEPARTICLES/4;i++)
+ {
+ for (k=0; k<4; k++) {
+ float thisWidth;
+ float oldz;
+
+ if (s->p[i].dead.i[k]) {
+ continue;
+ }
+ thisWidth = (streamSize + (flurry->fTime - s->p[i].time.f[k])*flurry->streamExpansion) * screenRatio;
+ if (thisWidth >= width)
+ {
+ s->p[i].dead.i[k] = 1;
+ continue;
+ }
+ z = s->p[i].position[2].f[k];
+ sx = s->p[i].position[0].f[k] * global->sys_glWidth / z + wslash2;
+ sy = s->p[i].position[1].f[k] * global->sys_glWidth / z + hslash2;
+ oldz = s->p[i].oldposition[2].f[k];
+ if (sx > global->sys_glWidth+50.0f || sx < -50.0f || sy > global->sys_glHeight+50.0f || sy < -50.0f || z < 25.0f || oldz < 25.0f)
+ {
+ continue;
+ }
+
+ w = MAX_(1.0f,thisWidth/z);
+ {
+ float oldx = s->p[i].oldposition[0].f[k];
+ float oldy = s->p[i].oldposition[1].f[k];
+ float oldscreenx = (oldx * global->sys_glWidth / oldz) + wslash2;
+ float oldscreeny = (oldy * global->sys_glWidth / oldz) + hslash2;
+ float dx = (sx-oldscreenx);
+ float dy = (sy-oldscreeny);
+
+ float d = FastDistance2D(dx, dy);
+
+ float sm, os, ow;
+ if (d)
+ {
+ sm = w/d;
+ }
+ else
+ {
+ sm = 0.0f;
+ }
+ ow = MAX_(1.0f,thisWidth/oldz);
+ if (d)
+ {
+ os = ow/d;
+ }
+ else
+ {
+ os = 0.0f;
+ }
+
+ {
+ floatToVector cmv;
+ float cm;
+ float m = 1.0f + sm;
+
+ float dxs = dx*sm;
+ float dys = dy*sm;
+ float dxos = dx*os;
+ float dyos = dy*os;
+ float dxm = dx*m;
+ float dym = dy*m;
+
+ s->p[i].animFrame.i[k]++;
+ if (s->p[i].animFrame.i[k] >= 64)
+ {
+ s->p[i].animFrame.i[k] = 0;
+ }
+
+ u0 = (s->p[i].animFrame.i[k]& 7) * 0.125f;
+ v0 = (s->p[i].animFrame.i[k]>>3) * 0.125f;
+ u1 = u0 + 0.125f;
+ v1 = v0 + 0.125f;
+ cm = (1.375f - thisWidth/width);
+ if (s->p[i].dead.i[k] == 3)
+ {
+ cm *= 0.125f;
+ s->p[i].dead.i[k] = 1;
+ }
+ si++;
+ cm *= brightness;
+ cmv.f[0] = s->p[i].color[0].f[k]*cm;
+ cmv.f[1] = s->p[i].color[1].f[k]*cm;
+ cmv.f[2] = s->p[i].color[2].f[k]*cm;
+ cmv.f[3] = s->p[i].color[3].f[k]*cm;
+
+#if 0
+ /* MDT we can't use vectors in the Scalar routine */
+ s->seraphimColors[sci++].v = cmv.v;
+ s->seraphimColors[sci++].v = cmv.v;
+ s->seraphimColors[sci++].v = cmv.v;
+ s->seraphimColors[sci++].v = cmv.v;
+#else
+ {
+ int ii, jj;
+ for (jj = 0; jj < 4; jj++) {
+ for (ii = 0; ii < 4; ii++) {
+ s->seraphimColors[sci].f[ii] = cmv.f[ii];
+ }
+ sci += 1;
+ }
+ }
+#endif
+
+ s->seraphimTextures[sti++] = u0;
+ s->seraphimTextures[sti++] = v0;
+ s->seraphimTextures[sti++] = u0;
+ s->seraphimTextures[sti++] = v1;
+
+ s->seraphimTextures[sti++] = u1;
+ s->seraphimTextures[sti++] = v1;
+ s->seraphimTextures[sti++] = u1;
+ s->seraphimTextures[sti++] = v0;
+
+ s->seraphimVertices[svi].f[0] = sx+dxm-dys;
+ s->seraphimVertices[svi].f[1] = sy+dym+dxs;
+ s->seraphimVertices[svi].f[2] = sx+dxm+dys;
+ s->seraphimVertices[svi].f[3] = sy+dym-dxs;
+ svi++;
+
+ s->seraphimVertices[svi].f[0] = oldscreenx-dxm+dyos;
+ s->seraphimVertices[svi].f[1] = oldscreeny-dym-dxos;
+ s->seraphimVertices[svi].f[2] = oldscreenx-dxm-dyos;
+ s->seraphimVertices[svi].f[3] = oldscreeny-dym+dxos;
+ svi++;
+ }
+ }
+ }
+ }
+ glColorPointer(4,GL_FLOAT,0,s->seraphimColors);
+ glVertexPointer(2,GL_FLOAT,0,s->seraphimVertices);
+ glTexCoordPointer(2,GL_FLOAT,0,s->seraphimTextures);
+ glDrawArrays(GL_QUADS,0,si*4);
+}
+
+#if 0
+#ifdef __VEC__
+
+void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
+{
+ const vector float zero = (vector float)(0.0);
+ int svi = 0;
+ int sci = 0;
+ int sti = 0;
+ int si = 0;
+ floatToVector width;
+ vector float sx,sy;
+ floatToVector u0,v0,u1,v1;
+ vector float one_over_z;
+ vector float w;
+ floatToVector z;
+ float screenRatio = global->sys_glWidth / 1024.0f;
+ float hslash2 = global->sys_glHeight * 0.5f;
+ float wslash2 = global->sys_glWidth * 0.5f;
+ int i,kk;
+ floatToVector briteV, fTimeV, expansionV, screenRatioV, hslash2V, wslash2V, streamSizeV;
+ floatToVector glWidthV;
+ floatToVector cm;
+ vector float cmv[4];
+ vector float svec[4], ovec[4];
+ vector float oldscreenx, oldscreeny;
+ vector float sm;
+ vector float frameAnd7;
+ vector float frameShift3;
+ vector float one_over_width;
+ vector float dx, dy;
+ vector float os;
+ vector unsigned int vSi = vec_splat_u32(0);
+ const vector float eighth = (vector float)(0.125);
+ float glWidth50 = global->sys_glWidth + 50.0f;
+ float glHeight50 = global->sys_glHeight + 50.0f;
+ vector float vGLWidth50, vGLHeight50;
+ unsigned int blitBool;
+
+ vec_dst((int *)(&(s->p[0])), 0x00020200, 2);
+
+ {
+ vector unsigned char permute1 = vec_lvsl( 0, &glWidth50 );
+ vector unsigned char permute2 = vec_lvsl( 0, &glHeight50 );
+ permute1 = (vector unsigned char) vec_splat( (vector unsigned int) permute1, 0 );
+ permute2 = (vector unsigned char) vec_splat( (vector unsigned int) permute2, 0 );
+ vGLWidth50 = vec_lde( 0, &glWidth50 );
+ vGLHeight50 = vec_lde( 0, &glHeight50 );
+ vGLWidth50 = vec_perm( vGLWidth50, vGLWidth50, permute1 );
+ vGLHeight50 = vec_perm( vGLHeight50, vGLHeight50, permute2 );
+ }
+
+ width.f[0] = (streamSize+2.5f*flurry->streamExpansion) * screenRatio;
+ width.v = (vector float) vec_splat((vector unsigned int)width.v, 0);
+
+ briteV.f[0] = brightness;
+ briteV.v = (vector float) vec_splat((vector unsigned int)briteV.v, 0);
+
+ fTimeV.f[0] = (float) flurry->fTime;
+ fTimeV.v = (vector float) vec_splat((vector unsigned int)fTimeV.v, 0);
+
+ expansionV.f[0] = flurry->streamExpansion;
+ expansionV.v = (vector float) vec_splat((vector unsigned int)expansionV.v, 0);
+
+ screenRatioV.f[0] = screenRatio;
+ screenRatioV.v = (vector float) vec_splat((vector unsigned int)screenRatioV.v, 0);
+
+ hslash2V.f[0] = hslash2;
+ hslash2V.v = (vector float) vec_splat((vector unsigned int)hslash2V.v, 0);
+
+ wslash2V.f[0] = wslash2;
+ wslash2V.v = (vector float) vec_splat((vector unsigned int)wslash2V.v, 0);
+
+ streamSizeV.f[0] = streamSize;
+ streamSizeV.v = (vector float) vec_splat((vector unsigned int)streamSizeV.v, 0);
+
+ glWidthV.f[0] = global->sys_glWidth;
+ glWidthV.v = (vector float) vec_splat((vector unsigned int)glWidthV.v, 0);
+
+ for (i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ vector float thisWidth;
+ vector float oldz;
+ vector float oldx, oldy, one_over_oldz;
+ vector float xabs, yabs, mn;
+ vector float d;
+ vector float one_over_d;
+ vector bool int dnz;
+ vector float ow;
+
+ vec_dst((int *)(&(s->p[i+4])), 0x00020200, 2);
+
+ if (vec_all_eq(s->p[i].dead.v, (vector unsigned int)(1))) continue;
+
+ blitBool = 0; /* keep track of particles that actually need to be drawn */
+
+ thisWidth = vec_sub(fTimeV.v, s->p[i].time.v);
+ thisWidth = vec_madd(thisWidth, expansionV.v, streamSizeV.v);
+ thisWidth = vec_madd(thisWidth, screenRatioV.v, zero);
+
+ z.v = s->p[i].position[2].v;
+ one_over_z = vec_re(z.v);
+
+ sx = vec_madd(s->p[i].position[0].v, glWidthV.v, zero);
+ sx = vec_madd(sx, one_over_z, wslash2V.v);
+ sy = vec_madd(s->p[i].position[1].v, glWidthV.v, zero);
+ sy = vec_madd(sy, one_over_z, hslash2V.v);
+
+ oldz = s->p[i].oldposition[2].v;
+
+ w = vec_max((vector float)(1.0), vec_madd(thisWidth, one_over_z, zero));
+
+ oldx = s->p[i].oldposition[0].v;
+ oldy = s->p[i].oldposition[1].v;
+ one_over_oldz = vec_re(oldz);
+ oldscreenx = vec_madd(oldx, glWidthV.v, zero);
+ oldscreenx = vec_madd(oldscreenx, one_over_oldz, wslash2V.v);
+ oldscreeny = vec_madd(oldy, glWidthV.v, zero);
+ oldscreeny = vec_madd(oldscreeny, one_over_oldz, hslash2V.v);
+ dx = vec_sub(sx,oldscreenx);
+ dy = vec_sub(sy,oldscreeny);
+
+ xabs = vec_abs(dx);
+ yabs = vec_abs(dy);
+ mn = vec_min(xabs,yabs);
+ d = vec_add(xabs,yabs);
+ d = vec_madd(mn, (vector float)(-0.6875), d);
+
+ ow = vec_max((vector float)(1.0), vec_madd(thisWidth, one_over_oldz, zero));
+ one_over_d = vec_re(d);
+ dnz = vec_cmpgt(d, zero);
+ sm = vec_madd(w, one_over_d, zero);
+ sm = vec_and(sm, dnz);
+ os = vec_madd(ow, one_over_d, zero);
+ os = vec_and(os, dnz);
+
+ {
+ intToVector tempMask;
+ vector bool int mask = vec_cmpeq( s->p[i].dead.v, vec_splat_u32(1) ); /* -1 where true */
+ vector bool int gtMask = vec_cmpge( thisWidth, width.v ); /* -1 where true */
+ vector bool int glWidth50Test = vec_cmpgt( sx, (vector float)(vGLWidth50) ); /* -1 where true */
+ vector bool int glHeight50Test = vec_cmpgt( sy, (vector float)(vGLHeight50) ); /* -1 where true */
+ vector bool int test50x = vec_cmplt( sx, (vector float) (-50.0) );
+ vector bool int test50y = vec_cmplt( sy, (vector float) (-50.0) );
+ vector bool int testz = vec_cmplt( z.v, (vector float) (25.0) );
+ vector bool int testoldz = vec_cmplt( oldz, (vector float) (25.0) );
+ mask = vec_or( mask, gtMask );
+ s->p[i].dead.v = vec_and( mask, vec_splat_u32( 1 ) );
+ mask = vec_or( mask, glWidth50Test );
+ mask = vec_or( mask, glHeight50Test );
+ mask = vec_or( mask, test50x );
+ mask = vec_or( mask, test50y );
+ mask = vec_or( mask, testz );
+ mask = vec_or( mask, testoldz );
+ tempMask.v = (vector unsigned int)mask;
+
+ s->p[i].animFrame.v = vec_sub( s->p[i].animFrame.v, vec_nor( mask, mask ) );
+ s->p[i].animFrame.v = vec_and( s->p[i].animFrame.v, (vector unsigned int)(63) );
+
+ frameAnd7 = vec_ctf(vec_and(s->p[i].animFrame.v, (vector unsigned int)(7)),0);
+ u0.v = vec_madd(frameAnd7, eighth, zero);
+
+ frameShift3 = vec_ctf(vec_sr(s->p[i].animFrame.v, (vector unsigned int)(3)),0);
+ v0.v = vec_madd(frameAnd7, eighth, zero);
+
+ u1.v = vec_add(u0.v, eighth);
+ v1.v = vec_add(v0.v, eighth);
+
+ one_over_width = vec_re(width.v);
+ cm.v = vec_sel( vec_nmsub(thisWidth, one_over_width, (vector float)(1.375)), cm.v, mask );
+ cm.v = vec_madd(cm.v, briteV.v, zero);
+
+ vSi = vec_sub( vSi, vec_nor( mask, mask ) );
+ {
+ vector unsigned int blitMask = (vector unsigned int) (1, 2, 4, 8);
+ vector unsigned int temp = (vector unsigned int)mask;
+ temp = vec_andc( blitMask, temp );
+ temp = vec_add( temp, vec_sld( temp, temp, 8 ) );
+ temp = vec_add( temp, vec_sld( temp, temp, 4 ) );
+ vec_ste( temp, 0, &blitBool );
+
+ }
+
+ {
+ vector float temp1, temp2, temp3, temp4;
+ vector float result1a, result1b, result2a, result2b, result3a, result3b, result4a, result4b;
+
+ temp1 = vec_mergeh( u0.v, u0.v );
+ temp2 = vec_mergel( u0.v, u0.v );
+ temp3 = vec_mergeh( v0.v, v1.v );
+ temp4 = vec_mergel( v0.v, v1.v );
+
+ result1a = vec_mergeh( temp1, temp3 );
+ result1b = vec_mergel( temp1, temp3 );
+ result2a = vec_mergeh( temp2, temp4 );
+ result2b = vec_mergel( temp2, temp4 );
+
+ temp1 = vec_mergeh( u1.v, u1.v );
+ temp2 = vec_mergel( u1.v, u1.v );
+ temp3 = vec_mergeh( v1.v, v0.v );
+ temp4 = vec_mergel( v1.v, v0.v );
+
+ result3a = vec_mergeh( temp1, temp3 );
+ result3b = vec_mergel( temp1, temp3 );
+ result4a = vec_mergeh( temp2, temp4 );
+ result4b = vec_mergel( temp2, temp4 );
+
+ if( blitBool & 1 )
+ {
+ vec_st( result1a, 0, &s->seraphimTextures[sti] );
+ vec_st( result3a, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ if( blitBool & 2 )
+ {
+ vec_st( result1b, 0, &s->seraphimTextures[sti]);
+ vec_st( result3b, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ if( blitBool & 4 )
+ {
+ vec_st( result2a, 0, &s->seraphimTextures[sti]);
+ vec_st( result4a, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ if( blitBool & 8 )
+ {
+ vec_st( result2b, 0, &s->seraphimTextures[sti]);
+ vec_st( result4b, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ }
+ }
+
+ cmv[0] = vec_madd(s->p[i].color[0].v, cm.v, zero);
+ cmv[1] = vec_madd(s->p[i].color[1].v, cm.v, zero);
+ cmv[2] = vec_madd(s->p[i].color[2].v, cm.v, zero);
+ cmv[3] = vec_madd(s->p[i].color[3].v, cm.v, zero);
+ {
+ vector float vI0, vI1, vI2, vI3;
+
+ vI0 = vec_mergeh ( cmv[0], cmv[2] );
+ vI1 = vec_mergeh ( cmv[1], cmv[3] );
+ vI2 = vec_mergel ( cmv[0], cmv[2] );
+ vI3 = vec_mergel ( cmv[1], cmv[3] );
+
+ cmv[0] = vec_mergeh ( vI0, vI1 );
+ cmv[1] = vec_mergel ( vI0, vI1 );
+ cmv[2] = vec_mergeh ( vI2, vI3 );
+ cmv[3] = vec_mergel ( vI2, vI3 );
+ }
+
+ vec_dst( cmv, 0x0D0100D0, 1 );
+
+ {
+ vector float sxd, syd;
+ vector float sxdm, sxdp, sydm, sydp;
+ vector float oxd, oyd;
+ vector float oxdm, oxdp, oydm, oydp;
+ vector float vI0, vI1, vI2, vI3;
+ vector float dxs, dys;
+ vector float dxos, dyos;
+ vector float dxm, dym;
+ vector float m;
+
+ m = vec_add((vector float)(1.0), sm);
+
+ dxs = vec_madd(dx, sm, zero);
+ dys = vec_madd(dy, sm, zero);
+ dxos = vec_madd(dx, os, zero);
+ dyos = vec_madd(dy, os, zero);
+ dxm = vec_madd(dx, m, zero);
+ dym = vec_madd(dy, m, zero);
+
+ sxd = vec_add(sx, dxm);
+ sxdm = vec_sub(sxd, dys);
+ sxdp = vec_add(sxd, dys);
+
+ syd = vec_add(sy, dym);
+ sydm = vec_sub(syd, dxs);
+ sydp = vec_add(syd, dxs);
+
+ oxd = vec_sub(oldscreenx, dxm);
+ oxdm = vec_sub(oxd, dyos);
+ oxdp = vec_add(oxd, dyos);
+
+ oyd = vec_sub(oldscreeny, dym);
+ oydm = vec_sub(oyd, dxos);
+ oydp = vec_add(oyd, dxos);
+
+ vI0 = vec_mergeh ( sxdm, sxdp );
+ vI1 = vec_mergeh ( sydp, sydm );
+ vI2 = vec_mergel ( sxdm, sxdp );
+ vI3 = vec_mergel ( sydp, sydm );
+
+ svec[0] = vec_mergeh ( vI0, vI1 );
+ svec[1] = vec_mergel ( vI0, vI1 );
+ svec[2] = vec_mergeh ( vI2, vI3 );
+ svec[3] = vec_mergel ( vI2, vI3 );
+
+ vI0 = vec_mergeh ( oxdp, oxdm );
+ vI1 = vec_mergeh ( oydm, oydp );
+ vI2 = vec_mergel ( oxdp, oxdm );
+ vI3 = vec_mergel ( oydm, oydp );
+
+ ovec[0] = vec_mergeh ( vI0, vI1 );
+ ovec[1] = vec_mergel ( vI0, vI1 );
+ ovec[2] = vec_mergeh ( vI2, vI3 );
+ ovec[3] = vec_mergel ( vI2, vI3 );
+ }
+
+ {
+ int offset0 = (sci + 0) * sizeof( vector float );
+ int offset1 = (sci + 1) * sizeof( vector float );
+ int offset2 = (sci + 2) * sizeof( vector float );
+ int offset3 = (sci + 3) * sizeof( vector float );
+ int offset4 = (svi + 0) * sizeof( vector float );
+ int offset5 = (svi + 1) * sizeof( vector float );
+ vector float *colors = (vector float *)s->seraphimColors;
+ vector float *vertices = (vector float *)s->seraphimVertices;
+ for (kk=0; kk<4; kk++) {
+ if (blitBool>>kk & 1) {
+ vector float vcmv = cmv[kk];
+ vector float vsvec = svec[kk];
+ vector float vovec = ovec[kk];
+
+ vec_st( vcmv, offset0, colors );
+ vec_st( vcmv, offset1, colors );
+ vec_st( vcmv, offset2, colors );
+ vec_st( vcmv, offset3, colors );
+ vec_st( vsvec, offset4, vertices );
+ vec_st( vovec, offset5, vertices );
+ colors += 4;
+ vertices += 2;
+ sci += 4;
+ svi += 2;
+ }
+ }
+ }
+ }
+ vSi = vec_add( vSi, vec_sld( vSi, vSi, 8 ) );
+ vSi = vec_add( vSi, vec_sld( vSi, vSi, 4 ) );
+ vec_ste( (vector signed int) vSi, 0, &si );
+
+ glColorPointer(4,GL_FLOAT,0,s->seraphimColors);
+ glVertexPointer(2,GL_FLOAT,0,s->seraphimVertices);
+ glTexCoordPointer(2,GL_FLOAT,0,s->seraphimTextures);
+ glDrawArrays(GL_QUADS,0,si*4);
+}
+
+#endif
+#endif /* 0 */
diff --git a/hacks/glx/flurry-spark.c b/hacks/glx/flurry-spark.c
new file mode 100644
index 0000000..5b58b56
--- /dev/null
+++ b/hacks/glx/flurry-spark.c
@@ -0,0 +1,285 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+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 author 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.
+
+*/
+
+/* Spark.cpp: implementation of the Spark class. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+void InitSpark(Spark *s)
+{
+ int i;
+ for (i=0;i<3;i++)
+ {
+ s->position[i] = RandFlt(-100.0, 100.0);
+ }
+}
+
+void DrawSpark(global_info_t *global, flurry_info_t *flurry, Spark *s)
+{
+ const float black[4] = {0.0f,0.0f,0.0f,1.0f};
+ float width,sx,sy;
+ float a;
+ float c = 0.0625f;
+ float screenx;
+ float screeny;
+ float w,z, scale;
+ int k;
+ width = 60000.0f * global->sys_glWidth / 1024.0f;
+
+ z = s->position[2];
+ sx = s->position[0] * global->sys_glWidth / z + global->sys_glWidth * 0.5f;
+ sy = s->position[1] * global->sys_glWidth / z + global->sys_glHeight * 0.5f;
+ w = width*4.0f / z;
+
+ screenx = sx;
+ screeny = sy;
+
+ glPushMatrix();
+ glTranslatef(screenx,screeny,0.0f);
+ scale = w/50.0f;
+ glScalef(scale,scale,0.0f);
+ for (k=0;k<12;k++)
+ {
+ a = ((float) (random() % 3600)) / 10.0f;
+ glRotatef(a,0.0f,0.0f,1.0f);
+ glBegin(GL_QUAD_STRIP);
+ glColor4fv(black);
+ glVertex2f(-3.0f,0.0f);
+ a = 2.0f + (float) (random() & 255) * c;
+ glVertex2f(-3.0f,a);
+ glColor4fv(s->color);
+ glVertex2f(0.0f,0.0f);
+ glColor4fv(black);
+ glVertex2f(0.0f,a);
+ glVertex2f(3.0f,0.0f);
+ glVertex2f(3.0f,a);
+ glEnd();
+ }
+ glPopMatrix();
+}
+
+#define BIGMYSTERY 1800.0
+#define MAXANGLES 16384
+
+void UpdateSparkColour(global_info_t *global, flurry_info_t *flurry, Spark *s)
+{
+ const float rotationsPerSecond = (float) (2.0*PI*fieldSpeed/MAXANGLES);
+ double thisPointInRadians;
+ double thisAngle = flurry->fTime*rotationsPerSecond;
+ float cf;
+ float cycleTime = 20.0f;
+ float colorRot;
+ float redPhaseShift;
+ float greenPhaseShift;
+ float bluePhaseShift;
+ float baseRed;
+ float baseGreen;
+ float baseBlue;
+ float colorTime;
+
+ if (flurry->currentColorMode == rainbowColorMode)
+ {
+ cycleTime = 1.5f;
+ }
+ else if (flurry->currentColorMode == tiedyeColorMode)
+ {
+ cycleTime = 4.5f;
+ }
+ else if (flurry->currentColorMode == cyclicColorMode)
+ {
+ cycleTime = 20.0f;
+ }
+ else if (flurry->currentColorMode == slowCyclicColorMode)
+ {
+ cycleTime = 120.0f;
+ }
+ colorRot = (float) (2.0*PI/cycleTime);
+ redPhaseShift = 0.0f; /* cycleTime * 0.0f / 3.0f */
+ greenPhaseShift = cycleTime / 3.0f;
+ bluePhaseShift = cycleTime * 2.0f / 3.0f ;
+ colorTime = flurry->fTime;
+ if (flurry->currentColorMode == whiteColorMode)
+ {
+ baseRed = 0.1875f;
+ baseGreen = 0.1875f;
+ baseBlue = 0.1875f;
+ }
+ else if (flurry->currentColorMode == multiColorMode)
+ {
+ baseRed = 0.0625f;
+ baseGreen = 0.0625f;
+ baseBlue = 0.0625f;
+ }
+ else if (flurry->currentColorMode == darkColorMode)
+ {
+ baseRed = 0.0f;
+ baseGreen = 0.0f;
+ baseBlue = 0.0f;
+ }
+ else
+ {
+ if (flurry->currentColorMode < slowCyclicColorMode)
+ {
+ colorTime = (flurry->currentColorMode / 6.0f) * cycleTime;
+ }
+ else
+ {
+ colorTime = flurry->fTime + flurry->flurryRandomSeed;
+ }
+ baseRed = 0.109375f * ((float) cos((colorTime+redPhaseShift)*colorRot)+1.0f);
+ baseGreen = 0.109375f * ((float) cos((colorTime+greenPhaseShift)*colorRot)+1.0f);
+ baseBlue = 0.109375f * ((float) cos((colorTime+bluePhaseShift)*colorRot)+1.0f);
+ }
+
+ cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
+ cf /= 6.0f;
+ cf += 2.0f;
+ thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
+
+ s->color[0] = baseRed + 0.0625f * (0.5f + (float) cos((15.0 * (thisPointInRadians + 3.0*thisAngle))) + (float) sin((7.0 * (thisPointInRadians + thisAngle))));
+ s->color[1] = baseGreen + 0.0625f * (0.5f + (float) sin(((thisPointInRadians) + thisAngle)));
+ s->color[2] = baseBlue + 0.0625f * (0.5f + (float) cos((37.0 * (thisPointInRadians + thisAngle))));
+}
+
+void UpdateSpark(global_info_t *global, flurry_info_t *flurry, Spark *s)
+{
+ const float rotationsPerSecond = (float) (2.0*PI*fieldSpeed/MAXANGLES);
+ double thisPointInRadians;
+ double thisAngle = flurry->fTime*rotationsPerSecond;
+ float cf;
+ int i;
+ double tmpX1,tmpY1,tmpZ1;
+ double tmpX2,tmpY2,tmpZ2;
+ double tmpX3,tmpY3,tmpZ3;
+ double tmpX4,tmpY4,tmpZ4;
+ double rotation;
+ double cr;
+ double sr;
+ float cycleTime = 20.0f;
+ float colorRot;
+ float redPhaseShift;
+ float greenPhaseShift;
+ float bluePhaseShift;
+ float baseRed;
+ float baseGreen;
+ float baseBlue;
+ float colorTime;
+
+ float old[3];
+
+ if (flurry->currentColorMode == rainbowColorMode) {
+ cycleTime = 1.5f;
+ } else if (flurry->currentColorMode == tiedyeColorMode) {
+ cycleTime = 4.5f;
+ } else if (flurry->currentColorMode == cyclicColorMode) {
+ cycleTime = 20.0f;
+ } else if (flurry->currentColorMode == slowCyclicColorMode) {
+ cycleTime = 120.0f;
+ }
+ colorRot = (float) (2.0*PI/cycleTime);
+ redPhaseShift = 0.0f; /* cycleTime * 0.0f / 3.0f */
+ greenPhaseShift = cycleTime / 3.0f;
+ bluePhaseShift = cycleTime * 2.0f / 3.0f ;
+ colorTime = flurry->fTime;
+ if (flurry->currentColorMode == whiteColorMode) {
+ baseRed = 0.1875f;
+ baseGreen = 0.1875f;
+ baseBlue = 0.1875f;
+ } else if (flurry->currentColorMode == multiColorMode) {
+ baseRed = 0.0625f;
+ baseGreen = 0.0625f;
+ baseBlue = 0.0625f;
+ } else if (flurry->currentColorMode == darkColorMode) {
+ baseRed = 0.0f;
+ baseGreen = 0.0f;
+ baseBlue = 0.0f;
+ } else {
+ if(flurry->currentColorMode < slowCyclicColorMode) {
+ colorTime = (flurry->currentColorMode / 6.0f) * cycleTime;
+ } else {
+ colorTime = flurry->fTime + flurry->flurryRandomSeed;
+ }
+ baseRed = 0.109375f * ((float) cos((colorTime+redPhaseShift)*colorRot)+1.0f);
+ baseGreen = 0.109375f * ((float) cos((colorTime+greenPhaseShift)*colorRot)+1.0f);
+ baseBlue = 0.109375f * ((float) cos((colorTime+bluePhaseShift)*colorRot)+1.0f);
+ }
+
+ for (i=0;i<3;i++) {
+ old[i] = s->position[i];
+ }
+
+ cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
+ cf /= 6.0f;
+ cf += 2.0f;
+ thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
+
+ s->color[0] = baseRed + 0.0625f * (0.5f + (float) cos((15.0 * (thisPointInRadians + 3.0*thisAngle))) + (float) sin((7.0 * (thisPointInRadians + thisAngle))));
+ s->color[1] = baseGreen + 0.0625f * (0.5f + (float) sin(((thisPointInRadians) + thisAngle)));
+ s->color[2] = baseBlue + 0.0625f * (0.5f + (float) cos((37.0 * (thisPointInRadians + thisAngle))));
+ s->position[0] = fieldRange * cf * (float) cos(11.0 * (thisPointInRadians + (3.0*thisAngle)));
+ s->position[1] = fieldRange * cf * (float) sin(12.0 * (thisPointInRadians + (4.0*thisAngle)));
+ s->position[2] = fieldRange * (float) cos((23.0 * (thisPointInRadians + (12.0*thisAngle))));
+
+ rotation = thisAngle*0.501 + 5.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX1 = s->position[0] * cr - s->position[1] * sr;
+ tmpY1 = s->position[1] * cr + s->position[0] * sr;
+ tmpZ1 = s->position[2];
+
+ tmpX2 = tmpX1 * cr - tmpZ1 * sr;
+ tmpY2 = tmpY1;
+ tmpZ2 = tmpZ1 * cr + tmpX1 * sr;
+
+ tmpX3 = tmpX2;
+ tmpY3 = tmpY2 * cr - tmpZ2 * sr;
+ tmpZ3 = tmpZ2 * cr + tmpY2 * sr + seraphDistance;
+
+ rotation = thisAngle*2.501 + 85.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX4 = tmpX3 * cr - tmpY3 * sr;
+ tmpY4 = tmpY3 * cr + tmpX3 * sr;
+ tmpZ4 = tmpZ3;
+
+ s->position[0] = (float) tmpX4 + RandBell(5.0f*fieldCoherence);
+ s->position[1] = (float) tmpY4 + RandBell(5.0f*fieldCoherence);
+ s->position[2] = (float) tmpZ4 + RandBell(5.0f*fieldCoherence);
+
+ for (i=0;i<3;i++) {
+ s->delta[i] = (s->position[i] - old[i])/flurry->fDeltaTime;
+ }
+}
diff --git a/hacks/glx/flurry-star.c b/hacks/glx/flurry-star.c
new file mode 100644
index 0000000..8d9cc41
--- /dev/null
+++ b/hacks/glx/flurry-star.c
@@ -0,0 +1,106 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+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 author 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.
+
+*/
+
+/* Star.c: implementation of the Star class. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+/* Construction/Destruction */
+
+void InitStar(Star *s)
+{
+ int i;
+ for (i=0;i<3;i++) {
+ s->position[i] = RandFlt(-10000.0, 10000.0);
+ }
+ s->rotSpeed = RandFlt(0.4, 0.9);
+ s->mystery = RandFlt(0.0, 10.0);
+}
+
+#define BIGMYSTERY 1800.0
+#define MAXANGLES 16384
+
+void UpdateStar(global_info_t *global, flurry_info_t *flurry, Star *s)
+{
+ float rotationsPerSecond = (float) (2.0*PI*12.0/MAXANGLES) * s->rotSpeed /* speed control */;
+ double thisPointInRadians;
+ double thisAngle = flurry->fTime*rotationsPerSecond;
+ float cf;
+ double tmpX1,tmpY1,tmpZ1;
+ double tmpX2,tmpY2,tmpZ2;
+ double tmpX3,tmpY3,tmpZ3;
+ double tmpX4,tmpY4,tmpZ4;
+ double rotation;
+ double cr;
+ double sr;
+
+ s->ate = 0;
+
+ cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
+ cf /= 6.0f;
+ cf += 0.75f;
+ thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
+
+ s->position[0] = 250.0f * cf * (float) cos(11.0 * (thisPointInRadians + (3.0*thisAngle)));
+ s->position[1] = 250.0f * cf * (float) sin(12.0 * (thisPointInRadians + (4.0*thisAngle)));
+ s->position[2] = 250.0f * (float) cos((23.0 * (thisPointInRadians + (12.0*thisAngle))));
+
+ rotation = thisAngle*0.501 + 5.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX1 = s->position[0] * cr - s->position[1] * sr;
+ tmpY1 = s->position[1] * cr + s->position[0] * sr;
+ tmpZ1 = s->position[2];
+
+ tmpX2 = tmpX1 * cr - tmpZ1 * sr;
+ tmpY2 = tmpY1;
+ tmpZ2 = tmpZ1 * cr + tmpX1 * sr;
+
+ tmpX3 = tmpX2;
+ tmpY3 = tmpY2 * cr - tmpZ2 * sr;
+ tmpZ3 = tmpZ2 * cr + tmpY2 * sr + seraphDistance;
+
+ rotation = thisAngle*2.501 + 85.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX4 = tmpX3 * cr - tmpY3 * sr;
+ tmpY4 = tmpY3 * cr + tmpX3 * sr;
+ tmpZ4 = tmpZ3;
+
+ s->position[0] = (float) tmpX4;
+ s->position[1] = (float) tmpY4;
+ s->position[2] = (float) tmpZ4;
+}
diff --git a/hacks/glx/flurry-texture.c b/hacks/glx/flurry-texture.c
new file mode 100644
index 0000000..c787f59
--- /dev/null
+++ b/hacks/glx/flurry-texture.c
@@ -0,0 +1,224 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+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 author 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.
+
+*/
+
+/*
+ * Texture.c
+ * AppleFlurry
+ *
+ * Created by calumr on Sat Jul 07 2001.
+ * Copyright (c) 2001 __CompanyName__. All rights reserved.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include <stdlib.h>
+#include <math.h>
+
+static GLubyte smallTextureArray[32][32];
+static GLubyte bigTextureArray[256][256][2];
+GLuint theTexture = 0;
+
+/* simple smoothing routine */
+static void SmoothTexture(void)
+{
+ GLubyte filter[32][32];
+ int i,j;
+ float t;
+ for (i=1;i<31;i++)
+ {
+ for (j=1;j<31;j++)
+ {
+ t = (float) smallTextureArray[i][j]*4;
+ t += (float) smallTextureArray[i-1][j];
+ t += (float) smallTextureArray[i+1][j];
+ t += (float) smallTextureArray[i][j-1];
+ t += (float) smallTextureArray[i][j+1];
+ t /= 8.0f;
+ filter[i][j] = (GLubyte) t;
+ }
+ }
+ for (i=1;i<31;i++)
+ {
+ for (j=1;j<31;j++)
+ {
+ smallTextureArray[i][j] = filter[i][j];
+ }
+ }
+}
+
+/* add some randomness to texture data */
+static void SpeckleTexture(void)
+{
+ int i,j;
+ int speck;
+ float t;
+ for (i=2;i<30;i++)
+ {
+ for (j=2;j<30;j++)
+ {
+ speck = 1;
+ while (speck <= 32 && random() % 2)
+ {
+ t = (float) MIN_(255,smallTextureArray[i][j]+speck);
+ smallTextureArray[i][j] = (GLubyte) t;
+ speck+=speck;
+ }
+ speck = 1;
+ while (speck <= 32 && random() % 2)
+ {
+ t = (float) MAX_(0,smallTextureArray[i][j]-speck);
+ smallTextureArray[i][j] = (GLubyte) t;
+ speck+=speck;
+ }
+ }
+ }
+}
+
+static void MakeSmallTexture(void)
+{
+ static int firstTime = 1;
+ int i,j;
+ float r,t;
+ if (firstTime)
+ {
+ firstTime = 0;
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ r = (float) sqrt((i-15.5)*(i-15.5)+(j-15.5)*(j-15.5));
+ if (r > 15.0f)
+ {
+ smallTextureArray[i][j] = 0;
+ }
+ else
+ {
+ t = 255.0f * (float) cos(r*M_PI/31.0);
+ smallTextureArray[i][j] = (GLubyte) t;
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ r = (float) sqrt((i-15.5)*(i-15.5)+(j-15.5)*(j-15.5));
+ if (r > 15.0f)
+ {
+ t = 0.0f;
+ }
+ else
+ {
+ t = 255.0f * (float) cos(r*M_PI/31.0);
+ }
+ smallTextureArray[i][j] = (GLubyte) MIN_(255,(t+smallTextureArray[i][j]+smallTextureArray[i][j])/3);
+ }
+ }
+ }
+ SpeckleTexture();
+ SmoothTexture();
+ SmoothTexture();
+}
+
+static void CopySmallTextureToBigTexture(int k, int l)
+{
+ int i,j;
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ bigTextureArray[i+k][j+l][0] = smallTextureArray[i][j];
+ bigTextureArray[i+k][j+l][1] = smallTextureArray[i][j];
+ }
+ }
+}
+
+static void AverageLastAndFirstTextures(void)
+{
+ int i,j;
+ int t;
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ t = (smallTextureArray[i][j] + bigTextureArray[i][j][0]) / 2;
+ smallTextureArray[i][j] = (GLubyte) MIN_(255,t);
+ }
+ }
+}
+
+void MakeTexture()
+{
+ int i,j;
+ for (i=0;i<8;i++)
+ {
+ for (j=0;j<8;j++)
+ {
+ if (i==7 && j==7)
+ {
+ AverageLastAndFirstTextures();
+ }
+ else
+ {
+ MakeSmallTexture();
+ }
+ CopySmallTextureToBigTexture(i*32,j*32);
+ }
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+
+ glGenTextures(1, &theTexture);
+ glBindTexture(GL_TEXTURE_2D, theTexture);
+
+ /* Set the tiling mode (this is generally always GL_REPEAT). */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ /* Set the filtering. */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 2, 256, 256, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, bigTextureArray);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
diff --git a/hacks/glx/flurry.c b/hacks/glx/flurry.c
new file mode 100644
index 0000000..c9008a9
--- /dev/null
+++ b/hacks/glx/flurry.c
@@ -0,0 +1,549 @@
+/* -*- Mode: C; tab-width: 4 c-basic-offset: 4 indent-tabs-mode: t -*- */
+/*
+ * vim: ts=8 sw=4 noet
+ */
+
+/*
+
+Copyright (c) 2002, Calum Robinson
+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 author 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.
+
+*/
+
+/* flurry */
+
+#if 0
+static const char sccsid[] = "@(#)flurry.c 4.07 97/11/24 xlockmore";
+#endif
+
+#define DEF_PRESET "random"
+#define DEF_BRIGHTNESS "8"
+
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n"
+
+# define release_flurry 0
+# define flurry_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+
+#ifdef USE_GL
+
+static char *preset_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-preset", ".preset", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] = {
+ {&preset_str, "preset", "Preset", DEF_PRESET, t_String},
+};
+
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+ENTRYPOINT ModeSpecOpt flurry_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct flurry_description = {
+ "flurry",
+ "init_flurry",
+ "draw_flurry",
+ NULL,
+ "draw_flurry",
+ "init_flurry",
+ "free_flurry",
+ &flurry_opts,
+ 1000, 1, 2, 1, 4, 1.0,
+ "",
+ "Flurry",
+ 0,
+ NULL
+};
+
+#endif
+
+#include "flurry.h"
+
+global_info_t *flurry_info = NULL;
+
+static
+double currentTime(void) {
+ struct timeval tv;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&tv, &tzp);
+# else
+ gettimeofday(&tv);
+# endif
+
+ return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0;
+}
+
+double TimeInSecondsSinceStart (const global_info_t *global) {
+ return currentTime() - global->gTimeCounter;
+}
+
+#if 0
+#ifdef __ppc__
+static int IsAltiVecAvailable(void)
+{
+ return 0;
+}
+#endif
+#endif
+
+
+static
+void delete_flurry_info(flurry_info_t *flurry)
+{
+ int i;
+
+ free(flurry->s);
+ free(flurry->star);
+ for (i=0;i<MAX_SPARKS;i++)
+ {
+ free(flurry->spark[i]);
+ }
+ /* free(flurry); */
+}
+
+static
+flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes colour, float thickness, float speed, double bf)
+{
+ int i,k;
+ flurry_info_t *flurry = (flurry_info_t *)malloc(sizeof(flurry_info_t));
+
+ if (!flurry) return NULL;
+
+ flurry->flurryRandomSeed = RandFlt(0.0, 300.0);
+
+ flurry->fOldTime = 0;
+ flurry->dframe = 0;
+ flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
+ flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
+
+ flurry->numStreams = streams;
+ flurry->streamExpansion = thickness;
+ flurry->currentColorMode = colour;
+ flurry->briteFactor = bf;
+
+ flurry->s = malloc(sizeof(SmokeV));
+ InitSmoke(flurry->s);
+
+ flurry->star = malloc(sizeof(Star));
+ InitStar(flurry->star);
+ flurry->star->rotSpeed = speed;
+
+ for (i = 0;i < MAX_SPARKS; i++)
+ {
+ flurry->spark[i] = malloc(sizeof(Spark));
+ InitSpark(flurry->spark[i]);
+ flurry->spark[i]->mystery = 1800 * (i + 1) / 13; /* 100 * (i + 1) / (flurry->numStreams + 1); */
+ UpdateSpark(global, flurry, flurry->spark[i]);
+ }
+
+ for (i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ for(k=0;k<4;k++) {
+ flurry->s->p[i].dead.i[k] = 1;
+ }
+ }
+
+ flurry->next = NULL;
+
+ return flurry;
+}
+
+static
+void GLSetupRC(global_info_t *global)
+{
+ /* setup the defaults for OpenGL */
+ glDisable(GL_DEPTH_TEST);
+ glAlphaFunc(GL_GREATER,0.0f);
+ glEnable(GL_ALPHA_TEST);
+ glShadeModel(GL_FLAT);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_BLEND);
+
+ glViewport(0,0,(int) global->sys_glWidth,(int) global->sys_glHeight);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0,global->sys_glWidth,0,global->sys_glHeight,-1,1);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glEnableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+#if 0
+#ifdef __ppc__
+ global->optMode = OPT_MODE_SCALAR_FRSQRTE;
+
+#ifdef __VEC__
+ if (IsAltiVecAvailable()) global->optMode = OPT_MODE_VECTOR_UNROLLED;
+#endif
+
+#else
+ global->optMode = OPT_MODE_SCALAR_BASE;
+#endif
+#endif /* 0 */
+}
+
+static
+void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
+{
+ int i;
+
+ flurry->dframe++;
+
+ flurry->fOldTime = flurry->fTime;
+ flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
+ flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
+
+ flurry->drag = (float) pow(0.9965,flurry->fDeltaTime*85.0);
+
+ UpdateStar(global, flurry, flurry->star);
+
+#ifdef DRAW_SPARKS
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+#endif
+
+ for (i=0;i<flurry->numStreams;i++) {
+ flurry->spark[i]->color[0]=1.0;
+ flurry->spark[i]->color[1]=1.0;
+ flurry->spark[i]->color[2]=1.0;
+ flurry->spark[i]->color[2]=1.0;
+ UpdateSpark(global, flurry, flurry->spark[i]);
+#ifdef DRAW_SPARKS
+ DrawSpark(global, flurry, flurry->spark[i]);
+#endif
+ }
+
+ switch(global->optMode) {
+ case OPT_MODE_SCALAR_BASE:
+ UpdateSmoke_ScalarBase(global, flurry, flurry->s);
+ break;
+#if 0
+#ifdef __ppc__
+ case OPT_MODE_SCALAR_FRSQRTE:
+ UpdateSmoke_ScalarFrsqrte(global, flurry, flurry->s);
+ break;
+#endif
+#ifdef __VEC__
+ case OPT_MODE_VECTOR_SIMPLE:
+ UpdateSmoke_VectorBase(global, flurry, flurry->s);
+ break;
+ case OPT_MODE_VECTOR_UNROLLED:
+ UpdateSmoke_VectorUnrolled(global, flurry, flurry->s);
+ break;
+#endif
+#endif /* 0 */
+
+ default:
+ break;
+ }
+
+ /* glDisable(GL_BLEND); */
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glEnable(GL_TEXTURE_2D);
+
+ switch(global->optMode) {
+ case OPT_MODE_SCALAR_BASE:
+#if 0
+#ifdef __ppc__
+ case OPT_MODE_SCALAR_FRSQRTE:
+#endif
+#endif /* 0 */
+ DrawSmoke_Scalar(global, flurry, flurry->s, b);
+ break;
+#if 0
+#ifdef __VEC__
+ case OPT_MODE_VECTOR_SIMPLE:
+ case OPT_MODE_VECTOR_UNROLLED:
+ DrawSmoke_Vector(global, flurry, flurry->s, b);
+ break;
+#endif
+#endif /* 0 */
+ default:
+ break;
+ }
+
+ glDisable(GL_TEXTURE_2D);
+}
+
+static
+void GLResize(global_info_t *global, float w, float h)
+{
+ global->sys_glWidth = w;
+ global->sys_glHeight = h;
+}
+
+/* new window size or exposure */
+ENTRYPOINT void reshape_flurry(ModeInfo *mi, int width, int height)
+{
+ global_info_t *global = flurry_info + MI_SCREEN(mi);
+
+ glXMakeCurrent(MI_DISPLAY(mi), global->window, *(global->glx_context));
+
+ glViewport(0.0, 0.0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0, width, 0, height,-1,1);
+ glMatrixMode(GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glFlush();
+ GLResize(global, (float)width, (float)height);
+}
+
+ENTRYPOINT void
+init_flurry(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ int i;
+ global_info_t *global;
+ enum {
+ PRESET_INSANE = -1,
+ PRESET_WATER = 0,
+ PRESET_FIRE,
+ PRESET_PSYCHEDELIC,
+ PRESET_RGB,
+ PRESET_BINARY,
+ PRESET_CLASSIC,
+ PRESET_MAX
+ } preset_num;
+
+ MI_INIT (mi, flurry_info);
+
+ global = &flurry_info[screen];
+
+ global->gTimeCounter = currentTime();
+
+ global->window = MI_WINDOW(mi);
+
+ global->flurry = NULL;
+
+ if (!preset_str || !*preset_str) preset_str = DEF_PRESET;
+ if (!strcmp(preset_str, "random")) {
+ preset_num = random() % PRESET_MAX;
+ } else if (!strcmp(preset_str, "water")) {
+ preset_num = PRESET_WATER;
+ } else if (!strcmp(preset_str, "fire")) {
+ preset_num = PRESET_FIRE;
+ } else if (!strcmp(preset_str, "psychedelic")) {
+ preset_num = PRESET_PSYCHEDELIC;
+ } else if (!strcmp(preset_str, "rgb")) {
+ preset_num = PRESET_RGB;
+ } else if (!strcmp(preset_str, "binary")) {
+ preset_num = PRESET_BINARY;
+ } else if (!strcmp(preset_str, "classic")) {
+ preset_num = PRESET_CLASSIC;
+ } else if (!strcmp(preset_str, "insane")) {
+ preset_num = PRESET_INSANE;
+ } else {
+ fprintf(stderr, "%s: unknown preset %s\n", progname, preset_str);
+ exit(1);
+ }
+
+ switch (preset_num) {
+ case PRESET_WATER: {
+ for (i = 0; i < 9; i++) {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 1, blueColorMode, 100.0, 2.0, 2.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ }
+ break;
+ }
+ case PRESET_FIRE: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 12, slowCyclicColorMode, 10000.0, 0.2, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_PSYCHEDELIC: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 10, rainbowColorMode, 200.0, 2.0, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_RGB: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 3, redColorMode, 100.0, 0.8, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ flurry = new_flurry_info(global, 3, greenColorMode, 100.0, 0.8, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ flurry = new_flurry_info(global, 3, blueColorMode, 100.0, 0.8, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_BINARY: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 16, tiedyeColorMode, 1000.0, 0.5, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ flurry = new_flurry_info(global, 16, tiedyeColorMode, 1000.0, 1.5, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_CLASSIC: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 5, tiedyeColorMode, 10000.0, 1.0, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_INSANE: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 64, tiedyeColorMode, 1000.0, 0.5, 0.5);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ break;
+ }
+ default: {
+ fprintf(stderr, "%s: unknown preset %s\n", progname, preset_str);
+ exit(1);
+ }
+ }
+
+ if ((global->glx_context = init_GL(mi)) != NULL) {
+ reshape_flurry(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ GLSetupRC(global);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ global->first = 1;
+ global->oldFrameTime = -1;
+}
+
+ENTRYPOINT void
+draw_flurry(ModeInfo * mi)
+{
+ double newFrameTime;
+ double deltaFrameTime = 0;
+ double brite;
+ GLfloat alpha;
+
+ global_info_t *global = flurry_info + MI_SCREEN(mi);
+ flurry_info_t *flurry;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ newFrameTime = currentTime();
+ if (global->oldFrameTime == -1) {
+ /* special case the first frame -- clear to black */
+ alpha = 1.0;
+ } else {
+ /*
+ * this clamps the speed at below 60fps and, here
+ * at least, produces a reasonably accurate 50fps.
+ * (probably part CPU speed and part scheduler).
+ *
+ * Flurry is designed to run at this speed; much higher
+ * than that and the blending causes the display to
+ * saturate, which looks really ugly.
+ */
+ if (newFrameTime - global->oldFrameTime < 1/60.0) {
+ usleep(MAX_(1,(int)(20000 * (newFrameTime - global->oldFrameTime))));
+ return;
+
+ }
+ deltaFrameTime = newFrameTime - global->oldFrameTime;
+ alpha = 5.0 * deltaFrameTime;
+ }
+ global->oldFrameTime = newFrameTime;
+
+ if (alpha > 0.2) alpha = 0.2;
+
+ if (!global->glx_context)
+ return;
+
+ if (global->first) {
+ MakeTexture();
+ global->first = 0;
+ }
+ glDrawBuffer(GL_BACK);
+ glXMakeCurrent(display, window, *(global->glx_context));
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glColor4f(0.0, 0.0, 0.0, alpha);
+ glRectd(0, 0, global->sys_glWidth, global->sys_glHeight);
+
+ brite = pow(deltaFrameTime,0.75) * 10;
+ for (flurry = global->flurry; flurry; flurry=flurry->next) {
+ GLRenderScene(global, flurry, brite * flurry->briteFactor);
+ }
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+ENTRYPOINT void
+free_flurry(ModeInfo * mi)
+{
+ global_info_t *global = &flurry_info[MI_SCREEN(mi)];
+ flurry_info_t *flurry;
+
+ if (global->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), global->window, *(global->glx_context));
+ }
+
+ for (flurry = global->flurry; flurry; flurry=flurry->next) {
+ delete_flurry_info(flurry);
+ }
+}
+
+XSCREENSAVER_MODULE ("Flurry", flurry)
+
+#endif
diff --git a/hacks/glx/flurry.h b/hacks/glx/flurry.h
new file mode 100644
index 0000000..9bbe4b2
--- /dev/null
+++ b/hacks/glx/flurry.h
@@ -0,0 +1,299 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+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 author 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.
+
+*/
+
+/* -*- Mode: C; tab-width: 4 c-basic-offset: 4 indent-tabs-mode: t -*- */
+/* flurry */
+#ifndef __GLCODE__
+#define __GLCODE__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# include <GL/glu.h>
+# include <GL/glx.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "yarandom.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+typedef struct _global_info_t global_info_t;
+typedef struct _flurry_info_t flurry_info_t;
+
+#define sqr(X) ((X) * (X))
+#define PI 3.14159265358979323846f
+#define DEG2RAD(X) (PI*(X)/180.0)
+#define RAD2DEG(X) ((X)*180.0/PI)
+#define rnd() (frand(1.0))
+
+/* fabs: Absolute function. */
+/* #undef abs */
+/* #define abs(a) ( (a) > 0 ? (a) : -(a) ) */
+
+/* Force sign clamping to (-1;0;1) */
+#define sgn(a) ((a)<0?-1:((a)?1:0))
+
+/* used to compute the min and max of two expresions */
+#define MIN_(a, b) (((a) < (b)) ? (a) : (b))
+#define MAX_(a, b) (((a) > (b)) ? (a) : (b))
+
+typedef union {
+ float f[4];
+#if 0
+#if __VEC__
+ vector float v;
+#endif
+#endif /* 0 */
+} floatToVector;
+
+typedef union {
+ unsigned int i[4];
+#if 0
+#if __VEC__
+ vector unsigned int v;
+#endif
+#endif /* 0 */
+} intToVector;
+
+typedef struct SmokeParticleV
+{
+ floatToVector color[4];
+ floatToVector position[3];
+ floatToVector oldposition[3];
+ floatToVector delta[3];
+ intToVector dead;
+ floatToVector time;
+ intToVector animFrame;
+} SmokeParticleV;
+
+#define NUMSMOKEPARTICLES 3600
+
+typedef struct SmokeV
+{
+ SmokeParticleV p[NUMSMOKEPARTICLES/4];
+ int nextParticle;
+ int nextSubParticle;
+ float lastParticleTime;
+ int firstTime;
+ long frame;
+ float old[3];
+ floatToVector seraphimVertices[NUMSMOKEPARTICLES*2+1];
+ floatToVector seraphimColors[NUMSMOKEPARTICLES*4+1];
+ float seraphimTextures[NUMSMOKEPARTICLES*2*4];
+} SmokeV;
+
+void InitSmoke(SmokeV *s);
+
+void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+#if 0
+#ifdef __ppc__
+void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+#endif
+#ifdef __VEC__
+void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+void UpdateSmoke_VectorUnrolled(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+#endif
+#endif /* 0 */
+
+void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float);
+void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float);
+
+typedef struct Star
+{
+ float position[3];
+ float mystery;
+ float rotSpeed;
+ int ate;
+} Star;
+
+void UpdateStar(global_info_t *global, flurry_info_t *flurry, Star *s);
+void InitStar(Star *s);
+
+typedef struct Spark
+{
+ float position[3];
+ int mystery;
+ float delta[3];
+ float color[4];
+} Spark;
+
+void UpdateSparkColour(global_info_t *info, flurry_info_t *flurry, Spark *s);
+void InitSpark(Spark *s);
+void UpdateSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
+void DrawSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
+
+/* #define FastDistance2D(x,y) hypot(x,y) */
+
+/* UInt8 sys_glBPP=32; */
+/* int SSMODE = FALSE; */
+/* int currentVideoMode = 0; */
+/* int cohesiveness = 7; */
+/* int fieldStrength; */
+/* int colorCoherence = 7; */
+/* int fieldIncoherence = 0; */
+/* int ifieldSpeed = 120; */
+
+static inline float FastDistance2D(float x, float y)
+{
+ /* this function computes the distance from 0,0 to x,y with ~3.5% error */
+ float mn;
+ /* first compute the absolute value of x,y */
+ x = (x < 0.0f) ? -x : x;
+ y = (y < 0.0f) ? -y : y;
+
+ /* compute the minimum of x,y */
+ mn = x<y?x:y;
+
+ /* return the distance */
+ return(x+y-(mn*0.5f)-(mn*0.25f)+(mn*0.0625f));
+}
+
+#if 0
+#ifdef __VEC__
+
+static vector float FastDistance2DV(vector float x, vector float y) {
+ vector float mn, temp;
+
+ x = vec_abs(x);
+ y = vec_abs(y);
+ mn = vec_min(x,y);
+ temp = vec_add(x,y);
+ temp = vec_madd(mn, (vector float)(-0.6875), temp);
+ return temp;
+}
+
+#endif
+#endif /* 0 */
+
+#define RandFlt(min, max) ((min) + frand((max) - (min)))
+
+#define RandBell(scale) ((scale) * (-(frand(.5) + frand(.5) + frand(.5))))
+
+extern GLuint theTexture;
+
+void MakeTexture(void);
+
+#define OPT_MODE_SCALAR_BASE 0x0
+
+#if 0
+#ifdef __ppc__
+#define OPT_MODE_SCALAR_FRSQRTE 0x1
+#endif
+
+#ifdef __VEC__
+#define OPT_MODE_VECTOR_SIMPLE 0x2
+#define OPT_MODE_VECTOR_UNROLLED 0x3
+#endif
+#endif /* 0 */
+
+typedef enum _ColorModes
+{
+ redColorMode = 0,
+ magentaColorMode,
+ blueColorMode,
+ cyanColorMode,
+ greenColorMode,
+ yellowColorMode,
+ slowCyclicColorMode,
+ cyclicColorMode,
+ tiedyeColorMode,
+ rainbowColorMode,
+ whiteColorMode,
+ multiColorMode,
+ darkColorMode
+} ColorModes;
+
+#define gravity 1500000.0f
+
+#define incohesion 0.07f
+#define colorIncoherence 0.15f
+#define streamSpeed 450.0
+#define fieldCoherence 0
+#define fieldSpeed 12.0f
+#define numParticles 250
+#define starSpeed 50
+#define seraphDistance 2000.0f
+#define streamSize 25000.0f
+#define fieldRange 1000.0f
+#define streamBias 7.0f
+
+#define MAX_SPARKS 64
+
+struct _flurry_info_t {
+ flurry_info_t *next;
+ ColorModes currentColorMode;
+ SmokeV *s;
+ Star *star;
+ Spark *spark[MAX_SPARKS];
+ float streamExpansion;
+ int numStreams;
+ double flurryRandomSeed;
+ double fTime;
+ double fOldTime;
+ double fDeltaTime;
+ double briteFactor;
+ float drag;
+ int dframe;
+};
+
+struct _global_info_t {
+ /* system values */
+ GLXContext *glx_context;
+ Window window;
+ int optMode;
+
+ float sys_glWidth;
+ float sys_glHeight;
+
+ double gTimeCounter;
+ int first;
+ double oldFrameTime;
+
+ flurry_info_t *flurry;
+};
+
+#define kNumSpectrumEntries 512
+
+double TimeInSecondsSinceStart(const global_info_t *global);
+
+#endif /* Include/Define */
diff --git a/hacks/glx/flurry.man b/hacks/glx/flurry.man
new file mode 100644
index 0000000..bec54d9
--- /dev/null
+++ b/hacks/glx/flurry.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flurry - a colorful particle system
+.SH SYNOPSIS
+.B flurry
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-preset <arg>]
+[\-fps]
+.SH DESCRIPTION
+This is a port of the OSX screensaver flurry.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-preset <arg>
+Select a preset (classic, fire, water, psychedelic, rgb, binary, random, insane)
+
+(Insane will never be selected at random, because it requires lots of CPU/GPU
+power)
+
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH AUTHORS
+OSX screensaver by Calum Robinson <calumr@mac.com>
+
+http://homepage.mac.com/calumr
+
+xscreensaver port by Tobias Sargeant <tobias.sargeant@bigpond.com>
+
+.SH POSTCARDS
+
+If you really like it, send me a postcard (after all, you're getting this for
+free!). Please check this address by downloading the latest version of Flurry
+just before you send me a postcard - I may have moved.
+
+.PD 0
+Calum Robinson
+.P
+133 Sydenham Avenue
+.P
+Belfast
+.P
+Northern Ireland
+.P
+BT4 2DQ
+.PD 0
+
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
diff --git a/hacks/glx/flyingtoasters.c b/hacks/glx/flyingtoasters.c
new file mode 100644
index 0000000..19a5897
--- /dev/null
+++ b/hacks/glx/flyingtoasters.c
@@ -0,0 +1,868 @@
+/* flyingtoasters, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws 3D flying toasters, and toast. Inspired by the ancient
+ * Berkeley Systems / After Dark hack, but now updated to the wide
+ * wonderful workd of OpenGL and 3D!
+ *
+ * Code by jwz; object models by Baconmonkey.
+ *
+ * The original After Dark flying toasters, with the fluffy white wings,
+ * were a trademark of Berkeley Systems. Berkeley Systems ceased to exist
+ * some time in 1998, having been gobbled up by Sierra Online, who were
+ * subsequently gobbled up by Flipside and/or Vivendi (it's hard to tell
+ * exactly what happened when.)
+ *
+ * I doubt anyone even cares any more, but if they do, hopefully this homage,
+ * with the space-age 3D jet-plane toasters, will be considered different
+ * enough that whoever still owns the trademark to the fluffy-winged 2D
+ * bitmapped toasters won't get all huffy at us.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+/* #define DEBUG */
+
+# define free_toasters 0
+# define release_toasters 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_SPEED "1.0"
+#define DEF_NTOASTERS "20"
+#define DEF_NSLICES "25"
+#define DEF_TEXTURE "True"
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#define HAVE_TEXTURE
+#ifdef HAVE_TEXTURE
+# include "images/gen/chromesphere_png.h"
+# include "images/gen/toast_png.h"
+#endif /* HAVE_TEXTURE */
+
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern const struct gllist
+ *toaster, *toaster_base, *toaster_handle, *toaster_handle2, *toaster_jet,
+ *toaster_knob, *toaster_slots, *toaster_wing, *toast, *toast2;
+
+static const struct gllist * const *all_objs[] = {
+ &toaster, &toaster_base, &toaster_handle, &toaster_handle2, &toaster_jet,
+ &toaster_knob, &toaster_slots, &toaster_wing, &toast, &toast2
+};
+
+#define BASE_TOASTER 0
+#define BASE 1
+#define HANDLE 2
+#define HANDLE_SLOT 3
+#define JET 4
+#define KNOB 5
+#define SLOTS 6
+#define JET_WING 7
+#define TOAST 8
+#define TOAST_BITTEN 9
+
+#define GRID_SIZE 60
+#define GRID_DEPTH 500
+
+
+static const struct { GLfloat x, y; } nice_views[] = {
+ { 0, 120 },
+ { 0, -120 },
+ { 12, 28 }, /* this is a list of viewer rotations that look nice. */
+ { 12, -28 }, /* every now and then we switch to a new one. */
+ {-10, -28 }, /* (but we only use the first two at start-up.) */
+ { 40, -60 },
+ {-40, -60 },
+ { 40, 60 },
+ {-40, 60 },
+ { 30, 0 },
+ {-30, 0 },
+};
+
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat dx, dy, dz;
+ Bool toaster_p;
+ int toast_type; /* 0, 1 */
+ GLfloat handle_pos; /* 0.0 - 1.0 */
+ GLfloat knob_pos; /* degrees */
+ int loaded; /* 2 bits */
+} floater;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *user_trackball;
+ Bool button_down_p;
+
+ int last_view, target_view;
+ GLfloat view_x, view_y;
+ int view_steps, view_tick;
+ Bool auto_tracking_p;
+ int track_tick;
+
+ GLuint *dlists;
+
+# ifdef HAVE_TEXTURE
+ GLuint chrome_texture;
+ GLuint toast_texture;
+# endif
+
+ int nfloaters;
+ floater *floaters;
+
+} toaster_configuration;
+
+static toaster_configuration *bps = NULL;
+
+static GLfloat speed;
+static int ntoasters;
+static int nslices;
+static int do_texture;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-ntoasters", ".ntoasters", XrmoptionSepArg, 0 },
+ { "-nslices", ".nslices", XrmoptionSepArg, 0 },
+ {"-texture", ".texture", XrmoptionNoArg, "True" },
+ {"+texture", ".texture", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&ntoasters, "ntoasters", "Count", DEF_NTOASTERS, t_Int},
+ {&nslices, "nslices", "Count", DEF_NSLICES, t_Int},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt toasters_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+reset_floater (ModeInfo *mi, floater *f)
+{
+/* toaster_configuration *bp = &bps[MI_SCREEN(mi)]; */
+
+ GLfloat n = GRID_SIZE/2.0;
+ GLfloat n2 = GRID_DEPTH/2.0;
+ GLfloat delta = GRID_SIZE * speed / 200.0;
+
+ f->dx = 0;
+ f->dy = 0;
+ f->dz = delta;
+
+ f->dz += BELLRAND(delta) - delta/3;
+
+ if (! (random() % 5)) {
+ f->dx += (BELLRAND(delta*2) - delta);
+ f->dy += (BELLRAND(delta*2) - delta);
+ }
+
+ if (! (random() % 40)) f->dz *= 10; /* occasional speedy one */
+
+ f->x = frand(n) - n/2;
+ f->y = frand(n) - n/2;
+ f->z = -n2 - frand(delta * 4);
+
+ if (f->toaster_p)
+ {
+ f->loaded = 0;
+ f->knob_pos = frand(180) - 90;
+ f->handle_pos = ((random() & 1) ? 0.0 : 1.0);
+
+ if (f->handle_pos > 0.8 && (! (random() % 5)))
+ f->loaded = (random() & 3); /* let's toast! */
+ }
+ else
+ {
+ if (! (random() % 10))
+ f->toast_type = 1; /* toast_bitten */
+ }
+}
+
+
+static void
+tick_floater (ModeInfo *mi, floater *f)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ GLfloat n1 = GRID_DEPTH/2.0;
+ GLfloat n2 = GRID_SIZE*4;
+
+ if (bp->button_down_p) return;
+
+ f->x += f->dx;
+ f->y += f->dy;
+ f->z += f->dz;
+
+ if (! (random() % 50000)) /* sudden gust of gravity */
+ f->dy -= 2.8;
+
+ if (f->x < -n2 || f->x > n2 ||
+ f->y < -n2 || f->y > n2 ||
+ f->z > n1)
+ reset_floater (mi, f);
+}
+
+
+static void
+auto_track_init (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ bp->last_view = (random() % 2);
+ bp->target_view = bp->last_view + 2;
+ bp->view_x = nice_views[bp->last_view].x;
+ bp->view_y = nice_views[bp->last_view].y;
+ bp->view_steps = 100;
+ bp->view_tick = 0;
+ bp->auto_tracking_p = True;
+}
+
+
+static void
+auto_track (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->button_down_p)
+ return;
+
+ /* if we're not moving, maybe start moving. Otherwise, do nothing. */
+ if (! bp->auto_tracking_p)
+ {
+ if (++bp->track_tick < 200/speed) return;
+ bp->track_tick = 0;
+ if (! (random() % 5))
+ bp->auto_tracking_p = True;
+ else
+ return;
+ }
+
+
+ {
+ GLfloat ox = nice_views[bp->last_view].x;
+ GLfloat oy = nice_views[bp->last_view].y;
+ GLfloat tx = nice_views[bp->target_view].x;
+ GLfloat ty = nice_views[bp->target_view].y;
+
+ /* move from A to B with sinusoidal deltas, so that it doesn't jerk
+ to a stop. */
+ GLfloat th = sin ((M_PI / 2) * (double) bp->view_tick / bp->view_steps);
+
+ bp->view_x = (ox + ((tx - ox) * th));
+ bp->view_y = (oy + ((ty - oy) * th));
+ bp->view_tick++;
+
+ if (bp->view_tick >= bp->view_steps)
+ {
+ bp->view_tick = 0;
+ bp->view_steps = (350.0 / speed);
+ bp->last_view = bp->target_view;
+ bp->target_view = (random() % (countof(nice_views) - 2)) + 2;
+ bp->auto_tracking_p = False;
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_toasters (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (40.0, 1/h, 1.0, 250);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 2.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+toasters_handle_event (ModeInfo *mi, XEvent *event)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->user_trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+#ifdef HAVE_TEXTURE
+
+static void
+load_textures (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ XImage *xi;
+
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ chromesphere_png, sizeof(chromesphere_png));
+ clear_gl_error();
+
+#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
+ glGenTextures (1, &bp->chrome_texture);
+ glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ xi->width, xi->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
+ check_gl_error("texture");
+ XDestroyImage (xi);
+ xi = 0;
+#endif
+
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ toast_png, sizeof(toast_png));
+
+ glGenTextures (1, &bp->toast_texture);
+ glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ xi->width, xi->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
+ check_gl_error("texture");
+ XDestroyImage (xi);
+ xi = 0;
+}
+
+#endif /* HAVE_TEXTURE */
+
+
+
+ENTRYPOINT void
+init_toasters (ModeInfo *mi)
+{
+ toaster_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_toasters (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+# ifdef HAVE_TEXTURE
+ if (!wire && do_texture)
+ load_textures (mi);
+# endif
+
+ bp->user_trackball = gltrackball_init (False);
+ auto_track_init (mi);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 0, 0, 1);
+ glScalef (6, 6, 6);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+ glDisable (GL_TEXTURE_2D);
+
+ if (i == BASE_TOASTER)
+ {
+ GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+#ifdef HAVE_TEXTURE
+ if (do_texture)
+ {
+#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+#endif
+ }
+# endif
+ }
+ else if (i == TOAST || i == TOAST_BITTEN)
+ {
+ GLfloat color[4] = {0.80, 0.80, 0.00, 1.0};
+ GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0};
+ GLfloat shiny = 0.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+#ifdef HAVE_TEXTURE
+ if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ }
+# endif
+
+ glMatrixMode(GL_TEXTURE);
+ glTranslatef(0.5, 0.5, 0);
+ glMatrixMode(GL_MODELVIEW);
+ }
+ else if (i == SLOTS || i == HANDLE_SLOT)
+ {
+ GLfloat color[4] = {0.30, 0.30, 0.40, 1.0};
+ GLfloat spec[4] = {0.40, 0.40, 0.70, 1.0};
+ GLfloat shiny = 128.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == HANDLE)
+ {
+ GLfloat color[4] = {0.80, 0.10, 0.10, 1.0};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == KNOB)
+ {
+ GLfloat color[4] = {0.80, 0.10, 0.10, 1.0};
+ GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0};
+ GLfloat shiny = 0.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == JET || i == JET_WING)
+ {
+ GLfloat color[4] = {0.70, 0.70, 0.70, 1.0};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == BASE)
+ {
+ GLfloat color[4] = {0.50, 0.50, 0.50, 1.0};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else
+ {
+ GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 128.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+
+ renderList (gll, wire);
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glEndList ();
+ }
+
+ bp->nfloaters = ntoasters + nslices;
+ bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ /* arrange the list so that half the toasters are in front of bread,
+ and half are behind. */
+ f->toaster_p = ((i < ntoasters / 2) ||
+ (i >= (nslices + (ntoasters / 2))));
+ reset_floater (mi, f);
+
+ /* Position the first generation randomly, but make sure they aren't
+ on screen yet (until we rotate the view into position.)
+ */
+ {
+ GLfloat min = -GRID_DEPTH/2;
+ GLfloat max = GRID_DEPTH/3.5;
+ f->z = frand (max - min) + min;
+ }
+ }
+}
+
+
+static void
+draw_origin (ModeInfo *mi)
+{
+# ifdef DEBUG
+/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
+
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glScalef (5, 5, 5);
+ glBegin(GL_LINES);
+ glVertex3f(-1, 0, 0); glVertex3f(1, 0, 0);
+ glVertex3f(0, -1, 0); glVertex3f(0, 1, 0);
+ glVertex3f(0, 0, -1); glVertex3f(0, 0, 1);
+ glEnd();
+ glPopMatrix();
+
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
+# endif /* DEBUG */
+}
+
+
+static void
+draw_grid (ModeInfo *mi)
+{
+# ifdef DEBUG
+/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
+
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
+ glPushMatrix();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glEnd();
+ glPopMatrix();
+
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
+# endif /* DEBUG */
+}
+
+
+static void
+draw_floater (ModeInfo *mi, floater *f)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat n;
+
+ glFrontFace(GL_CCW);
+
+ glPushMatrix();
+ glTranslatef (f->x, f->y, f->z);
+ if (f->toaster_p)
+ {
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+
+ glCallList (bp->dlists[BASE_TOASTER]);
+ mi->polygon_count += (*all_objs[BASE_TOASTER])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(0, 1.01, 0);
+ n = 0.91; glScalef(n,n,n);
+ glCallList (bp->dlists[SLOTS]);
+ mi->polygon_count += (*all_objs[SLOTS])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+ glTranslatef(0, -0.4, -2.38);
+ n = 0.33; glScalef(n,n,n);
+ glCallList (bp->dlists[HANDLE_SLOT]);
+ mi->polygon_count += (*all_objs[HANDLE_SLOT])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(0, -1.1, 3);
+ n = 0.3; glScalef (n,n,n);
+ glTranslatef(0, f->handle_pos * 4.8, 0);
+ glCallList (bp->dlists[HANDLE]);
+ mi->polygon_count += (*all_objs[HANDLE])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+ glTranslatef(0, -1.1, -3); /* where the handle is */
+ glTranslatef (1, -0.4, 0); /* down and to the left */
+ n = 0.08; glScalef (n,n,n);
+ glRotatef (f->knob_pos, 0, 0, 1);
+ glCallList (bp->dlists[KNOB]);
+ mi->polygon_count += (*all_objs[KNOB])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+ glTranslatef (0, -2.3, 0);
+ glCallList (bp->dlists[BASE]);
+ mi->polygon_count += (*all_objs[BASE])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(-4.8, 0, 0);
+ glCallList (bp->dlists[JET_WING]);
+ mi->polygon_count += (*all_objs[JET_WING])->points / 3;
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (-2, -1, 0);
+ glCallList (bp->dlists[JET]);
+ mi->polygon_count += (*all_objs[JET])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(4.8, 0, 0);
+ glScalef(-1, 1, 1);
+ glFrontFace(GL_CW);
+ glCallList (bp->dlists[JET_WING]);
+ mi->polygon_count += (*all_objs[JET_WING])->points / 3;
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (-2, -1, 0);
+ glCallList (bp->dlists[JET]);
+ mi->polygon_count += (*all_objs[JET])->points / 3;
+ glFrontFace(GL_CCW);
+ glPopMatrix();
+
+ if (f->loaded)
+ {
+ glPushMatrix();
+ glTranslatef(0, 1.01, 0);
+ n = 0.91; glScalef(n,n,n);
+ glRotatef (90, 0, 0, 1);
+ glRotatef (90, 0, 1, 0);
+ glTranslatef(0, 0, -0.95);
+ glTranslatef(0, 0.72, 0);
+ if (f->loaded & 1)
+ {
+ glCallList (bp->dlists[TOAST]);
+ mi->polygon_count += (*all_objs[TOAST])->points / 3;
+ }
+ glTranslatef(0, -1.46, 0);
+ if (f->loaded & 2)
+ {
+ glCallList (bp->dlists[TOAST]);
+ mi->polygon_count += (*all_objs[TOAST])->points / 3;
+ }
+ glPopMatrix();
+ }
+ }
+ else
+ {
+ glScalef (0.7, 0.7, 0.7);
+ if (f->toast_type == 0)
+ {
+ glCallList (bp->dlists[TOAST]);
+ mi->polygon_count += (*all_objs[TOAST])->points / 3;
+ }
+ else
+ {
+ glCallList (bp->dlists[TOAST_BITTEN]);
+ mi->polygon_count += (*all_objs[TOAST_BITTEN])->points / 3;
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+
+ENTRYPOINT void
+draw_toasters (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ glRotatef(bp->view_x, 1, 0, 0);
+ glRotatef(bp->view_y, 0, 1, 0);
+
+ /* Rotate the scene around a point that's a little deeper in. */
+ glTranslatef (0, 0, -50);
+ gltrackball_rotate (bp->user_trackball);
+ glTranslatef (0, 0, 50);
+
+#if 0
+ {
+ floater F;
+ F.toaster_p = 0;
+ F.toast_type = 1;
+ F.handle_pos = 0;
+ F.knob_pos = -90;
+ F.loaded = 3;
+ F.x = F.y = F.z = 0;
+ F.dx = F.dy = F.dz = 0;
+
+ glScalef(2,2,2);
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
+ glBegin(GL_LINES);
+ glVertex3f(-10, 0, 0); glVertex3f(10, 0, 0);
+ glVertex3f(0, -10, 0); glVertex3f(0, 10, 0);
+ glVertex3f(0, 0, -10); glVertex3f(0, 0, 10);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
+
+ draw_floater (mi, &F);
+ glPopMatrix ();
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+ return;
+ }
+#endif
+
+ glScalef (0.5, 0.5, 0.5);
+ draw_origin (mi);
+ glTranslatef (0, 0, -GRID_DEPTH/2.5);
+ draw_grid (mi);
+
+ mi->polygon_count = 0;
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ draw_floater (mi, f);
+ tick_floater (mi, f);
+ }
+ auto_track (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("FlyingToasters", flyingtoasters, toasters)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/flyingtoasters.man b/hacks/glx/flyingtoasters.man
new file mode 100644
index 0000000..dbe5d5a
--- /dev/null
+++ b/hacks/glx/flyingtoasters.man
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flyingtoasters - 3d space-age jet-powered flying toasters (and toast)
+.SH SYNOPSIS
+.B flyingtoasters
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-ntoasters \fInumber\fP]
+[\-nslices \fInumber\fP]
+[\-no-texture]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a squadron of shiny 3D space-age jet-powered flying toasters, and
+associated toast, flying across your screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the toasters fly. Larger for faster. Default: 1.0.
+.TP 8
+.B \-ntoasters \fInumber\fP
+How many toasters to draw. Default 20.
+.TP 8
+.B \-nslices \fInumber\fP
+How many slices of toast to draw. Default 25.
+.TP 8
+.B \-no-texture
+Turn off texture mapping (for slow machines.)
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR After Dark
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+
+The original After Dark flying toasters, with the fluffy white wings,
+were a trademark of Berkeley Systems. Berkeley Systems ceased to exist
+some time in 1998, having been gobbled up by Sierra Online, who were
+subsequently gobbled up by Flipside and/or Vivendi (it's hard to tell
+exactly what happened when.)
+
+I doubt anyone even cares any more, but if they do, hopefully this
+homage, with the space-age 3D jet-plane toasters, will be considered
+different enough that whoever still owns the trademark to the
+fluffy-winged 2D bitmapped toasters won't get all huffy at us.
+.SH AUTHOR
+Code by Jamie Zawinski. Object models by Baconmonkey.
diff --git a/hacks/glx/fps-gl.c b/hacks/glx/fps-gl.c
new file mode 100644
index 0000000..eb6b6de
--- /dev/null
+++ b/hacks/glx/fps-gl.c
@@ -0,0 +1,98 @@
+/* fps, Copyright (c) 2001-2015 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real Xlib */
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "xlockmoreI.h"
+#include "fpsI.h"
+#include "texfont.h"
+
+/* These are in xlock-gl.c */
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+typedef struct {
+ texture_font_data *texfont;
+ int line_height;
+ Bool top_p;
+} gl_fps_data;
+
+
+static void
+xlockmore_gl_fps_init (fps_state *st)
+{
+ gl_fps_data *data = (gl_fps_data *) calloc (1, sizeof(*data));
+ int ascent, descent;
+ data->top_p = get_boolean_resource (st->dpy, "fpsTop", "FPSTop");
+ data->texfont = load_texture_font (st->dpy, "fpsFont");
+ texture_string_metrics (data->texfont, "M", 0, &ascent, &descent);
+ data->line_height = ascent + descent;
+ st->gl_fps_data = data;
+}
+
+
+/* Callback in xscreensaver_function_table, via xlockmore.c.
+ */
+void
+xlockmore_gl_compute_fps (Display *dpy, Window w, fps_state *fpst,
+ void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ if (! mi->fpst)
+ {
+ mi->fpst = fpst;
+ xlockmore_gl_fps_init (fpst);
+ }
+
+ fps_compute (fpst, mi->polygon_count, mi->recursion_depth);
+}
+
+
+/* Called directly from GL programs (as `do_fps') before swapping buffers.
+ */
+void
+xlockmore_gl_draw_fps (ModeInfo *mi)
+{
+ fps_state *st = mi->fpst;
+ if (st) /* might be too early */
+ {
+ gl_fps_data *data = (gl_fps_data *) st->gl_fps_data;
+ XWindowAttributes xgwa;
+ int lines = 1;
+ const char *s;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ for (s = st->string; *s; s++)
+ if (*s == '\n') lines++;
+
+ glColor3f (1, 1, 1);
+ print_texture_label (st->dpy, data->texfont,
+ xgwa.width, xgwa.height,
+ (data->top_p ? 1 : 2),
+ st->string);
+ }
+}
diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c
new file mode 100644
index 0000000..3976f2f
--- /dev/null
+++ b/hacks/glx/gears.c
@@ -0,0 +1,938 @@
+/* gears, Copyright (c) 2007-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Originally written by Brian Paul in 1996 or earlier;
+ * rewritten by jwz in Nov 2007.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 0 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_gears 0
+# define release_gears 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "involute.h"
+#include "normals.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool planetary_p;
+
+ int ngears;
+ gear **gears;
+
+ GLuint armature_dlist;
+ int armature_polygons;
+
+ struct { GLfloat x1, y1, x2, y2; } bbox;
+
+} gears_configuration;
+
+static gears_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_gears (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+free_gear (gear *g)
+{
+ if (g->dlist)
+ glDeleteLists (g->dlist, 1);
+ free (g);
+}
+
+
+/* Create and return a new gear sized for placement next to or on top of
+ the given parent gear (if any.) Returns 0 if out of memory.
+ [Mostly lifted from pinion.c]
+ */
+static gear *
+new_gear (ModeInfo *mi, gear *parent)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g = (gear *) calloc (1, sizeof (*g));
+ static unsigned long id = 0; /* only used in debugging output */
+
+ if (!g) return 0;
+ g->id = ++id;
+
+ /* Pick the size of the teeth.
+ */
+ if (parent) /* adjascent gears need matching teeth */
+ {
+ g->tooth_w = parent->tooth_w;
+ g->tooth_h = parent->tooth_h;
+ g->tooth_slope = -parent->tooth_slope;
+ }
+ else /* gears that begin trains get any size they want */
+ {
+ g->tooth_w = 0.007 * (1.0 + BELLRAND(4.0));
+ g->tooth_h = 0.005 * (1.0 + BELLRAND(8.0));
+/*
+ g->tooth_slope = ((random() % 8)
+ ? 0
+ : 0.5 + BELLRAND(1));
+ */
+ }
+
+ /* Pick the number of teeth, and thus, the radius.
+ */
+ {
+ double c;
+
+ if (!parent || bp->ngears > 4)
+ g->nteeth = 5 + BELLRAND (20);
+ else
+ g->nteeth = parent->nteeth * (0.5 + BELLRAND(2));
+
+ c = g->nteeth * g->tooth_w * 2; /* circumference = teeth + gaps */
+ g->r = c / (M_PI * 2); /* c = 2 pi r */
+ }
+
+ g->thickness = g->tooth_w + frand (g->r);
+ g->thickness2 = g->thickness * 0.7;
+ g->thickness3 = g->thickness;
+
+ /* Colorize
+ */
+ g->color[0] = 0.5 + frand(0.5);
+ g->color[1] = 0.5 + frand(0.5);
+ g->color[2] = 0.5 + frand(0.5);
+ g->color[3] = 1.0;
+
+ g->color2[0] = g->color[0] * 0.85;
+ g->color2[1] = g->color[1] * 0.85;
+ g->color2[2] = g->color[2] * 0.85;
+ g->color2[3] = g->color[3];
+
+
+ /* Decide on shape of gear interior:
+ - just a ring with teeth;
+ - that, plus a thinner in-set "plate" in the middle;
+ - that, plus a thin raised "lip" on the inner plate;
+ - or, a wide lip (really, a thicker third inner plate.)
+ */
+ if ((random() % 10) == 0)
+ {
+ /* inner_r can go all the way in; there's no inset disc. */
+ g->inner_r = (g->r * 0.1) + frand((g->r - g->tooth_h/2) * 0.8);
+ g->inner_r2 = 0;
+ g->inner_r3 = 0;
+ }
+ else
+ {
+ /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
+ g->inner_r = (g->r * 0.5) + frand((g->r - g->tooth_h) * 0.4);
+ g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
+ g->inner_r3 = 0;
+
+ if (g->inner_r2 > (g->r * 0.2))
+ {
+ int nn = (random() % 10);
+ if (nn <= 2)
+ g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
+ else if (nn <= 7 && g->inner_r2 >= 0.1)
+ g->inner_r3 = g->inner_r2 - 0.01;
+ }
+ }
+
+ /* If we have three discs, sometimes make the middle disc be spokes.
+ */
+ if (g->inner_r3 && ((random() % 5) == 0))
+ {
+ g->spokes = 2 + BELLRAND (5);
+ g->spoke_thickness = 1 + frand(7.0);
+ if (g->spokes == 2 && g->spoke_thickness < 2)
+ g->spoke_thickness += 1;
+ }
+
+ /* Sometimes add little nubbly bits, if there is room.
+ */
+ if (g->nteeth > 5)
+ {
+ double size = 0;
+ involute_biggest_ring (g, 0, &size, 0);
+ if (size > g->r * 0.2 && (random() % 5) == 0)
+ {
+ g->nubs = 1 + (random() % 16);
+ if (g->nubs > 8) g->nubs = 1;
+ }
+ }
+
+ if (g->inner_r3 > g->inner_r2) abort();
+ if (g->inner_r2 > g->inner_r) abort();
+ if (g->inner_r > g->r) abort();
+
+ /* Decide how complex the polygon model should be.
+ */
+ {
+ double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
+ if (pix <= 2.5) g->size = INVOLUTE_SMALL;
+ else if (pix <= 3.5) g->size = INVOLUTE_MEDIUM;
+ else if (pix <= 25) g->size = INVOLUTE_LARGE;
+ else g->size = INVOLUTE_HUGE;
+ }
+
+ g->base_p = !parent;
+
+ return g;
+}
+
+
+/* Given a newly-created gear, place it next to its parent in the scene,
+ with its teeth meshed and the proper velocity. Returns False if it
+ didn't work. (Call this a bunch of times until either it works, or
+ you decide it's probably not going to.)
+ [Mostly lifted from pinion.c]
+ */
+static Bool
+place_gear (ModeInfo *mi, gear *g, gear *parent)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ /* Compute this gear's velocity.
+ */
+ if (! parent)
+ {
+ g->ratio = 0.8 + BELLRAND(0.4); /* 0.8-1.2 = 8-12rpm @ 60fps */
+ g->th = 1; /* not 0 */
+ }
+ else
+ {
+ /* Gearing ratio is the ratio of the number of teeth to previous gear
+ (which is also the ratio of the circumferences.)
+ */
+ g->ratio = (double) parent->nteeth / (double) g->nteeth;
+
+ /* Set our initial rotation to match that of the previous gear,
+ multiplied by the gearing ratio. (This is finessed later,
+ once we know the exact position of the gear relative to its
+ parent.)
+ */
+ g->th = -(parent->th * g->ratio);
+
+ if (g->nteeth & 1) /* rotate 1/2 tooth-size if odd number of teeth */
+ {
+ double off = (180.0 / g->nteeth);
+ if (g->th > 0)
+ g->th += off;
+ else
+ g->th -= off;
+ }
+
+ /* ratios are cumulative for all gears in the train. */
+ g->ratio *= parent->ratio;
+ }
+
+
+ if (parent) /* Place the gear next to the parent. */
+ {
+ double r_off = parent->r + g->r;
+ int angle;
+
+ angle = (random() % 360) - 180; /* -180 to +180 degrees */
+
+ g->x = parent->x + (cos ((double) angle * (M_PI / 180)) * r_off);
+ g->y = parent->y + (sin ((double) angle * (M_PI / 180)) * r_off);
+ g->z = parent->z;
+
+ /* avoid accidentally changing sign of "th" in the math below. */
+ g->th += (g->th > 0 ? 360 : -360);
+
+ /* Adjust the rotation of the gear so that its teeth line up with its
+ parent, based on the position of the gear and the current rotation
+ of the parent.
+ */
+ {
+ double p_c = 2 * M_PI * parent->r; /* circumference of parent */
+ double g_c = 2 * M_PI * g->r; /* circumference of g */
+
+ double p_t = p_c * (angle/360.0); /* distance travelled along
+ circumference of parent when
+ moving "angle" degrees along
+ parent. */
+ double g_rat = p_t / g_c; /* if travelling that distance
+ along circumference of g,
+ ratio of g's circumference
+ travelled. */
+ double g_th = 360.0 * g_rat; /* that ratio in degrees */
+
+ g->th += angle + g_th;
+ }
+ }
+
+ /* If the position we picked for this gear causes it to overlap
+ with any earlier gear in the train, give up.
+ */
+ {
+ int i;
+
+ for (i = bp->ngears-1; i >= 0; i--)
+ {
+ gear *og = bp->gears[i];
+
+ if (og == g) continue;
+ if (og == parent) continue;
+ if (g->z != og->z) continue; /* Ignore unless on same layer */
+
+ /* Collision detection without sqrt:
+ d = sqrt(a^2 + b^2) d^2 = a^2 + b^2
+ d < r1 + r2 d^2 < (r1 + r2)^2
+ */
+ if (((g->x - og->x) * (g->x - og->x) +
+ (g->y - og->y) * (g->y - og->y)) <
+ ((g->r + g->tooth_h + og->r + og->tooth_h) *
+ (g->r + g->tooth_h + og->r + og->tooth_h)))
+ return False;
+ }
+ }
+
+ return True;
+}
+
+
+/* Make a new gear, place it next to its parent in the scene,
+ with its teeth meshed and the proper velocity. Returns the gear;
+ or 0 if it didn't work. (Call this a bunch of times until either
+ it works, or you decide it's probably not going to.)
+ [Mostly lifted from pinion.c]
+ */
+static gear *
+place_new_gear (ModeInfo *mi, gear *parent)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ int loop_count = 0;
+ gear *g = 0;
+
+ while (1)
+ {
+ loop_count++;
+ if (loop_count >= 100)
+ {
+ if (g)
+ free_gear (g);
+ g = 0;
+ break;
+ }
+
+ g = new_gear (mi, parent);
+ if (!g) return 0; /* out of memory? */
+
+ if (place_gear (mi, g, parent))
+ break;
+ }
+
+ if (! g) return 0;
+
+ /* We got a gear, and it is properly positioned.
+ Insert it in the scene.
+ */
+ bp->gears[bp->ngears++] = g;
+ return g;
+}
+
+
+static int
+arm (GLfloat length,
+ GLfloat width1, GLfloat height1,
+ GLfloat width2, GLfloat height2,
+ Bool wire)
+{
+ int polys = 0;
+ glShadeModel(GL_FLAT);
+
+#if 0 /* don't need these - they're embedded in other objects */
+ /* draw end 1 */
+ glFrontFace(GL_CW);
+ glNormal3f(-1, 0, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, height1/2);
+ glVertex3f(-length/2, -width1/2, height1/2);
+ polys++;
+ glEnd();
+
+ /* draw end 2 */
+ glFrontFace(GL_CCW);
+ glNormal3f(1, 0, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(length/2, -width2/2, -height2/2);
+ glVertex3f(length/2, width2/2, -height2/2);
+ glVertex3f(length/2, width2/2, height2/2);
+ glVertex3f(length/2, -width2/2, height2/2);
+ polys++;
+ glEnd();
+#endif
+
+ /* draw top */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 0, -1);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, -height1/2);
+ glVertex3f( length/2, width2/2, -height2/2);
+ glVertex3f( length/2, -width2/2, -height2/2);
+ polys++;
+ glEnd();
+
+ /* draw bottom */
+ glFrontFace(GL_CW);
+ glNormal3f(0, 0, 1);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, height1/2);
+ glVertex3f(-length/2, width1/2, height1/2);
+ glVertex3f( length/2, width2/2, height2/2);
+ glVertex3f( length/2, -width2/2, height2/2);
+ polys++;
+ glEnd();
+
+ /* draw left */
+ glFrontFace(GL_CW);
+ glNormal3f(0, -1, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, -height1/2);
+ glVertex3f(-length/2, -width1/2, height1/2);
+ glVertex3f( length/2, -width2/2, height2/2);
+ glVertex3f( length/2, -width2/2, -height2/2);
+ polys++;
+ glEnd();
+
+ /* draw right */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 1, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, height1/2);
+ glVertex3f( length/2, width2/2, height2/2);
+ glVertex3f( length/2, width2/2, -height2/2);
+ polys++;
+ glEnd();
+
+ glFrontFace(GL_CCW);
+
+ return polys;
+}
+
+
+static int
+ctube (GLfloat diameter, GLfloat width, Bool wire)
+{
+ tube (0, 0, width/2,
+ 0, 0, -width/2,
+ diameter, 0,
+ 32, True, True, wire);
+ return 0; /* #### */
+}
+
+static void
+armature (ModeInfo *mi)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ static const GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat shiny = 128.0;
+ GLfloat color[4];
+
+ color[0] = 0.5 + frand(0.5);
+ color[1] = 0.5 + frand(0.5);
+ color[2] = 0.5 + frand(0.5);
+ color[3] = 1.0;
+
+ bp->armature_polygons = 0;
+
+ bp->armature_dlist = glGenLists (1);
+ if (! bp->armature_dlist)
+ {
+ check_gl_error ("glGenLists");
+ abort();
+ }
+
+ glNewList (bp->armature_dlist, GL_COMPILE);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glColor3f (color[0], color[1], color[2]);
+
+ glPushMatrix();
+
+ {
+ GLfloat s = bp->gears[0]->r * 2.7;
+ s = s/5.6;
+ glScalef (s, s, s);
+ }
+
+ glTranslatef (0, 0, 1.4 + bp->gears[0]->thickness);
+ glRotatef (30, 0, 0, 1);
+
+ bp->armature_polygons += ctube (0.5, 10, wire); /* center axle */
+
+ glPushMatrix();
+ glTranslatef(0.0, 4.2, -1);
+ bp->armature_polygons += ctube (0.5, 3, wire); /* axle 1 */
+ glTranslatef(0, 0, 1.8);
+ bp->armature_polygons += ctube (0.7, 0.7, wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(120, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, 4.2, -1);
+ bp->armature_polygons += ctube (0.5, 3, wire); /* axle 2 */
+ glTranslatef(0, 0, 1.8);
+ bp->armature_polygons += ctube (0.7, 0.7, wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(240, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, 4.2, -1);
+ bp->armature_polygons += ctube (0.5, 3, wire); /* axle 3 */
+ glTranslatef(0, 0, 1.8);
+ bp->armature_polygons += ctube (0.7, 0.7, wire);
+ glPopMatrix();
+
+ glTranslatef(0, 0, 1.5); /* center disk */
+ bp->armature_polygons += ctube (1.5, 2, wire);
+
+ glPushMatrix();
+ glRotatef(270, 0, 0, 1);
+ glRotatef(-10, 0, 1, 0);
+ glTranslatef(-2.2, 0, 0);
+ bp->armature_polygons += arm (4.0, 1.0, 0.5,
+ 2.0, 1.0, wire); /* arm 1 */
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(30, 0, 0, 1);
+ glRotatef(-10, 0, 1, 0);
+ glTranslatef(-2.2, 0, 0);
+ bp->armature_polygons += arm (4.0, 1.0, 0.5,
+ 2.0, 1.0, wire); /* arm 2 */
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(150, 0, 0, 1);
+ glRotatef(-10, 0, 1, 0);
+ glTranslatef(-2.2, 0, 0);
+ bp->armature_polygons += arm (4.0, 1.0, 0.5,
+ 2.0, 1.0, wire); /* arm 3 */
+ glPopMatrix();
+
+ glPopMatrix();
+
+ glEndList ();
+}
+
+
+static void
+planetary_gears (ModeInfo *mi)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g0, *g1, *g2, *g3, *g4;
+ GLfloat distance = 2.02;
+
+ bp->planetary_p = True;
+
+ g0 = new_gear (mi, 0);
+ g1 = new_gear (mi, 0);
+ g2 = new_gear (mi, 0);
+ g3 = new_gear (mi, 0);
+ g4 = new_gear (mi, 0);
+
+ if (! place_gear (mi, g0, 0)) abort();
+ if (! place_gear (mi, g1, 0)) abort();
+ if (! place_gear (mi, g2, 0)) abort();
+ if (! place_gear (mi, g3, 0)) abort();
+ if (! place_gear (mi, g4, 0)) abort();
+
+ g0->nteeth = 12 + (3 * (random() % 10)); /* must be multiple of 3 */
+ g0->tooth_w = g0->r / g0->nteeth;
+ g0->tooth_h = g0->tooth_w * 2.8;
+
+# define COPY(F) g4->F = g3->F = g2->F = g1->F = g0->F
+ COPY(r);
+ COPY(th);
+ COPY(nteeth);
+ COPY(tooth_w);
+ COPY(tooth_h);
+ COPY(tooth_slope);
+ COPY(inner_r);
+ COPY(inner_r2);
+ COPY(inner_r3);
+ COPY(thickness);
+ COPY(thickness2);
+ COPY(thickness3);
+ COPY(ratio);
+ COPY(size);
+# undef COPY
+
+ g1->x = cos (M_PI * 2 / 3) * g1->r * distance;
+ g1->y = sin (M_PI * 2 / 3) * g1->r * distance;
+
+ g2->x = cos (M_PI * 4 / 3) * g2->r * distance;
+ g2->y = sin (M_PI * 4 / 3) * g2->r * distance;
+
+ g3->x = cos (M_PI * 6 / 3) * g3->r * distance;
+ g3->y = sin (M_PI * 6 / 3) * g3->r * distance;
+
+ g4->x = 0;
+ g4->y = 0;
+ g4->th = -g3->th;
+
+ /* rotate central gear 1/2 tooth-size if odd number of teeth */
+ if (g4->nteeth & 1)
+ g4->th -= (180.0 / g4->nteeth);
+
+ g0->inverted_p = True;
+ g0->x = 0;
+ g0->y = 0;
+ g0->nteeth = g1->nteeth * 3;
+ g0->r = g1->r * 3.05;
+ g0->inner_r = g0->r * 0.8;
+ g0->inner_r2 = 0;
+ g0->inner_r3 = 0;
+ g0->th = g1->th + (180 / g0->nteeth);
+ g0->ratio = g1->ratio / 3;
+
+ g0->tooth_slope = 0;
+ g0->nubs = 3;
+ g0->spokes = 0;
+ g0->size = INVOLUTE_LARGE;
+
+ bp->gears = (gear **) calloc (6, sizeof(**bp->gears));
+ bp->ngears = 0;
+
+ bp->gears[bp->ngears++] = g1;
+ bp->gears[bp->ngears++] = g2;
+ bp->gears[bp->ngears++] = g3;
+ bp->gears[bp->ngears++] = g4;
+ bp->gears[bp->ngears++] = g0;
+}
+
+
+
+
+ENTRYPOINT void
+init_gears (ModeInfo *mi)
+{
+ gears_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_gears (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ if (! bp->rot)
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.01;
+ double spin_accel = 0.25;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True
+ );
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (bp->gears)
+ {
+ for (i = 0; i < bp->ngears; i++)
+ free_gear (bp->gears[i]);
+ free (bp->gears);
+ bp->gears = 0;
+ bp->ngears = 0;
+ }
+
+ if (!(random() % 8))
+ {
+ planetary_gears (mi);
+ }
+ else
+ {
+ gear *g = 0;
+ int total_gears = MI_COUNT (mi);
+
+ bp->planetary_p = False;
+
+ if (total_gears <= 0)
+ total_gears = 3 + fabs (BELLRAND (8) - 4); /* 3 - 7, mostly 3. */
+ bp->gears = (gear **) calloc (total_gears+2, sizeof(**bp->gears));
+ bp->ngears = 0;
+
+ for (i = 0; i < total_gears; i++)
+ g = place_new_gear (mi, g);
+ }
+
+
+ /* Center gears in scene. */
+ {
+ GLfloat minx=99999, miny=99999, maxx=-99999, maxy=-99999;
+ int i;
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+ if (g->x - g->r < minx) minx = g->x - g->r;
+ if (g->x + g->r > maxx) maxx = g->x + g->r;
+ if (g->y - g->r < miny) miny = g->y - g->r;
+ if (g->y + g->r > maxy) maxy = g->y + g->r;
+ }
+ bp->bbox.x1 = minx;
+ bp->bbox.y1 = miny;
+ bp->bbox.x2 = maxx;
+ bp->bbox.y2 = maxy;
+ }
+
+ /* Now render each gear into its display list.
+ */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+ g->dlist = glGenLists (1);
+ if (! g->dlist)
+ {
+ check_gl_error ("glGenLists");
+ abort();
+ }
+
+ glNewList (g->dlist, GL_COMPILE);
+ g->polygons += draw_involute_gear (g, wire);
+ glEndList ();
+ }
+ if (bp->planetary_p)
+ armature (mi);
+}
+
+
+ENTRYPOINT void
+draw_gears (ModeInfo *mi)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef ((x - 0.5) * 4,
+ (y - 0.5) * 4,
+ (z - 0.5) * 7);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+ /* add a little rotation for -no-spin mode */
+ x -= 0.14;
+ y -= 0.06;
+
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ /* Center the scene's bounding box in the window,
+ and scale it to fit.
+ */
+ {
+ GLfloat w = bp->bbox.x2 - bp->bbox.x1;
+ GLfloat h = bp->bbox.y2 - bp->bbox.y1;
+ GLfloat s = 10.0 / (w > h ? w : h);
+ glScalef (s, s, s);
+ glTranslatef (-(bp->bbox.x1 + w/2),
+ -(bp->bbox.y1 + h/2),
+ 0);
+ }
+
+ mi->polygon_count = 0;
+
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+
+ glPushMatrix();
+
+ glTranslatef (g->x, g->y, g->z);
+ glRotatef (g->th, 0, 0, 1);
+
+ glCallList (g->dlist);
+ mi->polygon_count += g->polygons;
+
+ glPopMatrix ();
+ }
+
+ if (bp->planetary_p)
+ {
+ glCallList (bp->armature_dlist);
+ mi->polygon_count += bp->armature_polygons;
+ }
+
+ glPopMatrix ();
+
+ /* spin gears */
+ if (!bp->button_down_p)
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+ double off = g->ratio * 5 * speed;
+ if (g->th > 0)
+ g->th += off;
+ else
+ g->th -= off;
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT Bool
+gears_handle_event (ModeInfo *mi, XEvent *event)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ init_gears (mi);
+ return True;
+ }
+
+ return False;
+}
+
+XSCREENSAVER_MODULE ("Gears", gears)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/gears.man b/hacks/glx/gears.man
new file mode 100644
index 0000000..a54a6af
--- /dev/null
+++ b/hacks/glx/gears.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+gears - draw interlocking gears, for xscreensaver.
+.SH SYNOPSIS
+.B gears
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIfloat\fP]
+[\-no\-spin]
+[\-no\-wander]
+[-count \fIinteger\fP]
+[-wireframe]
+[-fps]
+.SH DESCRIPTION
+This draws a set of rotating gears.
+.SH OPTIONS
+.I gears
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds.
+Default: 30000 (0.03 seconds.)
+.TP 8
+.B \-speed \fIfloat\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-no\-spin
+Don't rotate the object.
+.TP 8
+.B \-no\-wander
+Don't wander the object around the screen.
+.TP 8
+.B \-count \fIinteger\fP
+How many gears to draw. Default: 0 for random.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
+
+An earlier version of this program by Brian Paul was written in 1997;
+this version was rewritten from scratch by jwz in 2007.
diff --git a/hacks/glx/geodesic.c b/hacks/glx/geodesic.c
new file mode 100644
index 0000000..9ef2696
--- /dev/null
+++ b/hacks/glx/geodesic.c
@@ -0,0 +1,816 @@
+/* geodesic, Copyright (c) 2013-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 4 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_geodesic 0
+# define release_geodesic 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_MODE "mesh"
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int ncolors;
+ XColor *colors;
+ int ccolor, ccolor2;
+ GLfloat color1[4], color2[4];
+
+ GLfloat depth;
+ GLfloat delta;
+
+ GLfloat thickness;
+ GLfloat thickdelta;
+
+ GLfloat morph_ratio;
+
+ Bool random_p;
+ enum { WIRE, MESH, SOLID, STELLATED, STELLATED2 } mode;
+
+} geodesic_configuration;
+
+static geodesic_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static char *mode_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-wireframe", ".mode", XrmoptionNoArg, "wire" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&mode_str, "mode", "Mode", DEF_MODE, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt geodesic_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Renders a triangle specified by 3 cartesian endpoints.
+ */
+static void
+triangle0 (ModeInfo *mi, XYZ p1, XYZ p2, XYZ p3)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat r = bp->thickness;
+
+ if (bp->mode == SOLID || bp->mode == STELLATED || bp->mode == STELLATED2)
+ r = 1;
+
+ if (r <= 0.001) r = 0.001;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color1);
+
+ if (wire) r = 1;
+
+ if (r <= 0)
+ ;
+ else if (r >= 1) /* solid triangular face */
+ {
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ do_normal (p1.x, p1.y, p1.z,
+ p2.x, p2.y, p2.z,
+ p3.x, p3.y, p3.z);
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ else /* mesh: triangular face with a triangular hole */
+ {
+ XYZ p1b, p2b, p3b, c;
+ GLfloat d = 0.98;
+
+ c.x = (p1.x + p2.x + p3.x) / 3;
+ c.y = (p1.y + p2.y + p3.y) / 3;
+ c.z = (p1.z + p2.z + p3.z) / 3;
+
+ p1b.x = p1.x + (r * (c.x - p1.x));
+ p1b.y = p1.y + (r * (c.y - p1.y));
+ p1b.z = p1.z + (r * (c.z - p1.z));
+
+ p2b.x = p2.x + (r * (c.x - p2.x));
+ p2b.y = p2.y + (r * (c.y - p2.y));
+ p2b.z = p2.z + (r * (c.z - p2.z));
+
+ p3b.x = p3.x + (r * (c.x - p3.x));
+ p3b.y = p3.y + (r * (c.y - p3.y));
+ p3b.z = p3.z + (r * (c.z - p3.z));
+
+ /* Outside faces */
+
+ do_normal (p1.x, p1.y, p1.z,
+ p2.x, p2.y, p2.z,
+ p3.x, p3.y, p3.z);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ mi->polygon_count++;
+
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ mi->polygon_count++;
+
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ mi->polygon_count++;
+ glEnd();
+
+ /* Inside faces */
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color2);
+
+ do_normal (p3.x, p3.y, p3.z,
+ p3b.x, p3b.y, p3b.z,
+ p1b.x, p1b.y, p1b.z);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (d * p3.x, d * p3.y, d * p3.z);
+ glVertex3f (d * p3b.x, d * p3b.y, d * p3b.z);
+ glVertex3f (d * p1b.x, d * p1b.y, d * p1b.z);
+ glVertex3f (d * p1.x, d * p1.y, d * p1.z);
+ mi->polygon_count++;
+
+ glVertex3f (d * p1b.x, d * p1b.y, d * p1b.z);
+ glVertex3f (d * p2b.x, d * p2b.y, d * p2b.z);
+ glVertex3f (d * p2.x, d * p2.y, d * p2.z);
+ glVertex3f (d * p1.x, d * p1.y, d * p1.z);
+ mi->polygon_count++;
+
+ glVertex3f (d * p2b.x, d * p2b.y, d * p2b.z);
+ glVertex3f (d * p3b.x, d * p3b.y, d * p3b.z);
+ glVertex3f (d * p3.x, d * p3.y, d * p3.z);
+ glVertex3f (d * p2.x, d * p2.y, d * p2.z);
+ mi->polygon_count++;
+ glEnd();
+
+
+ /* Connecting edges */
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color1);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ do_normal (p1b.x, p1b.y, p1b.z,
+ p2b.x, p2b.y, p2b.z,
+ p2b.x * d, p2b.y * d, p2b.z * d);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p2b.x * d, p2b.y * d, p2b.z * d);
+ glVertex3f (p1b.x * d, p1b.y * d, p1b.z * d);
+ mi->polygon_count++;
+
+ do_normal (p2b.x, p2b.y, p2b.z,
+ p3b.x, p3b.y, p3b.z,
+ p3b.x * d, p3b.y * d, p3b.z * d);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p3b.x * d, p3b.y * d, p3b.z * d);
+ glVertex3f (p2b.x * d, p2b.y * d, p2b.z * d);
+ mi->polygon_count++;
+
+ do_normal (p3b.x, p3b.y, p3b.z,
+ p1b.x, p1b.y, p1b.z,
+ p1b.x * d, p1b.y * d, p1b.z * d);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glVertex3f (p1b.x * d, p1b.y * d, p1b.z * d);
+ glVertex3f (p3b.x * d, p3b.y * d, p3b.z * d);
+ mi->polygon_count++;
+ glEnd();
+ }
+}
+
+
+/* Renders a triangle specified by 3 polar endpoints.
+ */
+static void
+triangle1 (ModeInfo *mi, LL v1, LL v2, LL v3)
+{
+ XYZ p1, p2, p3;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ p3.x = cos (v3.a) * cos (v3.o);
+ p3.y = cos (v3.a) * sin (v3.o);
+ p3.z = sin (v3.a);
+
+ triangle0 (mi, p1, p2, p3);
+}
+
+
+/* Computes the midpoint of a line between two polar coords.
+ */
+static void
+midpoint2 (LL v1, LL v2, LL *vm_ret,
+ XYZ *p1_ret, XYZ *p2_ret, XYZ *pm_ret)
+{
+ XYZ p1, p2, pm;
+ LL vm;
+ GLfloat hyp;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ pm.x = (p1.x + p2.x) / 2;
+ pm.y = (p1.y + p2.y) / 2;
+ pm.z = (p1.z + p2.z) / 2;
+
+ vm.o = atan2 (pm.y, pm.x);
+ hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
+ vm.a = atan2 (pm.z, hyp);
+
+ *p1_ret = p1;
+ *p2_ret = p2;
+ *pm_ret = pm;
+ *vm_ret = vm;
+}
+
+
+/* Computes the midpoint of a triangle specified in polar coords.
+ */
+static void
+midpoint3 (LL v1, LL v2, LL v3, LL *vm_ret,
+ XYZ *p1_ret, XYZ *p2_ret, XYZ *p3_ret, XYZ *pm_ret)
+{
+ XYZ p1, p2, p3, pm;
+ LL vm;
+ GLfloat hyp;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ p3.x = cos (v3.a) * cos (v3.o);
+ p3.y = cos (v3.a) * sin (v3.o);
+ p3.z = sin (v3.a);
+
+ pm.x = (p1.x + p2.x + p3.x) / 3;
+ pm.y = (p1.y + p2.y + p3.y) / 3;
+ pm.z = (p1.z + p2.z + p3.z) / 3;
+
+ vm.o = atan2 (pm.y, pm.x);
+ hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
+ vm.a = atan2 (pm.z, hyp);
+
+ *p1_ret = p1;
+ *p2_ret = p2;
+ *p3_ret = p3;
+ *pm_ret = pm;
+ *vm_ret = vm;
+}
+
+
+/* Renders a triangular geodesic facet to the given depth.
+ */
+static void
+triangle (ModeInfo *mi, LL v1, LL v2, LL v3, int depth)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (depth <= 0)
+ triangle1 (mi, v1, v2, v3);
+ else
+ {
+ LL v12, v23, v13;
+ XYZ p1, p2, p3, p12, p23, p13;
+ GLfloat r = bp->morph_ratio;
+
+ midpoint2 (v1, v2, &v12, &p1, &p2, &p12);
+ midpoint2 (v2, v3, &v23, &p2, &p3, &p23);
+ midpoint2 (v1, v3, &v13, &p1, &p3, &p13);
+ depth--;
+
+ if (depth == 0 &&
+ r != 0 &&
+ (bp->mode == STELLATED || bp->mode == STELLATED2))
+ { /* morph between flat and stellated faces */
+ XYZ pc, pc2;
+ LL vc;
+ midpoint3 (v1, v2, v3, &vc, &p1, &p2, &p3, &pc);
+
+ pc2.x = cos (vc.a) * cos (vc.o);
+ pc2.y = cos (vc.a) * sin (vc.o);
+ pc2.z = sin (vc.a);
+
+ pc.x = pc.x + r * (pc2.x - pc.x);
+ pc.y = pc.y + r * (pc2.y - pc.y);
+ pc.z = pc.z + r * (pc2.z - pc.z);
+
+ triangle0 (mi, p1, p2, pc);
+ triangle0 (mi, p2, p3, pc);
+ triangle0 (mi, p3, p1, pc);
+ }
+ else if (depth == 0 && r < 1)
+ { /* morph between flat and sphere-oid faces */
+ XYZ p12b, p23b, p13b;
+
+ p12b.x = cos (v12.a) * cos (v12.o);
+ p12b.y = cos (v12.a) * sin (v12.o);
+ p12b.z = sin (v12.a);
+
+ p23b.x = cos (v23.a) * cos (v23.o);
+ p23b.y = cos (v23.a) * sin (v23.o);
+ p23b.z = sin (v23.a);
+
+ p13b.x = cos (v13.a) * cos (v13.o);
+ p13b.y = cos (v13.a) * sin (v13.o);
+ p13b.z = sin (v13.a);
+
+ p12.x = p12.x + r * (p12b.x - p12.x);
+ p12.y = p12.y + r * (p12b.y - p12.y);
+ p12.z = p12.z + r * (p12b.z - p12.z);
+
+ p23.x = p23.x + r * (p23b.x - p23.x);
+ p23.y = p23.y + r * (p23b.y - p23.y);
+ p23.z = p23.z + r * (p23b.z - p23.z);
+
+ p13.x = p13.x + r * (p13b.x - p13.x);
+ p13.y = p13.y + r * (p13b.y - p13.y);
+ p13.z = p13.z + r * (p13b.z - p13.z);
+
+ triangle0 (mi, p1, p12, p13);
+ triangle0 (mi, p12, p2, p23);
+ triangle0 (mi, p13, p23, p3);
+ triangle0 (mi, p12, p23, p13);
+ }
+ else
+ {
+ triangle (mi, v1, v12, v13, depth);
+ triangle (mi, v12, v2, v23, depth);
+ triangle (mi, v13, v23, v3, depth);
+ triangle (mi, v12, v23, v13, depth);
+ }
+ }
+}
+
+
+/* Renders a geodesic sphere to the given depth (frequency).
+ */
+static void
+make_geodesic (ModeInfo *mi, int depth)
+{
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (i & 1) /* north */
+ {
+ triangle (mi, v1, v2, vc, depth);
+ triangle (mi, v2, v1, v3, depth);
+ }
+ else /* south */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ triangle (mi, v2, v1, vc, depth);
+ triangle (mi, v1, v2, v3, depth);
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_geodesic (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+ENTRYPOINT void
+init_geodesic (ModeInfo *mi)
+{
+ geodesic_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_geodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ /* This comes first because it sets wire. */
+ if (!mode_str || !*mode_str)
+ mode_str = DEF_MODE;
+ if (!strcasecmp(mode_str, "random")) {
+ bp->random_p = 1;
+ bp->mode = MESH + (random() % (STELLATED2 - MESH + 1));
+ } else if (!strcasecmp(mode_str, "mesh")) {
+ bp->mode = MESH;
+ } else if (!strcasecmp(mode_str, "solid")) {
+ bp->mode = SOLID;
+ } else if (!strcasecmp(mode_str, "stellated")) {
+ bp->mode = STELLATED;
+ } else if (!strcasecmp(mode_str, "stellated2")) {
+ bp->mode = STELLATED2;
+ } else if (!strcasecmp(mode_str, "wire")) {
+ bp->mode = WIRE;
+ MI_IS_WIREFRAME(mi) = wire = 1;
+ } else {
+ fprintf (stderr, "%s: unknown mode: %s\n", progname, mode_str);
+ exit (1);
+ }
+
+
+ {
+ static GLfloat cspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat shiny = 128.0;
+
+ static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ static GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ static GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ static GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+
+ glLineWidth (3);
+ }
+
+ if (! wire)
+ {
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ /* Actually this looks pretty good in -wire with lighting! */
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+
+ if (! bp->rot)
+ {
+ double spin_speed = 0.25 * speed;
+ double wander_speed = 0.01 * speed;
+ double spin_accel = 0.2;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1;
+
+ bp->ncolors = 1024;
+ if (! bp->colors)
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ bp->ccolor = 0;
+ bp->depth = 1; /* start 1 up from the icosahedron */
+ bp->delta = 0.003;
+
+#if 0
+ bp->thickness = 1;
+ bp->thickdelta = 0.0007;
+#else
+ bp->thickness = 0.1;
+ bp->thickdelta = 0;
+#endif
+}
+
+
+ENTRYPOINT Bool
+geodesic_handle_event (ModeInfo *mi, XEvent *event)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ mode_str = "random";
+ init_geodesic (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_geodesic (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ if (! wire)
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ bp->color1[0] = bp->colors[bp->ccolor].red / 65536.0;
+ bp->color1[1] = bp->colors[bp->ccolor].green / 65536.0;
+ bp->color1[2] = bp->colors[bp->ccolor].blue / 65536.0;
+ bp->color1[3] = 1;
+
+ bp->color2[0] = bp->colors[bp->ccolor2].red / 65536.0;
+ bp->color2[1] = bp->colors[bp->ccolor2].green / 65536.0;
+ bp->color2[2] = bp->colors[bp->ccolor2].blue / 65536.0;
+ bp->color2[3] = 1;
+
+ bp->ccolor = (bp->ccolor + 1) % bp->ncolors;
+ bp->ccolor2 = (bp->ccolor + bp->ncolors / 2) % bp->ncolors;
+
+ mi->polygon_count = 0;
+
+ glScalef (10, 10, 10);
+
+ {
+ GLfloat r = bp->depth - floor(bp->depth);
+ GLfloat alpha, morph1, morph2;
+ int d1, d2;
+
+ /* Two ranges: first for fading in the new segments.
+ Second for morphing the segments into position.
+ */
+ GLfloat range = 0.15;
+ GLfloat min1 = (0.5 - range) / 2;
+ GLfloat max1 = 0.5 - min1;
+ GLfloat min2 = 0.5 + min1;
+ GLfloat max2 = 0.5 + max1;
+
+ if (r < min1) /* old alone */
+ {
+ d1 = d2 = floor (bp->depth);
+ morph1 = morph2 = 1;
+ alpha = 1;
+ }
+ else if (r < max1 && /* fade to new flat */
+ (bp->mode == MESH ||
+ bp->mode == STELLATED ||
+ bp->mode == STELLATED2))
+ {
+ d1 = floor (bp->depth);
+ d2 = ceil (bp->depth);
+ morph1 = 1;
+ morph2 = 0;
+ alpha = (r - min1) / (max1 - min1);
+
+ if (bp->mode == STELLATED || bp->mode == STELLATED2)
+ {
+ morph1 = 1 - alpha; /* de-stellate while fading out */
+ morph1 = 2 * (morph1 - 0.5); /* do it faster */
+ if (morph1 < 0) morph1 = 0;
+ }
+ }
+ else if (r < min2) /* new flat */
+ {
+ d1 = d2 = ceil (bp->depth);
+ morph1 = morph2 = 0;
+ alpha = 1;
+ }
+ else if (r < max2) /* morph */
+ {
+ d1 = d2 = ceil (bp->depth);
+ morph1 = morph2 = (r - min2) / (max2 - min2);
+ alpha = 1;
+ }
+ else /* new alone */
+ {
+ d1 = d2 = ceil (bp->depth);
+ morph1 = morph2 = 1;
+ alpha = 1;
+ }
+
+ mi->recursion_depth = d2 + r;
+
+ if (bp->mode == STELLATED2)
+ {
+ morph1 = -morph1;
+ morph2 = -morph2;
+ }
+
+ if (d1 != d2)
+ {
+ if (alpha > 0.5) /* always draw the more transparent one first */
+ {
+ int s1; GLfloat s2;
+ s1 = d1; d1 = d2; d2 = s1;
+ s2 = morph1; morph1 = morph2; morph2 = s2;
+ alpha = 1 - alpha;
+ }
+ bp->color1[3] = 1 - alpha;
+ bp->color2[3] = 1 - alpha;
+
+ if (! wire)
+ glDisable (GL_POLYGON_OFFSET_FILL);
+
+ bp->morph_ratio = morph1;
+ make_geodesic (mi, d1);
+
+ /* Make the less-transparent object take precedence */
+ if (!wire)
+ {
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+ }
+ }
+
+ bp->color1[3] = alpha;
+ bp->color2[3] = alpha;
+
+ bp->morph_ratio = morph2;
+ make_geodesic (mi, d2);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+
+
+ if (! bp->button_down_p)
+ {
+ bp->depth += speed * bp->delta;
+ bp->thickness += speed * bp->thickdelta;
+
+ if (bp->depth > MI_COUNT(mi)-1)
+ {
+ bp->depth = MI_COUNT(mi)-1;
+ bp->delta = -fabs (bp->delta);
+ }
+ else if (bp->depth < 0)
+ {
+ bp->depth = 0;
+ bp->delta = fabs (bp->delta);
+
+ /* Randomize the mode again when we hit the bottom state.
+ #### I wish this did a fade instead of a jump-cut.
+ */
+ if (bp->random_p)
+ bp->mode = MESH + (random() % (STELLATED2 - MESH + 1));
+ }
+
+ if (bp->thickness > 1)
+ {
+ bp->thickness = 1;
+ bp->thickdelta = -fabs (bp->thickdelta);
+ }
+ else if (bp->thickness < 0)
+ {
+ bp->thickness = 0;
+ bp->thickdelta = fabs (bp->thickdelta);
+ }
+ }
+}
+
+XSCREENSAVER_MODULE ("Geodesic", geodesic)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/geodesic.man b/hacks/glx/geodesic.man
new file mode 100644
index 0000000..4a408ca
--- /dev/null
+++ b/hacks/glx/geodesic.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+geodesic - animates a mesh geodesic sphere.
+.SH SYNOPSIS
+.B geodesic
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-mode \fImode\fP]
+[\-no-wander]
+[\-no-spin]
+[\-fps]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+.SH DESCRIPTION
+Animates a mesh geodesic sphere of increasing and decreasing complexity. A
+geodesic sphere is an icosohedron whose equilateral faces are sub-divided
+into non-equilateral triangles to more closely approximate a sphere.
+
+The animation shows the equilateral triangles subdivided into four
+coplanar equilateral triangles; and then inflated outward, causing the
+sub-triangles to no longer be equilateral, but to more closely
+approximate the surface of a sphere.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mode mesh | solid | stellated | stellated2 | wire
+Face/edge display style. Default mesh.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Depth (frequency) of the geodesic sphere. Default: 4.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/geodesicgears.c b/hacks/glx/geodesicgears.c
new file mode 100644
index 0000000..ecc7f26
--- /dev/null
+++ b/hacks/glx/geodesicgears.c
@@ -0,0 +1,1803 @@
+/* geodesicgears, Copyright (c) 2014-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Inspired by http://bugman123.com/Gears/
+ * and by http://kennethsnelson.net/PortraitOfAnAtom.pdf
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 4 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*texFontCacheSize: 100 \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*font: -*-helvetica-medium-r-normal-*-*-160-*-*-*-*-*-*\n" \
+
+# define release_geodesic 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "involute.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+#include "texfont.h"
+
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_LABELS "False"
+#define DEF_NUMBERS "False"
+#define DEF_TIMEOUT "20"
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+/* 10:6 is a mismesh. */
+
+static const struct {
+ enum { PRISM, OCTO, DECA, G14, G18, G32, G92, G182 } type;
+ const GLfloat args[5];
+} gear_templates[] = {
+ { PRISM },
+ { OCTO },
+ { DECA },
+ { G14 },
+ { G18 },
+ { G32, { 15, 6, 0.4535 }}, /* teeth1, teeth2, radius1 */
+ { G32, { 15, 12, 0.3560 }},
+ { G32, { 20, 6, 0.4850 }},
+ { G32, { 20, 12, 0.3995 }}, /* double of 10:6 */
+ { G32, { 20, 18, 0.3375 }},
+ { G32, { 25, 6, 0.5065 }},
+ { G32, { 25, 12, 0.4300 }},
+ { G32, { 25, 18, 0.3725 }},
+ { G32, { 25, 24, 0.3270 }},
+ { G32, { 30, 12, 0.4535 }}, /* double of 15:6 */
+ { G32, { 30, 18, 0.3995 }},
+ { G32, { 30, 24, 0.3560 }}, /* double of 15:12 */
+ { G32, { 30, 30, 0.3205 }},
+ { G32, { 35, 12, 0.4710 }},
+ { G32, { 35, 18, 0.4208 }},
+ { G32, { 35, 24, 0.3800 }},
+ { G32, { 35, 30, 0.3450 }},
+ { G32, { 35, 36, 0.3160 }},
+ { G32, { 40, 12, 0.4850 }}, /* double of 20:6 */
+ { G32, { 40, 24, 0.3995 }}, /* double of 10:6, 20:12 */
+/*{ G32, { 40, 36, 0.3375 }},*/ /* double of 20:18 */
+ { G32, { 50, 12, 0.5065 }}, /* double of 25:6 */
+ { G32, { 50, 24, 0.4300 }}, /* double of 25:12 */
+
+ /* These all have phase errors and don't always mesh properly.
+ Maybe we should just omit them? */
+
+ { G92, { 35, 36, 16, 0.2660, 0.366 }}, /* teeth1, 2, 3, r1, pitch3 */
+ { G92, { 25, 36, 11, 0.2270, 0.315 }},
+/*{ G92, { 15, 15, 8, 0.2650, 0.356 }},*/
+/*{ G92, { 20, 21, 8, 0.2760, 0.355 }},*/
+ { G92, { 25, 27, 16, 0.2320, 0.359 }},
+ { G92, { 20, 36, 11, 0.1875, 0.283 }},
+ { G92, { 30, 30, 16, 0.2585, 0.374 }}, /* double of 15:15:8 */
+ { G92, { 20, 33, 11, 0.1970, 0.293 }},
+/*{ G92, { 10, 12, 8, 0.2030, 0.345 }},*/
+ { G92, { 30, 33, 16, 0.2455, 0.354 }},
+/*{ G92, { 25, 24, 8, 0.3050, 0.375 }},*/
+ { G92, { 20, 24, 16, 0.2030, 0.346 }},
+};
+
+
+typedef struct sphere_gear sphere_gear;
+struct sphere_gear {
+ int id; /* name, for debugging */
+ XYZ axis; /* the vector on which this gear's axis lies */
+ int direction; /* rotation, +1 or -1 */
+ GLfloat offset; /* rotational degrees from parent gear */
+ sphere_gear *parent; /* gear driving this one, or 0 for root */
+ sphere_gear **children; /* gears driven by this one (no loops) */
+ sphere_gear **neighbors; /* gears touching this one (circular!) */
+ int nchildren, children_size;
+ int nneighbors, neighbors_size;
+ const gear *g; /* shape of this gear (shared) */
+};
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int ncolors;
+ XColor *colors;
+ GLfloat color1[4], color2[4];
+ texture_font_data *font;
+
+ int nshapes, shapes_size; /* how many 'gear' objects there are */
+ int ngears, gears_size; /* how many 'sphere_gear' objects there are */
+ gear *shapes;
+ sphere_gear *gears;
+
+ int which;
+ int mode; /* 0 = normal, 1 = out, 2 = in */
+ int mode_tick;
+ int next; /* 0 = random, -1 = back, 1 = forward */
+ time_t draw_time;
+ int draw_tick;
+ char *desc;
+
+ GLfloat th; /* rotation of the root sphere_gear in degrees. */
+
+} geodesic_configuration;
+
+static geodesic_configuration *bps = NULL;
+
+static int timeout;
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static Bool do_labels;
+static Bool do_numbers;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-labels", ".labels", XrmoptionNoArg, "True" },
+ { "+labels", ".labels", XrmoptionNoArg, "False" },
+ { "-numbers", ".numbers",XrmoptionNoArg, "True" },
+ { "+numbers", ".numbers",XrmoptionNoArg, "False" },
+ { "-timeout", ".timeout",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
+ {&do_numbers,"numbers","Numbers",DEF_NUMBERS,t_Bool},
+ {&timeout, "timeout","Seconds",DEF_TIMEOUT,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt geodesic_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+
+
+static XYZ
+cross_product (XYZ a, XYZ b)
+{
+ XYZ c;
+ c.x = (a.y * b.z) - (a.z * b.y);
+ c.y = (a.z * b.x) - (a.x * b.z);
+ c.z = (a.x * b.y) - (a.y * b.x);
+ return c;
+}
+
+
+static GLfloat
+dot_product (XYZ a, XYZ b)
+{
+ return (a.x * b.x) + (a.y * b.y) + (a.z * b.z);
+}
+
+
+static XYZ
+normalize (XYZ v)
+{
+ GLfloat d = sqrt ((v.x * v.x) + (v.y * v.y) + (v.z * v.z));
+ if (d == 0)
+ v.x = v.y = v.z = 0;
+ else
+ {
+ v.x /= d;
+ v.y /= d;
+ v.z /= d;
+ }
+ return v;
+}
+
+
+static XYZ
+polar_to_cartesian (LL v)
+{
+ XYZ p;
+ p.x = cos (v.a) * cos (v.o);
+ p.y = cos (v.a) * sin (v.o);
+ p.z = sin (v.a);
+ return p;
+}
+
+
+
+
+static gear *
+add_gear_shape (ModeInfo *mi, GLfloat radius, int teeth)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ gear *g;
+ int i;
+
+ if (bp->nshapes >= bp->shapes_size - 1)
+ {
+ bp->shapes_size = bp->shapes_size * 1.2 + 4;
+ bp->shapes = (gear *)
+ realloc (bp->shapes, bp->shapes_size * sizeof(*bp->shapes));
+ }
+ g = &bp->shapes[bp->nshapes++];
+
+ memset (g, 0, sizeof(*g));
+
+ g->r = radius;
+ g->nteeth = teeth;
+ g->ratio = 1;
+
+ g->tooth_h = g->r / (teeth * 0.4);
+
+ if (g->tooth_h > 0.06) /* stubbier teeth when small tooth count. */
+ g->tooth_h *= 0.6;
+
+ g->thickness = 0.05 + BELLRAND(0.15);
+ g->thickness2 = g->thickness / 4;
+ g->thickness3 = g->thickness;
+ g->size = wire ? INVOLUTE_SMALL : INVOLUTE_LARGE;
+
+ /* Move the disc's origin inward to make the edge of the disc be tangent
+ to the unit sphere. */
+ g->z = 1 - sqrt (1 - (g->r * g->r));
+
+ /* #### This isn't quite right */
+ g->tooth_slope = 1 + ((g->z * 2) / g->r);
+
+
+ /* Decide on shape of gear interior:
+ - just a ring with teeth;
+ - that, plus a thinner in-set "plate" in the middle;
+ - that, plus a thin raised "lip" on the inner plate;
+ - or, a wide lip (really, a thicker third inner plate.)
+ */
+ if (wire)
+ ;
+ else if ((random() % 10) == 0)
+ {
+ /* inner_r can go all the way in; there's no inset disc. */
+ g->inner_r = (g->r * 0.3) + frand((g->r - g->tooth_h/2) * 0.6);
+ g->inner_r2 = 0;
+ g->inner_r3 = 0;
+ }
+ else
+ {
+ /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
+ g->inner_r = (g->r * 0.5) + frand((g->r - g->tooth_h) * 0.4);
+ g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
+ g->inner_r3 = 0;
+
+ if (g->inner_r2 > (g->r * 0.2))
+ {
+ int nn = (random() % 10);
+ if (nn <= 2)
+ g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
+ else if (nn <= 7 && g->inner_r2 >= 0.1)
+ g->inner_r3 = g->inner_r2 - 0.01;
+ }
+ }
+
+ /* If we have three discs, sometimes make the middle disc be spokes.
+ */
+ if (g->inner_r3 && ((random() % 5) == 0))
+ {
+ g->spokes = 2 + BELLRAND (5);
+ g->spoke_thickness = 1 + frand(7.0);
+ if (g->spokes == 2 && g->spoke_thickness < 2)
+ g->spoke_thickness += 1;
+ }
+
+ /* Sometimes add little nubbly bits, if there is room.
+ */
+ if (!wire && g->nteeth > 5)
+ {
+ double size = 0;
+ involute_biggest_ring (g, 0, &size, 0);
+ if (size > g->r * 0.2 && (random() % 5) == 0)
+ {
+ g->nubs = 1 + (random() % 16);
+ if (g->nubs > 8) g->nubs = 1;
+ }
+ }
+
+ /* Decide how complex the polygon model should be.
+ */
+ {
+ double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
+ if (pix <= 4) g->size = INVOLUTE_SMALL;
+ else if (pix <= 8) g->size = INVOLUTE_MEDIUM;
+ else if (pix <= 30) g->size = INVOLUTE_LARGE;
+ else g->size = INVOLUTE_HUGE;
+ }
+
+ if (g->inner_r3 > g->inner_r2) abort();
+ if (g->inner_r2 > g->inner_r) abort();
+ if (g->inner_r > g->r) abort();
+
+ i = random() % bp->ncolors;
+ g->color[0] = bp->colors[i].red / 65536.0;
+ g->color[1] = bp->colors[i].green / 65536.0;
+ g->color[2] = bp->colors[i].blue / 65536.0;
+ g->color[3] = 1;
+
+ i = (i + bp->ncolors / 2) % bp->ncolors;
+ g->color2[0] = bp->colors[i].red / 65536.0;
+ g->color2[1] = bp->colors[i].green / 65536.0;
+ g->color2[2] = bp->colors[i].blue / 65536.0;
+ g->color2[3] = 1;
+
+ g->dlist = glGenLists (1);
+ glNewList (g->dlist, GL_COMPILE);
+
+#if 1
+ {
+ gear G, *g2 = &G;
+ *g2 = *g;
+
+ /* Move the gear inward so that its outer edge is on the disc, instead
+ of its midpoint. */
+ g2->z += g2->thickness/2;
+
+ /* 'radius' is at the surface but 'g->r' is at the center, so we need
+ to reverse the slope computation that involute.c does. */
+ g2->r /= (1 + (g2->thickness * g2->tooth_slope / 2));
+
+ glPushMatrix();
+ glTranslatef(g2->x, g2->y, -g2->z);
+
+ /* Line up the center of the point of tooth 0 with "up". */
+ glRotatef (90, 0, 0, 1);
+ glRotatef (180, 0, 1, 0);
+ glRotatef (-360.0 / g2->nteeth / 4, 0, 0, 1);
+
+ g->polygons = draw_involute_gear (g2, wire);
+ glPopMatrix();
+ }
+# else /* draw discs */
+ {
+ glPushMatrix();
+ glTranslatef(g->x, g->y, -g->z);
+ glLineWidth (2);
+ glFrontFace (GL_CCW);
+ glNormal3f(0, 0, 1);
+ glColor3f(0, 0, 0);
+ glDisable (GL_LIGHTING);
+
+ glBegin(GL_LINES);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, radius, 0);
+ glEnd();
+
+ glColor3f(0.5, 0.5, 0.5);
+ glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ {
+ GLfloat th;
+ GLfloat step = M_PI * 2 / 128;
+ /* radius *= 1.005; */
+ glVertex3f (0, 0, 0);
+ for (th = 0; th < M_PI * 2 + step; th += step)
+ {
+ GLfloat x = cos(th) * radius;
+ GLfloat y = sin(th) * radius;
+ glVertex3f (x, y, 0);
+ }
+ }
+ glEnd();
+ if (!wire) glEnable(GL_LIGHTING);
+ glPopMatrix();
+ }
+# endif /* 0 */
+
+ glEndList ();
+
+ return g;
+}
+
+
+static void
+add_sphere_gear (ModeInfo *mi, gear *g, XYZ axis)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ sphere_gear *gg;
+ int i;
+
+ axis = normalize (axis);
+
+ /* If there's already a gear on this axis, don't duplicate it. */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ XYZ o = bp->gears[i].axis;
+ if (o.x == axis.x && o.y == axis.y && o.z == axis.z)
+ return;
+ }
+
+ if (bp->ngears >= bp->gears_size - 1)
+ {
+ bp->gears_size = bp->gears_size * 1.2 + 10;
+ bp->gears = (sphere_gear *)
+ realloc (bp->gears, bp->gears_size * sizeof(*bp->gears));
+ }
+
+ gg = &bp->gears[bp->ngears];
+ memset (gg, 0, sizeof(*gg));
+ gg->id = bp->ngears;
+ gg->axis = axis;
+ gg->direction = 0;
+ gg->g = g;
+ bp->ngears++;
+}
+
+
+static void
+free_sphere_gears (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < bp->nshapes; i++)
+ {
+ if (bp->shapes[i].dlist)
+ glDeleteLists (bp->shapes[i].dlist, 1);
+ }
+ free (bp->shapes);
+ bp->nshapes = 0;
+ bp->shapes_size = 0;
+ bp->shapes = 0;
+
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *g = &bp->gears[i];
+ if (g->children)
+ free (g->children);
+ if (g->neighbors)
+ free (g->neighbors);
+ }
+ free (bp->gears);
+ bp->ngears = 0;
+ bp->gears_size = 0;
+ bp->gears = 0;
+}
+
+
+
+/* Is the gear a member of the list?
+ */
+static Bool
+gear_list_member (sphere_gear *g, sphere_gear **list, int count)
+{
+ int i;
+ for (i = 0; i < count; i++)
+ if (list[i] == g) return True;
+ return False;
+}
+
+
+/* Add the gear to the list, resizing it as needed.
+ */
+static void
+gear_list_push (sphere_gear *g,
+ sphere_gear ***listP,
+ int *countP, int *sizeP)
+{
+ if (*countP >= (*sizeP) - 1)
+ {
+ *sizeP = (*sizeP) * 1.2 + 4;
+ *listP = (sphere_gear **) realloc (*listP, (*sizeP) * sizeof(**listP));
+ }
+ (*listP)[*countP] = g;
+ (*countP)++;
+}
+
+
+/* Mark child and parent as being mutual neighbors.
+ */
+static void
+link_neighbors (sphere_gear *parent, sphere_gear *child)
+{
+ if (child == parent) abort();
+
+ /* Add child to parent's list of neighbors */
+ if (! gear_list_member (child, parent->neighbors, parent->nneighbors))
+ {
+ gear_list_push (child,
+ &parent->neighbors,
+ &parent->nneighbors,
+ &parent->neighbors_size);
+ /* fprintf(stderr, "neighbor %2d -> %2d (%d)\n", parent->id, child->id,
+ parent->nneighbors); */
+ }
+
+ /* Add parent to child's list of neighbors */
+ if (! gear_list_member (parent, child->neighbors, child->nneighbors))
+ {
+ gear_list_push (parent,
+ &child->neighbors,
+ &child->nneighbors,
+ &child->neighbors_size);
+ /* fprintf(stderr, "neighbor %2d <- %2d\n", parent->id, child->id); */
+ }
+}
+
+/* Mark child as having parent, and vice versa.
+ */
+static void
+link_child (sphere_gear *parent, sphere_gear *child)
+{
+ if (child == parent) abort();
+ if (child->parent) return;
+
+ gear_list_push (child,
+ &parent->children,
+ &parent->nchildren,
+ &parent->children_size);
+ child->parent = parent;
+ /* fprintf(stderr, "child %2d -> %2d (%d)\n", parent->id, child->id,
+ parent->nchildren); */
+}
+
+
+
+static void link_children (sphere_gear *);
+
+static void
+link_children (sphere_gear *parent)
+{
+ int i;
+# if 1 /* depth first */
+ for (i = 0; i < parent->nneighbors; i++)
+ {
+ sphere_gear *child = parent->neighbors[i];
+ if (! child->parent)
+ {
+ link_child (parent, child);
+ link_children (child);
+ }
+ }
+# else /* breadth first */
+ for (i = 0; i < parent->nneighbors; i++)
+ {
+ sphere_gear *child = parent->neighbors[i];
+ if (! child->parent)
+ link_child (parent, child);
+ }
+ for (i = 0; i < parent->nchildren; i++)
+ {
+ sphere_gear *child = parent->children[i];
+ link_children (child);
+ }
+# endif
+}
+
+
+
+/* Whether the two gears touch.
+ */
+static Bool
+gears_touch_p (ModeInfo *mi, sphere_gear *a, sphere_gear *b)
+{
+ /* We need to know if the two discs on the surface overlap.
+
+ Find the angle between the axis of each disc, and a point on its edge:
+ the axis between the hypotenuse and adjacent of a right triangle between
+ the disc's radius and the origin.
+
+ R
+ _____
+ |_| /
+ | /
+ 1 | /
+ |t/ t = asin(R)
+ |/
+
+ Find the angle between the axes of the two discs.
+
+ |
+ | / angle = acos (v1 dot v2)
+ 1 | / axis = v1 cross v2
+ | / 1
+ | /
+ |/
+
+ If the sum of the first two angles is less than the third angle,
+ they touch.
+ */
+ XYZ p1 = a->axis;
+ XYZ p2 = b->axis;
+ double t1 = asin (a->g->r);
+ double t2 = asin (b->g->r);
+ double th = acos (dot_product (p1, p2));
+
+ return (t1 + t2 >= th);
+}
+
+
+/* Set the rotation direction for the gear and its kids.
+ */
+static void
+orient_gears (ModeInfo *mi, sphere_gear *g)
+{
+ int i;
+ if (g->parent)
+ g->direction = -g->parent->direction;
+ for (i = 0; i < g->nchildren; i++)
+ orient_gears (mi, g->children[i]);
+}
+
+
+/* Returns the global model coordinates of the given tooth of a gear.
+ */
+static XYZ
+tooth_coords (const sphere_gear *s, int tooth)
+{
+ const gear *g = s->g;
+ GLfloat off = s->offset * (M_PI / 180) * g->ratio * s->direction;
+ GLfloat th = (tooth * M_PI * 2 / g->nteeth) - off;
+ XYZ axis;
+ GLfloat angle;
+ XYZ from = { 0, 1, 0 };
+ XYZ to = s->axis;
+ XYZ p0, p1, p2;
+ GLfloat x, y, z, C, S, m[4][4];
+
+ axis = cross_product (from, to);
+ angle = acos (dot_product (from, to));
+
+ p0 = normalize (axis);
+ x = p0.x;
+ y = p0.y;
+ z = p0.z;
+ C = cos(angle);
+ S = sin(angle);
+
+ /* this is what glRotatef does */
+ m[0][0] = x*x * (1 - C) + C;
+ m[1][0] = x*y * (1 - C) - z*S;
+ m[2][0] = x*z * (1 - C) + y*S;
+ m[3][0] = 0;
+
+ m[0][1] = y*x * (1 - C) + z*S;
+ m[1][1] = y*y * (1 - C) + C;
+ m[2][1] = y*z * (1 - C) - x*S;
+ m[3][1] = 0;
+
+ m[0][2] = x*z * (1 - C) - y*S;
+ m[1][2] = y*z * (1 - C) + x*S;
+ m[2][2] = z*z * (1 - C) + C;
+ m[3][2] = 0;
+
+ m[0][3] = 0;
+ m[1][3] = 0;
+ m[2][3] = 0;
+ m[3][3] = 1;
+
+ /* The point to transform */
+ p1.x = g->r * sin (th);
+ p1.z = g->r * cos (th);
+ p1.y = 1 - g->z;
+ p1 = normalize (p1);
+
+ /* transformation result */
+ p2.x = p1.x * m[0][0] + p1.y * m[1][0] + p1.z * m[2][0] + m[3][0];
+ p2.y = p1.x * m[0][1] + p1.y * m[1][1] + p1.z * m[2][1] + m[3][1];
+ p2.z = p1.x * m[0][2] + p1.y * m[1][2] + p1.z * m[2][2] + m[3][2];
+
+ return p2;
+}
+
+
+/* Returns the number of the tooth of the first gear that is closest
+ to any tooth of its parent. Also the position of the parent tooth.
+ */
+static int
+parent_tooth (const sphere_gear *s, XYZ *parent)
+{
+ const sphere_gear *s2 = s->parent;
+ int i, j;
+ GLfloat min_dist = 99999;
+ int min_tooth = 0;
+ XYZ min_parent = { 0, 0, 0 };
+
+ if (s2)
+ for (i = 0; i < s->g->nteeth; i++)
+ {
+ XYZ p1 = tooth_coords (s, i);
+ for (j = 0; j < s2->g->nteeth; j++)
+ {
+ XYZ p2 = tooth_coords (s2, j);
+ XYZ d;
+ GLfloat dist;
+ d.x = p1.x - p2.x;
+ d.y = p1.y - p2.y;
+ d.z = p1.z - p2.z;
+
+ dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
+ if (dist < min_dist)
+ {
+ min_dist = dist;
+ min_parent = p2;
+ min_tooth = i;
+ }
+ }
+ }
+ *parent = min_parent;
+ return min_tooth;
+}
+
+
+/* Make all of the gear's children's teeth mesh properly.
+ */
+static void align_gear_teeth (sphere_gear *s);
+static void
+align_gear_teeth (sphere_gear *s)
+{
+ int i;
+ XYZ pc;
+
+ if (s->parent)
+ {
+ /* Iterate this gear's offset until we find a value for it that
+ minimizes the distance between this gear's parent-pointing
+ tooth, and the corresponding tooth on the parent.
+ */
+ int pt = parent_tooth (s, &pc);
+ GLfloat range = 360 / s->g->nteeth;
+ GLfloat steps = 64;
+ GLfloat min_dist = 999999;
+ GLfloat min_off = 0;
+ GLfloat off;
+
+ for (off = -range/2; off < range/2; off += range/steps)
+ {
+ XYZ tc, d;
+ GLfloat dist;
+ s->offset = off;
+ tc = tooth_coords (s, pt);
+ d.x = pc.x - tc.x;
+ d.y = pc.y - tc.y;
+ d.z = pc.z - tc.z;
+ dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
+ if (dist < min_dist)
+ {
+ min_dist = dist;
+ min_off = off;
+ }
+ }
+
+ s->offset = min_off;
+ }
+
+ /* Now do the children. We have to do it in parent/child order because
+ the offset we just computed for the parent affects everyone downstream.
+ */
+ for (i = 0; i < s->nchildren; i++)
+ align_gear_teeth (s->children[i]);
+}
+
+
+
+static void
+describe_gears (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int gears_per_teeth[1000];
+ int i;
+ int lines = 0;
+ memset (gears_per_teeth, 0, sizeof(gears_per_teeth));
+ for (i = 0; i < bp->ngears; i++)
+ gears_per_teeth[bp->gears[i].g->nteeth]++;
+ if (bp->desc) free (bp->desc);
+ bp->desc = (char *) malloc (80 * bp->ngears);
+ *bp->desc = 0;
+ for (i = 0; i < countof(gears_per_teeth); i++)
+ if (gears_per_teeth[i])
+ {
+ sprintf (bp->desc + strlen(bp->desc),
+ "%s%d gears with %d teeth",
+ (lines > 0 ? ",\n" : ""),
+ gears_per_teeth[i], i);
+ lines++;
+ }
+ if (lines > 1)
+ sprintf (bp->desc + strlen(bp->desc), ",\n%d gears total", bp->ngears);
+ strcat (bp->desc, ".");
+}
+
+
+/* Takes the gears and makes an arbitrary DAG of them in order to compute
+ direction and gear ratios.
+ */
+static void
+sort_gears (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ sphere_gear *root = 0;
+ int i, j;
+
+ /* For each gear, compare it against every other gear.
+ If they touch, mark them as being each others' neighbors.
+ */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *a = &bp->gears[i];
+ for (j = 0; j < bp->ngears; j++)
+ {
+ sphere_gear *b = &bp->gears[j];
+ if (a == b) continue;
+ if (gears_touch_p (mi, a, b))
+ link_neighbors (a, b);
+ }
+ }
+
+ bp->gears[0].parent = &bp->gears[0]; /* don't give this one a parent */
+ link_children (&bp->gears[0]);
+ bp->gears[0].parent = 0;
+
+
+# if 0
+ for (i = 0; i < bp->ngears; i++)
+ {
+ fprintf (stderr, "%2d: p = %2d; k(%d, %d) = ",
+ i,
+ bp->gears[i].parent ? bp->gears[i].parent->id : -1,
+ bp->gears[i].nneighbors,
+ bp->gears[i].nchildren);
+ for (j = 0; j < bp->gears[i].nneighbors; j++)
+ fprintf (stderr, "%2d ", (int) bp->gears[i].neighbors[j]->id);
+ fprintf (stderr, "\t\t");
+ if (j < 5) fprintf (stderr, "\t");
+ for (j = 0; j < bp->gears[i].nchildren; j++)
+ fprintf (stderr, "%2d ", (int) bp->gears[i].children[j]->id);
+ fprintf (stderr,"\n");
+ }
+ fprintf (stderr,"\n");
+# endif /* 0 */
+
+
+ /* If there is more than one gear with no parent, we fucked up. */
+
+ root = 0;
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *g = &bp->gears[i];
+ if (!g->parent)
+ root = g;
+ }
+
+ if (! root) abort();
+
+ root->direction = 1;
+ orient_gears (mi, root);
+
+ /* If there are any gears with no direction, they aren't reachable. */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *g = &bp->gears[i];
+ if (g->direction == 0)
+ fprintf(stderr,"INTERNAL ERROR: unreachable: %d\n", g->id);
+ }
+
+ align_gear_teeth (root);
+ describe_gears (mi);
+}
+
+
+/* Create 5 identical gears arranged on the faces of a uniform
+ triangular prism.
+ */
+static void
+make_prism (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g;
+ XYZ a;
+ int i;
+ int teeth = 4 * (4 + (int) (BELLRAND(20)));
+ if (teeth % 4) abort(); /* must be a multiple of 4 */
+
+ g = add_gear_shape (mi, 0.7075, teeth);
+
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ a.z = 0;
+ for (i = 0; i < 3; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 3;
+ a.x = cos (th);
+ a.y = sin (th);
+ add_sphere_gear (mi, g, a);
+ }
+
+ if (bp->ngears != 5) abort();
+}
+
+
+/* Create 8 identical gears arranged on the faces of an octohedron
+ (or alternately, arranged on the diagonals of a cube.)
+ */
+static void
+make_octo (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ static const XYZ verts[] = {{ -1, -1, -1 },
+ { -1, -1, 1 },
+ { -1, 1, 1 },
+ { -1, 1, -1 },
+ { 1, -1, 1 },
+ { 1, -1, -1 },
+ { 1, 1, -1 },
+ { 1, 1, 1 }};
+ gear *g;
+ int i;
+ int teeth = 4 * (4 + (int) (BELLRAND(20)));
+ if (teeth % 4) abort(); /* must be a multiple of 4 */
+
+ g = add_gear_shape (mi, 0.578, teeth);
+ for (i = 0; i < countof(verts); i++)
+ add_sphere_gear (mi, g, verts[i]);
+
+ if (bp->ngears != 8) abort();
+}
+
+
+/* Create 10 identical gears arranged on the faces of ... something.
+ I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_deca (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g;
+ XYZ a;
+ int i, j;
+ int teeth = 4 * (4 + (int) (BELLRAND(15)));
+ if (teeth % 4) abort(); /* must be a multiple of 4 */
+
+ g = add_gear_shape (mi, 0.5415, teeth);
+
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ for (j = -1; j <= 1; j += 2)
+ {
+ GLfloat off = (j < 0 ? 0 : M_PI / 4);
+ LL v;
+ v.a = j * M_PI * 0.136; /* #### Empirical. What is this? */
+ for (i = 0; i < 4; i++)
+ {
+ v.o = i * M_PI / 2 + off;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ }
+ }
+ if (bp->ngears != 10) abort();
+}
+
+
+/* Create 14 identical gears arranged on the faces of ... something.
+ I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_14 (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g;
+ XYZ a;
+ int i;
+ GLfloat r = 0.4610;
+ int teeth = 6 * (2 + (int) (BELLRAND(4)));
+ if (teeth % 6) abort(); /* must be a multiple of 6. I think? */
+ /* mismeshes: 24 30 34 36 42 48 54 60 */
+
+ /* North, south */
+ g = add_gear_shape (mi, r, teeth);
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ /* Equator */
+ a.z = 0;
+ for (i = 0; i < 4; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 4 + (M_PI / 4);
+ a.x = cos(th);
+ a.y = sin(th);
+ add_sphere_gear (mi, g, a);
+ }
+
+ /* The other 8 */
+ g = add_gear_shape (mi, r, teeth);
+
+ for (i = 0; i < 4; i++)
+ {
+ LL v;
+ v.a = M_PI * 0.197; /* #### Empirical. Also, wrong. What is this? */
+ v.o = i * M_PI * 2 / 4;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ v.a = -v.a;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ }
+
+ if (bp->ngears != 14) abort();
+}
+
+
+/* Create 18 identical gears arranged on the faces of ... something.
+ I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_18 (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g, *g2;
+ XYZ a;
+ int i;
+ GLfloat r = 0.3830;
+ int sizes[] = { 8, 12, 16, 20 }; /* 10, 14, 18, 26 and 34 don't work */
+ int teeth = sizes[random() % countof(sizes)] * (1 + (random() % 4));
+
+ /* North, south */
+ g = add_gear_shape (mi, r, teeth);
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ /* Equator */
+ g2 = add_gear_shape (mi, r, teeth);
+ a.z = 0;
+ for (i = 0; i < 8; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 8 + (M_PI / 4);
+ a.x = cos(th);
+ a.y = sin(th);
+ add_sphere_gear (mi, (i & 1 ? g : g2), a);
+ }
+
+ /* The other 16 */
+ g = add_gear_shape (mi, r, teeth);
+
+ for (i = 0; i < 4; i++)
+ {
+ LL v;
+ v.a = M_PI * 0.25;
+ v.o = i * M_PI * 2 / 4;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ v.a = -v.a;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ }
+
+ if (bp->ngears != 18) abort();
+}
+
+
+/* Create 32 gears arranged along a truncated icosahedron:
+ One gear on each of the 20 faces, and one on each of the 12 vertices.
+ */
+static void
+make_32 (ModeInfo *mi, const GLfloat *args)
+{
+ /* http://bugman123.com/Gears/32GearSpheres/ */
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+
+ int teeth1 = args[0];
+ int teeth2 = args[1];
+ GLfloat r1 = args[2];
+ GLfloat ratio = teeth2 / (GLfloat) teeth1;
+ GLfloat r2 = r1 * ratio;
+
+ gear *gear1, *gear2;
+
+ if (teeth1 % 5) abort();
+ if (teeth2 % 6) abort();
+
+ gear1 = add_gear_shape (mi, r1, teeth1);
+ gear2 = add_gear_shape (mi, r2, teeth2);
+ gear2->ratio = 1 / ratio;
+
+ {
+ XYZ a = { 0, 0, 1 };
+ XYZ b = { 0, 0, -1 };
+ add_sphere_gear (mi, gear1, a);
+ add_sphere_gear (mi, gear1, b);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ XYZ p1, p2, p3, pc, pc2;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (! (i & 1)) /* southern hemisphere */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ }
+
+ p1 = polar_to_cartesian (v1);
+ p2 = polar_to_cartesian (v2);
+ p3 = polar_to_cartesian (v3);
+ pc = polar_to_cartesian (vc);
+
+ /* Two faces: 123 and 12c. */
+
+ add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
+
+ pc2.x = (p1.x + p2.x + p3.x) / 3; /* center of bottom triangle */
+ pc2.y = (p1.y + p2.y + p3.y) / 3;
+ pc2.z = (p1.z + p2.z + p3.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+
+ pc2.x = (p1.x + p2.x + pc.x) / 3; /* center of top triangle */
+ pc2.y = (p1.y + p2.y + pc.y) / 3;
+ pc2.z = (p1.z + p2.z + pc.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+ }
+
+ if (bp->ngears != 32) abort();
+}
+
+
+/* Create 92 gears arranged along a geodesic sphere: 20 + 12 + 60.
+ (frequency 3v, class-I geodesic tessellation of an icosahedron)
+ */
+static void
+make_92 (ModeInfo *mi, const GLfloat *args)
+{
+ /* http://bugman123.com/Gears/92GearSpheres/ */
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+
+ int tscale = 2; /* These don't mesh properly, so let's increase the
+ number of teeth so that it's not so obvious. */
+
+ int teeth1 = args[0] * tscale;
+ int teeth2 = args[1] * tscale;
+ int teeth3 = args[2] * tscale;
+ GLfloat r1 = args[3];
+ GLfloat ratio2 = teeth2 / (GLfloat) teeth1;
+ GLfloat ratio3 = teeth3 / (GLfloat) teeth2;
+ GLfloat r2 = r1 * ratio2;
+ GLfloat r3 = r2 * ratio3;
+
+ GLfloat r4 = args[4]; /* #### Empirical. Not sure what its basis is. */
+ GLfloat r5 = 1 - r4;
+
+ gear *gear1, *gear2, *gear3;
+
+ gear1 = add_gear_shape (mi, r1, teeth1);
+ gear2 = add_gear_shape (mi, r2, teeth2);
+ gear3 = add_gear_shape (mi, r3, teeth3);
+ gear2->ratio = 1 / ratio2;
+ gear3->ratio = 1 / ratio3;
+
+ {
+ XYZ a = { 0, 0, 1 };
+ XYZ b = { 0, 0, -1 };
+ add_sphere_gear (mi, gear1, a);
+ add_sphere_gear (mi, gear1, b);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ XYZ p1, p2, p3, pc, pc2;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (! (i & 1)) /* southern hemisphere */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ }
+
+ p1 = polar_to_cartesian (v1);
+ p2 = polar_to_cartesian (v2);
+ p3 = polar_to_cartesian (v3);
+ pc = polar_to_cartesian (vc);
+
+ /* Two faces: 123 and 12c. */
+
+ add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
+
+ pc2.x = (p1.x + p2.x + p3.x) / 3; /* center of bottom triangle */
+ pc2.y = (p1.y + p2.y + p3.y) / 3;
+ pc2.z = (p1.z + p2.z + p3.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+
+ pc2.x = (p1.x + p2.x + pc.x) / 3; /* center of top triangle */
+ pc2.y = (p1.y + p2.y + pc.y) / 3;
+ pc2.z = (p1.z + p2.z + pc.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+
+ /* left edge of bottom triangle, 1/3 in */
+ pc2.x = p1.x + (p3.x - p1.x) * r4;
+ pc2.y = p1.y + (p3.y - p1.y) * r4;
+ pc2.z = p1.z + (p3.z - p1.z) * r4;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* left edge of bottom triangle, 2/3 in */
+ pc2.x = p1.x + (p3.x - p1.x) * r5;
+ pc2.y = p1.y + (p3.y - p1.y) * r5;
+ pc2.z = p1.z + (p3.z - p1.z) * r5;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* left edge of top triangle, 1/3 in */
+ pc2.x = p1.x + (pc.x - p1.x) * r4;
+ pc2.y = p1.y + (pc.y - p1.y) * r4;
+ pc2.z = p1.z + (pc.z - p1.z) * r4;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* left edge of top triangle, 2/3 in */
+ pc2.x = p1.x + (pc.x - p1.x) * r5;
+ pc2.y = p1.y + (pc.y - p1.y) * r5;
+ pc2.z = p1.z + (pc.z - p1.z) * r5;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* center of shared edge, 1/3 in */
+ pc2.x = p1.x + (p2.x - p1.x) * r4;
+ pc2.y = p1.y + (p2.y - p1.y) * r4;
+ pc2.z = p1.z + (p2.z - p1.z) * r4;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* center of shared edge, 2/3 in */
+ pc2.x = p1.x + (p2.x - p1.x) * r5;
+ pc2.y = p1.y + (p2.y - p1.y) * r5;
+ pc2.z = p1.z + (p2.z - p1.z) * r5;
+ add_sphere_gear (mi, gear3, pc2);
+ }
+
+ if (bp->ngears != 92) abort();
+}
+
+static void
+make_182 (ModeInfo *mi, const GLfloat *args)
+{
+ /* #### TODO: http://bugman123.com/Gears/182GearSpheres/ */
+ abort();
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_geodesic (ModeInfo *mi, int width, int height)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+pick_shape (ModeInfo *mi, time_t last)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int count = countof (gear_templates);
+
+ if (bp->colors)
+ free (bp->colors);
+
+ bp->ncolors = 1024;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ free_sphere_gears (mi);
+
+ if (last == 0)
+ {
+ bp->which = random() % count;
+ }
+ else if (bp->next < 0)
+ {
+ bp->which--;
+ if (bp->which < 0) bp->which = count-1;
+ bp->next = 0;
+ }
+ else if (bp->next > 0)
+ {
+ bp->which++;
+ if (bp->which >= count) bp->which = 0;
+ bp->next = 0;
+ }
+ else
+ {
+ int n = bp->which;
+ while (n == bp->which)
+ n = random() % count;
+ bp->which = n;
+ }
+
+ switch (gear_templates[bp->which].type) {
+ case PRISM: make_prism (mi); break;
+ case OCTO: make_octo (mi); break;
+ case DECA: make_deca (mi); break;
+ case G14: make_14 (mi); break;
+ case G18: make_18 (mi); break;
+ case G32: make_32 (mi, gear_templates[bp->which].args); break;
+ case G92: make_92 (mi, gear_templates[bp->which].args); break;
+ case G182: make_182(mi, gear_templates[bp->which].args); break;
+ default: abort(); break;
+ }
+
+ sort_gears (mi);
+}
+
+
+
+ENTRYPOINT void
+init_geodesic (ModeInfo *mi)
+{
+ geodesic_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_geodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ {
+ static GLfloat cspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat shiny = 128.0;
+
+ static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ static GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ static GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ static GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ }
+
+ if (! wire)
+ {
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ }
+
+ if (! bp->rot)
+ {
+ double spin_speed = 0.25 * speed;
+ double wander_speed = 0.01 * speed;
+ double spin_accel = 0.2;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->font = load_texture_font (MI_DISPLAY(mi), "font");
+
+ pick_shape (mi, 0);
+}
+
+
+ENTRYPOINT Bool
+geodesic_handle_event (ModeInfo *mi, XEvent *event)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else
+ {
+ if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '<' || c == ',' || c == '-' || c == '_' ||
+ keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
+ {
+ bp->next = -1;
+ goto SWITCH;
+ }
+ else if (c == '>' || c == '.' || c == '=' || c == '+' ||
+ keysym == XK_Right || keysym == XK_Down ||
+ keysym == XK_Next)
+ {
+ bp->next = 1;
+ goto SWITCH;
+ }
+ }
+
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ SWITCH:
+ bp->mode = 1;
+ bp->mode_tick = 4;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_geodesic (ModeInfo *mi)
+{
+ time_t now = time ((time_t *) 0);
+ int wire = MI_IS_WIREFRAME(mi);
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+
+ if (bp->draw_time == 0)
+ {
+ pick_shape (mi, bp->draw_time);
+ bp->draw_time = now;
+ }
+ else if (bp->mode == 0)
+ {
+ if (bp->draw_tick++ > 10)
+ {
+ if (bp->draw_time == 0) bp->draw_time = now;
+ bp->draw_tick = 0;
+
+ if (!bp->button_down_p &&
+ bp->draw_time + timeout <= now)
+ {
+ /* randomize every -timeout seconds */
+ bp->mode = 1; /* go out */
+ bp->mode_tick = 10 / speed;
+ bp->draw_time = now;
+ }
+ }
+ }
+ else if (bp->mode == 1) /* out */
+ {
+ if (--bp->mode_tick <= 0)
+ {
+ bp->mode_tick = 10 / speed;
+ bp->mode = 2; /* go in */
+ pick_shape (mi, bp->draw_time);
+ bp->draw_time = now;
+ }
+ }
+ else if (bp->mode == 2) /* in */
+ {
+ if (--bp->mode_tick <= 0)
+ bp->mode = 0; /* normal */
+ }
+ else
+ abort();
+
+
+ if (! wire)
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 17);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (6, 6, 6);
+
+ if (bp->ngears < 14)
+ glScalef (0.8, 0.8, 0.8); /* make these a little easier to see */
+
+ if (bp->mode != 0)
+ {
+ GLfloat s = (bp->mode == 1
+ ? bp->mode_tick / (10 / speed)
+ : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
+ glScalef (s, s, s);
+ }
+
+
+ {
+ int i;
+ for (i = 0; i < bp->ngears; i++)
+ {
+ const sphere_gear *s = &bp->gears[i];
+ const gear *g = s->g;
+
+ XYZ axis;
+ XYZ from = { 0, 1, 0 };
+ XYZ to = s->axis;
+ GLfloat angle;
+ GLfloat off = s->offset;
+
+ /* If an even number of teeth, offset by 1/2 tooth width. */
+ if (s->direction > 0 && !(g->nteeth & 1))
+ off += 360 / g->nteeth / 2;
+
+ axis = cross_product (from, to);
+ angle = acos (dot_product (from, to));
+
+ glPushMatrix();
+ glTranslatef (to.x, to.y, to.z);
+ glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
+ glRotatef (-90, 1, 0, 0);
+ glRotatef(180, 0, 0, 1);
+ glRotatef ((bp->th - off) * g->ratio * s->direction,
+ 0, 0, 1);
+
+ glCallList (g->dlist);
+ mi->polygon_count += g->polygons;
+ glPopMatrix();
+
+#if 0
+ { /* Draw tooth vectors */
+ GLfloat r = 1 - g->z;
+ XYZ pc;
+ int pt = parent_tooth (s, &pc);
+ int t;
+ glDisable(GL_LIGHTING);
+ glLineWidth (8);
+ for (t = 0; t < g->nteeth; t++)
+ {
+ XYZ p = tooth_coords (s, t);
+ XYZ p2;
+ p2.x = (r * s->axis.x + p.x) / 2;
+ p2.y = (r * s->axis.y + p.y) / 2;
+ p2.z = (r * s->axis.z + p.z) / 2;
+
+ if (t == pt)
+ glColor3f(1,0,1);
+ else
+ glColor3f(0,1,1);
+ glBegin(GL_LINES);
+ glVertex3f (p.x, p.y, p.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+ glEnd();
+ }
+ if (!wire) glEnable(GL_LIGHTING);
+ glLineWidth (1);
+ }
+#endif
+
+#if 0
+ { /* Draw the parent/child DAG */
+ GLfloat s1 = 1.1;
+ GLfloat s2 = s->parent ? s1 : 1.5;
+ GLfloat s3 = 1.0;
+ XYZ p1 = s->axis;
+ XYZ p2 = s->parent ? s->parent->axis : p1;
+ glDisable(GL_LIGHTING);
+ glColor3f(0,0,1);
+ glBegin(GL_LINES);
+ glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
+ glVertex3f (s2 * p2.x, s2 * p2.y, s2 * p2.z);
+ glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
+ glVertex3f (s3 * p1.x, s3 * p1.y, s3 * p1.z);
+ glEnd();
+ if (!wire) glEnable(GL_LIGHTING);
+ }
+#endif
+ }
+
+ /* We need to draw the fonts in a second pass in order to make
+ transparency (as a result of anti-aliasing) work properly.
+ */
+ if (do_numbers && bp->mode == 0)
+ for (i = 0; i < bp->ngears; i++)
+ {
+ const sphere_gear *s = &bp->gears[i];
+ const gear *g = s->g;
+
+ XYZ axis;
+ XYZ from = { 0, 1, 0 };
+ XYZ to = s->axis;
+ GLfloat angle;
+ GLfloat off = s->offset;
+
+ int w, h, j;
+ char buf[100];
+ XCharStruct e;
+
+ /* If an even number of teeth, offset by 1/2 tooth width. */
+ if (s->direction > 0 /* && !(g->nteeth & 1) */)
+ off += 360 / g->nteeth / 2;
+
+ axis = cross_product (from, to);
+ angle = acos (dot_product (from, to));
+
+ glPushMatrix();
+ glTranslatef(to.x, to.y, to.z);
+ glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
+ glRotatef (-90, 1, 0, 0);
+ glRotatef(180, 0, 0, 1);
+ glRotatef ((bp->th - off) * g->ratio * s->direction,
+ 0, 0, 1);
+
+ glDisable (GL_LIGHTING);
+ glColor3f(1, 1, 0);
+ glPushMatrix();
+ glScalef(0.005, 0.005, 0.005);
+ sprintf (buf, "%d", i);
+ texture_string_metrics (bp->font, buf, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+ glTranslatef (-w/2, -h/2, 0);
+ print_texture_string (bp->font, buf);
+ glPopMatrix();
+
+# if 1
+ for (j = 0; j < g->nteeth; j++) /* Number the teeth */
+ {
+ GLfloat ss = 0.08 * g->r / g->nteeth;
+ GLfloat r = g->r * 0.88;
+ GLfloat th = M_PI - (j * M_PI * 2 / g->nteeth + M_PI/2);
+
+
+ glPushMatrix();
+ glTranslatef (r * cos(th), r * sin(th), -g->z + 0.01);
+ glScalef(ss, ss, ss);
+ sprintf (buf, "%d", j + 1);
+ texture_string_metrics (bp->font, buf, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+ glTranslatef (-w/2, -h/2, 0);
+ print_texture_string (bp->font, buf);
+ glPopMatrix();
+ }
+# endif
+ glPopMatrix();
+ if (!wire) glEnable(GL_LIGHTING);
+ }
+
+ bp->th += 0.7 * speed; /* Don't mod this to 360 - causes glitches. */
+ }
+
+ if (do_labels && bp->mode == 0)
+ {
+ glColor3f (1, 1, 0);
+ print_texture_label (mi->dpy, bp->font,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, bp->desc);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_geodesic (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (!bp->glx_context)
+ return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+ free_texture_font (bp->font);
+ free (bp->colors);
+ free_sphere_gears (mi);
+ if (bp->desc) free (bp->desc);
+}
+
+
+XSCREENSAVER_MODULE_2 ("GeodesicGears", geodesicgears, geodesic)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/geodesicgears.man b/hacks/glx/geodesicgears.man
new file mode 100644
index 0000000..b15cf90
--- /dev/null
+++ b/hacks/glx/geodesicgears.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+geodesicgears - gears on the surface of a sphere.
+.SH SYNOPSIS
+.B geodesicgears
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-timeout \fInumber\fP]
+[\-labels]
+[\-numbers]
+[\-wireframe]
+[\-wander]
+[\-no-spin]
+[\-fps]
+.SH DESCRIPTION
+A set of meshed gears arranged on the surface of a sphere.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-timeout \fInumber\fP
+Duration before switching to a new model. 5 - 120 seconds. Default: 20.
+.TP 8
+.B \-labels | \-no-labels
+Whether to show the number of gears and teeth. Default: no.
+.TP 8
+.B \-numbers | \-no-numbers
+Whether to label the gears with ID numbers. Default: no.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR geodesic (1),
+.BR pinion (1)
+.SH COPYRIGHT
+Copyright \(co 2014 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/gflux.c b/hacks/glx/gflux.c
new file mode 100644
index 0000000..dbbb11c
--- /dev/null
+++ b/hacks/glx/gflux.c
@@ -0,0 +1,803 @@
+/* -*- Mode: C; tab-width: 4 -*- emacs friendly */
+/* gflux - creates a fluctuating 3D grid
+ * requires OpenGL or MesaGL
+ *
+ * Copyright (c) Josiah Pease, 2000, 2003
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Thanks go to all those who worked on...
+ * MesaGL, OpenGL, UtahGLX, XFree86, gcc, vim, rxvt, the PNM (anymap) format
+ * xscreensaver and the thousands of other tools, apps and daemons that make
+ * linux usable
+ * Personal thanks to Kevin Moss, Paul Sheahee and Jamie Zawinski
+ *
+ * some xscreensaver code lifted from superquadrics. Most other glx hacks
+ * used as reference at some time.
+ *
+ * This hack and others can cause UtahGLX to crash my X server
+ * wireframe looks good with software only rendering anyway
+ * If anyone can work out why and supply a fix I'd love to hear from them
+ *
+ * Josiah Pease <gfluxcode@jpease.force9.co.uk> 21 July 2000
+ *
+ * History
+ * 10 June 2000 : wireframe rippling grid standalone written
+ * 18 June 2000 : xscreensaver code added
+ * 25 June 2000 : solid and light added
+ * 04 July 2000 : majour bug hunt, xscreensaver code rewritten
+ * 08 July 2000 : texture mapping, rotation and zoom added
+ * 21 July 2000 : cleaned up code from bug hunts, manpage written
+ * 24 November 2000 : fixed x co-ord calculation in solid - textured
+ * 05 March 2001 : put back non pnmlib code with #ifdefs
+ * 11 May 2002 : fixed image problems with large images
+ */
+
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000\n" \
+ "*showFPS: False\n" \
+ "*mode: grab\n" \
+ "*useSHM: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_gflux 0
+# define release_gflux 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <math.h>
+
+#include "grab-ximage.h"
+#include "gltrackball.h"
+
+
+static enum {wire=0,solid,light,checker,grab} _draw;
+
+# define DEF_SQUARES "19"
+# define DEF_RESOLUTION "4"
+# define DEF_DRAW "2"
+# define DEF_FLAT "0"
+# define DEF_SPEED "0.05"
+# define DEF_ROTATIONX "0.01"
+# define DEF_ROTATIONY "0.0"
+# define DEF_ROTATIONZ "0.1"
+# define DEF_WAVES "3"
+# define DEF_WAVE_CHANGE "50"
+# define DEF_WAVE_HEIGHT "1.0"
+# define DEF_WAVE_FREQ "3.0"
+# define DEF_ZOOM "1.0"
+
+
+
+static int _squares; /* grid size */
+static int _resolution; /* wireframe resolution */
+static int _flat;
+
+static float _speed;
+static float _rotationx;
+static float _rotationy;
+static float _rotationz;
+static float _zoom;
+
+static int _waves;
+static int _waveChange;
+static float _waveHeight;
+static float _waveFreq;
+
+
+#define WIDTH 320
+#define HEIGHT 240
+
+static XrmOptionDescRec opts[] = {
+ {"-squares", ".gflux.squares", XrmoptionSepArg, 0},
+ {"-resolution", ".gflux.resolution", XrmoptionSepArg, 0},
+/* {"-draw", ".gflux.draw", XrmoptionSepArg, 0},*/
+ {"-mode", ".gflux.mode", XrmoptionSepArg, 0},
+ {"-wireframe", ".gflux.mode", XrmoptionNoArg, "wire"},
+ {"-flat", ".gflux.flat", XrmoptionSepArg, 0},
+ {"-speed", ".gflux.speed", XrmoptionSepArg, 0},
+ {"-rotationx", ".gflux.rotationx", XrmoptionSepArg, 0},
+ {"-rotationy", ".gflux.rotationy", XrmoptionSepArg, 0},
+ {"-rotationz", ".gflux.rotationz", XrmoptionSepArg, 0},
+ {"-waves", ".gflux.waves", XrmoptionSepArg, 0},
+ {"-waveChange", ".gflux.waveChange", XrmoptionSepArg, 0},
+ {"-waveHeight", ".gflux.waveHeight", XrmoptionSepArg, 0},
+ {"-waveFreq", ".gflux.waveFreq", XrmoptionSepArg, 0},
+ {"-zoom", ".gflux.zoom", XrmoptionSepArg, 0},
+};
+
+
+static argtype vars[] = {
+ {&_squares, "squares", "Squares", DEF_SQUARES, t_Int},
+ {&_resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+/* {&_draw, "draw", "Draw", DEF_DRAW, t_Int},*/
+ {&_flat, "flat", "Flat", DEF_FLAT, t_Int},
+ {&_speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&_rotationx, "rotationx", "Rotationx", DEF_ROTATIONX, t_Float},
+ {&_rotationy, "rotationy", "Rotationy", DEF_ROTATIONY, t_Float},
+ {&_rotationz, "rotationz", "Rotationz", DEF_ROTATIONZ, t_Float},
+ {&_waves, "waves", "Waves", DEF_WAVES, t_Int},
+ {&_waveChange, "waveChange", "WaveChange", DEF_WAVE_CHANGE, t_Int},
+ {&_waveHeight, "waveHeight", "WaveHeight", DEF_WAVE_HEIGHT, t_Float},
+ {&_waveFreq, "waveFreq", "WaveFreq", DEF_WAVE_FREQ, t_Float},
+ {&_zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
+};
+
+
+static OptionStruct desc[] =
+{
+ {"-squares num", "size of grid in squares (19)"},
+ {"-resolution num", "detail of lines making grid, wireframe only (4)"},
+/* {"-draw num", "draw method to use: 0=wireframe 1=solid 2=lit (0)"},*/
+ {"-flat num", "shading method, not wireframe: 0=smooth 1=flat (0)"},
+ {"-speed num", "speed of waves (0.05)"},
+ {"-rotationx num", "speed of xrotation (0.01)"},
+ {"-rotationy num", "speed of yrotation (0.00)"},
+ {"-rotationz num", "speed of zrotation (0.10)"},
+ {"-waves num", "number of simultanious waves (3)"},
+ {"-waveChange num", "number of cyles for a wave to change (50)"},
+ {"-waveHeight num", "height of waves (1.0)"},
+ {"-waveFreq num", "max frequency of a wave (3.0)"},
+ {"-zoom num", "camera control (1.0)"},
+};
+
+ENTRYPOINT ModeSpecOpt gflux_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct gflux_description =
+{"gflux", "init_gflux", "draw_gflux", NULL,
+ "draw_gflux", "init_gflux", NULL, &gflux_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "GFlux: an OpenGL gflux", 0, NULL};
+#endif
+
+/* structure for holding the gflux data */
+typedef struct gfluxstruct {
+ ModeInfo *modeinfo;
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ XColor fg, bg;
+#define MAXWAVES 10 /* should be dynamic */
+ double wa[MAXWAVES];
+ double freq[MAXWAVES];
+ double dispy[MAXWAVES];
+ double dispx[MAXWAVES];
+ GLfloat colour[3];
+ GLuint texName;
+ GLfloat tex_xscale;
+ GLfloat tex_yscale;
+ XRectangle img_geom;
+ int img_width, img_height;
+ int (*drawFunc)(struct gfluxstruct *);
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ double time;
+ double anglex;
+ double angley;
+ double anglez;
+
+ int counter;
+ int newWave;
+
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+
+} gfluxstruct;
+static gfluxstruct *gfluxes = NULL;
+
+/* prototypes */
+static void initLighting(void);
+static void grabTexture(gfluxstruct *);
+static void createTexture(gfluxstruct *);
+static int displaySolid(gfluxstruct *); /* drawFunc implementations */
+static int displayLight(gfluxstruct *);
+static int displayTexture(gfluxstruct *);
+static int displayWire(gfluxstruct *);
+static void calcGrid(gfluxstruct *);
+static double getGrid(gfluxstruct *,double,double,double);
+
+/* as macro for speed */
+/* could do with colour cycling here */
+/* void genColour(double);*/
+#define genColour(X) \
+{\
+ gp->colour[0] = 0.0;\
+ gp->colour[1] = 0.5+0.5*(X);\
+ gp->colour[2] = 0.5-0.5*(X);\
+}
+
+/* BEGINNING OF FUNCTIONS */
+
+
+ENTRYPOINT Bool
+gflux_handle_event (ModeInfo *mi, XEvent *event)
+{
+ gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ if (_draw == grab) {
+ grabTexture(gp);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+static void
+userRot(gfluxstruct *gp)
+{
+ gltrackball_rotate (gp->trackball);
+}
+
+/* draw the gflux once */
+ENTRYPOINT void draw_gflux(ModeInfo * mi)
+{
+ gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!gp->glx_context) return;
+
+ /* Just keep running before the texture has come in. */
+ /* if (gp->waiting_for_image_p) return; */
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+
+ calcGrid(gp);
+ mi->polygon_count = gp->drawFunc(gp);
+ if (mi->fps_p) do_fps (mi);
+ glXSwapBuffers(display, window);
+}
+
+
+/* Standard reshape function */
+ENTRYPOINT void
+reshape_gflux(ModeInfo *mi, int width, int height)
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-_zoom,_zoom,-0.8*_zoom,0.8*_zoom,2,6);
+ glTranslatef(0.0,0.0,-4.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+}
+
+
+/* main OpenGL initialization routine */
+static void initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
+{
+ gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
+
+ reshape_gflux(mi, width, height);
+ glViewport( 0, 0, width, height );
+
+ gp->tex_xscale = 1.0; /* maybe changed later */
+ gp->tex_yscale = 1.0;
+
+ switch(_draw) {
+ case solid :
+ gp->drawFunc = (displaySolid);
+ glEnable(GL_DEPTH_TEST);
+ break;
+ case light :
+ gp->drawFunc = (displayLight);
+ glEnable(GL_DEPTH_TEST);
+ initLighting();
+ break;
+ case checker :
+ gp->drawFunc = (displayTexture);
+ glEnable(GL_DEPTH_TEST);
+ createTexture(gp);
+ initLighting();
+ break;
+ case grab :
+ gp->drawFunc = (displayTexture);
+ glEnable(GL_DEPTH_TEST);
+ grabTexture(gp);
+ initLighting();
+ break;
+ case wire :
+ default :
+ gp->drawFunc = (displayWire);
+ glDisable(GL_DEPTH_TEST);
+ break;
+ }
+
+ if(_flat) glShadeModel(GL_FLAT);
+ else glShadeModel(GL_SMOOTH);
+
+}
+
+
+/* xgflux initialization routine */
+ENTRYPOINT void init_gflux(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ gfluxstruct *gp;
+
+ MI_INIT(mi, gfluxes);
+ gp = &gfluxes[screen];
+
+ gp->trackball = gltrackball_init (True);
+
+ gp->time = frand(1000.0); /* don't run two screens in lockstep */
+
+ {
+ char *s = get_string_resource (mi->dpy, "mode", "Mode");
+ if (!s || !*s) _draw = grab;
+ else if (!strcasecmp (s, "wire")) _draw = wire;
+ else if (!strcasecmp (s, "solid")) _draw = solid;
+ else if (!strcasecmp (s, "light")) _draw = light;
+ else if (!strcasecmp (s, "checker")) _draw = checker;
+ else if (!strcasecmp (s, "grab")) _draw = grab;
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be one of: wire, solid, "
+ "light, checker, or grab; not \"%s\"\n",
+ progname, s);
+ exit (1);
+ }
+ }
+
+ gp->modeinfo = mi;
+ gp->window = MI_WINDOW(mi);
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_gflux(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+
+static void createTexture(gfluxstruct *gp)
+{
+ int size = 4;
+ unsigned int data[] = { 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF };
+
+ gp->tex_xscale = size;
+ gp->tex_yscale = size;
+
+ glGenTextures (1, &gp->texName);
+ glBindTexture (GL_TEXTURE_2D, gp->texName);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, 3, size, size, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+}
+
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ gfluxstruct *gp = (gfluxstruct *) closure;
+ gp->img_geom = *geometry;
+
+ gp->tex_xscale = (GLfloat) image_width / texture_width;
+ gp->tex_yscale = -(GLfloat) image_height / texture_height;
+ gp->img_width = image_width;
+ gp->img_height = image_height;
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (gp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ gp->waiting_for_image_p = False;
+}
+
+static void
+grabTexture(gfluxstruct *gp)
+{
+ if (MI_IS_WIREFRAME(gp->modeinfo))
+ return;
+
+ gp->waiting_for_image_p = True;
+ gp->mipmap_p = True;
+ load_texture_async (gp->modeinfo->xgwa.screen, gp->modeinfo->window,
+ *gp->glx_context, 0, 0, gp->mipmap_p, gp->texName,
+ image_loaded_cb, gp);
+}
+
+
+static void initLighting(void)
+{
+ static const float ambientA[] = {0.0, 0.0, 0.0, 1.0};
+ static const float diffuseA[] = {1.0, 1.0, 1.0, 1.0};
+ static const float positionA[] = {5.0, 5.0, 15.0, 1.0};
+
+ static const float front_mat_shininess[] = {30.0};
+ static const float front_mat_specular[] = {0.5, 0.5, 0.5, 1.0};
+
+ static const float mat_diffuse[] = {0.5, 0.5, 0.5, 1.0};
+
+ glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambientA);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseA);
+ glLightfv(GL_LIGHT0, GL_POSITION, positionA);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,1);
+
+ glEnable(GL_NORMALIZE); /* would it be faster ... */
+ glEnable(GL_COLOR_MATERIAL);
+ glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
+}
+
+/************************************/
+/* draw implementations */
+/* somewhat inefficient since they */
+/* all calculate previously */
+/* calculated values again */
+/* storing the values in an array */
+/* is a posibility */
+/************************************/
+static int displayTexture(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y,u,v;
+ double z;
+ double dx = 2.0/((double)_squares);
+ double dy = 2.0/((double)_squares);
+
+ double du = 2.0/((double)_squares);
+ double dv = 2.0/((double)_squares);
+
+ double xs = gp->tex_xscale;
+ double ys = gp->tex_yscale;
+
+ double minx, miny, maxx, maxy;
+ double minu, minv;
+
+#if 0
+ minx = (GLfloat) gp->img_geom.x / gp->img_width;
+ miny = (GLfloat) gp->img_geom.y / gp->img_height;
+ maxx = ((GLfloat) (gp->img_geom.x + gp->img_geom.width) /
+ gp->img_width);
+ maxy = ((GLfloat) (gp->img_geom.y + gp->img_geom.height) /
+ gp->img_height);
+ minu = minx;
+ minv = miny;
+ minx = (minx * 2) - 1;
+ miny = (miny * 2) - 1;
+ maxx = (maxx * 2) - 1;
+ maxy = (maxy * 2) - 1;
+#else
+ minx = -1;
+ miny = -1;
+ maxx = 1;
+ maxy = 1;
+ minv = 0;
+ minu = 0;
+#endif
+
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity ();
+ glTranslatef(-1,-1,0);
+ glScalef(0.5,0.5,1);
+ glMatrixMode (GL_MODELVIEW);
+
+ glLoadIdentity();
+ userRot(gp);
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_TEXTURE_2D);
+
+ clear_gl_error();
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glBindTexture(GL_TEXTURE_2D, gp->texName);
+ check_gl_error("texture binding");
+
+ glColor3f(0.5,0.5,0.5);
+
+ for(x = minx, u = minu; x < maxx - 0.01; x += dx, u += du) {
+ glBegin(GL_QUAD_STRIP);
+ for (y = miny, v = minv; y <= maxy + 0.01; y += dy, v += dv) {
+ z = getGrid(gp,x,y,gp->time);
+ glTexCoord2f(u*xs,v*ys);
+ glNormal3f(
+ getGrid(gp,x+dx,y,gp->time)-getGrid(gp, x-dx,y,gp->time),
+ getGrid(gp,x,y+dy,gp->time)-getGrid(gp, x,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x,y,z);
+
+ z = getGrid(gp,x+dx,y,gp->time);
+ glTexCoord2f((u+du)*xs,v*ys);
+ glNormal3f(
+ getGrid(gp,x+dx+dx,y,gp->time)-getGrid(gp, x,y,gp->time),
+ getGrid(gp,x+dx,y+dy,gp->time)-getGrid(gp, x+dx,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x+dx,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* Draw a border around the grid.
+ */
+ glColor3f(0.4, 0.4, 0.4);
+ glDisable(GL_TEXTURE_2D);
+ glEnable (GL_LINE_SMOOTH);
+
+ glBegin(GL_LINE_LOOP);
+ y = miny;
+ for (x = minx; x <= maxx; x += dx) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ x = maxx;
+ for (y = miny; y <= maxy; y += dy) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ y = maxy;
+ for (x = maxx; x >= minx; x -= dx) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ x = minx;
+ for (y = maxy; y >= miny; y -= dy) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ glEnd();
+ glEnable(GL_TEXTURE_2D);
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+ return polys;
+}
+
+static int displaySolid(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y;
+ double z;
+ double dx = 2.0/((double)_squares);
+ double dy = 2.0/((double)_squares);
+
+ glLoadIdentity();
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ userRot(gp);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ for(x=-1;x<0.9999;x+=dx) {
+ glBegin(GL_QUAD_STRIP);
+ for(y=-1;y<=1;y+=dy) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x,y,z);
+
+ z = getGrid(gp, x+dx,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x+dx,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+
+ return polys;
+}
+
+static int displayLight(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y;
+ double z;
+ double dx = 2.0/((double)_squares);
+ double dy = 2.0/((double)_squares);
+
+ glLoadIdentity();
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ userRot(gp);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ for(x=-1;x<0.9999;x+=dx) {
+ glBegin(GL_QUAD_STRIP);
+ for(y=-1;y<=1;y+=dy) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glNormal3f(
+ getGrid(gp, x+dx,y,gp->time)-getGrid(gp, x-dx,y,gp->time),
+ getGrid(gp, x,y+dy,gp->time)-getGrid(gp, x,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x,y,z);
+
+ z = getGrid(gp, x+dx,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glNormal3f(
+ getGrid(gp, x+dx+dx,y,gp->time)-getGrid(gp, x,y,gp->time),
+ getGrid(gp, x+dx,y+dy,gp->time)-getGrid(gp, x+dx,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x+dx,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+ return polys;
+}
+
+static int displayWire(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y;
+ double z;
+ double dx1 = 2.0/((double)(_squares*_resolution)) - 0.00001;
+ double dy1 = 2.0/((double)(_squares*_resolution)) - 0.00001;
+ double dx2 = 2.0/((double)_squares) - 0.00001;
+ double dy2 = 2.0/((double)_squares) - 0.00001;
+
+ glLoadIdentity();
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ userRot(gp);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ for(x=-1;x<=1;x+=dx2) {
+ glBegin(GL_LINE_STRIP);
+ for(y=-1;y<=1;y+=dy1) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+ for(y=-1;y<=1;y+=dy2) {
+ glBegin(GL_LINE_STRIP);
+ for(x=-1;x<=1;x+=dx1) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+ return polys;
+}
+
+/* generates new ripples */
+static void calcGrid(gfluxstruct *gp)
+{
+ double tmp;
+
+ if (gp->button_down_p) return;
+
+ tmp = 1.0/((double)_waveChange);
+ if(!(gp->counter%_waveChange)) {
+ gp->newWave = ((int)(gp->counter*tmp))%_waves;
+ gp->dispx[gp->newWave] = -frand(1.0);
+ gp->dispy[gp->newWave] = -frand(1.0);
+ gp->freq[gp->newWave] = _waveFreq * frand(1.0);
+ gp->wa[gp->newWave] = 0.0;
+ }
+ gp->counter++;
+ gp->wa[gp->newWave] += tmp;
+ gp->wa[(gp->newWave+1)%_waves] -= tmp;
+}
+
+/* returns a height for the grid given time and x,y space co-ords */
+static double getGrid(gfluxstruct *gp, double x, double y, double a)
+{
+ register int i;
+ double retval=0.0;
+ double tmp;
+
+ tmp = 1.0/((float)_waves);
+ for(i=0;i<_waves;i++) {
+ retval += gp->wa[i] * tmp * sin( gp->freq[i]
+ * ( (x+gp->dispx[i]) * (x+gp->dispx[i])
+ + (y+gp->dispy[i]) * (y+gp->dispy[i]) +a ) );
+ }
+ return(retval);
+}
+
+
+XSCREENSAVER_MODULE ("GFlux", gflux)
+
+#endif
diff --git a/hacks/glx/gflux.man b/hacks/glx/gflux.man
new file mode 100644
index 0000000..654aeb4
--- /dev/null
+++ b/hacks/glx/gflux.man
@@ -0,0 +1,111 @@
+.TH XScreenSaver 1 "May 2004"
+.SH NAME
+gflux \- rippling surface graphics hack
+.SH SYNOPSIS
+.B gflux
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-squares \fInum\fP] [\-resolution \fInum\fP] [\-mode \fImode\fP]
+[\-flat \fInum\fP] [\-speed \fInum\fP]
+[\-rotationx \fInum\fP] [\-rotationy \fInum\fP] [\-rotationz \fInum\fP]
+[\-waves \fInum\fP] [\-waveChange \fInum\fP] [\-waveHeight \fInum\fP]
+[\-waveFreq \fInum\fP] [\-zoom \fInum\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIgflux\fP program draws a colourfull animated rippling square rotating in 3D space.
+.SH OPTIONS
+.I gflux
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-squares \fInum\fP\fP
+Specifies the size of the grid in squares. default 19
+.TP 8
+.B \-resolution \fInum\fP\fP
+Specifies the wireframe detail of the squares. default 4
+.TP 8
+.B \-mode \fImode\fP\fP
+Specifies the draw method: wireframe; solid (meaning a solid colored
+surface); light (same as solid, but with lighting effects);
+checker (a texture-mapped checkerboard pattern); or grab (meaning
+grab an image to manipulate.)
+
+When grabbing images, the image will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.TP 8
+.B \-wireframe
+Same as "-mode wire".
+.TP 8
+.B \-flat \fInum\fP\fP
+0 for smooth shading 1 for flat. default 0
+.TP 8
+.B \-speed \fInum\fP\fP
+Specifies speed of ripples flowing over the surface. default 0.05
+.TP 8
+.B \-rotationx \fInum\fP \-rotationy \fInum\fP \-rotationz \fInum\fP\fP
+Specifies the speed of rotation of the surface in these axis
+.TP 8
+.B \-waves \fInum\fP\fP
+Specifies the number of ripple centres at any one time. Values should be greater than 1. default 3
+.TP 8
+.B \-waveChange \fInum\fP\fP
+Specifies the duration of a ripple centre. after this they fade away to be reborn elsewhere with a different frequency. default 50
+.TP 8
+.B \-waveHeight \fInum\fP\fP
+Specifies the height of ripples on the surface. default 1.0
+.TP 8
+.B \-waveFreq \fInum\fP\fP
+Specifies the maximum frequency of ripples. default 3.0
+.TP 8
+.B \-zoom \fInum\fP\fP
+Specifies the size of the viewport. Smaller values fill the screen with rippling surface. default 1.0
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2000 by Josiah Pease. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Josiah Pease <gflux@jpease.force9.co.uk>, 10-Jun-2000.
+
diff --git a/hacks/glx/glblur.c b/hacks/glx/glblur.c
new file mode 100644
index 0000000..cee020c
--- /dev/null
+++ b/hacks/glx/glblur.c
@@ -0,0 +1,610 @@
+/* glblur --- radial blur using GL textures
+ * Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This program draws a box and a few line segments, and generates a flowing
+ * radial blur outward from it -- this causes flowing field effects.
+ * It does this by rendering the scene into a small texture, then repeatedly
+ * rendering increasingly-enlarged and increasingly-transparent versions of
+ * that texture onto the frame buffer.
+ *
+ * As such, it's quite graphics intensive -- don't bother trying to run this
+ * if you don't have hardware-accelerated texture support.
+ *
+ * Inspired by Dario Corno's Radial Blur tutorial:
+ * http://nehe.gamedev.net/tutorials/lesson.asp?l=36
+ */
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_glblur 0
+# define release_glblur 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef ABS
+#define ABS(n) ((n)<0?-(n):(n))
+#undef SIGNOF
+#define SIGNOF(n) ((n)<0?-1:1)
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_BLUR_SIZE "15"
+
+typedef struct metaball metaball;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint obj_dlist0; /* east-west cube faces */
+ GLuint obj_dlist1; /* north-south cube faces */
+ GLuint obj_dlist2; /* up-down cube faces */
+ GLuint obj_dlist3; /* spikes coming out of the cube's corners */
+ GLuint scene_dlist1; /* the cube, rotated and translated */
+ GLuint scene_dlist2; /* the spikes, rotated and translated */
+ int scene_polys1; /* polygons in scene, not counting texture overlay */
+ int scene_polys2; /* polygons in scene, not counting texture overlay */
+
+ GLuint texture;
+ unsigned int *tex_data;
+ int tex_w, tex_h;
+
+ int ncolors;
+ XColor *colors0;
+ XColor *colors1;
+ XColor *colors2;
+ XColor *colors3;
+ int ccolor;
+
+ Bool show_cube_p;
+ Bool show_spikes_p;
+
+} glblur_configuration;
+
+static glblur_configuration *bps = NULL;
+
+static char *do_spin;
+static Bool do_wander;
+static int blursize;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-blursize", ".blurSize", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&blursize, "blurSize","BlurSize", DEF_BLUR_SIZE, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt glblur_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_glblur (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 8.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+/* Objects in the scene
+ */
+
+static void
+generate_object (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME (mi);
+ int s = 10;
+
+ bp->scene_polys1 = 0;
+ bp->scene_polys2 = 0;
+
+ glNewList (bp->obj_dlist0, GL_COMPILE);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* front */
+ glNormal3f (0, 0, 1);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* back */
+ glNormal3f (0, 0, -1);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, -0.5);
+ bp->scene_polys1++;
+ glEnd();
+ glEndList();
+
+ glNewList (bp->obj_dlist1, GL_COMPILE);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* left */
+ glNormal3f (-1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* right */
+ glNormal3f (1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+ glEndList();
+
+ glNewList (bp->obj_dlist2, GL_COMPILE);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* top */
+ glNormal3f (0, 1, 0);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* bottom */
+ glNormal3f (0, -1, 0);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+ glEndList();
+
+ glNewList (bp->obj_dlist3, GL_COMPILE);
+ glLineWidth (1);
+ glBegin(GL_LINES);
+ glVertex3f(-s, 0, 0); glVertex3f(s, 0, 0); /* face spikes */
+ glVertex3f(0, -s, 0); glVertex3f(0, s, 0);
+ glVertex3f(0, 0, -s); glVertex3f(0, 0, s);
+ bp->scene_polys2 += 3;
+ glEnd();
+
+ glLineWidth (8);
+ glBegin(GL_LINES);
+ glVertex3f(-s, -s, -s); glVertex3f( s, s, s); /* corner spikes */
+ glVertex3f(-s, -s, s); glVertex3f( s, s, -s);
+ glVertex3f(-s, s, -s); glVertex3f( s, -s, s);
+ glVertex3f( s, -s, -s); glVertex3f(-s, s, s);
+ bp->scene_polys2 += 4;
+ glEnd();
+ glEndList ();
+
+ check_gl_error ("object generation");
+}
+
+
+static void
+init_texture (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->tex_data) free (bp->tex_data);
+
+ bp->tex_w = 128;
+ bp->tex_h = 128;
+ bp->tex_data = (unsigned int *)
+ malloc (bp->tex_w * bp->tex_h * 4 * sizeof (unsigned int));
+
+ glGenTextures (1, &bp->texture);
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ bp->tex_w, bp->tex_h, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, bp->tex_data);
+ check_gl_error ("texture generation");
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+}
+
+
+static void
+render_scene_to_texture (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ glViewport (0, 0, bp->tex_w, bp->tex_h);
+
+ glCallList (bp->scene_dlist1);
+ glCallList (bp->scene_dlist2);
+
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+ glCopyTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0,
+ bp->tex_w, bp->tex_h, 0);
+ check_gl_error ("texture2D");
+
+ glViewport (0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+static void
+overlay_blur_texture (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+ int w = MI_WIDTH (mi);
+ int h = MI_HEIGHT (mi);
+ int times = blursize;
+ int i;
+ GLfloat inc = 0.02 * (25.0 / times);
+
+ GLfloat spost = 0; /* starting texture coordinate offset */
+ GLfloat alpha_inc; /* transparency fade factor */
+ GLfloat alpha = 0.2; /* initial transparency */
+
+ glEnable (GL_TEXTURE_2D);
+ glDisable (GL_DEPTH_TEST);
+ glBlendFunc (GL_SRC_ALPHA,GL_ONE);
+ glEnable (GL_BLEND);
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+
+
+ /* switch to orthographic projection, saving both previous matrixes
+ on their respective stacks.
+ */
+ glMatrixMode (GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho (0, w, h, 0, -1, 1);
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+
+ alpha_inc = alpha / times;
+
+ mi->polygon_count = bp->scene_polys1 + bp->scene_polys2;
+
+ glBegin (GL_QUADS);
+ for (i = 0; i < times; i++)
+ {
+ glColor4f (1, 1, 1, alpha);
+ glTexCoord2f (0+spost, 1-spost); glVertex2f (0, 0);
+ glTexCoord2f (0+spost, 0+spost); glVertex2f (0, h);
+ glTexCoord2f (1-spost, 0+spost); glVertex2f (w, h);
+ glTexCoord2f (1-spost, 1-spost); glVertex2f (w, 0);
+ spost += inc;
+ alpha -= alpha_inc;
+ mi->polygon_count++;
+ }
+ glEnd();
+
+ /* Switch back to perspective projection, restoring the saved matrixes
+ */
+ glMatrixMode (GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix();
+
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_BLEND);
+ glDisable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, 0);
+}
+
+
+
+/* Startup initialization
+ */
+
+ENTRYPOINT Bool
+glblur_handle_event (ModeInfo *mi, XEvent *event)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_glblur (ModeInfo *mi)
+{
+ glblur_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_glblur (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ if (!wire)
+ {
+ GLfloat gamb[4]= {0.2, 0.2, 0.2, 1.0};
+ GLfloat pos[4] = {0.0, 5.0, 10.0, 1.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {0.3, 0.3, 0.3, 1.0};
+ GLfloat spc[4] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat shiny = 128;
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+ glShadeModel(GL_SMOOTH);
+
+ glLightModelfv (GL_LIGHT_MODEL_AMBIENT, gamb);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialf(GL_FRONT, GL_SHININESS, shiny);
+ }
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 0.9;
+ double wander_speed = 0.06;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (blursize < 0) blursize = 0;
+ if (blursize > 200) blursize = 200;
+
+ bp->ncolors = 128;
+ bp->colors0 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ bp->colors1 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ bp->colors2 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ bp->colors3 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0, bp->colors0, &bp->ncolors, False, 0, False);
+ make_smooth_colormap (0, 0, 0, bp->colors1, &bp->ncolors, False, 0, False);
+ make_smooth_colormap (0, 0, 0, bp->colors2, &bp->ncolors, False, 0, False);
+ make_smooth_colormap (0, 0, 0, bp->colors3, &bp->ncolors, False, 0, False);
+ bp->ccolor = 0;
+
+ bp->obj_dlist0 = glGenLists (1);
+ bp->obj_dlist1 = glGenLists (1);
+ bp->obj_dlist2 = glGenLists (1);
+ bp->obj_dlist3 = glGenLists (1);
+ bp->scene_dlist1 = glGenLists (1);
+ bp->scene_dlist2 = glGenLists (1);
+
+ init_texture (mi);
+
+ generate_object (mi);
+}
+
+
+/* Render one frame
+ */
+ENTRYPOINT void
+draw_glblur (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ GLfloat color0[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color1[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color2[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color3[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+
+ double rx, ry, rz;
+ double px, py, pz;
+ int extra_polys = 0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ /* Decide what we're drawing
+ */
+ if (0 == (random() % 30))
+ {
+ bp->show_cube_p = (0 == (random() % 10));
+ bp->show_spikes_p = (0 == (random() % 20));
+ }
+
+ /* Select new colors for the various objects
+ */
+ color0[0] = bp->colors0[bp->ccolor].red / 65536.0;
+ color0[1] = bp->colors0[bp->ccolor].green / 65536.0;
+ color0[2] = bp->colors0[bp->ccolor].blue / 65536.0;
+
+ color1[0] = bp->colors1[bp->ccolor].red / 65536.0;
+ color1[1] = bp->colors1[bp->ccolor].green / 65536.0;
+ color1[2] = bp->colors1[bp->ccolor].blue / 65536.0;
+
+ color2[0] = bp->colors2[bp->ccolor].red / 65536.0;
+ color2[1] = bp->colors2[bp->ccolor].green / 65536.0;
+ color2[2] = bp->colors2[bp->ccolor].blue / 65536.0;
+
+ color3[0] = bp->colors3[bp->ccolor].red / 65536.0;
+ color3[1] = bp->colors3[bp->ccolor].green / 65536.0;
+ color3[2] = bp->colors3[bp->ccolor].blue / 65536.0;
+
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+
+ get_position (bp->rot, &px, &py, &pz, !bp->button_down_p);
+ get_rotation (bp->rot, &rx, &ry, &rz, !bp->button_down_p);
+
+ px = (px - 0.5) * 2;
+ py = (py - 0.5) * 2;
+ pz = (pz - 0.5) * 8;
+ rx *= 360;
+ ry *= 360;
+ rz *= 360;
+
+ /* Generate scene_dlist1, which contains the box (not spikes),
+ rotated into position.
+ */
+ glNewList (bp->scene_dlist1, GL_COMPILE);
+ {
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ glTranslatef (px, py, pz);
+ gltrackball_rotate (bp->trackball);
+ glRotatef (rx, 1.0, 0.0, 0.0);
+ glRotatef (ry, 0.0, 1.0, 0.0);
+ glRotatef (rz, 0.0, 0.0, 1.0);
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color0);
+ glCallList (bp->obj_dlist0);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1);
+ glCallList (bp->obj_dlist1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2);
+ glCallList (bp->obj_dlist2);
+
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix ();
+ }
+ glEndList ();
+
+
+ /* Generate scene_dlist2, which contains the spikes (not box),
+ rotated into position.
+ */
+ glNewList (bp->scene_dlist2, GL_COMPILE);
+ {
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ glTranslatef (px, py, pz);
+ gltrackball_rotate (bp->trackball);
+ glRotatef (rx, 1.0, 0.0, 0.0);
+ glRotatef (ry, 0.0, 1.0, 0.0);
+ glRotatef (rz, 0.0, 0.0, 1.0);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color3);
+ glCallList (bp->obj_dlist3);
+
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix ();
+ }
+ glEndList ();
+
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ render_scene_to_texture (mi);
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (bp->show_cube_p || bp->button_down_p)
+ {
+ glCallList (bp->scene_dlist1);
+ extra_polys += bp->scene_polys1;
+ }
+ if (bp->show_spikes_p || bp->button_down_p)
+ {
+ glCallList (bp->scene_dlist2);
+ extra_polys += bp->scene_polys2;
+ }
+
+ overlay_blur_texture (mi);
+ mi->polygon_count += extra_polys;
+
+ glFlush ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("GLBlur", glblur)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glblur.man b/hacks/glx/glblur.man
new file mode 100644
index 0000000..968f42f
--- /dev/null
+++ b/hacks/glx/glblur.man
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glblur - 3D radial blur texture fields
+.SH SYNOPSIS
+.B glblur
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-blursize \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-fps]
+.SH DESCRIPTION
+This program draws a box and a few line segments, and generates a
+radial blur outward from it. This creates flowing field effects.
+
+This is done by rendering the scene into a small texture, then
+repeatedly rendering increasingly-enlarged and increasingly-transparent
+versions of that texture onto the frame buffer. As such, it's quite
+graphics intensive: don't bother trying to run this if you don't have
+hardware-accelerated texture support. It will hurt your machine bad.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-blursize \fInumber\fP
+How many copies of the scene should be laid down to make the vapor trail.
+Default: 15. Larger numbers create smoother fields, but are slower.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin [XYZ]
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+None.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski, with inspiration from a tutorial by Dario Corno.
diff --git a/hacks/glx/glcells.c b/hacks/glx/glcells.c
new file mode 100644
index 0000000..adf9866
--- /dev/null
+++ b/hacks/glx/glcells.c
@@ -0,0 +1,1388 @@
+/* -*- Mode: C; tab-width: 2 -*- */
+/* glcells --- Cells growing on your screen */
+
+/*-
+ * Cells growing on your screen
+ *
+ * Copyright (c) 2007 by Matthias Toussaint
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * 2007: Written by Matthias Toussaint
+ * 0.1 Initial version
+ * 0.2 Bugfixes (threading) and code cleanup by Jamie Zawinski
+ * Window scaling bug + performance bug in tick()
+ */
+
+#include <sys/time.h> /* gettimeofday */
+
+#include "xlockmore.h"
+#include <math.h>
+
+/**********************************
+ DEFINES
+ **********************************/
+
+#define INDEX_OFFSET 100000
+#define NUM_CELL_SHAPES 10
+
+#define release_glcells 0
+#define glcells_handle_event xlockmore_no_events
+
+#define DEF_DELAY "20000"
+#define DEF_MAXCELLS "800"
+#define DEF_RADIUS "40"
+#define DEF_SEEDS "1"
+#define DEF_QUALITY "3"
+#define DEF_KEEPOLD "False"
+#define DEF_MINFOOD "5"
+#define DEF_MAXFOOD "20"
+#define DEF_DIVIDEAGE "20"
+#define DEF_MINDIST "1.4"
+#define DEF_PAUSE "50"
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifndef HAVE_JWZGLES /* glDrawElements unimplemented... */
+# define USE_VERTEX_ARRAY
+#endif
+
+#define TEX_SIZE 64
+
+/**********************************
+ TYPEDEFS
+ **********************************/
+
+typedef struct /* a 3-D vector */
+{
+ double x, y, z; /* 3-D coordinates (we don't need w here) */
+} Vector;
+
+typedef struct /* a triangle (indexes of vertexes in some list) */
+{
+ int i[3]; /* the three indexes for the triangle corners */
+} Triangle;
+
+typedef struct
+{
+ float *vertex;
+ float *normal;
+ unsigned *index;
+ int num_index;
+} VertexArray;
+
+typedef struct /* an 3-D object without normal vectors */
+{
+ Vector *vertex; /* the vertexes */
+ Triangle *triangle; /* triangle list */
+ int num_vertex; /* number of vertexes */
+ int num_triangle; /* number of triangles */
+} Object;
+
+typedef struct /* an 3-D object with smooth normal vectors */
+{
+ Vector *vertex; /* the vertexes */
+ Vector *normal; /* the vertex normal vectors */
+ Triangle *triangle; /* triangle list */
+ int num_vertex; /* number of vertexes */
+ int num_triangle; /* number of triangles */
+} ObjectSmooth;
+
+typedef struct /* Cell */
+{
+ double x, y; /* position */
+ double vx, vy; /* movement vector */
+ int age; /* cells age */
+ double min_dist; /* minimum distance to other cells */
+ int energy; /* health */
+ double rotation; /* random rot, so they don't look all the same */
+ double radius; /* current size of cell */
+ double growth; /* current growth rate. might be <1.0 while dividing,
+ >1.0 when finished dividing and food is available
+ and 1.0 when grown up */
+} Cell;
+
+typedef struct /* hacks state */
+{
+ GLXContext *glx_context;
+ int width, height; /* current size of viewport */
+ double screen_scale; /* we scale content with window size */
+ int num_cells; /* current number of cell in list */
+ Cell *cell; /* array of cells */
+ int cell_polys;
+ GLfloat color[4]; /* current cell color */
+ double radius; /* cell radius */
+ int move_dist; /* min distance from neighbours for forking */
+ int max_cells; /* maximum number of cells */
+ int num_seeds; /* number of initial seeds */
+ int keep_old_cells; /* draw dead cells? */
+ int divide_age; /* min age for division */
+ /* display lists for the cell stages */
+ int cell_list[NUM_CELL_SHAPES];
+ int nucleus_list;
+ int minfood; /* minimum amount of food per area unit */
+ int maxfood; /* maximum amount of food per area unit */
+ int pause; /* pause at end (all cells dead) */
+ int pause_counter;
+ int wire; /* draw wireframe? */
+ Object *sphere; /* the raw undisturbed sphere */
+ double *disturbance; /* disturbance values for the vertexes */
+ int *food; /* our petri dish (e.g. screen) */
+ GLubyte *texture; /* texture data for nucleus */
+ GLuint texture_name; /* texture name for binding */
+} State;
+
+/**********************************
+ STATIC STUFF
+ **********************************/
+
+static State *sstate = NULL;
+
+static XrmOptionDescRec opts[] = {
+ { "-maxcells", ".maxcells", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-seeds", ".seeds", XrmoptionSepArg, 0 },
+ { "-quality", ".quality", XrmoptionSepArg, 0 },
+ { "-minfood", ".minfood", XrmoptionSepArg, 0 },
+ { "-maxfood", ".maxfood", XrmoptionSepArg, 0 },
+ { "-divideage", ".divideage", XrmoptionSepArg, 0 },
+ { "-mindist", ".mindist", XrmoptionSepArg, 0 },
+ { "-pause", ".pause", XrmoptionSepArg, 0 },
+ { "-keepold", ".keepold", XrmoptionNoArg, "True" }
+};
+
+static int s_maxcells;
+static int s_radius;
+static int s_seeds;
+static int s_quality;
+static int s_minfood;
+static int s_maxfood;
+static int s_divideage;
+static int s_pause;
+static float s_min_dist;
+static Bool s_keepold;
+
+static argtype vars[] = {
+ {&s_maxcells, "maxcells", "Max Cells", DEF_MAXCELLS, t_Int},
+ {&s_radius, "radius", "Radius", DEF_RADIUS, t_Int},
+ {&s_seeds, "seeds", "Seeds", DEF_SEEDS, t_Int},
+ {&s_quality, "quality", "Quality", DEF_QUALITY, t_Int},
+ {&s_minfood, "minfood", "Min Food", DEF_MINFOOD, t_Int},
+ {&s_maxfood, "maxfood", "Max Food", DEF_MAXFOOD, t_Int},
+ {&s_pause, "pause", "Pause at end", DEF_PAUSE, t_Int},
+ {&s_divideage, "divideage", "Age for duplication (Ticks)", DEF_DIVIDEAGE, t_Int},
+ {&s_min_dist, "mindist", "Minimum preferred distance to other cells", DEF_MINDIST, t_Float},
+ {&s_keepold, "keepold", "Keep old cells", DEF_KEEPOLD, t_Bool}
+};
+
+/**********************************
+ PROTOTYPES
+ **********************************/
+
+/* render scene */
+static int render( State *st );
+/* create initial cells and fill petri dish with food */
+static void create_cells( State * );
+/* do one animation step */
+static void tick( State *st );
+/* draw a single cell */
+static void draw_cell( State *st, int shape );
+/* draw cells nucleus */
+static void draw_nucleus( State *st );
+/* return randum number in the interval min-max */
+static int random_interval( int min, int max );
+/* retunr random number in the interval 0-max */
+static int random_max( int max );
+/* create display list for given disturbance weighting factor */
+static int create_list( State *st, double fac );
+/* return length of vector */
+static double vector_length( Vector * );
+/* normalize vector */
+static void vector_normalize( Vector * );
+/* a += b */
+static void vector_add( Vector *a, Vector *b );
+/* a -= b */
+static void vector_sub( Vector *a, Vector *b );
+/* a *= fac */
+static void vector_mul( Vector *a, double fac );
+/* a.x = a.y = a.z = 0 */
+static void vector_clear( Vector *a );
+/* return crossproduct a*b in out */
+static void vector_crossprod( Vector *a, Vector *b, Vector *out );
+/* return 1 if vectors are equal (epsilon compare) otherwise 0 */
+static int vector_compare( Vector *a, Vector *b );
+/* compute normal vector of given triangle and return in out */
+static void triangle_normal( Vector *a, Vector *b, Vector *c, Vector *out );
+/* take an Object and create an ObjectSmooth out of it */
+static ObjectSmooth *create_ObjectSmooth( Object * );
+/* Subdivide the Object once (assuming it's supposed to be a shpere */
+static Object *subdivide( Object *obj );
+/* free an Object */
+static void free_Object( Object * );
+/* free an ObjectSmooth */
+static void free_ObjectSmooth( ObjectSmooth * );
+/* scale an Object. return pointer to the object */
+/*static Object *scale_Object( Object *obj, double scale );*/
+/* create a perfect sphere refining with divisions */
+static Object *create_sphere( State *st, int divisions );
+/* make a copy of the given Object */
+static Object *clone_Object( Object * );
+/* return 1 if cell is capable to divide */
+static int can_divide( State *st, Cell *cell );
+#ifdef USE_VERTEX_ARRAY
+static VertexArray *array_from_ObjectSmooth( ObjectSmooth * );
+#endif
+static void create_nucleus_texture( State *st );
+
+ENTRYPOINT ModeSpecOpt glcells_opts = { countof(opts), opts, countof(vars), vars,
+ NULL };
+
+
+/**********************************
+ INLINE FUNCTIONS
+ **********************************/
+/* create random numbers
+*/
+static inline int random_interval( int min, int max )
+{
+ int n = max - min;
+ if (n == 0) n = 1;
+ return min+(random()%n);
+}
+
+static inline int random_max( int max )
+{
+ return random()%max;
+}
+
+/* Vector stuff
+*/
+
+/* a += b */
+static inline void vector_add( Vector *a, Vector *b )
+{
+ a->x += b->x;
+ a->y += b->y;
+ a->z += b->z;
+}
+
+/* a -= b */
+static inline void vector_sub( Vector *a, Vector *b )
+{
+ a->x -= b->x;
+ a->y -= b->y;
+ a->z -= b->z;
+}
+
+/* a *= v */
+static inline void vector_mul( Vector *a, double v )
+{
+ a->x *= v;
+ a->y *= v;
+ a->z *= v;
+}
+
+/* set to 0 */
+static inline void vector_clear( Vector *vec )
+{
+ vec->x = vec->y = vec->z = 0;
+}
+
+/* return vector length */
+static inline double vector_length( Vector *vec )
+{
+ return sqrt( vec->x*vec->x + vec->y*vec->y + vec->z*vec->z );
+}
+
+/* normalize vector */
+static inline void vector_normalize( Vector *vec )
+{
+ double len = vector_length( vec );
+
+ if (len != 0.0) {
+ vector_mul( vec, 1.0 / len );
+ }
+}
+
+/* crossproduct */
+static inline void vector_crossprod( Vector *a, Vector *b, Vector *out )
+{
+ out->x = a->y*b->z - a->z*b->y;
+ out->y = a->z*b->x - a->x*b->z;
+ out->z = a->x*b->y - a->y*b->x;
+}
+
+/* epsilon compare of two vectors */
+static inline int vector_compare( Vector *a, Vector *b )
+{
+ const double epsilon = 0.0000001;
+ Vector delta = *a;
+
+ vector_sub( &delta, b );
+ if (fabs(delta.x) < epsilon &&
+ fabs(delta.y) < epsilon &&
+ fabs(delta.z) < epsilon) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* check if given cell is capable of dividing
+ needs space, must be old enough, grown up and healthy
+*/
+static inline int can_divide( State *st, Cell *cell )
+{
+ if (cell->min_dist > st->move_dist &&
+ cell->age >= st->divide_age &&
+ cell->radius > 0.99 * st->radius &&
+ cell->energy > 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**********************************
+ FUNCTIONS
+ **********************************/
+
+/* compute normal vector of given
+ triangle spanned by the points a, b, c
+*/
+static void triangle_normal( Vector *a, Vector *b, Vector *c, Vector *out )
+{
+ Vector v1 = *a;
+ Vector v2 = *a;
+
+ vector_sub( &v1, b );
+ vector_sub( &v2, c );
+ vector_crossprod( &v1, &v2, out );
+}
+
+/* free */
+static void free_Object( Object *obj )
+{
+ free( obj->vertex );
+ free( obj->triangle );
+ free( obj );
+}
+
+static void free_ObjectSmooth( ObjectSmooth *obj )
+{
+ free( obj->vertex );
+ free( obj->triangle );
+ free( obj->normal );
+ free( obj );
+}
+
+/* scale the given Object */
+#if 0
+static Object *scale_Object( Object *obj, double scale )
+{
+ int v;
+
+ for (v=0; v<obj->num_vertex; ++v) {
+ vector_mul( &obj->vertex[v], scale );
+ }
+
+ return obj;
+}
+#endif
+
+/* create a copy of the given Object */
+static Object *clone_Object( Object *obj )
+{
+ /* alloc */
+ Object *ret = (Object *) malloc( sizeof( Object ) );
+
+ ret->vertex =
+ (Vector *) malloc( obj->num_vertex*sizeof(Vector) );
+ ret->triangle =
+ (Triangle *) malloc( obj->num_triangle*sizeof(Triangle) );
+ ret->num_vertex = obj->num_vertex;
+ ret->num_triangle = obj->num_triangle;
+ /* copy */
+ memcpy( ret->vertex, obj->vertex,
+ obj->num_vertex*sizeof(Vector) );
+ memcpy( ret->triangle, obj->triangle,
+ obj->num_triangle*sizeof(Triangle) );
+
+ return ret;
+}
+
+#ifdef USE_VERTEX_ARRAY
+static VertexArray *array_from_ObjectSmooth( ObjectSmooth *obj )
+{
+ int i, j;
+ VertexArray *array = (VertexArray *) malloc( sizeof( VertexArray ) );
+
+ array->vertex = (float *) malloc( 3*sizeof(float)*obj->num_vertex );
+ array->normal = (float *) malloc( 3*sizeof(float)*obj->num_vertex );
+ array->index = (unsigned *) malloc( 3*sizeof(unsigned)*obj->num_triangle );
+ array->num_index = obj->num_triangle*3;
+
+ for (i=0, j=0; i<obj->num_vertex; ++i) {
+ array->vertex[j] = obj->vertex[i].x;
+ array->normal[j++] = obj->normal[i].x;
+ array->vertex[j] = obj->vertex[i].y;
+ array->normal[j++] = obj->normal[i].y;
+ array->vertex[j] = obj->vertex[i].z;
+ array->normal[j++] = obj->normal[i].z;
+ }
+
+ for (i=0, j=0; i<obj->num_triangle; ++i) {
+ array->index[j++] = obj->triangle[i].i[0];
+ array->index[j++] = obj->triangle[i].i[1];
+ array->index[j++] = obj->triangle[i].i[2];
+ }
+
+ return array;
+}
+#endif /* USE_VERTEX_ARRAY */
+
+
+/* create a smoothed version of the given Object
+ by computing average normal vectors for the vertexes
+*/
+static ObjectSmooth *create_ObjectSmooth( Object *obj )
+{
+ int t, v, i;
+ Vector *t_normal =
+ (Vector *) malloc( obj->num_triangle*sizeof(Vector) );
+ ObjectSmooth *ret =
+ (ObjectSmooth *) malloc( sizeof( ObjectSmooth ) );
+
+ /* fill in vertexes and triangles */
+ ret->num_vertex = obj->num_vertex;
+ ret->num_triangle = obj->num_triangle;
+ ret->vertex =
+ (Vector *) malloc( obj->num_vertex * sizeof( Vector ) );
+ ret->normal =
+ (Vector *) malloc( obj->num_vertex * sizeof( Vector ) );
+ ret->triangle =
+ (Triangle *) malloc( obj->num_triangle * sizeof( Triangle ) );
+
+ for (v=0; v<obj->num_vertex; ++v) {
+ ret->vertex[v] = obj->vertex[v];
+ }
+
+ for (t=0; t<obj->num_triangle; ++t) {
+ ret->triangle[t] = obj->triangle[t];
+ }
+
+ /* create normals (triangles) */
+ for (t=0; t<ret->num_triangle; ++t) {
+ triangle_normal( &ret->vertex[ret->triangle[t].i[0]],
+ &ret->vertex[ret->triangle[t].i[1]],
+ &ret->vertex[ret->triangle[t].i[2]],
+ &t_normal[t] );
+ }
+
+ /* create normals (vertex) by averaging triangle
+ normals at vertex
+ */
+ for (v=0; v<ret->num_vertex; ++v) {
+ vector_clear( &ret->normal[v] );
+ for (t=0; t<ret->num_triangle; ++t) {
+ for (i=0; i<3; ++i) {
+ if (ret->triangle[t].i[i] == v) {
+ vector_add( &ret->normal[v], &t_normal[t] );
+ }
+ }
+ }
+ /* as we have only a half sphere we force the
+ normals at the bortder to be perpendicular to z.
+ the simple algorithm above makes an error here.
+ */
+ if (fabs(ret->vertex[v].z) < 0.0001) {
+ ret->normal[v].z = 0.0;
+ }
+
+ vector_normalize( &ret->normal[v] );
+ }
+
+ free( t_normal );
+
+ return ret;
+}
+
+/* subdivide the triangles of the object once
+ The order of this algorithm is probably something like O(n^42) :)
+ but I can't think of something smarter at the moment
+*/
+static Object *subdivide( Object *obj )
+{
+ /* create for worst case (which I dont't know) */
+ int start, t, i, v;
+ int index_list[1000];
+ int index_cnt, index_found;
+ Object *tmp = (Object *)malloc( sizeof(Object) );
+ Object *ret = (Object *)malloc( sizeof(Object) );
+ Object *c_ret;
+
+ tmp->vertex =
+ (Vector *)malloc( 100*obj->num_vertex*sizeof( Vector ) );
+ tmp->triangle =
+ (Triangle *)malloc( 4*obj->num_triangle*sizeof( Triangle ) );
+ tmp->num_vertex = 0;
+ tmp->num_triangle = 0;
+ ret->vertex =
+ (Vector *)malloc( 100*obj->num_vertex*sizeof( Vector ) );
+ ret->triangle =
+ (Triangle *)malloc( 4*obj->num_triangle*sizeof( Triangle ) );
+ ret->num_vertex = 0;
+ ret->num_triangle = 0;
+#ifdef PRINT_STAT
+ fprintf( stderr, "in v=%d t=%d\n",
+ obj->num_vertex, obj->num_triangle );
+#endif
+ /* for each triangle create 3 new vertexes and the 4
+ corresponding triangles
+ */
+ for (t=0; t<obj->num_triangle; ++t) {
+ /* copy the three original vertexes */
+ for (i=0; i<3; ++i) {
+ tmp->vertex[tmp->num_vertex++] =
+ obj->vertex[obj->triangle[t].i[i]];
+ }
+
+ /* create 3 new */
+ tmp->vertex[tmp->num_vertex] =
+ obj->vertex[obj->triangle[t].i[0]];
+ vector_add( &tmp->vertex[tmp->num_vertex],
+ &obj->vertex[obj->triangle[t].i[1]] );
+ vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
+
+ tmp->vertex[tmp->num_vertex] =
+ obj->vertex[obj->triangle[t].i[1]];
+ vector_add( &tmp->vertex[tmp->num_vertex],
+ &obj->vertex[obj->triangle[t].i[2]] );
+ vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
+
+ tmp->vertex[tmp->num_vertex] =
+ obj->vertex[obj->triangle[t].i[2]];
+ vector_add( &tmp->vertex[tmp->num_vertex],
+ &obj->vertex[obj->triangle[t].i[0]] );
+ vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
+
+ /* create triangles */
+ start = tmp->num_vertex-6;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start;
+ tmp->triangle[tmp->num_triangle].i[1] = start+3;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+5;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start+3;
+ tmp->triangle[tmp->num_triangle].i[1] = start+1;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+4;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start+5;
+ tmp->triangle[tmp->num_triangle].i[1] = start+4;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+2;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start+3;
+ tmp->triangle[tmp->num_triangle].i[1] = start+4;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+5;
+ }
+
+ /* compress object eliminating double vertexes
+ (welcome to the not so smart section)
+ */
+ /* copy original triangle list */
+ for (t=0; t<tmp->num_triangle; ++t) {
+ ret->triangle[t] = tmp->triangle[t];
+ }
+ ret->num_triangle = tmp->num_triangle;
+
+ /* copy unique vertexes and correct triangle list */
+ for (v=0; v<tmp->num_vertex; ++v) {
+ /* create list of vertexes that are the same */
+ index_cnt = 0;
+ for (i=0; i<tmp->num_vertex; ++i) {
+ /* check if i and v are the same
+ first in the list is the smallest index
+ */
+ if (vector_compare( &tmp->vertex[v], &tmp->vertex[i] )) {
+ index_list[index_cnt++] = i;
+ }
+ }
+
+ /* check if vertex unknown so far */
+ index_found = 0;
+ for (i=0; i<ret->num_vertex; ++i) {
+ if (vector_compare( &ret->vertex[i],
+ &tmp->vertex[index_list[0]] )) {
+ index_found = 1;
+ break;
+ }
+ }
+
+ if (!index_found) {
+ ret->vertex[ret->num_vertex] = tmp->vertex[index_list[0]];
+
+ /* correct triangles
+ (we add an offset to the index, so we can tell them apart)
+ */
+ for (t=0; t<ret->num_triangle; ++t) {
+ for (i=0; i<index_cnt; ++i) {
+ if (ret->triangle[t].i[0] == index_list[i]) {
+ ret->triangle[t].i[0] = ret->num_vertex+INDEX_OFFSET;
+ }
+ if (ret->triangle[t].i[1] == index_list[i]) {
+ ret->triangle[t].i[1] = ret->num_vertex+INDEX_OFFSET;
+ }
+ if (ret->triangle[t].i[2] == index_list[i]) {
+ ret->triangle[t].i[2] = ret->num_vertex+INDEX_OFFSET;
+ }
+ }
+ }
+ ret->num_vertex++;
+ }
+ }
+
+ free_Object( tmp );
+
+ /* correct index offset */
+ for (t=0; t<ret->num_triangle; ++t) {
+ ret->triangle[t].i[0] -= INDEX_OFFSET;
+ ret->triangle[t].i[1] -= INDEX_OFFSET;
+ ret->triangle[t].i[2] -= INDEX_OFFSET;
+ }
+
+ /* normalize vertexes */
+ for (v=0; v<ret->num_vertex; ++v) {
+ vector_normalize( &ret->vertex[v] );
+ }
+#ifdef PRINT_STAT
+ fprintf( stderr, "out v=%d t=%d\n",
+ ret->num_vertex, ret->num_triangle );
+#endif
+ /* shrink the arrays by cloning */
+ c_ret = clone_Object( ret );
+ free_Object( ret );
+
+ return c_ret;
+}
+
+static int render( State *st )
+{
+#ifdef PRINT_STAT
+ struct timeval tv1, tv2;
+ int usec;
+#endif
+ GLfloat LightAmbient[]= { 0.1f, 0.1f, 0.1f, 1.0f };
+ GLfloat LightPosition[]= { -20.0f, -10.0f, -100.0f, 0.0f };
+ int b;
+ int num_paint = 0;
+
+ if (0 == st->food) return 0;
+#ifdef PRINT_STAT
+ gettimeofday( &tv1, NULL );
+#endif
+ /* life goes on... */
+ tick( st );
+#ifdef PRINT_STAT
+ gettimeofday( &tv2, NULL );
+ usec = (tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec);
+ fprintf( stderr, "tick %d\n", usec );
+ gettimeofday( &tv1, NULL );
+#endif
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glDepthFunc(GL_LESS);
+ glEnable(GL_DEPTH_TEST);
+ glLightfv( GL_LIGHT0, GL_AMBIENT, LightAmbient );
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, st->color );
+ glLightfv( GL_LIGHT0, GL_POSITION, LightPosition );
+
+ /* prepare lighting vs. wireframe */
+ if (!st->wire) {
+ glEnable( GL_LIGHT0 );
+ glEnable( GL_LIGHTING );
+ glEnable( GL_NORMALIZE );
+ glPolygonMode( GL_FRONT, GL_FILL );
+ } else {
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glPolygonMode( GL_FRONT, GL_LINE );
+# endif
+ }
+
+# if 0
+ if (st->wire) {
+ glDisable(GL_DEPTH_TEST);
+ glColor3f (1, 1, 1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0, 0, 0); glVertex3f(st->width, 0, 0);
+ glVertex3f(st->width, st->height, 0); glVertex3f(0, st->height, 0);
+ glVertex3f(0, 0, 0); glVertex3f(st->width/4, 0, 0);
+ glVertex3f(st->width/4, st->height/4, 0); glVertex3f(0, st->height/4, 0);
+ glEnd();
+ }
+# endif
+
+ /* draw the dead cells if choosen */
+ if (st->keep_old_cells) {
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy <= 0) {
+ num_paint++;
+ glPushMatrix();
+ glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
+ glRotatef( st->cell[b].rotation, 0.0, 0.0, 1.0 );
+ glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
+ draw_cell( st, 9 );
+ glPopMatrix();
+ }
+ }
+ }
+
+ /* draw the living cells */
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy >0) {
+ double fac = (double)st->cell[b].energy / 50.0;
+ int shape;
+ if (fac < 0.0) fac = 0.0;
+ if (fac > 1.0) fac = 1.0;
+
+ shape = (int)(9.0*fac);
+ num_paint++;
+ /*glColor3f( fac, fac, fac );*/
+
+# if 0
+ if (st->wire) {
+ glBegin(GL_LINES);
+ glVertex3f(0, 0, 0);
+ glVertex3f(st->cell[b].x, st->cell[b].y, 0);
+ glEnd();
+ }
+# endif
+
+ glPushMatrix();
+ glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
+ glRotatef( st->cell[b].rotation, 0.0, 0.0, 1.0 );
+ glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
+ draw_cell( st, 9-shape );
+ glPopMatrix();
+ }
+ }
+
+ /* draw cell nuclei */
+ if (!st->wire)
+ {
+ glDisable( GL_LIGHT0 );
+ glDisable( GL_LIGHTING );
+
+ glEnable( GL_BLEND );
+ glDisable( GL_DEPTH_TEST );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glEnable( GL_TEXTURE_2D );
+ glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+ glBindTexture( GL_TEXTURE_2D, st->texture_name );
+
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy>0 || st->keep_old_cells) {
+ glPushMatrix();
+ glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
+ glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
+ draw_nucleus( st );
+ glPopMatrix();
+ }
+ }
+
+ glDisable( GL_TEXTURE_2D );
+ glDisable( GL_BLEND );
+ }
+
+#ifdef PRINT_STAT
+ gettimeofday( &tv2, NULL );
+ usec = (tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec);
+ fprintf( stderr, "OpenGL %d\n", usec );
+#endif
+ return num_paint * st->cell_polys;
+}
+
+/* this creates the initial subdivided half-dodecaedron */
+static Object *create_sphere( State *st, int divisions )
+{
+ int num_vertex = 9;
+ int num_triangle = 10;
+ int i, v, t;
+ double a, aStep = (double)M_PI / 3.0;
+ double e;
+ int vi[30] = { 0, 7, 1, 1, 7, 2, 2, 8, 3, 3, 8, 4, 4, 6, 5,
+ 5, 6, 0, 0, 6, 7, 2, 7, 8, 4, 8, 6, 6, 8, 7 };
+ Object *obj = (Object *)malloc( sizeof( Object ) );
+
+ obj->vertex = (Vector *)malloc( num_vertex*sizeof( Vector ) );
+ obj->triangle =
+ (Triangle *)malloc( num_triangle*sizeof( Triangle ) );
+ obj->num_vertex = num_vertex;
+ obj->num_triangle = num_triangle;
+
+ /* create vertexes for dodecaedron */
+ a = 0.0;
+ for (v=0; v<6; ++v) {
+ obj->vertex[v].x = sin( a );
+ obj->vertex[v].y = -cos( a );
+ obj->vertex[v].z = 0.0;
+
+ a += aStep;
+ }
+
+ a = -60.0/180.0*(double)M_PI;
+ e = 58.2825/180.0 * (double)M_PI;
+ for (;v<9; ++v) {
+ obj->vertex[v].x = sin( a )*cos( e );
+ obj->vertex[v].y = -cos( a )*cos( e );
+ obj->vertex[v].z = -sin( e );
+
+ a += 2.0*aStep;
+ }
+
+ /* create triangles */
+ for (t=0; t<obj->num_triangle; ++t) {
+ obj->triangle[t].i[0] = vi[3*t];
+ obj->triangle[t].i[1] = vi[3*t+1];
+ obj->triangle[t].i[2] = vi[3*t+2];
+ }
+
+ /* subdivide as specified */
+ for (i=0; i<divisions; ++i) {
+ Object *newObj = subdivide( obj );
+ free_Object( obj );
+ obj = newObj;
+ }
+
+ st->cell_polys = obj->num_triangle;
+
+ return obj;
+}
+
+static int create_list( State *st, double fac )
+{
+ int v;
+ Object *obj = clone_Object( st->sphere );
+ ObjectSmooth *smooth;
+#ifdef USE_VERTEX_ARRAY
+ VertexArray *vertex_array;
+#else
+ int t, i;
+#endif
+ int list = glGenLists(1);
+
+ /* apply wrinckle factor */
+ for (v=0; v<obj->num_vertex; ++v) {
+ vector_mul( &obj->vertex[v], 1.0+fac*st->disturbance[v] );
+ }
+
+ /* compute normals */
+ smooth = create_ObjectSmooth( obj );
+ free_Object( obj );
+
+ /* Create display list */
+ glNewList( list, GL_COMPILE );
+#ifdef USE_VERTEX_ARRAY
+ vertex_array = array_from_ObjectSmooth( smooth );
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glEnableClientState( GL_NORMAL_ARRAY );
+ glVertexPointer( 3, GL_FLOAT, 0, vertex_array->vertex );
+ glNormalPointer( GL_FLOAT, 0, vertex_array->normal );
+ glDrawElements( GL_TRIANGLES, vertex_array->num_index,
+ GL_UNSIGNED_INT, vertex_array->index );
+ free( vertex_array );
+#else
+ glBegin( GL_TRIANGLES );
+
+ for (t=0; t<smooth->num_triangle; ++t) {
+ for (i=0; i<3; ++i) {
+ glNormal3f( smooth->normal[smooth->triangle[t].i[i]].x,
+ smooth->normal[smooth->triangle[t].i[i]].y,
+ smooth->normal[smooth->triangle[t].i[i]].z );
+ glVertex3f( smooth->vertex[smooth->triangle[t].i[i]].x,
+ smooth->vertex[smooth->triangle[t].i[i]].y,
+ smooth->vertex[smooth->triangle[t].i[i]].z );
+ }
+ }
+
+ glEnd();
+#endif
+ glEndList();
+
+ free_ObjectSmooth( smooth );
+
+ return list;
+}
+
+static void draw_cell( State *st, int shape )
+{
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (st->wire) {
+ glDisable(GL_DEPTH_TEST);
+ glColor3f (1, 1, 1);
+ glPushMatrix();
+ glScalef (0.33, 0.33, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (-1, -1, 0); glVertex3f (-1, 1, 0);
+ glVertex3f ( 1, 1, 0); glVertex3f ( 1, -1, 0);
+ glEnd();
+ if (shape == 9) {
+ glBegin (GL_LINES);
+ glVertex3f (-1, -1, 0); glVertex3f (1, 1, 0);
+ glVertex3f (-1, 1, 0); glVertex3f (1, -1, 0);
+ glEnd();
+ }
+ glPopMatrix();
+ return;
+ }
+# endif
+
+ if (-1 == st->cell_list[shape]) {
+ st->cell_list[shape] = create_list( st, (double)shape/10.0 );
+ }
+
+ glCallList( st->cell_list[shape] );
+}
+
+static void create_nucleus_texture( State *st )
+{
+ int x, y;
+ int w2 = TEX_SIZE/2;
+ float s = w2*w2/4.0;
+
+ st->texture = (GLubyte *) malloc( 4*TEX_SIZE*TEX_SIZE );
+
+ for (y=0; y<TEX_SIZE; ++y) {
+ for (x=0; x<TEX_SIZE; ++x) {
+ float r2 = ((x-w2)*(x-w2)+(y-w2)*(y-w2));
+ float v = 120.0 * expf( -(r2) / s );
+ st->texture[4*(x+y*TEX_SIZE)] = (GLubyte)0;
+ st->texture[4*(x+y*TEX_SIZE)+1] = (GLubyte)0;
+ st->texture[4*(x+y*TEX_SIZE)+2] = (GLubyte)0;
+ st->texture[4*(x+y*TEX_SIZE)+3] = (GLubyte)v;
+ }
+ }
+
+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+ glGenTextures( 1, &st->texture_name );
+ glBindTexture( GL_TEXTURE_2D, st->texture_name );
+
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, st->texture );
+}
+
+static void draw_nucleus( State *st )
+{
+ if (-1 == st->nucleus_list) {
+ float z = -1.2f;
+ float r=1.0/2.0f;
+ st->nucleus_list = glGenLists( 1 );
+ glNewList( st->nucleus_list, GL_COMPILE );
+ glBegin( GL_QUADS );
+ glTexCoord2f( 0.0f, 0.0f ); glVertex3f( -r, -r, z );
+ glTexCoord2f( 0.0f, 1.0f ); glVertex3f( -r, r, z );
+ glTexCoord2f( 1.0f, 1.0f ); glVertex3f( r, r, z );
+ glTexCoord2f( 1.0f, 0.0f ); glVertex3f( r, -r, z );
+ glEnd();
+ glEndList();
+ }
+
+ glCallList( st->nucleus_list );
+}
+
+static void create_cells( State *st )
+{
+ int border = (int)(200.0 * st->screen_scale);
+ int i, foodcnt;
+ int w = st->width-2*border;
+ int h = st->height-2*border;
+
+ st->color[0] = 0.5 + random_max( 1000 ) * 0.0005;
+ st->color[1] = 0.5 + random_max( 1000 ) * 0.0005;
+ st->color[2] = 0.5 + random_max( 1000 ) * 0.0005;
+ st->color[3] = 1.0f;
+
+ /* allocate if startup */
+ if (!st->cell) {
+ st->cell = (Cell *) malloc( st->max_cells * sizeof(Cell));
+ }
+
+ /* fill the screen with random food for our little critters */
+ foodcnt = (st->width*st->height)/16;
+ for (i=0; i<foodcnt; ++i) {
+ st->food[i] = random_interval( st->minfood, st->maxfood );
+ }
+
+ /* create the requested seed-cells */
+ st->num_cells = st->num_seeds;
+
+ for (i=0; i<st->num_cells; ++i) {
+ st->cell[i].x = border + random_max( w );
+ st->cell[i].y = border + random_max( h );
+ st->cell[i].vx = 0.0;
+ st->cell[i].vy = 0.0;
+ st->cell[i].age = random_max( 0x0f );
+ st->cell[i].min_dist = 500.0;
+ st->cell[i].energy = random_interval( 5, 5+0x3f );
+ st->cell[i].rotation = ((double)random()/(double)RAND_MAX)*360.0;
+ st->cell[i].radius = st->radius;
+ st->cell[i].growth = 1.0;
+ }
+}
+
+/* all this is rather expensive :( */
+static void tick( State *st )
+{
+ int new_num_cells, num_cells=0;
+ int b, j;
+ int x, y, w4=st->width/4, h4=st->height/4, offset;
+ double min_dist;
+ int min_index;
+ int num_living = 0;
+ const double check_dist = 0.75*st->move_dist;
+ const double grow_dist = 0.75*st->radius;
+ const double adult_radius = st->radius;
+
+ /* find number of cells capable of division
+ and count living cells
+ */
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy > 0) num_living++;
+ if (can_divide( st, &st->cell[b] )) num_cells++;
+ }
+ new_num_cells = st->num_cells + num_cells;
+
+ /* end of simulation ? */
+ if (0 == num_living || new_num_cells >= st->max_cells) {
+ if (st->pause_counter > 0) st->pause_counter--;
+ if (st->pause_counter > 0) return;
+ create_cells( st );
+ st->pause_counter = st->pause;
+ } else if (num_cells) { /* any fertile candidates ? */
+ for (b=0, j=st->num_cells; b<st->num_cells; ++b) {
+ if (can_divide( st, &st->cell[b] )) {
+ st->cell[b].vx = random_interval( -50, 50 ) * 0.01;
+ st->cell[b].vy = random_interval( -50, 50 ) * 0.01;
+ st->cell[b].age = random_max( 0x0f );
+ /* half energy for both plus some bonus for forking */
+ st->cell[b].energy =
+ st->cell[b].energy/2 + random_max( 0x0f );
+ /* forking makes me shrink */
+ st->cell[b].growth = 0.995;
+
+ /* this one initially goes into the oposite direction */
+ st->cell[j].vx = -st->cell[b].vx;
+ st->cell[j].vy = -st->cell[b].vy;
+ /* same center */
+ st->cell[j].x = st->cell[b].x;
+ st->cell[j].y = st->cell[b].y;
+ st->cell[j].age = random_max( 0x0f );
+ st->cell[j].energy = (st->cell[b].energy);
+ st->cell[j].rotation =
+ ((double)random()/(double)RAND_MAX)*360.0;
+ st->cell[j].growth = st->cell[b].growth;
+ st->cell[j].radius = st->cell[b].radius;
+ ++j;
+ } else {
+ st->cell[b].vx = 0.0;
+ st->cell[b].vy = 0.0;
+ }
+ }
+
+ st->num_cells = new_num_cells;
+ }
+
+ /* for each find a direction to escape */
+ if (st->num_cells > 1) {
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy > 0) {
+ double vx;
+ double vy;
+ double len;
+
+ /* grow or shrink */
+ st->cell[b].radius *= st->cell[b].growth;
+ /* find closest neighbour */
+ min_dist = 100000.0;
+ min_index = 0;
+ for (j=0; j<st->num_cells; ++j) {
+ if (j!=b) {
+ const double dx = st->cell[b].x - st->cell[j].x;
+ const double dy = st->cell[b].y - st->cell[j].y;
+
+ if (fabs(dx) < check_dist || fabs(dy) < check_dist) {
+ const double dist = dx*dx+dy*dy;
+ /*const double dist = sqrt( dx*dx+dy*dy );*/
+ if (dist<min_dist) {
+ min_dist = dist;
+ min_index = j;
+ }
+ }
+ }
+ }
+ /* escape step is away from closest normalized with distance */
+ vx = st->cell[b].x - st->cell[min_index].x;
+ vy = st->cell[b].y - st->cell[min_index].y;
+ len = sqrt( vx*vx + vy*vy );
+ if (len > 0.0001) {
+ st->cell[b].vx = vx/len;
+ st->cell[b].vy = vy/len;
+ }
+ st->cell[b].min_dist = len;
+ /* if not adult (radius too small) */
+ if (st->cell[b].radius < adult_radius) {
+ /* if too small 60% stop shrinking */
+ if (st->cell[b].radius < adult_radius * 0.6) {
+ st->cell[b].growth = 1.0;
+ }
+ /* at safe distance we start growing again */
+ if (len > grow_dist) {
+ if (st->cell[b].energy > 30) {
+ st->cell[b].growth = 1.005;
+ }
+ }
+ } else { /* else keep size */
+ st->cell[b].growth = 1.0;
+ }
+ }
+ }
+ } else {
+ st->cell[0].min_dist = 2*st->move_dist;
+ }
+
+ /* now move em, snack and burn energy */
+ for (b=0; b<st->num_cells; ++b) {
+ /* if still alive */
+ if (st->cell[b].energy > 0) {
+ /* agility depends on amount of energy */
+ double fac = (double)st->cell[b].energy / 50.0;
+ if (fac < 0.0) fac = 0.0;
+ if (fac > 1.0) fac = 1.0;
+
+ st->cell[b].x += fac*(2.0 -
+ (4.0*(double)random() / (double)RAND_MAX) +
+ st->cell[b].vx);
+ st->cell[b].y += fac*(2.0 -
+ (4.0*(double)random() / (double)RAND_MAX) +
+ st->cell[b].vy);
+
+ /* get older and burn energy */
+ if (st->cell[b].energy > 0) {
+ st->cell[b].age++;
+ st->cell[b].energy--;
+ }
+
+ /* have a snack */
+ x = ((int)st->cell[b].x)/4;
+ if (x<0) x=0;
+ if (x>=w4) x = w4-1;
+ y = ((int)st->cell[b].y)/4;
+ if (y<0) y=0;
+ if (y>=h4) y = h4-1;
+
+ offset = x+y*w4;
+
+ /* don't eat if already satisfied */
+ if (st->cell[b].energy < 100 &&
+ st->food[offset] > 0) {
+ st->food[offset]--;
+ st->cell[b].energy++;
+ /* if you are hungry, eat more */
+ if (st->cell[b].energy < 50 &&
+ st->food[offset] > 0) {
+ st->food[offset]--;
+ st->cell[b].energy++;
+ }
+ }
+ }
+ }
+}
+
+ENTRYPOINT void
+reshape_glcells( ModeInfo *mi, int width, int height )
+{
+ State *st = &sstate[MI_SCREEN(mi)];
+# ifdef HAVE_MOBILE
+ int rot = current_device_rotation();
+# endif
+ st->height = height;
+ st->width = width;
+# ifdef HAVE_MOBILE
+ st->screen_scale = (double)(width < height ? width : height) / 1600.0;
+# else
+ st->screen_scale = (double)width / 1600.0;
+# endif
+
+ st->radius = s_radius;
+ if (st->radius < 5) st->radius = 5;
+ if (st->radius > 200) st->radius = 200;
+ st->radius *= st->screen_scale;
+
+ st->move_dist = s_min_dist;
+ if (st->move_dist < 1.0) st->move_dist = 1.0;
+ if (st->move_dist > 3.0) st->move_dist = 3.0;
+ st->move_dist *= st->radius;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho( 0, width, height, 0, 200, 0 );
+# ifdef HAVE_MOBILE
+ glRotatef (rot, 0, 0, 1);
+# endif
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ if (st->food) free( st->food );
+ st->food = (int *)malloc( ((width*height)/16)*sizeof(int) );
+ /* create_cells( st );*/
+
+# ifdef HAVE_MOBILE
+ glTranslatef (st->width/2, st->height/2, 0);
+ if (rot == 90 || rot == -90 || rot == 270 || rot == -270)
+ st->width = height, st->height = width;
+ glRotatef (rot, 0, 0, 1);
+ if (st->wire) glScalef(0.8, 0.8, 1);
+ glTranslatef (-st->width/2, -st->height/2, 0);
+# endif
+}
+
+ENTRYPOINT void
+init_glcells( ModeInfo *mi )
+{
+ int i, divisions;
+ State *st=0;
+
+ MI_INIT(mi, sstate);
+ st = &sstate[MI_SCREEN(mi)];
+
+ st->glx_context = init_GL(mi);
+ st->cell = 0;
+ st->num_cells = 0;
+ st->wire = MI_IS_WIREFRAME(mi);
+
+ /* get settings */
+ st->max_cells = s_maxcells;;
+ if (st->max_cells < 50) st->max_cells = 50;
+ if (st->max_cells > 10000) st->max_cells = 10000;
+
+ st->pause = s_pause;
+ if (st->pause < 0) st->pause = 0;
+ if (st->pause > 400) st->pause = 400;
+ st->pause_counter = st->pause;
+
+ st->radius = s_radius;
+ if (st->radius < 5) st->radius = 5;
+ if (st->radius > 200) st->radius = 200;
+
+ divisions = s_quality;
+ if (divisions < 0) divisions = 0;
+ if (divisions > 5) divisions = 5;
+
+ st->num_seeds = s_seeds;
+ if (st->num_seeds < 1) st->num_seeds = 1;
+ if (st->num_seeds > 16) st->num_seeds = 16;
+
+ st->minfood = s_minfood;
+ if (st->minfood < 0) st->minfood = 0;
+ if (st->minfood > 1000) st->minfood = 1000;
+
+ st->maxfood = s_maxfood;
+ if (st->maxfood < 0) st->maxfood = 0;
+ if (st->maxfood > 1000) st->maxfood = 1000;
+
+ if (st->maxfood < st->minfood) st->maxfood = st->minfood+1;
+
+ st->keep_old_cells = s_keepold;
+
+ st->divide_age = s_divideage;
+ if (st->divide_age < 1) st->divide_age = 1;
+ if (st->divide_age > 1000) st->divide_age = 1000;
+
+ st->move_dist = s_min_dist;
+ if (st->move_dist < 1.0) st->move_dist = 1.0;
+ if (st->move_dist > 3.0) st->move_dist = 3.0;
+ st->move_dist *= st->radius;
+
+ for (i=0; i<NUM_CELL_SHAPES; ++i) st->cell_list[i] = -1;
+ st->nucleus_list = -1;
+ st->food = 0;
+
+ st->sphere = create_sphere( st, divisions );
+ st->disturbance =
+ (double *) malloc( st->sphere->num_vertex*sizeof(double) );
+ for (i=0; i<st->sphere->num_vertex; ++i) {
+ st->disturbance[i] =
+ 0.05-((double)random()/(double)RAND_MAX*0.1);
+ }
+
+ create_nucleus_texture( st );
+
+ reshape_glcells (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+ENTRYPOINT void
+draw_glcells( ModeInfo *mi )
+{
+ State *st = &sstate[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!st->glx_context) return;
+
+ glXMakeCurrent( MI_DISPLAY(mi), MI_WINDOW(mi),
+ *(st->glx_context) );
+
+ mi->polygon_count = render( st );
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers( dpy, window );
+}
+
+ENTRYPOINT void
+free_glcells( ModeInfo *mi )
+{
+ int i;
+ State *st = &sstate[MI_SCREEN(mi)];
+
+ if (st->glx_context) {
+ glXMakeCurrent( MI_DISPLAY(mi), MI_WINDOW(mi),
+ *(st->glx_context) );
+
+ /* nuke everything before exit */
+ if (st->sphere) free_Object( st->sphere );
+ if (st->food) free( st->food );
+ for (i=0; i<NUM_CELL_SHAPES; ++i) {
+ if (st->cell_list[i] != -1) {
+ glDeleteLists( st->cell_list[i], 1 );
+ }
+ }
+ if (st->cell) free( st->cell );
+ free( st->disturbance );
+ glDeleteTextures( 1, &st->texture_name );
+ free( st->texture );
+ }
+}
+
+XSCREENSAVER_MODULE( "GLCells", glcells )
diff --git a/hacks/glx/glcells.man b/hacks/glx/glcells.man
new file mode 100644
index 0000000..6c1e7e9
--- /dev/null
+++ b/hacks/glx/glcells.man
@@ -0,0 +1,97 @@
+.TH XScreenSaver 1 "June 2007"
+.SH NAME
+glcells \- growing cells graphics hack
+.SH SYNOPSIS
+.B glcells
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fInum\fP] [\-pause \fInum\fP] [\-maxcells \fInum\fP]
+[\-radius \fInum\fP] [\-seeds \fInum\fP] [\-quality \fInum\fP]
+[\-minfood \fInum\fP] [\-maxfood \fInum\fP] [\-divideage \fInum\fP]
+[\-mindist \fInum\fP]
+[\-keepold]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIglcells\fP program draws cells that divide exponentially, eat and eventually die.
+.SH OPTIONS
+.I glcells
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-pause \fInum\fP\fP
+Specifies the pause at the end of the animation (all cells dead or maximum amount of cells reached). Unit is in frames, default 20.
+.TP 8
+.B \-maxcells \fInum\fP\fP
+Specifies the maximum number of cells on screen (dead cells also count, even if invisible). Default is 800.
+.TP 8
+.B \-radius \fInum\fP\fP
+Specifies the radius of the cells. Default is 40.
+.TP 8
+.B \-seeds \fInum\fP\fP
+Specifies the number of cells when animation starts. Default is 1.
+.TP 8
+.B \-quality \fInum\fP\fP
+Specifies subdivision quality of the spheres used to draw the cells [0...5]. Default is 3.
+.TP 8
+.B \-minfood \fInum\fP\fP
+Food is ditributed randomly on the screen (Yes, the cells need to eat). This parameter specifies the
+minimum amount of food per pixel. Default is 5.
+.TP 8
+.B \-maxfood \fInum\fP\fP
+Food is ditributed randomly on the screen (Yes, the cells need to eat). This parameter specifies the
+maximum amount of food per pixel. Default is 20.
+.TP 8
+.B \-divideage \fInum\fP\fP
+Specifies the minimum age in frames a cell needs to have before beeing able to divide. Default is 20
+.TP 8
+.B \-mindist \fInum\fP\fP
+Specifies the minimum distance between cells. Default 1.4
+.TP 8
+.B \-delay \fInum\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-wireframe
+Draw wireframe only.
+.TP 8
+.B \-keepold
+Dead cells stay on screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.SH COPYRIGHT
+Copyright \(co 2007 by Matthias Toussaint. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Matthias Toussaint <glcells@mtoussaint.de>, 17-Jun-2007, http://www.mtoussaint.de/bits.html.
+
diff --git a/hacks/glx/gleidescope.c b/hacks/glx/gleidescope.c
new file mode 100644
index 0000000..ec33388
--- /dev/null
+++ b/hacks/glx/gleidescope.c
@@ -0,0 +1,1624 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* vim: set ai ts=4 sw=4: */
+
+#if 0
+/*static const char sccsid[] = "@(#)gleidescope.c 1.0 03/06/27 xlockmore";*/
+#endif
+
+/* enable -grab switch for animations */
+#undef GRAB
+
+#undef DISPLAY_TEXTURE
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ *
+ * 20030627 1.0 acd First Release.
+ * Texture loading code from 'glplanet'
+ * by Jamie Zawinski <jwz@jwz.org>
+ * 20030810 1.1 acd Added size flag.
+ * Now grabs screen / video / picture
+ * (uses code from 'glslideshow' by
+ * Mike Oliphant, Ben Buxton, Jamie Zawinski).
+ * Added -duration.
+ * Added mouse code.
+ * Added fade code (also from glslideshow).
+ * 20031013 1.2 acd Migrated to compile without warnings under
+ * xscreensaver 4.13.
+ * 20031023 1.3 acd Better code to limit twisting speeds.
+ * Tweaked initial rotation values.
+ * Move, Rotate, Zoom now chosen at random if
+ * no preference is given.
+ * Made grid slightly bigger so you can't see
+ * the edge when zooming and moving.
+ * 20061226 1.4 acd Now uses GL Display Lists.
+ * 20070318 1.5 acd Generates textures.
+ * Fixed texture size problem (and introduced another).
+ * 20070412 1.6 acd Textures now have independant sizes.
+ * 20070413 1.7 acd Added Lissajous movement pattern.
+ * 20070414 1.8 acd Added corners movement pattern.
+ * 20080319 1.9 acd Changes to arguments for saner gleidescope.xml.
+ *
+ * TODO
+ * generate textures myself - render random shapes to 256x256 texture. (done)
+ * lower res for checks and random - use 256 and 4x4 or 8x8 pixels. (disabled for now)
+ * gnome-saver doesn't let you specify source directory so add that to this.
+ * image loading routine is too slow - rotation grinds to a halt - stop using it. (better in version 5)
+ * image loading also looks bad for non-square images - edges are black. (fixed)
+ * possible to see edge of the world on widescreen terminals - use larger grid and hidden hex removal?
+ * fading textures may have different max_tx - use two sets. (done)
+ * choice of movement patterns. (3 implemented, chooseable at compile time)
+ * look into rangle and tangle.
+ */
+
+/*
+**----------------------------------------------------------------------------
+** Defines
+**----------------------------------------------------------------------------
+*/
+
+#ifdef STANDALONE
+# define DEFAULTS \
+ "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*size: 0 \n" \
+ "*useSHM: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_gleidescope 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "colors.h"
+#include "ximage-loader.h"
+#include "grab-ximage.h"
+
+#ifdef GRAB
+void grab_frame(Display *display, Window window);
+#endif
+
+/* acd TODO should all these be in gleidestruct? */
+/* they can't be, because of the idiotic way the xlockmore "argtype vars"
+ interface works. -jwz */
+#ifdef GRAB
+static Bool grab; /* grab images */
+#endif
+static Bool move; /* moving camera */
+static Bool nomove; /* no moving camera */
+static Bool rotate; /* rotate in place */
+static Bool norotate; /* no rotate in place */
+static Bool zoom; /* zooming camera */
+static Bool nozoom; /* no zooming camera */
+static char *image_str; /* name of texture to load */
+static int duration; /* length of time to display grabbed image */
+
+#define MAX_CAM_SPEED 1.0
+#define MAX_ANGLE_VEL 1.0
+#define INITIAL_ANGLE_VEL 0.2
+#define INITIAL_ANGLE_ACC 0.001
+#define TWISTING_PROBABILITY 1000 /* 1 in ... of change of acceleration */
+
+#define RADIANS (M_PI / 180)
+#define ANGLE_120 (M_PI * 2 / 3)
+#define ANGLE_240 (M_PI * 4 / 3)
+
+#define DEF_GRAB "False"
+#define DEF_MOVE "False"
+#define DEF_NOMOVE "False"
+#define DEF_ROTATE "False"
+#define DEF_NOROTATE "False"
+#define DEF_ZOOM "False"
+#define DEF_NOZOOM "False"
+#define DEF_IMAGE "DEFAULT"
+#define DEF_DURATION "30"
+
+
+static XrmOptionDescRec opts[] =
+{
+#ifdef GRAB
+ {"-grab", ".gleidescope.grab", XrmoptionNoArg, "true"},
+#endif
+ {"-move", ".gleidescope.move", XrmoptionNoArg, "true"},
+ {"-no-move", ".gleidescope.nomove", XrmoptionNoArg, "true"},
+ {"-rotate", ".gleidescope.rotate", XrmoptionNoArg, "true"},
+ {"-no-rotate", ".gleidescope.norotate", XrmoptionNoArg, "true"},
+ {"-zoom", ".gleidescope.zoom", XrmoptionNoArg, "true"},
+ {"-no-zoom", ".gleidescope.nozoom", XrmoptionNoArg, "true"},
+ {"-image", ".gleidescope.image", XrmoptionSepArg, "DEFAULT"},
+ {"-duration", ".gleidescope.duration", XrmoptionSepArg, "30"},
+};
+
+
+static argtype vars[] = {
+#ifdef GRAB
+ {&grab, "grab", "Grab", DEF_GRAB, t_Bool},
+#endif
+ {&move, "move", "Move", DEF_MOVE, t_Bool},
+ {&nomove, "nomove", "noMove", DEF_NOMOVE, t_Bool},
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&norotate, "norotate", "noRotate", DEF_NOROTATE, t_Bool},
+ {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Bool},
+ {&nozoom, "nozoom", "noZoom", DEF_NOZOOM, t_Bool},
+ {&image_str, "image", "Image", DEF_IMAGE, t_String},
+ {&duration, "duration", "Duration", DEF_DURATION, t_Int},
+};
+
+static OptionStruct desc[] = {
+#ifdef GRAB
+ {"-grab", "grab images to create animation"},
+#endif
+ {"-move", "camera will move"},
+ {"-no-move", "camera won't move"},
+ {"-rotate", "camera will rotate"},
+ {"-no-rotate", "camera won't rotate"},
+ {"-zoom", "camera will zoom"},
+ {"-no-zoom", "camera won't zoom"},
+ {"-image", "xpm / xbm image file to use for texture"},
+ {"-duration", "length of time texture will be used"},
+};
+
+ENTRYPOINT ModeSpecOpt gleidescope_opts = {
+ sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars,
+ desc
+};
+
+#ifdef USE_MODULES
+ModStruct gleidescope_description = {
+ "gleidescope", "init_gleidescope", "draw_gleidescope", NULL,
+ "draw_gleidescope", "init_gleidescope", "free_gleidescope",
+ &gleidescope_opts, 1000, 1, 2, 1, 4, 1.0, "",
+ "GL Kaleidescope", 0, NULL};
+#endif
+
+/*
+**-----------------------------------------------------------------------------
+** Typedefs
+**-----------------------------------------------------------------------------
+*/
+
+typedef struct hex_s {
+ GLfloat x, y, z; /* position */
+} hex_t;
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+} vectorf;
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+} vector2f;
+
+typedef struct {
+ GLuint id; /* opengl texture id */
+ GLfloat width, height; /* texture width and height */
+ GLfloat min_tx, min_ty; /* minimum texture sizes */
+ GLfloat max_tx, max_ty; /* maximum texture sizes */
+ time_t start_time;
+ Bool button_down_p;
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+ /* r_phase is for triangle rotation speed */
+ GLfloat x_period, y_period, r_period;
+ GLfloat x_phase, y_phase, r_phase;
+} texture;
+
+#define MAX_FADE 500 /* number of fade cycles */
+
+typedef struct {
+ float cam_x_speed, cam_z_speed, cam_y_speed;
+ int cam_x_phase, cam_z_phase, cam_y_phase;
+ float tic;
+ GLXContext *glx_context;
+ Window window;
+ texture textures[2]; /* texture handles */
+ GLuint visible; /* index for current texture */
+ GLint fade;
+ time_t start_time;
+ Bool button_down_p;
+
+ int size;
+ int list;
+
+ float tangle; /* texture angle (degrees) */
+ float tangle_vel; /* texture velocity */
+ float tangle_acc; /* texture acceleration */
+
+ float rangle; /* rotate angle */
+ float rangle_vel; /* rotate velocity */
+ float rangle_acc; /* rotate acceleration */
+
+ /* mouse */
+ int xstart;
+ int ystart;
+ double xmouse;
+ double ymouse;
+
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+
+} gleidestruct;
+
+#define frandrange(x, y) (x + frand(y - x))
+
+#define XOFFSET (0.8660254f) /* sin 60' */
+#define YOFFSET (1.5000000f) /* cos 60' + 1 */
+
+#if 0
+
+#define SIZE 3
+
+/* generates a grid with edges of given size */
+/* acd TODO - replace hex[] with this and allow size and distance as parameters */
+
+int
+generate_grid(int size)
+
+ int i, x, y;
+
+ gp->size--;
+
+ i = gp->size;
+ for (y = -size ; y <= size ; y++) {
+ for (x = -i ; x <= i ; x += 2) {
+ printf("{XOFFSET * %d, YOFFSET * %d, 0},\n", x, y);
+ }
+ printf("\n");
+ if (y < 0) {
+ i++;
+ } else {
+ i--;
+ }
+ }
+ return 0;
+}
+#endif
+
+/* acd - this is terrible - 120+ hexes */
+static const hex_t hex[] = {
+ /* edges of size 7 */
+ /* number of hexagons required to cover screen depends on camera distance */
+ /* at a distance of 10 this is just about enough. */
+ {XOFFSET * -6, YOFFSET * -6, 0},
+ {XOFFSET * -4, YOFFSET * -6, 0},
+ {XOFFSET * -2, YOFFSET * -6, 0},
+ {XOFFSET * 0, YOFFSET * -6, 0},
+ {XOFFSET * 2, YOFFSET * -6, 0},
+ {XOFFSET * 4, YOFFSET * -6, 0},
+ {XOFFSET * 6, YOFFSET * -6, 0},
+
+ {XOFFSET * -7, YOFFSET * -5, 0},
+ {XOFFSET * -5, YOFFSET * -5, 0},
+ {XOFFSET * -3, YOFFSET * -5, 0},
+ {XOFFSET * -1, YOFFSET * -5, 0},
+ {XOFFSET * 1, YOFFSET * -5, 0},
+ {XOFFSET * 3, YOFFSET * -5, 0},
+ {XOFFSET * 5, YOFFSET * -5, 0},
+ {XOFFSET * 7, YOFFSET * -5, 0},
+
+ {XOFFSET * -8, YOFFSET * -4, 0},
+ {XOFFSET * -6, YOFFSET * -4, 0},
+ {XOFFSET * -4, YOFFSET * -4, 0},
+ {XOFFSET * -2, YOFFSET * -4, 0},
+ {XOFFSET * 0, YOFFSET * -4, 0},
+ {XOFFSET * 2, YOFFSET * -4, 0},
+ {XOFFSET * 4, YOFFSET * -4, 0},
+ {XOFFSET * 6, YOFFSET * -4, 0},
+ {XOFFSET * 8, YOFFSET * -4, 0},
+
+ {XOFFSET * -9, YOFFSET * -3, 0},
+ {XOFFSET * -7, YOFFSET * -3, 0},
+ {XOFFSET * -5, YOFFSET * -3, 0},
+ {XOFFSET * -3, YOFFSET * -3, 0},
+ {XOFFSET * -1, YOFFSET * -3, 0},
+ {XOFFSET * 1, YOFFSET * -3, 0},
+ {XOFFSET * 3, YOFFSET * -3, 0},
+ {XOFFSET * 5, YOFFSET * -3, 0},
+ {XOFFSET * 7, YOFFSET * -3, 0},
+ {XOFFSET * 9, YOFFSET * -3, 0},
+
+ {XOFFSET * -10, YOFFSET * -2, 0},
+ {XOFFSET * -8, YOFFSET * -2, 0},
+ {XOFFSET * -6, YOFFSET * -2, 0},
+ {XOFFSET * -4, YOFFSET * -2, 0},
+ {XOFFSET * -2, YOFFSET * -2, 0},
+ {XOFFSET * 0, YOFFSET * -2, 0},
+ {XOFFSET * 2, YOFFSET * -2, 0},
+ {XOFFSET * 4, YOFFSET * -2, 0},
+ {XOFFSET * 6, YOFFSET * -2, 0},
+ {XOFFSET * 8, YOFFSET * -2, 0},
+ {XOFFSET * 10, YOFFSET * -2, 0},
+
+ {XOFFSET * -11, YOFFSET * -1, 0},
+ {XOFFSET * -9, YOFFSET * -1, 0},
+ {XOFFSET * -7, YOFFSET * -1, 0},
+ {XOFFSET * -5, YOFFSET * -1, 0},
+ {XOFFSET * -3, YOFFSET * -1, 0},
+ {XOFFSET * -1, YOFFSET * -1, 0},
+ {XOFFSET * 1, YOFFSET * -1, 0},
+ {XOFFSET * 3, YOFFSET * -1, 0},
+ {XOFFSET * 5, YOFFSET * -1, 0},
+ {XOFFSET * 7, YOFFSET * -1, 0},
+ {XOFFSET * 9, YOFFSET * -1, 0},
+ {XOFFSET * 11, YOFFSET * -1, 0},
+
+ {XOFFSET * -12, YOFFSET * 0, 0},
+ {XOFFSET * -10, YOFFSET * 0, 0},
+ {XOFFSET * -8, YOFFSET * 0, 0},
+ {XOFFSET * -6, YOFFSET * 0, 0},
+ {XOFFSET * -4, YOFFSET * 0, 0},
+ {XOFFSET * -2, YOFFSET * 0, 0},
+ {XOFFSET * 0, YOFFSET * 0, 0},
+ {XOFFSET * 2, YOFFSET * 0, 0},
+ {XOFFSET * 4, YOFFSET * 0, 0},
+ {XOFFSET * 6, YOFFSET * 0, 0},
+ {XOFFSET * 8, YOFFSET * 0, 0},
+ {XOFFSET * 10, YOFFSET * 0, 0},
+ {XOFFSET * 12, YOFFSET * 0, 0},
+
+ {XOFFSET * -11, YOFFSET * 1, 0},
+ {XOFFSET * -9, YOFFSET * 1, 0},
+ {XOFFSET * -7, YOFFSET * 1, 0},
+ {XOFFSET * -5, YOFFSET * 1, 0},
+ {XOFFSET * -3, YOFFSET * 1, 0},
+ {XOFFSET * -1, YOFFSET * 1, 0},
+ {XOFFSET * 1, YOFFSET * 1, 0},
+ {XOFFSET * 3, YOFFSET * 1, 0},
+ {XOFFSET * 5, YOFFSET * 1, 0},
+ {XOFFSET * 7, YOFFSET * 1, 0},
+ {XOFFSET * 9, YOFFSET * 1, 0},
+ {XOFFSET * 11, YOFFSET * 1, 0},
+
+ {XOFFSET * -10, YOFFSET * 2, 0},
+ {XOFFSET * -8, YOFFSET * 2, 0},
+ {XOFFSET * -6, YOFFSET * 2, 0},
+ {XOFFSET * -4, YOFFSET * 2, 0},
+ {XOFFSET * -2, YOFFSET * 2, 0},
+ {XOFFSET * 0, YOFFSET * 2, 0},
+ {XOFFSET * 2, YOFFSET * 2, 0},
+ {XOFFSET * 4, YOFFSET * 2, 0},
+ {XOFFSET * 6, YOFFSET * 2, 0},
+ {XOFFSET * 8, YOFFSET * 2, 0},
+ {XOFFSET * 10, YOFFSET * 2, 0},
+
+ {XOFFSET * -9, YOFFSET * 3, 0},
+ {XOFFSET * -7, YOFFSET * 3, 0},
+ {XOFFSET * -5, YOFFSET * 3, 0},
+ {XOFFSET * -3, YOFFSET * 3, 0},
+ {XOFFSET * -1, YOFFSET * 3, 0},
+ {XOFFSET * 1, YOFFSET * 3, 0},
+ {XOFFSET * 3, YOFFSET * 3, 0},
+ {XOFFSET * 5, YOFFSET * 3, 0},
+ {XOFFSET * 7, YOFFSET * 3, 0},
+ {XOFFSET * 9, YOFFSET * 3, 0},
+
+ {XOFFSET * -8, YOFFSET * 4, 0},
+ {XOFFSET * -6, YOFFSET * 4, 0},
+ {XOFFSET * -4, YOFFSET * 4, 0},
+ {XOFFSET * -2, YOFFSET * 4, 0},
+ {XOFFSET * 0, YOFFSET * 4, 0},
+ {XOFFSET * 2, YOFFSET * 4, 0},
+ {XOFFSET * 4, YOFFSET * 4, 0},
+ {XOFFSET * 6, YOFFSET * 4, 0},
+ {XOFFSET * 8, YOFFSET * 4, 0},
+
+ {XOFFSET * -7, YOFFSET * 5, 0},
+ {XOFFSET * -5, YOFFSET * 5, 0},
+ {XOFFSET * -3, YOFFSET * 5, 0},
+ {XOFFSET * -1, YOFFSET * 5, 0},
+ {XOFFSET * 1, YOFFSET * 5, 0},
+ {XOFFSET * 3, YOFFSET * 5, 0},
+ {XOFFSET * 5, YOFFSET * 5, 0},
+ {XOFFSET * 7, YOFFSET * 5, 0},
+
+ {XOFFSET * -6, YOFFSET * 6, 0},
+ {XOFFSET * -4, YOFFSET * 6, 0},
+ {XOFFSET * -2, YOFFSET * 6, 0},
+ {XOFFSET * 0, YOFFSET * 6, 0},
+ {XOFFSET * 2, YOFFSET * 6, 0},
+ {XOFFSET * 4, YOFFSET * 6, 0},
+ {XOFFSET * 6, YOFFSET * 6, 0},
+};
+
+/*
+**----------------------------------------------------------------------------
+** Local Variables
+**----------------------------------------------------------------------------
+*/
+
+static gleidestruct *gleidescope = NULL;
+
+#if 0
+/*
+ *load defaults in config structure
+ */
+static void setdefaultconfig(void)
+{
+#ifdef GRAB
+ grab = False;
+#endif
+ move = False;
+ rotate = False;
+ zoom = False;
+ image = NULL;
+}
+#endif
+
+ENTRYPOINT Bool
+gleidescope_handle_event(ModeInfo *mi, XEvent *event)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ /*
+ printf("event:%d\n", event->xany.type);
+ printf("button:%d\n", event->xbutton.button);
+ */
+ if (event->xany.type == ButtonPress)
+ {
+ if (event->xbutton.button == Button1 ||
+ event->xbutton.button == Button3)
+ {
+ /* store initial values of mouse */
+ gp->xstart = event->xbutton.x;
+ gp->ystart = event->xbutton.y;
+
+ /* button is down */
+ gp->button_down_p = True;
+ return True;
+ }
+#if 0 /* TODO */
+ else if (event->xbutton.button == Button4)
+ {
+ /* zoom in */
+ return True;
+ }
+ else if (event->xbutton.button == Button5)
+ {
+ /* zoom out */
+ return True;
+ }
+#endif
+ } else if (event->xany.type == ButtonRelease)
+ {
+ if (event->xbutton.button == Button1 ||
+ event->xbutton.button == Button3)
+ {
+ /* button is up */
+ gp->button_down_p = False;
+ return True;
+ }
+ } else if (event->xany.type == MotionNotify)
+ {
+ if (gp->button_down_p)
+ {
+ /* update mouse position */
+ gp->xmouse += (double)(event->xmotion.x - gp->xstart) / MI_WIDTH(mi);
+ gp->ymouse += (double)(event->xmotion.y - gp->ystart) / MI_HEIGHT(mi);
+ gp->xstart = event->xmotion.x;
+ gp->ystart = event->xmotion.y;
+
+ return True;
+ }
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ gp->start_time = -1;
+ gp->fade = 0;
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ texture *tp = (texture *) closure;
+
+#if 0
+ gp->max_tx = (GLfloat) image_width / texture_width;
+ gp->max_ty = (GLfloat) image_height / texture_height;
+#endif
+
+ /* new - taken from flipscreen */
+ tp->width = texture_width;
+ tp->height = texture_height;
+ tp->min_tx = (GLfloat) geometry->x / tp->width;
+ tp->min_ty = (GLfloat) geometry->y / tp->height;
+ tp->max_tx = (GLfloat) (geometry->x + geometry->width) / tp->width;
+ tp->max_ty = (GLfloat) (geometry->y + geometry->height) / tp->height;
+
+#ifdef DEBUG
+ printf("Image w,h: (%d, %d)\n", image_width, image_height);
+ printf("Texture w,h: (%d, %d)\n", texture_width, texture_height);
+ printf("Geom x,y: (%d, %d)\n", geometry->x, geometry->y);
+ printf("Geom w,h: (%d, %d)\n", geometry->width, geometry->height);
+ printf("Max Tx,Ty: (%f, %f)\n", tp->max_tx, tp->max_ty);
+#endif
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (tp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ tp->waiting_for_image_p = False;
+ tp->start_time = time ((time_t *) 0);
+}
+
+static void
+getSnapshot(ModeInfo *mi, texture *texture)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+#ifdef DEBUG
+ printf("getSnapshot");
+#endif
+
+ if (MI_IS_WIREFRAME(mi))
+ return;
+
+ gp->mipmap_p = True;
+ load_texture_async (mi->xgwa.screen, mi->window,
+ *gp->glx_context, 0, 0, gp->mipmap_p,
+ texture->id, image_loaded_cb, texture);
+ texture->start_time = time((time_t *)0);
+}
+
+#define TEXTURE_SIZE 256
+
+static void
+plot(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
+ int c;
+ if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
+ return;
+ }
+ c = ((x * TEXTURE_SIZE) + y) * 4;
+ /*printf("(%d,%d)[%d]\n", x, y, c);*/
+ buffer[c + 0] = r;
+ buffer[c + 1] = g;
+ buffer[c + 2] = b;
+ buffer[c + 3] = a;
+}
+
+#if 0
+static void
+plot2(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
+ int c;
+ if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
+ return;
+ }
+ c = ((x * TEXTURE_SIZE) + y) * 4;
+ /*printf("(%d,%d)[%d]\n", x, y, c);*/
+ buffer[c + 0] = r;
+ buffer[c + 1] = g;
+ buffer[c + 2] = b;
+ buffer[c + 3] = a;
+
+ if (y + 1 < TEXTURE_SIZE) {
+ buffer[c + 4] = r;
+ buffer[c + 5] = g;
+ buffer[c + 6] = b;
+ buffer[c + 7] = a;
+ }
+
+ if (x + 1 < TEXTURE_SIZE) {
+ c += (TEXTURE_SIZE * 4);
+ buffer[c + 0] = r;
+ buffer[c + 1] = g;
+ buffer[c + 2] = b;
+ buffer[c + 3] = a;
+ if (y + 1 < TEXTURE_SIZE) {
+ buffer[c + 4] = r;
+ buffer[c + 5] = g;
+ buffer[c + 6] = b;
+ buffer[c + 7] = a;
+ }
+ }
+}
+#endif
+
+/* draw geometric shapes to texture */
+/* modifies passed in buffer */
+static void
+draw_shapes (unsigned char *buffer) {
+ int a = 0xff;
+ int x, y, w, h;
+ int i, j;
+ int s;
+ float left, right;
+
+ for (i = 0 ; i < TEXTURE_SIZE * TEXTURE_SIZE * 4 ; i += 4) {
+ buffer[i + 0] = 0x00;
+ buffer[i + 1] = 0x00;
+ buffer[i + 2] = 0x00;
+ buffer[i + 3] = 0xff;
+ }
+
+ for (s = 0 ; s < 25 ; s++) {
+ int shape = random() % 3;
+
+ /* 8 bits */
+ int r = (random() & 0xff);
+ int g = (random() & 0xff);
+ int b = (random() & 0xff);
+
+ switch (shape) {
+ case 0:
+ /* rectangle */
+ x = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4); /* top left */
+ y = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4);
+ w = 10 + random() % (TEXTURE_SIZE / 4); /* size */
+ h = 10 + random() % (TEXTURE_SIZE / 4);
+#ifdef DEBUG
+ printf("Rectangle: (%d, %d)(%d, %d)\n", x, y, w, h);
+#endif
+ if (x < 0) {
+ x = 0;
+ }
+ if (y < 0) {
+ y = 0;
+ }
+ for (i = x ; i < x + w && i < TEXTURE_SIZE; i++) {
+ for (j = y ; j < y + h && j < TEXTURE_SIZE; j++) {
+ plot(buffer, i, j, r, g, b, a);
+ }
+ }
+ break;
+
+ case 1:
+ /* circle */
+ x = random() % TEXTURE_SIZE; /* centre */
+ y = random() % TEXTURE_SIZE;
+ h = 10 + random() % (TEXTURE_SIZE / 8); /* radius */
+#ifdef DEBUG
+ printf("Circle: %d, %d, %d\n", x, y, h);
+#endif
+ for (i = 0 ; i < h ; i++) {
+ int xdist = i * i;
+ for (j = 0 ; j < h ; j++) {
+ int ydist = j * j;
+ /*
+ printf("xdist: %d\n", xdist);
+ printf("ydist: %d\n", ydist);
+ printf("radius: %d\n", h * h);
+ */
+ if ((xdist + ydist) < (h * h)) {
+ plot(buffer, x + i, y + j, r, b, g, a);
+ /* check we haven't already done these */
+ if (j != 0) {
+ plot(buffer, x + i, y - j, r, b, g, a);
+ }
+ if (i != 0) {
+ plot(buffer, x - i, y + j, r, b, g, a);
+ if (j != 0) {
+ plot(buffer, x - i, y - j, r, b, g, a);
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case 2:
+ /* triangle */
+ x = random() % TEXTURE_SIZE; /* top */
+ y = random() % TEXTURE_SIZE;
+ h = 10 + random() % (TEXTURE_SIZE / 4); /* height */
+#ifdef DEBUG
+ printf("Triangle: %d, %d, %d\n", x, y, h);
+#endif
+ left = x;
+ right = x;
+ for (i = 0 ; i < h ; i++) {
+ for (j = left ; j < right ; j++) {
+ plot(buffer, j, y + i, r, g, b, a);
+ }
+ left -= .5;
+ right += .5;
+ }
+ break;
+ }
+ }
+}
+
+static void
+setup_random_texture (ModeInfo *mi, texture *texture)
+{
+ int width = 0, height = 0;
+ char buf[1024];
+ unsigned char *my_data = NULL;
+#if 0
+ int i, j, c;
+ int style;
+ int r0, g0, b0, a0, r1, g1, b1, a1;
+#endif
+
+#ifdef DEBUG
+ printf("RandomTexture\n");
+#endif
+
+ /* use this texture */
+ glBindTexture(GL_TEXTURE_2D, texture->id);
+
+ clear_gl_error();
+
+ /*
+ * code for various generated patterns - noise, stripes, checks etc.
+ * random geometric shapes looked the best.
+ */
+
+#if 0
+ style = random() & 0x3;
+ r0 = random() & 0xff;
+ g0 = random() & 0xff;
+ b0 = random() & 0xff;
+ a0 = 0xff;
+ r1 = random() & 0xff;
+ g1 = random() & 0xff;
+ b1 = random() & 0xff;
+ a1 = 0xff;
+
+ switch (style) {
+ case 0: /* random */
+ printf("Random0\n");
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ for (i = 0 ; i < width ; i += 2) {
+ for (j = 0 ; j < height ; j += 2) {
+ r0 = random() & 0xff;
+ g0 = random() & 0xff;
+ b0 = random() & 0xff;
+ a0 = 0xff;
+ plot2(my_data, i, j, r0, g0, b0, a0);
+ }
+ }
+ break;
+
+ case 1: /* shapes */
+#endif
+#ifdef DEBUG
+ printf("Shapes\n");
+#endif
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ draw_shapes(my_data);
+#if 0
+ break;
+
+ case 2: /* check */
+ printf("Check\n");
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ for (i = 0 ; i < height ; i += 2) {
+ for (j = 0 ; j < width ; j += 2) {
+ if (((i + j) & 0x3) == 0) {
+ plot2(my_data, i, j, r0, g0, b0, a0);
+ } else {
+ plot2(my_data, i, j, r1, g1, b1, a1);
+ }
+ }
+ }
+ break;
+
+ case 3: /* random stripes */
+ printf("Stripes 2\n");
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ for (i = 0 ; i < height ; i += 2) {
+ r0 = random() & 0xff;
+ g0 = random() & 0xff;
+ b0 = random() & 0xff;
+ a0 = 0xff;
+ for (j = 0 ; j < width ; j += 2) {
+ plot2(my_data, i, j, r0, g0, b0, a0);
+ }
+ }
+ break;
+ }
+#endif
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ width, height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, my_data);
+ sprintf (buf, "random texture: (%dx%d)",
+ width, height);
+ check_gl_error(buf);
+
+ /* setup parameters for texturing */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ if (random() & 0x1) {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ } else {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
+
+ if (my_data != NULL) {
+ free(my_data);
+ my_data = NULL;
+ }
+
+ /* use full texture */
+ /* acd - was 1.0 */
+ texture->min_tx = 0.0;
+ texture->max_tx = 2.0;
+ texture->min_ty = 0.0;
+ texture->max_ty = 2.0;
+ texture->start_time = time((time_t *)0);
+}
+
+static Bool
+setup_file_texture (ModeInfo *mi, char *filename, texture *texture)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+
+ XImage *image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+#ifdef DEBUG
+ printf("FileTexture\n");
+#endif
+
+ /* use this texture */
+ glBindTexture(GL_TEXTURE_2D, texture->id);
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+
+ /* setup parameters for texturing */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ /* use full texture */
+ texture->min_tx = 0.0;
+ texture->max_tx = 1.0;
+ texture->min_ty = 0.0;
+ texture->max_ty = 1.0;
+ texture->start_time = time((time_t *)0);
+ return True;
+}
+
+static void
+setup_texture(ModeInfo * mi, texture *texture)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ if (!image_str || !*image_str || !strcmp(image_str, "DEFAULT")) {
+ BUILTIN:
+ /* no image specified - use system settings */
+#ifdef DEBUG
+ printf("SetupTexture: get_snapshot\n");
+#endif
+ getSnapshot(mi, texture);
+ } else {
+ if (strcmp(image_str, "GENERATE") == 0) {
+#ifdef DEBUG
+ printf("SetupTexture: random_texture\n");
+#endif
+ setup_random_texture(mi, texture);
+ } else {
+ /* use supplied image file */
+#ifdef DEBUG
+ printf("SetupTexture: file_texture\n");
+#endif
+ if (! setup_file_texture(mi, image_str, texture))
+ goto BUILTIN;
+ }
+ }
+ /* copy start time from texture */
+ gp->start_time = texture->start_time;
+
+ check_gl_error("texture initialization");
+
+ /* acd
+ * resultant loaded image is upside down BUT
+ * it's a kaledescope and half of the hexagon is backwards anyway...
+ */
+
+ /* TODO: values for lissajous movement */
+ texture->x_period = frandrange(-2.0, 2.0);
+ texture->y_period = frandrange(-2.0, 2.0);
+ texture->r_period = frandrange(-2.0, 2.0);
+ texture->x_phase = frand(M_PI * 2);
+ texture->y_phase = frand(M_PI * 2);
+ texture->r_phase = frand(M_PI * 2);
+#ifdef DEBUG
+ printf("XPeriod %f XPhase %f\n", texture->x_period, texture->x_phase);
+ printf("YPeriod %f YPhase %f\n", texture->y_period, texture->y_phase);
+ printf("RPeriod %f RPhase %f\n", texture->r_period, texture->r_phase);
+#endif
+}
+
+#define VERTEX0 glVertex3f( 0.0000f, 0.000f, 0.0f);
+#define VERTEX1 glVertex3f( 0.0000f, 1.000f, 0.0f);
+#define VERTEX2 glVertex3f( XOFFSET, 0.500f, 0.0f);
+#define VERTEX3 glVertex3f( XOFFSET, -0.500f, 0.0f);
+#define VERTEX4 glVertex3f( 0.0000f, -1.000f, 0.0f);
+#define VERTEX5 glVertex3f(-XOFFSET, -0.500f, 0.0f);
+#define VERTEX6 glVertex3f(-XOFFSET, 0.500f, 0.0f);
+
+/*
+** Three different functions for calculating texture coordinates
+** which modify how the texture triangle moves over the source image.
+** Choose one.
+*/
+
+#if 0
+/* the classic equilateral triangle rotating around centre */
+static void
+calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
+
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat centre_x = 0.5;
+ GLfloat centre_y = 0.5;
+ GLfloat radius_x = (texture->max_tx - texture->min_tx) / 2;
+ GLfloat radius_y = (texture->max_ty - texture->min_ty) / 2;
+ GLfloat tangle2;
+ t[0].x = centre_x;
+ t[0].y = centre_y;
+
+ /* t[1] */
+ t[1].x = centre_x + .95 * radius_x * cos((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
+ t[1].y = centre_y + .95 * radius_y * sin((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
+
+ /* t[2] is always 60' further around than t2 */
+ tangle2 = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS) + (M_PI * 2 / 6);
+ t[2].x = centre_x + .95 * radius_x * cos(tangle2);
+ t[2].y = centre_y + .95 * radius_y * sin(tangle2);
+#if 0
+ printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
+#endif
+}
+#endif
+
+#if 1
+/* new lissajous movement pattern */
+static void
+calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
+
+ /* equilateral triangle rotating around centre */
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat width = texture->max_tx - texture->min_tx;
+ GLfloat height = texture->max_ty - texture->min_ty;
+ /* centre */
+ GLfloat centre_x = texture->min_tx + (width * .5);
+ GLfloat centre_y = texture->min_ty + (height * .5);
+ /* m radius and t radius should be = .5 */
+ /* triangle radius is 30% available space */
+ GLfloat t_radius_x = width * .3;
+ GLfloat t_radius_y = height * .3;
+ /* movement radius is 30% available space */
+ GLfloat m_radius_x = width * .2;
+ GLfloat m_radius_y = height * .2;
+ GLfloat angle2;
+
+ /* centre of triangle */
+ GLfloat angle = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS); /* to radians */
+ GLfloat t_centre_x = centre_x + m_radius_x * cos(texture->x_period * angle + texture->x_phase);
+ GLfloat t_centre_y = centre_y + m_radius_y * sin(texture->y_period * angle + texture->y_phase);
+
+#if 0
+ printf("WH: %f, %f - tWH: %f, %f\n", width, height, texture->width, texture->height);
+ printf("size: (%f, %f)\n", width, height);
+ printf("centre: (%f, %f)\n", centre_x, centre_y);
+#endif
+
+ angle2 = texture->r_period * angle + texture->r_phase;
+ t[0].x = t_centre_x + t_radius_x * cos(angle2);
+ t[0].y = t_centre_y + t_radius_y * sin(angle2);
+ t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
+ t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
+ t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
+ t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
+
+#if 0
+ printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
+#endif
+}
+#endif
+
+#if 0
+/* corners into corners - meant to maximise coverage */
+static void
+calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
+
+ /* equilateral triangle rotating around centre */
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat width = texture->max_tx - texture->min_tx;
+ GLfloat height = texture->max_ty - texture->min_ty;
+ /* centre */
+ GLfloat centre_x = texture->min_tx + (width * .5);
+ GLfloat centre_y = texture->min_ty + (height * .5);
+ /* m radius and t radius should be = .5 */
+ /* triangle radius calculated using maths 8) */
+#define TRADIUS (M_SQRT2 - 1.0)
+#define MRADIUS (1.0 - (M_SQRT2 / 2.0))
+ GLfloat t_radius_x = width * TRADIUS * .95;
+ GLfloat t_radius_y = height * TRADIUS * .95;
+ /* movement radius also calculated using maths */
+ GLfloat m_radius_x = width * MRADIUS * .95;
+ GLfloat m_radius_y = height * MRADIUS * .95;
+ GLfloat angle, angle2;
+ GLfloat t_centre_x, t_centre_y;
+
+ /* centre of triangle */
+ angle = gp->tangle * RADIANS; /* to radians */
+ t_centre_x = centre_x + m_radius_x * cos(angle);
+ t_centre_y = centre_y + m_radius_y * sin(angle);
+#if 0
+ printf("angle: %f, %f\n", angle, gp->tangle);
+ printf("tcentre: %f,%f\n", t_centre_x, t_centre_y);
+ printf("tradius: %f,%f\n", t_radius_x, t_radius_y);
+
+ printf("size: (%f, %f)\n", width, height);
+ printf("centre: (%f, %f)\n", centre_x, centre_y);
+ printf("centre: (%f, %f)\n", centre_x, centre_y);
+ printf("TRADIUS: %f\n", TRADIUS);
+ printf("MRADIUS: %f\n", MRADIUS);
+#endif
+
+ /* angle2 is tied to tangle */
+ angle2 = (180.0 - ((30.0 / 90.0) * gp->tangle)) * RADIANS;
+#if 0
+ printf("Angle1: %f\tAngle2: %f\n", angle / RADIANS, angle2 / RADIANS);
+#endif
+ t[0].x = t_centre_x + t_radius_x * cos(angle2);
+ t[0].y = t_centre_y + t_radius_y * sin(angle2);
+ t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
+ t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
+ t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
+ t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
+
+#if 0
+ printf("texcoords:[%f,%f][%f,%f][%f,%f]\n", t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y);
+#endif
+}
+#endif
+
+static int
+draw_hexagons(ModeInfo *mi, int translucency, texture *texture)
+{
+ int polys = 0;
+ int i;
+ vector2f t[3];
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ calculate_texture_coords(mi, texture, t);
+
+ glColor4f(1.0, 1.0, 1.0, (float)translucency / MAX_FADE);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(GL_FALSE);
+ glBindTexture(GL_TEXTURE_2D, texture->id);
+
+ if (gp->list == -1) {
+ gp->list = glGenLists(1);
+ }
+
+ /* compile new list */
+ glNewList(gp->list, GL_COMPILE);
+ glBegin(GL_TRIANGLES);
+
+ /*
+ ** six triangles to each hexagon
+ */
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX1;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX6;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX6;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX5;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX5;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX4;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX4;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX3;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX3;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX2;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX2;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX1;
+
+ glEnd();
+ glEndList();
+
+ /* call the list n times */
+ for (i = 0 ; i < sizeof(hex) / sizeof(hex[0]) ; i++) {
+
+ glPushMatrix();
+
+ glTranslatef(hex[i].x, hex[i].y, 0.0);
+ glCallList(gp->list);
+ polys += 6;
+
+ glPopMatrix();
+ }
+
+#ifdef DISPLAY_TEXTURE
+ glPushMatrix();
+ /* acd debug - display (bigger, centred) texture */
+ glScalef(2.0, 2.0, 2.0);
+ glTranslatef(-0.5, -0.5, 0.0);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(0.0, 0.0, -0.1);
+ glTexCoord2f(1.0, 0.0);
+ glVertex3f(1.0, 0.0, -0.1);
+ glTexCoord2f(1.0, 1.0);
+ glVertex3f(1.0, 1.0, -0.1);
+ glTexCoord2f(0.0, 1.0);
+ glVertex3f(0.0, 1.0, -0.1);
+ polys++;
+ glEnd();
+ /* acd debug - display texture triangle */
+ glColor4f(1.0, 0.5, 1.0, 1.0);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(t[0].x, t[0].y, -0.11);
+ glVertex3f(t[1].x, t[1].y, -0.11);
+ glVertex3f(t[2].x, t[2].y, -0.11);
+ polys++;
+ glEnd();
+ glPopMatrix();
+#endif
+
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ return polys;
+}
+
+/*
+ * main rendering loop
+ */
+static void
+draw(ModeInfo * mi)
+{
+ GLfloat x_angle, y_angle, z_angle;
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ vectorf v1;
+
+ mi->polygon_count = 0;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ gp->tic += 0.005f;
+
+ x_angle = gp->cam_x_phase + gp->tic * gp->cam_x_speed;
+ y_angle = gp->cam_y_phase + gp->tic * gp->cam_y_speed;
+ z_angle = gp->cam_z_phase + gp->tic * gp->cam_z_speed;
+
+ if (move) {
+ v1.x = 1 * sin(x_angle);
+ v1.y = 1 * sin(y_angle);
+ } else {
+ v1.x = 0;
+ v1.y = 0;
+ }
+
+ /* size is changed in pinit() to be distance from plane */
+ gp->size = MI_SIZE(mi);
+ if (gp->size > 10) {
+ gp->size = 10;
+ }
+ if (gp->size <= 0) {
+ gp->size = 0;
+ }
+ if (gp->size > 0) {
+ /* user defined size */
+ v1.z = gp->size;
+ } else if (zoom) {
+ /* max distance given by adding the constant and the multiplier */
+ v1.z = 5.0 + 3.0 * sin(z_angle);
+ } else {
+ /* default */
+ v1.z = 7.0;
+ }
+
+ /* update rotation angle (but not if mouse button down) */
+ if (rotate && !gp->button_down_p)
+ {
+ float new_rangle_vel = 0.0;
+
+ /* update camera rotation angle and velocity */
+ gp->rangle += gp->rangle_vel;
+ new_rangle_vel = gp->rangle_vel + gp->rangle_acc;
+ if (new_rangle_vel > -MAX_ANGLE_VEL && new_rangle_vel < MAX_ANGLE_VEL)
+ {
+ /* new velocity is within limits */
+ gp->rangle_vel = new_rangle_vel;
+ }
+
+ /* randomly change twisting speed - 3ff = 1024 */
+ if ((random() % TWISTING_PROBABILITY) < 1.0) {
+ gp->rangle_acc = INITIAL_ANGLE_ACC * frand(1.0);
+ if (gp->rangle_vel > 0.0) {
+ gp->rangle_acc = -gp->rangle_acc;
+ }
+ }
+ }
+#if 0
+ printf("Rangle: %f : %f : %f\n", gp->rangle, gp->rangle_vel, gp->rangle_acc);
+ printf("Tangle: %f : %f : %f\n", gp->tangle, gp->tangle_vel, gp->tangle_acc);
+#endif
+
+#ifdef WOBBLE
+ /* this makes the image wobble - requires -move and a larger grid */
+ gluLookAt(0, 0, v1.z, v1.x, v1.y, 0.0, 0.0, 1.0, 0.0);
+#else
+ /* no wobble - camera always perpendicular to grid */
+
+ /* rotating camera rather than entire space - smoother */
+ gluLookAt(
+ v1.x, v1.y, v1.z,
+ v1.x, v1.y, 0.0,
+ sin((gp->xmouse * M_PI * 2) + gp->rangle * RADIANS),
+ cos((gp->xmouse * M_PI * 2) + gp->rangle * RADIANS),
+ 0.0);
+#endif
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ if (gp->fade == 0)
+ {
+ /* not fading */
+ mi->polygon_count +=
+ draw_hexagons(mi, MAX_FADE, &gp->textures[gp->visible]);
+ }
+ else
+ {
+ /* fading - show both textures with alpha
+ NB first is always max alpha */
+ mi->polygon_count +=
+ draw_hexagons(mi, MAX_FADE, &gp->textures[1 - gp->visible]);
+ mi->polygon_count +=
+ draw_hexagons(mi, MAX_FADE - gp->fade, &gp->textures[gp->visible]);
+
+ /* fade some more */
+ gp->fade++;
+
+ /* have we faded enough? */
+ if (gp->fade > MAX_FADE)
+ {
+ /* stop fading */
+ gp->fade = 0;
+ gp->visible = 1 - gp->visible;
+ }
+ }
+
+ /* increment texture angle based on time, velocity etc */
+ /* but only if button is not down */
+ if (!gp->button_down_p)
+ {
+ float new_tangle_vel = 0.0;
+
+ gp->tangle += gp->tangle_vel;
+
+ /* work out new texture angle velocity */
+ new_tangle_vel = gp->tangle_vel + gp->tangle_acc;
+ if (new_tangle_vel > -MAX_ANGLE_VEL && new_tangle_vel < MAX_ANGLE_VEL)
+ {
+ /* new velocity is inside limits */
+ gp->tangle_vel = new_tangle_vel;
+ }
+
+ /* randomly change twisting speed - 3ff = 1024 */
+ if ((random() % TWISTING_PROBABILITY) < 1.0) {
+ gp->tangle_acc = INITIAL_ANGLE_ACC * frand(1.0);
+ if (gp->tangle_vel > 0.0) {
+ gp->tangle_acc = -gp->tangle_acc;
+ }
+ }
+ }
+
+ glFlush();
+}
+
+/*
+ * new window size or exposure
+ */
+ENTRYPOINT void reshape_gleidescope(ModeInfo *mi, int width, int height)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(gp->glx_context));
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(50.0, 1/h, 0.1, 2000.0);
+ glMatrixMode (GL_MODELVIEW);
+ glLineWidth(1);
+ glPointSize(1);
+}
+
+static void
+pinit(ModeInfo * mi)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ /* set start time - star_time = 0 implies non-dynamic texture */
+ gp->start_time = (time_t)0;
+
+ /* set the texture size to default */
+ /*
+ gp->max_tx = 1.0;
+ gp->max_ty = 1.0;
+ */
+
+ /* no fading */
+ gp->fade = 0;
+
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+
+ /* space for textures */
+ glGenTextures(1, &gp->textures[0].id);
+ glGenTextures(1, &gp->textures[1].id);
+ gp->visible = 0;
+
+ setup_texture(mi, &gp->textures[gp->visible]);
+
+ /*
+ ** want to choose a value for arg randomly if neither -arg nor -no-arg
+ ** is specified. xscreensaver libraries don't seem to let you do this -
+ ** if something isn't true then it is false (pesky two-state boolean values).
+ ** so, i've defined both -arg and -no-arg to arguments and added the
+ ** following logic.
+ ** (btw if both -arg and -no-arg are defined then arg is set to False)
+ */
+ if (zoom == False && nozoom == False)
+ {
+ /* no zoom preference - randomise */
+ zoom = (((random() & 0x1) == 0x1) ? True : False);
+ }
+ else if (nozoom == True)
+ {
+ /* definately no zoom */
+ zoom = False;
+ }
+
+ if (move == False && nomove == False)
+ {
+ /* no move preference - randomise */
+ move = (((random() & 0x1) == 0x1) ? True : False);
+ }
+ else if (nomove == True)
+ {
+ /* definately no move */
+ move = False;
+ }
+
+ if (rotate == False && norotate == False)
+ {
+ /* no rotate preference - randomise */
+ rotate = (((random() & 0x1) == 0x1) ? True : False);
+ }
+ else if (norotate == True)
+ {
+ /* definately no rotate */
+ rotate = False;
+ }
+
+ /* define cam variables */
+ gp->cam_x_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
+ gp->cam_x_phase = random() % 360;
+ gp->cam_y_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
+ gp->cam_y_phase = random() % 360;
+ gp->cam_z_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
+ gp->cam_z_phase = random() % 360;
+
+ /* initial angular speeds */
+ gp->rangle_vel = INITIAL_ANGLE_VEL * frandrange(-.5, 0.5);
+ gp->tangle_vel = INITIAL_ANGLE_VEL * frandrange(-.5, 0.5);
+ gp->rangle_acc = INITIAL_ANGLE_ACC * frandrange(-.5, 0.5);
+ gp->tangle_acc = INITIAL_ANGLE_ACC * frandrange(-.5, 0.5);
+
+ /* jwz */
+#if 0
+ {
+ GLfloat speed = 15;
+ gp->rangle_vel *= speed;
+ gp->tangle_vel *= speed;
+ gp->rangle_acc *= speed;
+ gp->tangle_acc *= speed;
+ }
+#endif
+
+ /* distance is 11 - size */
+ if (gp->size != -1) {
+ if (zoom) {
+ fprintf(stderr, "-size given. ignoring -zoom.\n");
+ zoom = False;
+ }
+ if (gp->size < 1) {
+ gp->size = 1;
+ } else if (gp->size >= 10) {
+ gp->size = 10;
+ }
+ gp->size = 11 - gp->size;
+ }
+
+#ifdef DEBUG
+printf("phases [%d, %d, %d]\n", gp->cam_x_phase, gp->cam_y_phase, gp->cam_z_phase);
+#endif
+}
+
+ENTRYPOINT void
+init_gleidescope(ModeInfo * mi)
+{
+ gleidestruct *gp;
+ int screen = MI_SCREEN(mi);
+
+ MI_INIT(mi, gleidescope);
+ gp = &gleidescope[screen];
+ gp->window = MI_WINDOW(mi);
+ gp->size = -1;
+ gp->list = -1;
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_gleidescope(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ glDrawBuffer(GL_BACK);
+
+ /* do initialisation */
+ pinit(mi);
+
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_gleidescope(ModeInfo * mi)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+
+ if (!gp->glx_context)
+ return;
+
+ /* Just keep running before the texture has come in. */
+ /* if (gp->waiting_for_image_p) return; */
+
+ glDrawBuffer(GL_BACK);
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+ draw(mi);
+
+ if (mi->fps_p) {
+ do_fps (mi);
+ }
+
+ glFinish();
+ glXSwapBuffers(display, window);
+
+#ifdef GRAB
+ if (grab) {
+ grab_frame(display, window);
+ }
+#endif
+
+ /* need to change texture? */
+ if ((gp->start_time != 0) && (duration != -1) && gp->fade == 0) {
+ if (gp->start_time + duration <= time((time_t *)0)) {
+#ifdef DEBUG
+ printf("Start Time: %lu - Current Time: %lu\n", (unsigned long)gp->start_time, (unsigned long)time((time_t *)0));
+ printf("Changing Texture\n");
+#endif
+ /* get new snapshot (into back buffer) and start fade count */
+ setup_texture(mi, &gp->textures[1 - gp->visible]);
+ /* restart fading */
+ gp->fade = 1;
+ }
+ }
+}
+
+ENTRYPOINT void
+free_gleidescope(ModeInfo * mi)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ /* acd - is this needed? */
+ if (gp->glx_context) {
+ /* Display lists MUST be freed while their glXContext is current. */
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ /* acd - was code here for freeing things that are no longer in struct */
+ }
+}
+
+XSCREENSAVER_MODULE ("Gleidescope", gleidescope)
+
+#endif
diff --git a/hacks/glx/gleidescope.man b/hacks/glx/gleidescope.man
new file mode 100644
index 0000000..c0b9b15
--- /dev/null
+++ b/hacks/glx/gleidescope.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+gleidescope - a tiled OpenGL kaleidescope
+.SH SYNOPSIS
+.B gleidescope
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-move]
+[-rotate]
+[-zoom]
+[-image \fIfile\fP]
+[-fps]
+[-size \fInumber\fP]
+[-duration \fInumber\fP]
+.SH DESCRIPTION
+A tiled kaleidescope using OpenGL.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-move
+Move the camera.
+.TP 8
+.B \-rotate
+Rotate the camera.
+.TP 8
+.B \-zoom
+Zoom the camera in and out.
+.TP 8
+.B \-image \fIfile\fP
+The texture map to use at the end of the kaleidescope.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-size \fInumber\fP
+The size of the hexagons being displayed [1(small)-10(large)]
+.TP 8
+.B \-duration \fInumber\fP
+The time in seconds before another image is chosen.
+.TP 8
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Andrew Dean Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Andrew Dean.
diff --git a/hacks/glx/glforestfire.c b/hacks/glx/glforestfire.c
new file mode 100644
index 0000000..bcc9ed7
--- /dev/null
+++ b/hacks/glx/glforestfire.c
@@ -0,0 +1,1097 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* fire --- 3D fire or rain landscape */
+
+#if 0
+static const char sccsid[] = "@(#)fire.c 5.02 2001/09/26 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2001. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by David Bucciarelli
+ * (tech.hmw@plus.it) and could be found in the demo package
+ * of Mesa (Mesa-3.2/3Dfx/demos/). This mode is the result of the merge of
+ * two of the David's demos (fire and rain).
+ *
+ * Eric Lassauge (October-10-2000) <lassauge@users.sourceforge.net>
+ * http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ * E.Lassauge - 26-Sep-2001:
+ * - add wander option and code
+ * - cleanups for xscreensaver
+ *
+ * E.Lassauge - 09-Mar-2001:
+ * - get rid of my framerate options to use showfps
+ *
+ * E.Lassauge - 12-Jan-2001:
+ * - add rain particules, selected if count=0 (no fire means rain !)
+ *
+ * E.Lassauge - 28-Nov-2000:
+ * - modified release part to add freeing of GL objects
+ *
+ * E.Lassauge - 14-Nov-2000:
+ * - use new common xpm_to_ximage function
+ *
+ * E.Lassauge - 25-Oct-2000:
+ * - add the trees (with a new resource '-trees')
+ * - corrected handling of color (textured vs untextured)
+ * - corrected handling of endiannes for the xpm files
+ * - inverted ground pixmap file
+ * - use malloc-ed tree array
+ *
+ * TSchmidt - 23-Oct-2000:
+ * - added size option like used in sproingies mode
+ *
+ * E.Lassauge - 13-Oct-2000:
+ * - when trackmouse and window is iconified (login screen): stop tracking
+ * - add pure GLX handling of framerate display (erased GLUT stuff)
+ * - made count a per screen variable and update it only if framemode
+ * - changes for no_texture an wireframe modes
+ * - change no_texture color for the ground
+ * - add freeing of texture image
+ * - misc comments and little tweakings
+ *
+ * TODO:
+ * - perhaps use a user supplied xpm for ground image (or a whatever image
+ * file using ImageMagick ?)
+ * - random number of trees ? change trees at change_fire ?
+ * - fix wireframe mode: it's too CPU intensive.
+ * - look how we can get the Wheel events (Button4&5).
+ */
+
+
+#ifdef STANDALONE /* xscreensaver mode */
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 800 \n" \
+ "*size: 0 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+#define MODE_fire
+#include "xlockmore.h" /* from the xscreensaver distribution */
+#include "gltrackball.h"
+#else /* !STANDALONE */
+#include "xlock.h" /* from the xlockmore distribution */
+#include "visgl.h"
+#endif /* !STANDALONE */
+
+#ifdef MODE_fire
+
+#define MINSIZE 32
+
+#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined(STANDALONE)
+/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
+#include "ximage-loader.h"
+#define I_HAVE_XPM
+
+#include "images/gen/ground_png.h"
+#include "images/gen/tree_png.h"
+#endif /* HAVE_XPM */
+
+/* vector utility macros */
+#define vinit(a,i,j,k) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+}
+
+#define vinit4(a,i,j,k,w) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+ (a)[3]=w;\
+}
+
+#define vadds(a,dt,b) {\
+ (a)[0]+=(dt)*(b)[0];\
+ (a)[1]+=(dt)*(b)[1];\
+ (a)[2]+=(dt)*(b)[2];\
+}
+
+#define vequ(a,b) {\
+ (a)[0]=(b)[0];\
+ (a)[1]=(b)[1];\
+ (a)[2]=(b)[2];\
+}
+
+#define vinter(a,dt,b,c) {\
+ (a)[0]=(dt)*(b)[0]+(1.0-dt)*(c)[0];\
+ (a)[1]=(dt)*(b)[1]+(1.0-dt)*(c)[1];\
+ (a)[2]=(dt)*(b)[2]+(1.0-dt)*(c)[2];\
+}
+
+#define clamp(a) ((a) < 0.0 ? 0.0 : ((a) < 1.0 ? (a) : 1.0))
+
+#define vclamp(v) {\
+ (v)[0]=clamp((v)[0]);\
+ (v)[1]=clamp((v)[1]);\
+ (v)[2]=clamp((v)[2]);\
+}
+
+/* Manage option vars */
+#define DEF_TEXTURE "True"
+#define DEF_FOG "False"
+#define DEF_SHADOWS "True"
+#define DEF_FRAMERATE "False"
+#define DEF_WANDER "True"
+#define DEF_TREES "5"
+#define MAX_TREES 20
+static Bool do_texture;
+static Bool do_fog;
+static Bool do_shadows;
+static Bool do_wander;
+static int num_trees;
+static XFontStruct *mode_font = None;
+
+static XrmOptionDescRec opts[] = {
+ {"-texture", ".fire.texture", XrmoptionNoArg, "on"},
+ {"+texture", ".fire.texture", XrmoptionNoArg, "off"},
+ {"-fog", ".fire.fog", XrmoptionNoArg, "on"},
+ {"+fog", ".fire.fog", XrmoptionNoArg, "off"},
+ {"-shadows", ".fire.shadows", XrmoptionNoArg, "on"},
+ {"+shadows", ".fire.shadows", XrmoptionNoArg, "off"},
+ {"-wander", ".fire.wander", XrmoptionNoArg, "on"},
+ {"+wander", ".fire.wander", XrmoptionNoArg, "off"},
+ {"-trees", ".fire.trees", XrmoptionSepArg, 0},
+ {"-rain", ".fire.count", XrmoptionNoArg, "0"},
+
+};
+
+static argtype vars[] = {
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&do_shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&num_trees, "trees", "Trees", DEF_TREES, t_Int},
+};
+
+static OptionStruct desc[] = {
+ {"-/+texture", "turn on/off texturing"},
+ {"-/+fog", "turn on/off fog"},
+ {"-/+shadows", "turn on/off shadows"},
+ {"-/+wander", "turn on/off wandering"},
+ {"-trees num", "number of trees (0 disables)"},
+};
+
+ENTRYPOINT ModeSpecOpt fire_opts =
+ { sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc };
+
+#ifdef USE_MODULES
+ModStruct fire_description =
+ { "fire", "init_fire", "draw_fire", "release_fire",
+ "draw_fire", "change_fire", (char *) NULL, &fire_opts,
+ 10000, 800, 1, 400, 64, 1.0, "",
+ "Shows a 3D fire-like image", 0, NULL
+};
+#endif /* USE_MODULES */
+
+/* misc defines */
+#define TREEINR 2.5 /* tree min distance */
+#define TREEOUTR 8.0 /* tree max distance */
+#define FRAME 50 /* frame count interval */
+#define DIMP 20.0 /* dimension of ground */
+#define DIMTP 16.0 /* dimension of ground texture */
+
+#define RIDCOL 0.4 /* factor for color blending */
+
+#define AGRAV -9.8 /* gravity */
+
+#define NUMPART 7500 /* rain particles */
+
+/* fire particle struct */
+typedef struct {
+ int age;
+ float p[3][3];
+ float v[3];
+ float c[3][4];
+} part;
+
+/* rain particle struct */
+typedef struct {
+ float age;
+ float acc[3];
+ float vel[3];
+ float pos[3];
+ float partLength;
+ float oldpos[3];
+} rain;
+
+/* colors */
+static const GLfloat black[3] = { 0.0, 0.0, 0.0 }; /* shadow color */
+static const GLfloat partcol1[3] = { 1.0, 0.2, 0.0 }; /* initial color: red-ish */
+static const GLfloat partcol2[3] = { 1.0, 1.0, 0.0 }; /* blending color: yellow-ish */
+static const GLfloat fogcolor[4] = { 0.9, 0.9, 1.0, 1.0 };
+
+/* ground */
+static const float q[4][3] = {
+ {-DIMP, 0.0, -DIMP},
+ {DIMP, 0.0, -DIMP},
+ {DIMP, 0.0, DIMP},
+ {-DIMP, 0.0, DIMP}
+};
+
+/* ground texture */
+static const float qt[4][2] = {
+ {-DIMTP, -DIMTP},
+ {DIMTP, -DIMTP},
+ {DIMTP, DIMTP},
+ {-DIMTP, DIMTP}
+};
+
+/* default values for observer */
+static const float DEF_OBS[3] = { 2.0f, 1.0f, 0.0f };
+#define DEV_V 0.0
+#define DEF_ALPHA -90.0
+#define DEF_BETA 90.0
+
+/* tree struct */
+typedef struct {
+ float x,y,z;
+} treestruct;
+
+/* the mode struct, contains all per screen variables */
+typedef struct {
+ GLint WIDTH, HEIGHT; /* display dimensions */
+ GLXContext *glx_context;
+
+ int np; /* number of fire particles : set it through 'count' resource */
+ float eject_r; /* emission radius */
+ float dt, maxage, eject_vy, eject_vl;
+ float ridtri; /* fire particle size */
+ Bool shadows; /* misc booleans: set them through specific resources */
+ Bool fog;
+
+ part *p; /* fire particles array */
+ rain *r; /* rain particles array */
+
+ XImage *gtexture; /* ground texture image bits */
+ XImage *ttexture; /* tree texture image bits */
+ GLuint groundid; /* ground texture id: GL world */
+ GLuint treeid; /* tree texture id: GL world */
+ GLuint fontbase; /* fontbase id: GL world */
+
+ int num_trees; /* number of trees: set it through 'trees' resource */
+ treestruct *treepos; /* trees positions: float treepos[num_trees][3] */
+
+ float min[3]; /* raining area */
+ float max[3];
+
+ float obs[3]; /* observer coordinates */
+ float dir[3]; /* view direction */
+ float v; /* observer velocity */
+ float alpha; /* observer angles */
+ float beta;
+
+ trackball_state *trackball;
+ Bool button_down_p;
+ int frame;
+
+} firestruct;
+
+/* array of firestruct indexed by screen number */
+static firestruct *fire = (firestruct *) NULL;
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Misc funcs.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/* utility function for the rain particles */
+static float gettimerain(void)
+{
+#if 0
+ /* Oh yeah, *that's* portable! WTF. */
+ /*
+ * I really thought clock() was standard ... EL
+ * I found this on the net:
+ * The clock() function conforms to ISO/IEC 9899:1990 (``ISO C89'')
+ * */
+
+ static clock_t told= (clock_t)0;
+ clock_t tnew,ris;
+
+ tnew=clock();
+
+ ris=tnew-told;
+
+ told=tnew;
+
+ return (0.0125 + ris/(float)CLOCKS_PER_SEC);
+#else
+ return 0.0150;
+#endif
+}
+
+/* my RAND */
+static float vrnd(void)
+{
+ return ((float) LRAND() / (float) MAXRAND);
+}
+
+/* initialise new fire particle */
+static void setnewpart(firestruct * fs, part * p)
+{
+ float a, vi[3];
+ const float *c;
+
+ p->age = 0;
+
+ a = vrnd() * M_PI * 2.0;
+
+ vinit(vi, sin(a) * fs->eject_r * vrnd(), 0.15, cos(a) * fs->eject_r * vrnd());
+ vinit(p->p[0], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
+ vinit(p->p[1], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
+ vinit(p->p[2], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
+
+ vinit(p->v, vi[0] * fs->eject_vl / (fs->eject_r / 2),
+ vrnd() * fs->eject_vy + fs->eject_vy / 2,
+ vi[2] * fs->eject_vl / (fs->eject_r / 2));
+
+ c = partcol1;
+
+ vinit4(p->c[0], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+ vinit4(p->c[1], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+ vinit4(p->c[2], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+}
+
+/* initialise new rain particle */
+static void setnewrain(firestruct * fs, rain * r)
+{
+ r->age=0.0f;
+
+ vinit(r->acc,0.0f,-0.98f,0.0f);
+ vinit(r->vel,0.0f,0.0f,0.0f);
+
+ r->partLength=0.2f;
+
+ vinit(r->oldpos,fs->min[0]+(fs->max[0]-fs->min[0])*vrnd(),
+ fs->max[1]+0.2f*fs->max[1]*vrnd(),
+ fs->min[2]+(fs->max[2]-fs->min[2])*vrnd());
+ vequ(r->pos,r->oldpos);
+ vadds(r->oldpos,-(r->partLength),r->vel);
+
+ r->pos[1]=(fs->max[1]-fs->min[1])*vrnd()+fs->min[1];
+ r->oldpos[1]=r->pos[1]-r->partLength*r->vel[1];
+}
+
+/* set fire particle values */
+static void setpart(firestruct * fs, part * p)
+{
+ float fact;
+
+ if (p->p[0][1] < 0.1) {
+ setnewpart(fs, p);
+ return;
+ }
+
+ p->v[1] += AGRAV * fs->dt;
+
+ vadds(p->p[0], fs->dt, p->v);
+ vadds(p->p[1], fs->dt, p->v);
+ vadds(p->p[2], fs->dt, p->v);
+
+ p->age++;
+
+ if ((p->age) > fs->maxage) {
+ vequ(p->c[0], partcol2);
+ vequ(p->c[1], partcol2);
+ vequ(p->c[2], partcol2);
+ } else {
+ fact = 1.0 / fs->maxage;
+ vadds(p->c[0], fact, partcol2);
+ vclamp(p->c[0]);
+ p->c[0][3] = fact * (fs->maxage - p->age);
+
+ vadds(p->c[1], fact, partcol2);
+ vclamp(p->c[1]);
+ p->c[1][3] = fact * (fs->maxage - p->age);
+
+ vadds(p->c[2], fact, partcol2);
+ vclamp(p->c[2]);
+ p->c[2][3] = fact * (fs->maxage - p->age);
+ }
+}
+
+/* set rain particle values */
+static void setpartrain(firestruct * fs, rain * r, float dt)
+{
+ r->age += dt;
+
+ vadds(r->vel,dt,r->acc);
+ vadds(r->pos,dt,r->vel);
+
+ if(r->pos[0]<fs->min[0])
+ r->pos[0]=fs->max[0]-(fs->min[0]-r->pos[0]);
+ if(r->pos[2]<fs->min[2])
+ r->pos[2]=fs->max[2]-(fs->min[2]-r->pos[2]);
+
+ if(r->pos[0]>fs->max[0])
+ r->pos[0]=fs->min[0]+(r->pos[0]-fs->max[0]);
+ if(r->pos[2]>fs->max[2])
+ r->pos[2]=fs->min[2]+(r->pos[2]-fs->max[2]);
+
+ vequ(r->oldpos,r->pos);
+ vadds(r->oldpos,-(r->partLength),r->vel);
+ if(r->pos[1]<fs->min[1])
+ setnewrain(fs, r);
+}
+
+/* draw a tree */
+static int drawtree(float x, float y, float z)
+{
+ int polys = 0;
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(x-1.5,y+0.0,z);
+
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(x+1.5,y+0.0,z);
+
+ glTexCoord2f(1.0,1.0);
+ glVertex3f(x+1.5,y+3.0,z);
+
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(x-1.5,y+3.0,z);
+ polys++;
+
+
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(x,y+0.0,z-1.5);
+
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(x,y+0.0,z+1.5);
+
+ glTexCoord2f(1.0,1.0);
+ glVertex3f(x,y+3.0,z+1.5);
+
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(x,y+3.0,z-1.5);
+ polys++;
+
+ glEnd();
+
+ return polys;
+}
+
+/* calculate observer position : modified only if trackmouse is used */
+static void calcposobs(firestruct * fs)
+{
+ fs->dir[0] = sin(fs->alpha * M_PI / 180.0);
+ fs->dir[2] =
+ cos(fs->alpha * M_PI / 180.0) * sin(fs->beta * M_PI / 180.0);
+ fs->dir[1] = cos(fs->beta * M_PI / 180.0);
+
+ fs->obs[0] += fs->v * fs->dir[0];
+ fs->obs[1] += fs->v * fs->dir[1];
+ fs->obs[2] += fs->v * fs->dir[2];
+
+ if (!fs->np)
+ {
+ vinit(fs->min,fs->obs[0]-7.0f,-0.2f,fs->obs[2]-7.0f);
+ vinit(fs->max,fs->obs[0]+7.0f,8.0f,fs->obs[2]+7.0f);
+ }
+}
+
+
+/* initialise textures */
+static void inittextures(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+#if defined( I_HAVE_XPM )
+ if (do_texture) {
+
+ glGenTextures(1, &fs->groundid);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, fs->groundid);
+#endif /* HAVE_GLBINDTEXTURE */
+
+ if ((fs->gtexture = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ ground_png,
+ sizeof(ground_png)))
+ == None) {
+ (void) fprintf(stderr, "Error reading the ground texture.\n");
+ glDeleteTextures(1, &fs->groundid);
+ do_texture = False;
+ fs->groundid = 0;
+ fs->treeid = 0;
+ return;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ fs->gtexture->width, fs->gtexture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, fs->gtexture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ if (fs->num_trees)
+ {
+ glGenTextures(1, &fs->treeid);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D,fs->treeid);
+#endif /* HAVE_GLBINDTEXTURE */
+ if ((fs->ttexture = image_data_to_ximage(MI_DISPLAY(mi),
+ MI_VISUAL(mi),
+ tree_png,
+ sizeof(tree_png)))
+ == None) {
+ (void)fprintf(stderr,"Error reading tree texture.\n");
+ glDeleteTextures(1, &fs->treeid);
+ fs->treeid = 0;
+ fs->num_trees = 0;
+ return;
+ }
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ fs->ttexture->width, fs->ttexture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, fs->ttexture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+ }
+ }
+ else
+ {
+ fs->groundid = 0; /* default textures */
+ fs->treeid = 0;
+ }
+#else /* !I_HAVE_XPM */
+ do_texture = False;
+ fs->groundid = 0; /* default textures */
+ fs->treeid = 0;
+#endif /* !I_HAVE_XPM */
+}
+
+/* init tree array and positions */
+static Bool inittree(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+ int i;
+ float dist;
+
+ /* allocate treepos array */
+ if ((fs->treepos = (treestruct *) malloc(fs->num_trees *
+ sizeof(treestruct))) == NULL) {
+ return False;
+ }
+ /* initialise positions */
+ for(i=0;i<fs->num_trees;i++) {
+ do {
+ fs->treepos[i].x =vrnd()*TREEOUTR*2.0-TREEOUTR;
+ fs->treepos[i].y =0.0;
+ fs->treepos[i].z =vrnd()*TREEOUTR*2.0-TREEOUTR;
+ dist = sqrt(fs->treepos[i].x * fs->treepos[i].x +
+ fs->treepos[i].z * fs->treepos[i].z);
+ } while((dist<TREEINR) || (dist>TREEOUTR));
+ }
+ return True;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * GL funcs.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void reshape_fire(ModeInfo * mi, int width, int height)
+{
+
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+ int size = MI_SIZE(mi);
+
+ /* Viewport is specified size if size >= MINSIZE && size < screensize */
+ if (size <= 1) {
+ fs->WIDTH = MI_WIDTH(mi);
+ fs->HEIGHT = MI_HEIGHT(mi);
+ } else if (size < MINSIZE) {
+ fs->WIDTH = MINSIZE;
+ fs->HEIGHT = MINSIZE;
+ } else {
+ fs->WIDTH = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size;
+ fs->HEIGHT = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size;
+ }
+ glViewport((MI_WIDTH(mi) - fs->WIDTH) / 2, (MI_HEIGHT(mi) - fs->HEIGHT) / 2, fs->WIDTH, fs->HEIGHT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(70.0, fs->WIDTH / (float) fs->HEIGHT, 0.1, 30.0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+}
+
+static void DrawFire(ModeInfo * mi)
+{
+ int j;
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ mi->polygon_count = 0;
+
+ if (do_wander && !fs->button_down_p)
+ {
+ GLfloat x, y, z;
+
+# define SINOID(SCALE,SIZE) \
+ ((((1 + sin((fs->frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
+
+ x = SINOID(0.031, 0.85);
+ y = SINOID(0.017, 0.25);
+ z = SINOID(0.023, 0.85);
+ fs->frame++;
+ fs->obs[0] = x + DEF_OBS[0];
+ fs->obs[1] = y + DEF_OBS[1];
+ fs->obs[2] = z + DEF_OBS[2];
+ fs->dir[1] = y;
+ fs->dir[2] = z;
+ }
+
+ glEnable(GL_DEPTH_TEST);
+
+ if (fs->fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glDepthMask(GL_TRUE);
+ glClearColor(0.5, 0.5, 0.8, 1.0); /* sky in the distance */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ calcposobs(fs);
+
+ gltrackball_rotate (fs->trackball);
+
+ gluLookAt(fs->obs[0], fs->obs[1], fs->obs[2],
+ fs->obs[0] + fs->dir[0],
+ fs->obs[1] + fs->dir[1],
+ fs->obs[2] + fs->dir[2],
+ 0.0, 1.0, 0.0);
+
+ glEnable(GL_TEXTURE_2D);
+
+ /* draw ground using the computed texture */
+ if (do_texture) {
+ glColor4f(1.0,1.0,1.0,1.0); /* white to get texture in it's true color */
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, fs->groundid);
+#endif /* HAVE_GLBINDTEXTURE */
+ }
+ else
+ glColor4f(0.54, 0.27, 0.07, 1.0); /* untextured ground color */
+ glBegin(GL_QUADS);
+ glTexCoord2fv(qt[0]);
+ glVertex3fv(q[0]);
+ glTexCoord2fv(qt[1]);
+ glVertex3fv(q[1]);
+ glTexCoord2fv(qt[2]);
+ glVertex3fv(q[2]);
+ glTexCoord2fv(qt[3]);
+ glVertex3fv(q[3]);
+ mi->polygon_count++;
+ glEnd();
+
+ glAlphaFunc(GL_GEQUAL, 0.9);
+ if (fs->num_trees)
+ {
+ /* here do_texture IS True - and color used is white */
+ glEnable(GL_ALPHA_TEST);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D,fs->treeid);
+#endif /* HAVE_GLBINDTEXTURE */
+ for(j=0;j<fs->num_trees;j++)
+ mi->polygon_count += drawtree(fs->treepos[j].x ,fs->treepos[j].y ,fs->treepos[j].z );
+ glDisable(GL_ALPHA_TEST);
+ }
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(GL_FALSE);
+
+ if (fs->shadows) {
+ /* draw shadows with black color */
+ glBegin(wire ? GL_LINE_STRIP : GL_TRIANGLES);
+ for (j = 0; j < fs->np; j++) {
+ glColor4f(black[0], black[1], black[2], fs->p[j].c[0][3]);
+ glVertex3f(fs->p[j].p[0][0], 0.1, fs->p[j].p[0][2]);
+
+ glColor4f(black[0], black[1], black[2], fs->p[j].c[1][3]);
+ glVertex3f(fs->p[j].p[1][0], 0.1, fs->p[j].p[1][2]);
+
+ glColor4f(black[0], black[1], black[2], fs->p[j].c[2][3]);
+ glVertex3f(fs->p[j].p[2][0], 0.1, fs->p[j].p[2][2]);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+
+ glBegin(wire ? GL_LINE_STRIP : GL_TRIANGLES);
+ for (j = 0; j < fs->np; j++) {
+ /* draw particles: colors are computed in setpart */
+ glColor4fv(fs->p[j].c[0]);
+ glVertex3fv(fs->p[j].p[0]);
+
+ glColor4fv(fs->p[j].c[1]);
+ glVertex3fv(fs->p[j].p[1]);
+
+ glColor4fv(fs->p[j].c[2]);
+ glVertex3fv(fs->p[j].p[2]);
+ mi->polygon_count++;
+
+ setpart(fs, &fs->p[j]);
+ }
+ glEnd();
+
+ /* draw rain particles if no fire particles */
+ if (!fs->np)
+ {
+ float timeused = gettimerain();
+ glDisable(GL_TEXTURE_2D);
+ glShadeModel(GL_SMOOTH);
+ glBegin(GL_LINES);
+ for (j = 0; j < NUMPART; j++) {
+ glColor4f(0.7f,0.95f,1.0f,0.0f);
+ glVertex3fv(fs->r[j].oldpos);
+ glColor4f(0.3f,0.7f,1.0f,1.0f);
+ glVertex3fv(fs->r[j].pos);
+ setpartrain(fs, &fs->r[j],timeused);
+ mi->polygon_count++;
+ }
+ glEnd();
+ glShadeModel(GL_FLAT);
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_ALPHA_TEST);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_FOG);
+
+ /* manage framerate display */
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glPopMatrix();
+}
+
+
+static Bool Init(ModeInfo * mi)
+{
+ int i;
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ /* default settings */
+ fs->eject_r = 0.1 + NRAND(10) * 0.03;
+ fs->dt = 0.015;
+ fs->eject_vy = 4;
+ fs->eject_vl = 1;
+ fs->ridtri = 0.1 + NRAND(10) * 0.005;
+ fs->maxage = 1.0 / fs->dt;
+ vinit(fs->obs, DEF_OBS[0], DEF_OBS[1], DEF_OBS[2]);
+ fs->v = 0.0;
+ fs->alpha = DEF_ALPHA;
+ fs->beta = DEF_BETA;
+
+ /* initialise texture stuff */
+ if (do_texture)
+ inittextures(mi);
+ else
+ {
+ fs->ttexture = (XImage*) NULL;
+ fs->gtexture = (XImage*) NULL;
+ }
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tnum_part=%d\n\ttrees=%d\n\tfog=%s\n\tshadows=%s\n\teject_r=%.3f\n\tridtri=%.3f\n",
+ MI_NAME(mi),
+ fs->np,
+ fs->num_trees,
+ fs->fog ? "on" : "off",
+ fs->shadows ? "on" : "off",
+ fs->eject_r, fs->ridtri);
+ }
+
+ /* initialise particles and trees */
+ for (i = 0; i < fs->np; i++) {
+ setnewpart(fs, &(fs->p[i]));
+ }
+
+ if (fs->num_trees)
+ if (!inittree(mi)) {
+ return False;
+ }
+
+ /* if no fire particles then initialise rain particles */
+ if (!fs->np)
+ {
+ vinit(fs->min,-7.0f,-0.2f,-7.0f);
+ vinit(fs->max,7.0f,8.0f,7.0f);
+ for (i = 0; i < NUMPART; i++) {
+ setnewrain(fs, &(fs->r[i]));
+ }
+ }
+
+ return True;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+
+ENTRYPOINT void
+free_fire(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ if (mode_font != None && fs->fontbase != None) {
+ glDeleteLists(fs->fontbase, mode_font->max_char_or_byte2 -
+ mode_font->min_char_or_byte2 + 1);
+ fs->fontbase = None;
+ }
+
+ if (fs->p != NULL) {
+ (void) free((void *) fs->p);
+ fs->p = (part *) NULL;
+ }
+ if (fs->r != NULL) {
+ (void) free((void *) fs->r);
+ fs->r = (rain *) NULL;
+ }
+ if (fs->treepos != NULL) {
+ (void) free((void *) fs->treepos);
+ fs->treepos = (treestruct *) NULL;
+ }
+ if (fs->ttexture != None) {
+ glDeleteTextures(1, &fs->treeid);
+ XDestroyImage(fs->ttexture);
+ fs->ttexture = None;
+ }
+ if (fs->gtexture != None) {
+ glDeleteTextures(1, &fs->groundid);
+ XDestroyImage(fs->gtexture);
+ fs->gtexture = None;
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize fire. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void
+init_fire(ModeInfo * mi)
+{
+ firestruct *fs;
+
+ MI_INIT (mi, fire);
+ fs = &fire[MI_SCREEN(mi)];
+ fs->np = MI_COUNT(mi);
+ fs->fog = do_fog;
+ fs->shadows = do_shadows;
+ /* initialise fire particles if any */
+ if ((fs->np)&&(fs->p == NULL)) {
+ if ((fs->p = (part *) calloc(fs->np, sizeof(part))) == NULL) {
+ free_fire(mi);
+ return;
+ }
+ }
+ else if (fs->r == NULL) {
+ /* initialise rain particles if no fire particles */
+ if ((fs->r = (rain *) calloc(NUMPART, sizeof(part))) == NULL) {
+ free_fire(mi);
+ return;
+ }
+ }
+
+ /* check tree number */
+ if (do_texture)
+ fs->num_trees = (num_trees<MAX_TREES)?num_trees:MAX_TREES;
+ else
+ fs->num_trees = 0;
+
+ fs->trackball = gltrackball_init (False);
+
+ /* xlock GL stuff */
+ if ((fs->glx_context = init_GL(mi)) != NULL) {
+
+#ifndef STANDALONE
+ Reshape(mi); /* xlock mode */
+#else
+ reshape_fire(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
+#endif
+ glDrawBuffer(GL_BACK);
+ if (!Init(mi)) {
+ free_fire(mi);
+ return;
+ }
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_fire(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!fs->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(fs->glx_context));
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+
+ /* makes particles blend with background */
+ if (!MI_IS_WIREFRAME(mi)||(!fs->np))
+ {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ /* fog stuff */
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+ glFogf(GL_FOG_DENSITY, 0.03);
+ glHint(GL_FOG_HINT, GL_NICEST);
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ DrawFire(mi);
+ glPopMatrix();
+#ifndef STANDALONE
+ Reshape(mi); /* xlock mode */
+#else
+ reshape_fire(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
+#endif
+
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * The display is being taken away from us. Free up malloc'ed
+ * memory and X resources that we've alloc'ed. Only called
+ * once, we must zap everything for every screen.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void release_fire(ModeInfo * mi)
+{
+ if (mode_font != None)
+ {
+ /* only free-ed when there are no more screens used */
+ XFreeFont(MI_DISPLAY(mi), mode_font);
+ mode_font = None;
+ }
+ FreeAllGL(mi);
+}
+
+ENTRYPOINT Bool
+fire_handle_event (ModeInfo *mi, XEvent *event)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, fs->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &fs->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_fire(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ if (!fs->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(fs->glx_context));
+
+ /* if available, randomly change some values */
+ if (do_fog)
+ fs->fog = LRAND() & 1;
+ if (do_shadows)
+ fs->shadows = LRAND() & 1;
+ /* reset observer position */
+ frame = 0;
+ vinit(fs->obs, DEF_OBS[0], DEF_OBS[1], DEF_OBS[2]);
+ fs->v = 0.0;
+ /* particle randomisation */
+ fs->eject_r = 0.1 + NRAND(10) * 0.03;
+ fs->ridtri = 0.1 + NRAND(10) * 0.005;
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tnum_part=%d\n\ttrees=%d\n\tfog=%s\n\tshadows=%s\n\teject_r=%.3f\n\tridtri=%.3f\n",
+ MI_NAME(mi),
+ fs->np,
+ fs->num_trees,
+ fs->fog ? "on" : "off",
+ fs->shadows ? "on" : "off",
+ fs->eject_r, fs->ridtri);
+ }
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE_2 ("GLForestFire", glforestfire, fire)
+
+#endif /* MODE_fire */
diff --git a/hacks/glx/glforestfire.man b/hacks/glx/glforestfire.man
new file mode 100644
index 0000000..aae3a25
--- /dev/null
+++ b/hacks/glx/glforestfire.man
@@ -0,0 +1,130 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "03-Oct-01" "X Version 11"
+.SH NAME
+glforestfire - draws a GL animation of sprinkling fire-like 3D triangles
+.SH SYNOPSIS
+.B glforestfire
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-count \fInumber_of_particles\fP]
+[\-trees \fInumber_of_trees\fP]
+[\-size \fIviewport_size\fP]
+[\-texture] [\-no-texture]
+[\-shadows] [\-no-shadows]
+[\-fog] [\-no-fog]
+[\-wireframe] [\-no-wireframe]
+[\-wander] [\-no-wander]
+[\-trackmouse] [\-no-trackmouse]
+[\-fps]
+.SH DESCRIPTION
+The \fIglforestfire\fP program draws an animation of sprinkling fire-like 3D triangles in
+a landscape filled with trees.
+.SH OPTIONS
+.I glforestfire
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-trees \fInumber_of_trees\fP\fP
+Specify how much trees are drawn in the landscape.
+.TP 8
+.B \-count \fInumber_of_particles\fP\fP
+Specify how much fire particles are drawn. A very special case is 0
+wich means that you get
+.B rain
+!
+.TP 8
+.B \-size \fIviewport_size\fP\fP
+Viewport of GL scene is specified size if greater than 32 and less than screensize. Default value is 0, meaning full screensize.
+.TP 8
+.B \-texture
+Show a textured ground and the trees. This is the default.
+.TP 8
+.B \-no\-texture
+Disables texturing the landscape. This implies that no trees are drawn.
+.TP 8
+.B \-shadows
+Show a shadow for each particle on the ground. This is the default.
+.TP 8
+.B \-no\-shadows
+Disables the drawing of the shadows.
+.TP 8
+.B \-fog
+Show a fog in the distance.
+.TP 8
+.B \-no\-fog
+Disables the fog. This is the default.
+.TP 8
+.B \-wander
+Move the observer around the landscape. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the fire centered on the screen.
+.TP 8
+.B \-trackmouse
+Let the mouse be a joystick to change the view of the landscape.
+This implies
+.I \-no\-wander.
+.TP 8
+.B \-no\-trackmouse
+Disables mouse tracking. This is the default.
+.TP 8
+.B \-wire
+Draw a wireframe rendition of the fire: this will consist only of
+single-pixel lines for the triangles.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Eric Lassauge.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+
+The original code for this hack was written by David Bucciarelli
+(tech.hmw@plus.it) and could be found in the demo package
+of Mesa (Mesa-3.2/3Dfx/demos/). This hack is the result of the merge of
+two of the David's demos (fire and rain).
+
+.SH AUTHOR
+David Bucciarelli <tech.hmw@plus.it>
+Eric Lassauge <lassauge@mail.dotcom.fr>
diff --git a/hacks/glx/glhanoi.c b/hacks/glx/glhanoi.c
new file mode 100644
index 0000000..865930f
--- /dev/null
+++ b/hacks/glx/glhanoi.c
@@ -0,0 +1,2086 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* glhanoi, Copyright (c) 2005, 2009 Dave Atkinson <da@davea.org.uk>
+ * except noise function code Copyright (c) 2002 Ken Perlin
+ * Modified by Lars Huttar (c) 2010, to generalize to 4 or more poles
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <assert.h>
+
+#include "rotator.h"
+
+#define DEF_LIGHT "True"
+#define DEF_FOG "False"
+#define DEF_TEXTURE "True"
+#define DEF_POLES "0" /* choose random value */
+#define DEF_SPEED "1"
+#define DEF_TRAILS "2"
+
+#define DEFAULTS "*delay: 15000\n" \
+ "*count: 0\n" \
+ "*showFPS: False\n" \
+ "*wireframe: False\n"
+
+# define release_glhanoi 0
+
+/* polygon resolution of poles and disks */
+#define NSLICE 32
+#define NLOOPS 1
+
+/* How long to wait at start and finish (seconds). */
+#define START_DURATION 1.0
+#define FINISH_DURATION 1.0
+#define BASE_LENGTH 30.0
+#define BOARD_SQUARES 8
+
+/* Don't draw trail lines till they're this old (sec).
+ Helps trails not be "attached" to the disks. */
+#define TRAIL_START_DELAY 0.1
+
+#define MAX_CAMERA_RADIUS 250.0
+#define MIN_CAMERA_RADIUS 75.0
+
+#define MARBLE_SCALE 1.01
+
+#undef BELLRAND
+/* Return a double precision number in [0...n], with bell curve distribution. */
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+enum {
+ MARBLE_TEXURE,
+ N_TEXTURES
+};
+
+#define MARBLE_TEXTURE_SIZE 256
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include <math.h>
+#include "xlockmore.h"
+
+#ifdef USE_GL /* whole file */
+
+typedef struct timeval glhtime;
+
+static double getTime(void)
+{
+ struct timeval t;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&t, NULL);
+#else /* !GETTIMEOFDAY_TWO_ARGS */
+ gettimeofday(&t);
+#endif /* !GETTIMEOFDAY_TWO_ARGS */
+ return t.tv_sec + t.tv_usec / 1000000.0;
+}
+
+typedef enum {
+ START,
+ MOVE_DISK,
+ MOVE_FINISHED,
+ FINISHED,
+ MONEY_SHOT,
+ INVALID = -1
+} State;
+
+typedef struct {
+ int id;
+ GLuint displayList;
+ GLfloat position[3];
+ GLfloat rotation[3];
+ GLfloat color[4];
+ GLfloat base0;
+ GLfloat base1;
+ GLfloat height;
+ GLfloat xmin, xmax, ymin, zmin, zmax;
+ GLfloat u1, u2;
+ GLfloat t1, t2;
+ GLfloat ucostheta, usintheta;
+ GLfloat dx, dz;
+ GLdouble rotAngle; /* degree of "flipping" so far, during travel */
+ GLdouble phi; /* angle of motion in xz plane */
+ GLfloat speed;
+ int polys;
+} Disk;
+
+typedef struct {
+ Disk **data;
+ int count;
+ int size;
+ GLfloat position[3];
+} Pole;
+
+/* A SubProblem is a recursive subdivision of the problem, and means
+ "Move nDisks disks from src pole to dst pole, using the poles indicated in 'available'." */
+typedef struct {
+ int nDisks;
+ int src, dst;
+ unsigned long available; /* a bitmask of poles that have no smaller disks on them */
+} SubProblem;
+
+typedef struct {
+ GLfloat position[3];
+ double startTime, endTime;
+ Bool isEnd;
+} TrailPoint;
+
+typedef struct {
+ GLXContext *glx_context;
+ State state;
+ Bool wire;
+ Bool fog;
+ Bool light;
+ Bool layoutLinear;
+ GLfloat trailDuration;
+ double startTime;
+ double lastTime;
+ double duration;
+ int numberOfDisks;
+ int numberOfPoles;
+ int numberOfMoves;
+ int maxDiskIdx;
+ int magicNumber;
+ Disk *currentDisk;
+ int move;
+ /* src, tmp, dst: index of pole that is source / storage / destination for
+ current move */
+ int src;
+ int tmp;
+ int dst;
+ int oldsrc;
+ int oldtmp;
+ int olddst;
+ GLfloat speed; /* coefficient for how fast the disks move */
+ SubProblem *solveStack;
+ int solveStackSize, solveStackIdx;
+ Pole *pole;
+ float boardSize;
+ float baseLength;
+ float baseWidth;
+ float baseHeight;
+ float poleRadius;
+ float poleHeight;
+ float poleOffset;
+ float poleDist; /* distance of poles from center, for round layout */
+ float diskHeight;
+ float maxDiskRadius;
+ float *diskPos; /* pre-computed disk positions on rods */
+ Disk *disk;
+ GLint floorList;
+ GLint baseList;
+ GLint poleList;
+ int floorpolys, basepolys, polepolys;
+ int trailQSize;
+ TrailPoint *trailQ;
+ int trailQFront, trailQBack;
+ GLfloat camera[3];
+ GLfloat centre[3];
+ rotator *the_rotator;
+ Bool button_down_p;
+ Bool texture;
+ GLuint textureNames[N_TEXTURES];
+ int drag_x;
+ int drag_y;
+ int noise_initted;
+ int p[512];
+} glhcfg;
+
+static glhcfg *glhanoi_cfg = NULL;
+static Bool fog;
+static Bool light;
+static Bool texture;
+static GLfloat trails;
+static int poles;
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+ {"-light", ".glhanoi.light", XrmoptionNoArg, "true"},
+ {"+light", ".glhanoi.light", XrmoptionNoArg, "false"},
+ {"-fog", ".glhanoi.fog", XrmoptionNoArg, "true"},
+ {"+fog", ".glhanoi.fog", XrmoptionNoArg, "false"},
+ {"-texture", ".glhanoi.texture", XrmoptionNoArg, "true"},
+ {"+texture", ".glhanoi.texture", XrmoptionNoArg, "false"},
+ {"-trails", ".glhanoi.trails", XrmoptionSepArg, 0},
+ {"-poles", ".glhanoi.poles", XrmoptionSepArg, 0 },
+ {"-speed", ".glhanoi.speed", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] = {
+ {&light, "light", "Light", DEF_LIGHT, t_Bool},
+ {&fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&trails, "trails", "Trails", DEF_TRAILS, t_Float},
+ {&poles, "poles", "Poles", DEF_POLES, t_Int},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float}
+};
+
+static OptionStruct desc[] = {
+ {"+/-light", "whether to light the scene"},
+ {"+/-fog", "whether to apply fog to the scene"},
+ {"+/-texture", "whether to apply texture to the scene"},
+ {"-trails t", "how long of disk trails to show (sec.)"},
+ {"-poles r", "number of poles to move disks between"},
+ {"-speed s", "speed multiplier"}
+};
+
+ENTRYPOINT ModeSpecOpt glhanoi_opts = { countof(opts), opts, countof(vars), vars, desc };
+
+#ifdef USE_MODULES
+
+ModStruct glhanoi_description = {
+ "glhanoi", "init_glhanoi", "draw_glhanoi", NULL,
+ "draw_glhanoi", "init_glhanoi", "free_glhanoi", &glhanoi_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Towers of Hanoi", 0, NULL
+};
+
+#endif
+
+static const GLfloat cBlack[] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat cWhite[] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat poleColor[] = { 0.545, 0.137, 0.137 };
+static const GLfloat baseColor[] = { 0.34, 0.34, 0.48 };
+/* static const GLfloat baseColor[] = { 0.545, 0.137, 0.137 }; */
+static const GLfloat fogcolor[] = { 0.5, 0.5, 0.5 };
+static GLfloat trailColor[] = { 1.0, 1.0, 1.0, 0.5 };
+
+static const float left[] = { 1.0, 0.0, 0.0 };
+static const float up[] = { 0.0, 1.0, 0.0 };
+static const float front[] = { 0.0, 0.0, 1.0 };
+static const float right[] = { -1.0, 0.0, 0.0 };
+static const float down[] = { 0.0, -1.0, 0.0 };
+static const float back[] = { 0.0, 0.0, -1.0 };
+
+static const GLfloat pos0[4] = { 50.0, 50.0, 50.0, 0.0 };
+static const GLfloat amb0[4] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat dif0[4] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat spc0[4] = { 0.0, 1.0, 1.0, 1.0 };
+
+static const GLfloat pos1[4] = { -50.0, 50.0, -50.0, 0.0 };
+static const GLfloat amb1[4] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat dif1[4] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat spc1[4] = { 1.0, 1.0, 1.0, 1.0 };
+
+static float g = 3.0 * 9.80665; /* hmm, looks like we need more gravity, Scotty... */
+
+static void checkAllocAndExit(Bool item, char *descr) {
+ if (!item) {
+ fprintf(stderr, "%s: unable to allocate memory for %s\n",
+ progname, descr);
+ exit(EXIT_FAILURE);
+ }
+}
+
+#define DOPUSH(X, Y) (((X)->count) >= ((X)->size)) ? NULL : ((X)->data[(X)->count++] = (Y))
+#define DOPOP(X) (X)->count <= 0 ? NULL : ((X)->data[--((X)->count)])
+
+/* push disk d onto pole idx */
+static Disk *push(glhcfg *glhanoi, int idx, Disk * d)
+{
+ return DOPUSH(&glhanoi->pole[idx], d);
+}
+
+/* pop the top disk from pole idx */
+static Disk *pop(glhcfg *glhanoi, int idx)
+{
+ return DOPOP(&glhanoi->pole[idx]);
+}
+
+static inline void swap(int *x, int *y)
+{
+ *x = *x ^ *y;
+ *y = *x ^ *y;
+ *x = *x ^ *y;
+}
+
+/*
+ * magic - it's magic...
+ * Return 1 if the number of trailing zeroes on i is even, unless i is 1 or 0.
+ */
+static int magic(int i)
+{
+ int count = 0;
+ if(i <= 1)
+ return 0;
+ while((i & 0x01) == 0) {
+ i >>= 1;
+ count++;
+ }
+ return count % 2 == 0;
+}
+
+static float distance(float *p0, float *p1)
+{
+ float x, y, z;
+ x = p1[0] - p0[0];
+ y = p1[1] - p0[1];
+ z = p1[2] - p0[2];
+ return (float)sqrt(x * x + y * y + z * z);
+}
+
+/* What is this for?
+ = c / (a b - 0.25 (a^2 + 2 a b + b^2) )
+ = c / (-0.25 (a^2 - 2 a b + b^2) )
+ = c / (-0.25 ((a - b)(a - b)))
+ = -4 c / (a - b)^2
+static GLfloat A(GLfloat a, GLfloat b, GLfloat c)
+{
+ GLfloat sum = a + b;
+ return c / (a * b - 0.25 * sum * sum);
+}
+*/
+
+static void moveSetup(glhcfg *glhanoi, Disk * disk)
+{
+ float h, ymax;
+ float u;
+ int src = glhanoi->src;
+ int dst = glhanoi->dst;
+ GLfloat theta;
+ GLfloat sintheta, costheta;
+ double dh;
+ double dx, dz; /* total x and z distances from src to dst */
+ Pole *poleSrc, *poleDst;
+
+ poleSrc = &(glhanoi->pole[src]);
+ poleDst = &(glhanoi->pole[dst]);
+
+ disk->xmin = poleSrc->position[0];
+ /* glhanoi->poleOffset * (src - (glhanoi->numberOfPoles - 1.0f) * 0.5); */
+ disk->xmax = poleDst->position[0];
+ /* disk->xmax = glhanoi->poleOffset * (dst - (glhanoi->numberOfPoles - 1.0f) * 0.5); */
+ disk->ymin = glhanoi->poleHeight;
+ disk->zmin = poleSrc->position[2];
+ disk->zmax = poleDst->position[2];
+
+ dx = disk->xmax - disk->xmin;
+ dz = disk->zmax - disk->zmin;
+
+ if(glhanoi->state != FINISHED) {
+ double xxx = ((dx < 0) ? 180.0 : -180.0);
+ if(random() % 6 == 0) {
+ disk->rotAngle = xxx * (2 - 2 * random() % 2) * (random() % 3 + 1);
+ } else {
+ disk->rotAngle = xxx;
+ }
+ if(random() % 4 == 0) {
+ /* Backflip */
+ disk->rotAngle = -disk->rotAngle;
+ }
+ } else {
+ disk->rotAngle = -180.0;
+ }
+
+ disk->base0 = glhanoi->diskPos[poleSrc->count];
+ disk->base1 = (glhanoi->state == FINISHED) ?
+ disk->base0 : glhanoi->diskPos[poleDst->count];
+
+ /* horizontal distance to travel? */
+ /* was: absx = sqrt(disk->xmax - disk->xmin); */
+ dh = distance(poleSrc->position, poleDst->position);
+ /* absx = sqrt(dh); */
+ ymax = glhanoi->poleHeight + dh;
+ if(glhanoi->state == FINISHED) {
+ ymax += dh * (double)(glhanoi->numberOfDisks - disk->id);
+ }
+ h = ymax - disk->ymin;
+ /* A(a, b, c) = -4 c / (a - b)^2 */
+ /* theta = atan(4 h / (b - a)) */
+ theta = atan(4 * h / dh);
+ if(theta < 0.0)
+ theta += M_PI;
+ costheta = cos(theta);
+ sintheta = sin(theta);
+ u = (float)
+ sqrt(fabs
+ (-g /
+ /* (2.0 * A(disk->xmin, disk->xmax, h) * costheta * costheta))); */
+ (2.0 * -4 * h / (dh * dh) * costheta * costheta)));
+ disk->usintheta = u * sintheta;
+ disk->ucostheta = u * costheta;
+ /* Not to be confused: disk->dx is the per-time-unit portion of dx */
+ disk->dx = disk->ucostheta * dx / dh;
+ disk->dz = disk->ucostheta * dz / dh;
+ disk->t1 =
+ (-u + sqrt(u * u + 2.0 * g * fabs(disk->ymin - disk->base0))) / g;
+ disk->u1 = u + g * disk->t1;
+ disk->t2 = 2.0 * disk->usintheta / g;
+ disk->u2 = disk->usintheta - g * disk->t2;
+
+ /* Compute direction of travel, in the XZ plane. */
+ disk->phi = atan(dz / dx);
+ disk->phi *= 180.0 / M_PI; /* convert radians to degrees */
+}
+
+/* For debugging: show a value as a string of ones and zeroes
+static const char *byteToBinary(int x) {
+ static char b[9];
+ int i, z;
+
+ for (z = 128, i = 0; z > 0; z >>= 1, i++) {
+ b[i] = ((x & z) == z) ? '1' : '0';
+ }
+ b[i] = '\0';
+
+ return b;
+}
+*/
+
+static void pushMove(glhcfg *glhanoi, int n, int src, int dst, int avail) {
+ SubProblem *sp = &(glhanoi->solveStack[glhanoi->solveStackIdx++]);
+
+ if (glhanoi->solveStackIdx > glhanoi->solveStackSize) {
+ fprintf(stderr, "solveStack overflow: pushed index %d: %d from %d to %d, using %d\n",
+ glhanoi->solveStackIdx, n, src, dst, avail);
+ exit(EXIT_FAILURE);
+ }
+
+ sp->nDisks = n;
+ sp->src = src;
+ sp->dst = dst;
+ sp->available = avail & ~((unsigned long)(1 << src))
+ & ~((unsigned long)(1 << dst));
+ /*
+ fprintf(stderr, "Debug: > pushed solveStack %d: %d from %d to %d, using %s\n",
+ glhanoi->solveStackIdx - 1, n, src, dst, byteToBinary(sp->available));
+ */
+}
+
+static Bool solveStackEmpty(glhcfg *glhanoi) {
+ return (glhanoi->solveStackIdx < 1);
+}
+
+static SubProblem *popMove(glhcfg *glhanoi) {
+ SubProblem *sp;
+ if (solveStackEmpty(glhanoi)) return (SubProblem *)NULL;
+ sp = &(glhanoi->solveStack[--glhanoi->solveStackIdx]);
+ /* fprintf(stderr, "Debug: < popped solveStack %d: %d from %d to %d, using %s\n",
+ glhanoi->solveStackIdx, sp->nDisks, sp->src, sp->dst, byteToBinary(sp->available)); */
+ return sp;
+}
+
+/* Return number of bits set in b */
+static int numBits(unsigned long b) {
+ int count = 0;
+ while (b) {
+ count += b & 0x1u;
+ b >>= 1;
+ }
+ return count;
+}
+
+/* Return index (power of 2) of least significant 1 bit. */
+static int bitScan(unsigned long b) {
+ int count;
+ for (count = 0; b; count++, b >>= 1) {
+ if (b & 0x1u) return count;
+ }
+ return -1;
+}
+
+/* A bit pattern representing all poles */
+#define ALL_POLES ((1 << glhanoi->numberOfPoles) - 1)
+
+#define REMOVE_BIT(a, b) ((a) & ~(1 << (b)))
+#define ADD_BIT(a, b) ((a) | (1 << (b)))
+
+static void makeMove(glhcfg *glhanoi)
+{
+ if (glhanoi->numberOfPoles == 3) {
+ int fudge = glhanoi->move + 2;
+ int magicNumber = magic(fudge);
+
+
+ glhanoi->currentDisk = pop(glhanoi, glhanoi->src);
+ moveSetup(glhanoi, glhanoi->currentDisk);
+ push(glhanoi, glhanoi->dst, glhanoi->currentDisk);
+
+ fudge = fudge % 2;
+
+ if(fudge == 1 || magicNumber) {
+ swap(&glhanoi->src, &glhanoi->tmp);
+ }
+ if(fudge == 0 || glhanoi->magicNumber) {
+ swap(&glhanoi->dst, &glhanoi->tmp);
+ }
+ glhanoi->magicNumber = magicNumber;
+ } else {
+ SubProblem sp;
+ int tmp = 0;
+
+ if (glhanoi->move == 0) {
+ /* Initialize the solution stack. Original problem:
+ move all disks from pole 0 to furthest pole,
+ using all other poles. */
+ pushMove(glhanoi, glhanoi->numberOfDisks, 0,
+ glhanoi->numberOfPoles - 1,
+ REMOVE_BIT(REMOVE_BIT(ALL_POLES, 0), glhanoi->numberOfPoles - 1));
+ }
+
+ while (!solveStackEmpty(glhanoi)) {
+ int k, numAvail;
+ sp = *popMove(glhanoi);
+
+ if (sp.nDisks == 1) {
+ /* We have a single, concrete move to do. */
+ /* moveSetup uses glhanoi->src, dst. */
+ glhanoi->src = sp.src;
+ glhanoi->dst = sp.dst;
+ glhanoi->tmp = tmp; /* Probably unnecessary */
+
+ glhanoi->currentDisk = pop(glhanoi, sp.src);
+ moveSetup(glhanoi, glhanoi->currentDisk);
+ push(glhanoi, sp.dst, glhanoi->currentDisk);
+
+ return;
+ } else {
+ /* Divide and conquer, using Frame-Stewart algorithm, until we get to base case */
+ if (sp.nDisks == 1) break;
+
+ numAvail = numBits(sp.available);
+ if (numAvail < 2) k = sp.nDisks - 1;
+ else if(numAvail >= sp.nDisks - 2) k = 1;
+ /* heuristic for optimal k: sqrt(2n) (see http://www.cs.wm.edu/~pkstoc/boca.pdf) */
+ else k = (int)(sqrt(2 * sp.nDisks));
+
+ if (k >= sp.nDisks) k = sp.nDisks - 1;
+ else if (k < 1) k = 1;
+
+ tmp = bitScan(sp.available);
+ /* fprintf(stderr, "Debug: k is %d, tmp is %d\n", k, tmp); */
+ if (tmp == -1) {
+ fprintf(stderr, "Error: n > 1 (%d) and no poles available\n",
+ sp.nDisks);
+ }
+
+ /* Push on moves in reverse order, since this is a stack. */
+ pushMove(glhanoi, k, tmp, sp.dst,
+ REMOVE_BIT(ADD_BIT(sp.available, sp.src), tmp));
+ pushMove(glhanoi, sp.nDisks - k, sp.src, sp.dst,
+ REMOVE_BIT(sp.available, tmp));
+ pushMove(glhanoi, k, sp.src, tmp,
+ REMOVE_BIT(ADD_BIT(sp.available, sp.dst), tmp));
+
+ /* Repeat until we've found a move we can make. */
+ }
+ }
+ }
+}
+
+static double lerp(double alpha, double start, double end)
+{
+ return start + alpha * (end - start);
+}
+
+static void upfunc(GLdouble t, Disk * d)
+{
+ d->position[0] = d->xmin;
+ d->position[1] = d->base0 + (d->u1 - 0.5 * g * t) * t;
+ d->position[2] = d->zmin;
+
+ d->rotation[1] = 0.0;
+}
+
+static void parafunc(GLdouble t, Disk * d)
+{
+ /* ##was: d->position[0] = d->xmin + d->ucostheta * t; */
+ d->position[0] = d->xmin + d->dx * t;
+ d->position[2] = d->zmin + d->dz * t;
+ d->position[1] = d->ymin + (d->usintheta - 0.5 * g * t) * t;
+
+ d->rotation[1] = d->rotAngle * t / d->t2;
+ /* d->rotAngle * (d->position[0] - d->xmin) / (d->xmax - d->xmin); */
+}
+
+static void downfunc(GLdouble t, Disk * d)
+{
+ d->position[0] = d->xmax;
+ d->position[1] = d->ymin + (d->u2 - 0.5 * g * t) * t;
+ d->position[2] = d->zmax;
+
+ d->rotation[1] = 0.0;
+}
+
+#define normalizeQ(i) ((i) >= glhanoi->trailQSize ? (i) - glhanoi->trailQSize : (i))
+#define normalizeQNeg(i) ((i) < 0 ? (i) + glhanoi->trailQSize : (i))
+
+/* Add trail point at position posn at time t onto back of trail queue.
+ Removes old trails if necessary to make room. */
+static void enQTrail(glhcfg *glhanoi, GLfloat *posn)
+{
+ if (glhanoi->trailQSize && glhanoi->state != MONEY_SHOT) {
+ TrailPoint *tp = &(glhanoi->trailQ[glhanoi->trailQBack]);
+ double t = getTime();
+
+ tp->position[0] = posn[0];
+ tp->position[1] = posn[1] + glhanoi->diskHeight;
+ /* Slight jitter to prevent clashing with other trails */
+ tp->position[2] = posn[2] + (glhanoi->move % 23) * 0.01;
+ tp->startTime = t + TRAIL_START_DELAY;
+ tp->endTime = t + TRAIL_START_DELAY + glhanoi->trailDuration;
+ tp->isEnd = False;
+
+ /* Update queue back/front indices */
+ glhanoi->trailQBack = normalizeQ(glhanoi->trailQBack + 1);
+ if (glhanoi->trailQBack == glhanoi->trailQFront)
+ glhanoi->trailQFront = normalizeQ(glhanoi->trailQFront + 1);
+ }
+}
+
+/* Mark last trailpoint in queue as the end of a trail. */
+/* was: #define endTrail(glh) ((glh)->trailQ[(glh)->trailQBack].isEnd = True) */
+static void endTrail(glhcfg *glhanoi) {
+ if (glhanoi->trailQSize)
+ glhanoi->trailQ[normalizeQNeg(glhanoi->trailQBack - 1)].isEnd = True;
+}
+
+/* Update disk d's position and rotation based on time t.
+ Returns true iff move is finished. */
+static Bool computePosition(glhcfg *glhanoi, GLfloat t, Disk * d)
+{
+ Bool finished = False;
+
+ if(t < d->t1) {
+ upfunc(t, d);
+ } else if(t < d->t1 + d->t2) {
+ parafunc(t - d->t1, d);
+ enQTrail(glhanoi, d->position);
+ } else {
+ downfunc(t - d->t1 - d->t2, d);
+ if(d->position[1] <= d->base1) {
+ d->position[1] = d->base1;
+ finished = True;
+ endTrail(glhanoi);
+ }
+ }
+ return finished;
+}
+
+static void updateView(glhcfg *glhanoi)
+{
+ double longitude, latitude, radius;
+ double a, b, c, A, B;
+
+ get_position(glhanoi->the_rotator, NULL, NULL, &radius,
+ !glhanoi->button_down_p);
+ get_rotation(glhanoi->the_rotator, &longitude, &latitude, NULL,
+ !glhanoi->button_down_p);
+ longitude += glhanoi->camera[0];
+ latitude += glhanoi->camera[1];
+ radius += glhanoi->camera[2];
+ /* FUTURE: tweak this to be smooth: */
+ longitude = longitude - floor(longitude);
+ latitude = latitude - floor(latitude);
+ radius = radius - floor(radius);
+ if(latitude > 0.5) {
+ latitude = 1.0 - latitude;
+ }
+ if(radius > 0.5) {
+ radius = 1.0 - radius;
+ }
+
+ b = glhanoi->centre[1];
+ c = (MIN_CAMERA_RADIUS +
+ radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS));
+ A = M_PI / 4.0 * (1.0 - latitude);
+ a = sqrt(b * b + c * c - 2.0 * b * c * cos(A));
+ B = asin(sin(A) * b / a);
+ glRotatef(-B * 180 / M_PI, 1.0, 0.0, 0.0);
+
+ glTranslatef(0.0f, 0.0f,
+ -(MIN_CAMERA_RADIUS +
+ radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS)));
+ glRotatef(longitude * 360.0, 0.0f, 1.0f, 0.0f);
+ glRotatef(latitude * 180.0, cos(longitude * 2.0 * M_PI), 0.0,
+ sin(longitude * 2.0 * M_PI));
+}
+
+static void changeState(glhcfg *glhanoi, State state)
+{
+ glhanoi->state = state;
+ glhanoi->startTime = getTime();
+}
+
+static Bool finishedHanoi(glhcfg *glhanoi) {
+ /* use different criteria depending on algorithm */
+ return (glhanoi->numberOfPoles == 3 ?
+ glhanoi->move >= glhanoi->numberOfMoves :
+ solveStackEmpty(glhanoi));
+}
+
+static void update_glhanoi(glhcfg *glhanoi)
+{
+ double t = getTime() - glhanoi->startTime;
+ int i;
+ Bool done;
+
+ switch (glhanoi->state) {
+ case START:
+ if(t < glhanoi->duration) {
+ break;
+ }
+ glhanoi->move = 0;
+ if(glhanoi->numberOfDisks % 2 == 0) {
+ swap(&glhanoi->tmp, &glhanoi->dst);
+ }
+ glhanoi->magicNumber = 1;
+ makeMove(glhanoi);
+ changeState(glhanoi, MOVE_DISK);
+ break;
+
+ case MOVE_DISK:
+ if(computePosition(glhanoi, t * glhanoi->currentDisk->speed, glhanoi->currentDisk)) {
+ changeState(glhanoi, MOVE_FINISHED);
+ }
+ break;
+
+ case MOVE_FINISHED:
+ ++glhanoi->move;
+ if(!finishedHanoi(glhanoi)) {
+ makeMove(glhanoi);
+ changeState(glhanoi, MOVE_DISK);
+ } else {
+ glhanoi->duration = FINISH_DURATION;
+ changeState(glhanoi, FINISHED);
+ }
+ break;
+
+ case FINISHED:
+ if (t < glhanoi->duration)
+ break;
+ glhanoi->src = glhanoi->olddst;
+ glhanoi->dst = glhanoi->oldsrc;
+ for(i = 0; i < glhanoi->numberOfDisks; ++i) {
+ Disk *disk = pop(glhanoi, glhanoi->src);
+ assert(disk != NULL);
+ moveSetup(glhanoi, disk);
+ }
+ for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+ push(glhanoi, glhanoi->dst, &glhanoi->disk[i]);
+ }
+ changeState(glhanoi, MONEY_SHOT);
+ break;
+
+ case MONEY_SHOT:
+ done = True;
+ for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+ double delay = 0.25 * i;
+ int finished;
+
+ if(t - delay < 0) {
+ done = False;
+ continue;
+ }
+
+ finished = computePosition(glhanoi, t - delay, &glhanoi->disk[i]);
+ glhanoi->disk[i].rotation[1] = 0.0;
+
+ if(!finished) {
+ done = False;
+ }
+ }
+ if(done) {
+ glhanoi->src = glhanoi->oldsrc;
+ glhanoi->tmp = glhanoi->oldtmp;
+ glhanoi->dst = glhanoi->olddst;
+ changeState(glhanoi, START);
+ }
+ break;
+
+ case INVALID:
+ default:
+ fprintf(stderr, "Invalid state\n");
+ break;
+ }
+}
+
+static void HSVtoRGBf(GLfloat h, GLfloat s, GLfloat v,
+ GLfloat * r, GLfloat * g, GLfloat * b)
+{
+ if(s == 0.0) {
+ *r = v;
+ *g = v;
+ *b = v;
+ } else {
+ GLfloat i, f, p, q, t;
+ if(h >= 360.0) {
+ h = 0.0;
+ }
+ h /= 60.0; /* h now in [0,6). */
+ i = floor((double)h); /* i now largest integer <= h */
+ f = h - i; /* f is no fractional part of h */
+ p = v * (1.0 - s);
+ q = v * (1.0 - (s * f));
+ t = v * (1.0 - (s * (1.0 - f)));
+ switch ((int)i) {
+ case 0:
+ *r = v;
+ *g = t;
+ *b = p;
+ break;
+ case 1:
+ *r = q;
+ *g = v;
+ *b = p;
+ break;
+ case 2:
+ *r = p;
+ *g = v;
+ *b = t;
+ break;
+ case 3:
+ *r = p;
+ *g = q;
+ *b = v;
+ break;
+ case 4:
+ *r = t;
+ *g = p;
+ *b = v;
+ break;
+ case 5:
+ *r = v;
+ *g = p;
+ *b = q;
+ break;
+ }
+ }
+}
+
+static void HSVtoRGBv(GLfloat * hsv, GLfloat * rgb)
+{
+ HSVtoRGBf(hsv[0], hsv[1], hsv[2], &rgb[0], &rgb[1], &rgb[2]);
+}
+
+static void setMaterial(const GLfloat color[3], const GLfloat hlite[3], int shininess)
+{
+ glColor3fv(color);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, hlite);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glMateriali(GL_FRONT, GL_SHININESS, shininess); /* [0,128] */
+}
+
+/*
+ * drawTube: I know all this stuff is available in gluQuadrics
+ * but I'd originally intended to texture the poles with a 3D wood
+ * texture, but I was having difficulty getting wood... what? Why
+ * are all you Amercians laughing..? Anyway, I don't know if enough
+ * people's hardware supports 3D textures, so I didn't bother (xorg
+ * ATI server doesn't :-( )
+ */
+static int drawTube(GLdouble bottomRadius, GLdouble topRadius,
+ GLdouble bottomThickness, GLdouble topThickness,
+ GLdouble height, GLuint nSlice, GLuint nLoop)
+{
+ int polys = 0;
+ GLfloat y;
+ GLfloat *cosCache = malloc(sizeof(GLfloat) * nSlice);
+ GLfloat *sinCache = malloc(sizeof(GLfloat) * nSlice);
+ GLint slice;
+ GLuint loop;
+ GLint lastSlice = nSlice - 1;
+ GLfloat radius;
+ GLfloat innerRadius;
+
+ if(bottomThickness > bottomRadius) {
+ bottomThickness = bottomRadius;
+ }
+ if(topThickness > topRadius) {
+ topThickness = topRadius;
+ }
+ if(bottomThickness < 0.0) {
+ bottomThickness = 0.0;
+ }
+ if(topThickness < 0.0) {
+ topThickness = 0.0;
+ }
+/* if(topRadius >= bottomRadius) {
+ maxRadius = topRadius;
+ } else {
+ maxRadius = bottomRadius;
+ } */
+
+ /* bottom */
+ y = 0.0;
+ radius = bottomRadius;
+ innerRadius = bottomRadius - bottomThickness;
+ /* innerTexCoordSize = texCoordSize * innerRadius / maxRadius; */
+ /* outerTexCoordSize = texCoordSize * radius / maxRadius; */
+ /* yTexCoord = minTexCoord; */
+
+ glBegin(GL_QUAD_STRIP);
+
+ glNormal3f(0.0, -1.0, 0.0);
+
+ /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + innerTexCoordSize); */
+ glVertex3f(0.0, y, innerRadius);
+
+ /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + outerTexCoordSize); */
+ glVertex3f(0.0, y, radius);
+
+ for(slice = lastSlice; slice >= 0; --slice) {
+ GLfloat theta = 2.0 * M_PI * (double)slice / nSlice;
+
+ cosCache[slice] = cos(theta);
+ sinCache[slice] = sin(theta);
+
+ /* glTexCoord3f(midTexCoord + sinCache[slice] * innerTexCoordSize, */
+ /* yTexCoord, */
+ /* midTexCoord + cosCache[slice] * innerTexCoordSize); */
+ glVertex3f(innerRadius * sinCache[slice], y,
+ innerRadius * cosCache[slice]);
+ /* glTexCoord3f(midTexCoord + sinCache[slice] * outerTexCoordSize, */
+ /* yTexCoord, */
+ /* midTexCoord + cosCache[slice] * outerTexCoordSize); */
+ glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+ polys++;
+ }
+ glEnd();
+
+ /* middle */
+ for(loop = 0; loop < nLoop; ++loop) {
+ GLfloat lowerRadius =
+ bottomRadius + (topRadius -
+ bottomRadius) * (float)loop / (nLoop);
+ GLfloat upperRadius =
+ bottomRadius + (topRadius - bottomRadius) * (float)(loop +
+ 1) /
+ (nLoop);
+ GLfloat lowerY = height * (float)loop / (nLoop);
+ GLfloat upperY = height * (float)(loop + 1) / (nLoop);
+ GLfloat factor = (topRadius - topThickness) -
+ (bottomRadius - bottomThickness);
+
+ /* outside */
+ glBegin(GL_QUAD_STRIP);
+ for(slice = 0; slice < nSlice; ++slice) {
+ glNormal3f(sinCache[slice], 0.0, cosCache[slice]);
+ glVertex3f(upperRadius * sinCache[slice], upperY,
+ upperRadius * cosCache[slice]);
+ glVertex3f(lowerRadius * sinCache[slice], lowerY,
+ lowerRadius * cosCache[slice]);
+ polys++;
+ }
+ glNormal3f(0.0, 0.0, 1.0);
+ glVertex3f(0.0, upperY, upperRadius);
+ glVertex3f(0.0, lowerY, lowerRadius);
+ polys++;
+ glEnd();
+
+ /* inside */
+ lowerRadius = bottomRadius - bottomThickness +
+ factor * (float)loop / (nLoop);
+ upperRadius = bottomRadius - bottomThickness +
+ factor * (float)(loop + 1) / (nLoop);
+
+ glBegin(GL_QUAD_STRIP);
+ glNormal3f(0.0, 0.0, -1.0);
+ glVertex3f(0.0, upperY, upperRadius);
+ glVertex3f(0.0, lowerY, lowerRadius);
+ for(slice = lastSlice; slice >= 0; --slice) {
+ glNormal3f(-sinCache[slice], 0.0, -cosCache[slice]);
+ glVertex3f(upperRadius * sinCache[slice], upperY,
+ upperRadius * cosCache[slice]);
+ glVertex3f(lowerRadius * sinCache[slice], lowerY,
+ lowerRadius * cosCache[slice]);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* top */
+ y = height;
+ radius = topRadius;
+ innerRadius = topRadius - topThickness;
+
+ glBegin(GL_QUAD_STRIP);
+ glNormal3f(0.0, 1.0, 0.0);
+ for(slice = 0; slice < nSlice; ++slice) {
+ glVertex3f(innerRadius * sinCache[slice], y,
+ innerRadius * cosCache[slice]);
+
+ glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+ polys++;
+ }
+ glVertex3f(0.0, y, innerRadius);
+ glVertex3f(0.0, y, radius);
+ glEnd();
+ return polys;
+}
+
+static int drawPole(GLfloat radius, GLfloat length)
+{
+ return drawTube(radius, radius, radius, radius, length, NSLICE, NLOOPS);
+}
+
+static int drawDisk3D(GLdouble inner_radius, GLdouble outer_radius,
+ GLdouble height)
+{
+ return drawTube(outer_radius, outer_radius, outer_radius - inner_radius,
+ outer_radius - inner_radius, height, NSLICE, NLOOPS);
+}
+
+/* used for drawing base */
+static int drawCuboid(GLfloat length, GLfloat width, GLfloat height)
+{
+ GLfloat xmin = -length / 2.0f;
+ GLfloat xmax = length / 2.0f;
+ GLfloat zmin = -width / 2.0f;
+ GLfloat zmax = width / 2.0f;
+ GLfloat ymin = 0.0f;
+ GLfloat ymax = height;
+ int polys = 0;
+
+ glBegin(GL_QUADS);
+ /* front */
+ glNormal3fv(front);
+ glVertex3f(xmin, ymin, zmax); /* 0 */
+ glVertex3f(xmax, ymin, zmax); /* 1 */
+ glVertex3f(xmax, ymax, zmax); /* 2 */
+ glVertex3f(xmin, ymax, zmax); /* 3 */
+ polys++;
+ /* right */
+ glNormal3fv(right);
+ glVertex3f(xmax, ymin, zmax); /* 1 */
+ glVertex3f(xmax, ymin, zmin); /* 5 */
+ glVertex3f(xmax, ymax, zmin); /* 6 */
+ glVertex3f(xmax, ymax, zmax); /* 2 */
+ polys++;
+ /* back */
+ glNormal3fv(back);
+ glVertex3f(xmax, ymin, zmin); /* 5 */
+ glVertex3f(xmin, ymin, zmin); /* 4 */
+ glVertex3f(xmin, ymax, zmin); /* 7 */
+ glVertex3f(xmax, ymax, zmin); /* 6 */
+ polys++;
+ /* left */
+ glNormal3fv(left);
+ glVertex3f(xmin, ymin, zmin); /* 4 */
+ glVertex3f(xmin, ymin, zmax); /* 0 */
+ glVertex3f(xmin, ymax, zmax); /* 3 */
+ glVertex3f(xmin, ymax, zmin); /* 7 */
+ polys++;
+ /* top */
+ glNormal3fv(up);
+ glVertex3f(xmin, ymax, zmax); /* 3 */
+ glVertex3f(xmax, ymax, zmax); /* 2 */
+ glVertex3f(xmax, ymax, zmin); /* 6 */
+ glVertex3f(xmin, ymax, zmin); /* 7 */
+ polys++;
+ /* bottom */
+ glNormal3fv(down);
+ glVertex3f(xmin, ymin, zmin); /* 4 */
+ glVertex3f(xmax, ymin, zmin); /* 5 */
+ glVertex3f(xmax, ymin, zmax); /* 1 */
+ glVertex3f(xmin, ymin, zmax); /* 0 */
+ polys++;
+ glEnd();
+ return polys;
+}
+
+/* Set normal vector in xz plane, based on rotation around center. */
+static void setNormalV(glhcfg *glhanoi, GLfloat theta, int y1, int y2, int r1) {
+ if (y1 == y2) /* up/down */
+ glNormal3f(0.0, y1 ? 1.0 : -1.0, 0.0);
+ else if (!r1) /* inward */
+ glNormal3f(-cos(theta), 0.0, -sin(theta));
+ else /* outward */
+ glNormal3f(cos(theta), 0.0, sin(theta));
+}
+
+/* y1, r1, y2, r2 are indices into y, r, beg, end */
+static int drawBaseStrip(glhcfg *glhanoi, int y1, int r1, int y2, int r2,
+ GLfloat y[2], GLfloat r[2], GLfloat beg[2][2], GLfloat end[2][2]) {
+ int i;
+ GLfloat theta, costh, sinth, x[2], z[2];
+ GLfloat theta1 = (M_PI * 2) / (glhanoi->numberOfPoles + 1);
+
+ glBegin(GL_QUAD_STRIP);
+
+ /* beginning edge */
+ glVertex3f(beg[r1][0], y[y1], beg[r1][1]);
+ glVertex3f(beg[r2][0], y[y2], beg[r2][1]);
+ setNormalV(glhanoi, theta1, y1, y2, r1);
+
+ for (i = 1; i < glhanoi->numberOfPoles; i++) {
+ theta = theta1 * (i + 0.5);
+ costh = cos(theta);
+ sinth = sin(theta);
+ x[0] = costh * r[0];
+ x[1] = costh * r[1];
+ z[0] = sinth * r[0];
+ z[1] = sinth * r[1];
+
+ glVertex3f(x[r1], y[y1], z[r1]);
+ glVertex3f(x[r2], y[y2], z[r2]);
+
+ setNormalV(glhanoi, theta1 * (i + 1), y1, y2, r1);
+ }
+
+ /* end edge */
+ glVertex3f(end[r1][0], y[y1], end[r1][1]);
+ glVertex3f(end[r2][0], y[y2], end[r2][1]);
+ setNormalV(glhanoi, glhanoi->numberOfPoles, y1, y2, r1);
+
+ glEnd();
+ return glhanoi->numberOfPoles;
+}
+
+/* Draw base such that poles are distributed around a regular polygon. */
+static int drawRoundBase(glhcfg *glhanoi) {
+ int polys = 0;
+ GLfloat theta, sinth, costh;
+
+ /*
+ r[0] = (minimum) inner radius of base at vertices
+ r[1] = (minimum) outer radius of base at vertices
+ y[0] = bottom of base
+ y[1] = top of base */
+ GLfloat r[2], y[2];
+ /* positions of end points: beginning, end.
+ beg[0] is inner corner of beginning of base, beg[1] is outer corner.
+ beg[i][0] is x, [i][1] is z. */
+ GLfloat beg[2][2], end[2][2], begNorm, endNorm;
+ /* ratio of radius at base vertices to ratio at poles */
+ GLfloat longer = 1.0 / cos(M_PI / (glhanoi->numberOfPoles + 1));
+
+ r[0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * longer;
+ r[1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * longer;
+ y[0] = 0;
+ y[1] = glhanoi->baseHeight;
+
+ /* compute beg, end. Make the ends square. */
+ theta = M_PI * 2 / (glhanoi->numberOfPoles + 1);
+
+ costh = cos(theta);
+ sinth = sin(theta);
+ beg[0][0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * costh +
+ glhanoi->maxDiskRadius * sinth;
+ beg[1][0] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * costh +
+ glhanoi->maxDiskRadius * sinth;
+ beg[0][1] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * sinth -
+ glhanoi->maxDiskRadius * costh;
+ beg[1][1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * sinth -
+ glhanoi->maxDiskRadius * costh;
+ begNorm = theta - M_PI * 0.5;
+
+ theta = M_PI * 2 * glhanoi->numberOfPoles / (glhanoi->numberOfPoles + 1);
+
+ costh = cos(theta);
+ sinth = sin(theta);
+ end[0][0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * costh -
+ glhanoi->maxDiskRadius * sinth;
+ end[1][0] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * costh -
+ glhanoi->maxDiskRadius * sinth;
+ end[0][1] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * sinth +
+ glhanoi->maxDiskRadius * costh;
+ end[1][1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * sinth +
+ glhanoi->maxDiskRadius * costh;
+ endNorm = theta + M_PI * 0.5;
+
+ /* bottom: never seen
+ polys = drawBaseStrip(glhanoi, 0, 0, 0, 1, y, r, beg, end); */
+ /* outside edge */
+ polys += drawBaseStrip(glhanoi, 0, 1, 1, 1, y, r, beg, end);
+ /* top */
+ polys += drawBaseStrip(glhanoi, 1, 1, 1, 0, y, r, beg, end);
+ /* inside edge */
+ polys += drawBaseStrip(glhanoi, 1, 0, 0, 0, y, r, beg, end);
+
+ /* Draw ends */
+ glBegin(GL_QUADS);
+
+ glVertex3f(beg[0][0], y[1], beg[0][1]);
+ glVertex3f(beg[1][0], y[1], beg[1][1]);
+ glVertex3f(beg[1][0], y[0], beg[1][1]);
+ glVertex3f(beg[0][0], y[0], beg[0][1]);
+ glNormal3f(cos(begNorm), 0, sin(begNorm));
+
+ glVertex3f(end[0][0], y[0], end[0][1]);
+ glVertex3f(end[1][0], y[0], end[1][1]);
+ glVertex3f(end[1][0], y[1], end[1][1]);
+ glVertex3f(end[0][0], y[1], end[0][1]);
+ glNormal3f(cos(endNorm), 0, sin(endNorm));
+
+ polys += 2;
+
+ glEnd();
+
+ return polys;
+}
+
+static int drawDisks(glhcfg *glhanoi)
+{
+ int i;
+ int polys = 0;
+
+ glPushMatrix();
+ glTranslatef(0.0f, glhanoi->baseHeight, 0.0f);
+ for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+ Disk *disk = &glhanoi->disk[i];
+ GLfloat *pos = disk->position;
+ GLfloat *rot = disk->rotation;
+
+ glPushMatrix();
+ glTranslatef(pos[0], pos[1], pos[2]);
+ if(rot[1] != 0.0) {
+ glTranslatef(0.0, glhanoi->diskHeight / 2.0, 0.0);
+ /* rotate around different axis depending on phi */
+ if (disk->phi != 0.0)
+ glRotatef(-disk->phi, 0.0, 1.0, 0.0);
+ glRotatef(rot[1], 0.0, 0.0, 1.0);
+ if (disk->phi != 0.0)
+ glRotatef(disk->phi, 0.0, 1.0, 0.0);
+ glTranslatef(0.0, -glhanoi->diskHeight / 2.0, 0.0);
+ }
+ glCallList(disk->displayList);
+ polys += disk->polys;
+ glPopMatrix();
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static GLfloat getDiskRadius(glhcfg *glhanoi, int i)
+{
+ GLfloat retVal = glhanoi->maxDiskRadius *
+ ((GLfloat) i + 3.0) / (glhanoi->numberOfDisks + 3.0);
+ return retVal;
+}
+
+static void initData(glhcfg *glhanoi)
+{
+ int i;
+ GLfloat sinPiOverNP;
+
+ glhanoi->baseLength = BASE_LENGTH;
+ if (glhanoi->layoutLinear) {
+ glhanoi->maxDiskRadius = glhanoi->baseLength /
+ (2 * 0.95 * glhanoi->numberOfPoles);
+ } else {
+ sinPiOverNP = sin(M_PI / (glhanoi->numberOfPoles + 1));
+ glhanoi->maxDiskRadius = (sinPiOverNP * glhanoi->baseLength * 0.5 * 0.95) / (1 + sinPiOverNP);
+ }
+
+ glhanoi->poleDist = glhanoi->baseLength * 0.5 - glhanoi->maxDiskRadius;
+ glhanoi->poleRadius = glhanoi->maxDiskRadius / (glhanoi->numberOfDisks + 3.0);
+ /* fprintf(stderr, "Debug: baseL = %f, maxDiskR = %f, poleR = %f\n",
+ glhanoi->baseLength, glhanoi->maxDiskRadius, glhanoi->poleRadius); */
+ glhanoi->baseWidth = 2.0 * glhanoi->maxDiskRadius;
+ glhanoi->poleOffset = 2.0 * getDiskRadius(glhanoi, glhanoi->maxDiskIdx);
+ glhanoi->diskHeight = 2.0 * glhanoi->poleRadius;
+ glhanoi->baseHeight = 2.0 * glhanoi->poleRadius;
+ glhanoi->poleHeight = glhanoi->numberOfDisks *
+ glhanoi->diskHeight + glhanoi->poleRadius;
+ /* numberOfMoves only applies if numberOfPoles = 3 */
+ glhanoi->numberOfMoves = (1 << glhanoi->numberOfDisks) - 1;
+ /* use golden ratio */
+ glhanoi->boardSize = glhanoi->baseLength * 0.5 * (1.0 + sqrt(5.0));
+
+ glhanoi->pole = (Pole *)calloc(glhanoi->numberOfPoles, sizeof(Pole));
+ checkAllocAndExit(!!glhanoi->pole, "poles");
+
+ for(i = 0; i < glhanoi->numberOfPoles; i++) {
+ checkAllocAndExit(
+ !!(glhanoi->pole[i].data = calloc(glhanoi->numberOfDisks, sizeof(Disk *))),
+ "disk stack");
+ glhanoi->pole[i].size = glhanoi->numberOfDisks;
+ }
+ checkAllocAndExit(
+ !!(glhanoi->diskPos = calloc(glhanoi->numberOfDisks, sizeof(double))),
+ "diskPos");
+
+ if (glhanoi->trailQSize) {
+ glhanoi->trailQ = (TrailPoint *)calloc(glhanoi->trailQSize, sizeof(TrailPoint));
+ checkAllocAndExit(!!glhanoi->trailQ, "trail queue");
+ } else glhanoi->trailQ = (TrailPoint *)NULL;
+ glhanoi->trailQFront = glhanoi->trailQBack = 0;
+
+ glhanoi->the_rotator = make_rotator(0.1, 0.025, 0, 1, 0.005, False);
+ /* or glhanoi->the_rotator = make_rotator(0.025, 0.025, 0.025, 0.5, 0.005, False); */
+ glhanoi->button_down_p = False;
+
+ glhanoi->src = glhanoi->oldsrc = 0;
+ glhanoi->tmp = glhanoi->oldtmp = 1;
+ glhanoi->dst = glhanoi->olddst = glhanoi->numberOfPoles - 1;
+
+ if (glhanoi->numberOfPoles > 3) {
+ glhanoi->solveStackSize = glhanoi->numberOfDisks + 2;
+ glhanoi->solveStack = (SubProblem *)calloc(glhanoi->solveStackSize, sizeof(SubProblem));
+ checkAllocAndExit(!!glhanoi->solveStack, "solving stack");
+ glhanoi->solveStackIdx = 0;
+ }
+}
+
+static void initView(glhcfg *glhanoi)
+{
+ glhanoi->camera[0] = 0.0;
+ glhanoi->camera[1] = 0.0;
+ glhanoi->camera[2] = 0.0;
+ glhanoi->centre[0] = 0.0;
+ glhanoi->centre[1] = glhanoi->poleHeight * 3.0;
+ glhanoi->centre[2] = 0.0;
+}
+
+/*
+ * noise_improved.c - based on ImprovedNoise.java
+ * JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.
+ */
+static double fade(double t)
+{
+ return t * t * t * (t * (t * 6 - 15) + 10);
+}
+
+static double grad(int hash, double x, double y, double z)
+{
+ int h = hash & 15; /* CONVERT LO 4 BITS OF HASH CODE */
+ double u = h < 8 ? x : y, /* INTO 12 GRADIENT DIRECTIONS. */
+ v = h < 4 ? y : h == 12 || h == 14 ? x : z;
+ return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
+}
+
+static const int permutation[] = { 151, 160, 137, 91, 90, 15,
+ 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142,
+ 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26,
+ 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237,
+ 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
+ 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60,
+ 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143,
+ 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
+ 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198,
+ 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118,
+ 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189,
+ 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70,
+ 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108,
+ 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251,
+ 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145,
+ 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184,
+ 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
+ 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61,
+ 156, 180
+};
+
+static void initNoise(glhcfg *glhanoi)
+{
+ int i;
+ for(i = 0; i < 256; i++)
+ glhanoi->p[256 + i] = glhanoi->p[i] = permutation[i];
+}
+
+static double improved_noise(glhcfg *glhanoi, double x, double y, double z)
+{
+ double u, v, w;
+ int A, AA, AB, B, BA, BB;
+ int X = (int)floor(x) & 255, /* FIND UNIT CUBE THAT */
+ Y = (int)floor(y) & 255, /* CONTAINS POINT. */
+ Z = (int)floor(z) & 255;
+ if(!glhanoi->noise_initted) {
+ initNoise(glhanoi);
+ glhanoi->noise_initted = 1;
+ }
+ x -= floor(x); /* FIND RELATIVE X,Y,Z */
+ y -= floor(y); /* OF POINT IN CUBE. */
+ z -= floor(z);
+ u = fade(x), /* COMPUTE FADE CURVES */
+ v = fade(y), /* FOR EACH OF X,Y,Z. */
+ w = fade(z);
+ A = glhanoi->p[X] + Y;
+ AA = glhanoi->p[A] + Z;
+ AB = glhanoi->p[A + 1] + Z, /* HASH COORDINATES OF */
+ B = glhanoi->p[X + 1] + Y;
+ BA = glhanoi->p[B] + Z;
+ BB = glhanoi->p[B + 1] + Z; /* THE 8 CUBE CORNERS, */
+ return lerp(w, lerp(v, lerp(u, grad(glhanoi->p[AA], x, y, z),/* AND ADD */
+ grad(glhanoi->p[BA], x - 1, y, z)),/* BLENDED */
+ lerp(u, grad(glhanoi->p[AB], x, y - 1, z),/* RESULTS */
+ grad(glhanoi->p[BB], x - 1, y - 1, z))),/* FROM 8 CORNERS */
+ lerp(v, lerp(u, grad(glhanoi->p[AA + 1], x, y, z - 1), grad(glhanoi->p[BA + 1], x - 1, y, z - 1)), /* OF CUBE */
+ lerp(u, grad(glhanoi->p[AB + 1], x, y - 1, z - 1),
+ grad(glhanoi->p[BB + 1], x - 1, y - 1, z - 1))));
+}
+
+/*
+ * end noise_improved.c - based on ImprovedNoise.java
+ */
+
+struct tex_col_t {
+ GLuint *colours;
+ /* GLfloat *points; */
+ unsigned int ncols;
+};
+typedef struct tex_col_t tex_col_t;
+
+static GLubyte *makeTexture(glhcfg *glhanoi, int x_size, int y_size, int z_size,
+ GLuint(*texFunc) (glhcfg *, double, double, double,
+ tex_col_t *), tex_col_t * colours)
+{
+ int i, j, k;
+ GLubyte *textureData;
+ GLuint *texturePtr;
+ double x, y, z;
+ double xi, yi, zi;
+
+ if((textureData =
+ calloc(x_size * y_size * z_size, sizeof(GLuint))) == NULL) {
+ return NULL;
+ }
+
+ xi = 1.0 / x_size;
+ yi = 1.0 / y_size;
+ zi = 1.0 / z_size;
+
+ z = 0.0;
+ texturePtr = (void *)textureData;
+ for(k = 0; k < z_size; k++, z += zi) {
+ y = 0.0;
+ for(j = 0; j < y_size; j++, y += yi) {
+ x = 0.0;
+ for(i = 0; i < x_size; i++, x += xi) {
+ *texturePtr = texFunc(glhanoi, x, y, z, colours);
+ ++texturePtr;
+ }
+ }
+ }
+ return textureData;
+}
+
+static void freeTexCols(tex_col_t*p)
+{
+ free(p->colours);
+ free(p);
+}
+
+static tex_col_t *makeMarbleColours(void)
+{
+ tex_col_t *marbleColours;
+ int ncols = 2;
+
+ marbleColours = malloc(sizeof(tex_col_t));
+ if(marbleColours == NULL) return NULL;
+ marbleColours->colours = calloc(sizeof(GLuint), ncols);
+ if(marbleColours->colours == NULL) return NULL;
+ marbleColours->ncols = ncols;
+
+ marbleColours->colours[0] = 0x3f3f3f3f;
+ marbleColours->colours[1] = 0xffffffff;
+
+ return marbleColours;
+}
+
+static double turb(glhcfg *glhanoi, double x, double y, double z, int octaves)
+{
+ int oct, freq = 1;
+ double r = 0.0;
+
+ for(oct = 0; oct < octaves; ++oct) {
+ r += fabs(improved_noise(glhanoi, freq * x, freq * y, freq * z)) / freq;
+ freq <<= 1;
+ }
+ return r / 2.0;
+}
+
+static void perturb(glhcfg *glhanoi, double *x, double *y, double *z, double scale)
+{
+ double t = scale * turb(glhanoi, *x, *y, *z, 4);
+ *x += t;
+ *y += t;
+ *z += t;
+}
+
+static double f_m(double x, double y, double z)
+{
+ return sin(3.0 * M_PI * x);
+}
+
+static GLuint C_m(double x, const tex_col_t * tex_cols)
+{
+ int r = tex_cols->colours[0] & 0xff;
+ int g = tex_cols->colours[0] >> 8 & 0xff;
+ int b = tex_cols->colours[0] >> 16 & 0xff;
+ double factor;
+ int r1, g1, b1;
+ x = x - floor(x);
+
+ factor = (1.0 + sin(2.0 * M_PI * x)) / 2.0;
+
+ r1 = (tex_cols->colours[1] & 0xff);
+ g1 = (tex_cols->colours[1] >> 8 & 0xff);
+ b1 = (tex_cols->colours[1] >> 16 & 0xff);
+
+ r += (int)(factor * (r1 - r));
+ g += (int)(factor * (g1 - g));
+ b += (int)(factor * (b1 - b));
+
+ return 0xff000000 | (b << 16) | (g << 8) | r;
+}
+
+
+static GLuint makeMarbleTexture(glhcfg *glhanoi, double x, double y, double z, tex_col_t * colours)
+{
+ perturb(glhanoi, &x, &y, &z, MARBLE_SCALE);
+ return C_m(f_m(x, y, z), colours);
+}
+
+static void setTexture(glhcfg *glhanoi, int n)
+{
+ glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[n]);
+}
+
+/* returns 1 on failure, 0 on success */
+static int makeTextures(glhcfg *glhanoi)
+{
+ GLubyte *marbleTexture;
+ tex_col_t *marbleColours;
+
+ glGenTextures(N_TEXTURES, glhanoi->textureNames);
+
+ if((marbleColours = makeMarbleColours()) == NULL) {
+ return 1;
+ }
+ if((marbleTexture =
+ makeTexture(glhanoi, MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 1,
+ makeMarbleTexture, marbleColours)) == NULL) {
+ return 1;
+ }
+
+ glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[0]);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, marbleTexture);
+ free(marbleTexture);
+ freeTexCols(marbleColours);
+
+ return 0;
+}
+
+static void initFloor(glhcfg *glhanoi)
+{
+ int i, j;
+ float tileSize = glhanoi->boardSize / BOARD_SQUARES;
+ float x0, x1, z0, z1;
+ float tx0, tx1, tz0, tz1;
+ const float *col = cWhite;
+ float texIncr = 1.0 / BOARD_SQUARES;
+
+ glhanoi->floorpolys = 0;
+ checkAllocAndExit(!!(glhanoi->floorList = glGenLists(1)), "floor display list");
+ glNewList(glhanoi->floorList, GL_COMPILE);
+ x0 = -glhanoi->boardSize / 2.0;
+ tx0 = 0.0f;
+ setMaterial(col, cWhite, 128);
+ setTexture(glhanoi, 0);
+ glNormal3fv(up);
+ for(i = 0; i < BOARD_SQUARES; i++, x0 += tileSize, tx0 += texIncr) {
+ x1 = x0 + tileSize;
+ tx1 = tx0 + texIncr;
+ z0 = -glhanoi->boardSize / 2.0;
+ tz0 = 0.0f;
+ for(j = 0; j < BOARD_SQUARES; j++, z0 += tileSize, tz0 += texIncr) {
+ int colIndex = (i + j) & 0x1;
+
+ z1 = z0 + tileSize;
+ tz1 = tz0 + texIncr;
+
+ if(colIndex)
+ col = cWhite;
+ else
+ col = cBlack;
+
+ setMaterial(col, cWhite, 100);
+
+ glBegin(GL_QUADS);
+
+ glTexCoord2d(tx0, tz0);
+ glVertex3f(x0, 0.0, z0);
+
+ glTexCoord2d(tx0, tz1);
+ glVertex3f(x0, 0.0, z1);
+
+ glTexCoord2d(tx1, tz1);
+ glVertex3f(x1, 0.0, z1);
+
+ glTexCoord2d(tx1, tz0);
+ glVertex3f(x1, 0.0, z0);
+ glhanoi->floorpolys++;
+ glEnd();
+ }
+ }
+ glEndList();
+}
+
+static void initBase(glhcfg *glhanoi)
+{
+ checkAllocAndExit(!!(glhanoi->baseList = glGenLists(1)), "tower bases display list");
+
+ glNewList(glhanoi->baseList, GL_COMPILE);
+ setMaterial(baseColor, cWhite, 50);
+ if (glhanoi->layoutLinear) {
+ glhanoi->basepolys = drawCuboid(glhanoi->baseLength, glhanoi->baseWidth,
+ glhanoi->baseHeight);
+ } else {
+ glhanoi->basepolys = drawRoundBase(glhanoi);
+ }
+ glEndList();
+}
+
+static void initTowers(glhcfg *glhanoi)
+{
+ int i;
+
+ checkAllocAndExit(!!(glhanoi->poleList = glGenLists(1)), "poles display list\n");
+
+ glNewList(glhanoi->poleList, GL_COMPILE);
+ /* glTranslatef(-glhanoi->poleOffset * (glhanoi->numberOfPoles - 1.0f) * 0.5f, glhanoi->baseHeight, 0.0f); */
+ setMaterial(poleColor, cWhite, 50);
+ for (i = 0; i < glhanoi->numberOfPoles; i++) {
+ GLfloat *p = glhanoi->pole[i].position;
+ GLfloat rad = (M_PI * 2.0 * (i + 1)) / (glhanoi->numberOfPoles + 1);
+
+ p[1] = glhanoi->baseHeight;
+
+ if (glhanoi->layoutLinear) {
+ /* Linear: */
+ p[0] = -glhanoi->poleOffset * ((glhanoi->numberOfPoles - 1) * 0.5f - i);
+ p[2] = 0.0f;
+ } else {
+ /* Circular layout: */
+ p[0] = cos(rad) * glhanoi->poleDist;
+ p[2] = sin(rad) * glhanoi->poleDist;
+ }
+
+ glPushMatrix();
+ glTranslatef(p[0], p[1], p[2]);
+ glhanoi->polepolys = drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+ glPopMatrix();
+
+ }
+ glEndList();
+}
+
+/* Parameterized hue based on input 0.0 - 1.0. */
+static double cfunc(double x)
+{
+#define COMP <
+ if(x < 2.0 / 7.0) {
+ return (1.0 / 12.0) / (1.0 / 7.0) * x;
+ }
+ if(x < 3.0 / 7.0) {
+ /* (7x - 1) / 6 */
+ return (1.0 + 1.0 / 6.0) * x - 1.0 / 6.0;
+ }
+ if(x < 4.0 / 7.0) {
+ return (2.0 + 1.0 / 3.0) * x - 2.0 / 3.0;
+ }
+ if(x < 5.0 / 7.0) {
+ return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+ }
+ return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+}
+
+static void initDisks(glhcfg *glhanoi)
+{
+ int i;
+ glhanoi->disk = (Disk *) calloc(glhanoi->numberOfDisks, sizeof(Disk));
+ checkAllocAndExit(!!glhanoi->disk, "disks");
+
+ for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+ GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+ double f = cfunc((GLfloat) i / (GLfloat) glhanoi->numberOfDisks);
+ GLfloat diskColor = f * 360.0;
+ GLfloat color[3];
+ Disk *disk = &glhanoi->disk[i];
+
+ disk->id = i;
+ disk->position[0] = glhanoi->pole[0].position[0]; /* -glhanoi->poleOffset * (glhanoi->numberOfPoles - 1.0f) * 0.5; */
+ disk->position[1] = glhanoi->diskHeight * height;
+ disk->position[2] = glhanoi->pole[0].position[2];
+ disk->rotation[0] = 0.0;
+ disk->rotation[1] = 0.0;
+ disk->rotation[2] = 0.0;
+ disk->polys = 0;
+
+ /* make smaller disks move faster */
+ disk->speed = lerp(((double)glhanoi->numberOfDisks - i) / glhanoi->numberOfDisks,
+ 1.0, glhanoi->speed);
+ /* fprintf(stderr, "disk id: %d, alpha: %0.2f, speed: %0.2f\n", disk->id,
+ ((double)(glhanoi->maxDiskIdx - i)) / glhanoi->numberOfDisks, disk->speed); */
+
+ color[0] = diskColor;
+ color[1] = 1.0f;
+ color[2] = 1.0f;
+ HSVtoRGBv(color, color);
+
+ checkAllocAndExit(!!(disk->displayList = glGenLists(1)), "disk display list");
+ glNewList(disk->displayList, GL_COMPILE);
+ setMaterial(color, cWhite, 100.0);
+ disk->polys += drawDisk3D(glhanoi->poleRadius,
+ getDiskRadius(glhanoi, i),
+ glhanoi->diskHeight);
+ /*fprintf(stderr, "Debug: disk %d has radius %f\n", i,
+ getDiskRadius(glhanoi, i)); */
+ glEndList();
+ }
+ for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+ GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+ int h = glhanoi->maxDiskIdx - i;
+ glhanoi->diskPos[h] = glhanoi->diskHeight * height;
+ push(glhanoi, glhanoi->src, &glhanoi->disk[i]);
+ }
+}
+
+static void initLights(Bool state)
+{
+ if(state) {
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc0);
+
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb1);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spc1);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ } else {
+ glDisable(GL_LIGHTING);
+ }
+}
+
+static int drawFloor(glhcfg *glhanoi)
+{
+ glCallList(glhanoi->floorList);
+ return glhanoi->floorpolys;
+}
+
+static int drawTowers(glhcfg *glhanoi)
+{
+ glCallList(glhanoi->baseList);
+ glCallList(glhanoi->poleList);
+ return glhanoi->basepolys + glhanoi->polepolys;
+}
+
+static int drawTrails1(glhcfg *glhanoi, double t, double thickness, double alpha) {
+ int i, prev = -1, lines = 0;
+ Bool fresh = False;
+ GLfloat trailDurInv = 1.0f / glhanoi->trailDuration;
+
+ glLineWidth(thickness);
+
+ glBegin(GL_LINES);
+
+ for (i = glhanoi->trailQFront;
+ i != glhanoi->trailQBack;
+ i = normalizeQ(i + 1)) {
+ TrailPoint *tqi = &(glhanoi->trailQ[i]);
+
+ if (!fresh && t > tqi->endTime) {
+ glhanoi->trailQFront = normalizeQ(i + 1);
+ } else {
+ if (tqi->startTime > t) break;
+ /* Found trails that haven't timed out. */
+ if (!fresh) fresh = True;
+ if (prev > -1) {
+ /* Fade to invisible with age */
+ trailColor[3] = alpha * (tqi->endTime - t) * trailDurInv;
+ /* Can't use setMaterial(trailColor, cBlack, 0) because our color needs an alpha value. */
+ glColor4fv(trailColor);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, trailColor);
+ /* FUTURE: to really do this right, trails should be drawn in back-to-front
+ order, so that blending is done correctly.
+ Currently it looks poor when a faded trail is in front of, or coincident with,
+ a bright trail but is drawn first.
+ I think for now it's good enough to recommend shorter trails so they
+ never/rarely overlap.
+ A jitter per trail arc would also mitigate this problem, to a lesser degree. */
+ glVertex3fv(glhanoi->trailQ[prev].position);
+ glVertex3fv(glhanoi->trailQ[i].position);
+ lines++;
+ }
+ if (glhanoi->trailQ[i].isEnd)
+ prev = -1;
+ else
+ prev = i;
+ }
+ }
+
+ glEnd();
+
+ return lines;
+}
+
+static int drawTrails(glhcfg *glhanoi) {
+ int lines = 0;
+ double t = getTime();
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, cBlack);
+ glMateriali(GL_FRONT, GL_SHININESS, 0);
+
+ /* Draw them twice, with different widths and opacities, to make them smoother. */
+ lines = drawTrails1(glhanoi, t, 1.0, 0.75);
+ lines += drawTrails1(glhanoi, t, 2.5, 0.5);
+
+ glDisable (GL_BLEND);
+
+ /* fprintf(stderr, "Drew trails: %d lines\n", lines); */
+ return lines;
+}
+
+/* Window management, etc
+ */
+ENTRYPOINT void reshape_glhanoi(ModeInfo * mi, int width, int height)
+{
+ glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(glhanoi->glx_context));
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, 1/h, 1.0,
+ 2 * MAX_CAMERA_RADIUS);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT void init_glhanoi(ModeInfo * mi)
+{
+ glhcfg *glhanoi;
+ MI_INIT(mi, glhanoi_cfg);
+
+ glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+ glhanoi->glx_context = init_GL(mi);
+ glhanoi->numberOfDisks = MI_BATCHCOUNT(mi);
+
+ if (glhanoi->numberOfDisks <= 1)
+ glhanoi->numberOfDisks = 3 + (int) BELLRAND(9);
+
+ /* magicnumber is a bitfield, so we can't have more than 31 discs
+ on a system with 4-byte ints. */
+ if (glhanoi->numberOfDisks >= 8 * sizeof(int))
+ glhanoi->numberOfDisks = (8 * sizeof(int)) - 1;
+
+ glhanoi->maxDiskIdx = glhanoi->numberOfDisks - 1;
+
+ glhanoi->numberOfPoles = get_integer_resource(MI_DISPLAY(mi), "poles", "Integer");
+ /* Set a number of poles from 3 to numberOfDisks + 1, biased toward lower values,
+ with probability decreasing linearly. */
+ if (glhanoi->numberOfPoles <= 2)
+ glhanoi->numberOfPoles = 3 +
+ (int)((1 - sqrt(frand(1.0))) * (glhanoi->numberOfDisks - 1));
+
+ glhanoi->wire = MI_IS_WIREFRAME(mi);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glhanoi->wire = 0;
+# endif
+
+ glhanoi->light = light;
+ glhanoi->fog = fog;
+ glhanoi->texture = texture;
+ glhanoi->speed = speed;
+ glhanoi->trailDuration = trails;
+ /* set trailQSize based on 60 fps (a maximum, more or less) */
+ /* FUTURE: Should clamp framerate to 60 fps? See flurry.c's draw_flurry().
+ The only bad effect if we don't is that trail-ends could
+ show "unnatural" pauses at high fps. */
+ glhanoi->trailQSize = (int)(trails * 60.0);
+
+ reshape_glhanoi(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if(glhanoi->wire) {
+ glhanoi->light = False;
+ glhanoi->fog = False;
+ glhanoi->texture = False;
+ }
+
+ initLights(!glhanoi->wire && glhanoi->light);
+ checkAllocAndExit(!makeTextures(glhanoi), "textures\n");
+
+ /* Choose linear or circular layout. Could make this a user option. */
+ glhanoi->layoutLinear = (glhanoi->numberOfPoles == 3);
+
+ initData(glhanoi);
+ initView(glhanoi);
+ initFloor(glhanoi);
+ initBase(glhanoi);
+ initTowers(glhanoi);
+ initDisks(glhanoi);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ glShadeModel(GL_SMOOTH);
+ if(glhanoi->fog) {
+ glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], 1.0);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+ glFogf(GL_FOG_DENSITY, 0.35f);
+ glHint(GL_FOG_HINT, GL_NICEST);
+ glFogf(GL_FOG_START, MIN_CAMERA_RADIUS);
+ glFogf(GL_FOG_END, MAX_CAMERA_RADIUS / 1.9);
+ glEnable(GL_FOG);
+ }
+
+ glhanoi->duration = START_DURATION;
+ changeState(glhanoi, START);
+}
+
+ENTRYPOINT void draw_glhanoi(ModeInfo * mi)
+{
+ glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!glhanoi->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(glhanoi->glx_context));
+
+ glPolygonMode(GL_FRONT, glhanoi->wire ? GL_LINE : GL_FILL);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ mi->polygon_count = 0;
+
+ glLoadIdentity();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ update_glhanoi(glhanoi);
+ updateView(glhanoi);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ if(!glhanoi->wire && glhanoi->texture) {
+ glEnable(GL_TEXTURE_2D);
+ }
+ mi->polygon_count += drawFloor(glhanoi);
+ glDisable(GL_TEXTURE_2D);
+
+ mi->polygon_count += drawTowers(glhanoi);
+ mi->polygon_count += drawDisks(glhanoi);
+
+ if (glhanoi->trailQSize) {
+ /* No polygons, just lines. So ignore the return count. */
+ (void)drawTrails(glhanoi);
+ }
+
+ if(mi->fps_p) {
+ do_fps(mi);
+ }
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT Bool glhanoi_handle_event(ModeInfo * mi, XEvent * event)
+{
+ glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+
+ /* #### this is all wrong on iOS -- should be using gltrackball. */
+
+ if(event->xany.type == ButtonPress && event->xbutton.button == Button1) {
+ glhanoi->button_down_p = True;
+ glhanoi->drag_x = event->xbutton.x;
+ glhanoi->drag_y = event->xbutton.y;
+ return True;
+ } else if(event->xany.type == ButtonRelease
+ && event->xbutton.button == Button1) {
+ glhanoi->button_down_p = False;
+ return True;
+ } else if(event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4
+ || event->xbutton.button == Button5)) {
+ switch (event->xbutton.button) {
+ case Button4:
+ glhanoi->camera[2] += 0.01;
+ break;
+ case Button5:
+ glhanoi->camera[2] -= 0.01;
+ break;
+ default:
+ fprintf(stderr,
+ "glhanoi: unknown button in mousewheel handler\n");
+ }
+ return True;
+ } else if(event->xany.type == MotionNotify
+ && glhanoi_cfg->button_down_p) {
+ int x_diff, y_diff;
+
+ x_diff = event->xbutton.x - glhanoi->drag_x;
+ y_diff = event->xbutton.y - glhanoi->drag_y;
+
+ glhanoi->camera[0] = (float)x_diff / (float)MI_WIDTH(mi);
+ glhanoi->camera[1] = (float)y_diff / (float)MI_HEIGHT(mi);
+
+ return True;
+ }
+#if 0 /* #### doesn't work */
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ changeState(glhanoi, START);
+ return True;
+ }
+#endif
+ return False;
+}
+
+ENTRYPOINT void free_glhanoi(ModeInfo * mi)
+{
+ int i;
+ int j;
+ glhcfg *glh = &glhanoi_cfg[MI_SCREEN(mi)];
+ if (glh->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(glh->glx_context));
+ glDeleteLists(glh->floorList, 1);
+ glDeleteLists(glh->baseList, 1);
+ glDeleteLists(glh->poleList, 1);
+ glDeleteLists(glh->textureNames[0], 2);
+ for(j = 0; j < glh->numberOfDisks; ++j) {
+ glDeleteLists(glh->disk[j].displayList, 1);
+ }
+ free(glh->disk);
+ for(i = 0; i < glh->numberOfPoles; i++) {
+ if(glh->pole[i].data != NULL) {
+ free(glh->pole[i].data);
+ }
+ }
+ }
+}
+
+XSCREENSAVER_MODULE ("GLHanoi", glhanoi)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glhanoi.man b/hacks/glx/glhanoi.man
new file mode 100644
index 0000000..2060cde
--- /dev/null
+++ b/hacks/glx/glhanoi.man
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glhanoi - OpenGL Towers of Hanoi
+.SH SYNOPSIS
+.B glhanoi
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-poles \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-wireframe]
+[\-light]
+[\-texture]
+[\-fog]
+[\-fps]
+.SH DESCRIPTION
+Implementation of Towers of Hanoi in OpenGL
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+Number of disks. Default: 7.
+.TP 8
+.B \-poles \fInumber\fP
+Number of poles. Default: random from 3 to disks+1.
+.TP 8
+.B \-speed \fInumber\fP
+Speed multiplier (for smallest disks). Default: 1.
+.TP 8
+.B \-trails \fInumber\fP
+Length of disk trails, in seconds. Default: 2.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fog | \-no-fog
+Render in fog.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-light | -no-light
+Whether the scene is lit.
+.TP 8
+.B \-texture | \-no-texture
+Render with textures instead of solid.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Dave Atkinson. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Dave Atkinson.
diff --git a/hacks/glx/glknots.c b/hacks/glx/glknots.c
new file mode 100644
index 0000000..730cadb
--- /dev/null
+++ b/hacks/glx/glknots.c
@@ -0,0 +1,445 @@
+/* glknots, Copyright (c) 2003-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Generates some 3D knots (closed loops).
+ * Inspired by Paul Bourke <pbourke@swin.edu.au> at
+ * http://astronomy.swin.edu.au/~pbourke/curves/knot/
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_knot 0
+# define release_knot 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.3"
+#define DEF_SEGMENTS "800"
+#define DEF_DURATION "8"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint knot_list;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+ int mode; /* 0 = normal, 1 = out, 2 = in */
+ int mode_tick;
+ Bool clear_p;
+
+ time_t last_time;
+ int draw_tick;
+
+} knot_configuration;
+
+static knot_configuration *bps = NULL;
+
+static char *do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static GLfloat thickness;
+static unsigned int segments;
+static int duration;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-segments", ".segments", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&segments, "segments", "Segments", DEF_SEGMENTS, t_Int},
+ {&duration, "duration", "Duration", DEF_DURATION, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt knot_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+make_knot (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat diam = (4 * thickness);
+ int faces = (wire ? 3 : 6);
+
+ unsigned int i;
+ double x, y, z, ox=0, oy=0, oz=0;
+ double mu;
+
+ double p[9];
+
+ Bool blobby_p = (0 == (random() % 5));
+ Bool type = (random() % 2);
+
+ for (i = 0; i < countof(p); i++)
+ {
+ p[i] = 1 + (random() % 4);
+ if (! (random() % 3))
+ p[i] += (random() % 5);
+ }
+
+ if (type == 1)
+ {
+ p[0] += 4;
+ p[1] *= ((p[0] + p[0]) / 10);
+ blobby_p = False;
+ }
+
+ mi->polygon_count = 0;
+
+ for (i = 0; i <= segments; i++)
+ {
+ if (type == 0)
+ {
+ mu = i * (M_PI * 2) / segments;
+ x = 10 * (cos(mu) + cos(p[0]*mu)) + cos(p[1]*mu) + cos(p[2]*mu);
+ y = 6 * sin(mu) + 10 * sin(p[3]*mu);
+ z = 16 * sin(p[4]*mu) * sin(p[5]*mu/2) + p[6]*sin(p[7]*mu) -
+ 2 * sin(p[8]*mu);
+ }
+ else if (type == 1)
+ {
+ mu = i * (M_PI * 2) * p[0] / (double) segments;
+ x = 10 * cos(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
+ y = 25 * sin(p[1] * mu / p[0]) / 2.0;
+ z = 10 * sin(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
+ }
+ else
+ abort();
+
+ if (i != 0)
+ {
+ GLfloat dist = sqrt ((x-ox)*(x-ox) +
+ (y-oy)*(y-oy) +
+ (z-oz)*(z-oz));
+ GLfloat di;
+ if (!blobby_p)
+ di = diam;
+ else
+ {
+ di = dist * (segments / 500.0);
+ di = (di * di * 3);
+ }
+
+ mi->polygon_count += tube (ox, oy, oz,
+ x, y, z,
+ di, dist/3,
+ faces, True, wire, wire);
+ }
+
+ ox = x;
+ oy = y;
+ oz = z;
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_knot (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+new_knot (ModeInfo *mi)
+{
+ knot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+
+ bp->clear_p = !!(random() % 15);
+
+ bp->ncolors = 128;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ for (i = 0; i < bp->ncolors; i++)
+ {
+ /* make colors twice as bright */
+ bp->colors[i].red = (bp->colors[i].red >> 2) + 0x7FFF;
+ bp->colors[i].green = (bp->colors[i].green >> 2) + 0x7FFF;
+ bp->colors[i].blue = (bp->colors[i].blue >> 2) + 0x7FFF;
+ }
+
+ glNewList (bp->knot_list, GL_COMPILE);
+ make_knot (mi);
+ glEndList ();
+}
+
+
+ENTRYPOINT Bool
+knot_handle_event (ModeInfo *mi, XEvent *event)
+{
+ knot_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ bp->last_time = 1;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+ENTRYPOINT void
+init_knot (ModeInfo *mi)
+{
+ knot_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (thickness <= 0) thickness = 0.001;
+ else if (thickness > 1) thickness = 1;
+
+ if (segments < 10) segments = 10;
+
+ reshape_knot (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 2.0;
+ double wander_speed = 0.05;
+ double spin_accel = 0.2;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ (spinx && spiny && spinz));
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->knot_list = glGenLists (1);
+ new_knot(mi);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+draw_knot (ModeInfo *mi)
+{
+ knot_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ if (bp->mode == 0)
+ {
+ if (bp->draw_tick++ > 10)
+ {
+ time_t now = time((time_t *) 0);
+ if (bp->last_time == 0) bp->last_time = now;
+ bp->draw_tick = 0;
+ if (!bp->button_down_p &&
+ now - bp->last_time >= duration)
+ {
+ bp->mode = 1; /* go out */
+ bp->mode_tick = 10 / speed;
+ bp->last_time = now;
+ }
+ }
+ }
+ else if (bp->mode == 1) /* out */
+ {
+ if (--bp->mode_tick <= 0)
+ {
+ new_knot (mi);
+ bp->mode_tick = 10 / speed;
+ bp->mode = 2; /* go in */
+ }
+ }
+ else if (bp->mode == 2) /* in */
+ {
+ if (--bp->mode_tick <= 0)
+ bp->mode = 0; /* normal */
+ }
+ else
+ abort();
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (bp->clear_p)
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ bcolor[0] = bp->colors[bp->ccolor].red / 65536.0;
+ bcolor[1] = bp->colors[bp->ccolor].green / 65536.0;
+ bcolor[2] = bp->colors[bp->ccolor].blue / 65536.0;
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+
+ glScalef(0.25, 0.25, 0.25);
+
+ if (bp->mode != 0)
+ {
+ GLfloat s = (bp->mode == 1
+ ? bp->mode_tick / (10 / speed)
+ : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
+ glScalef (s, s, s);
+ }
+
+ glCallList (bp->knot_list);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("GLKnots", glknots, knot)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glknots.man b/hacks/glx/glknots.man
new file mode 100644
index 0000000..c4f1d1a
--- /dev/null
+++ b/hacks/glx/glknots.man
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glknots - generates some twisting 3d knot patterns
+.SH SYNOPSIS
+.B glknots
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIfloat\fP]
+[\-segments \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-duration \fIseconds\fP]
+[\-no-wander]
+[\-spin \fIXYZ\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Generates some twisting 3d knot patterns. Spins 'em around.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-segments \fInumber\fP
+Number of segments in each path. Default 800. Larger numbers make the
+curves smoother, at the expense of a higher polygon count.
+.TP 8
+.B \-thickness \fIfloat\fP
+How thick the tubes should be. Default 0.3.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to leave each knot up. Default 8 seconds.
+.TP 8
+.B \-wander | \-no-wander
+Whether the cubes should wander around the screen.
+.TP 8
+.B \-spin [XYZ] | \-no-spin
+Which axes, if any, to spin around on.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/gllist.c b/hacks/glx/gllist.c
new file mode 100644
index 0000000..342e381
--- /dev/null
+++ b/hacks/glx/gllist.c
@@ -0,0 +1,127 @@
+/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "gllist.h"
+
+void
+renderList (const struct gllist *list, int wire_p)
+{
+ while (list)
+ {
+ if (!wire_p || list->primitive == GL_LINES ||
+ list->primitive == GL_POINTS)
+ {
+ glInterleavedArrays (list->format, 0, list->data);
+ glDrawArrays (list->primitive, 0, list->points);
+ }
+ else
+ {
+ /* For wireframe, do it the hard way: treat every tuple of
+ points as its own line loop.
+ */
+ const GLfloat *p = (GLfloat *) list->data;
+ int i, j, tick, skip, stride;
+
+ switch (list->primitive) {
+ case GL_QUADS: tick = 4; break;
+ case GL_TRIANGLES: tick = 3; break;
+ default: abort(); break; /* write me */
+ }
+
+ switch (list->format) {
+ case GL_C3F_V3F: case GL_N3F_V3F: skip = 3; stride = 6; break;
+ default: abort(); break; /* write me */
+ }
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0, j = skip;
+ i < list->points;
+ i++, j += stride)
+ {
+ if (i && !(i % tick))
+ {
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ }
+ glVertex3f (p[j], p[j+1], p[j+2]);
+ }
+ glEnd();
+ }
+ list = list->next;
+ }
+}
+
+
+void
+renderListNormals (const struct gllist *list, GLfloat length, int faces_p)
+{
+ while (list)
+ {
+ const GLfloat *p = (GLfloat *) list->data;
+ int i, j, tick, skip, stride;
+ GLfloat v[3], n[3];
+
+ if (list->primitive == GL_LINES) continue;
+
+ if (! faces_p)
+ tick = 1;
+ else
+ switch (list->primitive) {
+ case GL_QUADS: tick = 4; break;
+ case GL_TRIANGLES: tick = 3; break;
+ default: abort(); break; /* write me */
+ }
+
+ switch (list->format) {
+ case GL_N3F_V3F: skip = 0; stride = 6; break;
+ case GL_C3F_V3F: continue; break;
+ default: abort(); break; /* write me */
+ }
+
+ v[0] = v[1] = v[2] = 0;
+ n[0] = n[1] = n[2] = 0;
+
+ for (i = 0, j = skip;
+ i <= list->points;
+ i++, j += stride)
+ {
+ if (i && !(i % tick))
+ {
+ n[0] /= tick;
+ n[1] /= tick;
+ n[2] /= tick;
+ v[0] /= tick;
+ v[1] /= tick;
+ v[2] /= tick;
+ glPushMatrix();
+ glTranslatef (v[0], v[1], v[2]);
+ glScalef (length, length, length);
+ glBegin (GL_LINES);
+ glVertex3f (0, 0, 0);
+ glVertex3f (n[0], n[1], n[2]);
+ glEnd();
+ glPopMatrix();
+ v[0] = v[1] = v[2] = 0;
+ n[0] = n[1] = n[2] = 0;
+ }
+
+ if (i == list->points) break;
+ n[0] += p[j];
+ n[1] += p[j+1];
+ n[2] += p[j+2];
+ v[0] += p[j+3];
+ v[1] += p[j+4];
+ v[2] += p[j+5];
+
+ }
+ list = list->next;
+ }
+}
diff --git a/hacks/glx/gllist.h b/hacks/glx/gllist.h
new file mode 100644
index 0000000..1d6326a
--- /dev/null
+++ b/hacks/glx/gllist.h
@@ -0,0 +1,44 @@
+/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __GLLIST_H__
+#define __GLLIST_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
+#ifdef HAVE_COCOA
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real X11 */
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+struct gllist
+{
+ GLenum format;
+ GLenum primitive;
+ int points;
+ const void *data;
+ struct gllist *next;
+};
+
+void renderList (const struct gllist *, int wire_p);
+void renderListNormals (const struct gllist *, GLfloat length, int facesp);
+
+#endif /* __GLLIST_H__ */
diff --git a/hacks/glx/glmatrix.c b/hacks/glx/glmatrix.c
new file mode 100644
index 0000000..6a9b1fe
--- /dev/null
+++ b/hacks/glx/glmatrix.c
@@ -0,0 +1,1068 @@
+/* glmatrix, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * GLMatrix -- simulate the text scrolls from the movie "The Matrix".
+ *
+ * This program does a 3D rendering of the dropping characters that
+ * appeared in the title sequences of the movies. See also `xmatrix'
+ * for a simulation of what the computer monitors actually *in* the
+ * movie did.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_matrix 0
+# define release_matrix 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "ximage-loader.h"
+
+#include "images/gen/matrix3_png.h"
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPEED "1.0"
+#define DEF_DENSITY "20"
+#define DEF_CLOCK "False"
+#define DEF_FOG "True"
+#define DEF_WAVES "True"
+#define DEF_ROTATE "True"
+#define DEF_TEXTURE "True"
+#define DEF_MODE "Matrix"
+#define DEF_TIMEFMT " %l%M%p "
+
+
+#define CHAR_COLS 16
+#define CHAR_ROWS 13
+
+static const int matrix_encoding[] = {
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+# if 0
+ 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207
+# else
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175
+# endif
+ };
+static const int decimal_encoding[] = {
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
+static const int hex_encoding[] = {
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 33, 34, 35, 36, 37, 38 };
+static const int binary_encoding[] = { 16, 17 };
+static const int dna_encoding[] = { 33, 35, 39, 52 };
+
+static const unsigned char char_map[256] = {
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 0 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 16 */
+ 0, 1, 2, 96, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 32 */
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 48 */
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 64 */
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 80 */
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 96 */
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 112 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 128 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 144 */
+ 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 160 */
+ 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 176 */
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 192 */
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 208 */
+#if 0
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, /* 224 */
+ 176,177,178,195,180,181,182,183,184,185,186,187,188,189,190,191 /* 240 */
+#else /* see spank_image() */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 224 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 240 */
+#endif
+};
+
+#define CURSOR_GLYPH 97
+
+/* #define DEBUG */
+
+#define GRID_SIZE 70 /* width and height of the arena */
+#define GRID_DEPTH 35 /* depth of the arena */
+#define WAVE_SIZE 22 /* periodicity of color (brightness) waves */
+#define SPLASH_RATIO 0.7 /* ratio of GRID_DEPTH where chars hit the screen */
+
+static const struct { GLfloat x, y; } nice_views[] = {
+ { 0, 0 },
+ { 0, -20 }, /* this is a list of viewer rotations that look nice. */
+ { 0, 20 }, /* every now and then we switch to a new one. */
+ { 25, 0 }, /* (but we only use the first one at start-up.) */
+ {-25, 0 },
+ { 25, 20 },
+ {-25, 20 },
+ { 25, -20 },
+ {-25, -20 },
+
+ { 10, 0 },
+ {-10, 0 },
+ { 0, 0 }, /* prefer these */
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+};
+
+
+typedef struct {
+ GLfloat x, y, z; /* position of strip */
+ GLfloat dx, dy, dz; /* velocity of strip */
+
+ Bool erasing_p; /* Whether this strip is on its way out. */
+
+ int spinner_glyph; /* the bottommost glyph -- the feeder */
+ GLfloat spinner_y; /* where on the strip the bottom glyph is */
+ GLfloat spinner_speed; /* how fast the bottom glyph drops */
+
+ int glyphs[GRID_SIZE]; /* the other glyphs on the strip, which will be
+ revealed by the dropping spinner.
+ 0 means no glyph; negative means "spinner".
+ If non-zero, real value is abs(G)-1. */
+
+ Bool highlight[GRID_SIZE];
+ /* some glyphs may be highlighted */
+
+ int spin_speed; /* Rotate all spinners every this-many frames */
+ int spin_tick; /* frame counter */
+
+ int wave_position; /* Waves of brightness wash down the strip. */
+ int wave_speed; /* every this-many frames. */
+ int wave_tick; /* frame counter. */
+
+} strip;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ Bool button_down_p;
+ GLuint texture;
+ int nstrips;
+ strip *strips;
+ const int *glyph_map;
+ int nglyphs;
+ GLfloat tex_char_width, tex_char_height;
+
+ /* auto-tracking direction of view */
+ int last_view, target_view;
+ GLfloat view_x, view_y;
+ int view_steps, view_tick;
+ Bool auto_tracking_p;
+ int track_tick;
+
+ int real_char_rows;
+ GLfloat brightness_ramp[WAVE_SIZE];
+
+} matrix_configuration;
+
+static matrix_configuration *mps = NULL;
+
+static GLfloat speed;
+static GLfloat density;
+static Bool do_clock;
+static char *timefmt;
+static Bool do_fog;
+static Bool do_waves;
+static Bool do_rotate;
+static Bool do_texture;
+static char *mode_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-binary", ".mode", XrmoptionNoArg, "binary" },
+ { "-hexadecimal", ".mode", XrmoptionNoArg, "hexadecimal" },
+ { "-decimal", ".mode", XrmoptionNoArg, "decimal" },
+ { "-dna", ".mode", XrmoptionNoArg, "dna" },
+ { "-clock", ".clock", XrmoptionNoArg, "True" },
+ { "+clock", ".clock", XrmoptionNoArg, "False" },
+ { "-timefmt", ".timefmt", XrmoptionSepArg, 0 },
+ { "-fog", ".fog", XrmoptionNoArg, "True" },
+ { "+fog", ".fog", XrmoptionNoArg, "False" },
+ { "-waves", ".waves", XrmoptionNoArg, "True" },
+ { "+waves", ".waves", XrmoptionNoArg, "False" },
+ { "-rotate", ".rotate", XrmoptionNoArg, "True" },
+ { "+rotate", ".rotate", XrmoptionNoArg, "False" },
+ {"-texture", ".texture", XrmoptionNoArg, "True" },
+ {"+texture", ".texture", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&mode_str, "mode", "Mode", DEF_MODE, t_String},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&density, "density", "Density", DEF_DENSITY, t_Float},
+ {&do_clock, "clock", "Clock", DEF_CLOCK, t_Bool},
+ {&timefmt, "timefmt", "Timefmt", DEF_TIMEFMT, t_String},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&do_waves, "waves", "Waves", DEF_WAVES, t_Bool},
+ {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt matrix_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Re-randomize the state of one strip.
+ */
+static void
+reset_strip (ModeInfo *mi, strip *s)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int i;
+ Bool time_displayed_p = False; /* never display time twice in one strip */
+
+ memset (s, 0, sizeof(*s));
+ s->x = (GLfloat) (frand(GRID_SIZE) - (GRID_SIZE/2));
+ s->y = (GLfloat) (GRID_SIZE/2 + BELLRAND(0.5)); /* shift top slightly */
+ s->z = (GLfloat) (GRID_DEPTH * 0.2) - frand (GRID_DEPTH * 0.7);
+ s->spinner_y = 0;
+
+ s->dx = 0;
+/* s->dx = ((BELLRAND(0.01) - 0.005) * speed); */
+ s->dy = 0;
+ s->dz = (BELLRAND(0.02) * speed);
+
+ s->spinner_speed = (BELLRAND(0.3) * speed);
+
+ s->spin_speed = (int) BELLRAND(2.0 / speed) + 1;
+ s->spin_tick = 0;
+
+ s->wave_position = 0;
+ s->wave_speed = (int) BELLRAND(3.0 / speed) + 1;
+ s->wave_tick = 0;
+
+ for (i = 0; i < GRID_SIZE; i++)
+ if (do_clock &&
+ !time_displayed_p &&
+ (i < GRID_SIZE-5) && /* display approx. once per 5 strips */
+ !(random() % (GRID_SIZE-5)*5))
+ {
+ int j;
+ char text[80];
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ strftime (text, sizeof(text)-1, timefmt, tm);
+
+ /* render time into the strip */
+ for (j = 0; j < strlen(text) && i < GRID_SIZE; j++, i++)
+ {
+ s->glyphs[i] = char_map [((unsigned char *) text)[j]] + 1;
+ s->highlight[i] = True;
+ }
+
+ time_displayed_p = True;
+ }
+ else
+ {
+ int draw_p = (random() % 7);
+ int spin_p = (draw_p && !(random() % 20));
+ int g = (draw_p
+ ? mp->glyph_map[(random() % mp->nglyphs)] + 1
+ : 0);
+ if (spin_p) g = -g;
+ s->glyphs[i] = g;
+ s->highlight[i] = False;
+ }
+
+ s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
+}
+
+
+/* Animate the strip one step. Reset if it has reached the bottom.
+ */
+static void
+tick_strip (ModeInfo *mi, strip *s)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int i;
+
+ if (mp->button_down_p)
+ return;
+
+ s->x += s->dx;
+ s->y += s->dy;
+ s->z += s->dz;
+
+ if (s->z > GRID_DEPTH * SPLASH_RATIO) /* splashed into screen */
+ {
+ reset_strip (mi, s);
+ return;
+ }
+
+ s->spinner_y += s->spinner_speed;
+ if (s->spinner_y >= GRID_SIZE)
+ {
+ if (s->erasing_p)
+ {
+ reset_strip (mi, s);
+ return;
+ }
+ else
+ {
+ s->erasing_p = True;
+ s->spinner_y = 0;
+ s->spinner_speed /= 2; /* erase it slower than we drew it */
+ }
+ }
+
+ /* Spin the spinners. */
+ s->spin_tick++;
+ if (s->spin_tick > s->spin_speed)
+ {
+ s->spin_tick = 0;
+ s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
+ for (i = 0; i < GRID_SIZE; i++)
+ if (s->glyphs[i] < 0)
+ {
+ s->glyphs[i] = -(mp->glyph_map[(random() % mp->nglyphs)] + 1);
+ if (! (random() % 800)) /* sometimes they stop spinning */
+ s->glyphs[i] = -s->glyphs[i];
+ }
+ }
+
+ /* Move the color (brightness) wave. */
+ s->wave_tick++;
+ if (s->wave_tick > s->wave_speed)
+ {
+ s->wave_tick = 0;
+ s->wave_position++;
+ if (s->wave_position >= WAVE_SIZE)
+ s->wave_position = 0;
+ }
+}
+
+
+/* Draw a single character at the given position and brightness.
+ */
+static void
+draw_glyph (ModeInfo *mi, int glyph, Bool highlight,
+ GLfloat x, GLfloat y, GLfloat z,
+ GLfloat brightness)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat w = mp->tex_char_width;
+ GLfloat h = mp->tex_char_height;
+ GLfloat cx = 0, cy = 0;
+ GLfloat S = 1;
+ Bool spinner_p = (glyph < 0);
+
+ if (glyph == 0) abort();
+ if (glyph < 0) glyph = -glyph;
+
+ if (spinner_p)
+ brightness *= 1.5;
+
+ if (!do_texture)
+ {
+ S = 0.8;
+ x += 0.1;
+ y += 0.1;
+ }
+ else
+ {
+ int ccx = ((glyph - 1) % CHAR_COLS);
+ int ccy = ((glyph - 1) / CHAR_COLS);
+
+ cx = ccx * w;
+ cy = (mp->real_char_rows - ccy - 1) * h;
+
+ if (do_fog)
+ {
+ GLfloat depth;
+ depth = (z / GRID_DEPTH) + 0.5; /* z ratio from back/front */
+ depth = 0.2 + (depth * 0.8); /* scale to range [0.2 - 1.0] */
+ brightness *= depth; /* so no row goes all black. */
+ }
+ }
+
+ {
+ GLfloat r, g, b, a;
+
+ if (highlight)
+ brightness *= 2;
+
+ if (!do_texture && !spinner_p)
+ r = b = 0, g = 1;
+ else
+ r = g = b = 1;
+
+ a = brightness;
+
+ /* If the glyph is very close to the screen (meaning it is very large,
+ and is about to splash into the screen and vanish) then start fading
+ it out, proportional to how close to the glass it is.
+ */
+ if (z > GRID_DEPTH/2)
+ {
+ GLfloat ratio = ((z - GRID_DEPTH/2) /
+ ((GRID_DEPTH * SPLASH_RATIO) - GRID_DEPTH/2));
+ int i = ratio * WAVE_SIZE;
+
+ if (i < 0) i = 0;
+ else if (i >= WAVE_SIZE) i = WAVE_SIZE-1;
+
+ a *= mp->brightness_ramp[i];
+ }
+
+ glColor4f (r,g,b,a);
+ }
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f (0, 0, 1);
+ glTexCoord2f (cx, cy); glVertex3f (x, y, z);
+ glTexCoord2f (cx+w, cy); glVertex3f (x+S, y, z);
+ glTexCoord2f (cx+w, cy+h); glVertex3f (x+S, y+S, z);
+ glTexCoord2f (cx, cy+h); glVertex3f (x, y+S, z);
+ glEnd ();
+
+ if (wire && spinner_p)
+ {
+ glBegin (GL_LINES);
+ glVertex3f (x, y, z);
+ glVertex3f (x+S, y+S, z);
+ glVertex3f (x, y+S, z);
+ glVertex3f (x+S, y, z);
+ glEnd();
+ }
+
+ mi->polygon_count++;
+}
+
+
+/* Draw all the visible glyphs in the strip.
+ */
+static void
+draw_strip (ModeInfo *mi, strip *s)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < GRID_SIZE; i++)
+ {
+ int g = s->glyphs[i];
+ Bool below_p = (s->spinner_y >= i);
+
+ if (s->erasing_p)
+ below_p = !below_p;
+
+ if (g && below_p) /* don't draw cells below the spinner */
+ {
+ GLfloat brightness;
+ if (!do_waves)
+ brightness = 1.0;
+ else
+ {
+ int j = WAVE_SIZE - ((i + (GRID_SIZE - s->wave_position))
+ % WAVE_SIZE);
+ brightness = mp->brightness_ramp[j];
+ }
+
+ draw_glyph (mi, g, s->highlight[i],
+ s->x, s->y - i, s->z, brightness);
+ }
+ }
+
+ if (!s->erasing_p)
+ draw_glyph (mi, s->spinner_glyph, False,
+ s->x, s->y - s->spinner_y, s->z, 1.0);
+}
+
+
+/* qsort comparator for sorting strips by z position */
+static int
+cmp_strips (const void *aa, const void *bb)
+{
+ const strip *a = *(strip **) aa;
+ const strip *b = *(strip **) bb;
+ return ((int) (a->z * 10000) -
+ (int) (b->z * 10000));
+}
+
+
+/* Auto-tracking
+ */
+
+static void
+auto_track_init (ModeInfo *mi)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ mp->last_view = 0;
+ mp->target_view = 0;
+ mp->view_x = nice_views[mp->last_view].x;
+ mp->view_y = nice_views[mp->last_view].y;
+ mp->view_steps = 100;
+ mp->view_tick = 0;
+ mp->auto_tracking_p = False;
+}
+
+
+static void
+auto_track (ModeInfo *mi)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+
+ if (! do_rotate)
+ return;
+ if (mp->button_down_p)
+ return;
+
+ /* if we're not moving, maybe start moving. Otherwise, do nothing. */
+ if (! mp->auto_tracking_p)
+ {
+ if (++mp->track_tick < 20/speed) return;
+ mp->track_tick = 0;
+ if (! (random() % 20))
+ mp->auto_tracking_p = True;
+ else
+ return;
+ }
+
+
+ {
+ GLfloat ox = nice_views[mp->last_view].x;
+ GLfloat oy = nice_views[mp->last_view].y;
+ GLfloat tx = nice_views[mp->target_view].x;
+ GLfloat ty = nice_views[mp->target_view].y;
+
+ /* move from A to B with sinusoidal deltas, so that it doesn't jerk
+ to a stop. */
+ GLfloat th = sin ((M_PI / 2) * (double) mp->view_tick / mp->view_steps);
+
+ mp->view_x = (ox + ((tx - ox) * th));
+ mp->view_y = (oy + ((ty - oy) * th));
+ mp->view_tick++;
+
+ if (mp->view_tick >= mp->view_steps)
+ {
+ mp->view_tick = 0;
+ mp->view_steps = (350.0 / speed);
+ mp->last_view = mp->target_view;
+ mp->target_view = (random() % (countof(nice_views) - 1)) + 1;
+ mp->auto_tracking_p = False;
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_matrix (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (80.0, 1/h, 1.0, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 25.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+matrix_handle_event (ModeInfo *mi, XEvent *event)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ mp->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ mp->button_down_p = False;
+ return True;
+ }
+
+ return False;
+}
+
+
+#if 0
+static Bool
+bigendian (void)
+{
+ union { int i; char c[sizeof(int)]; } u;
+ u.i = 1;
+ return !u.c[0];
+}
+#endif
+
+
+/* The image with the characters in it is 512x598, meaning that it needs to
+ be copied into a 512x1024 texture. But some machines can't handle textures
+ that large... And it turns out that we aren't using most of the characters
+ in that image anyway, since this program doesn't do anything that makes use
+ of the full range of Latin1 characters. So... this function tosses out the
+ last 32 of the Latin1 characters, resulting in a 512x506 image, which we
+ can then stuff in a 512x512 texture. Voila.
+
+ If this hack ever grows into something that displays full Latin1 text,
+ well then, Something Else Will Need To Be Done.
+
+ Since currently GLMatrix does not run textclient / xscreensaver-text,
+ it's not an issue. (XMatrix does that.)
+
+ */
+static void
+spank_image (matrix_configuration *mp, XImage *xi)
+{
+ int ch = xi->height / CHAR_ROWS;
+ int cut = 2;
+ unsigned char *bits = (unsigned char *) xi->data;
+ unsigned char *from, *to, *s, *end;
+ int L = xi->bytes_per_line * ch;
+/* int i;*/
+
+ /* Copy row 12 into 10 (which really means, copy 2 into 0,
+ since texture data is upside down.).
+ */
+ to = bits + (L * cut);
+ from = bits;
+ end = from + L;
+ s = from;
+ while (s < end)
+ *to++ = *s++;
+
+ /* Then, pull all the bits down by 2 rows.
+ */
+ to = bits;
+ from = bits + (L * cut);
+ end = bits + (L * CHAR_ROWS);
+ s = from;
+ while (s < end)
+ *to++ = *s++;
+
+ /* And clear out the rest, for good measure.
+ */
+ from = bits + (L * (CHAR_ROWS - cut));
+ end = bits + (L * CHAR_ROWS);
+ s = from;
+ while (s < end)
+ *s++ = 0;
+
+ xi->height -= (cut * ch);
+ mp->real_char_rows -= cut;
+
+# if 0
+ /* Finally, pull the map indexes back to match the new bits.
+ */
+ for (i = 0; i < countof(matrix_encoding); i++)
+ if (matrix_encoding[i] > (CHAR_COLS * (CHAR_ROWS - cut)))
+ matrix_encoding[i] -= (cut * CHAR_COLS);
+# endif
+}
+
+
+static void
+load_textures (ModeInfo *mi, Bool flip_p)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ XImage *xi;
+ int x, y;
+ int cw, ch;
+ int orig_w, orig_h;
+
+ /* The Matrix image is 512x598 -- but GL texture sizes must be powers of 2.
+ So we waste some padding rows to round up.
+ */
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ matrix3_png, sizeof(matrix3_png));
+ orig_w = xi->width;
+ orig_h = xi->height;
+ mp->real_char_rows = CHAR_ROWS;
+ spank_image (mp, xi);
+
+ if (xi->height != 512 && xi->height != 1024)
+ {
+ xi->height = (xi->height < 512 ? 512 : 1024);
+ xi->data = realloc (xi->data, xi->height * xi->bytes_per_line);
+ if (!xi->data)
+ {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ }
+
+ if (xi->width != 512) abort();
+ if (xi->height != 512 && xi->height != 1024) abort();
+
+ /* char size in pixels */
+ cw = orig_w / CHAR_COLS;
+ ch = orig_h / CHAR_ROWS;
+
+ /* char size in ratio of final (padded) texture size */
+ mp->tex_char_width = (GLfloat) cw / xi->width;
+ mp->tex_char_height = (GLfloat) ch / xi->height;
+
+ /* Flip each character's bits horizontally -- we could also just do this
+ by reversing the texture coordinates on the quads, but on some systems
+ that slows things down a lot.
+ */
+ if (flip_p)
+ {
+ int xx, col;
+ unsigned long buf[100];
+ for (y = 0; y < xi->height; y++)
+ for (col = 0, xx = 0; col < CHAR_COLS; col++, xx += cw)
+ {
+ for (x = 0; x < cw; x++)
+ buf[x] = XGetPixel (xi, xx+x, y);
+ for (x = 0; x < cw; x++)
+ XPutPixel (xi, xx+x, y, buf[cw-x-1]);
+ }
+ }
+
+ /* The pixmap is a color image with no transparency. Set the texture's
+ alpha to be the green channel, and set the green channel to be 100%.
+ */
+ {
+ int rpos, gpos, bpos, apos; /* bitfield positions */
+#if 0
+ /* #### Cherub says that the little-endian case must be taken on MacOSX,
+ or else the colors/alpha are the wrong way around. How can
+ that be the case?
+ */
+ if (bigendian())
+ rpos = 24, gpos = 16, bpos = 8, apos = 0;
+ else
+#endif
+ rpos = 0, gpos = 8, bpos = 16, apos = 24;
+
+ for (y = 0; y < xi->height; y++)
+ for (x = 0; x < xi->width; x++)
+ {
+ unsigned long p = XGetPixel (xi, x, y);
+ unsigned char r = (p >> rpos) & 0xFF;
+ unsigned char g = (p >> gpos) & 0xFF;
+ unsigned char b = (p >> bpos) & 0xFF;
+ unsigned char a = g;
+ g = 0xFF;
+ p = (r << rpos) | (g << gpos) | (b << bpos) | (a << apos);
+ XPutPixel (xi, x, y, p);
+ }
+ }
+
+ /* Now load the texture into GL.
+ */
+ clear_gl_error();
+ glGenTextures (1, &mp->texture);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ /* messes up -fps */
+ /* glPixelStorei (GL_UNPACK_ROW_LENGTH, xi->width);*/
+ glBindTexture (GL_TEXTURE_2D, mp->texture);
+ check_gl_error ("texture init");
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, xi->width, xi->height, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, xi->data);
+ {
+ char buf[255];
+ sprintf (buf, "creating %dx%d texture:", xi->width, xi->height);
+ check_gl_error (buf);
+ }
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ /* I'd expect CLAMP to be the thing to do here, but oddly, we get a
+ faint solid green border around the texture if it is *not* REPEAT!
+ */
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ check_gl_error ("texture param");
+
+ XDestroyImage (xi);
+}
+
+
+ENTRYPOINT void
+init_matrix (ModeInfo *mi)
+{
+ matrix_configuration *mp;
+ int wire = MI_IS_WIREFRAME(mi);
+ Bool flip_p = 0;
+ int i;
+
+ if (wire)
+ do_texture = False;
+
+ MI_INIT (mi, mps);
+
+ mp = &mps[MI_SCREEN(mi)];
+ mp->glx_context = init_GL(mi);
+
+ if (!mode_str || !*mode_str || !strcasecmp(mode_str, "matrix"))
+ {
+ flip_p = 1;
+ mp->glyph_map = matrix_encoding;
+ mp->nglyphs = countof(matrix_encoding);
+ }
+ else if (!strcasecmp (mode_str, "dna"))
+ {
+ flip_p = 0;
+ mp->glyph_map = dna_encoding;
+ mp->nglyphs = countof(dna_encoding);
+ }
+ else if (!strcasecmp (mode_str, "bin") ||
+ !strcasecmp (mode_str, "binary"))
+ {
+ flip_p = 0;
+ mp->glyph_map = binary_encoding;
+ mp->nglyphs = countof(binary_encoding);
+ }
+ else if (!strcasecmp (mode_str, "hex") ||
+ !strcasecmp (mode_str, "hexadecimal"))
+ {
+ flip_p = 0;
+ mp->glyph_map = hex_encoding;
+ mp->nglyphs = countof(hex_encoding);
+ }
+ else if (!strcasecmp (mode_str, "dec") ||
+ !strcasecmp (mode_str, "decimal"))
+ {
+ flip_p = 0;
+ mp->glyph_map = decimal_encoding;
+ mp->nglyphs = countof(decimal_encoding);
+ }
+ else
+ {
+ fprintf (stderr,
+ "%s: `mode' must be matrix, dna, binary, or hex: not `%s'\n",
+ progname, mode_str);
+ exit (1);
+ }
+
+ reshape_matrix (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+
+ if (do_texture)
+ load_textures (mi, flip_p);
+
+ /* to scale coverage-percent to strips, this number looks about right... */
+ mp->nstrips = (int) (density * 2.2);
+ if (mp->nstrips < 1) mp->nstrips = 1;
+ else if (mp->nstrips > 2000) mp->nstrips = 2000;
+
+
+ mp->strips = calloc (mp->nstrips, sizeof(strip));
+ for (i = 0; i < mp->nstrips; i++)
+ {
+ strip *s = &mp->strips[i];
+ reset_strip (mi, s);
+
+ /* If we start all strips from zero at once, then the first few seconds
+ of the animation are much denser than normal. So instead, set all
+ the initial strips to erase-mode with random starting positions.
+ As these die off at random speeds and are re-created, we'll get a
+ more consistent density. */
+ s->erasing_p = True;
+ s->spinner_y = frand(GRID_SIZE);
+ memset (s->glyphs, 0, sizeof(s->glyphs)); /* no visible glyphs */
+ }
+
+ /* Compute the brightness ramp.
+ */
+ for (i = 0; i < WAVE_SIZE; i++)
+ {
+ GLfloat j = ((WAVE_SIZE - i) / (GLfloat) (WAVE_SIZE - 1));
+ j *= (M_PI / 2); /* j ranges from 0.0 - PI/2 */
+ j = sin (j); /* j ranges from 0.0 - 1.0 */
+ j = 0.2 + (j * 0.8); /* j ranges from 0.2 - 1.0 */
+ mp->brightness_ramp[i] = j;
+ /* printf("%2d %8.2f\n", i, j); */
+ }
+
+
+ auto_track_init (mi);
+}
+
+
+#ifdef DEBUG
+
+static void
+draw_grid (ModeInfo *mi)
+{
+ if (!MI_IS_WIREFRAME(mi))
+ {
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ }
+ glPushMatrix();
+
+ glColor3f(1, 1, 1);
+ glBegin(GL_LINES);
+ glVertex3f(-GRID_SIZE, 0, 0); glVertex3f(GRID_SIZE, 0, 0);
+ glVertex3f(0, -GRID_SIZE, 0); glVertex3f(0, GRID_SIZE, 0);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glEnd();
+ glPopMatrix();
+ if (!MI_IS_WIREFRAME(mi))
+ {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ }
+}
+#endif /* DEBUG */
+
+
+ENTRYPOINT void
+draw_matrix (ModeInfo *mi)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ if (do_texture)
+ {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ /* Jeff Epler points out:
+ By using GL_ONE instead of GL_SRC_ONE_MINUS_ALPHA, glyphs are
+ added to each other, so that a bright glyph with a darker one
+ in front is a little brighter than the bright glyph alone.
+ */
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ }
+
+ if (do_rotate)
+ {
+ glRotatef (mp->view_x, 1, 0, 0);
+ glRotatef (mp->view_y, 0, 1, 0);
+ }
+
+#ifdef DEBUG
+# if 0
+ glScalef(0.5, 0.5, 0.5);
+# endif
+# if 0
+ glRotatef(-30, 0, 1, 0);
+# endif
+ draw_grid (mi);
+#endif
+
+ mi->polygon_count = 0;
+
+ /* Render (and tick) each strip, starting at the back
+ (draw the ones farthest from the camera first, to make
+ the alpha transparency work out right.)
+ */
+ {
+ strip **sorted = malloc (mp->nstrips * sizeof(*sorted));
+ for (i = 0; i < mp->nstrips; i++)
+ sorted[i] = &mp->strips[i];
+ qsort (sorted, i, sizeof(*sorted), cmp_strips);
+
+ for (i = 0; i < mp->nstrips; i++)
+ {
+ strip *s = sorted[i];
+ tick_strip (mi, s);
+ draw_strip (mi, s);
+ }
+ free (sorted);
+ }
+
+ auto_track (mi);
+
+#if 0
+ glBegin(GL_QUADS);
+ glColor3f(1,1,1);
+ glTexCoord2f (0,0); glVertex3f(-15,-15,0);
+ glTexCoord2f (0,1); glVertex3f(-15,15,0);
+ glTexCoord2f (1,1); glVertex3f(15,15,0);
+ glTexCoord2f (1,0); glVertex3f(15,-15,0);
+ glEnd();
+#endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("GLMatrix", glmatrix, matrix)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glmatrix.man b/hacks/glx/glmatrix.man
new file mode 100644
index 0000000..9290290
--- /dev/null
+++ b/hacks/glx/glmatrix.man
@@ -0,0 +1,116 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+glmatrix - simulates the title sequence effect of the movie
+.SH SYNOPSIS
+.B glmatrix
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIratio\fP]
+[\-density \fIpct\fP]
+[\-no\-fog]
+[\-no\-waves]
+[\-no\-rotate]
+[\-binary]
+[\-hexadecimal]
+[\-dna]
+[\-clock]
+[\-timefmt \fIfmt\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIglmatrix\fP program draws the 3D "digital rain" effect, as seen
+in the title sequence of the Wachowski brothers' film, "The Matrix".
+
+Also see
+.BR xmatrix (MANSUFFIX)
+for a 2D rendering of the similar effect that appeared on the
+computer monitors actually \fIin\fP the movie.
+.SH OPTIONS
+.I glmatrix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds: default 30000.
+.TP 8
+.B \-speed \fIratio\fP
+How fast the glyphs should move; default 1.0. 2.0 means twice as fast,
+0.5 means half as fast.
+.TP 8
+.B \-density \fIpercentage\fP
+The approximate percentage of the screen that should be filled with
+characters at any given time. Default 20%.
+.TP 8
+.B \-no\-fog
+By default, glyphs are dimmer the farther away they are. This
+argument disables that.
+.TP 8
+.B \-no\-waves
+By default, waves of color roll down the columns of glyphs. This
+argument disables that.
+.TP 8
+.B \-no-rotate\fP
+By default, the scene slowly tilts and rotates. This
+argument disables that.
+.TP 8
+.B \-binary\fP
+Instead of displaying Matrix glyphs, only display ones and zeros.
+.TP 8
+.B \-hexadecimal\fP
+Instead of displaying Matrix glyphs, display hexadecimal digits.
+.TP 8
+.B \-dna\fP
+Instead of displaying Matrix glyphs, display genetic code
+(guanine, adenine, thymine, and cytosine.)
+.TP 8
+.B \-clock\fP
+Hide a clock displaying the current time somewhere in the glyphs.
+.TP 8
+.B \-timefmt\fP \fIstrftime-string\fP
+How to format the clock when \fI\-clock\fP is specified.
+Default "\ %l%M%p\ ".
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-wireframe
+Just draw boxes instead of textured characters.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xmatrix (MANSUFFIX),
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999-2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 8-Jun-2003.
diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c
new file mode 100644
index 0000000..f26a4ad
--- /dev/null
+++ b/hacks/glx/glplanet.c
@@ -0,0 +1,847 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* glplanet --- 3D rotating planet, e.g., Earth.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ *
+ * 10-Nov-14: jwz@jwz.org Night map. Better stars.
+ * 16-Jan-02: jwz@jwz.org gdk_pixbuf support.
+ * 21-Mar-01: jwz@jwz.org Broke sphere routine out into its own file.
+ *
+ * 9-Oct-98: dek@cgl.ucsf.edu Added stars.
+ *
+ * 8-Oct-98: jwz@jwz.org Made the 512x512x1 xearth image be built in.
+ * Made it possible to load XPM or XBM files.
+ * Made the planet bounce and roll around.
+ *
+ * 8-Oct-98: Released initial version of "glplanet"
+ * (David Konerding, dek@cgl.ucsf.edu)
+ */
+
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*imageForeground: Green \n" \
+ "*imageBackground: Blue \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_planet 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#include "sphere.h"
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#define DEF_ROTATE "True"
+#define DEF_ROLL "True"
+#define DEF_WANDER "True"
+#define DEF_SPIN "1.0"
+#define DEF_TEXTURE "True"
+#define DEF_STARS "True"
+#define DEF_RESOLUTION "128"
+#define DEF_IMAGE "BUILTIN"
+#define DEF_IMAGE2 "BUILTIN"
+
+#define BLENDED_TERMINATOR
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+static int do_rotate;
+static int do_roll;
+static int do_wander;
+static int do_texture;
+static int do_stars;
+static char *which_image;
+static char *which_image2;
+static int resolution;
+static GLfloat spin_arg;
+
+static XrmOptionDescRec opts[] = {
+ {"-rotate", ".rotate", XrmoptionNoArg, "true" },
+ {"+rotate", ".rotate", XrmoptionNoArg, "false" },
+ {"-roll", ".roll", XrmoptionNoArg, "true" },
+ {"+roll", ".roll", XrmoptionNoArg, "false" },
+ {"-wander", ".wander", XrmoptionNoArg, "true" },
+ {"+wander", ".wander", XrmoptionNoArg, "false" },
+ {"-texture", ".texture", XrmoptionNoArg, "true" },
+ {"+texture", ".texture", XrmoptionNoArg, "false" },
+ {"-stars", ".stars", XrmoptionNoArg, "true" },
+ {"+stars", ".stars", XrmoptionNoArg, "false" },
+ {"-spin", ".spin", XrmoptionSepArg, 0 },
+ {"-image", ".image", XrmoptionSepArg, 0 },
+ {"-image2", ".image2", XrmoptionSepArg, 0 },
+ {"-resolution", ".resolution", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&do_roll, "roll", "Roll", DEF_ROLL, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_stars, "stars", "Stars", DEF_STARS, t_Bool},
+ {&spin_arg, "spin", "Spin", DEF_SPIN, t_Float},
+ {&which_image, "image", "Image", DEF_IMAGE, t_String},
+ {&which_image2,"image2", "Image", DEF_IMAGE2, t_String},
+ {&resolution, "resolution","Resolution", DEF_RESOLUTION, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct planet_description =
+{"planet", "init_planet", "draw_planet", NULL,
+ "draw_planet", "init_planet", "free_planet", &planet_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Animates texture mapped sphere (planet)", 0, NULL};
+#endif
+
+#include "images/gen/earth_png.h"
+#include "images/gen/earth_night_png.h"
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+
+/*-
+ * slices and stacks are used in the sphere parameterization routine.
+ * more slices and stacks will increase the quality of the sphere,
+ * at the expense of rendering speed
+ */
+
+/* structure for holding the planet data */
+typedef struct {
+ GLuint platelist;
+ GLuint shadowlist;
+ GLuint latlonglist;
+ GLuint starlist;
+ int starcount;
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ GLfloat z;
+ GLfloat tilt;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLuint tex1, tex2;
+ int draw_axis;
+
+} planetstruct;
+
+
+static planetstruct *planets = NULL;
+
+
+/* Set up and enable texturing on our object */
+static void
+setup_xpm_texture (ModeInfo *mi, const unsigned char *data, unsigned long size)
+{
+ XImage *image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ data, size);
+ char buf[1024];
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* iOS invalid enum:
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+ */
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
+ check_gl_error(buf);
+}
+
+
+static Bool
+setup_file_texture (ModeInfo *mi, char *filename)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+
+ XImage *image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+ return True;
+}
+
+
+static void
+setup_texture (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ glGenTextures (1, &gp->tex1);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ if (!which_image ||
+ !*which_image ||
+ !strcmp(which_image, "BUILTIN"))
+ {
+ BUILTIN1:
+ setup_xpm_texture (mi, earth_png, sizeof(earth_png));
+ }
+ else
+ {
+ if (! setup_file_texture (mi, which_image))
+ goto BUILTIN1;
+ }
+
+ check_gl_error("texture 1 initialization");
+
+ glGenTextures (1, &gp->tex2);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ if (!which_image2 ||
+ !*which_image2 ||
+ !strcmp(which_image2, "BUILTIN"))
+ {
+ BUILTIN2:
+ setup_xpm_texture (mi, earth_night_png, sizeof(earth_night_png));
+ }
+ else
+ {
+ if (! setup_file_texture (mi, which_image2))
+ goto BUILTIN2;
+ }
+
+ check_gl_error("texture 2 initialization");
+
+ /* Need to flip the texture top for bottom for some reason. */
+ glMatrixMode (GL_TEXTURE);
+ glScalef (1, -1, 1);
+ glMatrixMode (GL_MODELVIEW);
+}
+
+
+static void
+init_stars (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i, j;
+ int width = MI_WIDTH(mi);
+ int height = MI_HEIGHT(mi);
+ int size = (width > height ? width : height);
+ int nstars = size * size / 80;
+ int max_size = 3;
+ GLfloat inc = 0.5;
+ int steps = max_size / inc;
+ GLfloat scale = 1;
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ scale *= 2;
+ nstars /= 2;
+ }
+
+ gp->starlist = glGenLists(1);
+ glNewList(gp->starlist, GL_COMPILE);
+ for (j = 1; j <= steps; j++)
+ {
+ glPointSize(inc * j * scale);
+ glBegin (GL_POINTS);
+ for (i = 0; i < nstars / steps; i++)
+ {
+ GLfloat d = 0.1;
+ GLfloat r = 0.15 + frand(0.3);
+ GLfloat g = r + frand(d) - d;
+ GLfloat b = r + frand(d) - d;
+
+ GLfloat x = frand(1)-0.5;
+ GLfloat y = frand(1)-0.5;
+ GLfloat z = ((random() & 1)
+ ? frand(1)-0.5
+ : (BELLRAND(1)-0.5)/12); /* milky way */
+ d = sqrt (x*x + y*y + z*z);
+ x /= d;
+ y /= d;
+ z /= d;
+ glColor3f (r, g, b);
+ glVertex3f (x, y, z);
+ gp->starcount++;
+ }
+ glEnd ();
+ }
+ glEndList ();
+
+ check_gl_error("stars initialization");
+}
+
+
+#ifdef BLENDED_TERMINATOR
+static void
+terminator_tube (ModeInfo *mi, int resolution)
+{
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat th;
+ GLfloat step = M_PI*2 / resolution;
+ GLfloat thickness = 0.1; /* Dusk is about an hour wide. */
+ GLfloat c1[] = { 0, 0, 0, 1 };
+ GLfloat c2[] = { 0, 0, 0, 0 };
+
+ glPushMatrix();
+ if (wire)
+ {
+ c1[0] = c1[1] = 0.5;
+ c2[2] = 0.5;
+ glLineWidth (4);
+ }
+ glRotatef (90, 1, 0, 0);
+ glScalef (1.02, 1.02, 1.02);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th < M_PI*2 + step; th += step)
+ {
+ GLfloat x = cos(th);
+ GLfloat y = sin(th);
+ glColor4fv (c1);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1);
+ glNormal3f (x, y, 0);
+ glVertex3f (x, y, thickness);
+ glColor4fv (c2);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2);
+ glVertex3f (x, y, -thickness);
+ }
+ glEnd();
+
+ /* There's a bit of a spike in the shading where the tube overlaps
+ the sphere, so extend the sphere a lot to try and avoid that. */
+# if 0 /* Nope, that doesn't help. */
+ glColor4fv (c1);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th < M_PI*2 + step; th += step)
+ {
+ GLfloat x = cos(th);
+ GLfloat y = sin(th);
+ glNormal3f (x, y, 0);
+ glVertex3f (x, y, thickness);
+ glVertex3f (x, y, thickness + 10);
+ }
+ glEnd();
+
+ glColor4fv (c2);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th < M_PI*2 + step; th += step)
+ {
+ GLfloat x = cos(th);
+ GLfloat y = sin(th);
+ glNormal3f (x, y, 0);
+ glVertex3f (x, y, -thickness);
+ glVertex3f (x, y, -thickness - 10);
+ }
+ glEnd();
+# endif /* 0 */
+
+ glPopMatrix();
+}
+#endif /* BLENDED_TERMINATOR */
+
+
+ENTRYPOINT void
+reshape_planet (ModeInfo *mi, int width, int height)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 200.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+planet_handle_event (ModeInfo *mi, XEvent *event)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_planet (ModeInfo * mi)
+{
+ planetstruct *gp;
+ int screen = MI_SCREEN(mi);
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, planets);
+ gp = &planets[screen];
+
+ gp->window = MI_WINDOW(mi);
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ {
+ char *f = get_string_resource(mi->dpy, "imageForeground", "Foreground");
+ char *b = get_string_resource(mi->dpy, "imageBackground", "Background");
+ char *s;
+ if (!f) f = strdup("white");
+ if (!b) b = strdup("black");
+
+ for (s = f + strlen(f)-1; s > f; s--)
+ if (*s == ' ' || *s == '\t')
+ *s = 0;
+ for (s = b + strlen(b)-1; s > b; s--)
+ if (*s == ' ' || *s == '\t')
+ *s = 0;
+
+ free (f);
+ free (b);
+ }
+
+ {
+ double spin_speed = 0.1;
+ double wander_speed = 0.005;
+ gp->rot = make_rotator (do_roll ? spin_speed : 0,
+ do_roll ? spin_speed : 0,
+ 0, 1,
+ do_wander ? wander_speed : 0,
+ True);
+ gp->z = frand (1.0);
+ gp->tilt = frand (23.4);
+ gp->trackball = gltrackball_init (True);
+ }
+
+ if (!wire && !do_texture)
+ {
+ GLfloat pos[4] = {1, 1, 1, 0};
+ GLfloat amb[4] = {0, 0, 0, 1};
+ GLfloat dif[4] = {1, 1, 1, 1};
+ GLfloat spc[4] = {0, 1, 1, 1};
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ if (wire)
+ do_texture = False;
+
+ if (do_texture)
+ setup_texture (mi);
+
+ if (do_stars)
+ init_stars (mi);
+
+ /* construct the polygons of the planet
+ */
+ gp->platelist = glGenLists(1);
+ glNewList (gp->platelist, GL_COMPILE);
+ glFrontFace(GL_CCW);
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (resolution, resolution, wire);
+ glPopMatrix();
+ glEndList();
+
+ gp->shadowlist = glGenLists(1);
+ glNewList (gp->shadowlist, GL_COMPILE);
+ glFrontFace(GL_CCW);
+
+ if (wire)
+ glColor4f (0.5, 0.5, 0, 1);
+# ifdef BLENDED_TERMINATOR
+ else
+ {
+ GLfloat c[] = { 0, 0, 0, 1 };
+ glColor4fv (c);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+# endif
+
+ glPushMatrix();
+ glScalef (1.01, 1.01, 1.01);
+ unit_dome (resolution, resolution, wire);
+
+# ifdef BLENDED_TERMINATOR
+ terminator_tube (mi, resolution);
+ if (!wire)
+ {
+ /* We have to draw the transparent side of the mask too,
+ though I'm not sure why. */
+ GLfloat c[] = { 0, 0, 0, 0 };
+ glColor4fv (c);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ glRotatef (180, 1, 0, 0);
+ unit_dome (resolution, resolution, wire);
+ }
+# endif
+
+ glPopMatrix();
+ glEndList();
+
+ /* construct the polygons of the latitude/longitude/axis lines.
+ */
+ gp->latlonglist = glGenLists(1);
+ glNewList (gp->latlonglist, GL_COMPILE);
+ glPushMatrix ();
+ glRotatef (90, 1, 0, 0); /* unit_sphere is off by 90 */
+ glRotatef (8, 0, 1, 0); /* line up the time zones */
+ unit_sphere (12, 24, 1);
+ unit_sphere (12, 24, 1);
+ glBegin(GL_LINES);
+ glVertex3f(0, -2, 0);
+ glVertex3f(0, 2, 0);
+ glEnd();
+ glPopMatrix ();
+ glEndList();
+}
+
+
+ENTRYPOINT void
+draw_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ double x, y, z;
+
+ if (!gp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glXMakeCurrent (dpy, window, *(gp->glx_context));
+
+ mi->polygon_count = 0;
+
+ if (gp->button_down_p)
+ gp->draw_axis = 60;
+ else if (!gp->draw_axis && !(random() % 1000))
+ gp->draw_axis = 60 + (random() % 90);
+
+ if (do_rotate && !gp->button_down_p)
+ {
+ gp->z -= 0.001 * spin_arg; /* the sun sets in the west */
+ if (gp->z < 0) gp->z += 1;
+ }
+
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_POINT_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ glPushMatrix();
+
+ get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
+ x = (x - 0.5) * 6;
+ y = (y - 0.5) * 6;
+ z = (z - 0.5) * 3;
+ glTranslatef(x, y, z);
+
+ gltrackball_rotate (gp->trackball);
+
+ if (do_roll)
+ {
+ get_rotation (gp->rot, &x, &y, 0, !gp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ }
+ else
+ glRotatef (current_device_rotation(), 0, 0, 1);
+
+ if (do_stars)
+ {
+ glDisable(GL_TEXTURE_2D);
+ glPushMatrix();
+ glScalef (60, 60, 60);
+ glRotatef (90, 1, 0, 0);
+ glRotatef (35, 1, 0, 0);
+ glCallList (gp->starlist);
+ mi->polygon_count += gp->starcount;
+ glPopMatrix();
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+
+ glRotatef (90, 1, 0, 0);
+ glRotatef (35, 1, 0, 0);
+ glRotatef (10, 0, 1, 0);
+ glRotatef (120, 0, 0, 1);
+
+ glScalef (3, 3, 3);
+
+# ifdef HAVE_MOBILE
+ glScalef (2, 2, 2);
+# endif
+
+ if (wire)
+ glColor3f (0, 0, 0.5);
+ else if (do_texture)
+ {
+ glColor4f (1, 1, 1, 1);
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+ }
+ else
+ {
+ GLfloat c[] = { 0, 0.5, 0, 1 };
+ glColor4fv (c);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0, 0, 1);
+ glCallList (gp->platelist);
+ mi->polygon_count += resolution*resolution;
+ glPopMatrix();
+
+ if (wire)
+ {
+ glPushMatrix();
+ glRotatef (gp->tilt, 1, 0, 0);
+ glColor3f(1, 0, 0);
+ glLineWidth(4);
+ glCallList (gp->shadowlist);
+ glLineWidth(1);
+ mi->polygon_count += resolution*(resolution/2);
+ glPopMatrix();
+ }
+
+ else if (!do_texture || gp->tex2)
+ {
+ /* Originally we just used GL_LIGHT0 to produce the day/night sides of
+ the planet, but that always looked crappy, even with a vast number of
+ polygons, because the day/night terminator didn't exactly line up with
+ the polygon edges.
+ */
+
+#ifndef BLENDED_TERMINATOR
+
+ /* Method 1, use the depth buffer as a stencil.
+
+ - Draw the full "day" sphere;
+ - Clear the depth buffer;
+ - Draw a rotated/tilted half-sphere into the depth buffer only,
+ on the Eastern hemisphere, putting non-zero depth only on the
+ sunlit side;
+ - Draw the full "night" sphere, which will clip to dark parts only.
+
+ That lets us divide the sphere into the two maps, and the dividing
+ line can be at any angle, regardless of polygon layout.
+
+ The half-sphere is scaled slightly larger to avoid polygon fighting,
+ since those triangles won't exactly line up because of the rotation.
+
+ The downside of this is that the day/night terminator is 100% sharp.
+ */
+ glClear (GL_DEPTH_BUFFER_BIT);
+ glColorMask (0, 0, 0, 0);
+ glDisable (GL_TEXTURE_2D);
+ glPushMatrix();
+ glRotatef (gp->tilt, 1, 0, 0);
+ glScalef (1.01, 1.01, 1.01);
+ glCallList (gp->shadowlist); /* Fill in depth on sunlit side */
+ mi->polygon_count += resolution*(resolution/2);
+ glPopMatrix();
+ glColorMask (1, 1, 1, 1);
+
+ if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+ }
+ else
+ {
+ GLfloat c[] = { 0, 0, 0.5, 1 };
+ glColor4fv (c);
+ if (! do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0, 0, 1);
+ glCallList (gp->platelist); /* Fill in color on night side */
+ mi->polygon_count += resolution*resolution;
+ glPopMatrix();
+
+#else /* BLENDED_TERMINATOR */
+
+ /* Method 2, use the alpha buffer as a stencil.
+ - Draw the full "day" sphere;
+ - Clear the depth buffer;
+ - Clear the alpha buffer;
+ - Draw a rotated/tilted half-sphere into the alpha buffer only,
+ on the Eastern hemisphere, putting non-zero alpha only on the
+ sunlit side;
+ - Also draw a fuzzy terminator ring into the alpha buffer;
+ - Clear the depth buffer again;
+ - Draw the full "night" sphere, which will blend to dark parts only.
+ */
+ glColorMask (0, 0, 0, 1);
+ glClear (GL_COLOR_BUFFER_BIT);
+ glClear (GL_DEPTH_BUFFER_BIT);
+ glDisable (GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glRotatef (gp->tilt, 1, 0, 0);
+ glScalef (1.01, 1.01, 1.01);
+ glCallList (gp->shadowlist); /* Fill in alpha on sunlit side */
+ mi->polygon_count += resolution*(resolution/2);
+ glPopMatrix();
+
+ glClear (GL_DEPTH_BUFFER_BIT);
+
+ glColorMask (1, 1, 1, 1);
+ {
+ GLfloat c[] = { 1, 1, 1, 1 };
+ glColor4fv (c);
+ if (! do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
+
+ if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+ }
+ else
+ {
+ GLfloat c[] = { 0, 0, 0.5, 1 };
+ glColor4fv (c);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ glEnable (GL_LIGHTING);
+ }
+
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0, 0, 1);
+ glCallList (gp->platelist); /* Fill in color on night side */
+ mi->polygon_count += resolution*resolution;
+ glPopMatrix();
+ glDisable (GL_BLEND);
+ glBlendFunc (GL_ONE, GL_ZERO);
+
+#endif /* BLENDED_TERMINATOR */
+ }
+
+ if (gp->draw_axis)
+ {
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0.0, 0.0, 1.0);
+ glScalef (1.02, 1.02, 1.02);
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_LINE_SMOOTH);
+ glColor3f (0.1, 0.3, 0.1);
+ glCallList (gp->latlonglist);
+ mi->polygon_count += 24*24;
+ glPopMatrix();
+ if (!wire && !do_texture)
+ glEnable (GL_LIGHTING);
+ if (gp->draw_axis) gp->draw_axis--;
+ }
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ if (gp->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ if (glIsList(gp->platelist))
+ glDeleteLists(gp->platelist, 1);
+ if (glIsList(gp->starlist))
+ glDeleteLists(gp->starlist, 1);
+ }
+}
+
+
+XSCREENSAVER_MODULE_2 ("GLPlanet", glplanet, planet)
+
+#endif
diff --git a/hacks/glx/glplanet.man b/hacks/glx/glplanet.man
new file mode 100644
index 0000000..6a62dc9
--- /dev/null
+++ b/hacks/glx/glplanet.man
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glplanet - rotating 3d texture-mapped planet.
+.SH SYNOPSIS
+.B glplanet
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-image \fIfile\fP]
+[\-image2 \fIfile\fP]
+[\-resolution \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a planet bouncing around in space. The built-in images are day and
+night maps of the Earth, but you can wrap any Equirectangular-projected
+map onto the sphere, e.g., the planetary textures included
+with \fIssystem.\fP
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-image \fIfile\fP
+The day texture map to wrap around the planet's surface.
+.TP 8
+.B \-image2 \fIfile\fP
+The night texture map to wrap around the planet's surface.
+The two will be blended together at the dusk terminator.
+.TP 8
+.B \-resolution
+The resolution of the planetary mesh. Default: 128.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR dymaxionmap (1)
+.BR ssystem (1)
+.SH COPYRIGHT
+Copyright \(co 2002-2018 by David Konerding and Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+David Konerding and Jamie Zawinski.
diff --git a/hacks/glx/glschool.c b/hacks/glx/glschool.c
new file mode 100644
index 0000000..49cfc11
--- /dev/null
+++ b/hacks/glx/glschool.c
@@ -0,0 +1,216 @@
+/* glschool.c, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#include "xlockmore.h"
+#include "glschool.h"
+
+#define sws_opts xlockmore_opts
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+#define free_glschool (0)
+#define release_glschool (0)
+#define glschool_handle_event (xlockmore_no_events)
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_NFISH "100"
+#define DEF_FOG "False"
+#define DEF_DRAWBBOX "True"
+#define DEF_DRAWGOAL "False"
+#define DEF_GOALCHGF "50"
+#define DEF_MAXVEL "7.0"
+#define DEF_MINVEL "1.0"
+#define DEF_ACCLIMIT "8.0"
+#define DEF_DISTEXP "2.2"
+#define DEF_AVOIDFACT "1.5"
+#define DEF_MATCHFACT "0.15"
+#define DEF_CENTERFACT "0.1"
+#define DEF_TARGETFACT "80"
+#define DEF_MINRADIUS "30.0"
+#define DEF_MOMENTUM "0.9"
+#define DEF_DISTCOMP "10.0"
+
+static int NFish;
+static Bool DoFog;
+static Bool DoDrawBBox;
+static Bool DoDrawGoal;
+static int GoalChgFreq;
+static float MinVel;
+static float MaxVel;
+static float DistExp;
+static float AccLimit;
+static float AvoidFact;
+static float MatchFact;
+static float TargetFact;
+static float CenterFact;
+static float MinRadius;
+static float Momentum;
+static float DistComp;
+
+static XrmOptionDescRec opts[] = {
+ { "-nfish", ".nfish", XrmoptionSepArg, 0 },
+ { "-fog", ".fog", XrmoptionNoArg, "True" },
+ { "+fog", ".fog", XrmoptionNoArg, "False" },
+ { "-drawgoal", ".drawgoal", XrmoptionNoArg, "True" },
+ { "+drawgoal", ".drawgoal", XrmoptionNoArg, "False" },
+ { "-drawbbox", ".drawbbox", XrmoptionNoArg, "True" },
+ { "+drawbbox", ".drawbbox", XrmoptionNoArg, "False" },
+ { "-goalchgf", ".goalchgf", XrmoptionSepArg, 0 },
+ { "-maxvel", ".maxvel", XrmoptionSepArg, 0 },
+ { "-minvel", ".minvel", XrmoptionSepArg, 0 },
+ { "-acclimit", ".acclimit", XrmoptionSepArg, 0 },
+ { "-distexp", ".distexp", XrmoptionSepArg, 0 },
+ { "-avoidfact", ".avoidfact", XrmoptionSepArg, 0 },
+ { "-matchfact", ".matchfact", XrmoptionSepArg, 0 },
+ { "-centerfact",".centerfact", XrmoptionSepArg, 0 },
+ { "-targetfact",".targetfact", XrmoptionSepArg, 0 },
+ { "-minradius", ".minradius", XrmoptionSepArg, 0 },
+ { "-distcomp", ".distcomp", XrmoptionSepArg, 0 },
+ { "-momentum", ".momentum", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&NFish, "nfish", "NFish", DEF_NFISH, t_Int},
+ {&DoFog, "fog", "DoFog", DEF_FOG, t_Bool},
+ {&DoDrawBBox, "drawbbox", "DoDrawBBox", DEF_DRAWBBOX, t_Bool},
+ {&DoDrawGoal, "drawgoal", "DoDrawGoal", DEF_DRAWGOAL, t_Bool},
+ {&GoalChgFreq, "goalchgf", "GoalChgFreq", DEF_GOALCHGF, t_Int},
+ {&MaxVel, "maxvel", "MaxVel", DEF_MAXVEL, t_Float},
+ {&MinVel, "minvel", "MinVel", DEF_MINVEL, t_Float},
+ {&AccLimit, "acclimit", "AccLimit", DEF_ACCLIMIT, t_Float},
+ {&DistExp, "distexp", "DistExp", DEF_DISTEXP, t_Float},
+ {&AvoidFact, "avoidfact", "AvoidFact", DEF_AVOIDFACT, t_Float},
+ {&MatchFact, "matchfact", "MatchFact", DEF_MATCHFACT, t_Float},
+ {&CenterFact, "centerfact", "CenterFact", DEF_CENTERFACT, t_Float},
+ {&TargetFact, "targetfact", "TargetFact", DEF_TARGETFACT, t_Float},
+ {&MinRadius, "minradius", "MinRadius", DEF_MINRADIUS, t_Float},
+ {&Momentum, "momentum", "Momentum", DEF_MOMENTUM, t_Float},
+ {&DistComp, "distcomp", "DistComp", DEF_DISTCOMP, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt glschool_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+typedef struct {
+ int nColors;
+ int rotCounter;
+ int goalCounter;
+ Bool drawGoal;
+ Bool drawBBox;
+ GLuint bboxList;
+ GLuint goalList;
+ GLuint fishList;
+ int fish_polys, box_polys;
+ XColor *colors;
+ School *school;
+ GLXContext *context;
+} glschool_configuration;
+
+static glschool_configuration *scs = NULL;
+
+ENTRYPOINT void
+reshape_glschool(ModeInfo *mi, int width, int height)
+{
+ Bool wire = MI_IS_WIREFRAME(mi);
+ double aspect = (double)width/(double)height;
+ glschool_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->context));
+ if (sc->school != (School *)0) {
+ glschool_setBBox(sc->school, -aspect*160, aspect*160, -130, 130, -450, -50.0);
+ glDeleteLists(sc->bboxList, 1);
+ glschool_createBBoxList(&SCHOOL_BBOX(sc->school),
+ &sc->bboxList, wire);
+ }
+ glschool_reshape(width, height);
+}
+
+ENTRYPOINT void
+init_glschool(ModeInfo *mi)
+{
+ int width = MI_WIDTH(mi);
+ int height = MI_HEIGHT(mi);
+ Bool wire = MI_IS_WIREFRAME(mi);
+ glschool_configuration *sc;
+
+ MI_INIT (mi, scs);
+ sc = &scs[MI_SCREEN(mi)];
+
+ sc->drawGoal = DoDrawGoal;
+ sc->drawBBox = DoDrawBBox;
+
+ sc->nColors = 360;
+ sc->context = init_GL(mi);
+ sc->colors = (XColor *)calloc(sc->nColors, sizeof(XColor));
+ make_color_ramp(0, 0, 0,
+ 0.0, 1.0, 1.0,
+ 359.0, 1.0, 1.0,
+ sc->colors, &sc->nColors,
+ False, 0, False);
+
+ sc->school = glschool_initSchool(NFish, AccLimit, MaxVel, MinVel, DistExp, Momentum,
+ MinRadius, AvoidFact, MatchFact, CenterFact, TargetFact,
+ DistComp);
+ if (sc->school == (School *)0) {
+ fprintf(stderr, "couldn't initialize TheSchool, exiting\n");
+ exit(1);
+ }
+
+ reshape_glschool(mi, width, height);
+
+ glschool_initGLEnv(DoFog);
+ glschool_initFishes(sc->school);
+ glschool_createDrawLists(&SCHOOL_BBOX(sc->school),
+ &sc->bboxList, &sc->goalList, &sc->fishList,
+ &sc->fish_polys, &sc->box_polys, wire);
+ glschool_computeAccelerations(sc->school);
+}
+
+ENTRYPOINT void
+draw_glschool(ModeInfo *mi)
+{
+ Window window = MI_WINDOW(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ glschool_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ if (!sc->context) {
+ fprintf(stderr, "no context\n");
+ return;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->context));
+
+ mi->polygon_count = 0;
+
+ if ((sc->goalCounter % GoalChgFreq) == 0)
+ glschool_newGoal(sc->school);
+ sc->goalCounter++;
+
+ sc->rotCounter++;
+ sc->rotCounter = (sc->rotCounter%360);
+
+ glschool_applyMovements(sc->school);
+ glschool_drawSchool(sc->colors, sc->school, sc->bboxList,
+ sc->goalList, sc->fishList, sc->rotCounter,
+ sc->drawGoal, sc->drawBBox,
+ sc->fish_polys, sc->box_polys,
+ &mi->polygon_count);
+ glschool_computeAccelerations(sc->school);
+
+ if (mi->fps_p)
+ do_fps(mi);
+
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE("GLSchool", glschool)
diff --git a/hacks/glx/glschool.h b/hacks/glx/glschool.h
new file mode 100644
index 0000000..b6ce7d5
--- /dev/null
+++ b/hacks/glx/glschool.h
@@ -0,0 +1,17 @@
+/* glschool.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef __GLSCHOOL_H__
+#define __GLSCHOOL_H__
+
+#include "glschool_alg.h"
+#include "glschool_gl.h"
+
+#endif /* __GLSCHOOL_H__ */
diff --git a/hacks/glx/glschool.man b/hacks/glx/glschool.man
new file mode 100644
index 0000000..8de00c4
--- /dev/null
+++ b/hacks/glx/glschool.man
@@ -0,0 +1,126 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glschool - a 3D schooling simulation
+.SH SYNOPSIS
+.B glschool
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-wireframe]
+[\-fps]
+[\-delay \fInumber\fP]
+[\-nfish \fInumber\fP]
+[\-maxvel \fInumber\fP]
+[\-minvel \fInumber\fP]
+[\-acclimit \fInumber\fP]
+[\-avoidfact \fInumber\fP]
+[\-matchfact \fInumber\fP]
+[\-centerfact \fInumber\fP]
+[\-targetfact \fInumber\fP]
+[\-minradius \fInumber\fP]
+[\-momentum \fInumber\fP]
+[\-distexp \fInumber\fP]
+[\-goalchgf \fInumber\fP]
+[\-fog]
+[\-drawgoal]
+[\-drawbbox]
+.SH DESCRIPTION
+Uses Craig Reynolds Boids algorithm to simulate a 3d school of
+fish. See <http://www.red3d.com/cwr/boids> for a description
+of the algorithm and the original paper. This is a lightly modified
+version of the algorithm that supports goal attraction.
+
+Many different behaviors are possible by tweaking the parameters. No sanity checking is performed
+on the command line params, so if you want to use negative accelerations or minimum velocity that is
+larger than maximum velocity or that sort of thing, the simulation will try to digest it.
+
+It looks best with the highest number of fish that will give you an FPS of > 25 or so.
+
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.020 seconds.).
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-fog | \-no-fog
+ Whether to show foggy (cloudy) water.
+.TP 8
+.B \-drawgoal | \-no-drawgoal
+ Whether to show the school's attraction goal.
+.TP 8
+.B \-drawbbox | \-no-drawbbox
+ Whether to show the bounding box.
+.TP 8
+.B \-fog | \-no-fog
+ Whether to show foggy (cloudy) water.
+.TP 8
+.B \-nfish \fInumber\fP
+Number of fish. Defaults to 100
+.TP 8
+.B \-acclimit \fInumber\fP
+Acceleration limit. Defaults to 8.0
+.TP 8
+.B \-minvel \fInumber\fP
+Minimum velocity. Defaults to 1.0
+.TP 8
+.B \-maxvel \fInumber\fP
+Minimum velocity. Defaults to 7.0
+.TP 8
+.B \-goalchgf \fInumber\fP
+Goal change frequency. Defaults to 50 (frames)
+.TP 8
+.B \-avoidfact \fInumber\fP
+Avoidance acceleration factor. Defaults to 1.5
+.TP 8
+.B \-matchfact \fInumber\fP
+Match avg velocity acceleration factor. Defaults to 0.15
+.TP 8
+.B \-centerfact \fInumber\fP
+School centering acceleration factor. Defaults to 0.1
+.TP 8
+.B \-targetfact \fInumber\fP
+Target attraction acceleration factor. Defaults to 80
+.TP 8
+.B \-distexp \fInumber\fP
+Distance weighting exponent. Defaults to 2.2
+.TP 8
+.B \-momentum \fInumber\fP
+Momentum. Defaults to 0.9
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005-2006 by David C. Lambert. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David C. Lambert
diff --git a/hacks/glx/glschool_alg.c b/hacks/glx/glschool_alg.c
new file mode 100644
index 0000000..32b4a5f
--- /dev/null
+++ b/hacks/glx/glschool_alg.c
@@ -0,0 +1,364 @@
+/* school_alg.c, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "yarandom.h"
+#include "glschool_alg.h"
+
+/* for xscreensaver */
+#undef drand48
+#define drand48() frand(1.0)
+
+#define RAD2DEG (180.0/3.1415926535)
+
+
+static inline double
+norm(double *dv)
+{
+ return sqrt(dv[0]*dv[0] + dv[1]*dv[1] + dv[2]*dv[2]);
+}
+
+
+static inline void
+addVector(double *v, double *d)
+{
+ v[0] += d[0];
+ v[1] += d[1];
+ v[2] += d[2];
+}
+
+
+static inline void
+clearVector(double *v)
+{
+ v[0] = v[1] = v[2] = 0.0;
+}
+
+
+static inline void
+scaleVector(double *v, double s)
+{
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+}
+
+
+static inline void
+addScaledVector(double *v, double *d, double s)
+{
+ v[0] += d[0]*s;
+ v[1] += d[1]*s;
+ v[2] += d[2]*s;
+}
+
+
+static inline void
+getDifferenceVector(double *v0, double *v1, double *diff)
+{
+ diff[0] = v0[0] - v1[0];
+ diff[1] = v0[1] - v1[1];
+ diff[2] = v0[2] - v1[2];
+}
+
+
+void
+glschool_initFish(Fish *f, double *mins, double *ranges)
+{
+ int i;
+
+ for(i = 0; i < 3; i++) {
+ FISH_IPOS(f, i) = mins[i] + drand48()*ranges[i];
+ FISH_IACC(f, i) = 0.0;
+ FISH_IVEL(f, i) = drand48();
+ FISH_IMAGIC(f, i) = 0.70 + 0.60*drand48();
+ FISH_IOLDVEL(f, i) = 0.0;
+ }
+}
+
+
+void
+glschool_initFishes(School *s)
+{
+ int i;
+ Fish *f = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ BBox *bbox = &SCHOOL_BBOX(s);
+ double *mins = BBOX_MINS(bbox);
+ double *ranges = SCHOOL_BBRANGES(s);
+ Fish *theFishes = SCHOOL_FISHES(s);
+
+ for(i = 0, f = theFishes; i < nFish; i++, f++)
+ glschool_initFish(f, mins, ranges);
+}
+
+
+static void
+applyFishMovements(Fish *f, BBox *bbox, double minVel, double maxVel, double momentum)
+{
+ int i;
+ int oob = 0;
+ double vMag = 0.0;
+
+ for(i = 0; i < 3; i++) {
+ double pos = FISH_IPOS(f, i);
+ oob = (pos > BBOX_IMAX(bbox, i) || pos < BBOX_IMIN(bbox, i));
+ if (oob == 0) FISH_IVEL(f, i) += FISH_IACC(f, i) * FISH_IMAGIC(f, i);
+ vMag += (FISH_IVEL(f, i) * FISH_IVEL(f, i));
+ }
+ vMag = sqrt(vMag);
+
+ if (vMag > maxVel)
+ scaleVector(FISH_VEL(f), maxVel/vMag);
+ else if (vMag < minVel)
+ scaleVector(FISH_VEL(f), minVel/vMag);
+
+ for(i = 0; i < 3; i++) {
+ FISH_IVEL(f, i) = momentum * FISH_IOLDVEL(f, i) + (1.0-momentum) * FISH_IVEL(f, i);
+ FISH_IPOS(f, i) += FISH_IVEL(f, i);
+ FISH_IOLDVEL(f, i) = FISH_IVEL(f, i);
+
+ if (FISH_IPOS(f, i) < BBOX_IMIN(bbox, i))
+ FISH_IPOS(f, i) = BBOX_IMAX(bbox, i);
+ else if (FISH_IPOS(f, i) > BBOX_IMAX(bbox, i))
+ FISH_IPOS(f, i) = BBOX_IMIN(bbox, i);
+ }
+}
+
+
+void
+glschool_applyMovements(School *s)
+{
+ int i = 0;
+ Fish *f = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ double minVel = SCHOOL_MINVEL(s);
+ double maxVel = SCHOOL_MAXVEL(s);
+ double momentum = SCHOOL_MOMENTUM(s);
+ BBox *bbox = &SCHOOL_BBOX(s);
+ Fish *theFishes = SCHOOL_FISHES(s);
+
+ for(i = 0, f = theFishes; i < nFish; i++, f++)
+ applyFishMovements(f, bbox, minVel, maxVel, momentum);
+}
+
+
+School *
+glschool_initSchool(int nFish, double accLimit, double maxV, double minV, double distExp, double momentum,
+ double minRadius, double avoidFact, double matchFact, double centerFact, double targetFact,
+ double distComp)
+{
+ School *s = (School *)0;
+
+ if ((s = (School *)malloc(sizeof(School))) == (School *)0) {
+ perror("initSchool School allocation failed: ");
+ return s;
+ }
+
+ if ((SCHOOL_FISHES(s) = (Fish *)malloc(sizeof(Fish)*nFish)) == (Fish *)0) {
+ perror("initSchool Fish array allocation failed: ");
+ free(s);
+ return (School *)0;
+ }
+
+ SCHOOL_NFISH(s) = nFish;
+ SCHOOL_ACCLIMIT(s) = accLimit;
+ SCHOOL_MAXVEL(s) = maxV;
+ SCHOOL_MINVEL(s) = minV;
+ SCHOOL_DISTEXP(s) = distExp;
+ SCHOOL_MOMENTUM(s) = momentum;
+ SCHOOL_MINRADIUS(s) = minRadius;
+ SCHOOL_MINRADIUSEXP(s) = pow(minRadius, distExp);
+ SCHOOL_MATCHFACT(s) = matchFact;
+ SCHOOL_AVOIDFACT(s) = avoidFact;
+ SCHOOL_CENTERFACT(s) = centerFact;
+ SCHOOL_TARGETFACT(s) = targetFact;
+ SCHOOL_DISTCOMP(s) = distComp;
+
+ return s;
+}
+
+void
+glschool_freeSchool(School *s)
+{
+ free(SCHOOL_FISHES(s));
+ free(s);
+}
+
+void
+glschool_setBBox(School *s, double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
+{
+ int i;
+ BBox *bbox = &SCHOOL_BBOX(s);
+
+ BBOX_XMIN(bbox) = xMin; BBOX_XMAX(bbox) = xMax;
+ BBOX_YMIN(bbox) = yMin; BBOX_YMAX(bbox) = yMax;
+ BBOX_ZMIN(bbox) = zMin; BBOX_ZMAX(bbox) = zMax;
+
+ for(i = 0; i < 3; i++) {
+ SCHOOL_IMID(s, i) = BBOX_IMID(bbox, i);
+ SCHOOL_IRANGE(s, i) = BBOX_IRANGE(bbox, i);
+ }
+}
+
+
+void
+glschool_newGoal(School *s)
+{
+ SCHOOL_IGOAL(s,0) = 0.85*(drand48()-0.5)*SCHOOL_IRANGE(s,0) + SCHOOL_IMID(s,0);
+ SCHOOL_IGOAL(s,1) = 0.40*(drand48()-0.5)*SCHOOL_IRANGE(s,1) + SCHOOL_IMID(s,1);
+ SCHOOL_IGOAL(s,2) = 0.85*(drand48()-0.5)*SCHOOL_IRANGE(s,2) + SCHOOL_IMID(s,2);
+}
+
+
+double
+glschool_computeNormalAndThetaToPlusZ(double *v, double *xV)
+{
+ double x1 = 0.0;
+ double y1 = 0.0;
+ double z1 = 1.0;
+ double x2 = v[0];
+ double y2 = v[1];
+ double z2 = v[2];
+ double theta = 0.0;
+ double xVNorm = 0.0;
+ double sinTheta = 0.0;
+ double v2Norm = norm(v);
+
+ if (v2Norm == 0.0) {
+ xV[1] = 1.0;
+ xV[0] = xV[2] = 0.0;
+ return theta;
+ }
+ xV[0] = (y1*z2 - z1*y2);
+ xV[1] = -(x1*z2 - z1*x2);
+ xV[2] = (x1*y2 - y1*x2);
+ xVNorm = norm(xV);
+
+ sinTheta = xVNorm/v2Norm;
+ return (asin(sinTheta) * RAD2DEG);
+}
+
+
+int
+glschool_computeGroupVectors(School *s, Fish *ref, double *avoidance, double *centroid, double *avgVel)
+{
+ int i;
+ double dist;
+ double adjDist;
+ double diffVect[3];
+ int neighborCount = 0;
+ Fish *test = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ double distExp = SCHOOL_DISTEXP(s);
+ double distComp = SCHOOL_DISTCOMP(s);
+ double minRadiusExp = SCHOOL_MINRADIUSEXP(s);
+ Fish *fishes = SCHOOL_FISHES(s);
+
+ for(i = 0, test = fishes; i < nFish; i++, test++) {
+ if (test == ref) continue;
+
+ getDifferenceVector(FISH_POS(ref), FISH_POS(test), diffVect);
+
+ dist = norm(diffVect) - distComp;
+ if (dist < 0.0) dist = 0.1;
+
+ adjDist = pow(dist, distExp);
+ if (adjDist > minRadiusExp) continue;
+
+ neighborCount++;
+
+ addVector(avgVel, FISH_VEL(test));
+ addVector(centroid, FISH_POS(test));
+
+ addScaledVector(avoidance, diffVect, 1.0/adjDist);
+ }
+ if (neighborCount > 0) {
+ scaleVector(avgVel, 1.0/neighborCount);
+ scaleVector(centroid, 1.0/neighborCount);
+ }
+ return neighborCount;
+}
+
+
+void
+glschool_computeAccelerations(School *s)
+{
+ int i;
+ int j;
+ int neighborCount;
+ double dist;
+ double adjDist;
+ double accMag;
+ double avgVel[3];
+ double diffVect[3];
+ double centroid[3];
+ double avoidance[3];
+ Fish *ref = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ double *goal = SCHOOL_GOAL(s);
+ double distExp = SCHOOL_DISTEXP(s);
+ double distComp = SCHOOL_DISTCOMP(s);
+ double avoidFact = SCHOOL_AVOIDFACT(s);
+ double matchFact = SCHOOL_MATCHFACT(s);
+ double centerFact = SCHOOL_CENTERFACT(s);
+ double targetFact = SCHOOL_TARGETFACT(s);
+ double accLimit = SCHOOL_ACCLIMIT(s);
+ double minRadius = SCHOOL_MINRADIUS(s);
+ Fish *fishes = SCHOOL_FISHES(s);
+
+ for(i = 0, ref = fishes; i < nFish; i++, ref++) {
+ clearVector(avgVel);
+ clearVector(centroid);
+ clearVector(avoidance);
+ clearVector(FISH_ACC(ref));
+ neighborCount = glschool_computeGroupVectors(s, ref, avoidance, centroid, avgVel);
+
+ /* avoidanceAccel[] = avoidance[] * AvoidFact */
+ scaleVector(avoidance, avoidFact);
+ addVector(FISH_ACC(ref), avoidance);
+
+ accMag = norm(FISH_ACC(ref));
+ if (neighborCount > 0 && accMag < accLimit) {
+ for(j = 0; j < 3; j++) {
+ FISH_IAVGVEL(ref, j) = avgVel[j];
+ FISH_IACC(ref, j) += ((avgVel[j] - FISH_IVEL(ref, j)) * matchFact);
+ }
+
+ accMag = norm(FISH_ACC(ref));
+ if (accMag < accLimit) {
+ for(j = 0; j < 3; j++)
+ FISH_IACC(ref, j) += ((centroid[j] - FISH_IPOS(ref, j)) * centerFact);
+ }
+ }
+
+ accMag = norm(FISH_ACC(ref));
+ if (accMag < accLimit) {
+ getDifferenceVector(goal, FISH_POS(ref), diffVect);
+
+ dist = norm(diffVect) - distComp;
+ if (dist < 0.0) dist = 0.1;
+
+ /*adjDist = pow(dist, distExp);*/
+ if (dist > minRadius) {
+ adjDist = pow(dist, distExp);
+ for(j = 0; j < 3; j++)
+ FISH_IACC(ref, j) += (diffVect[j]*targetFact/adjDist);
+ }
+ }
+ }
+}
diff --git a/hacks/glx/glschool_alg.h b/hacks/glx/glschool_alg.h
new file mode 100644
index 0000000..339e778
--- /dev/null
+++ b/hacks/glx/glschool_alg.h
@@ -0,0 +1,126 @@
+/* glschool_alg.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef __GLSCHOOL_ALG_H__
+#define __GLSCHOOL_ALG_H__
+
+typedef struct {
+ double mins[3];
+ double maxs[3];
+} BBox;
+
+#define BBOX_XMIN(b) ((b)->mins[0])
+#define BBOX_YMIN(b) ((b)->mins[1])
+#define BBOX_ZMIN(b) ((b)->mins[2])
+#define BBOX_MINS(b) ((b)->mins)
+#define BBOX_IMIN(b, i) ((b)->mins[(i)])
+
+#define BBOX_XMAX(b) ((b)->maxs[0])
+#define BBOX_YMAX(b) ((b)->maxs[1])
+#define BBOX_ZMAX(b) ((b)->maxs[2])
+#define BBOX_MAXS(b) ((b)->maxs)
+#define BBOX_IMAX(b, i) ((b)->maxs[(i)])
+
+#define BBOX_IMID(b, i) (((b)->maxs[(i)] + (b)->mins[(i)])/2.0)
+#define BBOX_IRANGE(b, i) ((b)->maxs[(i)] - (b)->mins[(i)])
+
+typedef struct {
+ double pos[3];
+ double vel[3];
+ double accel[3];
+ double oldVel[3];
+ double magic[3];
+ double avgVel[3];
+} Fish;
+
+#define FISH_POS(f) ((f)->pos)
+#define FISH_X(f) ((f)->pos[0])
+#define FISH_Y(f) ((f)->pos[1])
+#define FISH_Z(f) ((f)->pos[2])
+
+#define FISH_VEL(f) ((f)->vel)
+#define FISH_VX(f) ((f)->vel[0])
+#define FISH_VY(f) ((f)->vel[1])
+#define FISH_VZ(f) ((f)->vel[2])
+
+#define FISH_ACC(f) ((f)->accel)
+#define FISH_MAGIC(f) ((f)->magic)
+#define FISH_OLDVEL(f) ((f)->oldVel)
+#define FISH_AVGVEL(f) ((f)->avgVel)
+#define FISH_IPOS(f, i) ((f)->pos[(i)])
+#define FISH_IVEL(f, i) ((f)->vel[(i)])
+#define FISH_IACC(f, i) ((f)->accel[(i)])
+#define FISH_IMAGIC(f, i) ((f)->magic[(i)])
+#define FISH_IOLDVEL(f, i) ((f)->oldVel[(i)])
+#define FISH_IAVGVEL(f, i) ((f)->avgVel[(i)])
+
+typedef struct {
+ int nFish;
+ double maxVel;
+ double minVel;
+ double distExp;
+ double momentum;
+ double accLimit;
+ double minRadius;
+ double minRadiusExp;
+ double avoidFact;
+ double matchFact;
+ double centerFact;
+ double targetFact;
+ double distComp;
+ double goal[3];
+ double boxMids[3];
+ double boxRanges[3];
+ BBox theBox;
+ Fish *theFish;
+} School;
+
+#define SCHOOL_NFISH(s) ((s)->nFish)
+#define SCHOOL_MAXVEL(s) ((s)->maxVel)
+#define SCHOOL_MINVEL(s) ((s)->minVel)
+#define SCHOOL_DISTEXP(s) ((s)->distExp)
+#define SCHOOL_MOMENTUM(s) ((s)->momentum)
+#define SCHOOL_ACCLIMIT(s) ((s)->accLimit)
+#define SCHOOL_MINRADIUS(s) ((s)->minRadius)
+#define SCHOOL_MINRADIUSEXP(s) ((s)->minRadiusExp)
+#define SCHOOL_MATCHFACT(s) ((s)->matchFact)
+#define SCHOOL_AVOIDFACT(s) ((s)->avoidFact)
+#define SCHOOL_CENTERFACT(s) ((s)->centerFact)
+#define SCHOOL_TARGETFACT(s) ((s)->targetFact)
+#define SCHOOL_DISTCOMP(s) ((s)->distComp)
+#define SCHOOL_GOAL(s) ((s)->goal)
+#define SCHOOL_IGOAL(s,i) ((s)->goal[(i)])
+#define SCHOOL_BBMINS(s) ((s)->bbox.mins)
+#define SCHOOL_BBMAXS(s) ((s)->bbox.maxs)
+#define SCHOOL_BBMIDS(s) ((s)->boxMids)
+#define SCHOOL_IMID(s,i) ((s)->boxMids[(i)])
+#define SCHOOL_BBRANGES(s) ((s)->boxRanges)
+#define SCHOOL_IRANGE(s,i) ((s)->boxRanges[(i)])
+#define SCHOOL_BBOX(s) ((s)->theBox)
+#define SCHOOL_FISHES(s) ((s)->theFish)
+#define SCHOOL_IFISH(s,i) ((s)->theFish[i])
+
+extern void glschool_initFishes(School *);
+extern void glschool_initFish(Fish *, double *, double *);
+
+extern void glschool_applyMovements(School *);
+/* extern void applyFishMovements(Fish *, BBox *, double, double, double); */
+
+extern void glschool_freeSchool(School *);
+extern School *glschool_initSchool(int, double, double, double, double, double, double, double, double, double, double, double);
+
+extern void glschool_newGoal(School *);
+extern void glschool_setBBox(School *, double, double, double, double, double, double);
+
+extern void glschool_computeAccelerations(School *);
+extern double glschool_computeNormalAndThetaToPlusZ(double *, double *);
+int glschool_computeGroupVectors(School *, Fish *, double *, double *, double *);
+
+#endif /* __GLSCHOOL_ALG_H__ */
diff --git a/hacks/glx/glschool_gl.c b/hacks/glx/glschool_gl.c
new file mode 100644
index 0000000..660580b
--- /dev/null
+++ b/hacks/glx/glschool_gl.c
@@ -0,0 +1,274 @@
+/* glschool_gl.c, Copyright (c) 2005-2012 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "sphere.h"
+#include "glschool_gl.h"
+#include "sphere.h"
+#include "tube.h"
+
+void
+glschool_drawGoal(double *goal, GLuint goalList)
+{
+ glColor3f(1.0, 0.0, 0.0);
+ glPushMatrix();
+ {
+ glTranslatef(goal[0], goal[1], goal[2]);
+ glColor3f(1.0, 0.0, 0.0);
+ glCallList(goalList);
+ }
+ glPopMatrix();
+}
+
+int
+glschool_drawBoundingBox(BBox *bbox, Bool wire)
+{
+ int polys = 0;
+ double xMin = BBOX_XMIN(bbox);
+ double yMin = BBOX_YMIN(bbox);
+ double zMin = BBOX_ZMIN(bbox);
+
+ double xMax = BBOX_XMAX(bbox);
+ double yMax = BBOX_YMAX(bbox);
+ double zMax = BBOX_ZMAX(bbox);
+
+ glFrontFace(GL_CCW);
+ if (wire) glLineWidth(5.0);
+
+ /* back */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .15);
+ glVertex3f(xMin, yMin, zMin);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMax, yMax, zMin);
+ glVertex3f(xMin, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* left */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .2);
+ glVertex3f(xMin, yMin, zMax);
+ glVertex3f(xMin, yMin, zMin);
+ glVertex3f(xMin, yMax, zMin);
+ glVertex3f(xMin, yMax, zMax);
+ polys++;
+ glEnd();
+
+ /* right */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .2);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMax, yMin, zMax);
+ glVertex3f(xMax, yMax, zMax);
+ glVertex3f(xMax, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* top */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .1);
+ glVertex3f(xMax, yMax, zMax);
+ glVertex3f(xMin, yMax, zMax);
+ glVertex3f(xMin, yMax, zMin);
+ glVertex3f(xMax, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* bottom */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .3);
+ glVertex3f(xMin, yMin, zMax);
+ glVertex3f(xMax, yMin, zMax);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMin, yMin, zMin);
+ polys++;
+ glEnd();
+
+ if (wire) glLineWidth(1.0);
+
+ return polys;
+}
+
+int
+glschool_createBBoxList(BBox *bbox, GLuint *bboxList, int wire)
+{
+ int polys = 0;
+ *bboxList = glGenLists(1);
+ glNewList(*bboxList, GL_COMPILE);
+ polys = glschool_drawBoundingBox(bbox, wire);
+ glEndList();
+ return polys;
+}
+
+void
+glschool_createDrawLists(BBox *bbox, GLuint *bboxList, GLuint *goalList, GLuint *fishList, int *fish_polys, int *box_polys, int wire)
+{
+
+ int faces = 16;
+
+ *box_polys = 0;
+ *fish_polys = 0;
+
+ *box_polys += glschool_createBBoxList(bbox, bboxList, wire);
+
+ *box_polys = 0;
+ *fish_polys = 0;
+
+ *goalList = glGenLists(1);
+ glNewList(*goalList, GL_COMPILE);
+ glScalef (5, 5, 5);
+ *box_polys += unit_sphere (10, 10, wire);
+ glEndList();
+
+ *fishList = glGenLists(1);
+ glNewList(*fishList, GL_COMPILE);
+ *fish_polys += cone (0, 0, 0,
+ 0, 0, 10,
+ 2, 0,
+ faces, True, (faces <= 3), /* cap */
+ wire);
+ glTranslatef (0, 0, -0.3);
+ glScalef (2, 2, 2);
+ glRotatef (90, 1, 0, 0);
+ if (faces > 3)
+ *fish_polys += unit_sphere (faces, faces, wire);
+ glEndList();
+}
+
+
+void
+glschool_initLights(void)
+{
+ GLfloat amb[4] = {0.1, 0.1, 0.1, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat pos[4] = {0.0, 50.0, -50.0, 1.0};
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+}
+
+void
+glschool_initFog(void)
+{
+ GLfloat fog[4] = {0.0, 0.0, 0.15, 1.0};
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fog);
+ glFogf(GL_FOG_DENSITY, .0025);
+ glFogf(GL_FOG_START, -100);
+}
+
+void
+glschool_initGLEnv(Bool doFog)
+{
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glClearDepth(1.0);
+ glDepthFunc(GL_LESS);
+
+ glEnable(GL_COLOR_MATERIAL);
+ glMateriali(GL_FRONT, GL_SHININESS, 128);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spc);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, spc);
+
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_CULL_FACE);
+
+ glschool_initLights();
+ if (doFog) glschool_initFog();
+}
+
+void
+glschool_reshape(int width, int height)
+{
+ GLfloat h = (GLfloat) width / (GLfloat) height;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(60.0, h, 0.1, 451.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+void
+glschool_getColorVect(XColor *colors, int index, double *colorVect)
+{
+ colorVect[0] = colors[index].red / 65535.0;
+ colorVect[1] = colors[index].green / 65535.0;
+ colorVect[2] = colors[index].blue / 65535.0;
+}
+
+void
+glschool_drawSchool(XColor *colors, School *s,
+ GLuint bboxList, GLuint goalList, GLuint fishList,
+ int rotCounter, Bool drawGoal_p, Bool drawBBox_p,
+ int fish_polys, int box_polys, unsigned long *polys)
+{
+ double xVect[3];
+ double colorVect[3];
+ int i = 0;
+ double rotTheta = 0.0;
+ double colTheta = 0.0;
+ Fish *f = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ Fish *theFishes = SCHOOL_FISHES(s);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (drawBBox_p) {
+ glDisable(GL_LIGHTING);
+ glCallList(bboxList);
+ glEnable(GL_LIGHTING);
+ *polys += box_polys;
+ }
+
+ if (drawGoal_p) glschool_drawGoal(SCHOOL_GOAL(s), goalList);
+
+ for(i = 0, f = theFishes; i < nFish; i++, f++) {
+ colTheta = glschool_computeNormalAndThetaToPlusZ(FISH_AVGVEL(f), xVect);
+ rotTheta = glschool_computeNormalAndThetaToPlusZ(FISH_VEL(f), xVect);
+
+ if (FISH_IAVGVEL(f,2) < 0.0) colTheta = 180.0 - colTheta;
+ if (FISH_VZ(f) < 0.0) rotTheta = 180.0 - rotTheta;
+
+ glschool_getColorVect(colors, (int)(colTheta+240)%360, colorVect);
+ glColor3f(colorVect[0], colorVect[1], colorVect[2]);
+
+ glPushMatrix();
+ {
+ glTranslatef(FISH_X(f), FISH_Y(f), FISH_Z(f));
+ glRotatef(180.0+rotTheta, xVect[0], xVect[1], xVect[2]);
+ glCallList(fishList);
+ *polys += fish_polys;
+ }
+ glPopMatrix();
+ }
+
+ glFinish();
+}
diff --git a/hacks/glx/glschool_gl.h b/hacks/glx/glschool_gl.h
new file mode 100644
index 0000000..c5e2d38
--- /dev/null
+++ b/hacks/glx/glschool_gl.h
@@ -0,0 +1,51 @@
+/* glschool_gl.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef __GLSCHOOL_GL_H__
+#define __GLSCHOOL_GL_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+# ifndef HAVE_JWZGLES
+# include <OpenGL/glu.h>
+# endif
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "glschool_alg.h"
+
+extern void glschool_initFog(void);
+extern void glschool_initGLEnv(Bool);
+extern void glschool_initLights(void);
+extern void glschool_reshape(int, int);
+extern void glschool_drawGoal(double *, GLuint);
+extern void glschool_getColorVect(XColor *, int, double *);
+extern int glschool_drawBoundingBox(BBox *, Bool);
+extern int glschool_createBBoxList(BBox *, GLuint *, int);
+extern void glschool_createDrawLists(BBox *, GLuint *, GLuint *, GLuint *, int *, int *, Bool);
+extern void glschool_drawSchool(XColor *, School *, GLuint, GLuint, GLuint, int, Bool, Bool,
+ int, int, unsigned long *);
+
+#endif /* __GLSCHOOL_GL_H__ */
diff --git a/hacks/glx/glslideshow.c b/hacks/glx/glslideshow.c
new file mode 100644
index 0000000..64b1494
--- /dev/null
+++ b/hacks/glx/glslideshow.c
@@ -0,0 +1,1222 @@
+/* glslideshow, Copyright (c) 2003-2014 Jamie Zawinski <jwz@jwz.org>
+ * Loads a sequence of images and smoothly pans around them; crossfades
+ * when loading new images.
+ *
+ * Originally written by Mike Oliphant <oliphant@gtk.org> (c) 2002, 2003.
+ * Rewritten by jwz, 21-Jun-2003.
+ * Rewritten by jwz again, 6-Feb-2005.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ *****************************************************************************
+ *
+ * TODO:
+ *
+ * - When a new image is loaded, there is a glitch: animation pauses during
+ * the period when we're loading the image-to-fade-in. On fast (2GHz)
+ * machines, this stutter is short but noticable (usually around 1/10th
+ * second.) On slower machines, it can be much more pronounced.
+ * This turns out to be hard to fix...
+ *
+ * Image loading happens in three stages:
+ *
+ * 1: Fork a process and run xscreensaver-getimage in the background.
+ * This writes image data to a server-side X pixmap.
+ *
+ * 2: When that completes, a callback informs us that the pixmap is ready.
+ * We must then download the pixmap data from the server with XGetImage
+ * (or XShmGetImage.)
+ *
+ * 3: Once we have the bits, we must convert them from server-native bitmap
+ * layout to 32 bit RGBA in client-endianness, to make them usable as
+ * OpenGL textures.
+ *
+ * 4: We must actually construct a texture.
+ *
+ * So, the speed of step 1 doesn't really matter, since that happens in
+ * the background. But steps 2, 3, and 4 happen in *this* process, and
+ * cause the visible glitch.
+ *
+ * Step 2 can't be moved to another process without opening a second
+ * connection to the X server, which is pretty heavy-weight. (That would
+ * be possible, though; the other process could open an X connection,
+ * retrieve the pixmap, and feed it back to us through a pipe or
+ * something.)
+ *
+ * Step 3 might be able to be optimized by coding tuned versions of
+ * grab-ximage.c:copy_ximage() for the most common depths and bit orders.
+ * (Or by moving it into the other process along with step 2.)
+ *
+ * Step 4 is the hard one, though. It might be possible to speed up this
+ * step if there is some way to allow two GL processes share texture
+ * data. Unless, of course, all the time being consumed by step 4 is
+ * because the graphics pipeline is flooded, in which case, that other
+ * process would starve the screen anyway.
+ *
+ * Is it possible to use a single GLX context in a multithreaded way?
+ * Or use a second GLX context, but allow the two contexts to share data?
+ * I can't find any documentation about this.
+ *
+ * How does Apple do this with their MacOSX slideshow screen saver?
+ * Perhaps it's easier for them because their OpenGL libraries have
+ * thread support at a lower level?
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*useSHM: True \n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n"
+
+# define free_slideshow 0
+# define release_slideshow 0
+# include "xlockmore.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef USE_GL
+
+
+# define DEF_FADE_DURATION "2"
+# define DEF_PAN_DURATION "6"
+# define DEF_IMAGE_DURATION "30"
+# define DEF_ZOOM "75"
+# define DEF_FPS_CUTOFF "5"
+# define DEF_TITLES "False"
+# define DEF_LETTERBOX "True"
+# define DEF_DEBUG "False"
+# define DEF_MIPMAP "True"
+
+#include "grab-ximage.h"
+#include "texfont.h"
+
+typedef struct {
+ double x, y, w, h;
+} rect;
+
+typedef struct {
+ ModeInfo *mi;
+ int id; /* unique number for debugging */
+ char *title; /* the filename of this image */
+ int w, h; /* size in pixels of the image */
+ int tw, th; /* size in pixels of the texture */
+ XRectangle geom; /* where in the image the bits are */
+ Bool loaded_p; /* whether the image has finished loading */
+ Bool used_p; /* whether the image has yet appeared
+ on screen */
+ GLuint texid; /* which texture contains the image */
+ int refcount; /* how many sprites refer to this image */
+} image;
+
+
+typedef enum { NEW, IN, FULL, OUT, DEAD } sprite_state;
+
+typedef struct {
+ int id; /* unique number for debugging */
+ image *img; /* which image this animation displays */
+ GLfloat opacity; /* how to render it */
+ double start_time; /* when this animation began */
+ rect from, to, current; /* the journey this image is taking */
+ sprite_state state; /* the state we're in right now */
+ sprite_state prev_state; /* the state we were in previously */
+ double state_time; /* time of last state change */
+ int frame_count; /* frames since last state change */
+} sprite;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ int nimages; /* how many images are loaded or loading now */
+ image *images[10]; /* pointers to the images */
+
+ int nsprites; /* how many sprites are animating right now */
+ sprite *sprites[10]; /* pointers to the live sprites */
+
+ double now; /* current time in seconds */
+ double dawn_of_time; /* when the program launched */
+ double image_load_time; /* time when we last loaded a new image */
+ double prev_frame_time; /* time when we last drew a frame */
+
+ Bool awaiting_first_image_p; /* Early in startup: nothing to display yet */
+ Bool redisplay_needed_p; /* Sometimes we can get away with not
+ re-painting. Tick this if a redisplay
+ is required. */
+ Bool change_now_p; /* Set when the user clicks to ask for a new
+ image right now. */
+
+ GLfloat fps; /* approximate frame rate we're achieving */
+ GLfloat theoretical_fps; /* maximum frame rate that might be possible */
+ Bool checked_fps_p; /* Whether we have checked for a low
+ frame rate. */
+
+ texture_font_data *font_data; /* for printing image file names */
+
+ int sprite_id, image_id; /* debugging id counters */
+
+ double time_elapsed;
+ int frames_elapsed;
+
+} slideshow_state;
+
+static slideshow_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static int fade_seconds; /* Duration in seconds of fade transitions.
+ If 0, jump-cut instead of fading. */
+static int pan_seconds; /* Duration of each pan through an image. */
+static int image_seconds; /* How many seconds until loading a new image. */
+static int zoom; /* How far in to zoom when panning, in percent of
+ image size: that is, 75 means "when zoomed all
+ the way in, 75% of the image will be visible."
+ */
+static int fps_cutoff; /* If the frame-rate falls below this, turn off
+ zooming.*/
+static Bool letterbox_p; /* When a loaded image is not the same aspect
+ ratio as the window, whether to display black
+ bars.
+ */
+static Bool mipmap_p; /* Use mipmaps instead of single textures. */
+static Bool do_titles; /* Display image titles. */
+static Bool debug_p; /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+ {"-fade", ".fadeDuration", XrmoptionSepArg, 0 },
+ {"-pan", ".panDuration", XrmoptionSepArg, 0 },
+ {"-duration", ".imageDuration", XrmoptionSepArg, 0 },
+ {"-zoom", ".zoom", XrmoptionSepArg, 0 },
+ {"-cutoff", ".FPScutoff", XrmoptionSepArg, 0 },
+ {"-titles", ".titles", XrmoptionNoArg, "True" },
+ {"-letterbox", ".letterbox", XrmoptionNoArg, "True" },
+ {"-no-letterbox", ".letterbox", XrmoptionNoArg, "False" },
+ {"-clip", ".letterbox", XrmoptionNoArg, "False" },
+ {"-mipmaps", ".mipmap", XrmoptionNoArg, "True" },
+ {"-no-mipmaps", ".mipmap", XrmoptionNoArg, "False" },
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ { &fade_seconds, "fadeDuration", "FadeDuration", DEF_FADE_DURATION, t_Int},
+ { &pan_seconds, "panDuration", "PanDuration", DEF_PAN_DURATION, t_Int},
+ { &image_seconds, "imageDuration","ImageDuration",DEF_IMAGE_DURATION, t_Int},
+ { &zoom, "zoom", "Zoom", DEF_ZOOM, t_Int},
+ { &mipmap_p, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ { &letterbox_p, "letterbox", "Letterbox", DEF_LETTERBOX, t_Bool},
+ { &fps_cutoff, "FPScutoff", "FPSCutoff", DEF_FPS_CUTOFF, t_Int},
+ { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+ { &do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt slideshow_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static const char *
+blurb (void)
+{
+# ifdef HAVE_JWXYZ
+ return "GLSlideshow";
+# else
+ static char buf[255];
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+# endif
+}
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure);
+
+
+/* Allocate an image structure and start a file loading in the background.
+ */
+static image *
+alloc_image (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = (image *) calloc (1, sizeof (*img));
+
+ img->id = ++ss->image_id;
+ img->loaded_p = False;
+ img->used_p = False;
+ img->mi = mi;
+
+ glGenTextures (1, &img->texid);
+ if (img->texid <= 0) abort();
+
+ ss->image_load_time = ss->now;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, img);
+ else
+ load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
+ 0, 0, mipmap_p, img->texid, image_loaded_cb, img);
+
+ ss->images[ss->nimages++] = img;
+ if (ss->nimages >= countof(ss->images)) abort();
+
+ return img;
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ image *img = (image *) closure;
+ ModeInfo *mi = img->mi;
+ /* slideshow_state *ss = &sss[MI_SCREEN(mi)]; */
+
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (wire)
+ {
+ img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+ img->h = MI_HEIGHT (mi);
+ img->geom.width = img->w;
+ img->geom.height = img->h;
+ goto DONE;
+ }
+
+ if (image_width == 0 || image_height == 0)
+ exit (1);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ img->w = image_width;
+ img->h = image_height;
+ img->tw = texture_width;
+ img->th = texture_height;
+ img->geom = *geom;
+ img->title = (filename ? strdup (filename) : 0);
+
+ /* If the image's width doesn't come back as the width of the screen,
+ then the image must have been scaled down (due to insufficient
+ texture memory.) Scale up the coordinates to stretch the image
+ to fill the window.
+ */
+ if (img->w != MI_WIDTH(mi))
+ {
+ double scale = (double) MI_WIDTH(mi) / img->w;
+ img->w *= scale;
+ img->h *= scale;
+ img->tw *= scale;
+ img->th *= scale;
+ img->geom.x *= scale;
+ img->geom.y *= scale;
+ img->geom.width *= scale;
+ img->geom.height *= scale;
+ }
+
+ /* xscreensaver-getimage returns paths relative to the image directory
+ now, so leave the sub-directory part in. Unless it's an absolute path.
+ */
+ if (img->title && img->title[0] == '/')
+ {
+ /* strip filename to part between last "/" and last ".". */
+ char *s = strrchr (img->title, '/');
+ if (s) strcpy (img->title, s+1);
+ s = strrchr (img->title, '.');
+ if (s) *s = 0;
+ }
+
+ if (debug_p)
+ fprintf (stderr, "%s: loaded img %2d: \"%s\"\n",
+ blurb(), img->id, (img->title ? img->title : "(null)"));
+ DONE:
+
+ img->loaded_p = True;
+}
+
+
+
+/* Free the image and texture, after nobody is referencing it.
+ */
+static void
+destroy_image (ModeInfo *mi, image *img)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ int i;
+
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->texid <= 0) abort();
+ if (img->refcount != 0) abort();
+
+ for (i = 0; i < ss->nimages; i++) /* unlink it from the list */
+ if (ss->images[i] == img)
+ {
+ int j;
+ for (j = i; j < ss->nimages-1; j++) /* pull remainder forward */
+ ss->images[j] = ss->images[j+1];
+ ss->images[j] = 0;
+ ss->nimages--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+
+ if (debug_p)
+ fprintf (stderr, "%s: unloaded img %2d: \"%s\"\n",
+ blurb(), img->id, (img->title ? img->title : "(null)"));
+
+ if (img->title) free (img->title);
+ glDeleteTextures (1, &img->texid);
+ free (img);
+}
+
+
+/* Return an image to use for a sprite.
+ If it's time for a new one, get a new one.
+ Otherwise, use an old one.
+ Might return 0 if the machine is really slow.
+ */
+static image *
+get_image (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = 0;
+ double now = ss->now;
+ Bool want_new_p = (ss->change_now_p ||
+ ss->image_load_time + image_seconds <= now);
+ image *new_img = 0;
+ image *old_img = 0;
+ image *loading_img = 0;
+ int i;
+
+ for (i = 0; i < ss->nimages; i++)
+ {
+ image *img2 = ss->images[i];
+ if (!img2) abort();
+ if (!img2->loaded_p)
+ loading_img = img2;
+ else if (!img2->used_p)
+ new_img = img2;
+ else
+ old_img = img2;
+ }
+
+ if (want_new_p && new_img)
+ img = new_img, new_img = 0, ss->change_now_p = False;
+ else if (old_img)
+ img = old_img, old_img = 0;
+ else if (new_img)
+ img = new_img, new_img = 0, ss->change_now_p = False;
+
+ /* Make sure that there is always one unused image in the pipe.
+ */
+ if (!new_img && !loading_img)
+ alloc_image (mi);
+
+ return img;
+}
+
+
+/* Pick random starting and ending positions for the given sprite.
+ */
+static void
+randomize_sprite (ModeInfo *mi, sprite *sp)
+{
+ int vp_w = MI_WIDTH(mi);
+ int vp_h = MI_HEIGHT(mi);
+ int img_w = sp->img->geom.width;
+ int img_h = sp->img->geom.height;
+ int min_w, max_w;
+ double ratio = (double) img_h / img_w;
+
+ if (letterbox_p)
+ {
+ min_w = img_w;
+ }
+ else
+ {
+ if (img_w < vp_w)
+ min_w = vp_w;
+ else
+ min_w = img_w * (float) vp_h / img_h;
+ }
+
+ max_w = min_w * 100 / zoom;
+
+ sp->from.w = min_w + frand ((max_w - min_w) * 0.4);
+ sp->to.w = max_w - frand ((max_w - min_w) * 0.4);
+ sp->from.h = sp->from.w * ratio;
+ sp->to.h = sp->to.w * ratio;
+
+ if (zoom == 100) /* only one box, and it is centered */
+ {
+ sp->from.x = (sp->from.w > vp_w
+ ? -(sp->from.w - vp_w) / 2
+ : (vp_w - sp->from.w) / 2);
+ sp->from.y = (sp->from.h > vp_h
+ ? -(sp->from.h - vp_h) / 2
+ : (vp_h - sp->from.h) / 2);
+ sp->to = sp->from;
+ }
+ else /* position both boxes randomly */
+ {
+ sp->from.x = (sp->from.w > vp_w
+ ? -frand (sp->from.w - vp_w)
+ : frand (vp_w - sp->from.w));
+ sp->from.y = (sp->from.h > vp_h
+ ? -frand (sp->from.h - vp_h)
+ : frand (vp_h - sp->from.h));
+ sp->to.x = (sp->to.w > vp_w
+ ? -frand (sp->to.w - vp_w)
+ : frand (vp_w - sp->to.w));
+ sp->to.y = (sp->to.h > vp_h
+ ? -frand (sp->to.h - vp_h)
+ : frand (vp_h - sp->to.h));
+ }
+
+ if (random() & 1)
+ {
+ rect swap = sp->to;
+ sp->to = sp->from;
+ sp->from = swap;
+ }
+
+ /* Make sure the aspect ratios are within 0.001 of each other.
+ */
+ {
+ int r1 = 0.5 + (sp->from.w * 1000 / sp->from.h);
+ int r2 = 0.5 + (sp->to.w * 1000 / sp->to.h);
+ if (r1 < r2-1 || r1 > r2+1)
+ {
+ fprintf (stderr,
+ "%s: botched aspect: %f x %f (%d) vs %f x %f (%d): %s\n",
+ progname,
+ sp->from.w, sp->from.h, r1,
+ sp->to.w, sp->to.h, r2,
+ (sp->img->title ? sp->img->title : "[null]"));
+ abort();
+ }
+ }
+
+ sp->from.x /= vp_w;
+ sp->from.y /= vp_h;
+ sp->from.w /= vp_w;
+ sp->from.h /= vp_h;
+ sp->to.x /= vp_w;
+ sp->to.y /= vp_h;
+ sp->to.w /= vp_w;
+ sp->to.h /= vp_h;
+}
+
+
+/* Allocate a new sprite and start its animation going.
+ */
+static sprite *
+new_sprite (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = get_image (mi);
+ sprite *sp;
+
+ if (!img)
+ {
+ /* Oops, no images yet! The machine is probably hurting bad.
+ Let's give it some time before thrashing again. */
+ usleep (250000);
+ return 0;
+ }
+
+ sp = (sprite *) calloc (1, sizeof (*sp));
+ sp->id = ++ss->sprite_id;
+ sp->start_time = ss->now;
+ sp->state_time = sp->start_time;
+ sp->state = sp->prev_state = NEW;
+ sp->img = img;
+
+ sp->img->refcount++;
+ sp->img->used_p = True;
+
+ ss->sprites[ss->nsprites++] = sp;
+ if (ss->nsprites >= countof(ss->sprites)) abort();
+
+ randomize_sprite (mi, sp);
+
+ return sp;
+}
+
+
+/* Free the given sprite, and decrement the reference count on its image.
+ */
+static void
+destroy_sprite (ModeInfo *mi, sprite *sp)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ image *img;
+ int i;
+
+ if (!sp) abort();
+ if (sp->state != DEAD) abort();
+ img = sp->img;
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->refcount <= 0) abort();
+
+ for (i = 0; i < ss->nsprites; i++) /* unlink it from the list */
+ if (ss->sprites[i] == sp)
+ {
+ int j;
+ for (j = i; j < ss->nsprites-1; j++) /* pull remainder forward */
+ ss->sprites[j] = ss->sprites[j+1];
+ ss->sprites[j] = 0;
+ ss->nsprites--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+ free (sp);
+ sp = 0;
+
+ img->refcount--;
+ if (img->refcount < 0) abort();
+ if (img->refcount == 0)
+ destroy_image (mi, img);
+}
+
+
+/* Updates the sprite for the current frame of the animation based on
+ its creation time compared to the current wall clock.
+ */
+static void
+tick_sprite (ModeInfo *mi, sprite *sp)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = sp->img;
+ double now = ss->now;
+ double secs;
+ double ratio;
+ rect prev_rect = sp->current;
+ GLfloat prev_opacity = sp->opacity;
+
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+
+ secs = now - sp->start_time;
+ ratio = secs / (pan_seconds + fade_seconds);
+ if (ratio > 1) ratio = 1;
+
+ sp->current.x = sp->from.x + ratio * (sp->to.x - sp->from.x);
+ sp->current.y = sp->from.y + ratio * (sp->to.y - sp->from.y);
+ sp->current.w = sp->from.w + ratio * (sp->to.w - sp->from.w);
+ sp->current.h = sp->from.h + ratio * (sp->to.h - sp->from.h);
+
+ sp->prev_state = sp->state;
+
+ if (secs < fade_seconds)
+ {
+ sp->state = IN;
+ sp->opacity = secs / (GLfloat) fade_seconds;
+ }
+ else if (secs < pan_seconds)
+ {
+ sp->state = FULL;
+ sp->opacity = 1;
+ }
+ else if (secs < pan_seconds + fade_seconds)
+ {
+ sp->state = OUT;
+ sp->opacity = 1 - ((secs - pan_seconds) / (GLfloat) fade_seconds);
+ }
+ else
+ {
+ sp->state = DEAD;
+ sp->opacity = 0;
+ }
+
+ if (sp->state != sp->prev_state &&
+ (sp->prev_state == IN ||
+ sp->prev_state == FULL))
+ {
+ double secs = now - sp->state_time;
+
+ if (debug_p)
+ fprintf (stderr,
+ "%s: %s %3d frames %2.0f sec %5.1f fps (%.1f fps?)\n",
+ blurb(),
+ (sp->prev_state == IN ? "fade" : "pan "),
+ sp->frame_count,
+ secs,
+ sp->frame_count / secs,
+ ss->theoretical_fps);
+
+ sp->state_time = now;
+ sp->frame_count = 0;
+ }
+
+ sp->frame_count++;
+
+ if (sp->state != DEAD &&
+ (prev_rect.x != sp->current.x ||
+ prev_rect.y != sp->current.y ||
+ prev_rect.w != sp->current.w ||
+ prev_rect.h != sp->current.h ||
+ prev_opacity != sp->opacity))
+ ss->redisplay_needed_p = True;
+}
+
+
+/* Draw the given sprite at the phase of its animation dictated by
+ its creation time compared to the current wall clock.
+ */
+static void
+draw_sprite (ModeInfo *mi, sprite *sp)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = sp->img;
+
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+
+ glPushMatrix();
+ {
+ glTranslatef (sp->current.x, sp->current.y, 0);
+ glScalef (sp->current.w, sp->current.h, 1);
+
+ if (wire) /* Draw a grid inside the box */
+ {
+ GLfloat dy = 0.1;
+ GLfloat dx = dy * img->w / img->h;
+ GLfloat x, y;
+
+ if (sp->id & 1)
+ glColor4f (sp->opacity, 0, 0, 1);
+ else
+ glColor4f (0, 0, sp->opacity, 1);
+
+ glBegin(GL_LINES);
+ glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
+
+ for (y = 0; y < 1+dy; y += dy)
+ {
+ GLfloat yy = (y > 1 ? 1 : y);
+ for (x = 0.5; x < 1+dx; x += dx)
+ {
+ GLfloat xx = (x > 1 ? 1 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ for (x = 0.5; x > -dx; x -= dx)
+ {
+ GLfloat xx = (x < 0 ? 0 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ }
+ glEnd();
+ }
+ else /* Draw the texture quad */
+ {
+ GLfloat texw = img->geom.width / (GLfloat) img->tw;
+ GLfloat texh = img->geom.height / (GLfloat) img->th;
+ GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
+ GLfloat texy1 = img->geom.y / (GLfloat) img->th;
+ GLfloat texx2 = texx1 + texw;
+ GLfloat texy2 = texy1 + texh;
+
+ glBindTexture (GL_TEXTURE_2D, img->texid);
+ glColor4f (1, 1, 1, sp->opacity);
+ glNormal3f (0, 0, 1);
+ glBegin (GL_QUADS);
+ glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+ glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+ glTexCoord2f (texx2, texy1); glVertex3f (1, 1, 0);
+ glTexCoord2f (texx1, texy1); glVertex3f (0, 1, 0);
+ glEnd();
+
+ if (debug_p) /* Draw a border around the image */
+ {
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ if (sp->id & 1)
+ glColor4f (sp->opacity, 0, 0, 1);
+ else
+ glColor4f (0, 0, sp->opacity, 1);
+
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+ }
+
+
+ if (do_titles &&
+ img->title && *img->title &&
+ (sp->state == IN || sp->state == FULL))
+ {
+ glColor4f (1, 1, 1, sp->opacity);
+ print_texture_label (mi->dpy, ss->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, img->title);
+ }
+ }
+ glPopMatrix();
+
+ if (debug_p)
+ {
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ if (sp->id & 1)
+ glColor4f (1, 0, 0, 1);
+ else
+ glColor4f (0, 0, 1, 1);
+
+ /* Draw the "from" and "to" boxes
+ */
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (sp->from.x, sp->from.y, 0);
+ glVertex3f (sp->from.x + sp->from.w, sp->from.y, 0);
+ glVertex3f (sp->from.x + sp->from.w, sp->from.y + sp->from.h, 0);
+ glVertex3f (sp->from.x, sp->from.y + sp->from.h, 0);
+ glEnd();
+
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (sp->to.x, sp->to.y, 0);
+ glVertex3f (sp->to.x + sp->to.w, sp->to.y, 0);
+ glVertex3f (sp->to.x + sp->to.w, sp->to.y + sp->to.h, 0);
+ glVertex3f (sp->to.x, sp->to.y + sp->to.h, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+}
+
+
+static void
+tick_sprites (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ tick_sprite (mi, ss->sprites[i]);
+}
+
+
+static void
+draw_sprites (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+/*
+ {
+ GLfloat rot = current_device_rotation();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ glTranslatef (-0.5, -0.5, 0);
+ }
+*/
+
+ for (i = 0; i < ss->nsprites; i++)
+ draw_sprite (mi, ss->sprites[i]);
+ glPopMatrix();
+
+ if (debug_p) /* draw a white box (the "screen") */
+ {
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ glColor4f (1, 1, 1, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+}
+
+
+ENTRYPOINT void
+reshape_slideshow (ModeInfo *mi, int width, int height)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ GLfloat s;
+ glViewport (0, 0, width, height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity();
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity();
+
+ s = 2;
+
+ if (debug_p)
+ {
+ s *= (zoom / 100.0) * 0.75;
+ if (s < 0.1) s = 0.1;
+ }
+
+ glScalef (s, s, s);
+ glTranslatef (-0.5, -0.5, 0);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ ss->redisplay_needed_p = True;
+}
+
+
+ENTRYPOINT Bool
+slideshow_handle_event (ModeInfo *mi, XEvent *event)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (event->xany.type == Expose ||
+ event->xany.type == GraphicsExpose ||
+ event->xany.type == VisibilityNotify)
+ {
+ ss->redisplay_needed_p = True;
+ if (debug_p)
+ fprintf (stderr, "%s: exposure\n", blurb());
+ return False;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ ss->change_now_p = True;
+ return True;
+ }
+
+ return False;
+}
+
+
+/* Do some sanity checking on various user-supplied values, and make
+ sure they are all internally consistent.
+ */
+static void
+sanity_check (ModeInfo *mi)
+{
+ if (zoom < 1) zoom = 1; /* zoom is a positive percentage */
+ else if (zoom > 100) zoom = 100;
+
+ if (zoom == 100) /* with no zooming, there is no panning */
+ pan_seconds = 0;
+
+ if (pan_seconds < fade_seconds) /* pan is inclusive of fade */
+ pan_seconds = fade_seconds;
+
+ if (pan_seconds == 0) /* no zero-length cycles, please... */
+ pan_seconds = 1;
+
+ if (image_seconds < pan_seconds) /* we only change images at fade-time */
+ image_seconds = pan_seconds;
+
+ /* If we're not panning/zooming within the image, then there's no point
+ in crossfading the image with itself -- only do crossfades when changing
+ to a new image. */
+ if (zoom == 100 && pan_seconds < image_seconds)
+ pan_seconds = image_seconds;
+
+ /* No need to use mipmaps if we're not changing the image size much */
+ if (zoom >= 80) mipmap_p = False;
+
+ if (fps_cutoff < 0) fps_cutoff = 0;
+ else if (fps_cutoff > 30) fps_cutoff = 30;
+}
+
+
+static void
+check_fps (ModeInfo *mi)
+{
+#ifndef HAVE_JWXYZ /* always assume Cocoa and mobile are fast enough */
+
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+
+ double start_time, end_time, wall_elapsed, frame_duration, fps;
+ int i;
+
+ start_time = ss->now;
+ end_time = double_time();
+ frame_duration = end_time - start_time; /* time spent drawing this frame */
+ ss->time_elapsed += frame_duration; /* time spent drawing all frames */
+ ss->frames_elapsed++;
+
+ wall_elapsed = end_time - ss->dawn_of_time;
+ fps = ss->frames_elapsed / ss->time_elapsed;
+ ss->theoretical_fps = fps;
+
+ if (ss->checked_fps_p) return;
+
+ if (wall_elapsed <= 8) /* too early to be sure */
+ return;
+
+ ss->checked_fps_p = True;
+
+ if (fps >= fps_cutoff)
+ {
+ if (debug_p)
+ fprintf (stderr,
+ "%s: %.1f fps is fast enough (with %d frames in %.1f secs)\n",
+ blurb(), fps, ss->frames_elapsed, wall_elapsed);
+ return;
+ }
+
+ fprintf (stderr,
+ "%s: only %.1f fps! Turning off pan/fade to compensate...\n",
+ blurb(), fps);
+ zoom = 100;
+ fade_seconds = 0;
+
+ sanity_check (mi);
+
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ randomize_sprite (mi, sp);
+ sp->state = FULL;
+ }
+
+ ss->redisplay_needed_p = True;
+
+ /* Need this in case zoom changed. */
+ reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
+#endif /* HAVE_JWXYZ */
+}
+
+
+/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
+ */
+static void
+hack_resources (void)
+{
+#if 0
+ char *res = "desktopGrabber";
+ char *val = get_string_resource (res, "DesktopGrabber");
+ char buf1[255];
+ char buf2[255];
+ XrmValue value;
+ sprintf (buf1, "%.100s.%.100s", progclass, res);
+ sprintf (buf2, "%.200s -v", val);
+ value.addr = buf2;
+ value.size = strlen(buf2);
+ XrmPutResource (&db, buf1, "String", &value);
+#endif
+}
+
+
+ENTRYPOINT void
+init_slideshow (ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ slideshow_state *ss;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sss);
+ ss = &sss[screen];
+
+ if ((ss->glx_context = init_GL(mi)) != NULL) {
+ reshape_slideshow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ if (debug_p)
+ fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n",
+ blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
+
+ sanity_check(mi);
+
+ if (debug_p)
+ fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n\n",
+ blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (GL_FALSE);
+ glEnable (GL_CULL_FACE);
+ glCullFace (GL_BACK);
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ if (debug_p) glLineWidth (3);
+
+ ss->font_data = load_texture_font (mi->dpy, "titleFont");
+
+ if (debug_p)
+ hack_resources();
+
+ ss->now = double_time();
+ ss->dawn_of_time = ss->now;
+ ss->prev_frame_time = ss->now;
+
+ ss->awaiting_first_image_p = True;
+ alloc_image (mi);
+}
+
+
+ENTRYPOINT void
+draw_slideshow (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ if (!ss->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ss->glx_context));
+
+ if (ss->awaiting_first_image_p)
+ {
+ image *img = ss->images[0];
+ if (!img) abort();
+ if (!img->loaded_p)
+ return;
+
+ ss->awaiting_first_image_p = False;
+ ss->dawn_of_time = double_time();
+
+ /* start the very first sprite fading in */
+ new_sprite (mi);
+ }
+
+ ss->now = double_time();
+
+ /* Each sprite has three states: fading in, full, fading out.
+ The in/out states overlap like this:
+
+ iiiiiiFFFFFFFFFFFFoooooo . . . . . . . . . . . . . . . . .
+ . . . . . . . . . iiiiiiFFFFFFFFFFFFoooooo . . . . . . . .
+ . . . . . . . . . . . . . . . . . . iiiiiiFFFFFFFFFFFFooooo
+
+ So as soon as a sprite goes into the "out" state, we create
+ a new sprite (in the "in" state.)
+ */
+
+ if (ss->nsprites > 2) abort();
+
+ /* If a sprite is just entering the fade-out state,
+ then add a new sprite in the fade-in state.
+ */
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->state != sp->prev_state &&
+ sp->state == (fade_seconds == 0 ? DEAD : OUT))
+ new_sprite (mi);
+ }
+
+ tick_sprites (mi);
+
+ /* Now garbage collect the dead sprites.
+ */
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->state == DEAD)
+ {
+ destroy_sprite (mi, sp);
+ i--;
+ }
+ }
+
+ /* We can only ever end up with no sprites at all if the machine is
+ being really slow and we hopped states directly from FULL to DEAD
+ without passing OUT... */
+ if (ss->nsprites == 0)
+ new_sprite (mi);
+
+ if (!ss->redisplay_needed_p)
+ return;
+
+ if (debug_p && ss->now - ss->prev_frame_time > 1)
+ fprintf (stderr, "%s: static screen for %.1f secs\n",
+ blurb(), ss->now - ss->prev_frame_time);
+
+ draw_sprites (mi);
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+ ss->prev_frame_time = ss->now;
+ ss->redisplay_needed_p = False;
+ check_fps (mi);
+}
+
+XSCREENSAVER_MODULE_2 ("GLSlideshow", glslideshow, slideshow)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glslideshow.man b/hacks/glx/glslideshow.man
new file mode 100644
index 0000000..4ce4672
--- /dev/null
+++ b/hacks/glx/glslideshow.man
@@ -0,0 +1,131 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glslideshow - slideshow of images using smooth zooming and fades
+.SH SYNOPSIS
+.B glslideshow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-duration \fIseconds\fP]
+[\-zoom \fIpercent\fP]
+[\-pan \fIseconds\fP]
+[\-fade \fIseconds\fP]
+[\-titles]
+[\-letterbox | \-clip]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-debug]
+[\-wireframe]
+[\-cutoff \fIint\fP]
+.SH DESCRIPTION
+Loads a random sequence of images and smoothly scans and zooms around
+in each, fading from pan to pan.
+
+This program requires a good video card capable of supporting large
+textures.
+
+To specify the directory that images are loaded from, run
+.BR xscreensaver-demo (1)
+and click on the "Advanced" tab.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-duration \fIseconds\fP
+How long each image will be displayed before loading a new one.
+Default 30 seconds.
+.TP 8
+.B \-pan \fIseconds\fP
+How long each pan-and-zoom should last. Default 6 seconds.
+
+With the default settings of \fI\-pan 6 \-duration 30\fP, each image
+will be displayed five times (30/6), and then a new image will be loaded.
+If you want a new image to be loaded at each fade, then set \fI\-pan\fP
+and \fI\-duration\fP to the same value.
+.TP 8
+.B \-fade \fIseconds\fP
+How long each cross-fade between images should last. Default 2 seconds.
+If set to 0, then no cross-fading will be done (all transitions
+will be jump-cuts.)
+
+Note that fades are included in the pan time, so \fI\-fade\fP cannot
+be larger than \fI\-pan\fP.
+.TP 8
+.B \-zoom \fInumber\fP
+Amount to zoom and pan as a percentage. Default: 75, meaning that
+75% or more of each image will always be visible. If set to 100%,
+then the images will always fill the screen, and no panning or
+zooming will occur. (Images will still smoothly fade from one
+to another if \fI\-fade\fP is non-zero.)
+.TP 8
+.B \-titles
+Whether to print the file name of the current image in the upper left corner.
+.TP 8
+.B \-letterbox
+In "letterbox" mode, when an image is not the same aspect ratio as the screen,
+black bars will appear at the top/bottom or left/right so that the whole
+image can be displayed. This is the default.
+.TP 8
+.B \-clip
+In "clip" mode, when an image is not the same aspect ratio as the screen,
+we will zoom in further until the image takes up the whole screen.
+This is the opposite of \fI\-letterbox\fP.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-cutoff \fInumber\fP
+If the frame rate we are achieving is lower than this, then panning,
+fading, and zooming will be disabled. Default 5 FPS.
+
+The idea here is that if your machine can't maintain a decent frame
+rate, then it must not have fast 3D hardware, so we might as well
+behave in a simpler manner. Set this to 0 to disable this check.
+.TP 8
+.B \-debug
+Prints debugging info to stderr.
+.TP 8
+.B \-wireframe
+Another debug mode.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver-demo (1),
+.BR xscreensaver-getimage (1),
+.BR xscreensaver (1),
+.BR carousel (MANSUFFIX)
+.BR photopile (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 2003-2005 by Jamie Zawinski, based on an earlier version
+that was
+Copyright \(co 2002 by Mike Oliphant.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski and Mike Oliphant.
diff --git a/hacks/glx/glsnake.c b/hacks/glx/glsnake.c
new file mode 100644
index 0000000..5f20421
--- /dev/null
+++ b/hacks/glx/glsnake.c
@@ -0,0 +1,2694 @@
+/* glsnake.c - OpenGL imitation of Rubik's Snake
+ *
+ * (c) 2001-2005 Jamie Wilkinson <jaq@spacepants.org>
+ * (c) 2001-2003 Andrew Bennetts <andrew@puzzling.org>
+ * (c) 2001-2003 Peter Aylett <peter@ylett.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* HAVE_GLUT defined if we're building a standalone glsnake,
+ * and not defined if we're building as an xscreensaver hack */
+#ifdef HAVE_GLUT
+# include <GL/glut.h>
+#else
+# ifdef HAVE_JWXYZ
+# define HAVE_GETTIMEOFDAY
+# else
+# include <GL/gl.h>
+# include <GL/glu.h>
+# endif
+#endif
+# ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef STANDALONE
+# include "xlockmoreI.h"
+#endif
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* angles */
+#define ZERO 0.0
+#define LEFT 90.0
+#define PIN 180.0
+#define RIGHT 270.0
+
+#ifdef HAVE_GETTIMEOFDAY
+# ifdef GETTIMEOFDAY_TWO_ARGS
+
+# include <sys/time.h>
+# include <time.h>
+ typedef struct timeval snaketime;
+# define GETSECS(t) ((t).tv_sec)
+# define GETMSECS(t) ((t).tv_usec/1000)
+
+# else /* !GETTIMEOFDAY_TWO_ARGS */
+
+# include <sys/time.h>
+# include <time.h>
+ typedef struct timeval snaketime;
+# define GETSECS(t) ((t).tv_sec)
+# define GETMSECS(t) ((t).tv_usec/1000)
+
+# endif /* GETTIMEOFDAY_TWO_ARGS */
+
+#else /* !HAVE_GETTIMEOFDAY */
+# ifdef HAVE_FTIME
+
+# include <sys/timeb.h>
+ typedef struct timeb snaketime;
+# define GETSECS(t) ((long)(t).time)
+# define GETMSECS(t) ((t).millitm/1000)
+
+# endif /* HAVE_FTIME */
+#endif /* HAVE_GETTIMEOFDAY */
+
+#include <math.h>
+
+#ifndef M_SQRT1_2 /* Win32 doesn't have this constant */
+#define M_SQRT1_2 0.70710678118654752440084436210485
+#endif
+
+#define NODE_COUNT 24
+
+#ifdef HAVE_GLUT
+#define DEF_YANGVEL 0.10
+#define DEF_ZANGVEL 0.14
+#define DEF_EXPLODE 0.03
+#define DEF_ANGVEL 1.0
+#define DEF_STATICTIME 5000
+#define DEF_ALTCOLOUR 0
+#define DEF_TITLES 0
+#define DEF_INTERACTIVE 0
+#define DEF_ZOOM 25.0
+#define DEF_WIREFRAME 0
+#define DEF_TRANSPARENT 1
+#else
+/* xscreensaver options doobies prefer strings */
+#define DEF_YANGVEL "0.10"
+#define DEF_ZANGVEL "0.14"
+#define DEF_EXPLODE "0.03"
+#define DEF_ANGVEL "1.0"
+#define DEF_STATICTIME "5000"
+#define DEF_ALTCOLOUR "False"
+#define DEF_TITLES "False"
+#define DEF_INTERACTIVE "False"
+#define DEF_ZOOM "25.0"
+#define DEF_WIREFRAME "False"
+#define DEF_TRANSPARENT "True"
+#endif
+
+/* static variables */
+
+static GLfloat explode;
+static long statictime;
+static GLfloat yspin = 60.0;
+static GLfloat zspin = -45.0;
+static GLfloat yangvel;
+static GLfloat zangvel;
+static Bool altcolour;
+static Bool titles;
+static Bool interactive;
+static Bool wireframe;
+static Bool transparent;
+static GLfloat zoom;
+static GLfloat angvel;
+
+#ifndef HAVE_GLUT
+
+#define glsnake_init init_glsnake
+#define glsnake_display draw_glsnake
+#define glsnake_reshape reshape_glsnake
+#define free_glsnake 0
+#define release_glsnake 0
+#define glsnake_handle_event xlockmore_no_events
+
+/* xscreensaver defaults */
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*labelfont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "texfont.h"
+
+static XrmOptionDescRec opts[] = {
+ { "-explode", ".explode", XrmoptionSepArg, DEF_EXPLODE },
+ { "-angvel", ".angvel", XrmoptionSepArg, DEF_ANGVEL },
+ { "-statictime", ".statictime", XrmoptionSepArg, DEF_STATICTIME },
+ { "-yangvel", ".yangvel", XrmoptionSepArg, DEF_YANGVEL },
+ { "-zangvel", ".zangvel", XrmoptionSepArg, DEF_ZANGVEL },
+ { "-altcolour", ".altcolour", XrmoptionNoArg, "True" },
+ { "-no-altcolour", ".altcolour", XrmoptionNoArg, "False" },
+ { "-titles", ".titles", XrmoptionNoArg, "True" },
+ { "-no-titles", ".titles", XrmoptionNoArg, "False" },
+ { "-zoom", ".zoom", XrmoptionSepArg, DEF_ZOOM },
+ { "-wireframe", ".wireframe", XrmoptionNoArg, "true" },
+ { "-no-wireframe", ".wireframe", XrmoptionNoArg, "false" },
+ { "-transparent", ".transparent", XrmoptionNoArg, "true" },
+ { "-no-transparent", ".transparent", XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+ {&explode, "explode", "Explode", DEF_EXPLODE, t_Float},
+ {&angvel, "angvel", "Angular Velocity", DEF_ANGVEL, t_Float},
+ {&statictime, "statictime", "Static Time", DEF_STATICTIME, t_Int},
+ {&yangvel, "yangvel", "Angular Velocity about Y axis", DEF_YANGVEL, t_Float},
+ {&zangvel, "zangvel", "Angular Velocity about X axis", DEF_ZANGVEL, t_Float},
+ {&interactive, "interactive", "Interactive", DEF_INTERACTIVE, t_Bool},
+ {&altcolour, "altcolour", "Alternate Colour Scheme", DEF_ALTCOLOUR, t_Bool},
+ {&titles, "titles", "Titles", DEF_TITLES, t_Bool},
+ {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
+ {&wireframe, "wireframe", "Wireframe", DEF_WIREFRAME, t_Bool},
+ {&transparent, "transparent", "Transparent!", DEF_TRANSPARENT, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt glsnake_opts = {countof(opts), opts, countof(vars), vars, NULL};
+#endif
+
+struct model_s {
+ const char * name;
+ float node[NODE_COUNT];
+};
+
+struct glsnake_cfg {
+#ifndef HAVE_GLUT
+ GLXContext * glx_context;
+ texture_font_data *font_data;
+#else
+ /* font list number */
+ int font;
+#endif
+
+ /* window id */
+ int window;
+
+ /* is a morph in progress? */
+ int morphing;
+
+ /* has the model been paused? */
+ int paused;
+
+ /* snake metrics */
+ int is_cyclic;
+ int is_legal;
+ float last_turn;
+ int debug;
+
+ /* the shape of the model */
+ float node[NODE_COUNT];
+
+ /* currently selected node for interactive mode */
+ int selected;
+
+ /* models */
+ unsigned int prev_model;
+ unsigned int next_model;
+
+ /* model morphing */
+ int new_morph;
+
+ /* colours */
+ float colour[2][4];
+ int next_colour;
+ int prev_colour;
+
+ /* timing variables */
+ snaketime last_iteration;
+ snaketime last_morph;
+
+ /* window size */
+ int width, height;
+ int old_width, old_height;
+
+ /* the id of the display lists for drawing a node */
+ GLuint node_solid, node_wire;
+ int node_polys;
+
+ /* is the window fullscreen? */
+ int fullscreen;
+};
+
+#define COLOUR_CYCLIC 0
+#define COLOUR_ACYCLIC 1
+#define COLOUR_INVALID 2
+#define COLOUR_AUTHENTIC 3
+#define COLOUR_ORIGLOGO 4
+
+static const float colour[][2][4] = {
+ /* cyclic - green */
+ { { 0.4, 0.8, 0.2, 0.6 },
+ { 1.0, 1.0, 1.0, 0.6 } },
+ /* acyclic - blue */
+ { { 0.3, 0.1, 0.9, 0.6 },
+ { 1.0, 1.0, 1.0, 0.6 } },
+ /* invalid - grey */
+ { { 0.3, 0.1, 0.9, 0.6 },
+ { 1.0, 1.0, 1.0, 0.6 } },
+ /* authentic - purple and green */
+ { { 0.38, 0.0, 0.55, 0.7 },
+ { 0.0, 0.5, 0.34, 0.7 } },
+ /* old "authentic" colours from the logo */
+ { { 171/255.0, 0, 1.0, 1.0 },
+ { 46/255.0, 205/255.0, 227/255.0, 1.0 } }
+};
+
+static const struct model_s model[] = {
+#define STRAIGHT_MODEL 0
+ { "straight",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ /* the models in the Rubik's snake manual */
+ { "ball",
+ { RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT,
+ RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT,
+ RIGHT, LEFT, RIGHT, LEFT, ZERO }
+ },
+#define START_MODEL 2
+ { "snow",
+ { RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT,
+ RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT,
+ RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "propellor",
+ { ZERO, ZERO, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO, ZERO,
+ ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO, ZERO, ZERO, RIGHT,
+ LEFT, RIGHT, ZERO, LEFT }
+ },
+ { "flamingo",
+ { ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, RIGHT, PIN,
+ RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, ZERO, ZERO,
+ ZERO, PIN, ZERO }
+ },
+ { "cat",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN,
+ ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "rooster",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, LEFT, RIGHT, PIN, RIGHT,
+ ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, LEFT, ZERO,
+ PIN, ZERO }
+ },
+ /* These models were taken from Andrew and Peter's original snake.c
+ * as well as some newer ones made up by Jamie, Andrew and Peter. */
+ { "half balls",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT,
+ LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT,
+ RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "zigzag1",
+ { RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT,
+ LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT,
+ RIGHT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "zigzag2",
+ { PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN,
+ ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN,
+ ZERO }
+ },
+ { "zigzag3",
+ { PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN,
+ LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN,
+ ZERO }
+ },
+ { "caterpillar",
+ { RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT,
+ LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN,
+ LEFT, LEFT, ZERO }
+ },
+ { "bow",
+ { RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT,
+ LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT,
+ RIGHT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "turtle",
+ { ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT,
+ LEFT, RIGHT, LEFT, LEFT, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT,
+ RIGHT, RIGHT, RIGHT, ZERO }
+ },
+ { "basket",
+ { RIGHT, PIN, ZERO, ZERO, PIN, LEFT, ZERO, LEFT, LEFT, ZERO,
+ LEFT, PIN, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO,
+ PIN, LEFT, ZERO }
+ },
+ { "thing",
+ { PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT,
+ LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT,
+ RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "hexagon",
+ { ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO,
+ ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO,
+ LEFT, ZERO, ZERO, RIGHT }
+ },
+ { "tri1",
+ { ZERO, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO, RIGHT, ZERO, ZERO,
+ LEFT, RIGHT, ZERO, LEFT, ZERO, RIGHT, ZERO, ZERO, LEFT, RIGHT,
+ ZERO, LEFT, ZERO, RIGHT }
+ },
+ { "triangle",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO,
+ ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, LEFT, RIGHT }
+ },
+ { "flower",
+ { ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT,
+ RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN,
+ RIGHT, RIGHT, PIN }
+ },
+ { "crucifix",
+ { ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN,
+ PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN }
+ },
+ { "kayak",
+ { PIN, RIGHT, LEFT, PIN, LEFT, PIN, ZERO, ZERO, RIGHT, PIN, LEFT,
+ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ PIN, RIGHT }
+ },
+ { "bird",
+ { ZERO, ZERO, ZERO, ZERO, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT,
+ ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT,
+ LEFT, ZERO, PIN, ZERO }
+ },
+ { "seal",
+ { RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO,
+ LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, PIN, RIGHT,
+ RIGHT, LEFT, ZERO }
+ },
+ { "dog",
+ { ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN,
+ ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO }
+ },
+ { "frog",
+ { RIGHT, RIGHT, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, LEFT, PIN,
+ RIGHT, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT,
+ RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "quavers",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, ZERO, ZERO,
+ RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO, LEFT, LEFT,
+ RIGHT, LEFT, RIGHT, RIGHT, ZERO }
+ },
+ { "fly",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, PIN, ZERO, ZERO,
+ LEFT, PIN, RIGHT, ZERO, ZERO, PIN, ZERO, LEFT, LEFT, RIGHT, LEFT,
+ RIGHT, RIGHT, ZERO }
+ },
+ { "puppy",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO,
+ RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT,
+ LEFT, ZERO, ZERO }
+ },
+ { "stars",
+ { LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT,
+ ZERO, ZERO, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN,
+ RIGHT, LEFT, ZERO }
+ },
+ { "mountains",
+ { RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN,
+ LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT,
+ PIN, LEFT, PIN }
+ },
+ { "quad1",
+ { RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN,
+ LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT,
+ LEFT, PIN, LEFT, PIN }
+ },
+ { "quad2",
+ { ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN,
+ ZERO, PIN, ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT,
+ PIN, ZERO, PIN }
+ },
+ { "glasses",
+ { ZERO, PIN, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, PIN,
+ ZERO, PIN, ZERO, PIN, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO,
+ PIN, ZERO, PIN }
+ },
+ { "em",
+ { ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN,
+ ZERO, PIN, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ PIN, ZERO, PIN }
+ },
+ { "quad3",
+ { ZERO, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT,
+ ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ LEFT, ZERO, PIN }
+ },
+ { "vee",
+ { ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ ZERO, ZERO, PIN }
+ },
+ { "square",
+ { ZERO, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO,
+ ZERO, ZERO, PIN }
+ },
+ { "eagle",
+ { RIGHT, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, ZERO,
+ LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT,
+ ZERO, ZERO, LEFT, PIN }
+ },
+ { "volcano",
+ { RIGHT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT,
+ ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT,
+ LEFT, RIGHT, ZERO, LEFT, PIN }
+ },
+ { "saddle",
+ { RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO,
+ LEFT, PIN, RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT,
+ ZERO, LEFT, PIN }
+ },
+ { "c3d",
+ { ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT, ZERO,
+ ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT,
+ ZERO, ZERO, PIN }
+ },
+ { "block",
+ { ZERO, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN,
+ RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT,
+ PIN, RIGHT }
+ },
+ { "duck",
+ { LEFT, PIN, LEFT, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, LEFT,
+ PIN, RIGHT, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN,
+ LEFT, ZERO }
+ },
+ { "prayer",
+ { RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, ZERO,
+ ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, RIGHT, RIGHT, LEFT,
+ RIGHT, LEFT, LEFT, LEFT, PIN }
+ },
+ { "giraffe",
+ { ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, RIGHT,
+ RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT,
+ PIN, LEFT, LEFT, LEFT }
+ },
+ { "tie fighter",
+ { PIN, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, LEFT,
+ ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, LEFT, ZERO,
+ LEFT, RIGHT, ZERO, ZERO }
+ },
+ { "Strong Arms",
+ { PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, RIGHT,
+ RIGHT, PIN, RIGHT, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO,
+ ZERO, PIN, PIN, ZERO }
+ },
+
+ /* the following modesl were created during the slug/compsoc codefest
+ * febrray 2003 */
+ { "cool looking gegl",
+ { PIN, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT,
+ ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, ZERO,
+ ZERO, ZERO }
+ },
+ { "knuckledusters",
+ { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN,
+ PIN, ZERO, RIGHT, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO,
+ RIGHT, ZERO }
+ },
+ { "k's turd",
+ { RIGHT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT,
+ RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN,
+ RIGHT, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "lightsabre",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "not a stairway",
+ { LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO,
+ RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT,
+ RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "not very good (but accurate) gegl",
+ { ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO,
+ PIN, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO, PIN, PIN, ZERO,
+ PIN, ZERO }
+ },
+ { "box",
+ { ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ { "kissy box",
+ { PIN, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO }
+ },
+ { "erect penis", /* thanks benno */
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
+ PIN, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "flaccid penis",
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
+ PIN, ZERO, ZERO, ZERO, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "vagina",
+ { RIGHT, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO,
+ LEFT, ZERO, ZERO, ZERO, LEFT, ZERO, LEFT, PIN, LEFT, PIN, RIGHT,
+ PIN, RIGHT, ZERO }
+ },
+ { "mask",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN,
+ ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ { "poles or columns or something",
+ { LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, LEFT, ZERO }
+ },
+ { "crooked v",
+ { ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ { "dog leg",
+ { ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO,
+ LEFT, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "scrubby",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO,
+ LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO,
+ LEFT, PIN, ZERO, ZERO }
+ },
+ { "voltron's eyes",
+ { ZERO, ZERO, PIN, RIGHT, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO,
+ LEFT, PIN, ZERO, ZERO, PIN, ZERO, LEFT, ZERO, RIGHT, LEFT, ZERO,
+ RIGHT, ZERO, ZERO }
+ },
+ { "flying toaster",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "dubbya",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "tap handle",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "wingnut",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "tight twist",
+ { RIGHT, ZERO, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT,
+ RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT,
+ ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "double helix",
+ { RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT,
+ ZERO, RIGHT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, ZERO,
+ RIGHT, ZERO, RIGHT, ZERO, ZERO }
+ },
+
+ /* These models come from the website at
+ * http://www.geocities.com/stigeide/snake */
+#if 0
+ { "Abstract",
+ { RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO }
+ },
+#endif
+ { "toadstool",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, ZERO }
+ },
+ { "AlanH2",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, ZERO }
+ },
+ { "AlanH3",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "AlanH4",
+ { ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, ZERO, ZERO }
+ },
+ { "Alien",
+ { RIGHT, LEFT, RIGHT, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO, PIN, PIN, ZERO }
+ },
+ { "Angel",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO }
+ },
+ { "AnotherFigure",
+ { LEFT, PIN, RIGHT, ZERO, ZERO, PIN, RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO }
+ },
+ { "Ball",
+ { LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT , ZERO }
+ },
+ { "Basket",
+ { ZERO, RIGHT, RIGHT, ZERO, RIGHT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, ZERO, LEFT , ZERO }
+ },
+ { "Beetle",
+ { PIN, LEFT, RIGHT, ZERO, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, LEFT, RIGHT, PIN, RIGHT , ZERO }
+ },
+ { "bone",
+ { PIN, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, PIN , ZERO }
+ },
+ { "Bow",
+ { LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT , ZERO }
+ },
+ { "bra",
+ { RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT , ZERO }
+ },
+ { "bronchosaurus",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, PIN , ZERO }
+ },
+ { "Cactus",
+ { PIN, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, ZERO , ZERO }
+ },
+ { "Camel",
+ { RIGHT, ZERO, PIN, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, ZERO, ZERO, LEFT , ZERO }
+ },
+ { "Candlestick",
+ { LEFT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT , ZERO }
+ },
+ { "Cat",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO , ZERO }
+ },
+ { "Cave",
+ { RIGHT, ZERO, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO , ZERO }
+ },
+ { "Chains",
+ { PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO , ZERO }
+ },
+ { "Chair",
+ { RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, LEFT, RIGHT, LEFT, LEFT , ZERO }
+ },
+ { "Chick",
+ { RIGHT, RIGHT, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, LEFT, LEFT , ZERO }
+ },
+ { "Clockwise",
+ { RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT , ZERO }
+ },
+ { "cobra",
+ { ZERO, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, LEFT, ZERO, LEFT, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT , ZERO }
+ },
+#if 0
+ { "Cobra2",
+ { LEFT, ZERO, PIN, ZERO, PIN, LEFT, ZERO, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, PIN, ZERO, RIGHT , ZERO }
+ },
+#endif
+ { "Cobra3",
+ { ZERO, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, LEFT , ZERO }
+ },
+ { "Compact1",
+ { ZERO, ZERO, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN , ZERO }
+ },
+ { "Compact2",
+ { LEFT, PIN, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO , ZERO }
+ },
+ { "Compact3",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN , ZERO }
+ },
+ { "Compact4",
+ { PIN, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO , ZERO }
+ },
+ { "Compact5",
+ { LEFT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT , ZERO }
+ },
+ { "Contact",
+ { PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN, RIGHT, PIN , ZERO }
+ },
+ { "Contact2",
+ { RIGHT, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, LEFT , ZERO }
+ },
+ { "Cook",
+ { ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO, PIN , ZERO }
+ },
+ { "Counterclockwise",
+ { LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT , ZERO }
+ },
+ { "Cradle",
+ { LEFT, LEFT, ZERO, PIN, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, RIGHT, LEFT, LEFT, ZERO, ZERO, RIGHT , ZERO }
+ },
+ { "Crankshaft",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, PIN, RIGHT , ZERO }
+ },
+ { "Cross",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN , ZERO }
+ },
+ { "Cross2",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO , ZERO }
+ },
+ { "Cross3",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "CrossVersion1",
+ { PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "CrossVersion2",
+ { RIGHT, LEFT, PIN, LEFT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "Crown",
+ { LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, PIN, ZERO, ZERO }
+ },
+ { "DNAStrand",
+ { RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Diamond",
+ { ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Dog",
+ { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "DogFace",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, LEFT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, RIGHT, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "DoublePeak",
+ { ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, LEFT, ZERO, PIN, ZERO, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "DoubleRoof",
+ { ZERO, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO }
+ },
+ { "txoboggan",
+ { ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Doubled",
+ { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
+ },
+ { "Doubled1",
+ { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO, RIGHT, ZERO, RIGHT, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
+ },
+ { "Doubled2",
+ { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, RIGHT, ZERO, RIGHT, LEFT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
+ },
+ { "DumblingSpoon",
+ { PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Embrace",
+ { PIN, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO }
+ },
+ { "EndlessBelt",
+ { ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Entrance",
+ { LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, ZERO }
+ },
+ { "Esthetic",
+ { LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, ZERO }
+ },
+ { "Explosion",
+ { RIGHT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "F-ZeroXCar",
+ { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "Face",
+ { ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Fantasy",
+ { LEFT, LEFT, RIGHT, PIN, ZERO, RIGHT, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, LEFT, ZERO, PIN, LEFT, RIGHT, RIGHT, RIGHT, PIN, ZERO }
+ },
+ { "Fantasy1",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "FaserGun",
+ { ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, RIGHT, ZERO, PIN, ZERO }
+ },
+ { "FelixW",
+ { ZERO, RIGHT, ZERO, PIN, LEFT, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, RIGHT, PIN, ZERO, LEFT, ZERO, ZERO }
+ },
+ { "Flamingo",
+ { ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "FlatOnTheTop",
+ { ZERO, PIN, PIN, ZERO, PIN, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Fly",
+ { ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Fountain",
+ { LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO }
+ },
+ { "Frog",
+ { LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, RIGHT, LEFT, RIGHT, RIGHT, ZERO }
+ },
+ { "Frog2",
+ { LEFT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "Furby",
+ { PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Gate",
+ { ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "Ghost",
+ { LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Globus",
+ { RIGHT, LEFT, ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, LEFT, ZERO, ZERO }
+ },
+ { "Grotto",
+ { PIN, PIN, ZERO, LEFT, RIGHT, LEFT, ZERO, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO }
+ },
+ { "H",
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "HeadOfDevil",
+ { PIN, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "Heart",
+ { RIGHT, ZERO, ZERO, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, RIGHT, ZERO, PIN, ZERO, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Heart2",
+ { ZERO, PIN, ZERO, ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Hexagon",
+ { ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "HoleInTheMiddle1",
+ { ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "HoleInTheMiddle2",
+ { ZERO, LEFT, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "HouseBoat",
+ { RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "HouseByHouse",
+ { LEFT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Infinity",
+ { LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Integral",
+ { RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Iron",
+ { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "just squares",
+ { RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Kink",
+ { ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "Knot",
+ { LEFT, LEFT, PIN, LEFT, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, RIGHT, PIN, RIGHT, RIGHT, LEFT, ZERO }
+ },
+ { "Leaf",
+ { ZERO, PIN, PIN, ZERO, ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO }
+ },
+ { "LeftAsRight",
+ { RIGHT, PIN, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Long-necked",
+ { PIN, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "lunar module",
+ { PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, ZERO }
+ },
+ { "magnifying glass",
+ { ZERO, ZERO, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, ZERO }
+ },
+ { "Mask",
+ { ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, ZERO }
+ },
+ { "Microscope",
+ { PIN, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO }
+ },
+ { "Mirror",
+ { PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "MissPiggy",
+ { ZERO, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, LEFT, PIN, RIGHT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "Mole",
+ { ZERO, RIGHT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, ZERO, RIGHT, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Monk",
+ { LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Mountain",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, LEFT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO }
+ },
+ { "mountains",
+ { ZERO, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO }
+ },
+ { "MouseWithoutTail",
+ { ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "mushroom",
+ { PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, ZERO }
+ },
+ { "necklace",
+ { ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO }
+ },
+ { "NestledAgainst",
+ { LEFT, ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "NoClue",
+ { ZERO, RIGHT, PIN, LEFT, LEFT, LEFT, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO }
+ },
+ { "Noname",
+ { LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, ZERO }
+ },
+ { "Obelisk",
+ { PIN, ZERO, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Ostrich",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Ostrich2",
+ { PIN, PIN, ZERO, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "pair of glasses",
+ { ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Parrot",
+ { ZERO, ZERO, ZERO, ZERO, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO }
+ },
+ { "Penis",
+ { PIN, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, PIN, ZERO }
+ },
+ { "PictureComingSoon",
+ { LEFT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, RIGHT, RIGHT, ZERO }
+ },
+ { "Pitti",
+ { LEFT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, ZERO }
+ },
+ { "Plait",
+ { LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, ZERO }
+ },
+ { "Platform",
+ { RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "PodRacer",
+ { ZERO, PIN, ZERO, PIN, RIGHT, PIN, ZERO, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, ZERO, PIN, LEFT, ZERO }
+ },
+#if 0
+ { "Pokemon",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO }
+ },
+#endif
+ { "Prawn",
+ { RIGHT, PIN, ZERO, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, PIN, ZERO, PIN, LEFT, ZERO }
+ },
+ { "Propeller",
+ { ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Pyramid",
+ { ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, LEFT, ZERO }
+ },
+ { "QuarterbackTiltedAndReadyToHut",
+ { PIN, ZERO, RIGHT, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, LEFT, ZERO, PIN, ZERO }
+ },
+ { "Ra",
+ { PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Rattlesnake",
+ { LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, PIN, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, ZERO }
+ },
+ { "Revelation",
+ { ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Revolution1",
+ { LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, ZERO }
+ },
+ { "Ribbon",
+ { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Rocket",
+ { RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "Roofed",
+ { ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO }
+ },
+ { "Roofs",
+ { PIN, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, PIN, ZERO }
+ },
+ { "RowHouses",
+ { RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Sculpture",
+ { RIGHT, LEFT, PIN, ZERO, ZERO, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO }
+ },
+ { "Seal",
+ { LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO }
+ },
+ { "Seal2",
+ { RIGHT, PIN, ZERO, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO }
+ },
+ { "Sheep",
+ { RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, ZERO }
+ },
+ { "Shelter",
+ { LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "Ship",
+ { PIN, RIGHT, LEFT, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, LEFT, ZERO, PIN, PIN, ZERO }
+ },
+ { "Shpongle",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO }
+ },
+ { "Slide",
+ { LEFT, RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, RIGHT, LEFT, ZERO }
+ },
+ { "SmallShip",
+ { ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "SnakeReadyToStrike",
+ { LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Snakes14",
+ { RIGHT, RIGHT, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Snakes15",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO }
+ },
+ { "Snakes18",
+ { PIN, PIN, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Snowflake",
+ { LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, ZERO }
+ },
+ { "Snowman",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "Source",
+ { PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, ZERO }
+ },
+ { "Spaceship",
+ { PIN, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, PIN, ZERO }
+ },
+ { "Spaceship2",
+ { PIN, PIN, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, LEFT, LEFT, PIN, PIN, ZERO }
+ },
+ { "Speedboat",
+ { LEFT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "Speedboat2",
+ { PIN, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, ZERO, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Spider",
+ { RIGHT, RIGHT, ZERO, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, RIGHT, LEFT, RIGHT, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Spitzbergen",
+ { PIN, LEFT, ZERO, RIGHT, RIGHT, LEFT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, LEFT, LEFT, ZERO, ZERO }
+ },
+ { "Square",
+ { ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, ZERO }
+ },
+ { "SquareHole",
+ { PIN, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO }
+ },
+ { "Stage",
+ { RIGHT, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, ZERO }
+ },
+ { "Stairs",
+ { ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Stairs2",
+ { ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Straight",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Swan",
+ { ZERO, PIN, ZERO, PIN, LEFT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "Swan2",
+ { PIN, ZERO, PIN, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO }
+ },
+ { "Swan3",
+ { PIN, PIN, ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "Symbol",
+ { RIGHT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, RIGHT, ZERO }
+ },
+ { "Symmetry",
+ { RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "Symmetry2",
+ { ZERO, PIN, LEFT, LEFT, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "TableFireworks",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, RIGHT, PIN, ZERO }
+ },
+ { "Tapering",
+ { ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "TaperingTurned",
+ { ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "TeaLightStick",
+ { RIGHT, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, ZERO }
+ },
+ { "thighmaster",
+ { RIGHT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "Terraces",
+ { RIGHT, LEFT, ZERO, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO }
+ },
+ { "Terrier",
+ { PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Three-Legged",
+ { RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, PIN, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "ThreePeaks",
+ { RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "ToTheFront",
+ { ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, LEFT, LEFT, PIN, ZERO, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, ZERO }
+ },
+ { "Top",
+ { PIN, LEFT, LEFT, PIN, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "Transport",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Triangle",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "Tripple",
+ { PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, ZERO }
+ },
+#if 0
+ { "Turtle",
+ { RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO }
+ },
+#endif
+ { "Twins",
+ { ZERO, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO, ZERO }
+ },
+ { "TwoSlants",
+ { ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, ZERO }
+ },
+ { "TwoWings",
+ { PIN, LEFT, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, ZERO, ZERO }
+ },
+ { "UFO",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "USS Enterprise",
+ { LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO }
+ },
+ { "UpAndDown",
+ { ZERO, PIN, ZERO, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "Upright",
+ { ZERO, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, ZERO }
+ },
+ { "Upside-down",
+ { PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Valley",
+ { ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO }
+ },
+ { "Viaduct",
+ { PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO, PIN, RIGHT, ZERO, RIGHT, RIGHT, ZERO, RIGHT, PIN, ZERO, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "View",
+ { ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Waterfall",
+ { LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO }
+ },
+ { "windwheel",
+ { PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "Window",
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "WindowToTheWorld",
+ { PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Windshield",
+ { PIN, PIN, ZERO, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, PIN, ZERO }
+ },
+ { "WingNut",
+ { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Wings2",
+ { RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO }
+ },
+ { "WithoutName",
+ { PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, ZERO }
+ },
+ { "Wolf",
+ { ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "X",
+ { LEFT, ZERO, ZERO, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, ZERO, ZERO, ZERO }
+ },
+};
+
+static size_t models = sizeof(model) / sizeof(struct model_s);
+
+#define VOFFSET 0.045
+
+#define X_MASK 1
+#define Y_MASK 2
+#define Z_MASK 4
+
+/* the connecting string that holds the snake together */
+#define MAGICAL_RED_STRING 0
+
+#define GETSCALAR(vec,mask) ((vec)==(mask) ? 1 : ((vec)==-(mask) ? -1 : 0 ))
+
+#ifndef MAX
+# define MAX(x, y) ((x) > (y) ? (x) : (y))
+#endif
+#ifndef MIN
+# define MIN(x, y) ((x) < (y) ? (x) : (y))
+#endif
+
+#define RAND(n) ((random() & 0x7fffffff) % ((long) (n)))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+/* the triangular prism what makes up the basic unit */
+static const float solid_prism_v[][3] = {
+ /* first corner, bottom left front */
+ { VOFFSET, VOFFSET, 1.0 },
+ { VOFFSET, 0.00, 1.0 - VOFFSET },
+ { 0.00, VOFFSET, 1.0 - VOFFSET },
+ /* second corner, rear */
+ { VOFFSET, VOFFSET, 0.00 },
+ { VOFFSET, 0.00, VOFFSET },
+ { 0.00, VOFFSET, VOFFSET },
+ /* third, right front */
+ { 1.0 - VOFFSET / M_SQRT1_2, VOFFSET, 1.0 },
+ { 1.0 - VOFFSET / M_SQRT1_2, 0.0, 1.0 - VOFFSET },
+ { 1.0 - VOFFSET * M_SQRT1_2, VOFFSET, 1.0 - VOFFSET },
+ /* fourth, right rear */
+ { 1.0 - VOFFSET / M_SQRT1_2, VOFFSET, 0.0 },
+ { 1.0 - VOFFSET / M_SQRT1_2, 0.0, VOFFSET },
+ { 1.0 - VOFFSET * M_SQRT1_2, VOFFSET, VOFFSET },
+ /* fifth, upper front */
+ { VOFFSET, 1.0 - VOFFSET / M_SQRT1_2, 1.0 },
+ { VOFFSET / M_SQRT1_2, 1.0 - VOFFSET * M_SQRT1_2, 1.0 - VOFFSET },
+ { 0.0, 1.0 - VOFFSET / M_SQRT1_2, 1.0 - VOFFSET},
+ /* sixth, upper rear */
+ { VOFFSET, 1.0 - VOFFSET / M_SQRT1_2, 0.0 },
+ { VOFFSET / M_SQRT1_2, 1.0 - VOFFSET * M_SQRT1_2, VOFFSET },
+ { 0.0, 1.0 - VOFFSET / M_SQRT1_2, VOFFSET }};
+
+static const float solid_prism_n[][3] = {/* corners */
+ { -VOFFSET, -VOFFSET, VOFFSET },
+ { VOFFSET, -VOFFSET, VOFFSET },
+ { -VOFFSET, VOFFSET, VOFFSET },
+ { -VOFFSET, -VOFFSET, -VOFFSET },
+ { VOFFSET, -VOFFSET, -VOFFSET },
+ { -VOFFSET, VOFFSET, -VOFFSET },
+ /* edges */
+ { -VOFFSET, 0.0, VOFFSET },
+ { 0.0, -VOFFSET, VOFFSET },
+ { VOFFSET, VOFFSET, VOFFSET },
+ { -VOFFSET, 0.0, -VOFFSET },
+ { 0.0, -VOFFSET, -VOFFSET },
+ { VOFFSET, VOFFSET, -VOFFSET },
+ { -VOFFSET, -VOFFSET, 0.0 },
+ { VOFFSET, -VOFFSET, 0.0 },
+ { -VOFFSET, VOFFSET, 0.0 },
+ /* faces */
+ { 0.0, 0.0, 1.0 },
+ { 0.0, -1.0, 0.0 },
+ { M_SQRT1_2, M_SQRT1_2, 0.0 },
+ { -1.0, 0.0, 0.0 },
+ { 0.0, 0.0, -1.0 }};
+
+static const float wire_prism_v[][3] = {{ 0.0, 0.0, 1.0 },
+ { 1.0, 0.0, 1.0 },
+ { 0.0, 1.0, 1.0 },
+ { 0.0, 0.0, 0.0 },
+ { 1.0, 0.0, 0.0 },
+ { 0.0, 1.0, 0.0 }};
+
+/*
+static const float wire_prism_n[][3] = {{ 0.0, 0.0, 1.0},
+ { 0.0,-1.0, 0.0},
+ { M_SQRT1_2, M_SQRT1_2, 0.0},
+ {-1.0, 0.0, 0.0},
+ { 0.0, 0.0,-1.0}};
+*/
+
+static struct glsnake_cfg * glc = NULL;
+#ifdef HAVE_GLUT
+# define bp glc
+#endif
+
+typedef float (*morphFunc)(long);
+
+#ifdef HAVE_GLUT
+/* forward definitions for GLUT functions */
+static void calc_rotation();
+static inline void ui_mousedrag();
+#endif
+
+static const GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+static const GLfloat mat_specular[] = { 0.1, 0.1, 0.1, 1.0 };
+static const GLfloat mat_shininess[] = { 20.0 };
+
+static void gl_init(
+#ifndef HAVE_GLUT
+ ModeInfo * mi
+#endif
+ )
+{
+ float light_pos[][3] = {{0.0, 10.0, 20.0}, {0.0, 20.0, -1.0}};
+ float light_dir[][3] = {{0.0, -10.0,-20.0}, {0.0,-20.0, 1.0}};
+
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glCullFace(GL_BACK);
+ /*glEnable(GL_CULL_FACE);*/
+ glEnable(GL_NORMALIZE);
+ if (transparent) {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ }
+
+ if (!wireframe) {
+ /*glColor4f(1.0, 1.0, 1.0, 1.0);*/
+ glLightfv(GL_LIGHT0, GL_POSITION, light_pos[0]);
+ glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_dir[0]);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
+ /*glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);*/
+#if 1
+ glLightfv(GL_LIGHT1, GL_POSITION, light_pos[1]);
+ glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, light_dir[1]);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, white_light);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, white_light);
+#endif
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ /*glEnable(GL_COLOR_MATERIAL);*/
+ }
+}
+
+static void gettime(snaketime *t)
+{
+#ifdef HAVE_GETTIMEOFDAY
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(t, &tzp);
+#else /* !GETTIMEOFDAY_TWO_ARGS */
+ gettimeofday(t);
+#endif /* !GETTIMEOFDAY_TWO_ARGS */
+#else /* !HAVE_GETTIMEOFDAY */
+#ifdef HAVE_FTIME
+ ftime(t);
+#endif /* HAVE_FTIME */
+#endif /* !HAVE_GETTIMEOFDAY */
+}
+
+
+ENTRYPOINT void glsnake_reshape(
+#ifndef HAVE_GLUT
+ ModeInfo * mi,
+#endif
+ int w, int h);
+
+static void start_morph(struct glsnake_cfg *,
+ unsigned int model_index, int immediate);
+
+/* wot initialises it */
+ENTRYPOINT void glsnake_init(
+#ifndef HAVE_GLUT
+ModeInfo * mi
+#endif
+)
+{
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp;
+
+ /* set up the conf struct and glx contexts */
+ MI_INIT(mi, glc);
+ bp = &glc[MI_SCREEN(mi)];
+
+ if ((bp->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ glsnake_reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+#else
+ gl_init();
+#endif
+
+ /* initialise conf struct */
+ memset(&bp->node, 0, sizeof(float) * NODE_COUNT);
+
+ bp->selected = 11;
+ bp->is_cyclic = 0;
+ bp->is_legal = 1;
+ bp->last_turn = -1;
+ bp->morphing = 0;
+ bp->paused = 0;
+ bp->new_morph = 0;
+
+ gettime(&bp->last_iteration);
+ memcpy(&bp->last_morph, &bp->last_iteration, sizeof(bp->last_morph));
+
+ bp->prev_colour = bp->next_colour = COLOUR_ACYCLIC;
+ bp->next_model = RAND(models);
+ bp->prev_model = START_MODEL;
+ start_morph(bp, bp->prev_model, 1);
+
+ /* set up a font for the labels */
+#ifndef HAVE_GLUT
+ if (titles)
+ bp->font_data = load_texture_font (mi->dpy, "labelfont");
+#endif
+
+ /* build a solid display list */
+ bp->node_solid = glGenLists(1);
+ glNewList(bp->node_solid, GL_COMPILE);
+ /* corners */
+ glBegin(GL_TRIANGLES);
+ glNormal3fv(solid_prism_n[0]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[2]);
+ glVertex3fv(solid_prism_v[1]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[1]);
+ glVertex3fv(solid_prism_v[6]);
+ glVertex3fv(solid_prism_v[7]);
+ glVertex3fv(solid_prism_v[8]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[2]);
+ glVertex3fv(solid_prism_v[12]);
+ glVertex3fv(solid_prism_v[13]);
+ glVertex3fv(solid_prism_v[14]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[3]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[4]);
+ glVertex3fv(solid_prism_v[5]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[4]);
+ glVertex3fv(solid_prism_v[9]);
+ glVertex3fv(solid_prism_v[11]);
+ glVertex3fv(solid_prism_v[10]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[5]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[15]);
+ glVertex3fv(solid_prism_v[17]);
+ bp->node_polys++;
+ glEnd();
+
+ /* edges */
+ glBegin(GL_QUADS);
+ glNormal3fv(solid_prism_n[6]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[12]);
+ glVertex3fv(solid_prism_v[14]);
+ glVertex3fv(solid_prism_v[2]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[7]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[1]);
+ glVertex3fv(solid_prism_v[7]);
+ glVertex3fv(solid_prism_v[6]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[8]);
+ glVertex3fv(solid_prism_v[6]);
+ glVertex3fv(solid_prism_v[8]);
+ glVertex3fv(solid_prism_v[13]);
+ glVertex3fv(solid_prism_v[12]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[9]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[5]);
+ glVertex3fv(solid_prism_v[17]);
+ glVertex3fv(solid_prism_v[15]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[10]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[9]);
+ glVertex3fv(solid_prism_v[10]);
+ glVertex3fv(solid_prism_v[4]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[11]);
+ glVertex3fv(solid_prism_v[15]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[11]);
+ glVertex3fv(solid_prism_v[9]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[12]);
+ glVertex3fv(solid_prism_v[1]);
+ glVertex3fv(solid_prism_v[2]);
+ glVertex3fv(solid_prism_v[5]);
+ glVertex3fv(solid_prism_v[4]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[13]);
+ glVertex3fv(solid_prism_v[8]);
+ glVertex3fv(solid_prism_v[7]);
+ glVertex3fv(solid_prism_v[10]);
+ glVertex3fv(solid_prism_v[11]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[14]);
+ glVertex3fv(solid_prism_v[13]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[17]);
+ glVertex3fv(solid_prism_v[14]);
+ bp->node_polys++;
+ glEnd();
+
+ /* faces */
+ glBegin(GL_TRIANGLES);
+ glNormal3fv(solid_prism_n[15]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[6]);
+ glVertex3fv(solid_prism_v[12]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[19]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[15]);
+ glVertex3fv(solid_prism_v[9]);
+ bp->node_polys++;
+ glEnd();
+
+ glBegin(GL_QUADS);
+ glNormal3fv(solid_prism_n[16]);
+ glVertex3fv(solid_prism_v[1]);
+ glVertex3fv(solid_prism_v[4]);
+ glVertex3fv(solid_prism_v[10]);
+ glVertex3fv(solid_prism_v[7]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[17]);
+ glVertex3fv(solid_prism_v[8]);
+ glVertex3fv(solid_prism_v[11]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[13]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[18]);
+ glVertex3fv(solid_prism_v[2]);
+ glVertex3fv(solid_prism_v[14]);
+ glVertex3fv(solid_prism_v[17]);
+ glVertex3fv(solid_prism_v[5]);
+ bp->node_polys++;
+ glEnd();
+ glEndList();
+
+ /* build wire display list */
+ bp->node_wire = glGenLists(1);
+ glNewList(bp->node_wire, GL_COMPILE);
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(wire_prism_v[0]);
+ glVertex3fv(wire_prism_v[1]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[2]);
+ glVertex3fv(wire_prism_v[0]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[3]);
+ glVertex3fv(wire_prism_v[4]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[5]);
+ glVertex3fv(wire_prism_v[3]);
+ bp->node_polys++;
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3fv(wire_prism_v[1]);
+ glVertex3fv(wire_prism_v[4]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[2]);
+ glVertex3fv(wire_prism_v[5]);
+ bp->node_polys++;
+ glEnd();
+ glEndList();
+
+#ifdef HAVE_GLUT
+ /* initialise the rotation */
+ calc_rotation();
+#endif
+}
+
+static void draw_title(
+#ifndef HAVE_GLUT
+ ModeInfo * mi
+#endif
+ )
+{
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp = &glc[MI_SCREEN(mi)];
+#endif
+
+ /* draw some text */
+
+/* glPushAttrib((GLbitfield) GL_TRANSFORM_BIT | GL_ENABLE_BIT);*/
+ glDisable(GL_LIGHTING);
+ glDisable(GL_DEPTH_TEST);
+ if (transparent) {
+ glDisable(GL_BLEND);
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+#ifdef HAVE_GLUT
+ glOrtho((GLdouble) 0., (GLdouble) bp->width, (GLdouble) 0., (GLdouble) bp->height, -1, 1);
+#else
+ glOrtho((GLdouble) 0., (GLdouble) mi->xgwa.width, (GLdouble) 0., (GLdouble) mi->xgwa.height, -1, 1);
+#endif
+
+ glColor4f(1.0, 1.0, 1.0, 1.0);
+ {
+ char interactstr[] = "interactive";
+ const char * s;
+#ifdef HAVE_GLUT
+ int w;
+#endif
+
+ if (interactive)
+ s = interactstr;
+ else
+ s = model[bp->next_model].name;
+
+#ifdef HAVE_GLUT
+ {
+ unsigned int i = 0;
+
+ w = glutBitmapLength(GLUT_BITMAP_HELVETICA_12, (const unsigned char *) s);
+ glRasterPos2f((GLfloat) (bp->width - w - 3), 4.0);
+ while (s[i] != '\0')
+ glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, s[i++]);
+ }
+#else
+ print_texture_label (mi->dpy, bp->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, s);
+#endif
+ }
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+
+/* glPopAttrib();*/
+}
+
+/* apply the matrix to the origin and stick it in vec */
+static void matmult_origin(float rotmat[16], float vec[4])
+{
+#if 1
+ vec[0] = 0.5 * rotmat[0] + 0.5 * rotmat[4] + 0.5 * rotmat [8] + 1 * rotmat[12];
+ vec[1] = 0.5 * rotmat[1] + 0.5 * rotmat[5] + 0.5 * rotmat [9] + 1 * rotmat[13];
+ vec[2] = 0.5 * rotmat[2] + 0.5 * rotmat[6] + 0.5 * rotmat[10] + 1 * rotmat[14];
+ vec[3] = 0.5 * rotmat[3] + 0.5 * rotmat[7] + 0.5 * rotmat[11] + 1 * rotmat[15];
+#else
+ vec[0] = 0 * rotmat [0] + 0 * rotmat [1] + 0 * rotmat [2] + 1 * rotmat [3];
+ vec[1] = 0 * rotmat [4] + 0 * rotmat [5] + 0 * rotmat [6] + 1 * rotmat [7];
+ vec[2] = 0 * rotmat [8] + 0 * rotmat [9] + 0 * rotmat[10] + 1 * rotmat[11];
+ vec[3] = 0 * rotmat[12] + 0 * rotmat[13] + 0 * rotmat[14] + 1 * rotmat[15];
+#endif
+ vec[0] /= vec[3];
+ vec[1] /= vec[3];
+ vec[2] /= vec[3];
+ vec[3] = 1.0;
+}
+
+/* wot gets called when the winder is resized */
+ENTRYPOINT void glsnake_reshape(
+#ifndef HAVE_GLUT
+ ModeInfo * mi,
+#endif
+ int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ /* jwz: 0.05 was too close (left black rectangles) */
+ gluPerspective(zoom, 1/h, 1.0, 100.0);
+ gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+ glMatrixMode(GL_MODELVIEW);
+ /*gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);*/
+ glLoadIdentity();
+#ifdef HAVE_GLUT
+ bp->width = width;
+ bp->height = height;
+#endif
+}
+
+/* Returns the new dst_dir for the given src_dir and dst_dir */
+static int cross_product(int src_dir, int dst_dir)
+{
+ return X_MASK*(GETSCALAR(src_dir,Y_MASK) * GETSCALAR(dst_dir,Z_MASK) -
+ GETSCALAR(src_dir,Z_MASK) * GETSCALAR(dst_dir,Y_MASK))+
+ Y_MASK*(GETSCALAR(src_dir,Z_MASK) * GETSCALAR(dst_dir,X_MASK) -
+ GETSCALAR(src_dir,X_MASK) * GETSCALAR(dst_dir,Z_MASK))+
+ Z_MASK*(GETSCALAR(src_dir,X_MASK) * GETSCALAR(dst_dir,Y_MASK) -
+ GETSCALAR(src_dir,Y_MASK) * GETSCALAR(dst_dir,X_MASK));
+}
+
+/* calculate orthogonal snake metrics
+ * is_legal = true if model does not pass through itself
+ * is_cyclic = true if last node connects back to first node
+ * last_turn = for cyclic snakes, specifes what the 24th turn would be
+ */
+static void calc_snake_metrics(struct glsnake_cfg *bp)
+{
+ int srcDir, dstDir;
+ int i, x, y, z;
+ int prevSrcDir = -Y_MASK;
+ int prevDstDir = Z_MASK;
+ int grid[25][25][25];
+
+ /* zero the grid */
+ memset(&grid, 0, sizeof(int) * 25*25*25);
+
+ bp->is_legal = 1;
+ x = y = z = 12;
+
+ /* trace path of snake - and keep record for is_legal */
+ for (i = 0; i < NODE_COUNT - 1; i++) {
+ /*int ang_card;*/ /* cardinal direction of node angle */
+ /* establish new state vars */
+ srcDir = -prevDstDir;
+ x += GETSCALAR(prevDstDir, X_MASK);
+ y += GETSCALAR(prevDstDir, Y_MASK);
+ z += GETSCALAR(prevDstDir, Z_MASK);
+
+ switch ((int) model[bp->next_model].node[i]) {
+ case (int) (ZERO):
+ dstDir = -prevSrcDir;
+ break;
+ case (int) (PIN):
+ dstDir = prevSrcDir;
+ break;
+ case (int) (RIGHT):
+ case (int) (LEFT):
+ dstDir = cross_product(prevSrcDir, prevDstDir);
+ if (model[bp->next_model].node[i] == (int) (RIGHT))
+ dstDir = -dstDir;
+ break;
+ default:
+ /* Prevent spurious "might be used
+ * uninitialised" warnings when compiling
+ * with -O2 */
+ dstDir = 0;
+ break;
+ }
+
+ if (grid[x][y][z] == 0)
+ grid[x][y][z] = srcDir + dstDir;
+ else if (grid[x][y][z] + srcDir + dstDir == 0)
+ grid[x][y][z] = 8;
+ else
+ bp->is_legal = 0;
+
+ prevSrcDir = srcDir;
+ prevDstDir = dstDir;
+ }
+
+ /* determine if the snake is cyclic */
+ bp->is_cyclic = (dstDir == Y_MASK && x == 12 && y == 11 && z == 12);
+
+ /* determine last_turn */
+ bp->last_turn = -1;
+ if (bp->is_cyclic)
+ switch (srcDir) {
+ case -Z_MASK: bp->last_turn = ZERO; break;
+ case Z_MASK: bp->last_turn = PIN; break;
+ case X_MASK: bp->last_turn = LEFT; break;
+ case -X_MASK: bp->last_turn = RIGHT; break;
+ }
+}
+
+/* work out how far through the current morph we are */
+static float morph_percent(struct glsnake_cfg *bp)
+{
+ float retval;
+ int i;
+
+ /* extend this function later with a case statement for each of the
+ * morph schemes */
+
+ /* when morphing all nodes at once, the longest morph will be the node
+ * that needs to rotate 180 degrees. For each node, work out how far it
+ * has to go, and store the maximum rotation and current largest angular
+ * difference, returning the angular difference over the maximum. */
+ {
+ float rot_max = 0.0, ang_diff_max = 0.0;
+
+ for (i = 0; i < NODE_COUNT - 1; i++) {
+ float rot, ang_diff;
+
+ /* work out the maximum rotation this node has to go through
+ * from the previous to the next model, taking into account that
+ * the snake always morphs through the smaller angle */
+ rot = fabs(model[bp->prev_model].node[i] -
+ model[bp->next_model].node[i]);
+ if (rot > 180.0) rot = 180.0 - rot;
+ /* work out the difference between the current position and the
+ * target */
+ ang_diff = fabs(bp->node[i] -
+ model[bp->next_model].node[i]);
+ if (ang_diff > 180.0) ang_diff = 180.0 - ang_diff;
+ /* if it's the biggest so far, record it */
+ if (rot > rot_max) rot_max = rot;
+ if (ang_diff > ang_diff_max) ang_diff_max = ang_diff;
+ }
+
+ /* ang_diff / rot approaches 0, we want the complement */
+ retval = 1.0 - (ang_diff_max / rot_max);
+ /* protect against naan */
+
+/* Apparently some systems (Solaris) don't have isinf() */
+#undef isinf
+#define isinf(x) (((x) > 999999999999.9) || ((x) < -999999999999.9))
+
+ if (isnan(retval) || isinf(retval)) retval = 1.0;
+ }
+ /*printf("morph_pct = %f\n", retval);*/
+ return retval;
+}
+
+static void morph_colour(struct glsnake_cfg *bp)
+{
+ float percent, compct; /* complement of percentage */
+
+ percent = morph_percent(bp);
+ compct = 1.0 - percent;
+
+ bp->colour[0][0] = colour[bp->prev_colour][0][0] * compct + colour[bp->next_colour][0][0] * percent;
+ bp->colour[0][1] = colour[bp->prev_colour][0][1] * compct + colour[bp->next_colour][0][1] * percent;
+ bp->colour[0][2] = colour[bp->prev_colour][0][2] * compct + colour[bp->next_colour][0][2] * percent;
+ bp->colour[0][3] = colour[bp->prev_colour][0][3] * compct + colour[bp->next_colour][0][3] * percent;
+
+ bp->colour[1][0] = colour[bp->prev_colour][1][0] * compct + colour[bp->next_colour][1][0] * percent;
+ bp->colour[1][1] = colour[bp->prev_colour][1][1] * compct + colour[bp->next_colour][1][1] * percent;
+ bp->colour[1][2] = colour[bp->prev_colour][1][2] * compct + colour[bp->next_colour][1][2] * percent;
+ bp->colour[1][3] = colour[bp->prev_colour][1][3] * compct + colour[bp->next_colour][1][3] * percent;
+}
+
+/* Start morph process to this model */
+static void start_morph(struct glsnake_cfg *bp,
+ unsigned int model_index, int immediate)
+{
+ /* if immediate, don't bother morphing, go straight to the next model */
+ if (immediate) {
+ int i;
+
+ for (i = 0; i < NODE_COUNT; i++)
+ bp->node[i] = model[model_index].node[i];
+ }
+
+ bp->prev_model = bp->next_model;
+ bp->next_model = model_index;
+ bp->prev_colour = bp->next_colour;
+
+ calc_snake_metrics(bp);
+ if (!bp->is_legal)
+ bp->next_colour = COLOUR_INVALID;
+ else if (altcolour)
+ bp->next_colour = COLOUR_AUTHENTIC;
+ else if (bp->is_cyclic)
+ bp->next_colour = COLOUR_CYCLIC;
+ else
+ bp->next_colour = COLOUR_ACYCLIC;
+
+ if (immediate) {
+ bp->colour[0][0] = colour[bp->next_colour][0][0];
+ bp->colour[0][1] = colour[bp->next_colour][0][1];
+ bp->colour[0][2] = colour[bp->next_colour][0][2];
+ bp->colour[0][3] = colour[bp->next_colour][0][3];
+ bp->colour[1][0] = colour[bp->next_colour][1][0];
+ bp->colour[1][1] = colour[bp->next_colour][1][1];
+ bp->colour[1][2] = colour[bp->next_colour][1][2];
+ bp->colour[1][3] = colour[bp->next_colour][1][3];
+ }
+ bp->morphing = 1;
+
+ morph_colour(bp);
+}
+
+#if 0
+/* Returns morph progress */
+static float morph(long iter_msec)
+{
+ /* work out the maximum angle for this iteration */
+ int still_morphing;
+ float iter_angle_max, largest_diff, largest_progress;
+ int i;
+
+ if (bp->new_morph)
+ bp->new_morph = 0;
+
+ iter_angle_max = 90.0 * (angvel/1000.0) * iter_msec;
+
+ still_morphing = 0;
+ largest_diff = largest_progress = 0.0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ float curAngle = bp->node[i];
+ float destAngle = model[bp->next_model].node[i];
+ if (curAngle != destAngle) {
+ still_morphing = 1;
+ if (fabs(curAngle-destAngle) <= iter_angle_max)
+ bp->node[i] = destAngle;
+ else if (fmod(curAngle-destAngle+360,360) > 180)
+ bp->node[i] = fmod(curAngle + iter_angle_max, 360);
+ else
+ bp->node[i] = fmod(curAngle+360 - iter_angle_max, 360);
+ largest_diff = MAX(largest_diff, fabs(destAngle-bp->node[i]));
+ largest_progress = MAX(largest_diff, fabs(bp->node[i] - model[bp->prev_model].node[i]));
+ }
+ }
+
+ return MIN(largest_diff / largest_progress, 1.0);
+}
+#endif
+
+
+#ifdef HAVE_GLUT
+static void glsnake_idle();
+
+static restore_idle(int v __attribute__((__unused__)))
+{
+ glutIdleFunc(glsnake_idle);
+}
+#endif
+
+static void quick_sleep(void)
+{
+#ifdef HAVE_GLUT
+ /* By using glutTimerFunc we can keep responding to
+ * mouse and keyboard events, unlike using something like
+ * usleep. */
+ glutIdleFunc(NULL);
+ glutTimerFunc(1, restore_idle, 0);
+#else
+ usleep(1);
+#endif
+}
+
+static void glsnake_idle(
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp
+#endif
+ )
+{
+ /* time since last iteration */
+ long iter_msec;
+ /* time since the beginning of last morph */
+ long morf_msec;
+ float iter_angle_max;
+ snaketime current_time;
+ /* morphFunc transition; */
+ int still_morphing;
+ int i;
+
+ /* Do nothing to the model if we are paused */
+ if (bp->paused) {
+ /* Avoid busy waiting when nothing is changing */
+ quick_sleep();
+#ifdef HAVE_GLUT
+ glutSwapBuffers();
+ glutPostRedisplay();
+#endif
+ return;
+ }
+
+ /* <spiv> Well, ftime gives time with millisecond resolution.
+ * <spiv> (or worse, perhaps... who knows what the OS will do)
+ * <spiv> So if no discernable amount of time has passed:
+ * <spiv> a) There's no point updating the screen, because
+ * it would be the same
+ * <spiv> b) The code will divide by zero
+ */
+ gettime(&current_time);
+
+ iter_msec = (long) GETMSECS(current_time) - GETMSECS(bp->last_iteration) +
+ ((long) GETSECS(current_time) - GETSECS(bp->last_iteration)) * 1000L;
+
+ if (iter_msec) {
+ /* save the current time */
+ memcpy(&bp->last_iteration, &current_time, sizeof(snaketime));
+
+ /* work out if we have to switch models */
+ morf_msec = GETMSECS(bp->last_iteration) - GETMSECS(bp->last_morph) +
+ ((long) (GETSECS(bp->last_iteration)-GETSECS(bp->last_morph)) * 1000L);
+
+ if ((morf_msec > statictime) && !interactive && !bp->morphing) {
+ /*printf("starting morph\n");*/
+ memcpy(&bp->last_morph, &(bp->last_iteration), sizeof(bp->last_morph));
+ start_morph(bp, RAND(models), 0);
+ }
+
+ if (interactive && !bp->morphing) {
+ quick_sleep();
+ return;
+ }
+
+ /* if (!bp->dragging && !bp->interactive) { */
+ if (!interactive) {
+
+ yspin += 360/((1000/yangvel)/iter_msec);
+ zspin += 360/((1000/zangvel)/iter_msec);
+ /*
+ yspin += 360 * (yangvel/1000.0) * iter_msec;
+ zspin += 360 * (zangvel/1000.0) * iter_msec;
+ */
+
+ /*printf("yspin: %f, zspin: %f\n", yspin, zspin);*/
+
+ }
+
+ /* work out the maximum angle we could turn this node in this
+ * timeslice, iter_msec milliseconds long */
+ iter_angle_max = 90.0 * (angvel/1000.0) * iter_msec;
+
+ still_morphing = 0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ float cur_angle = bp->node[i];
+ float dest_angle = model[bp->next_model].node[i];
+ if (cur_angle != dest_angle) {
+ still_morphing = 1;
+ if (fabs(cur_angle - dest_angle) <= iter_angle_max)
+ bp->node[i] = dest_angle;
+ else if (fmod(cur_angle - dest_angle + 360, 360) > 180)
+ bp->node[i] = fmod(cur_angle + iter_angle_max, 360);
+ else
+ bp->node[i] = fmod(cur_angle + 360 - iter_angle_max, 360);
+ }
+ }
+
+ if (!still_morphing)
+ bp->morphing = 0;
+
+ /* colour cycling */
+ morph_colour(bp);
+
+#ifdef HAVE_GLUT
+ glutSwapBuffers();
+ glutPostRedisplay();
+#endif
+ } else {
+ /* We are going too fast, so we may as well let the
+ * cpu relax a little by sleeping for a millisecond. */
+ quick_sleep();
+ }
+}
+
+/* wot draws it */
+ENTRYPOINT void glsnake_display(
+#ifndef HAVE_GLUT
+ ModeInfo * mi
+#endif
+ )
+{
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp = &glc[MI_SCREEN(mi)];
+ Display * dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+#endif
+
+ int i;
+ float ang;
+ float positions[NODE_COUNT][4]; /* origin points for each node */
+ float com[4]; /* it's the CENTRE of MASS */
+
+#ifndef HAVE_GLUT
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+#endif
+
+ gl_init(mi);
+
+ /* clear the buffer */
+ glClear((GLbitfield) GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* go into the modelview stack */
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ /* get the centre of each node, by moving through the snake and
+ * performing the rotations, then grabbing the matrix at each point
+ * and applying it to the origin */
+ glPushMatrix();
+
+#ifdef HAVE_GLUT
+ /* apply the mouse drag rotation */
+ ui_mousedrag();
+#endif
+
+ /* apply the continuous rotation */
+ glRotatef(yspin, 0.0, 1.0, 0.0);
+ glRotatef(zspin, 0.0, 0.0, 1.0);
+
+ com[0] = 0.0;
+ com[1] = 0.0;
+ com[2] = 0.0;
+ com[3] = 0.0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ float rotmat[16];
+
+ ang = bp->node[i];
+
+ /*printf("ang = %f\n", ang);*/
+
+ glTranslatef(0.5, 0.5, 0.5); /* move to center */
+ glRotatef(90.0, 0.0, 0.0, -1.0); /* reorient */
+ glTranslatef(1.0 + explode, 0.0, 0.0); /* move to new pos. */
+ glRotatef(180.0 + ang, 1.0, 0.0, 0.0); /* pivot to new angle */
+ glTranslatef(-0.5, -0.5, -0.5); /* return from center */
+
+ glGetFloatv(GL_MODELVIEW_MATRIX, rotmat);
+
+ matmult_origin(rotmat, positions[i]);
+
+ /*printf("positions %f %f %f %f\n", positions[i][0], positions[i][1], positions[i][2], positions[i][3]);*/
+
+ com[0] += positions[i][0];
+ com[1] += positions[i][1];
+ com[2] += positions[i][2];
+ com[3] += positions[i][3];
+ }
+ glPopMatrix();
+ com[0] /= NODE_COUNT;
+ com[1] /= NODE_COUNT;
+ com[2] /= NODE_COUNT;
+ com[3] /= NODE_COUNT;
+
+ com[0] /= com[3];
+ com[1] /= com[3];
+ com[2] /= com[3];
+
+ /*printf("com: %f, %f, %f, %f\n", com[0], com[1], com[2], com[3]);*/
+
+#if MAGICAL_RED_STRING
+ glPushMatrix();
+ glTranslatef(-com[0], -com[1], -com[2]);
+
+ glDisable(GL_LIGHTING);
+ glColor4f(1.0, 0.0, 0.0, 1.0);
+ glBegin(GL_LINE_STRIP);
+ for (i = 0; i < NODE_COUNT - 1; i++) {
+ glVertex3fv(positions[i]);
+ }
+ glEnd();
+ glEnable(GL_LIGHTING);
+ /*glTranslatef(com[0], com[1], com[2]);*/
+ glPopMatrix();
+#endif
+
+ glPushMatrix();
+ glTranslatef(-com[0], -com[1], -com[2]);
+
+#ifdef HAVE_GLUT
+ /* apply the mouse drag rotation */
+ ui_mousedrag();
+#endif
+
+ /* apply the continuous rotation */
+ glRotatef(yspin, 0.0, 1.0, 0.0);
+ glRotatef(zspin, 0.0, 0.0, 1.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ /* now draw each node along the snake -- this is quite ugly :p */
+ mi->polygon_count = 0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ /* choose a colour for this node */
+ if ((i == bp->selected || i == bp->selected+1) && interactive)
+ /* yellow */
+ glColor4f(1.0, 1.0, 0.0, 1.0);
+ else {
+ /*glColor4fv(bp->colour[(i+1)%2]);*/
+ glMaterialfv(GL_FRONT, GL_AMBIENT, bp->colour[(i+1)%2]);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, bp->colour[(i+1)%2]);
+ /*glMaterialfv(GL_FRONT, GL_SPECULAR, bp->colour[(i+1)%2]);*/
+ }
+
+ /* draw the node */
+ if (wireframe)
+ glCallList(bp->node_wire);
+ else
+ glCallList(bp->node_solid);
+ mi->polygon_count += bp->node_polys;
+
+ /* now work out where to draw the next one */
+
+ /* Interpolate between models */
+ ang = bp->node[i];
+
+ glTranslatef(0.5, 0.5, 0.5); /* move to center */
+ glRotatef(90.0, 0.0, 0.0, -1.0); /* reorient */
+ glTranslatef(1.0 + explode, 0.0, 0.0); /* move to new pos. */
+ glRotatef(180.0 + ang, 1.0, 0.0, 0.0); /* pivot to new angle */
+ glTranslatef(-0.5, -0.5, -0.5); /* return from center */
+ }
+
+ glPopMatrix();
+
+ if (titles)
+#ifdef HAVE_GLUT
+ draw_title();
+#else
+ draw_title(mi);
+#endif
+
+#ifndef HAVE_GLUT
+ glsnake_idle(bp);
+ if (mi->fps_p) do_fps(mi);
+#endif
+
+ glFlush();
+#ifdef HAVE_GLUT
+ glutSwapBuffers();
+#else
+ glXSwapBuffers(dpy, window);
+#endif
+}
+
+#ifdef HAVE_GLUT
+/* anything that needs to be cleaned up goes here */
+static void unmain()
+{
+ glutDestroyWindow(bp->window);
+ free(bp);
+}
+
+static void ui_init(int *, char **);
+
+int main(int argc, char ** argv)
+{
+ bp = malloc(sizeof(struct glsnake_cfg));
+ memset(bp, 0, sizeof(struct glsnake_cfg));
+
+ bp->width = 640;
+ bp->height = 480;
+
+ ui_init(&argc, argv);
+
+ gettime(&bp->last_iteration);
+ memcpy(&bp->last_morph, &bp->last_iteration, sizeof(snaketime));
+ srand((unsigned int)GETSECS(bp->last_iteration));
+
+ bp->prev_colour = bp->next_colour = COLOUR_ACYCLIC;
+ bp->next_model = RAND(models);
+ bp->prev_model = 0;
+ start_morph(bp->prev_model, 1);
+
+ glsnake_init();
+
+ atexit(unmain);
+ glutSwapBuffers();
+ glutMainLoop();
+
+ return 0;
+}
+#endif
+
+/*
+ * GLUT FUNCTIONS
+ */
+
+#ifdef HAVE_GLUT
+
+/* trackball quaternions */
+static float cumquat[4] = {0.0,0.0,0.0,0.0}, oldquat[4] = {0.0,0.0,0.0,0.1};
+
+/* rotation matrix */
+static float rotation[16];
+
+/* mouse drag vectors: start and end */
+static float mouse_start[3], mouse_end[3];
+
+/* dragging boolean */
+static int dragging = 0;
+
+/* this function calculates the rotation matrix based on the quaternions
+ * generated from the mouse drag vectors */
+static void calc_rotation()
+{
+ double Nq, s;
+ double xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
+
+ /* this bit ripped from Shoemake's quaternion notes from SIGGRAPH */
+ Nq = cumquat[0] * cumquat[0] + cumquat[1] * cumquat[1] +
+ cumquat[2] * cumquat[2] + cumquat[3] * cumquat[3];
+ s = (Nq > 0.0) ? (2.0 / Nq) : 0.0;
+ xs = cumquat[0] * s; ys = cumquat[1] * s; zs = cumquat[2] * s;
+ wx = cumquat[3] * xs; wy = cumquat[3] * ys; wz = cumquat[3] * zs;
+ xx = cumquat[0] * xs; xy = cumquat[0] * ys; xz = cumquat[0] * zs;
+ yy = cumquat[1] * ys; yz = cumquat[1] * zs; zz = cumquat[2] * zs;
+
+ rotation[0] = 1.0 - (yy + zz);
+ rotation[1] = xy + wz;
+ rotation[2] = xz - wy;
+ rotation[4] = xy - wz;
+ rotation[5] = 1.0 - (xx + zz);
+ rotation[6] = yz + wx;
+ rotation[8] = xz + wy;
+ rotation[9] = yz - wx;
+ rotation[10] = 1.0 - (xx + yy);
+ rotation[3] = rotation[7] = rotation[11] = 0.0;
+ rotation[12] = rotation[13] = rotation[14] = 0.0;
+ rotation[15] = 1.0;
+}
+
+static inline void ui_mousedrag()
+{
+ glMultMatrixf(rotation);
+}
+
+static void ui_keyboard(unsigned char c, int x__attribute__((__unused__)), int y __attribute__((__unused__)))
+{
+ int i;
+
+ switch (c) {
+ case 27: /* ESC */
+ case 'q':
+ exit(0);
+ break;
+ case 'e':
+ explode += DEF_EXPLODE;
+ glutPostRedisplay();
+ break;
+ case 'E':
+ explode -= DEF_EXPLODE;
+ if (explode < 0.0) explode = 0.0;
+ glutPostRedisplay();
+ break;
+ case '.':
+ /* next model */
+ bp->next_model++;
+ bp->next_model %= models;
+ start_morph(bp->next_model, 0);
+
+ /* Reset last_morph time */
+ gettime(&bp->last_morph);
+ break;
+ case ',':
+ /* previous model */
+ bp->next_model = (bp->next_model + (int)models - 1) % (int)models;
+ start_morph(bp->next_model, 0);
+
+ /* Reset bp->last_morph time */
+ gettime(&bp->last_morph);
+ break;
+ case '+':
+ angvel += DEF_ANGVEL;
+ break;
+ case '-':
+ if (angvel > DEF_ANGVEL)
+ angvel -= DEF_ANGVEL;
+ break;
+ case 'i':
+ if (interactive) {
+ /* Reset last_iteration and last_morph time */
+ gettime(&bp->last_iteration);
+ gettime(&bp->last_morph);
+ }
+ interactive = 1 - interactive;
+ glutPostRedisplay();
+ break;
+ case 'w':
+ wireframe = 1 - wireframe;
+ if (wireframe)
+ glDisable(GL_LIGHTING);
+ else
+ glEnable(GL_LIGHTING);
+ glutPostRedisplay();
+ break;
+ case 'a':
+ transparent = 1 - transparent;
+ if (transparent) {
+ glEnable(GL_BLEND);
+ } else {
+ glDisable(GL_BLEND);
+ }
+ break;
+ case 'p':
+ if (bp->paused) {
+ /* unpausing, reset last_iteration and last_morph time */
+ gettime(&bp->last_iteration);
+ gettime(&bp->last_morph);
+ }
+ bp->paused = 1 - bp->paused;
+ break;
+ case 'd':
+ /* dump the current model so we can add it! */
+ printf("# %s\nnoname:\t", model[bp->next_model].name);
+ {
+ int i;
+
+ for (i = 0; i < NODE_COUNT; i++) {
+ if (bp->node[i] == ZERO)
+ printf("Z");
+ else if (bp->node[i] == LEFT)
+ printf("L");
+ else if (bp->node[i] == PIN)
+ printf("P");
+ else if (bp->node[i] == RIGHT)
+ printf("R");
+ /*
+ else
+ printf("%f", node[i].curAngle);
+ */
+ if (i < NODE_COUNT - 1)
+ printf(" ");
+ }
+ }
+ printf("\n");
+ break;
+ case 'f':
+ bp->fullscreen = 1 - bp->fullscreen;
+ if (bp->fullscreen) {
+ bp->old_width = bp->width;
+ bp->old_height = bp->height;
+ glutFullScreen();
+ } else {
+ glutReshapeWindow(bp->old_width, bp->old_height);
+ glutPositionWindow(50,50);
+ }
+ break;
+ case 't':
+ titles = 1 - titles;
+ if (interactive || bp->paused)
+ glutPostRedisplay();
+ break;
+ case 'c':
+ altcolour = 1 - altcolour;
+ break;
+ case 'z':
+ zoom += 1.0;
+ glsnake_reshape(bp->width, bp->height);
+ break;
+ case 'Z':
+ zoom -= 1.0;
+ glsnake_reshape(bp->width, bp->height);
+ break;
+ default:
+ break;
+ }
+}
+
+static void ui_special(int key, int x__attribute__((__unused__)), int y __attribute__((__unused__)))
+{
+ float *destAngle = &(model[bp->next_model].node[bp->selected]);
+ int unknown_key = 0;
+
+ if (interactive) {
+ switch (key) {
+ case GLUT_KEY_UP:
+ bp->selected = (bp->selected + (NODE_COUNT - 2)) % (NODE_COUNT - 1);
+ break;
+ case GLUT_KEY_DOWN:
+ bp->selected = (bp->selected + 1) % (NODE_COUNT - 1);
+ break;
+ case GLUT_KEY_LEFT:
+ *destAngle = fmod(*destAngle+(LEFT), 360);
+ bp->morphing = bp->new_morph = 1;
+ break;
+ case GLUT_KEY_RIGHT:
+ *destAngle = fmod(*destAngle+(RIGHT), 360);
+ bp->morphing = bp->new_morph = 1;
+ break;
+ case GLUT_KEY_HOME:
+ start_morph(STRAIGHT_MODEL, 0);
+ break;
+ default:
+ unknown_key = 1;
+ break;
+ }
+ }
+ calc_snake_metrics();
+
+ if (!unknown_key)
+ glutPostRedisplay();
+}
+
+static void ui_mouse(int button, int state, int x, int y)
+{
+ if (button==0) {
+ switch (state) {
+ case GLUT_DOWN:
+ dragging = 1;
+ mouse_start[0] = M_SQRT1_2 *
+ (x - (bp->width / 2.0)) / (bp->width / 2.0);
+ mouse_start[1] = M_SQRT1_2 *
+ ((bp->height / 2.0) - y) / (bp->height / 2.0);
+ mouse_start[2] = sqrt((double)(1-(mouse_start[0]*mouse_start[0]+mouse_start[1]*mouse_start[1])));
+ break;
+ case GLUT_UP:
+ dragging = 0;
+ oldquat[0] = cumquat[0];
+ oldquat[1] = cumquat[1];
+ oldquat[2] = cumquat[2];
+ oldquat[3] = cumquat[3];
+ break;
+ default:
+ break;
+ }
+ }
+ glutPostRedisplay();
+}
+
+static void ui_motion(int x, int y)
+{
+ double norm;
+ float q[4];
+
+ if (dragging) {
+ /* construct the motion end vector from the x,y position on the
+ * window */
+ mouse_end[0] = M_SQRT1_2 * (x - (bp->width/ 2.0)) / (bp->width / 2.0);
+ mouse_end[1] = M_SQRT1_2 * ((bp->height / 2.0) - y) / (bp->height / 2.0);
+ /* calculate the normal of the vector... */
+ norm = mouse_end[0] * mouse_end[0] + mouse_end[1] * mouse_end[1];
+ /* check if norm is outside the sphere and wraparound if necessary */
+ if (norm > 1.0) {
+ mouse_end[0] = -mouse_end[0];
+ mouse_end[1] = -mouse_end[1];
+ mouse_end[2] = sqrt(norm - 1);
+ } else {
+ /* the z value comes from projecting onto an elliptical spheroid */
+ mouse_end[2] = sqrt(1 - norm);
+ }
+
+ /* now here, build a quaternion from mouse_start and mouse_end */
+ q[0] = mouse_start[1] * mouse_end[2] - mouse_start[2] * mouse_end[1];
+ q[1] = mouse_start[2] * mouse_end[0] - mouse_start[0] * mouse_end[2];
+ q[2] = mouse_start[0] * mouse_end[1] - mouse_start[1] * mouse_end[0];
+ q[3] = mouse_start[0] * mouse_end[0] + mouse_start[1] * mouse_end[1] + mouse_start[2] * mouse_end[2];
+
+ /* new rotation is the product of the new one and the old one */
+ cumquat[0] = q[3] * oldquat[0] + q[0] * oldquat[3] +
+ q[1] * oldquat[2] - q[2] * oldquat[1];
+ cumquat[1] = q[3] * oldquat[1] + q[1] * oldquat[3] +
+ q[2] * oldquat[0] - q[0] * oldquat[2];
+ cumquat[2] = q[3] * oldquat[2] + q[2] * oldquat[3] +
+ q[0] * oldquat[1] - q[1] * oldquat[0];
+ cumquat[3] = q[3] * oldquat[3] - q[0] * oldquat[0] -
+ q[1] * oldquat[1] - q[2] * oldquat[2];
+
+ calc_rotation();
+ }
+ glutPostRedisplay();
+}
+
+static void ui_init(int * argc, char ** argv)
+{
+ glutInit(argc, argv);
+ glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
+ glutInitWindowSize(bp->width, bp->height);
+ bp->window = glutCreateWindow("glsnake");
+
+ glutDisplayFunc(glsnake_display);
+ glutReshapeFunc(glsnake_reshape);
+ glutIdleFunc(glsnake_idle);
+ glutKeyboardFunc(ui_keyboard);
+ glutSpecialFunc(ui_special);
+ glutMouseFunc(ui_mouse);
+ glutMotionFunc(ui_motion);
+
+ yangvel = DEF_YANGVEL;
+ zangvel = DEF_ZANGVEL;
+ explode = DEF_EXPLODE;
+ angvel = DEF_ANGVEL;
+ statictime = DEF_STATICTIME;
+ altcolour = DEF_ALTCOLOUR;
+ titles = DEF_TITLES;
+ interactive = DEF_INTERACTIVE;
+ zoom = DEF_ZOOM;
+ wireframe = DEF_WIREFRAME;
+ transparent = DEF_TRANSPARENT;
+}
+#endif /* HAVE_GLUT */
+
+XSCREENSAVER_MODULE ("GLSnake", glsnake)
diff --git a/hacks/glx/glsnake.man b/hacks/glx/glsnake.man
new file mode 100644
index 0000000..217be2f
--- /dev/null
+++ b/hacks/glx/glsnake.man
@@ -0,0 +1,98 @@
+.\" Hey, EMACS: -*- nroff -*-
+.TH XScreenSaver 1 "January 15, 2001" "X Version 11"
+.SH NAME
+glsnake \- OpenGL enhanced Rubik's Snake cyclewaster.
+.SH SYNOPSIS
+.B glsnake
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+[\-wireframe] [\-altcolour]
+[\-angvel \fIangular\fP]
+[\-explode \fIdistance\fP]
+[\-statictime \fImilliseconds\fP]
+[\-yangvel \fIangle\fP]
+[\-zangvel \fIangle\fP]
+.SH DESCRIPTION
+.PP
+.B glsnake
+is an imitation of Rubiks\' Snake, using OpenGL.
+.SH OPTIONS
+.I glsnake
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-wireframe
+Display the snake in wireframe mode, rather than the default solid mode.
+.TP 8
+.B \-altcolour
+Use the alternate colour scheme for the snake. Shape identification using
+colour will be disabled.
+.TP 8
+.B -angvel \fIangular\fP
+Change the speed at which the snake morphs to a new shape.
+.TP 8
+.B -explode \fIdistance\fP
+Change the distance between the nodes of a snake.
+.TP 8
+.B \-statictime \fImilliseconds\fP
+Change the time between morphs.
+.TP 8
+.B \-yangvel \fIangle\fP
+Change the angle of rotation around the Y axis per frame.
+.TP 8
+.B \-zangvel \fIangle\fP
+Change the angle of rotation around the Z axis per frame.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH FILES
+.TP
+\fB/usr/share/glsnake/*.glsnake\fP
+This XScreenSaver will attempt to read model files installed with the interactive \fBglsnake\fP.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR glsnake (MANSUFFIX)
+.PP
+.EX
+http://spacepants.org/src/glsnake/
+.EE
+.SH BUGS
+The snake will happily intersect itself while morphing (this is not a bug).
+.PP
+The rotation/camera position sucks.
+.SH COPYRIGHT
+Copyright \(co 2001,2002 by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett.
+.PP
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+.PP
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+.SH AUTHOR
+Jamie Wilkinson <jaq@spacepants.org>, Andrew Bennetts <andrew@puzzling.org>,
+and Peter Aylett <peter@ylett.com>. Ported to XScreenSaver by Jamie Wilkinson.
diff --git a/hacks/glx/gltext.c b/hacks/glx/gltext.c
new file mode 100644
index 0000000..276c448
--- /dev/null
+++ b/hacks/glx/gltext.c
@@ -0,0 +1,660 @@
+/* gltext, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.orgq2
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*usePty: False \n" \
+
+# define release_text 0
+#define SMOOTH_TUBE /* whether to have smooth or faceted tubes */
+
+#ifdef SMOOTH_TUBE
+# define TUBE_FACES 12 /* how densely to render tubes */
+#else
+# define TUBE_FACES 8
+#endif
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "tube.h"
+#include "sphere.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "textclient.h"
+#include "utf8wc.h"
+
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_TEXT "(default)"
+#define DEF_PROGRAM "(default)"
+#define DEF_SCALE_FACTOR "0.01"
+#define DEF_WANDER_SPEED "0.02"
+#define DEF_MAX_LINES "8"
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_FACE_FRONT "True"
+#define DEF_USE_MONOSPACE "False"
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+
+#include "glutstroke.h"
+#include "glut_roman.h"
+#include "glut_mroman.h"
+#define GLUT_VARI_FONT (&glutStrokeRoman)
+#define GLUT_MONO_FONT (&glutStrokeMonoRoman)
+#define GLUT_FONT ((use_monospace) ? GLUT_MONO_FONT : GLUT_VARI_FONT)
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool spinx, spiny, spinz;
+
+ GLuint text_list;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+ char *text;
+ int reload;
+
+ time_t last_update;
+ text_data *tc;
+
+} text_configuration;
+
+static text_configuration *tps = NULL;
+
+static char *text_fmt;
+static char *program_str;
+static float scale_factor;
+static int max_no_lines;
+static float wander_speed;
+static char *do_spin;
+static Bool do_wander;
+static Bool face_front_p;
+static Bool use_monospace;
+
+static XrmOptionDescRec opts[] = {
+ { "-text", ".text", XrmoptionSepArg, 0 },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-scale", ".scaleFactor", XrmoptionSepArg, 0 },
+ { "-maxlines", ".maxLines", XrmoptionSepArg, 0 },
+ { "-wander-speed", ".wanderSpeed", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-front", ".faceFront", XrmoptionNoArg, "True" },
+ { "+front", ".faceFront", XrmoptionNoArg, "False" },
+ { "-mono", ".useMonoSpace", XrmoptionNoArg, "True" },
+ { "+mono", ".useMonoSpace", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&text_fmt, "text", "Text", DEF_TEXT, t_String},
+ {&program_str, "program", "Program", DEF_PROGRAM, t_String},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&scale_factor, "scaleFactor", "ScaleFactor", DEF_SCALE_FACTOR, t_Float},
+ {&max_no_lines, "maxLines", "MaxLines", DEF_MAX_LINES, t_Int},
+ {&wander_speed, "wanderSpeed", "WanderSpeed", DEF_WANDER_SPEED, t_Float},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&face_front_p, "faceFront", "FaceFront", DEF_FACE_FRONT, t_Bool},
+ {&use_monospace, "useMonoSpace", "UseMonoSpace", DEF_USE_MONOSPACE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt text_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_text (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ static const GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0};
+
+ if (!wire)
+ {
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ }
+
+ tp->text_list = glGenLists (1);
+ glNewList (tp->text_list, GL_COMPILE);
+ glEndList ();
+}
+
+
+static void
+parse_text (ModeInfo *mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ char *old = tp->text;
+
+ if (program_str && *program_str && !!strcmp(program_str, "(default)"))
+ {
+ int max_lines = max_no_lines;
+ char buf[4096];
+ char *p = buf;
+ int lines = 0;
+
+ if (! tp->tc)
+ tp->tc = textclient_open (mi->dpy);
+
+ while (p < buf + sizeof(buf) - 1 &&
+ lines < max_lines)
+ {
+ int c = textclient_getc (tp->tc);
+ if (c == '\n')
+ lines++;
+ if (c > 0)
+ *p++ = (char) c;
+ else
+ break;
+ }
+ *p = 0;
+ if (lines == 0 && buf[0])
+ lines++;
+
+ tp->text = strdup (buf);
+
+ tp->reload = 7; /* Let this one linger for a few seconds */
+ if (!*tp->text)
+ tp->reload = 1;
+
+ }
+ else if (!text_fmt || !*text_fmt || !strcmp(text_fmt, "(default)"))
+ {
+# ifdef HAVE_UNAME
+ struct utsname uts;
+
+ if (uname (&uts) < 0)
+ {
+ tp->text = strdup("uname() failed");
+ }
+ else
+ {
+ char *s;
+ if ((s = strchr(uts.nodename, '.')))
+ *s = 0;
+ tp->text = (char *) malloc(strlen(uts.nodename) +
+ strlen(uts.sysname) +
+ strlen(uts.version) +
+ strlen(uts.release) + 10);
+# if defined(_AIX)
+ sprintf(tp->text, "%s\n%s %s.%s",
+ uts.nodename, uts.sysname, uts.version, uts.release);
+# elif defined(USE_IPHONE)
+ /* "My iPhone\n iPhone4,1\n Darwin 11.0.0" */
+ sprintf(tp->text, "%s\n%s\n%s %s",
+ uts.nodename, uts.machine, uts.sysname, uts.release);
+# elif defined(__APPLE__) /* MacOS X + XDarwin */
+ {
+ const char *file =
+ "/System/Library/CoreServices/SystemVersion.plist";
+ FILE *f = fopen (file, "r");
+ char *pbv = 0, *pn = 0, *puvv = 0;
+ if (f) {
+ char *s, buf[255];
+
+ while (fgets (buf, sizeof(buf)-1, f)) {
+# define GRAB(S,V) \
+ if (strstr(buf, S)) { \
+ fgets (buf, sizeof(buf)-1, f); \
+ if ((s = strchr (buf, '>'))) V = strdup(s+1); \
+ if ((s = strchr (V, '<'))) *s = 0; \
+ }
+ GRAB ("ProductName", pn)
+ GRAB ("ProductBuildVersion", pbv)
+ GRAB ("ProductUserVisibleVersion", puvv)
+# undef GRAB
+ }
+ }
+ if (pbv)
+ sprintf (tp->text, "%s\n%s\n%s\n%s",
+ uts.nodename, pn, puvv, uts.machine);
+ else
+ sprintf(tp->text, "%s\n%s %s\n%s",
+ uts.nodename, uts.sysname, uts.release, uts.machine);
+ }
+# else
+ sprintf(tp->text, "%s\n%s %s",
+ uts.nodename, uts.sysname, uts.release);
+# endif /* special system types */
+ }
+# else /* !HAVE_UNAME */
+# ifdef VMS
+ tp->text = strdup(getenv("SYS$NODE"));
+# else
+ tp->text = strdup("* *\n* * *\nxscreensaver\n* * *\n* *");
+# endif
+# endif /* !HAVE_UNAME */
+ }
+ else if (!strchr (text_fmt, '%'))
+ {
+ tp->text = strdup (text_fmt);
+ }
+ else
+ {
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ int L = strlen(text_fmt) + 100;
+ tp->text = (char *) malloc (L);
+ *tp->text = 0;
+ strftime (tp->text, L-1, text_fmt, tm);
+ if (!*tp->text)
+ sprintf (tp->text, "strftime error:\n%s", text_fmt);
+ tp->reload = 1;
+ }
+
+ {
+ /* The GLUT font only has ASCII characters. */
+ char *s1 = utf8_to_latin1 (tp->text, True);
+ free (tp->text);
+ tp->text = s1;
+ }
+
+ /* If we had text before but got no text this time, hold on to the
+ old one, to avoid flickering.
+ */
+ if (old && *old && !*tp->text)
+ {
+ free (tp->text);
+ tp->text = old;
+ }
+ else if (old)
+ free (old);
+}
+
+
+ENTRYPOINT Bool
+text_handle_event (ModeInfo *mi, XEvent *event)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, tp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &tp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_text (ModeInfo *mi)
+{
+ text_configuration *tp;
+ int i;
+
+ MI_INIT (mi, tps);
+
+ tp = &tps[MI_SCREEN(mi)];
+
+ if ((tp->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ reshape_text (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.02;
+ double tilt_speed = 0.03;
+ double spin_accel = 0.5;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') tp->spinx = True;
+ else if (*s == 'y' || *s == 'Y') tp->spiny = True;
+ else if (*s == 'z' || *s == 'Z') tp->spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ tp->rot = make_rotator (tp->spinx ? spin_speed : 0,
+ tp->spiny ? spin_speed : 0,
+ tp->spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ tp->rot2 = (face_front_p
+ ? make_rotator (0, 0, 0, 0, tilt_speed, True)
+ : 0);
+ tp->trackball = gltrackball_init (False);
+ }
+
+ tp->ncolors = 255;
+ tp->colors = (XColor *) calloc(tp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ tp->colors, &tp->ncolors,
+ False, 0, False);
+
+ /* brighter colors, please... */
+ for (i = 0; i < tp->ncolors; i++)
+ {
+ tp->colors[i].red = (tp->colors[i].red / 2) + 32767;
+ tp->colors[i].green = (tp->colors[i].green / 2) + 32767;
+ tp->colors[i].blue = (tp->colors[i].blue / 2) + 32767;
+ }
+
+ parse_text (mi);
+
+}
+
+
+static int
+fill_character (GLUTstrokeFont font, int c, Bool wire, int *polysP)
+{
+ GLfloat tube_width = 10;
+
+ const StrokeCharRec *ch;
+ const StrokeRec *stroke;
+ const CoordRec *coord;
+ StrokeFontPtr fontinfo;
+ int i, j;
+
+ fontinfo = (StrokeFontPtr) font;
+
+ if (c < 0 || c >= fontinfo->num_chars)
+ return 0;
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ {
+ GLfloat lx=0, ly=0;
+ for (i = ch->num_strokes, stroke = ch->stroke;
+ i > 0; i--, stroke++) {
+ for (j = stroke->num_coords, coord = stroke->coord;
+ j > 0; j--, coord++)
+ {
+# ifdef SMOOTH_TUBE
+ int smooth = True;
+# else
+ int smooth = False;
+# endif
+
+ if (j != stroke->num_coords)
+ *polysP += tube (lx, ly, 0,
+ coord->x, coord->y, 0,
+ tube_width,
+ tube_width * 0.15,
+ TUBE_FACES, smooth, False, wire);
+ lx = coord->x;
+ ly = coord->y;
+
+ /* Put a sphere at the endpoint of every line segment. Wasteful
+ on curves like "0" but necessary on corners like "4". */
+ if (! wire)
+ {
+ glPushMatrix();
+ glTranslatef (lx, ly, 0);
+ glScalef (tube_width, tube_width, tube_width);
+ *polysP += unit_sphere (TUBE_FACES, TUBE_FACES, wire);
+ glPopMatrix();
+ }
+ }
+ }
+ return (int) (ch->right + tube_width);
+ }
+ return 0;
+}
+
+
+static int
+text_extents (const char *string, int *wP, int *hP)
+{
+ const char *s, *start;
+ int line_height = GLUT_FONT->top - GLUT_FONT->bottom;
+ int lines = 0;
+ *wP = 0;
+ *hP = 0;
+ start = string;
+ s = start;
+ while (1)
+ if (*s == '\n' || *s == 0)
+ {
+ int w = 0;
+ while (start < s)
+ {
+ w += glutStrokeWidth(GLUT_FONT, *start);
+ start++;
+ }
+ start = s+1;
+
+ if (w > *wP) *wP = w;
+ *hP += line_height;
+ lines++;
+ if (*s == 0) break;
+ s++;
+ }
+ else
+ s++;
+
+ return lines;
+}
+
+
+static unsigned long
+fill_string (const char *string, Bool wire)
+{
+ int polys = 0;
+ const char *s, *start;
+ int line_height = GLUT_FONT->top - GLUT_FONT->bottom;
+ int off;
+ GLfloat x = 0, y = 0;
+
+ int ow, oh;
+ text_extents (string, &ow, &oh);
+
+ y = oh / 2 - line_height;
+
+ start = string;
+ s = start;
+ while (1)
+ if (*s == '\n' || *s == 0)
+ {
+ int line_w = 0;
+ const char *s2;
+ const char *lstart = start;
+ const char *lend = s;
+
+ /* strip off whitespace at beginning and end of line
+ (since we're centering.) */
+ while (lend > lstart && isspace(lend[-1]))
+ lend--;
+ while (lstart < lend && isspace(*lstart))
+ lstart++;
+
+ for (s2 = lstart; s2 < lend; s2++)
+ line_w += glutStrokeWidth (GLUT_FONT, *s2);
+
+ x = (-ow/2) + ((ow-line_w)/2);
+ for (s2 = lstart; s2 < lend; s2++)
+ {
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ off = fill_character (GLUT_FONT, *s2, wire, &polys);
+ x += off;
+ glPopMatrix();
+ }
+
+ start = s+1;
+
+ y -= line_height;
+ if (*s == 0) break;
+ s++;
+ }
+ else
+ s++;
+ return polys;
+}
+
+
+ENTRYPOINT void
+draw_text (ModeInfo *mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat white[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat color[4] = {0.0, 0.0, 0.0, 1.0};
+
+ if (!tp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(tp->glx_context));
+
+ if (tp->reload)
+ {
+ if (time ((time_t *) 0) >= tp->last_update + tp->reload)
+ {
+ parse_text (mi);
+ tp->last_update = time ((time_t *) 0);
+ }
+ }
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glScalef(1.1, 1.1, 1.1);
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ {
+ double x, y, z;
+ get_position (tp->rot, &x, &y, &z, !tp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 8);
+
+ gltrackball_rotate (tp->trackball);
+
+ if (face_front_p)
+ {
+ double max = 90;
+ get_position (tp->rot2, &x, &y, &z, !tp->button_down_p);
+ if (tp->spinx) glRotatef (max/2 - x*max, 1, 0, 0);
+ if (tp->spiny) glRotatef (max/2 - y*max, 0, 1, 0);
+ if (tp->spinz) glRotatef (max/2 - z*max, 0, 0, 1);
+ }
+ else
+ {
+ get_rotation (tp->rot, &x, &y, &z, !tp->button_down_p);
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ }
+ }
+
+
+ glColor4fv (white);
+
+ color[0] = tp->colors[tp->ccolor].red / 65536.0;
+ color[1] = tp->colors[tp->ccolor].green / 65536.0;
+ color[2] = tp->colors[tp->ccolor].blue / 65536.0;
+ tp->ccolor++;
+ if (tp->ccolor >= tp->ncolors) tp->ccolor = 0;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ glScalef(scale_factor, scale_factor, scale_factor);
+
+ mi->polygon_count = fill_string(tp->text, wire);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_text(ModeInfo * mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ if (tp->tc)
+ textclient_close (tp->tc);
+}
+
+
+XSCREENSAVER_MODULE_2 ("GLText", gltext, text)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/gltext.man b/hacks/glx/gltext.man
new file mode 100644
index 0000000..0d30c5f
--- /dev/null
+++ b/hacks/glx/gltext.man
@@ -0,0 +1,152 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+gltext - draws text spinning around in 3D
+.SH SYNOPSIS
+.B gltext
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-text \fIstring\fP]
+[\-program \fIcommand\fP]
+[\-wander] [\-no-wander]
+[\-spin \fIaxes\fP]
+[\-no-spin]
+[\-front] [\-no\-front]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIgltext\fP program draws some text spinning around in 3D, using
+a font that appears to be made of solid tubes.
+.SH OPTIONS
+.I gltext
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-text \fIstring\fP
+The text to display. This may contain newlines, but it shouldn't be
+very long. The default is to display the machine name and OS version.
+
+This may also be a format string acceptable to
+.BR date (1)
+and
+.BR strftime (3) ,
+in which case, it will be updated once a second. So to make this
+program display a spinning digital clock, you could do this:
+.EX
+gltext -text "%A%n%d %b %Y%n%l:%M:%S %p"
+.EE
+To include a literal `%', you must double it: `%%'.
+
+See the man page for
+.BR strftime (3)
+for more details.
+.TP 8
+.B \-program \fIcommand\fP
+The given program is run, and its output is displayed.
+If specified, this overrides \fI\-text\fP.
+The output of this program will be repeatedely displayed, with new
+pages of text shifting in every few seconds. Lines should be relatively
+short. You might try:
+.EX
+-program 'xscreensaver-text --cols 20'
+.EE
+.TP 8
+.B \-maxlines
+Set the number of lines of text to display. By default,
+.I gltext
+will print 8 lines of text at a time. Use this option to increase or
+decrease that number. Be aware that
+.I gltext
+is designed to work with a fairly small amount of text, so setting this
+value too high might result in slow performance or strange behaviour
+stemming from buffer overflows. Increase at your own risk.
+.TP 8
+.B \-mono
+Display the text in a monospace font. Default is a variable-width font.
+.TP 8
+.B \-no\-mono
+Display the text in a variable-width font. This is the default.
+.TP 8
+.B \-wander
+Move the text around the screen. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the text centered on the screen.
+.TP 8
+.B \-wander\-speed
+Sets the speed at which the text wanders around. Default is 0.02.
+.TP 8
+.B \-spin
+Which axes around which the text should spin. The default is "XYZ",
+meaning rotate it freely in space. "\fB\-spin Z\fP" would rotate the
+text in the plane of the screen while not rotating it into or out
+of the screen; etc.
+.TP 8
+.B \-no\-spin
+Don't spin the text at all: the same as \fB\-spin ""\fP.
+.TP 8
+.B \-front
+When spinning, never spin all the way around or upside down:
+always face mostly forward so that the text is easily readable.
+.TP 8
+.B \-no\-front
+Allow spins to go all the way around or upside down. This is the default.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-scale
+Sets the scale at which the text is rendered. Bigger values will result
+in bigger text; smaller values will result in smaller text. The default
+value is 0.01.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver-text (1)
+.SH COPYRIGHT
+Copyright \(co 2001-2014 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/gltrackball.c b/hacks/glx/gltrackball.c
new file mode 100644
index 0000000..57b4b99
--- /dev/null
+++ b/hacks/glx/gltrackball.c
@@ -0,0 +1,337 @@
+/* gltrackball, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
+ * GL-flavored wrapper for trackball.c
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+# include "jwxyz.h"
+# include <GLES/gl.h>
+#else /* real X11 */
+# include <X11/X.h>
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+# define Button4 4 /* WTF */
+# define Button5 5
+# define Button6 6
+# define Button7 7
+
+#include "trackball.h"
+#include "gltrackball.h"
+
+#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+ /* Surely this should be defined somewhere more centrally... */
+# define HAVE_MOBILE
+#endif
+
+/* Bah, copied from ../fps.h */
+#ifdef HAVE_MOBILE
+ extern double current_device_rotation (void);
+#else
+# define current_device_rotation() (0)
+#endif
+
+
+struct trackball_state {
+ int ow, oh;
+ double x, y;
+ double dx, dy, ddx, ddy;
+ GLfloat q[4];
+ int button_down_p;
+ int ignore_device_rotation_p;
+};
+
+/* Returns a trackball_state object, which encapsulates the stuff necessary
+ to make dragging the mouse on the window of a GL program do the right thing.
+ */
+trackball_state *
+gltrackball_init (int ignore_device_rotation_p)
+{
+ trackball_state *ts = (trackball_state *) calloc (1, sizeof (*ts));
+ if (!ts) return 0;
+ ts->ignore_device_rotation_p = ignore_device_rotation_p;
+ trackball (ts->q, 0, 0, 0, 0);
+ return ts;
+}
+
+/* Device rotation interacts very strangely with mouse positions.
+ I'm not entirely sure this is the right fix.
+ */
+static void
+adjust_for_device_rotation (trackball_state *ts,
+ double *x, double *y, double *w, double *h)
+{
+ int rot = (int) current_device_rotation();
+ int swap;
+
+ if (ts->ignore_device_rotation_p) return;
+
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+
+ if (rot > 135 || rot < -135) /* 180 */
+ {
+ *x = *w - *x;
+ *y = *h - *y;
+ }
+ else if (rot > 45) /* 90 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *x = *w - *x;
+ }
+ else if (rot < -45) /* 270 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *y = *h - *y;
+ }
+}
+
+
+/* Begin tracking the mouse: Call this when the mouse button goes down.
+ x and y are the mouse position relative to the window.
+ w and h are the size of the window.
+ */
+void
+gltrackball_start (trackball_state *ts, int x, int y, int w, int h)
+{
+ ts->x = x;
+ ts->y = y;
+ ts->button_down_p = 1;
+ ts->dx = ts->ddx = 0;
+ ts->dy = ts->ddy = 0;
+}
+
+/* Stop tracking the mouse: Call this when the mouse button goes up.
+ */
+void
+gltrackball_stop (trackball_state *ts)
+{
+ ts->button_down_p = 0;
+}
+
+static void
+gltrackball_track_1 (trackball_state *ts,
+ double x, double y,
+ int w, int h,
+ int ignore_device_rotation_p)
+{
+ double X = x;
+ double Y = y;
+ double W = w, W2 = w;
+ double H = h, H2 = h;
+ float q2[4];
+ double ox = ts->x;
+ double oy = ts->y;
+
+ ts->x = x;
+ ts->y = y;
+
+ if (! ignore_device_rotation_p)
+ {
+ adjust_for_device_rotation (ts, &ox, &oy, &W, &H);
+ adjust_for_device_rotation (ts, &X, &Y, &W2, &H2);
+ }
+ trackball (q2,
+ (2 * ox - W) / W,
+ (H - 2 * oy) / H,
+ (2 * X - W) / W,
+ (H - 2 * Y) / H);
+
+ add_quats (q2, ts->q, ts->q);
+}
+
+
+/* Track the mouse: Call this each time the mouse moves with the button down.
+ x and y are the new mouse position relative to the window.
+ w and h are the size of the window.
+ */
+void
+gltrackball_track (trackball_state *ts, int x, int y, int w, int h)
+{
+ double dampen = 0.01; /* This keeps it going for about 3 sec */
+ ts->dx = x - ts->x;
+ ts->dy = y - ts->y;
+ ts->ddx = ts->dx * dampen;
+ ts->ddy = ts->dy * dampen;
+ ts->ow = w;
+ ts->oh = h;
+ gltrackball_track_1 (ts, x, y, w, h, False);
+}
+
+
+static void
+gltrackball_dampen (double *n, double *dn)
+{
+ int pos = (*n > 0);
+ *n -= *dn;
+ if (pos != (*n > 0))
+ *n = *dn = 0;
+}
+
+
+/* Reset the trackball to the default unrotated state,
+ plus an optional initial rotation.
+ */
+void
+gltrackball_reset (trackball_state *ts, float x, float y)
+{
+ int bd = ts->button_down_p;
+ int ig = ts->ignore_device_rotation_p;
+ memset (ts, 0, sizeof(*ts));
+ ts->button_down_p = bd;
+ ts->ignore_device_rotation_p = ig;
+ trackball (ts->q, 0, 0, x, y);
+}
+
+
+/* Execute the rotations current encapsulated in the trackball_state:
+ this does something analagous to glRotatef().
+ */
+void
+gltrackball_rotate (trackball_state *ts)
+{
+ GLfloat m[4][4];
+ if (!ts->button_down_p &&
+ (ts->ddx != 0 ||
+ ts->ddy != 0))
+ {
+ /* Apply inertia: keep moving in the same direction as the last move. */
+ gltrackball_track_1 (ts,
+ ts->x + ts->dx,
+ ts->y + ts->dy,
+ ts->ow, ts->oh,
+ False);
+
+ /* Dampen inertia: gradually stop spinning. */
+ gltrackball_dampen (&ts->dx, &ts->ddx);
+ gltrackball_dampen (&ts->dy, &ts->ddy);
+ }
+
+ build_rotmatrix (m, ts->q);
+ glMultMatrixf (&m[0][0]);
+}
+
+
+/* Call this when a mouse-wheel click is detected.
+ Clicks act like horizontal or vertical drags.
+ Percent is the length of the drag as a percentage of the screen size.
+ Button is 'Button4' or 'Button5' (for the vertical wheel)
+ or 'Button5' or 'Button6' (for the horizontal wheel).
+ If `flip_p' is true, swap the horizontal and vertical axes.
+ */
+void
+gltrackball_mousewheel (trackball_state *ts,
+ int button, int percent, int flip_p)
+{
+ int up_p;
+ int horizontal_p;
+ int mx, my, move, scale;
+
+#ifdef HAVE_JWXYZ
+ flip_p = 0; /* MacOS has already handled this. */
+#endif
+
+ switch (button) {
+ case Button4: up_p = 1; horizontal_p = 0; break;
+ case Button5: up_p = 0; horizontal_p = 0; break;
+ case Button6: up_p = 1; horizontal_p = 1; break;
+ case Button7: up_p = 0; horizontal_p = 1; break;
+ default: abort(); break;
+ }
+
+ if (flip_p)
+ {
+ horizontal_p = !horizontal_p;
+ up_p = !up_p;
+ }
+
+ scale = mx = my = 1000;
+ move = (up_p
+ ? floor (scale * (1.0 - (percent / 100.0)))
+ : ceil (scale * (1.0 + (percent / 100.0))));
+ if (horizontal_p) mx = move;
+ else my = move;
+ gltrackball_start (ts, scale, scale, scale*2, scale*2);
+ gltrackball_track (ts, mx, my, scale*2, scale*2);
+}
+
+void
+gltrackball_get_quaternion (trackball_state *ts, float q[4])
+{
+ int i;
+ for (i=0; i<4; i++)
+ q[i] = ts->q[i];
+}
+
+
+/* A utility function for event-handler functions:
+ Handles the various motion and click events related to trackballs.
+ Returns True if the event was handled.
+ */
+Bool
+gltrackball_event_handler (XEvent *event,
+ trackball_state *ts,
+ int window_width, int window_height,
+ Bool *button_down_p)
+{
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ *button_down_p = True;
+ gltrackball_start (ts,
+ event->xbutton.x, event->xbutton.y,
+ window_width, window_height);
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ *button_down_p = False;
+ gltrackball_stop (ts);
+ return True;
+ }
+ else if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button5 ||
+ event->xbutton.button == Button6 ||
+ event->xbutton.button == Button7))
+ {
+ gltrackball_mousewheel (ts, event->xbutton.button, 10,
+ !!event->xbutton.state);
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ *button_down_p)
+ {
+ gltrackball_track (ts,
+ event->xmotion.x, event->xmotion.y,
+ window_width, window_height);
+ return True;
+ }
+
+ return False;
+}
diff --git a/hacks/glx/gltrackball.h b/hacks/glx/gltrackball.h
new file mode 100644
index 0000000..ba9e574
--- /dev/null
+++ b/hacks/glx/gltrackball.h
@@ -0,0 +1,72 @@
+/* gltrackball, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
+ * GL-flavored wrapper for trackball.c
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __GLTRACKBALL_H__
+#define __GLTRACKBALL_H__
+
+typedef struct trackball_state trackball_state;
+
+/* Returns a trackball_state object, which encapsulates the stuff necessary
+ to make dragging the mouse on the window of a GL program do the right thing.
+ */
+extern trackball_state *gltrackball_init (int ignore_device_rotation_p);
+
+/* Begin tracking the mouse: Call this when the mouse button goes down.
+ x and y are the mouse position relative to the window.
+ w and h are the size of the window.
+ */
+extern void gltrackball_start (trackball_state *, int x, int y, int w, int h);
+
+/* Track the mouse: Call this each time the mouse moves with the button down.
+ x and y are the new mouse position relative to the window.
+ w and h are the size of the window.
+ */
+extern void gltrackball_track (trackball_state *, int x, int y, int w, int h);
+
+/* Stop tracking the mouse: Call this when the mouse button goes up.
+ */
+extern void gltrackball_stop (trackball_state *);
+
+/* Execute the rotations current encapsulated in the trackball_state:
+ this does something analagous to glRotatef().
+ */
+extern void gltrackball_rotate (trackball_state *);
+
+/* Call this when a mouse-wheel click is detected.
+ Clicks act like horizontal or vertical drags.
+ Percent is the length of the drag as a percentage of the screen size.
+ Button is 'Button4' or 'Button5' (for the vertical wheel)
+ or 'Button5' or 'Button6' (for the horizontal wheel).
+ If `flip_p' is true, swap the horizontal and vertical axes.
+ */
+void gltrackball_mousewheel (trackball_state *ts,
+ int button, int percent, int flip_p);
+
+/* Return the quaternion encapsulated by the trackball state.
+ */
+extern void gltrackball_get_quaternion (trackball_state *ts, float q[4]);
+
+/* Reset the trackball to the default unrotated state,
+ plus an optional initial rotation.
+ */
+extern void gltrackball_reset (trackball_state *ts, float x, float y);
+
+/* A utility function for event-handler functions:
+ Handles the various motion and click events related to trackballs.
+ Returns True if the event was handled.
+ */
+extern Bool gltrackball_event_handler (XEvent *,
+ trackball_state *,
+ int window_width, int window_height,
+ Bool *button_down_p);
+
+#endif /* __GLTRACKBALL_H__ */
diff --git a/hacks/glx/glut_mroman.h b/hacks/glx/glut_mroman.h
new file mode 100644
index 0000000..39eb171
--- /dev/null
+++ b/hacks/glx/glut_mroman.h
@@ -0,0 +1,2456 @@
+/* Roman monospaced simplex stroke font copyright (c) 1989, 1990, 1991
+ * by Sun Microsystems, Inc. and the X Consortium.
+ * Originally part of the GLUT library by Mark J. Kilgard.
+ * I have changed names so that this can be a .h rather than a .c file without
+ * causing name clashes with glut_roman.h
+ */
+
+#include "glutstroke.h"
+
+/* char: 33 '!' */
+
+static const CoordRec monoChar33_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 33.3333 },
+};
+
+static const CoordRec monoChar33_stroke1[] = {
+ { 52.381, 9.5238 },
+ { 47.6191, 4.7619 },
+ { 52.381, 0 },
+ { 57.1429, 4.7619 },
+ { 52.381, 9.5238 },
+};
+
+static const StrokeRec monoChar33[] = {
+ { 2, monoChar33_stroke0 },
+ { 5, monoChar33_stroke1 },
+};
+
+/* char: 34 '"' */
+
+static const CoordRec monoChar34_stroke0[] = {
+ { 33.3334, 100 },
+ { 33.3334, 66.6667 },
+};
+
+static const CoordRec monoChar34_stroke1[] = {
+ { 71.4286, 100 },
+ { 71.4286, 66.6667 },
+};
+
+static const StrokeRec monoChar34[] = {
+ { 2, monoChar34_stroke0 },
+ { 2, monoChar34_stroke1 },
+};
+
+/* char: 35 '#' */
+
+static const CoordRec monoChar35_stroke0[] = {
+ { 54.7619, 119.048 },
+ { 21.4286, -33.3333 },
+};
+
+static const CoordRec monoChar35_stroke1[] = {
+ { 83.3334, 119.048 },
+ { 50, -33.3333 },
+};
+
+static const CoordRec monoChar35_stroke2[] = {
+ { 21.4286, 57.1429 },
+ { 88.0952, 57.1429 },
+};
+
+static const CoordRec monoChar35_stroke3[] = {
+ { 16.6667, 28.5714 },
+ { 83.3334, 28.5714 },
+};
+
+static const StrokeRec monoChar35[] = {
+ { 2, monoChar35_stroke0 },
+ { 2, monoChar35_stroke1 },
+ { 2, monoChar35_stroke2 },
+ { 2, monoChar35_stroke3 },
+};
+
+/* char: 36 '$' */
+
+static const CoordRec monoChar36_stroke0[] = {
+ { 42.8571, 119.048 },
+ { 42.8571, -19.0476 },
+};
+
+static const CoordRec monoChar36_stroke1[] = {
+ { 61.9047, 119.048 },
+ { 61.9047, -19.0476 },
+};
+
+static const CoordRec monoChar36_stroke2[] = {
+ { 85.7143, 85.7143 },
+ { 76.1905, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+ { 28.5714, 95.2381 },
+ { 19.0476, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 23.8095, 66.6667 },
+ { 28.5714, 61.9048 },
+ { 38.0952, 57.1429 },
+ { 66.6666, 47.619 },
+ { 76.1905, 42.8571 },
+ { 80.9524, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 14.2857 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 19.0476, 14.2857 },
+};
+
+static const StrokeRec monoChar36[] = {
+ { 2, monoChar36_stroke0 },
+ { 2, monoChar36_stroke1 },
+ { 20, monoChar36_stroke2 },
+};
+
+/* char: 37 '%' */
+
+static const CoordRec monoChar37_stroke0[] = {
+ { 95.2381, 100 },
+ { 9.5238, 0 },
+};
+
+static const CoordRec monoChar37_stroke1[] = {
+ { 33.3333, 100 },
+ { 42.8571, 90.4762 },
+ { 42.8571, 80.9524 },
+ { 38.0952, 71.4286 },
+ { 28.5714, 66.6667 },
+ { 19.0476, 66.6667 },
+ { 9.5238, 76.1905 },
+ { 9.5238, 85.7143 },
+ { 14.2857, 95.2381 },
+ { 23.8095, 100 },
+ { 33.3333, 100 },
+ { 42.8571, 95.2381 },
+ { 57.1428, 90.4762 },
+ { 71.4286, 90.4762 },
+ { 85.7143, 95.2381 },
+ { 95.2381, 100 },
+};
+
+static const CoordRec monoChar37_stroke2[] = {
+ { 76.1905, 33.3333 },
+ { 66.6667, 28.5714 },
+ { 61.9048, 19.0476 },
+ { 61.9048, 9.5238 },
+ { 71.4286, 0 },
+ { 80.9524, 0 },
+ { 90.4762, 4.7619 },
+ { 95.2381, 14.2857 },
+ { 95.2381, 23.8095 },
+ { 85.7143, 33.3333 },
+ { 76.1905, 33.3333 },
+};
+
+static const StrokeRec monoChar37[] = {
+ { 2, monoChar37_stroke0 },
+ { 16, monoChar37_stroke1 },
+ { 11, monoChar37_stroke2 },
+};
+
+/* char: 38 '&' */
+
+static const CoordRec monoChar38_stroke0[] = {
+ { 100, 57.1429 },
+ { 100, 61.9048 },
+ { 95.2381, 66.6667 },
+ { 90.4762, 66.6667 },
+ { 85.7143, 61.9048 },
+ { 80.9524, 52.381 },
+ { 71.4286, 28.5714 },
+ { 61.9048, 14.2857 },
+ { 52.3809, 4.7619 },
+ { 42.8571, 0 },
+ { 23.8095, 0 },
+ { 14.2857, 4.7619 },
+ { 9.5238, 9.5238 },
+ { 4.7619, 19.0476 },
+ { 4.7619, 28.5714 },
+ { 9.5238, 38.0952 },
+ { 14.2857, 42.8571 },
+ { 47.619, 61.9048 },
+ { 52.3809, 66.6667 },
+ { 57.1429, 76.1905 },
+ { 57.1429, 85.7143 },
+ { 52.3809, 95.2381 },
+ { 42.8571, 100 },
+ { 33.3333, 95.2381 },
+ { 28.5714, 85.7143 },
+ { 28.5714, 76.1905 },
+ { 33.3333, 61.9048 },
+ { 42.8571, 47.619 },
+ { 66.6667, 14.2857 },
+ { 76.1905, 4.7619 },
+ { 85.7143, 0 },
+ { 95.2381, 0 },
+ { 100, 4.7619 },
+ { 100, 9.5238 },
+};
+
+static const StrokeRec monoChar38[] = {
+ { 34, monoChar38_stroke0 },
+};
+
+/* char: 39 ''' */
+
+static const CoordRec monoChar39_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 66.6667 },
+};
+
+static const StrokeRec monoChar39[] = {
+ { 2, monoChar39_stroke0 },
+};
+
+/* char: 40 '(' */
+
+static const CoordRec monoChar40_stroke0[] = {
+ { 69.0476, 119.048 },
+ { 59.5238, 109.524 },
+ { 50, 95.2381 },
+ { 40.4762, 76.1905 },
+ { 35.7143, 52.381 },
+ { 35.7143, 33.3333 },
+ { 40.4762, 9.5238 },
+ { 50, -9.5238 },
+ { 59.5238, -23.8095 },
+ { 69.0476, -33.3333 },
+};
+
+static const StrokeRec monoChar40[] = {
+ { 10, monoChar40_stroke0 },
+};
+
+/* char: 41 ')' */
+
+static const CoordRec monoChar41_stroke0[] = {
+ { 35.7143, 119.048 },
+ { 45.2381, 109.524 },
+ { 54.7619, 95.2381 },
+ { 64.2857, 76.1905 },
+ { 69.0476, 52.381 },
+ { 69.0476, 33.3333 },
+ { 64.2857, 9.5238 },
+ { 54.7619, -9.5238 },
+ { 45.2381, -23.8095 },
+ { 35.7143, -33.3333 },
+};
+
+static const StrokeRec monoChar41[] = {
+ { 10, monoChar41_stroke0 },
+};
+
+/* char: 42 '*' */
+
+static const CoordRec monoChar42_stroke0[] = {
+ { 52.381, 71.4286 },
+ { 52.381, 14.2857 },
+};
+
+static const CoordRec monoChar42_stroke1[] = {
+ { 28.5715, 57.1429 },
+ { 76.1905, 28.5714 },
+};
+
+static const CoordRec monoChar42_stroke2[] = {
+ { 76.1905, 57.1429 },
+ { 28.5715, 28.5714 },
+};
+
+static const StrokeRec monoChar42[] = {
+ { 2, monoChar42_stroke0 },
+ { 2, monoChar42_stroke1 },
+ { 2, monoChar42_stroke2 },
+};
+
+/* char: 43 '+' */
+
+static const CoordRec monoChar43_stroke0[] = {
+ { 52.3809, 85.7143 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar43_stroke1[] = {
+ { 9.5238, 42.8571 },
+ { 95.2381, 42.8571 },
+};
+
+static const StrokeRec monoChar43[] = {
+ { 2, monoChar43_stroke0 },
+ { 2, monoChar43_stroke1 },
+};
+
+/* char: 44 ',' */
+
+static const CoordRec monoChar44_stroke0[] = {
+ { 57.1429, 4.7619 },
+ { 52.381, 0 },
+ { 47.6191, 4.7619 },
+ { 52.381, 9.5238 },
+ { 57.1429, 4.7619 },
+ { 57.1429, -4.7619 },
+ { 52.381, -14.2857 },
+ { 47.6191, -19.0476 },
+};
+
+static const StrokeRec monoChar44[] = {
+ { 8, monoChar44_stroke0 },
+};
+
+/* char: 45 '-' */
+
+static const CoordRec monoChar45_stroke0[] = {
+ { 9.5238, 42.8571 },
+ { 95.2381, 42.8571 },
+};
+
+static const StrokeRec monoChar45[] = {
+ { 2, monoChar45_stroke0 },
+};
+
+/* char: 46 '.' */
+
+static const CoordRec monoChar46_stroke0[] = {
+ { 52.381, 9.5238 },
+ { 47.6191, 4.7619 },
+ { 52.381, 0 },
+ { 57.1429, 4.7619 },
+ { 52.381, 9.5238 },
+};
+
+static const StrokeRec monoChar46[] = {
+ { 5, monoChar46_stroke0 },
+};
+
+/* char: 47 '/' */
+
+static const CoordRec monoChar47_stroke0[] = {
+ { 19.0476, -14.2857 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar47[] = {
+ { 2, monoChar47_stroke0 },
+};
+
+/* char: 48 '0' */
+
+static const CoordRec monoChar48_stroke0[] = {
+ { 47.619, 100 },
+ { 33.3333, 95.2381 },
+ { 23.8095, 80.9524 },
+ { 19.0476, 57.1429 },
+ { 19.0476, 42.8571 },
+ { 23.8095, 19.0476 },
+ { 33.3333, 4.7619 },
+ { 47.619, 0 },
+ { 57.1428, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 19.0476 },
+ { 85.7143, 42.8571 },
+ { 85.7143, 57.1429 },
+ { 80.9524, 80.9524 },
+ { 71.4286, 95.2381 },
+ { 57.1428, 100 },
+ { 47.619, 100 },
+};
+
+static const StrokeRec monoChar48[] = {
+ { 17, monoChar48_stroke0 },
+};
+
+/* char: 49 '1' */
+
+static const CoordRec monoChar49_stroke0[] = {
+ { 40.4762, 80.9524 },
+ { 50, 85.7143 },
+ { 64.2857, 100 },
+ { 64.2857, 0 },
+};
+
+static const StrokeRec monoChar49[] = {
+ { 4, monoChar49_stroke0 },
+};
+
+/* char: 50 '2' */
+
+static const CoordRec monoChar50_stroke0[] = {
+ { 23.8095, 76.1905 },
+ { 23.8095, 80.9524 },
+ { 28.5714, 90.4762 },
+ { 33.3333, 95.2381 },
+ { 42.8571, 100 },
+ { 61.9047, 100 },
+ { 71.4286, 95.2381 },
+ { 76.1905, 90.4762 },
+ { 80.9524, 80.9524 },
+ { 80.9524, 71.4286 },
+ { 76.1905, 61.9048 },
+ { 66.6666, 47.619 },
+ { 19.0476, 0 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar50[] = {
+ { 14, monoChar50_stroke0 },
+};
+
+/* char: 51 '3' */
+
+static const CoordRec monoChar51_stroke0[] = {
+ { 28.5714, 100 },
+ { 80.9524, 100 },
+ { 52.3809, 61.9048 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 57.1429 },
+ { 80.9524, 52.381 },
+ { 85.7143, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 80.9524, 14.2857 },
+ { 71.4286, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 23.8095, 9.5238 },
+ { 19.0476, 19.0476 },
+};
+
+static const StrokeRec monoChar51[] = {
+ { 15, monoChar51_stroke0 },
+};
+
+/* char: 52 '4' */
+
+static const CoordRec monoChar52_stroke0[] = {
+ { 64.2857, 100 },
+ { 16.6667, 33.3333 },
+ { 88.0952, 33.3333 },
+};
+
+static const CoordRec monoChar52_stroke1[] = {
+ { 64.2857, 100 },
+ { 64.2857, 0 },
+};
+
+static const StrokeRec monoChar52[] = {
+ { 3, monoChar52_stroke0 },
+ { 2, monoChar52_stroke1 },
+};
+
+/* char: 53 '5' */
+
+static const CoordRec monoChar53_stroke0[] = {
+ { 76.1905, 100 },
+ { 28.5714, 100 },
+ { 23.8095, 57.1429 },
+ { 28.5714, 61.9048 },
+ { 42.8571, 66.6667 },
+ { 57.1428, 66.6667 },
+ { 71.4286, 61.9048 },
+ { 80.9524, 52.381 },
+ { 85.7143, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 80.9524, 14.2857 },
+ { 71.4286, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 23.8095, 9.5238 },
+ { 19.0476, 19.0476 },
+};
+
+static const StrokeRec monoChar53[] = {
+ { 17, monoChar53_stroke0 },
+};
+
+/* char: 54 '6' */
+
+static const CoordRec monoChar54_stroke0[] = {
+ { 78.5714, 85.7143 },
+ { 73.8096, 95.2381 },
+ { 59.5238, 100 },
+ { 50, 100 },
+ { 35.7143, 95.2381 },
+ { 26.1905, 80.9524 },
+ { 21.4286, 57.1429 },
+ { 21.4286, 33.3333 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 50, 0 },
+ { 54.7619, 0 },
+ { 69.0476, 4.7619 },
+ { 78.5714, 14.2857 },
+ { 83.3334, 28.5714 },
+ { 83.3334, 33.3333 },
+ { 78.5714, 47.619 },
+ { 69.0476, 57.1429 },
+ { 54.7619, 61.9048 },
+ { 50, 61.9048 },
+ { 35.7143, 57.1429 },
+ { 26.1905, 47.619 },
+ { 21.4286, 33.3333 },
+};
+
+static const StrokeRec monoChar54[] = {
+ { 23, monoChar54_stroke0 },
+};
+
+/* char: 55 '7' */
+
+static const CoordRec monoChar55_stroke0[] = {
+ { 85.7143, 100 },
+ { 38.0952, 0 },
+};
+
+static const CoordRec monoChar55_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar55[] = {
+ { 2, monoChar55_stroke0 },
+ { 2, monoChar55_stroke1 },
+};
+
+/* char: 56 '8' */
+
+static const CoordRec monoChar56_stroke0[] = {
+ { 42.8571, 100 },
+ { 28.5714, 95.2381 },
+ { 23.8095, 85.7143 },
+ { 23.8095, 76.1905 },
+ { 28.5714, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 57.1428, 57.1429 },
+ { 71.4286, 52.381 },
+ { 80.9524, 42.8571 },
+ { 85.7143, 33.3333 },
+ { 85.7143, 19.0476 },
+ { 80.9524, 9.5238 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 23.8095, 9.5238 },
+ { 19.0476, 19.0476 },
+ { 19.0476, 33.3333 },
+ { 23.8095, 42.8571 },
+ { 33.3333, 52.381 },
+ { 47.619, 57.1429 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 66.6667 },
+ { 80.9524, 76.1905 },
+ { 80.9524, 85.7143 },
+ { 76.1905, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+};
+
+static const StrokeRec monoChar56[] = {
+ { 29, monoChar56_stroke0 },
+};
+
+/* char: 57 '9' */
+
+static const CoordRec monoChar57_stroke0[] = {
+ { 83.3334, 66.6667 },
+ { 78.5714, 52.381 },
+ { 69.0476, 42.8571 },
+ { 54.7619, 38.0952 },
+ { 50, 38.0952 },
+ { 35.7143, 42.8571 },
+ { 26.1905, 52.381 },
+ { 21.4286, 66.6667 },
+ { 21.4286, 71.4286 },
+ { 26.1905, 85.7143 },
+ { 35.7143, 95.2381 },
+ { 50, 100 },
+ { 54.7619, 100 },
+ { 69.0476, 95.2381 },
+ { 78.5714, 85.7143 },
+ { 83.3334, 66.6667 },
+ { 83.3334, 42.8571 },
+ { 78.5714, 19.0476 },
+ { 69.0476, 4.7619 },
+ { 54.7619, 0 },
+ { 45.2381, 0 },
+ { 30.9524, 4.7619 },
+ { 26.1905, 14.2857 },
+};
+
+static const StrokeRec monoChar57[] = {
+ { 23, monoChar57_stroke0 },
+};
+
+/* char: 58 ':' */
+
+static const CoordRec monoChar58_stroke0[] = {
+ { 52.381, 66.6667 },
+ { 47.6191, 61.9048 },
+ { 52.381, 57.1429 },
+ { 57.1429, 61.9048 },
+ { 52.381, 66.6667 },
+};
+
+static const CoordRec monoChar58_stroke1[] = {
+ { 52.381, 9.5238 },
+ { 47.6191, 4.7619 },
+ { 52.381, 0 },
+ { 57.1429, 4.7619 },
+ { 52.381, 9.5238 },
+};
+
+static const StrokeRec monoChar58[] = {
+ { 5, monoChar58_stroke0 },
+ { 5, monoChar58_stroke1 },
+};
+
+/* char: 59 ';' */
+
+static const CoordRec monoChar59_stroke0[] = {
+ { 52.381, 66.6667 },
+ { 47.6191, 61.9048 },
+ { 52.381, 57.1429 },
+ { 57.1429, 61.9048 },
+ { 52.381, 66.6667 },
+};
+
+static const CoordRec monoChar59_stroke1[] = {
+ { 57.1429, 4.7619 },
+ { 52.381, 0 },
+ { 47.6191, 4.7619 },
+ { 52.381, 9.5238 },
+ { 57.1429, 4.7619 },
+ { 57.1429, -4.7619 },
+ { 52.381, -14.2857 },
+ { 47.6191, -19.0476 },
+};
+
+static const StrokeRec monoChar59[] = {
+ { 5, monoChar59_stroke0 },
+ { 8, monoChar59_stroke1 },
+};
+
+/* char: 60 '<' */
+
+static const CoordRec monoChar60_stroke0[] = {
+ { 90.4762, 85.7143 },
+ { 14.2857, 42.8571 },
+ { 90.4762, 0 },
+};
+
+static const StrokeRec monoChar60[] = {
+ { 3, monoChar60_stroke0 },
+};
+
+/* char: 61 '=' */
+
+static const CoordRec monoChar61_stroke0[] = {
+ { 9.5238, 57.1429 },
+ { 95.2381, 57.1429 },
+};
+
+static const CoordRec monoChar61_stroke1[] = {
+ { 9.5238, 28.5714 },
+ { 95.2381, 28.5714 },
+};
+
+static const StrokeRec monoChar61[] = {
+ { 2, monoChar61_stroke0 },
+ { 2, monoChar61_stroke1 },
+};
+
+/* char: 62 '>' */
+
+static const CoordRec monoChar62_stroke0[] = {
+ { 14.2857, 85.7143 },
+ { 90.4762, 42.8571 },
+ { 14.2857, 0 },
+};
+
+static const StrokeRec monoChar62[] = {
+ { 3, monoChar62_stroke0 },
+};
+
+/* char: 63 '?' */
+
+static const CoordRec monoChar63_stroke0[] = {
+ { 23.8095, 76.1905 },
+ { 23.8095, 80.9524 },
+ { 28.5714, 90.4762 },
+ { 33.3333, 95.2381 },
+ { 42.8571, 100 },
+ { 61.9047, 100 },
+ { 71.4285, 95.2381 },
+ { 76.1905, 90.4762 },
+ { 80.9524, 80.9524 },
+ { 80.9524, 71.4286 },
+ { 76.1905, 61.9048 },
+ { 71.4285, 57.1429 },
+ { 52.3809, 47.619 },
+ { 52.3809, 33.3333 },
+};
+
+static const CoordRec monoChar63_stroke1[] = {
+ { 52.3809, 9.5238 },
+ { 47.619, 4.7619 },
+ { 52.3809, 0 },
+ { 57.1428, 4.7619 },
+ { 52.3809, 9.5238 },
+};
+
+static const StrokeRec monoChar63[] = {
+ { 14, monoChar63_stroke0 },
+ { 5, monoChar63_stroke1 },
+};
+
+/* char: 64 '@' */
+
+static const CoordRec monoChar64_stroke0[] = {
+ { 64.2857, 52.381 },
+ { 54.7619, 57.1429 },
+ { 45.2381, 57.1429 },
+ { 40.4762, 47.619 },
+ { 40.4762, 42.8571 },
+ { 45.2381, 33.3333 },
+ { 54.7619, 33.3333 },
+ { 64.2857, 38.0952 },
+};
+
+static const CoordRec monoChar64_stroke1[] = {
+ { 64.2857, 57.1429 },
+ { 64.2857, 38.0952 },
+ { 69.0476, 33.3333 },
+ { 78.5714, 33.3333 },
+ { 83.3334, 42.8571 },
+ { 83.3334, 47.619 },
+ { 78.5714, 61.9048 },
+ { 69.0476, 71.4286 },
+ { 54.7619, 76.1905 },
+ { 50, 76.1905 },
+ { 35.7143, 71.4286 },
+ { 26.1905, 61.9048 },
+ { 21.4286, 47.619 },
+ { 21.4286, 42.8571 },
+ { 26.1905, 28.5714 },
+ { 35.7143, 19.0476 },
+ { 50, 14.2857 },
+ { 54.7619, 14.2857 },
+ { 69.0476, 19.0476 },
+};
+
+static const StrokeRec monoChar64[] = {
+ { 8, monoChar64_stroke0 },
+ { 19, monoChar64_stroke1 },
+};
+
+/* char: 65 'A' */
+
+static const CoordRec monoChar65_stroke0[] = {
+ { 52.3809, 100 },
+ { 14.2857, 0 },
+};
+
+static const CoordRec monoChar65_stroke1[] = {
+ { 52.3809, 100 },
+ { 90.4762, 0 },
+};
+
+static const CoordRec monoChar65_stroke2[] = {
+ { 28.5714, 33.3333 },
+ { 76.1905, 33.3333 },
+};
+
+static const StrokeRec monoChar65[] = {
+ { 2, monoChar65_stroke0 },
+ { 2, monoChar65_stroke1 },
+ { 2, monoChar65_stroke2 },
+};
+
+/* char: 66 'B' */
+
+static const CoordRec monoChar66_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar66_stroke1[] = {
+ { 19.0476, 100 },
+ { 61.9047, 100 },
+ { 76.1905, 95.2381 },
+ { 80.9524, 90.4762 },
+ { 85.7143, 80.9524 },
+ { 85.7143, 71.4286 },
+ { 80.9524, 61.9048 },
+ { 76.1905, 57.1429 },
+ { 61.9047, 52.381 },
+};
+
+static const CoordRec monoChar66_stroke2[] = {
+ { 19.0476, 52.381 },
+ { 61.9047, 52.381 },
+ { 76.1905, 47.619 },
+ { 80.9524, 42.8571 },
+ { 85.7143, 33.3333 },
+ { 85.7143, 19.0476 },
+ { 80.9524, 9.5238 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 19.0476, 0 },
+};
+
+static const StrokeRec monoChar66[] = {
+ { 2, monoChar66_stroke0 },
+ { 9, monoChar66_stroke1 },
+ { 10, monoChar66_stroke2 },
+};
+
+/* char: 67 'C' */
+
+static const CoordRec monoChar67_stroke0[] = {
+ { 88.0952, 76.1905 },
+ { 83.3334, 85.7143 },
+ { 73.8096, 95.2381 },
+ { 64.2857, 100 },
+ { 45.2381, 100 },
+ { 35.7143, 95.2381 },
+ { 26.1905, 85.7143 },
+ { 21.4286, 76.1905 },
+ { 16.6667, 61.9048 },
+ { 16.6667, 38.0952 },
+ { 21.4286, 23.8095 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 45.2381, 0 },
+ { 64.2857, 0 },
+ { 73.8096, 4.7619 },
+ { 83.3334, 14.2857 },
+ { 88.0952, 23.8095 },
+};
+
+static const StrokeRec monoChar67[] = {
+ { 18, monoChar67_stroke0 },
+};
+
+/* char: 68 'D' */
+
+static const CoordRec monoChar68_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar68_stroke1[] = {
+ { 19.0476, 100 },
+ { 52.3809, 100 },
+ { 66.6666, 95.2381 },
+ { 76.1905, 85.7143 },
+ { 80.9524, 76.1905 },
+ { 85.7143, 61.9048 },
+ { 85.7143, 38.0952 },
+ { 80.9524, 23.8095 },
+ { 76.1905, 14.2857 },
+ { 66.6666, 4.7619 },
+ { 52.3809, 0 },
+ { 19.0476, 0 },
+};
+
+static const StrokeRec monoChar68[] = {
+ { 2, monoChar68_stroke0 },
+ { 12, monoChar68_stroke1 },
+};
+
+/* char: 69 'E' */
+
+static const CoordRec monoChar69_stroke0[] = {
+ { 21.4286, 100 },
+ { 21.4286, 0 },
+};
+
+static const CoordRec monoChar69_stroke1[] = {
+ { 21.4286, 100 },
+ { 83.3334, 100 },
+};
+
+static const CoordRec monoChar69_stroke2[] = {
+ { 21.4286, 52.381 },
+ { 59.5238, 52.381 },
+};
+
+static const CoordRec monoChar69_stroke3[] = {
+ { 21.4286, 0 },
+ { 83.3334, 0 },
+};
+
+static const StrokeRec monoChar69[] = {
+ { 2, monoChar69_stroke0 },
+ { 2, monoChar69_stroke1 },
+ { 2, monoChar69_stroke2 },
+ { 2, monoChar69_stroke3 },
+};
+
+/* char: 70 'F' */
+
+static const CoordRec monoChar70_stroke0[] = {
+ { 21.4286, 100 },
+ { 21.4286, 0 },
+};
+
+static const CoordRec monoChar70_stroke1[] = {
+ { 21.4286, 100 },
+ { 83.3334, 100 },
+};
+
+static const CoordRec monoChar70_stroke2[] = {
+ { 21.4286, 52.381 },
+ { 59.5238, 52.381 },
+};
+
+static const StrokeRec monoChar70[] = {
+ { 2, monoChar70_stroke0 },
+ { 2, monoChar70_stroke1 },
+ { 2, monoChar70_stroke2 },
+};
+
+/* char: 71 'G' */
+
+static const CoordRec monoChar71_stroke0[] = {
+ { 88.0952, 76.1905 },
+ { 83.3334, 85.7143 },
+ { 73.8096, 95.2381 },
+ { 64.2857, 100 },
+ { 45.2381, 100 },
+ { 35.7143, 95.2381 },
+ { 26.1905, 85.7143 },
+ { 21.4286, 76.1905 },
+ { 16.6667, 61.9048 },
+ { 16.6667, 38.0952 },
+ { 21.4286, 23.8095 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 45.2381, 0 },
+ { 64.2857, 0 },
+ { 73.8096, 4.7619 },
+ { 83.3334, 14.2857 },
+ { 88.0952, 23.8095 },
+ { 88.0952, 38.0952 },
+};
+
+static const CoordRec monoChar71_stroke1[] = {
+ { 64.2857, 38.0952 },
+ { 88.0952, 38.0952 },
+};
+
+static const StrokeRec monoChar71[] = {
+ { 19, monoChar71_stroke0 },
+ { 2, monoChar71_stroke1 },
+};
+
+/* char: 72 'H' */
+
+static const CoordRec monoChar72_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar72_stroke1[] = {
+ { 85.7143, 100 },
+ { 85.7143, 0 },
+};
+
+static const CoordRec monoChar72_stroke2[] = {
+ { 19.0476, 52.381 },
+ { 85.7143, 52.381 },
+};
+
+static const StrokeRec monoChar72[] = {
+ { 2, monoChar72_stroke0 },
+ { 2, monoChar72_stroke1 },
+ { 2, monoChar72_stroke2 },
+};
+
+/* char: 73 'I' */
+
+static const CoordRec monoChar73_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 0 },
+};
+
+static const StrokeRec monoChar73[] = {
+ { 2, monoChar73_stroke0 },
+};
+
+/* char: 74 'J' */
+
+static const CoordRec monoChar74_stroke0[] = {
+ { 76.1905, 100 },
+ { 76.1905, 23.8095 },
+ { 71.4286, 9.5238 },
+ { 66.6667, 4.7619 },
+ { 57.1429, 0 },
+ { 47.6191, 0 },
+ { 38.0953, 4.7619 },
+ { 33.3334, 9.5238 },
+ { 28.5715, 23.8095 },
+ { 28.5715, 33.3333 },
+};
+
+static const StrokeRec monoChar74[] = {
+ { 10, monoChar74_stroke0 },
+};
+
+/* char: 75 'K' */
+
+static const CoordRec monoChar75_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar75_stroke1[] = {
+ { 85.7143, 100 },
+ { 19.0476, 33.3333 },
+};
+
+static const CoordRec monoChar75_stroke2[] = {
+ { 42.8571, 57.1429 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar75[] = {
+ { 2, monoChar75_stroke0 },
+ { 2, monoChar75_stroke1 },
+ { 2, monoChar75_stroke2 },
+};
+
+/* char: 76 'L' */
+
+static const CoordRec monoChar76_stroke0[] = {
+ { 23.8095, 100 },
+ { 23.8095, 0 },
+};
+
+static const CoordRec monoChar76_stroke1[] = {
+ { 23.8095, 0 },
+ { 80.9524, 0 },
+};
+
+static const StrokeRec monoChar76[] = {
+ { 2, monoChar76_stroke0 },
+ { 2, monoChar76_stroke1 },
+};
+
+/* char: 77 'M' */
+
+static const CoordRec monoChar77_stroke0[] = {
+ { 14.2857, 100 },
+ { 14.2857, 0 },
+};
+
+static const CoordRec monoChar77_stroke1[] = {
+ { 14.2857, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar77_stroke2[] = {
+ { 90.4762, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar77_stroke3[] = {
+ { 90.4762, 100 },
+ { 90.4762, 0 },
+};
+
+static const StrokeRec monoChar77[] = {
+ { 2, monoChar77_stroke0 },
+ { 2, monoChar77_stroke1 },
+ { 2, monoChar77_stroke2 },
+ { 2, monoChar77_stroke3 },
+};
+
+/* char: 78 'N' */
+
+static const CoordRec monoChar78_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar78_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 0 },
+};
+
+static const CoordRec monoChar78_stroke2[] = {
+ { 85.7143, 100 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar78[] = {
+ { 2, monoChar78_stroke0 },
+ { 2, monoChar78_stroke1 },
+ { 2, monoChar78_stroke2 },
+};
+
+/* char: 79 'O' */
+
+static const CoordRec monoChar79_stroke0[] = {
+ { 42.8571, 100 },
+ { 33.3333, 95.2381 },
+ { 23.8095, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 14.2857, 61.9048 },
+ { 14.2857, 38.0952 },
+ { 19.0476, 23.8095 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 42.8571, 0 },
+ { 61.9047, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 23.8095 },
+ { 90.4762, 38.0952 },
+ { 90.4762, 61.9048 },
+ { 85.7143, 76.1905 },
+ { 80.9524, 85.7143 },
+ { 71.4286, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+};
+
+static const StrokeRec monoChar79[] = {
+ { 21, monoChar79_stroke0 },
+};
+
+/* char: 80 'P' */
+
+static const CoordRec monoChar80_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar80_stroke1[] = {
+ { 19.0476, 100 },
+ { 61.9047, 100 },
+ { 76.1905, 95.2381 },
+ { 80.9524, 90.4762 },
+ { 85.7143, 80.9524 },
+ { 85.7143, 66.6667 },
+ { 80.9524, 57.1429 },
+ { 76.1905, 52.381 },
+ { 61.9047, 47.619 },
+ { 19.0476, 47.619 },
+};
+
+static const StrokeRec monoChar80[] = {
+ { 2, monoChar80_stroke0 },
+ { 10, monoChar80_stroke1 },
+};
+
+/* char: 81 'Q' */
+
+static const CoordRec monoChar81_stroke0[] = {
+ { 42.8571, 100 },
+ { 33.3333, 95.2381 },
+ { 23.8095, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 14.2857, 61.9048 },
+ { 14.2857, 38.0952 },
+ { 19.0476, 23.8095 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 42.8571, 0 },
+ { 61.9047, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 23.8095 },
+ { 90.4762, 38.0952 },
+ { 90.4762, 61.9048 },
+ { 85.7143, 76.1905 },
+ { 80.9524, 85.7143 },
+ { 71.4286, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+};
+
+static const CoordRec monoChar81_stroke1[] = {
+ { 57.1428, 19.0476 },
+ { 85.7143, -9.5238 },
+};
+
+static const StrokeRec monoChar81[] = {
+ { 21, monoChar81_stroke0 },
+ { 2, monoChar81_stroke1 },
+};
+
+/* char: 82 'R' */
+
+static const CoordRec monoChar82_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar82_stroke1[] = {
+ { 19.0476, 100 },
+ { 61.9047, 100 },
+ { 76.1905, 95.2381 },
+ { 80.9524, 90.4762 },
+ { 85.7143, 80.9524 },
+ { 85.7143, 71.4286 },
+ { 80.9524, 61.9048 },
+ { 76.1905, 57.1429 },
+ { 61.9047, 52.381 },
+ { 19.0476, 52.381 },
+};
+
+static const CoordRec monoChar82_stroke2[] = {
+ { 52.3809, 52.381 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar82[] = {
+ { 2, monoChar82_stroke0 },
+ { 10, monoChar82_stroke1 },
+ { 2, monoChar82_stroke2 },
+};
+
+/* char: 83 'S' */
+
+static const CoordRec monoChar83_stroke0[] = {
+ { 85.7143, 85.7143 },
+ { 76.1905, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+ { 28.5714, 95.2381 },
+ { 19.0476, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 23.8095, 66.6667 },
+ { 28.5714, 61.9048 },
+ { 38.0952, 57.1429 },
+ { 66.6666, 47.619 },
+ { 76.1905, 42.8571 },
+ { 80.9524, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 14.2857 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 19.0476, 14.2857 },
+};
+
+static const StrokeRec monoChar83[] = {
+ { 20, monoChar83_stroke0 },
+};
+
+/* char: 84 'T' */
+
+static const CoordRec monoChar84_stroke0[] = {
+ { 52.3809, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar84_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar84[] = {
+ { 2, monoChar84_stroke0 },
+ { 2, monoChar84_stroke1 },
+};
+
+/* char: 85 'U' */
+
+static const CoordRec monoChar85_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 28.5714 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 47.619, 0 },
+ { 57.1428, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar85[] = {
+ { 10, monoChar85_stroke0 },
+};
+
+/* char: 86 'V' */
+
+static const CoordRec monoChar86_stroke0[] = {
+ { 14.2857, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar86_stroke1[] = {
+ { 90.4762, 100 },
+ { 52.3809, 0 },
+};
+
+static const StrokeRec monoChar86[] = {
+ { 2, monoChar86_stroke0 },
+ { 2, monoChar86_stroke1 },
+};
+
+/* char: 87 'W' */
+
+static const CoordRec monoChar87_stroke0[] = {
+ { 4.7619, 100 },
+ { 28.5714, 0 },
+};
+
+static const CoordRec monoChar87_stroke1[] = {
+ { 52.3809, 100 },
+ { 28.5714, 0 },
+};
+
+static const CoordRec monoChar87_stroke2[] = {
+ { 52.3809, 100 },
+ { 76.1905, 0 },
+};
+
+static const CoordRec monoChar87_stroke3[] = {
+ { 100, 100 },
+ { 76.1905, 0 },
+};
+
+static const StrokeRec monoChar87[] = {
+ { 2, monoChar87_stroke0 },
+ { 2, monoChar87_stroke1 },
+ { 2, monoChar87_stroke2 },
+ { 2, monoChar87_stroke3 },
+};
+
+/* char: 88 'X' */
+
+static const CoordRec monoChar88_stroke0[] = {
+ { 19.0476, 100 },
+ { 85.7143, 0 },
+};
+
+static const CoordRec monoChar88_stroke1[] = {
+ { 85.7143, 100 },
+ { 19.0476, 0 },
+};
+
+static const StrokeRec monoChar88[] = {
+ { 2, monoChar88_stroke0 },
+ { 2, monoChar88_stroke1 },
+};
+
+/* char: 89 'Y' */
+
+static const CoordRec monoChar89_stroke0[] = {
+ { 14.2857, 100 },
+ { 52.3809, 52.381 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar89_stroke1[] = {
+ { 90.4762, 100 },
+ { 52.3809, 52.381 },
+};
+
+static const StrokeRec monoChar89[] = {
+ { 3, monoChar89_stroke0 },
+ { 2, monoChar89_stroke1 },
+};
+
+/* char: 90 'Z' */
+
+static const CoordRec monoChar90_stroke0[] = {
+ { 85.7143, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar90_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 100 },
+};
+
+static const CoordRec monoChar90_stroke2[] = {
+ { 19.0476, 0 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar90[] = {
+ { 2, monoChar90_stroke0 },
+ { 2, monoChar90_stroke1 },
+ { 2, monoChar90_stroke2 },
+};
+
+/* char: 91 '[' */
+
+static const CoordRec monoChar91_stroke0[] = {
+ { 35.7143, 119.048 },
+ { 35.7143, -33.3333 },
+};
+
+static const CoordRec monoChar91_stroke1[] = {
+ { 40.4762, 119.048 },
+ { 40.4762, -33.3333 },
+};
+
+static const CoordRec monoChar91_stroke2[] = {
+ { 35.7143, 119.048 },
+ { 69.0476, 119.048 },
+};
+
+static const CoordRec monoChar91_stroke3[] = {
+ { 35.7143, -33.3333 },
+ { 69.0476, -33.3333 },
+};
+
+static const StrokeRec monoChar91[] = {
+ { 2, monoChar91_stroke0 },
+ { 2, monoChar91_stroke1 },
+ { 2, monoChar91_stroke2 },
+ { 2, monoChar91_stroke3 },
+};
+
+/* char: 92 '\' */
+
+static const CoordRec monoChar92_stroke0[] = {
+ { 19.0476, 100 },
+ { 85.7143, -14.2857 },
+};
+
+static const StrokeRec monoChar92[] = {
+ { 2, monoChar92_stroke0 },
+};
+
+/* char: 93 ']' */
+
+static const CoordRec monoChar93_stroke0[] = {
+ { 64.2857, 119.048 },
+ { 64.2857, -33.3333 },
+};
+
+static const CoordRec monoChar93_stroke1[] = {
+ { 69.0476, 119.048 },
+ { 69.0476, -33.3333 },
+};
+
+static const CoordRec monoChar93_stroke2[] = {
+ { 35.7143, 119.048 },
+ { 69.0476, 119.048 },
+};
+
+static const CoordRec monoChar93_stroke3[] = {
+ { 35.7143, -33.3333 },
+ { 69.0476, -33.3333 },
+};
+
+static const StrokeRec monoChar93[] = {
+ { 2, monoChar93_stroke0 },
+ { 2, monoChar93_stroke1 },
+ { 2, monoChar93_stroke2 },
+ { 2, monoChar93_stroke3 },
+};
+
+/* char: 94 '^' */
+
+static const CoordRec monoChar94_stroke0[] = {
+ { 52.3809, 109.524 },
+ { 14.2857, 42.8571 },
+};
+
+static const CoordRec monoChar94_stroke1[] = {
+ { 52.3809, 109.524 },
+ { 90.4762, 42.8571 },
+};
+
+static const StrokeRec monoChar94[] = {
+ { 2, monoChar94_stroke0 },
+ { 2, monoChar94_stroke1 },
+};
+
+/* char: 95 '_' */
+
+static const CoordRec monoChar95_stroke0[] = {
+ { 0, -33.3333 },
+ { 104.762, -33.3333 },
+ { 104.762, -28.5714 },
+ { 0, -28.5714 },
+ { 0, -33.3333 },
+};
+
+static const StrokeRec monoChar95[] = {
+ { 5, monoChar95_stroke0 },
+};
+
+/* char: 96 '`' */
+
+static const CoordRec monoChar96_stroke0[] = {
+ { 42.8572, 100 },
+ { 66.6667, 71.4286 },
+};
+
+static const CoordRec monoChar96_stroke1[] = {
+ { 42.8572, 100 },
+ { 38.0953, 95.2381 },
+ { 66.6667, 71.4286 },
+};
+
+static const StrokeRec monoChar96[] = {
+ { 2, monoChar96_stroke0 },
+ { 3, monoChar96_stroke1 },
+};
+
+/* char: 97 'a' */
+
+static const CoordRec monoChar97_stroke0[] = {
+ { 80.9524, 66.6667 },
+ { 80.9524, 0 },
+};
+
+static const CoordRec monoChar97_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar97[] = {
+ { 2, monoChar97_stroke0 },
+ { 14, monoChar97_stroke1 },
+};
+
+/* char: 98 'b' */
+
+static const CoordRec monoChar98_stroke0[] = {
+ { 23.8095, 100 },
+ { 23.8095, 0 },
+};
+
+static const CoordRec monoChar98_stroke1[] = {
+ { 23.8095, 52.381 },
+ { 33.3333, 61.9048 },
+ { 42.8571, 66.6667 },
+ { 57.1428, 66.6667 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 52.381 },
+ { 80.9524, 38.0952 },
+ { 80.9524, 28.5714 },
+ { 76.1905, 14.2857 },
+ { 66.6666, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 33.3333, 4.7619 },
+ { 23.8095, 14.2857 },
+};
+
+static const StrokeRec monoChar98[] = {
+ { 2, monoChar98_stroke0 },
+ { 14, monoChar98_stroke1 },
+};
+
+/* char: 99 'c' */
+
+static const CoordRec monoChar99_stroke0[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar99[] = {
+ { 14, monoChar99_stroke0 },
+};
+
+/* char: 100 'd' */
+
+static const CoordRec monoChar100_stroke0[] = {
+ { 80.9524, 100 },
+ { 80.9524, 0 },
+};
+
+static const CoordRec monoChar100_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar100[] = {
+ { 2, monoChar100_stroke0 },
+ { 14, monoChar100_stroke1 },
+};
+
+/* char: 101 'e' */
+
+static const CoordRec monoChar101_stroke0[] = {
+ { 23.8095, 38.0952 },
+ { 80.9524, 38.0952 },
+ { 80.9524, 47.619 },
+ { 76.1905, 57.1429 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar101[] = {
+ { 17, monoChar101_stroke0 },
+};
+
+/* char: 102 'f' */
+
+static const CoordRec monoChar102_stroke0[] = {
+ { 71.4286, 100 },
+ { 61.9048, 100 },
+ { 52.381, 95.2381 },
+ { 47.6191, 80.9524 },
+ { 47.6191, 0 },
+};
+
+static const CoordRec monoChar102_stroke1[] = {
+ { 33.3334, 66.6667 },
+ { 66.6667, 66.6667 },
+};
+
+static const StrokeRec monoChar102[] = {
+ { 5, monoChar102_stroke0 },
+ { 2, monoChar102_stroke1 },
+};
+
+/* char: 103 'g' */
+
+static const CoordRec monoChar103_stroke0[] = {
+ { 80.9524, 66.6667 },
+ { 80.9524, -9.5238 },
+ { 76.1905, -23.8095 },
+ { 71.4285, -28.5714 },
+ { 61.9047, -33.3333 },
+ { 47.619, -33.3333 },
+ { 38.0952, -28.5714 },
+};
+
+static const CoordRec monoChar103_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar103[] = {
+ { 7, monoChar103_stroke0 },
+ { 14, monoChar103_stroke1 },
+};
+
+/* char: 104 'h' */
+
+static const CoordRec monoChar104_stroke0[] = {
+ { 26.1905, 100 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar104_stroke1[] = {
+ { 26.1905, 47.619 },
+ { 40.4762, 61.9048 },
+ { 50, 66.6667 },
+ { 64.2857, 66.6667 },
+ { 73.8095, 61.9048 },
+ { 78.5715, 47.619 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar104[] = {
+ { 2, monoChar104_stroke0 },
+ { 7, monoChar104_stroke1 },
+};
+
+/* char: 105 'i' */
+
+static const CoordRec monoChar105_stroke0[] = {
+ { 47.6191, 100 },
+ { 52.381, 95.2381 },
+ { 57.1429, 100 },
+ { 52.381, 104.762 },
+ { 47.6191, 100 },
+};
+
+static const CoordRec monoChar105_stroke1[] = {
+ { 52.381, 66.6667 },
+ { 52.381, 0 },
+};
+
+static const StrokeRec monoChar105[] = {
+ { 5, monoChar105_stroke0 },
+ { 2, monoChar105_stroke1 },
+};
+
+/* char: 106 'j' */
+
+static const CoordRec monoChar106_stroke0[] = {
+ { 57.1429, 100 },
+ { 61.9048, 95.2381 },
+ { 66.6667, 100 },
+ { 61.9048, 104.762 },
+ { 57.1429, 100 },
+};
+
+static const CoordRec monoChar106_stroke1[] = {
+ { 61.9048, 66.6667 },
+ { 61.9048, -14.2857 },
+ { 57.1429, -28.5714 },
+ { 47.6191, -33.3333 },
+ { 38.0953, -33.3333 },
+};
+
+static const StrokeRec monoChar106[] = {
+ { 5, monoChar106_stroke0 },
+ { 5, monoChar106_stroke1 },
+};
+
+/* char: 107 'k' */
+
+static const CoordRec monoChar107_stroke0[] = {
+ { 26.1905, 100 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar107_stroke1[] = {
+ { 73.8095, 66.6667 },
+ { 26.1905, 19.0476 },
+};
+
+static const CoordRec monoChar107_stroke2[] = {
+ { 45.2381, 38.0952 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar107[] = {
+ { 2, monoChar107_stroke0 },
+ { 2, monoChar107_stroke1 },
+ { 2, monoChar107_stroke2 },
+};
+
+/* char: 108 'l' */
+
+static const CoordRec monoChar108_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 0 },
+};
+
+static const StrokeRec monoChar108[] = {
+ { 2, monoChar108_stroke0 },
+};
+
+/* char: 109 'm' */
+
+static const CoordRec monoChar109_stroke0[] = {
+ { 0, 66.6667 },
+ { 0, 0 },
+};
+
+static const CoordRec monoChar109_stroke1[] = {
+ { 0, 47.619 },
+ { 14.2857, 61.9048 },
+ { 23.8095, 66.6667 },
+ { 38.0952, 66.6667 },
+ { 47.619, 61.9048 },
+ { 52.381, 47.619 },
+ { 52.381, 0 },
+};
+
+static const CoordRec monoChar109_stroke2[] = {
+ { 52.381, 47.619 },
+ { 66.6667, 61.9048 },
+ { 76.1905, 66.6667 },
+ { 90.4762, 66.6667 },
+ { 100, 61.9048 },
+ { 104.762, 47.619 },
+ { 104.762, 0 },
+};
+
+static const StrokeRec monoChar109[] = {
+ { 2, monoChar109_stroke0 },
+ { 7, monoChar109_stroke1 },
+ { 7, monoChar109_stroke2 },
+};
+
+/* char: 110 'n' */
+
+static const CoordRec monoChar110_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar110_stroke1[] = {
+ { 26.1905, 47.619 },
+ { 40.4762, 61.9048 },
+ { 50, 66.6667 },
+ { 64.2857, 66.6667 },
+ { 73.8095, 61.9048 },
+ { 78.5715, 47.619 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar110[] = {
+ { 2, monoChar110_stroke0 },
+ { 7, monoChar110_stroke1 },
+};
+
+/* char: 111 'o' */
+
+static const CoordRec monoChar111_stroke0[] = {
+ { 45.2381, 66.6667 },
+ { 35.7143, 61.9048 },
+ { 26.1905, 52.381 },
+ { 21.4286, 38.0952 },
+ { 21.4286, 28.5714 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 45.2381, 0 },
+ { 59.5238, 0 },
+ { 69.0476, 4.7619 },
+ { 78.5714, 14.2857 },
+ { 83.3334, 28.5714 },
+ { 83.3334, 38.0952 },
+ { 78.5714, 52.381 },
+ { 69.0476, 61.9048 },
+ { 59.5238, 66.6667 },
+ { 45.2381, 66.6667 },
+};
+
+static const StrokeRec monoChar111[] = {
+ { 17, monoChar111_stroke0 },
+};
+
+/* char: 112 'p' */
+
+static const CoordRec monoChar112_stroke0[] = {
+ { 23.8095, 66.6667 },
+ { 23.8095, -33.3333 },
+};
+
+static const CoordRec monoChar112_stroke1[] = {
+ { 23.8095, 52.381 },
+ { 33.3333, 61.9048 },
+ { 42.8571, 66.6667 },
+ { 57.1428, 66.6667 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 52.381 },
+ { 80.9524, 38.0952 },
+ { 80.9524, 28.5714 },
+ { 76.1905, 14.2857 },
+ { 66.6666, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 33.3333, 4.7619 },
+ { 23.8095, 14.2857 },
+};
+
+static const StrokeRec monoChar112[] = {
+ { 2, monoChar112_stroke0 },
+ { 14, monoChar112_stroke1 },
+};
+
+/* char: 113 'q' */
+
+static const CoordRec monoChar113_stroke0[] = {
+ { 80.9524, 66.6667 },
+ { 80.9524, -33.3333 },
+};
+
+static const CoordRec monoChar113_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar113[] = {
+ { 2, monoChar113_stroke0 },
+ { 14, monoChar113_stroke1 },
+};
+
+/* char: 114 'r' */
+
+static const CoordRec monoChar114_stroke0[] = {
+ { 33.3334, 66.6667 },
+ { 33.3334, 0 },
+};
+
+static const CoordRec monoChar114_stroke1[] = {
+ { 33.3334, 38.0952 },
+ { 38.0953, 52.381 },
+ { 47.6191, 61.9048 },
+ { 57.1429, 66.6667 },
+ { 71.4286, 66.6667 },
+};
+
+static const StrokeRec monoChar114[] = {
+ { 2, monoChar114_stroke0 },
+ { 5, monoChar114_stroke1 },
+};
+
+/* char: 115 's' */
+
+static const CoordRec monoChar115_stroke0[] = {
+ { 78.5715, 52.381 },
+ { 73.8095, 61.9048 },
+ { 59.5238, 66.6667 },
+ { 45.2381, 66.6667 },
+ { 30.9524, 61.9048 },
+ { 26.1905, 52.381 },
+ { 30.9524, 42.8571 },
+ { 40.4762, 38.0952 },
+ { 64.2857, 33.3333 },
+ { 73.8095, 28.5714 },
+ { 78.5715, 19.0476 },
+ { 78.5715, 14.2857 },
+ { 73.8095, 4.7619 },
+ { 59.5238, 0 },
+ { 45.2381, 0 },
+ { 30.9524, 4.7619 },
+ { 26.1905, 14.2857 },
+};
+
+static const StrokeRec monoChar115[] = {
+ { 17, monoChar115_stroke0 },
+};
+
+/* char: 116 't' */
+
+static const CoordRec monoChar116_stroke0[] = {
+ { 47.6191, 100 },
+ { 47.6191, 19.0476 },
+ { 52.381, 4.7619 },
+ { 61.9048, 0 },
+ { 71.4286, 0 },
+};
+
+static const CoordRec monoChar116_stroke1[] = {
+ { 33.3334, 66.6667 },
+ { 66.6667, 66.6667 },
+};
+
+static const StrokeRec monoChar116[] = {
+ { 5, monoChar116_stroke0 },
+ { 2, monoChar116_stroke1 },
+};
+
+/* char: 117 'u' */
+
+static const CoordRec monoChar117_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 26.1905, 19.0476 },
+ { 30.9524, 4.7619 },
+ { 40.4762, 0 },
+ { 54.7619, 0 },
+ { 64.2857, 4.7619 },
+ { 78.5715, 19.0476 },
+};
+
+static const CoordRec monoChar117_stroke1[] = {
+ { 78.5715, 66.6667 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar117[] = {
+ { 7, monoChar117_stroke0 },
+ { 2, monoChar117_stroke1 },
+};
+
+/* char: 118 'v' */
+
+static const CoordRec monoChar118_stroke0[] = {
+ { 23.8095, 66.6667 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar118_stroke1[] = {
+ { 80.9524, 66.6667 },
+ { 52.3809, 0 },
+};
+
+static const StrokeRec monoChar118[] = {
+ { 2, monoChar118_stroke0 },
+ { 2, monoChar118_stroke1 },
+};
+
+/* char: 119 'w' */
+
+static const CoordRec monoChar119_stroke0[] = {
+ { 14.2857, 66.6667 },
+ { 33.3333, 0 },
+};
+
+static const CoordRec monoChar119_stroke1[] = {
+ { 52.3809, 66.6667 },
+ { 33.3333, 0 },
+};
+
+static const CoordRec monoChar119_stroke2[] = {
+ { 52.3809, 66.6667 },
+ { 71.4286, 0 },
+};
+
+static const CoordRec monoChar119_stroke3[] = {
+ { 90.4762, 66.6667 },
+ { 71.4286, 0 },
+};
+
+static const StrokeRec monoChar119[] = {
+ { 2, monoChar119_stroke0 },
+ { 2, monoChar119_stroke1 },
+ { 2, monoChar119_stroke2 },
+ { 2, monoChar119_stroke3 },
+};
+
+/* char: 120 'x' */
+
+static const CoordRec monoChar120_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 78.5715, 0 },
+};
+
+static const CoordRec monoChar120_stroke1[] = {
+ { 78.5715, 66.6667 },
+ { 26.1905, 0 },
+};
+
+static const StrokeRec monoChar120[] = {
+ { 2, monoChar120_stroke0 },
+ { 2, monoChar120_stroke1 },
+};
+
+/* char: 121 'y' */
+
+static const CoordRec monoChar121_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 54.7619, 0 },
+};
+
+static const CoordRec monoChar121_stroke1[] = {
+ { 83.3334, 66.6667 },
+ { 54.7619, 0 },
+ { 45.2381, -19.0476 },
+ { 35.7143, -28.5714 },
+ { 26.1905, -33.3333 },
+ { 21.4286, -33.3333 },
+};
+
+static const StrokeRec monoChar121[] = {
+ { 2, monoChar121_stroke0 },
+ { 6, monoChar121_stroke1 },
+};
+
+/* char: 122 'z' */
+
+static const CoordRec monoChar122_stroke0[] = {
+ { 78.5715, 66.6667 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar122_stroke1[] = {
+ { 26.1905, 66.6667 },
+ { 78.5715, 66.6667 },
+};
+
+static const CoordRec monoChar122_stroke2[] = {
+ { 26.1905, 0 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar122[] = {
+ { 2, monoChar122_stroke0 },
+ { 2, monoChar122_stroke1 },
+ { 2, monoChar122_stroke2 },
+};
+
+/* char: 123 '{' */
+
+static const CoordRec monoChar123_stroke0[] = {
+ { 64.2857, 119.048 },
+ { 54.7619, 114.286 },
+ { 50, 109.524 },
+ { 45.2381, 100 },
+ { 45.2381, 90.4762 },
+ { 50, 80.9524 },
+ { 54.7619, 76.1905 },
+ { 59.5238, 66.6667 },
+ { 59.5238, 57.1429 },
+ { 50, 47.619 },
+};
+
+static const CoordRec monoChar123_stroke1[] = {
+ { 54.7619, 114.286 },
+ { 50, 104.762 },
+ { 50, 95.2381 },
+ { 54.7619, 85.7143 },
+ { 59.5238, 80.9524 },
+ { 64.2857, 71.4286 },
+ { 64.2857, 61.9048 },
+ { 59.5238, 52.381 },
+ { 40.4762, 42.8571 },
+ { 59.5238, 33.3333 },
+ { 64.2857, 23.8095 },
+ { 64.2857, 14.2857 },
+ { 59.5238, 4.7619 },
+ { 54.7619, 0 },
+ { 50, -9.5238 },
+ { 50, -19.0476 },
+ { 54.7619, -28.5714 },
+};
+
+static const CoordRec monoChar123_stroke2[] = {
+ { 50, 38.0952 },
+ { 59.5238, 28.5714 },
+ { 59.5238, 19.0476 },
+ { 54.7619, 9.5238 },
+ { 50, 4.7619 },
+ { 45.2381, -4.7619 },
+ { 45.2381, -14.2857 },
+ { 50, -23.8095 },
+ { 54.7619, -28.5714 },
+ { 64.2857, -33.3333 },
+};
+
+static const StrokeRec monoChar123[] = {
+ { 10, monoChar123_stroke0 },
+ { 17, monoChar123_stroke1 },
+ { 10, monoChar123_stroke2 },
+};
+
+/* char: 124 '|' */
+
+static const CoordRec monoChar124_stroke0[] = {
+ { 52.381, 119.048 },
+ { 52.381, -33.3333 },
+};
+
+static const StrokeRec monoChar124[] = {
+ { 2, monoChar124_stroke0 },
+};
+
+/* char: 125 '}' */
+
+static const CoordRec monoChar125_stroke0[] = {
+ { 40.4762, 119.048 },
+ { 50, 114.286 },
+ { 54.7619, 109.524 },
+ { 59.5238, 100 },
+ { 59.5238, 90.4762 },
+ { 54.7619, 80.9524 },
+ { 50, 76.1905 },
+ { 45.2381, 66.6667 },
+ { 45.2381, 57.1429 },
+ { 54.7619, 47.619 },
+};
+
+static const CoordRec monoChar125_stroke1[] = {
+ { 50, 114.286 },
+ { 54.7619, 104.762 },
+ { 54.7619, 95.2381 },
+ { 50, 85.7143 },
+ { 45.2381, 80.9524 },
+ { 40.4762, 71.4286 },
+ { 40.4762, 61.9048 },
+ { 45.2381, 52.381 },
+ { 64.2857, 42.8571 },
+ { 45.2381, 33.3333 },
+ { 40.4762, 23.8095 },
+ { 40.4762, 14.2857 },
+ { 45.2381, 4.7619 },
+ { 50, 0 },
+ { 54.7619, -9.5238 },
+ { 54.7619, -19.0476 },
+ { 50, -28.5714 },
+};
+
+static const CoordRec monoChar125_stroke2[] = {
+ { 54.7619, 38.0952 },
+ { 45.2381, 28.5714 },
+ { 45.2381, 19.0476 },
+ { 50, 9.5238 },
+ { 54.7619, 4.7619 },
+ { 59.5238, -4.7619 },
+ { 59.5238, -14.2857 },
+ { 54.7619, -23.8095 },
+ { 50, -28.5714 },
+ { 40.4762, -33.3333 },
+};
+
+static const StrokeRec monoChar125[] = {
+ { 10, monoChar125_stroke0 },
+ { 17, monoChar125_stroke1 },
+ { 10, monoChar125_stroke2 },
+};
+
+/* char: 126 '~' */
+
+static const CoordRec monoChar126_stroke0[] = {
+ { 9.5238, 28.5714 },
+ { 9.5238, 38.0952 },
+ { 14.2857, 52.381 },
+ { 23.8095, 57.1429 },
+ { 33.3333, 57.1429 },
+ { 42.8571, 52.381 },
+ { 61.9048, 38.0952 },
+ { 71.4286, 33.3333 },
+ { 80.9524, 33.3333 },
+ { 90.4762, 38.0952 },
+ { 95.2381, 47.619 },
+};
+
+static const CoordRec monoChar126_stroke1[] = {
+ { 9.5238, 38.0952 },
+ { 14.2857, 47.619 },
+ { 23.8095, 52.381 },
+ { 33.3333, 52.381 },
+ { 42.8571, 47.619 },
+ { 61.9048, 33.3333 },
+ { 71.4286, 28.5714 },
+ { 80.9524, 28.5714 },
+ { 90.4762, 33.3333 },
+ { 95.2381, 47.619 },
+ { 95.2381, 57.1429 },
+};
+
+static const StrokeRec monoChar126[] = {
+ { 11, monoChar126_stroke0 },
+ { 11, monoChar126_stroke1 },
+};
+
+/* char: 127 */
+
+static const CoordRec monoChar127_stroke0[] = {
+ { 71.4286, 100 },
+ { 33.3333, -33.3333 },
+};
+
+static const CoordRec monoChar127_stroke1[] = {
+ { 47.619, 66.6667 },
+ { 33.3333, 61.9048 },
+ { 23.8095, 52.381 },
+ { 19.0476, 38.0952 },
+ { 19.0476, 23.8095 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 47.619, 0 },
+ { 57.1428, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 42.8571 },
+ { 80.9524, 52.381 },
+ { 71.4286, 61.9048 },
+ { 57.1428, 66.6667 },
+ { 47.619, 66.6667 },
+};
+
+static const StrokeRec monoChar127[] = {
+ { 2, monoChar127_stroke0 },
+ { 17, monoChar127_stroke1 },
+};
+
+static const StrokeCharRec monoChars[] = {
+ { 0, /* monoChar0 */ 0, 0, 0 },
+ { 0, /* monoChar1 */ 0, 0, 0 },
+ { 0, /* monoChar2 */ 0, 0, 0 },
+ { 0, /* monoChar3 */ 0, 0, 0 },
+ { 0, /* monoChar4 */ 0, 0, 0 },
+ { 0, /* monoChar5 */ 0, 0, 0 },
+ { 0, /* monoChar6 */ 0, 0, 0 },
+ { 0, /* monoChar7 */ 0, 0, 0 },
+ { 0, /* monoChar8 */ 0, 0, 0 },
+ { 0, /* monoChar9 */ 0, 0, 0 },
+ { 0, /* monoChar10 */ 0, 0, 0 },
+ { 0, /* monoChar11 */ 0, 0, 0 },
+ { 0, /* monoChar12 */ 0, 0, 0 },
+ { 0, /* monoChar13 */ 0, 0, 0 },
+ { 0, /* monoChar14 */ 0, 0, 0 },
+ { 0, /* monoChar15 */ 0, 0, 0 },
+ { 0, /* monoChar16 */ 0, 0, 0 },
+ { 0, /* monoChar17 */ 0, 0, 0 },
+ { 0, /* monoChar18 */ 0, 0, 0 },
+ { 0, /* monoChar19 */ 0, 0, 0 },
+ { 0, /* monoChar20 */ 0, 0, 0 },
+ { 0, /* monoChar21 */ 0, 0, 0 },
+ { 0, /* monoChar22 */ 0, 0, 0 },
+ { 0, /* monoChar23 */ 0, 0, 0 },
+ { 0, /* monoChar24 */ 0, 0, 0 },
+ { 0, /* monoChar25 */ 0, 0, 0 },
+ { 0, /* monoChar26 */ 0, 0, 0 },
+ { 0, /* monoChar27 */ 0, 0, 0 },
+ { 0, /* monoChar28 */ 0, 0, 0 },
+ { 0, /* monoChar29 */ 0, 0, 0 },
+ { 0, /* monoChar30 */ 0, 0, 0 },
+ { 0, /* monoChar31 */ 0, 0, 0 },
+ { 0, /* monoChar32 */ 0, 52.381, 104.762 },
+ { 2, monoChar33, 52.381, 104.762 },
+ { 2, monoChar34, 52.381, 104.762 },
+ { 4, monoChar35, 52.381, 104.762 },
+ { 3, monoChar36, 52.381, 104.762 },
+ { 3, monoChar37, 52.381, 104.762 },
+ { 1, monoChar38, 52.381, 104.762 },
+ { 1, monoChar39, 52.381, 104.762 },
+ { 1, monoChar40, 52.381, 104.762 },
+ { 1, monoChar41, 52.381, 104.762 },
+ { 3, monoChar42, 52.381, 104.762 },
+ { 2, monoChar43, 52.381, 104.762 },
+ { 1, monoChar44, 52.381, 104.762 },
+ { 1, monoChar45, 52.381, 104.762 },
+ { 1, monoChar46, 52.381, 104.762 },
+ { 1, monoChar47, 52.381, 104.762 },
+ { 1, monoChar48, 52.381, 104.762 },
+ { 1, monoChar49, 52.381, 104.762 },
+ { 1, monoChar50, 52.381, 104.762 },
+ { 1, monoChar51, 52.381, 104.762 },
+ { 2, monoChar52, 52.381, 104.762 },
+ { 1, monoChar53, 52.381, 104.762 },
+ { 1, monoChar54, 52.381, 104.762 },
+ { 2, monoChar55, 52.381, 104.762 },
+ { 1, monoChar56, 52.381, 104.762 },
+ { 1, monoChar57, 52.381, 104.762 },
+ { 2, monoChar58, 52.381, 104.762 },
+ { 2, monoChar59, 52.381, 104.762 },
+ { 1, monoChar60, 52.381, 104.762 },
+ { 2, monoChar61, 52.381, 104.762 },
+ { 1, monoChar62, 52.381, 104.762 },
+ { 2, monoChar63, 52.381, 104.762 },
+ { 2, monoChar64, 52.381, 104.762 },
+ { 3, monoChar65, 52.381, 104.762 },
+ { 3, monoChar66, 52.381, 104.762 },
+ { 1, monoChar67, 52.381, 104.762 },
+ { 2, monoChar68, 52.381, 104.762 },
+ { 4, monoChar69, 52.381, 104.762 },
+ { 3, monoChar70, 52.381, 104.762 },
+ { 2, monoChar71, 52.381, 104.762 },
+ { 3, monoChar72, 52.381, 104.762 },
+ { 1, monoChar73, 52.381, 104.762 },
+ { 1, monoChar74, 52.381, 104.762 },
+ { 3, monoChar75, 52.381, 104.762 },
+ { 2, monoChar76, 52.381, 104.762 },
+ { 4, monoChar77, 52.381, 104.762 },
+ { 3, monoChar78, 52.381, 104.762 },
+ { 1, monoChar79, 52.381, 104.762 },
+ { 2, monoChar80, 52.381, 104.762 },
+ { 2, monoChar81, 52.381, 104.762 },
+ { 3, monoChar82, 52.381, 104.762 },
+ { 1, monoChar83, 52.381, 104.762 },
+ { 2, monoChar84, 52.381, 104.762 },
+ { 1, monoChar85, 52.381, 104.762 },
+ { 2, monoChar86, 52.381, 104.762 },
+ { 4, monoChar87, 52.381, 104.762 },
+ { 2, monoChar88, 52.381, 104.762 },
+ { 2, monoChar89, 52.381, 104.762 },
+ { 3, monoChar90, 52.381, 104.762 },
+ { 4, monoChar91, 52.381, 104.762 },
+ { 1, monoChar92, 52.381, 104.762 },
+ { 4, monoChar93, 52.381, 104.762 },
+ { 2, monoChar94, 52.381, 104.762 },
+ { 1, monoChar95, 52.381, 104.762 },
+ { 2, monoChar96, 52.381, 104.762 },
+ { 2, monoChar97, 52.381, 104.762 },
+ { 2, monoChar98, 52.381, 104.762 },
+ { 1, monoChar99, 52.381, 104.762 },
+ { 2, monoChar100, 52.381, 104.762 },
+ { 1, monoChar101, 52.381, 104.762 },
+ { 2, monoChar102, 52.381, 104.762 },
+ { 2, monoChar103, 52.381, 104.762 },
+ { 2, monoChar104, 52.381, 104.762 },
+ { 2, monoChar105, 52.381, 104.762 },
+ { 2, monoChar106, 52.381, 104.762 },
+ { 3, monoChar107, 52.381, 104.762 },
+ { 1, monoChar108, 52.381, 104.762 },
+ { 3, monoChar109, 52.381, 104.762 },
+ { 2, monoChar110, 52.381, 104.762 },
+ { 1, monoChar111, 52.381, 104.762 },
+ { 2, monoChar112, 52.381, 104.762 },
+ { 2, monoChar113, 52.381, 104.762 },
+ { 2, monoChar114, 52.381, 104.762 },
+ { 1, monoChar115, 52.381, 104.762 },
+ { 2, monoChar116, 52.381, 104.762 },
+ { 2, monoChar117, 52.381, 104.762 },
+ { 2, monoChar118, 52.381, 104.762 },
+ { 4, monoChar119, 52.381, 104.762 },
+ { 2, monoChar120, 52.381, 104.762 },
+ { 2, monoChar121, 52.381, 104.762 },
+ { 3, monoChar122, 52.381, 104.762 },
+ { 3, monoChar123, 52.381, 104.762 },
+ { 1, monoChar124, 52.381, 104.762 },
+ { 3, monoChar125, 52.381, 104.762 },
+ { 2, monoChar126, 52.381, 104.762 },
+ { 2, monoChar127, 52.381, 104.762 },
+};
+
+static
+StrokeFontRec glutStrokeMonoRoman = { "Roman", 128, monoChars, 119.048, -33.3333 };
+
diff --git a/hacks/glx/glut_roman.h b/hacks/glx/glut_roman.h
new file mode 100644
index 0000000..93f9532
--- /dev/null
+++ b/hacks/glx/glut_roman.h
@@ -0,0 +1,2455 @@
+/* Roman simplex stroke font copyright (c) 1989, 1990, 1991
+ * by Sun Microsystems, Inc. and the X Consortium.
+ * Originally part of the GLUT library by Mark J. Kilgard.
+ */
+
+#include "glutstroke.h"
+
+/* char: 33 '!' */
+
+static const CoordRec char33_stroke0[] = {
+ { 13.3819, 100 },
+ { 13.3819, 33.3333 },
+};
+
+static const CoordRec char33_stroke1[] = {
+ { 13.3819, 9.5238 },
+ { 8.62, 4.7619 },
+ { 13.3819, 0 },
+ { 18.1438, 4.7619 },
+ { 13.3819, 9.5238 },
+};
+
+static const StrokeRec char33[] = {
+ { 2, char33_stroke0 },
+ { 5, char33_stroke1 },
+};
+
+/* char: 34 '"' */
+
+static const CoordRec char34_stroke0[] = {
+ { 4.02, 100 },
+ { 4.02, 66.6667 },
+};
+
+static const CoordRec char34_stroke1[] = {
+ { 42.1152, 100 },
+ { 42.1152, 66.6667 },
+};
+
+static const StrokeRec char34[] = {
+ { 2, char34_stroke0 },
+ { 2, char34_stroke1 },
+};
+
+/* char: 35 '#' */
+
+static const CoordRec char35_stroke0[] = {
+ { 41.2952, 119.048 },
+ { 7.9619, -33.3333 },
+};
+
+static const CoordRec char35_stroke1[] = {
+ { 69.8667, 119.048 },
+ { 36.5333, -33.3333 },
+};
+
+static const CoordRec char35_stroke2[] = {
+ { 7.9619, 57.1429 },
+ { 74.6286, 57.1429 },
+};
+
+static const CoordRec char35_stroke3[] = {
+ { 3.2, 28.5714 },
+ { 69.8667, 28.5714 },
+};
+
+static const StrokeRec char35[] = {
+ { 2, char35_stroke0 },
+ { 2, char35_stroke1 },
+ { 2, char35_stroke2 },
+ { 2, char35_stroke3 },
+};
+
+/* char: 36 '$' */
+
+static const CoordRec char36_stroke0[] = {
+ { 28.6295, 119.048 },
+ { 28.6295, -19.0476 },
+};
+
+static const CoordRec char36_stroke1[] = {
+ { 47.6771, 119.048 },
+ { 47.6771, -19.0476 },
+};
+
+static const CoordRec char36_stroke2[] = {
+ { 71.4867, 85.7143 },
+ { 61.9629, 95.2381 },
+ { 47.6771, 100 },
+ { 28.6295, 100 },
+ { 14.3438, 95.2381 },
+ { 4.82, 85.7143 },
+ { 4.82, 76.1905 },
+ { 9.5819, 66.6667 },
+ { 14.3438, 61.9048 },
+ { 23.8676, 57.1429 },
+ { 52.439, 47.619 },
+ { 61.9629, 42.8571 },
+ { 66.7248, 38.0952 },
+ { 71.4867, 28.5714 },
+ { 71.4867, 14.2857 },
+ { 61.9629, 4.7619 },
+ { 47.6771, 0 },
+ { 28.6295, 0 },
+ { 14.3438, 4.7619 },
+ { 4.82, 14.2857 },
+};
+
+static const StrokeRec char36[] = {
+ { 2, char36_stroke0 },
+ { 2, char36_stroke1 },
+ { 20, char36_stroke2 },
+};
+
+/* char: 37 '%' */
+
+static const CoordRec char37_stroke0[] = {
+ { 92.0743, 100 },
+ { 6.36, 0 },
+};
+
+static const CoordRec char37_stroke1[] = {
+ { 30.1695, 100 },
+ { 39.6933, 90.4762 },
+ { 39.6933, 80.9524 },
+ { 34.9314, 71.4286 },
+ { 25.4076, 66.6667 },
+ { 15.8838, 66.6667 },
+ { 6.36, 76.1905 },
+ { 6.36, 85.7143 },
+ { 11.1219, 95.2381 },
+ { 20.6457, 100 },
+ { 30.1695, 100 },
+ { 39.6933, 95.2381 },
+ { 53.979, 90.4762 },
+ { 68.2648, 90.4762 },
+ { 82.5505, 95.2381 },
+ { 92.0743, 100 },
+};
+
+static const CoordRec char37_stroke2[] = {
+ { 73.0267, 33.3333 },
+ { 63.5029, 28.5714 },
+ { 58.741, 19.0476 },
+ { 58.741, 9.5238 },
+ { 68.2648, 0 },
+ { 77.7886, 0 },
+ { 87.3124, 4.7619 },
+ { 92.0743, 14.2857 },
+ { 92.0743, 23.8095 },
+ { 82.5505, 33.3333 },
+ { 73.0267, 33.3333 },
+};
+
+static const StrokeRec char37[] = {
+ { 2, char37_stroke0 },
+ { 16, char37_stroke1 },
+ { 11, char37_stroke2 },
+};
+
+/* char: 38 '&' */
+
+static const CoordRec char38_stroke0[] = {
+ { 101.218, 57.1429 },
+ { 101.218, 61.9048 },
+ { 96.4562, 66.6667 },
+ { 91.6943, 66.6667 },
+ { 86.9324, 61.9048 },
+ { 82.1705, 52.381 },
+ { 72.6467, 28.5714 },
+ { 63.1229, 14.2857 },
+ { 53.599, 4.7619 },
+ { 44.0752, 0 },
+ { 25.0276, 0 },
+ { 15.5038, 4.7619 },
+ { 10.7419, 9.5238 },
+ { 5.98, 19.0476 },
+ { 5.98, 28.5714 },
+ { 10.7419, 38.0952 },
+ { 15.5038, 42.8571 },
+ { 48.8371, 61.9048 },
+ { 53.599, 66.6667 },
+ { 58.361, 76.1905 },
+ { 58.361, 85.7143 },
+ { 53.599, 95.2381 },
+ { 44.0752, 100 },
+ { 34.5514, 95.2381 },
+ { 29.7895, 85.7143 },
+ { 29.7895, 76.1905 },
+ { 34.5514, 61.9048 },
+ { 44.0752, 47.619 },
+ { 67.8848, 14.2857 },
+ { 77.4086, 4.7619 },
+ { 86.9324, 0 },
+ { 96.4562, 0 },
+ { 101.218, 4.7619 },
+ { 101.218, 9.5238 },
+};
+
+static const StrokeRec char38[] = {
+ { 34, char38_stroke0 },
+};
+
+/* char: 39 ''' */
+
+static const CoordRec char39_stroke0[] = {
+ { 4.44, 100 },
+ { 4.44, 66.6667 },
+};
+
+static const StrokeRec char39[] = {
+ { 2, char39_stroke0 },
+};
+
+/* char: 40 '(' */
+
+static const CoordRec char40_stroke0[] = {
+ { 40.9133, 119.048 },
+ { 31.3895, 109.524 },
+ { 21.8657, 95.2381 },
+ { 12.3419, 76.1905 },
+ { 7.58, 52.381 },
+ { 7.58, 33.3333 },
+ { 12.3419, 9.5238 },
+ { 21.8657, -9.5238 },
+ { 31.3895, -23.8095 },
+ { 40.9133, -33.3333 },
+};
+
+static const StrokeRec char40[] = {
+ { 10, char40_stroke0 },
+};
+
+/* char: 41 ')' */
+
+static const CoordRec char41_stroke0[] = {
+ { 5.28, 119.048 },
+ { 14.8038, 109.524 },
+ { 24.3276, 95.2381 },
+ { 33.8514, 76.1905 },
+ { 38.6133, 52.381 },
+ { 38.6133, 33.3333 },
+ { 33.8514, 9.5238 },
+ { 24.3276, -9.5238 },
+ { 14.8038, -23.8095 },
+ { 5.28, -33.3333 },
+};
+
+static const StrokeRec char41[] = {
+ { 10, char41_stroke0 },
+};
+
+/* char: 42 '*' */
+
+static const CoordRec char42_stroke0[] = {
+ { 30.7695, 71.4286 },
+ { 30.7695, 14.2857 },
+};
+
+static const CoordRec char42_stroke1[] = {
+ { 6.96, 57.1429 },
+ { 54.579, 28.5714 },
+};
+
+static const CoordRec char42_stroke2[] = {
+ { 54.579, 57.1429 },
+ { 6.96, 28.5714 },
+};
+
+static const StrokeRec char42[] = {
+ { 2, char42_stroke0 },
+ { 2, char42_stroke1 },
+ { 2, char42_stroke2 },
+};
+
+/* char: 43 '+' */
+
+static const CoordRec char43_stroke0[] = {
+ { 48.8371, 85.7143 },
+ { 48.8371, 0 },
+};
+
+static const CoordRec char43_stroke1[] = {
+ { 5.98, 42.8571 },
+ { 91.6943, 42.8571 },
+};
+
+static const StrokeRec char43[] = {
+ { 2, char43_stroke0 },
+ { 2, char43_stroke1 },
+};
+
+/* char: 44 ',' */
+
+static const CoordRec char44_stroke0[] = {
+ { 18.2838, 4.7619 },
+ { 13.5219, 0 },
+ { 8.76, 4.7619 },
+ { 13.5219, 9.5238 },
+ { 18.2838, 4.7619 },
+ { 18.2838, -4.7619 },
+ { 13.5219, -14.2857 },
+ { 8.76, -19.0476 },
+};
+
+static const StrokeRec char44[] = {
+ { 8, char44_stroke0 },
+};
+
+/* char: 45 '-' */
+
+static const CoordRec char45_stroke0[] = {
+ { 7.38, 42.8571 },
+ { 93.0943, 42.8571 },
+};
+
+static const StrokeRec char45[] = {
+ { 2, char45_stroke0 },
+};
+
+/* char: 46 '.' */
+
+static const CoordRec char46_stroke0[] = {
+ { 13.1019, 9.5238 },
+ { 8.34, 4.7619 },
+ { 13.1019, 0 },
+ { 17.8638, 4.7619 },
+ { 13.1019, 9.5238 },
+};
+
+static const StrokeRec char46[] = {
+ { 5, char46_stroke0 },
+};
+
+/* char: 47 '/' */
+
+static const CoordRec char47_stroke0[] = {
+ { 7.24, -14.2857 },
+ { 73.9067, 100 },
+};
+
+static const StrokeRec char47[] = {
+ { 2, char47_stroke0 },
+};
+
+/* char: 48 '0' */
+
+static const CoordRec char48_stroke0[] = {
+ { 33.5514, 100 },
+ { 19.2657, 95.2381 },
+ { 9.7419, 80.9524 },
+ { 4.98, 57.1429 },
+ { 4.98, 42.8571 },
+ { 9.7419, 19.0476 },
+ { 19.2657, 4.7619 },
+ { 33.5514, 0 },
+ { 43.0752, 0 },
+ { 57.361, 4.7619 },
+ { 66.8848, 19.0476 },
+ { 71.6467, 42.8571 },
+ { 71.6467, 57.1429 },
+ { 66.8848, 80.9524 },
+ { 57.361, 95.2381 },
+ { 43.0752, 100 },
+ { 33.5514, 100 },
+};
+
+static const StrokeRec char48[] = {
+ { 17, char48_stroke0 },
+};
+
+/* char: 49 '1' */
+
+static const CoordRec char49_stroke0[] = {
+ { 11.82, 80.9524 },
+ { 21.3438, 85.7143 },
+ { 35.6295, 100 },
+ { 35.6295, 0 },
+};
+
+static const StrokeRec char49[] = {
+ { 4, char49_stroke0 },
+};
+
+/* char: 50 '2' */
+
+static const CoordRec char50_stroke0[] = {
+ { 10.1819, 76.1905 },
+ { 10.1819, 80.9524 },
+ { 14.9438, 90.4762 },
+ { 19.7057, 95.2381 },
+ { 29.2295, 100 },
+ { 48.2771, 100 },
+ { 57.801, 95.2381 },
+ { 62.5629, 90.4762 },
+ { 67.3248, 80.9524 },
+ { 67.3248, 71.4286 },
+ { 62.5629, 61.9048 },
+ { 53.039, 47.619 },
+ { 5.42, 0 },
+ { 72.0867, 0 },
+};
+
+static const StrokeRec char50[] = {
+ { 14, char50_stroke0 },
+};
+
+/* char: 51 '3' */
+
+static const CoordRec char51_stroke0[] = {
+ { 14.5238, 100 },
+ { 66.9048, 100 },
+ { 38.3333, 61.9048 },
+ { 52.619, 61.9048 },
+ { 62.1429, 57.1429 },
+ { 66.9048, 52.381 },
+ { 71.6667, 38.0952 },
+ { 71.6667, 28.5714 },
+ { 66.9048, 14.2857 },
+ { 57.381, 4.7619 },
+ { 43.0952, 0 },
+ { 28.8095, 0 },
+ { 14.5238, 4.7619 },
+ { 9.7619, 9.5238 },
+ { 5, 19.0476 },
+};
+
+static const StrokeRec char51[] = {
+ { 15, char51_stroke0 },
+};
+
+/* char: 52 '4' */
+
+static const CoordRec char52_stroke0[] = {
+ { 51.499, 100 },
+ { 3.88, 33.3333 },
+ { 75.3086, 33.3333 },
+};
+
+static const CoordRec char52_stroke1[] = {
+ { 51.499, 100 },
+ { 51.499, 0 },
+};
+
+static const StrokeRec char52[] = {
+ { 3, char52_stroke0 },
+ { 2, char52_stroke1 },
+};
+
+/* char: 53 '5' */
+
+static const CoordRec char53_stroke0[] = {
+ { 62.0029, 100 },
+ { 14.3838, 100 },
+ { 9.6219, 57.1429 },
+ { 14.3838, 61.9048 },
+ { 28.6695, 66.6667 },
+ { 42.9552, 66.6667 },
+ { 57.241, 61.9048 },
+ { 66.7648, 52.381 },
+ { 71.5267, 38.0952 },
+ { 71.5267, 28.5714 },
+ { 66.7648, 14.2857 },
+ { 57.241, 4.7619 },
+ { 42.9552, 0 },
+ { 28.6695, 0 },
+ { 14.3838, 4.7619 },
+ { 9.6219, 9.5238 },
+ { 4.86, 19.0476 },
+};
+
+static const StrokeRec char53[] = {
+ { 17, char53_stroke0 },
+};
+
+/* char: 54 '6' */
+
+static const CoordRec char54_stroke0[] = {
+ { 62.7229, 85.7143 },
+ { 57.961, 95.2381 },
+ { 43.6752, 100 },
+ { 34.1514, 100 },
+ { 19.8657, 95.2381 },
+ { 10.3419, 80.9524 },
+ { 5.58, 57.1429 },
+ { 5.58, 33.3333 },
+ { 10.3419, 14.2857 },
+ { 19.8657, 4.7619 },
+ { 34.1514, 0 },
+ { 38.9133, 0 },
+ { 53.199, 4.7619 },
+ { 62.7229, 14.2857 },
+ { 67.4848, 28.5714 },
+ { 67.4848, 33.3333 },
+ { 62.7229, 47.619 },
+ { 53.199, 57.1429 },
+ { 38.9133, 61.9048 },
+ { 34.1514, 61.9048 },
+ { 19.8657, 57.1429 },
+ { 10.3419, 47.619 },
+ { 5.58, 33.3333 },
+};
+
+static const StrokeRec char54[] = {
+ { 23, char54_stroke0 },
+};
+
+/* char: 55 '7' */
+
+static const CoordRec char55_stroke0[] = {
+ { 72.2267, 100 },
+ { 24.6076, 0 },
+};
+
+static const CoordRec char55_stroke1[] = {
+ { 5.56, 100 },
+ { 72.2267, 100 },
+};
+
+static const StrokeRec char55[] = {
+ { 2, char55_stroke0 },
+ { 2, char55_stroke1 },
+};
+
+/* char: 56 '8' */
+
+static const CoordRec char56_stroke0[] = {
+ { 29.4095, 100 },
+ { 15.1238, 95.2381 },
+ { 10.3619, 85.7143 },
+ { 10.3619, 76.1905 },
+ { 15.1238, 66.6667 },
+ { 24.6476, 61.9048 },
+ { 43.6952, 57.1429 },
+ { 57.981, 52.381 },
+ { 67.5048, 42.8571 },
+ { 72.2667, 33.3333 },
+ { 72.2667, 19.0476 },
+ { 67.5048, 9.5238 },
+ { 62.7429, 4.7619 },
+ { 48.4571, 0 },
+ { 29.4095, 0 },
+ { 15.1238, 4.7619 },
+ { 10.3619, 9.5238 },
+ { 5.6, 19.0476 },
+ { 5.6, 33.3333 },
+ { 10.3619, 42.8571 },
+ { 19.8857, 52.381 },
+ { 34.1714, 57.1429 },
+ { 53.219, 61.9048 },
+ { 62.7429, 66.6667 },
+ { 67.5048, 76.1905 },
+ { 67.5048, 85.7143 },
+ { 62.7429, 95.2381 },
+ { 48.4571, 100 },
+ { 29.4095, 100 },
+};
+
+static const StrokeRec char56[] = {
+ { 29, char56_stroke0 },
+};
+
+/* char: 57 '9' */
+
+static const CoordRec char57_stroke0[] = {
+ { 68.5048, 66.6667 },
+ { 63.7429, 52.381 },
+ { 54.219, 42.8571 },
+ { 39.9333, 38.0952 },
+ { 35.1714, 38.0952 },
+ { 20.8857, 42.8571 },
+ { 11.3619, 52.381 },
+ { 6.6, 66.6667 },
+ { 6.6, 71.4286 },
+ { 11.3619, 85.7143 },
+ { 20.8857, 95.2381 },
+ { 35.1714, 100 },
+ { 39.9333, 100 },
+ { 54.219, 95.2381 },
+ { 63.7429, 85.7143 },
+ { 68.5048, 66.6667 },
+ { 68.5048, 42.8571 },
+ { 63.7429, 19.0476 },
+ { 54.219, 4.7619 },
+ { 39.9333, 0 },
+ { 30.4095, 0 },
+ { 16.1238, 4.7619 },
+ { 11.3619, 14.2857 },
+};
+
+static const StrokeRec char57[] = {
+ { 23, char57_stroke0 },
+};
+
+/* char: 58 ':' */
+
+static const CoordRec char58_stroke0[] = {
+ { 14.0819, 66.6667 },
+ { 9.32, 61.9048 },
+ { 14.0819, 57.1429 },
+ { 18.8438, 61.9048 },
+ { 14.0819, 66.6667 },
+};
+
+static const CoordRec char58_stroke1[] = {
+ { 14.0819, 9.5238 },
+ { 9.32, 4.7619 },
+ { 14.0819, 0 },
+ { 18.8438, 4.7619 },
+ { 14.0819, 9.5238 },
+};
+
+static const StrokeRec char58[] = {
+ { 5, char58_stroke0 },
+ { 5, char58_stroke1 },
+};
+
+/* char: 59 ';' */
+
+static const CoordRec char59_stroke0[] = {
+ { 12.9619, 66.6667 },
+ { 8.2, 61.9048 },
+ { 12.9619, 57.1429 },
+ { 17.7238, 61.9048 },
+ { 12.9619, 66.6667 },
+};
+
+static const CoordRec char59_stroke1[] = {
+ { 17.7238, 4.7619 },
+ { 12.9619, 0 },
+ { 8.2, 4.7619 },
+ { 12.9619, 9.5238 },
+ { 17.7238, 4.7619 },
+ { 17.7238, -4.7619 },
+ { 12.9619, -14.2857 },
+ { 8.2, -19.0476 },
+};
+
+static const StrokeRec char59[] = {
+ { 5, char59_stroke0 },
+ { 8, char59_stroke1 },
+};
+
+/* char: 60 '<' */
+
+static const CoordRec char60_stroke0[] = {
+ { 79.2505, 85.7143 },
+ { 3.06, 42.8571 },
+ { 79.2505, 0 },
+};
+
+static const StrokeRec char60[] = {
+ { 3, char60_stroke0 },
+};
+
+/* char: 61 '=' */
+
+static const CoordRec char61_stroke0[] = {
+ { 5.7, 57.1429 },
+ { 91.4143, 57.1429 },
+};
+
+static const CoordRec char61_stroke1[] = {
+ { 5.7, 28.5714 },
+ { 91.4143, 28.5714 },
+};
+
+static const StrokeRec char61[] = {
+ { 2, char61_stroke0 },
+ { 2, char61_stroke1 },
+};
+
+/* char: 62 '>' */
+
+static const CoordRec char62_stroke0[] = {
+ { 2.78, 85.7143 },
+ { 78.9705, 42.8571 },
+ { 2.78, 0 },
+};
+
+static const StrokeRec char62[] = {
+ { 3, char62_stroke0 },
+};
+
+/* char: 63 '?' */
+
+static const CoordRec char63_stroke0[] = {
+ { 8.42, 76.1905 },
+ { 8.42, 80.9524 },
+ { 13.1819, 90.4762 },
+ { 17.9438, 95.2381 },
+ { 27.4676, 100 },
+ { 46.5152, 100 },
+ { 56.039, 95.2381 },
+ { 60.801, 90.4762 },
+ { 65.5629, 80.9524 },
+ { 65.5629, 71.4286 },
+ { 60.801, 61.9048 },
+ { 56.039, 57.1429 },
+ { 36.9914, 47.619 },
+ { 36.9914, 33.3333 },
+};
+
+static const CoordRec char63_stroke1[] = {
+ { 36.9914, 9.5238 },
+ { 32.2295, 4.7619 },
+ { 36.9914, 0 },
+ { 41.7533, 4.7619 },
+ { 36.9914, 9.5238 },
+};
+
+static const StrokeRec char63[] = {
+ { 14, char63_stroke0 },
+ { 5, char63_stroke1 },
+};
+
+/* char: 64 '@' */
+
+static const CoordRec char64_stroke0[] = {
+ { 49.2171, 52.381 },
+ { 39.6933, 57.1429 },
+ { 30.1695, 57.1429 },
+ { 25.4076, 47.619 },
+ { 25.4076, 42.8571 },
+ { 30.1695, 33.3333 },
+ { 39.6933, 33.3333 },
+ { 49.2171, 38.0952 },
+};
+
+static const CoordRec char64_stroke1[] = {
+ { 49.2171, 57.1429 },
+ { 49.2171, 38.0952 },
+ { 53.979, 33.3333 },
+ { 63.5029, 33.3333 },
+ { 68.2648, 42.8571 },
+ { 68.2648, 47.619 },
+ { 63.5029, 61.9048 },
+ { 53.979, 71.4286 },
+ { 39.6933, 76.1905 },
+ { 34.9314, 76.1905 },
+ { 20.6457, 71.4286 },
+ { 11.1219, 61.9048 },
+ { 6.36, 47.619 },
+ { 6.36, 42.8571 },
+ { 11.1219, 28.5714 },
+ { 20.6457, 19.0476 },
+ { 34.9314, 14.2857 },
+ { 39.6933, 14.2857 },
+ { 53.979, 19.0476 },
+};
+
+static const StrokeRec char64[] = {
+ { 8, char64_stroke0 },
+ { 19, char64_stroke1 },
+};
+
+/* char: 65 'A' */
+
+static const CoordRec char65_stroke0[] = {
+ { 40.5952, 100 },
+ { 2.5, 0 },
+};
+
+static const CoordRec char65_stroke1[] = {
+ { 40.5952, 100 },
+ { 78.6905, 0 },
+};
+
+static const CoordRec char65_stroke2[] = {
+ { 16.7857, 33.3333 },
+ { 64.4048, 33.3333 },
+};
+
+static const StrokeRec char65[] = {
+ { 2, char65_stroke0 },
+ { 2, char65_stroke1 },
+ { 2, char65_stroke2 },
+};
+
+/* char: 66 'B' */
+
+static const CoordRec char66_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char66_stroke1[] = {
+ { 11.42, 100 },
+ { 54.2771, 100 },
+ { 68.5629, 95.2381 },
+ { 73.3248, 90.4762 },
+ { 78.0867, 80.9524 },
+ { 78.0867, 71.4286 },
+ { 73.3248, 61.9048 },
+ { 68.5629, 57.1429 },
+ { 54.2771, 52.381 },
+};
+
+static const CoordRec char66_stroke2[] = {
+ { 11.42, 52.381 },
+ { 54.2771, 52.381 },
+ { 68.5629, 47.619 },
+ { 73.3248, 42.8571 },
+ { 78.0867, 33.3333 },
+ { 78.0867, 19.0476 },
+ { 73.3248, 9.5238 },
+ { 68.5629, 4.7619 },
+ { 54.2771, 0 },
+ { 11.42, 0 },
+};
+
+static const StrokeRec char66[] = {
+ { 2, char66_stroke0 },
+ { 9, char66_stroke1 },
+ { 10, char66_stroke2 },
+};
+
+/* char: 67 'C' */
+
+static const CoordRec char67_stroke0[] = {
+ { 78.0886, 76.1905 },
+ { 73.3267, 85.7143 },
+ { 63.8029, 95.2381 },
+ { 54.279, 100 },
+ { 35.2314, 100 },
+ { 25.7076, 95.2381 },
+ { 16.1838, 85.7143 },
+ { 11.4219, 76.1905 },
+ { 6.66, 61.9048 },
+ { 6.66, 38.0952 },
+ { 11.4219, 23.8095 },
+ { 16.1838, 14.2857 },
+ { 25.7076, 4.7619 },
+ { 35.2314, 0 },
+ { 54.279, 0 },
+ { 63.8029, 4.7619 },
+ { 73.3267, 14.2857 },
+ { 78.0886, 23.8095 },
+};
+
+static const StrokeRec char67[] = {
+ { 18, char67_stroke0 },
+};
+
+/* char: 68 'D' */
+
+static const CoordRec char68_stroke0[] = {
+ { 11.96, 100 },
+ { 11.96, 0 },
+};
+
+static const CoordRec char68_stroke1[] = {
+ { 11.96, 100 },
+ { 45.2933, 100 },
+ { 59.579, 95.2381 },
+ { 69.1029, 85.7143 },
+ { 73.8648, 76.1905 },
+ { 78.6267, 61.9048 },
+ { 78.6267, 38.0952 },
+ { 73.8648, 23.8095 },
+ { 69.1029, 14.2857 },
+ { 59.579, 4.7619 },
+ { 45.2933, 0 },
+ { 11.96, 0 },
+};
+
+static const StrokeRec char68[] = {
+ { 2, char68_stroke0 },
+ { 12, char68_stroke1 },
+};
+
+/* char: 69 'E' */
+
+static const CoordRec char69_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char69_stroke1[] = {
+ { 11.42, 100 },
+ { 73.3248, 100 },
+};
+
+static const CoordRec char69_stroke2[] = {
+ { 11.42, 52.381 },
+ { 49.5152, 52.381 },
+};
+
+static const CoordRec char69_stroke3[] = {
+ { 11.42, 0 },
+ { 73.3248, 0 },
+};
+
+static const StrokeRec char69[] = {
+ { 2, char69_stroke0 },
+ { 2, char69_stroke1 },
+ { 2, char69_stroke2 },
+ { 2, char69_stroke3 },
+};
+
+/* char: 70 'F' */
+
+static const CoordRec char70_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char70_stroke1[] = {
+ { 11.42, 100 },
+ { 73.3248, 100 },
+};
+
+static const CoordRec char70_stroke2[] = {
+ { 11.42, 52.381 },
+ { 49.5152, 52.381 },
+};
+
+static const StrokeRec char70[] = {
+ { 2, char70_stroke0 },
+ { 2, char70_stroke1 },
+ { 2, char70_stroke2 },
+};
+
+/* char: 71 'G' */
+
+static const CoordRec char71_stroke0[] = {
+ { 78.4886, 76.1905 },
+ { 73.7267, 85.7143 },
+ { 64.2029, 95.2381 },
+ { 54.679, 100 },
+ { 35.6314, 100 },
+ { 26.1076, 95.2381 },
+ { 16.5838, 85.7143 },
+ { 11.8219, 76.1905 },
+ { 7.06, 61.9048 },
+ { 7.06, 38.0952 },
+ { 11.8219, 23.8095 },
+ { 16.5838, 14.2857 },
+ { 26.1076, 4.7619 },
+ { 35.6314, 0 },
+ { 54.679, 0 },
+ { 64.2029, 4.7619 },
+ { 73.7267, 14.2857 },
+ { 78.4886, 23.8095 },
+ { 78.4886, 38.0952 },
+};
+
+static const CoordRec char71_stroke1[] = {
+ { 54.679, 38.0952 },
+ { 78.4886, 38.0952 },
+};
+
+static const StrokeRec char71[] = {
+ { 19, char71_stroke0 },
+ { 2, char71_stroke1 },
+};
+
+/* char: 72 'H' */
+
+static const CoordRec char72_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char72_stroke1[] = {
+ { 78.0867, 100 },
+ { 78.0867, 0 },
+};
+
+static const CoordRec char72_stroke2[] = {
+ { 11.42, 52.381 },
+ { 78.0867, 52.381 },
+};
+
+static const StrokeRec char72[] = {
+ { 2, char72_stroke0 },
+ { 2, char72_stroke1 },
+ { 2, char72_stroke2 },
+};
+
+/* char: 73 'I' */
+
+static const CoordRec char73_stroke0[] = {
+ { 10.86, 100 },
+ { 10.86, 0 },
+};
+
+static const StrokeRec char73[] = {
+ { 2, char73_stroke0 },
+};
+
+/* char: 74 'J' */
+
+static const CoordRec char74_stroke0[] = {
+ { 50.119, 100 },
+ { 50.119, 23.8095 },
+ { 45.3571, 9.5238 },
+ { 40.5952, 4.7619 },
+ { 31.0714, 0 },
+ { 21.5476, 0 },
+ { 12.0238, 4.7619 },
+ { 7.2619, 9.5238 },
+ { 2.5, 23.8095 },
+ { 2.5, 33.3333 },
+};
+
+static const StrokeRec char74[] = {
+ { 10, char74_stroke0 },
+};
+
+/* char: 75 'K' */
+
+static const CoordRec char75_stroke0[] = {
+ { 11.28, 100 },
+ { 11.28, 0 },
+};
+
+static const CoordRec char75_stroke1[] = {
+ { 77.9467, 100 },
+ { 11.28, 33.3333 },
+};
+
+static const CoordRec char75_stroke2[] = {
+ { 35.0895, 57.1429 },
+ { 77.9467, 0 },
+};
+
+static const StrokeRec char75[] = {
+ { 2, char75_stroke0 },
+ { 2, char75_stroke1 },
+ { 2, char75_stroke2 },
+};
+
+/* char: 76 'L' */
+
+static const CoordRec char76_stroke0[] = {
+ { 11.68, 100 },
+ { 11.68, 0 },
+};
+
+static const CoordRec char76_stroke1[] = {
+ { 11.68, 0 },
+ { 68.8229, 0 },
+};
+
+static const StrokeRec char76[] = {
+ { 2, char76_stroke0 },
+ { 2, char76_stroke1 },
+};
+
+/* char: 77 'M' */
+
+static const CoordRec char77_stroke0[] = {
+ { 10.86, 100 },
+ { 10.86, 0 },
+};
+
+static const CoordRec char77_stroke1[] = {
+ { 10.86, 100 },
+ { 48.9552, 0 },
+};
+
+static const CoordRec char77_stroke2[] = {
+ { 87.0505, 100 },
+ { 48.9552, 0 },
+};
+
+static const CoordRec char77_stroke3[] = {
+ { 87.0505, 100 },
+ { 87.0505, 0 },
+};
+
+static const StrokeRec char77[] = {
+ { 2, char77_stroke0 },
+ { 2, char77_stroke1 },
+ { 2, char77_stroke2 },
+ { 2, char77_stroke3 },
+};
+
+/* char: 78 'N' */
+
+static const CoordRec char78_stroke0[] = {
+ { 11.14, 100 },
+ { 11.14, 0 },
+};
+
+static const CoordRec char78_stroke1[] = {
+ { 11.14, 100 },
+ { 77.8067, 0 },
+};
+
+static const CoordRec char78_stroke2[] = {
+ { 77.8067, 100 },
+ { 77.8067, 0 },
+};
+
+static const StrokeRec char78[] = {
+ { 2, char78_stroke0 },
+ { 2, char78_stroke1 },
+ { 2, char78_stroke2 },
+};
+
+/* char: 79 'O' */
+
+static const CoordRec char79_stroke0[] = {
+ { 34.8114, 100 },
+ { 25.2876, 95.2381 },
+ { 15.7638, 85.7143 },
+ { 11.0019, 76.1905 },
+ { 6.24, 61.9048 },
+ { 6.24, 38.0952 },
+ { 11.0019, 23.8095 },
+ { 15.7638, 14.2857 },
+ { 25.2876, 4.7619 },
+ { 34.8114, 0 },
+ { 53.859, 0 },
+ { 63.3829, 4.7619 },
+ { 72.9067, 14.2857 },
+ { 77.6686, 23.8095 },
+ { 82.4305, 38.0952 },
+ { 82.4305, 61.9048 },
+ { 77.6686, 76.1905 },
+ { 72.9067, 85.7143 },
+ { 63.3829, 95.2381 },
+ { 53.859, 100 },
+ { 34.8114, 100 },
+};
+
+static const StrokeRec char79[] = {
+ { 21, char79_stroke0 },
+};
+
+/* char: 80 'P' */
+
+static const CoordRec char80_stroke0[] = {
+ { 12.1, 100 },
+ { 12.1, 0 },
+};
+
+static const CoordRec char80_stroke1[] = {
+ { 12.1, 100 },
+ { 54.9571, 100 },
+ { 69.2429, 95.2381 },
+ { 74.0048, 90.4762 },
+ { 78.7667, 80.9524 },
+ { 78.7667, 66.6667 },
+ { 74.0048, 57.1429 },
+ { 69.2429, 52.381 },
+ { 54.9571, 47.619 },
+ { 12.1, 47.619 },
+};
+
+static const StrokeRec char80[] = {
+ { 2, char80_stroke0 },
+ { 10, char80_stroke1 },
+};
+
+/* char: 81 'Q' */
+
+static const CoordRec char81_stroke0[] = {
+ { 33.8714, 100 },
+ { 24.3476, 95.2381 },
+ { 14.8238, 85.7143 },
+ { 10.0619, 76.1905 },
+ { 5.3, 61.9048 },
+ { 5.3, 38.0952 },
+ { 10.0619, 23.8095 },
+ { 14.8238, 14.2857 },
+ { 24.3476, 4.7619 },
+ { 33.8714, 0 },
+ { 52.919, 0 },
+ { 62.4429, 4.7619 },
+ { 71.9667, 14.2857 },
+ { 76.7286, 23.8095 },
+ { 81.4905, 38.0952 },
+ { 81.4905, 61.9048 },
+ { 76.7286, 76.1905 },
+ { 71.9667, 85.7143 },
+ { 62.4429, 95.2381 },
+ { 52.919, 100 },
+ { 33.8714, 100 },
+};
+
+static const CoordRec char81_stroke1[] = {
+ { 48.1571, 19.0476 },
+ { 76.7286, -9.5238 },
+};
+
+static const StrokeRec char81[] = {
+ { 21, char81_stroke0 },
+ { 2, char81_stroke1 },
+};
+
+/* char: 82 'R' */
+
+static const CoordRec char82_stroke0[] = {
+ { 11.68, 100 },
+ { 11.68, 0 },
+};
+
+static const CoordRec char82_stroke1[] = {
+ { 11.68, 100 },
+ { 54.5371, 100 },
+ { 68.8229, 95.2381 },
+ { 73.5848, 90.4762 },
+ { 78.3467, 80.9524 },
+ { 78.3467, 71.4286 },
+ { 73.5848, 61.9048 },
+ { 68.8229, 57.1429 },
+ { 54.5371, 52.381 },
+ { 11.68, 52.381 },
+};
+
+static const CoordRec char82_stroke2[] = {
+ { 45.0133, 52.381 },
+ { 78.3467, 0 },
+};
+
+static const StrokeRec char82[] = {
+ { 2, char82_stroke0 },
+ { 10, char82_stroke1 },
+ { 2, char82_stroke2 },
+};
+
+/* char: 83 'S' */
+
+static const CoordRec char83_stroke0[] = {
+ { 74.6667, 85.7143 },
+ { 65.1429, 95.2381 },
+ { 50.8571, 100 },
+ { 31.8095, 100 },
+ { 17.5238, 95.2381 },
+ { 8, 85.7143 },
+ { 8, 76.1905 },
+ { 12.7619, 66.6667 },
+ { 17.5238, 61.9048 },
+ { 27.0476, 57.1429 },
+ { 55.619, 47.619 },
+ { 65.1429, 42.8571 },
+ { 69.9048, 38.0952 },
+ { 74.6667, 28.5714 },
+ { 74.6667, 14.2857 },
+ { 65.1429, 4.7619 },
+ { 50.8571, 0 },
+ { 31.8095, 0 },
+ { 17.5238, 4.7619 },
+ { 8, 14.2857 },
+};
+
+static const StrokeRec char83[] = {
+ { 20, char83_stroke0 },
+};
+
+/* char: 84 'T' */
+
+static const CoordRec char84_stroke0[] = {
+ { 35.6933, 100 },
+ { 35.6933, 0 },
+};
+
+static const CoordRec char84_stroke1[] = {
+ { 2.36, 100 },
+ { 69.0267, 100 },
+};
+
+static const StrokeRec char84[] = {
+ { 2, char84_stroke0 },
+ { 2, char84_stroke1 },
+};
+
+/* char: 85 'U' */
+
+static const CoordRec char85_stroke0[] = {
+ { 11.54, 100 },
+ { 11.54, 28.5714 },
+ { 16.3019, 14.2857 },
+ { 25.8257, 4.7619 },
+ { 40.1114, 0 },
+ { 49.6352, 0 },
+ { 63.921, 4.7619 },
+ { 73.4448, 14.2857 },
+ { 78.2067, 28.5714 },
+ { 78.2067, 100 },
+};
+
+static const StrokeRec char85[] = {
+ { 10, char85_stroke0 },
+};
+
+/* char: 86 'V' */
+
+static const CoordRec char86_stroke0[] = {
+ { 2.36, 100 },
+ { 40.4552, 0 },
+};
+
+static const CoordRec char86_stroke1[] = {
+ { 78.5505, 100 },
+ { 40.4552, 0 },
+};
+
+static const StrokeRec char86[] = {
+ { 2, char86_stroke0 },
+ { 2, char86_stroke1 },
+};
+
+/* char: 87 'W' */
+
+static const CoordRec char87_stroke0[] = {
+ { 2.22, 100 },
+ { 26.0295, 0 },
+};
+
+static const CoordRec char87_stroke1[] = {
+ { 49.839, 100 },
+ { 26.0295, 0 },
+};
+
+static const CoordRec char87_stroke2[] = {
+ { 49.839, 100 },
+ { 73.6486, 0 },
+};
+
+static const CoordRec char87_stroke3[] = {
+ { 97.4581, 100 },
+ { 73.6486, 0 },
+};
+
+static const StrokeRec char87[] = {
+ { 2, char87_stroke0 },
+ { 2, char87_stroke1 },
+ { 2, char87_stroke2 },
+ { 2, char87_stroke3 },
+};
+
+/* char: 88 'X' */
+
+static const CoordRec char88_stroke0[] = {
+ { 2.5, 100 },
+ { 69.1667, 0 },
+};
+
+static const CoordRec char88_stroke1[] = {
+ { 69.1667, 100 },
+ { 2.5, 0 },
+};
+
+static const StrokeRec char88[] = {
+ { 2, char88_stroke0 },
+ { 2, char88_stroke1 },
+};
+
+/* char: 89 'Y' */
+
+static const CoordRec char89_stroke0[] = {
+ { 1.52, 100 },
+ { 39.6152, 52.381 },
+ { 39.6152, 0 },
+};
+
+static const CoordRec char89_stroke1[] = {
+ { 77.7105, 100 },
+ { 39.6152, 52.381 },
+};
+
+static const StrokeRec char89[] = {
+ { 3, char89_stroke0 },
+ { 2, char89_stroke1 },
+};
+
+/* char: 90 'Z' */
+
+static const CoordRec char90_stroke0[] = {
+ { 69.1667, 100 },
+ { 2.5, 0 },
+};
+
+static const CoordRec char90_stroke1[] = {
+ { 2.5, 100 },
+ { 69.1667, 100 },
+};
+
+static const CoordRec char90_stroke2[] = {
+ { 2.5, 0 },
+ { 69.1667, 0 },
+};
+
+static const StrokeRec char90[] = {
+ { 2, char90_stroke0 },
+ { 2, char90_stroke1 },
+ { 2, char90_stroke2 },
+};
+
+/* char: 91 '[' */
+
+static const CoordRec char91_stroke0[] = {
+ { 7.78, 119.048 },
+ { 7.78, -33.3333 },
+};
+
+static const CoordRec char91_stroke1[] = {
+ { 12.5419, 119.048 },
+ { 12.5419, -33.3333 },
+};
+
+static const CoordRec char91_stroke2[] = {
+ { 7.78, 119.048 },
+ { 41.1133, 119.048 },
+};
+
+static const CoordRec char91_stroke3[] = {
+ { 7.78, -33.3333 },
+ { 41.1133, -33.3333 },
+};
+
+static const StrokeRec char91[] = {
+ { 2, char91_stroke0 },
+ { 2, char91_stroke1 },
+ { 2, char91_stroke2 },
+ { 2, char91_stroke3 },
+};
+
+/* char: 92 '\' */
+
+static const CoordRec char92_stroke0[] = {
+ { 5.84, 100 },
+ { 72.5067, -14.2857 },
+};
+
+static const StrokeRec char92[] = {
+ { 2, char92_stroke0 },
+};
+
+/* char: 93 ']' */
+
+static const CoordRec char93_stroke0[] = {
+ { 33.0114, 119.048 },
+ { 33.0114, -33.3333 },
+};
+
+static const CoordRec char93_stroke1[] = {
+ { 37.7733, 119.048 },
+ { 37.7733, -33.3333 },
+};
+
+static const CoordRec char93_stroke2[] = {
+ { 4.44, 119.048 },
+ { 37.7733, 119.048 },
+};
+
+static const CoordRec char93_stroke3[] = {
+ { 4.44, -33.3333 },
+ { 37.7733, -33.3333 },
+};
+
+static const StrokeRec char93[] = {
+ { 2, char93_stroke0 },
+ { 2, char93_stroke1 },
+ { 2, char93_stroke2 },
+ { 2, char93_stroke3 },
+};
+
+/* char: 94 '^' */
+
+static const CoordRec char94_stroke0[] = {
+ { 44.0752, 109.524 },
+ { 5.98, 42.8571 },
+};
+
+static const CoordRec char94_stroke1[] = {
+ { 44.0752, 109.524 },
+ { 82.1705, 42.8571 },
+};
+
+static const StrokeRec char94[] = {
+ { 2, char94_stroke0 },
+ { 2, char94_stroke1 },
+};
+
+/* char: 95 '_' */
+
+static const CoordRec char95_stroke0[] = {
+ { -1.1, -33.3333 },
+ { 103.662, -33.3333 },
+ { 103.662, -28.5714 },
+ { -1.1, -28.5714 },
+ { -1.1, -33.3333 },
+};
+
+static const StrokeRec char95[] = {
+ { 5, char95_stroke0 },
+};
+
+/* char: 96 '`' */
+
+static const CoordRec char96_stroke0[] = {
+ { 33.0219, 100 },
+ { 56.8314, 71.4286 },
+};
+
+static const CoordRec char96_stroke1[] = {
+ { 33.0219, 100 },
+ { 28.26, 95.2381 },
+ { 56.8314, 71.4286 },
+};
+
+static const StrokeRec char96[] = {
+ { 2, char96_stroke0 },
+ { 3, char96_stroke1 },
+};
+
+/* char: 97 'a' */
+
+static const CoordRec char97_stroke0[] = {
+ { 63.8229, 66.6667 },
+ { 63.8229, 0 },
+};
+
+static const CoordRec char97_stroke1[] = {
+ { 63.8229, 52.381 },
+ { 54.299, 61.9048 },
+ { 44.7752, 66.6667 },
+ { 30.4895, 66.6667 },
+ { 20.9657, 61.9048 },
+ { 11.4419, 52.381 },
+ { 6.68, 38.0952 },
+ { 6.68, 28.5714 },
+ { 11.4419, 14.2857 },
+ { 20.9657, 4.7619 },
+ { 30.4895, 0 },
+ { 44.7752, 0 },
+ { 54.299, 4.7619 },
+ { 63.8229, 14.2857 },
+};
+
+static const StrokeRec char97[] = {
+ { 2, char97_stroke0 },
+ { 14, char97_stroke1 },
+};
+
+/* char: 98 'b' */
+
+static const CoordRec char98_stroke0[] = {
+ { 8.76, 100 },
+ { 8.76, 0 },
+};
+
+static const CoordRec char98_stroke1[] = {
+ { 8.76, 52.381 },
+ { 18.2838, 61.9048 },
+ { 27.8076, 66.6667 },
+ { 42.0933, 66.6667 },
+ { 51.6171, 61.9048 },
+ { 61.141, 52.381 },
+ { 65.9029, 38.0952 },
+ { 65.9029, 28.5714 },
+ { 61.141, 14.2857 },
+ { 51.6171, 4.7619 },
+ { 42.0933, 0 },
+ { 27.8076, 0 },
+ { 18.2838, 4.7619 },
+ { 8.76, 14.2857 },
+};
+
+static const StrokeRec char98[] = {
+ { 2, char98_stroke0 },
+ { 14, char98_stroke1 },
+};
+
+/* char: 99 'c' */
+
+static const CoordRec char99_stroke0[] = {
+ { 62.6629, 52.381 },
+ { 53.139, 61.9048 },
+ { 43.6152, 66.6667 },
+ { 29.3295, 66.6667 },
+ { 19.8057, 61.9048 },
+ { 10.2819, 52.381 },
+ { 5.52, 38.0952 },
+ { 5.52, 28.5714 },
+ { 10.2819, 14.2857 },
+ { 19.8057, 4.7619 },
+ { 29.3295, 0 },
+ { 43.6152, 0 },
+ { 53.139, 4.7619 },
+ { 62.6629, 14.2857 },
+};
+
+static const StrokeRec char99[] = {
+ { 14, char99_stroke0 },
+};
+
+/* char: 100 'd' */
+
+static const CoordRec char100_stroke0[] = {
+ { 61.7829, 100 },
+ { 61.7829, 0 },
+};
+
+static const CoordRec char100_stroke1[] = {
+ { 61.7829, 52.381 },
+ { 52.259, 61.9048 },
+ { 42.7352, 66.6667 },
+ { 28.4495, 66.6667 },
+ { 18.9257, 61.9048 },
+ { 9.4019, 52.381 },
+ { 4.64, 38.0952 },
+ { 4.64, 28.5714 },
+ { 9.4019, 14.2857 },
+ { 18.9257, 4.7619 },
+ { 28.4495, 0 },
+ { 42.7352, 0 },
+ { 52.259, 4.7619 },
+ { 61.7829, 14.2857 },
+};
+
+static const StrokeRec char100[] = {
+ { 2, char100_stroke0 },
+ { 14, char100_stroke1 },
+};
+
+/* char: 101 'e' */
+
+static const CoordRec char101_stroke0[] = {
+ { 5.72, 38.0952 },
+ { 62.8629, 38.0952 },
+ { 62.8629, 47.619 },
+ { 58.101, 57.1429 },
+ { 53.339, 61.9048 },
+ { 43.8152, 66.6667 },
+ { 29.5295, 66.6667 },
+ { 20.0057, 61.9048 },
+ { 10.4819, 52.381 },
+ { 5.72, 38.0952 },
+ { 5.72, 28.5714 },
+ { 10.4819, 14.2857 },
+ { 20.0057, 4.7619 },
+ { 29.5295, 0 },
+ { 43.8152, 0 },
+ { 53.339, 4.7619 },
+ { 62.8629, 14.2857 },
+};
+
+static const StrokeRec char101[] = {
+ { 17, char101_stroke0 },
+};
+
+/* char: 102 'f' */
+
+static const CoordRec char102_stroke0[] = {
+ { 38.7752, 100 },
+ { 29.2514, 100 },
+ { 19.7276, 95.2381 },
+ { 14.9657, 80.9524 },
+ { 14.9657, 0 },
+};
+
+static const CoordRec char102_stroke1[] = {
+ { 0.68, 66.6667 },
+ { 34.0133, 66.6667 },
+};
+
+static const StrokeRec char102[] = {
+ { 5, char102_stroke0 },
+ { 2, char102_stroke1 },
+};
+
+/* char: 103 'g' */
+
+static const CoordRec char103_stroke0[] = {
+ { 62.5029, 66.6667 },
+ { 62.5029, -9.5238 },
+ { 57.741, -23.8095 },
+ { 52.979, -28.5714 },
+ { 43.4552, -33.3333 },
+ { 29.1695, -33.3333 },
+ { 19.6457, -28.5714 },
+};
+
+static const CoordRec char103_stroke1[] = {
+ { 62.5029, 52.381 },
+ { 52.979, 61.9048 },
+ { 43.4552, 66.6667 },
+ { 29.1695, 66.6667 },
+ { 19.6457, 61.9048 },
+ { 10.1219, 52.381 },
+ { 5.36, 38.0952 },
+ { 5.36, 28.5714 },
+ { 10.1219, 14.2857 },
+ { 19.6457, 4.7619 },
+ { 29.1695, 0 },
+ { 43.4552, 0 },
+ { 52.979, 4.7619 },
+ { 62.5029, 14.2857 },
+};
+
+static const StrokeRec char103[] = {
+ { 7, char103_stroke0 },
+ { 14, char103_stroke1 },
+};
+
+/* char: 104 'h' */
+
+static const CoordRec char104_stroke0[] = {
+ { 9.6, 100 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char104_stroke1[] = {
+ { 9.6, 47.619 },
+ { 23.8857, 61.9048 },
+ { 33.4095, 66.6667 },
+ { 47.6952, 66.6667 },
+ { 57.219, 61.9048 },
+ { 61.981, 47.619 },
+ { 61.981, 0 },
+};
+
+static const StrokeRec char104[] = {
+ { 2, char104_stroke0 },
+ { 7, char104_stroke1 },
+};
+
+/* char: 105 'i' */
+
+static const CoordRec char105_stroke0[] = {
+ { 10.02, 100 },
+ { 14.7819, 95.2381 },
+ { 19.5438, 100 },
+ { 14.7819, 104.762 },
+ { 10.02, 100 },
+};
+
+static const CoordRec char105_stroke1[] = {
+ { 14.7819, 66.6667 },
+ { 14.7819, 0 },
+};
+
+static const StrokeRec char105[] = {
+ { 5, char105_stroke0 },
+ { 2, char105_stroke1 },
+};
+
+/* char: 106 'j' */
+
+static const CoordRec char106_stroke0[] = {
+ { 17.3876, 100 },
+ { 22.1495, 95.2381 },
+ { 26.9114, 100 },
+ { 22.1495, 104.762 },
+ { 17.3876, 100 },
+};
+
+static const CoordRec char106_stroke1[] = {
+ { 22.1495, 66.6667 },
+ { 22.1495, -14.2857 },
+ { 17.3876, -28.5714 },
+ { 7.8638, -33.3333 },
+ { -1.66, -33.3333 },
+};
+
+static const StrokeRec char106[] = {
+ { 5, char106_stroke0 },
+ { 5, char106_stroke1 },
+};
+
+/* char: 107 'k' */
+
+static const CoordRec char107_stroke0[] = {
+ { 9.6, 100 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char107_stroke1[] = {
+ { 57.219, 66.6667 },
+ { 9.6, 19.0476 },
+};
+
+static const CoordRec char107_stroke2[] = {
+ { 28.6476, 38.0952 },
+ { 61.981, 0 },
+};
+
+static const StrokeRec char107[] = {
+ { 2, char107_stroke0 },
+ { 2, char107_stroke1 },
+ { 2, char107_stroke2 },
+};
+
+/* char: 108 'l' */
+
+static const CoordRec char108_stroke0[] = {
+ { 10.02, 100 },
+ { 10.02, 0 },
+};
+
+static const StrokeRec char108[] = {
+ { 2, char108_stroke0 },
+};
+
+/* char: 109 'm' */
+
+static const CoordRec char109_stroke0[] = {
+ { 9.6, 66.6667 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char109_stroke1[] = {
+ { 9.6, 47.619 },
+ { 23.8857, 61.9048 },
+ { 33.4095, 66.6667 },
+ { 47.6952, 66.6667 },
+ { 57.219, 61.9048 },
+ { 61.981, 47.619 },
+ { 61.981, 0 },
+};
+
+static const CoordRec char109_stroke2[] = {
+ { 61.981, 47.619 },
+ { 76.2667, 61.9048 },
+ { 85.7905, 66.6667 },
+ { 100.076, 66.6667 },
+ { 109.6, 61.9048 },
+ { 114.362, 47.619 },
+ { 114.362, 0 },
+};
+
+static const StrokeRec char109[] = {
+ { 2, char109_stroke0 },
+ { 7, char109_stroke1 },
+ { 7, char109_stroke2 },
+};
+
+/* char: 110 'n' */
+
+static const CoordRec char110_stroke0[] = {
+ { 9.18, 66.6667 },
+ { 9.18, 0 },
+};
+
+static const CoordRec char110_stroke1[] = {
+ { 9.18, 47.619 },
+ { 23.4657, 61.9048 },
+ { 32.9895, 66.6667 },
+ { 47.2752, 66.6667 },
+ { 56.799, 61.9048 },
+ { 61.561, 47.619 },
+ { 61.561, 0 },
+};
+
+static const StrokeRec char110[] = {
+ { 2, char110_stroke0 },
+ { 7, char110_stroke1 },
+};
+
+/* char: 111 'o' */
+
+static const CoordRec char111_stroke0[] = {
+ { 28.7895, 66.6667 },
+ { 19.2657, 61.9048 },
+ { 9.7419, 52.381 },
+ { 4.98, 38.0952 },
+ { 4.98, 28.5714 },
+ { 9.7419, 14.2857 },
+ { 19.2657, 4.7619 },
+ { 28.7895, 0 },
+ { 43.0752, 0 },
+ { 52.599, 4.7619 },
+ { 62.1229, 14.2857 },
+ { 66.8848, 28.5714 },
+ { 66.8848, 38.0952 },
+ { 62.1229, 52.381 },
+ { 52.599, 61.9048 },
+ { 43.0752, 66.6667 },
+ { 28.7895, 66.6667 },
+};
+
+static const StrokeRec char111[] = {
+ { 17, char111_stroke0 },
+};
+
+/* char: 112 'p' */
+
+static const CoordRec char112_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, -33.3333 },
+};
+
+static const CoordRec char112_stroke1[] = {
+ { 9.46, 52.381 },
+ { 18.9838, 61.9048 },
+ { 28.5076, 66.6667 },
+ { 42.7933, 66.6667 },
+ { 52.3171, 61.9048 },
+ { 61.841, 52.381 },
+ { 66.6029, 38.0952 },
+ { 66.6029, 28.5714 },
+ { 61.841, 14.2857 },
+ { 52.3171, 4.7619 },
+ { 42.7933, 0 },
+ { 28.5076, 0 },
+ { 18.9838, 4.7619 },
+ { 9.46, 14.2857 },
+};
+
+static const StrokeRec char112[] = {
+ { 2, char112_stroke0 },
+ { 14, char112_stroke1 },
+};
+
+/* char: 113 'q' */
+
+static const CoordRec char113_stroke0[] = {
+ { 61.9829, 66.6667 },
+ { 61.9829, -33.3333 },
+};
+
+static const CoordRec char113_stroke1[] = {
+ { 61.9829, 52.381 },
+ { 52.459, 61.9048 },
+ { 42.9352, 66.6667 },
+ { 28.6495, 66.6667 },
+ { 19.1257, 61.9048 },
+ { 9.6019, 52.381 },
+ { 4.84, 38.0952 },
+ { 4.84, 28.5714 },
+ { 9.6019, 14.2857 },
+ { 19.1257, 4.7619 },
+ { 28.6495, 0 },
+ { 42.9352, 0 },
+ { 52.459, 4.7619 },
+ { 61.9829, 14.2857 },
+};
+
+static const StrokeRec char113[] = {
+ { 2, char113_stroke0 },
+ { 14, char113_stroke1 },
+};
+
+/* char: 114 'r' */
+
+static const CoordRec char114_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, 0 },
+};
+
+static const CoordRec char114_stroke1[] = {
+ { 9.46, 38.0952 },
+ { 14.2219, 52.381 },
+ { 23.7457, 61.9048 },
+ { 33.2695, 66.6667 },
+ { 47.5552, 66.6667 },
+};
+
+static const StrokeRec char114[] = {
+ { 2, char114_stroke0 },
+ { 5, char114_stroke1 },
+};
+
+/* char: 115 's' */
+
+static const CoordRec char115_stroke0[] = {
+ { 57.081, 52.381 },
+ { 52.319, 61.9048 },
+ { 38.0333, 66.6667 },
+ { 23.7476, 66.6667 },
+ { 9.4619, 61.9048 },
+ { 4.7, 52.381 },
+ { 9.4619, 42.8571 },
+ { 18.9857, 38.0952 },
+ { 42.7952, 33.3333 },
+ { 52.319, 28.5714 },
+ { 57.081, 19.0476 },
+ { 57.081, 14.2857 },
+ { 52.319, 4.7619 },
+ { 38.0333, 0 },
+ { 23.7476, 0 },
+ { 9.4619, 4.7619 },
+ { 4.7, 14.2857 },
+};
+
+static const StrokeRec char115[] = {
+ { 17, char115_stroke0 },
+};
+
+/* char: 116 't' */
+
+static const CoordRec char116_stroke0[] = {
+ { 14.8257, 100 },
+ { 14.8257, 19.0476 },
+ { 19.5876, 4.7619 },
+ { 29.1114, 0 },
+ { 38.6352, 0 },
+};
+
+static const CoordRec char116_stroke1[] = {
+ { 0.54, 66.6667 },
+ { 33.8733, 66.6667 },
+};
+
+static const StrokeRec char116[] = {
+ { 5, char116_stroke0 },
+ { 2, char116_stroke1 },
+};
+
+/* char: 117 'u' */
+
+static const CoordRec char117_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, 19.0476 },
+ { 14.2219, 4.7619 },
+ { 23.7457, 0 },
+ { 38.0314, 0 },
+ { 47.5552, 4.7619 },
+ { 61.841, 19.0476 },
+};
+
+static const CoordRec char117_stroke1[] = {
+ { 61.841, 66.6667 },
+ { 61.841, 0 },
+};
+
+static const StrokeRec char117[] = {
+ { 7, char117_stroke0 },
+ { 2, char117_stroke1 },
+};
+
+/* char: 118 'v' */
+
+static const CoordRec char118_stroke0[] = {
+ { 1.8, 66.6667 },
+ { 30.3714, 0 },
+};
+
+static const CoordRec char118_stroke1[] = {
+ { 58.9429, 66.6667 },
+ { 30.3714, 0 },
+};
+
+static const StrokeRec char118[] = {
+ { 2, char118_stroke0 },
+ { 2, char118_stroke1 },
+};
+
+/* char: 119 'w' */
+
+static const CoordRec char119_stroke0[] = {
+ { 2.5, 66.6667 },
+ { 21.5476, 0 },
+};
+
+static const CoordRec char119_stroke1[] = {
+ { 40.5952, 66.6667 },
+ { 21.5476, 0 },
+};
+
+static const CoordRec char119_stroke2[] = {
+ { 40.5952, 66.6667 },
+ { 59.6429, 0 },
+};
+
+static const CoordRec char119_stroke3[] = {
+ { 78.6905, 66.6667 },
+ { 59.6429, 0 },
+};
+
+static const StrokeRec char119[] = {
+ { 2, char119_stroke0 },
+ { 2, char119_stroke1 },
+ { 2, char119_stroke2 },
+ { 2, char119_stroke3 },
+};
+
+/* char: 120 'x' */
+
+static const CoordRec char120_stroke0[] = {
+ { 1.66, 66.6667 },
+ { 54.041, 0 },
+};
+
+static const CoordRec char120_stroke1[] = {
+ { 54.041, 66.6667 },
+ { 1.66, 0 },
+};
+
+static const StrokeRec char120[] = {
+ { 2, char120_stroke0 },
+ { 2, char120_stroke1 },
+};
+
+/* char: 121 'y' */
+
+static const CoordRec char121_stroke0[] = {
+ { 6.5619, 66.6667 },
+ { 35.1333, 0 },
+};
+
+static const CoordRec char121_stroke1[] = {
+ { 63.7048, 66.6667 },
+ { 35.1333, 0 },
+ { 25.6095, -19.0476 },
+ { 16.0857, -28.5714 },
+ { 6.5619, -33.3333 },
+ { 1.8, -33.3333 },
+};
+
+static const StrokeRec char121[] = {
+ { 2, char121_stroke0 },
+ { 6, char121_stroke1 },
+};
+
+/* char: 122 'z' */
+
+static const CoordRec char122_stroke0[] = {
+ { 56.821, 66.6667 },
+ { 4.44, 0 },
+};
+
+static const CoordRec char122_stroke1[] = {
+ { 4.44, 66.6667 },
+ { 56.821, 66.6667 },
+};
+
+static const CoordRec char122_stroke2[] = {
+ { 4.44, 0 },
+ { 56.821, 0 },
+};
+
+static const StrokeRec char122[] = {
+ { 2, char122_stroke0 },
+ { 2, char122_stroke1 },
+ { 2, char122_stroke2 },
+};
+
+/* char: 123 '{' */
+
+static const CoordRec char123_stroke0[] = {
+ { 31.1895, 119.048 },
+ { 21.6657, 114.286 },
+ { 16.9038, 109.524 },
+ { 12.1419, 100 },
+ { 12.1419, 90.4762 },
+ { 16.9038, 80.9524 },
+ { 21.6657, 76.1905 },
+ { 26.4276, 66.6667 },
+ { 26.4276, 57.1429 },
+ { 16.9038, 47.619 },
+};
+
+static const CoordRec char123_stroke1[] = {
+ { 21.6657, 114.286 },
+ { 16.9038, 104.762 },
+ { 16.9038, 95.2381 },
+ { 21.6657, 85.7143 },
+ { 26.4276, 80.9524 },
+ { 31.1895, 71.4286 },
+ { 31.1895, 61.9048 },
+ { 26.4276, 52.381 },
+ { 7.38, 42.8571 },
+ { 26.4276, 33.3333 },
+ { 31.1895, 23.8095 },
+ { 31.1895, 14.2857 },
+ { 26.4276, 4.7619 },
+ { 21.6657, 0 },
+ { 16.9038, -9.5238 },
+ { 16.9038, -19.0476 },
+ { 21.6657, -28.5714 },
+};
+
+static const CoordRec char123_stroke2[] = {
+ { 16.9038, 38.0952 },
+ { 26.4276, 28.5714 },
+ { 26.4276, 19.0476 },
+ { 21.6657, 9.5238 },
+ { 16.9038, 4.7619 },
+ { 12.1419, -4.7619 },
+ { 12.1419, -14.2857 },
+ { 16.9038, -23.8095 },
+ { 21.6657, -28.5714 },
+ { 31.1895, -33.3333 },
+};
+
+static const StrokeRec char123[] = {
+ { 10, char123_stroke0 },
+ { 17, char123_stroke1 },
+ { 10, char123_stroke2 },
+};
+
+/* char: 124 '|' */
+
+static const CoordRec char124_stroke0[] = {
+ { 11.54, 119.048 },
+ { 11.54, -33.3333 },
+};
+
+static const StrokeRec char124[] = {
+ { 2, char124_stroke0 },
+};
+
+/* char: 125 '}' */
+
+static const CoordRec char125_stroke0[] = {
+ { 9.18, 119.048 },
+ { 18.7038, 114.286 },
+ { 23.4657, 109.524 },
+ { 28.2276, 100 },
+ { 28.2276, 90.4762 },
+ { 23.4657, 80.9524 },
+ { 18.7038, 76.1905 },
+ { 13.9419, 66.6667 },
+ { 13.9419, 57.1429 },
+ { 23.4657, 47.619 },
+};
+
+static const CoordRec char125_stroke1[] = {
+ { 18.7038, 114.286 },
+ { 23.4657, 104.762 },
+ { 23.4657, 95.2381 },
+ { 18.7038, 85.7143 },
+ { 13.9419, 80.9524 },
+ { 9.18, 71.4286 },
+ { 9.18, 61.9048 },
+ { 13.9419, 52.381 },
+ { 32.9895, 42.8571 },
+ { 13.9419, 33.3333 },
+ { 9.18, 23.8095 },
+ { 9.18, 14.2857 },
+ { 13.9419, 4.7619 },
+ { 18.7038, 0 },
+ { 23.4657, -9.5238 },
+ { 23.4657, -19.0476 },
+ { 18.7038, -28.5714 },
+};
+
+static const CoordRec char125_stroke2[] = {
+ { 23.4657, 38.0952 },
+ { 13.9419, 28.5714 },
+ { 13.9419, 19.0476 },
+ { 18.7038, 9.5238 },
+ { 23.4657, 4.7619 },
+ { 28.2276, -4.7619 },
+ { 28.2276, -14.2857 },
+ { 23.4657, -23.8095 },
+ { 18.7038, -28.5714 },
+ { 9.18, -33.3333 },
+};
+
+static const StrokeRec char125[] = {
+ { 10, char125_stroke0 },
+ { 17, char125_stroke1 },
+ { 10, char125_stroke2 },
+};
+
+/* char: 126 '~' */
+
+static const CoordRec char126_stroke0[] = {
+ { 2.92, 28.5714 },
+ { 2.92, 38.0952 },
+ { 7.6819, 52.381 },
+ { 17.2057, 57.1429 },
+ { 26.7295, 57.1429 },
+ { 36.2533, 52.381 },
+ { 55.301, 38.0952 },
+ { 64.8248, 33.3333 },
+ { 74.3486, 33.3333 },
+ { 83.8724, 38.0952 },
+ { 88.6343, 47.619 },
+};
+
+static const CoordRec char126_stroke1[] = {
+ { 2.92, 38.0952 },
+ { 7.6819, 47.619 },
+ { 17.2057, 52.381 },
+ { 26.7295, 52.381 },
+ { 36.2533, 47.619 },
+ { 55.301, 33.3333 },
+ { 64.8248, 28.5714 },
+ { 74.3486, 28.5714 },
+ { 83.8724, 33.3333 },
+ { 88.6343, 47.619 },
+ { 88.6343, 57.1429 },
+};
+
+static const StrokeRec char126[] = {
+ { 11, char126_stroke0 },
+ { 11, char126_stroke1 },
+};
+
+/* char: 127 */
+
+static const CoordRec char127_stroke0[] = {
+ { 52.381, 100 },
+ { 14.2857, -33.3333 },
+};
+
+static const CoordRec char127_stroke1[] = {
+ { 28.5714, 66.6667 },
+ { 14.2857, 61.9048 },
+ { 4.7619, 52.381 },
+ { 0, 38.0952 },
+ { 0, 23.8095 },
+ { 4.7619, 14.2857 },
+ { 14.2857, 4.7619 },
+ { 28.5714, 0 },
+ { 38.0952, 0 },
+ { 52.381, 4.7619 },
+ { 61.9048, 14.2857 },
+ { 66.6667, 28.5714 },
+ { 66.6667, 42.8571 },
+ { 61.9048, 52.381 },
+ { 52.381, 61.9048 },
+ { 38.0952, 66.6667 },
+ { 28.5714, 66.6667 },
+};
+
+static const StrokeRec char127[] = {
+ { 2, char127_stroke0 },
+ { 17, char127_stroke1 },
+};
+
+static const StrokeCharRec chars[] = {
+ { 0, /* char0 */ 0, 0, 0 },
+ { 0, /* char1 */ 0, 0, 0 },
+ { 0, /* char2 */ 0, 0, 0 },
+ { 0, /* char3 */ 0, 0, 0 },
+ { 0, /* char4 */ 0, 0, 0 },
+ { 0, /* char5 */ 0, 0, 0 },
+ { 0, /* char6 */ 0, 0, 0 },
+ { 0, /* char7 */ 0, 0, 0 },
+ { 0, /* char8 */ 0, 0, 0 },
+ { 0, /* char9 */ 0, 0, 0 },
+ { 0, /* char10 */ 0, 0, 0 },
+ { 0, /* char11 */ 0, 0, 0 },
+ { 0, /* char12 */ 0, 0, 0 },
+ { 0, /* char13 */ 0, 0, 0 },
+ { 0, /* char14 */ 0, 0, 0 },
+ { 0, /* char15 */ 0, 0, 0 },
+ { 0, /* char16 */ 0, 0, 0 },
+ { 0, /* char17 */ 0, 0, 0 },
+ { 0, /* char18 */ 0, 0, 0 },
+ { 0, /* char19 */ 0, 0, 0 },
+ { 0, /* char20 */ 0, 0, 0 },
+ { 0, /* char21 */ 0, 0, 0 },
+ { 0, /* char22 */ 0, 0, 0 },
+ { 0, /* char23 */ 0, 0, 0 },
+ { 0, /* char24 */ 0, 0, 0 },
+ { 0, /* char25 */ 0, 0, 0 },
+ { 0, /* char26 */ 0, 0, 0 },
+ { 0, /* char27 */ 0, 0, 0 },
+ { 0, /* char28 */ 0, 0, 0 },
+ { 0, /* char29 */ 0, 0, 0 },
+ { 0, /* char30 */ 0, 0, 0 },
+ { 0, /* char31 */ 0, 0, 0 },
+ { 0, /* char32 */ 0, 35, 70 }, /* jwz: changed this to be 'n' width.
+ (it was 52.381, 104.762) */
+ { 2, char33, 13.3819, 26.6238 },
+ { 2, char34, 23.0676, 51.4352 },
+ { 4, char35, 36.5333, 79.4886 },
+ { 3, char36, 38.1533, 76.2067 },
+ { 3, char37, 49.2171, 96.5743 },
+ { 1, char38, 53.599, 101.758 },
+ { 1, char39, 4.44, 13.62 },
+ { 1, char40, 21.8657, 47.1733 },
+ { 1, char41, 24.3276, 47.5333 },
+ { 3, char42, 30.7695, 59.439 },
+ { 2, char43, 48.8371, 97.2543 },
+ { 1, char44, 13.5219, 26.0638 },
+ { 1, char45, 50.2371, 100.754 },
+ { 1, char46, 13.1019, 26.4838 },
+ { 1, char47, 40.5733, 82.1067 },
+ { 1, char48, 38.3133, 77.0667 },
+ { 1, char49, 30.8676, 66.5295 },
+ { 1, char50, 38.7533, 77.6467 },
+ { 1, char51, 38.3333, 77.0467 },
+ { 2, char52, 37.2133, 80.1686 },
+ { 1, char53, 38.1933, 77.6867 },
+ { 1, char54, 34.1514, 73.8048 },
+ { 2, char55, 38.8933, 77.2267 },
+ { 1, char56, 38.9333, 77.6667 },
+ { 1, char57, 39.9333, 74.0648 },
+ { 2, char58, 14.0819, 26.2238 },
+ { 2, char59, 12.9619, 26.3038 },
+ { 1, char60, 41.1552, 81.6105 },
+ { 2, char61, 48.5571, 97.2543 },
+ { 1, char62, 40.8752, 81.6105 },
+ { 2, char63, 36.9914, 73.9029 },
+ { 2, char64, 34.9314, 74.3648 },
+ { 3, char65, 40.5952, 80.4905 },
+ { 3, char66, 44.7533, 83.6267 },
+ { 1, char67, 39.9933, 84.4886 },
+ { 2, char68, 45.2933, 85.2867 },
+ { 4, char69, 39.9914, 78.1848 },
+ { 3, char70, 39.9914, 78.7448 },
+ { 2, char71, 40.3933, 89.7686 },
+ { 3, char72, 44.7533, 89.0867 },
+ { 1, char73, 10.86, 21.3 },
+ { 1, char74, 31.0714, 59.999 },
+ { 3, char75, 44.6133, 79.3267 },
+ { 2, char76, 40.2514, 71.3229 },
+ { 4, char77, 48.9552, 97.2105 },
+ { 3, char78, 44.4733, 88.8067 },
+ { 1, char79, 44.3352, 88.8305 },
+ { 2, char80, 45.4333, 85.6667 },
+ { 2, char81, 43.3952, 88.0905 },
+ { 3, char82, 45.0133, 82.3667 },
+ { 1, char83, 41.3333, 80.8267 },
+ { 2, char84, 35.6933, 71.9467 },
+ { 1, char85, 44.8733, 89.4867 },
+ { 2, char86, 40.4552, 81.6105 },
+ { 4, char87, 49.839, 100.518 },
+ { 2, char88, 35.8333, 72.3667 },
+ { 2, char89, 39.6152, 79.6505 },
+ { 3, char90, 35.8333, 73.7467 },
+ { 4, char91, 22.0657, 46.1133 },
+ { 1, char92, 39.1733, 78.2067 },
+ { 4, char93, 23.4876, 46.3933 },
+ { 2, char94, 44.0752, 90.2305 },
+ { 1, char95, 51.281, 104.062 },
+ { 2, char96, 42.5457, 83.5714 },
+ { 2, char97, 35.2514, 66.6029 },
+ { 2, char98, 37.3314, 70.4629 },
+ { 1, char99, 34.0914, 68.9229 },
+ { 2, char100, 33.2114, 70.2629 },
+ { 1, char101, 34.2914, 68.5229 },
+ { 2, char102, 14.9657, 38.6552 },
+ { 2, char103, 33.9314, 70.9829 },
+ { 2, char104, 33.4095, 71.021 },
+ { 2, char105, 14.7819, 28.8638 },
+ { 2, char106, 17.3876, 36.2314 },
+ { 3, char107, 33.4095, 62.521 },
+ { 1, char108, 10.02, 19.34 },
+ { 3, char109, 61.981, 123.962 },
+ { 2, char110, 32.9895, 70.881 },
+ { 1, char111, 33.5514, 71.7448 },
+ { 2, char112, 38.0314, 70.8029 },
+ { 2, char113, 33.4114, 70.7429 },
+ { 2, char114, 23.7457, 49.4952 },
+ { 1, char115, 28.5095, 62.321 },
+ { 2, char116, 14.8257, 39.3152 },
+ { 2, char117, 33.2695, 71.161 },
+ { 2, char118, 30.3714, 60.6029 },
+ { 4, char119, 40.5952, 80.4905 },
+ { 2, char120, 25.4695, 56.401 },
+ { 2, char121, 35.1333, 66.0648 },
+ { 3, char122, 28.2495, 61.821 },
+ { 3, char123, 21.6657, 41.6295 },
+ { 1, char124, 11.54, 23.78 },
+ { 3, char125, 18.7038, 41.4695 },
+ { 2, char126, 45.7771, 91.2743 },
+ { 2, char127, 33.3333, 66.6667 },
+};
+
+static
+StrokeFontRec glutStrokeRoman = { "Roman", 128, chars, 119.048, -33.3333 };
+
diff --git a/hacks/glx/glut_stroke.c b/hacks/glx/glut_stroke.c
new file mode 100644
index 0000000..59850ea
--- /dev/null
+++ b/hacks/glx/glut_stroke.c
@@ -0,0 +1,66 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#if 0 /* for Mesa */
+# include "glutint.h"
+#else /* for xscreensaver */
+
+# ifdef HAVE_CONFIG_H
+# include "config.h"
+# endif
+
+# ifdef HAVE_COCOA
+# include "jwxyz.h"
+# elif defined(HAVE_ANDROID)
+# include "jwxyz.h"
+# include <GLES/gl.h>
+# else /* real X11 */
+# include <GL/gl.h>
+# endif
+
+# ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+# endif /* HAVE_JWZGLES */
+
+# undef APIENTRY
+# define APIENTRY /**/
+#endif
+
+#include "glutstroke.h"
+
+void APIENTRY
+glutStrokeCharacter(GLUTstrokeFont font, int c)
+{
+ const StrokeCharRec *ch;
+ const StrokeRec *stroke;
+ const CoordRec *coord;
+ StrokeFontPtr fontinfo;
+ int i, j;
+
+
+#if defined(_WIN32)
+ fontinfo = (StrokeFontPtr) __glutFont(font);
+#else
+ fontinfo = (StrokeFontPtr) font;
+#endif
+
+ if (c < 0 || c >= fontinfo->num_chars)
+ return;
+ ch = &(fontinfo->ch[c]);
+ if (ch) {
+ for (i = ch->num_strokes, stroke = ch->stroke;
+ i > 0; i--, stroke++) {
+ glBegin(GL_LINE_STRIP);
+ for (j = stroke->num_coords, coord = stroke->coord;
+ j > 0; j--, coord++) {
+ glVertex2f(coord->x, coord->y);
+ }
+ glEnd();
+ }
+ glTranslatef(ch->right, 0.0, 0.0);
+ }
+}
diff --git a/hacks/glx/glut_swidth.c b/hacks/glx/glut_swidth.c
new file mode 100644
index 0000000..b165a0a
--- /dev/null
+++ b/hacks/glx/glut_swidth.c
@@ -0,0 +1,77 @@
+
+/* Copyright (c) Mark J. Kilgard, 1995. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#if 0 /* for Mesa */
+# include "glutint.h"
+#else /* for xscreensaver */
+# ifdef HAVE_CONFIG_H
+# include "config.h"
+# endif
+# ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# endif
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#define Bool int
+#endif
+# ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+# endif /* HAVE_JWZGLES */
+# undef APIENTRY
+# define APIENTRY /**/
+#endif
+
+#include "glutstroke.h"
+
+/* CENTRY */
+int APIENTRY
+glutStrokeWidth(GLUTstrokeFont font, int c)
+{
+ StrokeFontPtr fontinfo;
+ const StrokeCharRec *ch;
+
+#if defined(_WIN32)
+ fontinfo = (StrokeFontPtr) __glutFont(font);
+#else
+ fontinfo = (StrokeFontPtr) font;
+#endif
+
+ if (c < 0 || c >= fontinfo->num_chars)
+ return 0;
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ return ch->right;
+ else
+ return 0;
+}
+
+int APIENTRY
+glutStrokeLength(GLUTstrokeFont font, const unsigned char *string)
+{
+ int c, length;
+ StrokeFontPtr fontinfo;
+ const StrokeCharRec *ch;
+
+#if defined(_WIN32)
+ fontinfo = (StrokeFontPtr) __glutFont(font);
+#else
+ fontinfo = (StrokeFontPtr) font;
+#endif
+
+ length = 0;
+ for (; *string != '\0'; string++) {
+ c = *string;
+ if (c >= 0 && c < fontinfo->num_chars) {
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ length += ch->right;
+ }
+ }
+ return length;
+}
+
+/* ENDCENTRY */
diff --git a/hacks/glx/glutstroke.h b/hacks/glx/glutstroke.h
new file mode 100644
index 0000000..43a645b
--- /dev/null
+++ b/hacks/glx/glutstroke.h
@@ -0,0 +1,47 @@
+#ifndef __glutstroke_h__
+#define __glutstroke_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+#pragma warning (disable:4244) /* disable bogus conversion warnings */
+#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
+#endif
+
+typedef struct {
+ float x;
+ float y;
+} CoordRec, *CoordPtr;
+
+typedef struct {
+ int num_coords;
+ const CoordRec *coord;
+} StrokeRec, *StrokePtr;
+
+typedef struct {
+ int num_strokes;
+ const StrokeRec *stroke;
+ float center;
+ float right;
+} StrokeCharRec, *StrokeCharPtr;
+
+typedef struct {
+ const char *name;
+ int num_chars;
+ const StrokeCharRec *ch;
+ float top;
+ float bottom;
+} StrokeFontRec, *StrokeFontPtr;
+
+typedef void *GLUTstrokeFont;
+
+/* for xscreensaver */
+extern void glutStrokeCharacter (GLUTstrokeFont font, int c);
+extern int glutStrokeWidth (GLUTstrokeFont font, int c);
+extern int glutStrokeLength (GLUTstrokeFont font, const unsigned char *string);
+
+#endif /* __glutstroke_h__ */
diff --git a/hacks/glx/grab-ximage.c b/hacks/glx/grab-ximage.c
new file mode 100644
index 0000000..0f71847
--- /dev/null
+++ b/hacks/glx/grab-ximage.c
@@ -0,0 +1,813 @@
+/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
+ * xscreensaver, Copyright (c) 2001-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+# ifndef HAVE_JWZGLES
+# include <OpenGL/glu.h>
+# endif
+#else
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# include <GL/gl.h> /* only for GLfloat */
+# include <GL/glu.h> /* for gluBuild2DMipmaps */
+# include <GL/glx.h> /* for glXMakeCurrent() */
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "grab-ximage.h"
+#include "grabscreen.h"
+#include "pow2.h"
+#include "visual.h"
+
+/* If REFORMAT_IMAGE_DATA is defined, then we convert Pixmaps to textures
+ like this:
+
+ - get Pixmap as an XImage in whatever form the server hands us;
+ - convert that XImage to 32-bit RGBA in client-local endianness;
+ - make the texture using RGBA, UNSIGNED_BYTE.
+
+ If undefined, we do this:
+
+ - get Pixmap as an XImage in whatever form the server hands us;
+ - figure out what OpenGL texture packing parameters correspond to
+ the image data that the server sent us and use that, e.g.,
+ BGRA, INT_8_8_8_8_REV.
+
+ You might expect the second method to be faster, since we're not making
+ a second copy of the data and iterating each pixel before we hand it
+ to GL. But, you'd be wrong. The first method is almost 6x faster.
+ I guess GL is reformatting it *again*, and doing it very inefficiently!
+*/
+#define REFORMAT_IMAGE_DATA
+
+
+#include "xshm.h"
+
+extern char *progname;
+
+#include <sys/time.h>
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xutil.h>
+#endif
+
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+static int debug_p = 0;
+
+static Bool
+bigendian (void)
+{
+ union { int i; char c[sizeof(int)]; } u;
+ u.i = 1;
+ return !u.c[0];
+}
+
+
+#ifdef REFORMAT_IMAGE_DATA
+
+/* Given a bitmask, returns the position and width of the field.
+ */
+static void
+decode_mask (unsigned long mask, unsigned long *pos_ret,
+ unsigned long *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+/* Given a value and a field-width, expands the field to fill out 8 bits.
+ */
+static unsigned char
+spread_bits (unsigned char value, unsigned char width)
+{
+ switch (width)
+ {
+ case 8: return value;
+ case 7: return (value << 1) | (value >> 6);
+ case 6: return (value << 2) | (value >> 4);
+ case 5: return (value << 3) | (value >> 2);
+ case 4: return (value << 4) | (value);
+ case 3: return (value << 5) | (value << 2) | (value >> 2);
+ case 2: return (value << 6) | (value << 4) | (value);
+ default: abort(); break;
+ }
+}
+
+
+static XImage *
+convert_ximage_to_rgba32 (Screen *screen, XImage *image)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Visual *visual = DefaultVisualOfScreen (screen);
+
+ int x, y;
+ unsigned long crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+ unsigned long srpos=0, sgpos=0, sbpos=0;
+ unsigned long srmsk=0, sgmsk=0, sbmsk=0;
+ unsigned long srsiz=0, sgsiz=0, sbsiz=0;
+ XColor *colors = 0;
+ unsigned char spread_map[3][256];
+
+ /* Note: height+2 in "to" to work around an array bounds overrun
+ in gluBuild2DMipmaps / gluScaleImage.
+ */
+ XImage *from = image;
+ XImage *to = XCreateImage (dpy, visual, 32, /* depth */
+ ZPixmap, 0, 0, from->width, from->height,
+ 32, /* bitmap pad */
+ 0);
+ to->data = (char *) calloc (to->height + 2, to->bytes_per_line);
+
+ /* Set the bit order in the XImage structure to whatever the
+ local host's native bit order is.
+ */
+ to->bitmap_bit_order =
+ to->byte_order =
+ (bigendian() ? MSBFirst : LSBFirst);
+
+ if (visual_class (screen, visual) == PseudoColor ||
+ visual_class (screen, visual) == GrayScale)
+ {
+ Colormap cmap = DefaultColormapOfScreen (screen);
+ int ncolors = visual_cells (screen, visual);
+ int i;
+ colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
+ for (i = 0; i < ncolors; i++)
+ colors[i].pixel = i;
+ XQueryColors (dpy, cmap, colors, ncolors);
+ }
+
+ if (colors == 0) /* truecolor */
+ {
+ srmsk = to->red_mask;
+ sgmsk = to->green_mask;
+ sbmsk = to->blue_mask;
+
+ decode_mask (srmsk, &srpos, &srsiz);
+ decode_mask (sgmsk, &sgpos, &sgsiz);
+ decode_mask (sbmsk, &sbpos, &sbsiz);
+ }
+
+ /* Pack things in "RGBA" order in client endianness. */
+ if (bigendian())
+ crpos = 24, cgpos = 16, cbpos = 8, capos = 0;
+ else
+ crpos = 0, cgpos = 8, cbpos = 16, capos = 24;
+
+ if (colors == 0) /* truecolor */
+ {
+ int i;
+ for (i = 0; i < 256; i++)
+ {
+ spread_map[0][i] = spread_bits (i, srsiz);
+ spread_map[1][i] = spread_bits (i, sgsiz);
+ spread_map[2][i] = spread_bits (i, sbsiz);
+ }
+ }
+
+ /* trying to track down an intermittent crash in ximage_putpixel_32 */
+ if (to->width < from->width) abort();
+ if (to->height < from->height) abort();
+
+ for (y = 0; y < from->height; y++)
+ for (x = 0; x < from->width; x++)
+ {
+ unsigned long sp = XGetPixel (from, x, y);
+ unsigned char sr, sg, sb;
+ unsigned long cp;
+
+ if (colors)
+ {
+ sr = colors[sp].red & 0xFF;
+ sg = colors[sp].green & 0xFF;
+ sb = colors[sp].blue & 0xFF;
+ }
+ else
+ {
+ sr = (sp & srmsk) >> srpos;
+ sg = (sp & sgmsk) >> sgpos;
+ sb = (sp & sbmsk) >> sbpos;
+
+ sr = spread_map[0][sr];
+ sg = spread_map[1][sg];
+ sb = spread_map[2][sb];
+ }
+
+ cp = ((sr << crpos) |
+ (sg << cgpos) |
+ (sb << cbpos) |
+ (0xFF << capos));
+
+ XPutPixel (to, x, y, cp);
+ }
+
+ if (colors) free (colors);
+
+ return to;
+}
+
+#endif /* REFORMAT_IMAGE_DATA */
+
+/* Shrinks the XImage by a factor of two.
+ We use this when mipmapping fails on large textures.
+ */
+static void
+halve_image (XImage *ximage, XRectangle *geom)
+{
+ int w2 = ximage->width/2;
+ int h2 = ximage->height/2;
+ int x, y;
+ XImage *ximage2;
+
+ if (w2 <= 32 || h2 <= 32) /* let's not go crazy here, man. */
+ return;
+
+ if (debug_p)
+ fprintf (stderr, "%s: shrinking image %dx%d -> %dx%d\n",
+ progname, ximage->width, ximage->height, w2, h2);
+
+ ximage2 = (XImage *) calloc (1, sizeof (*ximage2));
+ *ximage2 = *ximage;
+ ximage2->width = w2;
+ ximage2->height = h2;
+ ximage2->bytes_per_line = 0;
+ ximage2->data = 0;
+ XInitImage (ximage2);
+
+ ximage2->data = (char *) calloc (h2, ximage2->bytes_per_line);
+ if (!ximage2->data)
+ {
+ fprintf (stderr, "%s: out of memory (scaling %dx%d image to %dx%d)\n",
+ progname, ximage->width, ximage->height, w2, h2);
+ exit (1);
+ }
+
+ for (y = 0; y < h2; y++)
+ for (x = 0; x < w2; x++)
+ XPutPixel (ximage2, x, y, XGetPixel (ximage, x*2, y*2));
+
+ free (ximage->data);
+ *ximage = *ximage2;
+ ximage2->data = 0;
+ XFree (ximage2);
+
+ if (geom)
+ {
+ geom->x /= 2;
+ geom->y /= 2;
+ geom->width /= 2;
+ geom->height /= 2;
+ }
+}
+
+
+#ifdef REFORMAT_IMAGE_DATA
+
+/* Pulls the Pixmap bits from the server and returns an XImage
+ in some format acceptable to OpenGL.
+ */
+static XImage *
+pixmap_to_gl_ximage (Screen *screen, Window window, Pixmap pixmap)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Visual *visual = DefaultVisualOfScreen (screen);
+ unsigned int width, height, depth;
+
+ XShmSegmentInfo shm_info;
+
+ XImage *server_ximage = 0;
+ XImage *client_ximage = 0;
+
+ {
+ Window root;
+ int x, y;
+ unsigned int bw;
+ XGetGeometry (dpy, pixmap, &root, &x, &y, &width, &height, &bw, &depth);
+ }
+
+ if (width < 5 || height < 5) /* something's gone wrong somewhere... */
+ return 0;
+
+ /* Convert the server-side Pixmap to a client-side GL-ordered XImage.
+ */
+ server_ximage = create_xshm_image (dpy, visual, depth, ZPixmap, &shm_info,
+ width, height);
+ get_xshm_image (dpy, pixmap, server_ximage, 0, 0, ~0L, &shm_info);
+
+ client_ximage = convert_ximage_to_rgba32 (screen, server_ximage);
+
+ destroy_xshm_image (dpy, server_ximage, &shm_info);
+
+ return client_ximage;
+}
+
+
+# else /* ! REFORMAT_IMAGE_DATA */
+
+typedef struct {
+ unsigned int depth, red_mask, green_mask, blue_mask; /* when this... */
+ GLint type, format; /* ...use this. */
+} conversion_table;
+
+/* Abbreviate these so that the table entries all fit on one line...
+ */
+#define BYTE GL_UNSIGNED_BYTE
+#define BYTE_2_3_3_REV GL_UNSIGNED_BYTE_2_3_3_REV
+#define BYTE_3_3_2 GL_UNSIGNED_BYTE_3_3_2
+#define INT_10_10_10_2 GL_UNSIGNED_INT_10_10_10_2
+#define INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV
+#define INT_8_8_8_8 GL_UNSIGNED_INT_8_8_8_8
+#define INT_8_8_8_8_REV GL_UNSIGNED_INT_8_8_8_8_REV
+#define SHORT_1_5_5_5_REV GL_UNSIGNED_SHORT_1_5_5_5_REV
+#define SHORT_4_4_4_4 GL_UNSIGNED_SHORT_4_4_4_4
+#define SHORT_4_4_4_4_REV GL_UNSIGNED_SHORT_4_4_4_4_REV
+#define SHORT_5_5_5_1 GL_UNSIGNED_SHORT_5_5_5_1
+#define SHORT_5_6_5 GL_UNSIGNED_SHORT_5_6_5
+#define SHORT_5_6_5_REV GL_UNSIGNED_SHORT_5_6_5_REV
+
+static const conversion_table ctable[] = {
+ { 8, 0x000000E0, 0x0000001C, 0x00000003, BYTE_3_3_2, GL_RGB },
+ { 8, 0x00000007, 0x00000038, 0x000000C0, BYTE_2_3_3_REV, GL_RGB },
+ { 16, 0x0000F800, 0x000007E0, 0x0000001F, SHORT_5_6_5, GL_RGB },
+ { 16, 0x0000001F, 0x000007E0, 0x0000F800, SHORT_5_6_5_REV, GL_RGB },
+ { 16, 0x0000F000, 0x00000F00, 0x000000F0, SHORT_4_4_4_4, GL_RGBA },
+ { 16, 0x000000F0, 0x00000F00, 0x0000F000, SHORT_4_4_4_4, GL_BGRA },
+ { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4, GL_ABGR_EXT },
+ { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4_REV, GL_RGBA },
+ { 16, 0x00000F00, 0x000000F0, 0x0000000F, SHORT_4_4_4_4_REV, GL_BGRA },
+ { 16, 0x0000F800, 0x000007C0, 0x0000003E, SHORT_5_5_5_1, GL_RGBA },
+ { 16, 0x0000003E, 0x000007C0, 0x0000F800, SHORT_5_5_5_1, GL_BGRA },
+ { 16, 0x00000001, 0x0000003E, 0x000007C0, SHORT_5_5_5_1, GL_ABGR_EXT },
+ { 16, 0x0000001F, 0x000003E0, 0x00007C00, SHORT_1_5_5_5_REV, GL_RGBA },
+ { 16, 0x00007C00, 0x000003E0, 0x0000001F, SHORT_1_5_5_5_REV, GL_BGRA },
+ { 32, 0xFF000000, 0x00FF0000, 0x0000FF00, INT_8_8_8_8, GL_RGBA },
+ { 32, 0x0000FF00, 0x00FF0000, 0xFF000000, INT_8_8_8_8, GL_BGRA },
+ { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8, GL_ABGR_EXT },
+ { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8_REV, GL_RGBA },
+ { 32, 0x00FF0000, 0x0000FF00, 0x000000FF, INT_8_8_8_8_REV, GL_BGRA },
+ { 32, 0xFFC00000, 0x003FF000, 0x00000FFC, INT_10_10_10_2, GL_RGBA },
+ { 32, 0x00000FFC, 0x003FF000, 0xFFC00000, INT_10_10_10_2, GL_BGRA },
+ { 32, 0x00000003, 0x00000FFC, 0x003FF000, INT_10_10_10_2, GL_ABGR_EXT },
+ { 32, 0x000003FF, 0x000FFC00, 0x3FF00000, INT_2_10_10_10_REV, GL_RGBA },
+ { 32, 0x3FF00000, 0x000FFC00, 0x000003FF, INT_2_10_10_10_REV, GL_BGRA },
+ { 24, 0x000000FF, 0x0000FF00, 0x00FF0000, BYTE, GL_RGB },
+ { 24, 0x00FF0000, 0x0000FF00, 0x000000FF, BYTE, GL_BGR },
+};
+
+
+/* Given an XImage, returns the GL settings to use its data as a texture.
+ */
+static void
+gl_settings_for_ximage (XImage *image,
+ GLint *type_ret, GLint *format_ret, GLint *swap_ret)
+{
+ int i;
+ for (i = 0; i < countof(ctable); ++i)
+ {
+ if (image->bits_per_pixel == ctable[i].depth &&
+ image->red_mask == ctable[i].red_mask &&
+ image->green_mask == ctable[i].green_mask &&
+ image->blue_mask == ctable[i].blue_mask)
+ {
+ *type_ret = ctable[i].type;
+ *format_ret = ctable[i].format;
+
+ if (image->bits_per_pixel == 24)
+ {
+ /* don't know how to test this... */
+ *type_ret = (ctable[i].type == GL_RGB) ? GL_BGR : GL_RGB;
+ *swap_ret = 0;
+ }
+ else
+ {
+ *swap_ret = !!(image->byte_order == MSBFirst) ^ !!bigendian();
+ }
+
+ if (debug_p)
+ {
+ fprintf (stderr, "%s: using %s %s %d for %d %08lX %08lX %08lX\n",
+ progname,
+ (*format_ret == GL_RGB ? "RGB" :
+ *format_ret == GL_BGR ? "BGR" :
+ *format_ret == GL_RGBA ? "RGBA" :
+ *format_ret == GL_BGRA ? "BGRA" :
+ *format_ret == GL_ABGR_EXT ? "ABGR_EXT" :
+ "???"),
+ (*type_ret == BYTE ? "BYTE" :
+ *type_ret == BYTE_3_3_2 ? "BYTE_3_3_2" :
+ *type_ret == BYTE_2_3_3_REV ? "BYTE_2_3_3_REV" :
+ *type_ret == INT_8_8_8_8 ? "INT_8_8_8_8" :
+ *type_ret == INT_8_8_8_8_REV ? "INT_8_8_8_8_REV" :
+ *type_ret == INT_10_10_10_2 ? "INT_10_10_10_2" :
+ *type_ret == INT_2_10_10_10_REV ? "INT_2_10_10_10_REV":
+ *type_ret == SHORT_4_4_4_4 ? "SHORT_4_4_4_4" :
+ *type_ret == SHORT_4_4_4_4_REV ? "SHORT_4_4_4_4_REV" :
+ *type_ret == SHORT_5_5_5_1 ? "SHORT_5_5_5_1" :
+ *type_ret == SHORT_1_5_5_5_REV ? "SHORT_1_5_5_5_REV" :
+ *type_ret == SHORT_5_6_5 ? "SHORT_5_6_5" :
+ *type_ret == SHORT_5_6_5_REV ? "SHORT_5_6_5_REV" :
+ "???"),
+ *swap_ret,
+ image->bits_per_pixel,
+ image->red_mask, image->green_mask, image->blue_mask);
+ }
+
+ return;
+ }
+ }
+
+ /* Unknown RGB fields? */
+ abort();
+}
+
+#endif /* ! REFORMAT_IMAGE_DATA */
+
+typedef struct {
+ GLXContext glx_context;
+ Pixmap pixmap;
+ int pix_width, pix_height, pix_depth;
+ int texid;
+ Bool mipmap_p;
+ double load_time;
+
+ /* Used in async mode
+ */
+ void (*callback) (const char *filename, XRectangle *geometry,
+ int iw, int ih, int tw, int th,
+ void *closure);
+ void *closure;
+
+ /* Used in sync mode
+ */
+ char **filename_return;
+ XRectangle *geometry_return;
+ int *image_width_return;
+ int *image_height_return;
+ int *texture_width_return;
+ int *texture_height_return;
+
+} img_closure;
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+/* Loads the given XImage into GL's texture memory.
+ The image may be of any size.
+ If mipmap_p is true, then make mipmaps instead of just a single texture.
+ Writes to stderr and returns False on error.
+ */
+static Bool
+ximage_to_texture (XImage *ximage,
+ GLint type, GLint format,
+ int *width_return,
+ int *height_return,
+ XRectangle *geometry,
+ Bool mipmap_p)
+{
+ int max_reduction = 7;
+ int err_count = 0;
+ GLenum err = 0;
+ int orig_width = ximage->width;
+ int orig_height = ximage->height;
+ GLsizei tex_width = 0;
+ GLsizei tex_height = 0;
+
+ AGAIN:
+
+ if (mipmap_p)
+ {
+ /* gluBuild2DMipmaps doesn't require textures to be a power of 2. */
+ tex_width = ximage->width;
+ tex_height = ximage->height;
+
+ if (debug_p)
+ fprintf (stderr, "%s: mipmap %d x %d\n",
+ progname, ximage->width, ximage->height);
+
+ gluBuild2DMipmaps (GL_TEXTURE_2D, 3, ximage->width, ximage->height,
+ format, type, ximage->data);
+ err = glGetError();
+ }
+ else
+ {
+ /* glTexImage2D() requires the texture sizes to be powers of 2.
+ So first, create a texture of that size (but don't write any
+ data into it.)
+ */
+ tex_width = (GLsizei) to_pow2 (ximage->width);
+ tex_height = (GLsizei) to_pow2 (ximage->height);
+
+ if (debug_p)
+ fprintf (stderr, "%s: texture %d x %d (%d x %d)\n",
+ progname, ximage->width, ximage->height,
+ tex_width, tex_height);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0,
+ format, type, 0);
+ err = glGetError();
+
+ /* Now load our non-power-of-2 image data into the existing texture. */
+ if (!err)
+ {
+ glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0,
+ ximage->width, ximage->height,
+ GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
+ err = glGetError();
+ }
+ }
+
+ if (err)
+ {
+ char buf[100];
+ const char *s = (char *) gluErrorString (err);
+
+ if (!s || !*s)
+ {
+ sprintf (buf, "unknown error %d", (int) err);
+ s = buf;
+ }
+
+ while (glGetError() != GL_NO_ERROR)
+ ; /* clear any lingering errors */
+
+ if (++err_count > max_reduction)
+ {
+ fprintf (stderr,
+ "\n"
+ "%s: %dx%d texture failed, even after reducing to %dx%d:\n"
+ "%s: The error was: \"%s\".\n"
+ "%s: probably this means "
+ "\"your video card is worthless and weak\"?\n\n",
+ progname, orig_width, orig_height,
+ ximage->width, ximage->height,
+ progname, s,
+ progname);
+ return False;
+ }
+ else
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: mipmap error (%dx%d): %s\n",
+ progname, ximage->width, ximage->height, s);
+ halve_image (ximage, geometry);
+ goto AGAIN;
+ }
+ }
+
+ if (width_return) *width_return = tex_width;
+ if (height_return) *height_return = tex_height;
+ return True;
+}
+
+
+static void load_texture_async_cb (Screen *screen,
+ Window window, Drawable drawable,
+ const char *name, XRectangle *geometry,
+ void *closure);
+
+
+/* Grabs an image of the desktop (or another random image file) and
+ loads the image into GL's texture memory.
+ When the callback is called, the image data will have been loaded
+ into texture number `texid' (via glBindTexture.)
+
+ If an error occurred, width/height will be 0.
+ */
+void
+load_texture_async (Screen *screen, Window window,
+ GLXContext glx_context,
+ int desired_width, int desired_height,
+ Bool mipmap_p,
+ GLuint texid,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ XWindowAttributes xgwa;
+ img_closure *data = (img_closure *) calloc (1, sizeof(*data));
+
+ if (debug_p)
+ data->load_time = double_time();
+
+ data->texid = texid;
+ data->mipmap_p = mipmap_p;
+ data->glx_context = glx_context;
+ data->callback = callback;
+ data->closure = closure;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ data->pix_width = xgwa.width;
+ data->pix_height = xgwa.height;
+ data->pix_depth = xgwa.depth;
+
+ /* Allow the pixmap to be larger than the window. Esper wants this. */
+ if (desired_width /* && desired_width < xgwa.width */)
+ data->pix_width = desired_width;
+ if (desired_height /* && desired_height < xgwa.height */)
+ data->pix_height = desired_height;
+
+ data->pixmap = XCreatePixmap (dpy, window, data->pix_width, data->pix_height,
+ data->pix_depth);
+ load_image_async (screen, window, data->pixmap,
+ load_texture_async_cb, data);
+}
+
+
+/* Once we have an XImage, this loads it into GL.
+ This is used in both synchronous and asynchronous mode.
+ */
+static void
+load_texture_async_cb (Screen *screen, Window window, Drawable drawable,
+ const char *name, XRectangle *geometry, void *closure)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Bool ok;
+ XImage *ximage;
+ GLint type, format;
+ int iw=0, ih=0, tw=0, th=0;
+ double cvt_time=0, tex_time=0, done_time=0;
+ img_closure *data = (img_closure *) closure;
+ /* copy closure data to stack and free the original before running cb */
+ img_closure dd = *data;
+ memset (data, 0, sizeof (*data));
+ free (data);
+ data = 0;
+
+ if (dd.glx_context)
+ glXMakeCurrent (dpy, window, dd.glx_context);
+
+ if (geometry->width <= 0 || geometry->height <= 0)
+ {
+ /* This can happen if an old version of xscreensaver-getimage
+ is installed. Or if we have no image (checkerboard). */
+ geometry->x = 0;
+ geometry->y = 0;
+ geometry->width = dd.pix_width;
+ geometry->height = dd.pix_height;
+ }
+
+ if (geometry->width <= 0 || geometry->height <= 0)
+ abort();
+
+ if (debug_p)
+ cvt_time = double_time();
+
+# ifdef REFORMAT_IMAGE_DATA
+ ximage = pixmap_to_gl_ximage (screen, window, dd.pixmap);
+ format = GL_RGBA;
+ type = GL_UNSIGNED_BYTE;
+
+#else /* ! REFORMAT_IMAGE_DATA */
+ {
+ Visual *visual = DefaultVisualOfScreen (screen);
+ GLint swap;
+
+ ximage = XCreateImage (dpy, visual, dd.pix_depth, ZPixmap, 0, 0,
+ dd.pix_width, dd.pix_height, 32, 0);
+
+ /* Note: height+2 in "to" to be to work around an array bounds overrun
+ in gluBuild2DMipmaps / gluScaleImage. */
+ ximage->data = (char *) calloc (ximage->height+2, ximage->bytes_per_line);
+
+ if (!ximage->data ||
+ !XGetSubImage (dpy, dd.pixmap, 0, 0, ximage->width, ximage->height,
+ ~0L, ximage->format, ximage, 0, 0))
+ {
+ XDestroyImage (ximage);
+ ximage = 0;
+ }
+
+ gl_settings_for_ximage (ximage, &type, &format, &swap);
+ glPixelStorei (GL_UNPACK_SWAP_BYTES, !swap);
+ }
+#endif /* REFORMAT_IMAGE_DATA */
+
+ XFreePixmap (dpy, dd.pixmap);
+ dd.pixmap = 0;
+
+ if (debug_p)
+ tex_time = double_time();
+
+ if (! ximage)
+ ok = False;
+ else
+ {
+ iw = ximage->width;
+ ih = ximage->height;
+ if (dd.texid != -1)
+ glBindTexture (GL_TEXTURE_2D, dd.texid);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, ximage->bitmap_pad / 8);
+ ok = ximage_to_texture (ximage, type, format, &tw, &th, geometry,
+ dd.mipmap_p);
+ if (ok)
+ {
+ iw = ximage->width; /* in case the image was shrunk */
+ ih = ximage->height;
+ }
+ }
+
+ if (ximage) XDestroyImage (ximage);
+
+ if (! ok)
+ iw = ih = tw = th = 0;
+
+ if (debug_p)
+ done_time = double_time();
+
+ if (debug_p)
+ fprintf (stderr,
+ /* prints: A + B + C = D
+ A = file I/O time (happens in background)
+ B = time to pull bits from server (this process)
+ C = time to convert bits to GL textures (this process)
+ D = total elapsed time from "want image" to "see image"
+
+ B+C is responsible for any frame-rate glitches.
+ */
+ "%s: loading elapsed: %.2f + %.2f + %.2f = %.2f sec\n",
+ progname,
+ cvt_time - dd.load_time,
+ tex_time - cvt_time,
+ done_time - tex_time,
+ done_time - dd.load_time);
+
+ if (dd.callback)
+ /* asynchronous mode */
+ dd.callback (name, geometry, iw, ih, tw, th, dd.closure);
+ else
+ {
+ /* synchronous mode */
+ if (dd.filename_return) *dd.filename_return = (char *) name;
+ if (dd.geometry_return) *dd.geometry_return = *geometry;
+ if (dd.image_width_return) *dd.image_width_return = iw;
+ if (dd.image_height_return) *dd.image_height_return = ih;
+ if (dd.texture_width_return) *dd.texture_width_return = tw;
+ if (dd.texture_height_return) *dd.texture_height_return = th;
+ }
+}
diff --git a/hacks/glx/grab-ximage.h b/hacks/glx/grab-ximage.h
new file mode 100644
index 0000000..2fd589f
--- /dev/null
+++ b/hacks/glx/grab-ximage.h
@@ -0,0 +1,76 @@
+/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
+ * xscreensaver, Copyright (c) 2001-2006 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __GRAB_XIMAGE_H__
+#define __GRAB_XIMAGE_H__
+
+/* Grabs an image of the desktop (or another random image file) and
+ loads the image into GL's texture memory. Most of the work is done
+ in the background; when the image has been loaded, a callback is run.
+
+ As a side-effect, that image *may* be painted onto the given Window.
+
+ If mipmap_p is true, then make mipmaps instead of just a single texture.
+
+ If desired_width/height are non-zero, then (if possible) the image
+ will be scaled to fit in that rectangle. If they are 0, then the size
+ of the window is used. These parameters are so that you can hint to
+ the image loader that smaller images are acceptable (if you will never
+ be displaying the texture at 100% magnification, you can get away with
+ smaller textures.)
+
+ Returns the sizes of various things:
+
+ texture_width/height: The size of the texture itself, in pixels.
+ This will often be larger than the grabbed
+ image, since OpenGL sometimes requires texture
+ dimensions to be a power of 2.
+
+ image_width/height: The size of the image: this will usually be the
+ same as the desired_width/height you passed in
+ (but may be the size of the Window instead.)
+
+ geometry: The position in the texture of the image bits.
+ When image files are loaded, they are scaled up
+ to the size of the window, but if the image does
+ not have the same aspect ratio as the window,
+ there will be black bars on the top/bottom or
+ left/right. This geometry specification tells
+ you where the "real" image bits are.
+
+ So, don't use texture coordinates from 0.0 to 1.0. Instead use:
+
+ [0.0 - iw/tw] If you want to display a quad that is the same
+ [0.0 - ih/th] size as the window; or
+
+ [gx/tw - (gx+gw)/tw] If you want to display a quad that is the same
+ [gy/th - (gy+gh)/th] size as the loaded image file.
+
+ When the callback is called, the image data will have been loaded
+ into texture number `texid' (via glBindTexture.)
+
+ If an error occurred, width/height will be 0.
+ */
+void load_texture_async (Screen *, Window, GLXContext,
+ int desired_width, int desired_height,
+ Bool mipmap_p,
+ GLuint texid,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure);
+
+#endif /* __GRAB_XIMAGE_H__ */
diff --git a/hacks/glx/hexstrut.c b/hacks/glx/hexstrut.c
new file mode 100644
index 0000000..a547a76
--- /dev/null
+++ b/hacks/glx/hexstrut.c
@@ -0,0 +1,509 @@
+/* hexstrut, Copyright (c) 2016-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*count: 20 \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_hexstrut 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.2"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+typedef struct triangle triangle;
+struct triangle {
+ XYZ p[3];
+ triangle *next;
+ triangle *neighbors[6];
+ GLfloat orot, rot;
+ int delay, odelay;
+ int ccolor;
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int count;
+ triangle *triangles;
+
+ int ncolors;
+ XColor *colors;
+
+} hexstrut_configuration;
+
+static hexstrut_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static GLfloat thickness;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt hexstrut_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Add t1 to the neighbor list of t0. */
+static void
+link_neighbor (triangle *t0, triangle *t1)
+{
+ int k;
+ if (t0 == t1)
+ return;
+ for (k = 0; k < countof(t0->neighbors); k++)
+ {
+ if (t0->neighbors[k] == t1 ||
+ t0->neighbors[k] == 0)
+ {
+ t0->neighbors[k] = t1;
+ return;
+ }
+ }
+ fprintf (stderr, "too many neighbors\n");
+ abort();
+}
+
+
+static void
+make_plane (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ int n = MI_COUNT(mi) * 2;
+ GLfloat size = 2.0 / n;
+ int x, y;
+ GLfloat w = size;
+ GLfloat h = size * sqrt(3) / 2;
+ triangle **grid = (triangle **) calloc (n * n, sizeof(*grid));
+
+ for (y = 0; y < n; y++)
+ for (x = 0; x < n; x++)
+ {
+ triangle *t;
+
+ t = (triangle *) calloc (1, sizeof(*t));
+ t->p[0].x = (x - n/2) * w;
+ t->p[0].y = (y - n/2) * h;
+
+ if (y & 1)
+ t->p[0].x += w / 2;
+
+ t->p[1].x = t->p[0].x - w/2;
+ t->p[2].x = t->p[0].x + w/2;
+ t->p[1].y = t->p[0].y + h;
+ t->p[2].y = t->p[0].y + h;
+
+ if (x > 0)
+ {
+ triangle *t2 = grid[y * n + (x-1)];
+ link_neighbor (t, t2);
+ link_neighbor (t2, t);
+ }
+ if (y > 0)
+ {
+ triangle *t2 = grid[(y-1) * n + x];
+ link_neighbor (t, t2);
+ link_neighbor (t2, t);
+
+ if (x < n-1)
+ {
+ t2 = grid[(y-1) * n + (x+1)];
+ link_neighbor (t, t2);
+ link_neighbor (t2, t);
+ }
+ }
+
+ t->next = bp->triangles;
+ bp->triangles = t;
+ grid[y * n + x] = t;
+ bp->count++;
+ }
+
+ free (grid);
+}
+
+
+static void
+tick_triangles (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ triangle *t;
+ GLfloat step = 0.01 + (0.04 * speed);
+
+ if (! (random() % 80))
+ {
+ int n = random() % bp->count;
+ int i;
+ for (i = 0, t = bp->triangles; t && i < n; t = t->next, i++)
+ ;
+ if (! t->rot)
+ {
+ t->rot += step * ((random() & 1) ? 1 : -1);
+ t->odelay = t->delay = 4;
+ }
+ }
+
+ for (t = bp->triangles; t; t = t->next)
+ {
+ /* If this triangle is rotating, continue until done. */
+ if (t->rot)
+ {
+ t->rot += step * (t->rot > 0 ? 1 : -1);
+
+ t->ccolor++;
+ if (t->ccolor >= bp->ncolors)
+ t->ccolor = 0;
+
+ if (t->rot > 1 || t->rot < -1)
+ {
+ t->orot += (t->rot > 1 ? 1 : -1);
+ t->rot = 0;
+ }
+ }
+
+ /* If this triangle's propagation delay hasn't hit zero, decrement it.
+ When it does, start its neighbors rotating.
+ */
+ if (t->delay)
+ {
+ int i;
+ t->delay--;
+ if (t->delay == 0)
+ for (i = 0; i < countof(t->neighbors); i++)
+ {
+ if (t->neighbors[i] &&
+ t->neighbors[i]->rot == 0)
+ {
+ t->neighbors[i]->rot += step * (t->rot > 0 ? 1 : -1);
+ t->neighbors[i]->delay =
+ t->neighbors[i]->odelay = t->odelay;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+draw_triangles (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ triangle *t;
+ GLfloat length = sqrt(3) / 3;
+ GLfloat t2 = length * thickness / 2;
+ GLfloat scale;
+
+ {
+ triangle *t = bp->triangles;
+ GLfloat X = t->p[0].x - t->p[1].x;
+ GLfloat Y = t->p[0].y - t->p[1].y;
+ GLfloat Z = t->p[0].z - t->p[1].z;
+ scale = sqrt(X*X + Y*Y + Z*Z);
+ }
+
+ glFrontFace (GL_CCW);
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+
+ glNormal3f (0, 0, 1);
+ for (t = bp->triangles; t; t = t->next)
+ {
+ int i;
+ XYZ c;
+ GLfloat color[4];
+
+ GLfloat angle = (M_PI * 2 / 3) * t->rot;
+ GLfloat cr = cos(angle), sr = sin(angle);
+
+ c.x = (t->p[0].x + t->p[1].x + t->p[2].x) / 3;
+ c.y = (t->p[0].y + t->p[1].y + t->p[2].y) / 3;
+ c.z = (t->p[0].z + t->p[1].z + t->p[2].z) / 3;
+
+ /* Actually we don't need normals at all, since no lighting.
+ do_normal (t->p[0].x, t->p[0].y, t->p[0].z,
+ t->p[1].x, t->p[1].y, t->p[1].z,
+ t->p[2].x, t->p[2].y, t->p[2].z);
+ */
+
+ color[0] = bp->colors[t->ccolor].red / 65535.0;
+ color[1] = bp->colors[t->ccolor].green / 65535.0;
+ color[2] = bp->colors[t->ccolor].blue / 65535.0;
+ color[3] = 1;
+
+ /* Brighter */
+ color[0] = color[0] * 0.75 + 0.25;
+ color[1] = color[1] * 0.75 + 0.25;
+ color[2] = color[2] * 0.75 + 0.25;
+
+ glColor4fv (color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ for (i = 0; i < 3; i++)
+ {
+ /* Orient to direction of corner. */
+ GLfloat x = t->p[i].x - c.x;
+ GLfloat y = t->p[i].y - c.y;
+ GLfloat z = t->p[i].z - c.z;
+
+ GLfloat smc = sr * y - cr * x;
+ GLfloat spc = cr * y + sr * x;
+
+ GLfloat st2 = t2 * scale / sqrt(x*x + y*y);
+ GLfloat slength = length * scale / sqrt(x*x + y*y + z*z);
+
+ GLfloat xt2 = spc * st2;
+ GLfloat yt2 = smc * st2;
+ GLfloat xlength = c.x - slength * smc;
+ GLfloat ylength = c.y + slength * spc;
+ GLfloat zlength = c.z + slength * z;
+
+ if (! wire)
+ glVertex3f (c.x - xt2, c.y - yt2, c.z);
+
+ glVertex3f (c.x + xt2, c.y + yt2, c.z);
+ if (wire)
+ glVertex3f (xlength + xt2, ylength + yt2, zlength);
+
+ if (! wire)
+ glVertex3f (xlength + xt2, ylength + yt2, zlength);
+
+ glVertex3f (xlength - xt2, ylength - yt2, zlength);
+
+ if (wire)
+ glVertex3f (c.x - xt2, c.y - yt2, c.z);
+
+ mi->polygon_count++;
+ }
+ }
+
+ glEnd();
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hexstrut (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 3) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+hexstrut_handle_event (ModeInfo *mi, XEvent *event)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ bp->ncolors = 64;
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_hexstrut (ModeInfo *mi)
+{
+ hexstrut_configuration *bp;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hexstrut (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ {
+ double spin_speed = 0.002;
+ double wander_speed = 0.003;
+ double spin_accel = 1.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+
+ /* Let's tilt the scene a little. */
+ gltrackball_reset (bp->trackball,
+ -0.4 + frand(0.8),
+ -0.4 + frand(0.8));
+
+ if (thickness < 0.05) thickness = 0.05;
+ if (thickness < 0.05) MI_IS_WIREFRAME(mi) = True;
+ if (thickness > 1.7) thickness = 1.7;
+ if (speed > 2) speed = 2;
+
+ bp->ncolors = 64;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ make_plane (mi);
+}
+
+
+ENTRYPOINT void
+draw_hexstrut (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glDisable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 6,
+ (y - 0.5) * 6,
+ (z - 0.5) * 12);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (30, 30, 30);
+
+ if (! bp->button_down_p)
+ tick_triangles (mi);
+ draw_triangles (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_hexstrut (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ while (bp->triangles)
+ {
+ triangle *t = bp->triangles->next;
+ free (bp->triangles);
+ bp->triangles = t;
+ }
+}
+
+XSCREENSAVER_MODULE ("Hexstrut", hexstrut)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hexstrut.man b/hacks/glx/hexstrut.man
new file mode 100644
index 0000000..19e49e0
--- /dev/null
+++ b/hacks/glx/hexstrut.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hexstrut - a grid of hexagons composed of rotating Y-shaped struts.
+.SH SYNOPSIS
+.B hexstrut
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+A grid of hexagons composed of rotating Y-shaped struts.
+Waves of rotation and color changes randomly propagate across the plane.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Approximate number of hexagons on the screen, horizontally. Default: 20.
+.TP 8
+.B \-thickness \fInumber\fP
+Relative thickness of the struts. 0.01 - 1.7. Default: 0.2.
+.TP 8
+.B \-wander | \-no-wander
+Whether the grid should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the grid should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/hilbert.c b/hacks/glx/hilbert.c
new file mode 100644
index 0000000..dbb2ce6
--- /dev/null
+++ b/hacks/glx/hilbert.c
@@ -0,0 +1,1144 @@
+/* hilbert, Copyright (c) 2011-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * 2D and 3D Hilbert space-filling curves.
+ *
+ * Inspired by "Visualizing Hilbert Curves" by Nelson Max, 1998:
+ * https://e-reports-ext.llnl.gov/pdf/234149.pdf
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*geometry: 800x800\n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_hilbert 0
+# define release_hilbert 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "False"
+#define DEF_SPEED "1.0"
+#define DEF_MODE "random"
+#define DEF_ENDS "random"
+#define DEF_MAX_DEPTH "5"
+#define DEF_THICKNESS "0.25"
+
+#define PAUSE_TICKS 180
+
+typedef struct {
+ double x,y,z;
+} XYZ;
+
+typedef struct {
+ unsigned short x,y,z;
+} XYZb;
+
+typedef struct {
+ int size;
+ XYZb *values; /* assume max depth of 20 (2^16 on each side) */
+} hilbert_cache;
+
+
+static int dlist_faces[] = { 20, 10, 8, 4, 3 };
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool twodee_p;
+ Bool closed_p;
+ int ncolors;
+ XColor *colors;
+
+ int depth;
+ int depth_tick;
+
+ GLfloat path_start, path_end;
+ int path_tick;
+ int pause;
+ GLfloat diam;
+
+ hilbert_cache **caches; /* filled lazily */
+
+ GLuint dlists [40][2]; /* we don't actually alloc all of these */
+ int dlist_polys [40][2];
+
+} hilbert_configuration;
+
+static hilbert_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static char *mode_str;
+static char *ends_str;
+static int max_depth;
+static GLfloat thickness;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-2d", ".mode", XrmoptionNoArg, "2D" },
+ { "-3d", ".mode", XrmoptionNoArg, "3D" },
+ { "-ends", ".ends", XrmoptionSepArg, 0 },
+ { "-closed", ".ends", XrmoptionNoArg, "closed" },
+ { "-open", ".ends", XrmoptionNoArg, "open" },
+ { "-max-depth", ".maxDepth", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&mode_str, "mode", "Mode", DEF_MODE, t_String},
+ {&ends_str, "ends", "Ends", DEF_ENDS, t_String},
+ {&max_depth, "maxDepth", "MaxDepth", DEF_MAX_DEPTH, t_Int},
+ {&thickness, "thickness","Thickness",DEF_THICKNESS, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt hilbert_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* 2D Hilbert, and closed-loop variant.
+ */
+
+/* These arrays specify which bits of the T index contribute to the
+ X, Y and Z values. Higher order bits are defined recursively.
+ */
+static const int xbit2d[4] = { 0, 0, 1, 1 };
+static const int ybit2d[4] = { 0, 1, 1, 0 };
+
+static const int xbit3d[8] = { 0,0,0,0,1,1,1,1 };
+static const int ybit3d[8] = { 0,1,1,0,0,1,1,0 };
+static const int zbit3d[8] = { 0,0,1,1,1,1,0,0 };
+
+/* These matrixes encapsulate the necessary reflection and translation
+ of each 4 sub-squares or 8 sub-cubes. The r2d and r3d arrays are
+ the normal Hilbert descent, and the s2d and s3d arrays are the
+ modified curve used for only level 0 of a closed-form path.
+ */
+
+static int r2d[4][2][2] = {
+ /* _ _
+ | |..| |
+ :_ _:
+ _| |_
+
+ */
+ {{ 0, 1},
+ { 1, 0}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{ 0,-1},
+ {-1, 0}},
+};
+
+static int s2d[4][2][2] = {
+ /* __ __
+ | |..| | Used for outermost iteration only, in "closed" mode
+ : .. :
+ |__| |__|
+
+ */
+ {{-1, 0},
+ { 0,-1}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{-1, 0},
+ { 0,-1}},
+};
+
+
+static int r3d[8][3][3] = {
+ /*
+ /| /|
+ / | / |
+ /__|____/ |
+ | |
+ / /
+ / /
+ */
+ {{ 0, 1, 0},
+ { 1, 0, 0},
+ { 0, 0, 1}},
+ {{ 0, 0, 1},
+ { 0, 1, 0},
+ { 1, 0, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ {-1, 0, 0},
+ { 0, 1, 0}},
+ {{ 0, 0, 1},
+ { 1, 0, 0},
+ { 0, 1, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ { 0, 1, 0},
+ {-1, 0, 0}},
+ {{ 0,-1, 0},
+ {-1, 0, 0},
+ { 0, 0, 1}},
+};
+
+
+static int s3d[8][3][3] = {
+ /*
+ /| /| Used for outermost iteration only, in "closed" mode
+ / | / |
+ /__|____/ |
+ | |
+ / /
+ /_______/
+ */
+ {{-1, 0, 0},
+ { 0, 0,-1},
+ { 0, 1, 0}},
+ {{ 0, 0, 1},
+ { 0, 1, 0},
+ { 1, 0, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ {-1, 0, 0},
+ { 0, 1, 0}},
+ {{ 0, 0, 1},
+ { 1, 0, 0},
+ { 0, 1, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ { 0, 1, 0},
+ {-1, 0, 0}},
+
+ {{-1, 0, 0},
+ { 0, 0,-1},
+ { 0, 1, 0}},
+};
+
+
+
+/* Matrix utilities
+ */
+
+static void
+matrix_times_vector2d (int m[2][2], int v[2], int dest[2])
+{
+ dest[0] = m[0][0]*v[0] + m[0][1]*v[1];
+ dest[1] = m[1][0]*v[0] + m[1][1]*v[1];
+}
+
+static void
+matrix_times_vector3d (int m[3][3], int v[3], int dest[3])
+{
+ dest[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
+ dest[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
+ dest[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
+}
+
+
+static void
+matrix_multiply2d (int m1[2][2], int m2[2][2], int dest[2][2])
+{
+ dest[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0];
+ dest[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1];
+ dest[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0];
+ dest[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1];
+}
+
+static void
+matrix_multiply3d (int m1[3][3], int m2[3][3], int dest[3][3])
+{
+ int i, j, k;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < 3; j++)
+ {
+ dest[i][j] = 0;
+ for (k = 0; k < 3; k++)
+ dest[i][j] += m1[i][k] * m2[k][j];
+ }
+}
+
+static void
+identity_matrix2d (int m[2][2])
+{
+ m[0][0] = m[1][1] = 1;
+ m[0][1] = m[1][0] = 0;
+}
+
+static void
+identity_matrix3d (int m[3][3])
+{
+ m[0][0] = m[1][1] = m[2][2] = 1;
+ m[0][1] = m[0][2] = m[1][0] = m[1][2] = m[2][0] = m[2][1] = 0;
+}
+
+
+static void
+matrix_copy2d (int src[2][2], int dest[2][2])
+{
+ int i, j;
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ dest[i][j] = src[i][j];
+}
+
+
+static void
+matrix_copy3d (int src[3][3], int dest[3][3])
+{
+ int i, j;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < 3; j++)
+ dest[i][j] = src[i][j];
+}
+
+
+/* 2D and 3D Hilbert:
+ Given an index T along the curve, return the XY or XYZ coordinates.
+ N is depth of the curve.
+ */
+
+static void
+t_to_xy (int n, int t, int *x, int *y, Bool closed_p)
+{
+ int k, rt[2][2], rq[2][2], va[2], vb[2];
+ identity_matrix2d(rt);
+ *x = *y = 0;
+
+ for (k = n-1; k >= 0; k--)
+ {
+ int j = 3 & (t >> (2*k));
+ va[0] = 2 * xbit2d[j] - 1;
+ va[1] = 2 * ybit2d[j] - 1;
+ matrix_times_vector2d (rt, va, vb);
+ *x += ((vb[0] + 1) / 2) << k;
+ *y += ((vb[1] + 1) / 2) << k;
+ if (k > 0)
+ {
+ matrix_copy2d (rt, rq);
+ if (k == n-1 && closed_p)
+ matrix_multiply2d (rq, s2d[j], rt);
+ else
+ matrix_multiply2d (rq, r2d[j], rt);
+ }
+ }
+}
+
+
+static void
+t_to_xyz (int n, int t, int *x, int *y, int *z, Bool closed_p)
+{
+ int k, rt[3][3], rq[3][3], va[3], vb[3];
+ identity_matrix3d(rt);
+ *x = *y = *z = 0;
+
+ for (k = n-1; k >= 0; k--)
+ {
+ int j = 7 & (t >> (3*k));
+ va[0] = 2 * xbit3d[j] - 1;
+ va[1] = 2 * ybit3d[j] - 1;
+ va[2] = 2 * zbit3d[j] - 1;
+ matrix_times_vector3d (rt, va, vb);
+ *x += ((vb[0] + 1) / 2) << k;
+ *y += ((vb[1] + 1) / 2) << k;
+ *z += ((vb[2] + 1) / 2) << k;
+ if (k > 0)
+ {
+ matrix_copy3d (rt, rq);
+ if (k == n-1 && closed_p)
+ matrix_multiply3d (rq, s3d[j], rt);
+ else
+ matrix_multiply3d (rq, r3d[j], rt);
+ }
+ }
+}
+
+
+/* Rendering the curve
+ */
+
+
+/* Draw a sphere at the intersection of two tubes, to round off
+ the connection between them. Use one of our cache display lists
+ of unit spheres in various sizes.
+ */
+static int
+draw_joint (ModeInfo *mi, XYZ p, GLfloat diam, int faces, int wire)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ diam *= 0.99; /* try to clean up the edges a bit */
+
+ if (faces <= 4) return 0; /* too small to see */
+
+ glPushMatrix();
+ glTranslatef (p.x, p.y, p.z);
+ glScalef (diam, diam, diam);
+
+ /* i = unit_sphere (faces, faces, wire);*/
+
+ /* if (!bp->dlists[faces][0]) abort(); */
+ /* if (!bp->dlist_polys[faces][0]) abort(); */
+
+ glCallList (bp->dlists[faces][0]);
+ i = bp->dlist_polys[faces][0];
+ glPopMatrix();
+ return i;
+}
+
+
+/* Draw a tube, and associated end caps. Use one of our cache display lists
+ of unit tubes in various sizes. Pick the resolution of the tube based
+ on how large it's being drawn. It's ok to get chunkier if the thing is
+ only a few pixels wide on the screen.
+ */
+static Bool
+draw_segment (ModeInfo *mi,
+ XYZ p0, XYZ p1, /* from, to */
+ int t, int end_t, /* value and range */
+ GLfloat path_start, GLfloat path_end, /* clipping */
+ Bool head_cap_p,
+ int *last_colorP)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ double t0 = (double) (t-1) / end_t; /* ratio of p[01] along curve */
+ double t1 = (double) t / end_t;
+
+ int wire = MI_IS_WIREFRAME(mi);
+ int owire = wire;
+ GLfloat dd = bp->diam;
+ int faces;
+
+ if (path_start >= t1) /* whole segment is before clipping region */
+ return False;
+ if (path_end < t0) /* whole segment is after clipping region */
+ return False;
+
+
+ if (bp->twodee_p) dd *= 2; /* more polys in 2D mode */
+
+ faces = (dd > 0.040 ? dlist_faces[0] :
+ dd > 0.020 ? dlist_faces[1] :
+ dd > 0.010 ? dlist_faces[2] :
+ dd > 0.005 ? dlist_faces[3] :
+ dd > 0.002 ? dlist_faces[4] :
+ 1);
+
+ /* In 2d mode, we can drop into wireframe mode and it still looks ok... */
+ if (faces == 1)
+ {
+ if (bp->twodee_p)
+ wire = True;
+ else
+ faces = 3;
+ }
+
+ if (wire && !owire)
+ {
+ glDisable (GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_LIGHTING);
+ }
+
+ if (t0 < path_start)
+ {
+ XYZ p;
+ GLfloat seg_range = t1 - t0;
+ GLfloat clip_range = path_start - t0;
+ GLfloat ratio = clip_range / seg_range;
+ p.x = p0.x + ((p1.x - p0.x) * ratio);
+ p.y = p0.y + ((p1.y - p0.y) * ratio);
+ p.z = p0.z + ((p1.z - p0.z) * ratio);
+ p0 = p;
+ }
+
+ if (t1 > path_end)
+ {
+ XYZ p;
+ GLfloat seg_range = t1 - t0;
+ GLfloat clip_range = path_end - t0;
+ GLfloat ratio = clip_range / seg_range;
+ p.x = p0.x + ((p1.x - p0.x) * ratio);
+ p.y = p0.y + ((p1.y - p0.y) * ratio);
+ p.z = p0.z + ((p1.z - p0.z) * ratio);
+ p1 = p;
+ }
+
+ if (p0.x == p1.x &&
+ p0.y == p1.y &&
+ p0.z == p1.z)
+ return False;
+
+ {
+ int segs = bp->ncolors * (t1 - t0);
+ int i;
+ XYZ p0b, p1b;
+
+ if (segs < 1) segs = 1;
+
+ for (i = 0; i < segs; i++)
+ {
+ int j = i + 1;
+ GLfloat color[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat t0b;
+ int c;
+
+ p0b.x = p0.x + i * ((p1.x - p0.x) / segs);
+ p0b.y = p0.y + i * ((p1.y - p0.y) / segs);
+ p0b.z = p0.z + i * ((p1.z - p0.z) / segs);
+
+ p1b.x = p0.x + j * ((p1.x - p0.x) / segs);
+ p1b.y = p0.y + j * ((p1.y - p0.y) / segs);
+ p1b.z = p0.z + j * ((p1.z - p0.z) / segs);
+
+
+
+ /* #### this isn't quite right */
+ t0b = t0 + i * (t1 - t0) / segs;
+
+ c = bp->ncolors * t0b;
+ if (c >= bp->ncolors) c = bp->ncolors-1;
+
+ /* Above depth 6, was spending 5% of the time in glMateralfv,
+ so only set the color if it's different. */
+
+ if (c != *last_colorP)
+ {
+ color[0] = bp->colors[c].red / 65536.0;
+ color[1] = bp->colors[c].green / 65536.0;
+ color[2] = bp->colors[c].blue / 65536.0;
+ if (wire)
+ glColor3fv (color);
+ else
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ *last_colorP = c;
+ }
+
+
+ if (wire)
+ {
+ glBegin (GL_LINES);
+ glVertex3f (p0b.x, p0b.y, p0b.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glEnd ();
+ mi->polygon_count++;
+ }
+ else
+ {
+ /* mi->polygon_count += tube (p0b.x, p0b.y, p0b.z,
+ p1b.x, p1b.y, p1b.z,
+ bp->diam, 0, faces, True,
+ 0, wire);
+ */
+
+ /* Render a rotated and scaled prefab unit tube.
+
+ There's probably a slightly more concise way to do this,
+ but since they're all at right angles at least we don't
+ have to use atan().
+ */
+ GLfloat s;
+ glPushMatrix();
+ glTranslatef (p0b.x, p0b.y, p0b.z);
+
+ if (p1b.x > p0b.x)
+ {
+ s = p1b.x - p0b.x;
+ }
+ else if (p1b.x < p0b.x)
+ {
+ glRotatef (180, 0, 0, 1);
+ s = p0b.x - p1b.x;
+ }
+ else if (p1b.y > p0b.y) {
+ glRotatef (90, 0, 0, 1);
+ s = p1b.y - p0b.y;
+ }
+ else if (p1b.y < p0b.y)
+ {
+ glRotatef (-90, 0, 0, 1);
+ s = p0b.y - p1b.y;
+ }
+ else if (p1b.z > p0b.z)
+ {
+ glRotatef (-90, 0, 1, 0);
+ s = p1b.z - p0b.z;
+ }
+ else /* (p1b.z < p0b.z) */
+ {
+ glRotatef (90, 0, 1, 0);
+ s = p0b.z - p1b.z;
+ }
+
+ glScalef (s, bp->diam, bp->diam);
+ glCallList (bp->dlists[faces][1]);
+ mi->polygon_count += bp->dlist_polys[faces][1];
+ glPopMatrix();
+
+
+ /* If this is the bleeding edge, cap it too. */
+ if (head_cap_p) {
+ mi->polygon_count += draw_joint (mi, p0b, bp->diam, faces, wire);
+ head_cap_p = False;
+ }
+ }
+ }
+
+ /* If the path is closed, close it. This segment doesn't animate
+ like the others, but, oh well.
+ */
+ if (! wire)
+ mi->polygon_count += draw_joint (mi, p1b, bp->diam, faces, wire);
+ }
+
+ return True;
+}
+
+
+static void
+mem(void)
+{
+ fprintf (stderr, "%s: out of memory\n", progname);
+ exit (1);
+}
+
+
+/* Render the whole thing, but omit segments that lie outside of
+ the path_start and path_end ratios.
+ */
+static void
+hilbert (ModeInfo *mi, int size, GLfloat path_start, GLfloat path_end)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat w = pow(2, size);
+ int end_t = (bp->twodee_p ? w * w : w * w * w);
+
+ XYZ prev = { 0, };
+ XYZ first = { 0, };
+ Bool first_p = False;
+ Bool any_p = False;
+ int t;
+ Bool fill_cache_p = False;
+ hilbert_cache *cc;
+ int last_color = -1;
+
+ /* Do this here since at higher resolutions, we turn wireframe on
+ and off. */
+
+ if (! wire)
+ {
+ glEnable (GL_NORMALIZE);
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ }
+
+
+ if (!bp->caches)
+ {
+ bp->caches = (hilbert_cache **)
+ calloc (max_depth + 2, sizeof (*bp->caches));
+ if (!bp->caches) mem();
+ fill_cache_p = True;
+ }
+
+ cc = bp->caches[size];
+ if (! cc)
+ {
+ cc = (hilbert_cache *) calloc (1, sizeof (*cc));
+ cc->values = (XYZb *) calloc (end_t + 1, sizeof (*cc->values));
+ if (!cc->values) mem();
+ cc->size = end_t;
+ bp->caches[size] = cc;
+ fill_cache_p = True;
+ }
+
+ for (t = 0; t < end_t; t++)
+ {
+ int x, y, z;
+ XYZ c;
+ XYZb *cb;
+
+ if (!fill_cache_p)
+ {
+ cb = &cc->values[t];
+ x = cb->x;
+ y = cb->y;
+ z = cb->z;
+ }
+ else
+ {
+ if (!bp->twodee_p)
+ t_to_xyz (size, t, &x, &y, &z, bp->closed_p);
+ else
+ {
+ t_to_xy (size, t, &x, &y, bp->closed_p);
+ z = w/2;
+ }
+ cb = &cc->values[t];
+ cb->x = x;
+ cb->y = y;
+ cb->z = z;
+ }
+
+ c.x = (GLfloat) x / w - 0.5;
+ c.y = (GLfloat) y / w - 0.5;
+ c.z = (GLfloat) z / w - 0.5;
+
+ /* #### We could save some polygons by not drawing the spheres
+ between colinear segments. */
+
+ if (t > 0) {
+ if (draw_segment (mi, prev, c, t, end_t, path_start, path_end, !any_p,
+ &last_color))
+ any_p = True;
+ }
+ prev = c;
+ if (! first_p) {
+ first = c;
+ first_p = True;
+ }
+ }
+
+ if (bp->closed_p && path_end >= 1.0) {
+ draw_segment (mi, prev, first, t, end_t, path_start, path_end, !any_p,
+ &last_color);
+ }
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hilbert (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+hilbert_handle_event (ModeInfo *mi, XEvent *event)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '+' || c == '=' ||
+ keysym == XK_Up || keysym == XK_Right || keysym == XK_Next)
+ {
+ bp->depth++;
+ if (bp->depth > max_depth) bp->depth = max_depth;
+ return True;
+ }
+ else if (c == '-' || c == '_' ||
+ keysym == XK_Down || keysym == XK_Left || keysym == XK_Prior)
+ {
+ bp->depth--;
+ if (bp->depth < 1) bp->depth = 1;
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ bp->depth += bp->depth_tick;
+ if (bp->depth > max_depth-1)
+ {
+ bp->depth = max_depth;
+ bp->depth_tick = -1;
+ }
+ else if (bp->depth <= 1)
+ {
+ bp->depth = 1;
+ bp->depth_tick = 1;
+ }
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_hilbert (ModeInfo *mi)
+{
+ hilbert_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->depth = 2;
+ bp->depth_tick = 1;
+ bp->path_start = 0.0;
+ bp->path_end = 0.0;
+ bp->path_tick = 1;
+
+ if (thickness < 0.01) thickness = 0.01;
+ if (thickness > 1.0) thickness = 1.0;
+
+ if (speed <= 0) speed = 0.0001;
+ if (max_depth < 2) max_depth = 2;
+ if (max_depth > 20) max_depth = 20; /* hard limit due to hilbert_cache */
+
+ if (bp->depth > max_depth-1) bp->depth = max_depth-1;
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hilbert (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ double spin_speed = 0.04;
+ double tilt_speed = spin_speed / 10;
+ double wander_speed = 0.008;
+ double spin_accel = 0.01;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ do_spin);
+ bp->rot2 = make_rotator (0, 0, 0, 0, tilt_speed, True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (mode_str && !strcasecmp(mode_str, "2d"))
+ bp->twodee_p = True;
+ else if (mode_str && (!strcasecmp(mode_str, "3d")))
+ bp->twodee_p = False;
+ else
+ {
+ if (! (mode_str && !strcasecmp(mode_str, "random")))
+ fprintf (stderr, "%s: 'mode' must be '2d', '3d', or 'random'\n",
+ progname);
+ bp->twodee_p = ((random() % 3) == 0);
+ }
+
+
+ if (ends_str && (!strcasecmp(ends_str, "closed")))
+ bp->closed_p = True;
+ else if (ends_str && (!strcasecmp(ends_str, "open")))
+ bp->closed_p = False;
+ else
+ {
+ if (! (ends_str && !strcasecmp(ends_str, "random")))
+ fprintf (stderr, "%s: 'ends' must be 'open', 'closed', or 'random'\n",
+ progname);
+ bp->closed_p = ((random() % 3) != 0);
+ }
+
+
+ /* More colors results in more polygons (more tube segments) so keeping
+ this small is worthwhile. */
+ bp->ncolors = (bp->twodee_p ? 1024 : 128);
+
+ if (bp->closed_p)
+ {
+ /* Since the path is closed, colors must also be a closed loop */
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ }
+ else
+ {
+ /* Since the path is open, first and last colors should differ. */
+ bp->ncolors *= 2;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_uniform_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ bp->ncolors /= 2;
+ }
+
+ /* Generate display lists for several different resolutions of
+ a unit tube and a unit sphere.
+ */
+ for (i = 0; i < countof(dlist_faces); i++)
+ {
+ int faces = dlist_faces[i];
+ bp->dlists[faces][0] = glGenLists (1);
+
+ glNewList (bp->dlists[faces][0], GL_COMPILE);
+ bp->dlist_polys[faces][0] = unit_sphere (faces, faces, wire);
+ glEndList ();
+
+ bp->dlists[faces][1] = glGenLists (1);
+
+ glNewList (bp->dlists[faces][1], GL_COMPILE);
+ bp->dlist_polys[faces][1] =
+ tube (0, 0, 0, 1, 0, 0,
+ 1, 0, faces, True, 0, wire);
+ glEndList ();
+ }
+}
+
+
+ENTRYPOINT void
+draw_hilbert (ModeInfo *mi)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+ GLfloat bcolor[4] = {1.0, 1.0, 1.0, 1.0};
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ if (! wire)
+ {
+ glEnable (GL_NORMALIZE);
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z, z2;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+ if (bp->twodee_p && do_spin) /* face front */
+ {
+ double max = 70;
+ get_position (bp->rot2, &x, &y, &z2, !bp->button_down_p);
+ glRotatef (max/2 - x*max, 1, 0, 0);
+ glRotatef (max/2 - y*max, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1); /* but upside down is ok */
+ }
+ else
+ {
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ }
+ }
+
+ mi->polygon_count = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+
+ glScalef (8,8,8);
+ glTranslatef (0.1, 0.1, 0);
+
+ if (!do_spin && !bp->twodee_p)
+ {
+ /* tilt the cube a little, and make the start and end visible */
+ glTranslatef (-0.1, 0, 0);
+ glRotatef (140, 0, 1, 0);
+ glRotatef (30, 1, 0, 0);
+ }
+
+ if (wire)
+ glLineWidth (bp->depth > 4 ? 1.0 :
+ bp->depth > 3 ? 2.0 :
+ 3.0);
+
+ if (bp->path_tick > 0) /* advancing the end point, [0 - N) */
+ { /* drawing 1 partial path, 1st time only. */
+
+ if (!bp->button_down_p)
+ bp->path_end += 0.01 * speed;
+
+ if (bp->path_end >= 1.0)
+ {
+ bp->path_start = 0.0;
+ bp->path_end = 1.0;
+ bp->path_tick = -1;
+ bp->pause = PAUSE_TICKS;
+ }
+
+ bp->diam = thickness / pow (2, bp->depth);
+ hilbert (mi, bp->depth, bp->path_start, bp->path_end);
+ mi->recursion_depth = bp->depth + bp->path_start;
+ }
+
+ else /* advancing the start point, (N - 1] */
+ { /* drawing 2 paths at different rez. */
+ if (bp->pause)
+ {
+ bp->pause--;
+ }
+ else
+ {
+ if (!bp->button_down_p)
+ bp->path_start += 0.01 * speed;
+
+ if (bp->path_start > 1.0)
+ {
+ bp->path_start = 0.0;
+ bp->depth += bp->depth_tick;
+ bp->pause = PAUSE_TICKS;
+ if (bp->depth > max_depth-1)
+ {
+ bp->depth = max_depth;
+ bp->depth_tick = -1;
+ }
+ else if (bp->depth <= 1)
+ {
+ bp->depth = 1;
+ bp->depth_tick = 1;
+ }
+ }
+ }
+
+ {
+ GLfloat d1 = thickness / pow (2, bp->depth);
+ GLfloat d2 = thickness / pow (2, bp->depth + bp->depth_tick);
+ bp->diam = (d1 * (1 - bp->path_start) +
+ d2 * bp->path_start);
+ }
+
+ /* First time around, start is 0, and end animates forward.
+ Then, to display the next higher resolution, we render
+ depth=N while increasing start and leaving end=1.0;
+ and simultaneously animationg depth=N+1 with start=0 and
+ end increasing by the same amount.
+
+ The two paths aren't actually connected together at the
+ resolution-change interface, and sometimes they overlap,
+ but things go fast enough that it's hard to spot those
+ glitches, so it looks ok.
+ */
+ glPolygonOffset (0, 0);
+ hilbert (mi, bp->depth, bp->path_start, bp->path_end);
+
+ glPolygonOffset (1.0, 1.0);
+ hilbert (mi, bp->depth + bp->depth_tick, 0.0, bp->path_start);
+
+ mi->recursion_depth = bp->depth + (bp->depth_tick * bp->path_start);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Hilbert", hilbert)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hilbert.man b/hacks/glx/hilbert.man
new file mode 100644
index 0000000..8693dce
--- /dev/null
+++ b/hacks/glx/hilbert.man
@@ -0,0 +1,103 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hilbert - 3D Hilbert fractal.
+.SH SYNOPSIS
+.B hilbert
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-depth \fInumber\fP]
+[\-spin]
+[\-wander]
+[\-2d]
+[\-3d]
+[\-closed]
+[\-open]
+[\-max\-depth \fInumber\fP]
+[\-thickness \fIratio\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws the recursive Hilbert space-filling curve, in both 2D and
+3D variants. It incrementally animates the growth and recursion to
+the maximum depth, then unwinds it back.
+
+The Hilbert path is a single contiguous line that can fill a volume
+without crossing itself. As a data structure, Hilbert paths are
+useful because ordering along the curve preserves locality: points
+that close together along the curve are also close together in space.
+The converse is often, but not always, true. The coloration
+reflects this.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the animation should run.
+Less than 1 for slower, greater than 1 for faster.
+.TP 8
+.B \-max\-depth \fInumber\fP
+Max depth to descend. Default: 5, which peaks at around half a
+million polygons.
+.TP 8
+.B \-spin
+.B \-no\-spin
+Whether to rotate the object. Default: true.
+.TP 8
+.B \-wander
+.B \-no\-wander
+Whether to wander the object around on the screen. Default: false;
+.TP 8
+.B \-2d
+.B \-3d
+Whether to draw the 2D or 3D variant. Default: random.
+.TP 8
+.B \-closed
+.B \-open
+Whether to draw the open or closed-path variant. Default: random.
+.TP 8
+.B \-thickness \fIratio\fP
+How thick the lines should be. Default: 0.25.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2011 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/hydrostat.c b/hacks/glx/hydrostat.c
new file mode 100644
index 0000000..faf15a0
--- /dev/null
+++ b/hacks/glx/hydrostat.c
@@ -0,0 +1,809 @@
+/* hydrostat, Copyright (C) 2012 by Justin Windle
+ * Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Tentacle simulation using inverse kinematics.
+ *
+ * http://soulwire.co.uk/experiments/muscular-hydrostats/
+ * https://github.com/soulwire/Muscular-Hydrostats/
+ *
+ * Ported to C from Javascript by jwz, May 2016
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 3 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_hydrostat 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "normals.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+/* It looks bad when you rotate it with the trackball, because it reveals
+ that the tentacles are moving in a 2d plane. But it's useful for
+ debugging. */
+#undef USE_TRACKBALL
+
+#define DEF_SPEED "1.0"
+#define DEF_PULSE "True"
+#define DEF_HEAD_RADIUS "60"
+#define DEF_TENTACLES "35"
+#define DEF_THICKNESS "18"
+#define DEF_LENGTH "55"
+#define DEF_GRAVITY "0.5"
+#define DEF_CURRENT "0.25"
+#define DEF_FRICTION "0.02"
+#define DEF_OPACITY "0.8"
+
+
+#define TENTACLE_FACES 5
+
+typedef struct {
+ XYZ pos, opos, v;
+} node;
+
+typedef struct {
+ int length;
+ GLfloat radius;
+ GLfloat spacing;
+ GLfloat friction;
+ GLfloat th;
+ node *nodes;
+ GLfloat color[4];
+} tentacle;
+
+typedef struct {
+ XYZ pos, from, to;
+ GLfloat ratio, pulse, rate;
+ GLfloat head_radius;
+ GLfloat thickness;
+ int ntentacles;
+ tentacle *tentacles;
+ GLfloat color[4];
+} squid;
+
+typedef struct {
+ GLXContext *glx_context;
+ Bool button_down_p;
+ int dragging;
+ squid **squids;
+ GLfloat cos_sin_table[2 * (TENTACLE_FACES + 1)];
+ GLuint head;
+ int head_polys;
+# ifdef USE_TRACKBALL
+ trackball_state *trackball;
+# endif
+} hydrostat_configuration;
+
+static hydrostat_configuration *bps = NULL;
+
+static Bool do_pulse;
+static GLfloat speed_arg;
+static GLfloat head_radius_arg;
+static GLfloat ntentacles_arg;
+static GLfloat thickness_arg;
+static GLfloat length_arg;
+static GLfloat gravity_arg;
+static GLfloat current_arg;
+static GLfloat friction_arg;
+static GLfloat opacity_arg;
+
+static XrmOptionDescRec opts[] = {
+ { "-pulse", ".pulse", XrmoptionNoArg, "True" },
+ { "+pulse", ".pulse", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-head-radius", ".headRadius", XrmoptionSepArg, 0 },
+ { "-tentacles", ".tentacles", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-length", ".length", XrmoptionSepArg, 0 },
+ { "-gravity", ".gravity", XrmoptionSepArg, 0 },
+ { "-current", ".current", XrmoptionSepArg, 0 },
+ { "-friction", ".friction", XrmoptionSepArg, 0 },
+ { "-opacity", ".opacity", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ { &do_pulse, "pulse", "Pulse", DEF_PULSE, t_Bool },
+ { &speed_arg, "speed", "Speed", DEF_SPEED, t_Float },
+ { &head_radius_arg, "headRadius", "HeadRadius", DEF_HEAD_RADIUS, t_Float },
+ { &ntentacles_arg, "tentacles", "Tentacles", DEF_TENTACLES, t_Float },
+ { &thickness_arg, "thickness", "Thickness", DEF_THICKNESS, t_Float },
+ { &length_arg, "length", "Length", DEF_LENGTH, t_Float },
+ { &gravity_arg, "gravity", "Gravity", DEF_GRAVITY, t_Float },
+ { &current_arg, "current", "Current", DEF_CURRENT, t_Float },
+ { &friction_arg, "friction", "Friction", DEF_FRICTION, t_Float },
+ { &opacity_arg, "opacity", "Opacity", DEF_OPACITY, t_Float },
+};
+
+ENTRYPOINT ModeSpecOpt hydrostat_opts = {countof(opts), opts,
+ countof(vars), vars, NULL};
+
+
+static void
+move_tentacle (squid *sq, tentacle *t)
+{
+ int i, j;
+ node *prev = &t->nodes[0];
+ int rot = (int) current_device_rotation();
+
+ for (i = 1, j = 0; i < t->length; i++, j++)
+ {
+ XYZ d, p;
+ GLfloat da;
+ node *n = &t->nodes[i];
+
+ /* Sadly, this is still computing motion in a 2d plane, so the
+ tentacles look dumb if the scene is rotated. */
+
+ n->pos.x += n->v.x;
+ n->pos.y += n->v.y;
+ n->pos.z += n->v.z;
+
+ d.x = prev->pos.x - n->pos.x;
+ d.y = prev->pos.y - n->pos.y;
+ d.z = prev->pos.z - n->pos.z;
+ da = atan2 (d.z, d.x);
+
+ p.x = n->pos.x + cos (da) * t->spacing * t->length;
+ p.y = n->pos.y + cos (da) * t->spacing * t->length;
+ p.z = n->pos.z + sin (da) * t->spacing * t->length;
+
+ n->pos.x = prev->pos.x - (p.x - n->pos.x);
+ n->pos.y = prev->pos.y - (p.y - n->pos.y);
+ n->pos.z = prev->pos.z - (p.z - n->pos.z);
+
+ n->v.x = n->pos.x - n->opos.x;
+ n->v.y = n->pos.y - n->opos.y;
+ n->v.z = n->pos.z - n->opos.z;
+
+ n->v.x *= t->friction * (1 - friction_arg);
+ n->v.y *= t->friction * (1 - friction_arg);
+ n->v.z *= t->friction * (1 - friction_arg);
+
+ switch (rot) {
+ case 90: case -270:
+ n->v.x += gravity_arg;
+ n->v.y -= current_arg;
+ n->v.z -= current_arg;
+ break;
+ case -90: case 270:
+ n->v.x -= gravity_arg;
+ n->v.y += current_arg;
+ n->v.z += current_arg;
+ break;
+ case 180: case -180:
+ n->v.x -= current_arg;
+ n->v.y -= current_arg;
+ n->v.z -= gravity_arg;
+ break;
+ default:
+ n->v.x += current_arg;
+ n->v.y += current_arg;
+ n->v.z += gravity_arg;
+ break;
+ }
+
+ n->opos.x = n->pos.x;
+ n->opos.y = n->pos.y;
+ n->opos.z = n->pos.z;
+
+ prev = n;
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+/* Squirty motion: fast acceleration, then fade. */
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.05;
+ GLfloat ease2 = 1-ease;
+ if (r <= 0) r = 0;
+ else if (r >= 1) r = 1;
+ else if (r <= ease) r = ease * ease_fn (r / ease);
+ else r = 1 - ease2 * ease_fn ((1 - r) / ease2);
+ return r;
+}
+
+
+static void
+move_squid (ModeInfo *mi, squid *sq)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat step = M_PI * 2 / sq->ntentacles;
+ int i;
+ GLfloat radius = head_radius_arg;
+ GLfloat r;
+
+ /* Move to a new position */
+
+ if (! bp->button_down_p)
+ {
+ sq->ratio += speed_arg * 0.01;
+ if (sq->ratio >= 1)
+ {
+ sq->ratio = -(frand(2.0) + frand(2.0) + frand(2.0));
+ sq->from.x = sq->to.x;
+ sq->from.y = sq->to.y;
+ sq->from.z = sq->to.z;
+ sq->to.x = 250 - frand(500);
+ sq->to.y = 250 - frand(500);
+ sq->to.z = 250 - frand(500);
+ }
+
+ r = sq->ratio > 0 ? ease_ratio (sq->ratio) : 0;
+ sq->pos.x = sq->from.x + r * (sq->to.x - sq->from.x);
+ sq->pos.y = sq->from.y + r * (sq->to.y - sq->from.y);
+ sq->pos.z = sq->from.z + r * (sq->to.z - sq->from.z);
+ }
+
+ if (do_pulse)
+ {
+ GLfloat p = pow (sin (sq->pulse * M_PI), 18);
+ sq->head_radius = (head_radius_arg * 0.7 +
+ head_radius_arg * 0.3 * p);
+ radius = sq->head_radius * 0.25;
+ sq->pulse += sq->rate * speed_arg * 0.02;
+ if (sq->pulse > 1) sq->pulse = 0;
+ }
+
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ tentacle *tt = &sq->tentacles[i];
+ GLfloat th = i * step;
+ GLfloat px = cos (th) * radius;
+ GLfloat py = sin (th) * radius;
+ tt->th = th;
+ tt->nodes[0].pos.x = sq->pos.x + px;
+ tt->nodes[0].pos.y = sq->pos.y + py;
+ tt->nodes[0].pos.z = sq->pos.z;
+ move_tentacle (sq, tt);
+ }
+}
+
+
+/* Find the angle at which the head should be tilted in the XY plane.
+ */
+static GLfloat
+head_angle (ModeInfo *mi, squid *sq)
+{
+ int i;
+ XYZ sum = { 0, };
+
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ tentacle *t = &sq->tentacles[i];
+ int j = t->length / 3; /* Pick a node toward the top */
+ node *n = &t->nodes[j];
+ sum.x += n->pos.x;
+ sum.y += n->pos.y;
+ sum.z += n->pos.z;
+ }
+
+ sum.x /= sq->ntentacles;
+ sum.y /= sq->ntentacles;
+ sum.z /= sq->ntentacles;
+
+ sum.x -= sq->pos.x;
+ sum.y -= sq->pos.y;
+ sum.z -= sq->pos.z;
+
+ return (-atan2 (sum.x, sum.z) * (180 / M_PI));
+}
+
+
+static void
+draw_head (ModeInfo *mi, squid *sq, GLfloat scale)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat c2[4];
+ GLfloat angle = head_angle (mi, sq);
+
+ scale *= 1.1;
+
+ glPushMatrix();
+ glTranslatef (sq->pos.x, sq->pos.y, sq->pos.z);
+ glScalef (sq->head_radius, sq->head_radius, sq->head_radius);
+ glScalef (scale, scale, scale);
+ glRotatef (90, 1, 0, 0);
+
+ memcpy (c2, sq->color, sizeof(c2));
+ if (opacity_arg < 1.0 && scale >= 1.0)
+ c2[3] *= 0.6;
+ glColor4fv (c2);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c2);
+
+ glTranslatef (0, 0.3, 0);
+ glRotatef (angle, 0, 0, 1);
+
+ glCallList (bp->head);
+ mi->polygon_count += bp->head_polys;
+
+ glPopMatrix();
+}
+
+
+static void
+draw_squid (ModeInfo *mi, squid *sq)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+
+ if (opacity_arg < 1.0)
+ draw_head (mi, sq, 0.75);
+
+ if (!wire) {
+ glFrontFace (GL_CCW);
+ glBegin (GL_TRIANGLE_STRIP);
+ }
+
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ tentacle *t = &sq->tentacles[i];
+ int j;
+
+ glColor4fv (t->color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, t->color);
+
+ if (wire)
+ {
+ glBegin (GL_LINE_STRIP);
+ for (j = 0; j < t->length; j++)
+ glVertex3f (t->nodes[j].pos.x,
+ t->nodes[j].pos.y,
+ t->nodes[j].pos.z);
+ glEnd();
+ mi->polygon_count += t->length;
+ }
+ else
+ {
+ GLfloat radius = t->radius * thickness_arg;
+ GLfloat rstep = radius / t->length;
+ for (j = 0; j < t->length-1; j++)
+ {
+ int k;
+ node *n1 = &t->nodes[j];
+ node *n2 = &t->nodes[j+1];
+ GLfloat X = (n1->pos.x - n2->pos.x);
+ GLfloat Y = (n1->pos.y - n2->pos.y);
+ GLfloat Z = (n1->pos.z - n2->pos.z);
+ GLfloat L = sqrt (X*X + Y*Y + Z*Z);
+ GLfloat r2 = radius - rstep;
+ GLfloat L2 = sqrt (X*X + Y*Y);
+
+ for (k = 0; k <= TENTACLE_FACES; k++)
+ {
+ GLfloat c = bp->cos_sin_table[2 * k];
+ GLfloat s = bp->cos_sin_table[2 * k + 1];
+ GLfloat x1 = radius * c;
+ GLfloat y1 = radius * s;
+ GLfloat z1 = 0;
+ GLfloat x2 = r2 * c;
+ GLfloat y2 = r2 * s;
+ GLfloat z2 = L;
+
+ GLfloat x1t = (L2*X*z1-X*Z*y1+L*Y*x1)/(L*L2);
+ GLfloat z1t = (L2*Y*z1-Y*Z*y1-L*X*x1)/(L*L2);
+ GLfloat y1t = (Z*z1+L2*y1)/L;
+
+ GLfloat x2t = (L2*X*z2-X*Z*y2+L*Y*x2)/(L*L2) + n1->pos.x;
+ GLfloat z2t = (L2*Y*z2-Y*Z*y2-L*X*x2)/(L*L2) + n1->pos.y;
+ GLfloat y2t = (Z*z2+L2*y2)/L + n1->pos.z;
+
+ glNormal3f (x1t, z1t, y1t);
+
+ x1t += n1->pos.x;
+ z1t += n1->pos.y;
+ y1t += n1->pos.z;
+
+ if (k == 0)
+ glVertex3f (x1t, z1t, y1t);
+ glVertex3f (x1t, z1t, y1t);
+
+ glVertex3f (x2t, z2t, y2t);
+ if (k == TENTACLE_FACES)
+ glVertex3f (x2t, z2t, y2t);
+
+ mi->polygon_count++;
+ }
+ radius = r2;
+ }
+ }
+ }
+
+ if (!wire)
+ glEnd ();
+
+ draw_head (mi, sq, 1.0);
+
+ glPopMatrix();
+}
+
+
+static squid *
+make_squid (ModeInfo *mi, int which)
+{
+ squid *sq = calloc (1, sizeof(*sq));
+ int i;
+
+ sq->head_radius = head_radius_arg;
+ sq->thickness = thickness_arg;
+ sq->ntentacles = ntentacles_arg;
+
+ sq->color[0] = 0.1 + frand(0.7);
+ sq->color[1] = 0.5 + frand(0.5);
+ sq->color[2] = 0.1 + frand(0.7);
+ sq->color[3] = opacity_arg;
+
+ sq->from.x = sq->to.x = sq->pos.x = 200 - frand(400);
+ sq->from.y = sq->to.y = sq->pos.y = 200 - frand(400);
+ sq->from.z = sq->to.z = sq->pos.z = -frand(200);
+
+ sq->ratio = -frand(3);
+
+ if (which > 0) /* Start others off screen, and moving in */
+ {
+ sq->from.x = sq->to.x = sq->pos.x = 800 + frand(500)
+ * (random()&1 ? 1 : -1);
+ sq->from.y = sq->to.y = sq->pos.y = 800 + frand(500)
+ * (random()&1 ? 1 : -1);
+ sq->ratio = 0;
+ }
+
+ if (do_pulse)
+ sq->pulse = frand(1.0);
+ sq->rate = 0.8 + frand(0.2);
+
+ sq->tentacles = (tentacle *)
+ calloc (sq->ntentacles, sizeof(*sq->tentacles));
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ int j;
+ tentacle *t = &sq->tentacles[i];
+ GLfloat shade = 0.75 + frand(0.25);
+
+ t->length = 2 + length_arg * (0.8 + frand (0.4));
+ t->radius = 0.05 + frand (0.95);
+ t->spacing = 0.02 + frand (0.08);
+ t->friction = 0.7 + frand (0.18);
+ t->nodes = (node *) calloc (t->length + 1, sizeof (*t->nodes));
+
+ t->color[0] = shade * sq->color[0];
+ t->color[1] = shade * sq->color[1];
+ t->color[2] = shade * sq->color[2];
+ t->color[3] = sq->color[3];
+
+ for (j = 0; j < t->length; j++)
+ {
+ node *n = &t->nodes[j];
+ n->pos.x = sq->pos.x;
+ n->pos.y = sq->pos.y;
+ n->pos.z = sq->pos.z + j;
+ }
+ }
+
+ return sq;
+}
+
+/* qsort comparator for sorting squid by depth */
+static int
+cmp_squid (const void *aa, const void *bb)
+{
+ squid * const *a = aa;
+ squid * const *b = bb;
+ return ((int) ((*b)->pos.y * 10000) -
+ (int) ((*a)->pos.y * 10000));
+}
+
+
+static void
+free_squid (squid *sq)
+{
+ int i;
+ for (i = 0; i < sq->ntentacles; i++)
+ free (sq->tentacles[i].nodes);
+ free (sq->tentacles);
+ free (sq);
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hydrostat (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+ENTRYPOINT Bool
+hydrostat_handle_event (ModeInfo *mi, XEvent *event)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+ int x, y;
+
+# ifdef USE_TRACKBALL
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+# endif
+
+ switch (event->xany.type) {
+ case ButtonPress: case ButtonRelease:
+ x = event->xbutton.x;
+ y = event->xbutton.y;
+ break;
+ case MotionNotify:
+ x = event->xmotion.x;
+ y = event->xmotion.y;
+ break;
+ default:
+ x = y = 0;
+ }
+
+ x -= w/2;
+ y -= h/2;
+ x *= 0.7;
+ y *= 0.7;
+
+ if (event->xany.type == ButtonPress)
+ {
+ int i;
+ GLfloat D0 = 999999;
+
+ /* This is pretty halfassed hit detection, but it works ok... */
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ squid *s = bp->squids[i];
+ GLfloat X = s->pos.x - x;
+ GLfloat Y = s->pos.z - y;
+ GLfloat D = sqrt(X*X + Y*Y);
+ if (D < D0)
+ {
+ bp->dragging = i;
+ D0 = D;
+ }
+ }
+
+ if (D0 > 300) /* Too far away, missed hit */
+ {
+ bp->dragging = -1;
+ return False;
+ }
+
+ bp->squids[bp->dragging]->ratio = -3;
+ bp->button_down_p = True;
+
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease && bp->dragging >= 0)
+ {
+ bp->button_down_p = False;
+ bp->dragging = -1;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && bp->dragging >= 0)
+ {
+ squid *s = bp->squids[bp->dragging];
+ s->from.x = s->to.x = s->pos.x = x;
+ s->from.z = s->to.z = s->pos.z = y;
+ s->from.y = s->to.y = s->pos.y;
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_hydrostat (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ hydrostat_configuration *bp;
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hydrostat (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+ int k;
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ for (k = 0; k <= TENTACLE_FACES; k++)
+ {
+ GLfloat th = k * M_PI * 2 / TENTACLE_FACES;
+ bp->cos_sin_table[2 * k] = cos(th);
+ bp->cos_sin_table[2 * k + 1] = sin(th);
+ }
+ }
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+
+ if (MI_COUNT(mi) <= 0)
+ MI_COUNT(mi) = 1;
+
+ if (random() & 1)
+ current_arg = -current_arg;
+
+ if (MI_COUNT(mi) == 1 || wire)
+ opacity_arg = 1.0;
+ if (opacity_arg < 0.1) opacity_arg = 0.1;
+ if (opacity_arg > 1.0) opacity_arg = 1.0;
+
+ bp->squids = (squid **) calloc (MI_COUNT(mi), sizeof(*bp->squids));
+ for (i = 0; i < MI_COUNT(mi); i++)
+ bp->squids[i] = make_squid (mi, i);
+
+ bp->dragging = -1;
+
+ if (opacity_arg < 1.0)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ }
+
+ i = wire ? 4 : 24;
+ bp->head = glGenLists (1);
+ glNewList (bp->head, GL_COMPILE);
+ glScalef (1, 1.1, 1);
+ bp->head_polys = unit_dome (wire ? 8 : 16, i, wire);
+ glRotatef (180, 0, 0, 1);
+ glScalef (1, 0.5, 1);
+ bp->head_polys += unit_dome (wire ? 8 : 8, i, wire);
+ glEndList ();
+
+# ifdef USE_TRACKBALL
+ bp->trackball = gltrackball_init (True);
+# endif
+}
+
+
+ENTRYPOINT void
+draw_hydrostat (ModeInfo *mi)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef (0.03, 0.03, 0.03);
+
+# ifdef USE_TRACKBALL
+ gltrackball_rotate (bp->trackball);
+# endif
+
+ mi->polygon_count = 0;
+
+ if (opacity_arg < 1.0)
+ qsort (bp->squids, MI_COUNT(mi), sizeof(*bp->squids), cmp_squid);
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ squid *sq = bp->squids[i];
+ move_squid (mi, sq);
+ draw_squid (mi, sq);
+ if (opacity_arg < 1.0)
+ glClear (GL_DEPTH_BUFFER_BIT);
+ }
+
+ if (! (random() % 700)) /* Reverse the flow every now and then */
+ current_arg = -current_arg;
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_hydrostat (ModeInfo *mi)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ if (!bp->squids)
+ return;
+ for (i = 0; i < MI_COUNT(mi); i++)
+ free_squid (bp->squids[i]);
+ free (bp->squids);
+}
+
+XSCREENSAVER_MODULE ("Hydrostat", hydrostat)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hydrostat.man b/hacks/glx/hydrostat.man
new file mode 100644
index 0000000..de75525
--- /dev/null
+++ b/hacks/glx/hydrostat.man
@@ -0,0 +1,103 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hydrostat - Wiggly squid or jellyfish with many tentacles.
+.SH SYNOPSIS
+.B hydrostat
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-head-radius \fInumber\fP]
+[\-tentacles \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-length \fInumber\fP]
+[\-gravity \fInumber\fP]
+[\-current \fInumber\fP]
+[\-friction \fInumber\fP]
+[\-no-pulse]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Wiggly squid or jellyfish with many tentacles. A muscular hydrostat
+is a biological structure used to move its host about, consisting of
+muscles with no skeletal support. It performs its hydraulic movement
+without fluid in a separate compartment, as in a hydrostatic
+skeleton.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Number of squid. 1 - 100. Default: 10.
+.TP 8
+.B \-head-radius \fInumber\fP
+Head size. 10 - 100. Default: 60.
+.TP 8
+.B \-tentacles \fInumber\fP
+Number of tentacles. 3 - 100. Default: 40.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of tentacles. 3 - 40. Default: 18.
+.TP 8
+.B \-length \fInumber\fP
+Length of tentacles. 10 - 150. Default: 70.
+.TP 8
+.B \-gravity \fInumber\fP
+Strength of gravity. 0 - 10.0. Default: 0.5.
+.TP 8
+.B \-current \fInumber\fP
+Strength of current. 0.0 - 10.0. Default: 0.25.
+.TP 8
+.B \-friction \fInumber\fP
+Coefficient of friction. 0.0 - 0.1. Default: 0.02.
+.TP 8
+.B \-pulse | \-no-pulse
+Whether the squid should pulse. Default true.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+
+.BR http://soulwire.co.uk/experiments/muscular-hydrostats/
+.SH COPYRIGHT
+Copyright \(co 2016 by Justin Windle and Jamie Zawinski. Permission
+to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both
+that copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Justin Windle and Jamie Zawinski.
diff --git a/hacks/glx/hypertorus.c b/hacks/glx/hypertorus.c
new file mode 100644
index 0000000..3ae6aad
--- /dev/null
+++ b/hacks/glx/hypertorus.c
@@ -0,0 +1,1016 @@
+/* hypertorus --- Shows a hypertorus that rotates in 4d */
+
+#if 0
+static const char sccsid[] = "@(#)hypertorus.c 1.2 05/09/28 xlockmore";
+#endif
+
+/* Copyright (c) 2003-2009 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 03/05/18: Initial version
+ * C. Steger - 05/09/28: Added the spirals appearance mode
+ * and trackball support
+ * C. Steger - 07/01/23: Improved 4d trackball support
+ * C. Steger - 09/08/22: Removed check-config.pl warnings
+ */
+
+/*
+ * This program shows the Clifford torus as it rotates in 4d. The Clifford
+ * torus is a torus lies on the "surface" of the hypersphere in 4d. The
+ * program projects the 4d torus to 3d using either a perspective or an
+ * orthographic projection. Of the two alternatives, the perspecitve
+ * projection looks much more appealing. In orthographic projections the
+ * torus degenerates into a doubly covered cylinder for some angles. The
+ * projected 3d torus can then be projected to the screen either perspectively
+ * or orthographically. There are three display modes for the torus: mesh
+ * (wireframe), solid, or transparent. Furthermore, the appearance of the
+ * torus can be as a solid object or as a set of see-through bands or
+ * see-through spirals. Finally, the colors with with the torus is drawn can
+ * be set to either two-sided or to colorwheel. In the first case, the torus
+ * is drawn with red on the outside and green on the inside. This mode
+ * enables you to see that the torus turns inside-out as it rotates in 4d.
+ * The second mode draws the torus in a fully saturated color wheel. This
+ * gives a very nice effect when combined with the see-through bands or
+ * see-through spirals mode. The rotation speed for each of the six planes
+ * around which the torus rotates can be chosen. This program is very much
+ * inspired by Thomas Banchoff's book "Beyond the Third Dimension: Geometry,
+ * Computer Graphics, and Higher Dimensions", Scientific American Library,
+ * 1990.
+ */
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define DISP_WIREFRAME 0
+#define DISP_SURFACE 1
+#define DISP_TRANSPARENT 2
+
+#define APPEARANCE_SOLID 0
+#define APPEARANCE_BANDS 1
+#define APPEARANCE_SPIRALS 2
+
+#define COLORS_TWOSIDED 0
+#define COLORS_COLORWHEEL 1
+
+#define DISP_3D_PERSPECTIVE 0
+#define DISP_3D_ORTHOGRAPHIC 1
+
+#define DISP_4D_PERSPECTIVE 0
+#define DISP_4D_ORTHOGRAPHIC 1
+
+#define DEF_DISPLAY_MODE "surface"
+#define DEF_APPEARANCE "bands"
+#define DEF_COLORS "colorwheel"
+#define DEF_PROJECTION_3D "perspective"
+#define DEF_PROJECTION_4D "perspective"
+#define DEF_SPEEDWX "1.1"
+#define DEF_SPEEDWY "1.3"
+#define DEF_SPEEDWZ "1.5"
+#define DEF_SPEEDXY "1.7"
+#define DEF_SPEEDXZ "1.9"
+#define DEF_SPEEDYZ "2.1"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 25000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_hypertorus 0
+# define release_hypertorus 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "gltrackball.h"
+
+
+#ifdef USE_MODULES
+ModStruct hypertorus_description =
+{"hypertorus", "init_hypertorus", "draw_hypertorus", NULL,
+ "draw_hypertorus", "change_hypertorus", NULL, &hypertorus_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows a hypertorus rotating in 4d", 0, NULL};
+
+#endif
+
+
+static char *mode;
+static int display_mode;
+static char *appear;
+static int appearance;
+static int num_spirals;
+static char *color_mode;
+static int colors;
+static char *proj_3d;
+static int projection_3d;
+static char *proj_4d;
+static int projection_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+
+static const float offset4d[4] = { 0.0, 0.0, 0.0, 2.0 };
+static const float offset3d[4] = { 0.0, 0.0, -2.0, 0.0 };
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-appearance", ".appearance", XrmoptionSepArg, 0 },
+ {"-solid", ".appearance", XrmoptionNoArg, "solid" },
+ {"-bands", ".appearance", XrmoptionNoArg, "bands" },
+ {"-spirals-1", ".appearance", XrmoptionNoArg, "spirals-1" },
+ {"-spirals-2", ".appearance", XrmoptionNoArg, "spirals-2" },
+ {"-spirals-4", ".appearance", XrmoptionNoArg, "spirals-4" },
+ {"-spirals-8", ".appearance", XrmoptionNoArg, "spirals-8" },
+ {"-spirals-16", ".appearance", XrmoptionNoArg, "spirals-16" },
+ {"-twosided", ".colors", XrmoptionNoArg, "twosided" },
+ {"-colorwheel", ".colors", XrmoptionNoArg, "colorwheel" },
+ {"-perspective-3d", ".projection3d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-3d", ".projection3d", XrmoptionNoArg, "orthographic" },
+ {"-perspective-4d", ".projection4d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-4d", ".projection4d", XrmoptionNoArg, "orthographic" },
+ {"-speed-wx", ".speedwx", XrmoptionSepArg, 0 },
+ {"-speed-wy", ".speedwy", XrmoptionSepArg, 0 },
+ {"-speed-wz", ".speedwz", XrmoptionSepArg, 0 },
+ {"-speed-xy", ".speedxy", XrmoptionSepArg, 0 },
+ {"-speed-xz", ".speedxz", XrmoptionSepArg, 0 },
+ {"-speed-yz", ".speedyz", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] =
+{
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
+ { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
+ { &proj_3d, "projection3d", "Projection3d", DEF_PROJECTION_3D, t_String },
+ { &proj_4d, "projection4d", "Projection4d", DEF_PROJECTION_4D, t_String },
+ { &speed_wx, "speedwx", "Speedwx", DEF_SPEEDWX, t_Float},
+ { &speed_wy, "speedwy", "Speedwy", DEF_SPEEDWY, t_Float},
+ { &speed_wz, "speedwz", "Speedwz", DEF_SPEEDWZ, t_Float},
+ { &speed_xy, "speedxy", "Speedxy", DEF_SPEEDXY, t_Float},
+ { &speed_xz, "speedxz", "Speedxz", DEF_SPEEDXZ, t_Float},
+ { &speed_yz, "speedyz", "Speedyz", DEF_SPEEDYZ, t_Float}
+};
+
+static OptionStruct desc[] =
+{
+ { "-wireframe", "display the torus as a wireframe mesh" },
+ { "-surface", "display the torus as a solid surface" },
+ { "-transparent", "display the torus as a transparent surface" },
+ { "-solid", "display the torus as a solid object" },
+ { "-bands", "display the torus as see-through bands" },
+ { "-spirals-{1,2,4,8,16}", "display the torus as see-through spirals" },
+ { "-twosided", "display the torus with two colors" },
+ { "-colorwheel", "display the torus with a smooth color wheel" },
+ { "-perspective-3d", "project the torus perspectively from 3d to 2d" },
+ { "-orthographic-3d", "project the torus orthographically from 3d to 2d" },
+ { "-perspective-4d", "project the torus perspectively from 4d to 3d" },
+ { "-orthographic-4d", "project the torus orthographically from 4d to 3d" },
+ { "-speed-wx <arg>", "rotation speed around the wx plane" },
+ { "-speed-wy <arg>", "rotation speed around the wy plane" },
+ { "-speed-wz <arg>", "rotation speed around the wz plane" },
+ { "-speed-xy <arg>", "rotation speed around the xy plane" },
+ { "-speed-xz <arg>", "rotation speed around the xz plane" },
+ { "-speed-yz <arg>", "rotation speed around the yz plane" }
+};
+
+ENTRYPOINT ModeSpecOpt hypertorus_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* 4D rotation angles */
+ float alpha, beta, delta, zeta, eta, theta;
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Trackball states */
+ trackball_state *trackballs[2];
+ int current_trackball;
+ Bool button_pressed;
+
+ float speed_scale;
+
+} hypertorusstruct;
+
+static hypertorusstruct *hyper = (hypertorusstruct *) NULL;
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][2];
+ v = m[i][3];
+ m[i][2] = c*u+s*v;
+ m[i][3] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][3];
+ m[i][1] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][3];
+ m[i][0] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+ float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatewx(m,al);
+ rotatewy(m,be);
+ rotatewz(m,de);
+ rotatexz(m,et);
+ rotatexy(m,ze);
+ rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+ int i, j, k;
+
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<4; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+ double al, be, de, ze, et, th;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+
+ r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+ r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+ r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+ r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+ r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+ et = atan2(-r12,r22)*180.0/M_PI;
+ th = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ ze = atan2(-r01,r00)*180.0/M_PI;
+
+ rotateall(al,be,de,ze,et,-th,m);
+}
+
+
+/* Compute a fully saturated and bright color based on an angle. */
+static void color(double angle)
+{
+ int s;
+ double t;
+ float color[4];
+
+ if (colors != COLORS_COLORWHEEL)
+ return;
+
+ if (angle >= 0.0)
+ angle = fmod(angle,2*M_PI);
+ else
+ angle = fmod(angle,-2*M_PI);
+ s = floor(angle/(M_PI/3));
+ t = angle/(M_PI/3)-s;
+ if (s >= 6)
+ s = 0;
+ switch (s)
+ {
+ case 0:
+ color[0] = 1.0;
+ color[1] = t;
+ color[2] = 0.0;
+ break;
+ case 1:
+ color[0] = 1.0-t;
+ color[1] = 1.0;
+ color[2] = 0.0;
+ break;
+ case 2:
+ color[0] = 0.0;
+ color[1] = 1.0;
+ color[2] = t;
+ break;
+ case 3:
+ color[0] = 0.0;
+ color[1] = 1.0-t;
+ color[2] = 1.0;
+ break;
+ case 4:
+ color[0] = t;
+ color[1] = 0.0;
+ color[2] = 1.0;
+ break;
+ case 5:
+ color[0] = 1.0;
+ color[1] = 0.0;
+ color[2] = 1.0-t;
+ break;
+ }
+ if (display_mode == DISP_TRANSPARENT)
+ color[3] = 0.7;
+ else
+ color[3] = 1.0;
+ glColor3fv(color);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,color);
+}
+
+
+/* Draw a hypertorus projected into 3D. Note that the spirals appearance
+ will only work correctly if numu and numv are set to 64 or any higher
+ power of 2. Similarly, the banded appearance will only work correctly
+ if numu and numv are divisible by 4. */
+static int hypertorus(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax, int numu, int numv)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], n[3], mat[4][4];
+ int i, j, k, l, m, b, skew;
+ double u, v, ur, vr;
+ double cu, su, cv, sv;
+ double xx[4], xxu[4], xxv[4], x[4], xu[4], xv[4];
+ double r, s, t;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ rotateall(hp->alpha,hp->beta,hp->delta,hp->zeta,hp->eta,hp->theta,r1);
+
+ gltrackball_get_quaternion(hp->trackballs[0],q1);
+ gltrackball_get_quaternion(hp->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+
+ if (colors != COLORS_COLORWHEEL)
+ {
+ glColor3fv(mat_diff_red);
+ if (display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+
+#if 0 /* #### not working */
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+#endif
+
+ skew = num_spirals;
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<numu; i++)
+ {
+ if ((appearance == APPEARANCE_BANDS ||
+ appearance == APPEARANCE_SPIRALS) && ((i & 3) >= 2))
+ continue;
+ if (display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=numv; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ u = ur*l/numu+umin;
+ v = vr*m/numv+vmin;
+ if (appearance == APPEARANCE_SPIRALS)
+ {
+ u += 4.0*skew/numv*v;
+ b = ((i/4)&(skew-1))*(numu/(4*skew));
+ color(ur*4*b/numu+umin);
+ }
+ else
+ {
+ color(u);
+ }
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ xx[0] = cu;
+ xx[1] = su;
+ xx[2] = cv;
+ xx[3] = sv;
+ xxu[0] = -su;
+ xxu[1] = cu;
+ xxu[2] = 0.0;
+ xxu[3] = 0.0;
+ xxv[0] = 0.0;
+ xxv[1] = 0.0;
+ xxv[2] = -sv;
+ xxv[3] = cv;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ s = 0.0;
+ t = 0.0;
+ for (m=0; m<4; m++)
+ {
+ r += mat[l][m]*xx[m];
+ s += mat[l][m]*xxu[m];
+ t += mat[l][m]*xxv[m];
+ }
+ x[l] = r;
+ xu[l] = s;
+ xv[l] = t;
+ }
+ if (projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = (x[l]+offset4d[l])/1.5+offset3d[l];
+ pu[l] = xu[l];
+ pv[l] = xv[l];
+ }
+ }
+ else
+ {
+ s = x[3]+offset4d[3];
+ t = s*s;
+ for (l=0; l<3; l++)
+ {
+ r = x[l]+offset4d[l];
+ p[l] = r/s+offset3d[l];
+ pu[l] = (xu[l]*s-r*xu[3])/t;
+ pv[l] = (xv[l]*s-r*xv[3])/t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ n[0] /= t;
+ n[1] /= t;
+ n[2] /= t;
+ glNormal3fv(n);
+ glVertex3fv(p);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+static void init(ModeInfo *mi)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ hp->alpha = 0.0;
+ hp->beta = 0.0;
+ hp->delta = 0.0;
+ hp->zeta = 0.0;
+ hp->eta = 0.0;
+ hp->theta = 0.0;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (projection_3d == DISP_3D_PERSPECTIVE)
+ gluPerspective(60.0,1.0,0.1,100.0);
+ else
+ glOrtho(-1.0,1.0,-1.0,1.0,0.1,100.0);;
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (display_mode == DISP_WIREFRAME)
+ display_mode = DISP_SURFACE;
+# endif
+
+ if (display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+}
+
+
+/* Redisplay the hypertorus. */
+static void display_hypertorus(ModeInfo *mi)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ if (!hp->button_pressed)
+ {
+ hp->alpha += speed_wx * hp->speed_scale;
+ if (hp->alpha >= 360.0)
+ hp->alpha -= 360.0;
+ hp->beta += speed_wy * hp->speed_scale;
+ if (hp->beta >= 360.0)
+ hp->beta -= 360.0;
+ hp->delta += speed_wz * hp->speed_scale;
+ if (hp->delta >= 360.0)
+ hp->delta -= 360.0;
+ hp->zeta += speed_xy * hp->speed_scale;
+ if (hp->zeta >= 360.0)
+ hp->zeta -= 360.0;
+ hp->eta += speed_xz * hp->speed_scale;
+ if (hp->eta >= 360.0)
+ hp->eta -= 360.0;
+ hp->theta += speed_yz * hp->speed_scale;
+ if (hp->theta >= 360.0)
+ hp->theta -= 360.0;
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (projection_3d == DISP_3D_ORTHOGRAPHIC)
+ {
+ if (hp->aspect >= 1.0)
+ glOrtho(-hp->aspect,hp->aspect,-1.0,1.0,0.1,100.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/hp->aspect,1.0/hp->aspect,0.1,100.0);
+ }
+ else
+ {
+ gluPerspective(60.0,hp->aspect,0.1,100.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ mi->polygon_count = hypertorus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,64,64);
+}
+
+
+ENTRYPOINT void reshape_hypertorus(ModeInfo *mi, int width, int height)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ hp->WindW = (GLint)width;
+ hp->WindH = (GLint)height;
+ glViewport(0,y,width,height);
+ hp->aspect = h;
+}
+
+
+ENTRYPOINT Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+ KeySym sym = 0;
+ char c = 0;
+
+ if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
+ XLookupString (&event->xkey, &c, 1, &sym, 0);
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ hp->button_pressed = True;
+ gltrackball_start(hp->trackballs[hp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ hp->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ hp->current_trackball = 1;
+ if (hp->button_pressed)
+ gltrackball_start(hp->trackballs[hp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == KeyRelease)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ hp->current_trackball = 0;
+ if (hp->button_pressed)
+ gltrackball_start(hp->trackballs[hp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == MotionNotify && hp->button_pressed)
+ {
+ gltrackball_track(hp->trackballs[hp->current_trackball],
+ event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize hypertorus. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_hypertorus(ModeInfo *mi)
+{
+ hypertorusstruct *hp;
+
+ MI_INIT(mi, hyper);
+ hp = &hyper[MI_SCREEN(mi)];
+
+
+ hp->trackballs[0] = gltrackball_init(True);
+ hp->trackballs[1] = gltrackball_init(True);
+ hp->current_trackball = 0;
+ hp->button_pressed = False;
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"wireframe") || !strcasecmp(mode,"0"))
+ {
+ display_mode = DISP_WIREFRAME;
+ }
+ else if (!strcasecmp(mode,"surface") || !strcasecmp(mode,"1"))
+ {
+ display_mode = DISP_SURFACE;
+ }
+ else if (!strcasecmp(mode,"transparent") || !strcasecmp(mode,"2"))
+ {
+ display_mode = DISP_TRANSPARENT;
+ }
+ else
+ {
+ display_mode = DISP_SURFACE;
+ }
+
+ /* Set the appearance. */
+ if (!strcasecmp(appear,"solid") || !strcasecmp(appear,"0"))
+ {
+ appearance = APPEARANCE_SOLID;
+ }
+ else if (!strcasecmp(appear,"bands") || !strcasecmp(appear,"1"))
+ {
+ appearance = APPEARANCE_BANDS;
+ num_spirals = 0;
+ }
+ else if (!strcasecmp(appear,"spirals-1") || !strcasecmp(appear,"3"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 1;
+ }
+ else if (!strcasecmp(appear,"spirals-2") || !strcasecmp(appear,"4"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 2;
+ }
+ else if (!strcasecmp(appear,"spirals-4") || !strcasecmp(appear,"5"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 4;
+ }
+ else if (!strcasecmp(appear,"spirals-8") || !strcasecmp(appear,"6"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 8;
+ }
+ else if (!strcasecmp(appear,"spirals-16") || !strcasecmp(appear,"7"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 16;
+ }
+ else
+ {
+ appearance = APPEARANCE_BANDS;
+ num_spirals = 0;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_mode,"twosided"))
+ {
+ colors = COLORS_TWOSIDED;
+ }
+ else if (!strcasecmp(color_mode,"colorwheel"))
+ {
+ colors = COLORS_COLORWHEEL;
+ }
+ else
+ {
+ colors = COLORS_COLORWHEEL;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj_3d,"perspective") || !strcasecmp(proj_3d,"0"))
+ {
+ projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"orthographic") || !strcasecmp(proj_3d,"1"))
+ {
+ projection_3d = DISP_3D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ projection_3d = DISP_3D_PERSPECTIVE;
+ }
+
+ /* Set the 4d projection mode. */
+ if (!strcasecmp(proj_4d,"perspective") || !strcasecmp(proj_4d,"0"))
+ {
+ projection_4d = DISP_4D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_4d,"orthographic") || !strcasecmp(proj_4d,"1"))
+ {
+ projection_4d = DISP_4D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ projection_4d = DISP_4D_PERSPECTIVE;
+ }
+
+ /* make multiple screens rotate at slightly different rates. */
+ hp->speed_scale = 0.9 + frand(0.3);
+
+ if ((hp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_hypertorus(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ hypertorusstruct *hp;
+
+ if (hyper == NULL)
+ return;
+ hp = &hyper[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!hp->glx_context)
+ return;
+
+ glXMakeCurrent(display,window,*(hp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ display_hypertorus(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_hypertorus(ModeInfo *mi)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ if (!hp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(hp->glx_context));
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Hypertorus", hypertorus)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hypertorus.man b/hacks/glx/hypertorus.man
new file mode 100644
index 0000000..8c7075f
--- /dev/null
+++ b/hacks/glx/hypertorus.man
@@ -0,0 +1,188 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hypertorus - Draws a hypertorus that rotates in 4d
+.SH SYNOPSIS
+.B hypertorus
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-wireframe]
+[\-surface]
+[\-transparent]
+[\-solid]
+[\-bands]
+[\-spirals-{1,2,4,8,16}]
+[\-twosided]
+[\-colorwheel]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+.SH DESCRIPTION
+The \fIhypertorus\fP program shows the Clifford torus as it rotates in
+4d. The Clifford torus is a torus lies on the "surface" of the
+hypersphere in 4d. The program projects the 4d torus to 3d using
+either a perspective or an orthographic projection. Of the two
+alternatives, the perspective projection looks much more appealing.
+In orthographic projections the torus degenerates into a doubly
+covered cylinder for some angles. The projected 3d torus can then be
+projected to the screen either perspectively or orthographically.
+There are three display modes for the torus: mesh (wireframe), solid,
+or transparent. Furthermore, the appearance of the torus can be as a
+solid object or as a set of see-through bands or see-through spirals.
+Finally, the colors with with the torus is drawn can be set to either
+two-sided or to a color wheel. In the first case, the torus is drawn
+with red on the outside and green on the inside. This mode enables
+you to see that the torus turns inside-out as it rotates in 4d. The
+second mode draws the torus with a fully saturated color wheel. This
+gives a very nice effect when combined with the see-through bands or
+see-through spirals mode. The rotation speed for each of the six
+planes around which the torus rotates can be chosen. This program is
+very much inspired by Thomas Banchoff's book "Beyond the Third
+Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+Scientific American Library, 1990.
+.SH OPTIONS
+.I hypertorus
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 25000, or 1/40th second.
+.PP
+The following three options are mutually exclusive. They determine
+how the torus is displayed.
+.TP 8
+.B \-wireframe
+Display the torus as a wireframe mesh.
+.TP 8
+.B \-surface
+Display the torus as a solid surface (default).
+.TP 8
+.B \-transparent
+Display the torus as a transparent surface.
+.PP
+The following seven options are mutually exclusive. They determine the
+appearance of the torus.
+.TP 8
+.B \-solid
+Display the torus as a solid object.
+.TP 8
+.B \-bands
+Display the torus as see-through bands (default).
+.TP 8
+.B \-spirals-1, \-spirals-2, \-spirals-4, \-spirals-8, \-spirals-16
+Display the torus as see-through spirals with the indicated number of
+spirals.
+.PP
+The following two options are mutually exclusive. They determine how
+to color the torus.
+.TP 8
+.B \-twosided
+Display the torus with two colors: red on the outside and green on
+the inside.
+.TP 8
+.B \-colorwheel
+Display the torus with a fully saturated color wheel (default). If
+the torus is displayed as see-through bands each band will be
+displayed with a different color. Likewise, if the torus is displayed
+as see-through spirals each spiral will receive a different color.
+.PP
+The following two options are mutually exclusive. They determine how
+the torus is projected from 3d to 2d (i.e., to the screen).
+.TP 8
+.B \-perspective-3d
+Project the torus from 3d to 2d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-3d
+Project the torus from 3d to 2d using an orthographic projection.
+.PP
+The following two options are mutually exclusive. They determine how
+the torus is projected from 4d to 3d.
+.TP 8
+.B \-perspective-4d
+Project the torus from 4d to 3d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-4d
+Project the torus from 4d to 3d using an orthographic projection.
+.PP
+The following six options determine the rotation speed of the torus
+around the six possible hyperplanes. The rotation speed is measured
+in degrees per frame. The speeds should be set to relatively small
+values, e.g., less than 4 in magnitude.
+.TP 8
+.B \-speed-wx \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-wy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH INTERACTION
+If you run this program in standalone mode you can rotate the
+hypertorus by dragging the mouse while pressing the left mouse button.
+This rotates the hypertorus in 3D, i.e., around the wx, wy, and wz
+planes. If you press the shift key while dragging the mouse with the
+left button pressed the hypertorus is rotated in 4D, i.e., around the
+xy, xz, and yz planes. To examine the hypertorus at your leisure, it
+is best to set all speeds to 0. Otherwise, the hypertorus will rotate
+while the left mouse button is not pressed.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003-2005 by Carsten Steger. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 28-sep-2005.
diff --git a/hacks/glx/hypnowheel.c b/hacks/glx/hypnowheel.c
new file mode 100644
index 0000000..0602e6e
--- /dev/null
+++ b/hacks/glx/hypnowheel.c
@@ -0,0 +1,322 @@
+/* hypnowheel, Copyright (c) 2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws overlapping spirals, where the tightness of the spirals changes.
+ * Nice settings:
+ *
+ * -layers 7 -wander
+ * -count 3 -layers 50
+ * -twistiness 0.2 -layers 20
+ * -count 3 -layers 2 -speed 20 -twist 10 -wander
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 13 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_hypnowheel 0
+# define release_hypnowheel 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_WANDER "False"
+#define DEF_SYMMETRIC "False"
+#define DEF_SPEED "1.0"
+#define DEF_TWISTINESS "4.0"
+#define DEF_LAYERS "4"
+
+typedef struct {
+ int color;
+ GLfloat twist;
+ GLfloat alpha;
+ rotator *rot;
+} disc;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ disc *discs;
+ int ncolors;
+ XColor *colors;
+
+} hypnowheel_configuration;
+
+static hypnowheel_configuration *bps = NULL;
+
+static GLfloat speed;
+static GLfloat twistiness;
+static GLint nlayers;
+static Bool do_wander;
+static Bool do_symmetric;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-twistiness", ".twistiness", XrmoptionSepArg, 0 },
+ { "-layers", ".layers", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-symmetric", ".symmetric", XrmoptionNoArg, "True" },
+ { "+symmetric", ".symmetric", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_symmetric, "symmetric", "Symmetric", DEF_SYMMETRIC, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&twistiness, "twistiness", "Twistiness", DEF_TWISTINESS, t_Float},
+ {&nlayers, "layers", "Layers", DEF_LAYERS, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt hypnowheel_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+draw_spiral (ModeInfo *mi, disc *d)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ hypnowheel_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat rr = 0.5;
+ int n = MI_COUNT(mi);
+ int steps = n * (wire ? 3 : (n < 5 ? 60 : n < 10 ? 20 : 10));
+ GLfloat dth = M_PI*2 / n;
+ GLfloat dr = rr / steps;
+ GLfloat th;
+ GLfloat twist = d->twist;
+ GLfloat dtwist = M_PI * 2 * twist / steps;
+ double cscale = 65536.0;
+
+ if (nlayers > 3 && !wire)
+ cscale *= (nlayers-2); /* don't wash out to white */
+
+ glColor4f (bp->colors[d->color].red / cscale,
+ bp->colors[d->color].green / cscale,
+ bp->colors[d->color].blue / cscale,
+ d->alpha);
+ for (th = 0; th < M_PI*2; th += dth)
+ {
+ GLfloat th1 = th;
+ GLfloat r;
+ glBegin (wire ? GL_LINE_STRIP : GL_QUAD_STRIP);
+ for (r = 0; r <= rr; r += dr)
+ {
+ GLfloat th2 = th1 + dth/2 + dtwist;
+ th1 += dtwist;
+ glVertex3f (r * cos(th1), r * sin(th1), 0);
+ if (! wire)
+ glVertex3f (r * cos(th2), r * sin(th2), 0);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hypnowheel (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 3) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+init_hypnowheel (ModeInfo *mi)
+{
+ hypnowheel_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hypnowheel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (! bp->rot)
+ bp->rot = make_rotator (0, 0, 0, 0, speed * 0.0025, False);
+
+ bp->ncolors = 1024;
+ if (!bp->colors)
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ if (MI_COUNT(mi) < 2) MI_COUNT(mi) = 2;
+ if (nlayers < 1) nlayers = 1;
+ if (!bp->discs)
+ bp->discs = (disc *) calloc (nlayers, sizeof (disc));
+
+ for (i = 0; i < nlayers; i++)
+ {
+ double spin_speed = speed * 0.2;
+ double wander_speed = speed * 0.0012;
+ double spin_accel = 0.2;
+
+ bp->discs[i].twist = 0;
+ bp->discs[i].alpha = 1;
+ bp->discs[i].color = i * bp->ncolors / nlayers;
+
+ spin_speed += frand (spin_speed / 5);
+ wander_speed += frand (wander_speed * 3);
+
+ if (!bp->discs[i].rot)
+ bp->discs[i].rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel,
+ (do_wander ? wander_speed : 0),
+ True);
+ }
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (GL_FALSE);
+ glDisable (GL_CULL_FACE);
+
+ if (! wire)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_ONE, GL_ONE);
+ }
+}
+
+
+ENTRYPOINT void
+draw_hypnowheel (ModeInfo *mi)
+{
+ hypnowheel_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, True);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ 0);
+
+ get_rotation (bp->rot, &x, &y, &z, True);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (45, 45, 45);
+
+ for (i = 0; i < nlayers; i++)
+ {
+ disc *d = &bp->discs[i];
+ double x, y, z;
+ rotator *rot = (do_symmetric ? bp->discs[(i & ~0x1)].rot : d->rot);
+ Bool tick = (!do_symmetric || i == 0);
+
+ glPushMatrix();
+
+ d->color++;
+ if (d->color >= bp->ncolors)
+ d->color = 0;
+
+ get_position (rot, &x, &y, &z, tick);
+ x -= 0.5;
+ y -= 0.5;
+ x *= 0.1;
+ y *= 0.1;
+
+ glTranslatef (x, y, 0);
+ d->twist = (z * twistiness *
+ ((i & 1) ? 1 : -1));
+
+ get_rotation (rot, &x, &y, &z, tick);
+
+ glRotatef (360 * z, 0, 0, 1); /* rotation of this disc */
+
+ draw_spiral (mi, &bp->discs[i]);
+ glPopMatrix();
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT Bool
+hypnowheel_handle_event (ModeInfo *mi, XEvent *event)
+{
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ init_hypnowheel (mi);
+ return True;
+ }
+ return False;
+}
+
+
+XSCREENSAVER_MODULE ("Hypnowheel", hypnowheel)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hypnowheel.man b/hacks/glx/hypnowheel.man
new file mode 100644
index 0000000..233c945
--- /dev/null
+++ b/hacks/glx/hypnowheel.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hypnowheel - draws overlapping, translucent spiral patterns
+.SH SYNOPSIS
+.B hypnowheel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIint\fP]
+[\-layers \fIint\fP]
+[\-count \fIint\fP]
+[\-twistiness \fIfloat\fP]
+[\-speed \fIfloat\fP]
+[\-wander\fP]
+[\-symmetric\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a series of overlapping, translucent spiral patterns.
+The tightness of their spirals fluctuates in and out.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fIint\fP
+Delay between frames, in microseconds. Default 20000.
+.TP 8
+.B \-layers \fIint\fP
+How many different spirals to draw at once. Default 4.
+.TP 8
+.B \-count \fIint\fP
+How many arms each spiral should have. Default 11.
+.TP 8
+.B \-twistiness \fIfloat\fP
+How tightly wound the spirals can become, measured in rotations.
+Default 4.0 (four times around).
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-wander
+If specified, then the centers of the spirals will wander around,
+rather than them all having the same origin.
+.TP 8
+.B \-symmetric
+If specified, then each pair of left-wrapping and right-wrapping
+spirals will be mirror images of each other.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2008 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/involute.c b/hacks/glx/involute.c
new file mode 100644
index 0000000..5b49bf0
--- /dev/null
+++ b/hacks/glx/involute.c
@@ -0,0 +1,998 @@
+/* involute, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Utilities for rendering OpenGL gears with involute teeth.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "screenhackI.h"
+
+#ifndef HAVE_JWXYZ
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "involute.h"
+#include "normals.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+/* For debugging: if true then in wireframe, do not abbreviate. */
+static Bool wire_all_p = False;
+static Bool show_normals_p = False;
+
+
+/* Draws an uncapped tube of the given radius extending from top to bottom,
+ with faces pointing either in or out.
+ */
+static int
+draw_ring (int segments,
+ GLfloat r, GLfloat top, GLfloat bottom, GLfloat slope,
+ Bool in_p, Bool wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat width = M_PI * 2 / segments;
+
+ GLfloat s1 = 1 + ((bottom-top) * slope / 2);
+ GLfloat s2 = 1 - ((bottom-top) * slope / 2);
+
+ if (top != bottom)
+ {
+ glFrontFace (in_p ? GL_CCW : GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < segments + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ if (in_p)
+ glNormal3f (-cth, -sth, 0);
+ else
+ glNormal3f (cth, sth, 0);
+ glVertex3f (s1 * cth * r, s1 * sth * r, top);
+ glVertex3f (s2 * cth * r, s2 * sth * r, bottom);
+ }
+ polys += segments;
+ glEnd();
+ }
+
+ if (wire_p)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < segments; i++)
+ {
+ GLfloat th = i * width;
+ glVertex3f (cos(th) * r, sin(th) * r, top);
+ }
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < segments; i++)
+ {
+ GLfloat th = i * width;
+ glVertex3f (cos(th) * r, sin(th) * r, bottom);
+ }
+ glEnd();
+ }
+
+ return polys;
+}
+
+
+/* Draws a donut-shaped disc between the given radii,
+ with faces pointing either up or down.
+ The first radius may be 0, in which case, a filled disc is drawn.
+ */
+static int
+draw_disc (int segments,
+ GLfloat ra, GLfloat rb, GLfloat z,
+ Bool up_p, Bool wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat width = M_PI * 2 / segments;
+
+ if (ra < 0) abort();
+ if (rb <= 0) abort();
+
+ if (ra == 0)
+ glFrontFace (up_p ? GL_CW : GL_CCW);
+ else
+ glFrontFace (up_p ? GL_CCW : GL_CW);
+
+ if (ra == 0)
+ glBegin (wire_p ? GL_LINES : GL_TRIANGLE_FAN);
+ else
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+
+ glNormal3f (0, 0, (up_p ? -1 : 1));
+
+ if (ra == 0 && !wire_p)
+ glVertex3f (0, 0, z);
+
+ for (i = 0; i < segments + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ if (wire_p || ra != 0)
+ glVertex3f (cth * ra, sth * ra, z);
+ glVertex3f (cth * rb, sth * rb, z);
+ }
+ polys += segments;
+ glEnd();
+ return polys;
+}
+
+
+/* Draws N thick radial lines between the given radii,
+ with faces pointing either up or down.
+ */
+static int
+draw_spokes (int n, GLfloat thickness, int segments,
+ GLfloat ra, GLfloat rb, GLfloat z1, GLfloat z2, GLfloat slope,
+ Bool wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat width;
+ int segments2 = 0;
+ int insegs, outsegs;
+ int tick;
+ int state;
+
+ GLfloat s1 = 1 + ((z2-z1) * slope / 2);
+ GLfloat s2 = 1 - ((z2-z1) * slope / 2);
+
+ if (ra <= 0 || rb <= 0) abort();
+
+ segments *= 3;
+
+ while (segments2 < segments) /* need a multiple of N >= segments */
+ segments2 += n; /* (yes, this is a moronic way to find that) */
+
+ insegs = ((float) (segments2 / n) + 0.5) / thickness;
+ outsegs = (segments2 / n) - insegs;
+ if (insegs <= 0) insegs = 1;
+ if (outsegs <= 0) outsegs = 1;
+
+ segments2 = (insegs + outsegs) * n;
+ width = M_PI * 2 / segments2;
+
+ tick = 0;
+ state = 0;
+ for (i = 0; i < segments2; i++, tick++)
+ {
+ GLfloat th1 = i * width;
+ GLfloat th2 = th1 + width;
+ GLfloat cth1 = cos(th1);
+ GLfloat sth1 = sin(th1);
+ GLfloat cth2 = cos(th2);
+ GLfloat sth2 = sin(th2);
+ GLfloat orb = rb;
+
+ int changed = (i == 0);
+
+ if (state == 0 && tick == insegs)
+ tick = 0, state = 1, changed = 1;
+ else if (state == 1 && tick == outsegs)
+ tick = 0, state = 0, changed = 1;
+
+ if ((state == 1 || /* in */
+ (state == 0 && changed)) &&
+ (!wire_p || wire_all_p))
+ {
+ /* top */
+ glFrontFace (GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ glNormal3f (0, 0, -1);
+ glVertex3f (s1 * cth1 * ra, s1 * sth1 * ra, z1);
+ glVertex3f (s1 * cth1 * rb, s1 * sth1 * rb, z1);
+ glVertex3f (s1 * cth2 * rb, s1 * sth2 * rb, z1);
+ glVertex3f (s1 * cth2 * ra, s1 * sth2 * ra, z1);
+ polys++;
+ glEnd();
+
+ /* bottom */
+ glFrontFace (GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ glNormal3f (0, 0, 1);
+ glVertex3f (s2 * cth1 * ra, s2 * sth1 * ra, z2);
+ glVertex3f (s2 * cth1 * rb, s2 * sth1 * rb, z2);
+ glVertex3f (s2 * cth2 * rb, s2 * sth2 * rb, z2);
+ glVertex3f (s2 * cth2 * ra, s2 * sth2 * ra, z2);
+ polys++;
+ glEnd();
+ }
+
+ if (state == 1 && changed) /* entering "in" state */
+ {
+ /* left */
+ glFrontFace (GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ do_normal (s1 * cth1 * rb, s1 * sth1 * rb, z1,
+ s1 * cth1 * ra, s1 * sth1 * ra, z1,
+ s2 * cth1 * rb, s2 * sth1 * rb, z2);
+ glVertex3f (s1 * cth1 * ra, s1 * sth1 * ra, z1);
+ glVertex3f (s1 * cth1 * rb, s1 * sth1 * rb, z1);
+ glVertex3f (s2 * cth1 * rb, s2 * sth1 * rb, z2);
+ glVertex3f (s2 * cth1 * ra, s2 * sth1 * ra, z2);
+ polys++;
+ glEnd();
+ }
+
+ if (state == 0 && changed) /* entering "out" state */
+ {
+ /* right */
+ glFrontFace (GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ do_normal (s1 * cth2 * ra, s1 * sth2 * ra, z1,
+ s1 * cth2 * rb, s1 * sth2 * rb, z1,
+ s2 * cth2 * rb, s2 * sth2 * rb, z2);
+ glVertex3f (s1 * cth2 * ra, s1 * sth2 * ra, z1);
+ glVertex3f (s1 * cth2 * rb, s1 * sth2 * rb, z1);
+ glVertex3f (s2 * cth2 * rb, s2 * sth2 * rb, z2);
+ glVertex3f (s2 * cth2 * ra, s2 * sth2 * ra, z2);
+ polys++;
+ glEnd();
+ }
+
+ rb = orb;
+ }
+ return polys;
+}
+
+
+/* Draws some bumps (embedded cylinders) on the gear.
+ */
+static int
+draw_gear_nubs (gear *g, Bool wire_p)
+{
+ int polys = 0;
+ int i;
+ int steps = (g->size < INVOLUTE_LARGE ? 5 : 20);
+ double r, size, height;
+ GLfloat *cc;
+ int which;
+ GLfloat width, off;
+
+ if (! g->nubs) return 0;
+
+ which = involute_biggest_ring (g, &r, &size, &height);
+ size /= 5;
+ height *= 0.7;
+
+ cc = (which == 1 ? g->color : g->color2);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cc);
+
+ if (g->inverted_p)
+ r = g->r + size + g->tooth_h;
+
+ width = M_PI * 2 / g->nubs;
+ off = M_PI / (g->nteeth * 2); /* align first nub with a tooth */
+
+ for (i = 0; i < g->nubs; i++)
+ {
+ GLfloat th = (i * width) + off;
+ glPushMatrix();
+
+ glRotatef (th * 180 / M_PI, 0, 0, 1);
+ glTranslatef (r, 0, 0);
+
+ if (g->inverted_p) /* nubs go on the outside rim */
+ {
+ size = g->thickness / 3;
+ height = (g->r - g->inner_r)/2;
+ glTranslatef (height, 0, 0);
+ glRotatef (90, 0, 1, 0);
+ }
+
+ if (wire_p && !wire_all_p)
+ polys += draw_ring ((g->size >= INVOLUTE_LARGE ? steps/2 : steps),
+ size, 0, 0, 0, False, wire_p);
+ else
+ {
+ polys += draw_disc (steps, 0, size, -height, True, wire_p);
+ polys += draw_disc (steps, 0, size, height, False, wire_p);
+ polys += draw_ring (steps, size, -height, height, 0, False, wire_p);
+ }
+ glPopMatrix();
+ }
+ return polys;
+}
+
+
+
+/* Draws a much simpler representation of a gear.
+ Returns the number of polygons.
+ */
+int
+draw_involute_schematic (gear *g, Bool wire_p)
+{
+ int polys = 0;
+ int i;
+ GLfloat width = M_PI * 2 / g->nteeth;
+
+ if (!wire_p) glDisable(GL_LIGHTING);
+ glColor3f (g->color[0] * 0.6, g->color[1] * 0.6, g->color[2] * 0.6);
+
+ glBegin (GL_LINES);
+ for (i = 0; i < g->nteeth; i++)
+ {
+ GLfloat th = (i * width) + (width/4);
+ glVertex3f (0, 0, -g->thickness/2);
+ glVertex3f (cos(th) * g->r, sin(th) * g->r, -g->thickness/2);
+ }
+ polys += g->nteeth;
+ glEnd();
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < g->nteeth; i++)
+ {
+ GLfloat th = (i * width) + (width/4);
+ glVertex3f (cos(th) * g->r, sin(th) * g->r, -g->thickness/2);
+ }
+ polys += g->nteeth;
+ glEnd();
+
+ if (!wire_p) glEnable(GL_LIGHTING);
+ return polys;
+}
+
+
+/* Renders all the interior (non-toothy) parts of a gear:
+ the discs, axles, etc.
+ */
+static int
+draw_gear_interior (gear *g, Bool wire_p)
+{
+ int polys = 0;
+
+ int steps = g->nteeth * 2;
+ if (steps < 10) steps = 10;
+ if ((wire_p && !wire_all_p) || g->size < INVOLUTE_LARGE) steps /= 2;
+ if (g->size < INVOLUTE_LARGE && steps > 16) steps = 16;
+
+ /* ring 1 (facing in) is done in draw_gear_teeth */
+
+ /* ring 2 (facing in) and disc 2
+ */
+ if (g->inner_r2)
+ {
+ GLfloat ra = g->inner_r * 1.04; /* slightly larger than inner_r */
+ GLfloat rb = g->inner_r2; /* since the points don't line up */
+ GLfloat za = -g->thickness2/2;
+ GLfloat zb = g->thickness2/2;
+ GLfloat s1 = 1 + (g->thickness2 * g->tooth_slope / 2);
+ GLfloat s2 = 1 - (g->thickness2 * g->tooth_slope / 2);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color2);
+
+ if ((g->coax_p != 1 && !g->inner_r3) ||
+ (wire_p && wire_all_p))
+ polys += /* ring facing in */
+ draw_ring (steps, rb, za, zb, g->tooth_slope, True, wire_p);
+
+ if (wire_p && wire_all_p)
+ polys += /* ring facing in */
+ draw_ring (steps, ra, za, zb, g->tooth_slope, True, wire_p);
+
+ if (g->spokes)
+ polys += draw_spokes (g->spokes, g->spoke_thickness,
+ steps, ra, rb, za, zb, g->tooth_slope, wire_p);
+ else if (!wire_p || wire_all_p)
+ {
+ polys += /* top plate */
+ draw_disc (steps, s1*ra, s1*rb, za, True, wire_p);
+ polys += /* bottom plate */
+ draw_disc (steps, s2*ra, s2*rb, zb, False, wire_p);
+ }
+ }
+
+ /* ring 3 (facing in and out) and disc 3
+ */
+ if (g->inner_r3)
+ {
+ GLfloat ra = g->inner_r2;
+ GLfloat rb = g->inner_r3;
+ GLfloat za = -g->thickness3/2;
+ GLfloat zb = g->thickness3/2;
+ GLfloat s1 = 1 + (g->thickness3 * g->tooth_slope / 2);
+ GLfloat s2 = 1 - (g->thickness3 * g->tooth_slope / 2);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+
+ polys += /* ring facing out */
+ draw_ring (steps, ra, za, zb, g->tooth_slope, False, wire_p);
+
+ if (g->coax_p != 1 || (wire_p && wire_all_p))
+ polys += /* ring facing in */
+ draw_ring (steps, rb, za, zb, g->tooth_slope, True, wire_p);
+
+ if (!wire_p || wire_all_p)
+ {
+ polys += /* top plate */
+ draw_disc (steps, s1*ra, s1*rb, za, True, wire_p);
+ polys += /* bottom plate */
+ draw_disc (steps, s2*ra, s2*rb, zb, False, wire_p);
+ }
+ }
+
+ /* axle tube
+ */
+ if (g->coax_p == 1)
+ {
+ GLfloat cap_height = g->coax_thickness/3;
+
+ GLfloat ra = (g->inner_r3 ? g->inner_r3 :
+ g->inner_r2 ? g->inner_r2 :
+ g->inner_r);
+ GLfloat za = -(g->thickness/2 + cap_height);
+ GLfloat zb = g->coax_thickness/2 + g->coax_displacement + cap_height;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+
+ if (wire_p && !wire_all_p) steps /= 2;
+
+ polys +=
+ draw_ring (steps, ra, za, zb, g->tooth_slope, False, wire_p);
+
+ if (!wire_p || wire_all_p)
+ {
+ polys +=
+ draw_disc (steps, 0, ra, za, True, wire_p); /* top plate */
+ polys +=
+ draw_disc (steps, 0, ra, zb, False, wire_p); /* bottom plate */
+ }
+ }
+ return polys;
+}
+
+
+/* gear_teeth_geometry computes the vertices and normals of the teeth
+ of a gear. This is the heavy lifting: there are a ton of polygons
+ around the perimiter of a gear, and the normals are difficult (not
+ radial or right angles.)
+
+ It would be nice if we could cache this, but the numbers are
+ different for essentially every gear:
+
+ - Every gear has a different inner_r, so the vertices of the
+ inner ring (and thus, the triangle fans on the top and bottom
+ faces) are different in a non-scalable way.
+
+ - If the ratio between tooth_w and tooth_h changes, the normals
+ on the outside edges of the teeth are invalid (this can happen
+ every time we start a new train.)
+
+ So instead, we rely on OpenGL display lists to do the cacheing for
+ us -- we only compute all these normals once per gear, instead of
+ once per gear per frame.
+ */
+
+typedef struct {
+ int npoints;
+ XYZ *points;
+ XYZ *fnormals; /* face normals */
+ XYZ *pnormals; /* point normals */
+} tooth_face;
+
+
+static void
+tooth_normals (tooth_face *f, GLfloat tooth_slope)
+{
+ int i;
+
+ /* Compute the face normals for each facet. */
+ for (i = 0; i < f->npoints; i++)
+ {
+ XYZ p1, p2, p3;
+ int a = i;
+ int b = (i == f->npoints-1 ? 0 : i+1);
+ p1 = f->points[a];
+ p2 = f->points[b];
+ p3 = p1;
+ p3.x -= (p3.x * tooth_slope);
+ p3.y -= (p3.y * tooth_slope);
+ p3.z++;
+ f->fnormals[i] = calc_normal (p1, p2, p3);
+ }
+
+ /* From the face normals, compute the vertex normals
+ (by averaging the normals of adjascent faces.)
+ */
+ for (i = 0; i < f->npoints; i++)
+ {
+ int a = (i == 0 ? f->npoints-1 : i-1);
+ int b = i;
+ XYZ n1 = f->fnormals[a]; /* normal of [i-1 - i] face */
+ XYZ n2 = f->fnormals[b]; /* normal of [i - i+1] face */
+ f->pnormals[i].x = (n1.x + n2.x) / 2;
+ f->pnormals[i].y = (n1.y + n2.y) / 2;
+ f->pnormals[i].z = (n1.z + n2.z) / 2;
+ }
+}
+
+
+static void
+gear_teeth_geometry (gear *g,
+ tooth_face *orim, /* outer rim (the teeth) */
+ tooth_face *irim) /* inner rim (the hole) */
+{
+ int i;
+ int ppt = 20; /* max points per tooth */
+ GLfloat width = M_PI * 2 / g->nteeth;
+ GLfloat rh = g->tooth_h;
+ GLfloat tw = width;
+
+ /* Approximate shape of an "involute" gear tooth.
+
+ (TH)
+ th0 th2 th4 th6 th8 t10 t12 t14 th16 th18 th20
+ : : : : : : : : : : :
+ : : : : : : : : : : :
+ r0 ........:..:..:...___________...:..:..:......:......:..
+ : : : /: : :\ : : : : :
+ : : : / : : : \ : : : : :
+ : : :/ : : : \: : : : :
+ r2 ........:.....@...:....:....:...@..:..:......:......:..
+ : : @: : : : :@ : : : :
+ (R) ...........:...@.:...:....:....:...:.@..........:......:......
+ : :@ : : : : : @: : : :
+ r4 ........:..@..:...:....:....:...:..@:........:......:..
+ : /: : : : : : :\ : : :
+ :/ : : : : : : : \: : : /
+ r6 ......__/..:..:...:....:....:...:..:..\______________/
+ : : : : : : : : : : :
+ | : : : : : : : | : :
+ : : : : : : : : : : :
+ | : : : : : : : | : :
+ r8 ......__:_____________________________:________________
+ */
+
+ GLfloat r[30];
+ GLfloat th[30];
+ GLfloat R = g->r;
+
+ r[0] = R + (rh * 0.50);
+ r[1] = R + (rh * 0.40);
+ r[2] = R + (rh * 0.25);
+ r[3] = R + (rh * 0.05);
+ r[4] = R - (r[2]-R);
+ r[5] = R - (r[1]-R);
+ r[6] = R - (r[0]-R);
+ r[7] = r[6]; /* unused */
+ r[8] = g->inner_r;
+
+ th[0] = -tw * (g->size == INVOLUTE_SMALL ? 0.5 :
+ g->size == INVOLUTE_MEDIUM ? 0.41 : 0.45);
+ th[1] = -tw * 0.375;
+ th[2] = -tw * 0.300;
+ th[3] = -tw * 0.230;
+ th[4] = -tw * (g->nteeth >= 5 ? 0.16 : 0.12);
+ th[5] = -tw * 0.100;
+ th[6] = -tw * (g->size == INVOLUTE_MEDIUM ? 0.1 : 0.04);
+ th[7] = -tw * 0.020;
+ th[8] = 0;
+ th[9] = -th[7];
+ th[10] = -th[6];
+ th[11] = -th[5];
+ th[12] = -th[4];
+ th[13] = -th[3];
+ th[14] = -th[2];
+ th[15] = -th[1];
+ th[16] = -th[0];
+ th[17] = width * 0.47;
+ th[18] = width * 0.50;
+ th[19] = width * 0.53;
+ th[20] = th[0] + width; /* unused */
+
+ if (g->inverted_p) /* put the teeth on the inside */
+ {
+ for (i = 0; i < countof(th); i++)
+ th[i] = -th[i];
+ for (i = 0; i < countof(r); i++)
+ r[i] = R - (r[i] - R);
+ }
+
+ orim->npoints = 0;
+ orim->points = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->points));
+ orim->fnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->fnormals));
+ orim->pnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->pnormals));
+
+ irim->npoints = 0;
+ irim->points = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->points));
+ irim->fnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->fnormals));
+ irim->pnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->pnormals));
+
+ if (!orim->points || !orim->pnormals || !orim->fnormals ||
+ !irim->points || !irim->pnormals || !irim->fnormals)
+ {
+ fprintf (stderr, "%s: out of memory\n", progname);
+ exit (1);
+ }
+
+ /* First, compute the coordinates of every point used for every tooth.
+ */
+ for (i = 0; i < g->nteeth; i++)
+ {
+ GLfloat TH = (i * width) + (width/4);
+ int oon = orim->npoints;
+ int oin = irim->npoints;
+
+# undef PUSH
+# define PUSH(OPR,IPR,PTH) \
+ orim->points[orim->npoints].x = cos(TH+th[(PTH)]) * r[(OPR)]; \
+ orim->points[orim->npoints].y = sin(TH+th[(PTH)]) * r[(OPR)]; \
+ orim->npoints++; \
+ irim->points[irim->npoints].x = cos(TH+th[(PTH)]) * r[(IPR)]; \
+ irim->points[irim->npoints].y = sin(TH+th[(PTH)]) * r[(IPR)]; \
+ irim->npoints++
+
+ switch (g->size) {
+ case INVOLUTE_SMALL:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(0, 8, 8); /* tooth top middle */
+ break;
+ case INVOLUTE_MEDIUM:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(0, 8, 6); /* tooth top left */
+ PUSH(0, 8, 10); /* tooth top right */
+ PUSH(6, 8, 16); /* tooth right 6 */
+ break;
+ case INVOLUTE_LARGE:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(4, 8, 2); /* tooth left 3 */
+ PUSH(2, 8, 4); /* tooth left 5 */
+ PUSH(0, 8, 6); /* tooth top left */
+ PUSH(0, 8, 10); /* tooth top right */
+ PUSH(2, 8, 12); /* tooth right 1 */
+ PUSH(4, 8, 14); /* tooth right 3 */
+ PUSH(6, 8, 16); /* tooth right 5 */
+ PUSH(6, 8, 18); /* gap top */
+ break;
+ case INVOLUTE_HUGE:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(5, 8, 1); /* tooth left 2 */
+ PUSH(4, 8, 2); /* tooth left 3 */
+ PUSH(3, 8, 3); /* tooth left 4 */
+ PUSH(2, 8, 4); /* tooth left 5 */
+ PUSH(1, 8, 5); /* tooth left 6 */
+ PUSH(0, 8, 6); /* tooth top left */
+ PUSH(0, 8, 8); /* tooth top left */
+ PUSH(0, 8, 10); /* tooth top right */
+ PUSH(1, 8, 11); /* tooth top right */
+ PUSH(2, 8, 12); /* tooth right 1 */
+ PUSH(3, 8, 13); /* tooth right 2 */
+ PUSH(4, 8, 14); /* tooth right 3 */
+ PUSH(5, 8, 15); /* tooth right 4 */
+ PUSH(6, 8, 16); /* tooth right 5 */
+ PUSH(6, 8, 17); /* tooth right 6 */
+ PUSH(6, 8, 18); /* gap top */
+ PUSH(6, 8, 19); /* gap top */
+ break;
+ default:
+ abort();
+ }
+# undef PUSH
+
+ if (i == 0 && orim->npoints > ppt) abort(); /* go update "ppt"! */
+
+ if (g->inverted_p)
+ {
+ int start, end, j;
+ start = oon;
+ end = orim->npoints;
+ for (j = 0; j < (end-start)/2; j++)
+ {
+ XYZ swap = orim->points[end-j-1];
+ orim->points[end-j-1] = orim->points[start+j];
+ orim->points[start+j] = swap;
+ }
+
+ start = oin;
+ end = irim->npoints;
+ for (j = 0; j < (end-start)/2; j++)
+ {
+ XYZ swap = irim->points[end-j-1];
+ irim->points[end-j-1] = irim->points[start+j];
+ irim->points[start+j] = swap;
+ }
+ }
+ }
+
+ tooth_normals (orim, g->tooth_slope);
+ tooth_normals (irim, 0);
+
+ if (g->inverted_p) /* flip the normals */
+ {
+ for (i = 0; i < orim->npoints; i++)
+ {
+ orim->fnormals[i].x = -orim->fnormals[i].x;
+ orim->fnormals[i].y = -orim->fnormals[i].y;
+ orim->fnormals[i].z = -orim->fnormals[i].z;
+
+ orim->pnormals[i].x = -orim->pnormals[i].x;
+ orim->pnormals[i].y = -orim->pnormals[i].y;
+ orim->pnormals[i].z = -orim->pnormals[i].z;
+ }
+
+ for (i = 0; i < irim->npoints; i++)
+ {
+ irim->fnormals[i].x = -irim->fnormals[i].x;
+ irim->fnormals[i].y = -irim->fnormals[i].y;
+ irim->fnormals[i].z = -irim->fnormals[i].z;
+
+ irim->pnormals[i].x = -irim->pnormals[i].x;
+ irim->pnormals[i].y = -irim->pnormals[i].y;
+ irim->pnormals[i].z = -irim->pnormals[i].z;
+ }
+ }
+}
+
+
+/* Which of the gear's inside rings is the biggest?
+ */
+int
+involute_biggest_ring (gear *g, double *posP, double *sizeP, double *heightP)
+{
+ double r0 = (g->r - g->tooth_h/2);
+ double r1 = g->inner_r;
+ double r2 = g->inner_r2;
+ double r3 = g->inner_r3;
+ double w1 = (r1 ? r0 - r1 : r0);
+ double w2 = (r2 ? r1 - r2 : 0);
+ double w3 = (r3 ? r2 - r3 : 0);
+ double h1 = g->thickness;
+ double h2 = g->thickness2;
+ double h3 = g->thickness3;
+
+ if (g->spokes) w2 = 0;
+
+ if (w1 > w2 && w1 > w3)
+ {
+ if (posP) *posP = (r0+r1)/2;
+ if (sizeP) *sizeP = w1;
+ if (heightP) *heightP = h1;
+ return 0;
+ }
+ else if (w2 > w1 && w2 > w3)
+ {
+ if (posP) *posP = (r1+r2)/2;
+ if (sizeP) *sizeP = w2;
+ if (heightP) *heightP = h2;
+ return 1;
+ }
+ else
+ {
+ if (posP) *posP = (r2+r3)/2;
+ if (sizeP) *sizeP = w3;
+ if (heightP) *heightP = h3;
+ return 1;
+ }
+}
+
+
+/* Renders all teeth of a gear.
+ */
+static int
+draw_gear_teeth (gear *g, Bool wire_p)
+{
+ int polys = 0;
+ int i;
+
+ GLfloat z1 = -g->thickness/2;
+ GLfloat z2 = g->thickness/2;
+ GLfloat s1 = 1 + (g->thickness * g->tooth_slope / 2);
+ GLfloat s2 = 1 - (g->thickness * g->tooth_slope / 2);
+
+ tooth_face orim, irim;
+ gear_teeth_geometry (g, &orim, &irim);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+
+ /* Draw the outer rim (the teeth)
+ (In wire mode, this draws just the upright lines.)
+ */
+ glFrontFace (g->inverted_p ? GL_CCW : GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < orim.npoints; i++)
+ {
+ glNormal3f (orim.pnormals[i].x, orim.pnormals[i].y, orim.pnormals[i].z);
+ glVertex3f (s1*orim.points[i].x, s1*orim.points[i].y, z1);
+ glVertex3f (s2*orim.points[i].x, s2*orim.points[i].y, z2);
+
+ /* Show the face normal vectors */
+ if (0&&wire_p && show_normals_p)
+ {
+ XYZ n = orim.fnormals[i];
+ int a = i;
+ int b = (i == orim.npoints-1 ? 0 : i+1);
+ GLfloat x = (orim.points[a].x + orim.points[b].x) / 2;
+ GLfloat y = (orim.points[a].y + orim.points[b].y) / 2;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x + n.x, y + n.y, z + n.z);
+ }
+
+ /* Show the vertex normal vectors */
+ if (wire_p && show_normals_p)
+ {
+ XYZ n = orim.pnormals[i];
+ GLfloat x = orim.points[i].x;
+ GLfloat y = orim.points[i].y;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x + n.x, y + n.y, z + n.z);
+ }
+ }
+
+ if (!wire_p) /* close the quad loop */
+ {
+ glNormal3f (orim.pnormals[0].x, orim.pnormals[0].y, orim.pnormals[0].z);
+ glVertex3f (s1*orim.points[0].x, s1*orim.points[0].y, z1);
+ glVertex3f (s2*orim.points[0].x, s2*orim.points[0].y, z2);
+ }
+ polys += orim.npoints;
+ glEnd();
+
+ /* Draw the outer rim circles, in wire mode */
+ if (wire_p)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < orim.npoints; i++)
+ glVertex3f (s1*orim.points[i].x, s1*orim.points[i].y, z1);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < orim.npoints; i++)
+ glVertex3f (s2*orim.points[i].x, s2*orim.points[i].y, z2);
+ glEnd();
+ }
+
+ /* Draw the inner rim (the hole)
+ (In wire mode, this draws just the upright lines.)
+ */
+ glFrontFace (g->inverted_p ? GL_CW : GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < irim.npoints; i++)
+ {
+ glNormal3f(-irim.pnormals[i].x, -irim.pnormals[i].y,-irim.pnormals[i].z);
+ glVertex3f (s1*irim.points[i].x, s1*irim.points[i].y, z1);
+ glVertex3f (s2*irim.points[i].x, s2*irim.points[i].y, z2);
+
+ /* Show the face normal vectors */
+ if (wire_p && show_normals_p)
+ {
+ XYZ n = irim.fnormals[i];
+ int a = i;
+ int b = (i == irim.npoints-1 ? 0 : i+1);
+ GLfloat x = (irim.points[a].x + irim.points[b].x) / 2;
+ GLfloat y = (irim.points[a].y + irim.points[b].y) / 2;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x - n.x, y - n.y, z);
+ }
+
+ /* Show the vertex normal vectors */
+ if (wire_p && show_normals_p)
+ {
+ XYZ n = irim.pnormals[i];
+ GLfloat x = irim.points[i].x;
+ GLfloat y = irim.points[i].y;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x - n.x, y - n.y, z);
+ }
+ }
+
+ if (!wire_p) /* close the quad loop */
+ {
+ glNormal3f (-irim.pnormals[0].x,-irim.pnormals[0].y,-irim.pnormals[0].z);
+ glVertex3f (s1*irim.points[0].x, s1*irim.points[0].y, z1);
+ glVertex3f (s2*irim.points[0].x, s2*irim.points[0].y, z2);
+ }
+ polys += irim.npoints;
+ glEnd();
+
+ /* Draw the inner rim circles, in wire mode
+ */
+ if (wire_p)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < irim.npoints; i++)
+ glVertex3f (irim.points[i].x, irim.points[i].y, z1);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < irim.npoints; i++)
+ glVertex3f (irim.points[i].x, irim.points[i].y, z2);
+ glEnd();
+ }
+
+ /* Draw the side (the flat bit)
+ */
+ if (!wire_p || wire_all_p)
+ {
+ GLfloat z;
+ if (irim.npoints != orim.npoints) abort();
+ for (z = z1; z <= z2; z += z2-z1)
+ {
+ GLfloat s = (z == z1 ? s1 : s2);
+ glFrontFace (((z == z1) ^ g->inverted_p) ? GL_CCW : GL_CW);
+ glNormal3f (0, 0, z);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < orim.npoints; i++)
+ {
+ glVertex3f (s*orim.points[i].x, s*orim.points[i].y, z);
+ glVertex3f (s*irim.points[i].x, s*irim.points[i].y, z);
+ }
+ if (!wire_p) /* close the quad loop */
+ {
+ glVertex3f (s*orim.points[0].x, s*orim.points[0].y, z);
+ glVertex3f (s*irim.points[0].x, s*irim.points[0].y, z);
+ }
+ polys += orim.npoints;
+ glEnd();
+ }
+ }
+
+ free (irim.points);
+ free (irim.fnormals);
+ free (irim.pnormals);
+
+ free (orim.points);
+ free (orim.fnormals);
+ free (orim.pnormals);
+
+ return polys;
+}
+
+
+/* Render one gear, unrotated at 0,0.
+ Returns the number of polygons.
+ */
+int
+draw_involute_gear (gear *g, Bool wire_p)
+{
+ int polys = 0;
+
+ static const GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat shiny = 128.0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+ glColor3f (g->color[0], g->color[1], g->color[2]);
+
+ if (wire_p > 1)
+ polys += draw_involute_schematic (g, wire_p);
+ else
+ {
+ glPushMatrix();
+ glRotatef (g->wobble, 1, 0, 0);
+ polys += draw_gear_teeth (g, wire_p);
+ polys += draw_gear_interior (g, wire_p);
+ polys += draw_gear_nubs (g, wire_p);
+ glPopMatrix();
+ }
+ return polys;
+}
diff --git a/hacks/glx/involute.h b/hacks/glx/involute.h
new file mode 100644
index 0000000..c6a3066
--- /dev/null
+++ b/hacks/glx/involute.h
@@ -0,0 +1,78 @@
+/* involute, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Utilities for rendering OpenGL gears with involute teeth.
+ */
+
+#ifndef __GEAR_INVOLUTE_H__
+#define __GEAR_INVOLUTE_H__
+
+typedef struct {
+ unsigned long id; /* unique name */
+ double x, y, z; /* position */
+ double r; /* radius of the gear, at middle of teeth */
+ double th; /* rotation (degrees) */
+
+ GLint nteeth; /* how many teeth */
+ double tooth_w, tooth_h; /* size of teeth */
+
+ double tooth_slope; /* 0 for normal right-angle gear; 1 = 45 deg. */
+ double inner_r; /* radius of the (larger) inside hole */
+ double inner_r2; /* radius of the (smaller) inside hole, if any */
+ double inner_r3; /* yet another */
+
+ double thickness; /* height of the edge */
+ double thickness2; /* height of the (smaller) inside disc if any */
+ double thickness3; /* yet another */
+ int spokes; /* how many spokes inside, if any */
+ int nubs; /* how many little nubbly bits, if any */
+ double spoke_thickness; /* spoke versus hole */
+ double wobble; /* factory defect! */
+ int motion_blur_p; /* whether it's spinning too fast to draw */
+ int polygons; /* how many polys in this gear */
+
+ double ratio; /* gearing ratio with previous gears */
+ double rpm; /* approximate revolutions per minute */
+
+ Bool inverted_p; /* whether this gear has teeth on the inside */
+ Bool base_p; /* whether this gear begins a new train */
+ int coax_p; /* whether this is one of a pair of bound gears.
+ 1 for first, 2 for second. */
+ double coax_displacement; /* distance between gear planes */
+
+ double coax_thickness; /* thickness of the other gear in the pair */
+
+ enum { INVOLUTE_SMALL,
+ INVOLUTE_MEDIUM,
+ INVOLUTE_LARGE,
+ INVOLUTE_HUGE } size; /* Controls complexity of mesh. */
+ GLfloat color[4];
+ GLfloat color2[4];
+
+ GLuint dlist;
+} gear;
+
+/* Render one gear, unrotated at 0,0.
+ Returns the number of polygons.
+ */
+extern int draw_involute_gear (gear *g, Bool wire_p);
+
+/* Draws a much simpler representation of a gear.
+ Returns the number of polygons.
+ */
+extern int draw_involute_schematic (gear *g, Bool wire_p);
+
+/* Which of the gear's inside rings is the biggest?
+ */
+extern int involute_biggest_ring (gear *g,
+ double *posP, double *sizeP,
+ double *heightP);
+
+#endif /* __GEAR_INVOLUTE_H__ */
diff --git a/hacks/glx/jigglypuff.c b/hacks/glx/jigglypuff.c
new file mode 100644
index 0000000..fea13fd
--- /dev/null
+++ b/hacks/glx/jigglypuff.c
@@ -0,0 +1,1076 @@
+/* jigglypuff - a most, most, unfortunate screensaver.
+ *
+ * Copyright (c) 2003 Keith Macleod (kmacleod@primus.ca)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws all varieties of obscene, spastic, puffy balls
+ * orbiting lazily about the screen. More of an accident
+ * than anything else.
+ *
+ * Apologies to anyone who thought they were getting a Pokemon
+ * out of this.
+ *
+ * Of course, if you modify it to do something interesting and/or
+ * funny, I'd appreciate receiving a copy.
+ *
+ * 04/06/2003 - Oops, figured out what was wrong with the sphere
+ * mapping. I had assumed it was done in model space,
+ * but of course I was totally wrong... Eye space you
+ * say? Yup. km
+ *
+ * 03/31/2003 - Added chrome to the color options. The mapping
+ * is anything but 'correct', but it's a pretty good
+ * effect anyways, as long as the surface is jiggling
+ * enough that you can't tell. Sure, it seems kind of odd
+ * that it's reflecting a sky that's obviously not there,
+ * but who has time to worry about silly details like
+ * that? Not me, ah rekkin'. km
+ *
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 20000\n" \
+ "*showFPS: False\n" \
+ "*wireframe: False\n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_jigglypuff 0
+# define release_jigglypuff 0
+# include "xlockmore.h"
+#else
+# include "xlock.h"
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "ximage-loader.h"
+#include "gltrackball.h"
+#include "images/gen/jigglymap_png.h"
+
+#ifdef USE_GL
+
+
+#define DEF_COLOR "cycle"
+#define DEF_SHININESS "100"
+#define DEF_COMPLEXITY "2"
+#define DEF_SPEED "500"
+#define DEF_DISTANCE "100"
+#define DEF_HOLD "800"
+#define DEF_SPHERISM "75"
+#define DEF_DAMPING "500"
+#define DEF_RANDOM "True"
+#define DEF_TETRA "False"
+#define DEF_SPOOKY "0"
+
+#ifndef max
+#define max(a,b) (((a)>(b))?(a):(b))
+#define min(a,b) (((a)<(b))?(a):(b))
+#endif
+
+/* Why isn't RAND_MAX correct in the first place? */
+#define REAL_RAND_MAX (2.0*(float)RAND_MAX)
+
+static int spherism;
+static int hold;
+static int distance;
+static int damping;
+
+static int complexity;
+static int speed;
+
+static int do_tetrahedron;
+static int spooky;
+static char *color;
+static int shininess;
+
+static int random_parms;
+
+typedef struct solid solid;
+
+typedef struct {
+ float stable_distance;
+ float hold_strength;
+ float spherify_strength;
+ float damping_velocity;
+ float damping_factor;
+
+ int do_wireframe;
+ int spooky;
+ int color_style;
+ GLint shininess;
+ GLfloat jiggly_color[4];
+ GLfloat color_dir[3];
+
+ solid *shape;
+
+ trackball_state *trackball;
+ int button_down;
+
+ float angle;
+ float axis;
+ float speed;
+
+ GLXContext *glx_context;
+} jigglystruct;
+
+static jigglystruct *jss = NULL;
+
+static XrmOptionDescRec opts[] = {
+ {"-random", ".Jigglypuff.random", XrmoptionNoArg, "true"},
+ {"+random", ".Jigglypuff.random", XrmoptionNoArg, "false"},
+ {"-tetra", ".Jigglypuff.tetra", XrmoptionNoArg, "true"},
+ {"+tetra", ".Jigglypuff.tetra", XrmoptionNoArg, "false"},
+ {"-spooky", ".Jigglypuff.spooky", XrmoptionSepArg, "0"},
+ {"-color", ".Jigglypuff.color", XrmoptionSepArg, DEF_COLOR},
+ {"-shininess", ".Jigglypuff.shininess", XrmoptionSepArg, DEF_SHININESS},
+ {"-complexity", ".Jigglypuff.complexity", XrmoptionSepArg, DEF_COMPLEXITY},
+ {"-speed", ".Jigglypuff.speed", XrmoptionSepArg, DEF_SPEED},
+ {"-spherism", ".Jigglypuff.spherism", XrmoptionSepArg, DEF_SPHERISM},
+ {"-hold", ".Jigglypuff.hold", XrmoptionSepArg, DEF_HOLD},
+ {"-distance", "Jigglypuff.distance", XrmoptionSepArg, DEF_DISTANCE},
+ {"-damping", "Jigglypuff.damping", XrmoptionSepArg, DEF_DAMPING}
+};
+
+static argtype vars[] = {
+ {&random_parms, "random", "Random", DEF_RANDOM, t_Bool},
+ {&do_tetrahedron, "tetra", "Tetra", DEF_TETRA, t_Bool},
+ {&spooky, "spooky", "Spooky", DEF_SPOOKY, t_Int},
+ {&color, "color", "Color", DEF_COLOR, t_String},
+ {&shininess, "shininess", "Shininess", DEF_SHININESS, t_Int},
+ {&complexity, "complexity", "Complexity", DEF_COMPLEXITY, t_Int},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Int},
+ {&spherism, "spherism", "Spherism", DEF_SPHERISM, t_Int},
+ {&hold, "hold", "Hold", DEF_HOLD, t_Int},
+ {&distance, "distance", "Distance", DEF_DISTANCE, t_Int},
+ {&damping, "damping", "Damping", DEF_DAMPING, t_Int}
+};
+
+#undef countof
+#define countof(x) ((int)(sizeof(x)/sizeof(*(x))))
+
+ENTRYPOINT ModeSpecOpt jigglypuff_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#define COLOR_STYLE_NORMAL 0
+#define COLOR_STYLE_CYCLE 1
+#define COLOR_STYLE_CLOWNBARF 2
+#define COLOR_STYLE_FLOWERBOX 3
+#define COLOR_STYLE_CHROME 4
+
+#define CLOWNBARF_NCOLORS 5
+
+static const GLfloat clownbarf_colors[CLOWNBARF_NCOLORS][4] = {
+ {0.7, 0.7, 0.0, 1.0},
+ {0.8, 0.1, 0.1, 1.0},
+ {0.1, 0.1, 0.8, 1.0},
+ {0.9, 0.9, 0.9, 1.0},
+ {0.0, 0.0, 0.0, 1.0}
+};
+
+static const GLfloat flowerbox_colors[4][4] = {
+ {0.7, 0.7, 0.0, 1.0},
+ {0.9, 0.0, 0.0, 1.0},
+ {0.0, 0.9, 0.0, 1.0},
+ {0.0, 0.0, 0.9, 1.0},
+};
+
+# if 0 /* I am not even going to *try* and make this bullshit compile
+ without warning under gcc -std=c89 -pedantic. -jwz. */
+#ifdef DEBUG
+# ifdef __GNUC__ /* GCC style */
+#define _DEBUG(msg, args...) do { \
+ fprintf(stderr, "%s : %d : " msg ,__FILE__,__LINE__ ,##args); \
+} while(0)
+# else /* C99 standard style */
+#define _DEBUG(msg, ...) do { \
+ fprintf(stderr, "%s : %d : " msg ,__FILE__,__LINE__,__VA_ARGS__); \
+} while(0)
+# endif
+#else
+# ifdef __GNUC__ /* GCC style */
+#define _DEBUG(msg, args...)
+# else /* C99 standard style */
+#define _DEBUG(msg, ...)
+# endif
+#endif
+#endif /* 0 */
+
+/* This is all the half-edge b-rep code (as well as basic geometry) */
+typedef struct face face;
+typedef struct edge edge;
+typedef struct hedge hedge;
+typedef struct vertex vertex;
+typedef GLfloat coord;
+typedef coord vector[3];
+
+struct solid {
+ face *faces;
+ edge *edges;
+ vertex *vertices;
+};
+
+struct face {
+ solid *s;
+ hedge *start;
+ const GLfloat *color;
+ face *next;
+};
+
+struct edge {
+ solid *s;
+ hedge *left;
+ hedge *right;
+ edge *next;
+};
+
+struct hedge {
+ face *f;
+ edge *e;
+ vertex *vtx;
+ hedge *next;
+ hedge *prev;
+};
+
+struct vertex {
+ solid *s;
+ hedge *h;
+ vector v;
+ vector n;
+ vector f;
+ vector vel;
+ vertex *next;
+};
+
+static inline void vector_init(vector v, coord x, coord y, coord z)
+{
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+}
+
+static inline void vector_copy(vector d, vector s)
+{
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+}
+
+static inline void vector_add(vector v1, vector v2, vector v)
+{
+ vector_init(v, v1[0]+v2[0], v1[1]+v2[1], v1[2]+v2[2]);
+}
+
+static inline void vector_add_to(vector v1, vector v2)
+{
+ v1[0] += v2[0];
+ v1[1] += v2[1];
+ v1[2] += v2[2];
+}
+
+static inline void vector_sub(vector v1, vector v2, vector v)
+{
+ vector_init(v, v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2]);
+}
+
+static inline void vector_scale(vector v, coord s)
+{
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+}
+
+/*
+static inline coord dot(vector v1, vector v2)
+{
+ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+*/
+
+static inline void cross(vector v1, vector v2, vector v)
+{
+ vector_init(v,
+ v1[1]*v2[2] - v2[1]*v1[2],
+ v1[2]*v2[0] - v2[2]*v1[0],
+ v1[0]*v2[1] - v2[0]*v1[1]);
+}
+
+static inline coord magnitude2(vector v)
+{
+ return v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
+}
+
+static inline coord magnitude(vector v)
+{
+ return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
+}
+
+static inline void normalize(vector v)
+{
+ coord mag = 1.0/sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
+
+ v[0] *= mag;
+ v[1] *= mag;
+ v[2] *= mag;
+}
+
+static inline void normalize_to(vector v, coord m)
+{
+ coord mag = 1.0/sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2])/m;
+
+ v[0] *= mag;
+ v[1] *= mag;
+ v[2] *= mag;
+}
+
+static inline void midpoint(vector v1, vector v2, vector v)
+{
+ vector_init(v,
+ v1[0] + 0.5 * (v2[0] - v1[0]),
+ v1[1] + 0.5 * (v2[1] - v1[1]),
+ v1[2] + 0.5 * (v2[2] - v1[2]));
+}
+
+static inline hedge *partner(hedge *h) {
+ if(!h->e)
+ return NULL;
+ if(h == h->e->left) {
+ return h->e->right;
+ }
+ else if(h == h->e->right) {
+ return h->e->left;
+ }
+ else {
+/* _DEBUG("Inconsistent edge detected. Presumably, this is a bug. Exiting.\n", NULL); */
+ exit(-1);
+ }
+}
+
+static vertex *vertex_new(solid *s, vector v)
+{
+ vertex *vtx = (vertex*)malloc(sizeof(vertex));
+
+ if(!vtx)
+ return NULL;
+ vtx->s = s;
+ vtx->next = s->vertices;
+ s->vertices = vtx;
+ vector_copy(vtx->v, v);
+ vector_init(vtx->f, 0, 0, 0);
+ vector_init(vtx->vel, 0, 0, 0);
+ return vtx;
+}
+
+/* insert a new halfedge after hafter. this is low-level,
+ * i.e. it is a helper for the split_* functions, which
+ * maintain the consistency of the solid.
+ */
+static hedge *hedge_new(hedge *hafter, vertex *vtx)
+{
+ hedge *h = (hedge*)malloc(sizeof(hedge));
+
+ if(!h) {
+/* _DEBUG("Out of memory in hedge_new()\n",NULL); */
+ return NULL;
+ }
+ h->f = hafter->f;
+ h->vtx = vtx;
+ h->e = NULL;
+ h->prev = hafter;
+ h->next = hafter->next;
+ hafter->next = h;
+ h->next->prev = h;
+ return h;
+}
+
+static edge *edge_new(solid *s)
+{
+ edge *e = (edge*)malloc(sizeof(edge));
+ if(!e) {
+/* _DEBUG("Out of memory in edge_new()\n",NULL);*/
+ exit(-1);
+ }
+ e->next = s->edges;
+ s->edges = e;
+ e-> s = s;
+ e->left = e->right = NULL;
+ return e;
+}
+
+static face *face_new(solid *s, hedge *h)
+{
+ face *f = (face*)malloc(sizeof(face));
+ if(!f) {
+/* _DEBUG("Out of memory in face_new()",NULL);*/
+ exit(-1);
+ }
+ f->s = s;
+ f->start = h;
+ f->next = s->faces;
+ s->faces = f;
+ return f;
+}
+
+/* split vertex vtx, creating a new edge after v on f
+ * that goes to a new vertex at v, adjoining whatever
+ * face is on the other side of the halfedge attached to
+ * v on f.
+ * Assumptions:
+ * there are at least 2 faces.
+ * partner(h)->next->vtx == vtx
+ * Post-assumptions:
+ * the new halfedge will be inserted AFTER the indicated
+ * halfedge. This means that f->start is guaranteed not to
+ * change.
+ * the vertex returned will have h==<the new halfedge>.
+ */
+
+static vertex *vertex_split(hedge *h, vector v)
+{
+ hedge *h2, *hn1, *hn2;
+ vertex *vtxn;
+ edge *en;
+ face *f1;
+
+ f1 = h->f;
+ h2 = partner(h);
+
+ vtxn = vertex_new(f1->s, v);
+ hn1 = hedge_new(h, vtxn);
+ vtxn->h = hn1;
+ hn2 = hedge_new(h2, vtxn);
+ hn2->e = h->e;
+
+ if(h2->e->left == h2)
+ h2->e->left = hn2;
+ else
+ h2->e->right = hn2;
+
+ en = edge_new(f1->s);
+ en->left = hn1;
+ en->right = h2;
+ hn1->e = en;
+ h2->e = en;
+ return vtxn;
+}
+
+static face *face_split(face *f, hedge *h1, hedge *h2)
+{
+ hedge *hn1, *hn2, *tmp;
+ edge *en;
+ face *fn;
+
+ if(h1->f != f || h2->f != f) {
+/* _DEBUG("Whoah, cap'n, yer usin' a bad halfedge!\n",NULL);*/
+ exit(-1);
+ }
+ if(h1 == h2) {
+/* _DEBUG("Trying to split a face at a single vertex\n",NULL);*/
+ exit(-1);
+ }
+ /* close the loops */
+ h1->prev->next = h2;
+ h2->prev->next = h1;
+ tmp = h1->prev;
+ h1->prev = h2->prev;
+ h2->prev = tmp;
+ /* insert halfedges & create edge */
+ hn1 = hedge_new(h2->prev, h1->vtx);
+ hn2 = hedge_new(h1->prev, h2->vtx);
+ en = edge_new(f->s);
+ en->left = hn1;
+ en->right = hn2;
+ hn1->e = en;
+ hn2->e = en;
+
+ /* make the new face, first find out which hedge is contained
+ * in the original face, then start the new face at the other */
+ tmp = f->start;
+ while(tmp != h1 && tmp != h2)
+ tmp = tmp->next;
+ tmp = (tmp == h1) ? h2 : h1 ;
+ fn = face_new(f->s, tmp);
+ do {
+ tmp->f = fn;
+ tmp = tmp->next;
+ } while(tmp != fn->start);
+ fn->color = f->color;
+ return fn;
+}
+
+static solid *solid_new(vector where)
+{
+ solid *s = (solid*)malloc(sizeof(solid));
+ face *f1, *f2;
+ edge *e;
+ vertex *vtx;
+ hedge *h1,*h2;
+
+ s->faces = NULL;
+ s->edges = NULL;
+ s->vertices = NULL;
+
+ h1 = (hedge*)malloc(sizeof(hedge));
+ h2 = (hedge*)malloc(sizeof(hedge));
+ h1->next = h1->prev = h1;
+ h2->next = h2->prev = h2;
+
+ vtx = vertex_new(s, where);
+ vtx->h = h1;
+ h1->vtx = vtx;
+ h2->vtx = vtx;
+
+ e = edge_new(s);
+ e->left = h1;
+ e->right = h2;
+ h1->e = e;
+ h2->e = e;
+
+ f1 = face_new(s, h1);
+ f2 = face_new(s, h2);
+ h1->f = f1;
+ h2->f = f2;
+
+ return s;
+}
+
+/* This is all the code directly related to constructing the jigglypuff */
+static void face_tessel2(face *f)
+{
+ hedge *h1=f->start->prev, *h2=f->start->next;
+
+ if(h1->next == h1)
+ return;
+ while(h2 != h1 && h2->next != h1) {
+ f = face_split(f, h1, h2);
+ h1 = f->start;
+ h2 = f->start->next->next;
+ }
+}
+
+/* This will only work with solids composed entirely of
+ * triangular faces. It first add a vertex to the middle
+ * of each edge, then walks the faces, connecting the
+ * dots.
+ * I'm abusing the fact that new faces and edges are always
+ * added at the head of the list. If that ever changes,
+ * this is borked.
+ */
+static void solid_tesselate(solid *s)
+{
+ edge *e = s->edges;
+ face *f = s->faces;
+
+ while(e) {
+ vector v;
+ midpoint(e->left->vtx->v, e->right->vtx->v, v);
+ vertex_split(e->left, v);
+ e = e->next;
+ }
+ while(f) {
+ face_tessel2(f);
+ f=f->next;
+ }
+}
+
+static void solid_spherify(solid * s, coord size)
+{
+ vertex *vtx = s->vertices;
+
+ while(vtx) {
+ normalize_to(vtx->v, size);
+ vtx = vtx->next;
+ }
+}
+
+static solid *tetrahedron(jigglystruct *js)
+{
+ solid *s;
+ vertex *vtx;
+ vector v;
+ hedge *h;
+ face *f;
+ int i;
+
+ vector_init(v, 1, 1, 1);
+ s = solid_new(v);
+ vector_init(v, -1, -1, 1);
+ h = s->faces->start;
+ vtx = vertex_split(h, v);
+ vector_init(v, -1, 1, -1);
+ vtx = vertex_split(vtx->h, v);
+ h = vtx->h;
+ f = face_split(s->faces, h, h->prev);
+ vector_init(v, 1, -1, -1);
+ vertex_split(f->start, v);
+ f = s->faces->next->next;
+ h = f->start;
+ face_split(f, h, h->next->next);
+
+ if(js->color_style == COLOR_STYLE_FLOWERBOX) {
+ f = s->faces;
+ for(i=0; i<4; i++) {
+ f->color = flowerbox_colors[i];
+ f = f->next;
+ }
+ }
+
+ return s;
+}
+
+static solid *tesselated_tetrahedron(coord size, int iter, jigglystruct *js) {
+ solid *s = tetrahedron(js);
+ int i;
+
+ for(i=0; i<iter; i++) {
+ solid_tesselate(s);
+ }
+ return s;
+}
+
+static void clownbarf_colorize(solid *s) {
+ face *f = s->faces;
+ while(f) {
+ f->color = clownbarf_colors[random() % CLOWNBARF_NCOLORS];
+ f = f->next;
+ }
+}
+
+/* Here be the rendering code */
+
+static inline void vertex_calcnormal(vertex *vtx, jigglystruct *js)
+{
+ hedge *start = vtx->h, *h=start;
+
+ vector_init(vtx->n, 0, 0, 0);
+ do {
+ vector u, v, norm;
+ vector_sub(h->prev->vtx->v, vtx->v, u);
+ vector_sub(h->next->vtx->v, vtx->v, v);
+ cross(u, v, norm);
+ vector_add_to(vtx->n, norm);
+ h = partner(h)->next;
+ } while(h != start);
+ if(!js->spooky)
+ normalize(vtx->n);
+ else
+ vector_scale(vtx->n, js->spooky);
+}
+
+static inline void vertex_render(vertex *vtx, jigglystruct *js)
+{
+ glNormal3fv(vtx->n);
+ glVertex3fv(vtx->v);
+}
+
+/* This can be optimized somewhat due to the fact that all
+ * the faces are triangles. I haven't actually tested to
+ * see what the cost is of calling glBegin/glEnd for each
+ * triangle.
+ */
+static inline int face_render(face *f, jigglystruct *js)
+{
+ hedge *h1, *h2, *hend;
+ int polys = 0;
+
+ h1 = f->start;
+ hend = h1->prev;
+ h2 = h1->next;
+
+ if(js->color_style == COLOR_STYLE_FLOWERBOX ||
+ js->color_style == COLOR_STYLE_CLOWNBARF)
+ glColor4fv(f->color);
+ glBegin(GL_TRIANGLES);
+ while(h1 != hend && h2 !=hend) {
+ vertex_render(h1->vtx, js);
+ vertex_render(h2->vtx, js);
+ vertex_render(hend->vtx, js);
+ h1 = h2;
+ h2 = h1->next;
+ polys++;
+ }
+ glEnd();
+ return polys;
+}
+
+static int jigglypuff_render(jigglystruct *js)
+{
+ int polys = 0;
+ face *f = js->shape->faces;
+ vertex *vtx = js->shape->vertices;
+
+ while(vtx) {
+ vertex_calcnormal(vtx, js);
+ vtx = vtx->next;
+ }
+ while(f) {
+ polys += face_render(f, js);
+ f=f->next;
+ }
+ return polys;
+}
+
+/* This is the jiggling code */
+
+/* stable distance when subdivs == 4 */
+#define STABLE_DISTANCE 0.088388347648
+
+static void update_shape(jigglystruct *js)
+{
+ vertex *vtx = js->shape->vertices;
+ edge *e = js->shape->edges;
+ vector zero;
+
+ vector_init(zero, 0, 0, 0);
+
+ /* sum all the vertex-vertex forces */
+ while(e) {
+ vector f;
+ coord mag;
+ vector_sub(e->left->vtx->v, e->right->vtx->v, f);
+ mag = js->stable_distance - magnitude(f);
+ vector_scale(f, mag);
+ vector_add_to(e->left->vtx->f, f);
+ vector_sub(zero, f, f);
+ vector_add_to(e->right->vtx->f, f);
+ e = e->next;
+ }
+
+ /* scale back the v-v force and add the spherical force
+ * then add the result to the vertex velocity, damping
+ * if necessary. Finally, move the vertex */
+ while(vtx) {
+ coord mag;
+ vector to_sphere;
+ vector_scale(vtx->f, js->hold_strength);
+ vector_copy(to_sphere, vtx->v);
+ mag = 1 - magnitude(to_sphere);
+ vector_scale(to_sphere, mag * js->spherify_strength);
+ vector_add_to(vtx->f, to_sphere);
+ vector_add_to(vtx->vel, vtx->f);
+ vector_init(vtx->f, 0, 0, 0);
+ mag = magnitude2(vtx->vel);
+ if(mag > js->damping_velocity)
+ vector_scale(vtx->vel, js->damping_factor);
+ vector_add_to(vtx->v, vtx->vel);
+ vtx = vtx->next;
+ }
+}
+
+/* These are the various initialization routines */
+
+static void init_texture(ModeInfo *mi)
+{
+ XImage *img = image_data_to_ximage(mi->dpy, mi->xgwa.visual,
+ jigglymap_png, sizeof(jigglymap_png));
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
+ img->width, img->height, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, img->data);
+
+ XDestroyImage(img);
+}
+
+static void setup_opengl(ModeInfo *mi, jigglystruct *js)
+{
+ const GLfloat lpos0[4] = {-12, 8, 12, 0};
+ const GLfloat lpos1[4] = {7, -5, 0, 0};
+ const GLfloat lcol0[4] = {0.7f, 0.7f, 0.65f, 1};
+ const GLfloat lcol1[4] = {0.3f, 0.2f, 0.1f, 1};
+ const GLfloat scolor[4]= {0.9f, 0.9f, 0.9f, 0.5f};
+
+ glDrawBuffer(GL_BACK);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+
+ if(js->do_wireframe) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+ else {
+ glCullFace(GL_BACK);
+ glFrontFace(GL_CW);
+ glEnable(GL_CULL_FACE);
+ }
+
+ if(js->color_style != COLOR_STYLE_CHROME) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, lpos0);
+ glLightfv(GL_LIGHT1, GL_POSITION, lpos1);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, lcol0);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, lcol1);
+
+ glEnable(GL_COLOR_MATERIAL);
+ glColor4fv(js->jiggly_color);
+
+ glMaterialfv(GL_FRONT, GL_SPECULAR, scolor);
+ glMateriali(GL_FRONT, GL_SHININESS, js->shininess);
+ }
+ else { /* chrome */
+ init_texture(mi);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_2D);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ }
+}
+
+static int parse_color(jigglystruct *js)
+{
+ unsigned int r, g, b;
+ if(!strcmp(color, "clownbarf")) {
+ js->color_style = COLOR_STYLE_CLOWNBARF;
+ return 1;
+ }
+ else if(!strcmp(color, "flowerbox")) {
+ js->color_style = COLOR_STYLE_FLOWERBOX;
+ return 1;
+ }
+# ifndef HAVE_JWZGLES /* SPHERE_MAP unimplemented */
+ else if(!strcmp(color, "chrome")) {
+ js->color_style = COLOR_STYLE_CHROME;
+ return 1;
+ }
+# endif
+ else if(!strcmp(color, "cycle")) {
+ js->color_style = COLOR_STYLE_CYCLE;
+ js->jiggly_color[0] = ((float)random()) / REAL_RAND_MAX * 0.7 + 0.3;
+ js->jiggly_color[1] = ((float)random()) / REAL_RAND_MAX * 0.7 + 0.3;
+ js->jiggly_color[2] = ((float)random()) / REAL_RAND_MAX * 0.7 + 0.3;
+ js->jiggly_color[3] = 1.0f;
+ js->color_dir[0] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[1] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[2] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ return 1;
+ }
+ else
+ js->color_style = 0;
+ if(strlen(color) != 7)
+ return 0;
+ if(sscanf(color,"#%02x%02x%02x", &r, &g, &b) != 3) {
+ return 0;
+ }
+ js->jiggly_color[0] = ((float)r)/255;
+ js->jiggly_color[1] = ((float)g)/255;
+ js->jiggly_color[2] = ((float)b)/255;
+ js->jiggly_color[3] = 1.0f;
+
+ return 1;
+}
+
+static void randomize_parameters(jigglystruct *js) {
+ do_tetrahedron = random() & 1;
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ js->do_wireframe = !(random() & 3);
+# endif
+ js->color_style = random() % 5;
+# ifdef HAVE_JWZGLES /* #### SPHERE_MAP unimplemented */
+ while (js->color_style == COLOR_STYLE_CHROME)
+ js->color_style = random() % 5;;
+# endif
+ if(js->color_style == COLOR_STYLE_NORMAL
+ || js->color_style == COLOR_STYLE_CYCLE) {
+ js->jiggly_color[0] = ((float)random()) / REAL_RAND_MAX * 0.5 + 0.5;
+ js->jiggly_color[1] = ((float)random()) / REAL_RAND_MAX * 0.5 + 0.5;
+ js->jiggly_color[2] = ((float)random()) / REAL_RAND_MAX * 0.5 + 0.5;
+ js->jiggly_color[3] = 1.0f;
+ if(js->color_style == COLOR_STYLE_CYCLE) {
+ js->color_dir[0] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[1] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[2] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ }
+ }
+ if((js->color_style != COLOR_STYLE_CHROME) && (random() & 1))
+ js->spooky = (random() % 6) + 4;
+ else
+ js->spooky = 0;
+ js->shininess = random() % 200;
+ speed = (random() % 700) + 50;
+ /* It' kind of dull if this is too high when it starts as a sphere */
+ spherism = do_tetrahedron ? (random() % 500) + 20 : (random() % 100) + 10;
+ hold = (random() % 800) + 100;
+ distance = (random() % 500) + 100;
+ damping = (random() % 800) + 50;
+}
+
+static void calculate_parameters(jigglystruct *js, int subdivs) {
+ /* try to compensate for the inherent instability at
+ * low complexity. */
+ float dist_factor = (subdivs == 6) ? 2 : (subdivs == 5) ? 1 : 0.5;
+
+ js->stable_distance = ((float)distance / 500.0)
+ * (STABLE_DISTANCE / dist_factor);
+ js->hold_strength = (float)hold / 10000.0;
+ js->spherify_strength = (float)spherism / 10000.0;
+ js->damping_velocity = (float)damping / 100000.0;
+ js->damping_factor =
+ 0.001/max(js->hold_strength, js->spherify_strength);
+
+ js->speed = (float)speed / 1000.0;
+}
+
+/* The screenhack related functions begin here */
+
+ENTRYPOINT Bool jigglypuff_handle_event(ModeInfo *mi, XEvent *event)
+{
+ jigglystruct *js = &jss[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, js->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &js->button_down))
+ return True;
+
+ return False;
+}
+
+ENTRYPOINT void reshape_jigglypuff(ModeInfo *mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-0.5*(1/h), 0.5*(1/h), -0.5, 0.5, 1, 20);
+}
+
+ENTRYPOINT void draw_jigglypuff(ModeInfo *mi)
+{
+ jigglystruct *js = &jss[MI_SCREEN(mi)];
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(js->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0,0,-10);
+
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glRotatef(js->angle, sin(js->axis), cos(js->axis), -sin(js->axis));
+ glTranslatef(0, 0, 5);
+ if(!(js->button_down)) {
+ if((js->angle += js->speed) >= 360.0f ) {
+ js->angle -= 360.0f;
+ }
+ if((js->axis+=0.01f) >= 2*M_PI ) {
+ js->axis -= 2*M_PI;
+ }
+ }
+
+ gltrackball_rotate(js->trackball);
+
+ if(js->color_style == COLOR_STYLE_CYCLE) {
+ int i;
+ vector_add(js->jiggly_color, js->color_dir, js->jiggly_color);
+
+ for(i=0; i<3; i++) {
+ if(js->jiggly_color[i] > 1.0 || js->jiggly_color[i] < 0.3) {
+ js->color_dir[i] = (-js->color_dir[i]);
+ js->jiggly_color[i] += js->color_dir[i];
+ }
+ }
+ glColor4fv(js->jiggly_color);
+ }
+
+ mi->polygon_count = jigglypuff_render(js);
+ if(MI_IS_FPS(mi))
+ do_fps(mi);
+ glFinish();
+ update_shape(js);
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void init_jigglypuff(ModeInfo *mi)
+{
+ jigglystruct *js;
+ int subdivs;
+
+ MI_INIT(mi, jss);
+
+ js = &jss[MI_SCREEN(mi)];
+
+ js->do_wireframe = MI_IS_WIREFRAME(mi);
+# ifdef HAVE_JWZGLES
+ js->do_wireframe = 0; /* GL_LINE unimplemented */
+# endif
+
+ js->shininess = shininess;
+
+ subdivs = (complexity==1) ? 4 : (complexity==2) ? 5
+ : (complexity==3) ? 6 : 5;
+
+ js->spooky = spooky << (subdivs-3);
+
+ if(!parse_color(js)) {
+ fprintf(stderr, "%s: Bad color specification: '%s'.\n", progname, color);
+ exit(-1);
+ }
+
+ if(random_parms)
+ randomize_parameters(js);
+
+ js->angle = frand(180);
+ js->axis = frand(M_PI);
+
+ js->shape = tesselated_tetrahedron(1, subdivs, js);
+
+ if(!do_tetrahedron)
+ solid_spherify(js->shape, 1);
+
+ if(js->color_style == COLOR_STYLE_CLOWNBARF)
+ clownbarf_colorize(js->shape);
+
+ calculate_parameters(js, subdivs);
+
+ if((js->glx_context = init_GL(mi)) != NULL) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(js->glx_context));
+ setup_opengl(mi, js);
+ reshape_jigglypuff(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+ else {
+ MI_CLEARWINDOW(mi);
+ }
+ js->trackball = gltrackball_init(True);
+/* _DEBUG("distance : %f\nhold : %f\nspherify : %f\ndamping : %f\ndfact : %f\n",
+ js->stable_distance, js->hold_strength, js->spherify_strength,
+ js->damping_velocity, js->damping_factor);
+ _DEBUG("wire : %d\nspooky : %d\nstyle : %d\nshininess : %d\n",
+ js->do_wireframe, js->spooky, js->color_style, js->shininess);*/
+}
+
+XSCREENSAVER_MODULE ("JigglyPuff", jigglypuff)
+
+#endif /* USE_GL */
+
+/* This is the end of the file */
diff --git a/hacks/glx/jigglypuff.man b/hacks/glx/jigglypuff.man
new file mode 100644
index 0000000..4a5f8bf
--- /dev/null
+++ b/hacks/glx/jigglypuff.man
@@ -0,0 +1,121 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+jigglypuff - save your screen by tormenting your eyes.
+.SH SYNOPSIS
+.B jigglypuff
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-cycles \fInumber\fP]
+[-wireframe]
+[-fps]
+[-color \fIcolorspec\fP]
+[-spooky]
+[-complexity \fIn\fP]
+[-speed \fIn\fP]
+[-spherism \fIn\fP]
+[-hold \fIn\fP]
+[-distance \fIn\fP]
+[-damping \fIn\fP]
+.SH DESCRIPTION
+This draws all manners of obscene, spastic, puffy, vaguely ball-shaped
+objects orbiting lazily about the screen, with a dizzying array of
+mostly pointless options.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid. Default: render solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B -tetra | -no-tetra
+Whether to start the shape in the form of a tetrahedron. The default
+is to start as a sphere.
+.TP 8
+.B -color \fIcolorspec\fP
+Available options for colorspec are: cycle, flowerbox, clownpuke, chrome
+and #xxxxxx (i.e an (old-style) X color specification.) Default: cycle
+.TP 8
+.B -spooky \fIn\fP
+This option controls a kind of interesting effect obtained by
+using unnormalized normal vectors (how's that for an oxymoron?) in OpenGL.
+A value of zero disables the effect. Other values vary the lengths of
+the normals proportionally.
+Okay, so it's not very spooky. Sue me.
+Default: 0
+.TP 8
+.B -complexity \fIn\fP
+Valid options are 1, 2, and 3. Everything else is treated as though it
+were 2, which is the default. This controls the number of polygons in
+the 'thing'. A value of 1 yields 1024, and the values go up in powers
+of 4. (i.e. 4096, 16384.)
+ note: There is an inherent lack of stability
+at lower complexity, which can cause the shape to devolve into a 'flying
+snotrag'.
+.TP 8
+.B -speed \fIn\fP
+Controls how fast the blob moves around the screen. Default: 500.
+.TP 8
+.B -spherism, -hold, -distance, -damping
+These options control the 'jigglyness'. The best way to explain these is
+to explain how jigglypuff works. Basically, the shape is a tetrahedron
+whose faces are subdivided into a number of triangles, forming a mesh.
+Each of the vertices of the mesh has two different forces applied to it:
+one proportional to its distance from the surface of a sphere, and one
+proportional to the difference of the distance to each of its neighbors
+in the mesh to a given ideal distance. In short, one tries to move the
+points into the configuration of a sphere, and the other tries to push
+them back into a tetrahedron. The catch is that the points have inertia,
+so they always overshoot their target, and hence they oscillate. The
+magnitudes of the two forces is controlled by the options 'spherism' and
+\'hold'; 'distance' specifies the distance the vertices seek to keep from
+their neighbors, with 500 corresponding to the size of the start tetrahedron.
+e.g. if you were to give the options '-tetra -spherism 0 -distance 500', you
+would end up with a stable tetrahedron. The 'damping' option can help to
+keep the blob from collapsing or flying apart. The option specifies the
+speed at which damping starts, hence lower values mean more damping.
+Defaults: spherism: 75; hold: 800; distance: 100; damping: 500.
+.TP 8
+.B -random
+Probably the only parameter you'l ever need. Overrides almost all of the
+parameters with random values. The values affected are: speed, spherism,
+hold, distance, damping, spooky, color, wireframe and tetra.
+Default: off
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Keith Macleod. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+By Keith Macleod
diff --git a/hacks/glx/jigsaw.c b/hacks/glx/jigsaw.c
new file mode 100644
index 0000000..934dbcc
--- /dev/null
+++ b/hacks/glx/jigsaw.c
@@ -0,0 +1,1509 @@
+/* xscreensaver, Copyright (c) 1997-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Written as an Xlib program some time in 1997.
+ * Rewritten as an OpenGL program 24-Aug-2008.
+ */
+
+/*
+ Currently, we do this:
+
+ - start pieces off screen and move them in.
+ - when they land, they fill the puzzle grid with a shuffled
+ puzzle (pieces are rotated, too).
+ - swap random pairs of pieces until the puzzle is solved.
+ - scatter the pieces off screen (resulting in black).
+ - load new image and repeat.
+
+ Another idea would be to show the puzzle being solved the way
+ a person would do it:
+
+ - start off with black screen.
+ - assume knowledge of size of grid (position of corners).
+ - find a corner piece, and place it.
+ - while puzzle unsolved:
+ - pick a random piece;
+ - if it is the correct piece for any open edge, place it;
+ - if it fits physically in any rotation at any open edge,
+ place it, then toss it back (show the fake-out).
+ - if it doesn't fit at all, don't animate it at all.
+
+ This would take a long time to solve, I think...
+
+ An even harder idea would involve building up completed "clumps"
+ and sliding them around (a coral growth / accretion approach)
+ */
+
+#define DEF_SPEED "1.0"
+#define DEF_COMPLEXITY "1.0"
+#define DEF_RESOLUTION "100"
+#define DEF_THICKNESS "0.06"
+#define DEF_WOBBLE "True"
+#define DEF_DEBUG "False"
+
+#define DEF_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*font: " DEF_FONT"\n" \
+ "*wireframe: False \n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+
+# define free_jigsaw 0
+# define release_jigsaw 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "spline.h"
+#include "normals.h"
+#include "grab-ximage.h"
+#include "texfont.h"
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#else /* !HAVE_JWZGLES */
+# define HAVE_TESS
+#endif /* !HAVE_JWZGLES */
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#ifdef USE_GL /* whole file */
+
+#define TOP 0
+#define RIGHT 1
+#define BOTTOM 2
+#define LEFT 3
+
+#define IN -1
+#define FLAT 0
+#define OUT 1
+
+typedef struct jigsaw_configuration jigsaw_configuration;
+
+typedef struct {
+ double x,y,z,r; /* position and Z rotation (in degrees) */
+} XYZR;
+
+
+typedef struct {
+ jigsaw_configuration *jc;
+ int edge[4];
+ GLuint dlist;
+ int polys;
+
+ XYZR home; /* correct position in puzzle */
+ XYZR current; /* where it is right now */
+ XYZR from, to; /* in transit from A to B */
+ double tick; /* 0-1.0, how far from A to B */
+ double arc_height; /* height of apex of curved path from A to B */
+ double tilt, max_tilt;
+
+} puzzle_piece;
+
+
+struct jigsaw_configuration {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ rotator *rot;
+ Bool button_down_p;
+ texture_font_data *texfont;
+ GLuint loading_dlist;
+
+ int puzzle_width;
+ int puzzle_height;
+ puzzle_piece *puzzle;
+
+ enum { PUZZLE_LOADING_MSG,
+ PUZZLE_LOADING,
+ PUZZLE_UNSCATTER,
+ PUZZLE_SOLVE,
+ PUZZLE_SCATTER } state;
+ double pausing;
+ double tick_speed;
+
+ GLuint texid;
+ GLfloat tex_x, tex_y, tex_width, tex_height, aspect;
+
+ GLuint line_thickness;
+};
+
+static jigsaw_configuration *sps = NULL;
+
+static GLfloat speed;
+static GLfloat complexity_arg;
+static int resolution_arg;
+static GLfloat thickness_arg;
+static Bool wobble_p;
+static Bool debug_p;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-complexity", ".complexity", XrmoptionSepArg, 0 },
+ { "-resolution", ".resolution", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-wobble", ".wobble", XrmoptionNoArg, "True" },
+ { "+wobble", ".wobble", XrmoptionNoArg, "False" },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&complexity_arg, "complexity", "Complexity", DEF_COMPLEXITY, t_Float},
+ {&resolution_arg, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+ {&thickness_arg, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&wobble_p, "wobble", "Wobble", DEF_WOBBLE, t_Bool},
+ {&debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt jigsaw_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Returns a spline describing one edge of a puzzle piece of the given length.
+ */
+static spline *
+make_puzzle_curve (int pixels)
+{
+ double x0 = 0.0000, y0 = 0.0000;
+ double x1 = 0.3333, y1 = 0.1000;
+ double x2 = 0.4333, y2 = 0.0333;
+ double x3 = 0.4666, y3 = -0.0666;
+ double x4 = 0.3333, y4 = -0.1666;
+ double x5 = 0.3666, y5 = -0.2900;
+ double x6 = 0.5000, y6 = -0.3333;
+
+ spline *s = make_spline(20);
+ s->n_controls = 0;
+
+# define PT(x,y) \
+ s->control_x[s->n_controls] = pixels * (x); \
+ s->control_y[s->n_controls] = pixels * (y); \
+ s->n_controls++
+ PT ( x0, y0);
+ PT ( x1, y1);
+ PT ( x2, y2);
+ PT ( x3, y3);
+ PT ( x4, y4);
+ PT ( x5, y5);
+ PT ( x6, y6);
+ PT (1-x5, y5);
+ PT (1-x4, y4);
+ PT (1-x3, y3);
+ PT (1-x2, y2);
+ PT (1-x1, y1);
+ PT (1-x0, y0);
+# undef PT
+
+ compute_spline (s);
+ return s;
+}
+
+
+#ifdef HAVE_TESS
+
+static void
+tess_error_cb (GLenum errorCode)
+{
+ fprintf (stderr, "%s: tesselation error: %s\n",
+ progname, gluErrorString(errorCode));
+ exit (0);
+}
+
+
+static void
+tess_combine_cb (GLdouble coords[3], GLdouble *d[4], GLfloat w[4],
+ GLdouble **dataOut)
+{
+ GLdouble *new = (GLdouble *) malloc (3 * sizeof(*new));
+ new[0] = coords[0];
+ new[1] = coords[1];
+ new[2] = coords[2];
+ *dataOut = new;
+}
+
+
+static void
+tess_vertex_cb (void *vertex_data, void *closure)
+{
+ puzzle_piece *p = (puzzle_piece *) closure;
+ GLdouble *v = (GLdouble *) vertex_data;
+ GLdouble x = v[0];
+ GLdouble y = v[1];
+ GLdouble z = v[2];
+
+ if (p)
+ {
+ GLfloat pw = p->jc->puzzle_width;
+ GLfloat ph = p->jc->puzzle_height;
+
+ GLfloat xx = x / (GLfloat) resolution_arg; /* 0-1 from piece origin */
+ GLfloat yy = y / (GLfloat) resolution_arg;
+ GLdouble tx = (p->home.x + xx) / pw; /* 0-1 from puzzle origin */
+ GLdouble ty = (ph - p->home.y - yy) / ph;
+
+ tx = p->jc->tex_x + (tx * p->jc->tex_width);
+ ty = p->jc->tex_y + (ty * p->jc->tex_height);
+
+ glTexCoord2d (tx, ty);
+ }
+
+ glVertex3d (x, y, z);
+}
+
+#else /* HAVE_TESS */
+
+/* Writes triangles into the array of floats.
+ Returns the number of floats written (triangles * 9).
+ */
+static int
+make_piece_eighth (jigsaw_configuration *jc, const spline *s,
+ int resolution, int type, GLfloat *out,
+ Bool flip_x, Bool flip_y, Bool rotate_p)
+{
+ GLfloat *oout = out;
+ int cx = resolution/2;
+ int cy = resolution/2;
+ int np = (s->n_points / 2) + 1;
+ int last_x = -999999, last_y = -999999;
+ Bool inflected = False;
+ int i;
+
+ if (type == FLAT)
+ {
+ *out++ = cx;
+ *out++ = 0;
+ *out++ = 0;
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+
+ *out++ = 0;
+ *out++ = 0;
+ *out++ = 0;
+
+ goto END;
+ }
+
+ for (i = (type == IN ? np-1 : 0);
+ (type == IN ? i >= 0 : i < np);
+ i += (type == IN ? -1 : 1))
+ {
+ int x = s->points[i].x;
+ int y = s->points[i].y;
+
+ if (type == IN)
+ y = -y;
+
+ if (last_x != -999999)
+ {
+ if (!inflected &&
+ (type == IN
+ ? x >= last_x
+ : x < last_x))
+ {
+ inflected = True;
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+
+ *out++ = last_x;
+ *out++ = last_y;
+ *out++ = 0;
+
+ if (type == IN)
+ {
+ cx = 0;
+ cy = 0;
+ }
+ else
+ {
+ cy = y;
+ }
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+ }
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+
+ *out++ = last_x;
+ *out++ = last_y;
+ *out++ = 0;
+
+ *out++ = x;
+ *out++ = y;
+ *out++ = 0;
+ }
+
+ last_x = x;
+ last_y = y;
+ }
+ END:
+
+ {
+ int count = out - oout;
+ Bool cw_p;
+
+ if (flip_x)
+ for (i = 0; i < count; i += 3)
+ oout[i] = resolution - oout[i];
+
+ if (flip_y)
+ for (i = 0; i < count; i += 3)
+ oout[i+1] = resolution - oout[i+1];
+
+ cw_p = (type == IN);
+ if (flip_x) cw_p = !cw_p;
+ if (flip_y) cw_p = !cw_p;
+
+ if (cw_p)
+ for (i = 0; i < count; i += 9)
+ {
+ GLfloat x1 = oout[i+0];
+ GLfloat y1 = oout[i+1];
+ GLfloat x2 = oout[i+3];
+ GLfloat y2 = oout[i+4];
+ GLfloat x3 = oout[i+6];
+ GLfloat y3 = oout[i+7];
+ oout[i+0] = x2;
+ oout[i+1] = y2;
+ oout[i+3] = x1;
+ oout[i+4] = y1;
+ oout[i+6] = x3;
+ oout[i+7] = y3;
+ }
+
+ if (rotate_p)
+ for (i = 0; i < count; i += 3)
+ {
+ GLfloat x = oout[i];
+ GLfloat y = oout[i+1];
+ oout[i] = resolution - y;
+ oout[i+1] = x;
+ }
+
+ return count;
+ }
+}
+
+#endif /* !HAVE_TESS */
+
+
+
+/* Draws a puzzle piece. The top/right/bottom/left_type args
+ indicate the direction the tabs point: 1 for out, -1 for in, 0 for flat.
+ */
+static int
+draw_piece (jigsaw_configuration *jc, puzzle_piece *p,
+ int resolution, GLfloat thickness,
+ int top_type, int right_type,
+ int bottom_type, int left_type,
+ Bool wire)
+{
+ spline *s = make_puzzle_curve (resolution);
+ GLdouble *pts = (GLdouble *) malloc (s->n_points * 4 * 3 * sizeof(*pts));
+ int polys = 0;
+ int i, o;
+ GLdouble z = resolution * thickness;
+
+ o = 0;
+ if (top_type == 0) {
+ pts[o++] = 0;
+ pts[o++] = 0;
+ pts[o++] = z;
+
+ pts[o++] = resolution;
+ pts[o++] = 0;
+ pts[o++] = z;
+ } else {
+ for (i = 0; i < s->n_points; i++) {
+ pts[o++] = s->points[i].x;
+ pts[o++] = s->points[i].y * top_type;
+ pts[o++] = z;
+ }
+ }
+
+ if (right_type == 0) {
+ pts[o++] = resolution;
+ pts[o++] = resolution;
+ pts[o++] = z;
+ } else {
+ for (i = 1; i < s->n_points; i++) {
+ pts[o++] = resolution + s->points[i].y * (-right_type);
+ pts[o++] = s->points[i].x;
+ pts[o++] = z;
+ }
+ }
+
+ if (bottom_type == 0) {
+ pts[o++] = 0;
+ pts[o++] = resolution;
+ pts[o++] = z;
+ } else {
+ for (i = 1; i < s->n_points; i++) {
+ pts[o++] = s->points[s->n_points-i-1].x;
+ pts[o++] = resolution + s->points[s->n_points-i-1].y * (-bottom_type);
+ pts[o++] = z;
+ }
+ }
+
+ if (left_type == 0) {
+ pts[o++] = 0;
+ pts[o++] = 0;
+ pts[o++] = z;
+ } else {
+ for (i = 1; i < s->n_points; i++) {
+ pts[o++] = s->points[s->n_points-i-1].y * left_type;
+ pts[o++] = s->points[s->n_points-i-1].x;
+ pts[o++] = z;
+ }
+ }
+
+ { GLfloat ss = 1.0 / resolution; glScalef (ss, ss, ss); }
+
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glPolygonMode (GL_FRONT_AND_BACK, wire ? GL_LINE : GL_FILL);
+# endif
+
+ if (wire)
+ {
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_BLEND);
+ glDisable (GL_LIGHTING);
+ }
+ else
+ {
+# ifdef HAVE_TESS
+
+# ifndef _GLUfuncptr
+# define _GLUfuncptr void(*)(void)
+# endif
+ GLUtesselator *tess = gluNewTess();
+ gluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)glBegin);
+ gluTessCallback(tess, GLU_TESS_VERTEX_DATA,(_GLUfuncptr)tess_vertex_cb);
+ gluTessCallback(tess, GLU_TESS_END, (_GLUfuncptr)glEnd);
+ gluTessCallback(tess, GLU_TESS_COMBINE, (_GLUfuncptr)tess_combine_cb);
+ gluTessCallback(tess, GLU_TESS_ERROR, (_GLUfuncptr)tess_error_cb);
+
+ /* front face */
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glEnable (GL_LIGHTING);
+ glBindTexture(GL_TEXTURE_2D, jc->texid);
+ glFrontFace (GL_CCW);
+ glNormal3f (0, 0, 1);
+ gluTessBeginPolygon (tess, p);
+ gluTessBeginContour (tess);
+ for (i = 0; i < o; i += 3)
+ {
+ GLdouble *p = pts + i;
+ gluTessVertex (tess, p, p);
+ polys++; /* not quite right but close */
+ }
+ gluTessEndContour(tess);
+ gluTessEndPolygon(tess);
+
+ /* back face */
+ glDisable (GL_TEXTURE_2D);
+ glFrontFace (GL_CW);
+ glNormal3f (0, 0, -1);
+ gluTessBeginPolygon (tess, 0);
+ gluTessBeginContour (tess);
+ for (i = 0; i < o; i += 3)
+ {
+ GLdouble *p = pts + i;
+ p[2] = -p[2];
+ gluTessVertex (tess, p, p);
+ polys++; /* not quite right but close */
+ }
+ gluTessEndContour(tess);
+ gluTessEndPolygon(tess);
+ gluDeleteTess(tess);
+
+ /* Put it back */
+ for (i = 0; i < o; i += 3)
+ {
+ GLdouble *p = pts + i;
+ p[2] = -p[2];
+ }
+
+# else /* !HAVE_TESS */
+
+ GLfloat *tri = (GLfloat *)
+ (GLfloat *) malloc (s->n_points * 4 * 3 * 3 * sizeof(*pts));
+ GLfloat *otri = tri;
+ int count;
+ GLdouble zz;
+
+ tri += make_piece_eighth (jc, s, resolution, top_type, tri, 0, 0, 0);
+ tri += make_piece_eighth (jc, s, resolution, top_type, tri, 1, 0, 0);
+ tri += make_piece_eighth (jc, s, resolution, left_type, tri, 0, 1, 1);
+ tri += make_piece_eighth (jc, s, resolution, left_type, tri, 1, 1, 1);
+ tri += make_piece_eighth (jc, s, resolution, bottom_type, tri, 0, 1, 0);
+ tri += make_piece_eighth (jc, s, resolution, bottom_type, tri, 1, 1, 0);
+ tri += make_piece_eighth (jc, s, resolution, right_type, tri, 0, 0, 1);
+ tri += make_piece_eighth (jc, s, resolution, right_type, tri, 1, 0, 1);
+ count = (tri - otri) / 9;
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glEnable (GL_LIGHTING);
+ glBindTexture(GL_TEXTURE_2D, jc->texid);
+ }
+
+ for (zz = z; zz >= -z; zz -= 2*z)
+ {
+ int i;
+ glFrontFace (zz > 0 ? GL_CCW : GL_CW);
+ glNormal3f (0, 0, (zz > 0 ? 1 : -1));
+
+ if (zz < 0)
+ glDisable (GL_TEXTURE_2D); /* back face */
+
+ glPushMatrix();
+ glTranslatef (0, 0, zz);
+
+ tri = otri;
+ if (wire)
+ {
+ for (i = 0; i < count; i++)
+ {
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (tri[0], tri[1], tri[2]); tri += 3;
+ glVertex3f (tri[0], tri[1], tri[2]); tri += 3;
+ glVertex3f (tri[0], tri[1], tri[2]); tri += 3;
+ glEnd();
+ }
+ }
+ else
+ {
+ GLfloat pw = p->jc->puzzle_width;
+ GLfloat ph = p->jc->puzzle_height;
+ GLfloat r = resolution;
+
+ glBegin (GL_TRIANGLES);
+ for (i = 0; i < count * 3; i++)
+ {
+ GLfloat x = *tri++;
+ GLfloat y = *tri++;
+ GLfloat z = *tri++;
+
+ /* 0-1 from piece origin */
+ GLfloat xx = x / r;
+ GLfloat yy = y / r;
+
+ /* 0-1 from puzzle origin */
+ GLfloat tx = (p->home.x + xx) / pw;
+ GLfloat ty = (ph - p->home.y - yy) / ph;
+
+ tx = p->jc->tex_x + (tx * p->jc->tex_width);
+ ty = p->jc->tex_y + (ty * p->jc->tex_height);
+
+ glTexCoord2f (tx, ty);
+ glVertex3f (x, y, z);
+ }
+ glEnd();
+ }
+
+ polys += count;
+ glPopMatrix();
+ }
+
+ free (otri);
+# endif /* !HAVE_TESS */
+ }
+
+ /* side faces */
+
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < o; i += 3)
+ {
+ int j = (i+o-3) % o;
+ int k = (i+3) % o;
+ GLdouble *p = pts + i;
+ GLdouble *pj = pts + j;
+ GLdouble *pk = pts + k;
+
+ do_normal (pj[0], pj[1], pj[2],
+ pj[0], pj[1], -pj[2],
+ pk[0], pk[1], pk[2]);
+
+ glVertex3f (p[0], p[1], p[2]);
+ glVertex3f (p[0], p[1], -p[2]);
+ polys++;
+ }
+ glEnd();
+
+ if (! wire)
+ glColor3f (0.3, 0.3, 0.3);
+
+ /* outline the edges in gray */
+
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glLineWidth (jc->line_thickness);
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < o; i += 3)
+ glVertex3f (pts[i], pts[i+1], pts[i+2]);
+ glEnd();
+ polys += o/3;
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < o; i += 3)
+ glVertex3f (pts[i], pts[i+1], -pts[i+2]);
+ glEnd();
+ polys += o/3;
+
+ free_spline (s);
+ free (pts);
+
+ return polys;
+}
+
+
+static void
+free_puzzle_grid (jigsaw_configuration *jc)
+{
+ int i;
+ for (i = 0; i < jc->puzzle_width * jc->puzzle_height; i++)
+ glDeleteLists (jc->puzzle[i].dlist, 1);
+ free (jc->puzzle);
+ jc->puzzle = 0;
+ jc->puzzle_width = 0;
+ jc->puzzle_height = 0;
+}
+
+
+static void
+make_puzzle_grid (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int x, y;
+ GLfloat size = (8 + (random() % 8)) * complexity_arg;
+
+ if (jc->puzzle)
+ free_puzzle_grid (jc);
+
+ if (wire)
+ jc->aspect = MI_WIDTH(mi) / (float) MI_HEIGHT(mi);
+
+ if (jc->aspect >= 1.0)
+ {
+ jc->puzzle_width = size;
+ jc->puzzle_height = (size + 0.5) / jc->aspect;
+ }
+ else
+ {
+ jc->puzzle_width = (size + 0.5) * jc->aspect;
+ jc->puzzle_height = size;
+ }
+
+ if (jc->puzzle_width < 1) jc->puzzle_width = 1;
+ if (jc->puzzle_height < 1) jc->puzzle_height = 1;
+
+ if (debug_p)
+ fprintf (stderr, "%s: grid %4d x %-4d (%.2f)\n", progname,
+ jc->puzzle_width, jc->puzzle_height,
+ ((float) jc->puzzle_width / jc->puzzle_height));
+
+ jc->puzzle = (puzzle_piece *)
+ calloc (jc->puzzle_width * (jc->puzzle_height+1), sizeof(*jc->puzzle));
+
+ /* Randomize the right and bottom edge of each piece.
+ Match the left edge of the piece to the right to our right edge.
+ Match the top edge of the piece to the bottom to our bottom edge.
+ */
+ for (y = 0; y < jc->puzzle_height; y++)
+ for (x = 0; x < jc->puzzle_width; x++)
+ {
+ puzzle_piece *p = &jc->puzzle [y * jc->puzzle_width + x];
+ puzzle_piece *r = &jc->puzzle [y * jc->puzzle_width + x+1];
+ puzzle_piece *b = &jc->puzzle [(y+1) * jc->puzzle_width + x];
+ p->edge[RIGHT] = (random() & 1) ? IN : OUT;
+ p->edge[BOTTOM] = (random() & 1) ? IN : OUT;
+ r->edge[LEFT] = p->edge[RIGHT] == IN ? OUT : IN;
+ b->edge[TOP] = p->edge[BOTTOM] == IN ? OUT : IN;
+ }
+
+ /* tell each piece where it belongs. */
+ for (y = 0; y < jc->puzzle_height; y++)
+ for (x = 0; x < jc->puzzle_width; x++)
+ {
+ puzzle_piece *p = &jc->puzzle [y * jc->puzzle_width + x];
+ p->jc = jc;
+ p->home.x = x;
+ p->home.y = y;
+ p->current = p->home;
+
+ /* make sure the outer border is flat */
+ if (p->home.x == 0) p->edge[LEFT] = FLAT;
+ if (p->home.y == 0) p->edge[TOP] = FLAT;
+ if (p->home.x == jc->puzzle_width-1) p->edge[RIGHT] = FLAT;
+ if (p->home.y == jc->puzzle_height-1) p->edge[BOTTOM] = FLAT;
+
+ /* generate the polygons */
+ p->dlist = glGenLists (1);
+ check_gl_error ("generating lists");
+ if (p->dlist <= 0) abort();
+
+ glNewList (p->dlist, GL_COMPILE);
+ p->polys += draw_piece (jc, p,
+ resolution_arg, thickness_arg,
+ p->edge[TOP], p->edge[RIGHT],
+ p->edge[BOTTOM], p->edge[LEFT],
+ wire);
+ glEndList();
+ }
+}
+
+
+static void shuffle_grid (ModeInfo *mi);
+
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+
+ jc->tex_x = geometry->x / (float) texture_width;
+ jc->tex_y = geometry->y / (float) texture_height;
+ jc->tex_width = geometry->width / (float) texture_width;
+ jc->tex_height = geometry->height / (float) texture_height;
+ jc->aspect = geometry->width / (float) geometry->height;
+
+ if (debug_p)
+ {
+ fprintf (stderr, "%s: image %s\n", progname,
+ (filename ? filename : "(null)"));
+ fprintf (stderr, "%s: image %4d x %-4d + %4d + %-4d (%.2f)\n", progname,
+ geometry->width, geometry->height, geometry->x, geometry->y,
+ (float) geometry->width / geometry->height);
+ fprintf (stderr, "%s: tex %4d x %-4d\n", progname,
+ texture_width, texture_height);
+ fprintf (stderr, "%s: tex %4.2f x %4.2f + %4.2f + %4.2f (%.2f)\n",
+ progname,
+ jc->tex_width, jc->tex_height, jc->tex_x, jc->tex_y,
+ (jc->tex_width / jc->tex_height) *
+ (texture_width / texture_height));
+ }
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ make_puzzle_grid (mi);
+}
+
+
+static void
+load_image (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ load_texture_async (mi->xgwa.screen, mi->window,
+ *jc->glx_context, 0, 0,
+ False, jc->texid,
+ image_loaded_cb, mi);
+}
+
+
+/* Whether the two pieces are the same shape, when the second piece
+ is rotated by the given degrees.
+ */
+static Bool
+same_shape (puzzle_piece *p0, puzzle_piece *p1, int rotated_by)
+{
+ switch (rotated_by)
+ {
+ case 0:
+ return (p0->edge[0] == p1->edge[0] &&
+ p0->edge[1] == p1->edge[1] &&
+ p0->edge[2] == p1->edge[2] &&
+ p0->edge[3] == p1->edge[3]);
+ case 90:
+ return (p0->edge[0] == p1->edge[1] &&
+ p0->edge[1] == p1->edge[2] &&
+ p0->edge[2] == p1->edge[3] &&
+ p0->edge[3] == p1->edge[0]);
+ case 180:
+ return (p0->edge[0] == p1->edge[2] &&
+ p0->edge[1] == p1->edge[3] &&
+ p0->edge[2] == p1->edge[0] &&
+ p0->edge[3] == p1->edge[1]);
+ case 270:
+ return (p0->edge[0] == p1->edge[3] &&
+ p0->edge[1] == p1->edge[0] &&
+ p0->edge[2] == p1->edge[1] &&
+ p0->edge[3] == p1->edge[2]);
+ default:
+ abort();
+ }
+}
+
+
+/* Returns the proper rotation for the piece at the given position.
+ */
+static int
+proper_rotation (jigsaw_configuration *jc, puzzle_piece *p,
+ double x, double y)
+{
+ puzzle_piece *p1;
+ int cx = x;
+ int cy = y;
+ if (cx != x) abort(); /* must be in integral position! */
+ if (cy != y) abort();
+ p1 = &jc->puzzle [cy * jc->puzzle_width + cx];
+ if (same_shape (p, p1, 0)) return 0;
+ if (same_shape (p, p1, 90)) return 90;
+ if (same_shape (p, p1, 180)) return 180;
+ if (same_shape (p, p1, 270)) return 270;
+ abort(); /* these two pieces don't match in any rotation! */
+}
+
+
+/* Returns the piece currently at the given position.
+ */
+static puzzle_piece *
+piece_at (jigsaw_configuration *jc, double x, double y)
+{
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+ int cx = x;
+ int cy = y;
+ if (cx != x) abort(); /* must be in integral position! */
+ if (cy != y) abort();
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ if (p->current.x == cx &&
+ p->current.y == cy)
+ return p;
+ }
+ abort(); /* no piece at that position? */
+}
+
+
+static void
+shuffle_grid (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int max_tries = jc->puzzle_width * jc->puzzle_height;
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p0 = &jc->puzzle [i];
+ puzzle_piece *p1 = 0;
+ int k;
+
+ for (k = 0; k < max_tries; k++)
+ {
+ p1 = &jc->puzzle [random() % npieces];
+ if (same_shape (p0, p1, 0)) break;
+ if (same_shape (p0, p1, 90)) break;
+ if (same_shape (p0, p1, 180)) break;
+ if (same_shape (p0, p1, 270)) break;
+ p1 = 0; /* mismatch */
+ }
+ if (p1 && p0 != p1)
+ {
+ XYZR s;
+ s = p0->current; p0->current = p1->current; p1->current = s;
+ p0->current.r =
+ proper_rotation (jc, p0, p0->current.x, p0->current.y);
+ p1->current.r =
+ proper_rotation (jc, p1, p1->current.x, p1->current.y);
+ }
+ }
+}
+
+
+/* We tend to accumulate floating point errors, e.g., z being 0.000001
+ after a move. This makes sure float values that should be integral are.
+ */
+static void
+smooth_grid (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+# define SMOOTH(P) \
+ P.x = (int) (P.x + 0.5); \
+ P.y = (int) (P.y + 0.5); \
+ P.z = (int) (P.z + 0.5); \
+ P.r = (int) (P.r + 0.5)
+ SMOOTH(p->home);
+ SMOOTH(p->current);
+ SMOOTH(p->from);
+ SMOOTH(p->to);
+ if (p->tick <= 0.0001) p->tick = 0.0;
+ if (p->tick >= 0.9999) p->tick = 1.0;
+ }
+}
+
+
+static void
+begin_scatter (ModeInfo *mi, Bool unscatter_p)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+ XYZR ctr = { 0, };
+ ctr.x = jc->puzzle_width / 2;
+ ctr.y = jc->puzzle_height / 2;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ XYZ a;
+ double d, r, th;
+ p->tick = -frand(1.0);
+ p->from = p->current;
+
+ a.x = p->from.x - ctr.x; /* position relative to center */
+ a.y = p->from.y - ctr.y;
+
+ r = sqrt (a.x*a.x + a.y*a.y);
+ th = atan2 (a.x, a.y);
+
+ d = MAX (jc->puzzle_width, jc->puzzle_height) * 2;
+ r = r*r + d;
+
+ p->to.x = ctr.x + (r * sin (th));
+ p->to.y = ctr.y + (r * cos (th));
+ p->to.z = p->from.z;
+ p->to.r = ((int) p->from.r + (random() % 180)) % 360;
+ p->arc_height = frand(10.0);
+
+ if (unscatter_p)
+ {
+ XYZR s = p->to; p->to = p->from; p->from = s;
+ p->current = p->from;
+ }
+ }
+}
+
+
+static Bool
+solved_p (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ if (p->current.x != p->home.x ||
+ p->current.y != p->home.y ||
+ p->current.z != p->home.z)
+ return False;
+ }
+ return True;
+}
+
+
+static void
+move_one_piece (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces * 100; i++) /* shouldn't take that long */
+ {
+ int i = random() % npieces;
+ puzzle_piece *p0 = &jc->puzzle [i];
+ puzzle_piece *p1;
+
+ if (p0->current.x == p0->home.x &&
+ p0->current.y == p0->home.y &&
+ p0->current.z == p0->home.z)
+ continue; /* piece already solved - try again */
+
+ /* swap with the piece occupying p0's home cell. */
+ p1 = piece_at (jc, p0->home.x, p0->home.y);
+
+ if (p0 == p1) abort(); /* should have caught this above */
+
+ p0->tick = 0;
+ p0->from = p0->current;
+ p0->to = p1->current;
+ p0->to.r = proper_rotation (jc, p0, p0->to.x, p0->to.y);
+
+ p1->tick = 0;
+ p1->from = p1->current;
+ p1->to = p0->current;
+ p1->to.r = proper_rotation (jc, p1, p1->to.x, p1->to.y);
+
+ /* Try to avoid having them intersect each other in the air. */
+ p0->arc_height = 0;
+ p1->arc_height = 0;
+ while (fabs (p0->arc_height - p1->arc_height) < 1.5)
+ {
+ p0->arc_height = 0.5 + frand(3.0);
+ p1->arc_height = 1.0 + frand(3.0);
+ }
+
+# define RTILT(V) \
+ V = 90 - BELLRAND(180); \
+ if (! (random() % 5)) V *= 2; \
+ if (! (random() % 5)) V *= 2; \
+ if (! (random() % 5)) V *= 2
+ RTILT (p0->max_tilt);
+ RTILT (p1->max_tilt);
+# undef RTILT
+
+ if (debug_p)
+ fprintf (stderr, "%s: swapping %2d,%-2d with %2d,%d\n", progname,
+ (int) p0->from.x, (int) p0->from.y,
+ (int) p1->from.x, (int) p1->from.y);
+ return;
+ }
+
+ abort(); /* infinite loop! */
+}
+
+
+static Bool
+anim_tick (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+ Bool finished_p = True;
+
+ if (jc->pausing > 0)
+ {
+ jc->pausing -= jc->tick_speed * speed;
+ if (debug_p && jc->pausing <= 0)
+ fprintf (stderr, "%s: (done pausing)\n", progname);
+ return False;
+ }
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ double tt;
+
+ if (p->tick >= 1.0) continue; /* this piece is done */
+ finished_p = False; /* not done */
+
+ p->tick += jc->tick_speed * speed;
+ if (p->tick > 1.0) p->tick = 1.0;
+
+ if (p->tick < 0.0) continue; /* not yet started */
+
+ tt = 1 - sin (M_PI/2 - p->tick * M_PI/2);
+
+ p->current.x = p->from.x + ((p->to.x - p->from.x) * tt);
+ p->current.y = p->from.y + ((p->to.y - p->from.y) * tt);
+ p->current.z = p->from.z + ((p->to.z - p->from.z) * tt);
+ p->current.r = p->from.r + ((p->to.r - p->from.r) * tt);
+
+ p->current.z += p->arc_height * sin (p->tick * M_PI);
+
+ p->tilt = p->max_tilt * sin (p->tick * M_PI);
+
+ }
+
+ return finished_p;
+}
+
+
+static void
+loading_msg (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ const char *text = "Loading...";
+ XCharStruct e;
+ int w, h;
+ texture_string_metrics (jc->texfont, text, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+
+ if (wire) return;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (! jc->loading_dlist)
+ {
+ GLfloat othick = jc->line_thickness;
+ puzzle_piece P = { 0, };
+ P.jc = jc;
+ jc->loading_dlist = glGenLists (1);
+ glNewList (jc->loading_dlist, GL_COMPILE);
+ jc->line_thickness = 1;
+ draw_piece (jc, &P,
+ resolution_arg, thickness_arg,
+ OUT, OUT, IN, OUT, True);
+ jc->line_thickness = othick;
+ glEndList();
+ }
+
+ glColor3f (0.2, 0.2, 0.4);
+
+ glPushMatrix();
+ {
+ double x, y, z;
+ get_position (jc->rot, &x, &y, &z, True);
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ glScalef (5, 5, 5);
+ glTranslatef (-0.5, -0.5, 0);
+ glCallList (jc->loading_dlist);
+ }
+ glPopMatrix();
+
+ glColor3f (0.7, 0.7, 1);
+
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+ {
+ double rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ }
+
+ glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
+ glTranslatef ((MI_WIDTH(mi) - w) / 2,
+ (MI_HEIGHT(mi) - h) / 2,
+ 0);
+ glEnable (GL_TEXTURE_2D);
+ glPolygonMode (GL_FRONT, GL_FILL);
+ glDisable (GL_LIGHTING);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ print_texture_string (jc->texfont, text);
+ glEnable (GL_DEPTH_TEST);
+ glPopMatrix();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+static void
+animate (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ double slow = 0.01;
+ double fast = 0.04;
+
+ if (jc->button_down_p && jc->state != PUZZLE_LOADING_MSG)
+ return;
+
+ switch (jc->state)
+ {
+ case PUZZLE_LOADING_MSG:
+ if (! jc->puzzle)
+ loading_msg (mi);
+ /* fall through */
+
+ case PUZZLE_LOADING:
+ if (!jc->puzzle) break; /* still loading */
+ jc->tick_speed = slow;
+ shuffle_grid (mi);
+ smooth_grid (mi);
+ begin_scatter (mi, True);
+ jc->pausing = 0;
+ jc->state = PUZZLE_UNSCATTER;
+ if (debug_p) fprintf (stderr, "%s: unscattering\n", progname);
+ break;
+
+ case PUZZLE_UNSCATTER:
+ jc->tick_speed = slow;
+ if (anim_tick (mi))
+ {
+ smooth_grid (mi);
+ jc->pausing = 1.0;
+ jc->state = PUZZLE_SOLVE;
+ if (debug_p) fprintf (stderr, "%s: solving\n", progname);
+ }
+ break;
+
+ case PUZZLE_SOLVE:
+ jc->tick_speed = fast;
+ if (anim_tick (mi))
+ {
+ smooth_grid (mi);
+ if (solved_p (mi))
+ {
+ if (debug_p) fprintf (stderr, "%s: solved!\n", progname);
+ begin_scatter (mi, False);
+ jc->state = PUZZLE_SCATTER;
+ jc->pausing = 3.0;
+ if (debug_p) fprintf (stderr, "%s: scattering\n", progname);
+ }
+ else
+ {
+ move_one_piece (mi);
+ jc->pausing = 0.3;
+ }
+ }
+ break;
+
+ case PUZZLE_SCATTER:
+ jc->tick_speed = slow;
+ if (anim_tick (mi))
+ {
+ free_puzzle_grid (jc);
+ load_image (mi);
+ jc->state = PUZZLE_LOADING;
+ jc->pausing = 1.0;
+ if (debug_p) fprintf (stderr, "%s: loading\n", progname);
+ }
+ break;
+
+ default:
+ abort();
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_jigsaw (ModeInfo *mi, int width, int height)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ jc->line_thickness = (MI_IS_WIREFRAME (mi) ? 1 : MAX (1, height / 300.0));
+}
+
+
+ENTRYPOINT Bool
+jigsaw_handle_event (ModeInfo *mi, XEvent *event)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, jc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &jc->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ begin_scatter (mi, False);
+ jc->state = PUZZLE_SCATTER;
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_jigsaw (ModeInfo *mi)
+{
+ jigsaw_configuration *jc;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sps);
+ jc = &sps[MI_SCREEN(mi)];
+ jc->glx_context = init_GL(mi);
+
+ reshape_jigsaw (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.05, 0.07, 1.00, 0.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ jc->trackball = gltrackball_init (False);
+ jc->rot = make_rotator (0, 0, 0, 0, speed * 0.002, True);
+ jc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+
+ jc->state = PUZZLE_LOADING_MSG;
+
+ resolution_arg /= complexity_arg;
+
+# ifndef HAVE_TESS
+ /* If it's not even, we get crosses. */
+ if (resolution_arg & 1)
+ resolution_arg++;
+# endif /* !HAVE_TESS */
+
+ if (wire)
+ make_puzzle_grid (mi);
+ else
+ load_image (mi);
+}
+
+
+ENTRYPOINT void
+draw_jigsaw (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!jc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(jc->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glPushMatrix ();
+/* glRotatef(current_device_rotation(), 0, 0, 1); */
+ gltrackball_rotate (jc->trackball);
+
+ animate (mi);
+
+ if (wobble_p && jc->puzzle)
+ {
+ double x, y, z;
+ double max = 60;
+ get_position (jc->rot, &x, &y, &z, !jc->button_down_p);
+ x = 1; /* always lean back */
+ glRotatef (max/2 - x*max, 1, 0, 0);
+ glRotatef (max/2 - z*max, 0, 1, 0);
+ }
+
+ if (jc->puzzle)
+ {
+ GLfloat s = 14.0 / jc->puzzle_height;
+ int x, y;
+
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_LINE_SMOOTH);
+
+ glScalef (s, s, s);
+ glTranslatef (-jc->puzzle_width / 2.0, -jc->puzzle_height / 2.0, 0);
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ for (y = 0; y < jc->puzzle_height; y++)
+ for (x = 0; x < jc->puzzle_width; x++)
+ {
+ puzzle_piece *p = &jc->puzzle [y * jc->puzzle_width + x];
+ glPushMatrix();
+ glTranslatef (p->current.x, p->current.y, p->current.z);
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (p->current.r, 0, 0, 1);
+ glRotatef (p->tilt, 0, 1, 0);
+ glTranslatef (-0.5, -0.5, 0);
+ glCallList(p->dlist);
+ mi->polygon_count += p->polys;
+ glPopMatrix();
+ }
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Jigsaw", jigsaw)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/jigsaw.man b/hacks/glx/jigsaw.man
new file mode 100644
index 0000000..c7d3493
--- /dev/null
+++ b/hacks/glx/jigsaw.man
@@ -0,0 +1,90 @@
+.TH XScreenSaver 1 "25-Aug-2008" "X Version 11"
+.SH NAME
+jigsaw - permute an image like a jigsaw puzzle
+.SH SYNOPSIS
+.B jigsaw
+[\-display \fIhost:display.screen\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIratio\fP]
+[\-complexity \fIratio\fP]
+[\-resolution \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-no\-wobble]
+[\-fps]
+.SH DESCRIPTION
+The \fIjigsaw\fP program loads an image, carves it up into
+a jigsaw puzzle, shuffles it, and then solves it.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I jigsaw
+accepts the following options:
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to wait between animation frames; default 20000.
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-complexity \fIratio\fP
+Less than 1 for simpler puzzles (fewer pieces), greater than 1 for
+more complex puzzles (more pieces). Default 1.
+.TP 8
+.B \-resolution \fIratio\fP
+Smoothness of the edges of the pieces. Less than 1 for rougher pieces
+(fewer polygons), greater than 1 for more smoother pieces (more polygons).
+Default 1.
+.TP 8
+.B \-thickness \fIfloat\fP
+Thickness of the puzzle pieces (relative to their width).
+Default 0.06.
+.TP 8
+.B \-no\-wobble
+Keep the display stationary instead of very slowly wobbling back and forth.
+.TP 8
+.B \-fps
+Display the current frame rate, polygon count, and CPU load.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 25-Nov-97.
diff --git a/hacks/glx/juggler3d.c b/hacks/glx/juggler3d.c
new file mode 100644
index 0000000..0315029
--- /dev/null
+++ b/hacks/glx/juggler3d.c
@@ -0,0 +1,3022 @@
+/* juggle, Copyright (c) 1996-2009 Tim Auckland <tda10.geo@yahoo.com>
+ * and Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * NOTE: this program was originally called "juggle" and was 2D Xlib.
+ * There was another program called "juggler3d" that was OpenGL.
+ * In 2009, jwz converted "juggle" to OpenGL and renamed
+ * "juggle" to "juggler3d". The old "juggler3d" hack is gone.
+ *
+ * Revision History
+ * 09-Aug-2009: jwz: converted from Xlib to OpenGL.
+ * 13-Dec-2004: [TDA] Use -cycles and -count in a rational manner.
+ * Add -rings, -bballs. Add -describe. Finally made
+ * live pattern updates possible. Add refill_juggle(),
+ * change_juggle() and reshape_juggle(). Make
+ * init_juggle() non-destructive. Reorder erase/draw
+ * operations. Update xscreensaver xml and manpage.
+ * 15-Nov-2004: [TDA] Fix all memory leaks.
+ * 12-Nov-2004: [TDA] Add -torches and another new trail
+ * implementation, so that different objects can have
+ * different length trails.
+ * 11-Nov-2004: [TDA] Clap when all the balls are in the air.
+ * 10-Nov-2004: [TDA] Display pattern name converted to hight
+ * notation.
+ * 31-Oct-2004: [TDA] Add -clubs and new trail implementation.
+ * 02-Sep-2003: Non-real time to see what is happening without a
+ * strobe effect for slow machines.
+ * 01-Nov-2000: Allocation checks
+ * 1996: Written
+ */
+
+/*-
+ * TODO
+ * Implement the anonymously promised -uni option.
+ */
+
+
+/*
+ * Notes on Adam Chalcraft Juggling Notation (used by permission)
+ * a-> Adam's notation s-> Site swap (Cambridge) notation
+ *
+ * To define a map from a-notation to s-notation ("site-swap"), both
+ * of which look like doubly infinite sequences of natural numbers. In
+ * s-notation, there is a restriction on what is allowed, namely for
+ * the sequence s_n, the associated function f(n)=n+s_n must be a
+ * bijection. In a-notation, there is no restriction.
+ *
+ * To go from a-notation to s-notation, you start by mapping each a_n
+ * to a permutation of N, the natural numbers.
+ *
+ * 0 -> the identity
+ * 1 -> (10) [i.e. f(1)=0, f(0)=1]
+ * 2 -> (210) [i.e. f(2)=1, f(1)=0, f(0)=2]
+ * 3 -> (3210) [i.e. f(3)=2, f(2)=1, f(1)=0, f(0)=3]
+ * etc.
+ *
+ * Then for each n, you look at how long 0 takes to get back to 0
+ * again and you call this t_n. If a_n=0, for example, then since the
+ * identity leaves 0 alone, it gets back to 0 in 1 step, so t_n=1. If
+ * a_n=1, then f(0)=1. Now any further a_n=0 leave 1 alone, but the
+ * next a_n>0 sends 1 back to 0. Hence t_n is 2 + the number of 0's
+ * following the 1. Finally, set s_n = t_n - 1.
+ *
+ * To give some examples, it helps to have a notation for cyclic
+ * sequences. By (123), for example, I mean ...123123123123... . Now
+ * under the a-notation -> s-notation mapping we have some familiar
+ * examples:
+ *
+ * (0)->(0), (1)->(1), (2)->(2) etc.
+ * (21)->(31), (31)->(51), (41)->(71) etc.
+ * (10)->(20), (20)->(40), (30)->(60) etc.
+ * (331)->(441), (312)->(612), (303)->(504), (321)->(531)
+ * (43)->(53), (434)->(534), (433)->(633)
+ * (552)->(672)
+ *
+ * In general, the number of balls is the *average* of the s-notation,
+ * and the *maximum* of the a-notation. Another theorem is that the
+ * minimum values in the a-notation and the s-notation and equal, and
+ * preserved in the same positions.
+ *
+ * The usefulness of a-notation is the fact that there are no
+ * restrictions on what is allowed. This makes random juggle
+ * generation much easier. It also makes enumeration very
+ * easy. Another handy feature is computing changes. Suppose you can
+ * do (5) and want a neat change up to (771) in s-notation [Mike Day
+ * actually needed this example!]. Write them both in a-notation,
+ * which gives (5) and (551). Now concatenate them (in general, there
+ * may be more than one way to do this, but not in this example), to
+ * get
+ *
+ * ...55555555551551551551551...
+ *
+ * Now convert back to s-notation, to get
+ *
+ * ...55555566771771771771771...
+ *
+ * So the answer is to do two 6 throws and then go straight into
+ * (771). Coming back down of course,
+ *
+ * ...5515515515515515555555555...
+ *
+ * converts to
+ *
+ * ...7717717717716615555555555...
+ *
+ * so the answer is to do a single 661 and then drop straight down to
+ * (5).
+ *
+ * [The number of balls in the generated pattern occasionally changes.
+ * In order to decrease the number of balls I had to introduce a new
+ * symbol into the Adam notation, [*] which means 'lose the current
+ * ball'.]
+ */
+
+/* This code uses so many linked lists it's worth having a built-in
+ * leak-checker */
+#undef MEMTEST
+
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 200 \n" \
+ "*cycles: 1000 \n" \
+ "*ncolors: 32 \n" \
+ "*titleFont: -*-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_juggle 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "texfont.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_PATTERN "random" /* All patterns */
+#define DEF_TAIL "1" /* No trace */
+#ifdef UNI
+/* Maybe a ROLA BOLA would be at a better angle for viewing */
+#define DEF_UNI "False" /* No unicycle */ /* Not implemented yet */
+#endif
+#define DEF_REAL "True"
+#define DEF_DESCRIBE "True"
+
+#define DEF_BALLS "True" /* Use Balls */
+#define DEF_CLUBS "True" /* Use Clubs */
+#define DEF_TORCHES "True" /* Use Torches */
+#define DEF_KNIVES "True" /* Use Knives */
+#define DEF_RINGS "True" /* Use Rings */
+#define DEF_BBALLS "True" /* Use Bowling Balls */
+
+static char *pattern;
+static int tail;
+#ifdef UNI
+static Bool uni;
+#endif
+static Bool real;
+static Bool describe;
+static Bool balls;
+static Bool clubs;
+static Bool torches;
+static Bool knives;
+static Bool rings;
+static Bool bballs;
+static char *only;
+
+static XrmOptionDescRec opts[] = {
+ {"-pattern", ".juggle.pattern", XrmoptionSepArg, NULL },
+ {"-tail", ".juggle.tail", XrmoptionSepArg, NULL },
+#ifdef UNI
+ {"-uni", ".juggle.uni", XrmoptionNoArg, "on" },
+ {"+uni", ".juggle.uni", XrmoptionNoArg, "off" },
+#endif
+ {"-real", ".juggle.real", XrmoptionNoArg, "on" },
+ {"+real", ".juggle.real", XrmoptionNoArg, "off" },
+ {"-describe", ".juggle.describe", XrmoptionNoArg, "on" },
+ {"+describe", ".juggle.describe", XrmoptionNoArg, "off" },
+ {"-balls", ".juggle.balls", XrmoptionNoArg, "on" },
+ {"+balls", ".juggle.balls", XrmoptionNoArg, "off" },
+ {"-clubs", ".juggle.clubs", XrmoptionNoArg, "on" },
+ {"+clubs", ".juggle.clubs", XrmoptionNoArg, "off" },
+ {"-torches", ".juggle.torches", XrmoptionNoArg, "on" },
+ {"+torches", ".juggle.torches", XrmoptionNoArg, "off" },
+ {"-knives", ".juggle.knives", XrmoptionNoArg, "on" },
+ {"+knives", ".juggle.knives", XrmoptionNoArg, "off" },
+ {"-rings", ".juggle.rings", XrmoptionNoArg, "on" },
+ {"+rings", ".juggle.rings", XrmoptionNoArg, "off" },
+ {"-bballs", ".juggle.bballs", XrmoptionNoArg, "on" },
+ {"+bballs", ".juggle.bballs", XrmoptionNoArg, "off" },
+ {"-only", ".juggle.only", XrmoptionSepArg, NULL },
+};
+
+static argtype vars[] = {
+ { &pattern, "pattern", "Pattern", DEF_PATTERN, t_String },
+ { &tail, "tail", "Tail", DEF_TAIL, t_Int },
+#ifdef UNI
+ { &uni, "uni", "Uni", DEF_UNI, t_Bool },
+#endif
+ { &real, "real", "Real", DEF_REAL, t_Bool },
+ { &describe, "describe", "Describe", DEF_DESCRIBE, t_Bool },
+ { &balls, "balls", "Clubs", DEF_BALLS, t_Bool },
+ { &clubs, "clubs", "Clubs", DEF_CLUBS, t_Bool },
+ { &torches, "torches", "Torches", DEF_TORCHES, t_Bool },
+ { &knives, "knives", "Knives", DEF_KNIVES, t_Bool },
+ { &rings, "rings", "Rings", DEF_RINGS, t_Bool },
+ { &bballs, "bballs", "BBalls", DEF_BBALLS, t_Bool },
+ { &only, "only", "BBalls", " ", t_String },
+};
+
+static OptionStruct desc[] =
+{
+ { "-pattern string", "Cambridge Juggling Pattern" },
+ { "-tail num", "Trace Juggling Patterns" },
+#ifdef UNI
+ { "-/+uni", "Unicycle" },
+#endif
+ { "-/+real", "Real-time" },
+ { "-/+describe", "turn on/off pattern descriptions." },
+ { "-/+balls", "turn on/off Balls." },
+ { "-/+clubs", "turn on/off Clubs." },
+ { "-/+torches", "turn on/off Flaming Torches." },
+ { "-/+knives", "turn on/off Knives." },
+ { "-/+rings", "turn on/off Rings." },
+ { "-/+bballs", "turn on/off Bowling Balls." },
+ { "-only", "Turn off all objects but the named one." },
+};
+
+ENTRYPOINT ModeSpecOpt juggle_opts =
+ {countof(opts), opts, countof(vars), vars, desc};
+
+
+/* Note: All "lengths" are scaled by sp->scale = MI_HEIGHT/480. All
+ "thicknesses" are scaled by sqrt(sp->scale) so that they are
+ proportionally thicker for smaller windows. Objects spinning out
+ of the plane (such as clubs) fake perspective by compressing their
+ horizontal coordinates by PERSPEC */
+
+/* Figure */
+#define ARMLENGTH 50
+#define ARMWIDTH ((int) (8.0 * sqrt(sp->scale)))
+#define POSE 10
+#define BALLRADIUS ARMWIDTH
+
+/* build all the models assuming a 480px high scene */
+#define SCENE_HEIGHT 480
+#define SCENE_WIDTH ((int)(SCENE_HEIGHT*(MI_WIDTH(mi)/(float)MI_HEIGHT(mi))))
+
+/*#define PERSPEC 0.4*/
+
+/* macros */
+#define GRAVITY(h, t) 4*(double)(h)/((t)*(t))
+
+/* Timing based on count. Units are milliseconds. Juggles per second
+ is: 2000 / THROW_CATCH_INTERVAL + CATCH_THROW_INTERVAL */
+
+#define THROW_CATCH_INTERVAL (sp->count)
+#define THROW_NULL_INTERVAL (sp->count * 0.5)
+#define CATCH_THROW_INTERVAL (sp->count * 0.2)
+
+/********************************************************************
+ * Trace Definitions *
+ * *
+ * These record rendering data so that a drawn object can be erased *
+ * later. Each object has its own Trace list. *
+ * *
+ ********************************************************************/
+
+typedef struct {double x, y; } DXPoint;
+typedef struct trace *TracePtr;
+typedef struct trace {
+ TracePtr next, prev;
+ double x, y;
+ double angle;
+ int divisions;
+ DXPoint dlast;
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Trace;
+
+/*******************************************************************
+ * Object Definitions *
+ * *
+ * These describe the various types of Object that can be juggled *
+ * *
+ *******************************************************************/
+typedef int (DrawProc)(ModeInfo*, unsigned long, Trace *);
+
+static DrawProc show_ball, show_europeanclub, show_torch, show_knife;
+static DrawProc show_ring, show_bball;
+
+typedef enum {BALL, CLUB, TORCH, KNIFE, RING, BBALLS,
+ NUM_OBJECT_TYPES} ObjType;
+
+#define OBJMIXPROB 20 /* inverse of the chances of using an odd
+ object in the pattern */
+
+static const GLfloat body_color_1[4] = { 0.9, 0.7, 0.5, 1 };
+static const GLfloat body_color_2[4] = { 0.6, 0.4, 0.2, 1 };
+
+static const struct {
+ DrawProc *draw; /* Object Rendering function */
+ int handle; /* Length of object's handle */
+ int mintrail; /* Minimum trail length */
+ double cor; /* Coefficient of Restitution. perfect bounce = 1 */
+ double weight; /* Heavier objects don't get thrown as high */
+} ObjectDefs[] = {
+ { /* Ball */
+ show_ball,
+ 0,
+ 1,
+ 0.9,
+ 1.0,
+ },
+ { /* Club */
+ show_europeanclub,
+ 15,
+ 1,
+ 0.55, /* Clubs don't bounce too well */
+ 1.0,
+ },
+ { /* Torch */
+ show_torch,
+ 15,
+ 20, /* Torches need flames */
+ 0, /* Torches don't bounce -- fire risk! */
+ 1.0,
+ },
+ { /* Knife */
+ show_knife,
+ 15,
+ 1,
+ 0, /* Knives don't bounce */
+ 1.0,
+ },
+ { /* Ring */
+ show_ring,
+ 15,
+ 1,
+ 0.8,
+ 1.0,
+ },
+ { /* Bowling Ball */
+ show_bball,
+ 0,
+ 1,
+ 0.2,
+ 5.0,
+ },
+};
+
+/**************************
+ * Trajectory definitions *
+ **************************/
+
+typedef enum {HEIGHT, ADAM} Notation;
+typedef enum {Empty, Full, Ball} Throwable;
+typedef enum {LEFT, RIGHT} Hand;
+typedef enum {THROW, CATCH} Action;
+typedef enum {HAND, ELBOW, SHOULDER} Joint;
+typedef enum {ATCH, THRATCH, ACTION, LINKEDACTION,
+ PTHRATCH, BPREDICTOR, PREDICTOR} TrajectoryStatus;
+typedef struct {double a, b, c, d; } Spline;
+typedef DXPoint Arm[3];
+
+
+/* Object is an arbitrary object being juggled. Each Trajectory
+ * references an Object ("count" tracks this), and each Object is also
+ * linked into a global Objects list. Objects may include a Trace
+ * list for tracking erasures. */
+typedef struct object *ObjectPtr;
+typedef struct object {
+ ObjectPtr next, prev;
+
+ ObjType type;
+ int color;
+ int count; /* reference count */
+ Bool active; /* Object is in use */
+
+ Trace *trace;
+ int tracelen;
+ int tail;
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Object;
+
+/* Trajectory is a segment of juggling action. A list of Trajectories
+ * defines the juggling performance. The Trajectory list goes through
+ * multiple processing steps to convert it from basic juggling
+ * notation into rendering data. */
+
+typedef struct trajectory *TrajectoryPtr;
+typedef struct trajectory {
+ TrajectoryPtr prev, next; /* for building list */
+ TrajectoryStatus status;
+
+ /* Throw */
+ char posn;
+ int height;
+ int adam;
+ char *pattern;
+ char *name;
+
+ /* Action */
+ Hand hand;
+ Action action;
+
+ /* LinkedAction */
+ int color;
+ Object *object;
+ int divisions;
+ double angle, spin;
+ TrajectoryPtr balllink;
+ TrajectoryPtr handlink;
+
+ /* PThratch */
+ double cx; /* Moving juggler */
+ double x, y; /* current position */
+ double dx, dy; /* initial velocity */
+
+ /* Predictor */
+ Throwable type;
+ unsigned long start, finish;
+ Spline xp, yp;
+
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Trajectory;
+
+
+/*******************
+ * Pattern Library *
+ *******************/
+
+typedef struct {
+ const char * pattern;
+ const char * name;
+} patternstruct;
+
+/* List of popular patterns, in any order */
+/* Patterns should be given in Adam notation so the generator can
+ concatenate them safely. Null descriptions are ok. Height
+ notation will be displayed automatically. */
+/* Can't const this because it is qsorted. This *should* be reentrant,
+ I think... */
+static /*const*/ patternstruct portfolio[] = {
+ {"[+2 1]", /* +3 1 */ "Typical 2 ball juggler"},
+ {"[2 0]", /* 4 0 */ "2 in 1 hand"},
+ {"[2 0 1]", /* 5 0 1 */},
+ {"[+2 0 +2 0 0]" /* +5 0 +5 0 0 */},
+ {"[+2 0 1 2 2]", /* +4 0 1 2 3 */},
+ {"[2 0 1 1]", /* 6 0 1 1 */},
+
+ {"[3]", /* 3 */ "3 cascade"},
+ {"[+3]", /* +3 */ "reverse 3 cascade"},
+ {"[=3]", /* =3 */ "cascade 3 under arm"},
+ {"[&3]", /* &3 */ "cascade 3 catching under arm"},
+ {"[_3]", /* _3 */ "bouncing 3 cascade"},
+ {"[+3 x3 =3]", /* +3 x3 =3 */ "Mill's mess"},
+ {"[3 2 1]", /* 5 3 1" */},
+ {"[3 3 1]", /* 4 4 1" */},
+ {"[3 1 2]", /* 6 1 2 */ "See-saw"},
+ {"[=3 3 1 2]", /* =4 5 1 2 */},
+ {"[=3 2 2 3 1 2]", /* =6 2 2 5 1 2 */ "=4 5 1 2 stretched"},
+ {"[+3 3 1 3]", /* +4 4 1 3 */ "anemic shower box"},
+ {"[3 3 1]", /* 4 4 1 */},
+ {"[+3 2 3]", /* +4 2 3 */},
+ {"[+3 1]", /* +5 1 */ "3 shower"},
+ {"[_3 1]", /* _5 1 */ "bouncing 3 shower"},
+ {"[3 0 3 0 3]", /* 5 0 5 0 5 */ "shake 3 out of 5"},
+ {"[3 3 3 0 0]", /* 5 5 5 0 0 */ "flash 3 out of 5"},
+ {"[3 3 0]", /* 4 5 0 */ "complete waste of a 5 ball juggler"},
+ {"[3 3 3 0 0 0 0]", /* 7 7 7 0 0 0 0 */ "3 flash"},
+ {"[+3 0 +3 0 +3 0 0]", /* +7 0 +7 0 +7 0 0 */},
+ {"[3 2 2 0 3 2 0 2 3 0 2 2 0]", /* 7 3 3 0 7 3 0 3 7 0 3 3 0 */},
+ {"[3 0 2 0]", /* 8 0 4 0 */},
+ {"[_3 2 1]", /* _5 3 1 */},
+ {"[_3 0 1]", /* _8 0 1 */},
+ {"[1 _3 1 _3 0 1 _3 0]", /* 1 _7 1 _7 0 1 _7 0 */},
+ {"[_3 2 1 _3 1 2 1]", /* _6 3 1 _6 1 3 1 */},
+
+ {"[4]", /* 4 */ "4 cascade"},
+ {"[+4 3]", /* +5 3 */ "4 ball half shower"},
+ {"[4 4 2]", /* 5 5 2 */},
+ {"[+4 4 4 +4]", /* +4 4 4 +4 */ "4 columns"},
+ {"[+4 3 +4]", /* +5 3 +4 */},
+ {"[4 3 4 4]", /* 5 3 4 4 */},
+ {"[4 3 3 4]", /* 6 3 3 4 */},
+ {"[4 3 2 4", /* 6 4 2 4 */},
+ {"[+4 1]", /* +7 1 */ "4 shower"},
+ {"[4 4 4 4 0]", /* 5 5 5 5 0 */ "learning 5"},
+ {"[+4 x4 =4]", /* +4 x4 =4 */ "Mill's mess for 4"},
+ {"[+4 2 1 3]", /* +9 3 1 3 */},
+ {"[4 4 1 4 1 4]", /* 6 6 1 5 1 5, by Allen Knutson */},
+ {"[_4 _4 _4 1 _4 1]", /* _5 _6 _6 1 _5 1 */},
+ {"[_4 3 3]", /* _6 3 3 */},
+ {"[_4 3 1]", /* _7 4 1 */},
+ {"[_4 2 1]", /* _8 3 1 */},
+ {"[_4 3 3 3 0]", /* _8 4 4 4 0 */},
+ {"[_4 1 3 1]", /* _9 1 5 1 */},
+ {"[_4 1 3 1 2]", /* _10 1 6 1 2 */},
+
+ {"[5]", /* 5 */ "5 cascade"},
+ {"[_5 _5 _5 _5 _5 5 5 5 5 5]", /* _5 _5 _5 _5 _5 5 5 5 5 5 */},
+ {"[+5 x5 =5]", /* +5 x5 =5 */ "Mill's mess for 5"},
+ {"[5 4 4]", /* 7 4 4 */},
+ {"[_5 4 4]", /* _7 4 4 */},
+ {"[1 2 3 4 5 5 5 5 5]", /* 1 2 3 4 5 6 7 8 9 */ "5 ramp"},
+ {"[5 4 5 3 1]", /* 8 5 7 4 1, by Allen Knutson */},
+ {"[_5 4 1 +4]", /* _9 5 1 5 */},
+ {"[_5 4 +4 +4]", /* _8 4 +4 +4 */},
+ {"[_5 4 4 4 1]", /* _9 5 5 5 1 */},
+ {"[_5 4 4 5 1]",},
+ {"[_5 4 4 +4 4 0]", /*_10 5 5 +5 5 0 */},
+
+ {"[6]", /* 6 */ "6 cascade"},
+ {"[+6 5]", /* +7 5 */},
+ {"[6 4]", /* 8 4 */},
+ {"[+6 3]", /* +9 3 */},
+ {"[6 5 4 4]", /* 9 7 4 4 */},
+ {"[+6 5 5 5]", /* +9 5 5 5 */},
+ {"[6 0 6]", /* 9 0 9 */},
+ {"[_6 0 _6]", /* _9 0 _9 */},
+
+ {"[_7]", /* _7 */ "bouncing 7 cascade"},
+ {"[7]", /* 7 */ "7 cascade"},
+ {"[7 6 6 6 6]", /* 11 6 6 6 6 */ "Gatto's High Throw"},
+
+};
+
+
+
+typedef struct { int start; int number; } PatternIndex;
+
+struct patternindex {
+ int minballs;
+ int maxballs;
+ PatternIndex index[countof(portfolio)];
+};
+
+
+/* Jugglestruct: per-screen global data. The master Object
+ * and Trajectory lists are anchored here. */
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ double scale;
+ double cx;
+ double Gr;
+ Trajectory *head;
+ Arm arm[2][2];
+ char *pattern;
+ int count;
+ int num_balls;
+ time_t begintime; /* should make 'time' usable for at least 48 days
+ on a 32-bit machine */
+ unsigned long time; /* millisecond timer*/
+ ObjType objtypes;
+ Object *objects;
+ struct patternindex patternindex;
+ texture_font_data *font_data;
+} jugglestruct;
+
+static jugglestruct *juggles = (jugglestruct *) NULL;
+
+/*******************
+ * list management *
+ *******************/
+
+#define DUP_OBJECT(n, t) { \
+ (n)->object = (t)->object; \
+ if((n)->object != NULL) (n)->object->count++; \
+}
+
+/* t must point to an existing element. t must not be an
+ expression ending ->next or ->prev */
+#define REMOVE(t) { \
+ (t)->next->prev = (t)->prev; \
+ (t)->prev->next = (t)->next; \
+ free(t); \
+}
+
+/* t receives element to be created and added to the list. ot must
+ point to an existing element or be identical to t to start a new
+ list. Applicable to Trajectories, Objects and Traces. */
+#define ADD_ELEMENT(type, t, ot) \
+ if (((t) = (type*)calloc(1,sizeof(type))) != NULL) { \
+ (t)->next = (ot)->next; \
+ (t)->prev = (ot); \
+ (ot)->next = (t); \
+ (t)->next->prev = (t); \
+ }
+
+static void
+object_destroy(Object* o)
+{
+ if(o->trace != NULL) {
+ while(o->trace->next != o->trace) {
+ Trace *s = o->trace->next;
+ REMOVE(s); /* Don't eliminate 's' */
+ }
+ free(o->trace);
+ }
+ REMOVE(o);
+}
+
+static void
+trajectory_destroy(Trajectory *t) {
+ if(t->name != NULL) free(t->name);
+ if(t->pattern != NULL) free(t->pattern);
+ /* Reduce object link count and call destructor if necessary */
+ if(t->object != NULL && --t->object->count < 1 && t->object->tracelen == 0) {
+ object_destroy(t->object);
+ }
+ REMOVE(t); /* Unlink and free */
+}
+
+ENTRYPOINT void
+free_juggle(ModeInfo *mi) {
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+
+ if (sp->head != NULL) {
+ while (sp->head->next != sp->head) {
+ trajectory_destroy(sp->head->next);
+ }
+ free(sp->head);
+ sp->head = (Trajectory *) NULL;
+ }
+ if(sp->objects != NULL) {
+ while (sp->objects->next != sp->objects) {
+ object_destroy(sp->objects->next);
+ }
+ free(sp->objects);
+ sp->objects = (Object*)NULL;
+ }
+ if(sp->pattern != NULL) {
+ free(sp->pattern);
+ sp->pattern = NULL;
+ }
+}
+
+static Bool
+add_throw(ModeInfo *mi, char type, int h, Notation n, const char* name)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t;
+
+ ADD_ELEMENT(Trajectory, t, sp->head->prev);
+ if(t == NULL){ /* Out of Memory */
+ free_juggle(mi);
+ return False;
+ }
+ t->object = NULL;
+ if(name != NULL)
+ t->name = strdup(name);
+ t->posn = type;
+ if (n == ADAM) {
+ t->adam = h;
+ t->height = 0;
+ t->status = ATCH;
+ } else {
+ t->height = h;
+ t->status = THRATCH;
+ }
+ return True;
+}
+
+/* add a Thratch to the performance */
+static Bool
+program(ModeInfo *mi, const char *patn, const char *name, int cycles)
+{
+ const char *p;
+ int w, h, i, seen;
+ Notation notation;
+ char type;
+
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "juggle[%d]: Programmed: %s x %d\n",
+ MI_SCREEN(mi), (name == NULL) ? patn : name, cycles);
+ }
+
+ for(w=i=0; i < cycles; i++, w++) { /* repeat until at least "cycles" throws
+ have been programmed */
+ /* title is the pattern name to be supplied to the first throw of
+ a sequence. If no name if given, use an empty title so that
+ the sequences are still delimited. */
+ const char *title = (name != NULL)? name : "";
+ type=' ';
+ h = 0;
+ seen = 0;
+ notation = HEIGHT;
+ for(p=patn; *p; p++) {
+ if (*p >= '0' && *p <='9') {
+ seen = 1;
+ h = 10*h + (*p - '0');
+ } else {
+ Notation nn = notation;
+ switch (*p) {
+ case '[': /* begin Adam notation */
+ notation = ADAM;
+ break;
+ case '-': /* Inside throw */
+ type = ' ';
+ break;
+ case '+': /* Outside throw */
+ case '=': /* Cross throw */
+ case '&': /* Cross catch */
+ case 'x': /* Cross throw and catch */
+ case '_': /* Bounce */
+ case 'k': /* Kickup */
+ type = *p;
+ break;
+ case '*': /* Lose ball */
+ seen = 1;
+ h = -1;
+ /* fall through */
+ case ']': /* end Adam notation */
+ nn = HEIGHT;
+ /* fall through */
+ case ' ':
+ if (seen) {
+ i++;
+ if (!add_throw(mi, type, h, notation, title))
+ return False;
+ title = NULL;
+ type=' ';
+ h = 0;
+ seen = 0;
+ }
+ notation = nn;
+ break;
+ default:
+ if(w == 0) { /* Only warn on first pass */
+ (void) fprintf(stderr,
+ "juggle[%d]: Unexpected pattern instruction: '%c'\n",
+ MI_SCREEN(mi), *p);
+ }
+ break;
+ }
+ }
+ }
+ if (seen) { /* end of sequence */
+ if (!add_throw(mi, type, h, notation, title))
+ return False;
+ title = NULL;
+ }
+ }
+ return True;
+}
+
+/*
+ ~~~~\~~~~~\~~~
+ \\~\\~\~\\\~~~
+ \\~\\\\~\\\~\~
+ \\\\\\\\\\\~\\
+
+[ 3 3 1 3 4 2 3 1 3 3 4 0 2 1 ]
+
+4 4 1 3 12 2 4 1 4 4 13 0 3 1
+
+*/
+#define BOUNCEOVER 10
+#define KICKMIN 7
+#define THROWMAX 20
+
+/* Convert Adam notation into heights */
+static void
+adam(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ for(t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == ATCH) {
+ int a = t->adam;
+ t->height = 0;
+ for(p = t->next; a > 0; p = p->next) {
+ if(p == sp->head) {
+ t->height = -9; /* Indicate end of processing for name() */
+ return;
+ }
+ if (p->status != ATCH || p->adam < 0 || p->adam>= a) {
+ a--;
+ }
+ t->height++;
+ }
+ if(t->height > BOUNCEOVER && t->posn == ' '){
+ t->posn = '_'; /* high defaults can be bounced */
+ } else if(t->height < 3 && t->posn == '_') {
+ t->posn = ' '; /* Can't bounce short throws. */
+ }
+ if(t->height < KICKMIN && t->posn == 'k'){
+ t->posn = ' '; /* Can't kick short throws */
+ }
+ if(t->height > THROWMAX){
+ t->posn = 'k'; /* Use kicks for ridiculously high throws */
+ }
+ t->status = THRATCH;
+ }
+ }
+}
+
+/* Discover converted heights and update the sequence title */
+static void
+name(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ char buffer[BUFSIZ];
+ char *b;
+ for(t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == THRATCH && t->name != NULL) {
+ b = buffer;
+ for(p = t; p == t || p->name == NULL; p = p->next) {
+ if(p == sp->head || p->height < 0) { /* end of reliable data */
+ return;
+ }
+ if(p->posn == ' ') {
+ b += sprintf(b, " %d", p->height);
+ } else {
+ b += sprintf(b, " %c%d", p->posn, p->height);
+ }
+ if(b - buffer > 500) break; /* otherwise this could eventually
+ overflow. It'll be too big to
+ display anyway. */
+ }
+ if(*t->name != 0) {
+ (void) sprintf(b, ", %s", t->name);
+ }
+ free(t->name); /* Don't need name any more, it's been converted
+ to pattern */
+ t->name = NULL;
+ if(t->pattern != NULL) free(t->pattern);
+ t->pattern = strdup(buffer);
+ }
+ }
+}
+
+/* Split Thratch notation into explicit throws and catches.
+ Usually Catch follows Throw in same hand, but take care of special
+ cases. */
+
+/* ..n1.. -> .. LTn RT1 LC RC .. */
+/* ..nm.. -> .. LTn LC RTm RC .. */
+
+static Bool
+part(ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t, *nt, *p;
+ Hand hand = (LRAND() & 1) ? RIGHT : LEFT;
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status > THRATCH) {
+ hand = t->hand;
+ } else if (t->status == THRATCH) {
+ char posn = '=';
+
+ /* plausibility check */
+ if (t->height <= 2 && t->posn == '_') {
+ t->posn = ' '; /* no short bounces */
+ }
+ if (t->height <= 1 && (t->posn == '=' || t->posn == '&')) {
+ t->posn = ' '; /* 1's need close catches */
+ }
+
+ switch (t->posn) {
+ /* throw catch */
+ case ' ': posn = '-'; t->posn = '+'; break;
+ case '+': posn = '+'; t->posn = '-'; break;
+ case '=': posn = '='; t->posn = '+'; break;
+ case '&': posn = '+'; t->posn = '='; break;
+ case 'x': posn = '='; t->posn = '='; break;
+ case '_': posn = '_'; t->posn = '-'; break;
+ case 'k': posn = 'k'; t->posn = 'k'; break;
+ default:
+ (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+ break;
+ }
+ hand = (Hand) ((hand + 1) % 2);
+ t->status = ACTION;
+ t->hand = hand;
+ p = t->prev;
+
+ if (t->height == 1 && p != sp->head) {
+ p = p->prev; /* '1's are thrown earlier than usual */
+ }
+
+
+
+ t->action = CATCH;
+ ADD_ELEMENT(Trajectory, nt, p);
+ if(nt == NULL){
+ free_juggle(mi);
+ return False;
+ }
+ nt->object = NULL;
+ nt->status = ACTION;
+ nt->action = THROW;
+ nt->height = t->height;
+ nt->hand = hand;
+ nt->posn = posn;
+
+ }
+ }
+ return True;
+}
+
+static ObjType
+choose_object(void) {
+ ObjType o;
+ for (;;) {
+ o = (ObjType)NRAND((ObjType)NUM_OBJECT_TYPES);
+ if(balls && o == BALL) break;
+ if(clubs && o == CLUB) break;
+ if(torches && o == TORCH) break;
+ if(knives && o == KNIFE) break;
+ if(rings && o == RING) break;
+ if(bballs && o == BBALLS) break;
+ }
+ return o;
+}
+
+/* Connnect up throws and catches to figure out which ball goes where.
+ Do the same with the juggler's hands. */
+
+static void
+lob(ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t, *p;
+ int h;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == ACTION) {
+ if (t->action == THROW) {
+ if (t->type == Empty) {
+ /* Create new Object */
+ ADD_ELEMENT(Object, t->object, sp->objects);
+ t->object->count = 1;
+ t->object->tracelen = 0;
+ t->object->active = False;
+ /* Initialise object's circular trace list */
+ ADD_ELEMENT(Trace, t->object->trace, t->object->trace);
+
+ if (MI_NPIXELS(mi) > 2) {
+ t->object->color = 1 + NRAND(MI_NPIXELS(mi) - 2);
+ } else {
+#ifdef STANDALONE
+ t->object->color = 1;
+#else
+ t->object->color = 0;
+#endif
+ }
+
+ /* Small chance of picking a random object instead of the
+ current theme. */
+ if(NRAND(OBJMIXPROB) == 0) {
+ t->object->type = choose_object();
+ } else {
+ t->object->type = sp->objtypes;
+ }
+
+ /* Check to see if we need trails for this object */
+ if(tail < ObjectDefs[t->object->type].mintrail) {
+ t->object->tail = ObjectDefs[t->object->type].mintrail;
+ } else {
+ t->object->tail = tail;
+ }
+ }
+
+ /* Balls can change divisions at each throw */
+ /* no, that looks stupid. -jwz */
+ if (t->divisions < 1)
+ t->divisions = 2 * (NRAND(2) + 1);
+
+ /* search forward for next catch in this hand */
+ for (p = t->next; t->handlink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) return;
+ if (p->action == CATCH) {
+ if (t->handlink == NULL && p->hand == t->hand) {
+ t->handlink = p;
+ }
+ }
+ }
+
+ if (t->height > 0) {
+ h = t->height - 1;
+
+ /* search forward for next ball catch */
+ for (p = t->next; t->balllink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) {
+ t->handlink = NULL;
+ return;
+ }
+ if (p->action == CATCH) {
+ if (t->balllink == NULL && --h < 1) { /* caught */
+ t->balllink = p; /* complete trajectory */
+# if 0
+ if (p->type == Full) {
+ (void) fprintf(stderr, "juggle[%d]: Dropped %d\n",
+ MI_SCREEN(mi), t->object->color);
+ }
+#endif
+ p->type = Full;
+ DUP_OBJECT(p, t); /* accept catch */
+ p->angle = t->angle;
+ p->divisions = t->divisions;
+ }
+ }
+ }
+ }
+ t->type = Empty; /* thrown */
+ } else if (t->action == CATCH) {
+ /* search forward for next throw from this hand */
+ for (p = t->next; t->handlink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) return;
+ if (p->action == THROW && p->hand == t->hand) {
+ p->type = t->type; /* pass ball */
+ DUP_OBJECT(p, t); /* pass object */
+ p->divisions = t->divisions;
+ t->handlink = p;
+ }
+ }
+ }
+ t->status = LINKEDACTION;
+ }
+ }
+}
+
+/* Clap when both hands are empty */
+static void
+clap(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == LINKEDACTION &&
+ t->action == CATCH &&
+ t->type == Empty &&
+ t->handlink != NULL &&
+ t->handlink->height == 0) { /* Completely idle hand */
+
+ for (p = t->next; p != sp->head; p = p->next) {
+ if (p->status == LINKEDACTION &&
+ p->action == CATCH &&
+ p->hand != t->hand) { /* Next catch other hand */
+ if(p->type == Empty &&
+ p->handlink != NULL &&
+ p->handlink->height == 0) { /* Also completely idle */
+
+ t->handlink->posn = '^'; /* Move first hand's empty throw */
+ p->posn = '^'; /* to meet second hand's empty
+ catch */
+
+ }
+ break; /* Only need first catch */
+ }
+ }
+ }
+ }
+}
+
+#define CUBIC(s, t) ((((s).a * (t) + (s).b) * (t) + (s).c) * (t) + (s).d)
+
+/* Compute single spline from x0 with velocity dx0 at time t0 to x1
+ with velocity dx1 at time t1 */
+static Spline
+makeSpline(double x0, double dx0, int t0, double x1, double dx1, int t1)
+{
+ Spline s;
+ double a, b, c, d;
+ double x10;
+ double t10;
+
+ x10 = x1 - x0;
+ t10 = t1 - t0;
+ a = ((dx0 + dx1)*t10 - 2*x10) / (t10*t10*t10);
+ b = (3*x10 - (2*dx0 + dx1)*t10) / (t10*t10);
+ c = dx0;
+ d = x0;
+ s.a = a;
+ s.b = -3*a*t0 + b;
+ s.c = (3*a*t0 - 2*b)*t0 + c;
+ s.d = ((-a*t0 + b)*t0 - c)*t0 +d;
+ return s;
+}
+
+/* Compute a pair of splines. s1 goes from x0 vith velocity dx0 at
+ time t0 to x1 at time t1. s2 goes from x1 at time t1 to x2 with
+ velocity dx2 at time t2. The arrival and departure velocities at
+ x1, t1 must be the same. */
+static double
+makeSplinePair(Spline *s1, Spline *s2,
+ double x0, double dx0, int t0,
+ double x1, int t1,
+ double x2, double dx2, int t2)
+{
+ double x10, x21, t21, t10, t20, dx1;
+ x10 = x1 - x0;
+ x21 = x2 - x1;
+ t21 = t2 - t1;
+ t10 = t1 - t0;
+ t20 = t2 - t0;
+ dx1 = (3*x10*t21*t21 + 3*x21*t10*t10 + 3*dx0*t10*t21*t21
+ - dx2*t10*t10*t21 - 4*dx0*t10*t21*t21) /
+ (2*t10*t21*t20);
+ *s1 = makeSpline(x0, dx0, t0, x1, dx1, t1);
+ *s2 = makeSpline(x1, dx1, t1, x2, dx2, t2);
+ return dx1;
+}
+
+/* Compute a Ballistic path in a pair of degenerate splines. sx goes
+ from x at time t at constant velocity dx. sy goes from y at time t
+ with velocity dy and constant acceleration g. */
+static void
+makeParabola(Trajectory *n,
+ double x, double dx, double y, double dy, double g)
+{
+ double t = (double)n->start;
+ n->xp.a = 0;
+ n->xp.b = 0;
+ n->xp.c = dx;
+ n->xp.d = -dx*t + x;
+ n->yp.a = 0;
+ n->yp.b = g/2;
+ n->yp.c = -g*t + dy;
+ n->yp.d = g/2*t*t - dy*t + y;
+}
+
+
+
+
+#define SX 25 /* Shoulder Width */
+
+/* Convert hand position symbols into actual time/space coordinates */
+static void
+positions(jugglestruct *sp)
+{
+ Trajectory *t;
+ unsigned long now = sp->time; /* Make sure we're not lost in the past */
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status >= PTHRATCH) {
+ now = t->start;
+ } else if (t->status == ACTION || t->status == LINKEDACTION) {
+ /* Allow ACTIONs to be annotated, but we won't mark them ready
+ for the next stage */
+
+ double xo = 0, yo;
+ double sx = SX;
+ double pose = SX/2;
+
+ /* time */
+ if (t->action == CATCH) { /* Throw-to-catch */
+ if (t->type == Empty) {
+ now += (int) THROW_NULL_INTERVAL; /* failed catch is short */
+ } else { /* successful catch */
+ now += (int)(THROW_CATCH_INTERVAL);
+ }
+ } else { /* Catch-to-throw */
+ if(t->object != NULL) {
+ now += (int) (CATCH_THROW_INTERVAL *
+ ObjectDefs[t->object->type].weight);
+ } else {
+ now += (int) (CATCH_THROW_INTERVAL);
+ }
+ }
+
+ if(t->start == 0)
+ t->start = now;
+ else /* Concatenated performances may need clock resync */
+ now = t->start;
+
+ t->cx = 0;
+
+ /* space */
+ yo = 90;
+
+ /* Add room for the handle */
+ if(t->action == CATCH && t->object != NULL)
+ yo -= ObjectDefs[t->object->type].handle;
+
+ switch (t->posn) {
+ case '-': xo = sx - pose; break;
+ case '_':
+ case 'k':
+ case '+': xo = sx + pose; break;
+ case '~':
+ case '=': xo = - sx - pose; yo += pose; break;
+ case '^': xo = 0; yo += pose*2; break; /* clap */
+ default:
+ (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+ break;
+ }
+
+#ifdef _2DSpinsDontWorkIn3D
+ t->angle = (((t->hand == LEFT) ^
+ (t->posn == '+' || t->posn == '_' || t->posn == 'k' ))?
+ -1 : 1) * M_PI/2;
+#else
+ t->angle = -M_PI/2;
+#endif
+
+ t->x = t->cx + ((t->hand == LEFT) ? xo : -xo);
+ t->y = yo;
+
+ /* Only mark complete if it was already linked */
+ if(t->status == LINKEDACTION) {
+ t->status = PTHRATCH;
+ }
+ }
+ }
+}
+
+
+/* Private physics functions */
+
+/* Compute the spin-rate for a trajectory. Different types of throw
+ (eg, regular thows, bounces, kicks, etc) have different spin
+ requirements.
+
+ type = type of object
+ h = trajectory of throwing hand (throws), or next throwing hand (catches)
+ old = earlier spin to consider
+ dt = time span of this trajectory
+ height = height of ball throw or 0 if based on old spin
+ turns = full club turns required during this operation
+ togo = partial club turns required to match hands
+*/
+static double
+spinrate(ObjType type, Trajectory *h, double old, double dt,
+ int height, int turns, double togo)
+{
+#ifdef _2DSpinsDontWorkIn3D
+ const int dir = (h->hand == LEFT) ^ (h->posn == '+')? -1 : 1;
+#else
+ const int dir = 1;
+#endif
+
+ if(ObjectDefs[type].handle != 0) { /* Clubs */
+ return (dir * turns * 2 * M_PI + togo) / dt;
+ } else if(height == 0) { /* Balls already spinning */
+ return old/2;
+ } else { /* Balls */
+ return dir * NRAND(height*10)/20/ObjectDefs[type].weight * 2 * M_PI / dt;
+ }
+}
+
+
+/* compute the angle at the end of a spinning trajectory */
+static double
+end_spin(Trajectory *t)
+{
+ return t->angle + t->spin * (t->finish - t->start);
+}
+
+/* Sets the initial angle of the catch following hand movement t to
+ the final angle of the throw n. Also sets the angle of the
+ subsequent throw to the same angle plus half a turn. */
+static void
+match_spins_on_catch(Trajectory *t, Trajectory *n)
+{
+ if(ObjectDefs[t->balllink->object->type].handle == 0) {
+ t->balllink->angle = end_spin(n);
+ if(t->balllink->handlink != NULL) {
+#ifdef _2DSpinsDontWorkIn3D
+ t->balllink->handlink->angle = t->balllink->angle + M_PI;
+#else
+ t->balllink->handlink->angle = t->balllink->angle;
+#endif
+ }
+ }
+}
+
+static double
+find_bounce(jugglestruct *sp,
+ double yo, double yf, double yc, double tc, double cor)
+{
+ double tb, i, dy = 0;
+ const double e = 1; /* permissible error in yc */
+
+ /*
+ tb = time to bounce
+ yt = height at catch time after one bounce
+ one or three roots according to timing
+ find one by interval bisection
+ */
+ tb = tc;
+ for(i = tc / 2; i > 0.0001; i/=2){
+ double dt, yt;
+ if(tb == 0){
+ (void) fprintf(stderr, "juggle: bounce div by zero!\n");
+ break;
+ }
+ dy = (yf - yo)/tb + sp->Gr/2*tb;
+ dt = tc - tb;
+ yt = -cor*dy*dt + sp->Gr/2*dt*dt + yf;
+ if(yt < yc + e){
+ tb-=i;
+ }else if(yt > yc - e){
+ tb+=i;
+ }else{
+ break;
+ }
+ }
+ if(dy*THROW_CATCH_INTERVAL < -200) { /* bounce too hard */
+ tb = -1;
+ }
+ return tb;
+}
+
+static Trajectory*
+new_predictor(const Trajectory *t, int start, int finish, double angle)
+{
+ Trajectory *n;
+ ADD_ELEMENT(Trajectory, n, t->prev);
+ if(n == NULL){
+ return NULL;
+ }
+ DUP_OBJECT(n, t);
+ n->divisions = t->divisions;
+ n->type = Ball;
+ n->status = PREDICTOR;
+
+ n->start = start;
+ n->finish = finish;
+ n->angle = angle;
+ return n;
+}
+
+/* Turn abstract timings into physically appropriate object trajectories. */
+static Bool
+projectile(jugglestruct *sp)
+{
+ Trajectory *t;
+ const int yf = 0; /* Floor height */
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status != PTHRATCH || t->action != THROW) {
+ continue;
+ } else if (t->balllink == NULL) { /* Zero Throw */
+ t->status = BPREDICTOR;
+ } else if (t->balllink->handlink == NULL) { /* Incomplete */
+ return True;
+ } else if(t->balllink == t->handlink) {
+ /* '2' height - hold on to ball. Don't need to consider
+ flourishes, 'hands' will do that automatically anyway */
+
+ t->type = Full;
+ /* Zero spin to avoid wrist injuries */
+ t->spin = 0;
+ match_spins_on_catch(t, t);
+ t->dx = t->dy = 0;
+ t->status = BPREDICTOR;
+ continue;
+ } else {
+ if (t->posn == '_') { /* Bounce once */
+
+ const int tb = t->start +
+ find_bounce(sp, t->y, (double) yf, t->balllink->y,
+ (double) (t->balllink->start - t->start),
+ ObjectDefs[t->object->type].cor);
+
+ if(tb < t->start) { /* bounce too hard */
+ t->posn = '+'; /* Use regular throw */
+ } else {
+ Trajectory *n; /* First (throw) trajectory. */
+ double dt; /* Time span of a trajectory */
+ double dy; /* Distance span of a follow-on trajectory.
+ First trajectory uses t->dy */
+ /* dx is constant across both trajectories */
+ t->dx = (t->balllink->x - t->x) / (t->balllink->start - t->start);
+
+ { /* ball follows parabola down */
+ n = new_predictor(t, t->start, tb, t->angle);
+ if(n == NULL) return False;
+ dt = n->finish - n->start;
+ /* Ball rate 4, no flight or matching club turns */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0, 0.0);
+ t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ { /* ball follows parabola up */
+ Trajectory *m = new_predictor(t, n->finish, t->balllink->start,
+ end_spin(n));
+ if(m == NULL) return False;
+ dt = m->finish - m->start;
+ /* Use previous ball rate, no flight club turns */
+ m->spin = spinrate(t->object->type, t, n->spin, dt, 0, 0,
+ t->balllink->angle - m->angle);
+ match_spins_on_catch(t, m);
+ dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+ makeParabola(m, t->balllink->x - t->dx * dt,
+ t->dx, (double) yf, dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ continue;
+ }
+ } else if (t->posn == 'k') { /* Drop & Kick */
+ Trajectory *n; /* First (drop) trajectory. */
+ Trajectory *o; /* Second (rest) trajectory */
+ Trajectory *m; /* Third (kick) trajectory */
+ const int td = t->start + 2*THROW_CATCH_INTERVAL; /* Drop time */
+ const int tk = t->balllink->start - 5*THROW_CATCH_INTERVAL; /* Kick */
+ double dt, dy;
+
+ { /* Fall to ground */
+ n = new_predictor(t, t->start, td, t->angle);
+ if(n == NULL) return False;
+ dt = n->finish - n->start;
+ /* Ball spin rate 4, no flight club turns */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0,
+ t->balllink->angle - n->angle);
+ t->dx = (t->balllink->x - t->x) / dt;
+ t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ { /* Rest on ground */
+ o = new_predictor(t, n->finish, tk, end_spin(n));
+ if(o == NULL) return False;
+ o->spin = 0;
+ makeParabola(o, t->balllink->x, 0.0, (double) yf, 0.0, 0.0);
+ }
+
+ /* Kick up */
+ {
+ m = new_predictor(t, o->finish, t->balllink->start, end_spin(o));
+ if(m == NULL) return False;
+ dt = m->finish - m->start;
+ /* Match receiving hand, ball rate 4, one flight club turn */
+ m->spin = spinrate(t->object->type, t->balllink->handlink, 0.0, dt,
+ 4, 1, t->balllink->angle - m->angle);
+ match_spins_on_catch(t, m);
+ dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+ makeParabola(m, t->balllink->x, 0.0, (double) yf, dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ continue;
+ }
+
+ /* Regular flight, no bounce */
+ { /* ball follows parabola */
+ double dt;
+ Trajectory *n = new_predictor(t, t->start,
+ t->balllink->start, t->angle);
+ if(n == NULL) return False;
+ dt = t->balllink->start - t->start;
+ /* Regular spin */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, t->height, t->height/2,
+ t->balllink->angle - n->angle);
+ match_spins_on_catch(t, n);
+ t->dx = (t->balllink->x - t->x) / dt;
+ t->dy = (t->balllink->y - t->y) / dt - sp->Gr/2 * dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ }
+ }
+ return True;
+}
+
+/* Turn abstract hand motions into cubic splines. */
+static void
+hands(jugglestruct *sp)
+{
+ Trajectory *t, *u, *v;
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ /* no throw => no velocity */
+ if (t->status != BPREDICTOR) {
+ continue;
+ }
+
+ u = t->handlink;
+ if (u == NULL) { /* no next catch */
+ continue;
+ }
+ v = u->handlink;
+ if (v == NULL) { /* no next throw */
+ continue;
+ }
+
+ /* double spline takes hand from throw, thru catch, to
+ next throw */
+
+ t->finish = u->start;
+ t->status = PREDICTOR;
+
+ u->finish = v->start;
+ u->status = PREDICTOR;
+
+
+ /* FIXME: These adjustments leave a small glitch when alternating
+ balls and clubs. Just hope no-one notices. :-) */
+
+ /* make sure empty hand spin matches the thrown object in case it
+ had a handle */
+
+ t->spin = ((t->hand == LEFT)? -1 : 1 ) *
+ fabs((u->angle - t->angle)/(u->start - t->start));
+
+ u->spin = ((v->hand == LEFT) ^ (v->posn == '+')? -1 : 1 ) *
+ fabs((v->angle - u->angle)/(v->start - u->start));
+
+ (void) makeSplinePair(&t->xp, &u->xp,
+ t->x, t->dx, t->start,
+ u->x, u->start,
+ v->x, v->dx, v->start);
+ (void) makeSplinePair(&t->yp, &u->yp,
+ t->y, t->dy, t->start,
+ u->y, u->start,
+ v->y, v->dy, v->start);
+
+ t->status = PREDICTOR;
+ }
+}
+
+/* Given target x, y find_elbow puts hand at target if possible,
+ * otherwise makes hand point to the target */
+static void
+find_elbow(int armlength, DXPoint *h, DXPoint *e, DXPoint *p, DXPoint *s,
+ int z)
+{
+ double r, h2, t;
+ double x = p->x - s->x;
+ double y = p->y - s->y;
+ h2 = x*x + y*y + z*z;
+ if (h2 > 4 * armlength * armlength) {
+ t = armlength/sqrt(h2);
+ e->x = t*x + s->x;
+ e->y = t*y + s->y;
+ h->x = 2 * t * x + s->x;
+ h->y = 2 * t * y + s->y;
+ } else {
+ r = sqrt((double)(x*x + z*z));
+ t = sqrt(4 * armlength * armlength / h2 - 1);
+ e->x = x*(1 + y*t/r)/2 + s->x;
+ e->y = (y - r*t)/2 + s->y;
+ h->x = x + s->x;
+ h->y = y + s->y;
+ }
+}
+
+
+/* NOTE: returned x, y adjusted for arm reach */
+static void
+reach_arm(ModeInfo * mi, Hand side, DXPoint *p)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ DXPoint h, e;
+ find_elbow(40, &h, &e, p, &sp->arm[1][side][SHOULDER], 25);
+ *p = sp->arm[1][side][HAND] = h;
+ sp->arm[1][side][ELBOW] = e;
+}
+
+#if DEBUG
+/* dumps a human-readable rendition of the current state of the juggle
+ pipeline to stderr for debugging */
+static void
+dump(jugglestruct *sp)
+{
+ Trajectory *t;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ switch (t->status) {
+ case ATCH:
+ (void) fprintf(stderr, "%p a %c%d\n", (void*)t, t->posn, t->adam);
+ break;
+ case THRATCH:
+ (void) fprintf(stderr, "%p T %c%d %s\n", (void*)t, t->posn, t->height,
+ t->pattern == NULL?"":t->pattern);
+ break;
+ case ACTION:
+ if (t->action == CATCH)
+ (void) fprintf(stderr, "%p A %c%cC\n",
+ (void*)t, t->posn,
+ t->hand ? 'R' : 'L');
+ else
+ (void) fprintf(stderr, "%p A %c%c%c%d\n",
+ (void*)t, t->posn,
+ t->hand ? 'R' : 'L',
+ (t->action == THROW)?'T':'N',
+ t->height);
+ break;
+ case LINKEDACTION:
+ (void) fprintf(stderr, "%p L %c%c%c%d %d %p %p\n",
+ (void*)t, t->posn,
+ t->hand?'R':'L',
+ (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+ t->height, t->object == NULL?0:t->object->color,
+ (void*)t->handlink, (void*)t->balllink);
+ break;
+ case PTHRATCH:
+ (void) fprintf(stderr, "%p O %c%c%c%d %d %2d %6lu %6lu\n",
+ (void*)t, t->posn,
+ t->hand?'R':'L',
+ (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+ t->height, t->type, t->object == NULL?0:t->object->color,
+ t->start, t->finish);
+ break;
+ case BPREDICTOR:
+ (void) fprintf(stderr, "%p B %c %2d %6lu %6lu %g\n",
+ (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+ t->object == NULL?0:t->object->color,
+ t->start, t->finish, t->yp.c);
+ break;
+ case PREDICTOR:
+ (void) fprintf(stderr, "%p P %c %2d %6lu %6lu %g\n",
+ (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+ t->object == NULL?0:t->object->color,
+ t->start, t->finish, t->yp.c);
+ break;
+ default:
+ (void) fprintf(stderr, "%p: status %d not implemented\n",
+ (void*)t, t->status);
+ break;
+ }
+ }
+ (void) fprintf(stderr, "---\n");
+}
+#endif
+
+static int get_num_balls(const char *j)
+{
+ int balls = 0;
+ const char *p;
+ int h = 0;
+ if (!j) abort();
+ for (p = j; *p; p++) {
+ if (*p >= '0' && *p <='9') { /* digit */
+ h = 10*h + (*p - '0');
+ } else {
+ if (h > balls) {
+ balls = h;
+ }
+ h = 0;
+ }
+ }
+ return balls;
+}
+
+static int
+compare_num_balls(const void *p1, const void *p2)
+{
+ int i, j;
+ i = get_num_balls(((patternstruct*)p1)->pattern);
+ j = get_num_balls(((patternstruct*)p2)->pattern);
+ if (i > j) {
+ return (1);
+ } else if (i < j) {
+ return (-1);
+ } else {
+ return (0);
+ }
+}
+
+
+/**************************************************************************
+ * Rendering Functions *
+ * *
+ **************************************************************************/
+
+static int
+show_arms(ModeInfo * mi)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ unsigned int i, j;
+ Hand side;
+ XPoint a[countof(sp->arm[0][0])];
+ int slices = 12;
+ int thickness = 7;
+ int soffx = 10;
+ int soffy = 11;
+
+ glFrontFace(GL_CCW);
+
+ j = 1;
+ for(side = LEFT; side <= RIGHT; side = (Hand)((int)side + 1)) {
+ /* Translate into device coords */
+ for(i = 0; i < countof(a); i++) {
+ a[i].x = (short)(SCENE_WIDTH/2 + sp->arm[j][side][i].x*sp->scale);
+ a[i].y = (short)(SCENE_HEIGHT - sp->arm[j][side][i].y*sp->scale);
+ if(j == 1)
+ sp->arm[0][side][i] = sp->arm[1][side][i];
+ }
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+
+ /* Upper arm */
+ polys += tube (a[2].x - (side == LEFT ? soffx : -soffx), a[2].y + soffy, 0,
+ a[1].x, a[1].y, ARMLENGTH/2,
+ thickness, 0, slices,
+ True, True, MI_IS_WIREFRAME(mi));
+
+ /* Lower arm */
+ polys += tube (a[1].x, a[1].y, ARMLENGTH/2,
+ a[0].x, a[0].y, ARMLENGTH,
+ thickness * 0.8, 0, slices,
+ True, True, MI_IS_WIREFRAME(mi));
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+
+ /* Shoulder */
+ glPushMatrix();
+ glTranslatef (a[2].x - (side == LEFT ? soffx : -soffx),
+ a[2].y + soffy,
+ 0);
+ glScalef(9, 9, 9);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Elbow */
+ glPushMatrix();
+ glTranslatef (a[1].x, a[1].y, ARMLENGTH/2);
+ glScalef(4, 4, 4);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Hand */
+ glPushMatrix();
+ glTranslatef (a[0].x, a[0].y, ARMLENGTH);
+ glScalef(8, 8, 8);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ }
+ return polys;
+}
+
+static int
+show_figure(ModeInfo * mi, Bool init)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*XPoint p[7];*/
+ int i;
+
+ /* +-----+ 9
+ | 6 |
+ 10 +--+--+
+ 2 +---+---+ 3
+ \ 5 /
+ \ /
+ \ /
+ 1 +
+ / \
+ / \
+ 0 +-----+ 4
+ | |
+ | |
+ | |
+ 7 + + 8
+ */
+
+ /* #### most of this is unused now */
+ static const XPoint figure[] = {
+ { 15, 70}, /* 0 Left Hip */
+ { 0, 90}, /* 1 Waist */
+ { SX, 130}, /* 2 Left Shoulder */
+ {-SX, 130}, /* 3 Right Shoulder */
+ {-15, 70}, /* 4 Right Hip */
+ { 0, 130}, /* 5 Neck */
+ { 0, 140}, /* 6 Chin */
+ { SX, 0}, /* 7 Left Foot */
+ {-SX, 0}, /* 8 Right Foot */
+ {-17, 174}, /* 9 Head1 */
+ { 17, 140}, /* 10 Head2 */
+ };
+ XPoint a[countof(figure)];
+ GLfloat gcolor[4] = { 1, 1, 1, 1 };
+
+ /* Translate into device coords */
+ for(i = 0; i < countof(figure); i++) {
+ a[i].x = (short)(SCENE_WIDTH/2 + (sp->cx + figure[i].x)*sp->scale);
+ a[i].y = (short)(SCENE_HEIGHT - figure[i].y*sp->scale);
+ }
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor);
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = ((GLfloat) a[10].x - a[9].x) / 2;
+ int slices = 12;
+
+ glPushMatrix();
+ {
+ glTranslatef(a[6].x, a[6].y - scale, 0);
+ glScalef(scale, scale, scale);
+
+ /* Head */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ scale = 0.75;
+ glScalef(scale, scale, scale);
+ glTranslatef(0, 0.3, 0);
+ glPushMatrix();
+ glTranslatef(0, 0, 0.35);
+ polys += tube (0, 0, 0,
+ 0, 1.1, 0,
+ 0.64, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+ glScalef(0.9, 0.9, 1);
+ polys += unit_sphere(2*slices, 2*slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Neck */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glTranslatef(0, 1.1, 0);
+ glPushMatrix();
+ scale = 0.35;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Torso */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glTranslatef(0, 1.1, 0);
+ glPushMatrix();
+ glScalef(0.9, 1.0, 0.9);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Belly */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glTranslatef(0, 1.0, 0);
+ glPushMatrix();
+ scale = 0.6;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Hips */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glTranslatef(0, 0.8, 0);
+ glPushMatrix();
+ scale = 0.85;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+
+ /* Legs */
+ glTranslatef(0, 0.7, 0);
+
+ for (i = -1; i <= 1; i += 2) {
+ glPushMatrix();
+
+ glRotatef (i*10, 0, 0, 1);
+ glTranslatef(-i*0.65, 0, 0);
+
+ /* Hip socket */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ scale = 0.45;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+
+ /* Thigh */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ glTranslatef(0, 0.6, 0);
+ polys += tube (0, 0, 0,
+ 0, 3.5, 0,
+ 1, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Knee */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glPushMatrix();
+ glTranslatef(0, 4.4, 0);
+ scale = 0.7;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Calf */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ glTranslatef(0, 4.7, 0);
+ polys += tube (0, 0, 0,
+ 0, 4.7, 0,
+ 0.8, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Ankle */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glPushMatrix();
+ glTranslatef(0, 9.7, 0);
+ scale = 0.5;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Foot */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ glRotatef (-i*10, 0, 0, 1);
+ glTranslatef(-i*1.75, 9.7, 0.9);
+
+ glScalef (0.4, 1, 1);
+ polys += tube (0, 0, 0,
+ 0, 0.6, 0,
+ 1.9, 0,
+ slices*4, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ glPopMatrix();
+ }
+ }
+ glPopMatrix();
+ }
+
+ sp->arm[1][LEFT][SHOULDER].x = sp->cx + figure[2].x;
+ sp->arm[1][RIGHT][SHOULDER].x = sp->cx + figure[3].x;
+ if(init) {
+ /* Initialise arms */
+ unsigned int i;
+ for(i = 0; i < 2; i++){
+ sp->arm[i][LEFT][SHOULDER].y = figure[2].y;
+ sp->arm[i][LEFT][ELBOW].x = figure[2].x;
+ sp->arm[i][LEFT][ELBOW].y = figure[1].y;
+ sp->arm[i][LEFT][HAND].x = figure[0].x;
+ sp->arm[i][LEFT][HAND].y = figure[1].y;
+ sp->arm[i][RIGHT][SHOULDER].y = figure[3].y;
+ sp->arm[i][RIGHT][ELBOW].x = figure[3].x;
+ sp->arm[i][RIGHT][ELBOW].y = figure[1].y;
+ sp->arm[i][RIGHT][HAND].x = figure[4].x;
+ sp->arm[i][RIGHT][HAND].y = figure[1].y;
+ }
+ }
+ return polys;
+}
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+/* lifted from sphere.c */
+static int
+striped_unit_sphere (int stacks, int slices,
+ int stripes,
+ GLfloat *color1, GLfloat *color2,
+ int wire_p)
+{
+ int polys = 0;
+ int i,j;
+ double theta1, theta2, theta3;
+ XYZ e, p;
+ XYZ la = { 0, 0, 0 }, lb = { 0, 0, 0 };
+ XYZ c = {0, 0, 0}; /* center */
+ double r = 1.0; /* radius */
+ int stacks2 = stacks * 2;
+
+ if (r < 0)
+ r = -r;
+ if (slices < 0)
+ slices = -slices;
+
+ if (slices < 4 || stacks < 2 || r <= 0)
+ {
+ glBegin (GL_POINTS);
+ glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ return 1;
+ }
+
+ glFrontFace(GL_CW);
+
+ for (j = 0; j < stacks; j++)
+ {
+ theta1 = j * (M_PI+M_PI) / stacks2 - M_PI_2;
+ theta2 = (j + 1) * (M_PI+M_PI) / stacks2 - M_PI_2;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ ((j == 0 || j == stacks-1 ||
+ j % (stacks / (stripes+1)))
+ ? color1 : color2));
+
+ glBegin (wire_p ? GL_LINE_LOOP : GL_TRIANGLE_STRIP);
+ for (i = 0; i <= slices; i++)
+ {
+ theta3 = i * (M_PI+M_PI) / slices;
+
+ if (wire_p && i != 0)
+ {
+ glVertex3f (lb.x, lb.y, lb.z);
+ glVertex3f (la.x, la.y, la.z);
+ }
+
+ e.x = cos (theta2) * cos(theta3);
+ e.y = sin (theta2);
+ e.z = cos (theta2) * sin(theta3);
+ p.x = c.x + r * e.x;
+ p.y = c.y + r * e.y;
+ p.z = c.z + r * e.z;
+
+ glNormal3f (e.x, e.y, e.z);
+ glTexCoord2f (i / (double)slices,
+ 2*(j+1) / (double)stacks2);
+ glVertex3f (p.x, p.y, p.z);
+ if (wire_p) la = p;
+
+ e.x = cos(theta1) * cos(theta3);
+ e.y = sin(theta1);
+ e.z = cos(theta1) * sin(theta3);
+ p.x = c.x + r * e.x;
+ p.y = c.y + r * e.y;
+ p.z = c.z + r * e.z;
+
+ glNormal3f (e.x, e.y, e.z);
+ glTexCoord2f (i / (double)slices,
+ 2*j / (double)stacks2);
+ glVertex3f (p.x, p.y, p.z);
+ if (wire_p) lb = p;
+ polys++;
+ }
+ glEnd();
+ }
+ return polys;
+}
+
+
+
+static int
+show_ball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 0, 0, 0, 1 };
+ int slices = 24;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ gcolor2[0] = gcolor1[0] / 3;
+ gcolor2[1] = gcolor1[1] / 3;
+ gcolor2[2] = gcolor1[2] / 3;
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = BALLRADIUS;
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ glScalef(scale, scale, scale);
+
+ glRotatef (s->angle / M_PI*180, 1, 1, 0);
+
+ polys += striped_unit_sphere (slices, slices, s->divisions,
+ gcolor1, gcolor2, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+ }
+ return polys;
+}
+
+static int
+show_europeanclub(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ double radius = 12 * sp->scale;
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 1, 1, 1, 1 };
+ int slices = 16;
+ int divs = 4;
+
+ /* 6 6
+ +-+
+ / \
+ 4 +-----+ 7
+ ////////\
+ 3 +---------+ 8
+ 2 +---------+ 9
+ |///////|
+ 1 +-------+ 10
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ +-+
+ 0 11 */
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = radius;
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ glScalef(scale, scale, scale);
+
+ glTranslatef (0, 0, 2); /* put end of handle in hand */
+
+ glRotatef (s->angle / M_PI*180, 1, 0, 0);
+
+ glPushMatrix();
+ glScalef (0.5, 1, 0.5);
+ polys += striped_unit_sphere (slices, slices, divs, gcolor2, gcolor1,
+ MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor2);
+ polys += tube (0, 0, 0,
+ 0, 2, 0,
+ 0.2, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+
+ glTranslatef (0, 2, 0);
+ glScalef (0.25, 0.25, 0.25);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+
+ glPopMatrix();
+ }
+ return polys;
+}
+
+
+static int
+show_torch(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+#if 0
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ XPoint head, tail, last;
+ DXPoint dhead, dlast;
+ const double sa = sin(s->angle);
+ const double ca = cos(s->angle);
+
+ const double TailLen = -24;
+ const double HeadLen = 16;
+ const short Width = (short)(5 * sqrt(sp->scale));
+
+ /*
+ +///+ head
+ last |
+ |
+ |
+ |
+ |
+ + tail
+ */
+
+ dhead.x = s->x + HeadLen * PERSPEC * sa;
+ dhead.y = s->y - HeadLen * ca;
+
+ if(color == MI_BLACK_PIXEL(mi)) { /* Use 'last' when erasing */
+ dlast = s->dlast;
+ } else { /* Store 'last' so we can use it later when s->prev has
+ gone */
+ if(s->prev != s->next) {
+ dlast.x = s->prev->x + HeadLen * PERSPEC * sin(s->prev->angle);
+ dlast.y = s->prev->y - HeadLen * cos(s->prev->angle);
+ } else {
+ dlast = dhead;
+ }
+ s->dlast = dlast;
+ }
+
+ /* Avoid wrapping (after last is stored) */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ head.x = (short)(SCENE_WIDTH/2 + dhead.x*sp->scale);
+ head.y = (short)(SCENE_HEIGHT - dhead.y*sp->scale);
+
+ last.x = (short)(SCENE_WIDTH/2 + dlast.x*sp->scale);
+ last.y = (short)(SCENE_HEIGHT - dlast.y*sp->scale);
+
+ tail.x = (short)(SCENE_WIDTH/2 +
+ (s->x + TailLen * PERSPEC * sa)*sp->scale );
+ tail.y = (short)(SCENE_HEIGHT - (s->y - TailLen * ca)*sp->scale );
+
+ if(color != MI_BLACK_PIXEL(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ Width, LineSolid, CapRound, JoinRound);
+ draw_line(mi, head.x, head.y, tail.x, tail.y);
+ }
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ Width * 2, LineSolid, CapRound, JoinRound);
+
+ draw_line(mi, head.x, head.y, last.x, last.y);
+
+#endif /* 0 */
+ return polys;
+}
+
+
+static int
+show_knife(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 1, 1, 1, 1 };
+ int slices = 8;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ glFrontFace(GL_CCW);
+
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ glScalef (2, 2, 2);
+
+ glTranslatef (0, 0, 2); /* put end of handle in hand */
+ glRotatef (s->angle / M_PI*180, 1, 0, 0);
+
+ glScalef (0.3, 1, 1); /* flatten blade */
+
+ glTranslatef(0, 6, 0);
+ glRotatef (180, 1, 0, 0);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor1);
+ polys += tube (0, 0, 0,
+ 0, 10, 0,
+ 1, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+
+ glTranslatef (0, 12, 0);
+ glScalef (0.7, 10, 0.7);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor2);
+ polys += unit_sphere (slices, slices, MI_IS_WIREFRAME(mi));
+
+ glPopMatrix();
+ return polys;
+}
+
+
+static int
+show_ring(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ double radius = 12 * sp->scale;
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 0, 0, 0, 1 };
+ int slices = 24;
+ int i, j;
+ int wire_p = MI_IS_WIREFRAME(mi);
+ GLfloat width = M_PI * 2 / slices;
+ GLfloat ra = 1.0;
+ GLfloat rb = 0.7;
+ GLfloat thickness = 0.15;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ gcolor2[0] = gcolor1[0] / 3;
+ gcolor2[1] = gcolor1[1] / 3;
+ gcolor2[2] = gcolor1[2] / 3;
+
+ glFrontFace(GL_CCW);
+
+ glPushMatrix();
+ glTranslatef(0, 0, 12); /* back of ring in hand */
+
+ glTranslatef(x, y, 0);
+ glScalef(radius, radius, radius);
+
+ glRotatef (90, 0, 1, 0);
+ glRotatef (s->angle / M_PI*180, 0, 0, 1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor1);
+
+ /* discs */
+ for (j = -1; j <= 1; j += 2)
+ {
+ GLfloat z = j * thickness/2;
+ glFrontFace (j < 0 ? GL_CCW : GL_CW);
+ glNormal3f (0, 0, j*1);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < slices + (wire_p ? 0 : 1); i++) {
+ GLfloat th, cth, sth;
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ (i % (slices/3) ? gcolor1 : gcolor2));
+ th = i * width;
+ cth = cos(th);
+ sth = sin(th);
+ glVertex3f (cth * ra, sth * ra, z);
+ glVertex3f (cth * rb, sth * rb, z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* outer ring */
+ glFrontFace (GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < slices + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ glNormal3f (cth, sth, 0);
+ glVertex3f (cth * ra, sth * ra, thickness/2);
+ glVertex3f (cth * ra, sth * ra, -thickness/2);
+ polys++;
+ }
+ glEnd();
+
+ /* inner ring */
+ glFrontFace (GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < slices + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ glNormal3f (-cth, -sth, 0);
+ glVertex3f (cth * rb, sth * ra, thickness/2);
+ glVertex3f (cth * rb, sth * ra, -thickness/2);
+ polys++;
+ }
+ glEnd();
+
+ glFrontFace (GL_CCW);
+ glPopMatrix();
+ return polys;
+}
+
+
+static int
+show_bball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ double radius = 12 * sp->scale;
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 0, 0, 0, 1 };
+ int slices = 16;
+ int i, j;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = radius;
+ glPushMatrix();
+
+ glTranslatef(0, -6, 5); /* position on top of hand */
+
+ glTranslatef(x, y, 0);
+ glScalef(scale, scale, scale);
+ glRotatef (s->angle / M_PI*180, 1, 0, 1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor1);
+ polys += unit_sphere (slices, slices, MI_IS_WIREFRAME(mi));
+
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (0, 0, 0.81);
+ glScalef(0.15, 0.15, 0.15);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor2);
+ for (i = 0; i < 3; i++) {
+ glPushMatrix();
+ glTranslatef (0, 0, 1);
+ glRotatef (360 * i / 3, 0, 0, 1);
+ glTranslatef (2, 0, 0);
+ glRotatef (18, 0, 1, 0);
+ glBegin (MI_IS_WIREFRAME(mi) ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0, 0, 0);
+ for (j = slices; j >= 0; j--) {
+ GLfloat th = j * M_PI*2 / slices;
+ glVertex3f (cos(th), sin(th), 0);
+ polys++;
+ }
+ glEnd();
+ glPopMatrix();
+ }
+
+ glPopMatrix();
+ }
+ return polys;
+}
+
+
+/**************************************************************************
+ * Public Functions *
+ * *
+ **************************************************************************/
+
+
+/* FIXME: refill_juggle currently just appends new throws to the
+ * programme. This is fine if the programme is empty, but if there
+ * are still some trajectories left then it really should take these
+ * into account */
+
+static void
+refill_juggle(ModeInfo * mi)
+{
+ jugglestruct *sp = NULL;
+ int i;
+
+ if (juggles == NULL)
+ return;
+ sp = &juggles[MI_SCREEN(mi)];
+
+ /* generate pattern */
+
+ if (pattern == NULL) {
+
+#define MAXPAT 10
+#define MAXREPEAT 300
+#define CHANGE_BIAS 8 /* larger makes num_ball changes less likely */
+#define POSITION_BIAS 20 /* larger makes hand movements less likely */
+
+ int count = 0;
+ while (count < MI_CYCLES(mi)) {
+ char buf[MAXPAT * 3 + 3], *b = buf;
+ int maxseen = 0;
+ int l = NRAND(MAXPAT) + 1;
+ int t = NRAND(MIN(MAXREPEAT, (MI_CYCLES(mi) - count))) + 1;
+
+ { /* vary number of balls */
+ int new_balls = sp->num_balls;
+ int change;
+
+ if (new_balls == 2) /* Do not juggle 2 that often */
+ change = NRAND(2 + CHANGE_BIAS / 4);
+ else
+ change = NRAND(2 + CHANGE_BIAS);
+ switch (change) {
+ case 0:
+ new_balls++;
+ break;
+ case 1:
+ new_balls--;
+ break;
+ default:
+ break; /* NO-OP */
+ }
+ if (new_balls < sp->patternindex.minballs) {
+ new_balls += 2;
+ }
+ if (new_balls > sp->patternindex.maxballs) {
+ new_balls -= 2;
+ }
+ if (new_balls < sp->num_balls) {
+ if (!program(mi, "[*]", NULL, 1)) /* lose ball */
+ return;
+ }
+ sp->num_balls = new_balls;
+ }
+
+ count += t;
+ if (NRAND(2) && sp->patternindex.index[sp->num_balls].number) {
+ /* Pick from PortFolio */
+ int p = sp->patternindex.index[sp->num_balls].start +
+ NRAND(sp->patternindex.index[sp->num_balls].number);
+ if (!program(mi, portfolio[p].pattern, portfolio[p].name, t))
+ return;
+ } else {
+ /* Invent a new pattern */
+ *b++='[';
+ for(i = 0; i < l; i++){
+ int n, m;
+ do { /* Triangular Distribution => high values more likely */
+ m = NRAND(sp->num_balls + 1);
+ n = NRAND(sp->num_balls + 1);
+ } while(m >= n);
+ if (n == sp->num_balls) {
+ maxseen = 1;
+ }
+ switch(NRAND(5 + POSITION_BIAS)){
+ case 0: /* Outside throw */
+ *b++ = '+'; break;
+ case 1: /* Cross throw */
+ *b++ = '='; break;
+ case 2: /* Cross catch */
+ *b++ = '&'; break;
+ case 3: /* Cross throw and catch */
+ *b++ = 'x'; break;
+ case 4: /* Bounce */
+ *b++ = '_'; break;
+ default:
+ break; /* Inside throw (default) */
+ }
+
+ *b++ = n + '0';
+ *b++ = ' ';
+ }
+ *b++ = ']';
+ *b = '\0';
+ if (maxseen) {
+ if (!program(mi, buf, NULL, t))
+ return;
+ }
+ }
+ }
+ } else { /* pattern supplied in height or 'a' notation */
+ if (!program(mi, pattern, NULL, MI_CYCLES(mi)))
+ return;
+ }
+
+ adam(sp);
+
+ name(sp);
+
+ if (!part(mi))
+ return;
+
+ lob(mi);
+
+ clap(sp);
+
+ positions(sp);
+
+ if (!projectile(sp)) {
+ free_juggle(mi);
+ return;
+ }
+
+ hands(sp);
+#ifdef DEBUG
+ if(MI_IS_DEBUG(mi)) dump(sp);
+#endif
+}
+
+static void
+change_juggle(ModeInfo * mi)
+{
+ jugglestruct *sp = NULL;
+ Trajectory *t;
+
+ if (juggles == NULL)
+ return;
+ sp = &juggles[MI_SCREEN(mi)];
+
+ /* Strip pending trajectories */
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if(t->start > sp->time || t->finish < sp->time) {
+ Trajectory *n = t;
+ t=t->prev;
+ trajectory_destroy(n);
+ }
+ }
+
+ /* Pick the current object theme */
+ sp->objtypes = choose_object();
+
+ refill_juggle(mi);
+
+ mi->polygon_count += show_figure(mi, True);
+}
+
+
+ENTRYPOINT void
+reshape_juggle (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+init_juggle (ModeInfo * mi)
+{
+ jugglestruct *sp = 0;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, juggles);
+
+ sp = &juggles[MI_SCREEN(mi)];
+
+ if (!sp->glx_context) /* re-initting breaks print_texture_label */
+ sp->glx_context = init_GL(mi);
+
+ sp->font_data = load_texture_font (mi->dpy, "titleFont");
+
+ reshape_juggle (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ make_random_colormap (0, 0, 0,
+ mi->colors, &MI_NPIXELS(mi),
+ True, False, 0, False);
+
+ {
+ double spin_speed = 0.05;
+ double wander_speed = 0.001;
+ double spin_accel = 0.05;
+ sp->rot = make_rotator (0, spin_speed, 0,
+ spin_accel, wander_speed, False);
+ sp->trackball = gltrackball_init (False);
+ }
+
+ if (only && *only && strcmp(only, " ")) {
+ balls = clubs = torches = knives = rings = bballs = False;
+ if (!strcasecmp (only, "balls")) balls = True;
+ else if (!strcasecmp (only, "clubs")) clubs = True;
+ else if (!strcasecmp (only, "torches")) torches = True;
+ else if (!strcasecmp (only, "knives")) knives = True;
+ else if (!strcasecmp (only, "rings")) rings = True;
+ else if (!strcasecmp (only, "bballs")) bballs = True;
+ else {
+ (void) fprintf (stderr,
+ "Juggle: -only must be one of: balls, clubs, torches, knives,\n"
+ "\t rings, or bballs (not \"%s\")\n", only);
+#ifdef STANDALONE /* xlock mustn't exit merely because of a bad argument */
+ exit (1);
+#endif
+ }
+ }
+
+ /* #### hard to make this look good in OpenGL... */
+ torches = False;
+
+
+ if (sp->head == 0) { /* first time initializing this juggler */
+
+ sp->count = ABS(MI_COUNT(mi));
+ if (sp->count == 0)
+ sp->count = 200;
+
+ /* record start time */
+ sp->begintime = time(NULL);
+ if(sp->patternindex.maxballs > 0) {
+ sp->num_balls = sp->patternindex.minballs +
+ NRAND(sp->patternindex.maxballs - sp->patternindex.minballs);
+ }
+
+ mi->polygon_count +=
+ show_figure(mi, True); /* Draw figure. Also discovers
+ information about the juggler's
+ proportions */
+
+ /* "7" should be about three times the height of the juggler's
+ shoulders */
+ sp->Gr = -GRAVITY(3 * sp->arm[0][RIGHT][SHOULDER].y,
+ 7 * THROW_CATCH_INTERVAL);
+
+ if(!balls && !clubs && !torches && !knives && !rings && !bballs)
+ balls = True; /* Have to juggle something! */
+
+ /* create circular trajectory list */
+ ADD_ELEMENT(Trajectory, sp->head, sp->head);
+ if(sp->head == NULL){
+ free_juggle(mi);
+ return;
+ }
+
+ /* create circular object list */
+ ADD_ELEMENT(Object, sp->objects, sp->objects);
+ if(sp->objects == NULL){
+ free_juggle(mi);
+ return;
+ }
+
+ sp->pattern = strdup(""); /* Initialise saved pattern with
+ free-able memory */
+ }
+
+ sp = &juggles[MI_SCREEN(mi)];
+
+ if (pattern &&
+ (!*pattern ||
+ !strcasecmp (pattern, ".") ||
+ !strcasecmp (pattern, "random")))
+ pattern = NULL;
+
+ if (pattern == NULL && sp->patternindex.maxballs == 0) {
+ /* pattern list needs indexing */
+ int nelements = countof(portfolio);
+ int numpat = 0;
+ int i;
+
+ /* sort according to number of balls */
+ qsort((void*)portfolio, nelements,
+ sizeof(portfolio[1]), compare_num_balls);
+
+ /* last pattern has most balls */
+ sp->patternindex.maxballs = get_num_balls(portfolio[nelements - 1].pattern);
+ /* run through sorted list, indexing start of each group
+ and number in group */
+ sp->patternindex.maxballs = 1;
+ for (i = 0; i < nelements; i++) {
+ int b = get_num_balls(portfolio[i].pattern);
+ if (b > sp->patternindex.maxballs) {
+ sp->patternindex.index[sp->patternindex.maxballs].number = numpat;
+ if(numpat == 0) sp->patternindex.minballs = b;
+ sp->patternindex.maxballs = b;
+ numpat = 1;
+ sp->patternindex.index[sp->patternindex.maxballs].start = i;
+ } else {
+ numpat++;
+ }
+ }
+ sp->patternindex.index[sp->patternindex.maxballs].number = numpat;
+ }
+
+ /* Set up programme */
+ change_juggle(mi);
+
+ /* Only put things here that won't interrupt the programme during
+ a window resize */
+
+ /* Use MIN so that users can resize in interesting ways, eg
+ narrow windows for tall patterns, etc */
+ sp->scale = MIN(SCENE_HEIGHT/480.0, SCENE_WIDTH/160.0);
+
+}
+
+ENTRYPOINT Bool
+juggle_handle_event (ModeInfo *mi, XEvent *event)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ change_juggle (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_juggle (ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ Trajectory *traj = NULL;
+ Object *o = NULL;
+ unsigned long future = 0;
+ char *pattern = NULL;
+
+ if (!sp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ glTranslatef(0,-3,0);
+
+ {
+ double x, y, z;
+ get_position (sp->rot, &x, &y, &z, !sp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 3,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (sp->trackball);
+
+ get_rotation (sp->rot, &x, &y, &z, !sp->button_down_p);
+
+ if (y < 0.8) y = 0.8 - (y - 0.8); /* always face forward */
+ if (y > 1.2) y = 1.2 - (y - 1.2);
+
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ {
+ GLfloat scale = 20.0 / SCENE_HEIGHT;
+ glScalef(scale, scale, scale);
+ }
+
+ glRotatef (180, 0, 0, 1);
+ glTranslatef(-SCENE_WIDTH/2, -SCENE_HEIGHT/2, 0);
+ glTranslatef(0, -150, 0);
+
+ mi->polygon_count = 0;
+
+ /* Update timer */
+ if (real) {
+ struct timeval tv;
+ (void)gettimeofday(&tv, NULL);
+ sp->time = (int) ((tv.tv_sec - sp->begintime)*1000 + tv.tv_usec/1000);
+ } else {
+ sp->time += MI_DELAY(mi) / 1000;
+ }
+
+ /* First pass: Move arms and strip out expired elements */
+ for (traj = sp->head->next; traj != sp->head; traj = traj->next) {
+ if (traj->status != PREDICTOR) {
+ /* Skip any elements that need further processing */
+ /* We could remove them, but there shoudn't be many and they
+ would be needed if we ever got the pattern refiller
+ working */
+ continue;
+ }
+ if (traj->start > future) { /* Lookahead to the end of the show */
+ future = traj->start;
+ }
+ if (sp->time < traj->start) { /* early */
+ continue;
+ } else if (sp->time < traj->finish) { /* working */
+
+ /* Look for pattern name */
+ if(traj->pattern != NULL) {
+ pattern=traj->pattern;
+ }
+
+ if (traj->type == Empty || traj->type == Full) {
+ /* Only interested in hands on this pass */
+/* double angle = traj->angle + traj->spin * (sp->time - traj->start);*/
+ double xd = 0, yd = 0;
+ DXPoint p;
+
+ /* Find the catching offset */
+ if(traj->object != NULL) {
+#if 0
+ /* #### not sure what this is doing, but I'm guessing
+ that the use of PERSPEC means this isn't needed
+ in the OpenGL version? -jwz
+ */
+ if(ObjectDefs[traj->object->type].handle > 0) {
+ /* Handles Need to be oriented */
+ xd = ObjectDefs[traj->object->type].handle *
+ PERSPEC * sin(angle);
+ yd = ObjectDefs[traj->object->type].handle *
+ cos(angle);
+ } else
+#endif
+ {
+ /* Balls are always caught at the bottom */
+ xd = 0;
+ yd = -4;
+ }
+ }
+ p.x = (CUBIC(traj->xp, sp->time) - xd);
+ p.y = (CUBIC(traj->yp, sp->time) + yd);
+ reach_arm(mi, traj->hand, &p);
+
+ /* Store updated hand position */
+ traj->x = p.x + xd;
+ traj->y = p.y - yd;
+ }
+ if (traj->type == Ball || traj->type == Full) {
+ /* Only interested in objects on this pass */
+ double x, y;
+ Trace *s;
+
+ if(traj->type == Full) {
+ /* Adjusted these in the first pass */
+ x = traj->x;
+ y = traj->y;
+ } else {
+ x = CUBIC(traj->xp, sp->time);
+ y = CUBIC(traj->yp, sp->time);
+ }
+
+ ADD_ELEMENT(Trace, s, traj->object->trace->prev);
+ s->x = x;
+ s->y = y;
+ s->angle = traj->angle + traj->spin * (sp->time - traj->start);
+ s->divisions = traj->divisions;
+ traj->object->tracelen++;
+ traj->object->active = True;
+ }
+ } else { /* expired */
+ Trajectory *n = traj;
+ traj=traj->prev;
+ trajectory_destroy(n);
+ }
+ }
+
+
+ mi->polygon_count += show_figure(mi, False);
+ mi->polygon_count += show_arms(mi);
+
+ /* Draw Objects */
+ glTranslatef(0, 0, ARMLENGTH);
+ for (o = sp->objects->next; o != sp->objects; o = o->next) {
+ if(o->active) {
+ mi->polygon_count += ObjectDefs[o->type].draw(mi, o->color,
+ o->trace->prev);
+ o->active = False;
+ }
+ }
+
+
+ /* Save pattern name so we can erase it when it changes */
+ if(pattern != NULL && strcmp(sp->pattern, pattern) != 0 ) {
+ free(sp->pattern);
+ sp->pattern = strdup(pattern);
+
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Juggle[%d]: Running: %s\n",
+ MI_SCREEN(mi), sp->pattern);
+ }
+ }
+
+ glColor3f (1, 1, 0);
+ print_texture_label (mi->dpy, sp->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, sp->pattern);
+
+#ifdef MEMTEST
+ if((int)(sp->time/10) % 1000 == 0)
+ (void) fprintf(stderr, "sbrk: %d\n", (int)sbrk(0));
+#endif
+
+ if (future < sp->time + 100 * THROW_CATCH_INTERVAL) {
+ refill_juggle(mi);
+ } else if (sp->time > 1<<30) { /* Hard Reset before the clock wraps */
+ init_juggle(mi);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("Juggler3D", juggler3d, juggle)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/juggler3d.man b/hacks/glx/juggler3d.man
new file mode 100644
index 0000000..48d4716
--- /dev/null
+++ b/hacks/glx/juggler3d.man
@@ -0,0 +1,183 @@
+'\" t
+.\" ** The above line should force tbl to be used as a preprocessor **
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+juggler3d - juggling man screen saver.
+.SH SYNOPSIS
+.B juggler3d
+[\-display host:display.screen ]
+[\-root ]
+[\-window ]
+[\-mono ]
+[\-install | \-noinstall ]
+[\-visual visual ]
+[\-window\-id id ]
+[\-pattern pattern ]
+[\-tail number ]
+[\-real | \-no\-real ]
+[\-describe | \-no\-describe ]
+[\-balls | \-no\-balls ]
+[\-clubs | \-no\-clubs ]
+[\-torches | \-no\-torches ]
+[\-knives | \-no\-knives ]
+[\-rings | \-no\-rings ]
+[\-bballs | \-no\-bballs ]
+[\-count count ]
+[\-cycles cycles ]
+[\-delay delay ]
+[\-ncolors ncolors ]
+[\-fps]
+.SH DESCRIPTION
+Draws a stick-man juggling various collections of objects.
+.SH OPTIONS
+.I juggler3d
+accepts the following options:
+.TP 8
+.B \-display host:display.screen
+X11 display to use. Overrides
+.B DISPLAY
+environment variable.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created X window. This is the default.
+.TP 8
+.B \-mono
+Draw in monochrome.
+.TP 8
+.B \-install | \-noinstall
+Turn on/off installing colormap.
+.TP 8
+.B \-visual visual
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window\-id id
+Draw on an already existing X window.
+.TP 8
+.B \-pattern\ \(dq pattern \(dq
+Specify juggling pattern in annotated
+.B site-swap
+notation. In
+.B site-swap
+notation, the "height" of each throw is given. E.g., "3" is the height
+needed to juggle a 3\-Cascade. Note that these sequences need to be
+chosen carefully, to avoid collisions.
+
+Annotations indicate relative hand movements or tricks:
+.TS
+cb l.
+\&\- Inside throw (default)
++ Outside throw
+\&= Cross Throw
+& Cross Catch
+x Cross Throw and Catch
+\&_ Bounce
+.TE
+.TP 8
+.B \-pattern\ \(dq[ pattern ]\(dq
+Specify juggling pattern in annotated
+.B Adam
+notation. Adam notation is a little harder to visualize. Each
+integer
+.B n
+represents a cyclic permutation of (0...n). The equivalent
+.B site-swap
+value is determined by calculating how many of the permutations it
+takes to get back to the identity. The largest number used is the
+same as the number of objects in the pattern. The advantage of Adam
+notation is that these sequences do not need to be chosen carefully,
+since all possible sequences are juggle-able. Annotations are the same
+as in
+.B site-swap
+notation.
+
+For example, both of these describe a 3\-Shower:
+.IP
+.B \-pattern\ "+5 1"
+.IP
+.B \-pattern\ "[+3 1]"
+
+For further examples, see the
+.B portfolio
+list in the source code.
+.TP 8
+.B \-tail number
+Minimum Trail Length. 0 \- 100. Default: 1. Objects may override
+this, for example flaming torches always leave a trail.
+.TP 8
+.BR \-real | \-no\-real
+Turn on/off real-time juggling.
+.B Deprecated.
+There should be no need to turn off real-time juggling, even on slow
+systems. Adjust speed using
+.B \-count
+above.
+.TP 8
+.BR \-describe | \-no\-describe
+Turn on/off pattern descriptions.
+.TP 8
+.BR \-balls | \-no\-balls
+Turn on/off Balls.
+.TP 8
+.BR \-clubs | \-no\-clubs
+Turn on/off Clubs.
+.TP 8
+.BR \-torches | \-no\-torches
+Turn on/off Flaming Torches.
+.TP 8
+.BR \-knives | \-no\-knives
+Turn on/off Knives.
+.TP 8
+.BR \-rings | \-no\-rings
+Turn on/off Rings.
+.TP 8
+.BR \-bballs | \-no\-bballs
+Turn on/off Bowling Balls.
+.TP 8
+.B \-count number
+Speed. 50 \- 1000. Default: 200. This determines the expected time
+interval between a throw and the next catch, in milliseconds.
+.TP 8
+.B \-cycles number
+Performance Length. 50 \- 1000. Default: 1000. Setting this smaller
+will force the juggler to switch patterns (and objects) more often.
+.TP 8
+.B \-delay delay
+Additional delay between frames, in microseconds. Default: 10000.
+.B Deprecated.
+Adjust speed using
+.BR \-count .
+.TP 8
+.B \-ncolors ncolors
+Maximum number of colors to use. Default: 32.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1996,2000,2002,2004 by Tim Auckland. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both
+that copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Tim Auckland.
+
+Converted to OpenGL by Jamie Zawinski, 2009.
diff --git a/hacks/glx/kaleidocycle.c b/hacks/glx/kaleidocycle.c
new file mode 100644
index 0000000..884400f
--- /dev/null
+++ b/hacks/glx/kaleidocycle.c
@@ -0,0 +1,574 @@
+/* kaleidocycle, Copyright (c) 2013-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * A loop of rotating tetrahedra. Created by jwz, July 2013.
+ * Inspired by, and some math borrowed from:
+ * http://www.kaleidocycles.de/pdf/kaleidocycles_theory.pdf
+ * http://intothecontinuum.tumblr.com/post/50873970770/an-even-number-of-at-least-8-regular-tetrahedra
+ */
+
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 16 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_kaleidocycle 0
+# define release_kaleidocycle 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+#include <math.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "Z"
+#define DEF_WANDER "False"
+#define DEF_SPEED "1.0"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int min_count, max_count;
+ Bool startup_p;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+ GLfloat count;
+ GLfloat th, dth;
+
+ enum { STATIC, IN, OUT } mode, prev_mode;
+
+} kaleidocycle_configuration;
+
+static kaleidocycle_configuration *bps = NULL;
+
+static char *do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt kaleidocycle_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_kaleidocycle (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+kaleidocycle_handle_event (ModeInfo *mi, XEvent *event)
+{
+ kaleidocycle_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '+' || c == '.' || c == '>' || c == '=' || c == '+' ||
+ keysym == XK_Right || keysym == XK_Up || keysym == XK_Next)
+ {
+ bp->mode = IN;
+ return True;
+ }
+ else if ((c == '-' || c == ',' || c == '<' || c == '-' || c == '_' ||
+ keysym == XK_Left || keysym == XK_Down || keysym == XK_Prior) &&
+ bp->count > bp->min_count)
+ {
+ bp->mode = OUT;
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ if (bp->count <= bp->min_count)
+ bp->mode = IN;
+ else
+ bp->mode = (random() & 1) ? IN : OUT;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+ENTRYPOINT void
+init_kaleidocycle (ModeInfo *mi)
+{
+ kaleidocycle_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_kaleidocycle (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glLineWidth (4);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ {
+ Bool spinx = False, spiny = False, spinz = False;
+ double spin_speed = 0.25;
+ double wander_speed = 0.005;
+ double spin_accel = 0.2;
+ double twist_speed = 0.25;
+ double twist_accel = 1.0;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->rot2 = make_rotator (twist_speed, 0, 0, twist_accel, 0, True);
+
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (MI_COUNT(mi) < 8) MI_COUNT(mi) = 8;
+ if (MI_COUNT(mi) & 1) MI_COUNT(mi)++;
+
+ bp->min_count = 8;
+ bp->max_count = 12 + MI_COUNT(mi) * 1.3;
+ if (bp->max_count & 1) bp->max_count++;
+ bp->startup_p = True;
+
+ bp->count = 0;
+ bp->mode = IN;
+ bp->prev_mode = IN;
+
+/*
+ bp->count = MI_COUNT(mi);
+ bp->mode = STATIC;
+*/
+
+ bp->ncolors = 512;
+ if (! bp->colors)
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_uniform_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ for (i = 0; i < bp->ncolors; i++)
+ {
+ /* make colors twice as bright */
+ bp->colors[i].red = (bp->colors[i].red >> 2) + 0x7FFF;
+ bp->colors[i].green = (bp->colors[i].green >> 2) + 0x7FFF;
+ bp->colors[i].blue = (bp->colors[i].blue >> 2) + 0x7FFF;
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+
+/* t = toroidal rotation, a = radial position
+ colors = 4 colors, 4 channels each.
+ */
+static void
+draw_tetra (ModeInfo *mi, double t, double a, Bool reflect_p,
+ GLfloat *colors)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ XYZ v1, v2, v3, P, Q;
+ XYZ verts[4];
+ int i;
+
+ double scale;
+ double sint = sin(t);
+ double cost = cos(t);
+ double tana = tan(a);
+ double sint2 = sint * sint;
+ double tana2 = tana * tana;
+
+ v1.x = cost;
+ v1.y = 0;
+ v1.z = sint;
+
+ scale = 1 / sqrt (1 + sint2 * tana2);
+ v2.x = scale * -sint;
+ v2.y = scale * -sint * tana;
+ v2.z = scale * cost;
+
+ v3.x = scale * -sint2 * tana;
+ v3.y = scale;
+ v3.z = scale * cost * sint * tana;
+
+ P.x = v3.y / tana - v3.x;
+ P.y = 0;
+ P.z = -v3.z / 2;
+
+ Q.x = v3.y / tana;
+ Q.y = v3.y;
+ Q.z = v3.z / 2;
+
+ verts[0] = P;
+ verts[1] = P;
+ verts[2] = Q;
+ verts[3] = Q;
+
+ scale = sqrt(2) / 2;
+ verts[0].x = P.x - scale * v1.x;
+ verts[0].y = P.y - scale * v1.y;
+ verts[0].z = P.z - scale * v1.z;
+
+ verts[1].x = P.x + scale * v1.x;
+ verts[1].y = P.y + scale * v1.y;
+ verts[1].z = P.z + scale * v1.z;
+
+ verts[2].x = Q.x - scale * v2.x;
+ verts[2].y = Q.y - scale * v2.y;
+ verts[2].z = Q.z - scale * v2.z;
+
+ verts[3].x = Q.x + scale * v2.x;
+ verts[3].y = Q.y + scale * v2.y;
+ verts[3].z = Q.z + scale * v2.z;
+
+ for (i = 0; i < 4; i++)
+ {
+ Bool reflect2_p = ((i + (reflect_p != 0)) & 1);
+ XYZ a = verts[(i+1) % 4];
+ XYZ b = verts[(i+2) % 4];
+ XYZ c = verts[(i+3) % 4];
+ XYZ n = ((i & 1)
+ ? calc_normal (b, a, c)
+ : calc_normal (a, b, c));
+ if (wire)
+ glColor4fv (colors + (i * 4));
+ else
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colors + (i * 4));
+
+ glFrontFace (reflect2_p ? GL_CW : GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glNormal3f (n.x, n.y, n.z);
+ glVertex3f (a.x, a.y, a.z);
+ glVertex3f (b.x, b.y, b.z);
+ glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ }
+}
+
+
+/* Reflect through the plane normal to the given vector.
+ */
+static void
+reflect (double x, double y, double z)
+{
+ GLfloat m[4][4];
+
+ m[0][0] = 1 - (2 * x * x);
+ m[1][0] = -2 * x * y;
+ m[2][0] = -2 * x * z;
+ m[3][0] = 0;
+
+ m[0][1] = -2 * x * y;
+ m[1][1] = 1 - (2 * y * y);
+ m[2][1] = -2 * y * z;
+ m[3][1] = 0;
+
+ m[0][2] = -2 * x * z;
+ m[1][2] = -2 * y * z;
+ m[2][2] = 1 - (2 * z * z);
+ m[3][2] = 0;
+
+ m[0][3] = 0;
+ m[1][3] = 0;
+ m[2][3] = 0;
+ m[3][3] = 1;
+
+ glMultMatrixf (&m[0][0]);
+}
+
+
+ENTRYPOINT void
+draw_kaleidocycle (ModeInfo *mi)
+{
+ kaleidocycle_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GLfloat colors[4*4];
+ GLfloat count;
+ double t, a;
+ int i;
+
+ GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 5,
+ (y - 0.5) * 5,
+ (z - 0.5) * 10);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+
+ get_rotation (bp->rot2, &x, &y, &z, !bp->button_down_p);
+ bp->th = x * 360 * 10 * speed;
+
+ /* Make sure the twist is always in motion. Without this, the rotator
+ sometimes stops, and for too long, and it's boring looking.
+ */
+ bp->th += speed * bp->dth++;
+ while (bp->dth > 360) bp->dth -= 360;
+ while (bp->th > 360) bp->th -= 360;
+ }
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+
+
+ /* Evenly spread the colors of the faces, and cycle them together.
+ */
+ for (i = 0; i < 4; i++)
+ {
+ int o = bp->ncolors / 4;
+ int c = (bp->ccolor + (o*i)) % bp->ncolors;
+ colors[i*4+0] = bp->colors[c].red / 65536.0;
+ colors[i*4+1] = bp->colors[c].green / 65536.0;
+ colors[i*4+2] = bp->colors[c].blue / 65536.0;
+ colors[i*4+3] = 1;
+ }
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+
+ count = (int) floor (bp->count);
+ while (count < 8) count++;
+ if (((int) floor (count)) & 1) count++;
+
+ a = 2 * M_PI / (bp->count < 8 ? 8 : bp->count);
+ t = bp->th / (180 / M_PI);
+
+ glScalef (3, 3, 3);
+ glScalef (a, a, a);
+ glRotatef (90, 0, 0, 1);
+/* glRotatef (45, 0, 1, 0); */
+
+ for (i = 0; i <= (int) floor (bp->count); i++)
+ {
+ Bool flip_p = (i & 1);
+ glPushMatrix();
+ glRotatef ((i/2) * 4 * 180 / bp->count, 0, 0, 1);
+ if (flip_p) reflect (-sin(a), cos(a), 0);
+
+ if (bp->mode != STATIC && i >= (int) floor (bp->count))
+ {
+ /* Fractional bp->count means the last piece is in transition */
+ GLfloat scale = bp->count - (int) floor (bp->count);
+ GLfloat tick = 0.07 * speed;
+ GLfloat ocount = bp->count;
+ GLfloat alpha;
+
+ /* Fill in faster if we're starting up */
+ if (bp->count < MI_COUNT(mi))
+ tick *= 2;
+
+ glScalef (scale, scale, scale);
+
+ switch (bp->mode) {
+ case IN: break;
+ case OUT: tick = -tick; break;
+ case STATIC: tick = 0; break;
+ }
+
+ bp->count += tick;
+
+ if (bp->mode == IN
+ ? floor (ocount) != floor (bp->count)
+ : ceil (ocount) != ceil (bp->count))
+ {
+ if (bp->mode == IN)
+ bp->count = floor (ocount) + 1;
+ else
+ bp->count = ceil (ocount) - 1;
+
+ if (((int) floor (bp->count)) & 1 ||
+ (bp->mode == IN &&
+ (bp->count < MI_COUNT(mi) &&
+ bp->startup_p)))
+ {
+ /* keep going if it's odd, or less than 8. */
+ bp->count = round(bp->count);
+ }
+ else
+ {
+ bp->mode = STATIC;
+ bp->startup_p = False;
+ }
+ }
+
+ alpha = (scale * scale * scale * scale);
+ if (alpha < 0.4) alpha = 0.4;
+ colors[3] = colors[7] = colors[11] = colors[15] = alpha;
+ }
+
+ draw_tetra (mi, t, a, flip_p, colors);
+ mi->polygon_count += 4;
+
+ glPopMatrix();
+ }
+
+ if (bp->mode == STATIC && !(random() % 200)) {
+ if (bp->count <= bp->min_count)
+ bp->mode = IN;
+ else if (bp->count >= bp->max_count)
+ bp->mode = OUT;
+ else
+ bp->mode = bp->prev_mode;
+
+ bp->prev_mode = bp->mode;
+ }
+
+
+ mi->recursion_depth = ceil (bp->count);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Kaleidocycle", kaleidocycle)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/kaleidocycle.man b/hacks/glx/kaleidocycle.man
new file mode 100644
index 0000000..874d82d
--- /dev/null
+++ b/hacks/glx/kaleidocycle.man
@@ -0,0 +1,96 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+kaleidocycle - draws twistable rings of tetrahedra
+.SH SYNOPSIS
+.B kaleidocycle
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-count \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-wander] [\-no-wander]
+[\-spin \fIaxes\fP]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIkaleidocycle\fP program draws a ring composed of tetrahedra
+connected at the edges that twists and rotates toroidally. Segments
+are occasionally inserted or removed.
+.SH OPTIONS
+.I kaleidocycle
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fInumber\fP
+The initial number of segments. Default 16. Must be 8 or greater, and
+an even number.
+.TP 8
+.B \-speed \fInumber\fP
+Adjust the animation speed. 0.5 for half as fast, 2.0 for twice as fast.
+.TP 8
+.B \-wander
+Move the text around the screen. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the text centered on the screen.
+.TP 8
+.B \-spin
+Which axes around which the text should spin. The default is "Z",
+meaning rotate the object the plane of the screen only.
+.TP 8
+.B \-no\-spin
+Don't spin the text at all: the same as \fB\-spin ""\fP.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2001-2013 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/klein.c b/hacks/glx/klein.c
new file mode 100644
index 0000000..1c042da
--- /dev/null
+++ b/hacks/glx/klein.c
@@ -0,0 +1,2099 @@
+/* klein --- Shows a Klein bottle that rotates in 4d or on which you
+ can walk */
+
+#if 0
+static const char sccsid[] = "@(#)klein.c 1.1 08/10/04 xlockmore";
+#endif
+
+/* Copyright (c) 2005-2014 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 08/10/04: Initial version
+ * C. Steger - 09/08/03: Changes to the parameter handling
+ * C. Steger - 13/12/25: Added the squeezed torus Klein bottle
+ * C. Steger - 14/10/03: Moved the curlicue texture to curlicue.h
+ */
+
+/*
+ * This program shows three different Klein bottles in 4d: the figure-8 Klein
+ * bottle, the squeezed torus Klein bottle, or the Lawson Klein bottle. You
+ * can walk on the Klein bottle, see it turn in 4d, or walk on it while it
+ * turns in 4d. The figure-8 Klein bottle is well known in its 3d form. The
+ * 4d form used in this program is an extension of the 3d form to 4d that
+ * does not intersect itself in 4d (which can be seen in the depth colors
+ * mode). The squeezed torus Klein bottle also does not intersect itself in
+ * 4d (which can be seen in the depth colors mode). The Lawson Klein bottle,
+ * on the other hand, does intersect itself in 4d. Its primary use is that
+ * it has a nice appearance for walking and for turning in 3d. The Klein
+ * bottle is a non-orientable surface. To make this apparent, the two-sided
+ * color mode can be used. Alternatively, orientation markers (curling
+ * arrows) can be drawn as a texture map on the surface of the Klein bottle.
+ * While walking on the Klein bottle, you will notice that the orientation
+ * of the curling arrows changes (which it must because the Klein bottle is
+ * non-orientable). The program projects the 4d Klein bottle to 3d using
+ * either a perspective or an orthographic projection. Which of the two
+ * alternatives looks more appealing depends on the viewing mode and the
+ * Klein bottle. For example, the Lawson Klein bottle looks nicest when
+ * projected perspectively. The figure-8 Klein bottle, on the other
+ * hand, looks nicer while walking when projected orthographically from 4d.
+ * For the squeezed torus Klein bottle, both projection modes give equally
+ * acceptable projections. The projected Klein bottle can then be projected
+ * to the screen either perspectively or orthographically. When using the
+ * walking modes, perspective projection to the screen should be used. There
+ * are three display modes for the Klein bottle: mesh (wireframe), solid, or
+ * transparent. Furthermore, the appearance of the Klein bottle can be as
+ * a solid object or as a set of see-through bands. Finally, the colors
+ * with with the Klein bottle is drawn can be set to two-sided, rainbow, or
+ * depth. In the first case, the Klein bottle is drawn with red on one
+ * "side" and green on the "other side". Of course, the Klein bottle only
+ * has one side, so the color jumps from red to green along a curve on the
+ * surface of the Klein bottle. This mode enables you to see that the Klein
+ * bottle is non-orientable. The second mode draws the Klein bottle with
+ * fully saturated rainbow colors. This gives a very nice effect when
+ * combined with the see-through bands mode or with the orientation markers
+ * drawn. The third mode draws the Klein bottle with colors that are chosen
+ * according to the 4d "depth" of the points. This mode enables you to see
+ * that the figure-8 and squeezed torus Klein bottles do not intersect
+ * themselves in 4d, while the Lawson Klein bottle does intersect itself.
+ * The rotation speed for each of the six planes around which the Klein
+ * bottle rotates can be chosen. For the walk-and-turn more, only the
+ * rotation speeds around the true 4d planes are used (the xy, xz, and yz
+ * planes). Furthermore, in the walking modes the walking direction in the
+ * 2d base square of the Klein bottle and the walking speed can be chosen.
+ * This program is somewhat inspired by Thomas Banchoff's book "Beyond the
+ * Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+ * Scientific American Library, 1990.
+ */
+
+#include "curlicue.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define KLEIN_BOTTLE_FIGURE_8 0
+#define KLEIN_BOTTLE_SQUEEZED_TORUS 1
+#define KLEIN_BOTTLE_LAWSON 2
+#define NUM_KLEIN_BOTTLES 3
+
+#define DISP_WIREFRAME 0
+#define DISP_SURFACE 1
+#define DISP_TRANSPARENT 2
+#define NUM_DISPLAY_MODES 3
+
+#define APPEARANCE_SOLID 0
+#define APPEARANCE_BANDS 1
+#define NUM_APPEARANCES 2
+
+#define COLORS_TWOSIDED 0
+#define COLORS_RAINBOW 1
+#define COLORS_DEPTH 2
+#define NUM_COLORS 3
+
+#define VIEW_WALK 0
+#define VIEW_TURN 1
+#define VIEW_WALKTURN 2
+#define NUM_VIEW_MODES 3
+
+#define DISP_3D_PERSPECTIVE 0
+#define DISP_3D_ORTHOGRAPHIC 1
+#define NUM_DISP_3D_MODES 2
+
+#define DISP_4D_PERSPECTIVE 0
+#define DISP_4D_ORTHOGRAPHIC 1
+#define NUM_DISP_4D_MODES 2
+
+#define DEF_KLEIN_BOTTLE "random"
+#define DEF_DISPLAY_MODE "random"
+#define DEF_APPEARANCE "random"
+#define DEF_COLORS "random"
+#define DEF_VIEW_MODE "random"
+#define DEF_MARKS "False"
+#define DEF_PROJECTION_3D "random"
+#define DEF_PROJECTION_4D "random"
+#define DEF_SPEEDWX "1.1"
+#define DEF_SPEEDWY "1.3"
+#define DEF_SPEEDWZ "1.5"
+#define DEF_SPEEDXY "1.7"
+#define DEF_SPEEDXZ "1.9"
+#define DEF_SPEEDYZ "2.1"
+#define DEF_WALK_DIRECTION "7.0"
+#define DEF_WALK_SPEED "20.0"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+
+# define free_klein 0
+# define release_klein 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#ifndef HAVE_JWXYZ
+# include <X11/keysym.h>
+#endif
+
+#include "gltrackball.h"
+
+
+#ifdef USE_MODULES
+ModStruct klein_description =
+{"klein", "init_klein", "draw_klein", NULL,
+ "draw_klein", "change_klein", NULL, &klein_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Rotate a Klein bottle in 4d or walk on it", 0, NULL};
+
+#endif
+
+
+static char *klein_bottle;
+static char *mode;
+static char *appear;
+static char *color_mode;
+static char *view_mode;
+static Bool marks;
+static char *proj_3d;
+static char *proj_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+static float walk_direction;
+static float walk_speed;
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-klein-bottle", ".kleinBottle", XrmoptionSepArg, 0 },
+ {"-figure-8", ".kleinBottle", XrmoptionNoArg, "figure-8" },
+ {"-squeezed-torus", ".kleinBottle", XrmoptionNoArg, "squeezed-torus" },
+ {"-lawson", ".kleinBottle", XrmoptionNoArg, "lawson" },
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-appearance", ".appearance", XrmoptionSepArg, 0 },
+ {"-solid", ".appearance", XrmoptionNoArg, "solid" },
+ {"-bands", ".appearance", XrmoptionNoArg, "bands" },
+ {"-colors", ".colors", XrmoptionSepArg, 0 },
+ {"-twosided", ".colors", XrmoptionNoArg, "two-sided" },
+ {"-rainbow", ".colors", XrmoptionNoArg, "rainbow" },
+ {"-depth", ".colors", XrmoptionNoArg, "depth" },
+ {"-view-mode", ".viewMode", XrmoptionSepArg, 0 },
+ {"-walk", ".viewMode", XrmoptionNoArg, "walk" },
+ {"-turn", ".viewMode", XrmoptionNoArg, "turn" },
+ {"-walk-turn", ".viewMode", XrmoptionNoArg, "walk-turn" },
+ {"-orientation-marks", ".marks", XrmoptionNoArg, "on"},
+ {"+orientation-marks", ".marks", XrmoptionNoArg, "off"},
+ {"-projection-3d", ".projection3d", XrmoptionSepArg, 0 },
+ {"-perspective-3d", ".projection3d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-3d", ".projection3d", XrmoptionNoArg, "orthographic" },
+ {"-projection-4d", ".projection4d", XrmoptionSepArg, 0 },
+ {"-perspective-4d", ".projection4d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-4d", ".projection4d", XrmoptionNoArg, "orthographic" },
+ {"-speed-wx", ".speedwx", XrmoptionSepArg, 0 },
+ {"-speed-wy", ".speedwy", XrmoptionSepArg, 0 },
+ {"-speed-wz", ".speedwz", XrmoptionSepArg, 0 },
+ {"-speed-xy", ".speedxy", XrmoptionSepArg, 0 },
+ {"-speed-xz", ".speedxz", XrmoptionSepArg, 0 },
+ {"-speed-yz", ".speedyz", XrmoptionSepArg, 0 },
+ {"-walk-direction", ".walkDirection", XrmoptionSepArg, 0 },
+ {"-walk-speed", ".walkSpeed", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] =
+{
+ { &klein_bottle, "kleinBottle", "KleinBottle", DEF_KLEIN_BOTTLE, t_String },
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
+ { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
+ { &view_mode, "viewMode", "ViewMode", DEF_VIEW_MODE, t_String },
+ { &marks, "marks", "Marks", DEF_MARKS, t_Bool },
+ { &proj_3d, "projection3d", "Projection3d", DEF_PROJECTION_3D, t_String },
+ { &proj_4d, "projection4d", "Projection4d", DEF_PROJECTION_4D, t_String },
+ { &speed_wx, "speedwx", "Speedwx", DEF_SPEEDWX, t_Float},
+ { &speed_wy, "speedwy", "Speedwy", DEF_SPEEDWY, t_Float},
+ { &speed_wz, "speedwz", "Speedwz", DEF_SPEEDWZ, t_Float},
+ { &speed_xy, "speedxy", "Speedxy", DEF_SPEEDXY, t_Float},
+ { &speed_xz, "speedxz", "Speedxz", DEF_SPEEDXZ, t_Float},
+ { &speed_yz, "speedyz", "Speedyz", DEF_SPEEDYZ, t_Float},
+ { &walk_direction, "walkDirection", "WalkDirection", DEF_WALK_DIRECTION, t_Float},
+ { &walk_speed, "walkSpeed", "WalkSpeed", DEF_WALK_SPEED, t_Float}
+};
+
+ENTRYPOINT ModeSpecOpt klein_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, NULL};
+
+
+/* Radius of the figure-8 Klein bottle */
+#define FIGURE_8_RADIUS 2.0
+
+/* Radius of the squeezed torus Klein bottle */
+#define SQUEEZED_TORUS_RADIUS 2.0
+
+/* Offset by which we walk above the Klein bottle */
+#define DELTAY 0.02
+
+/* Number of subdivisions of the Klein bottle */
+#define NUMU 128
+#define NUMV 128
+
+/* Number of subdivisions per band */
+#define NUMB 8
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* Options */
+ int bottle_type;
+ int display_mode;
+ int appearance;
+ int colors;
+ int view;
+ int projection_3d;
+ int projection_4d;
+ /* 4D rotation angles */
+ float alpha, beta, delta, zeta, eta, theta;
+ /* Movement parameters */
+ float umove, vmove, dumove, dvmove;
+ int side;
+ /* The viewing offset in 4d */
+ float offset4d[4];
+ /* The viewing offset in 3d */
+ float offset3d[4];
+ /* The 4d coordinates of the Klein bottle and their derivatives */
+ float x[(NUMU+1)*(NUMV+1)][4];
+ float xu[(NUMU+1)*(NUMV+1)][4];
+ float xv[(NUMU+1)*(NUMV+1)][4];
+ float pp[(NUMU+1)*(NUMV+1)][3];
+ float pn[(NUMU+1)*(NUMV+1)][3];
+ /* The precomputed colors of the Klein bottle */
+ float col[(NUMU+1)*(NUMV+1)][4];
+ /* The precomputed texture coordinates of the Klein bottle */
+ float tex[(NUMU+1)*(NUMV+1)][2];
+ /* The "curlicue" texture */
+ GLuint tex_name;
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Trackball states */
+ trackball_state *trackballs[2];
+ int current_trackball;
+ Bool button_pressed;
+ /* A random factor to modify the rotation speeds */
+ float speed_scale;
+} kleinstruct;
+
+static kleinstruct *klein = (kleinstruct *) NULL;
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][2];
+ v = m[i][3];
+ m[i][2] = c*u+s*v;
+ m[i][3] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][3];
+ m[i][1] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][3];
+ m[i][0] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+ float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatewx(m,al);
+ rotatewy(m,be);
+ rotatewz(m,de);
+ rotatexy(m,ze);
+ rotatexz(m,et);
+ rotateyz(m,th);
+}
+
+
+/* Compute the rotation matrix m from the 4d rotation angles. */
+static void rotateall4d(float ze, float et, float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatexy(m,ze);
+ rotatexz(m,et);
+ rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+ int i, j, k;
+
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<4; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+ double al, be, de, ze, et, th;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+
+ r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+ r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+ r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+ r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+ r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+ et = atan2(-r12,r22)*180.0/M_PI;
+ th = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ ze = atan2(-r01,r00)*180.0/M_PI;
+
+ rotateall(al,be,de,ze,et,-th,m);
+}
+
+
+/* Compute a fully saturated and bright color based on an angle. */
+static void color(kleinstruct *kb, double angle, float col[4])
+{
+ int s;
+ double t;
+
+ if (kb->colors == COLORS_TWOSIDED)
+ return;
+
+ if (angle >= 0.0)
+ angle = fmod(angle,2.0*M_PI);
+ else
+ angle = fmod(angle,-2.0*M_PI);
+ s = floor(angle/(M_PI/3));
+ t = angle/(M_PI/3)-s;
+ if (s >= 6)
+ s = 0;
+ switch (s)
+ {
+ case 0:
+ col[0] = 1.0;
+ col[1] = t;
+ col[2] = 0.0;
+ break;
+ case 1:
+ col[0] = 1.0-t;
+ col[1] = 1.0;
+ col[2] = 0.0;
+ break;
+ case 2:
+ col[0] = 0.0;
+ col[1] = 1.0;
+ col[2] = t;
+ break;
+ case 3:
+ col[0] = 0.0;
+ col[1] = 1.0-t;
+ col[2] = 1.0;
+ break;
+ case 4:
+ col[0] = t;
+ col[1] = 0.0;
+ col[2] = 1.0;
+ break;
+ case 5:
+ col[0] = 1.0;
+ col[1] = 0.0;
+ col[2] = 1.0-t;
+ break;
+ }
+ if (kb->display_mode == DISP_TRANSPARENT)
+ col[3] = 0.7;
+ else
+ col[3] = 1.0;
+}
+
+
+/* Set up the figure-8 Klein bottle coordinates, colors, and texture. */
+static void setup_figure8(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int i, j, k, l;
+ double u, v, ur, vr;
+ double cu, su, cv, sv, cv2, sv2, c2u, s2u;
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ k = i*(NUMV+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ color(kb,(cos(u)+1.0)*M_PI*2.0/3.0,kb->col[k]);
+ else
+ color(kb,v,kb->col[k]);
+ kb->tex[k][0] = -32*u/(2.0*M_PI);
+ kb->tex[k][1] = 32*v/(2.0*M_PI);
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ c2u = cos(2.0*u);
+ s2u = sin(2.0*u);
+ kb->x[k][0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ kb->x[k][1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ kb->x[k][2] = su*sv2+s2u*cv2;
+ kb->x[k][3] = cu;
+ kb->xu[k][0] = (cu*cv2-2.0*c2u*sv2)*cv;
+ kb->xu[k][1] = (cu*cv2-2.0*c2u*sv2)*sv;
+ kb->xu[k][2] = cu*sv2+2.0*c2u*cv2;
+ kb->xu[k][3] = -su;
+ kb->xv[k][0] = ((-0.5*su*sv2-0.5*s2u*cv2)*cv-
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv);
+ kb->xv[k][1] = ((-0.5*su*sv2-0.5*s2u*cv2)*sv+
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv);
+ kb->xv[k][2] = 0.5*su*cv2-0.5*s2u*sv2;
+ kb->xv[k][3] = 0.0;
+ for (l=0; l<4; l++)
+ {
+ kb->x[k][l] /= FIGURE_8_RADIUS+1.25;
+ kb->xu[k][l] /= FIGURE_8_RADIUS+1.25;
+ kb->xv[k][l] /= FIGURE_8_RADIUS+1.25;
+ }
+ }
+ }
+}
+
+
+/* Set up the squeezed torus Klein bottle coordinates, colors, and texture. */
+static void setup_squeezed_torus(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
+{
+ int i, j, k, l;
+ double u, v, ur, vr;
+ double cu, su, cv, sv, cv2, sv2;
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ k = i*(NUMV+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ color(kb,(sin(u)*sin(0.5*v)+1.0)*M_PI*2.0/3.0,kb->col[k]);
+ else
+ color(kb,v,kb->col[k]);
+ kb->tex[k][0] = -32*u/(2.0*M_PI);
+ kb->tex[k][1] = 32*v/(2.0*M_PI);
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ kb->x[k][0] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ kb->x[k][1] = (SQUEEZED_TORUS_RADIUS+cu)*sv;
+ kb->x[k][2] = su*cv2;
+ kb->x[k][3] = su*sv2;
+ kb->xu[k][0] = -su*cv;
+ kb->xu[k][1] = -su*sv;
+ kb->xu[k][2] = cu*cv2;
+ kb->xu[k][3] = cu*sv2;
+ kb->xv[k][0] = -(SQUEEZED_TORUS_RADIUS+cu)*sv;
+ kb->xv[k][1] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ kb->xv[k][2] = -0.5*su*sv2;
+ kb->xv[k][3] = 0.5*su*cv2;
+ for (l=0; l<4; l++)
+ {
+ kb->x[k][l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ kb->xu[k][l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ kb->xv[k][l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ }
+ }
+ }
+}
+
+
+/* Set up the Lawson Klein bottle coordinates, colors, and texture. */
+static void setup_lawson(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int i, j, k;
+ double u, v, ur, vr;
+ double cu, su, cv, sv, cv2, sv2;
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ k = i*(NUMU+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ color(kb,(sin(u)*cos(0.5*v)+1.0)*M_PI*2.0/3.0,kb->col[k]);
+ else
+ color(kb,v,kb->col[k]);
+ kb->tex[k][0] = -32*u/(2.0*M_PI);
+ kb->tex[k][1] = 32*v/(2.0*M_PI);
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ kb->x[k][0] = cu*cv;
+ kb->x[k][1] = cu*sv;
+ kb->x[k][2] = su*sv2;
+ kb->x[k][3] = su*cv2;
+ kb->xu[k][0] = -su*cv;
+ kb->xu[k][1] = -su*sv;
+ kb->xu[k][2] = cu*sv2;
+ kb->xu[k][3] = cu*cv2;
+ kb->xv[k][0] = -cu*sv;
+ kb->xv[k][1] = cu*cv;
+ kb->xv[k][2] = su*cv2*0.5;
+ kb->xv[k][3] = -su*sv2*0.5;
+ }
+ }
+}
+
+
+/* Draw a figure-8 Klein bottle projected into 3D. */
+static int figure8(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4];
+ int i, j, k, l, m, o;
+ double u, v;
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double q, r, s, t;
+ double cu, su, cv, sv, cv2, sv2, c2u, s2u;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ c2u = cos(2.0*u);
+ s2u = sin(2.0*u);
+ xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ xx[2] = su*sv2+s2u*cv2;
+ xx[3] = cu;
+ xxu[0] = (cu*cv2-2.0*c2u*sv2)*cv;
+ xxu[1] = (cu*cv2-2.0*c2u*sv2)*sv;
+ xxu[2] = cu*sv2+2.0*c2u*cv2;
+ xxu[3] = -su;
+ xxv[0] = ((-0.5*su*sv2-0.5*s2u*cv2)*cv-
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv);
+ xxv[1] = ((-0.5*su*sv2-0.5*s2u*cv2)*sv+
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv);
+ xxv[2] = 0.5*su*cv2-0.5*s2u*sv2;
+ xxv[3] = 0.0;
+ for (l=0; l<4; l++)
+ {
+ xx[l] /= FIGURE_8_RADIUS+1.25;
+ xxu[l] /= FIGURE_8_RADIUS+1.25;
+ xxv[l] /= FIGURE_8_RADIUS+1.25;
+ }
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+kb->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
+ pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
+ pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ kb->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ /*c2u = cos(2.0*u);*/
+ s2u = sin(2.0*u);
+ xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ xx[2] = su*sv2+s2u*cv2;
+ xx[3] = cu;
+ for (l=0; l<4; l++)
+ xx[l] /= FIGURE_8_RADIUS+1.25;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+kb->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+kb->offset4d[l])/s;
+ }
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ /* Project the points from 4D to 3D. */
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ o = i*(NUMV+1)+j;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*kb->x[o][0]+mat[l][1]*kb->x[o][1]+
+ mat[l][2]*kb->x[o][2]+mat[l][3]*kb->x[o][3]);
+ yu[l] = (mat[l][0]*kb->xu[o][0]+mat[l][1]*kb->xu[o][1]+
+ mat[l][2]*kb->xu[o][2]+mat[l][3]*kb->xu[o][3]);
+ yv[l] = (mat[l][0]*kb->xv[o][0]+mat[l][1]*kb->xv[o][1]+
+ mat[l][2]*kb->xv[o][2]+mat[l][3]*kb->xv[o][3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ kb->pp[o][l] = (y[l]+kb->offset4d[l])+kb->offset3d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ kb->pp[o][l] = r*q+kb->offset3d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ kb->pn[o][0] = pu[1]*pv[2]-pu[2]*pv[1];
+ kb->pn[o][1] = pu[2]*pv[0]-pu[0]*pv[2];
+ kb->pn[o][2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(kb->pn[o][0]*kb->pn[o][0]+kb->pn[o][1]*kb->pn[o][1]+
+ kb->pn[o][2]*kb->pn[o][2]);
+ kb->pn[o][0] *= t;
+ kb->pn[o][1] *= t;
+ kb->pn[o][2] *= t;
+ }
+ }
+
+ if (kb->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+
+ for (i=0; i<NUMU; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ if (kb->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=NUMV; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(NUMV+1)+m;
+ glNormal3fv(kb->pn[o]);
+ glTexCoord2fv(kb->tex[o]);
+ if (kb->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(kb->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
+ }
+ glVertex3fv(kb->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+/* Draw a squeezed torus Klein bottle projected into 3D. */
+static int squeezed_torus(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4];
+ int i, j, k, l, m, o;
+ double u, v;
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double q, r, s, t;
+ double cu, su, cv, sv, cv2, sv2;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ xx[1] = (SQUEEZED_TORUS_RADIUS+cu)*sv;
+ xx[2] = su*cv2;
+ xx[3] = su*sv2;
+ xxu[0] = -su*cv;
+ xxu[1] = -su*sv;
+ xxu[2] = cu*cv2;
+ xxu[3] = cu*sv2;
+ xxv[0] = -(SQUEEZED_TORUS_RADIUS+cu)*sv;
+ xxv[1] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ xxv[2] = -0.5*su*sv2;
+ xxv[3] = 0.5*su*cv2;
+ for (l=0; l<4; l++)
+ {
+ xx[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ xxu[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ xxv[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ }
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+kb->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
+ pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
+ pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ kb->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ xx[1] = (SQUEEZED_TORUS_RADIUS+cu)*sv;
+ xx[2] = su*cv2;
+ xx[3] = su*sv2;
+ for (l=0; l<4; l++)
+ xx[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+kb->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+kb->offset4d[l])/s;
+ }
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ /* Project the points from 4D to 3D. */
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ o = i*(NUMV+1)+j;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*kb->x[o][0]+mat[l][1]*kb->x[o][1]+
+ mat[l][2]*kb->x[o][2]+mat[l][3]*kb->x[o][3]);
+ yu[l] = (mat[l][0]*kb->xu[o][0]+mat[l][1]*kb->xu[o][1]+
+ mat[l][2]*kb->xu[o][2]+mat[l][3]*kb->xu[o][3]);
+ yv[l] = (mat[l][0]*kb->xv[o][0]+mat[l][1]*kb->xv[o][1]+
+ mat[l][2]*kb->xv[o][2]+mat[l][3]*kb->xv[o][3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ kb->pp[o][l] = (y[l]+kb->offset4d[l])+kb->offset3d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ kb->pp[o][l] = r*q+kb->offset3d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ kb->pn[o][0] = pu[1]*pv[2]-pu[2]*pv[1];
+ kb->pn[o][1] = pu[2]*pv[0]-pu[0]*pv[2];
+ kb->pn[o][2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(kb->pn[o][0]*kb->pn[o][0]+kb->pn[o][1]*kb->pn[o][1]+
+ kb->pn[o][2]*kb->pn[o][2]);
+ kb->pn[o][0] *= t;
+ kb->pn[o][1] *= t;
+ kb->pn[o][2] *= t;
+ }
+ }
+
+ if (kb->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+
+ for (i=0; i<NUMU; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ if (kb->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=NUMV; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(NUMV+1)+m;
+ glNormal3fv(kb->pn[o]);
+ glTexCoord2fv(kb->tex[o]);
+ if (kb->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(kb->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
+ }
+ glVertex3fv(kb->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+/* Draw a Lawson Klein bottle projected into 3D. */
+static int lawson(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4];
+ int i, j, k, l, m, o;
+ double u, v;
+ double cu, su, cv, sv, cv2, sv2;
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double q, r, s, t;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = cu*cv;
+ xx[1] = cu*sv;
+ xx[2] = su*sv2;
+ xx[3] = su*cv2;
+ xxu[0] = -su*cv;
+ xxu[1] = -su*sv;
+ xxu[2] = cu*sv2;
+ xxu[3] = cu*cv2;
+ xxv[0] = -cu*sv;
+ xxv[1] = cu*cv;
+ xxv[2] = su*cv2*0.5;
+ xxv[3] = -su*sv2*0.5;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+kb->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
+ pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
+ pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ kb->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = cu*cv;
+ xx[1] = cu*sv;
+ xx[2] = su*sv2;
+ xx[3] = su*cv2;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+kb->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+kb->offset4d[l])/s;
+ }
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ /* Project the points from 4D to 3D. */
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ o = i*(NUMU+1)+j;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*kb->x[o][0]+mat[l][1]*kb->x[o][1]+
+ mat[l][2]*kb->x[o][2]+mat[l][3]*kb->x[o][3]);
+ yu[l] = (mat[l][0]*kb->xu[o][0]+mat[l][1]*kb->xu[o][1]+
+ mat[l][2]*kb->xu[o][2]+mat[l][3]*kb->xu[o][3]);
+ yv[l] = (mat[l][0]*kb->xv[o][0]+mat[l][1]*kb->xv[o][1]+
+ mat[l][2]*kb->xv[o][2]+mat[l][3]*kb->xv[o][3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ kb->pp[o][l] = (y[l]+kb->offset4d[l])+kb->offset3d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ kb->pp[o][l] = r*q+kb->offset3d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ kb->pn[o][0] = pu[1]*pv[2]-pu[2]*pv[1];
+ kb->pn[o][1] = pu[2]*pv[0]-pu[0]*pv[2];
+ kb->pn[o][2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(kb->pn[o][0]*kb->pn[o][0]+kb->pn[o][1]*kb->pn[o][1]+
+ kb->pn[o][2]*kb->pn[o][2]);
+ kb->pn[o][0] *= t;
+ kb->pn[o][1] *= t;
+ kb->pn[o][2] *= t;
+ }
+ }
+
+ if (kb->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+
+ for (i=0; i<NUMV; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ if (kb->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=NUMU; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(NUMU+1)+m;
+ glNormal3fv(kb->pn[o]);
+ glTexCoord2fv(kb->tex[o]);
+ if (kb->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(kb->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
+ }
+ glVertex3fv(kb->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+/* Generate a texture image that shows the orientation reversal. */
+static void gen_texture(ModeInfo *mi)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ glGenTextures(1,&kb->tex_name);
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+ glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TEX_DIMENSION,TEX_DIMENSION,0,
+ GL_LUMINANCE,GL_UNSIGNED_BYTE,texture);
+}
+
+
+static void init(ModeInfo *mi)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (walk_speed == 0.0)
+ walk_speed = 20.0;
+
+ if (kb->view == VIEW_TURN)
+ {
+ kb->alpha = frand(360.0);
+ kb->beta = frand(360.0);
+ kb->delta = frand(360.0);
+ }
+ else
+ {
+ kb->alpha = 0.0;
+ kb->beta = 0.0;
+ kb->delta = 0.0;
+ }
+ kb->zeta = 0.0;
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8 ||
+ kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ kb->eta = 0.0;
+ else
+ kb->eta = 45.0;
+ kb->theta = 0.0;
+ kb->umove = frand(2.0*M_PI);
+ kb->vmove = frand(2.0*M_PI);
+ kb->dumove = 0.0;
+ kb->dvmove = 0.0;
+ kb->side = 1;
+
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
+ {
+ kb->offset4d[0] = 0.0;
+ kb->offset4d[1] = 0.0;
+ kb->offset4d[2] = 0.0;
+ kb->offset4d[3] = 1.5;
+ kb->offset3d[0] = 0.0;
+ kb->offset3d[1] = 0.0;
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ kb->offset3d[2] = -2.1;
+ else
+ kb->offset3d[2] = -1.9;
+ kb->offset3d[3] = 0.0;
+ }
+ else if (kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ {
+ kb->offset4d[0] = 0.0;
+ kb->offset4d[1] = 0.0;
+ kb->offset4d[2] = 0.0;
+ kb->offset4d[3] = 1.4;
+ kb->offset3d[0] = 0.0;
+ kb->offset3d[1] = 0.0;
+ kb->offset3d[2] = -2.0;
+ kb->offset3d[3] = 0.0;
+ }
+ else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
+ {
+ kb->offset4d[0] = 0.0;
+ kb->offset4d[1] = 0.0;
+ kb->offset4d[2] = 0.0;
+ if (kb->projection_4d == DISP_4D_PERSPECTIVE &&
+ kb->projection_3d == DISP_3D_ORTHOGRAPHIC)
+ kb->offset4d[3] = 1.5;
+ else
+ kb->offset4d[3] = 1.1;
+ kb->offset3d[0] = 0.0;
+ kb->offset3d[1] = 0.0;
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ kb->offset3d[2] = -2.0;
+ else
+ kb->offset3d[2] = -5.0;
+ kb->offset3d[3] = 0.0;
+ }
+
+ gen_texture(mi);
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
+ setup_figure8(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else if (kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ setup_squeezed_torus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
+ setup_lawson(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+
+ if (marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
+ kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ gluPerspective(60.0,1.0,0.01,10.0);
+ else
+ gluPerspective(60.0,1.0,0.1,10.0);
+ }
+ else
+ {
+ glOrtho(-1.0,1.0,-1.0,1.0,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (kb->display_mode == DISP_WIREFRAME)
+ kb->display_mode = DISP_SURFACE;
+# endif
+
+ if (kb->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+}
+
+
+/* Redisplay the Klein bottle. */
+static void display_klein(ModeInfo *mi)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (!kb->button_pressed)
+ {
+ if (kb->view == VIEW_TURN)
+ {
+ kb->alpha += speed_wx * kb->speed_scale;
+ if (kb->alpha >= 360.0)
+ kb->alpha -= 360.0;
+ kb->beta += speed_wy * kb->speed_scale;
+ if (kb->beta >= 360.0)
+ kb->beta -= 360.0;
+ kb->delta += speed_wz * kb->speed_scale;
+ if (kb->delta >= 360.0)
+ kb->delta -= 360.0;
+ kb->zeta += speed_xy * kb->speed_scale;
+ if (kb->zeta >= 360.0)
+ kb->zeta -= 360.0;
+ kb->eta += speed_xz * kb->speed_scale;
+ if (kb->eta >= 360.0)
+ kb->eta -= 360.0;
+ kb->theta += speed_yz * kb->speed_scale;
+ if (kb->theta >= 360.0)
+ kb->theta -= 360.0;
+ }
+ if (kb->view == VIEW_WALKTURN)
+ {
+ kb->zeta += speed_xy * kb->speed_scale;
+ if (kb->zeta >= 360.0)
+ kb->zeta -= 360.0;
+ kb->eta += speed_xz * kb->speed_scale;
+ if (kb->eta >= 360.0)
+ kb->eta -= 360.0;
+ kb->theta += speed_yz * kb->speed_scale;
+ if (kb->theta >= 360.0)
+ kb->theta -= 360.0;
+ }
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ kb->dvmove = cos(walk_direction*M_PI/180.0)*walk_speed*M_PI/4096.0;
+ kb->vmove += kb->dvmove;
+ if (kb->vmove >= 2.0*M_PI)
+ {
+ kb->vmove -= 2.0*M_PI;
+ kb->umove = 2.0*M_PI-kb->umove;
+ kb->side = -kb->side;
+ }
+ kb->dumove = (kb->side*sin(walk_direction*M_PI/180.0)*
+ walk_speed*M_PI/4096.0);
+ kb->umove += kb->dumove;
+ if (kb->umove >= 2.0*M_PI)
+ kb->umove -= 2.0*M_PI;
+ if (kb->umove < 0.0)
+ kb->umove += 2.0*M_PI;
+ }
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
+ kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ gluPerspective(60.0,kb->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,kb->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (kb->aspect >= 1.0)
+ glOrtho(-kb->aspect,kb->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/kb->aspect,1.0/kb->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
+ mi->polygon_count = figure8(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else if (kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ mi->polygon_count = squeezed_torus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
+ mi->polygon_count = lawson(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+}
+
+
+ENTRYPOINT void reshape_klein(ModeInfo *mi, int width, int height)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ kb->WindW = (GLint)width;
+ kb->WindH = (GLint)height;
+ glViewport(0,0,width,height);
+ kb->aspect = (GLfloat)width/(GLfloat)height;
+}
+
+
+ENTRYPOINT Bool klein_handle_event(ModeInfo *mi, XEvent *event)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+ KeySym sym = 0;
+ char c = 0;
+
+ if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
+ XLookupString (&event->xkey, &c, 1, &sym, 0);
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ kb->button_pressed = True;
+ gltrackball_start(kb->trackballs[kb->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ kb->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ kb->current_trackball = 1;
+ if (kb->button_pressed)
+ gltrackball_start(kb->trackballs[kb->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == KeyRelease)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ kb->current_trackball = 0;
+ if (kb->button_pressed)
+ gltrackball_start(kb->trackballs[kb->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == MotionNotify && kb->button_pressed)
+ {
+ gltrackball_track(kb->trackballs[kb->current_trackball],
+ event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize klein. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_klein(ModeInfo *mi)
+{
+ kleinstruct *kb;
+
+ MI_INIT(mi, klein);
+ kb = &klein[MI_SCREEN(mi)];
+
+
+ kb->trackballs[0] = gltrackball_init(True);
+ kb->trackballs[1] = gltrackball_init(True);
+ kb->current_trackball = 0;
+ kb->button_pressed = False;
+
+ /* Set the Klein bottle. */
+ if (!strcasecmp(klein_bottle,"random"))
+ {
+ kb->bottle_type = random() % NUM_KLEIN_BOTTLES;
+ }
+ else if (!strcasecmp(klein_bottle,"figure-8"))
+ {
+ kb->bottle_type = KLEIN_BOTTLE_FIGURE_8;
+ }
+ else if (!strcasecmp(klein_bottle,"squeezed-torus"))
+ {
+ kb->bottle_type = KLEIN_BOTTLE_SQUEEZED_TORUS;
+ }
+ else if (!strcasecmp(klein_bottle,"lawson"))
+ {
+ kb->bottle_type = KLEIN_BOTTLE_LAWSON;
+ }
+ else
+ {
+ kb->bottle_type = random() % NUM_KLEIN_BOTTLES;
+ }
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"random"))
+ {
+ kb->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+ else if (!strcasecmp(mode,"wireframe"))
+ {
+ kb->display_mode = DISP_WIREFRAME;
+ }
+ else if (!strcasecmp(mode,"surface"))
+ {
+ kb->display_mode = DISP_SURFACE;
+ }
+ else if (!strcasecmp(mode,"transparent"))
+ {
+ kb->display_mode = DISP_TRANSPARENT;
+ }
+ else
+ {
+ kb->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+
+ /* Orientation marks don't make sense in wireframe mode. */
+ if (kb->display_mode == DISP_WIREFRAME)
+ marks = False;
+
+ /* Set the appearance. */
+ if (!strcasecmp(appear,"random"))
+ {
+ kb->appearance = random() % NUM_APPEARANCES;
+ }
+ else if (!strcasecmp(appear,"solid"))
+ {
+ kb->appearance = APPEARANCE_SOLID;
+ }
+ else if (!strcasecmp(appear,"bands"))
+ {
+ kb->appearance = APPEARANCE_BANDS;
+ }
+ else
+ {
+ kb->appearance = random() % NUM_APPEARANCES;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_mode,"random"))
+ {
+ kb->colors = random() % NUM_COLORS;
+ }
+ else if (!strcasecmp(color_mode,"two-sided"))
+ {
+ kb->colors = COLORS_TWOSIDED;
+ }
+ else if (!strcasecmp(color_mode,"rainbow"))
+ {
+ kb->colors = COLORS_RAINBOW;
+ }
+ else if (!strcasecmp(color_mode,"depth"))
+ {
+ kb->colors = COLORS_DEPTH;
+ }
+ else
+ {
+ kb->colors = random() % NUM_COLORS;
+ }
+
+ /* Set the view mode. */
+ if (!strcasecmp(view_mode,"random"))
+ {
+ kb->view = random() % NUM_VIEW_MODES;
+ }
+ else if (!strcasecmp(view_mode,"walk"))
+ {
+ kb->view = VIEW_WALK;
+ }
+ else if (!strcasecmp(view_mode,"turn"))
+ {
+ kb->view = VIEW_TURN;
+ }
+ else if (!strcasecmp(view_mode,"walk-turn"))
+ {
+ kb->view = VIEW_WALKTURN;
+ }
+ else
+ {
+ kb->view = random() % NUM_VIEW_MODES;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj_3d,"random"))
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (kb->view == VIEW_TURN)
+ kb->projection_3d = random() % NUM_DISP_3D_MODES;
+ else
+ kb->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"perspective"))
+ {
+ kb->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"orthographic"))
+ {
+ kb->projection_3d = DISP_3D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (kb->view == VIEW_TURN)
+ kb->projection_3d = random() % NUM_DISP_3D_MODES;
+ else
+ kb->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+
+ /* Set the 4d projection mode. */
+ if (!strcasecmp(proj_4d,"random"))
+ {
+ kb->projection_4d = random() % NUM_DISP_4D_MODES;
+ }
+ else if (!strcasecmp(proj_4d,"perspective"))
+ {
+ kb->projection_4d = DISP_4D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_4d,"orthographic"))
+ {
+ kb->projection_4d = DISP_4D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ kb->projection_4d = random() % NUM_DISP_4D_MODES;
+ }
+
+ /* Modify the speeds to a useful range in walk-and-turn mode. */
+ if (kb->view == VIEW_WALKTURN)
+ {
+ speed_wx *= 0.2;
+ speed_wy *= 0.2;
+ speed_wz *= 0.2;
+ speed_xy *= 0.2;
+ speed_xz *= 0.2;
+ speed_yz *= 0.2;
+ }
+
+ /* make multiple screens rotate at slightly different rates. */
+ kb->speed_scale = 0.9 + frand(0.3);
+
+ if ((kb->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_klein(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_klein(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ kleinstruct *kb;
+
+ if (klein == NULL)
+ return;
+ kb = &klein[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!kb->glx_context)
+ return;
+
+ glXMakeCurrent(display,window,*(kb->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ display_klein(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_klein(ModeInfo *mi)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (!kb->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(kb->glx_context));
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Klein", klein)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/klein.man b/hacks/glx/klein.man
new file mode 100644
index 0000000..1b456bc
--- /dev/null
+++ b/hacks/glx/klein.man
@@ -0,0 +1,308 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+klein - Draws a 4d Klein bottle.
+.SH SYNOPSIS
+.B klein
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-klein-bottle \fIbottle-name\fP]
+[-figure-8]
+[-squeezed-torus]
+[-lawson]
+[\-mode \fIdisplay-mode\fP]
+[\-wireframe]
+[\-surface]
+[\-transparent]
+[\-appearance \fIappearance\fP]
+[\-solid]
+[\-bands]
+[\-colors \fIcolor-scheme\fP]
+[\-twosided]
+[\-rainbow]
+[\-depth]
+[\-view-mode \fIview-mode\fP]
+[\-walk]
+[\-turn]
+[\-walk-turn]
+[\-orientation-marks]
+[\-projection-3d \fImode\fP]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-projection-4d \fImode\fP]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+[\-walk-direction \fIfloat\fP]
+[\-walk-speed \fIfloat\fP]
+.SH DESCRIPTION
+The \fIklein\fP program shows three different Klein bottles in 4d: the
+figure-8 Klein bottle, the squeezed torus Klein bottle, or the Lawson
+Klein bottle. You can walk on the Klein bottle, see it turn in 4d, or
+walk on it while it turns in 4d. The figure-8 Klein bottle is well
+known in its 3d form. The 4d form used in this program is an
+extension of the 3d form to 4d that does not intersect itself in 4d
+(which can be seen in the depth colors mode). The squeezed torus
+Klein bottle also does not intersect itself in 4d (which can be seen
+in the depth colors mode). The Lawson Klein bottle, on the other
+hand, does intersect itself in 4d. Its primary use is that it has a
+nice appearance for walking and for turning in 3d. The Klein bottle
+is a non-orientable surface. To make this apparent, the two-sided
+color mode can be used. Alternatively, orientation markers (curling
+arrows) can be drawn as a texture map on the surface of the Klein
+bottle. While walking on the Klein bottle, you will notice that the
+orientation of the curling arrows changes (which it must because the
+Klein bottle is non-orientable). The program projects the 4d Klein
+bottle to 3d using either a perspective or an orthographic projection.
+Which of the two alternatives looks more appealing depends on the
+viewing mode and the Klein bottle. For example, the Lawson Klein
+bottle looks nicest when projected perspectively. The figure-8 Klein
+bottle, on the other hand, looks nicer while walking when projected
+orthographically from 4d. For the squeezed torus Klein bottle, both
+projection modes give equally acceptable projections. The projected
+Klein bottle can then be projected to the screen either perspectively
+or orthographically. When using the walking modes, perspective
+projection to the screen should be used. There are three display
+modes for the Klein bottle: mesh (wireframe), solid, or transparent.
+Furthermore, the appearance of the Klein bottle can be as a solid
+object or as a set of see-through bands. Finally, the colors with
+with the Klein bottle is drawn can be set to two-sided, rainbow, or
+depth. In the first case, the Klein bottle is drawn with red on one
+"side" and green on the "other side". Of course, the Klein bottle
+only has one side, so the color jumps from red to green along a curve
+on the surface of the Klein bottle. This mode enables you to see that
+the Klein bottle is non-orientable. The second mode draws the Klein
+bottle with fully saturated rainbow colors. This gives a very nice
+effect when combined with the see-through bands mode or with the
+orientation markers drawn. The third mode draws the Klein bottle with
+colors that are chosen according to the 4d "depth" of the points.
+This mode enables you to see that the figure-8 and squeezed torus
+Klein bottles do not intersect themselves in 4d, while the Lawson
+Klein bottle does intersect itself. The rotation speed for each of
+the six planes around which the Klein bottle rotates can be chosen.
+For the walk-and-turn mode, only the rotation speeds around the true
+4d planes are used (the xy, xz, and yz planes). Furthermore, in the
+walking modes the walking direction in the 2d base square of the Klein
+bottle and the walking speed can be chosen. This program is somewhat
+inspired by Thomas Banchoff's book "Beyond the Third Dimension:
+Geometry, Computer Graphics, and Higher Dimensions", Scientific
+American Library, 1990.
+.SH OPTIONS
+.I klein
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 10000, or 1/100th second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.PP
+The following three options are mutually exclusive. They determine
+which Klein bottle is displayed.
+.TP 8
+.B \-klein-bottle random
+Display a random Klein bottle (default).
+.TP 8
+.B \-klein-bottle figure-8 \fP(Shortcut: \fB\-figure-8\fP)
+Display the figure-8 Klein bottle.
+.TP 8
+.B \-klein-bottle squeezed-torus \fP(Shortcut: \fB\-squeezed-torus\fP)
+Display the squeezed torus Klein bottle.
+.TP 8
+.B \-klein-bottle lawson \fP(Shortcut: \fB\-lawson\fP)
+Display the Lawson Klein bottle.
+.PP
+The following four options are mutually exclusive. They determine
+how the Klein bottle is displayed.
+.TP 8
+.B \-mode random
+Display the Klein bottle in a random display mode (default).
+.TP 8
+.B \-mode wireframe \fP(Shortcut: \fB\-wireframe\fP)
+Display the Klein bottle as a wireframe mesh.
+.TP 8
+.B \-mode surface \fP(Shortcut: \fB\-surface\fP)
+Display the Klein bottle as a solid surface.
+.TP 8
+.B \-mode transparent \fP(Shortcut: \fB\-transparent\fP)
+Display the Klein bottle as a transparent surface.
+.PP
+The following three options are mutually exclusive. They determine the
+appearance of the Klein bottle.
+.TP 8
+.B \-appearance random
+Display the Klein bottle with a random appearance (default).
+.TP 8
+.B \-appearance solid \fP(Shortcut: \fB\-solid\fP)
+Display the Klein bottle as a solid object.
+.TP 8
+.B \-appearance bands \fP(Shortcut: \fB\-bands\fP)
+Display the Klein bottle as see-through bands.
+.PP
+The following four options are mutually exclusive. They determine
+how to color the Klein bottle.
+.TP 8
+.B \-colors random
+Display the Klein bottle with a random color scheme (default).
+.TP 8
+.B \-colors twosided \fP(Shortcut: \fB\-twosided\fP)
+Display the Klein bottle with two colors: red on one "side" and green
+on the "other side".
+.TP 8
+.B \-colors rainbow \fP(Shortcut: \fB\-rainbow\fP)
+Display the Klein bottle with fully saturated rainbow colors. If the
+Klein bottle is displayed as see-through bands, each band will be
+displayed with a different color.
+.TP 8
+.B \-colors depth \fP(Shortcut: \fB\-depth\fP)
+Display the Klein bottle with colors chosen depending on the 4d
+"depth" of the points.
+.PP
+The following four options are mutually exclusive. They determine
+how to view the Klein bottle.
+.TP 8
+.B \-view-mode random
+View the Klein bottle in a random view mode (default).
+.TP 8
+.B \-view-mode walk \fP(Shortcut: \fB\-walk\fP)
+View the Klein bottle as if walking on its surface.
+.TP 8
+.B \-view-mode turn \fP(Shortcut: \fB\-turn\fP)
+View the Klein bottle while it turns in 4d.
+.TP 8
+.B \-view-mode walk-turn \fP(Shortcut: \fB\-walk-turn\fP)
+View the Klein bottle as if walking on its surface. Additionally, the
+Klein bottle turns around the true 4d planes (the xy, xz, and yz
+planes).
+.PP
+The following options determine whether orientation marks are shown on
+the Klein bottle.
+.TP 8
+.B \-orientation-marks
+Display orientation marks on the Klein bottle.
+.TP 8
+.B \-no-orientation-marks
+Don't display orientation marks on the Klein bottle (default).
+.PP
+The following three options are mutually exclusive. They determine
+how the Klein bottle is projected from 3d to 2d (i.e., to the screen).
+.TP 8
+.B \-projection-3d random
+Project the Klein bottle from 3d to 2d using a random projection mode
+(default).
+.TP 8
+.B \-projection-3d perspective \fP(Shortcut: \fB\-perspective-3d\fP)
+Project the Klein bottle from 3d to 2d using a perspective projection.
+.TP 8
+.B \-projection-3d orthographic \fP(Shortcut: \fB\-orthographic-3d\fP)
+Project the Klein bottle from 3d to 2d using an orthographic
+projection.
+.PP
+The following three options are mutually exclusive. They determine
+how the Klein bottle is projected from 4d to 3d.
+.TP 8
+.B \-projection-4d random
+Project the Klein bottle from 4d to 3d using a random projection mode
+(default).
+.TP 8
+.B \-projection-4d perspective \fP(Shortcut: \fB\-perspective-4d\fP)
+Project the Klein bottle from 4d to 3d using a perspective projection.
+.TP 8
+.B \-projection-4d orthographic \fP(Shortcut: \fB\-orthographic-4d\fP)
+Project the Klein bottle from 4d to 3d using an orthographic
+projection.
+.PP
+The following six options determine the rotation speed of the Klein
+bottle around the six possible hyperplanes. The rotation speed is
+measured in degrees per frame. The speeds should be set to relatively
+small values, e.g., less than 4 in magnitude. In walk mode, all
+speeds are ignored. In walk-and-turn mode, the 3d rotation speeds are
+ignored (i.e., the wx, wy, and wz speeds). In walk-and-turn mode,
+smaller speeds must be used than in the turn mode to achieve a nice
+visualization. Therefore, in walk-and-turn mode the speeds you have
+selected are divided by 5 internally.
+.TP 8
+.B \-speed-wx \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-wy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.PP
+The following two options determine the walking speed and direction.
+.TP 8
+.B \-walk-direction \fIfloat\fP
+The walking direction is measured as an angle in degrees in the 2d
+square that forms the coordinate system of the surface of the Klein
+bottle (default: 7.0).
+.TP 8
+.B \-walk-speed \fIfloat\fP
+The walking speed is measured in percent of some sensible maximum
+speed (default: 20.0).
+.SH INTERACTION
+If you run this program in standalone mode in its turn mode, you can
+rotate the Klein bottle by dragging the mouse while pressing the left
+mouse button. This rotates the Klein bottle in 3D, i.e., around the
+wx, wy, and wz planes. If you press the shift key while dragging the
+mouse with the left button pressed the Klein bottle is rotated in 4D,
+i.e., around the xy, xz, and yz planes. To examine the Klein bottle
+at your leisure, it is best to set all speeds to 0. Otherwise, the
+Klein bottle will rotate while the left mouse button is not pressed.
+This kind of interaction is not available in the two walk modes.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005-2014 by Carsten Steger. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 03-oct-2014.
diff --git a/hacks/glx/lament.c b/hacks/glx/lament.c
new file mode 100644
index 0000000..97ce18b
--- /dev/null
+++ b/hacks/glx/lament.c
@@ -0,0 +1,1786 @@
+/* xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Animates Lemarchand's Box, the Lament Configuration. By jwz, 25-Jul-98.
+
+ TODO:
+
+ * The gold leaf should appear to be raised up from the surface, but
+ I think this isn't possible with OpenGL. No bump maps.
+
+ * There should be strange lighting effects playing across the surface:
+ electric sparks, or little glittery blobs of light. Maybe like
+ http://www.opengl.org/archives/resources/features/KilgardTechniques/
+ LensFlare/
+
+ * Chains.
+
+ * Needs music. ("Hellraiser Themes" by Coil: TORSO CD161; also
+ duplicated on the "Unnatural History 2" compilation, WORLN M04699.)
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_lament 0
+# define release_lament 0
+#include "xlockmore.h"
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+/* #define DEBUG_MODE LAMENT_LEVIATHAN_COLLAPSE */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+#undef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#undef MIN
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+
+extern const struct gllist
+ *lament_model_box,
+ *lament_model_iso_base_a,
+ *lament_model_iso_base_b,
+ *lament_model_iso_den,
+ *lament_model_iso_dse,
+ *lament_model_iso_dwn,
+ *lament_model_iso_swd,
+ *lament_model_iso_une,
+ *lament_model_iso_unw,
+ *lament_model_iso_use,
+ *lament_model_iso_usw,
+ *lament_model_leviathan,
+ *lament_model_lid_a,
+ *lament_model_lid_b,
+ *lament_model_lid_base,
+ *lament_model_lid_c,
+ *lament_model_lid_d,
+ *lament_model_pillar_a,
+ *lament_model_pillar_b,
+ *lament_model_pillar_base,
+ *lament_model_star_d,
+ *lament_model_star_u,
+ *lament_model_taser_a,
+ *lament_model_taser_b,
+ *lament_model_taser_base,
+ *lament_model_tetra_base,
+ *lament_model_tetra_dse,
+ *lament_model_tetra_dwn,
+ *lament_model_tetra_une,
+ *lament_model_tetra_usw;
+
+static const struct gllist * const *all_objs[] = {
+ &lament_model_box,
+ &lament_model_iso_base_a,
+ &lament_model_iso_base_b,
+ &lament_model_iso_den,
+ &lament_model_iso_dse,
+ &lament_model_iso_dwn,
+ &lament_model_iso_swd,
+ &lament_model_iso_une,
+ &lament_model_iso_unw,
+ &lament_model_iso_use,
+ &lament_model_iso_usw,
+ &lament_model_leviathan,
+ &lament_model_lid_a,
+ &lament_model_lid_b,
+ &lament_model_lid_base,
+ &lament_model_lid_c,
+ &lament_model_lid_d,
+ &lament_model_pillar_a,
+ &lament_model_pillar_b,
+ &lament_model_pillar_base,
+ &lament_model_star_d,
+ &lament_model_star_u,
+ &lament_model_taser_a,
+ &lament_model_taser_b,
+ &lament_model_taser_base,
+ &lament_model_tetra_base,
+ &lament_model_tetra_dse,
+ &lament_model_tetra_dwn,
+ &lament_model_tetra_une,
+ &lament_model_tetra_usw
+};
+
+typedef enum { /* must be in the same order as in `all_objs'. */
+ OBJ_BOX = 0,
+ OBJ_ISO_BASE_A,
+ OBJ_ISO_BASE_B,
+ OBJ_ISO_DEN,
+ OBJ_ISO_DSE,
+ OBJ_ISO_DWN,
+ OBJ_ISO_SWD,
+ OBJ_ISO_UNE,
+ OBJ_ISO_UNW,
+ OBJ_ISO_USE,
+ OBJ_ISO_USW,
+ OBJ_LEVIATHAN,
+ OBJ_LID_A,
+ OBJ_LID_B,
+ OBJ_LID_BASE,
+ OBJ_LID_C,
+ OBJ_LID_D,
+ OBJ_PILLAR_A,
+ OBJ_PILLAR_B,
+ OBJ_PILLAR_BASE,
+ OBJ_STAR_D,
+ OBJ_STAR_U,
+ OBJ_TASER_A,
+ OBJ_TASER_B,
+ OBJ_TASER_BASE,
+ OBJ_TETRA_BASE,
+ OBJ_TETRA_DSE,
+ OBJ_TETRA_DWN,
+ OBJ_TETRA_UNE,
+ OBJ_TETRA_USW
+} lament_obj_index;
+
+
+#define DEF_TEXTURE "True"
+
+static int do_texture;
+
+static XrmOptionDescRec opts[] = {
+ {"-texture", ".lament.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".lament.texture", XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "normals.h"
+
+#include "images/gen/lament512_png.h"
+
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+typedef enum {
+ LAMENT_BOX,
+
+ LAMENT_STAR_OUT,
+ LAMENT_STAR_ROT,
+ LAMENT_STAR_ROT_IN,
+ LAMENT_STAR_ROT_OUT,
+ LAMENT_STAR_UNROT,
+ LAMENT_STAR_IN,
+
+ LAMENT_TETRA_UNE,
+ LAMENT_TETRA_USW,
+ LAMENT_TETRA_DWN,
+ LAMENT_TETRA_DSE,
+
+ LAMENT_LID_OPEN,
+ LAMENT_LID_CLOSE,
+ LAMENT_LID_ZOOM,
+
+ LAMENT_TASER_OUT,
+ LAMENT_TASER_SLIDE,
+ LAMENT_TASER_SLIDE_IN,
+ LAMENT_TASER_IN,
+
+ LAMENT_PILLAR_OUT,
+ LAMENT_PILLAR_SPIN,
+ LAMENT_PILLAR_IN,
+
+ LAMENT_SPHERE_OUT,
+ LAMENT_SPHERE_IN,
+
+ LAMENT_LEVIATHAN_SPIN,
+ LAMENT_LEVIATHAN_FADE,
+ LAMENT_LEVIATHAN_TWIST,
+ LAMENT_LEVIATHAN_COLLAPSE,
+ LAMENT_LEVIATHAN_EXPAND,
+ LAMENT_LEVIATHAN_UNTWIST,
+ LAMENT_LEVIATHAN_UNFADE,
+ LAMENT_LEVIATHAN_UNSPIN,
+
+} lament_type;
+
+static const GLfloat exterior_color[] =
+ { 0.33, 0.22, 0.03, 1.00, /* ambient */
+ 0.78, 0.57, 0.11, 1.00, /* specular */
+ 0.99, 0.91, 0.81, 1.00, /* diffuse */
+ 27.80 /* shininess */
+ };
+static const GLfloat interior_color[] =
+ { 0.20, 0.20, 0.15, 1.00, /* ambient */
+ 0.40, 0.40, 0.32, 1.00, /* specular */
+ 0.99, 0.99, 0.81, 1.00, /* diffuse */
+ 50.80 /* shininess */
+ };
+static const GLfloat leviathan_color[] =
+ { 0.30, 0.30, 0.30, 1.00, /* ambient */
+ 0.85, 0.85, 0.95, 1.00, /* specular */
+ 0.99, 0.99, 0.99, 1.00, /* diffuse */
+ 50.80 /* shininess */
+ };
+static const GLfloat black_color[] =
+ { 0.05, 0.05, 0.05, 1.00, /* ambient */
+ 0.05, 0.05, 0.05, 1.00, /* specular */
+ 0.05, 0.05, 0.05, 1.00, /* diffuse */
+ 80.00 /* shininess */
+ };
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ double rotx, roty, rotz;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool ffwdp;
+
+ GLuint dlists[countof(all_objs)];
+ GLuint polys[countof(all_objs)];
+
+ XImage *texture; /* image bits */
+ GLuint texids[8]; /* texture map IDs */
+ lament_type type; /* which mode of the object is current */
+
+ int anim_pause; /* countdown before animating again */
+ GLfloat anim_r, anim_y, anim_z; /* relative position during anims */
+ Bool facing_p;
+
+ int state, nstates;
+ lament_type *states;
+
+} lament_configuration;
+
+static lament_configuration *lcs = NULL;
+
+
+static Bool
+facing_screen_p (ModeInfo *mi)
+{
+ Bool facing_p;
+ GLdouble m[16], p[16], x, y, z;
+ GLint v[4];
+ glGetDoublev (GL_MODELVIEW_MATRIX, m);
+ glGetDoublev (GL_PROJECTION_MATRIX, p);
+ glGetIntegerv (GL_VIEWPORT, v);
+
+ /* See if a coordinate 5 units in front of the door is near the
+ center of the screen. */
+ gluProject (0, -5, 0, m, p, v, &x, &y, &z);
+ x = (x / MI_WIDTH(mi)) - 0.5;
+ y = (y / MI_HEIGHT(mi)) - 0.5;
+
+ facing_p = (z < 0.9 &&
+ x > -0.15 && x < 0.15 &&
+ y > -0.15 && y < 0.15);
+
+# ifdef DEBUG_MODE
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable (GL_LIGHTING);
+ glColor3f (1, (facing_p ? 1 : 0), 0);
+ glBegin (GL_LINES);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -5, 0);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable (GL_LIGHTING);
+# endif /* DEBUG_MODE */
+
+ return facing_p;
+}
+
+
+static void
+scale_for_window (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+
+ GLfloat target_size = 1.4 * (lc->texture ? lc->texture->width : 512);
+ GLfloat size = MI_WIDTH(mi) < MI_HEIGHT(mi) ? MI_WIDTH(mi) : MI_HEIGHT(mi);
+ GLfloat scale;
+
+ /* Make it take up roughly the full width of the window. */
+ scale = 20;
+
+ /* But if the window is wider than tall, make it only take up the
+ height of the window instead.
+ */
+ if (MI_WIDTH(mi) > MI_HEIGHT(mi))
+ scale /= MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+
+ /* If the window is super wide, make it bigger. */
+ if (scale < 8) scale = 8;
+
+ /* Constrain it to roughly life-sized on the screen, not huge.
+ */
+# ifdef HAVE_MOBILE
+ if (size > 768) /* iPad retina / iPhone 6 */
+ target_size *= 1.5;
+ else
+# endif
+ {
+ GLfloat max = 500; /* 3" on my screen... */
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ target_size *= 2.5;
+ max *= 2.5;
+ }
+
+ if (target_size > max)
+ target_size = max;
+ }
+
+ /* But if that would make the image larger than target_size, scale it
+ back down again. The image-map bits we have are 512x512, so if the
+ image is magnified a lot, it looks pretty blocky. It's better to
+ have a 512x512 animation on a 1920x1080 screen that looks good
+ than a 1024x1024 animation that looks really pixelated.
+ */
+ if (size > target_size)
+ scale *= target_size / size;
+
+ glScalef (scale, scale, scale);
+}
+
+
+static void
+set_colors (const GLfloat *color)
+{
+ glMaterialfv(GL_FRONT, GL_AMBIENT, color + 0);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, color + 4);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, color + 8);
+ glMaterialfv(GL_FRONT, GL_SHININESS, color + 12);
+}
+
+static void
+set_colors_alpha (const GLfloat *color, GLfloat a)
+{
+ GLfloat c[countof(leviathan_color)];
+ memcpy (c, color, sizeof(c));
+ c[3] = c[7] = c[11] = a;
+ set_colors (c);
+}
+
+
+static void
+which_face (ModeInfo *mi, const GLfloat *f, int *face, int *outerp)
+{
+ GLfloat size = 3; /* 3" square */
+ const GLfloat *n = f; /* normal */
+ const GLfloat *v = f + 3; /* vertex */
+ GLfloat slack = 0.01;
+
+ /* First look at the normal to determine which direction this triangle
+ is facing (or is most-closely facing).
+ It's an outer surface if it is within epsilon of the cube wall that
+ it is facing. Otherwise, it's an inner surface.
+ */
+ if (n[1] < -0.5) *face = 1, *outerp = v[1] < slack; /* S */
+ else if (n[2] > 0.5) *face = 2, *outerp = v[2] > size-slack; /* U */
+ else if (n[1] > 0.5) *face = 3, *outerp = v[1] > size-slack; /* N */
+ else if (n[2] < -0.5) *face = 4, *outerp = v[2] < slack; /* D */
+ else if (n[0] < -0.5) *face = 5, *outerp = v[0] < slack; /* W */
+ else /* (n[0] > 0.5)*/ *face = 6, *outerp = v[0] > size-slack; /* E */
+
+ /* Faces that don't have normals parallel to the axes aren't external. */
+ if (*outerp &&
+ (n[0] > -0.95 && n[0] < 0.95 &&
+ n[1] > -0.95 && n[1] < 0.95 &&
+ n[2] > -0.95 && n[2] < 0.95))
+ *outerp = 0;
+}
+
+
+static void
+texturize_vert (ModeInfo *mi, int which, const GLfloat *v)
+{
+ GLfloat size = 3; /* 3" square */
+ GLfloat s = 0, q = 0;
+
+ /* Texture coordinates are surface coordinates,
+ on the plane of this cube wall. */
+ switch (which) {
+ case 0: break;
+ case 1: s = v[0], q = v[2]; break;
+ case 2: s = v[0], q = v[1]; break;
+ case 3: s = v[0], q = v[2]; q = size - q; break;
+ case 4: s = v[0], q = v[1]; q = size - q; break;
+ case 5: s = v[1], q = v[2]; break;
+ case 6: s = v[1], q = v[2]; break;
+ default: abort(); break;
+ }
+
+ glTexCoord2f (s / size, q / size);
+}
+
+
+static void
+leviathan (ModeInfo *mi, GLfloat ratio, GLfloat alpha, Bool top_p)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat r = 0.34;
+ GLfloat z = 2 * ratio;
+ XYZ p[3];
+ int i;
+
+ GLfloat th = acos (2 / sqrt (6)); /* Line up with cube's diagonal */
+
+ glPushMatrix();
+
+ glRotatef (-45, 0, 1, 0);
+ glRotatef (-th * 180 / M_PI, 0, 0, 1);
+
+ if (!top_p)
+ glRotatef (180, 0, 0, 1);
+
+ for (i = 0; i < countof(p); i++)
+ {
+ GLfloat th = i * M_PI * 2 / countof(p);
+ p[i].x = cos(th) * r;
+ p[i].y = sin(th) * r;
+ }
+
+ glFrontFace (GL_CCW);
+ for (i = 0; i < countof(p); i++)
+ {
+ int j = (i + 1) % countof(p);
+/* if (top_p)*/
+ do_normal (z, 0, 0,
+ 0, p[i].x, p[i].y,
+ 0, p[j].x, p[j].y);
+/*
+ else
+ do_normal (z, 0, 0,
+ 0, p[j].y, p[j].z,
+ 0, p[i].y, p[i].z);
+*/
+
+ if (do_texture) /* Leviathan is the final texture */
+ glBindTexture (GL_TEXTURE_2D, lc->texids[countof(lc->texids) - 1]);
+
+ set_colors (leviathan_color);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (0.5, 1);
+ glVertex3f (z, 0, 0);
+
+ glTexCoord2f (0, 0);
+ glVertex3f (0, p[i].x, p[i].y);
+
+ glTexCoord2f (1, 0);
+ glVertex3f (0, p[j].x, p[j].y);
+ glEnd();
+ mi->polygon_count++;
+
+ /* Shield for fading */
+ if (alpha < 0.9 && !wire)
+ {
+ GLfloat a = 0.35;
+ GLfloat b = 0.69;
+
+ set_colors_alpha (black_color, 1-alpha);
+ glBindTexture (GL_TEXTURE_2D, 0);
+ if (!wire)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ glVertex3f (z*a, p[j].x * b, p[j].y * b);
+ glVertex3f (z*a, p[i].x * b, p[i].y * b);
+ glVertex3f (0, p[i].x * 1.01, p[i].y * 1.01);
+ glVertex3f (0, p[j].x * 1.01, p[j].y * 1.01);
+ glEnd();
+ mi->polygon_count++;
+ glDisable (GL_BLEND);
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+static void
+folding_walls (ModeInfo *mi, GLfloat ratio, Bool top_p)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ const GLfloat pa[4][2] = {{ -0.5, -0.215833 },
+ { 0, 0.5 },
+ { 0.5, 0 },
+ { -0.215833, -0.5 }};
+ const int tex[6] = { 0, 5, 1, 4, 2, 3 };
+ const GLfloat top = -pa[0][1];
+ GLfloat end_angle = 30.85;
+ GLfloat rr = sin (ratio / 2 * M_PI);
+ GLfloat offa = 0.15 * rr;
+ GLfloat offb = 0.06 * rr;
+ GLfloat p[4][3];
+ GLfloat t[4][2];
+ int i;
+
+ glPushMatrix();
+
+ if (top_p)
+ {
+ glRotatef (60, 1, -1, 1);
+ glRotatef (180, 0, 1, 0);
+ glRotatef (90, 1, 0, 0);
+ }
+ else
+ {
+ glRotatef (180, 1, 0, 0);
+ }
+
+ /* Scale down the points near the axis */
+
+ p[0][0] = pa[0][0];
+ p[0][1] = 0.5;
+ p[0][2] = pa[0][1];
+
+ p[1][0] = pa[1][0] - offb;
+ p[1][1] = 0.5;
+ p[1][2] = pa[1][1] - offa;
+
+ p[2][0] = pa[2][0] - offa;
+ p[2][1] = 0.5;
+ p[2][2] = pa[2][1] - offb;
+
+ p[3][0] = pa[3][0];
+ p[3][1] = 0.5;
+ p[3][2] = pa[3][1];
+
+ if (!wire)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ glPushMatrix();
+
+ if (i == 1)
+ {
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 1, 1, 0);
+ }
+ else if (i == 2)
+ {
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 0, 1, 0);
+ glRotatef (90, 0, 1, 0);
+ }
+
+ glRotatef (-90, 0, 1, 0);
+
+ glTranslatef (-(top/2 + 0.25), 0.5, -(top/2 + 0.25));
+ glRotatef (-45, 0, 1, 0);
+ glRotatef (ratio * -end_angle, 0, 0, 1);
+ glRotatef (45, 0, 1, 0);
+ glTranslatef (top/2 + 0.25, -0.5, top/2 + 0.25);
+
+ /* Get the texture coordinates right.
+ This is hairy and incomprehensible. */
+
+ t[0][0] = pa[0][1] + 0.5; t[0][1] = pa[0][0] + 0.5;
+ t[1][0] = pa[1][1] + 0.5; t[1][1] = pa[1][0] + 0.5;
+ t[2][0] = pa[2][1] + 0.5; t[2][1] = pa[2][0] + 0.5;
+ t[3][0] = pa[3][1] + 0.5; t[3][1] = pa[3][0] + 0.5;
+
+ if (i == 0 && !top_p)
+ {
+# define SWAP(A,B) A = 1-A, B = 1-B
+ SWAP(t[0][0], t[0][1]);
+ SWAP(t[1][0], t[1][1]);
+ SWAP(t[2][0], t[2][1]);
+ SWAP(t[3][0], t[3][1]);
+# undef SWAP
+ }
+ else if (i == 0 && top_p)
+ {
+ GLfloat ot[4][3];
+ memcpy (ot, t, sizeof(t));
+# define SWAP(A,B) A = 1-A, B = 1-B
+ SWAP(t[0][0], ot[2][1]);
+ SWAP(t[1][0], ot[3][1]);
+ SWAP(t[2][0], ot[0][1]);
+ SWAP(t[3][0], ot[1][1]);
+# undef SWAP
+ }
+ else if (i == 1)
+ {
+ GLfloat f;
+# define SWAP(A,B) f = A, A = B, B = -f
+ SWAP(t[0][0], t[0][1]);
+ SWAP(t[1][0], t[1][1]);
+ SWAP(t[2][0], t[2][1]);
+ SWAP(t[3][0], t[3][1]);
+# undef SWAP
+ }
+
+ set_colors_alpha (exterior_color, 1-ratio);
+ glBindTexture (GL_TEXTURE_2D, lc->texids[tex[i + (top_p ? 3 : 0)]]);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ do_normal (p[0][0], p[0][1], p[0][2],
+ p[1][0], p[1][1], p[1][2],
+ p[2][0], p[2][1], p[2][2]);
+ glTexCoord2fv(t[0]); glVertex3fv(p[0]);
+ glTexCoord2fv(t[1]); glVertex3fv(p[1]);
+ glTexCoord2fv(t[2]); glVertex3fv(p[2]);
+ glTexCoord2fv(t[3]); glVertex3fv(p[3]);
+ glEnd();
+ mi->polygon_count++;
+
+ /* The triangles between the quads */
+# if 0
+ /* #### There is a fucking gap between the two black triangles
+ that I can't figure out! So instead of drawing the triangles,
+ we build a black shield around the middle bit in leviathan()
+ and count on back-face culling to have roughly the same effect.
+ */
+ if (!wire)
+ {
+ GLfloat pp[4][3];
+ memcpy (pp, p, sizeof(pp));
+ memcpy (pp[2], pp[1], sizeof(pp[1]));
+ pp[2][0] -= 0.5 * (1-ratio);
+ pp[2][1] -= 0.5 * (1-ratio);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+ set_colors_alpha (black_color, 1-ratio);
+
+ glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ do_normal (pp[0][0], pp[0][1], pp[0][2],
+ pp[2][0], pp[2][1], pp[2][2],
+ pp[1][0], pp[1][1], pp[1][2]);
+ glVertex3fv(pp[0]);
+ glVertex3fv(pp[2]);
+ glVertex3fv(pp[1]);
+ glEnd();
+ mi->polygon_count++;
+ }
+# endif
+
+ glPopMatrix();
+ }
+
+ if (! wire) glDisable (GL_BLEND);
+
+ glPopMatrix();
+}
+
+
+static int
+lament_sphere (ModeInfo *mi, GLfloat ratio)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat size = 3; /* 3" square */
+ int polys = 0;
+ int facets = 16; /* NxN grid on each face */
+ int face;
+ static const GLfloat norms[6][3] = {{ 0, -1, 0 }, { 0, 0, 1 }, { 0, 1, 0 },
+ { 0, 0, -1 }, { -1, 0, 0 }, { 1, 0, 0 }};
+ GLfloat s = 1.0 / facets;
+
+ /* The ratio used for the normals: linger on the square normals. */
+ GLfloat ratio2 = 1 - sin ((1 - ratio) / 2 * M_PI);
+ GLfloat r1 = 1 - ratio2 / 2;
+ GLfloat r2 = ratio2 / 2;
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, -0.5);
+ glScalef (1/size, 1/size, 1/size);
+
+ set_colors (exterior_color);
+
+ for (face = 0; face < 6; face++)
+ {
+ GLfloat x0, y0;
+ for (y0 = 0; y0 < 1; y0 += s)
+ for (x0 = 0; x0 < 1; x0 += s)
+ {
+ int i;
+ GLfloat x1 = x0 + s;
+ GLfloat y1 = y0 + s;
+ GLfloat pa[4][3]; /* verts of the cube */
+ GLfloat pb[4][3]; /* verts of the transition to the sphere */
+ Bool frontp;
+ GLfloat norm[4][3]; /* normals of the transitional verts */
+
+ if (norms[face][0])
+ frontp = norms[face][0] < 0,
+ pa[0][1] = x0, pa[0][2] = y0, pa[0][0] = (frontp ? 0 : 1),
+ pa[1][1] = x1, pa[1][2] = y0, pa[1][0] = pa[0][0],
+ pa[2][1] = x1, pa[2][2] = y1, pa[2][0] = pa[0][0],
+ pa[3][1] = x0, pa[3][2] = y1, pa[3][0] = pa[0][0];
+ else if (norms[face][1])
+ frontp = norms[face][1] > 0,
+ pa[0][0] = x0, pa[0][2] = y0, pa[0][1] = (frontp ? 1 : 0),
+ pa[1][0] = x1, pa[1][2] = y0, pa[1][1] = pa[0][1],
+ pa[2][0] = x1, pa[2][2] = y1, pa[2][1] = pa[0][1],
+ pa[3][0] = x0, pa[3][2] = y1, pa[3][1] = pa[0][1];
+ else /* (norms[face][2]) */
+ frontp = norms[face][2] < 0,
+ pa[0][0] = x0, pa[0][1] = y0, pa[0][2] = (frontp ? 0 : 1),
+ pa[1][0] = x1, pa[1][1] = y0, pa[1][2] = pa[0][2],
+ pa[2][0] = x1, pa[2][1] = y1, pa[2][2] = pa[0][2],
+ pa[3][0] = x0, pa[3][1] = y1, pa[3][2] = pa[0][2];
+
+ for (i = 0; i < countof(pa); i++)
+ pa[i][0] *= size, pa[i][1] *= size, pa[i][2] *= size;
+
+ /* Convert square to sphere by treating as a normalized vector */
+ for (i = 0; i < countof(pa); i++)
+ {
+ GLfloat x = (pa[i][0] / size) - 0.5;
+ GLfloat y = (pa[i][1] / size) - 0.5;
+ GLfloat z = (pa[i][2] / size) - 0.5;
+ GLfloat d = sqrt (x*x + y*y + z*z) / 2;
+ x = x/d + size/2;
+ y = y/d + size/2;
+ z = z/d + size/2;
+
+ pb[i][0] = pa[i][0] + ((x - pa[i][0]) * ratio);
+ pb[i][1] = pa[i][1] + ((y - pa[i][1]) * ratio);
+ pb[i][2] = pa[i][2] + ((z - pa[i][2]) * ratio);
+ }
+
+ /* The normals of an intermediate point are the weighted average
+ of the cube's orthogonal normals, and the sphere's radial
+ normals: early in the sequence, the edges are sharp, but they
+ soften as it expands. */
+ {
+ XYZ na, pa0, pa1, pa2;
+ pa0.x = pa[0][0]; pa0.y = pa[0][1]; pa0.z = pa[0][2];
+ pa1.x = pa[1][0]; pa1.y = pa[1][1]; pa1.z = pa[1][2];
+ pa2.x = pa[2][0]; pa2.y = pa[2][1]; pa2.z = pa[2][2];
+ na = calc_normal (pa0, pa1, pa2);
+
+ for (i = 0; i < countof(pb); i++)
+ {
+ GLfloat d;
+ XYZ nb;
+
+ nb.x = pb[i][0];
+ nb.y = pb[i][1];
+ nb.z = pb[i][2];
+ d = sqrt (nb.x*nb.x + nb.y*nb.y + nb.z*nb.z); /* normalize */
+ nb.x /= d;
+ nb.y /= d;
+ nb.z /= d;
+
+ norm[i][0] = (na.x * r1) + (nb.x * r2); /* weighted */
+ norm[i][1] = (na.y * r1) + (nb.y * r2);
+ norm[i][2] = (na.z * r1) + (nb.z * r2);
+ }
+ }
+
+ if (! wire)
+ glBindTexture (GL_TEXTURE_2D, lc->texids[face]);
+
+ glFrontFace (frontp ? GL_CW : GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ texturize_vert (mi, face+1, pa[0]);
+ glNormal3fv (norm[0]);
+ glVertex3fv (pb[0]);
+
+ texturize_vert (mi, face+1, pa[1]);
+ glNormal3fv (norm[1]);
+ glVertex3fv (pb[1]);
+
+ texturize_vert (mi, face+1, pa[2]);
+ glNormal3fv (norm[2]);
+ glVertex3fv (pb[2]);
+
+ texturize_vert (mi, face+1, pa[3]);
+ glNormal3fv (norm[3]);
+ glVertex3fv (pb[3]);
+
+ glEnd();
+ polys++;
+ }
+ }
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static void
+draw (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ mi->polygon_count = 0;
+
+ if (!wire)
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ else
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glPushMatrix();
+
+ gltrackball_rotate (lc->trackball);
+
+ /* Make into the screen be +Y, right be +X, and up be +Z. */
+ glRotatef (-90.0, 1.0, 0.0, 0.0);
+
+ scale_for_window (mi);
+
+ /* Apply rotation to the object. */
+ if (lc->type != LAMENT_LID_ZOOM)
+ get_rotation (lc->rot, &lc->rotx, &lc->roty, &lc->rotz,
+ !lc->button_down_p);
+# ifdef DEBUG_MODE
+ lc->rotx = 0.18;
+ lc->roty = 0.22;
+ lc->rotx = lc->roty = 0;
+ lc->rotz = 0;
+# endif
+
+ glRotatef (lc->rotx * 360, 1, 0, 0);
+ glRotatef (lc->roty * 360, 0, 1, 0);
+ glRotatef (lc->rotz * 360, 0, 0, 1);
+
+ glScalef (0.5, 0.5, 0.5);
+
+ switch (lc->type)
+ {
+ case LAMENT_BOX:
+ glCallList (lc->dlists[OBJ_BOX]);
+ mi->polygon_count += lc->polys[OBJ_BOX];
+ break;
+
+ case LAMENT_STAR_OUT:
+ case LAMENT_STAR_ROT:
+ case LAMENT_STAR_ROT_IN:
+ case LAMENT_STAR_ROT_OUT:
+ case LAMENT_STAR_UNROT:
+ case LAMENT_STAR_IN:
+ glTranslatef (0.0, 0.0, lc->anim_z/2);
+ glRotatef (lc->anim_r/2, 0.0, 0.0, 1.0);
+ glCallList (lc->dlists[OBJ_STAR_U]);
+ mi->polygon_count += lc->polys[OBJ_STAR_U];
+
+ glTranslatef (0.0, 0.0, -lc->anim_z);
+ glRotatef (-lc->anim_r, 0.0, 0.0, 1.0);
+ glCallList (lc->dlists[OBJ_STAR_D]);
+ mi->polygon_count += lc->polys[OBJ_STAR_D];
+ break;
+
+ case LAMENT_TETRA_UNE:
+ case LAMENT_TETRA_USW:
+ case LAMENT_TETRA_DWN:
+ case LAMENT_TETRA_DSE:
+ {
+ int magic;
+ GLfloat x, y, z;
+ switch (lc->type) {
+ case LAMENT_TETRA_UNE: magic = OBJ_TETRA_UNE; x= 1; y= 1; z= 1; break;
+ case LAMENT_TETRA_USW: magic = OBJ_TETRA_USW; x= 1; y= 1; z=-1; break;
+ case LAMENT_TETRA_DWN: magic = OBJ_TETRA_DWN; x= 1; y=-1; z= 1; break;
+ case LAMENT_TETRA_DSE: magic = OBJ_TETRA_DSE; x=-1; y= 1; z= 1; break;
+ default: abort(); break;
+ }
+ glCallList(lc->dlists[OBJ_TETRA_BASE]);
+ mi->polygon_count += lc->polys[OBJ_TETRA_BASE];
+ if (magic != OBJ_TETRA_UNE) glCallList (lc->dlists[OBJ_TETRA_UNE]);
+ if (magic != OBJ_TETRA_USW) glCallList (lc->dlists[OBJ_TETRA_USW]);
+ if (magic != OBJ_TETRA_DWN) glCallList (lc->dlists[OBJ_TETRA_DWN]);
+ if (magic != OBJ_TETRA_DSE) glCallList (lc->dlists[OBJ_TETRA_DSE]);
+ glRotatef (lc->anim_r, x, y, z);
+ glCallList (lc->dlists[magic]);
+ mi->polygon_count += lc->polys[magic] * 3;
+ }
+ break;
+
+ case LAMENT_LID_OPEN:
+ case LAMENT_LID_CLOSE:
+ case LAMENT_LID_ZOOM:
+ {
+ GLfloat d = 0.21582;
+ int i;
+ const int lists[4] = { OBJ_LID_A, OBJ_LID_B, OBJ_LID_C, OBJ_LID_D };
+
+ lc->facing_p = facing_screen_p (mi);
+
+ if (lc->anim_z < 0.5)
+ glTranslatef (0, -30 * lc->anim_z, 0); /* zoom */
+ else
+ glTranslatef (8 * (0.5 - (lc->anim_z - 0.5)), 0, 0);
+
+ glCallList (lc->dlists[OBJ_LID_BASE]);
+ mi->polygon_count += lc->polys[OBJ_LID_BASE];
+ for (i = 0; i < countof(lists); i++)
+ {
+ glPushMatrix();
+ glRotatef (90 * i, 0, 1, 0);
+ glTranslatef (-d, -0.5, d);
+ glRotatef (-45, 0, 1, 0);
+ glRotatef (-lc->anim_r, 1, 0, 0);
+ glRotatef (45, 0, 1, 0);
+ glTranslatef (d, 0.5, -d);
+ glRotatef (-90 * i, 0, 1, 0);
+ glCallList (lc->dlists[lists[i]]);
+ mi->polygon_count += lc->polys[lists[i]];
+ glPopMatrix();
+ }
+
+# ifdef DEBUG_MODE
+ if (lc->facing_p)
+ {
+ glColor3f(1, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-0.49, 0.49, -0.49);
+ glVertex3f ( 0.49, 0.49, -0.49);
+ glVertex3f ( 0.49, 0.49, 0.49);
+ glVertex3f (-0.49, 0.49, 0.49);
+ glEnd();
+ mi->polygon_count++;
+ }
+# endif /* DEBUG_MODE */
+ }
+ break;
+
+ case LAMENT_TASER_OUT:
+ case LAMENT_TASER_SLIDE:
+ case LAMENT_TASER_SLIDE_IN:
+ case LAMENT_TASER_IN:
+
+ glTranslatef (0, -lc->anim_z/2, 0);
+ glCallList (lc->dlists[OBJ_TASER_BASE]);
+ mi->polygon_count += lc->polys[OBJ_TASER_BASE];
+
+ glTranslatef (0, lc->anim_z, 0);
+ glCallList (lc->dlists[OBJ_TASER_A]);
+ mi->polygon_count += lc->polys[OBJ_TASER_A];
+
+ glTranslatef (lc->anim_y, 0, 0);
+ glCallList (lc->dlists[OBJ_TASER_B]);
+ mi->polygon_count += lc->polys[OBJ_TASER_B];
+ break;
+
+ case LAMENT_PILLAR_OUT:
+ case LAMENT_PILLAR_SPIN:
+ case LAMENT_PILLAR_IN:
+
+ glCallList (lc->dlists[OBJ_PILLAR_BASE]);
+ mi->polygon_count += lc->polys[OBJ_PILLAR_BASE];
+
+ glPushMatrix();
+ if (lc->anim_z == 1 || lc->anim_z == 3)
+ {
+ glRotatef (lc->anim_r, 0, 0, 1);
+ glTranslatef (0, 0, lc->anim_y);
+ }
+ glCallList (lc->dlists[OBJ_PILLAR_A]);
+ mi->polygon_count += lc->polys[OBJ_PILLAR_A];
+ glPopMatrix();
+
+ glPushMatrix();
+ if (lc->anim_z == 2 || lc->anim_z == 3)
+ {
+ glRotatef (lc->anim_r, 0, 0, 1);
+ glTranslatef (0, 0, -lc->anim_y);
+ }
+ glCallList (lc->dlists[OBJ_PILLAR_B]);
+ mi->polygon_count += lc->polys[OBJ_PILLAR_B];
+ glPopMatrix();
+ break;
+
+ case LAMENT_SPHERE_OUT:
+ case LAMENT_SPHERE_IN:
+ mi->polygon_count += lament_sphere (mi, lc->anim_y);
+ break;
+
+ case LAMENT_LEVIATHAN_SPIN:
+ case LAMENT_LEVIATHAN_UNSPIN:
+ case LAMENT_LEVIATHAN_FADE:
+ case LAMENT_LEVIATHAN_UNFADE:
+ case LAMENT_LEVIATHAN_TWIST:
+ case LAMENT_LEVIATHAN_UNTWIST:
+ {
+ /* These normals are hard to compute, so I pulled them from the
+ model. */
+ const GLfloat axes[6][4] =
+ {{ OBJ_ISO_UNE, 0.633994, 0.442836, 0.633994 },
+ { OBJ_ISO_USW, 0.442836, 0.633994, -0.633994 },
+ { OBJ_ISO_DSE, -0.633994, 0.633994, 0.442836 },
+ { OBJ_ISO_SWD, -0.633994, -0.442836, -0.633994 },
+ { OBJ_ISO_DEN, -0.442836, -0.633994, 0.633994 },
+ { OBJ_ISO_UNW, 0.633994, -0.633994, -0.442836 }};
+ int i;
+
+ GLfloat s = (1 - lc->anim_z);
+ GLfloat s2 = MAX (0, 360 - lc->anim_r) / 360.0;
+ Bool blendp = 0;
+
+ switch (lc->type) {
+ case LAMENT_LEVIATHAN_SPIN: break;
+ case LAMENT_LEVIATHAN_UNSPIN: s2 = 1 - s2; break;
+ default: s2 = 0; blendp = 1; break;
+ }
+
+ if (wire) blendp = 0;
+
+ s = (s * 0.6) + 0.4;
+
+ leviathan (mi, 1 - s2, 1, True);
+ glCallList (lc->dlists[OBJ_ISO_BASE_A]);
+ mi->polygon_count += lc->polys[OBJ_ISO_BASE_A];
+
+ glPushMatrix();
+ glScalef (s2, s2, s2);
+ glCallList (lc->dlists[OBJ_ISO_USE]);
+ mi->polygon_count += lc->polys[OBJ_ISO_USE];
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (lc->anim_y, 1, -1, 1);
+ glCallList (lc->dlists[OBJ_ISO_BASE_B]);
+ mi->polygon_count += lc->polys[OBJ_ISO_BASE_B];
+ leviathan (mi, 1 - s2, 1, False);
+ glPopMatrix();
+
+ if (blendp)
+ {
+# ifndef HAVE_JWZGLES /* no glBlendColor */
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_CONSTANT_ALPHA, GL_SRC_ALPHA);
+ glBlendColor (1, 1, 1, MAX(0, 1-(lc->anim_z * 3)));
+# endif
+ }
+
+ for (i = 0; i < countof(axes); i++)
+ {
+ glPushMatrix();
+ glRotatef (lc->anim_r, axes[i][1], axes[i][2], axes[i][3]);
+ glScalef (s, s, s);
+ glCallList (lc->dlists[(int) axes[i][0]]);
+ mi->polygon_count += lc->polys[(int) axes[i][0]];
+ glPopMatrix();
+ if (i == 2)
+ glRotatef (lc->anim_y, 1, -1, 1);
+ }
+
+ if (blendp) glDisable (GL_BLEND);
+
+ glPushMatrix();
+ glScalef (s2, s2, s2);
+ glCallList (lc->dlists[OBJ_ISO_DWN]);
+ mi->polygon_count += lc->polys[OBJ_ISO_DWN];
+ glPopMatrix();
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_COLLAPSE:
+ case LAMENT_LEVIATHAN_EXPAND:
+ {
+ glPushMatrix();
+ leviathan (mi, 1, lc->anim_y, True);
+ glRotatef (180, 1, -1, 1);
+ leviathan (mi, 1, lc->anim_y, False);
+ glPopMatrix();
+ folding_walls (mi, lc->anim_y, True);
+ folding_walls (mi, lc->anim_y, False);
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ glPopMatrix();
+}
+
+
+/* Rather than just picking states randomly, pick an ordering randomly, do it,
+ and then re-randomize. That way one can be assured of seeing all states in
+ a short time period, though not always in the same order (it's frustrating
+ to see it pick the same state 5x in a row.) Though, that can still happen,
+ since states are in the list multiple times as a way of giving them
+ probabilities.
+ */
+static void
+shuffle_states (lament_configuration *lc)
+{
+ int i;
+ for (i = 0; i < lc->nstates; i++)
+ {
+ int a = random() % lc->nstates;
+ lament_type swap = lc->states[a];
+ lc->states[a] = lc->states[i];
+ lc->states[i] = swap;
+ }
+}
+
+
+static void
+animate (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ int pause = 10;
+ int pause2 = 120;
+ GLfloat speed = (lc->ffwdp ? 20 : 1);
+
+ switch (lc->type)
+ {
+ case LAMENT_BOX:
+ {
+ lc->state++;
+ if (lc->state >= lc->nstates)
+ {
+ shuffle_states (lc);
+ lc->state = 0;
+ }
+ lc->type = lc->states[lc->state];
+
+ if (lc->type == LAMENT_BOX)
+ lc->anim_pause = pause2;
+
+ lc->anim_r = 0.0;
+ lc->anim_y = 0.0;
+ lc->anim_z = 0.0;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_STAR_OUT:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z >= 1.0)
+ {
+ lc->anim_z = 1.0;
+ lc->type = LAMENT_STAR_ROT;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_ROT:
+ lc->anim_r += 1.0 * speed;
+ if (lc->anim_r >= 45.0)
+ {
+ lc->anim_r = 45.0;
+ lc->type = LAMENT_STAR_ROT_IN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_ROT_IN:
+ lc->anim_z -= 0.01 * speed;
+ if (lc->anim_z <= 0.0)
+ {
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_STAR_ROT_OUT;
+ lc->anim_pause = pause2 * (1 + frand(2) + frand(2));
+ }
+ break;
+
+ case LAMENT_STAR_ROT_OUT:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z >= 1.0)
+ {
+ lc->anim_z = 1.0;
+ lc->type = LAMENT_STAR_UNROT;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_UNROT:
+ lc->anim_r -= 1.0 * speed;
+ if (lc->anim_r <= 0.0)
+ {
+ lc->anim_r = 0.0;
+ lc->type = LAMENT_STAR_IN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_IN:
+ lc->anim_z -= 0.01 * speed;
+ if (lc->anim_z <= 0.0)
+ {
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_TETRA_UNE:
+ case LAMENT_TETRA_USW:
+ case LAMENT_TETRA_DWN:
+ case LAMENT_TETRA_DSE:
+
+ lc->anim_r += 1.0 * speed;
+ if (lc->anim_r >= 360.0)
+ {
+ lc->anim_r = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ else if (lc->anim_r > 119.0 && lc->anim_r <= 120.0)
+ {
+ lc->anim_r = 120.0;
+ lc->anim_pause = pause;
+ }
+ else if (lc->anim_r > 239.0 && lc->anim_r <= 240.0)
+ {
+ lc->anim_r = 240.0;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_LID_OPEN:
+ lc->anim_r += 1.0 * speed;
+
+ if (lc->anim_r >= 112.0)
+ {
+ lc->anim_r = 112.0;
+ lc->anim_z = 0.0;
+ lc->anim_pause = pause2;
+ lc->type = (lc->facing_p ? LAMENT_LID_ZOOM : LAMENT_LID_CLOSE);
+ }
+ break;
+
+ case LAMENT_LID_CLOSE:
+ lc->anim_r -= 1.0 * speed;
+ if (lc->anim_r <= 0.0)
+ {
+ lc->anim_r = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ case LAMENT_LID_ZOOM:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z > 1.0)
+ {
+ lc->anim_r = 0.0;
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_BOX;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_TASER_OUT:
+ lc->anim_z += 0.005 * speed;
+ if (lc->anim_z >= 0.5)
+ {
+ lc->anim_z = 0.5;
+ lc->type = LAMENT_TASER_SLIDE;
+ lc->anim_pause = pause * (1 + frand(5) + frand(5));
+ }
+ break;
+
+ case LAMENT_TASER_SLIDE:
+ lc->anim_y += 0.005 * speed;
+ if (lc->anim_y >= 0.255)
+ {
+ lc->anim_y = 0.255;
+ lc->type = LAMENT_TASER_SLIDE_IN;
+ lc->anim_pause = pause2 * (1 + frand(5) + frand(5));
+ }
+ break;
+
+ case LAMENT_TASER_SLIDE_IN:
+ lc->anim_y -= 0.0025 * speed;
+ if (lc->anim_y <= 0.0)
+ {
+ lc->anim_y = 0.0;
+ lc->type = LAMENT_TASER_IN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_TASER_IN:
+ lc->anim_z -= 0.0025 * speed;
+ if (lc->anim_z <= 0.0)
+ {
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_PILLAR_OUT:
+
+ if (lc->anim_y == 0) /* mostly in */
+ lc->anim_y += 0.005 * ((random() % 5) ? -1 : 1) * speed;
+ else if (lc->anim_y > 0)
+ lc->anim_y += 0.005 * speed;
+ else
+ lc->anim_y -= 0.001 * speed;
+
+ if (lc->anim_z == 0)
+ {
+ int i = (random() % 7); /* A, B or both */
+ if (i == 0) lc->anim_z = 3;
+ else if (i < 5) lc->anim_z = 2;
+ else lc->anim_z = 1;
+
+ /* We can do quarter turns, because it's radially symmetrical. */
+ lc->anim_r = 90.0 * (1 + frand(6)) * RANDSIGN();
+ }
+ if (lc->anim_y > 0.4)
+ {
+ lc->anim_y = 0.4;
+ lc->type = LAMENT_PILLAR_SPIN;
+ lc->anim_pause = pause;
+ }
+ else if (lc->anim_y < -0.03)
+ {
+ lc->anim_y = -0.03;
+ lc->type = LAMENT_PILLAR_SPIN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_PILLAR_SPIN:
+ {
+ Bool negp = (lc->anim_r < 0);
+ lc->anim_r += (negp ? 1 : -1) * speed;
+ if (negp ? lc->anim_r > 0 : lc->anim_r < 0)
+ {
+ lc->anim_r = 0;
+ lc->type = LAMENT_PILLAR_IN;
+ }
+ }
+ break;
+
+ case LAMENT_PILLAR_IN:
+ {
+ Bool negp = (lc->anim_y < 0);
+ lc->anim_y += (negp ? 1 : -1) * 0.005 * speed;
+ if (negp ? lc->anim_y > 0 : lc->anim_y < 0)
+ {
+ lc->anim_y = 0;
+ lc->anim_z = 0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause;
+ }
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_SPHERE_OUT:
+ {
+ lc->anim_y += 0.01 * speed;
+ if (lc->anim_y >= 1)
+ {
+ lc->anim_y = 1;
+ lc->type = LAMENT_SPHERE_IN;
+ lc->anim_pause = pause2 * (1 + frand(1) + frand(1));
+ }
+ }
+ break;
+
+ case LAMENT_SPHERE_IN:
+ {
+ lc->anim_y -= 0.01 * speed;
+ if (lc->anim_y <= 0)
+ {
+ lc->anim_y = 0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause;
+ }
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_LEVIATHAN_SPIN:
+ lc->anim_r += 3.5 * speed;
+ if (lc->anim_r >= 360 * 3)
+ {
+ lc->anim_r = 0;
+ lc->type = LAMENT_LEVIATHAN_FADE;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_FADE:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z >= 1)
+ {
+ lc->anim_z = 1;
+ lc->type = LAMENT_LEVIATHAN_TWIST;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_TWIST:
+ lc->anim_y += 2 * speed;
+ lc->anim_z = 1;
+ if (lc->anim_y >= 180)
+ {
+ lc->anim_y = 0;
+ lc->type = LAMENT_LEVIATHAN_COLLAPSE;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_COLLAPSE:
+ lc->anim_y += 0.01 * speed;
+ if (lc->anim_y >= 1)
+ {
+ lc->anim_y = 1.0;
+ lc->type = LAMENT_LEVIATHAN_EXPAND;
+ lc->anim_pause = pause2 * 4;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_EXPAND:
+ lc->anim_y -= 0.005 * speed;
+ if (lc->anim_y <= 0)
+ {
+ lc->anim_y = 180;
+ lc->type = LAMENT_LEVIATHAN_UNTWIST;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_UNTWIST:
+ lc->anim_y -= 2 * speed;
+ lc->anim_z = 1;
+ if (lc->anim_y <= 0)
+ {
+ lc->anim_y = 0;
+ lc->type = LAMENT_LEVIATHAN_UNFADE;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_UNFADE:
+ lc->anim_z -= 0.1 * speed;
+ if (lc->anim_z <= 0)
+ {
+ lc->anim_z = 0;
+ lc->type = LAMENT_LEVIATHAN_UNSPIN;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_UNSPIN:
+ lc->anim_r += 3.5 * speed;
+ if (lc->anim_r >= 360 * 2)
+ {
+ lc->anim_r = 0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+# ifdef DEBUG_MODE
+
+ lc->anim_pause = 0;
+
+ if (lc->type == LAMENT_BOX)
+ lc->type = DEBUG_MODE;
+
+ if (lc->ffwdp)
+ {
+ lc->ffwdp = 0;
+ while (lc->type != DEBUG_MODE)
+ animate (mi);
+ }
+
+# else /* !DEBUG_MODE */
+
+ if (lc->ffwdp && lc->type == LAMENT_BOX)
+ {
+ lc->ffwdp = 0;
+ while (lc->type == LAMENT_BOX)
+ animate (mi);
+ lc->anim_pause = 0;
+ }
+
+# endif /* !DEBUG_MODE */
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ if (wire)
+ do_texture = False;
+
+ if (!wire)
+ {
+ static const GLfloat pos0[] = { -4.0, 2.0, 5.0, 1.0 };
+ static const GLfloat pos1[] = { 6.0, -1.0, 3.0, 1.0 };
+
+ static const GLfloat amb0[] = { 0.7, 0.7, 0.7, 1.0 };
+/* static const GLfloat amb1[] = { 0.7, 0.0, 0.0, 1.0 }; */
+ static const GLfloat dif0[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat dif1[] = { 0.3, 0.1, 0.1, 1.0 };
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
+/* glLightfv(GL_LIGHT1, GL_AMBIENT, amb1); */
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+/* glEnable(GL_LIGHT1); */
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ }
+
+ if (do_texture)
+ {
+ int i;
+ for (i = 0; i < countof(lc->texids); i++)
+ glGenTextures(1, &lc->texids[i]);
+
+ lc->texture = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ lament512_png, sizeof(lament512_png));
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ /* messes up -fps */
+ /* glPixelStorei(GL_UNPACK_ROW_LENGTH, lc->texture->width); */
+
+ for (i = 0; i < countof(lc->texids); i++)
+ {
+ int height = lc->texture->width; /* assume square */
+ glBindTexture(GL_TEXTURE_2D, lc->texids[i]);
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ lc->texture->width, height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ (lc->texture->data +
+ (lc->texture->bytes_per_line * height * i)));
+ check_gl_error("texture");
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ check_gl_error("texture");
+
+ /* This makes scaled pixmaps tolerable to look at. */
+# if !defined(GL_TEXTURE_LOD_BIAS) && defined(GL_TEXTURE_LOD_BIAS_EXT)
+# define GL_TEXTURE_LOD_BIAS GL_TEXTURE_LOD_BIAS_EXT
+# endif
+# ifdef GL_TEXTURE_LOD_BIAS
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.25);
+# endif
+ clear_gl_error(); /* invalid enum on iPad 3 */
+ }
+ }
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ GLfloat s = 1/3.0; /* box is 3" square */
+ const struct gllist *L = *all_objs[i];
+ const GLfloat *f = (const GLfloat *) L->data;
+ int j;
+
+ lc->dlists[i] = glGenLists(1);
+ lc->polys[i] = L->points / 3;
+ glNewList(lc->dlists[i], GL_COMPILE);
+ if (L->primitive != GL_TRIANGLES) abort();
+ if (L->format != GL_N3F_V3F) abort();
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, -0.5);
+ glScalef (s, s, s);
+
+ for (j = 0; j < L->points; j += 3)
+ {
+ int face, outerp;
+ Bool blackp = (i == OBJ_ISO_BASE_A || i == OBJ_ISO_BASE_B);
+ which_face (mi, f, &face, &outerp); /* from norm of first vert */
+
+ set_colors (outerp ? exterior_color :
+ blackp ? black_color : interior_color);
+ glBindTexture (GL_TEXTURE_2D,
+ (outerp ? lc->texids[face-1] :
+ blackp ? 0 : lc->texids[6]));
+
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ if (face) texturize_vert (mi, face, f+3);
+ glNormal3fv (f); f += 3; glVertex3fv (f); f += 3;
+ if (face) texturize_vert (mi, face, f+3);
+ glNormal3fv (f); f += 3; glVertex3fv (f); f += 3;
+ if (face) texturize_vert (mi, face, f+3);
+ glNormal3fv (f); f += 3; glVertex3fv (f); f += 3;
+ glEnd();
+ }
+ glPopMatrix();
+
+ glEndList();
+ }
+}
+
+
+ENTRYPOINT Bool
+lament_handle_event (ModeInfo *mi, XEvent *event)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, lc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &lc->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ lc->ffwdp = True;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+reshape_lament (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ glViewport(0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+init_lament (ModeInfo *mi)
+{
+ lament_configuration *lc;
+ int i;
+ MI_INIT (mi, lcs);
+
+ lc = &lcs[MI_SCREEN(mi)];
+
+ {
+ double rot_speed = 0.5;
+ lc->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+ lc->trackball = gltrackball_init (True);
+ }
+
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = 300 + (random() % 100);
+
+ if ((lc->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_lament(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ gl_init(mi);
+ }
+
+ lc->states = (lament_type *) calloc (200, sizeof (*lc->states));
+ lc->nstates = 0;
+
+# define PUSH(N,WHICH) \
+ for (i = 0; i < N; i++) lc->states[lc->nstates++] = WHICH
+
+ PUSH (4, LAMENT_TETRA_UNE); /* most common */
+ PUSH (4, LAMENT_TETRA_USW);
+ PUSH (4, LAMENT_TETRA_DWN);
+ PUSH (4, LAMENT_TETRA_DSE);
+
+ PUSH (8, LAMENT_STAR_OUT); /* pretty common */
+ PUSH (8, LAMENT_TASER_OUT);
+ PUSH (8, LAMENT_PILLAR_OUT);
+
+ PUSH (4, LAMENT_LID_OPEN); /* rare */
+ PUSH (2, LAMENT_SPHERE_OUT); /* rare */
+ PUSH (1, LAMENT_LEVIATHAN_SPIN); /* very rare */
+
+ PUSH (35, LAMENT_BOX); /* rest state */
+# undef PUSH
+
+ shuffle_states (lc);
+
+# ifdef DEBUG_MODE
+ lc->type = DEBUG_MODE;
+ lc->anim_pause = 0;
+# endif
+
+}
+
+
+ENTRYPOINT void
+draw_lament (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!lc->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+
+ glXMakeCurrent(dpy, window, *(lc->glx_context));
+ draw(mi);
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers(dpy, window);
+
+ if (!lc->ffwdp && lc->anim_pause)
+ lc->anim_pause--;
+ else
+ animate(mi);
+}
+
+XSCREENSAVER_MODULE ("Lament", lament)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/lament.dxf b/hacks/glx/lament.dxf
new file mode 100644
index 0000000..d23108c
--- /dev/null
+++ b/hacks/glx/lament.dxf
@@ -0,0 +1,163404 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.205
+13
+3.0
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+3.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+3.0
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.0
+21
+3.0
+31
+3.0
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+0.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.795
+20
+0.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+1.5
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+3.0
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+3.0
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.795
+20
+3.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+0.0
+30
+0.0
+11
+2.795
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+1.5
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+1.5
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+2.795
+21
+0.0
+31
+1.5
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+3.0
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+1.5
+20
+0.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+3.0
+21
+3.0
+31
+0.0
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+3.0
+21
+3.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+LINE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+1.5
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+1.5
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+1.5
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.26629223953759
+21
+1.42452680194624
+31
+3.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+3.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.73
+21
+1.5
+31
+3.0
+12
+0.733707760462408
+22
+1.57547319805376
+32
+3.0
+13
+0.733707760462408
+23
+1.57547319805376
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98848282880601
+21
+0.904781950910693
+31
+3.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+3.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.904781950910692
+22
+1.01151717119399
+32
+3.0
+13
+0.904781950910692
+23
+1.01151717119399
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+3.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+3.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.09521804908931
+21
+1.98848282880601
+31
+3.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+3.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.205
+22
+3.0
+32
+3.0
+13
+0.205
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.17367965644036
+11
+2.12132034355964
+21
+0.0
+31
+0.826320343559644
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+0.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+0.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.2368440585138
+21
+1.27648079851406
+31
+0.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+0.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+-4.44089209850063e-16
+22
+0.878679656440356
+32
+3.0
+13
+-4.44089209850063e-16
+23
+0.878679656440356
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+-4.44089209850063e-16
+21
+0.878679656440356
+31
+3.0
+12
+0.0
+22
+0.878679656440356
+32
+0.0
+13
+0.0
+23
+0.878679656440356
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+3.0
+12
+1.01151717119399
+22
+2.09521804908931
+32
+3.0
+13
+1.01151717119399
+23
+2.09521804908931
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01151717119399
+21
+2.09521804908931
+31
+3.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+3.0
+11
+1.34978045204758
+21
+0.744795334089513
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.42452680194624
+22
+0.733707760462408
+32
+3.0
+13
+1.42452680194624
+23
+0.733707760462408
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440356
+32
+0.0
+13
+0.0
+23
+0.878679656440356
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+0.0
+12
+0.820920626451767
+22
+1.13702451264398
+32
+0.0
+13
+0.820920626451767
+23
+1.13702451264398
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.820920626451767
+21
+1.13702451264398
+31
+0.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+0.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+0.85976839852704
+30
+3.0
+11
+1.01151717119399
+21
+0.904781950910692
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+1.5
+11
+1.07221092057491
+21
+0.85976839852704
+31
+3.0
+12
+1.01151717119399
+22
+0.904781950910692
+32
+3.0
+13
+1.01151717119399
+23
+0.904781950910692
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17907937354823
+21
+1.86297548735602
+31
+0.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+0.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+0.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.27
+32
+0.0
+13
+1.5
+23
+2.27
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+0.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.26629223953759
+21
+1.42452680194624
+31
+0.0
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+0.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+0.0
+13
+2.27
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+0.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+0.0
+11
+2.2368440585138
+21
+1.27648079851406
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+0.0
+13
+2.2368440585138
+23
+1.27648079851406
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+2.795
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.795
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+0.0
+33
+2.17367965644036
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.17367965644036
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+0.826320343559644
+13
+2.12132034355964
+23
+0.0
+33
+0.826320343559644
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.826320343559644
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+0.205
+13
+2.12132034355964
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.205
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+0.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+0.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+1.5
+12
+1.01151717119399
+22
+0.904781950910692
+32
+1.5
+13
+1.01151717119399
+23
+0.904781950910692
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910692
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.13702451264398
+30
+1.5
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.17907937354823
+21
+1.13702451264398
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+3.0
+13
+2.17907937354823
+23
+1.13702451264398
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+0.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.205
+13
+2.12132034355964
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.826320343559643
+13
+2.12132034355964
+23
+3.0
+33
+0.826320343559643
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559643
+12
+2.12132034355964
+22
+3.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+2.09521804908931
+21
+1.98848282880601
+31
+0.0
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+0.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+0.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.20533375707888
+21
+2.21138724003369
+31
+3.0
+12
+1.27648079851406
+22
+2.2368440585138
+32
+3.0
+13
+1.27648079851406
+23
+2.2368440585138
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.2368440585138
+21
+1.72351920148594
+31
+3.0
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.72351920148594
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+0.73
+31
+1.5
+12
+1.57547319805376
+22
+0.733707760462408
+32
+1.5
+13
+1.57547319805376
+23
+0.733707760462408
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+1.5
+11
+1.57547319805376
+21
+0.733707760462408
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+0.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+1.5
+11
+2.14023160147296
+21
+1.92778907942509
+31
+0.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+0.0
+11
+2.09521804908931
+21
+1.98848282880601
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+0.0
+13
+2.09521804908931
+23
+1.98848282880601
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+1.5
+11
+2.26629223953759
+21
+1.57547319805376
+31
+3.0
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.57547319805376
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+0.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+0.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+0.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+1.5
+12
+1.27648079851406
+22
+0.763155941486199
+32
+1.5
+13
+1.27648079851406
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+2.25520466591049
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+0.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+0.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+0.0
+11
+1.65021954795242
+21
+2.25520466591049
+31
+1.5
+12
+1.57547319805376
+22
+2.26629223953759
+32
+1.5
+13
+1.57547319805376
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+1.5
+11
+1.65021954795242
+21
+2.25520466591049
+31
+0.0
+12
+1.72351920148594
+22
+2.2368440585138
+32
+0.0
+13
+1.72351920148594
+23
+2.2368440585138
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+2.25520466591049
+30
+0.0
+11
+1.72351920148594
+21
+2.2368440585138
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+2.27
+31
+0.0
+12
+1.57547319805376
+22
+2.26629223953759
+32
+0.0
+13
+1.57547319805376
+23
+2.26629223953759
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+0.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+0.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+0.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+1.5
+11
+0.904781950910692
+21
+1.01151717119399
+31
+0.0
+12
+0.904781950910692
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910692
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+1.5
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.820920626451767
+22
+1.86297548735602
+32
+1.5
+13
+0.820920626451767
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+-2.22044604925031e-16
+22
+2.12132034355964
+32
+3.0
+13
+-2.22044604925031e-16
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+-2.22044604925031e-16
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72351920148594
+21
+2.2368440585138
+31
+0.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+0.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+0.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+0.0
+11
+2.12132034355964
+21
+0.0
+31
+0.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+0.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.86297548735602
+21
+0.820920626451767
+31
+0.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+0.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+0.0
+12
+2.50226795687895
+22
+0.0
+32
+0.0
+13
+2.50226795687895
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+-4.44089209850063e-16
+20
+0.878679656440356
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+0.0
+12
+0.0
+22
+0.878679656440356
+32
+0.0
+13
+0.0
+23
+0.878679656440356
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+0.0
+11
+-4.44089209850063e-16
+21
+0.878679656440356
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+-4.44089209850063e-16
+21
+0.878679656440356
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.73
+22
+1.5
+32
+0.0
+13
+0.73
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.73
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.73
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+0.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+0.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+0.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.205
+13
+0.878679656440356
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+3.0
+33
+0.826320343559644
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.826320343559644
+12
+0.878679656440356
+22
+3.0
+32
+2.17367965644036
+13
+0.878679656440356
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+2.17367965644036
+12
+0.878679656440356
+22
+3.0
+32
+2.795
+13
+0.878679656440356
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+3.0
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.5
+12
+0.904781950910692
+22
+1.98848282880601
+32
+3.0
+13
+0.904781950910692
+23
+1.98848282880601
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.98848282880601
+30
+1.5
+11
+0.955527778486358
+21
+2.04447222151364
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+3.0
+11
+0.744795334089513
+21
+1.34978045204758
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.34978045204758
+30
+1.5
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.733707760462408
+22
+1.42452680194624
+32
+1.5
+13
+0.733707760462408
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+1.5
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+0.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.09521804908931
+21
+1.98848282880601
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.14023160147296
+21
+1.92778907942509
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+0.763155941486199
+30
+3.0
+11
+1.65021954795242
+21
+0.744795334089513
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+1.5
+11
+1.72351920148594
+21
+0.763155941486199
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+0.0
+11
+0.85976839852704
+21
+1.07221092057491
+31
+1.5
+12
+0.85976839852704
+22
+1.07221092057491
+32
+0.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+1.5
+11
+0.820920626451767
+21
+1.13702451264398
+31
+0.0
+12
+0.820920626451767
+22
+1.13702451264398
+32
+1.5
+13
+0.820920626451767
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+1.5
+11
+2.09521804908931
+21
+1.01151717119399
+31
+3.0
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.01151717119399
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.07221092057491
+21
+2.14023160147296
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.13702451264398
+22
+2.17907937354823
+32
+0.0
+13
+1.13702451264398
+23
+2.17907937354823
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+0.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.878679656440357
+21
+1.53956708492942e-17
+31
+0.826320343559643
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+1.53956708492942e-17
+30
+0.826320343559643
+11
+1.5
+21
+0.0
+31
+2.795
+12
+0.878679656440357
+22
+4.01154803819637e-17
+32
+2.17367965644036
+13
+0.878679656440357
+23
+4.01154803819637e-17
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+1.5
+11
+2.25520466591049
+21
+1.34978045204758
+31
+0.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+0.0
+11
+2.26629223953759
+21
+1.42452680194624
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+0.0
+13
+2.26629223953759
+23
+1.42452680194624
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.72351920148594
+30
+1.5
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.2368440585138
+21
+1.72351920148594
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+3.0
+13
+2.2368440585138
+23
+1.72351920148594
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+3.0
+11
+1.34978045204758
+21
+2.25520466591049
+31
+1.5
+12
+1.27648079851406
+22
+2.2368440585138
+32
+1.5
+13
+1.27648079851406
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+2.25520466591049
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.17907937354823
+21
+1.13702451264398
+31
+3.0
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.13702451264398
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+2.09521804908931
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+1.5
+13
+1.98848282880601
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.98848282880601
+21
+2.09521804908931
+31
+3.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.0
+12
+2.27
+22
+1.5
+32
+0.0
+13
+2.27
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.5
+30
+0.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.5
+30
+3.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+0.0
+11
+0.73
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+0.0
+13
+0.73
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.57547319805376
+31
+0.0
+12
+0.733707760462408
+22
+1.57547319805376
+32
+1.5
+13
+0.733707760462408
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.92778907942509
+30
+3.0
+11
+0.820920626451767
+21
+1.86297548735602
+31
+1.5
+12
+0.820920626451767
+22
+1.86297548735602
+32
+3.0
+13
+0.820920626451767
+23
+1.86297548735602
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+1.5
+11
+0.85976839852704
+21
+1.92778907942509
+31
+3.0
+12
+0.85976839852704
+22
+1.92778907942509
+32
+1.5
+13
+0.85976839852704
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.42452680194624
+31
+1.5
+12
+0.733707760462408
+22
+1.42452680194624
+32
+3.0
+13
+0.733707760462408
+23
+1.42452680194624
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+1.5
+11
+0.73
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.34978045204758
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+3.0
+13
+0.763155941486199
+23
+1.27648079851406
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+1.5
+11
+0.744795334089513
+21
+1.34978045204758
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+3.00250198874351
+21
+0.87764329876989
+31
+3.0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+0.0
+11
+0.744795334089513
+21
+1.65021954795242
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+0.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.65021954795242
+30
+1.5
+11
+0.763155941486199
+21
+1.72351920148594
+31
+0.0
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.72351920148594
+21
+0.763155941486199
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+0.763155941486199
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.72351920148594
+22
+0.763155941486199
+32
+3.0
+13
+1.72351920148594
+23
+0.763155941486199
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+0.0
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+0.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+0.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+0.955527778486358
+21
+2.04447222151364
+31
+0.0
+12
+1.01151717119399
+22
+2.09521804908931
+32
+0.0
+13
+1.01151717119399
+23
+2.09521804908931
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.5
+11
+1.92778907942509
+21
+0.85976839852704
+31
+0.0
+12
+1.86297548735602
+22
+0.820920626451767
+32
+0.0
+13
+1.86297548735602
+23
+0.820920626451767
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+0.0
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+1.5
+13
+1.92778907942509
+23
+0.85976839852704
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+1.5
+11
+2.2368440585138
+21
+1.27648079851406
+31
+0.0
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+0.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+0.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+0.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+0.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+0.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.42452680194624
+22
+0.733707760462408
+32
+0.0
+13
+1.42452680194624
+23
+0.733707760462408
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+0.0
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+3.0
+11
+1.07221092057491
+21
+0.85976839852704
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+1.5
+13
+1.13702451264398
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+0.85976839852704
+30
+1.5
+11
+1.13702451264398
+21
+0.820920626451767
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+1.5
+11
+1.07221092057491
+21
+2.14023160147296
+31
+0.0
+12
+1.13702451264398
+22
+2.17907937354823
+32
+0.0
+13
+1.13702451264398
+23
+2.17907937354823
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+0.0
+11
+1.13702451264398
+21
+2.17907937354823
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+1.5
+13
+1.07221092057491
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+3.68628738645072e-18
+30
+0.205
+11
+1.20533375707888
+21
+0.788612759966309
+31
+0.0
+12
+0.878679656440357
+22
+0.0
+32
+0.0
+13
+0.878679656440357
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+3.68628738645072e-18
+31
+0.205
+12
+0.878679656440357
+22
+1.53956708492942e-17
+32
+0.826320343559643
+13
+0.878679656440357
+23
+1.53956708492942e-17
+33
+0.826320343559643
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+1.53956708492942e-17
+31
+0.826320343559643
+12
+0.878679656440357
+22
+4.01154803819637e-17
+32
+2.17367965644036
+13
+0.878679656440357
+23
+4.01154803819637e-17
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+4.01154803819637e-17
+31
+2.17367965644036
+12
+0.878679656440357
+22
+5.18248638448071e-17
+32
+2.795
+13
+0.878679656440357
+23
+5.18248638448071e-17
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+5.18248638448071e-17
+31
+2.795
+12
+0.878679656440357
+22
+1.11022302462516e-16
+32
+3.0
+13
+0.878679656440357
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.01151717119399
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+1.5
+13
+2.04447222151364
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+2.09521804908931
+21
+1.01151717119399
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+3.0
+13
+2.09521804908931
+23
+1.01151717119399
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+2.17907937354823
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.5
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+1.5
+11
+1.86297548735602
+21
+2.17907937354823
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+3.0
+13
+1.92778907942509
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.5
+11
+1.34978045204758
+21
+0.744795334089513
+31
+0.0
+12
+1.27648079851406
+22
+0.763155941486199
+32
+0.0
+13
+1.27648079851406
+23
+0.763155941486199
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+0.0
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.57547319805376
+30
+1.5
+11
+2.27
+21
+1.5
+31
+3.0
+12
+2.27
+22
+1.5
+32
+1.5
+13
+2.27
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+2.26629223953759
+21
+1.57547319805376
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+3.0
+13
+2.26629223953759
+23
+1.57547319805376
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.65021954795242
+30
+0.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+1.5
+12
+0.733707760462408
+22
+1.57547319805376
+32
+0.0
+13
+0.733707760462408
+23
+1.57547319805376
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+1.5
+11
+0.744795334089513
+21
+1.65021954795242
+31
+0.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+0.0
+11
+0.820920626451767
+21
+1.13702451264398
+31
+1.5
+12
+0.820920626451767
+22
+1.13702451264398
+32
+0.0
+13
+0.820920626451767
+23
+1.13702451264398
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+0.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+0.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+0.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+0.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.72351920148594
+21
+2.2368440585138
+31
+0.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+0.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+0.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+0.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+0.0
+11
+2.17907937354823
+21
+1.86297548735602
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+0.0
+13
+2.17907937354823
+23
+1.86297548735602
+33
+0.0
+70
+1
+ 0
+LINE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+2.12187288805765
+21
+-0.0013339604208924
+31
+3.0
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+1.98848282880601
+21
+0.904781950910693
+31
+0.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+0.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+0.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910693
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+0.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+0.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+0.0
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.01151717119399
+22
+2.09521804908931
+32
+1.5
+13
+1.01151717119399
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+1.5
+11
+1.42452680194624
+21
+0.733707760462408
+31
+0.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+0.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+0.0
+11
+1.34978045204758
+21
+0.744795334089513
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+1.5
+13
+1.42452680194624
+23
+0.733707760462408
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+2.09521804908931
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+0.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+1.5
+12
+0.904781950910692
+22
+1.01151717119399
+32
+0.0
+13
+0.904781950910692
+23
+1.01151717119399
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.5
+11
+0.85976839852704
+21
+1.07221092057491
+31
+0.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+1.5
+13
+0.85976839852704
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+0.0
+11
+0.763155941486199
+21
+1.72351920148594
+31
+1.5
+12
+0.763155941486199
+22
+1.72351920148594
+32
+0.0
+13
+0.763155941486199
+23
+1.72351920148594
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+0.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+0.0
+12
+0.763155941486199
+22
+1.72351920148594
+32
+0.0
+13
+0.763155941486199
+23
+1.72351920148594
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.763155941486199
+21
+1.72351920148594
+31
+0.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+0.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440357
+22
+0.0
+32
+0.0
+13
+0.878679656440357
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+0.0
+12
+1.27648079851406
+22
+0.763155941486199
+32
+0.0
+13
+1.27648079851406
+23
+0.763155941486199
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.27648079851406
+21
+0.763155941486199
+31
+0.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+0.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.826320343559643
+11
+2.12132034355964
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.98848282880601
+30
+3.0
+11
+0.85976839852704
+21
+1.92778907942509
+31
+1.5
+12
+0.85976839852704
+22
+1.92778907942509
+32
+3.0
+13
+0.85976839852704
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.92778907942509
+30
+1.5
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.904781950910692
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910692
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+2.25520466591049
+30
+3.0
+11
+1.42452680194624
+21
+2.26629223953759
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+2.26629223953759
+30
+1.5
+11
+1.34978045204758
+21
+2.25520466591049
+31
+3.0
+12
+1.42452680194624
+22
+2.26629223953759
+32
+3.0
+13
+1.42452680194624
+23
+2.26629223953759
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+-2.22044604925031e-16
+20
+2.12132034355964
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+0.0
+11
+-2.22044604925031e-16
+21
+2.12132034355964
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+1.5
+11
+-2.22044604925031e-16
+21
+2.12132034355964
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+1.5
+11
+2.17907937354823
+21
+1.86297548735602
+31
+0.0
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+0.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+0.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+0.0
+12
+1.98848282880601
+22
+0.904781950910693
+32
+0.0
+13
+1.98848282880601
+23
+0.904781950910693
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+0.0
+11
+1.98848282880601
+21
+0.904781950910693
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+1.5
+13
+2.04447222151364
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.763155941486199
+21
+1.72351920148594
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+3.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42452680194624
+21
+0.733707760462408
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27648079851406
+21
+0.763155941486199
+31
+3.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+3.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+2.17907937354823
+22
+1.13702451264398
+32
+3.0
+13
+2.17907937354823
+23
+1.13702451264398
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.72351920148594
+22
+0.763155941486199
+32
+3.0
+13
+1.72351920148594
+23
+0.763155941486199
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+-4.44089209850063e-16
+22
+0.878679656440356
+32
+3.0
+13
+-4.44089209850063e-16
+23
+0.878679656440356
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.820920626451767
+22
+1.13702451264398
+32
+3.0
+13
+0.820920626451767
+23
+1.13702451264398
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+3.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.85976839852704
+22
+1.92778907942509
+32
+3.0
+13
+0.85976839852704
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+3.0
+12
+2.2368440585138
+22
+1.27648079851406
+32
+3.0
+13
+2.2368440585138
+23
+1.27648079851406
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+3.0
+12
+1.98848282880601
+22
+0.904781950910693
+32
+3.0
+13
+1.98848282880601
+23
+0.904781950910693
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+2.2368440585138
+21
+1.27648079851406
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+3.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+0.878679656440357
+22
+1.11022302462516e-16
+32
+3.0
+13
+0.878679656440357
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27648079851406
+22
+0.763155941486199
+32
+3.0
+13
+1.27648079851406
+23
+0.763155941486199
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+3.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+2.2368440585138
+22
+1.72351920148594
+32
+3.0
+13
+2.2368440585138
+23
+1.72351920148594
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+2.17907937354823
+22
+1.86297548735602
+32
+3.0
+13
+2.17907937354823
+23
+1.86297548735602
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+2.26629223953759
+22
+1.57547319805376
+32
+3.0
+13
+2.26629223953759
+23
+1.57547319805376
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.86297548735602
+21
+0.820920626451767
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+3.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+3.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72351920148594
+21
+2.2368440585138
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+3.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.65021954795242
+21
+2.25520466591049
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+2.25520466591049
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.72351920148594
+22
+2.2368440585138
+32
+3.0
+13
+1.72351920148594
+23
+2.2368440585138
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.13702451264398
+21
+2.17907937354823
+31
+3.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01151717119399
+21
+2.09521804908931
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.07221092057491
+21
+2.14023160147296
+31
+3.0
+12
+1.13702451264398
+22
+2.17907937354823
+32
+3.0
+13
+1.13702451264398
+23
+2.17907937354823
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.13702451264398
+21
+2.17907937354823
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+-2.22044604925031e-16
+22
+2.12132034355964
+32
+3.0
+13
+-2.22044604925031e-16
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.763155941486199
+22
+1.72351920148594
+32
+3.0
+13
+0.763155941486199
+23
+1.72351920148594
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+3.0
+12
+2.26629223953759
+22
+1.42452680194624
+32
+3.0
+13
+2.26629223953759
+23
+1.42452680194624
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.86297548735602
+22
+0.820920626451767
+32
+3.0
+13
+1.86297548735602
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+3.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17907937354823
+21
+1.86297548735602
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+2.09521804908931
+22
+1.01151717119399
+32
+3.0
+13
+2.09521804908931
+23
+1.01151717119399
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.820920626451767
+21
+1.13702451264398
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01151717119399
+21
+0.904781950910692
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+3.0
+12
+2.09521804908931
+22
+1.98848282880601
+32
+3.0
+13
+2.09521804908931
+23
+1.98848282880601
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.85976839852704
+22
+1.92778907942509
+32
+3.0
+13
+0.85976839852704
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.98848282880601
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.09521804908931
+21
+1.98848282880601
+31
+0.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+0.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+0.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+0.0
+12
+1.5
+22
+2.27
+32
+0.0
+13
+1.5
+23
+2.27
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.79836855106949
+22
+3.0
+32
+0.0
+13
+1.79836855106949
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+0.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+0.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26629223953759
+21
+1.42452680194624
+31
+0.0
+12
+2.27
+22
+1.5
+32
+0.0
+13
+2.27
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.27
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+0.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.34978045204758
+21
+0.744795334089513
+31
+0.0
+12
+1.42452680194624
+22
+0.733707760462408
+32
+0.0
+13
+1.42452680194624
+23
+0.733707760462408
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.42452680194624
+21
+0.733707760462408
+31
+0.0
+12
+1.5
+22
+0.73
+32
+0.0
+13
+1.5
+23
+0.73
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+0.0
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+0.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+1.98848282880601
+21
+0.904781950910693
+31
+0.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+0.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.65021954795242
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.744795334089513
+21
+1.65021954795242
+31
+0.0
+12
+0.733707760462408
+22
+1.57547319805376
+32
+0.0
+13
+0.733707760462408
+23
+1.57547319805376
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+0.0
+12
+0.73
+22
+1.5
+32
+0.0
+13
+0.73
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01151717119399
+22
+2.09521804908931
+32
+0.0
+13
+1.01151717119399
+23
+2.09521804908931
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+0.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+0.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.85976839852704
+21
+1.07221092057491
+31
+0.0
+12
+0.904781950910692
+22
+1.01151717119399
+32
+0.0
+13
+0.904781950910692
+23
+1.01151717119399
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+0.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+0.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+0.0
+31
+2.17367965644036
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.17367965644036
+11
+2.795
+21
+0.0
+31
+2.795
+12
+2.12132034355964
+22
+0.0
+32
+2.795
+13
+2.12132034355964
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.205
+13
+2.12132034355964
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.12132034355964
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+1.5
+12
+2.12132034355964
+22
+0.0
+32
+0.826320343559644
+13
+2.12132034355964
+23
+0.0
+33
+0.826320343559644
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440357
+22
+0.0
+32
+0.0
+13
+0.878679656440357
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440357
+22
+3.68628738645072e-18
+32
+0.205
+13
+0.878679656440357
+23
+3.68628738645072e-18
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+5.18248638448071e-17
+30
+2.795
+11
+0.878679656440357
+21
+4.01154803819637e-17
+31
+2.17367965644036
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+1.53956708492942e-17
+30
+0.826320343559643
+11
+0.878679656440357
+21
+3.68628738645072e-18
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+3.0
+11
+0.878679656440357
+21
+5.18248638448071e-17
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+5.18248638448071e-17
+30
+2.795
+11
+1.5
+21
+0.0
+31
+3.0
+12
+0.878679656440357
+22
+1.11022302462516e-16
+32
+3.0
+13
+0.878679656440357
+23
+1.11022302462516e-16
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.205
+13
+2.12132034355964
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559643
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.826320343559643
+11
+1.5
+21
+3.0
+31
+2.795
+12
+2.12132034355964
+22
+3.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+3.0
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+2.17367965644036
+11
+0.878679656440356
+21
+3.0
+31
+0.826320343559644
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.878679656440356
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.878679656440356
+22
+3.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+3.0
+33
+0.826320343559644
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.878679656440356
+21
+3.0
+31
+2.17367965644036
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+2.17367965644036
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.878679656440356
+22
+3.0
+32
+2.795
+13
+0.878679656440356
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.205
+13
+0.878679656440356
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.01151717119399
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.34978045204758
+21
+2.25520466591049
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.42452680194624
+31
+1.5
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.34978045204758
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+1.5
+13
+1.07221092057491
+23
+2.14023160147296
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+1.5
+13
+1.42452680194624
+23
+0.733707760462408
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910692
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+0.85976839852704
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+1.5
+13
+1.13702451264398
+23
+0.820920626451767
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.2368440585138
+21
+1.72351920148594
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.25520466591049
+21
+1.65021954795242
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.57547319805376
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.744795334089513
+21
+1.65021954795242
+31
+1.5
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.763155941486199
+21
+1.72351920148594
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+1.5
+13
+2.27
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+2.27
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+1.5
+11
+2.27
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451767
+21
+1.86297548735602
+31
+1.5
+12
+0.85976839852704
+22
+1.92778907942509
+32
+1.5
+13
+0.85976839852704
+23
+1.92778907942509
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.85976839852704
+21
+1.92778907942509
+31
+1.5
+12
+0.904781950910692
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910692
+23
+1.98848282880601
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+1.5
+13
+1.92778907942509
+23
+0.85976839852704
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910693
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+1.5
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.5
+21
+0.73
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.57547319805376
+22
+0.733707760462408
+32
+1.5
+13
+1.57547319805376
+23
+0.733707760462408
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.65021954795242
+21
+2.25520466591049
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451767
+21
+1.13702451264398
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.85976839852704
+22
+1.07221092057491
+32
+1.5
+13
+0.85976839852704
+23
+1.07221092057491
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.904781950910692
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910692
+23
+1.01151717119399
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.5
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+1.5
+13
+1.98848282880601
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+1.5
+13
+2.04447222151364
+23
+2.04447222151364
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+0.205000000000001
+21
+0.0
+31
+-1.16573417585641e-15
+12
+1.19348975147204e-15
+22
+0.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+-1.16573417585641e-15
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.20736753927986e-15
+12
+0.497732043121054
+22
+0.0
+32
+1.19348975147204e-15
+13
+0.497732043121054
+23
+0.0
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.497732043121054
+20
+0.0
+30
+1.19348975147204e-15
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.20736753927986e-15
+12
+1.01151717119399
+22
+0.904781950910693
+32
+6.38378239159465e-16
+13
+1.01151717119399
+23
+0.904781950910693
+33
+6.38378239159465e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.497732043121054
+20
+0.0
+30
+1.19348975147204e-15
+11
+1.01151717119399
+21
+0.904781950910693
+31
+6.38378239159465e-16
+12
+1.07221092057491
+22
+0.85976839852704
+32
+-1.38777878078145e-17
+13
+1.07221092057491
+23
+0.85976839852704
+33
+-1.38777878078145e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+1.19348975147204e-15
+11
+1.98848282880601
+21
+2.09521804908931
+31
+-8.46545056276682e-16
+12
+1.92778907942509
+22
+2.14023160147296
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+2.14023160147296
+33
+-1.02695629777827e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+-8.46545056276682e-16
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.04447222151364
+22
+2.04447222151364
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+2.04447222151364
+33
+-1.11022302462516e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+3.0
+22
+3.0
+32
+1.19348975147204e-15
+13
+3.0
+23
+3.0
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.795
+22
+3.0
+32
+-1.16573417585641e-15
+13
+2.795
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+1.19348975147204e-15
+11
+2.26629223953759
+21
+1.57547319805376
+31
+-1.11022302462516e-16
+12
+2.25520466591049
+22
+1.65021954795242
+32
+-1.2490009027033e-15
+13
+2.25520466591049
+23
+1.65021954795242
+33
+-1.2490009027033e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+-1.11022302462516e-16
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+2.27
+22
+1.5
+32
+-2.35922392732846e-16
+13
+2.27
+23
+1.5
+33
+-2.35922392732846e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.5
+32
+1.19348975147204e-15
+13
+3.0
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+6.93889390390723e-16
+11
+1.34978045204758
+21
+2.25520466591049
+31
+-4.02455846426619e-16
+12
+1.20163144893051
+22
+3.0
+32
+1.19348975147204e-15
+13
+1.20163144893051
+23
+3.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+-4.02455846426619e-16
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.42452680194624
+22
+2.26629223953759
+32
+-6.93889390390723e-16
+13
+1.42452680194624
+23
+2.26629223953759
+33
+-6.93889390390723e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+-6.93889390390723e-16
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.20736753927986e-15
+11
+1.33226762955019e-15
+21
+2.50226795687895
+31
+1.19348975147204e-15
+12
+1.19348975147204e-15
+22
+3.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.20736753927986e-15
+12
+0.904781950910692
+22
+1.98848282880601
+32
+1.31838984174237e-15
+13
+0.904781950910692
+23
+1.98848282880601
+33
+1.31838984174237e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.31838984174237e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+7.63278329429795e-16
+11
+3.0
+21
+0.0
+31
+1.19348975147204e-15
+12
+2.04447222151364
+22
+0.955527778486358
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+0.955527778486358
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+1.19348975147204e-15
+11
+2.09521804908931
+21
+1.01151717119399
+31
+7.63278329429795e-16
+12
+2.14023160147296
+22
+1.07221092057491
+32
+-9.71445146547012e-16
+13
+2.14023160147296
+23
+1.07221092057491
+33
+-9.71445146547012e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+1.19348975147204e-15
+11
+2.14023160147296
+21
+1.07221092057491
+31
+-9.71445146547012e-16
+12
+3.0
+22
+0.497732043121051
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.497732043121051
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.826320343559641
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+0.204999999999999
+13
+1.5
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+5.55111512312578e-17
+31
+0.826320343559641
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.17367965644036
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72351920148594
+21
+0.763155941486199
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+3.0
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440357
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.878679656440357
+22
+3.0
+32
+2.795
+13
+0.878679656440357
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+2
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+3.0
+11
+1.07221092057491
+21
+0.85976839852704
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+3.0
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+3.0
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+1.19348975147204e-15
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+1.19348975147204e-15
+13
+3.0
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+3.0
+22
+2.12132034355964
+32
+1.19348975147204e-15
+13
+3.0
+23
+2.12132034355964
+33
+1.19348975147204e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.20163144893051
+30
+3.0
+11
+1.19348975147204e-15
+21
+0.878679656440358
+31
+-1.16573417585641e-15
+12
+2.77555756156289e-16
+22
+0.878679656440358
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.878679656440358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.878679656440358
+30
+-1.16573417585641e-15
+11
+2.77555756156289e-16
+21
+1.20163144893051
+31
+3.0
+12
+1.33226762955019e-15
+22
+1.20163144893051
+32
+1.19348975147204e-15
+13
+1.33226762955019e-15
+23
+1.20163144893051
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+1.20163144893051
+31
+3.0
+12
+2.77555756156289e-16
+22
+1.5
+32
+3.0
+13
+2.77555756156289e-16
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+1.19348975147204e-15
+22
+1.5
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+1.5
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.2368440585138
+21
+1.72351920148594
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.38777878078145e-16
+11
+1.5
+21
+0.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+6.93889390390723e-16
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.38777878078145e-16
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+1.19348975147204e-15
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.38777878078145e-16
+12
+1.65021954795242
+22
+0.744795334089513
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+0.744795334089513
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17907937354823
+21
+1.13702451264398
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440356
+32
+3.0
+13
+3.0
+23
+0.878679656440356
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+2.77555756156289e-16
+21
+1.20163144893051
+31
+3.0
+12
+2.77555756156289e-16
+22
+0.878679656440358
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.878679656440358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.20163144893051
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+0.763155941486199
+22
+1.27648079851406
+32
+3.0
+13
+0.763155941486199
+23
+1.27648079851406
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.20163144893051
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73
+20
+1.5
+30
+7.07767178198537e-16
+11
+1.33226762955019e-15
+21
+1.20163144893051
+31
+1.19348975147204e-15
+12
+1.19348975147204e-15
+22
+1.5
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+1.5
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+0.73
+21
+1.5
+31
+7.07767178198537e-16
+12
+0.733707760462409
+22
+1.42452680194624
+32
+4.16333634234434e-16
+13
+0.733707760462409
+23
+1.42452680194624
+33
+4.16333634234434e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+0.733707760462409
+21
+1.42452680194624
+31
+4.16333634234434e-16
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+2.795
+11
+1.19348975147204e-15
+21
+0.0
+31
+1.5
+12
+0.205000000000001
+22
+0.0
+32
+1.5
+13
+0.205000000000001
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+1.5
+11
+0.205000000000001
+21
+0.0
+31
+2.795
+12
+1.19348975147204e-15
+22
+0.0
+32
+2.795
+13
+1.19348975147204e-15
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.50226795687895
+30
+3.0
+11
+1.19348975147204e-15
+21
+2.12132034355964
+31
+-1.16573417585641e-15
+12
+2.77555756156289e-16
+22
+2.12132034355964
+32
+3.0
+13
+2.77555756156289e-16
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+2.12132034355964
+30
+-1.16573417585641e-15
+11
+2.77555756156289e-16
+21
+2.50226795687895
+31
+3.0
+12
+1.33226762955019e-15
+22
+2.50226795687895
+32
+1.19348975147204e-15
+13
+1.33226762955019e-15
+23
+2.50226795687895
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+2.50226795687895
+31
+3.0
+12
+2.77555756156289e-16
+22
+3.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+3.0
+31
+3.0
+12
+1.19348975147204e-15
+22
+3.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+-1.02695629777827e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+-1.11022302462516e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+1.92778907942509
+21
+2.14023160147296
+31
+-1.02695629777827e-15
+12
+1.98848282880601
+22
+2.09521804908931
+32
+-8.46545056276682e-16
+13
+1.98848282880601
+23
+2.09521804908931
+33
+-8.46545056276682e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440357
+22
+3.0
+32
+3.0
+13
+0.878679656440357
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+3.0
+12
+1.27648079851406
+22
+2.2368440585138
+32
+3.0
+13
+1.27648079851406
+23
+2.2368440585138
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+1.19348975147204e-15
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.878679656440356
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.878679656440356
+33
+1.19348975147204e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.878679656440356
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.878679656440356
+32
+3.0
+13
+3.0
+23
+0.878679656440356
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+0.826320343559642
+11
+2.795
+21
+3.0
+31
+0.204999999999999
+12
+2.12132034355964
+22
+3.0
+32
+0.204999999999999
+13
+2.12132034355964
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+0.204999999999999
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559642
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+2.2368440585138
+21
+1.72351920148594
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+3.0
+13
+2.2368440585138
+23
+1.72351920148594
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.5
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.904781950910694
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910694
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.98848282880601
+30
+3.0
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+3.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.26629223953759
+21
+1.57547319805376
+31
+3.0
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.09521804908931
+21
+1.01151717119399
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+3.0
+13
+2.09521804908931
+23
+1.01151717119399
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+1.5
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+1.5
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.820920626451766
+22
+1.86297548735602
+32
+1.5
+13
+0.820920626451766
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451767
+20
+1.86297548735602
+30
+3.0
+11
+0.859768398527041
+21
+1.92778907942509
+31
+1.5
+12
+0.859768398527041
+22
+1.92778907942509
+32
+3.0
+13
+0.859768398527041
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+2.77555756156289e-17
+11
+2.77555756156289e-16
+21
+2.12132034355964
+31
+3.0
+12
+1.19348975147204e-15
+22
+2.12132034355964
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+2.12132034355964
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.12132034355964
+30
+3.0
+11
+0.78861275996631
+21
+1.79466624292112
+31
+2.77555756156289e-17
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.12132034355964
+30
+3.0
+11
+0.78861275996631
+21
+1.79466624292112
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.1518563880486e-15
+11
+1.20533375707888
+21
+0.788612759966309
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.1518563880486e-15
+12
+1.27648079851406
+22
+0.763155941486199
+32
+1.5
+13
+1.27648079851406
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.0
+32
+0.204999999999999
+13
+1.5
+23
+0.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+0.204999999999999
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.0
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.0
+33
+6.93889390390723e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+6.93889390390723e-16
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+6.93889390390723e-16
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.98848282880601
+30
+7.63278329429795e-16
+11
+2.14023160147296
+21
+1.92778907942509
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+-9.71445146547012e-16
+13
+2.14023160147296
+23
+1.92778907942509
+33
+-9.71445146547012e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+1.5
+11
+2.09521804908931
+21
+1.98848282880601
+31
+7.63278329429795e-16
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.38777878078145e-16
+11
+1.65021954795242
+21
+2.25520466591049
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+2.25520466591049
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.38777878078145e-16
+12
+1.57547319805376
+22
+2.26629223953759
+32
+1.5
+13
+1.57547319805376
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+8.18789480661053e-16
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+8.18789480661053e-16
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.58206781009085e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.58206781009085e-15
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+0.820920626451768
+21
+1.13702451264398
+31
+1.65145674912992e-15
+12
+0.820920626451766
+22
+1.13702451264398
+32
+1.5
+13
+0.820920626451766
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.13702451264398
+30
+1.65145674912992e-15
+11
+0.788612759966309
+21
+1.20533375707888
+31
+1.5
+12
+0.78861275996631
+22
+1.20533375707888
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.20533375707888
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.20736753927986e-15
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+1.01151717119399
+22
+2.09521804908931
+32
+6.38378239159465e-16
+13
+1.01151717119399
+23
+2.09521804908931
+33
+6.38378239159465e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.20736753927986e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+6.93889390390723e-16
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.57547319805376
+22
+2.26629223953759
+32
+1.38777878078145e-16
+13
+1.57547319805376
+23
+2.26629223953759
+33
+1.38777878078145e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+2.27
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+8.18789480661053e-16
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+8.18789480661053e-16
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.58206781009085e-15
+12
+1.92778907942509
+22
+0.85976839852704
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+0.85976839852704
+33
+-1.02695629777827e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.58206781009085e-15
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+6.38378239159465e-16
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+6.38378239159465e-16
+12
+1.01151717119399
+22
+2.09521804908931
+32
+1.5
+13
+1.01151717119399
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+1.5
+11
+2.17907937354823
+21
+1.13702451264398
+31
+3.0
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.07221092057491
+30
+1.5
+11
+0.904781950910692
+21
+1.01151717119399
+31
+1.31838984174237e-15
+12
+0.904781950910694
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910694
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.31838984174237e-15
+11
+0.859768398527041
+21
+1.07221092057491
+31
+1.5
+12
+0.859768398527041
+22
+1.07221092057491
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.07221092057491
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.34978045204758
+21
+2.25520466591049
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+2.09521804908931
+21
+1.01151717119399
+31
+3.0
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+1.5
+11
+2.2368440585138
+21
+1.72351920148594
+31
+3.0
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+2.2368440585138
+30
+-5.27355936696949e-16
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.72351920148594
+21
+2.2368440585138
+31
+-5.27355936696949e-16
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910693
+31
+3.0
+12
+1.01151717119399
+22
+0.904781950910693
+32
+1.5
+13
+1.01151717119399
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+3.0
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+6.93889390390723e-16
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+3.0
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+3.0
+32
+0.204999999999999
+13
+1.5
+23
+3.0
+33
+0.204999999999999
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+0.204999999999999
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.72351920148594
+30
+1.5
+11
+0.744795334089513
+21
+1.65021954795242
+31
+4.71844785465692e-16
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.65021954795242
+30
+4.71844785465692e-16
+11
+0.763155941486199
+21
+1.72351920148594
+31
+1.5
+12
+0.7631559414862
+22
+1.72351920148594
+32
+-2.77555756156289e-17
+13
+0.7631559414862
+23
+1.72351920148594
+33
+-2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.86297548735602
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+0.820920626451766
+21
+1.86297548735602
+31
+1.5
+12
+0.820920626451767
+22
+1.86297548735602
+32
+3.0
+13
+0.820920626451767
+23
+1.86297548735602
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+1.19348975147204e-15
+21
+0.0
+31
+2.795
+12
+2.77555756156289e-16
+22
+0.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+2.795
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.0
+32
+1.5
+13
+1.19348975147204e-15
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+1.5
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.0
+32
+0.204999999999999
+13
+1.19348975147204e-15
+23
+0.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+0.204999999999999
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.0
+33
+-1.16573417585641e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+-1.16573417585641e-15
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+0.955527778486358
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+3.0
+21
+0.0
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+-6.80011602582908e-16
+11
+2.12132034355964
+21
+5.55111512312578e-17
+31
+0.826320343559641
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+0.204999999999999
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.826320343559641
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.17367965644036
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.17367965644036
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+2.17367965644036
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.795
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+2.795
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+3.0
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+3.0
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.42452680194624
+30
+-1.11022302462516e-16
+11
+2.25520466591049
+21
+1.34978045204758
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+-1.2490009027033e-15
+13
+2.25520466591049
+23
+1.34978045204758
+33
+-1.2490009027033e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+1.5
+11
+2.26629223953759
+21
+1.42452680194624
+31
+-1.11022302462516e-16
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+2.26629223953759
+21
+1.42452680194624
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+-1.11022302462516e-16
+13
+2.26629223953759
+23
+1.42452680194624
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.42452680194624
+30
+1.5
+11
+2.27
+21
+1.5
+31
+-2.35922392732846e-16
+12
+2.27
+22
+1.5
+32
+1.5
+13
+2.27
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+-1.2490009027033e-15
+11
+2.2368440585138
+21
+1.27648079851406
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+-1.06858966120171e-15
+13
+2.2368440585138
+23
+1.27648079851406
+33
+-1.06858966120171e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.27648079851406
+30
+1.5
+11
+2.25520466591049
+21
+1.34978045204758
+31
+-1.2490009027033e-15
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.09521804908931
+21
+1.01151717119399
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.14023160147296
+21
+1.07221092057491
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.42452680194624
+30
+1.5
+11
+0.744795334089513
+21
+1.34978045204758
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.34978045204758
+30
+3.0
+11
+0.73370776046241
+21
+1.42452680194624
+31
+1.5
+12
+0.733707760462408
+22
+1.42452680194624
+32
+3.0
+13
+0.733707760462408
+23
+1.42452680194624
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.13702451264398
+30
+1.5
+11
+0.859768398527041
+21
+1.07221092057491
+31
+8.74300631892311e-16
+12
+0.859768398527041
+22
+1.07221092057491
+32
+1.5
+13
+0.859768398527041
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.07221092057491
+30
+8.74300631892311e-16
+11
+0.820920626451766
+21
+1.13702451264398
+31
+1.5
+12
+0.820920626451768
+22
+1.13702451264398
+32
+1.65145674912992e-15
+13
+0.820920626451768
+23
+1.13702451264398
+33
+1.65145674912992e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440357
+20
+3.0
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+-5.68989300120393e-16
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+0.878679656440358
+22
+3.0
+32
+9.29811783123569e-16
+13
+0.878679656440358
+23
+3.0
+33
+9.29811783123569e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+0.878679656440357
+22
+3.0
+32
+2.795
+13
+0.878679656440357
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440357
+21
+3.0
+31
+2.795
+12
+0.878679656440357
+22
+3.0
+32
+2.17367965644036
+13
+0.878679656440357
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440357
+21
+3.0
+31
+2.17367965644036
+12
+0.878679656440358
+22
+3.0
+32
+0.826320343559643
+13
+0.878679656440358
+23
+3.0
+33
+0.826320343559643
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440358
+21
+3.0
+31
+0.826320343559643
+12
+0.878679656440358
+22
+3.0
+32
+0.204999999999999
+13
+0.878679656440358
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+3.0
+21
+0.878679656440356
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.878679656440356
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+3.0
+22
+0.878679656440356
+32
+3.0
+13
+3.0
+23
+0.878679656440356
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.878679656440356
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+-2.35922392732846e-16
+13
+2.27
+23
+1.5
+33
+-2.35922392732846e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+3.0
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.20533375707888
+30
+2.77555756156289e-17
+11
+2.77555756156289e-16
+21
+0.878679656440358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.878679656440358
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.878679656440358
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+0.878679656440358
+30
+3.0
+11
+0.78861275996631
+21
+1.20533375707888
+31
+2.77555756156289e-17
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+0.878679656440358
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+3.0
+11
+1.07221092057491
+21
+0.85976839852704
+31
+1.5
+12
+1.01151717119399
+22
+0.904781950910693
+32
+1.5
+13
+1.01151717119399
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910693
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.86297548735602
+30
+-1.2490009027033e-16
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.17907937354823
+21
+1.86297548735602
+31
+-1.2490009027033e-16
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+0.904781950910692
+30
+-1.66533453693773e-16
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+0.85976839852704
+33
+-1.02695629777827e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+1.98848282880601
+21
+0.904781950910692
+31
+-1.66533453693773e-16
+12
+1.98848282880601
+22
+0.904781950910692
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910692
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+2.2368440585138
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.27648079851406
+22
+2.2368440585138
+32
+1.5
+13
+1.27648079851406
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.34978045204758
+30
+1.5
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.27648079851406
+30
+3.0
+11
+0.744795334089513
+21
+1.34978045204758
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.72351920148594
+21
+0.763155941486199
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+1.5
+13
+2.04447222151364
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.72351920148594
+21
+0.763155941486199
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.72351920148594
+22
+0.763155941486199
+32
+3.0
+13
+1.72351920148594
+23
+0.763155941486199
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.34978045204758
+21
+2.25520466591049
+31
+3.0
+12
+1.27648079851406
+22
+2.2368440585138
+32
+3.0
+13
+1.27648079851406
+23
+2.2368440585138
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.729999999999999
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.73370776046241
+22
+1.42452680194624
+32
+1.5
+13
+0.73370776046241
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462408
+20
+1.42452680194624
+30
+3.0
+11
+0.729999999999999
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.26629223953759
+21
+1.57547319805376
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+3.0
+13
+2.26629223953759
+23
+1.57547319805376
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+1.5
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.34978045204758
+21
+0.744795334089513
+31
+-4.02455846426619e-16
+12
+1.42452680194624
+22
+0.733707760462408
+32
+-6.93889390390723e-16
+13
+1.42452680194624
+23
+0.733707760462408
+33
+-6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+0.744795334089513
+30
+-4.02455846426619e-16
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+2.17907937354823
+21
+1.13702451264398
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+3.0
+13
+2.17907937354823
+23
+1.13702451264398
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+1
+ 0
+LINE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.878679656440358
+30
+-1.16573417585641e-15
+11
+-0.00250198874351172
+21
+0.87764329876989
+31
+-1.47104550762833e-15
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+-1.11022302462516e-16
+11
+1.98848282880601
+21
+0.904781950910692
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910692
+32
+-1.66533453693773e-16
+13
+1.98848282880601
+23
+0.904781950910692
+33
+-1.66533453693773e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+0.904781950910692
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+-1.11022302462516e-16
+12
+2.04447222151364
+22
+0.955527778486358
+32
+1.5
+13
+2.04447222151364
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+6.93889390390723e-16
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+-6.93889390390723e-16
+13
+1.42452680194624
+23
+0.733707760462408
+33
+-6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+0.73
+31
+6.93889390390723e-16
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.65021954795242
+30
+1.5
+11
+0.733707760462409
+21
+1.57547319805376
+31
+4.16333634234434e-16
+12
+0.73370776046241
+22
+1.57547319805376
+32
+1.5
+13
+0.73370776046241
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462409
+20
+1.57547319805376
+30
+4.16333634234434e-16
+11
+0.744795334089513
+21
+1.65021954795242
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.65021954795242
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+1.5
+11
+0.7631559414862
+21
+1.72351920148594
+31
+-2.77555756156289e-17
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.72351920148594
+30
+-2.77555756156289e-17
+11
+0.78861275996631
+21
+1.79466624292112
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+0.744795334089513
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.1518563880486e-15
+12
+1.34978045204758
+22
+0.744795334089513
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+0.744795334089513
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.1518563880486e-15
+11
+1.34978045204758
+21
+0.744795334089513
+31
+1.5
+12
+1.27648079851406
+22
+0.763155941486199
+32
+1.5
+13
+1.27648079851406
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+2.09521804908931
+21
+1.98848282880601
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+7.63278329429795e-16
+13
+2.09521804908931
+23
+1.98848282880601
+33
+7.63278329429795e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.98848282880601
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+-1.11022302462516e-16
+12
+2.04447222151364
+22
+2.04447222151364
+32
+1.5
+13
+2.04447222151364
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+-7.35522753814166e-16
+11
+0.878127111942354
+21
+-0.0013339604208924
+31
+1.42941214420489e-15
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910694
+20
+1.01151717119399
+30
+1.5
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.20736753927986e-15
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+0.904781950910694
+21
+1.01151717119399
+31
+1.5
+12
+0.904781950910692
+22
+1.01151717119399
+32
+1.31838984174237e-15
+13
+0.904781950910692
+23
+1.01151717119399
+33
+1.31838984174237e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+-3.60822483003176e-16
+11
+1.72351920148594
+21
+2.2368440585138
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+-5.27355936696949e-16
+13
+1.72351920148594
+23
+2.2368440585138
+33
+-5.27355936696949e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+2.2368440585138
+30
+1.5
+11
+1.65021954795242
+21
+2.25520466591049
+31
+-3.60822483003176e-16
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.57547319805376
+30
+1.5
+11
+0.73
+21
+1.5
+31
+7.07767178198537e-16
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73
+20
+1.5
+30
+7.07767178198537e-16
+11
+0.73370776046241
+21
+1.57547319805376
+31
+1.5
+12
+0.733707760462409
+22
+1.57547319805376
+32
+4.16333634234434e-16
+13
+0.733707760462409
+23
+1.57547319805376
+33
+4.16333634234434e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+2.04447222151364
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+1.19348975147204e-15
+12
+3.0
+22
+3.0
+32
+0.204999999999999
+13
+3.0
+23
+3.0
+33
+0.204999999999999
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.204999999999999
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+-9.71445146547012e-16
+11
+2.17907937354823
+21
+1.86297548735602
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+-1.2490009027033e-16
+13
+2.17907937354823
+23
+1.86297548735602
+33
+-1.2490009027033e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.86297548735602
+30
+1.5
+11
+2.14023160147296
+21
+1.92778907942509
+31
+-9.71445146547012e-16
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.27648079851406
+30
+-1.06858966120171e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.2368440585138
+21
+1.27648079851406
+31
+-1.06858966120171e-15
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.5
+30
+3.0
+11
+0.73
+21
+1.5
+31
+7.07767178198537e-16
+12
+1.19348975147204e-15
+22
+1.5
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+1.5
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73
+20
+1.5
+30
+7.07767178198537e-16
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.729999999999999
+20
+1.5
+30
+1.5
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.07221092057491
+21
+0.85976839852704
+31
+3.0
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.27648079851406
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+3.0
+13
+0.763155941486199
+23
+1.27648079851406
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910694
+20
+1.98848282880601
+30
+1.5
+11
+0.859768398527041
+21
+1.92778907942509
+31
+3.0
+12
+0.859768398527041
+22
+1.92778907942509
+32
+1.5
+13
+0.859768398527041
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+3.0
+11
+0.904781950910694
+21
+1.98848282880601
+31
+1.5
+12
+0.904781950910692
+22
+1.98848282880601
+32
+3.0
+13
+0.904781950910692
+23
+1.98848282880601
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+2.63677968348475e-16
+11
+0.878679656440356
+21
+0.0
+31
+0.204999999999999
+12
+0.878679656440356
+22
+0.0
+32
+-7.35522753814166e-16
+13
+0.878679656440356
+23
+0.0
+33
+-7.35522753814166e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.204999999999999
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+0.0
+33
+0.826320343559644
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.826320343559644
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+2.17367965644035
+13
+0.878679656440356
+23
+0.0
+33
+2.17367965644035
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.17367965644035
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+2.795
+13
+0.878679656440356
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.795
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+3.0
+13
+0.878679656440356
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+3.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+0.78861275996631
+21
+1.20533375707888
+31
+2.77555756156289e-17
+12
+1.19348975147204e-15
+22
+0.878679656440358
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.878679656440358
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.20533375707888
+30
+2.77555756156289e-17
+11
+1.33226762955019e-15
+21
+1.20163144893051
+31
+1.19348975147204e-15
+12
+0.7631559414862
+22
+1.27648079851406
+32
+-2.77555756156289e-17
+13
+0.7631559414862
+23
+1.27648079851406
+33
+-2.77555756156289e-17
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.27648079851406
+30
+-2.77555756156289e-17
+11
+1.33226762955019e-15
+21
+1.20163144893051
+31
+1.19348975147204e-15
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+2.14023160147296
+21
+1.92778907942509
+31
+-9.71445146547012e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+-9.71445146547012e-16
+11
+2.04447222151364
+21
+2.04447222151364
+31
+-1.11022302462516e-16
+12
+2.09521804908931
+22
+1.98848282880601
+32
+7.63278329429795e-16
+13
+2.09521804908931
+23
+1.98848282880601
+33
+7.63278329429795e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+-9.71445146547012e-16
+11
+2.21138724003369
+21
+1.79466624292112
+31
+-6.66133814775094e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+-6.66133814775094e-16
+11
+2.14023160147296
+21
+1.92778907942509
+31
+-9.71445146547012e-16
+12
+2.17907937354823
+22
+1.86297548735602
+32
+-1.2490009027033e-16
+13
+2.17907937354823
+23
+1.86297548735602
+33
+-1.2490009027033e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+-1.38777878078145e-17
+11
+0.878679656440356
+21
+0.0
+31
+-7.35522753814166e-16
+12
+0.497732043121054
+22
+0.0
+32
+1.19348975147204e-15
+13
+0.497732043121054
+23
+0.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+-7.35522753814166e-16
+11
+1.07221092057491
+21
+0.85976839852704
+31
+-1.38777878078145e-17
+12
+1.13702451264398
+22
+0.820920626451767
+32
+8.18789480661053e-16
+13
+1.13702451264398
+23
+0.820920626451767
+33
+8.18789480661053e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+-7.35522753814166e-16
+11
+1.13702451264398
+21
+0.820920626451767
+31
+8.18789480661053e-16
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+-1.2490009027033e-16
+11
+3.0
+21
+0.497732043121051
+31
+1.19348975147204e-15
+12
+2.14023160147296
+22
+1.07221092057491
+32
+-9.71445146547012e-16
+13
+2.14023160147296
+23
+1.07221092057491
+33
+-9.71445146547012e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+1.19348975147204e-15
+11
+2.17907937354823
+21
+1.13702451264398
+31
+-1.2490009027033e-16
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+-6.66133814775094e-16
+12
+3.0
+22
+0.878679656440356
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.878679656440356
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+-1.02695629777827e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+-1.38777878078145e-16
+11
+1.92778907942509
+21
+0.85976839852704
+31
+-1.02695629777827e-15
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.58206781009085e-15
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.58206781009085e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+-1.38777878078145e-16
+11
+1.65021954795242
+21
+0.744795334089513
+31
+-3.60822483003176e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+0.744795334089513
+30
+-3.60822483003176e-16
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.72351920148594
+22
+0.763155941486199
+32
+-5.27355936696949e-16
+13
+1.72351920148594
+23
+0.763155941486199
+33
+-5.27355936696949e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+-1.2490009027033e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+-6.66133814775094e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+-6.66133814775094e-16
+11
+2.25520466591049
+21
+1.34978045204758
+31
+-1.2490009027033e-15
+12
+2.2368440585138
+22
+1.27648079851406
+32
+-1.06858966120171e-15
+13
+2.2368440585138
+23
+1.27648079851406
+33
+-1.06858966120171e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.86297548735602
+30
+1.65145674912992e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.820920626451768
+21
+1.86297548735602
+31
+1.65145674912992e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.98848282880601
+30
+1.31838984174237e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.31838984174237e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.72351920148594
+30
+-2.77555756156289e-17
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.744795334089513
+22
+1.65021954795242
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.65021954795242
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.7631559414862
+21
+1.72351920148594
+31
+-2.77555756156289e-17
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+-1.4432899320127e-15
+11
+1.92778907942509
+21
+2.14023160147296
+31
+-1.02695629777827e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+-1.02695629777827e-15
+11
+1.79466624292112
+21
+2.21138724003369
+31
+-1.4432899320127e-15
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.58206781009085e-15
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.58206781009085e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+-3.60822483003176e-16
+11
+1.79466624292112
+21
+2.21138724003369
+31
+-1.4432899320127e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+-1.4432899320127e-15
+11
+1.65021954795242
+21
+2.25520466591049
+31
+-3.60822483003176e-16
+12
+1.72351920148594
+22
+2.2368440585138
+32
+-5.27355936696949e-16
+13
+1.72351920148594
+23
+2.2368440585138
+33
+-5.27355936696949e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+-5.27355936696949e-16
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+1.19348975147204e-15
+12
+1.65021954795242
+22
+0.744795334089513
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+0.744795334089513
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.72351920148594
+21
+0.763155941486199
+31
+-5.27355936696949e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+-6.80011602582908e-16
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+-6.80011602582908e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+-6.66133814775094e-16
+11
+2.25520466591049
+21
+1.65021954795242
+31
+-1.2490009027033e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+-1.2490009027033e-15
+11
+2.21138724003369
+21
+1.79466624292112
+31
+-6.66133814775094e-16
+12
+2.2368440585138
+22
+1.72351920148594
+32
+-1.06858966120171e-15
+13
+2.2368440585138
+23
+1.72351920148594
+33
+-1.06858966120171e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+-1.2490009027033e-15
+11
+2.27
+21
+1.5
+31
+-2.35922392732846e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+2.25520466591049
+21
+1.65021954795242
+31
+-1.2490009027033e-15
+12
+2.26629223953759
+22
+1.57547319805376
+32
+-1.11022302462516e-16
+13
+2.26629223953759
+23
+1.57547319805376
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.01151717119399
+21
+0.904781950910693
+31
+6.38378239159465e-16
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+6.38378239159465e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.07221092057491
+22
+0.85976839852704
+32
+-1.38777878078145e-17
+13
+1.07221092057491
+23
+0.85976839852704
+33
+-1.38777878078145e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.13702451264398
+21
+0.820920626451767
+31
+8.18789480661053e-16
+12
+1.07221092057491
+22
+0.85976839852704
+32
+-1.38777878078145e-17
+13
+1.07221092057491
+23
+0.85976839852704
+33
+-1.38777878078145e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+8.18789480661053e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.733707760462409
+21
+1.42452680194624
+31
+4.16333634234434e-16
+12
+0.73
+22
+1.5
+32
+7.07767178198537e-16
+13
+0.73
+23
+1.5
+33
+7.07767178198537e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462409
+20
+1.42452680194624
+30
+4.16333634234434e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.1518563880486e-15
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.1518563880486e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.34978045204758
+22
+0.744795334089513
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+0.744795334089513
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.7631559414862
+21
+1.27648079851406
+31
+-2.77555756156289e-17
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.27648079851406
+30
+-2.77555756156289e-17
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.78861275996631
+22
+1.20533375707888
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.20533375707888
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462409
+20
+1.57547319805376
+30
+4.16333634234434e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.73
+22
+1.5
+32
+7.07767178198537e-16
+13
+0.73
+23
+1.5
+33
+7.07767178198537e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.733707760462409
+21
+1.57547319805376
+31
+4.16333634234434e-16
+12
+0.744795334089513
+22
+1.65021954795242
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.65021954795242
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.820920626451768
+21
+1.13702451264398
+31
+1.65145674912992e-15
+12
+0.78861275996631
+22
+1.20533375707888
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.20533375707888
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.13702451264398
+30
+1.65145674912992e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.859768398527041
+22
+1.07221092057491
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.07221092057491
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+2.25520466591049
+21
+1.34978045204758
+31
+-1.2490009027033e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+-1.2490009027033e-15
+11
+2.27
+21
+1.5
+31
+-2.35922392732846e-16
+12
+2.26629223953759
+22
+1.42452680194624
+32
+-1.11022302462516e-16
+13
+2.26629223953759
+23
+1.42452680194624
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+-9.71445146547012e-16
+11
+2.04447222151364
+21
+0.955527778486358
+31
+-1.11022302462516e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+-1.11022302462516e-16
+11
+2.14023160147296
+21
+1.07221092057491
+31
+-9.71445146547012e-16
+12
+2.09521804908931
+22
+1.01151717119399
+32
+7.63278329429795e-16
+13
+2.09521804908931
+23
+1.01151717119399
+33
+7.63278329429795e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.38777878078145e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.38777878078145e-16
+12
+1.65021954795242
+22
+2.25520466591049
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+2.25520466591049
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+6.38378239159465e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.01151717119399
+21
+2.09521804908931
+31
+6.38378239159465e-16
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+8.18789480661053e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.13702451264398
+21
+2.17907937354823
+31
+8.18789480661053e-16
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+-1.11022302462516e-16
+11
+1.92778907942509
+21
+0.85976839852704
+31
+-1.02695629777827e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+-1.02695629777827e-15
+11
+2.04447222151364
+21
+0.955527778486358
+31
+-1.11022302462516e-16
+12
+1.98848282880601
+22
+0.904781950910692
+32
+-1.66533453693773e-16
+13
+1.98848282880601
+23
+0.904781950910692
+33
+-1.66533453693773e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851407
+20
+2.2368440585138
+30
+-1.80411241501588e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.27648079851407
+21
+2.2368440585138
+31
+-1.80411241501588e-16
+12
+1.34978045204758
+22
+2.25520466591049
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+2.25520466591049
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+-6.93889390390723e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.34978045204758
+22
+2.25520466591049
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+2.25520466591049
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.42452680194624
+21
+2.26629223953759
+31
+-6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+-6.66133814775094e-16
+11
+2.14023160147296
+21
+1.07221092057491
+31
+-9.71445146547012e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+-9.71445146547012e-16
+11
+2.21138724003369
+21
+1.20533375707888
+31
+-6.66133814775094e-16
+12
+2.17907937354823
+22
+1.13702451264398
+32
+-1.2490009027033e-16
+13
+2.17907937354823
+23
+1.13702451264398
+33
+-1.2490009027033e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.904781950910692
+21
+1.01151717119399
+31
+1.31838984174237e-15
+12
+0.859768398527041
+22
+1.07221092057491
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.07221092057491
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.31838984174237e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.38777878078145e-16
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.38777878078145e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.65021954795242
+22
+0.744795334089513
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+0.744795334089513
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+1.19348975147204e-15
+11
+1.20533375707888
+21
+2.21138724003369
+31
+-5.68989300120393e-16
+12
+0.878679656440358
+22
+3.0
+32
+9.29811783123569e-16
+13
+0.878679656440358
+23
+3.0
+33
+9.29811783123569e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+-5.68989300120393e-16
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+1.27648079851407
+22
+2.2368440585138
+32
+-1.80411241501588e-16
+13
+1.27648079851407
+23
+2.2368440585138
+33
+-1.80411241501588e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851407
+20
+2.2368440585138
+30
+-1.80411241501588e-16
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+1.34978045204758
+22
+2.25520466591049
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+2.25520466591049
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+0.78861275996631
+21
+1.79466624292112
+31
+2.77555756156289e-17
+12
+1.19348975147204e-15
+22
+2.12132034355964
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+2.12132034355964
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+2.77555756156289e-17
+11
+1.33226762955019e-15
+21
+2.50226795687895
+31
+1.19348975147204e-15
+12
+0.820920626451768
+22
+1.86297548735602
+32
+1.65145674912992e-15
+13
+0.820920626451768
+23
+1.86297548735602
+33
+1.65145674912992e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.86297548735602
+30
+1.65145674912992e-15
+11
+1.33226762955019e-15
+21
+2.50226795687895
+31
+1.19348975147204e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.58206781009085e-15
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.58206781009085e-15
+11
+2.12132034355964
+21
+3.0
+31
+-1.56819002228303e-15
+12
+1.92778907942509
+22
+2.14023160147296
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+2.14023160147296
+33
+-1.02695629777827e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+-1.02695629777827e-15
+11
+2.12132034355964
+21
+3.0
+31
+-1.56819002228303e-15
+12
+2.50226795687895
+22
+3.0
+32
+1.19348975147204e-15
+13
+2.50226795687895
+23
+3.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.42452680194624
+21
+0.733707760462408
+31
+-6.93889390390723e-16
+12
+1.34978045204758
+22
+0.744795334089513
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+0.744795334089513
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+0.733707760462408
+30
+-6.93889390390723e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+1.19348975147204e-15
+11
+2.2368440585138
+21
+1.72351920148594
+31
+-1.06858966120171e-15
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+-1.06858966120171e-15
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+2.25520466591049
+22
+1.65021954795242
+32
+-1.2490009027033e-15
+13
+2.25520466591049
+23
+1.65021954795242
+33
+-1.2490009027033e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+-1.2490009027033e-15
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.79836855106949
+32
+1.19348975147204e-15
+13
+3.0
+23
+1.79836855106949
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+-1.4432899320127e-15
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+-1.56819002228303e-15
+13
+2.12132034355964
+23
+3.0
+33
+-1.56819002228303e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+2.795
+12
+2.12132034355964
+22
+3.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+2.12132034355964
+22
+3.0
+32
+0.826320343559642
+13
+2.12132034355964
+23
+3.0
+33
+0.826320343559642
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559642
+12
+2.12132034355964
+22
+3.0
+32
+0.204999999999999
+13
+2.12132034355964
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+3.0
+13
+1.92778907942509
+23
+2.14023160147296
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+2.77555756156289e-16
+21
+2.50226795687895
+31
+3.0
+12
+2.77555756156289e-16
+22
+2.12132034355964
+32
+3.0
+13
+2.77555756156289e-16
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.50226795687895
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+0.820920626451767
+22
+1.86297548735602
+32
+3.0
+13
+0.820920626451767
+23
+1.86297548735602
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.50226795687895
+30
+3.0
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.859768398527041
+22
+1.92778907942509
+32
+3.0
+13
+0.859768398527041
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+3.0
+30
+-1.16573417585641e-15
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.5
+11
+1.19348975147204e-15
+21
+3.0
+31
+-1.16573417585641e-15
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+2.04447222151364
+30
+3.0
+11
+1.19348975147204e-15
+21
+3.0
+31
+-1.16573417585641e-15
+12
+2.77555756156289e-16
+22
+3.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+3.0
+11
+2.77555756156289e-16
+21
+3.0
+31
+3.0
+12
+2.77555756156289e-16
+22
+2.50226795687895
+32
+3.0
+13
+2.77555756156289e-16
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+3.0
+30
+3.0
+11
+0.859768398527041
+21
+1.92778907942509
+31
+3.0
+12
+0.904781950910692
+22
+1.98848282880601
+32
+3.0
+13
+0.904781950910692
+23
+1.98848282880601
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+3.0
+30
+3.0
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.34978045204758
+21
+2.25520466591049
+31
+3.0
+12
+1.42452680194624
+22
+2.26629223953759
+32
+3.0
+13
+1.42452680194624
+23
+2.26629223953759
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26629223953759
+21
+1.57547319805376
+31
+3.0
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+2.77555756156289e-16
+22
+0.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.205000000000001
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01151717119399
+22
+0.904781950910693
+32
+3.0
+13
+1.01151717119399
+23
+0.904781950910693
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.34978045204758
+30
+3.0
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+2.77555756156289e-16
+22
+1.20163144893051
+32
+3.0
+13
+2.77555756156289e-16
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.5
+30
+3.0
+11
+0.744795334089513
+21
+1.34978045204758
+31
+3.0
+12
+0.733707760462408
+22
+1.42452680194624
+32
+3.0
+13
+0.733707760462408
+23
+1.42452680194624
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+3.0
+13
+1.92778907942509
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+3.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.09521804908931
+21
+1.01151717119399
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+2.17367965644036
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.12132034355964
+22
+3.0
+32
+0.826320343559642
+13
+2.12132034355964
+23
+3.0
+33
+0.826320343559642
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+2.17367965644036
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+0.204999999999999
+11
+3.0
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.795
+22
+3.0
+32
+-1.16573417585641e-15
+13
+2.795
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.795
+21
+3.0
+31
+0.204999999999999
+12
+3.0
+22
+3.0
+32
+0.204999999999999
+13
+3.0
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+0.204999999999999
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+3.0
+32
+-1.56819002228303e-15
+13
+2.12132034355964
+23
+3.0
+33
+-1.56819002228303e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.795
+21
+3.0
+31
+0.204999999999999
+12
+2.795
+22
+3.0
+32
+-1.16573417585641e-15
+13
+2.795
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+0.204999999999999
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+3.0
+32
+0.204999999999999
+13
+2.12132034355964
+23
+3.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.204999999999999
+12
+2.795
+22
+3.0
+32
+0.204999999999999
+13
+2.795
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+0.204999999999999
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+0.826320343559643
+11
+1.5
+21
+3.0
+31
+0.204999999999999
+12
+0.878679656440358
+22
+3.0
+32
+0.204999999999999
+13
+0.878679656440358
+23
+3.0
+33
+0.204999999999999
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.878679656440357
+21
+3.0
+31
+2.17367965644036
+12
+0.878679656440357
+22
+3.0
+32
+2.795
+13
+0.878679656440357
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+0.826320343559643
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+0.204999999999999
+13
+1.5
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.878679656440358
+21
+3.0
+31
+0.826320343559643
+12
+0.878679656440357
+22
+3.0
+32
+2.17367965644036
+13
+0.878679656440357
+23
+3.0
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+0.204999999999999
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+0.878679656440358
+22
+3.0
+32
+9.29811783123569e-16
+13
+0.878679656440358
+23
+3.0
+33
+9.29811783123569e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+1.19348975147204e-15
+11
+1.5
+21
+3.0
+31
+0.204999999999999
+12
+1.5
+22
+3.0
+32
+6.93889390390723e-16
+13
+1.5
+23
+3.0
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+0.204999999999999
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+0.878679656440358
+22
+3.0
+32
+0.204999999999999
+13
+0.878679656440358
+23
+3.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.204999999999999
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+-6.80011602582908e-16
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+-6.80011602582908e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.5
+21
+0.0
+31
+0.204999999999999
+12
+1.5
+22
+0.0
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.0
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+0.204999999999999
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+0.204999999999999
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.795
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.826320343559641
+11
+1.5
+21
+0.0
+31
+0.204999999999999
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+0.204999999999999
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+0.204999999999999
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.17367965644035
+11
+0.205000000000001
+21
+0.0
+31
+1.5
+12
+0.878679656440356
+22
+0.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+0.0
+33
+0.826320343559644
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+3.0
+11
+1.19348975147204e-15
+21
+0.0
+31
+2.795
+12
+0.205000000000001
+22
+0.0
+32
+2.795
+13
+0.205000000000001
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+2.795
+11
+0.205000000000001
+21
+0.0
+31
+3.0
+12
+2.77555756156289e-16
+22
+0.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+1.5
+11
+1.19348975147204e-15
+21
+0.0
+31
+0.204999999999999
+12
+0.205000000000001
+22
+0.0
+32
+0.204999999999999
+13
+0.205000000000001
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+0.204999999999999
+11
+0.205000000000001
+21
+0.0
+31
+1.5
+12
+1.19348975147204e-15
+22
+0.0
+32
+1.5
+13
+1.19348975147204e-15
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+0.204999999999999
+11
+1.19348975147204e-15
+21
+0.0
+31
+-1.16573417585641e-15
+12
+0.205000000000001
+22
+0.0
+32
+-1.16573417585641e-15
+13
+0.205000000000001
+23
+0.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+-1.16573417585641e-15
+11
+0.205000000000001
+21
+0.0
+31
+0.204999999999999
+12
+1.19348975147204e-15
+22
+0.0
+32
+0.204999999999999
+13
+1.19348975147204e-15
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+3.0
+11
+0.205000000000001
+21
+0.0
+31
+2.795
+12
+0.878679656440356
+22
+0.0
+32
+2.795
+13
+0.878679656440356
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+2.795
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+0.205000000000001
+22
+0.0
+32
+3.0
+13
+0.205000000000001
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+3.0
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.204999999999999
+11
+0.497732043121054
+21
+0.0
+31
+1.19348975147204e-15
+12
+0.878679656440356
+22
+0.0
+32
+-7.35522753814166e-16
+13
+0.878679656440356
+23
+0.0
+33
+-7.35522753814166e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.497732043121054
+20
+0.0
+30
+1.19348975147204e-15
+11
+0.205000000000001
+21
+0.0
+31
+0.204999999999999
+12
+0.205000000000001
+22
+0.0
+32
+-1.16573417585641e-15
+13
+0.205000000000001
+23
+0.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+0.204999999999999
+11
+0.497732043121054
+21
+0.0
+31
+1.19348975147204e-15
+12
+0.878679656440356
+22
+0.0
+32
+0.204999999999999
+13
+0.878679656440356
+23
+0.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.17367965644035
+11
+0.205000000000001
+21
+0.0
+31
+2.795
+12
+0.205000000000001
+22
+0.0
+32
+1.5
+13
+0.205000000000001
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+2.795
+11
+0.878679656440356
+21
+0.0
+31
+2.17367965644035
+12
+0.878679656440356
+22
+0.0
+32
+2.795
+13
+0.878679656440356
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.826320343559644
+11
+0.205000000000001
+21
+0.0
+31
+0.204999999999999
+12
+0.878679656440356
+22
+0.0
+32
+0.204999999999999
+13
+0.878679656440356
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+0.204999999999999
+11
+0.878679656440356
+21
+0.0
+31
+0.826320343559644
+12
+0.205000000000001
+22
+0.0
+32
+1.5
+13
+0.205000000000001
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+5.55111512312578e-17
+31
+2.17367965644036
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.795
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+1.5
+13
+1.92778907942509
+23
+0.85976839852704
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910692
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910692
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+0.955527778486358
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.20736753927986e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451766
+21
+1.86297548735602
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.86297548735602
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.859768398527041
+22
+1.92778907942509
+32
+1.5
+13
+0.859768398527041
+23
+1.92778907942509
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.904781950910694
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910694
+23
+1.98848282880601
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910694
+20
+1.98848282880601
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.78861275996631
+21
+1.79466624292112
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+15
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+1.5
+13
+1.07221092057491
+23
+2.14023160147296
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.34978045204758
+21
+0.744795334089513
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+1.5
+13
+1.42452680194624
+23
+0.733707760462408
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.20533375707888
+21
+2.21138724003369
+31
+-5.68989300120393e-16
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.5
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+1.5
+13
+1.98848282880601
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.5
+21
+0.73
+31
+1.5
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+2.27
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.13702451264398
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451766
+21
+1.13702451264398
+31
+1.5
+12
+0.859768398527041
+22
+1.07221092057491
+32
+1.5
+13
+0.859768398527041
+23
+1.07221092057491
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.859768398527041
+21
+1.07221092057491
+31
+1.5
+12
+0.904781950910694
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910694
+23
+1.01151717119399
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.904781950910694
+21
+1.01151717119399
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.20533375707888
+21
+0.788612759966309
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+-1.4432899320127e-15
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910693
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.07221092057491
+21
+0.85976839852704
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+1.5
+13
+1.13702451264398
+23
+0.820920626451767
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.04447222151364
+22
+2.04447222151364
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+2.04447222151364
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.73370776046241
+21
+1.57547319805376
+31
+1.5
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.57547319805376
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.65021954795242
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.72351920148594
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.98848282880601
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+15
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+0.78861275996631
+21
+1.20533375707888
+31
+2.77555756156289e-17
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+12
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.42452680194624
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.73370776046241
+21
+1.42452680194624
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.744795334089513
+21
+1.34978045204758
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.763155941486199
+21
+1.27648079851406
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.2368440585138
+21
+1.27648079851406
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.25520466591049
+21
+1.34978045204758
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.729999999999999
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.73
+22
+1.5
+32
+7.07767178198537e-16
+13
+0.73
+23
+1.5
+33
+7.07767178198537e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.729999999999999
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+-2.35922392732846e-16
+13
+2.27
+23
+1.5
+33
+-2.35922392732846e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+2.545
+21
+0.25
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.545
+20
+0.25
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.0225
+22
+0.25
+32
+2.0225
+13
+2.0225
+23
+0.25
+33
+2.0225
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.25
+31
+0.455
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.25
+30
+0.455
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.0225
+22
+0.25
+32
+0.9775
+13
+2.0225
+23
+0.25
+33
+0.9775
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.9775
+20
+0.25
+30
+2.0225
+11
+1.5
+21
+0.0
+31
+2.795
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.9775
+21
+0.25
+31
+2.0225
+12
+1.5
+22
+0.25
+32
+2.545
+13
+1.5
+23
+0.25
+33
+2.545
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.9775
+20
+0.25
+30
+0.9775
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.9775
+21
+0.25
+31
+0.9775
+12
+0.454999999999999
+22
+0.25
+32
+1.5
+13
+0.454999999999999
+23
+0.25
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+2.12132034355964
+21
+0.0
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+0.0
+32
+0.0
+13
+2.50226795687895
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+0.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.0
+21
+0.878679656440357
+31
+0.0
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121051
+32
+0.0
+13
+3.0
+23
+0.497732043121051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+0.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.25
+30
+0.455
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.25
+31
+0.455
+12
+0.9775
+22
+0.25
+32
+0.9775
+13
+0.9775
+23
+0.25
+33
+0.9775
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.25
+30
+2.545
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+0.25
+31
+2.545
+12
+2.0225
+22
+0.25
+32
+2.0225
+13
+2.0225
+23
+0.25
+33
+2.0225
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.0225
+21
+0.25
+31
+0.9775
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.0225
+20
+0.25
+30
+0.9775
+11
+2.795
+21
+0.0
+31
+1.5
+12
+2.545
+22
+0.25
+32
+1.5
+13
+2.545
+23
+0.25
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.454999999999999
+20
+0.25
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+0.454999999999999
+21
+0.25
+31
+1.5
+12
+0.9775
+22
+0.25
+32
+2.0225
+13
+0.9775
+23
+0.25
+33
+2.0225
+70
+1
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+2.795
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.7325
+22
+0.0625
+32
+1.5
+13
+2.7325
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+1.5
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+2.7325
+21
+0.0625
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+2.7325
+20
+0.0625
+30
+1.5
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.7325
+21
+0.0625
+31
+1.5
+12
+1.5
+22
+0.0625
+32
+2.7325
+13
+1.5
+23
+0.0625
+33
+2.7325
+70
+1
+ 0
+3DFACE
+ 8
+lid_c
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.7325
+21
+0.0625000000000004
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+2.7325
+20
+0.0625000000000004
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+2.795
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_c
+10
+2.795
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+2.7325
+22
+0.0625000000000004
+32
+1.5
+13
+2.7325
+23
+0.0625000000000004
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_d
+10
+0.205
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.2675
+21
+0.0625
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+1.5
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+0.205
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.2675
+21
+0.0625
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_a
+10
+0.2675
+20
+0.0625
+30
+1.5
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0625
+32
+2.7325
+13
+1.5
+23
+0.0625
+33
+2.7325
+70
+1
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+1.5
+21
+0.0
+31
+1.5
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.58220277009702
+21
+1.5
+31
+1.1985054650771
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.61135857342883
+21
+3.0
+31
+1.20801452412167
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.5
+30
+-6.93889390390723e-17
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.295
+21
+1.5
+31
+-6.93889390390723e-17
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.50885609734932
+20
+1.5
+30
+1.81237448605758
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.295
+21
+1.5
+31
+3.0
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+12
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.68090954183794
+21
+1.5
+31
+1.7548097087475
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.65506269396675
+21
+1.5
+31
+1.77131496630259
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.62772250758676
+21
+1.5
+31
+1.78520731241634
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.59915228363849
+21
+1.5
+31
+1.79635295620134
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.56962716899663
+21
+1.5
+31
+1.80464455901512
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.53943150665524
+21
+1.5
+31
+1.81000226818992
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.71461991087043
+21
+1.5
+31
+1.27285567614847
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.52180460101532
+22
+1.5
+32
+1.18826163313676
+13
+1.52180460101532
+23
+1.5
+33
+1.18826163313676
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+1.28416666666667
+13
+2.1475
+23
+1.5
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.19319581865357
+31
+-2.75981973074096e-17
+12
+1.295
+22
+1.295
+32
+-2.99528920185329e-17
+13
+1.295
+23
+1.295
+33
+-2.99528920185329e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.56962716899663
+20
+1.5
+30
+1.80464455901512
+11
+1.53943150665524
+21
+3.0
+31
+1.81000226818992
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.53943150665524
+20
+3.0
+30
+1.81000226818992
+11
+1.56962716899663
+21
+1.5
+31
+1.80464455901512
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.68090954183794
+20
+1.5
+30
+1.7548097087475
+11
+1.65506269396675
+21
+3.0
+31
+1.77131496630259
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.65506269396675
+20
+3.0
+30
+1.77131496630259
+11
+1.68090954183794
+21
+1.5
+31
+1.7548097087475
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.52180460101532
+21
+3.0
+31
+1.18826163313676
+12
+1.52180460101532
+22
+1.5
+32
+1.18826163313676
+13
+1.52180460101532
+23
+1.5
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+1.71583333333333
+21
+1.5
+31
+1.72547110140021
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+1.72547110140021
+11
+1.71583333333333
+21
+3.0
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.55225530915257
+21
+1.5
+31
+1.19189996321751
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.58220277009702
+21
+3.0
+31
+1.1985054650771
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+1.71583333333333
+11
+1.71583333333333
+21
+3.0
+31
+2.1475
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+2.1475
+22
+3.0
+32
+1.71583333333333
+13
+2.1475
+23
+3.0
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.63944193282374
+21
+1.5
+31
+1.22033556291445
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.66618239017884
+21
+3.0
+31
+1.23534992311649
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.66618239017884
+21
+1.5
+31
+1.23534992311649
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.69132242027198
+21
+3.0
+31
+1.25291300823137
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.27285567614847
+11
+1.69132242027198
+21
+1.5
+31
+1.25291300823137
+12
+1.69132242027198
+22
+3.0
+32
+1.25291300823137
+13
+1.69132242027198
+23
+3.0
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.71461991087043
+21
+3.0
+31
+1.27285567614847
+12
+1.71461991087043
+22
+1.5
+32
+1.27285567614847
+13
+1.71461991087043
+23
+1.5
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+1.28416666666667
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+1.28416666666667
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+1.28416666666667
+13
+2.1475
+23
+3.0
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+1.71583333333333
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+2.1475
+22
+3.0
+32
+1.71583333333333
+13
+2.1475
+23
+3.0
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.53943150665524
+20
+1.5
+30
+1.81000226818992
+11
+1.50885609734932
+21
+3.0
+31
+1.81237448605758
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.50885609734932
+20
+3.0
+30
+1.81237448605758
+11
+1.53943150665524
+21
+1.5
+31
+1.81000226818992
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.50885609734932
+20
+1.5
+30
+1.81237448605758
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.50885609734932
+21
+1.5
+31
+1.81237448605758
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.62772250758676
+20
+1.5
+30
+1.78520731241634
+11
+1.59915228363849
+21
+3.0
+31
+1.79635295620134
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.59915228363849
+20
+3.0
+30
+1.79635295620134
+11
+1.62772250758676
+21
+1.5
+31
+1.78520731241634
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.59915228363849
+20
+1.5
+30
+1.79635295620134
+11
+1.56962716899663
+21
+3.0
+31
+1.80464455901512
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.56962716899663
+20
+3.0
+30
+1.80464455901512
+11
+1.59915228363849
+21
+1.5
+31
+1.79635295620134
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.65506269396675
+20
+1.5
+30
+1.77131496630259
+11
+1.62772250758676
+21
+3.0
+31
+1.78520731241634
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.62772250758676
+20
+3.0
+30
+1.78520731241634
+11
+1.65506269396675
+21
+1.5
+31
+1.77131496630259
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.52180460101532
+21
+1.5
+31
+1.18826163313676
+12
+1.52180460101532
+22
+3.0
+32
+1.18826163313676
+13
+1.52180460101532
+23
+3.0
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.55225530915257
+21
+3.0
+31
+1.19189996321751
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.54077703531283
+30
+3.0
+11
+2.1475
+21
+1.5
+31
+2.1475
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+2.1475
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.99491378028649
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+2.2311863483779
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+2.5306045958858
+31
+3.0
+12
+1.295
+22
+3.0
+32
+3.0
+13
+1.295
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+1.28416666666667
+13
+2.1475
+23
+1.5
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+2.1475
+21
+3.0
+31
+1.28416666666667
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.68090954183794
+21
+3.0
+31
+1.7548097087475
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.68090954183794
+20
+3.0
+30
+1.7548097087475
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.70501413192602
+22
+3.0
+32
+1.73585049440402
+13
+1.70501413192602
+23
+3.0
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.61135857342883
+21
+1.5
+31
+1.20801452412167
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.63944193282374
+21
+3.0
+31
+1.22033556291445
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.27285567614847
+11
+1.71583333333333
+21
+1.5
+31
+1.27412051524007
+12
+1.71461991087043
+22
+1.5
+32
+1.27285567614847
+13
+1.71461991087043
+23
+1.5
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+1.27412051524007
+11
+1.71461991087043
+21
+3.0
+31
+1.27285567614847
+12
+1.71583333333333
+22
+3.0
+32
+1.27412051524007
+13
+1.71583333333333
+23
+3.0
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+1.72547110140021
+11
+1.70501413192602
+21
+3.0
+31
+1.73585049440402
+12
+1.70501413192602
+22
+1.5
+32
+1.73585049440402
+13
+1.70501413192602
+23
+1.5
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.71583333333333
+21
+1.5
+31
+1.72547110140021
+12
+1.71461991087043
+22
+3.0
+32
+1.72547110140021
+13
+1.71461991087043
+23
+3.0
+33
+1.72547110140021
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+1.71583333333333
+21
+1.5
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.295
+21
+1.54077703531283
+31
+-3.67694180123813e-17
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.54077703531283
+30
+-3.67694180123813e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.58491378028649
+32
+-3.90153260770453e-17
+13
+1.295
+23
+1.58491378028649
+33
+-3.90153260770453e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.58491378028649
+30
+-3.90153260770453e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.63697662077346
+32
+-4.16645552711963e-17
+13
+1.295
+23
+1.63697662077346
+33
+-4.16645552711963e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.63697662077346
+30
+-4.16645552711963e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.705
+32
+-4.51259400217434e-17
+13
+1.295
+23
+1.705
+33
+-4.51259400217434e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.705
+30
+-4.51259400217434e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.80680418134643
+32
+-5.03062683862146e-17
+13
+1.295
+23
+1.80680418134643
+33
+-5.03062683862146e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.80680418134643
+30
+-5.03062683862146e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.99491378028649
+32
+-5.98782670814598e-17
+13
+1.295
+23
+1.99491378028649
+33
+-5.98782670814598e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.99491378028649
+30
+-5.98782670814598e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+2.2311863483779
+32
+-7.19010491523201e-17
+13
+1.295
+23
+2.2311863483779
+33
+-7.19010491523201e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.2311863483779
+30
+-7.19010491523201e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+2.5306045958858
+32
+-8.71370131362283e-17
+13
+1.295
+23
+2.5306045958858
+33
+-8.71370131362283e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.5306045958858
+30
+-8.71370131362283e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+3.0
+32
+-2.22044604925031e-16
+13
+1.295
+23
+3.0
+33
+-2.22044604925031e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+3.0
+30
+-2.22044604925031e-16
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.295
+31
+-2.99528920185329e-17
+12
+1.295
+22
+1.36302337922654
+32
+-3.1526248723327e-17
+13
+1.295
+23
+1.36302337922654
+33
+-3.1526248723327e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.45922296468717
+31
+-3.37513111136975e-17
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.80680418134643
+31
+-5.03062683862146e-17
+12
+1.295
+22
+1.99491378028649
+32
+-5.98782670814598e-17
+13
+1.295
+23
+1.99491378028649
+33
+-5.98782670814598e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.41508621971352
+31
+-3.27304438115775e-17
+12
+1.295
+22
+1.45922296468717
+32
+-3.37513111136975e-17
+13
+1.295
+23
+1.45922296468717
+33
+-3.37513111136975e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.5
+31
+-6.93889390390723e-17
+12
+1.295
+22
+1.54077703531283
+32
+-3.67694180123813e-17
+13
+1.295
+23
+1.54077703531283
+33
+-3.67694180123813e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+0.0
+11
+1.295
+21
+2.2311863483779
+31
+-7.19010491523201e-17
+12
+1.295
+22
+2.5306045958858
+32
+-8.71370131362283e-17
+13
+1.295
+23
+2.5306045958858
+33
+-8.71370131362283e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+0.0
+11
+1.295
+21
+1.99491378028649
+31
+-5.98782670814598e-17
+12
+1.295
+22
+2.2311863483779
+32
+-7.19010491523201e-17
+13
+1.295
+23
+2.2311863483779
+33
+-7.19010491523201e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.99491378028649
+30
+-5.98782670814598e-17
+11
+1.35173135526774
+21
+2.24539681310646
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.58491378028649
+31
+-3.90153260770453e-17
+12
+1.295
+22
+1.63697662077346
+32
+-4.16645552711963e-17
+13
+1.295
+23
+1.63697662077346
+33
+-4.16645552711963e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.63697662077346
+31
+-4.16645552711963e-17
+12
+1.295
+22
+1.705
+32
+-4.51259400217434e-17
+13
+1.295
+23
+1.705
+33
+-4.51259400217434e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121052
+32
+0.0
+13
+3.0
+23
+0.497732043121052
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.295
+21
+2.5306045958858
+31
+-8.71370131362283e-17
+12
+1.295
+22
+3.0
+32
+-2.22044604925031e-16
+13
+1.295
+23
+3.0
+33
+-2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.5306045958858
+30
+-8.71370131362283e-17
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+0.0
+11
+1.295
+21
+0.0
+31
+0.0
+12
+1.295
+22
+0.469395404114199
+32
+-1.0856949693767e-17
+13
+1.295
+23
+0.469395404114199
+33
+-1.0856949693767e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893546
+31
+0.0
+12
+1.5
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893546
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.79836855106949
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.705
+31
+-4.51259400217434e-17
+12
+1.295
+22
+1.80680418134643
+32
+-5.03062683862146e-17
+13
+1.295
+23
+1.80680418134643
+33
+-5.03062683862146e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.36302337922654
+31
+-3.1526248723327e-17
+12
+1.295
+22
+1.41508621971352
+32
+-3.27304438115775e-17
+13
+1.295
+23
+1.41508621971352
+33
+-3.27304438115775e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+0.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+4.44089209850063e-16
+32
+0.0
+13
+2.50226795687895
+23
+4.44089209850063e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+0.0
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+0.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.795
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+0.0
+11
+1.295
+21
+0.469395404114199
+31
+-1.0856949693767e-17
+12
+1.295
+22
+0.768813651622095
+32
+-1.77823878682707e-17
+13
+1.295
+23
+0.768813651622095
+33
+-1.77823878682707e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+0.768813651622095
+31
+-1.77823878682707e-17
+12
+1.295
+22
+1.00508621971351
+32
+-2.32472888095709e-17
+13
+1.295
+23
+1.00508621971351
+33
+-2.32472888095709e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+0.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+0.0
+11
+1.98213889596437
+21
+0.912512055444321
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+0.754603186893546
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+0.754603186893546
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+0.797851555291423
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+0.797851555291423
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+0.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.98213889596437
+22
+0.912512055444321
+32
+0.0
+13
+1.98213889596437
+23
+0.912512055444321
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.00508621971351
+31
+-2.32472888095709e-17
+12
+1.295
+22
+1.19319581865357
+32
+-2.75981973074096e-17
+13
+1.295
+23
+1.19319581865357
+33
+-2.75981973074096e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.54077703531283
+31
+-3.67694180123813e-17
+12
+1.295
+22
+1.58491378028649
+32
+-3.90153260770453e-17
+13
+1.295
+23
+1.58491378028649
+33
+-3.90153260770453e-17
+70
+0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.295
+22
+1.45922296468717
+32
+3.0
+13
+1.295
+23
+1.45922296468717
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+3.0
+11
+1.295
+21
+2.5306045958858
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+2.2311863483779
+31
+3.0
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.2311863483779
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.36302337922654
+31
+3.0
+12
+1.295
+22
+1.295
+32
+3.0
+13
+1.295
+23
+1.295
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+3.0
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.0
+32
+3.0
+13
+1.295
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.469395404114199
+30
+3.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+3.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.5
+22
+0.740000000000001
+32
+3.0
+13
+1.5
+23
+0.740000000000001
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.41508621971352
+31
+3.0
+12
+1.295
+22
+1.36302337922654
+32
+3.0
+13
+1.295
+23
+1.36302337922654
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.295
+31
+3.0
+12
+1.295
+22
+1.19319581865357
+32
+3.0
+13
+1.295
+23
+1.19319581865357
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121052
+32
+3.0
+13
+3.0
+23
+0.497732043121052
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121052
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121052
+31
+3.0
+12
+3.0
+22
+0.878679656440358
+32
+3.0
+13
+3.0
+23
+0.878679656440358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+1.295
+22
+1.54077703531283
+32
+3.0
+13
+1.295
+23
+1.54077703531283
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.45922296468717
+31
+3.0
+12
+1.295
+22
+1.41508621971352
+32
+3.0
+13
+1.295
+23
+1.41508621971352
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.19319581865357
+31
+3.0
+12
+1.295
+22
+1.00508621971351
+32
+3.0
+13
+1.295
+23
+1.00508621971351
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+3.0
+11
+1.295
+21
+0.768813651622095
+31
+3.0
+12
+1.295
+22
+0.469395404114199
+32
+3.0
+13
+1.295
+23
+0.469395404114199
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.99491378028649
+31
+3.0
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+3.0
+11
+1.295
+21
+3.0
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310646
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310646
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+3.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+3.0
+12
+2.50226795687895
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.50226795687895
+23
+4.44089209850063e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+3.0
+11
+1.98213889596437
+21
+0.912512055444321
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+3.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+3.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+3.0
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+0.768813651622095
+32
+3.0
+13
+1.295
+23
+0.768813651622095
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.00508621971351
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893546
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+0.797851555291423
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+3.0
+11
+1.5
+21
+0.740000000000001
+31
+3.0
+12
+1.5
+22
+4.9960036108132e-16
+32
+3.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.740000000000001
+32
+3.0
+13
+1.5
+23
+0.740000000000001
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+0.740000000000001
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+3.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+3.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.912512055444321
+32
+3.0
+13
+1.98213889596437
+23
+0.912512055444321
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.98213889596437
+21
+0.912512055444321
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+0.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.79836855106949
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.5
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.295
+22
+0.0
+32
+0.0
+13
+1.295
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.295
+22
+0.0
+32
+3.0
+13
+1.295
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.50226795687895
+23
+4.44089209850063e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+3.0
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+3.0
+12
+1.79836855106949
+22
+4.9960036108132e-16
+32
+3.0
+13
+1.79836855106949
+23
+4.9960036108132e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.5
+22
+4.9960036108132e-16
+32
+3.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.469395404114199
+30
+3.0
+11
+1.295
+21
+0.0
+31
+0.0
+12
+1.295
+22
+0.0
+32
+3.0
+13
+1.295
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+0.0
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.469395404114199
+32
+-1.0856949693767e-17
+13
+1.295
+23
+0.469395404114199
+33
+-1.0856949693767e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.469395404114199
+30
+-1.0856949693767e-17
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.768813651622095
+32
+-1.77823878682707e-17
+13
+1.295
+23
+0.768813651622095
+33
+-1.77823878682707e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.768813651622095
+32
+3.0
+13
+1.295
+23
+0.768813651622095
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.295
+21
+0.768813651622095
+31
+3.0
+12
+1.295
+22
+1.00508621971351
+32
+3.0
+13
+1.295
+23
+1.00508621971351
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+1.00508621971351
+32
+-2.32472888095709e-17
+13
+1.295
+23
+1.00508621971351
+33
+-2.32472888095709e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.00508621971351
+30
+-2.32472888095709e-17
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+1.19319581865357
+32
+-2.75981973074096e-17
+13
+1.295
+23
+1.19319581865357
+33
+-2.75981973074096e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.19319581865357
+30
+-2.75981973074096e-17
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+1.19319581865357
+32
+3.0
+13
+1.295
+23
+1.19319581865357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.19319581865357
+30
+-2.75981973074096e-17
+11
+1.295
+21
+1.19319581865357
+31
+3.0
+12
+1.295
+22
+1.295
+32
+-2.99528920185329e-17
+13
+1.295
+23
+1.295
+33
+-2.99528920185329e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.295
+30
+-2.99528920185329e-17
+11
+1.295
+21
+1.19319581865357
+31
+3.0
+12
+1.295
+22
+1.295
+32
+3.0
+13
+1.295
+23
+1.295
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.295
+30
+-2.99528920185329e-17
+11
+1.295
+21
+1.295
+31
+3.0
+12
+1.295
+22
+1.36302337922654
+32
+-3.1526248723327e-17
+13
+1.295
+23
+1.36302337922654
+33
+-3.1526248723327e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.36302337922654
+30
+-3.1526248723327e-17
+11
+1.295
+21
+1.295
+31
+3.0
+12
+1.295
+22
+1.36302337922654
+32
+3.0
+13
+1.295
+23
+1.36302337922654
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.36302337922654
+30
+-3.1526248723327e-17
+11
+1.295
+21
+1.36302337922654
+31
+3.0
+12
+1.295
+22
+1.41508621971352
+32
+3.0
+13
+1.295
+23
+1.41508621971352
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.36302337922654
+30
+-3.1526248723327e-17
+11
+1.295
+21
+1.41508621971352
+31
+3.0
+12
+1.295
+22
+1.41508621971352
+32
+-3.27304438115775e-17
+13
+1.295
+23
+1.41508621971352
+33
+-3.27304438115775e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.41508621971352
+30
+-3.27304438115775e-17
+11
+1.295
+21
+1.41508621971352
+31
+3.0
+12
+1.295
+22
+1.45922296468717
+32
+3.0
+13
+1.295
+23
+1.45922296468717
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.41508621971352
+30
+-3.27304438115775e-17
+11
+1.295
+21
+1.45922296468717
+31
+3.0
+12
+1.295
+22
+1.45922296468717
+32
+-3.37513111136975e-17
+13
+1.295
+23
+1.45922296468717
+33
+-3.37513111136975e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.45922296468717
+30
+-3.37513111136975e-17
+11
+1.295
+21
+1.45922296468717
+31
+3.0
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.45922296468717
+30
+-3.37513111136975e-17
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.295
+22
+3.0
+32
+3.0
+13
+1.295
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.295
+22
+3.0
+32
+-2.22044604925031e-16
+13
+1.295
+23
+3.0
+33
+-2.22044604925031e-16
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+1.5
+13
+2.1475
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+1.28416666666667
+12
+2.1475
+22
+3.0
+32
+1.5
+13
+2.1475
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.5
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.71461991087043
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+1.28416666666667
+13
+2.1475
+23
+3.0
+33
+1.28416666666667
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+1.71461991087043
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+1.5
+13
+2.1475
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+3.0
+32
+1.27412051524007
+13
+1.71583333333333
+23
+3.0
+33
+1.27412051524007
+70
+12
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+2.1475
+21
+3.0
+31
+1.5
+12
+1.71461991087043
+22
+3.0
+32
+1.5
+13
+1.71461991087043
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.5
+11
+1.71461991087043
+21
+3.0
+31
+1.72547110140021
+12
+2.1475
+22
+3.0
+32
+1.71583333333333
+13
+2.1475
+23
+3.0
+33
+1.71583333333333
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+1.71461991087043
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.52180460101532
+21
+3.0
+31
+1.18826163313676
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.69132242027198
+22
+3.0
+32
+1.25291300823137
+13
+1.69132242027198
+23
+3.0
+33
+1.25291300823137
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.71461991087043
+21
+3.0
+31
+1.72547110140021
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.70501413192602
+22
+3.0
+32
+1.73585049440402
+13
+1.70501413192602
+23
+3.0
+33
+1.73585049440402
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.68090954183794
+20
+3.0
+30
+1.7548097087475
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.65506269396675
+20
+3.0
+30
+1.77131496630259
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.62772250758676
+20
+3.0
+30
+1.78520731241634
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.59915228363849
+20
+3.0
+30
+1.79635295620134
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.56962716899663
+20
+3.0
+30
+1.80464455901512
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.53943150665524
+20
+3.0
+30
+1.81000226818992
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+1.71461991087043
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.5
+11
+1.71461991087043
+21
+3.0
+31
+1.27285567614847
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121052
+32
+3.0
+13
+3.0
+23
+0.497732043121052
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440358
+32
+3.0
+13
+3.0
+23
+0.878679656440358
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440358
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+0.982
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.53125
+22
+3.0
+32
+1.17375
+13
+0.53125
+23
+3.0
+33
+1.17375
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.64381364161549
+32
+3.0
+13
+0.777
+23
+1.64381364161549
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.79947640559575
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.22044604925031e-16
+12
+1.295
+22
+0.0
+32
+2.22044604925031e-16
+13
+1.295
+23
+0.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+2.22044604925031e-16
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+0.205
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+1.5
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+2.795
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.723
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.723
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.53125
+22
+1.5
+32
+2.018
+13
+0.53125
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.53125
+21
+3.0
+31
+2.018
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.205
+22
+3.0
+32
+3.0
+13
+0.205
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.82625
+11
+0.796875
+21
+3.0
+31
+1.5
+12
+0.53125
+22
+3.0
+32
+1.5
+13
+0.53125
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.5
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.723000000000001
+22
+3.0
+32
+2.018
+13
+0.723000000000001
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.723
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.982
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.982
+11
+0.723
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.723
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+0.982
+13
+0.796875
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+1.295
+21
+0.0
+31
+3.0
+12
+1.295
+22
+0.0
+32
+2.22044604925031e-16
+13
+1.295
+23
+0.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+3.0
+11
+1.295
+21
+1.5
+31
+1.52655665885959e-16
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.776999999999999
+21
+1.98309315521565
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.79947640559575
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.79947640559575
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+0.205
+32
+2.22044604925031e-16
+13
+0.0
+23
+0.205
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.53125
+21
+1.5
+31
+0.982
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.0
+21
+2.277
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+2.795
+32
+2.277
+13
+0.0
+23
+2.795
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.205
+22
+3.0
+32
+2.277
+13
+0.205
+23
+3.0
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.5
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+0.796875
+21
+3.0
+31
+1.5
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.79947640559575
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.777
+21
+1.79947640559575
+31
+3.0
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+0.982
+11
+0.796875
+21
+1.5
+31
+1.241
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+1.241
+11
+0.796875
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.759
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.277
+13
+0.0
+23
+2.795
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.277
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.259
+22
+3.0
+32
+3.0
+13
+0.259
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+3.0
+11
+0.259
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.518
+22
+3.0
+32
+3.0
+13
+0.518
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.17375
+11
+0.723
+21
+3.0
+31
+0.982
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.018
+13
+0.53125
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+2.018
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.723000000000001
+22
+3.0
+32
+2.018
+13
+0.723000000000001
+23
+3.0
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+2.22044604925031e-16
+13
+0.0
+23
+2.795
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+2.22044604925031e-16
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.0
+21
+2.795
+31
+2.22044604925031e-16
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.0
+22
+3.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+3.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.82625
+11
+0.53125
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.777
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.64381364161549
+32
+3.0
+13
+0.777
+23
+1.64381364161549
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.17375
+11
+0.796875
+21
+3.0
+31
+0.982
+12
+0.723
+22
+3.0
+32
+0.982
+13
+0.723
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+1.17375
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+0.53125
+21
+3.0
+31
+1.17375
+12
+0.53125
+22
+3.0
+32
+1.5
+13
+0.53125
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+0.53125
+21
+3.0
+31
+1.5
+12
+0.796875
+22
+3.0
+32
+1.5
+13
+0.796875
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+0.776999999999999
+21
+2.58204596640715
+31
+4.44089209850063e-17
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.0
+21
+2.795
+31
+0.723
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.0
+22
+2.277
+32
+0.723
+13
+0.0
+23
+2.277
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.723
+13
+0.53125
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.723
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.82625
+11
+0.205
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+2.018
+11
+0.205
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.277
+12
+0.205
+22
+3.0
+32
+2.277
+13
+0.205
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.98309315521565
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.223
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.223
+33
+4.44089209850063e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+2.58204596640715
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+3.0
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+3.0
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.0
+21
+2.795
+31
+2.22044604925031e-16
+12
+0.0
+22
+3.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+3.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.0
+22
+3.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+3.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.0
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.259
+22
+3.0
+32
+3.0
+13
+0.259
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.259
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.5
+11
+0.53125
+21
+3.0
+31
+1.17375
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+2.277
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+2.277
+31
+2.277
+12
+0.0
+22
+2.795
+32
+2.277
+13
+0.0
+23
+2.795
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+2.22044604925031e-16
+12
+0.0
+22
+0.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+0.0
+33
+2.22044604925031e-16
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+0.796875
+21
+1.5
+31
+1.241
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+1.241
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+0.518
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.518
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.58204596640715
+31
+3.0
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.5
+12
+0.796875
+22
+3.0
+32
+1.5
+13
+0.796875
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.5
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.018
+13
+0.53125
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+1.295
+21
+1.5
+31
+1.52655665885959e-16
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+2.277
+31
+0.723
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+0.723
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+0.723
+13
+0.0
+23
+2.795
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+2.277
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+3.0
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+3.0
+11
+1.295
+21
+0.0
+31
+3.0
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+0.0
+21
+0.205
+31
+2.22044604925031e-16
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.0
+22
+0.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+0.0
+33
+2.22044604925031e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+1.295
+22
+0.0
+32
+2.22044604925031e-16
+13
+1.295
+23
+0.0
+33
+2.22044604925031e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.295
+21
+1.705
+31
+6.58963624407723e-17
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+6.58963624407723e-17
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+6.58963624407723e-17
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.295
+22
+1.80680418134643
+32
+6.07160340763011e-17
+13
+1.295
+23
+1.80680418134643
+33
+6.07160340763011e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.464
+13
+0.0
+23
+3.0
+33
+0.464
+70
+2
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.723
+12
+0.0
+22
+3.0
+32
+0.464
+13
+0.0
+23
+3.0
+33
+0.464
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.53125
+21
+3.0
+31
+0.982
+12
+0.53125
+22
+3.0
+32
+0.723
+13
+0.53125
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+0.796875
+21
+3.0
+31
+1.241
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.241
+13
+1.0625
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+0.796875
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+1.73256321554271
+32
+3.0
+13
+0.777
+23
+1.73256321554271
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.73256321554271
+31
+3.0
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.79947640559575
+31
+3.0
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+2.58204596640715
+31
+3.0
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.796875
+21
+3.0
+31
+1.241
+12
+0.796875
+22
+3.0
+32
+0.982
+13
+0.796875
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+1.5
+31
+1.5
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.5
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.241
+13
+1.0625
+23
+3.0
+33
+1.241
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+2.018
+11
+0.796875
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.759
+11
+0.796875
+21
+3.0
+31
+2.018
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.018
+11
+0.723000000000001
+21
+3.0
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+0.723000000000001
+21
+3.0
+31
+2.018
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+1.5
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.277
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.536
+13
+0.0
+23
+3.0
+33
+2.536
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+0.982
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.982
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.723000000000001
+22
+3.0
+32
+0.982
+13
+0.723000000000001
+23
+3.0
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+0.982
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+0.982
+13
+0.796875
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+1.295
+21
+1.63697662077346
+31
+6.93577471913193e-17
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+6.93577471913193e-17
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+6.93577471913193e-17
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+1.295
+22
+1.705
+32
+6.58963624407723e-17
+13
+1.295
+23
+1.705
+33
+6.58963624407723e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.295
+21
+1.99491378028649
+31
+5.11440353810559e-17
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+5.11440353810559e-17
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.295
+22
+2.2311863483779
+32
+3.91212533101955e-17
+13
+1.295
+23
+2.2311863483779
+33
+3.91212533101955e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.295
+21
+1.80680418134643
+31
+6.07160340763011e-17
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+6.07160340763011e-17
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+6.07160340763011e-17
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.295
+22
+1.99491378028649
+32
+5.11440353810559e-17
+13
+1.295
+23
+1.99491378028649
+33
+5.11440353810559e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+1.295
+21
+1.58491378028649
+31
+7.20069763854704e-17
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028649
+30
+7.20069763854704e-17
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028649
+30
+7.20069763854704e-17
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+1.295
+22
+1.63697662077346
+32
+6.93577471913193e-17
+13
+1.295
+23
+1.63697662077346
+33
+6.93577471913193e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+7.42528844501344e-17
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.776999999999999
+22
+1.64381364161549
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.64381364161549
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+1.295
+21
+1.54077703531283
+31
+7.42528844501344e-17
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.776999999999999
+21
+1.64381364161549
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.73256321554271
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.73256321554271
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.64381364161549
+30
+4.44089209850063e-17
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+1.295
+22
+1.54077703531283
+32
+7.42528844501344e-17
+13
+1.295
+23
+1.54077703531283
+33
+7.42528844501344e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+7.42528844501344e-17
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+1.295
+22
+1.58491378028649
+32
+7.20069763854704e-17
+13
+1.295
+23
+1.58491378028649
+33
+7.20069763854704e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+2.38852893262874e-17
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.295
+22
+3.0
+32
+0.0
+13
+1.295
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.295
+22
+2.5306045958858
+32
+2.38852893262874e-17
+13
+1.295
+23
+2.5306045958858
+33
+2.38852893262874e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.295
+21
+2.5306045958858
+31
+2.38852893262874e-17
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.295
+21
+2.5306045958858
+31
+2.38852893262874e-17
+12
+1.295
+22
+2.2311863483779
+32
+3.91212533101955e-17
+13
+1.295
+23
+2.2311863483779
+33
+3.91212533101955e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.776999999999999
+21
+1.98309315521565
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.223
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.223
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.776999999999999
+21
+1.73256321554271
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.79947640559575
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.79947640559575
+33
+4.44089209850063e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.777
+21
+2.58204596640715
+31
+3.0
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.295
+22
+1.54077703531283
+32
+3.0
+13
+1.295
+23
+1.54077703531283
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.777
+21
+3.0
+31
+3.0
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028648
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.036
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.036
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.295
+21
+1.99491378028649
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+3.0
+11
+0.777
+21
+1.73256321554271
+31
+3.0
+12
+0.777
+22
+1.64381364161549
+32
+3.0
+13
+0.777
+23
+1.64381364161549
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.73256321554271
+30
+3.0
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.777
+21
+1.79947640559575
+31
+3.0
+12
+0.777
+22
+1.73256321554271
+32
+3.0
+13
+0.777
+23
+1.73256321554271
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.205000000000001
+22
+3.0
+32
+2.795
+13
+0.205000000000001
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.277
+11
+0.0
+21
+1.5
+31
+2.277
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.277
+11
+0.205000000000001
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.205000000000001
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.0
+21
+3.0
+31
+0.723
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.723
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.723
+13
+0.53125
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.64381364161549
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.64381364161549
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.64381364161549
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.73256321554271
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.73256321554271
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.73256321554271
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.79947640559575
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.79947640559575
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+2.223
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.223
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.58204596640715
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+3.0
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+3.0
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+0.205000000000001
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+1.295
+21
+2.5306045958858
+31
+2.38852893262874e-17
+12
+1.295
+22
+3.0
+32
+0.0
+13
+1.295
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+2.38852893262874e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+2.2311863483779
+32
+3.91212533101955e-17
+13
+1.295
+23
+2.2311863483779
+33
+3.91212533101955e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.2311863483779
+30
+3.91212533101955e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.99491378028649
+32
+5.11440353810559e-17
+13
+1.295
+23
+1.99491378028649
+33
+5.11440353810559e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+5.11440353810559e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.80680418134643
+32
+6.07160340763011e-17
+13
+1.295
+23
+1.80680418134643
+33
+6.07160340763011e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+6.07160340763011e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.705
+32
+6.58963624407723e-17
+13
+1.295
+23
+1.705
+33
+6.58963624407723e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+6.58963624407723e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.63697662077346
+32
+6.93577471913193e-17
+13
+1.295
+23
+1.63697662077346
+33
+6.93577471913193e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+6.93577471913193e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.58491378028649
+32
+7.20069763854704e-17
+13
+1.295
+23
+1.58491378028649
+33
+7.20069763854704e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028649
+30
+7.20069763854704e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.54077703531283
+32
+7.42528844501344e-17
+13
+1.295
+23
+1.54077703531283
+33
+7.42528844501344e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+7.42528844501344e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+1.28416666666667
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+1.28416666666667
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+1.28416666666667
+13
+2.1475
+23
+3.0
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+2.1475
+22
+1.5
+32
+1.71583333333333
+13
+2.1475
+23
+1.5
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+2.1475
+21
+1.5
+31
+2.1475
+12
+2.1475
+22
+1.5
+32
+1.71583333333333
+13
+2.1475
+23
+1.5
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.5
+31
+3.0
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.54077703531283
+32
+3.0
+13
+1.295
+23
+1.54077703531283
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028648
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.2311863483779
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+3.0
+32
+3.0
+13
+1.295
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.50885609734932
+21
+3.0
+31
+1.81237448605758
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.60791666666667
+21
+3.0
+31
+1.97984537405954
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.70501413192602
+21
+3.0
+31
+1.73585049440402
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.68090954183794
+21
+3.0
+31
+1.7548097087475
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.65506269396675
+21
+3.0
+31
+1.77131496630259
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.62772250758676
+21
+3.0
+31
+1.78520731241634
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.59915228363849
+21
+3.0
+31
+1.79635295620134
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.56962716899663
+21
+3.0
+31
+1.80464455901512
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.53943150665524
+21
+3.0
+31
+1.81000226818992
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.0625
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+2.277
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.018
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+1.295
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+0.796875
+21
+1.5
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.759
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+1.28416666666667
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.295
+21
+1.5
+31
+1.52655665885959e-16
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+0.796875
+21
+1.5
+31
+1.241
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.241
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.72547110140021
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.50885609734932
+20
+3.0
+30
+1.81237448605758
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.50885609734932
+21
+3.0
+31
+1.81237448605758
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.72547110140021
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.70501413192602
+22
+3.0
+32
+1.73585049440402
+13
+1.70501413192602
+23
+3.0
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.68090954183794
+21
+1.5
+31
+1.7548097087475
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.68090954183794
+20
+1.5
+30
+1.7548097087475
+11
+1.70501413192602
+21
+3.0
+31
+1.73585049440402
+12
+1.70501413192602
+22
+1.5
+32
+1.73585049440402
+13
+1.70501413192602
+23
+1.5
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.68090954183794
+20
+3.0
+30
+1.7548097087475
+11
+1.65506269396675
+21
+1.5
+31
+1.77131496630259
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.65506269396675
+20
+1.5
+30
+1.77131496630259
+11
+1.68090954183794
+21
+3.0
+31
+1.7548097087475
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.65506269396675
+20
+3.0
+30
+1.77131496630259
+11
+1.62772250758676
+21
+1.5
+31
+1.78520731241634
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.62772250758676
+20
+1.5
+30
+1.78520731241634
+11
+1.65506269396675
+21
+3.0
+31
+1.77131496630259
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.62772250758676
+20
+3.0
+30
+1.78520731241634
+11
+1.59915228363849
+21
+1.5
+31
+1.79635295620134
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.59915228363849
+20
+1.5
+30
+1.79635295620134
+11
+1.62772250758676
+21
+3.0
+31
+1.78520731241634
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.59915228363849
+20
+3.0
+30
+1.79635295620134
+11
+1.56962716899663
+21
+1.5
+31
+1.80464455901512
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.56962716899663
+20
+1.5
+30
+1.80464455901512
+11
+1.59915228363849
+21
+3.0
+31
+1.79635295620134
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.56962716899663
+20
+3.0
+30
+1.80464455901512
+11
+1.53943150665524
+21
+1.5
+31
+1.81000226818992
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.53943150665524
+20
+1.5
+30
+1.81000226818992
+11
+1.56962716899663
+21
+3.0
+31
+1.80464455901512
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.53943150665524
+20
+3.0
+30
+1.81000226818992
+11
+1.50885609734932
+21
+1.5
+31
+1.81237448605758
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.50885609734932
+20
+1.5
+30
+1.81237448605758
+11
+1.53943150665524
+21
+3.0
+31
+1.81000226818992
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.036
+20
+3.0
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+2
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+1.295
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+0.777
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.60791666666667
+22
+3.0
+32
+1.97984537405954
+13
+1.60791666666667
+23
+3.0
+33
+1.97984537405954
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.02015462594046
+11
+1.69132242027198
+21
+3.0
+31
+1.25291300823137
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.52180460101532
+22
+3.0
+32
+1.18826163313676
+13
+1.52180460101532
+23
+3.0
+33
+1.18826163313676
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.60791666666667
+22
+3.0
+32
+1.02015462594046
+13
+1.60791666666667
+23
+3.0
+33
+1.02015462594046
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+1.71583333333333
+21
+1.5
+31
+1.27412051524007
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+1.27412051524007
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+3.0
+32
+1.27412051524007
+13
+1.71583333333333
+23
+3.0
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.52180460101532
+21
+1.5
+31
+1.18826163313676
+12
+1.52180460101532
+22
+3.0
+32
+1.18826163313676
+13
+1.52180460101532
+23
+3.0
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.52180460101532
+21
+3.0
+31
+1.18826163313676
+12
+1.52180460101532
+22
+1.5
+32
+1.18826163313676
+13
+1.52180460101532
+23
+1.5
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.55225530915257
+21
+1.5
+31
+1.19189996321751
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.55225530915257
+21
+3.0
+31
+1.19189996321751
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.58220277009702
+21
+1.5
+31
+1.1985054650771
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.58220277009702
+21
+3.0
+31
+1.1985054650771
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.61135857342883
+21
+1.5
+31
+1.20801452412167
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.61135857342883
+21
+3.0
+31
+1.20801452412167
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.63944193282374
+21
+1.5
+31
+1.22033556291445
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.63944193282374
+21
+3.0
+31
+1.22033556291445
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.66618239017884
+21
+1.5
+31
+1.23534992311649
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.66618239017884
+21
+3.0
+31
+1.23534992311649
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.69132242027198
+21
+1.5
+31
+1.25291300823137
+12
+1.69132242027198
+22
+3.0
+32
+1.25291300823137
+13
+1.69132242027198
+23
+3.0
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.69132242027198
+21
+3.0
+31
+1.25291300823137
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.71461991087043
+21
+1.5
+31
+1.27285567614847
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.71461991087043
+21
+1.5
+31
+1.27285567614847
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.68090954183794
+20
+1.5
+30
+1.7548097087475
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.65506269396675
+20
+1.5
+30
+1.77131496630259
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.62772250758676
+20
+1.5
+30
+1.78520731241634
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.59915228363849
+20
+1.5
+30
+1.79635295620134
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.56962716899663
+20
+1.5
+30
+1.80464455901512
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.53943150665524
+20
+1.5
+30
+1.81000226818992
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+12
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.52180460101532
+21
+1.5
+31
+1.18826163313676
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.71461991087043
+22
+1.5
+32
+1.27285567614847
+13
+1.71461991087043
+23
+1.5
+33
+1.27285567614847
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.536
+11
+0.205000000000001
+21
+3.0
+31
+2.277
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.277
+11
+0.0
+21
+3.0
+31
+2.536
+12
+0.205000000000001
+22
+3.0
+32
+2.795
+13
+0.205000000000001
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+2.536
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.464
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+0.205000000000001
+11
+0.0
+21
+3.0
+31
+0.464
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.0
+21
+3.0
+31
+0.464
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+1.295
+22
+3.0
+32
+0.0
+13
+1.295
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+0.0
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+1.5
+22
+3.0
+32
+0.205000000000001
+13
+1.5
+23
+3.0
+33
+0.205000000000001
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.795
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+0.205000000000001
+22
+3.0
+32
+2.277
+13
+0.205000000000001
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+2.277
+11
+0.205000000000001
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.723000000000001
+22
+3.0
+32
+0.982
+13
+0.723000000000001
+23
+3.0
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205000000000001
+13
+1.5
+23
+3.0
+33
+0.205000000000001
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.60791666666667
+22
+3.0
+32
+1.02015462594046
+13
+1.60791666666667
+23
+3.0
+33
+1.02015462594046
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.0625
+21
+3.0
+31
+1.5
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+0.796875
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+0.982
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+0.723000000000001
+22
+3.0
+32
+0.982
+13
+0.723000000000001
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.60791666666667
+21
+3.0
+31
+1.97984537405954
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.5
+22
+3.0
+32
+0.205000000000001
+13
+1.5
+23
+3.0
+33
+0.205000000000001
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+0.796875
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.241
+13
+1.0625
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.796875
+21
+3.0
+31
+2.018
+12
+0.723000000000001
+22
+3.0
+32
+2.018
+13
+0.723000000000001
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+12
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+0.205000000000001
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+2.277
+11
+0.723000000000001
+21
+3.0
+31
+2.018
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0625
+22
+1.5
+32
+1.5
+13
+1.0625
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.60791666666667
+22
+3.0
+32
+1.97984537405954
+13
+1.60791666666667
+23
+3.0
+33
+1.97984537405954
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.02015462594046
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+1.28416666666667
+13
+2.1475
+23
+1.5
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+2.1475
+21
+3.0
+31
+1.28416666666667
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440357
+22
+3.0
+32
+0.0
+13
+0.878679656440357
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440357
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843522
+20
+1.27938364528661
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843522
+20
+1.27938364528661
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+0.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+0.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+0.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121051
+32
+0.0
+13
+3.0
+23
+0.497732043121051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+0.0
+32
+0.0
+13
+1.79836855106949
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+2.77555756156289e-17
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+0.497732043121053
+22
+-5.55111512312578e-17
+32
+0.0
+13
+0.497732043121053
+23
+-5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121053
+20
+-5.55111512312578e-17
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121053
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+-1.11022302462516e-16
+21
+2.50226795687895
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+12
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+-1.11022302462516e-16
+22
+0.878679656440357
+32
+0.0
+13
+-1.11022302462516e-16
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20163144893051
+21
+5.55111512312578e-17
+31
+0.0
+12
+0.878679656440358
+22
+1.11022302462516e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+2.12132034355964
+21
+-5.55111512312578e-17
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+-4.16333634234434e-17
+32
+0.0
+13
+2.50226795687895
+23
+-4.16333634234434e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440357
+20
+3.0
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440357
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440357
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440357
+22
+3.0
+32
+0.0
+13
+0.878679656440357
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.79836855106949
+22
+3.0
+32
+0.0
+13
+1.79836855106949
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.50226795687895
+21
+-4.16333634234434e-17
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+-4.16333634234434e-17
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+-4.16333634234434e-17
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79836855106949
+21
+0.0
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+2.12132034355964
+22
+-5.55111512312578e-17
+32
+0.0
+13
+2.12132034355964
+23
+-5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.20163144893051
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.20163144893051
+23
+5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+0.878679656440358
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.497732043121053
+22
+-5.55111512312578e-17
+32
+0.0
+13
+0.497732043121053
+23
+-5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+-1.11022302462516e-16
+22
+0.878679656440357
+32
+0.0
+13
+-1.11022302462516e-16
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+2.77555756156289e-17
+21
+1.20163144893051
+31
+0.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843522
+20
+1.27938364528661
+30
+0.0
+11
+2.77555756156289e-17
+21
+1.20163144893051
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+-1.11022302462516e-16
+22
+2.50226795687895
+32
+0.0
+13
+-1.11022302462516e-16
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440358
+22
+1.11022302462516e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.11022302462516e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.497732043121053
+22
+-5.55111512312578e-17
+32
+0.0
+13
+0.497732043121053
+23
+-5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121053
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+-4.16333634234434e-17
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+-4.16333634234434e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+-5.55111512312578e-17
+32
+0.0
+13
+2.12132034355964
+23
+-5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+-5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+0.0
+32
+0.0
+13
+1.79836855106949
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+-1.11022302462516e-16
+22
+0.878679656440357
+32
+0.0
+13
+-1.11022302462516e-16
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+-1.11022302462516e-16
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+2.77555756156289e-17
+22
+1.20163144893051
+32
+0.0
+13
+2.77555756156289e-17
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+-1.11022302462516e-16
+22
+2.50226795687895
+32
+0.0
+13
+-1.11022302462516e-16
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+-1.11022302462516e-16
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.79083940859747
+30
+1.5
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+1.5
+13
+0.82973983909525
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.74365960772913
+21
+1.57449302665047
+31
+1.5
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74365960772913
+20
+1.57449302665047
+30
+1.5
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+1.5
+12
+1.64826864473226
+22
+2.24539681310646
+32
+1.5
+13
+1.64826864473226
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+2.22727465515648
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.57449302665047
+22
+2.25634039227087
+32
+1.5
+13
+1.57449302665047
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.72061635471339
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+1.5
+12
+2.20214844470858
+22
+1.79083940859747
+32
+1.5
+13
+2.20214844470858
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.42550697334953
+21
+0.74365960772913
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.74365960772913
+30
+1.5
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+0.74
+31
+1.5
+12
+1.57449302665047
+22
+0.743659607729131
+32
+1.5
+13
+1.57449302665047
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+0.74
+30
+1.5
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.01786110403563
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+1.5
+12
+2.13191690534993
+22
+1.0777666229051
+32
+1.5
+13
+2.13191690534993
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+1.5
+12
+1.27938364528661
+22
+0.772725344843521
+32
+1.5
+13
+1.27938364528661
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+0.797851555291422
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.57449302665047
+30
+1.5
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.26
+22
+1.5
+32
+1.5
+13
+2.26
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+1.5
+12
+1.42550697334953
+22
+0.74365960772913
+32
+1.5
+13
+1.42550697334953
+23
+0.74365960772913
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+0.754603186893545
+30
+1.5
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.85826151998776
+22
+0.829739839095251
+32
+1.5
+13
+1.85826151998776
+23
+0.829739839095251
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+1.5
+12
+1.01786110403563
+22
+2.08748794455568
+32
+1.5
+13
+1.01786110403563
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+2.13191690534993
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534994
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534994
+30
+1.5
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298225
+30
+1.5
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.64826864473226
+30
+1.5
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310646
+21
+1.64826864473226
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.42550697334953
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+1.5
+13
+2.24539681310646
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.14173848001224
+21
+0.829739839095251
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.829739839095251
+30
+1.5
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.772725344843522
+21
+1.72061635471339
+31
+1.5
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.72061635471339
+30
+1.5
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+2.26
+31
+1.5
+12
+1.42550697334953
+22
+2.25634039227087
+32
+1.5
+13
+1.42550697334953
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+2.26
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310646
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310646
+31
+1.5
+12
+1.27938364528661
+22
+2.22727465515648
+32
+1.5
+13
+1.27938364528661
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+2.24539681310646
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.85826151998776
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+1.5
+12
+2.13191690534993
+22
+1.9222333770949
+32
+1.5
+13
+2.13191690534993
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.9222333770949
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+1.5
+13
+0.91251205544432
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+1.5
+12
+1.9222333770949
+22
+0.868083094650066
+32
+1.5
+13
+1.9222333770949
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+0.829739839095251
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+1.5
+12
+2.03740115370178
+22
+0.962598846298225
+32
+1.5
+13
+2.03740115370178
+23
+0.962598846298225
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+0.91251205544432
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+1.5
+12
+1.01786110403563
+22
+0.91251205544432
+32
+1.5
+13
+1.01786110403563
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+0.962598846298224
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+1.5
+12
+1.79083940859747
+22
+2.20214844470858
+32
+1.5
+13
+1.79083940859747
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+2.17026016090475
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.57449302665047
+30
+1.5
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+1.5
+12
+2.24539681310646
+22
+1.64826864473226
+32
+1.5
+13
+2.24539681310646
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+1.5
+12
+1.9222333770949
+22
+2.13191690534994
+32
+1.5
+13
+1.9222333770949
+23
+2.13191690534994
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+2.08748794455568
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+1.5
+12
+1.14173848001224
+22
+0.829739839095251
+32
+1.5
+13
+1.14173848001224
+23
+0.829739839095251
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+0.868083094650066
+30
+1.5
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+1.5
+12
+1.79083940859747
+22
+0.797851555291422
+32
+1.5
+13
+1.79083940859747
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+0.772725344843522
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.74
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74365960772913
+22
+1.57449302665047
+32
+1.5
+13
+0.74365960772913
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.64826864473226
+30
+1.5
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.772725344843522
+22
+1.72061635471339
+32
+1.5
+13
+0.772725344843522
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.98213889596437
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+1.5
+12
+2.03740115370178
+22
+2.03740115370178
+32
+1.5
+13
+2.03740115370178
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843522
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843522
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+1.5
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.27938364528661
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+1.5
+13
+2.20214844470858
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+2.26
+21
+1.5
+31
+1.5
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+1.5
+12
+1.64826864473226
+22
+0.754603186893545
+32
+1.5
+13
+1.64826864473226
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+1.5
+12
+0.91251205544432
+22
+1.01786110403563
+32
+1.5
+13
+0.91251205544432
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.0777666229051
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.35173135526774
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+1.5
+13
+0.743659607729131
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+1.5
+12
+0.772725344843522
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.27938364528661
+30
+1.5
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.27938364528661
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.20916059140253
+30
+1.5
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+1.5
+13
+0.772725344843521
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+1.5
+12
+1.14173848001224
+22
+2.17026016090475
+32
+1.5
+13
+1.14173848001224
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+2.20214844470858
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.27938364528661
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298225
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298225
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310646
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310646
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.24539681310646
+21
+1.64826864473226
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.64826864473226
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.64826864473226
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310646
+21
+1.64826864473226
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+1.5
+13
+2.25634039227087
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843522
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843522
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.85826151998776
+22
+0.829739839095251
+32
+1.5
+13
+1.85826151998776
+23
+0.829739839095251
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534994
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534994
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+0.829739839095251
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.829739839095251
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+0.74365960772913
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.74365960772913
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57449302665047
+21
+0.743659607729131
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.64826864473226
+22
+0.754603186893545
+32
+1.5
+13
+1.64826864473226
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57449302665047
+21
+2.25634039227087
+31
+1.5
+12
+1.64826864473226
+22
+2.24539681310646
+32
+1.5
+13
+1.64826864473226
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74365960772913
+20
+1.57449302665047
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.74365960772913
+21
+1.57449302665047
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.72061635471339
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843522
+21
+1.72061635471339
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534994
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534994
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298225
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298225
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843521
+21
+1.27938364528661
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.27938364528661
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.64826864473226
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+1.5
+12
+2.24539681310645
+22
+1.64826864473226
+32
+1.5
+13
+2.24539681310645
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.72061635471339
+30
+1.5
+11
+2.24539681310646
+21
+1.64826864473226
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+2.17026016090475
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+1.5
+12
+1.9222333770949
+22
+2.13191690534993
+32
+1.5
+13
+1.9222333770949
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+0.82973983909525
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+0.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+1.5
+12
+1.79083940859747
+22
+0.797851555291422
+32
+1.5
+13
+1.79083940859747
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+1.5
+12
+1.14173848001224
+22
+2.17026016090475
+32
+1.5
+13
+1.14173848001224
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+0.754603186893545
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+1.5
+12
+1.27938364528661
+22
+0.772725344843521
+32
+1.5
+13
+1.27938364528661
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.743659607729131
+30
+1.5
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.74365960772913
+32
+0.0
+13
+1.42550697334953
+23
+0.74365960772913
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+1.5
+11
+1.42550697334953
+21
+0.74365960772913
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.74365960772913
+30
+0.0
+11
+1.5
+21
+0.74
+31
+1.5
+12
+1.42550697334953
+22
+0.743659607729131
+32
+1.5
+13
+1.42550697334953
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+0.743659607729131
+30
+1.5
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+1.5
+12
+2.26
+22
+1.5
+32
+1.5
+13
+2.26
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.57449302665047
+30
+1.5
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.64826864473226
+30
+1.5
+11
+0.74365960772913
+21
+1.57449302665047
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+1.5
+13
+0.743659607729131
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74365960772913
+20
+1.57449302665047
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+2.25634039227087
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+1.5
+12
+1.64826864473226
+22
+2.24539681310646
+32
+1.5
+13
+1.64826864473226
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+1.5
+12
+1.01786110403563
+22
+2.08748794455568
+32
+1.5
+13
+1.01786110403563
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+1.5
+13
+0.91251205544432
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+1.5
+11
+0.772725344843522
+21
+1.72061635471339
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+1.5
+13
+0.772725344843521
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.72061635471339
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+1.5
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+2.26
+31
+1.5
+12
+1.57449302665047
+22
+2.25634039227087
+32
+1.5
+13
+1.57449302665047
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+2.24539681310645
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+1.5
+12
+1.42550697334953
+22
+2.25634039227087
+32
+1.5
+13
+1.42550697334953
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310645
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310645
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+1.5
+12
+1.27938364528661
+22
+2.22727465515648
+32
+1.5
+13
+1.27938364528661
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.85826151998776
+21
+0.829739839095251
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.85826151998776
+22
+0.82973983909525
+32
+1.5
+13
+1.85826151998776
+23
+0.82973983909525
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+0.91251205544432
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+1.5
+12
+1.9222333770949
+22
+0.868083094650066
+32
+1.5
+13
+1.9222333770949
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+1.5
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+1.5
+13
+2.25634039227087
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+1.5
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310646
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310646
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+1.5
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+2.08748794455568
+30
+1.5
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+1.5
+12
+2.03740115370178
+22
+2.03740115370178
+32
+1.5
+13
+2.03740115370178
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+2.22727465515648
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+1.5
+12
+1.79083940859747
+22
+2.20214844470858
+32
+1.5
+13
+1.79083940859747
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+1.5
+12
+2.20214844470858
+22
+1.79083940859747
+32
+1.5
+13
+2.20214844470858
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.85826151998776
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.82973983909525
+30
+1.5
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.829739839095251
+32
+0.0
+13
+1.14173848001224
+23
+0.829739839095251
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.72061635471339
+21
+0.772725344843522
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843521
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.57449302665047
+30
+1.5
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+1.5
+12
+0.74365960772913
+22
+1.57449302665047
+32
+0.0
+13
+0.74365960772913
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.64826864473226
+30
+1.5
+11
+0.772725344843522
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.72061635471339
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+1.5
+12
+0.772725344843521
+22
+1.72061635471339
+32
+1.5
+13
+0.772725344843521
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.98213889596437
+30
+1.5
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+1.5
+13
+2.03740115370178
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+0.772725344843521
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+1.5
+12
+1.64826864473226
+22
+0.754603186893545
+32
+1.5
+13
+1.64826864473226
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+0.962598846298224
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+1.5
+12
+0.91251205544432
+22
+1.01786110403563
+32
+1.5
+13
+0.91251205544432
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.20916059140253
+30
+1.5
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+1.5
+13
+0.82973983909525
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+1.5
+12
+2.13191690534993
+22
+1.0777666229051
+32
+1.5
+13
+2.13191690534993
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.14173848001224
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.14173848001224
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+1.5
+13
+2.20214844470858
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.42550697334953
+30
+1.5
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.26
+22
+1.5
+32
+1.5
+13
+2.26
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.57449302665047
+22
+0.743659607729131
+32
+1.5
+13
+1.57449302665047
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.0777666229051
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+1.5
+13
+0.91251205544432
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+0.868083094650066
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+1.5
+12
+1.01786110403563
+22
+0.91251205544432
+32
+1.5
+13
+1.01786110403563
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+1.5
+13
+0.743659607729131
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.74
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.35173135526774
+30
+1.5
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+1.5
+13
+0.772725344843522
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.27938364528661
+30
+1.5
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+1.5
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+0.74365960772913
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.74365960772913
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+1.5
+12
+2.03740115370178
+22
+0.962598846298224
+32
+1.5
+13
+2.03740115370178
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.01786110403563
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+0.797851555291422
+30
+1.5
+11
+1.14173848001224
+21
+0.829739839095251
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.829739839095251
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+1.5
+12
+1.14173848001224
+22
+0.82973983909525
+32
+1.5
+13
+1.14173848001224
+23
+0.82973983909525
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.24539681310645
+21
+1.64826864473226
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74365960772913
+20
+1.57449302665047
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.74365960772913
+21
+1.57449302665047
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+0.829739839095251
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.829739839095251
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.64826864473226
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.24539681310646
+21
+1.64826864473226
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.64826864473226
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.72061635471339
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843522
+21
+1.72061635471339
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+0.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.5
+21
+2.26
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.57449302665047
+22
+2.25634039227087
+32
+1.5
+13
+1.57449302665047
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298224
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.85826151998776
+22
+0.82973983909525
+32
+1.5
+13
+1.85826151998776
+23
+0.82973983909525
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.82973983909525
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+0.82973983909525
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843521
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843521
+21
+1.72061635471339
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843521
+20
+1.72061635471339
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.57449302665047
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.57449302665047
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.27938364528661
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843522
+21
+1.27938364528661
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310645
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310645
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298224
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310645
+21
+1.64826864473226
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+1.5
+13
+2.25634039227087
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.743659607729131
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+0.743659607729131
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.5
+21
+0.74
+31
+1.5
+12
+1.57449302665047
+22
+0.743659607729131
+32
+1.5
+13
+1.57449302665047
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310645
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310645
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+leviathan
+10
+2.25005874840729
+20
+3.0007189449114
+30
+2.25038878031282
+11
+6.83599400219787
+21
+-3.83207178618818
+31
+6.83197759827438
+12
+2.25309854396822
+22
+0.752182882434337
+32
+-0.00106460677458386
+13
+2.25309854396822
+23
+0.752182882434337
+33
+-0.00106460677458386
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+2.25005874840729
+20
+3.0007189449114
+30
+2.25038878031282
+11
+2.25309854396822
+21
+0.752182882434337
+31
+-0.00106460677458386
+12
+-3.83269312832729
+22
+6.83333584417703
+32
+-3.83401461964133
+13
+-3.83269312832729
+23
+6.83333584417703
+33
+-3.83401461964133
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+6.83599400219787
+20
+-3.83207178618818
+30
+6.83197759827438
+11
+0.00179401843026383
+21
+0.748994259637591
+31
+2.24762029441129
+12
+2.25309854396822
+22
+0.752182882434337
+32
+-0.00106460677458386
+13
+2.25309854396822
+23
+0.752182882434337
+33
+-0.00106460677458386
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+6.83599400219787
+20
+-3.83207178618818
+30
+6.83197759827438
+11
+2.25005874840729
+21
+3.0007189449114
+31
+2.25038878031282
+12
+0.00179401843026383
+22
+0.748994259637591
+32
+2.24762029441129
+13
+0.00179401843026383
+23
+0.748994259637591
+33
+2.24762029441129
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+0.00179401843026383
+20
+0.748994259637591
+30
+2.24762029441129
+11
+2.25005874840729
+21
+3.0007189449114
+31
+2.25038878031282
+12
+-3.83269312832729
+22
+6.83333584417703
+32
+-3.83401461964133
+13
+-3.83269312832729
+23
+6.83333584417703
+33
+-3.83401461964133
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+0.00179401843026383
+20
+0.748994259637591
+30
+2.24762029441129
+11
+-3.83269312832729
+21
+6.83333584417703
+31
+-3.83401461964133
+12
+2.25309854396822
+22
+0.752182882434337
+32
+-0.00106460677458386
+13
+2.25309854396822
+23
+0.752182882434337
+33
+-0.00106460677458386
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121051
+32
+0.0
+13
+3.0
+23
+0.497732043121051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+0.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+2.12132034355964
+21
+0.0
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+0.0
+32
+0.0
+13
+2.50226795687895
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.0
+21
+0.878679656440357
+31
+0.0
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.34882660079146
+22
+2.26
+32
+3.0
+13
+1.34882660079146
+23
+2.26
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.34882660079146
+21
+2.26
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.72061635471339
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+2.24539681310645
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+0.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.57449302665047
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.27938364528661
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.7275
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.7275
+12
+0.205
+22
+3.0
+32
+0.6475
+13
+0.205
+23
+3.0
+33
+0.6475
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.6475
+11
+0.0
+21
+3.0
+31
+0.7275
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.6475
+22
+3.0
+32
+0.205
+13
+0.6475
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+3.0
+30
+0.42625
+11
+0.6475
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+0.639832154473908
+21
+2.78733215447391
+31
+2.22163676695763e-16
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.212667845526092
+20
+2.36016784552609
+30
+1.10903230691784e-16
+11
+0.0
+21
+2.2725
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.2725
+30
+0.0
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.639832154473908
+22
+2.78733215447391
+32
+2.22163676695763e-16
+13
+0.639832154473908
+23
+2.78733215447391
+33
+2.22163676695763e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.212667845526092
+22
+2.36016784552609
+32
+1.10903230691784e-16
+13
+0.212667845526092
+23
+2.36016784552609
+33
+1.10903230691784e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.0
+21
+2.2725
+31
+0.0
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.2725
+30
+0.0
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.57375
+32
+0.42625
+13
+0.0
+23
+2.57375
+33
+0.42625
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.6475
+11
+0.42625
+21
+3.0
+31
+0.42625
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+0.0
+22
+3.0
+32
+0.7275
+13
+0.0
+23
+3.0
+33
+0.7275
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.212667845526092
+20
+2.36016784552609
+30
+1.10903230691784e-16
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.42625
+22
+2.57375
+32
+1.66533453693774e-16
+13
+0.42625
+23
+2.57375
+33
+1.66533453693774e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.639832154473908
+22
+2.78733215447391
+32
+2.22163676695763e-16
+13
+0.639832154473908
+23
+2.78733215447391
+33
+2.22163676695763e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.639832154473908
+21
+2.78733215447391
+31
+2.22163676695763e-16
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+0.6475
+22
+3.0
+32
+0.205
+13
+0.6475
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.6475
+21
+3.0
+31
+0.205
+12
+0.42625
+22
+3.0
+32
+0.42625
+13
+0.42625
+23
+3.0
+33
+0.42625
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.42625
+21
+3.0
+31
+0.42625
+12
+0.0
+22
+2.57375
+32
+0.42625
+13
+0.0
+23
+2.57375
+33
+0.42625
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.57375
+30
+0.42625
+11
+0.42625
+21
+3.0
+31
+0.42625
+12
+0.205
+22
+3.0
+32
+0.6475
+13
+0.205
+23
+3.0
+33
+0.6475
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.57375
+30
+0.42625
+11
+0.205
+21
+3.0
+31
+0.6475
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.6475
+11
+0.205
+21
+3.0
+31
+0.6475
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.283212517800539
+20
+1.74203407868223
+30
+1.35872768146951e-17
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.283212517800539
+21
+1.74203407868223
+31
+1.35872768146951e-17
+12
+0.452270081490105
+22
+1.5
+32
+-1.14382698113301e-17
+13
+0.452270081490105
+23
+1.5
+33
+-1.14382698113301e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.452270081490105
+20
+1.5
+30
+-1.14382698113301e-17
+11
+0.0
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.452270081490105
+21
+1.5
+31
+-1.14382698113301e-17
+12
+0.580081389077038
+22
+1.31701681130471
+32
+-3.03581440100583e-17
+13
+0.580081389077038
+23
+1.31701681130471
+33
+-3.03581440100583e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.580081389077038
+20
+1.31701681130471
+30
+-3.03581440100583e-17
+11
+0.0
+21
+0.878679656440357
+31
+0.0
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.580081389077038
+21
+1.31701681130471
+31
+-3.03581440100583e-17
+12
+0.687379562118009
+22
+1.16340159356772
+32
+-4.6241464304765e-17
+13
+0.687379562118009
+23
+1.16340159356772
+33
+-4.6241464304765e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0257305779793495
+20
+2.1106623891929
+30
+5.17022605499795e-17
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0257305779793495
+21
+2.1106623891929
+31
+5.17022605499795e-17
+12
+0.283212517800539
+22
+1.74203407868223
+32
+1.35872768146951e-17
+13
+0.283212517800539
+23
+1.74203407868223
+33
+1.35872768146951e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.785661664350193
+20
+1.02269438387197
+30
+-6.07901380123296e-17
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.883139136394791
+22
+0.883139136394791
+32
+-7.52197025251519e-17
+13
+0.883139136394791
+23
+0.883139136394791
+33
+-7.52197025251519e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.987752578969539
+20
+0.733367557775276
+30
+-9.07056028760568e-17
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+0.987752578969539
+21
+0.733367557775276
+31
+-9.07056028760568e-17
+12
+1.10997225325072
+22
+0.558389724096058
+32
+-1.08797749069277e-16
+13
+1.10997225325072
+23
+0.558389724096058
+33
+-1.08797749069277e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.10997225325072
+20
+0.558389724096058
+30
+-1.08797749069277e-16
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.10997225325072
+21
+0.558389724096058
+31
+-1.08797749069277e-16
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.0
+22
+1.5
+32
+0.452270081490105
+13
+0.0
+23
+1.5
+33
+0.452270081490105
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+0.205
+32
+1.35681024447031
+13
+0.0
+23
+0.205
+33
+1.35681024447031
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.452270081490105
+13
+0.0
+23
+1.5
+33
+0.452270081490105
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.35681024447031
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.687379562118009
+20
+1.16340159356772
+30
+-4.6241464304765e-17
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.687379562118009
+21
+1.16340159356772
+31
+-4.6241464304765e-17
+12
+0.785661664350193
+22
+1.02269438387197
+32
+-6.07901380123296e-17
+13
+0.785661664350193
+23
+1.02269438387197
+33
+-6.07901380123296e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.883139136394791
+20
+0.883139136394791
+30
+-7.52197025251519e-17
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.883139136394791
+21
+0.883139136394791
+31
+-7.52197025251519e-17
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+0.883139136394791
+21
+0.883139136394791
+31
+-7.52197025251519e-17
+12
+0.987752578969539
+22
+0.733367557775276
+32
+-9.07056028760568e-17
+13
+0.987752578969539
+23
+0.733367557775276
+33
+-9.07056028760568e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.75
+20
+1.38777878078145e-17
+30
+0.75
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.295
+22
+2.39623136148263e-17
+32
+0.205
+13
+1.295
+23
+2.39623136148263e-17
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+3.79326200080262e-18
+30
+1.295
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.295
+20
+2.39623136148263e-17
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+3.79326200080262e-18
+30
+1.295
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.75
+22
+1.38777878078145e-17
+32
+0.75
+13
+0.75
+23
+1.38777878078145e-17
+33
+0.75
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0257305779793495
+20
+2.1106623891929
+30
+5.17022605499795e-17
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+3.79326200080262e-18
+30
+1.295
+11
+0.0
+21
+0.205
+31
+1.35681024447031
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+0.75
+22
+1.38777878078145e-17
+32
+0.75
+13
+0.75
+23
+1.38777878078145e-17
+33
+0.75
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+0.75
+21
+1.38777878078145e-17
+31
+0.75
+12
+1.295
+22
+2.39623136148263e-17
+32
+0.205
+13
+1.295
+23
+2.39623136148263e-17
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+1.26776612947519
+21
+0.332481491301359
+31
+-1.32155935006511e-16
+12
+0.0
+22
+0.883139136394791
+32
+0.883139136394791
+13
+0.0
+23
+0.883139136394791
+33
+0.883139136394791
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+1.26776612947519
+21
+0.332481491301359
+31
+-1.32155935006511e-16
+12
+1.10997225325072
+22
+0.558389724096058
+32
+-1.08797749069277e-16
+13
+1.10997225325072
+23
+0.558389724096058
+33
+-1.08797749069277e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+1.10997225325072
+21
+0.558389724096058
+31
+-1.08797749069277e-16
+12
+0.987752578969539
+22
+0.733367557775276
+32
+-9.07056028760568e-17
+13
+0.987752578969539
+23
+0.733367557775276
+33
+-9.07056028760568e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.987752578969539
+21
+0.733367557775276
+31
+-9.07056028760568e-17
+12
+0.883139136394791
+22
+0.883139136394791
+32
+-7.52197025251519e-17
+13
+0.883139136394791
+23
+0.883139136394791
+33
+-7.52197025251519e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.883139136394791
+21
+0.883139136394791
+31
+-7.52197025251519e-17
+12
+0.785661664350193
+22
+1.02269438387197
+32
+-6.07901380123296e-17
+13
+0.785661664350193
+23
+1.02269438387197
+33
+-6.07901380123296e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.0
+22
+1.5
+32
+0.452270081490105
+13
+0.0
+23
+1.5
+33
+0.452270081490105
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.687379562118009
+22
+1.16340159356772
+32
+-4.6241464304765e-17
+13
+0.687379562118009
+23
+1.16340159356772
+33
+-4.6241464304765e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.687379562118009
+21
+1.16340159356772
+31
+-4.6241464304765e-17
+12
+0.580081389077038
+22
+1.31701681130471
+32
+-3.03581440100583e-17
+13
+0.580081389077038
+23
+1.31701681130471
+33
+-3.03581440100583e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.580081389077038
+21
+1.31701681130471
+31
+-3.03581440100583e-17
+12
+0.452270081490105
+22
+1.5
+32
+-1.14382698113301e-17
+13
+0.452270081490105
+23
+1.5
+33
+-1.14382698113301e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.452270081490105
+21
+1.5
+31
+-1.14382698113301e-17
+12
+0.283212517800539
+22
+1.74203407868223
+32
+1.35872768146951e-17
+13
+0.283212517800539
+23
+1.74203407868223
+33
+1.35872768146951e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.283212517800539
+21
+1.74203407868223
+31
+1.35872768146951e-17
+12
+0.0
+22
+1.85400833333333
+32
+0.205
+13
+0.0
+23
+1.85400833333333
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.283212517800539
+21
+1.74203407868223
+31
+1.35872768146951e-17
+12
+0.0257305779793495
+22
+2.1106623891929
+32
+5.17022605499795e-17
+13
+0.0257305779793495
+23
+2.1106623891929
+33
+5.17022605499795e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.0257305779793495
+21
+2.1106623891929
+31
+5.17022605499795e-17
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.452270081490105
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.83659840643228
+21
+2.31262043788199
+31
+1.75803140620266e-16
+12
+1.68298318869529
+22
+2.41991861092296
+32
+1.91686460914973e-16
+13
+1.68298318869529
+23
+2.41991861092296
+33
+1.91686460914973e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.83659840643228
+20
+2.31262043788199
+30
+1.75803140620266e-16
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.97730561612803
+21
+2.2143383356498
+31
+1.61254466912702e-16
+12
+1.83659840643228
+22
+2.31262043788199
+32
+1.75803140620266e-16
+13
+1.83659840643228
+23
+2.31262043788199
+33
+1.75803140620266e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.97730561612803
+20
+2.2143383356498
+30
+1.61254466912702e-16
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+2.11686086360521
+21
+2.11686086360521
+31
+1.46824902399879e-16
+12
+1.97730561612803
+22
+2.2143383356498
+32
+1.61254466912702e-16
+13
+1.97730561612803
+23
+2.2143383356498
+33
+1.61254466912702e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+2.11686086360521
+30
+1.46824902399879e-16
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+1.5
+21
+3.0
+31
+0.205
+12
+1.35441740918437
+22
+3.0
+32
+0.350582590815627
+13
+1.35441740918437
+23
+3.0
+33
+0.350582590815627
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+2.32009652509653
+22
+3.0
+32
+1.02509652509653
+13
+2.32009652509653
+23
+3.0
+33
+1.02509652509653
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+1.5
+21
+3.0
+31
+0.205
+12
+1.14599166666667
+22
+3.0
+32
+0.205
+13
+1.14599166666667
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.26663244222472
+22
+2.01224742103046
+32
+1.31339002048974e-16
+13
+2.26663244222472
+23
+2.01224742103046
+33
+1.31339002048974e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.44161027590394
+20
+1.89002774674928
+30
+1.13246855855755e-16
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+2.54772991850989
+30
+2.10606335113701e-16
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.68298318869529
+22
+2.41991861092296
+32
+1.91686460914973e-16
+13
+1.68298318869529
+23
+2.41991861092296
+33
+1.91686460914973e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+1.5
+30
+0.0
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.11686086360521
+22
+2.11686086360521
+32
+1.46824902399879e-16
+13
+2.11686086360521
+23
+2.11686086360521
+33
+1.46824902399879e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.26663244222472
+20
+2.01224742103046
+30
+1.31339002048974e-16
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.889337610807103
+21
+2.97426942202065
+31
+2.73746865475011e-16
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.889337610807103
+20
+2.97426942202065
+30
+2.73746865475011e-16
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.25796592131777
+22
+2.71678748219946
+32
+2.35631881739726e-16
+13
+1.25796592131777
+23
+2.71678748219946
+33
+2.35631881739726e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.705
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+1.705
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.205
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+1.14599166666667
+22
+3.0
+32
+0.205
+13
+1.14599166666667
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.25796592131777
+20
+2.71678748219946
+30
+2.35631881739726e-16
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.54772991850989
+32
+2.10606335113701e-16
+13
+1.5
+23
+2.54772991850989
+33
+2.10606335113701e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+2.44161027590394
+22
+1.89002774674928
+32
+1.13246855855755e-16
+13
+2.44161027590394
+23
+1.89002774674928
+33
+1.13246855855755e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.66751850869864
+20
+1.73223387052481
+30
+8.98886699185201e-17
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.25
+31
+0.75
+12
+3.0
+22
+1.705
+32
+0.205
+13
+3.0
+23
+1.705
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+1.295
+11
+3.0
+21
+2.25
+31
+0.75
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.295
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+1.295
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.32009652509653
+20
+3.0
+30
+1.02509652509653
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.889337610807103
+20
+2.97426942202065
+30
+2.73746865475011e-16
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.889337610807103
+20
+2.97426942202065
+30
+2.73746865475011e-16
+11
+1.14599166666667
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.14599166666667
+20
+3.0
+30
+0.205
+11
+0.889337610807103
+21
+2.97426942202065
+31
+2.73746865475011e-16
+12
+1.25796592131777
+22
+2.71678748219946
+32
+2.35631881739726e-16
+13
+1.25796592131777
+23
+2.71678748219946
+33
+2.35631881739726e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.14599166666667
+20
+3.0
+30
+0.205
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.35441740918437
+22
+3.0
+32
+0.350582590815627
+13
+1.35441740918437
+23
+3.0
+33
+0.350582590815627
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.5
+22
+2.54772991850989
+32
+2.10606335113701e-16
+13
+1.5
+23
+2.54772991850989
+33
+2.10606335113701e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.5
+22
+3.0
+32
+0.452270081490105
+13
+1.5
+23
+3.0
+33
+0.452270081490105
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.68298318869529
+22
+2.41991861092296
+32
+1.91686460914973e-16
+13
+1.68298318869529
+23
+2.41991861092296
+33
+1.91686460914973e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+1.68298318869529
+21
+2.41991861092296
+31
+1.91686460914973e-16
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+1.68298318869529
+21
+2.41991861092296
+31
+1.91686460914973e-16
+12
+1.83659840643228
+22
+2.31262043788199
+32
+1.75803140620266e-16
+13
+1.83659840643228
+23
+2.31262043788199
+33
+1.75803140620266e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+1.83659840643228
+21
+2.31262043788199
+31
+1.75803140620266e-16
+12
+1.97730561612803
+22
+2.2143383356498
+32
+1.61254466912702e-16
+13
+1.97730561612803
+23
+2.2143383356498
+33
+1.61254466912702e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+1.97730561612803
+21
+2.2143383356498
+31
+1.61254466912702e-16
+12
+2.11686086360521
+22
+2.11686086360521
+32
+1.46824902399879e-16
+13
+2.11686086360521
+23
+2.11686086360521
+33
+1.46824902399879e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+2.11686086360521
+21
+2.11686086360521
+31
+1.46824902399879e-16
+12
+2.26663244222472
+22
+2.01224742103046
+32
+1.31339002048974e-16
+13
+2.26663244222472
+23
+2.01224742103046
+33
+1.31339002048974e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.32009652509653
+22
+3.0
+32
+1.02509652509653
+13
+2.32009652509653
+23
+3.0
+33
+1.02509652509653
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.32009652509653
+20
+3.0
+30
+1.02509652509653
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.44161027590394
+22
+1.89002774674928
+32
+1.13246855855755e-16
+13
+2.44161027590394
+23
+1.89002774674928
+33
+1.13246855855755e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.32009652509653
+20
+3.0
+30
+1.02509652509653
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.795
+22
+3.0
+32
+1.35681024447031
+13
+2.795
+23
+3.0
+33
+1.35681024447031
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.66751850869864
+22
+1.73223387052481
+32
+8.98886699185201e-17
+13
+2.66751850869864
+23
+1.73223387052481
+33
+8.98886699185201e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.705
+32
+0.205
+13
+3.0
+23
+1.705
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+1.705
+31
+0.205
+12
+3.0
+22
+2.25
+32
+0.75
+13
+3.0
+23
+2.25
+33
+0.75
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.25
+31
+0.75
+12
+3.0
+22
+2.795
+32
+1.295
+13
+3.0
+23
+2.795
+33
+1.295
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.205
+22
+3.0
+32
+1.14599166666667
+13
+0.205
+23
+3.0
+33
+1.14599166666667
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+0.452270081490105
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.452270081490105
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.883139136394791
+22
+3.0
+32
+2.11686086360521
+13
+0.883139136394791
+23
+3.0
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+1.14599166666667
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+1.14599166666667
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.75
+21
+2.25
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.75
+21
+2.25
+31
+3.0
+12
+0.899184275534744
+22
+2.39918427553474
+32
+3.0
+13
+0.899184275534744
+23
+2.39918427553474
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.600815724465256
+20
+2.10081572446526
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.600815724465256
+21
+2.10081572446526
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.600815724465256
+21
+2.10081572446526
+31
+3.0
+12
+0.75
+22
+2.25
+32
+3.0
+13
+0.75
+23
+2.25
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.899184275534744
+20
+2.39918427553474
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.899184275534744
+21
+2.39918427553474
+31
+3.0
+12
+1.06066017177982
+22
+2.56066017177982
+32
+3.0
+13
+1.06066017177982
+23
+2.56066017177982
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.439339828220179
+20
+1.93933982822018
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.439339828220179
+21
+1.93933982822018
+31
+3.0
+12
+0.600815724465256
+22
+2.10081572446526
+32
+3.0
+13
+0.600815724465256
+23
+2.10081572446526
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+0.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.5477299185099
+30
+1.5
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.0
+22
+1.64318975552969
+32
+2.795
+13
+0.0
+23
+1.64318975552969
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+1.14599166666667
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+2.795
+11
+1.02509652509652
+21
+3.0
+31
+2.32009652509652
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.205
+21
+3.0
+31
+2.795
+12
+1.35681024447031
+22
+3.0
+32
+2.795
+13
+1.35681024447031
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.06066017177982
+21
+2.56066017177982
+31
+3.0
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.452270081490105
+20
+3.0
+30
+1.5
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.35681024447031
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.35681024447031
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.248866021560526
+21
+1.74886602156053
+31
+3.0
+12
+0.439339828220179
+22
+1.93933982822018
+32
+3.0
+13
+0.439339828220179
+23
+1.93933982822018
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+1.14599166666667
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.64318975552969
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+1.64318975552969
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.883139136394791
+21
+3.0
+31
+2.11686086360521
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+1.35681024447031
+21
+3.0
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.35681024447031
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+1.02509652509652
+22
+3.0
+32
+2.32009652509652
+13
+1.02509652509652
+23
+3.0
+33
+2.32009652509652
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.14599166666667
+13
+0.205
+23
+3.0
+33
+1.14599166666667
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.205
+21
+3.0
+31
+1.14599166666667
+12
+0.350582590815627
+22
+3.0
+32
+1.35441740918437
+13
+0.350582590815627
+23
+3.0
+33
+1.35441740918437
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.452270081490105
+22
+3.0
+32
+1.5
+13
+0.452270081490105
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.452270081490105
+21
+3.0
+31
+1.5
+12
+0.883139136394791
+22
+3.0
+32
+2.11686086360521
+13
+0.883139136394791
+23
+3.0
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+1.64318975552969
+30
+2.795
+11
+0.248866021560526
+21
+1.74886602156053
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+1.64318975552969
+31
+2.795
+12
+0.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+0.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.439339828220179
+22
+1.93933982822018
+32
+3.0
+13
+0.439339828220179
+23
+1.93933982822018
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.439339828220179
+20
+1.93933982822018
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.600815724465256
+22
+2.10081572446526
+32
+3.0
+13
+0.600815724465256
+23
+2.10081572446526
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.600815724465256
+20
+2.10081572446526
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.75
+22
+2.25
+32
+3.0
+13
+0.75
+23
+2.25
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.0
+22
+2.5477299185099
+32
+1.5
+13
+0.0
+23
+2.5477299185099
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.899184275534744
+22
+2.39918427553474
+32
+3.0
+13
+0.899184275534744
+23
+2.39918427553474
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.899184275534744
+20
+2.39918427553474
+30
+3.0
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+1.06066017177982
+22
+2.56066017177982
+32
+3.0
+13
+1.06066017177982
+23
+2.56066017177982
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.25113397843947
+20
+2.75113397843947
+30
+3.0
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+1.35681024447031
+22
+3.0
+32
+2.795
+13
+1.35681024447031
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+2.57375
+21
+0.426250000000001
+31
+3.0
+12
+2.36016784552609
+22
+0.212667845526093
+32
+3.0
+13
+2.36016784552609
+23
+0.212667845526093
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.57375
+20
+0.426250000000001
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.57375
+20
+0.426250000000001
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.99999999999999
+21
+0.852499999999996
+31
+3.0
+12
+2.7873321544739
+22
+0.639832154473909
+32
+3.0
+13
+2.7873321544739
+23
+0.639832154473909
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+1.79190321753102e-16
+31
+2.35249999999999
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+1.79190321753102e-16
+30
+2.35249999999999
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.3525
+20
+5.67320709797468e-17
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.3525
+20
+5.67320709797468e-17
+30
+2.795
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.795
+22
+1.79190321753102e-16
+32
+2.35249999999999
+13
+2.795
+23
+1.79190321753102e-16
+33
+2.35249999999999
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+4.71844785465692e-16
+30
+2.1475
+11
+3.0
+21
+0.205
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.795
+11
+2.99999999999999
+21
+4.71844785465692e-16
+31
+2.1475
+12
+3.0
+22
+0.205
+32
+2.3525
+13
+3.0
+23
+0.205
+33
+2.3525
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+3.0
+11
+2.99999999999999
+21
+0.647499999999997
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.99999999999999
+21
+0.647499999999997
+31
+2.795
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+3.0
+21
+0.205
+31
+2.795
+12
+3.0
+22
+0.426249999999999
+32
+2.57375
+13
+3.0
+23
+0.426249999999999
+33
+2.57375
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+2.36016784552609
+21
+0.212667845526093
+31
+3.0
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.426249999999999
+30
+2.57375
+11
+3.0
+21
+0.205
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.3525
+13
+3.0
+23
+0.205
+33
+2.3525
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.7873321544739
+21
+0.639832154473909
+31
+3.0
+12
+2.57375
+22
+0.426250000000001
+32
+3.0
+13
+2.57375
+23
+0.426250000000001
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.7873321544739
+20
+0.639832154473909
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.3525
+20
+5.67320709797468e-17
+30
+2.795
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+1.79190321753102e-16
+30
+2.35249999999999
+11
+3.0
+21
+0.205
+31
+2.3525
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.3525
+11
+2.795
+21
+1.79190321753102e-16
+31
+2.35249999999999
+12
+2.57375
+22
+1.17961196366424e-16
+32
+2.57375
+13
+2.57375
+23
+1.17961196366424e-16
+33
+2.57375
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.3525
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+3.0
+22
+0.426249999999999
+32
+2.57375
+13
+3.0
+23
+0.426249999999999
+33
+2.57375
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.426249999999999
+30
+2.57375
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.3525
+22
+5.67320709797468e-17
+32
+2.795
+13
+2.3525
+23
+5.67320709797468e-17
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.426249999999999
+30
+2.57375
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+2.99999999999999
+22
+0.647499999999997
+32
+2.795
+13
+2.99999999999999
+23
+0.647499999999997
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+2.14749999999999
+21
+0.0
+31
+3.0
+12
+2.36016784552609
+22
+0.212667845526093
+32
+3.0
+13
+2.36016784552609
+23
+0.212667845526093
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+2.99999999999999
+21
+0.852499999999996
+31
+3.0
+12
+2.99999999999999
+22
+0.647499999999997
+32
+2.795
+13
+2.99999999999999
+23
+0.647499999999997
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.852499999999996
+30
+3.0
+11
+2.36016784552609
+21
+0.212667845526093
+31
+3.0
+12
+2.57375
+22
+0.426250000000001
+32
+3.0
+13
+2.57375
+23
+0.426250000000001
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.852499999999996
+30
+3.0
+11
+2.57375
+21
+0.426250000000001
+31
+3.0
+12
+2.7873321544739
+22
+0.639832154473909
+32
+3.0
+13
+2.7873321544739
+23
+0.639832154473909
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.332481491301358
+20
+1.26776612947518
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.883139136394789
+20
+0.883139136394789
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.733367557775275
+22
+0.987752578969537
+32
+3.0
+13
+0.733367557775275
+23
+0.987752578969537
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.31701681130471
+21
+0.580081389077034
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.31701681130471
+20
+0.580081389077034
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.452270081490099
+32
+3.0
+13
+1.5
+23
+0.452270081490099
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.02269438387197
+21
+0.78566166435019
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.02269438387197
+20
+0.78566166435019
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.16340159356772
+22
+0.687379562118006
+32
+3.0
+13
+1.16340159356772
+23
+0.687379562118006
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.64558259081562
+21
+1.06434958002245e-16
+31
+2.64941740918438
+12
+1.85400833333332
+22
+6.2236879303386e-17
+32
+2.795
+13
+1.85400833333332
+23
+6.2236879303386e-17
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.679903474903479
+20
+3.11213701008545e-16
+30
+1.97490347490348
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+4.11920172793637e-16
+32
+1.64318975552968
+13
+0.205
+23
+4.11920172793637e-16
+33
+1.64318975552968
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.679903474903479
+21
+3.11213701008545e-16
+31
+1.97490347490348
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.295
+32
+2.795
+13
+0.0
+23
+1.295
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+1.295
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+1.295
+30
+2.795
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+1.295
+30
+2.795
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.75
+30
+2.25
+11
+0.0
+21
+0.205
+31
+1.705
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.705
+13
+0.0
+23
+0.205
+33
+1.705
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+1.295
+30
+2.795
+11
+0.0
+21
+0.75
+31
+2.25
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.14749999999999
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.85400833333332
+22
+6.2236879303386e-17
+32
+2.795
+13
+1.85400833333332
+23
+6.2236879303386e-17
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.14749999999999
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.883139136394789
+20
+0.883139136394789
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.883139136394789
+20
+0.883139136394789
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.02269438387197
+22
+0.78566166435019
+32
+3.0
+13
+1.02269438387197
+23
+0.78566166435019
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.16340159356772
+21
+0.687379562118006
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.16340159356772
+20
+0.687379562118006
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.31701681130471
+22
+0.580081389077034
+32
+3.0
+13
+1.31701681130471
+23
+0.580081389077034
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.452270081490099
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+0.452270081490099
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.74203407868223
+22
+0.283212517800531
+32
+3.0
+13
+1.74203407868223
+23
+0.283212517800531
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+1.74203407868223
+22
+0.283212517800531
+32
+3.0
+13
+1.74203407868223
+23
+0.283212517800531
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.733367557775275
+20
+0.987752578969537
+30
+3.0
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.733367557775275
+21
+0.987752578969537
+31
+3.0
+12
+0.558389724096057
+22
+1.10997225325071
+32
+3.0
+13
+0.558389724096057
+23
+1.10997225325071
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.558389724096057
+20
+1.10997225325071
+30
+3.0
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.558389724096057
+21
+1.10997225325071
+31
+3.0
+12
+0.332481491301358
+22
+1.26776612947518
+32
+3.0
+13
+0.332481491301358
+23
+1.26776612947518
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+4.11920172793637e-16
+30
+1.64318975552968
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.0
+30
+2.795
+11
+0.205
+21
+4.11920172793637e-16
+31
+1.64318975552968
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+1.37306724264545e-16
+31
+2.5477299185099
+12
+1.64558259081562
+22
+1.06434958002245e-16
+32
+2.64941740918438
+13
+1.64558259081562
+23
+1.06434958002245e-16
+33
+2.64941740918438
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+1.37306724264545e-16
+30
+2.5477299185099
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+0.88313913639479
+22
+2.68116213853163e-16
+32
+2.11686086360521
+13
+0.88313913639479
+23
+2.68116213853163e-16
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+1.37306724264545e-16
+31
+2.5477299185099
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+0.679903474903479
+21
+3.11213701008545e-16
+31
+1.97490347490348
+12
+0.88313913639479
+22
+2.68116213853163e-16
+32
+2.11686086360521
+13
+0.88313913639479
+23
+2.68116213853163e-16
+33
+2.11686086360521
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.14749999999999
+20
+0.0
+30
+3.0
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+1.705
+11
+0.205
+21
+4.11920172793637e-16
+31
+1.64318975552968
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+4.11920172793637e-16
+30
+1.64318975552968
+11
+0.0
+21
+0.205
+31
+1.705
+12
+0.679903474903479
+22
+3.11213701008545e-16
+32
+1.97490347490348
+13
+0.679903474903479
+23
+3.11213701008545e-16
+33
+1.97490347490348
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.679903474903479
+20
+3.11213701008545e-16
+30
+1.97490347490348
+11
+0.0
+21
+0.205
+31
+1.705
+12
+0.0
+22
+0.75
+32
+2.25
+13
+0.0
+23
+0.75
+33
+2.25
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.679903474903479
+20
+3.11213701008545e-16
+30
+1.97490347490348
+11
+0.0
+21
+0.75
+31
+2.25
+12
+0.88313913639479
+22
+2.68116213853163e-16
+32
+2.11686086360521
+13
+0.88313913639479
+23
+2.68116213853163e-16
+33
+2.11686086360521
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.88313913639479
+20
+2.68116213853163e-16
+30
+2.11686086360521
+11
+0.0
+21
+0.75
+31
+2.25
+12
+1.5
+22
+1.37306724264545e-16
+32
+2.5477299185099
+13
+1.5
+23
+1.37306724264545e-16
+33
+2.5477299185099
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+1.37306724264545e-16
+30
+2.5477299185099
+11
+0.0
+21
+0.75
+31
+2.25
+12
+0.0
+22
+1.295
+32
+2.795
+13
+0.0
+23
+1.295
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+1.37306724264545e-16
+30
+2.5477299185099
+11
+0.0
+21
+1.295
+31
+2.795
+12
+1.64558259081562
+22
+1.06434958002245e-16
+32
+2.64941740918438
+13
+1.64558259081562
+23
+1.06434958002245e-16
+33
+2.64941740918438
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.64558259081562
+20
+1.06434958002245e-16
+30
+2.64941740918438
+11
+0.0
+21
+1.295
+31
+2.795
+12
+1.85400833333332
+22
+6.2236879303386e-17
+32
+2.795
+13
+1.85400833333332
+23
+6.2236879303386e-17
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.85400833333332
+20
+6.2236879303386e-17
+30
+2.795
+11
+0.0
+21
+1.295
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.85400833333332
+20
+6.2236879303386e-17
+30
+2.795
+11
+0.0
+21
+1.5
+31
+3.0
+12
+2.1106623891929
+22
+0.0257305779793383
+32
+3.0
+13
+2.1106623891929
+23
+0.0257305779793383
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.85400833333332
+20
+6.2236879303386e-17
+30
+2.795
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.332481491301358
+22
+1.26776612947518
+32
+3.0
+13
+0.332481491301358
+23
+1.26776612947518
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+0.332481491301358
+21
+1.26776612947518
+31
+3.0
+12
+0.558389724096057
+22
+1.10997225325071
+32
+3.0
+13
+0.558389724096057
+23
+1.10997225325071
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+0.558389724096057
+21
+1.10997225325071
+31
+3.0
+12
+0.733367557775275
+22
+0.987752578969537
+32
+3.0
+13
+0.733367557775275
+23
+0.987752578969537
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+0.733367557775275
+21
+0.987752578969537
+31
+3.0
+12
+0.883139136394789
+22
+0.883139136394789
+32
+3.0
+13
+0.883139136394789
+23
+0.883139136394789
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+1.02269438387197
+22
+0.78566166435019
+32
+3.0
+13
+1.02269438387197
+23
+0.78566166435019
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+1.02269438387197
+21
+0.78566166435019
+31
+3.0
+12
+1.16340159356772
+22
+0.687379562118006
+32
+3.0
+13
+1.16340159356772
+23
+0.687379562118006
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+1.16340159356772
+21
+0.687379562118006
+31
+3.0
+12
+1.31701681130471
+22
+0.580081389077034
+32
+3.0
+13
+1.31701681130471
+23
+0.580081389077034
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+1.31701681130471
+21
+0.580081389077034
+31
+3.0
+12
+1.5
+22
+0.452270081490099
+32
+3.0
+13
+1.5
+23
+0.452270081490099
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_usw
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+1.5
+21
+0.452270081490099
+31
+3.0
+12
+1.74203407868223
+22
+0.283212517800531
+32
+3.0
+13
+1.74203407868223
+23
+0.283212517800531
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.74886602156053
+22
+0.248866021560525
+32
+-1.29693882069326e-16
+13
+1.74886602156053
+23
+0.248866021560525
+33
+-1.29693882069326e-16
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.10081572446526
+20
+0.600815724465256
+30
+-7.75948602460171e-17
+11
+2.12132034355964
+21
+0.0
+31
+0.0
+12
+1.93933982822018
+22
+0.439339828220178
+32
+-1.0149809463712e-16
+13
+1.93933982822018
+23
+0.439339828220178
+33
+-1.0149809463712e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.10081572446526
+21
+0.600815724465256
+31
+-7.75948602460171e-17
+12
+2.50226795687895
+22
+0.0
+32
+0.0
+13
+2.50226795687895
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.93933982822018
+20
+0.439339828220178
+30
+-1.0149809463712e-16
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.74886602156053
+22
+0.248866021560525
+32
+-1.29693882069326e-16
+13
+1.74886602156053
+23
+0.248866021560525
+33
+-1.29693882069326e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.93933982822018
+21
+0.439339828220178
+31
+-1.0149809463712e-16
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.64941740918437
+20
+1.80782203615711e-16
+30
+1.64558259081563
+11
+2.54772991850989
+21
+1.64788632875096e-16
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.64318975552969
+21
+2.25211131595965e-17
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.64318975552969
+20
+2.25211131595965e-17
+30
+0.205
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+1.97490347490348
+22
+7.46935760775808e-17
+32
+0.679903474903477
+13
+1.97490347490348
+23
+7.46935760775808e-17
+33
+0.679903474903477
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.11686086360521
+21
+9.70208606166603e-17
+31
+0.883139136394791
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.11686086360521
+20
+9.70208606166603e-17
+30
+0.883139136394791
+11
+2.795
+21
+0.0
+31
+1.5
+12
+2.54772991850989
+22
+1.64788632875096e-16
+32
+1.5
+13
+2.54772991850989
+23
+1.64788632875096e-16
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.64318975552969
+22
+2.25211131595965e-17
+32
+0.205
+13
+1.64318975552969
+23
+2.25211131595965e-17
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+3.0
+22
+0.452270081490106
+32
+1.5
+13
+3.0
+23
+0.452270081490106
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.56066017177982
+20
+1.06066017177982
+30
+-9.52420782539579e-18
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+2.39918427553474
+22
+0.899184275534743
+32
+-3.34274422164983e-17
+13
+2.39918427553474
+23
+0.899184275534743
+33
+-3.34274422164983e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.56066017177982
+21
+1.06066017177982
+31
+-9.52420782539579e-18
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.25
+20
+0.75
+30
+-5.55111512312576e-17
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.10081572446526
+22
+0.600815724465256
+32
+-7.75948602460171e-17
+13
+2.10081572446526
+23
+0.600815724465256
+33
+-7.75948602460171e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.25
+21
+0.75
+31
+-5.55111512312576e-17
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.75113397843947
+21
+1.25113397843947
+31
+1.86715796068105e-17
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.39918427553474
+20
+0.899184275534743
+30
+-3.34274422164983e-17
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.25
+22
+0.75
+32
+-5.55111512312576e-17
+13
+2.25
+23
+0.75
+33
+-5.55111512312576e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.39918427553474
+21
+0.899184275534743
+31
+-3.34274422164983e-17
+12
+3.0
+22
+0.497732043121051
+32
+0.0
+13
+3.0
+23
+0.497732043121051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.75113397843947
+20
+1.25113397843947
+30
+1.86715796068105e-17
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+2.56066017177982
+22
+1.06066017177982
+32
+-9.52420782539579e-18
+13
+2.56066017177982
+23
+1.06066017177982
+33
+-9.52420782539579e-18
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.75113397843947
+21
+1.25113397843947
+31
+1.86715796068105e-17
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.97490347490348
+20
+7.46935760775808e-17
+30
+0.679903474903477
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.64318975552969
+22
+2.25211131595965e-17
+32
+0.205
+13
+1.64318975552969
+23
+2.25211131595965e-17
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.97490347490348
+21
+7.46935760775808e-17
+31
+0.679903474903477
+12
+1.74886602156053
+22
+0.248866021560525
+32
+-1.29693882069326e-16
+13
+1.74886602156053
+23
+0.248866021560525
+33
+-1.29693882069326e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+1.97490347490348
+21
+7.46935760775808e-17
+31
+0.679903474903477
+12
+2.11686086360521
+22
+9.70208606166603e-17
+32
+0.883139136394791
+13
+2.11686086360521
+23
+9.70208606166603e-17
+33
+0.883139136394791
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+2.11686086360521
+21
+9.70208606166603e-17
+31
+0.883139136394791
+12
+2.54772991850989
+22
+1.64788632875096e-16
+32
+1.5
+13
+2.54772991850989
+23
+1.64788632875096e-16
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+2.54772991850989
+21
+1.64788632875096e-16
+31
+1.5
+12
+2.64941740918437
+22
+1.80782203615711e-16
+32
+1.64558259081563
+13
+2.64941740918437
+23
+1.80782203615711e-16
+33
+1.64558259081563
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+2.64941740918437
+21
+1.80782203615711e-16
+31
+1.64558259081563
+12
+2.795
+22
+2.03679665726025e-16
+32
+1.85400833333335
+13
+2.795
+23
+2.03679665726025e-16
+33
+1.85400833333335
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+2.795
+21
+2.03679665726025e-16
+31
+1.85400833333335
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+2.99999999999999
+21
+4.71844785465692e-16
+31
+2.1475
+12
+3.0
+22
+0.205
+32
+1.85400833333334
+13
+3.0
+23
+0.205
+33
+1.85400833333334
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+3.0
+21
+0.205
+31
+1.85400833333334
+12
+3.0
+22
+0.452270081490106
+32
+1.5
+13
+3.0
+23
+0.452270081490106
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+3.0
+21
+0.452270081490106
+31
+1.5
+12
+1.93933982822018
+22
+0.439339828220178
+32
+-1.0149809463712e-16
+13
+1.93933982822018
+23
+0.439339828220178
+33
+-1.0149809463712e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+1.93933982822018
+20
+0.439339828220178
+30
+-1.0149809463712e-16
+11
+3.0
+21
+0.452270081490106
+31
+1.5
+12
+2.10081572446526
+22
+0.600815724465256
+32
+-7.75948602460171e-17
+13
+2.10081572446526
+23
+0.600815724465256
+33
+-7.75948602460171e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.10081572446526
+20
+0.600815724465256
+30
+-7.75948602460171e-17
+11
+3.0
+21
+0.452270081490106
+31
+1.5
+12
+3.0
+22
+0.883139136394791
+32
+0.883139136394791
+13
+3.0
+23
+0.883139136394791
+33
+0.883139136394791
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.10081572446526
+20
+0.600815724465256
+30
+-7.75948602460171e-17
+11
+3.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+2.25
+22
+0.75
+32
+-5.55111512312576e-17
+13
+2.25
+23
+0.75
+33
+-5.55111512312576e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.25
+20
+0.75
+30
+-5.55111512312576e-17
+11
+3.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+2.39918427553474
+22
+0.899184275534743
+32
+-3.34274422164983e-17
+13
+2.39918427553474
+23
+0.899184275534743
+33
+-3.34274422164983e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.39918427553474
+20
+0.899184275534743
+30
+-3.34274422164983e-17
+11
+3.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+3.0
+22
+1.35681024447031
+32
+0.205
+13
+3.0
+23
+1.35681024447031
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.39918427553474
+20
+0.899184275534743
+30
+-3.34274422164983e-17
+11
+3.0
+21
+1.35681024447031
+31
+0.205
+12
+2.56066017177982
+22
+1.06066017177982
+32
+-9.52420782539579e-18
+13
+2.56066017177982
+23
+1.06066017177982
+33
+-9.52420782539579e-18
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.56066017177982
+20
+1.06066017177982
+30
+-9.52420782539579e-18
+11
+3.0
+21
+1.35681024447031
+31
+0.205
+12
+2.75113397843947
+22
+1.25113397843947
+32
+1.86715796068105e-17
+13
+2.75113397843947
+23
+1.25113397843947
+33
+1.86715796068105e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.75113397843947
+20
+1.25113397843947
+30
+1.86715796068105e-17
+11
+3.0
+21
+1.35681024447031
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.452270081490106
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.85400833333334
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+2.03679665726025e-16
+30
+1.85400833333335
+11
+2.64941740918437
+21
+1.80782203615711e-16
+31
+1.64558259081563
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+1.35681024447031
+30
+0.205
+11
+3.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+1.35681024447031
+32
+0.205
+13
+3.0
+23
+1.35681024447031
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+1.35681024447031
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+1.35681024447031
+30
+0.205
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+1.35681024447031
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.205
+30
+1.5
+11
+2.99999999999999
+21
+4.71844785465692e-16
+31
+2.1475
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.99999999999999
+20
+4.71844785465692e-16
+30
+2.1475
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+1.85400833333334
+13
+3.0
+23
+0.205
+33
+1.85400833333334
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.99999999999999
+20
+4.71844785465692e-16
+30
+2.1475
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.99999999999999
+21
+4.71844785465692e-16
+31
+2.1475
+12
+2.795
+22
+2.03679665726025e-16
+32
+1.85400833333335
+13
+2.795
+23
+2.03679665726025e-16
+33
+1.85400833333335
+70
+1
+ 0
+3DFACE
+ 8
+iso_dse
+10
+2.11686086360521
+20
+9.70208606166603e-17
+30
+0.883139136394791
+11
+1.97490347490348
+21
+7.46935760775808e-17
+31
+0.679903474903477
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.41991861092296
+20
+1.68298318869529
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.31262043788199
+22
+1.83659840643228
+32
+3.0
+13
+2.31262043788199
+23
+1.83659840643228
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.41991861092296
+21
+1.68298318869529
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.54772991850989
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.41991861092296
+22
+1.68298318869529
+32
+3.0
+13
+2.41991861092296
+23
+1.68298318869529
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.54772991850989
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.97426942202063
+20
+0.889337610807109
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.71678748219945
+22
+1.25796592131777
+32
+3.0
+13
+2.71678748219945
+23
+1.25796592131777
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.97426942202063
+21
+0.889337610807109
+31
+3.0
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.71678748219945
+20
+1.25796592131777
+30
+3.0
+11
+3.0
+21
+1.5
+31
+3.0
+12
+2.54772991850989
+22
+1.5
+32
+3.0
+13
+2.54772991850989
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.5
+30
+3.0
+11
+2.71678748219945
+21
+1.25796592131777
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.705
+22
+3.0
+32
+2.795
+13
+1.705
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.14599166666666
+30
+2.795
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+3.0
+21
+1.14599166666666
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.14599166666666
+31
+2.795
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.25
+21
+3.0
+31
+2.25
+12
+1.705
+22
+3.0
+32
+2.795
+13
+1.705
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.795
+20
+3.0
+30
+1.705
+11
+3.0
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.705
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+2.54772991850989
+13
+3.0
+23
+1.5
+33
+2.54772991850989
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.64318975552969
+13
+3.0
+23
+2.795
+33
+1.64318975552969
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.705
+12
+2.25
+22
+3.0
+32
+2.25
+13
+2.25
+23
+3.0
+33
+2.25
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+3.0
+22
+2.795
+32
+1.64318975552969
+13
+3.0
+23
+2.795
+33
+1.64318975552969
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.31262043788199
+20
+1.83659840643228
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.2143383356498
+22
+1.97730561612803
+32
+3.0
+13
+2.2143383356498
+23
+1.97730561612803
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.31262043788199
+21
+1.83659840643228
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.01224742103046
+20
+2.26663244222472
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.89002774674928
+22
+2.44161027590394
+32
+3.0
+13
+1.89002774674928
+23
+2.44161027590394
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.01224742103046
+21
+2.26663244222472
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+1.89002774674928
+20
+2.44161027590394
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.73223387052482
+22
+2.66751850869864
+32
+3.0
+13
+1.73223387052482
+23
+2.66751850869864
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.89002774674928
+21
+2.44161027590394
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.11686086360521
+20
+2.11686086360521
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+2.01224742103046
+22
+2.26663244222472
+32
+3.0
+13
+2.01224742103046
+23
+2.26663244222472
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.11686086360521
+21
+2.11686086360521
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.2143383356498
+20
+1.97730561612803
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.11686086360521
+22
+2.11686086360521
+32
+3.0
+13
+2.11686086360521
+23
+2.11686086360521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.2143383356498
+21
+1.97730561612803
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.14599166666666
+31
+2.795
+12
+3.0
+22
+1.5
+32
+2.54772991850989
+13
+3.0
+23
+1.5
+33
+2.54772991850989
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.73223387052482
+22
+2.66751850869864
+32
+3.0
+13
+1.73223387052482
+23
+2.66751850869864
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+2.97426942202063
+21
+0.889337610807109
+31
+3.0
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_une
+10
+2.97426942202063
+20
+0.889337610807109
+30
+3.0
+11
+3.0
+21
+1.14599166666666
+31
+2.795
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.14599166666666
+30
+2.795
+11
+2.97426942202063
+21
+0.889337610807109
+31
+3.0
+12
+2.71678748219945
+22
+1.25796592131777
+32
+3.0
+13
+2.71678748219945
+23
+1.25796592131777
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.14599166666666
+30
+2.795
+11
+2.71678748219945
+21
+1.25796592131777
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.54772991850989
+13
+3.0
+23
+1.5
+33
+2.54772991850989
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.5
+30
+2.54772991850989
+11
+2.71678748219945
+21
+1.25796592131777
+31
+3.0
+12
+2.54772991850989
+22
+1.5
+32
+3.0
+13
+2.54772991850989
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.5
+30
+2.54772991850989
+11
+2.54772991850989
+21
+1.5
+31
+3.0
+12
+2.41991861092296
+22
+1.68298318869529
+32
+3.0
+13
+2.41991861092296
+23
+1.68298318869529
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+1.5
+30
+2.54772991850989
+11
+2.41991861092296
+21
+1.68298318869529
+31
+3.0
+12
+3.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+3.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+2.41991861092296
+21
+1.68298318869529
+31
+3.0
+12
+2.31262043788199
+22
+1.83659840643228
+32
+3.0
+13
+2.31262043788199
+23
+1.83659840643228
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+2.31262043788199
+21
+1.83659840643228
+31
+3.0
+12
+2.2143383356498
+22
+1.97730561612803
+32
+3.0
+13
+2.2143383356498
+23
+1.97730561612803
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+2.2143383356498
+21
+1.97730561612803
+31
+3.0
+12
+2.11686086360521
+22
+2.11686086360521
+32
+3.0
+13
+2.11686086360521
+23
+2.11686086360521
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+2.11686086360521
+21
+2.11686086360521
+31
+3.0
+12
+2.01224742103046
+22
+2.26663244222472
+32
+3.0
+13
+2.01224742103046
+23
+2.26663244222472
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+2.01224742103046
+21
+2.26663244222472
+31
+3.0
+12
+3.0
+22
+2.795
+32
+1.64318975552969
+13
+3.0
+23
+2.795
+33
+1.64318975552969
+70
+3
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.795
+30
+1.64318975552969
+11
+2.01224742103046
+21
+2.26663244222472
+31
+3.0
+12
+1.89002774674928
+22
+2.44161027590394
+32
+3.0
+13
+1.89002774674928
+23
+2.44161027590394
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.795
+30
+1.64318975552969
+11
+1.89002774674928
+21
+2.44161027590394
+31
+3.0
+12
+1.73223387052482
+22
+2.66751850869864
+32
+3.0
+13
+1.73223387052482
+23
+2.66751850869864
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.795
+30
+1.64318975552969
+11
+1.73223387052482
+21
+2.66751850869864
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+2.795
+30
+1.64318975552969
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.705
+22
+3.0
+32
+2.795
+13
+1.705
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+1.705
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+2.795
+32
+1.64318975552969
+13
+3.0
+23
+2.795
+33
+1.64318975552969
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+1.5
+11
+1.705
+21
+3.0
+31
+2.795
+12
+2.25
+22
+3.0
+32
+2.25
+13
+2.25
+23
+3.0
+33
+2.25
+70
+13
+ 0
+3DFACE
+ 8
+iso_une
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.25
+21
+3.0
+31
+2.25
+12
+2.795
+22
+3.0
+32
+1.705
+13
+2.795
+23
+3.0
+33
+1.705
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.88313913639479
+20
+2.68116213853163e-16
+30
+2.11686086360521
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.88313913639479
+21
+2.68116213853163e-16
+31
+2.11686086360521
+12
+0.679903474903479
+22
+3.11213701008545e-16
+32
+1.97490347490348
+13
+0.679903474903479
+23
+3.11213701008545e-16
+33
+1.97490347490348
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.5
+30
+1.5
+11
+2.99999999999999
+21
+0.647499999999997
+31
+2.795
+12
+3.0
+22
+0.426249999999999
+32
+2.57375
+13
+3.0
+23
+0.426249999999999
+33
+2.57375
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+12
+3.0
+22
+1.14599166666666
+32
+2.795
+13
+3.0
+23
+1.14599166666666
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.14599166666666
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+12
+3.0
+22
+1.5
+32
+2.54772991850989
+13
+3.0
+23
+1.5
+33
+2.54772991850989
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.705
+30
+0.205
+11
+3.0
+21
+1.5
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.705
+31
+0.205
+12
+3.0
+22
+2.25
+32
+0.75
+13
+3.0
+23
+2.25
+33
+0.75
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.64941740918437
+20
+1.80782203615711e-16
+30
+1.64558259081563
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.54772991850989
+22
+1.64788632875096e-16
+32
+1.5
+13
+2.54772991850989
+23
+1.64788632875096e-16
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+0.0
+30
+1.5
+11
+2.64941740918437
+21
+1.80782203615711e-16
+31
+1.64558259081563
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+1.37306724264545e-16
+31
+2.5477299185099
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.37306724264545e-16
+30
+2.5477299185099
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+1.64558259081562
+22
+1.06434958002245e-16
+32
+2.64941740918438
+13
+1.64558259081562
+23
+1.06434958002245e-16
+33
+2.64941740918438
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.57375
+20
+1.17961196366424e-16
+30
+2.57375
+11
+1.64558259081562
+21
+1.06434958002245e-16
+31
+2.64941740918438
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.64558259081562
+20
+1.06434958002245e-16
+30
+2.64941740918438
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.3525
+22
+5.67320709797468e-17
+32
+2.795
+13
+2.3525
+23
+5.67320709797468e-17
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.64558259081562
+20
+1.06434958002245e-16
+30
+2.64941740918438
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+1.85400833333332
+22
+6.2236879303386e-17
+32
+2.795
+13
+1.85400833333332
+23
+6.2236879303386e-17
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.97490347490348
+20
+7.46935760775808e-17
+30
+0.679903474903477
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.64318975552969
+22
+2.25211131595965e-17
+32
+0.205
+13
+1.64318975552969
+23
+2.25211131595965e-17
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+0.452270081490106
+30
+1.5
+11
+3.0
+21
+0.205
+31
+2.3525
+12
+3.0
+22
+0.205
+32
+1.85400833333334
+13
+3.0
+23
+0.205
+33
+1.85400833333334
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+0.205
+30
+2.3525
+11
+3.0
+21
+0.452270081490106
+31
+1.5
+12
+3.0
+22
+0.426249999999999
+32
+2.57375
+13
+3.0
+23
+0.426249999999999
+33
+2.57375
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+0.426249999999999
+30
+2.57375
+11
+3.0
+21
+0.452270081490106
+31
+1.5
+12
+3.0
+22
+1.5
+32
+1.5
+13
+3.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.14599166666666
+30
+2.795
+11
+2.99999999999999
+21
+0.852499999999996
+31
+3.0
+12
+2.99999999999999
+22
+0.647499999999997
+32
+2.795
+13
+2.99999999999999
+23
+0.647499999999997
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.452270081490106
+31
+1.5
+12
+3.0
+22
+0.883139136394791
+32
+0.883139136394791
+13
+3.0
+23
+0.883139136394791
+33
+0.883139136394791
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.35681024447031
+30
+0.205
+11
+3.0
+21
+1.5
+31
+1.5
+12
+3.0
+22
+0.883139136394791
+32
+0.883139136394791
+13
+3.0
+23
+0.883139136394791
+33
+0.883139136394791
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.35681024447031
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.295
+20
+2.39623136148263e-17
+30
+0.205
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+0.75
+22
+1.38777878078145e-17
+32
+0.75
+13
+0.75
+23
+1.38777878078145e-17
+33
+0.75
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.89002774674928
+21
+2.44161027590394
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.89002774674928
+20
+2.44161027590394
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.89002774674928
+20
+2.44161027590394
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.01224742103046
+22
+2.26663244222472
+32
+3.0
+13
+2.01224742103046
+23
+2.26663244222472
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.2143383356498
+21
+1.97730561612803
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.2143383356498
+20
+1.97730561612803
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.2143383356498
+20
+1.97730561612803
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.31262043788199
+22
+1.83659840643228
+32
+3.0
+13
+2.31262043788199
+23
+1.83659840643228
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.31701681130471
+20
+0.580081389077034
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+1.16340159356772
+22
+0.687379562118006
+32
+3.0
+13
+1.16340159356772
+23
+0.687379562118006
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.31701681130471
+21
+0.580081389077034
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.31701681130471
+21
+0.580081389077034
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.36016784552609
+21
+0.212667845526093
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.36016784552609
+21
+0.212667845526093
+31
+3.0
+12
+2.57375
+22
+0.426250000000001
+32
+3.0
+13
+2.57375
+23
+0.426250000000001
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.73223387052482
+22
+2.66751850869864
+32
+3.0
+13
+1.73223387052482
+23
+2.66751850869864
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.73223387052482
+20
+2.66751850869864
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.16340159356772
+20
+0.687379562118006
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+1.02269438387197
+22
+0.78566166435019
+32
+3.0
+13
+1.02269438387197
+23
+0.78566166435019
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+1.16340159356772
+21
+0.687379562118006
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.16340159356772
+21
+0.687379562118006
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.11686086360521
+21
+2.11686086360521
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.11686086360521
+20
+2.11686086360521
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.11686086360521
+20
+2.11686086360521
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.2143383356498
+22
+1.97730561612803
+32
+3.0
+13
+2.2143383356498
+23
+1.97730561612803
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.71678748219945
+20
+1.25796592131777
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+2.71678748219945
+21
+1.25796592131777
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.71678748219945
+21
+1.25796592131777
+31
+3.0
+12
+2.54772991850989
+22
+1.5
+32
+3.0
+13
+2.54772991850989
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.772725344843521
+20
+1.27938364528661
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.600815724465256
+21
+2.10081572446526
+31
+3.0
+12
+0.439339828220179
+22
+1.93933982822018
+32
+3.0
+13
+0.439339828220179
+23
+1.93933982822018
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.600815724465256
+20
+2.10081572446526
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.600815724465256
+20
+2.10081572446526
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.558389724096057
+20
+1.10997225325071
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.332481491301358
+22
+1.26776612947518
+32
+3.0
+13
+0.332481491301358
+23
+1.26776612947518
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.558389724096057
+21
+1.10997225325071
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.772725344843521
+20
+1.27938364528661
+30
+3.0
+11
+0.558389724096057
+21
+1.10997225325071
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.733367557775275
+20
+0.987752578969537
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.558389724096057
+22
+1.10997225325071
+32
+3.0
+13
+0.558389724096057
+23
+1.10997225325071
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.733367557775275
+21
+0.987752578969537
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+0.733367557775275
+21
+0.987752578969537
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.97426942202063
+20
+0.889337610807109
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+2.97426942202063
+21
+0.889337610807109
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.97426942202063
+21
+0.889337610807109
+31
+3.0
+12
+2.71678748219945
+22
+1.25796592131777
+32
+3.0
+13
+2.71678748219945
+23
+1.25796592131777
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.75
+21
+2.25
+31
+3.0
+12
+0.600815724465256
+22
+2.10081572446526
+32
+3.0
+13
+0.600815724465256
+23
+2.10081572446526
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.332481491301358
+20
+1.26776612947518
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.332481491301358
+21
+1.26776612947518
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+0.332481491301358
+21
+1.26776612947518
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.57375
+20
+0.426250000000001
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+2.57375
+21
+0.426250000000001
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.57375
+21
+0.426250000000001
+31
+3.0
+12
+2.7873321544739
+22
+0.639832154473909
+32
+3.0
+13
+2.7873321544739
+23
+0.639832154473909
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.7873321544739
+20
+0.639832154473909
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+2.7873321544739
+21
+0.639832154473909
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.7873321544739
+21
+0.639832154473909
+31
+3.0
+12
+2.97426942202063
+22
+0.889337610807109
+32
+3.0
+13
+2.97426942202063
+23
+0.889337610807109
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.97426942202063
+20
+0.889337610807109
+30
+3.0
+11
+2.7873321544739
+21
+0.639832154473909
+31
+3.0
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.248866021560526
+21
+1.74886602156053
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+0.452270081490099
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.31701681130471
+22
+0.580081389077034
+32
+3.0
+13
+1.31701681130471
+23
+0.580081389077034
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+0.452270081490099
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+0.452270081490099
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.35681024447031
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.1106623891929
+20
+0.0257305779793383
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+2.36016784552609
+22
+0.212667845526093
+32
+3.0
+13
+2.36016784552609
+23
+0.212667845526093
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.74203407868223
+20
+0.283212517800531
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.74203407868223
+21
+0.283212517800531
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.74203407868223
+21
+0.283212517800531
+31
+3.0
+12
+2.1106623891929
+22
+0.0257305779793383
+32
+3.0
+13
+2.1106623891929
+23
+0.0257305779793383
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.06066017177982
+21
+2.56066017177982
+31
+3.0
+12
+0.899184275534744
+22
+2.39918427553474
+32
+3.0
+13
+0.899184275534744
+23
+2.39918427553474
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.25113397843947
+21
+2.75113397843947
+31
+3.0
+12
+1.06066017177982
+22
+2.56066017177982
+32
+3.0
+13
+1.06066017177982
+23
+2.56066017177982
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.25113397843947
+20
+2.75113397843947
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.25113397843947
+20
+2.75113397843947
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.34882660079146
+22
+2.26
+32
+3.0
+13
+1.34882660079146
+23
+2.26
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+1.295
+13
+3.0
+23
+2.795
+33
+1.295
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.705
+30
+0.205
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.25
+30
+0.75
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+1.5
+32
+1.5
+13
+3.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+2.25
+31
+0.75
+12
+3.0
+22
+2.795
+32
+1.295
+13
+3.0
+23
+2.795
+33
+1.295
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.74203407868223
+20
+0.283212517800531
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+0.452270081490099
+32
+3.0
+13
+1.5
+23
+0.452270081490099
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.74203407868223
+21
+0.283212517800531
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.74203407868223
+21
+0.283212517800531
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.73223387052482
+21
+2.66751850869864
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.73223387052482
+20
+2.66751850869864
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.73223387052482
+20
+2.66751850869864
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.89002774674928
+22
+2.44161027590394
+32
+3.0
+13
+1.89002774674928
+23
+2.44161027590394
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.02269438387197
+20
+0.78566166435019
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.883139136394789
+22
+0.883139136394789
+32
+3.0
+13
+0.883139136394789
+23
+0.883139136394789
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+1.02269438387197
+21
+0.78566166435019
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.02269438387197
+21
+0.78566166435019
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.34882660079146
+21
+2.26
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+3.0
+21
+1.5
+31
+2.54772991850989
+12
+3.0
+22
+1.5
+32
+1.5
+13
+3.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+3.0
+22
+1.5
+32
+1.5
+13
+3.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+1.64318975552969
+13
+3.0
+23
+2.795
+33
+1.64318975552969
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+1.64318975552969
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.205
+20
+4.11920172793637e-16
+30
+1.64318975552968
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.37306724264545e-16
+30
+2.5477299185099
+11
+0.88313913639479
+21
+2.68116213853163e-16
+31
+2.11686086360521
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+0.205
+30
+2.3525
+11
+2.99999999999999
+21
+4.71844785465692e-16
+31
+2.1475
+12
+3.0
+22
+0.205
+32
+1.85400833333334
+13
+3.0
+23
+0.205
+33
+1.85400833333334
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.64318975552969
+20
+2.25211131595965e-17
+30
+0.205
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.679903474903479
+20
+3.11213701008545e-16
+30
+1.97490347490348
+11
+0.205
+21
+4.11920172793637e-16
+31
+1.64318975552968
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+0.75
+22
+1.38777878078145e-17
+32
+0.75
+13
+0.75
+23
+1.38777878078145e-17
+33
+0.75
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.205
+20
+3.79326200080262e-18
+30
+1.295
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.97490347490348
+20
+7.46935760775808e-17
+30
+0.679903474903477
+11
+1.5
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.97490347490348
+21
+7.46935760775808e-17
+31
+0.679903474903477
+12
+2.11686086360521
+22
+9.70208606166603e-17
+32
+0.883139136394791
+13
+2.11686086360521
+23
+9.70208606166603e-17
+33
+0.883139136394791
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.795
+20
+1.79190321753102e-16
+30
+2.35249999999999
+11
+2.795
+21
+2.03679665726025e-16
+31
+1.85400833333335
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+0.0
+30
+1.5
+11
+2.11686086360521
+21
+9.70208606166603e-17
+31
+0.883139136394791
+12
+2.54772991850989
+22
+1.64788632875096e-16
+32
+1.5
+13
+2.54772991850989
+23
+1.64788632875096e-16
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.795
+20
+2.03679665726025e-16
+30
+1.85400833333335
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.64941740918437
+22
+1.80782203615711e-16
+32
+1.64558259081563
+13
+2.64941740918437
+23
+1.80782203615711e-16
+33
+1.64558259081563
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+2.795
+21
+2.03679665726025e-16
+31
+1.85400833333335
+12
+2.795
+22
+1.79190321753102e-16
+32
+2.35249999999999
+13
+2.795
+23
+1.79190321753102e-16
+33
+2.35249999999999
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+2.795
+21
+1.79190321753102e-16
+31
+2.35249999999999
+12
+2.57375
+22
+1.17961196366424e-16
+32
+2.57375
+13
+2.57375
+23
+1.17961196366424e-16
+33
+2.57375
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.14749999999999
+20
+0.0
+30
+3.0
+11
+1.85400833333332
+21
+6.2236879303386e-17
+31
+2.795
+12
+2.3525
+22
+5.67320709797468e-17
+32
+2.795
+13
+2.3525
+23
+5.67320709797468e-17
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.01224742103046
+21
+2.26663244222472
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.01224742103046
+20
+2.26663244222472
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.01224742103046
+20
+2.26663244222472
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+2.11686086360521
+22
+2.11686086360521
+32
+3.0
+13
+2.11686086360521
+23
+2.11686086360521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.41991861092296
+21
+1.68298318869529
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.41991861092296
+20
+1.68298318869529
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.41991861092296
+20
+1.68298318869529
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.54772991850989
+22
+1.5
+32
+3.0
+13
+2.54772991850989
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.31262043788199
+21
+1.83659840643228
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.31262043788199
+20
+1.83659840643228
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.31262043788199
+20
+1.83659840643228
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.41991861092296
+22
+1.68298318869529
+32
+3.0
+13
+2.41991861092296
+23
+1.68298318869529
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.439339828220179
+21
+1.93933982822018
+31
+3.0
+12
+0.248866021560526
+22
+1.74886602156053
+32
+3.0
+13
+0.248866021560526
+23
+1.74886602156053
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.439339828220179
+20
+1.93933982822018
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.439339828220179
+20
+1.93933982822018
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.295
+20
+2.39623136148263e-17
+30
+0.205
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.883139136394789
+20
+0.883139136394789
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.733367557775275
+22
+0.987752578969537
+32
+3.0
+13
+0.733367557775275
+23
+0.987752578969537
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.899184275534744
+21
+2.39918427553474
+31
+3.0
+12
+0.75
+22
+2.25
+32
+3.0
+13
+0.75
+23
+2.25
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.899184275534744
+20
+2.39918427553474
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.899184275534744
+20
+2.39918427553474
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.14749999999999
+20
+0.0
+30
+3.0
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+1.85400833333332
+22
+6.2236879303386e-17
+32
+2.795
+13
+1.85400833333332
+23
+6.2236879303386e-17
+33
+2.795
+70
+2
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.205
+20
+4.11920172793637e-16
+30
+1.64318975552968
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.205
+21
+4.11920172793637e-16
+31
+1.64318975552968
+12
+0.679903474903479
+22
+3.11213701008545e-16
+32
+1.97490347490348
+13
+0.679903474903479
+23
+3.11213701008545e-16
+33
+1.97490347490348
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.679903474903479
+21
+3.11213701008545e-16
+31
+1.97490347490348
+12
+0.88313913639479
+22
+2.68116213853163e-16
+32
+2.11686086360521
+13
+0.88313913639479
+23
+2.68116213853163e-16
+33
+2.11686086360521
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.88313913639479
+21
+2.68116213853163e-16
+31
+2.11686086360521
+12
+1.5
+22
+1.37306724264545e-16
+32
+2.5477299185099
+13
+1.5
+23
+1.37306724264545e-16
+33
+2.5477299185099
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.37306724264545e-16
+31
+2.5477299185099
+12
+1.64558259081562
+22
+1.06434958002245e-16
+32
+2.64941740918438
+13
+1.64558259081562
+23
+1.06434958002245e-16
+33
+2.64941740918438
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.64558259081562
+21
+1.06434958002245e-16
+31
+2.64941740918438
+12
+1.85400833333332
+22
+6.2236879303386e-17
+32
+2.795
+13
+1.85400833333332
+23
+6.2236879303386e-17
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.85400833333332
+21
+6.2236879303386e-17
+31
+2.795
+12
+2.1106623891929
+22
+0.0257305779793383
+32
+3.0
+13
+2.1106623891929
+23
+0.0257305779793383
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+2.1106623891929
+21
+0.0257305779793383
+31
+3.0
+12
+1.74203407868223
+22
+0.283212517800531
+32
+3.0
+13
+1.74203407868223
+23
+0.283212517800531
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.74203407868223
+21
+0.283212517800531
+31
+3.0
+12
+1.5
+22
+0.452270081490099
+32
+3.0
+13
+1.5
+23
+0.452270081490099
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.5
+21
+0.452270081490099
+31
+3.0
+12
+1.31701681130471
+22
+0.580081389077034
+32
+3.0
+13
+1.31701681130471
+23
+0.580081389077034
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.31701681130471
+21
+0.580081389077034
+31
+3.0
+12
+1.16340159356772
+22
+0.687379562118006
+32
+3.0
+13
+1.16340159356772
+23
+0.687379562118006
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.16340159356772
+21
+0.687379562118006
+31
+3.0
+12
+1.02269438387197
+22
+0.78566166435019
+32
+3.0
+13
+1.02269438387197
+23
+0.78566166435019
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.02269438387197
+21
+0.78566166435019
+31
+3.0
+12
+0.883139136394789
+22
+0.883139136394789
+32
+3.0
+13
+0.883139136394789
+23
+0.883139136394789
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.733367557775275
+22
+0.987752578969537
+32
+3.0
+13
+0.733367557775275
+23
+0.987752578969537
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.733367557775275
+21
+0.987752578969537
+31
+3.0
+12
+0.558389724096057
+22
+1.10997225325071
+32
+3.0
+13
+0.558389724096057
+23
+1.10997225325071
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.558389724096057
+21
+1.10997225325071
+31
+3.0
+12
+0.332481491301358
+22
+1.26776612947518
+32
+3.0
+13
+0.332481491301358
+23
+1.26776612947518
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.14599166666666
+30
+2.795
+11
+2.97426942202063
+21
+0.889337610807109
+31
+3.0
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.97426942202063
+20
+0.889337610807109
+30
+3.0
+11
+3.0
+21
+1.14599166666666
+31
+2.795
+12
+2.71678748219945
+22
+1.25796592131777
+32
+3.0
+13
+2.71678748219945
+23
+1.25796592131777
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.71678748219945
+20
+1.25796592131777
+30
+3.0
+11
+3.0
+21
+1.14599166666666
+31
+2.795
+12
+3.0
+22
+1.5
+32
+2.54772991850989
+13
+3.0
+23
+1.5
+33
+2.54772991850989
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.71678748219945
+20
+1.25796592131777
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.54772991850989
+12
+2.54772991850989
+22
+1.5
+32
+3.0
+13
+2.54772991850989
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.54772991850989
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.54772991850989
+12
+3.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+3.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.54772991850989
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+2.41991861092296
+22
+1.68298318869529
+32
+3.0
+13
+2.41991861092296
+23
+1.68298318869529
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.41991861092296
+20
+1.68298318869529
+30
+3.0
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+2.31262043788199
+22
+1.83659840643228
+32
+3.0
+13
+2.31262043788199
+23
+1.83659840643228
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.31262043788199
+20
+1.83659840643228
+30
+3.0
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+2.2143383356498
+22
+1.97730561612803
+32
+3.0
+13
+2.2143383356498
+23
+1.97730561612803
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.2143383356498
+20
+1.97730561612803
+30
+3.0
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+2.11686086360521
+22
+2.11686086360521
+32
+3.0
+13
+2.11686086360521
+23
+2.11686086360521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.11686086360521
+20
+2.11686086360521
+30
+3.0
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+2.01224742103046
+22
+2.26663244222472
+32
+3.0
+13
+2.01224742103046
+23
+2.26663244222472
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.01224742103046
+20
+2.26663244222472
+30
+3.0
+11
+3.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+3.0
+22
+2.795
+32
+1.64318975552969
+13
+3.0
+23
+2.795
+33
+1.64318975552969
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.01224742103046
+20
+2.26663244222472
+30
+3.0
+11
+3.0
+21
+2.795
+31
+1.64318975552969
+12
+1.89002774674928
+22
+2.44161027590394
+32
+3.0
+13
+1.89002774674928
+23
+2.44161027590394
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.89002774674928
+20
+2.44161027590394
+30
+3.0
+11
+3.0
+21
+2.795
+31
+1.64318975552969
+12
+1.73223387052482
+22
+2.66751850869864
+32
+3.0
+13
+1.73223387052482
+23
+2.66751850869864
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.73223387052482
+20
+2.66751850869864
+30
+3.0
+11
+3.0
+21
+2.795
+31
+1.64318975552969
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+1.64318975552969
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.295
+20
+2.39623136148263e-17
+30
+0.205
+11
+3.0
+21
+1.5
+31
+0.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.5
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+3.0
+22
+1.705
+32
+0.205
+13
+3.0
+23
+1.705
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.705
+30
+0.205
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.75
+22
+1.38777878078145e-17
+32
+0.75
+13
+0.75
+23
+1.38777878078145e-17
+33
+0.75
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+1.705
+30
+0.205
+11
+0.75
+21
+1.38777878078145e-17
+31
+0.75
+12
+3.0
+22
+2.25
+32
+0.75
+13
+3.0
+23
+2.25
+33
+0.75
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.25
+30
+0.75
+11
+0.75
+21
+1.38777878078145e-17
+31
+0.75
+12
+0.205
+22
+3.79326200080262e-18
+32
+1.295
+13
+0.205
+23
+3.79326200080262e-18
+33
+1.295
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.25
+30
+0.75
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+3.0
+22
+2.795
+32
+1.295
+13
+3.0
+23
+2.795
+33
+1.295
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.795
+30
+1.295
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+2.795
+30
+1.295
+11
+0.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+1.5
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.248866021560526
+22
+1.74886602156053
+32
+3.0
+13
+0.248866021560526
+23
+1.74886602156053
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.248866021560526
+21
+1.74886602156053
+31
+3.0
+12
+0.439339828220179
+22
+1.93933982822018
+32
+3.0
+13
+0.439339828220179
+23
+1.93933982822018
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.439339828220179
+21
+1.93933982822018
+31
+3.0
+12
+0.600815724465256
+22
+2.10081572446526
+32
+3.0
+13
+0.600815724465256
+23
+2.10081572446526
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.600815724465256
+21
+2.10081572446526
+31
+3.0
+12
+0.75
+22
+2.25
+32
+3.0
+13
+0.75
+23
+2.25
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.75
+21
+2.25
+31
+3.0
+12
+0.899184275534744
+22
+2.39918427553474
+32
+3.0
+13
+0.899184275534744
+23
+2.39918427553474
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.899184275534744
+21
+2.39918427553474
+31
+3.0
+12
+1.06066017177982
+22
+2.56066017177982
+32
+3.0
+13
+1.06066017177982
+23
+2.56066017177982
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.06066017177982
+21
+2.56066017177982
+31
+3.0
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.97490347490348
+21
+7.46935760775808e-17
+31
+0.679903474903477
+12
+1.64318975552969
+22
+2.25211131595965e-17
+32
+0.205
+13
+1.64318975552969
+23
+2.25211131595965e-17
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.97490347490348
+20
+7.46935760775808e-17
+30
+0.679903474903477
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+1.97490347490348
+20
+7.46935760775808e-17
+30
+0.679903474903477
+11
+3.0
+21
+1.5
+31
+0.0
+12
+2.11686086360521
+22
+9.70208606166603e-17
+32
+0.883139136394791
+13
+2.11686086360521
+23
+9.70208606166603e-17
+33
+0.883139136394791
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.11686086360521
+20
+9.70208606166603e-17
+30
+0.883139136394791
+11
+3.0
+21
+1.5
+31
+0.0
+12
+2.54772991850989
+22
+1.64788632875096e-16
+32
+1.5
+13
+2.54772991850989
+23
+1.64788632875096e-16
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.54772991850989
+20
+1.64788632875096e-16
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.0
+12
+2.64941740918437
+22
+1.80782203615711e-16
+32
+1.64558259081563
+13
+2.64941740918437
+23
+1.80782203615711e-16
+33
+1.64558259081563
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.64941740918437
+20
+1.80782203615711e-16
+30
+1.64558259081563
+11
+3.0
+21
+1.5
+31
+0.0
+12
+2.795
+22
+2.03679665726025e-16
+32
+1.85400833333335
+13
+2.795
+23
+2.03679665726025e-16
+33
+1.85400833333335
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.795
+20
+2.03679665726025e-16
+30
+1.85400833333335
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+0.205
+32
+1.85400833333334
+13
+3.0
+23
+0.205
+33
+1.85400833333334
+70
+15
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.795
+20
+2.03679665726025e-16
+30
+1.85400833333335
+11
+3.0
+21
+0.205
+31
+1.85400833333334
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+0.205
+30
+1.85400833333334
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+0.883139136394791
+32
+0.883139136394791
+13
+3.0
+23
+0.883139136394791
+33
+0.883139136394791
+70
+15
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+0.205
+30
+1.85400833333334
+11
+3.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+3.0
+22
+0.452270081490106
+32
+1.5
+13
+3.0
+23
+0.452270081490106
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+3.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.35681024447031
+32
+0.205
+13
+3.0
+23
+1.35681024447031
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.3525
+20
+5.67320709797468e-17
+30
+2.795
+11
+2.36016784552609
+21
+0.212667845526093
+31
+3.0
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+2.57375
+22
+1.17961196366424e-16
+32
+2.57375
+13
+2.57375
+23
+1.17961196366424e-16
+33
+2.57375
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.795
+22
+1.79190321753102e-16
+32
+2.35249999999999
+13
+2.795
+23
+1.79190321753102e-16
+33
+2.35249999999999
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+2.795
+21
+1.79190321753102e-16
+31
+2.35249999999999
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+2.99999999999999
+21
+4.71844785465692e-16
+31
+2.1475
+12
+3.0
+22
+0.205
+32
+2.3525
+13
+3.0
+23
+0.205
+33
+2.3525
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+3.0
+21
+0.205
+31
+2.3525
+12
+3.0
+22
+0.426249999999999
+32
+2.57375
+13
+3.0
+23
+0.426249999999999
+33
+2.57375
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+3.0
+21
+0.426249999999999
+31
+2.57375
+12
+2.57375
+22
+0.426250000000001
+32
+3.0
+13
+2.57375
+23
+0.426250000000001
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.57375
+20
+0.426250000000001
+30
+3.0
+11
+3.0
+21
+0.426249999999999
+31
+2.57375
+12
+2.99999999999999
+22
+0.647499999999997
+32
+2.795
+13
+2.99999999999999
+23
+0.647499999999997
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.57375
+20
+0.426250000000001
+30
+3.0
+11
+2.99999999999999
+21
+0.647499999999997
+31
+2.795
+12
+2.7873321544739
+22
+0.639832154473909
+32
+3.0
+13
+2.7873321544739
+23
+0.639832154473909
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_a
+10
+2.7873321544739
+20
+0.639832154473909
+30
+3.0
+11
+2.99999999999999
+21
+0.647499999999997
+31
+2.795
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.14599166666667
+20
+3.0
+30
+0.205
+11
+0.889337610807103
+21
+2.97426942202065
+31
+2.73746865475011e-16
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.889337610807103
+20
+2.97426942202065
+30
+2.73746865475011e-16
+11
+1.14599166666667
+21
+3.0
+31
+0.205
+12
+1.25796592131777
+22
+2.71678748219946
+32
+2.35631881739726e-16
+13
+1.25796592131777
+23
+2.71678748219946
+33
+2.35631881739726e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.25796592131777
+20
+2.71678748219946
+30
+2.35631881739726e-16
+11
+1.14599166666667
+21
+3.0
+31
+0.205
+12
+1.35441740918437
+22
+3.0
+32
+0.350582590815627
+13
+1.35441740918437
+23
+3.0
+33
+0.350582590815627
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.25796592131777
+20
+2.71678748219946
+30
+2.35631881739726e-16
+11
+1.35441740918437
+21
+3.0
+31
+0.350582590815627
+12
+1.5
+22
+2.54772991850989
+32
+2.10606335113701e-16
+13
+1.5
+23
+2.54772991850989
+33
+2.10606335113701e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+2.54772991850989
+30
+2.10606335113701e-16
+11
+1.35441740918437
+21
+3.0
+31
+0.350582590815627
+12
+1.5
+22
+3.0
+32
+0.452270081490105
+13
+1.5
+23
+3.0
+33
+0.452270081490105
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+2.54772991850989
+30
+2.10606335113701e-16
+11
+1.5
+21
+3.0
+31
+0.452270081490105
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+2.54772991850989
+30
+2.10606335113701e-16
+11
+2.11686086360521
+21
+3.0
+31
+0.883139136394791
+12
+1.68298318869529
+22
+2.41991861092296
+32
+1.91686460914973e-16
+13
+1.68298318869529
+23
+2.41991861092296
+33
+1.91686460914973e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.68298318869529
+20
+2.41991861092296
+30
+1.91686460914973e-16
+11
+2.11686086360521
+21
+3.0
+31
+0.883139136394791
+12
+1.83659840643228
+22
+2.31262043788199
+32
+1.75803140620266e-16
+13
+1.83659840643228
+23
+2.31262043788199
+33
+1.75803140620266e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.83659840643228
+20
+2.31262043788199
+30
+1.75803140620266e-16
+11
+2.11686086360521
+21
+3.0
+31
+0.883139136394791
+12
+1.97730561612803
+22
+2.2143383356498
+32
+1.61254466912702e-16
+13
+1.97730561612803
+23
+2.2143383356498
+33
+1.61254466912702e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.97730561612803
+20
+2.2143383356498
+30
+1.61254466912702e-16
+11
+2.11686086360521
+21
+3.0
+31
+0.883139136394791
+12
+2.11686086360521
+22
+2.11686086360521
+32
+1.46824902399879e-16
+13
+2.11686086360521
+23
+2.11686086360521
+33
+1.46824902399879e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.11686086360521
+20
+2.11686086360521
+30
+1.46824902399879e-16
+11
+2.11686086360521
+21
+3.0
+31
+0.883139136394791
+12
+2.26663244222472
+22
+2.01224742103046
+32
+1.31339002048974e-16
+13
+2.26663244222472
+23
+2.01224742103046
+33
+1.31339002048974e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.26663244222472
+20
+2.01224742103046
+30
+1.31339002048974e-16
+11
+2.11686086360521
+21
+3.0
+31
+0.883139136394791
+12
+2.32009652509653
+22
+3.0
+32
+1.02509652509653
+13
+2.32009652509653
+23
+3.0
+33
+1.02509652509653
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.26663244222472
+20
+2.01224742103046
+30
+1.31339002048974e-16
+11
+2.32009652509653
+21
+3.0
+31
+1.02509652509653
+12
+2.44161027590394
+22
+1.89002774674928
+32
+1.13246855855755e-16
+13
+2.44161027590394
+23
+1.89002774674928
+33
+1.13246855855755e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.44161027590394
+20
+1.89002774674928
+30
+1.13246855855755e-16
+11
+2.32009652509653
+21
+3.0
+31
+1.02509652509653
+12
+2.795
+22
+3.0
+32
+1.35681024447031
+13
+2.795
+23
+3.0
+33
+1.35681024447031
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.44161027590394
+20
+1.89002774674928
+30
+1.13246855855755e-16
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+2.66751850869864
+22
+1.73223387052481
+32
+8.98886699185201e-17
+13
+2.66751850869864
+23
+1.73223387052481
+33
+8.98886699185201e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.66751850869864
+20
+1.73223387052481
+30
+8.98886699185201e-17
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+3.0
+20
+1.5
+30
+0.0
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.74886602156053
+22
+0.248866021560525
+32
+-1.29693882069326e-16
+13
+1.74886602156053
+23
+0.248866021560525
+33
+-1.29693882069326e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.11686086360521
+21
+3.0
+31
+0.883139136394791
+12
+1.5
+22
+3.0
+32
+0.452270081490105
+13
+1.5
+23
+3.0
+33
+0.452270081490105
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.02509652509652
+21
+3.0
+31
+2.32009652509652
+12
+1.35681024447031
+22
+3.0
+32
+2.795
+13
+1.35681024447031
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.883139136394791
+20
+3.0
+30
+2.11686086360521
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.883139136394791
+21
+3.0
+31
+2.11686086360521
+12
+1.02509652509652
+22
+3.0
+32
+2.32009652509652
+13
+1.02509652509652
+23
+3.0
+33
+2.32009652509652
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.68298318869529
+20
+2.41991861092296
+30
+1.91686460914973e-16
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+2.54772991850989
+32
+2.10606335113701e-16
+13
+1.5
+23
+2.54772991850989
+33
+2.10606335113701e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.68298318869529
+21
+2.41991861092296
+31
+1.91686460914973e-16
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.68298318869529
+21
+2.41991861092296
+31
+1.91686460914973e-16
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.212667845526092
+20
+2.36016784552609
+30
+1.10903230691784e-16
+11
+0.0257305779793495
+21
+2.1106623891929
+31
+5.17022605499795e-17
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0257305779793495
+20
+2.1106623891929
+30
+5.17022605499795e-17
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.580081389077038
+21
+1.31701681130471
+31
+-3.03581440100583e-17
+12
+0.452270081490105
+22
+1.5
+32
+-1.14382698113301e-17
+13
+0.452270081490105
+23
+1.5
+33
+-1.14382698113301e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.580081389077038
+20
+1.31701681130471
+30
+-3.03581440100583e-17
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.580081389077038
+20
+1.31701681130471
+30
+-3.03581440100583e-17
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.74886602156053
+21
+0.248866021560525
+31
+-1.29693882069326e-16
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.74886602156053
+20
+0.248866021560525
+30
+-1.29693882069326e-16
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.93933982822018
+22
+0.439339828220178
+32
+-1.0149809463712e-16
+13
+1.93933982822018
+23
+0.439339828220178
+33
+-1.0149809463712e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.39918427553474
+21
+0.899184275534743
+31
+-3.34274422164983e-17
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.39918427553474
+20
+0.899184275534743
+30
+-3.34274422164983e-17
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.39918427553474
+20
+0.899184275534743
+30
+-3.34274422164983e-17
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.56066017177982
+22
+1.06066017177982
+32
+-9.52420782539579e-18
+13
+2.56066017177982
+23
+1.06066017177982
+33
+-9.52420782539579e-18
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.75113397843947
+21
+1.25113397843947
+31
+1.86715796068105e-17
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.75113397843947
+20
+1.25113397843947
+30
+1.86715796068105e-17
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.75113397843947
+20
+1.25113397843947
+30
+1.86715796068105e-17
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.212667845526092
+22
+2.36016784552609
+32
+1.10903230691784e-16
+13
+0.212667845526092
+23
+2.36016784552609
+33
+1.10903230691784e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.1475
+30
+0.0
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+2.1475
+32
+0.205
+13
+0.0
+23
+2.1475
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.772725344843521
+20
+1.72061635471339
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.350582590815627
+20
+3.0
+30
+1.35441740918437
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+1.5
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.452270081490105
+22
+3.0
+32
+1.5
+13
+0.452270081490105
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.64826864473226
+20
+2.24539681310645
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.25
+21
+3.0
+31
+2.25
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.25
+20
+3.0
+30
+2.25
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.705
+22
+3.0
+32
+2.795
+13
+1.705
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.6475
+20
+3.0
+30
+0.205
+11
+1.35441740918437
+21
+3.0
+31
+0.350582590815627
+12
+1.14599166666667
+22
+3.0
+32
+0.205
+13
+1.14599166666667
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+0.6475
+21
+3.0
+31
+0.205
+12
+0.42625
+22
+3.0
+32
+0.42625
+13
+0.42625
+23
+3.0
+33
+0.42625
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+0.42625
+21
+3.0
+31
+0.42625
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.32009652509653
+21
+3.0
+31
+1.02509652509653
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.32009652509653
+20
+3.0
+30
+1.02509652509653
+11
+1.5
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.205
+20
+3.0
+30
+0.6475
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.42625
+22
+3.0
+32
+0.42625
+13
+0.42625
+23
+3.0
+33
+0.42625
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+0.205
+21
+3.0
+31
+0.6475
+12
+0.205
+22
+3.0
+32
+1.14599166666667
+13
+0.205
+23
+3.0
+33
+1.14599166666667
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+0.205
+21
+3.0
+31
+1.14599166666667
+12
+0.350582590815627
+22
+3.0
+32
+1.35441740918437
+13
+0.350582590815627
+23
+3.0
+33
+1.35441740918437
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.705
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.795
+20
+3.0
+30
+1.705
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+2.25
+22
+3.0
+32
+2.25
+13
+2.25
+23
+3.0
+33
+2.25
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+2.32009652509653
+22
+3.0
+32
+1.02509652509653
+13
+2.32009652509653
+23
+3.0
+33
+1.02509652509653
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.452270081490105
+12
+1.35441740918437
+22
+3.0
+32
+0.350582590815627
+13
+1.35441740918437
+23
+3.0
+33
+0.350582590815627
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.883139136394791
+20
+3.0
+30
+2.11686086360521
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.452270081490105
+22
+3.0
+32
+1.5
+13
+0.452270081490105
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.205
+20
+3.0
+30
+1.14599166666667
+11
+0.205
+21
+3.0
+31
+0.6475
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+0.0
+21
+0.205
+31
+1.35681024447031
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.26776612947519
+20
+0.332481491301359
+30
+-1.32155935006511e-16
+11
+0.0
+21
+0.205
+31
+1.35681024447031
+12
+0.0
+22
+0.883139136394791
+32
+0.883139136394791
+13
+0.0
+23
+0.883139136394791
+33
+0.883139136394791
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.26776612947519
+20
+0.332481491301359
+30
+-1.32155935006511e-16
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+1.10997225325072
+22
+0.558389724096058
+32
+-1.08797749069277e-16
+13
+1.10997225325072
+23
+0.558389724096058
+33
+-1.08797749069277e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.10997225325072
+20
+0.558389724096058
+30
+-1.08797749069277e-16
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.987752578969539
+22
+0.733367557775276
+32
+-9.07056028760568e-17
+13
+0.987752578969539
+23
+0.733367557775276
+33
+-9.07056028760568e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.987752578969539
+20
+0.733367557775276
+30
+-9.07056028760568e-17
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.883139136394791
+22
+0.883139136394791
+32
+-7.52197025251519e-17
+13
+0.883139136394791
+23
+0.883139136394791
+33
+-7.52197025251519e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.883139136394791
+20
+0.883139136394791
+30
+-7.52197025251519e-17
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.785661664350193
+22
+1.02269438387197
+32
+-6.07901380123296e-17
+13
+0.785661664350193
+23
+1.02269438387197
+33
+-6.07901380123296e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.785661664350193
+20
+1.02269438387197
+30
+-6.07901380123296e-17
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.0
+22
+1.5
+32
+0.452270081490105
+13
+0.0
+23
+1.5
+33
+0.452270081490105
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.785661664350193
+20
+1.02269438387197
+30
+-6.07901380123296e-17
+11
+0.0
+21
+1.5
+31
+0.452270081490105
+12
+0.687379562118009
+22
+1.16340159356772
+32
+-4.6241464304765e-17
+13
+0.687379562118009
+23
+1.16340159356772
+33
+-4.6241464304765e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.687379562118009
+20
+1.16340159356772
+30
+-4.6241464304765e-17
+11
+0.0
+21
+1.5
+31
+0.452270081490105
+12
+0.580081389077038
+22
+1.31701681130471
+32
+-3.03581440100583e-17
+13
+0.580081389077038
+23
+1.31701681130471
+33
+-3.03581440100583e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.580081389077038
+20
+1.31701681130471
+30
+-3.03581440100583e-17
+11
+0.0
+21
+1.5
+31
+0.452270081490105
+12
+0.452270081490105
+22
+1.5
+32
+-1.14382698113301e-17
+13
+0.452270081490105
+23
+1.5
+33
+-1.14382698113301e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.452270081490105
+20
+1.5
+30
+-1.14382698113301e-17
+11
+0.0
+21
+1.5
+31
+0.452270081490105
+12
+0.0
+22
+1.85400833333333
+32
+0.205
+13
+0.0
+23
+1.85400833333333
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.452270081490105
+20
+1.5
+30
+-1.14382698113301e-17
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.283212517800539
+22
+1.74203407868223
+32
+1.35872768146951e-17
+13
+0.283212517800539
+23
+1.74203407868223
+33
+1.35872768146951e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.283212517800539
+20
+1.74203407868223
+30
+1.35872768146951e-17
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0257305779793495
+22
+2.1106623891929
+32
+5.17022605499795e-17
+13
+0.0257305779793495
+23
+2.1106623891929
+33
+5.17022605499795e-17
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0257305779793495
+20
+2.1106623891929
+30
+5.17022605499795e-17
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.83659840643228
+20
+2.31262043788199
+30
+1.75803140620266e-16
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+1.83659840643228
+21
+2.31262043788199
+31
+1.75803140620266e-16
+12
+1.97730561612803
+22
+2.2143383356498
+32
+1.61254466912702e-16
+13
+1.97730561612803
+23
+2.2143383356498
+33
+1.61254466912702e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+1.97730561612803
+21
+2.2143383356498
+31
+1.61254466912702e-16
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.10081572446526
+21
+0.600815724465256
+31
+-7.75948602460171e-17
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.10081572446526
+20
+0.600815724465256
+30
+-7.75948602460171e-17
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.10081572446526
+20
+0.600815724465256
+30
+-7.75948602460171e-17
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+2.25
+22
+0.75
+32
+-5.55111512312576e-17
+13
+2.25
+23
+0.75
+33
+-5.55111512312576e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.25
+21
+0.75
+31
+-5.55111512312576e-17
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.25
+20
+0.75
+30
+-5.55111512312576e-17
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.25
+20
+0.75
+30
+-5.55111512312576e-17
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.39918427553474
+22
+0.899184275534743
+32
+-3.34274422164983e-17
+13
+2.39918427553474
+23
+0.899184275534743
+33
+-3.34274422164983e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.26663244222472
+20
+2.01224742103046
+30
+1.31339002048974e-16
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.44161027590394
+22
+1.89002774674928
+32
+1.13246855855755e-16
+13
+2.44161027590394
+23
+1.89002774674928
+33
+1.13246855855755e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.44161027590394
+20
+1.89002774674928
+30
+1.13246855855755e-16
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.66751850869864
+22
+1.73223387052481
+32
+8.98886699185201e-17
+13
+2.66751850869864
+23
+1.73223387052481
+33
+8.98886699185201e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.883139136394791
+21
+0.883139136394791
+31
+-7.52197025251519e-17
+12
+0.785661664350193
+22
+1.02269438387197
+32
+-6.07901380123296e-17
+13
+0.785661664350193
+23
+1.02269438387197
+33
+-6.07901380123296e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.883139136394791
+20
+0.883139136394791
+30
+-7.52197025251519e-17
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.883139136394791
+20
+0.883139136394791
+30
+-7.52197025251519e-17
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.987752578969539
+21
+0.733367557775276
+31
+-9.07056028760568e-17
+12
+0.883139136394791
+22
+0.883139136394791
+32
+-7.52197025251519e-17
+13
+0.883139136394791
+23
+0.883139136394791
+33
+-7.52197025251519e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.987752578969539
+20
+0.733367557775276
+30
+-9.07056028760568e-17
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.987752578969539
+20
+0.733367557775276
+30
+-9.07056028760568e-17
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+2.54772991850989
+30
+2.10606335113701e-16
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.25796592131777
+22
+2.71678748219946
+32
+2.35631881739726e-16
+13
+1.25796592131777
+23
+2.71678748219946
+33
+2.35631881739726e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.10997225325072
+21
+0.558389724096058
+31
+-1.08797749069277e-16
+12
+0.987752578969539
+22
+0.733367557775276
+32
+-9.07056028760568e-17
+13
+0.987752578969539
+23
+0.733367557775276
+33
+-9.07056028760568e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.10997225325072
+20
+0.558389724096058
+30
+-1.08797749069277e-16
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.10997225325072
+20
+0.558389724096058
+30
+-1.08797749069277e-16
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.66751850869864
+20
+1.73223387052481
+30
+8.98886699185201e-17
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+1.93933982822018
+21
+0.439339828220178
+31
+-1.0149809463712e-16
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.93933982822018
+20
+0.439339828220178
+30
+-1.0149809463712e-16
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.93933982822018
+20
+0.439339828220178
+30
+-1.0149809463712e-16
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.10081572446526
+22
+0.600815724465256
+32
+-7.75948602460171e-17
+13
+2.10081572446526
+23
+0.600815724465256
+33
+-7.75948602460171e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.68298318869529
+20
+2.41991861092296
+30
+1.91686460914973e-16
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.68298318869529
+21
+2.41991861092296
+31
+1.91686460914973e-16
+12
+1.83659840643228
+22
+2.31262043788199
+32
+1.75803140620266e-16
+13
+1.83659840643228
+23
+2.31262043788199
+33
+1.75803140620266e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.83659840643228
+21
+2.31262043788199
+31
+1.75803140620266e-16
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+0.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.743659607729131
+20
+1.57449302665047
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+0.0
+21
+0.205
+31
+1.705
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.205
+30
+1.705
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.74886602156053
+22
+0.248866021560525
+32
+-1.29693882069326e-16
+13
+1.74886602156053
+23
+0.248866021560525
+33
+-1.29693882069326e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.205
+30
+1.705
+11
+1.74886602156053
+21
+0.248866021560525
+31
+-1.29693882069326e-16
+12
+0.0
+22
+0.75
+32
+2.25
+13
+0.0
+23
+0.75
+33
+2.25
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.75
+30
+2.25
+11
+1.74886602156053
+21
+0.248866021560525
+31
+-1.29693882069326e-16
+12
+1.93933982822018
+22
+0.439339828220178
+32
+-1.0149809463712e-16
+13
+1.93933982822018
+23
+0.439339828220178
+33
+-1.0149809463712e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.75
+30
+2.25
+11
+1.93933982822018
+21
+0.439339828220178
+31
+-1.0149809463712e-16
+12
+2.10081572446526
+22
+0.600815724465256
+32
+-7.75948602460171e-17
+13
+2.10081572446526
+23
+0.600815724465256
+33
+-7.75948602460171e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.75
+30
+2.25
+11
+2.10081572446526
+21
+0.600815724465256
+31
+-7.75948602460171e-17
+12
+2.25
+22
+0.75
+32
+-5.55111512312576e-17
+13
+2.25
+23
+0.75
+33
+-5.55111512312576e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.75
+30
+2.25
+11
+2.25
+21
+0.75
+31
+-5.55111512312576e-17
+12
+2.39918427553474
+22
+0.899184275534743
+32
+-3.34274422164983e-17
+13
+2.39918427553474
+23
+0.899184275534743
+33
+-3.34274422164983e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.75
+30
+2.25
+11
+2.39918427553474
+21
+0.899184275534743
+31
+-3.34274422164983e-17
+12
+0.0
+22
+1.295
+32
+2.795
+13
+0.0
+23
+1.295
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.295
+30
+2.795
+11
+2.39918427553474
+21
+0.899184275534743
+31
+-3.34274422164983e-17
+12
+2.56066017177982
+22
+1.06066017177982
+32
+-9.52420782539579e-18
+13
+2.56066017177982
+23
+1.06066017177982
+33
+-9.52420782539579e-18
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.295
+30
+2.795
+11
+2.56066017177982
+21
+1.06066017177982
+31
+-9.52420782539579e-18
+12
+2.75113397843947
+22
+1.25113397843947
+32
+1.86715796068105e-17
+13
+2.75113397843947
+23
+1.25113397843947
+33
+1.86715796068105e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.295
+30
+2.795
+11
+2.75113397843947
+21
+1.25113397843947
+31
+1.86715796068105e-17
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.295
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+3.0
+31
+1.5
+12
+1.705
+22
+3.0
+32
+2.795
+13
+1.705
+23
+3.0
+33
+2.795
+70
+15
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.705
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.25
+22
+3.0
+32
+2.25
+13
+2.25
+23
+3.0
+33
+2.25
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.25
+20
+3.0
+30
+2.25
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.705
+13
+2.795
+23
+3.0
+33
+1.705
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+1.705
+22
+3.0
+32
+2.795
+13
+1.705
+23
+3.0
+33
+2.795
+70
+2
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.0
+21
+1.64318975552969
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.64318975552969
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+0.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+0.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.11686086360521
+30
+2.11686086360521
+11
+1.5
+21
+3.0
+31
+3.0
+12
+0.0
+22
+2.5477299185099
+32
+1.5
+13
+0.0
+23
+2.5477299185099
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.5477299185099
+30
+1.5
+11
+1.5
+21
+3.0
+31
+3.0
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.795
+30
+1.14599166666667
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.35681024447031
+22
+3.0
+32
+2.795
+13
+1.35681024447031
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.35681024447031
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+1.35681024447031
+21
+3.0
+31
+2.795
+12
+1.02509652509652
+22
+3.0
+32
+2.32009652509652
+13
+1.02509652509652
+23
+3.0
+33
+2.32009652509652
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+1.02509652509652
+21
+3.0
+31
+2.32009652509652
+12
+0.883139136394791
+22
+3.0
+32
+2.11686086360521
+13
+0.883139136394791
+23
+3.0
+33
+2.11686086360521
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+0.883139136394791
+21
+3.0
+31
+2.11686086360521
+12
+0.452270081490105
+22
+3.0
+32
+1.5
+13
+0.452270081490105
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+0.452270081490105
+21
+3.0
+31
+1.5
+12
+0.350582590815627
+22
+3.0
+32
+1.35441740918437
+13
+0.350582590815627
+23
+3.0
+33
+1.35441740918437
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.205
+22
+3.0
+32
+1.14599166666667
+13
+0.205
+23
+3.0
+33
+1.14599166666667
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.295
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.5477299185099
+30
+1.5
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.57375
+30
+0.42625
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.57375
+30
+0.42625
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.795
+30
+0.6475
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+0.0
+22
+2.795
+32
+0.8525
+13
+0.0
+23
+2.795
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.64318975552969
+30
+2.795
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+0.0
+21
+2.795
+31
+0.8525
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.64318975552969
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.64318975552969
+31
+2.795
+12
+0.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+0.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.57375
+30
+0.42625
+11
+0.0
+21
+1.5
+31
+0.452270081490105
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.0
+22
+1.85400833333333
+32
+0.205
+13
+0.0
+23
+1.85400833333333
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.0
+22
+2.1475
+32
+0.205
+13
+0.0
+23
+2.1475
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.1475
+30
+0.205
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.0
+22
+2.3525
+32
+0.205
+13
+0.0
+23
+2.3525
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.205
+30
+1.705
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+0.0
+21
+2.795
+31
+0.6475
+12
+0.0
+22
+2.795
+32
+0.8525
+13
+0.0
+23
+2.795
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.26776612947519
+21
+0.332481491301359
+31
+-1.32155935006511e-16
+12
+1.10997225325072
+22
+0.558389724096058
+32
+-1.08797749069277e-16
+13
+1.10997225325072
+23
+0.558389724096058
+33
+-1.08797749069277e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.26776612947519
+20
+0.332481491301359
+30
+-1.32155935006511e-16
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.26776612947519
+20
+0.332481491301359
+30
+-1.32155935006511e-16
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.25796592131777
+20
+2.71678748219946
+30
+2.35631881739726e-16
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.889337610807103
+22
+2.97426942202065
+32
+2.73746865475011e-16
+13
+0.889337610807103
+23
+2.97426942202065
+33
+2.73746865475011e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.11686086360521
+20
+2.11686086360521
+30
+1.46824902399879e-16
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+2.11686086360521
+21
+2.11686086360521
+31
+1.46824902399879e-16
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.11686086360521
+21
+2.11686086360521
+31
+1.46824902399879e-16
+12
+2.26663244222472
+22
+2.01224742103046
+32
+1.31339002048974e-16
+13
+2.26663244222472
+23
+2.01224742103046
+33
+1.31339002048974e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.795
+20
+3.0
+30
+1.705
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.687379562118009
+21
+1.16340159356772
+31
+-4.6241464304765e-17
+12
+0.580081389077038
+22
+1.31701681130471
+32
+-3.03581440100583e-17
+13
+0.580081389077038
+23
+1.31701681130471
+33
+-3.03581440100583e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.687379562118009
+20
+1.16340159356772
+30
+-4.6241464304765e-17
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.687379562118009
+20
+1.16340159356772
+30
+-4.6241464304765e-17
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.452270081490105
+21
+1.5
+31
+-1.14382698113301e-17
+12
+0.283212517800539
+22
+1.74203407868223
+32
+1.35872768146951e-17
+13
+0.283212517800539
+23
+1.74203407868223
+33
+1.35872768146951e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.452270081490105
+20
+1.5
+30
+-1.14382698113301e-17
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.452270081490105
+20
+1.5
+30
+-1.14382698113301e-17
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.56066017177982
+21
+1.06066017177982
+31
+-9.52420782539579e-18
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.56066017177982
+20
+1.06066017177982
+30
+-9.52420782539579e-18
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.56066017177982
+20
+1.06066017177982
+30
+-9.52420782539579e-18
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.75113397843947
+22
+1.25113397843947
+32
+1.86715796068105e-17
+13
+2.75113397843947
+23
+1.25113397843947
+33
+1.86715796068105e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.639832154473908
+22
+2.78733215447391
+32
+2.22163676695763e-16
+13
+0.639832154473908
+23
+2.78733215447391
+33
+2.22163676695763e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+0.889337610807103
+22
+2.97426942202065
+32
+2.73746865475011e-16
+13
+0.889337610807103
+23
+2.97426942202065
+33
+2.73746865475011e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.889337610807103
+21
+2.97426942202065
+31
+2.73746865475011e-16
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.889337610807103
+21
+2.97426942202065
+31
+2.73746865475011e-16
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.212667845526092
+20
+2.36016784552609
+30
+1.10903230691784e-16
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.42625
+22
+2.57375
+32
+1.66533453693774e-16
+13
+0.42625
+23
+2.57375
+33
+1.66533453693774e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.639832154473908
+22
+2.78733215447391
+32
+2.22163676695763e-16
+13
+0.639832154473908
+23
+2.78733215447391
+33
+2.22163676695763e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.639832154473908
+20
+2.78733215447391
+30
+2.22163676695763e-16
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.6475
+22
+3.0
+32
+0.205
+13
+0.6475
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.6475
+20
+3.0
+30
+0.205
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.57375
+32
+0.42625
+13
+0.0
+23
+2.57375
+33
+0.42625
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.6475
+20
+3.0
+30
+0.205
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.42625
+22
+3.0
+32
+0.42625
+13
+0.42625
+23
+3.0
+33
+0.42625
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.42625
+20
+3.0
+30
+0.42625
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.42625
+20
+3.0
+30
+0.42625
+11
+0.0
+21
+2.795
+31
+0.6475
+12
+0.205
+22
+3.0
+32
+0.6475
+13
+0.205
+23
+3.0
+33
+0.6475
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.205
+20
+3.0
+30
+0.6475
+11
+0.0
+21
+2.795
+31
+0.6475
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.283212517800539
+21
+1.74203407868223
+31
+1.35872768146951e-17
+12
+0.0257305779793495
+22
+2.1106623891929
+32
+5.17022605499795e-17
+13
+0.0257305779793495
+23
+2.1106623891929
+33
+5.17022605499795e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.283212517800539
+20
+1.74203407868223
+30
+1.35872768146951e-17
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.283212517800539
+20
+1.74203407868223
+30
+1.35872768146951e-17
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.97730561612803
+20
+2.2143383356498
+30
+1.61254466912702e-16
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+1.97730561612803
+21
+2.2143383356498
+31
+1.61254466912702e-16
+12
+2.11686086360521
+22
+2.11686086360521
+32
+1.46824902399879e-16
+13
+2.11686086360521
+23
+2.11686086360521
+33
+1.46824902399879e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.11686086360521
+21
+2.11686086360521
+31
+1.46824902399879e-16
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.639832154473908
+20
+2.78733215447391
+30
+2.22163676695763e-16
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.42625
+22
+2.57375
+32
+1.66533453693774e-16
+13
+0.42625
+23
+2.57375
+33
+1.66533453693774e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.639832154473908
+21
+2.78733215447391
+31
+2.22163676695763e-16
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.639832154473908
+21
+2.78733215447391
+31
+2.22163676695763e-16
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.6475
+20
+3.0
+30
+0.205
+11
+1.14599166666667
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.35681024447031
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.687379562118009
+22
+1.16340159356772
+32
+-4.6241464304765e-17
+13
+0.687379562118009
+23
+1.16340159356772
+33
+-4.6241464304765e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.785661664350193
+20
+1.02269438387197
+30
+-6.07901380123296e-17
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.785661664350193
+20
+1.02269438387197
+30
+-6.07901380123296e-17
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.35681024447031
+22
+3.0
+32
+2.795
+13
+1.35681024447031
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.0
+22
+0.205
+32
+1.35681024447031
+13
+0.0
+23
+0.205
+33
+1.35681024447031
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.705
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.5477299185099
+30
+1.5
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+0.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.0
+21
+2.1475
+31
+0.0
+12
+0.0
+22
+2.1475
+32
+0.205
+13
+0.0
+23
+2.1475
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+0.205
+30
+1.705
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.705
+12
+0.0
+22
+0.75
+32
+2.25
+13
+0.0
+23
+0.75
+33
+2.25
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.295
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+0.75
+32
+2.25
+13
+0.0
+23
+0.75
+33
+2.25
+70
+1
+ 0
+3DFACE
+ 8
+iso_base_b
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.295
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/hacks/glx/lament.man b/hacks/glx/lament.man
new file mode 100644
index 0000000..2077dd6
--- /dev/null
+++ b/hacks/glx/lament.man
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+lament - animates the Lament Configuration
+.SH SYNOPSIS
+.B lament
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+[\-texture] [\-no\-texture] [\-wireframe]
+.SH DESCRIPTION
+The \fIlament\fP program draws an animation of a particular puzzle box
+repeatedly solving itself.
+.SH OPTIONS
+.I lament
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-texture
+Use texture maps. This is the default.
+.TP 8
+.B \-no\-texture
+Do not use texture maps. This is boring and wrong.
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+This hack is glacially slow on machines lacking hardware texture support.
+
+Occasionally opens doors, admitting theologians of the Order of the Gash.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 25-Jul-98.
diff --git a/hacks/glx/lament_model.c b/hacks/glx/lament_model.c
new file mode 100644
index 0000000..d127599
--- /dev/null
+++ b/hacks/glx/lament_model.c
@@ -0,0 +1,16258 @@
+/* Generated from "lament.dxf" on Aug-25-2014.
+ Smoothed vertex normals.
+ Components: box, iso_base_a, iso_base_b, iso_den, iso_dse, iso_dwn,
+ iso_swd, iso_une, iso_unw, iso_use, iso_usw, leviathan, lid_a, lid_b,
+ lid_base, lid_c, lid_d, pillar_a, pillar_b, pillar_base, star_d,
+ star_u, taser_a, taser_b, taser_base, tetra_base, tetra_dse,
+ tetra_dwn, tetra_une, tetra_usw.
+ */
+
+#include "gllist.h"
+
+static const float lament_model_box_data[] = {
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.077767,2.131917,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,3,3,0,
+ 0.408248,0.408248,-0.816497,3,3,0,
+ 0,0.447214,-0.894427,2.502268,3,0,
+ 0,1,0,2.795,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,-0.447214,-0.894427,2.502268,0,0,
+ 0.408248,-0.408248,-0.816497,3,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0.408248,-0.408248,-0.816497,3,0,0,
+ 0.6,0,-0.8,3,0.497732,0,
+ 1,0,0,3,0.205,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,2.502268,0,
+ 0.447214,0,-0.894427,3,2.502268,0,
+ 0.408248,0.408248,-0.816497,3,3,0,
+ 1,0,0,3,2.795,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,3,0,3,
+ 0.408248,-0.408248,0.816497,3,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,-0.948683,-0.316228,2.795,0,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.502268,3,3,
+ 0.408248,0.408248,0.816497,3,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0.408248,0.408248,0.816497,3,3,3,
+ 0.447214,0,0.894427,3,2.502268,3,
+ 1,0,0,3,2.795,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,0.497732,3,
+ 0.447214,0,0.894427,3,0.497732,3,
+ 0.408248,-0.408248,0.816497,3,0,3,
+ 1,0,0,3,0.205,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,3,0.87868,3,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,3,
+ 0,0,-1,1.5,0,3,
+ 0,0,-1,2.795,0,3,
+ 0,0,-1,2.502268,0,3,
+ 0,0,-1,1.5,0,3,
+ 0,0,-1,2.502268,0,3,
+ 0,0,-1,2.12132,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.798369,0,3,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,-1,0.205,0,3,
+ 0,0,-1,0.87868,0,3,
+ 0,0,-1,0.497732,0,3,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,3,3,3,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0.447214,0.894427,1.5,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,2.502268,3,3,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,3,
+ 0,0.447214,0.894427,1.5,3,3,
+ 0,0.83205,0.5547,0.205,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0.447214,0.894427,1.5,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0.447214,0.894427,1.5,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,3,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,3,3,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0,0,
+ -1,0,0,0,3,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,3,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,3,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,0.205,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,3,0,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,3,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,3,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0,
+ 0,1,0,0,3,0.205,
+ 0,1,0,3,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.720616,2.227275,3
+};
+static const struct gllist lament_model_box_frame = { GL_N3F_V3F, GL_TRIANGLES, 1584, lament_model_box_data, 0 };
+const struct gllist *lament_model_box = &lament_model_box_frame;
+
+static const float lament_model_iso_base_a_data[] = {
+ 0,-1,0,0.883139,0,2.116861,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.883139,0,2.116861,
+ 0,-1,0,0.679903,0,1.974903,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,0.6475,2.795,
+ 1,0,0,3,0.42625,2.57375,
+ 1,0,0,3,0.6475,2.795,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,1.145992,2.795,
+ 1,0,0,3,1.145992,2.795,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,1.5,2.54773,
+ 1,0,0,3,1.705,0.205,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,1.705,0.205,
+ 1,0,0,3,2.25,0.75,
+ 0,-1,0,2.649417,0,1.645583,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.54773,0,1.5,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.649417,0,1.645583,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,1.5,0,2.54773,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,2.54773,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,1.645583,0,2.649417,
+ 0,-1,0,2.57375,0,2.57375,
+ 0,-1,0,1.645583,0,2.649417,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,1.645583,0,2.649417,
+ 0,-1,0,2.57375,0,2.57375,
+ 0,-1,0,2.3525,0,2.795,
+ 0,-1,0,1.645583,0,2.649417,
+ 0,-1,0,2.3525,0,2.795,
+ 0,-1,0,1.854008,0,2.795,
+ 0,-1,0,1.974903,0,0.679903,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.64319,0,0.205,
+ 1,0,0,3,0.45227,1.5,
+ 1,0,0,3,0.205,2.3525,
+ 1,0,0,3,0.205,1.854008,
+ 1,0,0,3,0.205,2.3525,
+ 1,0,0,3,0.45227,1.5,
+ 1,0,0,3,0.42625,2.57375,
+ 1,0,0,3,0.42625,2.57375,
+ 1,0,0,3,0.45227,1.5,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,1.145992,2.795,
+ 1,0,0,3,0.8525,3,
+ 1,0,0,3,0.6475,2.795,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,0.45227,1.5,
+ 1,0,0,3,0.883139,0.883139,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,0.883139,0.883139,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,1.5,0.205,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.5,0,1.5,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.75,0,0.75,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.890028,2.44161,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.890028,2.44161,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.890028,2.44161,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.012247,2.266632,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.214338,1.977306,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.214338,1.977306,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.214338,1.977306,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.31262,1.836598,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.732234,2.667519,3,
+ 0,0,1,1.732234,2.667519,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,1.295,
+ 0,-1,0,0.205,0,1.5,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.116861,2.116861,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.116861,2.116861,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.116861,2.116861,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.214338,1.977306,3,
+ 0,0,1,2.716787,1.257966,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.716787,1.257966,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.716787,1.257966,3,
+ 0,0,1,2.54773,1.5,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0.43934,1.93934,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.332481,1.267766,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.733368,0.987753,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.733368,0.987753,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.733368,0.987753,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,2.716787,1.257966,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.332481,1.267766,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.332481,1.267766,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.332481,1.267766,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,0,1,3,0.8525,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,1.5,0.74,3,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,1.5,0,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,2.1475,0,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.06066,2.56066,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,1,1.06066,2.56066,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.06066,2.56066,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.251134,2.751134,3,
+ 0,0,1,1.06066,2.56066,3,
+ 0,0,1,1.251134,2.751134,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.251134,2.751134,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.351731,2.245397,3,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,1.295,
+ 1,0,0,3,1.705,0.205,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,2.25,0.75,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.25,0.75,
+ 1,0,0,3,2.795,1.295,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.732234,2.667519,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.732234,2.667519,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.732234,2.667519,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.890028,2.44161,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.251134,2.751134,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.348827,2.26,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.227275,1.720616,3,
+ 1,0,0,3,2.116861,2.116861,
+ 1,0,0,3,1.5,2.54773,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.116861,2.116861,
+ 1,0,0,3,1.5,1.5,
+ 1,0,0,3,2.116861,2.116861,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,1.64319,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,2.795,1.64319,
+ 1,0,0,3,2.795,1.5,
+ 0,-1,0,0.205,0,1.64319,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,2.54773,
+ 0,-1,0,0.883139,0,2.116861,
+ 0,-1,0,1.5,0,1.5,
+ 1,0,0,3,0.205,2.3525,
+ 1,0,0,3,0,2.1475,
+ 1,0,0,3,0.205,1.854008,
+ 0,-1,0,1.64319,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,0.679903,0,1.974903,
+ 0,-1,0,0.205,0,1.64319,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,1.295,
+ 0,-1,0,0.75,0,0.75,
+ 0,-1,0,0.205,0,1.295,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.974903,0,0.679903,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.974903,0,0.679903,
+ 0,-1,0,2.116861,0,0.883139,
+ 0,-1,0,2.795,0,2.3525,
+ 0,-1,0,2.795,0,1.854008,
+ 0,-1,0,3,0,2.1475,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.116861,0,0.883139,
+ 0,-1,0,2.54773,0,1.5,
+ 0,-1,0,2.795,0,1.854008,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.649417,0,1.645583,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,1.854008,
+ 0,-1,0,2.795,0,2.3525,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,2.3525,
+ 0,-1,0,2.57375,0,2.57375,
+ 0,-1,0,2.1475,0,3,
+ 0,-1,0,1.854008,0,2.795,
+ 0,-1,0,2.3525,0,2.795,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.012247,2.266632,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.012247,2.266632,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.012247,2.266632,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.116861,2.116861,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.419919,1.682983,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.419919,1.682983,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.419919,1.682983,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.54773,1.5,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.31262,1.836598,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.31262,1.836598,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.31262,1.836598,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.419919,1.682983,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.43934,1.93934,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0.43934,1.93934,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.43934,1.93934,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.733368,0.987753,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.077767,2.131917,3,
+ -0.442836,-0.633994,0.633994,2.1475,0,3,
+ -0.442836,-0.633994,0.633994,2.110662,0.025731,3,
+ -0.442836,-0.633994,0.633994,1.854008,0,2.795,
+ -0.442836,-0.633994,0.633994,0.205,0,1.64319,
+ -0.442836,-0.633994,0.633994,0,1.5,3,
+ -0.442836,-0.633994,0.633994,0,0,1.5,
+ -0.442836,-0.633994,0.633994,0,1.5,3,
+ -0.442836,-0.633994,0.633994,0.205,0,1.64319,
+ -0.442836,-0.633994,0.633994,0.679903,0,1.974903,
+ -0.442836,-0.633994,0.633994,0,1.5,3,
+ -0.442836,-0.633994,0.633994,0.679903,0,1.974903,
+ -0.442836,-0.633994,0.633994,0.883139,0,2.116861,
+ -0.442836,-0.633994,0.633994,0,1.5,3,
+ -0.442836,-0.633994,0.633994,0.883139,0,2.116861,
+ -0.442836,-0.633994,0.633994,1.5,0,2.54773,
+ -0.442836,-0.633994,0.633994,0,1.5,3,
+ -0.442836,-0.633994,0.633994,1.5,0,2.54773,
+ -0.442836,-0.633994,0.633994,1.645583,0,2.649417,
+ -0.442836,-0.633994,0.633994,0,1.5,3,
+ -0.442836,-0.633994,0.633994,1.645583,0,2.649417,
+ -0.442836,-0.633994,0.633994,1.854008,0,2.795,
+ -0.442836,-0.633994,0.633994,0,1.5,3,
+ -0.442836,-0.633994,0.633994,1.854008,0,2.795,
+ -0.442836,-0.633994,0.633994,2.110662,0.025731,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,0,-1,0,1.5,3,
+ 0,0,-1,1.163402,0.68738,3,
+ 0,0,-1,1.022694,0.785662,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,-1,0,1.5,3,
+ 0,0,-1,0.883139,0.883139,3,
+ 0,0,-1,0.733368,0.987753,3,
+ 0,0,-1,0,1.5,3,
+ 0,0,-1,0.733368,0.987753,3,
+ 0,0,-1,0.55839,1.109972,3,
+ 0,0,-1,0,1.5,3,
+ 0,0,-1,0.55839,1.109972,3,
+ 0,0,-1,0.332481,1.267766,3,
+ 0.633994,0.442836,0.633994,3,1.145992,2.795,
+ 0.633994,0.442836,0.633994,2.974269,0.889338,3,
+ 0.633994,0.442836,0.633994,3,0.8525,3,
+ 0.633994,0.442836,0.633994,2.974269,0.889338,3,
+ 0.633994,0.442836,0.633994,3,1.145992,2.795,
+ 0.633994,0.442836,0.633994,2.716787,1.257966,3,
+ 0.633994,0.442836,0.633994,2.716787,1.257966,3,
+ 0.633994,0.442836,0.633994,3,1.145992,2.795,
+ 0.633994,0.442836,0.633994,3,1.5,2.54773,
+ 0.633994,0.442836,0.633994,2.716787,1.257966,3,
+ 0.633994,0.442836,0.633994,3,1.5,2.54773,
+ 0.633994,0.442836,0.633994,2.54773,1.5,3,
+ 0.633994,0.442836,0.633994,2.54773,1.5,3,
+ 0.633994,0.442836,0.633994,3,1.5,2.54773,
+ 0.633994,0.442836,0.633994,3,2.116861,2.116861,
+ 0.633994,0.442836,0.633994,2.54773,1.5,3,
+ 0.633994,0.442836,0.633994,3,2.116861,2.116861,
+ 0.633994,0.442836,0.633994,2.419919,1.682983,3,
+ 0.633994,0.442836,0.633994,2.419919,1.682983,3,
+ 0.633994,0.442836,0.633994,3,2.116861,2.116861,
+ 0.633994,0.442836,0.633994,2.31262,1.836598,3,
+ 0.633994,0.442836,0.633994,2.31262,1.836598,3,
+ 0.633994,0.442836,0.633994,3,2.116861,2.116861,
+ 0.633994,0.442836,0.633994,2.214338,1.977306,3,
+ 0.633994,0.442836,0.633994,2.214338,1.977306,3,
+ 0.633994,0.442836,0.633994,3,2.116861,2.116861,
+ 0.633994,0.442836,0.633994,2.116861,2.116861,3,
+ 0.633994,0.442836,0.633994,2.116861,2.116861,3,
+ 0.633994,0.442836,0.633994,3,2.116861,2.116861,
+ 0.633994,0.442836,0.633994,2.012247,2.266632,3,
+ 0.633994,0.442836,0.633994,2.012247,2.266632,3,
+ 0.633994,0.442836,0.633994,3,2.116861,2.116861,
+ 0.633994,0.442836,0.633994,3,2.795,1.64319,
+ 0.633994,0.442836,0.633994,2.012247,2.266632,3,
+ 0.633994,0.442836,0.633994,3,2.795,1.64319,
+ 0.633994,0.442836,0.633994,1.890028,2.44161,3,
+ 0.633994,0.442836,0.633994,1.890028,2.44161,3,
+ 0.633994,0.442836,0.633994,3,2.795,1.64319,
+ 0.633994,0.442836,0.633994,1.732234,2.667519,3,
+ 0.633994,0.442836,0.633994,1.732234,2.667519,3,
+ 0.633994,0.442836,0.633994,3,2.795,1.64319,
+ 0.633994,0.442836,0.633994,1.5,3,3,
+ 0.633994,0.442836,0.633994,1.5,3,3,
+ 0.633994,0.442836,0.633994,3,2.795,1.64319,
+ 0.633994,0.442836,0.633994,3,3,1.5,
+ -0.57735,0.57735,-0.57735,1.295,0,0.205,
+ -0.57735,0.57735,-0.57735,3,1.5,0,
+ -0.57735,0.57735,-0.57735,1.5,0,0,
+ -0.57735,0.57735,-0.57735,3,1.5,0,
+ -0.57735,0.57735,-0.57735,1.295,0,0.205,
+ -0.57735,0.57735,-0.57735,3,1.705,0.205,
+ -0.57735,0.57735,-0.57735,3,1.705,0.205,
+ -0.57735,0.57735,-0.57735,1.295,0,0.205,
+ -0.57735,0.57735,-0.57735,0.75,0,0.75,
+ -0.57735,0.57735,-0.57735,3,1.705,0.205,
+ -0.57735,0.57735,-0.57735,0.75,0,0.75,
+ -0.57735,0.57735,-0.57735,3,2.25,0.75,
+ -0.57735,0.57735,-0.57735,3,2.25,0.75,
+ -0.57735,0.57735,-0.57735,0.75,0,0.75,
+ -0.57735,0.57735,-0.57735,0.205,0,1.295,
+ -0.57735,0.57735,-0.57735,3,2.25,0.75,
+ -0.57735,0.57735,-0.57735,0.205,0,1.295,
+ -0.57735,0.57735,-0.57735,3,2.795,1.295,
+ -0.57735,0.57735,-0.57735,3,2.795,1.295,
+ -0.57735,0.57735,-0.57735,0.205,0,1.295,
+ -0.57735,0.57735,-0.57735,0,0,1.5,
+ -0.57735,0.57735,-0.57735,3,2.795,1.295,
+ -0.57735,0.57735,-0.57735,0,0,1.5,
+ -0.57735,0.57735,-0.57735,3,3,1.5,
+ -0.57735,0.57735,-0.57735,3,3,1.5,
+ -0.57735,0.57735,-0.57735,0,0,1.5,
+ -0.57735,0.57735,-0.57735,0,1.5,3,
+ -0.57735,0.57735,-0.57735,3,3,1.5,
+ -0.57735,0.57735,-0.57735,0,1.5,3,
+ -0.57735,0.57735,-0.57735,1.5,3,3,
+ 0,0,-1,1.5,3,3,
+ 0,0,-1,0,1.5,3,
+ 0,0,-1,0.248866,1.748866,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0.43934,1.93934,3,
+ 0,0,-1,1.5,3,3,
+ 0,0,-1,0.43934,1.93934,3,
+ 0,0,-1,0.600816,2.100816,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,-1,1.5,3,3,
+ 0,0,-1,0.899184,2.399184,3,
+ 0,0,-1,1.06066,2.56066,3,
+ 0,0,-1,1.5,3,3,
+ 0,0,-1,1.06066,2.56066,3,
+ 0,0,-1,1.251134,2.751134,3,
+ 0.012176,0.99989,-0.008505,1.5,0,0,
+ 0.012176,0.99989,-0.008505,1.974903,0,0.679903,
+ 0.012176,0.99989,-0.008505,1.64319,0,0.205,
+ 0.633994,-0.633994,-0.442836,1.974903,0,0.679903,
+ 0.633994,-0.633994,-0.442836,1.5,0,0,
+ 0.633994,-0.633994,-0.442836,3,1.5,0,
+ 0.633994,-0.633994,-0.442836,1.974903,0,0.679903,
+ 0.633994,-0.633994,-0.442836,3,1.5,0,
+ 0.633994,-0.633994,-0.442836,2.116861,0,0.883139,
+ 0.633994,-0.633994,-0.442836,2.116861,0,0.883139,
+ 0.633994,-0.633994,-0.442836,3,1.5,0,
+ 0.633994,-0.633994,-0.442836,2.54773,0,1.5,
+ 0.633994,-0.633994,-0.442836,2.54773,0,1.5,
+ 0.633994,-0.633994,-0.442836,3,1.5,0,
+ 0.633994,-0.633994,-0.442836,2.649417,0,1.645583,
+ 0.633994,-0.633994,-0.442836,2.649417,0,1.645583,
+ 0.633994,-0.633994,-0.442836,3,1.5,0,
+ 0.633994,-0.633994,-0.442836,2.795,0,1.854008,
+ 0.633994,-0.633994,-0.442836,2.795,0,1.854008,
+ 0.633994,-0.633994,-0.442836,3,1.5,0,
+ 0.633994,-0.633994,-0.442836,3,0.205,1.854008,
+ 0.633994,-0.633994,-0.442836,2.795,0,1.854008,
+ 0.633994,-0.633994,-0.442836,3,0.205,1.854008,
+ 0.633994,-0.633994,-0.442836,3,0,2.1475,
+ -1,0,0,3,0.205,1.854008,
+ -1,0,0,3,1.5,0,
+ -1,0,0,3,0.883139,0.883139,
+ -1,0,0,3,0.205,1.854008,
+ -1,0,0,3,0.883139,0.883139,
+ -1,0,0,3,0.45227,1.5,
+ -1,0,0,3,0.883139,0.883139,
+ -1,0,0,3,1.5,0,
+ -1,0,0,3,1.35681,0.205,
+ 0.57735,-0.57735,0.57735,2.3525,0,2.795,
+ 0.57735,-0.57735,0.57735,2.360168,0.212668,3,
+ 0.57735,-0.57735,0.57735,2.1475,0,3,
+ 0.57735,-0.57735,0.57735,2.360168,0.212668,3,
+ 0.57735,-0.57735,0.57735,2.3525,0,2.795,
+ 0.57735,-0.57735,0.57735,2.57375,0,2.57375,
+ 0.57735,-0.57735,0.57735,2.360168,0.212668,3,
+ 0.57735,-0.57735,0.57735,2.57375,0,2.57375,
+ 0.57735,-0.57735,0.57735,2.795,0,2.3525,
+ 0.57735,-0.57735,0.57735,2.360168,0.212668,3,
+ 0.57735,-0.57735,0.57735,2.795,0,2.3525,
+ 0.57735,-0.57735,0.57735,3,0,2.1475,
+ 0.57735,-0.57735,0.57735,2.360168,0.212668,3,
+ 0.57735,-0.57735,0.57735,3,0,2.1475,
+ 0.57735,-0.57735,0.57735,3,0.205,2.3525,
+ 0.57735,-0.57735,0.57735,2.360168,0.212668,3,
+ 0.57735,-0.57735,0.57735,3,0.205,2.3525,
+ 0.57735,-0.57735,0.57735,3,0.42625,2.57375,
+ 0.57735,-0.57735,0.57735,2.360168,0.212668,3,
+ 0.57735,-0.57735,0.57735,3,0.42625,2.57375,
+ 0.57735,-0.57735,0.57735,2.57375,0.42625,3,
+ 0.57735,-0.57735,0.57735,2.57375,0.42625,3,
+ 0.57735,-0.57735,0.57735,3,0.42625,2.57375,
+ 0.57735,-0.57735,0.57735,3,0.6475,2.795,
+ 0.57735,-0.57735,0.57735,2.57375,0.42625,3,
+ 0.57735,-0.57735,0.57735,3,0.6475,2.795,
+ 0.57735,-0.57735,0.57735,2.787332,0.639832,3,
+ 0.57735,-0.57735,0.57735,2.787332,0.639832,3,
+ 0.57735,-0.57735,0.57735,3,0.6475,2.795,
+ 0.57735,-0.57735,0.57735,3,0.8525,3
+};
+static const struct gllist lament_model_iso_base_a_frame = { GL_N3F_V3F, GL_TRIANGLES, 858, lament_model_iso_base_a_data, 0 };
+const struct gllist *lament_model_iso_base_a = &lament_model_iso_base_a_frame;
+
+static const float lament_model_iso_base_b_data[] = {
+ 0.442836,0.633994,-0.633994,1.145992,3,0.205,
+ 0.442836,0.633994,-0.633994,0.889338,2.974269,0,
+ 0.442836,0.633994,-0.633994,0.8525,3,0,
+ 0.442836,0.633994,-0.633994,0.889338,2.974269,0,
+ 0.442836,0.633994,-0.633994,1.145992,3,0.205,
+ 0.442836,0.633994,-0.633994,1.257966,2.716787,0,
+ 0.442836,0.633994,-0.633994,1.257966,2.716787,0,
+ 0.442836,0.633994,-0.633994,1.145992,3,0.205,
+ 0.442836,0.633994,-0.633994,1.354417,3,0.350583,
+ 0.442836,0.633994,-0.633994,1.257966,2.716787,0,
+ 0.442836,0.633994,-0.633994,1.354417,3,0.350583,
+ 0.442836,0.633994,-0.633994,1.5,2.54773,0,
+ 0.442836,0.633994,-0.633994,1.5,2.54773,0,
+ 0.442836,0.633994,-0.633994,1.354417,3,0.350583,
+ 0.442836,0.633994,-0.633994,1.5,3,0.45227,
+ 0.442836,0.633994,-0.633994,1.5,2.54773,0,
+ 0.442836,0.633994,-0.633994,1.5,3,0.45227,
+ 0.442836,0.633994,-0.633994,2.116861,3,0.883139,
+ 0.442836,0.633994,-0.633994,1.5,2.54773,0,
+ 0.442836,0.633994,-0.633994,2.116861,3,0.883139,
+ 0.442836,0.633994,-0.633994,1.682983,2.419919,0,
+ 0.442836,0.633994,-0.633994,1.682983,2.419919,0,
+ 0.442836,0.633994,-0.633994,2.116861,3,0.883139,
+ 0.442836,0.633994,-0.633994,1.836598,2.31262,0,
+ 0.442836,0.633994,-0.633994,1.836598,2.31262,0,
+ 0.442836,0.633994,-0.633994,2.116861,3,0.883139,
+ 0.442836,0.633994,-0.633994,1.977306,2.214338,0,
+ 0.442836,0.633994,-0.633994,1.977306,2.214338,0,
+ 0.442836,0.633994,-0.633994,2.116861,3,0.883139,
+ 0.442836,0.633994,-0.633994,2.116861,2.116861,0,
+ 0.442836,0.633994,-0.633994,2.116861,2.116861,0,
+ 0.442836,0.633994,-0.633994,2.116861,3,0.883139,
+ 0.442836,0.633994,-0.633994,2.266632,2.012247,0,
+ 0.442836,0.633994,-0.633994,2.266632,2.012247,0,
+ 0.442836,0.633994,-0.633994,2.116861,3,0.883139,
+ 0.442836,0.633994,-0.633994,2.320097,3,1.025097,
+ 0.442836,0.633994,-0.633994,2.266632,2.012247,0,
+ 0.442836,0.633994,-0.633994,2.320097,3,1.025097,
+ 0.442836,0.633994,-0.633994,2.44161,1.890028,0,
+ 0.442836,0.633994,-0.633994,2.44161,1.890028,0,
+ 0.442836,0.633994,-0.633994,2.320097,3,1.025097,
+ 0.442836,0.633994,-0.633994,2.795,3,1.35681,
+ 0.442836,0.633994,-0.633994,2.44161,1.890028,0,
+ 0.442836,0.633994,-0.633994,2.795,3,1.35681,
+ 0.442836,0.633994,-0.633994,2.667519,1.732234,0,
+ 0.442836,0.633994,-0.633994,2.667519,1.732234,0,
+ 0.442836,0.633994,-0.633994,2.795,3,1.35681,
+ 0.442836,0.633994,-0.633994,3,1.5,0,
+ 0.442836,0.633994,-0.633994,3,1.5,0,
+ 0.442836,0.633994,-0.633994,2.795,3,1.35681,
+ 0.442836,0.633994,-0.633994,3,3,1.5,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.748866,0.248866,0,
+ 0,0,-1,1.748866,0.248866,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.116861,3,0.883139,
+ 0,1,0,1.5,3,0.45227,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,1.35681,3,2.795,
+ 0,1,0,0.883139,3,2.116861,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.883139,3,2.116861,
+ 0,1,0,1.025097,3,2.320097,
+ 0,0,-1,1.682983,2.419919,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,2.54773,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.682983,2.419919,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.682983,2.419919,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,0.212668,2.360168,0,
+ 0,0,-1,0.025731,2.110662,0,
+ 0,0,-1,0,2.1475,0,
+ 0,0,-1,0.025731,2.110662,0,
+ 0,0,-1,0.212668,2.360168,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.212668,2.360168,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.212668,2.360168,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.580081,1.317017,0,
+ 0,0,-1,0.45227,1.5,0,
+ 0,0,-1,0.580081,1.317017,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.580081,1.317017,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.748866,0.248866,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.748866,0.248866,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.748866,0.248866,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.93934,0.43934,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.399184,0.899184,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.399184,0.899184,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.399184,0.899184,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.56066,1.06066,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.751134,1.251134,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.751134,1.251134,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.751134,1.251134,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.212668,2.360168,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0.962599,2.037401,0,
+ -1,0,0,0,2.1475,0,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,2.1475,0.205,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,1,0,0.350583,3,1.354417,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.350583,3,1.354417,
+ 0,1,0,0.45227,3,1.5,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.25,3,2.25,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.25,3,2.25,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.705,3,2.795,
+ 0,1,0,0.6475,3,0.205,
+ 0,1,0,1.354417,3,0.350583,
+ 0,1,0,1.145992,3,0.205,
+ 0,1,0,1.354417,3,0.350583,
+ 0,1,0,0.6475,3,0.205,
+ 0,1,0,0.42625,3,0.42625,
+ 0,1,0,1.354417,3,0.350583,
+ 0,1,0,0.42625,3,0.42625,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.320097,3,1.025097,
+ 0,1,0,2.116861,3,0.883139,
+ 0,1,0,2.320097,3,1.025097,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,1,0,0.205,3,0.6475,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.42625,3,0.42625,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,0.6475,
+ 0,1,0,0.205,3,1.145992,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,1.145992,
+ 0,1,0,0.350583,3,1.354417,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,1.705,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,1.705,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.25,3,2.25,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,1.35681,
+ 0,1,0,2.320097,3,1.025097,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,1.5,3,0.45227,
+ 0,1,0,1.354417,3,0.350583,
+ 0,1,0,1.5,3,0.45227,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,1.5,3,1.5,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,1,0,0.883139,3,2.116861,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.45227,3,1.5,
+ 0,1,0,0.205,3,1.145992,
+ 0,1,0,0.205,3,0.6475,
+ 0,1,0,0,3,0.8525,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.351731,2.245397,0,
+ -1,0,0,0,1.5,0.45227,
+ -1,0,0,0,0.883139,0.883139,
+ -1,0,0,0,1.5,1.5,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ -0.633994,-0.442836,-0.633994,0,0.205,1.35681,
+ -0.633994,-0.442836,-0.633994,1.5,0,0,
+ -0.633994,-0.442836,-0.633994,0,0,1.5,
+ -0.633994,-0.442836,-0.633994,1.5,0,0,
+ -0.633994,-0.442836,-0.633994,0,0.205,1.35681,
+ -0.633994,-0.442836,-0.633994,1.267766,0.332481,0,
+ -0.633994,-0.442836,-0.633994,1.267766,0.332481,0,
+ -0.633994,-0.442836,-0.633994,0,0.205,1.35681,
+ -0.633994,-0.442836,-0.633994,0,0.883139,0.883139,
+ -0.633994,-0.442836,-0.633994,1.267766,0.332481,0,
+ -0.633994,-0.442836,-0.633994,0,0.883139,0.883139,
+ -0.633994,-0.442836,-0.633994,1.109972,0.55839,0,
+ -0.633994,-0.442836,-0.633994,1.109972,0.55839,0,
+ -0.633994,-0.442836,-0.633994,0,0.883139,0.883139,
+ -0.633994,-0.442836,-0.633994,0.987753,0.733368,0,
+ -0.633994,-0.442836,-0.633994,0.987753,0.733368,0,
+ -0.633994,-0.442836,-0.633994,0,0.883139,0.883139,
+ -0.633994,-0.442836,-0.633994,0.883139,0.883139,0,
+ -0.633994,-0.442836,-0.633994,0.883139,0.883139,0,
+ -0.633994,-0.442836,-0.633994,0,0.883139,0.883139,
+ -0.633994,-0.442836,-0.633994,0.785662,1.022694,0,
+ -0.633994,-0.442836,-0.633994,0.785662,1.022694,0,
+ -0.633994,-0.442836,-0.633994,0,0.883139,0.883139,
+ -0.633994,-0.442836,-0.633994,0,1.5,0.45227,
+ -0.633994,-0.442836,-0.633994,0.785662,1.022694,0,
+ -0.633994,-0.442836,-0.633994,0,1.5,0.45227,
+ -0.633994,-0.442836,-0.633994,0.68738,1.163402,0,
+ -0.633994,-0.442836,-0.633994,0.68738,1.163402,0,
+ -0.633994,-0.442836,-0.633994,0,1.5,0.45227,
+ -0.633994,-0.442836,-0.633994,0.580081,1.317017,0,
+ -0.633994,-0.442836,-0.633994,0.580081,1.317017,0,
+ -0.633994,-0.442836,-0.633994,0,1.5,0.45227,
+ -0.633994,-0.442836,-0.633994,0.45227,1.5,0,
+ -0.633994,-0.442836,-0.633994,0.45227,1.5,0,
+ -0.633994,-0.442836,-0.633994,0,1.5,0.45227,
+ -0.633994,-0.442836,-0.633994,0,1.854008,0.205,
+ -0.633994,-0.442836,-0.633994,0.45227,1.5,0,
+ -0.633994,-0.442836,-0.633994,0,1.854008,0.205,
+ -0.633994,-0.442836,-0.633994,0.283213,1.742034,0,
+ -0.633994,-0.442836,-0.633994,0.283213,1.742034,0,
+ -0.633994,-0.442836,-0.633994,0,1.854008,0.205,
+ -0.633994,-0.442836,-0.633994,0.025731,2.110662,0,
+ -0.633994,-0.442836,-0.633994,0.025731,2.110662,0,
+ -0.633994,-0.442836,-0.633994,0,1.854008,0.205,
+ -0.633994,-0.442836,-0.633994,0,2.1475,0,
+ 0,0,-1,1.836598,2.31262,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.836598,2.31262,0,
+ 0,0,-1,1.977306,2.214338,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.977306,2.214338,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.100816,0.600816,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.100816,0.600816,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.100816,0.600816,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.25,0.75,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.25,0.75,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.25,0.75,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.25,0.75,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.399184,0.899184,0,
+ 0,0,-1,2.266632,2.012247,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.266632,2.012247,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.266632,2.012247,0,
+ 0,0,-1,2.44161,1.890028,0,
+ 0,0,-1,2.44161,1.890028,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.44161,1.890028,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.44161,1.890028,0,
+ 0,0,-1,2.667519,1.732234,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.987753,0.733368,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.987753,0.733368,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,0.987753,0.733368,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.5,2.54773,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.257966,2.716787,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,2.54773,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,2.54773,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.109972,0.55839,0,
+ 0,0,-1,0.987753,0.733368,0,
+ 0,0,-1,1.109972,0.55839,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.109972,0.55839,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,2.667519,1.732234,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.667519,1.732234,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.667519,1.732234,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.93934,0.43934,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.93934,0.43934,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.93934,0.43934,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.100816,0.600816,0,
+ 0,0,-1,1.682983,2.419919,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.682983,2.419919,0,
+ 0,0,-1,1.836598,2.31262,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.836598,2.31262,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.267766,0.332481,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0.74,0,
+ 0.57735,-0.57735,0.57735,1.5,0,0,
+ 0.57735,-0.57735,0.57735,0,0.205,1.705,
+ 0.57735,-0.57735,0.57735,0,0,1.5,
+ 0.57735,-0.57735,0.57735,0,0.205,1.705,
+ 0.57735,-0.57735,0.57735,1.5,0,0,
+ 0.57735,-0.57735,0.57735,1.748866,0.248866,0,
+ 0.57735,-0.57735,0.57735,0,0.205,1.705,
+ 0.57735,-0.57735,0.57735,1.748866,0.248866,0,
+ 0.57735,-0.57735,0.57735,0,0.75,2.25,
+ 0.57735,-0.57735,0.57735,0,0.75,2.25,
+ 0.57735,-0.57735,0.57735,1.748866,0.248866,0,
+ 0.57735,-0.57735,0.57735,1.93934,0.43934,0,
+ 0.57735,-0.57735,0.57735,0,0.75,2.25,
+ 0.57735,-0.57735,0.57735,1.93934,0.43934,0,
+ 0.57735,-0.57735,0.57735,2.100816,0.600816,0,
+ 0.57735,-0.57735,0.57735,0,0.75,2.25,
+ 0.57735,-0.57735,0.57735,2.100816,0.600816,0,
+ 0.57735,-0.57735,0.57735,2.25,0.75,0,
+ 0.57735,-0.57735,0.57735,0,0.75,2.25,
+ 0.57735,-0.57735,0.57735,2.25,0.75,0,
+ 0.57735,-0.57735,0.57735,2.399184,0.899184,0,
+ 0.57735,-0.57735,0.57735,0,0.75,2.25,
+ 0.57735,-0.57735,0.57735,2.399184,0.899184,0,
+ 0.57735,-0.57735,0.57735,0,1.295,2.795,
+ 0.57735,-0.57735,0.57735,0,1.295,2.795,
+ 0.57735,-0.57735,0.57735,2.399184,0.899184,0,
+ 0.57735,-0.57735,0.57735,2.56066,1.06066,0,
+ 0.57735,-0.57735,0.57735,0,1.295,2.795,
+ 0.57735,-0.57735,0.57735,2.56066,1.06066,0,
+ 0.57735,-0.57735,0.57735,2.751134,1.251134,0,
+ 0.57735,-0.57735,0.57735,0,1.295,2.795,
+ 0.57735,-0.57735,0.57735,2.751134,1.251134,0,
+ 0.57735,-0.57735,0.57735,3,1.5,0,
+ 0.57735,-0.57735,0.57735,0,1.295,2.795,
+ 0.57735,-0.57735,0.57735,3,1.5,0,
+ 0.57735,-0.57735,0.57735,0,1.5,3,
+ 0.57735,-0.57735,0.57735,0,1.5,3,
+ 0.57735,-0.57735,0.57735,3,1.5,0,
+ 0.57735,-0.57735,0.57735,3,3,1.5,
+ 0.57735,-0.57735,0.57735,0,1.5,3,
+ 0.57735,-0.57735,0.57735,3,3,1.5,
+ 0.57735,-0.57735,0.57735,1.705,3,2.795,
+ 0.627963,0.459701,0.627963,1.705,3,2.795,
+ 0.713615,0.660796,0.232598,3,3,1.5,
+ 0,1,0,2.25,3,2.25,
+ 0,1,0,2.25,3,2.25,
+ 0.713615,0.660796,0.232598,3,3,1.5,
+ 0,1,0,2.795,3,1.705,
+ 0.57735,-0.57735,0.57735,1.5,3,3,
+ 0.57735,-0.57735,0.57735,0,1.5,3,
+ 0.57735,-0.57735,0.57735,1.705,3,2.795,
+ -0.633994,0.633994,0.442836,1.5,3,3,
+ -0.633994,0.633994,0.442836,0,1.64319,2.795,
+ -0.633994,0.633994,0.442836,0,1.5,3,
+ -0.633994,0.633994,0.442836,0,1.64319,2.795,
+ -0.633994,0.633994,0.442836,1.5,3,3,
+ -0.633994,0.633994,0.442836,0,2.116861,2.116861,
+ -0.633994,0.633994,0.442836,0,2.116861,2.116861,
+ -0.633994,0.633994,0.442836,1.5,3,3,
+ -0.633994,0.633994,0.442836,0,2.54773,1.5,
+ -0.633994,0.633994,0.442836,0,2.54773,1.5,
+ -0.633994,0.633994,0.442836,1.5,3,3,
+ -0.633994,0.633994,0.442836,0,2.795,1.145992,
+ -0.633994,0.633994,0.442836,0,2.795,1.145992,
+ -0.633994,0.633994,0.442836,1.5,3,3,
+ -0.633994,0.633994,0.442836,1.35681,3,2.795,
+ -0.633994,0.633994,0.442836,1.35681,3,2.795,
+ -0.633994,0.633994,0.442836,0,3,0.8525,
+ -0.633994,0.633994,0.442836,0,2.795,1.145992,
+ 0,1,0,0,3,0.8525,
+ 0,1,0,1.35681,3,2.795,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,0,3,0.8525,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,0.883139,3,2.116861,
+ 0,1,0,0,3,0.8525,
+ 0,1,0,0.883139,3,2.116861,
+ 0,1,0,0.45227,3,1.5,
+ 0,1,0,0,3,0.8525,
+ 0,1,0,0.45227,3,1.5,
+ 0,1,0,0.350583,3,1.354417,
+ 0,-1,0,0,3,0.8525,
+ 0,-1,0,0.350583,3,1.354417,
+ 0,-1,0,0.205,3,1.145992,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,2.54773,1.5,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,2.54773,1.5,
+ -1,0,0,0,2.795,1.145992,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,2.795,1.145992,
+ -1,0,0,0,2.795,0.6475,
+ -0.836014,0.387995,-0.387995,0,2.795,0.6475,
+ -0.903879,0.350707,0.244964,0,2.795,1.145992,
+ -1,0,0,0,2.795,0.8525,
+ -1,0,0,0,1.64319,2.795,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,3,0.8525,
+ -1,0,0,0,2.795,0.8525,
+ -1,0,0,0,2.795,1.145992,
+ -1,0,0,0,1.64319,2.795,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.64319,2.795,
+ -1,0,0,0,2.116861,2.116861,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,1.5,0.45227,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.5,0.45227,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,2.1475,0.205,
+ -1,0,0,0,2.1475,0.205,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,2.3525,0.205,
+ -1,0,0,0,0.205,1.705,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,3,0.8525,
+ -1,0,0,0,2.795,0.6475,
+ -1,0,0,0,2.795,0.8525,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.267766,0.332481,0,
+ 0,0,-1,1.109972,0.55839,0,
+ 0,0,-1,1.267766,0.332481,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.267766,0.332481,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.257966,2.716787,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.889338,2.974269,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.257966,2.716787,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.257966,2.716787,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,2.266632,2.012247,0,
+ 0,1,0,2.795,3,1.705,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.68738,1.163402,0,
+ 0,0,-1,0.580081,1.317017,0,
+ 0,0,-1,0.68738,1.163402,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.68738,1.163402,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.45227,1.5,0,
+ 0,0,-1,0.283213,1.742034,0,
+ 0,0,-1,0.45227,1.5,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.45227,1.5,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.56066,1.06066,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.56066,1.06066,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.56066,1.06066,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.751134,1.251134,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,0.8525,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.639832,2.787332,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.8525,3,0,
+ 0,0,-1,0.889338,2.974269,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.889338,2.974269,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,0.889338,2.974269,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.35681,
+ 0,1,0,2.795,3,1.5,
+ -0.57735,0.57735,-0.57735,0,2.3525,0.205,
+ -0.57735,0.57735,-0.57735,0.212668,2.360168,0,
+ -0.57735,0.57735,-0.57735,0,2.1475,0,
+ -0.57735,0.57735,-0.57735,0.212668,2.360168,0,
+ -0.57735,0.57735,-0.57735,0,2.3525,0.205,
+ -0.57735,0.57735,-0.57735,0.42625,2.57375,0,
+ -0.57735,0.57735,-0.57735,0.42625,2.57375,0,
+ -0.57735,0.57735,-0.57735,0,2.3525,0.205,
+ -0.57735,0.57735,-0.57735,0.639832,2.787332,0,
+ -0.57735,0.57735,-0.57735,0.639832,2.787332,0,
+ -0.57735,0.57735,-0.57735,0,2.3525,0.205,
+ -0.57735,0.57735,-0.57735,0.8525,3,0,
+ -0.57735,0.57735,-0.57735,0.8525,3,0,
+ -0.57735,0.57735,-0.57735,0,2.3525,0.205,
+ -0.57735,0.57735,-0.57735,0.6475,3,0.205,
+ -0.57735,0.57735,-0.57735,0.6475,3,0.205,
+ -0.57735,0.57735,-0.57735,0,2.3525,0.205,
+ -0.57735,0.57735,-0.57735,0,2.57375,0.42625,
+ -0.57735,0.57735,-0.57735,0.6475,3,0.205,
+ -0.57735,0.57735,-0.57735,0,2.57375,0.42625,
+ -0.57735,0.57735,-0.57735,0.42625,3,0.42625,
+ -0.57735,0.57735,-0.57735,0.42625,3,0.42625,
+ -0.57735,0.57735,-0.57735,0,2.57375,0.42625,
+ -0.57735,0.57735,-0.57735,0,2.795,0.6475,
+ -0.57735,0.57735,-0.57735,0.42625,3,0.42625,
+ -0.57735,0.57735,-0.57735,0,2.795,0.6475,
+ -0.57735,0.57735,-0.57735,0.205,3,0.6475,
+ -0.57735,0.57735,-0.57735,0.205,3,0.6475,
+ -0.57735,0.57735,-0.57735,0,2.795,0.6475,
+ -0.57735,0.57735,-0.57735,0,3,0.8525,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.283213,1.742034,0,
+ 0,0,-1,0.025731,2.110662,0,
+ 0,0,-1,0.283213,1.742034,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.283213,1.742034,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,1.977306,2.214338,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.977306,2.214338,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,0.639832,2.787332,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.639832,2.787332,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,0.639832,2.787332,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,1,0,0.6475,3,0.205,
+ 0,1,0,1.145992,3,0.205,
+ 0,1,0,0.8525,3,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.648269,2.245397,0,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,1.35681,
+ -1,0,0,0,0,1.5,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0.68738,1.163402,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,1,0,1.5,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.35681,3,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.883139,0.883139,
+ -1,0,0,0,0.205,1.35681,
+ -1,0,0,0,0.883139,0.883139,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,1.5,1.5,
+ 0,1,0,1.5,3,3,
+ 0,1,0,1.705,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ -1,0,0,0,2.54773,1.5,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,2.116861,2.116861,
+ -1,0,0,0,2.3525,0.205,
+ -1,0,0,0,2.1475,0,
+ -1,0,0,0,2.1475,0.205,
+ -1,0,0,0,0.205,1.705,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,1.705,
+ -1,0,0,0,0.75,2.25,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.75,2.25,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,1.5,2.795
+};
+static const struct gllist lament_model_iso_base_b_frame = { GL_N3F_V3F, GL_TRIANGLES, 864, lament_model_iso_base_b_data, 0 };
+const struct gllist *lament_model_iso_base_b = &lament_model_iso_base_b_frame;
+
+static const float lament_model_iso_den_data[] = {
+ 0,1,0,1.5,3,0.45227,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,0.45227,
+ 0,1,0,2.116861,3,0.883139,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.836598,2.31262,0,
+ 0,0,-1,1.682983,2.419919,0,
+ 0,0,-1,1.836598,2.31262,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.977306,2.214338,0,
+ 0,0,-1,1.836598,2.31262,0,
+ 0,0,-1,1.977306,2.214338,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,1.977306,2.214338,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,3,3,0,
+ 0.485071,0.485071,-0.727607,3,3,0,
+ 0,0.5547,-0.83205,2.502268,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.45227,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.354417,3,0.350583,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,1.35681,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.795,3,1.35681,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.320097,3,1.025097,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.354417,3,0.350583,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.145992,3,0.205,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.44161,1.890028,0,
+ 0,0,-1,2.266632,2.012247,0,
+ 0,0,-1,2.44161,1.890028,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,3,2.12132,0,
+ 0,1,0,2.795,3,1.35681,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,1.35681,
+ 0,1,0,3,3,1.5,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.5,2.54773,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.54773,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.682983,2.419919,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,2.667519,1.732234,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.266632,2.012247,0,
+ 0,0,-1,2.116861,2.116861,0,
+ 0,0,-1,2.266632,2.012247,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,2.502268,0,
+ 0.5547,0,-0.83205,3,2.502268,0,
+ 0.485071,0.485071,-0.727607,3,3,0,
+ 1,0,0,3,2.795,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,0.889338,2.974269,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,0.889338,2.974269,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.257966,2.716787,0,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,1.705,0.205,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.705,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0,
+ 0,1,0,0.8525,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.8525,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,0.8525,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.8525,3,0,
+ 0,1,0,1.145992,3,0.205,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.257966,2.716787,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.257966,2.716787,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.54773,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.667519,1.732234,0,
+ 0,0,-1,2.44161,1.890028,0,
+ 0,0,-1,2.667519,1.732234,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,1.798369,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.25,0.75,
+ 1,0,0,3,1.705,0.205,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,3,0,
+ 0,1,0,3,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0.205,
+ 1,0,0,3,3,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,2.795,1.295,
+ 1,0,0,3,2.25,0.75,
+ 1,0,0,3,2.795,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,1.295,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.295,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,3,1.5,
+ 0,1,0,2.320097,3,1.025097,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.116861,3,0.883139,
+ 0,0,-1,0.889338,2.974269,0,
+ 0,0,-1,0.8525,3,0,
+ 0,0,-1,0.87868,3,0,
+ -0.442836,-0.633994,0.633994,0.889338,2.974269,0,
+ -0.442836,-0.633994,0.633994,1.145992,3,0.205,
+ -0.442836,-0.633994,0.633994,0.8525,3,0,
+ -0.442836,-0.633994,0.633994,1.145992,3,0.205,
+ -0.442836,-0.633994,0.633994,0.889338,2.974269,0,
+ -0.442836,-0.633994,0.633994,1.257966,2.716787,0,
+ -0.442836,-0.633994,0.633994,1.145992,3,0.205,
+ -0.442836,-0.633994,0.633994,1.257966,2.716787,0,
+ -0.442836,-0.633994,0.633994,1.354417,3,0.350583,
+ -0.442836,-0.633994,0.633994,1.354417,3,0.350583,
+ -0.442836,-0.633994,0.633994,1.257966,2.716787,0,
+ -0.442836,-0.633994,0.633994,1.5,2.54773,0,
+ -0.442836,-0.633994,0.633994,1.354417,3,0.350583,
+ -0.442836,-0.633994,0.633994,1.5,2.54773,0,
+ -0.442836,-0.633994,0.633994,1.5,3,0.45227,
+ -0.442836,-0.633994,0.633994,1.5,3,0.45227,
+ -0.442836,-0.633994,0.633994,1.5,2.54773,0,
+ -0.442836,-0.633994,0.633994,1.682983,2.419919,0,
+ -0.442836,-0.633994,0.633994,1.5,3,0.45227,
+ -0.442836,-0.633994,0.633994,1.682983,2.419919,0,
+ -0.442836,-0.633994,0.633994,2.116861,3,0.883139,
+ -0.442836,-0.633994,0.633994,2.116861,3,0.883139,
+ -0.442836,-0.633994,0.633994,1.682983,2.419919,0,
+ -0.442836,-0.633994,0.633994,1.836598,2.31262,0,
+ -0.442836,-0.633994,0.633994,2.116861,3,0.883139,
+ -0.442836,-0.633994,0.633994,1.836598,2.31262,0,
+ -0.442836,-0.633994,0.633994,1.977306,2.214338,0,
+ -0.442836,-0.633994,0.633994,2.116861,3,0.883139,
+ -0.442836,-0.633994,0.633994,1.977306,2.214338,0,
+ -0.442836,-0.633994,0.633994,2.116861,2.116861,0,
+ -0.442836,-0.633994,0.633994,2.116861,3,0.883139,
+ -0.442836,-0.633994,0.633994,2.116861,2.116861,0,
+ -0.442836,-0.633994,0.633994,2.266632,2.012247,0,
+ -0.442836,-0.633994,0.633994,2.116861,3,0.883139,
+ -0.442836,-0.633994,0.633994,2.266632,2.012247,0,
+ -0.442836,-0.633994,0.633994,2.320097,3,1.025097,
+ -0.442836,-0.633994,0.633994,2.320097,3,1.025097,
+ -0.442836,-0.633994,0.633994,2.266632,2.012247,0,
+ -0.442836,-0.633994,0.633994,2.44161,1.890028,0,
+ -0.442836,-0.633994,0.633994,2.320097,3,1.025097,
+ -0.442836,-0.633994,0.633994,2.44161,1.890028,0,
+ -0.442836,-0.633994,0.633994,2.795,3,1.35681,
+ -0.442836,-0.633994,0.633994,2.795,3,1.35681,
+ -0.442836,-0.633994,0.633994,2.44161,1.890028,0,
+ -0.442836,-0.633994,0.633994,2.667519,1.732234,0,
+ -0.442836,-0.633994,0.633994,2.795,3,1.35681,
+ -0.442836,-0.633994,0.633994,2.667519,1.732234,0,
+ -0.442836,-0.633994,0.633994,3,1.5,0,
+ -0.442836,-0.633994,0.633994,2.795,3,1.35681,
+ -0.442836,-0.633994,0.633994,3,1.5,0,
+ -0.442836,-0.633994,0.633994,3,3,1.5,
+ 0.605634,0.397847,0.689148,3,3,1.5,
+ 0.087875,-0.974602,0.205981,3,1.5,0,
+ 1,0,0,3,1.705,0.205,
+ 0.605634,0.397847,0.689148,3,3,1.5,
+ 1,0,0,3,1.705,0.205,
+ 1,0,0,3,2.25,0.75,
+ 0.605634,0.397847,0.689148,3,3,1.5,
+ 1,0,0,3,2.25,0.75,
+ 1,0,0,3,2.795,1.295
+};
+static const struct gllist lament_model_iso_den_frame = { GL_N3F_V3F, GL_TRIANGLES, 222, lament_model_iso_den_data, 0 };
+const struct gllist *lament_model_iso_den = &lament_model_iso_den_frame;
+
+static const float lament_model_iso_dse_data[] = {
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.748866,0.248866,0,
+ 0,0,-1,2.100816,0.600816,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.93934,0.43934,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,2.100816,0.600816,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.93934,0.43934,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.748866,0.248866,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.93934,0.43934,0,
+ 0,0,-1,2.12132,0,0,
+ 0,-1,0,2.649417,0,1.645583,
+ 0,-1,0,2.54773,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ -0.003005,-0.999993,0.002099,1.64319,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ -0.003005,-0.999993,0.002099,1.64319,0,0.205,
+ 0,-1,0,2.1475,0,0.8525,
+ -0.004007,-0.999988,0.002799,1.974903,0,0.679903,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.116861,0,0.883139,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.116861,0,0.883139,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.54773,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,2.795,0,0.205,
+ -0.004007,-0.999988,0.002799,1.5,0,0,
+ -0.004007,-0.999988,0.002799,1.5,0,0,
+ 0,-1,0,2.795,0,0.205,
+ -0.003005,-0.999993,0.002099,1.64319,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 1,0,0,3,0.883139,0.883139,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.883139,0.883139,
+ 1,0,0,3,0.45227,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,0,-1,2.56066,1.06066,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.399184,0.899184,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.56066,1.06066,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.25,0.75,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,2.100816,0.600816,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,2.25,0.75,0,
+ 0,0,-1,3,0,0,
+ 0,-0.5547,-0.83205,2.502268,0,0,
+ 0.485071,-0.485071,-0.727607,3,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.751134,1.251134,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,2.399184,0.899184,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.25,0.75,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.399184,0.899184,0,
+ 0,0,-1,3,0.497732,0,
+ 0.485071,-0.485071,-0.727607,3,0,0,
+ 0.707107,0,-0.707107,3,0.497732,0,
+ 1,0,0,3,0.205,0,
+ 0,0,-1,2.751134,1.251134,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.56066,1.06066,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.751134,1.251134,0,
+ 0,0,-1,3,1.201631,0,
+ -0.004007,-0.999988,0.002799,1.974903,0,0.679903,
+ -0.004007,-0.999988,0.002799,1.5,0,0,
+ -0.003005,-0.999993,0.002099,1.64319,0,0.205,
+ -0.633994,0.633994,0.442836,1.5,0,0,
+ -0.633994,0.633994,0.442836,1.974903,0,0.679903,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,1.974903,0,0.679903,
+ -0.633994,0.633994,0.442836,2.116861,0,0.883139,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,2.116861,0,0.883139,
+ -0.633994,0.633994,0.442836,2.54773,0,1.5,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,2.54773,0,1.5,
+ -0.633994,0.633994,0.442836,2.649417,0,1.645583,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,2.649417,0,1.645583,
+ -0.633994,0.633994,0.442836,2.795,0,1.854008,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,2.795,0,1.854008,
+ -0.633994,0.633994,0.442836,3,0,2.1475,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,3,0,2.1475,
+ -0.633994,0.633994,0.442836,3,0.205,1.854008,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,3,0.205,1.854008,
+ -0.633994,0.633994,0.442836,3,0.45227,1.5,
+ -0.633994,0.633994,0.442836,1.748866,0.248866,0,
+ -0.633994,0.633994,0.442836,3,0.45227,1.5,
+ -0.633994,0.633994,0.442836,1.93934,0.43934,0,
+ -0.633994,0.633994,0.442836,1.93934,0.43934,0,
+ -0.633994,0.633994,0.442836,3,0.45227,1.5,
+ -0.633994,0.633994,0.442836,2.100816,0.600816,0,
+ -0.633994,0.633994,0.442836,2.100816,0.600816,0,
+ -0.633994,0.633994,0.442836,3,0.45227,1.5,
+ -0.633994,0.633994,0.442836,3,0.883139,0.883139,
+ -0.633994,0.633994,0.442836,2.100816,0.600816,0,
+ -0.633994,0.633994,0.442836,3,0.883139,0.883139,
+ -0.633994,0.633994,0.442836,2.25,0.75,0,
+ -0.633994,0.633994,0.442836,2.25,0.75,0,
+ -0.633994,0.633994,0.442836,3,0.883139,0.883139,
+ -0.633994,0.633994,0.442836,2.399184,0.899184,0,
+ -0.633994,0.633994,0.442836,2.399184,0.899184,0,
+ -0.633994,0.633994,0.442836,3,0.883139,0.883139,
+ -0.633994,0.633994,0.442836,3,1.35681,0.205,
+ -0.633994,0.633994,0.442836,2.399184,0.899184,0,
+ -0.633994,0.633994,0.442836,3,1.35681,0.205,
+ -0.633994,0.633994,0.442836,2.56066,1.06066,0,
+ -0.633994,0.633994,0.442836,2.56066,1.06066,0,
+ -0.633994,0.633994,0.442836,3,1.35681,0.205,
+ -0.633994,0.633994,0.442836,2.751134,1.251134,0,
+ -0.633994,0.633994,0.442836,2.751134,1.251134,0,
+ -0.633994,0.633994,0.442836,3,1.35681,0.205,
+ -0.633994,0.633994,0.442836,3,1.5,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.45227,1.5,
+ 1,0,0,3,0.205,1.854008,
+ 1,0,0,3,0.205,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 0,-1,0,2.795,0,1.854008,
+ 0,-1,0,2.649417,0,1.645583,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.795,0,0.205,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,0.883139,0.883139,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.35681,0.205,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0,2.1475,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,2.1475,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,1.854008,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0,
+ 0,-1,0,3,0,2.1475,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,2.1475,
+ 0,-1,0,2.795,0,1.854008,
+ 0,-1,0,2.116861,0,0.883139,
+ -0.004007,-0.999988,0.002799,1.974903,0,0.679903,
+ 0,-1,0,2.1475,0,0.8525
+};
+static const struct gllist lament_model_iso_dse_frame = { GL_N3F_V3F, GL_TRIANGLES, 204, lament_model_iso_dse_data, 0 };
+const struct gllist *lament_model_iso_dse = &lament_model_iso_dse_frame;
+
+static const float lament_model_iso_dwn_data[] = {
+ 0,1,0,0,3,0.7275,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.7275,
+ 0,1,0,0.205,3,0.6475,
+ 0,1,0,0.205,3,0.6475,
+ 0,1,0,0,3,0.7275,
+ 0,1,0,0,3,0.8525,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.8525,3,0,
+ 0,1,0,0.8525,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.6475,3,0.205,
+ 0,1,0,0.42625,3,0.42625,
+ 0,1,0,0.6475,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,0,-1,0.8525,3,0,
+ 0,0,-1,0.639832,2.787332,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.212668,2.360168,0,
+ 0,0,-1,0,2.2725,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.2725,0,
+ 0,0,-1,0.212668,2.360168,0,
+ 0,0,-1,0,2.1475,0,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0,
+ 0,1,0,0,3,0.205,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.57375,0.42625,
+ -1,0,0,0,2.795,0.6475,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.639832,2.787332,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.42625,2.57375,0,
+ 0,0,-1,0.212668,2.360168,0,
+ -1,0,0,0,2.3525,0.205,
+ -1,0,0,0,2.2725,0,
+ -1,0,0,0,2.1475,0,
+ -1,0,0,0,2.2725,0,
+ -1,0,0,0,2.3525,0.205,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.3525,0.205,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.3525,0.205,
+ -1,0,0,0,2.57375,0.42625,
+ 0,1,0,0.205,3,0.6475,
+ 0,1,0,0.42625,3,0.42625,
+ 0,1,0,0.205,3,0.205,
+ -1,0,0,0,3,0.8525,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0.6475,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,0.8525,
+ -1,0,0,0,3,0.205,
+ -0.707107,0.707107,0,0,3,0.205,
+ -0.893371,0.265408,0.362555,0,3,0.8525,
+ 0,1,0,0,3,0.7275,
+ 0.57735,-0.57735,0.57735,0.212668,2.360168,0,
+ 0.57735,-0.57735,0.57735,0,2.3525,0.205,
+ 0.57735,-0.57735,0.57735,0,2.1475,0,
+ 0.57735,-0.57735,0.57735,0,2.3525,0.205,
+ 0.57735,-0.57735,0.57735,0.212668,2.360168,0,
+ 0.57735,-0.57735,0.57735,0.42625,2.57375,0,
+ 0.57735,-0.57735,0.57735,0,2.3525,0.205,
+ 0.57735,-0.57735,0.57735,0.42625,2.57375,0,
+ 0.57735,-0.57735,0.57735,0.639832,2.787332,0,
+ 0.57735,-0.57735,0.57735,0,2.3525,0.205,
+ 0.57735,-0.57735,0.57735,0.639832,2.787332,0,
+ 0.57735,-0.57735,0.57735,0.8525,3,0,
+ 0.57735,-0.57735,0.57735,0,2.3525,0.205,
+ 0.57735,-0.57735,0.57735,0.8525,3,0,
+ 0.57735,-0.57735,0.57735,0.6475,3,0.205,
+ 0.57735,-0.57735,0.57735,0,2.3525,0.205,
+ 0.57735,-0.57735,0.57735,0.6475,3,0.205,
+ 0.57735,-0.57735,0.57735,0.42625,3,0.42625,
+ 0.57735,-0.57735,0.57735,0,2.3525,0.205,
+ 0.57735,-0.57735,0.57735,0.42625,3,0.42625,
+ 0.57735,-0.57735,0.57735,0,2.57375,0.42625,
+ 0.57735,-0.57735,0.57735,0,2.57375,0.42625,
+ 0.57735,-0.57735,0.57735,0.42625,3,0.42625,
+ 0.57735,-0.57735,0.57735,0.205,3,0.6475,
+ 0.57735,-0.57735,0.57735,0,2.57375,0.42625,
+ 0.57735,-0.57735,0.57735,0.205,3,0.6475,
+ 0.57735,-0.57735,0.57735,0,2.795,0.6475,
+ 0.57735,-0.57735,0.57735,0,2.795,0.6475,
+ 0.57735,-0.57735,0.57735,0.205,3,0.6475,
+ 0.57735,-0.57735,0.57735,0,3,0.8525
+};
+static const struct gllist lament_model_iso_dwn_frame = { GL_N3F_V3F, GL_TRIANGLES, 120, lament_model_iso_dwn_data, 0 };
+const struct gllist *lament_model_iso_dwn = &lament_model_iso_dwn_frame;
+
+static const float lament_model_iso_swd_data[] = {
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.267766,0.332481,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ 0,0,-1,0.283213,1.742034,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.283213,1.742034,0,
+ 0,0,-1,0.45227,1.5,0,
+ 0,0,-1,0.45227,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.45227,1.5,0,
+ 0,0,-1,0.580081,1.317017,0,
+ 0,0,-1,0.580081,1.317017,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0.580081,1.317017,0,
+ 0,0,-1,0.68738,1.163402,0,
+ 0,0,-1,0.025731,2.110662,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.025731,2.110662,0,
+ 0,0,-1,0.283213,1.742034,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.987753,0.733368,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,0.987753,0.733368,0,
+ 0,0,-1,1.109972,0.55839,0,
+ 0,0,-1,1.109972,0.55839,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.109972,0.55839,0,
+ 0,0,-1,1.267766,0.332481,0,
+ -1,0,0,0,0.883139,0.883139,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.883139,0.883139,
+ -1,0,0,0,1.5,0.45227,
+ -1,0,0,0,0.883139,0.883139,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,1.35681,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,2.1475,0,
+ -1,0,0,0,1.854008,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0.45227,
+ -1,0,0,0,0.205,1.35681,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0.205,1.35681,
+ -1,0,0,0,0.205,0.205,
+ 0,0,-1,0.68738,1.163402,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.68738,1.163402,0,
+ 0,0,-1,0.785662,1.022694,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.883139,0.883139,0,
+ 0,0,-1,0.987753,0.733368,0,
+ 0,-1,0,0.75,0,0.75,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,0.205,0,1.295,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,1.295,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,1.295,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.205,0,1.295,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.75,0,0.75,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,0,-1,0.025731,2.110662,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,2.1475,0,
+ 0.633994,0.442836,0.633994,0.205,0,1.295,
+ 0.633994,0.442836,0.633994,0,0.205,1.35681,
+ 0.633994,0.442836,0.633994,0,0,1.5,
+ 0.633994,0.442836,0.633994,0,0.205,1.35681,
+ 0.633994,0.442836,0.633994,0.205,0,1.295,
+ 0.633994,0.442836,0.633994,0.75,0,0.75,
+ 0.633994,0.442836,0.633994,0,0.205,1.35681,
+ 0.633994,0.442836,0.633994,0.75,0,0.75,
+ 0.633994,0.442836,0.633994,1.295,0,0.205,
+ 0.633994,0.442836,0.633994,0,0.205,1.35681,
+ 0.633994,0.442836,0.633994,1.295,0,0.205,
+ 0.633994,0.442836,0.633994,1.5,0,0,
+ 0.633994,0.442836,0.633994,0,0.205,1.35681,
+ 0.633994,0.442836,0.633994,1.5,0,0,
+ 0.633994,0.442836,0.633994,1.267766,0.332481,0,
+ 0.633994,0.442836,0.633994,0,0.205,1.35681,
+ 0.633994,0.442836,0.633994,1.267766,0.332481,0,
+ 0.633994,0.442836,0.633994,0,0.883139,0.883139,
+ 0.633994,0.442836,0.633994,0,0.883139,0.883139,
+ 0.633994,0.442836,0.633994,1.267766,0.332481,0,
+ 0.633994,0.442836,0.633994,1.109972,0.55839,0,
+ 0.633994,0.442836,0.633994,0,0.883139,0.883139,
+ 0.633994,0.442836,0.633994,1.109972,0.55839,0,
+ 0.633994,0.442836,0.633994,0.987753,0.733368,0,
+ 0.633994,0.442836,0.633994,0,0.883139,0.883139,
+ 0.633994,0.442836,0.633994,0.987753,0.733368,0,
+ 0.633994,0.442836,0.633994,0.883139,0.883139,0,
+ 0.633994,0.442836,0.633994,0,0.883139,0.883139,
+ 0.633994,0.442836,0.633994,0.883139,0.883139,0,
+ 0.633994,0.442836,0.633994,0.785662,1.022694,0,
+ 0.633994,0.442836,0.633994,0,0.883139,0.883139,
+ 0.633994,0.442836,0.633994,0.785662,1.022694,0,
+ 0.633994,0.442836,0.633994,0,1.5,0.45227,
+ 0.633994,0.442836,0.633994,0,1.5,0.45227,
+ 0.633994,0.442836,0.633994,0.785662,1.022694,0,
+ 0.633994,0.442836,0.633994,0.68738,1.163402,0,
+ 0.633994,0.442836,0.633994,0,1.5,0.45227,
+ 0.633994,0.442836,0.633994,0.68738,1.163402,0,
+ 0.633994,0.442836,0.633994,0.580081,1.317017,0,
+ 0.633994,0.442836,0.633994,0,1.5,0.45227,
+ 0.633994,0.442836,0.633994,0.580081,1.317017,0,
+ 0.633994,0.442836,0.633994,0.45227,1.5,0,
+ 0.633994,0.442836,0.633994,0,1.5,0.45227,
+ 0.633994,0.442836,0.633994,0.45227,1.5,0,
+ 0.633994,0.442836,0.633994,0.283213,1.742034,0,
+ 0.633994,0.442836,0.633994,0,1.5,0.45227,
+ 0.633994,0.442836,0.633994,0.283213,1.742034,0,
+ 0.633994,0.442836,0.633994,0,1.854008,0.205,
+ 0.633994,0.442836,0.633994,0,1.854008,0.205,
+ 0.633994,0.442836,0.633994,0.283213,1.742034,0,
+ 0.633994,0.442836,0.633994,0.025731,2.110662,0,
+ 0.633994,0.442836,0.633994,0,1.854008,0.205,
+ 0.633994,0.442836,0.633994,0.025731,2.110662,0,
+ 0.633994,0.442836,0.633994,0,2.1475,0
+};
+static const struct gllist lament_model_iso_swd_frame = { GL_N3F_V3F, GL_TRIANGLES, 204, lament_model_iso_swd_data, 0 };
+const struct gllist *lament_model_iso_swd = &lament_model_iso_swd_frame;
+
+static const float lament_model_iso_une_data[] = {
+ 0,0,1,2.419919,1.682983,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.31262,1.836598,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.419919,1.682983,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.54773,1.5,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.419919,1.682983,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.54773,1.5,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.716787,1.257966,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.716787,1.257966,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,2.54773,1.5,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,2.716787,1.257966,3,
+ 0,0,1,3,1.201631,3,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.705,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,3,
+ 0,1,0,2.795,3,3,
+ -0.741864,0.651962,-0.156792,1.5,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,2.502268,3,3,
+ 0,1,0,3,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,3,
+ 1,0,0,3,1.145992,2.795,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,0.8525,3,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,1.145992,2.795,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.145992,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.25,3,2.25,
+ 0,1,0,1.705,3,2.795,
+ 0,1,0,2.795,3,1.705,
+ 0,1,0,3,3,2.795,
+ 0,1,0,3,3,1.5,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,1.705,
+ 0,1,0,2.795,3,2.795,
+ 1,0,0,3,2.116861,2.116861,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,2.54773,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,2.116861,2.116861,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,1.64319,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,3,2.795,
+ 0,1,0,3,3,3,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.705,
+ 0,1,0,2.25,3,2.25,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.116861,2.116861,
+ 1,0,0,3,2.795,1.64319,
+ 0,0,1,2.31262,1.836598,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.214338,1.977306,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.31262,1.836598,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.012247,2.266632,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.890028,2.44161,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,2.012247,2.266632,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.890028,2.44161,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.732234,2.667519,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.890028,2.44161,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,2.116861,2.116861,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.012247,2.266632,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.116861,2.116861,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.502268,3,3,
+ 0.485071,0.485071,0.727607,3,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,2.214338,1.977306,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.116861,2.116861,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.214338,1.977306,3,
+ 0,0,1,3,2.502268,3,
+ 0.485071,0.485071,0.727607,3,3,3,
+ 0.5547,0,0.83205,3,2.502268,3,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.145992,2.795,
+ 1,0,0,3,1.5,2.54773,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.732234,2.667519,3,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,2.795,2.795,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.974269,0.889338,3,
+ 0,0,1,3,0.8525,3,
+ -0.633994,-0.442836,-0.633994,2.974269,0.889338,3,
+ -0.633994,-0.442836,-0.633994,3,1.145992,2.795,
+ -0.633994,-0.442836,-0.633994,3,0.8525,3,
+ -0.633994,-0.442836,-0.633994,3,1.145992,2.795,
+ -0.633994,-0.442836,-0.633994,2.974269,0.889338,3,
+ -0.633994,-0.442836,-0.633994,2.716787,1.257966,3,
+ -0.633994,-0.442836,-0.633994,3,1.145992,2.795,
+ -0.633994,-0.442836,-0.633994,2.716787,1.257966,3,
+ -0.633994,-0.442836,-0.633994,3,1.5,2.54773,
+ -0.633994,-0.442836,-0.633994,3,1.5,2.54773,
+ -0.633994,-0.442836,-0.633994,2.716787,1.257966,3,
+ -0.633994,-0.442836,-0.633994,2.54773,1.5,3,
+ -0.633994,-0.442836,-0.633994,3,1.5,2.54773,
+ -0.633994,-0.442836,-0.633994,2.54773,1.5,3,
+ -0.633994,-0.442836,-0.633994,2.419919,1.682983,3,
+ -0.633994,-0.442836,-0.633994,3,1.5,2.54773,
+ -0.633994,-0.442836,-0.633994,2.419919,1.682983,3,
+ -0.633994,-0.442836,-0.633994,3,2.116861,2.116861,
+ -0.633994,-0.442836,-0.633994,3,2.116861,2.116861,
+ -0.633994,-0.442836,-0.633994,2.419919,1.682983,3,
+ -0.633994,-0.442836,-0.633994,2.31262,1.836598,3,
+ -0.633994,-0.442836,-0.633994,3,2.116861,2.116861,
+ -0.633994,-0.442836,-0.633994,2.31262,1.836598,3,
+ -0.633994,-0.442836,-0.633994,2.214338,1.977306,3,
+ -0.633994,-0.442836,-0.633994,3,2.116861,2.116861,
+ -0.633994,-0.442836,-0.633994,2.214338,1.977306,3,
+ -0.633994,-0.442836,-0.633994,2.116861,2.116861,3,
+ -0.633994,-0.442836,-0.633994,3,2.116861,2.116861,
+ -0.633994,-0.442836,-0.633994,2.116861,2.116861,3,
+ -0.633994,-0.442836,-0.633994,2.012247,2.266632,3,
+ -0.633994,-0.442836,-0.633994,3,2.116861,2.116861,
+ -0.633994,-0.442836,-0.633994,2.012247,2.266632,3,
+ -0.633994,-0.442836,-0.633994,3,2.795,1.64319,
+ -0.633994,-0.442836,-0.633994,3,2.795,1.64319,
+ -0.633994,-0.442836,-0.633994,2.012247,2.266632,3,
+ -0.633994,-0.442836,-0.633994,1.890028,2.44161,3,
+ -0.633994,-0.442836,-0.633994,3,2.795,1.64319,
+ -0.633994,-0.442836,-0.633994,1.890028,2.44161,3,
+ -0.633994,-0.442836,-0.633994,1.732234,2.667519,3,
+ -0.633994,-0.442836,-0.633994,3,2.795,1.64319,
+ -0.633994,-0.442836,-0.633994,1.732234,2.667519,3,
+ -0.633994,-0.442836,-0.633994,1.5,3,3,
+ -0.633994,-0.442836,-0.633994,3,2.795,1.64319,
+ -0.633994,-0.442836,-0.633994,1.5,3,3,
+ -0.633994,-0.442836,-0.633994,1.705,3,2.795,
+ -0.633994,-0.442836,-0.633994,1.705,3,2.795,
+ -0.633994,-0.442836,-0.633994,3,3,1.5,
+ -0.633994,-0.442836,-0.633994,3,2.795,1.64319,
+ 0.85071,0.346986,-0.394833,3,3,1.5,
+ -0.600591,0.527809,-0.600591,1.705,3,2.795,
+ 0,1,0,2.25,3,2.25,
+ 0.85071,0.346986,-0.394833,3,3,1.5,
+ 0,1,0,2.25,3,2.25,
+ 0,1,0,2.795,3,1.705
+};
+static const struct gllist lament_model_iso_une_frame = { GL_N3F_V3F, GL_TRIANGLES, 204, lament_model_iso_une_data, 0 };
+const struct gllist *lament_model_iso_une = &lament_model_iso_une_frame;
+
+static const float lament_model_iso_unw_data[] = {
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.350583,3,1.354417,
+ 0,1,0,0.205,3,1.145992,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.45227,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.45227,3,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.883139,3,2.116861,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.145992,
+ 0,1,0,0,3,0.8525,
+ 0,1,0,0.205,3,1.145992,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,0,1,0.75,2.25,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,0.899184,2.399184,3,
+ 0,0,1,1.06066,2.56066,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.43934,1.93934,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.43934,1.93934,3,
+ 0,0,1,0.600816,2.100816,3,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.54773,1.5,
+ -1,0,0,0,2.116861,2.116861,
+ -1,0,0,0,2.54773,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,3,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,3,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.116861,2.116861,
+ -1,0,0,0,1.64319,2.795,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,2.795,1.145992,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,1.145992,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,3,0.8525,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.35681,3,2.795,
+ 0,0,1,1.06066,2.56066,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.06066,2.56066,3,
+ 0,0,1,1.251134,2.751134,3,
+ 0,1,0,0.45227,3,1.5,
+ 0,1,0,0.350583,3,1.354417,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.35681,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.35681,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,3,
+ 0.974602,-0.205981,0.087875,1.5,3,3,
+ 0,0.83205,0.5547,0.205,3,3,
+ 0,0,1,0.497732,3,3,
+ 0.974602,-0.205981,0.087875,1.5,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0.974602,-0.205981,0.087875,1.5,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.248866,1.748866,3,
+ 0,0,1,0.43934,1.93934,3,
+ -1,0,0,0,2.795,1.145992,
+ -1,0,0,0,2.54773,1.5,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,3,3,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,1.64319,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.64319,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,3,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.251134,2.751134,3,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,0.883139,3,2.116861,
+ 0,1,0,0.8525,3,2.1475,
+ 0.633994,-0.633994,-0.442836,0,3,0.8525,
+ 0.633994,-0.633994,-0.442836,1.35681,3,2.795,
+ 0.633994,-0.633994,-0.442836,0,2.795,1.145992,
+ 0,-1,0,1.35681,3,2.795,
+ 0,-1,0,0,3,0.8525,
+ 0,-1,0,1.025097,3,2.320097,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,0,3,0.8525,
+ 0,1,0,0.205,3,1.145992,
+ 0,-1,0,1.025097,3,2.320097,
+ 0,-1,0,0.205,3,1.145992,
+ 0,-1,0,0.350583,3,1.354417,
+ 0,1,0,1.025097,3,2.320097,
+ 0,1,0,0.350583,3,1.354417,
+ 0,1,0,0.45227,3,1.5,
+ 0,-1,0,1.025097,3,2.320097,
+ 0,-1,0,0.45227,3,1.5,
+ 0,-1,0,0.883139,3,2.116861,
+ 0.633994,-0.633994,-0.442836,0,1.64319,2.795,
+ 0.633994,-0.633994,-0.442836,0.248866,1.748866,3,
+ 0.633994,-0.633994,-0.442836,0,1.5,3,
+ 0.633994,-0.633994,-0.442836,0.248866,1.748866,3,
+ 0.633994,-0.633994,-0.442836,0,1.64319,2.795,
+ 0.633994,-0.633994,-0.442836,0,2.116861,2.116861,
+ 0.633994,-0.633994,-0.442836,0.248866,1.748866,3,
+ 0.633994,-0.633994,-0.442836,0,2.116861,2.116861,
+ 0.633994,-0.633994,-0.442836,0.43934,1.93934,3,
+ 0.633994,-0.633994,-0.442836,0.43934,1.93934,3,
+ 0.633994,-0.633994,-0.442836,0,2.116861,2.116861,
+ 0.633994,-0.633994,-0.442836,0.600816,2.100816,3,
+ 0.633994,-0.633994,-0.442836,0.600816,2.100816,3,
+ 0.633994,-0.633994,-0.442836,0,2.116861,2.116861,
+ 0.633994,-0.633994,-0.442836,0.75,2.25,3,
+ 0.633994,-0.633994,-0.442836,0.75,2.25,3,
+ 0.633994,-0.633994,-0.442836,0,2.116861,2.116861,
+ 0.633994,-0.633994,-0.442836,0,2.54773,1.5,
+ 0.633994,-0.633994,-0.442836,0.75,2.25,3,
+ 0.633994,-0.633994,-0.442836,0,2.54773,1.5,
+ 0.633994,-0.633994,-0.442836,0.899184,2.399184,3,
+ 0.633994,-0.633994,-0.442836,0.899184,2.399184,3,
+ 0.633994,-0.633994,-0.442836,0,2.54773,1.5,
+ 0.633994,-0.633994,-0.442836,1.06066,2.56066,3,
+ 0.633994,-0.633994,-0.442836,1.06066,2.56066,3,
+ 0.633994,-0.633994,-0.442836,0,2.54773,1.5,
+ 0.633994,-0.633994,-0.442836,0,2.795,1.145992,
+ 0.633994,-0.633994,-0.442836,1.06066,2.56066,3,
+ 0.633994,-0.633994,-0.442836,0,2.795,1.145992,
+ 0.633994,-0.633994,-0.442836,1.251134,2.751134,3,
+ 0.633994,-0.633994,-0.442836,1.251134,2.751134,3,
+ 0.633994,-0.633994,-0.442836,0,2.795,1.145992,
+ 0.633994,-0.633994,-0.442836,1.5,3,3,
+ 0.633994,-0.633994,-0.442836,1.5,3,3,
+ 0.633994,-0.633994,-0.442836,0,2.795,1.145992,
+ 0.633994,-0.633994,-0.442836,1.35681,3,2.795
+};
+static const struct gllist lament_model_iso_unw_frame = { GL_N3F_V3F, GL_TRIANGLES, 204, lament_model_iso_unw_data, 0 };
+const struct gllist *lament_model_iso_unw = &lament_model_iso_unw_frame;
+
+static const float lament_model_iso_use_data[] = {
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.795,0,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,2.795,0,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,3,0.8525,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.3525,
+ 0,-1,0,3,0,2.1475,
+ 0,-1,0,2.795,0,2.3525,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.3525,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.3525,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.502268,0,3,
+ 0,-1,0,2.3525,0,2.795,
+ 0,-1,0,2.502268,0,3,
+ 0,-1,0,2.1475,0,3,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.57375,0,2.57375,
+ 0,-1,0,2.795,0,2.3525,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0,2.1475,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0,2.1475,
+ 1,0,0,3,0.205,2.3525,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.6475,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0.6475,2.795,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.6475,2.795,
+ 1,0,0,3,0.8525,3,
+ 1,0,0,3,0.6475,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.42625,2.57375,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,2.1475,0,3,
+ 1,0,0,3,0.42625,2.57375,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,2.3525,
+ 0,0,1,3,0,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,1,2.787332,0.639832,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,0.497732,3,
+ 0.707107,0,0.707107,3,0.497732,3,
+ 0.485071,-0.485071,0.727607,3,0,3,
+ 1,0,0,3,0.205,3,
+ 0,-1,0,2.3525,0,2.795,
+ 0,-1,0,2.57375,0,2.57375,
+ 0,-1,0,2.795,0,2.795,
+ -0.57735,0.57735,-0.57735,2.795,0,2.3525,
+ -0.57735,0.57735,-0.57735,3,0.205,2.3525,
+ -0.57735,0.57735,-0.57735,3,0,2.1475,
+ -0.57735,0.57735,-0.57735,3,0.205,2.3525,
+ -0.57735,0.57735,-0.57735,2.795,0,2.3525,
+ -0.57735,0.57735,-0.57735,2.57375,0,2.57375,
+ -0.57735,0.57735,-0.57735,3,0.205,2.3525,
+ -0.57735,0.57735,-0.57735,2.57375,0,2.57375,
+ -0.57735,0.57735,-0.57735,3,0.42625,2.57375,
+ -0.57735,0.57735,-0.57735,3,0.42625,2.57375,
+ -0.57735,0.57735,-0.57735,2.57375,0,2.57375,
+ -0.57735,0.57735,-0.57735,2.3525,0,2.795,
+ -0.57735,0.57735,-0.57735,3,0.42625,2.57375,
+ -0.57735,0.57735,-0.57735,2.3525,0,2.795,
+ -0.57735,0.57735,-0.57735,3,0.6475,2.795,
+ -0.57735,0.57735,-0.57735,3,0.6475,2.795,
+ -0.57735,0.57735,-0.57735,2.3525,0,2.795,
+ -0.57735,0.57735,-0.57735,2.1475,0,3,
+ -0.57735,0.57735,-0.57735,3,0.6475,2.795,
+ -0.57735,0.57735,-0.57735,2.1475,0,3,
+ -0.57735,0.57735,-0.57735,2.360168,0.212668,3,
+ -0.57735,0.57735,-0.57735,2.360168,0.212668,3,
+ -0.57735,0.57735,-0.57735,3,0.8525,3,
+ -0.57735,0.57735,-0.57735,3,0.6475,2.795,
+ 0,0,1,3,0.8525,3,
+ 0,0,1,2.360168,0.212668,3,
+ 0,0,1,2.57375,0.42625,3,
+ 0,0,-1,3,0.8525,3,
+ 0,0,-1,2.57375,0.42625,3,
+ 0,0,-1,2.787332,0.639832,3
+};
+static const struct gllist lament_model_iso_use_frame = { GL_N3F_V3F, GL_TRIANGLES, 108, lament_model_iso_use_data, 0 };
+const struct gllist *lament_model_iso_use = &lament_model_iso_use_frame;
+
+static const float lament_model_iso_usw_data[] = {
+ 0,0,1,0.332481,1.267766,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0.733368,0.987753,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.645583,0,2.649417,
+ 0,-1,0,1.854008,0,2.795,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0.205,3,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.679903,0,1.974903,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,1.64319,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.679903,0,1.974903,
+ 0,-1,0,0.8525,0,2.1475,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,3,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,3,
+ -1,0,0,0,0.75,2.25,
+ -1,0,0,0,0.205,1.705,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,1.705,
+ -1,0,0,0,1.295,2.795,
+ -1,0,0,0,0.75,2.25,
+ -1,0,0,0,0.205,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.1475,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.854008,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.1475,0,3,
+ 0,-1,0,2.12132,0,3,
+ 0,-1,0,2.12132,0,3,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,0,1,1.5,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.163402,0.68738,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,1.742034,0.283213,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,0.733368,0.987753,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.733368,0.987753,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,1,0.332481,1.267766,3,
+ 0,-1,0,0.205,0,1.64319,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,1.64319,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,-1,0.205,0,3,
+ 0,0,-1,0.87868,0,3,
+ 0,0,-1,0.497732,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.5,0,2.54773,
+ 0,-1,0,1.645583,0,2.649417,
+ 0,-1,0,1.5,0,2.54773,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,0.883139,0,2.116861,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,1.5,0,2.54773,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,0.679903,0,1.974903,
+ 0,-1,0,0.883139,0,2.116861,
+ 0,0,1,2.1475,0,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,2.12132,0,3,
+ 0.442836,0.633994,-0.633994,0,0.205,1.705,
+ 0.442836,0.633994,-0.633994,0.205,0,1.64319,
+ 0.442836,0.633994,-0.633994,0,0,1.5,
+ 0.442836,0.633994,-0.633994,0.205,0,1.64319,
+ 0.442836,0.633994,-0.633994,0,0.205,1.705,
+ 0.442836,0.633994,-0.633994,0.679903,0,1.974903,
+ 0.442836,0.633994,-0.633994,0.679903,0,1.974903,
+ 0.442836,0.633994,-0.633994,0,0.205,1.705,
+ 0.442836,0.633994,-0.633994,0,0.75,2.25,
+ 0.442836,0.633994,-0.633994,0.679903,0,1.974903,
+ 0.442836,0.633994,-0.633994,0,0.75,2.25,
+ 0.442836,0.633994,-0.633994,0.883139,0,2.116861,
+ 0.442836,0.633994,-0.633994,0.883139,0,2.116861,
+ 0.442836,0.633994,-0.633994,0,0.75,2.25,
+ 0.442836,0.633994,-0.633994,1.5,0,2.54773,
+ 0.442836,0.633994,-0.633994,1.5,0,2.54773,
+ 0.442836,0.633994,-0.633994,0,0.75,2.25,
+ 0.442836,0.633994,-0.633994,0,1.295,2.795,
+ 0.442836,0.633994,-0.633994,1.5,0,2.54773,
+ 0.442836,0.633994,-0.633994,0,1.295,2.795,
+ 0.442836,0.633994,-0.633994,1.645583,0,2.649417,
+ 0.442836,0.633994,-0.633994,1.645583,0,2.649417,
+ 0.442836,0.633994,-0.633994,0,1.295,2.795,
+ 0.442836,0.633994,-0.633994,1.854008,0,2.795,
+ 0.442836,0.633994,-0.633994,1.854008,0,2.795,
+ 0.442836,0.633994,-0.633994,0,1.295,2.795,
+ 0.442836,0.633994,-0.633994,0,1.5,3,
+ 0.442836,0.633994,-0.633994,1.854008,0,2.795,
+ 0.442836,0.633994,-0.633994,0,1.5,3,
+ 0.442836,0.633994,-0.633994,2.110662,0.025731,3,
+ 0.442836,0.633994,-0.633994,1.854008,0,2.795,
+ 0.442836,0.633994,-0.633994,2.110662,0.025731,3,
+ 0.442836,0.633994,-0.633994,2.1475,0,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.332481,1.267766,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,0.332481,1.267766,3,
+ 0,0,1,0.55839,1.109972,3,
+ 0,0,-1,2.110662,0.025731,3,
+ 0,0,-1,0.55839,1.109972,3,
+ 0,0,-1,0.733368,0.987753,3,
+ 0,0,-1,2.110662,0.025731,3,
+ 0,0,-1,0.733368,0.987753,3,
+ 0,0,-1,0.883139,0.883139,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,0.883139,0.883139,3,
+ 0,0,1,1.022694,0.785662,3,
+ 0,0,-1,2.110662,0.025731,3,
+ 0,0,-1,1.022694,0.785662,3,
+ 0,0,-1,1.163402,0.68738,3,
+ 0,0,-1,2.110662,0.025731,3,
+ 0,0,-1,1.163402,0.68738,3,
+ 0,0,-1,1.317017,0.580081,3,
+ 0,0,1,2.110662,0.025731,3,
+ 0,0,1,1.317017,0.580081,3,
+ 0,0,1,1.5,0.45227,3,
+ 0,0,-1,2.110662,0.025731,3,
+ 0,0,-1,1.5,0.45227,3,
+ 0,0,-1,1.742034,0.283213,3
+};
+static const struct gllist lament_model_iso_usw_frame = { GL_N3F_V3F, GL_TRIANGLES, 222, lament_model_iso_usw_data, 0 };
+const struct gllist *lament_model_iso_usw = &lament_model_iso_usw_frame;
+
+static const float lament_model_leviathan_data[] = {
+ 0.81642,0.40914,-0.407508,2.250059,3.000719,2.250389,
+ 0.869552,0.350012,-0.348384,6.835994,-3.832072,6.831978,
+ 0.81642,0.40914,-0.407508,2.253099,0.752183,-0.001065,
+ 0.81642,0.40914,-0.407508,2.250059,3.000719,2.250389,
+ 0.81642,0.40914,-0.407508,2.253099,0.752183,-0.001065,
+ 0.755275,0.464254,-0.462632,-3.832693,6.833336,-3.834015,
+ -0.348245,-0.869659,-0.349884,6.835994,-3.832072,6.831978,
+ -0.407383,-0.816545,-0.409015,0.001794,0.748994,2.24762,
+ -0.407383,-0.816545,-0.409015,2.253099,0.752183,-0.001065,
+ -0.349891,0.348284,0.86964,6.835994,-3.832072,6.831978,
+ -0.409037,0.407405,0.816523,2.250059,3.000719,2.250389,
+ -0.409037,0.407405,0.816523,0.001794,0.748994,2.24762,
+ -0.409037,0.407405,0.816523,0.001794,0.748994,2.24762,
+ -0.409037,0.407405,0.816523,2.250059,3.000719,2.250389,
+ -0.464168,0.462527,0.755392,-3.832693,6.833336,-3.834015,
+ -0.407383,-0.816545,-0.409015,0.001794,0.748994,2.24762,
+ -0.462522,-0.755417,-0.464132,-3.832693,6.833336,-3.834015,
+ -0.407383,-0.816545,-0.409015,2.253099,0.752183,-0.001065
+};
+static const struct gllist lament_model_leviathan_frame = { GL_N3F_V3F, GL_TRIANGLES, 18, lament_model_leviathan_data, 0 };
+const struct gllist *lament_model_leviathan = &lament_model_leviathan_frame;
+
+static const float lament_model_lid_a_data[] = {
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,1.5,
+ 1,0,0,1.5,0.0625,2.7325,
+ 1,0,0,1.5,0,2.795,
+ 1,0,0,1.5,0,1.5,
+ 0,0,-1,1.5,0,1.5,
+ 0,0,-1,0.205,0,1.5,
+ 0,0,-1,0.2675,0.0625,1.5,
+ -0.57735,0.57735,0.57735,1.5,0,2.795,
+ -0.57735,0.57735,0.57735,0.2675,0.0625,1.5,
+ -0.57735,0.57735,0.57735,0.205,0,1.5,
+ -0.57735,0.57735,0.57735,0.2675,0.0625,1.5,
+ -0.57735,0.57735,0.57735,1.5,0,2.795,
+ -0.57735,0.57735,0.57735,1.5,0.0625,2.7325,
+ 0.05058,0.997438,-0.05058,1.5,0.0625,2.7325,
+ 0.05058,0.997438,-0.05058,1.5,0,1.5,
+ 0.05058,0.997438,-0.05058,0.2675,0.0625,1.5
+};
+static const struct gllist lament_model_lid_a_frame = { GL_N3F_V3F, GL_TRIANGLES, 18, lament_model_lid_a_data, 0 };
+const struct gllist *lament_model_lid_a = &lament_model_lid_a_frame;
+
+static const float lament_model_lid_b_data[] = {
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,0,-1,2.795,0,1.5,
+ 0,0,-1,1.5,0,1.5,
+ 0,0,-1,2.7325,0.0625,1.5,
+ -1,0,0,1.5,0.0625,2.7325,
+ -1,0,0,1.5,0,1.5,
+ -1,0,0,1.5,0,2.795,
+ -0.05058,0.997438,-0.05058,1.5,0.0625,2.7325,
+ -0.05058,0.997438,-0.05058,2.7325,0.0625,1.5,
+ -0.05058,0.997438,-0.05058,1.5,0,1.5,
+ 0.57735,0.57735,0.57735,2.7325,0.0625,1.5,
+ 0.57735,0.57735,0.57735,1.5,0,2.795,
+ 0.57735,0.57735,0.57735,2.795,0,1.5,
+ 0.57735,0.57735,0.57735,1.5,0,2.795,
+ 0.57735,0.57735,0.57735,2.7325,0.0625,1.5,
+ 0.57735,0.57735,0.57735,1.5,0.0625,2.7325
+};
+static const struct gllist lament_model_lid_b_frame = { GL_N3F_V3F, GL_TRIANGLES, 18, lament_model_lid_b_data, 0 };
+const struct gllist *lament_model_lid_b = &lament_model_lid_b_frame;
+
+static const float lament_model_lid_base_data[] = {
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0.447214,0.894427,2.502268,3,3,
+ 0.408248,0.408248,0.816497,3,3,3,
+ 0,1,0,2.795,3,3,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,3,1.5,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,3,
+ 0,-0.447214,0.894427,1.5,0,3,
+ 0,-1,0,2.795,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,-0.447214,0.894427,1.5,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.798369,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,2.795,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,3,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.077767,0.868083,0,
+ -0.57735,-0.57735,-0.57735,2.1475,0,2.1475,
+ -0.57735,-0.57735,-0.57735,2.545,0.25,1.5,
+ -0.57735,-0.57735,-0.57735,2.795,0,1.5,
+ -0.57735,-0.57735,-0.57735,2.545,0.25,1.5,
+ -0.57735,-0.57735,-0.57735,2.1475,0,2.1475,
+ -0.57735,-0.57735,-0.57735,2.0225,0.25,2.0225,
+ -0.57735,-0.57735,0.57735,2.1475,0,0.8525,
+ -0.57735,-0.57735,0.57735,1.5,0.25,0.455,
+ -0.57735,-0.57735,0.57735,1.5,0,0.205,
+ -0.57735,-0.57735,0.57735,1.5,0.25,0.455,
+ -0.57735,-0.57735,0.57735,2.1475,0,0.8525,
+ -0.57735,-0.57735,0.57735,2.0225,0.25,0.9775,
+ 0.57735,-0.57735,-0.57735,0.9775,0.25,2.0225,
+ 0.57735,-0.57735,-0.57735,1.5,0,2.795,
+ 0.57735,-0.57735,-0.57735,0.8525,0,2.1475,
+ 0.57735,-0.57735,-0.57735,1.5,0,2.795,
+ 0.57735,-0.57735,-0.57735,0.9775,0.25,2.0225,
+ 0.57735,-0.57735,-0.57735,1.5,0.25,2.545,
+ 0.57735,-0.57735,0.57735,0.9775,0.25,0.9775,
+ 0.57735,-0.57735,0.57735,0.205,0,1.5,
+ 0.57735,-0.57735,0.57735,0.8525,0,0.8525,
+ 0.57735,-0.57735,0.57735,0.205,0,1.5,
+ 0.57735,-0.57735,0.57735,0.9775,0.25,0.9775,
+ 0.57735,-0.57735,0.57735,0.455,0.25,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,-1,0.205,0,3,
+ 0,0,-1,0.87868,0,3,
+ 0,0,-1,0.497732,0,3,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,3,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,-0.447214,-0.894427,2.502268,0,0,
+ 0.408248,-0.408248,-0.816497,3,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,3,3,0,
+ 0.408248,0.408248,-0.816497,3,3,0,
+ 0,0.447214,-0.894427,2.502268,3,0,
+ 0,1,0,2.795,3,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,2.502268,0,
+ 0.447214,0,-0.894427,3,2.502268,0,
+ 0.408248,0.408248,-0.816497,3,3,0,
+ 1,0,0,3,2.795,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0.408248,-0.408248,-0.816497,3,0,0,
+ 0.6,0,-0.8,3,0.497732,0,
+ 1,0,0,3,0.205,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0.408248,0.408248,0.816497,3,3,3,
+ 0.447214,0,0.894427,3,2.502268,3,
+ 1,0,0,3,2.795,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,0.497732,3,
+ 0.447214,0,0.894427,3,0.497732,3,
+ 0.408248,-0.408248,0.816497,3,0,3,
+ 1,0,0,3,0.205,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,3,0,3,
+ 0.408248,-0.408248,0.816497,3,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,-1,0,2.795,0,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,3,3,3,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.497732,3,3,
+ 0,1,0,0.497732,3,3,
+ 0,1,0,1.5,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0.447214,0.894427,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.502268,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.502268,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0.447214,0.894427,2.502268,3,3,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0.447214,0.894427,2.502268,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,3,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0,
+ 0,1,0,0,3,0.205,
+ 0,1,0,2.795,3,3,
+ 0,1,0,3,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,2.795,
+ 0.57735,-0.57735,0.57735,1.5,0.25,0.455,
+ 0.57735,-0.57735,0.57735,0.8525,0,0.8525,
+ 0.57735,-0.57735,0.57735,1.5,0,0.205,
+ 0.57735,-0.57735,0.57735,0.8525,0,0.8525,
+ 0.57735,-0.57735,0.57735,1.5,0.25,0.455,
+ 0.57735,-0.57735,0.57735,0.9775,0.25,0.9775,
+ -0.57735,-0.57735,-0.57735,1.5,0.25,2.545,
+ -0.57735,-0.57735,-0.57735,2.1475,0,2.1475,
+ -0.57735,-0.57735,-0.57735,1.5,0,2.795,
+ -0.57735,-0.57735,-0.57735,2.1475,0,2.1475,
+ -0.57735,-0.57735,-0.57735,1.5,0.25,2.545,
+ -0.57735,-0.57735,-0.57735,2.0225,0.25,2.0225,
+ -0.57735,-0.57735,0.57735,2.795,0,1.5,
+ -0.57735,-0.57735,0.57735,2.0225,0.25,0.9775,
+ -0.57735,-0.57735,0.57735,2.1475,0,0.8525,
+ -0.57735,-0.57735,0.57735,2.0225,0.25,0.9775,
+ -0.57735,-0.57735,0.57735,2.795,0,1.5,
+ -0.57735,-0.57735,0.57735,2.545,0.25,1.5,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,3,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,3,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0,0,
+ -1,0,0,0,3,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,3,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,3,3,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0,0.205,
+ 0.57735,-0.57735,-0.57735,0.455,0.25,1.5,
+ 0.57735,-0.57735,-0.57735,0.8525,0,2.1475,
+ 0.57735,-0.57735,-0.57735,0.205,0,1.5,
+ 0.57735,-0.57735,-0.57735,0.8525,0,2.1475,
+ 0.57735,-0.57735,-0.57735,0.455,0.25,1.5,
+ 0.57735,-0.57735,-0.57735,0.9775,0.25,2.0225
+};
+static const struct gllist lament_model_lid_base_frame = { GL_N3F_V3F, GL_TRIANGLES, 1584, lament_model_lid_base_data, 0 };
+const struct gllist *lament_model_lid_base = &lament_model_lid_base_frame;
+
+static const float lament_model_lid_c_data[] = {
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,1.5,
+ -1,0,0,1.5,0.0625,0.2675,
+ -1,0,0,1.5,0,0.205,
+ -1,0,0,1.5,0,1.5,
+ 0,0,1,2.795,0,1.5,
+ 0,0,1,2.7325,0.0625,1.5,
+ 0,0,1,1.5,0,1.5,
+ -0.05058,0.997438,0.05058,2.7325,0.0625,1.5,
+ -0.05058,0.997438,0.05058,1.5,0.0625,0.2675,
+ -0.05058,0.997438,0.05058,1.5,0,1.5,
+ 0.57735,0.57735,-0.57735,1.5,0.0625,0.2675,
+ 0.57735,0.57735,-0.57735,2.795,0,1.5,
+ 0.57735,0.57735,-0.57735,1.5,0,0.205,
+ 0.57735,0.57735,-0.57735,2.795,0,1.5,
+ 0.57735,0.57735,-0.57735,1.5,0.0625,0.2675,
+ 0.57735,0.57735,-0.57735,2.7325,0.0625,1.5
+};
+static const struct gllist lament_model_lid_c_frame = { GL_N3F_V3F, GL_TRIANGLES, 18, lament_model_lid_c_data, 0 };
+const struct gllist *lament_model_lid_c = &lament_model_lid_c_frame;
+
+static const float lament_model_lid_d_data[] = {
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.5,0,1.5,
+ 0,0,1,1.5,0,1.5,
+ 0,0,1,0.2675,0.0625,1.5,
+ 0,0,1,0.205,0,1.5,
+ 1,0,0,1.5,0.0625,0.2675,
+ 1,0,0,1.5,0,1.5,
+ 1,0,0,1.5,0,0.205,
+ 0.05058,0.997438,0.05058,1.5,0,1.5,
+ 0.05058,0.997438,0.05058,1.5,0.0625,0.2675,
+ 0.05058,0.997438,0.05058,0.2675,0.0625,1.5,
+ -0.57735,0.57735,-0.57735,0.205,0,1.5,
+ -0.57735,0.57735,-0.57735,1.5,0.0625,0.2675,
+ -0.57735,0.57735,-0.57735,1.5,0,0.205,
+ -0.57735,0.57735,-0.57735,1.5,0.0625,0.2675,
+ -0.57735,0.57735,-0.57735,0.205,0,1.5,
+ -0.57735,0.57735,-0.57735,0.2675,0.0625,1.5
+};
+static const struct gllist lament_model_lid_d_frame = { GL_N3F_V3F, GL_TRIANGLES, 18, lament_model_lid_d_data, 0 };
+const struct gllist *lament_model_lid_d = &lament_model_lid_d_frame;
+
+static const float lament_model_pillar_a_data[] = {
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0.74,3,
+ -0.840455,0.541882,0,0.868083,1.922233,3,
+ -0.874085,0.485774,0,0.82974,1.858262,1.5,
+ -0.889521,0.456893,0,0.82974,1.858262,3,
+ -0.874085,0.485774,0,0.82974,1.858262,1.5,
+ -0.840455,0.541882,0,0.868083,1.922233,3,
+ -0.822262,0.56911,0,0.868083,1.922233,1.5,
+ -0.889521,0.456893,0,0.82974,1.858262,3,
+ -0.91749,0.397759,0,0.797852,1.790839,1.5,
+ -0.930022,0.367505,0,0.797852,1.790839,3,
+ -0.91749,0.397759,0,0.797852,1.790839,1.5,
+ -0.889521,0.456893,0,0.82974,1.858262,3,
+ -0.874085,0.485774,0,0.82974,1.858262,1.5,
+ -0.983848,0.179005,0,0.754603,1.648269,3,
+ -0.993446,0.114299,0,0.74366,1.574493,1.5,
+ -0.996656,0.081709,0,0.74366,1.574493,3,
+ -0.993446,0.114299,0,0.74366,1.574493,1.5,
+ -0.983848,0.179005,0,0.754603,1.648269,3,
+ -0.97746,0.211123,0,0.754603,1.648269,1.5,
+ 0.211123,0.97746,0,1.648269,2.245397,3,
+ 0.274577,0.961565,0,1.720616,2.227275,1.5,
+ 0.179005,0.983848,0,1.648269,2.245397,1.5,
+ 0.274577,0.961565,0,1.720616,2.227275,1.5,
+ 0.211123,0.97746,0,1.648269,2.245397,3,
+ 0.305914,0.952059,0,1.720616,2.227275,3,
+ 0.114299,0.993446,0,1.574493,2.25634,3,
+ 0.179005,0.983848,0,1.648269,2.245397,1.5,
+ 0.081709,0.996656,0,1.574493,2.25634,1.5,
+ 0.179005,0.983848,0,1.648269,2.245397,1.5,
+ 0.114299,0.993446,0,1.574493,2.25634,3,
+ 0.211123,0.97746,0,1.648269,2.245397,3,
+ -0.707107,0.707107,0,0.962599,2.037401,3,
+ -0.646965,0.76252,0,1.017861,2.087488,1.5,
+ -0.707107,0.707107,0,0.962599,2.037401,1.5,
+ -0.646965,0.76252,0,1.017861,2.087488,1.5,
+ -0.707107,0.707107,0,0.962599,2.037401,3,
+ -0.621651,0.783294,0,1.017861,2.087488,3,
+ -0.707107,0.707107,0,0.962599,2.037401,3,
+ -0.76252,0.646965,0,0.912512,1.982139,1.5,
+ -0.783294,0.621651,0,0.912512,1.982139,3,
+ -0.76252,0.646965,0,0.912512,1.982139,1.5,
+ -0.707107,0.707107,0,0.962599,2.037401,3,
+ -0.707107,0.707107,0,0.962599,2.037401,1.5,
+ 0.952059,0.305914,0,2.227275,1.720616,1.5,
+ 0.930022,0.367505,0,2.202148,1.790839,3,
+ 0.961565,0.274577,0,2.227275,1.720616,3,
+ 0.930022,0.367505,0,2.202148,1.790839,3,
+ 0.952059,0.305914,0,2.227275,1.720616,1.5,
+ 0.91749,0.397759,0,2.202148,1.790839,1.5,
+ -0.211123,-0.97746,0,1.351731,0.754603,3,
+ -0.274577,-0.961565,0,1.279384,0.772725,1.5,
+ -0.179005,-0.983848,0,1.351731,0.754603,1.5,
+ -0.274577,-0.961565,0,1.279384,0.772725,1.5,
+ -0.211123,-0.97746,0,1.351731,0.754603,3,
+ -0.305914,-0.952059,0,1.279384,0.772725,3,
+ -0.016373,-0.999866,0,1.5,0.74,3,
+ -0.081709,-0.996656,0,1.425507,0.74366,1.5,
+ 0.016373,-0.999866,0,1.5,0.74,1.5,
+ -0.081709,-0.996656,0,1.425507,0.74366,1.5,
+ -0.016373,-0.999866,0,1.5,0.74,3,
+ -0.114299,-0.993446,0,1.425507,0.74366,3,
+ 0.081709,-0.996656,0,1.574493,0.74366,3,
+ 0.016373,-0.999866,0,1.5,0.74,1.5,
+ 0.114299,-0.993446,0,1.574493,0.74366,1.5,
+ 0.016373,-0.999866,0,1.5,0.74,1.5,
+ 0.081709,-0.996656,0,1.574493,0.74366,3,
+ -0.016373,-0.999866,0,1.5,0.74,3,
+ 0.783294,-0.621651,0,2.087488,1.017861,1.5,
+ 0.822262,-0.56911,0,2.131917,1.077767,3,
+ 0.76252,-0.646965,0,2.087488,1.017861,3,
+ 0.822262,-0.56911,0,2.131917,1.077767,3,
+ 0.783294,-0.621651,0,2.087488,1.017861,1.5,
+ 0.840455,-0.541882,0,2.131917,1.077767,1.5,
+ -0.305914,-0.952059,0,1.279384,0.772725,3,
+ -0.367505,-0.930022,0,1.209161,0.797852,1.5,
+ -0.274577,-0.961565,0,1.279384,0.772725,1.5,
+ -0.367505,-0.930022,0,1.209161,0.797852,1.5,
+ -0.305914,-0.952059,0,1.279384,0.772725,3,
+ -0.397759,-0.91749,0,1.209161,0.797852,3,
+ 0.995185,0.098017,0,2.25634,1.574493,1.5,
+ 0.999866,0.016373,0,2.26,1.5,3,
+ 0.999866,-0.016373,0,2.26,1.5,1.5,
+ 0.999866,0.016373,0,2.26,1.5,3,
+ 0.995185,0.098017,0,2.25634,1.574493,1.5,
+ 0.995185,0.098017,0,2.25634,1.574493,3,
+ -0.114299,-0.993446,0,1.425507,0.74366,3,
+ -0.179005,-0.983848,0,1.351731,0.754603,1.5,
+ -0.081709,-0.996656,0,1.425507,0.74366,1.5,
+ -0.179005,-0.983848,0,1.351731,0.754603,1.5,
+ -0.114299,-0.993446,0,1.425507,0.74366,3,
+ -0.211123,-0.97746,0,1.351731,0.754603,3,
+ 0.456893,-0.889521,0,1.858262,0.82974,3,
+ 0.397759,-0.91749,0,1.790839,0.797852,1.5,
+ 0.485774,-0.874085,0,1.858262,0.82974,1.5,
+ 0.397759,-0.91749,0,1.790839,0.797852,1.5,
+ 0.456893,-0.889521,0,1.858262,0.82974,3,
+ 0.367505,-0.930022,0,1.790839,0.797852,3,
+ -0.541882,0.840455,0,1.077767,2.131917,3,
+ -0.485774,0.874085,0,1.141738,2.17026,1.5,
+ -0.56911,0.822262,0,1.077767,2.131917,1.5,
+ -0.485774,0.874085,0,1.141738,2.17026,1.5,
+ -0.541882,0.840455,0,1.077767,2.131917,3,
+ -0.456893,0.889521,0,1.141738,2.17026,3,
+ -0.621651,0.783294,0,1.017861,2.087488,3,
+ -0.56911,0.822262,0,1.077767,2.131917,1.5,
+ -0.646965,0.76252,0,1.017861,2.087488,1.5,
+ -0.56911,0.822262,0,1.077767,2.131917,1.5,
+ -0.621651,0.783294,0,1.017861,2.087488,3,
+ -0.541882,0.840455,0,1.077767,2.131917,3,
+ 0.485774,0.874085,0,1.858262,2.17026,3,
+ 0.541882,0.840455,0,1.922233,2.131917,1.5,
+ 0.456893,0.889521,0,1.858262,2.17026,1.5,
+ 0.541882,0.840455,0,1.922233,2.131917,1.5,
+ 0.485774,0.874085,0,1.858262,2.17026,3,
+ 0.56911,0.822262,0,1.922233,2.131917,3,
+ 0.71859,-0.695434,0,2.037401,0.962599,1.5,
+ 0.76252,-0.646965,0,2.087488,1.017861,3,
+ 0.695434,-0.71859,0,2.037401,0.962599,3,
+ 0.76252,-0.646965,0,2.087488,1.017861,3,
+ 0.71859,-0.695434,0,2.037401,0.962599,1.5,
+ 0.783294,-0.621651,0,2.087488,1.017861,1.5,
+ 0.97746,0.211123,0,2.245397,1.648269,1.5,
+ 0.961565,0.274577,0,2.227275,1.720616,3,
+ 0.983848,0.179005,0,2.245397,1.648269,3,
+ 0.961565,0.274577,0,2.227275,1.720616,3,
+ 0.97746,0.211123,0,2.245397,1.648269,1.5,
+ 0.952059,0.305914,0,2.227275,1.720616,1.5,
+ 0.993446,-0.114299,0,2.25634,1.425507,1.5,
+ 0.983848,-0.179005,0,2.245397,1.351731,3,
+ 0.97746,-0.211123,0,2.245397,1.351731,1.5,
+ 0.983848,-0.179005,0,2.245397,1.351731,3,
+ 0.993446,-0.114299,0,2.25634,1.425507,1.5,
+ 0.996656,-0.081709,0,2.25634,1.425507,3,
+ -0.397759,-0.91749,0,1.209161,0.797852,3,
+ -0.456893,-0.889521,0,1.141738,0.82974,1.5,
+ -0.367505,-0.930022,0,1.209161,0.797852,1.5,
+ -0.456893,-0.889521,0,1.141738,0.82974,1.5,
+ -0.397759,-0.91749,0,1.209161,0.797852,3,
+ -0.485774,-0.874085,0,1.141738,0.82974,3,
+ -0.930022,0.367505,0,0.797852,1.790839,3,
+ -0.952059,0.305914,0,0.772725,1.720616,1.5,
+ -0.961565,0.274577,0,0.772725,1.720616,3,
+ -0.952059,0.305914,0,0.772725,1.720616,1.5,
+ -0.930022,0.367505,0,0.797852,1.790839,3,
+ -0.91749,0.397759,0,0.797852,1.790839,1.5,
+ 0.016373,0.999866,0,1.5,2.26,3,
+ 0.081709,0.996656,0,1.574493,2.25634,1.5,
+ -0.016373,0.999866,0,1.5,2.26,1.5,
+ 0.081709,0.996656,0,1.574493,2.25634,1.5,
+ 0.016373,0.999866,0,1.5,2.26,3,
+ 0.114299,0.993446,0,1.574493,2.25634,3,
+ -0.081709,0.996656,0,1.425507,2.25634,3,
+ -0.016373,0.999866,0,1.5,2.26,1.5,
+ -0.114299,0.993446,0,1.425507,2.25634,1.5,
+ -0.016373,0.999866,0,1.5,2.26,1.5,
+ -0.081709,0.996656,0,1.425507,2.25634,3,
+ 0.016373,0.999866,0,1.5,2.26,3,
+ -0.179005,0.983848,0,1.351731,2.245397,3,
+ -0.114299,0.993446,0,1.425507,2.25634,1.5,
+ -0.211123,0.97746,0,1.351731,2.245397,1.5,
+ -0.114299,0.993446,0,1.425507,2.25634,1.5,
+ -0.179005,0.983848,0,1.351731,2.245397,3,
+ -0.081709,0.996656,0,1.425507,2.25634,3,
+ -0.274577,0.961565,0,1.279384,2.227275,3,
+ -0.211123,0.97746,0,1.351731,2.245397,1.5,
+ -0.305914,0.952059,0,1.279384,2.227275,1.5,
+ -0.211123,0.97746,0,1.351731,2.245397,1.5,
+ -0.274577,0.961565,0,1.279384,2.227275,3,
+ -0.179005,0.983848,0,1.351731,2.245397,3,
+ -0.367505,0.930022,0,1.209161,2.202148,3,
+ -0.305914,0.952059,0,1.279384,2.227275,1.5,
+ -0.397759,0.91749,0,1.209161,2.202148,1.5,
+ -0.305914,0.952059,0,1.279384,2.227275,1.5,
+ -0.367505,0.930022,0,1.209161,2.202148,3,
+ -0.274577,0.961565,0,1.279384,2.227275,3,
+ 0.874085,0.485774,0,2.17026,1.858262,1.5,
+ 0.840455,0.541882,0,2.131917,1.922233,3,
+ 0.889521,0.456893,0,2.17026,1.858262,3,
+ 0.840455,0.541882,0,2.131917,1.922233,3,
+ 0.874085,0.485774,0,2.17026,1.858262,1.5,
+ 0.822262,0.56911,0,2.131917,1.922233,1.5,
+ -0.783294,0.621651,0,0.912512,1.982139,3,
+ -0.822262,0.56911,0,0.868083,1.922233,1.5,
+ -0.840455,0.541882,0,0.868083,1.922233,3,
+ -0.822262,0.56911,0,0.868083,1.922233,1.5,
+ -0.783294,0.621651,0,0.912512,1.982139,3,
+ -0.76252,0.646965,0,0.912512,1.982139,1.5,
+ 0.541882,-0.840455,0,1.922233,0.868083,3,
+ 0.485774,-0.874085,0,1.858262,0.82974,1.5,
+ 0.56911,-0.822262,0,1.922233,0.868083,1.5,
+ 0.485774,-0.874085,0,1.858262,0.82974,1.5,
+ 0.541882,-0.840455,0,1.922233,0.868083,3,
+ 0.456893,-0.889521,0,1.858262,0.82974,3,
+ 0.621651,-0.783294,0,1.982139,0.912512,3,
+ 0.56911,-0.822262,0,1.922233,0.868083,1.5,
+ 0.646965,-0.76252,0,1.982139,0.912512,1.5,
+ 0.56911,-0.822262,0,1.922233,0.868083,1.5,
+ 0.621651,-0.783294,0,1.982139,0.912512,3,
+ 0.541882,-0.840455,0,1.922233,0.868083,3,
+ 0.695434,-0.71859,0,2.037401,0.962599,3,
+ 0.646965,-0.76252,0,1.982139,0.912512,1.5,
+ 0.71859,-0.695434,0,2.037401,0.962599,1.5,
+ 0.646965,-0.76252,0,1.982139,0.912512,1.5,
+ 0.695434,-0.71859,0,2.037401,0.962599,3,
+ 0.621651,-0.783294,0,1.982139,0.912512,3,
+ -0.646965,-0.76252,0,1.017861,0.912512,3,
+ -0.695434,-0.71859,0,0.962599,0.962599,1.5,
+ -0.621651,-0.783294,0,1.017861,0.912512,1.5,
+ -0.695434,-0.71859,0,0.962599,0.962599,1.5,
+ -0.646965,-0.76252,0,1.017861,0.912512,3,
+ -0.71859,-0.695434,0,0.962599,0.962599,3,
+ 0.397759,0.91749,0,1.790839,2.202148,3,
+ 0.456893,0.889521,0,1.858262,2.17026,1.5,
+ 0.367505,0.930022,0,1.790839,2.202148,1.5,
+ 0.456893,0.889521,0,1.858262,2.17026,1.5,
+ 0.397759,0.91749,0,1.790839,2.202148,3,
+ 0.485774,0.874085,0,1.858262,2.17026,3,
+ 0.822262,0.56911,0,2.131917,1.922233,1.5,
+ 0.783294,0.621651,0,2.087488,1.982139,3,
+ 0.840455,0.541882,0,2.131917,1.922233,3,
+ 0.783294,0.621651,0,2.087488,1.982139,3,
+ 0.822262,0.56911,0,2.131917,1.922233,1.5,
+ 0.76252,0.646965,0,2.087488,1.982139,1.5,
+ 0.995185,0.098017,0,2.25634,1.574493,1.5,
+ 0.983848,0.179005,0,2.245397,1.648269,3,
+ 0.995185,0.098017,0,2.25634,1.574493,3,
+ 0.983848,0.179005,0,2.245397,1.648269,3,
+ 0.995185,0.098017,0,2.25634,1.574493,1.5,
+ 0.97746,0.211123,0,2.245397,1.648269,1.5,
+ 0.56911,0.822262,0,1.922233,2.131917,3,
+ 0.621651,0.783294,0,1.982139,2.087488,1.5,
+ 0.541882,0.840455,0,1.922233,2.131917,1.5,
+ 0.621651,0.783294,0,1.982139,2.087488,1.5,
+ 0.56911,0.822262,0,1.922233,2.131917,3,
+ 0.646965,0.76252,0,1.982139,2.087488,3,
+ 0.646965,0.76252,0,1.982139,2.087488,3,
+ 0.695434,0.71859,0,2.037401,2.037401,1.5,
+ 0.621651,0.783294,0,1.982139,2.087488,1.5,
+ 0.695434,0.71859,0,2.037401,2.037401,1.5,
+ 0.646965,0.76252,0,1.982139,2.087488,3,
+ 0.71859,0.695434,0,2.037401,2.037401,3,
+ 0.305914,0.952059,0,1.720616,2.227275,3,
+ 0.367505,0.930022,0,1.790839,2.202148,1.5,
+ 0.274577,0.961565,0,1.720616,2.227275,1.5,
+ 0.367505,0.930022,0,1.790839,2.202148,1.5,
+ 0.305914,0.952059,0,1.720616,2.227275,3,
+ 0.397759,0.91749,0,1.790839,2.202148,3,
+ 0.91749,0.397759,0,2.202148,1.790839,1.5,
+ 0.889521,0.456893,0,2.17026,1.858262,3,
+ 0.930022,0.367505,0,2.202148,1.790839,3,
+ 0.889521,0.456893,0,2.17026,1.858262,3,
+ 0.91749,0.397759,0,2.202148,1.790839,1.5,
+ 0.874085,0.485774,0,2.17026,1.858262,1.5,
+ -0.485774,-0.874085,0,1.141738,0.82974,3,
+ -0.541882,-0.840455,0,1.077767,0.868083,1.5,
+ -0.456893,-0.889521,0,1.141738,0.82974,1.5,
+ -0.541882,-0.840455,0,1.077767,0.868083,1.5,
+ -0.485774,-0.874085,0,1.141738,0.82974,3,
+ -0.56911,-0.822262,0,1.077767,0.868083,3,
+ 0.367505,-0.930022,0,1.790839,0.797852,3,
+ 0.305914,-0.952059,0,1.720616,0.772725,1.5,
+ 0.397759,-0.91749,0,1.790839,0.797852,1.5,
+ 0.305914,-0.952059,0,1.720616,0.772725,1.5,
+ 0.367505,-0.930022,0,1.790839,0.797852,3,
+ 0.274577,-0.961565,0,1.720616,0.772725,3,
+ -0.996656,0.081709,0,0.74366,1.574493,3,
+ -0.999866,0.016373,0,0.74,1.5,1.5,
+ -0.999866,-0.016373,0,0.74,1.5,3,
+ -0.999866,0.016373,0,0.74,1.5,1.5,
+ -0.996656,0.081709,0,0.74366,1.574493,3,
+ -0.993446,0.114299,0,0.74366,1.574493,1.5,
+ -0.961565,0.274577,0,0.772725,1.720616,3,
+ -0.97746,0.211123,0,0.754603,1.648269,1.5,
+ -0.983848,0.179005,0,0.754603,1.648269,3,
+ -0.97746,0.211123,0,0.754603,1.648269,1.5,
+ -0.961565,0.274577,0,0.772725,1.720616,3,
+ -0.952059,0.305914,0,0.772725,1.720616,1.5,
+ 0.76252,0.646965,0,2.087488,1.982139,1.5,
+ 0.71859,0.695434,0,2.037401,2.037401,3,
+ 0.783294,0.621651,0,2.087488,1.982139,3,
+ 0.71859,0.695434,0,2.037401,2.037401,3,
+ 0.76252,0.646965,0,2.087488,1.982139,1.5,
+ 0.695434,0.71859,0,2.037401,2.037401,1.5,
+ 0.274577,-0.961565,0,1.720616,0.772725,3,
+ 0.211123,-0.97746,0,1.648269,0.754603,1.5,
+ 0.305914,-0.952059,0,1.720616,0.772725,1.5,
+ 0.211123,-0.97746,0,1.648269,0.754603,1.5,
+ 0.274577,-0.961565,0,1.720616,0.772725,3,
+ 0.179005,-0.983848,0,1.648269,0.754603,3,
+ -0.71859,-0.695434,0,0.962599,0.962599,3,
+ -0.76252,-0.646965,0,0.912512,1.017861,1.5,
+ -0.695434,-0.71859,0,0.962599,0.962599,1.5,
+ -0.76252,-0.646965,0,0.912512,1.017861,1.5,
+ -0.71859,-0.695434,0,0.962599,0.962599,3,
+ -0.783294,-0.621651,0,0.912512,1.017861,3,
+ -0.91749,-0.397759,0,0.797852,1.209161,3,
+ -0.881921,-0.471397,0,0.82974,1.141738,1.5,
+ -0.881921,-0.471397,0,0.82974,1.141738,3,
+ -0.881921,-0.471397,0,0.82974,1.141738,1.5,
+ -0.91749,-0.397759,0,0.797852,1.209161,3,
+ -0.930022,-0.367505,0,0.797852,1.209161,1.5,
+ 0.840455,-0.541882,0,2.131917,1.077767,1.5,
+ 0.881921,-0.471397,0,2.17026,1.141738,3,
+ 0.822262,-0.56911,0,2.131917,1.077767,3,
+ 0.881921,-0.471397,0,2.17026,1.141738,3,
+ 0.840455,-0.541882,0,2.131917,1.077767,1.5,
+ 0.881921,-0.471397,0,2.17026,1.141738,1.5,
+ 0.91749,-0.397759,0,2.202148,1.209161,1.5,
+ 0.881921,-0.471397,0,2.17026,1.141738,3,
+ 0.881921,-0.471397,0,2.17026,1.141738,1.5,
+ 0.881921,-0.471397,0,2.17026,1.141738,3,
+ 0.91749,-0.397759,0,2.202148,1.209161,1.5,
+ 0.930022,-0.367505,0,2.202148,1.209161,3,
+ -0.840455,-0.541882,0,0.868083,1.077767,3,
+ -0.881921,-0.471397,0,0.82974,1.141738,1.5,
+ -0.822262,-0.56911,0,0.868083,1.077767,1.5,
+ -0.881921,-0.471397,0,0.82974,1.141738,1.5,
+ -0.840455,-0.541882,0,0.868083,1.077767,3,
+ -0.881921,-0.471397,0,0.82974,1.141738,3,
+ 0.97746,-0.211123,0,2.245397,1.351731,1.5,
+ 0.961565,-0.274577,0,2.227275,1.279384,3,
+ 0.952059,-0.305914,0,2.227275,1.279384,1.5,
+ 0.961565,-0.274577,0,2.227275,1.279384,3,
+ 0.97746,-0.211123,0,2.245397,1.351731,1.5,
+ 0.983848,-0.179005,0,2.245397,1.351731,3,
+ 0.952059,-0.305914,0,2.227275,1.279384,1.5,
+ 0.930022,-0.367505,0,2.202148,1.209161,3,
+ 0.91749,-0.397759,0,2.202148,1.209161,1.5,
+ 0.930022,-0.367505,0,2.202148,1.209161,3,
+ 0.952059,-0.305914,0,2.227275,1.279384,1.5,
+ 0.961565,-0.274577,0,2.227275,1.279384,3,
+ 0.999866,-0.016373,0,2.26,1.5,1.5,
+ 0.996656,-0.081709,0,2.25634,1.425507,3,
+ 0.993446,-0.114299,0,2.25634,1.425507,1.5,
+ 0.996656,-0.081709,0,2.25634,1.425507,3,
+ 0.999866,-0.016373,0,2.26,1.5,1.5,
+ 0.999866,0.016373,0,2.26,1.5,3,
+ 0.179005,-0.983848,0,1.648269,0.754603,3,
+ 0.114299,-0.993446,0,1.574493,0.74366,1.5,
+ 0.211123,-0.97746,0,1.648269,0.754603,1.5,
+ 0.114299,-0.993446,0,1.574493,0.74366,1.5,
+ 0.179005,-0.983848,0,1.648269,0.754603,3,
+ 0.081709,-0.996656,0,1.574493,0.74366,3,
+ -0.783294,-0.621651,0,0.912512,1.017861,3,
+ -0.822262,-0.56911,0,0.868083,1.077767,1.5,
+ -0.76252,-0.646965,0,0.912512,1.017861,1.5,
+ -0.822262,-0.56911,0,0.868083,1.077767,1.5,
+ -0.783294,-0.621651,0,0.912512,1.017861,3,
+ -0.840455,-0.541882,0,0.868083,1.077767,3,
+ -0.56911,-0.822262,0,1.077767,0.868083,3,
+ -0.621651,-0.783294,0,1.017861,0.912512,1.5,
+ -0.541882,-0.840455,0,1.077767,0.868083,1.5,
+ -0.621651,-0.783294,0,1.017861,0.912512,1.5,
+ -0.56911,-0.822262,0,1.077767,0.868083,3,
+ -0.646965,-0.76252,0,1.017861,0.912512,3,
+ -0.999866,-0.016373,0,0.74,1.5,3,
+ -0.996656,-0.081709,0,0.74366,1.425507,1.5,
+ -0.993446,-0.114299,0,0.74366,1.425507,3,
+ -0.996656,-0.081709,0,0.74366,1.425507,1.5,
+ -0.999866,-0.016373,0,0.74,1.5,3,
+ -0.999866,0.016373,0,0.74,1.5,1.5,
+ -0.993446,-0.114299,0,0.74366,1.425507,3,
+ -0.983848,-0.179005,0,0.754603,1.351731,1.5,
+ -0.97746,-0.211123,0,0.754603,1.351731,3,
+ -0.983848,-0.179005,0,0.754603,1.351731,1.5,
+ -0.993446,-0.114299,0,0.74366,1.425507,3,
+ -0.996656,-0.081709,0,0.74366,1.425507,1.5,
+ -0.97746,-0.211123,0,0.754603,1.351731,3,
+ -0.961565,-0.274577,0,0.772725,1.279384,1.5,
+ -0.952059,-0.305914,0,0.772725,1.279384,3,
+ -0.961565,-0.274577,0,0.772725,1.279384,1.5,
+ -0.97746,-0.211123,0,0.754603,1.351731,3,
+ -0.983848,-0.179005,0,0.754603,1.351731,1.5,
+ -0.952059,-0.305914,0,0.772725,1.279384,3,
+ -0.930022,-0.367505,0,0.797852,1.209161,1.5,
+ -0.91749,-0.397759,0,0.797852,1.209161,3,
+ -0.930022,-0.367505,0,0.797852,1.209161,1.5,
+ -0.952059,-0.305914,0,0.772725,1.279384,3,
+ -0.961565,-0.274577,0,0.772725,1.279384,1.5,
+ -0.456893,0.889521,0,1.141738,2.17026,3,
+ -0.397759,0.91749,0,1.209161,2.202148,1.5,
+ -0.485774,0.874085,0,1.141738,2.17026,1.5,
+ -0.397759,0.91749,0,1.209161,2.202148,1.5,
+ -0.456893,0.889521,0,1.141738,2.17026,3,
+ -0.367505,0.930022,0,1.209161,2.202148,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,-1,2.245397,1.351731,1.5,
+ 0,0,-1,2.202148,1.209161,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.202148,1.209161,1.5,
+ 0,0,-1,2.245397,1.351731,1.5,
+ 0,0,-1,2.227275,1.279384,1.5,
+ 0,0,-1,2.26,1.5,1.5,
+ 0,0,-1,2.245397,1.351731,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.245397,1.351731,1.5,
+ 0,0,-1,2.26,1.5,1.5,
+ 0,0,-1,2.25634,1.425507,1.5,
+ 0,0,-1,2.131917,1.077767,1.5,
+ 0,0,-1,2.037401,0.962599,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.037401,0.962599,1.5,
+ 0,0,-1,2.131917,1.077767,1.5,
+ 0,0,-1,2.087488,1.017861,1.5,
+ 0,0,-1,2.202148,1.209161,1.5,
+ 0,0,-1,2.131917,1.077767,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.131917,1.077767,1.5,
+ 0,0,-1,2.202148,1.209161,1.5,
+ 0,0,-1,2.17026,1.141738,1.5,
+ 0,0,-1,1.425507,2.25634,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.351731,2.245397,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.425507,2.25634,1.5,
+ 0,0,-1,1.5,2.26,1.5,
+ 0,0,-1,1.279384,2.227275,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.209161,2.202148,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.279384,2.227275,1.5,
+ 0,0,-1,1.351731,2.245397,1.5,
+ 0,0,-1,2.202148,1.790839,1.5,
+ 0,0,-1,2.245397,1.648269,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.245397,1.648269,1.5,
+ 0,0,-1,2.202148,1.790839,1.5,
+ 0,0,-1,2.227275,1.720616,1.5,
+ 0,0,-1,2.245397,1.648269,1.5,
+ 0,0,-1,2.26,1.5,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.26,1.5,1.5,
+ 0,0,-1,2.245397,1.648269,1.5,
+ 0,0,-1,2.25634,1.574493,1.5,
+ 0,0,-1,1.790839,0.797852,1.5,
+ 0,0,-1,1.648269,0.754603,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.648269,0.754603,1.5,
+ 0,0,-1,1.790839,0.797852,1.5,
+ 0,0,-1,1.720616,0.772725,1.5,
+ 0,0,-1,1.922233,0.868083,1.5,
+ 0,0,-1,1.790839,0.797852,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.790839,0.797852,1.5,
+ 0,0,-1,1.922233,0.868083,1.5,
+ 0,0,-1,1.858262,0.82974,1.5,
+ 0,0,-1,1.922233,2.131917,1.5,
+ 0,0,-1,2.037401,2.037401,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.037401,2.037401,1.5,
+ 0,0,-1,1.922233,2.131917,1.5,
+ 0,0,-1,1.982139,2.087488,1.5,
+ 0,0,-1,2.037401,2.037401,1.5,
+ 0,0,-1,2.131917,1.922233,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.131917,1.922233,1.5,
+ 0,0,-1,2.037401,2.037401,1.5,
+ 0,0,-1,2.087488,1.982139,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.912512,1.017861,1.5,
+ 0,0,-1,0.868083,1.077767,1.5,
+ 0,0,-1,0.912512,1.017861,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.962599,0.962599,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.82974,1.141738,1.5,
+ 0,0,-1,0.797852,1.209161,1.5,
+ 0,0,-1,0.82974,1.141738,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.868083,1.077767,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.017861,0.912512,1.5,
+ 0,0,-1,0.962599,0.962599,1.5,
+ 0,0,-1,1.017861,0.912512,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.077767,0.868083,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.141738,0.82974,1.5,
+ 0,0,-1,1.077767,0.868083,1.5,
+ 0,0,-1,1.141738,0.82974,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.209161,0.797852,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.425507,0.74366,1.5,
+ 0,0,-1,1.351731,0.754603,1.5,
+ 0,0,-1,1.425507,0.74366,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.5,0.74,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.574493,0.74366,1.5,
+ 0,0,-1,1.5,0.74,1.5,
+ 0,0,-1,1.574493,0.74366,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.648269,0.754603,1.5,
+ 0,0,-1,1.574493,2.25634,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.5,2.26,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.574493,2.25634,1.5,
+ 0,0,-1,1.648269,2.245397,1.5,
+ 0,0,-1,1.648269,2.245397,1.5,
+ 0,0,-1,1.790839,2.202148,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.790839,2.202148,1.5,
+ 0,0,-1,1.648269,2.245397,1.5,
+ 0,0,-1,1.720616,2.227275,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.74366,1.425507,1.5,
+ 0,0,-1,0.74,1.5,1.5,
+ 0,0,-1,0.74366,1.425507,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.754603,1.351731,1.5,
+ 0,0,-1,0.74366,1.574493,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.74,1.5,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.74366,1.574493,1.5,
+ 0,0,-1,0.754603,1.648269,1.5,
+ 0,0,-1,0.82974,1.858262,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.797852,1.790839,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.82974,1.858262,1.5,
+ 0,0,-1,0.868083,1.922233,1.5,
+ 0,0,-1,0.772725,1.720616,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.754603,1.648269,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.772725,1.720616,1.5,
+ 0,0,-1,0.797852,1.790839,1.5,
+ 0,0,-1,1.017861,2.087488,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.962599,2.037401,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.017861,2.087488,1.5,
+ 0,0,-1,1.077767,2.131917,1.5,
+ 0,0,-1,0.912512,1.982139,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.868083,1.922233,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.912512,1.982139,1.5,
+ 0,0,-1,0.962599,2.037401,1.5,
+ 0,0,-1,1.790839,2.202148,1.5,
+ 0,0,-1,1.922233,2.131917,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.922233,2.131917,1.5,
+ 0,0,-1,1.790839,2.202148,1.5,
+ 0,0,-1,1.858262,2.17026,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.279384,0.772725,1.5,
+ 0,0,-1,1.209161,0.797852,1.5,
+ 0,0,-1,1.279384,0.772725,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.351731,0.754603,1.5,
+ 0,0,-1,2.131917,1.922233,1.5,
+ 0,0,-1,2.202148,1.790839,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.202148,1.790839,1.5,
+ 0,0,-1,2.131917,1.922233,1.5,
+ 0,0,-1,2.17026,1.858262,1.5,
+ 0,0,-1,2.037401,0.962599,1.5,
+ 0,0,-1,1.922233,0.868083,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.922233,0.868083,1.5,
+ 0,0,-1,2.037401,0.962599,1.5,
+ 0,0,-1,1.982139,0.912512,1.5,
+ 0,0,-1,1.141738,2.17026,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.077767,2.131917,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.141738,2.17026,1.5,
+ 0,0,-1,1.209161,2.202148,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.772725,1.279384,1.5,
+ 0,0,-1,0.754603,1.351731,1.5,
+ 0,0,-1,0.772725,1.279384,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.797852,1.209161,1.5
+};
+static const struct gllist lament_model_pillar_a_frame = { GL_N3F_V3F, GL_TRIANGLES, 768, lament_model_pillar_a_data, 0 };
+const struct gllist *lament_model_pillar_a = &lament_model_pillar_a_frame;
+
+static const float lament_model_pillar_b_data[] = {
+ 0.97746,0.211123,0,2.245397,1.648269,0,
+ 0.961565,0.274577,0,2.227275,1.720616,1.5,
+ 0.983848,0.179005,0,2.245397,1.648269,1.5,
+ 0.961565,0.274577,0,2.227275,1.720616,1.5,
+ 0.97746,0.211123,0,2.245397,1.648269,0,
+ 0.952059,0.305914,0,2.227275,1.720616,0,
+ -0.621651,0.783294,0,1.017861,2.087488,1.5,
+ -0.56911,0.822262,0,1.077767,2.131917,0,
+ -0.646965,0.76252,0,1.017861,2.087488,0,
+ -0.56911,0.822262,0,1.077767,2.131917,0,
+ -0.621651,0.783294,0,1.017861,2.087488,1.5,
+ -0.541882,0.840455,0,1.077767,2.131917,1.5,
+ 0.485774,0.874085,0,1.858262,2.17026,1.5,
+ 0.541882,0.840455,0,1.922233,2.131917,0,
+ 0.456893,0.889521,0,1.858262,2.17026,0,
+ 0.541882,0.840455,0,1.922233,2.131917,0,
+ 0.485774,0.874085,0,1.858262,2.17026,1.5,
+ 0.56911,0.822262,0,1.922233,2.131917,1.5,
+ 0.456893,-0.889521,0,1.858262,0.82974,1.5,
+ 0.397759,-0.91749,0,1.790839,0.797852,0,
+ 0.485774,-0.874085,0,1.858262,0.82974,0,
+ 0.397759,-0.91749,0,1.790839,0.797852,0,
+ 0.456893,-0.889521,0,1.858262,0.82974,1.5,
+ 0.367505,-0.930022,0,1.790839,0.797852,1.5,
+ -0.541882,0.840455,0,1.077767,2.131917,1.5,
+ -0.485774,0.874085,0,1.141738,2.17026,0,
+ -0.56911,0.822262,0,1.077767,2.131917,0,
+ -0.485774,0.874085,0,1.141738,2.17026,0,
+ -0.541882,0.840455,0,1.077767,2.131917,1.5,
+ -0.456893,0.889521,0,1.141738,2.17026,1.5,
+ -0.211123,-0.97746,0,1.351731,0.754603,1.5,
+ -0.274577,-0.961565,0,1.279384,0.772725,0,
+ -0.179005,-0.983848,0,1.351731,0.754603,0,
+ -0.274577,-0.961565,0,1.279384,0.772725,0,
+ -0.211123,-0.97746,0,1.351731,0.754603,1.5,
+ -0.305914,-0.952059,0,1.279384,0.772725,1.5,
+ -0.114299,-0.993446,0,1.425507,0.74366,1.5,
+ -0.179005,-0.983848,0,1.351731,0.754603,0,
+ -0.081709,-0.996656,0,1.425507,0.74366,0,
+ -0.179005,-0.983848,0,1.351731,0.754603,0,
+ -0.114299,-0.993446,0,1.425507,0.74366,1.5,
+ -0.211123,-0.97746,0,1.351731,0.754603,1.5,
+ -0.016373,-0.999866,0,1.5,0.74,1.5,
+ -0.081709,-0.996656,0,1.425507,0.74366,0,
+ 0.016373,-0.999866,0,1.5,0.74,0,
+ -0.081709,-0.996656,0,1.425507,0.74366,0,
+ -0.016373,-0.999866,0,1.5,0.74,1.5,
+ -0.114299,-0.993446,0,1.425507,0.74366,1.5,
+ 0.081709,-0.996656,0,1.574493,0.74366,1.5,
+ 0.016373,-0.999866,0,1.5,0.74,0,
+ 0.114299,-0.993446,0,1.574493,0.74366,0,
+ 0.016373,-0.999866,0,1.5,0.74,0,
+ 0.081709,-0.996656,0,1.574493,0.74366,1.5,
+ -0.016373,-0.999866,0,1.5,0.74,1.5,
+ 0.783294,-0.621651,0,2.087488,1.017861,0,
+ 0.822262,-0.56911,0,2.131917,1.077767,1.5,
+ 0.76252,-0.646965,0,2.087488,1.017861,1.5,
+ 0.822262,-0.56911,0,2.131917,1.077767,1.5,
+ 0.783294,-0.621651,0,2.087488,1.017861,0,
+ 0.840455,-0.541882,0,2.131917,1.077767,0,
+ -0.305914,-0.952059,0,1.279384,0.772725,1.5,
+ -0.367505,-0.930022,0,1.209161,0.797852,0,
+ -0.274577,-0.961565,0,1.279384,0.772725,0,
+ -0.367505,-0.930022,0,1.209161,0.797852,0,
+ -0.305914,-0.952059,0,1.279384,0.772725,1.5,
+ -0.397759,-0.91749,0,1.209161,0.797852,1.5,
+ 1,0,0,2.26,1.5,0,
+ 0.996656,0.081709,0,2.25634,1.574493,1.5,
+ 1,0,0,2.26,1.5,1.5,
+ 0.996656,0.081709,0,2.25634,1.574493,1.5,
+ 1,0,0,2.26,1.5,0,
+ 0.993446,0.114299,0,2.25634,1.574493,0,
+ -0.980785,0.19509,0,0.754603,1.648269,1.5,
+ -0.993446,0.114299,0,0.74366,1.574493,0,
+ -0.996656,0.081709,0,0.74366,1.574493,1.5,
+ -0.993446,0.114299,0,0.74366,1.574493,0,
+ -0.980785,0.19509,0,0.754603,1.648269,1.5,
+ -0.980785,0.19509,0,0.754603,1.648269,0,
+ 0.211123,0.97746,0,1.648269,2.245397,1.5,
+ 0.274577,0.961565,0,1.720616,2.227275,0,
+ 0.179005,0.983848,0,1.648269,2.245397,0,
+ 0.274577,0.961565,0,1.720616,2.227275,0,
+ 0.211123,0.97746,0,1.648269,2.245397,1.5,
+ 0.305914,0.952059,0,1.720616,2.227275,1.5,
+ 0.114299,0.993446,0,1.574493,2.25634,1.5,
+ 0.179005,0.983848,0,1.648269,2.245397,0,
+ 0.081709,0.996656,0,1.574493,2.25634,0,
+ 0.179005,0.983848,0,1.648269,2.245397,0,
+ 0.114299,0.993446,0,1.574493,2.25634,1.5,
+ 0.211123,0.97746,0,1.648269,2.245397,1.5,
+ -0.707107,0.707107,0,0.962599,2.037401,1.5,
+ -0.646965,0.76252,0,1.017861,2.087488,0,
+ -0.707107,0.707107,0,0.962599,2.037401,0,
+ -0.646965,0.76252,0,1.017861,2.087488,0,
+ -0.707107,0.707107,0,0.962599,2.037401,1.5,
+ -0.621651,0.783294,0,1.017861,2.087488,1.5,
+ -0.707107,0.707107,0,0.962599,2.037401,1.5,
+ -0.76252,0.646965,0,0.912512,1.982139,0,
+ -0.783294,0.621651,0,0.912512,1.982139,1.5,
+ -0.76252,0.646965,0,0.912512,1.982139,0,
+ -0.707107,0.707107,0,0.962599,2.037401,1.5,
+ -0.707107,0.707107,0,0.962599,2.037401,0,
+ -0.881921,0.471397,0,0.82974,1.858262,1.5,
+ -0.83147,0.55557,0,0.868083,1.922233,0,
+ -0.881921,0.471397,0,0.82974,1.858262,0,
+ -0.83147,0.55557,0,0.868083,1.922233,0,
+ -0.881921,0.471397,0,0.82974,1.858262,1.5,
+ -0.83147,0.55557,0,0.868083,1.922233,1.5,
+ -0.881921,0.471397,0,0.82974,1.858262,1.5,
+ -0.91749,0.397759,0,0.797852,1.790839,0,
+ -0.930022,0.367505,0,0.797852,1.790839,1.5,
+ -0.91749,0.397759,0,0.797852,1.790839,0,
+ -0.881921,0.471397,0,0.82974,1.858262,1.5,
+ -0.881921,0.471397,0,0.82974,1.858262,0,
+ -0.930022,0.367505,0,0.797852,1.790839,1.5,
+ -0.95694,0.290285,0,0.772725,1.720616,0,
+ -0.95694,0.290285,0,0.772725,1.720616,1.5,
+ -0.95694,0.290285,0,0.772725,1.720616,0,
+ -0.930022,0.367505,0,0.797852,1.790839,1.5,
+ -0.91749,0.397759,0,0.797852,1.790839,0,
+ 0.016373,0.999866,0,1.5,2.26,1.5,
+ 0.081709,0.996656,0,1.574493,2.25634,0,
+ -0.016373,0.999866,0,1.5,2.26,0,
+ 0.081709,0.996656,0,1.574493,2.25634,0,
+ 0.016373,0.999866,0,1.5,2.26,1.5,
+ 0.114299,0.993446,0,1.574493,2.25634,1.5,
+ -0.081709,0.996656,0,1.425507,2.25634,1.5,
+ -0.016373,0.999866,0,1.5,2.26,0,
+ -0.114299,0.993446,0,1.425507,2.25634,0,
+ -0.016373,0.999866,0,1.5,2.26,0,
+ -0.081709,0.996656,0,1.425507,2.25634,1.5,
+ 0.016373,0.999866,0,1.5,2.26,1.5,
+ -0.179005,0.983848,0,1.351731,2.245397,1.5,
+ -0.114299,0.993446,0,1.425507,2.25634,0,
+ -0.211123,0.97746,0,1.351731,2.245397,0,
+ -0.114299,0.993446,0,1.425507,2.25634,0,
+ -0.179005,0.983848,0,1.351731,2.245397,1.5,
+ -0.081709,0.996656,0,1.425507,2.25634,1.5,
+ -0.274577,0.961565,0,1.279384,2.227275,1.5,
+ -0.211123,0.97746,0,1.351731,2.245397,0,
+ -0.305914,0.952059,0,1.279384,2.227275,0,
+ -0.211123,0.97746,0,1.351731,2.245397,0,
+ -0.274577,0.961565,0,1.279384,2.227275,1.5,
+ -0.179005,0.983848,0,1.351731,2.245397,1.5,
+ -0.367505,0.930022,0,1.209161,2.202148,1.5,
+ -0.305914,0.952059,0,1.279384,2.227275,0,
+ -0.397759,0.91749,0,1.209161,2.202148,0,
+ -0.305914,0.952059,0,1.279384,2.227275,0,
+ -0.367505,0.930022,0,1.209161,2.202148,1.5,
+ -0.274577,0.961565,0,1.279384,2.227275,1.5,
+ 0.874085,0.485774,0,2.17026,1.858262,0,
+ 0.83147,0.55557,0,2.131917,1.922233,1.5,
+ 0.889521,0.456893,0,2.17026,1.858262,1.5,
+ 0.83147,0.55557,0,2.131917,1.922233,1.5,
+ 0.874085,0.485774,0,2.17026,1.858262,0,
+ 0.83147,0.55557,0,2.131917,1.922233,0,
+ -0.783294,0.621651,0,0.912512,1.982139,1.5,
+ -0.83147,0.55557,0,0.868083,1.922233,0,
+ -0.83147,0.55557,0,0.868083,1.922233,1.5,
+ -0.83147,0.55557,0,0.868083,1.922233,0,
+ -0.783294,0.621651,0,0.912512,1.982139,1.5,
+ -0.76252,0.646965,0,0.912512,1.982139,0,
+ 0.541882,-0.840455,0,1.922233,0.868083,1.5,
+ 0.485774,-0.874085,0,1.858262,0.82974,0,
+ 0.56911,-0.822262,0,1.922233,0.868083,0,
+ 0.485774,-0.874085,0,1.858262,0.82974,0,
+ 0.541882,-0.840455,0,1.922233,0.868083,1.5,
+ 0.456893,-0.889521,0,1.858262,0.82974,1.5,
+ 0.621651,-0.783294,0,1.982139,0.912512,1.5,
+ 0.56911,-0.822262,0,1.922233,0.868083,0,
+ 0.646965,-0.76252,0,1.982139,0.912512,0,
+ 0.56911,-0.822262,0,1.922233,0.868083,0,
+ 0.621651,-0.783294,0,1.982139,0.912512,1.5,
+ 0.541882,-0.840455,0,1.922233,0.868083,1.5,
+ 0.695434,-0.71859,0,2.037401,0.962599,1.5,
+ 0.646965,-0.76252,0,1.982139,0.912512,0,
+ 0.71859,-0.695434,0,2.037401,0.962599,0,
+ 0.646965,-0.76252,0,1.982139,0.912512,0,
+ 0.695434,-0.71859,0,2.037401,0.962599,1.5,
+ 0.621651,-0.783294,0,1.982139,0.912512,1.5,
+ -0.646965,-0.76252,0,1.017861,0.912512,1.5,
+ -0.695434,-0.71859,0,0.962599,0.962599,0,
+ -0.621651,-0.783294,0,1.017861,0.912512,0,
+ -0.695434,-0.71859,0,0.962599,0.962599,0,
+ -0.646965,-0.76252,0,1.017861,0.912512,1.5,
+ -0.71859,-0.695434,0,0.962599,0.962599,1.5,
+ 0.397759,0.91749,0,1.790839,2.202148,1.5,
+ 0.456893,0.889521,0,1.858262,2.17026,0,
+ 0.367505,0.930022,0,1.790839,2.202148,0,
+ 0.456893,0.889521,0,1.858262,2.17026,0,
+ 0.397759,0.91749,0,1.790839,2.202148,1.5,
+ 0.485774,0.874085,0,1.858262,2.17026,1.5,
+ 0.783294,0.621651,0,2.087488,1.982139,0,
+ 0.83147,0.55557,0,2.131917,1.922233,1.5,
+ 0.83147,0.55557,0,2.131917,1.922233,0,
+ 0.83147,0.55557,0,2.131917,1.922233,1.5,
+ 0.783294,0.621651,0,2.087488,1.982139,0,
+ 0.76252,0.646965,0,2.087488,1.982139,1.5,
+ 0.993446,0.114299,0,2.25634,1.574493,0,
+ 0.983848,0.179005,0,2.245397,1.648269,1.5,
+ 0.996656,0.081709,0,2.25634,1.574493,1.5,
+ 0.983848,0.179005,0,2.245397,1.648269,1.5,
+ 0.993446,0.114299,0,2.25634,1.574493,0,
+ 0.97746,0.211123,0,2.245397,1.648269,0,
+ 0.56911,0.822262,0,1.922233,2.131917,1.5,
+ 0.621651,0.783294,0,1.982139,2.087488,0,
+ 0.541882,0.840455,0,1.922233,2.131917,0,
+ 0.621651,0.783294,0,1.982139,2.087488,0,
+ 0.56911,0.822262,0,1.922233,2.131917,1.5,
+ 0.646965,0.76252,0,1.982139,2.087488,1.5,
+ 0.646965,0.76252,0,1.982139,2.087488,1.5,
+ 0.707107,0.707107,0,2.037401,2.037401,0,
+ 0.621651,0.783294,0,1.982139,2.087488,0,
+ 0.707107,0.707107,0,2.037401,2.037401,0,
+ 0.646965,0.76252,0,1.982139,2.087488,1.5,
+ 0.707107,0.707107,0,2.037401,2.037401,1.5,
+ 0.305914,0.952059,0,1.720616,2.227275,1.5,
+ 0.367505,0.930022,0,1.790839,2.202148,0,
+ 0.274577,0.961565,0,1.720616,2.227275,0,
+ 0.367505,0.930022,0,1.790839,2.202148,0,
+ 0.305914,0.952059,0,1.720616,2.227275,1.5,
+ 0.397759,0.91749,0,1.790839,2.202148,1.5,
+ 0.91749,0.397759,0,2.202148,1.790839,0,
+ 0.889521,0.456893,0,2.17026,1.858262,1.5,
+ 0.930022,0.367505,0,2.202148,1.790839,1.5,
+ 0.889521,0.456893,0,2.17026,1.858262,1.5,
+ 0.91749,0.397759,0,2.202148,1.790839,0,
+ 0.874085,0.485774,0,2.17026,1.858262,0,
+ -0.485774,-0.874085,0,1.141738,0.82974,1.5,
+ -0.541882,-0.840455,0,1.077767,0.868083,0,
+ -0.456893,-0.889521,0,1.141738,0.82974,0,
+ -0.541882,-0.840455,0,1.077767,0.868083,0,
+ -0.485774,-0.874085,0,1.141738,0.82974,1.5,
+ -0.56911,-0.822262,0,1.077767,0.868083,1.5,
+ 0.367505,-0.930022,0,1.790839,0.797852,1.5,
+ 0.305914,-0.952059,0,1.720616,0.772725,0,
+ 0.397759,-0.91749,0,1.790839,0.797852,0,
+ 0.305914,-0.952059,0,1.720616,0.772725,0,
+ 0.367505,-0.930022,0,1.790839,0.797852,1.5,
+ 0.274577,-0.961565,0,1.720616,0.772725,1.5,
+ -0.996656,0.081709,0,0.74366,1.574493,1.5,
+ -0.999866,0.016373,0,0.74,1.5,0,
+ -0.999866,-0.016373,0,0.74,1.5,1.5,
+ -0.999866,0.016373,0,0.74,1.5,0,
+ -0.996656,0.081709,0,0.74366,1.574493,1.5,
+ -0.993446,0.114299,0,0.74366,1.574493,0,
+ -0.980785,0.19509,0,0.754603,1.648269,1.5,
+ -0.95694,0.290285,0,0.772725,1.720616,0,
+ -0.980785,0.19509,0,0.754603,1.648269,0,
+ -0.95694,0.290285,0,0.772725,1.720616,0,
+ -0.980785,0.19509,0,0.754603,1.648269,1.5,
+ -0.95694,0.290285,0,0.772725,1.720616,1.5,
+ 0.707107,0.707107,0,2.037401,2.037401,0,
+ 0.76252,0.646965,0,2.087488,1.982139,1.5,
+ 0.783294,0.621651,0,2.087488,1.982139,0,
+ 0.76252,0.646965,0,2.087488,1.982139,1.5,
+ 0.707107,0.707107,0,2.037401,2.037401,0,
+ 0.707107,0.707107,0,2.037401,2.037401,1.5,
+ 0.274577,-0.961565,0,1.720616,0.772725,1.5,
+ 0.211123,-0.97746,0,1.648269,0.754603,0,
+ 0.305914,-0.952059,0,1.720616,0.772725,0,
+ 0.211123,-0.97746,0,1.648269,0.754603,0,
+ 0.274577,-0.961565,0,1.720616,0.772725,1.5,
+ 0.179005,-0.983848,0,1.648269,0.754603,1.5,
+ -0.71859,-0.695434,0,0.962599,0.962599,1.5,
+ -0.77301,-0.634393,0,0.912512,1.017861,0,
+ -0.695434,-0.71859,0,0.962599,0.962599,0,
+ -0.77301,-0.634393,0,0.912512,1.017861,0,
+ -0.71859,-0.695434,0,0.962599,0.962599,1.5,
+ -0.77301,-0.634393,0,0.912512,1.017861,1.5,
+ -0.91749,-0.397759,0,0.797852,1.209161,1.5,
+ -0.889521,-0.456893,0,0.82974,1.141738,0,
+ -0.874085,-0.485774,0,0.82974,1.141738,1.5,
+ -0.889521,-0.456893,0,0.82974,1.141738,0,
+ -0.91749,-0.397759,0,0.797852,1.209161,1.5,
+ -0.930022,-0.367505,0,0.797852,1.209161,0,
+ 0.840455,-0.541882,0,2.131917,1.077767,0,
+ 0.881921,-0.471397,0,2.17026,1.141738,1.5,
+ 0.822262,-0.56911,0,2.131917,1.077767,1.5,
+ 0.881921,-0.471397,0,2.17026,1.141738,1.5,
+ 0.840455,-0.541882,0,2.131917,1.077767,0,
+ 0.881921,-0.471397,0,2.17026,1.141738,0,
+ 0.91749,-0.397759,0,2.202148,1.209161,0,
+ 0.881921,-0.471397,0,2.17026,1.141738,1.5,
+ 0.881921,-0.471397,0,2.17026,1.141738,0,
+ 0.881921,-0.471397,0,2.17026,1.141738,1.5,
+ 0.91749,-0.397759,0,2.202148,1.209161,0,
+ 0.930022,-0.367505,0,2.202148,1.209161,1.5,
+ -0.874085,-0.485774,0,0.82974,1.141738,1.5,
+ -0.840455,-0.541882,0,0.868083,1.077767,0,
+ -0.822262,-0.56911,0,0.868083,1.077767,1.5,
+ -0.840455,-0.541882,0,0.868083,1.077767,0,
+ -0.874085,-0.485774,0,0.82974,1.141738,1.5,
+ -0.889521,-0.456893,0,0.82974,1.141738,0,
+ 0.95694,-0.290285,0,2.227275,1.279384,0,
+ 0.980785,-0.19509,0,2.245397,1.351731,1.5,
+ 0.95694,-0.290285,0,2.227275,1.279384,1.5,
+ 0.980785,-0.19509,0,2.245397,1.351731,1.5,
+ 0.95694,-0.290285,0,2.227275,1.279384,0,
+ 0.980785,-0.19509,0,2.245397,1.351731,0,
+ 0.95694,-0.290285,0,2.227275,1.279384,0,
+ 0.930022,-0.367505,0,2.202148,1.209161,1.5,
+ 0.91749,-0.397759,0,2.202148,1.209161,0,
+ 0.930022,-0.367505,0,2.202148,1.209161,1.5,
+ 0.95694,-0.290285,0,2.227275,1.279384,0,
+ 0.95694,-0.290285,0,2.227275,1.279384,1.5,
+ 1,0,0,2.26,1.5,0,
+ 0.996656,-0.081709,0,2.25634,1.425507,1.5,
+ 0.993446,-0.114299,0,2.25634,1.425507,0,
+ 0.996656,-0.081709,0,2.25634,1.425507,1.5,
+ 1,0,0,2.26,1.5,0,
+ 1,0,0,2.26,1.5,1.5,
+ 0.179005,-0.983848,0,1.648269,0.754603,1.5,
+ 0.114299,-0.993446,0,1.574493,0.74366,0,
+ 0.211123,-0.97746,0,1.648269,0.754603,0,
+ 0.114299,-0.993446,0,1.574493,0.74366,0,
+ 0.179005,-0.983848,0,1.648269,0.754603,1.5,
+ 0.081709,-0.996656,0,1.574493,0.74366,1.5,
+ -0.822262,-0.56911,0,0.868083,1.077767,1.5,
+ -0.77301,-0.634393,0,0.912512,1.017861,0,
+ -0.77301,-0.634393,0,0.912512,1.017861,1.5,
+ -0.77301,-0.634393,0,0.912512,1.017861,0,
+ -0.822262,-0.56911,0,0.868083,1.077767,1.5,
+ -0.840455,-0.541882,0,0.868083,1.077767,0,
+ -0.56911,-0.822262,0,1.077767,0.868083,1.5,
+ -0.621651,-0.783294,0,1.017861,0.912512,0,
+ -0.541882,-0.840455,0,1.077767,0.868083,0,
+ -0.621651,-0.783294,0,1.017861,0.912512,0,
+ -0.56911,-0.822262,0,1.077767,0.868083,1.5,
+ -0.646965,-0.76252,0,1.017861,0.912512,1.5,
+ -0.999866,-0.016373,0,0.74,1.5,1.5,
+ -0.996656,-0.081709,0,0.74366,1.425507,0,
+ -0.993446,-0.114299,0,0.74366,1.425507,1.5,
+ -0.996656,-0.081709,0,0.74366,1.425507,0,
+ -0.999866,-0.016373,0,0.74,1.5,1.5,
+ -0.999866,0.016373,0,0.74,1.5,0,
+ -0.993446,-0.114299,0,0.74366,1.425507,1.5,
+ -0.983848,-0.179005,0,0.754603,1.351731,0,
+ -0.97746,-0.211123,0,0.754603,1.351731,1.5,
+ -0.983848,-0.179005,0,0.754603,1.351731,0,
+ -0.993446,-0.114299,0,0.74366,1.425507,1.5,
+ -0.996656,-0.081709,0,0.74366,1.425507,0,
+ -0.97746,-0.211123,0,0.754603,1.351731,1.5,
+ -0.961565,-0.274577,0,0.772725,1.279384,0,
+ -0.952059,-0.305914,0,0.772725,1.279384,1.5,
+ -0.961565,-0.274577,0,0.772725,1.279384,0,
+ -0.97746,-0.211123,0,0.754603,1.351731,1.5,
+ -0.983848,-0.179005,0,0.754603,1.351731,0,
+ -0.952059,-0.305914,0,0.772725,1.279384,1.5,
+ -0.930022,-0.367505,0,0.797852,1.209161,0,
+ -0.91749,-0.397759,0,0.797852,1.209161,1.5,
+ -0.930022,-0.367505,0,0.797852,1.209161,0,
+ -0.952059,-0.305914,0,0.772725,1.279384,1.5,
+ -0.961565,-0.274577,0,0.772725,1.279384,0,
+ -0.456893,0.889521,0,1.141738,2.17026,1.5,
+ -0.397759,0.91749,0,1.209161,2.202148,0,
+ -0.485774,0.874085,0,1.141738,2.17026,0,
+ -0.397759,0.91749,0,1.209161,2.202148,0,
+ -0.456893,0.889521,0,1.141738,2.17026,1.5,
+ -0.367505,0.930022,0,1.209161,2.202148,1.5,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.74,0,
+ 0.993446,-0.114299,0,2.25634,1.425507,0,
+ 0.980785,-0.19509,0,2.245397,1.351731,1.5,
+ 0.980785,-0.19509,0,2.245397,1.351731,0,
+ 0.980785,-0.19509,0,2.245397,1.351731,1.5,
+ 0.993446,-0.114299,0,2.25634,1.425507,0,
+ 0.996656,-0.081709,0,2.25634,1.425507,1.5,
+ 0.71859,-0.695434,0,2.037401,0.962599,0,
+ 0.76252,-0.646965,0,2.087488,1.017861,1.5,
+ 0.695434,-0.71859,0,2.037401,0.962599,1.5,
+ 0.76252,-0.646965,0,2.087488,1.017861,1.5,
+ 0.71859,-0.695434,0,2.037401,0.962599,0,
+ 0.783294,-0.621651,0,2.087488,1.017861,0,
+ 0.952059,0.305914,0,2.227275,1.720616,0,
+ 0.930022,0.367505,0,2.202148,1.790839,1.5,
+ 0.961565,0.274577,0,2.227275,1.720616,1.5,
+ 0.930022,0.367505,0,2.202148,1.790839,1.5,
+ 0.952059,0.305914,0,2.227275,1.720616,0,
+ 0.91749,0.397759,0,2.202148,1.790839,0,
+ -0.397759,-0.91749,0,1.209161,0.797852,1.5,
+ -0.456893,-0.889521,0,1.141738,0.82974,0,
+ -0.367505,-0.930022,0,1.209161,0.797852,0,
+ -0.456893,-0.889521,0,1.141738,0.82974,0,
+ -0.397759,-0.91749,0,1.209161,0.797852,1.5,
+ -0.485774,-0.874085,0,1.141738,0.82974,1.5,
+ 0,0,1,2.245397,1.648269,1.5,
+ 0,0,1,2.202148,1.790839,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.202148,1.790839,1.5,
+ 0,0,1,2.245397,1.648269,1.5,
+ 0,0,1,2.227275,1.720616,1.5,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,1,2.202148,1.790839,1.5,
+ 0,0,1,2.131917,1.922233,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.131917,1.922233,1.5,
+ 0,0,1,2.202148,1.790839,1.5,
+ 0,0,1,2.17026,1.858262,1.5,
+ 0,0,1,1.922233,2.131917,1.5,
+ 0,0,1,1.790839,2.202148,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.790839,2.202148,1.5,
+ 0,0,1,1.922233,2.131917,1.5,
+ 0,0,1,1.858262,2.17026,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.912512,1.982139,1.5,
+ 0,0,1,0.868083,1.922233,1.5,
+ 0,0,1,0.912512,1.982139,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.962599,2.037401,1.5,
+ 0,0,1,1.790839,2.202148,1.5,
+ 0,0,1,1.648269,2.245397,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.648269,2.245397,1.5,
+ 0,0,1,1.790839,2.202148,1.5,
+ 0,0,1,1.720616,2.227275,1.5,
+ 0,0,1,2.131917,1.922233,1.5,
+ 0,0,1,2.037401,2.037401,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.037401,2.037401,1.5,
+ 0,0,1,2.131917,1.922233,1.5,
+ 0,0,1,2.087488,1.982139,1.5,
+ 0,0,1,1.648269,2.245397,1.5,
+ 0,0,1,1.5,2.26,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.5,2.26,1.5,
+ 0,0,1,1.648269,2.245397,1.5,
+ 0,0,1,1.574493,2.25634,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.017861,2.087488,1.5,
+ 0,0,1,0.962599,2.037401,1.5,
+ 0,0,1,1.017861,2.087488,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.077767,2.131917,1.5,
+ 0,0,1,1.017861,0.912512,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.962599,0.962599,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.017861,0.912512,1.5,
+ 0,0,1,1.077767,0.868083,1.5,
+ 0,0,1,0.82974,1.141738,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.797852,1.209161,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.82974,1.141738,1.5,
+ 0,0,1,0.868083,1.077767,1.5,
+ 0,0,1,1.922233,0.868083,1.5,
+ 0,0,1,2.037401,0.962599,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.037401,0.962599,1.5,
+ 0,0,1,1.922233,0.868083,1.5,
+ 0,0,1,1.982139,0.912512,1.5,
+ 0,0,1,0.912512,1.017861,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.868083,1.077767,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.912512,1.017861,1.5,
+ 0,0,1,0.962599,0.962599,1.5,
+ 0,0,1,1.279384,0.772725,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.209161,0.797852,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.279384,0.772725,1.5,
+ 0,0,1,1.351731,0.754603,1.5,
+ 0,0,1,1.790839,0.797852,1.5,
+ 0,0,1,1.922233,0.868083,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.922233,0.868083,1.5,
+ 0,0,1,1.790839,0.797852,1.5,
+ 0,0,1,1.858262,0.82974,1.5,
+ 0,0,1,2.131917,1.077767,1.5,
+ 0,0,1,2.202148,1.209161,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.202148,1.209161,1.5,
+ 0,0,1,2.131917,1.077767,1.5,
+ 0,0,1,2.17026,1.141738,1.5,
+ 0,0,1,1.141738,0.82974,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.077767,0.868083,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.141738,0.82974,1.5,
+ 0,0,1,1.209161,0.797852,1.5,
+ 0,0,1,1.648269,0.754603,1.5,
+ 0,0,1,1.790839,0.797852,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.790839,0.797852,1.5,
+ 0,0,1,1.648269,0.754603,1.5,
+ 0,0,1,1.720616,0.772725,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.772725,1.720616,1.5,
+ 0,0,1,0.754603,1.648269,1.5,
+ 0,0,1,0.772725,1.720616,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.797852,1.790839,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.141738,2.17026,1.5,
+ 0,0,1,1.077767,2.131917,1.5,
+ 0,0,1,1.141738,2.17026,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.209161,2.202148,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.74366,1.574493,1.5,
+ 0,0,1,0.74,1.5,1.5,
+ 0,0,1,0.74366,1.574493,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.754603,1.648269,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.82974,1.858262,1.5,
+ 0,0,1,0.797852,1.790839,1.5,
+ 0,0,1,0.82974,1.858262,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.868083,1.922233,1.5,
+ 0,0,1,0.74366,1.425507,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.74,1.5,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.74366,1.425507,1.5,
+ 0,0,1,0.754603,1.351731,1.5,
+ 0,0,1,0.772725,1.279384,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.754603,1.351731,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.772725,1.279384,1.5,
+ 0,0,1,0.797852,1.209161,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.425507,2.25634,1.5,
+ 0,0,1,1.351731,2.245397,1.5,
+ 0,0,1,1.425507,2.25634,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.5,2.26,1.5,
+ 0,0,1,2.037401,2.037401,1.5,
+ 0,0,1,1.922233,2.131917,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.922233,2.131917,1.5,
+ 0,0,1,2.037401,2.037401,1.5,
+ 0,0,1,1.982139,2.087488,1.5,
+ 0,0,1,2.037401,0.962599,1.5,
+ 0,0,1,2.131917,1.077767,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.131917,1.077767,1.5,
+ 0,0,1,2.037401,0.962599,1.5,
+ 0,0,1,2.087488,1.017861,1.5,
+ 0,0,1,2.26,1.5,1.5,
+ 0,0,1,2.245397,1.648269,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.245397,1.648269,1.5,
+ 0,0,1,2.26,1.5,1.5,
+ 0,0,1,2.25634,1.574493,1.5,
+ 0,0,1,1.425507,0.74366,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.351731,0.754603,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.425507,0.74366,1.5,
+ 0,0,1,1.5,0.74,1.5,
+ 0,0,1,1.5,0.74,1.5,
+ 0,0,1,1.648269,0.754603,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.648269,0.754603,1.5,
+ 0,0,1,1.5,0.74,1.5,
+ 0,0,1,1.574493,0.74366,1.5,
+ 0,0,1,2.202148,1.209161,1.5,
+ 0,0,1,2.245397,1.351731,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.245397,1.351731,1.5,
+ 0,0,1,2.202148,1.209161,1.5,
+ 0,0,1,2.227275,1.279384,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.279384,2.227275,1.5,
+ 0,0,1,1.209161,2.202148,1.5,
+ 0,0,1,1.279384,2.227275,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.351731,2.245397,1.5,
+ 0,0,1,2.245397,1.351731,1.5,
+ 0,0,1,2.26,1.5,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.26,1.5,1.5,
+ 0,0,1,2.245397,1.351731,1.5,
+ 0,0,1,2.25634,1.425507,1.5
+};
+static const struct gllist lament_model_pillar_b_frame = { GL_N3F_V3F, GL_TRIANGLES, 768, lament_model_pillar_b_data, 0 };
+const struct gllist *lament_model_pillar_b = &lament_model_pillar_b_frame;
+
+static const float lament_model_pillar_base_data[] = {
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.74366,1.574493,3,
+ 0,0,1,0.754603,1.648269,3,
+ -1,0,0,0,3,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,3,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0.621651,0.783294,0,1.017861,0.912512,3,
+ 0.56911,0.822262,0,1.077767,0.868083,0,
+ 0.646965,0.76252,0,1.017861,0.912512,0,
+ 0.56911,0.822262,0,1.077767,0.868083,0,
+ 0.621651,0.783294,0,1.017861,0.912512,3,
+ 0.541882,0.840455,0,1.077767,0.868083,3,
+ -0.456893,-0.889521,0,1.858262,2.17026,3,
+ -0.397759,-0.91749,0,1.790839,2.202148,0,
+ -0.485774,-0.874085,0,1.858262,2.17026,0,
+ -0.397759,-0.91749,0,1.790839,2.202148,0,
+ -0.456893,-0.889521,0,1.858262,2.17026,3,
+ -0.367505,-0.930022,0,1.790839,2.202148,3,
+ 0.993446,0.114299,0,0.74366,1.425507,0,
+ 0.983848,0.179005,0,0.754603,1.351731,3,
+ 0.97746,0.211123,0,0.754603,1.351731,0,
+ 0.983848,0.179005,0,0.754603,1.351731,3,
+ 0.993446,0.114299,0,0.74366,1.425507,0,
+ 0.996656,0.081709,0,0.74366,1.425507,3,
+ 0.97746,0.211123,0,0.754603,1.351731,0,
+ 0.961565,0.274577,0,0.772725,1.279384,3,
+ 0.952059,0.305914,0,0.772725,1.279384,0,
+ 0.961565,0.274577,0,0.772725,1.279384,3,
+ 0.97746,0.211123,0,0.754603,1.351731,0,
+ 0.983848,0.179005,0,0.754603,1.351731,3,
+ 0.952059,0.305914,0,0.772725,1.279384,0,
+ 0.930022,0.367505,0,0.797852,1.209161,3,
+ 0.91749,0.397759,0,0.797852,1.209161,0,
+ 0.930022,0.367505,0,0.797852,1.209161,3,
+ 0.952059,0.305914,0,0.772725,1.279384,0,
+ 0.961565,0.274577,0,0.772725,1.279384,3,
+ 0.91749,0.397759,0,0.797852,1.209161,0,
+ 0.889521,0.456893,0,0.82974,1.141738,3,
+ 0.874085,0.485774,0,0.82974,1.141738,0,
+ 0.889521,0.456893,0,0.82974,1.141738,3,
+ 0.91749,0.397759,0,0.797852,1.209161,0,
+ 0.930022,0.367505,0,0.797852,1.209161,3,
+ -0.874085,0.485774,0,2.17026,1.141738,3,
+ -0.840455,0.541882,0,2.131917,1.077767,0,
+ -0.822262,0.56911,0,2.131917,1.077767,3,
+ -0.840455,0.541882,0,2.131917,1.077767,0,
+ -0.874085,0.485774,0,2.17026,1.141738,3,
+ -0.889521,0.456893,0,2.17026,1.141738,0,
+ -0.91749,0.397759,0,2.202148,1.209161,3,
+ -0.889521,0.456893,0,2.17026,1.141738,0,
+ -0.874085,0.485774,0,2.17026,1.141738,3,
+ -0.889521,0.456893,0,2.17026,1.141738,0,
+ -0.91749,0.397759,0,2.202148,1.209161,3,
+ -0.930022,0.367505,0,2.202148,1.209161,0,
+ 0.874085,0.485774,0,0.82974,1.141738,0,
+ 0.840455,0.541882,0,0.868083,1.077767,3,
+ 0.822262,0.56911,0,0.868083,1.077767,0,
+ 0.840455,0.541882,0,0.868083,1.077767,3,
+ 0.874085,0.485774,0,0.82974,1.141738,0,
+ 0.889521,0.456893,0,0.82974,1.141738,3,
+ 0.999866,0.016373,0,0.74,1.5,0,
+ 0.996656,0.081709,0,0.74366,1.425507,3,
+ 0.993446,0.114299,0,0.74366,1.425507,0,
+ 0.996656,0.081709,0,0.74366,1.425507,3,
+ 0.999866,0.016373,0,0.74,1.5,0,
+ 0.999866,-0.016373,0,0.74,1.5,3,
+ 0.456893,0.889521,0,1.141738,0.82974,3,
+ 0.397759,0.91749,0,1.209161,0.797852,0,
+ 0.485774,0.874085,0,1.141738,0.82974,0,
+ 0.397759,0.91749,0,1.209161,0.797852,0,
+ 0.456893,0.889521,0,1.141738,0.82974,3,
+ 0.367505,0.930022,0,1.209161,0.797852,3,
+ 0.996656,-0.081709,0,0.74366,1.574493,0,
+ 0.999866,-0.016373,0,0.74,1.5,3,
+ 0.999866,0.016373,0,0.74,1.5,0,
+ 0.999866,-0.016373,0,0.74,1.5,3,
+ 0.996656,-0.081709,0,0.74366,1.574493,0,
+ 0.993446,-0.114299,0,0.74366,1.574493,3,
+ 0.983848,-0.179005,0,0.754603,1.648269,0,
+ 0.993446,-0.114299,0,0.74366,1.574493,3,
+ 0.996656,-0.081709,0,0.74366,1.574493,0,
+ 0.993446,-0.114299,0,0.74366,1.574493,3,
+ 0.983848,-0.179005,0,0.754603,1.648269,0,
+ 0.97746,-0.211123,0,0.754603,1.648269,3,
+ 0.961565,-0.274577,0,0.772725,1.720616,0,
+ 0.97746,-0.211123,0,0.754603,1.648269,3,
+ 0.983848,-0.179005,0,0.754603,1.648269,0,
+ 0.97746,-0.211123,0,0.754603,1.648269,3,
+ 0.961565,-0.274577,0,0.772725,1.720616,0,
+ 0.952059,-0.305914,0,0.772725,1.720616,3,
+ 0.930022,-0.367505,0,0.797852,1.790839,0,
+ 0.952059,-0.305914,0,0.772725,1.720616,3,
+ 0.961565,-0.274577,0,0.772725,1.720616,0,
+ 0.952059,-0.305914,0,0.772725,1.720616,3,
+ 0.930022,-0.367505,0,0.797852,1.790839,0,
+ 0.91749,-0.397759,0,0.797852,1.790839,3,
+ 0.889521,-0.456893,0,0.82974,1.858262,0,
+ 0.91749,-0.397759,0,0.797852,1.790839,3,
+ 0.930022,-0.367505,0,0.797852,1.790839,0,
+ 0.91749,-0.397759,0,0.797852,1.790839,3,
+ 0.889521,-0.456893,0,0.82974,1.858262,0,
+ 0.874085,-0.485774,0,0.82974,1.858262,3,
+ 0.840455,-0.541882,0,0.868083,1.922233,0,
+ 0.874085,-0.485774,0,0.82974,1.858262,3,
+ 0.889521,-0.456893,0,0.82974,1.858262,0,
+ 0.874085,-0.485774,0,0.82974,1.858262,3,
+ 0.840455,-0.541882,0,0.868083,1.922233,0,
+ 0.822262,-0.56911,0,0.868083,1.922233,3,
+ 0.783294,-0.621651,0,0.912512,1.982139,0,
+ 0.822262,-0.56911,0,0.868083,1.922233,3,
+ 0.840455,-0.541882,0,0.868083,1.922233,0,
+ 0.822262,-0.56911,0,0.868083,1.922233,3,
+ 0.783294,-0.621651,0,0.912512,1.982139,0,
+ 0.76252,-0.646965,0,0.912512,1.982139,3,
+ 0.707107,-0.707107,0,0.962599,2.037401,0,
+ 0.76252,-0.646965,0,0.912512,1.982139,3,
+ 0.783294,-0.621651,0,0.912512,1.982139,0,
+ 0.76252,-0.646965,0,0.912512,1.982139,3,
+ 0.707107,-0.707107,0,0.962599,2.037401,0,
+ 0.707107,-0.707107,0,0.962599,2.037401,3,
+ 0.016373,-0.999866,0,1.5,2.26,3,
+ 0.081709,-0.996656,0,1.425507,2.25634,0,
+ -0.016373,-0.999866,0,1.5,2.26,0,
+ 0.081709,-0.996656,0,1.425507,2.25634,0,
+ 0.016373,-0.999866,0,1.5,2.26,3,
+ 0.114299,-0.993446,0,1.425507,2.25634,3,
+ 0.114299,-0.993446,0,1.425507,2.25634,3,
+ 0.179005,-0.983848,0,1.351731,2.245397,0,
+ 0.081709,-0.996656,0,1.425507,2.25634,0,
+ 0.179005,-0.983848,0,1.351731,2.245397,0,
+ 0.114299,-0.993446,0,1.425507,2.25634,3,
+ 0.211123,-0.97746,0,1.351731,2.245397,3,
+ 0.211123,-0.97746,0,1.351731,2.245397,3,
+ 0.274577,-0.961565,0,1.279384,2.227275,0,
+ 0.179005,-0.983848,0,1.351731,2.245397,0,
+ 0.274577,-0.961565,0,1.279384,2.227275,0,
+ 0.211123,-0.97746,0,1.351731,2.245397,3,
+ 0.305914,-0.952059,0,1.279384,2.227275,3,
+ 0.305914,-0.952059,0,1.279384,2.227275,3,
+ 0.367505,-0.930022,0,1.209161,2.202148,0,
+ 0.274577,-0.961565,0,1.279384,2.227275,0,
+ 0.367505,-0.930022,0,1.209161,2.202148,0,
+ 0.305914,-0.952059,0,1.279384,2.227275,3,
+ 0.397759,-0.91749,0,1.209161,2.202148,3,
+ 0.76252,0.646965,0,0.912512,1.017861,0,
+ 0.707107,0.707107,0,0.962599,0.962599,3,
+ 0.707107,0.707107,0,0.962599,0.962599,0,
+ 0.707107,0.707107,0,0.962599,0.962599,3,
+ 0.76252,0.646965,0,0.912512,1.017861,0,
+ 0.783294,0.621651,0,0.912512,1.017861,3,
+ 0.397759,-0.91749,0,1.209161,2.202148,3,
+ 0.456893,-0.889521,0,1.141738,2.17026,0,
+ 0.367505,-0.930022,0,1.209161,2.202148,0,
+ 0.456893,-0.889521,0,1.141738,2.17026,0,
+ 0.397759,-0.91749,0,1.209161,2.202148,3,
+ 0.485774,-0.874085,0,1.141738,2.17026,3,
+ 0.485774,-0.874085,0,1.141738,2.17026,3,
+ 0.541882,-0.840455,0,1.077767,2.131917,0,
+ 0.456893,-0.889521,0,1.141738,2.17026,0,
+ 0.541882,-0.840455,0,1.077767,2.131917,0,
+ 0.485774,-0.874085,0,1.141738,2.17026,3,
+ 0.56911,-0.822262,0,1.077767,2.131917,3,
+ 0.56911,-0.822262,0,1.077767,2.131917,3,
+ 0.621651,-0.783294,0,1.017861,2.087488,0,
+ 0.541882,-0.840455,0,1.077767,2.131917,0,
+ 0.621651,-0.783294,0,1.017861,2.087488,0,
+ 0.56911,-0.822262,0,1.077767,2.131917,3,
+ 0.646965,-0.76252,0,1.017861,2.087488,3,
+ 0.646965,-0.76252,0,1.017861,2.087488,3,
+ 0.707107,-0.707107,0,0.962599,2.037401,0,
+ 0.621651,-0.783294,0,1.017861,2.087488,0,
+ 0.707107,-0.707107,0,0.962599,2.037401,0,
+ 0.646965,-0.76252,0,1.017861,2.087488,3,
+ 0.707107,-0.707107,0,0.962599,2.037401,3,
+ -0.367505,-0.930022,0,1.790839,2.202148,3,
+ -0.305914,-0.952059,0,1.720616,2.227275,0,
+ -0.397759,-0.91749,0,1.790839,2.202148,0,
+ -0.305914,-0.952059,0,1.720616,2.227275,0,
+ -0.367505,-0.930022,0,1.790839,2.202148,3,
+ -0.274577,-0.961565,0,1.720616,2.227275,3,
+ -0.274577,-0.961565,0,1.720616,2.227275,3,
+ -0.211123,-0.97746,0,1.648269,2.245397,0,
+ -0.305914,-0.952059,0,1.720616,2.227275,0,
+ -0.211123,-0.97746,0,1.648269,2.245397,0,
+ -0.274577,-0.961565,0,1.720616,2.227275,3,
+ -0.179005,-0.983848,0,1.648269,2.245397,3,
+ -0.179005,-0.983848,0,1.648269,2.245397,3,
+ -0.114299,-0.993446,0,1.574493,2.25634,0,
+ -0.211123,-0.97746,0,1.648269,2.245397,0,
+ -0.114299,-0.993446,0,1.574493,2.25634,0,
+ -0.179005,-0.983848,0,1.648269,2.245397,3,
+ -0.081709,-0.996656,0,1.574493,2.25634,3,
+ -0.081709,-0.996656,0,1.574493,2.25634,3,
+ -0.016373,-0.999866,0,1.5,2.26,0,
+ -0.114299,-0.993446,0,1.574493,2.25634,0,
+ -0.016373,-0.999866,0,1.5,2.26,0,
+ -0.081709,-0.996656,0,1.574493,2.25634,3,
+ 0.016373,-0.999866,0,1.5,2.26,3,
+ -0.621651,-0.783294,0,1.982139,2.087488,3,
+ -0.56911,-0.822262,0,1.922233,2.131917,0,
+ -0.646965,-0.76252,0,1.982139,2.087488,0,
+ -0.56911,-0.822262,0,1.922233,2.131917,0,
+ -0.621651,-0.783294,0,1.982139,2.087488,3,
+ -0.541882,-0.840455,0,1.922233,2.131917,3,
+ -0.541882,-0.840455,0,1.922233,2.131917,3,
+ -0.485774,-0.874085,0,1.858262,2.17026,0,
+ -0.56911,-0.822262,0,1.922233,2.131917,0,
+ -0.485774,-0.874085,0,1.858262,2.17026,0,
+ -0.541882,-0.840455,0,1.922233,2.131917,3,
+ -0.456893,-0.889521,0,1.858262,2.17026,3,
+ -0.707107,-0.707107,0,2.037401,2.037401,3,
+ -0.646965,-0.76252,0,1.982139,2.087488,0,
+ -0.707107,-0.707107,0,2.037401,2.037401,0,
+ -0.646965,-0.76252,0,1.982139,2.087488,0,
+ -0.707107,-0.707107,0,2.037401,2.037401,3,
+ -0.621651,-0.783294,0,1.982139,2.087488,3,
+ -0.707107,-0.707107,0,2.037401,2.037401,3,
+ -0.76252,-0.646965,0,2.087488,1.982139,0,
+ -0.783294,-0.621651,0,2.087488,1.982139,3,
+ -0.76252,-0.646965,0,2.087488,1.982139,0,
+ -0.707107,-0.707107,0,2.037401,2.037401,3,
+ -0.707107,-0.707107,0,2.037401,2.037401,0,
+ -0.930022,-0.367505,0,2.202148,1.790839,3,
+ -0.952059,-0.305914,0,2.227275,1.720616,0,
+ -0.961565,-0.274577,0,2.227275,1.720616,3,
+ -0.952059,-0.305914,0,2.227275,1.720616,0,
+ -0.930022,-0.367505,0,2.202148,1.790839,3,
+ -0.91749,-0.397759,0,2.202148,1.790839,0,
+ -0.889521,-0.456893,0,2.17026,1.858262,3,
+ -0.91749,-0.397759,0,2.202148,1.790839,0,
+ -0.930022,-0.367505,0,2.202148,1.790839,3,
+ -0.91749,-0.397759,0,2.202148,1.790839,0,
+ -0.889521,-0.456893,0,2.17026,1.858262,3,
+ -0.874085,-0.485774,0,2.17026,1.858262,0,
+ -0.840455,-0.541882,0,2.131917,1.922233,3,
+ -0.874085,-0.485774,0,2.17026,1.858262,0,
+ -0.889521,-0.456893,0,2.17026,1.858262,3,
+ -0.874085,-0.485774,0,2.17026,1.858262,0,
+ -0.840455,-0.541882,0,2.131917,1.922233,3,
+ -0.822262,-0.56911,0,2.131917,1.922233,0,
+ -0.783294,-0.621651,0,2.087488,1.982139,3,
+ -0.822262,-0.56911,0,2.131917,1.922233,0,
+ -0.840455,-0.541882,0,2.131917,1.922233,3,
+ -0.822262,-0.56911,0,2.131917,1.922233,0,
+ -0.783294,-0.621651,0,2.087488,1.982139,3,
+ -0.76252,-0.646965,0,2.087488,1.982139,0,
+ -0.961565,-0.274577,0,2.227275,1.720616,3,
+ -0.97746,-0.211123,0,2.245397,1.648269,0,
+ -0.983848,-0.179005,0,2.245397,1.648269,3,
+ -0.97746,-0.211123,0,2.245397,1.648269,0,
+ -0.961565,-0.274577,0,2.227275,1.720616,3,
+ -0.952059,-0.305914,0,2.227275,1.720616,0,
+ -0.211123,0.97746,0,1.648269,0.754603,3,
+ -0.274577,0.961565,0,1.720616,0.772725,0,
+ -0.179005,0.983848,0,1.648269,0.754603,0,
+ -0.274577,0.961565,0,1.720616,0.772725,0,
+ -0.211123,0.97746,0,1.648269,0.754603,3,
+ -0.305914,0.952059,0,1.720616,0.772725,3,
+ -0.114299,0.993446,0,1.574493,0.74366,3,
+ -0.179005,0.983848,0,1.648269,0.754603,0,
+ -0.081709,0.996656,0,1.574493,0.74366,0,
+ -0.179005,0.983848,0,1.648269,0.754603,0,
+ -0.114299,0.993446,0,1.574493,0.74366,3,
+ -0.211123,0.97746,0,1.648269,0.754603,3,
+ -0.993446,0.114299,0,2.25634,1.425507,3,
+ -0.983848,0.179005,0,2.245397,1.351731,0,
+ -0.97746,0.211123,0,2.245397,1.351731,3,
+ -0.983848,0.179005,0,2.245397,1.351731,0,
+ -0.993446,0.114299,0,2.25634,1.425507,3,
+ -0.996656,0.081709,0,2.25634,1.425507,0,
+ -0.999866,0.016373,0,2.26,1.5,3,
+ -0.996656,0.081709,0,2.25634,1.425507,0,
+ -0.993446,0.114299,0,2.25634,1.425507,3,
+ -0.996656,0.081709,0,2.25634,1.425507,0,
+ -0.999866,0.016373,0,2.26,1.5,3,
+ -0.999866,-0.016373,0,2.26,1.5,0,
+ -0.996656,-0.081709,0,2.25634,1.574493,3,
+ -0.999866,-0.016373,0,2.26,1.5,0,
+ -0.999866,0.016373,0,2.26,1.5,3,
+ -0.999866,-0.016373,0,2.26,1.5,0,
+ -0.996656,-0.081709,0,2.25634,1.574493,3,
+ -0.993446,-0.114299,0,2.25634,1.574493,0,
+ -0.983848,-0.179005,0,2.245397,1.648269,3,
+ -0.993446,-0.114299,0,2.25634,1.574493,0,
+ -0.996656,-0.081709,0,2.25634,1.574493,3,
+ -0.993446,-0.114299,0,2.25634,1.574493,0,
+ -0.983848,-0.179005,0,2.245397,1.648269,3,
+ -0.97746,-0.211123,0,2.245397,1.648269,0,
+ 0.822262,0.56911,0,0.868083,1.077767,0,
+ 0.783294,0.621651,0,0.912512,1.017861,3,
+ 0.76252,0.646965,0,0.912512,1.017861,0,
+ 0.783294,0.621651,0,0.912512,1.017861,3,
+ 0.822262,0.56911,0,0.868083,1.077767,0,
+ 0.840455,0.541882,0,0.868083,1.077767,3,
+ 0.707107,0.707107,0,0.962599,0.962599,3,
+ 0.646965,0.76252,0,1.017861,0.912512,0,
+ 0.707107,0.707107,0,0.962599,0.962599,0,
+ 0.646965,0.76252,0,1.017861,0.912512,0,
+ 0.707107,0.707107,0,0.962599,0.962599,3,
+ 0.621651,0.783294,0,1.017861,0.912512,3,
+ -0.97746,0.211123,0,2.245397,1.351731,3,
+ -0.961565,0.274577,0,2.227275,1.279384,0,
+ -0.952059,0.305914,0,2.227275,1.279384,3,
+ -0.961565,0.274577,0,2.227275,1.279384,0,
+ -0.97746,0.211123,0,2.245397,1.351731,3,
+ -0.983848,0.179005,0,2.245397,1.351731,0,
+ 0.541882,0.840455,0,1.077767,0.868083,3,
+ 0.485774,0.874085,0,1.141738,0.82974,0,
+ 0.56911,0.822262,0,1.077767,0.868083,0,
+ 0.485774,0.874085,0,1.141738,0.82974,0,
+ 0.541882,0.840455,0,1.077767,0.868083,3,
+ 0.456893,0.889521,0,1.141738,0.82974,3,
+ -0.56911,0.822262,0,1.922233,0.868083,3,
+ -0.621651,0.783294,0,1.982139,0.912512,0,
+ -0.541882,0.840455,0,1.922233,0.868083,0,
+ -0.621651,0.783294,0,1.982139,0.912512,0,
+ -0.56911,0.822262,0,1.922233,0.868083,3,
+ -0.646965,0.76252,0,1.982139,0.912512,3,
+ -0.646965,0.76252,0,1.982139,0.912512,3,
+ -0.707107,0.707107,0,2.037401,0.962599,0,
+ -0.621651,0.783294,0,1.982139,0.912512,0,
+ -0.707107,0.707107,0,2.037401,0.962599,0,
+ -0.646965,0.76252,0,1.982139,0.912512,3,
+ -0.707107,0.707107,0,2.037401,0.962599,3,
+ -0.952059,0.305914,0,2.227275,1.279384,3,
+ -0.930022,0.367505,0,2.202148,1.209161,0,
+ -0.91749,0.397759,0,2.202148,1.209161,3,
+ -0.930022,0.367505,0,2.202148,1.209161,0,
+ -0.952059,0.305914,0,2.227275,1.279384,3,
+ -0.961565,0.274577,0,2.227275,1.279384,0,
+ -0.485774,0.874085,0,1.858262,0.82974,3,
+ -0.541882,0.840455,0,1.922233,0.868083,0,
+ -0.456893,0.889521,0,1.858262,0.82974,0,
+ -0.541882,0.840455,0,1.922233,0.868083,0,
+ -0.485774,0.874085,0,1.858262,0.82974,3,
+ -0.56911,0.822262,0,1.922233,0.868083,3,
+ -0.397759,0.91749,0,1.790839,0.797852,3,
+ -0.456893,0.889521,0,1.858262,0.82974,0,
+ -0.367505,0.930022,0,1.790839,0.797852,0,
+ -0.456893,0.889521,0,1.858262,0.82974,0,
+ -0.397759,0.91749,0,1.790839,0.797852,3,
+ -0.485774,0.874085,0,1.858262,0.82974,3,
+ 0.179005,0.983848,0,1.351731,0.754603,3,
+ 0.114299,0.993446,0,1.425507,0.74366,0,
+ 0.211123,0.97746,0,1.351731,0.754603,0,
+ 0.114299,0.993446,0,1.425507,0.74366,0,
+ 0.179005,0.983848,0,1.351731,0.754603,3,
+ 0.081709,0.996656,0,1.425507,0.74366,3,
+ 0.081709,0.996656,0,1.425507,0.74366,3,
+ 0.016373,0.999866,0,1.5,0.74,0,
+ 0.114299,0.993446,0,1.425507,0.74366,0,
+ 0.016373,0.999866,0,1.5,0.74,0,
+ 0.081709,0.996656,0,1.425507,0.74366,3,
+ -0.016373,0.999866,0,1.5,0.74,3,
+ -0.822262,0.56911,0,2.131917,1.077767,3,
+ -0.783294,0.621651,0,2.087488,1.017861,0,
+ -0.76252,0.646965,0,2.087488,1.017861,3,
+ -0.783294,0.621651,0,2.087488,1.017861,0,
+ -0.822262,0.56911,0,2.131917,1.077767,3,
+ -0.840455,0.541882,0,2.131917,1.077767,0,
+ 0.367505,0.930022,0,1.209161,0.797852,3,
+ 0.305914,0.952059,0,1.279384,0.772725,0,
+ 0.397759,0.91749,0,1.209161,0.797852,0,
+ 0.305914,0.952059,0,1.279384,0.772725,0,
+ 0.367505,0.930022,0,1.209161,0.797852,3,
+ 0.274577,0.961565,0,1.279384,0.772725,3,
+ 0.274577,0.961565,0,1.279384,0.772725,3,
+ 0.211123,0.97746,0,1.351731,0.754603,0,
+ 0.305914,0.952059,0,1.279384,0.772725,0,
+ 0.211123,0.97746,0,1.351731,0.754603,0,
+ 0.274577,0.961565,0,1.279384,0.772725,3,
+ 0.179005,0.983848,0,1.351731,0.754603,3,
+ -0.305914,0.952059,0,1.720616,0.772725,3,
+ -0.367505,0.930022,0,1.790839,0.797852,0,
+ -0.274577,0.961565,0,1.720616,0.772725,0,
+ -0.367505,0.930022,0,1.790839,0.797852,0,
+ -0.305914,0.952059,0,1.720616,0.772725,3,
+ -0.397759,0.91749,0,1.790839,0.797852,3,
+ -0.76252,0.646965,0,2.087488,1.017861,3,
+ -0.707107,0.707107,0,2.037401,0.962599,0,
+ -0.707107,0.707107,0,2.037401,0.962599,3,
+ -0.707107,0.707107,0,2.037401,0.962599,0,
+ -0.76252,0.646965,0,2.087488,1.017861,3,
+ -0.783294,0.621651,0,2.087488,1.017861,0,
+ -0.016373,0.999866,0,1.5,0.74,3,
+ -0.081709,0.996656,0,1.574493,0.74366,0,
+ 0.016373,0.999866,0,1.5,0.74,0,
+ -0.081709,0.996656,0,1.574493,0.74366,0,
+ -0.016373,0.999866,0,1.5,0.74,3,
+ -0.114299,0.993446,0,1.574493,0.74366,3,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0.408248,-0.408248,-0.816497,3,0,0,
+ 0.6,0,-0.8,3,0.497732,0,
+ 1,0,0,3,0.205,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,3,3,0,
+ 0.408248,0.408248,-0.816497,3,3,0,
+ 0,0.447214,-0.894427,2.502268,3,0,
+ 0,1,0,2.795,3,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.74366,1.425507,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,1.017861,0.912512,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.772725,1.720616,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.82974,1.141738,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.279384,0.772725,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,2.502268,0,
+ 0.447214,0,-0.894427,3,2.502268,0,
+ 0.408248,0.408248,-0.816497,3,3,0,
+ 1,0,0,3,2.795,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.795,0,0,
+ 0,0,-1,2.795,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.077767,0.868083,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.141738,0.82974,0,
+ 0,0,-1,1.209161,0.797852,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.868083,1.077767,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.912512,1.017861,0,
+ 0,0,-1,0.962599,0.962599,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0.797852,1.209161,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0.772725,1.279384,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.754603,1.351731,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.754603,1.648269,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.74366,1.574493,0,
+ 0,0,-1,0.74,1.5,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.74366,1.425507,3,
+ 0,0,1,0.74,1.5,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.82974,1.141738,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.502268,3,3,
+ 0.408248,0.408248,0.816497,3,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,3,0,3,
+ 0.408248,-0.408248,0.816497,3,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,-0.948683,-0.316228,2.795,0,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,0.497732,3,
+ 0.447214,0,0.894427,3,0.497732,3,
+ 0.408248,-0.408248,0.816497,3,0,3,
+ 1,0,0,3,0.205,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.754603,1.648269,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.772725,1.720616,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0.408248,0.408248,0.816497,3,3,3,
+ 0.447214,0,0.894427,3,2.502268,3,
+ 1,0,0,3,2.795,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.279384,0.772725,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.912512,1.017861,3,
+ 0,0,1,0.868083,1.077767,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,1.141738,0.82974,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.209161,0.797852,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,0.962599,0.962599,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,1.017861,0.912512,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.077767,0.868083,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.797852,1.209161,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.772725,1.279384,3,
+ 0,0,1,0.754603,1.351731,3,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,3,
+ 0,0,-1,1.5,0,3,
+ 0,0,-1,2.795,0,3,
+ 0,0,-1,2.502268,0,3,
+ 0,0,-1,1.5,0,3,
+ 0,0,-1,2.502268,0,3,
+ 0,0,-1,2.12132,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.798369,0,3,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,3,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,3,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,-1,0.205,0,3,
+ 0,0,-1,0.87868,0,3,
+ 0,0,-1,0.497732,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,1.5,0,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,3,3,3,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,3,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0.83205,0.5547,0.205,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,2.502268,3,3,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0,0,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,3,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,3,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,3,0,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,3,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,1.5,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.1475,0,0.8525,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.8525,0,2.1475,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,3,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,3,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,0.8525,3,0.8525,
+ 0,1,0,0.205,3,1.5
+};
+static const struct gllist lament_model_pillar_base_frame = { GL_N3F_V3F, GL_TRIANGLES, 1572, lament_model_pillar_base_data, 0 };
+const struct gllist *lament_model_pillar_base = &lament_model_pillar_base_frame;
+
+static const float lament_model_star_d_data[] = {
+ 0,0,-1,0.955528,0.955528,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0.955528,0.955528,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.955528,0.955528,0,
+ 0,0,-1,1.011517,0.904782,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,1.011517,0.904782,0,
+ 0,0,-1,1.072211,0.859768,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,1.988483,2.095218,0,
+ 0,0,-1,1.927789,2.140232,0,
+ 0,0,-1,1.988483,2.095218,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.044472,2.044472,0,
+ 0,0,-1,2.044472,2.044472,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,3,3,0,
+ 0,-1,0,3,3,0,
+ 0,-1,0,2.502268,3,0,
+ 0,-1,0,2.795,3,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.266292,1.575473,0,
+ 0,0,-1,2.255205,1.65022,0,
+ 0,0,-1,2.266292,1.575473,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.34978,2.255205,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.34978,2.255205,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.424527,2.266292,0,
+ 0,0,-1,1.424527,2.266292,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.27,0,
+ 0,0,-1,0.955528,2.044472,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.955528,2.044472,0,
+ 0,0,-1,0.904782,1.988483,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.904782,1.988483,0,
+ 0,0,-1,0.859768,1.927789,0,
+ 0,0,-1,2.095218,1.011517,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.044472,0.955528,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.095218,1.011517,0,
+ 0,0,-1,2.140232,1.072211,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.140232,1.072211,0,
+ 0,0,-1,3,0.497732,0,
+ 0,-1,0,2.12132,0,0.82632,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.12132,0,0.82632,
+ 0,-1,0,2.12132,0,2.17368,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.723519,0.763156,3,
+ 0,0,1,1.65022,0.744795,3,
+ 0,0,1,1.723519,0.763156,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.794666,0.788613,3,
+ 0,0,1,1.794666,0.788613,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,1,0,0.87868,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.87868,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.87868,3,3,
+ 0,1,0,1.201631,3,3,
+ 0,1,0,1.5,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.201631,3,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.072211,0.859768,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.072211,0.859768,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.137025,0.820921,3,
+ 0,0,1,1.137025,0.820921,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.205334,0.788613,3,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.12132,3,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,0.87868,0,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.201631,3,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.201631,0,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.5,0,
+ 0,0,1,2.236844,1.723519,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.236844,1.723519,3,
+ 0,0,1,2.255205,1.65022,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.255205,1.65022,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,-1,1.575473,0.733708,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0.73,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.575473,0.733708,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.575473,0.733708,0,
+ 0,0,-1,1.65022,0.744795,0,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.179079,1.137025,3,
+ 0,0,1,2.140232,1.072211,3,
+ 0,0,1,2.179079,1.137025,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.211387,1.205334,3,
+ 0,0,1,2.211387,1.205334,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,0.788613,1.205334,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.788613,1.205334,3,
+ 0,0,1,0.763156,1.276481,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0.763156,1.276481,3,
+ 0,0,1,0.744795,1.34978,3,
+ 0,0,-1,0.73,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.73,1.5,0,
+ 0,0,-1,0.733708,1.424527,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.733708,1.424527,0,
+ 0,0,-1,0.744795,1.34978,0,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,2.795,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,3,3,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,3,3,
+ -1,0,0,0,3,0,
+ 0,0,-1,1.927789,2.140232,0,
+ 0,0,-1,2.044472,2.044472,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.044472,2.044472,0,
+ 0,0,-1,1.927789,2.140232,0,
+ 0,0,-1,1.988483,2.095218,0,
+ 0,0,1,1.205334,2.211387,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.205334,2.211387,3,
+ 0,0,1,1.276481,2.236844,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.276481,2.236844,3,
+ 0,0,1,1.34978,2.255205,3,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,0.87868,3,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.12132,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,2.795,3,1.5,
+ -0.55557,-0.83147,0,1.927789,2.140232,3,
+ -0.471397,-0.881921,0,1.862975,2.179079,1.5,
+ -0.55557,-0.83147,0,1.927789,2.140232,1.5,
+ -0.471397,-0.881921,0,1.862975,2.179079,1.5,
+ -0.55557,-0.83147,0,1.927789,2.140232,3,
+ -0.471397,-0.881921,0,1.862975,2.179079,3,
+ -0.941544,-0.33689,0,2.211387,1.794666,3,
+ -0.952059,-0.305914,0,2.236844,1.723519,1.5,
+ -0.961565,-0.274577,0,2.236844,1.723519,3,
+ -0.952059,-0.305914,0,2.236844,1.723519,1.5,
+ -0.941544,-0.33689,0,2.211387,1.794666,3,
+ -0.941544,-0.33689,0,2.211387,1.794666,1.5,
+ 0.740951,-0.671559,0,0.955528,2.044472,1.5,
+ 0.76252,-0.646965,0,0.904782,1.988483,3,
+ 0.783294,-0.621651,0,0.904782,1.988483,1.5,
+ 0.76252,-0.646965,0,0.904782,1.988483,3,
+ 0.740951,-0.671559,0,0.955528,2.044472,1.5,
+ 0.740951,-0.671559,0,0.955528,2.044472,3,
+ -0.996656,-0.081709,0,2.266292,1.575473,3,
+ -0.998795,-0.049068,0,2.27,1.5,1.5,
+ -0.998795,-0.049068,0,2.27,1.5,3,
+ -0.998795,-0.049068,0,2.27,1.5,1.5,
+ -0.996656,-0.081709,0,2.266292,1.575473,3,
+ -0.993446,-0.114299,0,2.266292,1.575473,1.5,
+ -0.822262,0.56911,0,2.140232,1.072211,3,
+ -0.783294,0.621651,0,2.095218,1.011517,1.5,
+ -0.76252,0.646965,0,2.095218,1.011517,3,
+ -0.783294,0.621651,0,2.095218,1.011517,1.5,
+ -0.822262,0.56911,0,2.140232,1.072211,3,
+ -0.840455,0.541882,0,2.140232,1.072211,1.5,
+ 0.840455,-0.541882,0,0.859768,1.927789,1.5,
+ 0.874085,-0.485774,0,0.820921,1.862975,3,
+ 0.889521,-0.456893,0,0.820921,1.862975,1.5,
+ 0.874085,-0.485774,0,0.820921,1.862975,3,
+ 0.840455,-0.541882,0,0.859768,1.927789,1.5,
+ 0.822262,-0.56911,0,0.859768,1.927789,3,
+ -0.471397,-0.881921,0,1.862975,2.179079,1.5,
+ -0.427555,-0.903989,0,1.794666,2.211387,3,
+ -0.427555,-0.903989,0,1.794666,2.211387,1.5,
+ -0.427555,-0.903989,0,1.794666,2.211387,3,
+ -0.471397,-0.881921,0,1.862975,2.179079,1.5,
+ -0.471397,-0.881921,0,1.862975,2.179079,3,
+ -0.382683,-0.92388,0,0.788613,1.794666,0,
+ -0.382683,-0.92388,0,0,2.12132,3,
+ -0.382683,-0.92388,0,0,2.12132,0,
+ -0.382683,-0.92388,0,0,2.12132,3,
+ -0.382683,-0.92388,0,0.788613,1.794666,0,
+ -0.382683,-0.92388,0,0.788613,1.794666,1.5,
+ -0.382683,-0.92388,0,0,2.12132,3,
+ -0.382683,-0.92388,0,0.788613,1.794666,1.5,
+ -0.382683,-0.92388,0,0.788613,1.794666,3,
+ -0.290285,-0.95694,0,1.276481,0.763156,0,
+ -0.33689,-0.941544,0,1.205334,0.788613,1.5,
+ -0.33689,-0.941544,0,1.205334,0.788613,0,
+ -0.33689,-0.941544,0,1.205334,0.788613,1.5,
+ -0.290285,-0.95694,0,1.276481,0.763156,0,
+ -0.290285,-0.95694,0,1.276481,0.763156,1.5,
+ -1,0,0,1.5,0.73,3,
+ -1,0,0,1.5,0,2.795,
+ -1,0,0,1.5,0,3,
+ -1,0,0,1.5,0,2.795,
+ -1,0,0,1.5,0.73,3,
+ -1,0,0,1.5,0,0.205,
+ -1,0,0,1.5,0,0.205,
+ -1,0,0,1.5,0.73,3,
+ -1,0,0,1.5,0,0,
+ -1,0,0,1.5,0,0,
+ -1,0,0,1.5,0.73,3,
+ -1,0,0,1.5,0.73,0,
+ -0.027218,-0.554032,-0.83205,1.5,0.73,0,
+ -0.823173,0.401247,0.401731,1.5,0.73,3,
+ 0.689105,0,0.724662,1.5,0.73,1.5,
+ 0.783294,0.621651,0,2.095218,1.988483,0,
+ 0.822262,0.56911,0,2.140232,1.927789,1.5,
+ 0.840455,0.541882,0,2.140232,1.927789,0,
+ 0.822262,0.56911,0,2.140232,1.927789,1.5,
+ 0.783294,0.621651,0,2.095218,1.988483,0,
+ 0.76252,0.646965,0,2.095218,1.988483,1.5,
+ 0.114299,0.993446,0,1.575473,2.266292,0,
+ 0.179005,0.983848,0,1.65022,2.255205,1.5,
+ 0.211123,0.97746,0,1.65022,2.255205,0,
+ 0.179005,0.983848,0,1.65022,2.255205,1.5,
+ 0.114299,0.993446,0,1.575473,2.266292,0,
+ 0.081709,0.996656,0,1.575473,2.266292,1.5,
+ -0.382683,0.92388,0,2.211387,1.794666,1.5,
+ -0.382683,0.92388,0,3,2.12132,0,
+ -0.382683,0.92388,0,2.211387,1.794666,0,
+ -0.382683,0.92388,0,3,2.12132,0,
+ -0.382683,0.92388,0,2.211387,1.794666,1.5,
+ -0.382683,0.92388,0,3,2.12132,3,
+ -0.382683,0.92388,0,3,2.12132,3,
+ -0.382683,0.92388,0,2.211387,1.794666,1.5,
+ -0.382683,0.92388,0,2.211387,1.794666,3,
+ -0.55557,0.83147,0,1.072211,2.140232,1.5,
+ -0.471397,0.881921,0,1.137025,2.179079,0,
+ -0.55557,0.83147,0,1.072211,2.140232,0,
+ -0.471397,0.881921,0,1.137025,2.179079,0,
+ -0.55557,0.83147,0,1.072211,2.140232,1.5,
+ -0.471397,0.881921,0,1.137025,2.179079,1.5,
+ 0.471397,-0.881921,0,1.862975,0.820921,0,
+ 0.427555,-0.903989,0,1.794666,0.788613,1.5,
+ 0.427555,-0.903989,0,1.794666,0.788613,0,
+ 0.427555,-0.903989,0,1.794666,0.788613,1.5,
+ 0.471397,-0.881921,0,1.862975,0.820921,0,
+ 0.471397,-0.881921,0,1.862975,0.820921,1.5,
+ -0.903989,-0.427555,0,0.788613,1.205334,1.5,
+ -0.889521,-0.456893,0,0.820921,1.137025,0,
+ -0.874085,-0.485774,0,0.820921,1.137025,1.5,
+ -0.889521,-0.456893,0,0.820921,1.137025,0,
+ -0.903989,-0.427555,0,0.788613,1.205334,1.5,
+ -0.903989,-0.427555,0,0.788613,1.205334,0,
+ -0.671559,0.740951,0,0.955528,2.044472,0,
+ -0.646965,0.76252,0,1.011517,2.095218,1.5,
+ -0.621651,0.783294,0,1.011517,2.095218,0,
+ -0.646965,0.76252,0,1.011517,2.095218,1.5,
+ -0.671559,0.740951,0,0.955528,2.044472,0,
+ -0.671559,0.740951,0,0.955528,2.044472,1.5,
+ 0.049068,0.998795,0,1.5,2.27,0,
+ 0.081709,0.996656,0,1.575473,2.266292,1.5,
+ 0.114299,0.993446,0,1.575473,2.266292,0,
+ 0.081709,0.996656,0,1.575473,2.266292,1.5,
+ 0.049068,0.998795,0,1.5,2.27,0,
+ 0.049068,0.998795,0,1.5,2.27,1.5,
+ -0.471397,0.881921,0,1.137025,2.179079,0,
+ -0.427555,0.903989,0,1.205334,2.211387,1.5,
+ -0.427555,0.903989,0,1.205334,2.211387,0,
+ -0.427555,0.903989,0,1.205334,2.211387,1.5,
+ -0.471397,0.881921,0,1.137025,2.179079,0,
+ -0.471397,0.881921,0,1.137025,2.179079,1.5,
+ 0.55557,-0.83147,0,1.927789,0.859768,1.5,
+ 0.471397,-0.881921,0,1.862975,0.820921,0,
+ 0.55557,-0.83147,0,1.927789,0.859768,0,
+ 0.471397,-0.881921,0,1.862975,0.820921,0,
+ 0.55557,-0.83147,0,1.927789,0.859768,1.5,
+ 0.471397,-0.881921,0,1.862975,0.820921,1.5,
+ -0.621651,0.783294,0,1.011517,2.095218,0,
+ -0.55557,0.83147,0,1.072211,2.140232,1.5,
+ -0.55557,0.83147,0,1.072211,2.140232,0,
+ -0.55557,0.83147,0,1.072211,2.140232,1.5,
+ -0.621651,0.783294,0,1.011517,2.095218,0,
+ -0.646965,0.76252,0,1.011517,2.095218,1.5,
+ -0.874085,0.485774,0,2.179079,1.137025,3,
+ -0.840455,0.541882,0,2.140232,1.072211,1.5,
+ -0.822262,0.56911,0,2.140232,1.072211,3,
+ -0.840455,0.541882,0,2.140232,1.072211,1.5,
+ -0.874085,0.485774,0,2.179079,1.137025,3,
+ -0.889521,0.456893,0,2.179079,1.137025,1.5,
+ -0.822262,-0.56911,0,0.859768,1.072211,1.5,
+ -0.783294,-0.621651,0,0.904782,1.011517,0,
+ -0.76252,-0.646965,0,0.904782,1.011517,1.5,
+ -0.783294,-0.621651,0,0.904782,1.011517,0,
+ -0.822262,-0.56911,0,0.859768,1.072211,1.5,
+ -0.840455,-0.541882,0,0.859768,1.072211,0,
+ 0.098017,-0.995185,0,1.424527,2.266292,3,
+ 0.179005,-0.983848,0,1.34978,2.255205,1.5,
+ 0.098017,-0.995185,0,1.424527,2.266292,1.5,
+ 0.179005,-0.983848,0,1.34978,2.255205,1.5,
+ 0.098017,-0.995185,0,1.424527,2.266292,3,
+ 0.211123,-0.97746,0,1.34978,2.255205,3,
+ -0.76252,0.646965,0,2.095218,1.011517,3,
+ -0.740951,0.671559,0,2.044472,0.955528,1.5,
+ -0.740951,0.671559,0,2.044472,0.955528,3,
+ -0.740951,0.671559,0,2.044472,0.955528,1.5,
+ -0.76252,0.646965,0,2.095218,1.011517,3,
+ -0.783294,0.621651,0,2.095218,1.011517,1.5,
+ -0.961565,-0.274577,0,2.236844,1.723519,3,
+ -0.97746,-0.211123,0,2.255205,1.65022,1.5,
+ -0.983848,-0.179005,0,2.255205,1.65022,3,
+ -0.97746,-0.211123,0,2.255205,1.65022,1.5,
+ -0.961565,-0.274577,0,2.236844,1.723519,3,
+ -0.952059,-0.305914,0,2.236844,1.723519,1.5,
+ 0.471397,0.881921,0,1.137025,0.820921,1.5,
+ 0.427555,0.903989,0,1.205334,0.788613,3,
+ 0.427555,0.903989,0,1.205334,0.788613,1.5,
+ 0.427555,0.903989,0,1.205334,0.788613,3,
+ 0.471397,0.881921,0,1.137025,0.820921,1.5,
+ 0.471397,0.881921,0,1.137025,0.820921,3,
+ 0.305914,0.952059,0,1.723519,2.236844,0,
+ 0.33689,0.941544,0,1.794666,2.211387,1.5,
+ 0.33689,0.941544,0,1.794666,2.211387,0,
+ 0.33689,0.941544,0,1.794666,2.211387,1.5,
+ 0.305914,0.952059,0,1.723519,2.236844,0,
+ 0.274577,0.961565,0,1.723519,2.236844,1.5,
+ 0.671559,0.740951,0,0.955528,0.955528,1.5,
+ 0.634393,0.77301,0,1.011517,0.904782,3,
+ 0.634393,0.77301,0,1.011517,0.904782,1.5,
+ 0.634393,0.77301,0,1.011517,0.904782,3,
+ 0.671559,0.740951,0,0.955528,0.955528,1.5,
+ 0.671559,0.740951,0,0.955528,0.955528,3,
+ 1,0,0,1.5,3,0,
+ 1,0,0,1.5,2.27,1.5,
+ 1,0,0,1.5,2.27,0,
+ 1,0,0,1.5,2.27,1.5,
+ 1,0,0,1.5,3,0,
+ 1,0,0,1.5,2.27,3,
+ 1,0,0,1.5,2.27,3,
+ 1,0,0,1.5,3,0,
+ 1,0,0,1.5,3,3,
+ 0.301511,0.301511,0.904534,1.5,3,3,
+ 0.688247,0.229416,-0.688247,1.5,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0.301511,0.301511,0.904534,1.5,3,3,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.5,3,2.795,
+ -0.961565,0.274577,0,0.763156,1.723519,1.5,
+ -0.97746,0.211123,0,0.744795,1.65022,0,
+ -0.983848,0.179005,0,0.744795,1.65022,1.5,
+ -0.97746,0.211123,0,0.744795,1.65022,0,
+ -0.961565,0.274577,0,0.763156,1.723519,1.5,
+ -0.952059,0.305914,0,0.763156,1.723519,0,
+ 0.889521,-0.456893,0,0.820921,1.862975,1.5,
+ 0.903989,-0.427555,0,0.788613,1.794666,3,
+ 0.903989,-0.427555,0,0.788613,1.794666,1.5,
+ 0.903989,-0.427555,0,0.788613,1.794666,3,
+ 0.889521,-0.456893,0,0.820921,1.862975,1.5,
+ 0.874085,-0.485774,0,0.820921,1.862975,3,
+ -0.634393,-0.77301,0,1.988483,2.095218,1.5,
+ -0.55557,-0.83147,0,1.927789,2.140232,3,
+ -0.55557,-0.83147,0,1.927789,2.140232,1.5,
+ -0.55557,-0.83147,0,1.927789,2.140232,3,
+ -0.634393,-0.77301,0,1.988483,2.095218,1.5,
+ -0.634393,-0.77301,0,1.988483,2.095218,3,
+ -0.707107,0.707107,0,0.955528,0.955528,3,
+ -0.707107,0.707107,0,0,0,2.795,
+ -0.707107,0.707107,0,0,0,3,
+ -0.707107,0.707107,0,0,0,2.795,
+ -0.707107,0.707107,0,0.955528,0.955528,3,
+ -0.707107,0.707107,0,0,0,1.5,
+ -0.707107,0.707107,0,0,0,1.5,
+ -0.707107,0.707107,0,0.955528,0.955528,3,
+ -0.707107,0.707107,0,0,0,0.205,
+ -0.707107,0.707107,0,0,0,0.205,
+ -0.707107,0.707107,0,0.955528,0.955528,3,
+ -0.707107,0.707107,0,0,0,0,
+ -0.707107,0.707107,0,0,0,0,
+ -0.707107,0.707107,0,0.955528,0.955528,3,
+ -0.707107,0.707107,0,0.955528,0.955528,0,
+ 0,1,0,0.955528,0.955528,0,
+ 0,1,0,0.955528,0.955528,3,
+ 0,1,0,0.955528,0.955528,1.5,
+ -0.707107,-0.707107,0,3,0,0,
+ -0.707107,-0.707107,0,2.044472,0.955528,1.5,
+ -0.707107,-0.707107,0,2.044472,0.955528,0,
+ -0.707107,-0.707107,0,2.044472,0.955528,1.5,
+ -0.707107,-0.707107,0,3,0,0,
+ -0.707107,-0.707107,0,3,0,3,
+ -0.707107,-0.707107,0,2.044472,0.955528,1.5,
+ -0.707107,-0.707107,0,3,0,3,
+ -0.707107,-0.707107,0,2.044472,0.955528,3,
+ 0.996993,0.077486,0,2.12132,0,0,
+ 1,0,0,2.12132,0,0.82632,
+ 1,0,0,2.12132,0,0.205,
+ 1,0,0,2.12132,0,0.82632,
+ 0.996993,0.077486,0,2.12132,0,0,
+ 1,0,0,2.12132,0,2.17368,
+ 1,0,0,2.12132,0,2.17368,
+ 0.996993,0.077486,0,2.12132,0,0,
+ 1,0,0,2.12132,0,2.795,
+ 1,0,0,2.12132,0,2.795,
+ 0.996993,0.077486,0,2.12132,0,0,
+ 0.96573,0.259551,0,2.12132,0,3,
+ 0.96573,0.259551,0,2.12132,0,3,
+ 0.996993,0.077486,0,2.12132,0,0,
+ 0.92388,0.382683,0,1.794666,0.788613,0,
+ 0.96573,0.259551,0,2.12132,0,3,
+ 0.92388,0.382683,0,1.794666,0.788613,0,
+ 0.92388,0.382683,0,1.794666,0.788613,3,
+ 0.237702,0.536246,0.8099,1.794666,0.788613,3,
+ 0.470193,0.03587,-0.881834,1.794666,0.788613,0,
+ 0.371553,0.153902,0.915567,1.794666,0.788613,1.5,
+ 0.993446,-0.114299,0,2.266292,1.424527,0,
+ 0.983848,-0.179005,0,2.255205,1.34978,1.5,
+ 0.97746,-0.211123,0,2.255205,1.34978,0,
+ 0.983848,-0.179005,0,2.255205,1.34978,1.5,
+ 0.993446,-0.114299,0,2.266292,1.424527,0,
+ 0.996656,-0.081709,0,2.266292,1.424527,1.5,
+ 0.998795,-0.049068,0,2.27,1.5,0,
+ 0.996656,-0.081709,0,2.266292,1.424527,1.5,
+ 0.993446,-0.114299,0,2.266292,1.424527,0,
+ 0.996656,-0.081709,0,2.266292,1.424527,1.5,
+ 0.998795,-0.049068,0,2.27,1.5,0,
+ 0.998795,-0.049068,0,2.27,1.5,1.5,
+ 0.97746,-0.211123,0,2.255205,1.34978,0,
+ 0.961565,-0.274577,0,2.236844,1.276481,1.5,
+ 0.952059,-0.305914,0,2.236844,1.276481,0,
+ 0.961565,-0.274577,0,2.236844,1.276481,1.5,
+ 0.97746,-0.211123,0,2.255205,1.34978,0,
+ 0.983848,-0.179005,0,2.255205,1.34978,1.5,
+ 0,0,1,2.044472,0.955528,1.5,
+ 0,0,1,2.211387,1.205334,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.211387,1.205334,1.5,
+ 0,0,1,2.044472,0.955528,1.5,
+ 0,0,1,2.095218,1.011517,1.5,
+ 0,0,1,2.211387,1.205334,1.5,
+ 0,0,1,2.095218,1.011517,1.5,
+ 0,0,1,2.140232,1.072211,1.5,
+ 0,0,1,2.211387,1.205334,1.5,
+ 0,0,1,2.140232,1.072211,1.5,
+ 0,0,1,2.179079,1.137025,1.5,
+ 0.993446,0.114299,0,0.733708,1.424527,1.5,
+ 0.983848,0.179005,0,0.744795,1.34978,3,
+ 0.97746,0.211123,0,0.744795,1.34978,1.5,
+ 0.983848,0.179005,0,0.744795,1.34978,3,
+ 0.993446,0.114299,0,0.733708,1.424527,1.5,
+ 0.996656,0.081709,0,0.733708,1.424527,3,
+ -0.874085,-0.485774,0,0.820921,1.137025,1.5,
+ -0.840455,-0.541882,0,0.859768,1.072211,0,
+ -0.822262,-0.56911,0,0.859768,1.072211,1.5,
+ -0.840455,-0.541882,0,0.859768,1.072211,0,
+ -0.874085,-0.485774,0,0.820921,1.137025,1.5,
+ -0.889521,-0.456893,0,0.820921,1.137025,0,
+ -0.92388,-0.382683,0,0.87868,3,3,
+ -0.92388,-0.382683,0,1.205334,2.211387,1.5,
+ -0.92388,-0.382683,0,1.205334,2.211387,3,
+ -0.92388,-0.382683,0,1.205334,2.211387,1.5,
+ -0.92388,-0.382683,0,0.87868,3,3,
+ -0.92388,-0.382683,0,1.205334,2.211387,0,
+ -0.92388,-0.382683,0,1.205334,2.211387,0,
+ -0.92388,-0.382683,0,0.87868,3,3,
+ -0.92388,-0.382683,0,0.87868,3,0,
+ 0,-1,0,0.87868,3,0,
+ 0,-1,0,0.87868,3,3,
+ 0,-1,0,0.87868,3,2.795,
+ 0,-1,0,0.87868,3,0,
+ 0,-1,0,0.87868,3,2.795,
+ 0,-1,0,0.87868,3,2.17368,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.87868,3,2.17368,
+ 0,1,0,0.87868,3,0.82632,
+ -0.653281,-0.270598,-0.707107,0.87868,3,0,
+ 0,1,0,0.87868,3,0.82632,
+ 0,1,0,0.87868,3,0.205,
+ 0.382683,0.92388,0,2.211387,1.205334,1.5,
+ 0.382683,0.92388,0,3,0.87868,0,
+ 0.382683,0.92388,0,2.211387,1.205334,0,
+ 0.382683,0.92388,0,3,0.87868,0,
+ 0.382683,0.92388,0,2.211387,1.205334,1.5,
+ 0.382683,0.92388,0,3,0.87868,3,
+ 0.382683,0.92388,0,3,0.87868,3,
+ 0.382683,0.92388,0,2.211387,1.205334,1.5,
+ 0.382683,0.92388,0,2.211387,1.205334,3,
+ 0,-1,0,3,1.5,0,
+ 0,-1,0,2.27,1.5,1.5,
+ 0,-1,0,2.27,1.5,0,
+ 0,-1,0,2.27,1.5,1.5,
+ 0,-1,0,3,1.5,0,
+ 0,-1,0,3,1.5,3,
+ 0,-1,0,2.27,1.5,1.5,
+ 0,-1,0,3,1.5,3,
+ 0,-1,0,2.27,1.5,3,
+ 0.382683,-0.92388,0,0.788613,1.205334,0,
+ 0.382683,-0.92388,0,0,0.87868,3,
+ 0.382683,-0.92388,0,0,0.87868,0,
+ 0.382683,-0.92388,0,0,0.87868,3,
+ 0.382683,-0.92388,0,0.788613,1.205334,0,
+ 0.382683,-0.92388,0,0.788613,1.205334,1.5,
+ 0.382683,-0.92388,0,0,0.87868,3,
+ 0.382683,-0.92388,0,0.788613,1.205334,1.5,
+ 0.382683,-0.92388,0,0.788613,1.205334,3,
+ 0.634393,0.77301,0,1.011517,0.904782,3,
+ 0.56911,0.822262,0,1.072211,0.859768,1.5,
+ 0.634393,0.77301,0,1.011517,0.904782,1.5,
+ 0.56911,0.822262,0,1.072211,0.859768,1.5,
+ 0.634393,0.77301,0,1.011517,0.904782,3,
+ 0.541882,0.840455,0,1.072211,0.859768,3,
+ 0.889521,0.456893,0,2.179079,1.862975,0,
+ 0.903989,0.427555,0,2.211387,1.794666,1.5,
+ 0.903989,0.427555,0,2.211387,1.794666,0,
+ 0.903989,0.427555,0,2.211387,1.794666,1.5,
+ 0.889521,0.456893,0,2.179079,1.862975,0,
+ 0.874085,0.485774,0,2.179079,1.862975,1.5,
+ 0.621651,-0.783294,0,1.988483,0.904782,0,
+ 0.55557,-0.83147,0,1.927789,0.859768,1.5,
+ 0.55557,-0.83147,0,1.927789,0.859768,0,
+ 0.55557,-0.83147,0,1.927789,0.859768,1.5,
+ 0.621651,-0.783294,0,1.988483,0.904782,0,
+ 0.646965,-0.76252,0,1.988483,0.904782,1.5,
+ 0.305914,-0.952059,0,1.276481,2.236844,3,
+ 0.33689,-0.941544,0,1.205334,2.211387,1.5,
+ 0.274577,-0.961565,0,1.276481,2.236844,1.5,
+ 0.33689,-0.941544,0,1.205334,2.211387,1.5,
+ 0.305914,-0.952059,0,1.276481,2.236844,3,
+ 0.33689,-0.941544,0,1.205334,2.211387,3,
+ 0.97746,0.211123,0,0.744795,1.34978,1.5,
+ 0.961565,0.274577,0,0.763156,1.276481,3,
+ 0.952059,0.305914,0,0.763156,1.276481,1.5,
+ 0.961565,0.274577,0,0.763156,1.276481,3,
+ 0.97746,0.211123,0,0.744795,1.34978,1.5,
+ 0.983848,0.179005,0,0.744795,1.34978,3,
+ -0.305914,0.952059,0,1.723519,0.763156,3,
+ -0.33689,0.941544,0,1.794666,0.788613,1.5,
+ -0.274577,0.961565,0,1.723519,0.763156,1.5,
+ -0.33689,0.941544,0,1.794666,0.788613,1.5,
+ -0.305914,0.952059,0,1.723519,0.763156,3,
+ -0.33689,0.941544,0,1.794666,0.788613,3,
+ -0.671559,-0.740951,0,2.044472,2.044472,3,
+ -0.634393,-0.77301,0,1.988483,2.095218,1.5,
+ -0.671559,-0.740951,0,2.044472,2.044472,1.5,
+ -0.634393,-0.77301,0,1.988483,2.095218,1.5,
+ -0.671559,-0.740951,0,2.044472,2.044472,3,
+ -0.634393,-0.77301,0,1.988483,2.095218,3,
+ -0.19509,0.980785,0,1.65022,0.744795,3,
+ -0.274577,0.961565,0,1.723519,0.763156,1.5,
+ -0.19509,0.980785,0,1.65022,0.744795,1.5,
+ -0.274577,0.961565,0,1.723519,0.763156,1.5,
+ -0.19509,0.980785,0,1.65022,0.744795,3,
+ -0.305914,0.952059,0,1.723519,0.763156,3,
+ -0.098017,0.995185,0,1.575473,0.733708,1.5,
+ -0.19509,0.980785,0,1.65022,0.744795,3,
+ -0.19509,0.980785,0,1.65022,0.744795,1.5,
+ -0.19509,0.980785,0,1.65022,0.744795,3,
+ -0.098017,0.995185,0,1.575473,0.733708,1.5,
+ -0.098017,0.995185,0,1.575473,0.733708,3,
+ 0.049068,-0.998795,0,1.5,2.27,1.5,
+ 0.098017,-0.995185,0,1.424527,2.266292,3,
+ 0.098017,-0.995185,0,1.424527,2.266292,1.5,
+ 0.098017,-0.995185,0,1.424527,2.266292,3,
+ 0.049068,-0.998795,0,1.5,2.27,1.5,
+ 0.049068,-0.998795,0,1.5,2.27,3,
+ 0.211123,-0.97746,0,1.34978,2.255205,3,
+ 0.274577,-0.961565,0,1.276481,2.236844,1.5,
+ 0.179005,-0.983848,0,1.34978,2.255205,1.5,
+ 0.274577,-0.961565,0,1.276481,2.236844,1.5,
+ 0.211123,-0.97746,0,1.34978,2.255205,3,
+ 0.305914,-0.952059,0,1.276481,2.236844,3,
+ 0.998795,0.049068,0,0.73,1.5,1.5,
+ 0.996656,0.081709,0,0.733708,1.424527,3,
+ 0.993446,0.114299,0,0.733708,1.424527,1.5,
+ 0.996656,0.081709,0,0.733708,1.424527,3,
+ 0.998795,0.049068,0,0.73,1.5,1.5,
+ 0.998795,0.049068,0,0.73,1.5,3,
+ -0.983848,-0.179005,0,2.255205,1.65022,3,
+ -0.993446,-0.114299,0,2.266292,1.575473,1.5,
+ -0.996656,-0.081709,0,2.266292,1.575473,3,
+ -0.993446,-0.114299,0,2.266292,1.575473,1.5,
+ -0.983848,-0.179005,0,2.255205,1.65022,3,
+ -0.97746,-0.211123,0,2.255205,1.65022,1.5,
+ -0.098017,-0.995185,0,1.424527,0.733708,1.5,
+ -0.179005,-0.983848,0,1.34978,0.744795,0,
+ -0.098017,-0.995185,0,1.424527,0.733708,0,
+ -0.179005,-0.983848,0,1.34978,0.744795,0,
+ -0.098017,-0.995185,0,1.424527,0.733708,1.5,
+ -0.211123,-0.97746,0,1.34978,0.744795,1.5,
+ -0.903989,0.427555,0,2.211387,1.205334,3,
+ -0.889521,0.456893,0,2.179079,1.137025,1.5,
+ -0.874085,0.485774,0,2.179079,1.137025,3,
+ -0.889521,0.456893,0,2.179079,1.137025,1.5,
+ -0.903989,0.427555,0,2.211387,1.205334,3,
+ -0.903989,0.427555,0,2.211387,1.205334,1.5,
+ -0.049068,0.998795,0,1.5,0.73,3,
+ -0.098017,0.995185,0,1.575473,0.733708,1.5,
+ -0.049068,0.998795,0,1.5,0.73,1.5,
+ -0.098017,0.995185,0,1.575473,0.733708,1.5,
+ -0.049068,0.998795,0,1.5,0.73,3,
+ -0.098017,0.995185,0,1.575473,0.733708,3,
+ 0.671559,-0.740951,0,2.044472,0.955528,0,
+ 0.646965,-0.76252,0,1.988483,0.904782,1.5,
+ 0.621651,-0.783294,0,1.988483,0.904782,0,
+ 0.646965,-0.76252,0,1.988483,0.904782,1.5,
+ 0.671559,-0.740951,0,2.044472,0.955528,0,
+ 0.671559,-0.740951,0,2.044472,0.955528,1.5,
+ -0.049068,-0.998795,0,1.5,0.73,0,
+ -0.098017,-0.995185,0,1.424527,0.733708,1.5,
+ -0.098017,-0.995185,0,1.424527,0.733708,0,
+ -0.098017,-0.995185,0,1.424527,0.733708,1.5,
+ -0.049068,-0.998795,0,1.5,0.73,0,
+ -0.049068,-0.998795,0,1.5,0.73,1.5,
+ -0.983848,0.179005,0,0.744795,1.65022,1.5,
+ -0.993446,0.114299,0,0.733708,1.575473,0,
+ -0.996656,0.081709,0,0.733708,1.575473,1.5,
+ -0.993446,0.114299,0,0.733708,1.575473,0,
+ -0.983848,0.179005,0,0.744795,1.65022,1.5,
+ -0.97746,0.211123,0,0.744795,1.65022,0,
+ -0.941544,0.33689,0,0.788613,1.794666,1.5,
+ -0.952059,0.305914,0,0.763156,1.723519,0,
+ -0.961565,0.274577,0,0.763156,1.723519,1.5,
+ -0.952059,0.305914,0,0.763156,1.723519,0,
+ -0.941544,0.33689,0,0.788613,1.794666,1.5,
+ -0.941544,0.33689,0,0.788613,1.794666,0,
+ -0.211123,-0.97746,0,1.34978,0.744795,1.5,
+ -0.290285,-0.95694,0,1.276481,0.763156,0,
+ -0.179005,-0.983848,0,1.34978,0.744795,0,
+ -0.290285,-0.95694,0,1.276481,0.763156,0,
+ -0.211123,-0.97746,0,1.34978,0.744795,1.5,
+ -0.290285,-0.95694,0,1.276481,0.763156,1.5,
+ 0.740951,0.671559,0,2.044472,2.044472,0,
+ 0.76252,0.646965,0,2.095218,1.988483,1.5,
+ 0.783294,0.621651,0,2.095218,1.988483,0,
+ 0.76252,0.646965,0,2.095218,1.988483,1.5,
+ 0.740951,0.671559,0,2.044472,2.044472,0,
+ 0.740951,0.671559,0,2.044472,2.044472,1.5,
+ -0.76252,-0.646965,0,0.904782,1.011517,1.5,
+ -0.740951,-0.671559,0,0.955528,0.955528,0,
+ -0.740951,-0.671559,0,0.955528,0.955528,1.5,
+ -0.740951,-0.671559,0,0.955528,0.955528,0,
+ -0.76252,-0.646965,0,0.904782,1.011517,1.5,
+ -0.783294,-0.621651,0,0.904782,1.011517,0,
+ 0.211123,0.97746,0,1.65022,2.255205,0,
+ 0.274577,0.961565,0,1.723519,2.236844,1.5,
+ 0.305914,0.952059,0,1.723519,2.236844,0,
+ 0.274577,0.961565,0,1.723519,2.236844,1.5,
+ 0.211123,0.97746,0,1.65022,2.255205,0,
+ 0.179005,0.983848,0,1.65022,2.255205,1.5,
+ -0.996656,0.081709,0,0.733708,1.575473,1.5,
+ -0.998795,0.049068,0,0.73,1.5,0,
+ -0.998795,0.049068,0,0.73,1.5,1.5,
+ -0.998795,0.049068,0,0.73,1.5,0,
+ -0.996656,0.081709,0,0.733708,1.575473,1.5,
+ -0.993446,0.114299,0,0.733708,1.575473,0,
+ 0.707107,-0.707107,0,3,3,0,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,2.044472,2.044472,0,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,3,3,0,
+ 0.707107,-0.707107,0,3,3,0.205,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,3,3,0.205,
+ 0.707107,-0.707107,0,3,3,1.5,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,3,3,1.5,
+ 0.707107,-0.707107,0,3,3,2.795,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,3,3,2.795,
+ 0.707107,-0.707107,0,2.044472,2.044472,3,
+ 0.707107,-0.707107,0,2.044472,2.044472,3,
+ 0.707107,-0.707107,0,3,3,2.795,
+ 0.707107,-0.707107,0,3,3,3,
+ 0.840455,0.541882,0,2.140232,1.927789,0,
+ 0.874085,0.485774,0,2.179079,1.862975,1.5,
+ 0.889521,0.456893,0,2.179079,1.862975,0,
+ 0.874085,0.485774,0,2.179079,1.862975,1.5,
+ 0.840455,0.541882,0,2.140232,1.927789,0,
+ 0.822262,0.56911,0,2.140232,1.927789,1.5,
+ 0.952059,-0.305914,0,2.236844,1.276481,0,
+ 0.941544,-0.33689,0,2.211387,1.205334,1.5,
+ 0.941544,-0.33689,0,2.211387,1.205334,0,
+ 0.941544,-0.33689,0,2.211387,1.205334,1.5,
+ 0.952059,-0.305914,0,2.236844,1.276481,0,
+ 0.961565,-0.274577,0,2.236844,1.276481,1.5,
+ 0,1,0,0,1.5,3,
+ 0,1,0,0.73,1.5,0,
+ 0,1,0,0,1.5,0,
+ 0,1,0,0.73,1.5,0,
+ 0,1,0,0,1.5,3,
+ 0,1,0,0.73,1.5,1.5,
+ 0,1,0,0.73,1.5,1.5,
+ 0,1,0,0,1.5,3,
+ 0,1,0,0.73,1.5,3,
+ 0.541882,0.840455,0,1.072211,0.859768,3,
+ 0.471397,0.881921,0,1.137025,0.820921,1.5,
+ 0.56911,0.822262,0,1.072211,0.859768,1.5,
+ 0.471397,0.881921,0,1.137025,0.820921,1.5,
+ 0.541882,0.840455,0,1.072211,0.859768,3,
+ 0.471397,0.881921,0,1.137025,0.820921,3,
+ 0.952059,0.305914,0,0.763156,1.276481,1.5,
+ 0.941544,0.33689,0,0.788613,1.205334,3,
+ 0.941544,0.33689,0,0.788613,1.205334,1.5,
+ 0.941544,0.33689,0,0.788613,1.205334,3,
+ 0.952059,0.305914,0,0.763156,1.276481,1.5,
+ 0.961565,0.274577,0,0.763156,1.276481,3,
+ 0.783294,-0.621651,0,0.904782,1.988483,1.5,
+ 0.822262,-0.56911,0,0.859768,1.927789,3,
+ 0.840455,-0.541882,0,0.859768,1.927789,1.5,
+ 0.822262,-0.56911,0,0.859768,1.927789,3,
+ 0.783294,-0.621651,0,0.904782,1.988483,1.5,
+ 0.76252,-0.646965,0,0.904782,1.988483,3,
+ 0.92388,-0.382683,0,1.205334,0.788613,0,
+ 0.92388,-0.382683,0,0.87868,0,0.205,
+ 0.92388,-0.382683,0,0.87868,0,0,
+ 0.92388,-0.382683,0,0.87868,0,0.205,
+ 0.92388,-0.382683,0,1.205334,0.788613,0,
+ 0.92388,-0.382683,0,0.87868,0,0.82632,
+ 0.92388,-0.382683,0,0.87868,0,0.82632,
+ 0.92388,-0.382683,0,1.205334,0.788613,0,
+ 0.92388,-0.382683,0,0.87868,0,2.17368,
+ 0.92388,-0.382683,0,0.87868,0,2.17368,
+ 0.92388,-0.382683,0,1.205334,0.788613,0,
+ 0.92388,-0.382683,0,0.87868,0,2.795,
+ 0.92388,-0.382683,0,0.87868,0,2.795,
+ 0.92388,-0.382683,0,1.205334,0.788613,0,
+ 0.92388,-0.382683,0,0.87868,0,3,
+ 0.92388,-0.382683,0,0.87868,0,3,
+ 0.92388,-0.382683,0,1.205334,0.788613,0,
+ 0.92388,-0.382683,0,1.205334,0.788613,3,
+ 0.714674,0.572585,0.401731,1.205334,0.788613,3,
+ 0.793487,-0.468606,-0.388313,1.205334,0.788613,0,
+ 0.516676,-0.562787,0.645226,1.205334,0.788613,1.5,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.788613,1.205334,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0.788613,1.205334,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.763156,1.276481,0,
+ 0,0,-1,0.763156,1.276481,0,
+ 0,0,-1,0,1.201631,0,
+ 0,0,-1,0.744795,1.34978,0,
+ 0,0,-1,2.044472,2.044472,0,
+ 0,0,-1,2.140232,1.927789,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.140232,1.927789,0,
+ 0,0,-1,2.044472,2.044472,0,
+ 0,0,-1,2.095218,1.988483,0,
+ 0,0,-1,2.140232,1.927789,0,
+ 0,0,-1,2.211387,1.794666,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.211387,1.794666,0,
+ 0,0,-1,2.140232,1.927789,0,
+ 0,0,-1,2.179079,1.862975,0,
+ 0,0,-1,1.072211,0.859768,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,0.497732,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.072211,0.859768,0,
+ 0,0,-1,1.137025,0.820921,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.137025,0.820921,0,
+ 0,0,-1,1.205334,0.788613,0,
+ 0,0,-1,2.179079,1.137025,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.140232,1.072211,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.179079,1.137025,0,
+ 0,0,-1,2.211387,1.205334,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.211387,1.205334,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,1.927789,0.859768,0,
+ 0,0,-1,1.794666,0.788613,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.794666,0.788613,0,
+ 0,0,-1,1.927789,0.859768,0,
+ 0,0,-1,1.862975,0.820921,0,
+ 0,0,-1,1.794666,0.788613,0,
+ 0,0,-1,1.65022,0.744795,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.65022,0.744795,0,
+ 0,0,-1,1.794666,0.788613,0,
+ 0,0,-1,1.723519,0.763156,0,
+ 0,0,-1,2.255205,1.34978,0,
+ 0,0,-1,2.211387,1.205334,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.211387,1.205334,0,
+ 0,0,-1,2.255205,1.34978,0,
+ 0,0,-1,2.236844,1.276481,0,
+ 0,0,-1,0.820921,1.862975,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.788613,1.794666,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.820921,1.862975,0,
+ 0,0,-1,0.859768,1.927789,0,
+ 0,0,-1,0.904782,1.988483,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.859768,1.927789,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.904782,1.988483,0,
+ 0,0,-1,0.955528,2.044472,0,
+ 0,0,-1,0.763156,1.723519,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.744795,1.65022,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.763156,1.723519,0,
+ 0,0,-1,0.788613,1.794666,0,
+ 0,0,-1,1.794666,2.211387,0,
+ 0,0,-1,1.927789,2.140232,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.927789,2.140232,0,
+ 0,0,-1,1.794666,2.211387,0,
+ 0,0,-1,1.862975,2.179079,0,
+ 0,0,-1,1.65022,2.255205,0,
+ 0,0,-1,1.794666,2.211387,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.794666,2.211387,0,
+ 0,0,-1,1.65022,2.255205,0,
+ 0,0,-1,1.723519,2.236844,0,
+ 0,0,-1,1.723519,0.763156,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.65022,0.744795,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.723519,0.763156,0,
+ 0,0,-1,1.794666,0.788613,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.794666,0.788613,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,2.211387,1.794666,0,
+ 0,0,-1,2.255205,1.65022,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.255205,1.65022,0,
+ 0,0,-1,2.211387,1.794666,0,
+ 0,0,-1,2.236844,1.723519,0,
+ 0,0,-1,2.255205,1.65022,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,2.255205,1.65022,0,
+ 0,0,-1,2.266292,1.575473,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.011517,0.904782,0,
+ 0,0,-1,0.955528,0.955528,0,
+ 0,0,-1,1.011517,0.904782,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.072211,0.859768,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.137025,0.820921,0,
+ 0,0,-1,1.072211,0.859768,0,
+ 0,0,-1,1.137025,0.820921,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.205334,0.788613,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.733708,1.424527,0,
+ 0,0,-1,0.73,1.5,0,
+ 0,0,-1,0.733708,1.424527,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.744795,1.34978,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.276481,0.763156,0,
+ 0,0,-1,1.205334,0.788613,0,
+ 0,0,-1,1.276481,0.763156,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.34978,0.744795,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.763156,1.276481,0,
+ 0,0,-1,0.744795,1.34978,0,
+ 0,0,-1,0.763156,1.276481,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.788613,1.205334,0,
+ 0,0,-1,0.733708,1.575473,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.73,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.733708,1.575473,0,
+ 0,0,-1,0.744795,1.65022,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.820921,1.137025,0,
+ 0,0,-1,0.788613,1.205334,0,
+ 0,0,-1,0.820921,1.137025,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.859768,1.072211,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,2.255205,1.34978,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.255205,1.34978,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,2.266292,1.424527,0,
+ 0,0,-1,2.140232,1.072211,0,
+ 0,0,-1,2.044472,0.955528,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.044472,0.955528,0,
+ 0,0,-1,2.140232,1.072211,0,
+ 0,0,-1,2.095218,1.011517,0,
+ 0,0,-1,1.575473,2.266292,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,2.27,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.575473,2.266292,0,
+ 0,0,-1,1.65022,2.255205,0,
+ 0,0,-1,1.011517,2.095218,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.955528,2.044472,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.011517,2.095218,0,
+ 0,0,-1,1.072211,2.140232,0,
+ 0,0,-1,1.137025,2.179079,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.072211,2.140232,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.137025,2.179079,0,
+ 0,0,-1,1.205334,2.211387,0,
+ 0,0,-1,2.044472,0.955528,0,
+ 0,0,-1,1.927789,0.859768,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.927789,0.859768,0,
+ 0,0,-1,2.044472,0.955528,0,
+ 0,0,-1,1.988483,0.904782,0,
+ 0,0,-1,1.276481,2.236844,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.205334,2.211387,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.276481,2.236844,0,
+ 0,0,-1,1.34978,2.255205,0,
+ 0,0,-1,1.424527,2.266292,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.34978,2.255205,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.424527,2.266292,0,
+ 0,0,-1,1.5,2.27,0,
+ 0,0,-1,2.211387,1.205334,0,
+ 0,0,-1,2.140232,1.072211,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,2.140232,1.072211,0,
+ 0,0,-1,2.211387,1.205334,0,
+ 0,0,-1,2.179079,1.137025,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.904782,1.011517,0,
+ 0,0,-1,0.859768,1.072211,0,
+ 0,0,-1,0.904782,1.011517,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,0.955528,0.955528,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.575473,0.733708,0,
+ 0,0,-1,1.5,0.73,0,
+ 0,0,-1,1.575473,0.733708,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.65022,0.744795,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.205334,2.211387,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.205334,2.211387,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.276481,2.236844,0,
+ 0,0,-1,1.276481,2.236844,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.34978,2.255205,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.788613,1.794666,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.788613,1.794666,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.820921,1.862975,0,
+ 0,0,-1,0.820921,1.862975,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.859768,1.927789,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.862975,2.179079,0,
+ 0,0,-1,1.794666,2.211387,0,
+ 0,0,-1,1.862975,2.179079,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.927789,2.140232,0,
+ 0,0,-1,1.927789,2.140232,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.424527,0.733708,0,
+ 0,0,-1,1.34978,0.744795,0,
+ 0,0,-1,1.424527,0.733708,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.73,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.236844,1.723519,0,
+ 0,0,-1,2.211387,1.794666,0,
+ 0,0,-1,2.236844,1.723519,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.255205,1.65022,0,
+ 0,0,-1,2.255205,1.65022,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,1.798369,0,
+ -0.92388,0.382683,0,2.12132,3,3,
+ -0.92388,0.382683,0,1.794666,2.211387,1.5,
+ -0.92388,0.382683,0,1.794666,2.211387,3,
+ -0.92388,0.382683,0,1.794666,2.211387,1.5,
+ -0.92388,0.382683,0,2.12132,3,3,
+ -0.92388,0.382683,0,1.794666,2.211387,0,
+ -0.92388,0.382683,0,1.794666,2.211387,0,
+ -0.92388,0.382683,0,2.12132,3,3,
+ -0.92388,0.382683,0,2.12132,3,0,
+ -0.269347,0.403107,-0.874618,2.12132,3,0,
+ -0.537476,0.61047,0.58176,2.12132,3,3,
+ 0,1,0,2.12132,3,2.795,
+ -0.269347,0.403107,-0.874618,2.12132,3,0,
+ 0,1,0,2.12132,3,2.795,
+ 0,1,0,2.12132,3,2.17368,
+ -0.269347,0.403107,-0.874618,2.12132,3,0,
+ 0,1,0,2.12132,3,2.17368,
+ 0,1,0,2.12132,3,0.82632,
+ -0.269347,0.403107,-0.874618,2.12132,3,0,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,2.12132,3,0.205,
+ 0,0,1,1.862975,2.179079,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.794666,2.211387,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.862975,2.179079,3,
+ 0,0,1,1.927789,2.140232,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.927789,2.140232,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,0.788613,1.794666,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.788613,1.794666,3,
+ 0,0,1,0.820921,1.862975,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.820921,1.862975,3,
+ 0,0,1,0.859768,1.927789,3,
+ 0.707107,0.707107,0,0,3,0,
+ 0.707107,0.707107,0,0.955528,2.044472,1.5,
+ 0.707107,0.707107,0,0.955528,2.044472,0,
+ 0.707107,0.707107,0,0.955528,2.044472,1.5,
+ 0.707107,0.707107,0,0,3,0,
+ 0.707107,0.707107,0,0.955528,2.044472,3,
+ 0.707107,0.707107,0,0.955528,2.044472,3,
+ 0.707107,0.707107,0,0,3,0,
+ 0.707107,0.707107,0,0,3,3,
+ 0,0,1,0.859768,1.927789,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.859768,1.927789,3,
+ 0,0,1,0.904782,1.988483,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.904782,1.988483,3,
+ 0,0,1,0.955528,2.044472,3,
+ 0,0,1,1.34978,2.255205,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.34978,2.255205,3,
+ 0,0,1,1.424527,2.266292,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.424527,2.266292,3,
+ 0,0,1,1.5,2.27,3,
+ 0,0,1,2.266292,1.575473,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.255205,1.65022,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.266292,1.575473,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.955528,0.955528,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0.955528,0.955528,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,0.955528,0.955528,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.011517,0.904782,3,
+ 0,0,1,1.011517,0.904782,3,
+ 0,0,1,0.497732,0,3,
+ 0,0,1,1.072211,0.859768,3,
+ 0,0,1,0.744795,1.34978,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.201631,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.744795,1.34978,3,
+ 0,0,1,0.733708,1.424527,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0.733708,1.424527,3,
+ 0,0,1,0.73,1.5,3,
+ 0,0,1,1.988483,2.095218,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.927789,2.140232,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.988483,2.095218,3,
+ 0,0,1,2.044472,2.044472,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.044472,2.044472,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.502268,3,3,
+ 0.561517,0.232588,0.794104,3,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.5,0.73,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.73,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.575473,0.733708,3,
+ 0,0,1,1.575473,0.733708,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.65022,0.744795,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.095218,1.011517,3,
+ 0,0,1,2.044472,0.955528,3,
+ 0,0,1,2.095218,1.011517,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.140232,1.072211,3,
+ 0,0,1,2.140232,1.072211,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,0.497732,3,
+ 0,1,0,2.12132,3,2.17368,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,2.12132,3,2.17368,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.12132,3,2.17368,
+ 0,1,0,2.12132,3,2.795,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.12132,3,0.205,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.795,3,0,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.12132,3,0.205,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,0.87868,3,0.82632,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.87868,3,0.205,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.87868,3,2.17368,
+ 0,1,0,0.87868,3,2.795,
+ 0,1,0,0.87868,3,0.82632,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.87868,3,0.82632,
+ 0,1,0,0.87868,3,2.17368,
+ 0,1,0,2.795,3,3,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,3,
+ 0,1,0,3,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,0.87868,3,0.205,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.87868,3,0.205,
+ 0,1,0,2.12132,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.12132,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.12132,3,3,
+ 0,1,0,2.795,3,3,
+ 0,1,0,2.795,3,3,
+ -0.537476,0.61047,0.58176,2.12132,3,3,
+ 0,0,1,2.502268,3,3,
+ 0,-1,0,2.12132,0,0.205,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,2.12132,0,0.205,
+ 0,-1,0,2.12132,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.12132,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.12132,0,3,
+ 0,-1,0,1.798369,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,1.798369,0,3,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,2.12132,0,0.82632,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.12132,0,0.205,
+ 0,-1,0,0.87868,0,2.17368,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.87868,0,0.82632,
+ 0,-1,0,0.205,0,3,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,3,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.87868,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.87868,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.87868,0,3,
+ 0,-1,0,0.205,0,3,
+ 0,-0.83205,0.5547,0.205,0,3,
+ 0.412538,-0.617407,0.669792,0.87868,0,3,
+ 0,0,1,0.497732,0,3,
+ 0,-1,0,0.87868,0,0.205,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.497732,0,0,
+ 0,-1,0,0.87868,0,0.205,
+ 0,-1,0,0.87868,0,2.17368,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.87868,0,2.17368,
+ 0,-1,0,0.87868,0,2.795,
+ 0,-1,0,0.87868,0,0.82632,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.87868,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.87868,0,0.82632,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.12132,0,2.17368,
+ 0,-1,0,2.12132,0,2.795,
+ 0,0,1,1.794666,0.788613,1.5,
+ 0,0,1,2.044472,0.955528,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.044472,0.955528,1.5,
+ 0,0,1,1.794666,0.788613,1.5,
+ 0,0,1,1.862975,0.820921,1.5,
+ 0,0,1,2.044472,0.955528,1.5,
+ 0,0,1,1.862975,0.820921,1.5,
+ 0,0,1,1.927789,0.859768,1.5,
+ 0,0,1,2.044472,0.955528,1.5,
+ 0,0,1,1.927789,0.859768,1.5,
+ 0,0,1,1.988483,0.904782,1.5,
+ 0.83147,0.55557,0,1.5,1.5,0,
+ 0.707107,0.707107,0,2.044472,0.955528,1.5,
+ 0.707107,0.707107,0,2.044472,0.955528,0,
+ 0.707107,0.707107,0,2.044472,0.955528,1.5,
+ 0.83147,0.55557,0,1.5,1.5,0,
+ 0.83147,0.55557,0,1.5,1.5,1.5,
+ 0.83147,0.55557,0,1.5,1.5,1.5,
+ 0.83147,0.55557,0,1.5,1.5,0,
+ 0.707107,0.707107,0,0.955528,2.044472,0,
+ 0.83147,0.55557,0,1.5,1.5,1.5,
+ 0.707107,0.707107,0,0.955528,2.044472,0,
+ 0.707107,0.707107,0,0.955528,2.044472,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.276481,2.236844,1.5,
+ 0,0,1,1.205334,2.211387,1.5,
+ 0,0,1,1.276481,2.236844,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.34978,2.255205,1.5,
+ 0,0,1,1.34978,2.255205,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.424527,2.266292,1.5,
+ 0,0,1,1.424527,2.266292,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.5,2.27,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.820921,1.862975,1.5,
+ 0,0,1,0.788613,1.794666,1.5,
+ 0,0,1,0.820921,1.862975,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.859768,1.927789,1.5,
+ 0,0,1,0.859768,1.927789,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.904782,1.988483,1.5,
+ 0,0,1,0.904782,1.988483,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.955528,2.044472,1.5,
+ -0.382683,-0.92388,0,2.211387,1.205334,1.5,
+ -0.382683,-0.92388,0,1.5,1.5,0,
+ -0.382683,-0.92388,0,2.211387,1.205334,0,
+ -0.382683,-0.92388,0,1.5,1.5,0,
+ -0.382683,-0.92388,0,0.788613,1.794666,1.5,
+ -0.382683,-0.92388,0,0.788613,1.794666,0,
+ -0.382683,-0.92388,0,0.788613,1.794666,1.5,
+ -0.382683,-0.92388,0,1.5,1.5,0,
+ -0.382683,-0.92388,0,2.211387,1.205334,1.5,
+ -0.53272,-0.732123,0.424506,0.788613,1.794666,1.5,
+ 0.220004,0.109479,0.969336,2.211387,1.205334,1.5,
+ 0.245003,0.094681,0.964888,1.5,1.5,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.011517,2.095218,1.5,
+ 0,0,1,0.955528,2.044472,1.5,
+ 0,0,1,1.011517,2.095218,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.072211,2.140232,1.5,
+ 0,0,1,1.072211,2.140232,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.137025,2.179079,1.5,
+ 0,0,1,1.137025,2.179079,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.205334,2.211387,1.5,
+ 0,0,1,1.276481,0.763156,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.205334,0.788613,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.276481,0.763156,1.5,
+ 0,0,1,1.34978,0.744795,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.34978,0.744795,1.5,
+ 0,0,1,1.424527,0.733708,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.424527,0.733708,1.5,
+ 0,0,1,1.5,0.73,1.5,
+ 0.92388,0.382683,0,1.5,1.5,0,
+ 0.92388,0.382683,0,1.794666,0.788613,1.5,
+ 0.92388,0.382683,0,1.794666,0.788613,0,
+ 0.92388,0.382683,0,1.794666,0.788613,1.5,
+ 0.92388,0.382683,0,1.5,1.5,0,
+ 0.92388,0.382683,0,1.5,1.5,1.5,
+ 0.92388,0.382683,0,1.5,1.5,1.5,
+ 0.92388,0.382683,0,1.5,1.5,0,
+ 0.92388,0.382683,0,1.205334,2.211387,0,
+ 0.92388,0.382683,0,1.5,1.5,1.5,
+ 0.92388,0.382683,0,1.205334,2.211387,0,
+ 0.92388,0.382683,0,1.205334,2.211387,1.5,
+ 0,0,1,1.575473,0.733708,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.5,0.73,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.575473,0.733708,1.5,
+ 0,0,1,1.794666,0.788613,1.5,
+ 0,0,1,1.794666,0.788613,1.5,
+ 0,0,1,1.575473,0.733708,1.5,
+ 0,0,1,1.65022,0.744795,1.5,
+ 0,0,1,1.794666,0.788613,1.5,
+ 0,0,1,1.65022,0.744795,1.5,
+ 0,0,1,1.723519,0.763156,1.5,
+ 0,0,1,2.044472,2.044472,1.5,
+ 0,0,1,1.794666,2.211387,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.794666,2.211387,1.5,
+ 0,0,1,2.044472,2.044472,1.5,
+ 0,0,1,1.862975,2.179079,1.5,
+ 0,0,1,1.862975,2.179079,1.5,
+ 0,0,1,2.044472,2.044472,1.5,
+ 0,0,1,1.927789,2.140232,1.5,
+ 0,0,1,1.927789,2.140232,1.5,
+ 0,0,1,2.044472,2.044472,1.5,
+ 0,0,1,1.988483,2.095218,1.5,
+ 1,0,0,1.5,1.5,0,
+ 1,0,0,1.5,0.73,1.5,
+ 1,0,0,1.5,0.73,0,
+ 1,0,0,1.5,0.73,1.5,
+ 1,0,0,1.5,1.5,0,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,1.5,0,
+ 1,0,0,1.5,2.27,0,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,2.27,0,
+ 1,0,0,1.5,2.27,1.5,
+ 0,0,1,0.820921,1.137025,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.788613,1.205334,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.820921,1.137025,1.5,
+ 0,0,1,0.859768,1.072211,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.859768,1.072211,1.5,
+ 0,0,1,0.904782,1.011517,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.904782,1.011517,1.5,
+ 0,0,1,0.955528,0.955528,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.575473,2.266292,1.5,
+ 0,0,1,1.5,2.27,1.5,
+ 0,0,1,1.575473,2.266292,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.794666,2.211387,1.5,
+ 0,0,1,1.575473,2.266292,1.5,
+ 0,0,1,1.794666,2.211387,1.5,
+ 0,0,1,1.65022,2.255205,1.5,
+ 0,0,1,1.65022,2.255205,1.5,
+ 0,0,1,1.794666,2.211387,1.5,
+ 0,0,1,1.723519,2.236844,1.5,
+ 0.941913,-0.335858,0,1.5,1.5,0,
+ 0.92388,-0.382683,0,1.205334,0.788613,1.5,
+ 0.92388,-0.382683,0,1.205334,0.788613,0,
+ 0.92388,-0.382683,0,1.205334,0.788613,1.5,
+ 0.941913,-0.335858,0,1.5,1.5,0,
+ 0.980785,-0.19509,0,1.5,1.5,1.5,
+ 0.980785,-0.19509,0,1.5,1.5,1.5,
+ 0.941913,-0.335858,0,1.5,1.5,0,
+ 0.92388,-0.382683,0,1.794666,2.211387,0,
+ 0.980785,-0.19509,0,1.5,1.5,1.5,
+ 0.92388,-0.382683,0,1.794666,2.211387,0,
+ 0.92388,-0.382683,0,1.794666,2.211387,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,2.211387,1.794666,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.211387,1.794666,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,2.236844,1.723519,1.5,
+ 0,0,1,2.236844,1.723519,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,2.255205,1.65022,1.5,
+ 0,0,1,2.255205,1.65022,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,2.266292,1.575473,1.5,
+ 0,0,1,1.011517,0.904782,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.955528,0.955528,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.011517,0.904782,1.5,
+ 0,0,1,1.072211,0.859768,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.072211,0.859768,1.5,
+ 0,0,1,1.137025,0.820921,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.137025,0.820921,1.5,
+ 0,0,1,1.205334,0.788613,1.5,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,1.5,1.5,0,
+ 0.707107,-0.707107,0,2.044472,2.044472,0,
+ 0.707107,-0.707107,0,1.5,1.5,0,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,0.955528,0.955528,0,
+ 0.707107,-0.707107,0,0.955528,0.955528,0,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,0.955528,0.955528,1.5,
+ 0,0,1,0.955528,0.955528,1.5,
+ 0,0,1,2.044472,2.044472,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.733708,1.575473,1.5,
+ 0,0,1,0.73,1.5,1.5,
+ 0,0,1,0.733708,1.575473,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.744795,1.65022,1.5,
+ 0,0,1,0.744795,1.65022,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.763156,1.723519,1.5,
+ 0,0,1,0.763156,1.723519,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.788613,1.794666,1.5,
+ 0,0,1,2.211387,1.794666,1.5,
+ 0,0,1,2.044472,2.044472,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.044472,2.044472,1.5,
+ 0,0,1,2.211387,1.794666,1.5,
+ 0,0,1,2.095218,1.988483,1.5,
+ 0,0,1,2.095218,1.988483,1.5,
+ 0,0,1,2.211387,1.794666,1.5,
+ 0,0,1,2.140232,1.927789,1.5,
+ 0,0,1,2.140232,1.927789,1.5,
+ 0,0,1,2.211387,1.794666,1.5,
+ 0,0,1,2.179079,1.862975,1.5,
+ 0.382683,-0.92388,0,2.211387,1.794666,1.5,
+ 0.522079,-0.852897,0,1.5,1.5,0,
+ 0.382683,-0.92388,0,2.211387,1.794666,0,
+ 0.522079,-0.852897,0,1.5,1.5,0,
+ 0.382683,-0.92388,0,2.211387,1.794666,1.5,
+ 0.382683,-0.92388,0,0.788613,1.205334,1.5,
+ 0,0,-1,0.788613,1.205334,1.5,
+ 0,0,-1,2.211387,1.794666,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0.382683,-0.92388,0,0.788613,1.205334,1.5,
+ 0.382683,-0.92388,0,0.788613,1.205334,0,
+ 0.522079,-0.852897,0,1.5,1.5,0,
+ 0,0,1,0.733708,1.424527,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.73,1.5,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.733708,1.424527,1.5,
+ 0,0,1,0.744795,1.34978,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.744795,1.34978,1.5,
+ 0,0,1,0.763156,1.276481,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,0.763156,1.276481,1.5,
+ 0,0,1,0.788613,1.205334,1.5,
+ 0,0,1,2.211387,1.205334,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,1.5,1.5,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,2.211387,1.205334,1.5,
+ 0,0,1,2.236844,1.276481,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,2.236844,1.276481,1.5,
+ 0,0,1,2.255205,1.34978,1.5,
+ 0,0,1,2.27,1.5,1.5,
+ 0,0,1,2.255205,1.34978,1.5,
+ 0,0,1,2.266292,1.424527,1.5,
+ 0,1,0,0.73,1.5,1.5,
+ 0,1,0,1.5,1.5,0,
+ 0,1,0,0.73,1.5,0,
+ 0,1,0,1.5,1.5,0,
+ 0,1,0,0.73,1.5,1.5,
+ 0,1,0,1.5,1.5,1.5,
+ 0,1,0,1.5,1.5,0,
+ 0,1,0,2.27,1.5,1.5,
+ 0,1,0,2.27,1.5,0,
+ 0,1,0,2.27,1.5,1.5,
+ 0,1,0,1.5,1.5,0,
+ 0,1,0,1.5,1.5,1.5
+};
+static const struct gllist lament_model_star_d_frame = { GL_N3F_V3F, GL_TRIANGLES, 1608, lament_model_star_d_data, 0 };
+const struct gllist *lament_model_star_d = &lament_model_star_d_frame;
+
+static const float lament_model_star_u_data[] = {
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.266292,1.424527,3,
+ 0,0,1,2.255205,1.34978,3,
+ 0,0,1,2.266292,1.424527,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,0.73,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.73,1.5,3,
+ 0,0,1,0.733708,1.575473,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.733708,1.575473,3,
+ 0,0,1,0.744795,1.65022,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.988483,0.904782,3,
+ 0,0,1,1.927789,0.859768,3,
+ 0,0,1,1.988483,0.904782,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.044472,0.955528,3,
+ 0,0,1,2.044472,0.955528,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,3,0,3,
+ 0.397052,-0.725981,0.561517,3,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,-1,0,2.795,0,3,
+ 0,0,1,0.955528,0.955528,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.955528,0.955528,3,
+ 0,0,1,0.904782,1.011517,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.904782,1.011517,3,
+ 0,0,1,0.859768,1.072211,3,
+ 0,0,1,1.575473,2.266292,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,2.27,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.575473,2.266292,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.575473,2.266292,3,
+ 0,0,1,1.65022,2.255205,3,
+ 0,0,1,2.095218,1.988483,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.044472,2.044472,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.095218,1.988483,3,
+ 0,0,1,2.140232,1.927789,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.140232,1.927789,3,
+ 0,0,1,3,2.502268,3,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,3,
+ 0,-1,0,2.12132,0,2.17368,
+ 0,-1,0,2.12132,0,0.82632,
+ 0,-1,0,2.795,0,1.5,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,3,0,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,3,0,
+ 1,0,0,3,3,3,
+ 0,0,-1,2.236844,1.276481,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.211387,1.205334,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.236844,1.276481,0,
+ 0,0,-1,2.255205,1.34978,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.255205,1.34978,0,
+ 0,0,-1,3,1.201631,0,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.497732,3,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,0.497732,0,
+ -1,0,0,0,0.87868,3,
+ -1,0,0,0,0.87868,0,
+ 0,0,1,0.955528,2.044472,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0.955528,2.044472,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.955528,2.044472,3,
+ 0,0,1,1.011517,2.095218,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,1.011517,2.095218,3,
+ 0,0,1,1.072211,2.140232,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.34978,0.744795,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.34978,0.744795,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.424527,0.733708,3,
+ 0,0,1,1.424527,0.733708,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.73,3,
+ 0,0,-1,0.788613,1.205334,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0.87868,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.788613,1.205334,0,
+ 0,0,-1,0.820921,1.137025,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0.820921,1.137025,0,
+ 0,0,-1,0.859768,1.072211,0,
+ -0.56911,-0.822262,0,1.072211,0.859768,3,
+ -0.621651,-0.783294,0,1.011517,0.904782,1.5,
+ -0.541882,-0.840455,0,1.072211,0.859768,1.5,
+ -0.621651,-0.783294,0,1.011517,0.904782,1.5,
+ -0.56911,-0.822262,0,1.072211,0.859768,3,
+ -0.646965,-0.76252,0,1.011517,0.904782,3,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.179079,1.862975,0,
+ 0,0,-1,2.140232,1.927789,0,
+ 0,0,-1,2.179079,1.862975,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.211387,1.794666,0,
+ 0,0,-1,2.211387,1.794666,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,3,2.12132,0,
+ -1,0,0,1.5,3,3,
+ -1,0,0,1.5,2.27,1.5,
+ -1,0,0,1.5,2.27,3,
+ -1,0,0,1.5,2.27,1.5,
+ -1,0,0,1.5,3,3,
+ -1,0,0,1.5,2.27,0,
+ -1,0,0,1.5,2.27,0,
+ -1,0,0,1.5,3,3,
+ -1,0,0,1.5,3,0,
+ -0.408248,0.408248,-0.816497,1.5,3,0,
+ -0.727607,0.485071,0.485071,1.5,3,3,
+ 0,1,0,1.5,3,2.795,
+ -0.408248,0.408248,-0.816497,1.5,3,0,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,0.205,
+ -0.998795,0.049068,0,2.27,1.5,1.5,
+ -0.996656,0.081709,0,2.266292,1.424527,0,
+ -0.993446,0.114299,0,2.266292,1.424527,1.5,
+ -0.996656,0.081709,0,2.266292,1.424527,0,
+ -0.998795,0.049068,0,2.27,1.5,1.5,
+ -0.998795,0.049068,0,2.27,1.5,0,
+ -0.952059,0.305914,0,2.236844,1.276481,1.5,
+ -0.941544,0.33689,0,2.211387,1.205334,0,
+ -0.941544,0.33689,0,2.211387,1.205334,1.5,
+ -0.941544,0.33689,0,2.211387,1.205334,0,
+ -0.952059,0.305914,0,2.236844,1.276481,1.5,
+ -0.961565,0.274577,0,2.236844,1.276481,0,
+ -0.92388,-0.382683,0,1.794666,0.788613,3,
+ -0.92388,-0.382683,0,2.12132,0,2.795,
+ -0.92388,-0.382683,0,2.12132,0,3,
+ -0.92388,-0.382683,0,2.12132,0,2.795,
+ -0.92388,-0.382683,0,1.794666,0.788613,3,
+ -0.92388,-0.382683,0,2.12132,0,2.17368,
+ -0.92388,-0.382683,0,2.12132,0,2.17368,
+ -0.92388,-0.382683,0,1.794666,0.788613,3,
+ -0.92388,-0.382683,0,2.12132,0,0.82632,
+ -0.92388,-0.382683,0,2.12132,0,0.82632,
+ -0.92388,-0.382683,0,1.794666,0.788613,3,
+ -0.92388,-0.382683,0,2.12132,0,0.205,
+ -0.92388,-0.382683,0,2.12132,0,0.205,
+ -0.92388,-0.382683,0,1.794666,0.788613,3,
+ -0.92388,-0.382683,0,2.12132,0,0,
+ -0.92388,-0.382683,0,2.12132,0,0,
+ -0.92388,-0.382683,0,1.794666,0.788613,3,
+ -0.92388,-0.382683,0,1.794666,0.788613,0,
+ -0.767794,0.296171,-0.568133,1.794666,0.788613,0,
+ -0.446575,-0.504521,0.738938,1.794666,0.788613,3,
+ 0.066046,0.203371,-0.976872,1.794666,0.788613,1.5,
+ -0.646965,-0.76252,0,1.011517,0.904782,3,
+ -0.671559,-0.740951,0,0.955528,0.955528,1.5,
+ -0.621651,-0.783294,0,1.011517,0.904782,1.5,
+ -0.671559,-0.740951,0,0.955528,0.955528,1.5,
+ -0.646965,-0.76252,0,1.011517,0.904782,3,
+ -0.671559,-0.740951,0,0.955528,0.955528,3,
+ 0.874085,-0.485774,0,2.179079,1.137025,1.5,
+ 0.840455,-0.541882,0,2.140232,1.072211,3,
+ 0.822262,-0.56911,0,2.140232,1.072211,1.5,
+ 0.840455,-0.541882,0,2.140232,1.072211,3,
+ 0.874085,-0.485774,0,2.179079,1.137025,1.5,
+ 0.889521,-0.456893,0,2.179079,1.137025,3,
+ 0.92388,-0.382683,0,2.12132,3,0,
+ 0.92388,-0.382683,0,1.794666,2.211387,1.5,
+ 0.92388,-0.382683,0,1.794666,2.211387,0,
+ 0.92388,-0.382683,0,1.794666,2.211387,1.5,
+ 0.92388,-0.382683,0,2.12132,3,0,
+ 0.92388,-0.382683,0,1.794666,2.211387,3,
+ 0.92388,-0.382683,0,1.794666,2.211387,3,
+ 0.92388,-0.382683,0,2.12132,3,0,
+ 0.92388,-0.382683,0,2.12132,3,3,
+ 0.618034,0.412957,0.668955,2.12132,3,3,
+ 0.903634,0.27776,-0.326029,2.12132,3,0,
+ 0,1,0,2.12132,3,0.205,
+ 0.618034,0.412957,0.668955,2.12132,3,3,
+ 0,1,0,2.12132,3,0.205,
+ 0,1,0,2.12132,3,0.82632,
+ 0.618034,0.412957,0.668955,2.12132,3,3,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,2.12132,3,2.17368,
+ 0.618034,0.412957,0.668955,2.12132,3,3,
+ 0,1,0,2.12132,3,2.17368,
+ 0,1,0,2.12132,3,2.795,
+ -0.740951,-0.671559,0,2.044472,2.044472,1.5,
+ -0.76252,-0.646965,0,2.095218,1.988483,0,
+ -0.783294,-0.621651,0,2.095218,1.988483,1.5,
+ -0.76252,-0.646965,0,2.095218,1.988483,0,
+ -0.740951,-0.671559,0,2.044472,2.044472,1.5,
+ -0.740951,-0.671559,0,2.044472,2.044472,0,
+ -0.33689,0.941544,0,1.205334,2.211387,3,
+ -0.305914,0.952059,0,1.276481,2.236844,1.5,
+ -0.33689,0.941544,0,1.205334,2.211387,1.5,
+ -0.305914,0.952059,0,1.276481,2.236844,1.5,
+ -0.33689,0.941544,0,1.205334,2.211387,3,
+ -0.274577,0.961565,0,1.276481,2.236844,3,
+ 0.941544,0.33689,0,2.211387,1.794666,1.5,
+ 0.952059,0.305914,0,2.236844,1.723519,3,
+ 0.961565,0.274577,0,2.236844,1.723519,1.5,
+ 0.952059,0.305914,0,2.236844,1.723519,3,
+ 0.941544,0.33689,0,2.211387,1.794666,1.5,
+ 0.941544,0.33689,0,2.211387,1.794666,3,
+ 0.081709,-0.996656,0,1.575473,0.733708,3,
+ 0.049068,-0.998795,0,1.5,0.73,1.5,
+ 0.114299,-0.993446,0,1.575473,0.733708,1.5,
+ 0.049068,-0.998795,0,1.5,0.73,1.5,
+ 0.081709,-0.996656,0,1.575473,0.733708,3,
+ 0.049068,-0.998795,0,1.5,0.73,3,
+ 0.707107,0.707107,0,2.044472,0.955528,1.5,
+ 0.707107,0.707107,0,3,0,0,
+ 0.707107,0.707107,0,2.044472,0.955528,0,
+ 0.707107,0.707107,0,3,0,0,
+ 0.707107,0.707107,0,2.044472,0.955528,1.5,
+ 0.707107,0.707107,0,3,0,0.205,
+ 0.707107,0.707107,0,3,0,0.205,
+ 0.707107,0.707107,0,2.044472,0.955528,1.5,
+ 0.707107,0.707107,0,3,0,1.5,
+ 0.707107,0.707107,0,3,0,1.5,
+ 0.707107,0.707107,0,2.044472,0.955528,1.5,
+ 0.707107,0.707107,0,2.044472,0.955528,3,
+ 0.707107,0.707107,0,3,0,1.5,
+ 0.707107,0.707107,0,2.044472,0.955528,3,
+ 0.707107,0.707107,0,3,0,2.795,
+ 0.707107,0.707107,0,3,0,2.795,
+ 0.707107,0.707107,0,2.044472,0.955528,3,
+ 0.707107,0.707107,0,3,0,3,
+ -0.783294,-0.621651,0,2.095218,1.988483,1.5,
+ -0.822262,-0.56911,0,2.140232,1.927789,0,
+ -0.840455,-0.541882,0,2.140232,1.927789,1.5,
+ -0.822262,-0.56911,0,2.140232,1.927789,0,
+ -0.783294,-0.621651,0,2.095218,1.988483,1.5,
+ -0.76252,-0.646965,0,2.095218,1.988483,0,
+ 0.983848,0.179005,0,2.255205,1.65022,1.5,
+ 0.993446,0.114299,0,2.266292,1.575473,3,
+ 0.996656,0.081709,0,2.266292,1.575473,1.5,
+ 0.993446,0.114299,0,2.266292,1.575473,3,
+ 0.983848,0.179005,0,2.255205,1.65022,1.5,
+ 0.97746,0.211123,0,2.255205,1.65022,3,
+ 0.33689,0.941544,0,1.205334,0.788613,1.5,
+ 0.305914,0.952059,0,1.276481,0.763156,0,
+ 0.33689,0.941544,0,1.205334,0.788613,0,
+ 0.305914,0.952059,0,1.276481,0.763156,0,
+ 0.33689,0.941544,0,1.205334,0.788613,1.5,
+ 0.274577,0.961565,0,1.276481,0.763156,1.5,
+ -0.179005,-0.983848,0,1.65022,2.255205,1.5,
+ -0.114299,-0.993446,0,1.575473,2.266292,0,
+ -0.211123,-0.97746,0,1.65022,2.255205,0,
+ -0.114299,-0.993446,0,1.575473,2.266292,0,
+ -0.179005,-0.983848,0,1.65022,2.255205,1.5,
+ -0.081709,-0.996656,0,1.575473,2.266292,1.5,
+ -0.274577,-0.961565,0,1.723519,2.236844,1.5,
+ -0.211123,-0.97746,0,1.65022,2.255205,0,
+ -0.305914,-0.952059,0,1.723519,2.236844,0,
+ -0.211123,-0.97746,0,1.65022,2.255205,0,
+ -0.274577,-0.961565,0,1.723519,2.236844,1.5,
+ -0.179005,-0.983848,0,1.65022,2.255205,1.5,
+ -0.081709,-0.996656,0,1.575473,2.266292,1.5,
+ -0.049068,-0.998795,0,1.5,2.27,0,
+ -0.114299,-0.993446,0,1.575473,2.266292,0,
+ -0.049068,-0.998795,0,1.5,2.27,0,
+ -0.081709,-0.996656,0,1.575473,2.266292,1.5,
+ -0.049068,-0.998795,0,1.5,2.27,1.5,
+ 0.76252,0.646965,0,0.904782,1.011517,0,
+ 0.740951,0.671559,0,0.955528,0.955528,1.5,
+ 0.740951,0.671559,0,0.955528,0.955528,0,
+ 0.740951,0.671559,0,0.955528,0.955528,1.5,
+ 0.76252,0.646965,0,0.904782,1.011517,0,
+ 0.783294,0.621651,0,0.904782,1.011517,1.5,
+ -0.889521,0.456893,0,0.820921,1.862975,3,
+ -0.903989,0.427555,0,0.788613,1.794666,1.5,
+ -0.903989,0.427555,0,0.788613,1.794666,3,
+ -0.903989,0.427555,0,0.788613,1.794666,1.5,
+ -0.889521,0.456893,0,0.820921,1.862975,3,
+ -0.874085,0.485774,0,0.820921,1.862975,1.5,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,1.798369,0,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.12132,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.723519,2.236844,0,
+ 0,0,-1,1.65022,2.255205,0,
+ 0,0,-1,1.723519,2.236844,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.794666,2.211387,0,
+ 0,0,-1,1.794666,2.211387,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.862975,0.820921,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.794666,0.788613,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.862975,0.820921,0,
+ 0,0,-1,1.927789,0.859768,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.927789,0.859768,0,
+ 0,0,-1,2.502268,0,0,
+ -0.382683,0.92388,0,0,0.87868,3,
+ -0.382683,0.92388,0,0.788613,1.205334,0,
+ -0.382683,0.92388,0,0,0.87868,0,
+ -0.382683,0.92388,0,0.788613,1.205334,0,
+ -0.382683,0.92388,0,0,0.87868,3,
+ -0.382683,0.92388,0,0.788613,1.205334,1.5,
+ -0.382683,0.92388,0,0.788613,1.205334,1.5,
+ -0.382683,0.92388,0,0,0.87868,3,
+ -0.382683,0.92388,0,0.788613,1.205334,3,
+ 0,-1,0,0.73,1.5,1.5,
+ 0,-1,0,0,1.5,0,
+ 0,-1,0,0.73,1.5,0,
+ 0,-1,0,0,1.5,0,
+ 0,-1,0,0.73,1.5,1.5,
+ 0,-1,0,0,1.5,3,
+ 0,-1,0,0,1.5,3,
+ 0,-1,0,0.73,1.5,1.5,
+ 0,-1,0,0.73,1.5,3,
+ -0.707107,0.707107,0,2.044472,2.044472,1.5,
+ -0.707107,0.707107,0,3,3,0,
+ -0.707107,0.707107,0,2.044472,2.044472,0,
+ -0.707107,0.707107,0,3,3,0,
+ -0.707107,0.707107,0,2.044472,2.044472,1.5,
+ -0.707107,0.707107,0,3,3,3,
+ -0.707107,0.707107,0,3,3,3,
+ -0.707107,0.707107,0,2.044472,2.044472,1.5,
+ -0.707107,0.707107,0,2.044472,2.044472,3,
+ -0.382683,-0.92388,0,3,0.87868,3,
+ -0.382683,-0.92388,0,2.211387,1.205334,0,
+ -0.382683,-0.92388,0,3,0.87868,0,
+ -0.382683,-0.92388,0,2.211387,1.205334,0,
+ -0.382683,-0.92388,0,3,0.87868,3,
+ -0.382683,-0.92388,0,2.211387,1.205334,1.5,
+ -0.382683,-0.92388,0,2.211387,1.205334,1.5,
+ -0.382683,-0.92388,0,3,0.87868,3,
+ -0.382683,-0.92388,0,2.211387,1.205334,3,
+ -0.427555,-0.903989,0,1.205334,0.788613,3,
+ -0.456893,-0.889521,0,1.137025,0.820921,1.5,
+ -0.427555,-0.903989,0,1.205334,0.788613,1.5,
+ -0.456893,-0.889521,0,1.137025,0.820921,1.5,
+ -0.427555,-0.903989,0,1.205334,0.788613,3,
+ -0.485774,-0.874085,0,1.137025,0.820921,3,
+ 0.92388,0.382683,0,0.87868,3,0,
+ 0.92388,0.382683,0,1.205334,2.211387,1.5,
+ 0.92388,0.382683,0,1.205334,2.211387,0,
+ 0.92388,0.382683,0,1.205334,2.211387,1.5,
+ 0.92388,0.382683,0,0.87868,3,0,
+ 0.92388,0.382683,0,1.205334,2.211387,3,
+ 0.92388,0.382683,0,1.205334,2.211387,3,
+ 0.92388,0.382683,0,0.87868,3,0,
+ 0.92388,0.382683,0,0.87868,3,3,
+ 0.269347,0.403107,0.874618,0.87868,3,3,
+ 0.537476,0.61047,-0.58176,0.87868,3,0,
+ 0,1,0,0.87868,3,0.205,
+ 0.269347,0.403107,0.874618,0.87868,3,3,
+ 0,1,0,0.87868,3,0.205,
+ 0,1,0,0.87868,3,0.82632,
+ 0.269347,0.403107,0.874618,0.87868,3,3,
+ 0,1,0,0.87868,3,0.82632,
+ 0,1,0,0.87868,3,2.17368,
+ 0.269347,0.403107,0.874618,0.87868,3,3,
+ 0,1,0,0.87868,3,2.17368,
+ 0,1,0,0.87868,3,2.795,
+ -0.740951,0.671559,0,0.955528,2.044472,3,
+ -0.76252,0.646965,0,0.904782,1.988483,1.5,
+ -0.783294,0.621651,0,0.904782,1.988483,3,
+ -0.76252,0.646965,0,0.904782,1.988483,1.5,
+ -0.740951,0.671559,0,0.955528,2.044472,3,
+ -0.740951,0.671559,0,0.955528,2.044472,1.5,
+ -0.993446,-0.114299,0,0.733708,1.424527,3,
+ -0.983848,-0.179005,0,0.744795,1.34978,1.5,
+ -0.97746,-0.211123,0,0.744795,1.34978,3,
+ -0.983848,-0.179005,0,0.744795,1.34978,1.5,
+ -0.993446,-0.114299,0,0.733708,1.424527,3,
+ -0.996656,-0.081709,0,0.733708,1.424527,1.5,
+ -0.707107,-0.707107,0,0,3,3,
+ -0.707107,-0.707107,0,0.955528,2.044472,1.5,
+ -0.707107,-0.707107,0,0.955528,2.044472,3,
+ -0.707107,-0.707107,0,0.955528,2.044472,1.5,
+ -0.707107,-0.707107,0,0,3,3,
+ -0.707107,-0.707107,0,0.955528,2.044472,0,
+ -0.707107,-0.707107,0,0.955528,2.044472,0,
+ -0.707107,-0.707107,0,0,3,3,
+ -0.707107,-0.707107,0,0,3,0,
+ -0.561517,0.232588,-0.794104,0,3,0,
+ -0.903326,-0.051662,0.425832,0,3,3,
+ 0,1,0,0,3,2.795,
+ -0.561517,0.232588,-0.794104,0,3,0,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0,3,1.5,
+ -0.561517,0.232588,-0.794104,0,3,0,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0,3,0.205,
+ 0,0,-1,2.044472,2.044472,1.5,
+ 0,0,-1,2.211387,1.794666,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.211387,1.794666,1.5,
+ 0,0,-1,2.044472,2.044472,1.5,
+ 0,0,-1,2.095218,1.988483,1.5,
+ 0,0,-1,2.211387,1.794666,1.5,
+ 0,0,-1,2.095218,1.988483,1.5,
+ 0,0,-1,2.140232,1.927789,1.5,
+ 0,0,-1,2.211387,1.794666,1.5,
+ 0,0,-1,2.140232,1.927789,1.5,
+ 0,0,-1,2.179079,1.862975,1.5,
+ 0.274577,-0.961565,0,1.723519,0.763156,3,
+ 0.211123,-0.97746,0,1.65022,0.744795,1.5,
+ 0.305914,-0.952059,0,1.723519,0.763156,1.5,
+ 0.211123,-0.97746,0,1.65022,0.744795,1.5,
+ 0.274577,-0.961565,0,1.723519,0.763156,3,
+ 0.179005,-0.983848,0,1.65022,0.744795,3,
+ 0.874085,0.485774,0,0.820921,1.137025,0,
+ 0.840455,0.541882,0,0.859768,1.072211,1.5,
+ 0.822262,0.56911,0,0.859768,1.072211,0,
+ 0.840455,0.541882,0,0.859768,1.072211,1.5,
+ 0.874085,0.485774,0,0.820921,1.137025,0,
+ 0.889521,0.456893,0,0.820921,1.137025,1.5,
+ 0.822262,-0.56911,0,2.140232,1.072211,1.5,
+ 0.783294,-0.621651,0,2.095218,1.011517,3,
+ 0.76252,-0.646965,0,2.095218,1.011517,1.5,
+ 0.783294,-0.621651,0,2.095218,1.011517,3,
+ 0.822262,-0.56911,0,2.140232,1.072211,1.5,
+ 0.840455,-0.541882,0,2.140232,1.072211,3,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.072211,2.140232,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.072211,2.140232,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.137025,2.179079,0,
+ 0,0,-1,1.137025,2.179079,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.205334,2.211387,0,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.87868,0,0.82632,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.87868,0,0.82632,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.87868,0,2.17368,
+ 1,0,0,1.5,0.73,0,
+ 1,0,0,1.5,0,0.205,
+ 1,0,0,1.5,0,0,
+ 1,0,0,1.5,0,0.205,
+ 1,0,0,1.5,0.73,0,
+ 1,0,0,1.5,0,2.795,
+ 1,0,0,1.5,0,2.795,
+ 1,0,0,1.5,0.73,0,
+ 1,0,0,1.5,0,3,
+ 1,0,0,1.5,0,3,
+ 1,0,0,1.5,0.73,0,
+ 1,0,0,1.5,0.73,3,
+ 0.694147,-0.227384,0.682976,1.5,0.73,3,
+ 0.878025,0.427983,-0.21425,1.5,0.73,0,
+ 0.341066,-0.296944,-0.891907,1.5,0.73,1.5,
+ -0.993446,0.114299,0,2.266292,1.424527,1.5,
+ -0.983848,0.179005,0,2.255205,1.34978,0,
+ -0.97746,0.211123,0,2.255205,1.34978,1.5,
+ -0.983848,0.179005,0,2.255205,1.34978,0,
+ -0.993446,0.114299,0,2.266292,1.424527,1.5,
+ -0.996656,0.081709,0,2.266292,1.424527,0,
+ 0.961565,0.274577,0,2.236844,1.723519,1.5,
+ 0.97746,0.211123,0,2.255205,1.65022,3,
+ 0.983848,0.179005,0,2.255205,1.65022,1.5,
+ 0.97746,0.211123,0,2.255205,1.65022,3,
+ 0.961565,0.274577,0,2.236844,1.723519,1.5,
+ 0.952059,0.305914,0,2.236844,1.723519,3,
+ -0.274577,0.961565,0,1.276481,2.236844,3,
+ -0.211123,0.97746,0,1.34978,2.255205,1.5,
+ -0.305914,0.952059,0,1.276481,2.236844,1.5,
+ -0.211123,0.97746,0,1.34978,2.255205,1.5,
+ -0.274577,0.961565,0,1.276481,2.236844,3,
+ -0.179005,0.983848,0,1.34978,2.255205,3,
+ 0.903989,-0.427555,0,2.211387,1.205334,1.5,
+ 0.889521,-0.456893,0,2.179079,1.137025,3,
+ 0.874085,-0.485774,0,2.179079,1.137025,1.5,
+ 0.889521,-0.456893,0,2.179079,1.137025,3,
+ 0.903989,-0.427555,0,2.211387,1.205334,1.5,
+ 0.903989,-0.427555,0,2.211387,1.205334,3,
+ 0.646965,0.76252,0,1.988483,2.095218,3,
+ 0.671559,0.740951,0,2.044472,2.044472,1.5,
+ 0.621651,0.783294,0,1.988483,2.095218,1.5,
+ 0.671559,0.740951,0,2.044472,2.044472,1.5,
+ 0.646965,0.76252,0,1.988483,2.095218,3,
+ 0.671559,0.740951,0,2.044472,2.044472,3,
+ -0.081709,0.996656,0,1.424527,2.266292,3,
+ -0.049068,0.998795,0,1.5,2.27,1.5,
+ -0.114299,0.993446,0,1.424527,2.266292,1.5,
+ -0.049068,0.998795,0,1.5,2.27,1.5,
+ -0.081709,0.996656,0,1.424527,2.266292,3,
+ -0.049068,0.998795,0,1.5,2.27,3,
+ 0.427555,0.903989,0,1.794666,2.211387,3,
+ 0.456893,0.889521,0,1.862975,2.179079,1.5,
+ 0.427555,0.903989,0,1.794666,2.211387,1.5,
+ 0.456893,0.889521,0,1.862975,2.179079,1.5,
+ 0.427555,0.903989,0,1.794666,2.211387,3,
+ 0.485774,0.874085,0,1.862975,2.179079,3,
+ 0,1,0,2.27,1.5,1.5,
+ 0,1,0,3,1.5,0,
+ 0,1,0,2.27,1.5,0,
+ 0,1,0,3,1.5,0,
+ 0,1,0,2.27,1.5,1.5,
+ 0,1,0,3,1.5,3,
+ 0,1,0,3,1.5,3,
+ 0,1,0,2.27,1.5,1.5,
+ 0,1,0,2.27,1.5,3,
+ 0.996656,-0.081709,0,0.733708,1.575473,0,
+ 0.998795,-0.049068,0,0.73,1.5,1.5,
+ 0.998795,-0.049068,0,0.73,1.5,0,
+ 0.998795,-0.049068,0,0.73,1.5,1.5,
+ 0.996656,-0.081709,0,0.733708,1.575473,0,
+ 0.993446,-0.114299,0,0.733708,1.575473,1.5,
+ -0.840455,0.541882,0,0.859768,1.927789,3,
+ -0.874085,0.485774,0,0.820921,1.862975,1.5,
+ -0.889521,0.456893,0,0.820921,1.862975,3,
+ -0.874085,0.485774,0,0.820921,1.862975,1.5,
+ -0.840455,0.541882,0,0.859768,1.927789,3,
+ -0.822262,0.56911,0,0.859768,1.927789,1.5,
+ -0.998795,-0.049068,0,0.73,1.5,3,
+ -0.996656,-0.081709,0,0.733708,1.424527,1.5,
+ -0.993446,-0.114299,0,0.733708,1.424527,3,
+ -0.996656,-0.081709,0,0.733708,1.424527,1.5,
+ -0.998795,-0.049068,0,0.73,1.5,3,
+ -0.998795,-0.049068,0,0.73,1.5,1.5,
+ -0.97746,-0.211123,0,0.744795,1.34978,3,
+ -0.961565,-0.274577,0,0.763156,1.276481,1.5,
+ -0.952059,-0.305914,0,0.763156,1.276481,3,
+ -0.961565,-0.274577,0,0.763156,1.276481,1.5,
+ -0.97746,-0.211123,0,0.744795,1.34978,3,
+ -0.983848,-0.179005,0,0.744795,1.34978,1.5,
+ 0.961565,-0.274577,0,0.763156,1.723519,0,
+ 0.97746,-0.211123,0,0.744795,1.65022,1.5,
+ 0.983848,-0.179005,0,0.744795,1.65022,0,
+ 0.97746,-0.211123,0,0.744795,1.65022,1.5,
+ 0.961565,-0.274577,0,0.763156,1.723519,0,
+ 0.952059,-0.305914,0,0.763156,1.723519,1.5,
+ 0.33689,-0.941544,0,1.794666,0.788613,3,
+ 0.305914,-0.952059,0,1.723519,0.763156,1.5,
+ 0.33689,-0.941544,0,1.794666,0.788613,1.5,
+ 0.305914,-0.952059,0,1.723519,0.763156,1.5,
+ 0.33689,-0.941544,0,1.794666,0.788613,3,
+ 0.274577,-0.961565,0,1.723519,0.763156,3,
+ 0.707107,-0.707107,0,0.955528,0.955528,0,
+ 0.707107,-0.707107,0,0,0,3,
+ 0.707107,-0.707107,0,0,0,0,
+ 0.707107,-0.707107,0,0,0,3,
+ 0.707107,-0.707107,0,0.955528,0.955528,0,
+ 0.707107,-0.707107,0,0.955528,0.955528,3,
+ 0.282725,-0.558186,0.780061,0.955528,0.955528,3,
+ 0.865795,-0.298347,-0.401731,0.955528,0.955528,0,
+ 0.362971,-0.362971,-0.858198,0.955528,0.955528,1.5,
+ 0.646965,-0.76252,0,1.011517,2.095218,1.5,
+ 0.671559,-0.740951,0,0.955528,2.044472,0,
+ 0.621651,-0.783294,0,1.011517,2.095218,0,
+ 0.671559,-0.740951,0,0.955528,2.044472,0,
+ 0.646965,-0.76252,0,1.011517,2.095218,1.5,
+ 0.671559,-0.740951,0,0.955528,2.044472,1.5,
+ -0.485774,0.874085,0,1.862975,0.820921,1.5,
+ -0.541882,0.840455,0,1.927789,0.859768,0,
+ -0.456893,0.889521,0,1.862975,0.820921,0,
+ -0.541882,0.840455,0,1.927789,0.859768,0,
+ -0.485774,0.874085,0,1.862975,0.820921,1.5,
+ -0.56911,0.822262,0,1.927789,0.859768,1.5,
+ -0.97746,0.211123,0,2.255205,1.34978,1.5,
+ -0.961565,0.274577,0,2.236844,1.276481,0,
+ -0.952059,0.305914,0,2.236844,1.276481,1.5,
+ -0.961565,0.274577,0,2.236844,1.276481,0,
+ -0.97746,0.211123,0,2.255205,1.34978,1.5,
+ -0.983848,0.179005,0,2.255205,1.34978,0,
+ -0.427555,0.903989,0,1.794666,0.788613,1.5,
+ -0.456893,0.889521,0,1.862975,0.820921,0,
+ -0.427555,0.903989,0,1.794666,0.788613,0,
+ -0.456893,0.889521,0,1.862975,0.820921,0,
+ -0.427555,0.903989,0,1.794666,0.788613,1.5,
+ -0.485774,0.874085,0,1.862975,0.820921,1.5,
+ 0.081709,0.996656,0,1.424527,0.733708,1.5,
+ 0.049068,0.998795,0,1.5,0.73,0,
+ 0.114299,0.993446,0,1.424527,0.733708,0,
+ 0.049068,0.998795,0,1.5,0.73,0,
+ 0.081709,0.996656,0,1.424527,0.733708,1.5,
+ 0.049068,0.998795,0,1.5,0.73,1.5,
+ -0.485774,-0.874085,0,1.137025,0.820921,3,
+ -0.541882,-0.840455,0,1.072211,0.859768,1.5,
+ -0.456893,-0.889521,0,1.137025,0.820921,1.5,
+ -0.541882,-0.840455,0,1.072211,0.859768,1.5,
+ -0.485774,-0.874085,0,1.137025,0.820921,3,
+ -0.56911,-0.822262,0,1.072211,0.859768,3,
+ 0.485774,-0.874085,0,1.137025,2.179079,1.5,
+ 0.541882,-0.840455,0,1.072211,2.140232,0,
+ 0.456893,-0.889521,0,1.137025,2.179079,0,
+ 0.541882,-0.840455,0,1.072211,2.140232,0,
+ 0.485774,-0.874085,0,1.137025,2.179079,1.5,
+ 0.56911,-0.822262,0,1.072211,2.140232,1.5,
+ -0.92388,0.382683,0,0.87868,0,0.205,
+ -0.92388,0.382683,0,1.205334,0.788613,0,
+ -0.92388,0.382683,0,0.87868,0,0,
+ -0.92388,0.382683,0,1.205334,0.788613,0,
+ -0.92388,0.382683,0,0.87868,0,0.205,
+ -0.92388,0.382683,0,0.87868,0,0.82632,
+ -0.92388,0.382683,0,1.205334,0.788613,0,
+ -0.92388,0.382683,0,0.87868,0,0.82632,
+ -0.92388,0.382683,0,0.87868,0,2.17368,
+ -0.92388,0.382683,0,1.205334,0.788613,0,
+ -0.92388,0.382683,0,0.87868,0,2.17368,
+ -0.92388,0.382683,0,0.87868,0,2.795,
+ -0.92388,0.382683,0,1.205334,0.788613,0,
+ -0.92388,0.382683,0,0.87868,0,2.795,
+ -0.92388,0.382683,0,0.87868,0,3,
+ -0.92388,0.382683,0,1.205334,0.788613,0,
+ -0.92388,0.382683,0,0.87868,0,3,
+ -0.92388,0.382683,0,1.205334,0.788613,3,
+ -0.807325,0.502043,-0.310129,1.205334,0.788613,0,
+ 0.015077,-0.480291,0.876979,1.205334,0.788613,3,
+ 0.489038,0.249268,-0.835887,1.205334,0.788613,1.5,
+ 0.76252,-0.646965,0,2.095218,1.011517,1.5,
+ 0.740951,-0.671559,0,2.044472,0.955528,3,
+ 0.740951,-0.671559,0,2.044472,0.955528,1.5,
+ 0.740951,-0.671559,0,2.044472,0.955528,3,
+ 0.76252,-0.646965,0,2.095218,1.011517,1.5,
+ 0.783294,-0.621651,0,2.095218,1.011517,3,
+ 0.485774,0.874085,0,1.862975,2.179079,3,
+ 0.541882,0.840455,0,1.927789,2.140232,1.5,
+ 0.456893,0.889521,0,1.862975,2.179079,1.5,
+ 0.541882,0.840455,0,1.927789,2.140232,1.5,
+ 0.485774,0.874085,0,1.862975,2.179079,3,
+ 0.56911,0.822262,0,1.927789,2.140232,3,
+ 0.382683,-0.92388,0,3,2.12132,3,
+ 0.382683,-0.92388,0,2.211387,1.794666,0,
+ 0.382683,-0.92388,0,3,2.12132,0,
+ 0.382683,-0.92388,0,2.211387,1.794666,0,
+ 0.382683,-0.92388,0,3,2.12132,3,
+ 0.382683,-0.92388,0,2.211387,1.794666,1.5,
+ 0.382683,-0.92388,0,2.211387,1.794666,1.5,
+ 0.382683,-0.92388,0,3,2.12132,3,
+ 0.382683,-0.92388,0,2.211387,1.794666,3,
+ 0.179005,-0.983848,0,1.65022,0.744795,3,
+ 0.114299,-0.993446,0,1.575473,0.733708,1.5,
+ 0.211123,-0.97746,0,1.65022,0.744795,1.5,
+ 0.114299,-0.993446,0,1.575473,0.733708,1.5,
+ 0.179005,-0.983848,0,1.65022,0.744795,3,
+ 0.081709,-0.996656,0,1.575473,0.733708,3,
+ -0.952059,-0.305914,0,0.763156,1.276481,3,
+ -0.941544,-0.33689,0,0.788613,1.205334,1.5,
+ -0.941544,-0.33689,0,0.788613,1.205334,3,
+ -0.941544,-0.33689,0,0.788613,1.205334,1.5,
+ -0.952059,-0.305914,0,0.763156,1.276481,3,
+ -0.961565,-0.274577,0,0.763156,1.276481,1.5,
+ 0.274577,0.961565,0,1.276481,0.763156,1.5,
+ 0.211123,0.97746,0,1.34978,0.744795,0,
+ 0.305914,0.952059,0,1.276481,0.763156,0,
+ 0.211123,0.97746,0,1.34978,0.744795,0,
+ 0.274577,0.961565,0,1.276481,0.763156,1.5,
+ 0.179005,0.983848,0,1.34978,0.744795,1.5,
+ 0.996656,0.081709,0,2.266292,1.575473,1.5,
+ 0.998795,0.049068,0,2.27,1.5,3,
+ 0.998795,0.049068,0,2.27,1.5,1.5,
+ 0.998795,0.049068,0,2.27,1.5,3,
+ 0.996656,0.081709,0,2.266292,1.575473,1.5,
+ 0.993446,0.114299,0,2.266292,1.575473,3,
+ 0.983848,-0.179005,0,0.744795,1.65022,0,
+ 0.993446,-0.114299,0,0.733708,1.575473,1.5,
+ 0.996656,-0.081709,0,0.733708,1.575473,0,
+ 0.993446,-0.114299,0,0.733708,1.575473,1.5,
+ 0.983848,-0.179005,0,0.744795,1.65022,0,
+ 0.97746,-0.211123,0,0.744795,1.65022,1.5,
+ 0.903989,0.427555,0,0.788613,1.205334,0,
+ 0.889521,0.456893,0,0.820921,1.137025,1.5,
+ 0.874085,0.485774,0,0.820921,1.137025,0,
+ 0.889521,0.456893,0,0.820921,1.137025,1.5,
+ 0.903989,0.427555,0,0.788613,1.205334,0,
+ 0.903989,0.427555,0,0.788613,1.205334,1.5,
+ 0.427555,-0.903989,0,1.205334,2.211387,1.5,
+ 0.456893,-0.889521,0,1.137025,2.179079,0,
+ 0.427555,-0.903989,0,1.205334,2.211387,0,
+ 0.456893,-0.889521,0,1.137025,2.179079,0,
+ 0.427555,-0.903989,0,1.205334,2.211387,1.5,
+ 0.485774,-0.874085,0,1.137025,2.179079,1.5,
+ -0.33689,-0.941544,0,1.794666,2.211387,1.5,
+ -0.305914,-0.952059,0,1.723519,2.236844,0,
+ -0.33689,-0.941544,0,1.794666,2.211387,0,
+ -0.305914,-0.952059,0,1.723519,2.236844,0,
+ -0.33689,-0.941544,0,1.794666,2.211387,1.5,
+ -0.274577,-0.961565,0,1.723519,2.236844,1.5,
+ -0.889521,-0.456893,0,2.179079,1.862975,1.5,
+ -0.903989,-0.427555,0,2.211387,1.794666,0,
+ -0.903989,-0.427555,0,2.211387,1.794666,1.5,
+ -0.903989,-0.427555,0,2.211387,1.794666,0,
+ -0.889521,-0.456893,0,2.179079,1.862975,1.5,
+ -0.874085,-0.485774,0,2.179079,1.862975,0,
+ -0.56911,0.822262,0,1.927789,0.859768,1.5,
+ -0.621651,0.783294,0,1.988483,0.904782,0,
+ -0.541882,0.840455,0,1.927789,0.859768,0,
+ -0.621651,0.783294,0,1.988483,0.904782,0,
+ -0.56911,0.822262,0,1.927789,0.859768,1.5,
+ -0.646965,0.76252,0,1.988483,0.904782,1.5,
+ 0.56911,-0.822262,0,1.072211,2.140232,1.5,
+ 0.621651,-0.783294,0,1.011517,2.095218,0,
+ 0.541882,-0.840455,0,1.072211,2.140232,0,
+ 0.621651,-0.783294,0,1.011517,2.095218,0,
+ 0.56911,-0.822262,0,1.072211,2.140232,1.5,
+ 0.646965,-0.76252,0,1.011517,2.095218,1.5,
+ 0.179005,0.983848,0,1.34978,0.744795,1.5,
+ 0.114299,0.993446,0,1.424527,0.733708,0,
+ 0.211123,0.97746,0,1.34978,0.744795,0,
+ 0.114299,0.993446,0,1.424527,0.733708,0,
+ 0.179005,0.983848,0,1.34978,0.744795,1.5,
+ 0.081709,0.996656,0,1.424527,0.733708,1.5,
+ 0.56911,0.822262,0,1.927789,2.140232,3,
+ 0.621651,0.783294,0,1.988483,2.095218,1.5,
+ 0.541882,0.840455,0,1.927789,2.140232,1.5,
+ 0.621651,0.783294,0,1.988483,2.095218,1.5,
+ 0.56911,0.822262,0,1.927789,2.140232,3,
+ 0.646965,0.76252,0,1.988483,2.095218,3,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.5,3,
+ 0.822262,0.56911,0,0.859768,1.072211,0,
+ 0.783294,0.621651,0,0.904782,1.011517,1.5,
+ 0.76252,0.646965,0,0.904782,1.011517,0,
+ 0.783294,0.621651,0,0.904782,1.011517,1.5,
+ 0.822262,0.56911,0,0.859768,1.072211,0,
+ 0.840455,0.541882,0,0.859768,1.072211,1.5,
+ 0.941544,-0.33689,0,0.788613,1.794666,0,
+ 0.952059,-0.305914,0,0.763156,1.723519,1.5,
+ 0.961565,-0.274577,0,0.763156,1.723519,0,
+ 0.952059,-0.305914,0,0.763156,1.723519,1.5,
+ 0.941544,-0.33689,0,0.788613,1.794666,0,
+ 0.941544,-0.33689,0,0.788613,1.794666,1.5,
+ 0,0,-1,0.788613,1.794666,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.788613,1.794666,0,
+ 0,0,-1,0.763156,1.723519,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0.763156,1.723519,0,
+ 0,0,-1,0.744795,1.65022,0,
+ 0,0,-1,1.205334,0.788613,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,0.87868,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.205334,0.788613,0,
+ 0,0,-1,1.276481,0.763156,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.276481,0.763156,0,
+ 0,0,-1,1.34978,0.744795,0,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,2.12132,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ -0.783294,0.621651,0,0.904782,1.988483,3,
+ -0.822262,0.56911,0,0.859768,1.927789,1.5,
+ -0.840455,0.541882,0,0.859768,1.927789,3,
+ -0.822262,0.56911,0,0.859768,1.927789,1.5,
+ -0.783294,0.621651,0,0.904782,1.988483,3,
+ -0.76252,0.646965,0,0.904782,1.988483,1.5,
+ -0.179005,0.983848,0,1.34978,2.255205,3,
+ -0.114299,0.993446,0,1.424527,2.266292,1.5,
+ -0.211123,0.97746,0,1.34978,2.255205,1.5,
+ -0.114299,0.993446,0,1.424527,2.266292,1.5,
+ -0.179005,0.983848,0,1.34978,2.255205,3,
+ -0.081709,0.996656,0,1.424527,2.266292,3,
+ 0.382683,0.92388,0,0,2.12132,3,
+ 0.382683,0.92388,0,0.788613,1.794666,0,
+ 0.382683,0.92388,0,0,2.12132,0,
+ 0.382683,0.92388,0,0.788613,1.794666,0,
+ 0.382683,0.92388,0,0,2.12132,3,
+ 0.382683,0.92388,0,0.788613,1.794666,1.5,
+ 0.382683,0.92388,0,0.788613,1.794666,1.5,
+ 0.382683,0.92388,0,0,2.12132,3,
+ 0.382683,0.92388,0,0.788613,1.794666,3,
+ -0.840455,-0.541882,0,2.140232,1.927789,1.5,
+ -0.874085,-0.485774,0,2.179079,1.862975,0,
+ -0.889521,-0.456893,0,2.179079,1.862975,1.5,
+ -0.874085,-0.485774,0,2.179079,1.862975,0,
+ -0.840455,-0.541882,0,2.140232,1.927789,1.5,
+ -0.822262,-0.56911,0,2.140232,1.927789,0,
+ -0.646965,0.76252,0,1.988483,0.904782,1.5,
+ -0.671559,0.740951,0,2.044472,0.955528,0,
+ -0.621651,0.783294,0,1.988483,0.904782,0,
+ -0.671559,0.740951,0,2.044472,0.955528,0,
+ -0.646965,0.76252,0,1.988483,0.904782,1.5,
+ -0.671559,0.740951,0,2.044472,0.955528,1.5,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.733708,1.575473,3,
+ 0,0,1,0.73,1.5,3,
+ 0,0,1,0.733708,1.575473,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.744795,1.65022,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.763156,1.723519,3,
+ 0,0,1,0.744795,1.65022,3,
+ 0,0,1,0.763156,1.723519,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.788613,1.794666,3,
+ 0,0,1,1.424527,0.733708,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.34978,0.744795,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.424527,0.733708,3,
+ 0,0,1,1.5,0.73,3,
+ 0,0,1,1.276481,0.763156,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.205334,0.788613,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.276481,0.763156,3,
+ 0,0,1,1.34978,0.744795,3,
+ 0,0,1,2.140232,1.072211,3,
+ 0,0,1,2.211387,1.205334,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.211387,1.205334,3,
+ 0,0,1,2.140232,1.072211,3,
+ 0,0,1,2.179079,1.137025,3,
+ 0,0,1,1.137025,0.820921,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.072211,0.859768,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.137025,0.820921,3,
+ 0,0,1,1.205334,0.788613,3,
+ 0,0,1,1.575473,0.733708,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,0.73,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.575473,0.733708,3,
+ 0,0,1,1.65022,0.744795,3,
+ 0,0,1,1.65022,0.744795,3,
+ 0,0,1,1.794666,0.788613,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.794666,0.788613,3,
+ 0,0,1,1.65022,0.744795,3,
+ 0,0,1,1.723519,0.763156,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.788613,1.205334,3,
+ 0,0,1,0,0.87868,3,
+ 0,0,1,0.788613,1.205334,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.820921,1.137025,3,
+ 0,0,1,0.820921,1.137025,3,
+ 0,0,1,0,0.497732,3,
+ 0,0,1,0.859768,1.072211,3,
+ 0,0,1,0.904782,1.011517,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.859768,1.072211,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.904782,1.011517,3,
+ 0,0,1,0.955528,0.955528,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.820921,1.862975,3,
+ 0,0,1,0.788613,1.794666,3,
+ 0,0,1,0.820921,1.862975,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.859768,1.927789,3,
+ 0,0,1,2.211387,1.205334,3,
+ 0,0,1,2.255205,1.34978,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.255205,1.34978,3,
+ 0,0,1,2.211387,1.205334,3,
+ 0,0,1,2.236844,1.276481,3,
+ 0,0,1,1.927789,0.859768,3,
+ 0,0,1,2.044472,0.955528,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.044472,0.955528,3,
+ 0,0,1,1.927789,0.859768,3,
+ 0,0,1,1.988483,0.904782,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.236844,1.276481,3,
+ 0,0,1,2.211387,1.205334,3,
+ 0,0,1,2.236844,1.276481,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.255205,1.34978,3,
+ 0,0,1,2.255205,1.34978,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.205334,0.788613,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.205334,0.788613,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.276481,0.763156,3,
+ 0,0,1,1.276481,0.763156,3,
+ 0,0,1,1.201631,0,3,
+ 0,0,1,1.34978,0.744795,3,
+ 0,0,1,2.255205,1.65022,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,2.255205,1.65022,3,
+ 0,0,1,2.236844,1.723519,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,2.140232,1.927789,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.140232,1.927789,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,2.179079,1.862975,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,2.255205,1.65022,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.255205,1.65022,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,2.266292,1.575473,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.862975,0.820921,3,
+ 0,0,1,1.794666,0.788613,3,
+ 0,0,1,1.862975,0.820921,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.927789,0.859768,3,
+ 0,0,1,1.927789,0.859768,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.723519,2.236844,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.65022,2.255205,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.723519,2.236844,3,
+ 0,0,1,1.794666,2.211387,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.794666,2.211387,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.424527,2.266292,3,
+ 0,0,1,1.34978,2.255205,3,
+ 0,0,1,1.424527,2.266292,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.27,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.276481,2.236844,3,
+ 0,0,1,1.205334,2.211387,3,
+ 0,0,1,1.276481,2.236844,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.34978,2.255205,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.575473,2.266292,3,
+ 0,0,1,1.5,2.27,3,
+ 0,0,1,1.575473,2.266292,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.65022,2.255205,3,
+ 0,0,1,1.794666,2.211387,3,
+ 0,0,1,1.65022,2.255205,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.65022,2.255205,3,
+ 0,0,1,1.794666,2.211387,3,
+ 0,0,1,1.723519,2.236844,3,
+ 0,0,1,1.927789,2.140232,3,
+ 0,0,1,1.794666,2.211387,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.794666,2.211387,3,
+ 0,0,1,1.927789,2.140232,3,
+ 0,0,1,1.862975,2.179079,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.137025,2.179079,3,
+ 0,0,1,1.072211,2.140232,3,
+ 0,0,1,1.137025,2.179079,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.205334,2.211387,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.011517,2.095218,3,
+ 0,0,1,0.955528,2.044472,3,
+ 0,0,1,1.011517,2.095218,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.072211,2.140232,3,
+ 0,0,1,1.072211,2.140232,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.072211,2.140232,3,
+ 0,0,1,1.137025,2.179079,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.137025,2.179079,3,
+ 0,0,1,1.205334,2.211387,3,
+ 0,0,1,0.733708,1.424527,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.73,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.733708,1.424527,3,
+ 0,0,1,0.744795,1.34978,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.788613,1.794666,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.788613,1.794666,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.763156,1.723519,3,
+ 0,0,1,0.763156,1.723519,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.744795,1.65022,3,
+ 0,0,1,2.044472,2.044472,3,
+ 0,0,1,1.927789,2.140232,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.927789,2.140232,3,
+ 0,0,1,2.044472,2.044472,3,
+ 0,0,1,1.988483,2.095218,3,
+ 0,0,1,2.255205,1.34978,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.27,1.5,3,
+ 0,0,1,2.255205,1.34978,3,
+ 0,0,1,2.266292,1.424527,3,
+ 0,0,1,1.794666,0.788613,3,
+ 0,0,1,1.927789,0.859768,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.927789,0.859768,3,
+ 0,0,1,1.794666,0.788613,3,
+ 0,0,1,1.862975,0.820921,3,
+ 0,0,1,2.179079,1.862975,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.140232,1.927789,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.179079,1.862975,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.044472,0.955528,3,
+ 0,0,1,2.140232,1.072211,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.140232,1.072211,3,
+ 0,0,1,2.044472,0.955528,3,
+ 0,0,1,2.095218,1.011517,3,
+ 0,0,1,0.820921,1.137025,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.788613,1.205334,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.820921,1.137025,3,
+ 0,0,1,0.859768,1.072211,3,
+ 0,0,1,1.011517,0.904782,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.955528,0.955528,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.011517,0.904782,3,
+ 0,0,1,1.072211,0.859768,3,
+ 0,0,1,0.763156,1.276481,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.744795,1.34978,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.763156,1.276481,3,
+ 0,0,1,0.788613,1.205334,3,
+ 0,0,1,2.140232,1.927789,3,
+ 0,0,1,2.044472,2.044472,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.044472,2.044472,3,
+ 0,0,1,2.140232,1.927789,3,
+ 0,0,1,2.095218,1.988483,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.904782,1.988483,3,
+ 0,0,1,0.859768,1.927789,3,
+ 0,0,1,0.904782,1.988483,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,0.955528,2.044472,3,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.095218,1.988483,0,
+ 0,0,-1,2.044472,2.044472,0,
+ 0,0,-1,2.095218,1.988483,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.140232,1.927789,0,
+ 0,0,-1,2.140232,1.927789,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.575473,2.266292,0,
+ 0,0,-1,1.5,2.27,0,
+ 0,0,-1,1.575473,2.266292,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.575473,2.266292,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.65022,2.255205,0,
+ 0,0,-1,2.266292,1.424527,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.255205,1.34978,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.266292,1.424527,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.27,1.5,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,1.34978,0.744795,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.201631,0,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.34978,0.744795,0,
+ 0,0,-1,1.424527,0.733708,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.424527,0.733708,0,
+ 0,0,-1,1.5,0.73,0,
+ 0,0,-1,1.988483,0.904782,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.927789,0.859768,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.988483,0.904782,0,
+ 0,0,-1,2.044472,0.955528,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,2.044472,0.955528,0,
+ 0,0,-1,3,0,0,
+ 0,-0.447214,-0.894427,2.502268,0,0,
+ 0.794104,0.232588,-0.561517,3,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,0,-1,0.744795,1.65022,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,1.798369,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.744795,1.65022,0,
+ 0,0,-1,0.733708,1.575473,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.733708,1.575473,0,
+ 0,0,-1,0.73,1.5,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.955528,2.044472,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0.955528,2.044472,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.955528,2.044472,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.011517,2.095218,0,
+ 0,0,-1,1.011517,2.095218,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,1.072211,2.140232,0,
+ 0,0,-1,0.859768,1.072211,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0,0.497732,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.859768,1.072211,0,
+ 0,0,-1,0.904782,1.011517,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.904782,1.011517,0,
+ 0,0,-1,0.955528,0.955528,0,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.12132,0,2.17368,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.12132,0,2.17368,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.12132,0,2.795,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.12132,0,0.205,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.12132,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.12132,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.12132,0,3,
+ -0.269347,-0.403107,0.874618,2.12132,0,3,
+ 0,-1,0,2.795,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.12132,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,2.12132,0,0.205,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.12132,0,0.82632,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.201631,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,0.87868,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.87868,0,0.205,
+ 0,-1,0,0.87868,0,2.795,
+ 0,-1,0,0.87868,0,2.17368,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.87868,0,0.82632,
+ 0,-1,0,0.87868,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.87868,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.87868,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.87868,0,3,
+ 0,0,1,0.87868,0,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.201631,0,3,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0.205,
+ 0,1,0,2.12132,3,2.795,
+ 0,1,0,2.12132,3,2.17368,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0.82632,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.12132,3,2.17368,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.12132,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.12132,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.12132,3,3,
+ 0.618034,0.412957,0.668955,2.12132,3,3,
+ -0.727607,0.485071,0.485071,1.5,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,1,0,0.87868,3,2.17368,
+ 0,1,0,0.87868,3,0.82632,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.87868,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.87868,3,0.205,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.87868,3,0.82632,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.87868,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.87868,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.87868,3,3,
+ 0.269347,0.403107,0.874618,0.87868,3,3,
+ 0,0.83205,0.5547,0.205,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.87868,3,2.17368,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.87868,3,2.17368,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.87868,3,2.795,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.87868,3,0.205,
+ 0,0,-1,2.211387,1.205334,1.5,
+ 0,0,-1,2.044472,0.955528,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.044472,0.955528,1.5,
+ 0,0,-1,2.211387,1.205334,1.5,
+ 0,0,-1,2.095218,1.011517,1.5,
+ 0,0,-1,2.095218,1.011517,1.5,
+ 0,0,-1,2.211387,1.205334,1.5,
+ 0,0,-1,2.140232,1.072211,1.5,
+ 0,0,-1,2.140232,1.072211,1.5,
+ 0,0,-1,2.211387,1.205334,1.5,
+ 0,0,-1,2.179079,1.137025,1.5,
+ 0.382683,0.92388,0,0.788613,1.794666,3,
+ 0.382683,0.92388,0,1.5,1.5,1.5,
+ 0.382683,0.92388,0,0.788613,1.794666,1.5,
+ 0.382683,0.92388,0,1.5,1.5,1.5,
+ 0.382683,0.92388,0,0.788613,1.794666,3,
+ 0.382683,0.92388,0,2.211387,1.205334,1.5,
+ 0.382683,0.92388,0,2.211387,1.205334,1.5,
+ 0.382683,0.92388,0,0.788613,1.794666,3,
+ 0.382683,0.92388,0,2.211387,1.205334,3,
+ 0,0,-1,2.211387,1.205334,3,
+ 0,0,-1,0.788613,1.794666,3,
+ 0,0,-1,1.5,1.5,3,
+ 0,0,-1,1.276481,2.236844,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.205334,2.211387,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.276481,2.236844,1.5,
+ 0,0,-1,1.34978,2.255205,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.34978,2.255205,1.5,
+ 0,0,-1,1.424527,2.266292,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.424527,2.266292,1.5,
+ 0,0,-1,1.5,2.27,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.733708,1.424527,1.5,
+ 0,0,-1,0.73,1.5,1.5,
+ 0,0,-1,0.733708,1.424527,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.744795,1.34978,1.5,
+ 0,0,-1,0.744795,1.34978,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.763156,1.276481,1.5,
+ 0,0,-1,0.763156,1.276481,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.788613,1.205334,1.5,
+ 0.92388,-0.382683,0,1.5,1.5,1.5,
+ 0.92388,-0.382683,0,1.205334,0.788613,3,
+ 0.92388,-0.382683,0,1.205334,0.788613,1.5,
+ 0.92388,-0.382683,0,1.205334,0.788613,3,
+ 0.92388,-0.382683,0,1.5,1.5,1.5,
+ 0.92388,-0.382683,0,1.5,1.5,3,
+ 0.92388,-0.382683,0,1.5,1.5,3,
+ 0.92388,-0.382683,0,1.5,1.5,1.5,
+ 0.92388,-0.382683,0,1.794666,2.211387,1.5,
+ 0.92388,-0.382683,0,1.5,1.5,3,
+ 0.92388,-0.382683,0,1.794666,2.211387,1.5,
+ 0.92388,-0.382683,0,1.794666,2.211387,3,
+ 0,0,-1,1.011517,2.095218,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.955528,2.044472,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.011517,2.095218,1.5,
+ 0,0,-1,1.072211,2.140232,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.072211,2.140232,1.5,
+ 0,0,-1,1.137025,2.179079,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.137025,2.179079,1.5,
+ 0,0,-1,1.205334,2.211387,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.276481,0.763156,1.5,
+ 0,0,-1,1.205334,0.788613,1.5,
+ 0,0,-1,1.276481,0.763156,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.34978,0.744795,1.5,
+ 0,0,-1,1.34978,0.744795,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.424527,0.733708,1.5,
+ 0,0,-1,1.424527,0.733708,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.5,0.73,1.5,
+ 0.980785,0.19509,0,1.5,1.5,1.5,
+ 0.92388,0.382683,0,1.794666,0.788613,3,
+ 0.92388,0.382683,0,1.794666,0.788613,1.5,
+ 0.92388,0.382683,0,1.794666,0.788613,3,
+ 0.980785,0.19509,0,1.5,1.5,1.5,
+ 0.980785,0.19509,0,1.5,1.5,3,
+ 0.980785,0.19509,0,1.5,1.5,3,
+ 0.980785,0.19509,0,1.5,1.5,1.5,
+ 0.92388,0.382683,0,1.205334,2.211387,1.5,
+ 0.980785,0.19509,0,1.5,1.5,3,
+ 0.92388,0.382683,0,1.205334,2.211387,1.5,
+ 0.92388,0.382683,0,1.205334,2.211387,3,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.011517,0.904782,1.5,
+ 0,0,-1,0.955528,0.955528,1.5,
+ 0,0,-1,1.011517,0.904782,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.072211,0.859768,1.5,
+ 0,0,-1,1.072211,0.859768,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.137025,0.820921,1.5,
+ 0,0,-1,1.137025,0.820921,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.205334,0.788613,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,2.211387,1.205334,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.211387,1.205334,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,2.236844,1.276481,1.5,
+ 0,0,-1,2.236844,1.276481,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,2.255205,1.34978,1.5,
+ 0,0,-1,2.255205,1.34978,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,2.266292,1.424527,1.5,
+ -0.382683,0.92388,0,0.788613,1.205334,3,
+ -0.382683,0.92388,0,1.5,1.5,1.5,
+ -0.382683,0.92388,0,0.788613,1.205334,1.5,
+ -0.382683,0.92388,0,1.5,1.5,1.5,
+ -0.382683,0.92388,0,0.788613,1.205334,3,
+ -0.382683,0.92388,0,2.211387,1.794666,1.5,
+ -0.382683,0.92388,0,2.211387,1.794666,1.5,
+ -0.382683,0.92388,0,0.788613,1.205334,3,
+ -0.382683,0.92388,0,2.211387,1.794666,3,
+ 0,0,1,2.211387,1.794666,3,
+ 0,0,1,0.788613,1.205334,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,-1,2.211387,1.794666,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,2.211387,1.794666,1.5,
+ 0,0,-1,2.236844,1.723519,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,2.236844,1.723519,1.5,
+ 0,0,-1,2.255205,1.65022,1.5,
+ 0,0,-1,2.27,1.5,1.5,
+ 0,0,-1,2.255205,1.65022,1.5,
+ 0,0,-1,2.266292,1.575473,1.5,
+ 0,0,-1,0.733708,1.575473,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.73,1.5,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.733708,1.575473,1.5,
+ 0,0,-1,0.744795,1.65022,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.744795,1.65022,1.5,
+ 0,0,-1,0.763156,1.723519,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.763156,1.723519,1.5,
+ 0,0,-1,0.788613,1.794666,1.5,
+ 0,-1,0,2.27,1.5,3,
+ 0,-1,0,1.5,1.5,1.5,
+ 0,-1,0,2.27,1.5,1.5,
+ 0,-1,0,1.5,1.5,1.5,
+ 0,-1,0,2.27,1.5,3,
+ 0,-1,0,0.73,1.5,1.5,
+ 0,-1,0,0.73,1.5,1.5,
+ 0,-1,0,2.27,1.5,3,
+ 0,-1,0,0.73,1.5,3,
+ -0.404462,-0.42482,0.8099,0.73,1.5,3,
+ 0.302501,-0.288004,0.908596,2.27,1.5,3,
+ 0.154098,-0.097337,0.983249,1.5,1.5,3,
+ 0,0,-1,0.820921,1.862975,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.788613,1.794666,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.820921,1.862975,1.5,
+ 0,0,-1,0.859768,1.927789,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.859768,1.927789,1.5,
+ 0,0,-1,0.904782,1.988483,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.904782,1.988483,1.5,
+ 0,0,-1,0.955528,2.044472,1.5,
+ 0,0,-1,2.044472,0.955528,1.5,
+ 0,0,-1,1.794666,0.788613,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.794666,0.788613,1.5,
+ 0,0,-1,2.044472,0.955528,1.5,
+ 0,0,-1,1.862975,0.820921,1.5,
+ 0,0,-1,1.862975,0.820921,1.5,
+ 0,0,-1,2.044472,0.955528,1.5,
+ 0,0,-1,1.927789,0.859768,1.5,
+ 0,0,-1,1.927789,0.859768,1.5,
+ 0,0,-1,2.044472,0.955528,1.5,
+ 0,0,-1,1.988483,0.904782,1.5,
+ -0.707107,-0.707107,0,1.5,1.5,3,
+ -0.707107,-0.707107,0,2.044472,0.955528,1.5,
+ -0.707107,-0.707107,0,2.044472,0.955528,3,
+ -0.707107,-0.707107,0,2.044472,0.955528,1.5,
+ -0.707107,-0.707107,0,1.5,1.5,3,
+ -0.707107,-0.707107,0,1.5,1.5,1.5,
+ -0.707107,-0.707107,0,1.5,1.5,1.5,
+ -0.707107,-0.707107,0,1.5,1.5,3,
+ -0.707107,-0.707107,0,0.955528,2.044472,1.5,
+ -0.707107,-0.707107,0,0.955528,2.044472,1.5,
+ -0.707107,-0.707107,0,1.5,1.5,3,
+ -0.707107,-0.707107,0,0.955528,2.044472,3,
+ 0,0,-1,1.794666,0.788613,1.5,
+ 0,0,-1,1.5,0.73,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.5,0.73,1.5,
+ 0,0,-1,1.794666,0.788613,1.5,
+ 0,0,-1,1.575473,0.733708,1.5,
+ 0,0,-1,1.575473,0.733708,1.5,
+ 0,0,-1,1.794666,0.788613,1.5,
+ 0,0,-1,1.65022,0.744795,1.5,
+ 0,0,-1,1.65022,0.744795,1.5,
+ 0,0,-1,1.794666,0.788613,1.5,
+ 0,0,-1,1.723519,0.763156,1.5,
+ 0,0,-1,1.575473,2.266292,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.5,2.27,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,1.575473,2.266292,1.5,
+ 0,0,-1,1.794666,2.211387,1.5,
+ 0,0,-1,1.794666,2.211387,1.5,
+ 0,0,-1,1.575473,2.266292,1.5,
+ 0,0,-1,1.65022,2.255205,1.5,
+ 0,0,-1,1.794666,2.211387,1.5,
+ 0,0,-1,1.65022,2.255205,1.5,
+ 0,0,-1,1.723519,2.236844,1.5,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,0.73,3,
+ 1,0,0,1.5,0.73,1.5,
+ 1,0,0,1.5,0.73,3,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,1.5,3,
+ 1,0,0,1.5,1.5,3,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,2.27,1.5,
+ 1,0,0,1.5,1.5,3,
+ 1,0,0,1.5,2.27,1.5,
+ 1,0,0,1.5,2.27,3,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.820921,1.137025,1.5,
+ 0,0,-1,0.788613,1.205334,1.5,
+ 0,0,-1,0.820921,1.137025,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.859768,1.072211,1.5,
+ 0,0,-1,0.859768,1.072211,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.904782,1.011517,1.5,
+ 0,0,-1,0.904782,1.011517,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,0.955528,0.955528,1.5,
+ 0,0,-1,1.794666,2.211387,1.5,
+ 0,0,-1,2.044472,2.044472,1.5,
+ 0,0,-1,1.5,1.5,1.5,
+ 0,0,-1,2.044472,2.044472,1.5,
+ 0,0,-1,1.794666,2.211387,1.5,
+ 0,0,-1,1.862975,2.179079,1.5,
+ 0,0,-1,2.044472,2.044472,1.5,
+ 0,0,-1,1.862975,2.179079,1.5,
+ 0,0,-1,1.927789,2.140232,1.5,
+ 0,0,-1,2.044472,2.044472,1.5,
+ 0,0,-1,1.927789,2.140232,1.5,
+ 0,0,-1,1.988483,2.095218,1.5,
+ 0.83147,-0.55557,0,1.5,1.5,1.5,
+ 0.707107,-0.707107,0,0.955528,0.955528,3,
+ 0.707107,-0.707107,0,0.955528,0.955528,1.5,
+ 0.707107,-0.707107,0,0.955528,0.955528,3,
+ 0.83147,-0.55557,0,1.5,1.5,1.5,
+ 0.83147,-0.55557,0,1.5,1.5,3,
+ 0.83147,-0.55557,0,1.5,1.5,3,
+ 0.83147,-0.55557,0,1.5,1.5,1.5,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.83147,-0.55557,0,1.5,1.5,3,
+ 0.707107,-0.707107,0,2.044472,2.044472,1.5,
+ 0.707107,-0.707107,0,2.044472,2.044472,3
+};
+static const struct gllist lament_model_star_u_frame = { GL_N3F_V3F, GL_TRIANGLES, 1608, lament_model_star_u_data, 0 };
+const struct gllist *lament_model_star_u = &lament_model_star_u_frame;
+
+static const float lament_model_taser_a_data[] = {
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,1.798369,3,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.12132,3,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.502268,3,
+ -1,0,0,0,2.795,3,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,1.5,1.5,
+ -0.639602,0.639602,-0.426401,0,1.5,2.795,
+ -0.57735,0.57735,0.57735,0,1.5,2.277,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.53125,3,0.723,
+ 0,1,0,0.205,3,0.723,
+ 0,1,0,0.53125,3,0.723,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.53125,3,0.982,
+ 0,1,0,0.53125,3,0.982,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.53125,3,1.17375,
+ 1,0,0,0.777,3,2.795,
+ 1,0,0,0.777,1.5,3,
+ 1,0,0,0.777,1.5,2.795,
+ 1,0,0,0.777,1.5,3,
+ 1,0,0,0.777,3,2.795,
+ 1,0,0,0.777,1.643814,3,
+ 1,0,0,0.777,1.643814,3,
+ 1,0,0,0.777,3,2.795,
+ 1,0,0,0.777,1.799476,3,
+ 1,0,0,0.777,1.799476,3,
+ 1,0,0,0.777,3,2.795,
+ 1,0,0,0.777,1.983093,3,
+ 1,0,0,0.777,1.983093,3,
+ 1,0,0,0.777,3,2.795,
+ 1,0,0,0.777,2.223,3,
+ 1,0,0,0.777,2.223,3,
+ 1,0,0,0.777,3,2.795,
+ 1,0,0,0.777,2.582046,3,
+ 1,0,0,0.777,2.582046,3,
+ 1,0,0,0.777,3,2.795,
+ 1,0,0,0.777,3,3,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,0,0,0,
+ 0,-1,0,1.295,0,0,
+ 0,-1,0,0,0,0,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,0,0,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.795,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,0,1,0.777,2.223,3,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,2.795,0.723,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,0.723,
+ -1,0,0,0,3,1.5,
+ -1,0,0,0,3,0.723,
+ 1,0,0,0.53125,3,2.018,
+ 1,0,0,0.53125,1.5,2.277,
+ 1,0,0,0.53125,1.5,2.018,
+ 1,0,0,0.53125,1.5,2.277,
+ 1,0,0,0.53125,3,2.018,
+ 1,0,0,0.53125,3,2.277,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0.205,3,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.796875,3,1.5,
+ 0,1,0,0.53125,3,1.5,
+ 0,1,0,0.796875,3,1.5,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.796875,3,1.759,
+ 0,1,0,0.796875,3,1.759,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.796875,3,2.018,
+ 0,1,0,0.796875,3,2.018,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.723,3,2.018,
+ 0,0,-1,0.723,3,0.982,
+ 0,0,-1,0.53125,1.5,0.982,
+ 0,0,-1,0.53125,3,0.982,
+ 0,0,-1,0.53125,1.5,0.982,
+ 0,0,-1,0.723,3,0.982,
+ 0,0,-1,0.796875,1.5,0.982,
+ 0,0,-1,0.796875,1.5,0.982,
+ 0,0,-1,0.723,3,0.982,
+ 0,0,-1,0.796875,3,0.982,
+ 0,0,-1,0.205,3,2.795,
+ 0,0,-1,0,2.795,2.795,
+ 0,0,-1,0,3,2.795,
+ 0,0,-1,0,2.795,2.795,
+ 0,0,-1,0.205,3,2.795,
+ 0,0,-1,0,1.5,2.795,
+ 0,0,-1,0,1.5,2.795,
+ 0,0,-1,0.205,3,2.795,
+ 0,0,-1,0.777,1.5,2.795,
+ 0,0,-1,0.777,1.5,2.795,
+ 0,0,-1,0.205,3,2.795,
+ 0,0,-1,0.777,3,2.795,
+ 1,0,0,1.295,1.5,0,
+ 1,0,0,1.295,0,3,
+ 1,0,0,1.295,0,0,
+ 1,0,0,1.295,0,3,
+ 1,0,0,1.295,1.5,0,
+ 1,0,0,1.295,1.5,3,
+ 0,0,-1,0.777,1.983093,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0.777,1.983093,0,
+ 0,0,-1,0.777,1.799476,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,0.205,
+ 1,0,0,0.53125,3,0.723,
+ 1,0,0,0.53125,1.5,0.982,
+ 1,0,0,0.53125,1.5,0.723,
+ 1,0,0,0.53125,1.5,0.982,
+ 1,0,0,0.53125,3,0.723,
+ 1,0,0,0.53125,3,0.982,
+ 0,0,1,0.53125,1.5,2.277,
+ 0,0,1,0,2.277,2.277,
+ 0,0,1,0,1.5,2.277,
+ 0,0,1,0,2.277,2.277,
+ 0,0,1,0.53125,1.5,2.277,
+ 0,0,1,0,2.795,2.277,
+ 0,0,1,0,2.795,2.277,
+ 0,0,1,0.53125,1.5,2.277,
+ 0,0,1,0,3,2.277,
+ 0,0,1,0,3,2.277,
+ 0,0,1,0.53125,1.5,2.277,
+ 0,0,1,0.205,3,2.277,
+ 0,0,1,0.205,3,2.277,
+ 0,0,1,0.53125,1.5,2.277,
+ 0,0,1,0.53125,3,2.277,
+ 1,0,0,0.796875,3,1.759,
+ 1,0,0,0.796875,1.5,2.018,
+ 1,0,0,0.796875,1.5,1.759,
+ 1,0,0,0.796875,1.5,2.018,
+ 1,0,0,0.796875,3,1.759,
+ 1,0,0,0.796875,3,2.018,
+ 0,1,0,0.796875,3,1.5,
+ 0,1,0,1.0625,3,1.241,
+ 0,1,0,0.796875,3,1.241,
+ 0,1,0,1.0625,3,1.241,
+ 0,1,0,0.796875,3,1.5,
+ 0,1,0,1.0625,3,1.5,
+ 0,0,1,0.777,1.799476,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,2.502268,3,
+ 0,0,1,0.777,1.799476,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,0.723,
+ 0,1,0,0,3,0.723,
+ 0,1,0,0.205,3,0.723,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 1,0,0,0.796875,3,0.982,
+ 1,0,0,0.796875,1.5,1.241,
+ 1,0,0,0.796875,1.5,0.982,
+ 1,0,0,0.796875,1.5,1.241,
+ 1,0,0,0.796875,3,0.982,
+ 1,0,0,0.796875,3,1.241,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,1.5,
+ 0,0,1,1.0625,1.5,1.759,
+ 0,0,1,0.796875,3,1.759,
+ 0,0,1,0.796875,1.5,1.759,
+ 0,0,1,0.796875,3,1.759,
+ 0,0,1,1.0625,1.5,1.759,
+ 0,0,1,1.0625,3,1.759,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,3,2.277,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,2.277,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,3,2.277,
+ -1,0,0,0,3,1.5,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.777,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.777,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.777,3,3,
+ 0.57735,0.57735,0.57735,0.777,3,3,
+ 0,0.83205,0.5547,0.205,3,3,
+ 0,0,1,0.259,3,3,
+ 0.57735,0.57735,0.57735,0.777,3,3,
+ 0,0,1,0.259,3,3,
+ 0,0,1,0.497732,3,3,
+ 0.57735,0.57735,0.57735,0.777,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.518,3,3,
+ 0,1,0,0.53125,3,1.17375,
+ 0,1,0,0.723,3,0.982,
+ 0,1,0,0.53125,3,0.982,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,0.205,0.205,
+ -0.588348,0.784465,0.196116,0,1.5,0.205,
+ -1,0,0,0,1.5,1.5,
+ -0.408248,0.408248,-0.816497,0,1.5,0.723,
+ 0,0,1,0.777,1.5,0.205,
+ 0,0,1,0,2.795,0.205,
+ 0,0,1,0,1.5,0.205,
+ 0,0,1,0,2.795,0.205,
+ 0,0,1,0.777,1.5,0.205,
+ 0,0,1,0,3,0.205,
+ 0,0,1,0,3,0.205,
+ 0,0,1,0.777,1.5,0.205,
+ 0,0,1,0.205,3,0.205,
+ 0,0,1,0.205,3,0.205,
+ 0,0,1,0.777,1.5,0.205,
+ 0,0,1,0.777,3,0.205,
+ 0,0,1,0.796875,1.5,2.018,
+ 0,0,1,0.53125,3,2.018,
+ 0,0,1,0.53125,1.5,2.018,
+ 0,0,1,0.53125,3,2.018,
+ 0,0,1,0.796875,1.5,2.018,
+ 0,0,1,0.723,3,2.018,
+ 0,0,1,0.723,3,2.018,
+ 0,0,1,0.796875,1.5,2.018,
+ 0,0,1,0.796875,3,2.018,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.12132,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.502268,0,
+ -1,0,0,0,2.795,0.205,
+ -1,0,0,0,2.795,0,
+ 0,0,1,0.777,1.643814,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,2.12132,3,
+ 0,0,1,0.777,1.643814,3,
+ 0,0,1,0.777,1.799476,3,
+ 0,0,-1,0.777,1.799476,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,2.12132,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0.777,1.799476,0,
+ 0,0,-1,0.777,1.5,0,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0,0,
+ -1,0,0,0,0,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.777,3,0,
+ 0,1,0,0.497732,3,0,
+ 0,1,0,0.777,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.777,3,0.205,
+ 0,1,0,0.777,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0.205,3,0.205,
+ -1,0,0,0,3,0,
+ -1,0,0,0,2.795,0,
+ -1,0,0,0,2.795,0.205,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0.497732,3,0,
+ 0,0,-1,0.777,2.582046,0,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.53125,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,0,1,0.777,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.798369,3,
+ 0,0,1,0.777,1.5,3,
+ 0,0,1,0.777,1.643814,3,
+ 0,1,0,0.723,3,2.018,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.53125,3,2.018,
+ 0,1,0,0.53125,3,1.17375,
+ 0,1,0,0.796875,3,0.982,
+ 0,1,0,0.723,3,0.982,
+ 0,1,0,0.796875,3,0.982,
+ 0,1,0,0.53125,3,1.17375,
+ 0,1,0,0.796875,3,1.241,
+ 0,1,0,0.796875,3,1.241,
+ 0,1,0,0.53125,3,1.17375,
+ 0,1,0,0.53125,3,1.5,
+ 0,1,0,0.796875,3,1.241,
+ 0,1,0,0.53125,3,1.5,
+ 0,1,0,0.796875,3,1.5,
+ 0,0,-1,0.777,3,0,
+ 0,0,-1,0.777,2.582046,0,
+ 0,0,-1,0.497732,3,0,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0.205,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,1.5,3,
+ -1,0,0,0,1.5,2.795,
+ 0,0,-1,0.205,3,0.723,
+ 0,0,-1,0,2.795,0.723,
+ 0,0,-1,0,3,0.723,
+ 0,0,-1,0,2.795,0.723,
+ 0,0,-1,0.205,3,0.723,
+ 0,0,-1,0,2.277,0.723,
+ 0,0,-1,0,2.277,0.723,
+ 0,0,-1,0.205,3,0.723,
+ 0,0,-1,0,1.5,0.723,
+ 0,0,-1,0,1.5,0.723,
+ 0,0,-1,0.205,3,0.723,
+ 0,0,-1,0.53125,1.5,0.723,
+ 0,0,-1,0.53125,1.5,0.723,
+ 0,0,-1,0.205,3,0.723,
+ 0,0,-1,0.53125,3,0.723,
+ -1,0,0,0,2.277,0.723,
+ -1,0,0,0,1.5,0.723,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,3,3,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,2.795,3,
+ 0,1,0,0.205,3,2.277,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.53125,3,1.82625,
+ 0,1,0,0.205,3,2.277,
+ 0,1,0,0.53125,3,2.018,
+ 0,1,0,0.53125,3,2.018,
+ 0,1,0,0.205,3,2.277,
+ 0,1,0,0.53125,3,2.277,
+ 1,0,0,1.0625,3,1.241,
+ 1,0,0,1.0625,1.5,1.759,
+ 1,0,0,1.0625,1.5,1.241,
+ 1,0,0,1.0625,1.5,1.759,
+ 1,0,0,1.0625,3,1.241,
+ 1,0,0,1.0625,3,1.759,
+ 0.57735,0.57735,0.57735,1.0625,3,1.759,
+ 0.57735,0.57735,-0.57735,1.0625,3,1.241,
+ 0,1,0,1.0625,3,1.5,
+ 0,1,0,0,3,2.277,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,2.277,
+ 0,1,0,0.205,3,2.277,
+ 1,0,0,0.777,1.799476,0,
+ 1,0,0,0.777,1.5,0.205,
+ 1,0,0,0.777,1.5,0,
+ 1,0,0,0.777,1.5,0.205,
+ 1,0,0,0.777,1.799476,0,
+ 1,0,0,0.777,3,0.205,
+ 1,0,0,0.777,3,0.205,
+ 1,0,0,0.777,1.799476,0,
+ 1,0,0,0.777,1.983093,0,
+ 1,0,0,0.777,3,0.205,
+ 1,0,0,0.777,1.983093,0,
+ 1,0,0,0.777,2.223,0,
+ 1,0,0,0.777,3,0.205,
+ 1,0,0,0.777,2.223,0,
+ 1,0,0,0.777,2.582046,0,
+ 1,0,0,0.777,3,0.205,
+ 1,0,0,0.777,2.582046,0,
+ 1,0,0,0.777,3,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0,2.795,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0,2.502268,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0.777,1.983093,0,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.259,3,3,
+ 0,0,1,0.259,3,3,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.777,2.582046,3,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,1.5,
+ -1,0,0,0,0.205,2.795,
+ 0,1,0,0.53125,3,1.5,
+ 0,1,0,0.53125,3,1.17375,
+ 0,1,0,0.205,3,1.5,
+ -1,0,0,0,2.277,2.277,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.277,2.277,
+ -1,0,0,0,2.795,2.277,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,0,
+ -1,0,0,0,0,0,
+ 0,0,-1,1.0625,3,1.241,
+ 0,0,-1,0.796875,1.5,1.241,
+ 0,0,-1,0.796875,3,1.241,
+ 0,0,-1,0.796875,1.5,1.241,
+ 0,0,-1,1.0625,3,1.241,
+ 0,0,-1,1.0625,1.5,1.241,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,2.795,2.795,
+ -1,0,0,0,3,3,
+ 0,0,1,0.777,2.582046,3,
+ 0,0,1,0.518,3,3,
+ 0,0,1,0.497732,3,3,
+ 0,0,1,0.518,3,3,
+ 0,0,1,0.777,2.582046,3,
+ 0,0,1,0.777,3,3,
+ -1,0,0,0,0.205,2.795,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,3,
+ 0,1,0,0.796875,3,1.759,
+ 0,1,0,1.0625,3,1.5,
+ 0,1,0,0.796875,3,1.5,
+ 0,1,0,1.0625,3,1.5,
+ 0,1,0,0.796875,3,1.759,
+ 0,1,0,1.0625,3,1.759,
+ 0,1,0,0.796875,1.5,2.018,
+ 0,1,0,1.0625,1.5,1.759,
+ 0,1,0,0.796875,1.5,1.759,
+ 0,1,0,0.53125,1.5,2.277,
+ 0,1,0,0.796875,1.5,2.018,
+ 0,1,0,0.53125,1.5,2.018,
+ 0,1,0,0,1.5,2.795,
+ 0,1,0,0.53125,1.5,2.277,
+ 0,1,0,0,1.5,2.277,
+ 0,1,0,0.777,1.5,0.205,
+ 0,1,0,1.295,1.5,0,
+ 0,1,0,0.777,1.5,0,
+ 0,1,0,1.295,1.5,0,
+ 0,1,0,0.777,1.5,0.205,
+ 0,1,0,1.0625,1.5,1.241,
+ 0,1,0,1.295,1.5,0,
+ 0,1,0,1.0625,1.5,1.241,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,1.0625,1.5,1.241,
+ 0,1,0,0.777,1.5,0.205,
+ 0,1,0,0.796875,1.5,0.982,
+ 0,1,0,0.796875,1.5,0.982,
+ 0,1,0,0.777,1.5,0.205,
+ 0,1,0,0,1.5,0.205,
+ 0.218218,0.872872,-0.436436,0.796875,1.5,0.982,
+ -0.588348,0.784465,0.196116,0,1.5,0.205,
+ 0.333333,0.666667,-0.666667,0.53125,1.5,0.723,
+ 0,1,0,0.53125,1.5,0.723,
+ 0,1,0,0,1.5,0.205,
+ 0,1,0,0,1.5,0.723,
+ 0,1,0,0.796875,1.5,0.982,
+ 0,1,0,0.53125,1.5,0.723,
+ 0,1,0,0.53125,1.5,0.982,
+ 0,1,0,1.0625,1.5,1.241,
+ 0,1,0,0.796875,1.5,0.982,
+ 0,1,0,0.796875,1.5,1.241,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,1.0625,1.5,1.241,
+ 0,1,0,1.0625,1.5,1.759,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,1.0625,1.5,1.759,
+ 0,1,0,0.796875,1.5,2.018,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,0.796875,1.5,2.018,
+ 0,1,0,0.53125,1.5,2.277,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,0.53125,1.5,2.277,
+ 0,1,0,0.777,1.5,2.795,
+ 0,1,0,0.777,1.5,2.795,
+ 0,1,0,0.53125,1.5,2.277,
+ 0,1,0,0,1.5,2.795,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,0.777,1.5,2.795,
+ 0,1,0,0.777,1.5,3,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.277,0.723,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,2.277,0.723,
+ -1,0,0,0,2.795,1.5,
+ -1,0,0,0,2.795,0.723,
+ -1,0,0,0,2.277,2.277,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,1.5,2.277,
+ -1,0,0,0,1.5,1.5,
+ -1,0,0,0,0.205,0.205,
+ -1,0,0,0,0.205,1.5,
+ 0,0,1,1.295,0,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0,0.205,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,0,1.5,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,0.777,1.5,3,
+ 0,0,1,0.777,1.5,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,1.295,1.5,3,
+ 0,1,0,0,1.5,3,
+ 0,1,0,0.777,1.5,2.795,
+ 0,1,0,0,1.5,2.795,
+ 0,1,0,0.777,1.5,2.795,
+ 0,1,0,0,1.5,3,
+ 0,1,0,0.777,1.5,3,
+ 0,0,-1,0.777,1.5,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0,1.5,0,
+ 0,0,-1,0,0.205,0,
+ 0,0,-1,0.777,1.5,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.777,1.5,0,
+ 0,0,-1,1.295,0,0,
+ 0,0,-1,1.295,0,0,
+ 0,0,-1,0.777,1.5,0,
+ 0,0,-1,1.295,1.5,0,
+ 0,1,0,0,1.5,0.205,
+ 0,1,0,0.777,1.5,0,
+ 0,1,0,0,1.5,0,
+ 0,1,0,0.777,1.5,0,
+ 0,1,0,0,1.5,0.205,
+ 0,1,0,0.777,1.5,0.205
+};
+static const struct gllist lament_model_taser_a_frame = { GL_N3F_V3F, GL_TRIANGLES, 582, lament_model_taser_a_data, 0 };
+const struct gllist *lament_model_taser_a = &lament_model_taser_a_frame;
+
+static const float lament_model_taser_b_data[] = {
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.295,1.705,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,1.295,1.705,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.295,1.705,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.295,1.806804,0,
+ -1,0,0,0,3,0.205,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,3,0.464,
+ -1,0,0,0,3,0.723,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,1.5,0.723,
+ -1,0,0,0,1.5,0.205,
+ -1,0,0,0,3,0.723,
+ -1,0,0,0,3,0.464,
+ -1,0,0,0.53125,3,0.982,
+ -0.989278,0,-0.146043,0.53125,1.5,0.723,
+ -1,0,0,0.53125,1.5,0.982,
+ -0.989278,0,-0.146043,0.53125,1.5,0.723,
+ -1,0,0,0.53125,3,0.982,
+ -0.956392,0,-0.292087,0.53125,3,0.723,
+ 0,0,1,1.0625,1.5,1.241,
+ 0,0,1,0.796875,3,1.241,
+ 0,0,1,0.796875,1.5,1.241,
+ 0,0,1,0.796875,3,1.241,
+ 0,0,1,1.0625,1.5,1.241,
+ 0,0,1,1.0625,3,1.241,
+ 0,0,-1,1.0625,3,1.759,
+ 0,0,-1,0.796875,1.5,1.759,
+ 0,0,-1,0.796875,3,1.759,
+ 0,0,-1,0.796875,1.5,1.759,
+ 0,0,-1,1.0625,3,1.759,
+ 0,0,-1,1.0625,1.5,1.759,
+ -1,0,0,0.777,1.643814,3,
+ -1,0,0,0.777,1.5,2.795,
+ -1,0,0,0.777,1.5,3,
+ -1,0,0,0.777,1.5,2.795,
+ -1,0,0,0.777,1.643814,3,
+ -1,0,0,0.777,3,2.795,
+ -1,0,0,0.777,3,2.795,
+ -1,0,0,0.777,1.643814,3,
+ -1,0,0,0.777,1.732563,3,
+ -1,0,0,0.777,3,2.795,
+ -1,0,0,0.777,1.732563,3,
+ -1,0,0,0.777,1.799476,3,
+ -1,0,0,0.777,3,2.795,
+ -1,0,0,0.777,1.799476,3,
+ -1,0,0,0.777,1.983093,3,
+ -1,0,0,0.777,3,2.795,
+ -1,0,0,0.777,1.983093,3,
+ -1,0,0,0.777,2.223,3,
+ -1,0,0,0.777,3,2.795,
+ -1,0,0,0.777,2.223,3,
+ -1,0,0,0.777,2.582046,3,
+ -1,0,0,0.777,3,2.795,
+ -1,0,0,0.777,2.582046,3,
+ -1,0,0,0.777,3,3,
+ -1,0,0,0.53125,3,2.277,
+ -1,0,0,0.53125,1.5,2.018,
+ -1,0,0,0.53125,1.5,2.277,
+ -1,0,0,0.53125,1.5,2.018,
+ -1,0,0,0.53125,3,2.277,
+ -1,0,0,0.53125,3,2.018,
+ -1,0,0,0.796875,3,1.241,
+ -1,0,0,0.796875,1.5,0.982,
+ -1,0,0,0.796875,1.5,1.241,
+ -1,0,0,0.796875,1.5,0.982,
+ -1,0,0,0.796875,3,1.241,
+ -1,0,0,0.796875,3,0.982,
+ -1,0,0,1.0625,3,1.759,
+ -1,0,0,1.0625,1.5,1.5,
+ -1,0,0,1.0625,1.5,1.759,
+ -1,0,0,1.0625,1.5,1.5,
+ -1,0,0,1.0625,3,1.759,
+ -1,0,0,1.0625,1.5,1.241,
+ -1,0,0,1.0625,1.5,1.241,
+ -1,0,0,1.0625,3,1.759,
+ -1,0,0,1.0625,3,1.241,
+ -0.301511,0.904534,0.301511,1.0625,3,1.241,
+ -0.639602,0.639602,-0.426401,1.0625,3,1.759,
+ 0,1,0,1.0625,3,1.5,
+ -1,0,0,0.796875,3,2.018,
+ -1,0,0,0.796875,1.5,1.759,
+ -1,0,0,0.796875,1.5,2.018,
+ -1,0,0,0.796875,1.5,1.759,
+ -1,0,0,0.796875,3,2.018,
+ -1,0,0,0.796875,3,1.759,
+ 0,0,-1,0.723,3,2.018,
+ 0,0,-1,0.53125,1.5,2.018,
+ 0,0,-1,0.53125,3,2.018,
+ 0,0,-1,0.53125,1.5,2.018,
+ 0,0,-1,0.723,3,2.018,
+ 0,0,-1,0.796875,1.5,2.018,
+ 0,0,-1,0.796875,1.5,2.018,
+ 0,0,-1,0.723,3,2.018,
+ 0,0,-1,0.796875,3,2.018,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,1.5,2.277,
+ -1,0,0,0,1.5,2.795,
+ -1,0,0,0,1.5,2.277,
+ -1,0,0,0,3,2.795,
+ -1,0,0,0,3,2.277,
+ -0.57735,0.57735,-0.57735,0,3,2.277,
+ -0.666667,0.333333,0.666667,0,3,2.795,
+ 0,1,0,0,3,2.536,
+ 0,0,1,0.796875,1.5,0.982,
+ 0,0,1,0.53125,3,0.982,
+ 0,0,1,0.53125,1.5,0.982,
+ 0,0,1,0.53125,3,0.982,
+ 0,0,1,0.796875,1.5,0.982,
+ 0,0,1,0.723,3,0.982,
+ 0,0,1,0.723,3,0.982,
+ 0,0,1,0.796875,1.5,0.982,
+ 0,0,1,0.796875,3,0.982,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,1.295,1.636977,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,1.295,1.636977,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,1.295,1.636977,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,1.295,1.705,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.295,1.994914,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.295,1.994914,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.295,2.231186,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.295,1.806804,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.295,1.806804,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.295,1.806804,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.295,1.994914,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,1.295,1.584914,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.295,1.584914,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,1.295,1.584914,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,1.295,1.636977,0,
+ 0,0,-1,1.295,1.540777,0,
+ 0,0,-1,0.777,1.5,0,
+ 0,0,-1,0.777,1.643814,0,
+ 0,0,-1,0.777,1.5,0,
+ 0,0,-1,1.295,1.540777,0,
+ 0,0,-1,1.295,1.5,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.777,1.643814,0,
+ 0,0,-1,0.777,1.732563,0,
+ 0,0,-1,0.777,1.643814,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.295,1.540777,0,
+ 0,0,-1,1.295,1.540777,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,1.295,1.584914,0,
+ 0,0,-1,1.295,2.530605,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.295,3,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.201631,3,0,
+ 0,0,-1,1.295,2.530605,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,1.295,2.530605,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.279384,2.227275,0,
+ 0,0,-1,1.295,2.530605,0,
+ 0,0,-1,1.295,2.231186,0,
+ 0,0,-1,0.777,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.777,2.582046,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.777,3,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,1.141738,2.17026,0,
+ 0,0,-1,0.87868,3,0,
+ 0,0,-1,1.209161,2.202148,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.777,1.799476,0,
+ 0,0,-1,0.777,1.983093,0,
+ 0,0,-1,0.777,1.799476,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.777,1.799476,0,
+ 0,0,-1,0.82974,1.858262,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.777,1.983093,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0.777,1.983093,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.777,1.983093,0,
+ 0,0,-1,0.912512,1.982139,0,
+ 0,0,-1,0.868083,1.922233,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,0.777,2.582046,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,1.077767,2.131917,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,0.777,2.223,0,
+ 0,0,-1,1.017861,2.087488,0,
+ 0,0,-1,0.962599,2.037401,0,
+ 0,0,-1,0.797852,1.790839,0,
+ 0,0,-1,0.777,1.732563,0,
+ 0,0,-1,0.777,1.799476,0,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.777,2.582046,3,
+ 0,0,1,0.777,2.223,3,
+ 0,0,1,0.777,2.582046,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.777,2.582046,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,0,1,0.777,1.799476,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.777,1.983093,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,1.295,1.5,3,
+ 0,0,1,0.777,1.643814,3,
+ 0,0,1,0.777,1.5,3,
+ 0,0,1,0.777,1.643814,3,
+ 0,0,1,1.295,1.5,3,
+ 0,0,1,1.295,1.540777,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,0.777,3,3,
+ 0,0,1,0.777,2.582046,3,
+ 0,0,1,0.777,3,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.295,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.295,2.530605,3,
+ 0,0,1,1.295,1.705,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.017861,2.087488,3,
+ 0,0,1,1.295,1.705,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.295,1.705,3,
+ 0,0,1,1.295,1.806804,3,
+ 0,0,1,1.295,1.636977,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.912512,1.982139,3,
+ 0,0,1,1.295,1.636977,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,0.962599,2.037401,3,
+ 0,0,1,1.295,1.636977,3,
+ 0,0,1,1.295,1.705,3,
+ 0,0,1,1.295,1.806804,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.077767,2.131917,3,
+ 0,0,1,1.141738,2.17026,3,
+ 0,0,1,1.295,1.806804,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.295,1.806804,3,
+ 0,0,1,1.295,1.994914,3,
+ 0,0,1,1.295,1.584914,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.82974,1.858262,3,
+ 0,0,1,1.295,1.584914,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,0.868083,1.922233,3,
+ 0,0,1,1.295,1.584914,3,
+ 0,0,1,1.295,1.636977,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.036,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.036,3,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.295,2.530605,3,
+ 0,0,1,1.295,2.530605,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.295,2.530605,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.295,2.231186,3,
+ 0,0,1,1.295,1.994914,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.209161,2.202148,3,
+ 0,0,1,1.279384,2.227275,3,
+ 0,0,1,1.295,1.994914,3,
+ 0,0,1,1.295,2.231186,3,
+ 0,0,1,1.295,1.540777,3,
+ 0,0,1,0.777,1.732563,3,
+ 0,0,1,0.777,1.643814,3,
+ 0,0,1,0.777,1.732563,3,
+ 0,0,1,1.295,1.540777,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,1.295,1.540777,3,
+ 0,0,1,1.295,1.584914,3,
+ 0,0,1,0.797852,1.790839,3,
+ 0,0,1,0.777,1.799476,3,
+ 0,0,1,0.777,1.732563,3,
+ 0,0,1,0.777,1.5,2.795,
+ 0,0,1,0,3,2.795,
+ 0,0,1,0,1.5,2.795,
+ 0,0,1,0,3,2.795,
+ 0,0,1,0.777,1.5,2.795,
+ 0,0,1,0.205,3,2.795,
+ 0,0,1,0.205,3,2.795,
+ 0,0,1,0.777,1.5,2.795,
+ 0,0,1,0.777,3,2.795,
+ 0,0,-1,0.205,3,2.277,
+ 0,0,-1,0,1.5,2.277,
+ 0,0,-1,0,3,2.277,
+ 0,0,-1,0,1.5,2.277,
+ 0,0,-1,0.205,3,2.277,
+ 0,0,-1,0.53125,1.5,2.277,
+ 0,0,-1,0.53125,1.5,2.277,
+ 0,0,-1,0.205,3,2.277,
+ 0,0,-1,0.53125,3,2.277,
+ 0,0,1,0.53125,1.5,0.723,
+ 0,0,1,0,3,0.723,
+ 0,0,1,0,1.5,0.723,
+ 0,0,1,0,3,0.723,
+ 0,0,1,0.53125,1.5,0.723,
+ 0,0,1,0.205,3,0.723,
+ 0,0,1,0.205,3,0.723,
+ 0,0,1,0.53125,1.5,0.723,
+ 0,0,1,0.53125,3,0.723,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,1.5,0,
+ -0.956392,0,-0.292087,0.777,1.5,0.205,
+ -1,0,0,0.777,1.5,0,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,1.643814,0,
+ -1,0,0,0.777,1.643814,0,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,1.732563,0,
+ -1,0,0,0.777,1.732563,0,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,1.799476,0,
+ -1,0,0,0.777,1.799476,0,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,1.983093,0,
+ -1,0,0,0.777,1.983093,0,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,2.223,0,
+ -1,0,0,0.777,2.223,0,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,2.582046,0,
+ -1,0,0,0.777,2.582046,0,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ -1,0,0,0.777,3,0,
+ 0,0,-1,0.205,3,0.205,
+ 0,0,-1,0,1.5,0.205,
+ 0,0,-1,0,3,0.205,
+ 0,0,-1,0,1.5,0.205,
+ 0,0,-1,0.205,3,0.205,
+ 0,0,-1,0.777,1.5,0.205,
+ 0,0,-1,0.777,1.5,0.205,
+ 0,0,-1,0.205,3,0.205,
+ 0,0,-1,0.777,3,0.205,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,2.530605,0,
+ 0.707107,0,-0.707107,1.295,3,0,
+ 0.707107,0,-0.707107,1.295,2.530605,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,2.231186,0,
+ 0.707107,0,-0.707107,1.295,2.231186,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,1.994914,0,
+ 0.707107,0,-0.707107,1.295,1.994914,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,1.806804,0,
+ 0.707107,0,-0.707107,1.295,1.806804,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,1.705,0,
+ 0.707107,0,-0.707107,1.295,1.705,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,1.636977,0,
+ 0.707107,0,-0.707107,1.295,1.636977,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,1.584914,0,
+ 0.707107,0,-0.707107,1.295,1.584914,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,1.540777,0,
+ 0.707107,0,-0.707107,1.295,1.540777,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,1.295,1.5,0,
+ 0.707107,0,-0.707107,1.295,1.5,0,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,2.1475,1.5,0.8525,
+ 0.707107,0,-0.707107,2.1475,1.5,0.8525,
+ 0.707107,0,-0.707107,1.5,3,0.205,
+ 0.707107,0,-0.707107,2.1475,3,0.8525,
+ 1,0,0,2.1475,3,0.8525,
+ 1,0,0,2.1475,1.5,1.284167,
+ 1,0,0,2.1475,1.5,0.8525,
+ 1,0,0,2.1475,1.5,1.284167,
+ 1,0,0,2.1475,3,0.8525,
+ 1,0,0,2.1475,3,1.284167,
+ -0.707107,0,-0.707107,2.1475,3,1.715833,
+ -0.707107,0,-0.707107,1.715833,1.5,2.1475,
+ -0.707107,0,-0.707107,1.715833,3,2.1475,
+ -0.707107,0,-0.707107,1.715833,1.5,2.1475,
+ -0.707107,0,-0.707107,2.1475,3,1.715833,
+ -0.707107,0,-0.707107,2.1475,1.5,1.715833,
+ 1,0,0,2.1475,3,1.715833,
+ 1,0,0,2.1475,1.5,2.1475,
+ 1,0,0,2.1475,1.5,1.715833,
+ 1,0,0,2.1475,1.5,2.1475,
+ 1,0,0,2.1475,3,1.715833,
+ 1,0,0,2.1475,3,2.1475,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,1.5,3,
+ 0.707107,0,0.707107,2.1475,1.5,2.1475,
+ 0.707107,0,0.707107,1.295,1.5,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,1.540777,3,
+ 0.707107,0,0.707107,1.295,1.540777,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,1.584914,3,
+ 0.707107,0,0.707107,1.295,1.584914,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,1.636977,3,
+ 0.707107,0,0.707107,1.295,1.636977,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,1.705,3,
+ 0.707107,0,0.707107,1.295,1.705,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,1.806804,3,
+ 0.707107,0,0.707107,1.295,1.806804,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,1.994914,3,
+ 0.707107,0,0.707107,1.295,1.994914,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,2.231186,3,
+ 0.707107,0,0.707107,1.295,2.231186,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,2.530605,3,
+ 0.707107,0,0.707107,1.295,2.530605,3,
+ 0.707107,0,0.707107,2.1475,3,2.1475,
+ 0.707107,0,0.707107,1.295,3,3,
+ 0.259688,0.73451,0.626943,1.295,3,3,
+ 0.828694,0.205349,0.52067,2.1475,3,2.1475,
+ 0,1,0,1.5,3,2.795,
+ 1,0,0,1.5,3,1.5,
+ 1,0,0,1.5,1.5,1.812191,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,1.5,1.812191,
+ 1,0,0,1.5,3,1.5,
+ 1,0,0,1.5,3,1.812191,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.508856,3,1.812374,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.705014,3,1.73585,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.715833,3,1.725471,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.705014,3,1.73585,
+ 0,1,0,1.68091,3,1.75481,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.68091,3,1.75481,
+ 0,1,0,1.655063,3,1.771315,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.655063,3,1.771315,
+ 0,1,0,1.627723,3,1.785207,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.627723,3,1.785207,
+ 0,1,0,1.599152,3,1.796353,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.599152,3,1.796353,
+ 0,1,0,1.569627,3,1.804645,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.569627,3,1.804645,
+ 0,1,0,1.539432,3,1.810002,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.539432,3,1.810002,
+ 0,1,0,1.508856,3,1.812374,
+ 0,-1,0,1.5,1.5,1.812191,
+ 0,-1,0,1.0625,1.5,1.5,
+ 0,-1,0,1.5,1.5,1.5,
+ 0,-1,0,1.0625,1.5,1.5,
+ 0,-1,0,1.5,1.5,1.812191,
+ 0,-1,0,1.0625,1.5,1.759,
+ 0,-1,0,0,1.5,2.795,
+ 0,-1,0,0,1.5,2.277,
+ 0,-1,0,0.53125,1.5,2.277,
+ 0,-1,0,0,1.5,2.795,
+ 0,-1,0,0.53125,1.5,2.277,
+ 0,-1,0,0.777,1.5,2.795,
+ 0,-1,0,0.777,1.5,2.795,
+ 0,-1,0,0.53125,1.5,2.018,
+ 0,-1,0,0.796875,1.5,2.018,
+ 0,-1,0,0.53125,1.5,2.018,
+ 0,-1,0,0.777,1.5,2.795,
+ 0,-1,0,0.53125,1.5,2.277,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,2.1475,1.5,1.715833,
+ 0,-1,0,2.1475,1.5,2.1475,
+ 0,-1,0,1.295,1.5,3,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,2.1475,1.5,2.1475,
+ 0,-1,0,1.295,1.5,3,
+ 0,-1,0,0.777,1.5,2.795,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,0.777,1.5,2.795,
+ 0,-1,0,1.295,1.5,3,
+ 0,-1,0,0.777,1.5,3,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,0.796875,1.5,2.018,
+ 0,-1,0,0.796875,1.5,1.759,
+ 0,-1,0,0.796875,1.5,2.018,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,0.777,1.5,2.795,
+ 0,-1,0,1.5,1.5,1.812191,
+ 0,-1,0,0.796875,1.5,1.759,
+ 0,-1,0,1.0625,1.5,1.759,
+ 0,-1,0,0.796875,1.5,1.759,
+ 0,-1,0,1.5,1.5,1.812191,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,0,1.5,0.723,
+ 0,-1,0,0,1.5,0.205,
+ 0,-1,0,0.53125,1.5,0.723,
+ 0,-1,0,0.53125,1.5,0.723,
+ 0,-1,0,0,1.5,0.205,
+ 0,-1,0,0.777,1.5,0.205,
+ 0,-1,0,0.796875,1.5,0.982,
+ 0,-1,0,0.53125,1.5,0.723,
+ 0,-1,0,0.777,1.5,0.205,
+ 0,-1,0,0.53125,1.5,0.723,
+ 0,-1,0,0.796875,1.5,0.982,
+ 0,-1,0,0.53125,1.5,0.982,
+ 0,-1,0,2.1475,1.5,1.284167,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,2.1475,1.5,0.8525,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.295,1.5,0,
+ 0,-1,0,2.1475,1.5,0.8525,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,0.777,1.5,0,
+ 0,-1,0,1.295,1.5,0,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,0.777,1.5,0.205,
+ 0,-1,0,0.777,1.5,0,
+ 0,-1,0,0.777,1.5,0.205,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,0.796875,1.5,0.982,
+ 0,-1,0,0.796875,1.5,0.982,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,0.796875,1.5,1.241,
+ 0,-1,0,1.5,1.5,1.187809,
+ 0,-1,0,0.796875,1.5,1.241,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,0.796875,1.5,1.241,
+ 0,-1,0,1.5,1.5,1.187809,
+ 0,-1,0,1.0625,1.5,1.241,
+ 1,0,0,1.715833,3,1.725471,
+ 1,0,0,1.715833,1.5,2.1475,
+ 1,0,0,1.715833,1.5,1.725471,
+ 1,0,0,1.715833,1.5,2.1475,
+ 1,0,0,1.715833,3,1.725471,
+ 1,0,0,1.715833,3,2.1475,
+ -0.011969,0,-0.999928,1.508856,3,1.812374,
+ 0.020743,0,-0.999785,1.5,1.5,1.812191,
+ 0.020743,0,-0.999785,1.5,3,1.812191,
+ 0.020743,0,-0.999785,1.5,1.5,1.812191,
+ -0.011969,0,-0.999928,1.508856,3,1.812374,
+ -0.044703,0,-0.999,1.508856,1.5,1.812374,
+ -0.692287,0,-0.721622,1.715833,3,1.725471,
+ -0.668315,0,-0.743879,1.705014,1.5,1.73585,
+ -0.6436,0,-0.765362,1.705014,3,1.73585,
+ -0.668315,0,-0.743879,1.705014,1.5,1.73585,
+ -0.692287,0,-0.721622,1.715833,3,1.725471,
+ -0.692287,0,-0.721622,1.715833,1.5,1.725471,
+ -0.6436,0,-0.765362,1.705014,3,1.73585,
+ -0.592184,0,-0.805803,1.68091,1.5,1.75481,
+ -0.565482,0,-0.824761,1.68091,3,1.75481,
+ -0.592184,0,-0.805803,1.68091,1.5,1.75481,
+ -0.6436,0,-0.765362,1.705014,3,1.73585,
+ -0.668315,0,-0.743879,1.705014,1.5,1.73585,
+ -0.565482,0,-0.824761,1.68091,3,1.75481,
+ -0.51035,0,-0.859967,1.655063,1.5,1.771315,
+ -0.481919,0,-0.876216,1.655063,3,1.771315,
+ -0.51035,0,-0.859967,1.655063,1.5,1.771315,
+ -0.565482,0,-0.824761,1.68091,3,1.75481,
+ -0.592184,0,-0.805803,1.68091,1.5,1.75481,
+ -0.481919,0,-0.876216,1.655063,3,1.771315,
+ -0.423601,0,-0.905849,1.627723,1.5,1.785207,
+ -0.393714,0,-0.919233,1.627723,3,1.785207,
+ -0.423601,0,-0.905849,1.627723,1.5,1.785207,
+ -0.481919,0,-0.876216,1.655063,3,1.771315,
+ -0.51035,0,-0.859967,1.655063,1.5,1.771315,
+ -0.393714,0,-0.919233,1.627723,3,1.785207,
+ -0.332772,0,-0.943007,1.599152,1.5,1.796353,
+ -0.301717,0,-0.953397,1.599152,3,1.796353,
+ -0.332772,0,-0.943007,1.599152,1.5,1.796353,
+ -0.393714,0,-0.919233,1.627723,3,1.785207,
+ -0.423601,0,-0.905849,1.627723,1.5,1.785207,
+ -0.301717,0,-0.953397,1.599152,3,1.796353,
+ -0.238739,0,-0.971084,1.569627,1.5,1.804645,
+ -0.206815,0,-0.97838,1.569627,3,1.804645,
+ -0.238739,0,-0.971084,1.569627,1.5,1.804645,
+ -0.301717,0,-0.953397,1.599152,3,1.796353,
+ -0.332772,0,-0.943007,1.599152,1.5,1.796353,
+ -0.206815,0,-0.97838,1.569627,3,1.804645,
+ -0.142406,0,-0.989808,1.539432,1.5,1.810002,
+ -0.109921,0,-0.99394,1.539432,3,1.810002,
+ -0.142406,0,-0.989808,1.539432,1.5,1.810002,
+ -0.206815,0,-0.97838,1.569627,3,1.804645,
+ -0.238739,0,-0.971084,1.569627,1.5,1.804645,
+ -0.109921,0,-0.99394,1.539432,3,1.810002,
+ -0.044703,0,-0.999,1.508856,1.5,1.812374,
+ -0.011969,0,-0.999928,1.508856,3,1.812374,
+ -0.044703,0,-0.999,1.508856,1.5,1.812374,
+ -0.109921,0,-0.99394,1.539432,3,1.810002,
+ -0.142406,0,-0.989808,1.539432,1.5,1.810002,
+ 0,0,1,1.036,3,3,
+ 0,0,1,1.201631,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,1,0,0.777,3,2.795,
+ 0,1,0,1.295,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.295,3,3,
+ 0,1,0,0.777,3,2.795,
+ 0,1,0,0.777,3,3,
+ 0.259688,0.73451,0.626943,1.295,3,3,
+ -0.408248,0.408248,0.816497,0.777,3,3,
+ 0,0,1,0.87868,3,3,
+ 0.259688,0.73451,0.626943,1.295,3,3,
+ 0,0,1,0.87868,3,3,
+ 0,0,1,1.201631,3,3,
+ 0.840862,0,-0.54125,1.5,3,1.812191,
+ 0.840862,0,-0.54125,1.715833,1.5,2.1475,
+ 0.840862,0,-0.54125,1.5,1.5,1.812191,
+ 0.840862,0,-0.54125,1.715833,1.5,2.1475,
+ 0.840862,0,-0.54125,1.5,3,1.812191,
+ 0.840862,0,-0.54125,1.715833,3,2.1475,
+ 0,-1,0,1.715833,3,2.1475,
+ 0,-1,0,1.5,3,1.812191,
+ 0,-1,0,1.607917,3,1.979845,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.691322,3,1.252913,
+ 0,1,0,1.71462,3,1.272856,
+ 0,1,0,1.691322,3,1.252913,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.666182,3,1.23535,
+ 0,1,0,1.666182,3,1.23535,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.639442,3,1.220336,
+ 0,1,0,1.639442,3,1.220336,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.611359,3,1.208015,
+ 0,1,0,1.611359,3,1.208015,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.582203,3,1.198505,
+ 0,1,0,1.582203,3,1.198505,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.552255,3,1.1919,
+ 0,1,0,1.552255,3,1.1919,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.521805,3,1.188262,
+ 0,1,0,1.521805,3,1.188262,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.5,3,1.187809,
+ 0.840862,0,0.54125,1.715833,3,0.8525,
+ 0.840862,0,0.54125,1.5,1.5,1.187809,
+ 0.840862,0,0.54125,1.715833,1.5,0.8525,
+ 0.840862,0,0.54125,1.5,1.5,1.187809,
+ 0.840862,0,0.54125,1.715833,3,0.8525,
+ 0.840862,0,0.54125,1.5,3,1.187809,
+ 0,-1,0,1.5,3,1.187809,
+ 0,-1,0,1.715833,3,0.8525,
+ 0,-1,0,1.607917,3,1.020155,
+ 1,0,0,1.715833,3,0.8525,
+ 1,0,0,1.715833,1.5,1.274121,
+ 1,0,0,1.715833,1.5,0.8525,
+ 1,0,0,1.715833,1.5,1.274121,
+ 1,0,0,1.715833,3,0.8525,
+ 1,0,0,1.715833,3,1.274121,
+ -0.053432,0,0.998571,1.521805,1.5,1.188262,
+ -0.020743,0,0.999785,1.5,3,1.187809,
+ -0.020743,0,0.999785,1.5,1.5,1.187809,
+ -0.020743,0,0.999785,1.5,3,1.187809,
+ -0.053432,0,0.998571,1.521805,1.5,1.188262,
+ -0.086099,0,0.996287,1.521805,3,1.188262,
+ -0.151052,0,0.988526,1.552255,1.5,1.1919,
+ -0.086099,0,0.996287,1.521805,3,1.188262,
+ -0.053432,0,0.998571,1.521805,1.5,1.188262,
+ -0.086099,0,0.996287,1.521805,3,1.188262,
+ -0.151052,0,0.988526,1.552255,1.5,1.1919,
+ -0.183337,0,0.98305,1.552255,3,1.1919,
+ -0.247217,0,0.96896,1.582203,1.5,1.198505,
+ -0.183337,0,0.98305,1.552255,3,1.1919,
+ -0.151052,0,0.988526,1.552255,1.5,1.1919,
+ -0.183337,0,0.98305,1.552255,3,1.1919,
+ -0.247217,0,0.96896,1.582203,1.5,1.198505,
+ -0.27881,0,0.960346,1.582203,3,1.198505,
+ -0.341001,0,0.940063,1.611359,1.5,1.208015,
+ -0.27881,0,0.960346,1.582203,3,1.198505,
+ -0.247217,0,0.96896,1.582203,1.5,1.198505,
+ -0.27881,0,0.960346,1.582203,3,1.198505,
+ -0.341001,0,0.940063,1.611359,1.5,1.208015,
+ -0.371598,0,0.928394,1.611359,3,1.208015,
+ -0.431501,0,0.902112,1.639442,1.5,1.220336,
+ -0.371598,0,0.928394,1.611359,3,1.208015,
+ -0.341001,0,0.940063,1.611359,1.5,1.208015,
+ -0.371598,0,0.928394,1.611359,3,1.208015,
+ -0.431501,0,0.902112,1.639442,1.5,1.220336,
+ -0.460807,0,0.8875,1.639442,3,1.220336,
+ -0.517846,0,0.855474,1.666182,1.5,1.23535,
+ -0.460807,0,0.8875,1.639442,3,1.220336,
+ -0.431501,0,0.902112,1.639442,1.5,1.220336,
+ -0.460807,0,0.8875,1.639442,3,1.220336,
+ -0.517846,0,0.855474,1.666182,1.5,1.23535,
+ -0.545579,0,0.83806,1.666182,3,1.23535,
+ -0.599204,0,0.800597,1.691322,1.5,1.252913,
+ -0.545579,0,0.83806,1.666182,3,1.23535,
+ -0.517846,0,0.855474,1.666182,1.5,1.23535,
+ -0.545579,0,0.83806,1.666182,3,1.23535,
+ -0.599204,0,0.800597,1.691322,1.5,1.252913,
+ -0.625096,0,0.780548,1.691322,3,1.252913,
+ -0.686784,0,0.726862,1.71462,1.5,1.272856,
+ -0.625096,0,0.780548,1.691322,3,1.252913,
+ -0.599204,0,0.800597,1.691322,1.5,1.252913,
+ -0.625096,0,0.780548,1.691322,3,1.252913,
+ -0.686784,0,0.726862,1.71462,1.5,1.272856,
+ -0.686784,0,0.726862,1.71462,3,1.272856,
+ -0.721622,0,0.692287,1.715833,3,1.274121,
+ -0.686784,0,0.726862,1.71462,1.5,1.272856,
+ -0.721622,0,0.692287,1.715833,1.5,1.274121,
+ -0.686784,0,0.726862,1.71462,1.5,1.272856,
+ -0.721622,0,0.692287,1.715833,3,1.274121,
+ -0.686784,0,0.726862,1.71462,3,1.272856,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.705014,1.5,1.73585,
+ 0,-1,0,1.715833,1.5,1.725471,
+ 0,-1,0,1.705014,1.5,1.73585,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.68091,1.5,1.75481,
+ 0,-1,0,1.68091,1.5,1.75481,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.655063,1.5,1.771315,
+ 0,-1,0,1.655063,1.5,1.771315,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.627723,1.5,1.785207,
+ 0,-1,0,1.627723,1.5,1.785207,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.599152,1.5,1.796353,
+ 0,-1,0,1.599152,1.5,1.796353,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.569627,1.5,1.804645,
+ 0,-1,0,1.569627,1.5,1.804645,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.539432,1.5,1.810002,
+ 0,-1,0,1.539432,1.5,1.810002,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.508856,1.5,1.812374,
+ 0,-1,0,1.715833,1.5,2.1475,
+ 0,-1,0,1.5,1.5,1.812191,
+ 0,-1,0,1.508856,1.5,1.812374,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.521805,1.5,1.188262,
+ 0,-1,0,1.5,1.5,1.187809,
+ 0,-1,0,1.521805,1.5,1.188262,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.552255,1.5,1.1919,
+ 0,-1,0,1.552255,1.5,1.1919,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.582203,1.5,1.198505,
+ 0,-1,0,1.582203,1.5,1.198505,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.611359,1.5,1.208015,
+ 0,-1,0,1.611359,1.5,1.208015,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.639442,1.5,1.220336,
+ 0,-1,0,1.639442,1.5,1.220336,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.666182,1.5,1.23535,
+ 0,-1,0,1.666182,1.5,1.23535,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.691322,1.5,1.252913,
+ 0,-1,0,1.691322,1.5,1.252913,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.71462,1.5,1.272856,
+ 0,-1,0,1.71462,1.5,1.272856,
+ 0,-1,0,1.715833,1.5,0.8525,
+ 0,-1,0,1.715833,1.5,1.274121,
+ 0,1,0,0,3,2.536,
+ 0,1,0,0.205,3,2.277,
+ 0,1,0,0,3,2.277,
+ 0,1,0,0.205,3,2.277,
+ 0,1,0,0,3,2.536,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.536,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0,3,0.464,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.464,
+ 0,1,0,0.205,3,0.723,
+ 0,1,0,0.205,3,0.723,
+ 0,1,0,0,3,0.464,
+ 0,1,0,0,3,0.723,
+ 0,1,0,0.777,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.87868,3,0,
+ 0,1,0,1.201631,3,0,
+ 0,1,0,0.777,3,0,
+ 0,1,0,1.295,3,0,
+ 0,1,0,1.295,3,0,
+ 0,1,0,0.777,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.777,3,0,
+ 0,1,0,0.777,3,0.205,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.1475,3,1.715833,
+ 0,1,0,1.715833,3,2.1475,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.53125,3,2.277,
+ 0,1,0,0.205,3,2.277,
+ 0,1,0,0.53125,3,2.277,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.777,3,2.795,
+ 0,1,0,0.53125,3,0.723,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.777,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.53125,3,0.723,
+ 0,1,0,0.723,3,0.982,
+ 0,1,0,0.723,3,0.982,
+ 0,1,0,0.53125,3,0.723,
+ 0,1,0,0.53125,3,0.982,
+ 0,1,0,1.0625,3,1.241,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,1.187809,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.0625,3,1.241,
+ 0,1,0,1.0625,3,1.5,
+ 0,1,0,1.5,3,1.187809,
+ 0,1,0,1.715833,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.715833,3,0.8525,
+ 0,1,0,1.5,3,1.187809,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.0625,3,1.5,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.0625,3,1.5,
+ 0,1,0,1.0625,3,1.759,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.796875,3,0.982,
+ 0,1,0,0.796875,3,1.241,
+ 0,1,0,0.796875,3,0.982,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.723,3,0.982,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.0625,3,1.759,
+ 0,1,0,0.796875,3,1.759,
+ 0,1,0,1.0625,3,1.759,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.715833,3,2.1475,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.715833,3,0.8525,
+ 0,1,0,2.1475,3,1.284167,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.715833,3,0.8525,
+ 0,0,1,2.1475,1.5,0.8525,
+ 0,0,1,1.715833,3,0.8525,
+ 0,0,1,1.715833,1.5,0.8525,
+ 0,0,1,1.715833,3,0.8525,
+ 0,0,1,2.1475,1.5,0.8525,
+ 0,0,1,2.1475,3,0.8525,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.715833,3,2.1475,
+ 0,0,-1,2.1475,3,2.1475,
+ 0,0,-1,1.715833,1.5,2.1475,
+ 0,0,-1,1.715833,3,2.1475,
+ 0,0,-1,1.715833,1.5,2.1475,
+ 0,0,-1,2.1475,3,2.1475,
+ 0,0,-1,2.1475,1.5,2.1475,
+ 0,1,0,0.796875,3,1.241,
+ 0,1,0,1.5,3,1.187809,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.5,3,1.187809,
+ 0,1,0,0.796875,3,1.241,
+ 0,1,0,1.0625,3,1.241,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.796875,3,2.018,
+ 0,1,0,0.723,3,2.018,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.796875,3,1.759,
+ 0,1,0,0.796875,3,2.018,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.53125,3,0.723,
+ 0,1,0,0.777,3,0.205,
+ 0,1,0,0.53125,3,0.723,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0.205,3,0.723,
+ -0.956392,0,-0.292087,0.53125,3,0.723,
+ -0.956392,0,-0.292087,0.777,1.5,0.205,
+ -0.989278,0,-0.146043,0.53125,1.5,0.723,
+ -0.956392,0,-0.292087,0.777,1.5,0.205,
+ -0.956392,0,-0.292087,0.53125,3,0.723,
+ -0.998843,0,-0.048086,0.777,3,0.205,
+ 0,1,0,0.53125,3,2.277,
+ 0,1,0,0.723,3,2.018,
+ 0,1,0,0.53125,3,2.018,
+ 0,1,0,0.723,3,2.018,
+ 0,1,0,0.53125,3,2.277,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.53125,3,2.277,
+ 0,1,0,0.777,3,2.795,
+ 0,-1,0,1.5,1.5,1.5,
+ 0,-1,0,1.0625,1.5,1.241,
+ 0,-1,0,1.5,1.5,1.187809,
+ 0,-1,0,1.0625,1.5,1.241,
+ 0,-1,0,1.5,1.5,1.5,
+ 0,-1,0,1.0625,1.5,1.5,
+ 1,0,0,1.5,3,1.187809,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,1.5,1.187809,
+ 1,0,0,1.5,1.5,1.5,
+ 1,0,0,1.5,3,1.187809,
+ 1,0,0,1.5,3,1.5,
+ 0,1,0,1.715833,3,2.1475,
+ 0,1,0,1.715833,3,1.725471,
+ 0,1,0,1.607917,3,1.979845,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.715833,3,1.274121,
+ 0,1,0,1.715833,3,0.8525,
+ 0,1,0,1.715833,3,1.274121,
+ 0,1,0,1.607917,3,1.020155,
+ 0,1,0,1.71462,3,1.272856,
+ -0.707107,0,0.707107,2.1475,3,1.284167,
+ -0.707107,0,0.707107,1.715833,1.5,0.8525,
+ -0.707107,0,0.707107,2.1475,1.5,1.284167,
+ -0.707107,0,0.707107,1.715833,1.5,0.8525,
+ -0.707107,0,0.707107,2.1475,3,1.284167,
+ -0.707107,0,0.707107,1.715833,3,0.8525
+};
+static const struct gllist lament_model_taser_b_frame = { GL_N3F_V3F, GL_TRIANGLES, 990, lament_model_taser_b_data, 0 };
+const struct gllist *lament_model_taser_b = &lament_model_taser_b_frame;
+
+static const float lament_model_taser_base_data[] = {
+ 0.341001,0,-0.940063,1.611359,3,1.208015,
+ 0.27881,0,-0.960346,1.582203,1.5,1.198505,
+ 0.247217,0,-0.96896,1.582203,3,1.198505,
+ 0.27881,0,-0.960346,1.582203,1.5,1.198505,
+ 0.341001,0,-0.940063,1.611359,3,1.208015,
+ 0.371598,0,-0.928394,1.611359,1.5,1.208015,
+ 0,1,0,1.295,1.5,0,
+ 0,1,0,1.5,1.5,1.187809,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.5,1.5,1.187809,
+ 0,1,0,1.295,1.5,0,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,1.5,1.5,1.187809,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,1.5,1.5,1.812191,
+ 0,1,0,1.5,1.5,1.812191,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,1.508856,1.5,1.812374,
+ 0,1,0,1.508856,1.5,1.812374,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.295,1.5,3,
+ 0,1,0,2.1475,1.5,2.1475,
+ 0,1,0,2.1475,1.5,2.1475,
+ 0,1,0,2.1475,1.5,1.715833,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.705014,1.5,1.73585,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.715833,1.5,1.725471,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.705014,1.5,1.73585,
+ 0,1,0,1.68091,1.5,1.75481,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.68091,1.5,1.75481,
+ 0,1,0,1.655063,1.5,1.771315,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.655063,1.5,1.771315,
+ 0,1,0,1.627723,1.5,1.785207,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.627723,1.5,1.785207,
+ 0,1,0,1.599152,1.5,1.796353,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.599152,1.5,1.796353,
+ 0,1,0,1.569627,1.5,1.804645,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.569627,1.5,1.804645,
+ 0,1,0,1.539432,1.5,1.810002,
+ 0,1,0,1.715833,1.5,2.1475,
+ 0,1,0,1.539432,1.5,1.810002,
+ 0,1,0,1.508856,1.5,1.812374,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.71462,1.5,1.272856,
+ 0,1,0,1.715833,1.5,1.274121,
+ 0,1,0,1.71462,1.5,1.272856,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.691322,1.5,1.252913,
+ 0,1,0,1.691322,1.5,1.252913,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.666182,1.5,1.23535,
+ 0,1,0,1.666182,1.5,1.23535,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.639442,1.5,1.220336,
+ 0,1,0,1.639442,1.5,1.220336,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.611359,1.5,1.208015,
+ 0,1,0,1.611359,1.5,1.208015,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.582203,1.5,1.198505,
+ 0,1,0,1.582203,1.5,1.198505,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.552255,1.5,1.1919,
+ 0,1,0,1.552255,1.5,1.1919,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.521805,1.5,1.188262,
+ 0,1,0,1.521805,1.5,1.188262,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,1.5,1.5,1.187809,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,2.1475,1.5,0.8525,
+ 0,1,0,1.295,1.5,0,
+ 0,1,0,2.1475,1.5,0.8525,
+ 0,1,0,1.715833,1.5,0.8525,
+ 0,1,0,2.1475,1.5,1.284167,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.193196,0,
+ 0,0,-1,1.295,1.295,0,
+ 0.206815,0,0.97838,1.569627,1.5,1.804645,
+ 0.142406,0,0.989808,1.539432,3,1.810002,
+ 0.109921,0,0.99394,1.539432,1.5,1.810002,
+ 0.142406,0,0.989808,1.539432,3,1.810002,
+ 0.206815,0,0.97838,1.569627,1.5,1.804645,
+ 0.238739,0,0.971084,1.569627,3,1.804645,
+ 0.565482,0,0.824761,1.68091,1.5,1.75481,
+ 0.51035,0,0.859967,1.655063,3,1.771315,
+ 0.481919,0,0.876216,1.655063,1.5,1.771315,
+ 0.51035,0,0.859967,1.655063,3,1.771315,
+ 0.565482,0,0.824761,1.68091,1.5,1.75481,
+ 0.592184,0,0.805803,1.68091,3,1.75481,
+ 0.053432,0,-0.998571,1.521805,3,1.188262,
+ 0.020743,0,-0.999785,1.5,1.5,1.187809,
+ 0.020743,0,-0.999785,1.5,3,1.187809,
+ 0.020743,0,-0.999785,1.5,1.5,1.187809,
+ 0.053432,0,-0.998571,1.521805,3,1.188262,
+ 0.086099,0,-0.996287,1.521805,1.5,1.188262,
+ -1,0,0,1.5,3,1.812191,
+ -1,0,0,1.5,1.5,1.187809,
+ -1,0,0,1.5,1.5,1.812191,
+ -1,0,0,1.5,1.5,1.187809,
+ -1,0,0,1.5,3,1.812191,
+ -1,0,0,1.5,3,1.187809,
+ -0.569325,0.581384,-0.581259,1.5,3,1.187809,
+ -0.216196,0.95311,0.211757,1.5,3,1.812191,
+ 0,1,0,1.5,3,1.5,
+ -1,0,0,1.715833,3,2.1475,
+ -1,0,0,1.715833,1.5,1.725471,
+ -1,0,0,1.715833,1.5,2.1475,
+ -1,0,0,1.715833,1.5,1.725471,
+ -1,0,0,1.715833,3,2.1475,
+ -1,0,0,1.715833,3,1.725471,
+ 0.247217,0,-0.96896,1.582203,3,1.198505,
+ 0.183337,0,-0.98305,1.552255,1.5,1.1919,
+ 0.151052,0,-0.988526,1.552255,3,1.1919,
+ 0.183337,0,-0.98305,1.552255,1.5,1.1919,
+ 0.247217,0,-0.96896,1.582203,3,1.198505,
+ 0.27881,0,-0.960346,1.582203,1.5,1.198505,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,2.1475,
+ 0.707107,0,0.707107,2.1475,1.5,1.715833,
+ 0.707107,0,0.707107,1.715833,3,2.1475,
+ 0.707107,0,0.707107,1.715833,1.5,2.1475,
+ 0.707107,0,0.707107,1.715833,3,2.1475,
+ 0.707107,0,0.707107,2.1475,1.5,1.715833,
+ 0.707107,0,0.707107,2.1475,3,1.715833,
+ 0.517846,0,-0.855474,1.666182,3,1.23535,
+ 0.460807,0,-0.8875,1.639442,1.5,1.220336,
+ 0.431501,0,-0.902112,1.639442,3,1.220336,
+ 0.460807,0,-0.8875,1.639442,1.5,1.220336,
+ 0.517846,0,-0.855474,1.666182,3,1.23535,
+ 0.545579,0,-0.83806,1.666182,1.5,1.23535,
+ 0.599204,0,-0.800597,1.691322,3,1.252913,
+ 0.545579,0,-0.83806,1.666182,1.5,1.23535,
+ 0.517846,0,-0.855474,1.666182,3,1.23535,
+ 0.545579,0,-0.83806,1.666182,1.5,1.23535,
+ 0.599204,0,-0.800597,1.691322,3,1.252913,
+ 0.625096,0,-0.780548,1.691322,1.5,1.252913,
+ 0.686784,0,-0.726862,1.71462,3,1.272856,
+ 0.625096,0,-0.780548,1.691322,1.5,1.252913,
+ 0.599204,0,-0.800597,1.691322,3,1.252913,
+ 0.625096,0,-0.780548,1.691322,1.5,1.252913,
+ 0.686784,0,-0.726862,1.71462,3,1.272856,
+ 0.686784,0,-0.726862,1.71462,1.5,1.272856,
+ 0.707107,0,-0.707107,1.715833,3,0.8525,
+ 0.707107,0,-0.707107,2.1475,1.5,1.284167,
+ 0.707107,0,-0.707107,1.715833,1.5,0.8525,
+ 0.707107,0,-0.707107,2.1475,1.5,1.284167,
+ 0.707107,0,-0.707107,1.715833,3,0.8525,
+ 0.707107,0,-0.707107,2.1475,3,1.284167,
+ -1,0,0,2.1475,3,2.1475,
+ -1,0,0,2.1475,1.5,1.715833,
+ -1,0,0,2.1475,1.5,2.1475,
+ -1,0,0,2.1475,1.5,1.715833,
+ -1,0,0,2.1475,3,2.1475,
+ -1,0,0,2.1475,3,1.715833,
+ 0.109921,0,0.99394,1.539432,1.5,1.810002,
+ 0.044703,0,0.999,1.508856,3,1.812374,
+ 0.011969,0,0.999928,1.508856,1.5,1.812374,
+ 0.044703,0,0.999,1.508856,3,1.812374,
+ 0.109921,0,0.99394,1.539432,1.5,1.810002,
+ 0.142406,0,0.989808,1.539432,3,1.810002,
+ 0.011969,0,0.999928,1.508856,1.5,1.812374,
+ -0.020743,0,0.999785,1.5,3,1.812191,
+ -0.020743,0,0.999785,1.5,1.5,1.812191,
+ -0.020743,0,0.999785,1.5,3,1.812191,
+ 0.011969,0,0.999928,1.508856,1.5,1.812374,
+ 0.044703,0,0.999,1.508856,3,1.812374,
+ 0.393714,0,0.919233,1.627723,1.5,1.785207,
+ 0.332772,0,0.943007,1.599152,3,1.796353,
+ 0.301717,0,0.953397,1.599152,1.5,1.796353,
+ 0.332772,0,0.943007,1.599152,3,1.796353,
+ 0.393714,0,0.919233,1.627723,1.5,1.785207,
+ 0.423601,0,0.905849,1.627723,3,1.785207,
+ 0.301717,0,0.953397,1.599152,1.5,1.796353,
+ 0.238739,0,0.971084,1.569627,3,1.804645,
+ 0.206815,0,0.97838,1.569627,1.5,1.804645,
+ 0.238739,0,0.971084,1.569627,3,1.804645,
+ 0.301717,0,0.953397,1.599152,1.5,1.796353,
+ 0.332772,0,0.943007,1.599152,3,1.796353,
+ -1,0,0,1.715833,3,1.274121,
+ -1,0,0,1.715833,1.5,0.8525,
+ -1,0,0,1.715833,1.5,1.274121,
+ -1,0,0,1.715833,1.5,0.8525,
+ -1,0,0,1.715833,3,1.274121,
+ -1,0,0,1.715833,3,0.8525,
+ 0.481919,0,0.876216,1.655063,1.5,1.771315,
+ 0.423601,0,0.905849,1.627723,3,1.785207,
+ 0.393714,0,0.919233,1.627723,1.5,1.785207,
+ 0.423601,0,0.905849,1.627723,3,1.785207,
+ 0.481919,0,0.876216,1.655063,1.5,1.771315,
+ 0.51035,0,0.859967,1.655063,3,1.771315,
+ 0.151052,0,-0.988526,1.552255,3,1.1919,
+ 0.086099,0,-0.996287,1.521805,1.5,1.188262,
+ 0.053432,0,-0.998571,1.521805,3,1.188262,
+ 0.086099,0,-0.996287,1.521805,1.5,1.188262,
+ 0.151052,0,-0.988526,1.552255,3,1.1919,
+ 0.183337,0,-0.98305,1.552255,1.5,1.1919,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0.205,0,
+ -0.707107,0,-0.707107,1.295,1.540777,3,
+ -0.707107,0,-0.707107,2.1475,1.5,2.1475,
+ -0.707107,0,-0.707107,1.295,1.5,3,
+ -0.707107,0,-0.707107,2.1475,1.5,2.1475,
+ -0.707107,0,-0.707107,1.295,1.540777,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,1.540777,3,
+ -0.707107,0,-0.707107,1.295,1.584914,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,1.584914,3,
+ -0.707107,0,-0.707107,1.295,1.636977,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,1.636977,3,
+ -0.707107,0,-0.707107,1.295,1.705,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,1.705,3,
+ -0.707107,0,-0.707107,1.295,1.806804,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,1.806804,3,
+ -0.707107,0,-0.707107,1.295,1.994914,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,1.994914,3,
+ -0.707107,0,-0.707107,1.295,2.231186,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,2.231186,3,
+ -0.707107,0,-0.707107,1.295,2.530605,3,
+ -0.707107,0,-0.707107,2.1475,3,2.1475,
+ -0.707107,0,-0.707107,1.295,2.530605,3,
+ -0.707107,0,-0.707107,1.295,3,3,
+ -0.765259,0.274484,-0.582269,2.1475,3,2.1475,
+ -0.397052,0.561517,0.725981,1.295,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.540777,3,
+ 0,0,1,1.295,1.5,3,
+ -1,0,0,2.1475,3,1.284167,
+ -1,0,0,2.1475,1.5,0.8525,
+ -1,0,0,2.1475,1.5,1.284167,
+ -1,0,0,2.1475,1.5,0.8525,
+ -1,0,0,2.1475,3,1.284167,
+ -1,0,0,2.1475,3,0.8525,
+ 0.6436,0,0.765362,1.705014,1.5,1.73585,
+ 0.592184,0,0.805803,1.68091,3,1.75481,
+ 0.565482,0,0.824761,1.68091,1.5,1.75481,
+ 0.592184,0,0.805803,1.68091,3,1.75481,
+ 0.6436,0,0.765362,1.705014,1.5,1.73585,
+ 0.682921,0.000198,0.730492,1.705014,3,1.73585,
+ 0.431501,0,-0.902112,1.639442,3,1.220336,
+ 0.371598,0,-0.928394,1.611359,1.5,1.208015,
+ 0.341001,0,-0.940063,1.611359,3,1.208015,
+ 0.371598,0,-0.928394,1.611359,1.5,1.208015,
+ 0.431501,0,-0.902112,1.639442,3,1.220336,
+ 0.460807,0,-0.8875,1.639442,1.5,1.220336,
+ 0.686784,0,-0.726862,1.71462,3,1.272856,
+ 0.721622,0,-0.692287,1.715833,1.5,1.274121,
+ 0.686784,0,-0.726862,1.71462,1.5,1.272856,
+ 0.721622,0,-0.692287,1.715833,1.5,1.274121,
+ 0.686784,0,-0.726862,1.71462,3,1.272856,
+ 0.721622,0,-0.692287,1.715833,3,1.274121,
+ 0.713423,0.000297,0.700733,1.715833,1.5,1.725471,
+ 0.682921,0.000198,0.730492,1.705014,3,1.73585,
+ 0.6436,0,0.765362,1.705014,1.5,1.73585,
+ 0.682921,0.000198,0.730492,1.705014,3,1.73585,
+ 0.713423,0.000297,0.700733,1.715833,1.5,1.725471,
+ 0.733929,0.000594,0.679226,1.71462,3,1.725471,
+ 0,0,1,1.71462,3,1.725471,
+ 0,0,1,1.715833,1.5,1.725471,
+ 0,0,1,1.715833,3,1.725471,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,1.540777,0,
+ -0.707107,0,0.707107,1.295,1.5,0,
+ -0.707107,0,0.707107,1.295,1.540777,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,1.584914,0,
+ -0.707107,0,0.707107,1.295,1.584914,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,1.636977,0,
+ -0.707107,0,0.707107,1.295,1.636977,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,1.705,0,
+ -0.707107,0,0.707107,1.295,1.705,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,1.806804,0,
+ -0.707107,0,0.707107,1.295,1.806804,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,1.994914,0,
+ -0.707107,0,0.707107,1.295,1.994914,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,2.231186,0,
+ -0.707107,0,0.707107,1.295,2.231186,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,2.530605,0,
+ -0.707107,0,0.707107,1.295,2.530605,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.295,3,0,
+ -0.707107,0,0.707107,1.295,3,0,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,1.5,3,0.205,
+ -0.707107,0,0.707107,1.5,3,0.205,
+ -0.707107,0,0.707107,2.1475,1.5,0.8525,
+ -0.707107,0,0.707107,2.1475,3,0.8525,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.295,0,
+ 0,0,-1,1.295,1.363023,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.459223,0,
+ 0,0,-1,1.295,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.806804,0,
+ 0,0,-1,1.295,1.994914,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.415086,0,
+ 0,0,-1,1.295,1.459223,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.5,0,
+ 0,0,-1,1.295,1.540777,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.295,2.231186,0,
+ 0,0,-1,1.295,2.530605,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.295,1.994914,0,
+ 0,0,-1,1.295,2.231186,0,
+ 0,0,-1,1.295,1.994914,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.584914,0,
+ 0,0,-1,1.295,1.636977,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.636977,0,
+ 0,0,-1,1.295,1.705,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0.436436,-0.218218,-0.872872,3,0,0,
+ 0.6,0,-0.8,3,0.497732,0,
+ 1,0,0,3,0.205,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.497732,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,0.87868,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.201631,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.295,2.530605,0,
+ 0,0,-1,1.295,3,0,
+ 0,0,-1,1.295,2.530605,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,3,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.295,0,0,
+ 0,0,-1,1.295,0.469395,0,
+ 0,0,-1,1.295,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.705,0,
+ 0,0,-1,1.295,1.806804,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.798369,3,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.363023,0,
+ 0,0,-1,1.295,1.415086,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.798369,0,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,2.12132,0,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,2.12132,3,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,3,1.5,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.502268,3,0,
+ 0,0,-1,2.795,3,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.795,3,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,2.502268,0,
+ 0.447214,0,-0.894427,3,2.502268,0,
+ 0.408248,0.408248,-0.816497,3,3,0,
+ 1,0,0,3,2.795,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.295,0.469395,0,
+ 0,0,-1,1.295,0.768814,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,0.768814,0,
+ 0,0,-1,1.295,1.005086,0,
+ 0,0,-1,1.295,0.768814,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,3,2.502268,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,3,2.12132,0,
+ 0,0,-1,3,1.798369,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.502268,0,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,3,0,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.351731,2.245397,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,2.25634,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,2.26,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.574493,2.25634,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.574493,0.74366,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.648269,2.245397,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.648269,0.754603,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.720616,2.227275,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.720616,0.772725,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.790839,2.202148,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.790839,0.797852,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.858262,2.17026,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.858262,0.82974,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.922233,2.131917,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.922233,0.868083,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,1.982139,2.087488,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,1.982139,0.912512,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.037401,2.037401,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.037401,0.962599,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.087488,1.982139,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.087488,1.017861,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.131917,1.922233,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.131917,1.077767,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.17026,1.858262,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.17026,1.141738,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.202148,1.790839,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.202148,1.209161,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.227275,1.720616,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.227275,1.279384,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.245397,1.648269,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.245397,1.351731,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.25634,1.425507,0,
+ 0,0,-1,2.25634,1.574493,0,
+ 0,0,-1,2.26,1.5,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.351731,0.754603,0,
+ 0,0,-1,1.425507,0.74366,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.5,0.74,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.005086,0,
+ 0,0,-1,1.295,1.193196,0,
+ 0,0,-1,1.5,1.5,0,
+ 0,0,-1,1.295,1.540777,0,
+ 0,0,-1,1.295,1.584914,0,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.5,3,
+ 0,0,1,1.295,1.459223,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.295,2.530605,3,
+ 0,0,1,1.295,2.231186,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,2.231186,3,
+ 0,0,1,1.295,1.994914,3,
+ 0,0,1,1.295,2.231186,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.363023,3,
+ 0,0,1,1.295,1.295,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.295,0.469395,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,1.295,0.469395,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.415086,3,
+ 0,0,1,1.295,1.363023,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.295,3,
+ 0,0,1,1.295,1.193196,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,0.497732,3,
+ 0.447214,0,0.894427,3,0.497732,3,
+ 0.365148,-0.182574,0.912871,3,0,3,
+ 1,0,0,3,0.205,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,3,0.497732,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.584914,3,
+ 0,0,1,1.295,1.540777,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.459223,3,
+ 0,0,1,1.295,1.415086,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.193196,3,
+ 0,0,1,1.295,1.005086,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.295,0.768814,3,
+ 0,0,1,1.295,0.469395,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,3,0.87868,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.502268,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.806804,3,
+ 0,0,1,1.295,1.705,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.994914,3,
+ 0,0,1,1.295,1.806804,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.705,3,
+ 0,0,1,1.295,1.636977,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.295,1.636977,3,
+ 0,0,1,1.295,1.584914,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.295,3,3,
+ 0,0,1,1.295,2.530605,3,
+ 0,0,1,1.295,3,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,3,0,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.295,1.005086,3,
+ 0,0,1,1.295,0.768814,3,
+ 0,0,1,1.295,1.005086,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,2.12132,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.201631,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.798369,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,3,1.5,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,0,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,3,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,3,2.502268,3,
+ 0.408248,0.408248,0.816497,3,3,3,
+ 0.447214,0,0.894427,3,2.502268,3,
+ 1,0,0,3,2.795,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.795,3,3,
+ 0,0,1,2.795,3,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,3,3,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.12132,3,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,2.502268,3,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.351731,0.754603,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,0.74366,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,0.74,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.5,2.26,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.574493,0.74366,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.574493,2.25634,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.648269,0.754603,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.648269,2.245397,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.720616,0.772725,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.720616,2.227275,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.790839,0.797852,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.790839,2.202148,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.858262,0.82974,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.858262,2.17026,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.922233,2.131917,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.922233,0.868083,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,1.982139,0.912512,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,1.982139,2.087488,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.037401,0.962599,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.037401,2.037401,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.087488,1.017861,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.087488,1.982139,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.131917,1.077767,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.131917,1.922233,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.17026,1.141738,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.17026,1.858262,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.202148,1.209161,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.202148,1.790839,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.227275,1.279384,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.227275,1.720616,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.245397,1.648269,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.245397,1.351731,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.25634,1.574493,3,
+ 0,0,1,2.25634,1.425507,3,
+ 0,0,1,2.26,1.5,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.351731,2.245397,3,
+ 0,0,1,1.425507,2.25634,3,
+ 0,0,1,1.5,1.5,3,
+ 0,0,1,1.5,2.26,3,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,3,0,0,
+ 0,-1,0,2.502268,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,2.12132,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,1.798369,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,1.295,0,0,
+ 0,-1,0,1.295,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,1.295,0,3,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,3,0,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,2.502268,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,2.12132,0,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.295,0,3,
+ 0,0,1,1.798369,0,3,
+ 0,0,1,1.5,0,3,
+ -1,0,0,1.295,0.469395,3,
+ -1,0,0,1.295,0,0,
+ -1,0,0,1.295,0,3,
+ -1,0,0,1.295,0,0,
+ -1,0,0,1.295,0.469395,3,
+ -1,0,0,1.295,0.469395,0,
+ -1,0,0,1.295,0.469395,0,
+ -1,0,0,1.295,0.469395,3,
+ -1,0,0,1.295,0.768814,0,
+ -1,0,0,1.295,0.768814,0,
+ -1,0,0,1.295,0.469395,3,
+ -1,0,0,1.295,0.768814,3,
+ -1,0,0,1.295,0.768814,0,
+ -1,0,0,1.295,0.768814,3,
+ -1,0,0,1.295,1.005086,3,
+ -1,0,0,1.295,0.768814,0,
+ -1,0,0,1.295,1.005086,3,
+ -1,0,0,1.295,1.005086,0,
+ -1,0,0,1.295,1.005086,0,
+ -1,0,0,1.295,1.005086,3,
+ -1,0,0,1.295,1.193196,0,
+ -1,0,0,1.295,1.193196,0,
+ -1,0,0,1.295,1.005086,3,
+ -1,0,0,1.295,1.193196,3,
+ -1,0,0,1.295,1.193196,0,
+ -1,0,0,1.295,1.193196,3,
+ -1,0,0,1.295,1.295,0,
+ -1,0,0,1.295,1.295,0,
+ -1,0,0,1.295,1.193196,3,
+ -1,0,0,1.295,1.295,3,
+ -1,0,0,1.295,1.295,0,
+ -1,0,0,1.295,1.295,3,
+ -1,0,0,1.295,1.363023,0,
+ -1,0,0,1.295,1.363023,0,
+ -1,0,0,1.295,1.295,3,
+ -1,0,0,1.295,1.363023,3,
+ -1,0,0,1.295,1.363023,0,
+ -1,0,0,1.295,1.363023,3,
+ -1,0,0,1.295,1.415086,3,
+ -1,0,0,1.295,1.363023,0,
+ -1,0,0,1.295,1.415086,3,
+ -1,0,0,1.295,1.415086,0,
+ -1,0,0,1.295,1.415086,0,
+ -1,0,0,1.295,1.415086,3,
+ -1,0,0,1.295,1.459223,3,
+ -1,0,0,1.295,1.415086,0,
+ -1,0,0,1.295,1.459223,3,
+ -1,0,0,1.295,1.459223,0,
+ -1,0,0,1.295,1.459223,0,
+ -1,0,0,1.295,1.459223,3,
+ -1,0,0,1.295,1.5,3,
+ -1,0,0,1.295,1.459223,0,
+ -1,0,0,1.295,1.5,3,
+ -1,0,0,1.295,1.5,0,
+ 0,1,0,1.5,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.295,3,3,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.295,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,1.798369,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,2.12132,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,2.502268,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,3,3,3,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.1475,3,1.715833,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,1.715833,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.502268,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.502268,3,3,
+ 0,1,0,2.795,3,3,
+ 0,0.447214,0.894427,2.502268,3,3,
+ 0,0.514496,0.857493,1.5,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0.447214,0.894427,2.502268,3,3,
+ 0,0,1,1.798369,3,3,
+ 0,0,1,2.12132,3,3,
+ 0,1,0,2.1475,3,1.284167,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,1.284167,
+ 0,1,0,2.1475,3,1.5,
+ 0,1,0,1.71462,3,1.5,
+ 0,1,0,1.715833,3,1.274121,
+ 0,1,0,1.71462,3,1.272856,
+ 0,1,0,1.715833,3,1.274121,
+ 0,1,0,1.71462,3,1.5,
+ 0,1,0,2.1475,3,1.284167,
+ 0,1,0,2.1475,3,1.284167,
+ 0,1,0,1.71462,3,1.5,
+ 0,1,0,2.1475,3,1.5,
+ 0,1,0,2.1475,3,1.284167,
+ 0,1,0,1.715833,3,0.8525,
+ 0,1,0,1.715833,3,1.274121,
+ 0,1,0,1.71462,3,1.725471,
+ 0,1,0,2.1475,3,1.5,
+ 0,1,0,1.71462,3,1.5,
+ 0,1,0,2.1475,3,1.5,
+ 0,1,0,1.71462,3,1.725471,
+ 0,1,0,2.1475,3,1.715833,
+ 0,1,0,2.1475,3,1.715833,
+ 0,1,0,1.71462,3,1.725471,
+ 0,1,0,1.715833,3,1.725471,
+ 0,1,0,2.1475,3,1.715833,
+ 0,1,0,1.715833,3,1.725471,
+ 0,1,0,1.715833,3,2.1475,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.521805,3,1.188262,
+ 0,1,0,1.5,3,1.187809,
+ 0,1,0,1.521805,3,1.188262,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.552255,3,1.1919,
+ 0,1,0,1.552255,3,1.1919,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.582203,3,1.198505,
+ 0,1,0,1.582203,3,1.198505,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.611359,3,1.208015,
+ 0,1,0,1.611359,3,1.208015,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.639442,3,1.220336,
+ 0,1,0,1.639442,3,1.220336,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.666182,3,1.23535,
+ 0,1,0,1.666182,3,1.23535,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.691322,3,1.252913,
+ 0,1,0,1.691322,3,1.252913,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.71462,3,1.272856,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.71462,3,1.725471,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.71462,3,1.725471,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.705014,3,1.73585,
+ 0,1,0,1.705014,3,1.73585,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.68091,3,1.75481,
+ 0,1,0,1.68091,3,1.75481,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.655063,3,1.771315,
+ 0,1,0,1.655063,3,1.771315,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.627723,3,1.785207,
+ 0,1,0,1.627723,3,1.785207,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.599152,3,1.796353,
+ 0,1,0,1.599152,3,1.796353,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.569627,3,1.804645,
+ 0,1,0,1.569627,3,1.804645,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.539432,3,1.810002,
+ 0,1,0,1.539432,3,1.810002,
+ 0,1,0,1.5,3,1.812191,
+ 0,1,0,1.508856,3,1.812374,
+ 0,1,0,1.71462,3,1.725471,
+ 0,1,0,1.71462,3,1.5,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,1.71462,3,1.5,
+ 0,1,0,1.71462,3,1.272856,
+ 0,1,0,1.5,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.1475,3,2.1475,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.795,3,3,
+ 0,1,0,3,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,3,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0.205,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,1.5,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,0.497732,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,0.87868,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.201631,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0.205,3,
+ 1,0,0,3,0,3,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,3,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,3,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,2.795,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,0.205,1.5,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,1.5,
+ 1,0,0,3,3,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,3,2.795,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.205,0,
+ 1,0,0,3,0.205,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.497732,0,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,0.87868,0,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,1.201631,0,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,1.5,2.795,
+ 1,0,0,3,1.5,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,1.798369,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.12132,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.502268,3,
+ 1,0,0,3,2.795,2.795,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.5,0.205,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.5,0,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,1.798369,0,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.12132,0,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0.205,
+ 1,0,0,3,2.502268,0,
+ 1,0,0,3,2.795,0,
+ 1,0,0,3,3,3,
+ 1,0,0,3,2.795,3,
+ 1,0,0,3,2.795,2.795
+};
+static const struct gllist lament_model_taser_base_frame = { GL_N3F_V3F, GL_TRIANGLES, 1362, lament_model_taser_base_data, 0 };
+const struct gllist *lament_model_taser_base = &lament_model_taser_base_frame;
+
+static const float lament_model_tetra_base_data[] = {
+ 0.57735,0.57735,0.57735,0,3,3,
+ 0.57735,0.57735,0.57735,3,0,3,
+ 0.57735,0.57735,0.57735,3,3,0,
+ -0.57735,-0.57735,0.57735,0,3,3,
+ -0.57735,-0.57735,0.57735,0,0,0,
+ -0.57735,-0.57735,0.57735,3,0,3,
+ -0.57735,0.57735,-0.57735,3,3,0,
+ -0.57735,0.57735,-0.57735,0,0,0,
+ -0.57735,0.57735,-0.57735,0,3,3,
+ 0.57735,-0.57735,-0.57735,3,3,0,
+ 0.57735,-0.57735,-0.57735,3,0,3,
+ 0.57735,-0.57735,-0.57735,0,0,0
+};
+static const struct gllist lament_model_tetra_base_frame = { GL_N3F_V3F, GL_TRIANGLES, 12, lament_model_tetra_base_data, 0 };
+const struct gllist *lament_model_tetra_base = &lament_model_tetra_base_frame;
+
+static const float lament_model_tetra_dse_data[] = {
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,0,-1,3,3,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.205,0,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,1.5,0,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,2.795,0,0,
+ 0,0,-1,2.795,0,0,
+ 0,0,-1,3,3,0,
+ 0,0,-1,3,0,0,
+ 1,0,0,3,3,0,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,0,0,
+ 1,0,0,3,0,0.205,
+ 1,0,0,3,3,0,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,0,1.5,
+ 1,0,0,3,3,0,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,0,2.795,
+ 1,0,0,3,3,0,
+ 1,0,0,3,0,3,
+ -0.57735,0.57735,0.57735,3,3,0,
+ -0.57735,0.57735,0.57735,2.795,0,2.795,
+ -0.57735,0.57735,0.57735,3,0,3,
+ -0.57735,0.57735,0.57735,2.795,0,2.795,
+ -0.57735,0.57735,0.57735,3,3,0,
+ -0.57735,0.57735,0.57735,2.1475,0,2.1475,
+ -0.57735,0.57735,0.57735,2.1475,0,2.1475,
+ -0.57735,0.57735,0.57735,3,3,0,
+ -0.57735,0.57735,0.57735,0.8525,0,0.8525,
+ -0.57735,0.57735,0.57735,0.8525,0,0.8525,
+ -0.57735,0.57735,0.57735,3,3,0,
+ -0.57735,0.57735,0.57735,0.205,0,0.205,
+ -0.57735,0.57735,0.57735,0.205,0,0.205,
+ -0.57735,0.57735,0.57735,3,3,0,
+ -0.57735,0.57735,0.57735,0,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,3,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,0.205,0,0,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,3,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,2.795,0,0,
+ 0,-1,0,1.5,0,0,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,0.205,
+ 0,-1,0,2.795,0,0.205,
+ 0,-1,0,3,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,2.795,0,1.5,
+ 0,-1,0,1.5,0,0.205,
+ 0,-1,0,2.795,0,0.205
+};
+static const struct gllist lament_model_tetra_dse_frame = { GL_N3F_V3F, GL_TRIANGLES, 90, lament_model_tetra_dse_data, 0 };
+const struct gllist *lament_model_tetra_dse = &lament_model_tetra_dse_frame;
+
+static const float lament_model_tetra_dwn_data[] = {
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ -1,0,0,0,3,3,
+ -1,0,0,0,3,0,
+ -1,0,0,0,0,0,
+ -0.57735,0.57735,-0.57735,0,3,0,
+ -0.265408,0.893371,0.362555,0,3,3,
+ 0,1,0,0,3,2.795,
+ -0.57735,0.57735,-0.57735,0,3,0,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0,3,1.5,
+ -0.57735,0.57735,-0.57735,0,3,0,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0,3,0.205,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0,3,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,0.205,3,0,
+ 0,0,-1,3,3,0,
+ 0.694747,0.50859,-0.50859,3,3,0,
+ 0,0.83205,-0.5547,0.205,3,0,
+ 0,1,0,1.5,3,0,
+ 0.694747,0.50859,-0.50859,3,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,2.795,3,0,
+ 0.57735,-0.57735,0.57735,2.795,3,0.205,
+ 0.57735,-0.57735,0.57735,0,0,0,
+ 0.57735,-0.57735,0.57735,3,3,0,
+ 0.57735,-0.57735,0.57735,0,0,0,
+ 0.57735,-0.57735,0.57735,2.795,3,0.205,
+ 0.57735,-0.57735,0.57735,0,3,3,
+ -0.265408,0.893371,0.362555,0,3,3,
+ 0.468609,0.748873,0.468609,2.795,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ -0.265408,0.893371,0.362555,0,3,3,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0,3,3,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,2.795,3,0,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,0.205,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,0,3,1.5,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0,
+ 0,1,0,0.205,3,0,
+ 0,1,0,1.5,3,0,
+ 0,1,0,0.205,3,0.205,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,1.5,
+ 0,1,0,1.5,3,0.205,
+ 0,1,0,0.205,3,0.205
+};
+static const struct gllist lament_model_tetra_dwn_frame = { GL_N3F_V3F, GL_TRIANGLES, 90, lament_model_tetra_dwn_data, 0 };
+const struct gllist *lament_model_tetra_dwn = &lament_model_tetra_dwn_frame;
+
+static const float lament_model_tetra_une_data[] = {
+ 1,0,0,3,3,0,
+ 1,0,0,3,3,3,
+ 1,0,0,3,0,3,
+ 0.57735,0.57735,0.57735,3,3,3,
+ 0.50859,0.50859,-0.694747,3,3,0,
+ 0,1,0,3,3,0.205,
+ 0.57735,0.57735,0.57735,3,3,3,
+ 0,1,0,3,3,0.205,
+ 0,1,0,3,3,1.5,
+ 0.57735,0.57735,0.57735,3,3,3,
+ 0,1,0,3,3,1.5,
+ 0,1,0,3,3,2.795,
+ 0,0,1,3,0,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,3,3,
+ 0,0,1,3,0,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,1.5,3,3,
+ 0,0,1,3,0,3,
+ 0,0,1,2.795,3,3,
+ 0,0,1,2.795,3,3,
+ 0,0,1,3,0,3,
+ 0,0,1,3,3,3,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,3,3,0.205,
+ 0,1,0,3,3,0,
+ 0,1,0,2.795,3,0.205,
+ -0.57735,-0.57735,-0.57735,3,0,3,
+ -0.57735,-0.57735,-0.57735,2.795,3,0.205,
+ -0.57735,-0.57735,-0.57735,3,3,0,
+ -0.57735,-0.57735,-0.57735,2.795,3,0.205,
+ -0.57735,-0.57735,-0.57735,3,0,3,
+ -0.57735,-0.57735,-0.57735,2.1475,3,0.8525,
+ -0.57735,-0.57735,-0.57735,2.1475,3,0.8525,
+ -0.57735,-0.57735,-0.57735,3,0,3,
+ -0.57735,-0.57735,-0.57735,0.8525,3,2.1475,
+ -0.57735,-0.57735,-0.57735,0.8525,3,2.1475,
+ -0.57735,-0.57735,-0.57735,3,0,3,
+ -0.57735,-0.57735,-0.57735,0.205,3,2.795,
+ -0.57735,-0.57735,-0.57735,0.205,3,2.795,
+ -0.57735,-0.57735,-0.57735,3,0,3,
+ -0.57735,-0.57735,-0.57735,0,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,0.205,
+ 0,1,0,3,3,0.205,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,3,3,1.5,
+ 0,1,0,0.205,3,3,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,0.205,3,3,
+ 0,1,0,1.5,3,3,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,2.1475,3,0.8525,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,0.8525,3,2.1475,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.795,3,3,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,3,3,2.795,
+ 0,1,0,2.795,3,3,
+ 0,1,0,3,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,2.795,3,1.5,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,2.795,
+ 0,1,0,2.795,3,2.795,
+ 0,1,0,1.5,3,3,
+ 0,1,0,2.795,3,3
+};
+static const struct gllist lament_model_tetra_une_frame = { GL_N3F_V3F, GL_TRIANGLES, 90, lament_model_tetra_une_data, 0 };
+const struct gllist *lament_model_tetra_une = &lament_model_tetra_une_frame;
+
+static const float lament_model_tetra_usw_data[] = {
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,1.5,0,2.795,
+ 0,0,1,0.205,0,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0,0,3,
+ 0,0,1,0,3,3,
+ 0,0,1,0.205,0,3,
+ 0,0,1,3,0,3,
+ 0.694747,-0.50859,0.50859,3,0,3,
+ 0,-0.83205,0.5547,0.205,0,3,
+ 0,-1,0,1.5,0,3,
+ 0.694747,-0.50859,0.50859,3,0,3,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,2.795,0,3,
+ -1,0,0,0,3,3,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,0,3,
+ -1,0,0,0,0,2.795,
+ -1,0,0,0,3,3,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,0,1.5,
+ -1,0,0,0,3,3,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,0,0.205,
+ -1,0,0,0,3,3,
+ -1,0,0,0,0,0,
+ 0.57735,0.57735,-0.57735,0,3,3,
+ 0.57735,0.57735,-0.57735,0.205,0,0.205,
+ 0.57735,0.57735,-0.57735,0,0,0,
+ 0.57735,0.57735,-0.57735,0.205,0,0.205,
+ 0.57735,0.57735,-0.57735,0,3,3,
+ 0.57735,0.57735,-0.57735,0.8525,0,0.8525,
+ 0.57735,0.57735,-0.57735,0.8525,0,0.8525,
+ 0.57735,0.57735,-0.57735,0,3,3,
+ 0.57735,0.57735,-0.57735,2.1475,0,2.1475,
+ 0.57735,0.57735,-0.57735,2.1475,0,2.1475,
+ 0.57735,0.57735,-0.57735,0,3,3,
+ 0.57735,0.57735,-0.57735,2.795,0,2.795,
+ 0.57735,0.57735,-0.57735,2.795,0,2.795,
+ 0.57735,0.57735,-0.57735,0,3,3,
+ 0.57735,0.57735,-0.57735,3,0,3,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.8525,0,0.8525,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.1475,0,2.1475,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0,0,0,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0.205,0,3,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,0.205,0,3,
+ 0,-1,0,0,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,1.5,0,3,
+ 0,-1,0,0.205,0,3,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,0.205,
+ 0,-1,0,0,0,0.205,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,0,0,1.5,
+ 0,-1,0,0.205,0,2.795,
+ 0,-1,0,0.205,0,1.5,
+ 0,-1,0,1.5,0,2.795,
+ 0,-1,0,2.795,0,3,
+ 0,-1,0,2.795,0,2.795,
+ 0,-1,0,3,0,3
+};
+static const struct gllist lament_model_tetra_usw_frame = { GL_N3F_V3F, GL_TRIANGLES, 90, lament_model_tetra_usw_data, 0 };
+const struct gllist *lament_model_tetra_usw = &lament_model_tetra_usw_frame;
diff --git a/hacks/glx/lavalite.c b/hacks/glx/lavalite.c
new file mode 100644
index 0000000..73d5805
--- /dev/null
+++ b/hacks/glx/lavalite.c
@@ -0,0 +1,1539 @@
+/* lavalite --- 3D Simulation a Lava Lite, written by jwz.
+ *
+ * This software Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * LAVA®, LAVA LITE®, LAVA WORLD INTERNATIONAL® and the configuration of the
+ * LAVA® brand motion lamp are registered trademarks of Haggerty Enterprises,
+ * Inc. The configuration of the globe and base of the motion lamp are
+ * registered trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in
+ * other countries around the world.
+ *
+ * Official Lava Lite web site: http://www.lavaworld.com/
+ *
+ * Implementation details:
+ *
+ * The blobs are generated using metaballs. For an explanation of what
+ * those are, see http://astronomy.swin.edu.au/~pbourke/modelling/implicitsurf/
+ * or http://www.fifi.org/doc/povray-manual/pov30005.htm
+ *
+ * Basically, each bubble of lava is a few (4) overlapping spherical metaballs
+ * of various sizes following similar but slightly different steep, slow
+ * parabolic arcs from the bottom to the top and back.
+ *
+ * We then polygonize the surface of the lava using the marching squares
+ * algorithm implemented in marching.c.
+ *
+ * Like real lavalites, this program is very slow.
+ *
+ * Surprisingly, it's loading the CPU and not the graphics engine: the speed
+ * bottleneck is in *computing* the scene rather than *rendering* it. We
+ * actually don't use a huge number of polygons, but computing the mesh for
+ * the surface takes a lot of cycles.
+ *
+ * I eliminated all the square roots, but there is still a lot of
+ * floating-point multiplication in here. I tried optimizing away the
+ * fp divisions, but that didn't seem to make a difference.
+ *
+ * -style lamp shape: classic, giant, cone, rocket, or random.
+ * -speed frequency at which new blobs launch.
+ * -resolution density of the polygon mesh.
+ * -count max number of blobs allowed at once.
+ * -wander, -spin whether to roll the scene around the screen.
+ * -lava-color color of the blobbies
+ * -fluid-color color of the stuff the blobbies float in
+ * -base-color color of the base of the lamp
+ * -table-color color of the table under the lamp
+ * -impatient at startup, skip forward in the animation so
+ * that at least one blob is fully exposed.
+ *
+ * TODO:
+ *
+ * - make the table look better, somehow.
+ * - should the lava be emissive? should the one at the bottom be
+ * more brightly colored than the ones at the top? light distance?
+ * - is there some way to put a specular reflection on the front glass
+ * itself? Maybe render it twice with FRONT/BACK tweaked, or alpha
+ * with depth buffering turned off?
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*geometry: 600x900\n" \
+ "*count: " DEF_COUNT " \n" \
+
+# define free_lavalite 0
+# define release_lavalite 0
+
+
+#define BLOBS_PER_GROUP 4
+
+#define GRAVITY 0.000013 /* odwnward acceleration */
+#define CONVECTION 0.005 /* initial upward velocity (bell curve) */
+#define TILT 0.00166666 /* horizontal velocity (bell curve) */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef ABS
+#define ABS(n) ((n)<0?-(n):(n))
+#undef SIGNOF
+#define SIGNOF(n) ((n)<0?-1:1)
+
+#include "xlockmore.h"
+#include "marching.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "Z"
+#define DEF_WANDER "False"
+#define DEF_SPEED "0.003"
+#define DEF_RESOLUTION "40"
+#define DEF_SMOOTH "True"
+#define DEF_COUNT "3"
+#define DEF_STYLE "random"
+#define DEF_IMPATIENT "False"
+#define DEF_LCOLOR "#FF0000" /* lava */
+#define DEF_FCOLOR "#00AAFF" /* fluid */
+#define DEF_BCOLOR "#666666" /* base */
+#define DEF_TCOLOR "#000000" /*"#00FF00"*/ /* table */
+
+#define DEF_FTEX "(none)"
+#define DEF_BTEX "(none)"
+#define DEF_TTEX "(none)"
+
+typedef struct metaball metaball;
+
+struct metaball {
+
+ Bool alive_p;
+ Bool static_p;
+
+ double r; /* hard radius */
+ double R; /* radius of field of influence */
+
+ double z; /* vertical position */
+ double pos_r; /* position on horizontal circle */
+ double pos_th; /* position on horizontal circle */
+ double dr, dz; /* current velocity */
+
+ double x, y; /* h planar position - compused from the above */
+
+ metaball *leader; /* stay close to this other ball */
+};
+
+
+typedef enum { CLASSIC = 0, GIANT, CONE, ROCKET } lamp_style;
+typedef enum { CAP = 100, BOTTLE, BASE } lamp_part;
+
+typedef struct {
+ lamp_part part;
+ GLfloat elevation;
+ GLfloat radius;
+ GLfloat texture_elevation;
+} lamp_geometry;
+
+static const lamp_geometry classic_lamp[] = {
+ { CAP, 1.16, 0.089, 0.00 },
+ { BOTTLE, 0.97, 0.120, 0.40 },
+ { BOTTLE, 0.13, 0.300, 0.87 },
+ { BOTTLE, 0.07, 0.300, 0.93 },
+ { BASE, 0.00, 0.280, 0.00 },
+ { BASE, -0.40, 0.120, 0.50 },
+ { BASE, -0.80, 0.280, 1.00 },
+ { 0, 0, 0, 0 },
+};
+
+static const lamp_geometry giant_lamp[] = {
+ { CAP, 1.12, 0.105, 0.00 },
+ { BOTTLE, 0.97, 0.130, 0.30 },
+ { BOTTLE, 0.20, 0.300, 0.87 },
+ { BOTTLE, 0.15, 0.300, 0.93 },
+ { BASE, 0.00, 0.230, 0.00 },
+ { BASE, -0.18, 0.140, 0.20 },
+ { BASE, -0.80, 0.280, 1.00 },
+ { 0, 0, 0, 0 },
+};
+
+static const lamp_geometry cone_lamp[] = {
+ { CAP, 1.35, 0.001, 0.00 },
+ { CAP, 1.35, 0.020, 0.00 },
+ { CAP, 1.30, 0.055, 0.05 },
+ { BOTTLE, 0.97, 0.120, 0.40 },
+ { BOTTLE, 0.13, 0.300, 0.87 },
+ { BASE, 0.00, 0.300, 0.00 },
+ { BASE, -0.04, 0.320, 0.04 },
+ { BASE, -0.60, 0.420, 0.50 },
+ { 0, 0, 0, 0 },
+};
+
+static const lamp_geometry rocket_lamp[] = {
+ { CAP, 1.35, 0.001, 0.00 },
+ { CAP, 1.34, 0.020, 0.00 },
+ { CAP, 1.30, 0.055, 0.05 },
+ { BOTTLE, 0.97, 0.120, 0.40 },
+ { BOTTLE, 0.13, 0.300, 0.87 },
+ { BOTTLE, 0.07, 0.300, 0.93 },
+ { BASE, 0.00, 0.280, 0.00 },
+ { BASE, -0.50, 0.180, 0.50 },
+ { BASE, -0.75, 0.080, 0.75 },
+ { BASE, -0.80, 0.035, 0.80 },
+ { BASE, -0.90, 0.035, 1.00 },
+ { 0, 0, 0, 0 },
+};
+
+
+
+typedef struct {
+ GLXContext *glx_context;
+ lamp_style style;
+ const lamp_geometry *model;
+ rotator *rot;
+ rotator *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat max_bottle_radius; /* radius of widest part of the bottle */
+
+ GLfloat launch_chance; /* how often to percolate */
+ int blobs_per_group; /* how many metaballs we launch at once */
+ Bool just_started_p; /* so we launch some goo right away */
+
+ int grid_size; /* resolution for marching-cubes */
+ int nballs;
+ metaball *balls;
+
+ GLuint bottle_list;
+ GLuint ball_list;
+
+ int bottle_poly_count; /* polygons in the bottle only */
+
+} lavalite_configuration;
+
+static lavalite_configuration *bps = NULL;
+
+static char *do_spin;
+static char *do_style;
+static GLfloat speed;
+static Bool do_wander;
+static int resolution;
+static Bool do_smooth;
+static Bool do_impatient;
+
+static char *lava_color_str, *fluid_color_str, *base_color_str,
+ *table_color_str;
+static char *fluid_tex, *base_tex, *table_tex;
+
+static GLfloat lava_color[4], fluid_color[4], base_color[4], table_color[4];
+
+static const GLfloat lava_spec[4] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat lava_shininess = 128.0;
+static const GLfloat foot_color[4] = {0.2, 0.2, 0.2, 1.0};
+
+static const GLfloat light0_pos[4] = {-0.6, 0.0, 1.0, 0.0};
+static const GLfloat light1_pos[4] = { 1.0, 0.0, 0.2, 0.0};
+static const GLfloat light2_pos[4] = { 0.6, 0.0, 1.0, 0.0};
+
+
+
+static XrmOptionDescRec opts[] = {
+ { "-style", ".style", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-resolution", ".resolution", XrmoptionSepArg, 0 },
+ { "-smooth", ".smooth", XrmoptionNoArg, "True" },
+ { "+smooth", ".smooth", XrmoptionNoArg, "False" },
+ { "-impatient", ".impatient", XrmoptionNoArg, "True" },
+ { "+impatient", ".impatient", XrmoptionNoArg, "False" },
+
+ { "-lava-color", ".lavaColor", XrmoptionSepArg, 0 },
+ { "-fluid-color", ".fluidColor", XrmoptionSepArg, 0 },
+ { "-base-color", ".baseColor", XrmoptionSepArg, 0 },
+ { "-table-color", ".tableColor", XrmoptionSepArg, 0 },
+
+ { "-fluid-texture",".fluidTexture", XrmoptionSepArg, 0 },
+ { "-base-texture", ".baseTexture", XrmoptionSepArg, 0 },
+ { "-table-texture",".tableTexture", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_style, "style", "Style", DEF_STYLE, t_String},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+ {&do_smooth, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+ {&do_impatient, "impatient", "Impatient", DEF_IMPATIENT, t_Bool},
+
+ {&lava_color_str, "lavaColor", "LavaColor", DEF_LCOLOR, t_String},
+ {&fluid_color_str, "fluidColor", "FluidColor", DEF_FCOLOR, t_String},
+ {&base_color_str, "baseColor", "BaseColor", DEF_BCOLOR, t_String},
+ {&table_color_str, "tableColor", "TableColor", DEF_TCOLOR, t_String},
+
+ {&fluid_tex, "fluidTexture", "FluidTexture", DEF_FTEX, t_String},
+ {&base_tex, "baseTexture", "BaseTexture", DEF_BTEX, t_String},
+ {&table_tex, "tableTexture", "BaseTexture", DEF_TTEX, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt lavalite_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_lavalite (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 3;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+/* Textures
+ */
+
+static Bool
+load_texture (ModeInfo *mi, const char *filename)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+ XImage *image;
+
+ if (!filename ||
+ !*filename ||
+ !strcasecmp (filename, "(none)"))
+ {
+ glDisable (GL_TEXTURE_2D);
+ return False;
+ }
+
+ image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei (GL_UNPACK_ROW_LENGTH, image->width);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glEnable (GL_TEXTURE_2D);
+ return True;
+}
+
+
+
+/* Generating the lamp's bottle, caps, and base.
+ */
+
+static int
+draw_disc (GLfloat r, GLfloat z, int faces, Bool up_p, Bool wire)
+{
+ int j;
+ GLfloat th;
+ GLfloat step = M_PI * 2 / faces;
+ int polys = 0;
+ GLfloat x, y;
+
+ glFrontFace (up_p ? GL_CW : GL_CCW);
+ glNormal3f (0, (up_p ? 1 : -1), 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+
+ x = r;
+ y = 0;
+
+ for (j = 0, th = 0; j <= faces; j++)
+ {
+ glTexCoord2f (-j / (GLfloat) faces, 1);
+ glVertex3f (0, z, 0);
+
+ glTexCoord2f (-j / (GLfloat) faces, 0);
+ glVertex3f (x, z, y);
+
+ th += step;
+ x = r * cos (th);
+ y = r * sin (th);
+
+ glTexCoord2f (-j / (GLfloat) faces, 0);
+ glVertex3f (x, z, y);
+
+ polys++;
+ }
+ glEnd();
+
+ return polys;
+}
+
+
+static int
+draw_tube (GLfloat r0, GLfloat r1,
+ GLfloat z0, GLfloat z1,
+ GLfloat t0, GLfloat t1,
+ int faces, Bool inside_out_p, Bool smooth_p, Bool wire)
+{
+ int polys = 0;
+ GLfloat th;
+ GLfloat x, y, x0=0, y0=0;
+ GLfloat step = M_PI * 2 / faces;
+ GLfloat s2 = step/2;
+ int i;
+
+ glFrontFace (inside_out_p ? GL_CW : GL_CCW);
+ glBegin (wire ? GL_LINES : (smooth_p ? GL_QUAD_STRIP : GL_QUADS));
+
+ th = 0;
+ x = 1;
+ y = 0;
+
+ if (!smooth_p)
+ {
+ x0 = cos (s2);
+ y0 = sin (s2);
+ }
+
+ if (smooth_p) faces++;
+
+ for (i = 0; i < faces; i++)
+ {
+ int nsign = (inside_out_p ? -1 : 1);
+
+ if (smooth_p)
+ glNormal3f (x * nsign, z1, y * nsign);
+ else
+ glNormal3f (x0 * nsign, z1, y0 * nsign);
+
+ glTexCoord2f (nsign * -i / (GLfloat) faces, 1-t1);
+ glVertex3f (x * r1, z1, y * r1);
+
+ glTexCoord2f (nsign * -i / (GLfloat) faces, 1-t0);
+ glVertex3f (x * r0, z0, y * r0);
+
+ th += step;
+ x = cos (th);
+ y = sin (th);
+
+ if (!smooth_p)
+ {
+ x0 = cos (th + s2);
+ y0 = sin (th + s2);
+
+ glTexCoord2f (nsign * -(i+1) / (double) faces, 1-t0);
+ glVertex3f (x * r0, z0, y * r0);
+
+ glTexCoord2f (nsign * -(i+1) / (double) faces, 1-t1);
+ glVertex3f (x * r1, z1, y * r1);
+ }
+
+ polys++;
+ }
+ glEnd();
+
+ return polys;
+}
+
+
+static int
+draw_table (GLfloat z, Bool wire)
+{
+ GLfloat faces = 6;
+ GLfloat step = M_PI * 2 / faces;
+ GLfloat s = 8;
+ GLfloat th;
+ int j;
+ int polys = 0;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_color);
+
+ glFrontFace(GL_CW);
+ glNormal3f(0, 1, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+
+ if (! wire)
+ {
+ glTexCoord2f (-0.5, 0.5);
+ glVertex3f(0, z, 0);
+ }
+
+ for (j = 0, th = 0; j <= faces; j++)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ glTexCoord2f (-(x+1)/2.0, (y+1)/2.0);
+ glVertex3f(x*s, z, y*s);
+ th += step;
+ polys++;
+ }
+ glEnd();
+ return polys;
+}
+
+
+static int
+draw_wing (GLfloat w, GLfloat h, GLfloat d, Bool wire)
+{
+ static const int coords[2][8][2] = {
+ { { 0, 0 },
+ { 10, 10 },
+ { 20, 23 },
+ { 30, 41 },
+ { 40, 64 },
+ { 45, 81 },
+ { 50, 103 },
+ { 53, 134 } },
+ { { 0, 54 },
+ { 10, 57 },
+ { 20, 64 },
+ { 30, 75 },
+ { 40, 92 },
+ { 45, 104 },
+ { 50, 127 },
+ { 51, 134 }
+ }
+ };
+
+ int polys = 0;
+ int maxx = coords[0][countof(coords[0])-1][0];
+ int maxy = coords[0][countof(coords[0])-1][1];
+ unsigned int x;
+
+ for (x = 1; x < countof(coords[0]); x++)
+ {
+ GLfloat px0 = (GLfloat) coords[0][x-1][0] / maxx * w;
+ GLfloat py0 = (GLfloat) coords[0][x-1][1] / maxy * h;
+ GLfloat px1 = (GLfloat) coords[1][x-1][0] / maxx * w;
+ GLfloat py1 = (GLfloat) coords[1][x-1][1] / maxy * h;
+ GLfloat px2 = (GLfloat) coords[0][x ][0] / maxx * w;
+ GLfloat py2 = (GLfloat) coords[0][x ][1] / maxy * h;
+ GLfloat px3 = (GLfloat) coords[1][x ][0] / maxx * w;
+ GLfloat py3 = (GLfloat) coords[1][x ][1] / maxy * h;
+ GLfloat zz = d/2;
+
+ /* Left side
+ */
+ glFrontFace (GL_CW);
+ glNormal3f (0, 0, -1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ glTexCoord2f (px0, py0); glVertex3f (px0, -py0, -zz);
+ glTexCoord2f (px1, py1); glVertex3f (px1, -py1, -zz);
+ glTexCoord2f (px3, py3); glVertex3f (px3, -py3, -zz);
+ glTexCoord2f (px2, py2); glVertex3f (px2, -py2, -zz);
+ polys++;
+ glEnd();
+
+ /* Right side
+ */
+ glFrontFace (GL_CCW);
+ glNormal3f (0, 0, -1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(px0, py0); glVertex3f (px0, -py0, zz);
+ glTexCoord2f(px1, py1); glVertex3f (px1, -py1, zz);
+ glTexCoord2f(px3, py3); glVertex3f (px3, -py3, zz);
+ glTexCoord2f(px2, py2); glVertex3f (px2, -py2, zz);
+ polys++;
+ glEnd();
+
+ /* Top edge
+ */
+ glFrontFace (GL_CCW);
+ glNormal3f (1, -1, 0); /* #### wrong */
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(px0, py0); glVertex3f (px0, -py0, -zz);
+ glTexCoord2f(px0, py0); glVertex3f (px0, -py0, zz);
+ glTexCoord2f(px2, py2); glVertex3f (px2, -py2, zz);
+ glTexCoord2f(px2, py2); glVertex3f (px2, -py2, -zz);
+ polys++;
+ glEnd();
+
+ /* Bottom edge
+ */
+ glFrontFace (GL_CW);
+ glNormal3f (-1, 1, 0); /* #### wrong */
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(px1, py1); glVertex3f (px1, -py1, -zz);
+ glTexCoord2f(px1, py1); glVertex3f (px1, -py1, zz);
+ glTexCoord2f(px3, py3); glVertex3f (px3, -py3, zz);
+ glTexCoord2f(px3, py3); glVertex3f (px3, -py3, -zz);
+ polys++;
+ glEnd();
+
+
+ }
+
+ return polys;
+
+}
+
+
+static void
+generate_bottle (ModeInfo *mi)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int faces = resolution * 1.5;
+ Bool smooth = do_smooth;
+
+ const lamp_geometry *top_slice = bp->model;
+ const char *current_texture = 0;
+ lamp_part last_part = 0;
+
+ if (faces < 3) faces = 3;
+ else if (wire && faces > 20) faces = 20;
+ else if (faces > 60) faces = 60;
+
+ bp->bottle_poly_count = 0;
+
+ glNewList (bp->bottle_list, GL_COMPILE);
+ glPushMatrix();
+
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0, -0.5, 0);
+
+ /* All parts of the lamp use the same specularity and shininess. */
+ glMaterialfv (GL_FRONT, GL_SPECULAR, lava_spec);
+ glMateriali (GL_FRONT, GL_SHININESS, lava_shininess);
+
+ while (1)
+ {
+ const lamp_geometry *bot_slice = top_slice + 1;
+
+ const char *texture = 0;
+ GLfloat *color = 0;
+ GLfloat t0, t1;
+
+ glDisable (GL_LIGHT2);
+
+ switch (top_slice->part)
+ {
+ case CAP:
+ case BASE:
+ texture = base_tex;
+ color = base_color;
+ break;
+ case BOTTLE:
+ texture = fluid_tex;
+ color = fluid_color;
+ if (!wire) glEnable (GL_LIGHT2); /* light2 affects only fluid */
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ if (!wire && texture && texture != current_texture)
+ {
+ current_texture = texture;
+ load_texture (mi, current_texture);
+ }
+
+ /* Color the discs darker than the tube walls. */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, foot_color);
+
+ /* Do a top disc if this is the first slice of the CAP or BASE.
+ */
+ if ((top_slice->part == CAP && last_part == 0) ||
+ (top_slice->part == BASE && last_part == BOTTLE))
+ bp->bottle_poly_count +=
+ draw_disc (top_slice->radius, top_slice->elevation, faces,
+ True, wire);
+
+ /* Do a bottom disc if this is the last slice of the CAP or BASE.
+ */
+ if ((top_slice->part == CAP && bot_slice->part == BOTTLE) ||
+ (top_slice->part == BASE && bot_slice->part == 0))
+ {
+ const lamp_geometry *sl = (bot_slice->part == 0
+ ? top_slice : bot_slice);
+ bp->bottle_poly_count +=
+ draw_disc (sl->radius, sl->elevation, faces, False, wire);
+ }
+
+ if (bot_slice->part == 0) /* done! */
+ break;
+
+ /* Do a tube or cone
+ */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ t0 = top_slice->texture_elevation;
+ t1 = bot_slice->texture_elevation;
+
+ /* Restart the texture coordinates for the glass.
+ */
+ if (top_slice->part == BOTTLE)
+ {
+ Bool first_p = (top_slice[-1].part != BOTTLE);
+ Bool last_p = (bot_slice->part != BOTTLE);
+ if (first_p) t0 = 0;
+ if (last_p) t1 = 1;
+ }
+
+ bp->bottle_poly_count +=
+ draw_tube (top_slice->radius, bot_slice->radius,
+ top_slice->elevation, bot_slice->elevation,
+ t0, t1,
+ faces,
+ (top_slice->part == BOTTLE),
+ smooth, wire);
+
+ last_part = top_slice->part;
+ top_slice++;
+ }
+
+ if (bp->style == ROCKET)
+ {
+ int i;
+ for (i = 0; i < 3; i++)
+ {
+ glPushMatrix();
+ glRotatef (120 * i, 0, 1, 0);
+ glTranslatef (0.14, -0.05, 0);
+ bp->bottle_poly_count += draw_wing (0.4, 0.95, 0.02, wire);
+ glPopMatrix();
+ }
+ glTranslatef (0, -0.1, 0); /* move floor down a little */
+ }
+
+
+ if (!wire) load_texture (mi, table_tex);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_color);
+ bp->bottle_poly_count += draw_table (top_slice->elevation, wire);
+
+
+ glPopMatrix ();
+ glDisable (GL_TEXTURE_2D); /* done with textured objects */
+ glEndList ();
+}
+
+
+
+
+/* Generating blobbies
+ */
+
+static double
+bellrand (double extent) /* like frand(), but a bell curve. */
+{
+ return (((frand(extent) + frand(extent) + frand(extent)) / 3)
+ - (extent/2));
+}
+
+
+static void move_ball (ModeInfo *mi, metaball *b);
+
+/* Bring a ball into play, and re-randomize its values.
+ */
+static void
+reset_ball (ModeInfo *mi, metaball *b)
+{
+/* lavalite_configuration *bp = &bps[MI_SCREEN(mi)]; */
+
+ b->r = 0.00001;
+ b->R = 0.12 + bellrand(0.10);
+
+ b->pos_r = bellrand (0.9);
+ b->pos_th = frand(M_PI*2);
+ b->z = 0;
+
+ b->dr = bellrand(TILT);
+ b->dz = CONVECTION;
+
+ b->leader = 0;
+
+ if (!b->alive_p)
+ b->alive_p = True;
+
+ move_ball (mi, b);
+}
+
+
+/* returns the first metaball that is not in use, or 0.
+ */
+static metaball *
+get_ball (ModeInfo *mi)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < bp->nballs; i++)
+ {
+ metaball *b = &bp->balls[i];
+ if (!b->alive_p)
+ return b;
+ }
+ return 0;
+}
+
+
+/* Generate the blobs that don't move: the ones at teh top and bottom
+ that are part of the scenery.
+ */
+static void
+generate_static_blobs (ModeInfo *mi)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ metaball *b0, *b1;
+ int i;
+
+ b0 = get_ball (mi);
+ if (!b0) abort();
+ b0->static_p = True;
+ b0->alive_p = True;
+ b0->R = 0.6;
+ b0->r = 0.3;
+
+ /* the giant blob at the bottom of the bottle.
+ */
+ b0->pos_r = 0;
+ b0->pos_th = 0;
+ b0->dr = 0;
+ b0->dz = 0;
+ b0->x = 0;
+ b0->y = 0;
+ b0->z = -0.43;
+
+ /* the small blob at the top of the bottle.
+ */
+ b1 = get_ball (mi);
+ if (!b1) abort();
+
+ *b1 = *b0;
+ b1->R = 0.16;
+ b1->r = 0.135;
+ b1->z = 1.078;
+
+ /* Some extra blobs at the bottom of the bottle, to jumble the surface.
+ */
+ for (i = 0; i < bp->blobs_per_group; i++)
+ {
+ b1 = get_ball (mi);
+ if (!b1) abort();
+ reset_ball (mi, b1);
+ b1->static_p = True;
+ b1->z = frand(0.04);
+ b1->dr = 0;
+ b1->dz = 0;
+ }
+}
+
+
+static GLfloat
+max_bottle_radius (lavalite_configuration *bp)
+{
+ GLfloat r = 0;
+ const lamp_geometry *slice;
+ for (slice = bp->model; slice->part != 0; slice++)
+ {
+ if (slice->part == BOTTLE && slice->radius > r)
+ r = slice->radius; /* top */
+ if (slice[1].radius > r)
+ r = slice[1].radius; /* bottom */
+ }
+ return r;
+}
+
+
+static GLfloat
+bottle_radius_at (lavalite_configuration *bp, GLfloat z)
+{
+ GLfloat topz = -999, botz = -999, topr = 0, botr = 0;
+ const lamp_geometry *slice;
+ GLfloat ratio;
+
+ for (slice = bp->model; slice->part != 0; slice++)
+ if (z > slice->elevation)
+ {
+ slice--;
+ topz = slice->elevation;
+ topr = slice->radius;
+ break;
+ }
+ if (topz == -999) return 0;
+
+ for (; slice->part != 0; slice++)
+ if (z > slice->elevation)
+ {
+ botz = slice->elevation;
+ botr = slice->radius;
+ break;
+ }
+ if (botz == -999) return 0;
+
+ ratio = (z - botz) / (topz - botz);
+
+ return (botr + ((topr - botr) * ratio));
+}
+
+
+static void
+move_ball (ModeInfo *mi, metaball *b)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ double gravity = GRAVITY;
+ double real_r;
+
+ if (b->static_p) return;
+
+ b->pos_r += b->dr;
+ b->z += b->dz;
+
+ b->dz -= gravity;
+
+ if (b->pos_r > 0.9)
+ {
+ b->pos_r = 0.9;
+ b->dr = -b->dr;
+ }
+ else if (b->pos_r < 0)
+ {
+ b->pos_r = -b->pos_r;
+ b->dr = -b->dr;
+ }
+
+ real_r = b->pos_r * bottle_radius_at (bp, b->z);
+
+ b->x = cos (b->pos_th) * real_r;
+ b->y = sin (b->pos_th) * real_r;
+
+ if (b->z < -b->R) /* dropped below bottom of glass - turn it off */
+ b->alive_p = False;
+}
+
+
+/* This function makes sure that balls that are part of a group always stay
+ relatively close to each other.
+ */
+static void
+clamp_balls (ModeInfo *mi)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < bp->nballs; i++)
+ {
+ metaball *b = &bp->balls[i];
+ if (b->alive_p && b->leader)
+ {
+ double zslack = 0.1;
+ double minz = b->leader->z - zslack;
+ double maxz = b->leader->z + zslack;
+
+ /* Try to keep the Z values near those of the leader.
+ Don't let it go out of range (above or below) and clamp it
+ if it does. If we've clamped it, make sure dz will be
+ moving it in the right direction (back toward the leader.)
+
+ We aren't currently clamping r, only z -- doesn't seem to
+ be needed.
+
+ This is kind of flaky, I think. Sometimes you can see
+ the blobbies "twitch". That's no good.
+ */
+
+ if (b->z < minz)
+ {
+ if (b->dz < 0) b->dz = -b->dz;
+ b->z = minz - b->dz;
+ }
+
+ if (b->z > maxz)
+ {
+ if (b->dz > 0) b->dz = -b->dz;
+ b->z = maxz + b->dz;
+ }
+ }
+ }
+}
+
+
+static void
+move_balls (ModeInfo *mi) /* for great justice */
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < bp->nballs; i++)
+ {
+ metaball *b = &bp->balls[i];
+ if (b->alive_p)
+ move_ball (mi, b);
+ }
+
+ clamp_balls (mi);
+}
+
+
+
+/* Rendering blobbies using marching cubes.
+ */
+
+static double
+compute_metaball_influence (lavalite_configuration *bp,
+ double x, double y, double z,
+ int nballs, metaball *balls)
+{
+ double vv = 0;
+ int i;
+
+ for (i = 0; i < nballs; i++)
+ {
+ metaball *b = &balls[i];
+ double dx, dy, dz;
+ double d2, r, R, r2, R2;
+
+ if (!b->alive_p) continue;
+
+ dx = x - b->x;
+ dy = y - b->y;
+ dz = z - b->z;
+ R = b->R;
+
+ if (dx > R || dx < -R || /* quick check before multiplying */
+ dy > R || dy < -R ||
+ dz > R || dz < -R)
+ continue;
+
+ d2 = (dx*dx + dy*dy + dz*dz);
+ r = b->r;
+
+ r2 = r*r;
+ R2 = R*R;
+
+ if (d2 <= r2) /* (d <= r) inside the hard radius */
+ vv += 1;
+ else if (d2 > R2) /* (d > R) outside the radius of influence */
+ ;
+ else /* somewhere in between: linear drop-off from r=1 to R=0 */
+ {
+ /* was: vv += 1 - ((d-r) / (R-r)); */
+ vv += 1 - ((d2-r2) / (R2-r2));
+ }
+ }
+
+ return vv;
+}
+
+
+/* callback for marching_cubes() */
+static void *
+obj_init (double grid_size, void *closure)
+{
+ lavalite_configuration *bp = (lavalite_configuration *) closure;
+ bp->grid_size = grid_size;
+
+ return closure;
+}
+
+
+/* Returns True if the given point is outside of the glass tube.
+ */
+static double
+clipped_by_glass_p (double x, double y, double z,
+ lavalite_configuration *bp)
+{
+ double d2, or, or2, ir2;
+
+ or = bp->max_bottle_radius;
+
+ if (x > or || x < -or || /* quick check before multiplying */
+ y > or || y < -or)
+ return 0;
+
+ d2 = (x*x + y*y);
+ or = bottle_radius_at (bp, z);
+
+ or2 = or*or;
+
+ if (d2 > or2) /* (sqrt(d) > or) */
+ return 0;
+
+ ir2 = or2 * 0.7;
+
+ if (d2 > ir2) /* (sqrt(d) > ir) */
+ {
+ double dr1 = or2;
+ double dr2 = ir2;
+ /* was: (1 - (d-ratio2) / (ratio1-ratio2)) */
+ return (1 - (d2-dr2) / (dr1-dr2));
+ }
+
+ return 1;
+}
+
+
+
+/* callback for marching_cubes() */
+static double
+obj_compute (double x, double y, double z, void *closure)
+{
+ lavalite_configuration *bp = (lavalite_configuration *) closure;
+ double clip;
+
+ x /= bp->grid_size; /* convert from 0-N to 0-1. */
+ y /= bp->grid_size;
+ z /= bp->grid_size;
+
+ x -= 0.5; /* X and Y range from -.5 to +.5; z ranges from 0-1. */
+ y -= 0.5;
+
+ clip = clipped_by_glass_p (x, y, z, bp);
+ if (clip == 0) return 0;
+
+ return (clip *
+ compute_metaball_influence (bp, x, y, z, bp->nballs, bp->balls));
+}
+
+
+/* callback for marching_cubes() */
+static void
+obj_free (void *closure)
+{
+}
+
+
+/* Send a new blob travelling upward.
+ This blob will actually be composed of N metaballs that are near
+ each other.
+ */
+static void
+launch_balls (ModeInfo *mi)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ metaball *b0 = get_ball (mi);
+ int i;
+
+ if (!b0) return;
+ reset_ball (mi, b0);
+
+ for (i = 0; i < bp->blobs_per_group; i++)
+ {
+ metaball *b1 = get_ball (mi);
+ if (!b1) break;
+ *b1 = *b0;
+
+ reset_ball (mi, b1);
+ b1->leader = b0;
+
+# define FROB(FIELD,AMT) \
+ b1->FIELD += (bellrand(AMT) * b0->FIELD)
+
+ /* FROB (pos_r, 0.7); */
+ /* FROB (pos_th, 0.7); */
+ FROB (dr, 0.8);
+ FROB (dz, 0.6);
+# undef FROB
+ }
+
+}
+
+
+static void
+animate_lava (ModeInfo *mi)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ Bool just_started_p = bp->just_started_p;
+
+ double isolevel = 0.3;
+
+ /* Maybe bubble a new blobby to the surface.
+ */
+ if (just_started_p ||
+ frand(1.0) < bp->launch_chance)
+ {
+ bp->just_started_p = False;
+ launch_balls (mi);
+
+ if (do_impatient && just_started_p)
+ while (1)
+ {
+ int i;
+ move_balls (mi);
+ for (i = 0; i < bp->nballs; i++)
+ {
+ metaball *b = &bp->balls[i];
+ if (b->alive_p && !b->static_p && !b->leader &&
+ b->z > 0.5)
+ goto DONE;
+ }
+ }
+ DONE: ;
+ }
+
+ move_balls (mi);
+
+ glNewList (bp->ball_list, GL_COMPILE);
+ glPushMatrix();
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, lava_spec);
+ glMateriali (GL_FRONT, GL_SHININESS, lava_shininess);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lava_color);
+
+ /* For the blobbies, the origin is on the axis at the bottom of the
+ glass bottle; and the top of the bottle is +1 on Z.
+ */
+ glTranslatef (0, 0, -0.5);
+
+ mi->polygon_count = 0;
+ {
+ double s;
+ if (bp->grid_size == 0) bp->grid_size = 1; /* first time through */
+ s = 1.0/bp->grid_size;
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, 0);
+ glScalef (s, s, s);
+ marching_cubes (resolution, isolevel, wire, do_smooth,
+ obj_init, obj_compute, obj_free, bp,
+ &mi->polygon_count);
+ glPopMatrix();
+ }
+
+ mi->polygon_count += bp->bottle_poly_count;
+
+ glPopMatrix();
+ glEndList ();
+}
+
+
+
+/* Startup initialization
+ */
+
+ENTRYPOINT Bool
+lavalite_handle_event (ModeInfo *mi, XEvent *event)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+ a[3] = 1.0; /* alpha */
+
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+}
+
+
+ENTRYPOINT void
+init_lavalite (ModeInfo *mi)
+{
+ lavalite_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_lavalite (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ {
+ char *s = do_style;
+ if (!s || !*s || !strcasecmp (s, "classic")) bp->style = CLASSIC;
+ else if (!strcasecmp (s, "giant")) bp->style = GIANT;
+ else if (!strcasecmp (s, "cone")) bp->style = CONE;
+ else if (!strcasecmp (s, "rocket")) bp->style = ROCKET;
+ else if (!strcasecmp (s, "random"))
+ {
+ if (random() & 1) bp->style = CLASSIC; /* half the time */
+ else bp->style = (random() % ((int) ROCKET+1));
+ }
+ else
+ {
+ fprintf (stderr,
+ "%s: style must be Classic, Giant, Cone, or Rocket (not \"%s\")\n",
+ progname, s);
+ exit (1);
+ }
+ }
+
+ parse_color (mi, "lava", lava_color_str, lava_color);
+ parse_color (mi, "fluid", fluid_color_str, fluid_color);
+ parse_color (mi, "base", base_color_str, base_color);
+ parse_color (mi, "table", table_color_str, table_color);
+
+ if (!wire)
+ {
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc0[4] = {0.0, 1.0, 1.0, 1.0};
+ GLfloat spc1[4] = {1.0, 0.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+ glShadeModel(GL_SMOOTH);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc0);
+
+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spc1);
+
+ glLightfv(GL_LIGHT2, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT2, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT2, GL_SPECULAR, spc0);
+ }
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 0.4;
+ double wander_speed = 0.03;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->rot2 = make_rotator (spin_speed, 0, 0,
+ 1, 0.1,
+ False);
+ bp->trackball = gltrackball_init (False);
+
+ /* Tilt the scene a bit: lean the normal lamps toward the viewer,
+ and the huge lamps away. */
+ gltrackball_reset (bp->trackball,
+ -0.3 + frand(0.6),
+ (bp->style == ROCKET || bp->style == GIANT
+ ? frand (0.2)
+ : -frand (0.6)));
+ }
+
+ switch (bp->style)
+ {
+ case CLASSIC: bp->model = classic_lamp; break;
+ case GIANT: bp->model = giant_lamp; break;
+ case CONE: bp->model = cone_lamp; break;
+ case ROCKET: bp->model = rocket_lamp; break;
+ default: abort(); break;
+ }
+
+ bp->max_bottle_radius = max_bottle_radius (bp);
+
+ bp->launch_chance = speed;
+ bp->blobs_per_group = BLOBS_PER_GROUP;
+ bp->just_started_p = True;
+
+ bp->nballs = (((MI_COUNT (mi) + 1) * bp->blobs_per_group)
+ + 2);
+ bp->balls = (metaball *) calloc (sizeof(*bp->balls), bp->nballs+1);
+
+ bp->bottle_list = glGenLists (1);
+ bp->ball_list = glGenLists (1);
+
+ generate_bottle (mi);
+ generate_static_blobs (mi);
+}
+
+
+/* Render one frame
+ */
+
+ENTRYPOINT void
+draw_lavalite (ModeInfo *mi)
+{
+ lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+
+ {
+ double cx, cy, cz; /* camera position, 0-1. */
+ double px, py, pz; /* object position, 0-1. */
+ double rx, ry, rz; /* object rotation, 0-1. */
+
+ get_position (bp->rot2, 0, &cy, &cz, !bp->button_down_p);
+ get_rotation (bp->rot2, &cx, 0, 0, !bp->button_down_p);
+
+ get_position (bp->rot, &px, &py, &pz, !bp->button_down_p);
+ get_rotation (bp->rot, &rx, &ry, &rz, !bp->button_down_p);
+
+#if 1
+ cx = 0.5;
+ cy = 0.5;
+ cz = 1.0;
+
+#else /* #### this crud doesn't really work yet */
+
+
+ /* We have c[xyz] parameters describing a camera position, but we don't
+ want to just map those to points in space: the lamp doesn't look very
+ good from the inside, or from underneath...
+
+ Good observation points form a ring around the lamp: basically, a
+ torus ringing the lamp, parallel to the lamp's floor.
+
+ We interpret cz as distance from the origin.
+ cy as elevation.
+ cx is then used as position in the torus (theta).
+ */
+
+ {
+ double cx2, cy2, cz2;
+ double d;
+
+ cx2 = 0.5;
+ cy2 = 0.5;
+ cz2 = 1.0;
+
+ cy2 = (cy * 0.4); /* cam elevation: 0.0 (table) - 0.4 up. */
+ d = 0.9 + cz; /* cam distance: 0.9 - 1.9. */
+
+ cz2 = 0.5 + (d * cos (cx * M_PI * 2));
+ cx2 = 0.5 + (d * sin (cx * M_PI * 2));
+
+
+ cx = cx2;
+ cy = cy2;
+ cz = cz2;
+ }
+#endif /* 0 */
+
+ glLoadIdentity();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ gluLookAt ((cx - 0.5) * 8, /* Position the camera */
+ (cy - 0.5) * 8,
+ (cz - 0.5) * 8,
+ 0, 0, 0,
+ 0, 1, 0);
+
+ gltrackball_rotate (bp->trackball); /* Apply mouse-based camera position */
+
+ glRotatef (-90, 1, 0, 0); /* Right side up */
+
+
+ /* Place the lights relative to the object, before the object has
+ been rotated or wandered within the scene. */
+ glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
+ glLightfv(GL_LIGHT1, GL_POSITION, light1_pos);
+ glLightfv(GL_LIGHT2, GL_POSITION, light2_pos);
+
+
+ /* Position the lamp in the scene according to the "wander" settings */
+ glTranslatef ((px - 0.5), (py - 0.5), (pz - 0.5));
+
+ /* Rotate the object according to the "spin" settings */
+ glRotatef (rx * 360, 1.0, 0.0, 0.0);
+ glRotatef (ry * 360, 0.0, 1.0, 0.0);
+ glRotatef (rz * 360, 0.0, 0.0, 1.0);
+
+ /* Move the lamp up slightly: make 0,0 be at its vertical center. */
+ switch (bp->style)
+ {
+ case CLASSIC: glTranslatef (0, 0, 0.33); break;
+ case GIANT: glTranslatef (0, 0, 0.33); break;
+ case CONE: glTranslatef (0, 0, 0.16); break;
+ case ROCKET: glTranslatef (0, 0, 0.30);
+ glScalef (0.85,0.85,0.85); break;
+ default: abort(); break;
+ }
+ }
+
+ animate_lava (mi);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glCallList (bp->bottle_list);
+ glCallList (bp->ball_list);
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Lavalite", lavalite)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/lavalite.man b/hacks/glx/lavalite.man
new file mode 100644
index 0000000..3d7aad5
--- /dev/null
+++ b/hacks/glx/lavalite.man
@@ -0,0 +1,160 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "18-May-2002" "X Version 11"
+.SH NAME
+lavalite - 3D OpenGL simulation of a Lavalite.
+.SH SYNOPSIS
+.B lavalite
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+[\-style \fIstyle\fP ]
+[\-spin \fIxyz\fP ] [\-no-spin ]
+[\-speed \fIfloat\fP ]
+[\-resolution \fIinteger\fP ]
+[\-count \fIinteger\fP ]
+[\-no-smooth ]
+[\-wireframe ]
+[\-impatient ]
+[\-lava-color \fIcolor\fP ]
+[\-fluid-color \fIcolor\fP ]
+[\-base-color \fIcolor\fP ]
+[\-table-color \fIcolor\fP ]
+[\-fluid-texture \fIfilename\fP ]
+[\-base-texture \fIfilename\fP ]
+[\-table-texture \fIfilename\fP ]
+.SH DESCRIPTION
+The \fIlavalite\fP program displays a 3D simulation of the famous lamp
+of the same name. It requires a fast computer with fast OpenGL support.
+.SH OPTIONS
+.I lavalite
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-style \fIstyle\fP\fP
+Specify which model of lamp to draw. Available models
+are: \fBClassic\fP, \fBGiant\fP, \fBCone\fP, and \fBRocket\fP.
+Default: random.
+.TP 8
+.B \-spin \fIxyz\fP
+Around which axes the model should auto-spin. Defaults to "Z", meaning
+it rotates horizontally, but otherwise pitch or roll.
+.TP 8
+.B \-no-spin
+Same as \fB\-spin ''\fP.
+.TP 8
+.B \-speed \fIfloat\fP
+A number controlling the frequency at which new blobs launch: you can
+think of this as being related to the the heat of the lightbulb in
+the base. Default: 0.003.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation; default is 30000 (0.03 second.)
+.TP 8
+.B \-resolution \fIinteger\fP
+The size of the grid from which the mesh is created that is used
+to polygonize the blobs. higher values will give very smooth looking
+blobs, at the expense of speed. Default: 40.
+
+The options "-resolution 10 -no-smooth" look kind of interesting.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-count \fIinteger\fP
+The maximum number of blobs that can be in motion at once.
+Default: 3.
+.TP 8
+.B \-no-smooth
+Turn off smoothing: the objects in the scene will be facetted.
+.TP 8
+.B \-wireframe
+Render all objects in wireframe instead of as solids.
+.TP 8
+.B \-impatient
+Provide this option if you are. This will pre-warm the lamp, so when it
+starts up, the first frame will show a blob already halfway up the lamp.
+.TP 8
+.B \-lava-color \fIcolor\fP
+Specifies the color of the blobbies. Default: red.
+.TP 8
+.B \-fluid-color \fIcolor\fP
+Specifies the color of the fluid that the blobbies float in.
+Default: light blue.
+.TP 8
+.B \-base-color \fIcolor\fP
+Specifies the color of the lamp base, and the cap on top of the bottle.
+Default: very dark gray.
+.TP 8
+.B \-table-color \fIcolor\fP
+Specifies the color of the table that the lamp is sitting on.
+Default: black (meaning it is invisible.)
+.TP 8
+.B \-fluid-texture \fIfilename\fP
+An image file to wrap around the glass.
+
+Note that on most systems, GL textures must have dimensions that are a
+power of two.
+
+Note also that colors and textures are both applied: so, if you apply a
+texture and it isn't showing up, try specifying the corresponding color
+as "white". Otherwise, the combination of the two might be too dark to
+see.
+.TP 8
+.B \-base-texture \fIfilename\fP
+An image file to wrap around the base of the lamp, and the cap on top
+of the bottle.
+.TP 8
+.B \-table-texture \fItexture\fP
+An image file to spread across the table that the lamp is sitting on.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+ http://www.lavaworld.com/
+ http://www.lavarnd.org/
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+
+LAVA LITE\(rg and the configuration of the LAVA\(rg brand motion lamp
+are registered trademarks of Haggerty Enterprises, Inc. The
+configuration of the globe and base of the motion lamp are registered
+trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in other
+countries around the world.
+
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/lockward.c b/hacks/glx/lockward.c
new file mode 100644
index 0000000..f15374b
--- /dev/null
+++ b/hacks/glx/lockward.c
@@ -0,0 +1,970 @@
+/*
+ * lockward.c: First attempt at an Xscreensaver.
+ *
+ * Leo L. Schwab 2007.08.17
+ ****
+ * Copyright (c) 2007 Leo L. Schwab
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to permit
+ * persons to whom the Software is furnished to do so, subject to the
+ * following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <ctype.h>
+#include <strings.h>
+
+#include "xlockmore.h"
+#include "colors.h"
+
+
+/***************************************************************************
+ * #defines
+ */
+#ifdef USE_GL /* whole file */
+
+#define DEFAULTS "*delay: 20000 \n"\
+ "*showFPS: False \n"
+
+#define release_lockward 0
+
+
+#define NUMOF(x) (sizeof ((x)) / sizeof ((*x)))
+
+#define NBLADES 12
+#define NSPINNERS 4
+#define NRADII 8
+#define COLORIDX_SHF 4
+#define SUBDIV 6
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+/***************************************************************************
+ * Structure definitions.
+ */
+struct lockward_context; /* Forward declaration. */
+
+#define int8_t char
+#define int16_t short
+#define int32_t int
+#define uint8_t unsigned char
+#define uint16_t unsigned short
+#define uint32_t unsigned int
+
+typedef struct bladestate {
+ uint8_t outer, inner; /* Radii */
+} bladestate;
+
+typedef struct spinnerstate {
+ GLfloat rot; /* Terminal rotation after count expires */
+ GLfloat rotinc; /* Per-frame increment to rot. */
+ XColor *colors;
+ bladestate *bladeidx;
+ int ncolors; /* n.4 fixed-point */
+ int ccolor; /* n.4 fixed-point */
+ int colorinc; /* n.4 fixed-point */
+ int rotcount;
+ uint8_t nblades;
+} spinnerstate;
+
+typedef struct blinkstate {
+ int (*drawfunc) (struct lockward_context *ctx,
+ struct blinkstate *bs);
+ uint32_t *noise; /* For draw_blink_segment_scatter() */
+ GLfloat color[4];
+ uint32_t val;
+ int16_t dwell; /* <0: sharp >0: decay */
+ int16_t dwellcnt;
+ uint8_t type;
+ int8_t counter;
+ int8_t direction;
+ int8_t radius;
+} blinkstate;
+
+enum blinktype {
+ BTYPE_RADIAL_SINGLE = 0,
+ BTYPE_RADIAL_RANDOM,
+ BTYPE_RADIAL_SEQ,
+ BTYPE_RADIAL_DOUBLESEQ,
+ BTYPE_SEGMENT_SINGLE,
+ BTYPE_SEGMENT_RANDOM,
+ BTYPE_CONCENTRIC_SINGLE,
+ BTYPE_CONCENTRIC_RANDOM,
+ BTYPE_CONCENTRIC_SEQ,
+ BTYPE_SEGMENT_SCATTER,
+ MAX_BTYPE
+};
+
+typedef struct { GLfloat x,y,z; } XYZ;
+
+typedef struct lockward_context {
+ GLXContext *glx_context;
+
+ spinnerstate spinners[NSPINNERS];
+ blinkstate blink;
+
+ /* This used to put vertexes into lists without putting begin/end
+ into the same list! I didn't even know that worked. Well, it
+ doesn't work with jwzgles, so I changed it to not do that. */
+ /* GLuint blades_outer, blades_inner; */
+ XYZ points_outer[NRADII][SUBDIV+1];
+ XYZ points_inner[NRADII][SUBDIV+1];
+
+ GLuint rings;
+ Bool blendmode;
+ int nextblink;
+ int fps;
+
+} lockward_context;
+
+
+/***************************************************************************
+ * Prototypes.
+ */
+ENTRYPOINT void free_lockward (ModeInfo *mi);
+
+
+/***************************************************************************
+ * Global variables.
+ */
+static lockward_context *g_ctx = NULL;
+static Bool g_blink_p = True;
+static int g_blades = NBLADES;
+static int g_rotateidle_min,
+ g_rotateidle_max;
+static int g_blinkidle_min,
+ g_blinkidle_max;
+static int g_blinkdwell_min,
+ g_blinkdwell_max;
+
+#define DEF_BLINK "True"
+#define DEF_ROTATEIDLEMIN "1000"
+#define DEF_ROTATEIDLEMAX "6000"
+#define DEF_BLINKIDLEMIN "1000"
+#define DEF_BLINKIDLEMAX "9000"
+#define DEF_BLINKDWELLMIN "100"
+#define DEF_BLINKDWELLMAX "600"
+
+
+static XrmOptionDescRec opts[] = {
+ { "-blink", ".blink", XrmoptionNoArg, "on" },
+ { "+blink", ".blink", XrmoptionNoArg, "off" },
+ { "-rotateidle-min", ".rotateidlemin", XrmoptionSepArg, 0 },
+ { "-rotateidle-max", ".rotateidlemax", XrmoptionSepArg, 0 },
+ { "-blinkidle-min", ".blinkidlemin", XrmoptionSepArg, 0 },
+ { "-blinkidle-max", ".blinkidlemax", XrmoptionSepArg, 0 },
+ { "-blinkdwell-min", ".blinkdwellmin", XrmoptionSepArg, 0 },
+ { "-blinkdwell-max", ".blinkdwellmax", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ { &g_blink_p, "blink", "Blink", DEF_BLINK, t_Bool },
+ { &g_rotateidle_min, "rotateidlemin", "Rotateidlemin", DEF_ROTATEIDLEMIN, t_Int },
+ { &g_rotateidle_max, "rotateidlemax", "Rotateidlemax", DEF_ROTATEIDLEMAX, t_Int },
+ { &g_blinkidle_min, "blinkidlemin", "Blinkidlemin", DEF_BLINKIDLEMIN, t_Int },
+ { &g_blinkidle_max, "blinkidlemax", "Blinkidlemax", DEF_BLINKIDLEMAX, t_Int },
+ { &g_blinkdwell_min, "blinkdwellmin", "Blinkdwellmin", DEF_BLINKDWELLMIN, t_Int },
+ { &g_blinkdwell_max, "blinkdwellmax", "Blinkdwellmax", DEF_BLINKDWELLMAX, t_Int },
+};
+
+static OptionStruct desc[] = {
+ { "-/+blink", "Turn on/off blinking effects." },
+ { "-rotateidle-min", "Minimum idle time for rotators, in milliseconds." },
+ { "-rotateidle-max", "Maximum idle time for rotators, in milliseconds." },
+ { "-blinkidle-min", "Minimum idle time between blink effects, in milliseconds." },
+ { "-blinkidle-max", "Maximum idle time between blink effects, in milliseconds." },
+ { "-blinkdwell-min", "Minimum dwell time for blink effects, in milliseconds." },
+ { "-blinkdwell-max", "Maximum dwell time for blink effects, in milliseconds." },
+};
+
+ENTRYPOINT ModeSpecOpt lockward_opts = {
+ NUMOF(opts), opts, NUMOF(vars), vars, desc
+};
+
+
+/***************************************************************************
+ * Window management.
+ */
+ENTRYPOINT void
+reshape_lockward (ModeInfo *mi, int width, int height)
+{
+ lockward_context *ctx = &g_ctx[MI_SCREEN (mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent (MI_DISPLAY (mi), MI_WINDOW (mi),
+ *(ctx->glx_context));
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ if (height > width)
+ glOrtho (-8.0, 8.0, -8.0 * h, 8.0 * h, -1, 1);
+ else
+ glOrtho (-8.0 / h, 8.0 / h, -8.0, 8.0, -1, 1);
+
+ glMatrixMode (GL_MODELVIEW);
+}
+
+ENTRYPOINT Bool
+lockward_handle_event (ModeInfo *mi, XEvent *event)
+{
+ lockward_context *ctx = &g_ctx[MI_SCREEN (mi)];
+
+ if (event->xany.type == KeyPress) {
+ KeySym keysym;
+ char c = 0;
+
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t') {
+ ctx->blendmode ^= 1;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+/***************************************************************************
+ * "Blade" routines.
+ */
+static void
+random_blade_rot (lockward_context *ctx, struct spinnerstate *ss)
+{
+ /*
+ * The circle is divided up in to g_blades divisions. The idea here
+ * is to rotate to an exact division point.
+ *
+ * The target rotation is computed via random numbers.
+ *
+ * The time it takes to get there is a maximum of six seconds per
+ * division, and a minimum of one second (no matter how far away it
+ * is), and is selected by random numbers.
+ *
+ * The time value is converted into frames, and a per-frame rotation
+ * is computed.
+ *
+ * During rendering, we approach the target rotation by subtracting
+ * from it the per-frame rotation times the number of outstanding
+ * ticks. Doing it this way means we'll hit the target rotation
+ * exactly, without low-order errors creeping in to the values (at
+ * least not nearly as quickly).
+ */
+ GLfloat d;
+ int dist;
+
+ dist = random() % g_blades + 1;
+
+ ss->rotcount = random() % (6 * dist * ctx->fps - ctx->fps)
+ + ctx->fps;
+
+ if (random() & 4)
+ dist = -dist;
+ d = dist * 360.0 / (GLfloat) g_blades;
+ ss->rot += d;
+ ss->rotinc = d / (GLfloat) ss->rotcount;
+}
+
+
+/*
+ * A "blade" is pie-wedge shaped flat thing that is rotated around where the
+ * apex is/would be. Initially envisioned as 1/12th of a circle, but that
+ * could be configurable. The inner and outer edges are rounded off using
+ * six subdivisions so that, when multiple blades are assembled, it looks
+ * more like a circle and less like a polygon.
+ *
+ * The blade is assembled as a tri-fan. It is oriented centered at 3
+ * o'clock. The blade is composed of two display lists -- arcs, essentially
+ * -- the outer and the inner one. The outer one *must* be called before
+ * the inner one, or the blade clockwise-ness will be wrong, and become
+ * invisible. Arcs of various radii are compiled.
+ */
+
+static void
+gen_blade_arcs (lockward_context *ctx)
+{
+ GLfloat here, there, step;
+ int i, n;
+
+ here = 0;
+ there = M_PI * 2.0 / g_blades;
+ step = there / SUBDIV;
+ here -= SUBDIV * step / 2.0;
+
+ /*
+ * Build outer blade arcs.
+ * Start at left side of outer radius. Strike all its vertices.
+ */
+ for (n = 0; n < NRADII; ++n) {
+ /* glNewList (ctx->blades_outer + n, GL_COMPILE); */
+ XYZ *a = ctx->points_outer[n];
+ int j = 0;
+ for (i = SUBDIV; i >= 0; --i) {
+ /* glVertex3f (cos (here + step * i) * (n + 1.0),
+ sin (here + step * i) * (n + 1.0), 0); */
+ a[j].x = cos (here + step * i) * (n + 1.0);
+ a[j].y = sin (here + step * i) * (n + 1.0);
+ a[j].z = 0;
+ j++;
+ }
+ if (j != SUBDIV+1) abort();
+ /* glEndList (); */
+ }
+
+ /*
+ * Build inner blade arcs.
+ * Move to inner radius, strike all vertices in opposite order.
+ */
+ for (n = 0; n < NRADII; ++n) {
+ /* glNewList (ctx->blades_inner + n, GL_COMPILE); */
+ XYZ *a = ctx->points_inner[n];
+ int j = 0;
+ for (i = 0; i <= SUBDIV; ++i) {
+ /* glVertex3f (cos (here + step * i) * (n + 1.0),
+ sin (here + step * i) * (n + 1.0), 0); */
+ a[j].x = cos (here + step * i) * (n + 1.0);
+ a[j].y = sin (here + step * i) * (n + 1.0);
+ a[j].z = 0;
+ j++;
+ }
+ if (j != SUBDIV+1) abort();
+ /* glEndList (); */
+ }
+}
+
+static void
+gen_rings (lockward_context *ctx)
+{
+ GLfloat step;
+ int i, n;
+
+ step = M_PI * 2.0 / (g_blades * SUBDIV);
+
+ for (n = 0; n < NRADII - 1; ++n) {
+ glNewList (ctx->rings + n, GL_COMPILE);
+ glBegin (GL_TRIANGLE_STRIP);
+ for (i = g_blades * SUBDIV; i >= 0; --i) {
+ glVertex3f (cos (step * i) * (n + 1.0),
+ sin (step * i) * (n + 1.0), 0);
+ glVertex3f (cos (step * i) * (n + 2.0),
+ sin (step * i) * (n + 2.0), 0);
+ }
+ glEnd();
+ glEndList ();
+ }
+}
+
+
+/***************************************************************************
+ * "Blink" routines.
+ */
+static int
+calc_interval_frames (lockward_context *ctx, int min, int max)
+{
+ /*
+ * Compute random interval between min and max milliseconds.
+ * Returned value is in frames.
+ */
+ register int i;
+
+ i = min;
+ if (max > min)
+ i += random() % (max - min);
+
+ return i * ctx->fps / 1000;
+}
+
+static void
+set_alpha_by_dwell (struct blinkstate *bs)
+{
+ if (bs->dwell > 0)
+ bs->color[3] = (GLfloat) bs->dwellcnt / (GLfloat) bs->dwell;
+ else
+ bs->color[3] = bs->dwellcnt > (-bs->dwell >> 2) ? 1.0 : 0.0;
+}
+
+
+static void
+draw_blink_blade (lockward_context *ctx, int inner, int outer,
+ Bool begin_p)
+{
+ int i;
+ if (begin_p) glBegin (GL_TRIANGLE_FAN);
+ /* glCallList (ctx->blades_outer + outer); */
+ for (i = 0; i < countof(*ctx->points_outer); i++)
+ glVertex3f(ctx->points_outer[outer][i].x,
+ ctx->points_outer[outer][i].y,
+ ctx->points_outer[outer][i].z);
+
+ /* glCallList (ctx->blades_inner + inner); */
+ for (i = 0; i < countof(*ctx->points_inner); i++)
+ glVertex3f(ctx->points_inner[inner][i].x,
+ ctx->points_inner[inner][i].y,
+ ctx->points_inner[inner][i].z);
+ if (begin_p) glEnd();
+}
+
+static int
+draw_blink_radial_random (lockward_context *ctx, struct blinkstate *bs)
+{
+ int i;
+
+ /*
+ * There is no sense of direction in a random sweep, so re-use the
+ * 'direction' field to hold the current blade we're messing with.
+ */
+ if (bs->dwellcnt < 0) {
+ if (bs->counter <= 0) {
+ bs->drawfunc = NULL;
+ return 0;
+ }
+
+ /*
+ * Find available blade. Potentially very slow, depending on
+ * how unlucky we are.
+ */
+ do {
+ i = random() % g_blades;
+ } while (bs->val & (1 << i));
+ bs->val |= (1 << i); /* Mark as used. */
+ bs->direction = i;
+ if ((bs->dwellcnt = bs->dwell) < 0)
+ bs->dwellcnt = -bs->dwellcnt;
+
+ if ( bs->type == BTYPE_SEGMENT_SINGLE
+ || bs->type == BTYPE_SEGMENT_RANDOM)
+ bs->radius = random() % (NRADII - 1);
+
+ --bs->counter;
+ }
+
+ set_alpha_by_dwell (bs);
+ glBlendFunc (GL_DST_COLOR, GL_SRC_ALPHA);
+ glColor4fv (bs->color);
+ glRotatef (bs->direction * 360.0 / (GLfloat) g_blades, 0, 0, 1);
+ if (bs->radius >= 0)
+ draw_blink_blade (ctx, bs->radius, bs->radius + 1, True);
+ else
+ draw_blink_blade (ctx, 0, NRADII - 1, True);
+
+ --bs->dwellcnt;
+
+ return SUBDIV + SUBDIV;
+}
+
+static int
+draw_blink_radial_sequential (lockward_context *ctx, struct blinkstate *bs)
+{
+ if (bs->dwellcnt < 0) {
+ if (bs->counter <= 0) {
+ bs->drawfunc = NULL;
+ return 0;
+ }
+ if ((bs->dwellcnt = bs->dwell) < 0)
+ bs->dwellcnt = -bs->dwellcnt;
+ --bs->counter;
+ }
+
+ set_alpha_by_dwell (bs);
+ glBlendFunc (GL_DST_COLOR, GL_SRC_ALPHA);
+ glColor4fv (bs->color);
+ glRotatef ((bs->counter * bs->direction + (int) bs->val)
+ * 360.0 / (GLfloat) g_blades,
+ 0, 0, 1);
+ draw_blink_blade (ctx, 0, NRADII - 1, True);
+
+ --bs->dwellcnt;
+
+ return SUBDIV + SUBDIV;
+}
+
+static int
+draw_blink_radial_doubleseq (lockward_context *ctx, struct blinkstate *bs)
+{
+ int polys;
+
+ if (bs->dwellcnt < 0) {
+ if (bs->counter <= 0) {
+ bs->drawfunc = NULL;
+ return 0;
+ }
+ if ((bs->dwellcnt = bs->dwell) < 0)
+ bs->dwellcnt = -bs->dwellcnt;
+ --bs->counter;
+ }
+
+ set_alpha_by_dwell (bs);
+ glBlendFunc (GL_DST_COLOR, GL_SRC_ALPHA);
+ glColor4fv (bs->color);
+
+ glPushMatrix ();
+ glRotatef (((int) bs->val + bs->counter) * 360.0 / (GLfloat) g_blades,
+ 0, 0, 1);
+ draw_blink_blade (ctx, 0, NRADII - 1, True);
+ glPopMatrix ();
+ polys = SUBDIV + SUBDIV;
+
+ if (bs->counter && bs->counter < g_blades / 2) {
+ glRotatef (((int) bs->val - bs->counter)
+ * 360.0 / (GLfloat) g_blades,
+ 0, 0, 1);
+ draw_blink_blade (ctx, 0, NRADII - 1, True);
+ polys += SUBDIV + SUBDIV;
+ }
+
+ --bs->dwellcnt;
+
+ return polys;
+}
+
+static int
+draw_blink_concentric_random (lockward_context *ctx, struct blinkstate *bs)
+{
+ int i;
+
+ if (bs->dwellcnt < 0) {
+ if (bs->counter <= 0) {
+ bs->drawfunc = NULL;
+ return 0;
+ }
+
+ do {
+ i = random() % (NRADII - 1);
+ } while (bs->val & (1 << i));
+ bs->val |= (1 << i);
+ bs->direction = i;
+ if ((bs->dwellcnt = bs->dwell) < 0)
+ bs->dwellcnt = -bs->dwellcnt;
+
+ --bs->counter;
+ }
+
+ set_alpha_by_dwell (bs);
+ glBlendFunc (GL_DST_COLOR, GL_SRC_ALPHA);
+ glColor4fv (bs->color);
+ glCallList (ctx->rings + bs->direction);
+
+ --bs->dwellcnt;
+
+ return g_blades * SUBDIV * 2;
+}
+
+static int
+draw_blink_concentric_sequential (lockward_context *ctx, struct blinkstate *bs)
+{
+ if (bs->dwellcnt < 0) {
+ if (bs->counter <= 0) {
+ bs->drawfunc = NULL;
+ return 0;
+ }
+ if ((bs->dwellcnt = bs->dwell) < 0)
+ bs->dwellcnt = -bs->dwellcnt;
+ --bs->counter;
+ }
+
+ set_alpha_by_dwell (bs);
+ glBlendFunc (GL_DST_COLOR, GL_SRC_ALPHA);
+ glColor4fv (bs->color);
+ if (bs->direction > 0)
+ glCallList (ctx->rings + (NRADII - 2) - bs->counter);
+ else
+ glCallList (ctx->rings + bs->counter);
+
+ --bs->dwellcnt;
+
+ return g_blades * SUBDIV * 2;
+}
+
+static int
+draw_blink_segment_scatter (lockward_context *ctx, struct blinkstate *bs)
+{
+ int i, polys = 0;
+
+ if (bs->dwellcnt < 0) {
+ if (bs->counter <= 0) {
+ bs->drawfunc = NULL;
+ return 0;
+ }
+
+ /*
+ * Init random noise array. On average, 1/4 of the bits will
+ * be set, which should look nice. (1/2 looks too busy.)
+ */
+ for (i = g_blades; --i >= 0; )
+ bs->noise[i] = random() & random()
+ & ((1 << (NRADII - 1)) - 1);
+
+ if ((bs->dwellcnt = bs->dwell) < 0)
+ bs->dwellcnt = -bs->dwellcnt;
+ --bs->counter;
+ }
+
+ set_alpha_by_dwell (bs);
+ glBlendFunc (GL_DST_COLOR, GL_SRC_ALPHA);
+ glColor4fv (bs->color);
+
+ for (i = g_blades; --i >= 0; ) {
+ register uint32_t bits;
+ int inner, outer;
+
+ /*
+ * Find consecutive runs of 1 bits. Keep going until we run
+ * out of them.
+ */
+ for (bits = bs->noise[i]; bits; ) {
+ inner = ffs (bits) - 1;
+ bits = ~bits & ~((1 << inner) - 1);
+ outer = ffs (bits) - 1;
+ bits = ~bits & ~((1 << outer) - 1);
+
+ glPushMatrix ();
+ glRotatef (i * 360.0 / (GLfloat) g_blades, 0, 0, 1);
+ draw_blink_blade (ctx, inner, outer, True);
+ glPopMatrix ();
+
+ polys += SUBDIV + SUBDIV;
+ }
+ }
+
+ --bs->dwellcnt;
+
+ return polys;
+}
+
+static void
+random_blink (lockward_context *ctx, struct blinkstate *bs)
+{
+ bs->color[0] =
+ bs->color[1] =
+ bs->color[2] =
+ bs->color[3] = 1.0;
+ bs->dwellcnt = -1;
+ bs->radius = -1;
+ bs->dwell = calc_interval_frames
+ (ctx, g_blinkdwell_min, g_blinkdwell_max);
+ if (random() & 2)
+ bs->dwell = -bs->dwell;
+
+ bs->type = random() % MAX_BTYPE;
+
+ switch (bs->type) {
+ case BTYPE_RADIAL_SINGLE:
+ case BTYPE_SEGMENT_SINGLE:
+ bs->drawfunc = draw_blink_radial_random;
+ bs->val = 0;
+ bs->counter = 1;
+ break;
+ case BTYPE_RADIAL_RANDOM:
+ case BTYPE_SEGMENT_RANDOM:
+ bs->drawfunc = draw_blink_radial_random;
+ bs->val = 0;
+ bs->counter = g_blades;
+ break;
+ case BTYPE_RADIAL_SEQ:
+ bs->drawfunc = draw_blink_radial_sequential;
+ bs->val = random() % g_blades; /* Initial offset */
+ bs->direction = random() & 8 ? 1 : -1;
+ bs->counter = g_blades;
+ break;
+ case BTYPE_RADIAL_DOUBLESEQ:
+ bs->drawfunc = draw_blink_radial_doubleseq;
+ bs->val = random() % g_blades; /* Initial offset */
+ bs->counter = g_blades / 2 + 1;
+ break;
+ case BTYPE_CONCENTRIC_SINGLE:
+ bs->drawfunc = draw_blink_concentric_random;
+ bs->val = 0;
+ bs->counter = 1;
+ break;
+ case BTYPE_CONCENTRIC_RANDOM:
+ bs->drawfunc = draw_blink_concentric_random;
+ bs->val = 0;
+ bs->counter = NRADII - 1;
+ break;
+ case BTYPE_CONCENTRIC_SEQ:
+ bs->drawfunc = draw_blink_concentric_sequential;
+ bs->direction = random() & 8 ? 1 : -1;
+ bs->counter = NRADII - 1;
+ break;
+ case BTYPE_SEGMENT_SCATTER:
+ bs->drawfunc = draw_blink_segment_scatter;
+ bs->counter = random() % (g_blades / 2) + (g_blades / 2) + 1;
+ break;
+ }
+}
+
+
+/***************************************************************************
+ * Main rendering routine.
+ */
+ENTRYPOINT void
+draw_lockward (ModeInfo *mi)
+{
+ lockward_context *ctx = &g_ctx[MI_SCREEN (mi)];
+ spinnerstate *ss;
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i, n;
+
+ GLfloat scolor[4] = {0.0, 0.0, 0.0, 0.5};
+
+ if (!ctx->glx_context)
+ return;
+
+ glXMakeCurrent (MI_DISPLAY (mi), MI_WINDOW (mi), *(ctx->glx_context));
+
+
+ glClear (GL_COLOR_BUFFER_BIT);
+
+ if (ctx->blendmode)
+ glBlendFunc (GL_ONE, GL_ONE);
+ else
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glPushMatrix ();
+ glLoadIdentity ();
+
+ mi->polygon_count = 0;
+
+ for (n = NSPINNERS; --n >= 0; ) {
+ ss = &ctx->spinners[n];
+
+ /* Set color. */
+ i = ss->ccolor >> COLORIDX_SHF;
+ scolor[0] = ss->colors[i].red / 65535.0;
+ scolor[1] = ss->colors[i].green / 65535.0;
+ scolor[2] = ss->colors[i].blue / 65535.0;
+ glColor4fv (scolor);
+
+ glPushMatrix ();
+ glRotatef (ss->rot - ss->rotcount * ss->rotinc, 0, 0, 1);
+ for (i = ss->nblades; --i >= 0; ) {
+ glPushMatrix ();
+ glRotatef (360.0 * i / ss->nblades, 0, 0, 1);
+
+ glBegin (GL_TRIANGLE_FAN);
+ /* glCallList (ctx->blades_outer + ss->bladeidx[i].outer); */
+ /* glCallList (ctx->blades_inner + ss->bladeidx[i].inner); */
+ draw_blink_blade (ctx,
+ ss->bladeidx[i].inner,
+ ss->bladeidx[i].outer,
+ False);
+ glEnd ();
+
+ glPopMatrix ();
+ mi->polygon_count += SUBDIV + SUBDIV;
+ }
+ glPopMatrix ();
+
+ /* Advance rotation. */
+ if (ss->rotcount) {
+ if (ss->rotcount > 0)
+ --ss->rotcount;
+ } else {
+ if (ss->rotinc == 0.0)
+ random_blade_rot (ctx, ss);
+ else {
+ /* Compute # of ticks to sit idle. */
+ ss->rotinc = 0.0;
+ ss->rotcount =
+ calc_interval_frames (ctx,
+ g_rotateidle_min,
+ g_rotateidle_max);
+ }
+ }
+
+ /* Advance colors. */
+ if ((ss->ccolor += ss->colorinc) >= ss->ncolors)
+ ss->ccolor -= ss->ncolors;
+ else if (ss->ccolor < 0)
+ ss->ccolor += ss->ncolors;
+ }
+
+ if (g_blink_p) {
+ if (ctx->blink.drawfunc) {
+ mi->polygon_count +=
+ ctx->blink.drawfunc (ctx, &ctx->blink);
+ } else {
+ if (ctx->nextblink > 0)
+ --ctx->nextblink;
+ else {
+ /* Compute # of frames for blink idle time. */
+ ctx->nextblink =
+ calc_interval_frames (ctx,
+ g_blinkidle_min,
+ g_blinkidle_max);
+ random_blink (ctx, &ctx->blink);
+ }
+ }
+ }
+ glPopMatrix ();
+
+ if (MI_IS_FPS (mi)) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers (dpy, window);
+}
+
+
+/***************************************************************************
+ * Initialization/teardown.
+ */
+ENTRYPOINT void
+init_lockward (ModeInfo *mi)
+{
+ lockward_context *ctx;
+ int i, n;
+
+ MI_INIT (mi, g_ctx);
+ ctx = &g_ctx[MI_SCREEN (mi)];
+
+ ctx->glx_context = init_GL (mi);
+
+ reshape_lockward (mi, MI_WIDTH (mi), MI_HEIGHT (mi));
+
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+
+ glShadeModel (GL_FLAT);
+ glFrontFace (GL_CW);
+
+ /* ctx->blades_outer = glGenLists (NRADII); */
+ /* ctx->blades_inner = glGenLists (NRADII); */
+ ctx->rings = glGenLists (NRADII - 1);
+ ctx->blendmode = 0;
+/* WTF? ctx->fps = 1000000 / MI_DELAY (mi); */
+ ctx->fps = 60;
+ ctx->nextblink = calc_interval_frames
+ (ctx, g_blinkidle_min, g_blinkidle_max);
+ ctx->blink.drawfunc = NULL;
+ ctx->blink.noise = malloc (sizeof (uint32_t) * g_blades);
+ if (!ctx->blink.noise) {
+ fprintf (stderr, "Can't allocate noise array.\n");
+ exit (1);
+ }
+
+ gen_blade_arcs (ctx);
+ gen_rings (ctx);
+
+ for (i = NSPINNERS; --i >= 0; ) {
+ spinnerstate *ss = &ctx->spinners[i];
+
+ ss->rot = 0.0;
+ ss->rotcount = -1;
+
+ /* Establish rotation */
+ random_blade_rot (ctx, ss);
+
+ /*
+ * Establish color cycling path and rate. Rate avoids zero.
+ */
+ ss->ncolors = 128;
+ ss->colorinc = (random() & ((2 << COLORIDX_SHF) - 1))
+ - (1 << COLORIDX_SHF);
+ if (ss->colorinc >= 0)
+ ++ss->colorinc;
+
+ ss->colors = (XColor *) calloc (ss->ncolors, sizeof (XColor));
+ if (!ss->colors) {
+ fprintf (stderr,
+ "Can't allocate XColors for spinner %d.\n",
+ i);
+ exit (1);
+ }
+ make_smooth_colormap (0, 0, 0,
+ ss->colors, &ss->ncolors,
+ False, 0, False);
+ ss->ncolors <<= COLORIDX_SHF;
+
+ /*
+ * Create blades.
+ */
+ ss->nblades = g_blades;
+ ss->bladeidx = malloc (sizeof (bladestate) * g_blades);
+ if (!ss->bladeidx) {
+ fprintf (stderr, "Can't allocate blades.\n");
+ exit (1);
+ }
+ for (n = g_blades; --n >= 0; ) {
+ /*
+ * Establish blade radii. Can't be equal. Ensure
+ * outer > inner.
+ */
+ do {
+ ss->bladeidx[n].outer = random() & 7;
+ ss->bladeidx[n].inner = random() & 7;
+ } while (ss->bladeidx[n].outer ==
+ ss->bladeidx[n].inner);
+
+ if (ss->bladeidx[n].outer < ss->bladeidx[n].inner) {
+ uint8_t tmp;
+
+ tmp = ss->bladeidx[n].outer;
+ ss->bladeidx[n].outer = ss->bladeidx[n].inner;
+ ss->bladeidx[n].inner = tmp;
+ }
+ }
+ }
+}
+
+ENTRYPOINT void
+free_lockward (ModeInfo *mi)
+{
+ lockward_context *ctx = &g_ctx[MI_SCREEN (mi)];
+ int i;
+
+ if (!ctx->glx_context)
+ return;
+
+ glXMakeCurrent (MI_DISPLAY (mi), MI_WINDOW (mi),
+ *(ctx->glx_context));
+
+ if (ctx->blink.noise)
+ free (ctx->blink.noise);
+ if (glIsList (ctx->rings))
+ glDeleteLists (ctx->rings, NRADII - 1);
+ /* if (glIsList (ctx->blades_outer))
+ glDeleteLists (ctx->blades_outer, NRADII);
+ if (glIsList (ctx->blades_inner))
+ glDeleteLists (ctx->blades_inner, NRADII); */
+
+ for (i = NSPINNERS; --i >= 0; ) {
+ spinnerstate *ss = &ctx->spinners[i];
+
+ if (ss->colors)
+ free (ss->colors);
+ if (ss->bladeidx)
+ free (ss->bladeidx);
+ }
+}
+
+
+XSCREENSAVER_MODULE ("Lockward", lockward)
+
+#endif /* USE_GL */
+
+/* vim:se ts=8 sts=8 sw=8: */
diff --git a/hacks/glx/lockward.man b/hacks/glx/lockward.man
new file mode 100644
index 0000000..f55e5be
--- /dev/null
+++ b/hacks/glx/lockward.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+lockward - Rotating spinning color-cycling things
+.SH SYNOPSIS
+.B lockward
+[\-display \fIdisplayspec\fP]
+[\-root]
+[\-window]
+[\-visual \fIarg\fP]
+[\-window-id \fIarg\fP]
+[\-delay \fIusec\fP]
+[\-pair]
+[\-fps]
+[\-blink | \-no-blink]
+[\-rotateidle-min \fImsec\fP]
+[\-rotateidle-max \fImsec\fP]
+[\-blinkidle-min \fImsec\fP]
+[\-blinkidle-max \fImsec\fP]
+[\-blinkdwell-min \fImsec\fP]
+[\-blinkdwell-max \fImsec\fP]
+.SH DESCRIPTION
+.B lockward
+draws a spinning, rotating set of notched wheels overlaid with some flashing
+effects, using OpenGL. It's a sort of cross between the wards in a
+combination lock and those old information displays that animated via
+polarized light.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the ID number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window (default).
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Per-frame delay, in microseconds. Default: 20000 (50 frames/sec).
+.TP 8
+.B \-blink | \-no-blink
+Enables/disables the blinking effects. Default: Enabled.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-rotateidle-min \fImilliseconds
+.TP 8
+.B \-rotateidle-max \fImilliseconds
+The minimum and maximum time each spinner will sit idle, in milliseconds.
+Defaults: Min 1000, max 6000.
+.TP 8
+.B \-blinkidle-min \fImilliseconds
+.TP 8
+.B \-blinkidle-max \fImilliseconds
+The minimum and maximum time between blinking effects, in milliseconds.
+Defaults: Min 1000, max 9000.
+.TP 8
+.B \-blinkdwell-min \fImilliseconds
+.TP 8
+.B \-blinkdwell-max \fImilliseconds
+The minimum and maximum dwell time for the blinking effects, in
+milliseconds. This affects how quickly the blinks actually happen.
+Defaults: Min 100, max 600.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+Default host and display number.
+.TP 8
+.B XENVIRONMENT
+Name of a resource file that overrides the global resources stored in the
+RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH AUTHORS
+Leo L. Schwab <ewhac@best.com>
diff --git a/hacks/glx/marching.c b/hacks/glx/marching.c
new file mode 100644
index 0000000..b3357dd
--- /dev/null
+++ b/hacks/glx/marching.c
@@ -0,0 +1,645 @@
+/* xscreensaver, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * Utility functions to create "marching cubes" meshes from 3d fields.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Marching cubes implementation by Paul Bourke <pbourke@swin.edu.au>
+ * http://astronomy.swin.edu.au/~pbourke/modelling/polygonise/
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "marching.h"
+#include "normals.h"
+
+extern char *progname;
+
+#undef ABS
+#define ABS(x) ((x)<0?(-(x)):(x))
+
+typedef struct {
+ XYZ p[3];
+} TRIANGLE;
+
+typedef struct {
+ XYZ p[8];
+ double val[8];
+} GRIDCELL;
+
+
+/* Indexing convention:
+
+ Vertices: Edges:
+
+ 4 ______________ 5 ______________
+ /| /| /| 4 /|
+ / | 6 / | 7 / |8 5 / |
+ 7 /_____________/ | /______________/ | 9
+ | | | | | | 6 | |
+ | 0 |_________|___| 1 | |_________|10_|
+ | / | / 11 | 3/ 0 | /
+ | / | / | / | / 1
+ 3 |/____________|/ 2 |/____________|/
+ 2
+ */
+
+static const int edgeTable[256] = {
+ 0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
+ 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
+ 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
+ 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
+ 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,
+ 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
+ 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,
+ 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
+ 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,
+ 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
+ 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,
+ 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
+ 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,
+ 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
+ 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,
+ 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
+ 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
+ 0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
+ 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
+ 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
+ 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
+ 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
+ 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
+ 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,
+ 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
+ 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,
+ 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
+ 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,
+ 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
+ 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,
+ 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
+ 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0
+};
+
+static const int triTable[256][16] = {
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1},
+ { 8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1},
+ { 3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1},
+ { 4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1},
+ { 4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1},
+ { 9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1},
+ {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1},
+ { 5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1},
+ { 5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1},
+ {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1},
+ { 8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1},
+ { 2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1},
+ { 7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1},
+ { 2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1},
+ {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1},
+ { 5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1},
+ {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1},
+ {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1},
+ { 2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1},
+ { 6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1},
+ { 3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1},
+ { 6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
+ {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1},
+ { 6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1},
+ { 8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1},
+ { 7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1},
+ { 3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1},
+ { 0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1},
+ { 9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1},
+ { 8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1},
+ { 5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1},
+ { 0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1},
+ { 6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1},
+ {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1},
+ {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1},
+ { 1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1},
+ { 0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1},
+ {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1},
+ { 3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1},
+ { 6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1},
+ { 9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1},
+ { 8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1},
+ { 3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1},
+ { 6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1},
+ {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1},
+ {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1},
+ { 2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1},
+ { 7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1},
+ { 7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1},
+ { 2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1},
+ { 1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1},
+ {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1},
+ { 8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1},
+ { 0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1},
+ { 7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
+ {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
+ { 6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1},
+ { 7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1},
+ {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1},
+ {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1},
+ { 0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1},
+ { 7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1},
+ { 6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1},
+ { 6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1},
+ { 4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1},
+ {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1},
+ { 8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1},
+ { 1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1},
+ {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1},
+ {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
+ {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1},
+ { 9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
+ { 6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1},
+ { 7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1},
+ { 3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1},
+ { 7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1},
+ { 3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1},
+ { 6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1},
+ { 9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1},
+ { 1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1},
+ { 4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1},
+ { 7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1},
+ { 6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1},
+ { 0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1},
+ { 6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1},
+ { 0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1},
+ {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1},
+ { 6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1},
+ { 5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1},
+ { 9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1},
+ { 1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1},
+ {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1},
+ { 0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1},
+ {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1},
+ {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1},
+ { 9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1},
+ { 7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1},
+ { 2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1},
+ { 9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1},
+ { 9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1},
+ { 1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1},
+ { 5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1},
+ { 0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1},
+ {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1},
+ { 2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1},
+ { 0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1},
+ { 0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1},
+ { 9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1},
+ { 5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1},
+ { 5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1},
+ { 8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1},
+ { 9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1},
+ { 1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1},
+ { 3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1},
+ { 4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1},
+ { 9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1},
+ {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1},
+ {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1},
+ { 2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1},
+ { 9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1},
+ { 3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1},
+ { 1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1},
+ { 4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1},
+ { 0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1},
+ { 9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1},
+ { 1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ { 0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
+};
+
+
+
+/* Linearly interpolate the position where an isosurface cuts
+ an edge between two vertices, each with their own scalar value
+*/
+static XYZ
+interp_vertex (double isolevel, XYZ p1, XYZ p2, double valp1, double valp2)
+{
+ double mu;
+ XYZ p;
+
+ if (ABS(isolevel-valp1) < 0.00001)
+ return(p1);
+ if (ABS(isolevel-valp2) < 0.00001)
+ return(p2);
+ if (ABS(valp1-valp2) < 0.00001)
+ return(p1);
+ mu = (isolevel - valp1) / (valp2 - valp1);
+ p.x = p1.x + mu * (p2.x - p1.x);
+ p.y = p1.y + mu * (p2.y - p1.y);
+ p.z = p1.z + mu * (p2.z - p1.z);
+
+ return(p);
+}
+
+
+/* Given a grid cell and an isolevel, calculate the triangular
+ facets required to represent the isosurface through the cell.
+ Return the number of triangular facets.
+ `triangles' will be loaded up with the vertices at most 5 triangular facets.
+ 0 will be returned if the grid cell is either totally above
+ of totally below the isolevel.
+
+ By Paul Bourke <pbourke@swin.edu.au>
+*/
+static int
+march_one_cube (GRIDCELL grid, double isolevel, TRIANGLE *triangles)
+{
+ int i, ntriang;
+ int cubeindex;
+ XYZ vertlist[12];
+
+ /*
+ Determine the index into the edge table which
+ tells us which vertices are inside of the surface
+ */
+ cubeindex = 0;
+ if (grid.val[0] < isolevel) cubeindex |= 1;
+ if (grid.val[1] < isolevel) cubeindex |= 2;
+ if (grid.val[2] < isolevel) cubeindex |= 4;
+ if (grid.val[3] < isolevel) cubeindex |= 8;
+ if (grid.val[4] < isolevel) cubeindex |= 16;
+ if (grid.val[5] < isolevel) cubeindex |= 32;
+ if (grid.val[6] < isolevel) cubeindex |= 64;
+ if (grid.val[7] < isolevel) cubeindex |= 128;
+
+ /* Cube is entirely in/out of the surface */
+ if (edgeTable[cubeindex] == 0)
+ return(0);
+
+ /* Find the vertices where the surface intersects the cube */
+ if (edgeTable[cubeindex] & 1)
+ vertlist[0] =
+ interp_vertex (isolevel,grid.p[0],grid.p[1],grid.val[0],grid.val[1]);
+ if (edgeTable[cubeindex] & 2)
+ vertlist[1] =
+ interp_vertex (isolevel,grid.p[1],grid.p[2],grid.val[1],grid.val[2]);
+ if (edgeTable[cubeindex] & 4)
+ vertlist[2] =
+ interp_vertex (isolevel,grid.p[2],grid.p[3],grid.val[2],grid.val[3]);
+ if (edgeTable[cubeindex] & 8)
+ vertlist[3] =
+ interp_vertex (isolevel,grid.p[3],grid.p[0],grid.val[3],grid.val[0]);
+ if (edgeTable[cubeindex] & 16)
+ vertlist[4] =
+ interp_vertex (isolevel,grid.p[4],grid.p[5],grid.val[4],grid.val[5]);
+ if (edgeTable[cubeindex] & 32)
+ vertlist[5] =
+ interp_vertex (isolevel,grid.p[5],grid.p[6],grid.val[5],grid.val[6]);
+ if (edgeTable[cubeindex] & 64)
+ vertlist[6] =
+ interp_vertex (isolevel,grid.p[6],grid.p[7],grid.val[6],grid.val[7]);
+ if (edgeTable[cubeindex] & 128)
+ vertlist[7] =
+ interp_vertex (isolevel,grid.p[7],grid.p[4],grid.val[7],grid.val[4]);
+ if (edgeTable[cubeindex] & 256)
+ vertlist[8] =
+ interp_vertex (isolevel,grid.p[0],grid.p[4],grid.val[0],grid.val[4]);
+ if (edgeTable[cubeindex] & 512)
+ vertlist[9] =
+ interp_vertex (isolevel,grid.p[1],grid.p[5],grid.val[1],grid.val[5]);
+ if (edgeTable[cubeindex] & 1024)
+ vertlist[10] =
+ interp_vertex (isolevel,grid.p[2],grid.p[6],grid.val[2],grid.val[6]);
+ if (edgeTable[cubeindex] & 2048)
+ vertlist[11] =
+ interp_vertex (isolevel,grid.p[3],grid.p[7],grid.val[3],grid.val[7]);
+
+ /* Create the triangle */
+ ntriang = 0;
+ for (i=0; triTable[cubeindex][i] != -1; i+=3)
+ {
+ triangles[ntriang].p[0] = vertlist[triTable[cubeindex][i ]];
+ triangles[ntriang].p[1] = vertlist[triTable[cubeindex][i+1]];
+ triangles[ntriang].p[2] = vertlist[triTable[cubeindex][i+2]];
+ ntriang++;
+ }
+
+ return(ntriang);
+}
+
+
+/* Walking the grid. By jwz.
+ */
+
+
+/* Computes the normal of the scalar field at the given point,
+ for vertex normals (as opposed to face normals.)
+ */
+static void
+do_function_normal (double x, double y, double z,
+ double (*compute_fn) (double x, double y, double z,
+ void *closure),
+ void *c)
+{
+ XYZ n;
+ double off = 0.5;
+ n.x = compute_fn (x-off, y, z, c) - compute_fn (x+off, y, z, c);
+ n.y = compute_fn (x, y-off, z, c) - compute_fn (x, y+off, z, c);
+ n.z = compute_fn (x, y, z-off, c) - compute_fn (x, y, z+off, c);
+ /* normalize (&n); */
+ glNormal3f (n.x, n.y, n.z);
+}
+
+
+/* Given a function capable of generating a value at any XYZ position,
+ creates OpenGL faces for the solids defined.
+
+ init_fn is called at the beginning for initial, and returns an object.
+ free_fn is called at the end.
+
+ compute_fn is called for each XYZ in the specified grid, and returns
+ the double value of that coordinate. If smoothing is on, then
+ compute_fn will also be called twice more for each emitted vertex,
+ in order to calculate vertex normals (so don't assume it will only
+ be called with values falling on the grid boundaries.)
+
+ Points are inside an object if the are less than `isolevel', and
+ outside otherwise.
+*/
+void
+marching_cubes (int grid_size, /* density of the mesh */
+ double isolevel, /* cutoff point for "in" versus "out" */
+ int wireframe_p, /* wireframe, or solid */
+ int smooth_p, /* smooth, or faceted */
+
+ void * (*init_fn) (double grid_size, void *closure1),
+ double (*compute_fn) (double x, double y, double z,
+ void *closure2),
+ void (*free_fn) (void *closure2),
+ void *closure1,
+
+ unsigned long *polygon_count)
+{
+ int planesize = grid_size * grid_size;
+ int x, y, z;
+ void *closure2 = 0;
+ unsigned long polys = 0;
+ double *layers;
+
+ layers = (double *) calloc (sizeof (*layers), planesize * 2);
+ if (!layers)
+ {
+ fprintf (stderr, "%s: out of memory for %dx%dx%d grid\n",
+ progname, grid_size, grid_size, 2);
+ exit (1);
+ }
+
+ if (init_fn)
+ closure2 = init_fn (grid_size, closure1);
+
+ glFrontFace(GL_CCW);
+ if (!wireframe_p)
+ glBegin (GL_TRIANGLES);
+
+ for (z = 0; z < grid_size; z++)
+ {
+ double *layer0 = (z & 1 ? layers+planesize : layers);
+ double *layer1 = (z & 1 ? layers : layers+planesize);
+ double *row;
+
+ /* Fill in the XY grid on the currently-bottommost layer. */
+ row = layer1;
+ for (y = 0; y < grid_size; y++, row += grid_size)
+ {
+ double *cell = row;
+ for (x = 0; x < grid_size; x++, cell++)
+ *cell = compute_fn (x, y, z, closure2);
+ }
+
+ /* Now we've completed one layer (an XY slice of Z.) Now we can
+ generate the polygons that fill the space between this layer
+ and the previous one (unless this is the first layer.)
+ */
+ if (z == 0) continue;
+
+ for (y = 1; y < grid_size; y += 1)
+ for (x = 1; x < grid_size; x += 1)
+ {
+ TRIANGLE tri[6];
+ int i, ntri;
+ GRIDCELL cell;
+
+ /* This is kinda hokey, there ought to be a more efficient
+ way to do this... */
+ cell.p[0].x = x-1; cell.p[0].y = y-1; cell.p[0].z = z-1;
+ cell.p[1].x = x ; cell.p[1].y = y-1; cell.p[1].z = z-1;
+ cell.p[2].x = x ; cell.p[2].y = y ; cell.p[2].z = z-1;
+ cell.p[3].x = x-1; cell.p[3].y = y ; cell.p[3].z = z-1;
+ cell.p[4].x = x-1; cell.p[4].y = y-1; cell.p[4].z = z ;
+ cell.p[5].x = x ; cell.p[5].y = y-1; cell.p[5].z = z ;
+ cell.p[6].x = x ; cell.p[6].y = y ; cell.p[6].z = z ;
+ cell.p[7].x = x-1; cell.p[7].y = y ; cell.p[7].z = z ;
+
+# define GRID(X,Y,WHICH) ((WHICH) \
+ ? layer1[((Y)*grid_size) + ((X))] \
+ : layer0[((Y)*grid_size) + ((X))])
+
+ cell.val[0] = GRID (x-1, y-1, 0);
+ cell.val[1] = GRID (x , y-1, 0);
+ cell.val[2] = GRID (x , y , 0);
+ cell.val[3] = GRID (x-1, y , 0);
+ cell.val[4] = GRID (x-1, y-1, 1);
+ cell.val[5] = GRID (x , y-1, 1);
+ cell.val[6] = GRID (x , y , 1);
+ cell.val[7] = GRID (x-1, y , 1);
+# undef GRID
+
+ /* Now generate the triangles for this cubic segment,
+ and emit the GL faces.
+ */
+ ntri = march_one_cube (cell, isolevel, tri);
+ polys += ntri;
+ for (i = 0; i < ntri; i++)
+ {
+ if (wireframe_p) glBegin (GL_LINE_LOOP);
+
+ /* If we're smoothing, we need to call the field function
+ again for each vertex (via function_normal().) If we're
+ not smoothing, then we can just compute the normal from
+ this triangle.
+ */
+ if (!smooth_p)
+ do_normal (tri[i].p[0].x, tri[i].p[0].y, tri[i].p[0].z,
+ tri[i].p[1].x, tri[i].p[1].y, tri[i].p[1].z,
+ tri[i].p[2].x, tri[i].p[2].y, tri[i].p[2].z);
+
+# define VERT(X,Y,Z) \
+ if (smooth_p) \
+ do_function_normal ((X), (Y), (Z), compute_fn, closure2); \
+ glVertex3f ((X), (Y), (Z))
+
+ VERT (tri[i].p[0].x, tri[i].p[0].y, tri[i].p[0].z);
+ VERT (tri[i].p[1].x, tri[i].p[1].y, tri[i].p[1].z);
+ VERT (tri[i].p[2].x, tri[i].p[2].y, tri[i].p[2].z);
+# undef VERT
+ if (wireframe_p) glEnd ();
+ }
+ }
+ }
+
+ if (!wireframe_p)
+ glEnd ();
+
+ free (layers);
+
+ if (free_fn)
+ free_fn (closure2);
+
+ if (polygon_count)
+ *polygon_count = polys;
+}
diff --git a/hacks/glx/marching.h b/hacks/glx/marching.h
new file mode 100644
index 0000000..755545d
--- /dev/null
+++ b/hacks/glx/marching.h
@@ -0,0 +1,48 @@
+/* xscreensaver, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * Utility functions to create "marching cubes" meshes from 3d fields.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __MARCHING_H__
+#define __MARCHING_H__
+
+/* Given a function capable of generating a value at any XYZ position,
+ creates OpenGL faces for the solids defined.
+
+ init_fn is called at the beginning for initial, and returns an object.
+ free_fn is called at the end.
+
+ compute_fn is called for each XYZ in the specified grid, and returns
+ the double value of that coordinate. If smoothing is on, then
+ compute_fn will also be called twice more for each emitted vertex,
+ in order to calculate vertex normals (so don't assume it will only
+ be called with values falling on the grid boundaries.)
+
+ Points are inside an object if the are less than `isolevel', and
+ outside otherwise.
+
+ If polygon_count is specified, the number of faces generated will be
+ returned there.
+*/
+extern void
+marching_cubes (int grid_size, /* density of the mesh */
+ double isolevel, /* cutoff point for "in" versus "out" */
+ int wireframe_p, /* wireframe, or solid */
+ int smooth_p, /* smooth, or faceted */
+
+ void * (*init_fn) (double grid_size, void *closure1),
+ double (*compute_fn) (double x, double y, double z,
+ void *closure2),
+ void (*free_fn) (void *closure2),
+ void *closure1,
+
+ unsigned long *polygon_count);
+
+#endif /* __MARCHING_H__ */
diff --git a/hacks/glx/maze3d.c b/hacks/glx/maze3d.c
new file mode 100755
index 0000000..255839e
--- /dev/null
+++ b/hacks/glx/maze3d.c
@@ -0,0 +1,1955 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* maze3d --- A recreation of the old 3D maze screensaver from Windows 95.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ *
+ * 03-Apr-2018: Released initial version of "3D Maze"
+ * (sudoer@riseup.net)
+ */
+
+#undef USE_FLOATING_IMAGES
+#undef USE_FRACTAL_IMAGES
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+
+#define release_maze 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+#include <math.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_ANGULAR_CONVERSION_FACTOR 90
+#define DEF_SPEED "1.0"
+#define DEF_NUM_ROWS "12"
+#define DEF_NUM_COLUMNS "12"
+#define DEF_NUM_RATS "1"
+#define DEF_NUM_INVERTERS "10"
+#define DEF_SHOW_OVERLAY "False"
+#define DEF_DROP_ACID "False"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "../images/gen/brick1_png.h"
+#include "../images/gen/brick2_png.h"
+#include "../images/gen/wood2_png.h"
+#include "../images/gen/start_png.h"
+#include "../images/gen/bob_png.h"
+#include "../images/gen/logo-32_png.h"
+
+#ifdef USE_FLOATING_IMAGES
+# include "../images/gen/opengltxt_png.h"
+# include "../images/gen/openglbook_png.h"
+#endif
+#ifdef USE_FRACTAL_IMAGES
+# include "../images/gen/fractal1_png.h"
+# include "../images/gen/fractal2_png.h"
+# include "../images/gen/fractal3_png.h"
+# include "../images/gen/fractal4_png.h"
+#endif
+
+#include "ximage-loader.h"
+
+static int dropAcid, dropAcidWalls, dropAcidCeiling, dropAcidFloor, numInverters, numRats;
+#ifdef USE_FLOATING_IMAGES
+static int numGl3dTexts, numGlRedbooks;
+#endif
+static int shouldDrawOverlay, numRows, numColumns;
+static char *wallTexture, *floorTexture, *ceilingTexture;
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+ {"-drop-acid", ".maze3d.dropAcid", XrmoptionNoArg, "true"},
+ {"-drop-acid-walls", ".maze3d.dropAcidWalls", XrmoptionNoArg, "true"},
+ {"-drop-acid-floor", ".maze3d.dropAcidFloor", XrmoptionNoArg, "true"},
+ {"-drop-acid-ceiling", ".maze3d.dropAcidCeiling", XrmoptionNoArg, "true"},
+ {"-wall-texture", ".maze3d.wallTexture", XrmoptionSepArg, 0},
+ {"-floor-texture", ".maze3d.floorTexture", XrmoptionSepArg, 0},
+ {"-ceiling-texture", ".maze3d.ceilingTexture", XrmoptionSepArg, 0},
+ {"-rows", ".maze3d.numRows", XrmoptionSepArg, 0},
+ {"-columns", ".maze3d.numColumns", XrmoptionSepArg, 0},
+ {"-inverters", ".maze3d.numInverters", XrmoptionSepArg, 0},
+ {"-rats", ".maze3d.numRats", XrmoptionSepArg, 0},
+# ifdef USE_FLOATING_IMAGES
+ {"-gl-3d-texts", ".maze3d.numGl3dTexts", XrmoptionSepArg, 0},
+ {"-gl-redbooks", ".maze3d.numGlRedbooks", XrmoptionSepArg, 0},
+# endif
+ {"-overlay", ".maze3d.showOverlay", XrmoptionNoArg, "true"},
+ {"-speed", ".maze3d.speed", XrmoptionSepArg, 0},
+};
+
+static argtype vars[] = {
+ {&dropAcid, "dropAcid", "Drop Acid", DEF_DROP_ACID, t_Bool},
+ {&dropAcidWalls, "dropAcidWalls", "Drop Acid Walls", "False", t_Bool},
+ {&dropAcidFloor, "dropAcidFloor", "Drop Acid Floor", "False", t_Bool},
+ {&dropAcidCeiling, "dropAcidCeiling", "Drop Acid Ceiling", "False", t_Bool},
+ {&wallTexture, "wallTexture", "Wall Texture", "brick-wall", t_String},
+ {&floorTexture, "floorTexture", "Floor Texture", "wood-floor", t_String},
+ {&ceilingTexture, "ceilingTexture", "Ceiling Texture", "ceiling-tiles",
+ t_String},
+ {&numRows, "numRows", "Number of Rows", DEF_NUM_ROWS, t_Int},
+ {&numColumns, "numColumns", "Number of Columns", DEF_NUM_COLUMNS, t_Int},
+ {&numInverters, "numInverters", "Number of Inverters", DEF_NUM_INVERTERS, t_Int},
+ {&numRats, "numRats", "Number of Rats", DEF_NUM_RATS, t_Int},
+# ifdef USE_FLOATING_IMAGES
+ {&numGl3dTexts, "numGl3dTexts", "Number of GL 3D Texts", "3", t_Int},
+ {&numGlRedbooks, "numGlRedbooks", "Number of GL Redbooks", "3", t_Int},
+# endif
+ {&shouldDrawOverlay, "showOverlay", "Show Overlay", DEF_SHOW_OVERLAY, t_Bool},
+ {&speed, "speed", "speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt maze_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+enum cellTypes
+{
+ WALL, CELL_UNVISITED, CELL, START, FINISH, GL_3D_TEXT, INVERTER_TETRAHEDRON,
+ INVERTER_OCTAHEDRON, INVERTER_DODECAHEDRON, INVERTER_ICOSAHEDRON,
+ WALL_GL_REDBOOK
+};
+
+enum programStates
+{
+ STARTING, WALKING, TURNING_LEFT, TURNING_RIGHT, TURNING_AROUND, INVERTING,
+ FINISHING
+};
+
+enum overlayLists
+{
+ ARROW = 15, SQUARE, STAR, TRIANGLE
+};
+
+enum directions
+{
+ NORTH = 0, EAST = 90, SOUTH = 180, WEST = 270
+};
+
+typedef struct
+{
+ unsigned row, column;
+} Tuple;
+
+typedef struct
+{
+ GLfloat x, z;
+} Tuplef;
+
+typedef struct
+{
+ GLfloat red, green, blue;
+} Color;
+
+typedef struct
+{
+ Tuplef position;
+ GLfloat rotation, desiredRotation, inversion, remainingDistanceToTravel;
+ unsigned char state, isCamera;
+} Rat;
+
+
+/* structure for holding the maze data */
+typedef struct
+{
+ GLXContext *glx_context;
+
+ unsigned char **mazeGrid;
+ Tuple *wallList;
+ unsigned wallListSize;
+ Tuple startPosition, finishPosition, *inverterPosition,
+ *gl3dTextPosition;
+ GLuint wallTexture, floorTexture, ceilingTexture, startTexture,
+ finishTexture, ratTexture;
+ Rat camera;
+ Rat *rats;
+# ifdef USE_FLOATING_IMAGES
+ GLuint gl3dTextTexture, glTextbookTexture;
+# endif
+# ifdef USE_FRACTAL_IMAGES
+ GLuint fractal1Texture, fractal2Texture, fractal3Texture, fractal4Texture;
+# endif
+ Color acidColor;
+ float acidHue;
+ GLfloat wallHeight, inverterRotation;
+ Bool button_down_p;
+ int numRows, numColumns, numGlRedbooks;
+ GLuint dlists[30]; /* ARROW etc index into this */
+
+} maze_configuration;
+
+static maze_configuration *mazes = NULL;
+
+static void newMaze(maze_configuration* maze);
+static void constructLists(ModeInfo *);
+static void initializeGrid(maze_configuration* maze);
+static float roundToNearestHalf(float num);
+static unsigned isOdd(unsigned num);
+static unsigned isEven(unsigned num);
+static void buildMaze(maze_configuration* maze);
+static void addWallsToList(Tuple cell, maze_configuration* maze);
+static unsigned char isRemovableWall(Tuple coordinates,
+ maze_configuration* maze);
+static void addCells(Tuple cellToAdd, Tuple currentWall,
+ maze_configuration* maze);
+static void removeWallFromList(unsigned index, maze_configuration* maze);
+static void placeMiscObjects(maze_configuration* maze);
+static Tuple placeObject(maze_configuration* maze, unsigned char type);
+static void shiftAcidColor(maze_configuration* maze);
+static void refreshRemainingDistanceToTravel(ModeInfo * mi);
+static void step(Rat* rat, maze_configuration* maze);
+static void walk(Rat* rat, char axis, int sign, maze_configuration* maze);
+static void turn(Rat* rat, maze_configuration* maze);
+static void turnAround(Rat* rat, maze_configuration* maze);
+static void invert(maze_configuration* maze);
+static void changeState(Rat* rat, maze_configuration* maze);
+static void updateInverterRotation(maze_configuration* maze);
+static void drawInverter(maze_configuration* maze, Tuple coordinates);
+static void drawWalls(ModeInfo * mi);
+static void drawWall(Tuple startCoordinates, Tuple endCoordinates,
+ maze_configuration* maze);
+static void drawCeiling(ModeInfo * mi);
+static void drawFloor(ModeInfo * mi);
+static void drawPane(ModeInfo *, GLuint texture, Tuple position);
+static void drawRat(Tuplef position, maze_configuration* maze);
+static void drawOverlay(ModeInfo *);
+
+/* Set up and enable texturing on our object */
+static void
+setup_png_texture (ModeInfo *mi, const unsigned char *png_data,
+ unsigned long data_size)
+{
+ XImage *image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ png_data, data_size);
+ char buf[1024];
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* iOS invalid enum:
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+ */
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA,
+ /* GL_UNSIGNED_BYTE, */
+ GL_UNSIGNED_INT_8_8_8_8_REV,
+ image->data);
+ sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
+ check_gl_error(buf);
+}
+
+
+static Bool
+setup_file_texture (ModeInfo *mi, char *filename)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+
+ XImage *image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+ return True;
+}
+
+static void
+setup_textures(ModeInfo * mi)
+{
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ GLint mag = GL_NEAREST; /* GL_LINEAR */
+
+ glGenTextures(1, &maze->finishTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->finishTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, logo_32_png, sizeof(logo_32_png));
+
+ glGenTextures(1, &maze->ratTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->ratTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, bob_png, sizeof(bob_png));
+
+# ifdef USE_FLOATING_IMAGES
+ glGenTextures(1, &maze->glTextbookTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->glTextbookTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, openglbook_png, sizeof(openglbook_png));
+
+ glGenTextures(1, &maze->gl3dTextTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->gl3dTextTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, opengltxt_png, sizeof(opengltxt_png));
+# endif
+
+# ifdef USE_FRACTAL_IMAGES
+ glGenTextures(1, &maze->fractal1Texture);
+ glBindTexture(GL_TEXTURE_2D, maze->fractal1Texture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, fractal1_png, sizeof(fractal1_png));
+
+ glGenTextures(1, &maze->fractal2Texture);
+ glBindTexture(GL_TEXTURE_2D, maze->fractal2Texture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, fractal2_png, sizeof(fractal2_png));
+
+ glGenTextures(1, &maze->fractal3Texture);
+ glBindTexture(GL_TEXTURE_2D, maze->fractal3Texture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, fractal3_png, sizeof(fractal3_png));
+
+ glGenTextures(1, &maze->fractal4Texture);
+ glBindTexture(GL_TEXTURE_2D, maze->fractal4Texture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, fractal4_png, sizeof(fractal4_png));
+# endif
+
+ glGenTextures(1, &maze->startTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->startTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ setup_png_texture(mi, start_png, sizeof(start_png));
+
+ glGenTextures(1, &maze->ceilingTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->ceilingTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ if (!ceilingTexture || !*ceilingTexture
+ || !strcmp(ceilingTexture, "ceiling-tiles")) {
+ DEFAULT_CEILING_TEXTURE:
+ setup_png_texture(mi, brick2_png, sizeof(brick2_png));
+ } else if (!strcmp(ceilingTexture, "brick-wall")) {
+ setup_png_texture(mi, brick1_png, sizeof(brick1_png));
+ } else if (!strcmp(ceilingTexture, "wood-floor")) {
+ setup_png_texture(mi, wood2_png, sizeof(wood2_png));
+# ifdef USE_FRACTAL_IMAGES
+ } else if (!strcmp(ceilingTexture, "fractal-1")) {
+ setup_png_texture(mi, fractal1_png, sizeof(fractal1_png));
+ dropAcidCeiling = 1;
+ } else if (!strcmp(ceilingTexture, "fractal-2")) {
+ setup_png_texture(mi, fractal2_png, sizeof(fractal2_png));
+ dropAcidCeiling = 1;
+ } else if (!strcmp(ceilingTexture, "fractal-3")) {
+ setup_png_texture(mi, fractal3_png, sizeof(fractal3_png));
+ dropAcidCeiling = 1;
+ } else if (!strcmp(ceilingTexture, "fractal-4")) {
+ setup_png_texture(mi, fractal4_png, sizeof(fractal4_png));
+ dropAcidCeiling = 1;
+# endif
+ } else {
+ if (!setup_file_texture(mi, ceilingTexture))
+ goto DEFAULT_CEILING_TEXTURE;
+ }
+
+ glGenTextures(1, &maze->floorTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->floorTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ if (!floorTexture || !*floorTexture
+ || !strcmp(floorTexture, "wood-floor")) {
+ DEFAULT_FLOOR_TEXTURE:
+ setup_png_texture(mi, wood2_png, sizeof(wood2_png));
+ } else if (!strcmp(floorTexture, "ceiling-tiles")) {
+ setup_png_texture(mi, brick2_png, sizeof(brick2_png));
+ } else if (!strcmp(floorTexture, "brick-wall")) {
+ setup_png_texture(mi, brick1_png, sizeof(brick1_png));
+# ifdef USE_FRACTAL_IMAGES
+ } else if (!strcmp(floorTexture, "fractal-1")) {
+ setup_png_texture(mi, fractal1_png, sizeof(fractal1_png));
+ dropAcidFloor = 1;
+ } else if (!strcmp(floorTexture, "fractal-2")) {
+ setup_png_texture(mi, fractal2_png, sizeof(fractal2_png));
+ dropAcidFloor = 1;
+ } else if (!strcmp(floorTexture, "fractal-3")) {
+ setup_png_texture(mi, fractal3_png, sizeof(fractal3_png));
+ dropAcidFloor = 1;
+ } else if (!strcmp(floorTexture, "fractal-4")) {
+ setup_png_texture(mi, fractal4_png, sizeof(fractal4_png));
+ dropAcidFloor = 1;
+# endif
+ } else {
+ if (!setup_file_texture(mi, floorTexture))
+ goto DEFAULT_FLOOR_TEXTURE;
+ }
+
+ glGenTextures(1, &maze->wallTexture);
+ glBindTexture(GL_TEXTURE_2D, maze->wallTexture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+ if (!wallTexture || !*wallTexture || !strcmp(wallTexture, "brick-wall")) {
+ DEFAULT_WALL_TEXTURE:
+ setup_png_texture(mi, brick1_png, sizeof(brick1_png));
+ } else if (!strcmp(wallTexture, "ceiling-tiles")) {
+ setup_png_texture(mi, brick2_png, sizeof(brick2_png));
+ } else if (!strcmp(wallTexture, "wood-floor")) {
+ setup_png_texture(mi, wood2_png, sizeof(wood2_png));
+# ifdef USE_FRACTAL_IMAGES
+ } else if (!strcmp(wallTexture, "fractal-1")) {
+ setup_png_texture(mi, fractal1_png, sizeof(fractal1_png));
+ dropAcidWalls = 1;
+ } else if (!strcmp(wallTexture, "fractal-2")) {
+ setup_png_texture(mi, fractal2_png, sizeof(fractal2_png));
+ dropAcidWalls = 1;
+ } else if (!strcmp(wallTexture, "fractal-3")) {
+ setup_png_texture(mi, fractal3_png, sizeof(fractal3_png));
+ dropAcidWalls = 1;
+ } else if (!strcmp(wallTexture, "fractal-4")) {
+ setup_png_texture(mi, fractal4_png, sizeof(fractal4_png));
+ dropAcidWalls = 1;
+# endif
+ } else {
+ if (!setup_file_texture(mi, wallTexture))
+ goto DEFAULT_WALL_TEXTURE;
+ }
+}
+
+static void
+initializeGrid(maze_configuration* maze)
+{
+ unsigned i, j;
+
+ for (i = 0; i < maze->numRows; i++) {
+ for (j = 0; j < maze->numColumns; j++) {
+ if (isOdd(i) && isOdd(j))
+ maze->mazeGrid[i][j] = CELL_UNVISITED;
+ else
+ maze->mazeGrid[i][j] = WALL;
+ }
+ }
+}
+
+static float
+roundToNearestHalf(float num)
+{
+ return roundf(2.0 * num) / 2.0;
+}
+
+static unsigned
+isOdd(unsigned num)
+{
+ return num % 2;
+}
+
+static unsigned
+isEven(unsigned num)
+{
+ return !isOdd(num);
+}
+
+/*This is the randomized Prim's algorithm.*/
+static void
+buildMaze(maze_configuration* maze)
+{
+ Tuple cellToAdd, firstCell = {1, 1};
+ maze->mazeGrid[1][1] = CELL;
+
+ addWallsToList(firstCell, maze);
+
+ while (maze->wallListSize > 0) {
+ unsigned randomNum = random() % maze->wallListSize;
+ Tuple currentWall = maze->wallList[randomNum];
+
+ if (isEven(currentWall.row)) {
+ if (maze->mazeGrid[currentWall.row - 1][currentWall.column]
+ == CELL
+ && maze->mazeGrid[currentWall.row + 1][currentWall.column]
+ == CELL_UNVISITED
+ ) {
+ cellToAdd.row = currentWall.row + 1;
+ cellToAdd.column = currentWall.column;
+ addCells(cellToAdd, currentWall, maze);
+ }
+ else if (maze->mazeGrid[currentWall.row + 1][currentWall.column]
+ == CELL
+ && maze->mazeGrid[currentWall.row - 1][currentWall.column]
+ == CELL_UNVISITED
+ ) {
+ cellToAdd.row = currentWall.row - 1;
+ cellToAdd.column = currentWall.column;
+ addCells(cellToAdd, currentWall, maze);
+ }
+ } else {
+ if (maze->mazeGrid[currentWall.row][currentWall.column - 1]
+ == CELL
+ && maze->mazeGrid[currentWall.row][currentWall.column + 1]
+ == CELL_UNVISITED
+ ) {
+ cellToAdd.row = currentWall.row;
+ cellToAdd.column = currentWall.column + 1;
+ addCells(cellToAdd, currentWall, maze);
+ }
+ else if (maze->mazeGrid[currentWall.row][currentWall.column + 1]
+ == CELL
+ && maze->mazeGrid[currentWall.row][currentWall.column - 1]
+ == CELL_UNVISITED
+ ) {
+ cellToAdd.row = currentWall.row;
+ cellToAdd.column = currentWall.column - 1;
+ addCells(cellToAdd, currentWall, maze);
+ }
+ }
+
+ removeWallFromList(randomNum, maze);
+ }
+}
+
+static void
+addWallsToList(Tuple cell, maze_configuration* maze)
+{
+ unsigned i;
+ Tuple walls[4];
+ walls[0].row = cell.row - 1;
+ walls[0].column = cell.column;
+ walls[1].row = cell.row + 1;
+ walls[1].column = cell.column;
+ walls[2].row = cell.row;
+ walls[2].column = cell.column - 1;
+ walls[3].row = cell.row;
+ walls[3].column = cell.column + 1;
+
+ for (i = 0; i < 4; i++) {
+ if (isRemovableWall(walls[i], maze)) {
+ maze->wallList[maze->wallListSize] = walls[i];
+ maze->wallListSize++;
+ }
+ }
+}
+
+static unsigned char
+isRemovableWall(Tuple coordinates, maze_configuration* maze)
+{
+ if (maze->mazeGrid[coordinates.row][coordinates.column] == WALL
+ && coordinates.row > 0
+ && coordinates.row < maze->numRows - 1
+ && coordinates.column > 0
+ && coordinates.column < maze->numColumns - 1
+ )
+ return 1;
+ else
+ return 0;
+}
+
+static void
+addCells(Tuple cellToAdd, Tuple currentWall, maze_configuration* maze)
+{
+ maze->mazeGrid[currentWall.row][currentWall.column] = CELL;
+ maze->mazeGrid[cellToAdd.row][cellToAdd.column] = CELL;
+ addWallsToList(cellToAdd, maze);
+}
+
+static void
+removeWallFromList(unsigned index, maze_configuration* maze)
+{
+ unsigned i;
+ for (i = index + 1; i < maze->wallListSize; i++)
+ maze->wallList[i - 1] = maze->wallList[i];
+
+ maze->wallListSize--;
+}
+
+static void
+placeMiscObjects(maze_configuration* maze)
+{
+ Rat* rat;
+ Tuple temp;
+ unsigned char object;
+ unsigned numSurroundingWalls = 3;
+ unsigned i;
+
+ while (numSurroundingWalls >= 3) {
+ numSurroundingWalls = 0;
+ maze->startPosition = placeObject(maze, CELL);
+
+ object = maze->mazeGrid[maze->startPosition.row]
+ [maze->startPosition.column + 1];
+ if (object == WALL || object == WALL_GL_REDBOOK)
+ numSurroundingWalls++;
+ object = maze->mazeGrid[maze->startPosition.row - 1]
+ [maze->startPosition.column];
+ if (object == WALL || object == WALL_GL_REDBOOK)
+ numSurroundingWalls++;
+ object = maze->mazeGrid[maze->startPosition.row]
+ [maze->startPosition.column - 1];
+ if (object == WALL || object == WALL_GL_REDBOOK)
+ numSurroundingWalls++;
+ object = maze->mazeGrid[maze->startPosition.row + 1]
+ [maze->startPosition.column];
+ if (object == WALL || object == WALL_GL_REDBOOK)
+ numSurroundingWalls++;
+ }
+ maze->mazeGrid[maze->startPosition.row][maze->startPosition.column] = START;
+
+ if (maze->mazeGrid[maze->startPosition.row][maze->startPosition.column + 1]
+ != WALL && maze->mazeGrid[maze->startPosition.row]
+ [maze->startPosition.column + 1] != WALL_GL_REDBOOK) {
+ maze->camera.position.x = (maze->startPosition.column + 1) / 2.0;
+ maze->camera.position.z = maze->startPosition.row / 2.0;
+ maze->camera.rotation = WEST;
+ }
+ else if (maze->mazeGrid[maze->startPosition.row - 1]
+ [maze->startPosition.column] != WALL
+ && maze->mazeGrid[maze->startPosition.row - 1]
+ [maze->startPosition.column] != WALL_GL_REDBOOK) {
+ maze->camera.position.x = maze->startPosition.column / 2.0;
+ maze->camera.position.z = (maze->startPosition.row - 1) / 2.0;
+ maze->camera.rotation = SOUTH;
+ }
+ else if (maze->mazeGrid[maze->startPosition.row]
+ [maze->startPosition.column - 1] != WALL
+ && maze->mazeGrid[maze->startPosition.row]
+ [maze->startPosition.column - 1] != WALL_GL_REDBOOK) {
+ maze->camera.position.x = (maze->startPosition.column - 1) / 2.0;
+ maze->camera.position.z = maze->startPosition.row / 2.0;
+ maze->camera.rotation = EAST;
+ }
+ else {
+ maze->camera.position.x = maze->startPosition.column / 2.0;
+ maze->camera.position.z = (maze->startPosition.row + 1) / 2.0;
+ maze->camera.rotation = NORTH;
+ }
+
+ maze->finishPosition = placeObject(maze, FINISH);
+
+ for (i = 0; i < numInverters; i++)
+ maze->inverterPosition[i] =
+ placeObject(maze, random() % 4 + INVERTER_TETRAHEDRON);
+
+ temp.row = 0;
+ temp.column = 0;
+
+# ifdef USE_FLOATING_IMAGES
+ for (i = 0; i < numGl3dTexts; i++)
+ maze->gl3dTextPosition[i] =
+ placeObject(maze, GL_3D_TEXT);
+# endif
+
+ for (i = 0; i < numRats; i++) {
+ rat = &(maze->rats[i]);
+ temp = placeObject(maze, CELL);
+ rat->position.x = temp.column / 2.0;
+ rat->position.z = temp.row / 2.0;
+ rat->state = WALKING;
+
+ if (temp.row == 0 && temp.column == 0) {
+ continue;
+ }
+
+ if (maze->mazeGrid[(int)(rat->position.z * 2)]
+ [(int)(rat->position.x * 2) + 1]
+ != WALL && maze->mazeGrid[(int)(rat->position.z * 2)]
+ [(int)(rat->position.x * 2) + 1] != WALL_GL_REDBOOK)
+ rat->rotation = EAST;
+ else if (maze->mazeGrid[(int)(rat->position.z * 2) - 1]
+ [(int)(rat->position.x * 2)]
+ != WALL && maze->mazeGrid[(int)(rat->position.z * 2) - 1]
+ [(int)(rat->position.x * 2)] != WALL_GL_REDBOOK)
+ rat->rotation = NORTH;
+ else if (maze->mazeGrid[(int)(rat->position.z * 2)]
+ [(int)(rat->position.x * 2) - 1]
+ != WALL && maze->mazeGrid[(int)(rat->position.z * 2)]
+ [(int)(rat->position.x * 2) - 1] != WALL_GL_REDBOOK)
+ rat->rotation = WEST;
+ else
+ rat->rotation = SOUTH;
+ }
+
+# ifdef USE_FLOATING_IMAGES
+ for (i = 0; i < numGlRedbooks; i++) {
+ while (!(((isOdd(temp.row) && isEven(temp.column))
+ || (isEven(temp.row) && isOdd(temp.column)))
+ && maze->mazeGrid[temp.row][temp.column] == WALL)) {
+ temp.row = random() % maze->numRows;
+ temp.column = random() % maze->numColumns;
+ }
+
+ maze->mazeGrid[temp.row][temp.column] = WALL_GL_REDBOOK;
+ }
+# endif
+}
+
+static Tuple
+placeObject(maze_configuration* maze, unsigned char type)
+{
+ Tuple position = {0, 0};
+
+ while (!(maze->mazeGrid[position.row][position.column] == CELL
+ && isOdd(position.row) && isOdd(position.column))) {
+ position.row = random() % maze->numRows;
+ position.column = random() % maze->numColumns;
+ }
+
+ maze->mazeGrid[position.row][position.column] = type;
+ return position;
+}
+
+ENTRYPOINT void
+reshape_maze (ModeInfo *mi, int width, int height)
+{
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+maze_handle_event (ModeInfo *mi, XEvent *event)
+{
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ if (event->xany.type == ButtonPress)
+ {
+ maze->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ maze->button_down_p = False;
+ return True;
+ }
+ return False;
+}
+
+ENTRYPOINT void
+init_maze (ModeInfo * mi)
+{
+ unsigned i;
+ maze_configuration *maze;
+ GLfloat ambient[] = {0, 0, 0, 1},
+ diffuse[] = {1, 1, 1, 1},
+ position[] = {0, 2, 0, 0},
+ mcolor[] = {1, 1, 1, 1};
+
+ MI_INIT(mi, mazes);
+ maze = &mazes[MI_SCREEN(mi)];
+
+ maze->glx_context = init_GL(mi);
+
+ reshape_maze(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ for (i = 0; i < countof(maze->dlists); i++)
+ maze->dlists[i] = glGenLists (1);
+
+ maze->numRows = (numRows < 2 ? 5 : numRows * 2 + 1);
+ maze->numColumns = (numColumns < 2 ? 5 : numColumns * 2 + 1);
+
+ i = (maze->numRows / 2) * (maze->numColumns / 2) - 2;
+ if (i < numInverters) {
+ numInverters = i;
+ i = 0;
+ } else i -= numInverters;
+
+ if (i < numRats) {
+ numRats = i;
+ i = 0;
+ } else i -= numRats;
+# ifdef USE_FLOATING_IMAGES
+ if (i < numGl3dTexts) {
+ numGl3dTexts = i;
+ i = 0;
+ } else i -= numGl3dTexts;
+
+ if (((maze->numRows - 1) + (maze->numColumns - 1)
+ + ((maze->numRows / 2 - 1) * (maze->numColumns / 2 - 1))) < maze->numGlRedbooks)
+ maze->numGlRedbooks = (maze->numRows - 1) + (maze->numColumns - 1)
+ + ((maze->numRows / 2 - 1) * (maze->numColumns / 2 - 1));
+# endif
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_LIGHT0);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mcolor);
+
+ glShadeModel(GL_FLAT);
+
+ maze->mazeGrid = calloc(maze->numRows, sizeof(unsigned char*));
+ for (i = 0; i < maze->numRows; i++)
+ maze->mazeGrid[i] = calloc(maze->numColumns, sizeof(unsigned char));
+ maze->wallList = calloc(((maze->numColumns - 2) / 2) * ((maze->numRows - 2) / 2 + 1)
+ + ((maze->numColumns - 2) / 2 + 1) * ((maze->numRows - 2) / 2), sizeof(Tuple));
+ maze->inverterPosition = calloc(numInverters, sizeof(Tuple));
+ maze->rats = calloc(numRats, sizeof(Rat));
+# ifdef USE_FLOATING_IMAGES
+ maze->gl3dTextPosition = calloc(numGl3dTexts, sizeof(Tuple));
+#endif
+
+ setup_textures(mi);
+
+ newMaze(maze);
+
+ constructLists(mi);
+ refreshRemainingDistanceToTravel(mi);
+
+ maze->camera.isCamera = 1;
+ for (i = 0; i < numRats; i++)
+ maze->rats[i].isCamera = 0;
+}
+
+static void
+newMaze(maze_configuration* maze)
+{
+ maze->camera.state = STARTING;
+ maze->camera.inversion = 0;
+ maze->wallHeight = 0;
+ maze->inverterRotation = 0;
+ maze->acidHue = 0;
+
+ initializeGrid(maze);
+ buildMaze(maze);
+ placeMiscObjects(maze);
+}
+
+static void
+constructLists(ModeInfo *mi)
+{
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+
+ glNewList(maze->dlists[ARROW], GL_COMPILE);
+ glBegin(GL_POLYGON);
+ glVertex2f(0, -0.25);
+ glVertex2f(0.146946313, 0.202254249);
+ glVertex2f(0, 0.125);
+ glVertex2f(-0.146946313, 0.202254249);
+ glEnd();
+ glEndList();
+
+ glNewList(maze->dlists[SQUARE], GL_COMPILE);
+ glBegin(GL_QUADS);
+ glVertex2f(-0.176776695, -0.176776695);
+ glVertex2f(0.176776695, -0.176776695);
+ glVertex2f(0.176776695, 0.176776695);
+ glVertex2f(-0.176776695, 0.176776695);
+ glEnd();
+ glEndList();
+
+ glNewList(maze->dlists[STAR], GL_COMPILE);
+ glBegin(GL_TRIANGLE_FAN);
+ glVertex2f(0, 0);
+ glVertex2f(0, -0.25);
+ glVertex2f(0.073473157, -0.101127124);
+ glVertex2f(0.237764129, -0.077254249);
+ glVertex2f(0.118882065, 0.038627124);
+ glVertex2f(0.146946313, 0.202254249);
+ glVertex2f(0, 0.125);
+ glVertex2f(-0.146946313, 0.202254249);
+ glVertex2f(-0.118882065, 0.038627124);
+ glVertex2f(-0.237764129, -0.077254249);
+ glVertex2f(-0.073473157, -0.101127124);
+ glVertex2f(0, -0.25);
+ glEnd();
+ glEndList();
+
+ glNewList(maze->dlists[TRIANGLE], GL_COMPILE);
+ glBegin(GL_POLYGON);
+ glVertex2f(0, -0.25);
+ glVertex2f(0.216506351, 0.125);
+ glVertex2f(-0.216506351, 0.125);
+ glEnd();
+ glEndList();
+
+ glNewList(maze->dlists[INVERTER_TETRAHEDRON], GL_COMPILE);
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.471404521, 0.816496581, 0.333333333);
+ glVertex3f(0, 0, 0.25);
+ glVertex3f(0.23570226, 0, -0.083333333);
+ glVertex3f(-0.11785113, 0.204124145, -0.083333333);
+
+ glNormal3f(-0.942809042, 0, 0.333333333);
+ glVertex3f(0, 0, 0.25);
+ glVertex3f(-0.11785113, 0.204124145, -0.083333333);
+ glVertex3f(-0.11785113, -0.204124145, -0.083333333);
+
+ glNormal3f(0.471404521, -0.816496581, 0.333333333);
+ glVertex3f(0, 0, 0.25);
+ glVertex3f(-0.11785113, -0.204124145, -0.083333333);
+ glVertex3f(0.23570226, 0, -0.083333333);
+
+ glNormal3f(0, 0, -1);
+ glVertex3f(0.23570226, 0, -0.083333333);
+ glVertex3f(-0.11785113, -0.204124145, -0.083333333);
+ glVertex3f(-0.11785113, 0.204124145, -0.083333333);
+ glEnd();
+ glEndList();
+
+ glNewList(maze->dlists[INVERTER_OCTAHEDRON], GL_COMPILE);
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.577350269, 0.577350269, 0.577350269);
+ glVertex3f(0, 0, 0.25);
+ glVertex3f(0.25, 0, 0);
+ glVertex3f(0, 0.25, 0);
+
+ glNormal3f(-0.577350269, 0.577350269, 0.577350269);
+ glVertex3f(0, 0, 0.25);
+ glVertex3f(0, 0.25, 0);
+ glVertex3f(-0.25, 0, 0);
+
+ glNormal3f(-0.577350269, -0.577350269, 0.577350269);
+ glVertex3f(0, 0, 0.25);
+ glVertex3f(-0.25, 0, 0);
+ glVertex3f(0, -0.25, 0);
+
+ glNormal3f(0.577350269, -0.577350269, 0.577350269);
+ glVertex3f(0, 0, 0.25);
+ glVertex3f(0, -0.25, 0);
+ glVertex3f(0.25, 0, 0);
+
+ glNormal3f(0.577350269, -0.577350269, -0.577350269);
+ glVertex3f(0.25, 0, 0);
+ glVertex3f(0, -0.25, 0);
+ glVertex3f(0, 0, -0.25);
+
+ glNormal3f(0.577350269, 0.577350269, -0.577350269);
+ glVertex3f(0.25, 0, 0);
+ glVertex3f(0, 0, -0.25);
+ glVertex3f(0, 0.25, 0);
+
+ glNormal3f(-0.577350269, 0.577350269, -0.577350269);
+ glVertex3f(0, 0.25, 0);
+ glVertex3f(0, 0, -0.25);
+ glVertex3f(-0.25, 0, 0);
+
+ glNormal3f(-0.577350269, -0.577350269, -0.577350269);
+ glVertex3f(-0.25, 0, 0);
+ glVertex3f(0, 0, -0.25);
+ glVertex3f(0, -0.25, 0);
+ glEnd();
+ glEndList();
+
+ glNewList(maze->dlists[INVERTER_DODECAHEDRON], GL_COMPILE);
+ glBegin(GL_POLYGON);
+ glNormal3f(0.000000000, 0.000000000, 1.000000000);
+ glVertex3f(0.122780868, 0.089205522, 0.198663618);
+ glVertex3f(-0.046898119, 0.144337567, 0.198663618);
+ glVertex3f(-0.151765500, 0.000000000, 0.198663618);
+ glVertex3f(-0.046898119, -0.144337567, 0.198663618);
+ glVertex3f(0.122780868, -0.089205522, 0.198663618);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(0.894427191, 0.000000000, 0.447213595);
+ glVertex3f(0.198663618, -0.144337567, 0.046898119);
+ glVertex3f(0.245561737, 0.000000000, -0.046898119);
+ glVertex3f(0.198663618, 0.144337567, 0.046898119);
+ glVertex3f(0.122780868, 0.089205522, 0.198663618);
+ glVertex3f(0.122780868, -0.089205522, 0.198663618);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(0.276393202, 0.850650808, 0.447213595);
+ glVertex3f(0.198663618, 0.144337567, 0.046898119);
+ glVertex3f(0.075882750, 0.233543090, -0.046898119);
+ glVertex3f(-0.075882750, 0.233543090, 0.046898119);
+ glVertex3f(-0.046898119, 0.144337567, 0.198663618);
+ glVertex3f(0.122780868, 0.089205522, 0.198663618);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(-0.723606798, 0.525731112, 0.447213595);
+ glVertex3f(-0.075882750, 0.233543090, 0.046898119);
+ glVertex3f(-0.198663618, 0.144337567, -0.046898119);
+ glVertex3f(-0.245561737, 0.000000000, 0.046898119);
+ glVertex3f(-0.151765500, 0.000000000, 0.198663618);
+ glVertex3f(-0.046898119, 0.144337567, 0.198663618);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(-0.723606798, -0.525731112, 0.447213595);
+ glVertex3f(-0.245561737, 0.000000000, 0.046898119);
+ glVertex3f(-0.198663618, -0.144337567, -0.046898119);
+ glVertex3f(-0.075882750, -0.233543090, 0.046898119);
+ glVertex3f(-0.046898119, -0.144337567, 0.198663618);
+ glVertex3f(-0.151765500, 0.000000000, 0.198663618);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(0.276393202, -0.850650808, 0.447213595);
+ glVertex3f(-0.075882750, -0.233543090, 0.046898119);
+ glVertex3f(0.075882750, -0.233543090, -0.046898119);
+ glVertex3f(0.198663618, -0.144337567, 0.046898119);
+ glVertex3f(0.122780868, -0.089205522, 0.198663618);
+ glVertex3f(-0.046898119, -0.144337567, 0.198663618);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(0.723606798, 0.525731112, -0.447213595);
+ glVertex3f(0.245561737, 0.000000000, -0.046898119);
+ glVertex3f(0.151765500, 0.000000000, -0.198663618);
+ glVertex3f(0.046898119, 0.144337567, -0.198663618);
+ glVertex3f(0.075882750, 0.233543090, -0.046898119);
+ glVertex3f(0.198663618, 0.144337567, 0.046898119);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(0.723606798, -0.525731112, -0.447213595);
+ glVertex3f(0.198663618, -0.144337567, 0.046898119);
+ glVertex3f(0.075882750, -0.233543090, -0.046898119);
+ glVertex3f(0.046898119, -0.144337567, -0.198663618);
+ glVertex3f(0.151765500, 0.000000000, -0.198663618);
+ glVertex3f(0.245561737, 0.000000000, -0.046898119);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(-0.276393202, 0.850650808, -0.447213595);
+ glVertex3f(0.075882750, 0.233543090, -0.046898119);
+ glVertex3f(0.046898119, 0.144337567, -0.198663618);
+ glVertex3f(-0.122780868, 0.089205522, -0.198663618);
+ glVertex3f(-0.198663618, 0.144337567, -0.046898119);
+ glVertex3f(-0.075882750, 0.233543090, 0.046898119);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(-0.894427191, 0.000000000, -0.447213595);
+ glVertex3f(-0.198663618, 0.144337567, -0.046898119);
+ glVertex3f(-0.122780868, 0.089205522, -0.198663618);
+ glVertex3f(-0.122780868, -0.089205522, -0.198663618);
+ glVertex3f(-0.198663618, -0.144337567, -0.046898119);
+ glVertex3f(-0.245561737, 0.000000000, 0.046898119);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(-0.276393202, -0.850650808, -0.447213595);
+ glVertex3f(-0.198663618, -0.144337567, -0.046898119);
+ glVertex3f(-0.122780868, -0.089205522, -0.198663618);
+ glVertex3f(0.046898119, -0.144337567, -0.198663618);
+ glVertex3f(0.075882750, -0.233543090, -0.046898119);
+ glVertex3f(-0.075882750, -0.233543090, 0.046898119);
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glNormal3f(0.000000000, 0.000000000, -1.000000000);
+ glVertex3f(0.046898119, -0.144337567, -0.198663618);
+ glVertex3f(-0.122780868, -0.089205522, -0.198663618);
+ glVertex3f(-0.122780868, 0.089205522, -0.198663618);
+ glVertex3f(0.046898119, 0.144337567, -0.198663618);
+ glVertex3f(0.151765500, 0.000000000, -0.198663618);
+ glEnd();
+ glEndList();
+
+ glNewList(maze->dlists[INVERTER_ICOSAHEDRON], GL_COMPILE);
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.491123473, 0.356822090, 0.794654473);
+ glVertex3f(0.000000000, 0.000000000, 0.250000000);
+ glVertex3f(0.223606798, 0.000000000, 0.111803399);
+ glVertex3f(0.069098301, 0.212662702, 0.111803399);
+
+ glNormal3f(-0.187592474, 0.577350269, 0.794654473);
+ glVertex3f(0.000000000, 0.000000000, 0.250000000);
+ glVertex3f(0.069098301, 0.212662702, 0.111803399);
+ glVertex3f(-0.180901699, 0.131432778, 0.111803399);
+
+ glNormal3f(-0.607061998, 0.000000000, 0.794654473);
+ glVertex3f(0.000000000, 0.000000000, 0.250000000);
+ glVertex3f(-0.180901699, 0.131432778, 0.111803399);
+ glVertex3f(-0.180901699, -0.131432778, 0.111803399);
+
+ glNormal3f(-0.187592474, -0.577350269, 0.794654473);
+ glVertex3f(0.000000000, 0.000000000, 0.250000000);
+ glVertex3f(-0.180901699, -0.131432778, 0.111803399);
+ glVertex3f(0.069098301, -0.212662702, 0.111803399);
+
+ glNormal3f(0.491123473, -0.356822090, 0.794654473);
+ glVertex3f(0.000000000, 0.000000000, 0.250000000);
+ glVertex3f(0.069098301, -0.212662702, 0.111803399);
+ glVertex3f(0.223606798, 0.000000000, 0.111803399);
+
+ glNormal3f(0.794654473, -0.577350269, 0.187592474);
+ glVertex3f(0.223606798, 0.000000000, 0.111803399);
+ glVertex3f(0.069098301, -0.212662702, 0.111803399);
+ glVertex3f(0.180901699, -0.131432778, -0.111803399);
+
+ glNormal3f(0.982246947, 0.000000000, -0.187592474);
+ glVertex3f(0.223606798, 0.000000000, 0.111803399);
+ glVertex3f(0.180901699, -0.131432778, -0.111803399);
+ glVertex3f(0.180901699, 0.131432778, -0.111803399);
+
+ glNormal3f(0.794654473, 0.577350269, 0.187592474);
+ glVertex3f(0.223606798, 0.000000000, 0.111803399);
+ glVertex3f(0.180901699, 0.131432778, -0.111803399);
+ glVertex3f(0.069098301, 0.212662702, 0.111803399);
+
+ glNormal3f(0.303530999, 0.934172359, -0.187592474);
+ glVertex3f(0.069098301, 0.212662702, 0.111803399);
+ glVertex3f(0.180901699, 0.131432778, -0.111803399);
+ glVertex3f(-0.069098301, 0.212662702, -0.111803399);
+
+ glNormal3f(-0.303530999, 0.934172359, 0.187592474);
+ glVertex3f(0.069098301, 0.212662702, 0.111803399);
+ glVertex3f(-0.069098301, 0.212662702, -0.111803399);
+ glVertex3f(-0.180901699, 0.131432778, 0.111803399);
+
+ glNormal3f(-0.794654473, 0.577350269, -0.187592474);
+ glVertex3f(-0.180901699, 0.131432778, 0.111803399);
+ glVertex3f(-0.069098301, 0.212662702, -0.111803399);
+ glVertex3f(-0.223606798, 0.000000000, -0.111803399);
+
+ glNormal3f(-0.982246947, 0.000000000, 0.187592474);
+ glVertex3f(-0.180901699, 0.131432778, 0.111803399);
+ glVertex3f(-0.223606798, 0.000000000, -0.111803399);
+ glVertex3f(-0.180901699, -0.131432778, 0.111803399);
+
+ glNormal3f(-0.794654473, -0.577350269, -0.187592474);
+ glVertex3f(-0.180901699, -0.131432778, 0.111803399);
+ glVertex3f(-0.223606798, 0.000000000, -0.111803399);
+ glVertex3f(-0.069098301, -0.212662702, -0.111803399);
+
+ glNormal3f(-0.303530999, -0.934172359, 0.187592474);
+ glVertex3f(-0.180901699, -0.131432778, 0.111803399);
+ glVertex3f(-0.069098301, -0.212662702, -0.111803399);
+ glVertex3f(0.069098301, -0.212662702, 0.111803399);
+
+ glNormal3f(0.303530999, -0.934172359, -0.187592474);
+ glVertex3f(0.069098301, -0.212662702, 0.111803399);
+ glVertex3f(-0.069098301, -0.212662702, -0.111803399);
+ glVertex3f(0.180901699, -0.131432778, -0.111803399);
+
+ glNormal3f(0.607061998, 0.000000000, -0.794654473);
+ glVertex3f(0.180901699, 0.131432778, -0.111803399);
+ glVertex3f(0.180901699, -0.131432778, -0.111803399);
+ glVertex3f(0.000000000, 0.000000000, -0.250000000);
+
+ glNormal3f(0.187592474, 0.577350269, -0.794654473);
+ glVertex3f(0.180901699, 0.131432778, -0.111803399);
+ glVertex3f(0.000000000, 0.000000000, -0.250000000);
+ glVertex3f(-0.069098301, 0.212662702, -0.111803399);
+
+ glNormal3f(0.187592474, -0.577350269, -0.794654473);
+ glVertex3f(0.180901699, -0.131432778, -0.111803399);
+ glVertex3f(-0.069098301, -0.212662702, -0.111803399);
+ glVertex3f(0.000000000, 0.000000000, -0.250000000);
+
+ glNormal3f(-0.491123473, 0.356822090, -0.794654473);
+ glVertex3f(-0.069098301, 0.212662702, -0.111803399);
+ glVertex3f(0.000000000, 0.000000000, -0.250000000);
+ glVertex3f(-0.223606798, 0.000000000, -0.111803399);
+
+ glNormal3f(-0.491123473, -0.356822090, -0.794654473);
+ glVertex3f(-0.223606798, 0.000000000, -0.111803399);
+ glVertex3f(0.000000000, 0.000000000, -0.250000000);
+ glVertex3f(-0.069098301, -0.212662702, -0.111803399);
+ glEnd();
+ glEndList();
+}
+
+ENTRYPOINT void
+draw_maze (ModeInfo * mi)
+{
+ unsigned i;
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) MI_HEIGHT(mi) / MI_WIDTH(mi);
+
+ if (!maze->glx_context)
+ return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(maze->glx_context));
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90, 1/h, 0.05, 100);
+
+ if (MI_WIDTH(mi) > 2560) /* Retina displays */
+ glLineWidth (6);
+ else
+# ifdef HAVE_MOBILE
+ glLineWidth (4);
+# else
+ glLineWidth (2);
+# endif
+
+ glRotatef(maze->camera.inversion, 0, 0, 1);
+ glRotatef(maze->camera.rotation, 0, 1, 0);
+ glTranslatef(-1 * maze->camera.position.x, -0.5,
+ -1 * maze->camera.position.z);
+
+ refreshRemainingDistanceToTravel(mi);
+
+ updateInverterRotation(maze);
+ shiftAcidColor(maze);
+ step(&maze->camera, maze);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ drawWalls(mi);
+ drawCeiling(mi);
+ drawFloor(mi);
+
+ for (i = 0; i < numInverters; i++)
+ drawInverter(maze, maze->inverterPosition[i]);
+
+# ifdef USE_FLOATING_IMAGES
+ for (i = 0; i < numGl3dTexts; i++)
+ drawPane(mi, maze->gl3dTextTexture, maze->gl3dTextPosition[i]);
+# endif
+
+ for (i = 0; i < numRats; i++) {
+ step(&maze->rats[i], maze);
+ drawRat(maze->rats[i].position, maze);
+ }
+
+ drawPane(mi, maze->finishTexture, maze->finishPosition);
+ drawPane(mi, maze->startTexture, maze->startPosition);
+
+ if (shouldDrawOverlay || maze->button_down_p)
+ drawOverlay(mi);
+
+ if (mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+static void
+shiftAcidColor(maze_configuration* maze)
+{
+ GLfloat x = 1 - fabs(fmod(maze->acidHue / 60.0, 2) - 1);
+
+ if (0 <= maze->acidHue && maze->acidHue <= 60) {
+ maze->acidColor.red = 1;
+ maze->acidColor.green = x;
+ maze->acidColor.blue = 0;
+ } else if (60 <= maze->acidHue && maze->acidHue <= 120) {
+ maze->acidColor.red = x;
+ maze->acidColor.green = 1;
+ maze->acidColor.blue = 0;
+ } else if (120 <= maze->acidHue && maze->acidHue <= 180) {
+ maze->acidColor.red = 0;
+ maze->acidColor.green = 1;
+ maze->acidColor.blue = x;
+ } else if (180 <= maze->acidHue && maze->acidHue <= 240) {
+ maze->acidColor.red = 0;
+ maze->acidColor.green = x;
+ maze->acidColor.blue = 1;
+ } else if (240 <= maze->acidHue && maze->acidHue <= 300) {
+ maze->acidColor.red = x;
+ maze->acidColor.green = 0;
+ maze->acidColor.blue = 1;
+ } else {
+ maze->acidColor.red = 1;
+ maze->acidColor.green = 0;
+ maze->acidColor.blue = x;
+ }
+
+ maze->acidHue += 75 * maze->camera.remainingDistanceToTravel;
+ if (maze->acidHue >= 360) maze->acidHue -= 360;
+}
+
+static void
+refreshRemainingDistanceToTravel(ModeInfo * mi)
+{
+ unsigned i;
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ maze->camera.remainingDistanceToTravel
+ = speed * 1.6 * (MI_DELAY(mi) / 1000000.0);
+ for (i = 0; i < numRats; i++)
+ maze->rats[i].remainingDistanceToTravel =
+ maze->camera.remainingDistanceToTravel;
+}
+
+static void
+step(Rat* rat, maze_configuration* maze)
+{
+ GLfloat previousWallHeight = maze->wallHeight;
+
+ if (!rat->isCamera && (maze->wallHeight < 1
+ || (rat->position.x == 0 && rat->position.z == 0)))
+ return;
+
+ while (rat->remainingDistanceToTravel > 0) {
+ switch(rat->state) {
+ case WALKING:
+ switch((int)rat->rotation) {
+ case NORTH:
+ walk(rat, 'z', -1, maze);
+ break;
+ case EAST:
+ walk(rat, 'x', 1, maze);
+ break;
+ case SOUTH:
+ walk(rat, 'z', 1, maze);
+ break;
+ case WEST:
+ walk(rat, 'x', -1, maze);
+ break;
+ default:
+ rat->rotation = 90 * roundf(rat->rotation / 90.0);
+ break;
+ }
+ break;
+ case TURNING_LEFT:
+ turn(rat, maze);
+ break;
+ case TURNING_RIGHT:
+ turn(rat, maze);
+ break;
+ case TURNING_AROUND:
+ turnAround(rat, maze);
+ break;
+ case INVERTING:
+ invert(maze);
+ break;
+ case STARTING:
+ maze->wallHeight += 0.48 * rat->remainingDistanceToTravel;
+ if (maze->wallHeight > 1.0) {
+ maze->wallHeight = 1.0;
+ rat->remainingDistanceToTravel =
+ fabs(previousWallHeight - maze->wallHeight);
+ changeState(&maze->camera, maze);
+ } else
+ rat->remainingDistanceToTravel = 0;
+ break;
+ case FINISHING:
+ if (maze->wallHeight == 0) {
+ newMaze(maze);
+ rat->remainingDistanceToTravel = 0;
+ }
+ else if (maze->wallHeight < 0) {
+ maze->wallHeight = 0;
+ rat->remainingDistanceToTravel =
+ fabs(previousWallHeight - maze->wallHeight);
+ }
+ else {
+ maze->wallHeight -= 0.48 * rat->remainingDistanceToTravel;
+ rat->remainingDistanceToTravel = 0;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static void
+walk(Rat* rat, char axis, int sign, maze_configuration* maze)
+{
+ GLfloat* component = (axis == 'x' ? &rat->position.x : &rat->position.z);
+ GLfloat previousPosition = *component;
+ int isMultipleOfOneHalf = 0;
+ unsigned temp = (unsigned)((*component) * 2.0);
+
+ if (((*component) * 2) == roundf((*component) * 2))
+ isMultipleOfOneHalf = 1;
+ *component += sign * rat->remainingDistanceToTravel;
+
+ if (!isMultipleOfOneHalf && ((unsigned)((*component) * 2.0)) != temp) {
+ *component = roundToNearestHalf(*component);
+ rat->remainingDistanceToTravel -=
+ fabs((*component) - previousPosition);
+ changeState(rat, maze);
+ } else
+ rat->remainingDistanceToTravel = 0;
+
+}
+
+static void
+turn(Rat* rat, maze_configuration* maze)
+{
+ Tuplef rotatingAround;
+ GLfloat tangentVectorDirection, previousRotation
+ = rat->rotation;
+
+ if (rat->state == TURNING_LEFT) {
+ tangentVectorDirection = rat->rotation * (M_PI / 180) + M_PI;
+ rotatingAround.x = roundToNearestHalf(rat->position.x
+ + 0.5 * cos(tangentVectorDirection));
+ rotatingAround.z = roundToNearestHalf(rat->position.z
+ + 0.5 * sin(tangentVectorDirection));
+
+ rat->rotation -= DEF_ANGULAR_CONVERSION_FACTOR
+ * rat->remainingDistanceToTravel;
+
+ if (previousRotation > WEST && rat->rotation <= WEST) {
+ rat->rotation = WEST;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ } else if (previousRotation > SOUTH && rat->rotation <= SOUTH) {
+ rat->rotation = SOUTH;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ } else if (previousRotation > EAST && rat->rotation <= EAST) {
+ rat->rotation = EAST;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ } else if (previousRotation > NORTH && rat->rotation <= NORTH) {
+ rat->rotation = NORTH;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ } else
+ rat->remainingDistanceToTravel = 0;
+
+ tangentVectorDirection = rat->rotation * (M_PI / 180);
+ }
+ else {
+ tangentVectorDirection = rat->rotation * (M_PI / 180);
+ rotatingAround.x = roundToNearestHalf(rat->position.x
+ + 0.5 * cos(tangentVectorDirection));
+ rotatingAround.z = roundToNearestHalf(rat->position.z
+ + 0.5 * sin(tangentVectorDirection));
+
+ rat->rotation += DEF_ANGULAR_CONVERSION_FACTOR
+ * rat->remainingDistanceToTravel;
+
+ if (rat->rotation >= 360) {
+ rat->rotation = NORTH;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - 360);
+ } else if (previousRotation < WEST && rat->rotation >= WEST) {
+ rat->rotation = WEST;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ } else if (previousRotation < SOUTH && rat->rotation >= SOUTH) {
+ rat->rotation = SOUTH;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ } else if (previousRotation < EAST && rat->rotation >= EAST) {
+ rat->rotation = EAST;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ } else
+ rat->remainingDistanceToTravel = 0;
+
+ tangentVectorDirection = rat->rotation * (M_PI / 180) + M_PI;
+ }
+
+ rat->position.x = rotatingAround.x + 0.5 * cos(tangentVectorDirection);
+ rat->position.z = rotatingAround.z + 0.5 * sin(tangentVectorDirection);
+
+ if (rat->rotation < 0)
+ rat->rotation += 360;
+
+ if (rat->rotation == NORTH || rat->rotation == EAST
+ || rat->rotation == SOUTH || rat->rotation == WEST) {
+ rat->position.x = roundToNearestHalf(rat->position.x);
+ rat->position.z = roundToNearestHalf(rat->position.z);
+ changeState(rat, maze);
+ }
+}
+
+static void
+turnAround(Rat* rat, maze_configuration* maze)
+{
+ GLfloat previousRotation = rat->rotation;
+
+ rat->rotation -= 1.5 * DEF_ANGULAR_CONVERSION_FACTOR
+ * rat->remainingDistanceToTravel;
+
+ if (previousRotation > rat->desiredRotation
+ && rat->rotation <= rat->desiredRotation) {
+ rat->rotation = rat->desiredRotation;
+ rat->remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousRotation - rat->rotation);
+ changeState(rat, maze);
+ }
+ else {
+ rat->remainingDistanceToTravel = 0;
+ if (rat->rotation < 0) rat->rotation += 360;
+ }
+}
+
+static void
+invert(maze_configuration* maze)
+{
+ GLfloat previousInversion = maze->camera.inversion;
+ int shouldChangeState = 0;
+ unsigned cameraX = (unsigned)roundf(maze->camera.position.x * 2),
+ cameraZ = (unsigned)roundf(maze->camera.position.z * 2);
+
+ maze->camera.inversion += 1.5 * DEF_ANGULAR_CONVERSION_FACTOR
+ * maze->camera.remainingDistanceToTravel;
+ if (previousInversion < 180 && maze->camera.inversion >= 180) {
+ maze->camera.inversion = 180;
+ maze->camera.remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousInversion - maze->camera.inversion);
+ shouldChangeState = 1;
+ }
+ else if (maze->camera.inversion >= 360) {
+ maze->camera.inversion = 0;
+ maze->camera.remainingDistanceToTravel -= (M_PI / 180)
+ * fabs(previousInversion - maze->camera.inversion);
+ shouldChangeState = 1;
+ } else
+ maze->camera.remainingDistanceToTravel = 0;
+
+ if (shouldChangeState) {
+ switch ((int)maze->camera.rotation) {
+ case NORTH:
+ maze->mazeGrid[cameraZ - 1][cameraX] = CELL;
+ break;
+ case EAST:
+ maze->mazeGrid[cameraZ][cameraX + 1] = CELL;
+ break;
+ case SOUTH:
+ maze->mazeGrid[cameraZ + 1][cameraX] = CELL;
+ break;
+ case WEST:
+ maze->mazeGrid[cameraZ][cameraX - 1] = CELL;
+ break;
+ default:
+ break;
+ }
+
+ changeState(&maze->camera, maze);
+ }
+}
+
+static void
+changeState(Rat* rat, maze_configuration* maze)
+{
+ unsigned char inFrontOfRat, toTheLeft, straightAhead, toTheRight;
+ unsigned ratX = (unsigned)roundf(rat->position.x * 2),
+ ratZ = (unsigned)roundf(rat->position.z * 2);
+
+ switch ((int)rat->rotation) {
+ case NORTH:
+ inFrontOfRat = maze->mazeGrid[ratZ - 1][ratX];
+ toTheLeft = maze->mazeGrid[ratZ - 1][ratX - 1];
+ straightAhead = maze->mazeGrid[ratZ - 2][ratX];
+ toTheRight = maze->mazeGrid[ratZ - 1][ratX + 1];
+ break;
+ case EAST:
+ inFrontOfRat = maze->mazeGrid[ratZ][ratX + 1];
+ toTheLeft = maze->mazeGrid[ratZ - 1][ratX + 1];
+ straightAhead = maze->mazeGrid[ratZ][ratX + 2];
+ toTheRight = maze->mazeGrid[ratZ + 1][ratX + 1];
+ break;
+ case SOUTH:
+ inFrontOfRat = maze->mazeGrid[ratZ + 1][ratX];
+ toTheLeft = maze->mazeGrid[ratZ + 1][ratX + 1];
+ straightAhead = maze->mazeGrid[ratZ + 2][ratX];
+ toTheRight = maze->mazeGrid[ratZ + 1][ratX - 1];
+ break;
+ case WEST:
+ inFrontOfRat = maze->mazeGrid[ratZ][ratX - 1];
+ toTheLeft = maze->mazeGrid[ratZ + 1][ratX - 1];
+ straightAhead = maze->mazeGrid[ratZ][ratX - 2];
+ toTheRight = maze->mazeGrid[ratZ - 1][ratX - 1];
+ break;
+ default:
+ inFrontOfRat = toTheLeft = straightAhead = toTheRight = CELL;
+ break;
+ }
+
+ if (rat->isCamera && inFrontOfRat == FINISH)
+ rat->state = FINISHING;
+ else if (rat->isCamera && inFrontOfRat >= INVERTER_TETRAHEDRON
+ && inFrontOfRat <= INVERTER_ICOSAHEDRON)
+ rat->state = INVERTING;
+ else if (toTheLeft != WALL && toTheLeft != WALL_GL_REDBOOK)
+ rat->state = TURNING_LEFT;
+ else if (straightAhead != WALL && straightAhead != WALL_GL_REDBOOK)
+ rat->state = WALKING;
+ else if (toTheRight != WALL && toTheRight != WALL_GL_REDBOOK)
+ rat->state = TURNING_RIGHT;
+ else {
+ rat->state = TURNING_AROUND;
+
+ switch ((int)rat->rotation) {
+ case NORTH:
+ rat->desiredRotation = SOUTH;
+ break;
+ case EAST:
+ rat->desiredRotation = WEST;
+ break;
+ case SOUTH:
+ rat->desiredRotation = NORTH;
+ break;
+ case WEST:
+ rat->desiredRotation = EAST;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static void
+updateInverterRotation(maze_configuration* maze)
+{
+ maze->inverterRotation += 45 * maze->camera.remainingDistanceToTravel;
+}
+
+static void drawInverter(maze_configuration* maze, Tuple coordinates)
+{
+ unsigned char type = maze->mazeGrid[coordinates.row][coordinates.column];
+
+ if (maze->wallHeight < 1 ||
+ type < INVERTER_TETRAHEDRON || type > INVERTER_ICOSAHEDRON
+ || (coordinates.row == 0 && coordinates.column == 0))
+ return;
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_CULL_FACE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+
+ glTranslatef(coordinates.column / 2.0, 0.25, coordinates.row / 2.0);
+ glRotatef(0.618033989 * maze->inverterRotation, 0, 1, 0);
+ glRotatef(maze->inverterRotation, 1, 0, 0);
+
+ if (type >= countof(maze->dlists)) abort();
+ glCallList(maze->dlists[type]);
+
+ glPopMatrix();
+
+ glDisable(GL_LIGHTING);
+ glDisable(GL_CULL_FACE);
+}
+
+static void
+drawWalls(ModeInfo * mi)
+{
+ unsigned i, j;
+ Tuple startCoordinates, endCoordinates;
+
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+
+ for (i = 0; i < maze->numRows; i++) {
+ for (j = 0; j < maze->numColumns; j++) {
+ if (maze->mazeGrid[i][j] == WALL
+ || maze->mazeGrid[i][j] == WALL_GL_REDBOOK) {
+ if (maze->mazeGrid[i][j] == WALL) {
+ glBindTexture(GL_TEXTURE_2D, maze->wallTexture);
+ if (dropAcid || dropAcidWalls)
+ glColor3f(maze->acidColor.red, maze->acidColor.green,
+ maze->acidColor.blue);
+# ifdef USE_FLOATING_IMAGES
+ } else {
+ glBindTexture(GL_TEXTURE_2D, maze->glTextbookTexture);
+ glColor3f(1, 1, 1);
+# endif
+ }
+
+ if (isOdd(i) && isEven(j)) {
+ startCoordinates.row = i / 2;
+ startCoordinates.column = j / 2;
+ endCoordinates.row = i / 2 + 1;
+ endCoordinates.column = j / 2;
+ drawWall(startCoordinates, endCoordinates, maze);
+ } else if (isEven(i) && isOdd(j)) {
+ startCoordinates.row = i / 2;
+ startCoordinates.column = j / 2;
+ endCoordinates.row = i / 2;
+ endCoordinates.column = j / 2 + 1;
+ drawWall(startCoordinates, endCoordinates, maze);
+ }
+ }
+ }
+ }
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glColor3f(1, 1, 1);
+}
+
+static void
+drawWall(Tuple startCoordinates, Tuple endCoordinates, maze_configuration* maze)
+{
+ GLfloat wallHeight = maze->wallHeight;
+
+ glBegin(GL_QUADS);
+ if (startCoordinates.row == endCoordinates.row) {
+ glTexCoord2f(0, 0);
+ glVertex3f(startCoordinates.column, 0, startCoordinates.row);
+ glTexCoord2f(1, 0);
+ glVertex3f(endCoordinates.column, 0, startCoordinates.row);
+ glTexCoord2f(1, 1);
+ glVertex3f(endCoordinates.column, wallHeight, endCoordinates.row);
+ glTexCoord2f(0, 1);
+ glVertex3f(startCoordinates.column, wallHeight, endCoordinates.row);
+ } else {
+ glTexCoord2f(0, 0);
+ glVertex3f(startCoordinates.column, 0, startCoordinates.row);
+ glTexCoord2f(1, 0);
+ glVertex3f(startCoordinates.column, 0, endCoordinates.row);
+ glTexCoord2f(1, 1);
+ glVertex3f(endCoordinates.column, wallHeight, endCoordinates.row);
+ glTexCoord2f(0, 1);
+ glVertex3f(endCoordinates.column, wallHeight, startCoordinates.row);
+ }
+ glEnd();
+}
+
+static void
+drawCeiling(ModeInfo * mi)
+{
+ Tuple farRightCorner;
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ farRightCorner.row = maze->numRows / 2;
+ farRightCorner.column = maze->numColumns / 2;
+ glBindTexture(GL_TEXTURE_2D, maze->ceilingTexture);
+
+ glBegin(GL_QUADS);
+ if (dropAcid || dropAcidCeiling)
+ glColor3f(maze->acidColor.red, maze->acidColor.green,
+ maze->acidColor.blue);
+ glTexCoord2f(0, 0);
+ glVertex3f(0, 1, 0);
+ glTexCoord2f(farRightCorner.column, 0);
+ glVertex3f(farRightCorner.column, 1, 0);
+ glTexCoord2f(farRightCorner.column, farRightCorner.row);
+ glVertex3f(farRightCorner.column, 1, farRightCorner.row);
+ glTexCoord2f(0, farRightCorner.row);
+ glVertex3f(0, 1, farRightCorner.row);
+ glColor3f(1, 1, 1);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+}
+
+static void
+drawFloor(ModeInfo * mi)
+{
+ Tuple farRightCorner;
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ farRightCorner.row = maze->numRows / 2;
+ farRightCorner.column = maze->numColumns / 2;
+ glBindTexture(GL_TEXTURE_2D, maze->floorTexture);
+
+ glBegin(GL_QUADS);
+ if (dropAcid || dropAcidFloor)
+ glColor3f(maze->acidColor.red, maze->acidColor.green,
+ maze->acidColor.blue);
+ glTexCoord2f(0, 0);
+ glVertex3f(0, 0, 0);
+ glTexCoord2f(farRightCorner.column, 0);
+ glVertex3f(farRightCorner.column, 0, 0);
+ glTexCoord2f(farRightCorner.column, farRightCorner.row);
+ glVertex3f(farRightCorner.column, 0, farRightCorner.row);
+ glTexCoord2f(0, farRightCorner.row);
+ glVertex3f(0, 0, farRightCorner.row);
+ glColor3f(1, 1, 1);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+}
+
+static void
+drawPane(ModeInfo *mi, GLuint texture, Tuple position)
+{
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ if (position.row == 0 && position.column == 0) return;
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBindTexture(GL_TEXTURE_2D, texture);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glTranslatef(position.column / 2.0, 0, position.row / 2.0);
+ glRotatef(-1 * maze->camera.rotation - 90, 0, 1, 0);
+
+ if (MI_WIDTH(mi) < MI_HEIGHT(mi))
+ {
+ /* Keep the Start button readable in phone portrait mode. */
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (0, 0.5, 0);
+ }
+
+ glBegin(GL_QUADS);
+ glColor4f(1, 1, 1, 0.9);
+ glTexCoord2f(0, 0);
+ glVertex3f(0, 0, 0.5);
+ glTexCoord2f(1, 0);
+ glVertex3f(0, 0, -0.5);
+ glTexCoord2f(1, 1);
+ glVertex3f(0, maze->wallHeight, -0.5);
+ glTexCoord2f(0, 1);
+ glVertex3f(0, maze->wallHeight, 0.5);
+ glColor3f(1, 1, 1);
+ glEnd();
+
+ glPopMatrix();
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_BLEND);
+}
+
+static void
+drawRat(Tuplef position, maze_configuration* maze)
+{
+ if (position.x == 0 && position.z == 0) return;
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBindTexture(GL_TEXTURE_2D, maze->ratTexture);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glTranslatef(position.x, 0, position.z);
+ glRotatef(-1 * maze->camera.rotation - 90, 0, 1, 0);
+
+ glScalef (0.25, 0.25, 0.25);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(0, 0, 0.5);
+ glTexCoord2f(1, 0);
+ glVertex3f(0, 0, -0.5);
+ glTexCoord2f(1, 1);
+ glVertex3f(0, maze->wallHeight, -0.5);
+ glTexCoord2f(0, 1);
+ glVertex3f(0, maze->wallHeight, 0.5);
+ glEnd();
+
+ glPopMatrix();
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_BLEND);
+}
+
+
+static void drawOverlay(ModeInfo *mi)
+{
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+ unsigned i, j;
+ GLfloat h = (GLfloat) MI_HEIGHT(mi) / MI_WIDTH(mi);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(-1/h, 1/h, 1, -1, -1, 1);
+
+ glEnable(GL_BLEND);
+ glColor4f(0, 0, 1, 0.75);
+ glScalef(0.25, 0.25, 0.25);
+
+ glCallList(maze->dlists[ARROW]);
+
+ glRotatef(maze->camera.inversion, 0, 1, 0);
+ glRotatef(maze->camera.rotation, 0, 0, -1);
+ glTranslatef(-maze->camera.position.x, -maze->camera.position.z, 0);
+ glColor4f(1, 1, 1, 0.75);
+
+ glBegin(GL_LINES);
+ for (i = 0; i < maze->numRows; i++) {
+ for (j = 0; j < maze->numColumns; j++) {
+ if (maze->mazeGrid[i][j] == WALL
+ || maze->mazeGrid[i][j] == WALL_GL_REDBOOK) {
+ if (isOdd(i) && isEven(j)) {
+ glVertex2f(j / 2, i / 2);
+ glVertex2f(j / 2, i / 2 + 1);
+ } else if (isEven(i) && isOdd(j)) {
+ glVertex2f(j / 2, i / 2);
+ glVertex2f(j / 2 + 1, i / 2);
+ }
+ }
+ }
+ }
+ glEnd();
+
+ glColor4f(1, 0, 0, 0.75);
+
+ glPushMatrix();
+ glTranslatef(maze->startPosition.column / 2.0,
+ maze->startPosition.row / 2.0, 0);
+ glCallList(maze->dlists[SQUARE]);
+ glPopMatrix();
+
+ glColor4f(1, 1, 0, 0.75);
+
+ glPushMatrix();
+ glTranslatef(maze->finishPosition.column / 2.0,
+ maze->finishPosition.row / 2.0, 0);
+ glCallList(maze->dlists[STAR]);
+ glPopMatrix();
+
+ glColor4f(1, 0.607843137, 0, 0.75);
+
+ for (i = 0; i < numRats; i++) {
+ if (maze->rats[i].position.x == 0 && maze->rats[i].position.z == 0)
+ continue;
+ glPushMatrix();
+ glTranslatef(maze->rats[i].position.x, maze->rats[i].position.z, 0);
+ glRotatef(maze->rats[i].rotation, 0, 0, 1);
+ glCallList(maze->dlists[ARROW]);
+ glPopMatrix();
+ }
+
+ glColor4f(1, 1, 1, 1);
+
+ for (i = 0; i < numInverters; i++) {
+ j = maze->mazeGrid[maze->inverterPosition[i].row]
+ [maze->inverterPosition[i].column];
+ if (j >= INVERTER_TETRAHEDRON && j <= INVERTER_ICOSAHEDRON) {
+ glPushMatrix();
+ glTranslatef(maze->inverterPosition[i].column / 2.0,
+ maze->inverterPosition[i].row / 2.0, 0);
+ glRotatef(1.5 * maze->inverterRotation, 0, 0, 1);
+ glCallList(maze->dlists[TRIANGLE]);
+ glPopMatrix();
+ }
+ }
+
+ glDisable(GL_BLEND);
+
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+}
+
+ENTRYPOINT void
+free_maze (ModeInfo * mi)
+{
+ maze_configuration *maze = &mazes[MI_SCREEN(mi)];
+
+ glDeleteTextures(1, &maze->wallTexture);
+ glDeleteTextures(1, &maze->floorTexture);
+ glDeleteTextures(1, &maze->ceilingTexture);
+ glDeleteTextures(1, &maze->startTexture);
+ glDeleteTextures(1, &maze->ratTexture);
+ glDeleteTextures(1, &maze->finishTexture);
+# ifdef USE_FLOATING_IMAGES
+ glDeleteTextures(1, &maze->glTextbookTexture);
+ glDeleteTextures(1, &maze->gl3dTextTexture);
+# endif
+# ifdef USE_FRACTAL_IMAGES
+ glDeleteTextures(1, &maze->fractal1Texture);
+ glDeleteTextures(1, &maze->fractal2Texture);
+ glDeleteTextures(1, &maze->fractal3Texture);
+ glDeleteTextures(1, &maze->fractal4Texture);
+# endif
+
+ glDeleteLists(maze->dlists[ARROW], 4);
+ glDeleteLists(maze->dlists[INVERTER_TETRAHEDRON], 4);
+
+ free(maze->mazeGrid);
+ free(maze->wallList);
+ free(maze->inverterPosition);
+ free(maze->gl3dTextPosition);
+ free(maze->rats);
+
+ memset(maze, 0, sizeof(*maze));
+}
+
+
+XSCREENSAVER_MODULE_2 ("Maze3D", maze3d, maze)
+
+#endif
diff --git a/hacks/glx/maze3d.man b/hacks/glx/maze3d.man
new file mode 100755
index 0000000..c60fd65
--- /dev/null
+++ b/hacks/glx/maze3d.man
@@ -0,0 +1,116 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+maze3d - A 3D maze.
+.SH SYNOPSIS
+.B maze3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-speed \fIfloat\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+[\-rows \fInumber\fP]
+[\-columns \fInumber\fP]
+[\-overlay]
+[\-wall-texture \fItexture\fP]
+[\-floor-texture \fItexture\fP]
+[\-ceiling-texture \fItexture\fP]
+[\-drop-acid]
+[\-drop-acid-walls]
+[\-drop-acid-floor]
+[\-drop-acid-ceiling]
+[\-inverters \fInumber\fP]
+[\-rats \fInumber\fP]
+.SH DESCRIPTION
+A recreation of the 3D Maze screensaver from Windows 95.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-speed \fInumber\fP
+Speed of the dungeon crawl. 2 is twice as fast, 0.5 is half as fast.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-fps | \-no-fps
+Display the current frame rate and CPU load.
+.TP 8
+.B \-rows \fInumber\fP
+The number of rows in the maze. Default: 12.
+.TP 8
+.B \-columns \fInumber\fP
+The number of columns in the maze. Default: 12.
+.TP 8
+.B \-overlay
+Overlays a minimap of the maze on the screen.
+.TP 8
+.B \-wall-texture \fItexture\fP
+Sets the wall texture. \fItexture\fP can be a path to an image file, or it can be one of the built-in textures (see TEXTURES below).
+.TP 8
+.B \-floor-texture \fItexture\fP
+Sets the floor texture. \fItexture\fP can be a path to an image file, or it can be one of the built-in textures (see TEXTURES below).
+.TP 8
+.B \-ceiling-texture \fItexture\fP
+Sets the ceiling texture. \fItexture\fP can be a path to an image file, or it can be one of the built-in textures (see TEXTURES below).
+.TP 8
+.B \-drop-acid-walls
+Continuously shifts the hue of the wall texture. (This looks like an LSD trip, hence the name.)
+.TP 8
+.B \-drop-acid-floor
+Continuously shifts the hue of the floor texture.
+.TP 8
+.B \-drop-acid-ceiling
+Continuously shifts the hue of the ceiling texture.
+.TP 8
+.B \-drop-acid
+Turns on all three.
+.TP 8
+.B \-inverters \fInumber\fP
+Sets the number of inverters (the spinny grey things that flip the camera upside-down) in the maze. Default: 10.
+.TP 8
+.B \-rats \fInumber\fP
+Sets the number of rats, or rather "Bobs", in the maze. Default: 1.
+.TP 8
+.SH TEXTURES
+The wall, ceiling, and floor textures can be set to one of the following:
+.TP 8
+.B brick-wall
+A brick wall. This is the default wall texture.
+.TP 8
+.B wood-floor
+A wooden floor. This is the default floor texture.
+.TP 8
+.B ceiling-tiles
+Ceiling tiles. This is the default ceiling texture.
+.TP 8
+You can also specify a path to an image file, instead of using one of the built-in textures.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by sudoer@riseup.net. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
diff --git a/hacks/glx/menger.c b/hacks/glx/menger.c
new file mode 100644
index 0000000..249d224
--- /dev/null
+++ b/hacks/glx/menger.c
@@ -0,0 +1,562 @@
+/* menger, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
+ * Copyright (c) 2002 Aurelien Jacobs <aurel@gnuage.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Generates a 3D Menger Sponge gasket:
+ *
+ * ___+._______
+ * __-"" -- __"""----._____
+ * __.--"" -- ___--+---_____. __ .+'|
+ * _.-'"" __ +:"__ | ._..+"" __ .+' F
+ * J"--.____ __ """""+" .+' .J F
+ * J """""---.___ -- .+'" F' F
+ * L """""--...+' .J F
+ * L F"9 --. | . F' J
+ * L -_J L_J F"9 | ;'J .+J .J J
+ * | L_J | F.' .'| J F' J
+ * | |"""--.__ | ' |"" J J
+ * J ._ J ;;; | "L | . |-___J |
+ * J L J J ;-' | L | .'J |_ .' . |
+ * J "" J .---_L F"9 | F.' | .' FJ |
+ * L J .-' __ | L_J | ' :' ' .+
+ * L '--.___ | | .J .'
+ * | F"9 """' | . F' .'
+ * | -_J F"9 | .'J .'
+ * +__ -_J F"9 | F.' .'
+ * """--___ L_J | ' .'
+ * """---___ | .'
+ * ""---._|.'
+ *
+ * The straightforward way to generate this object creates way more polygons
+ * than are needed, since there end up being many buried, interior faces.
+ * So during the recursive building of the object we store which face of
+ * each unitary cube we need to draw. Doing this reduces the polygon count
+ * by 40% - 60%.
+ *
+ * Another optimization we could do to reduce the polygon count would be to
+ * merge adjascent coplanar squares together into rectangles. This would
+ * result in the outer faces being composed of 1xN strips. It's tricky to
+ * to find these adjascent faces in non-exponential time, though.
+ *
+ * We could actually simulate large depths with a texture map -- if the
+ * depth is such that the smallest holes are only a few pixels across,
+ * just draw them as spots on the surface! It would look the same.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+
+# define free_sponge 0
+# define release_sponge 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "150"
+#define DEF_MAX_DEPTH "3"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLuint sponge_list0; /* we store X, Y, and Z-facing surfaces */
+ GLuint sponge_list1; /* in their own lists, to make it easy */
+ GLuint sponge_list2; /* to color them differently. */
+
+ unsigned long squares_fp;
+
+ int current_depth;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor0;
+ int ccolor1;
+ int ccolor2;
+
+ int draw_tick;
+
+} sponge_configuration;
+
+static sponge_configuration *sps = NULL;
+
+static Bool do_spin;
+static Bool do_wander;
+static int speed;
+static int max_depth;
+
+static XrmOptionDescRec opts[] = {
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-depth", ".maxDepth", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Int},
+ {&max_depth, "maxDepth", "MaxDepth", DEF_MAX_DEPTH, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt sponge_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_sponge (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+#define X0 0x01
+#define X1 0x02
+#define Y0 0x04
+#define Y1 0x08
+#define Z0 0x10
+#define Z1 0x20
+
+static int
+cube (float x0, float x1, float y0, float y1, float z0, float z1,
+ int faces, int wireframe)
+{
+ int n = 0;
+
+ if (faces & X0)
+ {
+ glBegin (wireframe ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3f (-1.0, 0.0, 0.0);
+ glVertex3f (x0, y1, z0);
+ glVertex3f (x0, y0, z0);
+ glVertex3f (x0, y0, z1);
+ glVertex3f (x0, y1, z1);
+ glEnd ();
+ n++;
+ }
+ if (faces & X1)
+ {
+ glBegin (wireframe ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3f (1.0, 0.0, 0.0);
+ glVertex3f (x1, y1, z1);
+ glVertex3f (x1, y0, z1);
+ glVertex3f (x1, y0, z0);
+ glVertex3f (x1, y1, z0);
+ glEnd ();
+ n++;
+ }
+ if (faces & Y0)
+ {
+ glBegin (wireframe ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3f (0.0, -1.0, 0.0);
+ glVertex3f (x0, y0, z0);
+ glVertex3f (x0, y0, z1);
+ glVertex3f (x1, y0, z1);
+ glVertex3f (x1, y0, z0);
+ glEnd ();
+ n++;
+ }
+ if (faces & Y1)
+ {
+ glBegin (wireframe ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3f (0.0, 1.0, 0.0);
+ glVertex3f (x0, y1, z0);
+ glVertex3f (x0, y1, z1);
+ glVertex3f (x1, y1, z1);
+ glVertex3f (x1, y1, z0);
+ glEnd ();
+ n++;
+ }
+ if (faces & Z0)
+ {
+ glBegin (wireframe ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3f (0.0, 0.0, -1.0);
+ glVertex3f (x1, y1, z0);
+ glVertex3f (x1, y0, z0);
+ glVertex3f (x0, y0, z0);
+ glVertex3f (x0, y1, z0);
+ glEnd ();
+ n++;
+ }
+ if (faces & Z1)
+ {
+ glBegin (wireframe ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3f (0.0, 0.0, 1.0);
+ glVertex3f (x0, y1, z1);
+ glVertex3f (x0, y0, z1);
+ glVertex3f (x1, y0, z1);
+ glVertex3f (x1, y1, z1);
+ glEnd ();
+ n++;
+ }
+
+ return n;
+}
+
+static int
+menger_recurs_1 (int level, float x0, float x1, float y0, float y1,
+ float z0, float z1, int faces, Bool wireframe,
+ int orig, int forig)
+{
+ float xi, yi, zi;
+ int f, x, y, z;
+ int n = 0;
+
+ if (orig)
+ {
+ if (wireframe)
+ n += cube (x0, x1, y0, y1, z0, z1,
+ faces & (X0 | X1 | Y0 | Y1), wireframe);
+ }
+
+ if (level == 0)
+ {
+ if (!wireframe)
+ n += cube (x0, x1, y0, y1, z0, z1, faces, wireframe);
+ }
+ else
+ {
+ xi = (x1 - x0) / 3;
+ yi = (y1 - y0) / 3;
+ zi = (z1 - z0) / 3;
+
+ for (x = 0; x < 3; x++)
+ for (y = 0; y < 3; y++)
+ for (z = 0; z < 3; z++)
+ {
+ if ((x != 1 && y != 1)
+ || (y != 1 && z != 1)
+ || (x != 1 && z != 1))
+ {
+ f = faces;
+
+ if (x == 1 || (x == 2 && (y != 1 && z != 1)))
+ f &= ~X0;
+ if (x == 1 || (x == 0 && (y != 1 && z != 1)))
+ f &= ~X1;
+ if (forig & X0 && x == 2 && (y == 1 || z == 1))
+ f |= X0;
+ if (forig & X1 && x == 0 && (y == 1 || z == 1))
+ f |= X1;
+
+ if (y == 1 || (y == 2 && (x != 1 && z != 1)))
+ f &= ~Y0;
+ if (y == 1 || (y == 0 && (x != 1 && z != 1)))
+ f &= ~Y1;
+ if (forig & Y0 && y == 2 && (x == 1 || z == 1))
+ f |= Y0;
+ if (forig & Y1 && y == 0 && (x == 1 || z == 1))
+ f |= Y1;
+
+ if (z == 1 || (z == 2 && (x != 1 && y != 1)))
+ f &= ~Z0;
+ if (z == 1 || (z == 0 && (x != 1 && y != 1)))
+ f &= ~Z1;
+ if (forig & Z0 && z == 2 && (x == 1 || y == 1))
+ f |= Z0;
+ if (forig & Z1 && z == 0 && (x == 1 || y == 1))
+ f |= Z1;
+
+ n += menger_recurs_1 (level-1,
+ x0+x*xi, x0+(x+1)*xi,
+ y0+y*yi, y0+(y+1)*yi,
+ z0+z*zi, z0+(z+1)*zi, f, wireframe, 0,
+ forig);
+ }
+ else if (wireframe && (x != 1 || y != 1 || z != 1))
+ n += cube (x0+x*xi, x0+(x+1)*xi,
+ y0+y*yi, y0+(y+1)*yi,
+ z0+z*zi, z0+(z+1)*zi,
+ forig & (X0 | X1 | Y0 | Y1), wireframe);
+ }
+ }
+
+ return n;
+}
+
+static int
+menger_recurs (int level, float x0, float x1, float y0, float y1,
+ float z0, float z1, int faces, Bool wireframe,
+ int orig)
+{
+ return menger_recurs_1 (level, x0, x1, y0, y1, z0, z1, faces,
+ wireframe, orig, faces);
+}
+
+
+static void
+build_sponge (sponge_configuration *sp, Bool wireframe, int level)
+{
+ glDeleteLists (sp->sponge_list0, 1);
+ glNewList(sp->sponge_list0, GL_COMPILE);
+ sp->squares_fp = menger_recurs (level, -1.5, 1.5, -1.5, 1.5, -1.5, 1.5,
+ X0 | X1, wireframe,1);
+ glEndList();
+
+ glDeleteLists (sp->sponge_list1, 1);
+ glNewList(sp->sponge_list1, GL_COMPILE);
+ sp->squares_fp += menger_recurs (level, -1.5, 1.5, -1.5, 1.5, -1.5, 1.5,
+ Y0 | Y1, wireframe,1);
+ glEndList();
+
+ glDeleteLists (sp->sponge_list2, 1);
+ glNewList(sp->sponge_list2, GL_COMPILE);
+ sp->squares_fp += menger_recurs (level, -1.5, 1.5, -1.5, 1.5, -1.5, 1.5,
+ Z0 | Z1, wireframe,1);
+ glEndList();
+}
+
+
+ENTRYPOINT Bool
+sponge_handle_event (ModeInfo *mi, XEvent *event)
+{
+ sponge_configuration *sp = &sps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '+' || c == '=' ||
+ keysym == XK_Up || keysym == XK_Right || keysym == XK_Next)
+ {
+ sp->draw_tick = speed;
+ sp->current_depth += (sp->current_depth > 0 ? 1 : -1);
+ sp->current_depth--;
+ return True;
+ }
+ else if (c == '-' || c == '_' ||
+ keysym == XK_Down || keysym == XK_Left || keysym == XK_Prior)
+ {
+ sp->draw_tick = speed;
+ sp->current_depth -= (sp->current_depth > 0 ? 1 : -1);
+ sp->current_depth--;
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ sp->draw_tick = speed;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+ENTRYPOINT void
+init_sponge (ModeInfo *mi)
+{
+ sponge_configuration *sp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sps);
+
+ sp = &sps[MI_SCREEN(mi)];
+
+ if ((sp->glx_context = init_GL(mi)) != NULL) {
+ reshape_sponge (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ if (!wire)
+ {
+ static const GLfloat pos0[4] = {-1.0, -1.0, 1.0, 0.1};
+ static const GLfloat pos1[4] = { 1.0, -0.2, 0.2, 0.1};
+ static const GLfloat dif0[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat dif1[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+
+ glShadeModel(GL_SMOOTH);
+ }
+
+ {
+ double spin_speed = 1.0;
+ double wander_speed = 0.03;
+ sp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ True);
+ sp->trackball = gltrackball_init (True);
+ }
+
+ sp->ncolors = 128;
+ sp->colors = (XColor *) calloc(sp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ sp->colors, &sp->ncolors,
+ False, 0, False);
+ sp->ccolor0 = 0;
+ sp->ccolor1 = sp->ncolors / 3;
+ sp->ccolor2 = sp->ccolor1 * 2;
+
+ sp->sponge_list0 = glGenLists (1);
+ sp->sponge_list1 = glGenLists (1);
+ sp->sponge_list2 = glGenLists (1);
+
+ sp->draw_tick = 9999999;
+}
+
+
+ENTRYPOINT void
+draw_sponge (ModeInfo *mi)
+{
+ sponge_configuration *sp = &sps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ GLfloat color0[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color1[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color2[4] = {0.0, 0.0, 0.0, 1.0};
+
+ if (!sp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (sp->rot, &x, &y, &z, !sp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 6,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (sp->trackball);
+
+ get_rotation (sp->rot, &x, &y, &z, !sp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ color0[0] = sp->colors[sp->ccolor0].red / 65536.0;
+ color0[1] = sp->colors[sp->ccolor0].green / 65536.0;
+ color0[2] = sp->colors[sp->ccolor0].blue / 65536.0;
+
+ color1[0] = sp->colors[sp->ccolor1].red / 65536.0;
+ color1[1] = sp->colors[sp->ccolor1].green / 65536.0;
+ color1[2] = sp->colors[sp->ccolor1].blue / 65536.0;
+
+ color2[0] = sp->colors[sp->ccolor2].red / 65536.0;
+ color2[1] = sp->colors[sp->ccolor2].green / 65536.0;
+ color2[2] = sp->colors[sp->ccolor2].blue / 65536.0;
+
+
+ sp->ccolor0++;
+ sp->ccolor1++;
+ sp->ccolor2++;
+ if (sp->ccolor0 >= sp->ncolors) sp->ccolor0 = 0;
+ if (sp->ccolor1 >= sp->ncolors) sp->ccolor1 = 0;
+ if (sp->ccolor2 >= sp->ncolors) sp->ccolor2 = 0;
+
+ if (sp->draw_tick++ >= speed)
+ {
+ sp->draw_tick = 0;
+ if (sp->current_depth >= max_depth)
+ sp->current_depth = -max_depth;
+ sp->current_depth++;
+ build_sponge (sp,
+ MI_IS_WIREFRAME(mi),
+ (sp->current_depth < 0
+ ? -sp->current_depth : sp->current_depth));
+
+ mi->polygon_count = sp->squares_fp; /* for FPS display */
+ mi->recursion_depth = (sp->current_depth < 0
+ ? -sp->current_depth : sp->current_depth);
+ }
+
+ glScalef (2.0, 2.0, 2.0);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color0);
+ glCallList (sp->sponge_list0);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1);
+ glCallList (sp->sponge_list1);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2);
+ glCallList (sp->sponge_list2);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("Menger", menger, sponge)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/menger.man b/hacks/glx/menger.man
new file mode 100644
index 0000000..c2c2141
--- /dev/null
+++ b/hacks/glx/menger.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+menger - 3D menger gasket fractal.
+.SH SYNOPSIS
+.B menger
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-depth \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws the three-dimensional variant of the recursive Menger Gasket, a
+cube-based fractal object analagous to the Sierpinski Tetrahedron.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Number of frames before changing shape. Default: 150.
+.TP 8
+.B \-depth \fInumber\fP
+Max depth to descend. Default: 3. You probably don't have enough
+memory for 6.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin [XYZ]
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+None.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/mirrorblob.c b/hacks/glx/mirrorblob.c
new file mode 100644
index 0000000..eb746d1
--- /dev/null
+++ b/hacks/glx/mirrorblob.c
@@ -0,0 +1,1841 @@
+/* mirrorblob Copyright (c) 2003 Jon Dowdall <jon.dowdall@bigpond.com> */
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 23-Sep-2003: jon.dowdall@bigpond.com Created module "blob"
+ * 19-Oct-2003: jon.dowdall@bigpond.com Added texturing
+ * 21-Oct-2003: Renamed to mirrorblob
+ * 10-Feb-2004: jon.dowdall@bigpond.com Added motion blur
+ * 28-Jan-2006: jon.dowdall@bigpond.com Big clean up and bug fixes
+ * 13-Apr-2009: jon.dowdall@gmail.com Fixed Mac version
+ *
+ * The mirrorblob screensaver draws a pulsing blob on the screen. Options
+ * include adding a background (via screen_to_texture), texturing the blob,
+ * making the blob semi-transparent and varying the resolution of the blob
+ * tessellation.
+ *
+ * The blob was inspired by a lavalamp is in no way a simulation. The code is
+ * just an attempt to generate some eye-candy.
+ *
+ * Much of xmirrorblob code framework is taken from the pulsar module by David
+ * Konerding and the glslideshow by Mike Oliphant and Jamie Zawinski.
+ *
+ */
+
+#include <math.h>
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: " DEF_DELAY "\n" \
+ "*showFPS: " DEF_FPS "\n" \
+ "*useSHM: True \n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: True \n" \
+ "*chooseRandomImages: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_mirrorblob 0
+# include "xlockmore.h"
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_DELAY "10000"
+#define DEF_FPS "False"
+#define DEF_WIRE "False"
+#define DEF_BLEND "1.0"
+#define DEF_FOG "False"
+#define DEF_ANTIALIAS "False"
+#define DEF_WALLS "False"
+#define DEF_COLOUR "False"
+#define DEF_ASYNC "True"
+#define DEF_TEXTURE "True"
+#define DEF_OFFSET_TEXTURE "False"
+#define DEF_PAINT_BACKGROUND "True"
+#define DEF_RESOLUTION "30"
+#define DEF_BUMPS "10"
+#define DEF_MOTION_BLUR "0.0"
+#define DEF_INCREMENTAL "0"
+#define DEF_HOLD_TIME "30.0"
+#define DEF_FADE_TIME "5.0"
+#define DEF_ZOOM "1.0"
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#include "gltrackball.h"
+#include "grab-ximage.h"
+
+#undef countof
+#define countof(x) (sizeof((x)) / sizeof((*x)))
+
+#define PI 3.1415926535897
+
+/* Options from command line */
+static GLfloat blend;
+static Bool wireframe;
+static Bool do_fog;
+static Bool do_antialias;
+static Bool do_walls;
+static Bool do_texture;
+static Bool do_paint_background;
+static Bool do_colour;
+static Bool offset_texture;
+static int resolution;
+static int bumps;
+static float motion_blur;
+static float fade_time;
+static float hold_time;
+static float zoom;
+
+/* Internal parameters based on supplied options */
+static Bool culling;
+static Bool load_textures;
+
+static XrmOptionDescRec opts[] = {
+ {"-wire", ".blob.wire", XrmoptionNoArg, "true" },
+ {"+wire", ".blob.wire", XrmoptionNoArg, "false" },
+ {"-blend", ".blob.blend", XrmoptionSepArg, 0 },
+ {"-fog", ".blob.fog", XrmoptionNoArg, "true" },
+ {"+fog", ".blob.fog", XrmoptionNoArg, "false" },
+ {"-antialias", ".blob.antialias", XrmoptionNoArg, "true" },
+ {"+antialias", ".blob.antialias", XrmoptionNoArg, "false" },
+ {"-walls", ".blob.walls", XrmoptionNoArg, "true" },
+ {"+walls", ".blob.walls", XrmoptionNoArg, "false" },
+ {"-texture", ".blob.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".blob.texture", XrmoptionNoArg, "false" },
+ {"-colour", ".blob.colour", XrmoptionNoArg, "true" },
+ {"+colour", ".blob.colour", XrmoptionNoArg, "false" },
+ {"-offset-texture", ".blob.offsetTexture", XrmoptionNoArg, "true" },
+ {"+offset-texture", ".blob.offsetTexture", XrmoptionNoArg, "false" },
+ {"-paint-background", ".blob.paintBackground", XrmoptionNoArg, "true" },
+ {"+paint-background", ".blob.paintBackground", XrmoptionNoArg, "false" },
+ {"-resolution", ".blob.resolution", XrmoptionSepArg, NULL },
+ {"-bumps", ".blob.bumps", XrmoptionSepArg, NULL },
+ {"-motion-blur", ".blob.motionBlur", XrmoptionSepArg, 0 },
+ {"-fade-time", ".blob.fadeTime", XrmoptionSepArg, 0 },
+ {"-hold-time", ".blob.holdTime", XrmoptionSepArg, 0 },
+ {"-zoom", ".blob.zoom", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&wireframe, "wire", "Wire", DEF_WIRE, t_Bool},
+ {&blend, "blend", "Blend", DEF_BLEND, t_Float},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&do_antialias, "antialias", "Antialias", DEF_ANTIALIAS, t_Bool},
+ {&do_walls, "walls", "Walls", DEF_WALLS, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_colour, "colour", "Colour", DEF_COLOUR, t_Bool},
+ {&offset_texture, "offsetTexture","OffsetTexture", DEF_OFFSET_TEXTURE, t_Bool},
+ {&do_paint_background,"paintBackground","PaintBackground", DEF_PAINT_BACKGROUND, t_Bool},
+ {&resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+ {&bumps, "bumps", "Bump", DEF_BUMPS, t_Int},
+ {&motion_blur, "motionBlur", "MotionBlur", DEF_MOTION_BLUR, t_Float},
+ {&fade_time, "fadeTime", "FadeTime", DEF_FADE_TIME, t_Float},
+ {&hold_time, "holdTime", "HoldTime", DEF_HOLD_TIME, t_Float},
+ {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
+};
+
+
+static OptionStruct desc[] =
+{
+ {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+ {"-/+ blend", "whether to do enable blending (slower)"},
+ {"-/+ fog", "whether to do enable fog (slower)"},
+ {"-/+ antialias", "whether to do enable antialiased lines (slower)"},
+ {"-/+ walls", "whether to add walls to the blob space (slower)"},
+ {"-/+ texture", "whether to add a texture to the blob (slower)"},
+ {"-/+ colour", "whether to colour the blob"},
+ {"-/+ offset_texture", "whether to offset texture co-ordinates"},
+ {"-/+ paint_background", "whether to display a background texture (slower)"},
+ {"-resolution", "Resolution of blob tesselation"},
+ {"-bumps", "Number of bumps used to disturb blob"},
+ {"-motion_blur", "Fade blob images (higher number = faster fade)"},
+ {"-fade_time", "Number of frames to transistion to next image"},
+ {"-hold_time", "Number of frames before next image"},
+};
+
+ENTRYPOINT ModeSpecOpt mirrorblob_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct mirrorblob_description =
+{"mirrorblob", "init_mirrorblob", "draw_mirrorblob", NULL,
+ "draw_mirrorblob", "init_mirrorblob", "free_mirrorblob", &mirrorblob_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL mirrorblob", 0, NULL};
+#endif
+
+/*****************************************************************************
+ * Types used in blob code
+ *****************************************************************************/
+
+typedef struct
+{
+ GLfloat x, y;
+} Vector2D;
+
+typedef struct
+{
+ GLfloat x, y, z;
+} Vector3D;
+
+typedef struct
+{
+ GLfloat w;
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+} Quaternion;
+
+typedef struct
+{
+ GLubyte red, green, blue, alpha;
+} Colour;
+
+typedef struct
+{
+ Vector3D initial_position;
+ Vector3D position;
+ Vector3D normal;
+} Node_Data;
+
+typedef struct
+{
+ int node1, node2, node3;
+ Vector3D normal;
+ double length1, length2, length3;
+} Face_Data;
+
+/* Structure to hold data about bumps used to distortion sphere */
+typedef struct
+{
+ double cx, cy, cpower, csize;
+ double ax, ay, power, size;
+ double mx, my, mpower, msize;
+ double vx, vy, vpower, vsize;
+ Vector3D pos;
+} Bump_Data;
+
+/* Vertices of a tetrahedron */
+#define sqrt_3 0.5773502692
+/*#undef sqrt_3
+#define sqrt_3 1.0*/
+#define PPP { sqrt_3, sqrt_3, sqrt_3 } /* +X, +Y, +Z */
+#define MMP { -sqrt_3, -sqrt_3, sqrt_3 } /* -X, -Y, +Z */
+#define MPM { -sqrt_3, sqrt_3, -sqrt_3 } /* -X, +Y, -Z */
+#define PMM { sqrt_3, -sqrt_3, -sqrt_3 } /* +X, -Y, -Z */
+
+/* Structure describing a tetrahedron */
+static Vector3D tetrahedron[4][3] = {
+ {PPP, MMP, MPM},
+ {PMM, MPM, MMP},
+ {PPP, MPM, PMM},
+ {PPP, PMM, MMP}
+};
+
+/*****************************************************************************
+ * Static blob data
+ *****************************************************************************/
+
+static const Vector3D zero_vector = { 0.0, 0.0, 0.0 };
+
+/* Use 2 textures to allow a gradual fade between images */
+#define NUM_TEXTURES 2
+#define BUMP_ARRAY_SIZE 1024
+
+typedef enum
+{
+ INITIALISING,
+ HOLDING,
+ LOADING,
+ TRANSITIONING
+} Frame_State;
+
+/* structure for holding the mirrorblob data */
+typedef struct {
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ XColor fg, bg;
+
+ /* Parameters controlling the position of the blob as a whole */
+ Vector3D blob_center;
+ Vector3D blob_anchor;
+ Vector3D blob_velocity;
+ Vector3D blob_force;
+
+ /* Count of the total number of nodes and faces used to tesselate the blob */
+ int num_nodes;
+ int num_faces;
+
+ Node_Data *nodes;
+ Face_Data *faces;
+
+ Vector3D *dots;
+ Vector3D *normals;
+ Colour *colours;
+ Vector2D *tex_coords;
+
+ /* Pointer to the bump function results */
+ double *bump_shape, *wall_shape;
+
+ Bump_Data *bump_data;
+
+ /* Use 2 textures to allow a gradual fade between images */
+ int current_texture;
+
+ /* Ratio of used texture size to total texture size */
+ GLfloat tex_width[NUM_TEXTURES], tex_height[NUM_TEXTURES];
+ GLuint textures[NUM_TEXTURES];
+
+ Frame_State state;
+ double state_start_time;
+
+ int colour_cycle;
+
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+ Bool first_image_p;
+
+ trackball_state *trackball;
+ int button_down;
+
+} mirrorblobstruct;
+
+static mirrorblobstruct *Mirrorblob = NULL;
+
+/******************************************************************************
+ *
+ * Returns the current time in seconds as a double. Shamelessly borrowed from
+ * glslideshow.
+ *
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+/******************************************************************************
+ *
+ * Change to the projection matrix and set our viewing volume.
+ *
+ */
+static void
+reset_projection(int width, int height)
+{
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ gluPerspective (60.0, 1.0, 1.0, 1024.0 );
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+}
+
+/******************************************************************************
+ *
+ * Calculate the dot product of two vectors u and v
+ * Dot product u.v = |u||v|cos(theta)
+ * Where theta = angle between u and v
+ */
+static inline double
+dot (const Vector3D u, const Vector3D v)
+{
+ return (u.x * v.x) + (u.y * v.y) + (u.z * v.z);
+}
+
+/******************************************************************************
+ *
+ * Calculate the cross product of two vectors.
+ * Gives a vector perpendicular to u and v with magnitude |u||v|sin(theta)
+ * Where theta = angle between u and v
+ */
+static inline Vector3D
+cross (const Vector3D u, const Vector3D v)
+{
+ Vector3D result;
+
+ result.x = (u.y * v.z - u.z * v.y);
+ result.y = (u.z * v.x - u.x * v.z);
+ result.z = (u.x * v.y - u.y * v.x);
+
+ return result;
+}
+
+/******************************************************************************
+ *
+ * Add vector v to vector u
+ */
+static inline void
+add (Vector3D *u, const Vector3D v)
+{
+ u->x = u->x + v.x;
+ u->y = u->y + v.y;
+ u->z = u->z + v.z;
+}
+
+/******************************************************************************
+ *
+ * Subtract vector v from vector u
+ */
+static inline Vector3D
+subtract (const Vector3D u, const Vector3D v)
+{
+ Vector3D result;
+
+ result.x = u.x - v.x;
+ result.y = u.y - v.y;
+ result.z = u.z - v.z;
+
+ return result;
+}
+
+/******************************************************************************
+ *
+ * multiply vector v by scalar s
+ */
+static inline Vector3D
+scale (const Vector3D v, const double s)
+{
+ Vector3D result;
+
+ result.x = v.x * s;
+ result.y = v.y * s;
+ result.z = v.z * s;
+ return result;
+}
+
+/******************************************************************************
+ *
+ * normalise vector v
+ */
+static inline Vector3D
+normalise (const Vector3D v)
+{
+ Vector3D result;
+ double magnitude;
+
+ magnitude = sqrt (dot(v, v));
+
+ if (magnitude > 1e-300)
+ {
+ result = scale (v, 1.0 / magnitude);
+ }
+ else
+ {
+ printf("zero\n");
+ result = zero_vector;
+ }
+ return result;
+}
+
+/******************************************************************************
+ *
+ * Calculate the transform matrix for the given quaternion
+ */
+static void
+quaternion_transform (Quaternion q, GLfloat * transform)
+{
+ GLfloat x, y, z, w;
+ x = q.x;
+ y = q.y;
+ z = q.z;
+ w = q.w;
+
+ transform[0] = (w * w) + (x * x) - (y * y) - (z * z);
+ transform[1] = (2.0 * x * y) + (2.0 * w * z);
+ transform[2] = (2.0 * x * z) - (2.0 * w * y);
+ transform[3] = 0.0;
+
+ transform[4] = (2.0 * x * y) - (2.0 * w * z);
+ transform[5] = (w * w) - (x * x) + (y * y) - (z * z);
+ transform[6] = (2.0 * y * z) + (2.0 * w * x);
+ transform[7] = 0.0;
+
+ transform[8] = (2.0 * x * z) + (2.0 * w * y);
+ transform[9] = (2.0 * y * z) - (2.0 * w * x);
+ transform[10] = (w * w) - (x * x) - (y * y) + (z * z);
+ transform[11] = 0.0;
+
+ transform[12] = 0.0;
+ transform[13] = 0.0;
+ transform[14] = 0.0;
+ transform[15] = (w * w) + (x * x) + (y * y) + (z * z);
+}
+
+/******************************************************************************
+ *
+ * Apply a matrix transform to the given vector
+ */
+static inline Vector3D
+vector_transform (Vector3D u, GLfloat * t)
+{
+ Vector3D result;
+
+ result.x = (u.x * t[0] + u.y * t[4] + u.z * t[8] + 1.0 * t[12]);
+ result.y = (u.x * t[1] + u.y * t[5] + u.z * t[9] + 1.0 * t[13]);
+ result.z = (u.x * t[2] + u.y * t[6] + u.z * t[10] + 1.0 * t[14]);
+
+ return result;
+}
+
+/******************************************************************************
+ *
+ * Return a node that is on an arc between node1 and node2, where distance
+ * is the proportion of the distance from node1 to the total arc.
+ */
+static Vector3D
+partial (Vector3D node1, Vector3D node2, double distance)
+{
+ Vector3D result;
+ Vector3D rotation_axis;
+ GLfloat transformation[16];
+ double angle;
+ Quaternion rotation;
+
+ rotation_axis = normalise (cross (node1, node2));
+ angle = acos (dot (node1, node2)) * distance;
+
+ rotation.x = rotation_axis.x * sin (angle / 2.0);
+ rotation.y = rotation_axis.y * sin (angle / 2.0);
+ rotation.z = rotation_axis.z * sin (angle / 2.0);
+ rotation.w = cos (angle / 2.0);
+
+ quaternion_transform (rotation, transformation);
+
+ result = vector_transform (node1, transformation);
+
+ return result;
+}
+
+/****************************************************************************
+ *
+ * Callback indicating a texture has loaded
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ mirrorblobstruct *mp = (mirrorblobstruct *) closure;
+ GLint texid = -1;
+ int texture_index = -1;
+ int i;
+
+ glGetIntegerv (GL_TEXTURE_BINDING_2D, &texid);
+ if (texid < 0) abort();
+
+ for (i = 0; i < NUM_TEXTURES; i++) {
+ if (mp->textures[i] == texid) {
+ texture_index = i;
+ break;
+ }
+ }
+ if (texture_index < 0) abort();
+
+ mp->tex_width [texture_index] = (GLfloat) image_width / texture_width;
+ mp->tex_height[texture_index] = -(GLfloat) image_height / texture_height;
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (mp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ mp->waiting_for_image_p = False;
+ mp->first_image_p = True;
+}
+
+/* Load a new file into a texture
+ */
+static void
+grab_texture(ModeInfo *mi, int texture_index)
+{
+ mirrorblobstruct *mp = &Mirrorblob[MI_SCREEN(mi)];
+
+ {
+ int w = (MI_WIDTH(mi) / 2) - 1;
+ int h = (MI_HEIGHT(mi) / 2) - 1;
+ if (w <= 10) w = 10;
+ if (h <= 10) h = 10;
+
+ mp->waiting_for_image_p = True;
+ mp->mipmap_p = True;
+ load_texture_async (mi->xgwa.screen, mi->window,
+ *mp->glx_context, w, h, mp->mipmap_p,
+ mp->textures[texture_index],
+ image_loaded_cb, mp);
+ }
+}
+
+/******************************************************************************
+ *
+ * Generate internal parameters based on supplied options the parameters to
+ * ensure they are consistant.
+ */
+static void
+set_parameters(void)
+{
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ wireframe = 0;
+# endif
+
+ /* In wire frame mode do not draw a texture */
+ if (wireframe)
+ {
+ do_texture = False;
+ blend = 1.0;
+ }
+
+ /* Need to load textures if either the blob or the backgound has an image */
+ if (do_texture || do_paint_background)
+ {
+ load_textures = True;
+ }
+ else
+ {
+ load_textures = False;
+ }
+
+ /* If theres no texture don't calculate co-ordinates. */
+ if (!do_texture)
+ {
+ offset_texture = False;
+ }
+
+ culling = True;
+}
+
+/******************************************************************************
+ *
+ * Initialise the openGL state data.
+ */
+static void
+initialize_gl(ModeInfo *mi, GLsizei width, GLsizei height)
+{
+ mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN(mi)];
+
+ /* Lighting values */
+ GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+
+ GLfloat lightPos0[] = {500.0f, 100.0f, 200.0f, 1.0f };
+ GLfloat whiteLight0[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ GLfloat sourceLight0[] = { 0.6f, 0.6f, 0.6f, 1.0f };
+ GLfloat specularLight0[] = { 0.8f, 0.8f, 0.9f, 1.0f };
+
+ GLfloat lightPos1[] = {-50.0f, -100.0f, 2500.0f, 1.0f };
+ GLfloat whiteLight1[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ GLfloat sourceLight1[] = { 0.6f, 0.6f, 0.6f, 1.0f };
+ GLfloat specularLight1[] = { 0.7f, 0.7f, 0.7f, 1.0f };
+
+ GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+
+ GLfloat fogColor[4] = { 0.4, 0.4, 0.5, 0.1 };
+
+ /* Set the internal parameters based on the configuration settings */
+ set_parameters();
+
+ /* Set the viewport to the width and heigh of the window */
+ glViewport (0, 0, width, height );
+
+ if (do_antialias)
+ {
+ blend = 1.0;
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_POLYGON_SMOOTH);
+ }
+
+ /* The blend function is used for trasitioning between two images even when
+ * blend is not selected.
+ */
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ if (do_fog)
+ {
+ glEnable(GL_FOG);
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glFogf(GL_FOG_DENSITY, 0.50);
+ glFogf(GL_FOG_START, 15.0);
+ glFogf(GL_FOG_END, 30.0);
+ }
+
+ /* Set the shading model to smooth (Gouraud shading). */
+ glShadeModel (GL_SMOOTH);
+
+ glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambientLight);
+ glLightfv (GL_LIGHT0, GL_AMBIENT, whiteLight0);
+ glLightfv (GL_LIGHT0, GL_DIFFUSE, sourceLight0);
+ glLightfv (GL_LIGHT0, GL_SPECULAR, specularLight0);
+ glLightfv (GL_LIGHT0, GL_POSITION, lightPos0);
+ glEnable (GL_LIGHT0);
+ glLightfv (GL_LIGHT1, GL_AMBIENT, whiteLight1);
+ glLightfv (GL_LIGHT1, GL_DIFFUSE, sourceLight1);
+ glLightfv (GL_LIGHT1, GL_SPECULAR, specularLight1);
+ glLightfv (GL_LIGHT1, GL_POSITION, lightPos1);
+ glEnable (GL_LIGHT1);
+ glEnable (GL_LIGHTING);
+
+ /* Enable color tracking */
+ glEnable (GL_COLOR_MATERIAL);
+
+ /* Set Material properties to follow glColor values */
+ glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+
+ /* Set all materials to have specular reflectivity */
+ glMaterialfv (GL_FRONT, GL_SPECULAR, specref);
+ glMateriali (GL_FRONT, GL_SHININESS, 32);
+
+ /* Let GL implementation scale normal vectors. */
+ glEnable (GL_NORMALIZE);
+
+ /* Enable Arrays */
+ if (load_textures)
+ {
+ glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
+ glEnable (GL_TEXTURE_2D);
+
+ gp->current_texture = 0;
+ glGenTextures(NUM_TEXTURES, gp->textures);
+ grab_texture(mi, gp->current_texture);
+
+ glMatrixMode (GL_TEXTURE);
+ glRotated (180.0, 1.0, 0.0, 0.0);
+ glMatrixMode (GL_MODELVIEW);
+ }
+
+ /* Clear the buffer since this is not done during a draw with motion blur */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+/******************************************************************************
+ *
+ * Initialise the openGL state data.
+ */
+static void
+set_blob_gl_state(GLfloat alpha)
+{
+ if (do_antialias)
+ {
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_POLYGON_SMOOTH);
+ }
+
+ if (wireframe)
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+ else
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+
+ /* The blend function is used for trasitioning between two images even when
+ * blend is not selected.
+ */
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ /* Culling. */
+ if (culling)
+ {
+ glCullFace (GL_BACK);
+ glEnable (GL_CULL_FACE);
+ glFrontFace (GL_CCW);
+ }
+ else
+ {
+ glDisable (GL_CULL_FACE);
+ }
+
+ if (blend < 1.0)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ /* Set the default blob colour to off-white. */
+ glColor4f (0.9, 0.9, 1.0, alpha);
+ }
+ else
+ {
+ glDisable(GL_BLEND);
+ glColor4f (0.9, 0.9, 1.0, 1.0);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+}
+
+/******************************************************************************
+ *
+ * Initialise the data required to draw the blob allocating the memory as
+ * necessary.
+ *
+ * Return 0 on success.
+ */
+static int
+initialise_blob(mirrorblobstruct *gp,
+ int width,
+ int height,
+ int bump_array_size)
+{
+ /* Loop variables */
+ int i, u, v, node, side, face, base, base2 = 0;
+ int nodes_on_edge = resolution;
+ Vector3D node1, node2, result;
+
+ if (nodes_on_edge < 2)
+ return -1;
+
+ gp->num_nodes = 2 * nodes_on_edge * nodes_on_edge - 4 * nodes_on_edge + 4;
+ gp->num_faces = 4 * (nodes_on_edge - 1) * (nodes_on_edge - 1);
+
+ gp->nodes = (Node_Data *) malloc (gp->num_nodes * sizeof (Node_Data));
+ if (!gp->nodes)
+ {
+ fprintf (stderr, "Couldn't allocate gp->nodes buffer\n");
+ return -1;
+ }
+
+ gp->faces = (Face_Data *) malloc (gp->num_faces * sizeof (Face_Data));
+ if (!gp->faces)
+ {
+ fprintf (stderr, "Couldn't allocate faces data buffer\n");
+ return -1;
+ }
+
+ gp->bump_data = (Bump_Data *) malloc (bumps * sizeof (Bump_Data));
+ if (!gp->bump_data)
+ {
+ fprintf(stderr, "Couldn't allocate bump data buffer\n");
+ return -1;
+ }
+
+ gp->bump_shape = (double *)malloc(bump_array_size * sizeof(double));
+ if (!gp->bump_shape)
+ {
+ fprintf(stderr, "Couldn't allocate bump buffer\n");
+ return -1;
+ }
+
+ gp->wall_shape = (double *)malloc(bump_array_size * sizeof(double));
+ if (!gp->wall_shape)
+ {
+ fprintf(stderr, "Couldn't allocate wall bump buffer\n");
+ return -1;
+ }
+
+
+ gp->dots = (Vector3D *)malloc(gp->num_nodes * sizeof(Vector3D));
+ if (!gp->dots)
+ {
+ fprintf(stderr, "Couldn't allocate nodes buffer\n");
+ return -1;
+ }
+
+ gp->normals = (Vector3D *)malloc(gp->num_nodes * sizeof(Vector3D));
+ if (!gp->normals)
+ {
+ fprintf(stderr, "Couldn't allocate normals buffer\n");
+ return -1;
+ }
+
+ gp->colours = (Colour *)malloc(gp->num_nodes * sizeof(Colour));
+ if (!gp->colours)
+ {
+ fprintf(stderr, "Couldn't allocate colours buffer\n");
+ return -1;
+ }
+
+ gp->tex_coords = (Vector2D *)malloc(gp->num_nodes * sizeof(Vector2D));
+ if (!gp->tex_coords)
+ {
+ fprintf(stderr, "Couldn't allocate gp->tex_coords buffer\n");
+ return -1;
+ }
+
+
+ /* Initialise bump data */
+ for (i = 0; i < bumps; i++)
+ {
+ gp->bump_data[i].ax = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+ gp->bump_data[i].ay = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+ gp->bump_data[i].power = (5.0 / pow(bumps, 0.75)) * (((double)random() / (double)RAND_MAX) - 0.5);
+ gp->bump_data[i].size = 0.1 + 0.5 * (((double)random() / (double)RAND_MAX));
+
+ gp->bump_data[i].pos.x = 1.5 * sin(PI * gp->bump_data[i].ay)
+ * cos(PI * gp->bump_data[i].ax);
+ gp->bump_data[i].pos.y = 1.5 * cos(PI * gp->bump_data[i].ay);
+ gp->bump_data[i].pos.z = 1.5 * sin(PI * gp->bump_data[i].ay)
+ * sin(PI * gp->bump_data[i].ax);
+
+ gp->bump_data[i].cx = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+ gp->bump_data[i].cy = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+ gp->bump_data[i].cpower = (5.0 / pow(bumps, 0.75)) * (((double)random() / (double)RAND_MAX) - 0.5);
+ gp->bump_data[i].csize = 0.35; /*0.1 + 0.25 * (((double)random() / (double)RAND_MAX));*/
+
+ gp->bump_data[i].vx = 0.0;
+ gp->bump_data[i].vy = 0.0;
+ gp->bump_data[i].vpower = 0.0;
+ gp->bump_data[i].vsize = 0.0;
+
+ gp->bump_data[i].mx = 0.003 * ((double)random() / (double)RAND_MAX);
+ gp->bump_data[i].my = 0.003 * ((double)random() / (double)RAND_MAX);
+ gp->bump_data[i].mpower = 0.003 * ((double)random() / (double)RAND_MAX);
+ gp->bump_data[i].msize = 0.003 * ((double)random() / (double)RAND_MAX);
+ }
+
+ /* Initialise lookup table of bump strength */
+ for (i = 0; i < bump_array_size; i++)
+ {
+ double xd, xd2;
+ xd = i / (double)bump_array_size;
+
+ xd2 = 48.0 * xd * xd;
+ gp->bump_shape[i] = 0.1 / (xd2 + 0.1);
+
+ xd2 = 40.0 * xd * xd * xd * xd;
+ gp->wall_shape[i] = 0.4 / (xd2 + 0.1);
+ }
+
+ node = 0;
+ face = 0;
+ for (side = 0; side < 4; side++)
+ {
+ base = node;
+ if (side == 2)
+ {
+ base2 = node;
+ }
+ /*
+ * The start and end of the for loops below are modified based on the
+ * side of the tetrahedron that is being calculated to avoid duplication
+ * of the gp->nodes that are on the edges of the tetrahedron.
+ */
+ for (u = (side > 1); u < (nodes_on_edge - (side > 0)); u++)
+ {
+ node1 = partial (normalise (tetrahedron[side][0]),
+ normalise (tetrahedron[side][1]),
+ u / (double) (nodes_on_edge - 1));
+ node2 = partial (normalise (tetrahedron[side][0]),
+ normalise (tetrahedron[side][2]),
+ u / (double) (nodes_on_edge - 1));
+
+ for (v = (side > 1); v <= (u - (side > 2)); v++)
+ {
+ if (u > 0)
+ result = partial (node1, node2, v / (double) u);
+ else
+ result = node1;
+
+ gp->nodes[node].position = normalise (result);
+ gp->nodes[node].initial_position = gp->nodes[node].position;
+ gp->nodes[node].normal = zero_vector;
+ node++;
+ }
+ }
+
+ /*
+ * Determine which nodes make up each face. The complexity is caused
+ * by having to determine the correct nodes for the edges of the
+ * tetrahedron since the common nodes on the edges are only calculated
+ * once (see above).
+ */
+ for (u = 0; u < (nodes_on_edge - 1); u++)
+ {
+ for (v = 0; v <= u; v++)
+ {
+ {
+ if (side < 2)
+ {
+ gp->faces[face].node1 = base + ((u * (u + 1)) / 2) + v;
+ gp->faces[face].node2 =
+ base + ((u + 1) * (u + 2)) / 2 + v + 1;
+ gp->faces[face].node3 =
+ base + ((u + 1) * (u + 2)) / 2 + v;
+
+ if ((side == 1) && (u == (nodes_on_edge - 2)))
+ {
+ gp->faces[face].node3 =
+ ((u + 1) * (u + 2)) / 2 +
+ nodes_on_edge - v - 1;
+ gp->faces[face].node2 =
+ ((u + 1) * (u + 2)) / 2 +
+ nodes_on_edge - v - 2;
+ }
+ }
+ else if (side < 3)
+ {
+ gp->faces[face].node1 =
+ base + (((u - 1) * u) / 2) + v - 1;
+ gp->faces[face].node2 = base + ((u) * (u + 1)) / 2 + v;
+ gp->faces[face].node3 =
+ base + ((u) * (u + 1)) / 2 + v - 1;
+
+ if (u == (nodes_on_edge - 2))
+ {
+ int n = nodes_on_edge - v - 1;
+ gp->faces[face].node2 =
+ ((nodes_on_edge *
+ (nodes_on_edge + 1)) / 2) +
+ ((n - 1) * (n + 0)) / 2;
+ gp->faces[face].node3 =
+ ((nodes_on_edge *
+ (nodes_on_edge + 1)) / 2) +
+ ((n + 0) * (n + 1)) / 2;
+ }
+ if (v == 0)
+ {
+ gp->faces[face].node1 = (((u + 1) * (u + 2)) / 2) - 1;
+ gp->faces[face].node3 = (((u + 2) * (u + 3)) / 2) - 1;
+ }
+ }
+ else
+ {
+ gp->faces[face].node1 =
+ base + (((u - 2) * (u - 1)) / 2) + v - 1;
+ gp->faces[face].node2 = base + ((u - 1) * u) / 2 + v;
+ gp->faces[face].node3 = base + ((u - 1) * u) / 2 + v - 1;
+
+ if (v == 0)
+ {
+ gp->faces[face].node1 =
+ base2 + ((u * (u + 1)) / 2) - 1;
+ gp->faces[face].node3 =
+ base2 + ((u + 1) * (u + 2)) / 2 - 1;
+ }
+ if (u == (nodes_on_edge - 2))
+ {
+ gp->faces[face].node3 =
+ ((nodes_on_edge *
+ (nodes_on_edge + 1)) / 2) +
+ ((v + 1) * (v + 2)) / 2 - 1;
+ gp->faces[face].node2 =
+ ((nodes_on_edge *
+ (nodes_on_edge + 1)) / 2) +
+ ((v + 2) * (v + 3)) / 2 - 1;
+ }
+ if (v == u)
+ {
+ gp->faces[face].node1 = (u * (u + 1)) / 2;
+ gp->faces[face].node2 = ((u + 1) * (u + 2)) / 2;
+ }
+ }
+ face++;
+ }
+
+ if (v < u)
+ {
+ if (side < 2)
+ {
+ gp->faces[face].node1 = base + ((u * (u + 1)) / 2) + v;
+ gp->faces[face].node2 =
+ base + ((u * (u + 1)) / 2) + v + 1;
+ gp->faces[face].node3 =
+ base + (((u + 1) * (u + 2)) / 2) + v + 1;
+
+ if ((side == 1) && (u == (nodes_on_edge - 2)))
+ {
+ gp->faces[face].node3 =
+ ((u + 1) * (u + 2)) / 2 +
+ nodes_on_edge - v - 2;
+ }
+ }
+ else if (side < 3)
+ {
+ gp->faces[face].node1 =
+ base + ((u * (u - 1)) / 2) + v - 1;
+ gp->faces[face].node2 = base + ((u * (u - 1)) / 2) + v;
+ gp->faces[face].node3 = base + ((u * (u + 1)) / 2) + v;
+
+ if (u == (nodes_on_edge - 2))
+ {
+ int n = nodes_on_edge - v - 1;
+ gp->faces[face].node3 =
+ ((nodes_on_edge *
+ (nodes_on_edge + 1)) / 2) +
+ ((n + 0) * (n - 1)) / 2;
+ }
+ if (v == 0)
+ {
+ gp->faces[face].node1 = (((u + 1) * (u + 2)) / 2) - 1;
+ }
+ }
+ else
+ {
+ gp->faces[face].node1 =
+ base + (((u - 2) * (u - 1)) / 2) + v - 1;
+ gp->faces[face].node2 =
+ base + (((u - 2) * (u - 1)) / 2) + v;
+ gp->faces[face].node3 = base + (((u - 1) * u) / 2) + v;
+
+ if (v == 0)
+ {
+ gp->faces[face].node1 = base2 + (u * (u + 1)) / 2 - 1;
+ }
+ if (u == (nodes_on_edge - 2))
+ {
+ gp->faces[face].node3 =
+ ((nodes_on_edge * (nodes_on_edge + 1)) / 2) +
+ ((v + 2) * (v + 3)) / 2 - 1;
+ }
+ if (v == (u - 1))
+ {
+ gp->faces[face].node2 = (u * (u + 1)) / 2;
+ }
+ }
+ face++;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/******************************************************************************
+ *
+ * Return the magnitude of the given vector
+ */
+#if 0
+static inline double
+length (Vector3D u)
+{
+ return sqrt (u.x * u.x + u.y * u.y + u.z * u.z);
+}
+#endif
+
+/******************************************************************************
+ *
+ * Calculate the blob shape.
+ */
+static void
+calc_blob(mirrorblobstruct *gp,
+ int width,
+ int height,
+ int bump_array_size,
+ float limit,
+ double fade)
+{
+ /* Loop variables */
+ int i, index, face;
+ /* position of a node */
+ Vector3D node;
+ Vector3D offset;
+ Vector3D bump_vector;
+ int dist;
+
+ /* Update position and strength of bumps used to distort the blob */
+ for (i = 0; i < bumps; i++)
+ {
+ gp->bump_data[i].vx += gp->bump_data[i].mx*(gp->bump_data[i].cx - gp->bump_data[i].ax);
+ gp->bump_data[i].vy += gp->bump_data[i].my*(gp->bump_data[i].cy - gp->bump_data[i].ay);
+ gp->bump_data[i].vpower += gp->bump_data[i].mpower
+ * (gp->bump_data[i].cpower - gp->bump_data[i].power);
+ gp->bump_data[i].vsize += gp->bump_data[i].msize
+ * (gp->bump_data[i].csize - gp->bump_data[i].size);
+
+ gp->bump_data[i].ax += 0.1 * gp->bump_data[i].vx;
+ gp->bump_data[i].ay += 0.1 * gp->bump_data[i].vy;
+ gp->bump_data[i].power += 0.1 * gp->bump_data[i].vpower;
+ gp->bump_data[i].size += 0.1 * gp->bump_data[i].vsize;
+
+ gp->bump_data[i].pos.x = 1.0 * sin(PI * gp->bump_data[i].ay)
+ * cos(PI * gp->bump_data[i].ax);
+ gp->bump_data[i].pos.y = 1.0 * cos(PI * gp->bump_data[i].ay);
+ gp->bump_data[i].pos.z = 1.0 * sin(PI * gp->bump_data[i].ay)
+ * sin(PI * gp->bump_data[i].ax);
+ }
+
+ /* Update calculate new position for each vertex based on an offset from
+ * the initial position
+ */
+ gp->blob_force = zero_vector;
+ for (index = 0; index < gp->num_nodes; ++index)
+ {
+ node = gp->nodes[index].initial_position;
+ gp->nodes[index].normal = node;
+
+ offset = zero_vector;
+ for ( i = 0; i < bumps; i++)
+ {
+ bump_vector = subtract(gp->bump_data[i].pos, node);
+
+ dist = bump_array_size * dot(bump_vector, bump_vector) * gp->bump_data[i].size;
+
+ if (dist < bump_array_size)
+ {
+ add(&offset, scale(node, gp->bump_data[i].power * gp->bump_shape[dist]));
+ add(&gp->blob_force, scale(node, gp->bump_data[i].power * gp->bump_shape[dist]));
+ }
+ }
+
+ add(&node, offset);
+ node = scale(node, zoom);
+ add(&node, gp->blob_center);
+
+ if (do_walls)
+ {
+ if (node.z < -limit) node.z = -limit;
+ if (node.z > limit) node.z = limit;
+
+ dist = bump_array_size * (node.z + limit) * (node.z + limit) * 0.5;
+ if (dist < bump_array_size)
+ {
+ node.x += (node.x - gp->blob_center.x) * gp->wall_shape[dist];
+ node.y += (node.y - gp->blob_center.y) * gp->wall_shape[dist];
+ gp->blob_force.z += (node.z + limit);
+ }
+ else
+ {
+ dist = bump_array_size * (node.z - limit) * (node.z - limit) * 0.5;
+ if (dist < bump_array_size)
+ {
+ node.x += (node.x - gp->blob_center.x) * gp->wall_shape[dist];
+ node.y += (node.y - gp->blob_center.y) * gp->wall_shape[dist];
+ gp->blob_force.z -= (node.z - limit);
+ }
+
+ if (node.y < -limit) node.y = -limit;
+ if (node.y > limit) node.y = limit;
+
+ dist = bump_array_size * (node.y + limit) * (node.y + limit) * 0.5;
+ if (dist < bump_array_size)
+ {
+ node.x += (node.x - gp->blob_center.x) * gp->wall_shape[dist];
+ node.z += (node.z - gp->blob_center.z) * gp->wall_shape[dist];
+ gp->blob_force.y += (node.y + limit);
+ }
+ else
+ {
+ dist = bump_array_size * (node.y - limit) * (node.y - limit) * 0.5;
+ if (dist < bump_array_size)
+ {
+ node.x += (node.x - gp->blob_center.x) * gp->wall_shape[dist];
+ node.z += (node.z - gp->blob_center.z) * gp->wall_shape[dist];
+ gp->blob_force.y -= (node.y - limit);
+ }
+ }
+
+ if (node.x < -limit) node.x = -limit;
+ if (node.x > limit) node.x = limit;
+
+ dist = bump_array_size * (node.x + limit) * (node.x + limit) * 0.5;
+ if (dist < bump_array_size)
+ {
+ node.y += (node.y - gp->blob_center.y) * gp->wall_shape[dist];
+ node.z += (node.z - gp->blob_center.z) * gp->wall_shape[dist];
+ gp->blob_force.x += (node.x + limit);
+ }
+ else
+ {
+ dist = bump_array_size * (node.x - limit) * (node.x - limit) * 0.5;
+ if (dist < bump_array_size)
+ {
+ node.y += (node.y - gp->blob_center.y) * gp->wall_shape[dist];
+ node.z += (node.z - gp->blob_center.z) * gp->wall_shape[dist];
+ gp->blob_force.x -= (node.x - limit);
+ }
+ }
+
+ if (node.y < -limit) node.y = -limit;
+ if (node.y > limit) node.y = limit;
+ }
+ }
+ gp->dots[index] = node;
+ }
+
+ /* Determine the normal for each face */
+ for (face = 0; face < gp->num_faces; face++)
+ {
+ /* Use pointers to indexed nodes to help readability */
+ int index1 = gp->faces[face].node1;
+ int index2 = gp->faces[face].node2;
+ int index3 = gp->faces[face].node3;
+
+ gp->faces[face].normal = cross(subtract(gp->dots[index2], gp->dots[index1]),
+ subtract(gp->dots[index3], gp->dots[index1]));
+
+ /* Add the normal for the face onto the normal for the verticies of
+ the face */
+ add(&gp->nodes[index1].normal, gp->faces[face].normal);
+ add(&gp->nodes[index2].normal, gp->faces[face].normal);
+ add(&gp->nodes[index3].normal, gp->faces[face].normal);
+ }
+
+ /* Use the normal to set the colour and texture */
+ if (do_colour || do_texture)
+ {
+ for (index = 0; index < gp->num_nodes; ++index)
+ {
+ gp->normals[index] = normalise(gp->nodes[index].normal);
+
+ if (do_colour)
+ {
+ gp->colours[index].red = (int)(255.0 * fabs(gp->normals[index].x));
+ gp->colours[index].green = (int)(255.0 * fabs(gp->normals[index].y));
+ gp->colours[index].blue = (int)(255.0 * fabs(gp->normals[index].z));
+ gp->colours[index].alpha = (int)(255.0 * fade);
+ }
+ if (do_texture)
+ {
+ if (offset_texture)
+ {
+ const float cube_size = 100.0;
+ Vector3D eye = {0.0, 0.0, 50.0};
+ Vector3D eye_r = normalise(subtract(gp->dots[index], eye));
+ Vector3D reference = subtract(eye_r, scale(gp->normals[index], 2.0 * dot(eye_r, gp->normals[index])));
+ double x = 0.0;
+ double y = 0.0;
+ double n, n_min = 10000.0, sign = 1.0;
+ if (fabs(reference.z) > 1e-9)
+ {
+ n = (cube_size - gp->dots[index].z) / reference.z;
+ if (n < 0.0)
+ {
+ n = (-cube_size - gp->dots[index].z) / reference.z;
+ sign = 3.0;
+ }
+ if (n > 0.0)
+ {
+ x = sign * (gp->dots[index].x + n * reference.x);
+ y = sign * (gp->dots[index].y + n * reference.y);
+ n_min = n;
+ }
+ }
+ if (fabs(reference.x) > 1e-9)
+ {
+ n = (cube_size - gp->dots[index].x) / reference.x;
+ sign = 1.0;
+ if (n < 0.0)
+ {
+ n = (-cube_size - gp->dots[index].x) / reference.x;
+ sign = -1.0;
+ }
+ if ((n > 0.0) && (n < n_min))
+ {
+ x = sign * (2.0 * cube_size - (gp->dots[index].z + n * reference.z));
+ y = sign * x * (gp->dots[index].y + n * reference.y) / cube_size;
+ n_min = n;
+ }
+ }
+ if (fabs(reference.y) > 1e-9)
+ {
+ n = (cube_size - gp->dots[index].y) / reference.y;
+ sign = 1.0;
+ if (n < 0.0)
+ {
+ n = (-cube_size - gp->dots[index].y) / reference.y;
+ sign = -1.0;
+ }
+ if ((n > 0.0) && (n < n_min))
+ {
+ y = sign * (2.0 * cube_size -( gp->dots[index].z + n * reference.z));
+ x = sign * y * (gp->dots[index].x + n * reference.x) / cube_size;
+ }
+ }
+
+ gp->tex_coords[index].x = 0.5 + x / (cube_size * 6.0);
+ gp->tex_coords[index].y = 0.5 - y / (cube_size * 6.0);
+ }
+ else
+ {
+ gp->tex_coords[index].x = 0.5
+ * (1.0 + asin(gp->normals[index].x) / (0.5 * PI));
+ gp->tex_coords[index].y = -0.5
+ * (1.0 + asin(gp->normals[index].y) / (0.5 * PI));
+ }
+ /* Adjust the texture co-ordinates to from range 0..1 to
+ * 0..width or 0..height as appropriate
+ */
+ gp->tex_coords[index].x *= gp->tex_width[gp->current_texture];
+ gp->tex_coords[index].y *= gp->tex_height[gp->current_texture];
+ }
+ }
+ }
+
+ /* Update the center of the whole blob */
+ add(&gp->blob_velocity, scale (subtract (gp->blob_anchor, gp->blob_center), 1.0 / 80.0));
+ add(&gp->blob_velocity, scale (gp->blob_force, 0.01 / gp->num_nodes));
+
+ add(&gp->blob_center, scale(gp->blob_velocity, 0.5));
+
+ gp->blob_velocity = scale(gp->blob_velocity, 0.999);
+}
+
+static void
+draw_vertex(mirrorblobstruct *gp, int index)
+{
+ if (do_colour)
+ {
+ glColor3ub(gp->colours[index].red,
+ gp->colours[index].green,
+ gp->colours[index].blue);
+ }
+ if (load_textures)
+ {
+ glTexCoord2fv(&gp->tex_coords[index].x);
+ }
+ glNormal3fv(&gp->normals[index].x);
+ glVertex3fv(&gp->dots[index].x);
+}
+
+/******************************************************************************
+ *
+ * Draw the blob shape.
+ *
+ */
+static void
+draw_blob (mirrorblobstruct *gp)
+{
+ int face;
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+/* glRotatef(current_device_rotation(), 0, 0, 1); */
+
+ /* Move down the z-axis. */
+ glTranslatef (0.0, 0.0, -4.0);
+
+ gltrackball_rotate (gp->trackball);
+
+ /* glColor4ub (255, 0, 0, 128); */
+ glBegin(GL_TRIANGLES);
+ for (face = 0; face < gp->num_faces; face++)
+ {
+ draw_vertex(gp, gp->faces[face].node1);
+ draw_vertex(gp, gp->faces[face].node2);
+ draw_vertex(gp, gp->faces[face].node3);
+ }
+ glEnd();
+
+#if 0
+ glBegin(GL_LINES);
+ for (face = 0; face < gp->num_faces; face++)
+ {
+ if (gp->normals[gp->faces[face].node1].z > 0.0)
+ {
+ Vector3D end = gp->dots[gp->faces[face].node1];
+ glVertex3dv(&end);
+ add(&end, scale(gp->normals[gp->faces[face].node1], 0.25));
+ glVertex3dv(&end);
+ }
+ }
+ glEnd();
+#endif
+
+ glLoadIdentity();
+}
+
+/******************************************************************************
+ *
+ * Draw the background image simply map a texture onto a full screen quad.
+ */
+static void
+draw_background (ModeInfo *mi)
+{
+ mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN(mi)];
+ GLfloat rot = current_device_rotation();
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ glEnable (GL_TEXTURE_2D);
+ glDisable(GL_LIGHTING);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ /* Reset the projection matrix to make it easier to get the size of the quad
+ * correct
+ */
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glRotatef (-rot, 0, 0, 1);
+/*
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+*/
+
+ glOrtho(0.0, MI_WIDTH(mi), MI_HEIGHT(mi), 0.0, -1000.0, 1000.0);
+
+ glBegin (GL_QUADS);
+
+ glTexCoord2f (0.0, 0.0);
+ glVertex2i (0, 0);
+
+ glTexCoord2f (0.0, gp->tex_height[gp->current_texture]);
+ glVertex2i (0, MI_HEIGHT(mi));
+
+ glTexCoord2f (gp->tex_width[gp->current_texture], gp->tex_height[gp->current_texture]);
+ glVertex2i (MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glTexCoord2f (gp->tex_width[gp->current_texture], 0.0);
+ glVertex2i (MI_WIDTH(mi), 0);
+ glEnd();
+
+ glPopMatrix ();
+ glMatrixMode (GL_MODELVIEW);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+/******************************************************************************
+ *
+ * Update the scene.
+ */
+static GLvoid
+draw_scene(ModeInfo * mi)
+{
+ mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN(mi)];
+
+ double fade = 0.0;
+ double current_time;
+ check_gl_error ("draw_scene");
+
+ mi->polygon_count = 0;
+ glColor4f (1.0, 1.0, 1.0, 1.0);
+
+ current_time = double_time();
+ switch (gp->state)
+ {
+ case INITIALISING:
+ glColor4f (0.0, 0.0, 0.0, 1.0);
+ fade = 1.0;
+ break;
+
+ case TRANSITIONING:
+ fade = 1.0 - (current_time - gp->state_start_time) / fade_time;
+ break;
+
+ case LOADING: /* FALL-THROUGH */
+ case HOLDING:
+ fade = 1.0;
+ break;
+ }
+
+ /* Set the correct texture, when transitioning this ensures that the first draw
+ * is the original texture (which has the new texture drawn over it with decreasing
+ * transparency)
+ */
+ if (load_textures)
+ {
+ glBindTexture(GL_TEXTURE_2D, gp->textures[gp->current_texture]);
+ }
+
+ glDisable (GL_DEPTH_TEST);
+ if (do_paint_background)
+ {
+ glEnable (GL_TEXTURE_2D);
+ if (motion_blur > 0.0)
+ {
+ glClear(GL_DEPTH_BUFFER_BIT);
+ glEnable (GL_BLEND);
+ glColor4f (1.0, 1.0, 1.0, motion_blur);
+ }
+ else
+ {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ }
+ draw_background (mi);
+ mi->polygon_count++;
+
+ /* When transitioning between two images paint the new image over the old
+ * image with a varying alpha value to get a smooth fade.
+ */
+ if (gp->state == TRANSITIONING)
+ {
+ glEnable (GL_BLEND);
+ /* Select the texture to transition to */
+ glBindTexture (GL_TEXTURE_2D, gp->textures[1 - gp->current_texture]);
+ glColor4f (1.0, 1.0, 1.0, 1.0 - fade);
+
+ draw_background (mi);
+ mi->polygon_count++;
+
+ /* Select the original texture to draw the blob */
+ glBindTexture (GL_TEXTURE_2D, gp->textures[gp->current_texture]);
+ }
+ /* Clear the depth buffer bit so the backgound is behind the blob */
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+ else if (motion_blur > 0.0)
+ {
+ glEnable (GL_BLEND);
+ glColor4f (0.0, 0.0, 0.0, motion_blur);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glTranslatef (0.0, 0.0, -4.0);
+ glRectd (-10.0, -10.0, 10.0, 10.0);
+ if (wireframe)
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+ else
+ {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ }
+
+ if (!do_texture)
+ {
+ fade = 1.0;
+ glDisable (GL_TEXTURE_2D);
+ }
+
+ calc_blob(gp, MI_WIDTH(mi), MI_HEIGHT(mi), BUMP_ARRAY_SIZE, 2.5, fade * blend);
+
+ set_blob_gl_state(fade * blend);
+
+ if (blend < 1.0)
+ {
+ /* Disable the colour chanels so that only the depth buffer is updated */
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ draw_blob(gp);
+ mi->polygon_count += gp->num_faces;
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ }
+
+ glDepthFunc(GL_LEQUAL);
+ draw_blob(gp);
+ mi->polygon_count += gp->num_faces;
+
+ /* While transitioning between images draw a second blob with a modified
+ * alpha value.
+ */
+ if (load_textures && (hold_time > 0))
+ {
+ switch (gp->state)
+ {
+ case INITIALISING:
+ if (!gp->waiting_for_image_p)
+ {
+ gp->state = HOLDING;
+ }
+ break;
+
+ case HOLDING:
+ if ((current_time - gp->state_start_time) > hold_time)
+ {
+ grab_texture(mi, 1 - gp->current_texture);
+ gp->state = LOADING;
+ }
+ break;
+
+ case LOADING:
+ /* Once the image has loaded move to the TRANSITIONING STATE */
+ if (!gp->waiting_for_image_p)
+ {
+ gp->state = TRANSITIONING;
+ /* Get the time again rather than using the current time so
+ * that the time taken by the grab_texture function is not part
+ * of the fade time
+ */
+ gp->state_start_time = double_time();
+ }
+ break;
+
+ case TRANSITIONING:
+
+ /* If the blob is textured draw over existing blob to fade between
+ * images
+ */
+ if (do_texture)
+ {
+ /* Select the texture to transition to */
+ glBindTexture (GL_TEXTURE_2D, gp->textures[1 - gp->current_texture]);
+ glEnable (GL_BLEND);
+
+ /* If colour is enabled update the alpha data in the buffer and
+ * use that in the blending since the alpha of the incomming
+ * verticies will not be correct
+ */
+ if (do_colour)
+ {
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
+ glClearColor(0.0, 0.0, 0.0, (1.0 - fade) * blend);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
+ }
+ else
+ {
+ glColor4f (0.9, 0.9, 1.0, (1.0 - fade) * blend);
+ }
+
+ draw_blob (gp);
+ mi->polygon_count += gp->num_faces;
+
+ if (do_colour)
+ {
+ /* Restore the 'standard' blend functions. */
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+
+ if ((current_time - gp->state_start_time) > fade_time)
+ {
+ gp->state = HOLDING;
+ gp->state_start_time = current_time;
+ gp->current_texture = 1 - gp->current_texture;
+ }
+ break;
+
+ }
+ }
+}
+
+/******************************************************************************
+ *
+ * XMirrorblob screen update entry
+ */
+ENTRYPOINT void
+draw_mirrorblob(ModeInfo * mi)
+{
+ mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!gp->glx_context)
+ return;
+
+ /* Wait for the first image; for subsequent images, load them in the
+ background while animating. */
+ if (gp->waiting_for_image_p && gp->first_image_p)
+ return;
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+ draw_scene(mi);
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+/******************************************************************************
+ *
+ * XMirrorblob screen resize entry
+ */
+ENTRYPOINT void
+reshape_mirrorblob(ModeInfo *mi, int width, int height)
+{
+ glViewport( 0, 0, MI_WIDTH(mi), MI_HEIGHT(mi) );
+ reset_projection(width, height);
+}
+
+/****************************************************************************
+ *
+ * Handle Mouse events
+ */
+ENTRYPOINT Bool
+mirrorblob_handle_event (ModeInfo * mi, XEvent * event)
+{
+ mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN (mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button4)
+ {
+ zoom *= 1.1;
+ return True;
+ }
+ else if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button5)
+ {
+
+ zoom *= 0.9;
+ return True;
+ }
+ else if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down))
+ {
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ gp->state_start_time = 0;
+ gp->state = HOLDING;
+ return True;
+ }
+
+ return False;
+}
+
+/******************************************************************************
+ *
+ * XMirrorblob initialise entry
+ */
+ENTRYPOINT void
+init_mirrorblob(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+
+ mirrorblobstruct *gp;
+
+ MI_INIT(mi, Mirrorblob);
+ gp = &Mirrorblob[screen];
+
+ gp->window = MI_WINDOW(mi);
+ if ((gp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_mirrorblob(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ initialize_gl(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+ gp->trackball = gltrackball_init(False);
+
+ initialise_blob(gp, MI_WIDTH(mi), MI_HEIGHT(mi), BUMP_ARRAY_SIZE);
+ gp->state = INITIALISING;
+ gp->state_start_time = double_time();
+
+ gp->first_image_p = True;
+}
+
+/******************************************************************************
+ *
+ * XMirrorblob cleanup entry
+ */
+ENTRYPOINT void
+free_mirrorblob(ModeInfo * mi)
+{
+ mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN(mi)];
+ if (gp->nodes) free(gp->nodes);
+ if (gp->faces) free(gp->faces);
+ if (gp->bump_data) free(gp->bump_data);
+ if (gp->colours) free(gp->colours);
+ if (gp->tex_coords) free(gp->tex_coords);
+ if (gp->dots) free(gp->dots);
+ if (gp->wall_shape) free(gp->wall_shape);
+ if (gp->bump_shape) free(gp->bump_shape);
+}
+
+XSCREENSAVER_MODULE ("MirrorBlob", mirrorblob)
+
+#endif
diff --git a/hacks/glx/mirrorblob.man b/hacks/glx/mirrorblob.man
new file mode 100644
index 0000000..c61f7a6
--- /dev/null
+++ b/hacks/glx/mirrorblob.man
@@ -0,0 +1,107 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+mirrorblob - Draws a wobbly blob that distorts the image behind it.
+.SH SYNOPSIS
+.B mirrorblob
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-wire]
+[\-delay \fInumber\fP]
+[\-fog]
+[\-walls]
+[\-colour]
+[\-texture]
+[\-offset-texture]
+[\-blend]
+[\-antialias]
+[\-resolution \fInumber\fP]
+[\-bumps \fInumber\fP]
+[\-fade-time \fInumber\fP]
+[\-hold-time \fInumber\fP]
+[\-zoom \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a wobbling blob, making use of alpha blending, fog,
+textures, and lighting, plus a ``frames per second'' meter so that you can
+tell how fast your graphics card is... Requires OpenGL.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.B \-wire
+Render in wireframe instead of solid.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fog | \-no-fog
+Whether to enable fog.
+.TP 8
+.B \-walls | \-no-walls
+Add walls for blob to hit.
+.TP 8
+.B \-colour | \-no-colour
+Draw coloured blob. If also textured, the texture will have color mixed in.
+.TP 8
+.B \-texture | \-no-texture
+Whether to wrap a texture image on the blob.
+.TP 8
+.B \-offset_texture | \-no-offset_texture
+Whether to ofset the texture calculations to only use a region of the image
+ under the blob. This works well with a semi-transparent blob.
+.TP 8
+.B \-blend | \-no-blend
+Whether to draw a transparent blob. (see also offset_texture above)
+.TP 8
+.B \-antialias | \-no-antialias
+Whether to antialias lines.
+.TP 8
+.B \-resolution \fInumber\fP
+Resolution of the tessellation used to calculate and draw the blob. Larger
+ numbers give a smoother blob but increase calculation times exponentially.
+.TP 8
+.B \-bumps \fInumber\fP
+Number of bumps used to distort the blob.
+.TP 8
+.B \-hold-time \fInumber\fP
+Time until loading a new image.
+.TP 8
+.B \-fade-time \fInumber\fP
+Time taken to transition between images.
+.TP 8
+.B \-zoom \fInumber\fP
+Size multiplier for blob.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jon Dowdall. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jon Dowdall.
diff --git a/hacks/glx/moebius.c b/hacks/glx/moebius.c
new file mode 100644
index 0000000..5ef2c0d
--- /dev/null
+++ b/hacks/glx/moebius.c
@@ -0,0 +1,788 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* moebius --- Moebius Strip II, an Escher-like GL scene with ants. */
+
+#if 0
+static const char sccsid[] = "@(#)moebius.c 5.01 2001/03/01 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The RotateAroundU() routine was adapted from the book
+ * "Computer Graphics Principles and Practice
+ * Foley - vanDam - Feiner - Hughes
+ * Second Edition" Pag. 227, exercise 5.15.
+ *
+ * This mode shows some interesting scenes that are impossible OR very
+ * wierd to build in the real universe. Much of the scenes are inspirated
+ * on Mauritz Cornelis Escher's works which derivated the mode's name.
+ * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
+ * say he was a mathematician.
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistakes.
+ *
+ * My e-mail address is
+ * mfvianna@centroin.com.br
+ *
+ * Marcelo F. Vianna (Jun-01-1997)
+ *
+ * Revision History:
+ * 05-Apr-2002: Removed all gllist uses (fix some bug with nvidia driver)
+ * 01-Mar-2001: backported from xscreensaver by lassauge@mail.dotcom.fr
+ * Feb-2001: Made motion and rotation be smoother Jamie Zawinski
+ * <jwz@jwz.org>
+ * 01-Nov-2000: Allocation checks
+ * 01-Jan-1998: Mode separated from escher and renamed
+ * 08-Jun-1997: New scene implemented: "Impossible Cage" based in a M.C.
+ * Escher's painting with the same name (quite similar). The
+ * first GL mode to use texture mapping.
+ * The "Impossible Cage" scene doesn't use DEPTH BUFFER, the
+ * wood planks are drawn consistently using GL_CULL_FACE, and
+ * the painter's algorithm is used to sort the planks.
+ * Marcelo F. Vianna.
+ * 07-Jun-1997: Speed ups in Moebius Strip using GL_CULL_FACE.
+ * Marcelo F. Vianna.
+ * 03-Jun-1997: Initial Release (Only one scene: "Moebius Strip")
+ * The Moebius Strip scene was inspirated in a M.C. Escher's
+ * painting named Moebius Strip II in wich ants walk across a
+ * Moebius Strip path, sometimes meeting each other and sometimes
+ * being in "opposite faces" (note that the moebius strip has
+ * only one face and one edge).
+ * Marcelo F. Vianna.
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#ifdef STANDALONE
+# define MODE_moebius
+# define free_moebius 0
+# define release_moebius 0
+# define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef MODE_moebius
+
+#if 0 /* Hey, this never actually used the texture at all! */
+#if 0
+#include "e_textures.h"
+#else
+#include "ximage-loader.h"
+#include "images/gen/wood_png.h"
+#endif
+#endif /* 0 */
+
+#include "sphere.h"
+#include "tube.h"
+
+#include "rotator.h"
+#include "gltrackball.h"
+
+#define DEF_SOLIDMOEBIUS "False"
+#define DEF_DRAWANTS "True"
+
+static int solidmoebius;
+static int drawants;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "on"},
+ {"+solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "off"},
+ {"-ants", ".moebius.drawants", XrmoptionNoArg, "on"},
+ {"+ants", ".moebius.drawants", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool},
+ {&drawants, "drawants", "Drawants", DEF_DRAWANTS, t_Bool}
+
+};
+static OptionStruct desc[] =
+{
+ {"-/+solidmoebius", "select between a SOLID or a NET Moebius Strip"},
+ {"-/+drawants", "turn on/off walking ants"}
+};
+
+ENTRYPOINT ModeSpecOpt moebius_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct moebius_description =
+{"moebius", "init_moebius", "draw_moebius", (char *) NULL,
+ "draw_moebius", "change_moebius", (char *) NULL, &moebius_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "Shows Moebius Strip II, an Escher-like GL scene with ants", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#define ObjMoebiusStrip 0
+#define ObjAntBody 1
+#define MaxObj 2
+
+/*************************************************************************/
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLfloat ant_position;
+ float ant_step;
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+} moebiusstruct;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const float position0[] = {1.0, 1.0, 1.0, 0.0};
+static const float position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialRed[] = {0.7, 0.0, 0.0, 1.0};
+static const float MaterialGreen[] = {0.1, 0.5, 0.2, 1.0};
+static const float MaterialBlue[] = {0.0, 0.0, 0.7, 1.0};
+static const float MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};
+static const float MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};
+static const float MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};
+static const float MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
+static const float MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+static const float MaterialGray5[] = {0.5, 0.5, 0.5, 1.0};
+static const float MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
+static const float MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
+
+static moebiusstruct *moebius = (moebiusstruct *) NULL;
+
+#define NUM_SCENES 2
+
+static Bool
+mySphere(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if ((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ unit_sphere (16, 16, False);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+static Bool
+myCone(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if ((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluCylinder(quadObj, radius, 0, radius * 3, 8, 1);
+ gluDeleteQuadric(quadObj);
+#else
+ cone (0, 0, 0,
+ 0, 0, radius * 3,
+ radius, 0,
+ 8, True, True, False);
+#endif
+ return True;
+}
+
+static Bool
+draw_moebius_ant(moebiusstruct * mp, const float *Material, int mono)
+{
+ float cos1 = cos(mp->ant_step);
+ float cos2 = cos(mp->ant_step + 2 * Pi / 3);
+ float cos3 = cos(mp->ant_step + 4 * Pi / 3);
+ float sin1 = sin(mp->ant_step);
+ float sin2 = sin(mp->ant_step + 2 * Pi / 3);
+ float sin3 = sin(mp->ant_step + 4 * Pi / 3);
+
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Material);
+ glEnable(GL_CULL_FACE);
+ glPushMatrix();
+ glScalef(1, 1.3, 1);
+ if (!mySphere(0.18))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glTranslatef(0.00, 0.30, 0.00);
+ if (!mySphere(0.2))
+ return False;
+
+ glTranslatef(-0.05, 0.17, 0.05);
+ glRotatef(-90, 1, 0, 0);
+ glRotatef(-25, 0, 1, 0);
+ if (!myCone(0.05))
+ return False;
+ glTranslatef(0.00, 0.10, 0.00);
+ if (!myCone(0.05))
+ return False;
+ glRotatef(25, 0, 1, 0);
+ glRotatef(90, 1, 0, 0);
+
+ glScalef(1, 1.3, 1);
+ glTranslatef(0.15, -0.65, 0.05);
+ if (!mySphere(0.25))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glPopMatrix();
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_LIGHTING);
+ /* ANTENNAS */
+ glBegin(GL_LINES);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, 0.40);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, -0.40);
+ glEnd();
+ glBegin(GL_POINTS);
+ if (mono)
+ glColor3fv(MaterialGray6);
+ else
+ glColor3fv(MaterialRed);
+ glVertex3f(0.40, 0.70, 0.40);
+ glVertex3f(0.40, 0.70, -0.40);
+ glEnd();
+
+ /* LEFT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ glEnd();
+
+ /* LEFT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.00, 0.18);
+ glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ glEnd();
+
+ /* LEFT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, -0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ glEnd();
+
+ /* RIGHT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ glEnd();
+
+ /* RIGHT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.00, -0.18);
+ glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ glEnd();
+
+ /* RIGHT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, -0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ glEnd();
+
+ glBegin(GL_POINTS);
+ if (mono)
+ glColor3fv(MaterialGray8);
+ else
+ glColor3fv(MaterialMagenta);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ glEnd();
+
+ glEnable(GL_LIGHTING);
+
+ mp->ant_step += 0.3;
+ return True;
+}
+
+static void
+RotateAaroundU(float Ax, float Ay, float Az,
+ float Ux, float Uy, float Uz,
+ float *Cx, float *Cy, float *Cz,
+ float Theta)
+{
+ float cosO = cos(Theta);
+ float sinO = sin(Theta);
+ float one_cosO = 1 - cosO;
+ float Ux2 = sqr(Ux);
+ float Uy2 = sqr(Uy);
+ float Uz2 = sqr(Uz);
+ float UxUy = Ux * Uy;
+ float UxUz = Ux * Uz;
+ float UyUz = Uy * Uz;
+
+ *Cx = (Ux2 + cosO * (1 - Ux2)) * Ax + (UxUy * one_cosO - Uz * sinO) * Ay + (UxUz * one_cosO + Uy * sinO) * Az;
+ *Cy = (UxUy * one_cosO + Uz * sinO) * Ax + (Uy2 + cosO * (1 - Uy2)) * Ay + (UyUz * one_cosO - Ux * sinO) * Az;
+ *Cz = (UxUz * one_cosO - Uy * sinO) * Ax + (UyUz * one_cosO + Ux * sinO) * Ay + (Uz2 + cosO * (1 - Uz2)) * Az;
+}
+
+#define MoebiusDivisions 40
+#define MoebiusTransversals 4
+static Bool
+draw_moebius_strip(ModeInfo * mi)
+{
+ GLfloat Phi, Theta;
+ GLfloat cPhi, sPhi;
+ moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+ int i, j;
+ int mono = MI_IS_MONO(mi);
+
+ float Cx, Cy, Cz;
+
+#ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ solidmoebius = True;
+#endif
+
+ if (solidmoebius) {
+ glBegin(GL_QUAD_STRIP);
+ Phi = 0;
+ i = 0;
+ while (i < (MoebiusDivisions * 2 + 1)) {
+ Theta = Phi / 2;
+ cPhi = cos(Phi);
+ sPhi = sin(Phi);
+
+ i++;
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ else if (i % 2)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+
+ RotateAaroundU(cPhi, sPhi, 0, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+ glNormal3f(Cx, Cy, Cz);
+ RotateAaroundU(0, 0, 1, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+ glVertex3f(cPhi * 3 + Cx, sPhi * 3 + Cy, +Cz);
+ glVertex3f(cPhi * 3 - Cx, sPhi * 3 - Cy, -Cz);
+
+ Phi += Pi / MoebiusDivisions;
+ }
+ glEnd();
+ } else {
+ for (j = -MoebiusTransversals; j < MoebiusTransversals; j++) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glBegin(GL_QUAD_STRIP);
+ Phi = 0;
+ i = 0;
+ while (i < (MoebiusDivisions * 2 + 1)) {
+ Theta = Phi / 2;
+ cPhi = cos(Phi);
+ sPhi = sin(Phi);
+
+ RotateAaroundU(cPhi, sPhi, 0, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+ glNormal3f(Cx, Cy, Cz);
+ RotateAaroundU(0, 0, 1, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+ j++;
+ if (j == MoebiusTransversals || mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ else if (i % 2)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+ glVertex3f(cPhi * 3 + Cx / MoebiusTransversals * j, sPhi * 3 + Cy / MoebiusTransversals * j, +Cz / MoebiusTransversals * j);
+ j--;
+ if (j == -MoebiusTransversals || mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ else if (i % 2)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+ glVertex3f(cPhi * 3 + Cx / MoebiusTransversals * j, sPhi * 3 + Cy / MoebiusTransversals * j, +Cz / MoebiusTransversals * j);
+
+ Phi += Pi / MoebiusDivisions;
+ i++;
+ }
+ glEnd();
+ }
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+
+ if (drawants) {
+ /* DRAW BLUE ANT */
+ glPushMatrix();
+ glRotatef(mp->ant_position + 180, 0, 0, 1);
+ glTranslatef(3, 0, 0);
+ glRotatef(mp->ant_position / 2 + 90, 0, 1, 0);
+ glTranslatef(0.28, 0, -0.45);
+ if (!draw_moebius_ant(mp, MaterialYellow, mono))
+ return False;
+ glPopMatrix();
+
+ /* DRAW YELLOW ANT */
+ glPushMatrix();
+ glRotatef(mp->ant_position, 0, 0, 1);
+ glTranslatef(3, 0, 0);
+ glRotatef(mp->ant_position / 2, 0, 1, 0);
+ glTranslatef(0.28, 0, -0.45);
+ if (!draw_moebius_ant(mp, MaterialBlue, mono))
+ return False;
+ glPopMatrix();
+
+ /* DRAW GREEN ANT */
+ glPushMatrix();
+ glRotatef(-mp->ant_position, 0, 0, 1);
+ glTranslatef(3, 0, 0);
+ glRotatef(-mp->ant_position / 2, 0, 1, 0);
+ glTranslatef(0.28, 0, 0.45);
+ glRotatef(180, 1, 0, 0);
+ if (!draw_moebius_ant(mp, MaterialGreen, mono))
+ return False;
+ glPopMatrix();
+
+ /* DRAW CYAN ANT */
+ glPushMatrix();
+ glRotatef(-mp->ant_position + 180, 0, 0, 1);
+ glTranslatef(3, 0, 0);
+ glRotatef(-mp->ant_position / 2 + 90, 0, 1, 0);
+ glTranslatef(0.28, 0, 0.45);
+ glRotatef(180, 1, 0, 0);
+ if (!draw_moebius_ant(mp, MaterialCyan, mono))
+ return False;
+ glPopMatrix();
+ }
+ mp->ant_position += 1;
+ return True;
+}
+#undef MoebiusDivisions
+#undef MoebiusTransversals
+
+ENTRYPOINT void
+reshape_moebius (ModeInfo * mi, int width, int height)
+{
+ moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+
+ glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+ glMatrixMode(GL_MODELVIEW);
+ if (width >= 1024) {
+ glLineWidth(3);
+ glPointSize(3);
+ } else if (width >= 512) {
+ glLineWidth(2);
+ glPointSize(2);
+ } else {
+ glLineWidth(1);
+ glPointSize(1);
+ }
+}
+
+static void
+pinit(ModeInfo *mi)
+{
+ /* int status; */
+ glClearDepth(1.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+ glCullFace(GL_BACK);
+
+ /* moebius */
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+
+#if 0
+ glEnable(GL_TEXTURE_2D);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+#if 0
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
+ WoodTextureWidth, WoodTextureHeight,
+ GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
+ if (status)
+ {
+ const char *s = (char *) gluErrorString (status);
+ fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
+ progname, WoodTextureWidth, WoodTextureHeight,
+ (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ {
+ XImage *img = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ wood_png, sizeof(wood_png));
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ img->width, img->height, 0,
+ GL_RGBA,
+ /* GL_UNSIGNED_BYTE, */
+ GL_UNSIGNED_INT_8_8_8_8_REV,
+ img->data);
+ check_gl_error("texture");
+ XDestroyImage (img);
+ }
+#endif
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+#endif
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+
+ENTRYPOINT Bool
+moebius_handle_event (ModeInfo *mi, XEvent *event)
+{
+ moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_moebius (ModeInfo * mi)
+{
+ moebiusstruct *mp;
+
+ MI_INIT (mi, moebius);
+ mp = &moebius[MI_SCREEN(mi)];
+ mp->step = NRAND(90);
+ mp->ant_position = NRAND(90);
+
+ {
+ double rot_speed = 0.3;
+ mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+ mp->trackball = gltrackball_init (True);
+ }
+
+ if ((mp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_moebius(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_moebius (ModeInfo * mi)
+{
+ moebiusstruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (moebius == NULL)
+ return;
+ mp = &moebius[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+
+ glTranslatef(0.0, 0.0, -10.0);
+
+ gltrackball_rotate (mp->trackball);
+
+ if (!MI_IS_ICONIC(mi)) {
+ glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window);
+ } else {
+ glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
+ }
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180) {
+ glScalef (1/h, h, 1); /* #### not quite right */
+ h = 1.7;
+ glScalef (h, h, h);
+ }
+ }
+# endif
+
+ {
+ double x, y, z;
+ get_rotation (mp->rot, &x, &y, &z, !mp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ /* moebius */
+ if (!draw_moebius_strip(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ mp->step += 0.025;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_moebius (ModeInfo * mi)
+{
+ moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("Moebius", moebius)
+
+#endif
diff --git a/hacks/glx/moebius.man b/hacks/glx/moebius.man
new file mode 100644
index 0000000..696e0d6
--- /dev/null
+++ b/hacks/glx/moebius.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+moebius - Escher's Moebuis Strip II, with ants.
+.SH SYNOPSIS
+.B moebius
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-solidmoebius]
+[-wireframe]
+[-noants]
+[-fps]
+.SH DESCRIPTION
+Another M. C. Escher hack by Marcelo Vianna, this one draws ``Moebius Strip
+II,'' a GL image of ants walking along the surface of a moebius strip.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-solidmoebius
+Solid Floor.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-noants | \-no-noants
+Draw Ants. Boolean.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Marcelo Vianna.
diff --git a/hacks/glx/moebiusgears.c b/hacks/glx/moebiusgears.c
new file mode 100644
index 0000000..0f058b8
--- /dev/null
+++ b/hacks/glx/moebiusgears.c
@@ -0,0 +1,437 @@
+/* moebiusgears, Copyright (c) 2007-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 17 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_mgears 0
+# define release_mgears 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "involute.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_ROLL "True"
+#define DEF_SPEED "1.0"
+#define DEF_TEETH "15"
+
+typedef struct {
+
+ gear g;
+ GLfloat pos_th; /* position on ring of gear system */
+ GLfloat pos_thz; /* rotation out of plane of gear system */
+} mogear;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int ngears;
+ mogear *gears;
+ GLfloat ring_r; /* radius of gear system */
+ GLfloat roll_th;
+
+} mgears_configuration;
+
+static mgears_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static Bool do_roll;
+static int teeth_arg;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-roll", ".roll", XrmoptionNoArg, "True" },
+ { "+roll", ".roll", XrmoptionNoArg, "False" },
+ { "-teeth", ".teeth", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_roll, "roll", "Roll", DEF_ROLL, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&teeth_arg, "teeth", "Teeth", DEF_TEETH, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt mgears_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_mgears (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+reset_mgears (ModeInfo *mi)
+{
+ mgears_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int total_gears = MI_COUNT(mi);
+ double gears_per_turn;
+ double gear_r, tw, th, thick, slope;
+ int i, nubs, size;
+
+ if (! (total_gears & 1))
+ total_gears++; /* must be odd or gears intersect */
+
+ /* Number of teeth must be odd if number of gears is odd, or teeth don't
+ mesh when the loop closes. And since number of gears must be odd...
+ */
+ if (! (teeth_arg & 1)) teeth_arg++;
+ if (teeth_arg < 7) teeth_arg = 7;
+
+ if (total_gears < 13) /* gear mesh angle is too steep with less */
+ total_gears = 13;
+
+ thick = 0.2;
+ nubs = (random() & 3) ? 0 : (random() % teeth_arg) / 2;
+
+ slope = 0;
+
+ /* Sloping gears are incompatible with "-roll" ... */
+ /* slope= -M_PI * 2 / total_gears; */
+
+ gears_per_turn = total_gears / 2.0;
+
+ bp->ring_r = 3;
+ gear_r = M_PI * bp->ring_r / gears_per_turn;
+ tw = 0;
+ th = gear_r * 2.5 / teeth_arg;
+
+ /* If the gears are small, use a lower density mesh. */
+ size = (gear_r > 0.60 ? INVOLUTE_HUGE :
+ gear_r > 0.32 ? INVOLUTE_LARGE :
+ gear_r > 0.13 ? INVOLUTE_MEDIUM :
+ INVOLUTE_SMALL);
+
+ /* If there are lots of teeth, use a lower density mesh. */
+ if (teeth_arg > 77)
+ size = INVOLUTE_SMALL;
+ if (teeth_arg > 45 && size >= INVOLUTE_HUGE)
+ size = INVOLUTE_MEDIUM;
+
+ if (bp->gears)
+ {
+ for (i = 0; i < bp->ngears; i++)
+ glDeleteLists (bp->gears[i].g.dlist, 1);
+ free (bp->gears);
+ bp->gears = 0;
+ }
+
+ bp->ngears = total_gears;
+
+ bp->gears = (mogear *) calloc (bp->ngears, sizeof(*bp->gears));
+ for (i = 0; i < bp->ngears; i++)
+ {
+ mogear *mg = &bp->gears[i];
+ gear *g = &mg->g;
+
+ g->r = gear_r;
+ g->size = size;
+ g->nteeth = teeth_arg;
+ g->tooth_w = tw;
+ g->tooth_h = th;
+ g->tooth_slope = slope;
+ g->thickness = g->r * thick;
+ g->thickness2 = g->thickness * 0.1;
+ g->thickness3 = g->thickness;
+ g->inner_r = g->r * 0.80;
+ g->inner_r2 = g->r * 0.60;
+ g->inner_r3 = g->r * 0.55;
+ g->nubs = nubs;
+ mg->pos_th = (M_PI * 2 / gears_per_turn) * i;
+ mg->pos_thz = (M_PI / 2 / gears_per_turn) * i;
+
+ g->th = ((i & 1)
+ ? (M_PI * 2 / g->nteeth)
+ : 0);
+
+ /* Colorize
+ */
+ g->color[0] = 0.7 + frand(0.3);
+ g->color[1] = 0.7 + frand(0.3);
+ g->color[2] = 0.7 + frand(0.3);
+ g->color[3] = 1.0;
+
+ g->color2[0] = g->color[0] * 0.85;
+ g->color2[1] = g->color[1] * 0.85;
+ g->color2[2] = g->color[2] * 0.85;
+ g->color2[3] = g->color[3];
+
+ /* Now render the gear into its display list.
+ */
+ g->dlist = glGenLists (1);
+ if (! g->dlist)
+ {
+ check_gl_error ("glGenLists");
+ abort();
+ }
+
+ glNewList (g->dlist, GL_COMPILE);
+ g->polygons += draw_involute_gear (g, wire);
+ glEndList ();
+ }
+}
+
+
+ENTRYPOINT void
+init_mgears (ModeInfo *mi)
+{
+ mgears_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_mgears (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.01;
+ double spin_accel = 2.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False /* don't randomize */
+ );
+ bp->trackball = gltrackball_init (True);
+ }
+
+ reset_mgears (mi);
+}
+
+
+ENTRYPOINT Bool
+mgears_handle_event (ModeInfo *mi, XEvent *event)
+{
+ mgears_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '+' || c == '=' ||
+ keysym == XK_Up || keysym == XK_Right || keysym == XK_Next)
+ {
+ MI_COUNT(mi) += 2;
+ reset_mgears (mi);
+ return True;
+ }
+ else if (c == '-' || c == '_' ||
+ keysym == XK_Down || keysym == XK_Left || keysym == XK_Prior)
+ {
+ if (MI_COUNT(mi) <= 13)
+ return False;
+ MI_COUNT(mi) -= 2;
+ reset_mgears (mi);
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ MI_COUNT(mi) = 13 + (2 * (random() % 10));
+ reset_mgears (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_mgears (ModeInfo *mi)
+{
+ mgears_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef ((x - 0.5) * 4,
+ (y - 0.5) * 4,
+ (z - 0.5) * 7);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+ /* add a little rotation for -no-spin mode */
+ x -= 0.14;
+ y -= 0.06;
+
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (1.5, 1.5, 1.5);
+
+/*#define DEBUG*/
+
+#ifdef DEBUG
+ glScalef (.5, .5, .5);
+ glTranslatef (0, -bp->gears[0].g.r * bp->ngears, 0);
+#endif
+
+ for (i = 0; i < bp->ngears; i++)
+ {
+ mogear *mg = &bp->gears[i];
+ gear *g = &mg->g;
+
+ glPushMatrix();
+#ifndef DEBUG
+ glRotatef (mg->pos_th * 180 / M_PI, 0, 0, 1); /* rotation on ring */
+ glTranslatef (bp->ring_r, 0, 0); /* position on ring */
+ glRotatef (mg->pos_thz * 180 / M_PI, 0, 1, 0); /* twist a bit */
+
+ if (do_roll)
+ {
+ glRotatef (bp->roll_th * 180 / M_PI, 0, 1, 0);
+ bp->roll_th += speed * 0.0005;
+ }
+#else
+ glTranslatef (0, i * 2 * g->r, 0);
+#endif
+ glRotatef (g->th * 180 / M_PI, 0, 0, 1);
+
+ glCallList (g->dlist);
+ mi->polygon_count += g->polygons;
+ glPopMatrix ();
+ }
+
+ glPopMatrix ();
+
+#ifndef DEBUG
+ /* spin gears */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ mogear *mg = &bp->gears[i];
+ mg->g.th += speed * (M_PI / 100) * (i & 1 ? 1 : -1);
+ }
+#endif
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("MoebiusGears", moebiusgears, mgears)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/moebiusgears.man b/hacks/glx/moebiusgears.man
new file mode 100644
index 0000000..a45519a
--- /dev/null
+++ b/hacks/glx/moebiusgears.man
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+moebiusgears - draw a moebius strip of interlocking gears.
+.SH SYNOPSIS
+.B moebiusgears
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIfloat\fP]
+[\-no\-spin]
+[\-no\-wander]
+[\-no\-roll]
+[-count \fIinteger\fP]
+[-teeth \fIinteger\fP]
+[-wireframe]
+[-fps]
+.SH DESCRIPTION
+The \fImoebiusgears\fP program draws a closed, interlinked chain of
+rotating gears. The layout of the gears follows the path of a
+moebius strip.
+.SH OPTIONS
+.I moebiusgears
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds.
+Default: 30000 (0.03 seconds.)
+.TP 8
+.B \-speed \fIfloat\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-no\-spin
+Don't rotate the object.
+.TP 8
+.B \-no\-wander
+Don't wander the object around the screen.
+.TP 8
+.B \-no\-roll
+Don't slowly roll the moebius strip inside out.
+.TP 8
+.B \-count \fIinteger\fP
+How many gears to draw. Default: 17. Minimum 11, must be odd.
+.TP 8
+.B \-teeth \fIinteger\fP
+How many teeth to draw on each draw. Default: 15. Minimum 7, must be odd.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/molecule.c b/hacks/glx/molecule.c
new file mode 100644
index 0000000..d8bc1d8
--- /dev/null
+++ b/hacks/glx/molecule.c
@@ -0,0 +1,1682 @@
+/* molecule, Copyright (c) 2001-2016 Jamie Zawinski <jwz@jwz.org>
+ * Draws molecules, based on coordinates from PDB (Protein Data Base) files.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+
+/* Documentation on the PDB file format:
+ https://en.wikipedia.org/wiki/Protein_Data_Bank_%28file_format%29
+ http://www.wwpdb.org/docs.html
+ http://www.wwpdb.org/documentation/format32/v3.2.html
+ http://www.wwpdb.org/documentation/format32/sect9.html
+ http://www.rcsb.org/pdb/file_formats/pdb/pdbguide2.2/guide2.2_frame.html
+
+ Good source of PDB files:
+ http://www.sci.ouc.bc.ca/chem/molecule/molecule.html
+ http://www.umass.edu/microbio/rasmol/whereget.htm
+ http://www.wwpdb.org/docs.html
+ */
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*atomFont: -*-helvetica-medium-r-normal-*-*-240-*-*-*-*-*-*\n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*noLabelThreshold: 150 \n" \
+ "*wireframeThreshold: 150 \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_molecule 0
+# define release_molecule 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "tube.h"
+#include "texfont.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+#ifdef USE_GL /* whole file */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <ctype.h>
+
+#define DEF_TIMEOUT "20"
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "False"
+#define DEF_LABELS "True"
+#define DEF_TITLES "True"
+#define DEF_ATOMS "True"
+#define DEF_BONDS "True"
+#define DEF_ESHELLS "True"
+#define DEF_BBOX "False"
+#define DEF_SHELL_ALPHA "0.3"
+#define DEF_MOLECULE "(default)"
+#define DEF_VERBOSE "False"
+
+#define SPHERE_SLICES 48 /* how densely to render spheres */
+#define SPHERE_STACKS 24
+
+#define SMOOTH_TUBE /* whether to have smooth or faceted tubes */
+
+#ifdef SMOOTH_TUBE
+# define TUBE_FACES 12 /* how densely to render tubes */
+#else
+# define TUBE_FACES 8
+#endif
+
+#define SPHERE_SLICES_2 14
+#define SPHERE_STACKS_2 8
+#define TUBE_FACES_2 6
+
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the length
+ ISO C89 compilers are required to support" when includng
+ the following data file... */
+# endif
+static const char * const builtin_pdb_data[] = {
+# include "molecules.h"
+};
+
+
+#ifndef HAVE_MOBILE
+# define LOAD_FILES
+#endif
+
+
+typedef struct {
+ const char *name;
+ GLfloat size, size2;
+ const char *color;
+ const char *text_color;
+ GLfloat gl_color[8];
+} atom_data;
+
+
+/* These are the traditional colors used to render these atoms,
+ and their approximate size in angstroms.
+ */
+static const atom_data all_atom_data[] = {
+ { "H", 1.17, 0.40, "#FFFFFF", "#000000", { 0, }},
+ { "C", 1.75, 0.58, "#999999", "#FFFFFF", { 0, }},
+ { "CA", 1.80, 0.60, "#0000FF", "#ADD8E6", { 0, }},
+ { "N", 1.55, 0.52, "#A2B5CD", "#EE99FF", { 0, }},
+ { "O", 1.40, 0.47, "#FF0000", "#FFB6C1", { 0, }},
+ { "P", 1.28, 0.43, "#9370DB", "#DB7093", { 0, }},
+ { "S", 1.80, 0.60, "#8B8B00", "#FFFF00", { 0, }},
+ { "bond", 0, 0, "#B3B3B3", "#FFFF00", { 0, }},
+ { "*", 1.40, 0.47, "#008B00", "#90EE90", { 0, }}
+};
+
+
+typedef struct {
+ int id; /* sequence number in the PDB file */
+ const char *label; /* The atom name */
+ GLfloat x, y, z; /* position in 3-space (angstroms) */
+ const atom_data *data; /* computed: which style of atom this is */
+} molecule_atom;
+
+typedef struct {
+ int from, to; /* atom sequence numbers */
+ int strength; /* how many bonds are between these two atoms */
+} molecule_bond;
+
+
+typedef struct {
+ const char *label; /* description of this compound */
+ int natoms, atoms_size;
+ int nbonds, bonds_size;
+ molecule_atom *atoms;
+ molecule_bond *bonds;
+} molecule;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat molecule_size; /* max dimension of molecule bounding box */
+
+ GLfloat no_label_threshold; /* Things happen when molecules are huge */
+ GLfloat wireframe_threshold;
+
+ int which; /* which of the molecules is being shown */
+ int nmolecules;
+ molecule *molecules;
+
+ int mode; /* 0 = normal, 1 = out, 2 = in */
+ int mode_tick;
+ int next; /* 0 = random, -1 = back, 1 = forward */
+
+ GLuint molecule_dlist;
+ GLuint shell_dlist;
+
+ texture_font_data *atom_font, *title_font;
+
+ int polygon_count;
+
+ time_t draw_time;
+ int draw_tick;
+
+ GLfloat overall_scale;
+ int low_rez_p;
+
+} molecule_configuration;
+
+
+static molecule_configuration *mcs = NULL;
+
+static int timeout;
+static char *molecule_str;
+static char *do_spin;
+static Bool do_wander;
+static Bool do_titles;
+static Bool do_labels;
+static Bool do_atoms;
+static Bool do_bonds;
+static Bool do_shells;
+static Bool do_bbox;
+static Bool verbose_p;
+static GLfloat shell_alpha;
+
+/* saved to reset */
+static Bool orig_do_labels, orig_do_atoms, orig_do_bonds, orig_do_shells,
+ orig_wire;
+
+
+static XrmOptionDescRec opts[] = {
+ { "-molecule", ".molecule", XrmoptionSepArg, 0 },
+ { "-timeout", ".timeout", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-labels", ".labels", XrmoptionNoArg, "True" },
+ { "+labels", ".labels", XrmoptionNoArg, "False" },
+ { "-titles", ".titles", XrmoptionNoArg, "True" },
+ { "+titles", ".titles", XrmoptionNoArg, "False" },
+ { "-atoms", ".atoms", XrmoptionNoArg, "True" },
+ { "+atoms", ".atoms", XrmoptionNoArg, "False" },
+ { "-bonds", ".bonds", XrmoptionNoArg, "True" },
+ { "+bonds", ".bonds", XrmoptionNoArg, "False" },
+ { "-shells", ".eshells", XrmoptionNoArg, "True" },
+ { "+shells", ".eshells", XrmoptionNoArg, "False" },
+ { "-shell-alpha", ".shellAlpha", XrmoptionSepArg, 0 },
+ { "-bbox", ".bbox", XrmoptionNoArg, "True" },
+ { "+bbox", ".bbox", XrmoptionNoArg, "False" },
+ { "-verbose", ".verbose", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ {&molecule_str, "molecule", "Molecule", DEF_MOLECULE, t_String},
+ {&timeout, "timeout", "Seconds", DEF_TIMEOUT, t_Int},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_atoms, "atoms", "Atoms", DEF_ATOMS, t_Bool},
+ {&do_bonds, "bonds", "Bonds", DEF_BONDS, t_Bool},
+ {&do_shells, "eshells", "EShells", DEF_ESHELLS, t_Bool},
+ {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
+ {&do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+ {&do_bbox, "bbox", "BBox", DEF_BBOX, t_Bool},
+ {&shell_alpha, "shellAlpha", "ShellAlpha", DEF_SHELL_ALPHA, t_Float},
+ {&verbose_p, "verbose", "Verbose", DEF_VERBOSE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt molecule_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+
+/* shapes */
+
+static int
+sphere (molecule_configuration *mc,
+ GLfloat x, GLfloat y, GLfloat z, GLfloat diameter, Bool wire)
+{
+ int stacks = (mc->low_rez_p ? SPHERE_STACKS_2 : SPHERE_STACKS);
+ int slices = (mc->low_rez_p ? SPHERE_SLICES_2 : SPHERE_SLICES);
+
+ glPushMatrix ();
+ glTranslatef (x, y, z);
+ glScalef (diameter, diameter, diameter);
+ unit_sphere (stacks, slices, wire);
+ glPopMatrix ();
+
+ return stacks * slices;
+}
+
+
+static void
+load_fonts (ModeInfo *mi)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+ mc->atom_font = load_texture_font (mi->dpy, "atomFont");
+ mc->title_font = load_texture_font (mi->dpy, "titleFont");
+}
+
+
+static const atom_data *
+get_atom_data (const char *atom_name)
+{
+ int i;
+ const atom_data *d = 0;
+ char *n = strdup (atom_name);
+ char *n2 = n;
+ int L;
+
+ while (!isalpha(*n)) n++;
+ L = strlen(n);
+ while (L > 0 && !isalpha(n[L-1]))
+ n[--L] = 0;
+
+ for (i = 0; i < countof(all_atom_data); i++)
+ {
+ d = &all_atom_data[i];
+ if (!strcasecmp (n, all_atom_data[i].name))
+ break;
+ }
+
+ free (n2);
+ return d;
+}
+
+
+static void
+set_atom_color (ModeInfo *mi, const molecule_atom *a,
+ Bool font_p, GLfloat alpha)
+{
+ const atom_data *d;
+ GLfloat gl_color[4];
+
+ if (a)
+ d = a->data;
+ else
+ d = get_atom_data ("bond");
+
+ if (font_p)
+ {
+ gl_color[0] = d->gl_color[4];
+ gl_color[1] = d->gl_color[5];
+ gl_color[2] = d->gl_color[6];
+ gl_color[3] = d->gl_color[7];
+ }
+ else
+ {
+ gl_color[0] = d->gl_color[0];
+ gl_color[1] = d->gl_color[1];
+ gl_color[2] = d->gl_color[2];
+ gl_color[3] = d->gl_color[3];
+ }
+
+ if (gl_color[3] == 0)
+ {
+ const char *string = !font_p ? d->color : d->text_color;
+ XColor xcolor;
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ (a ? a->label : d->name), string);
+ exit (1);
+ }
+
+ gl_color[0] = xcolor.red / 65536.0;
+ gl_color[1] = xcolor.green / 65536.0;
+ gl_color[2] = xcolor.blue / 65536.0;
+ }
+
+ gl_color[3] = alpha;
+
+ /* If we're not drawing atoms, and the color is black, use white instead.
+ This is a kludge so that H can have black text over its white ball,
+ but the text still shows up if balls are off.
+ */
+ if (font_p && !do_atoms &&
+ gl_color[0] == 0 && gl_color[1] == 0 && gl_color[2] == 0)
+ {
+ gl_color[0] = gl_color[1] = gl_color[2] = 1;
+ }
+
+ if (font_p)
+ glColor4f (gl_color[0], gl_color[1], gl_color[2], gl_color[3]);
+ else
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gl_color);
+}
+
+
+static GLfloat
+atom_size (const molecule_atom *a)
+{
+ if (do_bonds)
+ return a->data->size2;
+ else
+ return a->data->size;
+}
+
+
+static molecule_atom *
+get_atom (molecule_atom *atoms, int natoms, int id)
+{
+ int i;
+
+ /* quick short-circuit */
+ if (id < natoms)
+ {
+ if (atoms[id].id == id)
+ return &atoms[id];
+ if (id > 0 && atoms[id-1].id == id)
+ return &atoms[id-1];
+ if (id < natoms-1 && atoms[id+1].id == id)
+ return &atoms[id+1];
+ }
+
+ for (i = 0; i < natoms; i++)
+ if (id == atoms[i].id)
+ return &atoms[i];
+
+ fprintf (stderr, "%s: no atom %d\n", progname, id);
+ abort();
+}
+
+
+static void
+molecule_bounding_box (ModeInfo *mi,
+ GLfloat *x1, GLfloat *y1, GLfloat *z1,
+ GLfloat *x2, GLfloat *y2, GLfloat *z2)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+ molecule *m = &mc->molecules[mc->which];
+ int i;
+
+ if (m->natoms == 0)
+ {
+ *x1 = *y1 = *z1 = *x2 = *y2 = *z2 = 0;
+ }
+ else
+ {
+ *x1 = *x2 = m->atoms[0].x;
+ *y1 = *y2 = m->atoms[0].y;
+ *z1 = *z2 = m->atoms[0].z;
+ }
+
+ for (i = 1; i < m->natoms; i++)
+ {
+ if (m->atoms[i].x < *x1) *x1 = m->atoms[i].x;
+ if (m->atoms[i].y < *y1) *y1 = m->atoms[i].y;
+ if (m->atoms[i].z < *z1) *z1 = m->atoms[i].z;
+
+ if (m->atoms[i].x > *x2) *x2 = m->atoms[i].x;
+ if (m->atoms[i].y > *y2) *y2 = m->atoms[i].y;
+ if (m->atoms[i].z > *z2) *z2 = m->atoms[i].z;
+ }
+
+ *x1 -= 1.5;
+ *y1 -= 1.5;
+ *z1 -= 1.5;
+ *x2 += 1.5;
+ *y2 += 1.5;
+ *z2 += 1.5;
+}
+
+
+static void
+draw_bounding_box (ModeInfo *mi)
+{
+ static const GLfloat c1[4] = { 0.2, 0.2, 0.4, 1.0 };
+ static const GLfloat c2[4] = { 1.0, 0.0, 0.0, 1.0 };
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat x1, y1, z1, x2, y2, z2;
+ molecule_bounding_box (mi, &x1, &y1, &z1, &x2, &y2, &z2);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c1);
+ glFrontFace(GL_CCW);
+
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 1, 0);
+ glVertex3f(x1, y1, z1); glVertex3f(x1, y1, z2);
+ glVertex3f(x2, y1, z2); glVertex3f(x2, y1, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, -1, 0);
+ glVertex3f(x2, y2, z1); glVertex3f(x2, y2, z2);
+ glVertex3f(x1, y2, z2); glVertex3f(x1, y2, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glVertex3f(x1, y1, z1); glVertex3f(x2, y1, z1);
+ glVertex3f(x2, y2, z1); glVertex3f(x1, y2, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 0, -1);
+ glVertex3f(x1, y2, z2); glVertex3f(x2, y2, z2);
+ glVertex3f(x2, y1, z2); glVertex3f(x1, y1, z2);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(1, 0, 0);
+ glVertex3f(x1, y2, z1); glVertex3f(x1, y2, z2);
+ glVertex3f(x1, y1, z2); glVertex3f(x1, y1, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(-1, 0, 0);
+ glVertex3f(x2, y1, z1); glVertex3f(x2, y1, z2);
+ glVertex3f(x2, y2, z2); glVertex3f(x2, y2, z1);
+ glEnd();
+
+ glDisable (GL_LIGHTING);
+
+ glColor3f (c2[0], c2[1], c2[2]);
+ glBegin(GL_LINES);
+ if (x1 > 0) x1 = 0;
+ if (x2 < 0) x2 = 0;
+ if (y1 > 0) y1 = 0;
+ if (y2 < 0) y2 = 0;
+ if (z1 > 0) z1 = 0;
+ if (z2 < 0) z2 = 0;
+ glVertex3f(x1, 0, 0); glVertex3f(x2, 0, 0);
+ glVertex3f(0 , y1, 0); glVertex3f(0, y2, 0);
+ glVertex3f(0, 0, z1); glVertex3f(0, 0, z2);
+ glEnd();
+
+ if (!wire)
+ glEnable (GL_LIGHTING);
+}
+
+
+/* Since PDB files don't always have the molecule centered around the
+ origin, and since some molecules are pretty large, scale and/or
+ translate so that the whole molecule is visible in the window.
+ */
+static void
+ensure_bounding_box_visible (ModeInfo *mi)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+
+ GLfloat x1, y1, z1, x2, y2, z2;
+ GLfloat w, h, d;
+ GLfloat size;
+ GLfloat max_size = 10; /* don't bother scaling down if the molecule
+ is already smaller than this */
+
+ molecule_bounding_box (mi, &x1, &y1, &z1, &x2, &y2, &z2);
+ w = x2-x1;
+ h = y2-y1;
+ d = z2-z1;
+
+ size = (w > h ? w : h);
+ size = (size > d ? size : d);
+
+ mc->molecule_size = size;
+
+ mc->low_rez_p = 0;
+ mc->overall_scale = 1;
+
+ if (size > max_size)
+ {
+ mc->overall_scale = max_size / size;
+ glScalef (mc->overall_scale, mc->overall_scale, mc->overall_scale);
+
+ mc->low_rez_p = mc->overall_scale < 0.3;
+ }
+
+ glTranslatef (-(x1 + w/2),
+ -(y1 + h/2),
+ -(z1 + d/2));
+}
+
+
+
+/* Constructs the GL shapes of the current molecule
+ */
+static void
+build_molecule (ModeInfo *mi, Bool transparent_p)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ GLfloat alpha = transparent_p ? shell_alpha : 1.0;
+ int polys = 0;
+
+ molecule *m = &mc->molecules[mc->which];
+
+ if (wire)
+ {
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_NORMALIZE);
+ glDisable(GL_CULL_FACE);
+ }
+ else
+ {
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ }
+
+ if (!wire)
+ set_atom_color (mi, 0, False, alpha);
+
+ if (do_bonds)
+ for (i = 0; i < m->nbonds; i++)
+ {
+ const molecule_bond *b = &m->bonds[i];
+ const molecule_atom *from = get_atom (m->atoms, m->natoms, b->from);
+ const molecule_atom *to = get_atom (m->atoms, m->natoms, b->to);
+
+ if (wire)
+ {
+ glBegin(GL_LINES);
+ glVertex3f(from->x, from->y, from->z);
+ glVertex3f(to->x, to->y, to->z);
+ glEnd();
+ polys++;
+ }
+ else
+ {
+ int faces = (mc->low_rez_p ? TUBE_FACES_2 : TUBE_FACES);
+# ifdef SMOOTH_TUBE
+ int smooth = True;
+# else
+ int smooth = False;
+# endif
+ Bool cap_p = (!do_atoms || do_shells);
+ GLfloat base = 0.07;
+ GLfloat thickness = base * b->strength;
+ GLfloat cap_size = (cap_p ? base / 2 : 0);
+ if (thickness > 0.3)
+ thickness = 0.3;
+
+ polys += tube (from->x, from->y, from->z,
+ to->x, to->y, to->z,
+ thickness, cap_size,
+ faces, smooth, cap_p, wire);
+ }
+ }
+
+ if (!wire && do_atoms)
+ for (i = 0; i < m->natoms; i++)
+ {
+ const molecule_atom *a = &m->atoms[i];
+ GLfloat size = atom_size (a);
+ set_atom_color (mi, a, False, alpha);
+ polys += sphere (mc, a->x, a->y, a->z, size, wire);
+ }
+
+ if (do_bbox && !transparent_p)
+ {
+ draw_bounding_box (mi);
+ polys += 4;
+ }
+
+ mc->polygon_count += polys;
+}
+
+
+
+/* loading */
+
+static void
+push_atom (molecule *m,
+ int id, const char *label,
+ GLfloat x, GLfloat y, GLfloat z)
+{
+ m->natoms++;
+ if (m->atoms_size < m->natoms)
+ {
+ m->atoms_size += 20;
+ m->atoms = (molecule_atom *) realloc (m->atoms,
+ m->atoms_size * sizeof(*m->atoms));
+ }
+ m->atoms[m->natoms-1].id = id;
+ m->atoms[m->natoms-1].label = label;
+ m->atoms[m->natoms-1].x = x;
+ m->atoms[m->natoms-1].y = y;
+ m->atoms[m->natoms-1].z = z;
+ m->atoms[m->natoms-1].data = get_atom_data (label);
+}
+
+
+static void
+push_bond (molecule *m, int from, int to)
+{
+ int i;
+
+ for (i = 0; i < m->nbonds; i++)
+ if ((m->bonds[i].from == from && m->bonds[i].to == to) ||
+ (m->bonds[i].to == from && m->bonds[i].from == to))
+ {
+ m->bonds[i].strength++;
+ return;
+ }
+
+ m->nbonds++;
+ if (m->bonds_size < m->nbonds)
+ {
+ m->bonds_size += 20;
+ m->bonds = (molecule_bond *) realloc (m->bonds,
+ m->bonds_size * sizeof(*m->bonds));
+ }
+ m->bonds[m->nbonds-1].from = from;
+ m->bonds[m->nbonds-1].to = to;
+ m->bonds[m->nbonds-1].strength = 1;
+}
+
+
+static void
+parse_error (const char *file, int lineno, const char *line)
+{
+ fprintf (stderr, "%s: %s: parse error, line %d: %s\n",
+ progname, file, lineno, line);
+ exit (1);
+}
+
+
+/* This function is crap.
+ */
+static void
+parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
+{
+ const char *s = data;
+ char *ss;
+ while (*s)
+ {
+ if ((!m->label || !*m->label) &&
+ (!strncmp (s, "HEADER", 6) || !strncmp (s, "COMPND", 6)))
+ {
+ char *name = calloc (1, 100);
+ char *n2 = name;
+ int L = strlen(s);
+ if (L > 99) L = 99;
+
+ strncpy (n2, s, L);
+ n2 += 7;
+ while (isspace(*n2)) n2++;
+
+ ss = strchr (n2, '\n');
+ if (ss) *ss = 0;
+ ss = strchr (n2, '\r');
+ if (ss) *ss = 0;
+
+ ss = n2+strlen(n2)-1;
+ while (isspace(*ss) && ss > n2)
+ *ss-- = 0;
+
+ if (strlen (n2) > 4 &&
+ !strcmp (n2 + strlen(n2) - 4, ".pdb"))
+ n2[strlen(n2)-4] = 0;
+
+ if (m->label) free ((char *) m->label);
+ m->label = strdup (n2);
+ free (name);
+ }
+ else if (!strncmp (s, "TITLE ", 6) ||
+ !strncmp (s, "HEADER", 6) ||
+ !strncmp (s, "COMPND", 6) ||
+ !strncmp (s, "AUTHOR", 6) ||
+ !strncmp (s, "REVDAT", 6) ||
+ !strncmp (s, "SOURCE", 6) ||
+ !strncmp (s, "EXPDTA", 6) ||
+ !strncmp (s, "JRNL ", 6) ||
+ !strncmp (s, "REMARK", 6) ||
+ !strncmp (s, "SEQRES", 6) ||
+ !strncmp (s, "HET ", 6) ||
+ !strncmp (s, "FORMUL", 6) ||
+ !strncmp (s, "CRYST1", 6) ||
+ !strncmp (s, "ORIGX1", 6) ||
+ !strncmp (s, "ORIGX2", 6) ||
+ !strncmp (s, "ORIGX3", 6) ||
+ !strncmp (s, "SCALE1", 6) ||
+ !strncmp (s, "SCALE2", 6) ||
+ !strncmp (s, "SCALE3", 6) ||
+ !strncmp (s, "MASTER", 6) ||
+ !strncmp (s, "KEYWDS", 6) ||
+ !strncmp (s, "DBREF ", 6) ||
+ !strncmp (s, "HETNAM", 6) ||
+ !strncmp (s, "HETSYN", 6) ||
+ !strncmp (s, "HELIX ", 6) ||
+ !strncmp (s, "LINK ", 6) ||
+ !strncmp (s, "MTRIX1", 6) ||
+ !strncmp (s, "MTRIX2", 6) ||
+ !strncmp (s, "MTRIX3", 6) ||
+ !strncmp (s, "SHEET ", 6) ||
+ !strncmp (s, "CISPEP", 6) ||
+/*
+ !strncmp (s, "SEQADV", 6) ||
+ !strncmp (s, "SITE ", 5) ||
+ !strncmp (s, "FTNOTE", 6) ||
+ !strncmp (s, "MODEL ", 5) ||
+ !strncmp (s, "ENDMDL", 6) ||
+ !strncmp (s, "SPRSDE", 6) ||
+ !strncmp (s, "MODRES", 6) ||
+ */
+ !strncmp (s, "GENERATED BY", 12) ||
+ !strncmp (s, "TER ", 4) ||
+ !strncmp (s, "END ", 4) ||
+ !strncmp (s, "TER\n", 4) ||
+ !strncmp (s, "END\n", 4) ||
+ !strncmp (s, "\n", 1))
+ /* ignored. */
+ ;
+ else if (!strncmp (s, "ATOM ", 7))
+ {
+ int id;
+ const char *end = strchr (s, '\n');
+ int L = end - s;
+ char *name = (char *) calloc (1, 4);
+ GLfloat x = -999, y = -999, z = -999;
+
+ if (1 != sscanf (s+7, " %d ", &id))
+ parse_error (filename, line, s);
+
+ /* Use the "atom name" field if that is all that is available. */
+ strncpy (name, s+12, 3);
+
+ /* But prefer the "element" field. */
+ if (L > 77 && !isspace(s[77])) {
+ /* fprintf(stderr, " \"%s\" -> ", name); */
+ name[0] = s[76];
+ name[1] = s[77];
+ name[2] = 0;
+ /* fprintf(stderr, "\"%s\"\n", name); */
+ }
+
+ while (isspace(*name)) name++;
+ ss = name + strlen(name)-1;
+ while (isspace(*ss) && ss > name)
+ *ss-- = 0;
+ ss = name + 1;
+ while(*ss)
+ {
+ *ss = tolower(*ss);
+ ss++;
+ }
+ if (3 != sscanf (s + 32, " %f %f %f ", &x, &y, &z))
+ parse_error (filename, line, s);
+
+/*
+ fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
+ progname, filename, line,
+ id, name, x, y, z);
+*/
+ push_atom (m, id, name, x, y, z);
+ }
+ else if (!strncmp (s, "HETATM ", 7))
+ {
+ int id;
+ char *name = (char *) calloc (1, 4);
+ GLfloat x = -999, y = -999, z = -999;
+
+ if (1 != sscanf (s+7, " %d ", &id))
+ parse_error (filename, line, s);
+
+ strncpy (name, s+12, 3);
+ while (isspace(*name)) name++;
+ ss = name + strlen(name)-1;
+ while (isspace(*ss) && ss > name)
+ *ss-- = 0;
+ if (3 != sscanf (s + 30, " %f %f %f ", &x, &y, &z))
+ parse_error (filename, line, s);
+/*
+ fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
+ progname, filename, line,
+ id, name, x, y, z);
+*/
+ push_atom (m, id, name, x, y, z);
+ }
+ else if (!strncmp (s, "CONECT ", 7))
+ {
+ int atoms[11];
+ int i = sscanf (s + 8, " %d %d %d %d %d %d %d %d %d %d %d %d ",
+ &atoms[0], &atoms[1], &atoms[2], &atoms[3],
+ &atoms[4], &atoms[5], &atoms[6], &atoms[7],
+ &atoms[8], &atoms[9], &atoms[10], &atoms[11]);
+ int j;
+ for (j = 1; j < i; j++)
+ if (atoms[j] > 0)
+ {
+/*
+ fprintf (stderr, "%s: %s: %d: bond: %d %d\n",
+ progname, filename, line, atoms[0], atoms[j]);
+*/
+ push_bond (m, atoms[0], atoms[j]);
+ }
+ }
+ else
+ {
+ char *s1 = strdup (s);
+ for (ss = s1; *ss && *ss != '\n'; ss++)
+ ;
+ *ss = 0;
+ fprintf (stderr, "%s: %s: %d: unrecognised line: %s\n",
+ progname, filename, line, s1);
+ }
+
+ while (*s && *s != '\n')
+ s++;
+ if (*s == '\n')
+ s++;
+ line++;
+ }
+}
+
+
+#ifdef LOAD_FILES
+static int
+parse_pdb_file (molecule *m, const char *name)
+{
+ FILE *in;
+ int buf_size = 40960;
+ char *buf;
+ int line = 1;
+
+ in = fopen(name, "r");
+ if (!in)
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf(buf, "%s: error reading \"%s\"", progname, name);
+ perror(buf);
+ return -1;
+ }
+
+ buf = (char *) malloc (buf_size);
+
+ while (fgets (buf, buf_size-1, in))
+ {
+ char *s;
+ for (s = buf; *s; s++)
+ if (*s == '\r') *s = '\n';
+ parse_pdb_data (m, buf, name, line++);
+ }
+
+ free (buf);
+ fclose (in);
+
+ if (!m->natoms)
+ {
+ fprintf (stderr, "%s: file %s contains no atomic coordinates!\n",
+ progname, name);
+ return -1;
+ }
+
+ if (!m->nbonds && do_bonds)
+ {
+ fprintf (stderr, "%s: warning: file %s contains no atomic bond info.\n",
+ progname, name);
+ do_bonds = 0;
+ }
+
+ return 0;
+}
+#endif /* LOAD_FILES */
+
+
+typedef struct { char *atom; int count; } atom_and_count;
+
+/* When listing the components of a molecule, the convention is to put the
+ carbon atoms first, the hydrogen atoms second, and the other atom types
+ sorted alphabetically after that (although for some molecules, the usual
+ order is different: we special-case a few of those.)
+ */
+static int
+cmp_atoms (const void *aa, const void *bb)
+{
+ const atom_and_count *a = (atom_and_count *) aa;
+ const atom_and_count *b = (atom_and_count *) bb;
+ if (!a->atom) return 1;
+ if (!b->atom) return -1;
+ if (!strcmp(a->atom, "C")) return -1;
+ if (!strcmp(b->atom, "C")) return 1;
+ if (!strcmp(a->atom, "H")) return -1;
+ if (!strcmp(b->atom, "H")) return 1;
+ return strcmp (a->atom, b->atom);
+}
+
+static void special_case_formula (char *f);
+
+static void
+generate_molecule_formula (molecule *m)
+{
+ char *buf = (char *) malloc (m->natoms * 10);
+ char *s = buf;
+ int i;
+ atom_and_count counts[200];
+ memset (counts, 0, sizeof(counts));
+ *s = 0;
+ for (i = 0; i < m->natoms; i++)
+ {
+ int j = 0;
+ char *a = (char *) m->atoms[i].label;
+ char *e;
+ while (!isalpha(*a)) a++;
+ a = strdup (a);
+ for (e = a; isalpha(*e); e++);
+ *e = 0;
+ while (counts[j].atom && !!strcmp(a, counts[j].atom))
+ j++;
+ if (counts[j].atom)
+ free (a);
+ else
+ counts[j].atom = a;
+ counts[j].count++;
+ }
+
+ i = 0;
+ while (counts[i].atom) i++;
+ qsort (counts, i, sizeof(*counts), cmp_atoms);
+
+ i = 0;
+ while (counts[i].atom)
+ {
+ strcat (s, counts[i].atom);
+ free (counts[i].atom);
+ s += strlen (s);
+ if (counts[i].count > 1)
+ sprintf (s, "[%d]", counts[i].count); /* use [] to get subscripts */
+ s += strlen (s);
+ i++;
+ }
+
+ special_case_formula (buf);
+
+ if (!m->label) m->label = strdup("");
+ s = (char *) malloc (strlen (m->label) + strlen (buf) + 2);
+ strcpy (s, m->label);
+ strcat (s, "\n");
+ strcat (s, buf);
+ free ((char *) m->label);
+ free (buf);
+ m->label = s;
+}
+
+/* thanks to Rene Uittenbogaard <ruittenb@wish.nl> */
+static void
+special_case_formula (char *f)
+{
+ if (!strcmp(f, "H[2]Be")) strcpy(f, "BeH[2]");
+ else if (!strcmp(f, "H[3]B")) strcpy(f, "BH[3]");
+ else if (!strcmp(f, "H[3]N")) strcpy(f, "NH[3]");
+ else if (!strcmp(f, "CHN")) strcpy(f, "HCN");
+ else if (!strcmp(f, "CKN")) strcpy(f, "KCN");
+ else if (!strcmp(f, "H[4]N[2]")) strcpy(f, "N[2]H[4]");
+ else if (!strcmp(f, "Cl[3]P")) strcpy(f, "PCl[3]");
+ else if (!strcmp(f, "Cl[5]P")) strcpy(f, "PCl[5]");
+}
+
+
+static void
+insert_vertical_whitespace (char *string)
+{
+ while (*string)
+ {
+ if ((string[0] == ',' ||
+ string[0] == ';' ||
+ string[0] == ':') &&
+ string[1] == ' ')
+ string[0] = ' ', string[1] = '\n';
+ string++;
+ }
+}
+
+
+/* Construct the molecule data from either: the builtins; or from
+ the (one) .pdb file specified with -molecule.
+ */
+static void
+load_molecules (ModeInfo *mi)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+ int i;
+
+ mc->nmolecules = 0;
+# ifdef LOAD_FILES
+ if (molecule_str && *molecule_str &&
+ strcmp(molecule_str, "(default)")) /* try external PDB files */
+ {
+ /* The -molecule option can point to a .pdb file, or to
+ a directory of them.
+ */
+ int wire = MI_IS_WIREFRAME(mi);
+ struct stat st;
+ int nfiles = 0;
+ int list_size = 0;
+ char **files = 0;
+ int molecule_ctr;
+
+ if (!stat (molecule_str, &st) &&
+ S_ISDIR (st.st_mode))
+ {
+ char buf [255];
+ DIR *pdb_dir;
+ struct dirent *dentry;
+
+ pdb_dir = opendir (molecule_str);
+ if (! pdb_dir)
+ {
+ sprintf (buf, "%.100s: %.100s", progname, molecule_str);
+ perror (buf);
+ exit (1);
+ }
+
+ if (verbose_p)
+ fprintf (stderr, "%s: directory %s\n", progname, molecule_str);
+
+ nfiles = 0;
+ list_size = 100;
+ files = (char **) calloc (sizeof(*files), list_size);
+
+ while ((dentry = readdir (pdb_dir)))
+ {
+ int L = strlen (dentry->d_name);
+ if (L > 4 && !strcasecmp (dentry->d_name + L - 4, ".pdb"))
+ {
+ char *fn;
+ if (nfiles >= list_size-1)
+ {
+ list_size = (list_size + 10) * 1.2;
+ files = (char **)
+ realloc (files, list_size * sizeof(*files));
+ if (!files)
+ {
+ OOM:
+ fprintf (stderr, "%s: out of memory (%d files)\n",
+ progname, nfiles);
+ exit (1);
+ }
+ }
+
+ fn = (char *) malloc (strlen (molecule_str) + L + 10);
+ if (!fn) goto OOM;
+ strcpy (fn, molecule_str);
+ if (fn[strlen(fn)-1] != '/') strcat (fn, "/");
+ strcat (fn, dentry->d_name);
+ files[nfiles++] = fn;
+ if (verbose_p)
+ fprintf (stderr, "%s: file %s\n", progname, fn);
+ }
+ }
+ closedir (pdb_dir);
+
+ if (nfiles == 0)
+ fprintf (stderr, "%s: no .pdb files in directory %s\n",
+ progname, molecule_str);
+ }
+ else
+ {
+ files = (char **) malloc (sizeof (*files));
+ nfiles = 1;
+ files[0] = strdup (molecule_str);
+ if (verbose_p)
+ fprintf (stderr, "%s: file %s\n", progname, molecule_str);
+ }
+
+ mc->nmolecules = nfiles;
+ mc->molecules = (molecule *) calloc (sizeof (molecule), mc->nmolecules);
+ molecule_ctr = 0;
+ for (i = 0; i < mc->nmolecules; i++)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: reading %s\n", progname, files[i]);
+ if (!parse_pdb_file (&mc->molecules[molecule_ctr], files[i]))
+ {
+ if ((wire || !do_atoms) &&
+ !do_labels &&
+ mc->molecules[molecule_ctr].nbonds == 0)
+ {
+ /* If we're not drawing atoms (e.g., wireframe mode), and
+ there is no bond info, then make sure labels are turned
+ on, or we'll be looking at a black screen... */
+ fprintf (stderr, "%s: %s: no bonds: turning -label on.\n",
+ progname, files[i]);
+ do_labels = 1;
+ }
+ free (files[i]);
+ files[i] = 0;
+ molecule_ctr++;
+ }
+ }
+
+ free (files);
+ files = 0;
+ mc->nmolecules = molecule_ctr;
+ }
+# endif /* LOAD_FILES */
+
+ if (mc->nmolecules == 0) /* do the builtins if no files */
+ {
+ mc->nmolecules = countof(builtin_pdb_data);
+ mc->molecules = (molecule *) calloc (sizeof (molecule), mc->nmolecules);
+ for (i = 0; i < mc->nmolecules; i++)
+ {
+ char name[100];
+ sprintf (name, "<builtin-%d>", i);
+ if (verbose_p) fprintf (stderr, "%s: reading %s\n", progname, name);
+ parse_pdb_data (&mc->molecules[i], builtin_pdb_data[i], name, 1);
+ }
+ }
+
+ for (i = 0; i < mc->nmolecules; i++)
+ {
+ generate_molecule_formula (&mc->molecules[i]);
+ insert_vertical_whitespace ((char *) mc->molecules[i].label);
+ }
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_molecule (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 20.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+ static const GLfloat pos[4] = {1.0, 0.4, 0.9, 0.0};
+ static const GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ static const GLfloat dif[4] = {0.8, 0.8, 0.8, 1.0};
+ static const GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+}
+
+
+static void
+startup_blurb (ModeInfo *mi)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+ const char *s = "Constructing molecules...";
+ print_texture_label (mi->dpy, mc->title_font,
+ mi->xgwa.width, mi->xgwa.height,
+ 0, s);
+ glFinish();
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT Bool
+molecule_handle_event (ModeInfo *mi, XEvent *event)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mc->button_down_p))
+ return True;
+ else
+ {
+ if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '<' || c == ',' || c == '-' || c == '_' ||
+ keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
+ {
+ mc->next = -1;
+ goto SWITCH;
+ }
+ else if (c == '>' || c == '.' || c == '=' || c == '+' ||
+ keysym == XK_Right || keysym == XK_Down ||
+ keysym == XK_Next)
+ {
+ mc->next = 1;
+ goto SWITCH;
+ }
+ }
+
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ SWITCH:
+ mc->mode = 1;
+ mc->mode_tick = 4;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_molecule (ModeInfo *mi)
+{
+ molecule_configuration *mc;
+ int wire;
+
+ MI_INIT (mi, mcs);
+
+ mc = &mcs[MI_SCREEN(mi)];
+
+ if ((mc->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ reshape_molecule (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ load_fonts (mi);
+ startup_blurb (mi);
+
+ wire = MI_IS_WIREFRAME(mi);
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 0.5;
+ double spin_accel = 0.3;
+ double wander_speed = 0.01;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ mc->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ (spinx && spiny && spinz));
+ mc->trackball = gltrackball_init (True);
+ }
+
+ orig_do_labels = do_labels;
+ orig_do_atoms = do_atoms;
+ orig_do_bonds = do_bonds;
+ orig_do_shells = do_shells;
+ orig_wire = MI_IS_WIREFRAME(mi);
+
+ mc->molecule_dlist = glGenLists(1);
+ if (do_shells)
+ mc->shell_dlist = glGenLists(1);
+
+ load_molecules (mi);
+ mc->which = random() % mc->nmolecules;
+
+ mc->no_label_threshold = get_float_resource (mi->dpy, "noLabelThreshold",
+ "NoLabelThreshold");
+ mc->wireframe_threshold = get_float_resource (mi->dpy, "wireframeThreshold",
+ "WireframeThreshold");
+ mc->mode = 0;
+
+ if (wire)
+ do_bonds = 1;
+}
+
+
+/* Put the labels on the atoms.
+ This can't be a part of the display list because of the games
+ we play with the translation matrix.
+ */
+static void
+draw_labels (ModeInfo *mi)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ molecule *m = &mc->molecules[mc->which];
+ int i;
+
+ if (!do_labels)
+ return;
+
+ for (i = 0; i < m->natoms; i++)
+ {
+ molecule_atom *a = &m->atoms[i];
+ GLfloat size = atom_size (a);
+ GLfloat m[4][4];
+
+ glPushMatrix();
+
+ if (!wire)
+ set_atom_color (mi, a, True, 1);
+
+ /* First, we translate the origin to the center of the atom.
+
+ Then we retrieve the prevailing modelview matrix, which
+ includes any rotation, wandering, and user-trackball-rolling
+ of the scene.
+
+ We set the top 3x3 cells of that matrix to be the identity
+ matrix. This removes all rotation from the matrix, while
+ leaving the translation alone. This has the effect of
+ leaving the prevailing coordinate system perpendicular to
+ the camera view: were we to draw a square face, it would
+ be in the plane of the screen.
+
+ Now we translate by `size' toward the viewer -- so that the
+ origin is *just in front* of the ball.
+
+ Then we draw the label text, allowing the depth buffer to
+ do its work: that way, labels on atoms will be occluded
+ properly when other atoms move in front of them.
+
+ This technique (of neutralizing rotation relative to the
+ observer, after both rotations and translations have been
+ applied) is known as "billboarding".
+ */
+
+ glTranslatef(a->x, a->y, a->z); /* get matrix */
+ glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]); /* load rot. identity */
+ m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
+ m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
+ m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
+ glLoadIdentity(); /* reset modelview */
+ glMultMatrixf (&m[0][0]); /* replace with ours */
+
+ glTranslatef (0, 0, (size * 1.1)); /* move toward camera */
+
+ glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
+
+ {
+ XCharStruct e;
+ int w, h;
+ GLfloat s;
+
+ texture_string_metrics (mc->atom_font, a->label, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+
+ s = 1.0 / h; /* Scale to unit */
+ s *= mc->overall_scale; /* Scale to size of atom */
+ s *= 0.8; /* Shrink a bit */
+ glScalef (s, s, 1);
+ glTranslatef (-w/2, -h/2, 0);
+ print_texture_string (mc->atom_font, a->label);
+ }
+
+ glPopMatrix();
+ }
+}
+
+
+static void
+pick_new_molecule (ModeInfo *mi, time_t last)
+{
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+
+ if (mc->nmolecules == 1)
+ {
+ if (last != 0) return;
+ mc->which = 0;
+ }
+ else if (last == 0)
+ {
+ mc->which = random() % mc->nmolecules;
+ }
+ else if (mc->next < 0)
+ {
+ mc->which--;
+ if (mc->which < 0) mc->which = mc->nmolecules-1;
+ mc->next = 0;
+ }
+ else if (mc->next > 0)
+ {
+ mc->which++;
+ if (mc->which >= mc->nmolecules) mc->which = 0;
+ mc->next = 0;
+ }
+ else
+ {
+ int n = mc->which;
+ while (n == mc->which)
+ n = random() % mc->nmolecules;
+ mc->which = n;
+ }
+
+ if (verbose_p)
+ {
+ char *name = strdup (mc->molecules[mc->which].label);
+ char *s = strpbrk (name, "\r\n");
+ if (s) *s = 0;
+ fprintf (stderr, "%s: drawing %s (%d)\n", progname, name, mc->which);
+ free (name);
+ }
+
+ mc->polygon_count = 0;
+
+ glNewList (mc->molecule_dlist, GL_COMPILE);
+ ensure_bounding_box_visible (mi);
+
+ do_labels = orig_do_labels;
+ do_atoms = orig_do_atoms;
+ do_bonds = orig_do_bonds;
+ do_shells = orig_do_shells;
+ MI_IS_WIREFRAME(mi) = orig_wire;
+
+ if (mc->molecule_size > mc->no_label_threshold)
+ do_labels = 0;
+ if (mc->molecule_size > mc->wireframe_threshold)
+ MI_IS_WIREFRAME(mi) = 1;
+
+ if (MI_IS_WIREFRAME(mi))
+ do_bonds = 1, do_shells = 0;
+
+ if (!do_bonds)
+ do_shells = 0;
+
+ if (! (do_bonds || do_atoms || do_labels))
+ {
+ /* Make sure *something* shows up! */
+ MI_IS_WIREFRAME(mi) = 1;
+ do_bonds = 1;
+ }
+
+ build_molecule (mi, False);
+ glEndList();
+
+ if (do_shells)
+ {
+ glNewList (mc->shell_dlist, GL_COMPILE);
+ ensure_bounding_box_visible (mi);
+
+ do_labels = 0;
+ do_atoms = 1;
+ do_bonds = 0;
+
+ build_molecule (mi, True);
+
+ glEndList();
+ do_bonds = orig_do_bonds;
+ do_atoms = orig_do_atoms;
+ do_labels = orig_do_labels;
+ }
+}
+
+
+ENTRYPOINT void
+draw_molecule (ModeInfo *mi)
+{
+ time_t now = time ((time_t *) 0);
+ GLfloat speed = 4.0; /* speed at which the zoom out/in happens */
+
+ molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!mc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mc->glx_context));
+
+ if (mc->draw_time == 0)
+ {
+ pick_new_molecule (mi, mc->draw_time);
+ mc->draw_time = now;
+ }
+ else if (mc->mode == 0)
+ {
+ if (mc->draw_tick++ > 10)
+ {
+ time_t now = time((time_t *) 0);
+ if (mc->draw_time == 0) mc->draw_time = now;
+ mc->draw_tick = 0;
+
+ if (!mc->button_down_p &&
+ mc->nmolecules > 1 &&
+ mc->draw_time + timeout <= now)
+ {
+ /* randomize molecules every -timeout seconds */
+ mc->mode = 1; /* go out */
+ mc->mode_tick = 80 / speed;
+ mc->draw_time = now;
+ }
+ }
+ }
+ else if (mc->mode == 1) /* out */
+ {
+ if (--mc->mode_tick <= 0)
+ {
+ mc->mode_tick = 80 / speed;
+ mc->mode = 2; /* go in */
+ pick_new_molecule (mi, mc->draw_time);
+ }
+ }
+ else if (mc->mode == 2) /* in */
+ {
+ if (--mc->mode_tick <= 0)
+ mc->mode = 0; /* normal */
+ }
+ else
+ abort();
+
+ glPushMatrix ();
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (mc->rot, &x, &y, &z, !mc->button_down_p);
+ glTranslatef((x - 0.5) * 9,
+ (y - 0.5) * 9,
+ (z - 0.5) * 9);
+
+ gltrackball_rotate (mc->trackball);
+
+ get_rotation (mc->rot, &x, &y, &z, !mc->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (mc->mode != 0)
+ {
+ GLfloat s = (mc->mode == 1
+ ? mc->mode_tick / (80 / speed)
+ : ((80 / speed) - mc->mode_tick + 1) / (80 / speed));
+ glScalef (s, s, s);
+ }
+
+ glPushMatrix();
+ glCallList (mc->molecule_dlist);
+
+ if (mc->mode == 0)
+ {
+ molecule *m = &mc->molecules[mc->which];
+
+ draw_labels (mi);
+
+ /* This can't go in the display list, or the characters are spaced
+ wrongly when the window is resized. */
+ if (do_titles && m->label && *m->label)
+ {
+ set_atom_color (mi, 0, True, 1);
+ print_texture_label (mi->dpy, mc->title_font,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, m->label);
+ }
+ }
+ glPopMatrix();
+
+ if (do_shells)
+ {
+ glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glPushMatrix();
+ glCallList (mc->shell_dlist);
+ glPopMatrix();
+ glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+
+ glDepthFunc (GL_EQUAL);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glPushMatrix();
+ glCallList (mc->shell_dlist);
+ glPopMatrix();
+ glDepthFunc (GL_LESS);
+ glDisable (GL_BLEND);
+ }
+
+ glPopMatrix ();
+
+ mi->polygon_count = mc->polygon_count;
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Molecule", molecule)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/molecule.man b/hacks/glx/molecule.man
new file mode 100644
index 0000000..6ec8328
--- /dev/null
+++ b/hacks/glx/molecule.man
@@ -0,0 +1,160 @@
+.TH XScreenSaver 1 "13-Mar-01" "X Version 11"
+.SH NAME
+molecule - draws 3D molecular structures
+.SH SYNOPSIS
+.B molecule
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-wander] [\-no-wander]
+[\-spin \fIaxes\fP]
+[\-no-spin]
+[\-timeout \fIseconds\fP]
+[\-labels] [\-no-labels]
+[\-titles] [\-no-titles]
+[\-atoms] [\-no-atoms]
+[\-bonds] [\-no-bonds]
+[\-shells] [\-no-shells]
+[\-molecule \fIfile-or-directory\fP]
+[\-verbose]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fImolecule\fP program draws several different representations of
+molecules. Some common molecules are built in, and it can read PDB
+(Protein Data Base) files as input.
+.SH OPTIONS
+.I molecule
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-verbose
+Print debugging info on stderr about files being loaded, etc.
+.TP 8
+.B \-wander
+Move the molecules around the screen.
+.TP 8
+.B \-no\-wander
+Keep the molecule centered on the screen. This is the default.
+.TP 8
+.B \-spin
+Which axes around which the molecule should spin. The default is "XYZ",
+meaning rotate it freely in space. "\fB\-spin Z\fP" would rotate the
+molecule in the plane of the screen while not rotating it into or out
+of the screen; etc.
+.TP 8
+.B \-no\-spin
+Don't spin it at all: the same as \fB\-spin ""\fP.
+.TP 8
+.B \-labels
+Draw labels on the atoms (or the spot where the atoms would be.)
+This is the default.
+.TP 8
+.B \-no\-labels
+Do not draw labels on the atoms.
+.TP 8
+.B \-titles
+Print the name of the molecule and its chemical formula at the top of
+the screen.
+.TP 8
+.B \-no\-titles
+Do not print the molecule name.
+.TP 8
+.B \-atoms
+Represent the atoms as shaded spheres of appropriate sizes.
+This is the default.
+.TP 8
+.B \-no\-atoms
+Do not draw spheres for the atoms: only draw bond lines.
+.TP 8
+.B \-bonds
+Represent the atomic bonds as solid tubes of appropriate thicknesses.
+This is the default.
+.TP 8
+.B \-no\-bonds
+Do not draw the bonds: instead, make the spheres for the atoms be
+larger, for a "space-filling" representation of the molecule.
+.TP 8
+.B \-shells
+Draw transparent electron shells around the atoms. This only works
+if bonds are also being drawn.
+.TP 8
+.B \-no\-shells
+Do not draw electron shells. This is the default.
+.TP 8
+.B \-shell\-alpha
+When drawing shells, how transparent to make them. Default 0.4.
+.TP 8
+.B \-wireframe
+Draw a wireframe rendition of the molecule: this will consist only of
+single-pixel lines for the bonds, and text labels where the atoms go.
+This will be very fast.
+.TP 8
+.B \-timeout \fIseconds\fP
+When using the built-in data set, change to a new molecule every
+this-many seconds. Default is 20 seconds.
+.TP 8
+.B \-molecule \fIfile-or-directory\fP
+Instead of using the built-in molecules, read one from the given file.
+This file must be in PDB (Protein Data Base) format. (Note that it's
+not uncommon for PDB files to contain only the atoms, with no (or
+little) information about the atomic bonds.)
+
+This can also be a directory, in which case, all of the .pdb files in
+that directory will be loaded. A new one will be displayed at random
+every few seconds (as per the \fI\-timeout\fP option.)
+.PP
+When the molecule is too large (bigger than about 30 angstroms from
+side to side), the \fI\-label\fP option will be automatically turned
+off, because otherwise, the labels would overlap and completely obscure
+the display.
+
+When the molecule is around 150 angstroms from side to side, wireframe
+mode will be turned on (because otherwise it would be too slow.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.PP
+Documentation on the PDB file format:
+
+ http://www.wwpdb.org/docs.html
+ http://www.rcsb.org/pdb/docs/format/pdbguide2.2/guide2.2_frame.html
+
+A good source of PDB files:
+
+ http://www.umass.edu/microbio/rasmol/whereget.htm
+ http://www.wwpdb.org/docs.html
+.SH COPYRIGHT
+Copyright \(co 2001-2005 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/molecules.sh b/hacks/glx/molecules.sh
new file mode 100755
index 0000000..4f417c3
--- /dev/null
+++ b/hacks/glx/molecules.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+TARGET=$1
+shift
+SRCS=$*
+
+TMP=molecules.h.$$
+rm -f $TMP
+trap "rm -f $TMP" 1 2 3 15 EXIT
+
+if [ -z "$UTILS_SRC" ]; then UTILS_SRC="../../utils"; fi
+
+for f in $SRCS ; do
+ sh "$UTILS_SRC/ad2c" "$f" |
+ sed 's/",$/\\n"/' >> $TMP
+ echo ',' >> $TMP
+done
+
+if cmp -s $TMP $TARGET ; then
+ rm $TMP
+else
+ mv $TMP $TARGET
+fi
diff --git a/hacks/glx/morph3d.c b/hacks/glx/morph3d.c
new file mode 100644
index 0000000..0780444
--- /dev/null
+++ b/hacks/glx/morph3d.c
@@ -0,0 +1,837 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* morph3d --- Shows 3D morphing objects */
+
+#if 0
+static const char sccsid[] = "@(#)morph3d.c 5.01 2001/03/01 xlockmore";
+#endif
+
+#undef DEBUG_CULL_FACE
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Marcelo Fernandes Vianna
+ * (me...) and was inspired on a WindowsNT(R)'s screen saver (Flower Box).
+ * It was written from scratch and it was not based on any other source code.
+ *
+ * Porting it to xlock (the final objective of this code since the moment I
+ * decided to create it) was possible by comparing the original Mesa's gear
+ * demo with it's ported version to xlock, so thanks for Danny Sung (look at
+ * gear.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * If you are interested in the original version of this program (not a xlock
+ * mode, please refer to the Mesa package (ftp iris.ssec.wisc.edu on /pub/Mesa)
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistakes.
+ *
+ * My e-mail address is
+ * mfvianna@centroin.com.br
+ *
+ * Marcelo F. Vianna (Feb-13-1997)
+ *
+ * Revision History:
+ * 05-Apr-2002: Removed all gllist uses (fix some bug with nvidia driver)
+ * 01-Mar-2001: Added FPS stuff E.Lassauge <lassauge@mail.dotcom.fr>
+ * 27-Jul-1997: Speed ups by Marcelo F. Vianna.
+ * 08-May-1997: Speed ups by Marcelo F. Vianna.
+ *
+ */
+
+#ifdef STANDALONE
+# define MODE_moebius
+# define DEFAULTS "*delay: 40000 \n" \
+ "*showFPS: False \n" \
+ "*count: 0 \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_morph3d 0
+# define release_morph3d 0
+# define morph3d_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_moebius
+
+ENTRYPOINT ModeSpecOpt morph3d_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct morph3d_description =
+{"morph3d", "init_morph3d", "draw_morph3d", (char *) NULL,
+ "draw_morph3d", "change_morph3d", (char *) NULL, &morph3d_opts,
+ 1000, 0, 1, 1, 4, 1.0, "",
+ "Shows GL morphing polyhedra", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 1.0
+
+#define VectMul(X1,Y1,Z1,X2,Y2,Z2) (Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2)
+#define sqr(A) ((A)*(A))
+
+/* Increasing this values produces better image quality, the price is speed. */
+#define tetradivisions 23
+#define cubedivisions 20
+#define octadivisions 21
+#define dodecadivisions 10
+#define icodivisions 15
+
+#define tetraangle 109.47122063449069174
+#define cubeangle 90.000000000000000000
+#define octaangle 109.47122063449069174
+#define dodecaangle 63.434948822922009981
+#define icoangle 41.810314895778596167
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+#define SQRT2 1.4142135623730951455
+#define SQRT3 1.7320508075688771932
+#define SQRT5 2.2360679774997898051
+#define SQRT6 2.4494897427831778813
+#define SQRT15 3.8729833462074170214
+#define cossec36_2 0.8506508083520399322
+#define cos72 0.3090169943749474241
+#define sin72 0.9510565162951535721
+#define cos36 0.8090169943749474241
+#define sin36 0.5877852522924731292
+
+/*************************************************************************/
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLfloat seno;
+ int object;
+ int edgedivisions;
+ int VisibleSpikes;
+ void (*draw_object) (ModeInfo * mi);
+ float Magnitude;
+ const float *MaterialColor[20];
+ GLXContext *glx_context;
+ int arrayninit;
+
+} morph3dstruct;
+
+static const GLfloat front_shininess[] = {60.0};
+static const GLfloat front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
+static const GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const GLfloat lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const GLfloat lmodel_twoside[] = {GL_TRUE};
+
+static const GLfloat MaterialRed[] = {0.7, 0.0, 0.0, 1.0};
+static const GLfloat MaterialGreen[] = {0.1, 0.5, 0.2, 1.0};
+static const GLfloat MaterialBlue[] = {0.0, 0.0, 0.7, 1.0};
+static const GLfloat MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};
+static const GLfloat MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};
+static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};
+static const GLfloat MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat MaterialGray[] = {0.5, 0.5, 0.5, 1.0};
+
+static morph3dstruct *morph3d = (morph3dstruct *) NULL;
+
+#define TRIANGLE(Edge, Amp, Divisions, Z, VS) \
+{ \
+ GLfloat Xf,Yf,Xa,Yb=0.0,Xf2=0.0,Yf2=0.0,Yf_2=0.0,Yb2,Yb_2; \
+ GLfloat Factor=0.0,Factor1,Factor2; \
+ GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \
+ GLfloat Ax,Ay; \
+ int Ri,Ti; \
+ GLfloat Vr=(Edge)*SQRT3/3; \
+ GLfloat AmpVr2=(Amp)/sqr(Vr); \
+ GLfloat Zf=(Edge)*(Z); \
+ \
+ Ax=(Edge)*(+0.5/(Divisions)), Ay=(Edge)*(-SQRT3/(2*Divisions)); \
+ \
+ Yf=Vr+Ay; Yb=Yf+0.001; \
+ for (Ri=1; Ri<=(Divisions); Ri++) { \
+ glBegin(GL_TRIANGLE_STRIP); \
+ Xf=(float)Ri*Ax; Xa=Xf+0.001; \
+ Yf2=sqr(Yf); Yf_2=sqr(Yf-Ay); \
+ Yb2=sqr(Yb); Yb_2=sqr(Yb-Ay); \
+ for (Ti=0; Ti<Ri; Ti++) { \
+ Factor=1-(((Xf2=sqr(Xf))+Yf2)*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+Yb2)*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
+ \
+ Xf-=Ax; Yf-=Ay; Xa-=Ax; Yb-=Ay; \
+ \
+ Factor=1-(((Xf2=sqr(Xf))+Yf_2)*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf_2)*AmpVr2); \
+ Factor2=1-((Xf2+Yb_2)*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
+ \
+ Xf-=Ax; Yf+=Ay; Xa-=Ax; Yb+=Ay; \
+ } \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ Yf+=Ay; Yb+=Ay; \
+ glEnd(); \
+ } \
+ VS=(Factor<0); \
+}
+
+#define SQUARE(Edge, Amp, Divisions, Z, VS) \
+{ \
+ int Xi,Yi; \
+ GLfloat Xf,Yf,Y,Xf2,Yf2,Y2,Xa,Xa2,Yb; \
+ GLfloat Factor=0.0,Factor1,Factor2; \
+ GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \
+ GLfloat Zf=(Edge)*(Z); \
+ GLfloat AmpVr2=(Amp)/sqr((Edge)*SQRT2/2); \
+ \
+ for (Yi=0; Yi<(Divisions); Yi++) { \
+ Yf=-((Edge)/2.0) + ((float)Yi)/(Divisions)*(Edge); \
+ Yf2=sqr(Yf); \
+ Y=Yf+1.0/(Divisions)*(Edge); \
+ Y2=sqr(Y); \
+ glBegin(GL_QUAD_STRIP); \
+ for (Xi=0; Xi<=(Divisions); Xi++) { \
+ Xf=-((Edge)/2.0) + ((float)Xi)/(Divisions)*(Edge); \
+ Xf2=sqr(Xf); \
+ \
+ Xa=Xf+0.001; Yb=Y+0.001; \
+ Factor=1-((Xf2+Y2)*AmpVr2); \
+ Factor1=1-(((Xa2=sqr(Xa))+Y2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Y; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Y-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ \
+ Yb=Yf+0.001; \
+ Factor=1-((Xf2+Yf2)*AmpVr2); \
+ Factor1=1-((Xa2+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
+ } \
+ glEnd(); \
+ } \
+ VS=(Factor<0); \
+}
+
+#define PENTAGON(Edge, Amp, Divisions, Z, VS) \
+{ \
+ int Ri,Ti,Fi; \
+ GLfloat Xf,Yf,Xa,Yb,Xf2,Yf2; \
+ GLfloat Factor=0.0,Factor1,Factor2; \
+ GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \
+ GLfloat Zf=(Edge)*(Z); \
+ GLfloat AmpVr2=(Amp)/sqr((Edge)*cossec36_2); \
+ \
+ GLfloat x[6],y[6]; \
+ \
+ for(Fi=0;Fi<6;Fi++) { \
+ x[Fi]=-cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
+ y[Fi]=sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
+ } \
+ \
+ for (Ri=1; Ri<=(Divisions); Ri++) { \
+ for (Fi=0; Fi<5; Fi++) { \
+ glBegin(GL_TRIANGLE_STRIP); \
+ for (Ti=0; Ti<Ri; Ti++) { \
+ Xf=(float)(Ri-Ti)*x[Fi] + (float)Ti*x[Fi+1]; \
+ Yf=(float)(Ri-Ti)*y[Fi] + (float)Ti*y[Fi+1]; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
+ \
+ Xf-=x[Fi]; Yf-=y[Fi]; Xa-=x[Fi]; Yb-=y[Fi]; \
+ \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
+ \
+ } \
+ Xf=(float)Ri*x[Fi+1]; \
+ Yf=(float)Ri*y[Fi+1]; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ glEnd(); \
+ } \
+ } \
+ VS=(Factor<0); \
+}
+
+static void
+draw_tetra(ModeInfo * mi)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
+
+ glPushMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-tetraangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + tetraangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + tetraangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
+}
+
+static void
+draw_cube(ModeInfo * mi)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
+
+ glRotatef(cubeangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
+ glRotatef(cubeangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
+ glRotatef(cubeangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
+ glRotatef(cubeangle, 0, 1, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
+ glRotatef(2 * cubeangle, 0, 1, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
+}
+
+static void
+draw_octa(ModeInfo * mi)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+
+ glPushMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-180 + octaangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-octaangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-180 + octaangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-octaangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+}
+
+static void
+draw_dodeca(ModeInfo * mi)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+#define TAU ((SQRT5+1)/2)
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+
+ glPushMatrix();
+ glRotatef(180, 0, 0, 1);
+ glPushMatrix();
+ glRotatef(-dodecaangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle, cos72, sin72, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle, cos72, -sin72, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(dodecaangle, cos36, -sin36, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(dodecaangle, cos36, sin36, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glRotatef(180, 0, 0, 1);
+ glPushMatrix();
+ glRotatef(-dodecaangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle, cos72, sin72, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle, cos72, -sin72, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(dodecaangle, cos36, -sin36, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(dodecaangle, cos36, sin36, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+}
+
+static void
+draw_icosa(ModeInfo * mi)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+
+ glPushMatrix();
+
+ glPushMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-icoangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-icoangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-icoangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-icoangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[12]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[13]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[14]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[15]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-icoangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[16]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[17]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPushMatrix();
+ glRotatef(180, 0, 1, 0);
+ glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[18]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+ glPopMatrix();
+ glRotatef(180, 0, 0, 1);
+ glRotatef(-icoangle, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[19]);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+}
+
+ENTRYPOINT void
+reshape_morph3d(ModeInfo * mi, int width, int height)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+
+ glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void
+pinit(ModeInfo * mi)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+ glClearDepth(1.0);
+ glColor3f(1.0, 1.0, 1.0);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+
+ glShadeModel(GL_SMOOTH);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ switch (mp->object) {
+ case 2:
+ mp->draw_object = draw_cube;
+ mp->MaterialColor[0] = MaterialRed;
+ mp->MaterialColor[1] = MaterialGreen;
+ mp->MaterialColor[2] = MaterialCyan;
+ mp->MaterialColor[3] = MaterialMagenta;
+ mp->MaterialColor[4] = MaterialYellow;
+ mp->MaterialColor[5] = MaterialBlue;
+ mp->edgedivisions = cubedivisions;
+ mp->Magnitude = 2.0;
+ break;
+ case 3:
+ mp->draw_object = draw_octa;
+ mp->MaterialColor[0] = MaterialRed;
+ mp->MaterialColor[1] = MaterialGreen;
+ mp->MaterialColor[2] = MaterialBlue;
+ mp->MaterialColor[3] = MaterialWhite;
+ mp->MaterialColor[4] = MaterialCyan;
+ mp->MaterialColor[5] = MaterialMagenta;
+ mp->MaterialColor[6] = MaterialGray;
+ mp->MaterialColor[7] = MaterialYellow;
+ mp->edgedivisions = octadivisions;
+ mp->Magnitude = 2.5;
+ break;
+ case 4:
+ mp->draw_object = draw_dodeca;
+ mp->MaterialColor[0] = MaterialRed;
+ mp->MaterialColor[1] = MaterialGreen;
+ mp->MaterialColor[2] = MaterialCyan;
+ mp->MaterialColor[3] = MaterialBlue;
+ mp->MaterialColor[4] = MaterialMagenta;
+ mp->MaterialColor[5] = MaterialYellow;
+ mp->MaterialColor[6] = MaterialGreen;
+ mp->MaterialColor[7] = MaterialCyan;
+ mp->MaterialColor[8] = MaterialRed;
+ mp->MaterialColor[9] = MaterialMagenta;
+ mp->MaterialColor[10] = MaterialBlue;
+ mp->MaterialColor[11] = MaterialYellow;
+ mp->edgedivisions = dodecadivisions;
+ mp->Magnitude = 2.0;
+ break;
+ case 5:
+ mp->draw_object = draw_icosa;
+ mp->MaterialColor[0] = MaterialRed;
+ mp->MaterialColor[1] = MaterialGreen;
+ mp->MaterialColor[2] = MaterialBlue;
+ mp->MaterialColor[3] = MaterialCyan;
+ mp->MaterialColor[4] = MaterialYellow;
+ mp->MaterialColor[5] = MaterialMagenta;
+ mp->MaterialColor[6] = MaterialRed;
+ mp->MaterialColor[7] = MaterialGreen;
+ mp->MaterialColor[8] = MaterialBlue;
+ mp->MaterialColor[9] = MaterialWhite;
+ mp->MaterialColor[10] = MaterialCyan;
+ mp->MaterialColor[11] = MaterialYellow;
+ mp->MaterialColor[12] = MaterialMagenta;
+ mp->MaterialColor[13] = MaterialRed;
+ mp->MaterialColor[14] = MaterialGreen;
+ mp->MaterialColor[15] = MaterialBlue;
+ mp->MaterialColor[16] = MaterialCyan;
+ mp->MaterialColor[17] = MaterialYellow;
+ mp->MaterialColor[18] = MaterialMagenta;
+ mp->MaterialColor[19] = MaterialGray;
+ mp->edgedivisions = icodivisions;
+ mp->Magnitude = 2.5;
+ break;
+ default:
+ mp->draw_object = draw_tetra;
+ mp->MaterialColor[0] = MaterialRed;
+ mp->MaterialColor[1] = MaterialGreen;
+ mp->MaterialColor[2] = MaterialBlue;
+ mp->MaterialColor[3] = MaterialWhite;
+ mp->edgedivisions = tetradivisions;
+ mp->Magnitude = 2.5;
+ break;
+ }
+ if (MI_IS_MONO(mi)) {
+ int loop;
+
+ for (loop = 0; loop < 20; loop++)
+ mp->MaterialColor[loop] = MaterialGray;
+ }
+}
+
+ENTRYPOINT void
+init_morph3d(ModeInfo * mi)
+{
+ morph3dstruct *mp;
+
+ MI_INIT (mi, morph3d);
+ mp = &morph3d[MI_SCREEN(mi)];
+ mp->step = NRAND(90);
+ mp->VisibleSpikes = 1;
+
+ if ((mp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_morph3d(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ mp->object = MI_COUNT(mi);
+ if (mp->object <= 0 || mp->object > 5)
+ mp->object = NRAND(5) + 1;
+ pinit(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_morph3d(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ morph3dstruct *mp;
+
+ if (morph3d == NULL)
+ return;
+ mp = &morph3d[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!mp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glTranslatef(0.0, 0.0, -10.0);
+
+ if (!MI_IS_ICONIC(mi)) {
+ glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window);
+ glTranslatef(2.5 * mp->WindW / mp->WindH * sin(mp->step * 1.11), 2.5 * cos(mp->step * 1.25 * 1.11), 0);
+ } else {
+ glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
+ }
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, h, 1);
+ }
+# endif
+
+ glRotatef(mp->step * 100, 1, 0, 0);
+ glRotatef(mp->step * 95, 0, 1, 0);
+ glRotatef(mp->step * 90, 0, 0, 1);
+
+ mp->seno = (sin(mp->step) + 1.0 / 3.0) * (4.0 / 5.0) * mp->Magnitude;
+
+ if (mp->VisibleSpikes) {
+#ifdef DEBUG_CULL_FACE
+ int loop;
+
+ for (loop = 0; loop < 20; loop++)
+ mp->MaterialColor[loop] = MaterialGray;
+#endif
+ glDisable(GL_CULL_FACE);
+ } else {
+#ifdef DEBUG_CULL_FACE
+ int loop;
+
+ for (loop = 0; loop < 20; loop++)
+ mp->MaterialColor[loop] = MaterialWhite;
+#endif
+ glEnable(GL_CULL_FACE);
+ }
+
+ mp->draw_object(mi);
+
+ glPopMatrix();
+
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glXSwapBuffers(display, window);
+
+ mp->step += 0.05;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_morph3d(ModeInfo * mi)
+{
+ morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ mp->object = (mp->object) % 5 + 1;
+ pinit(mi);
+}
+#endif /* !STANDALONE */
+
+#endif
+
+XSCREENSAVER_MODULE ("Morph3D", morph3d)
diff --git a/hacks/glx/morph3d.man b/hacks/glx/morph3d.man
new file mode 100644
index 0000000..21af78c
--- /dev/null
+++ b/hacks/glx/morph3d.man
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+morph3d - 3d morphing objects.
+.SH SYNOPSIS
+.B morph3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Another 3d shape-changing GL hack. It has the same shiny-plastic feel
+as Superquadrics, as many computer-generated objects do...
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+0 - 20. Default: 0.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Marcelo Vianna.
diff --git a/hacks/glx/noof.c b/hacks/glx/noof.c
new file mode 100644
index 0000000..4e42840
--- /dev/null
+++ b/hacks/glx/noof.c
@@ -0,0 +1,519 @@
+/* noof, Copyright (c) 2004-2018 Bill Torzewski <billt@worksitez.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Originally a demo included with GLUT;
+ * (Apparently this was called "diatoms" on Irix.)
+ * ported to raw GL and xscreensaver by jwz, 12-Feb-2004.
+ */
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*doubleBuffer: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_noof 0
+# define release_noof 0
+# define noof_handle_event 0
+#include "xlockmore.h"
+#include "pow2.h"
+
+#ifdef USE_GL /* whole file */
+
+#define N_SHAPES 7
+
+ENTRYPOINT ModeSpecOpt noof_opts = {0, NULL, 0, NULL, NULL};
+
+typedef struct {
+ GLXContext *glx_context;
+
+ float pos[N_SHAPES * 3];
+ float dir[N_SHAPES * 3];
+ float acc[N_SHAPES * 3];
+ float col[N_SHAPES * 3];
+ float hsv[N_SHAPES * 3];
+ float hpr[N_SHAPES * 3];
+ float ang[N_SHAPES];
+ float spn[N_SHAPES];
+ float sca[N_SHAPES];
+ float geep[N_SHAPES];
+ float peep[N_SHAPES];
+ float speedsq[N_SHAPES];
+ int blad[N_SHAPES];
+
+ float ht, wd;
+
+ int tko;
+
+ GLuint screenshot_texture, tex_w, tex_h;
+
+} noof_configuration;
+
+static noof_configuration *bps = NULL;
+
+
+static void
+initshapes(noof_configuration *bp, int i)
+{
+ int k;
+ float f;
+
+ /* random init of pos, dir, color */
+ for (k = i * 3; k <= i * 3 + 2; k++) {
+ f = random() / (double) RAND_MAX;
+ bp->pos[k] = f;
+ f = random() / (double) RAND_MAX;
+ f = (f - 0.5) * 0.05;
+ bp->dir[k] = f;
+ f = random() / (double) RAND_MAX;
+ f = (f - 0.5) * 0.0002;
+ bp->acc[k] = f;
+ f = random() / (double) RAND_MAX;
+ bp->col[k] = f;
+ }
+
+ bp->speedsq[i] = bp->dir[i * 3] * bp->dir[i * 3] + bp->dir[i * 3 + 1] * bp->dir[i * 3 + 1];
+ f = random() / (double) RAND_MAX;
+ bp->blad[i] = 2 + (int) (f * 17.0);
+ f = random() / (double) RAND_MAX;
+ bp->ang[i] = f;
+ f = random() / (double) RAND_MAX;
+ bp->spn[i] = (f - 0.5) * 40.0 / (10 + bp->blad[i]);
+ f = random() / (double) RAND_MAX;
+ bp->sca[i] = (f * 0.1 + 0.08);
+ bp->dir[i * 3] *= bp->sca[i];
+ bp->dir[i * 3 + 1] *= bp->sca[i];
+
+ f = random() / (double) RAND_MAX;
+ bp->hsv[i * 3] = f * 360.0;
+
+ f = random() / (double) RAND_MAX;
+ bp->hsv[i * 3 + 1] = f * 0.6 + 0.4;
+
+ f = random() / (double) RAND_MAX;
+ bp->hsv[i * 3 + 2] = f * 0.7 + 0.3;
+
+ f = random() / (double) RAND_MAX;
+ bp->hpr[i * 3] = f * 0.005 * 360.0;
+ f = random() / (double) RAND_MAX;
+ bp->hpr[i * 3 + 1] = f * 0.03;
+ f = random() / (double) RAND_MAX;
+ bp->hpr[i * 3 + 2] = f * 0.02;
+
+ bp->geep[i] = 0;
+ f = random() / (double) RAND_MAX;
+ bp->peep[i] = 0.01 + f * 0.2;
+}
+
+static const float bladeratio[] =
+{
+ /* nblades = 2..7 */
+ 0.0, 0.0, 3.00000, 1.73205, 1.00000, 0.72654, 0.57735, 0.48157,
+ /* 8..13 */
+ 0.41421, 0.36397, 0.19076, 0.29363, 0.26795, 0.24648,
+ /* 14..19 */
+ 0.22824, 0.21256, 0.19891, 0.18693, 0.17633, 0.16687,
+};
+
+static int
+drawleaf(noof_configuration *bp, int l)
+{
+ int polys = 0;
+ int b, blades;
+ float x, y;
+ float wobble;
+
+ blades = bp->blad[l];
+
+ y = 0.10 * sin(bp->geep[l] * M_PI / 180.0) + 0.099 * sin(bp->geep[l] * 5.12 * M_PI / 180.0);
+ if (y < 0)
+ y = -y;
+ x = 0.15 * cos(bp->geep[l] * M_PI / 180.0) + 0.149 * cos(bp->geep[l] * 5.12 * M_PI / 180.0);
+ if (x < 0.0)
+ x = 0.0 - x;
+ if (y < 0.001 && x > 0.000002 && ((bp->tko & 0x1) == 0)) {
+ initshapes(bp, l); /* let it become reborn as something
+ else */
+ bp->tko++;
+ return polys;
+ } {
+ float w1 = sin(bp->geep[l] * 15.3 * M_PI / 180.0);
+ wobble = 3.0 + 2.00 * sin(bp->geep[l] * 0.4 * M_PI / 180.0) + 3.94261 * w1;
+ }
+
+ /**
+ if(blades == 2) if (y > 3.000*x) y = x*3.000;
+ if(blades == 3) if (y > 1.732*x) y = x*1.732;
+ if(blades == 4) if (y > x) y = x;
+ if(blades == 5) if (y > 0.726*x) y = x*0.726;
+ if(blades == 6) if (y > 0.577*x) y = x*0.577;
+ if(blades == 7) if (y > 0.481*x) y = x*0.481;
+ if(blades == 8) if (y > 0.414*x) y = x*0.414;
+ */
+ if (y > x * bladeratio[blades])
+ y = x * bladeratio[blades];
+
+ for (b = 0; b < blades; b++) {
+ glPushMatrix();
+ glTranslatef(bp->pos[l * 3], bp->pos[l * 3 + 1], bp->pos[l * 3 + 2]);
+ glRotatef(bp->ang[l] + b * (360.0 / blades), 0.0, 0.0, 1.0);
+ glScalef(wobble * bp->sca[l], wobble * bp->sca[l], wobble * bp->sca[l]);
+ /**
+ if(tko & 0x40000) glColor3f(col[l*3], col[l*3+1], col[l*3+2]);
+ else
+ */
+ glColor4ub(0, 0, 0, 0x60);
+
+ /* constrain geep cooridinates here XXX */
+ glEnable(GL_BLEND);
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glVertex2f(x * bp->sca[l], 0.0);
+ glVertex2f(x, y);
+ glVertex2f(x, -y); /* C */
+ glVertex2f(0.3, 0.0); /* D */
+ polys += 2;
+ glEnd();
+
+ /**
+ if(tko++ & 0x40000) glColor3f(0,0,0);
+ else
+ */
+ glColor3f(bp->col[l * 3], bp->col[l * 3 + 1], bp->col[l * 3 + 2]);
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(x * bp->sca[l], 0.0);
+ glVertex2f(x, y);
+ glVertex2f(0.3, 0.0); /* D */
+ glVertex2f(x, -y); /* C */
+ polys += 3;
+ glEnd();
+ glDisable(GL_BLEND);
+
+ glPopMatrix();
+ }
+ return polys;
+}
+
+static void
+motionUpdate(noof_configuration *bp, int t)
+{
+ if (bp->pos[t * 3] < -bp->sca[t] * bp->wd && bp->dir[t * 3] < 0.0) {
+ bp->dir[t * 3] = -bp->dir[t * 3];
+ /**
+ acc[t*3+1] += 0.8*acc[t*3];
+ acc[t*3] = -0.8*acc[t*3];
+ */
+ } else if (bp->pos[t * 3] > (1 + bp->sca[t]) * bp->wd && bp->dir[t * 3] > 0.0) {
+ bp->dir[t * 3] = -bp->dir[t * 3];
+ /**
+ acc[t*3+1] += 0.8*acc[t*3];
+ acc[t*3] = -0.8*acc[t*3];
+ */
+ } else if (bp->pos[t * 3 + 1] < -bp->sca[t] * bp->ht && bp->dir[t * 3 + 1] < 0.0) {
+ bp->dir[t * 3 + 1] = -bp->dir[t * 3 + 1];
+ /**
+ acc[t*3] += 0.8*acc[t*3+1];
+ acc[t*3+1] = -0.8*acc[t*3+1];
+ */
+ } else if (bp->pos[t * 3 + 1] > (1 + bp->sca[t]) * bp->ht && bp->dir[t * 3 + 1] > 0.0) {
+ bp->dir[t * 3 + 1] = -bp->dir[t * 3 + 1];
+ /**
+ acc[t*3] += 0.8*acc[t*3+1];
+ acc[t*3+1] = -0.8*acc[t*3+1];
+ */
+ }
+
+ bp->pos[t * 3] += bp->dir[t * 3];
+ bp->pos[t * 3 + 1] += bp->dir[t * 3 + 1];
+ /**
+ dir[t*3] += acc[t*3];
+ dir[t*3+1] += acc[t*3+1];
+ */
+ bp->ang[t] += bp->spn[t];
+ bp->geep[t] += bp->peep[t];
+ if (bp->geep[t] > 360 * 5.0)
+ bp->geep[t] -= 360 * 5.0;
+ if (bp->ang[t] < 0.0) {
+ bp->ang[t] += 360.0;
+ }
+ if (bp->ang[t] > 360.0) {
+ bp->ang[t] -= 360.0;
+ }
+}
+
+static void
+colorUpdate(noof_configuration *bp, int i)
+{
+ if (bp->hsv[i * 3 + 1] <= 0.5 && bp->hpr[i * 3 + 1] < 0.0)
+ bp->hpr[i * 3 + 1] = -bp->hpr[i * 3 + 1]; /* adjust s */
+ if (bp->hsv[i * 3 + 1] >= 1.0 && bp->hpr[i * 3 + 1] > 0.0)
+ bp->hpr[i * 3 + 1] = -bp->hpr[i * 3 + 1]; /* adjust s */
+ if (bp->hsv[i * 3 + 2] <= 0.4 && bp->hpr[i * 3 + 2] < 0.0)
+ bp->hpr[i * 3 + 2] = -bp->hpr[i * 3 + 2]; /* adjust s */
+ if (bp->hsv[i * 3 + 2] >= 1.0 && bp->hpr[i * 3 + 2] > 0.0)
+ bp->hpr[i * 3 + 2] = -bp->hpr[i * 3 + 2]; /* adjust s */
+
+ bp->hsv[i * 3] += bp->hpr[i * 3];
+ bp->hsv[i * 3 + 1] += bp->hpr[i * 3 + 1];
+ bp->hsv[i * 3 + 2] += bp->hpr[i * 3 + 2];
+
+ /* --- hsv -> rgb --- */
+#define H(hhh) hhh[i*3 ]
+#define S(hhh) hhh[i*3+1]
+#define V(hhh) hhh[i*3+2]
+
+#define R(hhh) hhh[i*3 ]
+#define G(hhh) hhh[i*3+1]
+#define B(hhh) hhh[i*3+2]
+
+ if (V(bp->hsv) < 0.0)
+ V(bp->hsv) = 0.0;
+ if (V(bp->hsv) > 1.0)
+ V(bp->hsv) = 1.0;
+ if (S(bp->hsv) <= 0.0) {
+ R(bp->col) = V(bp->hsv);
+ G(bp->col) = V(bp->hsv);
+ B(bp->col) = V(bp->hsv);
+ } else {
+ float f, h, p, q, t, v;
+ int hi;
+
+ while (H(bp->hsv) < 0.0)
+ H(bp->hsv) += 360.0;
+ while (H(bp->hsv) >= 360.0)
+ H(bp->hsv) -= 360.0;
+
+ if (S(bp->hsv) < 0.0)
+ S(bp->hsv) = 0.0;
+ if (S(bp->hsv) > 1.0)
+ S(bp->hsv) = 1.0;
+
+ h = H(bp->hsv) / 60.0;
+ hi = (int) (h);
+ f = h - hi;
+ v = V(bp->hsv);
+ p = V(bp->hsv) * (1 - S(bp->hsv));
+ q = V(bp->hsv) * (1 - S(bp->hsv) * f);
+ t = V(bp->hsv) * (1 - S(bp->hsv) * (1 - f));
+
+ if (hi <= 0) {
+ R(bp->col) = v;
+ G(bp->col) = t;
+ B(bp->col) = p;
+ } else if (hi == 1) {
+ R(bp->col) = q;
+ G(bp->col) = v;
+ B(bp->col) = p;
+ } else if (hi == 2) {
+ R(bp->col) = p;
+ G(bp->col) = v;
+ B(bp->col) = t;
+ } else if (hi == 3) {
+ R(bp->col) = p;
+ G(bp->col) = q;
+ B(bp->col) = v;
+ } else if (hi == 4) {
+ R(bp->col) = t;
+ G(bp->col) = p;
+ B(bp->col) = v;
+ } else {
+ R(bp->col) = v;
+ G(bp->col) = p;
+ B(bp->col) = q;
+ }
+ }
+}
+
+static void
+gravity(noof_configuration *bp, float fx)
+{
+ int a, b;
+
+ for (a = 0; a < N_SHAPES; a++) {
+ for (b = 0; b < a; b++) {
+ float t, d2;
+
+ t = bp->pos[b * 3] - bp->pos[a * 3];
+ d2 = t * t;
+ t = bp->pos[b * 3 + 1] - bp->pos[a * 3 + 1];
+ d2 += t * t;
+ if (d2 < 0.000001)
+ d2 = 0.00001;
+ if (d2 < 0.1) {
+
+ float v0, v1, z;
+ v0 = bp->pos[b * 3] - bp->pos[a * 3];
+ v1 = bp->pos[b * 3 + 1] - bp->pos[a * 3 + 1];
+
+ z = 0.00000001 * fx / (d2);
+
+ bp->dir[a * 3] += v0 * z * bp->sca[b];
+ bp->dir[b * 3] += -v0 * z * bp->sca[a];
+ bp->dir[a * 3 + 1] += v1 * z * bp->sca[b];
+ bp->dir[b * 3 + 1] += -v1 * z * bp->sca[a];
+
+ }
+ }
+ /** apply brakes
+ if(dir[a*3]*dir[a*3] + dir[a*3+1]*dir[a*3+1]
+ > 0.0001) {
+ dir[a*3] *= 0.9;
+ dir[a*3+1] *= 0.9;
+ }
+ */
+ }
+}
+
+ENTRYPOINT void
+draw_noof (ModeInfo *mi)
+{
+ int i;
+ noof_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (!bp->glx_context)
+ return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* In the olden days, one could just render directly into the front buffer,
+ or fail to clear the back buffer and assume that one's bits were still
+ there. Not so on modern devices, particularly mobile. So to achieve
+ the effect of frame N+1 accumulating atop frame N, we must save and
+ restore a screenshot of frame N.
+ */
+ if (bp->screenshot_texture)
+ {
+ GLfloat tw = MI_WIDTH(mi) / (GLfloat) bp->tex_w;
+ GLfloat th = MI_HEIGHT(mi) / (GLfloat) bp->tex_h;
+ glDisable (GL_BLEND);
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, bp->screenshot_texture);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0); glVertex3f (0, 0, 0);
+ glTexCoord2f (tw, 0); glVertex3f (bp->wd, 0, 0);
+ glTexCoord2f (tw, th); glVertex3f (bp->wd, bp->ht, 0);
+ glTexCoord2f (0, th); glVertex3f (0, bp->ht, 0);
+ glEnd();
+ glDisable (GL_TEXTURE_2D);
+ glClear (GL_DEPTH_BUFFER_BIT);
+ }
+
+ mi->polygon_count = 0;
+
+ /**
+ if((random() & 0xff) == 0x34){
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
+
+ if((tko & 0x1f) == 0x1f){
+ glEnable(GL_BLEND);
+ glColor4f(0.0, 0.0, 0.0, 0.09);
+ glRectf(0.0, 0.0, wd, ht);
+ glDisable(GL_BLEND);
+#ifdef __sgi
+ sginap(0);
+#endif
+ }
+ */
+
+ gravity(bp, -2.0);
+ for (i = 0; i < N_SHAPES; i++) {
+ motionUpdate(bp, i);
+ colorUpdate(bp, i);
+ mi->polygon_count += drawleaf(bp, i);
+ }
+
+ if (bp->screenshot_texture) /* Store a screenshot into the texture. */
+ {
+ glDisable (GL_BLEND);
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, bp->screenshot_texture);
+ glCopyTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ check_gl_error("screenshot texture");
+ glDisable (GL_TEXTURE_2D);
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+
+ENTRYPOINT void
+reshape_noof(ModeInfo *mi, int w, int h)
+{
+ noof_configuration *bp = &bps[MI_SCREEN(mi)];
+ char *s;
+ glViewport(0, 0, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (w <= h) {
+ bp->wd = 1.0;
+ bp->ht = (GLfloat) h / (GLfloat) w;
+ glOrtho(0.0, 1.0,
+ 0.0, 1.0 * (GLfloat) h / (GLfloat) w,
+ -16.0, 4.0);
+ } else {
+ bp->wd = (GLfloat) w / (GLfloat) h;
+ bp->ht = 1.0;
+ glOrtho(0.0, 1.0 * (GLfloat) w / (GLfloat) h,
+ 0.0, 1.0,
+ -16.0, 4.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (!bp->screenshot_texture)
+ glGenTextures (1, &bp->screenshot_texture);
+
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, bp->screenshot_texture);
+
+ bp->tex_w = to_pow2 (MI_WIDTH(mi));
+ bp->tex_h = to_pow2 (MI_HEIGHT(mi));
+ s = calloc (4, bp->tex_w * bp->tex_h); /* init with black */
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, bp->tex_w, bp->tex_h, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, s);
+ check_gl_error ("texture generation");
+ free (s);
+ glDisable (GL_TEXTURE_2D);
+ glClear (GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT void
+init_noof (ModeInfo *mi)
+{
+ int i;
+ noof_configuration *bp;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ glEnable(GL_LINE_SMOOTH);
+ glShadeModel(GL_FLAT);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ for (i = 0; i < N_SHAPES; i++)
+ initshapes(bp, i);
+
+ reshape_noof (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+XSCREENSAVER_MODULE ("Noof", noof)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/noof.man b/hacks/glx/noof.man
new file mode 100644
index 0000000..f414571
--- /dev/null
+++ b/hacks/glx/noof.man
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+noof - draw rotatey patterns
+.SH SYNOPSIS
+.B dangerball
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws some rotatey patterns, using OpenGL.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Mark Kilgard. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Mark Kilgard <mjk@nvidia.com>
diff --git a/hacks/glx/normals.c b/hacks/glx/normals.c
new file mode 100644
index 0000000..16b9040
--- /dev/null
+++ b/hacks/glx/normals.c
@@ -0,0 +1,52 @@
+/* normals, Copyright (c) 2002-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Compute normal vectors for arbitrary triangles.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "normals.h"
+
+/* Calculate the unit normal at p given two other points p1,p2 on the
+ surface. The normal points in the direction of p1 crossproduct p2
+ */
+XYZ
+calc_normal (XYZ p, XYZ p1, XYZ p2)
+{
+ XYZ n, pa, pb;
+ pa.x = p1.x - p.x;
+ pa.y = p1.y - p.y;
+ pa.z = p1.z - p.z;
+ pb.x = p2.x - p.x;
+ pb.y = p2.y - p.y;
+ pb.z = p2.z - p.z;
+ n.x = pa.y * pb.z - pa.z * pb.y;
+ n.y = pa.z * pb.x - pa.x * pb.z;
+ n.z = pa.x * pb.y - pa.y * pb.x;
+ return (n);
+}
+
+/* Call glNormal3f() with a normal of the indicated triangle.
+ */
+void
+do_normal(GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat x3, GLfloat y3, GLfloat z3)
+{
+ XYZ p1, p2, p3, p;
+ p1.x = x1; p1.y = y1; p1.z = z1;
+ p2.x = x2; p2.y = y2; p2.z = z2;
+ p3.x = x3; p3.y = y3; p3.z = z3;
+ p = calc_normal (p1, p2, p3);
+ glNormal3f (p.x, p.y, p.z);
+}
diff --git a/hacks/glx/normals.h b/hacks/glx/normals.h
new file mode 100644
index 0000000..2200dfe
--- /dev/null
+++ b/hacks/glx/normals.h
@@ -0,0 +1,48 @@
+/* normals, Copyright (c) 2002-2012 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Compute normal vectors for arbitrary triangles.
+ */
+
+#ifndef __NORMALS_H__
+#define __NORMALS_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+typedef struct {
+ double x,y,z;
+} XYZ;
+
+/* Calculate the unit normal at p given two other points p1,p2 on the
+ surface. The normal points in the direction of p1 crossproduct p2
+ */
+extern XYZ calc_normal (XYZ p, XYZ p1, XYZ p2);
+
+/* Call glNormal3f() with a normal of the indicated triangle.
+ */
+extern void do_normal (GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat x3, GLfloat y3, GLfloat z3);
+
+#endif /* __NORMALS_H__ */
diff --git a/hacks/glx/peepers.c b/hacks/glx/peepers.c
new file mode 100644
index 0000000..02ebab8
--- /dev/null
+++ b/hacks/glx/peepers.c
@@ -0,0 +1,1455 @@
+/* peepers, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 14 Feb 2018, jwz.
+ *
+ * Floating eyeballs!
+ *
+ * Inspired by @PaintYourDragon's Adafruit Snake Eyes Raspberry Pi Bonnet
+ * https://learn.adafruit.com/animated-snake-eyes-bonnet-for-raspberry-pi/
+ * which is excellent.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 0 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_peepers 0
+# define release_peepers 0
+
+#define DEF_SPEED "1.0"
+#define DEF_MODE "random"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#ifndef HAVE_JWXYZ
+# include <X11/Xatom.h>
+#endif
+
+#include "images/gen/sclera_png.h"
+#include "images/gen/iris_png.h"
+
+#ifdef USE_GL /* whole file */
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+typedef struct {
+ int idx;
+ GLfloat x, y, z;
+ GLfloat dx, dy, dz;
+ GLfloat ddx, ddy, ddz;
+ rotator *rot;
+ struct { GLfloat from, to, current, tick; } dilation;
+ enum { ROTATE, SPIN, TRACK } focus;
+ XYZ track;
+ GLfloat tilt, roll;
+ GLfloat scale;
+ GLfloat color[4];
+ int jaundice;
+} floater;
+
+typedef enum { RETINA, IRIS, SCLERA, LENS, TICK } component;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+
+ Bool button_down_p;
+ XYZ mouse, last_mouse, fake_mouse;
+ time_t last_mouse_time;
+ int mouse_dx, mouse_dy;
+
+ GLuint retina_list, sclera_list, lens_list, iris_list;
+ GLuint sclera_texture, iris_texture;
+ int eye_polys;
+
+ int nfloaters;
+ floater *floaters;
+ enum { BOUNCE, SCROLL_LEFT, SCROLL_RIGHT, XEYES, BEHOLDER } mode;
+
+} peepers_configuration;
+
+static peepers_configuration *bps = NULL;
+
+static GLfloat speed;
+const char *mode_opt;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&mode_opt, "mode", "Mode", DEF_MODE, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt peepers_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Bottom edge of screen is -0.5; left and right scale by aspect. */
+#define BOTTOM (-1.6)
+#define LEFT (BOTTOM * MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+
+static void
+reset_floater (ModeInfo *mi, floater *f)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat r = ((bp->mode == BOUNCE ? LEFT : BOTTOM) *
+ (bp->nfloaters < 10 ? 0.3: 0.6));
+ GLfloat x, y;
+
+ if (bp->nfloaters <= 2)
+ {
+ x = frand(LEFT) * RANDSIGN() * 0.3;
+ y = 0;
+ }
+ else
+ {
+ /* Position them off screen in a circle */
+ GLfloat th = f->idx * (M_PI + (M_PI/6)) * 2 / bp->nfloaters;
+ x = r * cos (th);
+ y = r * sin (th) * 1.5; /* Oval */
+ }
+
+ switch (bp->mode) {
+ case BOUNCE:
+ f->x = x;
+ f->y = BOTTOM;
+ f->z = y;
+
+ /* Yes, I know I'm varying the force of gravity instead of varying the
+ launch velocity. That's intentional: empirical studies indicate
+ that it's way, way funnier that way. */
+
+ f->dy = 0.1;
+ f->dx = 0;
+ f->dz = 0;
+
+ {
+ GLfloat min = -0.004;
+ GLfloat max = -0.0019;
+ f->ddy = min + frand (max - min);
+ f->ddx = 0;
+ f->ddz = 0;
+ }
+
+ if (! (random() % (10 * bp->nfloaters)))
+ {
+ f->dx = BELLRAND(0.03) * RANDSIGN();
+ f->dz = BELLRAND(0.03) * RANDSIGN();
+ }
+ break;
+
+ case SCROLL_LEFT:
+ case SCROLL_RIGHT:
+
+ f->x = (bp->mode == SCROLL_LEFT ? -LEFT : LEFT);
+ f->y = x;
+ f->z = y;
+
+ f->dx = (1.0 + frand(2.0)) * 0.020 * (bp->mode == SCROLL_LEFT ? -1 : 1);
+ f->dy = (1.0 + frand(2.0)) * 0.002 * RANDSIGN();
+ f->dz = (1.0 + frand(2.0)) * 0.002 * RANDSIGN();
+ f->ddy = 0;
+ f->ddz = 0;
+ break;
+
+ case XEYES: /* This happens in layout_grid() */
+ break;
+ case BEHOLDER: /* This happens in layout_geodesic() */
+ break;
+
+ default:
+ abort();
+ }
+
+ f->focus = ((random() % 8) ? ROTATE :
+ (random() % 4) ? TRACK : SPIN);
+ f->track.x = 8 - frand(16);
+ f->track.y = 8 - frand(16);
+ f->track.z = 8 + frand(16);
+
+ f->tilt = 45 - BELLRAND(90);
+ f->roll = frand(180);
+ f->dilation.to = f->dilation.from = f->dilation.current = frand(1.0);
+ f->dilation.tick = 1;
+
+ f->scale = 0.8 + BELLRAND(0.2);
+
+ if (bp->nfloaters == 1) f->scale *= 0.5;
+ else if (bp->nfloaters <= 3) f->scale *= 0.4;
+ else if (bp->nfloaters <= 9) f->scale *= 0.3;
+ else if (bp->nfloaters <= 15) f->scale *= 0.2;
+ else if (bp->nfloaters <= 25) f->scale *= 0.15;
+ else if (bp->nfloaters <= 90) f->scale *= 0.12;
+ else f->scale *= 0.07;
+
+ if (MI_WIDTH(mi) < MI_HEIGHT(mi))
+ {
+ f->scale /= MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi) * 1.2;
+ }
+
+ {
+ static const struct { GLfloat pct; unsigned long c; } c[] = {
+ /* All of the articles that I found with percentages in them only
+ added up to around 70%, so who knows what that means. */
+# if 0
+ { 55, 0x985A07 }, /* brown -- supposedly real global percentage */
+# else
+ { 20, 0x985A07 }, /* brown -- but that's a lot of brown... */
+# endif
+ { 8, 0xD5AD68 }, /* hazel */
+ { 8, 0x777F92 }, /* blue */
+ { 2, 0x6B7249 }, /* green */
+ { 1, 0x7F7775 }, /* gray */
+ { 0.5, 0x9E8042 }, /* amber */
+ { 0.1, 0xFFAA88 }, /* red */
+ };
+ GLfloat p = 0, t = 0;
+ GLfloat s = 1 - frand(0.3);
+ int i;
+ for (i = 0; i < countof(c); i++)
+ p += c[i].pct;
+ p = frand(p);
+
+ for (i = 0; i < countof(c); i++)
+ {
+ if (t > p) break;
+ t += c[i].pct;
+ }
+
+ if (c[i].c == 0xFFAA88) f->jaundice = 2;
+ else if (!(random() % 20)) f->jaundice = 1;
+
+ f->color[0] = ((c[i].c >> 16) & 0xFF) / 255.0 * s;
+ f->color[1] = ((c[i].c >> 8) & 0xFF) / 255.0 * s;
+ f->color[2] = ((c[i].c >> 0) & 0xFF) / 255.0 * s;
+ f->color[3] = 1;
+ }
+}
+
+
+/* Place a grid of eyeballs on the screen, maximizing use of space.
+ */
+static void
+layout_grid (ModeInfo *mi)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ /* Distribute the eyes into a rectangular grid that fills the window.
+ There may be some empty cells. N items in a W x H rectangle:
+ N = W * H
+ N = W * W * R
+ N/R = W*W
+ W = sqrt(N/R)
+ */
+ GLfloat aspect = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ int nlines = sqrt (bp->nfloaters / aspect) + 0.5;
+ int *cols = (int *) calloc (nlines, sizeof(*cols));
+ int i, x, y, max = 0;
+ GLfloat scale, spacing;
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ cols[i % nlines]++;
+ if (cols[i % nlines] > max) max = cols[i % nlines];
+ }
+
+ /* That gave us, e.g. 7777666. Redistribute to 6767767. */
+ for (i = 0; i < nlines / 2; i += 2)
+ {
+ int j = nlines-i-1;
+ int swap = cols[i];
+ cols[i] = cols[j];
+ cols[j] = swap;
+ }
+
+ scale = 1.0 / nlines; /* Scale for height */
+ if (scale * max > aspect) /* Shrink if overshot width */
+ scale *= aspect / (scale * max);
+
+ scale *= 0.9; /* Add padding */
+ spacing = scale * 2.2;
+
+ if (bp->nfloaters == 1) spacing = 0;
+
+ i = 0;
+ for (y = 0; y < nlines; y++)
+ for (x = 0; x < cols[y]; x++)
+ {
+ floater *f = &bp->floaters[i];
+ f->scale = scale;
+ f->x = spacing * (x - cols[y] / 2.0) + spacing/2;
+ f->y = spacing * (y - nlines / 2.0) + spacing/2;
+ f->z = 0;
+ i++;
+ }
+ free (cols);
+}
+
+
+/* Computes the midpoint of a line between two polar coords.
+ */
+static void
+midpoint2 (LL v1, LL v2, LL *vm_ret,
+ XYZ *p1_ret, XYZ *p2_ret, XYZ *pm_ret)
+{
+ XYZ p1, p2, pm;
+ LL vm;
+ GLfloat hyp;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ pm.x = (p1.x + p2.x) / 2;
+ pm.y = (p1.y + p2.y) / 2;
+ pm.z = (p1.z + p2.z) / 2;
+
+ vm.o = atan2 (pm.y, pm.x);
+ hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
+ vm.a = atan2 (pm.z, hyp);
+
+ *p1_ret = p1;
+ *p2_ret = p2;
+ *pm_ret = pm;
+ *vm_ret = vm;
+}
+
+
+/* Computes the midpoint of a triangle specified in polar coords.
+ */
+static void
+midpoint3 (LL v1, LL v2, LL v3, LL *vm_ret,
+ XYZ *p1_ret, XYZ *p2_ret, XYZ *p3_ret, XYZ *pm_ret)
+{
+ XYZ p1, p2, p3, pm;
+ LL vm;
+ GLfloat hyp;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ p3.x = cos (v3.a) * cos (v3.o);
+ p3.y = cos (v3.a) * sin (v3.o);
+ p3.z = sin (v3.a);
+
+ pm.x = (p1.x + p2.x + p3.x) / 3;
+ pm.y = (p1.y + p2.y + p3.y) / 3;
+ pm.z = (p1.z + p2.z + p3.z) / 3;
+
+ vm.o = atan2 (pm.y, pm.x);
+ hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
+ vm.a = atan2 (pm.z, hyp);
+
+ *p1_ret = p1;
+ *p2_ret = p2;
+ *p3_ret = p3;
+ *pm_ret = pm;
+ *vm_ret = vm;
+}
+
+
+/* Place the eyeballs on a sphere (geodesic)
+ */
+static void
+layout_geodesic_triangle (ModeInfo *mi, LL v1, LL v2, LL v3, int depth,
+ int *i)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (depth <= 0)
+ {
+ floater *f = &bp->floaters[*i];
+ GLfloat s2 = 0.7;
+ LL vc;
+ XYZ p1, p2, p3, pc;
+ if (*i >= bp->nfloaters) abort();
+
+ midpoint3 (v1, v2, v3, &vc, &p1, &p2, &p3, &pc);
+
+ switch (bp->nfloaters) { /* This is lame. */
+ case 20: f->scale = 0.26; break;
+ case 80: f->scale = 0.13; break;
+ case 320: f->scale = 0.065; break;
+ case 1280: f->scale = 0.0325; break;
+ default: abort();
+ }
+
+ f->z = s2 * cos (vc.a) * cos (vc.o);
+ f->x = s2 * cos (vc.a) * sin (vc.o);
+ f->y = s2 * sin (vc.a);
+ (*i)++;
+ }
+ else
+ {
+ LL v12, v23, v13;
+ XYZ p1, p2, p3, p12, p23, p13;
+
+ midpoint2 (v1, v2, &v12, &p1, &p2, &p12);
+ midpoint2 (v2, v3, &v23, &p2, &p3, &p23);
+ midpoint2 (v1, v3, &v13, &p1, &p3, &p13);
+ depth--;
+
+ layout_geodesic_triangle (mi, v1, v12, v13, depth, i);
+ layout_geodesic_triangle (mi, v12, v2, v23, depth, i);
+ layout_geodesic_triangle (mi, v13, v23, v3, depth, i);
+ layout_geodesic_triangle (mi, v12, v23, v13, depth, i);
+ }
+}
+
+
+/* Creates triangles of a geodesic to the given depth (frequency).
+ */
+static void
+layout_geodesic (ModeInfo *mi)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ int depth;
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+ int ii = 0;
+
+ switch (bp->nfloaters) { /* This is lame. */
+ case 20: depth = 0; break;
+ case 80: depth = 1; break;
+ case 320: depth = 2; break;
+ case 1280: depth = 3; break;
+ default: abort();
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (i & 1) /* north */
+ {
+ layout_geodesic_triangle (mi, v1, v2, vc, depth, &ii);
+ layout_geodesic_triangle (mi, v2, v1, v3, depth, &ii);
+ }
+ else /* south */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ layout_geodesic_triangle (mi, v2, v1, vc, depth, &ii);
+ layout_geodesic_triangle (mi, v1, v2, v3, depth, &ii);
+ }
+ }
+
+ bp->floaters[0].dx = BELLRAND(0.01) * RANDSIGN();
+}
+
+
+/* Advance the animation by one step.
+ */
+static void
+tick_floater (ModeInfo *mi, floater *f)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ /* if (bp->button_down_p) return;*/
+
+ f->dx += f->ddx * speed * 0.5;
+ f->dy += f->ddy * speed * 0.5;
+ f->dz += f->ddz * speed * 0.5;
+
+ if (bp->mode != BEHOLDER)
+ {
+ f->x += f->dx * speed * 0.5;
+ f->y += f->dy * speed * 0.5;
+ f->z += f->dz * speed * 0.5;
+ }
+
+ f->dilation.tick += 0.1 * speed;
+ if (f->dilation.tick > 1) f->dilation.tick = 1;
+ if (f->dilation.tick < 0) f->dilation.tick = 0;
+
+ f->dilation.current = (f->dilation.from +
+ ((f->dilation.to - f->dilation.from) *
+ f->dilation.tick));
+
+ if (f->dilation.tick == 1 && !(random() % 20))
+ {
+ f->dilation.from = f->dilation.to;
+ f->dilation.to = frand(1.0);
+ f->dilation.tick = 0;
+ }
+
+ switch (bp->mode) {
+ case BOUNCE:
+ if (f->y < BOTTOM ||
+ f->x < LEFT || f->x > -LEFT)
+ reset_floater (mi, f);
+ break;
+ case SCROLL_LEFT:
+ if (f->x < LEFT)
+ reset_floater (mi, f);
+ break;
+ case SCROLL_RIGHT:
+ if (f->x > -LEFT)
+ reset_floater (mi, f);
+ break;
+ case XEYES:
+ break;
+ case BEHOLDER:
+ {
+ GLfloat x = f->x;
+ GLfloat y = f->z;
+ GLfloat th = atan2 (y, x);
+ GLfloat r = sqrt(x*x + y*y);
+ th += bp->floaters[0].dx;
+ f->x = r*cos(th);
+ f->z = r*sin(th);
+
+ if (! (random() % 100))
+ bp->floaters[0].dx += frand(0.0001) * RANDSIGN();
+ }
+ break;
+ default:
+ abort();
+ }
+}
+
+
+/* Make sure none of the eyeballs overlap.
+ */
+static void
+de_collide (ModeInfo *mi)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i, j;
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f0 = &bp->floaters[i];
+ for (j = i+1; j < bp->nfloaters; j++)
+ {
+ floater *f1 = &bp->floaters[j];
+ GLfloat X = f1->x - f0->x;
+ GLfloat Y = f1->y - f0->y;
+ GLfloat Z = f1->z - f0->z;
+ GLfloat min = (f0->scale + f1->scale);
+ GLfloat d2 = X*X + Y*Y + Z*Z;
+ if (d2 < min*min)
+ {
+ GLfloat d = sqrt (d2);
+ GLfloat dd = 0.5 * (min - d) / 2;
+ GLfloat dx = X * dd;
+ GLfloat dy = Y * dd;
+ GLfloat dz = Z * dd;
+ f0->x -= dx; f0->y -= dy; f0->z -= dz;
+ f1->x += dx; f1->y += dy; f1->z += dz;
+ }
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_peepers (ModeInfo *mi, int width, int height)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if (bp->mode == XEYES)
+ layout_grid (mi);
+}
+
+
+/* Find the mouse pointer on the screen and note its position in the scene.
+ */
+static void
+track_mouse (ModeInfo *mi)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ Window r, c;
+ int x, y, rx, ry;
+ unsigned int m;
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+ int rot = (int) current_device_rotation();
+ int swap;
+ GLfloat ys = 2.0;
+ GLfloat xs = ys * w / h;
+ time_t now = time ((time_t *) 0);
+
+ XQueryPointer (MI_DISPLAY (mi), MI_WINDOW (mi),
+ &r, &c, &rx, &ry, &x, &y, &m);
+
+ if (x != bp->last_mouse.x && y != bp->last_mouse.y)
+ {
+ bp->last_mouse_time = now;
+ bp->fake_mouse.x = x;
+ bp->fake_mouse.y = y;
+ bp->mouse_dx = 0;
+ bp->mouse_dy = 0;
+ bp->last_mouse.x = x;
+ bp->last_mouse.y = y;
+ }
+ else if (now > bp->last_mouse_time + 10)
+ {
+ /* Mouse isn't moving. Bored now. */
+ if (! (random() % 20)) bp->mouse_dx += (random() % 2) * RANDSIGN();
+ if (! (random() % 20)) bp->mouse_dy += (random() % 2) * RANDSIGN();
+ bp->fake_mouse.x += bp->mouse_dx;
+ bp->fake_mouse.y += bp->mouse_dy;
+ x = bp->fake_mouse.x;
+ y = bp->fake_mouse.y;
+ }
+
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+
+ if (rot > 135 || rot < -135) /* 180 */
+ {
+ x = w - x;
+ y = h - y;
+ }
+ else if (rot > 45) /* 90 */
+ {
+ swap = x; x = y; y = swap;
+ swap = w; w = h; h = swap;
+ xs = ys;
+ ys = xs * w / h;
+ x = w - x;
+ }
+ else if (rot < -45) /* 270 */
+ {
+ swap = x; x = y; y = swap;
+ swap = w; w = h; h = swap;
+ xs = ys;
+ ys = xs * w / h;
+ y = h - y;
+ }
+
+ /* Put the mouse directly on the glass. */
+ x = x - w / 2;
+ y = h / 2 - y;
+ bp->mouse.x = xs * x / w;
+ bp->mouse.y = ys * y / h;
+ bp->mouse.z = 0;
+
+# if 0
+ glPushMatrix();
+ glTranslatef (bp->mouse.x, bp->mouse.y, bp->mouse.z);
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ glColor3f(1,1,1);
+ glBegin(GL_LINES);
+ glVertex3f(-1,0,0); glVertex3f(1,0,0);
+ glVertex3f(0,-1,0); glVertex3f(0,1,0);
+ glVertex3f(0,0,-1); glVertex3f(0,0,1);
+ glEnd();
+ glPopMatrix();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+# endif
+
+ /* Move it farther into the scene: on the glass is too far away.
+ But keep it farther away the farther outside the window the
+ mouse is, so the eyes don''t turn 90 degrees sideways.
+ */
+ bp->mouse.x *= 0.8;
+ bp->mouse.y *= 0.8;
+ bp->mouse.z += 0.7;
+
+ bp->mouse.z = MAX (0.7,
+ sqrt (bp->mouse.x * bp->mouse.x +
+ bp->mouse.y * bp->mouse.y));
+
+ if (bp->mode == BEHOLDER)
+ bp->mouse.z += 0.25;
+
+
+# if 0
+ glPushMatrix();
+ glTranslatef (bp->mouse.x, bp->mouse.y, bp->mouse.z);
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ glColor3f(1,0,1);
+ glBegin(GL_LINES);
+ glVertex3f(-1,0,0); glVertex3f(1,0,0);
+ glVertex3f(0,-1,0); glVertex3f(0,1,0);
+ glVertex3f(0,0,-1); glVertex3f(0,0,1);
+ glEnd();
+ glPopMatrix();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+# endif
+}
+
+
+ENTRYPOINT Bool
+peepers_handle_event (ModeInfo *mi, XEvent *event)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ {
+ if (bp->button_down_p) /* Aim each eyeball at the mouse. */
+ {
+ int i;
+ track_mouse (mi);
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ f->track = bp->mouse;
+ f->focus = TRACK;
+ }
+ }
+
+ return True;
+ }
+
+ return False;
+}
+
+
+/* Generate the polygons for the display lists.
+ This routine generates the various styles of sphere-oid we use.
+ */
+static int
+draw_ball (ModeInfo *mi, component which)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ GLfloat iris_ratio = 0.42; /* Size of the iris. */
+ /* The lens bulges out, but the iris bulges in, sorta. */
+ GLfloat lens_bulge = (which == IRIS ? -0.50 : 0.32);
+
+ GLfloat xstep = 32; /* Facets on the sphere */
+ GLfloat ystep = 32;
+ XYZ *stacks, *normals;
+ GLfloat x, y, z;
+ int i, j;
+ int xstart, xstop;
+
+ if (bp->nfloaters > 16 || wire)
+ xstep = ystep = 16;
+
+ if (bp->nfloaters > 96 && which == LENS)
+ return 0;
+
+ switch (which) {
+ case LENS: xstart = 0; xstop = xstep; break;
+ case SCLERA: xstart = 0; xstop = xstep * (1 - iris_ratio/2); break;
+ case IRIS: xstart = xstep * (1 - iris_ratio/2 * 1.2); xstop = xstep; break;
+ case RETINA: xstart = xstep * (1 - iris_ratio/2 * 1.2); xstop = 0; break;
+ default: abort(); break;
+ }
+
+ stacks = (XYZ *) calloc (sizeof(*stacks), xstep + 1);
+ normals = (XYZ *) calloc (sizeof(*stacks), xstep + 1);
+
+ if (which == RETINA)
+ {
+ GLfloat c1[4] = { 0, 0, 0, 1 };
+ GLfloat c2[4] = { 0.15, 0, 0, 1 };
+ GLfloat th = M_PI * (1.0 - iris_ratio/2);
+ GLfloat z1 = cos(th);
+ GLfloat z2 = 0.9;
+ GLfloat r1 = sin(th);
+ GLfloat r2 = r1 * 0.3;
+
+ if (!wire)
+ {
+ glColor4fv (c1);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, c1);
+ }
+
+ /* Draw a black cone to occlude the interior of the eye. */
+
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i <= xstep; i++)
+ {
+ GLfloat th2 = i * M_PI * 2 / xstep;
+ GLfloat x = cos(th2);
+ GLfloat y = sin(th2);
+ glNormal3f (0, 0, 1);
+ glVertex3f (z1, r1 * x, r1 * y);
+ glNormal3f (0, 0, 1);
+ glVertex3f (z2, r2 * x, r2 * y);
+ polys++;
+ }
+ glEnd();
+
+ if (!wire)
+ {
+ glColor4fv (c2);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, c2);
+ }
+
+ /* Draw a small red circle at the base of the cone. */
+
+ glBegin (wire ? GL_LINES : GL_TRIANGLE_FAN);
+ glVertex3f (z2, 0, 0);
+ glNormal3f (0, 0, 1);
+ for (i = xstep; i >= 0; i--)
+ {
+ GLfloat th2 = i * M_PI * 2 / xstep;
+ GLfloat x = cos(th2);
+ GLfloat y = sin(th2);
+ glVertex3f (z2, r2 * x, r2 * y);
+ polys++;
+ }
+ glEnd();
+ return polys;
+ }
+
+ for (i = xstart; i <= xstop; i++)
+ {
+ GLfloat th = i * M_PI / xstep;
+ GLfloat x = cos(th);
+ GLfloat y = sin(th);
+
+ /* Bulge the lens, or dimple the iris. */
+ if (th > M_PI * (1.0 - iris_ratio/2) &&
+ th < M_PI * (1.0 + iris_ratio/2))
+ {
+ GLfloat r = (1 - th / M_PI) / iris_ratio * 2;
+ r = cos (M_PI * r / 2);
+ r *= lens_bulge;
+ r = r * r * (lens_bulge < 0 ? -1 : 1);
+ x *= 1+r;
+ y *= 1+r;
+ }
+
+ stacks[i].x = x;
+ stacks[i].y = y;
+ stacks[i].z = 0;
+ }
+
+ /* Fill normals with the normal at the center of each face. */
+ for (i = xstart; i < xstop; i++)
+ {
+ GLfloat dx = stacks[i+1].x - stacks[i].x;
+ GLfloat dy = stacks[i+1].y - stacks[i].y;
+ y = dy/dx;
+ z = sqrt (1 + y*y);
+ normals[i].x = -y/z;
+ normals[i].y = 1/z;
+ normals[i].z = 0;
+
+ if (lens_bulge < 0 && i > xstep * (1 - iris_ratio/2) + 1)
+ {
+ normals[i].x *= -1;
+ normals[i].y *= -1;
+ }
+ }
+
+ if (!wire)
+ glBegin (GL_QUADS);
+
+ for (i = xstart; i < xstop; i++)
+ {
+ GLfloat x0 = stacks[i].x;
+ GLfloat x1 = stacks[i+1].x;
+ GLfloat r0 = stacks[i].y;
+ GLfloat r1 = stacks[i+1].y;
+
+ for (j = 0; j < ystep*2; j++)
+ {
+ GLfloat tha = j * M_PI / ystep;
+ GLfloat thb = (j+1) * M_PI / ystep;
+ GLfloat xa = cos (tha);
+ GLfloat ya = sin (tha);
+ GLfloat xb = cos (thb);
+ GLfloat yb = sin (thb);
+
+ /* Each vertex normal is average of adjacent face normals. */
+
+ XYZ p1, p2, p3, p4;
+ XYZ n1, n2, n3, n4;
+ p1.x = x0; p1.y = r0 * ya; p1.z = r0 * xa;
+ p2.x = x1; p2.y = r1 * ya; p2.z = r1 * xa;
+ p3.x = x1; p3.y = r1 * yb; p3.z = r1 * xb;
+ p4.x = x0; p4.y = r0 * yb; p4.z = r0 * xb;
+
+ if (i == 0)
+ {
+ n1.x = 1; n1.y = 0; n1.z = 0;
+ n4.x = 1; n4.y = 0; n4.z = 0;
+ }
+ else
+ {
+ x = (normals[i-1].x + normals[i].x) / 2;
+ y = (normals[i-1].y + normals[i].y) / 2;
+ n1.x = x; n1.z = y * xa; n1.y = y * ya;
+ n4.x = x; n4.z = y * xb; n4.y = y * yb;
+ }
+
+ if (i == xstep-1)
+ {
+ n2.x = -1; n2.y = 0; n2.z = 0;
+ n3.x = -1; n3.y = 0; n3.z = 0;
+ }
+ else
+ {
+ x = (normals[i+1].x + normals[i].x) / 2;
+ y = (normals[i+1].y + normals[i].y) / 2;
+ n2.x = x; n2.z = y * xa; n2.y = y * ya;
+ n3.x = x; n3.z = y * xb; n3.y = y * yb;
+ }
+
+#if 0
+ /* Render normals as lines for debugging */
+ glBegin(GL_LINES);
+ glVertex3f(p1.x, p1.y, p1.z);
+ glVertex3f(p1.x + n1.x * 0.3, p1.y + n1.y * 0.3, p1.z + n1.z * 0.3);
+ glEnd();
+
+ glBegin(GL_LINES);
+ glVertex3f(p2.x, p2.y, p2.z);
+ glVertex3f(p2.x + n2.x * 0.3, p2.y + n2.y * 0.3, p2.z + n2.z * 0.3);
+ glEnd();
+
+ glBegin(GL_LINES);
+ glVertex3f(p3.x, p3.y, p3.z);
+ glVertex3f(p3.x + n3.x * 0.3, p3.y + n3.y * 0.3, p3.z + n3.z * 0.3);
+ glEnd();
+
+ glBegin(GL_LINES);
+ glVertex3f(p4.x, p4.y, p4.z);
+ glVertex3f(p4.x + n4.x * 0.3, p4.y + n4.y * 0.3, p4.z + n4.z * 0.3);
+ glEnd();
+#endif
+
+ if (wire)
+ glBegin (GL_LINE_LOOP);
+
+ glTexCoord2f ((j+1) / (GLfloat) ystep / 2,
+ (i - xstart) / (GLfloat) (xstop - xstart));
+
+ glNormal3f (n4.x, n4.y, n4.z);
+ glVertex3f (p4.x, p4.y, p4.z);
+
+ glTexCoord2f ((j+1) / (GLfloat) ystep / 2,
+ ((i+1) - xstart) / (GLfloat) (xstop - xstart));
+
+ glNormal3f (n3.x, n3.y, n3.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+
+ glTexCoord2f (j / (GLfloat) ystep / 2,
+ ((i+1) - xstart) / (GLfloat) (xstop - xstart));
+
+ glNormal3f (n2.x, n2.y, n2.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+
+ glTexCoord2f (j / (GLfloat) ystep / 2,
+ (i - xstart) / (GLfloat) (xstop - xstart));
+
+ glNormal3f (n1.x, n1.y, n1.z);
+ glVertex3f (p1.x, p1.y, p1.z);
+
+ polys++;
+
+ if (wire)
+ glEnd();
+ }
+ }
+
+ if (!wire)
+ glEnd();
+
+ free (stacks);
+ free (normals);
+
+ return polys;
+}
+
+
+ENTRYPOINT void
+init_peepers (ModeInfo *mi)
+{
+ peepers_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_peepers (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+
+ if (!wire)
+ {
+ XImage *xi;
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+ GLfloat amb[4] = {0.1, 0.1, 0.1, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_BLEND);
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ sclera_png, sizeof(sclera_png));
+ glGenTextures (1, &bp->sclera_texture);
+ glBindTexture (GL_TEXTURE_2D, bp->sclera_texture);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ xi->width, xi->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
+ check_gl_error("texture");
+ XDestroyImage (xi);
+
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ iris_png, sizeof(iris_png));
+
+ glGenTextures (1, &bp->iris_texture);
+ glBindTexture (GL_TEXTURE_2D, bp->iris_texture);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ xi->width, xi->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
+ check_gl_error("texture");
+ XDestroyImage (xi);
+
+
+ }
+
+ bp->lens_list = glGenLists (1);
+ glNewList (bp->lens_list, GL_COMPILE);
+ bp->eye_polys += draw_ball (mi, LENS);
+ glEndList ();
+
+ bp->sclera_list = glGenLists (1);
+ glNewList (bp->sclera_list, GL_COMPILE);
+ bp->eye_polys += draw_ball (mi, SCLERA);
+ glEndList ();
+
+ bp->iris_list = glGenLists (1);
+ glNewList (bp->iris_list, GL_COMPILE);
+ bp->eye_polys += draw_ball (mi, IRIS);
+ glEndList ();
+
+ bp->retina_list = glGenLists (1);
+ glNewList (bp->retina_list, GL_COMPILE);
+ bp->eye_polys += draw_ball (mi, RETINA);
+ glEndList ();
+
+ bp->trackball = gltrackball_init (False);
+
+ if (!mode_opt || !*mode_opt || !strcasecmp (mode_opt, "random"))
+ bp->mode = ((random() & 1) ? BOUNCE :
+ ((random() & 1) ? SCROLL_LEFT : SCROLL_RIGHT));
+ else if (!strcasecmp (mode_opt, "bounce"))
+ bp->mode = BOUNCE;
+ else if (!strcasecmp (mode_opt, "scroll"))
+ bp->mode = (random() & 1) ? SCROLL_LEFT : SCROLL_RIGHT;
+ else if (!strcasecmp (mode_opt, "xeyes"))
+ bp->mode = XEYES;
+ else if (!strcasecmp (mode_opt, "beholder") ||
+ !strcasecmp (mode_opt, "ball"))
+ bp->mode = BEHOLDER;
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be bounce, scroll, random, xeyes or beholder,"
+ " not \"%s\"\n",
+ progname, mode_opt);
+ exit (1);
+ }
+
+ bp->nfloaters = MI_COUNT (mi);
+
+ if (bp->nfloaters <= 0)
+ {
+ if (bp->mode == XEYES)
+ bp->nfloaters = 2 + (random() % 30);
+ else if (bp->mode == BEHOLDER)
+ bp->nfloaters = 20 * pow (4, (random() % 4));
+ else
+ bp->nfloaters = 2 + (random() % 6);
+ }
+
+ if (bp->mode == BEHOLDER)
+ {
+ if (bp->nfloaters <= 20) bp->nfloaters = 20; /* This is lame */
+ else if (bp->nfloaters <= 80) bp->nfloaters = 80;
+ else if (bp->nfloaters <= 320) bp->nfloaters = 320;
+ else bp->nfloaters = 1280;
+ }
+
+ bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ f->idx = i;
+ f->rot = make_rotator (10.0, 0, 0,
+ 4, 0.05 * speed,
+ True);
+ if (bp->nfloaters == 2)
+ {
+ f->x = 10 * (i ? 1 : -1);
+ }
+ else if (i != 0)
+ {
+ double th = (i - 1) * M_PI*2 / (bp->nfloaters-1);
+ double r = LEFT * 0.3;
+ f->x = r * cos(th);
+ f->z = r * sin(th);
+ }
+
+ if (bp->mode == SCROLL_LEFT || bp->mode == SCROLL_RIGHT)
+ {
+ f->y = f->x;
+ f->x = 0;
+ }
+
+ reset_floater (mi, f);
+ }
+
+ if (bp->mode == XEYES)
+ layout_grid (mi);
+ else if (bp->mode == BEHOLDER)
+ layout_geodesic (mi);
+
+# ifndef HAVE_JWXYZ /* Real X11 */
+# if 0 /* I wonder if this works? */
+ if (bp->mode == XEYES && MI_WIN_IS_INWINDOW (mi))
+ {
+ uint32_t ca = 0;
+ glClearColor (0, 0, 0, 0);
+ XChangeProperty (MI_DISPLAY(mi), MI_WINDOW(mi),
+ XInternAtom (MI_DISPLAY(mi),
+ "_NET_WM_WINDOW_OPACITY", 0),
+ XA_CARDINAL, 32, PropModeReplace,
+ (uint8_t *) &ca, 1);
+ }
+# endif
+# endif
+}
+
+
+static void
+draw_floater (ModeInfo *mi, floater *f, component which)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ double x, y, z;
+
+ GLfloat spc[4] = { 1.0, 1.0, 1.0, 1.0 };
+ GLfloat c2[4] = { 1.0, 1.0, 1.0, 1.0 };
+ GLfloat c2b[4] = { 1.0, 0.6, 0.6, 1.0 };
+ GLfloat c2c[4] = { 1.0, 1.0, 0.65, 1.0 };
+ GLfloat c3[4] = { 0.6, 0.6, 0.6, 0.25 };
+
+ get_position (f->rot, &x, &y, &z,
+ which == LENS && !bp->button_down_p);
+
+ if (bp->nfloaters == 2 &&
+ f != &bp->floaters[0] &&
+ (bp->mode == BOUNCE || bp->mode == XEYES))
+ {
+ /* When there are exactly two eyes, track them together. */
+ floater *f0 = &bp->floaters[0];
+ double x0, y0, z0;
+ get_position (f0->rot, &x0, &y0, &z0, 0);
+ x = x0;
+ y = 1-y0; /* This is rotation: what the eye is looking at */
+ z = z0;
+ if (bp->mode != XEYES)
+ {
+ f->x = f0->x + f0->scale * 3;
+ f->y = f0->y;
+ f->z = f0->z;
+ }
+ f->dilation = f0->dilation;
+ f->focus = f0->focus;
+ f->track = f0->track;
+ f->tilt = f0->tilt;
+ f->scale = f0->scale;
+ f->jaundice = f0->jaundice;
+ if (f->focus == ROTATE)
+ f->focus = f0->focus = TRACK;
+ memcpy (f->color, f0->color, sizeof(f0->color));
+ }
+
+ glPushMatrix();
+ glTranslatef (f->x, f->y, f->z);
+
+ /* gltrackball_rotate (bp->trackball); */
+
+ switch (f->focus) {
+ case ROTATE:
+ glRotatef (y * 180, 0, 1, 0);
+ glRotatef (f->tilt, 0, 0, 1);
+ break;
+ case SPIN:
+ glRotatef (y * 360 + 90, 0, 1, 0);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ break;
+ case TRACK:
+ {
+ GLfloat X, Y, Z;
+ X = f->track.x - f->x;
+ Y = f->track.z - f->z;
+ Z = f->track.y - f->y;
+ if (X != 0 || Y != 0)
+ {
+ GLfloat facing = atan2 (X, Y) * (180 / M_PI);
+ GLfloat pitch = atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI);
+ glRotatef (90, 0, 1, 0);
+ glRotatef (facing, 0, 1, 0);
+ glRotatef (-pitch, 0, 0, 1);
+ }
+ }
+
+ break;
+ default:
+ abort();
+ }
+
+ glRotatef (f->roll, 1, 0, 0);
+ glScalef (f->scale, f->scale, f->scale);
+
+ if (! wire)
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ switch (which) {
+ case RETINA:
+ if (!wire)
+ {
+ glScalef (0.96, 0.96, 0.96);
+ glCallList (bp->retina_list);
+ }
+ break;
+
+ case IRIS:
+ glColor4fv (f->color);
+ if (! wire)
+ {
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spc);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 10);
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, f->color);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 20);
+
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, bp->iris_texture);
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity();
+ glScalef (1, 1.25 + f->dilation.current * 0.3, 1);
+ glMatrixMode (GL_MODELVIEW);
+ }
+ glScalef (0.96, 0.96, 0.96);
+ glCallList (bp->iris_list);
+
+ if (! wire)
+ {
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode (GL_MODELVIEW);
+ }
+ break;
+
+ case SCLERA:
+ if (! wire)
+ {
+ GLfloat *c = (f->jaundice == 2 ? c2b : f->jaundice == 1 ? c2c : c2);
+ glColor4fv (c);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ glBindTexture (GL_TEXTURE_2D, bp->sclera_texture);
+
+ glScalef (0.98, 0.98, 0.98);
+ glCallList (bp->sclera_list);
+ }
+ break;
+
+ case LENS:
+ glColor4fv (c3);
+ if (! wire)
+ {
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c3);
+ glDisable (GL_TEXTURE_2D);
+ }
+ glCallList (bp->lens_list);
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ glPopMatrix();
+}
+
+
+ENTRYPOINT void
+draw_peepers (ModeInfo *mi)
+{
+ peepers_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glRotatef (current_device_rotation(), 0, 0, 1);
+
+
+ /* Scale so that screen is 1 high and w/h wide. */
+ glScalef (8, 8, 8);
+
+ mi->polygon_count = 0;
+
+ if (bp->mode == XEYES || bp->mode == BEHOLDER)
+ {
+ int i;
+ track_mouse (mi);
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ f->track = bp->mouse;
+ f->focus = TRACK;
+ }
+ }
+
+# if 0
+ {
+ /* Draw just one */
+ component j;
+ floater F;
+ reset_floater(mi, &F);
+ F.x = F.y = F.z = 0;
+ F.dx = F.dy = F.dz = 0;
+ F.ddx = F.ddy = F.ddz = 0;
+ F.scale = 1;
+ F.focus = TRACK;
+ F.dilation.current = 0;
+ F.track.x = F.track.y = F.track.z = 0;
+ F.rot = make_rotator (0, 0, 0, 1, 0, False);
+ glRotatef(180,0,1,0);
+ glRotatef(15,1,0,0);
+ for (j = RETINA; j <= LENS; j++)
+ draw_floater (mi, &F, j);
+ mi->polygon_count += bp->eye_polys;
+ }
+# else
+ {
+ component j;
+ int i;
+ for (j = RETINA; j <= TICK; j++)
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ if (j == TICK)
+ tick_floater (mi, f);
+ else
+ draw_floater (mi, f, j);
+ }
+
+ if (bp->mode != BEHOLDER)
+ de_collide (mi);
+
+ mi->polygon_count += bp->eye_polys * bp->nfloaters;
+ }
+# endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Peepers", peepers)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/peepers.man b/hacks/glx/peepers.man
new file mode 100644
index 0000000..d30c883
--- /dev/null
+++ b/hacks/glx/peepers.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+peepers - floating eyeballs.
+.SH SYNOPSIS
+.B peepers
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-mode bounce | scroll | random]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Eyeballs. They float. They bounce. They stare at your cursor.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Number of eyes. 0 means random.
+.TP 8
+.B \-mode bounce
+The eyeballs bounce onto the screen from the bottom. Like a cow.
+.TP 8
+.B \-mode scroll
+The eyeballs scroll in from the left and right.
+.TP 8
+.B \-mode xeyes
+The eyeballs remain stationary, but always turn to stare at the mouse
+pointer, wherever it happens to be on the screen. Perhaps best used
+in conjunction with \fI\-count 2\fP.
+.TP 8
+.B \-mode beholder
+Render a ball made of eyeballs, all looking at you. Valid \fI\-count\fP
+values are 20, 80, 320 or 1280.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/photopile.c b/hacks/glx/photopile.c
new file mode 100644
index 0000000..e060f25
--- /dev/null
+++ b/hacks/glx/photopile.c
@@ -0,0 +1,833 @@
+/* photopile, Copyright (c) 2008-2018 Jens Kilian <jjk@acm.org>
+ * Based on carousel, Copyright (c) 2005-2008 Jamie Zawinski <jwz@jwz.org>
+ * Loads a sequence of images and shuffles them into a pile.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define DEF_FONT "OCR A Std 48, Lucida Console 48, Monaco 48"
+#elif 0 /* real X11, XQueryFont() */
+# define DEF_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+#else /* real X11, load_font_retry() */
+# define DEF_FONT "-*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*"
+#endif
+
+#define DEFAULTS "*count: 7 \n" \
+ "*delay: 10000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*useSHM: True \n" \
+ "*font: " DEF_FONT "\n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_photopile 0
+# define release_photopile 0
+# define photopile_handle_event xlockmore_no_events
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h> /* for XrmDatabase in -debug mode */
+#endif
+#include <math.h>
+
+#include "xlockmore.h"
+#include "grab-ximage.h"
+#include "texfont.h"
+#include "dropshadow.h"
+
+#ifdef USE_GL
+
+# define DEF_SCALE "0.4"
+# define DEF_MAX_TILT "50"
+# define DEF_SPEED "1.0"
+# define DEF_DURATION "5"
+# define DEF_MIPMAP "True"
+# define DEF_TITLES "True"
+# define DEF_POLAROID "True"
+# define DEF_CLIP "True"
+# define DEF_SHADOWS "True"
+# define DEF_DEBUG "False"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+typedef struct {
+ GLfloat x, y; /* position on screen */
+ GLfloat angle; /* rotation angle */
+
+} position;
+
+typedef struct {
+ Bool loaded_p; /* true if image can be drawn */
+
+ char *title; /* the filename of this image */
+ int w, h; /* size in pixels of the image */
+ int tw, th; /* size in pixels of the texture */
+ XRectangle geom; /* where in the image the bits are */
+
+ position pos[4]; /* control points for calculating position */
+
+ GLuint texid; /* GL texture ID */
+
+} image;
+
+
+typedef enum { EARLY, SHUFFLE, NORMAL, LOADING } fade_mode;
+static int fade_ticks = 60;
+
+typedef struct {
+ ModeInfo *mi;
+ GLXContext *glx_context;
+
+ image *frames; /* pointer to array of images */
+ int nframe; /* image being (resp. next to be) loaded */
+
+ GLuint shadow;
+ texture_font_data *texfont;
+ int loading_sw, loading_sh;
+
+ time_t last_time, now;
+ int draw_tick;
+ fade_mode mode;
+ int mode_tick;
+
+} photopile_state;
+
+static photopile_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static GLfloat scale; /* Scale factor for loading images. */
+static GLfloat max_tilt; /* Maximum angle from vertical. */
+static GLfloat speed; /* Animation speed scale factor. */
+static int duration; /* Reload images after this long. */
+static Bool mipmap_p; /* Use mipmaps instead of single textures. */
+static Bool titles_p; /* Display image titles. */
+static Bool polaroid_p; /* Use instant-film look for images. */
+static Bool clip_p; /* Clip images instead of scaling for -polaroid. */
+static Bool shadows_p; /* Draw drop shadows. */
+static Bool debug_p; /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+ {"-scale", ".scale", XrmoptionSepArg, 0 },
+ {"-maxTilt", ".maxTilt", XrmoptionSepArg, 0 },
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
+ {"-mipmaps", ".mipmap", XrmoptionNoArg, "True" },
+ {"-no-mipmaps", ".mipmap", XrmoptionNoArg, "False" },
+ {"-titles", ".titles", XrmoptionNoArg, "True" },
+ {"-no-titles", ".titles", XrmoptionNoArg, "False" },
+ {"-polaroid", ".polaroid", XrmoptionNoArg, "True" },
+ {"-no-polaroid", ".polaroid", XrmoptionNoArg, "False" },
+ {"-clip", ".clip", XrmoptionNoArg, "True" },
+ {"-no-clip", ".clip", XrmoptionNoArg, "False" },
+ {"-shadows", ".shadows", XrmoptionNoArg, "True" },
+ {"-no-shadows", ".shadows", XrmoptionNoArg, "False" },
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+ {"-font", ".font", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ { &scale, "scale", "Scale", DEF_SCALE, t_Float},
+ { &max_tilt, "maxTilt", "MaxTilt", DEF_MAX_TILT, t_Float},
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float},
+ { &duration, "duration", "Duration", DEF_DURATION, t_Int},
+ { &mipmap_p, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ { &titles_p, "titles", "Titles", DEF_TITLES, t_Bool},
+ { &polaroid_p, "polaroid", "Polaroid", DEF_POLAROID, t_Bool},
+ { &clip_p, "clip", "Clip", DEF_CLIP, t_Bool},
+ { &shadows_p, "shadows", "Shadows", DEF_SHADOWS, t_Bool},
+ { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt photopile_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Functions to interpolate between image positions.
+ */
+static position
+add_pos(position p, position q)
+{
+ p.x += q.x;
+ p.y += q.y;
+ p.angle += q.angle;
+ return p;
+}
+
+static position
+scale_pos(GLfloat t, position p)
+{
+ p.x *= t;
+ p.y *= t;
+ p.angle *= t;
+ return p;
+}
+
+static position
+linear_combination(GLfloat t, position p, position q)
+{
+ return add_pos(scale_pos(1.0 - t, p), scale_pos(t, q));
+}
+
+static position
+interpolate(GLfloat t, position p[4])
+{
+ /* de Casteljau's algorithm, 4 control points */
+ position p10 = linear_combination(t, p[0], p[1]);
+ position p11 = linear_combination(t, p[1], p[2]);
+ position p12 = linear_combination(t, p[2], p[3]);
+
+ position p20 = linear_combination(t, p10, p11);
+ position p21 = linear_combination(t, p11, p12);
+
+ return linear_combination(t, p20, p21);
+}
+
+static position
+offset_pos(position p, GLfloat th, GLfloat r)
+{
+ p.x += cos(th) * r;
+ p.y += sin(th) * r;
+ p.angle = (frand(2.0) - 1.0) * max_tilt;
+ return p;
+}
+
+/* Calculate new positions for all images.
+ */
+static void
+set_new_positions(photopile_state *ss)
+{
+ ModeInfo *mi = ss->mi;
+ int i;
+
+ for (i = 0; i < MI_COUNT(mi)+1; ++i)
+ {
+ image *frame = ss->frames + i;
+ GLfloat w = frame->w;
+ GLfloat h = frame->h;
+ GLfloat d = sqrt(w*w + h*h);
+ GLfloat leave = frand(M_PI * 2.0);
+ GLfloat enter = frand(M_PI * 2.0);
+
+ /* start position */
+ frame->pos[0] = frame->pos[3];
+
+ /* end position */
+ frame->pos[3].x = BELLRAND(MI_WIDTH(mi));
+ frame->pos[3].y = BELLRAND(MI_HEIGHT(mi));
+ frame->pos[3].angle = (frand(2.0) - 1.0) * max_tilt;
+
+ /* Try to keep the images mostly inside the screen bounds */
+ frame->pos[3].x = MAX(0.5*w, MIN(MI_WIDTH(mi)-0.5*w, frame->pos[3].x));
+ frame->pos[3].y = MAX(0.5*h, MIN(MI_HEIGHT(mi)-0.5*h, frame->pos[3].y));
+
+ /* intermediate points */
+ frame->pos[1] = offset_pos(frame->pos[0], leave, d * (0.5 + frand(1.0)));
+ frame->pos[2] = offset_pos(frame->pos[3], enter, d * (0.5 + frand(1.0)));
+ }
+}
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ photopile_state *ss = (photopile_state *) closure;
+ ModeInfo *mi = ss->mi;
+ int wire = MI_IS_WIREFRAME(mi);
+ image *frame = ss->frames + ss->nframe;
+
+ if (wire)
+ {
+ if (random() % 2)
+ {
+ frame->w = (int)(MI_WIDTH(mi) * scale) - 1;
+ frame->h = (int)(MI_HEIGHT(mi) * scale) - 1;
+ }
+ else
+ {
+ frame->w = (int)(MI_HEIGHT(mi) * scale) - 1;
+ frame->h = (int)(MI_WIDTH(mi) * scale) - 1;
+ }
+ if (frame->w <= 10) frame->w = 10;
+ if (frame->h <= 10) frame->h = 10;
+ frame->geom.width = frame->w;
+ frame->geom.height = frame->h;
+ goto DONE;
+ }
+
+ if (image_width == 0 || image_height == 0)
+ exit (1);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ frame->w = image_width;
+ frame->h = image_height;
+ frame->tw = texture_width;
+ frame->th = texture_height;
+ frame->geom = *geom;
+
+ if (frame->title)
+ free (frame->title);
+ frame->title = (filename ? strdup (filename) : 0);
+
+ /* xscreensaver-getimage returns paths relative to the image directory
+ now, so leave the sub-directory part in. Unless it's an absolute path.
+ */
+ if (frame->title && frame->title[0] == '/')
+ {
+ /* strip filename to part after last /. */
+ char *s = strrchr (frame->title, '/');
+ if (s) strcpy (frame->title, s+1);
+ }
+
+ if (debug_p)
+ fprintf (stderr, "%s: loaded %4d x %-4d %4d x %-4d \"%s\"\n",
+ progname,
+ frame->geom.width,
+ frame->geom.height,
+ frame->tw, frame->th,
+ (frame->title ? frame->title : "(null)"));
+
+ DONE:
+ frame->loaded_p = True;
+}
+
+
+/* Load a new file.
+ */
+static void
+load_image (ModeInfo *mi)
+{
+ photopile_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *frame = ss->frames + ss->nframe;
+
+ if (debug_p && !wire && frame->w != 0)
+ fprintf (stderr, "%s: dropped %4d x %-4d %4d x %-4d \"%s\"\n",
+ progname,
+ frame->geom.width,
+ frame->geom.height,
+ frame->tw, frame->th,
+ (frame->title ? frame->title : "(null)"));
+
+ frame->loaded_p = False;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, ss);
+ else
+ {
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+ int size = (int)((w > h ? w : h) * scale);
+ if (size <= 10) size = 10;
+ load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
+ size, size,
+ mipmap_p, frame->texid,
+ image_loaded_cb, ss);
+ }
+}
+
+
+static void
+loading_msg (ModeInfo *mi)
+{
+ photopile_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ const char text[] = "Loading...";
+
+ if (wire) return;
+
+ if (ss->loading_sw == 0) /* only do this once */
+ {
+ XCharStruct e;
+ texture_string_metrics (ss->texfont, text, &e, 0, 0);
+ ss->loading_sw = e.width;
+ ss->loading_sh = e.ascent + e.descent;
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
+
+ glTranslatef ((MI_WIDTH(mi) - ss->loading_sw) / 2,
+ (MI_HEIGHT(mi) - ss->loading_sh) / 2,
+ 0);
+ glColor3f (1, 1, 0);
+ glEnable (GL_TEXTURE_2D);
+ glDisable (GL_DEPTH_TEST);
+ print_texture_string (ss->texfont, text);
+ glEnable (GL_DEPTH_TEST);
+ glPopMatrix();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+
+static Bool
+loading_initial_image (ModeInfo *mi)
+{
+ photopile_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (ss->frames[ss->nframe].loaded_p)
+ {
+ /* The initial image has been fully loaded, start fading it in. */
+ int i;
+
+ for (i = 0; i < ss->nframe; ++i)
+ {
+ ss->frames[i].pos[3].x = MI_WIDTH(mi) * 0.5;
+ ss->frames[i].pos[3].y = MI_HEIGHT(mi) * 0.5;
+ ss->frames[i].pos[3].angle = 0.0;
+ }
+ set_new_positions(ss);
+
+ ss->mode = SHUFFLE;
+ ss->mode_tick = fade_ticks / speed;
+ }
+ else
+ {
+ loading_msg(mi);
+ }
+
+ return (ss->mode == EARLY);
+}
+
+
+ENTRYPOINT void
+reshape_photopile (ModeInfo *mi, int width, int height)
+{
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, h, 1);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
+ */
+static void
+hack_resources (Display *dpy)
+{
+# ifndef HAVE_JWXYZ
+ char *res = "desktopGrabber";
+ char *val = get_string_resource (dpy, res, "DesktopGrabber");
+ char buf1[255];
+ char buf2[255];
+ XrmValue value;
+ XrmDatabase db = XtDatabase (dpy);
+ sprintf (buf1, "%.100s.%.100s", progname, res);
+ sprintf (buf2, "%.200s -v", val);
+ value.addr = buf2;
+ value.size = strlen(buf2);
+ XrmPutResource (&db, buf1, "String", &value);
+# endif /* !HAVE_JWXYZ */
+}
+
+
+ENTRYPOINT void
+init_photopile (ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ photopile_state *ss;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sss);
+ ss = &sss[screen];
+ ss->mi = mi;
+
+ if ((ss->glx_context = init_GL(mi)) != NULL) {
+ reshape_photopile (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ ss->shadow = init_drop_shadow();
+ ss->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+
+ if (debug_p)
+ hack_resources (MI_DISPLAY (mi));
+
+ ss->frames = (image *)calloc (MI_COUNT(mi) + 1, sizeof(image));
+ ss->nframe = 0;
+ if (!wire)
+ {
+ int i;
+ for (i = 0; i < MI_COUNT(mi) + 1; ++i)
+ {
+ glGenTextures (1, &(ss->frames[i].texid));
+ if (ss->frames[i].texid <= 0) abort();
+ }
+ }
+
+ ss->mode = EARLY;
+ load_image(mi); /* start loading the first image */
+}
+
+
+static void
+draw_image (ModeInfo *mi, int i, GLfloat t, GLfloat s, GLfloat z)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ photopile_state *ss = &sss[MI_SCREEN(mi)];
+ image *frame = ss->frames + i;
+
+ position pos = interpolate(t, frame->pos);
+ GLfloat w = frame->geom.width * 0.5;
+ GLfloat h = frame->geom.height * 0.5;
+ GLfloat z1 = z - 0.25 / (MI_COUNT(mi) + 1);
+ GLfloat z2 = z - 0.5 / (MI_COUNT(mi) + 1);
+ GLfloat w1 = w;
+ GLfloat h1 = h;
+ GLfloat h2 = h;
+
+ if (polaroid_p)
+ {
+ GLfloat minSize = MIN(w, h);
+ GLfloat maxSize = MAX(w, h);
+
+ /* Clip or scale image to fit in the frame.
+ */
+ if (clip_p)
+ {
+ w = h = minSize;
+ }
+ else
+ {
+ GLfloat scale = minSize / maxSize;
+ w *= scale;
+ h *= scale;
+ }
+
+ w1 = minSize * 1.16; /* enlarge frame border */
+ h1 = minSize * 1.5;
+ h2 = w1;
+ s /= 1.5; /* compensate for border size */
+ }
+
+ glPushMatrix();
+
+ /* Position and scale this image.
+ */
+ glTranslatef (pos.x, pos.y, 0);
+ glRotatef (pos.angle, 0, 0, 1);
+ glScalef (s, s, 1);
+
+ /* Draw the drop shadow. */
+ if (shadows_p && !wire)
+ {
+ glColor3f (0, 0, 0);
+ draw_drop_shadow(ss->shadow, -w1, -h1, z2, 2.0 * w1, h1 + h2, 20.0);
+ glDisable (GL_BLEND);
+ }
+
+ glDisable (GL_LIGHTING);
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+
+ /* Draw the retro instant-film frame.
+ */
+ if (polaroid_p)
+ {
+ if (! wire)
+ {
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+
+ glColor3f (1, 1, 1);
+ glBegin (GL_QUADS);
+ glVertex3f (-w1, -h1, z2);
+ glVertex3f ( w1, -h1, z2);
+ glVertex3f ( w1, h2, z2);
+ glVertex3f (-w1, h2, z2);
+ glEnd();
+ }
+
+ glLineWidth (1.0);
+ glColor3f (0.5, 0.5, 0.5);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (-w1, -h1, z);
+ glVertex3f ( w1, -h1, z);
+ glVertex3f ( w1, h2, z);
+ glVertex3f (-w1, h2, z);
+ glEnd();
+ }
+
+ /* Draw the image quad.
+ */
+ if (! wire)
+ {
+ GLfloat texw = w / frame->tw;
+ GLfloat texh = h / frame->th;
+ GLfloat texx = (frame->geom.x + 0.5 * frame->geom.width) / frame->tw;
+ GLfloat texy = (frame->geom.y + 0.5 * frame->geom.height) / frame->th;
+
+ glBindTexture (GL_TEXTURE_2D, frame->texid);
+ glEnable (GL_TEXTURE_2D);
+ glColor3f (1, 1, 1);
+ glBegin (GL_QUADS);
+ glTexCoord2f (texx - texw, texy + texh); glVertex3f (-w, -h, z1);
+ glTexCoord2f (texx + texw, texy + texh); glVertex3f ( w, -h, z1);
+ glTexCoord2f (texx + texw, texy - texh); glVertex3f ( w, h, z1);
+ glTexCoord2f (texx - texw, texy - texh); glVertex3f (-w, h, z1);
+ glEnd();
+ glDisable (GL_TEXTURE_2D);
+ }
+
+ /* Draw a box around it.
+ */
+ if (! wire)
+ {
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ }
+ glLineWidth (1.0);
+ glColor3f (0.5, 0.5, 0.5);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (-w, -h, z);
+ glVertex3f ( w, -h, z);
+ glVertex3f ( w, h, z);
+ glVertex3f (-w, h, z);
+ glEnd();
+
+ /* Draw a title under the image.
+ */
+ if (titles_p)
+ {
+ int sw = 0, sh = 0;
+ int ascent, descent;
+ GLfloat tw = w * 2;
+ GLfloat th = h1 - h;
+ GLfloat scale = 1;
+ const char *title = frame->title ? frame->title : "(untitled)";
+ XCharStruct e;
+
+ texture_string_metrics (ss->texfont, title, &e, &ascent, &descent);
+ sw = e.width;
+ sh = ascent; /* + descent; */
+
+ /* Scale the text to match the pixel size of the photo */
+ scale *= w / 150.0;
+
+# if defined(HAVE_COCOA)
+ scale /= 2;
+ if (MI_WIDTH(mi) > 2560) scale /= 2; /* Retina displays */
+# endif
+
+# if defined(HAVE_MOBILE)
+ scale /= 2;
+# endif
+
+ /* Clip characters off the left end of the string until it fits. */
+ if (clip_p || polaroid_p)
+ while (sw * scale > tw && strlen (title) > 10)
+ {
+ title++;
+ texture_string_metrics (ss->texfont, title, &e, &ascent, &descent);
+ sw = e.width;
+ }
+
+ if (th <= 0) /* Non-polaroid */
+ th = -sh * 1.2;
+
+ glTranslatef (-w, -h1, 0);
+ glTranslatef ((tw - sw*scale) / 2, (th - sh*scale) / 2, 0);
+
+ glScalef (scale, scale, 1);
+
+ if (wire || !polaroid_p)
+ {
+ glColor3f (1, 1, 1);
+ }
+ else
+ {
+ glColor3f (0.5, 0.5, 0.5);
+ }
+
+ if (!wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ print_texture_string (ss->texfont, title);
+ glEnable (GL_DEPTH_TEST);
+ }
+ else
+ {
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (sw, 0, 0);
+ glVertex3f (sw, sh, 0);
+ glVertex3f (0, sh, 0);
+ glEnd();
+ }
+
+ }
+
+ glPopMatrix();
+}
+
+
+ENTRYPOINT void
+draw_photopile (ModeInfo *mi)
+{
+ photopile_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ if (!ss->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ss->glx_context));
+
+ if (ss->mode == EARLY)
+ if (loading_initial_image (mi))
+ return;
+
+ /* Only check the wall clock every 10 frames */
+ if (ss->now == 0 || ss->draw_tick++ > 10)
+ {
+ ss->now = time((time_t *) 0);
+ if (ss->last_time == 0) ss->last_time = ss->now;
+ ss->draw_tick = 0;
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ {
+ GLfloat t;
+
+ glPushMatrix();
+ glTranslatef (MI_WIDTH(mi)/2, MI_HEIGHT(mi)/2, 0);
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ glTranslatef (-MI_WIDTH(mi)/2, -MI_HEIGHT(mi)/2, 0);
+
+ /* Handle state transitions. */
+ switch (ss->mode)
+ {
+ case SHUFFLE:
+ if (--ss->mode_tick <= 0)
+ {
+ ss->nframe = (ss->nframe+1) % (MI_COUNT(mi)+1);
+
+ ss->mode = NORMAL;
+ ss->last_time = time((time_t *) 0);
+ }
+ break;
+ case NORMAL:
+ if (ss->now - ss->last_time > duration)
+ {
+ ss->mode = LOADING;
+ load_image(mi);
+ }
+ break;
+ case LOADING:
+ if (ss->frames[ss->nframe].loaded_p)
+ {
+ set_new_positions(ss);
+ ss->mode = SHUFFLE;
+ ss->mode_tick = fade_ticks / speed;
+ }
+ break;
+ default:
+ abort();
+ }
+
+ t = 1.0 - ss->mode_tick / (fade_ticks / speed);
+ t = 0.5 * (1.0 - cos(M_PI * t));
+
+ /* Draw the images. */
+ for (i = 0; i < MI_COUNT(mi) + (ss->mode == SHUFFLE); ++i)
+ {
+ int j = (ss->nframe + i + 1) % (MI_COUNT(mi) + 1);
+
+ if (ss->frames[j].loaded_p)
+ {
+ GLfloat s = 1.0;
+ GLfloat z = (GLfloat)i / (MI_COUNT(mi) + 1);
+
+ switch (ss->mode)
+ {
+ case SHUFFLE:
+ if (i == MI_COUNT(mi))
+ {
+ s *= t;
+ }
+ else if (i == 0)
+ {
+ s *= 1.0 - t;
+ }
+ break;
+ case NORMAL:
+ case LOADING:
+ t = 1.0;
+ break;
+ default:
+ abort();
+ }
+
+ draw_image(mi, j, t, s, z);
+ }
+ }
+ glPopMatrix();
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+XSCREENSAVER_MODULE ("Photopile", photopile)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/photopile.man b/hacks/glx/photopile.man
new file mode 100644
index 0000000..c3dc601
--- /dev/null
+++ b/hacks/glx/photopile.man
@@ -0,0 +1,113 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+photopile - displays multiple images in a periodically shuffled pile
+.SH SYNOPSIS
+.B photopile
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fIint\fP]
+[\-scale \fIfactor\fP]
+[\-maxTilt \fIdegrees\fP]
+[\-titles | \-no\-titles]
+[\-polaroid | \-no\-polaroid]
+[\-shadows | \-no\-shadows]
+[\-font \fIfont\fP]
+[\-speed \fIratio\fP]
+[\-duration \fIseconds\fP]
+[\-fps]
+[\-debug]
+[\-wireframe]
+.SH DESCRIPTION
+Loads several random images, and displays them as if lying in a random pile.
+The pile is periodically reshuffled, with new images coming in and old ones
+being thrown out.
+
+This program requires a good video card capable of supporting large
+textures.
+
+To specify the directory that images are loaded from, run
+.BR xscreensaver-demo (1)
+and click on the "Advanced" tab.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fIint\fP
+How many images to display. Default 7.
+.TP 8
+.B \-scale \fIfactor\fP
+Size of images in relation to the size of the window. Default 0.4.
+.TP 8
+.B \-maxTilt \fIdegrees\fP
+Maximum deviation from vertical. Default 50 degrees.
+.TP 8
+.B \-duration \fIseconds\fP
+Every \fIduration\fP seconds, one of the images will be replaced
+with a new one. Default 5 seconds.
+.TP 8
+.B \-speed \fIratio\fP
+Speed up or slow down the animation. 0.5 means half as fast as the
+default; 2.0 means twice as fast.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-titles \fB| \-no\-titles\fP
+Whether to display the file names of the images beneath them. Default: yes.
+.TP 8
+.B \-polaroid \fB| \-no\-polaroid\fP
+Whether to simulate images taken by an instant camera. Default: yes.
+.TP 8
+.B \-shadows \fB| \-no\-shadows\fP
+Whether to draw images with drop shadows. Default: no.
+.TP 8
+.B \-font \fIfont-name\fP
+The font to use for the initial loading screen and for image titles.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-debug
+Prints debugging info to stderr.
+.TP 8
+.B \-wireframe
+Another debug mode.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver-demo (1)
+.BR xscreensaver-getimage (1)
+.BR xscreensaver (1)
+.BR carousel (MANSUFFIX)
+.BR glslideshow (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski.
+Copyright \(co 2008 by Jens Kilian.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jens Kilian.
diff --git a/hacks/glx/pinion.c b/hacks/glx/pinion.c
new file mode 100644
index 0000000..f6793eb
--- /dev/null
+++ b/hacks/glx/pinion.c
@@ -0,0 +1,1470 @@
+/* pinion, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 15000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*titleFont2: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*\n" \
+ "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n" \
+
+# define free_pinion 0
+# define release_pinion 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "gltrackball.h"
+#include "texfont.h"
+#include "involute.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN_SPEED "1.0"
+#define DEF_SCROLL_SPEED "1.0"
+#define DEF_GEAR_SIZE "1.0"
+#define DEF_MAX_RPM "900"
+
+typedef struct {
+ GLXContext *glx_context;
+ GLfloat vp_left, vp_right, vp_top, vp_bottom; /* default visible area */
+ GLfloat vp_width, vp_height;
+ GLfloat render_left, render_right; /* area in which gears are displayed */
+ GLfloat layout_left, layout_right; /* layout region, on the right side */
+
+ int ngears;
+ int gears_size;
+ gear **gears;
+
+ trackball_state *trackball;
+ Bool button_down_p;
+ unsigned long mouse_gear_id;
+
+ texture_font_data *font1, *font2, *font3;
+
+ int draw_tick;
+
+ GLfloat plane_displacement; /* distance between coaxial gears */
+
+ int debug_size_failures; /* for debugging messages */
+ int debug_position_failures;
+ unsigned long current_length; /* gear count in current train */
+ unsigned long current_blur_length; /* how long have we been blurring? */
+
+} pinion_configuration;
+
+
+static pinion_configuration *pps = NULL;
+
+/* command line arguments */
+static GLfloat spin_speed, scroll_speed, gear_size, max_rpm;
+
+static Bool verbose_p = False; /* print progress on stderr */
+static Bool debug_p = False; /* render as flat schematic */
+
+/* internal debugging variables */
+static Bool debug_placement_p = False; /* extreme verbosity on stderr */
+static Bool debug_one_gear_p = False; /* draw one big stationary gear */
+
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spinSpeed", XrmoptionSepArg, 0 },
+ { "-scroll", ".scrollSpeed", XrmoptionSepArg, 0 },
+ { "-size", ".gearSize", XrmoptionSepArg, 0 },
+ { "-max-rpm",".maxRPM", XrmoptionSepArg, 0 },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+ { "-verbose",".verbose", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ {&spin_speed, "spinSpeed", "SpinSpeed", DEF_SPIN_SPEED, t_Float},
+ {&scroll_speed, "scrollSpeed", "ScrollSpeed", DEF_SCROLL_SPEED, t_Float},
+ {&gear_size, "gearSize", "GearSize", DEF_GEAR_SIZE, t_Float},
+ {&max_rpm, "maxRPM", "MaxRPM", DEF_MAX_RPM, t_Float},
+ {&debug_p, "debug", "Debug", "False", t_Bool},
+ {&verbose_p, "verbose", "Verbose", "False", t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt pinion_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Font stuff
+ */
+
+static void
+load_fonts (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ pp->font1 = load_texture_font (mi->dpy, "titleFont");
+ pp->font2 = load_texture_font (mi->dpy, "titleFont2");
+ pp->font3 = load_texture_font (mi->dpy, "titleFont3");
+}
+
+
+
+static void rpm_string (double rpm, char *s);
+
+static void
+draw_label (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ char label[1024];
+ int i;
+ gear *g = 0;
+
+ if (pp->mouse_gear_id)
+ for (i = 0; i < pp->ngears; i++)
+ if (pp->gears[i]->id == pp->mouse_gear_id)
+ {
+ g = pp->gears[i];
+ break;
+ }
+
+ if (!g)
+ *label = 0;
+ else
+ {
+ sprintf (label, "%d teeth\n", (int) g->nteeth);
+ rpm_string (g->rpm, label + strlen(label));
+ if (debug_p)
+ sprintf (label + strlen (label), "\nPolys: %d\nModel: %s (%.2f)\n",
+ g->polygons,
+ (g->size == INVOLUTE_SMALL ? "small" :
+ g->size == INVOLUTE_MEDIUM ? "medium"
+ : "large"),
+ g->tooth_h * MI_HEIGHT(mi));
+ }
+
+ if (*label)
+ {
+ texture_font_data *fd;
+ if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+ fd = pp->font1;
+ else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+ fd = pp->font2;
+ else
+ fd = pp->font3;
+
+ glColor3f (0.8, 0.8, 0);
+ print_texture_label (mi->dpy, fd,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, label);
+ }
+}
+
+
+/* Some utilities
+ */
+
+
+/* Find the gear in the scene that is farthest to the right or left.
+ */
+static gear *
+farthest_gear (ModeInfo *mi, Bool left_p)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ int i;
+ gear *rg = 0;
+ double x = (left_p ? 999999 : -999999);
+ for (i = 0; i < pp->ngears; i++)
+ {
+ gear *g = pp->gears[i];
+ double gx = g->x + ((g->r + g->tooth_h) * (left_p ? -1 : 1));
+ if (left_p ? (x > gx) : (x < gx))
+ {
+ rg = g;
+ x = gx;
+ }
+ }
+ return rg;
+}
+
+
+/* Compute the revolutions per minute of a gear.
+ */
+static void
+compute_rpm (ModeInfo *mi, gear *g)
+{
+ double fps, rpf, rps;
+ fps = (MI_PAUSE(mi) == 0 ? 999999 : 1000000.0 / MI_PAUSE(mi));
+
+ if (fps > 150) fps = 150; /* let's be reasonable... */
+ if (fps < 10) fps = 10;
+
+ rpf = (g->ratio * spin_speed) / 360.0; /* rotations per frame */
+ rps = rpf * fps; /* rotations per second */
+ g->rpm = rps * 60;
+}
+
+/* Prints the RPM into a string, doing fancy float formatting.
+ */
+static void
+rpm_string (double rpm, char *s)
+{
+ char buf[30];
+ int L;
+ if (rpm >= 0.1) sprintf (buf, "%.2f", rpm);
+ else if (rpm >= 0.001) sprintf (buf, "%.4f", rpm);
+ else if (rpm >= 0.00001) sprintf (buf, "%.8f", rpm);
+ else sprintf (buf, "%.16f",rpm);
+
+ L = strlen(buf);
+ while (buf[L-1] == '0') buf[--L] = 0;
+ if (buf[L-1] == '.') buf[--L] = 0;
+ strcpy (s, buf);
+ strcat (s, " RPM");
+}
+
+
+
+/* Layout and stuff.
+ */
+
+
+/* Create and return a new gear sized for placement next to or on top of
+ the given parent gear (if any.) Returns 0 if out of memory.
+ */
+static gear *
+new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ gear *g = (gear *) calloc (1, sizeof (*g));
+ int loop_count = 0;
+ static unsigned long id = 0; /* only used in debugging output */
+
+ if (!g) return 0;
+ if (coaxial_p && !parent) abort();
+ g->id = ++id;
+
+ g->coax_displacement = pp->plane_displacement;
+
+ while (1)
+ {
+ loop_count++;
+ if (loop_count > 1000)
+ /* The only time we loop in here is when making a coaxial gear, and
+ trying to pick a radius that is either significantly larger or
+ smaller than its parent. That shouldn't be hard, so something
+ must be really wrong if we can't do that in only a few tries.
+ */
+ abort();
+
+ /* Pick the size of the teeth.
+ */
+ if (parent && !coaxial_p) /* adjascent gears need matching teeth */
+ {
+ g->tooth_w = parent->tooth_w;
+ g->tooth_h = parent->tooth_h;
+ g->thickness = parent->thickness;
+ g->thickness2 = parent->thickness2;
+ g->thickness3 = parent->thickness3;
+ }
+ else /* gears that begin trains get any size they want */
+ {
+ double scale = (1.0 + BELLRAND(4.0)) * gear_size;
+ g->tooth_w = 0.007 * scale;
+ g->tooth_h = 0.005 * scale;
+ g->thickness = g->tooth_h * (0.1 + BELLRAND(1.5));
+ g->thickness2 = g->thickness / 4;
+ g->thickness3 = g->thickness;
+ }
+
+ /* Pick the number of teeth, and thus, the radius.
+ */
+ {
+ double c;
+
+ AGAIN:
+ g->nteeth = 3 + (random() % 97); /* from 3 to 100 teeth */
+
+ if (g->nteeth < 7 && (random() % 5) != 0)
+ goto AGAIN; /* Let's make very small tooth-counts more rare */
+
+ c = g->nteeth * g->tooth_w * 2; /* circumference = teeth + gaps */
+ g->r = c / (M_PI * 2); /* c = 2 pi r */
+ }
+
+
+ /* Are we done now?
+ */
+ if (! coaxial_p) break; /* yes */
+ if (g->nteeth == parent->nteeth) continue; /* ugly */
+ if (g->r < parent->r * 0.6) break; /* g much smaller than parent */
+ if (parent->r < g->r * 0.6) break; /* g much larger than parent */
+ }
+
+ /* g->tooth_slope = (parent ? -parent->tooth_slope : 4); */
+
+ if (debug_one_gear_p)
+ g->tooth_slope = frand(20)-10;
+
+
+ /* Colorize
+ */
+ g->color[0] = 0.5 + frand(0.5);
+ g->color[1] = 0.5 + frand(0.5);
+ g->color[2] = 0.5 + frand(0.5);
+ g->color[3] = 1.0;
+
+ g->color2[0] = g->color[0] * 0.85;
+ g->color2[1] = g->color[1] * 0.85;
+ g->color2[2] = g->color[2] * 0.85;
+ g->color2[3] = g->color[3];
+
+
+ /* Decide on shape of gear interior:
+ - just a ring with teeth;
+ - that, plus a thinner in-set "plate" in the middle;
+ - that, plus a thin raised "lip" on the inner plate;
+ - or, a wide lip (really, a thicker third inner plate.)
+ */
+ if ((random() % 10) == 0)
+ {
+ /* inner_r can go all the way in; there's no inset disc. */
+ g->inner_r = (g->r * 0.1) + frand((g->r - g->tooth_h/2) * 0.8);
+ g->inner_r2 = 0;
+ g->inner_r3 = 0;
+ }
+ else
+ {
+ /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
+ g->inner_r = (g->r * 0.5) + frand((g->r - g->tooth_h) * 0.4);
+ g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
+ g->inner_r3 = 0;
+
+ if (g->inner_r2 > (g->r * 0.2))
+ {
+ int nn = (random() % 10);
+ if (nn <= 2)
+ g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
+ else if (nn <= 7 && g->inner_r2 >= 0.1)
+ g->inner_r3 = g->inner_r2 - 0.01;
+ }
+ }
+
+ /* Coaxial gears need to have the same innermost hole size (for the axle.)
+ Use whichever of the two is smaller. (Modifies parent.)
+ */
+ if (coaxial_p)
+ {
+ double hole1 = (g->inner_r3 ? g->inner_r3 :
+ g->inner_r2 ? g->inner_r2 :
+ g->inner_r);
+ double hole2 = (parent->inner_r3 ? parent->inner_r3 :
+ parent->inner_r2 ? parent->inner_r2 :
+ parent->inner_r);
+ double hole = (hole1 < hole2 ? hole1 : hole2);
+ if (hole <= 0) abort();
+
+ if (g->inner_r3) g->inner_r3 = hole;
+ else if (g->inner_r2) g->inner_r2 = hole;
+ else g->inner_r = hole;
+
+ if (parent->inner_r3) parent->inner_r3 = hole;
+ else if (parent->inner_r2) parent->inner_r2 = hole;
+ else parent->inner_r = hole;
+ }
+
+ /* If we have three discs, sometimes make the middle disc be spokes.
+ */
+ if (g->inner_r3 && ((random() % 5) == 0))
+ {
+ g->spokes = 2 + BELLRAND (5);
+ g->spoke_thickness = 1 + frand(7.0);
+ if (g->spokes == 2 && g->spoke_thickness < 2)
+ g->spoke_thickness += 1;
+ }
+
+ /* Sometimes add little nubbly bits, if there is room.
+ */
+ if (g->nteeth > 5)
+ {
+ double size = 0;
+ involute_biggest_ring (g, 0, &size, 0);
+ if (size > g->r * 0.2 && (random() % 5) == 0)
+ {
+ g->nubs = 1 + (random() % 16);
+ if (g->nubs > 8) g->nubs = 1;
+ }
+ }
+
+ if (g->inner_r3 > g->inner_r2) abort();
+ if (g->inner_r2 > g->inner_r) abort();
+ if (g->inner_r > g->r) abort();
+
+ /* Decide how complex the polygon model should be.
+ */
+ {
+ double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
+ if (pix <= 2.5) g->size = INVOLUTE_SMALL;
+ else if (pix <= 3.5) g->size = INVOLUTE_MEDIUM;
+ else if (pix <= 25) g->size = INVOLUTE_LARGE;
+ else g->size = INVOLUTE_HUGE;
+ }
+
+ g->base_p = !parent;
+
+ return g;
+}
+
+
+/* Given a newly-created gear, place it next to its parent in the scene,
+ with its teeth meshed and the proper velocity. Returns False if it
+ didn't work. (Call this a bunch of times until either it works, or
+ you decide it's probably not going to.)
+ */
+static Bool
+place_gear (ModeInfo *mi, gear *g, gear *parent, Bool coaxial_p)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+
+ /* If this gear takes up more than 1/3rd of the screen, it's no good.
+ */
+ if (((g->r + g->tooth_h) * (6 / gear_size)) >= pp->vp_width ||
+ ((g->r + g->tooth_h) * (6 / gear_size)) >= pp->vp_height)
+ {
+ if (verbose_p && debug_placement_p && 0)
+ fprintf (stderr,
+ "%s: placement: too big: %.2f @ %.2f vs %.2f x %.2f\n",
+ progname,
+ (g->r + g->tooth_h), gear_size,
+ pp->vp_width, pp->vp_height);
+ pp->debug_size_failures++;
+ return False;
+ }
+
+ /* Compute this gear's velocity.
+ */
+ if (! parent)
+ {
+ g->ratio = 0.8 + BELLRAND(0.4); /* 0.8-1.2 = 8-12rpm @ 60fps */
+ g->th = frand (90) * ((random() & 1) ? 1.0 : -1.0);
+ }
+ else if (coaxial_p)
+ {
+ g->ratio = parent->ratio; /* bound gears have the same ratio */
+ g->th = parent->th;
+ g->rpm = parent->rpm;
+ g->wobble = parent->wobble;
+ }
+ else
+ {
+ /* Gearing ratio is the ratio of the number of teeth to previous gear
+ (which is also the ratio of the circumferences.)
+ */
+ g->ratio = (double) parent->nteeth / (double) g->nteeth;
+
+ /* Set our initial rotation to match that of the previous gear,
+ multiplied by the gearing ratio. (This is finessed later,
+ once we know the exact position of the gear relative to its
+ parent.)
+ */
+ g->th = -(parent->th * g->ratio);
+
+ if (g->nteeth & 1) /* rotate 1/2 tooth-size if odd number of teeth */
+ {
+ double off = (180.0 / g->nteeth);
+ if (g->th > 0)
+ g->th += off;
+ else
+ g->th -= off;
+ }
+
+ /* ratios are cumulative for all gears in the train. */
+ g->ratio *= parent->ratio;
+ }
+
+
+ /* Place the gear relative to the parent.
+ */
+
+ if (! parent)
+ {
+ gear *rg = farthest_gear (mi, False);
+ double right = (rg ? rg->x + rg->r + rg->tooth_h : 0);
+ if (right < pp->layout_left) /* place off screen */
+ right = pp->layout_left;
+
+ g->x = right + g->r + g->tooth_h + (0.01 / gear_size);
+ g->y = 0;
+ g->z = 0;
+
+ if (debug_one_gear_p)
+ g->x = 0;
+ }
+ else if (coaxial_p)
+ {
+ double off = pp->plane_displacement;
+
+ g->x = parent->x;
+ g->y = parent->y;
+ g->z = parent->z + (g->r > parent->r /* small gear on top */
+ ? -off : off);
+
+ if (parent->r > g->r) /* mark which is top and which is bottom */
+ {
+ parent->coax_p = 1;
+ g->coax_p = 2;
+ parent->wobble = 0; /* looks bad when axle moves */
+ }
+ else
+ {
+ parent->coax_p = 2;
+ g->coax_p = 1;
+ g->wobble = 0;
+ }
+
+ g->coax_thickness = parent->thickness;
+ parent->coax_thickness = g->thickness;
+
+ /* Don't let the train get too close to or far from the screen.
+ If we're getting too close, give up on this gear.
+ (But getting very far away is fine.)
+ */
+ if (g->z >= off * 4 ||
+ g->z <= -off * 4)
+ {
+ if (verbose_p && debug_placement_p)
+ fprintf (stderr, "%s: placement: bad depth: %.2f\n",
+ progname, g->z);
+ pp->debug_position_failures++;
+ return False;
+ }
+ }
+ else /* position it somewhere next to the parent. */
+ {
+ double r_off = parent->r + g->r;
+ int angle;
+
+ if ((random() % 3) != 0)
+ angle = (random() % 240) - 120; /* mostly -120 to +120 degrees */
+ else
+ angle = (random() % 360) - 180; /* sometimes -180 to +180 degrees */
+
+ g->x = parent->x + (cos ((double) angle * (M_PI / 180)) * r_off);
+ g->y = parent->y + (sin ((double) angle * (M_PI / 180)) * r_off);
+ g->z = parent->z;
+
+ /* If the angle we picked would have positioned this gear
+ more than halfway off screen, that's no good. */
+ if (g->y > pp->vp_top ||
+ g->y < pp->vp_bottom)
+ {
+ if (verbose_p && debug_placement_p)
+ fprintf (stderr, "%s: placement: out of bounds: %s\n",
+ progname, (g->y > pp->vp_top ? "top" : "bottom"));
+ pp->debug_position_failures++;
+ return False;
+ }
+
+ /* avoid accidentally changing sign of "th" in the math below. */
+ g->th += (g->th > 0 ? 360 : -360);
+
+ /* Adjust the rotation of the gear so that its teeth line up with its
+ parent, based on the position of the gear and the current rotation
+ of the parent.
+ */
+ {
+ double p_c = 2 * M_PI * parent->r; /* circumference of parent */
+ double g_c = 2 * M_PI * g->r; /* circumference of g */
+
+ double p_t = p_c * (angle/360.0); /* distance travelled along
+ circumference of parent when
+ moving "angle" degrees along
+ parent. */
+ double g_rat = p_t / g_c; /* if travelling that distance
+ along circumference of g,
+ ratio of g's circumference
+ travelled. */
+ double g_th = 360.0 * g_rat; /* that ratio in degrees */
+
+ g->th += angle + g_th;
+ }
+ }
+
+ if (debug_one_gear_p)
+ {
+ compute_rpm (mi, g);
+ return True;
+ }
+
+ /* If the position we picked for this gear would cause it to already
+ be visible on the screen, give up. This can happen when the train
+ is growing backwards, and we don't want to see gears flash into
+ existence.
+ */
+ if (g->x - g->r - g->tooth_h < pp->render_right)
+ {
+ if (verbose_p && debug_placement_p)
+ fprintf (stderr, "%s: placement: out of bounds: left\n", progname);
+ pp->debug_position_failures++;
+ return False;
+ }
+
+ /* If the position we picked for this gear causes it to overlap
+ with any earlier gear in the train, give up.
+ */
+ {
+ int i;
+
+ for (i = pp->ngears-1; i >= 0; i--)
+ {
+ gear *og = pp->gears[i];
+
+ if (og == g) continue;
+ if (og == parent) continue;
+ if (g->z != og->z) continue; /* Ignore unless on same layer */
+
+ /* Collision detection without sqrt:
+ d = sqrt(a^2 + b^2) d^2 = a^2 + b^2
+ d < r1 + r2 d^2 < (r1 + r2)^2
+ */
+ if (((g->x - og->x) * (g->x - og->x) +
+ (g->y - og->y) * (g->y - og->y)) <
+ ((g->r + g->tooth_h + og->r + og->tooth_h) *
+ (g->r + g->tooth_h + og->r + og->tooth_h)))
+ {
+ if (verbose_p && debug_placement_p)
+ fprintf (stderr, "%s: placement: collision with %lu\n",
+ progname, og->id);
+ pp->debug_position_failures++;
+ return False;
+ }
+ }
+ }
+
+ compute_rpm (mi, g);
+
+
+ /* Make deeper gears be darker.
+ */
+ {
+ double depth = g->z / pp->plane_displacement;
+ double brightness = 1 + (depth / 6);
+ double limit = 0.4;
+ if (brightness < limit) brightness = limit;
+ if (brightness > 1/limit) brightness = 1/limit;
+ g->color[0] *= brightness;
+ g->color[1] *= brightness;
+ g->color[2] *= brightness;
+ g->color2[0] *= brightness;
+ g->color2[1] *= brightness;
+ g->color2[2] *= brightness;
+ }
+
+ /* If a single frame of animation would cause the gear to rotate by
+ more than 1/2 the size of a single tooth, then it won't look right:
+ the gear will appear to be turning at some lower harmonic of its
+ actual speed.
+ */
+ {
+ double ratio = g->ratio * spin_speed;
+ double blur_limit = 180.0 / g->nteeth;
+
+ if (ratio > blur_limit)
+ g->motion_blur_p = 1;
+
+ if (!coaxial_p)
+ {
+ /* ride until the wheels fall off... */
+ if (ratio > blur_limit * 0.7) g->wobble += (random() % 2);
+ if (ratio > blur_limit * 0.9) g->wobble += (random() % 2);
+ if (ratio > blur_limit * 1.1) g->wobble += (random() % 2);
+ if (ratio > blur_limit * 1.3) g->wobble += (random() % 2);
+ if (ratio > blur_limit * 1.5) g->wobble += (random() % 2);
+ if (ratio > blur_limit * 1.7) g->wobble += (random() % 2);
+ }
+ }
+
+ return True;
+}
+
+static void
+free_gear (gear *g)
+{
+ if (g->dlist)
+ glDeleteLists (g->dlist, 1);
+ free (g);
+}
+
+
+/* Make a new gear, place it next to its parent in the scene,
+ with its teeth meshed and the proper velocity. Returns the gear;
+ or 0 if it didn't work. (Call this a bunch of times until either
+ it works, or you decide it's probably not going to.)
+ */
+static gear *
+place_new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ int loop_count = 0;
+ gear *g = 0;
+
+ while (1)
+ {
+ loop_count++;
+ if (loop_count >= 100)
+ {
+ if (g)
+ free_gear (g);
+ g = 0;
+ break;
+ }
+
+ g = new_gear (mi, parent, coaxial_p);
+ if (!g) return 0; /* out of memory? */
+
+ if (place_gear (mi, g, parent, coaxial_p))
+ break;
+ }
+
+ if (! g) return 0;
+
+ /* We got a gear, and it is properly positioned.
+ Insert it in the scene.
+ */
+ if (pp->ngears + 2 >= pp->gears_size)
+ {
+ pp->gears_size += 100;
+ pp->gears = (gear **) realloc (pp->gears,
+ pp->gears_size * sizeof (*pp->gears));
+ if (! pp->gears)
+ {
+ fprintf (stderr, "%s: out of memory (%d gears)\n",
+ progname, pp->gears_size);
+ }
+ }
+
+ pp->gears[pp->ngears++] = g;
+ return g;
+}
+
+
+static void delete_gear (ModeInfo *mi, gear *g);
+
+static void
+push_gear (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ gear *g;
+ gear *parent = (pp->ngears <= 0 ? 0 : pp->gears[pp->ngears-1]);
+
+ Bool tried_coaxial_p = False;
+ Bool coaxial_p = False;
+ Bool last_ditch_coax_p = False;
+ int loop_count = 0;
+
+ pp->debug_size_failures = 0;
+ pp->debug_position_failures = 0;
+
+ AGAIN:
+ loop_count++;
+ if (loop_count > 100) abort(); /* we're doomed! */
+
+ g = 0;
+
+ /* If the gears are turning at LUDICROUS SPEED, unhook the train to
+ reset things to a sane velocity.
+
+ 10,000 RPM at 30 FPS = 5.5 rotations per frame.
+ 1,000 RPM at 30 FPS = 0.5 rotations per frame.
+ 600 RPM at 30 FPS = 3 frames per rotation.
+ 200 RPM at 30 FPS = 9 frames per rotation.
+ 100 RPM at 30 FPS = 18 frames per rotation.
+ 50 RPM at 30 FPS = 36 frames per rotation.
+ 10 RPM at 30 FPS = 3 sec per rotation.
+ 1 RPM at 30 FPS = 30 sec per rotation.
+ .5 RPM at 30 FPS = 1 min per rotation.
+ .1 RPM at 30 FPS = 5 min per rotation.
+ */
+ if (parent && parent->rpm > max_rpm)
+ {
+ if (verbose_p)
+ {
+ char buf[100];
+ rpm_string (parent->rpm, buf);
+ fprintf (stderr, "%s: ludicrous speed! %s\n\n", progname, buf);
+ }
+ parent = 0;
+ }
+
+ /* If the last N gears we've placed have all been motion-blurred, then
+ it's a safe guess that we've wandered off into the woods and aren't
+ coming back. Bail on this train.
+ */
+ if (pp->current_blur_length >= 10)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: it's a blurpocalypse!\n\n", progname);
+ parent = 0;
+ }
+
+
+
+ /* Sometimes, try to make a coaxial gear.
+ */
+ if (parent && !parent->coax_p && (random() % 40) == 0)
+ {
+ tried_coaxial_p = True;
+ coaxial_p = True;
+ g = place_new_gear (mi, parent, coaxial_p);
+ }
+
+ /* Try to make a regular gear.
+ */
+ if (!g)
+ {
+ coaxial_p = False;
+ g = place_new_gear (mi, parent, coaxial_p);
+ }
+
+ /* If we couldn't make a regular gear, then try to make a coxial gear
+ (unless we already tried that.)
+ */
+ if (!g && !tried_coaxial_p && parent && !parent->coax_p)
+ {
+ tried_coaxial_p = True;
+ coaxial_p = True;
+ g = place_new_gear (mi, parent, coaxial_p);
+ if (g)
+ last_ditch_coax_p = True;
+ }
+
+ /* If we couldn't do that either, then the train has hit a dead end:
+ start a new train.
+ */
+ if (!g)
+ {
+ coaxial_p = False;
+ if (verbose_p)
+ fprintf (stderr, "%s: dead end!\n\n", progname);
+ parent = 0;
+ g = place_new_gear (mi, parent, coaxial_p);
+ }
+
+ if (! g)
+ {
+ /* Unable to make/place any gears at all!
+ This can happen if we've backed ourself into a corner very near
+ the top-right or bottom-right corner of the growth zone.
+ It's time to add a gear, but there's no room to add one!
+ In that case, let's just wipe all the gears that are in the
+ growth zone and try again.
+ */
+ int i;
+
+ if (verbose_p && debug_placement_p)
+ fprintf (stderr,
+ "%s: placement: resetting growth zone! "
+ "failed: %d size, %d pos\n",
+ progname,
+ pp->debug_size_failures, pp->debug_position_failures);
+ for (i = pp->ngears-1; i >= 0; i--)
+ {
+ gear *g = pp->gears[i];
+ if (g->x - g->r - g->tooth_h < pp->render_left)
+ delete_gear (mi, g);
+ }
+ goto AGAIN;
+ }
+
+ if (g->coax_p)
+ {
+ if (!parent) abort();
+ if (g->x != parent->x) abort();
+ if (g->y != parent->y) abort();
+ if (g->z == parent->z) abort();
+ if (g->r == parent->r) abort();
+ if (g->th != parent->th) abort();
+ if (g->ratio != parent->ratio) abort();
+ if (g->rpm != parent->rpm) abort();
+ }
+
+ if (verbose_p)
+ {
+ fprintf (stderr, "%s: %5lu ", progname, g->id);
+
+ fputc ((g->motion_blur_p ? '*' : ' '), stderr);
+ fputc (((g->coax_p && last_ditch_coax_p) ? '2' :
+ g->coax_p ? '1' : ' '),
+ stderr);
+
+ fprintf (stderr, " %2d%%",
+ (int) (g->r * 2 * 100 / pp->vp_height));
+ fprintf (stderr, " %2d teeth", (int) g->nteeth);
+ fprintf (stderr, " %3.0f rpm;", g->rpm);
+
+ {
+ char buf1[50], buf2[50], buf3[100];
+ *buf1 = 0; *buf2 = 0; *buf3 = 0;
+ if (pp->debug_size_failures)
+ sprintf (buf1, "%3d sz", pp->debug_size_failures);
+ if (pp->debug_position_failures)
+ sprintf (buf2, "%2d pos", pp->debug_position_failures);
+ if (*buf1 || *buf2)
+ sprintf (buf3, " tries: %-7s%s", buf1, buf2);
+ fprintf (stderr, "%-21s", buf3);
+ }
+
+ if (g->base_p) fprintf (stderr, " RESET %lu", pp->current_length);
+ fprintf (stderr, "\n");
+ }
+
+ if (g->base_p)
+ pp->current_length = 1;
+ else
+ pp->current_length++;
+
+ if (g->motion_blur_p)
+ pp->current_blur_length++;
+ else
+ pp->current_blur_length = 0;
+}
+
+
+
+/* Remove the given gear from the scene and free it.
+ */
+static void
+delete_gear (ModeInfo *mi, gear *g)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ int i;
+
+ for (i = 0; i < pp->ngears; i++) /* find this gear in the list */
+ if (pp->gears[i] == g) break;
+ if (pp->gears[i] != g) abort();
+
+ for (; i < pp->ngears-1; i++) /* pull later entries forward */
+ pp->gears[i] = pp->gears[i+1];
+ pp->gears[i] = 0;
+ pp->ngears--;
+ free_gear (g);
+}
+
+
+/* Update the position of each gear in the scene.
+ */
+static void
+scroll_gears (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ int i;
+
+ for (i = 0; i < pp->ngears; i++)
+ pp->gears[i]->x -= (scroll_speed * 0.002);
+
+ /* if the right edge of any gear is off screen to the left, delete it.
+ */
+ for (i = pp->ngears-1; i >= 0; i--)
+ {
+ gear *g = pp->gears[i];
+ if (g->x + g->r + g->tooth_h < pp->render_left)
+ delete_gear (mi, g);
+ }
+
+ /* if the right edge of the last-added gear is left of the right edge
+ of the layout area, add another gear.
+ */
+ i = 0;
+ while (1)
+ {
+ gear *g = (pp->ngears <= 0 ? 0 : pp->gears[pp->ngears-1]);
+ if (!g || g->x + g->r + g->tooth_h < pp->layout_right)
+ push_gear (mi);
+ else
+ break;
+ i++;
+ if (debug_one_gear_p) break;
+ }
+
+ /*
+ if (i > 1 && verbose_p)
+ fprintf (stderr, "%s: pushed %d gears\n", progname, i);
+ */
+}
+
+
+/* Update the rotation of each gear in the scene.
+ */
+static void
+spin_gears (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ int i;
+
+ for (i = 0; i < pp->ngears; i++)
+ {
+ gear *g = pp->gears[i];
+ double off = (g->ratio * spin_speed);
+
+ if (g->th > 0)
+ g->th += off;
+ else
+ g->th -= off;
+ }
+}
+
+
+/* Run the animation fast (without displaying anything) until the first
+ gear is just about to come on screen. This is to avoid a big delay
+ with a blank screen when -scroll is low.
+ */
+static void
+ffwd (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ if (debug_one_gear_p) return;
+ while (1)
+ {
+ gear *g = farthest_gear (mi, True);
+ if (g && g->x - g->r - g->tooth_h/2 <= pp->vp_right * 0.88)
+ break;
+ scroll_gears (mi);
+ }
+}
+
+
+
+/* Render one gear in the proper position, creating the gear's
+ display list first if necessary.
+ */
+static void
+draw_gear (ModeInfo *mi, int which)
+{
+ Bool wire_p = MI_IS_WIREFRAME(mi);
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ gear *g = pp->gears[which];
+ GLfloat th;
+
+ Bool visible_p = (g->x + g->r + g->tooth_h >= pp->render_left &&
+ g->x - g->r - g->tooth_h <= pp->render_right);
+
+ if (!visible_p && !debug_p)
+ return;
+
+ if (! g->dlist)
+ {
+ g->dlist = glGenLists (1);
+ if (! g->dlist)
+ {
+ /* I don't know how many display lists a GL implementation
+ is supposed to provide, but hopefully it's more than
+ "a few hundred", or we'll be in trouble...
+ */
+ check_gl_error ("glGenLists");
+ abort();
+ }
+
+ glNewList (g->dlist, GL_COMPILE);
+ g->polygons = draw_involute_gear (g, (wire_p && debug_p ? 2 : wire_p));
+ glEndList ();
+ }
+
+ glPushMatrix();
+
+ glTranslatef (g->x, g->y, g->z);
+
+ if (g->motion_blur_p && !pp->button_down_p)
+ {
+ /* If we're in motion-blur mode, then draw the gear so that each
+ frame rotates it by exactly one half tooth-width, so that it
+ looks flickery around the edges. But, revert to the normal
+ way when the mouse button is down lest the user see overlapping
+ polygons.
+ */
+ th = g->motion_blur_p * 180.0 / g->nteeth * (g->th > 0 ? 1 : -1);
+ g->motion_blur_p++;
+ }
+ else
+ th = g->th;
+
+ glRotatef (th, 0, 0, 1);
+
+ glPushName (g->id);
+
+ if (! visible_p)
+ mi->polygon_count += draw_involute_schematic (g, wire_p);
+ else
+ {
+ glCallList (g->dlist);
+ mi->polygon_count += g->polygons;
+ }
+
+ glPopName();
+ glPopMatrix();
+}
+
+
+/* Render all gears.
+ */
+static void
+draw_gears (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ Bool wire_p = MI_IS_WIREFRAME(mi);
+ int i;
+
+ glColor4f (1, 1, 0.8, 1);
+
+ glInitNames();
+
+ for (i = 0; i < pp->ngears; i++)
+ draw_gear (mi, i);
+
+ /* draw a line connecting gears that are, uh, geared. */
+ if (debug_p)
+ {
+ static const GLfloat color[4] = {1.0, 0.0, 0.0, 1.0};
+ GLfloat off = 0.1;
+ GLfloat ox=0, oy=0, oz=0;
+
+ if (!wire_p) glDisable(GL_LIGHTING);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glColor3f (color[0], color[1], color[2]);
+
+ for (i = 0; i < pp->ngears; i++)
+ {
+ gear *g = pp->gears[i];
+ glBegin(GL_LINE_STRIP);
+ glVertex3f (g->x, g->y, g->z - off);
+ glVertex3f (g->x, g->y, g->z + off);
+ if (i > 0 && !g->base_p)
+ glVertex3f (ox, oy, oz + off);
+ glEnd();
+ ox = g->x;
+ oy = g->y;
+ oz = g->z;
+ }
+ if (!wire_p) glEnable(GL_LIGHTING);
+ }
+}
+
+
+/* Mouse hit detection
+ */
+static void
+find_mouse_gear (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+
+# ifndef HAVE_JWZGLES
+
+ int screen_width = MI_WIDTH (mi);
+ int screen_height = MI_HEIGHT (mi);
+ GLfloat h = (GLfloat) screen_height / (GLfloat) screen_width;
+ int x, y;
+ int hits;
+
+ pp->mouse_gear_id = 0;
+
+ /* Poll mouse position */
+ {
+ Window r, c;
+ int rx, ry;
+ unsigned int m;
+ XQueryPointer (MI_DISPLAY (mi), MI_WINDOW (mi),
+ &r, &c, &rx, &ry, &x, &y, &m);
+ }
+
+ if (x < 0 || y < 0 || x > screen_width || y > screen_height)
+ return; /* out of window */
+
+ /* Run OpenGL hit detector */
+ {
+ GLint vp[4];
+ GLuint selbuf[512];
+
+ glSelectBuffer (sizeof(selbuf), selbuf); /* set up "select" mode */
+ glRenderMode (GL_SELECT);
+ glMatrixMode (GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glGetIntegerv (GL_VIEWPORT, vp); /* save old vp */
+ gluPickMatrix (x, vp[3]-y, 5, 5, vp);
+ gluPerspective (30.0, 1/h, 1.0, 100.0); /* must match reshape_pinion() */
+ glMatrixMode (GL_MODELVIEW);
+
+ draw_gears (mi); /* render into "select" buffer */
+
+ glMatrixMode (GL_PROJECTION); /* restore old vp */
+ glPopMatrix ();
+ glMatrixMode (GL_MODELVIEW);
+ glFlush();
+ hits = glRenderMode (GL_RENDER); /* done selecting */
+
+ if (hits > 0)
+ {
+ int i;
+ GLuint name_count = 0;
+ GLuint *p = (GLuint *) selbuf;
+ GLuint *pnames = 0;
+ GLuint min_z = ~0;
+
+ for (i = 0; i < hits; i++)
+ {
+ int names = *p++;
+ if (*p < min_z) /* find match closest to screen */
+ {
+ name_count = names;
+ min_z = *p;
+ pnames = p+2;
+ }
+ p += names+2;
+ }
+
+ if (name_count > 0) /* take first hit */
+ pp->mouse_gear_id = pnames[0];
+ }
+ }
+
+#else /* HAVE_JWZGLES */
+ /* #### not yet implemented */
+ pp->mouse_gear_id = (pp->ngears > 1 ? pp->gears[1]->id : 0);
+ return;
+#endif /* HAVE_JWZGLES */
+
+
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_pinion (ModeInfo *mi, int width, int height)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ {
+ GLfloat render_width, layout_width;
+ pp->vp_height = 1.0;
+ pp->vp_width = 1/h;
+
+ pp->vp_left = -pp->vp_width/2;
+ pp->vp_right = pp->vp_width/2;
+ pp->vp_top = pp->vp_height/2;
+ pp->vp_bottom = -pp->vp_height/2;
+
+ render_width = pp->vp_width * 2;
+ layout_width = pp->vp_width * 0.8 * gear_size;
+
+ pp->render_left = -render_width/2;
+ pp->render_right = render_width/2;
+
+ pp->layout_left = pp->render_right;
+ pp->layout_right = pp->layout_left + layout_width;
+ }
+}
+
+
+ENTRYPOINT Bool
+pinion_handle_event (ModeInfo *mi, XEvent *event)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, pp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &pp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' && debug_one_gear_p && pp->ngears)
+ {
+ delete_gear (mi, pp->gears[0]);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_pinion (ModeInfo *mi)
+{
+ pinion_configuration *pp;
+
+ MI_INIT (mi, pps);
+
+ pp = &pps[MI_SCREEN(mi)];
+
+ pp->glx_context = init_GL(mi);
+
+ load_fonts (mi);
+ reshape_pinion (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ pp->ngears = 0;
+ pp->gears_size = 0;
+ pp->gears = 0;
+
+ pp->plane_displacement = gear_size * 0.1;
+
+ pp->trackball = gltrackball_init (False);
+
+ ffwd (mi);
+}
+
+
+ENTRYPOINT void
+draw_pinion (ModeInfo *mi)
+{
+ pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ Bool wire_p = MI_IS_WIREFRAME(mi);
+
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(pp->glx_context));
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ if (!wire_p)
+ {
+ GLfloat pos[4] = {-3.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = { 0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = { 1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = { 1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ if (!pp->button_down_p)
+ {
+ if (!debug_one_gear_p || pp->ngears == 0)
+ scroll_gears (mi);
+ spin_gears (mi);
+ }
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ {
+ gltrackball_rotate (pp->trackball);
+ mi->polygon_count = 0;
+
+ glScalef (16, 16, 16); /* map vp_width/height to the screen */
+
+ if (debug_one_gear_p) /* zoom in */
+ glScalef (3, 3, 3);
+ else if (debug_p) /* show the "visible" and "layout" areas */
+ {
+ GLfloat ow = pp->layout_right - pp->render_left;
+ GLfloat rw = pp->render_right - pp->render_left;
+ GLfloat s = (pp->vp_width / ow) * 0.85;
+ glScalef (s, s, s);
+ glTranslatef (-(ow - rw) / 2, 0, 0);
+ }
+ else
+ {
+ GLfloat s = 1.2;
+ glScalef (s, s, s); /* zoom in a little more */
+ glRotatef (-35, 1, 0, 0); /* tilt back */
+ glRotatef ( 8, 0, 1, 0); /* tilt left */
+ glTranslatef (0.02, 0.1, 0); /* pan up */
+ }
+
+ draw_gears (mi);
+
+ if (debug_p)
+ {
+ if (!wire_p) glDisable(GL_LIGHTING);
+ glColor3f (0.6, 0, 0);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f (pp->render_left, pp->vp_top, 0);
+ glVertex3f (pp->render_right, pp->vp_top, 0);
+ glVertex3f (pp->render_right, pp->vp_bottom, 0);
+ glVertex3f (pp->render_left, pp->vp_bottom, 0);
+ glEnd();
+ glColor3f (0.4, 0, 0);
+ glBegin(GL_LINES);
+ glVertex3f (pp->vp_left, pp->vp_top, 0);
+ glVertex3f (pp->vp_left, pp->vp_bottom, 0);
+ glVertex3f (pp->vp_right, pp->vp_top, 0);
+ glVertex3f (pp->vp_right, pp->vp_bottom, 0);
+ glEnd();
+ glColor3f (0, 0.4, 0);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f (pp->layout_left, pp->vp_top, 0);
+ glVertex3f (pp->layout_right, pp->vp_top, 0);
+ glVertex3f (pp->layout_right, pp->vp_bottom, 0);
+ glVertex3f (pp->layout_left, pp->vp_bottom, 0);
+ glEnd();
+ if (!wire_p) glEnable(GL_LIGHTING);
+ }
+
+ if (pp->draw_tick++ > 10) /* only do this every N frames */
+ {
+ pp->draw_tick = 0;
+ find_mouse_gear (mi);
+ }
+ }
+ glPopMatrix ();
+
+ draw_label (mi);
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Pinion", pinion)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/pinion.man b/hacks/glx/pinion.man
new file mode 100644
index 0000000..3ae6eff
--- /dev/null
+++ b/hacks/glx/pinion.man
@@ -0,0 +1,82 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+pinion - draws a scrolling sequence of interconnected gears
+.SH SYNOPSIS
+.B pinion
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-scroll \fIratio\fP]
+[\-spin \fIratio\fP]
+[\-size \fIratio\fP]
+[\-max-rpm \fIint\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIpinion\fP program draws an interconnected set of gears moving
+across the screen.
+.SH OPTIONS
+.I pinion
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds: default 15000.
+.TP 8
+.B \-spin \fIratio\fP
+How fast the gears should spin; default 1.0. 2.0 means twice as fast,
+0.5 means half as fast.
+.TP 8
+.B \-scroll \fIratio\fP
+How fast the gears should scroll past the screen; default 1.0.
+2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-size \fIratio\fP
+How big the gears should be, on average; default 1.0.
+2.0 means twice as large, 0.5 means half as large.
+.TP 8
+.B \-max\-rpm \fIinteger\fP
+If any gear exceeds the maximum RPM, the current gear train is broken there,
+and we start a new train. Default: 900 RPM. (At 30 FPS, that's about half
+a rotation per frame.)
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR gears (MANSUFFIX),
+.BR xscreensaver (1),
+.BR X (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 12-Dec-2004.
diff --git a/hacks/glx/pipeobjs.c b/hacks/glx/pipeobjs.c
new file mode 100644
index 0000000..8874a04
--- /dev/null
+++ b/hacks/glx/pipeobjs.c
@@ -0,0 +1,3262 @@
+#if 0
+static const char sccsid[] = "@(#)pipeobjs.c 4.04 97/07/28 xlockmore";
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render objects for pipes.
+ *
+ * Generated by lw2ogl.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#include "buildlwo.h"
+
+static const GLfloat BigValve_PNTS[] =
+{
+ 0.756788, 0.614672, 0,
+ 0.779498, 0.599497, 0,
+ 0.794672, 0.576788, 0,
+ 0.8, 0.55, 0,
+ 0.794672, 0.523212, 0,
+ 0.779498, 0.500503, 0,
+ 0.756788, 0.485328, 0,
+ 0.73, 0.48, 0,
+ 0.703212, 0.485328, 0,
+ 0.680503, 0.500503, 0,
+ 0.665328, 0.523212, 0,
+ 0.66, 0.55, 0,
+ 0.665328, 0.576788, 0,
+ 0.680503, 0.599497, 0,
+ 0.703212, 0.614672, 0,
+ 0.73, 0.62, 0,
+ 0.756788, 0.602861, 0.119916,
+ 0.779498, 0.587978, 0.116956,
+ 0.794672, 0.565705, 0.112526,
+ 0.8, 0.539432, 0.1073,
+ 0.794672, 0.513159, 0.102074,
+ 0.779498, 0.490886, 0.097643,
+ 0.756788, 0.476003, 0.094683,
+ 0.73, 0.470777, 0.093643,
+ 0.703212, 0.476003, 0.094683,
+ 0.680503, 0.490886, 0.097643,
+ 0.665328, 0.513159, 0.102074,
+ 0.66, 0.539432, 0.1073,
+ 0.665328, 0.565705, 0.112526,
+ 0.680503, 0.587978, 0.116956,
+ 0.703212, 0.602861, 0.119916,
+ 0.73, 0.608087, 0.120956,
+ 0.756788, 0.567882, 0.235225,
+ 0.779498, 0.553863, 0.229418,
+ 0.794672, 0.532882, 0.220727,
+ 0.8, 0.508134, 0.210476,
+ 0.794672, 0.483385, 0.200225,
+ 0.779498, 0.462404, 0.191534,
+ 0.756788, 0.448385, 0.185727,
+ 0.73, 0.443462, 0.183688,
+ 0.703212, 0.448385, 0.185727,
+ 0.680503, 0.462404, 0.191534,
+ 0.665328, 0.483385, 0.200225,
+ 0.66, 0.508134, 0.210476,
+ 0.665328, 0.532882, 0.220727,
+ 0.680503, 0.553863, 0.229418,
+ 0.703212, 0.567882, 0.235225,
+ 0.73, 0.572805, 0.237264,
+ 0.756788, 0.511081, 0.341493,
+ 0.779498, 0.498464, 0.333063,
+ 0.794672, 0.479582, 0.320446,
+ 0.8, 0.457308, 0.305564,
+ 0.794672, 0.435035, 0.290681,
+ 0.779498, 0.416153, 0.278064,
+ 0.756788, 0.403536, 0.269634,
+ 0.73, 0.399105, 0.266674,
+ 0.703212, 0.403536, 0.269634,
+ 0.680503, 0.416153, 0.278064,
+ 0.665328, 0.435035, 0.290681,
+ 0.66, 0.457308, 0.305564,
+ 0.665328, 0.479582, 0.320446,
+ 0.680503, 0.498464, 0.333063,
+ 0.703212, 0.511081, 0.341493,
+ 0.73, 0.515511, 0.344454,
+ 0.756788, 0.434638, 0.434638,
+ 0.779498, 0.423909, 0.423909,
+ 0.794672, 0.407851, 0.407851,
+ 0.8, 0.388909, 0.388909,
+ 0.794672, 0.369967, 0.369967,
+ 0.779498, 0.353909, 0.353909,
+ 0.756788, 0.343179, 0.343179,
+ 0.73, 0.339411, 0.339411,
+ 0.703212, 0.343179, 0.343179,
+ 0.680503, 0.353909, 0.353909,
+ 0.665328, 0.369967, 0.369967,
+ 0.66, 0.388909, 0.388909,
+ 0.665328, 0.407851, 0.407851,
+ 0.680503, 0.423909, 0.423909,
+ 0.703212, 0.434638, 0.434638,
+ 0.73, 0.438406, 0.438406,
+ 0.756788, 0.341493, 0.511081,
+ 0.779498, 0.333063, 0.498464,
+ 0.794672, 0.320446, 0.479582,
+ 0.8, 0.305564, 0.457308,
+ 0.794672, 0.290681, 0.435035,
+ 0.779498, 0.278064, 0.416153,
+ 0.756788, 0.269634, 0.403536,
+ 0.73, 0.266674, 0.399105,
+ 0.703212, 0.269634, 0.403536,
+ 0.680503, 0.278064, 0.416153,
+ 0.665328, 0.290681, 0.435035,
+ 0.66, 0.305564, 0.457308,
+ 0.665328, 0.320446, 0.479582,
+ 0.680503, 0.333063, 0.498464,
+ 0.703212, 0.341493, 0.511081,
+ 0.73, 0.344454, 0.515511,
+ 0.756788, 0.235225, 0.567882,
+ 0.779498, 0.229418, 0.553863,
+ 0.794672, 0.220727, 0.532882,
+ 0.8, 0.210476, 0.508134,
+ 0.794672, 0.200225, 0.483385,
+ 0.779498, 0.191534, 0.462404,
+ 0.756788, 0.185727, 0.448385,
+ 0.73, 0.183688, 0.443462,
+ 0.703212, 0.185727, 0.448385,
+ 0.680503, 0.191534, 0.462404,
+ 0.665328, 0.200225, 0.483385,
+ 0.66, 0.210476, 0.508134,
+ 0.665328, 0.220727, 0.532882,
+ 0.680503, 0.229418, 0.553863,
+ 0.703212, 0.235225, 0.567882,
+ 0.73, 0.237264, 0.572805,
+ 0.756788, 0.119916, 0.602861,
+ 0.779498, 0.116956, 0.587978,
+ 0.794672, 0.112526, 0.565705,
+ 0.8, 0.1073, 0.539432,
+ 0.794672, 0.102074, 0.513159,
+ 0.779498, 0.097643, 0.490886,
+ 0.756788, 0.094683, 0.476003,
+ 0.73, 0.093643, 0.470777,
+ 0.703212, 0.094683, 0.476003,
+ 0.680503, 0.097643, 0.490886,
+ 0.665328, 0.102074, 0.513159,
+ 0.66, 0.1073, 0.539432,
+ 0.665328, 0.112526, 0.565705,
+ 0.680503, 0.116956, 0.587978,
+ 0.703212, 0.119916, 0.602861,
+ 0.73, 0.120956, 0.608087,
+ 0.756788, 0, 0.614672,
+ 0.779498, 0, 0.599497,
+ 0.794672, 0, 0.576788,
+ 0.8, 0, 0.55,
+ 0.794672, 0, 0.523212,
+ 0.779498, 0, 0.500503,
+ 0.756788, 0, 0.485328,
+ 0.73, 0, 0.48,
+ 0.703212, 0, 0.485328,
+ 0.680503, 0, 0.500503,
+ 0.665328, 0, 0.523212,
+ 0.66, 0, 0.55,
+ 0.665328, 0, 0.576788,
+ 0.680503, 0, 0.599497,
+ 0.703212, 0, 0.614672,
+ 0.73, 0, 0.62,
+ 0.756788, -0.119916, 0.602861,
+ 0.779498, -0.116956, 0.587978,
+ 0.794672, -0.112526, 0.565705,
+ 0.8, -0.1073, 0.539432,
+ 0.794672, -0.102074, 0.513159,
+ 0.779498, -0.097643, 0.490886,
+ 0.756788, -0.094683, 0.476003,
+ 0.73, -0.093643, 0.470777,
+ 0.703212, -0.094683, 0.476003,
+ 0.680503, -0.097643, 0.490886,
+ 0.665328, -0.102074, 0.513159,
+ 0.66, -0.1073, 0.539432,
+ 0.665328, -0.112526, 0.565705,
+ 0.680503, -0.116956, 0.587978,
+ 0.703212, -0.119916, 0.602861,
+ 0.73, -0.120956, 0.608087,
+ 0.756788, -0.235225, 0.567882,
+ 0.779498, -0.229418, 0.553863,
+ 0.794672, -0.220727, 0.532882,
+ 0.8, -0.210476, 0.508134,
+ 0.794672, -0.200225, 0.483385,
+ 0.779498, -0.191534, 0.462404,
+ 0.756788, -0.185727, 0.448385,
+ 0.73, -0.183688, 0.443462,
+ 0.703212, -0.185727, 0.448385,
+ 0.680503, -0.191534, 0.462404,
+ 0.665328, -0.200225, 0.483385,
+ 0.66, -0.210476, 0.508134,
+ 0.665328, -0.220727, 0.532882,
+ 0.680503, -0.229418, 0.553863,
+ 0.703212, -0.235225, 0.567882,
+ 0.73, -0.237264, 0.572805,
+ 0.756788, -0.341493, 0.511081,
+ 0.779498, -0.333063, 0.498464,
+ 0.794672, -0.320446, 0.479582,
+ 0.8, -0.305564, 0.457308,
+ 0.794672, -0.290681, 0.435035,
+ 0.779498, -0.278064, 0.416153,
+ 0.756788, -0.269634, 0.403536,
+ 0.73, -0.266674, 0.399105,
+ 0.703212, -0.269634, 0.403536,
+ 0.680503, -0.278064, 0.416153,
+ 0.665328, -0.290681, 0.435035,
+ 0.66, -0.305564, 0.457308,
+ 0.665328, -0.320446, 0.479582,
+ 0.680503, -0.333063, 0.498464,
+ 0.703212, -0.341493, 0.511081,
+ 0.73, -0.344454, 0.515511,
+ 0.756788, -0.434638, 0.434638,
+ 0.779498, -0.423909, 0.423909,
+ 0.794672, -0.407851, 0.407851,
+ 0.8, -0.388909, 0.388909,
+ 0.794672, -0.369967, 0.369967,
+ 0.779498, -0.353909, 0.353909,
+ 0.756788, -0.343179, 0.343179,
+ 0.73, -0.339411, 0.339411,
+ 0.703212, -0.343179, 0.343179,
+ 0.680503, -0.353909, 0.353909,
+ 0.665328, -0.369967, 0.369967,
+ 0.66, -0.388909, 0.388909,
+ 0.665328, -0.407851, 0.407851,
+ 0.680503, -0.423909, 0.423909,
+ 0.703212, -0.434638, 0.434638,
+ 0.73, -0.438406, 0.438406,
+ 0.756788, -0.511081, 0.341493,
+ 0.779498, -0.498464, 0.333063,
+ 0.794672, -0.479582, 0.320446,
+ 0.8, -0.457308, 0.305564,
+ 0.794672, -0.435035, 0.290681,
+ 0.779498, -0.416153, 0.278064,
+ 0.756788, -0.403536, 0.269634,
+ 0.73, -0.399105, 0.266674,
+ 0.703212, -0.403536, 0.269634,
+ 0.680503, -0.416153, 0.278064,
+ 0.665328, -0.435035, 0.290681,
+ 0.66, -0.457308, 0.305564,
+ 0.665328, -0.479582, 0.320446,
+ 0.680503, -0.498464, 0.333063,
+ 0.703212, -0.511081, 0.341493,
+ 0.73, -0.515511, 0.344454,
+ 0.756788, -0.567882, 0.235225,
+ 0.779498, -0.553863, 0.229418,
+ 0.794672, -0.532882, 0.220727,
+ 0.8, -0.508134, 0.210476,
+ 0.794672, -0.483385, 0.200225,
+ 0.779498, -0.462404, 0.191534,
+ 0.756788, -0.448385, 0.185727,
+ 0.73, -0.443462, 0.183688,
+ 0.703212, -0.448385, 0.185727,
+ 0.680503, -0.462404, 0.191534,
+ 0.665328, -0.483385, 0.200225,
+ 0.66, -0.508134, 0.210476,
+ 0.665328, -0.532882, 0.220727,
+ 0.680503, -0.553863, 0.229418,
+ 0.703212, -0.567882, 0.235225,
+ 0.73, -0.572805, 0.237264,
+ 0.756788, -0.602861, 0.119916,
+ 0.779498, -0.587978, 0.116956,
+ 0.794672, -0.565705, 0.112526,
+ 0.8, -0.539432, 0.1073,
+ 0.794672, -0.513159, 0.102074,
+ 0.779498, -0.490886, 0.097643,
+ 0.756788, -0.476003, 0.094683,
+ 0.73, -0.470777, 0.093643,
+ 0.703212, -0.476003, 0.094683,
+ 0.680503, -0.490886, 0.097643,
+ 0.665328, -0.513159, 0.102074,
+ 0.66, -0.539432, 0.1073,
+ 0.665328, -0.565705, 0.112526,
+ 0.680503, -0.587978, 0.116956,
+ 0.703212, -0.602861, 0.119916,
+ 0.73, -0.608087, 0.120956,
+ 0.756788, -0.614672, 0,
+ 0.779498, -0.599497, 0,
+ 0.794672, -0.576788, 0,
+ 0.8, -0.55, 0,
+ 0.794672, -0.523212, 0,
+ 0.779498, -0.500503, 0,
+ 0.756788, -0.485328, 0,
+ 0.73, -0.48, 0,
+ 0.703212, -0.485328, 0,
+ 0.680503, -0.500503, 0,
+ 0.665328, -0.523212, 0,
+ 0.66, -0.55, 0,
+ 0.665328, -0.576788, 0,
+ 0.680503, -0.599497, 0,
+ 0.703212, -0.614672, 0,
+ 0.73, -0.62, 0,
+ 0.756788, -0.602861, -0.119916,
+ 0.779498, -0.587978, -0.116956,
+ 0.794672, -0.565705, -0.112526,
+ 0.8, -0.539432, -0.1073,
+ 0.794672, -0.513159, -0.102074,
+ 0.779498, -0.490886, -0.097643,
+ 0.756788, -0.476003, -0.094683,
+ 0.73, -0.470777, -0.093643,
+ 0.703212, -0.476003, -0.094683,
+ 0.680503, -0.490886, -0.097643,
+ 0.665328, -0.513159, -0.102074,
+ 0.66, -0.539432, -0.1073,
+ 0.665328, -0.565705, -0.112526,
+ 0.680503, -0.587978, -0.116956,
+ 0.703212, -0.602861, -0.119916,
+ 0.73, -0.608087, -0.120956,
+ 0.756788, -0.567882, -0.235225,
+ 0.779498, -0.553863, -0.229418,
+ 0.794672, -0.532882, -0.220727,
+ 0.8, -0.508134, -0.210476,
+ 0.794672, -0.483385, -0.200225,
+ 0.779498, -0.462404, -0.191534,
+ 0.756788, -0.448385, -0.185727,
+ 0.73, -0.443462, -0.183688,
+ 0.703212, -0.448385, -0.185727,
+ 0.680503, -0.462404, -0.191534,
+ 0.665328, -0.483385, -0.200225,
+ 0.66, -0.508134, -0.210476,
+ 0.665328, -0.532882, -0.220727,
+ 0.680503, -0.553863, -0.229418,
+ 0.703212, -0.567882, -0.235225,
+ 0.73, -0.572805, -0.237264,
+ 0.756788, -0.511081, -0.341493,
+ 0.779498, -0.498464, -0.333063,
+ 0.794672, -0.479582, -0.320446,
+ 0.8, -0.457308, -0.305564,
+ 0.794672, -0.435035, -0.290681,
+ 0.779498, -0.416153, -0.278064,
+ 0.756788, -0.403536, -0.269634,
+ 0.73, -0.399105, -0.266674,
+ 0.703212, -0.403536, -0.269634,
+ 0.680503, -0.416153, -0.278064,
+ 0.665328, -0.435035, -0.290681,
+ 0.66, -0.457308, -0.305564,
+ 0.665328, -0.479582, -0.320446,
+ 0.680503, -0.498464, -0.333063,
+ 0.703212, -0.511081, -0.341493,
+ 0.73, -0.515511, -0.344454,
+ 0.756788, -0.434638, -0.434638,
+ 0.779498, -0.423909, -0.423909,
+ 0.794672, -0.407851, -0.407851,
+ 0.8, -0.388909, -0.388909,
+ 0.794672, -0.369967, -0.369967,
+ 0.779498, -0.353909, -0.353909,
+ 0.756788, -0.343179, -0.343179,
+ 0.73, -0.339411, -0.339411,
+ 0.703212, -0.343179, -0.343179,
+ 0.680503, -0.353909, -0.353909,
+ 0.665328, -0.369967, -0.369967,
+ 0.66, -0.388909, -0.388909,
+ 0.665328, -0.407851, -0.407851,
+ 0.680503, -0.423909, -0.423909,
+ 0.703212, -0.434638, -0.434638,
+ 0.73, -0.438406, -0.438406,
+ 0.756788, -0.341493, -0.511081,
+ 0.779498, -0.333063, -0.498464,
+ 0.794672, -0.320446, -0.479582,
+ 0.8, -0.305564, -0.457308,
+ 0.794672, -0.290681, -0.435035,
+ 0.779498, -0.278064, -0.416153,
+ 0.756788, -0.269634, -0.403536,
+ 0.73, -0.266674, -0.399105,
+ 0.703212, -0.269634, -0.403536,
+ 0.680503, -0.278064, -0.416153,
+ 0.665328, -0.290681, -0.435035,
+ 0.66, -0.305564, -0.457308,
+ 0.665328, -0.320446, -0.479582,
+ 0.680503, -0.333063, -0.498464,
+ 0.703212, -0.341493, -0.511081,
+ 0.73, -0.344454, -0.515511,
+ 0.756788, -0.235225, -0.567882,
+ 0.779498, -0.229418, -0.553863,
+ 0.794672, -0.220727, -0.532882,
+ 0.8, -0.210476, -0.508134,
+ 0.794672, -0.200225, -0.483385,
+ 0.779498, -0.191534, -0.462404,
+ 0.756788, -0.185727, -0.448385,
+ 0.73, -0.183688, -0.443462,
+ 0.703212, -0.185727, -0.448385,
+ 0.680503, -0.191534, -0.462404,
+ 0.665328, -0.200225, -0.483385,
+ 0.66, -0.210476, -0.508134,
+ 0.665328, -0.220727, -0.532882,
+ 0.680503, -0.229418, -0.553863,
+ 0.703212, -0.235225, -0.567882,
+ 0.73, -0.237264, -0.572805,
+ 0.756788, -0.119916, -0.602861,
+ 0.779498, -0.116956, -0.587978,
+ 0.794672, -0.112526, -0.565705,
+ 0.8, -0.1073, -0.539432,
+ 0.794672, -0.102074, -0.513159,
+ 0.779498, -0.097643, -0.490885,
+ 0.756788, -0.094683, -0.476003,
+ 0.73, -0.093643, -0.470777,
+ 0.703212, -0.094683, -0.476003,
+ 0.680503, -0.097643, -0.490885,
+ 0.665328, -0.102074, -0.513159,
+ 0.66, -0.1073, -0.539432,
+ 0.665328, -0.112526, -0.565705,
+ 0.680503, -0.116956, -0.587978,
+ 0.703212, -0.119916, -0.602861,
+ 0.73, -0.120956, -0.608087,
+ 0.756788, 0, -0.614672,
+ 0.779498, 0, -0.599497,
+ 0.794672, 0, -0.576788,
+ 0.8, 0, -0.55,
+ 0.794672, 0, -0.523212,
+ 0.779498, 0, -0.500503,
+ 0.756788, 0, -0.485328,
+ 0.73, 0, -0.48,
+ 0.703212, 0, -0.485328,
+ 0.680503, 0, -0.500503,
+ 0.665328, 0, -0.523212,
+ 0.66, 0, -0.55,
+ 0.665328, 0, -0.576788,
+ 0.680503, 0, -0.599497,
+ 0.703212, 0, -0.614672,
+ 0.73, 0, -0.62,
+ 0.756788, 0.119916, -0.602861,
+ 0.779498, 0.116956, -0.587978,
+ 0.794672, 0.112526, -0.565705,
+ 0.8, 0.1073, -0.539432,
+ 0.794672, 0.102074, -0.513159,
+ 0.779498, 0.097643, -0.490886,
+ 0.756788, 0.094683, -0.476003,
+ 0.73, 0.093643, -0.470777,
+ 0.703212, 0.094683, -0.476003,
+ 0.680503, 0.097643, -0.490886,
+ 0.665328, 0.102074, -0.513159,
+ 0.66, 0.1073, -0.539432,
+ 0.665328, 0.112526, -0.565705,
+ 0.680503, 0.116956, -0.587978,
+ 0.703212, 0.119916, -0.602861,
+ 0.73, 0.120956, -0.608087,
+ 0.756788, 0.235225, -0.567882,
+ 0.779498, 0.229418, -0.553863,
+ 0.794672, 0.220727, -0.532882,
+ 0.8, 0.210476, -0.508134,
+ 0.794672, 0.200225, -0.483385,
+ 0.779498, 0.191534, -0.462404,
+ 0.756788, 0.185727, -0.448385,
+ 0.73, 0.183688, -0.443462,
+ 0.703212, 0.185727, -0.448385,
+ 0.680503, 0.191534, -0.462404,
+ 0.665328, 0.200225, -0.483385,
+ 0.66, 0.210476, -0.508134,
+ 0.665328, 0.220727, -0.532882,
+ 0.680503, 0.229418, -0.553863,
+ 0.703212, 0.235225, -0.567882,
+ 0.73, 0.237264, -0.572805,
+ 0.756788, 0.341493, -0.511081,
+ 0.779498, 0.333063, -0.498464,
+ 0.794672, 0.320446, -0.479582,
+ 0.8, 0.305564, -0.457308,
+ 0.794672, 0.290681, -0.435035,
+ 0.779498, 0.278064, -0.416153,
+ 0.756788, 0.269634, -0.403536,
+ 0.73, 0.266674, -0.399105,
+ 0.703212, 0.269634, -0.403536,
+ 0.680503, 0.278064, -0.416153,
+ 0.665328, 0.290681, -0.435035,
+ 0.66, 0.305564, -0.457308,
+ 0.665328, 0.320446, -0.479582,
+ 0.680503, 0.333063, -0.498464,
+ 0.703212, 0.341493, -0.511081,
+ 0.73, 0.344454, -0.515511,
+ 0.756788, 0.434638, -0.434638,
+ 0.779498, 0.423909, -0.423909,
+ 0.794672, 0.407851, -0.407851,
+ 0.8, 0.388909, -0.388909,
+ 0.794672, 0.369967, -0.369967,
+ 0.779498, 0.353909, -0.353909,
+ 0.756788, 0.343179, -0.343179,
+ 0.73, 0.339411, -0.339411,
+ 0.703212, 0.343179, -0.343179,
+ 0.680503, 0.353909, -0.353909,
+ 0.665328, 0.369967, -0.369967,
+ 0.66, 0.388909, -0.388909,
+ 0.665328, 0.407851, -0.407851,
+ 0.680503, 0.423909, -0.423909,
+ 0.703212, 0.434638, -0.434638,
+ 0.73, 0.438406, -0.438406,
+ 0.756788, 0.511081, -0.341493,
+ 0.779498, 0.498464, -0.333063,
+ 0.794672, 0.479582, -0.320446,
+ 0.8, 0.457308, -0.305564,
+ 0.794672, 0.435035, -0.290681,
+ 0.779498, 0.416153, -0.278064,
+ 0.756788, 0.403536, -0.269634,
+ 0.73, 0.399105, -0.266674,
+ 0.703212, 0.403536, -0.269634,
+ 0.680503, 0.416153, -0.278064,
+ 0.665328, 0.435035, -0.290681,
+ 0.66, 0.457308, -0.305564,
+ 0.665328, 0.479582, -0.320446,
+ 0.680503, 0.498464, -0.333063,
+ 0.703212, 0.511081, -0.341493,
+ 0.73, 0.515511, -0.344454,
+ 0.756788, 0.567882, -0.235225,
+ 0.779498, 0.553863, -0.229418,
+ 0.794672, 0.532882, -0.220727,
+ 0.8, 0.508134, -0.210476,
+ 0.794672, 0.483385, -0.200225,
+ 0.779498, 0.462404, -0.191534,
+ 0.756788, 0.448385, -0.185727,
+ 0.73, 0.443462, -0.183688,
+ 0.703212, 0.448385, -0.185727,
+ 0.680503, 0.462404, -0.191534,
+ 0.665328, 0.483385, -0.200225,
+ 0.66, 0.508134, -0.210476,
+ 0.665328, 0.532882, -0.220727,
+ 0.680503, 0.553863, -0.229418,
+ 0.703212, 0.567882, -0.235225,
+ 0.73, 0.572805, -0.237264,
+ 0.756788, 0.602861, -0.119916,
+ 0.779498, 0.587978, -0.116956,
+ 0.794672, 0.565705, -0.112526,
+ 0.8, 0.539432, -0.1073,
+ 0.794672, 0.513159, -0.102074,
+ 0.779498, 0.490885, -0.097643,
+ 0.756788, 0.476003, -0.094683,
+ 0.73, 0.470777, -0.093643,
+ 0.703212, 0.476003, -0.094683,
+ 0.680503, 0.490885, -0.097643,
+ 0.665328, 0.513159, -0.102074,
+ 0.66, 0.539432, -0.1073,
+ 0.665328, 0.565705, -0.112526,
+ 0.680503, 0.587978, -0.116956,
+ 0.703212, 0.602861, -0.119916,
+ 0.73, 0.608087, -0.120956,
+ 0.42, 0, -0.2,
+ 0.42, 0.051764, -0.193185,
+ 0.42, 0.1, -0.173205,
+ 0.42, 0.141421, -0.141421,
+ 0.42, 0.173205, -0.1,
+ 0.42, 0.193185, -0.051764,
+ 0.42, 0.2, 0,
+ 0.42, 0.193185, 0.051764,
+ 0.42, 0.173205, 0.1,
+ 0.42, 0.141421, 0.141421,
+ 0.42, 0.1, 0.173205,
+ 0.42, 0.051764, 0.193185,
+ 0.42, 0, 0.2,
+ 0.42, -0.051764, 0.193185,
+ 0.42, -0.1, 0.173205,
+ 0.42, -0.141421, 0.141421,
+ 0.42, -0.173205, 0.1,
+ 0.42, -0.193185, 0.051764,
+ 0.42, -0.2, 0,
+ 0.42, -0.193185, -0.051764,
+ 0.42, -0.173205, -0.1,
+ 0.42, -0.141421, -0.141421,
+ 0.42, -0.1, -0.173205,
+ 0.42, -0.051764, -0.193185,
+ 0.54, 0, -0.2,
+ 0.54, 0.051764, -0.193185,
+ 0.54, 0.1, -0.173205,
+ 0.54, 0.141421, -0.141421,
+ 0.54, 0.173205, -0.1,
+ 0.54, 0.193185, -0.051764,
+ 0.54, 0.2, 0,
+ 0.54, 0.193185, 0.051764,
+ 0.54, 0.173205, 0.1,
+ 0.54, 0.141421, 0.141421,
+ 0.54, 0.1, 0.173205,
+ 0.54, 0.051764, 0.193185,
+ 0.54, 0, 0.2,
+ 0.54, -0.051764, 0.193185,
+ 0.54, -0.1, 0.173205,
+ 0.54, -0.141421, 0.141421,
+ 0.54, -0.173205, 0.1,
+ 0.54, -0.193185, 0.051764,
+ 0.54, -0.2, 0,
+ 0.54, -0.193185, -0.051764,
+ 0.54, -0.173205, -0.1,
+ 0.54, -0.141421, -0.141421,
+ 0.54, -0.1, -0.173205,
+ 0.54, -0.051764, -0.193185,
+ 0.79, 0.06, 0,
+ 0.785433, 0.06, -0.022961,
+ 0.772426, 0.06, -0.042426,
+ 0.752961, 0.06, -0.055433,
+ 0.73, 0.06, -0.06,
+ 0.707039, 0.06, -0.055433,
+ 0.687574, 0.06, -0.042426,
+ 0.674567, 0.06, -0.022961,
+ 0.67, 0.06, 0,
+ 0.674567, 0.06, 0.022961,
+ 0.687574, 0.06, 0.042426,
+ 0.707039, 0.06, 0.055433,
+ 0.73, 0.06, 0.06,
+ 0.752961, 0.06, 0.055433,
+ 0.772426, 0.06, 0.042426,
+ 0.785433, 0.06, 0.022961,
+ 0.79, 0.55, 0,
+ 0.785433, 0.55, -0.022961,
+ 0.772426, 0.55, -0.042426,
+ 0.752961, 0.55, -0.055433,
+ 0.73, 0.55, -0.06,
+ 0.707039, 0.55, -0.055433,
+ 0.687574, 0.55, -0.042426,
+ 0.674567, 0.55, -0.022961,
+ 0.67, 0.55, 0,
+ 0.674567, 0.55, 0.022961,
+ 0.687574, 0.55, 0.042426,
+ 0.707039, 0.55, 0.055433,
+ 0.73, 0.55, 0.06,
+ 0.752961, 0.55, 0.055433,
+ 0.772426, 0.55, 0.042426,
+ 0.785433, 0.55, 0.022961,
+ 0.79, 0, 0.06,
+ 0.785433, 0.022961, 0.06,
+ 0.772426, 0.042426, 0.06,
+ 0.752961, 0.055433, 0.06,
+ 0.707039, 0.055433, 0.06,
+ 0.687574, 0.042426, 0.06,
+ 0.674567, 0.022961, 0.06,
+ 0.67, 0, 0.06,
+ 0.674567, -0.022961, 0.06,
+ 0.687574, -0.042426, 0.06,
+ 0.707039, -0.055433, 0.06,
+ 0.73, -0.06, 0.06,
+ 0.752961, -0.055433, 0.06,
+ 0.772426, -0.042426, 0.06,
+ 0.785433, -0.022961, 0.06,
+ 0.79, 0, 0.55,
+ 0.785433, 0.022961, 0.55,
+ 0.772426, 0.042426, 0.55,
+ 0.752961, 0.055433, 0.55,
+ 0.73, 0.06, 0.55,
+ 0.707039, 0.055433, 0.55,
+ 0.687574, 0.042426, 0.55,
+ 0.674567, 0.022961, 0.55,
+ 0.67, 0, 0.55,
+ 0.674567, -0.022961, 0.55,
+ 0.687574, -0.042426, 0.55,
+ 0.707039, -0.055433, 0.55,
+ 0.73, -0.06, 0.55,
+ 0.752961, -0.055433, 0.55,
+ 0.772426, -0.042426, 0.55,
+ 0.785433, -0.022961, 0.55,
+ 0.79, -0.06, 0,
+ 0.785433, -0.06, 0.022961,
+ 0.772426, -0.06, 0.042426,
+ 0.752961, -0.06, 0.055433,
+ 0.707039, -0.06, 0.055433,
+ 0.687574, -0.06, 0.042426,
+ 0.674567, -0.06, 0.022961,
+ 0.67, -0.06, 0,
+ 0.674567, -0.06, -0.022961,
+ 0.687574, -0.06, -0.042426,
+ 0.707039, -0.06, -0.055433,
+ 0.73, -0.06, -0.06,
+ 0.752961, -0.06, -0.055433,
+ 0.772426, -0.06, -0.042426,
+ 0.785433, -0.06, -0.022961,
+ 0.79, -0.55, 0,
+ 0.785433, -0.55, 0.022961,
+ 0.772426, -0.55, 0.042426,
+ 0.752961, -0.55, 0.055433,
+ 0.73, -0.55, 0.06,
+ 0.707039, -0.55, 0.055433,
+ 0.687574, -0.55, 0.042426,
+ 0.674567, -0.55, 0.022961,
+ 0.67, -0.55, 0,
+ 0.674567, -0.55, -0.022961,
+ 0.687574, -0.55, -0.042426,
+ 0.707039, -0.55, -0.055433,
+ 0.73, -0.55, -0.06,
+ 0.752961, -0.55, -0.055433,
+ 0.772426, -0.55, -0.042426,
+ 0.785433, -0.55, -0.022961,
+ 0.79, 0, -0.06,
+ 0.785433, -0.022961, -0.06,
+ 0.772426, -0.042426, -0.06,
+ 0.752961, -0.055433, -0.06,
+ 0.707039, -0.055433, -0.06,
+ 0.687574, -0.042426, -0.06,
+ 0.674567, -0.022961, -0.06,
+ 0.67, 0, -0.06,
+ 0.674567, 0.022961, -0.06,
+ 0.687574, 0.042426, -0.06,
+ 0.707039, 0.055433, -0.06,
+ 0.752961, 0.055433, -0.06,
+ 0.772426, 0.042426, -0.06,
+ 0.785433, 0.022961, -0.06,
+ 0.79, 0, -0.55,
+ 0.785433, -0.022961, -0.55,
+ 0.772426, -0.042426, -0.55,
+ 0.752961, -0.055433, -0.55,
+ 0.73, -0.06, -0.55,
+ 0.707039, -0.055433, -0.55,
+ 0.687574, -0.042426, -0.55,
+ 0.674567, -0.022961, -0.55,
+ 0.67, 0, -0.55,
+ 0.674567, 0.022961, -0.55,
+ 0.687574, 0.042426, -0.55,
+ 0.707039, 0.055433, -0.55,
+ 0.73, 0.06, -0.55,
+ 0.752961, 0.055433, -0.55,
+ 0.772426, 0.042426, -0.55,
+ 0.785433, 0.022961, -0.55,
+ 0.54, 0, -0.1,
+ 0.54, 0.038268, -0.092388,
+ 0.54, 0.070711, -0.070711,
+ 0.54, 0.092388, -0.038268,
+ 0.54, 0.1, 0,
+ 0.54, 0.092388, 0.038268,
+ 0.54, 0.070711, 0.070711,
+ 0.54, 0.038268, 0.092388,
+ 0.54, 0, 0.1,
+ 0.54, -0.038268, 0.092388,
+ 0.54, -0.070711, 0.070711,
+ 0.54, -0.092388, 0.038268,
+ 0.54, -0.1, 0,
+ 0.54, -0.092388, -0.038268,
+ 0.54, -0.070711, -0.070711,
+ 0.54, -0.038268, -0.092388,
+ 0.8, 0, -0.1,
+ 0.8, 0.038268, -0.092388,
+ 0.8, 0.070711, -0.070711,
+ 0.8, 0.092388, -0.038268,
+ 0.8, 0.1, 0,
+ 0.8, 0.092388, 0.038268,
+ 0.8, 0.070711, 0.070711,
+ 0.8, 0.038268, 0.092388,
+ 0.8, 0, 0.1,
+ 0.8, -0.038268, 0.092388,
+ 0.8, -0.070711, 0.070711,
+ 0.8, -0.092388, 0.038268,
+ 0.8, -0.1, 0,
+ 0.8, -0.092388, -0.038268,
+ 0.8, -0.070711, -0.070711,
+ 0.8, -0.038268, -0.092388,
+};
+
+static const GLfloat BigValve_normals[] =
+{
+ -1, 0, 0,
+ 0, 0.19509, -0.980785,
+ 0, 0.55557, -0.83147,
+ 0, 0.83147, -0.55557,
+ 0, 0.980785, -0.19509,
+ 0, 0.980785, 0.19509,
+ 0, 0.83147, 0.55557,
+ 0, 0.55557, 0.83147,
+ 0, 0.19509, 0.980785,
+ 0, -0.19509, 0.980785,
+ 0, -0.55557, 0.83147,
+ 0, -0.83147, 0.55557,
+ 0, -0.980785, 0.19509,
+ 0, -0.980785, -0.19509,
+ 0, -0.83147, -0.55557,
+ 0, -0.55557, -0.83147,
+ 0, -0.19509, -0.980785,
+ 1, 0, 0,
+ 0.980785, -0.195092, 0,
+ 0.83147, -0.555569, 0,
+ 0.555569, -0.83147, 0,
+ 0.195091, -0.980785, 0,
+ -0.19509, -0.980785, 0,
+ -0.55557, -0.831469, 0,
+ -0.831469, -0.555571, 0,
+ -0.980785, -0.195089, 0,
+ -0.980785, 0.195089, 0,
+ -0.831469, 0.555571, 0,
+ -0.55557, 0.831469, 0,
+ -0.19509, 0.980785, 0,
+ 0.195091, 0.980785, 0,
+ 0.555569, 0.83147, 0,
+ 0.83147, 0.555569, 0,
+ 0.980785, 0.195092, 0,
+ 0.980785, 0, 0.195092,
+ 0.83147, 0, 0.555569,
+ 0.555569, 0, 0.83147,
+ 0.195091, 0, 0.980785,
+ -0.19509, 0, 0.980785,
+ -0.55557, 0, 0.831469,
+ -0.831469, 0, 0.555571,
+ -0.980785, 0, 0.195089,
+ -0.980785, 0, -0.195089,
+ -0.831469, 0, -0.555571,
+ -0.55557, 0, -0.831469,
+ -0.19509, 0, -0.980785,
+ 0.195091, 0, -0.980785,
+ 0.555569, 0, -0.83147,
+ 0.83147, 0, -0.555569,
+ 0.980785, 0, -0.195092,
+ 0.980785, 0.195092, 0,
+ 0.83147, 0.555569, 0,
+ 0.555569, 0.83147, 0,
+ 0.195091, 0.980785, 0,
+ -0.19509, 0.980785, 0,
+ -0.55557, 0.831469, 0,
+ -0.831469, 0.555571, 0,
+ -0.980785, 0.195089, 0,
+ -0.980785, -0.195089, 0,
+ -0.831469, -0.555571, 0,
+ -0.55557, -0.831469, 0,
+ -0.19509, -0.980785, 0,
+ 0.195091, -0.980785, 0,
+ 0.555569, -0.83147, 0,
+ 0.83147, -0.555569, 0,
+ 0.980785, -0.195092, 0,
+ 0.980785, 0, -0.195092,
+ 0.83147, 0, -0.555569,
+ 0.555569, 0, -0.83147,
+ 0.195091, 0, -0.980785,
+ -0.19509, 0, -0.980785,
+ -0.55557, 0, -0.831469,
+ -0.831469, 0, -0.555571,
+ -0.980785, 0, -0.195089,
+ -0.980785, 0, 0.195089,
+ -0.831469, 0, 0.555571,
+ -0.55557, 0, 0.831469,
+ -0.19509, 0, 0.980785,
+ 0.195091, 0, 0.980785,
+ 0.555569, 0, 0.83147,
+ 0.83147, 0, 0.555569,
+ 0.980785, 0, 0.195092,
+ -1, 0, 0,
+ 0, 0.130526, -0.991445,
+ 0, 0.382684, -0.92388,
+ 0, 0.608761, -0.793353,
+ 0, 0.793353, -0.608761,
+ 0, 0.92388, -0.382684,
+ 0, 0.991445, -0.130526,
+ 0, 0.991445, 0.130526,
+ 0, 0.92388, 0.382684,
+ 0, 0.793353, 0.608761,
+ 0, 0.608761, 0.793353,
+ 0, 0.382684, 0.92388,
+ 0, 0.130526, 0.991445,
+ 0, -0.130526, 0.991445,
+ 0, -0.382684, 0.92388,
+ 0, -0.608761, 0.793353,
+ 0, -0.793353, 0.608761,
+ 0, -0.92388, 0.382684,
+ 0, -0.991445, 0.130526,
+ 0, -0.991445, -0.130526,
+ 0, -0.92388, -0.382684,
+ 0, -0.793353, -0.608761,
+ 0, -0.608761, -0.793353,
+ 0, -0.382684, -0.92388,
+ 0, -0.130526, -0.991445,
+ 1, 0, 0,
+ 0.194185, 0.976241, 0.096151,
+ -0.194185, 0.976241, 0.096151,
+ -0.553718, 0.828695, 0.081619,
+ -0.830228, 0.55474, 0.054637,
+ -0.980604, 0.195054, 0.019211,
+ -0.980605, -0.195053, -0.019211,
+ -0.830227, -0.554741, -0.054637,
+ -0.553717, -0.828695, -0.081619,
+ -0.194187, -0.976241, -0.096151,
+ 0.194188, -0.976241, -0.096151,
+ 0.553716, -0.828696, -0.081619,
+ 0.830227, -0.554741, -0.054637,
+ 0.980604, -0.195053, -0.019211,
+ 0.980604, 0.195054, 0.019211,
+ 0.830228, 0.55474, 0.054637,
+ 0.553717, 0.828695, 0.081619,
+ 0.194186, 0.938725, 0.284759,
+ -0.194185, 0.938725, 0.284759,
+ -0.553717, 0.796849, 0.241721,
+ -0.830228, 0.533421, 0.161812,
+ -0.980604, 0.187558, 0.056895,
+ -0.980604, -0.187558, -0.056895,
+ -0.830227, -0.533422, -0.161812,
+ -0.553717, -0.796849, -0.241722,
+ -0.194186, -0.938725, -0.284759,
+ 0.194187, -0.938724, -0.284759,
+ 0.553716, -0.796849, -0.241722,
+ 0.830227, -0.533422, -0.161812,
+ 0.980604, -0.187558, -0.056895,
+ 0.980604, 0.187558, 0.056895,
+ 0.830228, 0.533421, 0.161811,
+ 0.553716, 0.79685, 0.241722,
+ 0.194186, 0.865134, 0.462423,
+ -0.194185, 0.865134, 0.462424,
+ -0.553717, 0.73438, 0.392534,
+ -0.830228, 0.491604, 0.262768,
+ -0.980604, 0.172854, 0.092393,
+ -0.980604, -0.172854, -0.092393,
+ -0.830227, -0.491605, -0.262768,
+ -0.553717, -0.73438, -0.392534,
+ -0.194187, -0.865134, -0.462424,
+ 0.194187, -0.865134, -0.462423,
+ 0.553716, -0.734381, -0.392534,
+ 0.830227, -0.491605, -0.262768,
+ 0.980604, -0.172854, -0.092393,
+ 0.980604, 0.172854, 0.092393,
+ 0.830228, 0.491604, 0.262768,
+ 0.553716, 0.734381, 0.392535,
+ 0.194186, 0.758296, 0.622317,
+ -0.194186, 0.758296, 0.622318,
+ -0.553717, 0.64369, 0.528263,
+ -0.830228, 0.430895, 0.353626,
+ -0.980604, 0.151508, 0.12434,
+ -0.980604, -0.151508, -0.124339,
+ -0.830227, -0.430895, -0.353627,
+ -0.553717, -0.64369, -0.528263,
+ -0.194186, -0.758296, -0.622317,
+ 0.194186, -0.758296, -0.622318,
+ 0.553716, -0.64369, -0.528263,
+ 0.830227, -0.430895, -0.353627,
+ 0.980604, -0.151508, -0.124339,
+ 0.980604, 0.151508, 0.12434,
+ 0.830228, 0.430895, 0.353626,
+ 0.553716, 0.64369, 0.528263,
+ 0.194186, 0.622317, 0.758296,
+ -0.194185, 0.622318, 0.758296,
+ -0.553717, 0.528263, 0.64369,
+ -0.830228, 0.353626, 0.430895,
+ -0.980604, 0.124339, 0.151508,
+ -0.980604, -0.124339, -0.151508,
+ -0.830227, -0.353627, -0.430895,
+ -0.553717, -0.528262, -0.643689,
+ -0.194187, -0.622317, -0.758296,
+ 0.194187, -0.622317, -0.758296,
+ 0.553716, -0.528263, -0.64369,
+ 0.830227, -0.353627, -0.430895,
+ 0.980604, -0.124339, -0.151508,
+ 0.980604, 0.12434, 0.151508,
+ 0.830228, 0.353626, 0.430895,
+ 0.553716, 0.528263, 0.64369,
+ 0.194186, 0.462423, 0.865134,
+ -0.194185, 0.462424, 0.865134,
+ -0.553717, 0.392534, 0.73438,
+ -0.830228, 0.262768, 0.491604,
+ -0.980604, 0.092393, 0.172855,
+ -0.980604, -0.092392, -0.172854,
+ -0.830227, -0.262768, -0.491605,
+ -0.553717, -0.392534, -0.73438,
+ -0.194186, -0.462424, -0.865134,
+ 0.194187, -0.462423, -0.865134,
+ 0.553716, -0.392535, -0.734381,
+ 0.830227, -0.262768, -0.491605,
+ 0.980604, -0.092392, -0.172854,
+ 0.980604, 0.092393, 0.172855,
+ 0.830228, 0.262768, 0.491604,
+ 0.553716, 0.392535, 0.734381,
+ 0.194185, 0.284759, 0.938725,
+ -0.194185, 0.284759, 0.938725,
+ -0.553718, 0.241721, 0.796848,
+ -0.830228, 0.161812, 0.533422,
+ -0.980604, 0.056895, 0.187558,
+ -0.980604, -0.056895, -0.187558,
+ -0.830227, -0.161812, -0.533423,
+ -0.553717, -0.241722, -0.796849,
+ -0.194187, -0.284759, -0.938725,
+ 0.194188, -0.284759, -0.938724,
+ 0.553716, -0.241722, -0.796849,
+ 0.830227, -0.161812, -0.533423,
+ 0.980604, -0.056895, -0.187557,
+ 0.980604, 0.056895, 0.187558,
+ 0.830228, 0.161812, 0.533422,
+ 0.553717, 0.241722, 0.796849,
+ 0.194186, 0.096151, 0.976241,
+ -0.194186, 0.096151, 0.976241,
+ -0.553717, 0.081619, 0.828695,
+ -0.830228, 0.054637, 0.55474,
+ -0.980604, 0.019211, 0.195054,
+ -0.980604, -0.019211, -0.195054,
+ -0.830227, -0.054637, -0.554741,
+ -0.553717, -0.081619, -0.828695,
+ -0.194187, -0.096151, -0.976241,
+ 0.194187, -0.096151, -0.976241,
+ 0.553716, -0.081619, -0.828696,
+ 0.830227, -0.054637, -0.554741,
+ 0.980604, -0.019211, -0.195054,
+ 0.980604, 0.019211, 0.195054,
+ 0.830228, 0.054637, 0.55474,
+ 0.553716, 0.081619, 0.828696,
+ 0.194185, -0.096151, 0.976241,
+ -0.194185, -0.096151, 0.976241,
+ -0.553718, -0.081619, 0.828695,
+ -0.830228, -0.054637, 0.55474,
+ -0.980604, -0.019211, 0.195054,
+ -0.980605, 0.019211, -0.195053,
+ -0.830227, 0.054637, -0.554741,
+ -0.553717, 0.081619, -0.828695,
+ -0.194187, 0.096151, -0.976241,
+ 0.194188, 0.096151, -0.976241,
+ 0.553716, 0.081619, -0.828696,
+ 0.830227, 0.054637, -0.554741,
+ 0.980604, 0.019211, -0.195053,
+ 0.980604, -0.019211, 0.195054,
+ 0.830228, -0.054637, 0.55474,
+ 0.553717, -0.081619, 0.828695,
+ 0.194186, -0.284759, 0.938725,
+ -0.194185, -0.284759, 0.938725,
+ -0.553717, -0.241721, 0.796849,
+ -0.830228, -0.161812, 0.533421,
+ -0.980604, -0.056895, 0.187558,
+ -0.980604, 0.056895, -0.187558,
+ -0.830227, 0.161812, -0.533422,
+ -0.553717, 0.241722, -0.796849,
+ -0.194186, 0.284759, -0.938725,
+ 0.194187, 0.284759, -0.938724,
+ 0.553716, 0.241722, -0.796849,
+ 0.830227, 0.161812, -0.533422,
+ 0.980604, 0.056895, -0.187558,
+ 0.980604, -0.056895, 0.187558,
+ 0.830228, -0.161811, 0.533421,
+ 0.553716, -0.241722, 0.79685,
+ 0.194186, -0.462423, 0.865134,
+ -0.194185, -0.462424, 0.865134,
+ -0.553717, -0.392534, 0.73438,
+ -0.830228, -0.262768, 0.491604,
+ -0.980604, -0.092393, 0.172854,
+ -0.980604, 0.092393, -0.172854,
+ -0.830227, 0.262768, -0.491605,
+ -0.553717, 0.392534, -0.73438,
+ -0.194187, 0.462424, -0.865134,
+ 0.194187, 0.462423, -0.865134,
+ 0.553716, 0.392534, -0.734381,
+ 0.830227, 0.262768, -0.491605,
+ 0.980604, 0.092393, -0.172854,
+ 0.980604, -0.092393, 0.172854,
+ 0.830228, -0.262768, 0.491604,
+ 0.553716, -0.392535, 0.734381,
+ 0.194186, -0.622317, 0.758296,
+ -0.194186, -0.622318, 0.758296,
+ -0.553717, -0.528263, 0.64369,
+ -0.830228, -0.353626, 0.430895,
+ -0.980604, -0.12434, 0.151508,
+ -0.980604, 0.124339, -0.151508,
+ -0.830227, 0.353627, -0.430895,
+ -0.553717, 0.528263, -0.64369,
+ -0.194186, 0.622317, -0.758296,
+ 0.194186, 0.622318, -0.758296,
+ 0.553716, 0.528263, -0.64369,
+ 0.830227, 0.353627, -0.430895,
+ 0.980604, 0.124339, -0.151508,
+ 0.980604, -0.12434, 0.151508,
+ 0.830228, -0.353626, 0.430895,
+ 0.553716, -0.528263, 0.64369,
+ 0.194186, -0.758296, 0.622317,
+ -0.194185, -0.758296, 0.622318,
+ -0.553717, -0.64369, 0.528263,
+ -0.830228, -0.430895, 0.353626,
+ -0.980604, -0.151508, 0.124339,
+ -0.980604, 0.151508, -0.124339,
+ -0.830227, 0.430895, -0.353627,
+ -0.553717, 0.643689, -0.528262,
+ -0.194187, 0.758296, -0.622317,
+ 0.194187, 0.758296, -0.622317,
+ 0.553716, 0.64369, -0.528263,
+ 0.830227, 0.430895, -0.353627,
+ 0.980604, 0.151508, -0.124339,
+ 0.980604, -0.151508, 0.12434,
+ 0.830228, -0.430895, 0.353626,
+ 0.553716, -0.64369, 0.528263,
+ 0.194186, -0.865134, 0.462423,
+ -0.194185, -0.865134, 0.462424,
+ -0.553717, -0.73438, 0.392534,
+ -0.830228, -0.491604, 0.262768,
+ -0.980604, -0.172855, 0.092393,
+ -0.980604, 0.172854, -0.092393,
+ -0.830227, 0.491605, -0.262768,
+ -0.553717, 0.73438, -0.392534,
+ -0.194186, 0.865134, -0.462424,
+ 0.194187, 0.865134, -0.462423,
+ 0.553716, 0.734381, -0.392535,
+ 0.830228, 0.491605, -0.262768,
+ 0.980604, 0.172854, -0.092393,
+ 0.980604, -0.172855, 0.092393,
+ 0.830228, -0.491604, 0.262768,
+ 0.553716, -0.734381, 0.392535,
+ 0.194185, -0.938725, 0.284759,
+ -0.194185, -0.938725, 0.284759,
+ -0.553718, -0.796848, 0.241721,
+ -0.830228, -0.533422, 0.161812,
+ -0.980604, -0.187558, 0.056895,
+ -0.980605, 0.187557, -0.056895,
+ -0.830227, 0.533423, -0.161812,
+ -0.553717, 0.796849, -0.241722,
+ -0.194187, 0.938725, -0.284759,
+ 0.194188, 0.938724, -0.284759,
+ 0.553716, 0.796849, -0.241722,
+ 0.830227, 0.533423, -0.161812,
+ 0.980604, 0.187557, -0.056895,
+ 0.980604, -0.187558, 0.056895,
+ 0.830228, -0.533422, 0.161812,
+ 0.553717, -0.796849, 0.241722,
+ 0.194186, -0.976241, 0.096151,
+ -0.194186, -0.976241, 0.096151,
+ -0.553717, -0.828695, 0.081619,
+ -0.830228, -0.55474, 0.054637,
+ -0.980604, -0.195054, 0.019211,
+ -0.980604, 0.195054, -0.019211,
+ -0.830227, 0.554741, -0.054637,
+ -0.553717, 0.828695, -0.081619,
+ -0.194187, 0.976241, -0.096151,
+ 0.194187, 0.976241, -0.096151,
+ 0.553716, 0.828696, -0.081619,
+ 0.830227, 0.554741, -0.054637,
+ 0.980604, 0.195054, -0.019211,
+ 0.980604, -0.195054, 0.019211,
+ 0.830228, -0.55474, 0.054637,
+ 0.553716, -0.828696, 0.081619,
+ 0.194185, -0.976241, -0.096151,
+ -0.194185, -0.976241, -0.096151,
+ -0.553718, -0.828695, -0.081619,
+ -0.830228, -0.55474, -0.054637,
+ -0.980604, -0.195054, -0.019211,
+ -0.980605, 0.195053, 0.019211,
+ -0.830227, 0.554741, 0.054637,
+ -0.553717, 0.828695, 0.081619,
+ -0.194187, 0.976241, 0.096151,
+ 0.194188, 0.976241, 0.096151,
+ 0.553716, 0.828696, 0.081619,
+ 0.830227, 0.554741, 0.054637,
+ 0.980604, 0.195053, 0.019211,
+ 0.980604, -0.195054, -0.019211,
+ 0.830228, -0.55474, -0.054637,
+ 0.553717, -0.828695, -0.081619,
+ 0.194186, -0.938725, -0.284759,
+ -0.194185, -0.938725, -0.284759,
+ -0.553717, -0.796849, -0.241721,
+ -0.830228, -0.533421, -0.161812,
+ -0.980604, -0.187558, -0.056895,
+ -0.980604, 0.187558, 0.056895,
+ -0.830227, 0.533422, 0.161812,
+ -0.553717, 0.796849, 0.241722,
+ -0.194186, 0.938725, 0.284759,
+ 0.194187, 0.938724, 0.284759,
+ 0.553716, 0.796849, 0.241722,
+ 0.830227, 0.533422, 0.161812,
+ 0.980604, 0.187558, 0.056895,
+ 0.980604, -0.187558, -0.056895,
+ 0.830228, -0.533421, -0.161811,
+ 0.553716, -0.79685, -0.241722,
+ 0.194186, -0.865134, -0.462423,
+ -0.194185, -0.865134, -0.462424,
+ -0.553717, -0.73438, -0.392534,
+ -0.830228, -0.491604, -0.262768,
+ -0.980604, -0.172854, -0.092393,
+ -0.980604, 0.172854, 0.092393,
+ -0.830227, 0.491605, 0.262768,
+ -0.553717, 0.73438, 0.392534,
+ -0.194187, 0.865134, 0.462424,
+ 0.194187, 0.865134, 0.462423,
+ 0.553716, 0.734381, 0.392534,
+ 0.830227, 0.491605, 0.262768,
+ 0.980604, 0.172854, 0.092393,
+ 0.980604, -0.172854, -0.092393,
+ 0.830228, -0.491604, -0.262768,
+ 0.553716, -0.734381, -0.392535,
+ 0.194186, -0.758296, -0.622317,
+ -0.194186, -0.758296, -0.622318,
+ -0.553717, -0.64369, -0.528263,
+ -0.830228, -0.430895, -0.353626,
+ -0.980604, -0.151508, -0.12434,
+ -0.980604, 0.151508, 0.124339,
+ -0.830227, 0.430895, 0.353627,
+ -0.553717, 0.64369, 0.528263,
+ -0.194186, 0.758296, 0.622317,
+ 0.194186, 0.758296, 0.622318,
+ 0.553716, 0.64369, 0.528263,
+ 0.830227, 0.430895, 0.353627,
+ 0.980604, 0.151508, 0.124339,
+ 0.980604, -0.151508, -0.12434,
+ 0.830228, -0.430895, -0.353626,
+ 0.553716, -0.64369, -0.528263,
+ 0.194186, -0.622317, -0.758296,
+ -0.194185, -0.622318, -0.758296,
+ -0.553717, -0.528263, -0.64369,
+ -0.830228, -0.353626, -0.430895,
+ -0.980604, -0.124339, -0.151508,
+ -0.980604, 0.124339, 0.151508,
+ -0.830227, 0.353627, 0.430895,
+ -0.553717, 0.528262, 0.643689,
+ -0.194187, 0.622317, 0.758296,
+ 0.194187, 0.622317, 0.758296,
+ 0.553716, 0.528263, 0.64369,
+ 0.830227, 0.353627, 0.430895,
+ 0.980604, 0.124339, 0.151508,
+ 0.980604, -0.12434, -0.151508,
+ 0.830228, -0.353626, -0.430895,
+ 0.553716, -0.528263, -0.64369,
+ 0.194186, -0.462423, -0.865134,
+ -0.194185, -0.462424, -0.865134,
+ -0.553717, -0.392534, -0.73438,
+ -0.830228, -0.262768, -0.491604,
+ -0.980604, -0.092393, -0.172855,
+ -0.980604, 0.092393, 0.172854,
+ -0.830227, 0.262768, 0.491605,
+ -0.553717, 0.392534, 0.73438,
+ -0.194186, 0.462424, 0.865134,
+ 0.194187, 0.462423, 0.865134,
+ 0.553716, 0.392535, 0.734381,
+ 0.830228, 0.262768, 0.491605,
+ 0.980604, 0.092393, 0.172854,
+ 0.980604, -0.092393, -0.172855,
+ 0.830228, -0.262768, -0.491604,
+ 0.553716, -0.392535, -0.734381,
+ 0.194185, -0.284759, -0.938725,
+ -0.194185, -0.284759, -0.938725,
+ -0.553718, -0.241721, -0.796848,
+ -0.830228, -0.161812, -0.533422,
+ -0.980604, -0.056895, -0.187558,
+ -0.980605, 0.056895, 0.187557,
+ -0.830227, 0.161812, 0.533422,
+ -0.553716, 0.241722, 0.796849,
+ -0.194187, 0.284759, 0.938725,
+ 0.194188, 0.284759, 0.938724,
+ 0.553716, 0.241722, 0.79685,
+ 0.830227, 0.161812, 0.533423,
+ 0.980604, 0.056895, 0.187557,
+ 0.980604, -0.056895, -0.187558,
+ 0.830228, -0.161812, -0.533422,
+ 0.553717, -0.241722, -0.796849,
+ 0.194186, -0.096151, -0.976241,
+ -0.194186, -0.096151, -0.976241,
+ -0.553717, -0.081619, -0.828695,
+ -0.830228, -0.054637, -0.55474,
+ -0.980604, -0.019211, -0.195054,
+ -0.980604, 0.019211, 0.195054,
+ -0.830227, 0.054637, 0.554741,
+ -0.553717, 0.081619, 0.828695,
+ -0.194187, 0.096151, 0.976241,
+ 0.194187, 0.096151, 0.976241,
+ 0.553716, 0.08162, 0.828696,
+ 0.830227, 0.054637, 0.554741,
+ 0.980604, 0.019211, 0.195054,
+ 0.980604, -0.019211, -0.195054,
+ 0.830228, -0.054637, -0.55474,
+ 0.553716, -0.081619, -0.828696,
+ 0.194185, 0.096151, -0.976241,
+ -0.194185, 0.096151, -0.976241,
+ -0.553718, 0.081619, -0.828695,
+ -0.830228, 0.054637, -0.55474,
+ -0.980604, 0.019211, -0.195054,
+ -0.980605, -0.019211, 0.195053,
+ -0.830227, -0.054637, 0.554741,
+ -0.553717, -0.081619, 0.828695,
+ -0.194187, -0.096151, 0.976241,
+ 0.194188, -0.096151, 0.976241,
+ 0.553716, -0.081619, 0.828696,
+ 0.830227, -0.054637, 0.554741,
+ 0.980604, -0.019211, 0.195053,
+ 0.980604, 0.019211, -0.195054,
+ 0.830228, 0.054637, -0.55474,
+ 0.553717, 0.081619, -0.828695,
+ 0.194186, 0.284759, -0.938725,
+ -0.194185, 0.284759, -0.938725,
+ -0.553717, 0.241721, -0.796849,
+ -0.830228, 0.161812, -0.533421,
+ -0.980604, 0.056895, -0.187558,
+ -0.980604, -0.056895, 0.187558,
+ -0.830227, -0.161812, 0.533422,
+ -0.553717, -0.241722, 0.796849,
+ -0.194186, -0.284759, 0.938725,
+ 0.194187, -0.284759, 0.938724,
+ 0.553716, -0.241722, 0.796849,
+ 0.830227, -0.161812, 0.533422,
+ 0.980604, -0.056895, 0.187558,
+ 0.980604, 0.056895, -0.187558,
+ 0.830228, 0.161811, -0.533421,
+ 0.553716, 0.241722, -0.79685,
+ 0.194186, 0.462423, -0.865134,
+ -0.194185, 0.462424, -0.865134,
+ -0.553717, 0.392534, -0.73438,
+ -0.830228, 0.262768, -0.491604,
+ -0.980604, 0.092393, -0.172854,
+ -0.980604, -0.092393, 0.172854,
+ -0.830227, -0.262768, 0.491605,
+ -0.553717, -0.392534, 0.73438,
+ -0.194187, -0.462424, 0.865134,
+ 0.194187, -0.462423, 0.865134,
+ 0.553716, -0.392534, 0.734381,
+ 0.830227, -0.262768, 0.491605,
+ 0.980604, -0.092393, 0.172854,
+ 0.980604, 0.092393, -0.172854,
+ 0.830228, 0.262768, -0.491604,
+ 0.553716, 0.392535, -0.734381,
+ 0.194186, 0.622317, -0.758296,
+ -0.194186, 0.622318, -0.758296,
+ -0.553717, 0.528263, -0.64369,
+ -0.830228, 0.353626, -0.430895,
+ -0.980604, 0.12434, -0.151508,
+ -0.980604, -0.124339, 0.151508,
+ -0.830227, -0.353627, 0.430895,
+ -0.553717, -0.528263, 0.64369,
+ -0.194186, -0.622317, 0.758296,
+ 0.194186, -0.622318, 0.758296,
+ 0.553716, -0.528263, 0.64369,
+ 0.830227, -0.353627, 0.430895,
+ 0.980604, -0.124339, 0.151508,
+ 0.980604, 0.12434, -0.151508,
+ 0.830228, 0.353626, -0.430895,
+ 0.553716, 0.528263, -0.64369,
+ 0.194186, 0.758296, -0.622317,
+ -0.194185, 0.758296, -0.622318,
+ -0.553717, 0.64369, -0.528263,
+ -0.830228, 0.430895, -0.353626,
+ -0.980604, 0.151508, -0.124339,
+ -0.980604, -0.151508, 0.124339,
+ -0.830227, -0.430895, 0.353627,
+ -0.553717, -0.643689, 0.528262,
+ -0.194187, -0.758296, 0.622317,
+ 0.194187, -0.758296, 0.622317,
+ 0.553716, -0.64369, 0.528263,
+ 0.830227, -0.430895, 0.353627,
+ 0.980604, -0.151508, 0.124339,
+ 0.980604, 0.151508, -0.12434,
+ 0.830228, 0.430895, -0.353626,
+ 0.553716, 0.64369, -0.528263,
+ 0.194186, 0.865134, -0.462423,
+ -0.194185, 0.865134, -0.462424,
+ -0.553717, 0.73438, -0.392534,
+ -0.830228, 0.491604, -0.262768,
+ -0.980604, 0.172855, -0.092393,
+ -0.980604, -0.172854, 0.092393,
+ -0.830227, -0.491605, 0.262768,
+ -0.553717, -0.73438, 0.392534,
+ -0.194186, -0.865134, 0.462424,
+ 0.194187, -0.865134, 0.462423,
+ 0.553716, -0.734381, 0.392535,
+ 0.830228, -0.491605, 0.262768,
+ 0.980604, -0.172854, 0.092393,
+ 0.980604, 0.172855, -0.092393,
+ 0.830228, 0.491604, -0.262768,
+ 0.553716, 0.734381, -0.392535,
+ 0.194185, 0.938725, -0.284759,
+ -0.194185, 0.938725, -0.284759,
+ -0.553718, 0.796848, -0.241721,
+ -0.830228, 0.533422, -0.161812,
+ -0.980604, 0.187558, -0.056895,
+ -0.980605, -0.187557, 0.056895,
+ -0.830227, -0.533422, 0.161812,
+ -0.553716, -0.796849, 0.241722,
+ -0.194187, -0.938725, 0.284759,
+ 0.194188, -0.938724, 0.284759,
+ 0.553716, -0.79685, 0.241722,
+ 0.830227, -0.533423, 0.161812,
+ 0.980604, -0.187557, 0.056895,
+ 0.980604, 0.187558, -0.056895,
+ 0.830228, 0.533422, -0.161812,
+ 0.553717, 0.796849, -0.241722,
+ 0.194186, 0.976241, -0.096151,
+ -0.194186, 0.976241, -0.096151,
+ -0.553717, 0.828695, -0.081619,
+ -0.830228, 0.55474, -0.054637,
+ -0.980604, 0.195054, -0.019211,
+ -0.980604, -0.195054, 0.019211,
+ -0.830227, -0.554741, 0.054637,
+ -0.553717, -0.828695, 0.081619,
+ -0.194187, -0.976241, 0.096151,
+ 0.194187, -0.976241, 0.096151,
+ 0.553716, -0.828696, 0.08162,
+ 0.830227, -0.554741, 0.054637,
+ 0.980604, -0.195054, 0.019211,
+ 0.980604, 0.195054, -0.019211,
+ 0.830228, 0.55474, -0.054637,
+ 0.553716, 0.828696, -0.081619,
+};
+
+static const unsigned short int BigValve_POLS[] =
+{
+ 16, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 1, 4, 700,
+ 701, 685, 684, 1, 4, 701, 702, 686, 685, 1, 4, 702, 703, 687, 686, 1, 4, 703, 704, 688,
+ 687, 1, 4, 704, 705, 689, 688, 1, 4, 705, 706, 690, 689, 1, 4, 706, 707, 691, 690, 1,
+ 4, 707, 708, 692, 691, 1, 4, 708, 709, 693, 692, 1, 4, 709, 710, 694, 693, 1, 4, 710,
+ 711, 695, 694, 1, 4, 711, 712, 696, 695, 1, 4, 712, 713, 697, 696, 1, 4, 713, 714, 698,
+ 697, 1, 4, 714, 715, 699, 698, 1, 4, 715, 700, 684, 699, 1, 16, 700, 715, 714, 713, 712,
+ 711, 710, 709, 708, 707, 706, 705, 704, 703, 702, 701, 1, 4, 668, 669, 655, 654, 1, 4, 669,
+ 670, 656, 655, 1, 4, 670, 671, 657, 656, 1, 4, 671, 672, 634, 657, 1, 4, 672, 673, 658,
+ 634, 1, 4, 673, 674, 659, 658, 1, 4, 674, 675, 660, 659, 1, 4, 675, 676, 661, 660, 1,
+ 4, 676, 677, 662, 661, 1, 4, 677, 678, 663, 662, 1, 4, 678, 679, 664, 663, 1, 4, 679,
+ 680, 564, 664, 1, 4, 680, 681, 665, 564, 1, 4, 681, 682, 666, 665, 1, 4, 682, 683, 667,
+ 666, 1, 4, 683, 668, 654, 667, 1, 4, 638, 639, 624, 623, 1, 4, 639, 640, 625, 624, 1,
+ 4, 640, 641, 626, 625, 1, 4, 641, 642, 603, 626, 1, 4, 642, 643, 627, 603, 1, 4, 643,
+ 644, 628, 627, 1, 4, 644, 645, 629, 628, 1, 4, 645, 646, 630, 629, 1, 4, 646, 647, 631,
+ 630, 1, 4, 647, 648, 632, 631, 1, 4, 648, 649, 633, 632, 1, 4, 649, 650, 634, 633, 1,
+ 4, 650, 651, 635, 634, 1, 4, 651, 652, 636, 635, 1, 4, 652, 653, 637, 636, 1, 4, 653,
+ 638, 623, 637, 1, 4, 607, 608, 593, 592, 1, 4, 608, 609, 594, 593, 1, 4, 609, 610, 595,
+ 594, 1, 4, 610, 611, 572, 595, 1, 4, 611, 612, 596, 572, 1, 4, 612, 613, 597, 596, 1,
+ 4, 613, 614, 598, 597, 1, 4, 614, 615, 599, 598, 1, 4, 615, 616, 600, 599, 1, 4, 616,
+ 617, 601, 600, 1, 4, 617, 618, 602, 601, 1, 4, 618, 619, 603, 602, 1, 4, 619, 620, 604,
+ 603, 1, 4, 620, 621, 605, 604, 1, 4, 621, 622, 606, 605, 1, 4, 622, 607, 592, 606, 1,
+ 4, 576, 577, 561, 560, 1, 4, 577, 578, 562, 561, 1, 4, 578, 579, 563, 562, 1, 4, 579,
+ 580, 564, 563, 1, 4, 580, 581, 565, 564, 1, 4, 581, 582, 566, 565, 1, 4, 582, 583, 567,
+ 566, 1, 4, 583, 584, 568, 567, 1, 4, 584, 585, 569, 568, 1, 4, 585, 586, 570, 569, 1,
+ 4, 586, 587, 571, 570, 1, 4, 587, 588, 572, 571, 1, 4, 588, 589, 573, 572, 1, 4, 589,
+ 590, 574, 573, 1, 4, 590, 591, 575, 574, 1, 4, 591, 576, 560, 575, 1, 24, 512, 513, 514,
+ 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534,
+ 535, 1, 4, 536, 537, 513, 512, 1, 4, 537, 538, 514, 513, 1, 4, 538, 539, 515, 514, 1,
+ 4, 539, 540, 516, 515, 1, 4, 540, 541, 517, 516, 1, 4, 541, 542, 518, 517, 1, 4, 542,
+ 543, 519, 518, 1, 4, 543, 544, 520, 519, 1, 4, 544, 545, 521, 520, 1, 4, 545, 546, 522,
+ 521, 1, 4, 546, 547, 523, 522, 1, 4, 547, 548, 524, 523, 1, 4, 548, 549, 525, 524, 1,
+ 4, 549, 550, 526, 525, 1, 4, 550, 551, 527, 526, 1, 4, 551, 552, 528, 527, 1, 4, 552,
+ 553, 529, 528, 1, 4, 553, 554, 530, 529, 1, 4, 554, 555, 531, 530, 1, 4, 555, 556, 532,
+ 531, 1, 4, 556, 557, 533, 532, 1, 4, 557, 558, 534, 533, 1, 4, 558, 559, 535, 534, 1,
+ 4, 559, 536, 512, 535, 1, 24, 536, 559, 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, 548,
+ 547, 546, 545, 544, 543, 542, 541, 540, 539, 538, 537, 1, 4, 16, 31, 15, 0, 1, 4, 31,
+ 30, 14, 15, 1, 4, 30, 29, 13, 14, 1, 4, 29, 28, 12, 13, 1, 4, 28, 27, 11,
+ 12, 1, 4, 27, 26, 10, 11, 1, 4, 26, 25, 9, 10, 1, 4, 25, 24, 8, 9, 1,
+ 4, 24, 23, 7, 8, 1, 4, 23, 22, 6, 7, 1, 4, 22, 21, 5, 6, 1, 4, 21,
+ 20, 4, 5, 1, 4, 20, 19, 3, 4, 1, 4, 19, 18, 2, 3, 1, 4, 18, 17, 1,
+ 2, 1, 4, 17, 16, 0, 1, 1, 4, 32, 47, 31, 16, 1, 4, 47, 46, 30, 31, 1,
+ 4, 46, 45, 29, 30, 1, 4, 45, 44, 28, 29, 1, 4, 44, 43, 27, 28, 1, 4, 43,
+ 42, 26, 27, 1, 4, 42, 41, 25, 26, 1, 4, 41, 40, 24, 25, 1, 4, 40, 39, 23,
+ 24, 1, 4, 39, 38, 22, 23, 1, 4, 38, 37, 21, 22, 1, 4, 37, 36, 20, 21, 1,
+ 4, 36, 35, 19, 20, 1, 4, 35, 34, 18, 19, 1, 4, 34, 33, 17, 18, 1, 4, 33,
+ 32, 16, 17, 1, 4, 48, 63, 47, 32, 1, 4, 63, 62, 46, 47, 1, 4, 62, 61, 45,
+ 46, 1, 4, 61, 60, 44, 45, 1, 4, 60, 59, 43, 44, 1, 4, 59, 58, 42, 43, 1,
+ 4, 58, 57, 41, 42, 1, 4, 57, 56, 40, 41, 1, 4, 56, 55, 39, 40, 1, 4, 55,
+ 54, 38, 39, 1, 4, 54, 53, 37, 38, 1, 4, 53, 52, 36, 37, 1, 4, 52, 51, 35,
+ 36, 1, 4, 51, 50, 34, 35, 1, 4, 50, 49, 33, 34, 1, 4, 49, 48, 32, 33, 1,
+ 4, 64, 79, 63, 48, 1, 4, 79, 78, 62, 63, 1, 4, 78, 77, 61, 62, 1, 4, 77,
+ 76, 60, 61, 1, 4, 76, 75, 59, 60, 1, 4, 75, 74, 58, 59, 1, 4, 74, 73, 57,
+ 58, 1, 4, 73, 72, 56, 57, 1, 4, 72, 71, 55, 56, 1, 4, 71, 70, 54, 55, 1,
+ 4, 70, 69, 53, 54, 1, 4, 69, 68, 52, 53, 1, 4, 68, 67, 51, 52, 1, 4, 67,
+ 66, 50, 51, 1, 4, 66, 65, 49, 50, 1, 4, 65, 64, 48, 49, 1, 4, 80, 95, 79,
+ 64, 1, 4, 95, 94, 78, 79, 1, 4, 94, 93, 77, 78, 1, 4, 93, 92, 76, 77, 1,
+ 4, 92, 91, 75, 76, 1, 4, 91, 90, 74, 75, 1, 4, 90, 89, 73, 74, 1, 4, 89,
+ 88, 72, 73, 1, 4, 88, 87, 71, 72, 1, 4, 87, 86, 70, 71, 1, 4, 86, 85, 69,
+ 70, 1, 4, 85, 84, 68, 69, 1, 4, 84, 83, 67, 68, 1, 4, 83, 82, 66, 67, 1,
+ 4, 82, 81, 65, 66, 1, 4, 81, 80, 64, 65, 1, 4, 96, 111, 95, 80, 1, 4, 111,
+ 110, 94, 95, 1, 4, 110, 109, 93, 94, 1, 4, 109, 108, 92, 93, 1, 4, 108, 107, 91,
+92, 1, 4, 107, 106, 90, 91, 1, 4, 106, 105, 89, 90, 1, 4, 105, 104, 88, 89, 1,
+ 4, 104, 103, 87, 88, 1, 4, 103, 102, 86, 87, 1, 4, 102, 101, 85, 86, 1, 4, 101,
+ 100, 84, 85, 1, 4, 100, 99, 83, 84, 1, 4, 99, 98, 82, 83, 1, 4, 98, 97, 81,
+ 82, 1, 4, 97, 96, 80, 81, 1, 4, 112, 127, 111, 96, 1, 4, 127, 126, 110, 111, 1,
+ 4, 126, 125, 109, 110, 1, 4, 125, 124, 108, 109, 1, 4, 124, 123, 107, 108, 1, 4, 123,
+ 122, 106, 107, 1, 4, 122, 121, 105, 106, 1, 4, 121, 120, 104, 105, 1, 4, 120, 119, 103,
+ 104, 1, 4, 119, 118, 102, 103, 1, 4, 118, 117, 101, 102, 1, 4, 117, 116, 100, 101, 1,
+ 4, 116, 115, 99, 100, 1, 4, 115, 114, 98, 99, 1, 4, 114, 113, 97, 98, 1, 4, 113,
+ 112, 96, 97, 1, 4, 128, 143, 127, 112, 1, 4, 143, 142, 126, 127, 1, 4, 142, 141, 125,
+ 126, 1, 4, 141, 140, 124, 125, 1, 4, 140, 139, 123, 124, 1, 4, 139, 138, 122, 123, 1,
+ 4, 138, 137, 121, 122, 1, 4, 137, 136, 120, 121, 1, 4, 136, 135, 119, 120, 1, 4, 135,
+ 134, 118, 119, 1, 4, 134, 133, 117, 118, 1, 4, 133, 132, 116, 117, 1, 4, 132, 131, 115,
+ 116, 1, 4, 131, 130, 114, 115, 1, 4, 130, 129, 113, 114, 1, 4, 129, 128, 112, 113, 1,
+ 4, 144, 159, 143, 128, 1, 4, 159, 158, 142, 143, 1, 4, 158, 157, 141, 142, 1, 4, 157,
+ 156, 140, 141, 1, 4, 156, 155, 139, 140, 1, 4, 155, 154, 138, 139, 1, 4, 154, 153, 137,
+ 138, 1, 4, 153, 152, 136, 137, 1, 4, 152, 151, 135, 136, 1, 4, 151, 150, 134, 135, 1,
+ 4, 150, 149, 133, 134, 1, 4, 149, 148, 132, 133, 1, 4, 148, 147, 131, 132, 1, 4, 147,
+ 146, 130, 131, 1, 4, 146, 145, 129, 130, 1, 4, 145, 144, 128, 129, 1, 4, 160, 175, 159,
+ 144, 1, 4, 175, 174, 158, 159, 1, 4, 174, 173, 157, 158, 1, 4, 173, 172, 156, 157, 1,
+ 4, 172, 171, 155, 156, 1, 4, 171, 170, 154, 155, 1, 4, 170, 169, 153, 154, 1, 4, 169,
+ 168, 152, 153, 1, 4, 168, 167, 151, 152, 1, 4, 167, 166, 150, 151, 1, 4, 166, 165, 149,
+ 150, 1, 4, 165, 164, 148, 149, 1, 4, 164, 163, 147, 148, 1, 4, 163, 162, 146, 147, 1,
+ 4, 162, 161, 145, 146, 1, 4, 161, 160, 144, 145, 1, 4, 176, 191, 175, 160, 1, 4, 191,
+ 190, 174, 175, 1, 4, 190, 189, 173, 174, 1, 4, 189, 188, 172, 173, 1, 4, 188, 187, 171,
+ 172, 1, 4, 187, 186, 170, 171, 1, 4, 186, 185, 169, 170, 1, 4, 185, 184, 168, 169, 1,
+ 4, 184, 183, 167, 168, 1, 4, 183, 182, 166, 167, 1, 4, 182, 181, 165, 166, 1, 4, 181,
+ 180, 164, 165, 1, 4, 180, 179, 163, 164, 1, 4, 179, 178, 162, 163, 1, 4, 178, 177, 161,
+ 162, 1, 4, 177, 176, 160, 161, 1, 4, 192, 207, 191, 176, 1, 4, 207, 206, 190, 191, 1,
+ 4, 206, 205, 189, 190, 1, 4, 205, 204, 188, 189, 1, 4, 204, 203, 187, 188, 1, 4, 203,
+ 202, 186, 187, 1, 4, 202, 201, 185, 186, 1, 4, 201, 200, 184, 185, 1, 4, 200, 199, 183,
+ 184, 1, 4, 199, 198, 182, 183, 1, 4, 198, 197, 181, 182, 1, 4, 197, 196, 180, 181, 1,
+ 4, 196, 195, 179, 180, 1, 4, 195, 194, 178, 179, 1, 4, 194, 193, 177, 178, 1, 4, 193,
+ 192, 176, 177, 1, 4, 208, 223, 207, 192, 1, 4, 223, 222, 206, 207, 1, 4, 222, 221, 205,
+ 206, 1, 4, 221, 220, 204, 205, 1, 4, 220, 219, 203, 204, 1, 4, 219, 218, 202, 203, 1,
+ 4, 218, 217, 201, 202, 1, 4, 217, 216, 200, 201, 1, 4, 216, 215, 199, 200, 1, 4, 215,
+ 214, 198, 199, 1, 4, 214, 213, 197, 198, 1, 4, 213, 212, 196, 197, 1, 4, 212, 211, 195,
+ 196, 1, 4, 211, 210, 194, 195, 1, 4, 210, 209, 193, 194, 1, 4, 209, 208, 192, 193, 1,
+ 4, 224, 239, 223, 208, 1, 4, 239, 238, 222, 223, 1, 4, 238, 237, 221, 222, 1, 4, 237,
+ 236, 220, 221, 1, 4, 236, 235, 219, 220, 1, 4, 235, 234, 218, 219, 1, 4, 234, 233, 217,
+ 218, 1, 4, 233, 232, 216, 217, 1, 4, 232, 231, 215, 216, 1, 4, 231, 230, 214, 215, 1,
+ 4, 230, 229, 213, 214, 1, 4, 229, 228, 212, 213, 1, 4, 228, 227, 211, 212, 1, 4, 227,
+ 226, 210, 211, 1, 4, 226, 225, 209, 210, 1, 4, 225, 224, 208, 209, 1, 4, 240, 255, 239,
+ 224, 1, 4, 255, 254, 238, 239, 1, 4, 254, 253, 237, 238, 1, 4, 253, 252, 236, 237, 1,
+ 4, 252, 251, 235, 236, 1, 4, 251, 250, 234, 235, 1, 4, 250, 249, 233, 234, 1, 4, 249,
+ 248, 232, 233, 1, 4, 248, 247, 231, 232, 1, 4, 247, 246, 230, 231, 1, 4, 246, 245, 229,
+ 230, 1, 4, 245, 244, 228, 229, 1, 4, 244, 243, 227, 228, 1, 4, 243, 242, 226, 227, 1,
+ 4, 242, 241, 225, 226, 1, 4, 241, 240, 224, 225, 1, 4, 256, 271, 255, 240, 1, 4, 271,
+ 270, 254, 255, 1, 4, 270, 269, 253, 254, 1, 4, 269, 268, 252, 253, 1, 4, 268, 267, 251,
+ 252, 1, 4, 267, 266, 250, 251, 1, 4, 266, 265, 249, 250, 1, 4, 265, 264, 248, 249, 1,
+ 4, 264, 263, 247, 248, 1, 4, 263, 262, 246, 247, 1, 4, 262, 261, 245, 246, 1, 4, 261,
+ 260, 244, 245, 1, 4, 260, 259, 243, 244, 1, 4, 259, 258, 242, 243, 1, 4, 258, 257, 241,
+ 242, 1, 4, 257, 256, 240, 241, 1, 4, 272, 287, 271, 256, 1, 4, 287, 286, 270, 271, 1,
+ 4, 286, 285, 269, 270, 1, 4, 285, 284, 268, 269, 1, 4, 284, 283, 267, 268, 1, 4, 283,
+ 282, 266, 267, 1, 4, 282, 281, 265, 266, 1, 4, 281, 280, 264, 265, 1, 4, 280, 279, 263,
+ 264, 1, 4, 279, 278, 262, 263, 1, 4, 278, 277, 261, 262, 1, 4, 277, 276, 260, 261, 1,
+ 4, 276, 275, 259, 260, 1, 4, 275, 274, 258, 259, 1, 4, 274, 273, 257, 258, 1, 4, 273,
+ 272, 256, 257, 1, 4, 288, 303, 287, 272, 1, 4, 303, 302, 286, 287, 1, 4, 302, 301, 285,
+ 286, 1, 4, 301, 300, 284, 285, 1, 4, 300, 299, 283, 284, 1, 4, 299, 298, 282, 283, 1,
+ 4, 298, 297, 281, 282, 1, 4, 297, 296, 280, 281, 1, 4, 296, 295, 279, 280, 1, 4, 295,
+ 294, 278, 279, 1, 4, 294, 293, 277, 278, 1, 4, 293, 292, 276, 277, 1, 4, 292, 291, 275,
+ 276, 1, 4, 291, 290, 274, 275, 1, 4, 290, 289, 273, 274, 1, 4, 289, 288, 272, 273, 1,
+ 4, 304, 319, 303, 288, 1, 4, 319, 318, 302, 303, 1, 4, 318, 317, 301, 302, 1, 4, 317,
+ 316, 300, 301, 1, 4, 316, 315, 299, 300, 1, 4, 315, 314, 298, 299, 1, 4, 314, 313, 297,
+ 298, 1, 4, 313, 312, 296, 297, 1, 4, 312, 311, 295, 296, 1, 4, 311, 310, 294, 295, 1,
+ 4, 310, 309, 293, 294, 1, 4, 309, 308, 292, 293, 1, 4, 308, 307, 291, 292, 1, 4, 307,
+ 306, 290, 291, 1, 4, 306, 305, 289, 290, 1, 4, 305, 304, 288, 289, 1, 4, 320, 335, 319,
+ 304, 1, 4, 335, 334, 318, 319, 1, 4, 334, 333, 317, 318, 1, 4, 333, 332, 316, 317, 1,
+ 4, 332, 331, 315, 316, 1, 4, 331, 330, 314, 315, 1, 4, 330, 329, 313, 314, 1, 4, 329,
+ 328, 312, 313, 1, 4, 328, 327, 311, 312, 1, 4, 327, 326, 310, 311, 1, 4, 326, 325, 309,
+ 310, 1, 4, 325, 324, 308, 309, 1, 4, 324, 323, 307, 308, 1, 4, 323, 322, 306, 307, 1,
+ 4, 322, 321, 305, 306, 1, 4, 321, 320, 304, 305, 1, 4, 336, 351, 335, 320, 1, 4, 351,
+ 350, 334, 335, 1, 4, 350, 349, 333, 334, 1, 4, 349, 348, 332, 333, 1, 4, 348, 347, 331,
+ 332, 1, 4, 347, 346, 330, 331, 1, 4, 346, 345, 329, 330, 1, 4, 345, 344, 328, 329, 1,
+ 4, 344, 343, 327, 328, 1, 4, 343, 342, 326, 327, 1, 4, 342, 341, 325, 326, 1, 4, 341,
+ 340, 324, 325, 1, 4, 340, 339, 323, 324, 1, 4, 339, 338, 322, 323, 1, 4, 338, 337, 321,
+ 322, 1, 4, 337, 336, 320, 321, 1, 4, 352, 367, 351, 336, 1, 4, 367, 366, 350, 351, 1,
+ 4, 366, 365, 349, 350, 1, 4, 365, 364, 348, 349, 1, 4, 364, 363, 347, 348, 1, 4, 363,
+ 362, 346, 347, 1, 4, 362, 361, 345, 346, 1, 4, 361, 360, 344, 345, 1, 4, 360, 359, 343,
+ 344, 1, 4, 359, 358, 342, 343, 1, 4, 358, 357, 341, 342, 1, 4, 357, 356, 340, 341, 1,
+ 4, 356, 355, 339, 340, 1, 4, 355, 354, 338, 339, 1, 4, 354, 353, 337, 338, 1, 4, 353,
+ 352, 336, 337, 1, 4, 368, 383, 367, 352, 1, 4, 383, 382, 366, 367, 1, 4, 382, 381, 365,
+ 366, 1, 4, 381, 380, 364, 365, 1, 4, 380, 379, 363, 364, 1, 4, 379, 378, 362, 363, 1,
+ 4, 378, 377, 361, 362, 1, 4, 377, 376, 360, 361, 1, 4, 376, 375, 359, 360, 1, 4, 375,
+ 374, 358, 359, 1, 4, 374, 373, 357, 358, 1, 4, 373, 372, 356, 357, 1, 4, 372, 371, 355,
+ 356, 1, 4, 371, 370, 354, 355, 1, 4, 370, 369, 353, 354, 1, 4, 369, 368, 352, 353, 1,
+ 4, 384, 399, 383, 368, 1, 4, 399, 398, 382, 383, 1, 4, 398, 397, 381, 382, 1, 4, 397,
+ 396, 380, 381, 1, 4, 396, 395, 379, 380, 1, 4, 395, 394, 378, 379, 1, 4, 394, 393, 377,
+ 378, 1, 4, 393, 392, 376, 377, 1, 4, 392, 391, 375, 376, 1, 4, 391, 390, 374, 375, 1,
+ 4, 390, 389, 373, 374, 1, 4, 389, 388, 372, 373, 1, 4, 388, 387, 371, 372, 1, 4, 387,
+ 386, 370, 371, 1, 4, 386, 385, 369, 370, 1, 4, 385, 384, 368, 369, 1, 4, 400, 415, 399,
+ 384, 1, 4, 415, 414, 398, 399, 1, 4, 414, 413, 397, 398, 1, 4, 413, 412, 396, 397, 1,
+ 4, 412, 411, 395, 396, 1, 4, 411, 410, 394, 395, 1, 4, 410, 409, 393, 394, 1, 4, 409,
+ 408, 392, 393, 1, 4, 408, 407, 391, 392, 1, 4, 407, 406, 390, 391, 1, 4, 406, 405, 389,
+ 390, 1, 4, 405, 404, 388, 389, 1, 4, 404, 403, 387, 388, 1, 4, 403, 402, 386, 387, 1,
+ 4, 402, 401, 385, 386, 1, 4, 401, 400, 384, 385, 1, 4, 416, 431, 415, 400, 1, 4, 431,
+ 430, 414, 415, 1, 4, 430, 429, 413, 414, 1, 4, 429, 428, 412, 413, 1, 4, 428, 427, 411,
+ 412, 1, 4, 427, 426, 410, 411, 1, 4, 426, 425, 409, 410, 1, 4, 425, 424, 408, 409, 1,
+ 4, 424, 423, 407, 408, 1, 4, 423, 422, 406, 407, 1, 4, 422, 421, 405, 406, 1, 4, 421,
+ 420, 404, 405, 1, 4, 420, 419, 403, 404, 1, 4, 419, 418, 402, 403, 1, 4, 418, 417, 401,
+ 402, 1, 4, 417, 416, 400, 401, 1, 4, 432, 447, 431, 416, 1, 4, 447, 446, 430, 431, 1,
+ 4, 446, 445, 429, 430, 1, 4, 445, 444, 428, 429, 1, 4, 444, 443, 427, 428, 1, 4, 443,
+ 442, 426, 427, 1, 4, 442, 441, 425, 426, 1, 4, 441, 440, 424, 425, 1, 4, 440, 439, 423,
+ 424, 1, 4, 439, 438, 422, 423, 1, 4, 438, 437, 421, 422, 1, 4, 437, 436, 420, 421, 1,
+ 4, 436, 435, 419, 420, 1, 4, 435, 434, 418, 419, 1, 4, 434, 433, 417, 418, 1, 4, 433,
+ 432, 416, 417, 1, 4, 448, 463, 447, 432, 1, 4, 463, 462, 446, 447, 1, 4, 462, 461, 445,
+ 446, 1, 4, 461, 460, 444, 445, 1, 4, 460, 459, 443, 444, 1, 4, 459, 458, 442, 443, 1,
+ 4, 458, 457, 441, 442, 1, 4, 457, 456, 440, 441, 1, 4, 456, 455, 439, 440, 1, 4, 455,
+ 454, 438, 439, 1, 4, 454, 453, 437, 438, 1, 4, 453, 452, 436, 437, 1, 4, 452, 451, 435,
+ 436, 1, 4, 451, 450, 434, 435, 1, 4, 450, 449, 433, 434, 1, 4, 449, 448, 432, 433, 1,
+ 4, 464, 479, 463, 448, 1, 4, 479, 478, 462, 463, 1, 4, 478, 477, 461, 462, 1, 4, 477,
+ 476, 460, 461, 1, 4, 476, 475, 459, 460, 1, 4, 475, 474, 458, 459, 1, 4, 474, 473, 457,
+ 458, 1, 4, 473, 472, 456, 457, 1, 4, 472, 471, 455, 456, 1, 4, 471, 470, 454, 455, 1,
+ 4, 470, 469, 453, 454, 1, 4, 469, 468, 452, 453, 1, 4, 468, 467, 451, 452, 1, 4, 467,
+ 466, 450, 451, 1, 4, 466, 465, 449, 450, 1, 4, 465, 464, 448, 449, 1, 4, 480, 495, 479,
+ 464, 1, 4, 495, 494, 478, 479, 1, 4, 494, 493, 477, 478, 1, 4, 493, 492, 476, 477, 1,
+ 4, 492, 491, 475, 476, 1, 4, 491, 490, 474, 475, 1, 4, 490, 489, 473, 474, 1, 4, 489,
+ 488, 472, 473, 1, 4, 488, 487, 471, 472, 1, 4, 487, 486, 470, 471, 1, 4, 486, 485, 469,
+ 470, 1, 4, 485, 484, 468, 469, 1, 4, 484, 483, 467, 468, 1, 4, 483, 482, 466, 467, 1,
+ 4, 482, 481, 465, 466, 1, 4, 481, 480, 464, 465, 1, 4, 496, 511, 495, 480, 1, 4, 511,
+ 510, 494, 495, 1, 4, 510, 509, 493, 494, 1, 4, 509, 508, 492, 493, 1, 4, 508, 507, 491,
+ 492, 1, 4, 507, 506, 490, 491, 1, 4, 506, 505, 489, 490, 1, 4, 505, 504, 488, 489, 1,
+ 4, 504, 503, 487, 488, 1, 4, 503, 502, 486, 487, 1, 4, 502, 501, 485, 486, 1, 4, 501,
+ 500, 484, 485, 1, 4, 500, 499, 483, 484, 1, 4, 499, 498, 482, 483, 1, 4, 498, 497, 481,
+ 482, 1, 4, 497, 496, 480, 481, 1, 4, 0, 15, 511, 496, 1, 4, 15, 14, 510, 511, 1,
+4, 14, 13, 509, 510, 1, 4, 13, 12, 508, 509, 1, 4, 12, 11, 507, 508, 1, 4, 11,
+ 10, 506, 507, 1, 4, 10, 9, 505, 506, 1, 4, 9, 8, 504, 505, 1, 4, 8, 7, 503,
+ 504, 1, 4, 7, 6, 502, 503, 1, 4, 6, 5, 501, 502, 1, 4, 5, 4, 500, 501, 1,
+ 4, 4, 3, 499, 500, 1, 4, 3, 2, 498, 499, 1, 4, 2, 1, 497, 498, 1, 4, 1,
+ 0, 496, 497, 1,
+ 0
+};
+
+struct lwo LWO_BigValve =
+{
+ 716, /* number of points */
+ BigValve_PNTS, BigValve_normals, BigValve_POLS, 0L
+};
+
+static const GLfloat Bolts3D_PNTS[] =
+{
+ -0.160704, 0.399, 0.6,
+ -0.160704, 0.399, -0.5,
+ -0.4, 0.160257, 0.6,
+ -0.4, 0.160257, -0.5,
+ -0.4, -0.170369, 0.6,
+ -0.4, -0.170369, -0.5,
+ -0.153738, -0.4, 0.6,
+ -0.153738, -0.4, -0.5,
+ 0.176887, -0.4, 0.6,
+ 0.176887, -0.4, -0.5,
+ 0.4, -0.163403, 0.6,
+ 0.4, -0.163403, -0.5,
+ 0.4, 0.167223, 0.6,
+ 0.4, 0.167223, -0.5,
+ 0.169922, 0.399, 0.6,
+ 0.169922, 0.399, -0.5,
+ -0.160704, 0.399, 0.5,
+ -0.160704, 0.399, -0.6,
+ -0.4, 0.160257, -0.6,
+ -0.4, 0.160257, 0.5,
+ -0.4, -0.170369, -0.6,
+ -0.4, -0.170369, 0.5,
+ -0.153738, -0.4, -0.6,
+ -0.153738, -0.4, 0.5,
+ 0.176887, -0.4, 0.5,
+ 0.176887, -0.4, -0.6,
+ 0.4, -0.163403, 0.5,
+ 0.4, -0.163403, -0.6,
+ 0.4, 0.167223, -0.6,
+ 0.4, 0.167223, 0.5,
+ 0.169922, 0.399, -0.6,
+ 0.169922, 0.399, 0.5,
+};
+
+static const GLfloat Bolts3D_normals[] =
+{
+ 0, 1, 0,
+ 0.709703, 0.704502, 0,
+ 1, 0, 0,
+ 0.727535, -0.68607, 0,
+ 0, -1, 0,
+ -0.68198, -0.73137, 0,
+ -1, 0, 0,
+ -0.706289, 0.707924, 0,
+ 0, 0, 1,
+ 0, 1, 0,
+ 0.709703, 0.704502, 0,
+ 1, 0, 0,
+ 0.727535, -0.68607, 0,
+ 0, -1, 0,
+ -0.68198, -0.73137, 0,
+ -1, 0, 0,
+ -0.706289, 0.707924, 0,
+ 0, 0, -1,
+};
+
+static const unsigned short int Bolts3D_POLS[] =
+{
+ 4, 16, 31, 14, 0, 1, 4, 31, 29, 12, 14, 1, 4, 29, 26, 10, 12, 1, 4, 26,
+ 24, 8, 10, 1, 4, 24, 23, 6, 8, 1, 4, 23, 21, 4, 6, 1, 4, 21, 19, 2,
+ 4, 1, 4, 19, 16, 0, 2, 1, 8, 14, 12, 10, 8, 6, 4, 2, 0, 1, 4, 17,
+ 30, 15, 1, 1, 4, 30, 28, 13, 15, 1, 4, 28, 27, 11, 13, 1, 4, 27, 25, 9,
+ 11, 1, 4, 25, 22, 7, 9, 1, 4, 22, 20, 5, 7, 1, 4, 20, 18, 3, 5, 1,
+ 4, 18, 17, 1, 3, 1, 8, 30, 17, 18, 20, 22, 25, 27, 28, 1,
+ 0
+};
+
+struct lwo LWO_Bolts3D =
+{
+ 32, /* number of points */
+ Bolts3D_PNTS, Bolts3D_normals, Bolts3D_POLS, 0L
+};
+
+static const GLfloat GuageConnector_PNTS[] =
+{
+ 0.2, 0.4, 0,
+ 0.2, 0.8, 0,
+ 0.193185, 0.4, -0.051764,
+ 0.193185, 0.8, -0.051764,
+ 0.173205, 0.4, -0.1,
+ 0.173205, 0.8, -0.1,
+ 0.141421, 0.8, -0.141421,
+ 0.141421, 0.4, -0.141421,
+ 0.1, 0.4, -0.173205,
+ 0.1, 0.8, -0.173205,
+ 0.051764, 0.8, -0.193185,
+ 0.051764, 0.4, -0.193185,
+ 0, 0.8, -0.2,
+ 0, 0.4, -0.2,
+ -0.051764, 0.8, -0.193185,
+ -0.051764, 0.4, -0.193185,
+ -0.1, 0.8, -0.173205,
+ -0.1, 0.4, -0.173205,
+ -0.141421, 0.4, -0.141421,
+ -0.141421, 0.8, -0.141421,
+ -0.173205, 0.8, -0.1,
+ -0.173205, 0.4, -0.1,
+ -0.193185, 0.4, -0.051764,
+ -0.193185, 0.8, -0.051764,
+ -0.2, 0.4, 0,
+ -0.2, 0.8, 0,
+ -0.193185, 0.4, 0.051764,
+ -0.193185, 0.8, 0.051764,
+ -0.173205, 0.4, 0.1,
+ -0.173205, 0.8, 0.1,
+ -0.141421, 0.8, 0.141421,
+ -0.141421, 0.4, 0.141421,
+ -0.1, 0.8, 0.173205,
+ -0.1, 0.4, 0.173205,
+ -0.051764, 0.8, 0.193185,
+ -0.051764, 0.4, 0.193185,
+ 0, 0.8, 0.2,
+ 0, 0.4, 0.2,
+ 0.051764, 0.8, 0.193185,
+ 0.051764, 0.4, 0.193185,
+ 0.1, 0.4, 0.173205,
+ 0.1, 0.8, 0.173205,
+ 0.141421, 0.4, 0.141421,
+ 0.141421, 0.8, 0.141421,
+ 0.173205, 0.8, 0.1,
+ 0.173205, 0.4, 0.1,
+ 0.193185, 0.4, 0.051764,
+ 0.193185, 0.8, 0.051764,
+ 0.2, 0.55, 0,
+ 0.193185, 0.55, -0.051764,
+ 0.173205, 0.55, -0.1,
+ 0.141421, 0.55, -0.141421,
+ 0.1, 0.55, -0.173205,
+ 0.051764, 0.55, -0.193185,
+ 0, 0.55, -0.2,
+ -0.051764, 0.55, -0.193185,
+ -0.1, 0.55, -0.173205,
+ -0.141421, 0.55, -0.141421,
+ -0.173205, 0.55, -0.1,
+ -0.193185, 0.55, -0.051764,
+ -0.2, 0.55, 0,
+ -0.193185, 0.55, 0.051764,
+ -0.173205, 0.55, 0.1,
+ -0.141421, 0.55, 0.141421,
+ -0.1, 0.55, 0.173205,
+ -0.051764, 0.55, 0.193185,
+ 0, 0.55, 0.2,
+ 0.051764, 0.55, 0.193185,
+ 0.1, 0.55, 0.173205,
+ 0.141421, 0.55, 0.141421,
+ 0.173205, 0.55, 0.1,
+ 0.193185, 0.55, 0.051764,
+ 0.15, 0.55, 0,
+ 0.144889, 0.55, -0.038823,
+ 0.129904, 0.55, -0.075,
+ 0.106066, 0.55, -0.106066,
+ 0.075, 0.55, -0.129904,
+ 0.038823, 0.55, -0.144889,
+ 0, 0.55, -0.15,
+ -0.038823, 0.55, -0.144889,
+ -0.075, 0.55, -0.129904,
+ -0.106066, 0.55, -0.106066,
+ -0.129904, 0.55, -0.075,
+ -0.144889, 0.55, -0.038823,
+ -0.15, 0.55, 0,
+ -0.144889, 0.55, 0.038823,
+ -0.129904, 0.55, 0.075,
+ -0.106066, 0.55, 0.106066,
+ -0.075, 0.55, 0.129904,
+ -0.038823, 0.55, 0.144889,
+ 0, 0.55, 0.15,
+ 0.038823, 0.55, 0.144889,
+ 0.075, 0.55, 0.129904,
+ 0.106066, 0.55, 0.106066,
+ 0.129904, 0.55, 0.075,
+ 0.144889, 0.55, 0.038823,
+ 0.15, 0.8, 0,
+ 0.144889, 0.8, -0.038823,
+ 0.129904, 0.8, -0.075,
+ 0.106066, 0.8, -0.106066,
+ 0.075, 0.8, -0.129904,
+ 0.038823, 0.8, -0.144889,
+ 0, 0.8, -0.15,
+ -0.038823, 0.8, -0.144889,
+ -0.075, 0.8, -0.129904,
+ -0.106066, 0.8, -0.106066,
+ -0.129904, 0.8, -0.075,
+ -0.144889, 0.8, -0.038823,
+ -0.15, 0.8, 0,
+ -0.144889, 0.8, 0.038823,
+ -0.129904, 0.8, 0.075,
+ -0.106066, 0.8, 0.106066,
+ -0.075, 0.8, 0.129904,
+ -0.038823, 0.8, 0.144889,
+ 0, 0.8, 0.15,
+ 0.038823, 0.8, 0.144889,
+ 0.075, 0.8, 0.129904,
+ 0.106066, 0.8, 0.106066,
+ 0.129904, 0.8, 0.075,
+ 0.144889, 0.8, 0.038823,
+ 0.2, 0.875988, 0,
+ 0.193185, 0.872346, -0.051764,
+ 0.191342, 0.87136, -0.056214,
+ 0.173205, 0.865859, -0.1,
+ 0.141421, 0.856217, -0.141421,
+ 0.1, 0.843652, -0.173205,
+ 0.097545, 0.842907, -0.174222,
+ 0.051764, 0.838398, -0.193185,
+ 0, 0.8333, -0.2,
+ -0.051764, 0.838398, -0.193185,
+ -0.097545, 0.842907, -0.174222,
+ -0.1, 0.843652, -0.173205,
+ -0.141421, 0.856217, -0.141421,
+ -0.173205, 0.865859, -0.1,
+ -0.191342, 0.87136, -0.056214,
+ -0.193185, 0.872346, -0.051764,
+ -0.2, 0.875988, 0,
+ -0.193185, 0.872346, 0.051764,
+ -0.173205, 0.865859, 0.1,
+ -0.191342, 0.87136, 0.056214,
+ -0.141421, 0.856217, 0.141421,
+ -0.1, 0.843652, 0.173205,
+ -0.051764, 0.838398, 0.193185,
+ -0.097545, 0.842907, 0.174222,
+ 0, 0.8333, 0.2,
+ 0.051764, 0.838398, 0.193185,
+ 0.1, 0.843652, 0.173205,
+ 0.097545, 0.842907, 0.174222,
+ 0.141421, 0.856217, 0.141421,
+ 0.173205, 0.865859, 0.1,
+ 0.193185, 0.872346, 0.051764,
+ 0.191342, 0.87136, 0.056214,
+};
+
+static const GLfloat GuageConnector_normals[] =
+{
+ 0.991445, 0, -0.130526,
+ 0.92388, 0, -0.382683,
+ 0.793353, 0, -0.608761,
+ 0.608761, 0, -0.793353,
+ 0.382683, 0, -0.92388,
+ 0.130526, 0, -0.991445,
+ -0.130526, 0, -0.991445,
+ -0.382683, 0, -0.92388,
+ -0.608761, 0, -0.793353,
+ -0.793353, 0, -0.608761,
+ -0.92388, 0, -0.382683,
+ -0.991445, 0, -0.130526,
+ -0.991445, 0, 0.130526,
+ -0.92388, 0, 0.382683,
+ -0.793353, 0, 0.608761,
+ -0.608761, 0, 0.793353,
+ -0.382683, 0, 0.92388,
+ -0.130526, 0, 0.991445,
+ 0.130526, 0, 0.991445,
+ 0.382683, 0, 0.92388,
+ 0.608761, 0, 0.793353,
+ 0.793353, 0, 0.608761,
+ 0.92388, 0, 0.382683,
+ 0.991445, 0, 0.130526,
+ 0.991445, 0, -0.130526,
+ 0.92388, 0, -0.382684,
+ 0.793353, 0, -0.608761,
+ 0.608761, 0, -0.793353,
+ 0.382684, 0, -0.92388,
+ 0.130526, 0, -0.991445,
+ -0.130526, 0, -0.991445,
+ -0.382684, 0, -0.92388,
+ -0.608761, 0, -0.793353,
+ -0.793353, 0, -0.608761,
+ -0.92388, 0, -0.382684,
+ -0.991445, 0, -0.130526,
+ -0.991445, 0, 0.130526,
+ -0.92388, 0, 0.382684,
+ -0.793353, 0, 0.608761,
+ -0.608761, 0, 0.793353,
+ -0.382684, 0, 0.92388,
+ -0.130526, 0, 0.991445,
+ 0.130526, 0, 0.991445,
+ 0.382684, 0, 0.92388,
+ 0.608761, 0, 0.793353,
+ 0.793353, 0, 0.608761,
+ 0.92388, 0, 0.382684,
+ 0.991445, 0, 0.130526,
+ 0, -1, 0,
+ 0.991445, 0, -0.130526,
+ 0.92388, 0, -0.382684,
+ 0.793353, 0, -0.608761,
+ 0.608761, 0, -0.793353,
+ 0.382684, 0, -0.92388,
+ 0.130526, 0, -0.991445,
+ -0.130526, 0, -0.991445,
+ -0.382684, 0, -0.92388,
+ -0.608761, 0, -0.793353,
+ -0.793353, 0, -0.608761,
+ -0.92388, 0, -0.382684,
+ -0.991445, 0, -0.130526,
+ -0.991445, 0, 0.130526,
+ -0.92388, 0, 0.382684,
+ -0.793353, 0, 0.608761,
+ -0.608761, 0, 0.793353,
+ -0.382684, 0, 0.92388,
+ -0.130526, 0, 0.991445,
+ 0.130526, 0, 0.991445,
+ 0.382684, 0, 0.92388,
+ 0.608761, 0, 0.793353,
+ 0.793353, 0, 0.608761,
+ 0.92388, 0, 0.382684,
+ 0.991445, 0, 0.130526,
+ 0, 1, 0,
+};
+
+static const unsigned short int GuageConnector_POLS[] =
+{
+ 4, 1, 120, 121, 3, 1, 5, 3, 121, 122, 123, 5, 1, 4, 5, 123, 124, 6, 1, 4,
+6, 124, 125, 9, 1, 5, 9, 125, 126, 127, 10, 1, 4, 10, 127, 128, 12, 1, 4, 14,
+ 12, 128, 129, 1, 5, 16, 14, 129, 130, 131, 1, 4, 19, 16, 131, 132, 1, 4, 20, 19,
+ 132, 133, 1, 5, 23, 20, 133, 134, 135, 1, 4, 25, 23, 135, 136, 1, 4, 25, 136, 137,
+ 27, 1, 5, 27, 137, 139, 138, 29, 1, 4, 29, 138, 140, 30, 1, 4, 30, 140, 141, 32,
+ 1, 5, 32, 141, 143, 142, 34, 1, 4, 34, 142, 144, 36, 1, 4, 38, 36, 144, 145, 1,
+ 5, 41, 38, 145, 147, 146, 1, 4, 43, 41, 146, 148, 1, 4, 44, 43, 148, 149, 1, 5,
+47, 44, 149, 151, 150, 1, 4, 1, 47, 150, 120, 1, 4, 96, 97, 73, 72, 1, 4, 97,
+ 98, 74, 73, 1, 4, 98, 99, 75, 74, 1, 4, 99, 100, 76, 75, 1, 4, 100, 101, 77,
+76, 1, 4, 101, 102, 78, 77, 1, 4, 102, 103, 79, 78, 1, 4, 103, 104, 80, 79, 1,
+ 4, 104, 105, 81, 80, 1, 4, 105, 106, 82, 81, 1, 4, 106, 107, 83, 82, 1, 4, 107,
+ 108, 84, 83, 1, 4, 108, 109, 85, 84, 1, 4, 109, 110, 86, 85, 1, 4, 110, 111, 87,
+86, 1, 4, 111, 112, 88, 87, 1, 4, 112, 113, 89, 88, 1, 4, 113, 114, 90, 89, 1,
+ 4, 114, 115, 91, 90, 1, 4, 115, 116, 92, 91, 1, 4, 116, 117, 93, 92, 1, 4, 117,
+ 118, 94, 93, 1, 4, 118, 119, 95, 94, 1, 4, 119, 96, 72, 95, 1, 24, 1, 3, 5,
+6, 9, 10, 12, 14, 16, 19, 20, 23, 25, 27, 29, 30, 32, 34, 36, 38, 41, 43, 44,
+ 47, 1, 4, 48, 49, 2, 0, 1, 4, 49, 50, 4, 2, 1, 4, 50, 51, 7, 4, 1,
+ 4, 51, 52, 8, 7, 1, 4, 52, 53, 11, 8, 1, 4, 53, 54, 13, 11, 1, 4, 54,
+ 55, 15, 13, 1, 4, 55, 56, 17, 15, 1, 4, 56, 57, 18, 17, 1, 4, 57, 58, 21,
+ 18, 1, 4, 58, 59, 22, 21, 1, 4, 59, 60, 24, 22, 1, 4, 60, 61, 26, 24, 1,
+ 4, 61, 62, 28, 26, 1, 4, 62, 63, 31, 28, 1, 4, 63, 64, 33, 31, 1, 4, 64,
+ 65, 35, 33, 1, 4, 65, 66, 37, 35, 1, 4, 66, 67, 39, 37, 1, 4, 67, 68, 40,
+ 39, 1, 4, 68, 69, 42, 40, 1, 4, 69, 70, 45, 42, 1, 4, 70, 71, 46, 45, 1,
+ 4, 71, 48, 0, 46, 1, 24, 48, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60,
+ 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 1,
+ 0
+};
+
+struct lwo LWO_GuageConnector =
+{
+ 152, /* number of points */
+ GuageConnector_PNTS, GuageConnector_normals, GuageConnector_POLS, 0L
+};
+
+static const GLfloat GuageDial_PNTS[] =
+{
+ 0, 0.05, 0.3,
+ 0.019134, 0.046194, 0.3,
+ 0.035355, 0.035355, 0.3,
+ 0.046194, 0.019134, 0.3,
+ 0.05, 0, 0.3,
+ 0.046194, -0.019134, 0.3,
+ 0.035355, -0.0354, 0.275,
+ 0.035355, -0.0354, 0.3,
+ 0.019134, -0.0462, 0.3,
+ 0, -0.05, 0.3,
+ -0.019134, -0.0462, 0.3,
+ -0.035355, -0.0354, 0.275,
+ -0.035355, -0.0354, 0.3,
+ -0.046194, -0.019134, 0.3,
+ -0.05, 0, 0.3,
+ -0.046194, 0.019134, 0.3,
+ -0.035355, 0.035355, 0.3,
+ -0.019134, 0.046194, 0.3,
+ 0, 0.05, 0.2,
+ 0.019134, 0.046194, 0.2,
+ 0.035355, 0.035355, 0.2,
+ 0.046194, 0.019134, 0.2,
+ 0.05, 0, 0.2,
+ 0.046194, -0.019134, 0.2,
+ 0.035355, -0.035355, 0.2,
+ 0.019134, -0.046194, 0.2,
+ 0, -0.05, 0.2,
+ -0.019134, -0.046194, 0.2,
+ -0.035355, -0.035355, 0.2,
+ -0.046194, -0.019134, 0.2,
+ -0.05, 0, 0.2,
+ -0.046194, 0.019134, 0.2,
+ -0.035355, 0.035355, 0.2,
+ -0.019134, 0.046194, 0.2,
+ 0, -0.3733, 0.275,
+};
+
+static const GLfloat GuageDial_normals[] =
+{
+ 0, 0, 1,
+ 0, 0, 1,
+ 0.195089, 0.980786, 0,
+ 0.55557, 0.83147, 0,
+ 0.83147, 0.55557, 0,
+ 0.980785, 0.19509, 0,
+ 0.980785, -0.19509, 0,
+ 0.83147, -0.55557, -0.000248,
+ 0.55557, -0.83147, -0.000051,
+ 0.195089, -0.980786, 0,
+ -0.195089, -0.980786, -0.00006,
+ -0.55557, -0.83147, -0.000371,
+ -0.83147, -0.55557, 0,
+ -0.980785, -0.19509, 0,
+ -0.980785, 0.19509, 0,
+ -0.83147, 0.55557, 0,
+ -0.55557, 0.83147, 0,
+ -0.195089, 0.980786, 0,
+};
+
+static const unsigned short int GuageDial_POLS[] =
+{
+ 3, 11, 6, 34, 1, 16, 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15,
+ 16, 17, 1, 4, 18, 19, 1, 0, 1, 4, 19, 20, 2, 1, 1, 4, 20, 21, 3, 2,
+ 1, 4, 21, 22, 4, 3, 1, 4, 22, 23, 5, 4, 1, 4, 23, 24, 7, 5, 1, 4,
+ 24, 25, 8, 7, 1, 4, 25, 26, 9, 8, 1, 4, 26, 27, 10, 9, 1, 4, 27, 28,
+ 12, 10, 1, 4, 28, 29, 13, 12, 1, 4, 29, 30, 14, 13, 1, 4, 30, 31, 15, 14,
+ 1, 4, 31, 32, 16, 15, 1, 4, 32, 33, 17, 16, 1, 4, 33, 18, 0, 17, 1,
+ 0
+};
+
+struct lwo LWO_GuageDial =
+{
+ 35, /* number of points */
+ GuageDial_PNTS, GuageDial_normals, GuageDial_POLS, 0L
+};
+
+static const GLfloat GuageFace_PNTS[] =
+{
+ 0, 1.7833, 0.2,
+ -0.087791, 1.774653, 0.2,
+ -0.172208, 1.749046, 0.2,
+ -0.250007, 1.707461, 0.2,
+ -0.318198, 1.651498, 0.2,
+ -0.374161, 1.583307, 0.2,
+ -0.415746, 1.505508, 0.2,
+ -0.441353, 1.421091, 0.2,
+ -0.45, 1.3333, 0.2,
+ -0.441353, 1.245509, 0.2,
+ -0.415746, 1.161092, 0.2,
+ -0.374161, 1.083293, 0.2,
+ -0.318198, 1.015102, 0.2,
+ -0.250007, 0.959139, 0.2,
+ -0.172208, 0.917554, 0.2,
+ -0.087791, 0.891947, 0.2,
+ 0, 0.8833, 0.2,
+ 0.087791, 0.891947, 0.2,
+ 0.172208, 0.917554, 0.2,
+ 0.250007, 0.959139, 0.2,
+ 0.318198, 1.015102, 0.2,
+ 0.374161, 1.083293, 0.2,
+ 0.415746, 1.161092, 0.2,
+ 0.441353, 1.245509, 0.2,
+ 0.45, 1.3333, 0.2,
+ 0.441353, 1.421091, 0.2,
+ 0.415746, 1.505508, 0.2,
+ 0.374161, 1.583307, 0.2,
+ 0.318198, 1.651498, 0.2,
+ 0.250007, 1.707461, 0.2,
+ 0.172208, 1.749046, 0.2,
+ 0.087791, 1.774653, 0.2,
+};
+
+static const GLfloat GuageFace_normals[] =
+{
+ 0, 0, 1,
+};
+
+static const unsigned short int GuageFace_POLS[] =
+{
+32, 0, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14,
+ 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1,
+ 0
+};
+
+struct lwo LWO_GuageFace =
+{
+ 32, /* number of points */
+ GuageFace_PNTS, GuageFace_normals, GuageFace_POLS, 0L
+};
+
+static const GLfloat GuageHead_PNTS[] =
+{
+ 0, 1.8333, 0.33333,
+ 0.097545, 1.823693, 0.33333,
+ 0.191342, 1.79524, 0.33333,
+ 0.277785, 1.749035, 0.33333,
+ 0.353553, 1.686853, 0.33333,
+ 0.415735, 1.611085, 0.33333,
+ 0.46194, 1.524642, 0.33333,
+ 0.490393, 1.430845, 0.33333,
+ 0.5, 1.3333, 0.33333,
+ 0.490393, 1.235755, 0.33333,
+ 0.46194, 1.141958, 0.33333,
+ 0.415735, 1.055515, 0.33333,
+ 0.353553, 0.979747, 0.33333,
+ 0.277785, 0.917565, 0.33333,
+ 0.191342, 0.87136, 0.33333,
+ 0.097545, 0.842907, 0.33333,
+ 0, 0.8333, 0.33333,
+ -0.097545, 0.842907, 0.33333,
+ -0.191342, 0.87136, 0.33333,
+ -0.277785, 0.917565, 0.33333,
+ -0.353553, 0.979747, 0.33333,
+ -0.415735, 1.055515, 0.33333,
+ -0.46194, 1.141958, 0.33333,
+ -0.490393, 1.235755, 0.33333,
+ -0.5, 1.3333, 0.33333,
+ -0.490393, 1.430845, 0.33333,
+ -0.46194, 1.524642, 0.33333,
+ -0.415735, 1.611085, 0.33333,
+ -0.353553, 1.686853, 0.33333,
+ -0.277785, 1.749035, 0.33333,
+ -0.191342, 1.79524, 0.33333,
+ -0.097545, 1.823693, 0.33333,
+ 0, 1.8333, -0.33333,
+ 0.097545, 1.823693, -0.33333,
+ 0.191342, 1.79524, -0.33333,
+ 0.277785, 1.749035, -0.33333,
+ 0.353553, 1.686853, -0.33333,
+ 0.415735, 1.611085, -0.33333,
+ 0.46194, 1.524642, -0.33333,
+ 0.490393, 1.430845, -0.33333,
+ 0.5, 1.3333, -0.33333,
+ 0.490393, 1.235755, -0.33333,
+ 0.46194, 1.141958, -0.33333,
+ 0.415735, 1.055515, -0.33333,
+ 0.353553, 0.979747, -0.33333,
+ 0.277785, 0.917565, -0.33333,
+ 0.191342, 0.87136, -0.33333,
+ 0.097545, 0.842907, -0.33333,
+ 0, 0.8333, -0.33333,
+ -0.097545, 0.842907, -0.33333,
+ -0.191342, 0.87136, -0.33333,
+ -0.277785, 0.917565, -0.33333,
+ -0.353553, 0.979747, -0.33333,
+ -0.415735, 1.055515, -0.33333,
+ -0.46194, 1.141958, -0.33333,
+ -0.490393, 1.235755, -0.33333,
+ -0.5, 1.3333, -0.33333,
+ -0.490393, 1.430845, -0.33333,
+ -0.46194, 1.524642, -0.33333,
+ -0.415735, 1.611085, -0.33333,
+ -0.353553, 1.686853, -0.33333,
+ -0.277785, 1.749035, -0.33333,
+ -0.191342, 1.79524, -0.33333,
+ -0.097545, 1.823693, -0.33333,
+ 0.087791, 1.774653, 0.33333,
+ 0, 1.7833, 0.33333,
+ 0.172208, 1.749046, 0.33333,
+ 0.250007, 1.707461, 0.33333,
+ 0.318198, 1.651498, 0.33333,
+ 0.374161, 1.583307, 0.33333,
+ 0.415746, 1.505508, 0.33333,
+ 0.441353, 1.421091, 0.33333,
+ 0.45, 1.3333, 0.33333,
+ 0.441353, 1.245509, 0.33333,
+ 0.415746, 1.161092, 0.33333,
+ 0.374161, 1.083293, 0.33333,
+ 0.318198, 1.015102, 0.33333,
+ 0.250007, 0.959139, 0.33333,
+ 0.172208, 0.917554, 0.33333,
+ 0.087791, 0.891947, 0.33333,
+ 0, 0.8833, 0.33333,
+ -0.087791, 0.891947, 0.33333,
+ -0.172208, 0.917554, 0.33333,
+ -0.250007, 0.959139, 0.33333,
+ -0.318198, 1.015102, 0.33333,
+ -0.374161, 1.083293, 0.33333,
+ -0.415746, 1.161092, 0.33333,
+ -0.441353, 1.245509, 0.33333,
+ -0.45, 1.3333, 0.33333,
+ -0.441353, 1.421091, 0.33333,
+ -0.415746, 1.505508, 0.33333,
+ -0.374161, 1.583307, 0.33333,
+ -0.318198, 1.651498, 0.33333,
+ -0.250007, 1.707461, 0.33333,
+ -0.172208, 1.749046, 0.33333,
+ -0.087791, 1.774653, 0.33333,
+ 0, 1.7833, 0.2,
+ -0.087791, 1.774653, 0.2,
+ -0.172208, 1.749046, 0.2,
+ -0.250007, 1.707461, 0.2,
+ -0.318198, 1.651498, 0.2,
+ -0.374161, 1.583307, 0.2,
+ -0.415746, 1.505508, 0.2,
+ -0.441353, 1.421091, 0.2,
+ -0.45, 1.3333, 0.2,
+ -0.441353, 1.245509, 0.2,
+ -0.415746, 1.161092, 0.2,
+ -0.374161, 1.083293, 0.2,
+ -0.318198, 1.015102, 0.2,
+ -0.250007, 0.959139, 0.2,
+ -0.172208, 0.917554, 0.2,
+ -0.087791, 0.891947, 0.2,
+ 0, 0.8833, 0.2,
+ 0.087791, 0.891947, 0.2,
+ 0.172208, 0.917554, 0.2,
+ 0.250007, 0.959139, 0.2,
+ 0.318198, 1.015102, 0.2,
+ 0.374161, 1.083293, 0.2,
+ 0.415746, 1.161092, 0.2,
+ 0.441353, 1.245509, 0.2,
+ 0.45, 1.3333, 0.2,
+ 0.441353, 1.421091, 0.2,
+ 0.415746, 1.505508, 0.2,
+ 0.374161, 1.583307, 0.2,
+ 0.318198, 1.651498, 0.2,
+ 0.250007, 1.707461, 0.2,
+ 0.172208, 1.749046, 0.2,
+ 0.087791, 1.774653, 0.2,
+};
+
+static const GLfloat GuageHead_normals[] =
+{
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0, 0, 1,
+ 0.098017, -0.995185, 0,
+ 0.290285, -0.95694, 0,
+ 0.471397, -0.881921, 0,
+ 0.634393, -0.77301, 0,
+ 0.773011, -0.634393, 0,
+ 0.881921, -0.471397, 0,
+ 0.95694, -0.290284, 0,
+ 0.995185, -0.098017, 0,
+ 0.995185, 0.098017, 0,
+ 0.95694, 0.290284, 0,
+ 0.881921, 0.471397, 0,
+ 0.773011, 0.634393, 0,
+ 0.634393, 0.773011, 0,
+ 0.471397, 0.881921, 0,
+ 0.290285, 0.95694, 0,
+ 0.098017, 0.995185, 0,
+ -0.098017, 0.995185, 0,
+ -0.290285, 0.95694, 0,
+ -0.471397, 0.881921, 0,
+ -0.634393, 0.773011, 0,
+ -0.773011, 0.634393, 0,
+ -0.881921, 0.471397, 0,
+ -0.95694, 0.290284, 0,
+ -0.995185, 0.098017, 0,
+ -0.995185, -0.098017, 0,
+ -0.95694, -0.290284, 0,
+ -0.881921, -0.471397, 0,
+ -0.773011, -0.634393, 0,
+ -0.634393, -0.77301, 0,
+ -0.471397, -0.881921, 0,
+ -0.290285, -0.95694, 0,
+ -0.098017, -0.995185, 0,
+ 0.098017, 0.995185, 0,
+ 0.290285, 0.95694, 0,
+ 0.471397, 0.881921, 0,
+ 0.634393, 0.773011, 0,
+ 0.773011, 0.634393, 0,
+ 0.881921, 0.471397, 0,
+ 0.95694, 0.290284, 0,
+ 0.995185, 0.098017, 0,
+ 0.995185, -0.098017, 0,
+ 0.95694, -0.290284, 0,
+ 0.881921, -0.471397, 0,
+ 0.773011, -0.634393, 0,
+ 0.634393, -0.77301, 0,
+ 0.471396, -0.881921, 0,
+ 0.290285, -0.95694, 0,
+ 0.098017, -0.995185, 0,
+ -0.098017, -0.995185, 0,
+ -0.290285, -0.95694, 0,
+ -0.471396, -0.881921, 0,
+ -0.634393, -0.77301, 0,
+ -0.773011, -0.634393, 0,
+ -0.881921, -0.471397, 0,
+ -0.95694, -0.290284, 0,
+ -0.995185, -0.098017, 0,
+ -0.995185, 0.098017, 0,
+ -0.95694, 0.290284, 0,
+ -0.881921, 0.471397, 0,
+ -0.773011, 0.634393, 0,
+ -0.634393, 0.773011, 0,
+ -0.471397, 0.881921, 0,
+ -0.290285, 0.95694, 0,
+ -0.098017, 0.995185, 0,
+ 0, 0, -1,
+};
+
+static const unsigned short int GuageHead_POLS[] =
+{
+ 3, 67, 3, 4, 1, 3, 68, 67, 4, 1, 3, 68, 4, 5, 1, 3, 69, 68, 5, 1,
+ 3, 70, 69, 5, 1, 3, 70, 5, 6, 1, 3, 70, 6, 7, 1, 3, 71, 70, 7, 1,
+ 3, 71, 7, 8, 1, 3, 72, 71, 8, 1, 3, 73, 72, 8, 1, 3, 73, 8, 9, 1,
+ 3, 74, 73, 9, 1, 3, 74, 9, 10, 1, 3, 74, 10, 11, 1, 3, 75, 74, 11, 1,
+ 3, 76, 75, 11, 1, 3, 76, 11, 12, 1, 3, 76, 12, 13, 1, 3, 77, 76, 13, 1,
+ 3, 78, 77, 13, 1, 3, 78, 13, 14, 1, 3, 78, 14, 15, 1, 3, 79, 78, 15, 1,
+ 3, 79, 15, 16, 1, 3, 80, 79, 16, 1, 3, 81, 80, 16, 1, 3, 81, 16, 17, 1,
+ 3, 82, 81, 17, 1, 3, 82, 17, 18, 1, 3, 82, 18, 19, 1, 3, 83, 82, 19, 1,
+ 3, 84, 83, 19, 1, 3, 84, 19, 20, 1, 3, 84, 20, 21, 1, 3, 85, 84, 21, 1,
+ 3, 86, 85, 21, 1, 3, 86, 21, 22, 1, 3, 86, 22, 23, 1, 3, 87, 86, 23, 1,
+ 3, 87, 23, 24, 1, 3, 88, 87, 24, 1, 3, 89, 88, 24, 1, 3, 89, 24, 25, 1,
+ 3, 90, 89, 25, 1, 3, 90, 25, 26, 1, 3, 90, 26, 27, 1, 3, 91, 90, 27, 1,
+ 3, 92, 91, 27, 1, 3, 92, 27, 28, 1, 3, 93, 92, 28, 1, 3, 93, 28, 29, 1,
+ 3, 2, 3, 67, 1, 3, 2, 67, 66, 1, 3, 1, 2, 66, 1, 3, 1, 66, 64, 1,
+ 3, 1, 64, 65, 1, 3, 0, 1, 65, 1, 3, 31, 0, 65, 1, 3, 31, 65, 95, 1,
+ 3, 31, 95, 94, 1, 3, 30, 31, 94, 1, 3, 30, 94, 93, 1, 3, 93, 29, 30, 1,
+ 4, 96, 97, 95, 65, 1, 4, 97, 98, 94, 95, 1, 4, 98, 99, 93, 94, 1, 4, 99,
+ 100, 92, 93, 1, 4, 100, 101, 91, 92, 1, 4, 101, 102, 90, 91, 1, 4, 102, 103, 89,
+90, 1, 4, 103, 104, 88, 89, 1, 4, 104, 105, 87, 88, 1, 4, 105, 106, 86, 87, 1,
+ 4, 106, 107, 85, 86, 1, 4, 107, 108, 84, 85, 1, 4, 108, 109, 83, 84, 1, 4, 109,
+ 110, 82, 83, 1, 4, 110, 111, 81, 82, 1, 4, 111, 112, 80, 81, 1, 4, 112, 113, 79,
+80, 1, 4, 113, 114, 78, 79, 1, 4, 114, 115, 77, 78, 1, 4, 115, 116, 76, 77, 1,
+ 4, 116, 117, 75, 76, 1, 4, 117, 118, 74, 75, 1, 4, 118, 119, 73, 74, 1, 4, 119,
+ 120, 72, 73, 1, 4, 120, 121, 71, 72, 1, 4, 121, 122, 70, 71, 1, 4, 122, 123, 69,
+70, 1, 4, 123, 124, 68, 69, 1, 4, 124, 125, 67, 68, 1, 4, 125, 126, 66, 67, 1,
+ 4, 126, 127, 64, 66, 1, 4, 127, 96, 65, 64, 1, 4, 32, 33, 1, 0, 1, 4, 33,
+ 34, 2, 1, 1, 4, 34, 35, 3, 2, 1, 4, 35, 36, 4, 3, 1, 4, 36, 37, 5,
+ 4, 1, 4, 37, 38, 6, 5, 1, 4, 38, 39, 7, 6, 1, 4, 39, 40, 8, 7, 1,
+ 4, 40, 41, 9, 8, 1, 4, 41, 42, 10, 9, 1, 4, 42, 43, 11, 10, 1, 4, 43,
+ 44, 12, 11, 1, 4, 44, 45, 13, 12, 1, 4, 45, 46, 14, 13, 1, 4, 46, 47, 15,
+ 14, 1, 4, 47, 48, 16, 15, 1, 4, 48, 49, 17, 16, 1, 4, 49, 50, 18, 17, 1,
+ 4, 50, 51, 19, 18, 1, 4, 51, 52, 20, 19, 1, 4, 52, 53, 21, 20, 1, 4, 53,
+ 54, 22, 21, 1, 4, 54, 55, 23, 22, 1, 4, 55, 56, 24, 23, 1, 4, 56, 57, 25,
+ 24, 1, 4, 57, 58, 26, 25, 1, 4, 58, 59, 27, 26, 1, 4, 59, 60, 28, 27, 1,
+ 4, 60, 61, 29, 28, 1, 4, 61, 62, 30, 29, 1, 4, 62, 63, 31, 30, 1, 4, 63,
+32, 0, 31, 1, 32, 32, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50,
+ 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 1,
+ 0
+};
+
+struct lwo LWO_GuageHead =
+{
+ 128, /* number of points */
+ GuageHead_PNTS, GuageHead_normals, GuageHead_POLS, 0L
+};
+
+static const GLfloat PipeBetweenBolts_PNTS[] =
+{
+ 0, 0.5, 0.5,
+ 0.12941, 0.482963, 0.5,
+ 0.25, 0.433013, 0.5,
+ 0.353553, 0.353553, 0.5,
+ 0.433013, 0.25, 0.5,
+ 0.482963, 0.12941, 0.5,
+ 0.5, 0, 0.5,
+ 0.482963, -0.12941, 0.5,
+ 0.433013, -0.25, 0.5,
+ 0.353553, -0.353553, 0.5,
+ 0.25, -0.433013, 0.5,
+ 0.12941, -0.482963, 0.5,
+ 0, -0.5, 0.5,
+ -0.12941, -0.482963, 0.5,
+ -0.25, -0.433013, 0.5,
+ -0.353553, -0.353553, 0.5,
+ -0.433013, -0.25, 0.5,
+ -0.482963, -0.12941, 0.5,
+ -0.5, 0, 0.5,
+ -0.482963, 0.12941, 0.5,
+ -0.433013, 0.25, 0.5,
+ -0.353553, 0.353553, 0.5,
+ -0.25, 0.433013, 0.5,
+ -0.12941, 0.482963, 0.5,
+ 0, 0.5, -0.5,
+ 0.12941, 0.482963, -0.5,
+ 0.25, 0.433013, -0.5,
+ 0.353553, 0.353553, -0.5,
+ 0.433013, 0.25, -0.5,
+ 0.482963, 0.12941, -0.5,
+ 0.5, 0, -0.5,
+ 0.482963, -0.12941, -0.5,
+ 0.433013, -0.25, -0.5,
+ 0.353553, -0.353553, -0.5,
+ 0.25, -0.433013, -0.5,
+ 0.12941, -0.482963, -0.5,
+ 0, -0.5, -0.5,
+ -0.12941, -0.482963, -0.5,
+ -0.25, -0.433013, -0.5,
+ -0.353553, -0.353553, -0.5,
+ -0.433013, -0.25, -0.5,
+ -0.482963, -0.12941, -0.5,
+ -0.5, 0, -0.5,
+ -0.482963, 0.12941, -0.5,
+ -0.433013, 0.25, -0.5,
+ -0.353553, 0.353553, -0.5,
+ -0.25, 0.433013, -0.5,
+ -0.12941, 0.482963, -0.5,
+};
+
+static const GLfloat PipeBetweenBolts_normals[] =
+{
+ 0, 0, 1,
+ 0.130526, 0.991445, 0,
+ 0.382683, 0.92388, 0,
+ 0.608761, 0.793353, 0,
+ 0.793353, 0.608761, 0,
+ 0.92388, 0.382683, 0,
+ 0.991445, 0.130526, 0,
+ 0.991445, -0.130526, 0,
+ 0.92388, -0.382683, 0,
+ 0.793353, -0.608761, 0,
+ 0.608761, -0.793353, 0,
+ 0.382683, -0.92388, 0,
+ 0.130526, -0.991445, 0,
+ -0.130526, -0.991445, 0,
+ -0.382683, -0.92388, 0,
+ -0.608761, -0.793353, 0,
+ -0.793353, -0.608761, 0,
+ -0.92388, -0.382683, 0,
+ -0.991445, -0.130526, 0,
+ -0.991445, 0.130526, 0,
+ -0.92388, 0.382683, 0,
+ -0.793353, 0.608761, 0,
+ -0.608761, 0.793353, 0,
+ -0.382683, 0.92388, 0,
+ -0.130526, 0.991445, 0,
+ 0, 0, -1,
+};
+
+static const unsigned short int PipeBetweenBolts_POLS[] =
+{
+ 24, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 1, 4, 24, 25, 1, 0, 1, 4, 25, 26, 2, 1, 1, 4, 26,
+ 27, 3, 2, 1, 4, 27, 28, 4, 3, 1, 4, 28, 29, 5, 4, 1, 4, 29, 30, 6,
+ 5, 1, 4, 30, 31, 7, 6, 1, 4, 31, 32, 8, 7, 1, 4, 32, 33, 9, 8, 1,
+ 4, 33, 34, 10, 9, 1, 4, 34, 35, 11, 10, 1, 4, 35, 36, 12, 11, 1, 4, 36,
+ 37, 13, 12, 1, 4, 37, 38, 14, 13, 1, 4, 38, 39, 15, 14, 1, 4, 39, 40, 16,
+ 15, 1, 4, 40, 41, 17, 16, 1, 4, 41, 42, 18, 17, 1, 4, 42, 43, 19, 18, 1,
+ 4, 43, 44, 20, 19, 1, 4, 44, 45, 21, 20, 1, 4, 45, 46, 22, 21, 1, 4, 46,
+ 47, 23, 22, 1, 4, 47, 24, 0, 23, 1, 24, 24, 47, 46, 45, 44, 43, 42, 41, 40,
+ 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 1,
+ 0
+};
+
+struct lwo LWO_PipeBetweenBolts =
+{
+ 48, /* number of points */
+ PipeBetweenBolts_PNTS, PipeBetweenBolts_normals, PipeBetweenBolts_POLS, 0L
+};
+
+static const GLfloat ElbowBolts_PNTS[] =
+{
+ 0.273122, -0.6, -0.403061,
+ 0.273122, 0.403061, -0.6,
+ 0.273122, 0.333061, -0.6,
+ 0.273122, -0.6, -0.333061,
+ 0.2125, 0.298061, -0.6,
+ 0.2125, -0.6, -0.298061,
+ 0.151878, 0.333061, -0.6,
+ 0.151878, -0.6, -0.333061,
+ 0.151878, 0.403061, -0.6,
+ 0.151878, -0.6, -0.403061,
+ 0.2125, -0.6, -0.438061,
+ 0.2125, 0.438061, -0.6,
+ 0.273122, -0.66, -0.403061,
+ 0.273122, 0.403061, -0.66,
+ 0.273122, -0.66, -0.333061,
+ 0.273122, 0.333061, -0.66,
+ 0.2125, 0.298061, -0.66,
+ 0.2125, -0.66, -0.298061,
+ 0.151878, -0.66, -0.333061,
+ 0.151878, 0.333061, -0.66,
+ 0.151878, 0.403061, -0.66,
+ 0.151878, -0.66, -0.403061,
+ 0.2125, -0.66, -0.438061,
+ 0.2125, 0.438061, -0.66,
+ 0.273122, 0.403061, -0.46,
+ 0.273122, -0.46, -0.403061,
+ 0.273122, 0.333061, -0.46,
+ 0.273122, -0.46, -0.333061,
+ 0.2125, 0.298061, -0.46,
+ 0.2125, -0.46, -0.298061,
+ 0.151878, 0.333061, -0.46,
+ 0.151878, -0.46, -0.333061,
+ 0.151878, 0.403061, -0.46,
+ 0.151878, -0.46, -0.403061,
+ 0.2125, -0.46, -0.438061,
+ 0.2125, 0.438061, -0.46,
+ 0.273122, 0.403061, -0.52,
+ 0.273122, -0.52, -0.403061,
+ 0.273122, -0.52, -0.333061,
+ 0.273122, 0.333061, -0.52,
+ 0.2125, 0.298061, -0.52,
+ 0.2125, -0.52, -0.298061,
+ 0.151878, 0.333061, -0.52,
+ 0.151878, -0.52, -0.333061,
+ 0.151878, 0.403061, -0.52,
+ 0.151878, -0.52, -0.403061,
+ 0.2125, -0.52, -0.438061,
+ 0.2125, 0.438061, -0.52,
+ 0.485622, -0.035, -0.46,
+ 0.485622, -0.46, 0.035,
+ 0.425, -0.07, -0.46,
+ 0.425, -0.46, 0.07,
+ 0.364378, -0.46, 0.035,
+ 0.364378, -0.035, -0.46,
+ 0.364378, 0.035, -0.46,
+ 0.364378, -0.46, -0.035,
+ 0.425, 0.07, -0.46,
+ 0.425, -0.46, -0.07,
+ 0.485622, 0.035, -0.46,
+ 0.485622, -0.46, -0.035,
+ 0.485622, -0.52, 0.035,
+ 0.485622, -0.035, -0.52,
+ 0.425, -0.07, -0.52,
+ 0.425, -0.52, 0.07,
+ 0.364378, -0.035, -0.52,
+ 0.364378, -0.52, 0.035,
+ 0.364378, -0.52, -0.035,
+ 0.364378, 0.035, -0.52,
+ 0.425, 0.07, -0.52,
+ 0.425, -0.52, -0.07,
+ 0.485622, 0.035, -0.52,
+ 0.485622, -0.52, -0.035,
+ 0.485622, -0.035, -0.6,
+ 0.485622, -0.6, 0.035,
+ 0.425, -0.6, 0.07,
+ 0.425, -0.07, -0.6,
+ 0.364378, -0.6, 0.035,
+ 0.364378, -0.035, -0.6,
+ 0.364378, 0.035, -0.6,
+ 0.364378, -0.6, -0.035,
+ 0.425, 0.07, -0.6,
+ 0.425, -0.6, -0.07,
+ 0.485622, -0.6, -0.035,
+ 0.485622, 0.035, -0.6,
+ 0.485622, -0.66, 0.035,
+ 0.485622, -0.035, -0.66,
+ 0.425, -0.66, 0.07,
+ 0.425, -0.07, -0.66,
+ 0.364378, -0.035, -0.66,
+ 0.364378, -0.66, 0.035,
+ 0.364378, -0.66, -0.035,
+ 0.364378, 0.035, -0.66,
+ 0.425, 0.07, -0.66,
+ 0.425, -0.66, -0.07,
+ 0.485622, -0.66, -0.035,
+ 0.485622, 0.035, -0.66,
+ 0.2125, -0.438061, -0.46,
+ 0.2125, -0.46, 0.438061,
+ 0.151878, -0.403061, -0.46,
+ 0.151878, -0.46, 0.403061,
+ 0.151878, -0.46, 0.333061,
+ 0.151878, -0.333061, -0.46,
+ 0.2125, -0.46, 0.298061,
+ 0.2125, -0.298061, -0.46,
+ 0.273122, -0.46, 0.333061,
+ 0.273122, -0.333061, -0.46,
+ 0.273122, -0.403061, -0.46,
+ 0.273122, -0.46, 0.403061,
+ 0.2125, -0.52, 0.438061,
+ 0.2125, -0.438061, -0.52,
+ 0.151878, -0.403061, -0.52,
+ 0.151878, -0.52, 0.403061,
+ 0.151878, -0.333061, -0.52,
+ 0.151878, -0.52, 0.333061,
+ 0.2125, -0.298061, -0.52,
+ 0.2125, -0.52, 0.298061,
+ 0.273122, -0.333061, -0.52,
+ 0.273122, -0.52, 0.333061,
+ 0.273122, -0.403061, -0.52,
+ 0.273122, -0.52, 0.403061,
+ 0.2125, -0.438061, -0.6,
+ 0.2125, -0.6, 0.438061,
+ 0.151878, -0.403061, -0.6,
+ 0.151878, -0.6, 0.403061,
+ 0.151878, -0.6, 0.333061,
+ 0.151878, -0.333061, -0.6,
+ 0.2125, -0.298061, -0.6,
+ 0.2125, -0.6, 0.298061,
+ 0.273122, -0.333061, -0.6,
+ 0.273122, -0.6, 0.333061,
+ 0.273122, -0.6, 0.403061,
+ 0.273122, -0.403061, -0.6,
+ 0.2125, -0.66, 0.438061,
+ 0.2125, -0.438061, -0.66,
+ 0.151878, -0.403061, -0.66,
+ 0.151878, -0.66, 0.403061,
+ 0.151878, -0.333061, -0.66,
+ 0.151878, -0.66, 0.333061,
+ 0.2125, -0.66, 0.298061,
+ 0.2125, -0.298061, -0.66,
+ 0.273122, -0.66, 0.333061,
+ 0.273122, -0.333061, -0.66,
+ 0.273122, -0.66, 0.403061,
+ 0.273122, -0.403061, -0.66,
+ -0.273122, -0.46, 0.403061,
+ -0.273122, -0.403061, -0.46,
+ -0.273122, -0.46, 0.333061,
+ -0.273122, -0.333061, -0.46,
+ -0.2125, -0.298061, -0.46,
+ -0.2125, -0.46, 0.298061,
+ -0.151878, -0.333061, -0.46,
+ -0.151878, -0.46, 0.333061,
+ -0.151878, -0.403061, -0.46,
+ -0.151878, -0.46, 0.403061,
+ -0.2125, -0.46, 0.438061,
+ -0.2125, -0.438061, -0.46,
+ -0.273122, -0.52, 0.403061,
+ -0.273122, -0.403061, -0.52,
+ -0.273122, -0.333061, -0.52,
+ -0.273122, -0.52, 0.333061,
+ -0.2125, -0.52, 0.298061,
+ -0.2125, -0.298061, -0.52,
+ -0.151878, -0.333061, -0.52,
+ -0.151878, -0.52, 0.333061,
+ -0.151878, -0.52, 0.403061,
+ -0.151878, -0.403061, -0.52,
+ -0.2125, -0.52, 0.438061,
+ -0.2125, -0.438061, -0.52,
+ -0.273122, -0.6, 0.403061,
+ -0.273122, -0.403061, -0.6,
+ -0.273122, -0.6, 0.333061,
+ -0.273122, -0.333061, -0.6,
+ -0.2125, -0.6, 0.298061,
+ -0.2125, -0.298061, -0.6,
+ -0.151878, -0.333061, -0.6,
+ -0.151878, -0.6, 0.333061,
+ -0.151878, -0.6, 0.403061,
+ -0.151878, -0.403061, -0.6,
+ -0.2125, -0.438061, -0.6,
+ -0.2125, -0.6, 0.438061,
+ -0.273122, -0.66, 0.403061,
+ -0.273122, -0.403061, -0.66,
+ -0.273122, -0.333061, -0.66,
+ -0.273122, -0.66, 0.333061,
+ -0.2125, -0.298061, -0.66,
+ -0.2125, -0.66, 0.298061,
+ -0.151878, -0.66, 0.333061,
+ -0.151878, -0.333061, -0.66,
+ -0.151878, -0.66, 0.403061,
+ -0.151878, -0.403061, -0.66,
+ -0.2125, -0.438061, -0.66,
+ -0.2125, -0.66, 0.438061,
+ -0.485622, -0.46, -0.035,
+ -0.485622, 0.035, -0.46,
+ -0.425, 0.07, -0.46,
+ -0.425, -0.46, -0.07,
+ -0.364378, 0.035, -0.46,
+ -0.364378, -0.46, -0.035,
+ -0.364378, -0.46, 0.035,
+ -0.364378, -0.035, -0.46,
+ -0.425, -0.46, 0.07,
+ -0.425, -0.07, -0.46,
+ -0.485622, -0.035, -0.46,
+ -0.485622, -0.46, 0.035,
+ -0.485622, -0.52, -0.035,
+ -0.485622, 0.035, -0.52,
+ -0.425, 0.07, -0.52,
+ -0.425, -0.52, -0.07,
+ -0.364378, 0.035, -0.52,
+ -0.364378, -0.52, -0.035,
+ -0.364378, -0.035, -0.52,
+ -0.364378, -0.52, 0.035,
+ -0.425, -0.52, 0.07,
+ -0.425, -0.07, -0.52,
+ -0.485622, -0.035, -0.52,
+ -0.485622, -0.52, 0.035,
+ -0.485622, 0.035, -0.6,
+ -0.485622, -0.6, -0.035,
+ -0.425, -0.6, -0.07,
+ -0.425, 0.07, -0.6,
+ -0.364378, -0.6, -0.035,
+ -0.364378, 0.035, -0.6,
+ -0.364378, -0.6, 0.035,
+ -0.364378, -0.035, -0.6,
+ -0.425, -0.6, 0.07,
+ -0.425, -0.07, -0.6,
+ -0.485622, -0.6, 0.035,
+ -0.485622, -0.035, -0.6,
+ -0.485622, -0.66, -0.035,
+ -0.485622, 0.035, -0.66,
+ -0.425, -0.66, -0.07,
+ -0.425, 0.07, -0.66,
+ -0.364378, 0.035, -0.66,
+ -0.364378, -0.66, -0.035,
+ -0.364378, -0.66, 0.035,
+ -0.364378, -0.035, -0.66,
+ -0.425, -0.07, -0.66,
+ -0.425, -0.66, 0.07,
+ -0.485622, -0.66, 0.035,
+ -0.485622, -0.035, -0.66,
+ -0.2125, -0.46, -0.438061,
+ -0.2125, 0.438061, -0.46,
+ -0.151878, 0.403061, -0.46,
+ -0.151878, -0.46, -0.403061,
+ -0.151878, -0.46, -0.333061,
+ -0.151878, 0.333061, -0.46,
+ -0.2125, 0.298061, -0.46,
+ -0.2125, -0.46, -0.298061,
+ -0.273122, 0.333061, -0.46,
+ -0.273122, -0.46, -0.333061,
+ -0.273122, -0.46, -0.403061,
+ -0.273122, 0.403061, -0.46,
+ -0.2125, -0.52, -0.438061,
+ -0.2125, 0.438061, -0.52,
+ -0.151878, 0.403061, -0.52,
+ -0.151878, -0.52, -0.403061,
+ -0.151878, -0.52, -0.333061,
+ -0.151878, 0.333061, -0.52,
+ -0.2125, 0.298061, -0.52,
+ -0.2125, -0.52, -0.298061,
+ -0.273122, 0.333061, -0.52,
+ -0.273122, -0.52, -0.333061,
+ -0.273122, 0.403061, -0.52,
+ -0.273122, -0.52, -0.403061,
+ -0.2125, 0.438061, -0.6,
+ -0.2125, -0.6, -0.438061,
+ -0.151878, -0.6, -0.403061,
+ -0.151878, 0.403061, -0.6,
+ -0.151878, 0.333061, -0.6,
+ -0.151878, -0.6, -0.333061,
+ -0.2125, -0.6, -0.298061,
+ -0.2125, 0.298061, -0.6,
+ -0.273122, -0.6, -0.333061,
+ -0.273122, 0.333061, -0.6,
+ -0.273122, -0.6, -0.403061,
+ -0.273122, 0.403061, -0.6,
+ -0.2125, -0.66, -0.438061,
+ -0.2125, 0.438061, -0.66,
+ -0.151878, -0.66, -0.403061,
+ -0.151878, 0.403061, -0.66,
+ -0.151878, -0.66, -0.333061,
+ -0.151878, 0.333061, -0.66,
+ -0.2125, -0.66, -0.298061,
+ -0.2125, 0.298061, -0.66,
+ -0.273122, -0.66, -0.333061,
+ -0.273122, 0.333061, -0.66,
+ -0.273122, 0.403061, -0.66,
+ -0.273122, -0.66, -0.403061,
+};
+
+static const GLfloat ElbowBolts_normals[] =
+{
+ 0, 0, 1,
+ 0.5, 0.866026, 0,
+ 1, 0, 0,
+ 0.5, -0.866025, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ -0.5, 0.866025, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ 0.499999, 0.866026, 0,
+ 1, 0, 0,
+ 0.5, -0.866025, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ -0.5, 0.866025, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ -0.5, 0.866025, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0.5, -0.866025, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ -0.5, 0.866025, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0.5, -0.866025, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ -1, 0, 0,
+ -0.5, 0.866026, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0.5, -0.866026, 0,
+ -0.5, -0.866025, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ -1, 0, 0,
+ -0.5, 0.866026, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0.5, -0.866025, 0,
+ -0.5, -0.866025, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ -0.5, -0.866026, 0,
+ -1, 0, 0,
+ -0.5, 0.866025, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0.5, -0.866025, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ -0.499999, -0.866026, 0,
+ -1, 0, 0,
+ -0.5, 0.866025, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0.5, -0.866025, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ 0.5, -0.866025, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ -0.5, 0.866025, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ 0.5, -0.866025, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ -0.5, 0.866025, 0,
+ 0.5, 0.866025, 0,
+ 1, 0, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ 1, 0, 0,
+ 0.5, -0.866026, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ -0.5, 0.866026, 0,
+ 0.5, 0.866025, 0,
+ 0, 0, -1,
+ 0, 0, 1,
+ 1, 0, 0,
+ 0.5, -0.866026, 0,
+ -0.5, -0.866025, 0,
+ -1, 0, 0,
+ -0.5, 0.866025, 0,
+ 0.5, 0.866025, 0,
+ 0, 0, -1,
+ 0, 1, 0,
+ 0.5, 0, -0.866026,
+ 1, 0, 0,
+ 0.5, 0, 0.866025,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ -0.5, 0, -0.866025,
+ 0, -1, 0,
+ 0, 1, 0,
+ 0.499999, 0, -0.866026,
+ 1, 0, 0,
+ 0.5, 0, 0.866025,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ -0.5, 0, -0.866025,
+ 0, -1, 0,
+ 0, 1, 0,
+ -0.5, 0, -0.866025,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0.5, 0, 0.866025,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ 0, -1, 0,
+ 0, 1, 0,
+ -0.5, 0, -0.866025,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0.5, 0, 0.866025,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ 0, -1, 0,
+ 0, 1, 0,
+ -1, 0, 0,
+ -0.5, 0, -0.866026,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0.5, 0, 0.866026,
+ -0.5, 0, 0.866025,
+ 0, -1, 0,
+ 0, 1, 0,
+ -1, 0, 0,
+ -0.5, 0, -0.866026,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0.5, 0, 0.866025,
+ -0.5, 0, 0.866025,
+ 0, -1, 0,
+ 0, 1, 0,
+ -0.5, 0, 0.866026,
+ -1, 0, 0,
+ -0.5, 0, -0.866025,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0.5, 0, 0.866025,
+ 0, -1, 0,
+ 0, 1, 0,
+ -0.499999, 0, 0.866026,
+ -1, 0, 0,
+ -0.5, 0, -0.866025,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0.5, 0, 0.866025,
+ 0, -1, 0,
+ 0, 1, 0,
+ 0.5, 0, 0.866025,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ -0.5, 0, -0.866025,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0, -1, 0,
+ 0, 1, 0,
+ 0.5, 0, 0.866025,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ -0.5, 0, -0.866025,
+ 0.5, 0, -0.866025,
+ 1, 0, 0,
+ 0, -1, 0,
+ 0, 1, 0,
+ 1, 0, 0,
+ 0.5, 0, 0.866026,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ -0.5, 0, -0.866026,
+ 0.5, 0, -0.866025,
+ 0, -1, 0,
+ 0, 1, 0,
+ 1, 0, 0,
+ 0.5, 0, 0.866026,
+ -0.5, 0, 0.866025,
+ -1, 0, 0,
+ -0.5, 0, -0.866025,
+ 0.5, 0, -0.866025,
+ 0, -1, 0,
+};
+
+static const unsigned short int ElbowBolts_POLS[] =
+{
+ 6, 241, 242, 245, 246, 248, 251, 1, 4, 253, 254, 242, 241, 1, 4, 254, 257, 245, 242, 1,
+ 4, 257, 258, 246, 245, 1, 4, 258, 260, 248, 246, 1, 4, 260, 262, 251, 248, 1, 4, 262,
+ 253, 241, 251, 1, 6, 253, 262, 260, 258, 257, 254, 1, 6, 264, 267, 268, 271, 273, 275, 1,
+ 4, 277, 279, 267, 264, 1, 4, 279, 281, 268, 267, 1, 4, 281, 283, 271, 268, 1, 4, 283,
+ 285, 273, 271, 1, 4, 285, 286, 275, 273, 1, 4, 286, 277, 264, 275, 1, 6, 277, 286, 285,
+ 283, 281, 279, 1, 6, 193, 194, 196, 199, 201, 202, 1, 4, 205, 206, 194, 193, 1, 4, 206,
+ 208, 196, 194, 1, 4, 208, 210, 199, 196, 1, 4, 210, 213, 201, 199, 1, 4, 213, 214, 202,
+ 201, 1, 4, 214, 205, 193, 202, 1, 6, 205, 214, 213, 210, 208, 206, 1, 6, 216, 219, 221,
+ 223, 225, 227, 1, 4, 229, 231, 219, 216, 1, 4, 231, 232, 221, 219, 1, 4, 232, 235, 223,
+ 221, 1, 4, 235, 236, 225, 223, 1, 4, 236, 239, 227, 225, 1, 4, 239, 229, 216, 227, 1,
+ 6, 229, 239, 236, 235, 232, 231, 1, 6, 145, 147, 148, 150, 152, 155, 1, 4, 157, 158, 147,
+ 145, 1, 4, 158, 161, 148, 147, 1, 4, 161, 162, 150, 148, 1, 4, 162, 165, 152, 150, 1,
+ 4, 165, 167, 155, 152, 1, 4, 167, 157, 145, 155, 1, 6, 157, 167, 165, 162, 161, 158, 1,
+ 6, 169, 171, 173, 174, 177, 178, 1, 4, 181, 182, 171, 169, 1, 4, 182, 184, 173, 171, 1,
+ 4, 184, 187, 174, 173, 1, 4, 187, 189, 177, 174, 1, 4, 189, 190, 178, 177, 1, 4, 190,
+ 181, 169, 178, 1, 6, 181, 190, 189, 187, 184, 182, 1, 6, 96, 98, 101, 103, 105, 106, 1,
+ 4, 109, 110, 98, 96, 1, 4, 110, 112, 101, 98, 1, 4, 112, 114, 103, 101, 1, 4, 114,
+ 116, 105, 103, 1, 4, 116, 118, 106, 105, 1, 4, 118, 109, 96, 106, 1, 6, 109, 118, 116,
+ 114, 112, 110, 1, 6, 120, 122, 125, 126, 128, 131, 1, 4, 133, 134, 122, 120, 1, 4, 134,
+ 136, 125, 122, 1, 4, 136, 139, 126, 125, 1, 4, 139, 141, 128, 126, 1, 4, 141, 143, 131,
+ 128, 1, 4, 143, 133, 120, 131, 1, 6, 133, 143, 141, 139, 136, 134, 1, 6, 48, 50, 53,
+ 54, 56, 58, 1, 4, 61, 62, 50, 48, 1, 4, 62, 64, 53, 50, 1, 4, 64, 67, 54,
+ 53, 1, 4, 67, 68, 56, 54, 1, 4, 68, 70, 58, 56, 1, 4, 70, 61, 48, 58, 1,
+ 6, 61, 70, 68, 67, 64, 62, 1, 6, 72, 75, 77, 78, 80, 83, 1, 4, 85, 87, 75,
+ 72, 1, 4, 87, 88, 77, 75, 1, 4, 88, 91, 78, 77, 1, 4, 91, 92, 80, 78, 1,
+ 4, 92, 95, 83, 80, 1, 4, 95, 85, 72, 83, 1, 6, 85, 95, 92, 91, 88, 87, 1,
+ 6, 24, 26, 28, 30, 32, 35, 1, 4, 36, 39, 26, 24, 1, 4, 39, 40, 28, 26, 1,
+ 4, 40, 42, 30, 28, 1, 4, 42, 44, 32, 30, 1, 4, 44, 47, 35, 32, 1, 4, 47,
+ 36, 24, 35, 1, 6, 36, 47, 44, 42, 40, 39, 1, 6, 1, 2, 4, 6, 8, 11, 1,
+ 4, 13, 15, 2, 1, 1, 4, 15, 16, 4, 2, 1, 4, 16, 19, 6, 4, 1, 4, 19,
+ 20, 8, 6, 1, 4, 20, 23, 11, 8, 1, 4, 23, 13, 1, 11, 1, 6, 13, 23, 20,
+ 19, 16, 15, 1, 6, 240, 243, 244, 247, 249, 250, 1, 4, 252, 255, 243, 240, 1, 4, 255,
+ 256, 244, 243, 1, 4, 256, 259, 247, 244, 1, 4, 259, 261, 249, 247, 1, 4, 261, 263, 250,
+ 249, 1, 4, 263, 252, 240, 250, 1, 6, 252, 263, 261, 259, 256, 255, 1, 6, 265, 266, 269,
+ 270, 272, 274, 1, 4, 276, 278, 266, 265, 1, 4, 278, 280, 269, 266, 1, 4, 280, 282, 270,
+ 269, 1, 4, 282, 284, 272, 270, 1, 4, 284, 287, 274, 272, 1, 4, 287, 276, 265, 274, 1,
+ 6, 276, 287, 284, 282, 280, 278, 1, 6, 192, 195, 197, 198, 200, 203, 1, 4, 204, 207, 195,
+ 192, 1, 4, 207, 209, 197, 195, 1, 4, 209, 211, 198, 197, 1, 4, 211, 212, 200, 198, 1,
+ 4, 212, 215, 203, 200, 1, 4, 215, 204, 192, 203, 1, 6, 204, 215, 212, 211, 209, 207, 1,
+ 6, 217, 218, 220, 222, 224, 226, 1, 4, 228, 230, 218, 217, 1, 4, 230, 233, 220, 218, 1,
+ 4, 233, 234, 222, 220, 1, 4, 234, 237, 224, 222, 1, 4, 237, 238, 226, 224, 1, 4, 238,
+ 228, 217, 226, 1, 6, 228, 238, 237, 234, 233, 230, 1, 6, 144, 146, 149, 151, 153, 154, 1,
+ 4, 156, 159, 146, 144, 1, 4, 159, 160, 149, 146, 1, 4, 160, 163, 151, 149, 1, 4, 163,
+ 164, 153, 151, 1, 4, 164, 166, 154, 153, 1, 4, 166, 156, 144, 154, 1, 6, 156, 166, 164,
+ 163, 160, 159, 1, 6, 168, 170, 172, 175, 176, 179, 1, 4, 180, 183, 170, 168, 1, 4, 183,
+ 185, 172, 170, 1, 4, 185, 186, 175, 172, 1, 4, 186, 188, 176, 175, 1, 4, 188, 191, 179,
+ 176, 1, 4, 191, 180, 168, 179, 1, 6, 180, 191, 188, 186, 185, 183, 1, 6, 97, 99, 100,
+ 102, 104, 107, 1, 4, 108, 111, 99, 97, 1, 4, 111, 113, 100, 99, 1, 4, 113, 115, 102,
+ 100, 1, 4, 115, 117, 104, 102, 1, 4, 117, 119, 107, 104, 1, 4, 119, 108, 97, 107, 1,
+ 6, 108, 119, 117, 115, 113, 111, 1, 6, 121, 123, 124, 127, 129, 130, 1, 4, 132, 135, 123,
+ 121, 1, 4, 135, 137, 124, 123, 1, 4, 137, 138, 127, 124, 1, 4, 138, 140, 129, 127, 1,
+ 4, 140, 142, 130, 129, 1, 4, 142, 132, 121, 130, 1, 6, 132, 142, 140, 138, 137, 135, 1,
+ 6, 49, 51, 52, 55, 57, 59, 1, 4, 60, 63, 51, 49, 1, 4, 63, 65, 52, 51, 1,
+ 4, 65, 66, 55, 52, 1, 4, 66, 69, 57, 55, 1, 4, 69, 71, 59, 57, 1, 4, 71,
+ 60, 49, 59, 1, 6, 60, 71, 69, 66, 65, 63, 1, 6, 73, 74, 76, 79, 81, 82, 1,
+ 4, 84, 86, 74, 73, 1, 4, 86, 89, 76, 74, 1, 4, 89, 90, 79, 76, 1, 4, 90,
+ 93, 81, 79, 1, 4, 93, 94, 82, 81, 1, 4, 94, 84, 73, 82, 1, 6, 84, 94, 93,
+ 90, 89, 86, 1, 6, 25, 27, 29, 31, 33, 34, 1, 4, 37, 38, 27, 25, 1, 4, 38,
+ 41, 29, 27, 1, 4, 41, 43, 31, 29, 1, 4, 43, 45, 33, 31, 1, 4, 45, 46, 34,
+ 33, 1, 4, 46, 37, 25, 34, 1, 6, 37, 46, 45, 43, 41, 38, 1, 6, 0, 3, 5,
+ 7, 9, 10, 1, 4, 12, 14, 3, 0, 1, 4, 14, 17, 5, 3, 1, 4, 17, 18, 7,
+ 5, 1, 4, 18, 21, 9, 7, 1, 4, 21, 22, 10, 9, 1, 4, 22, 12, 0, 10, 1,
+ 6, 12, 22, 21, 18, 17, 14, 1,
+ 0
+};
+
+struct lwo LWO_ElbowBolts =
+{
+ 288, /* number of points */
+ ElbowBolts_PNTS, ElbowBolts_normals, ElbowBolts_POLS, 0L
+};
+
+static const GLfloat ElbowCoins_PNTS[] =
+{
+ 0, -0.52, -0.5,
+ 0.097545, -0.52, -0.490393,
+ 0.191342, -0.52, -0.46194,
+ 0.277785, -0.52, -0.415735,
+ 0.353553, -0.52, -0.353553,
+ 0.415735, -0.52, -0.277785,
+ 0.46194, -0.52, -0.191342,
+ 0.490393, -0.52, -0.097545,
+ 0.5, -0.52, 0,
+ 0.490393, -0.52, 0.097545,
+ 0.46194, -0.52, 0.191342,
+ 0.415735, -0.52, 0.277785,
+ 0.353553, -0.52, 0.353553,
+ 0.277785, -0.52, 0.415735,
+ 0.191342, -0.52, 0.46194,
+ 0.097545, -0.52, 0.490393,
+ 0, -0.52, 0.5,
+ -0.097545, -0.52, 0.490393,
+ -0.191342, -0.52, 0.46194,
+ -0.277785, -0.52, 0.415735,
+ -0.353553, -0.52, 0.353553,
+ -0.415735, -0.52, 0.277785,
+ -0.46194, -0.52, 0.191342,
+ -0.490393, -0.52, 0.097545,
+ -0.5, -0.52, 0,
+ -0.490393, -0.52, -0.097545,
+ -0.46194, -0.52, -0.191342,
+ -0.415735, -0.52, -0.277785,
+ -0.353553, -0.52, -0.353553,
+ -0.277785, -0.52, -0.415735,
+ -0.191342, -0.52, -0.46194,
+ -0.097545, -0.52, -0.490393,
+ 0, -0.6, -0.5,
+ 0.097545, -0.6, -0.490393,
+ 0.191342, -0.6, -0.46194,
+ 0.277785, -0.6, -0.415735,
+ 0.353553, -0.6, -0.353553,
+ 0.415735, -0.6, -0.277785,
+ 0.46194, -0.6, -0.191342,
+ 0.490393, -0.6, -0.097545,
+ 0.5, -0.6, 0,
+ 0.490393, -0.6, 0.097545,
+ 0.46194, -0.6, 0.191342,
+ 0.415735, -0.6, 0.277785,
+ 0.353553, -0.6, 0.353553,
+ 0.277785, -0.6, 0.415735,
+ 0.191342, -0.6, 0.46194,
+ 0.097545, -0.6, 0.490393,
+ 0, -0.6, 0.5,
+ -0.097545, -0.6, 0.490393,
+ -0.191342, -0.6, 0.46194,
+ -0.277785, -0.6, 0.415735,
+ -0.353553, -0.6, 0.353553,
+ -0.415735, -0.6, 0.277785,
+ -0.46194, -0.6, 0.191342,
+ -0.490393, -0.6, 0.097545,
+ -0.5, -0.6, 0,
+ -0.490393, -0.6, -0.097545,
+ -0.46194, -0.6, -0.191342,
+ -0.415735, -0.6, -0.277785,
+ -0.353553, -0.6, -0.353553,
+ -0.277785, -0.6, -0.415735,
+ -0.191342, -0.6, -0.46194,
+ -0.097545, -0.6, -0.490393,
+ 0, 0.5, -0.52,
+ 0.097545, 0.490393, -0.52,
+ 0.191342, 0.46194, -0.52,
+ 0.277785, 0.415735, -0.52,
+ 0.353553, 0.353553, -0.52,
+ 0.415735, 0.277785, -0.52,
+ 0.46194, 0.191342, -0.52,
+ 0.490393, 0.097545, -0.52,
+ 0.5, 0, -0.52,
+ 0.490393, -0.097545, -0.52,
+ 0.46194, -0.191342, -0.52,
+ 0.415735, -0.277785, -0.52,
+ 0.353553, -0.353553, -0.52,
+ 0.277785, -0.415735, -0.52,
+ 0.191342, -0.46194, -0.52,
+ 0.097545, -0.490393, -0.52,
+ 0, -0.5, -0.52,
+ -0.097545, -0.490393, -0.52,
+ -0.191342, -0.46194, -0.52,
+ -0.277785, -0.415735, -0.52,
+ -0.353553, -0.353553, -0.52,
+ -0.415735, -0.277785, -0.52,
+ -0.46194, -0.191342, -0.52,
+ -0.490393, -0.097545, -0.52,
+ -0.5, 0, -0.52,
+ -0.490393, 0.097545, -0.52,
+ -0.46194, 0.191342, -0.52,
+ -0.415735, 0.277785, -0.52,
+ -0.353553, 0.353553, -0.52,
+ -0.277785, 0.415735, -0.52,
+ -0.191342, 0.46194, -0.52,
+ -0.097545, 0.490393, -0.52,
+ 0, 0.5, -0.6,
+ 0.097545, 0.490393, -0.6,
+ 0.191342, 0.46194, -0.6,
+ 0.277785, 0.415735, -0.6,
+ 0.353553, 0.353553, -0.6,
+ 0.415735, 0.277785, -0.6,
+ 0.46194, 0.191342, -0.6,
+ 0.490393, 0.097545, -0.6,
+ 0.5, 0, -0.6,
+ 0.490393, -0.097545, -0.6,
+ 0.46194, -0.191342, -0.6,
+ 0.415735, -0.277785, -0.6,
+ 0.353553, -0.353553, -0.6,
+ 0.277785, -0.415735, -0.6,
+ 0.191342, -0.46194, -0.6,
+ 0.097545, -0.490393, -0.6,
+ 0, -0.5, -0.6,
+ -0.097545, -0.490393, -0.6,
+ -0.191342, -0.46194, -0.6,
+ -0.277785, -0.415735, -0.6,
+ -0.353553, -0.353553, -0.6,
+ -0.415735, -0.277785, -0.6,
+ -0.46194, -0.191342, -0.6,
+ -0.490393, -0.097545, -0.6,
+ -0.5, 0, -0.6,
+ -0.490393, 0.097545, -0.6,
+ -0.46194, 0.191342, -0.6,
+ -0.415735, 0.277785, -0.6,
+ -0.353553, 0.353553, -0.6,
+ -0.277785, 0.415735, -0.6,
+ -0.191342, 0.46194, -0.6,
+ -0.097545, 0.490393, -0.6,
+};
+
+static const GLfloat ElbowCoins_normals[] =
+{
+ 0, 0, 1,
+ 0.098017, 0.995185, 0,
+ 0.290285, 0.95694, 0,
+ 0.471397, 0.881921, 0,
+ 0.634393, 0.77301, 0,
+ 0.77301, 0.634393, 0,
+ 0.881921, 0.471397, 0,
+ 0.95694, 0.290285, 0,
+ 0.995185, 0.098017, 0,
+ 0.995185, -0.098017, 0,
+ 0.95694, -0.290285, 0,
+ 0.881921, -0.471397, 0,
+ 0.77301, -0.634393, 0,
+ 0.634393, -0.77301, 0,
+ 0.471397, -0.881921, 0,
+ 0.290285, -0.95694, 0,
+ 0.098017, -0.995185, 0,
+ -0.098017, -0.995185, 0,
+ -0.290285, -0.95694, 0,
+ -0.471397, -0.881921, 0,
+ -0.634393, -0.77301, 0,
+ -0.77301, -0.634393, 0,
+ -0.881921, -0.471397, 0,
+ -0.95694, -0.290285, 0,
+ -0.995185, -0.098017, 0,
+ -0.995185, 0.098017, 0,
+ -0.95694, 0.290285, 0,
+ -0.881921, 0.471397, 0,
+ -0.77301, 0.634393, 0,
+ -0.634393, 0.77301, 0,
+ -0.471397, 0.881921, 0,
+ -0.290285, 0.95694, 0,
+ -0.098017, 0.995185, 0,
+ 0, 0, -1,
+ 0, 1, 0,
+ 0.098017, 0, -0.995185,
+ 0.290285, 0, -0.95694,
+ 0.471397, 0, -0.881921,
+ 0.634393, 0, -0.77301,
+ 0.77301, 0, -0.634393,
+ 0.881921, 0, -0.471397,
+ 0.95694, 0, -0.290285,
+ 0.995185, 0, -0.098017,
+ 0.995185, 0, 0.098017,
+ 0.95694, 0, 0.290285,
+ 0.881921, 0, 0.471397,
+ 0.77301, 0, 0.634393,
+ 0.634393, 0, 0.77301,
+ 0.471397, 0, 0.881921,
+ 0.290285, 0, 0.95694,
+ 0.098017, 0, 0.995185,
+ -0.098017, 0, 0.995185,
+ -0.290285, 0, 0.95694,
+ -0.471397, 0, 0.881921,
+ -0.634393, 0, 0.77301,
+ -0.77301, 0, 0.634393,
+ -0.881921, 0, 0.471397,
+ -0.95694, 0, 0.290285,
+ -0.995185, 0, 0.098017,
+ -0.995185, 0, -0.098017,
+ -0.95694, 0, -0.290285,
+ -0.881921, 0, -0.471397,
+ -0.77301, 0, -0.634393,
+ -0.634393, 0, -0.77301,
+ -0.471397, 0, -0.881921,
+ -0.290285, 0, -0.95694,
+ -0.098017, 0, -0.995185,
+ 0, -1, 0,
+};
+
+static const unsigned short int ElbowCoins_POLS[] =
+{
+ 32, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1, 4, 96, 97, 65, 64, 1,
+ 4, 97, 98, 66, 65, 1, 4, 98, 99, 67, 66, 1, 4, 99, 100, 68, 67, 1, 4, 100,
+ 101, 69, 68, 1, 4, 101, 102, 70, 69, 1, 4, 102, 103, 71, 70, 1, 4, 103, 104, 72,
+71, 1, 4, 104, 105, 73, 72, 1, 4, 105, 106, 74, 73, 1, 4, 106, 107, 75, 74, 1,
+ 4, 107, 108, 76, 75, 1, 4, 108, 109, 77, 76, 1, 4, 109, 110, 78, 77, 1, 4, 110,
+ 111, 79, 78, 1, 4, 111, 112, 80, 79, 1, 4, 112, 113, 81, 80, 1, 4, 113, 114, 82,
+81, 1, 4, 114, 115, 83, 82, 1, 4, 115, 116, 84, 83, 1, 4, 116, 117, 85, 84, 1,
+ 4, 117, 118, 86, 85, 1, 4, 118, 119, 87, 86, 1, 4, 119, 120, 88, 87, 1, 4, 120,
+ 121, 89, 88, 1, 4, 121, 122, 90, 89, 1, 4, 122, 123, 91, 90, 1, 4, 123, 124, 92,
+91, 1, 4, 124, 125, 93, 92, 1, 4, 125, 126, 94, 93, 1, 4, 126, 127, 95, 94, 1,
+ 4, 127, 96, 64, 95, 1, 32, 96, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116,
+ 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 1,
+ 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 1, 4, 32, 33, 1, 0, 1,
+ 4, 33, 34, 2, 1, 1, 4, 34, 35, 3, 2, 1, 4, 35, 36, 4, 3, 1, 4, 36,
+ 37, 5, 4, 1, 4, 37, 38, 6, 5, 1, 4, 38, 39, 7, 6, 1, 4, 39, 40, 8,
+ 7, 1, 4, 40, 41, 9, 8, 1, 4, 41, 42, 10, 9, 1, 4, 42, 43, 11, 10, 1,
+ 4, 43, 44, 12, 11, 1, 4, 44, 45, 13, 12, 1, 4, 45, 46, 14, 13, 1, 4, 46,
+ 47, 15, 14, 1, 4, 47, 48, 16, 15, 1, 4, 48, 49, 17, 16, 1, 4, 49, 50, 18,
+ 17, 1, 4, 50, 51, 19, 18, 1, 4, 51, 52, 20, 19, 1, 4, 52, 53, 21, 20, 1,
+ 4, 53, 54, 22, 21, 1, 4, 54, 55, 23, 22, 1, 4, 55, 56, 24, 23, 1, 4, 56,
+ 57, 25, 24, 1, 4, 57, 58, 26, 25, 1, 4, 58, 59, 27, 26, 1, 4, 59, 60, 28,
+ 27, 1, 4, 60, 61, 29, 28, 1, 4, 61, 62, 30, 29, 1, 4, 62, 63, 31, 30, 1,
+ 4, 63, 32, 0, 31, 1, 32, 32, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52,
+51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 1,
+ 0
+};
+
+struct lwo LWO_ElbowCoins =
+{
+ 128, /* number of points */
+ ElbowCoins_PNTS, ElbowCoins_normals, ElbowCoins_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of pipeobjs.c */
diff --git a/hacks/glx/pipes.c b/hacks/glx/pipes.c
new file mode 100644
index 0000000..24f9a2a
--- /dev/null
+++ b/hacks/glx/pipes.c
@@ -0,0 +1,1220 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* pipes --- 3D selfbuiding pipe system */
+
+#if 0
+static const char sccsid[] = "@(#)pipes.c 4.07 97/11/24 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * This program was inspired on a WindowsNT(R)'s screen saver. It was written
+ * from scratch and it was not based on any other source code.
+ *
+ * ==========================================================================
+ * The routine myElbow is derivated from the doughnut routine from the MesaGL
+ * library (more especifically the Mesaaux library) written by Brian Paul.
+ * ==========================================================================
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ * Marcelo F. Vianna (Apr-09-1997)
+ *
+ * Revision History:
+ * 24-Jun-12: Eliminate single-buffer dependency.
+ * 29-Apr-97: Factory equipment by Ed Mackey. Productive day today, eh?
+ * 29-Apr-97: Less tight turns Jeff Epler <jepler@inetnebr.com>
+ * 29-Apr-97: Efficiency speed-ups by Marcelo F. Vianna
+ */
+
+/* This program was originally written to be single-buffered: it kept
+ building up new objects in the front buffer by never clearing the
+ depth or color buffers at the end of each frame. In that way, it
+ was drawing a very small number of polygons per frame. However,
+ modern systems make it difficult to live in a single-buffered world
+ like that. So I changed it to re-generate the scene at every
+ frame, which makes it vastly less efficient, but also, makes it
+ work right on modern hardware. It generates the entire system up
+ front, putting each "frame" of the animation into its own display
+ list; then it draws successively more of those display lists each
+ time the redisplay method is called. When it reaches the end,
+ it regenerates a new system and re-populates the existing display
+ lists. -- jwz.
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 2 \n" \
+ "*cycles: 5 \n" \
+ "*size: 500 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_pipes 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "sphere.h"
+#include "buildlwo.h"
+#include "teapot.h"
+#include "gltrackball.h"
+
+#define DEF_FACTORY "2"
+#define DEF_FISHEYE "True"
+#define DEF_TIGHTTURNS "False"
+#define DEF_ROTATEPIPES "True"
+#define NofSysTypes 3
+
+static int factory;
+static Bool fisheye, tightturns, rotatepipes;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-factory", ".pipes.factory", XrmoptionSepArg, 0},
+ {"-fisheye", ".pipes.fisheye", XrmoptionNoArg, "on"},
+ {"+fisheye", ".pipes.fisheye", XrmoptionNoArg, "off"},
+ {"-tightturns", ".pipes.tightturns", XrmoptionNoArg, "on"},
+ {"+tightturns", ".pipes.tightturns", XrmoptionNoArg, "off"},
+ {"-rotatepipes", ".pipes.rotatepipes", XrmoptionNoArg, "on"},
+ {"+rotatepipes", ".pipes.rotatepipes", XrmoptionNoArg, "off"},
+};
+static argtype vars[] =
+{
+ {&factory, "factory", "Factory", DEF_FACTORY, t_Int},
+ {&fisheye, "fisheye", "Fisheye", DEF_FISHEYE, t_Bool},
+ {&tightturns, "tightturns", "Tightturns", DEF_TIGHTTURNS, t_Bool},
+ {&rotatepipes, "rotatepipes", "Rotatepipes", DEF_ROTATEPIPES, t_Bool},
+};
+static OptionStruct desc[] =
+{
+ {"-factory num", "how much extra equipment in pipes (0 for none)"},
+ {"-/+fisheye", "turn on/off zoomed-in view of pipes"},
+ {"-/+tightturns", "turn on/off tight turns"},
+ {"-/+rotatepipes", "turn on/off pipe system rotation per screenful"},
+};
+
+ENTRYPOINT ModeSpecOpt pipes_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct pipes_description =
+{"pipes", "init_pipes", "draw_pipes", NULL,
+ "draw_pipes",
+ "change_pipes", "free_pipes", &pipes_opts,
+ 1000, 2, 5, 500, 4, 1.0, "",
+ "Shows a selfbuilding pipe system", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.1
+
+#define one_third 0.3333333333333333333
+
+#define dirNone -1
+#define dirUP 0
+#define dirDOWN 1
+#define dirLEFT 2
+#define dirRIGHT 3
+#define dirNEAR 4
+#define dirFAR 5
+
+#define HCELLS 33
+#define VCELLS 25
+#define DEFINEDCOLORS 7
+#define elbowradius 0.5
+
+/*************************************************************************/
+
+typedef struct {
+ int flip;
+
+ int Cells[HCELLS][VCELLS][HCELLS];
+ int usedcolors[DEFINEDCOLORS];
+ int directions[6];
+ int ndirections;
+ int nowdir, olddir;
+ int system_number;
+ int counter;
+ int PX, PY, PZ;
+ int number_of_systems;
+ int system_type;
+ int system_length;
+ int turncounter;
+ Window window;
+ const float *system_color;
+ GLfloat initial_rotation;
+ GLuint valve, bolts, betweenbolts, elbowbolts, elbowcoins;
+ GLuint guagehead, guageface, guagedial, guageconnector, teapot;
+ int teapot_polys;
+ GLXContext *glx_context;
+
+ Bool button_down_p;
+ trackball_state *trackball;
+ GLuint *dlists, *poly_counts;
+ int dlist_count, dlist_size;
+ int system_index, system_size;
+
+ int fadeout;
+
+} pipesstruct;
+
+extern struct lwo LWO_BigValve, LWO_PipeBetweenBolts, LWO_Bolts3D;
+extern struct lwo LWO_GuageHead, LWO_GuageFace, LWO_GuageDial, LWO_GuageConnector;
+extern struct lwo LWO_ElbowBolts, LWO_ElbowCoins;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient0[] = {0.4, 0.4, 0.4, 1.0};
+static const float diffuse0[] = {1.0, 1.0, 1.0, 1.0};
+static const float ambient1[] = {0.2, 0.2, 0.2, 1.0};
+static const float diffuse1[] = {0.5, 0.5, 0.5, 1.0};
+static const float position0[] = {1.0, 1.0, 1.0, 0.0};
+static const float position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialRed[] = {0.7, 0.0, 0.0, 1.0};
+static const float MaterialGreen[] = {0.1, 0.5, 0.2, 1.0};
+static const float MaterialBlue[] = {0.0, 0.0, 0.7, 1.0};
+static const float MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};
+static const float MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};
+static const float MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};
+static const float MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
+static const float MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+
+static pipesstruct *pipes = NULL;
+
+
+static void
+MakeTube(ModeInfo *mi, int direction)
+{
+ Bool wire = MI_IS_WIREFRAME(mi);
+ float an;
+ float SINan_3, COSan_3;
+ int facets = (wire ? 5 : 24);
+
+ /*dirUP = 00000000 */
+ /*dirDOWN = 00000001 */
+ /*dirLEFT = 00000010 */
+ /*dirRIGHT = 00000011 */
+ /*dirNEAR = 00000100 */
+ /*dirFAR = 00000101 */
+
+ if (!(direction & 4)) {
+ glRotatef(90.0, (direction & 2) ? 0.0 : 1.0,
+ (direction & 2) ? 1.0 : 0.0, 0.0);
+ }
+ glBegin(wire ? GL_LINE_STRIP : GL_QUAD_STRIP);
+ for (an = 0.0; an <= 2.0 * M_PI; an += M_PI * 2 / facets) {
+ glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0);
+ glVertex3f(COSan_3, SINan_3, one_third);
+ glVertex3f(COSan_3, SINan_3, -one_third);
+ mi->polygon_count++;
+ }
+ glEnd();
+}
+
+static void
+mySphere(float radius, Bool wire)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ quadObj = gluNewQuadric();
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, wire);
+ glPopMatrix();
+#endif
+}
+
+static void
+myElbow(ModeInfo * mi, int bolted)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ int nsides = (wire ? 6 : 25);
+ int rings = nsides;
+#define r one_third
+#define R one_third
+
+ int i, j;
+ GLfloat p0[3], p1[3], p2[3], p3[3];
+ GLfloat n0[3], n1[3], n2[3], n3[3];
+ GLfloat COSphi, COSphi1, COStheta, COStheta1;
+ GLfloat _SINtheta, _SINtheta1;
+
+ for (i = 0; i <= rings / 4; i++) {
+ GLfloat theta, theta1;
+
+ theta = (GLfloat) i *2.0 * M_PI / rings;
+
+ theta1 = (GLfloat) (i + 1) * 2.0 * M_PI / rings;
+ for (j = 0; j < nsides; j++) {
+ GLfloat phi, phi1;
+
+ phi = (GLfloat) j *2.0 * M_PI / nsides;
+
+ phi1 = (GLfloat) (j + 1) * 2.0 * M_PI / nsides;
+
+ p0[0] = (COStheta = cos(theta)) * (R + r * (COSphi = cos(phi)));
+ p0[1] = (_SINtheta = -sin(theta)) * (R + r * COSphi);
+
+ p1[0] = (COStheta1 = cos(theta1)) * (R + r * COSphi);
+ p1[1] = (_SINtheta1 = -sin(theta1)) * (R + r * COSphi);
+
+ p2[0] = COStheta1 * (R + r * (COSphi1 = cos(phi1)));
+ p2[1] = _SINtheta1 * (R + r * COSphi1);
+
+ p3[0] = COStheta * (R + r * COSphi1);
+ p3[1] = _SINtheta * (R + r * COSphi1);
+
+ n0[0] = COStheta * COSphi;
+ n0[1] = _SINtheta * COSphi;
+
+ n1[0] = COStheta1 * COSphi;
+ n1[1] = _SINtheta1 * COSphi;
+
+ n2[0] = COStheta1 * COSphi1;
+ n2[1] = _SINtheta1 * COSphi1;
+
+ n3[0] = COStheta * COSphi1;
+ n3[1] = _SINtheta * COSphi1;
+
+ p0[2] = p1[2] = r * (n0[2] = n1[2] = sin(phi));
+ p2[2] = p3[2] = r * (n2[2] = n3[2] = sin(phi1));
+
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3fv(n3);
+ glVertex3fv(p3);
+ glNormal3fv(n2);
+ glVertex3fv(p2);
+ glNormal3fv(n1);
+ glVertex3fv(p1);
+ glNormal3fv(n0);
+ glVertex3fv(p0);
+ mi->polygon_count++;
+ glEnd();
+ }
+ }
+
+ if (factory > 0 && bolted) {
+ /* Bolt the elbow onto the pipe system */
+ glFrontFace(GL_CW);
+ glPushMatrix();
+ glRotatef(90.0, 0.0, 0.0, -1.0);
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ glTranslatef(0.0, one_third, one_third);
+ glCallList(pp->elbowcoins);
+ mi->polygon_count += LWO_ElbowCoins.num_pnts/3;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+ glCallList(pp->elbowbolts);
+ mi->polygon_count += LWO_ElbowBolts.num_pnts/3;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+ glPopMatrix();
+ glFrontFace(GL_CCW);
+ }
+#undef r
+#undef R
+#undef nsides
+#undef rings
+}
+
+static void
+FindNeighbors(ModeInfo * mi)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+ pp->ndirections = 0;
+ pp->directions[dirUP] = (!pp->Cells[pp->PX][pp->PY + 1][pp->PZ]) ? 1 : 0;
+ pp->ndirections += pp->directions[dirUP];
+ pp->directions[dirDOWN] = (!pp->Cells[pp->PX][pp->PY - 1][pp->PZ]) ? 1 : 0;
+ pp->ndirections += pp->directions[dirDOWN];
+ pp->directions[dirLEFT] = (!pp->Cells[pp->PX - 1][pp->PY][pp->PZ]) ? 1 : 0;
+ pp->ndirections += pp->directions[dirLEFT];
+ pp->directions[dirRIGHT] = (!pp->Cells[pp->PX + 1][pp->PY][pp->PZ]) ? 1 : 0;
+ pp->ndirections += pp->directions[dirRIGHT];
+ pp->directions[dirFAR] = (!pp->Cells[pp->PX][pp->PY][pp->PZ - 1]) ? 1 : 0;
+ pp->ndirections += pp->directions[dirFAR];
+ pp->directions[dirNEAR] = (!pp->Cells[pp->PX][pp->PY][pp->PZ + 1]) ? 1 : 0;
+ pp->ndirections += pp->directions[dirNEAR];
+}
+
+static int
+SelectNeighbor(ModeInfo * mi)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ int dirlist[6];
+ int i, j;
+
+ for (i = 0, j = 0; i < 6; i++) {
+ if (pp->directions[i]) {
+ dirlist[j] = i;
+ j++;
+ }
+ }
+
+ return dirlist[NRAND(pp->ndirections)];
+}
+
+static void
+MakeValve(ModeInfo * mi, int newdir)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+ /* There is a glPopMatrix() right after this subroutine returns. */
+ switch (newdir) {
+ case dirUP:
+ case dirDOWN:
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+ glRotatef(NRAND(3) * 90.0, 0.0, 0.0, 1.0);
+ break;
+ case dirLEFT:
+ case dirRIGHT:
+ glRotatef(90.0, 0.0, -1.0, 0.0);
+ glRotatef((NRAND(3) * 90.0) - 90.0, 0.0, 0.0, 1.0);
+ break;
+ case dirNEAR:
+ case dirFAR:
+ glRotatef(NRAND(4) * 90.0, 0.0, 0.0, 1.0);
+ break;
+ }
+ glFrontFace(GL_CW);
+ glCallList(pp->betweenbolts);
+ mi->polygon_count += LWO_PipeBetweenBolts.num_pnts/3;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+ glCallList(pp->bolts);
+ mi->polygon_count += LWO_Bolts3D.num_pnts/3;
+ if (!MI_IS_MONO(mi)) {
+ if (pp->system_color == MaterialRed) {
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialYellow : MaterialBlue);
+ } else if (pp->system_color == MaterialBlue) {
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialRed : MaterialYellow);
+ } else if (pp->system_color == MaterialYellow) {
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialBlue : MaterialRed);
+ } else {
+ switch ((NRAND(3))) {
+ case 0:
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+ break;
+ case 1:
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlue);
+ break;
+ case 2:
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow);
+ }
+ }
+ }
+ glRotatef((GLfloat) (NRAND(90)), 1.0, 0.0, 0.0);
+ glCallList(pp->valve);
+ mi->polygon_count += LWO_BigValve.num_pnts/3;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+ glFrontFace(GL_CCW);
+}
+
+static int
+MakeGuage(ModeInfo * mi, int newdir)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+ /* Can't have a guage on a vertical pipe. */
+ if ((newdir == dirUP) || (newdir == dirDOWN))
+ return (0);
+
+ /* Is there space above this pipe for a guage? */
+ if (!pp->directions[dirUP])
+ return (0);
+
+ /* Yes! Mark the space as used. */
+ pp->Cells[pp->PX][pp->PY + 1][pp->PZ] = 1;
+
+ glFrontFace(GL_CW);
+ glPushMatrix();
+ if ((newdir == dirLEFT) || (newdir == dirRIGHT))
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ glCallList(pp->betweenbolts);
+ mi->polygon_count += LWO_PipeBetweenBolts.num_pnts/3;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+ glCallList(pp->bolts);
+ mi->polygon_count += LWO_Bolts3D.num_pnts/3;
+ glPopMatrix();
+
+ glCallList(pp->guageconnector);
+ mi->polygon_count += LWO_GuageConnector.num_pnts/3;
+ glPushMatrix();
+ glTranslatef(0.0, 1.33333, 0.0);
+ /* Do not change the above to 1 + ONE_THIRD, because */
+ /* the object really is centered on 1.3333300000. */
+ glRotatef(NRAND(270) + 45.0, 0.0, 0.0, -1.0);
+ /* Random rotation for the dial. I love it. */
+ glCallList(pp->guagedial);
+ mi->polygon_count += LWO_GuageDial.num_pnts/3;
+ glPopMatrix();
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+ glCallList(pp->guagehead);
+ mi->polygon_count += LWO_GuageHead.num_pnts/3;
+
+ /* GuageFace is drawn last, in case of low-res depth buffers. */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ glCallList(pp->guageface);
+ mi->polygon_count += LWO_GuageFace.num_pnts/3;
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+ glFrontFace(GL_CCW);
+
+ return (1);
+}
+
+
+static GLuint
+build_teapot(ModeInfo *mi)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ GLuint list = glGenLists(1);
+ if (!list) return 0;
+ glNewList(list, GL_COMPILE);
+ pp->teapot_polys = unit_teapot (12, MI_IS_WIREFRAME(mi));
+ glEndList();
+ return list;
+}
+
+
+static void
+MakeTeapot(ModeInfo * mi, int newdir)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+ switch (newdir) {
+ case dirUP:
+ case dirDOWN:
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+ glRotatef(NRAND(3) * 90.0, 0.0, 0.0, 1.0);
+ break;
+ case dirLEFT:
+ case dirRIGHT:
+ glRotatef(90.0, 0.0, -1.0, 0.0);
+ glRotatef((NRAND(3) * 90.0) - 90.0, 0.0, 0.0, 1.0);
+ break;
+ case dirNEAR:
+ case dirFAR:
+ glRotatef(NRAND(4) * 90.0, 0.0, 0.0, 1.0);
+ break;
+ }
+
+ glCallList(pp->teapot);
+ mi->polygon_count += pp->teapot_polys;
+ glFrontFace(GL_CCW);
+}
+
+
+static void
+MakeShape(ModeInfo * mi, int newdir)
+{
+ int n = NRAND(100);
+ if (n < 50) {
+ if (!MakeGuage(mi, newdir))
+ MakeTube(mi, newdir);
+ } else if (n < 98) {
+ MakeValve(mi, newdir);
+ } else {
+ MakeTeapot(mi,newdir);
+ }
+}
+
+static void
+pinit(ModeInfo * mi, int zera)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ int X, Y, Z;
+
+ if (zera) {
+ pp->system_number = 1;
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ (void) memset(pp->Cells, 0, sizeof (pp->Cells));
+ for (X = 0; X < HCELLS; X++) {
+ for (Y = 0; Y < VCELLS; Y++) {
+ pp->Cells[X][Y][0] = 1;
+ pp->Cells[X][Y][HCELLS - 1] = 1;
+ pp->Cells[0][Y][X] = 1;
+ pp->Cells[HCELLS - 1][Y][X] = 1;
+ }
+ }
+ for (X = 0; X < HCELLS; X++) {
+ for (Z = 0; Z < HCELLS; Z++) {
+ pp->Cells[X][0][Z] = 1;
+ pp->Cells[X][VCELLS - 1][Z] = 1;
+ }
+ }
+ (void) memset(pp->usedcolors, 0, sizeof (pp->usedcolors));
+ }
+ pp->counter = 0;
+ pp->turncounter = 0;
+
+ if (!MI_IS_MONO(mi)) {
+ int collist[DEFINEDCOLORS];
+ int i, j, lower = 1000;
+
+ /* Avoid repeating colors on the same screen unless necessary */
+ for (i = 0; i < DEFINEDCOLORS; i++) {
+ if (lower > pp->usedcolors[i])
+ lower = pp->usedcolors[i];
+ }
+ for (i = 0, j = 0; i < DEFINEDCOLORS; i++) {
+ if (pp->usedcolors[i] == lower) {
+ collist[j] = i;
+ j++;
+ }
+ }
+ i = collist[NRAND(j)];
+ pp->usedcolors[i]++;
+ switch (i) {
+ case 0:
+ pp->system_color = MaterialRed;
+ break;
+ case 1:
+ pp->system_color = MaterialGreen;
+ break;
+ case 2:
+ pp->system_color = MaterialBlue;
+ break;
+ case 3:
+ pp->system_color = MaterialCyan;
+ break;
+ case 4:
+ pp->system_color = MaterialYellow;
+ break;
+ case 5:
+ pp->system_color = MaterialMagenta;
+ break;
+ case 6:
+ pp->system_color = MaterialWhite;
+ break;
+ }
+ } else {
+ pp->system_color = MaterialGray;
+ }
+
+ do {
+ pp->PX = NRAND((HCELLS - 1)) + 1;
+ pp->PY = NRAND((VCELLS - 1)) + 1;
+ pp->PZ = NRAND((HCELLS - 1)) + 1;
+ } while (pp->Cells[pp->PX][pp->PY][pp->PZ] ||
+ (pp->Cells[pp->PX + 1][pp->PY][pp->PZ] && pp->Cells[pp->PX - 1][pp->PY][pp->PZ] &&
+ pp->Cells[pp->PX][pp->PY + 1][pp->PZ] && pp->Cells[pp->PX][pp->PY - 1][pp->PZ] &&
+ pp->Cells[pp->PX][pp->PY][pp->PZ + 1] && pp->Cells[pp->PX][pp->PY][pp->PZ - 1]));
+ pp->Cells[pp->PX][pp->PY][pp->PZ] = 1;
+ pp->olddir = dirNone;
+
+ FindNeighbors(mi);
+
+ pp->nowdir = SelectNeighbor(mi);
+}
+
+
+ENTRYPOINT void
+reshape_pipes(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+ glViewport(0, y, width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ /*glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0); */
+ gluPerspective(65.0, 1/h, 0.1, 20.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT Bool
+pipes_handle_event (ModeInfo *mi, XEvent *event)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, pp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &pp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ pp->fadeout = 100;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+static void generate_system (ModeInfo *);
+
+
+ENTRYPOINT void
+init_pipes (ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ pipesstruct *pp;
+
+ MI_INIT (mi, pipes);
+ pp = &pipes[screen];
+
+ pp->window = MI_WINDOW(mi);
+ if ((pp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_pipes(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ if (rotatepipes)
+ pp->initial_rotation = NRAND(180); /* jwz */
+ else
+ pp->initial_rotation = -10.0;
+ pinit(mi, 1);
+
+ if (factory > 0) {
+ pp->valve = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_BigValve);
+ pp->bolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_Bolts3D);
+ pp->betweenbolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_PipeBetweenBolts);
+
+ pp->elbowbolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_ElbowBolts);
+ pp->elbowcoins = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_ElbowCoins);
+
+ pp->guagehead = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageHead);
+ pp->guageface = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageFace);
+ pp->guagedial = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageDial);
+ pp->guageconnector = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageConnector);
+ pp->teapot = build_teapot(mi);
+ }
+ /* else they are all 0, thanks to calloc(). */
+
+ if (MI_COUNT(mi) < 1 || MI_COUNT(mi) > NofSysTypes + 1) {
+ pp->system_type = NRAND(NofSysTypes) + 1;
+ } else {
+ pp->system_type = MI_COUNT(mi);
+ }
+
+ if (MI_CYCLES(mi) > 0 && MI_CYCLES(mi) < 11) {
+ pp->number_of_systems = MI_CYCLES(mi);
+ } else {
+ pp->number_of_systems = 5;
+ }
+
+ if (MI_SIZE(mi) < 10) {
+ pp->system_length = 10;
+ } else if (MI_SIZE(mi) > 1000) {
+ pp->system_length = 1000;
+ } else {
+ pp->system_length = MI_SIZE(mi);
+ }
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ pp->trackball = gltrackball_init (True);
+ generate_system (mi);
+}
+
+
+static GLuint
+get_dlist (ModeInfo *mi, int i)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ if (i >= pp->dlist_count)
+ {
+ pp->dlist_count++;
+ if (pp->dlist_count >= pp->dlist_size)
+ {
+ int s2 = (pp->dlist_size + 100) * 1.2;
+ pp->dlists = (GLuint *)
+ realloc (pp->dlists, s2 * sizeof(*pp->dlists));
+ if (! pp->dlists) abort();
+ pp->poly_counts = (GLuint *)
+ realloc (pp->poly_counts, s2 * sizeof(*pp->poly_counts));
+ if (! pp->poly_counts) abort();
+ pp->dlist_size = s2;
+ }
+ pp->dlists [i] = glGenLists (1);
+ pp->poly_counts [i] = 0;
+ }
+ return pp->dlists[i];
+}
+
+
+
+static void
+generate_system (ModeInfo * mi)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ int newdir;
+ int OPX, OPY, OPZ;
+
+ Bool reset_p = False;
+
+ pp->system_index = 0;
+ pp->system_size = 0;
+ pinit (mi, 1);
+
+ while (1) {
+ glNewList (get_dlist (mi, pp->system_size++), GL_COMPILE);
+ mi->polygon_count = 0;
+
+ glPushMatrix();
+
+ FindNeighbors(mi);
+
+ if (wire)
+ glColor4fv (pp->system_color);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+
+ /* If it's the begining of a system, draw a sphere */
+ if (pp->olddir == dirNone) {
+ glPushMatrix();
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+ mySphere(0.6, wire);
+ glPopMatrix();
+ }
+ /* Check for stop conditions */
+ if (pp->ndirections == 0 || pp->counter > pp->system_length) {
+ glPushMatrix();
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+ /* Finish the system with another sphere */
+ mySphere(0.6, wire);
+
+ glPopMatrix();
+
+ /* If the maximum number of system was drawn, restart (clearing the screen), */
+ /* else start a new system. */
+ if (++pp->system_number > pp->number_of_systems) {
+ reset_p = True;
+ } else {
+ pinit(mi, 0);
+ }
+
+ goto NEXT;
+ }
+ pp->counter++;
+ pp->turncounter++;
+
+ /* Do will the direction change? if so, determine the new one */
+ newdir = pp->nowdir;
+ if (!pp->directions[newdir]) { /* cannot proceed in the current direction */
+ newdir = SelectNeighbor(mi);
+ } else {
+ if (tightturns) {
+ /* random change (20% chance) */
+ if ((pp->counter > 1) && (NRAND(100) < 20)) {
+ newdir = SelectNeighbor(mi);
+ }
+ } else {
+ /* Chance to turn increases after each length of pipe drawn */
+ if ((pp->counter > 1) && NRAND(50) < NRAND(pp->turncounter + 1)) {
+ newdir = SelectNeighbor(mi);
+ pp->turncounter = 0;
+ }
+ }
+ }
+
+ /* Has the direction changed? */
+ if (newdir == pp->nowdir) {
+ /* If not, draw the cell's center pipe */
+ glPushMatrix();
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+ /* Chance of factory shape here, if enabled. */
+ if ((pp->counter > 1) && (NRAND(100) < factory)) {
+ MakeShape(mi, newdir);
+ } else {
+ MakeTube(mi, newdir);
+ }
+ glPopMatrix();
+ } else {
+ /* If so, draw the cell's center elbow/sphere */
+ int sysT = pp->system_type;
+
+ if (sysT == NofSysTypes + 1) {
+ sysT = ((pp->system_number - 1) % NofSysTypes) + 1;
+ }
+ glPushMatrix();
+
+ switch (sysT) {
+ case 1:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+ mySphere(elbowradius, wire);
+ break;
+ case 2:
+ case 3:
+ switch (pp->nowdir) {
+ case dirUP:
+ switch (newdir) {
+ case dirLEFT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ glRotatef(180.0, 1.0, 0.0, 0.0);
+ break;
+ case dirRIGHT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ glRotatef(180.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ break;
+ case dirFAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ break;
+ case dirNEAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 1.0, 0.0, 0.0);
+ break;
+ }
+ break;
+ case dirDOWN:
+ switch (newdir) {
+ case dirLEFT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ break;
+ case dirRIGHT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ break;
+ case dirFAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(270.0, 0.0, 1.0, 0.0);
+ break;
+ case dirNEAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ break;
+ }
+ break;
+ case dirLEFT:
+ switch (newdir) {
+ case dirUP:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ break;
+ case dirDOWN:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ glRotatef(180.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ break;
+ case dirFAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ break;
+ case dirNEAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ break;
+ }
+ break;
+ case dirRIGHT:
+ switch (newdir) {
+ case dirUP:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ break;
+ case dirDOWN:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+ glRotatef(180.0, 1.0, 0.0, 0.0);
+ break;
+ case dirFAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ break;
+ case dirNEAR:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+ break;
+ }
+ break;
+ case dirNEAR:
+ switch (newdir) {
+ case dirLEFT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ break;
+ case dirRIGHT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ break;
+ case dirUP:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(270.0, 0.0, 1.0, 0.0);
+ break;
+ case dirDOWN:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ break;
+ }
+ break;
+ case dirFAR:
+ switch (newdir) {
+ case dirUP:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ break;
+ case dirDOWN:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 1.0, 0.0, 0.0);
+ break;
+ case dirLEFT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+ break;
+ case dirRIGHT:
+ glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ break;
+ }
+ break;
+ }
+ myElbow(mi, (sysT == 2));
+ break;
+ }
+ glPopMatrix();
+ }
+
+ OPX = pp->PX;
+ OPY = pp->PY;
+ OPZ = pp->PZ;
+ pp->olddir = pp->nowdir;
+ pp->nowdir = newdir;
+ switch (pp->nowdir) {
+ case dirUP:
+ pp->PY++;
+ break;
+ case dirDOWN:
+ pp->PY--;
+ break;
+ case dirLEFT:
+ pp->PX--;
+ break;
+ case dirRIGHT:
+ pp->PX++;
+ break;
+ case dirNEAR:
+ pp->PZ++;
+ break;
+ case dirFAR:
+ pp->PZ--;
+ break;
+ }
+ pp->Cells[pp->PX][pp->PY][pp->PZ] = 1;
+
+ /* Cells'face pipe */
+ glTranslatef(((pp->PX + OPX) / 2.0 - 16) / 3.0 * 4.0, ((pp->PY + OPY) / 2.0 - 12) / 3.0 * 4.0, ((pp->PZ + OPZ) / 2.0 - 16) / 3.0 * 4.0);
+ MakeTube(mi, newdir);
+
+ NEXT:
+ glPopMatrix();
+ glEndList();
+ pp->poly_counts [pp->system_size-1] = mi->polygon_count;
+
+ if (reset_p)
+ break;
+ }
+}
+
+
+ENTRYPOINT void
+draw_pipes (ModeInfo * mi)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ Bool wire = MI_IS_WIREFRAME(mi);
+ int i = 0;
+
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(pp->glx_context));
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glColor3f(1.0, 1.0, 1.0);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse1);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+
+ if (wire)
+ glDisable(GL_LIGHTING);
+ else
+ {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ /* This looks crappy. */
+ /* glEnable(GL_LIGHT1); */
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ }
+
+ glShadeModel(GL_SMOOTH);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ glPushMatrix();
+
+ pp->initial_rotation += 0.02;
+
+ glTranslatef(0.0, 0.0, fisheye ? -3.8 : -4.8);
+
+ gltrackball_rotate (pp->trackball);
+
+ if (rotatepipes)
+ glRotatef(pp->initial_rotation, 0.0, 1.0, 0.0);
+
+ glScalef(Scale4Window, Scale4Window, Scale4Window);
+
+ mi->polygon_count = 0;
+
+ if (pp->fadeout)
+ {
+ GLfloat s = (pp->fadeout * pp->fadeout) / 10000.0;
+ glScalef (s, s, s);
+ glRotatef (90 * (1 - (pp->fadeout/100.0)), 1, 0, 0.1);
+ pp->fadeout -= 4;
+ if (pp->fadeout <= 0)
+ {
+ pp->fadeout = 0;
+ generate_system (mi);
+ }
+ }
+ else if (pp->system_index < pp->system_size)
+ pp->system_index++;
+ else
+ pp->fadeout = 100;
+
+ for (i = 0; i < pp->system_index; i++)
+ {
+ glCallList (pp->dlists[i]);
+ mi->polygon_count += pp->poly_counts[i];
+ }
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(display, window);
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_pipes (ModeInfo * mi)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(pp->glx_context));
+ pinit(mi, 1);
+}
+#endif /* !STANDALONE */
+
+
+ENTRYPOINT void
+free_pipes (ModeInfo * mi)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+ if (pp->glx_context) {
+
+ /* Display lists MUST be freed while their glXContext is current. */
+ glXMakeCurrent(MI_DISPLAY(mi), pp->window, *(pp->glx_context));
+
+ if (pp->valve)
+ glDeleteLists(pp->valve, 1);
+ if (pp->bolts)
+ glDeleteLists(pp->bolts, 1);
+ if (pp->betweenbolts)
+ glDeleteLists(pp->betweenbolts, 1);
+
+ if (pp->elbowbolts)
+ glDeleteLists(pp->elbowbolts, 1);
+ if (pp->elbowcoins)
+ glDeleteLists(pp->elbowcoins, 1);
+
+ if (pp->guagehead)
+ glDeleteLists(pp->guagehead, 1);
+ if (pp->guageface)
+ glDeleteLists(pp->guageface, 1);
+ if (pp->guagedial)
+ glDeleteLists(pp->guagedial, 1);
+ if (pp->guageconnector)
+ glDeleteLists(pp->guageconnector, 1);
+ if (pp->teapot)
+ glDeleteLists(pp->teapot, 1);
+ if (pp->dlists)
+ {
+ int i;
+ for (i = 0; i < pp->dlist_count; i++)
+ glDeleteLists (pp->dlists[i], 1);
+ free (pp->dlists);
+ free (pp->poly_counts);
+ }
+ }
+}
+
+XSCREENSAVER_MODULE ("Pipes", pipes)
+
+#endif
diff --git a/hacks/glx/pipes.man b/hacks/glx/pipes.man
new file mode 100644
index 0000000..b58a511
--- /dev/null
+++ b/hacks/glx/pipes.man
@@ -0,0 +1,85 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+pipes - fill the screen with a plumbing system.
+.SH SYNOPSIS
+.B pipes
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-count 0]
+[-count 1]
+[-cycles \fInumber\fP]
+[-size \fInumber\fP]
+[-factory \fInumber\fP]
+[-delay \fInumber\fP]
+[-no-fisheye]
+[-tightturns]
+[-db]
+[-fps]
+.SH DESCRIPTION
+If you've ever been in the same room as a Windows NT machine, you've
+probably seen this GL hack. It fills the screen with a plumbing system.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count 0
+Curved Pipes.
+.TP 8
+.B \-count 1
+Ball Joints.
+.TP 8
+.B \-cycles \fInumber\fP
+Number of pipe systems to draw at once. Default: 5.
+.TP 8
+.B \-size \fInumber\fP
+Length of each pipe system. Default: 500.
+.TP 8
+.B \-factory \fInumber\fP
+How much gadgetry to create; Useful range is 0-10. Default: 2.
+.TP 8
+.B \-delay \fInumber\fP
+How long (in microseconds) to sleep between frames. Default: 10000.
+.TP 8
+.B \-fisheye | \-no-fisheye
+Whether to use a fisheye lens.
+.TP 8
+.B \-tightturns | \-no-tightturns
+Whether to allow tight turns.
+.TP 8
+.B \-db | \-no-db
+Whether to double-buffer.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Marcelo Vianna.
diff --git a/hacks/glx/polyhedra-gl.c b/hacks/glx/polyhedra-gl.c
new file mode 100644
index 0000000..507d295
--- /dev/null
+++ b/hacks/glx/polyhedra-gl.c
@@ -0,0 +1,683 @@
+/* polyhedra, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Renders 160 different 3D solids, and displays some information about each.
+ * A new solid is chosen every few seconds.
+ *
+ * This file contains the OpenGL side; computation of the polyhedra themselves
+ * is in "polyhedra.c".
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-140-*-*-*-*-*-*\n" \
+ "*titleFont2: -*-helvetica-medium-r-normal-*-*-100-*-*-*-*-*-*\n" \
+ "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n" \
+ "*suppressRotationAnimation: True\n" \
+
+
+# define free_polyhedra 0
+# define release_polyhedra 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_TITLES "True"
+#define DEF_DURATION "12"
+#define DEF_WHICH "random"
+
+#include "texfont.h"
+#include "normals.h"
+#include "polyhedra.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "teapot.h"
+
+#ifndef HAVE_JWXYZ
+# define XK_MISCELLANY
+# include <X11/keysymdef.h>
+#endif
+
+#ifndef HAVE_JWZGLES
+# define HAVE_TESS
+#endif
+
+
+#ifdef USE_GL /* whole file */
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int npolyhedra;
+ polyhedron **polyhedra;
+
+ int which;
+ int change_to;
+ GLuint object_list;
+
+ int mode; /* 0 = normal, 1 = out, 2 = in */
+ int mode_tick;
+
+ int ncolors;
+ XColor *colors;
+
+ texture_font_data *font1_data, *font2_data, *font3_data;
+
+ time_t last_change_time;
+ int change_tick;
+
+} polyhedra_configuration;
+
+static polyhedra_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static Bool do_titles;
+static int duration;
+static int do_which;
+static char *do_which_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-titles", ".titles", XrmoptionNoArg, "True" },
+ { "+titles", ".titles", XrmoptionNoArg, "False" },
+ { "-duration",".duration",XrmoptionSepArg, 0 },
+ { "-which", ".which", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&duration,"duration","Duration",DEF_DURATION,t_Int},
+ {&do_which_str,"which", "Which", DEF_WHICH, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt polyhedra_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Calculate the normals at each vertex of a face, and use the sum to
+ decide which normal to assign to the entire face. This also solves
+ problems caused by nonconvex faces, in most (but not all) cases.
+ */
+static void
+kludge_normal (int n, const int *indices, const point *points)
+{
+ XYZ normal = { 0, 0, 0 };
+ XYZ p = { 0, 0, 0 };
+ int i;
+
+ for (i = 0; i < n; ++i) {
+ int i1 = indices[i];
+ int i2 = indices[(i + 1) % n];
+ int i3 = indices[(i + 2) % n];
+ XYZ p1, p2, p3;
+
+ p1.x = points[i1].x; p1.y = points[i1].y; p1.z = points[i1].z;
+ p2.x = points[i2].x; p2.y = points[i2].y; p2.z = points[i2].z;
+ p3.x = points[i3].x; p3.y = points[i3].y; p3.z = points[i3].z;
+
+ p = calc_normal (p1, p2, p3);
+ normal.x += p.x;
+ normal.y += p.y;
+ normal.z += p.z;
+ }
+
+ /*normalize(&normal);*/
+ if (normal.x == 0 && normal.y == 0 && normal.z == 0) {
+ glNormal3f (p.x, p.y, p.z);
+ } else {
+ glNormal3f (normal.x, normal.y, normal.z);
+ }
+}
+
+
+static void
+load_fonts (ModeInfo *mi)
+{
+ polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
+ bp->font1_data = load_texture_font (mi->dpy, "titleFont");
+ bp->font2_data = load_texture_font (mi->dpy, "titleFont2");
+ bp->font3_data = load_texture_font (mi->dpy, "titleFont3");
+}
+
+
+
+static void
+startup_blurb (ModeInfo *mi)
+{
+ polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
+ const char *s = "Computing polyhedra...";
+ texture_font_data *f = bp->font1_data;
+
+ glColor3f (0.8, 0.8, 0);
+ print_texture_label (mi->dpy, f,
+ mi->xgwa.width, mi->xgwa.height,
+ 0, s);
+ glFinish();
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_polyhedra (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+polyhedra_handle_event (ModeInfo *mi, XEvent *event)
+{
+ polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+ bp->change_to = -1;
+ if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+ bp->change_to = random() % bp->npolyhedra;
+ else if (c == '>' || c == '.' || c == '+' || c == '=' ||
+ keysym == XK_Right || keysym == XK_Up || keysym == XK_Next)
+ bp->change_to = (bp->which + 1) % bp->npolyhedra;
+ else if (c == '<' || c == ',' || c == '-' || c == '_' ||
+ c == '\010' || c == '\177' ||
+ keysym == XK_Left || keysym == XK_Down || keysym == XK_Prior)
+ bp->change_to = (bp->which + bp->npolyhedra - 1) % bp->npolyhedra;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+
+ if (bp->change_to != -1)
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ bp->change_to = random() % bp->npolyhedra;
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+draw_label (ModeInfo *mi)
+{
+ polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
+ polyhedron *p = bp->which >= 0 ? bp->polyhedra[bp->which] : 0;
+ char label[1024];
+ char name2[255];
+ GLfloat color[4] = { 0.8, 0.8, 0.8, 1 };
+ texture_font_data *f;
+
+ if (!p || !do_titles) return;
+
+ strcpy (name2, p->name);
+ if (*p->class)
+ sprintf (name2 + strlen(name2), " (%s)", p->class);
+
+ sprintf (label,
+ "Polyhedron %d: \t%s\n\n"
+ "Wythoff Symbol:\t%s\n"
+ "Vertex Configuration:\t%s\n"
+ "Symmetry Group:\t%s\n"
+ /* "Dual of: \t%s\n" */
+ "\n"
+ "Faces:\t %d\n"
+ "Edges:\t %d\n"
+ "Vertices:\t %d\n"
+ "Density:\t %d\n"
+ "Euler:\t%s%d\n",
+ bp->which, name2, p->wythoff, p->config, p->group,
+ /* p->dual, */
+ p->logical_faces, p->nedges, p->logical_vertices,
+ p->density, (p->chi < 0 ? "" : " "), p->chi);
+
+ if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+ f = bp->font1_data;
+ else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+ f = bp->font2_data; /* small font */
+ else
+ f = bp->font3_data; /* tiny font */
+
+ glColor4fv (color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ print_texture_label (mi->dpy, f,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, label);
+}
+
+
+#ifdef HAVE_TESS
+static void
+tess_error (GLenum errorCode)
+{
+ fprintf (stderr, "%s: tesselation error: %s\n",
+ progname, gluErrorString(errorCode));
+ abort();
+}
+#endif /* HAVE_TESS */
+
+
+static void
+new_polyhedron (ModeInfo *mi)
+{
+ polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
+ polyhedron *p;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ /* Use the GLU polygon tesselator so that nonconvex faces are displayed
+ correctly (e.g., for the "pentagrammic concave deltohedron").
+ */
+# ifdef HAVE_TESS
+ GLUtesselator *tobj = gluNewTess();
+ gluTessCallback (tobj, GLU_TESS_BEGIN, (void (*) (void)) &glBegin);
+ gluTessCallback (tobj, GLU_TESS_END, (void (*) (void)) &glEnd);
+ gluTessCallback (tobj, GLU_TESS_VERTEX, (void (*) (void)) &glVertex3dv);
+ gluTessCallback (tobj, GLU_TESS_ERROR, (void (*) (void)) &tess_error);
+# endif /* HAVE_TESS */
+
+ mi->polygon_count = 0;
+
+ bp->ncolors = 128;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_random_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ True, False, 0, False);
+
+ if (do_which >= bp->npolyhedra)
+ do_which = -1;
+
+ bp->which = (bp->change_to != -1 ? bp->change_to :
+ do_which >= 0 ? do_which :
+ (random() % bp->npolyhedra));
+ bp->change_to = -1;
+ p = bp->polyhedra[bp->which];
+
+ if (wire)
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ glNewList (bp->object_list, GL_COMPILE);
+ if (bp->which == bp->npolyhedra-1)
+ {
+ GLfloat bcolor[4];
+ bcolor[0] = bp->colors[0].red / 65536.0;
+ bcolor[1] = bp->colors[0].green / 65536.0;
+ bcolor[2] = bp->colors[0].blue / 65536.0;
+ bcolor[3] = 1.0;
+ if (wire)
+ glColor3f (0, 1, 0);
+ else
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, bcolor);
+
+ glScalef (0.8, 0.8, 0.8);
+ p->nfaces = unit_teapot (6, wire);
+ p->nedges = p->nfaces * 3 / 2;
+ p->npoints = p->nfaces * 3;
+ p->logical_faces = p->nfaces;
+ p->logical_vertices = p->npoints;
+ }
+ else
+ {
+ glFrontFace (GL_CCW);
+ for (i = 0; i < p->nfaces; i++)
+ {
+ int j;
+ face *f = &p->faces[i];
+
+ if (f->color > 64 || f->color < 0) abort();
+ if (wire)
+ glColor3f (0, 1, 0);
+ else
+ {
+ GLfloat bcolor[4];
+ bcolor[0] = bp->colors[f->color].red / 65536.0;
+ bcolor[1] = bp->colors[f->color].green / 65536.0;
+ bcolor[2] = bp->colors[f->color].blue / 65536.0;
+ bcolor[3] = 1.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, bcolor);
+ }
+
+ kludge_normal (f->npoints, f->points, p->points);
+
+# ifdef HAVE_TESS
+ gluTessBeginPolygon (tobj, 0);
+ gluTessBeginContour (tobj);
+ for (j = 0; j < f->npoints; j++)
+ {
+ point *pp = &p->points[f->points[j]];
+ gluTessVertex (tobj, &pp->x, &pp->x);
+ }
+ gluTessEndContour (tobj);
+ gluTessEndPolygon (tobj);
+# else /* !HAVE_TESS */
+ glBegin (wire ? GL_LINE_LOOP :
+ f->npoints == 3 ? GL_TRIANGLES :
+ f->npoints == 4 ? GL_QUADS :
+ GL_POLYGON);
+ for (j = 0; j < f->npoints; j++)
+ {
+ point *pp = &p->points[f->points[j]];
+ glVertex3f (pp->x, pp->y, pp->z);
+ }
+ glEnd();
+# endif /* !HAVE_TESS */
+ }
+ }
+ glEndList ();
+
+ mi->polygon_count += p->nfaces;
+# ifdef HAVE_TESS
+ gluDeleteTess (tobj);
+# endif
+}
+
+
+static void
+construct_teapot (ModeInfo *mi)
+{
+ polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
+ int n = bp->npolyhedra-1;
+ polyhedron *p = (polyhedron *) calloc (1, sizeof(*p));
+ p->number = n;
+ p->wythoff = strdup("X00398|1984");
+ p->name = strdup("Teapot");
+ p->dual = strdup("");
+ p->config = strdup("Melitta");
+ p->group = strdup("Teapotahedral (Newell[1975])");
+ p->class = strdup("Utah Teapotahedron");
+ bp->polyhedra[n] = p;
+}
+
+
+ENTRYPOINT void
+init_polyhedra (ModeInfo *mi)
+{
+ polyhedra_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ MI_IS_WIREFRAME(mi) = 0;
+ wire = 0;
+# endif
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ bp->which = -1;
+ load_fonts (mi);
+ startup_blurb (mi);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ /* glEnable(GL_CULL_FACE); */
+
+ /* We need two-sided lighting for polyhedra where both sides of
+ a face are simultaneously visible (e.g., the "X-hemi-Y-hedrons".)
+ */
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ double spin_speed = 2.0;
+ double wander_speed = 0.05;
+ double spin_accel = 0.2;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->npolyhedra = construct_polyhedra (&bp->polyhedra);
+ construct_teapot (mi);
+
+ bp->object_list = glGenLists (1);
+ bp->change_to = -1;
+
+ {
+ int x;
+ char c;
+ do_which = -1;
+ if (!strcasecmp (do_which_str, "random"))
+ ;
+ else if (1 == sscanf (do_which_str, " %d %c", &x, &c))
+ {
+ if (x >= 0 && x < bp->npolyhedra)
+ do_which = x;
+ else
+ fprintf (stderr,
+ "%s: polyhedron %d does not exist: there are only %d.\n",
+ progname, x, bp->npolyhedra-1);
+ }
+ else if (*do_which_str)
+ {
+ char *s;
+ for (s = do_which_str; *s; s++)
+ if (*s == '-' || *s == '_') *s = ' ';
+
+ for (x = 0; x < bp->npolyhedra; x++)
+ if (!strcasecmp (do_which_str, bp->polyhedra[x]->name) ||
+ !strcasecmp (do_which_str, bp->polyhedra[x]->class) ||
+ !strcasecmp (do_which_str, bp->polyhedra[x]->wythoff) ||
+ !strcasecmp (do_which_str, bp->polyhedra[x]->config))
+ {
+ do_which = x;
+ break;
+ }
+ if (do_which < 0)
+ {
+ fprintf (stderr, "%s: no such polyhedron: \"%s\"\n",
+ progname, do_which_str);
+ exit (1);
+ }
+ }
+ }
+
+ new_polyhedron (mi);
+ reshape_polyhedra (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+}
+
+
+ENTRYPOINT void
+draw_polyhedra (ModeInfo *mi)
+{
+ polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ if (bp->mode == 0 && do_which >= 0 && bp->change_to < 0)
+ ;
+ else if (bp->mode == 0)
+ {
+ if (bp->change_to >= 0)
+ bp->change_tick = 999, bp->last_change_time = 1;
+ if (bp->change_tick++ > 10)
+ {
+ time_t now = time((time_t *) 0);
+ if (bp->last_change_time == 0) bp->last_change_time = now;
+ bp->change_tick = 0;
+ if (!bp->button_down_p && now - bp->last_change_time >= duration)
+ {
+ bp->mode = 1; /* go out */
+ bp->mode_tick = 20 / speed;
+ bp->last_change_time = now;
+ }
+ }
+ }
+ else if (bp->mode == 1) /* out */
+ {
+ if (--bp->mode_tick <= 0)
+ {
+ new_polyhedron (mi);
+ bp->mode_tick = 20 / speed;
+ bp->mode = 2; /* go in */
+ }
+ }
+ else if (bp->mode == 2) /* in */
+ {
+ if (--bp->mode_tick <= 0)
+ bp->mode = 0; /* normal */
+ }
+ else
+ abort();
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_NORMALIZE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ glScalef (2.0, 2.0, 2.0);
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT_AND_BACK, GL_SHININESS, bshiny);
+
+ if (bp->mode != 0)
+ {
+ GLfloat s = (bp->mode == 1
+ ? bp->mode_tick / (20 / speed)
+ : ((20 / speed) - bp->mode_tick + 1) / (20 / speed));
+ glScalef (s, s, s);
+ }
+
+ glScalef (2, 2, 2);
+ glCallList (bp->object_list);
+ if (bp->mode == 0 && !bp->button_down_p)
+ draw_label (mi); /* print_texture_font can't go inside a display list */
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Polyhedra", polyhedra)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/polyhedra.c b/hacks/glx/polyhedra.c
new file mode 100644
index 0000000..a7699c9
--- /dev/null
+++ b/hacks/glx/polyhedra.c
@@ -0,0 +1,2457 @@
+/*****************************************************************************
+ * #ident "Id: main.c,v 3.27 2002-01-06 16:23:01+02 rl Exp "
+ * kaleido
+ *
+ * Kaleidoscopic construction of uniform polyhedra
+ * Copyright (c) 1991-2002 Dr. Zvi Har'El <rl@math.technion.ac.il>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by
+ * Dr. Zvi Har'El (http://www.math.technion.ac.il/~rl/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the author be held liable for any
+ * damages arising from the use of this software.
+ *
+ * Author:
+ * Dr. Zvi Har'El,
+ * Deptartment of Mathematics,
+ * Technion, Israel Institue of Technology,
+ * Haifa 32000, Israel.
+ * E-Mail: rl@math.technion.ac.il
+ *
+ * ftp://ftp.math.technion.ac.il/kaleido/
+ * http://www.mathconsult.ch/showroom/unipoly/
+ *
+ * Adapted for xscreensaver by Jamie Zawinski <jwz@jwz.org> 25-Apr-2004
+ *
+ *****************************************************************************
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <math.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "polyhedra.h"
+
+extern const char *progname;
+
+#ifndef MAXLONG
+#define MAXLONG 0x7FFFFFFF
+#endif
+#ifndef MAXDIGITS
+#define MAXDIGITS 10 /* (int)log10((double)MAXLONG) + 1 */
+#endif
+
+#ifndef DBL_EPSILON
+#define DBL_EPSILON 2.2204460492503131e-16
+#endif
+#define BIG_EPSILON 3e-2
+#define AZ M_PI/7 /* axis azimuth */
+#define EL M_PI/17 /* axis elevation */
+
+#define Err(x) do {\
+ fprintf (stderr, "%s: %s\n", progname, (x)); \
+ exit (1); \
+ } while(0)
+
+#define Free(lvalue) do {\
+ if (lvalue) {\
+ free((char*) lvalue);\
+ lvalue=0;\
+ }\
+ } while(0)
+
+#define Matfree(lvalue,n) do {\
+ if (lvalue) \
+ matfree((char*) lvalue, n);\
+ lvalue=0;\
+ } while(0)
+
+#define Malloc(lvalue,n,type) do {\
+ if (!(lvalue = (type*) calloc((n), sizeof(type)))) \
+ abort();\
+ } while(0)
+
+#define Realloc(lvalue,n,type) do {\
+ if (!(lvalue = (type*) realloc(lvalue, (n) * sizeof(type)))) \
+ abort();\
+ } while(0)
+
+#define Calloc(lvalue,n,type) do {\
+ if (!(lvalue = (type*) calloc(n, sizeof(type))))\
+ abort();\
+ } while(0)
+
+#define Matalloc(lvalue,n,m,type) do {\
+ if (!(lvalue = (type**) matalloc(n, (m) * sizeof(type))))\
+ abort();\
+ } while(0)
+
+#define Sprintfrac(lvalue,x) do {\
+ if (!(lvalue=sprintfrac(x)))\
+ return 0;\
+ } while(0)
+
+#define numerator(x) (frac(x), frax.n)
+#define denominator(x) (frac(x), frax.d)
+#define compl(x) (frac(x), (double) frax.n / (frax.n-frax.d))
+
+typedef struct {
+ double x, y, z;
+} Vector;
+
+typedef struct {
+ /* NOTE: some of the int's can be replaced by short's, char's,
+ or even bit fields, at the expense of readability!!!*/
+ int index; /* index to the standard list, the array uniform[] */
+ int N; /* number of faces types (atmost 5)*/
+ int M; /* vertex valency (may be big for dihedral polyhedra) */
+ int V; /* vertex count */
+ int E; /* edge count */
+ int F; /* face count */
+ int D; /* density */
+ int chi; /* Euler characteristic */
+ int g; /* order of symmetry group */
+ int K; /* symmetry type: D=2, T=3, O=4, I=5 */
+ int hemi;/* flag hemi polyhedron */
+ int onesided;/* flag onesided polyhedron */
+ int even; /* removed face in pqr| */
+ int *Fi; /* face counts by type (array N)*/
+ int *rot; /* vertex configuration (array M of 0..N-1) */
+ int *snub; /* snub triangle configuration (array M of 0..1) */
+ int *firstrot; /* temporary for vertex generation (array V) */
+ int *anti; /* temporary for direction of ideal vertices (array E) */
+ int *ftype; /* face types (array F) */
+ int **e; /* edges (matrix 2 x E of 0..V-1)*/
+ int **dual_e; /* dual edges (matrix 2 x E of 0..F-1)*/
+ int **incid; /* vertex-face incidence (matrix M x V of 0..F-1)*/
+ int **adj; /* vertex-vertex adjacency (matrix M x V of 0..V-1)*/
+ double p[4]; /* p, q and r; |=0 */
+ double minr; /* smallest nonzero inradius */
+ double gon; /* basis type for dihedral polyhedra */
+ double *n; /* number of side of a face of each type (array N) */
+ double *m; /* number of faces at a vertex of each type (array N) */
+ double *gamma; /* fundamental angles in radians (array N) */
+ char *polyform; /* printable Wythoff symbol */
+ char *config; /* printable vertex configuration */
+ char *group; /* printable group name */
+ char *name; /* name, standard or manifuctured */
+ char *dual_name; /* dual name, standard or manifuctured */
+ char *class;
+ char *dual_class;
+ Vector *v; /* vertex coordinates (array V) */
+ Vector *f; /* face coordinates (array F)*/
+} Polyhedron;
+
+typedef struct {
+ long n,d;
+} Fraction;
+
+static Polyhedron *polyalloc(void);
+static Vector rotate(Vector vertex, Vector axis, double angle);
+
+static Vector sum3(Vector a, Vector b, Vector c);
+static Vector scale(double k, Vector a);
+static Vector sum(Vector a, Vector b);
+static Vector diff(Vector a, Vector b);
+static Vector pole (double r, Vector a, Vector b, Vector c);
+static Vector cross(Vector a, Vector b);
+static double dot(Vector a, Vector b);
+static int same(Vector a, Vector b, double epsilon);
+
+static char *sprintfrac(double x);
+
+static void frac(double x);
+static void matfree(void *mat, int rows);
+static void *matalloc(int rows, int row_size);
+
+static Fraction frax;
+
+
+static const struct {
+ char *Wythoff, *name, *dual, *group, *class, *dual_class;
+ short Coxeter, Wenninger;
+} uniform[] = {
+
+ /****************************************************************************
+ * Dihedral Schwarz Triangles (D5 only)
+ ***************************************************************************/
+
+ /* 0 */ {"2 5|2", "Pentagonal Prism",
+ "Pentagonal Dipyramid",
+ "Dihedral (D[1/5])",
+ "",
+ "",
+ 0, 0},
+
+ /* 2 */ {"|2 2 5", "Pentagonal Antiprism",
+ "Pentagonal Deltohedron",
+ "Dihedral (D[1/5])",
+ "",
+ "",
+ 0, 0},
+ /* (2 2 5/2) (D2/5) */
+ /* 4 */ {"2 5/2|2", "Pentagrammic Prism",
+ "Pentagrammic Dipyramid",
+ "Dihedral (D[2/5])",
+ "",
+ "",
+ 0, 0},
+
+ /* 6 */ {"|2 2 5/2", "Pentagrammic Antiprism",
+ "Pentagrammic Deltohedron",
+ "Dihedral (D[2/5])",
+ "",
+ "",
+ 0, 0},
+ /* (5/3 2 2) (D3/5) */
+
+ /* 8 */ {"|2 2 5/3", "Pentagrammic Crossed Antiprism",
+ "Pentagrammic Concave Deltohedron",
+ "Dihedral (D[3/5])",
+ "",
+ "",
+ 0, 0},
+
+ /****************************************************************************
+ * Tetrahedral
+ ***************************************************************************/
+
+ /* (2 3 3) (T1) */
+ /* 10 */ {"3|2 3", "Tetrahedron",
+ "Tetrahedron",
+ "Tetrahedral (T[1])",
+ "Platonic Solid",
+ "Platonic Solid",
+ 15, 1},
+
+ /* 12 */ {"2 3|3", "Truncated Tetrahedron",
+ "Triakistetrahedron",
+ "Tetrahedral (T[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 16, 6},
+ /* (3/2 3 3) (T2) */
+ /* 14 */ {"3/2 3|3", "Octahemioctahedron",
+ "Octahemioctacron",
+ "Tetrahedral (T[2])",
+ "",
+ "",
+ 37, 68},
+
+ /* (3/2 2 3) (T3) */
+ /* 16 */ {"3/2 3|2", "Tetrahemihexahedron",
+ "Tetrahemihexacron",
+ "Tetrahedral (T[3])",
+ "",
+ "",
+ 36, 67},
+
+ /****************************************************************************
+ * Octahedral
+ ***************************************************************************/
+
+ /* (2 3 4) (O1) */
+ /* 18 */ {"4|2 3", "Octahedron",
+ "Cube",
+ "Octahedral (O[1])",
+ "Platonic Solid",
+ "Platonic Solid",
+ 17, 2},
+
+ /* 20 */ {"3|2 4", "Cube",
+ "Octahedron",
+ "Octahedral (O[1])",
+ "Platonic Solid",
+ "Platonic Solid",
+ 18, 3},
+
+ /* 22 */ {"2|3 4", "Cuboctahedron",
+ "Rhombic Dodecahedron",
+ "Octahedral (O[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 19, 11},
+
+ /* 24 */ {"2 4|3", "Truncated Octahedron",
+ "Tetrakishexahedron",
+ "Octahedral (O[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 20, 7},
+
+ /* 26 */ {"2 3|4", "Truncated Cube",
+ "Triakisoctahedron",
+ "Octahedral (O[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 21, 8},
+
+ /* 28 */ {"3 4|2", "Rhombicuboctahedron",
+ "Deltoidal Icositetrahedron",
+ "Octahedral (O[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 22, 13},
+
+ /* 30 */ {"2 3 4|", "Truncated Cuboctahedron",
+ "Disdyakisdodecahedron",
+ "Octahedral (O[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 23, 15},
+
+ /* 32, 33, 66, and 67 are chiral, existing in both left and right handed
+ (enantiomeric) forms, so it would make sense to display both versions.
+ */
+
+ /* 32 */ {"|2 3 4", "Snub Cube",
+ "Pentagonal Icositetrahedron",
+ "Octahedral (O[1]), Chiral",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 24, 17},
+ /* (3/2 4 4) (O2b) */
+
+ /* 34 */ {"3/2 4|4", "Small Cubicuboctahedron",
+ "Small Hexacronic Icositetrahedron",
+ "Octahedral (O[2b])",
+ "",
+ "",
+ 38, 69},
+ /* (4/3 3 4) (O4) */
+
+ /* 36 */ {"3 4|4/3", "Great Cubicuboctahedron",
+ "Great Hexacronic Icositetrahedron",
+ "Octahedral (O[4])",
+ "",
+ "",
+ 50, 77},
+
+ /* 38 */ {"4/3 4|3", "Cubohemioctahedron",
+ "Hexahemioctacron",
+ "Octahedral (O[4])",
+ "",
+ "",
+ 51, 78},
+
+ /* 40 */ {"4/3 3 4|", "Cubitruncated Cuboctahedron",
+ "Tetradyakishexahedron",
+ "Octahedral (O[4])",
+ "",
+ "",
+ 52, 79},
+ /* (3/2 2 4) (O5) */
+
+ /* 42 */ {"3/2 4|2", "Great Rhombicuboctahedron",
+ "Great Deltoidal Icositetrahedron",
+ "Octahedral (O[5])",
+ "",
+ "",
+ 59, 85},
+
+ /* 44 */ {"3/2 2 4|", "Small Rhombihexahedron",
+ "Small Rhombihexacron",
+ "Octahedral (O[5])",
+ "",
+ "",
+ 60, 86},
+ /* (4/3 2 3) (O7) */
+
+ /* 46 */ {"2 3|4/3", "Stellated Truncated Hexahedron",
+ "Great Triakisoctahedron",
+ "Octahedral (O[7])",
+ "",
+ "",
+ 66, 92},
+
+ /* 48 */ {"4/3 2 3|", "Great Truncated Cuboctahedron",
+ "Great Disdyakisdodecahedron",
+ "Octahedral (O[7])",
+ "",
+ "",
+ 67, 93},
+ /* (4/3 3/2 2) (O11) */
+
+ /* 50 */ {"4/3 3/2 2|", "Great Rhombihexahedron",
+ "Great Rhombihexacron",
+ "Octahedral (O[11])",
+ "",
+ "",
+ 82, 103},
+
+ /****************************************************************************
+ * Icosahedral
+ ***************************************************************************/
+
+ /* (2 3 5) (I1) */
+ /* 52 */ {"5|2 3", "Icosahedron",
+ "Dodecahedron",
+ "Icosahedral (I[1])",
+ "Platonic Solid",
+ "Platonic Solid",
+ 25, 4},
+
+ /* 54 */ {"3|2 5", "Dodecahedron",
+ "Icosahedron",
+ "Icosahedral (I[1])",
+ "Platonic Solid",
+ "Platonic Solid",
+ 26, 5},
+
+ /* 56 */ {"2|3 5", "Icosidodecahedron",
+ "Rhombic Triacontahedron",
+ "Icosahedral (I[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 28, 12},
+
+ /* 58 */ {"2 5|3", "Truncated Icosahedron",
+ "Pentakisdodecahedron",
+ "Icosahedral (I[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 27, 9},
+
+ /* 60 */ {"2 3|5", "Truncated Dodecahedron",
+ "Triakisicosahedron",
+ "Icosahedral (I[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 29, 10},
+
+ /* 62 */ {"3 5|2", "Rhombicosidodecahedron",
+ "Deltoidal Hexecontahedron",
+ "Icosahedral (I[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 30, 14},
+
+ /* 64 */ {"2 3 5|", "Truncated Icosidodecahedron",
+ "Disdyakistriacontahedron",
+ "Icosahedral (I[1])",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 31, 16},
+
+ /* 32, 33, 66, and 67 are chiral, existing in both left and right handed
+ (enantiomeric) forms, so it would make sense to display both versions.
+ */
+
+ /* 66 */ {"|2 3 5", "Snub Dodecahedron",
+ "Pentagonal Hexecontahedron",
+ "Icosahedral (I[1]), Chiral",
+ "Archimedean Solid",
+ "Catalan Solid",
+ 32, 18},
+ /* (5/2 3 3) (I2a) */
+
+ /* 68 */ {"3|5/2 3", "Small Ditrigonal Icosidodecahedron",
+ "Small Triambic Icosahedron",
+ "Icosahedral (I[2a])",
+ "",
+ "",
+ 39, 70},
+
+ /* 70 */ {"5/2 3|3", "Small Icosicosidodecahedron",
+ "Small Icosacronic Hexecontahedron",
+ "Icosahedral (I[2a])",
+ "",
+ "",
+ 40, 71},
+
+ /* 72 */ {"|5/2 3 3", "Small Snub Icosicosidodecahedron",
+ "Small Hexagonal Hexecontahedron",
+ "Icosahedral (I[2a])",
+ "",
+ "",
+ 41, 110},
+ /* (3/2 5 5) (I2b) */
+
+ /* 74 */ {"3/2 5|5", "Small Dodecicosidodecahedron",
+ "Small Dodecacronic Hexecontahedron",
+ "Icosahedral (I[2b])",
+ "",
+ "",
+ 42, 72},
+ /* (2 5/2 5) (I3) */
+
+ /* 76 */ {"5|2 5/2", "Small Stellated Dodecahedron",
+ "Great Dodecahedron",
+ "Icosahedral (I[3])",
+ "Kepler-Poinsot Solid",
+ "Kepler-Poinsot Solid",
+ 43, 20},
+
+ /* 78 */ {"5/2|2 5", "Great Dodecahedron",
+ "Small Stellated Dodecahedron",
+ "Icosahedral (I[3])",
+ "Kepler-Poinsot Solid",
+ "Kepler-Poinsot Solid",
+ 44, 21},
+
+ /* 80 */ {"2|5/2 5", "Great Dodecadodecahedron",
+ "Medial Rhombic Triacontahedron",
+ "Icosahedral (I[3])",
+ "",
+ "",
+ 45, 73},
+
+ /* 82 */ {"2 5/2|5", "Truncated Great Dodecahedron",
+ "Small Stellapentakisdodecahedron",
+ "Icosahedral (I[3])",
+ "",
+ "",
+ 47, 75},
+
+ /* 84 */ {"5/2 5|2", "Rhombidodecadodecahedron",
+ "Medial Deltoidal Hexecontahedron",
+ "Icosahedral (I[3])",
+ "",
+ "",
+ 48, 76},
+
+ /* 86 */ {"2 5/2 5|", "Small Rhombidodecahedron",
+ "Small Rhombidodecacron",
+ "Icosahedral (I[3])",
+ "",
+ "",
+ 46, 74},
+
+ /* 88 */ {"|2 5/2 5", "Snub Dodecadodecahedron",
+ "Medial Pentagonal Hexecontahedron",
+ "Icosahedral (I[3])",
+ "",
+ "",
+ 49, 111},
+ /* (5/3 3 5) (I4) */
+
+ /* 90 */ {"3|5/3 5", "Ditrigonal Dodecadodecahedron",
+ "Medial Triambic Icosahedron",
+ "Icosahedral (I[4])",
+ "",
+ "",
+ 53, 80},
+
+ /* 92 */ {"3 5|5/3", "Great Ditrigonal Dodecicosidodecahedron",
+ "Great Ditrigonal Dodecacronic Hexecontahedron",
+ "Icosahedral (I[4])",
+ "",
+ "",
+ 54, 81},
+
+ /* 94 */ {"5/3 3|5", "Small Ditrigonal Dodecicosidodecahedron",
+ "Small Ditrigonal Dodecacronic Hexecontahedron",
+ "Icosahedral (I[4])",
+ "",
+ "",
+ 55, 82},
+
+ /* 96 */ {"5/3 5|3", "Icosidodecadodecahedron",
+ "Medial Icosacronic Hexecontahedron",
+ "Icosahedral (I[4])",
+ "",
+ "",
+ 56, 83},
+
+ /* 98 */ {"5/3 3 5|", "Icositruncated Dodecadodecahedron",
+ "Tridyakisicosahedron",
+ "Icosahedral (I[4])",
+ "",
+ "",
+ 57, 84},
+
+ /* 100 */ {"|5/3 3 5", "Snub Icosidodecadodecahedron",
+ "Medial Hexagonal Hexecontahedron",
+ "Icosahedral (I[4])",
+ "",
+ "",
+ 58, 112},
+ /* (3/2 3 5) (I6b) */
+
+ /* 102 */ {"3/2|3 5", "Great Ditrigonal Icosidodecahedron",
+ "Great Triambic Icosahedron",
+ "Icosahedral (I[6b])",
+ "",
+ "",
+ 61, 87},
+
+ /* 104 */ {"3/2 5|3", "Great Icosicosidodecahedron",
+ "Great Icosacronic Hexecontahedron",
+ "Icosahedral (I[6b])",
+ "",
+ "",
+ 62, 88},
+
+ /* 106 */ {"3/2 3|5", "Small Icosihemidodecahedron",
+ "Small Icosihemidodecacron",
+ "Icosahedral (I[6b])",
+ "",
+ "",
+ 63, 89},
+
+ /* 108 */ {"3/2 3 5|", "Small Dodecicosahedron",
+ "Small Dodecicosacron",
+ "Icosahedral (I[6b])",
+ "",
+ "",
+ 64, 90},
+ /* (5/4 5 5) (I6c) */
+
+ /* 110 */ {"5/4 5|5", "Small Dodecahemidodecahedron",
+ "Small Dodecahemidodecacron",
+ "Icosahedral (I[6c])",
+ "",
+ "",
+ 65, 91},
+ /* (2 5/2 3) (I7) */
+
+ /* 112 */ {"3|2 5/2", "Great Stellated Dodecahedron",
+ "Great Icosahedron",
+ "Icosahedral (I[7])",
+ "Kepler-Poinsot Solid",
+ "Kepler-Poinsot Solid",
+ 68, 22},
+
+ /* 114 */ {"5/2|2 3", "Great Icosahedron",
+ "Great Stellated Dodecahedron",
+ "Icosahedral (I[7])",
+ "Kepler-Poinsot Solid",
+ "Kepler-Poinsot Solid",
+ 69, 41},
+
+ /* 116 */ {"2|5/2 3", "Great Icosidodecahedron",
+ "Great Rhombic Triacontahedron",
+ "Icosahedral (I[7])",
+ "",
+ "",
+ 70, 94},
+
+ /* 118 */ {"2 5/2|3", "Great Truncated Icosahedron",
+ "Great Stellapentakisdodecahedron",
+ "Icosahedral (I[7])",
+ "",
+ "",
+ 71, 95},
+
+ /* 120 */ {"2 5/2 3|", "Rhombicosahedron",
+ "Rhombicosacron",
+ "Icosahedral (I[7])",
+ "",
+ "",
+ 72, 96},
+
+ /* 122 */ {"|2 5/2 3", "Great Snub Icosidodecahedron",
+ "Great Pentagonal Hexecontahedron",
+ "Icosahedral (I[7])",
+ "",
+ "",
+ 73, 113},
+ /* (5/3 2 5) (I9) */
+
+ /* 124 */ {"2 5|5/3", "Small Stellated Truncated Dodecahedron",
+ "Great Pentakisdodecahedron",
+ "Icosahedral (I[9])",
+ "",
+ "",
+ 74, 97},
+
+ /* 126 */ {"5/3 2 5|", "Truncated Dodecadodecahedron",
+ "Medial Disdyakistriacontahedron",
+ "Icosahedral (I[9])",
+ "",
+ "",
+ 75, 98},
+
+ /* 128 */ {"|5/3 2 5", "Inverted Snub Dodecadodecahedron",
+ "Medial Inverted Pentagonal Hexecontahedron",
+ "Icosahedral (I[9])",
+ "",
+ "",
+ 76, 114},
+ /* (5/3 5/2 3) (I10a) */
+
+ /* 130 */ {"5/2 3|5/3", "Great Dodecicosidodecahedron",
+ "Great Dodecacronic Hexecontahedron",
+ "Icosahedral (I[10a])",
+ "",
+ "",
+ 77, 99},
+
+ /* 132 */ {"5/3 5/2|3", "Small Dodecahemicosahedron",
+ "Small Dodecahemicosacron",
+ "Icosahedral (I[10a])",
+ "",
+ "",
+ 78, 100},
+
+ /* 134 */ {"5/3 5/2 3|", "Great Dodecicosahedron",
+ "Great Dodecicosacron",
+ "Icosahedral (I[10a])",
+ "",
+ "",
+ 79, 101},
+
+ /* 136 */ {"|5/3 5/2 3", "Great Snub Dodecicosidodecahedron",
+ "Great Hexagonal Hexecontahedron",
+ "Icosahedral (I[10a])",
+ "",
+ "",
+ 80, 115},
+ /* (5/4 3 5) (I10b) */
+
+ /* 138 */ {"5/4 5|3", "Great Dodecahemicosahedron",
+ "Great Dodecahemicosacron",
+ "Icosahedral (I[10b])",
+ "",
+ "",
+ 81, 102},
+ /* (5/3 2 3) (I13) */
+
+ /* 140 */ {"2 3|5/3", "Great Stellated Truncated Dodecahedron",
+ "Great Triakisicosahedron",
+ "Icosahedral (I[13])",
+ "",
+ "",
+ 83, 104},
+
+ /* 142 */ {"5/3 3|2", "Great Rhombicosidodecahedron",
+ "Great Deltoidal Hexecontahedron",
+ "Icosahedral (I[13])",
+ "",
+ "",
+ 84, 105},
+
+ /* 144 */ {"5/3 2 3|", "Great Truncated Icosidodecahedron",
+ "Great Disdyakistriacontahedron",
+ "Icosahedral (I[13])",
+ "",
+ "",
+ 87, 108},
+
+ /* 146 */ {"|5/3 2 3", "Great Inverted Snub Icosidodecahedron",
+ "Great Inverted Pentagonal Hexecontahedron",
+ "Icosahedral (I[13])",
+ "",
+ "",
+ 88, 116},
+ /* (5/3 5/3 5/2) (I18a) */
+
+ /* 148 */ {"5/3 5/2|5/3", "Great Dodecahemidodecahedron",
+ "Great Dodecahemidodecacron",
+ "Icosahedral (I[18a])",
+ "",
+ "",
+ 86, 107},
+ /* (3/2 5/3 3) (I18b) */
+
+ /* 150 */ {"3/2 3|5/3", "Great Icosihemidodecahedron",
+ "Great Icosihemidodecacron",
+ "Icosahedral (I[18b])",
+ "",
+ "",
+ 85, 106},
+ /* (3/2 3/2 5/3) (I22) */
+
+ /* 152 */ {"|3/2 3/2 5/2","Small Retrosnub Icosicosidodecahedron",
+ "Small Hexagrammic Hexecontahedron",
+ "Icosahedral (I[22])",
+ "",
+ "",
+ 91, 118},
+ /* (3/2 5/3 2) (I23) */
+
+ /* 154 */ {"3/2 5/3 2|", "Great Rhombidodecahedron",
+ "Great Rhombidodecacron",
+ "Icosahedral (I[23])",
+ "",
+ "",
+ 89, 109},
+
+ /* 156 */ {"|3/2 5/3 2", "Great Retrosnub Icosidodecahedron",
+ "Great Pentagrammic Hexecontahedron",
+ "Icosahedral (I[23])",
+ "",
+ "",
+ 90, 117},
+
+ /****************************************************************************
+ * Last But Not Least
+ ***************************************************************************/
+
+ /* 158 */ {"3/2 5/3 3 5/2", "Great Dirhombicosidodecahedron",
+ "Great Dirhombicosidodecacron",
+ "Non-Wythoffian",
+ "",
+ "",
+ 92, 119}
+};
+
+static int last_uniform = sizeof (uniform) / sizeof (uniform[0]);
+
+
+
+static int unpacksym(const char *sym, Polyhedron *P);
+static int moebius(Polyhedron *P);
+static int decompose(Polyhedron *P);
+static int guessname(Polyhedron *P);
+static int newton(Polyhedron *P, int need_approx);
+static int exceptions(Polyhedron *P);
+static int count(Polyhedron *P);
+static int configuration(Polyhedron *P);
+static int vertices(Polyhedron *P);
+static int faces(Polyhedron *P);
+static int edgelist(Polyhedron *P);
+
+static Polyhedron *
+kaleido(const char *sym,
+ int need_coordinates, int need_edgelist, int need_approx,
+ int just_list)
+{
+ Polyhedron *P;
+ /*
+ * Allocate a Polyhedron structure P.
+ */
+ if (!(P = polyalloc()))
+ return 0;
+ /*
+ * Unpack input symbol into P.
+ */
+ if (!unpacksym(sym, P))
+ return 0;
+ /*
+ * Find Mebius triangle, its density and Euler characteristic.
+ */
+ if (!moebius(P))
+ return 0;
+ /*
+ * Decompose Schwarz triangle.
+ */
+ if (!decompose(P))
+ return 0;
+ /*
+ * Find the names of the polyhedron and its dual.
+ */
+ if (!guessname(P))
+ return 0;
+ if (just_list)
+ return P;
+ /*
+ * Solve Fundamental triangles, optionally printing approximations.
+ */
+ if (!newton(P,need_approx))
+ return 0;
+ /*
+ * Deal with exceptional polyhedra.
+ */
+ if (!exceptions(P))
+ return 0;
+ /*
+ * Count edges and faces, update density and characteristic if needed.
+ */
+ if (!count(P))
+ return 0;
+ /*
+ * Generate printable vertex configuration.
+ */
+ if (!configuration(P))
+ return 0;
+ /*
+ * Compute coordinates.
+ */
+ if (!need_coordinates && !need_edgelist)
+ return P;
+ if (!vertices(P))
+ return 0;
+ if (!faces (P))
+ return 0;
+ /*
+ * Compute edgelist.
+ */
+ if (!need_edgelist)
+ return P;
+ if (!edgelist(P))
+ return 0;
+ return P;
+}
+
+/*
+ * Allocate a blank Polyhedron structure and initialize some of its nonblank
+ * fields.
+ *
+ * Array and matrix field are allocated when needed.
+ */
+static Polyhedron *
+polyalloc()
+{
+ Polyhedron *P;
+ Calloc(P, 1, Polyhedron);
+ P->index = -1;
+ P->even = -1;
+ P->K = 2;
+ return P;
+}
+
+/*
+ * Free the struture allocated by polyalloc(), as well as all the array and
+ * matrix fields.
+ */
+static void
+polyfree(Polyhedron *P)
+{
+ Free(P->Fi);
+ Free(P->n);
+ Free(P->m);
+ Free(P->gamma);
+ Free(P->rot);
+ Free(P->snub);
+ Free(P->firstrot);
+ Free(P->anti);
+ Free(P->ftype);
+ Free(P->polyform);
+ Free(P->config);
+ if (P->index < 0) {
+ Free(P->name);
+ Free(P->dual_name);
+ }
+ Free(P->v);
+ Free(P->f);
+ Matfree(P->e, 2);
+ Matfree(P->dual_e, 2);
+ Matfree(P->incid, P->M);
+ Matfree(P->adj, P->M);
+ free(P);
+}
+
+static void *
+matalloc(int rows, int row_size)
+{
+ void **mat;
+ int i = 0;
+ if (!(mat = malloc(rows * sizeof (void *))))
+ return 0;
+ while ((mat[i] = malloc(row_size)) && ++i < rows)
+ ;
+ if (i == rows)
+ return (void *)mat;
+ while (--i >= 0)
+ free(mat[i]);
+ free(mat);
+ return 0;
+}
+
+static void
+matfree(void *mat, int rows)
+{
+ while (--rows >= 0)
+ free(((void **)mat)[rows]);
+ free(mat);
+}
+
+/*
+ * compute the mathematical modulus function.
+ */
+static int
+mod (int i, int j)
+{
+ return (i%=j)>=0?i:j<0?i-j:i+j;
+}
+
+
+/*
+ * Find the numerator and the denominator using the Euclidean algorithm.
+ */
+static void
+frac(double x)
+{
+ static const Fraction zero = {0,1}, inf = {1,0};
+ Fraction r0, r;
+ long f;
+ double s = x;
+ r = zero;
+ frax = inf;
+ for (;;) {
+ if (fabs(s) > (double) MAXLONG)
+ return;
+ f = (long) floor (s);
+ r0 = r;
+ r = frax;
+ frax.n = frax.n * f + r0.n;
+ frax.d = frax.d * f + r0.d;
+ if (x == (double)frax.n/(double)frax.d)
+ return;
+ s = 1 / (s - f);
+ }
+}
+
+
+/*
+ * Unpack input symbol: Wythoff symbol or an index to uniform[]. The symbol is
+ * a # followed by a number, or a three fractions and a bar in some order. We
+ * allow no bars only if it result from the input symbol #80.
+ */
+static int
+unpacksym(const char *sym, Polyhedron *P)
+{
+ int i = 0, n, d, bars = 0;
+ char c;
+ while ((c = *sym++) && isspace(c))
+ ;
+ if (!c) Err("no data");
+ if (c == '#') {
+ while ((c = *sym++) && isspace(c))
+ ;
+ if (!c)
+ Err("no digit after #");
+ if (!isdigit(c))
+ Err("not a digit");
+ n = c - '0';
+ while ((c = *sym++) && isdigit(c))
+ n = n * 10 + c - '0';
+ if (!n)
+ Err("zero index");
+ if (n > last_uniform)
+ Err("index too big");
+ sym--;
+ while ((c = *sym++) && isspace(c))
+ ;
+ if (c)
+ Err("data exceeded");
+ sym = uniform[P->index = n - 1].Wythoff;
+ } else
+ sym--;
+
+ for (;;) {
+ while ((c = *sym++) && isspace(c))
+ ;
+ if (!c) {
+ if (i == 4 && (bars || P->index == last_uniform - 1))
+ return 1;
+ if (!bars)
+ Err("no bars");
+ Err("not enough fractions");
+ }
+ if (i == 4)
+ Err("data exceeded");
+ if (c == '|'){
+ if (++bars > 1)
+ Err("too many bars");
+ P->p[i++] = 0;
+ continue;
+ }
+ if (!isdigit(c))
+ Err("not a digit");
+ n = c - '0';
+ while ((c = *sym++) && isdigit(c))
+ n = n * 10 + c - '0';
+ if (c && isspace (c))
+ while ((c = *sym++) && isspace(c))
+ ;
+ if (c != '/') {
+ sym--;
+ if ((P->p[i++] = n) <= 1)
+ Err("fraction<=1");
+ continue;
+ }
+ while ((c = *sym++) && isspace(c))
+ ;
+ if (!c || !isdigit(c))
+ return 0;
+ d = c - '0';
+ while ((c = *sym++) && isdigit(c))
+ d = d * 10 + c - '0';
+ if (!d)
+ Err("zero denominator");
+ sym--;
+ if ((P->p[i++] = (double) n / d) <= 1)
+ Err("fraction<=1");
+ }
+}
+
+/*
+ * Using Wythoff symbol (p|qr, pq|r, pqr| or |pqr), find the Moebius triangle
+ * (2 3 K) (or (2 2 n)) of the Schwarz triangle (pqr), the order g of its
+ * symmetry group, its Euler characteristic chi, and its covering density D.
+ * g is the number of copies of (2 3 K) covering the sphere, i.e.,
+ *
+ * g * pi * (1/2 + 1/3 + 1/K - 1) = 4 * pi
+ *
+ * D is the number of times g copies of (pqr) cover the sphere, i.e.
+ *
+ * D * 4 * pi = g * pi * (1/p + 1/q + 1/r - 1)
+ *
+ * chi is V - E + F, where F = g is the number of triangles, E = 3*g/2 is the
+ * number of triangle edges, and V = Vp+ Vq+ Vr, with Vp = g/(2*np) being the
+ * number of vertices with angle pi/p (np is the numerator of p).
+ */
+static int
+moebius(Polyhedron *P)
+{
+ int twos = 0, j, len = 1;
+ /*
+ * Arrange Wythoff symbol in a presentable form. In the same time check the
+ * restrictions on the three fractions: They all have to be greater then one,
+ * and the numerators 4 or 5 cannot occur together. We count the ocurrences
+ * of 2 in `two', and save the largest numerator in `P->K', since they
+ * reflect on the symmetry group.
+ */
+ P->K = 2;
+ if (P->index == last_uniform - 1) {
+ Malloc(P->polyform, ++len, char);
+ strcpy(P->polyform, "|");
+ } else
+ Calloc(P->polyform, len, char);
+ for (j = 0; j < 4; j++) {
+ if (P->p[j]) {
+ char *s;
+ Sprintfrac(s, P->p[j]);
+ if (j && P->p[j-1]) {
+ Realloc(P->polyform, len += strlen (s) + 1, char);
+ strcat(P->polyform, " ");
+ } else
+ Realloc (P->polyform, len += strlen (s), char);
+ strcat(P->polyform, s);
+ free(s);
+ if (P->p[j] != 2) {
+ int k;
+ if ((k = numerator (P->p[j])) > P->K) {
+ if (P->K == 4)
+ break;
+ P->K = k;
+ } else if (k < P->K && k == 4)
+ break;
+ } else
+ twos++;
+ } else {
+ Realloc(P->polyform, ++len, char);
+ strcat(P->polyform, "|");
+ }
+ }
+ /*
+ * Find the symmetry group P->K (where 2, 3, 4, 5 represent the dihedral,
+ * tetrahedral, octahedral and icosahedral groups, respectively), and its
+ * order P->g.
+ */
+ if (twos >= 2) {/* dihedral */
+ P->g = 4 * P->K;
+ P->K = 2;
+ } else {
+ if (P->K > 5)
+ Err("numerator too large");
+ P->g = 24 * P->K / (6 - P->K);
+ }
+ /*
+ * Compute the nominal density P->D and Euler characteristic P->chi.
+ * In few exceptional cases, these values will be modified later.
+ */
+ if (P->index != last_uniform - 1) {
+ int i;
+ P->D = P->chi = - P->g;
+ for (j = 0; j < 4; j++) if (P->p[j]) {
+ P->chi += i = P->g / numerator(P->p[j]);
+ P->D += i * denominator(P->p[j]);
+ }
+ P->chi /= 2;
+ P->D /= 4;
+ if (P->D <= 0)
+ Err("nonpositive density");
+ }
+ return 1;
+}
+
+/*
+ * Decompose Schwarz triangle into N right triangles and compute the vertex
+ * count V and the vertex valency M. V is computed from the number g of
+ * Schwarz triangles in the cover, divided by the number of triangles which
+ * share a vertex. It is halved for one-sided polyhedra, because the
+ * kaleidoscopic construction really produces a double orientable covering of
+ * such polyhedra. All q' q|r are of the "hemi" type, i.e. have equatorial {2r}
+ * faces, and therefore are (except 3/2 3|3 and the dihedra 2 2|r) one-sided. A
+ * well known example is 3/2 3|4, the "one-sided heptahedron". Also, all p q r|
+ * with one even denominator have a crossed parallelogram as a vertex figure,
+ * and thus are one-sided as well.
+ */
+static int
+decompose(Polyhedron *P)
+{
+ int j, J, *s, *t;
+ if (!P->p[1]) { /* p|q r */
+ P->N = 2;
+ P->M = 2 * numerator(P->p[0]);
+ P->V = P->g / P->M;
+ Malloc(P->n, P->N, double);
+ Malloc(P->m, P->N, double);
+ Malloc(P->rot, P->M, int);
+ s = P->rot;
+ for (j = 0; j < 2; j++) {
+ P->n[j] = P->p[j+2];
+ P->m[j] = P->p[0];
+ }
+ for (j = P->M / 2; j--;) {
+ *s++ = 0;
+ *s++ = 1;
+ }
+ } else if (!P->p[2]) { /* p q|r */
+ P->N = 3;
+ P->M = 4;
+ P->V = P->g / 2;
+ Malloc(P->n, P->N, double);
+ Malloc(P->m, P->N, double);
+ Malloc(P->rot, P->M, int);
+ s = P->rot;
+ P->n[0] = 2 * P->p[3];
+ P->m[0] = 2;
+ for (j = 1; j < 3; j++) {
+ P->n[j] = P->p[j-1];
+ P->m[j] = 1;
+ *s++ = 0;
+ *s++ = j;
+ }
+ if (fabs(P->p[0] - compl (P->p[1])) < DBL_EPSILON) {/* p = q' */
+ /* P->p[0]==compl(P->p[1]) should work. However, MSDOS
+ * yeilds a 7e-17 difference! Reported by Jim Buddenhagen
+ * <jb1556@daditz.sbc.com> */
+ P->hemi = 1;
+ P->D = 0;
+ if (P->p[0] != 2 && !(P->p[3] == 3 && (P->p[0] == 3 ||
+ P->p[1] == 3))) {
+ P->onesided = 1;
+ P->V /= 2;
+ P->chi /= 2;
+ }
+ }
+ } else if (!P->p[3]) { /* p q r| */
+ P->M = P->N = 3;
+ P->V = P->g;
+ Malloc(P->n, P->N, double);
+ Malloc(P->m, P->N, double);
+ Malloc(P->rot, P->M, int);
+ s = P->rot;
+ for (j = 0; j < 3; j++) {
+ if (!(denominator(P->p[j]) % 2)) {
+ /* what happens if there is more then one even denominator? */
+ if (P->p[(j+1)%3] != P->p[(j+2)%3]) { /* needs postprocessing */
+ P->even = j;/* memorize the removed face */
+ P->chi -= P->g / numerator(P->p[j]) / 2;
+ P->onesided = 1;
+ P->D = 0;
+ } else {/* for p = q we get a double 2 2r|p */
+ /* noted by Roman Maeder <maeder@inf.ethz.ch> for 4 4 3/2| */
+ /* Euler characteristic is still wrong */
+ P->D /= 2;
+ }
+ P->V /= 2;
+ }
+ P->n[j] = 2 * P->p[j];
+ P->m[j] = 1;
+ *s++ = j;
+ }
+ } else { /* |p q r - snub polyhedron */
+ P->N = 4;
+ P->M = 6;
+ P->V = P->g / 2;/* Only "white" triangles carry a vertex */
+ Malloc(P->n, P->N, double);
+ Malloc(P->m, P->N, double);
+ Malloc(P->rot, P->M, int);
+ Malloc(P->snub, P->M, int);
+ s = P->rot;
+ t = P->snub;
+ P->m[0] = P->n[0] = 3;
+ for (j = 1; j < 4; j++) {
+ P->n[j] = P->p[j];
+ P->m[j] = 1;
+ *s++ = 0;
+ *s++ = j;
+ *t++ = 1;
+ *t++ = 0;
+ }
+ }
+ /*
+ * Sort the fundamental triangles (using bubble sort) according to decreasing
+ * n[i], while pushing the trivial triangles (n[i] = 2) to the end.
+ */
+ J = P->N - 1;
+ while (J) {
+ int last;
+ last = J;
+ J = 0;
+ for (j = 0; j < last; j++) {
+ if ((P->n[j] < P->n[j+1] || P->n[j] == 2) && P->n[j+1] != 2) {
+ int i;
+ double temp;
+ temp = P->n[j];
+ P->n[j] = P->n[j+1];
+ P->n[j+1] = temp;
+ temp = P->m[j];
+ P->m[j] = P->m[j+1];
+ P->m[j+1] = temp;
+ for (i = 0; i < P->M; i++) {
+ if (P->rot[i] == j)
+ P->rot[i] = j+1;
+ else if (P->rot[i] == j+1)
+ P->rot[i] = j;
+ }
+ if (P->even != -1) {
+ if (P->even == j)
+ P->even = j+1;
+ else if (P->even == j+1)
+ P->even = j;
+ }
+ J = j;
+ }
+ }
+ }
+ /*
+ * Get rid of repeated triangles.
+ */
+ for (J = 0; J < P->N && P->n[J] != 2;J++) {
+ int k, i;
+ for (j = J+1; j < P->N && P->n[j]==P->n[J]; j++)
+ P->m[J] += P->m[j];
+ k = j - J - 1;
+ if (k) {
+ for (i = j; i < P->N; i++) {
+ P->n[i - k] = P->n[i];
+ P->m[i - k] = P->m[i];
+ }
+ P->N -= k;
+ for (i = 0; i < P->M; i++) {
+ if (P->rot[i] >= j)
+ P->rot[i] -= k;
+ else if (P->rot[i] > J)
+ P->rot[i] = J;
+ }
+ if (P->even >= j)
+ P->even -= k;
+ }
+ }
+ /*
+ * Get rid of trivial triangles.
+ */
+ if (!J)
+ J = 1; /* hosohedron */
+ if (J < P->N) {
+ int i;
+ P->N = J;
+ for (i = 0; i < P->M; i++) {
+ if (P->rot[i] >= P->N) {
+ for (j = i + 1; j < P->M; j++) {
+ P->rot[j-1] = P->rot[j];
+ if (P->snub)
+ P->snub[j-1] = P->snub[j];
+ }
+ P->M--;
+ }
+ }
+ }
+ /*
+ * Truncate arrays
+ */
+ Realloc(P->n, P->N, double);
+ Realloc(P->m, P->N, double);
+ Realloc(P->rot, P->M, int);
+ if (P->snub)
+ Realloc(P->snub, P->M, int);
+ return 1;
+}
+
+
+static int dihedral(Polyhedron *P, const char *name, const char *dual_name);
+
+
+/*
+ * Get the polyhedron name, using standard list or guesswork. Ideally, we
+ * should try to locate the Wythoff symbol in the standard list (unless, of
+ * course, it is dihedral), after doing few normalizations, such as sorting
+ * angles and splitting isoceles triangles.
+ */
+static int
+guessname(Polyhedron *P)
+{
+ if (P->index != -1) {/* tabulated */
+ P->name = uniform[P->index].name;
+ P->dual_name = uniform[P->index].dual;
+ P->group = uniform[P->index].group;
+ P->class = uniform[P->index].class;
+ P->dual_class = uniform[P->index].dual_class;
+ return 1;
+ } else if (P->K == 2) {/* dihedral nontabulated */
+ if (!P->p[0]) {
+ if (P->N == 1) {
+ Malloc(P->name, sizeof ("Octahedron"), char);
+ Malloc(P->dual_name, sizeof ("Cube"), char);
+ strcpy(P->name, "Octahedron");
+ strcpy(P->dual_name, "Cube");
+ return 1;
+ }
+ P->gon = P->n[0] == 3 ? P->n[1] : P->n[0];
+ if (P->gon >= 2)
+ return dihedral(P, "Antiprism", "Deltohedron");
+ else
+ return dihedral(P, "Crossed Antiprism", "Concave Deltohedron");
+ } else if (!P->p[3] ||
+ (!P->p[2] &&
+ P->p[3] == 2)) {
+ if (P->N == 1) {
+ Malloc(P->name, sizeof("Cube"), char);
+ Malloc(P->dual_name, sizeof("Octahedron"), char);
+ strcpy(P->name, "Cube");
+ strcpy(P->dual_name, "Octahedron");
+ return 1;
+ }
+ P->gon = P->n[0] == 4 ? P->n[1] : P->n[0];
+ return dihedral(P, "Prism", "Dipyramid");
+ } else if (!P->p[1] && P->p[0] != 2) {
+ P->gon = P->m[0];
+ return dihedral(P, "Hosohedron", "Dihedron");
+ } else {
+ P->gon = P->n[0];
+ return dihedral(P, "Dihedron", "Hosohedron");
+ }
+ } else {/* other nontabulated */
+ static const char *pre[] = {"Tetr", "Oct", "Icos"};
+ Malloc(P->name, 50, char);
+ Malloc(P->dual_name, 50, char);
+ sprintf(P->name, "%sahedral ", pre[P->K - 3]);
+ if (P->onesided)
+ strcat (P->name, "One-Sided ");
+ else if (P->D == 1)
+ strcat(P->name, "Convex ");
+ else
+ strcat(P->name, "Nonconvex ");
+ strcpy(P->dual_name, P->name);
+ strcat(P->name, "Isogonal Polyhedron");
+ strcat(P->dual_name, "Isohedral Polyhedron");
+ Realloc(P->name, strlen (P->name) + 1, char);
+ Realloc(P->dual_name, strlen (P->dual_name) + 1, char);
+ return 1;
+ }
+}
+
+static int
+dihedral(Polyhedron *P, const char *name, const char *dual_name)
+{
+ char *s;
+ int i;
+ Sprintfrac(s, P->gon < 2 ? compl (P->gon) : P->gon);
+ i = strlen(s) + sizeof ("-gonal ");
+ Malloc(P->name, i + strlen (name), char);
+ Malloc(P->dual_name, i + strlen (dual_name), char);
+ sprintf(P->name, "%s-gonal %s", s, name);
+ sprintf(P->dual_name, "%s-gonal %s", s, dual_name);
+ free(s);
+ return 1;
+}
+
+/*
+ * Solve the fundamental right spherical triangles.
+ * If need_approx is set, print iterations on standard error.
+ */
+static int
+newton(Polyhedron *P, int need_approx)
+{
+ /*
+ * First, we find initial approximations.
+ */
+ int j;
+ double cosa;
+ Malloc(P->gamma, P->N, double);
+ if (P->N == 1) {
+ P->gamma[0] = M_PI / P->m[0];
+ return 1;
+ }
+ for (j = 0; j < P->N; j++)
+ P->gamma[j] = M_PI / 2 - M_PI / P->n[j];
+ errno = 0; /* may be non-zero from some reason */
+ /*
+ * Next, iteratively find closer approximations for gamma[0] and compute
+ * other gamma[j]'s from Napier's equations.
+ */
+ if (need_approx)
+ fprintf(stderr, "Solving %s\n", P->polyform);
+ for (;;) {
+ double delta = M_PI, sigma = 0;
+ for (j = 0; j < P->N; j++) {
+ if (need_approx)
+ fprintf(stderr, "%-20.15f", P->gamma[j]);
+ delta -= P->m[j] * P->gamma[j];
+ }
+ if (need_approx)
+ printf("(%g)\n", delta);
+ if (fabs(delta) < 11 * DBL_EPSILON)
+ return 1;
+ /* On a RS/6000, fabs(delta)/DBL_EPSILON may occilate between 8 and
+ * 10. Reported by David W. Sanderson <dws@ssec.wisc.edu> */
+ for (j = 0; j < P->N; j++)
+ sigma += P->m[j] * tan(P->gamma[j]);
+ P->gamma[0] += delta * tan(P->gamma[0]) / sigma;
+ if (P->gamma[0] < 0 || P->gamma[0] > M_PI)
+ Err("gamma out of bounds");
+ cosa = cos(M_PI / P->n[0]) / sin(P->gamma[0]);
+ for (j = 1; j < P->N; j++)
+ P->gamma[j] = asin(cos(M_PI / P->n[j]) / cosa);
+ if (errno)
+ Err(strerror(errno));
+ }
+}
+
+/*
+ * Postprocess pqr| where r has an even denominator (cf. Coxeter &al. Sec.9).
+ * Remove the {2r} and add a retrograde {2p} and retrograde {2q}.
+ */
+static int
+exceptions(Polyhedron *P)
+{
+ int j;
+ if (P->even != -1) {
+ P->M = P->N = 4;
+ Realloc(P->n, P->N, double);
+ Realloc(P->m, P->N, double);
+ Realloc(P->gamma, P->N, double);
+ Realloc(P->rot, P->M, int);
+ for (j = P->even + 1; j < 3; j++) {
+ P->n[j-1] = P->n[j];
+ P->gamma[j-1] = P->gamma[j];
+ }
+ P->n[2] = compl(P->n[1]);
+ P->gamma[2] = - P->gamma[1];
+ P->n[3] = compl(P->n[0]);
+ P->m[3] = 1;
+ P->gamma[3] = - P->gamma[0];
+ P->rot[0] = 0;
+ P->rot[1] = 1;
+ P->rot[2] = 3;
+ P->rot[3] = 2;
+ }
+
+ /*
+ * Postprocess the last polyhedron |3/2 5/3 3 5/2 by taking a |5/3 3 5/2,
+ * replacing the three snub triangles by four equatorial squares and adding
+ * the missing {3/2} (retrograde triangle, cf. Coxeter &al. Sec. 11).
+ */
+ if (P->index == last_uniform - 1) {
+ P->N = 5;
+ P->M = 8;
+ Realloc(P->n, P->N, double);
+ Realloc(P->m, P->N, double);
+ Realloc(P->gamma, P->N, double);
+ Realloc(P->rot, P->M, int);
+ Realloc(P->snub, P->M, int);
+ P->hemi = 1;
+ P->D = 0;
+ for (j = 3; j; j--) {
+ P->m[j] = 1;
+ P->n[j] = P->n[j-1];
+ P->gamma[j] = P->gamma[j-1];
+ }
+ P->m[0] = P->n[0] = 4;
+ P->gamma[0] = M_PI / 2;
+ P->m[4] = 1;
+ P->n[4] = compl(P->n[1]);
+ P->gamma[4] = - P->gamma[1];
+ for (j = 1; j < 6; j += 2) P->rot[j]++;
+ P->rot[6] = 0;
+ P->rot[7] = 4;
+ P->snub[6] = 1;
+ P->snub[7] = 0;
+ }
+ return 1;
+}
+
+/*
+ * Compute edge and face counts, and update D and chi. Update D in the few
+ * cases the density of the polyhedron is meaningful but different than the
+ * density of the corresponding Schwarz triangle (cf. Coxeter &al., p. 418 and
+ * p. 425).
+ * In these cases, spherical faces of one type are concave (bigger than a
+ * hemisphere), and the actual density is the number of these faces less the
+ * computed density. Note that if j != 0, the assignment gamma[j] = asin(...)
+ * implies gamma[j] cannot be obtuse. Also, compute chi for the only
+ * non-Wythoffian polyhedron.
+ */
+static int
+count(Polyhedron *P)
+{
+ int j, temp;
+ Malloc(P->Fi, P->N, int);
+ for (j = 0; j < P->N; j++) {
+ P->E += temp = P->V * numerator(P->m[j]);
+ P->F += P->Fi[j] = temp / numerator(P->n[j]);
+ }
+ P->E /= 2;
+ if (P->D && P->gamma[0] > M_PI / 2)
+ P->D = P->Fi[0] - P->D;
+ if (P->index == last_uniform - 1)
+ P->chi = P->V - P->E + P->F;
+ return 1;
+}
+
+/*
+ * Generate a printable vertex configuration symbol.
+ */
+static int
+configuration(Polyhedron *P)
+{
+ int j, len = 2;
+ for (j = 0; j < P->M; j++) {
+ char *s;
+ Sprintfrac(s, P->n[P->rot[j]]);
+ len += strlen (s) + 2;
+ if (!j) {
+ Malloc(P->config, len, char);
+/* strcpy(P->config, "(");*/
+ strcpy(P->config, "");
+ } else {
+ Realloc(P->config, len, char);
+ strcat(P->config, ", ");
+ }
+ strcat(P->config, s);
+ free(s);
+ }
+/* strcat (P->config, ")");*/
+ if ((j = denominator (P->m[0])) != 1) {
+ char s[MAXDIGITS + 2];
+ sprintf(s, "/%d", j);
+ Realloc(P->config, len + strlen (s), char);
+ strcat(P->config, s);
+ }
+ return 1;
+}
+
+/*
+ * Compute polyhedron vertices and vertex adjecency lists.
+ * The vertices adjacent to v[i] are v[adj[0][i], v[adj[1][i], ...
+ * v[adj[M-1][i], ordered counterclockwise. The algorith is a BFS on the
+ * vertices, in such a way that the vetices adjacent to a givem vertex are
+ * obtained from its BFS parent by a cyclic sequence of rotations. firstrot[i]
+ * points to the first rotaion in the sequence when applied to v[i]. Note that
+ * for non-snub polyhedra, the rotations at a child are opposite in sense when
+ * compared to the rotations at the parent. Thus, we fill adj[*][i] from the
+ * end to signify clockwise rotations. The firstrot[] array is not needed for
+ * display thus it is freed after being used for face computations below.
+ */
+static int
+vertices(Polyhedron *P)
+{
+ int i, newV = 2;
+ double cosa;
+ Malloc(P->v, P->V, Vector);
+ Matalloc(P->adj, P->M, P->V, int);
+ Malloc(P->firstrot, P->V, int); /* temporary , put in Polyhedron
+ structure so that may be freed on
+ error */
+ cosa = cos(M_PI / P->n[0]) / sin(P->gamma[0]);
+ P->v[0].x = 0;
+ P->v[0].y = 0;
+ P->v[0].z = 1;
+ P->firstrot[0] = 0;
+ P->adj[0][0] = 1;
+ P->v[1].x = 2 * cosa * sqrt(1 - cosa * cosa);
+ P->v[1].y = 0;
+ P->v[1].z = 2 * cosa * cosa - 1;
+ if (!P->snub) {
+ P->firstrot[1] = 0;
+ P->adj[0][1] = -1;/* start the other side */
+ P->adj[P->M-1][1] = 0;
+ } else {
+ P->firstrot[1] = P->snub[P->M-1] ? 0 : P->M-1 ;
+ P->adj[0][1] = 0;
+ }
+ for (i = 0; i < newV; i++) {
+ int j, k;
+ int last, one, start, limit;
+ if (P->adj[0][i] == -1) {
+ one = -1; start = P->M-2; limit = -1;
+ } else {
+ one = 1; start = 1; limit = P->M;
+ }
+ k = P->firstrot[i];
+ for (j = start; j != limit; j += one) {
+ Vector temp;
+ int J;
+ temp = rotate (P->v[P->adj[j-one][i]], P->v[i],
+ one * 2 * P->gamma[P->rot[k]]);
+ for (J=0; J<newV && !same(P->v[J],temp,BIG_EPSILON); J++)
+ ;/* noop */
+ P->adj[j][i] = J;
+ last = k;
+ if (++k == P->M)
+ k = 0;
+ if (J == newV) { /* new vertex */
+ if (newV == P->V) Err ("too many vertices");
+ P->v[newV++] = temp;
+ if (!P->snub) {
+ P->firstrot[J] = k;
+ if (one > 0) {
+ P->adj[0][J] = -1;
+ P->adj[P->M-1][J] = i;
+ } else {
+ P->adj[0][J] = i;
+ }
+ } else {
+ P->firstrot[J] = !P->snub[last] ? last :
+ !P->snub[k] ? (k+1)%P->M : k ;
+ P->adj[0][J] = i;
+ }
+ }
+ }
+ }
+ return 1;
+}
+
+/*
+ * Compute polyhedron faces (dual vertices) and incidence matrices.
+ * For orientable polyhedra, we can distinguish between the two faces meeting
+ * at a given directed edge and identify the face on the left and the face on
+ * the right, as seen from the outside. For one-sided polyhedra, the vertex
+ * figure is a papillon (in Coxeter &al. terminology, a crossed parallelogram)
+ * and the two faces meeting at an edge can be identified as the side face
+ * (n[1] or n[2]) and the diagonal face (n[0] or n[3]).
+ */
+static int
+faces(Polyhedron *P)
+{
+ int i, newF = 0;
+ Malloc (P->f, P->F, Vector);
+ Malloc (P->ftype, P->F, int);
+ Matalloc (P->incid, P->M, P->V, int);
+ P->minr = 1 / fabs (tan (M_PI / P->n[P->hemi]) * tan (P->gamma[P->hemi]));
+ for (i = P->M; --i>=0;) {
+ int j;
+ for (j = P->V; --j>=0;)
+ P->incid[i][j] = -1;
+ }
+ for (i = 0; i < P->V; i++) {
+ int j;
+ for (j = 0; j < P->M; j++) {
+ int i0, J;
+ int pap=0;/* papillon edge type */
+ if (P->incid[j][i] != -1)
+ continue;
+ P->incid[j][i] = newF;
+ if (newF == P->F)
+ Err("too many faces");
+ P->f[newF] = pole(P->minr, P->v[i], P->v[P->adj[j][i]],
+ P->v[P->adj[mod(j + 1, P->M)][i]]);
+ P->ftype[newF] = P->rot[mod(P->firstrot[i] + ((P->adj[0][i] <
+ P->adj[P->M - 1][i])
+ ? j
+ : -j - 2),
+ P->M)];
+ if (P->onesided)
+ pap = (P->firstrot[i] + j) % 2;
+ i0 = i;
+ J = j;
+ for (;;) {
+ int k;
+ k = i0;
+ if ((i0 = P->adj[J][k]) == i) break;
+ for (J = 0; J < P->M && P->adj[J][i0] != k; J++)
+ ;/* noop */
+ if (J == P->M)
+ Err("too many faces");
+ if (P->onesided && (J + P->firstrot[i0]) % 2 == pap) {
+ P->incid [J][i0] = newF;
+ if (++J >= P->M)
+ J = 0;
+ } else {
+ if (--J < 0)
+ J = P->M - 1;
+ P->incid [J][i0] = newF;
+ }
+ }
+ newF++;
+ }
+ }
+ Free(P->firstrot);
+ Free(P->rot);
+ Free(P->snub);
+ return 1;
+}
+
+/*
+ * Compute edge list and graph polyhedron and dual.
+ * If the polyhedron is of the "hemi" type, each edge has one finite vertex and
+ * one ideal vertex. We make sure the latter is always the out-vertex, so that
+ * the edge becomes a ray (half-line). Each ideal vertex is represented by a
+ * unit Vector, and the direction of the ray is either parallel or
+ * anti-parallel this Vector. We flag this in the array P->anti[E].
+ */
+static int
+edgelist(Polyhedron *P)
+{
+ int i, j, *s, *t, *u;
+ Matalloc(P->e, 2, P->E, int);
+ Matalloc(P->dual_e, 2, P->E, int);
+ s = P->e[0];
+ t = P->e[1];
+ for (i = 0; i < P->V; i++)
+ for (j = 0; j < P->M; j++)
+ if (i < P->adj[j][i]) {
+ *s++ = i;
+ *t++ = P->adj[j][i];
+ }
+ s = P->dual_e[0];
+ t = P->dual_e[1];
+ if (!P->hemi)
+ P->anti = 0;
+ else
+ Malloc(P->anti, P->E, int);
+ u = P->anti;
+ for (i = 0; i < P->V; i++)
+ for (j = 0; j < P->M; j++)
+ if (i < P->adj[j][i])
+ {
+ if (!u) {
+ *s++ = P->incid[mod(j-1,P->M)][i];
+ *t++ = P->incid[j][i];
+ } else {
+ if (P->ftype[P->incid[j][i]]) {
+ *s = P->incid[j][i];
+ *t = P->incid[mod(j-1,P->M)][i];
+ } else {
+ *s = P->incid[mod(j-1,P->M)][i];
+ *t = P->incid[j][i];
+ }
+ *u++ = dot(P->f[*s++], P->f[*t++]) > 0;
+ }
+ }
+ return 1;
+}
+
+
+static char *
+sprintfrac(double x)
+{
+ char *s;
+ frac (x);
+ if (!frax.d) {
+ Malloc(s, sizeof ("infinity"), char);
+ strcpy(s, "infinity");
+ } else if (frax.d == 1) {
+ char n[MAXDIGITS + 1];
+ sprintf(n, "%ld", frax.n);
+ Malloc(s, strlen (n) + 1, char);
+ strcpy(s, n);
+ } else {
+ char n[MAXDIGITS + 1], d[MAXDIGITS + 1];
+ sprintf(n, "%ld", frax.n);
+ sprintf(d, "%ld", frax.d);
+ Malloc(s, strlen (n) + strlen (d) + 2, char);
+ sprintf(s, "%s/%s", n, d);
+ }
+ return s;
+}
+
+static double
+dot(Vector a, Vector b)
+{
+ return a.x * b.x + a.y * b.y + a.z * b.z;
+}
+
+static Vector
+scale(double k, Vector a)
+{
+ a.x *= k;
+ a.y *= k;
+ a.z *= k;
+ return a;
+}
+
+static Vector
+diff(Vector a, Vector b)
+{
+ a.x -= b.x;
+ a.y -= b.y;
+ a.z -= b.z;
+ return a;
+}
+
+static Vector
+cross(Vector a, Vector b)
+{
+ Vector p;
+ p.x = a.y * b.z - a.z * b.y;
+ p.y = a.z * b.x - a.x * b.z;
+ p.z = a.x * b.y - a.y * b.x;
+ return p;
+}
+
+static Vector
+sum(Vector a, Vector b)
+{
+ a.x += b.x;
+ a.y += b.y;
+ a.z += b.z;
+ return a;
+}
+
+static Vector
+sum3(Vector a, Vector b, Vector c)
+{
+ a.x += b.x + c.x;
+ a.y += b.y + c.y;
+ a.z += b.z + c.z;
+ return a;
+}
+
+static Vector
+rotate(Vector vertex, Vector axis, double angle)
+{
+ Vector p;
+ p = scale(dot (axis, vertex), axis);
+ return sum3(p, scale(cos(angle), diff(vertex, p)),
+ scale(sin(angle), cross(axis, vertex)));
+}
+
+static Vector x, y, z;
+
+/*
+ * rotate the standard frame
+ */
+static void
+rotframe(double azimuth, double elevation, double angle)
+{
+ static const Vector X = {1,0,0}, Y = {0,1,0}, Z = {0,0,1};
+ Vector axis;
+
+ axis = rotate(rotate (X, Y, elevation), Z, azimuth);
+ x = rotate(X, axis, angle);
+ y = rotate(Y, axis, angle);
+ z = rotate(Z, axis, angle);
+}
+
+/*
+ * rotate an array of n Vectors
+ */
+static void
+rotarray(Vector *new, Vector *old, int n)
+{
+ while (n--) {
+ *new++ = sum3(scale(old->x, x), scale(old->y, y), scale(old->z, z));
+ old++;
+ }
+}
+
+static int
+same(Vector a, Vector b, double epsilon)
+{
+ return fabs(a.x - b.x) < epsilon && fabs(a.y - b.y) < epsilon
+ && fabs(a.z - b.z) < epsilon;
+}
+
+/*
+ * Compute the polar reciprocal of the plane containing a, b and c:
+ *
+ * If this plane does not contain the origin, return p such that
+ * dot(p,a) = dot(p,b) = dot(p,b) = r.
+ *
+ * Otherwise, return p such that
+ * dot(p,a) = dot(p,b) = dot(p,c) = 0
+ * and
+ * dot(p,p) = 1.
+ */
+static Vector
+pole(double r, Vector a, Vector b, Vector c)
+{
+ Vector p;
+ double k;
+ p = cross(diff(b, a), diff(c, a));
+ k = dot(p, a);
+ if (fabs(k) < 1e-6)
+ return scale(1 / sqrt(dot(p, p)), p);
+ else
+ return scale(r/ k , p);
+}
+
+
+/* output */
+
+
+
+
+static void rotframe(double azimuth, double elevation, double angle);
+static void rotarray(Vector *new, Vector *old, int n);
+static int mod (int i, int j);
+
+
+static void
+push_point (polyhedron *p, Vector v)
+{
+ p->points[p->npoints].x = v.x;
+ p->points[p->npoints].y = v.y;
+ p->points[p->npoints].z = v.z;
+ p->npoints++;
+}
+
+static void
+push_face3 (polyhedron *p, int x, int y, int z)
+{
+ p->faces[p->nfaces].npoints = 3;
+ Malloc (p->faces[p->nfaces].points, 3, int);
+ p->faces[p->nfaces].points[0] = x;
+ p->faces[p->nfaces].points[1] = y;
+ p->faces[p->nfaces].points[2] = z;
+ p->nfaces++;
+}
+
+static void
+push_face4 (polyhedron *p, int x, int y, int z, int w)
+{
+ p->faces[p->nfaces].npoints = 4;
+ Malloc (p->faces[p->nfaces].points, 4, int);
+ p->faces[p->nfaces].points[0] = x;
+ p->faces[p->nfaces].points[1] = y;
+ p->faces[p->nfaces].points[2] = z;
+ p->faces[p->nfaces].points[3] = w;
+ p->nfaces++;
+}
+
+
+
+
+static polyhedron *
+construct_polyhedron (Polyhedron *P, Vector *v, int V, Vector *f, int F,
+ const char *name, const char *dual,
+ const char *class, const char *star,
+ double azimuth, double elevation, double freeze)
+{
+ int i, j, k=0, l, ll, ii, *hit=0, facelets;
+
+ polyhedron *result;
+ Vector *temp;
+
+ Malloc (result, 1, polyhedron);
+ memset (result, 0, sizeof(*result));
+
+ /*
+ * Rotate polyhedron
+ */
+ rotframe(azimuth, elevation, freeze);
+ Malloc(temp, V, Vector);
+ rotarray(temp, v, V);
+ v = temp;
+ Malloc(temp, F, Vector);
+ rotarray(temp, f, F);
+ f = temp;
+
+ result->number = P->index + 1;
+ result->name = strdup (name);
+ result->dual = strdup (dual);
+ result->wythoff = strdup (P->polyform);
+ result->config = strdup (P->config);
+ result->group = strdup (P->group);
+ result->class = strdup (class);
+
+ /*
+ * Vertex list
+ */
+ Malloc (result->points, V + F * 13, point);
+ result->npoints = 0;
+
+ result->nedges = P->E;
+ result->logical_faces = F;
+ result->logical_vertices = V;
+ result->density = P->D;
+ result->chi = P->chi;
+
+ for (i = 0; i < V; i++)
+ push_point (result, v[i]);
+
+ /*
+ * Auxiliary vertices (needed because current VRML browsers cannot handle
+ * non-simple polygons, i.e., ploygons with self intersections): Each
+ * non-simple face is assigned an auxiliary vertex. By connecting it to the
+ * rest of the vertices the face is triangulated. The circum-center is used
+ * for the regular star faces of uniform polyhedra. The in-center is used for
+ * the pentagram (#79) and hexagram (#77) of the high-density snub duals, and
+ * for the pentagrams (#40, #58) and hexagram (#52) of the stellated duals
+ * with configuration (....)/2. Finally, the self-intersection of the crossed
+ * parallelogram is used for duals with form p q r| with an even denominator.
+ *
+ * This method do not work for the hemi-duals, whose faces are not
+ * star-shaped and have two self-intersections each.
+ *
+ * Thus, for each face we need six auxiliary vertices: The self intersections
+ * and the terminal points of the truncations of the infinite edges. The
+ * ideal vertices are listed, but are not used by the face-list.
+ *
+ * Note that the face of the last dual (#80) is octagonal, and constists of
+ * two quadrilaterals of the infinite type.
+ */
+
+ if (*star && P->even != -1)
+ Malloc(hit, F, int);
+ for (i = 0; i < F; i++)
+ if ((!*star &&
+ (frac(P->n[P->ftype[i]]), frax.d != 1 && frax.d != frax.n - 1)) ||
+ (*star &&
+ P->K == 5 &&
+ (P->D > 30 ||
+ denominator (P->m[0]) != 1))) {
+ /* find the center of the face */
+ double h;
+ if (!*star && P->hemi && !P->ftype[i])
+ h = 0;
+ else
+ h = P->minr / dot(f[i],f[i]);
+ push_point(result, scale (h, f[i]));
+
+ } else if (*star && P->even != -1) {
+ /* find the self-intersection of a crossed parallelogram.
+ * hit is set if v0v1 intersects v2v3*/
+ Vector v0, v1, v2, v3, c0, c1, p;
+ double d0, d1;
+ v0 = v[P->incid[0][i]];
+ v1 = v[P->incid[1][i]];
+ v2 = v[P->incid[2][i]];
+ v3 = v[P->incid[3][i]];
+ d0 = sqrt(dot(diff(v0, v2), diff(v0, v2)));
+ d1 = sqrt(dot (diff(v1, v3), diff(v1, v3)));
+ c0 = scale(d1, sum(v0, v2));
+ c1 = scale(d0, sum(v1, v3));
+ p = scale(0.5 / (d0 + d1), sum(c0, c1));
+ push_point (result, p);
+ p = cross(diff(p, v2), diff(p, v3));
+ hit[i] = (dot(p, p) < 1e-6);
+ } else if (*star && P->hemi && P->index != last_uniform - 1) {
+ /* find the terminal points of the truncation and the
+ * self-intersections.
+ * v23 v0 v21
+ * | \ / \ / |
+ * | v0123 v0321 |
+ * | / \ / \ |
+ * v01 v2 v03
+ */
+ Vector v0, v1, v2, v3, v01, v03, v21, v23, v0123, v0321 ;
+ Vector u;
+ double t = 1.5;/* truncation adjustment factor */
+ j = !P->ftype[P->incid[0][i]];
+ v0 = v[P->incid[j][i]];/* real vertex */
+ v1 = v[P->incid[j+1][i]];/* ideal vertex (unit vector) */
+ v2 = v[P->incid[j+2][i]];/* real */
+ v3 = v[P->incid[(j+3)%4][i]];/* ideal */
+ /* compute intersections
+ * this uses the following linear algebra:
+ * v0123 = v0 + a v1 = v2 + b v3
+ * v0 x v3 + a (v1 x v3) = v2 x v3
+ * a (v1 x v3) = (v2 - v0) x v3
+ * a (v1 x v3) . (v1 x v3) = (v2 - v0) x v3 . (v1 x v3)
+ */
+ u = cross(v1, v3);
+ v0123 = sum(v0, scale(dot(cross(diff(v2, v0), v3), u) / dot(u,u),
+ v1));
+ v0321 = sum(v0, scale(dot(cross(diff(v0, v2), v1), u) / dot(u,u),
+ v3));
+ /* compute truncations */
+ v01 = sum(v0 , scale(t, diff(v0123, v0)));
+ v23 = sum(v2 , scale(t, diff(v0123, v2)));
+ v03 = sum(v0 , scale(t, diff(v0321, v0)));
+ v21 = sum(v2 , scale(t, diff(v0321, v2)));
+
+ push_point(result, v01);
+ push_point(result, v23);
+ push_point(result, v0123);
+ push_point(result, v03);
+ push_point(result, v21);
+ push_point(result, v0321);
+
+ } else if (*star && P->index == last_uniform - 1) {
+ /* find the terminal points of the truncation and the
+ * self-intersections.
+ * v23 v0 v21
+ * | \ / \ / |
+ * | v0123 v0721 |
+ * | / \ / \ |
+ * v01 v2 v07
+ *
+ * v65 v4 v67
+ * | \ / \ / |
+ * | v4365 v4567 |
+ * | / \ / \ |
+ * v43 v6 v45
+ */
+ Vector v0, v1, v2, v3, v4, v5, v6, v7, v01, v07, v21, v23;
+ Vector v43, v45, v65, v67, v0123, v0721, v4365, v4567;
+ double t = 1.5;/* truncation adjustment factor */
+ Vector u;
+ for (j = 0; j < 8; j++)
+ if (P->ftype[P->incid[j][i]] == 3)
+ break;
+ v0 = v[P->incid[j][i]];/* real {5/3} */
+ v1 = v[P->incid[(j+1)%8][i]];/* ideal */
+ v2 = v[P->incid[(j+2)%8][i]];/* real {3} */
+ v3 = v[P->incid[(j+3)%8][i]];/* ideal */
+ v4 = v[P->incid[(j+4)%8][i]];/* real {5/2} */
+ v5 = v[P->incid[(j+5)%8][i]];/* ideal */
+ v6 = v[P->incid[(j+6)%8][i]];/* real {3/2} */
+ v7 = v[P->incid[(j+7)%8][i]];/* ideal */
+ /* compute intersections */
+ u = cross(v1, v3);
+ v0123 = sum(v0, scale(dot(cross(diff(v2, v0), v3), u) / dot(u,u),
+ v1));
+ u = cross(v7, v1);
+ v0721 = sum(v0, scale(dot(cross(diff(v2, v0), v1), u) / dot(u,u),
+ v7));
+ u = cross(v5, v7);
+ v4567 = sum(v4, scale(dot(cross(diff(v6, v4), v7), u) / dot(u,u),
+ v5));
+ u = cross(v3, v5);
+ v4365 = sum(v4, scale(dot(cross(diff(v6, v4), v5), u) / dot(u,u),
+ v3));
+ /* compute truncations */
+ v01 = sum(v0 , scale(t, diff(v0123, v0)));
+ v23 = sum(v2 , scale(t, diff(v0123, v2)));
+ v07 = sum(v0 , scale(t, diff(v0721, v0)));
+ v21 = sum(v2 , scale(t, diff(v0721, v2)));
+ v45 = sum(v4 , scale(t, diff(v4567, v4)));
+ v67 = sum(v6 , scale(t, diff(v4567, v6)));
+ v43 = sum(v4 , scale(t, diff(v4365, v4)));
+ v65 = sum(v6 , scale(t, diff(v4365, v6)));
+
+ push_point(result, v01);
+ push_point(result, v23);
+ push_point(result, v0123);
+ push_point(result, v07);
+ push_point(result, v21);
+ push_point(result, v0721);
+ push_point(result, v45);
+ push_point(result, v67);
+ push_point(result, v4567);
+ push_point(result, v43);
+ push_point(result, v65);
+ push_point(result, v4365);
+ }
+
+ /*
+ * Face list:
+ * Each face is printed in a separate line, by listing the indices of its
+ * vertices. In the non-simple case, the polygon is represented by the
+ * triangulation, each triangle consists of two polyhedron vertices and one
+ * auxiliary vertex.
+ */
+ Malloc (result->faces, F * 10, face);
+ result->nfaces = 0;
+
+ ii = V;
+ facelets = 0;
+ for (i = 0; i < F; i++) {
+ if (*star) {
+ if (P->K == 5 &&
+ (P->D > 30 ||
+ denominator (P->m[0]) != 1)) {
+ for (j = 0; j < P->M - 1; j++) {
+ push_face3 (result, P->incid[j][i], P->incid[j+1][i], ii);
+ facelets++;
+ }
+
+ push_face3 (result, P->incid[j][i], P->incid[0][i], ii++);
+ facelets++;
+
+ } else if (P->even != -1) {
+ if (hit && hit[i]) {
+ push_face3 (result, P->incid[3][i], P->incid[0][i], ii);
+ push_face3 (result, P->incid[1][i], P->incid[2][i], ii);
+ } else {
+ push_face3 (result, P->incid[0][i], P->incid[1][i], ii);
+ push_face3 (result, P->incid[2][i], P->incid[3][i], ii);
+ }
+ ii++;
+ facelets += 2;
+
+ } else if (P->hemi && P->index != last_uniform - 1) {
+ j = !P->ftype[P->incid[0][i]];
+
+ push_face3 (result, ii, ii + 1, ii + 2);
+ push_face4 (result, P->incid[j][i], ii + 2, P->incid[j+2][i], ii + 5);
+ push_face3 (result, ii + 3, ii + 4, ii + 5);
+ ii += 6;
+ facelets += 3;
+ } else if (P->index == last_uniform - 1) {
+ for (j = 0; j < 8; j++)
+ if (P->ftype[P->incid[j][i]] == 3)
+ break;
+ push_face3 (result, ii, ii + 1, ii + 2);
+ push_face4 (result,
+ P->incid[j][i], ii + 2, P->incid[(j+2)%8][i], ii + 5);
+ push_face3 (result, ii + 3, ii + 4, ii + 5);
+
+ push_face3 (result, ii + 6, ii + 7, ii + 8);
+ push_face4 (result,
+ P->incid[(j+4)%8][i], ii + 8, P->incid[(j+6)%8][i],
+ ii + 11);
+ push_face3 (result, ii + 9, ii + 10, ii + 11);
+ ii += 12;
+ facelets += 6;
+ } else {
+
+ result->faces[result->nfaces].npoints = P->M;
+ Malloc (result->faces[result->nfaces].points, P->M, int);
+ for (j = 0; j < P->M; j++)
+ result->faces[result->nfaces].points[j] = P->incid[j][i];
+ result->nfaces++;
+ facelets++;
+ }
+ } else {
+ int split = (frac(P->n[P->ftype[i]]),
+ frax.d != 1 && frax.d != frax.n - 1);
+ for (j = 0; j < V; j++) {
+ for (k = 0; k < P->M; k++)
+ if (P->incid[k][j] == i)
+ break;
+ if (k != P->M)
+ break;
+ }
+ if (split) {
+ ll = j;
+ for (l = P->adj[k][j]; l != j; l = P->adj[k][l]) {
+ for (k = 0; k < P->M; k++)
+ if (P->incid[k][l] == i)
+ break;
+ if (P->adj[k][l] == ll)
+ k = mod(k + 1 , P->M);
+ push_face3 (result, ll, l, ii);
+ facelets++;
+ ll = l;
+ }
+ push_face3 (result, ll, j, ii++);
+ facelets++;
+
+ } else {
+
+ int *pp;
+ int pi = 0;
+ Malloc (pp, 100, int);
+
+ pp[pi++] = j;
+ ll = j;
+ for (l = P->adj[k][j]; l != j; l = P->adj[k][l]) {
+ for (k = 0; k < P->M; k++)
+ if (P->incid[k][l] == i)
+ break;
+ if (P->adj[k][l] == ll)
+ k = mod(k + 1 , P->M);
+ pp[pi++] = l;
+ ll = l;
+ }
+ result->faces[result->nfaces].npoints = pi;
+ result->faces[result->nfaces].points = pp;
+ result->nfaces++;
+ facelets++;
+ }
+ }
+ }
+
+ /*
+ * Face color indices - for polyhedra with multiple face types
+ * For non-simple faces, the index is repeated as many times as needed by the
+ * triangulation.
+ */
+ {
+ int ff = 0;
+ if (!*star && P->N != 1) {
+ for (i = 0; i < F; i++)
+ if (frac(P->n[P->ftype[i]]), frax.d == 1 || frax.d == frax.n - 1)
+ result->faces[ff++].color = P->ftype[i];
+ else
+ for (j = 0; j < frax.n; j++)
+ result->faces[ff++].color = P->ftype[i];
+ } else {
+ for (i = 0; i < facelets; i++)
+ result->faces[ff++].color = 0;
+ }
+ }
+
+ if (*star && P->even != -1)
+ free(hit);
+ free(v);
+ free(f);
+
+ return result;
+}
+
+
+
+/* External interface (jwz)
+ */
+
+void
+free_polyhedron (polyhedron *p)
+{
+ if (!p) return;
+ Free (p->wythoff);
+ Free (p->name);
+ Free (p->group);
+ Free (p->class);
+ if (p->faces)
+ {
+ int i;
+ for (i = 0; i < p->nfaces; i++)
+ Free (p->faces[i].points);
+ Free (p->faces);
+ }
+ Free (p);
+}
+
+
+int
+construct_polyhedra (polyhedron ***polyhedra_ret)
+{
+ double freeze = 0;
+ double azimuth = AZ;
+ double elevation = EL;
+ int index = 0;
+
+ int count = 0;
+ polyhedron **result;
+ Malloc (result, last_uniform * 2 + 3, polyhedron*);
+
+ while (index < last_uniform) {
+ char sym[4];
+ Polyhedron *P;
+
+ sprintf(sym, "#%d", index + 1);
+ if (!(P = kaleido(sym, 1, 0, 0, 0))) {
+ Err (strerror(errno));
+ }
+
+ result[count++] = construct_polyhedron (P, P->v, P->V, P->f, P->F,
+ P->name, P->dual_name,
+ P->class, "",
+ azimuth, elevation, freeze);
+
+ result[count++] = construct_polyhedron (P, P->f, P->F, P->v, P->V,
+ P->dual_name, P->name,
+ P->dual_class, "*",
+ azimuth, elevation, freeze);
+ polyfree(P);
+ index++;
+ }
+
+ *polyhedra_ret = result;
+ count++; /* leave room for teapot */
+ return count;
+}
diff --git a/hacks/glx/polyhedra.h b/hacks/glx/polyhedra.h
new file mode 100644
index 0000000..ace4ac7
--- /dev/null
+++ b/hacks/glx/polyhedra.h
@@ -0,0 +1,52 @@
+/* xscreensaver, Copyright (c) 2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __POLYHEDRA_H__
+#define __POLYHEDRA_H__
+
+typedef struct {
+ double x, y, z;
+} point;
+
+typedef struct {
+ int color;
+ int npoints;
+ int *points; /* indexes into point list */
+} face;
+
+typedef struct {
+
+ int number;
+ char *wythoff;
+ char *name;
+ char *dual;
+ char *config;
+ char *group;
+ char *class;
+
+ int nfaces;
+ int logical_faces;
+ int logical_vertices;
+ int nedges;
+ int npoints;
+ int density;
+ int chi;
+
+ point *points;
+ face *faces;
+
+} polyhedron;
+
+
+extern int construct_polyhedra (polyhedron ***polyhedra_ret);
+extern void free_polyhedron (polyhedron *p);
+
+#endif /* __POLYHEDRA_H__ */
diff --git a/hacks/glx/polyhedra.man b/hacks/glx/polyhedra.man
new file mode 100644
index 0000000..b4e1cca
--- /dev/null
+++ b/hacks/glx/polyhedra.man
@@ -0,0 +1,124 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+polyhedra - draws the 80 uniform polyhedra and their duals
+.SH SYNOPSIS
+.SH SYNOPSIS
+.B polyhedra
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIfloat\fP]
+[\-duration \fIseconds\fP]
+[\-no-wander]
+[\-spin \fIXYZ\fP]
+[\-wireframe]
+[\-no-titles]
+[\-which \fIname\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This program renders 160 different 3D solids, and displays some
+information about each. A new solid is chosen every few seconds.
+
+There are 75 uniform polyhedra, plus an inifinite number of
+prisms and antiprisms:
+
+ * Convex Uniform Polyhedra:
+ * Platonic solids (5)
+ * Archimedean solids (13)
+ * Convex prisms and antiprisms (2 infinite families)
+ * Nonconvex Uniform Polyhedra:
+ * Kepler-Poinsot polyhedra (4)
+ * Nonconvex uniform polyhedra (53)
+ * Nonconvex prisms, antiprisms, and crossed antiprisms
+ (3 infinite families)
+
+Representative samples of the prism sets brings the total to 80 solids.
+Including the \fIdual\fP of each brings the total up to 160. (To
+create the "dual" of a polyhedron, faces are replaced with vertices,
+and vertices with faces.)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-duration \fIseconds\fP
+How long before switching to a new polyhedron. Default 12 seconds.
+.TP 8
+.B \-wander | \-no-wander
+Whether the objects should wander around the screen.
+.TP 8
+.B \-spin [XYZ] | \-no-spin
+Which axes, if any, to spin around on.
+.TP 8
+.B \-titles | \-no-titles
+Whether to display text describing each object.
+.TP 8
+.B \-which \fIobject-name\fP
+Display only one particular object, identified by number, name, or
+Whthoff symbol.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH KEY BINDINGS
+When running in a window, you can rotate the object with the mouse.
+Also, the following keystrokes are defined:
+.TP 12
+.B SPC \fIor\fP TAB
+Select a new polyhedron at random.
+.TP 12
+.B + \fIor\fP >
+Select the next-higher-numbered polyhedron.
+.TP 12
+.B - \fIor\fP <
+Select the next-lower-numbered polyhedron.
+.TP 12
+.B ESC \fIor\fP ^C
+Quit.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1991-2002 Dr. Zvi Har'El.
+
+Copyright \(co 2004 Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Based on the program \fIkaleido\fP ("Kaleidoscopic construction of
+uniform polyhedra"), by Dr. Zvi Har'El <rl@math.technion.ac.il>
+ http://www.math.technion.ac.il/~rl/
+ ftp://ftp.math.technion.ac.il/kaleido/
+
+Adapted for OpenGL and XScreenSaver by Jamie Zawinski, 2004.
diff --git a/hacks/glx/polytopes.c b/hacks/glx/polytopes.c
new file mode 100644
index 0000000..76c1287
--- /dev/null
+++ b/hacks/glx/polytopes.c
@@ -0,0 +1,3189 @@
+/* polytopes --- Shows one of the six regular polytopes rotating in 4d */
+
+#if 0
+static const char sccsid[] = "@(#)polytopes.c 1.2 05/09/28 xlockmore";
+#endif
+
+/* Copyright (c) 2003-2009 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 03/08/10: Initial version
+ * C. Steger - 05/09/28: Added trackball support
+ * C. Steger - 07/01/23: Improved 4d trackball support
+ * C. Steger - 09/08/23: Removed check-config.pl warnings
+ */
+
+/*
+ * This program shows one of the six regular 4D polytopes rotating in 4D.
+ * Written by Carsten Steger, inspired by H.S.M Coxeter's book "Regular
+ * Polytopes", 3rd Edition, Dover Publications, Inc., 1973, and Thomas
+ * Banchoff's book "Beyond the Third Dimension: Geometry, Computer
+ * Graphics, and Higher Dimensions", Scientific American Library, 1990.
+ */
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define SQRT15OVER4 1.93649167310370844259 /* sqrt(15/4) */
+#define SQRT10OVER3 1.82574185835055371152 /* sqrt(10/3) */
+#define SQRT5OVER2 1.58113883008418966600 /* sqrt(5/2) */
+#define SQRT5OVER6 0.91287092917527685576 /* sqrt(5/6) */
+#define SQRT5OVER12 0.64549722436790281420 /* sqrt(5/12) */
+#define SQRT2 1.41421356237309504880 /* sqrt(2) */
+#define GOLDEN 1.61803398874989484820 /* (sqrt(5)+1)/2 */
+#define GOLDENINV 0.61803398874989484820 /* (sqrt(5)-1)/2 */
+#define SQRT2INV 0.70710678118654752440 /* sqrt(1/2) */
+#define GOLDEN2 1.14412280563536859520 /* ((sqrt(5)+1)/2)/sqrt(2) */
+#define GOLDENINV2 0.43701602444882107080 /* ((sqrt(5)-1)/2)/sqrt(2) */
+#define GOLDEN22 1.85122958682191611960 /* (((sqrt(5)+1)/2)^2)/sqrt(2) */
+#define GOLDENINV22 0.27009075673772645360 /* (((sqrt(5)-1)/2)^2)/sqrt(2) */
+
+#define DISP_WIREFRAME 0
+#define DISP_SURFACE 1
+#define DISP_TRANSPARENT 2
+
+#define POLYTOPE_RANDOM -1
+#define POLYTOPE_5_CELL 0
+#define POLYTOPE_8_CELL 1
+#define POLYTOPE_16_CELL 2
+#define POLYTOPE_24_CELL 3
+#define POLYTOPE_120_CELL 4
+#define POLYTOPE_600_CELL 5
+#define POLYTOPE_LAST_CELL POLYTOPE_600_CELL
+
+#define COLORS_SINGLE 0
+#define COLORS_DEPTH 1
+
+#define DISP_3D_PERSPECTIVE 0
+#define DISP_3D_ORTHOGRAPHIC 1
+
+#define DISP_4D_PERSPECTIVE 0
+#define DISP_4D_PERSPECTIVE_STR "0"
+#define DISP_4D_ORTHOGRAPHIC 1
+#define DISP_4D_ORTHOGRAPHIC_STR "1"
+
+#define DEF_DISPLAY_MODE "transparent"
+#define DEF_POLYTOPE "random"
+#define DEF_COLORS "depth"
+#define DEF_PROJECTION_3D "perspective"
+#define DEF_PROJECTION_4D "perspective"
+#define DEF_SPEEDWX "1.1"
+#define DEF_SPEEDWY "1.3"
+#define DEF_SPEEDWZ "1.5"
+#define DEF_SPEEDXY "1.7"
+#define DEF_SPEEDXZ "1.9"
+#define DEF_SPEEDYZ "2.1"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 25000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_polytopes 0
+# define release_polytopes 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#ifndef HAVE_JWXYZ
+# include <X11/keysym.h>
+#endif
+#include "gltrackball.h"
+
+
+#ifdef USE_MODULES
+ModStruct polytopes_description =
+{"polytopes", "init_polytopes", "draw_polytopes", NULL,
+ "draw_polytopes", "change_polytopes", NULL, &polytopes_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows one of the six regular 4d polytopes rotating in 4d", 0, NULL};
+
+#endif
+
+
+static char *mode;
+static int display_mode;
+static char *poly_str;
+static int polytope;
+static char *color_str;
+static int color_mode;
+static char *proj_3d;
+static int projection_3d;
+static char *proj_4d;
+static int projection_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+
+static const float offset4d[4] = { 0.0, 0.0, 0.0, 3.0 };
+static const float offset3d[4] = { 0.0, 0.0, -2.0, 0.0 };
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-polytope", ".polytope", XrmoptionSepArg, 0 },
+ {"-random", ".polytope", XrmoptionNoArg, "random" },
+ {"-5-cell", ".polytope", XrmoptionNoArg, "5-cell" },
+ {"-8-cell", ".polytope", XrmoptionNoArg, "8-cell" },
+ {"-16-cell", ".polytope", XrmoptionNoArg, "16-cell" },
+ {"-24-cell", ".polytope", XrmoptionNoArg, "24-cell" },
+ {"-120-cell", ".polytope", XrmoptionNoArg, "120-cell" },
+ {"-600-cell", ".polytope", XrmoptionNoArg, "600-cell" },
+ {"-single-color", ".colors", XrmoptionNoArg, "single" },
+ {"-depth-colors", ".colors", XrmoptionNoArg, "depth" },
+ {"-perspective-3d", ".projection3d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-3d", ".projection3d", XrmoptionNoArg, "orthographic" },
+ {"-perspective-4d", ".projection4d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-4d", ".projection4d", XrmoptionNoArg, "orthographic" },
+ {"-speed-wx", ".speedwx", XrmoptionSepArg, 0 },
+ {"-speed-wy", ".speedwy", XrmoptionSepArg, 0 },
+ {"-speed-wz", ".speedwz", XrmoptionSepArg, 0 },
+ {"-speed-xy", ".speedxy", XrmoptionSepArg, 0 },
+ {"-speed-xz", ".speedxz", XrmoptionSepArg, 0 },
+ {"-speed-yz", ".speedyz", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] =
+{
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &poly_str, "polytope", "Polytope", DEF_POLYTOPE, t_String },
+ { &color_str, "colors", "Colors", DEF_COLORS, t_String },
+ { &proj_3d, "projection3d", "Projection3d",DEF_PROJECTION_3D, t_String },
+ { &proj_4d, "projection4d", "Projection4d",DEF_PROJECTION_4D, t_String },
+ { &speed_wx, "speedwx", "Speedwx", DEF_SPEEDWX, t_Float},
+ { &speed_wy, "speedwy", "Speedwy", DEF_SPEEDWY, t_Float},
+ { &speed_wz, "speedwz", "Speedwz", DEF_SPEEDWZ, t_Float},
+ { &speed_xy, "speedxy", "Speedxy", DEF_SPEEDXY, t_Float},
+ { &speed_xz, "speedxz", "Speedxz", DEF_SPEEDXZ, t_Float},
+ { &speed_yz, "speedyz", "Speedyz", DEF_SPEEDYZ, t_Float}
+};
+
+static OptionStruct desc[] =
+{
+ { "-wireframe", "display the polytope as a wireframe mesh" },
+ { "-surface", "display the polytope as a solid surface" },
+ { "-transparent", "display the polytope as a transparent surface" },
+ { "-solid", "display the polytope as a solid object" },
+ { "-bands", "display the polytope as see-through bands" },
+ { "-twosided", "display the polytope with two colors" },
+ { "-colorwheel", "display the polytope with a smooth color wheel" },
+ { "-perspective-3d", "project the polytope perspectively from 3d to 2d" },
+ { "-orthographic-3d", "project the polytope orthographically from 3d to 2d"},
+ { "-perspective-4d", "project the polytope perspectively from 4d to 3d" },
+ { "-orthographic-4d", "project the polytope orthographically from 4d to 3d"},
+ { "-speed-wx <arg>", "rotation speed around the wx plane" },
+ { "-speed-wy <arg>", "rotation speed around the wy plane" },
+ { "-speed-wz <arg>", "rotation speed around the wz plane" },
+ { "-speed-xy <arg>", "rotation speed around the xy plane" },
+ { "-speed-xz <arg>", "rotation speed around the xz plane" },
+ { "-speed-yz <arg>", "rotation speed around the yz plane" }
+};
+
+ENTRYPOINT ModeSpecOpt polytopes_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+
+/* 5-cell {3,3,3} */
+#define NUM_VERT_5 5
+#define NUM_EDGE_5 10
+#define NUM_FACE_5 10
+#define VERT_PER_FACE_5 3
+
+#define MIN_EDGE_DEPTH_5 (-0.5)
+#define MAX_EDGE_DEPTH_5 0.75
+#define MIN_FACE_DEPTH_5 (-0.5)
+#define MAX_FACE_DEPTH_5 (1.0/3.0)
+
+
+/* 8-cell {4,3,3} */
+#define NUM_VERT_8 16
+#define NUM_EDGE_8 32
+#define NUM_FACE_8 24
+#define VERT_PER_FACE_8 4
+
+#define MIN_EDGE_DEPTH_8 (-1.0)
+#define MAX_EDGE_DEPTH_8 1.0
+#define MIN_FACE_DEPTH_8 (-1.0)
+#define MAX_FACE_DEPTH_8 1.0
+
+/* 16-cell {3,3,4} */
+#define NUM_VERT_16 8
+#define NUM_EDGE_16 24
+#define NUM_FACE_16 32
+#define VERT_PER_FACE_16 3
+
+#define MIN_EDGE_DEPTH_16 (-1.0)
+#define MAX_EDGE_DEPTH_16 1.0
+#define MIN_FACE_DEPTH_16 (-2.0/3.0)
+#define MAX_FACE_DEPTH_16 (2.0/3.0)
+
+
+/* 24-cell {3,4,3} */
+#define NUM_VERT_24 24
+#define NUM_EDGE_24 96
+#define NUM_FACE_24 96
+#define VERT_PER_FACE_24 3
+
+#define MIN_EDGE_DEPTH_24 (-SQRT2)
+#define MAX_EDGE_DEPTH_24 SQRT2
+#define MIN_FACE_DEPTH_24 (-SQRT2)
+#define MAX_FACE_DEPTH_24 SQRT2
+
+
+/* 120-cell {5,3,3} */
+#define NUM_VERT_120 600
+#define NUM_EDGE_120 1200
+#define NUM_FACE_120 720
+#define VERT_PER_FACE_120 5
+
+#define MIN_EDGE_DEPTH_120 (-GOLDEN22)
+#define MAX_EDGE_DEPTH_120 GOLDEN22
+#define MIN_FACE_DEPTH_120 (-GOLDEN22)
+#define MAX_FACE_DEPTH_120 GOLDEN22
+
+
+/* 600-cell {3,3,5} */
+#define NUM_VERT_600 120
+#define NUM_EDGE_600 720
+#define NUM_FACE_600 1200
+#define VERT_PER_FACE_600 3
+
+#define MIN_EDGE_DEPTH_600 (-GOLDEN/2.0-1)
+#define MAX_EDGE_DEPTH_600 (GOLDEN/2.0+1)
+#define MIN_FACE_DEPTH_600 ((-2*GOLDEN-2)/3.0)
+#define MAX_FACE_DEPTH_600 ((2*GOLDEN+2)/3.0)
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* 4D rotation angles */
+ float alpha, beta, delta, zeta, eta, theta;
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Counter */
+ int tick, poly;
+ /* Trackball states */
+ trackball_state *trackballs[2];
+ int current_trackball;
+ Bool button_pressed;
+
+ float edge_color_5[NUM_EDGE_5][4];
+ float face_color_5[NUM_FACE_5][4];
+ float face_color_trans_5[NUM_FACE_5][4];
+
+ float edge_color_8[NUM_EDGE_8][4];
+ float face_color_8[NUM_FACE_8][4];
+ float face_color_trans_8[NUM_FACE_8][4];
+
+ float edge_color_16[NUM_EDGE_16][4];
+ float face_color_16[NUM_FACE_16][4];
+ float face_color_trans_16[NUM_FACE_16][4];
+
+ float edge_color_24[NUM_EDGE_24][4];
+ float face_color_24[NUM_FACE_24][4];
+ float face_color_trans_24[NUM_FACE_24][4];
+
+ float edge_color_120[NUM_EDGE_120][4];
+ float face_color_120[NUM_FACE_120][4];
+ float face_color_trans_120[NUM_FACE_120][4];
+
+ float edge_color_600[NUM_EDGE_600][4];
+ float face_color_600[NUM_FACE_600][4];
+ float face_color_trans_600[NUM_FACE_600][4];
+
+ float speed_scale;
+
+} polytopesstruct;
+
+static polytopesstruct *poly = (polytopesstruct *) NULL;
+
+
+/* Vertex, edge, and face data for the six regular polytopes. All the
+ polytopes are constructed with coordinates chosen such that their 4d
+ circumsphere has a radius of 2. */
+
+static const float vert_5[NUM_VERT_5][4] = {
+ { -SQRT5OVER2, -SQRT5OVER6, -SQRT5OVER12, -0.5 },
+ { SQRT5OVER2, -SQRT5OVER6, -SQRT5OVER12, -0.5 },
+ { 0.0, SQRT10OVER3, -SQRT5OVER12, -0.5 },
+ { 0.0, 0.0, SQRT15OVER4, -0.5 },
+ { 0.0, 0.0, 0.0, 2.0 }
+};
+
+static const int edge_5[NUM_EDGE_5][2] = {
+ { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 1, 2 }, { 1, 3 }, { 1, 4 },
+ { 2, 3 }, { 2, 4 }, { 3, 4 }
+};
+
+static const int face_5[NUM_FACE_5][VERT_PER_FACE_5] = {
+ { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 2, 3 }, { 0, 2, 4 }, { 0, 3, 4 },
+ { 1, 2, 3 }, { 1, 2, 4 }, { 1, 3, 4 }, { 2, 3, 4 }
+};
+
+
+static const float vert_8[NUM_VERT_8][4] = {
+ { -1.0, -1.0, -1.0, -1.0 }, { 1.0, -1.0, -1.0, -1.0 },
+ { -1.0, 1.0, -1.0, -1.0 }, { 1.0, 1.0, -1.0, -1.0 },
+ { -1.0, -1.0, 1.0, -1.0 }, { 1.0, -1.0, 1.0, -1.0 },
+ { -1.0, 1.0, 1.0, -1.0 }, { 1.0, 1.0, 1.0, -1.0 },
+ { -1.0, -1.0, -1.0, 1.0 }, { 1.0, -1.0, -1.0, 1.0 },
+ { -1.0, 1.0, -1.0, 1.0 }, { 1.0, 1.0, -1.0, 1.0 },
+ { -1.0, -1.0, 1.0, 1.0 }, { 1.0, -1.0, 1.0, 1.0 },
+ { -1.0, 1.0, 1.0, 1.0 }, { 1.0, 1.0, 1.0, 1.0 }
+};
+
+static const int edge_8[NUM_EDGE_8][2] = {
+ { 0, 1 }, { 0, 2 }, { 0, 4 }, { 0, 8 }, { 1, 3 }, { 1, 5 },
+ { 1, 9 }, { 2, 3 }, { 2, 6 }, { 2, 10 }, { 3, 7 }, { 3, 11 },
+ { 4, 5 }, { 4, 6 }, { 4, 12 }, { 5, 7 }, { 5, 13 }, { 6, 7 },
+ { 6, 14 }, { 7, 15 }, { 8, 9 }, { 8, 10 }, { 8, 12 }, { 9, 11 },
+ { 9, 13 }, { 10, 11 }, { 10, 14 }, { 11, 15 }, { 12, 13 }, { 12, 14 },
+ { 13, 15 }, { 14, 15 }
+};
+
+static const int face_8[NUM_FACE_8][VERT_PER_FACE_8] = {
+ { 0, 1, 3, 2 }, { 0, 1, 5, 4 }, { 0, 1, 9, 8 },
+ { 0, 2, 6, 4 }, { 0, 2, 10, 8 }, { 0, 4, 12, 8 },
+ { 1, 3, 7, 5 }, { 1, 3, 11, 9 }, { 1, 5, 13, 9 },
+ { 2, 3, 7, 6 }, { 2, 3, 11, 10 }, { 2, 6, 14, 10 },
+ { 3, 7, 15, 11 }, { 4, 5, 7, 6 }, { 4, 5, 13, 12 },
+ { 4, 6, 14, 12 }, { 5, 7, 15, 13 }, { 6, 7, 15, 14 },
+ { 8, 9, 11, 10 }, { 8, 9, 13, 12 }, { 8, 10, 14, 12 },
+ { 9, 11, 15, 13 }, { 10, 11, 15, 14 }, { 12, 13, 15, 14 }
+};
+
+
+
+static const float vert_16[NUM_VERT_16][4] = {
+ { 0.0, 0.0, 0.0, -2.0 }, { 0.0, 0.0, -2.0, 0.0 },
+ { 0.0, -2.0, 0.0, 0.0 }, { -2.0, 0.0, 0.0, 0.0 },
+ { 2.0, 0.0, 0.0, 0.0 }, { 0.0, 2.0, 0.0, 0.0 },
+ { 0.0, 0.0, 2.0, 0.0 }, { 0.0, 0.0, 0.0, 2.0 }
+};
+
+static const int edge_16[NUM_EDGE_16][2] = {
+ { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 0, 5 }, { 0, 6 }, { 1, 2 },
+ { 1, 3 }, { 1, 4 }, { 1, 5 }, { 1, 7 }, { 2, 3 }, { 2, 4 }, { 2, 6 },
+ { 2, 7 }, { 3, 5 }, { 3, 6 }, { 3, 7 }, { 4, 5 }, { 4, 6 }, { 4, 7 },
+ { 5, 6 }, { 5, 7 }, { 6, 7 }
+};
+
+static const int face_16[NUM_FACE_16][VERT_PER_FACE_16] = {
+ { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 1, 5 }, { 0, 2, 3 }, { 0, 2, 4 },
+ { 0, 2, 6 }, { 0, 3, 5 }, { 0, 3, 6 }, { 0, 4, 5 }, { 0, 4, 6 }, { 0, 5, 6 },
+ { 1, 2, 3 }, { 1, 2, 4 }, { 1, 2, 7 }, { 1, 3, 5 }, { 1, 3, 7 }, { 1, 4, 5 },
+ { 1, 4, 7 }, { 1, 5, 7 }, { 2, 3, 6 }, { 2, 3, 7 }, { 2, 4, 6 }, { 2, 4, 7 },
+ { 2, 6, 7 }, { 3, 5, 6 }, { 3, 5, 7 }, { 3, 6, 7 }, { 4, 5, 6 }, { 4, 5, 7 },
+ { 4, 6, 7 }, { 5, 6, 7 }
+};
+
+
+
+static const float vert_24[NUM_VERT_24][4] = {
+ { 0.0, 0.0, -SQRT2, -SQRT2 }, { 0.0, -SQRT2, 0.0, -SQRT2 },
+ { -SQRT2, 0.0, 0.0, -SQRT2 }, { SQRT2, 0.0, 0.0, -SQRT2 },
+ { 0.0, SQRT2, 0.0, -SQRT2 }, { 0.0, 0.0, SQRT2, -SQRT2 },
+ { 0.0, -SQRT2, -SQRT2, 0.0 }, { -SQRT2, 0.0, -SQRT2, 0.0 },
+ { SQRT2, 0.0, -SQRT2, 0.0 }, { 0.0, SQRT2, -SQRT2, 0.0 },
+ { -SQRT2, -SQRT2, 0.0, 0.0 }, { SQRT2, -SQRT2, 0.0, 0.0 },
+ { -SQRT2, SQRT2, 0.0, 0.0 }, { SQRT2, SQRT2, 0.0, 0.0 },
+ { 0.0, -SQRT2, SQRT2, 0.0 }, { -SQRT2, 0.0, SQRT2, 0.0 },
+ { SQRT2, 0.0, SQRT2, 0.0 }, { 0.0, SQRT2, SQRT2, 0.0 },
+ { 0.0, 0.0, -SQRT2, SQRT2 }, { 0.0, -SQRT2, 0.0, SQRT2 },
+ { -SQRT2, 0.0, 0.0, SQRT2 }, { SQRT2, 0.0, 0.0, SQRT2 },
+ { 0.0, SQRT2, 0.0, SQRT2 }, { 0.0, 0.0, SQRT2, SQRT2 }
+};
+
+static const int edge_24[NUM_EDGE_24][2] = {
+ { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 0, 6 }, { 0, 7 },
+ { 0, 8 }, { 0, 9 }, { 1, 2 }, { 1, 3 }, { 1, 5 }, { 1, 6 },
+ { 1, 10 }, { 1, 11 }, { 1, 14 }, { 2, 4 }, { 2, 5 }, { 2, 7 },
+ { 2, 10 }, { 2, 12 }, { 2, 15 }, { 3, 4 }, { 3, 5 }, { 3, 8 },
+ { 3, 11 }, { 3, 13 }, { 3, 16 }, { 4, 5 }, { 4, 9 }, { 4, 12 },
+ { 4, 13 }, { 4, 17 }, { 5, 14 }, { 5, 15 }, { 5, 16 }, { 5, 17 },
+ { 6, 7 }, { 6, 8 }, { 6, 10 }, { 6, 11 }, { 6, 18 }, { 6, 19 },
+ { 7, 9 }, { 7, 10 }, { 7, 12 }, { 7, 18 }, { 7, 20 }, { 8, 9 },
+ { 8, 11 }, { 8, 13 }, { 8, 18 }, { 8, 21 }, { 9, 12 }, { 9, 13 },
+ { 9, 18 }, { 9, 22 }, { 10, 14 }, { 10, 15 }, { 10, 19 }, { 10, 20 },
+ { 11, 14 }, { 11, 16 }, { 11, 19 }, { 11, 21 }, { 12, 15 }, { 12, 17 },
+ { 12, 20 }, { 12, 22 }, { 13, 16 }, { 13, 17 }, { 13, 21 }, { 13, 22 },
+ { 14, 15 }, { 14, 16 }, { 14, 19 }, { 14, 23 }, { 15, 17 }, { 15, 20 },
+ { 15, 23 }, { 16, 17 }, { 16, 21 }, { 16, 23 }, { 17, 22 }, { 17, 23 },
+ { 18, 19 }, { 18, 20 }, { 18, 21 }, { 18, 22 }, { 19, 20 }, { 19, 21 },
+ { 19, 23 }, { 20, 22 }, { 20, 23 }, { 21, 22 }, { 21, 23 }, { 22, 23 }
+};
+
+static const int face_24[NUM_FACE_24][VERT_PER_FACE_24] = {
+ { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 6 }, { 0, 2, 4 },
+ { 0, 2, 7 }, { 0, 3, 4 }, { 0, 3, 8 }, { 0, 4, 9 },
+ { 0, 6, 7 }, { 0, 6, 8 }, { 0, 7, 9 }, { 0, 8, 9 },
+ { 1, 2, 5 }, { 1, 2, 10 }, { 1, 3, 5 }, { 1, 3, 11 },
+ { 1, 5, 14 }, { 1, 6, 10 }, { 1, 6, 11 }, { 1, 10, 14 },
+ { 1, 11, 14 }, { 2, 4, 5 }, { 2, 4, 12 }, { 2, 5, 15 },
+ { 2, 7, 10 }, { 2, 7, 12 }, { 2, 10, 15 }, { 2, 12, 15 },
+ { 3, 4, 5 }, { 3, 4, 13 }, { 3, 5, 16 }, { 3, 8, 11 },
+ { 3, 8, 13 }, { 3, 11, 16 }, { 3, 13, 16 }, { 4, 5, 17 },
+ { 4, 9, 12 }, { 4, 9, 13 }, { 4, 12, 17 }, { 4, 13, 17 },
+ { 5, 14, 15 }, { 5, 14, 16 }, { 5, 15, 17 }, { 5, 16, 17 },
+ { 6, 7, 10 }, { 6, 7, 18 }, { 6, 8, 11 }, { 6, 8, 18 },
+ { 6, 10, 19 }, { 6, 11, 19 }, { 6, 18, 19 }, { 7, 9, 12 },
+ { 7, 9, 18 }, { 7, 10, 20 }, { 7, 12, 20 }, { 7, 18, 20 },
+ { 8, 9, 13 }, { 8, 9, 18 }, { 8, 11, 21 }, { 8, 13, 21 },
+ { 8, 18, 21 }, { 9, 12, 22 }, { 9, 13, 22 }, { 9, 18, 22 },
+ { 10, 14, 15 }, { 10, 14, 19 }, { 10, 15, 20 }, { 10, 19, 20 },
+ { 11, 14, 16 }, { 11, 14, 19 }, { 11, 16, 21 }, { 11, 19, 21 },
+ { 12, 15, 17 }, { 12, 15, 20 }, { 12, 17, 22 }, { 12, 20, 22 },
+ { 13, 16, 17 }, { 13, 16, 21 }, { 13, 17, 22 }, { 13, 21, 22 },
+ { 14, 15, 23 }, { 14, 16, 23 }, { 14, 19, 23 }, { 15, 17, 23 },
+ { 15, 20, 23 }, { 16, 17, 23 }, { 16, 21, 23 }, { 17, 22, 23 },
+ { 18, 19, 20 }, { 18, 19, 21 }, { 18, 20, 22 }, { 18, 21, 22 },
+ { 19, 20, 23 }, { 19, 21, 23 }, { 20, 22, 23 }, { 21, 22, 23 }
+};
+
+
+
+
+static const float vert_120[NUM_VERT_120][4] = {
+ { -GOLDENINV22, 0.0, -SQRT2INV, -GOLDEN22 },
+ { GOLDENINV22, 0.0, -SQRT2INV, -GOLDEN22 },
+ { -GOLDENINV2, -GOLDENINV2, -GOLDENINV2, -GOLDEN22 },
+ { GOLDENINV2, -GOLDENINV2, -GOLDENINV2, -GOLDEN22 },
+ { -GOLDENINV2, GOLDENINV2, -GOLDENINV2, -GOLDEN22 },
+ { GOLDENINV2, GOLDENINV2, -GOLDENINV2, -GOLDEN22 },
+ { 0.0, -SQRT2INV, -GOLDENINV22, -GOLDEN22 },
+ { 0.0, SQRT2INV, -GOLDENINV22, -GOLDEN22 },
+ { -SQRT2INV, -GOLDENINV22, 0.0, -GOLDEN22 },
+ { SQRT2INV, -GOLDENINV22, 0.0, -GOLDEN22 },
+ { -SQRT2INV, GOLDENINV22, 0.0, -GOLDEN22 },
+ { SQRT2INV, GOLDENINV22, 0.0, -GOLDEN22 },
+ { 0.0, -SQRT2INV, GOLDENINV22, -GOLDEN22 },
+ { 0.0, SQRT2INV, GOLDENINV22, -GOLDEN22 },
+ { -GOLDENINV2, -GOLDENINV2, GOLDENINV2, -GOLDEN22 },
+ { GOLDENINV2, -GOLDENINV2, GOLDENINV2, -GOLDEN22 },
+ { -GOLDENINV2, GOLDENINV2, GOLDENINV2, -GOLDEN22 },
+ { GOLDENINV2, GOLDENINV2, GOLDENINV2, -GOLDEN22 },
+ { -GOLDENINV22, 0.0, SQRT2INV, -GOLDEN22 },
+ { GOLDENINV22, 0.0, SQRT2INV, -GOLDEN22 },
+ { -GOLDENINV2, 0.0, -GOLDEN2, -SQRT5OVER2 },
+ { GOLDENINV2, 0.0, -GOLDEN2, -SQRT5OVER2 },
+ { -SQRT2INV, -SQRT2INV, -SQRT2INV, -SQRT5OVER2 },
+ { SQRT2INV, -SQRT2INV, -SQRT2INV, -SQRT5OVER2 },
+ { -SQRT2INV, SQRT2INV, -SQRT2INV, -SQRT5OVER2 },
+ { SQRT2INV, SQRT2INV, -SQRT2INV, -SQRT5OVER2 },
+ { 0.0, -GOLDEN2, -GOLDENINV2, -SQRT5OVER2 },
+ { 0.0, GOLDEN2, -GOLDENINV2, -SQRT5OVER2 },
+ { -GOLDEN2, -GOLDENINV2, 0.0, -SQRT5OVER2 },
+ { GOLDEN2, -GOLDENINV2, 0.0, -SQRT5OVER2 },
+ { -GOLDEN2, GOLDENINV2, 0.0, -SQRT5OVER2 },
+ { GOLDEN2, GOLDENINV2, 0.0, -SQRT5OVER2 },
+ { 0.0, -GOLDEN2, GOLDENINV2, -SQRT5OVER2 },
+ { 0.0, GOLDEN2, GOLDENINV2, -SQRT5OVER2 },
+ { -SQRT2INV, -SQRT2INV, SQRT2INV, -SQRT5OVER2 },
+ { SQRT2INV, -SQRT2INV, SQRT2INV, -SQRT5OVER2 },
+ { -SQRT2INV, SQRT2INV, SQRT2INV, -SQRT5OVER2 },
+ { SQRT2INV, SQRT2INV, SQRT2INV, -SQRT5OVER2 },
+ { -GOLDENINV2, 0.0, GOLDEN2, -SQRT5OVER2 },
+ { GOLDENINV2, 0.0, GOLDEN2, -SQRT5OVER2 },
+ { 0.0, 0.0, -SQRT2, -SQRT2 },
+ { -SQRT2INV, -GOLDENINV2, -GOLDEN2, -SQRT2 },
+ { SQRT2INV, -GOLDENINV2, -GOLDEN2, -SQRT2 },
+ { -SQRT2INV, GOLDENINV2, -GOLDEN2, -SQRT2 },
+ { SQRT2INV, GOLDENINV2, -GOLDEN2, -SQRT2 },
+ { -GOLDENINV2, -GOLDEN2, -SQRT2INV, -SQRT2 },
+ { GOLDENINV2, -GOLDEN2, -SQRT2INV, -SQRT2 },
+ { -GOLDENINV2, GOLDEN2, -SQRT2INV, -SQRT2 },
+ { GOLDENINV2, GOLDEN2, -SQRT2INV, -SQRT2 },
+ { -GOLDEN2, -SQRT2INV, -GOLDENINV2, -SQRT2 },
+ { GOLDEN2, -SQRT2INV, -GOLDENINV2, -SQRT2 },
+ { -GOLDEN2, SQRT2INV, -GOLDENINV2, -SQRT2 },
+ { GOLDEN2, SQRT2INV, -GOLDENINV2, -SQRT2 },
+ { 0.0, -SQRT2, 0.0, -SQRT2 },
+ { -SQRT2, 0.0, 0.0, -SQRT2 },
+ { SQRT2, 0.0, 0.0, -SQRT2 },
+ { 0.0, SQRT2, 0.0, -SQRT2 },
+ { -GOLDEN2, -SQRT2INV, GOLDENINV2, -SQRT2 },
+ { GOLDEN2, -SQRT2INV, GOLDENINV2, -SQRT2 },
+ { -GOLDEN2, SQRT2INV, GOLDENINV2, -SQRT2 },
+ { GOLDEN2, SQRT2INV, GOLDENINV2, -SQRT2 },
+ { -GOLDENINV2, -GOLDEN2, SQRT2INV, -SQRT2 },
+ { GOLDENINV2, -GOLDEN2, SQRT2INV, -SQRT2 },
+ { -GOLDENINV2, GOLDEN2, SQRT2INV, -SQRT2 },
+ { GOLDENINV2, GOLDEN2, SQRT2INV, -SQRT2 },
+ { -SQRT2INV, -GOLDENINV2, GOLDEN2, -SQRT2 },
+ { SQRT2INV, -GOLDENINV2, GOLDEN2, -SQRT2 },
+ { -SQRT2INV, GOLDENINV2, GOLDEN2, -SQRT2 },
+ { SQRT2INV, GOLDENINV2, GOLDEN2, -SQRT2 },
+ { 0.0, 0.0, SQRT2, -SQRT2 },
+ { 0.0, -GOLDENINV2, -SQRT5OVER2, -GOLDEN2 },
+ { 0.0, GOLDENINV2, -SQRT5OVER2, -GOLDEN2 },
+ { -GOLDENINV2, -SQRT2INV, -SQRT2, -GOLDEN2 },
+ { GOLDENINV2, -SQRT2INV, -SQRT2, -GOLDEN2 },
+ { -GOLDENINV2, SQRT2INV, -SQRT2, -GOLDEN2 },
+ { GOLDENINV2, SQRT2INV, -SQRT2, -GOLDEN2 },
+ { -GOLDENINV22, -GOLDEN2, -GOLDEN2, -GOLDEN2 },
+ { GOLDENINV22, -GOLDEN2, -GOLDEN2, -GOLDEN2 },
+ { -GOLDEN2, -GOLDENINV22, -GOLDEN2, -GOLDEN2 },
+ { GOLDEN2, -GOLDENINV22, -GOLDEN2, -GOLDEN2 },
+ { -GOLDEN2, GOLDENINV22, -GOLDEN2, -GOLDEN2 },
+ { GOLDEN2, GOLDENINV22, -GOLDEN2, -GOLDEN2 },
+ { -GOLDENINV22, GOLDEN2, -GOLDEN2, -GOLDEN2 },
+ { GOLDENINV22, GOLDEN2, -GOLDEN2, -GOLDEN2 },
+ { -SQRT2, -GOLDENINV2, -SQRT2INV, -GOLDEN2 },
+ { SQRT2, -GOLDENINV2, -SQRT2INV, -GOLDEN2 },
+ { -SQRT2, GOLDENINV2, -SQRT2INV, -GOLDEN2 },
+ { SQRT2, GOLDENINV2, -SQRT2INV, -GOLDEN2 },
+ { -SQRT2INV, -SQRT2, -GOLDENINV2, -GOLDEN2 },
+ { SQRT2INV, -SQRT2, -GOLDENINV2, -GOLDEN2 },
+ { -SQRT5OVER2, 0.0, -GOLDENINV2, -GOLDEN2 },
+ { SQRT5OVER2, 0.0, -GOLDENINV2, -GOLDEN2 },
+ { -SQRT2INV, SQRT2, -GOLDENINV2, -GOLDEN2 },
+ { SQRT2INV, SQRT2, -GOLDENINV2, -GOLDEN2 },
+ { -GOLDEN2, -GOLDEN2, -GOLDENINV22, -GOLDEN2 },
+ { GOLDEN2, -GOLDEN2, -GOLDENINV22, -GOLDEN2 },
+ { -GOLDEN2, GOLDEN2, -GOLDENINV22, -GOLDEN2 },
+ { GOLDEN2, GOLDEN2, -GOLDENINV22, -GOLDEN2 },
+ { -GOLDENINV2, -SQRT5OVER2, 0.0, -GOLDEN2 },
+ { GOLDENINV2, -SQRT5OVER2, 0.0, -GOLDEN2 },
+ { -GOLDENINV2, SQRT5OVER2, 0.0, -GOLDEN2 },
+ { GOLDENINV2, SQRT5OVER2, 0.0, -GOLDEN2 },
+ { -GOLDEN2, -GOLDEN2, GOLDENINV22, -GOLDEN2 },
+ { GOLDEN2, -GOLDEN2, GOLDENINV22, -GOLDEN2 },
+ { -GOLDEN2, GOLDEN2, GOLDENINV22, -GOLDEN2 },
+ { GOLDEN2, GOLDEN2, GOLDENINV22, -GOLDEN2 },
+ { -SQRT2INV, -SQRT2, GOLDENINV2, -GOLDEN2 },
+ { SQRT2INV, -SQRT2, GOLDENINV2, -GOLDEN2 },
+ { -SQRT5OVER2, 0.0, GOLDENINV2, -GOLDEN2 },
+ { SQRT5OVER2, 0.0, GOLDENINV2, -GOLDEN2 },
+ { -SQRT2INV, SQRT2, GOLDENINV2, -GOLDEN2 },
+ { SQRT2INV, SQRT2, GOLDENINV2, -GOLDEN2 },
+ { -SQRT2, -GOLDENINV2, SQRT2INV, -GOLDEN2 },
+ { SQRT2, -GOLDENINV2, SQRT2INV, -GOLDEN2 },
+ { -SQRT2, GOLDENINV2, SQRT2INV, -GOLDEN2 },
+ { SQRT2, GOLDENINV2, SQRT2INV, -GOLDEN2 },
+ { -GOLDENINV22, -GOLDEN2, GOLDEN2, -GOLDEN2 },
+ { GOLDENINV22, -GOLDEN2, GOLDEN2, -GOLDEN2 },
+ { -GOLDEN2, -GOLDENINV22, GOLDEN2, -GOLDEN2 },
+ { GOLDEN2, -GOLDENINV22, GOLDEN2, -GOLDEN2 },
+ { -GOLDEN2, GOLDENINV22, GOLDEN2, -GOLDEN2 },
+ { GOLDEN2, GOLDENINV22, GOLDEN2, -GOLDEN2 },
+ { -GOLDENINV22, GOLDEN2, GOLDEN2, -GOLDEN2 },
+ { GOLDENINV22, GOLDEN2, GOLDEN2, -GOLDEN2 },
+ { -GOLDENINV2, -SQRT2INV, SQRT2, -GOLDEN2 },
+ { GOLDENINV2, -SQRT2INV, SQRT2, -GOLDEN2 },
+ { -GOLDENINV2, SQRT2INV, SQRT2, -GOLDEN2 },
+ { GOLDENINV2, SQRT2INV, SQRT2, -GOLDEN2 },
+ { 0.0, -GOLDENINV2, SQRT5OVER2, -GOLDEN2 },
+ { 0.0, GOLDENINV2, SQRT5OVER2, -GOLDEN2 },
+ { 0.0, -GOLDENINV22, -GOLDEN22, -SQRT2INV },
+ { 0.0, GOLDENINV22, -GOLDEN22, -SQRT2INV },
+ { -SQRT2INV, -SQRT2INV, -SQRT5OVER2, -SQRT2INV },
+ { SQRT2INV, -SQRT2INV, -SQRT5OVER2, -SQRT2INV },
+ { -SQRT2INV, SQRT2INV, -SQRT5OVER2, -SQRT2INV },
+ { SQRT2INV, SQRT2INV, -SQRT5OVER2, -SQRT2INV },
+ { -GOLDEN2, -GOLDENINV2, -SQRT2, -SQRT2INV },
+ { GOLDEN2, -GOLDENINV2, -SQRT2, -SQRT2INV },
+ { -GOLDEN2, GOLDENINV2, -SQRT2, -SQRT2INV },
+ { GOLDEN2, GOLDENINV2, -SQRT2, -SQRT2INV },
+ { -GOLDENINV2, -SQRT2, -GOLDEN2, -SQRT2INV },
+ { GOLDENINV2, -SQRT2, -GOLDEN2, -SQRT2INV },
+ { -GOLDENINV2, SQRT2, -GOLDEN2, -SQRT2INV },
+ { GOLDENINV2, SQRT2, -GOLDEN2, -SQRT2INV },
+ { -SQRT2INV, -SQRT5OVER2, -SQRT2INV, -SQRT2INV },
+ { SQRT2INV, -SQRT5OVER2, -SQRT2INV, -SQRT2INV },
+ { -SQRT5OVER2, -SQRT2INV, -SQRT2INV, -SQRT2INV },
+ { SQRT5OVER2, -SQRT2INV, -SQRT2INV, -SQRT2INV },
+ { -SQRT5OVER2, SQRT2INV, -SQRT2INV, -SQRT2INV },
+ { SQRT5OVER2, SQRT2INV, -SQRT2INV, -SQRT2INV },
+ { -SQRT2INV, SQRT5OVER2, -SQRT2INV, -SQRT2INV },
+ { SQRT2INV, SQRT5OVER2, -SQRT2INV, -SQRT2INV },
+ { -SQRT2, -GOLDEN2, -GOLDENINV2, -SQRT2INV },
+ { SQRT2, -GOLDEN2, -GOLDENINV2, -SQRT2INV },
+ { -SQRT2, GOLDEN2, -GOLDENINV2, -SQRT2INV },
+ { SQRT2, GOLDEN2, -GOLDENINV2, -SQRT2INV },
+ { -GOLDEN22, 0.0, -GOLDENINV22, -SQRT2INV },
+ { GOLDEN22, 0.0, -GOLDENINV22, -SQRT2INV },
+ { -GOLDENINV22, -GOLDEN22, 0.0, -SQRT2INV },
+ { GOLDENINV22, -GOLDEN22, 0.0, -SQRT2INV },
+ { -GOLDENINV22, GOLDEN22, 0.0, -SQRT2INV },
+ { GOLDENINV22, GOLDEN22, 0.0, -SQRT2INV },
+ { -GOLDEN22, 0.0, GOLDENINV22, -SQRT2INV },
+ { GOLDEN22, 0.0, GOLDENINV22, -SQRT2INV },
+ { -SQRT2, -GOLDEN2, GOLDENINV2, -SQRT2INV },
+ { SQRT2, -GOLDEN2, GOLDENINV2, -SQRT2INV },
+ { -SQRT2, GOLDEN2, GOLDENINV2, -SQRT2INV },
+ { SQRT2, GOLDEN2, GOLDENINV2, -SQRT2INV },
+ { -SQRT2INV, -SQRT5OVER2, SQRT2INV, -SQRT2INV },
+ { SQRT2INV, -SQRT5OVER2, SQRT2INV, -SQRT2INV },
+ { -SQRT5OVER2, -SQRT2INV, SQRT2INV, -SQRT2INV },
+ { SQRT5OVER2, -SQRT2INV, SQRT2INV, -SQRT2INV },
+ { -SQRT5OVER2, SQRT2INV, SQRT2INV, -SQRT2INV },
+ { SQRT5OVER2, SQRT2INV, SQRT2INV, -SQRT2INV },
+ { -SQRT2INV, SQRT5OVER2, SQRT2INV, -SQRT2INV },
+ { SQRT2INV, SQRT5OVER2, SQRT2INV, -SQRT2INV },
+ { -GOLDENINV2, -SQRT2, GOLDEN2, -SQRT2INV },
+ { GOLDENINV2, -SQRT2, GOLDEN2, -SQRT2INV },
+ { -GOLDENINV2, SQRT2, GOLDEN2, -SQRT2INV },
+ { GOLDENINV2, SQRT2, GOLDEN2, -SQRT2INV },
+ { -GOLDEN2, -GOLDENINV2, SQRT2, -SQRT2INV },
+ { GOLDEN2, -GOLDENINV2, SQRT2, -SQRT2INV },
+ { -GOLDEN2, GOLDENINV2, SQRT2, -SQRT2INV },
+ { GOLDEN2, GOLDENINV2, SQRT2, -SQRT2INV },
+ { -SQRT2INV, -SQRT2INV, SQRT5OVER2, -SQRT2INV },
+ { SQRT2INV, -SQRT2INV, SQRT5OVER2, -SQRT2INV },
+ { -SQRT2INV, SQRT2INV, SQRT5OVER2, -SQRT2INV },
+ { SQRT2INV, SQRT2INV, SQRT5OVER2, -SQRT2INV },
+ { 0.0, -GOLDENINV22, GOLDEN22, -SQRT2INV },
+ { 0.0, GOLDENINV22, GOLDEN22, -SQRT2INV },
+ { -GOLDENINV2, -GOLDENINV2, -GOLDEN22, -GOLDENINV2 },
+ { GOLDENINV2, -GOLDENINV2, -GOLDEN22, -GOLDENINV2 },
+ { -GOLDENINV2, GOLDENINV2, -GOLDEN22, -GOLDENINV2 },
+ { GOLDENINV2, GOLDENINV2, -GOLDEN22, -GOLDENINV2 },
+ { -GOLDEN2, 0.0, -SQRT5OVER2, -GOLDENINV2 },
+ { GOLDEN2, 0.0, -SQRT5OVER2, -GOLDENINV2 },
+ { -SQRT2INV, -GOLDEN2, -SQRT2, -GOLDENINV2 },
+ { SQRT2INV, -GOLDEN2, -SQRT2, -GOLDENINV2 },
+ { -SQRT2INV, GOLDEN2, -SQRT2, -GOLDENINV2 },
+ { SQRT2INV, GOLDEN2, -SQRT2, -GOLDENINV2 },
+ { 0.0, -SQRT5OVER2, -GOLDEN2, -GOLDENINV2 },
+ { -SQRT2, -SQRT2INV, -GOLDEN2, -GOLDENINV2 },
+ { SQRT2, -SQRT2INV, -GOLDEN2, -GOLDENINV2 },
+ { -SQRT2, SQRT2INV, -GOLDEN2, -GOLDENINV2 },
+ { SQRT2, SQRT2INV, -GOLDEN2, -GOLDENINV2 },
+ { 0.0, SQRT5OVER2, -GOLDEN2, -GOLDENINV2 },
+ { -GOLDEN2, -SQRT2, -SQRT2INV, -GOLDENINV2 },
+ { GOLDEN2, -SQRT2, -SQRT2INV, -GOLDENINV2 },
+ { -GOLDEN2, SQRT2, -SQRT2INV, -GOLDENINV2 },
+ { GOLDEN2, SQRT2, -SQRT2INV, -GOLDENINV2 },
+ { -GOLDENINV2, -GOLDEN22, -GOLDENINV2, -GOLDENINV2 },
+ { GOLDENINV2, -GOLDEN22, -GOLDENINV2, -GOLDENINV2 },
+ { -GOLDEN22, -GOLDENINV2, -GOLDENINV2, -GOLDENINV2 },
+ { GOLDEN22, -GOLDENINV2, -GOLDENINV2, -GOLDENINV2 },
+ { -GOLDEN22, GOLDENINV2, -GOLDENINV2, -GOLDENINV2 },
+ { GOLDEN22, GOLDENINV2, -GOLDENINV2, -GOLDENINV2 },
+ { -GOLDENINV2, GOLDEN22, -GOLDENINV2, -GOLDENINV2 },
+ { GOLDENINV2, GOLDEN22, -GOLDENINV2, -GOLDENINV2 },
+ { -SQRT5OVER2, -GOLDEN2, 0.0, -GOLDENINV2 },
+ { SQRT5OVER2, -GOLDEN2, 0.0, -GOLDENINV2 },
+ { -SQRT5OVER2, GOLDEN2, 0.0, -GOLDENINV2 },
+ { SQRT5OVER2, GOLDEN2, 0.0, -GOLDENINV2 },
+ { -GOLDENINV2, -GOLDEN22, GOLDENINV2, -GOLDENINV2 },
+ { GOLDENINV2, -GOLDEN22, GOLDENINV2, -GOLDENINV2 },
+ { -GOLDEN22, -GOLDENINV2, GOLDENINV2, -GOLDENINV2 },
+ { GOLDEN22, -GOLDENINV2, GOLDENINV2, -GOLDENINV2 },
+ { -GOLDEN22, GOLDENINV2, GOLDENINV2, -GOLDENINV2 },
+ { GOLDEN22, GOLDENINV2, GOLDENINV2, -GOLDENINV2 },
+ { -GOLDENINV2, GOLDEN22, GOLDENINV2, -GOLDENINV2 },
+ { GOLDENINV2, GOLDEN22, GOLDENINV2, -GOLDENINV2 },
+ { -GOLDEN2, -SQRT2, SQRT2INV, -GOLDENINV2 },
+ { GOLDEN2, -SQRT2, SQRT2INV, -GOLDENINV2 },
+ { -GOLDEN2, SQRT2, SQRT2INV, -GOLDENINV2 },
+ { GOLDEN2, SQRT2, SQRT2INV, -GOLDENINV2 },
+ { 0.0, -SQRT5OVER2, GOLDEN2, -GOLDENINV2 },
+ { -SQRT2, -SQRT2INV, GOLDEN2, -GOLDENINV2 },
+ { SQRT2, -SQRT2INV, GOLDEN2, -GOLDENINV2 },
+ { -SQRT2, SQRT2INV, GOLDEN2, -GOLDENINV2 },
+ { SQRT2, SQRT2INV, GOLDEN2, -GOLDENINV2 },
+ { 0.0, SQRT5OVER2, GOLDEN2, -GOLDENINV2 },
+ { -SQRT2INV, -GOLDEN2, SQRT2, -GOLDENINV2 },
+ { SQRT2INV, -GOLDEN2, SQRT2, -GOLDENINV2 },
+ { -SQRT2INV, GOLDEN2, SQRT2, -GOLDENINV2 },
+ { SQRT2INV, GOLDEN2, SQRT2, -GOLDENINV2 },
+ { -GOLDEN2, 0.0, SQRT5OVER2, -GOLDENINV2 },
+ { GOLDEN2, 0.0, SQRT5OVER2, -GOLDENINV2 },
+ { -GOLDENINV2, -GOLDENINV2, GOLDEN22, -GOLDENINV2 },
+ { GOLDENINV2, -GOLDENINV2, GOLDEN22, -GOLDENINV2 },
+ { -GOLDENINV2, GOLDENINV2, GOLDEN22, -GOLDENINV2 },
+ { GOLDENINV2, GOLDENINV2, GOLDEN22, -GOLDENINV2 },
+ { -SQRT2INV, 0.0, -GOLDEN22, -GOLDENINV22 },
+ { SQRT2INV, 0.0, -GOLDEN22, -GOLDENINV22 },
+ { -GOLDEN2, -GOLDEN2, -GOLDEN2, -GOLDENINV22 },
+ { GOLDEN2, -GOLDEN2, -GOLDEN2, -GOLDENINV22 },
+ { -GOLDEN2, GOLDEN2, -GOLDEN2, -GOLDENINV22 },
+ { GOLDEN2, GOLDEN2, -GOLDEN2, -GOLDENINV22 },
+ { 0.0, -GOLDEN22, -SQRT2INV, -GOLDENINV22 },
+ { 0.0, GOLDEN22, -SQRT2INV, -GOLDENINV22 },
+ { -GOLDEN22, -SQRT2INV, 0.0, -GOLDENINV22 },
+ { GOLDEN22, -SQRT2INV, 0.0, -GOLDENINV22 },
+ { -GOLDEN22, SQRT2INV, 0.0, -GOLDENINV22 },
+ { GOLDEN22, SQRT2INV, 0.0, -GOLDENINV22 },
+ { 0.0, -GOLDEN22, SQRT2INV, -GOLDENINV22 },
+ { 0.0, GOLDEN22, SQRT2INV, -GOLDENINV22 },
+ { -GOLDEN2, -GOLDEN2, GOLDEN2, -GOLDENINV22 },
+ { GOLDEN2, -GOLDEN2, GOLDEN2, -GOLDENINV22 },
+ { -GOLDEN2, GOLDEN2, GOLDEN2, -GOLDENINV22 },
+ { GOLDEN2, GOLDEN2, GOLDEN2, -GOLDENINV22 },
+ { -SQRT2INV, 0.0, GOLDEN22, -GOLDENINV22 },
+ { SQRT2INV, 0.0, GOLDEN22, -GOLDENINV22 },
+ { -GOLDENINV22, -SQRT2INV, -GOLDEN22, 0.0 },
+ { GOLDENINV22, -SQRT2INV, -GOLDEN22, 0.0 },
+ { -GOLDENINV22, SQRT2INV, -GOLDEN22, 0.0 },
+ { GOLDENINV22, SQRT2INV, -GOLDEN22, 0.0 },
+ { -GOLDENINV2, -GOLDEN2, -SQRT5OVER2, 0.0 },
+ { GOLDENINV2, -GOLDEN2, -SQRT5OVER2, 0.0 },
+ { -GOLDENINV2, GOLDEN2, -SQRT5OVER2, 0.0 },
+ { GOLDENINV2, GOLDEN2, -SQRT5OVER2, 0.0 },
+ { 0.0, -SQRT2, -SQRT2, 0.0 },
+ { -SQRT2, 0.0, -SQRT2, 0.0 },
+ { SQRT2, 0.0, -SQRT2, 0.0 },
+ { 0.0, SQRT2, -SQRT2, 0.0 },
+ { -SQRT5OVER2, -GOLDENINV2, -GOLDEN2, 0.0 },
+ { SQRT5OVER2, -GOLDENINV2, -GOLDEN2, 0.0 },
+ { -SQRT5OVER2, GOLDENINV2, -GOLDEN2, 0.0 },
+ { SQRT5OVER2, GOLDENINV2, -GOLDEN2, 0.0 },
+ { -GOLDEN22, -GOLDENINV22, -SQRT2INV, 0.0 },
+ { GOLDEN22, -GOLDENINV22, -SQRT2INV, 0.0 },
+ { -GOLDEN22, GOLDENINV22, -SQRT2INV, 0.0 },
+ { GOLDEN22, GOLDENINV22, -SQRT2INV, 0.0 },
+ { -GOLDEN2, -SQRT5OVER2, -GOLDENINV2, 0.0 },
+ { GOLDEN2, -SQRT5OVER2, -GOLDENINV2, 0.0 },
+ { -GOLDEN2, SQRT5OVER2, -GOLDENINV2, 0.0 },
+ { GOLDEN2, SQRT5OVER2, -GOLDENINV2, 0.0 },
+ { -SQRT2INV, -GOLDEN22, -GOLDENINV22, 0.0 },
+ { SQRT2INV, -GOLDEN22, -GOLDENINV22, 0.0 },
+ { -SQRT2INV, GOLDEN22, -GOLDENINV22, 0.0 },
+ { SQRT2INV, GOLDEN22, -GOLDENINV22, 0.0 },
+ { -SQRT2, -SQRT2, 0.0, 0.0 },
+ { SQRT2, -SQRT2, 0.0, 0.0 },
+ { -SQRT2, SQRT2, 0.0, 0.0 },
+ { SQRT2, SQRT2, 0.0, 0.0 },
+ { -SQRT2INV, -GOLDEN22, GOLDENINV22, 0.0 },
+ { SQRT2INV, -GOLDEN22, GOLDENINV22, 0.0 },
+ { -SQRT2INV, GOLDEN22, GOLDENINV22, 0.0 },
+ { SQRT2INV, GOLDEN22, GOLDENINV22, 0.0 },
+ { -GOLDEN2, -SQRT5OVER2, GOLDENINV2, 0.0 },
+ { GOLDEN2, -SQRT5OVER2, GOLDENINV2, 0.0 },
+ { -GOLDEN2, SQRT5OVER2, GOLDENINV2, 0.0 },
+ { GOLDEN2, SQRT5OVER2, GOLDENINV2, 0.0 },
+ { -GOLDEN22, -GOLDENINV22, SQRT2INV, 0.0 },
+ { GOLDEN22, -GOLDENINV22, SQRT2INV, 0.0 },
+ { -GOLDEN22, GOLDENINV22, SQRT2INV, 0.0 },
+ { GOLDEN22, GOLDENINV22, SQRT2INV, 0.0 },
+ { -SQRT5OVER2, -GOLDENINV2, GOLDEN2, 0.0 },
+ { SQRT5OVER2, -GOLDENINV2, GOLDEN2, 0.0 },
+ { -SQRT5OVER2, GOLDENINV2, GOLDEN2, 0.0 },
+ { SQRT5OVER2, GOLDENINV2, GOLDEN2, 0.0 },
+ { 0.0, -SQRT2, SQRT2, 0.0 },
+ { -SQRT2, 0.0, SQRT2, 0.0 },
+ { SQRT2, 0.0, SQRT2, 0.0 },
+ { 0.0, SQRT2, SQRT2, 0.0 },
+ { -GOLDENINV2, -GOLDEN2, SQRT5OVER2, 0.0 },
+ { GOLDENINV2, -GOLDEN2, SQRT5OVER2, 0.0 },
+ { -GOLDENINV2, GOLDEN2, SQRT5OVER2, 0.0 },
+ { GOLDENINV2, GOLDEN2, SQRT5OVER2, 0.0 },
+ { -GOLDENINV22, -SQRT2INV, GOLDEN22, 0.0 },
+ { GOLDENINV22, -SQRT2INV, GOLDEN22, 0.0 },
+ { -GOLDENINV22, SQRT2INV, GOLDEN22, 0.0 },
+ { GOLDENINV22, SQRT2INV, GOLDEN22, 0.0 },
+ { -SQRT2INV, 0.0, -GOLDEN22, GOLDENINV22 },
+ { SQRT2INV, 0.0, -GOLDEN22, GOLDENINV22 },
+ { -GOLDEN2, -GOLDEN2, -GOLDEN2, GOLDENINV22 },
+ { GOLDEN2, -GOLDEN2, -GOLDEN2, GOLDENINV22 },
+ { -GOLDEN2, GOLDEN2, -GOLDEN2, GOLDENINV22 },
+ { GOLDEN2, GOLDEN2, -GOLDEN2, GOLDENINV22 },
+ { 0.0, -GOLDEN22, -SQRT2INV, GOLDENINV22 },
+ { 0.0, GOLDEN22, -SQRT2INV, GOLDENINV22 },
+ { -GOLDEN22, -SQRT2INV, 0.0, GOLDENINV22 },
+ { GOLDEN22, -SQRT2INV, 0.0, GOLDENINV22 },
+ { -GOLDEN22, SQRT2INV, 0.0, GOLDENINV22 },
+ { GOLDEN22, SQRT2INV, 0.0, GOLDENINV22 },
+ { 0.0, -GOLDEN22, SQRT2INV, GOLDENINV22 },
+ { 0.0, GOLDEN22, SQRT2INV, GOLDENINV22 },
+ { -GOLDEN2, -GOLDEN2, GOLDEN2, GOLDENINV22 },
+ { GOLDEN2, -GOLDEN2, GOLDEN2, GOLDENINV22 },
+ { -GOLDEN2, GOLDEN2, GOLDEN2, GOLDENINV22 },
+ { GOLDEN2, GOLDEN2, GOLDEN2, GOLDENINV22 },
+ { -SQRT2INV, 0.0, GOLDEN22, GOLDENINV22 },
+ { SQRT2INV, 0.0, GOLDEN22, GOLDENINV22 },
+ { -GOLDENINV2, -GOLDENINV2, -GOLDEN22, GOLDENINV2 },
+ { GOLDENINV2, -GOLDENINV2, -GOLDEN22, GOLDENINV2 },
+ { -GOLDENINV2, GOLDENINV2, -GOLDEN22, GOLDENINV2 },
+ { GOLDENINV2, GOLDENINV2, -GOLDEN22, GOLDENINV2 },
+ { -GOLDEN2, 0.0, -SQRT5OVER2, GOLDENINV2 },
+ { GOLDEN2, 0.0, -SQRT5OVER2, GOLDENINV2 },
+ { -SQRT2INV, -GOLDEN2, -SQRT2, GOLDENINV2 },
+ { SQRT2INV, -GOLDEN2, -SQRT2, GOLDENINV2 },
+ { -SQRT2INV, GOLDEN2, -SQRT2, GOLDENINV2 },
+ { SQRT2INV, GOLDEN2, -SQRT2, GOLDENINV2 },
+ { 0.0, -SQRT5OVER2, -GOLDEN2, GOLDENINV2 },
+ { -SQRT2, -SQRT2INV, -GOLDEN2, GOLDENINV2 },
+ { SQRT2, -SQRT2INV, -GOLDEN2, GOLDENINV2 },
+ { -SQRT2, SQRT2INV, -GOLDEN2, GOLDENINV2 },
+ { SQRT2, SQRT2INV, -GOLDEN2, GOLDENINV2 },
+ { 0.0, SQRT5OVER2, -GOLDEN2, GOLDENINV2 },
+ { -GOLDEN2, -SQRT2, -SQRT2INV, GOLDENINV2 },
+ { GOLDEN2, -SQRT2, -SQRT2INV, GOLDENINV2 },
+ { -GOLDEN2, SQRT2, -SQRT2INV, GOLDENINV2 },
+ { GOLDEN2, SQRT2, -SQRT2INV, GOLDENINV2 },
+ { -GOLDENINV2, -GOLDEN22, -GOLDENINV2, GOLDENINV2 },
+ { GOLDENINV2, -GOLDEN22, -GOLDENINV2, GOLDENINV2 },
+ { -GOLDEN22, -GOLDENINV2, -GOLDENINV2, GOLDENINV2 },
+ { GOLDEN22, -GOLDENINV2, -GOLDENINV2, GOLDENINV2 },
+ { -GOLDEN22, GOLDENINV2, -GOLDENINV2, GOLDENINV2 },
+ { GOLDEN22, GOLDENINV2, -GOLDENINV2, GOLDENINV2 },
+ { -GOLDENINV2, GOLDEN22, -GOLDENINV2, GOLDENINV2 },
+ { GOLDENINV2, GOLDEN22, -GOLDENINV2, GOLDENINV2 },
+ { -SQRT5OVER2, -GOLDEN2, 0.0, GOLDENINV2 },
+ { SQRT5OVER2, -GOLDEN2, 0.0, GOLDENINV2 },
+ { -SQRT5OVER2, GOLDEN2, 0.0, GOLDENINV2 },
+ { SQRT5OVER2, GOLDEN2, 0.0, GOLDENINV2 },
+ { -GOLDENINV2, -GOLDEN22, GOLDENINV2, GOLDENINV2 },
+ { GOLDENINV2, -GOLDEN22, GOLDENINV2, GOLDENINV2 },
+ { -GOLDEN22, -GOLDENINV2, GOLDENINV2, GOLDENINV2 },
+ { GOLDEN22, -GOLDENINV2, GOLDENINV2, GOLDENINV2 },
+ { -GOLDEN22, GOLDENINV2, GOLDENINV2, GOLDENINV2 },
+ { GOLDEN22, GOLDENINV2, GOLDENINV2, GOLDENINV2 },
+ { -GOLDENINV2, GOLDEN22, GOLDENINV2, GOLDENINV2 },
+ { GOLDENINV2, GOLDEN22, GOLDENINV2, GOLDENINV2 },
+ { -GOLDEN2, -SQRT2, SQRT2INV, GOLDENINV2 },
+ { GOLDEN2, -SQRT2, SQRT2INV, GOLDENINV2 },
+ { -GOLDEN2, SQRT2, SQRT2INV, GOLDENINV2 },
+ { GOLDEN2, SQRT2, SQRT2INV, GOLDENINV2 },
+ { 0.0, -SQRT5OVER2, GOLDEN2, GOLDENINV2 },
+ { -SQRT2, -SQRT2INV, GOLDEN2, GOLDENINV2 },
+ { SQRT2, -SQRT2INV, GOLDEN2, GOLDENINV2 },
+ { -SQRT2, SQRT2INV, GOLDEN2, GOLDENINV2 },
+ { SQRT2, SQRT2INV, GOLDEN2, GOLDENINV2 },
+ { 0.0, SQRT5OVER2, GOLDEN2, GOLDENINV2 },
+ { -SQRT2INV, -GOLDEN2, SQRT2, GOLDENINV2 },
+ { SQRT2INV, -GOLDEN2, SQRT2, GOLDENINV2 },
+ { -SQRT2INV, GOLDEN2, SQRT2, GOLDENINV2 },
+ { SQRT2INV, GOLDEN2, SQRT2, GOLDENINV2 },
+ { -GOLDEN2, 0.0, SQRT5OVER2, GOLDENINV2 },
+ { GOLDEN2, 0.0, SQRT5OVER2, GOLDENINV2 },
+ { -GOLDENINV2, -GOLDENINV2, GOLDEN22, GOLDENINV2 },
+ { GOLDENINV2, -GOLDENINV2, GOLDEN22, GOLDENINV2 },
+ { -GOLDENINV2, GOLDENINV2, GOLDEN22, GOLDENINV2 },
+ { GOLDENINV2, GOLDENINV2, GOLDEN22, GOLDENINV2 },
+ { 0.0, -GOLDENINV22, -GOLDEN22, SQRT2INV },
+ { 0.0, GOLDENINV22, -GOLDEN22, SQRT2INV },
+ { -SQRT2INV, -SQRT2INV, -SQRT5OVER2, SQRT2INV },
+ { SQRT2INV, -SQRT2INV, -SQRT5OVER2, SQRT2INV },
+ { -SQRT2INV, SQRT2INV, -SQRT5OVER2, SQRT2INV },
+ { SQRT2INV, SQRT2INV, -SQRT5OVER2, SQRT2INV },
+ { -GOLDEN2, -GOLDENINV2, -SQRT2, SQRT2INV },
+ { GOLDEN2, -GOLDENINV2, -SQRT2, SQRT2INV },
+ { -GOLDEN2, GOLDENINV2, -SQRT2, SQRT2INV },
+ { GOLDEN2, GOLDENINV2, -SQRT2, SQRT2INV },
+ { -GOLDENINV2, -SQRT2, -GOLDEN2, SQRT2INV },
+ { GOLDENINV2, -SQRT2, -GOLDEN2, SQRT2INV },
+ { -GOLDENINV2, SQRT2, -GOLDEN2, SQRT2INV },
+ { GOLDENINV2, SQRT2, -GOLDEN2, SQRT2INV },
+ { -SQRT2INV, -SQRT5OVER2, -SQRT2INV, SQRT2INV },
+ { SQRT2INV, -SQRT5OVER2, -SQRT2INV, SQRT2INV },
+ { -SQRT5OVER2, -SQRT2INV, -SQRT2INV, SQRT2INV },
+ { SQRT5OVER2, -SQRT2INV, -SQRT2INV, SQRT2INV },
+ { -SQRT5OVER2, SQRT2INV, -SQRT2INV, SQRT2INV },
+ { SQRT5OVER2, SQRT2INV, -SQRT2INV, SQRT2INV },
+ { -SQRT2INV, SQRT5OVER2, -SQRT2INV, SQRT2INV },
+ { SQRT2INV, SQRT5OVER2, -SQRT2INV, SQRT2INV },
+ { -SQRT2, -GOLDEN2, -GOLDENINV2, SQRT2INV },
+ { SQRT2, -GOLDEN2, -GOLDENINV2, SQRT2INV },
+ { -SQRT2, GOLDEN2, -GOLDENINV2, SQRT2INV },
+ { SQRT2, GOLDEN2, -GOLDENINV2, SQRT2INV },
+ { -GOLDEN22, 0.0, -GOLDENINV22, SQRT2INV },
+ { GOLDEN22, 0.0, -GOLDENINV22, SQRT2INV },
+ { -GOLDENINV22, -GOLDEN22, 0.0, SQRT2INV },
+ { GOLDENINV22, -GOLDEN22, 0.0, SQRT2INV },
+ { -GOLDENINV22, GOLDEN22, 0.0, SQRT2INV },
+ { GOLDENINV22, GOLDEN22, 0.0, SQRT2INV },
+ { -GOLDEN22, 0.0, GOLDENINV22, SQRT2INV },
+ { GOLDEN22, 0.0, GOLDENINV22, SQRT2INV },
+ { -SQRT2, -GOLDEN2, GOLDENINV2, SQRT2INV },
+ { SQRT2, -GOLDEN2, GOLDENINV2, SQRT2INV },
+ { -SQRT2, GOLDEN2, GOLDENINV2, SQRT2INV },
+ { SQRT2, GOLDEN2, GOLDENINV2, SQRT2INV },
+ { -SQRT2INV, -SQRT5OVER2, SQRT2INV, SQRT2INV },
+ { SQRT2INV, -SQRT5OVER2, SQRT2INV, SQRT2INV },
+ { -SQRT5OVER2, -SQRT2INV, SQRT2INV, SQRT2INV },
+ { SQRT5OVER2, -SQRT2INV, SQRT2INV, SQRT2INV },
+ { -SQRT5OVER2, SQRT2INV, SQRT2INV, SQRT2INV },
+ { SQRT5OVER2, SQRT2INV, SQRT2INV, SQRT2INV },
+ { -SQRT2INV, SQRT5OVER2, SQRT2INV, SQRT2INV },
+ { SQRT2INV, SQRT5OVER2, SQRT2INV, SQRT2INV },
+ { -GOLDENINV2, -SQRT2, GOLDEN2, SQRT2INV },
+ { GOLDENINV2, -SQRT2, GOLDEN2, SQRT2INV },
+ { -GOLDENINV2, SQRT2, GOLDEN2, SQRT2INV },
+ { GOLDENINV2, SQRT2, GOLDEN2, SQRT2INV },
+ { -GOLDEN2, -GOLDENINV2, SQRT2, SQRT2INV },
+ { GOLDEN2, -GOLDENINV2, SQRT2, SQRT2INV },
+ { -GOLDEN2, GOLDENINV2, SQRT2, SQRT2INV },
+ { GOLDEN2, GOLDENINV2, SQRT2, SQRT2INV },
+ { -SQRT2INV, -SQRT2INV, SQRT5OVER2, SQRT2INV },
+ { SQRT2INV, -SQRT2INV, SQRT5OVER2, SQRT2INV },
+ { -SQRT2INV, SQRT2INV, SQRT5OVER2, SQRT2INV },
+ { SQRT2INV, SQRT2INV, SQRT5OVER2, SQRT2INV },
+ { 0.0, -GOLDENINV22, GOLDEN22, SQRT2INV },
+ { 0.0, GOLDENINV22, GOLDEN22, SQRT2INV },
+ { 0.0, -GOLDENINV2, -SQRT5OVER2, GOLDEN2 },
+ { 0.0, GOLDENINV2, -SQRT5OVER2, GOLDEN2 },
+ { -GOLDENINV2, -SQRT2INV, -SQRT2, GOLDEN2 },
+ { GOLDENINV2, -SQRT2INV, -SQRT2, GOLDEN2 },
+ { -GOLDENINV2, SQRT2INV, -SQRT2, GOLDEN2 },
+ { GOLDENINV2, SQRT2INV, -SQRT2, GOLDEN2 },
+ { -GOLDENINV22, -GOLDEN2, -GOLDEN2, GOLDEN2 },
+ { GOLDENINV22, -GOLDEN2, -GOLDEN2, GOLDEN2 },
+ { -GOLDEN2, -GOLDENINV22, -GOLDEN2, GOLDEN2 },
+ { GOLDEN2, -GOLDENINV22, -GOLDEN2, GOLDEN2 },
+ { -GOLDEN2, GOLDENINV22, -GOLDEN2, GOLDEN2 },
+ { GOLDEN2, GOLDENINV22, -GOLDEN2, GOLDEN2 },
+ { -GOLDENINV22, GOLDEN2, -GOLDEN2, GOLDEN2 },
+ { GOLDENINV22, GOLDEN2, -GOLDEN2, GOLDEN2 },
+ { -SQRT2, -GOLDENINV2, -SQRT2INV, GOLDEN2 },
+ { SQRT2, -GOLDENINV2, -SQRT2INV, GOLDEN2 },
+ { -SQRT2, GOLDENINV2, -SQRT2INV, GOLDEN2 },
+ { SQRT2, GOLDENINV2, -SQRT2INV, GOLDEN2 },
+ { -SQRT2INV, -SQRT2, -GOLDENINV2, GOLDEN2 },
+ { SQRT2INV, -SQRT2, -GOLDENINV2, GOLDEN2 },
+ { -SQRT5OVER2, 0.0, -GOLDENINV2, GOLDEN2 },
+ { SQRT5OVER2, 0.0, -GOLDENINV2, GOLDEN2 },
+ { -SQRT2INV, SQRT2, -GOLDENINV2, GOLDEN2 },
+ { SQRT2INV, SQRT2, -GOLDENINV2, GOLDEN2 },
+ { -GOLDEN2, -GOLDEN2, -GOLDENINV22, GOLDEN2 },
+ { GOLDEN2, -GOLDEN2, -GOLDENINV22, GOLDEN2 },
+ { -GOLDEN2, GOLDEN2, -GOLDENINV22, GOLDEN2 },
+ { GOLDEN2, GOLDEN2, -GOLDENINV22, GOLDEN2 },
+ { -GOLDENINV2, -SQRT5OVER2, 0.0, GOLDEN2 },
+ { GOLDENINV2, -SQRT5OVER2, 0.0, GOLDEN2 },
+ { -GOLDENINV2, SQRT5OVER2, 0.0, GOLDEN2 },
+ { GOLDENINV2, SQRT5OVER2, 0.0, GOLDEN2 },
+ { -GOLDEN2, -GOLDEN2, GOLDENINV22, GOLDEN2 },
+ { GOLDEN2, -GOLDEN2, GOLDENINV22, GOLDEN2 },
+ { -GOLDEN2, GOLDEN2, GOLDENINV22, GOLDEN2 },
+ { GOLDEN2, GOLDEN2, GOLDENINV22, GOLDEN2 },
+ { -SQRT2INV, -SQRT2, GOLDENINV2, GOLDEN2 },
+ { SQRT2INV, -SQRT2, GOLDENINV2, GOLDEN2 },
+ { -SQRT5OVER2, 0.0, GOLDENINV2, GOLDEN2 },
+ { SQRT5OVER2, 0.0, GOLDENINV2, GOLDEN2 },
+ { -SQRT2INV, SQRT2, GOLDENINV2, GOLDEN2 },
+ { SQRT2INV, SQRT2, GOLDENINV2, GOLDEN2 },
+ { -SQRT2, -GOLDENINV2, SQRT2INV, GOLDEN2 },
+ { SQRT2, -GOLDENINV2, SQRT2INV, GOLDEN2 },
+ { -SQRT2, GOLDENINV2, SQRT2INV, GOLDEN2 },
+ { SQRT2, GOLDENINV2, SQRT2INV, GOLDEN2 },
+ { -GOLDENINV22, -GOLDEN2, GOLDEN2, GOLDEN2 },
+ { GOLDENINV22, -GOLDEN2, GOLDEN2, GOLDEN2 },
+ { -GOLDEN2, -GOLDENINV22, GOLDEN2, GOLDEN2 },
+ { GOLDEN2, -GOLDENINV22, GOLDEN2, GOLDEN2 },
+ { -GOLDEN2, GOLDENINV22, GOLDEN2, GOLDEN2 },
+ { GOLDEN2, GOLDENINV22, GOLDEN2, GOLDEN2 },
+ { -GOLDENINV22, GOLDEN2, GOLDEN2, GOLDEN2 },
+ { GOLDENINV22, GOLDEN2, GOLDEN2, GOLDEN2 },
+ { -GOLDENINV2, -SQRT2INV, SQRT2, GOLDEN2 },
+ { GOLDENINV2, -SQRT2INV, SQRT2, GOLDEN2 },
+ { -GOLDENINV2, SQRT2INV, SQRT2, GOLDEN2 },
+ { GOLDENINV2, SQRT2INV, SQRT2, GOLDEN2 },
+ { 0.0, -GOLDENINV2, SQRT5OVER2, GOLDEN2 },
+ { 0.0, GOLDENINV2, SQRT5OVER2, GOLDEN2 },
+ { 0.0, 0.0, -SQRT2, SQRT2 },
+ { -SQRT2INV, -GOLDENINV2, -GOLDEN2, SQRT2 },
+ { SQRT2INV, -GOLDENINV2, -GOLDEN2, SQRT2 },
+ { -SQRT2INV, GOLDENINV2, -GOLDEN2, SQRT2 },
+ { SQRT2INV, GOLDENINV2, -GOLDEN2, SQRT2 },
+ { -GOLDENINV2, -GOLDEN2, -SQRT2INV, SQRT2 },
+ { GOLDENINV2, -GOLDEN2, -SQRT2INV, SQRT2 },
+ { -GOLDENINV2, GOLDEN2, -SQRT2INV, SQRT2 },
+ { GOLDENINV2, GOLDEN2, -SQRT2INV, SQRT2 },
+ { -GOLDEN2, -SQRT2INV, -GOLDENINV2, SQRT2 },
+ { GOLDEN2, -SQRT2INV, -GOLDENINV2, SQRT2 },
+ { -GOLDEN2, SQRT2INV, -GOLDENINV2, SQRT2 },
+ { GOLDEN2, SQRT2INV, -GOLDENINV2, SQRT2 },
+ { 0.0, -SQRT2, 0.0, SQRT2 },
+ { -SQRT2, 0.0, 0.0, SQRT2 },
+ { SQRT2, 0.0, 0.0, SQRT2 },
+ { 0.0, SQRT2, 0.0, SQRT2 },
+ { -GOLDEN2, -SQRT2INV, GOLDENINV2, SQRT2 },
+ { GOLDEN2, -SQRT2INV, GOLDENINV2, SQRT2 },
+ { -GOLDEN2, SQRT2INV, GOLDENINV2, SQRT2 },
+ { GOLDEN2, SQRT2INV, GOLDENINV2, SQRT2 },
+ { -GOLDENINV2, -GOLDEN2, SQRT2INV, SQRT2 },
+ { GOLDENINV2, -GOLDEN2, SQRT2INV, SQRT2 },
+ { -GOLDENINV2, GOLDEN2, SQRT2INV, SQRT2 },
+ { GOLDENINV2, GOLDEN2, SQRT2INV, SQRT2 },
+ { -SQRT2INV, -GOLDENINV2, GOLDEN2, SQRT2 },
+ { SQRT2INV, -GOLDENINV2, GOLDEN2, SQRT2 },
+ { -SQRT2INV, GOLDENINV2, GOLDEN2, SQRT2 },
+ { SQRT2INV, GOLDENINV2, GOLDEN2, SQRT2 },
+ { 0.0, 0.0, SQRT2, SQRT2 },
+ { -GOLDENINV2, 0.0, -GOLDEN2, SQRT5OVER2 },
+ { GOLDENINV2, 0.0, -GOLDEN2, SQRT5OVER2 },
+ { -SQRT2INV, -SQRT2INV, -SQRT2INV, SQRT5OVER2 },
+ { SQRT2INV, -SQRT2INV, -SQRT2INV, SQRT5OVER2 },
+ { -SQRT2INV, SQRT2INV, -SQRT2INV, SQRT5OVER2 },
+ { SQRT2INV, SQRT2INV, -SQRT2INV, SQRT5OVER2 },
+ { 0.0, -GOLDEN2, -GOLDENINV2, SQRT5OVER2 },
+ { 0.0, GOLDEN2, -GOLDENINV2, SQRT5OVER2 },
+ { -GOLDEN2, -GOLDENINV2, 0.0, SQRT5OVER2 },
+ { GOLDEN2, -GOLDENINV2, 0.0, SQRT5OVER2 },
+ { -GOLDEN2, GOLDENINV2, 0.0, SQRT5OVER2 },
+ { GOLDEN2, GOLDENINV2, 0.0, SQRT5OVER2 },
+ { 0.0, -GOLDEN2, GOLDENINV2, SQRT5OVER2 },
+ { 0.0, GOLDEN2, GOLDENINV2, SQRT5OVER2 },
+ { -SQRT2INV, -SQRT2INV, SQRT2INV, SQRT5OVER2 },
+ { SQRT2INV, -SQRT2INV, SQRT2INV, SQRT5OVER2 },
+ { -SQRT2INV, SQRT2INV, SQRT2INV, SQRT5OVER2 },
+ { SQRT2INV, SQRT2INV, SQRT2INV, SQRT5OVER2 },
+ { -GOLDENINV2, 0.0, GOLDEN2, SQRT5OVER2 },
+ { GOLDENINV2, 0.0, GOLDEN2, SQRT5OVER2 },
+ { -GOLDENINV22, 0.0, -SQRT2INV, GOLDEN22 },
+ { GOLDENINV22, 0.0, -SQRT2INV, GOLDEN22 },
+ { -GOLDENINV2, -GOLDENINV2, -GOLDENINV2, GOLDEN22 },
+ { GOLDENINV2, -GOLDENINV2, -GOLDENINV2, GOLDEN22 },
+ { -GOLDENINV2, GOLDENINV2, -GOLDENINV2, GOLDEN22 },
+ { GOLDENINV2, GOLDENINV2, -GOLDENINV2, GOLDEN22 },
+ { 0.0, -SQRT2INV, -GOLDENINV22, GOLDEN22 },
+ { 0.0, SQRT2INV, -GOLDENINV22, GOLDEN22 },
+ { -SQRT2INV, -GOLDENINV22, 0.0, GOLDEN22 },
+ { SQRT2INV, -GOLDENINV22, 0.0, GOLDEN22 },
+ { -SQRT2INV, GOLDENINV22, 0.0, GOLDEN22 },
+ { SQRT2INV, GOLDENINV22, 0.0, GOLDEN22 },
+ { 0.0, -SQRT2INV, GOLDENINV22, GOLDEN22 },
+ { 0.0, SQRT2INV, GOLDENINV22, GOLDEN22 },
+ { -GOLDENINV2, -GOLDENINV2, GOLDENINV2, GOLDEN22 },
+ { GOLDENINV2, -GOLDENINV2, GOLDENINV2, GOLDEN22 },
+ { -GOLDENINV2, GOLDENINV2, GOLDENINV2, GOLDEN22 },
+ { GOLDENINV2, GOLDENINV2, GOLDENINV2, GOLDEN22 },
+ { -GOLDENINV22, 0.0, SQRT2INV, GOLDEN22 },
+ { GOLDENINV22, 0.0, SQRT2INV, GOLDEN22 }
+};
+
+static const int edge_120[NUM_EDGE_120][2] = {
+ { 0, 1 }, { 0, 2 }, { 0, 4 }, { 0, 20 }, { 1, 3 },
+ { 1, 5 }, { 1, 21 }, { 2, 6 }, { 2, 8 }, { 2, 22 },
+ { 3, 6 }, { 3, 9 }, { 3, 23 }, { 4, 7 }, { 4, 10 },
+ { 4, 24 }, { 5, 7 }, { 5, 11 }, { 5, 25 }, { 6, 12 },
+ { 6, 26 }, { 7, 13 }, { 7, 27 }, { 8, 10 }, { 8, 14 },
+ { 8, 28 }, { 9, 11 }, { 9, 15 }, { 9, 29 }, { 10, 16 },
+ { 10, 30 }, { 11, 17 }, { 11, 31 }, { 12, 14 }, { 12, 15 },
+ { 12, 32 }, { 13, 16 }, { 13, 17 }, { 13, 33 }, { 14, 18 },
+ { 14, 34 }, { 15, 19 }, { 15, 35 }, { 16, 18 }, { 16, 36 },
+ { 17, 19 }, { 17, 37 }, { 18, 19 }, { 18, 38 }, { 19, 39 },
+ { 20, 40 }, { 20, 41 }, { 20, 43 }, { 21, 40 }, { 21, 42 },
+ { 21, 44 }, { 22, 41 }, { 22, 45 }, { 22, 49 }, { 23, 42 },
+ { 23, 46 }, { 23, 50 }, { 24, 43 }, { 24, 47 }, { 24, 51 },
+ { 25, 44 }, { 25, 48 }, { 25, 52 }, { 26, 45 }, { 26, 46 },
+ { 26, 53 }, { 27, 47 }, { 27, 48 }, { 27, 56 }, { 28, 49 },
+ { 28, 54 }, { 28, 57 }, { 29, 50 }, { 29, 55 }, { 29, 58 },
+ { 30, 51 }, { 30, 54 }, { 30, 59 }, { 31, 52 }, { 31, 55 },
+ { 31, 60 }, { 32, 53 }, { 32, 61 }, { 32, 62 }, { 33, 56 },
+ { 33, 63 }, { 33, 64 }, { 34, 57 }, { 34, 61 }, { 34, 65 },
+ { 35, 58 }, { 35, 62 }, { 35, 66 }, { 36, 59 }, { 36, 63 },
+ { 36, 67 }, { 37, 60 }, { 37, 64 }, { 37, 68 }, { 38, 65 },
+ { 38, 67 }, { 38, 69 }, { 39, 66 }, { 39, 68 }, { 39, 69 },
+ { 40, 70 }, { 40, 71 }, { 41, 72 }, { 41, 78 }, { 42, 73 },
+ { 42, 79 }, { 43, 74 }, { 43, 80 }, { 44, 75 }, { 44, 81 },
+ { 45, 76 }, { 45, 88 }, { 46, 77 }, { 46, 89 }, { 47, 82 },
+ { 47, 92 }, { 48, 83 }, { 48, 93 }, { 49, 84 }, { 49, 94 },
+ { 50, 85 }, { 50, 95 }, { 51, 86 }, { 51, 96 }, { 52, 87 },
+ { 52, 97 }, { 53, 98 }, { 53, 99 }, { 54, 90 }, { 54, 108 },
+ { 55, 91 }, { 55, 109 }, { 56, 100 }, { 56, 101 }, { 57, 102 },
+ { 57, 112 }, { 58, 103 }, { 58, 113 }, { 59, 104 }, { 59, 114 },
+ { 60, 105 }, { 60, 115 }, { 61, 106 }, { 61, 116 }, { 62, 107 },
+ { 62, 117 }, { 63, 110 }, { 63, 122 }, { 64, 111 }, { 64, 123 },
+ { 65, 118 }, { 65, 124 }, { 66, 119 }, { 66, 125 }, { 67, 120 },
+ { 67, 126 }, { 68, 121 }, { 68, 127 }, { 69, 128 }, { 69, 129 },
+ { 70, 72 }, { 70, 73 }, { 70, 130 }, { 71, 74 }, { 71, 75 },
+ { 71, 131 }, { 72, 76 }, { 72, 132 }, { 73, 77 }, { 73, 133 },
+ { 74, 82 }, { 74, 134 }, { 75, 83 }, { 75, 135 }, { 76, 77 },
+ { 76, 140 }, { 77, 141 }, { 78, 80 }, { 78, 84 }, { 78, 136 },
+ { 79, 81 }, { 79, 85 }, { 79, 137 }, { 80, 86 }, { 80, 138 },
+ { 81, 87 }, { 81, 139 }, { 82, 83 }, { 82, 142 }, { 83, 143 },
+ { 84, 90 }, { 84, 146 }, { 85, 91 }, { 85, 147 }, { 86, 90 },
+ { 86, 148 }, { 87, 91 }, { 87, 149 }, { 88, 94 }, { 88, 98 },
+ { 88, 144 }, { 89, 95 }, { 89, 99 }, { 89, 145 }, { 90, 156 },
+ { 91, 157 }, { 92, 96 }, { 92, 100 }, { 92, 150 }, { 93, 97 },
+ { 93, 101 }, { 93, 151 }, { 94, 102 }, { 94, 152 }, { 95, 103 },
+ { 95, 153 }, { 96, 104 }, { 96, 154 }, { 97, 105 }, { 97, 155 },
+ { 98, 106 }, { 98, 158 }, { 99, 107 }, { 99, 159 }, { 100, 110 },
+ { 100, 160 }, { 101, 111 }, { 101, 161 }, { 102, 106 }, { 102, 164 },
+ { 103, 107 }, { 103, 165 }, { 104, 110 }, { 104, 166 }, { 105, 111 },
+ { 105, 167 }, { 106, 168 }, { 107, 169 }, { 108, 112 }, { 108, 114 },
+ { 108, 162 }, { 109, 113 }, { 109, 115 }, { 109, 163 }, { 110, 174 },
+ { 111, 175 }, { 112, 118 }, { 112, 170 }, { 113, 119 }, { 113, 171 },
+ { 114, 120 }, { 114, 172 }, { 115, 121 }, { 115, 173 }, { 116, 117 },
+ { 116, 124 }, { 116, 176 }, { 117, 125 }, { 117, 177 }, { 118, 120 },
+ { 118, 180 }, { 119, 121 }, { 119, 181 }, { 120, 182 }, { 121, 183 },
+ { 122, 123 }, { 122, 126 }, { 122, 178 }, { 123, 127 }, { 123, 179 },
+ { 124, 128 }, { 124, 184 }, { 125, 128 }, { 125, 185 }, { 126, 129 },
+ { 126, 186 }, { 127, 129 }, { 127, 187 }, { 128, 188 }, { 129, 189 },
+ { 130, 131 }, { 130, 190 }, { 130, 191 }, { 131, 192 }, { 131, 193 },
+ { 132, 136 }, { 132, 190 }, { 132, 196 }, { 133, 137 }, { 133, 191 },
+ { 133, 197 }, { 134, 138 }, { 134, 192 }, { 134, 198 }, { 135, 139 },
+ { 135, 193 }, { 135, 199 }, { 136, 194 }, { 136, 201 }, { 137, 195 },
+ { 137, 202 }, { 138, 194 }, { 138, 203 }, { 139, 195 }, { 139, 204 },
+ { 140, 144 }, { 140, 196 }, { 140, 200 }, { 141, 145 }, { 141, 197 },
+ { 141, 200 }, { 142, 150 }, { 142, 198 }, { 142, 205 }, { 143, 151 },
+ { 143, 199 }, { 143, 205 }, { 144, 206 }, { 144, 210 }, { 145, 207 },
+ { 145, 211 }, { 146, 152 }, { 146, 201 }, { 146, 212 }, { 147, 153 },
+ { 147, 202 }, { 147, 213 }, { 148, 154 }, { 148, 203 }, { 148, 214 },
+ { 149, 155 }, { 149, 204 }, { 149, 215 }, { 150, 208 }, { 150, 216 },
+ { 151, 209 }, { 151, 217 }, { 152, 206 }, { 152, 218 }, { 153, 207 },
+ { 153, 219 }, { 154, 208 }, { 154, 220 }, { 155, 209 }, { 155, 221 },
+ { 156, 162 }, { 156, 212 }, { 156, 214 }, { 157, 163 }, { 157, 213 },
+ { 157, 215 }, { 158, 159 }, { 158, 210 }, { 158, 222 }, { 159, 211 },
+ { 159, 223 }, { 160, 161 }, { 160, 216 }, { 160, 228 }, { 161, 217 },
+ { 161, 229 }, { 162, 224 }, { 162, 226 }, { 163, 225 }, { 163, 227 },
+ { 164, 170 }, { 164, 218 }, { 164, 230 }, { 165, 171 }, { 165, 219 },
+ { 165, 231 }, { 166, 172 }, { 166, 220 }, { 166, 232 }, { 167, 173 },
+ { 167, 221 }, { 167, 233 }, { 168, 176 }, { 168, 222 }, { 168, 230 },
+ { 169, 177 }, { 169, 223 }, { 169, 231 }, { 170, 224 }, { 170, 235 },
+ { 171, 225 }, { 171, 236 }, { 172, 226 }, { 172, 237 }, { 173, 227 },
+ { 173, 238 }, { 174, 178 }, { 174, 228 }, { 174, 232 }, { 175, 179 },
+ { 175, 229 }, { 175, 233 }, { 176, 234 }, { 176, 240 }, { 177, 234 },
+ { 177, 241 }, { 178, 239 }, { 178, 242 }, { 179, 239 }, { 179, 243 },
+ { 180, 184 }, { 180, 235 }, { 180, 244 }, { 181, 185 }, { 181, 236 },
+ { 181, 245 }, { 182, 186 }, { 182, 237 }, { 182, 244 }, { 183, 187 },
+ { 183, 238 }, { 183, 245 }, { 184, 240 }, { 184, 246 }, { 185, 241 },
+ { 185, 247 }, { 186, 242 }, { 186, 248 }, { 187, 243 }, { 187, 249 },
+ { 188, 189 }, { 188, 246 }, { 188, 247 }, { 189, 248 }, { 189, 249 },
+ { 190, 250 }, { 190, 270 }, { 191, 251 }, { 191, 271 }, { 192, 250 },
+ { 192, 272 }, { 193, 251 }, { 193, 273 }, { 194, 250 }, { 194, 279 },
+ { 195, 251 }, { 195, 280 }, { 196, 252 }, { 196, 274 }, { 197, 253 },
+ { 197, 275 }, { 198, 254 }, { 198, 276 }, { 199, 255 }, { 199, 277 },
+ { 200, 256 }, { 200, 278 }, { 201, 252 }, { 201, 282 }, { 202, 253 },
+ { 202, 283 }, { 203, 254 }, { 203, 284 }, { 204, 255 }, { 204, 285 },
+ { 205, 257 }, { 205, 281 }, { 206, 252 }, { 206, 290 }, { 207, 253 },
+ { 207, 291 }, { 208, 254 }, { 208, 292 }, { 209, 255 }, { 209, 293 },
+ { 210, 256 }, { 210, 294 }, { 211, 256 }, { 211, 295 }, { 212, 258 },
+ { 212, 286 }, { 213, 259 }, { 213, 287 }, { 214, 260 }, { 214, 288 },
+ { 215, 261 }, { 215, 289 }, { 216, 257 }, { 216, 296 }, { 217, 257 },
+ { 217, 297 }, { 218, 258 }, { 218, 298 }, { 219, 259 }, { 219, 299 },
+ { 220, 260 }, { 220, 300 }, { 221, 261 }, { 221, 301 }, { 222, 262 },
+ { 222, 302 }, { 223, 262 }, { 223, 303 }, { 224, 258 }, { 224, 310 },
+ { 225, 259 }, { 225, 311 }, { 226, 260 }, { 226, 312 }, { 227, 261 },
+ { 227, 313 }, { 228, 263 }, { 228, 304 }, { 229, 263 }, { 229, 305 },
+ { 230, 264 }, { 230, 306 }, { 231, 265 }, { 231, 307 }, { 232, 266 },
+ { 232, 308 }, { 233, 267 }, { 233, 309 }, { 234, 262 }, { 234, 318 },
+ { 235, 264 }, { 235, 314 }, { 236, 265 }, { 236, 315 }, { 237, 266 },
+ { 237, 316 }, { 238, 267 }, { 238, 317 }, { 239, 263 }, { 239, 321 },
+ { 240, 264 }, { 240, 322 }, { 241, 265 }, { 241, 323 }, { 242, 266 },
+ { 242, 324 }, { 243, 267 }, { 243, 325 }, { 244, 268 }, { 244, 319 },
+ { 245, 269 }, { 245, 320 }, { 246, 268 }, { 246, 326 }, { 247, 269 },
+ { 247, 327 }, { 248, 268 }, { 248, 328 }, { 249, 269 }, { 249, 329 },
+ { 250, 330 }, { 251, 331 }, { 252, 332 }, { 253, 333 }, { 254, 334 },
+ { 255, 335 }, { 256, 336 }, { 257, 337 }, { 258, 338 }, { 259, 339 },
+ { 260, 340 }, { 261, 341 }, { 262, 342 }, { 263, 343 }, { 264, 344 },
+ { 265, 345 }, { 266, 346 }, { 267, 347 }, { 268, 348 }, { 269, 349 },
+ { 270, 271 }, { 270, 274 }, { 270, 350 }, { 271, 275 }, { 271, 351 },
+ { 272, 273 }, { 272, 276 }, { 272, 352 }, { 273, 277 }, { 273, 353 },
+ { 274, 278 }, { 274, 356 }, { 275, 278 }, { 275, 357 }, { 276, 281 },
+ { 276, 358 }, { 277, 281 }, { 277, 359 }, { 278, 360 }, { 279, 282 },
+ { 279, 284 }, { 279, 354 }, { 280, 283 }, { 280, 285 }, { 280, 355 },
+ { 281, 365 }, { 282, 286 }, { 282, 361 }, { 283, 287 }, { 283, 362 },
+ { 284, 288 }, { 284, 363 }, { 285, 289 }, { 285, 364 }, { 286, 288 },
+ { 286, 372 }, { 287, 289 }, { 287, 373 }, { 288, 374 }, { 289, 375 },
+ { 290, 294 }, { 290, 298 }, { 290, 366 }, { 291, 295 }, { 291, 299 },
+ { 291, 367 }, { 292, 296 }, { 292, 300 }, { 292, 368 }, { 293, 297 },
+ { 293, 301 }, { 293, 369 }, { 294, 302 }, { 294, 370 }, { 295, 303 },
+ { 295, 371 }, { 296, 304 }, { 296, 376 }, { 297, 305 }, { 297, 377 },
+ { 298, 306 }, { 298, 378 }, { 299, 307 }, { 299, 379 }, { 300, 308 },
+ { 300, 380 }, { 301, 309 }, { 301, 381 }, { 302, 306 }, { 302, 382 },
+ { 303, 307 }, { 303, 383 }, { 304, 308 }, { 304, 388 }, { 305, 309 },
+ { 305, 389 }, { 306, 390 }, { 307, 391 }, { 308, 392 }, { 309, 393 },
+ { 310, 312 }, { 310, 314 }, { 310, 384 }, { 311, 313 }, { 311, 315 },
+ { 311, 385 }, { 312, 316 }, { 312, 386 }, { 313, 317 }, { 313, 387 },
+ { 314, 319 }, { 314, 395 }, { 315, 320 }, { 315, 396 }, { 316, 319 },
+ { 316, 397 }, { 317, 320 }, { 317, 398 }, { 318, 322 }, { 318, 323 },
+ { 318, 394 }, { 319, 404 }, { 320, 405 }, { 321, 324 }, { 321, 325 },
+ { 321, 399 }, { 322, 326 }, { 322, 400 }, { 323, 327 }, { 323, 401 },
+ { 324, 328 }, { 324, 402 }, { 325, 329 }, { 325, 403 }, { 326, 327 },
+ { 326, 406 }, { 327, 407 }, { 328, 329 }, { 328, 408 }, { 329, 409 },
+ { 330, 350 }, { 330, 352 }, { 330, 354 }, { 331, 351 }, { 331, 353 },
+ { 331, 355 }, { 332, 356 }, { 332, 361 }, { 332, 366 }, { 333, 357 },
+ { 333, 362 }, { 333, 367 }, { 334, 358 }, { 334, 363 }, { 334, 368 },
+ { 335, 359 }, { 335, 364 }, { 335, 369 }, { 336, 360 }, { 336, 370 },
+ { 336, 371 }, { 337, 365 }, { 337, 376 }, { 337, 377 }, { 338, 372 },
+ { 338, 378 }, { 338, 384 }, { 339, 373 }, { 339, 379 }, { 339, 385 },
+ { 340, 374 }, { 340, 380 }, { 340, 386 }, { 341, 375 }, { 341, 381 },
+ { 341, 387 }, { 342, 382 }, { 342, 383 }, { 342, 394 }, { 343, 388 },
+ { 343, 389 }, { 343, 399 }, { 344, 390 }, { 344, 395 }, { 344, 400 },
+ { 345, 391 }, { 345, 396 }, { 345, 401 }, { 346, 392 }, { 346, 397 },
+ { 346, 402 }, { 347, 393 }, { 347, 398 }, { 347, 403 }, { 348, 404 },
+ { 348, 406 }, { 348, 408 }, { 349, 405 }, { 349, 407 }, { 349, 409 },
+ { 350, 410 }, { 350, 412 }, { 351, 410 }, { 351, 413 }, { 352, 411 },
+ { 352, 414 }, { 353, 411 }, { 353, 415 }, { 354, 416 }, { 354, 418 },
+ { 355, 417 }, { 355, 419 }, { 356, 412 }, { 356, 420 }, { 357, 413 },
+ { 357, 421 }, { 358, 414 }, { 358, 422 }, { 359, 415 }, { 359, 423 },
+ { 360, 420 }, { 360, 421 }, { 361, 416 }, { 361, 426 }, { 362, 417 },
+ { 362, 427 }, { 363, 418 }, { 363, 428 }, { 364, 419 }, { 364, 429 },
+ { 365, 422 }, { 365, 423 }, { 366, 424 }, { 366, 432 }, { 367, 425 },
+ { 367, 433 }, { 368, 430 }, { 368, 434 }, { 369, 431 }, { 369, 435 },
+ { 370, 424 }, { 370, 438 }, { 371, 425 }, { 371, 439 }, { 372, 426 },
+ { 372, 436 }, { 373, 427 }, { 373, 437 }, { 374, 428 }, { 374, 436 },
+ { 375, 429 }, { 375, 437 }, { 376, 430 }, { 376, 440 }, { 377, 431 },
+ { 377, 441 }, { 378, 432 }, { 378, 444 }, { 379, 433 }, { 379, 445 },
+ { 380, 434 }, { 380, 446 }, { 381, 435 }, { 381, 447 }, { 382, 438 },
+ { 382, 448 }, { 383, 439 }, { 383, 449 }, { 384, 442 }, { 384, 450 },
+ { 385, 443 }, { 385, 451 }, { 386, 442 }, { 386, 452 }, { 387, 443 },
+ { 387, 453 }, { 388, 440 }, { 388, 454 }, { 389, 441 }, { 389, 455 },
+ { 390, 444 }, { 390, 448 }, { 391, 445 }, { 391, 449 }, { 392, 446 },
+ { 392, 454 }, { 393, 447 }, { 393, 455 }, { 394, 456 }, { 394, 457 },
+ { 395, 450 }, { 395, 460 }, { 396, 451 }, { 396, 461 }, { 397, 452 },
+ { 397, 462 }, { 398, 453 }, { 398, 463 }, { 399, 458 }, { 399, 459 },
+ { 400, 456 }, { 400, 464 }, { 401, 457 }, { 401, 465 }, { 402, 458 },
+ { 402, 466 }, { 403, 459 }, { 403, 467 }, { 404, 460 }, { 404, 462 },
+ { 405, 461 }, { 405, 463 }, { 406, 464 }, { 406, 468 }, { 407, 465 },
+ { 407, 468 }, { 408, 466 }, { 408, 469 }, { 409, 467 }, { 409, 469 },
+ { 410, 411 }, { 410, 470 }, { 411, 471 }, { 412, 416 }, { 412, 472 },
+ { 413, 417 }, { 413, 473 }, { 414, 418 }, { 414, 474 }, { 415, 419 },
+ { 415, 475 }, { 416, 478 }, { 417, 479 }, { 418, 480 }, { 419, 481 },
+ { 420, 424 }, { 420, 476 }, { 421, 425 }, { 421, 477 }, { 422, 430 },
+ { 422, 482 }, { 423, 431 }, { 423, 483 }, { 424, 488 }, { 425, 489 },
+ { 426, 432 }, { 426, 484 }, { 427, 433 }, { 427, 485 }, { 428, 434 },
+ { 428, 486 }, { 429, 435 }, { 429, 487 }, { 430, 492 }, { 431, 493 },
+ { 432, 494 }, { 433, 495 }, { 434, 496 }, { 435, 497 }, { 436, 442 },
+ { 436, 490 }, { 437, 443 }, { 437, 491 }, { 438, 439 }, { 438, 498 },
+ { 439, 499 }, { 440, 441 }, { 440, 500 }, { 441, 501 }, { 442, 508 },
+ { 443, 509 }, { 444, 450 }, { 444, 502 }, { 445, 451 }, { 445, 503 },
+ { 446, 452 }, { 446, 504 }, { 447, 453 }, { 447, 505 }, { 448, 456 },
+ { 448, 506 }, { 449, 457 }, { 449, 507 }, { 450, 512 }, { 451, 513 },
+ { 452, 514 }, { 453, 515 }, { 454, 458 }, { 454, 510 }, { 455, 459 },
+ { 455, 511 }, { 456, 516 }, { 457, 517 }, { 458, 522 }, { 459, 523 },
+ { 460, 464 }, { 460, 518 }, { 461, 465 }, { 461, 519 }, { 462, 466 },
+ { 462, 520 }, { 463, 467 }, { 463, 521 }, { 464, 524 }, { 465, 525 },
+ { 466, 526 }, { 467, 527 }, { 468, 469 }, { 468, 528 }, { 469, 529 },
+ { 470, 472 }, { 470, 473 }, { 470, 530 }, { 471, 474 }, { 471, 475 },
+ { 471, 530 }, { 472, 476 }, { 472, 531 }, { 473, 477 }, { 473, 532 },
+ { 474, 482 }, { 474, 533 }, { 475, 483 }, { 475, 534 }, { 476, 477 },
+ { 476, 535 }, { 477, 536 }, { 478, 480 }, { 478, 484 }, { 478, 531 },
+ { 479, 481 }, { 479, 485 }, { 479, 532 }, { 480, 486 }, { 480, 533 },
+ { 481, 487 }, { 481, 534 }, { 482, 483 }, { 482, 537 }, { 483, 538 },
+ { 484, 490 }, { 484, 539 }, { 485, 491 }, { 485, 540 }, { 486, 490 },
+ { 486, 541 }, { 487, 491 }, { 487, 542 }, { 488, 494 }, { 488, 498 },
+ { 488, 535 }, { 489, 495 }, { 489, 499 }, { 489, 536 }, { 490, 544 },
+ { 491, 545 }, { 492, 496 }, { 492, 500 }, { 492, 537 }, { 493, 497 },
+ { 493, 501 }, { 493, 538 }, { 494, 502 }, { 494, 539 }, { 495, 503 },
+ { 495, 540 }, { 496, 504 }, { 496, 541 }, { 497, 505 }, { 497, 542 },
+ { 498, 506 }, { 498, 543 }, { 499, 507 }, { 499, 543 }, { 500, 510 },
+ { 500, 546 }, { 501, 511 }, { 501, 546 }, { 502, 506 }, { 502, 547 },
+ { 503, 507 }, { 503, 548 }, { 504, 510 }, { 504, 549 }, { 505, 511 },
+ { 505, 550 }, { 506, 551 }, { 507, 552 }, { 508, 512 }, { 508, 514 },
+ { 508, 544 }, { 509, 513 }, { 509, 515 }, { 509, 545 }, { 510, 553 },
+ { 511, 554 }, { 512, 518 }, { 512, 547 }, { 513, 519 }, { 513, 548 },
+ { 514, 520 }, { 514, 549 }, { 515, 521 }, { 515, 550 }, { 516, 517 },
+ { 516, 524 }, { 516, 551 }, { 517, 525 }, { 517, 552 }, { 518, 520 },
+ { 518, 555 }, { 519, 521 }, { 519, 556 }, { 520, 557 }, { 521, 558 },
+ { 522, 523 }, { 522, 526 }, { 522, 553 }, { 523, 527 }, { 523, 554 },
+ { 524, 528 }, { 524, 555 }, { 525, 528 }, { 525, 556 }, { 526, 529 },
+ { 526, 557 }, { 527, 529 }, { 527, 558 }, { 528, 559 }, { 529, 559 },
+ { 530, 560 }, { 530, 561 }, { 531, 560 }, { 531, 562 }, { 532, 561 },
+ { 532, 563 }, { 533, 560 }, { 533, 564 }, { 534, 561 }, { 534, 565 },
+ { 535, 562 }, { 535, 566 }, { 536, 563 }, { 536, 566 }, { 537, 564 },
+ { 537, 567 }, { 538, 565 }, { 538, 567 }, { 539, 562 }, { 539, 568 },
+ { 540, 563 }, { 540, 569 }, { 541, 564 }, { 541, 570 }, { 542, 565 },
+ { 542, 571 }, { 543, 566 }, { 543, 572 }, { 544, 568 }, { 544, 570 },
+ { 545, 569 }, { 545, 571 }, { 546, 567 }, { 546, 573 }, { 547, 568 },
+ { 547, 574 }, { 548, 569 }, { 548, 575 }, { 549, 570 }, { 549, 576 },
+ { 550, 571 }, { 550, 577 }, { 551, 572 }, { 551, 574 }, { 552, 572 },
+ { 552, 575 }, { 553, 573 }, { 553, 576 }, { 554, 573 }, { 554, 577 },
+ { 555, 574 }, { 555, 578 }, { 556, 575 }, { 556, 579 }, { 557, 576 },
+ { 557, 578 }, { 558, 577 }, { 558, 579 }, { 559, 578 }, { 559, 579 },
+ { 560, 580 }, { 561, 581 }, { 562, 582 }, { 563, 583 }, { 564, 584 },
+ { 565, 585 }, { 566, 586 }, { 567, 587 }, { 568, 588 }, { 569, 589 },
+ { 570, 590 }, { 571, 591 }, { 572, 592 }, { 573, 593 }, { 574, 594 },
+ { 575, 595 }, { 576, 596 }, { 577, 597 }, { 578, 598 }, { 579, 599 },
+ { 580, 581 }, { 580, 582 }, { 580, 584 }, { 581, 583 }, { 581, 585 },
+ { 582, 586 }, { 582, 588 }, { 583, 586 }, { 583, 589 }, { 584, 587 },
+ { 584, 590 }, { 585, 587 }, { 585, 591 }, { 586, 592 }, { 587, 593 },
+ { 588, 590 }, { 588, 594 }, { 589, 591 }, { 589, 595 }, { 590, 596 },
+ { 591, 597 }, { 592, 594 }, { 592, 595 }, { 593, 596 }, { 593, 597 },
+ { 594, 598 }, { 595, 599 }, { 596, 598 }, { 597, 599 }, { 598, 599 }
+};
+
+static const int face_120[NUM_FACE_120][VERT_PER_FACE_120] = {
+ { 0, 1, 3, 6, 2 }, { 0, 1, 5, 7, 4 },
+ { 0, 1, 21, 40, 20 }, { 0, 2, 8, 10, 4 },
+ { 0, 2, 22, 41, 20 }, { 0, 4, 24, 43, 20 },
+ { 1, 3, 9, 11, 5 }, { 1, 3, 23, 42, 21 },
+ { 1, 5, 25, 44, 21 }, { 2, 6, 12, 14, 8 },
+ { 2, 6, 26, 45, 22 }, { 2, 8, 28, 49, 22 },
+ { 3, 6, 12, 15, 9 }, { 3, 6, 26, 46, 23 },
+ { 3, 9, 29, 50, 23 }, { 4, 7, 13, 16, 10 },
+ { 4, 7, 27, 47, 24 }, { 4, 10, 30, 51, 24 },
+ { 5, 7, 13, 17, 11 }, { 5, 7, 27, 48, 25 },
+ { 5, 11, 31, 52, 25 }, { 6, 12, 32, 53, 26 },
+ { 7, 13, 33, 56, 27 }, { 8, 10, 16, 18, 14 },
+ { 8, 10, 30, 54, 28 }, { 8, 14, 34, 57, 28 },
+ { 9, 11, 17, 19, 15 }, { 9, 11, 31, 55, 29 },
+ { 9, 15, 35, 58, 29 }, { 10, 16, 36, 59, 30 },
+ { 11, 17, 37, 60, 31 }, { 12, 14, 18, 19, 15 },
+ { 12, 14, 34, 61, 32 }, { 12, 15, 35, 62, 32 },
+ { 13, 16, 18, 19, 17 }, { 13, 16, 36, 63, 33 },
+ { 13, 17, 37, 64, 33 }, { 14, 18, 38, 65, 34 },
+ { 15, 19, 39, 66, 35 }, { 16, 18, 38, 67, 36 },
+ { 17, 19, 39, 68, 37 }, { 18, 19, 39, 69, 38 },
+ { 20, 40, 70, 72, 41 }, { 20, 40, 71, 74, 43 },
+ { 20, 41, 78, 80, 43 }, { 21, 40, 70, 73, 42 },
+ { 21, 40, 71, 75, 44 }, { 21, 42, 79, 81, 44 },
+ { 22, 41, 72, 76, 45 }, { 22, 41, 78, 84, 49 },
+ { 22, 45, 88, 94, 49 }, { 23, 42, 73, 77, 46 },
+ { 23, 42, 79, 85, 50 }, { 23, 46, 89, 95, 50 },
+ { 24, 43, 74, 82, 47 }, { 24, 43, 80, 86, 51 },
+ { 24, 47, 92, 96, 51 }, { 25, 44, 75, 83, 48 },
+ { 25, 44, 81, 87, 52 }, { 25, 48, 93, 97, 52 },
+ { 26, 45, 76, 77, 46 }, { 26, 45, 88, 98, 53 },
+ { 26, 46, 89, 99, 53 }, { 27, 47, 82, 83, 48 },
+ { 27, 47, 92, 100, 56 }, { 27, 48, 93, 101, 56 },
+ { 28, 49, 84, 90, 54 }, { 28, 49, 94, 102, 57 },
+ { 28, 54, 108, 112, 57 }, { 29, 50, 85, 91, 55 },
+ { 29, 50, 95, 103, 58 }, { 29, 55, 109, 113, 58 },
+ { 30, 51, 86, 90, 54 }, { 30, 51, 96, 104, 59 },
+ { 30, 54, 108, 114, 59 }, { 31, 52, 87, 91, 55 },
+ { 31, 52, 97, 105, 60 }, { 31, 55, 109, 115, 60 },
+ { 32, 53, 98, 106, 61 }, { 32, 53, 99, 107, 62 },
+ { 32, 61, 116, 117, 62 }, { 33, 56, 100, 110, 63 },
+ { 33, 56, 101, 111, 64 }, { 33, 63, 122, 123, 64 },
+ { 34, 57, 102, 106, 61 }, { 34, 57, 112, 118, 65 },
+ { 34, 61, 116, 124, 65 }, { 35, 58, 103, 107, 62 },
+ { 35, 58, 113, 119, 66 }, { 35, 62, 117, 125, 66 },
+ { 36, 59, 104, 110, 63 }, { 36, 59, 114, 120, 67 },
+ { 36, 63, 122, 126, 67 }, { 37, 60, 105, 111, 64 },
+ { 37, 60, 115, 121, 68 }, { 37, 64, 123, 127, 68 },
+ { 38, 65, 118, 120, 67 }, { 38, 65, 124, 128, 69 },
+ { 38, 67, 126, 129, 69 }, { 39, 66, 119, 121, 68 },
+ { 39, 66, 125, 128, 69 }, { 39, 68, 127, 129, 69 },
+ { 40, 70, 130, 131, 71 }, { 41, 72, 132, 136, 78 },
+ { 42, 73, 133, 137, 79 }, { 43, 74, 134, 138, 80 },
+ { 44, 75, 135, 139, 81 }, { 45, 76, 140, 144, 88 },
+ { 46, 77, 141, 145, 89 }, { 47, 82, 142, 150, 92 },
+ { 48, 83, 143, 151, 93 }, { 49, 84, 146, 152, 94 },
+ { 50, 85, 147, 153, 95 }, { 51, 86, 148, 154, 96 },
+ { 52, 87, 149, 155, 97 }, { 53, 98, 158, 159, 99 },
+ { 54, 90, 156, 162, 108 }, { 55, 91, 157, 163, 109 },
+ { 56, 100, 160, 161, 101 }, { 57, 102, 164, 170, 112 },
+ { 58, 103, 165, 171, 113 }, { 59, 104, 166, 172, 114 },
+ { 60, 105, 167, 173, 115 }, { 61, 106, 168, 176, 116 },
+ { 62, 107, 169, 177, 117 }, { 63, 110, 174, 178, 122 },
+ { 64, 111, 175, 179, 123 }, { 65, 118, 180, 184, 124 },
+ { 66, 119, 181, 185, 125 }, { 67, 120, 182, 186, 126 },
+ { 68, 121, 183, 187, 127 }, { 69, 128, 188, 189, 129 },
+ { 70, 72, 76, 77, 73 }, { 70, 72, 132, 190, 130 },
+ { 70, 73, 133, 191, 130 }, { 71, 74, 82, 83, 75 },
+ { 71, 74, 134, 192, 131 }, { 71, 75, 135, 193, 131 },
+ { 72, 76, 140, 196, 132 }, { 73, 77, 141, 197, 133 },
+ { 74, 82, 142, 198, 134 }, { 75, 83, 143, 199, 135 },
+ { 76, 77, 141, 200, 140 }, { 78, 80, 86, 90, 84 },
+ { 78, 80, 138, 194, 136 }, { 78, 84, 146, 201, 136 },
+ { 79, 81, 87, 91, 85 }, { 79, 81, 139, 195, 137 },
+ { 79, 85, 147, 202, 137 }, { 80, 86, 148, 203, 138 },
+ { 81, 87, 149, 204, 139 }, { 82, 83, 143, 205, 142 },
+ { 84, 90, 156, 212, 146 }, { 85, 91, 157, 213, 147 },
+ { 86, 90, 156, 214, 148 }, { 87, 91, 157, 215, 149 },
+ { 88, 94, 102, 106, 98 }, { 88, 94, 152, 206, 144 },
+ { 88, 98, 158, 210, 144 }, { 89, 95, 103, 107, 99 },
+ { 89, 95, 153, 207, 145 }, { 89, 99, 159, 211, 145 },
+ { 92, 96, 104, 110, 100 }, { 92, 96, 154, 208, 150 },
+ { 92, 100, 160, 216, 150 }, { 93, 97, 105, 111, 101 },
+ { 93, 97, 155, 209, 151 }, { 93, 101, 161, 217, 151 },
+ { 94, 102, 164, 218, 152 }, { 95, 103, 165, 219, 153 },
+ { 96, 104, 166, 220, 154 }, { 97, 105, 167, 221, 155 },
+ { 98, 106, 168, 222, 158 }, { 99, 107, 169, 223, 159 },
+ { 100, 110, 174, 228, 160 }, { 101, 111, 175, 229, 161 },
+ { 102, 106, 168, 230, 164 }, { 103, 107, 169, 231, 165 },
+ { 104, 110, 174, 232, 166 }, { 105, 111, 175, 233, 167 },
+ { 108, 112, 118, 120, 114 }, { 108, 112, 170, 224, 162 },
+ { 108, 114, 172, 226, 162 }, { 109, 113, 119, 121, 115 },
+ { 109, 113, 171, 225, 163 }, { 109, 115, 173, 227, 163 },
+ { 112, 118, 180, 235, 170 }, { 113, 119, 181, 236, 171 },
+ { 114, 120, 182, 237, 172 }, { 115, 121, 183, 238, 173 },
+ { 116, 117, 125, 128, 124 }, { 116, 117, 177, 234, 176 },
+ { 116, 124, 184, 240, 176 }, { 117, 125, 185, 241, 177 },
+ { 118, 120, 182, 244, 180 }, { 119, 121, 183, 245, 181 },
+ { 122, 123, 127, 129, 126 }, { 122, 123, 179, 239, 178 },
+ { 122, 126, 186, 242, 178 }, { 123, 127, 187, 243, 179 },
+ { 124, 128, 188, 246, 184 }, { 125, 128, 188, 247, 185 },
+ { 126, 129, 189, 248, 186 }, { 127, 129, 189, 249, 187 },
+ { 130, 131, 192, 250, 190 }, { 130, 131, 193, 251, 191 },
+ { 130, 190, 270, 271, 191 }, { 131, 192, 272, 273, 193 },
+ { 132, 136, 194, 250, 190 }, { 132, 136, 201, 252, 196 },
+ { 132, 190, 270, 274, 196 }, { 133, 137, 195, 251, 191 },
+ { 133, 137, 202, 253, 197 }, { 133, 191, 271, 275, 197 },
+ { 134, 138, 194, 250, 192 }, { 134, 138, 203, 254, 198 },
+ { 134, 192, 272, 276, 198 }, { 135, 139, 195, 251, 193 },
+ { 135, 139, 204, 255, 199 }, { 135, 193, 273, 277, 199 },
+ { 136, 194, 279, 282, 201 }, { 137, 195, 280, 283, 202 },
+ { 138, 194, 279, 284, 203 }, { 139, 195, 280, 285, 204 },
+ { 140, 144, 206, 252, 196 }, { 140, 144, 210, 256, 200 },
+ { 140, 196, 274, 278, 200 }, { 141, 145, 207, 253, 197 },
+ { 141, 145, 211, 256, 200 }, { 141, 197, 275, 278, 200 },
+ { 142, 150, 208, 254, 198 }, { 142, 150, 216, 257, 205 },
+ { 142, 198, 276, 281, 205 }, { 143, 151, 209, 255, 199 },
+ { 143, 151, 217, 257, 205 }, { 143, 199, 277, 281, 205 },
+ { 144, 206, 290, 294, 210 }, { 145, 207, 291, 295, 211 },
+ { 146, 152, 206, 252, 201 }, { 146, 152, 218, 258, 212 },
+ { 146, 201, 282, 286, 212 }, { 147, 153, 207, 253, 202 },
+ { 147, 153, 219, 259, 213 }, { 147, 202, 283, 287, 213 },
+ { 148, 154, 208, 254, 203 }, { 148, 154, 220, 260, 214 },
+ { 148, 203, 284, 288, 214 }, { 149, 155, 209, 255, 204 },
+ { 149, 155, 221, 261, 215 }, { 149, 204, 285, 289, 215 },
+ { 150, 208, 292, 296, 216 }, { 151, 209, 293, 297, 217 },
+ { 152, 206, 290, 298, 218 }, { 153, 207, 291, 299, 219 },
+ { 154, 208, 292, 300, 220 }, { 155, 209, 293, 301, 221 },
+ { 156, 162, 224, 258, 212 }, { 156, 162, 226, 260, 214 },
+ { 156, 212, 286, 288, 214 }, { 157, 163, 225, 259, 213 },
+ { 157, 163, 227, 261, 215 }, { 157, 213, 287, 289, 215 },
+ { 158, 159, 211, 256, 210 }, { 158, 159, 223, 262, 222 },
+ { 158, 210, 294, 302, 222 }, { 159, 211, 295, 303, 223 },
+ { 160, 161, 217, 257, 216 }, { 160, 161, 229, 263, 228 },
+ { 160, 216, 296, 304, 228 }, { 161, 217, 297, 305, 229 },
+ { 162, 224, 310, 312, 226 }, { 163, 225, 311, 313, 227 },
+ { 164, 170, 224, 258, 218 }, { 164, 170, 235, 264, 230 },
+ { 164, 218, 298, 306, 230 }, { 165, 171, 225, 259, 219 },
+ { 165, 171, 236, 265, 231 }, { 165, 219, 299, 307, 231 },
+ { 166, 172, 226, 260, 220 }, { 166, 172, 237, 266, 232 },
+ { 166, 220, 300, 308, 232 }, { 167, 173, 227, 261, 221 },
+ { 167, 173, 238, 267, 233 }, { 167, 221, 301, 309, 233 },
+ { 168, 176, 234, 262, 222 }, { 168, 176, 240, 264, 230 },
+ { 168, 222, 302, 306, 230 }, { 169, 177, 234, 262, 223 },
+ { 169, 177, 241, 265, 231 }, { 169, 223, 303, 307, 231 },
+ { 170, 224, 310, 314, 235 }, { 171, 225, 311, 315, 236 },
+ { 172, 226, 312, 316, 237 }, { 173, 227, 313, 317, 238 },
+ { 174, 178, 239, 263, 228 }, { 174, 178, 242, 266, 232 },
+ { 174, 228, 304, 308, 232 }, { 175, 179, 239, 263, 229 },
+ { 175, 179, 243, 267, 233 }, { 175, 229, 305, 309, 233 },
+ { 176, 234, 318, 322, 240 }, { 177, 234, 318, 323, 241 },
+ { 178, 239, 321, 324, 242 }, { 179, 239, 321, 325, 243 },
+ { 180, 184, 240, 264, 235 }, { 180, 184, 246, 268, 244 },
+ { 180, 235, 314, 319, 244 }, { 181, 185, 241, 265, 236 },
+ { 181, 185, 247, 269, 245 }, { 181, 236, 315, 320, 245 },
+ { 182, 186, 242, 266, 237 }, { 182, 186, 248, 268, 244 },
+ { 182, 237, 316, 319, 244 }, { 183, 187, 243, 267, 238 },
+ { 183, 187, 249, 269, 245 }, { 183, 238, 317, 320, 245 },
+ { 184, 240, 322, 326, 246 }, { 185, 241, 323, 327, 247 },
+ { 186, 242, 324, 328, 248 }, { 187, 243, 325, 329, 249 },
+ { 188, 189, 248, 268, 246 }, { 188, 189, 249, 269, 247 },
+ { 188, 246, 326, 327, 247 }, { 189, 248, 328, 329, 249 },
+ { 190, 250, 330, 350, 270 }, { 191, 251, 331, 351, 271 },
+ { 192, 250, 330, 352, 272 }, { 193, 251, 331, 353, 273 },
+ { 194, 250, 330, 354, 279 }, { 195, 251, 331, 355, 280 },
+ { 196, 252, 332, 356, 274 }, { 197, 253, 333, 357, 275 },
+ { 198, 254, 334, 358, 276 }, { 199, 255, 335, 359, 277 },
+ { 200, 256, 336, 360, 278 }, { 201, 252, 332, 361, 282 },
+ { 202, 253, 333, 362, 283 }, { 203, 254, 334, 363, 284 },
+ { 204, 255, 335, 364, 285 }, { 205, 257, 337, 365, 281 },
+ { 206, 252, 332, 366, 290 }, { 207, 253, 333, 367, 291 },
+ { 208, 254, 334, 368, 292 }, { 209, 255, 335, 369, 293 },
+ { 210, 256, 336, 370, 294 }, { 211, 256, 336, 371, 295 },
+ { 212, 258, 338, 372, 286 }, { 213, 259, 339, 373, 287 },
+ { 214, 260, 340, 374, 288 }, { 215, 261, 341, 375, 289 },
+ { 216, 257, 337, 376, 296 }, { 217, 257, 337, 377, 297 },
+ { 218, 258, 338, 378, 298 }, { 219, 259, 339, 379, 299 },
+ { 220, 260, 340, 380, 300 }, { 221, 261, 341, 381, 301 },
+ { 222, 262, 342, 382, 302 }, { 223, 262, 342, 383, 303 },
+ { 224, 258, 338, 384, 310 }, { 225, 259, 339, 385, 311 },
+ { 226, 260, 340, 386, 312 }, { 227, 261, 341, 387, 313 },
+ { 228, 263, 343, 388, 304 }, { 229, 263, 343, 389, 305 },
+ { 230, 264, 344, 390, 306 }, { 231, 265, 345, 391, 307 },
+ { 232, 266, 346, 392, 308 }, { 233, 267, 347, 393, 309 },
+ { 234, 262, 342, 394, 318 }, { 235, 264, 344, 395, 314 },
+ { 236, 265, 345, 396, 315 }, { 237, 266, 346, 397, 316 },
+ { 238, 267, 347, 398, 317 }, { 239, 263, 343, 399, 321 },
+ { 240, 264, 344, 400, 322 }, { 241, 265, 345, 401, 323 },
+ { 242, 266, 346, 402, 324 }, { 243, 267, 347, 403, 325 },
+ { 244, 268, 348, 404, 319 }, { 245, 269, 349, 405, 320 },
+ { 246, 268, 348, 406, 326 }, { 247, 269, 349, 407, 327 },
+ { 248, 268, 348, 408, 328 }, { 249, 269, 349, 409, 329 },
+ { 270, 271, 275, 278, 274 }, { 270, 271, 351, 410, 350 },
+ { 270, 274, 356, 412, 350 }, { 271, 275, 357, 413, 351 },
+ { 272, 273, 277, 281, 276 }, { 272, 273, 353, 411, 352 },
+ { 272, 276, 358, 414, 352 }, { 273, 277, 359, 415, 353 },
+ { 274, 278, 360, 420, 356 }, { 275, 278, 360, 421, 357 },
+ { 276, 281, 365, 422, 358 }, { 277, 281, 365, 423, 359 },
+ { 279, 282, 286, 288, 284 }, { 279, 282, 361, 416, 354 },
+ { 279, 284, 363, 418, 354 }, { 280, 283, 287, 289, 285 },
+ { 280, 283, 362, 417, 355 }, { 280, 285, 364, 419, 355 },
+ { 282, 286, 372, 426, 361 }, { 283, 287, 373, 427, 362 },
+ { 284, 288, 374, 428, 363 }, { 285, 289, 375, 429, 364 },
+ { 286, 288, 374, 436, 372 }, { 287, 289, 375, 437, 373 },
+ { 290, 294, 302, 306, 298 }, { 290, 294, 370, 424, 366 },
+ { 290, 298, 378, 432, 366 }, { 291, 295, 303, 307, 299 },
+ { 291, 295, 371, 425, 367 }, { 291, 299, 379, 433, 367 },
+ { 292, 296, 304, 308, 300 }, { 292, 296, 376, 430, 368 },
+ { 292, 300, 380, 434, 368 }, { 293, 297, 305, 309, 301 },
+ { 293, 297, 377, 431, 369 }, { 293, 301, 381, 435, 369 },
+ { 294, 302, 382, 438, 370 }, { 295, 303, 383, 439, 371 },
+ { 296, 304, 388, 440, 376 }, { 297, 305, 389, 441, 377 },
+ { 298, 306, 390, 444, 378 }, { 299, 307, 391, 445, 379 },
+ { 300, 308, 392, 446, 380 }, { 301, 309, 393, 447, 381 },
+ { 302, 306, 390, 448, 382 }, { 303, 307, 391, 449, 383 },
+ { 304, 308, 392, 454, 388 }, { 305, 309, 393, 455, 389 },
+ { 310, 312, 316, 319, 314 }, { 310, 312, 386, 442, 384 },
+ { 310, 314, 395, 450, 384 }, { 311, 313, 317, 320, 315 },
+ { 311, 313, 387, 443, 385 }, { 311, 315, 396, 451, 385 },
+ { 312, 316, 397, 452, 386 }, { 313, 317, 398, 453, 387 },
+ { 314, 319, 404, 460, 395 }, { 315, 320, 405, 461, 396 },
+ { 316, 319, 404, 462, 397 }, { 317, 320, 405, 463, 398 },
+ { 318, 322, 326, 327, 323 }, { 318, 322, 400, 456, 394 },
+ { 318, 323, 401, 457, 394 }, { 321, 324, 328, 329, 325 },
+ { 321, 324, 402, 458, 399 }, { 321, 325, 403, 459, 399 },
+ { 322, 326, 406, 464, 400 }, { 323, 327, 407, 465, 401 },
+ { 324, 328, 408, 466, 402 }, { 325, 329, 409, 467, 403 },
+ { 326, 327, 407, 468, 406 }, { 328, 329, 409, 469, 408 },
+ { 330, 350, 410, 411, 352 }, { 330, 350, 412, 416, 354 },
+ { 330, 352, 414, 418, 354 }, { 331, 351, 410, 411, 353 },
+ { 331, 351, 413, 417, 355 }, { 331, 353, 415, 419, 355 },
+ { 332, 356, 412, 416, 361 }, { 332, 356, 420, 424, 366 },
+ { 332, 361, 426, 432, 366 }, { 333, 357, 413, 417, 362 },
+ { 333, 357, 421, 425, 367 }, { 333, 362, 427, 433, 367 },
+ { 334, 358, 414, 418, 363 }, { 334, 358, 422, 430, 368 },
+ { 334, 363, 428, 434, 368 }, { 335, 359, 415, 419, 364 },
+ { 335, 359, 423, 431, 369 }, { 335, 364, 429, 435, 369 },
+ { 336, 360, 420, 424, 370 }, { 336, 360, 421, 425, 371 },
+ { 336, 370, 438, 439, 371 }, { 337, 365, 422, 430, 376 },
+ { 337, 365, 423, 431, 377 }, { 337, 376, 440, 441, 377 },
+ { 338, 372, 426, 432, 378 }, { 338, 372, 436, 442, 384 },
+ { 338, 378, 444, 450, 384 }, { 339, 373, 427, 433, 379 },
+ { 339, 373, 437, 443, 385 }, { 339, 379, 445, 451, 385 },
+ { 340, 374, 428, 434, 380 }, { 340, 374, 436, 442, 386 },
+ { 340, 380, 446, 452, 386 }, { 341, 375, 429, 435, 381 },
+ { 341, 375, 437, 443, 387 }, { 341, 381, 447, 453, 387 },
+ { 342, 382, 438, 439, 383 }, { 342, 382, 448, 456, 394 },
+ { 342, 383, 449, 457, 394 }, { 343, 388, 440, 441, 389 },
+ { 343, 388, 454, 458, 399 }, { 343, 389, 455, 459, 399 },
+ { 344, 390, 444, 450, 395 }, { 344, 390, 448, 456, 400 },
+ { 344, 395, 460, 464, 400 }, { 345, 391, 445, 451, 396 },
+ { 345, 391, 449, 457, 401 }, { 345, 396, 461, 465, 401 },
+ { 346, 392, 446, 452, 397 }, { 346, 392, 454, 458, 402 },
+ { 346, 397, 462, 466, 402 }, { 347, 393, 447, 453, 398 },
+ { 347, 393, 455, 459, 403 }, { 347, 398, 463, 467, 403 },
+ { 348, 404, 460, 464, 406 }, { 348, 404, 462, 466, 408 },
+ { 348, 406, 468, 469, 408 }, { 349, 405, 461, 465, 407 },
+ { 349, 405, 463, 467, 409 }, { 349, 407, 468, 469, 409 },
+ { 350, 410, 470, 472, 412 }, { 351, 410, 470, 473, 413 },
+ { 352, 411, 471, 474, 414 }, { 353, 411, 471, 475, 415 },
+ { 354, 416, 478, 480, 418 }, { 355, 417, 479, 481, 419 },
+ { 356, 412, 472, 476, 420 }, { 357, 413, 473, 477, 421 },
+ { 358, 414, 474, 482, 422 }, { 359, 415, 475, 483, 423 },
+ { 360, 420, 476, 477, 421 }, { 361, 416, 478, 484, 426 },
+ { 362, 417, 479, 485, 427 }, { 363, 418, 480, 486, 428 },
+ { 364, 419, 481, 487, 429 }, { 365, 422, 482, 483, 423 },
+ { 366, 424, 488, 494, 432 }, { 367, 425, 489, 495, 433 },
+ { 368, 430, 492, 496, 434 }, { 369, 431, 493, 497, 435 },
+ { 370, 424, 488, 498, 438 }, { 371, 425, 489, 499, 439 },
+ { 372, 426, 484, 490, 436 }, { 373, 427, 485, 491, 437 },
+ { 374, 428, 486, 490, 436 }, { 375, 429, 487, 491, 437 },
+ { 376, 430, 492, 500, 440 }, { 377, 431, 493, 501, 441 },
+ { 378, 432, 494, 502, 444 }, { 379, 433, 495, 503, 445 },
+ { 380, 434, 496, 504, 446 }, { 381, 435, 497, 505, 447 },
+ { 382, 438, 498, 506, 448 }, { 383, 439, 499, 507, 449 },
+ { 384, 442, 508, 512, 450 }, { 385, 443, 509, 513, 451 },
+ { 386, 442, 508, 514, 452 }, { 387, 443, 509, 515, 453 },
+ { 388, 440, 500, 510, 454 }, { 389, 441, 501, 511, 455 },
+ { 390, 444, 502, 506, 448 }, { 391, 445, 503, 507, 449 },
+ { 392, 446, 504, 510, 454 }, { 393, 447, 505, 511, 455 },
+ { 394, 456, 516, 517, 457 }, { 395, 450, 512, 518, 460 },
+ { 396, 451, 513, 519, 461 }, { 397, 452, 514, 520, 462 },
+ { 398, 453, 515, 521, 463 }, { 399, 458, 522, 523, 459 },
+ { 400, 456, 516, 524, 464 }, { 401, 457, 517, 525, 465 },
+ { 402, 458, 522, 526, 466 }, { 403, 459, 523, 527, 467 },
+ { 404, 460, 518, 520, 462 }, { 405, 461, 519, 521, 463 },
+ { 406, 464, 524, 528, 468 }, { 407, 465, 525, 528, 468 },
+ { 408, 466, 526, 529, 469 }, { 409, 467, 527, 529, 469 },
+ { 410, 411, 471, 530, 470 }, { 412, 416, 478, 531, 472 },
+ { 413, 417, 479, 532, 473 }, { 414, 418, 480, 533, 474 },
+ { 415, 419, 481, 534, 475 }, { 420, 424, 488, 535, 476 },
+ { 421, 425, 489, 536, 477 }, { 422, 430, 492, 537, 482 },
+ { 423, 431, 493, 538, 483 }, { 426, 432, 494, 539, 484 },
+ { 427, 433, 495, 540, 485 }, { 428, 434, 496, 541, 486 },
+ { 429, 435, 497, 542, 487 }, { 436, 442, 508, 544, 490 },
+ { 437, 443, 509, 545, 491 }, { 438, 439, 499, 543, 498 },
+ { 440, 441, 501, 546, 500 }, { 444, 450, 512, 547, 502 },
+ { 445, 451, 513, 548, 503 }, { 446, 452, 514, 549, 504 },
+ { 447, 453, 515, 550, 505 }, { 448, 456, 516, 551, 506 },
+ { 449, 457, 517, 552, 507 }, { 454, 458, 522, 553, 510 },
+ { 455, 459, 523, 554, 511 }, { 460, 464, 524, 555, 518 },
+ { 461, 465, 525, 556, 519 }, { 462, 466, 526, 557, 520 },
+ { 463, 467, 527, 558, 521 }, { 468, 469, 529, 559, 528 },
+ { 470, 472, 476, 477, 473 }, { 470, 472, 531, 560, 530 },
+ { 470, 473, 532, 561, 530 }, { 471, 474, 482, 483, 475 },
+ { 471, 474, 533, 560, 530 }, { 471, 475, 534, 561, 530 },
+ { 472, 476, 535, 562, 531 }, { 473, 477, 536, 563, 532 },
+ { 474, 482, 537, 564, 533 }, { 475, 483, 538, 565, 534 },
+ { 476, 477, 536, 566, 535 }, { 478, 480, 486, 490, 484 },
+ { 478, 480, 533, 560, 531 }, { 478, 484, 539, 562, 531 },
+ { 479, 481, 487, 491, 485 }, { 479, 481, 534, 561, 532 },
+ { 479, 485, 540, 563, 532 }, { 480, 486, 541, 564, 533 },
+ { 481, 487, 542, 565, 534 }, { 482, 483, 538, 567, 537 },
+ { 484, 490, 544, 568, 539 }, { 485, 491, 545, 569, 540 },
+ { 486, 490, 544, 570, 541 }, { 487, 491, 545, 571, 542 },
+ { 488, 494, 502, 506, 498 }, { 488, 494, 539, 562, 535 },
+ { 488, 498, 543, 566, 535 }, { 489, 495, 503, 507, 499 },
+ { 489, 495, 540, 563, 536 }, { 489, 499, 543, 566, 536 },
+ { 492, 496, 504, 510, 500 }, { 492, 496, 541, 564, 537 },
+ { 492, 500, 546, 567, 537 }, { 493, 497, 505, 511, 501 },
+ { 493, 497, 542, 565, 538 }, { 493, 501, 546, 567, 538 },
+ { 494, 502, 547, 568, 539 }, { 495, 503, 548, 569, 540 },
+ { 496, 504, 549, 570, 541 }, { 497, 505, 550, 571, 542 },
+ { 498, 506, 551, 572, 543 }, { 499, 507, 552, 572, 543 },
+ { 500, 510, 553, 573, 546 }, { 501, 511, 554, 573, 546 },
+ { 502, 506, 551, 574, 547 }, { 503, 507, 552, 575, 548 },
+ { 504, 510, 553, 576, 549 }, { 505, 511, 554, 577, 550 },
+ { 508, 512, 518, 520, 514 }, { 508, 512, 547, 568, 544 },
+ { 508, 514, 549, 570, 544 }, { 509, 513, 519, 521, 515 },
+ { 509, 513, 548, 569, 545 }, { 509, 515, 550, 571, 545 },
+ { 512, 518, 555, 574, 547 }, { 513, 519, 556, 575, 548 },
+ { 514, 520, 557, 576, 549 }, { 515, 521, 558, 577, 550 },
+ { 516, 517, 525, 528, 524 }, { 516, 517, 552, 572, 551 },
+ { 516, 524, 555, 574, 551 }, { 517, 525, 556, 575, 552 },
+ { 518, 520, 557, 578, 555 }, { 519, 521, 558, 579, 556 },
+ { 522, 523, 527, 529, 526 }, { 522, 523, 554, 573, 553 },
+ { 522, 526, 557, 576, 553 }, { 523, 527, 558, 577, 554 },
+ { 524, 528, 559, 578, 555 }, { 525, 528, 559, 579, 556 },
+ { 526, 529, 559, 578, 557 }, { 527, 529, 559, 579, 558 },
+ { 530, 560, 580, 581, 561 }, { 531, 560, 580, 582, 562 },
+ { 532, 561, 581, 583, 563 }, { 533, 560, 580, 584, 564 },
+ { 534, 561, 581, 585, 565 }, { 535, 562, 582, 586, 566 },
+ { 536, 563, 583, 586, 566 }, { 537, 564, 584, 587, 567 },
+ { 538, 565, 585, 587, 567 }, { 539, 562, 582, 588, 568 },
+ { 540, 563, 583, 589, 569 }, { 541, 564, 584, 590, 570 },
+ { 542, 565, 585, 591, 571 }, { 543, 566, 586, 592, 572 },
+ { 544, 568, 588, 590, 570 }, { 545, 569, 589, 591, 571 },
+ { 546, 567, 587, 593, 573 }, { 547, 568, 588, 594, 574 },
+ { 548, 569, 589, 595, 575 }, { 549, 570, 590, 596, 576 },
+ { 550, 571, 591, 597, 577 }, { 551, 572, 592, 594, 574 },
+ { 552, 572, 592, 595, 575 }, { 553, 573, 593, 596, 576 },
+ { 554, 573, 593, 597, 577 }, { 555, 574, 594, 598, 578 },
+ { 556, 575, 595, 599, 579 }, { 557, 576, 596, 598, 578 },
+ { 558, 577, 597, 599, 579 }, { 559, 578, 598, 599, 579 },
+ { 580, 581, 583, 586, 582 }, { 580, 581, 585, 587, 584 },
+ { 580, 582, 588, 590, 584 }, { 581, 583, 589, 591, 585 },
+ { 582, 586, 592, 594, 588 }, { 583, 586, 592, 595, 589 },
+ { 584, 587, 593, 596, 590 }, { 585, 587, 593, 597, 591 },
+ { 588, 590, 596, 598, 594 }, { 589, 591, 597, 599, 595 },
+ { 592, 594, 598, 599, 595 }, { 593, 596, 598, 599, 597 }
+};
+
+
+
+static const float vert_600[NUM_VERT_600][4] = {
+ { 0.0, 0.0, 0.0, -2.0 },
+ { 0.0, -GOLDENINV, -1.0, -GOLDEN },
+ { 0.0, GOLDENINV, -1.0, -GOLDEN },
+ { -1.0, 0.0, -GOLDENINV, -GOLDEN },
+ { 1.0, 0.0, -GOLDENINV, -GOLDEN },
+ { -GOLDENINV, -1.0, 0.0, -GOLDEN },
+ { GOLDENINV, -1.0, 0.0, -GOLDEN },
+ { -GOLDENINV, 1.0, 0.0, -GOLDEN },
+ { GOLDENINV, 1.0, 0.0, -GOLDEN },
+ { -1.0, 0.0, GOLDENINV, -GOLDEN },
+ { 1.0, 0.0, GOLDENINV, -GOLDEN },
+ { 0.0, -GOLDENINV, 1.0, -GOLDEN },
+ { 0.0, GOLDENINV, 1.0, -GOLDEN },
+ { -GOLDENINV, 0.0, -GOLDEN, -1.0 },
+ { GOLDENINV, 0.0, -GOLDEN, -1.0 },
+ { -1.0, -1.0, -1.0, -1.0 },
+ { 1.0, -1.0, -1.0, -1.0 },
+ { -1.0, 1.0, -1.0, -1.0 },
+ { 1.0, 1.0, -1.0, -1.0 },
+ { 0.0, -GOLDEN, -GOLDENINV, -1.0 },
+ { 0.0, GOLDEN, -GOLDENINV, -1.0 },
+ { -GOLDEN, -GOLDENINV, 0.0, -1.0 },
+ { GOLDEN, -GOLDENINV, 0.0, -1.0 },
+ { -GOLDEN, GOLDENINV, 0.0, -1.0 },
+ { GOLDEN, GOLDENINV, 0.0, -1.0 },
+ { 0.0, -GOLDEN, GOLDENINV, -1.0 },
+ { 0.0, GOLDEN, GOLDENINV, -1.0 },
+ { -1.0, -1.0, 1.0, -1.0 },
+ { 1.0, -1.0, 1.0, -1.0 },
+ { -1.0, 1.0, 1.0, -1.0 },
+ { 1.0, 1.0, 1.0, -1.0 },
+ { -GOLDENINV, 0.0, GOLDEN, -1.0 },
+ { GOLDENINV, 0.0, GOLDEN, -1.0 },
+ { 0.0, -1.0, -GOLDEN, -GOLDENINV },
+ { 0.0, 1.0, -GOLDEN, -GOLDENINV },
+ { -GOLDEN, 0.0, -1.0, -GOLDENINV },
+ { GOLDEN, 0.0, -1.0, -GOLDENINV },
+ { -1.0, -GOLDEN, 0.0, -GOLDENINV },
+ { 1.0, -GOLDEN, 0.0, -GOLDENINV },
+ { -1.0, GOLDEN, 0.0, -GOLDENINV },
+ { 1.0, GOLDEN, 0.0, -GOLDENINV },
+ { -GOLDEN, 0.0, 1.0, -GOLDENINV },
+ { GOLDEN, 0.0, 1.0, -GOLDENINV },
+ { 0.0, -1.0, GOLDEN, -GOLDENINV },
+ { 0.0, 1.0, GOLDEN, -GOLDENINV },
+ { 0.0, 0.0, -2.0, 0.0 },
+ { -1.0, -GOLDENINV, -GOLDEN, 0.0 },
+ { 1.0, -GOLDENINV, -GOLDEN, 0.0 },
+ { -1.0, GOLDENINV, -GOLDEN, 0.0 },
+ { 1.0, GOLDENINV, -GOLDEN, 0.0 },
+ { -GOLDENINV, -GOLDEN, -1.0, 0.0 },
+ { GOLDENINV, -GOLDEN, -1.0, 0.0 },
+ { -GOLDENINV, GOLDEN, -1.0, 0.0 },
+ { GOLDENINV, GOLDEN, -1.0, 0.0 },
+ { -GOLDEN, -1.0, -GOLDENINV, 0.0 },
+ { GOLDEN, -1.0, -GOLDENINV, 0.0 },
+ { -GOLDEN, 1.0, -GOLDENINV, 0.0 },
+ { GOLDEN, 1.0, -GOLDENINV, 0.0 },
+ { 0.0, -2.0, 0.0, 0.0 },
+ { -2.0, 0.0, 0.0, 0.0 },
+ { 2.0, 0.0, 0.0, 0.0 },
+ { 0.0, 2.0, 0.0, 0.0 },
+ { -GOLDEN, -1.0, GOLDENINV, 0.0 },
+ { GOLDEN, -1.0, GOLDENINV, 0.0 },
+ { -GOLDEN, 1.0, GOLDENINV, 0.0 },
+ { GOLDEN, 1.0, GOLDENINV, 0.0 },
+ { -GOLDENINV, -GOLDEN, 1.0, 0.0 },
+ { GOLDENINV, -GOLDEN, 1.0, 0.0 },
+ { -GOLDENINV, GOLDEN, 1.0, 0.0 },
+ { GOLDENINV, GOLDEN, 1.0, 0.0 },
+ { -1.0, -GOLDENINV, GOLDEN, 0.0 },
+ { 1.0, -GOLDENINV, GOLDEN, 0.0 },
+ { -1.0, GOLDENINV, GOLDEN, 0.0 },
+ { 1.0, GOLDENINV, GOLDEN, 0.0 },
+ { 0.0, 0.0, 2.0, 0.0 },
+ { 0.0, -1.0, -GOLDEN, GOLDENINV },
+ { 0.0, 1.0, -GOLDEN, GOLDENINV },
+ { -GOLDEN, 0.0, -1.0, GOLDENINV },
+ { GOLDEN, 0.0, -1.0, GOLDENINV },
+ { -1.0, -GOLDEN, 0.0, GOLDENINV },
+ { 1.0, -GOLDEN, 0.0, GOLDENINV },
+ { -1.0, GOLDEN, 0.0, GOLDENINV },
+ { 1.0, GOLDEN, 0.0, GOLDENINV },
+ { -GOLDEN, 0.0, 1.0, GOLDENINV },
+ { GOLDEN, 0.0, 1.0, GOLDENINV },
+ { 0.0, -1.0, GOLDEN, GOLDENINV },
+ { 0.0, 1.0, GOLDEN, GOLDENINV },
+ { -GOLDENINV, 0.0, -GOLDEN, 1.0 },
+ { GOLDENINV, 0.0, -GOLDEN, 1.0 },
+ { -1.0, -1.0, -1.0, 1.0 },
+ { 1.0, -1.0, -1.0, 1.0 },
+ { -1.0, 1.0, -1.0, 1.0 },
+ { 1.0, 1.0, -1.0, 1.0 },
+ { 0.0, -GOLDEN, -GOLDENINV, 1.0 },
+ { 0.0, GOLDEN, -GOLDENINV, 1.0 },
+ { -GOLDEN, -GOLDENINV, 0.0, 1.0 },
+ { GOLDEN, -GOLDENINV, 0.0, 1.0 },
+ { -GOLDEN, GOLDENINV, 0.0, 1.0 },
+ { GOLDEN, GOLDENINV, 0.0, 1.0 },
+ { 0.0, -GOLDEN, GOLDENINV, 1.0 },
+ { 0.0, GOLDEN, GOLDENINV, 1.0 },
+ { -1.0, -1.0, 1.0, 1.0 },
+ { 1.0, -1.0, 1.0, 1.0 },
+ { -1.0, 1.0, 1.0, 1.0 },
+ { 1.0, 1.0, 1.0, 1.0 },
+ { -GOLDENINV, 0.0, GOLDEN, 1.0 },
+ { GOLDENINV, 0.0, GOLDEN, 1.0 },
+ { 0.0, -GOLDENINV, -1.0, GOLDEN },
+ { 0.0, GOLDENINV, -1.0, GOLDEN },
+ { -1.0, 0.0, -GOLDENINV, GOLDEN },
+ { 1.0, 0.0, -GOLDENINV, GOLDEN },
+ { -GOLDENINV, -1.0, 0.0, GOLDEN },
+ { GOLDENINV, -1.0, 0.0, GOLDEN },
+ { -GOLDENINV, 1.0, 0.0, GOLDEN },
+ { GOLDENINV, 1.0, 0.0, GOLDEN },
+ { -1.0, 0.0, GOLDENINV, GOLDEN },
+ { 1.0, 0.0, GOLDENINV, GOLDEN },
+ { 0.0, -GOLDENINV, 1.0, GOLDEN },
+ { 0.0, GOLDENINV, 1.0, GOLDEN },
+ { 0.0, 0.0, 0.0, 2.0 }
+};
+
+static const int edge_600[NUM_EDGE_600][2] = {
+ { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
+ { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 }, { 0, 10 },
+ { 0, 11 }, { 0, 12 }, { 1, 2 }, { 1, 3 }, { 1, 4 },
+ { 1, 5 }, { 1, 6 }, { 1, 13 }, { 1, 14 }, { 1, 15 },
+ { 1, 16 }, { 1, 19 }, { 1, 33 }, { 2, 3 }, { 2, 4 },
+ { 2, 7 }, { 2, 8 }, { 2, 13 }, { 2, 14 }, { 2, 17 },
+ { 2, 18 }, { 2, 20 }, { 2, 34 }, { 3, 5 }, { 3, 7 },
+ { 3, 9 }, { 3, 13 }, { 3, 15 }, { 3, 17 }, { 3, 21 },
+ { 3, 23 }, { 3, 35 }, { 4, 6 }, { 4, 8 }, { 4, 10 },
+ { 4, 14 }, { 4, 16 }, { 4, 18 }, { 4, 22 }, { 4, 24 },
+ { 4, 36 }, { 5, 6 }, { 5, 9 }, { 5, 11 }, { 5, 15 },
+ { 5, 19 }, { 5, 21 }, { 5, 25 }, { 5, 27 }, { 5, 37 },
+ { 6, 10 }, { 6, 11 }, { 6, 16 }, { 6, 19 }, { 6, 22 },
+ { 6, 25 }, { 6, 28 }, { 6, 38 }, { 7, 8 }, { 7, 9 },
+ { 7, 12 }, { 7, 17 }, { 7, 20 }, { 7, 23 }, { 7, 26 },
+ { 7, 29 }, { 7, 39 }, { 8, 10 }, { 8, 12 }, { 8, 18 },
+ { 8, 20 }, { 8, 24 }, { 8, 26 }, { 8, 30 }, { 8, 40 },
+ { 9, 11 }, { 9, 12 }, { 9, 21 }, { 9, 23 }, { 9, 27 },
+ { 9, 29 }, { 9, 31 }, { 9, 41 }, { 10, 11 }, { 10, 12 },
+ { 10, 22 }, { 10, 24 }, { 10, 28 }, { 10, 30 }, { 10, 32 },
+ { 10, 42 }, { 11, 12 }, { 11, 25 }, { 11, 27 }, { 11, 28 },
+ { 11, 31 }, { 11, 32 }, { 11, 43 }, { 12, 26 }, { 12, 29 },
+ { 12, 30 }, { 12, 31 }, { 12, 32 }, { 12, 44 }, { 13, 14 },
+ { 13, 15 }, { 13, 17 }, { 13, 33 }, { 13, 34 }, { 13, 35 },
+ { 13, 45 }, { 13, 46 }, { 13, 48 }, { 14, 16 }, { 14, 18 },
+ { 14, 33 }, { 14, 34 }, { 14, 36 }, { 14, 45 }, { 14, 47 },
+ { 14, 49 }, { 15, 19 }, { 15, 21 }, { 15, 33 }, { 15, 35 },
+ { 15, 37 }, { 15, 46 }, { 15, 50 }, { 15, 54 }, { 16, 19 },
+ { 16, 22 }, { 16, 33 }, { 16, 36 }, { 16, 38 }, { 16, 47 },
+ { 16, 51 }, { 16, 55 }, { 17, 20 }, { 17, 23 }, { 17, 34 },
+ { 17, 35 }, { 17, 39 }, { 17, 48 }, { 17, 52 }, { 17, 56 },
+ { 18, 20 }, { 18, 24 }, { 18, 34 }, { 18, 36 }, { 18, 40 },
+ { 18, 49 }, { 18, 53 }, { 18, 57 }, { 19, 25 }, { 19, 33 },
+ { 19, 37 }, { 19, 38 }, { 19, 50 }, { 19, 51 }, { 19, 58 },
+ { 20, 26 }, { 20, 34 }, { 20, 39 }, { 20, 40 }, { 20, 52 },
+ { 20, 53 }, { 20, 61 }, { 21, 23 }, { 21, 27 }, { 21, 35 },
+ { 21, 37 }, { 21, 41 }, { 21, 54 }, { 21, 59 }, { 21, 62 },
+ { 22, 24 }, { 22, 28 }, { 22, 36 }, { 22, 38 }, { 22, 42 },
+ { 22, 55 }, { 22, 60 }, { 22, 63 }, { 23, 29 }, { 23, 35 },
+ { 23, 39 }, { 23, 41 }, { 23, 56 }, { 23, 59 }, { 23, 64 },
+ { 24, 30 }, { 24, 36 }, { 24, 40 }, { 24, 42 }, { 24, 57 },
+ { 24, 60 }, { 24, 65 }, { 25, 27 }, { 25, 28 }, { 25, 37 },
+ { 25, 38 }, { 25, 43 }, { 25, 58 }, { 25, 66 }, { 25, 67 },
+ { 26, 29 }, { 26, 30 }, { 26, 39 }, { 26, 40 }, { 26, 44 },
+ { 26, 61 }, { 26, 68 }, { 26, 69 }, { 27, 31 }, { 27, 37 },
+ { 27, 41 }, { 27, 43 }, { 27, 62 }, { 27, 66 }, { 27, 70 },
+ { 28, 32 }, { 28, 38 }, { 28, 42 }, { 28, 43 }, { 28, 63 },
+ { 28, 67 }, { 28, 71 }, { 29, 31 }, { 29, 39 }, { 29, 41 },
+ { 29, 44 }, { 29, 64 }, { 29, 68 }, { 29, 72 }, { 30, 32 },
+ { 30, 40 }, { 30, 42 }, { 30, 44 }, { 30, 65 }, { 30, 69 },
+ { 30, 73 }, { 31, 32 }, { 31, 41 }, { 31, 43 }, { 31, 44 },
+ { 31, 70 }, { 31, 72 }, { 31, 74 }, { 32, 42 }, { 32, 43 },
+ { 32, 44 }, { 32, 71 }, { 32, 73 }, { 32, 74 }, { 33, 45 },
+ { 33, 46 }, { 33, 47 }, { 33, 50 }, { 33, 51 }, { 33, 75 },
+ { 34, 45 }, { 34, 48 }, { 34, 49 }, { 34, 52 }, { 34, 53 },
+ { 34, 76 }, { 35, 46 }, { 35, 48 }, { 35, 54 }, { 35, 56 },
+ { 35, 59 }, { 35, 77 }, { 36, 47 }, { 36, 49 }, { 36, 55 },
+ { 36, 57 }, { 36, 60 }, { 36, 78 }, { 37, 50 }, { 37, 54 },
+ { 37, 58 }, { 37, 62 }, { 37, 66 }, { 37, 79 }, { 38, 51 },
+ { 38, 55 }, { 38, 58 }, { 38, 63 }, { 38, 67 }, { 38, 80 },
+ { 39, 52 }, { 39, 56 }, { 39, 61 }, { 39, 64 }, { 39, 68 },
+ { 39, 81 }, { 40, 53 }, { 40, 57 }, { 40, 61 }, { 40, 65 },
+ { 40, 69 }, { 40, 82 }, { 41, 59 }, { 41, 62 }, { 41, 64 },
+ { 41, 70 }, { 41, 72 }, { 41, 83 }, { 42, 60 }, { 42, 63 },
+ { 42, 65 }, { 42, 71 }, { 42, 73 }, { 42, 84 }, { 43, 66 },
+ { 43, 67 }, { 43, 70 }, { 43, 71 }, { 43, 74 }, { 43, 85 },
+ { 44, 68 }, { 44, 69 }, { 44, 72 }, { 44, 73 }, { 44, 74 },
+ { 44, 86 }, { 45, 46 }, { 45, 47 }, { 45, 48 }, { 45, 49 },
+ { 45, 75 }, { 45, 76 }, { 45, 87 }, { 45, 88 }, { 46, 48 },
+ { 46, 50 }, { 46, 54 }, { 46, 75 }, { 46, 77 }, { 46, 87 },
+ { 46, 89 }, { 47, 49 }, { 47, 51 }, { 47, 55 }, { 47, 75 },
+ { 47, 78 }, { 47, 88 }, { 47, 90 }, { 48, 52 }, { 48, 56 },
+ { 48, 76 }, { 48, 77 }, { 48, 87 }, { 48, 91 }, { 49, 53 },
+ { 49, 57 }, { 49, 76 }, { 49, 78 }, { 49, 88 }, { 49, 92 },
+ { 50, 51 }, { 50, 54 }, { 50, 58 }, { 50, 75 }, { 50, 79 },
+ { 50, 89 }, { 50, 93 }, { 51, 55 }, { 51, 58 }, { 51, 75 },
+ { 51, 80 }, { 51, 90 }, { 51, 93 }, { 52, 53 }, { 52, 56 },
+ { 52, 61 }, { 52, 76 }, { 52, 81 }, { 52, 91 }, { 52, 94 },
+ { 53, 57 }, { 53, 61 }, { 53, 76 }, { 53, 82 }, { 53, 92 },
+ { 53, 94 }, { 54, 59 }, { 54, 62 }, { 54, 77 }, { 54, 79 },
+ { 54, 89 }, { 54, 95 }, { 55, 60 }, { 55, 63 }, { 55, 78 },
+ { 55, 80 }, { 55, 90 }, { 55, 96 }, { 56, 59 }, { 56, 64 },
+ { 56, 77 }, { 56, 81 }, { 56, 91 }, { 56, 97 }, { 57, 60 },
+ { 57, 65 }, { 57, 78 }, { 57, 82 }, { 57, 92 }, { 57, 98 },
+ { 58, 66 }, { 58, 67 }, { 58, 79 }, { 58, 80 }, { 58, 93 },
+ { 58, 99 }, { 59, 62 }, { 59, 64 }, { 59, 77 }, { 59, 83 },
+ { 59, 95 }, { 59, 97 }, { 60, 63 }, { 60, 65 }, { 60, 78 },
+ { 60, 84 }, { 60, 96 }, { 60, 98 }, { 61, 68 }, { 61, 69 },
+ { 61, 81 }, { 61, 82 }, { 61, 94 }, { 61, 100 }, { 62, 66 },
+ { 62, 70 }, { 62, 79 }, { 62, 83 }, { 62, 95 }, { 62, 101 },
+ { 63, 67 }, { 63, 71 }, { 63, 80 }, { 63, 84 }, { 63, 96 },
+ { 63, 102 }, { 64, 68 }, { 64, 72 }, { 64, 81 }, { 64, 83 },
+ { 64, 97 }, { 64, 103 }, { 65, 69 }, { 65, 73 }, { 65, 82 },
+ { 65, 84 }, { 65, 98 }, { 65, 104 }, { 66, 67 }, { 66, 70 },
+ { 66, 79 }, { 66, 85 }, { 66, 99 }, { 66, 101 }, { 67, 71 },
+ { 67, 80 }, { 67, 85 }, { 67, 99 }, { 67, 102 }, { 68, 69 },
+ { 68, 72 }, { 68, 81 }, { 68, 86 }, { 68, 100 }, { 68, 103 },
+ { 69, 73 }, { 69, 82 }, { 69, 86 }, { 69, 100 }, { 69, 104 },
+ { 70, 72 }, { 70, 74 }, { 70, 83 }, { 70, 85 }, { 70, 101 },
+ { 70, 105 }, { 71, 73 }, { 71, 74 }, { 71, 84 }, { 71, 85 },
+ { 71, 102 }, { 71, 106 }, { 72, 74 }, { 72, 83 }, { 72, 86 },
+ { 72, 103 }, { 72, 105 }, { 73, 74 }, { 73, 84 }, { 73, 86 },
+ { 73, 104 }, { 73, 106 }, { 74, 85 }, { 74, 86 }, { 74, 105 },
+ { 74, 106 }, { 75, 87 }, { 75, 88 }, { 75, 89 }, { 75, 90 },
+ { 75, 93 }, { 75, 107 }, { 76, 87 }, { 76, 88 }, { 76, 91 },
+ { 76, 92 }, { 76, 94 }, { 76, 108 }, { 77, 87 }, { 77, 89 },
+ { 77, 91 }, { 77, 95 }, { 77, 97 }, { 77, 109 }, { 78, 88 },
+ { 78, 90 }, { 78, 92 }, { 78, 96 }, { 78, 98 }, { 78, 110 },
+ { 79, 89 }, { 79, 93 }, { 79, 95 }, { 79, 99 }, { 79, 101 },
+ { 79, 111 }, { 80, 90 }, { 80, 93 }, { 80, 96 }, { 80, 99 },
+ { 80, 102 }, { 80, 112 }, { 81, 91 }, { 81, 94 }, { 81, 97 },
+ { 81, 100 }, { 81, 103 }, { 81, 113 }, { 82, 92 }, { 82, 94 },
+ { 82, 98 }, { 82, 100 }, { 82, 104 }, { 82, 114 }, { 83, 95 },
+ { 83, 97 }, { 83, 101 }, { 83, 103 }, { 83, 105 }, { 83, 115 },
+ { 84, 96 }, { 84, 98 }, { 84, 102 }, { 84, 104 }, { 84, 106 },
+ { 84, 116 }, { 85, 99 }, { 85, 101 }, { 85, 102 }, { 85, 105 },
+ { 85, 106 }, { 85, 117 }, { 86, 100 }, { 86, 103 }, { 86, 104 },
+ { 86, 105 }, { 86, 106 }, { 86, 118 }, { 87, 88 }, { 87, 89 },
+ { 87, 91 }, { 87, 107 }, { 87, 108 }, { 87, 109 }, { 88, 90 },
+ { 88, 92 }, { 88, 107 }, { 88, 108 }, { 88, 110 }, { 89, 93 },
+ { 89, 95 }, { 89, 107 }, { 89, 109 }, { 89, 111 }, { 90, 93 },
+ { 90, 96 }, { 90, 107 }, { 90, 110 }, { 90, 112 }, { 91, 94 },
+ { 91, 97 }, { 91, 108 }, { 91, 109 }, { 91, 113 }, { 92, 94 },
+ { 92, 98 }, { 92, 108 }, { 92, 110 }, { 92, 114 }, { 93, 99 },
+ { 93, 107 }, { 93, 111 }, { 93, 112 }, { 94, 100 }, { 94, 108 },
+ { 94, 113 }, { 94, 114 }, { 95, 97 }, { 95, 101 }, { 95, 109 },
+ { 95, 111 }, { 95, 115 }, { 96, 98 }, { 96, 102 }, { 96, 110 },
+ { 96, 112 }, { 96, 116 }, { 97, 103 }, { 97, 109 }, { 97, 113 },
+ { 97, 115 }, { 98, 104 }, { 98, 110 }, { 98, 114 }, { 98, 116 },
+ { 99, 101 }, { 99, 102 }, { 99, 111 }, { 99, 112 }, { 99, 117 },
+ { 100, 103 }, { 100, 104 }, { 100, 113 }, { 100, 114 }, { 100, 118 },
+ { 101, 105 }, { 101, 111 }, { 101, 115 }, { 101, 117 }, { 102, 106 },
+ { 102, 112 }, { 102, 116 }, { 102, 117 }, { 103, 105 }, { 103, 113 },
+ { 103, 115 }, { 103, 118 }, { 104, 106 }, { 104, 114 }, { 104, 116 },
+ { 104, 118 }, { 105, 106 }, { 105, 115 }, { 105, 117 }, { 105, 118 },
+ { 106, 116 }, { 106, 117 }, { 106, 118 }, { 107, 108 }, { 107, 109 },
+ { 107, 110 }, { 107, 111 }, { 107, 112 }, { 107, 119 }, { 108, 109 },
+ { 108, 110 }, { 108, 113 }, { 108, 114 }, { 108, 119 }, { 109, 111 },
+ { 109, 113 }, { 109, 115 }, { 109, 119 }, { 110, 112 }, { 110, 114 },
+ { 110, 116 }, { 110, 119 }, { 111, 112 }, { 111, 115 }, { 111, 117 },
+ { 111, 119 }, { 112, 116 }, { 112, 117 }, { 112, 119 }, { 113, 114 },
+ { 113, 115 }, { 113, 118 }, { 113, 119 }, { 114, 116 }, { 114, 118 },
+ { 114, 119 }, { 115, 117 }, { 115, 118 }, { 115, 119 }, { 116, 117 },
+ { 116, 118 }, { 116, 119 }, { 117, 118 }, { 117, 119 }, { 118, 119 }
+};
+
+static const int face_600[NUM_FACE_600][VERT_PER_FACE_600] = {
+ { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 1, 5 },
+ { 0, 1, 6 }, { 0, 2, 3 }, { 0, 2, 4 }, { 0, 2, 7 },
+ { 0, 2, 8 }, { 0, 3, 5 }, { 0, 3, 7 }, { 0, 3, 9 },
+ { 0, 4, 6 }, { 0, 4, 8 }, { 0, 4, 10 }, { 0, 5, 6 },
+ { 0, 5, 9 }, { 0, 5, 11 }, { 0, 6, 10 }, { 0, 6, 11 },
+ { 0, 7, 8 }, { 0, 7, 9 }, { 0, 7, 12 }, { 0, 8, 10 },
+ { 0, 8, 12 }, { 0, 9, 11 }, { 0, 9, 12 }, { 0, 10, 11 },
+ { 0, 10, 12 }, { 0, 11, 12 }, { 1, 2, 3 }, { 1, 2, 4 },
+ { 1, 2, 13 }, { 1, 2, 14 }, { 1, 3, 5 }, { 1, 3, 13 },
+ { 1, 3, 15 }, { 1, 4, 6 }, { 1, 4, 14 }, { 1, 4, 16 },
+ { 1, 5, 6 }, { 1, 5, 15 }, { 1, 5, 19 }, { 1, 6, 16 },
+ { 1, 6, 19 }, { 1, 13, 14 }, { 1, 13, 15 }, { 1, 13, 33 },
+ { 1, 14, 16 }, { 1, 14, 33 }, { 1, 15, 19 }, { 1, 15, 33 },
+ { 1, 16, 19 }, { 1, 16, 33 }, { 1, 19, 33 }, { 2, 3, 7 },
+ { 2, 3, 13 }, { 2, 3, 17 }, { 2, 4, 8 }, { 2, 4, 14 },
+ { 2, 4, 18 }, { 2, 7, 8 }, { 2, 7, 17 }, { 2, 7, 20 },
+ { 2, 8, 18 }, { 2, 8, 20 }, { 2, 13, 14 }, { 2, 13, 17 },
+ { 2, 13, 34 }, { 2, 14, 18 }, { 2, 14, 34 }, { 2, 17, 20 },
+ { 2, 17, 34 }, { 2, 18, 20 }, { 2, 18, 34 }, { 2, 20, 34 },
+ { 3, 5, 9 }, { 3, 5, 15 }, { 3, 5, 21 }, { 3, 7, 9 },
+ { 3, 7, 17 }, { 3, 7, 23 }, { 3, 9, 21 }, { 3, 9, 23 },
+ { 3, 13, 15 }, { 3, 13, 17 }, { 3, 13, 35 }, { 3, 15, 21 },
+ { 3, 15, 35 }, { 3, 17, 23 }, { 3, 17, 35 }, { 3, 21, 23 },
+ { 3, 21, 35 }, { 3, 23, 35 }, { 4, 6, 10 }, { 4, 6, 16 },
+ { 4, 6, 22 }, { 4, 8, 10 }, { 4, 8, 18 }, { 4, 8, 24 },
+ { 4, 10, 22 }, { 4, 10, 24 }, { 4, 14, 16 }, { 4, 14, 18 },
+ { 4, 14, 36 }, { 4, 16, 22 }, { 4, 16, 36 }, { 4, 18, 24 },
+ { 4, 18, 36 }, { 4, 22, 24 }, { 4, 22, 36 }, { 4, 24, 36 },
+ { 5, 6, 11 }, { 5, 6, 19 }, { 5, 6, 25 }, { 5, 9, 11 },
+ { 5, 9, 21 }, { 5, 9, 27 }, { 5, 11, 25 }, { 5, 11, 27 },
+ { 5, 15, 19 }, { 5, 15, 21 }, { 5, 15, 37 }, { 5, 19, 25 },
+ { 5, 19, 37 }, { 5, 21, 27 }, { 5, 21, 37 }, { 5, 25, 27 },
+ { 5, 25, 37 }, { 5, 27, 37 }, { 6, 10, 11 }, { 6, 10, 22 },
+ { 6, 10, 28 }, { 6, 11, 25 }, { 6, 11, 28 }, { 6, 16, 19 },
+ { 6, 16, 22 }, { 6, 16, 38 }, { 6, 19, 25 }, { 6, 19, 38 },
+ { 6, 22, 28 }, { 6, 22, 38 }, { 6, 25, 28 }, { 6, 25, 38 },
+ { 6, 28, 38 }, { 7, 8, 12 }, { 7, 8, 20 }, { 7, 8, 26 },
+ { 7, 9, 12 }, { 7, 9, 23 }, { 7, 9, 29 }, { 7, 12, 26 },
+ { 7, 12, 29 }, { 7, 17, 20 }, { 7, 17, 23 }, { 7, 17, 39 },
+ { 7, 20, 26 }, { 7, 20, 39 }, { 7, 23, 29 }, { 7, 23, 39 },
+ { 7, 26, 29 }, { 7, 26, 39 }, { 7, 29, 39 }, { 8, 10, 12 },
+ { 8, 10, 24 }, { 8, 10, 30 }, { 8, 12, 26 }, { 8, 12, 30 },
+ { 8, 18, 20 }, { 8, 18, 24 }, { 8, 18, 40 }, { 8, 20, 26 },
+ { 8, 20, 40 }, { 8, 24, 30 }, { 8, 24, 40 }, { 8, 26, 30 },
+ { 8, 26, 40 }, { 8, 30, 40 }, { 9, 11, 12 }, { 9, 11, 27 },
+ { 9, 11, 31 }, { 9, 12, 29 }, { 9, 12, 31 }, { 9, 21, 23 },
+ { 9, 21, 27 }, { 9, 21, 41 }, { 9, 23, 29 }, { 9, 23, 41 },
+ { 9, 27, 31 }, { 9, 27, 41 }, { 9, 29, 31 }, { 9, 29, 41 },
+ { 9, 31, 41 }, { 10, 11, 12 }, { 10, 11, 28 }, { 10, 11, 32 },
+ { 10, 12, 30 }, { 10, 12, 32 }, { 10, 22, 24 }, { 10, 22, 28 },
+ { 10, 22, 42 }, { 10, 24, 30 }, { 10, 24, 42 }, { 10, 28, 32 },
+ { 10, 28, 42 }, { 10, 30, 32 }, { 10, 30, 42 }, { 10, 32, 42 },
+ { 11, 12, 31 }, { 11, 12, 32 }, { 11, 25, 27 }, { 11, 25, 28 },
+ { 11, 25, 43 }, { 11, 27, 31 }, { 11, 27, 43 }, { 11, 28, 32 },
+ { 11, 28, 43 }, { 11, 31, 32 }, { 11, 31, 43 }, { 11, 32, 43 },
+ { 12, 26, 29 }, { 12, 26, 30 }, { 12, 26, 44 }, { 12, 29, 31 },
+ { 12, 29, 44 }, { 12, 30, 32 }, { 12, 30, 44 }, { 12, 31, 32 },
+ { 12, 31, 44 }, { 12, 32, 44 }, { 13, 14, 33 }, { 13, 14, 34 },
+ { 13, 14, 45 }, { 13, 15, 33 }, { 13, 15, 35 }, { 13, 15, 46 },
+ { 13, 17, 34 }, { 13, 17, 35 }, { 13, 17, 48 }, { 13, 33, 45 },
+ { 13, 33, 46 }, { 13, 34, 45 }, { 13, 34, 48 }, { 13, 35, 46 },
+ { 13, 35, 48 }, { 13, 45, 46 }, { 13, 45, 48 }, { 13, 46, 48 },
+ { 14, 16, 33 }, { 14, 16, 36 }, { 14, 16, 47 }, { 14, 18, 34 },
+ { 14, 18, 36 }, { 14, 18, 49 }, { 14, 33, 45 }, { 14, 33, 47 },
+ { 14, 34, 45 }, { 14, 34, 49 }, { 14, 36, 47 }, { 14, 36, 49 },
+ { 14, 45, 47 }, { 14, 45, 49 }, { 14, 47, 49 }, { 15, 19, 33 },
+ { 15, 19, 37 }, { 15, 19, 50 }, { 15, 21, 35 }, { 15, 21, 37 },
+ { 15, 21, 54 }, { 15, 33, 46 }, { 15, 33, 50 }, { 15, 35, 46 },
+ { 15, 35, 54 }, { 15, 37, 50 }, { 15, 37, 54 }, { 15, 46, 50 },
+ { 15, 46, 54 }, { 15, 50, 54 }, { 16, 19, 33 }, { 16, 19, 38 },
+ { 16, 19, 51 }, { 16, 22, 36 }, { 16, 22, 38 }, { 16, 22, 55 },
+ { 16, 33, 47 }, { 16, 33, 51 }, { 16, 36, 47 }, { 16, 36, 55 },
+ { 16, 38, 51 }, { 16, 38, 55 }, { 16, 47, 51 }, { 16, 47, 55 },
+ { 16, 51, 55 }, { 17, 20, 34 }, { 17, 20, 39 }, { 17, 20, 52 },
+ { 17, 23, 35 }, { 17, 23, 39 }, { 17, 23, 56 }, { 17, 34, 48 },
+ { 17, 34, 52 }, { 17, 35, 48 }, { 17, 35, 56 }, { 17, 39, 52 },
+ { 17, 39, 56 }, { 17, 48, 52 }, { 17, 48, 56 }, { 17, 52, 56 },
+ { 18, 20, 34 }, { 18, 20, 40 }, { 18, 20, 53 }, { 18, 24, 36 },
+ { 18, 24, 40 }, { 18, 24, 57 }, { 18, 34, 49 }, { 18, 34, 53 },
+ { 18, 36, 49 }, { 18, 36, 57 }, { 18, 40, 53 }, { 18, 40, 57 },
+ { 18, 49, 53 }, { 18, 49, 57 }, { 18, 53, 57 }, { 19, 25, 37 },
+ { 19, 25, 38 }, { 19, 25, 58 }, { 19, 33, 50 }, { 19, 33, 51 },
+ { 19, 37, 50 }, { 19, 37, 58 }, { 19, 38, 51 }, { 19, 38, 58 },
+ { 19, 50, 51 }, { 19, 50, 58 }, { 19, 51, 58 }, { 20, 26, 39 },
+ { 20, 26, 40 }, { 20, 26, 61 }, { 20, 34, 52 }, { 20, 34, 53 },
+ { 20, 39, 52 }, { 20, 39, 61 }, { 20, 40, 53 }, { 20, 40, 61 },
+ { 20, 52, 53 }, { 20, 52, 61 }, { 20, 53, 61 }, { 21, 23, 35 },
+ { 21, 23, 41 }, { 21, 23, 59 }, { 21, 27, 37 }, { 21, 27, 41 },
+ { 21, 27, 62 }, { 21, 35, 54 }, { 21, 35, 59 }, { 21, 37, 54 },
+ { 21, 37, 62 }, { 21, 41, 59 }, { 21, 41, 62 }, { 21, 54, 59 },
+ { 21, 54, 62 }, { 21, 59, 62 }, { 22, 24, 36 }, { 22, 24, 42 },
+ { 22, 24, 60 }, { 22, 28, 38 }, { 22, 28, 42 }, { 22, 28, 63 },
+ { 22, 36, 55 }, { 22, 36, 60 }, { 22, 38, 55 }, { 22, 38, 63 },
+ { 22, 42, 60 }, { 22, 42, 63 }, { 22, 55, 60 }, { 22, 55, 63 },
+ { 22, 60, 63 }, { 23, 29, 39 }, { 23, 29, 41 }, { 23, 29, 64 },
+ { 23, 35, 56 }, { 23, 35, 59 }, { 23, 39, 56 }, { 23, 39, 64 },
+ { 23, 41, 59 }, { 23, 41, 64 }, { 23, 56, 59 }, { 23, 56, 64 },
+ { 23, 59, 64 }, { 24, 30, 40 }, { 24, 30, 42 }, { 24, 30, 65 },
+ { 24, 36, 57 }, { 24, 36, 60 }, { 24, 40, 57 }, { 24, 40, 65 },
+ { 24, 42, 60 }, { 24, 42, 65 }, { 24, 57, 60 }, { 24, 57, 65 },
+ { 24, 60, 65 }, { 25, 27, 37 }, { 25, 27, 43 }, { 25, 27, 66 },
+ { 25, 28, 38 }, { 25, 28, 43 }, { 25, 28, 67 }, { 25, 37, 58 },
+ { 25, 37, 66 }, { 25, 38, 58 }, { 25, 38, 67 }, { 25, 43, 66 },
+ { 25, 43, 67 }, { 25, 58, 66 }, { 25, 58, 67 }, { 25, 66, 67 },
+ { 26, 29, 39 }, { 26, 29, 44 }, { 26, 29, 68 }, { 26, 30, 40 },
+ { 26, 30, 44 }, { 26, 30, 69 }, { 26, 39, 61 }, { 26, 39, 68 },
+ { 26, 40, 61 }, { 26, 40, 69 }, { 26, 44, 68 }, { 26, 44, 69 },
+ { 26, 61, 68 }, { 26, 61, 69 }, { 26, 68, 69 }, { 27, 31, 41 },
+ { 27, 31, 43 }, { 27, 31, 70 }, { 27, 37, 62 }, { 27, 37, 66 },
+ { 27, 41, 62 }, { 27, 41, 70 }, { 27, 43, 66 }, { 27, 43, 70 },
+ { 27, 62, 66 }, { 27, 62, 70 }, { 27, 66, 70 }, { 28, 32, 42 },
+ { 28, 32, 43 }, { 28, 32, 71 }, { 28, 38, 63 }, { 28, 38, 67 },
+ { 28, 42, 63 }, { 28, 42, 71 }, { 28, 43, 67 }, { 28, 43, 71 },
+ { 28, 63, 67 }, { 28, 63, 71 }, { 28, 67, 71 }, { 29, 31, 41 },
+ { 29, 31, 44 }, { 29, 31, 72 }, { 29, 39, 64 }, { 29, 39, 68 },
+ { 29, 41, 64 }, { 29, 41, 72 }, { 29, 44, 68 }, { 29, 44, 72 },
+ { 29, 64, 68 }, { 29, 64, 72 }, { 29, 68, 72 }, { 30, 32, 42 },
+ { 30, 32, 44 }, { 30, 32, 73 }, { 30, 40, 65 }, { 30, 40, 69 },
+ { 30, 42, 65 }, { 30, 42, 73 }, { 30, 44, 69 }, { 30, 44, 73 },
+ { 30, 65, 69 }, { 30, 65, 73 }, { 30, 69, 73 }, { 31, 32, 43 },
+ { 31, 32, 44 }, { 31, 32, 74 }, { 31, 41, 70 }, { 31, 41, 72 },
+ { 31, 43, 70 }, { 31, 43, 74 }, { 31, 44, 72 }, { 31, 44, 74 },
+ { 31, 70, 72 }, { 31, 70, 74 }, { 31, 72, 74 }, { 32, 42, 71 },
+ { 32, 42, 73 }, { 32, 43, 71 }, { 32, 43, 74 }, { 32, 44, 73 },
+ { 32, 44, 74 }, { 32, 71, 73 }, { 32, 71, 74 }, { 32, 73, 74 },
+ { 33, 45, 46 }, { 33, 45, 47 }, { 33, 45, 75 }, { 33, 46, 50 },
+ { 33, 46, 75 }, { 33, 47, 51 }, { 33, 47, 75 }, { 33, 50, 51 },
+ { 33, 50, 75 }, { 33, 51, 75 }, { 34, 45, 48 }, { 34, 45, 49 },
+ { 34, 45, 76 }, { 34, 48, 52 }, { 34, 48, 76 }, { 34, 49, 53 },
+ { 34, 49, 76 }, { 34, 52, 53 }, { 34, 52, 76 }, { 34, 53, 76 },
+ { 35, 46, 48 }, { 35, 46, 54 }, { 35, 46, 77 }, { 35, 48, 56 },
+ { 35, 48, 77 }, { 35, 54, 59 }, { 35, 54, 77 }, { 35, 56, 59 },
+ { 35, 56, 77 }, { 35, 59, 77 }, { 36, 47, 49 }, { 36, 47, 55 },
+ { 36, 47, 78 }, { 36, 49, 57 }, { 36, 49, 78 }, { 36, 55, 60 },
+ { 36, 55, 78 }, { 36, 57, 60 }, { 36, 57, 78 }, { 36, 60, 78 },
+ { 37, 50, 54 }, { 37, 50, 58 }, { 37, 50, 79 }, { 37, 54, 62 },
+ { 37, 54, 79 }, { 37, 58, 66 }, { 37, 58, 79 }, { 37, 62, 66 },
+ { 37, 62, 79 }, { 37, 66, 79 }, { 38, 51, 55 }, { 38, 51, 58 },
+ { 38, 51, 80 }, { 38, 55, 63 }, { 38, 55, 80 }, { 38, 58, 67 },
+ { 38, 58, 80 }, { 38, 63, 67 }, { 38, 63, 80 }, { 38, 67, 80 },
+ { 39, 52, 56 }, { 39, 52, 61 }, { 39, 52, 81 }, { 39, 56, 64 },
+ { 39, 56, 81 }, { 39, 61, 68 }, { 39, 61, 81 }, { 39, 64, 68 },
+ { 39, 64, 81 }, { 39, 68, 81 }, { 40, 53, 57 }, { 40, 53, 61 },
+ { 40, 53, 82 }, { 40, 57, 65 }, { 40, 57, 82 }, { 40, 61, 69 },
+ { 40, 61, 82 }, { 40, 65, 69 }, { 40, 65, 82 }, { 40, 69, 82 },
+ { 41, 59, 62 }, { 41, 59, 64 }, { 41, 59, 83 }, { 41, 62, 70 },
+ { 41, 62, 83 }, { 41, 64, 72 }, { 41, 64, 83 }, { 41, 70, 72 },
+ { 41, 70, 83 }, { 41, 72, 83 }, { 42, 60, 63 }, { 42, 60, 65 },
+ { 42, 60, 84 }, { 42, 63, 71 }, { 42, 63, 84 }, { 42, 65, 73 },
+ { 42, 65, 84 }, { 42, 71, 73 }, { 42, 71, 84 }, { 42, 73, 84 },
+ { 43, 66, 67 }, { 43, 66, 70 }, { 43, 66, 85 }, { 43, 67, 71 },
+ { 43, 67, 85 }, { 43, 70, 74 }, { 43, 70, 85 }, { 43, 71, 74 },
+ { 43, 71, 85 }, { 43, 74, 85 }, { 44, 68, 69 }, { 44, 68, 72 },
+ { 44, 68, 86 }, { 44, 69, 73 }, { 44, 69, 86 }, { 44, 72, 74 },
+ { 44, 72, 86 }, { 44, 73, 74 }, { 44, 73, 86 }, { 44, 74, 86 },
+ { 45, 46, 48 }, { 45, 46, 75 }, { 45, 46, 87 }, { 45, 47, 49 },
+ { 45, 47, 75 }, { 45, 47, 88 }, { 45, 48, 76 }, { 45, 48, 87 },
+ { 45, 49, 76 }, { 45, 49, 88 }, { 45, 75, 87 }, { 45, 75, 88 },
+ { 45, 76, 87 }, { 45, 76, 88 }, { 45, 87, 88 }, { 46, 48, 77 },
+ { 46, 48, 87 }, { 46, 50, 54 }, { 46, 50, 75 }, { 46, 50, 89 },
+ { 46, 54, 77 }, { 46, 54, 89 }, { 46, 75, 87 }, { 46, 75, 89 },
+ { 46, 77, 87 }, { 46, 77, 89 }, { 46, 87, 89 }, { 47, 49, 78 },
+ { 47, 49, 88 }, { 47, 51, 55 }, { 47, 51, 75 }, { 47, 51, 90 },
+ { 47, 55, 78 }, { 47, 55, 90 }, { 47, 75, 88 }, { 47, 75, 90 },
+ { 47, 78, 88 }, { 47, 78, 90 }, { 47, 88, 90 }, { 48, 52, 56 },
+ { 48, 52, 76 }, { 48, 52, 91 }, { 48, 56, 77 }, { 48, 56, 91 },
+ { 48, 76, 87 }, { 48, 76, 91 }, { 48, 77, 87 }, { 48, 77, 91 },
+ { 48, 87, 91 }, { 49, 53, 57 }, { 49, 53, 76 }, { 49, 53, 92 },
+ { 49, 57, 78 }, { 49, 57, 92 }, { 49, 76, 88 }, { 49, 76, 92 },
+ { 49, 78, 88 }, { 49, 78, 92 }, { 49, 88, 92 }, { 50, 51, 58 },
+ { 50, 51, 75 }, { 50, 51, 93 }, { 50, 54, 79 }, { 50, 54, 89 },
+ { 50, 58, 79 }, { 50, 58, 93 }, { 50, 75, 89 }, { 50, 75, 93 },
+ { 50, 79, 89 }, { 50, 79, 93 }, { 50, 89, 93 }, { 51, 55, 80 },
+ { 51, 55, 90 }, { 51, 58, 80 }, { 51, 58, 93 }, { 51, 75, 90 },
+ { 51, 75, 93 }, { 51, 80, 90 }, { 51, 80, 93 }, { 51, 90, 93 },
+ { 52, 53, 61 }, { 52, 53, 76 }, { 52, 53, 94 }, { 52, 56, 81 },
+ { 52, 56, 91 }, { 52, 61, 81 }, { 52, 61, 94 }, { 52, 76, 91 },
+ { 52, 76, 94 }, { 52, 81, 91 }, { 52, 81, 94 }, { 52, 91, 94 },
+ { 53, 57, 82 }, { 53, 57, 92 }, { 53, 61, 82 }, { 53, 61, 94 },
+ { 53, 76, 92 }, { 53, 76, 94 }, { 53, 82, 92 }, { 53, 82, 94 },
+ { 53, 92, 94 }, { 54, 59, 62 }, { 54, 59, 77 }, { 54, 59, 95 },
+ { 54, 62, 79 }, { 54, 62, 95 }, { 54, 77, 89 }, { 54, 77, 95 },
+ { 54, 79, 89 }, { 54, 79, 95 }, { 54, 89, 95 }, { 55, 60, 63 },
+ { 55, 60, 78 }, { 55, 60, 96 }, { 55, 63, 80 }, { 55, 63, 96 },
+ { 55, 78, 90 }, { 55, 78, 96 }, { 55, 80, 90 }, { 55, 80, 96 },
+ { 55, 90, 96 }, { 56, 59, 64 }, { 56, 59, 77 }, { 56, 59, 97 },
+ { 56, 64, 81 }, { 56, 64, 97 }, { 56, 77, 91 }, { 56, 77, 97 },
+ { 56, 81, 91 }, { 56, 81, 97 }, { 56, 91, 97 }, { 57, 60, 65 },
+ { 57, 60, 78 }, { 57, 60, 98 }, { 57, 65, 82 }, { 57, 65, 98 },
+ { 57, 78, 92 }, { 57, 78, 98 }, { 57, 82, 92 }, { 57, 82, 98 },
+ { 57, 92, 98 }, { 58, 66, 67 }, { 58, 66, 79 }, { 58, 66, 99 },
+ { 58, 67, 80 }, { 58, 67, 99 }, { 58, 79, 93 }, { 58, 79, 99 },
+ { 58, 80, 93 }, { 58, 80, 99 }, { 58, 93, 99 }, { 59, 62, 83 },
+ { 59, 62, 95 }, { 59, 64, 83 }, { 59, 64, 97 }, { 59, 77, 95 },
+ { 59, 77, 97 }, { 59, 83, 95 }, { 59, 83, 97 }, { 59, 95, 97 },
+ { 60, 63, 84 }, { 60, 63, 96 }, { 60, 65, 84 }, { 60, 65, 98 },
+ { 60, 78, 96 }, { 60, 78, 98 }, { 60, 84, 96 }, { 60, 84, 98 },
+ { 60, 96, 98 }, { 61, 68, 69 }, { 61, 68, 81 }, { 61, 68, 100 },
+ { 61, 69, 82 }, { 61, 69, 100 }, { 61, 81, 94 }, { 61, 81, 100 },
+ { 61, 82, 94 }, { 61, 82, 100 }, { 61, 94, 100 }, { 62, 66, 70 },
+ { 62, 66, 79 }, { 62, 66, 101 }, { 62, 70, 83 }, { 62, 70, 101 },
+ { 62, 79, 95 }, { 62, 79, 101 }, { 62, 83, 95 }, { 62, 83, 101 },
+ { 62, 95, 101 }, { 63, 67, 71 }, { 63, 67, 80 }, { 63, 67, 102 },
+ { 63, 71, 84 }, { 63, 71, 102 }, { 63, 80, 96 }, { 63, 80, 102 },
+ { 63, 84, 96 }, { 63, 84, 102 }, { 63, 96, 102 }, { 64, 68, 72 },
+ { 64, 68, 81 }, { 64, 68, 103 }, { 64, 72, 83 }, { 64, 72, 103 },
+ { 64, 81, 97 }, { 64, 81, 103 }, { 64, 83, 97 }, { 64, 83, 103 },
+ { 64, 97, 103 }, { 65, 69, 73 }, { 65, 69, 82 }, { 65, 69, 104 },
+ { 65, 73, 84 }, { 65, 73, 104 }, { 65, 82, 98 }, { 65, 82, 104 },
+ { 65, 84, 98 }, { 65, 84, 104 }, { 65, 98, 104 }, { 66, 67, 85 },
+ { 66, 67, 99 }, { 66, 70, 85 }, { 66, 70, 101 }, { 66, 79, 99 },
+ { 66, 79, 101 }, { 66, 85, 99 }, { 66, 85, 101 }, { 66, 99, 101 },
+ { 67, 71, 85 }, { 67, 71, 102 }, { 67, 80, 99 }, { 67, 80, 102 },
+ { 67, 85, 99 }, { 67, 85, 102 }, { 67, 99, 102 }, { 68, 69, 86 },
+ { 68, 69, 100 }, { 68, 72, 86 }, { 68, 72, 103 }, { 68, 81, 100 },
+ { 68, 81, 103 }, { 68, 86, 100 }, { 68, 86, 103 }, { 68, 100, 103 },
+ { 69, 73, 86 }, { 69, 73, 104 }, { 69, 82, 100 }, { 69, 82, 104 },
+ { 69, 86, 100 }, { 69, 86, 104 }, { 69, 100, 104 }, { 70, 72, 74 },
+ { 70, 72, 83 }, { 70, 72, 105 }, { 70, 74, 85 }, { 70, 74, 105 },
+ { 70, 83, 101 }, { 70, 83, 105 }, { 70, 85, 101 }, { 70, 85, 105 },
+ { 70, 101, 105 }, { 71, 73, 74 }, { 71, 73, 84 }, { 71, 73, 106 },
+ { 71, 74, 85 }, { 71, 74, 106 }, { 71, 84, 102 }, { 71, 84, 106 },
+ { 71, 85, 102 }, { 71, 85, 106 }, { 71, 102, 106 }, { 72, 74, 86 },
+ { 72, 74, 105 }, { 72, 83, 103 }, { 72, 83, 105 }, { 72, 86, 103 },
+ { 72, 86, 105 }, { 72, 103, 105 }, { 73, 74, 86 }, { 73, 74, 106 },
+ { 73, 84, 104 }, { 73, 84, 106 }, { 73, 86, 104 }, { 73, 86, 106 },
+ { 73, 104, 106 }, { 74, 85, 105 }, { 74, 85, 106 }, { 74, 86, 105 },
+ { 74, 86, 106 }, { 74, 105, 106 }, { 75, 87, 88 }, { 75, 87, 89 },
+ { 75, 87, 107 }, { 75, 88, 90 }, { 75, 88, 107 }, { 75, 89, 93 },
+ { 75, 89, 107 }, { 75, 90, 93 }, { 75, 90, 107 }, { 75, 93, 107 },
+ { 76, 87, 88 }, { 76, 87, 91 }, { 76, 87, 108 }, { 76, 88, 92 },
+ { 76, 88, 108 }, { 76, 91, 94 }, { 76, 91, 108 }, { 76, 92, 94 },
+ { 76, 92, 108 }, { 76, 94, 108 }, { 77, 87, 89 }, { 77, 87, 91 },
+ { 77, 87, 109 }, { 77, 89, 95 }, { 77, 89, 109 }, { 77, 91, 97 },
+ { 77, 91, 109 }, { 77, 95, 97 }, { 77, 95, 109 }, { 77, 97, 109 },
+ { 78, 88, 90 }, { 78, 88, 92 }, { 78, 88, 110 }, { 78, 90, 96 },
+ { 78, 90, 110 }, { 78, 92, 98 }, { 78, 92, 110 }, { 78, 96, 98 },
+ { 78, 96, 110 }, { 78, 98, 110 }, { 79, 89, 93 }, { 79, 89, 95 },
+ { 79, 89, 111 }, { 79, 93, 99 }, { 79, 93, 111 }, { 79, 95, 101 },
+ { 79, 95, 111 }, { 79, 99, 101 }, { 79, 99, 111 }, { 79, 101, 111 },
+ { 80, 90, 93 }, { 80, 90, 96 }, { 80, 90, 112 }, { 80, 93, 99 },
+ { 80, 93, 112 }, { 80, 96, 102 }, { 80, 96, 112 }, { 80, 99, 102 },
+ { 80, 99, 112 }, { 80, 102, 112 }, { 81, 91, 94 }, { 81, 91, 97 },
+ { 81, 91, 113 }, { 81, 94, 100 }, { 81, 94, 113 }, { 81, 97, 103 },
+ { 81, 97, 113 }, { 81, 100, 103 }, { 81, 100, 113 }, { 81, 103, 113 },
+ { 82, 92, 94 }, { 82, 92, 98 }, { 82, 92, 114 }, { 82, 94, 100 },
+ { 82, 94, 114 }, { 82, 98, 104 }, { 82, 98, 114 }, { 82, 100, 104 },
+ { 82, 100, 114 }, { 82, 104, 114 }, { 83, 95, 97 }, { 83, 95, 101 },
+ { 83, 95, 115 }, { 83, 97, 103 }, { 83, 97, 115 }, { 83, 101, 105 },
+ { 83, 101, 115 }, { 83, 103, 105 }, { 83, 103, 115 }, { 83, 105, 115 },
+ { 84, 96, 98 }, { 84, 96, 102 }, { 84, 96, 116 }, { 84, 98, 104 },
+ { 84, 98, 116 }, { 84, 102, 106 }, { 84, 102, 116 }, { 84, 104, 106 },
+ { 84, 104, 116 }, { 84, 106, 116 }, { 85, 99, 101 }, { 85, 99, 102 },
+ { 85, 99, 117 }, { 85, 101, 105 }, { 85, 101, 117 }, { 85, 102, 106 },
+ { 85, 102, 117 }, { 85, 105, 106 }, { 85, 105, 117 }, { 85, 106, 117 },
+ { 86, 100, 103 }, { 86, 100, 104 }, { 86, 100, 118 }, { 86, 103, 105 },
+ { 86, 103, 118 }, { 86, 104, 106 }, { 86, 104, 118 }, { 86, 105, 106 },
+ { 86, 105, 118 }, { 86, 106, 118 }, { 87, 88, 107 }, { 87, 88, 108 },
+ { 87, 89, 107 }, { 87, 89, 109 }, { 87, 91, 108 }, { 87, 91, 109 },
+ { 87, 107, 108 }, { 87, 107, 109 }, { 87, 108, 109 }, { 88, 90, 107 },
+ { 88, 90, 110 }, { 88, 92, 108 }, { 88, 92, 110 }, { 88, 107, 108 },
+ { 88, 107, 110 }, { 88, 108, 110 }, { 89, 93, 107 }, { 89, 93, 111 },
+ { 89, 95, 109 }, { 89, 95, 111 }, { 89, 107, 109 }, { 89, 107, 111 },
+ { 89, 109, 111 }, { 90, 93, 107 }, { 90, 93, 112 }, { 90, 96, 110 },
+ { 90, 96, 112 }, { 90, 107, 110 }, { 90, 107, 112 }, { 90, 110, 112 },
+ { 91, 94, 108 }, { 91, 94, 113 }, { 91, 97, 109 }, { 91, 97, 113 },
+ { 91, 108, 109 }, { 91, 108, 113 }, { 91, 109, 113 }, { 92, 94, 108 },
+ { 92, 94, 114 }, { 92, 98, 110 }, { 92, 98, 114 }, { 92, 108, 110 },
+ { 92, 108, 114 }, { 92, 110, 114 }, { 93, 99, 111 }, { 93, 99, 112 },
+ { 93, 107, 111 }, { 93, 107, 112 }, { 93, 111, 112 }, { 94, 100, 113 },
+ { 94, 100, 114 }, { 94, 108, 113 }, { 94, 108, 114 }, { 94, 113, 114 },
+ { 95, 97, 109 }, { 95, 97, 115 }, { 95, 101, 111 }, { 95, 101, 115 },
+ { 95, 109, 111 }, { 95, 109, 115 }, { 95, 111, 115 }, { 96, 98, 110 },
+ { 96, 98, 116 }, { 96, 102, 112 }, { 96, 102, 116 }, { 96, 110, 112 },
+ { 96, 110, 116 }, { 96, 112, 116 }, { 97, 103, 113 }, { 97, 103, 115 },
+ { 97, 109, 113 }, { 97, 109, 115 }, { 97, 113, 115 }, { 98, 104, 114 },
+ { 98, 104, 116 }, { 98, 110, 114 }, { 98, 110, 116 }, { 98, 114, 116 },
+ { 99, 101, 111 }, { 99, 101, 117 }, { 99, 102, 112 }, { 99, 102, 117 },
+ { 99, 111, 112 }, { 99, 111, 117 }, { 99, 112, 117 }, { 100, 103, 113 },
+ { 100, 103, 118 }, { 100, 104, 114 }, { 100, 104, 118 }, { 100, 113, 114 },
+ { 100, 113, 118 }, { 100, 114, 118 }, { 101, 105, 115 }, { 101, 105, 117 },
+ { 101, 111, 115 }, { 101, 111, 117 }, { 101, 115, 117 }, { 102, 106, 116 },
+ { 102, 106, 117 }, { 102, 112, 116 }, { 102, 112, 117 }, { 102, 116, 117 },
+ { 103, 105, 115 }, { 103, 105, 118 }, { 103, 113, 115 }, { 103, 113, 118 },
+ { 103, 115, 118 }, { 104, 106, 116 }, { 104, 106, 118 }, { 104, 114, 116 },
+ { 104, 114, 118 }, { 104, 116, 118 }, { 105, 106, 117 }, { 105, 106, 118 },
+ { 105, 115, 117 }, { 105, 115, 118 }, { 105, 117, 118 }, { 106, 116, 117 },
+ { 106, 116, 118 }, { 106, 117, 118 }, { 107, 108, 109 }, { 107, 108, 110 },
+ { 107, 108, 119 }, { 107, 109, 111 }, { 107, 109, 119 }, { 107, 110, 112 },
+ { 107, 110, 119 }, { 107, 111, 112 }, { 107, 111, 119 }, { 107, 112, 119 },
+ { 108, 109, 113 }, { 108, 109, 119 }, { 108, 110, 114 }, { 108, 110, 119 },
+ { 108, 113, 114 }, { 108, 113, 119 }, { 108, 114, 119 }, { 109, 111, 115 },
+ { 109, 111, 119 }, { 109, 113, 115 }, { 109, 113, 119 }, { 109, 115, 119 },
+ { 110, 112, 116 }, { 110, 112, 119 }, { 110, 114, 116 }, { 110, 114, 119 },
+ { 110, 116, 119 }, { 111, 112, 117 }, { 111, 112, 119 }, { 111, 115, 117 },
+ { 111, 115, 119 }, { 111, 117, 119 }, { 112, 116, 117 }, { 112, 116, 119 },
+ { 112, 117, 119 }, { 113, 114, 118 }, { 113, 114, 119 }, { 113, 115, 118 },
+ { 113, 115, 119 }, { 113, 118, 119 }, { 114, 116, 118 }, { 114, 116, 119 },
+ { 114, 118, 119 }, { 115, 117, 118 }, { 115, 117, 119 }, { 115, 118, 119 },
+ { 116, 117, 118 }, { 116, 117, 119 }, { 116, 118, 119 }, { 117, 118, 119 }
+};
+
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][2];
+ v = m[i][3];
+ m[i][2] = c*u+s*v;
+ m[i][3] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][3];
+ m[i][1] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][3];
+ m[i][0] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+ float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatewx(m,al);
+ rotatewy(m,be);
+ rotatewz(m,de);
+ rotatexz(m,et);
+ rotatexy(m,ze);
+ rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+ int i, j, k;
+
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<4; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+ double al, be, de, ze, et, th;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+
+ r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+ r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+ r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+ r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+ r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+ et = atan2(-r12,r22)*180.0/M_PI;
+ th = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ ze = atan2(-r01,r00)*180.0/M_PI;
+
+ rotateall(al,be,de,ze,et,-th,m);
+}
+
+
+/* Compute the normal vector of a plane based on three points in the plane. */
+static void normal(const float *p, const float *q, const float *r,
+ float *n)
+{
+ float u[3], v[3], t;
+
+ u[0] = q[0]-p[0];
+ u[1] = q[1]-p[1];
+ u[2] = q[2]-p[2];
+ v[0] = r[0]-p[0];
+ v[1] = r[1]-p[1];
+ v[2] = r[2]-p[2];
+ n[0] = u[1]*v[2]-u[2]*v[1];
+ n[1] = u[2]*v[0]-u[0]*v[2];
+ n[2] = u[0]*v[1]-u[1]*v[0];
+ t = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ n[0] /= t;
+ n[1] /= t;
+ n[2] /= t;
+}
+
+
+/* Project an array of vertices from 4d to 3d. */
+static void project(ModeInfo *mi, const float vert[][4], float v[][4], int num)
+{
+ float s, q1[4], q2[4], r1[4][4], r2[4][4], m[4][4];
+ int i, j, k;
+ polytopesstruct *pp = &poly[MI_SCREEN(mi)];
+
+ rotateall(pp->alpha,pp->beta,pp->delta,pp->zeta,pp->eta,pp->theta,r1);
+
+ gltrackball_get_quaternion(pp->trackballs[0],q1);
+ gltrackball_get_quaternion(pp->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,m);
+
+ /* Project the vertices from 4d to 3d. */
+ for (i=0; i<num; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ s = 0.0;
+ for (k=0; k<4; k++)
+ s += m[j][k]*vert[i][k];
+ v[i][j] = s+offset4d[j];
+ }
+ if (projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (j=0; j<3; j++)
+ v[i][j] /= 2.0;
+ v[i][3] = 1.0;
+ }
+ else
+ {
+ for (j=0; j<4; j++)
+ v[i][j] /= v[i][3];
+ }
+ }
+
+ /* Move the projected vertices along the z-axis so that they become visible
+ in the viewport. */
+ for (i=0; i<num; i++)
+ {
+ for (j=0; j<4; j++)
+ v[i][j] += offset3d[j];
+ }
+}
+
+
+/* Draw a single polytope. */
+static void draw(ModeInfo *mi,
+ float v[][4],
+ const int edge[][2], int num_edge,
+ const int face[], int num_face,
+ int vert_per_face,
+ float edge_color[][4],
+ float face_color[][4],
+ float face_color_trans[][4])
+{
+ int i, j;
+ float n[3];
+ GLfloat red[4] = { 1.0, 0.0, 0.0, 1.0 };
+ GLfloat red_trans[4] = { 1.0, 0.0, 0.0, 1.0 };
+
+ mi->polygon_count = 0;
+ if (display_mode == DISP_WIREFRAME)
+ {
+ if (color_mode == COLORS_SINGLE)
+ glColor4fv(red);
+ glBegin(GL_LINES);
+ for (i=0; i<num_edge; i++)
+ {
+ if (color_mode == COLORS_DEPTH)
+ glColor4fv(edge_color[i]);
+ glVertex4fv(v[edge[i][0]]);
+ glVertex4fv(v[edge[i][1]]);
+ }
+ glEnd();
+ mi->polygon_count = num_edge;
+ }
+ else
+ {
+ if (color_mode == COLORS_SINGLE)
+ {
+ red_trans[3] = face_color_trans[0][3]/2.0;
+ if (display_mode == DISP_TRANSPARENT)
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,red_trans);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,red);
+ }
+ for (i=0; i<num_face; i++)
+ {
+ glBegin(GL_POLYGON);
+ if (color_mode == COLORS_DEPTH)
+ {
+ if (display_mode == DISP_TRANSPARENT)
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+ face_color_trans[i]);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+ face_color[i]);
+ }
+ normal(v[face[i*vert_per_face]],v[face[i*vert_per_face+1]],
+ v[face[i*vert_per_face+2]],n);
+ glNormal3fv(n);
+ for (j=0; j<vert_per_face; j++)
+ glVertex4fv(v[face[i*vert_per_face+j]]);
+ glEnd();
+ }
+ mi->polygon_count = num_face;
+ }
+}
+
+
+/* Draw a 5-cell {3,3,3} projected into 3d. */
+static void cell_5(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+ float v[NUM_VERT_5][4];
+
+ project(mi,vert_5,v,NUM_VERT_5);
+ draw(mi,v,edge_5,NUM_EDGE_5,(int *)face_5,NUM_FACE_5,
+ VERT_PER_FACE_5,hp->edge_color_5,hp->face_color_5,
+ hp->face_color_trans_5);
+}
+
+
+/* Draw a 8-cell {4,3,3} projected into 3d. */
+static void cell_8(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+ float v[NUM_VERT_8][4];
+
+ project(mi,vert_8,v,NUM_VERT_8);
+ draw(mi,v,edge_8,NUM_EDGE_8,(int *)face_8,NUM_FACE_8,
+ VERT_PER_FACE_8,hp->edge_color_8,hp->face_color_8,
+ hp->face_color_trans_8);
+}
+
+
+/* Draw a 16-cell {3,3,4} projected into 3d. */
+static void cell_16(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+ float v[NUM_VERT_16][4];
+
+ project(mi,vert_16,v,NUM_VERT_16);
+ draw(mi,v,edge_16,NUM_EDGE_16,(int *)face_16,NUM_FACE_16,
+ VERT_PER_FACE_16,hp->edge_color_16,hp->face_color_16,
+ hp->face_color_trans_16);
+}
+
+
+/* Draw a 24-cell {3,4,3} projected into 3d. */
+static void cell_24(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+ float v[NUM_VERT_24][4];
+
+ project(mi,vert_24,v,NUM_VERT_24);
+ draw(mi,v,edge_24,NUM_EDGE_24,(int *)face_24,NUM_FACE_24,
+ VERT_PER_FACE_24,hp->edge_color_24,hp->face_color_24,
+ hp->face_color_trans_24);
+}
+
+
+/* Draw a 120-cell {5,3,3} projected into 3d. */
+static void cell_120(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+ float v[NUM_VERT_120][4];
+
+ project(mi,vert_120,v,NUM_VERT_120);
+ draw(mi,v,edge_120,NUM_EDGE_120,(int *)face_120,NUM_FACE_120,
+ VERT_PER_FACE_120,hp->edge_color_120,hp->face_color_120,
+ hp->face_color_trans_120);
+}
+
+
+/* Draw a 600-cell {3,3,5} projected into 3d. */
+static void cell_600(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+ float v[NUM_VERT_600][4];
+
+ project(mi,vert_600,v,NUM_VERT_600);
+ draw(mi,v,edge_600,NUM_EDGE_600,(int *)face_600,NUM_FACE_600,
+ VERT_PER_FACE_600,hp->edge_color_600,hp->face_color_600,
+ hp->face_color_trans_600);
+}
+
+
+/* Compute a color based on the w-depth of a point. */
+static void color(float depth, float alpha, float min, float max,
+ float color[4])
+{
+ double d, t;
+ int s;
+
+ d = (depth-min)/(max-min);
+ s = floor(d*4.0);
+ t = d*4.0-s;
+ if (s < 0)
+ s += 6;
+ if (s >= 6)
+ s -= 6;
+ switch (s)
+ {
+ case 0:
+ color[0] = 1.0;
+ color[1] = t;
+ color[2] = 0.0;
+ break;
+ case 1:
+ color[0] = 1.0-t;
+ color[1] = 1.0;
+ color[2] = 0.0;
+ break;
+ case 2:
+ color[0] = 0.0;
+ color[1] = 1.0;
+ color[2] = t;
+ break;
+ case 3:
+ color[0] = 0.0;
+ color[1] = 1.0-t;
+ color[2] = 1.0;
+ break;
+ case 4:
+ color[0] = t;
+ color[1] = 0.0;
+ color[2] = 1.0;
+ break;
+ case 5:
+ color[0] = 1.0;
+ color[1] = 0.0;
+ color[2] = 1.0-t;
+ break;
+ }
+ color[3] = alpha;
+}
+
+
+/* Set the colors of a single polytope's edges and faces. */
+static void colors(const float vert[][4],
+ const int edge[][2], int num_edge,
+ const int face[], int num_face,
+ int vert_per_face,
+ float edge_color[][4],
+ float face_color[][4],
+ float face_color_trans[][4],
+ float alpha,
+ float min_edge_depth, float max_edge_depth,
+ float min_face_depth, float max_face_depth)
+{
+ int i, j;
+ float depth;
+
+ for (i=0; i<num_edge; i++)
+ {
+ depth = (vert[edge[i][0]][3]+vert[edge[i][1]][3])/2.0;
+ color(depth,1.0,min_edge_depth,max_edge_depth,edge_color[i]);
+ }
+ for (i=0; i<num_face; i++)
+ {
+ depth = 0.0;
+ for (j=0; j<vert_per_face; j++)
+ depth += vert[face[i*vert_per_face+j]][3];
+ depth /= vert_per_face;
+ color(depth,1.0,min_face_depth,max_face_depth,face_color[i]);
+ color(depth,alpha,min_face_depth,max_face_depth,face_color_trans[i]);
+ }
+}
+
+
+/* Set the colors of the polytopes' edges and faces. */
+static void set_colors(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+ /* 5-cell. */
+ colors(vert_5,edge_5,NUM_EDGE_5,(int *)face_5,NUM_FACE_5,
+ VERT_PER_FACE_5,hp->edge_color_5,hp->face_color_5,
+ hp->face_color_trans_5,0.5,MIN_EDGE_DEPTH_5,
+ MAX_EDGE_DEPTH_5,MIN_FACE_DEPTH_5,MAX_FACE_DEPTH_5);
+
+ /* 8-cell. */
+ colors(vert_8,edge_8,NUM_EDGE_8,(int *)face_8,NUM_FACE_8,
+ VERT_PER_FACE_8,hp->edge_color_8,hp->face_color_8,
+ hp->face_color_trans_8,0.4,MIN_EDGE_DEPTH_8,
+ MAX_EDGE_DEPTH_8,MIN_FACE_DEPTH_8,MAX_FACE_DEPTH_8);
+
+ /* 16-cell. */
+ colors(vert_16,edge_16,NUM_EDGE_16,(int *)face_16,NUM_FACE_16,
+ VERT_PER_FACE_16,hp->edge_color_16,hp->face_color_16,
+ hp->face_color_trans_16,0.25,MIN_EDGE_DEPTH_16,
+ MAX_EDGE_DEPTH_16,MIN_FACE_DEPTH_16,MAX_FACE_DEPTH_16);
+
+ /* 24-cell. */
+ colors(vert_24,edge_24,NUM_EDGE_24,(int *)face_24,NUM_FACE_24,
+ VERT_PER_FACE_24,hp->edge_color_24,hp->face_color_24,
+ hp->face_color_trans_24,0.25,MIN_EDGE_DEPTH_24,
+ MAX_EDGE_DEPTH_24,MIN_FACE_DEPTH_24,MAX_FACE_DEPTH_24);
+
+ /* 120-cell. */
+ colors(vert_120,edge_120,NUM_EDGE_120,(int *)face_120,NUM_FACE_120,
+ VERT_PER_FACE_120,hp->edge_color_120,hp->face_color_120,
+ hp->face_color_trans_120,0.15,MIN_EDGE_DEPTH_120,
+ MAX_EDGE_DEPTH_120,MIN_FACE_DEPTH_120,MAX_FACE_DEPTH_120);
+
+ /* 600-cell. */
+ colors(vert_600,edge_600,NUM_EDGE_600,(int *)face_600,NUM_FACE_600,
+ VERT_PER_FACE_600,hp->edge_color_600,hp->face_color_600,
+ hp->face_color_trans_600,0.06,MIN_EDGE_DEPTH_600,
+ MAX_EDGE_DEPTH_600,MIN_FACE_DEPTH_600,MAX_FACE_DEPTH_600);
+}
+
+
+static void init(ModeInfo *mi)
+{
+ polytopesstruct *pp = &poly[MI_SCREEN(mi)];
+
+ set_colors(mi);
+
+ pp->alpha = 0.0;
+ pp->beta = 0.0;
+ pp->delta = 0.0;
+ pp->zeta = 0.0;
+ pp->eta = 0.0;
+ pp->theta = 0.0;
+
+ pp->tick = 0;
+ pp->poly = 0;
+}
+
+
+/* Redisplay the polytopes. */
+static void display_polytopes(ModeInfo *mi)
+{
+ polytopesstruct *pp = &poly[MI_SCREEN(mi)];
+
+ if (!pp->button_pressed)
+ {
+ pp->alpha += speed_wx * pp->speed_scale;
+ if (pp->alpha >= 360.0)
+ pp->alpha -= 360.0;
+ pp->beta += speed_wy * pp->speed_scale;
+ if (pp->beta >= 360.0)
+ pp->beta -= 360.0;
+ pp->delta += speed_wz * pp->speed_scale;
+ if (pp->delta >= 360.0)
+ pp->delta -= 360.0;
+ pp->zeta += speed_xy * pp->speed_scale;
+ if (pp->zeta >= 360.0)
+ pp->zeta -= 360.0;
+ pp->eta += speed_xz * pp->speed_scale;
+ if (pp->eta >= 360.0)
+ pp->eta -= 360.0;
+ pp->theta += speed_yz * pp->speed_scale;
+ if (pp->theta >= 360.0)
+ pp->theta -= 360.0;
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (projection_3d == DISP_3D_ORTHOGRAPHIC)
+ {
+ if (pp->aspect >= 1.0)
+ glOrtho(-pp->aspect,pp->aspect,-1.0,1.0,0.1,100.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/pp->aspect,1.0/pp->aspect,0.1,100.0);
+ }
+ else
+ {
+ gluPerspective(60.0,pp->aspect,0.1,100.0);
+ }
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (pp->tick == 0)
+ {
+ if (polytope == POLYTOPE_RANDOM)
+ pp->poly = random() % (POLYTOPE_LAST_CELL+1);
+ else
+ pp->poly = polytope;
+ }
+ if (++pp->tick > 1000)
+ pp->tick = 0;
+
+ if (pp->poly == POLYTOPE_5_CELL)
+ cell_5(mi);
+ else if (pp->poly == POLYTOPE_8_CELL)
+ cell_8(mi);
+ else if (pp->poly == POLYTOPE_16_CELL)
+ cell_16(mi);
+ else if (pp->poly == POLYTOPE_24_CELL)
+ cell_24(mi);
+ else if (pp->poly == POLYTOPE_120_CELL)
+ cell_120(mi);
+ else if (pp->poly == POLYTOPE_600_CELL)
+ cell_600(mi);
+ else
+ abort();
+}
+
+
+ENTRYPOINT void reshape_polytopes(ModeInfo *mi, int width, int height)
+{
+ polytopesstruct *pp = &poly[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+
+ pp->WindW = (GLint)width;
+ pp->WindH = (GLint)height;
+ glViewport(0,y,width,height);
+ pp->aspect = (GLfloat)width/(GLfloat)height;
+}
+
+
+ENTRYPOINT Bool polytopes_handle_event(ModeInfo *mi, XEvent *event)
+{
+ polytopesstruct *pp = &poly[MI_SCREEN(mi)];
+ KeySym sym = 0;
+ char c = 0;
+
+ if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
+ XLookupString (&event->xkey, &c, 1, &sym, 0);
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ pp->button_pressed = True;
+ gltrackball_start(pp->trackballs[pp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ pp->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ pp->current_trackball = 1;
+ if (pp->button_pressed)
+ gltrackball_start(pp->trackballs[pp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == KeyRelease)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ pp->current_trackball = 0;
+ if (pp->button_pressed)
+ gltrackball_start(pp->trackballs[pp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == MotionNotify && pp->button_pressed)
+ {
+ gltrackball_track(pp->trackballs[pp->current_trackball],
+ event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize polytopes. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_polytopes(ModeInfo *mi)
+{
+ polytopesstruct *pp;
+
+ MI_INIT(mi, poly);
+ pp = &poly[MI_SCREEN(mi)];
+
+ pp->trackballs[0] = gltrackball_init(True);
+ pp->trackballs[1] = gltrackball_init(True);
+ pp->current_trackball = 0;
+ pp->button_pressed = False;
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"wireframe") || !strcasecmp(mode,"0"))
+ {
+ display_mode = DISP_WIREFRAME;
+ }
+ else if (!strcasecmp(mode,"surface") || !strcasecmp(mode,"1"))
+ {
+ display_mode = DISP_SURFACE;
+ }
+ else if (!strcasecmp(mode,"transparent") || !strcasecmp(mode,"2"))
+ {
+ display_mode = DISP_TRANSPARENT;
+ }
+ else
+ {
+ display_mode = DISP_TRANSPARENT;
+ }
+
+ /* Set the Klein bottle. */
+ if (!strcasecmp(poly_str,"random") || !strcasecmp(poly_str,"-1"))
+ {
+ polytope = POLYTOPE_RANDOM;
+ }
+ else if (!strcasecmp(poly_str,"5-cell") || !strcasecmp(poly_str,"0"))
+ {
+ polytope = POLYTOPE_5_CELL;
+ }
+ else if (!strcasecmp(poly_str,"8-cell") || !strcasecmp(poly_str,"1"))
+ {
+ polytope = POLYTOPE_8_CELL;
+ }
+ else if (!strcasecmp(poly_str,"16-cell") || !strcasecmp(poly_str,"2"))
+ {
+ polytope = POLYTOPE_16_CELL;
+ }
+ else if (!strcasecmp(poly_str,"24-cell") || !strcasecmp(poly_str,"3"))
+ {
+ polytope = POLYTOPE_24_CELL;
+ }
+ else if (!strcasecmp(poly_str,"120-cell") || !strcasecmp(poly_str,"4"))
+ {
+ polytope = POLYTOPE_120_CELL;
+ }
+ else if (!strcasecmp(poly_str,"600-cell") || !strcasecmp(poly_str,"5"))
+ {
+ polytope = POLYTOPE_600_CELL;
+ }
+ else
+ {
+ polytope = POLYTOPE_RANDOM;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_str,"single") || !strcasecmp(color_str,"0"))
+ {
+ color_mode = COLORS_SINGLE;
+ }
+ else if (!strcasecmp(color_str,"depth") || !strcasecmp(color_str,"1"))
+ {
+ color_mode = COLORS_DEPTH;
+ }
+ else
+ {
+ color_mode = COLORS_DEPTH;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj_3d,"perspective") || !strcasecmp(proj_3d,"0"))
+ {
+ projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"orthographic") || !strcasecmp(proj_3d,"1"))
+ {
+ projection_3d = DISP_3D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ projection_3d = DISP_3D_PERSPECTIVE;
+ }
+
+ /* Set the 4d projection mode. */
+ if (!strcasecmp(proj_4d,"perspective") || !strcasecmp(proj_4d,"0"))
+ {
+ projection_4d = DISP_4D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_4d,"orthographic") || !strcasecmp(proj_4d,"1"))
+ {
+ projection_4d = DISP_4D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ projection_4d = DISP_4D_PERSPECTIVE;
+ }
+
+ /* make multiple screens rotate at slightly different rates. */
+ pp->speed_scale = 0.9 + frand(0.3);
+
+ if ((pp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_polytopes(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_polytopes(ModeInfo *mi)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_position[] = { 0.0, 0.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ polytopesstruct *hp;
+
+ if (poly == NULL)
+ return;
+ hp = &poly[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!hp->glx_context)
+ return;
+
+ glXMakeCurrent(display,window,*(hp->glx_context));
+
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (projection_3d == DISP_3D_PERSPECTIVE)
+ gluPerspective(60.0,1.0,0.1,100.0);
+ else
+ glOrtho(-1.0,1.0,-1.0,1.0,0.1,100.0);;
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (display_mode == DISP_WIREFRAME)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+ else if (display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ display_polytopes(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_polytopes(ModeInfo *mi)
+{
+ polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+
+ if (!hp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(hp->glx_context));
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Polytopes", polytopes)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/polytopes.man b/hacks/glx/polytopes.man
new file mode 100644
index 0000000..45fcb4a
--- /dev/null
+++ b/hacks/glx/polytopes.man
@@ -0,0 +1,207 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+polytopes - Draws one of the six regular 4d polytopes rotating in 4d.
+.SH SYNOPSIS
+.B polytopes
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-5-cell]
+[\-8-cell]
+[\-16-cell]
+[\-24-cell]
+[\-120-cell]
+[\-600-cell]
+[\-wireframe]
+[\-surface]
+[\-transparent]
+[\-single-color]
+[\-depth-colors]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+.SH DESCRIPTION
+The \fIpolytopes\fP program shows one of the six regular 4d polytopes
+(5-cell, 8-cell, 16-cell, 24-cell, 120-cell, or 600-cell) rotating in
+4d. The program projects the 4d polytope to 3d using either a
+perspective or an orthographic projection. The projected 3d polytope
+can then be projected to the screen either perspectively or
+orthographically. There are three display modes for the polytope:
+mesh (wireframe), solid, or transparent. Furthermore, the colors with
+which the polytope is drawn can be set to either single color or to a
+coloring according to the 4d "depth" (the w coordinate) of the
+polytope in its unrotated position. In the first case, the polytope
+is drawn in red. This coloring combined with transparency gives a
+nice visual effect of the structure of the polytope. The second mode
+draws the polytope with a fully saturated color wheel in which the
+edges or faces are colored accoring to their average 4d "depth". This
+mode is best combined with the wireframe mode, where it allows you to
+see how different parts of the polytope are moved to the "inside" of
+the projected polytope in 3d. Of course, in 4d the cells, faces, and
+edges of the polytope all have the same distance from the center of
+the polytope. Only the projection creates the appearance that some of
+the cells lie "inside" the figure in 3d.
+.SH OPTIONS
+.I polytopes
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 25000, or 1/40th second.
+.PP
+The following six options are mutually exclusive. They determine
+which polytope is displayed.
+.TP 8
+.B \-5-cell
+Display the 5-cell. The 5-cell is the 4d analogon of a regular
+tetrahedron in 3d. It has 5 regular tetrahedra as its cells, 10
+equilateral triangles as faces, 10 edges, and 5 vertices.
+.TP 8
+.B \-8-cell
+Display the 8-cell (a.k.a. hypercube or tessaract). The 8-cell is the
+4d analogon of a cube in 3d. It has 8 cubes as its cells, 24 squares
+as faces, 32 edges, and 16 vertices.
+.TP 8
+.B \-16-cell
+Display the 16-cell. The 16-cell is the 4d analogon of an octahedron
+in 3d. It has 16 regular tetrahedra as its cells, 32 equilateral
+triangles as faces, 24 edges, and 8 vertices.
+.TP 8
+.B \-24-cell
+Display the 24-cell. The 24-cell has no 3d analogon. It has 24
+regular octahedra as its cells, 96 equilateral triangles as faces, 96
+edges, and 24 vertices.
+.TP 8
+.B \-120-cell
+Display the 120-cell. The 120-cell has no 3d analogon. It has 120
+regular dodecahedra as its cells, 720 regular pentagons as faces, 1200
+edges, and 600 vertices.
+.TP 8
+.B \-600-cell
+Display the 600-cell. The 600-cell has no 3d analogon. It has 600
+regular tetrahedra as its cells, 1200 equilateral triangles as faces,
+720 edges, and 120 vertices.
+.PP
+The following three options are mutually exclusive. They determine
+how the polytope is displayed.
+.TP 8
+.B \-wireframe
+Display the polytope as a wireframe mesh.
+.TP 8
+.B \-surface
+Display the polytope as a solid object.
+.TP 8
+.B \-transparent
+Display the polytope as a transparent object (default).
+.PP
+The following two options are mutually exclusive. They determine how
+to color the polytope.
+.TP 8
+.B \-single-color
+Display the polytope in red.
+.TP 8
+.B \-depth-colors
+Display the polytope with a fully saturated color wheel in which the
+edges or faces are colored accoring to their average 4d "depth", i.e.,
+the w coordinate of the polytope in its unrotated position (default).
+.PP
+The following two options are mutually exclusive. They determine how
+the polytope is projected from 3d to 2d (i.e., to the screen).
+.TP 8
+.B \-perspective-3d
+Project the polytope from 3d to 2d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-3d
+Project the polytope from 3d to 2d using an orthographic projection.
+.PP
+The following two options are mutually exclusive. They determine how
+the polytope is projected from 4d to 3d.
+.TP 8
+.B \-perspective-4d
+Project the polytope from 4d to 3d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-4d
+Project the polytope from 4d to 3d using an orthographic projection.
+.PP
+The following six options determine the rotation speed of the polytope
+around the six possible hyperplanes. The rotation speed is measured
+in degrees per frame. The speeds should be set to relatively small
+values, e.g., less than 4 in magnitude.
+.TP 8
+.B \-speed-wx \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-wy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.SH INTERACTION
+If you run this program in standalone mode you can rotate the polytope
+by dragging the mouse while pressing the left mouse button. This
+rotates the polytope in 3D, i.e., around the wx, wy, and wz planes.
+If you press the shift key while dragging the mouse with the left
+button pressed the polytope is rotated in 4D, i.e., around the xy, xz,
+and yz planes. To examine the polytope at your leisure, it is best to
+set all speeds to 0. Otherwise, the polytope will rotate while the
+left mouse button is not pressed.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003-2005 by Carsten Steger. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 28-sep-2005.
diff --git a/hacks/glx/projectiveplane.c b/hacks/glx/projectiveplane.c
new file mode 100644
index 0000000..2a1e566
--- /dev/null
+++ b/hacks/glx/projectiveplane.c
@@ -0,0 +1,1550 @@
+/* projectiveplane --- Shows a 4d embedding of the real projective plane
+ that rotates in 4d or on which you can walk */
+
+#if 0
+static const char sccsid[] = "@(#)projectiveplane.c 1.1 14/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 2005-2014 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 14/01/03: Initial version
+ * C. Steger - 14/10/03: Moved the curlicue texture to curlicue.h
+ */
+
+/*
+ * This program shows a 4d embedding of the real projective plane.
+ * You can walk on the projective plane, see it turn in 4d, or walk on
+ * it while it turns in 4d. The fact that the surface is an embedding
+ * of the real projective plane in 4d can be seen in the depth colors
+ * mode: set all rotation speeds to 0 and the projection mode to 4d
+ * orthographic projection. In its default orientation, the embedding
+ * of the real projective plane will then project to the Roman
+ * surface, which has three lines of self-intersection. However, at
+ * the three lines of self-intersection the parts of the surface that
+ * intersect have different colors, i.e., different 4d depths.
+ *
+ * The real projective plane is a non-orientable surface. To make
+ * this apparent, the two-sided color mode can be used.
+ * Alternatively, orientation markers (curling arrows) can be drawn as
+ * a texture map on the surface of the projective plane. While
+ * walking on the projective plane, you will notice that the
+ * orientation of the curling arrows changes (which it must because
+ * the projective plane is non-orientable).
+ *
+ * The real projective plane is a model for the projective geometry in
+ * 2d space. One point can be singled out as the origin. A line can
+ * be singled out as the line at infinity, i.e., a line that lies at
+ * an infinite distance to the origin. The line at infinity is
+ * topologically a circle. Points on the line at infinity are also
+ * used to model directions in projective geometry. The origin can be
+ * visualized in different manners. When using distance colors, the
+ * origin is the point that is displayed as fully saturated red, which
+ * is easier to see as the center of the reddish area on the
+ * projective plane. Alternatively, when using distance bands, the
+ * origin is the center of the only band that projects to a disc.
+ * When using direction bands, the origin is the point where all
+ * direction bands collapse to a point. Finally, when orientation
+ * markers are being displayed, the origin the the point where all
+ * orientation markers are compressed to a point. The line at
+ * infinity can also be visualized in different ways. When using
+ * distance colors, the line at infinity is the line that is displayed
+ * as fully saturated magenta. When two-sided colors are used, the
+ * line at infinity lies at the points where the red and green "sides"
+ * of the projective plane meet (of course, the real projective plane
+ * only has one side, so this is a design choice of the
+ * visualization). Alternatively, when orientation markers are being
+ * displayed, the line at infinity is the place where the orientation
+ * markers change their orientation.
+ *
+ * Note that when the projective plane is displayed with bands, the
+ * orientation markers are placed in the middle of the bands. For
+ * distance bands, the bands are chosen in such a way that the band at
+ * the origin is only half as wide as the remaining bands, which
+ * results in a disc being displayed at the origin that has the same
+ * diameter as the remaining bands. This choice, however, also
+ * implies that the band at infinity is half as wide as the other
+ * bands. Since the projective plane is attached to itself (in a
+ * complicated fashion) at the line at infinity, effectively the band
+ * at infinity is again as wide as the remaining bands. However,
+ * since the orientation markers are displayed in the middle of the
+ * bands, this means that only one half of the orientation markers
+ * will be displayed twice at the line at infinity if distance bands
+ * are used. If direction bands are used or if the projective plane
+ * is displayed as a solid surface, the orientation markers are
+ * displayed fully at the respective sides of the line at infinity.
+ *
+ * The program projects the 4d projective plane to 3d using either a
+ * perspective or an orthographic projection. Which of the two
+ * alternatives looks more appealing is up to you. However, two
+ * famous surfaces are obtained if orthographic 4d projection is used:
+ * The Roman surface and the cross cap. If the projective plane is
+ * rotated in 4d, the result of the projection for certain rotations
+ * is a Roman surface and for certain rotations it is a cross cap.
+ * The easiest way to see this is to set all rotation speeds to 0 and
+ * the rotation speed around the yz plane to a value different from 0.
+ * However, for any 4d rotation speeds, the projections will generally
+ * cycle between the Roman surface and the cross cap. The difference
+ * is where the origin and the line at infinity will lie with respect
+ * to the self-intersections in the projections to 3d.
+ *
+ * The projected projective plane can then be projected to the screen
+ * either perspectively or orthographically. When using the walking
+ * modes, perspective projection to the screen will be used.
+ *
+ * There are three display modes for the projective plane: mesh
+ * (wireframe), solid, or transparent. Furthermore, the appearance of
+ * the projective plane can be as a solid object or as a set of
+ * see-through bands. The bands can be distance bands, i.e., bands
+ * that lie at increasing distances from the origin, or direction
+ * bands, i.e., bands that lie at increasing angles with respect to
+ * the origin.
+ *
+ * When the projective plane is displayed with direction bands, you
+ * will be able to see that each direction band (modulo the "pinching"
+ * at the origin) is a Moebius strip, which also shows that the
+ * projective plane is non-orientable.
+ *
+ * Finally, the colors with with the projective plane is drawn can be
+ * set to two-sided, distance, direction, or depth. In two-sided
+ * mode, the projective plane is drawn with red on one "side" and
+ * green on the "other side". As described above, the projective
+ * plane only has one side, so the color jumps from red to green along
+ * the line at infinity. This mode enables you to see that the
+ * projective plane is non-orientable. In distance mode, the
+ * projective plane is displayed with fully saturated colors that
+ * depend on the distance of the points on the projective plane to the
+ * origin. The origin is displayed in red, the line at infinity is
+ * displayed in magenta. If the projective plane is displayed as
+ * distance bands, each band will be displayed with a different color.
+ * In direction mode, the projective plane is displayed with fully
+ * saturated colors that depend on the angle of the points on the
+ * projective plane with respect to the origin. Angles in opposite
+ * directions to the origin (e.g., 15 and 205 degrees) are displayed
+ * in the same color since they are projectively equivalent. If the
+ * projective plane is displayed as direction bands, each band will be
+ * displayed with a different color. Finally, in depth mode the
+ * projective plane with colors chosen depending on the 4d "depth"
+ * (i.e., the w coordinate) of the points on the projective plane at
+ * its default orientation in 4d. As discussed above, this mode
+ * enables you to see that the projective plane does not intersect
+ * itself in 4d.
+ *
+ * The rotation speed for each of the six planes around which the
+ * projective plane rotates can be chosen. For the walk-and-turn
+ * more, only the rotation speeds around the true 4d planes are used
+ * (the xy, xz, and yz planes).
+ *
+ * Furthermore, in the walking modes the walking direction in the 2d
+ * base square of the projective plane and the walking speed can be
+ * chosen. The walking direction is measured as an angle in degrees
+ * in the 2d square that forms the coordinate system of the surface of
+ * the projective plane. A value of 0 or 180 means that the walk is
+ * along a circle at a randomly chosen distance from the origin
+ * (parallel to a distance band). A value of 90 or 270 means that the
+ * walk is directly from the origin to the line at infinity and back
+ * (analogous to a direction band). Any other value results in a
+ * curved path from the origin to the line at infinity and back.
+ *
+ * This program is somewhat inspired by Thomas Banchoff's book "Beyond
+ * the Third Dimension: Geometry, Computer Graphics, and Higher
+ * Dimensions", Scientific American Library, 1990.
+ */
+
+#include "curlicue.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define DISP_WIREFRAME 0
+#define DISP_SURFACE 1
+#define DISP_TRANSPARENT 2
+#define NUM_DISPLAY_MODES 3
+
+#define APPEARANCE_SOLID 0
+#define APPEARANCE_DISTANCE_BANDS 1
+#define APPEARANCE_DIRECTION_BANDS 2
+#define NUM_APPEARANCES 3
+
+#define COLORS_TWOSIDED 0
+#define COLORS_DISTANCE 1
+#define COLORS_DIRECTION 2
+#define COLORS_DEPTH 3
+#define NUM_COLORS 4
+
+#define VIEW_WALK 0
+#define VIEW_TURN 1
+#define VIEW_WALKTURN 2
+#define NUM_VIEW_MODES 3
+
+#define DISP_3D_PERSPECTIVE 0
+#define DISP_3D_ORTHOGRAPHIC 1
+#define NUM_DISP_3D_MODES 2
+
+#define DISP_4D_PERSPECTIVE 0
+#define DISP_4D_ORTHOGRAPHIC 1
+#define NUM_DISP_4D_MODES 2
+
+#define DEF_DISPLAY_MODE "random"
+#define DEF_APPEARANCE "random"
+#define DEF_COLORS "random"
+#define DEF_VIEW_MODE "random"
+#define DEF_MARKS "False"
+#define DEF_PROJECTION_3D "random"
+#define DEF_PROJECTION_4D "random"
+#define DEF_SPEEDWX "1.1"
+#define DEF_SPEEDWY "1.3"
+#define DEF_SPEEDWZ "1.5"
+#define DEF_SPEEDXY "1.7"
+#define DEF_SPEEDXZ "1.9"
+#define DEF_SPEEDYZ "2.1"
+#define DEF_WALK_DIRECTION "83.0"
+#define DEF_WALK_SPEED "20.0"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+
+# define free_projectiveplane 0
+# define release_projectiveplane 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#ifndef HAVE_JWXYZ
+# include <X11/keysym.h>
+#endif
+
+#include "gltrackball.h"
+
+#include <float.h>
+
+
+#ifdef USE_MODULES
+ModStruct projectiveplane_description =
+{"projectiveplane", "init_projectiveplane", "draw_projectiveplane",
+ NULL, "draw_projectiveplane", "change_projectiveplane",
+ NULL, &projectiveplane_opts, 25000, 1, 1, 1, 1.0, 4, "",
+ "Rotate a 4d embedding of the real projective plane in 4d or walk on it",
+ 0, NULL};
+
+#endif
+
+
+static char *mode;
+static char *appear;
+static char *color_mode;
+static char *view_mode;
+static Bool marks;
+static char *proj_3d;
+static char *proj_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+static float walk_direction;
+static float walk_speed;
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-appearance", ".appearance", XrmoptionSepArg, 0 },
+ {"-solid", ".appearance", XrmoptionNoArg, "solid" },
+ {"-distance-bands", ".appearance", XrmoptionNoArg, "distance-bands" },
+ {"-direction-bands", ".appearance", XrmoptionNoArg, "direction-bands" },
+ {"-colors", ".colors", XrmoptionSepArg, 0 },
+ {"-twosided-colors", ".colors", XrmoptionNoArg, "two-sided" },
+ {"-distance-colors", ".colors", XrmoptionNoArg, "distance" },
+ {"-direction-colors", ".colors", XrmoptionNoArg, "direction" },
+ {"-depth-colors", ".colors", XrmoptionNoArg, "depth" },
+ {"-view-mode", ".viewMode", XrmoptionSepArg, 0 },
+ {"-walk", ".viewMode", XrmoptionNoArg, "walk" },
+ {"-turn", ".viewMode", XrmoptionNoArg, "turn" },
+ {"-walk-turn", ".viewMode", XrmoptionNoArg, "walk-turn" },
+ {"-orientation-marks", ".marks", XrmoptionNoArg, "on"},
+ {"+orientation-marks", ".marks", XrmoptionNoArg, "off"},
+ {"-projection-3d", ".projection3d", XrmoptionSepArg, 0 },
+ {"-perspective-3d", ".projection3d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-3d", ".projection3d", XrmoptionNoArg, "orthographic" },
+ {"-projection-4d", ".projection4d", XrmoptionSepArg, 0 },
+ {"-perspective-4d", ".projection4d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-4d", ".projection4d", XrmoptionNoArg, "orthographic" },
+ {"-speed-wx", ".speedwx", XrmoptionSepArg, 0 },
+ {"-speed-wy", ".speedwy", XrmoptionSepArg, 0 },
+ {"-speed-wz", ".speedwz", XrmoptionSepArg, 0 },
+ {"-speed-xy", ".speedxy", XrmoptionSepArg, 0 },
+ {"-speed-xz", ".speedxz", XrmoptionSepArg, 0 },
+ {"-speed-yz", ".speedyz", XrmoptionSepArg, 0 },
+ {"-walk-direction", ".walkDirection", XrmoptionSepArg, 0 },
+ {"-walk-speed", ".walkSpeed", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] =
+{
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
+ { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
+ { &view_mode, "viewMode", "ViewMode", DEF_VIEW_MODE, t_String },
+ { &marks, "marks", "Marks", DEF_MARKS, t_Bool },
+ { &proj_3d, "projection3d", "Projection3d", DEF_PROJECTION_3D, t_String },
+ { &proj_4d, "projection4d", "Projection4d", DEF_PROJECTION_4D, t_String },
+ { &speed_wx, "speedwx", "Speedwx", DEF_SPEEDWX, t_Float},
+ { &speed_wy, "speedwy", "Speedwy", DEF_SPEEDWY, t_Float},
+ { &speed_wz, "speedwz", "Speedwz", DEF_SPEEDWZ, t_Float},
+ { &speed_xy, "speedxy", "Speedxy", DEF_SPEEDXY, t_Float},
+ { &speed_xz, "speedxz", "Speedxz", DEF_SPEEDXZ, t_Float},
+ { &speed_yz, "speedyz", "Speedyz", DEF_SPEEDYZ, t_Float},
+ { &walk_direction, "walkDirection", "WalkDirection", DEF_WALK_DIRECTION, t_Float},
+ { &walk_speed, "walkSpeed", "WalkSpeed", DEF_WALK_SPEED, t_Float}
+};
+
+ENTRYPOINT ModeSpecOpt projectiveplane_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, NULL};
+
+
+/* Offset by which we walk above the projective plane */
+#define DELTAY 0.01
+
+/* Number of subdivisions of the projective plane */
+#define NUMU 128
+#define NUMV 128
+
+/* Number of subdivisions per band */
+#define NUMB 8
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* Options */
+ int display_mode;
+ int appearance;
+ int colors;
+ int view;
+ Bool marks;
+ int projection_3d;
+ int projection_4d;
+ /* 4D rotation angles */
+ float alpha, beta, delta, zeta, eta, theta;
+ /* Movement parameters */
+ float umove, vmove, dumove, dvmove;
+ int side, dir;
+ /* The viewing offset in 4d */
+ float offset4d[4];
+ /* The viewing offset in 3d */
+ float offset3d[4];
+ /* The 4d coordinates of the projective plane and their derivatives */
+ float x[(NUMU+1)*(NUMV+1)][4];
+ float xu[(NUMU+1)*(NUMV+1)][4];
+ float xv[(NUMU+1)*(NUMV+1)][4];
+ float pp[(NUMU+1)*(NUMV+1)][3];
+ float pn[(NUMU+1)*(NUMV+1)][3];
+ /* The precomputed colors of the projective plane */
+ float col[(NUMU+1)*(NUMV+1)][4];
+ /* The precomputed texture coordinates of the projective plane */
+ float tex[(NUMU+1)*(NUMV+1)][2];
+ /* The "curlicue" texture */
+ GLuint tex_name;
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Trackball states */
+ trackball_state *trackballs[2];
+ int current_trackball;
+ Bool button_pressed;
+ /* A random factor to modify the rotation speeds */
+ float speed_scale;
+} projectiveplanestruct;
+
+static projectiveplanestruct *projectiveplane = (projectiveplanestruct *) NULL;
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][2];
+ v = m[i][3];
+ m[i][2] = c*u+s*v;
+ m[i][3] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][3];
+ m[i][1] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][3];
+ m[i][0] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+ float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatewx(m,al);
+ rotatewy(m,be);
+ rotatewz(m,de);
+ rotatexy(m,ze);
+ rotatexz(m,et);
+ rotateyz(m,th);
+}
+
+
+/* Compute the rotation matrix m from the 4d rotation angles. */
+static void rotateall4d(float ze, float et, float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatexy(m,ze);
+ rotatexz(m,et);
+ rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+ int i, j, k;
+
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<4; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+ double al, be, de, ze, et, th;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+
+ r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+ r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+ r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+ r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+ r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+ et = atan2(-r12,r22)*180.0/M_PI;
+ th = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ ze = atan2(-r01,r00)*180.0/M_PI;
+
+ rotateall(al,be,de,ze,et,-th,m);
+}
+
+
+/* Compute a fully saturated and bright color based on an angle. */
+static void color(projectiveplanestruct *pp, double angle, float col[4])
+{
+ int s;
+ double t;
+
+ if (pp->colors == COLORS_TWOSIDED)
+ return;
+
+ if (angle >= 0.0)
+ angle = fmod(angle,2.0*M_PI);
+ else
+ angle = fmod(angle,-2.0*M_PI);
+ s = floor(angle/(M_PI/3));
+ t = angle/(M_PI/3)-s;
+ if (s >= 6)
+ s = 0;
+ switch (s)
+ {
+ case 0:
+ col[0] = 1.0;
+ col[1] = t;
+ col[2] = 0.0;
+ break;
+ case 1:
+ col[0] = 1.0-t;
+ col[1] = 1.0;
+ col[2] = 0.0;
+ break;
+ case 2:
+ col[0] = 0.0;
+ col[1] = 1.0;
+ col[2] = t;
+ break;
+ case 3:
+ col[0] = 0.0;
+ col[1] = 1.0-t;
+ col[2] = 1.0;
+ break;
+ case 4:
+ col[0] = t;
+ col[1] = 0.0;
+ col[2] = 1.0;
+ break;
+ case 5:
+ col[0] = 1.0;
+ col[1] = 0.0;
+ col[2] = 1.0-t;
+ break;
+ }
+ if (pp->display_mode == DISP_TRANSPARENT)
+ col[3] = 0.7;
+ else
+ col[3] = 1.0;
+}
+
+
+/* Set up the projective plane coordinates, colors, and texture. */
+static void setup_projective_plane(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
+{
+ int i, j, k;
+ double u, v, ur, vr;
+ double cu, su, cv2, sv2, cv4, sv4, c2u, s2u;
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ k = i*(NUMU+1)+j;
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ u = -ur*j/NUMU+umin;
+ else
+ u = ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ cu = cos(u);
+ su = sin(u);
+ c2u = cos(2.0*u);
+ s2u = sin(2.0*u);
+ sv2 = sin(0.5*v);
+ cv4 = cos(0.25*v);
+ sv4 = sin(0.25*v);
+ if (pp->colors == COLORS_DEPTH)
+ color(pp,((su*su*sv4*sv4-cv4*cv4)+1.0)*M_PI*2.0/3.0,pp->col[k]);
+ else if (pp->colors == COLORS_DIRECTION)
+ color(pp,2.0*M_PI+fmod(2.0*u,2.0*M_PI),pp->col[k]);
+ else /* pp->colors == COLORS_DISTANCE */
+ color(pp,v*(5.0/6.0),pp->col[k]);
+ pp->tex[k][0] = -32*u/(2.0*M_PI);
+ if (pp->appearance != APPEARANCE_DISTANCE_BANDS)
+ pp->tex[k][1] = 32*v/(2.0*M_PI);
+ else
+ pp->tex[k][1] = 32*v/(2.0*M_PI)-0.5;
+ pp->x[k][0] = 0.5*s2u*sv4*sv4;
+ pp->x[k][1] = 0.5*su*sv2;
+ pp->x[k][2] = 0.5*cu*sv2;
+ pp->x[k][3] = 0.5*(su*su*sv4*sv4-cv4*cv4);
+ /* Avoid degenerate tangential plane basis vectors. */
+ if (v < FLT_EPSILON)
+ v = FLT_EPSILON;
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ sv4 = sin(0.25*v);
+ pp->xu[k][0] = c2u*sv4*sv4;
+ pp->xu[k][1] = 0.5*cu*sv2;
+ pp->xu[k][2] = -0.5*su*sv2;
+ pp->xu[k][3] = 0.5*s2u*sv4*sv4;
+ pp->xv[k][0] = 0.125*s2u*sv2;
+ pp->xv[k][1] = 0.25*su*cv2;
+ pp->xv[k][2] = 0.25*cu*cv2;
+ pp->xv[k][3] = 0.125*(su*su+1.0)*sv2;
+ }
+ }
+}
+
+
+/* Draw a 4d embedding of the projective plane projected into 3D. */
+static int projective_plane(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4];
+ int i, j, k, l, m, o;
+ double u, v;
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double q, r, s, t;
+ double cu, su, cv2, sv2, cv4, sv4, c2u, s2u;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+
+ if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ {
+ /* Compute the rotation that rotates the projective plane in 4D without
+ the trackball rotations. */
+ rotateall4d(pp->zeta,pp->eta,pp->theta,mat);
+
+ u = pp->umove;
+ v = pp->vmove;
+ cu = cos(u);
+ su = sin(u);
+ c2u = cos(2.0*u);
+ s2u = sin(2.0*u);
+ sv2 = sin(0.5*v);
+ cv4 = cos(0.25*v);
+ sv4 = sin(0.25*v);
+ xx[0] = 0.5*s2u*sv4*sv4;
+ xx[1] = 0.5*su*sv2;
+ xx[2] = 0.5*cu*sv2;
+ xx[3] = 0.5*(su*su*sv4*sv4-cv4*cv4);
+ /* Avoid degenerate tangential plane basis vectors. */
+ if (v < FLT_EPSILON)
+ v = FLT_EPSILON;
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ sv4 = sin(0.25*v);
+ xxu[0] = c2u*sv4*sv4;
+ xxu[1] = 0.5*cu*sv2;
+ xxu[2] = -0.5*su*sv2;
+ xxu[3] = 0.5*s2u*sv4*sv4;
+ xxv[0] = 0.125*s2u*sv2;
+ xxv[1] = 0.25*su*cv2;
+ xxv[2] = 0.25*cu*cv2;
+ xxv[3] = 0.125*(su*su+1.0)*sv2;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (pp->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+pp->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+pp->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+pp->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(pp->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*pp->dumove+pv[0]*pp->dvmove;
+ pm[1] = pu[1]*pp->dumove+pv[1]*pp->dvmove;
+ pm[2] = pu[2]*pp->dumove+pv[2]*pp->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ pp->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ pp->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ pp->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the projective plane in 4D. */
+ rotateall(pp->alpha,pp->beta,pp->delta,pp->zeta,pp->eta,pp->theta,mat);
+
+ u = pp->umove;
+ v = pp->vmove;
+ cu = cos(u);
+ su = sin(u);
+ s2u = sin(2.0*u);
+ sv2 = sin(0.5*v);
+ cv4 = cos(0.25*v);
+ sv4 = sin(0.25*v);
+ xx[0] = 0.5*s2u*sv4*sv4;
+ xx[1] = 0.5*su*sv2;
+ xx[2] = 0.5*cu*sv2;
+ xx[3] = 0.5*(su*su*sv4*sv4-cv4*cv4);
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (pp->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+pp->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+pp->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+pp->offset4d[l])/s;
+ }
+
+ pp->offset3d[0] = -p[0];
+ pp->offset3d[1] = -p[1]-DELTAY;
+ pp->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the projective plane in 4D,
+ including the trackball rotations. */
+ rotateall(pp->alpha,pp->beta,pp->delta,pp->zeta,pp->eta,pp->theta,r1);
+
+ gltrackball_get_quaternion(pp->trackballs[0],q1);
+ gltrackball_get_quaternion(pp->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ /* Project the points from 4D to 3D. */
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ o = i*(NUMU+1)+j;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*pp->x[o][0]+mat[l][1]*pp->x[o][1]+
+ mat[l][2]*pp->x[o][2]+mat[l][3]*pp->x[o][3]);
+ yu[l] = (mat[l][0]*pp->xu[o][0]+mat[l][1]*pp->xu[o][1]+
+ mat[l][2]*pp->xu[o][2]+mat[l][3]*pp->xu[o][3]);
+ yv[l] = (mat[l][0]*pp->xv[o][0]+mat[l][1]*pp->xv[o][1]+
+ mat[l][2]*pp->xv[o][2]+mat[l][3]*pp->xv[o][3]);
+ }
+ if (pp->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ pp->pp[o][l] = (y[l]+pp->offset4d[l])+pp->offset3d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+pp->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+pp->offset4d[l];
+ pp->pp[o][l] = r*q+pp->offset3d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ pp->pn[o][0] = pu[1]*pv[2]-pu[2]*pv[1];
+ pp->pn[o][1] = pu[2]*pv[0]-pu[0]*pv[2];
+ pp->pn[o][2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(pp->pn[o][0]*pp->pn[o][0]+pp->pn[o][1]*pp->pn[o][1]+
+ pp->pn[o][2]*pp->pn[o][2]);
+ pp->pn[o][0] *= t;
+ pp->pn[o][1] *= t;
+ pp->pn[o][2] *= t;
+ }
+ }
+
+ if (pp->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,pp->tex_name);
+
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ for (i=0; i<NUMV; i++)
+ {
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) >= NUMB/4) && ((i & (NUMB-1)) < 3*NUMB/4))
+ continue;
+ if (pp->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=NUMU; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(NUMU+1)+m;
+ glNormal3fv(pp->pn[o]);
+ glTexCoord2fv(pp->tex[o]);
+ if (pp->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(pp->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,pp->col[o]);
+ }
+ glVertex3fv(pp->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ for (j=0; j<NUMU; j++)
+ {
+ if ((j & (NUMB-1)) >= NUMB/2)
+ continue;
+ if (pp->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (i=0; i<=NUMV; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = (j+k);
+ o = l*(NUMU+1)+m;
+ glNormal3fv(pp->pn[o]);
+ glTexCoord2fv(pp->tex[o]);
+ if (pp->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(pp->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,pp->col[o]);
+ }
+ glVertex3fv(pp->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ }
+
+ polys /= 2;
+ return polys;
+}
+
+
+/* Generate a texture image that shows the orientation reversal. */
+static void gen_texture(ModeInfo *mi)
+{
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+
+ glGenTextures(1,&pp->tex_name);
+ glBindTexture(GL_TEXTURE_2D,pp->tex_name);
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+ glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TEX_DIMENSION,TEX_DIMENSION,0,
+ GL_LUMINANCE,GL_UNSIGNED_BYTE,texture);
+}
+
+
+static void init(ModeInfo *mi)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+
+ if (walk_speed == 0.0)
+ walk_speed = 20.0;
+
+ if (pp->view == VIEW_TURN)
+ {
+ pp->alpha = frand(360.0);
+ pp->beta = frand(360.0);
+ pp->delta = frand(360.0);
+ pp->zeta = 0.0;
+ pp->eta = 0.0;
+ pp->theta = 0.0;
+ }
+ else
+ {
+ pp->alpha = 0.0;
+ pp->beta = 0.0;
+ pp->delta = 0.0;
+ pp->zeta = 120.0;
+ pp->eta = 180.0;
+ pp->theta = 90.0;
+ }
+ pp->umove = frand(2.0*M_PI);
+ pp->vmove = frand(2.0*M_PI);
+ pp->dumove = 0.0;
+ pp->dvmove = 0.0;
+ pp->side = 1;
+ if (sin(walk_direction*M_PI/180.0) >= 0.0)
+ pp->dir = 1;
+ else
+ pp->dir = -1;
+
+ pp->offset4d[0] = 0.0;
+ pp->offset4d[1] = 0.0;
+ pp->offset4d[2] = 0.0;
+ pp->offset4d[3] = 1.2;
+ pp->offset3d[0] = 0.0;
+ pp->offset3d[1] = 0.0;
+ pp->offset3d[2] = -1.2;
+ pp->offset3d[3] = 0.0;
+
+ gen_texture(mi);
+ setup_projective_plane(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+
+ if (pp->marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (pp->projection_3d == DISP_3D_PERSPECTIVE ||
+ pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ {
+ if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ gluPerspective(60.0,1.0,0.01,10.0);
+ else
+ gluPerspective(60.0,1.0,0.1,10.0);
+ }
+ else
+ {
+ glOrtho(-0.6,0.6,-0.6,0.6,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (pp->display_mode == DISP_WIREFRAME)
+ pp->display_mode = DISP_SURFACE;
+# endif
+
+ if (pp->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+}
+
+
+/* Redisplay the Klein bottle. */
+static void display_projectiveplane(ModeInfo *mi)
+{
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+
+ if (!pp->button_pressed)
+ {
+ if (pp->view == VIEW_TURN)
+ {
+ pp->alpha += speed_wx * pp->speed_scale;
+ if (pp->alpha >= 360.0)
+ pp->alpha -= 360.0;
+ pp->beta += speed_wy * pp->speed_scale;
+ if (pp->beta >= 360.0)
+ pp->beta -= 360.0;
+ pp->delta += speed_wz * pp->speed_scale;
+ if (pp->delta >= 360.0)
+ pp->delta -= 360.0;
+ pp->zeta += speed_xy * pp->speed_scale;
+ if (pp->zeta >= 360.0)
+ pp->zeta -= 360.0;
+ pp->eta += speed_xz * pp->speed_scale;
+ if (pp->eta >= 360.0)
+ pp->eta -= 360.0;
+ pp->theta += speed_yz * pp->speed_scale;
+ if (pp->theta >= 360.0)
+ pp->theta -= 360.0;
+ }
+ if (pp->view == VIEW_WALKTURN)
+ {
+ pp->zeta += speed_xy * pp->speed_scale;
+ if (pp->zeta >= 360.0)
+ pp->zeta -= 360.0;
+ pp->eta += speed_xz * pp->speed_scale;
+ if (pp->eta >= 360.0)
+ pp->eta -= 360.0;
+ pp->theta += speed_yz * pp->speed_scale;
+ if (pp->theta >= 360.0)
+ pp->theta -= 360.0;
+ }
+ if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ {
+ pp->dvmove = (pp->dir*sin(walk_direction*M_PI/180.0)*
+ walk_speed*M_PI/4096.0);
+ pp->vmove += pp->dvmove;
+ if (pp->vmove > 2.0*M_PI)
+ {
+ pp->vmove = 4.0*M_PI-pp->vmove;
+ pp->umove = pp->umove-M_PI;
+ if (pp->umove < 0.0)
+ pp->umove += 2.0*M_PI;
+ pp->side = -pp->side;
+ pp->dir = -pp->dir;
+ pp->dvmove = -pp->dvmove;
+ }
+ if (pp->vmove < 0.0)
+ {
+ pp->vmove = -pp->vmove;
+ pp->umove = pp->umove-M_PI;
+ if (pp->umove < 0.0)
+ pp->umove += 2.0*M_PI;
+ pp->dir = -pp->dir;
+ pp->dvmove = -pp->dvmove;
+ }
+ pp->dumove = cos(walk_direction*M_PI/180.0)*walk_speed*M_PI/4096.0;
+ pp->umove += pp->dumove;
+ if (pp->umove >= 2.0*M_PI)
+ pp->umove -= 2.0*M_PI;
+ if (pp->umove < 0.0)
+ pp->umove += 2.0*M_PI;
+ }
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (pp->projection_3d == DISP_3D_PERSPECTIVE ||
+ pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ {
+ if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ gluPerspective(60.0,pp->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,pp->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (pp->aspect >= 1.0)
+ glOrtho(-0.6*pp->aspect,0.6*pp->aspect,-0.6,0.6,0.1,10.0);
+ else
+ glOrtho(-0.6,0.6,-0.6/pp->aspect,0.6/pp->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ mi->polygon_count = projective_plane(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+}
+
+
+ENTRYPOINT void reshape_projectiveplane(ModeInfo *mi, int width, int height)
+{
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+
+ pp->WindW = (GLint)width;
+ pp->WindH = (GLint)height;
+ glViewport(0,0,width,height);
+ pp->aspect = (GLfloat)width/(GLfloat)height;
+}
+
+
+ENTRYPOINT Bool projectiveplane_handle_event(ModeInfo *mi, XEvent *event)
+{
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+ KeySym sym = 0;
+ char c = 0;
+
+ if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
+ XLookupString (&event->xkey, &c, 1, &sym, 0);
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ pp->button_pressed = True;
+ gltrackball_start(pp->trackballs[pp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ pp->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ pp->current_trackball = 1;
+ if (pp->button_pressed)
+ gltrackball_start(pp->trackballs[pp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == KeyRelease)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ pp->current_trackball = 0;
+ if (pp->button_pressed)
+ gltrackball_start(pp->trackballs[pp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == MotionNotify && pp->button_pressed)
+ {
+ gltrackball_track(pp->trackballs[pp->current_trackball],
+ event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize projectiveplane. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_projectiveplane(ModeInfo *mi)
+{
+ projectiveplanestruct *pp;
+
+ MI_INIT(mi, projectiveplane);
+ pp = &projectiveplane[MI_SCREEN(mi)];
+
+
+ pp->trackballs[0] = gltrackball_init(True);
+ pp->trackballs[1] = gltrackball_init(True);
+ pp->current_trackball = 0;
+ pp->button_pressed = False;
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"random"))
+ {
+ pp->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+ else if (!strcasecmp(mode,"wireframe"))
+ {
+ pp->display_mode = DISP_WIREFRAME;
+ }
+ else if (!strcasecmp(mode,"surface"))
+ {
+ pp->display_mode = DISP_SURFACE;
+ }
+ else if (!strcasecmp(mode,"transparent"))
+ {
+ pp->display_mode = DISP_TRANSPARENT;
+ }
+ else
+ {
+ pp->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+
+ /* Orientation marks don't make sense in wireframe mode. */
+ pp->marks = marks;
+ if (pp->display_mode == DISP_WIREFRAME)
+ pp->marks = False;
+
+ /* Set the appearance. */
+ if (!strcasecmp(appear,"random"))
+ {
+ pp->appearance = random() % NUM_APPEARANCES;
+ }
+ else if (!strcasecmp(appear,"solid"))
+ {
+ pp->appearance = APPEARANCE_SOLID;
+ }
+ else if (!strcasecmp(appear,"distance-bands"))
+ {
+ pp->appearance = APPEARANCE_DISTANCE_BANDS;
+ }
+ else if (!strcasecmp(appear,"direction-bands"))
+ {
+ pp->appearance = APPEARANCE_DIRECTION_BANDS;
+ }
+ else
+ {
+ pp->appearance = random() % NUM_APPEARANCES;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_mode,"random"))
+ {
+ pp->colors = random() % NUM_COLORS;
+ }
+ else if (!strcasecmp(color_mode,"two-sided"))
+ {
+ pp->colors = COLORS_TWOSIDED;
+ }
+ else if (!strcasecmp(color_mode,"distance"))
+ {
+ pp->colors = COLORS_DISTANCE;
+ }
+ else if (!strcasecmp(color_mode,"direction"))
+ {
+ pp->colors = COLORS_DIRECTION;
+ }
+ else if (!strcasecmp(color_mode,"depth"))
+ {
+ pp->colors = COLORS_DEPTH;
+ }
+ else
+ {
+ pp->colors = random() % NUM_COLORS;
+ }
+
+ /* Set the view mode. */
+ if (!strcasecmp(view_mode,"random"))
+ {
+ pp->view = random() % NUM_VIEW_MODES;
+ }
+ else if (!strcasecmp(view_mode,"walk"))
+ {
+ pp->view = VIEW_WALK;
+ }
+ else if (!strcasecmp(view_mode,"turn"))
+ {
+ pp->view = VIEW_TURN;
+ }
+ else if (!strcasecmp(view_mode,"walk-turn"))
+ {
+ pp->view = VIEW_WALKTURN;
+ }
+ else
+ {
+ pp->view = random() % NUM_VIEW_MODES;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj_3d,"random"))
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (pp->view == VIEW_TURN)
+ pp->projection_3d = random() % NUM_DISP_3D_MODES;
+ else
+ pp->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"perspective"))
+ {
+ pp->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"orthographic"))
+ {
+ pp->projection_3d = DISP_3D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (pp->view == VIEW_TURN)
+ pp->projection_3d = random() % NUM_DISP_3D_MODES;
+ else
+ pp->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+
+ /* Set the 4d projection mode. */
+ if (!strcasecmp(proj_4d,"random"))
+ {
+ pp->projection_4d = random() % NUM_DISP_4D_MODES;
+ }
+ else if (!strcasecmp(proj_4d,"perspective"))
+ {
+ pp->projection_4d = DISP_4D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_4d,"orthographic"))
+ {
+ pp->projection_4d = DISP_4D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ pp->projection_4d = random() % NUM_DISP_4D_MODES;
+ }
+
+ /* Modify the speeds to a useful range in walk-and-turn mode. */
+ if (pp->view == VIEW_WALKTURN)
+ {
+ speed_wx *= 0.2;
+ speed_wy *= 0.2;
+ speed_wz *= 0.2;
+ speed_xy *= 0.2;
+ speed_xz *= 0.2;
+ speed_yz *= 0.2;
+ }
+
+ /* make multiple screens rotate at slightly different rates. */
+ pp->speed_scale = 0.9 + frand(0.3);
+
+ if ((pp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_projectiveplane(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_projectiveplane(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ projectiveplanestruct *pp;
+
+ if (projectiveplane == NULL)
+ return;
+ pp = &projectiveplane[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(display,window,*(pp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ display_projectiveplane(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_projectiveplane(ModeInfo *mi)
+{
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(pp->glx_context));
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("ProjectivePlane", projectiveplane)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/projectiveplane.man b/hacks/glx/projectiveplane.man
new file mode 100644
index 0000000..8adea81
--- /dev/null
+++ b/hacks/glx/projectiveplane.man
@@ -0,0 +1,400 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+projectiveplane - Draws a 4d embedding of the real projective plane.
+.SH SYNOPSIS
+.B projectiveplane
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-mode \fIdisplay-mode\fP]
+[\-wireframe]
+[\-surface]
+[\-transparent]
+[\-appearance \fIappearance\fP]
+[\-solid]
+[\-distance-bands]
+[\-direction-bands]
+[\-colors \fIcolor-scheme\fP]
+[\-twosided-colors]
+[\-distance-colors]
+[\-direction-colors]
+[\-depth-colors]
+[\-view-mode \fIview-mode\fP]
+[\-walk]
+[\-turn]
+[\-walk-turn]
+[\-orientation-marks]
+[\-projection-3d \fImode\fP]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-projection-4d \fImode\fP]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+[\-walk-direction \fIfloat\fP]
+[\-walk-speed \fIfloat\fP]
+.SH DESCRIPTION
+The \fIprojectiveplane\fP program shows a 4d embedding of the real
+projective plane. You can walk on the projective plane, see it turn
+in 4d, or walk on it while it turns in 4d. The fact that the surface
+is an embedding of the real projective plane in 4d can be seen in the
+depth colors mode: set all rotation speeds to 0 and the projection
+mode to 4d orthographic projection. In its default orientation, the
+embedding of the real projective plane will then project to the Roman
+surface, which has three lines of self-intersection. However, at the
+three lines of self-intersection the parts of the surface that
+intersect have different colors, i.e., different 4d depths.
+.PP
+The real projective plane is a non-orientable surface. To make this
+apparent, the two-sided color mode can be used. Alternatively,
+orientation markers (curling arrows) can be drawn as a texture map on
+the surface of the projective plane. While walking on the projective
+plane, you will notice that the orientation of the curling arrows
+changes (which it must because the projective plane is
+non-orientable).
+.PP
+The real projective plane is a model for the projective geometry in 2d
+space. One point can be singled out as the origin. A line can be
+singled out as the line at infinity, i.e., a line that lies at an
+infinite distance to the origin. The line at infinity is
+topologically a circle. Points on the line at infinity are also used
+to model directions in projective geometry. The origin can be
+visualized in different manners. When using distance colors, the
+origin is the point that is displayed as fully saturated red, which is
+easier to see as the center of the reddish area on the projective
+plane. Alternatively, when using distance bands, the origin is the
+center of the only band that projects to a disk. When using direction
+bands, the origin is the point where all direction bands collapse to a
+point. Finally, when orientation markers are being displayed, the
+origin the the point where all orientation markers are compressed to a
+point. The line at infinity can also be visualized in different ways.
+When using distance colors, the line at infinity is the line that is
+displayed as fully saturated magenta. When two-sided colors are used,
+the line at infinity lies at the points where the red and green
+"sides" of the projective plane meet (of course, the real projective
+plane only has one side, so this is a design choice of the
+visualization). Alternatively, when orientation markers are being
+displayed, the line at infinity is the place where the orientation
+markers change their orientation.
+.PP
+Note that when the projective plane is displayed with bands, the
+orientation markers are placed in the middle of the bands. For
+distance bands, the bands are chosen in such a way that the band at
+the origin is only half as wide as the remaining bands, which results
+in a disk being displayed at the origin that has the same diameter as
+the remaining bands. This choice, however, also implies that the band
+at infinity is half as wide as the other bands. Since the projective
+plane is attached to itself (in a complicated fashion) at the line at
+infinity, effectively the band at infinity is again as wide as the
+remaining bands. However, since the orientation markers are displayed
+in the middle of the bands, this means that only one half of the
+orientation markers will be displayed twice at the line at infinity if
+distance bands are used. If direction bands are used or if the
+projective plane is displayed as a solid surface, the orientation
+markers are displayed fully at the respective sides of the line at
+infinity.
+.PP
+The program projects the 4d projective plane to 3d using either a
+perspective or an orthographic projection. Which of the two
+alternatives looks more appealing is up to you. However, two famous
+surfaces are obtained if orthographic 4d projection is used: The Roman
+surface and the cross cap. If the projective plane is rotated in 4d,
+the result of the projection for certain rotations is a Roman surface
+and for certain rotations it is a cross cap. The easiest way to see
+this is to set all rotation speeds to 0 and the rotation speed around
+the yz plane to a value different from 0. However, for any 4d
+rotation speeds, the projections will generally cycle between the
+Roman surface and the cross cap. The difference is where the origin
+and the line at infinity will lie with respect to the
+self-intersections in the projections to 3d.
+.PP
+The projected projective plane can then be projected to the screen
+either perspectively or orthographically. When using the walking
+modes, perspective projection to the screen will be used.
+.PP
+There are three display modes for the projective plane: mesh
+(wireframe), solid, or transparent. Furthermore, the appearance of
+the projective plane can be as a solid object or as a set of
+see-through bands. The bands can be distance bands, i.e., bands that
+lie at increasing distances from the origin, or direction bands, i.e.,
+bands that lie at increasing angles with respect to the origin.
+.PP
+When the projective plane is displayed with direction bands, you will
+be able to see that each direction band (modulo the "pinching" at the
+origin) is a Moebius strip, which also shows that the projective plane
+is non-orientable.
+.PP
+Finally, the colors with with the projective plane is drawn can be set
+to two-sided, distance, direction, or depth. In two-sided mode, the
+projective plane is drawn with red on one "side" and green on the
+"other side". As described above, the projective plane only has one
+side, so the color jumps from red to green along the line at infinity.
+This mode enables you to see that the projective plane is
+non-orientable. In distance mode, the projective plane is displayed
+with fully saturated colors that depend on the distance of the points
+on the projective plane to the origin. The origin is displayed in
+red, the line at infinity is displayed in magenta. If the projective
+plane is displayed as distance bands, each band will be displayed with
+a different color. In direction mode, the projective plane is
+displayed with fully saturated colors that depend on the angle of the
+points on the projective plane with respect to the origin. Angles in
+opposite directions to the origin (e.g., 15 and 205 degrees) are
+displayed in the same color since they are projectively equivalent.
+If the projective plane is displayed as direction bands, each band
+will be displayed with a different color. Finally, in depth mode the
+projective plane with colors chosen depending on the 4d "depth" (i.e.,
+the w coordinate) of the points on the projective plane at its default
+orientation in 4d. As discussed above, this mode enables you to see
+that the projective plane does not intersect itself in 4d.
+.PP
+The rotation speed for each of the six planes around which the
+projective plane rotates can be chosen. For the walk-and-turn mode,
+only the rotation speeds around the true 4d planes are used (the xy,
+xz, and yz planes).
+.PP
+Furthermore, in the walking modes the walking direction in the 2d base
+square of the projective plane and the walking speed can be chosen.
+The walking direction is measured as an angle in degrees in the 2d
+square that forms the coordinate system of the surface of the
+projective plane. A value of 0 or 180 means that the walk is along a
+circle at a randomly chosen distance from the origin (parallel to a
+distance band). A value of 90 or 270 means that the walk is directly
+from the origin to the line at infinity and back (analogous to a
+direction band). Any other value results in a curved path from the
+origin to the line at infinity and back.
+.PP
+This program is somewhat inspired by Thomas Banchoff's book "Beyond
+the Third Dimension: Geometry, Computer Graphics, and Higher
+Dimensions", Scientific American Library, 1990.
+.SH OPTIONS
+.I projectiveplane
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 10000, or 1/100th second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.PP
+The following four options are mutually exclusive. They determine how
+the projective plane is displayed.
+.TP 8
+.B \-mode random
+Display the projective plane in a random display mode (default).
+.TP 8
+.B \-mode wireframe \fP(Shortcut: \fB\-wireframe\fP)
+Display the projective plane as a wireframe mesh.
+.TP 8
+.B \-mode surface \fP(Shortcut: \fB\-surface\fP)
+Display the projective plane as a solid surface.
+.TP 8
+.B \-mode transparent \fP(Shortcut: \fB\-transparent\fP)
+Display the projective plane as a transparent surface.
+.PP
+The following three options are mutually exclusive. They determine
+the appearance of the projective plane.
+.TP 8
+.B \-appearance random
+Display the projective plane with a random appearance (default).
+.TP 8
+.B \-appearance solid \fP(Shortcut: \fB\-solid\fP)
+Display the projective plane as a solid object.
+.TP 8
+.B \-appearance distance-bands \fP(Shortcut: \fB\-distance-bands\fP)
+Display the projective plane as see-through bands that lie at
+increasing distances from the origin.
+.PP
+.TP 8
+.B \-appearance direction-bands \fP(Shortcut: \fB\-direction-bands\fP)
+Display the projective plane as see-through bands that lie at
+increasing angles with respect to the origin.
+.PP
+The following four options are mutually exclusive. They determine how
+to color the projective plane.
+.TP 8
+.B \-colors random
+Display the projective plane with a random color scheme (default).
+.TP 8
+.B \-colors twosided \fP(Shortcut: \fB\-twosided-colors\fP)
+Display the projective plane with two colors: red on one "side" and
+green on the "other side." Note that the line at infinity lies at the
+points where the red and green "sides" of the projective plane meet,
+i.e., where the orientation of the projective plane reverses.
+.TP 8
+.B \-colors distance \fP(Shortcut: \fB\-distance-colors\fP)
+Display the projective plane with fully saturated colors that depend
+on the distance of the points on the projective plane to the origin.
+The origin is displayed in red, the line at infinity is displayed in
+magenta. If the projective plane is displayed as distance bands, each
+band will be displayed with a different color.
+.TP 8
+.B \-colors direction \fP(Shortcut: \fB\-direction-colors\fP)
+Display the projective plane with fully saturated colors that depend
+on the angle of the points on the projective plane with respect to the
+origin. Angles in opposite directions to the origin (e.g., 15 and 205
+degrees) are displayed in the same color since they are projectively
+equivalent. If the projective plane is displayed as direction bands,
+each band will be displayed with a different color.
+.TP 8
+.B \-colors depth \fP(Shortcut: \fB\-depth\fP)
+Display the projective plane with colors chosen depending on the 4d
+"depth" (i.e., the w coordinate) of the points on the projective plane
+at its default orientation in 4d.
+.PP
+The following four options are mutually exclusive. They determine how
+to view the projective plane.
+.TP 8
+.B \-view-mode random
+View the projective plane in a random view mode (default).
+.TP 8
+.B \-view-mode turn \fP(Shortcut: \fB\-turn\fP)
+View the projective plane while it turns in 4d.
+.TP 8
+.B \-view-mode walk \fP(Shortcut: \fB\-walk\fP)
+View the projective plane as if walking on its surface.
+.TP 8
+.B \-view-mode walk-turn \fP(Shortcut: \fB\-walk-turn\fP)
+View the projective plane as if walking on its surface. Additionally,
+the projective plane turns around the true 4d planes (the xy, xz, and
+yz planes).
+.PP
+The following options determine whether orientation marks are shown on
+the projective plane.
+.TP 8
+.B \-orientation-marks
+Display orientation marks on the projective plane.
+.TP 8
+.B \-no-orientation-marks
+Don't display orientation marks on the projective plane (default).
+.PP
+The following three options are mutually exclusive. They determine
+how the projective plane is projected from 3d to 2d (i.e., to the
+screen).
+.TP 8
+.B \-projection-3d random
+Project the projective plane from 3d to 2d using a random projection
+mode (default).
+.TP 8
+.B \-projection-3d perspective \fP(Shortcut: \fB\-perspective-3d\fP)
+Project the projective plane from 3d to 2d using a perspective
+projection.
+.TP 8
+.B \-projection-3d orthographic \fP(Shortcut: \fB\-orthographic-3d\fP)
+Project the projective plane from 3d to 2d using an orthographic
+projection.
+.PP
+The following three options are mutually exclusive. They determine
+how the projective plane is projected from 4d to 3d.
+.TP 8
+.B \-projection-4d random
+Project the projective plane from 4d to 3d using a random projection
+mode (default).
+.TP 8
+.B \-projection-4d perspective \fP(Shortcut: \fB\-perspective-4d\fP)
+Project the projective plane from 4d to 3d using a perspective
+projection.
+.TP 8
+.B \-projection-4d orthographic \fP(Shortcut: \fB\-orthographic-4d\fP)
+Project the projective plane from 4d to 3d using an orthographic
+projection.
+.PP
+The following six options determine the rotation speed of the
+projective plane around the six possible hyperplanes. The rotation
+speed is measured in degrees per frame. The speeds should be set to
+relatively small values, e.g., less than 4 in magnitude. In walk
+mode, all speeds are ignored. In walk-and-turn mode, the 3d rotation
+speeds are ignored (i.e., the wx, wy, and wz speeds). In
+walk-and-turn mode, smaller speeds must be used than in the turn mode
+to achieve a nice visualization. Therefore, in walk-and-turn mode the
+speeds you have selected are divided by 5 internally.
+.TP 8
+.B \-speed-wx \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-wy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.PP
+The following two options determine the walking speed and direction.
+.TP 8
+.B \-walk-direction \fIfloat\fP
+The walking direction is measured as an angle in degrees in the 2d
+square that forms the coordinate system of the surface of the
+projective plane (default: 83.0). A value of 0 or 180 means that the
+walk is along a circle at a randomly chosen distance from the origin
+(parallel to a distance band). A value of 90 or 270 means that the
+walk is directly from the origin to the line at infinity and back
+(analogous to a direction band). Any other value results in a curved
+path from the origin to the line at infinity and back.
+.TP 8
+.B \-walk-speed \fIfloat\fP
+The walking speed is measured in percent of some sensible maximum
+speed (default: 20.0).
+.SH INTERACTION
+If you run this program in standalone mode in its turn mode, you can
+rotate the projective plane by dragging the mouse while pressing the
+left mouse button. This rotates the projective plane in 3D, i.e.,
+around the wx, wy, and wz planes. If you press the shift key while
+dragging the mouse with the left button pressed the projective plane
+is rotated in 4D, i.e., around the xy, xz, and yz planes. To examine
+the projective plane at your leisure, it is best to set all speeds to
+0. Otherwise, the projective plane will rotate while the left mouse
+button is not pressed. This kind of interaction is not available in
+the two walk modes.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005-2014 by Carsten Steger. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 03-oct-2014.
diff --git a/hacks/glx/providence.c b/hacks/glx/providence.c
new file mode 100644
index 0000000..d628845
--- /dev/null
+++ b/hacks/glx/providence.c
@@ -0,0 +1,799 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2004 Blair Tennessy
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define free_providence 0
+# define release_providence 0
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#endif
+
+#include "gltrackball.h"
+
+#define DEF_SOLIDPROVIDENCE "False"
+#define DEF_EYE "True"
+
+static int eye;
+
+static XrmOptionDescRec opts[] = {
+ {"-eye", ".providence.eye", XrmoptionNoArg, "on"},
+ {"+eye", ".providence.eye", XrmoptionNoArg, "off"}
+};
+
+static argtype vars[] = {
+ {&eye, "eye", "Eye", DEF_EYE, t_Bool}
+};
+
+static OptionStruct desc[] = {
+ {"-/+eye", "turn on/off eye of providence"}
+};
+
+ENTRYPOINT ModeSpecOpt providence_opts = {
+ sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc
+};
+
+#ifdef USE_MODULES
+ModStruct providence_description = {
+ "providence", "init_providence", "draw_providence",
+ (char *) NULL, "draw_providence", "change_providence",
+ (char *) NULL, &providence_opts, 1000, 1, 1, 1, 4, 1.0, "",
+ "draws pyramid with glory", 0, NULL
+};
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+/* brick texture */
+#define checkImageWidth 64
+#define checkImageHeight 64
+
+#define EYE_PARTICLE_COUNT 2000
+
+#define LOOKUPSIZE (3600/5) /* 3600 was way too much RAM on iOS */
+#define EYELENGTH 300
+
+#define EPSILON 0.0001
+#define PARTICLE_COUNT 2000
+#define FPS 50
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLfloat position0[4];
+ GLubyte checkImage[checkImageWidth][checkImageHeight][3];
+ GLuint bricktexture;
+
+ int mono, wire;
+ double camera_velocity;
+ double camera_z;
+
+ int pyramidlist;
+ double currenttime;
+ double theta;
+ double theta_scale;
+
+ double particles[PARTICLE_COUNT][5];
+ int eyeparticles[EYE_PARTICLE_COUNT][2];
+ double lookup[LOOKUPSIZE][EYELENGTH][2];
+ double lookup2[LOOKUPSIZE][EYELENGTH][2];
+
+} providencestruct;
+
+/* lighting variables */
+/*static const GLfloat front_shininess[] = {60.0};*/
+/*static const GLfloat front_specular[] = {0.2, 0.2, 0.2, 1.0};*/
+/*static const GLfloat ambient[] = {0.8, 0.8, 0.8, 1.0};*/
+static const GLfloat ambient2[] = {0.25, 0.25, 0.25, 1.0};
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const GLfloat lmodel_twoside[] = {GL_TRUE};
+
+/* gray-gray */
+
+static const GLfloat MaterialGlory[] = {0.04, 0.30, 0.22, 0.7};
+static const GLfloat MaterialGloryB[] = {0.07, 0.50, 0.36, 0.6};
+
+static const GLfloat MaterialGloryF[] = {0.07, 0.50, 0.36, 1.0};
+/* static const GLfloat MaterialGloryF[] = {0.06, 0.38, 0.27, 1.0}; */
+/*static const GLfloat MaterialGloryE[] = {0.06, 0.38, 0.27, 0.3};*/
+static const GLfloat MaterialGloryM[] = {0.5, 0.5, 0.5, 0.5};
+static const GLfloat MaterialGloryMB[] = {0.36, 0.36, 0.36, 0.4};
+/*static const GLfloat MaterialGreenback[4] = {0.04, 0.30, 0.22, 1.0};*/
+/*static const GLfloat MaterialBlack[4] = {0.0, 0.0, 0.0, 1.0};*/
+
+static const GLfloat MaterialGray5[] = {0.5, 0.5, 0.5, 1.0};
+/*static const GLfloat MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};*/
+
+static providencestruct *providence = (providencestruct *) NULL;
+
+#define NUM_SCENES 2
+
+/* build brick texture */
+static void make_brick(providencestruct *mp)
+{
+ int i, j, c;
+
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = i % 16 == 15 ? 255 : (j + 48*(i / 16))%64 == 0 ? 255 :
+ 102 + random() % 102;
+ mp->checkImage[i][j][0] = (GLubyte) c;
+ mp->checkImage[i][j][1] = (GLubyte) c;
+ mp->checkImage[i][j][2] = (GLubyte) c;
+ }
+ }
+
+ glGenTextures(1, &mp->bricktexture);
+ glBindTexture(GL_TEXTURE_2D, mp->bricktexture);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &mp->checkImage[0][0]);
+}
+
+
+/* build eye lookup table */
+static void build_eye(providencestruct *mp)
+{
+ int i, j;
+ double x;
+ double inc = 0.1 / EYELENGTH;
+ double inc2 = 2.4*Pi / EYELENGTH;
+
+ /* describe all values tangentially out from pupil */
+ for(i = 0; i < LOOKUPSIZE; ++i) {
+ double r = i * 2*Pi / LOOKUPSIZE;/*x + inc;*/
+ double sr = sin(r);
+ double cr = cos(r);
+ x = 0.07;
+
+ for(j = 0; j < EYELENGTH; ++j) {
+ mp->lookup[i][j][0] = x*sr;
+ mp->lookup[i][j][1] = x*cr;
+ x += inc;
+ }
+ }
+
+ /* lookup2: dollar sign */
+ for(i = 0; i < LOOKUPSIZE; ++i) {
+ double y = -1.2*Pi;
+
+ for(j = 0; j < EYELENGTH; ++j) {
+ if(i % 2) {
+ mp->lookup2[i][j][0] = sin(y)/6.0 + i/36000.0 - 0.05;
+ mp->lookup2[i][j][1] = i%4 ? y/12.0 - 0.05 : 1.2*Pi-y/12.0 + 0.05;
+ }
+ else {
+ mp->lookup2[i][j][0] = i/36000.0 - 0.05;
+ mp->lookup2[i][j][1] = y/9.0 - 0.05;
+ }
+ y += inc2;
+ }
+ }
+}
+
+
+static double min(double a, double b)
+{
+ return a < b ? a : b;
+}
+
+static double max(double a, double b)
+{
+ return a > b ? a : b;
+}
+
+static void init_particle(providencestruct *mp, double particle[5])
+{
+ /* position along glory */
+ double p = (random() % 485410) / 100000.0;
+
+ /* on a plane */
+ particle[2] = 0.0;
+
+ if(p < 1.5) {
+ particle[0] = p - 0.75;
+ particle[1] = -0.75001;
+ }
+ else if(p < 1.5 + sqrt(45)/4.0) {
+ double d = p - 1.5;
+ particle[0] = 0.75 - d*cos(atan(2.0));
+ particle[1] = d*sin(atan(2.0)) - 0.75;
+ }
+ else {
+ double d = 4.8541 - p;
+ particle[0] = -0.75 + d*cos(atan(2.0));
+ particle[1] = d*sin(atan(2.0)) - 0.75;
+ }
+
+ particle[3] = mp->currenttime;
+ particle[4] = 1.25 + (random()%10)/10.0;
+}
+
+/* init glory particles */
+static void init_particles(providencestruct *mp)
+{
+ int i;
+ for(i = 0; i < PARTICLE_COUNT; ++i) {
+ init_particle(mp, mp->particles[i]);
+
+ /* set initial time */
+ mp->particles[i][3] = mp->currenttime - (random()%1250)/1000.0;
+ }
+
+ /* init eye particles */
+ for(i = 0; i < EYE_PARTICLE_COUNT; ++i) {
+ mp->eyeparticles[i][0] = random()%LOOKUPSIZE;
+ mp->eyeparticles[i][1] = random()%EYELENGTH;
+ }
+}
+
+
+/* ugg, should be a priority queue if next event times known */
+static void update_particles(providencestruct *mp)
+{
+ int i;
+
+ for(i = 0; i < PARTICLE_COUNT; ++i) {
+ /* check for time elapse */
+ if(mp->currenttime > mp->particles[i][3] + mp->particles[i][4])
+ init_particle(mp, mp->particles[i]);
+ }
+
+ /* now update eye particles */
+ for(i = 0; i < EYE_PARTICLE_COUNT; ++i) {
+/* int x = eyeparticles[i][1] + random()%16; */
+ int x = mp->eyeparticles[i][1] + random()%(cos(mp->theta) < 0.0 ? 8 : 16);
+
+ /* reset if dead */
+ if(x >= EYELENGTH || random()%(cos(mp->theta) < 0.0 ? 40 : 10) == 0) {
+
+/* if(x > EYELENGTH || (x > EYELENGTH/(2/3.0) && random()%7 == 0)) { */
+ mp->eyeparticles[i][0] = random()%LOOKUPSIZE;
+ mp->eyeparticles[i][1] = random()%40;
+ }
+ else {
+ mp->eyeparticles[i][1] = x;
+ }
+ }
+}
+
+/* draw the pyramid */
+static void draw_seal(providencestruct *mp)
+{
+ int i;
+ double base = sqrt(2.0);
+ double top = 1.0 / sqrt(2.0);
+ double tmod = 7.0/6.0;
+
+ glPushMatrix();
+
+ /* set options for mono, wireframe */
+ if(mp->wire) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ }
+ else {
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, mp->bricktexture);
+
+ glEnable(GL_LIGHTING);
+
+ glColor4fv(mp->mono ? MaterialGray5 : MaterialGloryF);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGray5 : MaterialGloryF);
+ }
+
+ glRotatef(45.0, 0.0, 1.0, 0.0);
+ glTranslatef(0.0, -3.25, 0.0);
+
+ for(i = 0; i < 4; ++i) {
+ glRotatef(i*90.0, 0.0, 1.0, 0.0);
+
+ glBegin(GL_QUADS);
+ glNormal3f(1 / sqrt(6.0), 2 / sqrt(6.0), 1 / sqrt(6.0));
+ glTexCoord2f(-base, 0.0);
+ glVertex3f(-base, 0.0, base);
+ glTexCoord2f(base, 0.0);
+ glVertex3f(base, 0.0, base);
+ glTexCoord2f(top, 13.0/4.0);
+ glVertex3f(top, 2.0, top);
+ glTexCoord2f(-top, 13.0/4.0);
+ glVertex3f(-top, 2.0, top);
+ glEnd();
+ }
+
+ glBegin(GL_QUADS);
+
+ /* top */
+ glNormal3f(0.0, 1.0, 0.0);
+ glTexCoord2f(0.02, 0.0);
+ glVertex3f(-top, 2.0, top);
+ glTexCoord2f(2.0*top, 0.0);
+ glVertex3f(top, 2.0, top);
+ glTexCoord2f(2.0*top, tmod*2.1*top);
+ glVertex3f(top, 2.0, -top);
+ glTexCoord2f(0.02, tmod*2.1*top);
+ glVertex3f(-top, 2.0, -top);
+
+ /* base */
+ glNormal3f(0.0, -1.0, 0.0);
+ glTexCoord2f(-base, 0.0);
+ glVertex3f(-base, 0.0, -base);
+ glTexCoord2f(top, 0.0);
+ glVertex3f(base, 0.0, -base);
+ glTexCoord2f(top, top*13.0/4.0);
+ glVertex3f(base, 0.0, base);
+ glTexCoord2f(-top, top*13.0/4.0);
+ glVertex3f(-base, 0.0, base);
+
+ glEnd();
+
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+}
+
+/* draw glory */
+static void draw_glory(providencestruct *mp)
+{
+ int i;
+
+ if(mp->wire) {
+ glBegin(GL_TRIANGLES);
+ glVertex3f(-0.75, -0.75, 0.0);
+ glVertex3f(0.75, -0.75, 0.0);
+ glVertex3f(0.0, 0.75, 0.0);
+
+ glVertex3f(0.0, 0.75, 0.0);
+ glVertex3f(0.75, -0.75, 0.0);
+ glVertex3f(-0.75, -0.75, 0.0);
+ glEnd();
+ return;
+ }
+
+ /* draw particles */
+ glDisable(GL_LIGHTING);
+ glPushMatrix();
+ glEnable(GL_BLEND);
+
+ /* glory colour lines */
+ glColor4fv(mp->mono ? MaterialGloryM : MaterialGlory);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryM : MaterialGlory);
+
+ glBegin(GL_LINES);
+ for(i = 0; i < PARTICLE_COUNT/2; ++i) {
+ double t = mp->currenttime - mp->particles[i][3];
+ double th = atan(mp->particles[i][1] / mp->particles[i][0]);
+ if(mp->particles[i][0] < 0.0)
+ th += Pi;
+
+ glVertex3f(mp->particles[i][0], mp->particles[i][1], mp->particles[i][2]);
+ glVertex3f(mp->particles[i][0] + 0.2*cos(th)*t,
+ mp->particles[i][1] + 0.2*sin(th)*t,
+ mp->particles[i][2]);
+ }
+ glEnd();
+
+ /* gloryb colour lines */
+ glColor4fv(mp->mono ? MaterialGloryMB : MaterialGloryB);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryMB : MaterialGloryB);
+ glBegin(GL_LINES);
+ for(; i < PARTICLE_COUNT; ++i) {
+ double t = mp->currenttime - mp->particles[i][3];
+ double th = atan(mp->particles[i][1] / mp->particles[i][0]);
+ if(mp->particles[i][0] < 0.0)
+ th += Pi;
+
+ glVertex3f(mp->particles[i][0], mp->particles[i][1], mp->particles[i][2]);
+ glVertex3f(mp->particles[i][0] + 0.2*cos(th)*t,
+ mp->particles[i][1] + 0.2*sin(th)*t,
+ mp->particles[i][2]);
+ }
+ glEnd();
+
+ glPopMatrix();
+ glEnable(GL_LIGHTING);
+}
+
+/* draw eye of providence */
+static void draw_eye(providencestruct *mp)
+{
+ int i;
+
+ /* draw wireeye */
+ if(mp->wire) {
+ glBegin(GL_TRIANGLES);
+ glVertex3f(-0.25, -0.25, 0.0);
+ glVertex3f(0.25, -0.25, 0.0);
+ glVertex3f(0.0, 0.25, 0.0);
+ glEnd();
+ return;
+ }
+
+ /* draw particles */
+ glDisable(GL_LIGHTING);
+ glPushMatrix();
+ glEnable(GL_BLEND);
+
+ /* eye */
+ glColor4fv(mp->mono ? MaterialGloryM : MaterialGlory);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryM : MaterialGlory);
+
+ /* draw eye particles on z = 0 plane */
+ glBegin(GL_POINTS);
+ for(i = 0; i < EYE_PARTICLE_COUNT/2; ++i) {
+ glVertex3f(mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][0],
+ mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][1],
+ 0.0);
+ }
+ glEnd();
+
+ /* eye */
+ glColor4fv(mp->mono ? MaterialGloryMB : MaterialGloryB);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryMB : MaterialGloryB);
+
+ /* draw eye particles on z = 0 plane */
+ glBegin(GL_POINTS);
+ for(; i < EYE_PARTICLE_COUNT; ++i) {
+ glVertex3f(mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][0],
+ mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][1],
+ 0.0);
+ }
+ glEnd();
+
+
+ /* draw scaled particles */
+ glPushMatrix();
+ glScalef(3.3, 2.2, 3.3);
+
+ /* eye */
+ glColor4fv(mp->mono ? MaterialGloryMB : MaterialGloryB);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryMB : MaterialGloryB);
+
+ /* draw eye particles on z = 0 plane */
+ glBegin(GL_POINTS);
+ for(i = 0; i < EYE_PARTICLE_COUNT/2; ++i) {
+ glVertex3f(mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][0],
+ mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][1],
+ 0.0);
+ }
+ glEnd();
+
+ glColor4fv(mp->mono ? MaterialGloryM : MaterialGlory);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryM : MaterialGlory);
+
+ /* draw eye particles on z = 0 plane */
+ glBegin(GL_POINTS);
+ for(; i < EYE_PARTICLE_COUNT; ++i) {
+ glVertex3f(mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][0],
+ mp->lookup[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][1],
+ 0.0);
+ }
+ glEnd();
+
+ glPopMatrix();
+
+ glPopMatrix();
+ glEnable(GL_LIGHTING);
+}
+
+/* draw eye of providence */
+static void draw_eye2(providencestruct *mp)
+{
+ int i;
+
+ /* draw wireeye */
+ if(mp->wire) {
+ glBegin(GL_TRIANGLES);
+ glVertex3f(0.0, 0.25, 0.0);
+ glVertex3f(0.25, -0.25, 0.0);
+ glVertex3f(-0.25, -0.25, 0.0);
+ glEnd();
+ return;
+ }
+
+ /* draw particles */
+ glDisable(GL_LIGHTING);
+ glPushMatrix();
+ glEnable(GL_BLEND);
+
+ /* eye */
+ glColor4fv(mp->mono ? MaterialGloryM : MaterialGlory);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryM : MaterialGlory);
+
+ /* draw eye particles on z = 0 plane */
+ glBegin(GL_POINTS);
+ for(i = 0; i < EYE_PARTICLE_COUNT/2; ++i) {
+ glVertex3f(mp->lookup2[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][0],
+ mp->lookup2[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][1],
+ 0.0);
+ }
+ glEnd();
+
+ /* eye */
+ glColor4fv(mp->mono ? MaterialGloryMB : MaterialGloryB);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
+ mp->mono ? MaterialGloryMB : MaterialGloryB);
+
+ /* draw eye particles on z = 0 plane */
+ glBegin(GL_POINTS);
+ for(; i < EYE_PARTICLE_COUNT; ++i) {
+ glVertex3f(mp->lookup2[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][0],
+ mp->lookup2[mp->eyeparticles[i][0]][mp->eyeparticles[i][1]][1],
+ 0.0);
+ }
+ glEnd();
+
+ glPopMatrix();
+ glEnable(GL_LIGHTING);
+}
+
+/* draw the scene */
+static void draw_providence_strip(ModeInfo *mi)
+{
+ providencestruct *mp = &providence[MI_SCREEN(mi)];
+ glTranslatef(0.0, 1.414, 0.0);
+
+ mp->position0[0] = 1.6*sin(mp->theta);
+ mp->position0[1] = 1.2;
+ mp->position0[2] = 1.6*cos(mp->theta);
+ mp->position0[3] = 0.0;
+ glLightfv(GL_LIGHT0, GL_POSITION, mp->position0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ /* draw pyramid, glory */
+ glDisable(GL_BLEND);
+ glCallList(mp->pyramidlist);
+ draw_glory(mp);
+ if(eye) {
+ if(cos(mp->theta) < 0.0)
+ draw_eye2(mp);
+ else
+ draw_eye(mp);
+ }
+
+ return;
+}
+
+ENTRYPOINT void reshape_providence(ModeInfo * mi, int width, int height)
+{
+ providencestruct *mp = &providence[MI_SCREEN(mi)];
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 3;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective(45, 1/h, 0.001, 25.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLineWidth(2.0);
+ glPointSize(2.0);
+}
+
+static void pinit(providencestruct *mp)
+{
+ glClearDepth(1.0);
+
+ mp->currenttime = 0.0;
+ init_particles(mp);
+ make_brick(mp);
+ build_eye(mp);
+
+ /* build pyramid list */
+ mp->pyramidlist = glGenLists(1);
+ glNewList(mp->pyramidlist, GL_COMPILE);
+ draw_seal(mp);
+ glEndList();
+}
+
+/* event handling */
+ENTRYPOINT Bool providence_handle_event(ModeInfo *mi, XEvent *event)
+{
+ providencestruct *mp = &providence[MI_SCREEN(mi)];
+
+ switch(event->xany.type) {
+ case ButtonPress:
+ switch(event->xbutton.button) {
+ case Button4:
+ mp->camera_velocity += 1.0;
+ return True;
+ case Button5:
+ mp->camera_velocity -= 1.0;
+ return True;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ return False;
+}
+
+ENTRYPOINT void init_providence(ModeInfo *mi)
+{
+ providencestruct *mp;
+
+ MI_INIT(mi, providence);
+ mp = &providence[MI_SCREEN(mi)];
+ mp->trackball = gltrackball_init (False);
+
+ mp->position0[0] = 1;
+ mp->position0[1] = 5;
+ mp->position0[2] = 1;
+ mp->position0[3] = 1;
+
+ mp->camera_velocity = -8.0;
+
+ mp->mono = MI_IS_MONO(mi);
+ mp->wire = MI_IS_WIREFRAME(mi);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ mp->wire = 0;
+# endif
+
+ /* make multiple screens rotate at slightly different rates. */
+ mp->theta_scale = 0.7 + frand(0.6);
+
+ if((mp->glx_context = init_GL(mi)) != NULL) {
+ reshape_providence(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ /* glDrawBuffer(GL_BACK); */
+ pinit(mp);
+ }
+ else
+ MI_CLEARWINDOW(mi);
+}
+
+ENTRYPOINT void draw_providence(ModeInfo * mi)
+{
+ providencestruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!providence)
+ return;
+ mp = &providence[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if(!mp->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ /* setup twoside lighting */
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, mp->position0);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+/* glDisable(GL_CULL_FACE); */
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /* modify camera */
+ if(fabs(mp->camera_velocity) > EPSILON) {
+ mp->camera_z = max(min(mp->camera_z + 0.1*mp->camera_velocity, -4.0), -12.0);
+ mp->camera_velocity = 0.95*mp->camera_velocity;
+ }
+
+ /* rotate providence */
+ glTranslatef(0.0, 0.0, mp->camera_z + sin(mp->theta/4.0));
+ glRotatef(10.0+20.0*sin(mp->theta/2.0), 1.0, 0.0, 0.0);
+ gltrackball_rotate(mp->trackball);
+ glRotatef(mp->theta * 180.0 / Pi, 0.0, -1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ /* draw providence */
+ draw_providence_strip(mi);
+ glPopMatrix();
+
+ if(MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ /* update */
+ mp->currenttime += 1.0 / FPS;
+ mp->theta = mp->currenttime / 2.0 * mp->theta_scale;
+ update_particles(mp);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_providence(ModeInfo * mi)
+{
+ providencestruct *mp = &providence[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Providence", providence)
diff --git a/hacks/glx/providence.man b/hacks/glx/providence.man
new file mode 100644
index 0000000..ea7286d
--- /dev/null
+++ b/hacks/glx/providence.man
@@ -0,0 +1,66 @@
+.TH XScreenSaver 1 "May 2004"
+.SH NAME
+providence - eye in glory screenhack
+.SH SYNOPSIS
+.B providence
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+ [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIprovidence\fP code displays an eye, shrouded in glory, set upon the
+base of a pyramid.
+.SH OPTIONS
+.I providence
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-eye
+Draw an eye/$.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-wireframe
+Render in wireframe (with hidden line removal) instead of as textured solids.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessy@cs.ubc.ca>, 11-May-2004.
+
diff --git a/hacks/glx/pulsar.c b/hacks/glx/pulsar.c
new file mode 100644
index 0000000..285b5de
--- /dev/null
+++ b/hacks/glx/pulsar.c
@@ -0,0 +1,515 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* pulsar --- pulsar module for xpulsar */
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+
+ * Revision History:
+ * 4-Apr-1999: dek@cgl.ucsf.edu Created module "pulsar"
+ * 27-Apr-1999: dek@cgl.ucsf.edu Submitted module "pulsar"
+ * 4-May-1999: jwz@jwz.org Added module "pulsar"
+ * 4-May-1999: dek@cgl.ucsf.edu Submitted module "pulsar" updates
+ *
+ * Notes:
+ * The pulsar pulsar draws a number of rotating, pulsing rectangles
+ * on your screen. Depending on the options you choose, you can set a number
+ * of interesting OpenGL parameters, including alpha blending, depth testing, fog,
+ * lighting, texturing, mipmapping, bilinear filtering, and line antialiasing.
+ * Additionally, there is a "frames per second" meter which gives an estimate of
+ * the speed of your graphics card.
+ *
+ * Example command-line switches:
+ * Only draw a single quad, and don't fill it (boring but fast)
+ * pulsar -wire -quads 1 -fps
+ *
+ * Only try this with hardware graphics acceleration (PPro 200 w/ a Voodoo 2 runs great)
+ * pulsar -quads 10 -texture -mipmap -texture_quality -light -fog -fps
+ *
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+
+# define release_pulsar 0
+# define pulsar_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xpulsar distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#include "ximage-loader.h"
+
+/* Functions for loading and storing textures */
+
+#define checkImageWidth 64
+#define checkImageHeight 64
+
+/* Functions for handling the frames per second timer */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define WIDTH 800
+#define HEIGHT 600
+
+#define NUM_QUADS 5
+#define DEF_QUADS "5"
+#define DEF_LIGHT "False"
+#define DEF_WIRE "False"
+#define DEF_BLEND "True"
+#define DEF_FOG "False"
+#define DEF_ANTIALIAS "False"
+#define DEF_TEXTURE "False"
+#define DEF_TEXTURE_QUALITY "False"
+#define DEF_MIPMAP "False"
+#define DEF_DO_DEPTH "False"
+#define DEF_IMAGE "BUILTIN"
+
+static int num_quads;
+static int do_light;
+static int do_wire;
+static int do_blend;
+static int do_fog;
+static int do_antialias;
+static int do_texture;
+static int do_texture_quality;
+static int do_mipmap;
+static int do_depth;
+static char *which_image;
+
+
+static XrmOptionDescRec opts[] = {
+ {"-quads", ".pulsar.quads", XrmoptionSepArg, 0 },
+ {"-light", ".pulsar.light", XrmoptionNoArg, "true" },
+ {"+light", ".pulsar.light", XrmoptionNoArg, "false" },
+ {"-wire", ".pulsar.wire", XrmoptionNoArg, "true" },
+ {"+wire", ".pulsar.wire", XrmoptionNoArg, "false" },
+ {"-blend", ".pulsar.blend", XrmoptionNoArg, "true" },
+ {"+blend", ".pulsar.blend", XrmoptionNoArg, "false" },
+ {"-fog", ".pulsar.fog", XrmoptionNoArg, "true" },
+ {"+fog", ".pulsar.fog", XrmoptionNoArg, "false" },
+ {"-antialias", ".pulsar.antialias", XrmoptionNoArg, "true" },
+ {"+antialias", ".pulsar.antialias", XrmoptionNoArg, "false" },
+ {"-texture", ".pulsar.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".pulsar.texture", XrmoptionNoArg, "false" },
+ {"-texture_quality", ".pulsar.textureQuality", XrmoptionNoArg, "true" },
+ {"+texture_quality", ".pulsar.textureQuality", XrmoptionNoArg, "false" },
+ {"-mipmap", ".pulsar.mipmap", XrmoptionNoArg, "true" },
+ {"+mipmap", ".pulsar.mipmap", XrmoptionNoArg, "false" },
+ {"-do_depth", ".pulsar.doDepth", XrmoptionNoArg, "true" },
+ {"+do_depth", ".pulsar.doDepth", XrmoptionNoArg, "false" },
+ {"-image", ".pulsar.image", XrmoptionSepArg, 0 },
+};
+
+
+static argtype vars[] = {
+ {&num_quads, "quads", "Quads", DEF_QUADS, t_Int},
+ {&do_light, "light", "Light", DEF_LIGHT, t_Bool},
+ {&do_wire, "wire", "Wire", DEF_WIRE, t_Bool},
+ {&do_blend, "blend", "Blend", DEF_BLEND, t_Bool},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&do_antialias, "antialias", "Antialias", DEF_ANTIALIAS, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_texture_quality, "textureQuality", "TextureQuality", DEF_TEXTURE_QUALITY, t_Bool},
+ {&do_mipmap, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ {&do_depth, "doDepth", "DoDepth", DEF_DO_DEPTH, t_Bool},
+ {&which_image, "image", "Image", DEF_IMAGE, t_String},
+};
+
+
+static OptionStruct desc[] =
+{
+ {"-quads num", "how many quads to draw"},
+ {"-/+ light", "whether to do enable lighting (slower)"},
+ {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+ {"-/+ blend", "whether to do enable blending (slower)"},
+ {"-/+ fog", "whether to do enable fog (?)"},
+ {"-/+ antialias", "whether to do enable antialiased lines (slower)"},
+ {"-/+ texture", "whether to do enable texturing (much slower)"},
+ {"-/+ texture_quality", "whether to do enable linear/mipmap filtering (much much slower)"},
+ {"-/+ mipmap", "whether to do enable mipmaps (much slower)"},
+ {"-/+ depth", "whether to do enable depth buffer checking (slower)"},
+ {"-image <filename>", "texture image to load"},
+};
+
+ENTRYPOINT ModeSpecOpt pulsar_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct pulsar_description =
+{"pulsar", "init_pulsar", "draw_pulsar", NULL,
+ "draw_pulsar", "init_pulsar", "free_pulsar", &pulsar_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL pulsar", 0, NULL};
+#endif
+
+struct quad
+{
+ GLfloat tx, ty, tz;
+ GLfloat rx, ry, rz;
+
+ GLfloat dtx, dty, dtz;
+ GLfloat drx, dry, drz;
+
+};
+
+
+/* structure for holding the pulsar data */
+typedef struct {
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ XColor fg, bg;
+
+ GLint quad_list;
+ float scale_x, scale_y, scale_z;
+ int frame;
+
+ struct quad *quads;
+
+} pulsarstruct;
+
+static pulsarstruct *Pulsar = NULL;
+
+static GLubyte *
+Generate_Image(int *width, int *height, int *format)
+{
+ GLubyte *result;
+ int i, j, c;
+ int counter=0;
+
+ *width = checkImageWidth;
+ *height = checkImageHeight;
+ result = (GLubyte *)malloc(4 * (*width) * (*height));
+
+ counter = 0;
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = (((((i&0x8)==0))^(((j&0x8))==0)))*255;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) 255;
+ }
+ }
+
+ *format = GL_RGBA;
+ return result;
+}
+
+
+/* Create a texture in OpenGL. First an image is loaded
+ and stored in a raster buffer, then it's */
+static void Create_Texture(ModeInfo *mi, const char *filename)
+{
+ int height, width;
+ GLubyte *image;
+ int format;
+
+ if ( !strncmp(filename, "BUILTIN", 7))
+ {
+ BUILTIN:
+ image = Generate_Image(&width, &height, &format);
+ }
+ else
+ {
+ XImage *ximage = file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ filename);
+ if (! ximage)
+ goto BUILTIN;
+ image = (GLubyte *) ximage->data;
+ width = ximage->width;
+ height = ximage->height;
+ format = GL_RGBA;
+ }
+
+ /* GL_MODULATE or GL_DECAL depending on what you want */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* perhaps we can edge a bit more speed at the expense of quality */
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+
+ if (do_texture_quality) {
+ /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ }
+ else {
+ /* default is to do it quick and dirty */
+ /* if you have mipmaps turned on, but not texture quality, nothing will happen! */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
+
+ /* mipmaps make the image look much nicer */
+ if (do_mipmap)
+ {
+ int status;
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, format,
+ GL_UNSIGNED_BYTE, image);
+ if (status)
+ {
+ const char *s = (char *) gluErrorString (status);
+ fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
+ progname, width, height,
+ (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+ }
+ else
+ {
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0,
+ format, GL_UNSIGNED_BYTE, image);
+ check_gl_error("texture");
+ }
+}
+
+static void resetProjection(void)
+{
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1, 1, -1, 1, 1, 100);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+static void GenerateQuad(pulsarstruct *gp)
+{
+ int i;
+
+ gp->quad_list = glGenLists(1);
+ glNewList(gp->quad_list,GL_COMPILE);
+#if 1
+ glBegin(GL_QUADS);
+ glColor4f(1,0,0,.4); glNormal3f(0,0,1); glTexCoord2f(0,0); glVertex2f(-1, -1);
+ glColor4f(0,1,0,.4); glNormal3f(0,0,1); glTexCoord2f(0,1); glVertex2f(-1, 1);
+ glColor4f(0,0,1,.4); glNormal3f(0,0,1); glTexCoord2f(1,1); glVertex2f( 1, 1);
+ glColor4f(1,1,1,1); glNormal3f(0,0,1); glTexCoord2f(1,0); glVertex2f( 1, -1);
+#else
+ glBegin(GL_TRIANGLE_STRIP);
+ glColor4f(0,1,0,.4); glNormal3f(0,0,1); glTexCoord2f(0,1); glVertex2f(-1, 1);
+ glColor4f(1,0,0,.4); glNormal3f(0,0,1); glTexCoord2f(0,0); glVertex2f(-1, -1);
+ glColor4f(0,0,1,.4); glNormal3f(0,0,1); glTexCoord2f(1,1); glVertex2f( 1, 1);
+ glColor4f(1,1,1,.4); glNormal3f(0,0,1); glTexCoord2f(1,0); glVertex2f( 1, -1);
+#endif
+ glEnd();
+ glEndList();
+
+ gp->quads = (struct quad *) malloc(sizeof(struct quad) * num_quads);
+ for (i=0; i < num_quads; i++)
+ {
+ gp->quads[i].rx = 0.;
+ gp->quads[i].ry = 0.;
+ gp->quads[i].rz = 0.;
+ gp->quads[i].tx = 0.;
+ gp->quads[i].ty = 0.;
+ gp->quads[i].tz = -10;
+
+ gp->quads[i].drx = frand(5.0);
+ gp->quads[i].dry = frand(5.0);
+ gp->quads[i].drz = 0;
+ }
+}
+
+static void initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
+{
+ pulsarstruct *gp = &Pulsar[MI_SCREEN(mi)];
+ GLfloat fogColor[4] = { 0.1, 0.1, 0.1, 0.1 };
+
+ glViewport( 0, 0, width, height );
+ resetProjection();
+
+ if (do_depth)
+ glEnable(GL_DEPTH_TEST);
+
+ if (do_antialias) {
+ do_blend = 1;
+ glEnable(GL_LINE_SMOOTH);
+ }
+
+ if (do_blend) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+
+ if (do_light) {
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_COLOR_MATERIAL);
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+ }
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ do_wire = 0;
+# endif
+
+ if (do_wire)
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ if (do_fog) {
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glFogf(GL_FOG_DENSITY, 0.35);
+/* glHint(GL_FOG_HINT, GL_FASTEST); */
+ glFogf(GL_FOG_START, 50.0);
+ glFogf(GL_FOG_END, 100.0);
+ }
+
+
+ if (do_texture)
+ Create_Texture(mi, which_image);
+
+ GenerateQuad(gp);
+}
+
+static void drawQuads(pulsarstruct *gp)
+{
+ int i;
+ for (i=0; i < num_quads; i++)
+ {
+ glPushMatrix();
+ glTranslatef(gp->quads[i].tx,0,0);
+ glTranslatef(0,gp->quads[i].ty,0);
+ glTranslatef(0,0,gp->quads[i].tz);
+ glRotatef(gp->quads[i].rx, 1,0,0);
+ glRotatef(gp->quads[i].ry, 0,1,0);
+ glRotatef(gp->quads[i].rz, 0,0,1);
+ glCallList(gp->quad_list);
+ glPopMatrix();
+
+ gp->quads[i].rx += gp->quads[i].drx;
+ gp->quads[i].ry += gp->quads[i].dry;
+ gp->quads[i].rz += gp->quads[i].drz;
+
+ }
+}
+
+static GLvoid drawScene(ModeInfo * mi)
+{
+ pulsarstruct *gp = &Pulsar[MI_SCREEN(mi)];
+/* check_gl_error ("drawScene"); */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* we have to do this here because the FPS meter turns these 3 features off!! */
+ {
+ if (do_light) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ }
+
+ if (do_texture) {
+ glEnable(GL_TEXTURE_2D);
+ }
+
+ if (do_blend) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+
+ resetProjection();
+
+ /* use XYZ scaling factors to change the size of the pulsar */
+ glScalef(gp->scale_x, gp->scale_y, gp->scale_z);
+ drawQuads(gp);
+ mi->polygon_count = num_quads;
+
+ /* update the scaling factors- cyclic */
+ gp->scale_x = cos(gp->frame/360.)*10.;
+ gp->scale_y = sin(gp->frame/360.)*10.;
+ gp->scale_z = 1;
+
+ /* increment frame-counter */
+ gp->frame++;
+
+/* check_gl_error ("drawScene"); */
+}
+
+
+ENTRYPOINT void draw_pulsar(ModeInfo * mi)
+{
+ pulsarstruct *gp = &Pulsar[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!gp->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+ drawScene(mi);
+ if (mi->fps_p) do_fps (mi);
+ glXSwapBuffers(display, window);
+}
+
+/* Standard reshape function */
+ENTRYPOINT void
+reshape_pulsar(ModeInfo *mi, int width, int height)
+{
+ glViewport( 0, 0, MI_WIDTH(mi), MI_HEIGHT(mi) );
+ resetProjection();
+}
+
+ENTRYPOINT void
+init_pulsar(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+
+ pulsarstruct *gp;
+
+ MI_INIT (mi, Pulsar);
+ gp = &Pulsar[screen];
+
+ gp->window = MI_WINDOW(mi);
+
+ gp->scale_x = gp->scale_y = gp->scale_z = 1;
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_pulsar(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+
+/* all sorts of nice cleanup code should go here! */
+ENTRYPOINT void free_pulsar(ModeInfo * mi)
+{
+ pulsarstruct *gp = &Pulsar[MI_SCREEN(mi)];
+ free(gp->quads);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Pulsar", pulsar)
diff --git a/hacks/glx/pulsar.man b/hacks/glx/pulsar.man
new file mode 100644
index 0000000..f3b1009
--- /dev/null
+++ b/hacks/glx/pulsar.man
@@ -0,0 +1,102 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+pulsar - intersecting planes, alpha blending, fog, and textures.
+.SH SYNOPSIS
+.B pulsar
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-light]
+[\-wire]
+[\-delay \fInumber\fP]
+[\-quads \fInumber\fP]
+[\-image \fIfile\fP]
+[\-light]
+[\-fog]
+[\-texture]
+[\-mipmap]
+[\-no-blend]
+[\-antialias]
+[\-texture_quality]
+[\-do_depth]
+[\-fps]
+.SH DESCRIPTION
+Draws some intersecting planes, making use of alpha blending, fog,
+textures, and mipmaps, plus a ``frames per second'' meter so that you can
+tell how fast your graphics card is... Requires OpenGL.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-light | \-no-light
+Use Flat Coloring.
+.TP 8
+.B \-wire
+Render in wireframe instead of solid.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-image \fIfile\fP
+The texture map to use.
+.TP 8
+.B \-quads \fInumber\fP
+Quad Count. 1 - 50. Default: 5.
+.TP 8
+.B \-light | \-no-light
+Whether to enable lighting.
+.TP 8
+.B \-fog | \-no-fog
+Whether to enable fog.
+.TP 8
+.B \-texture | \-no-texture
+Whether to enable texturing.
+.TP 8
+.B \-mipmap | \-no-mipmap
+Whether to enable texture mipmaps.
+.TP 8
+.B \-blend | \-no-blend
+Whether to enable blending.
+.TP 8
+.B \-antialias | \-no-antialias
+Whether to anti-alias lines.
+.TP 8
+.B \-texture_quality | \-no-texture_quality
+Whether to enable texture filtering.
+.TP 8
+.B \-do_depth | \-no-do_depth
+Whether to enable depth buffer.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by David Konerding. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David Konerding.
diff --git a/hacks/glx/quasicrystal.c b/hacks/glx/quasicrystal.c
new file mode 100644
index 0000000..b82f470
--- /dev/null
+++ b/hacks/glx/quasicrystal.c
@@ -0,0 +1,478 @@
+/* quasicrystal, Copyright (c) 2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Overlapping sine waves create interesting plane-tiling interference
+ * patterns. Created by jwz, Jul 2013. Inspired by
+ * http://mainisusuallyafunction.blogspot.com/2011/10/quasicrystals-as-sums-of-waves-in-plane.html
+ */
+
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*spin: True \n" \
+ "*wander: True \n" \
+ "*symmetric: True \n" \
+ "*count: 17 \n" \
+ "*contrast: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_quasicrystal 0
+# define release_quasicrystal 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPEED "1.0"
+
+typedef struct {
+ rotator *rot, *rot2;
+ GLuint texid;
+} plane;
+
+typedef struct {
+ GLXContext *glx_context;
+ Bool button_down_p;
+ Bool symmetric_p;
+ GLfloat contrast;
+ int count;
+ int ncolors, ccolor;
+ XColor *colors;
+ plane *planes;
+ int mousex, mousey;
+
+} quasicrystal_configuration;
+
+static quasicrystal_configuration *bps = NULL;
+
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-symmetry", ".symmetric", XrmoptionNoArg, "True" },
+ { "-symmetric", ".symmetric", XrmoptionNoArg, "True" },
+ { "-no-symmetry", ".symmetric", XrmoptionNoArg, "False" },
+ { "-nonsymmetric", ".symmetric", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-contrast", ".contrast", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt quasicrystal_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_quasicrystal (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho (0, 1, 1, 0, -1, 1);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef (0.5, 0.5, 0);
+ glScalef (h, 1, 1);
+ if (width > height)
+ glScalef (1/h, 1/h, 1);
+ glTranslatef (-0.5, -0.5, 0);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+quasicrystal_handle_event (ModeInfo *mi, XEvent *event)
+{
+ quasicrystal_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ bp->button_down_p = True;
+ bp->mousex = event->xbutton.x;
+ bp->mousey = event->xbutton.y;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ bp->button_down_p = False;
+ return True;
+ }
+ else if (event->xany.type == ButtonPress && /* wheel up or right */
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button7))
+ {
+ UP:
+ if (bp->contrast <= 0) return False;
+ bp->contrast--;
+ return True;
+ }
+ else if (event->xany.type == ButtonPress && /* wheel down or left */
+ (event->xbutton.button == Button5 ||
+ event->xbutton.button == Button6))
+ {
+ DOWN:
+ if (bp->contrast >= 100) return False;
+ bp->contrast++;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ bp->button_down_p)
+ {
+ /* Dragging up and down tweaks contrast */
+
+ int dx = event->xmotion.x - bp->mousex;
+ int dy = event->xmotion.y - bp->mousey;
+
+ if (abs(dy) > abs(dx))
+ {
+ bp->contrast += dy / 40.0;
+ if (bp->contrast < 0) bp->contrast = 0;
+ if (bp->contrast > 100) bp->contrast = 100;
+ }
+
+ bp->mousex = event->xmotion.x;
+ bp->mousey = event->xmotion.y;
+ return True;
+ }
+ else
+ {
+ if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '<' || c == ',' || c == '-' || c == '_' ||
+ keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
+ goto UP;
+ else if (c == '>' || c == '.' || c == '=' || c == '+' ||
+ keysym == XK_Right || keysym == XK_Down ||
+ keysym == XK_Next)
+ goto DOWN;
+ }
+
+ return screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event);
+ }
+
+ return False;
+}
+
+
+
+ENTRYPOINT void
+init_quasicrystal (ModeInfo *mi)
+{
+ quasicrystal_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ unsigned char *tex_data = 0;
+ int tex_width;
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_quasicrystal (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glDisable (GL_DEPTH_TEST);
+ glEnable (GL_CULL_FACE);
+
+ bp->count = MI_COUNT(mi);
+ if (bp->count < 1) bp->count = 1;
+
+ if (! wire)
+ {
+ unsigned char *o;
+
+ tex_width = 4096;
+ glGetIntegerv (GL_MAX_TEXTURE_SIZE, &tex_width);
+ if (tex_width > 4096) tex_width = 4096;
+
+ tex_data = (unsigned char *) calloc (4, tex_width);
+ o = tex_data;
+ for (i = 0; i < tex_width; i++)
+ {
+ unsigned char y = 255 * (1 + sin (i * M_PI * 2 / tex_width)) / 2;
+ *o++ = y;
+ *o++ = y;
+ *o++ = y;
+ *o++ = 255;
+ }
+ }
+
+ bp->symmetric_p =
+ get_boolean_resource (MI_DISPLAY (mi), "symmetric", "Symmetric");
+
+ bp->contrast = get_float_resource (MI_DISPLAY (mi), "contrast", "Contrast");
+ if (bp->contrast < 0 || bp->contrast > 100)
+ {
+ fprintf (stderr, "%s: contrast must be between 0 and 100%%.\n", progname);
+ bp->contrast = 0;
+ }
+
+ {
+ Bool spinp = get_boolean_resource (MI_DISPLAY (mi), "spin", "Spin");
+ Bool wanderp = get_boolean_resource (MI_DISPLAY (mi), "wander", "Wander");
+ double spin_speed = 0.01;
+ double wander_speed = 0.0001;
+ double spin_accel = 10.0;
+ double scale_speed = 0.005;
+
+ bp->planes = (plane *) calloc (sizeof (*bp->planes), bp->count);
+
+ bp->ncolors = 256; /* ncolors affects color-cycling speed */
+ bp->colors = (XColor *) calloc (bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0, bp->colors, &bp->ncolors,
+ False, 0, False);
+ bp->ccolor = 0;
+
+ for (i = 0; i < bp->count; i++)
+ {
+ plane *p = &bp->planes[i];
+ p->rot = make_rotator (0, 0,
+ spinp ? spin_speed : 0,
+ spin_accel,
+ wanderp ? wander_speed : 0,
+ True);
+ p->rot2 = make_rotator (0, 0,
+ 0, 0,
+ scale_speed,
+ True);
+ if (! wire)
+ {
+ clear_gl_error();
+
+ glGenTextures (1, &p->texid);
+ glBindTexture (GL_TEXTURE_1D, p->texid);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glTexImage1D (GL_TEXTURE_1D, 0, GL_RGBA,
+ tex_width, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tex_data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ }
+ }
+ }
+
+ if (tex_data) free (tex_data);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+draw_quasicrystal (ModeInfo *mi)
+{
+ quasicrystal_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+ double r=0, ps=0;
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glShadeModel(GL_FLAT);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glDisable (GL_LIGHTING);
+ if (!wire)
+ {
+ glEnable (GL_TEXTURE_1D);
+# ifdef HAVE_JWZGLES
+ glEnable (GL_TEXTURE_2D); /* jwzgles needs this, bleh. */
+# endif
+ }
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glPushMatrix ();
+ glTranslatef (0.5, 0.5, 0);
+ glScalef (3, 3, 3);
+
+ if (wire) glScalef (0.2, 0.2, 0.2);
+
+ for (i = 0; i < bp->count; i++)
+ {
+ plane *p = &bp->planes[i];
+ double x, y, z;
+ double scale = (wire ? 10 : 700.0 / bp->count);
+ double pscale;
+
+ glPushMatrix();
+
+ get_position (p->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 0.3333,
+ (y - 0.5) * 0.3333,
+ 0);
+
+ /* With -symmetry, keep the planes' scales in sync.
+ Otherwise, they scale independently.
+ */
+ if (bp->symmetric_p && i > 0)
+ pscale = ps;
+ else
+ {
+ get_position (p->rot2, &x, &y, &z, !bp->button_down_p);
+ pscale = 1 + (4 * z);
+ ps = pscale;
+ }
+
+ scale *= pscale;
+
+
+ /* With -symmetry, evenly distribute the planes' rotation.
+ Otherwise, they rotate independently.
+ */
+ if (bp->symmetric_p && i > 0)
+ z = r + (i * M_PI * 2 / bp->count);
+ else
+ {
+ get_rotation (p->rot, &x, &y, &z, !bp->button_down_p);
+ r = z;
+ }
+
+
+ glRotatef (z * 360, 0, 0, 1);
+ glTranslatef (-0.5, -0.5, 0);
+
+ glColor4f (1, 1, 1, (wire ? 0.5 : 1.0 / bp->count));
+
+ if (!wire)
+ glBindTexture (GL_TEXTURE_1D, p->texid);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f (0, 0, 1);
+ glTexCoord2f (-scale/2, scale/2); glVertex3f (0, 1, 0);
+ glTexCoord2f ( scale/2, scale/2); glVertex3f (1, 1, 0);
+ glTexCoord2f ( scale/2, -scale/2); glVertex3f (1, 0, 0);
+ glTexCoord2f (-scale/2, -scale/2); glVertex3f (0, 0, 0);
+ glEnd();
+
+ if (wire)
+ {
+ float j;
+ glDisable (GL_TEXTURE_1D);
+ glColor4f (1, 1, 1, 1.0 / bp->count);
+ for (j = 0; j < 1; j += (1 / scale))
+ {
+ glBegin (GL_LINES);
+ glVertex3f (j, 0, 0);
+ glVertex3f (j, 1, 0);
+ mi->polygon_count++;
+ glEnd();
+ }
+ }
+
+ glPopMatrix();
+
+ mi->polygon_count++;
+ }
+
+ /* Colorize the grayscale image. */
+ {
+ GLfloat c[4];
+ c[0] = bp->colors[bp->ccolor].red / 65536.0;
+ c[1] = bp->colors[bp->ccolor].green / 65536.0;
+ c[2] = bp->colors[bp->ccolor].blue / 65536.0;
+ c[3] = 1;
+
+ /* Brighten the colors. */
+ c[0] = (0.6666 + c[0]/3);
+ c[1] = (0.6666 + c[1]/3);
+ c[2] = (0.6666 + c[2]/3);
+
+ glBlendFunc (GL_DST_COLOR, GL_SRC_COLOR);
+ glDisable (GL_TEXTURE_1D);
+ glColor4fv (c);
+ glTranslatef (-0.5, -0.5, 0);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (0, 0, 0);
+ glEnd();
+ mi->polygon_count++;
+ }
+
+ /* Clip the colors to simulate contrast. */
+
+ if (bp->contrast > 0)
+ {
+ /* If c > 0, map 0 - 100 to 0.5 - 1.0, and use (s & ~d) */
+ GLfloat c = 1 - (bp->contrast / 2 / 100.0);
+ glDisable (GL_TEXTURE_1D);
+ glDisable (GL_BLEND);
+ glEnable (GL_COLOR_LOGIC_OP);
+ glLogicOp (GL_AND_REVERSE);
+ glColor4f (c, c, c, 1);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (0, 0, 0);
+ glEnd();
+ mi->polygon_count++;
+ glDisable (GL_COLOR_LOGIC_OP);
+ }
+
+ /* Rotate colors. */
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors)
+ bp->ccolor = 0;
+
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("QuasiCrystal", quasicrystal)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/quasicrystal.man b/hacks/glx/quasicrystal.man
new file mode 100644
index 0000000..804d3a3
--- /dev/null
+++ b/hacks/glx/quasicrystal.man
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+quasicrystal - aperiodic plane tilings.
+.SH SYNOPSIS
+.B quasicrystal
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-contrast \fIpercent\fP]
+[\-no-wander]
+[\-no-spin]
+[\-asymmetric]
+[\-fps]
+.SH DESCRIPTION
+A quasicrystal is a structure that is ordered but aperiodic.
+Two-dimensional quasicrystals can be generated by adding a set of planes
+where x is the sine of y. Different complex aperiodic plane tilings are
+produced depending on the period, position, and rotation of the component
+planes, and whether the rotation of the planes is evenly distributed around
+the circle (the "symmetric" option, above) or random. See also the
+"RD-Bomb", "CWaves" and "Penrose" screen savers.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2 for twice as fast, 0.5 for half as fast.
+.TP 8
+.B \-contrast \fIcontrast\fP
+Contrast. Sort of. Default 30%.
+.TP 8
+.B \-count \fInumber\fP
+How many planes to use. Default 17.
+.TP 8
+.B \-wander | \-no-wander
+Whether the planes should displace horizontally and vertically.
+.TP 8
+.B \-spin | \-no-spin
+Whether the planes should rotate.
+.TP 8
+.B \-asymmetric
+Allow each plane to rotate freely instead of being constrained to an
+even distribution around the circle.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/queens.c b/hacks/glx/queens.c
new file mode 100644
index 0000000..bc9b202
--- /dev/null
+++ b/hacks/glx/queens.c
@@ -0,0 +1,610 @@
+/*
+ * queens - solves n queens problem, displays
+ * i make no claims that this is an optimal solution to the problem,
+ * good enough for xss
+ * hacked from glchess
+ *
+ * version 1.0 - May 10, 2002
+ *
+ * Copyright (C) 2002 Blair Tennessy (tennessy@cs.ubc.ca)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_queens 0
+# define release_queens 0
+# include "xlockmore.h"
+
+#else
+# include "xlock.h"
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef USE_GL
+
+#include "gltrackball.h"
+#include "chessmodels.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ {"+rotate", ".queens.rotate", XrmoptionNoArg, "false" },
+ {"-rotate", ".queens.rotate", XrmoptionNoArg, "true" },
+ {"+flat", ".queens.flat", XrmoptionNoArg, "false" },
+ {"-flat", ".queens.flat", XrmoptionNoArg, "true" },
+};
+
+static int rotate, wire, clearbits, flat;
+
+static argtype vars[] = {
+ {&rotate, "rotate", "Rotate", "True", t_Bool},
+ {&flat, "flat", "Flat", "False", t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt queens_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct queens_description =
+{"queens", "init_queens", "draw_queens", NULL,
+ "draw_queens", "init_queens", NULL, &queens_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Queens", 0, NULL};
+
+#endif
+
+#define NONE 0
+#define MINBOARD 5
+#define MAXBOARD 10
+#define COLORSETS 5
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLfloat position[4];
+ int queen_list;
+
+ int board[MAXBOARD][MAXBOARD];
+ int steps, colorset, BOARDSIZE;
+ double theta;
+ int queen_polys;
+
+} Queenscreen;
+
+static Queenscreen *qss = NULL;
+
+/* definition of white/black colors */
+static const GLfloat colors[COLORSETS][2][3] =
+ {
+ {{0.43, 0.54, 0.76}, {0.8, 0.8, 0.8}},
+ {{0.5, 0.7, 0.9}, {0.2, 0.3, 0.6}},
+ {{0.53725490196, 0.360784313725, 0.521568627451}, {0.6, 0.6, 0.6}},
+ {{0.15, 0.77, 0.54}, {0.5, 0.5, 0.5}},
+ {{0.9, 0.45, 0.0}, {0.5, 0.5, 0.5}},
+ };
+
+ENTRYPOINT Bool
+queens_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Queenscreen *qs = &qss[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, qs->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &qs->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ qs->steps = 1024 - 1;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+/* returns true if placing a queen on column c causes a conflict */
+static int conflictsCols(Queenscreen *qs, int c)
+{
+ int i;
+
+ for(i = 0; i < qs->BOARDSIZE; ++i)
+ if(qs->board[i][c])
+ return 1;
+
+ return 0;
+}
+
+/* returns true if placing a queen on (r,c) causes a diagonal conflict */
+static int conflictsDiag(Queenscreen *qs, int r, int c)
+{
+ int i;
+
+ /* positive slope */
+ int n = r < c ? r : c;
+ for(i = 0; i < qs->BOARDSIZE-abs(r-c); ++i)
+ if(qs->board[r-n+i][c-n+i])
+ return 1;
+
+ /* negative slope */
+ n = r < qs->BOARDSIZE - (c+1) ? r : qs->BOARDSIZE - (c+1);
+ for(i = 0; i < qs->BOARDSIZE-abs(qs->BOARDSIZE - (1+r+c)); ++i)
+ if(qs->board[r-n+i][c+n-i])
+ return 1;
+
+ return 0;
+}
+
+/* returns true if placing a queen at (r,c) causes a conflict */
+static int conflicts(Queenscreen *qs, int r, int c)
+{
+ return !conflictsCols(qs, c) ? conflictsDiag(qs, r, c) : 1;
+}
+
+/* clear board */
+static void blank(Queenscreen *qs)
+{
+ int i, j;
+
+ for(i = 0; i < MAXBOARD; ++i)
+ for(j = 0; j < MAXBOARD; ++j)
+ qs->board[i][j] = NONE;
+}
+
+/* recursively determine solution */
+static int findSolution(Queenscreen *qs, int row, int col)
+{
+ if(row == qs->BOARDSIZE)
+ return 1;
+
+ while(col < qs->BOARDSIZE) {
+ if(!conflicts(qs, row, col)) {
+ qs->board[row][col] = 1;
+
+ if(findSolution(qs, row+1, 0))
+ return 1;
+
+ qs->board[row][col] = 0;
+ }
+
+ ++col;
+ }
+
+ return 0;
+}
+
+/** driver for finding solution */
+static void go(Queenscreen *qs) { while(!findSolution(qs, 0, random()%qs->BOARDSIZE)); }
+
+/* lighting variables */
+static const GLfloat front_shininess[] = {60.0};
+static const GLfloat front_specular[] = {0.4, 0.4, 0.4, 1.0};
+static const GLfloat ambient[] = {0.3, 0.3, 0.3, 1.0};
+static const GLfloat diffuse[] = {0.8, 0.8, 0.8, 1.0};
+
+/* configure lighting */
+static void setup_lights(Queenscreen *qs)
+{
+
+ /* setup twoside lighting */
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, qs->position);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ /* setup material properties */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+}
+
+#define checkImageWidth 8
+#define checkImageHeight 8
+/*static GLubyte checkImage[checkImageWidth][checkImageHeight][3];*/
+
+/* return alpha value for fading */
+static GLfloat findAlpha(Queenscreen *qs)
+{
+ return qs->steps < 128 ? qs->steps/128.0 : qs->steps < 1024-128 ?1.0:(1024-qs->steps)/128.0;
+}
+
+/* draw pieces */
+static int drawPieces(Queenscreen *qs)
+{
+ int i, j;
+ int polys = 0;
+
+ for(i = 0; i < qs->BOARDSIZE; ++i) {
+ for(j = 0; j < qs->BOARDSIZE; ++j) {
+ if(qs->board[i][j]) {
+ glColor3fv(colors[qs->colorset][i%2]);
+ glCallList(qs->queen_list);
+ polys += qs->queen_polys;
+ }
+
+ glTranslatef(1.0, 0.0, 0.0);
+ }
+
+ glTranslatef(-1.0*qs->BOARDSIZE, 0.0, 1.0);
+ }
+ return polys;
+}
+
+/** reflectionboard */
+static int draw_reflections(Queenscreen *qs)
+{
+ int i, j;
+ int polys = 0;
+
+ glEnable(GL_STENCIL_TEST);
+ glStencilFunc(GL_ALWAYS, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ glColorMask(0,0,0,0);
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_DEPTH_TEST);
+ glBegin(GL_QUADS);
+
+ /* only draw white squares */
+ for(i = 0; i < qs->BOARDSIZE; ++i) {
+ for(j = (qs->BOARDSIZE+i) % 2; j < qs->BOARDSIZE; j += 2) {
+ glVertex3f(i, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j);
+ glVertex3f(i, 0.0, j);
+ polys++;
+ }
+ }
+ glEnd();
+ glEnable(GL_DEPTH_TEST);
+
+ glColorMask(1, 1, 1, 1);
+ glStencilFunc(GL_EQUAL, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+
+ glPushMatrix();
+ glScalef(1.0, -1.0, 1.0);
+ glTranslatef(0.5, 0.001, 0.5);
+ glLightfv(GL_LIGHT0, GL_POSITION, qs->position);
+ polys += drawPieces(qs);
+ glPopMatrix();
+ glDisable(GL_STENCIL_TEST);
+
+ /* replace lights */
+ glLightfv(GL_LIGHT0, GL_POSITION, qs->position);
+
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glColorMask(1,1,1,1);
+ return polys;
+}
+
+/* draw board */
+static int drawBoard(Queenscreen *qs)
+{
+ int i, j;
+ int polys = 0;
+
+ glBegin(GL_QUADS);
+
+ for(i = 0; i < qs->BOARDSIZE; ++i)
+ for(j = 0; j < qs->BOARDSIZE; ++j) {
+ int par = (i-j+qs->BOARDSIZE)%2;
+ glColor4f(colors[qs->colorset][par][0],
+ colors[qs->colorset][par][1],
+ colors[qs->colorset][par][2],
+ 0.70);
+ glNormal3f(0.0, 1.0, 0.0);
+ glVertex3f(i, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j);
+ glVertex3f(i, 0.0, j);
+ polys++;
+ }
+
+ glEnd();
+
+ {
+ GLfloat off = 0.01;
+ GLfloat w = qs->BOARDSIZE;
+ GLfloat h = 0.1;
+
+ /* Give the board a slight lip. */
+ /* #### oops, normals are wrong here, but you can't tell */
+
+ glColor3f(0.3, 0.3, 0.3);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, -h, w);
+ glVertex3f (0, 0, w);
+
+ glVertex3f (0, 0, w);
+ glVertex3f (0, -h, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, 0, w);
+
+ glVertex3f (w, 0, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, 0, 0);
+
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, 0, 0);
+
+ glVertex3f (0, -h, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, -h, w);
+ glVertex3f (0, -h, w);
+ glEnd();
+ polys += 4;
+
+ /* Fill in the underside of the board with an invisible black box
+ to hide the reflections that are not on tiles. Probably there's
+ a way to do this with stencils instead.
+ */
+ w -= off*2;
+ h = 5;
+
+ glPushMatrix();
+ glTranslatef (off, 0, off);
+ glDisable(GL_LIGHTING);
+ glColor3f(0,0,0);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, -h, w);
+ glVertex3f (0, 0, w);
+
+ glVertex3f (0, 0, w);
+ glVertex3f (0, -h, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, 0, w);
+
+ glVertex3f (w, 0, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, 0, 0);
+
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, 0, 0);
+
+ glVertex3f (0, -h, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, -h, w);
+ glVertex3f (0, -h, w);
+ glEnd();
+ polys += 4;
+ glPopMatrix();
+ if (!wire)
+ glEnable(GL_LIGHTING);
+ }
+
+ return polys;
+}
+
+static int display(ModeInfo *mi, Queenscreen *qs)
+{
+ int max = 1024;
+ int polys = 0;
+ glClear(clearbits);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /* setup light attenuation */
+ /* #### apparently this does nothing */
+ glEnable(GL_COLOR_MATERIAL);
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.8/(0.01+findAlpha(qs)));
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.06);
+
+ /** setup perspective */
+ glTranslatef(0.0, 0.0, -1.5*qs->BOARDSIZE);
+ glRotatef(30.0, 1.0, 0.0, 0.0);
+ gltrackball_rotate (qs->trackball);
+ glRotatef(qs->theta*100, 0.0, 1.0, 0.0);
+ glTranslatef(-0.5*qs->BOARDSIZE, 0.0, -0.5*qs->BOARDSIZE);
+
+ /* find light positions */
+ qs->position[0] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*-sin(qs->theta*100*M_PI/180.0);
+ qs->position[2] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*cos(qs->theta*100*M_PI/180.0);
+ qs->position[1] = 6.0;
+
+ if(!wire) {
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, qs->position);
+ glEnable(GL_LIGHT0);
+ }
+
+ /* Since the lighting attenuation trick up there doesn't seem to be working,
+ let's drop the old board down and drop the new board in. */
+ if (qs->steps < (max/8.0)) {
+ GLfloat y = qs->steps / (max/8.0);
+ y = sin (M_PI/2 * y);
+ glTranslatef (0, 10 - (y * 10), 0);
+ } else if (qs->steps > max-(max/8.0)) {
+ GLfloat y = (qs->steps - (max-(max/8.0))) / (GLfloat) (max/8.0);
+ y = 1 - sin (M_PI/2 * (1-y));
+ glTranslatef (0, -y * 15, 0);
+ }
+
+ /* draw reflections */
+ if(!wire) {
+ polys += draw_reflections(qs);
+ glEnable(GL_BLEND);
+ }
+ polys += drawBoard(qs);
+ if(!wire)
+ glDisable(GL_BLEND);
+
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1);
+
+ glTranslatef(0.5, 0.0, 0.5);
+ polys += drawPieces(qs);
+
+ /* rotate camera */
+ if(!qs->button_down_p)
+ qs->theta += .002;
+
+ /* zero out board, find new solution of size MINBOARD <= i <= MAXBOARD */
+ if(++qs->steps == max) {
+ qs->steps = 0;
+ blank(qs);
+ qs->BOARDSIZE = MINBOARD + (random() % (MAXBOARD - MINBOARD + 1));
+ qs->colorset = (qs->colorset+1)%COLORSETS;
+ go(qs);
+ }
+ return polys;
+}
+
+#define EPSILON 0.001
+
+#if 0
+/** draws cylindermodel */
+static int draw_model(int chunks, const GLfloat model[][3], int r)
+{
+ int i = 0;
+ int polys = 0;
+ glPushMatrix();
+ glRotatef(-90.0, 1.0, 0.0, 0.0);
+
+ for(i = 0; i < chunks; ++i) {
+ if(model[i][0] > EPSILON || model[i][1] > EPSILON) {
+ polys += tube (0, 0, 0,
+ 0, 0, model[i][1],
+ model[i][0], 0,
+ r, False, False, False);
+/* gluCylinder(quadric, model[i][0], model[i][1], model[i][2], r, 1);
+ polys += r;*/
+ }
+ glTranslatef(0.0, 0.0, model[i][2]);
+ }
+
+ glPopMatrix();
+ return polys;
+}
+#endif
+
+ENTRYPOINT void reshape_queens(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+ glViewport(0,y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1/h, 2.0, 30.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+ENTRYPOINT void init_queens(ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ Queenscreen *qs;
+ int poly_counts[PIECES];
+ wire = MI_IS_WIREFRAME(mi);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ wire = 0;
+# endif
+
+ MI_INIT (mi, qss);
+
+ qs = &qss[screen];
+ qs->window = MI_WINDOW(mi);
+
+ if((qs->glx_context = init_GL(mi)))
+ reshape_queens(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ else
+ MI_CLEARWINDOW(mi);
+
+ qs->trackball = gltrackball_init (False);
+
+ qs->BOARDSIZE = 8; /* 8 cuz its classic */
+
+ chessmodels_gen_lists(-1, poly_counts);
+ qs->queen_list = QUEEN;
+ qs->queen_polys = poly_counts[QUEEN];
+
+ /* find a solution */
+ go(qs);
+}
+
+ENTRYPOINT void draw_queens(ModeInfo *mi)
+{
+ Queenscreen *qs = &qss[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if(!qs->glx_context)
+ return;
+
+ glXMakeCurrent(disp, w, *(qs->glx_context));
+
+ if(flat)
+ glShadeModel(GL_FLAT);
+
+ clearbits = GL_COLOR_BUFFER_BIT;
+
+ glColorMaterial(GL_FRONT, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+
+ if(!wire) {
+ setup_lights(qs);
+ glEnable(GL_DEPTH_TEST);
+ clearbits |= GL_DEPTH_BUFFER_BIT;
+ clearbits |= GL_STENCIL_BUFFER_BIT;
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ }
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ mi->polygon_count = display(mi, qs);
+ mi->recursion_depth = qs->BOARDSIZE;
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+XSCREENSAVER_MODULE ("Queens", queens)
+
+#endif
diff --git a/hacks/glx/queens.man b/hacks/glx/queens.man
new file mode 100644
index 0000000..47fc3f4
--- /dev/null
+++ b/hacks/glx/queens.man
@@ -0,0 +1,66 @@
+.TH XScreenSaver 1 "May 2002"
+.SH NAME
+queens \- n queens screensaver
+.SH SYNOPSIS
+.B queens
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIqueens\fP program solves the n-queens problem (where, in this
+program, N is between 5 and 10 queens) using a straightforward
+backtracking algorithm. The problem is: how may one place N queens
+on an NxN chessboard such that no queen can attack a sister?
+.SH OPTIONS
+.I queens
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+It's not unknown for this and other OpenGL hacks to fail under hardware accelaration (UtahGLX) and take the X server with them. Texture images must be 16x16 or 32x32 or 64x64 etc.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessb@unbc.ca>, 20-April-2002.
+
diff --git a/hacks/glx/quickhull.c b/hacks/glx/quickhull.c
new file mode 100644
index 0000000..4c46ca0
--- /dev/null
+++ b/hacks/glx/quickhull.c
@@ -0,0 +1,1368 @@
+/* quickhull, Copyright (c) 2016 Karim Naaji, karim.naaji@gmail.com
+ https://github.com/karimnaaji/3d-quickhull
+
+ LICENCE:
+ The MIT License (MIT)
+
+ Copyright (c) 2016 Karim Naaji, karim.naaji@gmail.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE
+
+ REFERENCES:
+ [1] http://box2d.org/files/GDC2014/DirkGregorius_ImplementingQuickHull.pdf
+ [2] http://www.cs.smith.edu/~orourke/books/compgeom.html
+ [3] http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml
+ [4] http://doc.cgal.org/latest/HalfedgeDS/index.html
+ [5] http://thomasdiewald.com/blog/?p=1888
+ [6] https://fgiesen.wordpress.com/2012/02/21/half-edge-based-mesh-representations-theory/
+
+ HOWTO:
+ #define QUICKHULL_DEBUG // Only if assertions need to be checked
+ #include "quickhull.h"
+
+ HISTORY:
+ - 25-Feb-2018: jwz: adapted for xscreensaver
+ - 1.0.1 (2016-11-01): Various improvements over epsilon issues and
+ degenerate faces
+ Debug functionalities to test final results dynamically
+ API to export hull meshes in OBJ files
+ - 1.0 (2016-09-10): Initial
+
+ TODO:
+ - use float* from public interface
+ - reduce memory usage
+*/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+extern const char *progname;
+
+#include "quickhull.h"
+
+#include "screenhackI.h" /* for jwxyz_abort */
+
+#include <math.h> /* sqrt & fabs */
+#include <stdio.h> /* FILE */
+#include <string.h> /* memcpy */
+
+/* Quickhull helpers, define your own if needed */
+#ifndef QUICKHULL_HELPERS
+#include <stdlib.h> /* malloc, free, realloc */
+#define QUICKHULL_HELPERS 1
+#define QH_MALLOC(T, N) ((T*) malloc(N * sizeof(T)))
+#define QH_REALLOC(T, P, N) ((T*)realloc(P, sizeof(T) * N))
+#define QH_FREE(T) free(T)
+#define QH_SWAP(T, A, B) { T tmp = B; B = A; A = tmp; }
+#ifdef QUICKHULL_DEBUG
+#define QH_ASSERT(STMT) if (!(STMT)) { *(int *)0 = 0; }
+#define QH_LOG(FMT, ...) printf(FMT, ## __VA_ARGS__)
+#else
+#define QH_ASSERT(STMT)
+#define QH_LOG(FMT, ...)
+#endif /* QUICKHULL_DEBUG */
+#endif /* QUICKHULL_HELPERS */
+
+#ifndef QH_FLT_MAX
+#define QH_FLT_MAX 1e+37F
+#endif
+
+#ifndef QH_FLT_EPS
+#define QH_FLT_EPS 1E-5F
+#endif
+
+#ifndef QH_VERTEX_SET_SIZE
+#define QH_VERTEX_SET_SIZE 128
+#endif
+
+typedef long qh_index_t;
+
+typedef struct qh_half_edge {
+ qh_index_t opposite_he; /* index of the opposite half edge */
+ qh_index_t next_he; /* index of the next half edge */
+ qh_index_t previous_he; /* index of the previous half edge */
+ qh_index_t he; /* index of the current half edge */
+ qh_index_t to_vertex; /* index of the next vertex */
+ qh_index_t adjacent_face; /* index of the ajacent face */
+} qh_half_edge_t;
+
+typedef struct qh_index_set {
+ qh_index_t* indices;
+ unsigned int size;
+ unsigned int capacity;
+} qh_index_set_t;
+
+typedef struct qh_face {
+ qh_index_set_t iset;
+ qh_vec3_t normal;
+ qh_vertex_t centroid;
+ qh_index_t edges[3];
+ qh_index_t face;
+ double sdist;
+ int visitededges;
+} qh_face_t;
+
+typedef struct qh_index_stack {
+ qh_index_t* begin;
+ unsigned int size;
+} qh_index_stack_t;
+
+typedef struct qh_context {
+ qh_face_t* faces;
+ qh_half_edge_t* edges;
+ qh_vertex_t* vertices;
+ qh_vertex_t centroid;
+ qh_index_stack_t facestack;
+ qh_index_stack_t scratch;
+ qh_index_stack_t horizonedges;
+ qh_index_stack_t newhorizonedges;
+ char* valid;
+ unsigned int nedges;
+ unsigned int nvertices;
+ unsigned int nfaces;
+
+ #ifdef QUICKHULL_DEBUG
+ unsigned int maxfaces;
+ unsigned int maxedges;
+ #endif
+} qh_context_t;
+
+static void
+qh__find_6eps(qh_vertex_t* vertices, unsigned int nvertices, qh_index_t* eps)
+{
+ qh_vertex_t* ptr = vertices;
+
+ double minxy = +QH_FLT_MAX;
+ double minxz = +QH_FLT_MAX;
+ double minyz = +QH_FLT_MAX;
+
+ double maxxy = -QH_FLT_MAX;
+ double maxxz = -QH_FLT_MAX;
+ double maxyz = -QH_FLT_MAX;
+
+ int i = 0;
+ for (i = 0; i < 6; ++i) {
+ eps[i] = 0;
+ }
+
+ for (i = 0; i < nvertices; ++i) {
+ if (ptr->z < minxy) {
+ eps[0] = i;
+ minxy = ptr->z;
+ }
+ if (ptr->y < minxz) {
+ eps[1] = i;
+ minxz = ptr->y;
+ }
+ if (ptr->x < minyz) {
+ eps[2] = i;
+ minyz = ptr->x;
+ }
+ if (ptr->z > maxxy) {
+ eps[3] = i;
+ maxxy = ptr->z;
+ }
+ if (ptr->y > maxxz) {
+ eps[4] = i;
+ maxxz = ptr->y;
+ }
+ if (ptr->x > maxyz) {
+ eps[5] = i;
+ maxyz = ptr->x;
+ }
+ ptr++;
+ }
+}
+
+static double
+qh__vertex_segment_length2(qh_vertex_t* p, qh_vertex_t* a, qh_vertex_t* b)
+{
+ double dx = b->x - a->x;
+ double dy = b->y - a->y;
+ double dz = b->z - a->z;
+
+ double d = dx * dx + dy * dy + dz * dz;
+
+ double x = a->x;
+ double y = a->y;
+ double z = a->z;
+
+ if (d != 0) {
+ double t = ((p->x - a->x) * dx +
+ (p->y - a->y) * dy +
+ (p->z - a->z) * dz) / d;
+
+ if (t > 1) {
+ x = b->x;
+ y = b->y;
+ z = b->z;
+ } else if (t > 0) {
+ x += dx * t;
+ y += dy * t;
+ z += dz * t;
+ }
+ }
+
+ dx = p->x - x;
+ dy = p->y - y;
+ dz = p->z - z;
+
+ return dx * dx + dy * dy + dz * dz;
+}
+
+static void
+qh__vec3_sub(qh_vec3_t* a, qh_vec3_t* b)
+{
+ a->x -= b->x;
+ a->y -= b->y;
+ a->z -= b->z;
+}
+
+static void
+qh__vec3_add(qh_vec3_t* a, qh_vec3_t* b)
+{
+ a->x += b->x;
+ a->y += b->y;
+ a->z += b->z;
+}
+
+static void
+qh__vec3_multiply(qh_vec3_t* a, double v)
+{
+ a->x *= v;
+ a->y *= v;
+ a->z *= v;
+}
+
+static int
+qh__vertex_equals_epsilon(qh_vertex_t* a, qh_vertex_t* b, double epsilon)
+{
+ return fabs(a->x - b->x) <= epsilon &&
+ fabs(a->y - b->y) <= epsilon &&
+ fabs(a->z - b->z) <= epsilon;
+}
+
+static double
+qh__vec3_length2(qh_vec3_t* v)
+{
+ return v->x * v->x + v->y * v->y + v->z * v->z;
+}
+
+static double
+qh__vec3_dot(qh_vec3_t* v1, qh_vec3_t* v2)
+{
+ return v1->x * v2->x + v1->y * v2->y + v1->z * v2->z;
+}
+
+static void
+qh__vec3_normalize(qh_vec3_t* v)
+{
+ qh__vec3_multiply(v, 1.f / sqrt(qh__vec3_length2(v)));
+}
+
+static void
+qh__find_2dps_6eps(qh_vertex_t* vertices, qh_index_t* eps,
+ int* ii, int* jj)
+{
+ int i, j;
+ double max = -QH_FLT_MAX;
+
+ for (i = 0; i < 6; ++i) {
+ for (j = 0; j < 6; ++j) {
+ qh_vertex_t d;
+ double d2;
+
+ if (i == j) {
+ continue;
+ }
+
+ d = vertices[eps[i]];
+ qh__vec3_sub(&d, &vertices[eps[j]]);
+ d2 = qh__vec3_length2(&d);
+
+ if (d2 > max) {
+ *ii = i;
+ *jj = j;
+ max = d2;
+ }
+ }
+ }
+}
+
+static qh_vec3_t
+qh__vec3_cross(qh_vec3_t* v1, qh_vec3_t* v2)
+{
+ qh_vec3_t cross;
+
+ cross.x = v1->y * v2->z - v1->z * v2->y;
+ cross.y = v1->z * v2->x - v1->x * v2->z;
+ cross.z = v1->x * v2->y - v1->y * v2->x;
+
+ return cross;
+}
+
+static qh_vertex_t
+qh__face_centroid(qh_index_t vertices[3], qh_context_t* context)
+{
+ qh_vertex_t centroid;
+ int i;
+
+ centroid.x = centroid.y = centroid.z = 0.0;
+ for (i = 0; i < 3; ++i) {
+ qh__vec3_add(&centroid, context->vertices + vertices[i]);
+ }
+
+ qh__vec3_multiply(&centroid, 1.0 / 3.0);
+
+ return centroid;
+}
+
+static double
+qh__dist_point_plane(qh_vertex_t* v, qh_vec3_t* normal, double sdist)
+{
+ return fabs(qh__vec3_dot(v, normal) - sdist);
+}
+
+static void
+qh__init_half_edge(qh_half_edge_t* half_edge) {
+ half_edge->adjacent_face = -1;
+ half_edge->he = -1;
+ half_edge->next_he = -1;
+ half_edge->opposite_he = -1;
+ half_edge->to_vertex = -1;
+ half_edge->previous_he = -1;
+}
+
+static qh_half_edge_t*
+qh__next_edge(qh_context_t* context)
+{
+ qh_half_edge_t* edge = context->edges + context->nedges;
+ qh__init_half_edge(edge);
+
+ edge->he = context->nedges;
+ context->nedges++;
+
+ QH_ASSERT(context->nedges < context->maxedges);
+
+ return edge;
+}
+
+static qh_face_t*
+qh__next_face(qh_context_t* context)
+{
+ qh_face_t* face = context->faces + context->nfaces;
+
+ face->face = context->nfaces;
+ face->iset.indices = NULL;
+ context->valid[context->nfaces] = 1;
+ context->nfaces++;
+
+ QH_ASSERT(context->nfaces < context->maxfaces);
+
+ return face;
+}
+
+static qh_vec3_t
+qh__edge_vec3(qh_half_edge_t* edge, qh_context_t* context)
+{
+ qh_half_edge_t prevhe = context->edges[edge->previous_he];
+ qh_vec3_t v0, v1;
+
+ v0 = context->vertices[prevhe.to_vertex];
+ v1 = context->vertices[edge->to_vertex];
+
+ qh__vec3_sub(&v1, &v0);
+ qh__vec3_normalize(&v1);
+
+ return v1;
+}
+
+static void
+qh__face_init(qh_face_t* face, qh_index_t vertices[3],
+ qh_context_t* context)
+{
+ qh_half_edge_t* e0 = qh__next_edge(context);
+ qh_half_edge_t* e1 = qh__next_edge(context);
+ qh_half_edge_t* e2 = qh__next_edge(context);
+ qh_vec3_t v0, v1;
+ qh_vertex_t centroid, normal;
+
+ e2->to_vertex = vertices[0];
+ e0->to_vertex = vertices[1];
+ e1->to_vertex = vertices[2];
+
+ e0->next_he = e1->he;
+ e2->previous_he = e1->he;
+ face->edges[1] = e1->he;
+
+ e1->next_he = e2->he;
+ e0->previous_he = e2->he;
+ face->edges[2] = e2->he;
+ v1 = qh__edge_vec3(e2, context);
+
+ e2->next_he = e0->he;
+ e1->previous_he = e0->he;
+ face->edges[0] = e0->he;
+ v0 = qh__edge_vec3(e0, context);
+
+ e2->adjacent_face = face->face;
+ e1->adjacent_face = face->face;
+ e0->adjacent_face = face->face;
+
+ qh__vec3_multiply(&v1, -1.f);
+ normal = qh__vec3_cross(&v0, &v1);
+
+ qh__vec3_normalize(&normal);
+ centroid = qh__face_centroid(vertices, context);
+ face->centroid = centroid;
+ face->sdist = qh__vec3_dot(&normal, &centroid);
+ face->normal = normal;
+ face->iset.indices = QH_MALLOC(qh_index_t, QH_VERTEX_SET_SIZE);
+ face->iset.capacity = QH_VERTEX_SET_SIZE;
+ face->iset.size = 0;
+ face->visitededges = 0;
+}
+
+static void
+qh__tetrahedron_basis(qh_context_t* context, qh_index_t vertices[3])
+{
+ qh_index_t eps[6];
+ int i, j = 0, k = 0, l = 0;
+ double max = -QH_FLT_MAX;
+
+ qh__find_6eps(context->vertices, context->nvertices, eps);
+ qh__find_2dps_6eps(context->vertices, eps, &j, &k);
+
+ for (i = 0; i < 6; ++i) {
+ double d2;
+
+ if (i == j || i == k) {
+ continue;
+ }
+
+ d2 = qh__vertex_segment_length2(context->vertices + eps[i],
+ context->vertices + eps[j],
+ context->vertices + eps[k]);
+
+ if (d2 > max) {
+ max = d2;
+ l = i;
+ }
+ }
+
+ vertices[0] = eps[j];
+ vertices[1] = eps[k];
+ vertices[2] = eps[l];
+}
+
+static void
+qh__push_stack(qh_index_stack_t* stack, qh_index_t index)
+{
+ stack->begin[stack->size] = index;
+ stack->size++;
+}
+
+static qh_index_t
+qh__pop_stack(qh_index_stack_t* stack)
+{
+ qh_index_t top = -1;
+
+ if (stack->size > 0) {
+ top = stack->begin[stack->size - 1];
+ stack->size--;
+ }
+
+ return top;
+}
+
+static qh_index_t
+qh__furthest_point_from_plane(qh_context_t* context,
+ qh_index_t* indices,
+ int nindices,
+ qh_vec3_t* normal,
+ double sdist)
+{
+ int i, j = -1;
+ double max = -QH_FLT_MAX;
+
+ for (i = 0; i < nindices; ++i) {
+ qh_index_t index = indices ? *(indices + i) : i;
+ double dist = qh__dist_point_plane(context->vertices + index,
+ normal, sdist);
+
+ if (dist > max) {
+ j = i;
+ max = dist;
+ }
+ }
+
+ return j;
+}
+
+static int
+qh__face_can_see_vertex(qh_face_t* face, qh_vertex_t* v)
+{
+ qh_vec3_t tov = *v;
+
+ qh__vec3_sub(&tov, &face->centroid);
+ return qh__vec3_dot(&tov, &face->normal) > 0;
+}
+
+static int
+qh__face_can_see_vertex_epsilon(qh_context_t* context, qh_face_t* face,
+ qh_vertex_t* v, double epsilon)
+{
+ double dot;
+ qh_vec3_t tov = *v;
+
+ qh__vec3_sub(&tov, &face->centroid);
+ dot = qh__vec3_dot(&tov, &face->normal);
+
+ if (dot > epsilon) {
+ return 1;
+ } else {
+ dot = fabs(dot);
+
+ if (dot <= epsilon && dot >= 0) {
+ qh_vec3_t n = face->normal;
+
+ /* allow epsilon degeneration along the face normal */
+ qh__vec3_multiply(&n, epsilon);
+ qh__vec3_add(v, &n);
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static inline void
+qh__assert_half_edge(qh_half_edge_t* edge, qh_context_t* context)
+{
+ QH_ASSERT(edge->opposite_he != -1);
+ QH_ASSERT(edge->he != -1);
+ QH_ASSERT(edge->adjacent_face != -1);
+ QH_ASSERT(edge->next_he != -1);
+ QH_ASSERT(edge->previous_he != -1);
+ QH_ASSERT(edge->to_vertex != -1);
+ QH_ASSERT(context->edges[edge->opposite_he].to_vertex != edge->to_vertex);
+}
+
+static inline void
+qh__assert_face(qh_face_t* face, qh_context_t* context)
+{
+ int i;
+
+ for (i = 0; i < 3; ++i) {
+ qh__assert_half_edge(context->edges + face->edges[i], context);
+ }
+
+ QH_ASSERT(context->valid[face->face]);
+}
+
+#ifdef QUICKHULL_DEBUG
+
+void
+qh__log_face(qh_context_t* context, qh_face_t const* face) {
+ QH_LOG("Face %ld:\n", face->face);
+ for (int i = 0; i < 3; ++i) {
+ qh_half_edge_t edge = context->edges[face->edges[i]];
+ QH_LOG("\te%d %ld\n", i, edge.he);
+ QH_LOG("\t\te%d.opposite_he %ld\n", i, edge.opposite_he);
+ QH_LOG("\t\te%d.next_he %ld\n", i, edge.next_he);
+ QH_LOG("\t\te%d.previous_he %ld\n", i, edge.previous_he);
+ QH_LOG("\t\te%d.to_vertex %ld\n", i, edge.to_vertex);
+ QH_LOG("\t\te%d.adjacent_face %ld\n", i, edge.adjacent_face);
+ }
+ QH_LOG("\tnormal %f %f %f\n", face->normal.x, face->normal.y,
+ face->normal.z);
+ QH_LOG("\tsdist %f\n", face->sdist);
+ QH_LOG("\tcentroid %f %f %f\n", face->centroid.x, face->centroid.y,
+ face->centroid.z);
+}
+
+static int
+qh__test_hull(qh_context_t* context, double epsilon, int testiset)
+{
+ unsigned int i, j, k;
+
+ for (i = 0; i < context->nvertices; ++i) {
+ qh_index_t vindex = i;
+ char valid = 1;
+
+ for (j = 0; j < context->nfaces; ++j) {
+ if (!context->valid[j]) {
+ continue;
+ }
+ qh_face_t* face = context->faces + j;
+
+ qh_half_edge_t* e0 = context->edges + face->edges[0];
+ qh_half_edge_t* e1 = context->edges + face->edges[1];
+ qh_half_edge_t* e2 = context->edges + face->edges[2];
+
+ if (e0->to_vertex == vindex ||
+ e1->to_vertex == vindex ||
+ e2->to_vertex == vindex) {
+ valid = 0;
+ break;
+ }
+
+ if (testiset) {
+ for (k = 0; k < face->iset.size; ++k) {
+ if (vindex == face->iset.indices[k]) {
+ valid = 0;
+ }
+ }
+ }
+ }
+
+ if (!valid) {
+ continue;
+ }
+
+ for (j = 0; j < context->nfaces; ++j) {
+ if (!context->valid[j]) {
+ continue;
+ }
+ qh_face_t* face = context->faces + j;
+
+ qh_vertex_t vertex = context->vertices[vindex];
+ qh__vec3_sub(&vertex, &face->centroid);
+ if (qh__vec3_dot(&face->normal, &vertex) > epsilon) {
+ #ifdef QUICKHULL_DEBUG
+ qh__log_face(context, face);
+ #endif
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+#endif /* QUICKHULL_DEBUG */
+
+
+static void
+#ifdef QUICKHULL_DEBUG
+qh__build_hull(qh_context_t* context, double epsilon, unsigned int step,
+ unsigned int* failurestep)
+#else
+qh__build_hull(qh_context_t* context, double epsilon)
+#endif
+{
+ qh_index_t topface = qh__pop_stack(&context->facestack);
+ int i, j, k;
+
+ #ifdef QUICKHULL_DEBUG
+ unsigned int iteration = 0;
+ #endif
+
+ while (topface != -1) {
+ qh_face_t* face = context->faces + topface;
+ qh_index_t fvi, apex;
+ qh_vertex_t* fv;
+ int reversed = 0;
+
+ #ifdef QUICKHULL_DEBUG
+ if (!context->valid[topface] || face->iset.size == 0 || iteration == step)
+ #else
+ if (!context->valid[topface] || face->iset.size == 0)
+ #endif
+ {
+ topface = qh__pop_stack(&context->facestack);
+ continue;
+ }
+
+ #ifdef QUICKHULL_DEBUG
+ if (failurestep != NULL && !qh__test_hull(context, epsilon, 1)) {
+ if (*failurestep == 0) {
+ *failurestep = iteration;
+ break;
+ }
+ }
+
+ iteration++;
+ #endif
+
+ fvi = qh__furthest_point_from_plane(context, face->iset.indices,
+ face->iset.size, &face->normal, face->sdist);
+ fv = context->vertices + *(face->iset.indices + fvi);
+
+ qh__assert_face(face, context);
+
+ /* Reset visited flag for faces */
+ {
+ for (i = 0; i < context->nfaces; ++i) {
+ context->faces[i].visitededges = 0;
+ }
+ }
+
+ /* Find horizon edge */
+ {
+ qh_index_t tovisit = topface;
+ qh_face_t* facetovisit = context->faces + tovisit;
+
+ /* Release scratch */
+ context->scratch.size = 0;
+
+ while (tovisit != -1) {
+ if (facetovisit->visitededges >= 3) {
+ context->valid[tovisit] = 0;
+ tovisit = qh__pop_stack(&context->scratch);
+ facetovisit = context->faces + tovisit;
+ } else {
+ qh_index_t edgeindex = facetovisit->edges[facetovisit->visitededges];
+ qh_half_edge_t* edge;
+ qh_half_edge_t* oppedge;
+ qh_face_t* adjface;
+
+ facetovisit->visitededges++;
+
+ edge = context->edges + edgeindex;
+ oppedge = context->edges + edge->opposite_he;
+ adjface = context->faces + oppedge->adjacent_face;
+
+ if (!context->valid[oppedge->adjacent_face]) { continue; }
+
+ qh__assert_half_edge(oppedge, context);
+ qh__assert_half_edge(edge, context);
+ qh__assert_face(adjface, context);
+
+ if (!qh__face_can_see_vertex(adjface, fv)) {
+ qh__push_stack(&context->horizonedges, edge->he);
+ } else {
+ context->valid[tovisit] = 0;
+ qh__push_stack(&context->scratch, adjface->face);
+ }
+ }
+ }
+ }
+
+ apex = face->iset.indices[fvi];
+
+ /* Sort horizon edges in CCW order */
+ {
+ qh_vertex_t triangle[3];
+ int vindex = 0;
+ qh_vec3_t v0, v1, toapex;
+ qh_vertex_t n;
+
+ for (i = 0; i < context->horizonedges.size; ++i) {
+ qh_index_t he0 = context->horizonedges.begin[i];
+ qh_index_t he0vert = context->edges[he0].to_vertex;
+ qh_index_t phe0 = context->edges[he0].previous_he;
+ qh_index_t phe0vert = context->edges[phe0].to_vertex;
+
+ for (j = i + 2; j < context->horizonedges.size; ++j) {
+ qh_index_t he1 = context->horizonedges.begin[j];
+ qh_index_t he1vert = context->edges[he1].to_vertex;
+ qh_index_t phe1 = context->edges[he1].previous_he;
+ qh_index_t phe1vert = context->edges[phe1].to_vertex;
+
+ if (phe1vert == he0vert || phe0vert == he1vert) {
+ QH_SWAP(qh_index_t, context->horizonedges.begin[j],
+ context->horizonedges.begin[i + 1]);
+ break;
+ }
+ }
+
+ if (vindex < 3) {
+ triangle[vindex++] =
+ context->vertices[context->edges[he0].to_vertex];
+ }
+ }
+
+ if (vindex == 3) {
+ /* Detect first triangle face ordering */
+ v0 = triangle[0];
+ v1 = triangle[2];
+
+ qh__vec3_sub(&v0, &triangle[1]);
+ qh__vec3_sub(&v1, &triangle[1]);
+
+ n = qh__vec3_cross(&v0, &v1);
+
+ /* Get the vector to the apex */
+ toapex = triangle[0];
+
+ qh__vec3_sub(&toapex, context->vertices + apex);
+
+ reversed = qh__vec3_dot(&n, &toapex) < 0.f;
+ }
+ }
+
+ /* Create new faces */
+ {
+ qh_index_t top = qh__pop_stack(&context->horizonedges);
+ qh_index_t last = qh__pop_stack(&context->horizonedges);
+ qh_index_t first = top;
+ int looped = 0;
+
+ QH_ASSERT(context->newhorizonedges.size == 0);
+
+ /* Release scratch */
+ context->scratch.size = 0;
+
+ while (!looped) {
+ qh_half_edge_t* prevhe;
+ qh_half_edge_t* nexthe;
+ qh_half_edge_t* oppedge;
+ /* qh_vec3_t normal; */
+ /* qh_vertex_t fcentroid; */
+ qh_index_t verts[3];
+ qh_face_t* newface;
+
+ if (last == -1) {
+ looped = 1;
+ last = first;
+ }
+
+ prevhe = context->edges + last;
+ nexthe = context->edges + top;
+
+ if (reversed) {
+ QH_SWAP(qh_half_edge_t*, prevhe, nexthe);
+ }
+
+ verts[0] = prevhe->to_vertex;
+ verts[1] = nexthe->to_vertex;
+ verts[2] = apex;
+
+ context->valid[nexthe->adjacent_face] = 0;
+
+ oppedge = context->edges + nexthe->opposite_he;
+ newface = qh__next_face(context);
+
+ qh__face_init(newface, verts, context);
+
+ oppedge->opposite_he = context->edges[newface->edges[0]].he;
+ context->edges[newface->edges[0]].opposite_he = oppedge->he;
+
+ qh__push_stack(&context->scratch, newface->face);
+ qh__push_stack(&context->newhorizonedges, newface->edges[0]);
+
+ top = last;
+ last = qh__pop_stack(&context->horizonedges);
+ }
+ }
+
+ /* Attach point sets to newly created faces */
+ {
+ for (k = 0; k < context->nfaces; ++k) {
+ qh_face_t* f = context->faces + k;
+
+ if (context->valid[k] || f->iset.size == 0) {
+ continue;
+ }
+
+ if (f->visitededges == 3) {
+ context->valid[k] = 0;
+ }
+
+ for (i = 0; i < f->iset.size; ++i) {
+ qh_index_t vertex = f->iset.indices[i];
+ /* qh_vertex_t* v = context->vertices + vertex; */
+ qh_face_t* dface = NULL;
+
+ for (j = 0; j < context->scratch.size; ++j) {
+ qh_face_t* newface = context->faces + context->scratch.begin[j];
+ qh_half_edge_t* e0 = context->edges + newface->edges[0];
+ qh_half_edge_t* e1 = context->edges + newface->edges[1];
+ qh_half_edge_t* e2 = context->edges + newface->edges[2];
+ /* qh_vertex_t cv; */
+
+ if (e0->to_vertex == vertex ||
+ e1->to_vertex == vertex ||
+ e2->to_vertex == vertex) {
+ continue;
+ }
+
+ if (qh__face_can_see_vertex_epsilon(context, newface,
+ context->vertices + vertex,
+ epsilon)) {
+ dface = newface;
+ break;
+ }
+ }
+
+ if (dface) {
+ if (dface->iset.size + 1 >= dface->iset.capacity) {
+ dface->iset.capacity *= 2;
+ dface->iset.indices = QH_REALLOC(qh_index_t,
+ dface->iset.indices, dface->iset.capacity);
+ }
+
+ dface->iset.indices[dface->iset.size++] = vertex;
+ }
+ }
+
+ f->iset.size = 0;
+ }
+ }
+
+ /* Link new faces together */
+ {
+ for (i = 0; i < context->newhorizonedges.size; ++i) {
+ qh_index_t phe0, nhe1;
+ qh_half_edge_t* he0;
+ qh_half_edge_t* he1;
+ int ii;
+
+ if (reversed) {
+ ii = (i == 0) ? context->newhorizonedges.size - 1 : (i-1);
+ } else {
+ ii = (i+1) % context->newhorizonedges.size;
+ }
+
+ phe0 = context->edges[context->newhorizonedges.begin[i]].previous_he;
+ nhe1 = context->edges[context->newhorizonedges.begin[ii]].next_he;
+
+ he0 = context->edges + phe0;
+ he1 = context->edges + nhe1;
+
+ QH_ASSERT(he1->to_vertex == apex);
+ QH_ASSERT(he0->opposite_he == -1);
+ QH_ASSERT(he1->opposite_he == -1);
+
+ he0->opposite_he = he1->he;
+ he1->opposite_he = he0->he;
+ }
+
+ context->newhorizonedges.size = 0;
+ }
+
+ /* Push new face to stack */
+ {
+ for (i = 0; i < context->scratch.size; ++i) {
+ qh_face_t* face = context->faces + context->scratch.begin[i];
+
+ if (face->iset.size > 0) {
+ qh__push_stack(&context->facestack, face->face);
+ }
+ }
+
+ /* Release scratch */
+ context->scratch.size = 0;
+ }
+
+ topface = qh__pop_stack(&context->facestack);
+
+ /* TODO: push all non-valid faces for reuse in face stack memory pool */
+ }
+}
+
+#ifdef QUICKHULL_FILES
+void
+qh_mesh_export(qh_mesh_t const* mesh, char const* filename)
+{
+ FILE* objfile = fopen(filename, "wt");
+ fprintf(objfile, "o\n");
+
+ for (int i = 0; i < mesh->nvertices; ++i) {
+ qh_vertex_t v = mesh->vertices[i];
+ fprintf(objfile, "v %f %f %f\n", v.x, v.y, v.z);
+ }
+
+ for (int i = 0; i < mesh->nnormals; ++i) {
+ qh_vec3_t n = mesh->normals[i];
+ fprintf(objfile, "vn %f %f %f\n", n.x, n.y, n.z);
+ }
+
+ for (int i = 0, j = 0; i < mesh->nindices; i += 3, j++) {
+ fprintf(objfile, "f %u/%u %u/%u %u/%u\n",
+ mesh->indices[i+0] + 1, mesh->normalindices[j] + 1,
+ mesh->indices[i+1] + 1, mesh->normalindices[j] + 1,
+ mesh->indices[i+2] + 1, mesh->normalindices[j] + 1);
+ }
+
+ fclose(objfile);
+}
+#endif /* QUICKHULL_FILES */
+
+static qh_face_t*
+qh__build_tetrahedron(qh_context_t* context, double epsilon)
+{
+ int i, j;
+ qh_index_t vertices[3];
+ qh_index_t apex;
+ qh_face_t* faces;
+ qh_vertex_t normal, centroid, vapex, tcentroid;
+
+ /* Get the initial tetrahedron basis (first face) */
+ qh__tetrahedron_basis(context, &vertices[0]);
+
+ /* Find apex from the tetrahedron basis */
+ {
+ double sdist;
+ qh_vec3_t v0, v1;
+
+ v0 = context->vertices[vertices[1]];
+ v1 = context->vertices[vertices[2]];
+
+ qh__vec3_sub(&v0, context->vertices + vertices[0]);
+ qh__vec3_sub(&v1, context->vertices + vertices[0]);
+
+ normal = qh__vec3_cross(&v0, &v1);
+ qh__vec3_normalize(&normal);
+
+ centroid = qh__face_centroid(vertices, context);
+ sdist = qh__vec3_dot(&normal, &centroid);
+
+ apex = qh__furthest_point_from_plane(context, NULL,
+ context->nvertices, &normal, sdist);
+ vapex = context->vertices[apex];
+
+ qh__vec3_sub(&vapex, &centroid);
+
+ /* Whether the face is looking towards the apex */
+ if (qh__vec3_dot(&vapex, &normal) > 0) {
+ QH_SWAP(qh_index_t, vertices[1], vertices[2]);
+ }
+ }
+
+ faces = qh__next_face(context);
+ qh__face_init(&faces[0], vertices, context);
+
+ /* Build faces from the tetrahedron basis to the apex */
+ {
+ qh_index_t facevertices[3];
+ for (i = 0; i < 3; ++i) {
+ qh_half_edge_t* edge = context->edges + faces[0].edges[i];
+ qh_half_edge_t prevedge = context->edges[edge->previous_he];
+ qh_face_t* face = faces+i+1;
+ qh_half_edge_t* e0;
+
+ facevertices[0] = edge->to_vertex;
+ facevertices[1] = prevedge.to_vertex;
+ facevertices[2] = apex;
+
+ qh__next_face(context);
+ qh__face_init(face, facevertices, context);
+
+ e0 = context->edges + faces[i+1].edges[0];
+ edge->opposite_he = e0->he;
+ e0->opposite_he = edge->he;
+ }
+ }
+
+ /* Attach half edges to faces tied to the apex */
+ {
+ for (i = 0; i < 3; ++i) {
+ qh_face_t* face;
+ qh_face_t* nextface;
+ qh_half_edge_t* e1;
+ qh_half_edge_t* e2;
+
+ j = (i+2) % 3;
+
+ face = faces+i+1;
+ nextface = faces+j+1;
+
+ e1 = context->edges + face->edges[1];
+ e2 = context->edges + nextface->edges[2];
+
+ QH_ASSERT(e1->opposite_he == -1);
+ QH_ASSERT(e2->opposite_he == -1);
+
+ e1->opposite_he = e2->he;
+ e2->opposite_he = e1->he;
+
+ qh__assert_half_edge(e1, context);
+ qh__assert_half_edge(e2, context);
+ }
+ }
+
+ /* Create initial point set; every point is */
+ /* attached to the first face it can see */
+ {
+ for (i = 0; i < context->nvertices; ++i) {
+ /* qh_vertex_t* v; */
+ qh_face_t* dface = NULL;
+
+ if (vertices[0] == i || vertices[1] == i || vertices[2] == i) {
+ continue;
+ }
+
+ for (j = 0; j < 4; ++j) {
+ if (qh__face_can_see_vertex_epsilon(context, context->faces + j,
+ context->vertices + i, epsilon)) {
+ dface = context->faces + j;
+ break;
+ }
+ }
+
+ if (dface) {
+ int valid = 1;
+ int j;
+
+ for (j = 0; j < 3; ++j) {
+ qh_half_edge_t* e = context->edges + dface->edges[j];
+ if (i == e->to_vertex) {
+ valid = 0;
+ break;
+ }
+ }
+
+ if (!valid) { continue; }
+
+ if (dface->iset.size + 1 >= dface->iset.capacity) {
+ dface->iset.capacity *= 2;
+ dface->iset.indices = QH_REALLOC(qh_index_t,
+ dface->iset.indices, dface->iset.capacity);
+ }
+
+ dface->iset.indices[dface->iset.size++] = i;
+ }
+ }
+ }
+
+ /* Add initial tetrahedron faces to the face stack */
+ tcentroid.x = tcentroid.y = tcentroid.z = 0.0;
+ for (i = 0; i < 4; ++i) {
+ context->valid[i] = 1;
+ qh__assert_face(context->faces + i, context);
+ qh__push_stack(&context->facestack, i);
+ qh__vec3_add(&tcentroid, &context->faces[i].centroid);
+ }
+
+ /* Assign the tetrahedron centroid */
+ qh__vec3_multiply(&tcentroid, 0.25);
+ context->centroid = tcentroid;
+
+ QH_ASSERT(context->nedges == context->nfaces * 3);
+ QH_ASSERT(context->nfaces == 4);
+ QH_ASSERT(context->facestack.size == 4);
+
+ return faces;
+}
+
+static void
+qh__remove_vertex_duplicates(qh_context_t* context, double epsilon)
+{
+ int i, j, k;
+ for (i = 0; i < context->nvertices; ++i) {
+ qh_vertex_t* v = context->vertices + i;
+ if (v->x == 0) v->x = 0;
+ if (v->y == 0) v->y = 0;
+ if (v->z == 0) v->z = 0;
+ for (j = i + 1; j < context->nvertices; ++j) {
+ if (qh__vertex_equals_epsilon(context->vertices + i,
+ context->vertices + j, epsilon))
+ {
+ for (k = j; k < context->nvertices - 1; ++k) {
+ context->vertices[k] = context->vertices[k+1];
+ }
+ context->nvertices--;
+ }
+ }
+ }
+}
+
+static void
+qh__init_context(qh_context_t* context, qh_vertex_t const* vertices,
+ unsigned int nvertices)
+{
+ /* TODO: */
+ /* size_t nedges = 3 * nvertices - 6; */
+ /* size_t nfaces = 2 * nvertices - 4; */
+ unsigned int nfaces = nvertices * (nvertices - 1);
+ unsigned int nedges = nfaces * 3;
+
+ context->edges = QH_MALLOC(qh_half_edge_t, nedges);
+ context->faces = QH_MALLOC(qh_face_t, nfaces);
+ context->facestack.begin = QH_MALLOC(qh_index_t, nfaces);
+ context->scratch.begin = QH_MALLOC(qh_index_t, nfaces);
+ context->horizonedges.begin = QH_MALLOC(qh_index_t, nedges);
+ context->newhorizonedges.begin = QH_MALLOC(qh_index_t, nedges);
+ context->valid = QH_MALLOC(char, nfaces);
+
+ if (!(context->edges &&
+ context->faces &&
+ context->facestack.begin &&
+ context->scratch.begin &&
+ context->horizonedges.begin &&
+ context->newhorizonedges.begin &&
+ context->valid)) {
+# ifdef HAVE_JWXYZ
+ jwxyz_abort ("%s: out of memory", progname);
+# else
+ fprintf (stderr, "%s: out of memory\n", progname);
+ exit (1);
+# endif
+ }
+
+
+ context->vertices = QH_MALLOC(qh_vertex_t, nvertices);
+ memcpy(context->vertices, vertices, sizeof(qh_vertex_t) * nvertices);
+
+ context->nvertices = nvertices;
+ context->nedges = 0;
+ context->nfaces = 0;
+ context->facestack.size = 0;
+ context->scratch.size = 0;
+ context->horizonedges.size = 0;
+ context->newhorizonedges.size = 0;
+
+ #ifdef QUICKHULL_DEBUG
+ context->maxfaces = nfaces;
+ context->maxedges = nedges;
+ #endif
+}
+
+static void
+qh__free_context(qh_context_t* context)
+{
+ int i;
+
+ for (i = 0; i < context->nfaces; ++i) {
+ QH_FREE(context->faces[i].iset.indices);
+ context->faces[i].iset.size = 0;
+ }
+
+ context->nvertices = 0;
+ context->nfaces = 0;
+
+ QH_FREE(context->edges);
+
+ QH_FREE(context->faces);
+ QH_FREE(context->facestack.begin);
+ QH_FREE(context->scratch.begin);
+ QH_FREE(context->horizonedges.begin);
+ QH_FREE(context->newhorizonedges.begin);
+ QH_FREE(context->vertices);
+ QH_FREE(context->valid);
+}
+
+void
+qh_free_mesh(qh_mesh_t mesh)
+{
+ QH_FREE(mesh.vertices);
+ QH_FREE(mesh.indices);
+ QH_FREE(mesh.normalindices);
+ QH_FREE(mesh.normals);
+}
+
+static double
+qh__compute_epsilon(qh_vertex_t const* vertices, unsigned int nvertices)
+{
+ double epsilon;
+ unsigned int i;
+
+ double maxxi = -QH_FLT_MAX;
+ double maxyi = -QH_FLT_MAX;
+
+ for (i = 0; i < nvertices; ++i) {
+ double fxi = fabs(vertices[i].x);
+ double fyi = fabs(vertices[i].y);
+
+ if (fxi > maxxi) {
+ maxxi = fxi;
+ }
+ if (fyi > maxyi) {
+ maxyi = fyi;
+ }
+ }
+
+ epsilon = 2 * (maxxi + maxyi) * QH_FLT_EPS;
+
+ return epsilon;
+}
+
+qh_mesh_t
+qh_quickhull3d(qh_vertex_t const* vertices, unsigned int nvertices)
+{
+ qh_mesh_t m;
+ qh_context_t context;
+ /* unsigned int* indices; */
+ unsigned int nfaces = 0, i, index, nindices;
+ double epsilon;
+
+ epsilon = qh__compute_epsilon(vertices, nvertices);
+
+ qh__init_context(&context, vertices, nvertices);
+
+ qh__remove_vertex_duplicates(&context, epsilon);
+
+ /* Build the initial tetrahedron */
+ qh__build_tetrahedron(&context, epsilon);
+
+ /* Build the convex hull */
+ #ifdef QUICKHULL_DEBUG
+ qh__build_hull(&context, epsilon, -1, NULL);
+ #else
+ qh__build_hull(&context, epsilon);
+ #endif
+
+ /* QH_ASSERT(qh__test_hull(&context, epsilon)); */
+
+ for (i = 0; i < context.nfaces; ++i) {
+ if (context.valid[i]) { nfaces++; }
+ }
+
+ nindices = nfaces * 3;
+
+ m.normals = QH_MALLOC(qh_vertex_t, nfaces);
+ m.normalindices = QH_MALLOC(unsigned int, nfaces);
+ m.vertices = QH_MALLOC(qh_vertex_t, nindices);
+ m.indices = QH_MALLOC(unsigned int, nindices);
+ m.nindices = nindices;
+ m.nnormals = nfaces;
+ m.nvertices = 0;
+
+ {
+ index = 0;
+ for (i = 0; i < context.nfaces; ++i) {
+ if (!context.valid[i]) { continue; }
+ m.normals[index] = context.faces[i].normal;
+ index++;
+ }
+
+ index = 0;
+ for (i = 0; i < context.nfaces; ++i) {
+ if (!context.valid[i]) { continue; }
+ m.normalindices[index] = index;
+ index++;
+ }
+
+ index = 0;
+ for (i = 0; i < context.nfaces; ++i) {
+ if (!context.valid[i]) { continue; }
+ m.indices[index+0] = index+0;
+ m.indices[index+1] = index+1;
+ m.indices[index+2] = index+2;
+ index += 3;
+ }
+
+ for (i = 0; i < context.nfaces; ++i) {
+ if (!context.valid[i]) { continue; }
+ qh_half_edge_t e0 = context.edges[context.faces[i].edges[0]];
+ qh_half_edge_t e1 = context.edges[context.faces[i].edges[1]];
+ qh_half_edge_t e2 = context.edges[context.faces[i].edges[2]];
+
+ m.vertices[m.nvertices++] = context.vertices[e0.to_vertex];
+ m.vertices[m.nvertices++] = context.vertices[e1.to_vertex];
+ m.vertices[m.nvertices++] = context.vertices[e2.to_vertex];
+ }
+ }
+
+ qh__free_context(&context);
+
+ return m;
+}
diff --git a/hacks/glx/quickhull.h b/hacks/glx/quickhull.h
new file mode 100644
index 0000000..0dd0faa
--- /dev/null
+++ b/hacks/glx/quickhull.h
@@ -0,0 +1,56 @@
+/* quickhull, Copyright (c) 2016 Karim Naaji, karim.naaji@gmail.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE
+*/
+
+#ifndef __QUICKHULL_H__
+#define __QUICKHULL_H__
+
+typedef struct qh_vertex {
+ union {
+ double v[3];
+ struct {
+ double x;
+ double y;
+ double z;
+ };
+ };
+} qh_vertex_t;
+
+typedef qh_vertex_t qh_vec3_t;
+
+typedef struct qh_mesh {
+ qh_vertex_t* vertices;
+ qh_vec3_t* normals;
+ unsigned int* indices;
+ unsigned int* normalindices;
+ unsigned int nindices;
+ unsigned int nvertices;
+ unsigned int nnormals;
+} qh_mesh_t;
+
+extern qh_mesh_t qh_quickhull3d(qh_vertex_t const* vertices,
+ unsigned int nvertices);
+
+extern void qh_free_mesh(qh_mesh_t mesh);
+
+#ifdef QUICKHULL_FILES
+extern void qh_mesh_export(qh_mesh_t const* mesh, char const* filename);
+#endif
+
+#endif /* __QUICKHULL_H__ */
diff --git a/hacks/glx/raverhoop.c b/hacks/glx/raverhoop.c
new file mode 100644
index 0000000..5cf35f7
--- /dev/null
+++ b/hacks/glx/raverhoop.c
@@ -0,0 +1,767 @@
+/* raverhoop, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Simulates an LED hula hoop in a dark room. Oontz oontz oontz.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*ncolors: 12 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_hoop 0
+# define release_hoop 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "False"
+#define DEF_WANDER "False"
+#define DEF_LIGHTS "200"
+#define DEF_SPEED "1.0"
+#define DEF_LIGHT_SPEED "1.0"
+#define DEF_SUSTAIN "1.0"
+
+typedef struct {
+ GLfloat x,y,z;
+} XYZ;
+
+typedef struct afterimage afterimage;
+struct afterimage {
+ GLfloat color[4];
+ XYZ position;
+ afterimage *next;
+};
+
+typedef struct {
+ GLfloat color[4];
+ int duty_cycle[10]; /* off, on, off, on... values add to 100 */
+ GLfloat ratio;
+ Bool on;
+} light;
+
+
+typedef struct oscillator oscillator;
+struct oscillator {
+ GLfloat ratio, from, to, speed, *var;
+ int remaining;
+ oscillator *next;
+};
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int nlights;
+ light *lights;
+ GLfloat radius;
+ GLfloat axial_radius;
+ XYZ midpoint;
+ GLfloat tilt;
+ GLfloat spin;
+ GLfloat th;
+ GLfloat speed;
+ afterimage *trail;
+ oscillator *oscillators;
+
+} hoop_configuration;
+
+static hoop_configuration *bps = NULL;
+
+static Bool do_spin;
+static Bool do_wander;
+static int nlights;
+static GLfloat speed, light_speed, sustain;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-lights", ".lights", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-light-speed", ".lightSpeed", XrmoptionSepArg, 0 },
+ { "-sustain", ".sustain", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&nlights, "lights", "Lights", DEF_LIGHTS, t_Int},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&light_speed, "lightSpeed", "Speed", DEF_LIGHT_SPEED, t_Float},
+ {&sustain, "sustain", "Sustain", DEF_SUSTAIN, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt hoop_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+decay_afterimages (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ afterimage *prev = 0;
+ afterimage *a = bp->trail;
+ GLfloat tick = 0.05 / sustain;
+
+ while (a)
+ {
+ afterimage *next = a->next;
+ a->color[3] -= tick;
+ if (a->color[3] < 0)
+ {
+ if (prev)
+ prev->next = next;
+ else
+ bp->trail = next;
+ free (a);
+ }
+ else
+ prev = a;
+ a = next;
+ }
+}
+
+static void
+add_afterimage (ModeInfo *mi, GLfloat x, GLfloat y, GLfloat z,
+ GLfloat color[4])
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ afterimage *a = (afterimage *) calloc (1, sizeof (*a));
+ afterimage *b;
+ a->position.x = x;
+ a->position.y = y;
+ a->position.z = z;
+ memcpy (a->color, color, sizeof(a->color));
+
+ /* Put it at the end so that the older, dimmer ones are laid down on
+ the frame buffer before the newer, brighter ones. */
+ if (!bp->trail)
+ bp->trail = a;
+ else
+ {
+ for (b = bp->trail; b->next; b = b->next)
+ ;
+ b->next = a;
+ }
+}
+
+
+static void
+tick_light (light *L)
+{
+ int i;
+ int n = 0;
+
+ L->ratio += 0.05 * light_speed;
+ while (L->ratio > 1)
+ L->ratio -= 1;
+
+ for (i = 0; i < countof(L->duty_cycle); i++)
+ {
+ n += L->duty_cycle[i];
+ if (n > 100) abort();
+ if (n / 100.0 > L->ratio)
+ {
+ L->on = (i & 1);
+ break;
+ }
+ }
+}
+
+
+
+static void
+tick_hoop (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat m0[16];
+ int i;
+
+ glGetFloatv (GL_MODELVIEW_MATRIX, m0);
+
+ for (i = 0; i < bp->nlights; i++)
+ {
+ light *L = &bp->lights[i];
+ GLfloat m1[16];
+ GLfloat th = M_PI * 2 * i / bp->nlights;
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ GLfloat z;
+
+ tick_light (L);
+ if (! L->on)
+ continue;
+
+ glPushMatrix();
+
+ glTranslatef (bp->midpoint.x, bp->midpoint.y, bp->midpoint.z);
+ glRotatef (bp->th * 180 / M_PI, 0, 0, 1);
+ glRotatef (bp->tilt, 0, 1, 0);
+ glRotatef (bp->spin, 1, 0, 0);
+ glTranslatef (x * bp->radius, y * bp->radius, 0);
+ glGetFloatv (GL_MODELVIEW_MATRIX, m1);
+ glPopMatrix();
+
+ /* After all of our translations and rotations, figure out where
+ it actually ended up.
+ */
+ x = m1[12] - m0[12];
+ y = m1[13] - m0[13];
+ z = m1[14] - m0[14];
+ add_afterimage (mi, x, y, z, L->color);
+ }
+}
+
+
+static void
+draw_lights (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ afterimage *a;
+ GLfloat m[4][4];
+
+ if (wire)
+ {
+ int n = 360;
+ int i;
+ glPushMatrix();
+
+ glBegin (GL_LINES);
+ glVertex3f (0, 0, -bp->radius);
+ glVertex3f (0, 0, bp->radius);
+ glEnd();
+
+ glTranslatef (bp->midpoint.x, bp->midpoint.y, bp->midpoint.z);
+ glRotatef (bp->th * 180 / M_PI, 0, 0, 1);
+ glRotatef (bp->tilt, 0, 1, 0);
+ glRotatef (bp->spin, 1, 0, 0);
+
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ for (i = 0; i <= n; i++)
+ {
+ GLfloat th = i * M_PI * 2 / n;
+ glVertex3f (bp->radius * -cos(th),
+ bp->radius * -sin(th), 0);
+ }
+ for (i = 0; i <= n; i++)
+ {
+ GLfloat th = i * M_PI * 2 / n;
+ glVertex3f (bp->axial_radius * -cos(th),
+ bp->axial_radius * -sin(th), 0);
+ }
+ glEnd();
+ glPopMatrix();
+ }
+
+ /* Billboard the lights to always face the camera */
+ glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]);
+ m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
+ m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
+ m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+
+ for (a = bp->trail; a; a = a->next)
+ {
+ glPushMatrix();
+
+ glTranslatef (a->position.x, a->position.y, a->position.z);
+
+ if (wire)
+ {
+ GLfloat c[3];
+ c[0] = a->color[0] * a->color[3];
+ c[1] = a->color[1] * a->color[3];
+ c[2] = a->color[2] * a->color[3];
+ glColor3fv (c);
+ }
+ else
+ glColor4fv (a->color);
+
+ glRotatef (45, 0, 0, 1);
+ glScalef (0.15, 0.15, 0.15);
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0); glVertex3f (-1, -1, 0);
+ glTexCoord2f (1, 0); glVertex3f ( 1, -1, 0);
+ glTexCoord2f (1, 1); glVertex3f ( 1, 1, 0);
+ glTexCoord2f (0, 1); glVertex3f (-1, 1, 0);
+ glEnd();
+ mi->polygon_count++;
+
+ glPopMatrix();
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.35;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+static void
+tick_oscillators (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ oscillator *prev = 0;
+ oscillator *a = bp->oscillators;
+ GLfloat tick = 0.1 / speed;
+
+ while (a)
+ {
+ oscillator *next = a->next;
+ a->ratio += tick * a->speed;
+ if (a->ratio > 1)
+ a->ratio = 1;
+
+ *a->var = a->from + (a->to - a->from) * ease_ratio (a->ratio);
+
+ if (a->ratio < 1) /* mid cycle */
+ prev = a;
+ else if (--a->remaining <= 0) /* ended, and expired */
+ {
+ if (prev)
+ prev->next = next;
+ else
+ bp->oscillators = next;
+ free (a);
+ }
+ else /* keep going the other way */
+ {
+ GLfloat swap = a->from;
+ a->from = a->to;
+ a->to = swap;
+ a->ratio = 0;
+ prev = a;
+ }
+
+ a = next;
+ }
+}
+
+
+static void
+calm_oscillators (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ oscillator *a;
+ for (a = bp->oscillators; a && a->next; a = a->next)
+ a->remaining = 1;
+}
+
+
+static void
+add_oscillator (ModeInfo *mi, GLfloat *var, GLfloat speed, GLfloat to,
+ int repeat)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ oscillator *a;
+
+ /* If an oscillator is already running on this variable, don't
+ add another. */
+ for (a = bp->oscillators; a && a->next; a = a->next)
+ if (a->var == var)
+ return;
+
+ a = (oscillator *) calloc (1, sizeof (*a));
+ if (repeat <= 0) abort();
+ a->ratio = 0;
+ a->from = *var;
+ a->to = to;
+ a->speed = speed;
+ a->var = var;
+ a->remaining = repeat;
+ a->next = bp->oscillators;
+ bp->oscillators = a;
+# if 0
+ fprintf (stderr, "%s: %3d %6.2f -> %6.2f %s\n",
+ progname, repeat, *var, to,
+ (var == &bp->midpoint.z ? "z" :
+ var == &bp->tilt ? "tilt" :
+ var == &bp->axial_radius ? "r" :
+ var == &bp->speed ? "speed" : "?"));
+# endif
+}
+
+
+static void
+add_random_oscillator (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ int n = random() % 12;
+ switch (n) {
+ case 0: case 1: case 2:
+ add_oscillator (mi, &bp->midpoint.z, 1,
+ bp->radius * (0.8 + frand(0.2))
+ * (random() & 1 ? 1 : -1),
+ (3 + (random() % 10)));
+ break;
+ case 3: case 4: case 5:
+ add_oscillator (mi, &bp->tilt, 1,
+ -(GLfloat) (random() % 15),
+ 3 + (random() % 20));
+ break;
+ case 6: case 7: case 8:
+ add_oscillator (mi, &bp->axial_radius, 1,
+ 0.1 + bp->radius * frand(1.4),
+ 1 + (random() % 4));
+ break;
+ case 9: case 10:
+ add_oscillator (mi, &bp->speed, 3,
+ (0.7 + frand(0.9)) * (random() & 1 ? 1 : -1),
+ ((random() % 5)
+ ? 1
+ : 2 + (random() % 5)));
+ break;
+ case 11:
+ add_oscillator (mi, &bp->spin, 0.1,
+ 180 * (1 + (random() % 2)),
+ 2 * (1 + (random() % 5)));
+ break;
+ default:
+ abort();
+ break;
+ }
+}
+
+
+static void
+randomize_colors (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ int ncolors = MI_NCOLORS(mi);
+ GLfloat *colors;
+ int ncycles;
+ int i;
+
+ if (ncolors < 1)
+ ncolors = 1;
+ if (ncolors > bp->nlights)
+ ncolors = bp->nlights;
+
+ if (! (random() % 10))
+ ncolors = 1;
+
+ colors = calloc (ncolors, 4 * sizeof(*colors));
+ for (i = 0; i < ncolors; i++)
+ {
+ GLfloat *c = &colors[i * 4];
+# define QUANTIZE() (((random() % 16) << 4) | 0xF) / 255.0
+ c[0] = QUANTIZE();
+ c[1] = QUANTIZE();
+ c[2] = QUANTIZE();
+ c[3] = 1;
+ }
+
+ switch (random() % 5) {
+ case 0: ncycles = 1; break;
+ case 2: ncycles = ncolors * (1 + (random() % 5)); break;
+ default: ncycles = ncolors; break;
+ }
+
+ for (i = 0; i < bp->nlights; i++)
+ {
+ light *L = &bp->lights[i];
+ int n = i * ncolors / bp->nlights;
+ int m = i * ncycles / bp->nlights;
+ if (n >= ncolors) abort();
+ if (m >= ncycles) abort();
+ memcpy (L->color, &colors[n], sizeof (L->color));
+
+ if (ncycles <= 1)
+ {
+ L->duty_cycle[0] = 0;
+ L->duty_cycle[1] = 100;
+ }
+ else if (m & 1)
+ {
+ L->duty_cycle[0] = 50;
+ L->duty_cycle[1] = 50;
+ }
+ else
+ {
+ L->duty_cycle[0] = 0;
+ L->duty_cycle[1] = 50;
+ L->duty_cycle[2] = 50;
+ }
+ }
+ free (colors);
+}
+
+
+static void
+move_hoop (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ bp->th += 0.2 * speed * bp->speed;
+ while (bp->th > M_PI*2)
+ bp->th -= M_PI*2;
+ while (bp->th < 0)
+ bp->th += M_PI*2;
+
+ bp->midpoint.x = bp->axial_radius * cos (bp->th);
+ bp->midpoint.y = bp->axial_radius * sin (bp->th);
+
+ tick_oscillators (mi);
+
+ if (! (random() % 80))
+ add_random_oscillator (mi);
+
+ if (! (random() % 120))
+ randomize_colors (mi);
+}
+
+
+static void
+build_texture (ModeInfo *mi)
+{
+ int x, y;
+ int size = 128;
+ int s2 = size / 2;
+ int bpl = size * 2;
+ unsigned char *data = malloc (bpl * size);
+
+ for (y = 0; y < size; y++)
+ {
+ for (x = 0; x < size; x++)
+ {
+ double dist = (sqrt (((s2 - x) * (s2 - x)) +
+ ((s2 - y) * (s2 - y)))
+ / s2);
+ unsigned char *c = &data [y * bpl + x * 2];
+ c[0] = 0xFF;
+ c[1] = 0xFF * sin (dist > 1 ? 0 : (1 - dist));
+ }
+ }
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ check_gl_error ("texture param");
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, size, size, 0,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);
+ check_gl_error ("light texture");
+ free (data);
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hoop (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+hoop_handle_event (ModeInfo *mi, XEvent *event)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ randomize_colors (mi);
+ calm_oscillators (mi);
+ add_random_oscillator (mi);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_hoop (ModeInfo *mi)
+{
+ hoop_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hoop (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_NORMALIZE);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ glPolygonMode (GL_FRONT, GL_FILL);
+ glShadeModel (GL_FLAT);
+
+ if (! wire)
+ {
+ build_texture (mi);
+ glEnable (GL_TEXTURE_2D);
+ }
+
+ {
+ double spin_speed = 0.3;
+ double wander_speed = 0.005;
+ double spin_accel = 2.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->radius = 30;
+ bp->axial_radius = bp->radius * 0.3;
+ bp->tilt = - (GLfloat) (5 + (random() % 12));
+ bp->speed = (random() % 1 ? 1 : -1);
+ bp->nlights = nlights;
+ bp->lights = (light *) calloc (bp->nlights, sizeof (*bp->lights));
+ randomize_colors (mi);
+ move_hoop (mi);
+ add_random_oscillator (mi);
+}
+
+
+ENTRYPOINT void
+draw_hoop (ModeInfo *mi)
+{
+ hoop_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 7,
+ (y - 0.5) * 0.5,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (0.2, 0.2, 0.2);
+
+# ifdef HAVE_MOBILE
+ glScalef (0.7, 0.7, 0.7);
+# endif
+
+ glRotatef (70, 1, 0, 0);
+
+ if (! bp->button_down_p)
+ move_hoop (mi);
+
+ decay_afterimages (mi);
+ tick_hoop (mi);
+ draw_lights (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("RaverHoop", raverhoop, hoop)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/raverhoop.man b/hacks/glx/raverhoop.man
new file mode 100644
index 0000000..e7e70fa
--- /dev/null
+++ b/hacks/glx/raverhoop.man
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+raverhoop - Simulates an LED hula hoop in a dark room.
+.SH SYNOPSIS
+.B raverhoop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-lights \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-light-speed \fInumber\fP]
+[\-sustain \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-fps]
+.SH DESCRIPTION
+Simulates an LED hula hoop in a dark room. Oontz oontz oontz.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-ncolors \fInumber\fP
+The number of colors to use on the hoop. Default: 12.
+.TP 8
+.B \-lights \fInumber\fP
+The number of LEDs comprising the hoop. Default: 200.
+.TP 8
+.B \-speed \fInumber\fP
+Speed of the motion of the object.
+2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-light-speed \fInumber\fP
+Speed at which the lights animate.
+2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-sustain \fInumber\fP
+Speed at which the after-images / vapor trails fade away.
+2.0 means they last twice as long, 0.5 means half as long.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the scene itself should spin.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/razzledazzle.c b/hacks/glx/razzledazzle.c
new file mode 100644
index 0000000..a3c8f98
--- /dev/null
+++ b/hacks/glx/razzledazzle.c
@@ -0,0 +1,725 @@
+/* razzledazzle, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*ncolors: 2 \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_dazzle 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "gllist.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPEED "1.0"
+#define DEF_DENSITY "5.0"
+#define DEF_THICKNESS "0.1"
+#define DEF_MODE "Random"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+extern const struct gllist
+ *ships_ship1, *ships_ship2, *ships_ship3, *ships_ship4,
+ *ships_ship5, *ships_ship6, *ships_ship7, *ships_ship8;
+
+static const struct gllist * const *all_ships[] = {
+ &ships_ship1, &ships_ship2, &ships_ship3, &ships_ship4,
+ &ships_ship5, &ships_ship6, &ships_ship7, &ships_ship8,
+};
+
+
+typedef enum { LEFT, RIGHT, UP, DOWN } direction;
+
+typedef struct node node;
+
+struct node {
+ long gx, gy;
+ GLfloat x, y;
+ GLfloat dx, dy;
+ int nstripes;
+ Bool horiz_p;
+ Bool drawn_p;
+ GLfloat color1[4], color2[4];
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ Bool button_down_p;
+ GLfloat xoff, yoff, dx, dy;
+ node *nodes;
+ node *dragging;
+ int drag_x, drag_y;
+ int ncolors;
+ XColor *colors;
+ GLuint *dlists;
+ enum { SHIPS, FLAT, RANDOM } mode;
+ int which_ship;
+ long frames;
+} dazzle_configuration;
+
+static dazzle_configuration *bps = NULL;
+
+static GLfloat speed, thickness, density;
+static char *mode_arg;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-ships", ".mode", XrmoptionNoArg, "ships" },
+ { "-flat", ".mode", XrmoptionNoArg, "flat" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&density, "density", "Density", DEF_DENSITY, t_Float},
+ {&mode_arg, "mode", "Mode", DEF_MODE, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt dazzle_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+static void
+draw_grid (ModeInfo *mi, int gx, int gy)
+{
+ dazzle_configuration *bp = &bps[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ long x, y;
+ long wh = density * 2;
+
+ if (wire)
+ glColor3f (1, 1, 1);
+
+ if (!wire)
+ glBegin (GL_QUADS);
+
+ for (y = 0; y < wh; y++)
+ for (x = 0; x < wh; x++)
+ {
+ node *n0 = &bp->nodes[(y % wh) * wh + (x % wh)];
+ node *n1 = &bp->nodes[(y % wh) * wh + ((x+1) % wh)];
+ node *n2 = &bp->nodes[((y+1) % wh) * wh + ((x+1) % wh)];
+ node *n3 = &bp->nodes[((y+1) % wh) * wh + (x % wh)];
+ int nstripes, i;
+ Bool horiz_p, visible;
+ GLfloat x0, y0, x1, y1, x2, y2, x3, y3;
+ GLfloat xoff = (x < wh-1 ? 0 : wh);
+ GLfloat yoff = (y < wh-1 ? 0 : wh);
+ GLfloat bx = fmod ((double) bp->xoff, 2.0);
+ GLfloat by = fmod ((double) bp->yoff, 2.0);
+
+ bx += gx*2;
+ by += gy*2;
+
+ if (wire)
+ {
+ GLfloat a;
+ glColor3f (0, 0, 1);
+ glBegin (GL_LINE_LOOP);
+ for (a = 0; a < 360; a += 10)
+ glVertex3f ((n0->x / density-1) + 0.05 * cos(a * M_PI/180) + bx,
+ (n0->y / density-1) + 0.05 * sin(a * M_PI/180) + by,
+ 0);
+ glEnd();
+ }
+
+ x0 = n0->x / density - 1 + bx;
+ y0 = n0->y / density - 1 + by;
+
+ x1 = (n1->x+xoff) / density - 1 + bx;
+ y1 = n1->y / density - 1 + by;
+ x2 = (n2->x+xoff) / density - 1 + bx;
+ y2 = (n2->y+yoff) / density - 1 + by;
+ x3 = n3->x / density - 1 + bx;
+ y3 = (n3->y+yoff) / density - 1 + by;
+
+ if (wire)
+ {
+ if (gx == 0 && gy == 0)
+ {
+ glLineWidth (4);
+ glColor3f(1, 0, 0);
+ }
+ else
+ glColor3f(0.5, 0, 0.5);
+ if (wire) glBegin (GL_LINE_LOOP);
+ glVertex3f (x0, y0, 0);
+ glVertex3f (x1, y1, 0);
+ glVertex3f (x2, y2, 0);
+ glVertex3f (x3, y3, 0);
+ mi->polygon_count++;
+ if (wire) glEnd();
+ glLineWidth (1);
+ }
+
+ /* This isn't quite right: just because all corners are off screen
+ doesn't mean the quad isn't visible. We need to intersect the
+ edges with the screen rectangle.
+ */
+ {
+ GLfloat max = 0.75;
+ visible = ((x0 >= -max && y0 >= -max && x0 <= max && y0 <= max) ||
+ (x1 >= -max && y1 >= -max && x1 <= max && y1 <= max) ||
+ (x2 >= -max && y2 >= -max && x2 <= max && y2 <= max) ||
+ (x3 >= -max && y3 >= -max && x3 <= max && y3 <= max));
+ }
+
+ if (!visible) continue;
+
+ if (visible)
+ n0->drawn_p = True;
+
+ nstripes = n0->nstripes;
+ horiz_p = n0->horiz_p;
+
+ for (i = 0; i < nstripes; i++)
+ {
+ GLfloat ss = (GLfloat) i / nstripes;
+ GLfloat ss1 = (GLfloat) (i+1) / nstripes;
+ if (i & 1)
+ glColor4fv (n0->color1);
+ else if (wire)
+ continue;
+ else
+ glColor4fv (n0->color2);
+
+ if (horiz_p)
+ {
+ x0 = n0->x + (n3->x - n0->x) * ss;
+ y0 = n0->y + ((n3->y+yoff) - n0->y) * ss;
+ x1 = (n1->x+xoff) + ((n2->x+xoff) - (n1->x+xoff)) * ss;
+ y1 = n1->y + ((n2->y+yoff) - n1->y) * ss;
+
+ x2 = (n1->x+xoff) + ((n2->x+xoff) - (n1->x+xoff)) * ss1;
+ y2 = n1->y + ((n2->y+yoff) - n1->y) * ss1;
+ x3 = n0->x + (n3->x - n0->x) * ss1;
+ y3 = n0->y + ((n3->y+yoff) - n0->y) * ss1;
+ }
+ else
+ {
+ x0 = n0->x + ((n1->x+xoff) - n0->x) * ss;
+ y0 = n0->y + (n1->y - n0->y) * ss;
+ x1 = n3->x + ((n2->x+xoff) - n3->x) * ss;
+ y1 = (n3->y+yoff) + ((n2->y+yoff) - (n3->y+yoff)) * ss;
+
+ x2 = n3->x + ((n2->x+xoff) - n3->x) * ss1;
+ y2 = (n3->y+yoff) + ((n2->y+yoff) - (n3->y+yoff)) * ss1;
+ x3 = n0->x + ((n1->x+xoff) - n0->x) * ss1;
+ y3 = n0->y + (n1->y - n0->y) * ss1;
+ }
+
+ if (wire) glBegin (GL_LINES);
+ glVertex3f (x0 / density - 1 + bx, y0 / density - 1 + by, 0);
+ glVertex3f (x1 / density - 1 + bx, y1 / density - 1 + by, 0);
+ glVertex3f (x2 / density - 1 + bx, y2 / density - 1 + by, 0);
+ glVertex3f (x3 / density - 1 + bx, y3 / density - 1 + by, 0);
+ mi->polygon_count++;
+ if (wire) glEnd();
+ }
+ }
+
+ if (!wire)
+ glEnd();
+}
+
+
+static void
+move_grid (ModeInfo *mi)
+{
+ dazzle_configuration *bp = &bps[MI_SCREEN(mi)];
+ long x, y;
+ long wh = density * 2;
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat max = 1.0 / density * 3;
+
+ if (bp->button_down_p)
+ return;
+
+ bp->xoff += bp->dx;
+ bp->yoff += bp->dy;
+
+ if (! (random() % 50))
+ {
+ bp->dx += frand(0.0002) * RANDSIGN() * speed;
+ bp->dy += frand(0.0002) * RANDSIGN() * speed;
+ }
+
+ if (bp->dx > 0.003 * speed) bp->dx = 0.003 * speed;
+ if (bp->dy > 0.003 * speed) bp->dy = 0.003 * speed;
+
+ for (y = 0; y < wh; y++)
+ for (x = 0; x < wh; x++)
+ {
+ node *n = &bp->nodes[y * wh + x];
+ GLfloat x2 = n->x + n->dx;
+ GLfloat y2 = n->y + n->dy;
+
+ if (x2 < n->gx + max && x2 >= n->gx - max &&
+ y2 < n->gy + max && y2 >= n->gy - max)
+ {
+ n->x = x2;
+ n->y = y2;
+ }
+
+ if (! (random() % 50))
+ {
+ n->dx += frand(0.0005) * RANDSIGN() * speed;
+ n->dy += frand(0.0005) * RANDSIGN() * speed;
+ }
+
+ /* If this quad was not drawn, it's ok to re-randomize stripes, */
+ if (! n->drawn_p)
+ {
+ int i = random() % bp->ncolors;
+ int j = (i + bp->ncolors / 2) % bp->ncolors;
+ GLfloat cscale = 0.3;
+
+ n->color1[0] = bp->colors[i].red / 65536.0;
+ n->color1[1] = bp->colors[i].green / 65536.0;
+ n->color1[2] = bp->colors[i].blue / 65536.0;
+ n->color1[3] = 1.0;
+
+ n->color2[0] = bp->colors[j].red / 65536.0;
+ n->color2[1] = bp->colors[j].green / 65536.0;
+ n->color2[2] = bp->colors[j].blue / 65536.0;
+ n->color2[3] = 1.0;
+
+ if (! wire)
+ {
+ n->color1[0] = cscale * n->color1[0] + 1 - cscale;
+ n->color1[1] = cscale * n->color1[1] + 1 - cscale;
+ n->color1[2] = cscale * n->color1[2] + 1 - cscale;
+ n->color2[0] = cscale * n->color2[0];
+ n->color2[1] = cscale * n->color2[1];
+ n->color2[2] = cscale * n->color2[2];
+ }
+
+ n->horiz_p = random() & 1;
+ n->nstripes = 2 + (int) (BELLRAND(1.0 / thickness));
+ }
+ n->drawn_p = False;
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_dazzle (ModeInfo *mi, int width, int height)
+{
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho (0, 1, 1, 0, -1, 1);
+
+ if (width > height * 5) { /* tiny window: show middle */
+ GLfloat s = (GLfloat)height/width;
+ glOrtho (0, 1, 0.5-s, 0.5+s, -1, 1);
+ }
+
+# ifdef USE_IPHONE /* So much WTF */
+ {
+ int rot = current_device_rotation();
+
+ glTranslatef (0.5, 0.5, 0);
+
+ if (rot == 180 || rot == -180) {
+ glTranslatef (1, 1, 0);
+ } else if (rot == 90 || rot == -270) {
+ glRotatef (180, 0, 0, 1);
+ glTranslatef (0, 1, 0);
+ } else if (rot == -90 || rot == 270) {
+ glRotatef (180, 0, 0, 1);
+ glTranslatef (1, 0, 0);
+ }
+
+ glTranslatef(-0.5, -0.5, 0);
+ }
+# endif
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+dazzle_randomize (ModeInfo *mi)
+{
+ dazzle_configuration *bp = &bps[MI_SCREEN(mi)];
+ long x, y;
+ long wh = density * 2;
+
+ bp->ncolors = MI_NCOLORS(mi) - 1;
+ if (bp->ncolors < 1) bp->ncolors = 1;
+ if (bp->colors) free (bp->colors);
+ bp->colors = (XColor *) calloc (bp->ncolors, sizeof(XColor));
+ if (bp->ncolors < 3)
+ make_random_colormap (0, 0, 0, bp->colors, &bp->ncolors,
+ True, False, 0, False);
+ else
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, False, False);
+ if (bp->ncolors < 1) abort();
+
+ bp->dragging = 0;
+ if (bp->nodes) free (bp->nodes);
+
+ bp->nodes = (node *) calloc (wh * wh, sizeof (node));
+ for (y = 0; y < wh; y++)
+ for (x = 0; x < wh; x++)
+ {
+ node *n = &bp->nodes[wh * y + x];
+ n->gx = n->x = x;
+ n->gy = n->y = y;
+ }
+
+ bp->dx = bp->dy = 0;
+ bp->xoff = bp->yoff = 0;
+ for (x = 0; x < 1000; x++)
+ move_grid (mi);
+
+ bp->dx = frand(0.0005) * RANDSIGN() * speed;
+ bp->dy = frand(0.0005) * RANDSIGN() * speed;
+
+ if (bp->mode == SHIPS || bp->mode == RANDOM)
+ {
+ bp->which_ship = random() % countof(all_ships);
+ if (bp->mode == RANDOM && !(random() % 3))
+ bp->which_ship = -1;
+ }
+
+ if (bp->which_ship != -1)
+ {
+ bp->dx /= 10;
+ bp->dy /= 10;
+ }
+}
+
+
+ENTRYPOINT Bool
+dazzle_handle_event (ModeInfo *mi, XEvent *event)
+{
+ dazzle_configuration *bp = &bps[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat bx = fmod ((double) bp->xoff, 2.0);
+ GLfloat by = fmod ((double) bp->yoff, 2.0);
+ long wh = density * 2;
+
+ if (event->xany.type == ButtonPress)
+ {
+ GLfloat x = (GLfloat) event->xbutton.x / MI_WIDTH (mi) - 0.5;
+ GLfloat y = (GLfloat) event->xbutton.y / MI_HEIGHT (mi) - 0.5;
+ node *nn = 0;
+ int xoff = 0, yoff = 0;
+ GLfloat d2 = 999999;
+ long x0, y0, x1, y1;
+
+ if (wire) x /= 0.2, y /= 0.2;
+
+ for (y0 = -1; y0 <= 1; y0++)
+ for (x0 = -1; x0 <= 1; x0++)
+ for (y1 = 0; y1 < wh; y1++)
+ for (x1 = 0; x1 < wh; x1++)
+ {
+ node *n0 = &bp->nodes[(y1 % wh) * wh + (x1 % wh)];
+ double dist2;
+ GLfloat x2 = n0->x / density - 1 + bx + x0*2;
+ GLfloat y2 = n0->y / density - 1 + by + y0*2;
+
+ dist2 = (x - x2) * (x - x2) + (y - y2) * (y - y2);
+ if (dist2 < d2)
+ {
+ d2 = dist2;
+ nn = n0;
+ xoff = x0;
+ yoff = y0;
+ }
+ }
+
+ bp->button_down_p = True;
+ bp->dragging = nn;
+ bp->drag_x = xoff;
+ bp->drag_y = yoff;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ bp->dragging = 0;
+ bp->button_down_p = False;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && bp->dragging)
+ {
+ GLfloat x = (GLfloat) event->xmotion.x / MI_WIDTH (mi) - 0.5;
+ GLfloat y = (GLfloat) event->xmotion.y / MI_HEIGHT (mi) - 0.5;
+ if (wire) x /= 0.2, y /= 0.2;
+ x -= bx;
+ y -= by;
+ x -= bp->drag_x * 2;
+ y -= bp->drag_y * 2;
+ bp->dragging->x = x * density + density;
+ bp->dragging->y = y * density + density;
+ bp->dragging->dx = bp->dragging->dy = 0;
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ dazzle_randomize (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_dazzle (ModeInfo *mi)
+{
+ dazzle_configuration *bp;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (!mode_arg || !*mode_arg || !strcasecmp(mode_arg, "random"))
+ bp->mode = RANDOM;
+ else if (!strcasecmp(mode_arg, "ship") || !strcasecmp(mode_arg, "ships"))
+ bp->mode = SHIPS;
+ else if (!strcasecmp(mode_arg, "flat"))
+ bp->mode = FLAT;
+ else
+ {
+ fprintf (stderr, "%s: mode must be ship, flat or random, not %s\n",
+ progname, mode_arg);
+ exit (1);
+ }
+
+ bp->which_ship = -1;
+ if (bp->mode == SHIPS || bp->mode == RANDOM)
+ {
+ int i;
+ bp->dlists = (GLuint *) calloc (countof(all_ships)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_ships); i++)
+ {
+ const struct gllist *gll = *all_ships[i];
+
+ bp->dlists[i] = glGenLists (1);
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ if (random() & 1)
+ {
+ glScalef (-1, 1, 1);
+ glTranslatef (-1, 0, 0);
+ }
+ renderList (gll, MI_IS_WIREFRAME(mi));
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ glEndList ();
+ }
+ }
+
+ dazzle_randomize (mi);
+ reshape_dazzle (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+ENTRYPOINT void
+draw_dazzle (ModeInfo *mi)
+{
+ dazzle_configuration *bp = &bps[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int x, y;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glDisable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ mi->polygon_count = 0;
+
+ glTranslatef (0.5, 0.5, 0);
+
+ if (wire)
+ glScalef (0.2, 0.2, 1);
+
+ move_grid (mi);
+
+ for (y = -1; y <= 1; y++)
+ for (x = -1; x <= 1; x++)
+ draw_grid (mi, x, y);
+
+ if (bp->which_ship != -1)
+ {
+# ifdef USE_IPHONE
+ int rot = current_device_rotation();
+# endif
+
+ if (wire)
+ glColor3f (1, 0, 0);
+ else
+ {
+ glColor3f (0, 0, 0);
+
+ /* Draw into the depth buffer but not the frame buffer */
+ glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glClear (GL_DEPTH_BUFFER_BIT);
+ glEnable (GL_DEPTH_TEST);
+ }
+
+# ifdef USE_IPHONE
+ glRotatef (90, 0, 0, 1);
+ if (rot == 90 || rot == -270)
+ glRotatef (180, 0, 0, 1);
+# endif
+
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ glScalef (0.9, 0.9, 0.9);
+ glTranslatef (-0.5, 0, -0.2);
+
+# ifdef USE_IPHONE
+ if (rot == 0 || rot == 180 || rot == -180)
+ glScalef (1, 1, (GLfloat) MI_HEIGHT(mi) / MI_WIDTH(mi));
+ else
+# endif
+ glScalef (1, 1, (GLfloat) MI_WIDTH(mi) / MI_HEIGHT(mi));
+
+ /* Wave boat horizontally and vertically */
+ glTranslatef (cos ((double) bp->frames / 80 * M_PI * speed) / 200,
+ 0,
+ cos ((double) bp->frames / 60 * M_PI * speed) / 300);
+
+ glCallList (bp->dlists[bp->which_ship]);
+ mi->polygon_count += (*all_ships[bp->which_ship])->points / 3;
+ glPopMatrix();
+
+ /* Wave horizon vertically */
+ glTranslatef (0,
+ cos ((double) bp->frames / 120 * M_PI * speed) / 200,
+ 0);
+
+ if (! wire)
+ {
+ glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+
+ /* Black out everything that isn't a ship. */
+# if 0
+ glBegin (GL_QUADS);
+ glVertex3f (-1, -1, 0);
+ glVertex3f (-1, 1, 0);
+ glVertex3f ( 1, 1, 0);
+ glVertex3f ( 1, -1, 0);
+ glEnd();
+# else
+ {
+ GLfloat horizon = 0.15;
+
+ glColor3f (0.7, 0.7, 1.0);
+ glBegin (GL_QUADS);
+ glVertex3f (-1, -1, 0);
+ glVertex3f (-1, horizon, 0);
+ glVertex3f ( 1, horizon, 0);
+ glVertex3f ( 1, -1, 0);
+ glEnd();
+
+ glColor3f (0.0, 0.05, 0.2);
+ glBegin (GL_QUADS);
+ glVertex3f (-1, horizon, 0);
+ glVertex3f (-1, 1, 0);
+ glVertex3f ( 1, 1, 0);
+ glVertex3f ( 1, horizon, 0);
+ glEnd();
+ }
+# endif
+
+ glDisable (GL_DEPTH_TEST);
+ }
+ }
+
+ if (wire)
+ {
+ glColor3f(0,1,1);
+ glLineWidth(4);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-0.5, -0.5, 0);
+ glVertex3f(-0.5, 0.5, 0);
+ glVertex3f( 0.5, 0.5, 0);
+ glVertex3f( 0.5, -0.5, 0);
+ glEnd();
+ glLineWidth(1);
+ }
+
+ glPopMatrix ();
+
+ bp->frames++;
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_dazzle (ModeInfo *mi)
+{
+ dazzle_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (bp->nodes) free (bp->nodes);
+ if (bp->colors) free (bp->colors);
+ if (bp->dlists)
+ {
+ int i;
+ for (i = 0; i < countof(all_ships); i++)
+ glDeleteLists (bp->dlists[i], 1);
+ free (bp->dlists);
+ }
+}
+
+XSCREENSAVER_MODULE_2 ("RazzleDazzle", razzledazzle, dazzle)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/razzledazzle.man b/hacks/glx/razzledazzle.man
new file mode 100644
index 0000000..f4baef4
--- /dev/null
+++ b/hacks/glx/razzledazzle.man
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+razzledazzle - screen saver.
+.SH SYNOPSIS
+.B razzledazzle
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-density \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-mode \fIstring\fP]
+[\-fps]
+.SH DESCRIPTION
+Generates an infinitely-scrolling sequence of dazzle camouflage patterns.
+Dazzle Ships were military vessels during World War I and early in World
+War II that were painted not to conceal but to confuse: with these Cubist
+overlapping stripes, it was very hard to estimate their size, range and
+heading. This was a big deal before the invention of Radar.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-ncolors \fInumber\fP
+Colors. Default: 2.
+.TP 8
+.B \-density \fInumber\fP
+Thickness of the grid, and overall complexity. 1 - 10. Default: 5.0.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of the lines. 0.05 - 1.0. Default: 0.1.
+.TP 8
+.B \-mode \fIstring\fP
+Random, Ships or Flat. Default Random.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/robot-wireframe.c b/hacks/glx/robot-wireframe.c
new file mode 100644
index 0000000..1d7b0db
--- /dev/null
+++ b/hacks/glx/robot-wireframe.c
@@ -0,0 +1,154 @@
+/* Generated from "robot-wireframe.dxf" on Aug-22-2014.
+ Wireframe.
+ */
+
+#include "gllist.h"
+
+static const float robot_wireframe_data[] = {
+ 729.885788,421.399756,2459.256694,
+ 959.278463,553.839679,1921.436233,
+ 729.885788,421.399756,2824.242214,
+ -0,842.799512,2824.242214,
+ -0,842.799512,2824.242214,
+ -0,842.799512,2459.256694,
+ -0,842.799512,2459.256694,
+ 729.885788,421.399756,2459.256694,
+ 0,0,3212.282649,
+ -0,842.799512,2824.242214,
+ 665.532008,384.245084,587.016307,
+ -0,768.490168,587.016307,
+ 750.739667,433.439749,887.912962,
+ 0,866.879498,887.912962,
+ 690.700937,398.776372,934.321154,
+ 750.739667,433.439749,887.912962,
+ 959.278463,-553.839679,1921.436233,
+ 959.278463,553.839679,1921.436233,
+ 959.278463,553.839679,1921.436233,
+ 690.700937,398.776372,934.321154,
+ 690.700937,-398.776372,934.321154,
+ 690.700937,398.776372,934.321154,
+ 665.532008,-384.245084,587.016307,
+ 665.532008,384.245084,587.016307,
+ 750.739667,-433.439749,887.912962,
+ 750.739667,433.439749,887.912962,
+ 750.739667,433.439749,887.912962,
+ 665.532008,384.245084,587.016307,
+ -0,-797.552743,934.321154,
+ 690.700937,-398.776372,934.321154,
+ -0,-1107.679357,1921.436233,
+ 959.278463,-553.839679,1921.436233,
+ 959.278463,-553.839679,1921.436233,
+ 690.700937,-398.776372,934.321154,
+ 0,-866.879498,887.912962,
+ -0,-797.552743,934.321154,
+ -0,-797.552743,934.321154,
+ -0,-1107.679357,1921.436233,
+ 690.700937,-398.776372,934.321154,
+ 750.739667,-433.439749,887.912962,
+ 750.739667,-433.439749,887.912962,
+ 665.532008,-384.245084,587.016307,
+ 729.885788,421.399756,2824.242214,
+ 729.885788,421.399756,2459.256694,
+ 729.885788,421.399756,2459.256694,
+ 729.885788,-421.399756,2459.256694,
+ 729.885788,-421.399756,2824.242214,
+ 729.885788,421.399756,2824.242214,
+ 0,-866.879498,887.912962,
+ 750.739667,-433.439749,887.912962,
+ 0,-768.490168,587.016307,
+ 0,-866.879498,887.912962,
+ 0,-768.490168,587.016307,
+ 665.532008,-384.245084,587.016307,
+ 0,0,3212.282649,
+ 729.885788,-421.399756,2824.242214,
+ -0,-1107.679357,1921.436233,
+ 0,-842.799512,2459.256694,
+ 729.885788,-421.399756,2459.256694,
+ 959.278463,-553.839679,1921.436233,
+ 0,-842.799512,2824.242214,
+ 0,0,3212.282649,
+ 0,0,3212.282649,
+ 729.885788,421.399756,2824.242214,
+ 0,866.879498,887.912962,
+ -0,768.490168,587.016307,
+ 690.700937,398.776372,934.321154,
+ 0,797.552743,934.321154,
+ 0,797.552743,934.321154,
+ 0,866.879498,887.912962,
+ 959.278463,553.839679,1921.436233,
+ 0,1107.679357,1921.436233,
+ 0,1107.679357,1921.436233,
+ 0,797.552743,934.321154,
+ -0,842.799512,2459.256694,
+ 0,1107.679357,1921.436233,
+ -0,842.799512,2824.242214,
+ -729.885788,421.399756,2824.242214,
+ -729.885788,421.399756,2824.242214,
+ -729.885788,421.399756,2459.256694,
+ -729.885788,421.399756,2459.256694,
+ -0,842.799512,2459.256694,
+ 0,0,3212.282649,
+ -729.885788,421.399756,2824.242214,
+ -0,768.490168,587.016307,
+ -665.532008,384.245084,587.016307,
+ 0,866.879498,887.912962,
+ -750.739667,433.439749,887.912962,
+ -750.739667,433.439749,887.912962,
+ -665.532008,384.245084,587.016307,
+ 0,797.552743,934.321154,
+ -690.700937,398.776372,934.321154,
+ -690.700937,398.776372,934.321154,
+ -750.739667,433.439749,887.912962,
+ 0,1107.679357,1921.436233,
+ -959.278463,553.839679,1921.436233,
+ -959.278463,553.839679,1921.436233,
+ -690.700937,398.776372,934.321154,
+ -729.885788,421.399756,2459.256694,
+ -959.278463,553.839679,1921.436233,
+ -729.885788,421.399756,2824.242214,
+ -729.885788,-421.399756,2824.242214,
+ -729.885788,-421.399756,2824.242214,
+ -729.885788,-421.399756,2459.256694,
+ -729.885788,-421.399756,2459.256694,
+ -729.885788,421.399756,2459.256694,
+ 0,0,3212.282649,
+ -729.885788,-421.399756,2824.242214,
+ -665.532008,384.245084,587.016307,
+ -665.532008,-384.245084,587.016307,
+ -750.739667,433.439749,887.912962,
+ -750.739667,-433.439749,887.912962,
+ -750.739667,-433.439749,887.912962,
+ -665.532008,-384.245084,587.016307,
+ -690.700937,398.776372,934.321154,
+ -690.700937,-398.776372,934.321154,
+ -690.700937,-398.776372,934.321154,
+ -750.739667,-433.439749,887.912962,
+ -959.278463,553.839679,1921.436233,
+ -959.278463,-553.839679,1921.436233,
+ -959.278463,-553.839679,1921.436233,
+ -690.700937,-398.776372,934.321154,
+ -729.885788,-421.399756,2459.256694,
+ -959.278463,-553.839679,1921.436233,
+ -729.885788,-421.399756,2824.242214,
+ 0,-842.799512,2824.242214,
+ 0,-842.799512,2459.256694,
+ -729.885788,-421.399756,2459.256694,
+ -665.532008,-384.245084,587.016307,
+ 0,-768.490168,587.016307,
+ -750.739667,-433.439749,887.912962,
+ 0,-866.879498,887.912962,
+ -690.700937,-398.776372,934.321154,
+ -0,-797.552743,934.321154,
+ -959.278463,-553.839679,1921.436233,
+ -0,-1107.679357,1921.436233,
+ 0,-842.799512,2459.256694,
+ 0,-842.799512,2824.242214,
+ 0,-842.799512,2824.242214,
+ 729.885788,-421.399756,2824.242214,
+ 729.885788,-421.399756,2824.242214,
+ 729.885788,-421.399756,2459.256694,
+ 729.885788,-421.399756,2459.256694,
+ 0,-842.799512,2459.256694
+};
+static const struct gllist robot_wireframe_frame = { GL_V3F, GL_LINES, 144, robot_wireframe_data, 0 };
+const struct gllist *robot_wireframe = &robot_wireframe_frame;
diff --git a/hacks/glx/robot-wireframe.dxf b/hacks/glx/robot-wireframe.dxf
new file mode 100644
index 0000000..526e835
--- /dev/null
+++ b/hacks/glx/robot-wireframe.dxf
@@ -0,0 +1,1160 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+421.399755913295
+30
+2459.25669423824
+11
+959.278462610949
+21
+553.839678616242
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+421.399755913295
+30
+2824.24221446634
+11
+-1.80477854883065e-13
+21
+842.79951182659
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+842.79951182659
+30
+2824.24221446634
+11
+-1.80477854883065e-13
+21
+842.79951182659
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+842.79951182659
+30
+2459.25669423824
+11
+729.885787538951
+21
+421.399755913295
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+1.80477854883065e-13
+20
+1.40989300234651e-13
+30
+3212.28264895843
+11
+-1.80477854883065e-13
+21
+842.79951182659
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+665.532008182011
+20
+384.245084078196
+30
+587.016306884026
+11
+-1.80477854883065e-13
+21
+768.490168156393
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+750.739667090951
+20
+433.43974888629
+30
+887.912962275779
+11
+0.0
+21
+866.879497772581
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+690.700936565691
+20
+398.776371655728
+30
+934.321154257257
+11
+750.739667090951
+21
+433.43974888629
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+959.278462610949
+20
+-553.839678616242
+30
+1921.43623303429
+11
+959.278462610949
+21
+553.839678616242
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+959.278462610949
+20
+553.839678616242
+30
+1921.43623303429
+11
+690.700936565691
+21
+398.776371655728
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+690.700936565691
+20
+-398.776371655728
+30
+934.321154257257
+11
+690.700936565691
+21
+398.776371655728
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+665.532008182011
+20
+-384.245084078196
+30
+587.016306884026
+11
+665.532008182011
+21
+384.245084078196
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+750.739667090951
+20
+-433.43974888629
+30
+887.912962275779
+11
+750.739667090951
+21
+433.43974888629
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+750.739667090951
+20
+433.43974888629
+30
+887.912962275779
+11
+665.532008182011
+21
+384.245084078196
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+-797.552743311456
+30
+934.321154257257
+11
+690.700936565691
+21
+-398.776371655728
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+-1107.67935723248
+30
+1921.43623303429
+11
+959.278462610949
+21
+-553.839678616242
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+959.278462610949
+20
+-553.839678616242
+30
+1921.43623303429
+11
+690.700936565691
+21
+-398.776371655728
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-866.87949777258
+30
+887.912962275779
+11
+-1.80477854883065e-13
+21
+-797.552743311456
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+-797.552743311456
+30
+934.321154257257
+11
+-1.80477854883065e-13
+21
+-1107.67935723248
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+690.700936565691
+20
+-398.776371655728
+30
+934.321154257257
+11
+750.739667090951
+21
+-433.43974888629
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+750.739667090951
+20
+-433.43974888629
+30
+887.912962275779
+11
+665.532008182011
+21
+-384.245084078196
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+421.399755913295
+30
+2824.24221446634
+11
+729.885787538951
+21
+421.399755913295
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+421.399755913295
+30
+2459.25669423824
+11
+729.885787538951
+21
+-421.399755913295
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+-421.399755913295
+30
+2824.24221446634
+11
+729.885787538951
+21
+421.399755913295
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-866.87949777258
+30
+887.912962275779
+11
+750.739667090951
+21
+-433.43974888629
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-768.490168156392
+30
+587.016306884026
+11
+0.0
+21
+-866.87949777258
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-768.490168156392
+30
+587.016306884026
+11
+665.532008182011
+21
+-384.245084078196
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+1.80477854883065e-13
+20
+1.40989300234651e-13
+30
+3212.28264895843
+11
+729.885787538951
+21
+-421.399755913295
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+-1107.67935723248
+30
+1921.43623303429
+11
+0.0
+21
+-842.79951182659
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+-421.399755913295
+30
+2459.25669423824
+11
+959.278462610949
+21
+-553.839678616242
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-842.79951182659
+30
+2824.24221446634
+11
+1.80477854883065e-13
+21
+1.40989300234651e-13
+31
+3212.28264895843
+ 0
+LINE
+ 8
+Layer0
+10
+1.80477854883065e-13
+20
+1.40989300234651e-13
+30
+3212.28264895843
+11
+729.885787538951
+21
+421.399755913295
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+866.879497772581
+30
+887.912962275779
+11
+-1.80477854883065e-13
+21
+768.490168156393
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+690.700936565691
+20
+398.776371655728
+30
+934.321154257257
+11
+0.0
+21
+797.552743311456
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+797.552743311456
+30
+934.321154257257
+11
+0.0
+21
+866.879497772581
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+959.278462610949
+20
+553.839678616242
+30
+1921.43623303429
+11
+0.0
+21
+1107.67935723248
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+1107.67935723248
+30
+1921.43623303429
+11
+0.0
+21
+797.552743311456
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+842.79951182659
+30
+2459.25669423824
+11
+0.0
+21
+1107.67935723248
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+842.79951182659
+30
+2824.24221446634
+11
+-729.88578753895
+21
+421.399755913295
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+421.399755913295
+30
+2824.24221446634
+11
+-729.88578753895
+21
+421.399755913295
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+421.399755913295
+30
+2459.25669423824
+11
+-1.80477854883065e-13
+21
+842.79951182659
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+1.80477854883065e-13
+20
+1.40989300234651e-13
+30
+3212.28264895843
+11
+-729.88578753895
+21
+421.399755913295
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+-1.80477854883065e-13
+20
+768.490168156393
+30
+587.016306884026
+11
+-665.532008182011
+21
+384.245084078197
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+866.879497772581
+30
+887.912962275779
+11
+-750.739667090951
+21
+433.439748886291
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+-750.739667090951
+20
+433.439748886291
+30
+887.912962275779
+11
+-665.532008182011
+21
+384.245084078197
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+797.552743311456
+30
+934.321154257257
+11
+-690.700936565691
+21
+398.776371655728
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-690.700936565691
+20
+398.776371655728
+30
+934.321154257257
+11
+-750.739667090951
+21
+433.439748886291
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+1107.67935723248
+30
+1921.43623303429
+11
+-959.278462610949
+21
+553.839678616243
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+-959.278462610949
+20
+553.839678616243
+30
+1921.43623303429
+11
+-690.700936565691
+21
+398.776371655728
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+421.399755913295
+30
+2459.25669423824
+11
+-959.278462610949
+21
+553.839678616243
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+421.399755913295
+30
+2824.24221446634
+11
+-729.88578753895
+21
+-421.399755913294
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+-421.399755913294
+30
+2824.24221446634
+11
+-729.88578753895
+21
+-421.399755913294
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+-421.399755913294
+30
+2459.25669423824
+11
+-729.88578753895
+21
+421.399755913295
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+1.80477854883065e-13
+20
+1.40989300234651e-13
+30
+3212.28264895843
+11
+-729.88578753895
+21
+-421.399755913294
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+-665.532008182011
+20
+384.245084078197
+30
+587.016306884026
+11
+-665.532008182012
+21
+-384.245084078196
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+-750.739667090951
+20
+433.439748886291
+30
+887.912962275779
+11
+-750.739667090951
+21
+-433.43974888629
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+-750.739667090951
+20
+-433.43974888629
+30
+887.912962275779
+11
+-665.532008182012
+21
+-384.245084078196
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+-690.700936565691
+20
+398.776371655728
+30
+934.321154257257
+11
+-690.700936565691
+21
+-398.776371655727
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-690.700936565691
+20
+-398.776371655727
+30
+934.321154257257
+11
+-750.739667090951
+21
+-433.43974888629
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+-959.278462610949
+20
+553.839678616243
+30
+1921.43623303429
+11
+-959.27846261095
+21
+-553.839678616242
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+-959.27846261095
+20
+-553.839678616242
+30
+1921.43623303429
+11
+-690.700936565691
+21
+-398.776371655727
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+-421.399755913294
+30
+2459.25669423824
+11
+-959.27846261095
+21
+-553.839678616242
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+-729.88578753895
+20
+-421.399755913294
+30
+2824.24221446634
+11
+0.0
+21
+-842.79951182659
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-842.79951182659
+30
+2459.25669423824
+11
+-729.88578753895
+21
+-421.399755913294
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+-665.532008182012
+20
+-384.245084078196
+30
+587.016306884026
+11
+0.0
+21
+-768.490168156392
+31
+587.016306884026
+ 0
+LINE
+ 8
+Layer0
+10
+-750.739667090951
+20
+-433.43974888629
+30
+887.912962275779
+11
+0.0
+21
+-866.87949777258
+31
+887.912962275779
+ 0
+LINE
+ 8
+Layer0
+10
+-690.700936565691
+20
+-398.776371655727
+30
+934.321154257257
+11
+-1.80477854883065e-13
+21
+-797.552743311456
+31
+934.321154257257
+ 0
+LINE
+ 8
+Layer0
+10
+-959.27846261095
+20
+-553.839678616242
+30
+1921.43623303429
+11
+-1.80477854883065e-13
+21
+-1107.67935723248
+31
+1921.43623303429
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-842.79951182659
+30
+2459.25669423824
+11
+0.0
+21
+-842.79951182659
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+0.0
+20
+-842.79951182659
+30
+2824.24221446634
+11
+729.885787538951
+21
+-421.399755913295
+31
+2824.24221446634
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+-421.399755913295
+30
+2824.24221446634
+11
+729.885787538951
+21
+-421.399755913295
+31
+2459.25669423824
+ 0
+LINE
+ 8
+Layer0
+10
+729.885787538951
+20
+-421.399755913295
+30
+2459.25669423824
+11
+0.0
+21
+-842.79951182659
+31
+2459.25669423824
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/hacks/glx/robot.c b/hacks/glx/robot.c
new file mode 100644
index 0000000..84ee59b
--- /dev/null
+++ b/hacks/glx/robot.c
@@ -0,0 +1,18539 @@
+/* Generated from "robot.dxf" on Aug-22-2014.
+ Smoothed vertex normals.
+ Components: arm_half, body_half_inside, body_half_outside, crank_full,
+ gearbox_half, hand_half, leg_half, rotator_half.
+ */
+
+#include "gllist.h"
+
+static const float robot_arm_half_data[] = {
+ 0.906212,-0.041413,0.420791,1080.0746,-794.16656,2070.082615,
+ 0.825188,-0.112749,0.553491,1071.440608,-804.05311,2084.867737,
+ 0.920546,-0.079115,0.382538,1080.0746,-800.976533,2069.412397,
+ 0.825188,-0.112749,0.553491,1071.440608,-804.05311,2084.867737,
+ 0.906212,-0.041413,0.420791,1080.0746,-794.16656,2070.082615,
+ 0.804658,-0.058153,0.590884,1071.440608,-794.16656,2085.840744,
+ 0.804658,-0.058153,0.590884,1071.440608,-794.16656,2085.840744,
+ 0.712409,-0.124297,0.690669,1059.821204,-806.749751,2098.414453,
+ 0.825188,-0.112749,0.553491,1071.440608,-804.05311,2084.867737,
+ 0.712409,-0.124297,0.690669,1059.821204,-806.749751,2098.414453,
+ 0.804658,-0.058153,0.590884,1071.440608,-794.16656,2085.840744,
+ 0.67288,-0.072454,0.736195,1059.821204,-794.16656,2099.652855,
+ 0.573227,-0.159742,0.803675,1045.662989,-808.962833,2109.531981,
+ 0.67288,-0.072454,0.736195,1059.821204,-794.16656,2099.652855,
+ 0.516952,-0.083841,0.851898,1045.662989,-794.16656,2110.988188,
+ 0.67288,-0.072454,0.736195,1059.821204,-794.16656,2099.652855,
+ 0.573227,-0.159742,0.803675,1045.662989,-808.962833,2109.531981,
+ 0.712409,-0.124297,0.690669,1059.821204,-806.749751,2098.414453,
+ 0.404534,-0.178287,0.896976,1029.509968,-810.607297,2117.793029,
+ 0.516952,-0.083841,0.851898,1045.662989,-794.16656,2110.988188,
+ 0.343284,-0.091992,0.934716,1029.509968,-794.16656,2119.41108,
+ 0.516952,-0.083841,0.851898,1045.662989,-794.16656,2110.988188,
+ 0.404534,-0.178287,0.896976,1029.509968,-810.607297,2117.793029,
+ 0.573227,-0.159742,0.803675,1045.662989,-808.962833,2109.531981,
+ 0.221931,-0.19009,0.956354,1011.982852,-811.619949,2122.880135,
+ 0.343284,-0.091992,0.934716,1029.509968,-794.16656,2119.41108,
+ 0.158161,-0.096711,0.982666,1011.982852,-794.16656,2124.597848,
+ 0.343284,-0.091992,0.934716,1029.509968,-794.16656,2119.41108,
+ 0.221931,-0.19009,0.956354,1011.982852,-811.619949,2122.880135,
+ 0.404534,-0.178287,0.896976,1029.509968,-810.607297,2117.793029,
+ 0.095481,-0.194061,0.976332,993.755282,-811.961287,2124.594866,
+ 0.158161,-0.096711,0.982666,1011.982852,-794.16656,2124.597848,
+ 0.095023,-0.097501,0.990689,993.755282,-794.16656,2126.346173,
+ 0.158161,-0.096711,0.982666,1011.982852,-794.16656,2124.597848,
+ 0.095481,-0.194061,0.976332,993.755282,-811.961287,2124.594866,
+ 0.221931,-0.19009,0.956354,1011.982852,-811.619949,2122.880135,
+ 0,-0.162686,0.986678,947.039602,-835.292444,2241.800118,
+ 0,-0.097944,0.995192,993.755282,-794.16656,2245.847611,
+ 0,-0.097944,0.995192,947.039602,-794.16656,2245.847611,
+ 0,-0.097944,0.995192,993.755282,-794.16656,2245.847611,
+ 0,-0.162686,0.986678,947.039602,-835.292444,2241.800118,
+ 0,-0.227008,0.973893,993.755282,-835.292444,2241.800118,
+ -0.698037,-0.116492,0.706522,947.039602,-835.292444,2241.800118,
+ -0.696496,-0.070281,0.71411,900.323922,-794.16656,2200.284205,
+ -0.698044,-0.162549,0.697361,900.323922,-826.396761,2197.1122,
+ -0.696496,-0.070281,0.71411,900.323922,-794.16656,2200.284205,
+ -0.698037,-0.116492,0.706522,947.039602,-835.292444,2241.800118,
+ -0.696496,-0.070281,0.71411,947.039602,-794.16656,2245.847611,
+ 0.696496,-0.070281,0.71411,900.323922,-794.16656,2200.284205,
+ 0.698037,-0.116492,0.706522,853.608242,-835.292444,2241.800118,
+ 0.698044,-0.162549,0.697361,900.323922,-826.396761,2197.1122,
+ 0.698037,-0.116492,0.706522,853.608242,-835.292444,2241.800118,
+ 0.696496,-0.070281,0.71411,900.323922,-794.16656,2200.284205,
+ 0.696496,-0.070281,0.71411,853.608242,-794.16656,2245.847611,
+ -0.698037,-0.116492,0.706522,853.608242,-835.292444,2241.800118,
+ -0.696496,-0.070281,0.71411,806.892562,-794.16656,2200.284205,
+ -0.698044,-0.162549,0.697361,806.892562,-826.396761,2197.1122,
+ -0.696496,-0.070281,0.71411,806.892562,-794.16656,2200.284205,
+ -0.698037,-0.116492,0.706522,853.608242,-835.292444,2241.800118,
+ -0.696496,-0.070281,0.71411,853.608242,-794.16656,2245.847611,
+ 0.696496,-0.070281,0.71411,806.892562,-794.16656,2200.284205,
+ 0.698037,-0.116492,0.706522,760.176882,-835.292444,2241.800118,
+ 0.698044,-0.162549,0.697361,806.892562,-826.396761,2197.1122,
+ 0.698037,-0.116492,0.706522,760.176882,-835.292444,2241.800118,
+ 0.696496,-0.070281,0.71411,806.892562,-794.16656,2200.284205,
+ 0.696496,-0.070281,0.71411,760.176882,-794.16656,2245.847611,
+ -0.698037,-0.116492,0.706522,760.176882,-835.292444,2241.800118,
+ -0.696496,-0.070281,0.71411,713.461202,-794.16656,2200.284205,
+ -0.698044,-0.162549,0.697361,713.461202,-826.396761,2197.1122,
+ -0.696496,-0.070281,0.71411,713.461202,-794.16656,2200.284205,
+ -0.698037,-0.116492,0.706522,760.176882,-835.292444,2241.800118,
+ -0.696496,-0.070281,0.71411,760.176882,-794.16656,2245.847611,
+ 0.696496,-0.070281,0.71411,713.461202,-794.16656,2200.284205,
+ 0.698037,-0.116492,0.706522,666.745522,-835.292444,2241.800118,
+ 0.698044,-0.162549,0.697361,713.461202,-826.396761,2197.1122,
+ 0.698037,-0.116492,0.706522,666.745522,-835.292444,2241.800118,
+ 0.696496,-0.070281,0.71411,713.461202,-794.16656,2200.284205,
+ 0.696496,-0.070281,0.71411,666.745522,-794.16656,2245.847611,
+ 0,-0.162686,0.986678,635.537065,-835.292444,2241.800118,
+ 0,-0.097944,0.995192,666.745522,-794.16656,2245.847611,
+ 0,-0.097944,0.995192,635.537065,-794.16656,2245.847611,
+ 0,-0.097944,0.995192,666.745522,-794.16656,2245.847611,
+ 0,-0.162686,0.986678,635.537065,-835.292444,2241.800118,
+ 0,-0.227008,0.973893,666.745522,-835.292444,2241.800118,
+ 0,-0.162686,0.986678,200.646178,-826.396761,2197.1122,
+ 0,-0.097944,0.995192,635.537065,-794.16656,2200.284205,
+ 0,-0.097944,0.995192,200.646178,-794.16656,2200.284205,
+ 0,-0.097944,0.995192,635.537065,-794.16656,2200.284205,
+ 0,-0.162686,0.986678,200.646178,-826.396761,2197.1122,
+ 0,-0.227008,0.973893,635.537065,-826.396761,2197.1122,
+ 0,-0.162686,0.986678,97.301517,-810.693775,2118.227454,
+ 0,-0.097944,0.995192,200.646178,-794.16656,2119.854015,
+ 0,-0.097944,0.995192,97.301517,-794.16656,2119.854015,
+ 0,-0.097944,0.995192,200.646178,-794.16656,2119.854015,
+ 0,-0.162686,0.986678,97.301517,-810.693775,2118.227454,
+ 0,-0.227008,0.973893,200.646178,-810.693775,2118.227454,
+ 0,-0.162686,0.986678,45.307526,-820.853629,2169.265997,
+ 0,-0.097944,0.995192,97.301517,-794.16656,2171.892463,
+ 0,-0.097944,0.995192,45.307526,-794.16656,2171.892463,
+ 0,-0.097944,0.995192,97.301517,-794.16656,2171.892463,
+ 0,-0.162686,0.986678,45.307526,-820.853629,2169.265997,
+ 0,-0.227008,0.973893,97.301517,-820.853629,2169.265997,
+ 0.972352,-0.022872,0.232398,1085.391405,-794.16656,2052.984082,
+ 0.920546,-0.079115,0.382538,1080.0746,-800.976533,2069.412397,
+ 0.975625,-0.048525,0.214014,1085.391405,-797.638259,2052.642407,
+ 0.920546,-0.079115,0.382538,1080.0746,-800.976533,2069.412397,
+ 0.972352,-0.022872,0.232398,1085.391405,-794.16656,2052.984082,
+ 0.906212,-0.041413,0.420791,1080.0746,-794.16656,2070.082615,
+ 0.920546,-0.079115,0.382538,1080.0746,-800.976533,2069.412397,
+ 0.82521,-0.218488,0.520857,1071.440608,-813.559725,2081.986111,
+ 0.920558,-0.152171,0.359746,1080.0746,-807.524802,2067.427498,
+ 0.82521,-0.218488,0.520857,1071.440608,-813.559725,2081.986111,
+ 0.920546,-0.079115,0.382538,1080.0746,-800.976533,2069.412397,
+ 0.825188,-0.112749,0.553491,1071.440608,-804.05311,2084.867737,
+ 0.825188,-0.112749,0.553491,1071.440608,-804.05311,2084.867737,
+ 0.698346,-0.251899,0.66997,1059.821204,-818.849378,2094.746838,
+ 0.82521,-0.218488,0.520857,1071.440608,-813.559725,2081.986111,
+ 0.698346,-0.251899,0.66997,1059.821204,-818.849378,2094.746838,
+ 0.825188,-0.112749,0.553491,1071.440608,-804.05311,2084.867737,
+ 0.712409,-0.124297,0.690669,1059.821204,-806.749751,2098.414453,
+ 0.573227,-0.159742,0.803675,1045.662989,-808.962833,2109.531981,
+ 0.698346,-0.251899,0.66997,1059.821204,-818.849378,2094.746838,
+ 0.712409,-0.124297,0.690669,1059.821204,-806.749751,2098.414453,
+ 0.698346,-0.251899,0.66997,1059.821204,-818.849378,2094.746838,
+ 0.573227,-0.159742,0.803675,1045.662989,-808.962833,2109.531981,
+ 0.546331,-0.318715,0.77456,1045.662989,-823.190494,2105.21932,
+ 0.404534,-0.178287,0.896976,1029.509968,-810.607297,2117.793029,
+ 0.546331,-0.318715,0.77456,1045.662989,-823.190494,2105.21932,
+ 0.573227,-0.159742,0.803675,1045.662989,-808.962833,2109.531981,
+ 0.546331,-0.318715,0.77456,1045.662989,-823.190494,2105.21932,
+ 0.404534,-0.178287,0.896976,1029.509968,-810.607297,2117.793029,
+ 0.374869,-0.353462,0.857052,1029.509968,-826.416226,2113.001057,
+ 0.221931,-0.19009,0.956354,1011.982852,-811.619949,2122.880135,
+ 0.374869,-0.353462,0.857052,1029.509968,-826.416226,2113.001057,
+ 0.404534,-0.178287,0.896976,1029.509968,-810.607297,2117.793029,
+ 0.374869,-0.353462,0.857052,1029.509968,-826.416226,2113.001057,
+ 0.221931,-0.19009,0.956354,1011.982852,-811.619949,2122.880135,
+ 0.190537,-0.374884,0.90728,1011.982852,-828.402613,2117.793006,
+ 0.095481,-0.194061,0.976332,993.755282,-811.961287,2124.594866,
+ 0.190537,-0.374884,0.90728,1011.982852,-828.402613,2117.793006,
+ 0.221931,-0.19009,0.956354,1011.982852,-811.619949,2122.880135,
+ 0.190537,-0.374884,0.90728,1011.982852,-828.402613,2117.793006,
+ 0.095481,-0.194061,0.976332,993.755282,-811.961287,2124.594866,
+ 0.095439,-0.410655,0.906782,993.755282,-829.072173,2119.408248,
+ 0,-0.351934,0.936025,947.039602,-874.837884,2229.81318,
+ 0,-0.227008,0.973893,993.755282,-835.292444,2241.800118,
+ 0,-0.162686,0.986678,947.039602,-835.292444,2241.800118,
+ 0,-0.227008,0.973893,993.755282,-835.292444,2241.800118,
+ 0,-0.351934,0.936025,947.039602,-874.837884,2229.81318,
+ 0,-0.412538,0.91094,993.755282,-874.837884,2229.81318,
+ -0.698064,-0.251996,0.670228,947.039602,-874.837884,2229.81318,
+ -0.698044,-0.162549,0.697361,900.323922,-826.396761,2197.1122,
+ -0.698076,-0.295386,0.652255,900.323922,-857.388373,2187.718082,
+ -0.698044,-0.162549,0.697361,900.323922,-826.396761,2197.1122,
+ -0.698064,-0.251996,0.670228,947.039602,-874.837884,2229.81318,
+ -0.698037,-0.116492,0.706522,947.039602,-835.292444,2241.800118,
+ 0.698044,-0.162549,0.697361,900.323922,-826.396761,2197.1122,
+ 0.698064,-0.251996,0.670228,853.608242,-874.837884,2229.81318,
+ 0.698076,-0.295386,0.652255,900.323922,-857.388373,2187.718082,
+ 0.698064,-0.251996,0.670228,853.608242,-874.837884,2229.81318,
+ 0.698044,-0.162549,0.697361,900.323922,-826.396761,2197.1122,
+ 0.698037,-0.116492,0.706522,853.608242,-835.292444,2241.800118,
+ -0.698064,-0.251996,0.670228,853.608242,-874.837884,2229.81318,
+ -0.698044,-0.162549,0.697361,806.892562,-826.396761,2197.1122,
+ -0.698076,-0.295386,0.652255,806.892562,-857.388373,2187.718082,
+ -0.698044,-0.162549,0.697361,806.892562,-826.396761,2197.1122,
+ -0.698064,-0.251996,0.670228,853.608242,-874.837884,2229.81318,
+ -0.698037,-0.116492,0.706522,853.608242,-835.292444,2241.800118,
+ 0.698044,-0.162549,0.697361,806.892562,-826.396761,2197.1122,
+ 0.698064,-0.251996,0.670228,760.176882,-874.837884,2229.81318,
+ 0.698076,-0.295386,0.652255,806.892562,-857.388373,2187.718082,
+ 0.698064,-0.251996,0.670228,760.176882,-874.837884,2229.81318,
+ 0.698044,-0.162549,0.697361,806.892562,-826.396761,2197.1122,
+ 0.698037,-0.116492,0.706522,760.176882,-835.292444,2241.800118,
+ -0.698064,-0.251996,0.670228,760.176882,-874.837884,2229.81318,
+ -0.698044,-0.162549,0.697361,713.461202,-826.396761,2197.1122,
+ -0.698076,-0.295386,0.652255,713.461202,-857.388373,2187.718082,
+ -0.698044,-0.162549,0.697361,713.461202,-826.396761,2197.1122,
+ -0.698064,-0.251996,0.670228,760.176882,-874.837884,2229.81318,
+ -0.698037,-0.116492,0.706522,760.176882,-835.292444,2241.800118,
+ 0.698044,-0.162549,0.697361,713.461202,-826.396761,2197.1122,
+ 0.698064,-0.251996,0.670228,666.745522,-874.837884,2229.81318,
+ 0.698076,-0.295386,0.652255,713.461202,-857.388373,2187.718082,
+ 0.698064,-0.251996,0.670228,666.745522,-874.837884,2229.81318,
+ 0.698044,-0.162549,0.697361,713.461202,-826.396761,2197.1122,
+ 0.698037,-0.116492,0.706522,666.745522,-835.292444,2241.800118,
+ 0,-0.351934,0.936025,635.537065,-874.837884,2229.81318,
+ 0,-0.227008,0.973893,666.745522,-835.292444,2241.800118,
+ 0,-0.162686,0.986678,635.537065,-835.292444,2241.800118,
+ 0,-0.227008,0.973893,666.745522,-835.292444,2241.800118,
+ 0,-0.351934,0.936025,635.537065,-874.837884,2229.81318,
+ 0,-0.412538,0.91094,666.745522,-874.837884,2229.81318,
+ 0,-0.351934,0.936025,200.646178,-857.388373,2187.718082,
+ 0,-0.227008,0.973893,635.537065,-826.396761,2197.1122,
+ 0,-0.162686,0.986678,200.646178,-826.396761,2197.1122,
+ 0,-0.227008,0.973893,635.537065,-826.396761,2197.1122,
+ 0,-0.351934,0.936025,200.646178,-857.388373,2187.718082,
+ 0,-0.412538,0.91094,635.537065,-857.388373,2187.718082,
+ 0,-0.351934,0.936025,97.301517,-826.585858,2113.410276,
+ 0,-0.227008,0.973893,200.646178,-810.693775,2118.227454,
+ 0,-0.162686,0.986678,97.301517,-810.693775,2118.227454,
+ 0,-0.227008,0.973893,200.646178,-810.693775,2118.227454,
+ 0,-0.351934,0.936025,97.301517,-826.585858,2113.410276,
+ 0,-0.412538,0.91094,200.646178,-826.585858,2113.410276,
+ 0,-0.351934,0.936025,45.307526,-846.515129,2161.487533,
+ 0,-0.227008,0.973893,97.301517,-820.853629,2169.265997,
+ 0,-0.162686,0.986678,45.307526,-820.853629,2169.265997,
+ 0,-0.227008,0.973893,97.301517,-820.853629,2169.265997,
+ 0,-0.351934,0.936025,45.307526,-846.515129,2161.487533,
+ 0,-0.412538,0.91094,97.301517,-846.515129,2161.487533,
+ 0.975625,-0.048525,0.214014,1085.391405,-797.638259,2052.642407,
+ 0.920558,-0.152171,0.359746,1080.0746,-807.524802,2067.427498,
+ 0.975629,-0.089314,0.200429,1085.391405,-800.976542,2051.630513,
+ 0.920558,-0.152171,0.359746,1080.0746,-807.524802,2067.427498,
+ 0.975625,-0.048525,0.214014,1085.391405,-797.638259,2052.642407,
+ 0.920546,-0.079115,0.382538,1080.0746,-800.976533,2069.412397,
+ 0.920558,-0.152171,0.359746,1080.0746,-807.524802,2067.427498,
+ 0.825241,-0.315841,0.468211,1071.440608,-822.321072,2077.306602,
+ 0.920575,-0.219382,0.323131,1080.0746,-813.559722,2064.204197,
+ 0.825241,-0.315841,0.468211,1071.440608,-822.321072,2077.306602,
+ 0.920558,-0.152171,0.359746,1080.0746,-807.524802,2067.427498,
+ 0.82521,-0.218488,0.520857,1071.440608,-813.559725,2081.986111,
+ 0.82521,-0.218488,0.520857,1071.440608,-813.559725,2081.986111,
+ 0.688423,-0.395152,0.608218,1059.821204,-830.000457,2088.790953,
+ 0.825241,-0.315841,0.468211,1071.440608,-822.321072,2077.306602,
+ 0.688423,-0.395152,0.608218,1059.821204,-830.000457,2088.790953,
+ 0.82521,-0.218488,0.520857,1071.440608,-813.559725,2081.986111,
+ 0.698346,-0.251899,0.66997,1059.821204,-818.849378,2094.746838,
+ 0.546331,-0.318715,0.77456,1045.662989,-823.190494,2105.21932,
+ 0.688423,-0.395152,0.608218,1059.821204,-830.000457,2088.790953,
+ 0.698346,-0.251899,0.66997,1059.821204,-818.849378,2094.746838,
+ 0.688423,-0.395152,0.608218,1059.821204,-830.000457,2088.790953,
+ 0.546331,-0.318715,0.77456,1045.662989,-823.190494,2105.21932,
+ 0.529849,-0.456252,0.714909,1045.662989,-836.302781,2098.215938,
+ 0.374869,-0.353462,0.857052,1029.509968,-826.416226,2113.001057,
+ 0.529849,-0.456252,0.714909,1045.662989,-836.302781,2098.215938,
+ 0.546331,-0.318715,0.77456,1045.662989,-823.190494,2105.21932,
+ 0.529849,-0.456252,0.714909,1045.662989,-836.302781,2098.215938,
+ 0.374869,-0.353462,0.857052,1029.509968,-826.416226,2113.001057,
+ 0.374908,-0.513801,0.771655,1029.509968,-840.985818,2105.219317,
+ 0.190537,-0.374884,0.90728,1011.982852,-828.402613,2117.793006,
+ 0.374908,-0.513801,0.771655,1029.509968,-840.985818,2105.219317,
+ 0.374869,-0.353462,0.857052,1029.509968,-826.416226,2113.001057,
+ 0.374908,-0.513801,0.771655,1029.509968,-840.985818,2105.219317,
+ 0.190537,-0.374884,0.90728,1011.982852,-828.402613,2117.793006,
+ 0.190559,-0.544614,0.816751,1011.982852,-843.869605,2109.531957,
+ 0.095439,-0.410655,0.906782,993.755282,-829.072173,2119.408248,
+ 0.190559,-0.544614,0.816751,1011.982852,-843.869605,2109.531957,
+ 0.190537,-0.374884,0.90728,1011.982852,-828.402613,2117.793006,
+ 0.190559,-0.544614,0.816751,1011.982852,-843.869605,2109.531957,
+ 0.095439,-0.410655,0.906782,993.755282,-829.072173,2119.408248,
+ 0.095452,-0.57961,0.809284,993.755282,-844.841655,2110.985636,
+ 0,-0.527706,0.849427,947.039602,-911.28317,2210.34745,
+ 0,-0.412538,0.91094,993.755282,-874.837884,2229.81318,
+ 0,-0.351934,0.936025,947.039602,-874.837884,2229.81318,
+ 0,-0.412538,0.91094,993.755282,-874.837884,2229.81318,
+ 0,-0.527706,0.849427,947.039602,-911.28317,2210.34745,
+ 0,-0.582269,0.812996,993.755282,-911.28317,2210.34745,
+ -0.698105,-0.377833,0.608187,947.039602,-911.28317,2210.34745,
+ -0.698076,-0.295386,0.652255,900.323922,-857.388373,2187.718082,
+ -0.698122,-0.416891,0.58209,900.323922,-885.950406,2172.462863,
+ -0.698076,-0.295386,0.652255,900.323922,-857.388373,2187.718082,
+ -0.698105,-0.377833,0.608187,947.039602,-911.28317,2210.34745,
+ -0.698064,-0.251996,0.670228,947.039602,-874.837884,2229.81318,
+ 0.698076,-0.295386,0.652255,900.323922,-857.388373,2187.718082,
+ 0.698105,-0.377833,0.608187,853.608242,-911.28317,2210.34745,
+ 0.698122,-0.416891,0.58209,900.323922,-885.950406,2172.462863,
+ 0.698105,-0.377833,0.608187,853.608242,-911.28317,2210.34745,
+ 0.698076,-0.295386,0.652255,900.323922,-857.388373,2187.718082,
+ 0.698064,-0.251996,0.670228,853.608242,-874.837884,2229.81318,
+ -0.698105,-0.377833,0.608187,853.608242,-911.28317,2210.34745,
+ -0.698076,-0.295386,0.652255,806.892562,-857.388373,2187.718082,
+ -0.698122,-0.416891,0.58209,806.892562,-885.950406,2172.462863,
+ -0.698076,-0.295386,0.652255,806.892562,-857.388373,2187.718082,
+ -0.698105,-0.377833,0.608187,853.608242,-911.28317,2210.34745,
+ -0.698064,-0.251996,0.670228,853.608242,-874.837884,2229.81318,
+ 0.698076,-0.295386,0.652255,806.892562,-857.388373,2187.718082,
+ 0.698105,-0.377833,0.608187,760.176882,-911.28317,2210.34745,
+ 0.698122,-0.416891,0.58209,806.892562,-885.950406,2172.462863,
+ 0.698105,-0.377833,0.608187,760.176882,-911.28317,2210.34745,
+ 0.698076,-0.295386,0.652255,806.892562,-857.388373,2187.718082,
+ 0.698064,-0.251996,0.670228,760.176882,-874.837884,2229.81318,
+ -0.698105,-0.377833,0.608187,760.176882,-911.28317,2210.34745,
+ -0.698076,-0.295386,0.652255,713.461202,-857.388373,2187.718082,
+ -0.698122,-0.416891,0.58209,713.461202,-885.950406,2172.462863,
+ -0.698076,-0.295386,0.652255,713.461202,-857.388373,2187.718082,
+ -0.698105,-0.377833,0.608187,760.176882,-911.28317,2210.34745,
+ -0.698064,-0.251996,0.670228,760.176882,-874.837884,2229.81318,
+ 0.698076,-0.295386,0.652255,713.461202,-857.388373,2187.718082,
+ 0.698105,-0.377833,0.608187,666.745522,-911.28317,2210.34745,
+ 0.698122,-0.416891,0.58209,713.461202,-885.950406,2172.462863,
+ 0.698105,-0.377833,0.608187,666.745522,-911.28317,2210.34745,
+ 0.698076,-0.295386,0.652255,713.461202,-857.388373,2187.718082,
+ 0.698064,-0.251996,0.670228,666.745522,-874.837884,2229.81318,
+ 0,-0.527706,0.849427,635.537065,-911.28317,2210.34745,
+ 0,-0.412538,0.91094,666.745522,-874.837884,2229.81318,
+ 0,-0.351934,0.936025,635.537065,-874.837884,2229.81318,
+ 0,-0.412538,0.91094,666.745522,-874.837884,2229.81318,
+ 0,-0.527706,0.849427,635.537065,-911.28317,2210.34745,
+ 0,-0.582269,0.812996,666.745522,-911.28317,2210.34745,
+ 0,-0.527706,0.849427,200.646178,-885.950406,2172.462863,
+ 0,-0.412538,0.91094,635.537065,-857.388373,2187.718082,
+ 0,-0.351934,0.936025,200.646178,-857.388373,2187.718082,
+ 0,-0.412538,0.91094,635.537065,-857.388373,2187.718082,
+ 0,-0.527706,0.849427,200.646178,-885.950406,2172.462863,
+ 0,-0.582269,0.812996,635.537065,-885.950406,2172.462863,
+ 0,-0.527706,0.849427,97.301517,-841.232085,2105.587604,
+ 0,-0.412538,0.91094,200.646178,-826.585858,2113.410276,
+ 0,-0.351934,0.936025,97.301517,-826.585858,2113.410276,
+ 0,-0.412538,0.91094,200.646178,-826.585858,2113.410276,
+ 0,-0.527706,0.849427,97.301517,-841.232085,2105.587604,
+ 0,-0.582269,0.812996,200.646178,-841.232085,2105.587604,
+ 0,-0.527706,0.849427,45.307526,-870.164903,2148.855992,
+ 0,-0.412538,0.91094,97.301517,-846.515129,2161.487533,
+ 0,-0.351934,0.936025,45.307526,-846.515129,2161.487533,
+ 0,-0.412538,0.91094,97.301517,-846.515129,2161.487533,
+ 0,-0.527706,0.849427,45.307526,-870.164903,2148.855992,
+ 0,-0.582269,0.812996,97.301517,-870.164903,2148.855992,
+ 0.975629,-0.089314,0.200429,1085.391405,-800.976542,2051.630513,
+ 0.920575,-0.219382,0.323131,1080.0746,-813.559722,2064.204197,
+ 0.975635,-0.126671,0.179142,1085.391405,-804.053121,2049.987287,
+ 0.920575,-0.219382,0.323131,1080.0746,-813.559722,2064.204197,
+ 0.975629,-0.089314,0.200429,1085.391405,-800.976542,2051.630513,
+ 0.920558,-0.152171,0.359746,1080.0746,-807.524802,2067.427498,
+ 0.920575,-0.219382,0.323131,1080.0746,-813.559722,2064.204197,
+ 0.825279,-0.401066,0.397569,1071.440608,-830.000457,2071.009044,
+ 0.920595,-0.278166,0.274097,1080.0746,-818.849373,2059.866364,
+ 0.825279,-0.401066,0.397569,1071.440608,-830.000457,2071.009044,
+ 0.920575,-0.219382,0.323131,1080.0746,-813.559722,2064.204197,
+ 0.825241,-0.315841,0.468211,1071.440608,-822.321072,2077.306602,
+ 0.825241,-0.315841,0.468211,1071.440608,-822.321072,2077.306602,
+ 0.698637,-0.507317,0.504516,1059.821204,-839.77446,2080.775682,
+ 0.825279,-0.401066,0.397569,1071.440608,-830.000457,2071.009044,
+ 0.698637,-0.507317,0.504516,1059.821204,-839.77446,2080.775682,
+ 0.825241,-0.315841,0.468211,1071.440608,-822.321072,2077.306602,
+ 0.688423,-0.395152,0.608218,1059.821204,-830.000457,2088.790953,
+ 0.688423,-0.395152,0.608218,1059.821204,-830.000457,2088.790953,
+ 0.546216,-0.572323,0.611633,1045.662989,-847.795796,2088.790972,
+ 0.698637,-0.507317,0.504516,1059.821204,-839.77446,2080.775682,
+ 0.546216,-0.572323,0.611633,1045.662989,-847.795796,2088.790972,
+ 0.688423,-0.395152,0.608218,1059.821204,-830.000457,2088.790953,
+ 0.529849,-0.456252,0.714909,1045.662989,-836.302781,2098.215938,
+ 0.374908,-0.513801,0.771655,1029.509968,-840.985818,2105.219317,
+ 0.546216,-0.572323,0.611633,1045.662989,-847.795796,2088.790972,
+ 0.529849,-0.456252,0.714909,1045.662989,-836.302781,2098.215938,
+ 0.546216,-0.572323,0.611633,1045.662989,-847.795796,2088.790972,
+ 0.374908,-0.513801,0.771655,1029.509968,-840.985818,2105.219317,
+ 0.374954,-0.654439,0.656596,1029.509968,-853.756172,2094.746857,
+ 0.190559,-0.544614,0.816751,1011.982852,-843.869605,2109.531957,
+ 0.374954,-0.654439,0.656596,1029.509968,-853.756172,2094.746857,
+ 0.374908,-0.513801,0.771655,1029.509968,-840.985818,2105.219317,
+ 0.374954,-0.654439,0.656596,1029.509968,-853.756172,2094.746857,
+ 0.190559,-0.544614,0.816751,1011.982852,-843.869605,2109.531957,
+ 0.190585,-0.693466,0.694825,1011.982852,-857.426537,2098.414455,
+ 0.095452,-0.57961,0.809284,993.755282,-844.841655,2110.985636,
+ 0.190585,-0.693466,0.694825,1011.982852,-857.426537,2098.414455,
+ 0.190559,-0.544614,0.816751,1011.982852,-843.869605,2109.531957,
+ 0.190585,-0.693466,0.694825,1011.982852,-857.426537,2098.414455,
+ 0.095452,-0.57961,0.809284,993.755282,-844.841655,2110.985636,
+ 0.095465,-0.726343,0.680671,993.755282,-858.663722,2099.650708,
+ 0,-0.706845,0.707368,947.039602,-943.22773,2184.150985,
+ 0,-0.582269,0.812996,993.755282,-911.28317,2210.34745,
+ 0,-0.527706,0.849427,947.039602,-911.28317,2210.34745,
+ 0,-0.582269,0.812996,993.755282,-911.28317,2210.34745,
+ 0,-0.706845,0.707368,947.039602,-943.22773,2184.150985,
+ 0,-0.706845,0.707368,993.755282,-943.22773,2184.150985,
+ -0.698156,-0.489171,0.522771,947.039602,-943.22773,2184.150985,
+ -0.698122,-0.416891,0.58209,900.323922,-885.950406,2172.462863,
+ -0.698174,-0.522394,0.489549,900.323922,-910.985237,2151.932791,
+ -0.698122,-0.416891,0.58209,900.323922,-885.950406,2172.462863,
+ -0.698156,-0.489171,0.522771,947.039602,-943.22773,2184.150985,
+ -0.698105,-0.377833,0.608187,947.039602,-911.28317,2210.34745,
+ 0.698122,-0.416891,0.58209,900.323922,-885.950406,2172.462863,
+ 0.698156,-0.489171,0.522771,853.608242,-943.22773,2184.150985,
+ 0.698174,-0.522394,0.489549,900.323922,-910.985237,2151.932791,
+ 0.698156,-0.489171,0.522771,853.608242,-943.22773,2184.150985,
+ 0.698122,-0.416891,0.58209,900.323922,-885.950406,2172.462863,
+ 0.698105,-0.377833,0.608187,853.608242,-911.28317,2210.34745,
+ -0.698156,-0.489171,0.522771,853.608242,-943.22773,2184.150985,
+ -0.698122,-0.416891,0.58209,806.892562,-885.950406,2172.462863,
+ -0.698174,-0.522394,0.489549,806.892562,-910.985237,2151.932791,
+ -0.698122,-0.416891,0.58209,806.892562,-885.950406,2172.462863,
+ -0.698156,-0.489171,0.522771,853.608242,-943.22773,2184.150985,
+ -0.698105,-0.377833,0.608187,853.608242,-911.28317,2210.34745,
+ 0.698122,-0.416891,0.58209,806.892562,-885.950406,2172.462863,
+ 0.698156,-0.489171,0.522771,760.176882,-943.22773,2184.150985,
+ 0.698174,-0.522394,0.489549,806.892562,-910.985237,2151.932791,
+ 0.698156,-0.489171,0.522771,760.176882,-943.22773,2184.150985,
+ 0.698122,-0.416891,0.58209,806.892562,-885.950406,2172.462863,
+ 0.698105,-0.377833,0.608187,760.176882,-911.28317,2210.34745,
+ -0.698156,-0.489171,0.522771,760.176882,-943.22773,2184.150985,
+ -0.698122,-0.416891,0.58209,713.461202,-885.950406,2172.462863,
+ -0.698174,-0.522394,0.489549,713.461202,-910.985237,2151.932791,
+ -0.698122,-0.416891,0.58209,713.461202,-885.950406,2172.462863,
+ -0.698156,-0.489171,0.522771,760.176882,-943.22773,2184.150985,
+ -0.698105,-0.377833,0.608187,760.176882,-911.28317,2210.34745,
+ 0.698122,-0.416891,0.58209,713.461202,-885.950406,2172.462863,
+ 0.698156,-0.489171,0.522771,666.745522,-943.22773,2184.150985,
+ 0.698174,-0.522394,0.489549,713.461202,-910.985237,2151.932791,
+ 0.698156,-0.489171,0.522771,666.745522,-943.22773,2184.150985,
+ 0.698122,-0.416891,0.58209,713.461202,-885.950406,2172.462863,
+ 0.698105,-0.377833,0.608187,666.745522,-911.28317,2210.34745,
+ 0,-0.706845,0.707368,635.537065,-943.22773,2184.150985,
+ 0,-0.582269,0.812996,666.745522,-911.28317,2210.34745,
+ 0,-0.527706,0.849427,635.537065,-911.28317,2210.34745,
+ 0,-0.582269,0.812996,666.745522,-911.28317,2210.34745,
+ 0,-0.706845,0.707368,635.537065,-943.22773,2184.150985,
+ 0,-0.706845,0.707368,666.745522,-943.22773,2184.150985,
+ 0,-0.706845,0.707368,200.646178,-910.985237,2151.932791,
+ 0,-0.582269,0.812996,635.537065,-885.950406,2172.462863,
+ 0,-0.527706,0.849427,200.646178,-885.950406,2172.462863,
+ 0,-0.582269,0.812996,635.537065,-885.950406,2172.462863,
+ 0,-0.706845,0.707368,200.646178,-910.985237,2151.932791,
+ 0,-0.706845,0.707368,635.537065,-910.985237,2151.932791,
+ 0,-0.706845,0.707368,97.301517,-854.069611,2095.060059,
+ 0,-0.582269,0.812996,200.646178,-841.232085,2105.587604,
+ 0,-0.527706,0.849427,97.301517,-841.232085,2105.587604,
+ 0,-0.582269,0.812996,200.646178,-841.232085,2105.587604,
+ 0,-0.706845,0.707368,97.301517,-854.069611,2095.060059,
+ 0,-0.706845,0.707368,200.646178,-854.069611,2095.060059,
+ 0,-0.706845,0.707368,45.307526,-890.894103,2131.856798,
+ 0,-0.582269,0.812996,97.301517,-870.164903,2148.855992,
+ 0,-0.527706,0.849427,45.307526,-870.164903,2148.855992,
+ 0,-0.582269,0.812996,97.301517,-870.164903,2148.855992,
+ 0,-0.706845,0.707368,45.307526,-890.894103,2131.856798,
+ 0,-0.706845,0.707368,97.301517,-890.894103,2131.856798,
+ 0.975635,-0.126671,0.179142,1085.391405,-804.053121,2049.987287,
+ 0.920595,-0.278166,0.274097,1080.0746,-818.849373,2059.866364,
+ 0.975641,-0.159161,0.15097,1085.391405,-806.749765,2047.775876,
+ 0.920595,-0.278166,0.274097,1080.0746,-818.849373,2059.866364,
+ 0.975635,-0.126671,0.179142,1085.391405,-804.053121,2049.987287,
+ 0.920575,-0.219382,0.323131,1080.0746,-813.559722,2064.204197,
+ 0.920595,-0.278166,0.274097,1080.0746,-818.849373,2059.866364,
+ 0.825316,-0.470886,0.311641,1071.440608,-836.302765,2063.335447,
+ 0.920615,-0.326262,0.214527,1080.0746,-823.190478,2054.5807,
+ 0.825316,-0.470886,0.311641,1071.440608,-836.302765,2063.335447,
+ 0.920595,-0.278166,0.274097,1080.0746,-818.849373,2059.866364,
+ 0.825279,-0.401066,0.397569,1071.440608,-830.000457,2071.009044,
+ 0.825279,-0.401066,0.397569,1071.440608,-830.000457,2071.009044,
+ 0.712575,-0.576041,0.400516,1059.821204,-847.795777,2071.009045,
+ 0.825316,-0.470886,0.311641,1071.440608,-836.302765,2063.335447,
+ 0.712575,-0.576041,0.400516,1059.821204,-847.795777,2071.009045,
+ 0.825279,-0.401066,0.397569,1071.440608,-830.000457,2071.009044,
+ 0.698637,-0.507317,0.504516,1059.821204,-839.77446,2080.775682,
+ 0.698637,-0.507317,0.504516,1059.821204,-839.77446,2080.775682,
+ 0.558056,-0.682755,0.471614,1045.662989,-857.22787,2077.306618,
+ 0.712575,-0.576041,0.400516,1059.821204,-847.795777,2071.009045,
+ 0.558056,-0.682755,0.471614,1045.662989,-857.22787,2077.306618,
+ 0.698637,-0.507317,0.504516,1059.821204,-839.77446,2080.775682,
+ 0.546216,-0.572323,0.611633,1045.662989,-847.795796,2088.790972,
+ 0.558056,-0.682755,0.471614,1045.662989,-857.22787,2077.306618,
+ 0.374954,-0.654439,0.656596,1029.509968,-853.756172,2094.746857,
+ 0.374999,-0.769959,0.516274,1029.509968,-864.236531,2081.986126,
+ 0.374954,-0.654439,0.656596,1029.509968,-853.756172,2094.746857,
+ 0.558056,-0.682755,0.471614,1045.662989,-857.22787,2077.306618,
+ 0.546216,-0.572323,0.611633,1045.662989,-847.795796,2088.790972,
+ 0.374999,-0.769959,0.516274,1029.509968,-864.236531,2081.986126,
+ 0.190585,-0.693466,0.694825,1011.982852,-857.426537,2098.414455,
+ 0.190611,-0.815706,0.54616,1011.982852,-868.552424,2084.86774,
+ 0.190585,-0.693466,0.694825,1011.982852,-857.426537,2098.414455,
+ 0.374999,-0.769959,0.516274,1029.509968,-864.236531,2081.986126,
+ 0.374954,-0.654439,0.656596,1029.509968,-853.756172,2094.746857,
+ 0.190611,-0.815706,0.54616,1011.982852,-868.552424,2084.86774,
+ 0.095465,-0.726343,0.680671,993.755282,-858.663722,2099.650708,
+ 0.095479,-0.845197,0.525857,993.755282,-870.007199,2085.839058,
+ 0.095465,-0.726343,0.680671,993.755282,-858.663722,2099.650708,
+ 0.190611,-0.815706,0.54616,1011.982852,-868.552424,2084.86774,
+ 0.190585,-0.693466,0.694825,1011.982852,-857.426537,2098.414455,
+ 0,-0.812587,0.582839,993.755282,-969.443953,2152.230499,
+ 0,-0.706845,0.707368,947.039602,-943.22773,2184.150985,
+ 0,-0.849076,0.52827,947.039602,-969.443953,2152.230499,
+ 0,-0.706845,0.707368,947.039602,-943.22773,2184.150985,
+ 0,-0.812587,0.582839,993.755282,-969.443953,2152.230499,
+ 0,-0.706845,0.707368,993.755282,-943.22773,2184.150985,
+ -0.698208,-0.581726,0.417253,947.039602,-969.443953,2152.230499,
+ -0.698174,-0.522394,0.489549,900.323922,-910.985237,2151.932791,
+ -0.698225,-0.607835,0.378179,900.323922,-931.530793,2126.916827,
+ -0.698174,-0.522394,0.489549,900.323922,-910.985237,2151.932791,
+ -0.698208,-0.581726,0.417253,947.039602,-969.443953,2152.230499,
+ -0.698156,-0.489171,0.522771,947.039602,-943.22773,2184.150985,
+ 0.698174,-0.522394,0.489549,900.323922,-910.985237,2151.932791,
+ 0.698208,-0.581726,0.417253,853.608242,-969.443953,2152.230499,
+ 0.698225,-0.607835,0.378179,900.323922,-931.530793,2126.916827,
+ 0.698208,-0.581726,0.417253,853.608242,-969.443953,2152.230499,
+ 0.698174,-0.522394,0.489549,900.323922,-910.985237,2151.932791,
+ 0.698156,-0.489171,0.522771,853.608242,-943.22773,2184.150985,
+ -0.698208,-0.581726,0.417253,853.608242,-969.443953,2152.230499,
+ -0.698174,-0.522394,0.489549,806.892562,-910.985237,2151.932791,
+ -0.698225,-0.607835,0.378179,806.892562,-931.530793,2126.916827,
+ -0.698174,-0.522394,0.489549,806.892562,-910.985237,2151.932791,
+ -0.698208,-0.581726,0.417253,853.608242,-969.443953,2152.230499,
+ -0.698156,-0.489171,0.522771,853.608242,-943.22773,2184.150985,
+ 0.698174,-0.522394,0.489549,806.892562,-910.985237,2151.932791,
+ 0.698208,-0.581726,0.417253,760.176882,-969.443953,2152.230499,
+ 0.698225,-0.607835,0.378179,806.892562,-931.530793,2126.916827,
+ 0.698208,-0.581726,0.417253,760.176882,-969.443953,2152.230499,
+ 0.698174,-0.522394,0.489549,806.892562,-910.985237,2151.932791,
+ 0.698156,-0.489171,0.522771,760.176882,-943.22773,2184.150985,
+ -0.698208,-0.581726,0.417253,760.176882,-969.443953,2152.230499,
+ -0.698174,-0.522394,0.489549,713.461202,-910.985237,2151.932791,
+ -0.698225,-0.607835,0.378179,713.461202,-931.530793,2126.916827,
+ -0.698174,-0.522394,0.489549,713.461202,-910.985237,2151.932791,
+ -0.698208,-0.581726,0.417253,760.176882,-969.443953,2152.230499,
+ -0.698156,-0.489171,0.522771,760.176882,-943.22773,2184.150985,
+ 0.698174,-0.522394,0.489549,713.461202,-910.985237,2151.932791,
+ 0.698208,-0.581726,0.417253,666.745522,-969.443953,2152.230499,
+ 0.698225,-0.607835,0.378179,713.461202,-931.530793,2126.916827,
+ 0.698208,-0.581726,0.417253,666.745522,-969.443953,2152.230499,
+ 0.698174,-0.522394,0.489549,713.461202,-910.985237,2151.932791,
+ 0.698156,-0.489171,0.522771,666.745522,-943.22773,2184.150985,
+ 0,-0.812587,0.582839,666.745522,-969.443953,2152.230499,
+ 0,-0.706845,0.707368,635.537065,-943.22773,2184.150985,
+ 0,-0.849076,0.52827,635.537065,-969.443953,2152.230499,
+ 0,-0.706845,0.707368,635.537065,-943.22773,2184.150985,
+ 0,-0.812587,0.582839,666.745522,-969.443953,2152.230499,
+ 0,-0.706845,0.707368,666.745522,-943.22773,2184.150985,
+ 0,-0.812587,0.582839,635.537065,-931.530793,2126.916827,
+ 0,-0.706845,0.707368,200.646178,-910.985237,2151.932791,
+ 0,-0.849076,0.52827,200.646178,-931.530793,2126.916827,
+ 0,-0.706845,0.707368,200.646178,-910.985237,2151.932791,
+ 0,-0.812587,0.582839,635.537065,-931.530793,2126.916827,
+ 0,-0.706845,0.707368,635.537065,-910.985237,2151.932791,
+ 0,-0.812587,0.582839,200.646178,-864.605096,2082.232208,
+ 0,-0.706845,0.707368,97.301517,-854.069611,2095.060059,
+ 0,-0.849076,0.52827,97.301517,-864.605096,2082.232208,
+ 0,-0.706845,0.707368,97.301517,-854.069611,2095.060059,
+ 0,-0.812587,0.582839,200.646178,-864.605096,2082.232208,
+ 0,-0.706845,0.707368,200.646178,-854.069611,2095.060059,
+ 0,-0.812587,0.582839,97.301517,-907.906118,2111.143221,
+ 0,-0.706845,0.707368,45.307526,-890.894103,2131.856798,
+ 0,-0.849076,0.52827,45.307526,-907.906118,2111.143221,
+ 0,-0.706845,0.707368,45.307526,-890.894103,2131.856798,
+ 0,-0.812587,0.582839,97.301517,-907.906118,2111.143221,
+ 0,-0.706845,0.707368,97.301517,-890.894103,2131.856798,
+ 0.975641,-0.159161,0.15097,1085.391405,-806.749765,2047.775876,
+ 0.920615,-0.326262,0.214527,1080.0746,-823.190478,2054.5807,
+ 0.975648,-0.185535,0.116996,1085.391405,-808.962844,2045.081264,
+ 0.920615,-0.326262,0.214527,1080.0746,-823.190478,2054.5807,
+ 0.975641,-0.159161,0.15097,1085.391405,-806.749765,2047.775876,
+ 0.920595,-0.278166,0.274097,1080.0746,-818.849373,2059.866364,
+ 0.920615,-0.326262,0.214527,1080.0746,-823.190478,2054.5807,
+ 0.825347,-0.522611,0.213727,1071.440608,-840.985802,2054.580703,
+ 0.920631,-0.361821,0.14671,1080.0746,-826.416209,2048.550328,
+ 0.825347,-0.522611,0.213727,1071.440608,-840.985802,2054.580703,
+ 0.920615,-0.326262,0.214527,1080.0746,-823.190478,2054.5807,
+ 0.825316,-0.470886,0.311641,1071.440608,-836.302765,2063.335447,
+ 0.825316,-0.470886,0.311641,1071.440608,-836.302765,2063.335447,
+ 0.698533,-0.651683,0.295568,1059.821204,-853.756153,2059.866369,
+ 0.825347,-0.522611,0.213727,1071.440608,-840.985802,2054.580703,
+ 0.698533,-0.651683,0.295568,1059.821204,-853.756153,2059.866369,
+ 0.825316,-0.470886,0.311641,1071.440608,-836.302765,2063.335447,
+ 0.712575,-0.576041,0.400516,1059.821204,-847.795777,2071.009045,
+ 0.698533,-0.651683,0.295568,1059.821204,-853.756153,2059.866369,
+ 0.558056,-0.682755,0.471614,1045.662989,-857.22787,2077.306618,
+ 0.546532,-0.77294,0.322284,1045.662989,-864.236534,2064.204213,
+ 0.558056,-0.682755,0.471614,1045.662989,-857.22787,2077.306618,
+ 0.698533,-0.651683,0.295568,1059.821204,-853.756153,2059.866369,
+ 0.712575,-0.576041,0.400516,1059.821204,-847.795777,2071.009045,
+ 0.546532,-0.77294,0.322284,1045.662989,-864.236534,2064.204213,
+ 0.374999,-0.769959,0.516274,1029.509968,-864.236531,2081.986126,
+ 0.375038,-0.855898,0.356068,1029.509968,-872.024141,2067.427515,
+ 0.374999,-0.769959,0.516274,1029.509968,-864.236531,2081.986126,
+ 0.546532,-0.77294,0.322284,1045.662989,-864.236534,2064.204213,
+ 0.558056,-0.682755,0.471614,1045.662989,-857.22787,2077.306618,
+ 0.375038,-0.855898,0.356068,1029.509968,-872.024141,2067.427515,
+ 0.190611,-0.815706,0.54616,1011.982852,-868.552424,2084.86774,
+ 0.190633,-0.906609,0.376455,1011.982852,-876.819704,2069.412405,
+ 0.190611,-0.815706,0.54616,1011.982852,-868.552424,2084.86774,
+ 0.375038,-0.855898,0.356068,1029.509968,-872.024141,2067.427515,
+ 0.374999,-0.769959,0.516274,1029.509968,-864.236531,2081.986126,
+ 0.190633,-0.906609,0.376455,1011.982852,-876.819704,2069.412405,
+ 0.095479,-0.845197,0.525857,993.755282,-870.007199,2085.839058,
+ 0.09549,-0.931577,0.35078,993.755282,-878.436163,2070.08146,
+ 0.095479,-0.845197,0.525857,993.755282,-870.007199,2085.839058,
+ 0.190633,-0.906609,0.376455,1011.982852,-876.819704,2069.412405,
+ 0.190611,-0.815706,0.54616,1011.982852,-868.552424,2084.86774,
+ 0,-0.91071,0.413047,993.755282,-988.924364,2115.81268,
+ 0,-0.849076,0.52827,947.039602,-969.443953,2152.230499,
+ 0,-0.935853,0.352391,947.039602,-988.924364,2115.81268,
+ 0,-0.849076,0.52827,947.039602,-969.443953,2152.230499,
+ 0,-0.91071,0.413047,993.755282,-988.924364,2115.81268,
+ 0,-0.812587,0.582839,993.755282,-969.443953,2152.230499,
+ -0.698254,-0.651931,0.295681,947.039602,-988.924364,2115.81268,
+ -0.698225,-0.607835,0.378179,900.323922,-931.530793,2126.916827,
+ -0.698266,-0.669919,0.252256,900.323922,-946.797518,2098.376319,
+ -0.698225,-0.607835,0.378179,900.323922,-931.530793,2126.916827,
+ -0.698254,-0.651931,0.295681,947.039602,-988.924364,2115.81268,
+ -0.698208,-0.581726,0.417253,947.039602,-969.443953,2152.230499,
+ 0.698225,-0.607835,0.378179,900.323922,-931.530793,2126.916827,
+ 0.698254,-0.651931,0.295681,853.608242,-988.924364,2115.81268,
+ 0.698266,-0.669919,0.252256,900.323922,-946.797518,2098.376319,
+ 0.698254,-0.651931,0.295681,853.608242,-988.924364,2115.81268,
+ 0.698225,-0.607835,0.378179,900.323922,-931.530793,2126.916827,
+ 0.698208,-0.581726,0.417253,853.608242,-969.443953,2152.230499,
+ -0.698254,-0.651931,0.295681,853.608242,-988.924364,2115.81268,
+ -0.698225,-0.607835,0.378179,806.892562,-931.530793,2126.916827,
+ -0.698266,-0.669919,0.252256,806.892562,-946.797518,2098.376319,
+ -0.698225,-0.607835,0.378179,806.892562,-931.530793,2126.916827,
+ -0.698254,-0.651931,0.295681,853.608242,-988.924364,2115.81268,
+ -0.698208,-0.581726,0.417253,853.608242,-969.443953,2152.230499,
+ 0.698225,-0.607835,0.378179,806.892562,-931.530793,2126.916827,
+ 0.698254,-0.651931,0.295681,760.176882,-988.924364,2115.81268,
+ 0.698266,-0.669919,0.252256,806.892562,-946.797518,2098.376319,
+ 0.698254,-0.651931,0.295681,760.176882,-988.924364,2115.81268,
+ 0.698225,-0.607835,0.378179,806.892562,-931.530793,2126.916827,
+ 0.698208,-0.581726,0.417253,760.176882,-969.443953,2152.230499,
+ -0.698254,-0.651931,0.295681,760.176882,-988.924364,2115.81268,
+ -0.698225,-0.607835,0.378179,713.461202,-931.530793,2126.916827,
+ -0.698266,-0.669919,0.252256,713.461202,-946.797518,2098.376319,
+ -0.698225,-0.607835,0.378179,713.461202,-931.530793,2126.916827,
+ -0.698254,-0.651931,0.295681,760.176882,-988.924364,2115.81268,
+ -0.698208,-0.581726,0.417253,760.176882,-969.443953,2152.230499,
+ 0.698225,-0.607835,0.378179,713.461202,-931.530793,2126.916827,
+ 0.698254,-0.651931,0.295681,666.745522,-988.924364,2115.81268,
+ 0.698266,-0.669919,0.252256,713.461202,-946.797518,2098.376319,
+ 0.698254,-0.651931,0.295681,666.745522,-988.924364,2115.81268,
+ 0.698225,-0.607835,0.378179,713.461202,-931.530793,2126.916827,
+ 0.698208,-0.581726,0.417253,666.745522,-969.443953,2152.230499,
+ 0,-0.91071,0.413047,666.745522,-988.924364,2115.81268,
+ 0,-0.849076,0.52827,635.537065,-969.443953,2152.230499,
+ 0,-0.935853,0.352391,635.537065,-988.924364,2115.81268,
+ 0,-0.849076,0.52827,635.537065,-969.443953,2152.230499,
+ 0,-0.91071,0.413047,666.745522,-988.924364,2115.81268,
+ 0,-0.812587,0.582839,666.745522,-969.443953,2152.230499,
+ 0,-0.91071,0.413047,635.537065,-946.797518,2098.376319,
+ 0,-0.849076,0.52827,200.646178,-931.530793,2126.916827,
+ 0,-0.935853,0.352391,200.646178,-946.797518,2098.376319,
+ 0,-0.849076,0.52827,200.646178,-931.530793,2126.916827,
+ 0,-0.91071,0.413047,635.537065,-946.797518,2098.376319,
+ 0,-0.812587,0.582839,635.537065,-931.530793,2126.916827,
+ 0,-0.91071,0.413047,200.646178,-872.433668,2067.597018,
+ 0,-0.849076,0.52827,97.301517,-864.605096,2082.232208,
+ 0,-0.935853,0.352391,97.301517,-872.433668,2067.597018,
+ 0,-0.849076,0.52827,97.301517,-864.605096,2082.232208,
+ 0,-0.91071,0.413047,200.646178,-872.433668,2067.597018,
+ 0,-0.812587,0.582839,200.646178,-864.605096,2082.232208,
+ 0,-0.91071,0.413047,97.301517,-920.547185,2087.51127,
+ 0,-0.849076,0.52827,45.307526,-907.906118,2111.143221,
+ 0,-0.935853,0.352391,45.307526,-920.547185,2087.51127,
+ 0,-0.849076,0.52827,45.307526,-907.906118,2111.143221,
+ 0,-0.91071,0.413047,97.301517,-920.547185,2087.51127,
+ 0,-0.812587,0.582839,97.301517,-907.906118,2111.143221,
+ 0.975648,-0.185535,0.116996,1085.391405,-808.962844,2045.081264,
+ 0.920631,-0.361821,0.14671,1080.0746,-826.416209,2048.550328,
+ 0.975653,-0.204779,0.078525,1085.391405,-810.60731,2042.007003,
+ 0.920631,-0.361821,0.14671,1080.0746,-826.416209,2048.550328,
+ 0.975648,-0.185535,0.116996,1085.391405,-808.962844,2045.081264,
+ 0.920615,-0.326262,0.214527,1080.0746,-823.190478,2054.5807,
+ 0.920631,-0.361821,0.14671,1080.0746,-826.416209,2048.550328,
+ 0.825368,-0.554249,0.10759,1071.440608,-843.869602,2045.081252,
+ 0.920642,-0.383474,0.073251,1080.0746,-828.402605,2042.006994,
+ 0.825368,-0.554249,0.10759,1071.440608,-843.869602,2045.081252,
+ 0.920631,-0.361821,0.14671,1080.0746,-826.416209,2048.550328,
+ 0.825347,-0.522611,0.213727,1071.440608,-840.985802,2054.580703,
+ 0.825347,-0.522611,0.213727,1071.440608,-840.985802,2054.580703,
+ 0.698565,-0.696813,0.162664,1059.821204,-857.426535,2047.775861,
+ 0.825368,-0.554249,0.10759,1071.440608,-843.869602,2045.081252,
+ 0.698565,-0.696813,0.162664,1059.821204,-857.426535,2047.775861,
+ 0.825347,-0.522611,0.213727,1071.440608,-840.985802,2054.580703,
+ 0.698533,-0.651683,0.295568,1059.821204,-853.756153,2059.866369,
+ 0.698565,-0.696813,0.162664,1059.821204,-857.426535,2047.775861,
+ 0.546532,-0.77294,0.322284,1045.662989,-864.236534,2064.204213,
+ 0.546562,-0.820963,0.165195,1045.662989,-868.552448,2049.987275,
+ 0.546532,-0.77294,0.322284,1045.662989,-864.236534,2064.204213,
+ 0.698565,-0.696813,0.162664,1059.821204,-857.426535,2047.775861,
+ 0.698533,-0.651683,0.295568,1059.821204,-853.756153,2059.866369,
+ 0.546562,-0.820963,0.165195,1045.662989,-868.552448,2049.987275,
+ 0.375038,-0.855898,0.356068,1029.509968,-872.024141,2067.427515,
+ 0.375063,-0.90893,0.182138,1029.509968,-876.819727,2051.6305,
+ 0.375038,-0.855898,0.356068,1029.509968,-872.024141,2067.427515,
+ 0.546562,-0.820963,0.165195,1045.662989,-868.552448,2049.987275,
+ 0.546532,-0.77294,0.322284,1045.662989,-864.236534,2064.204213,
+ 0.375063,-0.90893,0.182138,1029.509968,-876.819727,2051.6305,
+ 0.190633,-0.906609,0.376455,1011.982852,-876.819704,2069.412405,
+ 0.190647,-0.962652,0.192235,1011.982852,-881.910669,2052.642388,
+ 0.190633,-0.906609,0.376455,1011.982852,-876.819704,2069.412405,
+ 0.375063,-0.90893,0.182138,1029.509968,-876.819727,2051.6305,
+ 0.375038,-0.855898,0.356068,1029.509968,-872.024141,2067.427515,
+ 0.190647,-0.962652,0.192235,1011.982852,-881.910669,2052.642388,
+ 0.09549,-0.931577,0.35078,993.755282,-878.436163,2070.08146,
+ 0.095497,-0.98213,0.162176,993.755282,-883.626694,2052.983469,
+ 0.09549,-0.931577,0.35078,993.755282,-878.436163,2070.08146,
+ 0.190647,-0.962652,0.192235,1011.982852,-881.910669,2052.642388,
+ 0.190633,-0.906609,0.376455,1011.982852,-876.819704,2069.412405,
+ 0,-0.973818,0.227328,993.755282,-1000.920342,2076.297043,
+ 0,-0.935853,0.352391,947.039602,-988.924364,2115.81268,
+ 0,-0.986639,0.16292,947.039602,-1000.920342,2076.297043,
+ 0,-0.935853,0.352391,947.039602,-988.924364,2115.81268,
+ 0,-0.973818,0.227328,993.755282,-1000.920342,2076.297043,
+ 0,-0.91071,0.413047,993.755282,-988.924364,2115.81268,
+ -0.698482,-0.701857,0.139712,947.039602,-1000.920342,2076.297043,
+ -0.698266,-0.669919,0.252256,900.323922,-946.797518,2098.376319,
+ -0.698482,-0.701857,0.139712,900.323922,-956.19872,2067.408064,
+ -0.698266,-0.669919,0.252256,900.323922,-946.797518,2098.376319,
+ -0.698482,-0.701857,0.139712,947.039602,-1000.920342,2076.297043,
+ -0.698254,-0.651931,0.295681,947.039602,-988.924364,2115.81268,
+ 0.698266,-0.669919,0.252256,900.323922,-946.797518,2098.376319,
+ 0.698286,-0.697077,0.162726,853.608242,-1000.920342,2076.297043,
+ 0.698293,-0.706248,0.116621,900.323922,-956.19872,2067.408064,
+ 0.698286,-0.697077,0.162726,853.608242,-1000.920342,2076.297043,
+ 0.698266,-0.669919,0.252256,900.323922,-946.797518,2098.376319,
+ 0.698254,-0.651931,0.295681,853.608242,-988.924364,2115.81268,
+ -0.698482,-0.701857,0.139712,853.608242,-1000.920342,2076.297043,
+ -0.698266,-0.669919,0.252256,806.892562,-946.797518,2098.376319,
+ -0.698482,-0.701857,0.139712,806.892562,-956.19872,2067.408064,
+ -0.698266,-0.669919,0.252256,806.892562,-946.797518,2098.376319,
+ -0.698482,-0.701857,0.139712,853.608242,-1000.920342,2076.297043,
+ -0.698254,-0.651931,0.295681,853.608242,-988.924364,2115.81268,
+ 0.698266,-0.669919,0.252256,806.892562,-946.797518,2098.376319,
+ 0.698286,-0.697077,0.162726,760.176882,-1000.920342,2076.297043,
+ 0.698293,-0.706248,0.116621,806.892562,-956.19872,2067.408064,
+ 0.698286,-0.697077,0.162726,760.176882,-1000.920342,2076.297043,
+ 0.698266,-0.669919,0.252256,806.892562,-946.797518,2098.376319,
+ 0.698254,-0.651931,0.295681,760.176882,-988.924364,2115.81268,
+ -0.698482,-0.701857,0.139712,760.176882,-1000.920342,2076.297043,
+ -0.698266,-0.669919,0.252256,713.461202,-946.797518,2098.376319,
+ -0.698482,-0.701857,0.139712,713.461202,-956.19872,2067.408064,
+ -0.698266,-0.669919,0.252256,713.461202,-946.797518,2098.376319,
+ -0.698482,-0.701857,0.139712,760.176882,-1000.920342,2076.297043,
+ -0.698254,-0.651931,0.295681,760.176882,-988.924364,2115.81268,
+ 0.698266,-0.669919,0.252256,713.461202,-946.797518,2098.376319,
+ 0.698286,-0.697077,0.162726,666.745522,-1000.920342,2076.297043,
+ 0.698293,-0.706248,0.116621,713.461202,-956.19872,2067.408064,
+ 0.698286,-0.697077,0.162726,666.745522,-1000.920342,2076.297043,
+ 0.698266,-0.669919,0.252256,713.461202,-946.797518,2098.376319,
+ 0.698254,-0.651931,0.295681,666.745522,-988.924364,2115.81268,
+ 0,-0.973818,0.227328,666.745522,-1000.920342,2076.297043,
+ 0,-0.935853,0.352391,635.537065,-988.924364,2115.81268,
+ 0,-0.986639,0.16292,635.537065,-1000.920342,2076.297043,
+ 0,-0.935853,0.352391,635.537065,-988.924364,2115.81268,
+ 0,-0.973818,0.227328,666.745522,-1000.920342,2076.297043,
+ 0,-0.91071,0.413047,666.745522,-988.924364,2115.81268,
+ 0,-0.973818,0.227328,635.537065,-956.19872,2067.408064,
+ 0,-0.935853,0.352391,200.646178,-946.797518,2098.376319,
+ 0,-0.986639,0.16292,200.646178,-956.19872,2067.408064,
+ 0,-0.935853,0.352391,200.646178,-946.797518,2098.376319,
+ 0,-0.973818,0.227328,635.537065,-956.19872,2067.408064,
+ 0,-0.91071,0.413047,635.537065,-946.797518,2098.376319,
+ 0,-0.973818,0.227328,200.646178,-877.254479,2051.716912,
+ 0,-0.935853,0.352391,97.301517,-872.433668,2067.597018,
+ 0,-0.986639,0.16292,97.301517,-877.254479,2051.716912,
+ 0,-0.935853,0.352391,97.301517,-872.433668,2067.597018,
+ 0,-0.973818,0.227328,200.646178,-877.254479,2051.716912,
+ 0,-0.91071,0.413047,200.646178,-872.433668,2067.597018,
+ 0,-0.973818,0.227328,97.301517,-928.331516,2061.86911,
+ 0,-0.935853,0.352391,45.307526,-920.547185,2087.51127,
+ 0,-0.986639,0.16292,45.307526,-928.331516,2061.86911,
+ 0,-0.935853,0.352391,45.307526,-920.547185,2087.51127,
+ 0,-0.973818,0.227328,97.301517,-928.331516,2061.86911,
+ 0,-0.91071,0.413047,97.301517,-920.547185,2087.51127,
+ 0.975653,-0.204779,0.078525,1085.391405,-810.60731,2042.007003,
+ 0.920642,-0.383474,0.073251,1080.0746,-828.402605,2042.006994,
+ 0.975657,-0.216153,0.037036,1085.391405,-811.619967,2038.671235,
+ 0.920642,-0.383474,0.073251,1080.0746,-828.402605,2042.006994,
+ 0.975653,-0.204779,0.078525,1085.391405,-810.60731,2042.007003,
+ 0.920631,-0.361821,0.14671,1080.0746,-826.416209,2048.550328,
+ 0.920642,-0.383474,0.073251,1080.0746,-828.402605,2042.006994,
+ 0.842436,-0.536198,0.052851,1071.440608,-844.843343,2035.202153,
+ 0.932578,-0.359229,0.035408,1080.0746,-829.073329,2035.202153,
+ 0.842436,-0.536198,0.052851,1071.440608,-844.843343,2035.202153,
+ 0.920642,-0.383474,0.073251,1080.0746,-828.402605,2042.006994,
+ 0.825368,-0.554249,0.10759,1071.440608,-843.869602,2045.081252,
+ 0.825368,-0.554249,0.10759,1071.440608,-843.869602,2045.081252,
+ 0.69704,-0.713574,0.070334,1059.821204,-858.665871,2035.202153,
+ 0.842436,-0.536198,0.052851,1071.440608,-844.843343,2035.202153,
+ 0.69704,-0.713574,0.070334,1059.821204,-858.665871,2035.202153,
+ 0.825368,-0.554249,0.10759,1071.440608,-843.869602,2045.081252,
+ 0.698565,-0.696813,0.162664,1059.821204,-857.426535,2047.775861,
+ 0.69704,-0.713574,0.070334,1059.821204,-858.665871,2035.202153,
+ 0.546562,-0.820963,0.165195,1045.662989,-868.552448,2049.987275,
+ 0.517228,-0.851721,0.08395,1045.662989,-870.009753,2035.202153,
+ 0.546562,-0.820963,0.165195,1045.662989,-868.552448,2049.987275,
+ 0.69704,-0.713574,0.070334,1059.821204,-858.665871,2035.202153,
+ 0.698565,-0.696813,0.162664,1059.821204,-857.426535,2047.775861,
+ 0.517228,-0.851721,0.08395,1045.662989,-870.009753,2035.202153,
+ 0.375063,-0.90893,0.182138,1029.509968,-876.819727,2051.6305,
+ 0.343504,-0.934622,0.092122,1029.509968,-878.438998,2035.202153,
+ 0.375063,-0.90893,0.182138,1029.509968,-876.819727,2051.6305,
+ 0.517228,-0.851721,0.08395,1045.662989,-870.009753,2035.202153,
+ 0.546562,-0.820963,0.165195,1045.662989,-868.552448,2049.987275,
+ 0.343504,-0.934622,0.092122,1029.509968,-878.438998,2035.202153,
+ 0.190647,-0.962652,0.192235,1011.982852,-881.910669,2052.642388,
+ 0.158272,-0.982634,0.096854,1011.982852,-883.629678,2035.202153,
+ 0.190647,-0.962652,0.192235,1011.982852,-881.910669,2052.642388,
+ 0.343504,-0.934622,0.092122,1029.509968,-878.438998,2035.202153,
+ 0.375063,-0.90893,0.182138,1029.509968,-876.819727,2051.6305,
+ 0.158272,-0.982634,0.096854,1011.982852,-883.629678,2035.202153,
+ 0.095497,-0.98213,0.162176,993.755282,-883.626694,2052.983469,
+ 0.095093,-0.990668,0.097646,993.755282,-885.379322,2035.202153,
+ 0.095497,-0.98213,0.162176,993.755282,-883.626694,2052.983469,
+ 0.158272,-0.982634,0.096854,1011.982852,-883.629678,2035.202153,
+ 0.190647,-0.962652,0.192235,1011.982852,-881.910669,2052.642388,
+ 0,-0.995178,0.09809,993.755282,-1004.970888,2035.202153,
+ 0,-0.986639,0.16292,947.039602,-1000.920342,2076.297043,
+ 0,-0.995178,0.09809,947.039602,-1004.970888,2035.202153,
+ 0,-0.986639,0.16292,947.039602,-1000.920342,2076.297043,
+ 0,-0.995178,0.09809,993.755282,-1004.970888,2035.202153,
+ 0,-0.973818,0.227328,993.755282,-1000.920342,2076.297043,
+ -0.698482,-0.701857,0.139712,947.039602,-1000.920342,2076.297043,
+ -0.696761,-0.713844,0.070361,900.323922,-959.373118,2035.202153,
+ -0.696761,-0.713844,0.070361,947.039602,-1004.970888,2035.202153,
+ -0.696761,-0.713844,0.070361,900.323922,-959.373118,2035.202153,
+ -0.698482,-0.701857,0.139712,947.039602,-1000.920342,2076.297043,
+ -0.698482,-0.701857,0.139712,900.323922,-956.19872,2067.408064,
+ 0.698293,-0.706248,0.116621,900.323922,-956.19872,2067.408064,
+ 0.696761,-0.713844,0.070361,853.608242,-1004.970888,2035.202153,
+ 0.696761,-0.713844,0.070361,900.323922,-959.373118,2035.202153,
+ 0.696761,-0.713844,0.070361,853.608242,-1004.970888,2035.202153,
+ 0.698293,-0.706248,0.116621,900.323922,-956.19872,2067.408064,
+ 0.698286,-0.697077,0.162726,853.608242,-1000.920342,2076.297043,
+ -0.698482,-0.701857,0.139712,853.608242,-1000.920342,2076.297043,
+ -0.696761,-0.713844,0.070361,806.892562,-959.373118,2035.202153,
+ -0.696761,-0.713844,0.070361,853.608242,-1004.970888,2035.202153,
+ -0.696761,-0.713844,0.070361,806.892562,-959.373118,2035.202153,
+ -0.698482,-0.701857,0.139712,853.608242,-1000.920342,2076.297043,
+ -0.698482,-0.701857,0.139712,806.892562,-956.19872,2067.408064,
+ 0.698293,-0.706248,0.116621,806.892562,-956.19872,2067.408064,
+ 0.696761,-0.713844,0.070361,760.176882,-1004.970888,2035.202153,
+ 0.696761,-0.713844,0.070361,806.892562,-959.373118,2035.202153,
+ 0.696761,-0.713844,0.070361,760.176882,-1004.970888,2035.202153,
+ 0.698293,-0.706248,0.116621,806.892562,-956.19872,2067.408064,
+ 0.698286,-0.697077,0.162726,760.176882,-1000.920342,2076.297043,
+ -0.698482,-0.701857,0.139712,760.176882,-1000.920342,2076.297043,
+ -0.696761,-0.713844,0.070361,713.461202,-959.373118,2035.202153,
+ -0.696761,-0.713844,0.070361,760.176882,-1004.970888,2035.202153,
+ -0.696761,-0.713844,0.070361,713.461202,-959.373118,2035.202153,
+ -0.698482,-0.701857,0.139712,760.176882,-1000.920342,2076.297043,
+ -0.698482,-0.701857,0.139712,713.461202,-956.19872,2067.408064,
+ 0.698293,-0.706248,0.116621,713.461202,-956.19872,2067.408064,
+ 0.696761,-0.713844,0.070361,666.745522,-1004.970888,2035.202153,
+ 0.696761,-0.713844,0.070361,713.461202,-959.373118,2035.202153,
+ 0.696761,-0.713844,0.070361,666.745522,-1004.970888,2035.202153,
+ 0.698293,-0.706248,0.116621,713.461202,-956.19872,2067.408064,
+ 0.698286,-0.697077,0.162726,666.745522,-1000.920342,2076.297043,
+ 0,-0.995178,0.09809,666.745522,-1004.970888,2035.202153,
+ 0,-0.986639,0.16292,635.537065,-1000.920342,2076.297043,
+ 0,-0.995178,0.09809,635.537065,-1004.970888,2035.202153,
+ 0,-0.986639,0.16292,635.537065,-1000.920342,2076.297043,
+ 0,-0.995178,0.09809,666.745522,-1004.970888,2035.202153,
+ 0,-0.973818,0.227328,666.745522,-1000.920342,2076.297043,
+ 0,-0.995178,0.09809,635.537065,-959.373118,2035.202153,
+ 0,-0.986639,0.16292,200.646178,-956.19872,2067.408064,
+ 0,-0.995178,0.09809,200.646178,-959.373118,2035.202153,
+ 0,-0.986639,0.16292,200.646178,-956.19872,2067.408064,
+ 0,-0.995178,0.09809,635.537065,-959.373118,2035.202153,
+ 0,-0.973818,0.227328,635.537065,-956.19872,2067.408064,
+ 0,-0.995178,0.09809,200.646178,-878.882267,2035.202153,
+ 0,-0.986639,0.16292,97.301517,-877.254479,2051.716912,
+ 0,-0.995178,0.09809,97.301517,-878.882267,2035.202153,
+ 0,-0.986639,0.16292,97.301517,-877.254479,2051.716912,
+ 0,-0.995178,0.09809,200.646178,-878.882267,2035.202153,
+ 0,-0.973818,0.227328,200.646178,-877.254479,2051.716912,
+ 0,-0.995178,0.09809,97.301517,-930.959963,2035.202153,
+ 0,-0.986639,0.16292,45.307526,-928.331516,2061.86911,
+ 0,-0.995178,0.09809,45.307526,-930.959963,2035.202153,
+ 0,-0.986639,0.16292,45.307526,-928.331516,2061.86911,
+ 0,-0.995178,0.09809,97.301517,-930.959963,2035.202153,
+ 0,-0.973818,0.227328,97.301517,-928.331516,2061.86911,
+ 0.975657,-0.216153,0.037036,1085.391405,-811.619967,2038.671235,
+ 0.932578,-0.359229,0.035408,1080.0746,-829.073329,2035.202153,
+ 0.979702,-0.199495,0.019663,1085.391405,-811.9619,2035.202153,
+ 0.932578,-0.359229,0.035408,1080.0746,-829.073329,2035.202153,
+ 0.975657,-0.216153,0.037036,1085.391405,-811.619967,2038.671235,
+ 0.920642,-0.383474,0.073251,1080.0746,-828.402605,2042.006994,
+ -1,0,0,635.537065,-835.292444,2241.800118,
+ -1,0,0,635.537065,-794.16656,2200.284205,
+ -1,0,0,635.537065,-826.396761,2197.1122,
+ -1,0,0,635.537065,-794.16656,2200.284205,
+ -1,0,0,635.537065,-835.292444,2241.800118,
+ -1,0,0,635.537065,-794.16656,2245.847611,
+ 0.972352,-0.022872,0.232398,1085.391405,-794.16656,2052.984082,
+ 0.975625,-0.048525,0.214014,1085.391405,-797.638259,2052.642407,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 0.975625,-0.048525,0.214014,1085.391405,-797.638259,2052.642407,
+ 0.975629,-0.089314,0.200429,1085.391405,-800.976542,2051.630513,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 0.975629,-0.089314,0.200429,1085.391405,-800.976542,2051.630513,
+ 0.975635,-0.126671,0.179142,1085.391405,-804.053121,2049.987287,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 0.975635,-0.126671,0.179142,1085.391405,-804.053121,2049.987287,
+ 0.975641,-0.159161,0.15097,1085.391405,-806.749765,2047.775876,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 0.975641,-0.159161,0.15097,1085.391405,-806.749765,2047.775876,
+ 0.975648,-0.185535,0.116996,1085.391405,-808.962844,2045.081264,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 0.975648,-0.185535,0.116996,1085.391405,-808.962844,2045.081264,
+ 0.975653,-0.204779,0.078525,1085.391405,-810.60731,2042.007003,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 0.975653,-0.204779,0.078525,1085.391405,-810.60731,2042.007003,
+ 0.975657,-0.216153,0.037036,1085.391405,-811.619967,2038.671235,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 0.975657,-0.216153,0.037036,1085.391405,-811.619967,2038.671235,
+ 0.979702,-0.199495,0.019663,1085.391405,-811.9619,2035.202153,
+ 0.995845,-0.06437,0.064418,1087.186642,-794.16656,2035.202153,
+ 1,0,0,993.755282,-883.626694,2052.983469,
+ 1,0,0,993.755282,-1004.970888,2035.202153,
+ 1,0,0,993.755282,-885.379322,2035.202153,
+ 1,0,0,993.755282,-1004.970888,2035.202153,
+ 1,0,0,993.755282,-883.626694,2052.983469,
+ 1,0,0,993.755282,-1000.920342,2076.297043,
+ 1,0,0,97.301517,-872.433668,2067.597018,
+ 1,0,0,97.301517,-928.331516,2061.86911,
+ 1,0,0,97.301517,-877.254479,2051.716912,
+ 1,0,0,97.301517,-928.331516,2061.86911,
+ 1,0,0,97.301517,-872.433668,2067.597018,
+ 1,0,0,97.301517,-920.547185,2087.51127,
+ -1,0,0,45.307526,-920.547185,2087.51127,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-928.331516,2061.86911,
+ -1,0,0,200.646178,-826.396761,2197.1122,
+ -1,0,0,200.646178,-794.16656,2119.854015,
+ -1,0,0,200.646178,-810.693775,2118.227454,
+ -1,0,0,200.646178,-794.16656,2119.854015,
+ -1,0,0,200.646178,-826.396761,2197.1122,
+ -1,0,0,200.646178,-794.16656,2200.284205,
+ -1,0,0,45.307526,-928.331516,2061.86911,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-930.959963,2035.202153,
+ -1,0,0,45.307526,-794.16656,2171.892463,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-820.853629,2169.265997,
+ -1,0,0,45.307526,-907.906118,2111.143221,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-920.547185,2087.51127,
+ -1,0,0,45.307526,-890.894103,2131.856798,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-907.906118,2111.143221,
+ -1,0,0,45.307526,-870.164903,2148.855992,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-890.894103,2131.856798,
+ -1,0,0,45.307526,-846.515129,2161.487533,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-870.164903,2148.855992,
+ -1,0,0,45.307526,-820.853629,2169.265997,
+ -1,0,0,45.307526,-794.16656,2035.202153,
+ -1,0,0,45.307526,-846.515129,2161.487533,
+ -1,0,0,200.646178,-956.19872,2067.408064,
+ -1,0,0,200.646178,-878.882267,2035.202153,
+ -1,0,0,200.646178,-959.373118,2035.202153,
+ -1,0,0,200.646178,-878.882267,2035.202153,
+ -1,0,0,200.646178,-956.19872,2067.408064,
+ -1,0,0,200.646178,-877.254479,2051.716912,
+ -1,0,0,200.646178,-956.19872,2067.408064,
+ -1,0,0,200.646178,-872.433668,2067.597018,
+ -1,0,0,200.646178,-877.254479,2051.716912,
+ -1,0,0,200.646178,-872.433668,2067.597018,
+ -1,0,0,200.646178,-956.19872,2067.408064,
+ -1,0,0,200.646178,-946.797518,2098.376319,
+ -1,0,0,200.646178,-946.797518,2098.376319,
+ -1,0,0,200.646178,-864.605096,2082.232208,
+ -1,0,0,200.646178,-872.433668,2067.597018,
+ -1,0,0,200.646178,-864.605096,2082.232208,
+ -1,0,0,200.646178,-946.797518,2098.376319,
+ -1,0,0,200.646178,-931.530793,2126.916827,
+ -1,0,0,200.646178,-931.530793,2126.916827,
+ -1,0,0,200.646178,-854.069611,2095.060059,
+ -1,0,0,200.646178,-864.605096,2082.232208,
+ -1,0,0,200.646178,-854.069611,2095.060059,
+ -1,0,0,200.646178,-931.530793,2126.916827,
+ -1,0,0,200.646178,-910.985237,2151.932791,
+ -1,0,0,200.646178,-910.985237,2151.932791,
+ -1,0,0,200.646178,-841.232085,2105.587604,
+ -1,0,0,200.646178,-854.069611,2095.060059,
+ -1,0,0,200.646178,-841.232085,2105.587604,
+ -1,0,0,200.646178,-910.985237,2151.932791,
+ -1,0,0,200.646178,-885.950406,2172.462863,
+ -1,0,0,200.646178,-885.950406,2172.462863,
+ -1,0,0,200.646178,-826.585858,2113.410276,
+ -1,0,0,200.646178,-841.232085,2105.587604,
+ -1,0,0,200.646178,-826.585858,2113.410276,
+ -1,0,0,200.646178,-885.950406,2172.462863,
+ -1,0,0,200.646178,-857.388373,2187.718082,
+ -1,0,0,200.646178,-857.388373,2187.718082,
+ -1,0,0,200.646178,-810.693775,2118.227454,
+ -1,0,0,200.646178,-826.585858,2113.410276,
+ -1,0,0,200.646178,-810.693775,2118.227454,
+ -1,0,0,200.646178,-857.388373,2187.718082,
+ -1,0,0,200.646178,-826.396761,2197.1122,
+ -1,0,0,635.537065,-1000.920342,2076.297043,
+ -1,0,0,635.537065,-959.373118,2035.202153,
+ -1,0,0,635.537065,-1004.970888,2035.202153,
+ -1,0,0,635.537065,-959.373118,2035.202153,
+ -1,0,0,635.537065,-1000.920342,2076.297043,
+ -1,0,0,635.537065,-956.19872,2067.408064,
+ -1,0,0,635.537065,-1000.920342,2076.297043,
+ -1,0,0,635.537065,-946.797518,2098.376319,
+ -1,0,0,635.537065,-956.19872,2067.408064,
+ -1,0,0,635.537065,-946.797518,2098.376319,
+ -1,0,0,635.537065,-1000.920342,2076.297043,
+ -1,0,0,635.537065,-988.924364,2115.81268,
+ -1,0,0,635.537065,-988.924364,2115.81268,
+ -1,0,0,635.537065,-931.530793,2126.916827,
+ -1,0,0,635.537065,-946.797518,2098.376319,
+ -1,0,0,635.537065,-931.530793,2126.916827,
+ -1,0,0,635.537065,-988.924364,2115.81268,
+ -1,0,0,635.537065,-969.443953,2152.230499,
+ -1,0,0,635.537065,-969.443953,2152.230499,
+ -1,0,0,635.537065,-910.985237,2151.932791,
+ -1,0,0,635.537065,-931.530793,2126.916827,
+ -1,0,0,635.537065,-910.985237,2151.932791,
+ -1,0,0,635.537065,-969.443953,2152.230499,
+ -1,0,0,635.537065,-943.22773,2184.150985,
+ -1,0,0,635.537065,-943.22773,2184.150985,
+ -1,0,0,635.537065,-885.950406,2172.462863,
+ -1,0,0,635.537065,-910.985237,2151.932791,
+ -1,0,0,635.537065,-885.950406,2172.462863,
+ -1,0,0,635.537065,-943.22773,2184.150985,
+ -1,0,0,635.537065,-911.28317,2210.34745,
+ -1,0,0,635.537065,-911.28317,2210.34745,
+ -1,0,0,635.537065,-857.388373,2187.718082,
+ -1,0,0,635.537065,-885.950406,2172.462863,
+ -1,0,0,635.537065,-857.388373,2187.718082,
+ -1,0,0,635.537065,-911.28317,2210.34745,
+ -1,0,0,635.537065,-874.837884,2229.81318,
+ -1,0,0,635.537065,-874.837884,2229.81318,
+ -1,0,0,635.537065,-826.396761,2197.1122,
+ -1,0,0,635.537065,-857.388373,2187.718082,
+ -1,0,0,635.537065,-826.396761,2197.1122,
+ -1,0,0,635.537065,-874.837884,2229.81318,
+ -1,0,0,635.537065,-835.292444,2241.800118,
+ 1,0,0,993.755282,-794.16656,2126.346173,
+ 1,0,0,993.755282,-835.292444,2241.800118,
+ 1,0,0,993.755282,-811.961287,2124.594866,
+ 1,0,0,993.755282,-835.292444,2241.800118,
+ 1,0,0,993.755282,-794.16656,2126.346173,
+ 1,0,0,993.755282,-794.16656,2245.847611,
+ 1,0,0,993.755282,-878.436163,2070.08146,
+ 1,0,0,993.755282,-1000.920342,2076.297043,
+ 1,0,0,993.755282,-883.626694,2052.983469,
+ 1,0,0,993.755282,-1000.920342,2076.297043,
+ 1,0,0,993.755282,-878.436163,2070.08146,
+ 1,0,0,993.755282,-988.924364,2115.81268,
+ 1,0,0,993.755282,-870.007199,2085.839058,
+ 1,0,0,993.755282,-988.924364,2115.81268,
+ 1,0,0,993.755282,-878.436163,2070.08146,
+ 1,0,0,993.755282,-988.924364,2115.81268,
+ 1,0,0,993.755282,-870.007199,2085.839058,
+ 1,0,0,993.755282,-969.443953,2152.230499,
+ 1,0,0,993.755282,-858.663722,2099.650708,
+ 1,0,0,993.755282,-969.443953,2152.230499,
+ 1,0,0,993.755282,-870.007199,2085.839058,
+ 1,0,0,993.755282,-969.443953,2152.230499,
+ 1,0,0,993.755282,-858.663722,2099.650708,
+ 1,0,0,993.755282,-943.22773,2184.150985,
+ 1,0,0,993.755282,-844.841655,2110.985636,
+ 1,0,0,993.755282,-943.22773,2184.150985,
+ 1,0,0,993.755282,-858.663722,2099.650708,
+ 1,0,0,993.755282,-943.22773,2184.150985,
+ 1,0,0,993.755282,-844.841655,2110.985636,
+ 1,0,0,993.755282,-911.28317,2210.34745,
+ 1,0,0,993.755282,-829.072173,2119.408248,
+ 1,0,0,993.755282,-911.28317,2210.34745,
+ 1,0,0,993.755282,-844.841655,2110.985636,
+ 1,0,0,993.755282,-911.28317,2210.34745,
+ 1,0,0,993.755282,-829.072173,2119.408248,
+ 1,0,0,993.755282,-874.837884,2229.81318,
+ 1,0,0,993.755282,-811.961287,2124.594866,
+ 1,0,0,993.755282,-874.837884,2229.81318,
+ 1,0,0,993.755282,-829.072173,2119.408248,
+ 1,0,0,993.755282,-874.837884,2229.81318,
+ 1,0,0,993.755282,-811.961287,2124.594866,
+ 1,0,0,993.755282,-835.292444,2241.800118,
+ 1,0,0,97.301517,-877.254479,2051.716912,
+ 1,0,0,97.301517,-930.959963,2035.202153,
+ 1,0,0,97.301517,-878.882267,2035.202153,
+ 1,0,0,97.301517,-930.959963,2035.202153,
+ 1,0,0,97.301517,-877.254479,2051.716912,
+ 1,0,0,97.301517,-928.331516,2061.86911,
+ 1,0,0,97.301517,-854.069611,2095.060059,
+ 1,0,0,97.301517,-907.906118,2111.143221,
+ 1,0,0,97.301517,-864.605096,2082.232208,
+ 1,0,0,97.301517,-907.906118,2111.143221,
+ 1,0,0,97.301517,-854.069611,2095.060059,
+ 1,0,0,97.301517,-890.894103,2131.856798,
+ 1,0,0,97.301517,-864.605096,2082.232208,
+ 1,0,0,97.301517,-920.547185,2087.51127,
+ 1,0,0,97.301517,-872.433668,2067.597018,
+ 1,0,0,97.301517,-920.547185,2087.51127,
+ 1,0,0,97.301517,-864.605096,2082.232208,
+ 1,0,0,97.301517,-907.906118,2111.143221,
+ 1,0,0,97.301517,-826.585858,2113.410276,
+ 1,0,0,97.301517,-870.164903,2148.855992,
+ 1,0,0,97.301517,-841.232085,2105.587604,
+ 1,0,0,97.301517,-870.164903,2148.855992,
+ 1,0,0,97.301517,-826.585858,2113.410276,
+ 1,0,0,97.301517,-846.515129,2161.487533,
+ 1,0,0,97.301517,-841.232085,2105.587604,
+ 1,0,0,97.301517,-890.894103,2131.856798,
+ 1,0,0,97.301517,-854.069611,2095.060059,
+ 1,0,0,97.301517,-890.894103,2131.856798,
+ 1,0,0,97.301517,-841.232085,2105.587604,
+ 1,0,0,97.301517,-870.164903,2148.855992,
+ 1,0,0,97.301517,-794.16656,2119.854015,
+ 1,0,0,97.301517,-820.853629,2169.265997,
+ 1,0,0,97.301517,-810.693775,2118.227454,
+ 1,0,0,97.301517,-820.853629,2169.265997,
+ 1,0,0,97.301517,-794.16656,2119.854015,
+ 1,0,0,97.301517,-794.16656,2171.892463,
+ 1,0,0,97.301517,-810.693775,2118.227454,
+ 1,0,0,97.301517,-846.515129,2161.487533,
+ 1,0,0,97.301517,-826.585858,2113.410276,
+ 1,0,0,97.301517,-846.515129,2161.487533,
+ 1,0,0,97.301517,-810.693775,2118.227454,
+ 1,0,0,97.301517,-820.853629,2169.265997
+};
+static const struct gllist robot_arm_half_frame = { GL_N3F_V3F, GL_TRIANGLES, 1104, robot_arm_half_data, 0 };
+const struct gllist *robot_arm_half = &robot_arm_half_frame;
+
+static const float robot_body_half_inside_data[] = {
+ 0.870883,0.172314,0.460294,-899.612557,-178.944064,1773.56823,
+ 0.925281,0.091132,0.36817,-944.844672,0,1835.635445,
+ 0.91848,0.181999,0.3511,-926.689746,-184.330051,1835.635445,
+ 0.925281,0.091132,0.36817,-944.844672,0,1835.635445,
+ 0.870883,0.172314,0.460294,-899.612557,-178.944064,1773.56823,
+ 0.875139,0.086194,0.476133,-917.237009,0,1773.56823,
+ 0.962266,0.094775,-0.255071,-964.850983,0,2169.851549,
+ 0.91848,0.181999,-0.3511,-926.689746,-184.330051,2234.768955,
+ 0.952958,0.189085,-0.236891,-946.311642,-188.233089,2169.851549,
+ 0.91848,0.181999,-0.3511,-926.689746,-184.330051,2234.768955,
+ 0.962266,0.094775,-0.255071,-964.850983,0,2169.851549,
+ 0.925281,0.091132,-0.36817,-944.844672,0,2234.768955,
+ 0.973826,0.193469,0.119297,-958.198007,-190.597434,1967.393306,
+ 0.995185,0.098017,-0,-981.029284,-0,2035.2022,
+ 0.973856,0.227168,-0,-962.179081,-191.389319,2035.2022,
+ 0.995185,0.098017,-0,-981.029284,-0,2035.2022,
+ 0.973826,0.193469,0.119297,-958.198007,-190.597434,1967.393306,
+ 0.985604,0.097074,0.138423,-976.970216,-0,1967.393306,
+ 0.740863,0.278762,0.611076,-776.888194,-321.797626,1661.47676,
+ 0.810848,0.160167,0.562913,-865.466789,-172.152048,1715.237645,
+ 0.764021,0.315278,0.562913,-815.251889,-337.688389,1715.237645,
+ 0.810848,0.160167,0.562913,-865.466789,-172.152048,1715.237645,
+ 0.740863,0.278762,0.611076,-776.888194,-321.797626,1661.47676,
+ 0.781011,0.12887,0.611076,-824.740108,-164.051007,1661.47676,
+ 0.662575,0.661607,0.3511,-668.106075,-668.106075,1835.635445,
+ 0.808059,0.539373,0.236891,-802.244273,-536.042486,1900.552851,
+ 0.687306,0.686654,0.236891,-682.252673,-682.252673,1900.552851,
+ 0.808059,0.539373,0.236891,-802.244273,-536.042486,1900.552851,
+ 0.662575,0.661607,0.3511,-668.106075,-668.106075,1835.635445,
+ 0.778916,0.519633,0.3511,-785.609633,-524.927574,1835.635445,
+ 0.876472,0.172332,0.449554,-721.176029,-143.450831,680.911024,
+ 0.966069,0.095149,0.240119,-756.121025,0,741.194313,
+ 0.961634,0.1904,0.197505,-741.592372,-147.511894,741.194313,
+ 0.966069,0.095149,0.240119,-756.121025,0,741.194313,
+ 0.876472,0.172332,0.449554,-721.176029,-143.450831,680.911024,
+ 0.869022,0.085591,0.487313,-735.304703,0,680.911024,
+ 0.91848,0.181999,-0.3511,-926.689746,-184.330051,2234.768955,
+ 0.820532,0.338904,-0.460294,-847.416499,-351.011407,2296.83617,
+ 0.865325,0.357689,-0.3511,-872.922654,-361.576402,2234.768955,
+ 0.820532,0.338904,-0.460294,-847.416499,-351.011407,2296.83617,
+ 0.91848,0.181999,-0.3511,-926.689746,-184.330051,2234.768955,
+ 0.870883,0.172314,-0.460294,-899.612557,-178.944064,2296.83617,
+ 0.160167,0.810848,-0.562913,-172.152048,-865.466789,2355.166755,
+ -0.000898,0.887766,-0.460294,0,-917.237009,2296.83617,
+ 0.172314,0.870883,-0.460294,-178.944064,-899.612557,2296.83617,
+ -0.000898,0.887766,-0.460294,0,-917.237009,2296.83617,
+ 0.160167,0.810848,-0.562913,-172.152048,-865.466789,2355.166755,
+ -0.001099,0.826515,-0.562913,0,-882.422286,2355.166755,
+ 0.632456,0.632456,-0.447214,-429.428666,-429.428666,1287.75132,
+ 0.521108,0.727062,-0.447021,-389.30762,-582.640028,1100.8886,
+ 0.632456,0.632456,-0.447214,-495.494614,-495.494614,1100.8886,
+ 0.521108,0.727062,-0.447021,-389.30762,-582.640028,1100.8886,
+ 0.632456,0.632456,-0.447214,-429.428666,-429.428666,1287.75132,
+ 0.472298,0.759676,-0.447021,-337.399938,-504.954691,1287.75132,
+ 0.189085,0.952958,-0.236891,-188.233089,-946.311642,2169.851549,
+ 0.014067,0.991704,-0.12777,0,-976.970216,2103.011094,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.014067,0.991704,-0.12777,0,-976.970216,2103.011094,
+ 0.189085,0.952958,-0.236891,-188.233089,-946.311642,2169.851549,
+ 0,0.966617,-0.256224,0,-964.850983,2169.851549,
+ 0.181999,0.91848,-0.3511,-184.330051,-926.689746,2234.768955,
+ 0,0.966617,-0.256224,0,-964.850983,2169.851549,
+ 0.189085,0.952958,-0.236891,-188.233089,-946.311642,2169.851549,
+ 0,0.966617,-0.256224,0,-964.850983,2169.851549,
+ 0.181999,0.91848,-0.3511,-184.330051,-926.689746,2234.768955,
+ -0.014053,0.939213,-0.343046,0,-944.844672,2234.768955,
+ 0.172314,0.870883,-0.460294,-178.944064,-899.612557,2296.83617,
+ -0.014053,0.939213,-0.343046,0,-944.844672,2234.768955,
+ 0.181999,0.91848,-0.3511,-184.330051,-926.689746,2234.768955,
+ -0.014053,0.939213,-0.343046,0,-944.844672,2234.768955,
+ 0.172314,0.870883,-0.460294,-178.944064,-899.612557,2296.83617,
+ -0.000898,0.887766,-0.460294,0,-917.237009,2296.83617,
+ 0.174075,0.870533,0.460294,-178.944064,-899.612557,1773.56823,
+ 0.001099,0.826515,0.562913,0,-882.422286,1715.237645,
+ 0.162323,0.81042,0.562913,-172.152048,-865.466789,1715.237645,
+ 0.001099,0.826515,0.562913,0,-882.422286,1715.237645,
+ 0.174075,0.870533,0.460294,-178.944064,-899.612557,1773.56823,
+ 0.000898,0.887766,0.460294,0,-917.237009,1773.56823,
+ 0.687306,0.686654,0.236891,-682.252673,-682.252673,1900.552851,
+ 0.52077,0.778156,0.3511,-524.927574,-785.609633,1835.635445,
+ 0.662575,0.661607,0.3511,-668.106075,-668.106075,1835.635445,
+ 0.52077,0.778156,0.3511,-524.927574,-785.609633,1835.635445,
+ 0.687306,0.686654,0.236891,-682.252673,-682.252673,1900.552851,
+ 0.54014,0.807547,0.236891,-536.042486,-802.244273,1900.552851,
+ 0.692994,0.720844,0.011969,-693.692459,-693.692459,2035.2022,
+ 0.551796,0.825403,0.119297,-542.77557,-812.321046,1967.393306,
+ 0.702221,0.701893,0.119297,-690.822265,-690.822265,1967.393306,
+ 0.551796,0.825403,0.119297,-542.77557,-812.321046,1967.393306,
+ 0.692994,0.720844,0.011969,-693.692459,-693.692459,2035.2022,
+ 0.55557,0.83147,0,-545.030668,-815.696038,2035.2022,
+ 0.814754,0.369253,-0.447021,-690.554573,-286.03707,1287.75132,
+ 0.759676,0.472298,-0.447021,-543.79736,-363.353779,1474.61404,
+ 0.727062,0.521108,-0.447021,-621.482696,-415.261462,1287.75132,
+ 0.759676,0.472298,-0.447021,-543.79736,-363.353779,1474.61404,
+ 0.814754,0.369253,-0.447021,-690.554573,-286.03707,1287.75132,
+ 0.837219,0.315017,-0.447021,-604.235252,-250.282436,1474.61404,
+ 0,0,-1,-747.450884,0,2408.92764,
+ 0,0,-1,-824.740108,-164.051007,2408.92764,
+ 0,0,-1,-840.897722,0,2408.92764,
+ 0,0,-1,-824.740108,-164.051007,2408.92764,
+ 0,0,-1,-747.450884,0,2408.92764,
+ 0,0,-1,-776.888194,-321.797626,2408.92764,
+ 0,0,-1,-776.888194,-321.797626,2408.92764,
+ 0,0,-1,-747.450884,0,2408.92764,
+ 0,0,-1,-733.088824,-145.820434,2408.92764,
+ 0,0,-1,-776.888194,-321.797626,2408.92764,
+ 0,0,-1,-733.088824,-145.820434,2408.92764,
+ 0,0,-1,-699.180902,-467.177743,2408.92764,
+ 0,0,-1,-699.180902,-467.177743,2408.92764,
+ 0,0,-1,-733.088824,-145.820434,2408.92764,
+ 0,0,-1,-690.554573,-286.03707,2408.92764,
+ 0,0,-1,-699.180902,-467.177743,2408.92764,
+ 0,0,-1,-690.554573,-286.03707,2408.92764,
+ 0,0,-1,-594.604481,-594.604481,2408.92764,
+ 0,0,-1,-594.604481,-594.604481,2408.92764,
+ 0,0,-1,-690.554573,-286.03707,2408.92764,
+ 0,0,-1,-621.482696,-415.261462,2408.92764,
+ 0,0,-1,-594.604481,-594.604481,2408.92764,
+ 0,0,-1,-621.482696,-415.261462,2408.92764,
+ 0,0,-1,-528.527588,-528.527588,2408.92764,
+ 0,0,-1,-594.604481,-594.604481,2408.92764,
+ 0,0,-1,-528.527588,-528.527588,2408.92764,
+ 0,0,-1,-467.177743,-699.180902,2408.92764,
+ 0,0,-1,-467.177743,-699.180902,2408.92764,
+ 0,0,-1,-528.527588,-528.527588,2408.92764,
+ 0,0,-1,-415.261462,-621.482696,2408.92764,
+ 0,0,-1,-467.177743,-699.180902,2408.92764,
+ 0,0,-1,-415.261462,-621.482696,2408.92764,
+ 0,0,-1,-321.797626,-776.888194,2408.92764,
+ 0,0,-1,-321.797626,-776.888194,2408.92764,
+ 0,0,-1,-415.261462,-621.482696,2408.92764,
+ 0,0,-1,-286.03707,-690.554573,2408.92764,
+ 0,0,-1,-321.797626,-776.888194,2408.92764,
+ 0,0,-1,-286.03707,-690.554573,2408.92764,
+ 0,0,-1,-164.051007,-824.740108,2408.92764,
+ 0,0,-1,-164.051007,-824.740108,2408.92764,
+ 0,0,-1,-286.03707,-690.554573,2408.92764,
+ 0,0,-1,-145.820434,-733.088824,2408.92764,
+ 0,0,-1,-164.051007,-824.740108,2408.92764,
+ 0,0,-1,-145.820434,-733.088824,2408.92764,
+ 0,0,-1,0,-840.897722,2408.92764,
+ 0,0,-1,0,-840.897722,2408.92764,
+ 0,0,-1,-145.820434,-733.088824,2408.92764,
+ 0,0,-1,0,-747.450884,2408.92764,
+ 0,0,-1,0,-840.897722,2408.92764,
+ 0,0,-1,0,-747.450884,2408.92764,
+ 0,0,-1,145.820434,-733.088824,2408.92764,
+ 0,0,-1,0,-840.897722,2408.92764,
+ 0,0,-1,145.820434,-733.088824,2408.92764,
+ 0,0,-1,164.051007,-824.740108,2408.92764,
+ 0,0,-1,164.051007,-824.740108,2408.92764,
+ 0,0,-1,145.820434,-733.088824,2408.92764,
+ 0,0,-1,286.03707,-690.554573,2408.92764,
+ 0,0,-1,164.051007,-824.740108,2408.92764,
+ 0,0,-1,286.03707,-690.554573,2408.92764,
+ 0,0,-1,321.797626,-776.888194,2408.92764,
+ 0,0,-1,321.797626,-776.888194,2408.92764,
+ 0,0,-1,286.03707,-690.554573,2408.92764,
+ 0,0,-1,415.261462,-621.482696,2408.92764,
+ 0,0,-1,321.797626,-776.888194,2408.92764,
+ 0,0,-1,415.261462,-621.482696,2408.92764,
+ 0,0,-1,467.177743,-699.180902,2408.92764,
+ 0,0,-1,467.177743,-699.180902,2408.92764,
+ 0,0,-1,415.261462,-621.482696,2408.92764,
+ 0,0,-1,528.527588,-528.527588,2408.92764,
+ 0,0,-1,467.177743,-699.180902,2408.92764,
+ 0,0,-1,528.527588,-528.527588,2408.92764,
+ 0,0,-1,594.604481,-594.604481,2408.92764,
+ 0,0,-1,594.604481,-594.604481,2408.92764,
+ 0,0,-1,528.527588,-528.527588,2408.92764,
+ 0,0,-1,621.482696,-415.261462,2408.92764,
+ 0,0,-1,594.604481,-594.604481,2408.92764,
+ 0,0,-1,621.482696,-415.261462,2408.92764,
+ 0,0,-1,699.180902,-467.177743,2408.92764,
+ 0,0,-1,699.180902,-467.177743,2408.92764,
+ 0,0,-1,621.482696,-415.261462,2408.92764,
+ 0,0,-1,690.554573,-286.03707,2408.92764,
+ 0,0,-1,699.180902,-467.177743,2408.92764,
+ 0,0,-1,690.554573,-286.03707,2408.92764,
+ 0,0,-1,733.088824,-145.820434,2408.92764,
+ 0,0,-1,699.180902,-467.177743,2408.92764,
+ 0,0,-1,733.088824,-145.820434,2408.92764,
+ 0,0,-1,776.888194,-321.797626,2408.92764,
+ 0,0,-1,776.888194,-321.797626,2408.92764,
+ 0,0,-1,733.088824,-145.820434,2408.92764,
+ 0,0,-1,747.450884,-0,2408.92764,
+ 0,0,-1,776.888194,-321.797626,2408.92764,
+ 0,0,-1,747.450884,-0,2408.92764,
+ 0,0,-1,840.897722,-0,2408.92764,
+ 0,0,-1,776.888194,-321.797626,2408.92764,
+ 0,0,-1,840.897722,-0,2408.92764,
+ 0,0,-1,824.740108,-164.051007,2408.92764,
+ 0,0,1,-824.740108,-164.051007,1661.47676,
+ 0,0,1,-700.735204,0,1661.47676,
+ 0,0,1,-840.897722,0,1661.47676,
+ 0,0,1,-700.735204,0,1661.47676,
+ 0,0,1,-824.740108,-164.051007,1661.47676,
+ 0,0,1,-776.888194,-321.797626,1661.47676,
+ 0,0,1,-700.735204,0,1661.47676,
+ 0,0,1,-776.888194,-321.797626,1661.47676,
+ 0,0,1,-699.180902,-467.177743,1661.47676,
+ 0,0,1,-700.735204,0,1661.47676,
+ 0,0,1,-699.180902,-467.177743,1661.47676,
+ 0,0,1,-687.270773,-136.706657,1661.47676,
+ 0,0,1,-687.270773,-136.706657,1661.47676,
+ 0,0,1,-699.180902,-467.177743,1661.47676,
+ 0,0,1,-594.604481,-594.604481,1661.47676,
+ 0,0,1,-687.270773,-136.706657,1661.47676,
+ 0,0,1,-594.604481,-594.604481,1661.47676,
+ 0,0,1,-647.394912,-268.159753,1661.47676,
+ 0,0,1,-647.394912,-268.159753,1661.47676,
+ 0,0,1,-594.604481,-594.604481,1661.47676,
+ 0,0,1,-582.640028,-389.30762,1661.47676,
+ 0,0,1,-582.640028,-389.30762,1661.47676,
+ 0,0,1,-594.604481,-594.604481,1661.47676,
+ 0,0,1,-467.177743,-699.180902,1661.47676,
+ 0,0,1,-582.640028,-389.30762,1661.47676,
+ 0,0,1,-467.177743,-699.180902,1661.47676,
+ 0,0,1,-495.494614,-495.494614,1661.47676,
+ 0,0,1,-495.494614,-495.494614,1661.47676,
+ 0,0,1,-467.177743,-699.180902,1661.47676,
+ 0,0,1,-389.30762,-582.640028,1661.47676,
+ 0,0,1,-389.30762,-582.640028,1661.47676,
+ 0,0,1,-467.177743,-699.180902,1661.47676,
+ 0,0,1,-321.797626,-776.888194,1661.47676,
+ 0,0,1,-389.30762,-582.640028,1661.47676,
+ 0,0,1,-321.797626,-776.888194,1661.47676,
+ 0,0,1,-268.159753,-647.394912,1661.47676,
+ 0,0,1,-268.159753,-647.394912,1661.47676,
+ 0,0,1,-321.797626,-776.888194,1661.47676,
+ 0,0,1,-164.051007,-824.740108,1661.47676,
+ 0,0,1,-268.159753,-647.394912,1661.47676,
+ 0,0,1,-164.051007,-824.740108,1661.47676,
+ 0,0,1,-136.706657,-687.270773,1661.47676,
+ 0,0,1,-136.706657,-687.270773,1661.47676,
+ 0,0,1,-164.051007,-824.740108,1661.47676,
+ 0,0,1,0,-840.897722,1661.47676,
+ 0,0,1,-136.706657,-687.270773,1661.47676,
+ 0,0,1,0,-840.897722,1661.47676,
+ 0,0,1,0,-700.735204,1661.47676,
+ 0,0,1,0,-700.735204,1661.47676,
+ 0,0,1,0,-840.897722,1661.47676,
+ 0,0,1,164.051007,-824.740108,1661.47676,
+ 0,0,1,0,-700.735204,1661.47676,
+ 0,0,1,164.051007,-824.740108,1661.47676,
+ 0,0,1,136.706657,-687.270773,1661.47676,
+ 0,0,1,136.706657,-687.270773,1661.47676,
+ 0,0,1,164.051007,-824.740108,1661.47676,
+ 0,0,1,268.159753,-647.394912,1661.47676,
+ 0,0,1,268.159753,-647.394912,1661.47676,
+ 0,0,1,164.051007,-824.740108,1661.47676,
+ 0,0,1,321.797626,-776.888194,1661.47676,
+ 0,0,1,268.159753,-647.394912,1661.47676,
+ 0,0,1,321.797626,-776.888194,1661.47676,
+ 0,0,1,389.30762,-582.640028,1661.47676,
+ 0,0,1,389.30762,-582.640028,1661.47676,
+ 0,0,1,321.797626,-776.888194,1661.47676,
+ 0,0,1,467.177743,-699.180902,1661.47676,
+ 0,0,1,389.30762,-582.640028,1661.47676,
+ 0,0,1,467.177743,-699.180902,1661.47676,
+ 0,0,1,495.494614,-495.494614,1661.47676,
+ 0,0,1,495.494614,-495.494614,1661.47676,
+ 0,0,1,467.177743,-699.180902,1661.47676,
+ 0,0,1,594.604481,-594.604481,1661.47676,
+ 0,0,1,495.494614,-495.494614,1661.47676,
+ 0,0,1,594.604481,-594.604481,1661.47676,
+ 0,0,1,582.640028,-389.30762,1661.47676,
+ 0,0,1,582.640028,-389.30762,1661.47676,
+ 0,0,1,594.604481,-594.604481,1661.47676,
+ 0,0,1,647.394912,-268.159753,1661.47676,
+ 0,0,1,647.394912,-268.159753,1661.47676,
+ 0,0,1,594.604481,-594.604481,1661.47676,
+ 0,0,1,699.180902,-467.177743,1661.47676,
+ 0,0,1,647.394912,-268.159753,1661.47676,
+ 0,0,1,699.180902,-467.177743,1661.47676,
+ 0,0,1,687.270773,-136.706657,1661.47676,
+ 0,0,1,687.270773,-136.706657,1661.47676,
+ 0,0,1,699.180902,-467.177743,1661.47676,
+ 0,0,1,700.735204,-0,1661.47676,
+ 0,0,1,700.735204,-0,1661.47676,
+ 0,0,1,699.180902,-467.177743,1661.47676,
+ 0,0,1,776.888194,-321.797626,1661.47676,
+ 0,0,1,700.735204,-0,1661.47676,
+ 0,0,1,776.888194,-321.797626,1661.47676,
+ 0,0,1,840.897722,-0,1661.47676,
+ 0,0,1,840.897722,-0,1661.47676,
+ 0,0,1,776.888194,-321.797626,1661.47676,
+ 0,0,1,824.740108,-164.051007,1661.47676,
+ 0,0,1,-778.906876,-154.934211,1474.61404,
+ 0,0,1,-654.019524,0,1474.61404,
+ 0,0,1,-794.166564,0,1474.61404,
+ 0,0,1,-654.019524,0,1474.61404,
+ 0,0,1,-778.906876,-154.934211,1474.61404,
+ 0,0,1,-733.714234,-303.914386,1474.61404,
+ 0,0,1,-654.019524,0,1474.61404,
+ 0,0,1,-733.714234,-303.914386,1474.61404,
+ 0,0,1,-660.325365,-441.215303,1474.61404,
+ 0,0,1,-654.019524,0,1474.61404,
+ 0,0,1,-660.325365,-441.215303,1474.61404,
+ 0,0,1,-641.452722,-127.592879,1474.61404,
+ 0,0,1,-641.452722,-127.592879,1474.61404,
+ 0,0,1,-660.325365,-441.215303,1474.61404,
+ 0,0,1,-561.560563,-561.560563,1474.61404,
+ 0,0,1,-641.452722,-127.592879,1474.61404,
+ 0,0,1,-561.560563,-561.560563,1474.61404,
+ 0,0,1,-604.235252,-250.282436,1474.61404,
+ 0,0,1,-604.235252,-250.282436,1474.61404,
+ 0,0,1,-561.560563,-561.560563,1474.61404,
+ 0,0,1,-543.79736,-363.353779,1474.61404,
+ 0,0,1,-543.79736,-363.353779,1474.61404,
+ 0,0,1,-561.560563,-561.560563,1474.61404,
+ 0,0,1,-441.215303,-660.325365,1474.61404,
+ 0,0,1,-543.79736,-363.353779,1474.61404,
+ 0,0,1,-441.215303,-660.325365,1474.61404,
+ 0,0,1,-462.46164,-462.46164,1474.61404,
+ 0,0,1,-462.46164,-462.46164,1474.61404,
+ 0,0,1,-441.215303,-660.325365,1474.61404,
+ 0,0,1,-363.353779,-543.79736,1474.61404,
+ 0,0,1,-363.353779,-543.79736,1474.61404,
+ 0,0,1,-441.215303,-660.325365,1474.61404,
+ 0,0,1,-303.914386,-733.714234,1474.61404,
+ 0,0,1,-363.353779,-543.79736,1474.61404,
+ 0,0,1,-303.914386,-733.714234,1474.61404,
+ 0,0,1,-250.282436,-604.235252,1474.61404,
+ 0,0,1,-250.282436,-604.235252,1474.61404,
+ 0,0,1,-303.914386,-733.714234,1474.61404,
+ 0,0,1,-154.934211,-778.906876,1474.61404,
+ 0,0,1,-250.282436,-604.235252,1474.61404,
+ 0,0,1,-154.934211,-778.906876,1474.61404,
+ 0,0,1,-127.592879,-641.452722,1474.61404,
+ 0,0,1,-127.592879,-641.452722,1474.61404,
+ 0,0,1,-154.934211,-778.906876,1474.61404,
+ 0,0,1,0,-794.166564,1474.61404,
+ 0,0,1,-127.592879,-641.452722,1474.61404,
+ 0,0,1,0,-794.166564,1474.61404,
+ 0,0,1,0,-654.019524,1474.61404,
+ 0,0,1,0,-654.019524,1474.61404,
+ 0,0,1,0,-794.166564,1474.61404,
+ 0,0,1,154.934211,-778.906876,1474.61404,
+ 0,0,1,0,-654.019524,1474.61404,
+ 0,0,1,154.934211,-778.906876,1474.61404,
+ 0,0,1,127.592879,-641.452722,1474.61404,
+ 0,0,1,127.592879,-641.452722,1474.61404,
+ 0,0,1,154.934211,-778.906876,1474.61404,
+ 0,0,1,250.282436,-604.235252,1474.61404,
+ 0,0,1,250.282436,-604.235252,1474.61404,
+ 0,0,1,154.934211,-778.906876,1474.61404,
+ 0,0,1,303.914386,-733.714234,1474.61404,
+ 0,0,1,250.282436,-604.235252,1474.61404,
+ 0,0,1,303.914386,-733.714234,1474.61404,
+ 0,0,1,363.353779,-543.79736,1474.61404,
+ 0,0,1,363.353779,-543.79736,1474.61404,
+ 0,0,1,303.914386,-733.714234,1474.61404,
+ 0,0,1,441.215303,-660.325365,1474.61404,
+ 0,0,1,363.353779,-543.79736,1474.61404,
+ 0,0,1,441.215303,-660.325365,1474.61404,
+ 0,0,1,462.46164,-462.46164,1474.61404,
+ 0,0,1,462.46164,-462.46164,1474.61404,
+ 0,0,1,441.215303,-660.325365,1474.61404,
+ 0,0,1,561.560563,-561.560563,1474.61404,
+ 0,0,1,462.46164,-462.46164,1474.61404,
+ 0,0,1,561.560563,-561.560563,1474.61404,
+ 0,0,1,543.79736,-363.353779,1474.61404,
+ 0,0,1,543.79736,-363.353779,1474.61404,
+ 0,0,1,561.560563,-561.560563,1474.61404,
+ 0,0,1,604.235252,-250.282436,1474.61404,
+ 0,0,1,604.235252,-250.282436,1474.61404,
+ 0,0,1,561.560563,-561.560563,1474.61404,
+ 0,0,1,660.325365,-441.215303,1474.61404,
+ 0,0,1,604.235252,-250.282436,1474.61404,
+ 0,0,1,660.325365,-441.215303,1474.61404,
+ 0,0,1,641.452722,-127.592879,1474.61404,
+ 0,0,1,641.452722,-127.592879,1474.61404,
+ 0,0,1,660.325365,-441.215303,1474.61404,
+ 0,0,1,654.019524,-0,1474.61404,
+ 0,0,1,654.019524,-0,1474.61404,
+ 0,0,1,660.325365,-441.215303,1474.61404,
+ 0,0,1,794.166564,-0,1474.61404,
+ 0,0,1,794.166564,-0,1474.61404,
+ 0,0,1,660.325365,-441.215303,1474.61404,
+ 0,0,1,733.714234,-303.914386,1474.61404,
+ 0,0,1,794.166564,-0,1474.61404,
+ 0,0,1,733.714234,-303.914386,1474.61404,
+ 0,0,1,778.906876,-154.934211,1474.61404,
+ 0,0,1,-687.270773,-136.706657,1100.8886,
+ 0,0,1,-467.156804,0,1100.8886,
+ 0,0,1,-700.735204,0,1100.8886,
+ 0,0,1,-467.156804,0,1100.8886,
+ 0,0,1,-687.270773,-136.706657,1100.8886,
+ 0,0,1,-647.394912,-268.159753,1100.8886,
+ 0,0,1,-467.156804,0,1100.8886,
+ 0,0,1,-647.394912,-268.159753,1100.8886,
+ 0,0,1,-582.640028,-389.30762,1100.8886,
+ 0,0,1,-467.156804,0,1100.8886,
+ 0,0,1,-582.640028,-389.30762,1100.8886,
+ 0,0,1,-495.494614,-495.494614,1100.8886,
+ 0,0,1,-467.156804,0,1100.8886,
+ 0,0,1,-495.494614,-495.494614,1100.8886,
+ 0,0,1,-458.180517,-91.137771,1100.8886,
+ 0,0,1,-458.180517,-91.137771,1100.8886,
+ 0,0,1,-495.494614,-495.494614,1100.8886,
+ 0,0,1,-389.30762,-582.640028,1100.8886,
+ 0,0,1,-458.180517,-91.137771,1100.8886,
+ 0,0,1,-389.30762,-582.640028,1100.8886,
+ 0,0,1,-431.596609,-178.773169,1100.8886,
+ 0,0,1,-431.596609,-178.773169,1100.8886,
+ 0,0,1,-389.30762,-582.640028,1100.8886,
+ 0,0,1,-388.426686,-259.538414,1100.8886,
+ 0,0,1,-388.426686,-259.538414,1100.8886,
+ 0,0,1,-389.30762,-582.640028,1100.8886,
+ 0,0,1,-268.159753,-647.394912,1100.8886,
+ 0,0,1,-388.426686,-259.538414,1100.8886,
+ 0,0,1,-268.159753,-647.394912,1100.8886,
+ 0,0,1,-330.329744,-330.329744,1100.8886,
+ 0,0,1,-330.329744,-330.329744,1100.8886,
+ 0,0,1,-268.159753,-647.394912,1100.8886,
+ 0,0,1,-259.538414,-388.426686,1100.8886,
+ 0,0,1,-259.538414,-388.426686,1100.8886,
+ 0,0,1,-268.159753,-647.394912,1100.8886,
+ 0,0,1,-136.706657,-687.270773,1100.8886,
+ 0,0,1,-259.538414,-388.426686,1100.8886,
+ 0,0,1,-136.706657,-687.270773,1100.8886,
+ 0,0,1,-178.773169,-431.596609,1100.8886,
+ 0,0,1,-178.773169,-431.596609,1100.8886,
+ 0,0,1,-136.706657,-687.270773,1100.8886,
+ 0,0,1,-91.137771,-458.180517,1100.8886,
+ 0,0,1,-91.137771,-458.180517,1100.8886,
+ 0,0,1,-136.706657,-687.270773,1100.8886,
+ 0,0,1,0,-700.735204,1100.8886,
+ 0,0,1,-91.137771,-458.180517,1100.8886,
+ 0,0,1,0,-700.735204,1100.8886,
+ 0,0,1,0,-467.156804,1100.8886,
+ 0,0,1,0,-467.156804,1100.8886,
+ 0,0,1,0,-700.735204,1100.8886,
+ 0,0,1,136.706657,-687.270773,1100.8886,
+ 0,0,1,0,-467.156804,1100.8886,
+ 0,0,1,136.706657,-687.270773,1100.8886,
+ 0,0,1,91.137771,-458.180517,1100.8886,
+ 0,0,1,91.137771,-458.180517,1100.8886,
+ 0,0,1,136.706657,-687.270773,1100.8886,
+ 0,0,1,178.773169,-431.596609,1100.8886,
+ 0,0,1,178.773169,-431.596609,1100.8886,
+ 0,0,1,136.706657,-687.270773,1100.8886,
+ 0,0,1,268.159753,-647.394912,1100.8886,
+ 0,0,1,178.773169,-431.596609,1100.8886,
+ 0,0,1,268.159753,-647.394912,1100.8886,
+ 0,0,1,259.538414,-388.426686,1100.8886,
+ 0,0,1,259.538414,-388.426686,1100.8886,
+ 0,0,1,268.159753,-647.394912,1100.8886,
+ 0,0,1,330.329744,-330.329744,1100.8886,
+ 0,0,1,330.329744,-330.329744,1100.8886,
+ 0,0,1,268.159753,-647.394912,1100.8886,
+ 0,0,1,389.30762,-582.640028,1100.8886,
+ 0,0,1,330.329744,-330.329744,1100.8886,
+ 0,0,1,389.30762,-582.640028,1100.8886,
+ 0,0,1,388.426686,-259.538414,1100.8886,
+ 0,0,1,388.426686,-259.538414,1100.8886,
+ 0,0,1,389.30762,-582.640028,1100.8886,
+ 0,0,1,431.596609,-178.773169,1100.8886,
+ 0,0,1,431.596609,-178.773169,1100.8886,
+ 0,0,1,389.30762,-582.640028,1100.8886,
+ 0,0,1,495.494614,-495.494614,1100.8886,
+ 0,0,1,431.596609,-178.773169,1100.8886,
+ 0,0,1,495.494614,-495.494614,1100.8886,
+ 0,0,1,458.180517,-91.137771,1100.8886,
+ 0,0,1,458.180517,-91.137771,1100.8886,
+ 0,0,1,495.494614,-495.494614,1100.8886,
+ 0,0,1,467.156804,0,1100.8886,
+ 0,0,1,467.156804,0,1100.8886,
+ 0,0,1,495.494614,-495.494614,1100.8886,
+ 0,0,1,700.735204,-0,1100.8886,
+ 0,0,1,700.735204,-0,1100.8886,
+ 0,0,1,495.494614,-495.494614,1100.8886,
+ 0,0,1,582.640028,-389.30762,1100.8886,
+ 0,0,1,700.735204,-0,1100.8886,
+ 0,0,1,582.640028,-389.30762,1100.8886,
+ 0,0,1,647.394912,-268.159753,1100.8886,
+ 0,0,1,700.735204,-0,1100.8886,
+ 0,0,1,647.394912,-268.159753,1100.8886,
+ 0,0,1,687.270773,-136.706657,1100.8886,
+ 0,0,1,-733.088824,-145.820434,1287.75132,
+ 0,0,1,-607.303844,0,1287.75132,
+ 0,0,1,-747.450884,0,1287.75132,
+ 0,0,1,-607.303844,0,1287.75132,
+ 0,0,1,-733.088824,-145.820434,1287.75132,
+ 0,0,1,-690.554573,-286.03707,1287.75132,
+ 0,0,1,-607.303844,0,1287.75132,
+ 0,0,1,-690.554573,-286.03707,1287.75132,
+ 0,0,1,-621.482696,-415.261462,1287.75132,
+ 0,0,1,-607.303844,0,1287.75132,
+ 0,0,1,-621.482696,-415.261462,1287.75132,
+ 0,0,1,-595.634671,-118.479102,1287.75132,
+ 0,0,1,-595.634671,-118.479102,1287.75132,
+ 0,0,1,-621.482696,-415.261462,1287.75132,
+ 0,0,1,-528.527588,-528.527588,1287.75132,
+ 0,0,1,-595.634671,-118.479102,1287.75132,
+ 0,0,1,-528.527588,-528.527588,1287.75132,
+ 0,0,1,-561.075591,-232.405119,1287.75132,
+ 0,0,1,-561.075591,-232.405119,1287.75132,
+ 0,0,1,-528.527588,-528.527588,1287.75132,
+ 0,0,1,-504.954691,-337.399938,1287.75132,
+ 0,0,1,-504.954691,-337.399938,1287.75132,
+ 0,0,1,-528.527588,-528.527588,1287.75132,
+ 0,0,1,-415.261462,-621.482696,1287.75132,
+ 0,0,1,-504.954691,-337.399938,1287.75132,
+ 0,0,1,-415.261462,-621.482696,1287.75132,
+ 0,0,1,-429.428666,-429.428666,1287.75132,
+ 0,0,1,-429.428666,-429.428666,1287.75132,
+ 0,0,1,-415.261462,-621.482696,1287.75132,
+ 0,0,1,-337.399938,-504.954691,1287.75132,
+ 0,0,1,-337.399938,-504.954691,1287.75132,
+ 0,0,1,-415.261462,-621.482696,1287.75132,
+ 0,0,1,-286.03707,-690.554573,1287.75132,
+ 0,0,1,-337.399938,-504.954691,1287.75132,
+ 0,0,1,-286.03707,-690.554573,1287.75132,
+ 0,0,1,-232.405119,-561.075591,1287.75132,
+ 0,0,1,-232.405119,-561.075591,1287.75132,
+ 0,0,1,-286.03707,-690.554573,1287.75132,
+ 0,0,1,-145.820434,-733.088824,1287.75132,
+ 0,0,1,-232.405119,-561.075591,1287.75132,
+ 0,0,1,-145.820434,-733.088824,1287.75132,
+ 0,0,1,-118.479102,-595.634671,1287.75132,
+ 0,0,1,-118.479102,-595.634671,1287.75132,
+ 0,0,1,-145.820434,-733.088824,1287.75132,
+ 0,0,1,0,-747.450884,1287.75132,
+ 0,0,1,-118.479102,-595.634671,1287.75132,
+ 0,0,1,0,-747.450884,1287.75132,
+ 0,0,1,0,-607.303844,1287.75132,
+ 0,0,1,0,-607.303844,1287.75132,
+ 0,0,1,0,-747.450884,1287.75132,
+ 0,0,1,145.820434,-733.088824,1287.75132,
+ 0,0,1,0,-607.303844,1287.75132,
+ 0,0,1,145.820434,-733.088824,1287.75132,
+ 0,0,1,118.479102,-595.634671,1287.75132,
+ 0,0,1,118.479102,-595.634671,1287.75132,
+ 0,0,1,145.820434,-733.088824,1287.75132,
+ 0,0,1,232.405119,-561.075591,1287.75132,
+ 0,0,1,232.405119,-561.075591,1287.75132,
+ 0,0,1,145.820434,-733.088824,1287.75132,
+ 0,0,1,286.03707,-690.554573,1287.75132,
+ 0,0,1,232.405119,-561.075591,1287.75132,
+ 0,0,1,286.03707,-690.554573,1287.75132,
+ 0,0,1,337.399938,-504.954691,1287.75132,
+ 0,0,1,337.399938,-504.954691,1287.75132,
+ 0,0,1,286.03707,-690.554573,1287.75132,
+ 0,0,1,415.261462,-621.482696,1287.75132,
+ 0,0,1,337.399938,-504.954691,1287.75132,
+ 0,0,1,415.261462,-621.482696,1287.75132,
+ 0,0,1,429.428666,-429.428666,1287.75132,
+ 0,0,1,429.428666,-429.428666,1287.75132,
+ 0,0,1,415.261462,-621.482696,1287.75132,
+ 0,0,1,528.527588,-528.527588,1287.75132,
+ 0,0,1,429.428666,-429.428666,1287.75132,
+ 0,0,1,528.527588,-528.527588,1287.75132,
+ 0,0,1,504.954691,-337.399938,1287.75132,
+ 0,0,1,504.954691,-337.399938,1287.75132,
+ 0,0,1,528.527588,-528.527588,1287.75132,
+ 0,0,1,561.075591,-232.405119,1287.75132,
+ 0,0,1,561.075591,-232.405119,1287.75132,
+ 0,0,1,528.527588,-528.527588,1287.75132,
+ 0,0,1,621.482696,-415.261462,1287.75132,
+ 0,0,1,561.075591,-232.405119,1287.75132,
+ 0,0,1,621.482696,-415.261462,1287.75132,
+ 0,0,1,595.634671,-118.479102,1287.75132,
+ 0,0,1,595.634671,-118.479102,1287.75132,
+ 0,0,1,621.482696,-415.261462,1287.75132,
+ 0,0,1,607.303844,-0,1287.75132,
+ 0,0,1,607.303844,-0,1287.75132,
+ 0,0,1,621.482696,-415.261462,1287.75132,
+ 0,0,1,747.450884,-0,1287.75132,
+ 0,0,1,747.450884,-0,1287.75132,
+ 0,0,1,621.482696,-415.261462,1287.75132,
+ 0,0,1,690.554573,-286.03707,1287.75132,
+ 0,0,1,747.450884,-0,1287.75132,
+ 0,0,1,690.554573,-286.03707,1287.75132,
+ 0,0,1,733.088824,-145.820434,1287.75132,
+ 0.024376,0.742479,0.669425,0,-699.298837,628.271002,
+ 0.105345,0.638437,0.762431,-126.938055,-638.160695,587.016307,
+ 0.168758,0.723457,0.669425,-136.426435,-685.862006,628.271002,
+ 0.105345,0.638437,0.762431,-126.938055,-638.160695,587.016307,
+ 0.024376,0.742479,0.669425,0,-699.298837,628.271002,
+ -0.021232,0.646722,0.762431,0,-650.663002,587.016307,
+ 0.380165,0.917193,0.119297,-373.870315,-902.602786,1967.393306,
+ 0.18999,0.952778,0.236891,-188.233089,-946.311642,1900.552851,
+ 0.372217,0.897406,0.236891,-369.232486,-891.406075,1900.552851,
+ 0.18999,0.952778,0.236891,-188.233089,-946.311642,1900.552851,
+ 0.380165,0.917193,0.119297,-373.870315,-902.602786,1967.393306,
+ 0.193925,0.973736,0.119297,-190.597434,-958.198007,1967.393306,
+ 0.632456,0.632456,-0.447214,-462.46164,-462.46164,1474.61404,
+ 0.521108,0.727062,-0.447021,-415.261462,-621.482696,1287.75132,
+ 0.632456,0.632456,-0.447214,-528.527588,-528.527588,1287.75132,
+ 0.521108,0.727062,-0.447021,-415.261462,-621.482696,1287.75132,
+ 0.632456,0.632456,-0.447214,-462.46164,-462.46164,1474.61404,
+ 0.472298,0.759676,-0.447021,-363.353779,-543.79736,1474.61404,
+ 0.917371,0.379736,-0.119297,-902.602786,-373.870315,2103.011094,
+ 0.808059,0.539373,-0.236891,-802.244273,-536.042486,2169.851549,
+ 0.825661,0.55141,-0.119297,-812.321046,-542.77557,2103.011094,
+ 0.808059,0.539373,-0.236891,-802.244273,-536.042486,2169.851549,
+ 0.917371,0.379736,-0.119297,-902.602786,-373.870315,2103.011094,
+ 0.897759,0.371365,-0.236891,-891.406075,-369.232486,2169.851549,
+ 0.812792,0.582554,0,-815.696038,-545.030668,2035.2022,
+ 0.7036,0.7036,-0.099466,-690.822265,-690.822265,2103.011094,
+ 0.692994,0.720844,0.011969,-693.692459,-693.692459,2035.2022,
+ 0.7036,0.7036,-0.099466,-690.822265,-690.822265,2103.011094,
+ 0.812792,0.582554,0,-815.696038,-545.030668,2035.2022,
+ 0.825661,0.55141,-0.119297,-812.321046,-542.77557,2103.011094,
+ 0.825661,0.55141,-0.119297,-812.321046,-542.77557,2103.011094,
+ 0.690185,0.690185,-0.217461,-682.252673,-682.252673,2169.851549,
+ 0.7036,0.7036,-0.099466,-690.822265,-690.822265,2103.011094,
+ 0.690185,0.690185,-0.217461,-682.252673,-682.252673,2169.851549,
+ 0.825661,0.55141,-0.119297,-812.321046,-542.77557,2103.011094,
+ 0.808059,0.539373,-0.236891,-802.244273,-536.042486,2169.851549,
+ 0.808059,0.539373,-0.236891,-802.244273,-536.042486,2169.851549,
+ 0.666912,0.666912,-0.332349,-668.106075,-668.106075,2234.768955,
+ 0.690185,0.690185,-0.217461,-682.252673,-682.252673,2169.851549,
+ 0.666912,0.666912,-0.332349,-668.106075,-668.106075,2234.768955,
+ 0.808059,0.539373,-0.236891,-802.244273,-536.042486,2169.851549,
+ 0.778916,0.519633,-0.3511,-785.609633,-524.927574,2234.768955,
+ 0.778916,0.519633,-0.3511,-785.609633,-524.927574,2234.768955,
+ 0.634114,0.634114,-0.442491,-648.584509,-648.584509,2296.83617,
+ 0.666912,0.666912,-0.332349,-668.106075,-668.106075,2234.768955,
+ 0.634114,0.634114,-0.442491,-648.584509,-648.584509,2296.83617,
+ 0.778916,0.519633,-0.3511,-785.609633,-524.927574,2234.768955,
+ 0.738649,0.49247,-0.460294,-762.654701,-509.589579,2296.83617,
+ -0.69529,0.261614,0.669425,646.067883,-267.610079,628.271002,
+ -0.630153,0.146993,0.762431,638.160695,-126.938055,587.016307,
+ -0.589368,0.267106,0.762431,601.13423,-248.997951,587.016307,
+ -0.630153,0.146993,0.762431,638.160695,-126.938055,587.016307,
+ -0.69529,0.261614,0.669425,646.067883,-267.610079,628.271002,
+ -0.732968,0.120943,0.669425,685.862006,-136.426435,628.271002,
+ -0.869022,0.085591,0.487313,735.304703,-0,680.911024,
+ -0.732968,0.120943,0.669425,685.862006,-136.426435,628.271002,
+ -0.876472,0.172332,0.449554,721.176029,-143.450831,680.911024,
+ -0.732968,0.120943,0.669425,685.862006,-136.426435,628.271002,
+ -0.869022,0.085591,0.487313,735.304703,-0,680.911024,
+ -0.740721,0.072955,0.66784,699.298837,-0,628.271002,
+ -0.966069,0.095149,0.240119,756.121025,-0,741.194313,
+ -0.876472,0.172332,0.449554,721.176029,-143.450831,680.911024,
+ -0.961634,0.1904,0.197505,741.592372,-147.511894,741.194313,
+ -0.876472,0.172332,0.449554,721.176029,-143.450831,680.911024,
+ -0.966069,0.095149,0.240119,756.121025,-0,741.194313,
+ -0.869022,0.085591,0.487313,735.304703,-0,680.911024,
+ 0.687833,0.458274,0.562913,-733.707316,-490.247555,1715.237645,
+ 0.820532,0.338904,0.460294,-847.416499,-351.011407,1773.56823,
+ 0.738649,0.49247,0.460294,-762.654701,-509.589579,1773.56823,
+ 0.820532,0.338904,0.460294,-847.416499,-351.011407,1773.56823,
+ 0.687833,0.458274,0.562913,-733.707316,-490.247555,1715.237645,
+ 0.764021,0.315278,0.562913,-815.251889,-337.688389,1715.237645,
+ -0.992863,0.097788,-0.068268,760.268019,-0,804.835469,
+ -0.961634,0.1904,0.197505,741.592372,-147.511894,741.194313,
+ -0.971564,0.226633,-0.06856,745.659682,-148.320933,804.835469,
+ -0.961634,0.1904,0.197505,741.592372,-147.511894,741.194313,
+ -0.992863,0.097788,-0.068268,760.268019,-0,804.835469,
+ -0.966069,0.095149,0.240119,756.121025,-0,741.194313,
+ -0.966549,0.159485,-0.200867,733.088824,-145.820434,867.310387,
+ -0.992863,0.097788,-0.068268,760.268019,-0,804.835469,
+ -0.971564,0.226633,-0.06856,745.659682,-148.320933,804.835469,
+ -0.992863,0.097788,-0.068268,760.268019,-0,804.835469,
+ -0.966549,0.159485,-0.200867,733.088824,-145.820434,867.310387,
+ -0.975069,0.096036,-0.200042,747.450884,-0,867.310387,
+ -0.638915,0.062928,-0.766699,467.156804,0,1100.8886,
+ -0.631844,0.104257,-0.768052,733.088824,-145.820434,867.310387,
+ -0.623645,0.145475,-0.768052,458.180517,-91.137771,1100.8886,
+ -0.631844,0.104257,-0.768052,733.088824,-145.820434,867.310387,
+ -0.638915,0.062928,-0.766699,467.156804,0,1100.8886,
+ -0.638915,0.062928,-0.766699,747.450884,-0,867.310387,
+ 0.814754,0.369253,-0.447021,-733.714234,-303.914386,1474.61404,
+ 0.759676,0.472298,-0.447021,-582.640028,-389.30762,1661.47676,
+ 0.727062,0.521108,-0.447021,-660.325365,-441.215303,1474.61404,
+ 0.759676,0.472298,-0.447021,-582.640028,-389.30762,1661.47676,
+ 0.814754,0.369253,-0.447021,-733.714234,-303.914386,1474.61404,
+ 0.837219,0.315017,-0.447021,-647.394912,-268.159753,1661.47676,
+ 0.764021,0.315278,-0.562913,-815.251889,-337.688389,2355.166755,
+ 0.672244,0.417941,-0.611076,-699.180902,-467.177743,2408.92764,
+ 0.687833,0.458274,-0.562913,-733.707316,-490.247555,2355.166755,
+ 0.672244,0.417941,-0.611076,-699.180902,-467.177743,2408.92764,
+ 0.764021,0.315278,-0.562913,-815.251889,-337.688389,2355.166755,
+ 0.740863,0.278762,-0.611076,-776.888194,-321.797626,2408.92764,
+ 0.820532,0.338904,-0.460294,-847.416499,-351.011407,2296.83617,
+ 0.687833,0.458274,-0.562913,-733.707316,-490.247555,2355.166755,
+ 0.738649,0.49247,-0.460294,-762.654701,-509.589579,2296.83617,
+ 0.687833,0.458274,-0.562913,-733.707316,-490.247555,2355.166755,
+ 0.820532,0.338904,-0.460294,-847.416499,-351.011407,2296.83617,
+ 0.764021,0.315278,-0.562913,-815.251889,-337.688389,2355.166755,
+ 0.781011,0.12887,0.611076,-824.740108,-164.051007,1661.47676,
+ 0.812508,0.080025,0.577431,-882.422286,0,1715.237645,
+ 0.810848,0.160167,0.562913,-865.466789,-172.152048,1715.237645,
+ 0.812508,0.080025,0.577431,-882.422286,0,1715.237645,
+ 0.781011,0.12887,0.611076,-824.740108,-164.051007,1661.47676,
+ 0.789019,0.077712,0.609434,-840.897722,0,1661.47676,
+ 0.623645,0.145475,-0.768052,-458.180517,-91.137771,1100.8886,
+ 0.599364,0.22552,-0.768052,-690.554573,-286.03707,867.310387,
+ 0.631844,0.104257,-0.768052,-733.088824,-145.820434,867.310387,
+ 0.599364,0.22552,-0.768052,-690.554573,-286.03707,867.310387,
+ 0.623645,0.145475,-0.768052,-458.180517,-91.137771,1100.8886,
+ 0.583281,0.264347,-0.768052,-431.596609,-178.773169,1100.8886,
+ 0.810848,0.160167,-0.562913,-865.466789,-172.152048,2355.166755,
+ 0.740863,0.278762,-0.611076,-776.888194,-321.797626,2408.92764,
+ 0.764021,0.315278,-0.562913,-815.251889,-337.688389,2355.166755,
+ 0.740863,0.278762,-0.611076,-776.888194,-321.797626,2408.92764,
+ 0.810848,0.160167,-0.562913,-865.466789,-172.152048,2355.166755,
+ 0.781011,0.12887,-0.611076,-824.740108,-164.051007,2408.92764,
+ 0.871137,0.203207,-0.447021,-733.088824,-145.820434,1287.75132,
+ 0.837219,0.315017,-0.447021,-604.235252,-250.282436,1474.61404,
+ 0.814754,0.369253,-0.447021,-690.554573,-286.03707,1287.75132,
+ 0.837219,0.315017,-0.447021,-604.235252,-250.282436,1474.61404,
+ 0.871137,0.203207,-0.447021,-733.088824,-145.820434,1287.75132,
+ 0.882589,0.145631,-0.447021,-641.452722,-127.592879,1474.61404,
+ 0.973856,0.227168,-0,-962.179081,-191.389319,2035.2022,
+ 0.917371,0.379736,-0.119297,-902.602786,-373.870315,2103.011094,
+ 0.910825,0.412792,0,-906.352876,-375.423654,2035.2022,
+ 0.917371,0.379736,-0.119297,-902.602786,-373.870315,2103.011094,
+ 0.973856,0.227168,-0,-962.179081,-191.389319,2035.2022,
+ 0.973826,0.193469,-0.119297,-958.198007,-190.597434,2103.011094,
+ 0.973856,0.227168,-0,-733.088824,-145.820434,2408.92764,
+ 0.935939,0.352162,-0,-690.554573,-286.03707,2549.07468,
+ 0.910825,0.412792,0,-690.554573,-286.03707,2408.92764,
+ 0.935939,0.352162,-0,-690.554573,-286.03707,2549.07468,
+ 0.973856,0.227168,-0,-733.088824,-145.820434,2408.92764,
+ 0.986659,0.162803,-0,-733.088824,-145.820434,2549.07468,
+ 0.961634,0.1904,0.197505,-741.592372,-147.511894,741.194313,
+ 0.992863,0.097788,-0.068268,-760.268019,0,804.835469,
+ 0.971564,0.226633,-0.06856,-745.659682,-148.320933,804.835469,
+ 0.992863,0.097788,-0.068268,-760.268019,0,804.835469,
+ 0.961634,0.1904,0.197505,-741.592372,-147.511894,741.194313,
+ 0.966069,0.095149,0.240119,-756.121025,0,741.194313,
+ -0.001099,0.826515,-0.562913,0,-882.422286,2355.166755,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ -0.000898,0.887766,-0.460294,0,-917.237009,2296.83617,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ -0.001099,0.826515,-0.562913,0,-882.422286,2355.166755,
+ -0.162323,0.81042,-0.562913,172.152048,-865.466789,2355.166755,
+ -0.025974,0.791146,-0.611076,0,-840.897722,2408.92764,
+ -0.162323,0.81042,-0.562913,172.152048,-865.466789,2355.166755,
+ -0.001099,0.826515,-0.562913,0,-882.422286,2355.166755,
+ -0.162323,0.81042,-0.562913,172.152048,-865.466789,2355.166755,
+ -0.025974,0.791146,-0.611076,0,-840.897722,2408.92764,
+ -0.179819,0.770877,-0.611076,164.051007,-824.740108,2408.92764,
+ 0.764021,0.315278,0.562913,-815.251889,-337.688389,1715.237645,
+ 0.870883,0.172314,0.460294,-899.612557,-178.944064,1773.56823,
+ 0.820532,0.338904,0.460294,-847.416499,-351.011407,1773.56823,
+ 0.870883,0.172314,0.460294,-899.612557,-178.944064,1773.56823,
+ 0.764021,0.315278,0.562913,-815.251889,-337.688389,1715.237645,
+ 0.810848,0.160167,0.562913,-865.466789,-172.152048,1715.237645,
+ 0.687833,0.458274,-0.562913,-733.707316,-490.247555,2355.166755,
+ 0.559613,0.559613,-0.611282,-594.604481,-594.604481,2408.92764,
+ 0.59226,0.59226,-0.546311,-623.966782,-623.966782,2355.166755,
+ 0.559613,0.559613,-0.611282,-594.604481,-594.604481,2408.92764,
+ 0.687833,0.458274,-0.562913,-733.707316,-490.247555,2355.166755,
+ 0.672244,0.417941,-0.611076,-699.180902,-467.177743,2408.92764,
+ 0.693789,0.692567,0.197505,-534.658304,-534.658304,741.194313,
+ 0.497902,0.741616,0.449554,-408.513405,-611.383516,680.911024,
+ 0.633017,0.630231,0.449554,-519.938942,-519.938942,680.911024,
+ 0.497902,0.741616,0.449554,-408.513405,-611.383516,680.911024,
+ 0.693789,0.692567,0.197505,-534.658304,-534.658304,741.194313,
+ 0.545345,0.814611,0.197505,-420.078334,-628.691656,741.194313,
+ 0.692336,0.720367,-0.041734,-537.590672,-537.590672,804.835469,
+ 0.545345,0.814611,0.197505,-420.078334,-628.691656,741.194313,
+ 0.693789,0.692567,0.197505,-534.658304,-534.658304,741.194313,
+ 0.545345,0.814611,0.197505,-420.078334,-628.691656,741.194313,
+ 0.692336,0.720367,-0.041734,-537.590672,-537.590672,804.835469,
+ 0.554012,0.829678,-0.068597,-422.38228,-632.139755,804.835469,
+ 0.69268,0.69268,-0.200971,-528.527588,-528.527588,867.310387,
+ 0.554012,0.829678,-0.068597,-422.38228,-632.139755,804.835469,
+ 0.692336,0.720367,-0.041734,-537.590672,-537.590672,804.835469,
+ 0.554012,0.829678,-0.068597,-422.38228,-632.139755,804.835469,
+ 0.69268,0.69268,-0.200971,-528.527588,-528.527588,867.310387,
+ 0.517227,0.831943,-0.200867,-415.261462,-621.482696,867.310387,
+ 0.43772,0.467437,-0.768052,-330.329744,-330.329744,1100.8886,
+ 0.37306,0.520502,-0.768052,-415.261462,-621.482696,867.310387,
+ 0.467437,0.43772,-0.768052,-528.527588,-528.527588,867.310387,
+ 0.37306,0.520502,-0.768052,-415.261462,-621.482696,867.310387,
+ 0.43772,0.467437,-0.768052,-330.329744,-330.329744,1100.8886,
+ 0.338117,0.54385,-0.768052,-259.538414,-388.426686,1100.8886,
+ 0.908682,0.411821,-0.06856,-702.396062,-290.941975,804.835469,
+ 0.831943,0.517227,-0.200867,-621.482696,-415.261462,867.310387,
+ 0.81088,0.581183,-0.06856,-632.139755,-422.38228,804.835469,
+ 0.831943,0.517227,-0.200867,-621.482696,-415.261462,867.310387,
+ 0.908682,0.411821,-0.06856,-702.396062,-290.941975,804.835469,
+ 0.916863,0.344985,-0.200867,-690.554573,-286.03707,867.310387,
+ 0.738649,0.49247,-0.460294,-762.654701,-509.589579,2296.83617,
+ 0.59226,0.59226,-0.546311,-623.966782,-623.966782,2355.166755,
+ 0.634114,0.634114,-0.442491,-648.584509,-648.584509,2296.83617,
+ 0.59226,0.59226,-0.546311,-623.966782,-623.966782,2355.166755,
+ 0.738649,0.49247,-0.460294,-762.654701,-509.589579,2296.83617,
+ 0.687833,0.458274,-0.562913,-733.707316,-490.247555,2355.166755,
+ -0.01288,0.939228,0.343052,0,-944.844672,1835.635445,
+ -0.172314,0.870883,0.460294,178.944064,-899.612557,1773.56823,
+ 0.000898,0.887766,0.460294,0,-917.237009,1773.56823,
+ -0.172314,0.870883,0.460294,178.944064,-899.612557,1773.56823,
+ -0.01288,0.939228,0.343052,0,-944.844672,1835.635445,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ 0.472298,0.759676,-0.447021,-363.353779,-543.79736,1474.61404,
+ 0.369253,0.814754,-0.447021,-286.03707,-690.554573,1287.75132,
+ 0.521108,0.727062,-0.447021,-415.261462,-621.482696,1287.75132,
+ 0.369253,0.814754,-0.447021,-286.03707,-690.554573,1287.75132,
+ 0.472298,0.759676,-0.447021,-363.353779,-543.79736,1474.61404,
+ 0.315017,0.837219,-0.447021,-250.282436,-604.235252,1474.61404,
+ 0.727062,0.521108,-0.447021,-582.640028,-389.30762,1100.8886,
+ 0.632456,0.632456,-0.447214,-429.428666,-429.428666,1287.75132,
+ 0.632456,0.632456,-0.447214,-495.494614,-495.494614,1100.8886,
+ 0.632456,0.632456,-0.447214,-429.428666,-429.428666,1287.75132,
+ 0.727062,0.521108,-0.447021,-582.640028,-389.30762,1100.8886,
+ 0.759676,0.472298,-0.447021,-504.954691,-337.399938,1287.75132,
+ -0.032813,0.999462,-0,0,-747.450884,2549.07468,
+ -0.162803,0.986659,-0,145.820434,-733.088824,2408.92764,
+ 0.032813,0.999462,-0,0,-747.450884,2408.92764,
+ -0.162803,0.986659,-0,145.820434,-733.088824,2408.92764,
+ -0.032813,0.999462,-0,0,-747.450884,2549.07468,
+ -0.227168,0.973856,-0,145.820434,-733.088824,2549.07468,
+ 0.672244,0.417941,0.611076,-699.180902,-467.177743,1661.47676,
+ 0.764021,0.315278,0.562913,-815.251889,-337.688389,1715.237645,
+ 0.687833,0.458274,0.562913,-733.707316,-490.247555,1715.237645,
+ 0.764021,0.315278,0.562913,-815.251889,-337.688389,1715.237645,
+ 0.672244,0.417941,0.611076,-699.180902,-467.177743,1661.47676,
+ 0.740863,0.278762,0.611076,-776.888194,-321.797626,1661.47676,
+ 0.917371,0.379736,0.119297,-902.602786,-373.870315,1967.393306,
+ 0.973856,0.227168,-0,-962.179081,-191.389319,2035.2022,
+ 0.910825,0.412792,0,-906.352876,-375.423654,2035.2022,
+ 0.973856,0.227168,-0,-962.179081,-191.389319,2035.2022,
+ 0.917371,0.379736,0.119297,-902.602786,-373.870315,1967.393306,
+ 0.973826,0.193469,0.119297,-958.198007,-190.597434,1967.393306,
+ 0.814754,0.369253,-0.447021,-647.394912,-268.159753,1100.8886,
+ 0.759676,0.472298,-0.447021,-504.954691,-337.399938,1287.75132,
+ 0.727062,0.521108,-0.447021,-582.640028,-389.30762,1100.8886,
+ 0.759676,0.472298,-0.447021,-504.954691,-337.399938,1287.75132,
+ 0.814754,0.369253,-0.447021,-647.394912,-268.159753,1100.8886,
+ 0.837219,0.315017,-0.447021,-561.075591,-232.405119,1287.75132,
+ 0.995185,0.098017,-0,-747.450884,0,2408.92764,
+ 0.986659,0.162803,-0,-733.088824,-145.820434,2549.07468,
+ 0.973856,0.227168,-0,-733.088824,-145.820434,2408.92764,
+ 0.986659,0.162803,-0,-733.088824,-145.820434,2549.07468,
+ 0.995185,0.098017,-0,-747.450884,0,2408.92764,
+ 0.995185,0.098017,0,-747.450884,0,2549.07468,
+ 0.630892,0.392232,0.669425,-581.445733,-388.509618,628.271002,
+ 0.589368,0.267106,0.762431,-601.13423,-248.997951,587.016307,
+ 0.69529,0.261614,0.669425,-646.067883,-267.610079,628.271002,
+ 0.589368,0.267106,0.762431,-601.13423,-248.997951,587.016307,
+ 0.630892,0.392232,0.669425,-581.445733,-388.509618,628.271002,
+ 0.525933,0.376953,0.762431,-541.006514,-361.488996,587.016307,
+ 0.542249,0.507776,0.669425,-494.47895,-494.47895,628.271002,
+ 0.743805,0.494626,0.449554,-611.383516,-408.513405,680.911024,
+ 0.633017,0.630231,0.449554,-519.938942,-519.938942,680.911024,
+ 0.743805,0.494626,0.449554,-611.383516,-408.513405,680.911024,
+ 0.542249,0.507776,0.669425,-494.47895,-494.47895,628.271002,
+ 0.630892,0.392232,0.669425,-581.445733,-388.509618,628.271002,
+ 0.693789,0.692567,0.197505,-534.658304,-534.658304,741.194313,
+ 0.81088,0.581183,-0.06856,-632.139755,-422.38228,804.835469,
+ 0.692336,0.720367,-0.041734,-537.590672,-537.590672,804.835469,
+ 0.81088,0.581183,-0.06856,-632.139755,-422.38228,804.835469,
+ 0.693789,0.692567,0.197505,-534.658304,-534.658304,741.194313,
+ 0.815571,0.543908,0.197505,-628.691656,-420.078334,741.194313,
+ 0.81088,0.581183,-0.06856,-632.139755,-422.38228,804.835469,
+ 0.69268,0.69268,-0.200971,-528.527588,-528.527588,867.310387,
+ 0.692336,0.720367,-0.041734,-537.590672,-537.590672,804.835469,
+ 0.69268,0.69268,-0.200971,-528.527588,-528.527588,867.310387,
+ 0.81088,0.581183,-0.06856,-632.139755,-422.38228,804.835469,
+ 0.831943,0.517227,-0.200867,-621.482696,-415.261462,867.310387,
+ 0.520502,0.37306,-0.768052,-388.426686,-259.538414,1100.8886,
+ 0.467437,0.43772,-0.768052,-528.527588,-528.527588,867.310387,
+ 0.54385,0.338117,-0.768052,-621.482696,-415.261462,867.310387,
+ 0.467437,0.43772,-0.768052,-528.527588,-528.527588,867.310387,
+ 0.520502,0.37306,-0.768052,-388.426686,-259.538414,1100.8886,
+ 0.43772,0.467437,-0.768052,-330.329744,-330.329744,1100.8886,
+ 0.12887,0.781011,-0.611076,-164.051007,-824.740108,2408.92764,
+ -0.001099,0.826515,-0.562913,0,-882.422286,2355.166755,
+ 0.160167,0.810848,-0.562913,-172.152048,-865.466789,2355.166755,
+ -0.001099,0.826515,-0.562913,0,-882.422286,2355.166755,
+ 0.12887,0.781011,-0.611076,-164.051007,-824.740108,2408.92764,
+ -0.025974,0.791146,-0.611076,0,-840.897722,2408.92764,
+ 0.702221,0.701893,0.119297,-690.822265,-690.822265,1967.393306,
+ 0.54014,0.807547,0.236891,-536.042486,-802.244273,1900.552851,
+ 0.687306,0.686654,0.236891,-682.252673,-682.252673,1900.552851,
+ 0.54014,0.807547,0.236891,-536.042486,-802.244273,1900.552851,
+ 0.702221,0.701893,0.119297,-690.822265,-690.822265,1967.393306,
+ 0.551796,0.825403,0.119297,-542.77557,-812.321046,1967.393306,
+ -0.882589,0.145631,-0.447021,595.634671,-118.479102,1287.75132,
+ -0.890977,0.087754,-0.445488,700.735204,-0,1100.8886,
+ -0.871137,0.203207,-0.447021,687.270773,-136.706657,1100.8886,
+ -0.890977,0.087754,-0.445488,700.735204,-0,1100.8886,
+ -0.882589,0.145631,-0.447021,595.634671,-118.479102,1287.75132,
+ -0.890977,0.087754,-0.445488,607.303844,-0,1287.75132,
+ 0.00197,0.893251,0.449554,0,-735.304703,680.911024,
+ -0.130866,0.717913,0.683722,136.426435,-685.862006,628.271002,
+ 0.024376,0.742479,0.669425,0,-699.298837,628.271002,
+ -0.130866,0.717913,0.683722,136.426435,-685.862006,628.271002,
+ 0.00197,0.893251,0.449554,0,-735.304703,680.911024,
+ -0.172332,0.876472,0.449554,143.450831,-721.176029,680.911024,
+ 0.778916,0.519633,0.3511,-785.609633,-524.927574,1835.635445,
+ 0.897759,0.371365,0.236891,-891.406075,-369.232486,1900.552851,
+ 0.808059,0.539373,0.236891,-802.244273,-536.042486,1900.552851,
+ 0.897759,0.371365,0.236891,-891.406075,-369.232486,1900.552851,
+ 0.778916,0.519633,0.3511,-785.609633,-524.927574,1835.635445,
+ 0.865325,0.357689,0.3511,-872.922654,-361.576402,1835.635445,
+ 0.875139,0.086194,-0.476133,-917.237009,0,2296.83617,
+ 0.810848,0.160167,-0.562913,-865.466789,-172.152048,2355.166755,
+ 0.870883,0.172314,-0.460294,-899.612557,-178.944064,2296.83617,
+ 0.810848,0.160167,-0.562913,-865.466789,-172.152048,2355.166755,
+ 0.875139,0.086194,-0.476133,-917.237009,0,2296.83617,
+ 0.812508,0.080025,-0.577431,-882.422286,0,2355.166755,
+ 0.315278,0.764021,-0.562913,-337.688389,-815.251889,2355.166755,
+ 0.172314,0.870883,-0.460294,-178.944064,-899.612557,2296.83617,
+ 0.338904,0.820532,-0.460294,-351.011407,-847.416499,2296.83617,
+ 0.172314,0.870883,-0.460294,-178.944064,-899.612557,2296.83617,
+ 0.315278,0.764021,-0.562913,-337.688389,-815.251889,2355.166755,
+ 0.160167,0.810848,-0.562913,-172.152048,-865.466789,2355.166755,
+ 0.278762,0.740863,-0.611076,-321.797626,-776.888194,2408.92764,
+ 0.160167,0.810848,-0.562913,-172.152048,-865.466789,2355.166755,
+ 0.315278,0.764021,-0.562913,-337.688389,-815.251889,2355.166755,
+ 0.160167,0.810848,-0.562913,-172.152048,-865.466789,2355.166755,
+ 0.278762,0.740863,-0.611076,-321.797626,-776.888194,2408.92764,
+ 0.12887,0.781011,-0.611076,-164.051007,-824.740108,2408.92764,
+ 0.890977,0.087754,-0.445488,-747.450884,0,1287.75132,
+ 0.882589,0.145631,-0.447021,-641.452722,-127.592879,1474.61404,
+ 0.871137,0.203207,-0.447021,-733.088824,-145.820434,1287.75132,
+ 0.882589,0.145631,-0.447021,-641.452722,-127.592879,1474.61404,
+ 0.890977,0.087754,-0.445488,-747.450884,0,1287.75132,
+ 0.890977,0.087754,-0.445488,-654.019524,0,1474.61404,
+ 0.585212,0.583657,0.562913,-623.966782,-623.966782,1715.237645,
+ 0.461133,0.643383,0.611076,-467.177743,-699.180902,1661.47676,
+ 0.577791,0.541058,0.611076,-594.604481,-594.604481,1661.47676,
+ 0.461133,0.643383,0.611076,-467.177743,-699.180902,1661.47676,
+ 0.585212,0.583657,0.562913,-623.966782,-623.966782,1715.237645,
+ 0.460101,0.686612,0.562913,-490.247555,-733.707316,1715.237645,
+ 0.371365,0.897759,-0.236891,-369.232486,-891.406075,2169.851549,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.379736,0.917371,-0.119297,-373.870315,-902.602786,2103.011094,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.371365,0.897759,-0.236891,-369.232486,-891.406075,2169.851549,
+ 0.189085,0.952958,-0.236891,-188.233089,-946.311642,2169.851549,
+ 0.910825,0.412792,0,-690.554573,-286.03707,2408.92764,
+ 0.849252,0.527988,0,-621.482696,-415.261462,2549.07468,
+ 0.812792,0.582554,0,-621.482696,-415.261462,2408.92764,
+ 0.849252,0.527988,0,-621.482696,-415.261462,2549.07468,
+ 0.910825,0.412792,0,-690.554573,-286.03707,2408.92764,
+ 0.935939,0.352162,-0,-690.554573,-286.03707,2549.07468,
+ 0.432767,0.603806,0.669425,-388.509618,-581.445733,628.271002,
+ 0.442288,0.472315,0.762431,-460.088221,-460.088221,587.016307,
+ 0.542249,0.507776,0.669425,-494.47895,-494.47895,628.271002,
+ 0.442288,0.472315,0.762431,-460.088221,-460.088221,587.016307,
+ 0.432767,0.603806,0.669425,-388.509618,-581.445733,628.271002,
+ 0.341645,0.549525,0.762431,-361.488996,-541.006514,587.016307,
+ 0.551796,0.825403,0.119297,-542.77557,-812.321046,1967.393306,
+ 0.372217,0.897406,0.236891,-369.232486,-891.406075,1900.552851,
+ 0.54014,0.807547,0.236891,-536.042486,-802.244273,1900.552851,
+ 0.372217,0.897406,0.236891,-369.232486,-891.406075,1900.552851,
+ 0.551796,0.825403,0.119297,-542.77557,-812.321046,1967.393306,
+ 0.380165,0.917193,0.119297,-373.870315,-902.602786,1967.393306,
+ 0.871137,0.203207,-0.447021,-778.906876,-154.934211,1474.61404,
+ 0.837219,0.315017,-0.447021,-647.394912,-268.159753,1661.47676,
+ 0.814754,0.369253,-0.447021,-733.714234,-303.914386,1474.61404,
+ 0.837219,0.315017,-0.447021,-647.394912,-268.159753,1661.47676,
+ 0.871137,0.203207,-0.447021,-778.906876,-154.934211,1474.61404,
+ 0.882589,0.145631,-0.447021,-687.270773,-136.706657,1661.47676,
+ 0.372217,0.897406,0.236891,-369.232486,-891.406075,1900.552851,
+ 0.183341,0.918213,0.3511,-184.330051,-926.689746,1835.635445,
+ 0.358953,0.864801,0.3511,-361.576402,-872.922654,1835.635445,
+ 0.183341,0.918213,0.3511,-184.330051,-926.689746,1835.635445,
+ 0.372217,0.897406,0.236891,-369.232486,-891.406075,1900.552851,
+ 0.18999,0.952778,0.236891,-188.233089,-946.311642,1900.552851,
+ 0.906011,0.374347,0.197505,-698.56474,-289.354989,741.194313,
+ 0.971564,0.226633,-0.06856,-745.659682,-148.320933,804.835469,
+ 0.908682,0.411821,-0.06856,-702.396062,-290.941975,804.835469,
+ 0.971564,0.226633,-0.06856,-745.659682,-148.320933,804.835469,
+ 0.906011,0.374347,0.197505,-698.56474,-289.354989,741.194313,
+ 0.961634,0.1904,0.197505,-741.592372,-147.511894,741.194313,
+ 0.145631,0.882589,-0.447021,-127.592879,-641.452722,1474.61404,
+ 0.029352,0.894042,-0.447021,0,-747.450884,1287.75132,
+ 0.203207,0.871137,-0.447021,-145.820434,-733.088824,1287.75132,
+ 0.029352,0.894042,-0.447021,0,-747.450884,1287.75132,
+ 0.145631,0.882589,-0.447021,-127.592879,-641.452722,1474.61404,
+ -0.029352,0.894042,-0.447021,0,-654.019524,1474.61404,
+ 0.995185,0.098017,-0,-981.029284,-0,2035.2022,
+ 0.973826,0.193469,-0.119297,-958.198007,-190.597434,2103.011094,
+ 0.973856,0.227168,-0,-962.179081,-191.389319,2035.2022,
+ 0.973826,0.193469,-0.119297,-958.198007,-190.597434,2103.011094,
+ 0.995185,0.098017,-0,-981.029284,-0,2035.2022,
+ 0.985604,0.097074,-0.138423,-976.970216,0,2103.011094,
+ 0.810848,0.160167,0.562913,-865.466789,-172.152048,1715.237645,
+ 0.875139,0.086194,0.476133,-917.237009,0,1773.56823,
+ 0.870883,0.172314,0.460294,-899.612557,-178.944064,1773.56823,
+ 0.875139,0.086194,0.476133,-917.237009,0,1773.56823,
+ 0.810848,0.160167,0.562913,-865.466789,-172.152048,1715.237645,
+ 0.812508,0.080025,0.577431,-882.422286,0,1715.237645,
+ 0.925281,0.091132,-0.36817,-944.844672,0,2234.768955,
+ 0.870883,0.172314,-0.460294,-899.612557,-178.944064,2296.83617,
+ 0.91848,0.181999,-0.3511,-926.689746,-184.330051,2234.768955,
+ 0.870883,0.172314,-0.460294,-899.612557,-178.944064,2296.83617,
+ 0.925281,0.091132,-0.36817,-944.844672,0,2234.768955,
+ 0.875139,0.086194,-0.476133,-917.237009,0,2296.83617,
+ 0.738649,0.49247,0.460294,-762.654701,-509.589579,1773.56823,
+ 0.865325,0.357689,0.3511,-872.922654,-361.576402,1835.635445,
+ 0.778916,0.519633,0.3511,-785.609633,-524.927574,1835.635445,
+ 0.865325,0.357689,0.3511,-872.922654,-361.576402,1835.635445,
+ 0.738649,0.49247,0.460294,-762.654701,-509.589579,1773.56823,
+ 0.820532,0.338904,0.460294,-847.416499,-351.011407,1773.56823,
+ 0.82601,0.340012,0.449554,-679.332965,-281.388928,680.911024,
+ 0.961634,0.1904,0.197505,-741.592372,-147.511894,741.194313,
+ 0.906011,0.374347,0.197505,-698.56474,-289.354989,741.194313,
+ 0.961634,0.1904,0.197505,-741.592372,-147.511894,741.194313,
+ 0.82601,0.340012,0.449554,-679.332965,-281.388928,680.911024,
+ 0.876472,0.172332,0.449554,-721.176029,-143.450831,680.911024,
+ 0.472298,0.759676,-0.447021,-389.30762,-582.640028,1661.47676,
+ 0.369253,0.814754,-0.447021,-303.914386,-733.714234,1474.61404,
+ 0.521108,0.727062,-0.447021,-441.215303,-660.325365,1474.61404,
+ 0.369253,0.814754,-0.447021,-303.914386,-733.714234,1474.61404,
+ 0.472298,0.759676,-0.447021,-389.30762,-582.640028,1661.47676,
+ 0.315017,0.837219,-0.447021,-268.159753,-647.394912,1661.47676,
+ 0.577791,0.541058,0.611076,-594.604481,-594.604481,1661.47676,
+ 0.687833,0.458274,0.562913,-733.707316,-490.247555,1715.237645,
+ 0.585212,0.583657,0.562913,-623.966782,-623.966782,1715.237645,
+ 0.687833,0.458274,0.562913,-733.707316,-490.247555,1715.237645,
+ 0.577791,0.541058,0.611076,-594.604481,-594.604481,1661.47676,
+ 0.672244,0.417941,0.611076,-699.180902,-467.177743,1661.47676,
+ 0.585212,0.583657,0.562913,-623.966782,-623.966782,1715.237645,
+ 0.738649,0.49247,0.460294,-762.654701,-509.589579,1773.56823,
+ 0.62838,0.627111,0.460294,-648.584509,-648.584509,1773.56823,
+ 0.738649,0.49247,0.460294,-762.654701,-509.589579,1773.56823,
+ 0.585212,0.583657,0.562913,-623.966782,-623.966782,1715.237645,
+ 0.687833,0.458274,0.562913,-733.707316,-490.247555,1715.237645,
+ 0.633017,0.630231,0.449554,-519.938942,-519.938942,680.911024,
+ 0.815571,0.543908,0.197505,-628.691656,-420.078334,741.194313,
+ 0.693789,0.692567,0.197505,-534.658304,-534.658304,741.194313,
+ 0.815571,0.543908,0.197505,-628.691656,-420.078334,741.194313,
+ 0.633017,0.630231,0.449554,-519.938942,-519.938942,680.911024,
+ 0.743805,0.494626,0.449554,-611.383516,-408.513405,680.911024,
+ 0.732968,0.120943,0.669425,-685.862006,-136.426435,628.271002,
+ 0.645559,0.063582,0.761059,-650.663002,0,587.016307,
+ 0.740721,0.072955,0.66784,-699.298837,0,628.271002,
+ 0.645559,0.063582,0.761059,-650.663002,0,587.016307,
+ 0.732968,0.120943,0.669425,-685.862006,-136.426435,628.271002,
+ 0.630153,0.146993,0.762431,-638.160695,-126.938055,587.016307,
+ 0.7036,0.7036,-0.099466,-690.822265,-690.822265,2103.011094,
+ 0.55557,0.83147,0,-545.030668,-815.696038,2035.2022,
+ 0.692994,0.720844,0.011969,-693.692459,-693.692459,2035.2022,
+ 0.55557,0.83147,0,-545.030668,-815.696038,2035.2022,
+ 0.7036,0.7036,-0.099466,-690.822265,-690.822265,2103.011094,
+ 0.55141,0.825661,-0.119297,-542.77557,-812.321046,2103.011094,
+ 0.690185,0.690185,-0.217461,-682.252673,-682.252673,2169.851549,
+ 0.55141,0.825661,-0.119297,-542.77557,-812.321046,2103.011094,
+ 0.7036,0.7036,-0.099466,-690.822265,-690.822265,2103.011094,
+ 0.55141,0.825661,-0.119297,-542.77557,-812.321046,2103.011094,
+ 0.690185,0.690185,-0.217461,-682.252673,-682.252673,2169.851549,
+ 0.539373,0.808059,-0.236891,-536.042486,-802.244273,2169.851549,
+ -0.032144,0.979091,-0.200867,0,-747.450884,867.310387,
+ -0.194925,0.978416,-0.068597,148.320933,-745.659682,804.835469,
+ -0.0003,0.997644,-0.068597,0,-760.268019,804.835469,
+ -0.194925,0.978416,-0.068597,148.320933,-745.659682,804.835469,
+ -0.032144,0.979091,-0.200867,0,-747.450884,867.310387,
+ -0.222538,0.954007,-0.200867,145.820434,-733.088824,867.310387,
+ -0.104257,0.631844,-0.768052,91.137771,-458.180517,1100.8886,
+ 0,0.640184,-0.768222,0,-747.450884,867.310387,
+ 0,0.640184,-0.768222,0,-467.156804,1100.8886,
+ 0,0.640184,-0.768222,0,-747.450884,867.310387,
+ -0.104257,0.631844,-0.768052,91.137771,-458.180517,1100.8886,
+ -0.145475,0.623645,-0.768052,145.820434,-733.088824,867.310387,
+ 0.820532,0.338904,0.460294,-847.416499,-351.011407,1773.56823,
+ 0.91848,0.181999,0.3511,-926.689746,-184.330051,1835.635445,
+ 0.865325,0.357689,0.3511,-872.922654,-361.576402,1835.635445,
+ 0.91848,0.181999,0.3511,-926.689746,-184.330051,1835.635445,
+ 0.820532,0.338904,0.460294,-847.416499,-351.011407,1773.56823,
+ 0.870883,0.172314,0.460294,-899.612557,-178.944064,1773.56823,
+ 0.193925,0.973736,0.119297,-190.597434,-958.198007,1967.393306,
+ 0.000461,0.971536,0.236891,0,-964.850983,1900.552851,
+ 0.18999,0.952778,0.236891,-188.233089,-946.311642,1900.552851,
+ 0.000461,0.971536,0.236891,0,-964.850983,1900.552851,
+ 0.193925,0.973736,0.119297,-190.597434,-958.198007,1967.393306,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ 0.000864,0.980301,0.197505,0,-756.121025,741.194313,
+ -0.172332,0.876472,0.449554,143.450831,-721.176029,680.911024,
+ 0.00197,0.893251,0.449554,0,-735.304703,680.911024,
+ -0.172332,0.876472,0.449554,143.450831,-721.176029,680.911024,
+ 0.000864,0.980301,0.197505,0,-756.121025,741.194313,
+ -0.1904,0.961634,0.197505,147.511894,-741.592372,741.194313,
+ -0.0003,0.997644,-0.068597,0,-760.268019,804.835469,
+ -0.1904,0.961634,0.197505,147.511894,-741.592372,741.194313,
+ 0.000864,0.980301,0.197505,0,-756.121025,741.194313,
+ -0.1904,0.961634,0.197505,147.511894,-741.592372,741.194313,
+ -0.0003,0.997644,-0.068597,0,-760.268019,804.835469,
+ -0.194925,0.978416,-0.068597,148.320933,-745.659682,804.835469,
+ 0.992863,0.097788,-0.068268,-760.268019,0,804.835469,
+ 0.966549,0.159485,-0.200867,-733.088824,-145.820434,867.310387,
+ 0.971564,0.226633,-0.06856,-745.659682,-148.320933,804.835469,
+ 0.966549,0.159485,-0.200867,-733.088824,-145.820434,867.310387,
+ 0.992863,0.097788,-0.068268,-760.268019,0,804.835469,
+ 0.975069,0.096036,-0.200042,-747.450884,0,867.310387,
+ 0.865325,0.357689,0.3511,-872.922654,-361.576402,1835.635445,
+ 0.952958,0.189085,0.236891,-946.311642,-188.233089,1900.552851,
+ 0.897759,0.371365,0.236891,-891.406075,-369.232486,1900.552851,
+ 0.952958,0.189085,0.236891,-946.311642,-188.233089,1900.552851,
+ 0.865325,0.357689,0.3511,-872.922654,-361.576402,1835.635445,
+ 0.91848,0.181999,0.3511,-926.689746,-184.330051,1835.635445,
+ -0.882589,0.145631,-0.447021,641.452722,-127.592879,1474.61404,
+ -0.890977,0.087754,-0.445488,747.450884,-0,1287.75132,
+ -0.871137,0.203207,-0.447021,733.088824,-145.820434,1287.75132,
+ -0.890977,0.087754,-0.445488,747.450884,-0,1287.75132,
+ -0.882589,0.145631,-0.447021,641.452722,-127.592879,1474.61404,
+ -0.890977,0.087754,-0.445488,654.019524,-0,1474.61404,
+ 0.971564,0.226633,-0.06856,-745.659682,-148.320933,804.835469,
+ 0.916863,0.344985,-0.200867,-690.554573,-286.03707,867.310387,
+ 0.908682,0.411821,-0.06856,-702.396062,-290.941975,804.835469,
+ 0.916863,0.344985,-0.200867,-690.554573,-286.03707,867.310387,
+ 0.971564,0.226633,-0.06856,-745.659682,-148.320933,804.835469,
+ 0.966549,0.159485,-0.200867,-733.088824,-145.820434,867.310387,
+ 0.379736,0.917371,-0.119297,-373.870315,-902.602786,2103.011094,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.382683,0.92388,0,-375.423654,-906.352876,2035.2022,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.379736,0.917371,-0.119297,-373.870315,-902.602786,2103.011094,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.338117,0.54385,-0.768052,-259.538414,-388.426686,1100.8886,
+ 0.264347,0.583281,-0.768052,-286.03707,-690.554573,867.310387,
+ 0.37306,0.520502,-0.768052,-415.261462,-621.482696,867.310387,
+ 0.264347,0.583281,-0.768052,-286.03707,-690.554573,867.310387,
+ 0.338117,0.54385,-0.768052,-259.538414,-388.426686,1100.8886,
+ 0.22552,0.599364,-0.768052,-178.773169,-431.596609,1100.8886,
+ 0.815571,0.543908,0.197505,-628.691656,-420.078334,741.194313,
+ 0.908682,0.411821,-0.06856,-702.396062,-290.941975,804.835469,
+ 0.81088,0.581183,-0.06856,-632.139755,-422.38228,804.835469,
+ 0.908682,0.411821,-0.06856,-702.396062,-290.941975,804.835469,
+ 0.815571,0.543908,0.197505,-628.691656,-420.078334,741.194313,
+ 0.906011,0.374347,0.197505,-698.56474,-289.354989,741.194313,
+ 0.890977,0.087754,-0.445488,-794.166564,0,1474.61404,
+ 0.882589,0.145631,-0.447021,-687.270773,-136.706657,1661.47676,
+ 0.871137,0.203207,-0.447021,-778.906876,-154.934211,1474.61404,
+ 0.882589,0.145631,-0.447021,-687.270773,-136.706657,1661.47676,
+ 0.890977,0.087754,-0.445488,-794.166564,0,1474.61404,
+ 0.890977,0.087754,-0.445488,-700.735204,0,1661.47676,
+ 0.472298,0.759676,-0.447021,-337.399938,-504.954691,1287.75132,
+ 0.369253,0.814754,-0.447021,-268.159753,-647.394912,1100.8886,
+ 0.521108,0.727062,-0.447021,-389.30762,-582.640028,1100.8886,
+ 0.369253,0.814754,-0.447021,-268.159753,-647.394912,1100.8886,
+ 0.472298,0.759676,-0.447021,-337.399938,-504.954691,1287.75132,
+ 0.315017,0.837219,-0.447021,-232.405119,-561.075591,1287.75132,
+ 0.985604,0.097074,-0.138423,-976.970216,0,2103.011094,
+ 0.952958,0.189085,-0.236891,-946.311642,-188.233089,2169.851549,
+ 0.973826,0.193469,-0.119297,-958.198007,-190.597434,2103.011094,
+ 0.952958,0.189085,-0.236891,-946.311642,-188.233089,2169.851549,
+ 0.985604,0.097074,-0.138423,-976.970216,0,2103.011094,
+ 0.962266,0.094775,-0.255071,-964.850983,0,2169.851549,
+ -0.82601,0.340012,0.449554,679.332965,-281.388928,680.911024,
+ -0.630892,0.392232,0.669425,581.445733,-388.509618,628.271002,
+ -0.743805,0.494626,0.449554,611.383516,-408.513405,680.911024,
+ -0.630892,0.392232,0.669425,581.445733,-388.509618,628.271002,
+ -0.82601,0.340012,0.449554,679.332965,-281.388928,680.911024,
+ -0.69529,0.261614,0.669425,646.067883,-267.610079,628.271002,
+ 0.162803,0.986659,-0,-145.820434,-733.088824,2549.07468,
+ 0.032813,0.999462,-0,0,-747.450884,2408.92764,
+ 0.227168,0.973856,-0,-145.820434,-733.088824,2408.92764,
+ 0.032813,0.999462,-0,0,-747.450884,2408.92764,
+ 0.162803,0.986659,-0,-145.820434,-733.088824,2549.07468,
+ -0.032813,0.999462,-0,0,-747.450884,2549.07468,
+ 0.727062,0.521108,-0.447021,-621.482696,-415.261462,1287.75132,
+ 0.632456,0.632456,-0.447214,-462.46164,-462.46164,1474.61404,
+ 0.632456,0.632456,-0.447214,-528.527588,-528.527588,1287.75132,
+ 0.632456,0.632456,-0.447214,-462.46164,-462.46164,1474.61404,
+ 0.727062,0.521108,-0.447021,-621.482696,-415.261462,1287.75132,
+ 0.759676,0.472298,-0.447021,-543.79736,-363.353779,1474.61404,
+ 0.666912,0.666912,-0.332349,-668.106075,-668.106075,2234.768955,
+ 0.539373,0.808059,-0.236891,-536.042486,-802.244273,2169.851549,
+ 0.690185,0.690185,-0.217461,-682.252673,-682.252673,2169.851549,
+ 0.539373,0.808059,-0.236891,-536.042486,-802.244273,2169.851549,
+ 0.666912,0.666912,-0.332349,-668.106075,-668.106075,2234.768955,
+ 0.519633,0.778916,-0.3511,-524.927574,-785.609633,2234.768955,
+ 0.69529,0.261614,0.669425,-646.067883,-267.610079,628.271002,
+ 0.630153,0.146993,0.762431,-638.160695,-126.938055,587.016307,
+ 0.732968,0.120943,0.669425,-685.862006,-136.426435,628.271002,
+ 0.630153,0.146993,0.762431,-638.160695,-126.938055,587.016307,
+ 0.69529,0.261614,0.669425,-646.067883,-267.610079,628.271002,
+ 0.589368,0.267106,0.762431,-601.13423,-248.997951,587.016307,
+ 0.638915,0.062928,-0.766699,-467.156804,0,1100.8886,
+ 0.631844,0.104257,-0.768052,-733.088824,-145.820434,867.310387,
+ 0.638915,0.062928,-0.766699,-747.450884,0,867.310387,
+ 0.631844,0.104257,-0.768052,-733.088824,-145.820434,867.310387,
+ 0.638915,0.062928,-0.766699,-467.156804,0,1100.8886,
+ 0.623645,0.145475,-0.768052,-458.180517,-91.137771,1100.8886,
+ 0.897759,0.371365,0.236891,-891.406075,-369.232486,1900.552851,
+ 0.973826,0.193469,0.119297,-958.198007,-190.597434,1967.393306,
+ 0.917371,0.379736,0.119297,-902.602786,-373.870315,1967.393306,
+ 0.973826,0.193469,0.119297,-958.198007,-190.597434,1967.393306,
+ 0.897759,0.371365,0.236891,-891.406075,-369.232486,1900.552851,
+ 0.952958,0.189085,0.236891,-946.311642,-188.233089,1900.552851,
+ 0.62838,0.627111,0.460294,-648.584509,-648.584509,1773.56823,
+ 0.460101,0.686612,0.562913,-490.247555,-733.707316,1715.237645,
+ 0.585212,0.583657,0.562913,-623.966782,-623.966782,1715.237645,
+ 0.460101,0.686612,0.562913,-490.247555,-733.707316,1715.237645,
+ 0.62838,0.627111,0.460294,-648.584509,-648.584509,1773.56823,
+ 0.493963,0.737652,0.460294,-509.589579,-762.654701,1773.56823,
+ 0.662575,0.661607,0.3511,-668.106075,-668.106075,1835.635445,
+ 0.493963,0.737652,0.460294,-509.589579,-762.654701,1773.56823,
+ 0.62838,0.627111,0.460294,-648.584509,-648.584509,1773.56823,
+ 0.493963,0.737652,0.460294,-509.589579,-762.654701,1773.56823,
+ 0.662575,0.661607,0.3511,-668.106075,-668.106075,1835.635445,
+ 0.52077,0.778156,0.3511,-524.927574,-785.609633,1835.635445,
+ 0.517227,0.831943,-0.200867,-415.261462,-621.482696,867.310387,
+ 0.381505,0.921818,-0.068597,-290.941975,-702.396062,804.835469,
+ 0.554012,0.829678,-0.068597,-422.38228,-632.139755,804.835469,
+ 0.381505,0.921818,-0.068597,-290.941975,-702.396062,804.835469,
+ 0.517227,0.831943,-0.200867,-415.261462,-621.482696,867.310387,
+ 0.344985,0.916863,-0.200867,-286.03707,-690.554573,867.310387,
+ 0.62838,0.627111,0.460294,-648.584509,-648.584509,1773.56823,
+ 0.778916,0.519633,0.3511,-785.609633,-524.927574,1835.635445,
+ 0.662575,0.661607,0.3511,-668.106075,-668.106075,1835.635445,
+ 0.778916,0.519633,0.3511,-785.609633,-524.927574,1835.635445,
+ 0.62838,0.627111,0.460294,-648.584509,-648.584509,1773.56823,
+ 0.738649,0.49247,0.460294,-762.654701,-509.589579,1773.56823,
+ 0.727062,0.521108,-0.447021,-660.325365,-441.215303,1474.61404,
+ 0.632456,0.632456,-0.447214,-495.494614,-495.494614,1661.47676,
+ 0.632456,0.632456,-0.447214,-561.560563,-561.560563,1474.61404,
+ 0.632456,0.632456,-0.447214,-495.494614,-495.494614,1661.47676,
+ 0.727062,0.521108,-0.447021,-660.325365,-441.215303,1474.61404,
+ 0.759676,0.472298,-0.447021,-582.640028,-389.30762,1661.47676,
+ 0.687306,0.686654,0.236891,-682.252673,-682.252673,1900.552851,
+ 0.825661,0.55141,0.119297,-812.321046,-542.77557,1967.393306,
+ 0.702221,0.701893,0.119297,-690.822265,-690.822265,1967.393306,
+ 0.825661,0.55141,0.119297,-812.321046,-542.77557,1967.393306,
+ 0.687306,0.686654,0.236891,-682.252673,-682.252673,1900.552851,
+ 0.808059,0.539373,0.236891,-802.244273,-536.042486,1900.552851,
+ 0.702221,0.701893,0.119297,-690.822265,-690.822265,1967.393306,
+ 0.812792,0.582554,0,-815.696038,-545.030668,2035.2022,
+ 0.692994,0.720844,0.011969,-693.692459,-693.692459,2035.2022,
+ 0.812792,0.582554,0,-815.696038,-545.030668,2035.2022,
+ 0.702221,0.701893,0.119297,-690.822265,-690.822265,1967.393306,
+ 0.825661,0.55141,0.119297,-812.321046,-542.77557,1967.393306,
+ 0.634114,0.634114,-0.442491,-648.584509,-648.584509,2296.83617,
+ 0.519633,0.778916,-0.3511,-524.927574,-785.609633,2234.768955,
+ 0.666912,0.666912,-0.332349,-668.106075,-668.106075,2234.768955,
+ 0.519633,0.778916,-0.3511,-524.927574,-785.609633,2234.768955,
+ 0.634114,0.634114,-0.442491,-648.584509,-648.584509,2296.83617,
+ 0.49247,0.738649,-0.460294,-509.589579,-762.654701,2296.83617,
+ 0.59226,0.59226,-0.546311,-623.966782,-623.966782,2355.166755,
+ 0.49247,0.738649,-0.460294,-509.589579,-762.654701,2296.83617,
+ 0.634114,0.634114,-0.442491,-648.584509,-648.584509,2296.83617,
+ 0.49247,0.738649,-0.460294,-509.589579,-762.654701,2296.83617,
+ 0.59226,0.59226,-0.546311,-623.966782,-623.966782,2355.166755,
+ 0.458274,0.687833,-0.562913,-490.247555,-733.707316,2355.166755,
+ 0.632456,0.632456,-0.447214,-495.494614,-495.494614,1661.47676,
+ 0.521108,0.727062,-0.447021,-441.215303,-660.325365,1474.61404,
+ 0.632456,0.632456,-0.447214,-561.560563,-561.560563,1474.61404,
+ 0.521108,0.727062,-0.447021,-441.215303,-660.325365,1474.61404,
+ 0.632456,0.632456,-0.447214,-495.494614,-495.494614,1661.47676,
+ 0.472298,0.759676,-0.447021,-389.30762,-582.640028,1661.47676,
+ 0.583281,0.264347,-0.768052,-431.596609,-178.773169,1100.8886,
+ 0.54385,0.338117,-0.768052,-621.482696,-415.261462,867.310387,
+ 0.599364,0.22552,-0.768052,-690.554573,-286.03707,867.310387,
+ 0.54385,0.338117,-0.768052,-621.482696,-415.261462,867.310387,
+ 0.583281,0.264347,-0.768052,-431.596609,-178.773169,1100.8886,
+ 0.520502,0.37306,-0.768052,-388.426686,-259.538414,1100.8886,
+ 0.497902,0.741616,0.449554,-408.513405,-611.383516,680.911024,
+ 0.306655,0.676633,0.669425,-267.610079,-646.067883,628.271002,
+ 0.432767,0.603806,0.669425,-388.509618,-581.445733,628.271002,
+ 0.306655,0.676633,0.669425,-267.610079,-646.067883,628.271002,
+ 0.497902,0.741616,0.449554,-408.513405,-611.383516,680.911024,
+ 0.343652,0.824502,0.449554,-281.388928,-679.332965,680.911024,
+ 0.545345,0.814611,0.197505,-420.078334,-628.691656,741.194313,
+ 0.343652,0.824502,0.449554,-281.388928,-679.332965,680.911024,
+ 0.497902,0.741616,0.449554,-408.513405,-611.383516,680.911024,
+ 0.343652,0.824502,0.449554,-281.388928,-679.332965,680.911024,
+ 0.545345,0.814611,0.197505,-420.078334,-628.691656,741.194313,
+ 0.375943,0.90535,0.197505,-289.354989,-698.56474,741.194313,
+ 0.554012,0.829678,-0.068597,-422.38228,-632.139755,804.835469,
+ 0.375943,0.90535,0.197505,-289.354989,-698.56474,741.194313,
+ 0.545345,0.814611,0.197505,-420.078334,-628.691656,741.194313,
+ 0.375943,0.90535,0.197505,-289.354989,-698.56474,741.194313,
+ 0.554012,0.829678,-0.068597,-422.38228,-632.139755,804.835469,
+ 0.381505,0.921818,-0.068597,-290.941975,-702.396062,804.835469,
+ 0.000898,0.887766,0.460294,0,-917.237009,1773.56823,
+ -0.160167,0.810848,0.562913,172.152048,-865.466789,1715.237645,
+ 0.001099,0.826515,0.562913,0,-882.422286,1715.237645,
+ -0.160167,0.810848,0.562913,172.152048,-865.466789,1715.237645,
+ 0.000898,0.887766,0.460294,0,-917.237009,1773.56823,
+ -0.172314,0.870883,0.460294,178.944064,-899.612557,1773.56823,
+ 0.559613,0.559613,-0.611282,-594.604481,-594.604481,2408.92764,
+ 0.458274,0.687833,-0.562913,-490.247555,-733.707316,2355.166755,
+ 0.59226,0.59226,-0.546311,-623.966782,-623.966782,2355.166755,
+ 0.458274,0.687833,-0.562913,-490.247555,-733.707316,2355.166755,
+ 0.559613,0.559613,-0.611282,-594.604481,-594.604481,2408.92764,
+ 0.417941,0.672244,-0.611076,-467.177743,-699.180902,2408.92764,
+ 0.707107,0.707107,-0,-528.527588,-528.527588,2549.07468,
+ 0.582554,0.812792,-0,-415.261462,-621.482696,2408.92764,
+ 0.707107,0.707107,0,-528.527588,-528.527588,2408.92764,
+ 0.582554,0.812792,-0,-415.261462,-621.482696,2408.92764,
+ 0.707107,0.707107,-0,-528.527588,-528.527588,2549.07468,
+ 0.527988,0.849252,-0,-415.261462,-621.482696,2549.07468,
+ 0.812792,0.582554,0,-621.482696,-415.261462,2408.92764,
+ 0.707107,0.707107,-0,-528.527588,-528.527588,2549.07468,
+ 0.707107,0.707107,0,-528.527588,-528.527588,2408.92764,
+ 0.707107,0.707107,-0,-528.527588,-528.527588,2549.07468,
+ 0.812792,0.582554,0,-621.482696,-415.261462,2408.92764,
+ 0.849252,0.527988,0,-621.482696,-415.261462,2549.07468,
+ -0.882589,0.145631,-0.447021,687.270773,-136.706657,1661.47676,
+ -0.890977,0.087754,-0.445488,794.166564,-0,1474.61404,
+ -0.871137,0.203207,-0.447021,778.906876,-154.934211,1474.61404,
+ -0.890977,0.087754,-0.445488,794.166564,-0,1474.61404,
+ -0.882589,0.145631,-0.447021,687.270773,-136.706657,1661.47676,
+ -0.890977,0.087754,-0.445488,700.735204,-0,1661.47676,
+ -0.812508,0.080025,0.577431,882.422286,-0,1715.237645,
+ -0.781011,0.12887,0.611076,824.740108,-164.051007,1661.47676,
+ -0.810848,0.160167,0.562913,865.466789,-172.152048,1715.237645,
+ -0.781011,0.12887,0.611076,824.740108,-164.051007,1661.47676,
+ -0.812508,0.080025,0.577431,882.422286,-0,1715.237645,
+ -0.789019,0.077712,0.609434,840.897722,-0,1661.47676,
+ 0.519633,0.778916,-0.3511,-524.927574,-785.609633,2234.768955,
+ 0.371365,0.897759,-0.236891,-369.232486,-891.406075,2169.851549,
+ 0.539373,0.808059,-0.236891,-536.042486,-802.244273,2169.851549,
+ 0.371365,0.897759,-0.236891,-369.232486,-891.406075,2169.851549,
+ 0.519633,0.778916,-0.3511,-524.927574,-785.609633,2234.768955,
+ 0.357689,0.865325,-0.3511,-361.576402,-872.922654,2234.768955,
+ 0.49247,0.738649,-0.460294,-509.589579,-762.654701,2296.83617,
+ 0.357689,0.865325,-0.3511,-361.576402,-872.922654,2234.768955,
+ 0.519633,0.778916,-0.3511,-524.927574,-785.609633,2234.768955,
+ 0.357689,0.865325,-0.3511,-361.576402,-872.922654,2234.768955,
+ 0.49247,0.738649,-0.460294,-509.589579,-762.654701,2296.83617,
+ 0.338904,0.820532,-0.460294,-351.011407,-847.416499,2296.83617,
+ 0.460101,0.686612,0.562913,-490.247555,-733.707316,1715.237645,
+ 0.326755,0.720984,0.611076,-321.797626,-776.888194,1661.47676,
+ 0.461133,0.643383,0.611076,-467.177743,-699.180902,1661.47676,
+ 0.326755,0.720984,0.611076,-321.797626,-776.888194,1661.47676,
+ 0.460101,0.686612,0.562913,-490.247555,-733.707316,1715.237645,
+ 0.317309,0.76318,0.562913,-337.688389,-815.251889,1715.237645,
+ 0.542249,0.507776,0.669425,-494.47895,-494.47895,628.271002,
+ 0.525933,0.376953,0.762431,-541.006514,-361.488996,587.016307,
+ 0.630892,0.392232,0.669425,-581.445733,-388.509618,628.271002,
+ 0.525933,0.376953,0.762431,-541.006514,-361.488996,587.016307,
+ 0.542249,0.507776,0.669425,-494.47895,-494.47895,628.271002,
+ 0.442288,0.472315,0.762431,-460.088221,-460.088221,587.016307,
+ 0.493963,0.737652,0.460294,-509.589579,-762.654701,1773.56823,
+ 0.317309,0.76318,0.562913,-337.688389,-815.251889,1715.237645,
+ 0.460101,0.686612,0.562913,-490.247555,-733.707316,1715.237645,
+ 0.317309,0.76318,0.562913,-337.688389,-815.251889,1715.237645,
+ 0.493963,0.737652,0.460294,-509.589579,-762.654701,1773.56823,
+ 0.340563,0.819845,0.460294,-351.011407,-847.416499,1773.56823,
+ 0.52077,0.778156,0.3511,-524.927574,-785.609633,1835.635445,
+ 0.340563,0.819845,0.460294,-351.011407,-847.416499,1773.56823,
+ 0.493963,0.737652,0.460294,-509.589579,-762.654701,1773.56823,
+ 0.340563,0.819845,0.460294,-351.011407,-847.416499,1773.56823,
+ 0.52077,0.778156,0.3511,-524.927574,-785.609633,1835.635445,
+ 0.358953,0.864801,0.3511,-361.576402,-872.922654,1835.635445,
+ 0.54014,0.807547,0.236891,-536.042486,-802.244273,1900.552851,
+ 0.358953,0.864801,0.3511,-361.576402,-872.922654,1835.635445,
+ 0.52077,0.778156,0.3511,-524.927574,-785.609633,1835.635445,
+ 0.358953,0.864801,0.3511,-361.576402,-872.922654,1835.635445,
+ 0.54014,0.807547,0.236891,-536.042486,-802.244273,1900.552851,
+ 0.372217,0.897406,0.236891,-369.232486,-891.406075,1900.552851,
+ -0.029352,0.894042,-0.447021,0,-700.735204,1661.47676,
+ -0.145631,0.882589,-0.447021,154.934211,-778.906876,1474.61404,
+ 0.029352,0.894042,-0.447021,0,-794.166564,1474.61404,
+ -0.145631,0.882589,-0.447021,154.934211,-778.906876,1474.61404,
+ -0.029352,0.894042,-0.447021,0,-700.735204,1661.47676,
+ -0.203207,0.871137,-0.447021,136.706657,-687.270773,1661.47676,
+ 0.55141,0.825661,-0.119297,-542.77557,-812.321046,2103.011094,
+ 0.382683,0.92388,0,-375.423654,-906.352876,2035.2022,
+ 0.55557,0.83147,0,-545.030668,-815.696038,2035.2022,
+ 0.382683,0.92388,0,-375.423654,-906.352876,2035.2022,
+ 0.55141,0.825661,-0.119297,-542.77557,-812.321046,2103.011094,
+ 0.379736,0.917371,-0.119297,-373.870315,-902.602786,2103.011094,
+ 0.539373,0.808059,-0.236891,-536.042486,-802.244273,2169.851549,
+ 0.379736,0.917371,-0.119297,-373.870315,-902.602786,2103.011094,
+ 0.55141,0.825661,-0.119297,-542.77557,-812.321046,2103.011094,
+ 0.379736,0.917371,-0.119297,-373.870315,-902.602786,2103.011094,
+ 0.539373,0.808059,-0.236891,-536.042486,-802.244273,2169.851549,
+ 0.371365,0.897759,-0.236891,-369.232486,-891.406075,2169.851549,
+ 0.897759,0.371365,-0.236891,-891.406075,-369.232486,2169.851549,
+ 0.778916,0.519633,-0.3511,-785.609633,-524.927574,2234.768955,
+ 0.808059,0.539373,-0.236891,-802.244273,-536.042486,2169.851549,
+ 0.778916,0.519633,-0.3511,-785.609633,-524.927574,2234.768955,
+ 0.897759,0.371365,-0.236891,-891.406075,-369.232486,2169.851549,
+ 0.865325,0.357689,-0.3511,-872.922654,-361.576402,2234.768955,
+ 0.865325,0.357689,-0.3511,-872.922654,-361.576402,2234.768955,
+ 0.738649,0.49247,-0.460294,-762.654701,-509.589579,2296.83617,
+ 0.778916,0.519633,-0.3511,-785.609633,-524.927574,2234.768955,
+ 0.738649,0.49247,-0.460294,-762.654701,-509.589579,2296.83617,
+ 0.865325,0.357689,-0.3511,-872.922654,-361.576402,2234.768955,
+ 0.820532,0.338904,-0.460294,-847.416499,-351.011407,2296.83617,
+ 0.743805,0.494626,0.449554,-611.383516,-408.513405,680.911024,
+ 0.906011,0.374347,0.197505,-698.56474,-289.354989,741.194313,
+ 0.815571,0.543908,0.197505,-628.691656,-420.078334,741.194313,
+ 0.906011,0.374347,0.197505,-698.56474,-289.354989,741.194313,
+ 0.743805,0.494626,0.449554,-611.383516,-408.513405,680.911024,
+ 0.82601,0.340012,0.449554,-679.332965,-281.388928,680.911024,
+ 0.55557,0.83147,0,-545.030668,-815.696038,2035.2022,
+ 0.380165,0.917193,0.119297,-373.870315,-902.602786,1967.393306,
+ 0.551796,0.825403,0.119297,-542.77557,-812.321046,1967.393306,
+ 0.380165,0.917193,0.119297,-373.870315,-902.602786,1967.393306,
+ 0.55557,0.83147,0,-545.030668,-815.696038,2035.2022,
+ 0.382683,0.92388,0,-375.423654,-906.352876,2035.2022,
+ 0.458274,0.687833,-0.562913,-490.247555,-733.707316,2355.166755,
+ 0.338904,0.820532,-0.460294,-351.011407,-847.416499,2296.83617,
+ 0.49247,0.738649,-0.460294,-509.589579,-762.654701,2296.83617,
+ 0.338904,0.820532,-0.460294,-351.011407,-847.416499,2296.83617,
+ 0.458274,0.687833,-0.562913,-490.247555,-733.707316,2355.166755,
+ 0.315278,0.764021,-0.562913,-337.688389,-815.251889,2355.166755,
+ 0.417941,0.672244,-0.611076,-467.177743,-699.180902,2408.92764,
+ 0.315278,0.764021,-0.562913,-337.688389,-815.251889,2355.166755,
+ 0.458274,0.687833,-0.562913,-490.247555,-733.707316,2355.166755,
+ 0.315278,0.764021,-0.562913,-337.688389,-815.251889,2355.166755,
+ 0.417941,0.672244,-0.611076,-467.177743,-699.180902,2408.92764,
+ 0.278762,0.740863,-0.611076,-321.797626,-776.888194,2408.92764,
+ 0.306655,0.676633,0.669425,-267.610079,-646.067883,628.271002,
+ 0.341645,0.549525,0.762431,-361.488996,-541.006514,587.016307,
+ 0.432767,0.603806,0.669425,-388.509618,-581.445733,628.271002,
+ 0.341645,0.549525,0.762431,-361.488996,-541.006514,587.016307,
+ 0.306655,0.676633,0.669425,-267.610079,-646.067883,628.271002,
+ 0.227874,0.605618,0.762431,-248.997951,-601.13423,587.016307,
+ 0.527988,0.849252,-0,-415.261462,-621.482696,2549.07468,
+ 0.412792,0.910825,-0,-286.03707,-690.554573,2408.92764,
+ 0.582554,0.812792,-0,-415.261462,-621.482696,2408.92764,
+ 0.412792,0.910825,-0,-286.03707,-690.554573,2408.92764,
+ 0.527988,0.849252,-0,-415.261462,-621.482696,2549.07468,
+ 0.352162,0.935939,-0,-286.03707,-690.554573,2549.07468,
+ 0.343652,0.824502,0.449554,-281.388928,-679.332965,680.911024,
+ 0.168758,0.723457,0.669425,-136.426435,-685.862006,628.271002,
+ 0.306655,0.676633,0.669425,-267.610079,-646.067883,628.271002,
+ 0.168758,0.723457,0.669425,-136.426435,-685.862006,628.271002,
+ 0.343652,0.824502,0.449554,-281.388928,-679.332965,680.911024,
+ 0.176197,0.875703,0.449554,-143.450831,-721.176029,680.911024,
+ 0.381505,0.921818,-0.068597,-290.941975,-702.396062,804.835469,
+ 0.192095,0.961297,0.197505,-147.511894,-741.592372,741.194313,
+ 0.375943,0.90535,0.197505,-289.354989,-698.56474,741.194313,
+ 0.192095,0.961297,0.197505,-147.511894,-741.592372,741.194313,
+ 0.381505,0.921818,-0.068597,-290.941975,-702.396062,804.835469,
+ 0.194336,0.978533,-0.068597,-148.320933,-745.659682,804.835469,
+ 0.001099,0.826515,0.562913,0,-882.422286,1715.237645,
+ -0.12887,0.781011,0.611076,164.051007,-824.740108,1661.47676,
+ 0.025974,0.791146,0.611076,0,-840.897722,1661.47676,
+ -0.12887,0.781011,0.611076,164.051007,-824.740108,1661.47676,
+ 0.001099,0.826515,0.562913,0,-882.422286,1715.237645,
+ -0.160167,0.810848,0.562913,172.152048,-865.466789,1715.237645,
+ 0.375943,0.90535,0.197505,-289.354989,-698.56474,741.194313,
+ 0.176197,0.875703,0.449554,-143.450831,-721.176029,680.911024,
+ 0.343652,0.824502,0.449554,-281.388928,-679.332965,680.911024,
+ 0.176197,0.875703,0.449554,-143.450831,-721.176029,680.911024,
+ 0.375943,0.90535,0.197505,-289.354989,-698.56474,741.194313,
+ 0.192095,0.961297,0.197505,-147.511894,-741.592372,741.194313,
+ 0.162323,0.81042,0.562913,-172.152048,-865.466789,1715.237645,
+ 0.025974,0.791146,0.611076,0,-840.897722,1661.47676,
+ 0.179819,0.770877,0.611076,-164.051007,-824.740108,1661.47676,
+ 0.025974,0.791146,0.611076,0,-840.897722,1661.47676,
+ 0.162323,0.81042,0.562913,-172.152048,-865.466789,1715.237645,
+ 0.001099,0.826515,0.562913,0,-882.422286,1715.237645,
+ 0.344985,0.916863,-0.200867,-286.03707,-690.554573,867.310387,
+ 0.194336,0.978533,-0.068597,-148.320933,-745.659682,804.835469,
+ 0.381505,0.921818,-0.068597,-290.941975,-702.396062,804.835469,
+ 0.194336,0.978533,-0.068597,-148.320933,-745.659682,804.835469,
+ 0.344985,0.916863,-0.200867,-286.03707,-690.554573,867.310387,
+ 0.159485,0.966549,-0.200867,-145.820434,-733.088824,867.310387,
+ 0.22552,0.599364,-0.768052,-178.773169,-431.596609,1100.8886,
+ 0.145475,0.623645,-0.768052,-145.820434,-733.088824,867.310387,
+ 0.264347,0.583281,-0.768052,-286.03707,-690.554573,867.310387,
+ 0.145475,0.623645,-0.768052,-145.820434,-733.088824,867.310387,
+ 0.22552,0.599364,-0.768052,-178.773169,-431.596609,1100.8886,
+ 0.104257,0.631844,-0.768052,-91.137771,-458.180517,1100.8886,
+ 0.315017,0.837219,-0.447021,-232.405119,-561.075591,1287.75132,
+ 0.203207,0.871137,-0.447021,-136.706657,-687.270773,1100.8886,
+ 0.369253,0.814754,-0.447021,-268.159753,-647.394912,1100.8886,
+ 0.203207,0.871137,-0.447021,-136.706657,-687.270773,1100.8886,
+ 0.315017,0.837219,-0.447021,-232.405119,-561.075591,1287.75132,
+ 0.145631,0.882589,-0.447021,-118.479102,-595.634671,1287.75132,
+ 0.315017,0.837219,-0.447021,-250.282436,-604.235252,1474.61404,
+ 0.203207,0.871137,-0.447021,-145.820434,-733.088824,1287.75132,
+ 0.369253,0.814754,-0.447021,-286.03707,-690.554573,1287.75132,
+ 0.203207,0.871137,-0.447021,-145.820434,-733.088824,1287.75132,
+ 0.315017,0.837219,-0.447021,-250.282436,-604.235252,1474.61404,
+ 0.145631,0.882589,-0.447021,-127.592879,-641.452722,1474.61404,
+ 0.315017,0.837219,-0.447021,-268.159753,-647.394912,1661.47676,
+ 0.203207,0.871137,-0.447021,-154.934211,-778.906876,1474.61404,
+ 0.369253,0.814754,-0.447021,-303.914386,-733.714234,1474.61404,
+ 0.203207,0.871137,-0.447021,-154.934211,-778.906876,1474.61404,
+ 0.315017,0.837219,-0.447021,-268.159753,-647.394912,1661.47676,
+ 0.145631,0.882589,-0.447021,-136.706657,-687.270773,1661.47676,
+ 0.317309,0.76318,0.562913,-337.688389,-815.251889,1715.237645,
+ 0.179819,0.770877,0.611076,-164.051007,-824.740108,1661.47676,
+ 0.326755,0.720984,0.611076,-321.797626,-776.888194,1661.47676,
+ 0.179819,0.770877,0.611076,-164.051007,-824.740108,1661.47676,
+ 0.317309,0.76318,0.562913,-337.688389,-815.251889,1715.237645,
+ 0.162323,0.81042,0.562913,-172.152048,-865.466789,1715.237645,
+ 0.340563,0.819845,0.460294,-351.011407,-847.416499,1773.56823,
+ 0.162323,0.81042,0.562913,-172.152048,-865.466789,1715.237645,
+ 0.317309,0.76318,0.562913,-337.688389,-815.251889,1715.237645,
+ 0.162323,0.81042,0.562913,-172.152048,-865.466789,1715.237645,
+ 0.340563,0.819845,0.460294,-351.011407,-847.416499,1773.56823,
+ 0.174075,0.870533,0.460294,-178.944064,-899.612557,1773.56823,
+ 0.358953,0.864801,0.3511,-361.576402,-872.922654,1835.635445,
+ 0.174075,0.870533,0.460294,-178.944064,-899.612557,1773.56823,
+ 0.340563,0.819845,0.460294,-351.011407,-847.416499,1773.56823,
+ 0.174075,0.870533,0.460294,-178.944064,-899.612557,1773.56823,
+ 0.358953,0.864801,0.3511,-361.576402,-872.922654,1835.635445,
+ 0.183341,0.918213,0.3511,-184.330051,-926.689746,1835.635445,
+ 0.382683,0.92388,0,-375.423654,-906.352876,2035.2022,
+ 0.193925,0.973736,0.119297,-190.597434,-958.198007,1967.393306,
+ 0.380165,0.917193,0.119297,-373.870315,-902.602786,1967.393306,
+ 0.193925,0.973736,0.119297,-190.597434,-958.198007,1967.393306,
+ 0.382683,0.92388,0,-375.423654,-906.352876,2035.2022,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.338904,0.820532,-0.460294,-351.011407,-847.416499,2296.83617,
+ 0.181999,0.91848,-0.3511,-184.330051,-926.689746,2234.768955,
+ 0.357689,0.865325,-0.3511,-361.576402,-872.922654,2234.768955,
+ 0.181999,0.91848,-0.3511,-184.330051,-926.689746,2234.768955,
+ 0.338904,0.820532,-0.460294,-351.011407,-847.416499,2296.83617,
+ 0.172314,0.870883,-0.460294,-178.944064,-899.612557,2296.83617,
+ 0.357689,0.865325,-0.3511,-361.576402,-872.922654,2234.768955,
+ 0.189085,0.952958,-0.236891,-188.233089,-946.311642,2169.851549,
+ 0.371365,0.897759,-0.236891,-369.232486,-891.406075,2169.851549,
+ 0.189085,0.952958,-0.236891,-188.233089,-946.311642,2169.851549,
+ 0.357689,0.865325,-0.3511,-361.576402,-872.922654,2234.768955,
+ 0.181999,0.91848,-0.3511,-184.330051,-926.689746,2234.768955,
+ 0.352162,0.935939,-0,-286.03707,-690.554573,2549.07468,
+ 0.227168,0.973856,-0,-145.820434,-733.088824,2408.92764,
+ 0.412792,0.910825,-0,-286.03707,-690.554573,2408.92764,
+ 0.227168,0.973856,-0,-145.820434,-733.088824,2408.92764,
+ 0.352162,0.935939,-0,-286.03707,-690.554573,2549.07468,
+ 0.162803,0.986659,-0,-145.820434,-733.088824,2549.07468,
+ 0.168758,0.723457,0.669425,-136.426435,-685.862006,628.271002,
+ 0.227874,0.605618,0.762431,-248.997951,-601.13423,587.016307,
+ 0.306655,0.676633,0.669425,-267.610079,-646.067883,628.271002,
+ 0.227874,0.605618,0.762431,-248.997951,-601.13423,587.016307,
+ 0.168758,0.723457,0.669425,-136.426435,-685.862006,628.271002,
+ 0.105345,0.638437,0.762431,-126.938055,-638.160695,587.016307,
+ 0.176197,0.875703,0.449554,-143.450831,-721.176029,680.911024,
+ 0.024376,0.742479,0.669425,0,-699.298837,628.271002,
+ 0.168758,0.723457,0.669425,-136.426435,-685.862006,628.271002,
+ 0.024376,0.742479,0.669425,0,-699.298837,628.271002,
+ 0.176197,0.875703,0.449554,-143.450831,-721.176029,680.911024,
+ 0.00197,0.893251,0.449554,0,-735.304703,680.911024,
+ 0.192095,0.961297,0.197505,-147.511894,-741.592372,741.194313,
+ 0.00197,0.893251,0.449554,0,-735.304703,680.911024,
+ 0.176197,0.875703,0.449554,-143.450831,-721.176029,680.911024,
+ 0.00197,0.893251,0.449554,0,-735.304703,680.911024,
+ 0.192095,0.961297,0.197505,-147.511894,-741.592372,741.194313,
+ 0.000864,0.980301,0.197505,0,-756.121025,741.194313,
+ 0.194336,0.978533,-0.068597,-148.320933,-745.659682,804.835469,
+ 0.000864,0.980301,0.197505,0,-756.121025,741.194313,
+ 0.192095,0.961297,0.197505,-147.511894,-741.592372,741.194313,
+ 0.000864,0.980301,0.197505,0,-756.121025,741.194313,
+ 0.194336,0.978533,-0.068597,-148.320933,-745.659682,804.835469,
+ -0.0003,0.997644,-0.068597,0,-760.268019,804.835469,
+ 0.159485,0.966549,-0.200867,-145.820434,-733.088824,867.310387,
+ -0.0003,0.997644,-0.068597,0,-760.268019,804.835469,
+ 0.194336,0.978533,-0.068597,-148.320933,-745.659682,804.835469,
+ -0.0003,0.997644,-0.068597,0,-760.268019,804.835469,
+ 0.159485,0.966549,-0.200867,-145.820434,-733.088824,867.310387,
+ -0.032144,0.979091,-0.200867,0,-747.450884,867.310387,
+ 0.104257,0.631844,-0.768052,-91.137771,-458.180517,1100.8886,
+ 0,0.640184,-0.768222,0,-747.450884,867.310387,
+ 0.145475,0.623645,-0.768052,-145.820434,-733.088824,867.310387,
+ 0,0.640184,-0.768222,0,-747.450884,867.310387,
+ 0.104257,0.631844,-0.768052,-91.137771,-458.180517,1100.8886,
+ 0,0.640184,-0.768222,0,-467.156804,1100.8886,
+ 0.145631,0.882589,-0.447021,-118.479102,-595.634671,1287.75132,
+ 0.029352,0.894042,-0.447021,0,-700.735204,1100.8886,
+ 0.203207,0.871137,-0.447021,-136.706657,-687.270773,1100.8886,
+ 0.029352,0.894042,-0.447021,0,-700.735204,1100.8886,
+ 0.145631,0.882589,-0.447021,-118.479102,-595.634671,1287.75132,
+ -0.029352,0.894042,-0.447021,0,-607.303844,1287.75132,
+ 0.732968,0.120943,0.669425,-685.862006,-136.426435,628.271002,
+ 0.869022,0.085591,0.487313,-735.304703,0,680.911024,
+ 0.876472,0.172332,0.449554,-721.176029,-143.450831,680.911024,
+ 0.869022,0.085591,0.487313,-735.304703,0,680.911024,
+ 0.732968,0.120943,0.669425,-685.862006,-136.426435,628.271002,
+ 0.740721,0.072955,0.66784,-699.298837,0,628.271002,
+ -0.875139,0.086194,0.476133,917.237009,-0,1773.56823,
+ -0.810848,0.160167,0.562913,865.466789,-172.152048,1715.237645,
+ -0.870883,0.172314,0.460294,899.612557,-178.944064,1773.56823,
+ -0.810848,0.160167,0.562913,865.466789,-172.152048,1715.237645,
+ -0.875139,0.086194,0.476133,917.237009,-0,1773.56823,
+ -0.812508,0.080025,0.577431,882.422286,-0,1715.237645,
+ -0.029352,0.894042,-0.447021,0,-654.019524,1474.61404,
+ -0.145631,0.882589,-0.447021,145.820434,-733.088824,1287.75132,
+ 0.029352,0.894042,-0.447021,0,-747.450884,1287.75132,
+ -0.145631,0.882589,-0.447021,145.820434,-733.088824,1287.75132,
+ -0.029352,0.894042,-0.447021,0,-654.019524,1474.61404,
+ -0.203207,0.871137,-0.447021,127.592879,-641.452722,1474.61404,
+ 0.145631,0.882589,-0.447021,-136.706657,-687.270773,1661.47676,
+ 0.029352,0.894042,-0.447021,0,-794.166564,1474.61404,
+ 0.203207,0.871137,-0.447021,-154.934211,-778.906876,1474.61404,
+ 0.029352,0.894042,-0.447021,0,-794.166564,1474.61404,
+ 0.145631,0.882589,-0.447021,-136.706657,-687.270773,1661.47676,
+ -0.029352,0.894042,-0.447021,0,-700.735204,1661.47676,
+ -0.925281,0.091132,0.36817,944.844672,-0,1835.635445,
+ -0.870883,0.172314,0.460294,899.612557,-178.944064,1773.56823,
+ -0.91848,0.181999,0.3511,926.689746,-184.330051,1835.635445,
+ -0.870883,0.172314,0.460294,899.612557,-178.944064,1773.56823,
+ -0.925281,0.091132,0.36817,944.844672,-0,1835.635445,
+ -0.875139,0.086194,0.476133,917.237009,-0,1773.56823,
+ -0.000898,0.887766,-0.460294,0,-917.237009,2296.83617,
+ -0.183341,0.918213,-0.3511,184.330051,-926.689746,2234.768955,
+ -0.014053,0.939213,-0.343046,0,-944.844672,2234.768955,
+ -0.183341,0.918213,-0.3511,184.330051,-926.689746,2234.768955,
+ -0.000898,0.887766,-0.460294,0,-917.237009,2296.83617,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ 0.183341,0.918213,0.3511,-184.330051,-926.689746,1835.635445,
+ 0.000898,0.887766,0.460294,0,-917.237009,1773.56823,
+ 0.174075,0.870533,0.460294,-178.944064,-899.612557,1773.56823,
+ 0.000898,0.887766,0.460294,0,-917.237009,1773.56823,
+ 0.183341,0.918213,0.3511,-184.330051,-926.689746,1835.635445,
+ -0.01288,0.939228,0.343052,0,-944.844672,1835.635445,
+ 0.18999,0.952778,0.236891,-188.233089,-946.311642,1900.552851,
+ -0.01288,0.939228,0.343052,0,-944.844672,1835.635445,
+ 0.183341,0.918213,0.3511,-184.330051,-926.689746,1835.635445,
+ -0.01288,0.939228,0.343052,0,-944.844672,1835.635445,
+ 0.18999,0.952778,0.236891,-188.233089,-946.311642,1900.552851,
+ 0.000461,0.971536,0.236891,0,-964.850983,1900.552851,
+ -0.172332,0.876472,0.449554,143.450831,-721.176029,680.911024,
+ -0.2815,0.687288,0.669621,267.610079,-646.067883,628.271002,
+ -0.130866,0.717913,0.683722,136.426435,-685.862006,628.271002,
+ -0.2815,0.687288,0.669621,267.610079,-646.067883,628.271002,
+ -0.172332,0.876472,0.449554,143.450831,-721.176029,680.911024,
+ -0.340012,0.82601,0.449554,281.388928,-679.332965,680.911024,
+ -0.1904,0.961634,0.197505,147.511894,-741.592372,741.194313,
+ -0.340012,0.82601,0.449554,281.388928,-679.332965,680.911024,
+ -0.172332,0.876472,0.449554,143.450831,-721.176029,680.911024,
+ -0.340012,0.82601,0.449554,281.388928,-679.332965,680.911024,
+ -0.1904,0.961634,0.197505,147.511894,-741.592372,741.194313,
+ -0.374347,0.906011,0.197505,289.354989,-698.56474,741.194313,
+ -0.194925,0.978416,-0.068597,148.320933,-745.659682,804.835469,
+ -0.374347,0.906011,0.197505,289.354989,-698.56474,741.194313,
+ -0.1904,0.961634,0.197505,147.511894,-741.592372,741.194313,
+ -0.374347,0.906011,0.197505,289.354989,-698.56474,741.194313,
+ -0.194925,0.978416,-0.068597,148.320933,-745.659682,804.835469,
+ -0.382059,0.921588,-0.068597,290.941975,-702.396062,804.835469,
+ -0.222538,0.954007,-0.200867,145.820434,-733.088824,867.310387,
+ -0.382059,0.921588,-0.068597,290.941975,-702.396062,804.835469,
+ -0.194925,0.978416,-0.068597,148.320933,-745.659682,804.835469,
+ -0.382059,0.921588,-0.068597,290.941975,-702.396062,804.835469,
+ -0.222538,0.954007,-0.200867,145.820434,-733.088824,867.310387,
+ -0.404379,0.892261,-0.200867,286.03707,-690.554573,867.310387,
+ -0.22552,0.599364,-0.768052,178.773169,-431.596609,1100.8886,
+ -0.145475,0.623645,-0.768052,145.820434,-733.088824,867.310387,
+ -0.104257,0.631844,-0.768052,91.137771,-458.180517,1100.8886,
+ -0.145475,0.623645,-0.768052,145.820434,-733.088824,867.310387,
+ -0.22552,0.599364,-0.768052,178.773169,-431.596609,1100.8886,
+ -0.264347,0.583281,-0.768052,286.03707,-690.554573,867.310387,
+ -0.203207,0.871137,-0.447021,118.479102,-595.634671,1287.75132,
+ -0.315017,0.837219,-0.447021,268.159753,-647.394912,1100.8886,
+ -0.145631,0.882589,-0.447021,136.706657,-687.270773,1100.8886,
+ -0.315017,0.837219,-0.447021,268.159753,-647.394912,1100.8886,
+ -0.203207,0.871137,-0.447021,118.479102,-595.634671,1287.75132,
+ -0.369253,0.814754,-0.447021,232.405119,-561.075591,1287.75132,
+ -0.203207,0.871137,-0.447021,127.592879,-641.452722,1474.61404,
+ -0.315017,0.837219,-0.447021,286.03707,-690.554573,1287.75132,
+ -0.145631,0.882589,-0.447021,145.820434,-733.088824,1287.75132,
+ -0.315017,0.837219,-0.447021,286.03707,-690.554573,1287.75132,
+ -0.203207,0.871137,-0.447021,127.592879,-641.452722,1474.61404,
+ -0.369253,0.814754,-0.447021,250.282436,-604.235252,1474.61404,
+ -0.203207,0.871137,-0.447021,136.706657,-687.270773,1661.47676,
+ -0.315017,0.837219,-0.447021,303.914386,-733.714234,1474.61404,
+ -0.145631,0.882589,-0.447021,154.934211,-778.906876,1474.61404,
+ -0.315017,0.837219,-0.447021,303.914386,-733.714234,1474.61404,
+ -0.203207,0.871137,-0.447021,136.706657,-687.270773,1661.47676,
+ -0.369253,0.814754,-0.447021,268.159753,-647.394912,1661.47676,
+ -0.160167,0.810848,0.562913,172.152048,-865.466789,1715.237645,
+ -0.278762,0.740863,0.611076,321.797626,-776.888194,1661.47676,
+ -0.12887,0.781011,0.611076,164.051007,-824.740108,1661.47676,
+ -0.278762,0.740863,0.611076,321.797626,-776.888194,1661.47676,
+ -0.160167,0.810848,0.562913,172.152048,-865.466789,1715.237645,
+ -0.315278,0.764021,0.562913,337.688389,-815.251889,1715.237645,
+ -0.962266,0.094775,0.255071,964.850983,-0,1900.552851,
+ -0.91848,0.181999,0.3511,926.689746,-184.330051,1835.635445,
+ -0.952958,0.189085,0.236891,946.311642,-188.233089,1900.552851,
+ -0.91848,0.181999,0.3511,926.689746,-184.330051,1835.635445,
+ -0.962266,0.094775,0.255071,964.850983,-0,1900.552851,
+ -0.925281,0.091132,0.36817,944.844672,-0,1835.635445,
+ 0.812508,0.080025,-0.577431,-882.422286,0,2355.166755,
+ 0.781011,0.12887,-0.611076,-824.740108,-164.051007,2408.92764,
+ 0.810848,0.160167,-0.562913,-865.466789,-172.152048,2355.166755,
+ 0.781011,0.12887,-0.611076,-824.740108,-164.051007,2408.92764,
+ 0.812508,0.080025,-0.577431,-882.422286,0,2355.166755,
+ 0.789019,0.077712,-0.609434,-840.897722,0,2408.92764,
+ -0.172314,0.870883,0.460294,178.944064,-899.612557,1773.56823,
+ -0.315278,0.764021,0.562913,337.688389,-815.251889,1715.237645,
+ -0.160167,0.810848,0.562913,172.152048,-865.466789,1715.237645,
+ -0.315278,0.764021,0.562913,337.688389,-815.251889,1715.237645,
+ -0.172314,0.870883,0.460294,178.944064,-899.612557,1773.56823,
+ -0.32859,0.82894,0.452643,351.011407,-847.416499,1773.56823,
+ 0.871137,0.203207,-0.447021,-687.270773,-136.706657,1100.8886,
+ 0.837219,0.315017,-0.447021,-561.075591,-232.405119,1287.75132,
+ 0.814754,0.369253,-0.447021,-647.394912,-268.159753,1100.8886,
+ 0.837219,0.315017,-0.447021,-561.075591,-232.405119,1287.75132,
+ 0.871137,0.203207,-0.447021,-687.270773,-136.706657,1100.8886,
+ 0.882589,0.145631,-0.447021,-595.634671,-118.479102,1287.75132,
+ -0.985604,0.097074,0.138423,976.970216,-0,1967.393306,
+ -0.952958,0.189085,0.236891,946.311642,-188.233089,1900.552851,
+ -0.973826,0.193469,0.119297,958.198007,-190.597434,1967.393306,
+ -0.952958,0.189085,0.236891,946.311642,-188.233089,1900.552851,
+ -0.985604,0.097074,0.138423,976.970216,-0,1967.393306,
+ -0.962266,0.094775,0.255071,964.850983,-0,1900.552851,
+ -0.162323,0.81042,-0.562913,172.152048,-865.466789,2355.166755,
+ -0.353801,0.818498,-0.452643,351.011407,-847.416499,2296.83617,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ -0.353801,0.818498,-0.452643,351.011407,-847.416499,2296.83617,
+ -0.162323,0.81042,-0.562913,172.152048,-865.466789,2355.166755,
+ -0.317309,0.76318,-0.562913,337.688389,-815.251889,2355.166755,
+ -0.995185,0.098017,-0,981.029284,-0,2035.2022,
+ -0.973826,0.193469,0.119297,958.198007,-190.597434,1967.393306,
+ -0.973856,0.227168,-0,962.179081,-191.389319,2035.2022,
+ -0.973826,0.193469,0.119297,958.198007,-190.597434,1967.393306,
+ -0.995185,0.098017,-0,981.029284,-0,2035.2022,
+ -0.985604,0.097074,0.138423,976.970216,-0,1967.393306,
+ -0.179819,0.770877,-0.611076,164.051007,-824.740108,2408.92764,
+ -0.317309,0.76318,-0.562913,337.688389,-815.251889,2355.166755,
+ -0.162323,0.81042,-0.562913,172.152048,-865.466789,2355.166755,
+ -0.317309,0.76318,-0.562913,337.688389,-815.251889,2355.166755,
+ -0.179819,0.770877,-0.611076,164.051007,-824.740108,2408.92764,
+ -0.326755,0.720984,-0.611076,321.797626,-776.888194,2408.92764,
+ -0.227168,0.973856,-0,145.820434,-733.088824,2549.07468,
+ -0.352162,0.935939,-0,286.03707,-690.554573,2408.92764,
+ -0.162803,0.986659,-0,145.820434,-733.088824,2408.92764,
+ -0.352162,0.935939,-0,286.03707,-690.554573,2408.92764,
+ -0.227168,0.973856,-0,145.820434,-733.088824,2549.07468,
+ -0.412792,0.910825,-0,286.03707,-690.554573,2549.07468,
+ -0.130866,0.717913,0.683722,136.426435,-685.862006,628.271002,
+ -0.227874,0.605618,0.762431,248.997951,-601.13423,587.016307,
+ -0.126198,0.634438,0.762603,126.938055,-638.160695,587.016307,
+ -0.227874,0.605618,0.762431,248.997951,-601.13423,587.016307,
+ -0.130866,0.717913,0.683722,136.426435,-685.862006,628.271002,
+ -0.2815,0.687288,0.669621,267.610079,-646.067883,628.271002,
+ -0.340012,0.82601,0.449554,281.388928,-679.332965,680.911024,
+ -0.410175,0.619164,0.669621,388.509618,-581.445733,628.271002,
+ -0.2815,0.687288,0.669621,267.610079,-646.067883,628.271002,
+ -0.410175,0.619164,0.669621,388.509618,-581.445733,628.271002,
+ -0.340012,0.82601,0.449554,281.388928,-679.332965,680.911024,
+ -0.494626,0.743805,0.449554,408.513405,-611.383516,680.911024,
+ -0.374347,0.906011,0.197505,289.354989,-698.56474,741.194313,
+ -0.494626,0.743805,0.449554,408.513405,-611.383516,680.911024,
+ -0.340012,0.82601,0.449554,281.388928,-679.332965,680.911024,
+ -0.494626,0.743805,0.449554,408.513405,-611.383516,680.911024,
+ -0.374347,0.906011,0.197505,289.354989,-698.56474,741.194313,
+ -0.543908,0.815571,0.197505,420.078334,-628.691656,741.194313,
+ -0.382059,0.921588,-0.068597,290.941975,-702.396062,804.835469,
+ -0.543908,0.815571,0.197505,420.078334,-628.691656,741.194313,
+ -0.374347,0.906011,0.197505,289.354989,-698.56474,741.194313,
+ -0.543908,0.815571,0.197505,420.078334,-628.691656,741.194313,
+ -0.382059,0.921588,-0.068597,290.941975,-702.396062,804.835469,
+ -0.554511,0.829344,-0.068597,422.38228,-632.139755,804.835469,
+ -0.404379,0.892261,-0.200867,286.03707,-690.554573,867.310387,
+ -0.554511,0.829344,-0.068597,422.38228,-632.139755,804.835469,
+ -0.382059,0.921588,-0.068597,290.941975,-702.396062,804.835469,
+ -0.554511,0.829344,-0.068597,422.38228,-632.139755,804.835469,
+ -0.404379,0.892261,-0.200867,286.03707,-690.554573,867.310387,
+ -0.570681,0.796226,-0.200867,415.261462,-621.482696,867.310387,
+ -0.973826,0.193469,-0.119297,958.198007,-190.597434,2103.011094,
+ -0.995185,0.098017,-0,981.029284,-0,2035.2022,
+ -0.973856,0.227168,-0,962.179081,-191.389319,2035.2022,
+ -0.995185,0.098017,-0,981.029284,-0,2035.2022,
+ -0.973826,0.193469,-0.119297,958.198007,-190.597434,2103.011094,
+ -0.985604,0.097074,-0.138423,976.970216,-0,2103.011094,
+ -0.952958,0.189085,-0.236891,946.311642,-188.233089,2169.851549,
+ -0.985604,0.097074,-0.138423,976.970216,-0,2103.011094,
+ -0.973826,0.193469,-0.119297,958.198007,-190.597434,2103.011094,
+ -0.985604,0.097074,-0.138423,976.970216,-0,2103.011094,
+ -0.952958,0.189085,-0.236891,946.311642,-188.233089,2169.851549,
+ -0.962266,0.094775,-0.255071,964.850983,-0,2169.851549,
+ -0.338117,0.54385,-0.768052,259.538414,-388.426686,1100.8886,
+ -0.264347,0.583281,-0.768052,286.03707,-690.554573,867.310387,
+ -0.22552,0.599364,-0.768052,178.773169,-431.596609,1100.8886,
+ -0.264347,0.583281,-0.768052,286.03707,-690.554573,867.310387,
+ -0.338117,0.54385,-0.768052,259.538414,-388.426686,1100.8886,
+ -0.37306,0.520502,-0.768052,415.261462,-621.482696,867.310387,
+ -0.369253,0.814754,-0.447021,232.405119,-561.075591,1287.75132,
+ -0.472298,0.759676,-0.447021,389.30762,-582.640028,1100.8886,
+ -0.315017,0.837219,-0.447021,268.159753,-647.394912,1100.8886,
+ -0.472298,0.759676,-0.447021,389.30762,-582.640028,1100.8886,
+ -0.369253,0.814754,-0.447021,232.405119,-561.075591,1287.75132,
+ -0.521108,0.727062,-0.447021,337.399938,-504.954691,1287.75132,
+ 0.870883,0.172314,-0.460294,-899.612557,-178.944064,2296.83617,
+ 0.764021,0.315278,-0.562913,-815.251889,-337.688389,2355.166755,
+ 0.820532,0.338904,-0.460294,-847.416499,-351.011407,2296.83617,
+ 0.764021,0.315278,-0.562913,-815.251889,-337.688389,2355.166755,
+ 0.870883,0.172314,-0.460294,-899.612557,-178.944064,2296.83617,
+ 0.810848,0.160167,-0.562913,-865.466789,-172.152048,2355.166755,
+ 0.973826,0.193469,-0.119297,-958.198007,-190.597434,2103.011094,
+ 0.897759,0.371365,-0.236891,-891.406075,-369.232486,2169.851549,
+ 0.917371,0.379736,-0.119297,-902.602786,-373.870315,2103.011094,
+ 0.897759,0.371365,-0.236891,-891.406075,-369.232486,2169.851549,
+ 0.973826,0.193469,-0.119297,-958.198007,-190.597434,2103.011094,
+ 0.952958,0.189085,-0.236891,-946.311642,-188.233089,2169.851549,
+ -0.369253,0.814754,-0.447021,250.282436,-604.235252,1474.61404,
+ -0.472298,0.759676,-0.447021,415.261462,-621.482696,1287.75132,
+ -0.315017,0.837219,-0.447021,286.03707,-690.554573,1287.75132,
+ -0.472298,0.759676,-0.447021,415.261462,-621.482696,1287.75132,
+ -0.369253,0.814754,-0.447021,250.282436,-604.235252,1474.61404,
+ -0.521108,0.727062,-0.447021,363.353779,-543.79736,1474.61404,
+ -0.369253,0.814754,-0.447021,268.159753,-647.394912,1661.47676,
+ -0.472298,0.759676,-0.447021,441.215303,-660.325365,1474.61404,
+ -0.315017,0.837219,-0.447021,303.914386,-733.714234,1474.61404,
+ -0.472298,0.759676,-0.447021,441.215303,-660.325365,1474.61404,
+ -0.369253,0.814754,-0.447021,268.159753,-647.394912,1661.47676,
+ -0.521108,0.727062,-0.447021,389.30762,-582.640028,1661.47676,
+ -0.315278,0.764021,0.562913,337.688389,-815.251889,1715.237645,
+ -0.417941,0.672244,0.611076,467.177743,-699.180902,1661.47676,
+ -0.278762,0.740863,0.611076,321.797626,-776.888194,1661.47676,
+ -0.417941,0.672244,0.611076,467.177743,-699.180902,1661.47676,
+ -0.315278,0.764021,0.562913,337.688389,-815.251889,1715.237645,
+ -0.458274,0.687833,0.562913,490.247555,-733.707316,1715.237645,
+ -0.32859,0.82894,0.452643,351.011407,-847.416499,1773.56823,
+ -0.458274,0.687833,0.562913,490.247555,-733.707316,1715.237645,
+ -0.315278,0.764021,0.562913,337.688389,-815.251889,1715.237645,
+ -0.458274,0.687833,0.562913,490.247555,-733.707316,1715.237645,
+ -0.32859,0.82894,0.452643,351.011407,-847.416499,1773.56823,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ 0.808059,0.539373,0.236891,-802.244273,-536.042486,1900.552851,
+ 0.917371,0.379736,0.119297,-902.602786,-373.870315,1967.393306,
+ 0.825661,0.55141,0.119297,-812.321046,-542.77557,1967.393306,
+ 0.917371,0.379736,0.119297,-902.602786,-373.870315,1967.393306,
+ 0.808059,0.539373,0.236891,-802.244273,-536.042486,1900.552851,
+ 0.897759,0.371365,0.236891,-891.406075,-369.232486,1900.552851,
+ 0.825661,0.55141,0.119297,-812.321046,-542.77557,1967.393306,
+ 0.910825,0.412792,0,-906.352876,-375.423654,2035.2022,
+ 0.812792,0.582554,0,-815.696038,-545.030668,2035.2022,
+ 0.910825,0.412792,0,-906.352876,-375.423654,2035.2022,
+ 0.825661,0.55141,0.119297,-812.321046,-542.77557,1967.393306,
+ 0.917371,0.379736,0.119297,-902.602786,-373.870315,1967.393306,
+ 0.910825,0.412792,0,-906.352876,-375.423654,2035.2022,
+ 0.825661,0.55141,-0.119297,-812.321046,-542.77557,2103.011094,
+ 0.812792,0.582554,0,-815.696038,-545.030668,2035.2022,
+ 0.825661,0.55141,-0.119297,-812.321046,-542.77557,2103.011094,
+ 0.910825,0.412792,0,-906.352876,-375.423654,2035.2022,
+ 0.917371,0.379736,-0.119297,-902.602786,-373.870315,2103.011094,
+ 0.630892,0.392232,0.669425,-581.445733,-388.509618,628.271002,
+ 0.82601,0.340012,0.449554,-679.332965,-281.388928,680.911024,
+ 0.743805,0.494626,0.449554,-611.383516,-408.513405,680.911024,
+ 0.82601,0.340012,0.449554,-679.332965,-281.388928,680.911024,
+ 0.630892,0.392232,0.669425,-581.445733,-388.509618,628.271002,
+ 0.69529,0.261614,0.669425,-646.067883,-267.610079,628.271002,
+ -0.317309,0.76318,-0.562913,337.688389,-815.251889,2355.166755,
+ -0.468784,0.754023,-0.460099,509.589579,-762.654701,2296.83617,
+ -0.353801,0.818498,-0.452643,351.011407,-847.416499,2296.83617,
+ -0.468784,0.754023,-0.460099,509.589579,-762.654701,2296.83617,
+ -0.317309,0.76318,-0.562913,337.688389,-815.251889,2355.166755,
+ -0.460101,0.686612,-0.562913,490.247555,-733.707316,2355.166755,
+ -0.326755,0.720984,-0.611076,321.797626,-776.888194,2408.92764,
+ -0.460101,0.686612,-0.562913,490.247555,-733.707316,2355.166755,
+ -0.317309,0.76318,-0.562913,337.688389,-815.251889,2355.166755,
+ -0.460101,0.686612,-0.562913,490.247555,-733.707316,2355.166755,
+ -0.326755,0.720984,-0.611076,321.797626,-776.888194,2408.92764,
+ -0.461133,0.643383,-0.611076,467.177743,-699.180902,2408.92764,
+ -0.412792,0.910825,-0,286.03707,-690.554573,2549.07468,
+ -0.527988,0.849252,-0,415.261462,-621.482696,2408.92764,
+ -0.352162,0.935939,-0,286.03707,-690.554573,2408.92764,
+ -0.527988,0.849252,-0,415.261462,-621.482696,2408.92764,
+ -0.412792,0.910825,-0,286.03707,-690.554573,2549.07468,
+ -0.582554,0.812792,-0,415.261462,-621.482696,2549.07468,
+ -0.2815,0.687288,0.669621,267.610079,-646.067883,628.271002,
+ -0.341645,0.549525,0.762431,361.488996,-541.006514,587.016307,
+ -0.227874,0.605618,0.762431,248.997951,-601.13423,587.016307,
+ -0.341645,0.549525,0.762431,361.488996,-541.006514,587.016307,
+ -0.2815,0.687288,0.669621,267.610079,-646.067883,628.271002,
+ -0.410175,0.619164,0.669621,388.509618,-581.445733,628.271002,
+ -0.494626,0.743805,0.449554,408.513405,-611.383516,680.911024,
+ -0.540644,0.52765,0.655203,494.47895,-494.47895,628.271002,
+ -0.410175,0.619164,0.669621,388.509618,-581.445733,628.271002,
+ -0.540644,0.52765,0.655203,494.47895,-494.47895,628.271002,
+ -0.494626,0.743805,0.449554,408.513405,-611.383516,680.911024,
+ -0.645232,0.645232,0.409086,519.938942,-519.938942,680.911024,
+ -0.543908,0.815571,0.197505,420.078334,-628.691656,741.194313,
+ -0.645232,0.645232,0.409086,519.938942,-519.938942,680.911024,
+ -0.494626,0.743805,0.449554,408.513405,-611.383516,680.911024,
+ -0.645232,0.645232,0.409086,519.938942,-519.938942,680.911024,
+ -0.543908,0.815571,0.197505,420.078334,-628.691656,741.194313,
+ -0.698738,0.698738,0.153394,534.658304,-534.658304,741.194313,
+ -0.554511,0.829344,-0.068597,422.38228,-632.139755,804.835469,
+ -0.698738,0.698738,0.153394,534.658304,-534.658304,741.194313,
+ -0.543908,0.815571,0.197505,420.078334,-628.691656,741.194313,
+ -0.698738,0.698738,0.153394,534.658304,-534.658304,741.194313,
+ -0.554511,0.829344,-0.068597,422.38228,-632.139755,804.835469,
+ -0.689987,0.717509,-0.095383,537.590672,-537.590672,804.835469,
+ -0.570681,0.796226,-0.200867,415.261462,-621.482696,867.310387,
+ -0.689987,0.717509,-0.095383,537.590672,-537.590672,804.835469,
+ -0.554511,0.829344,-0.068597,422.38228,-632.139755,804.835469,
+ -0.689987,0.717509,-0.095383,537.590672,-537.590672,804.835469,
+ -0.570681,0.796226,-0.200867,415.261462,-621.482696,867.310387,
+ -0.715051,0.669593,-0.200867,528.527588,-528.527588,867.310387,
+ -0.43772,0.467437,-0.768052,330.329744,-330.329744,1100.8886,
+ -0.37306,0.520502,-0.768052,415.261462,-621.482696,867.310387,
+ -0.338117,0.54385,-0.768052,259.538414,-388.426686,1100.8886,
+ -0.37306,0.520502,-0.768052,415.261462,-621.482696,867.310387,
+ -0.43772,0.467437,-0.768052,330.329744,-330.329744,1100.8886,
+ -0.467437,0.43772,-0.768052,528.527588,-528.527588,867.310387,
+ -0.521108,0.727062,-0.447021,337.399938,-504.954691,1287.75132,
+ -0.611428,0.652938,-0.447021,495.494614,-495.494614,1100.8886,
+ -0.472298,0.759676,-0.447021,389.30762,-582.640028,1100.8886,
+ -0.611428,0.652938,-0.447021,495.494614,-495.494614,1100.8886,
+ -0.521108,0.727062,-0.447021,337.399938,-504.954691,1287.75132,
+ -0.652938,0.611428,-0.447021,429.428666,-429.428666,1287.75132,
+ -0.521108,0.727062,-0.447021,363.353779,-543.79736,1474.61404,
+ -0.611428,0.652938,-0.447021,528.527588,-528.527588,1287.75132,
+ -0.472298,0.759676,-0.447021,415.261462,-621.482696,1287.75132,
+ -0.611428,0.652938,-0.447021,528.527588,-528.527588,1287.75132,
+ -0.521108,0.727062,-0.447021,363.353779,-543.79736,1474.61404,
+ -0.652938,0.611428,-0.447021,462.46164,-462.46164,1474.61404,
+ -0.029352,0.894042,-0.447021,0,-607.303844,1287.75132,
+ -0.145631,0.882589,-0.447021,136.706657,-687.270773,1100.8886,
+ 0.029352,0.894042,-0.447021,0,-700.735204,1100.8886,
+ -0.145631,0.882589,-0.447021,136.706657,-687.270773,1100.8886,
+ -0.029352,0.894042,-0.447021,0,-607.303844,1287.75132,
+ -0.203207,0.871137,-0.447021,118.479102,-595.634671,1287.75132,
+ -0.521108,0.727062,-0.447021,389.30762,-582.640028,1661.47676,
+ -0.611428,0.652938,-0.447021,561.560563,-561.560563,1474.61404,
+ -0.472298,0.759676,-0.447021,441.215303,-660.325365,1474.61404,
+ -0.611428,0.652938,-0.447021,561.560563,-561.560563,1474.61404,
+ -0.521108,0.727062,-0.447021,389.30762,-582.640028,1661.47676,
+ -0.652938,0.611428,-0.447021,495.494614,-495.494614,1661.47676,
+ -0.91848,0.181999,-0.3511,926.689746,-184.330051,2234.768955,
+ -0.962266,0.094775,-0.255071,964.850983,-0,2169.851549,
+ -0.952958,0.189085,-0.236891,946.311642,-188.233089,2169.851549,
+ -0.962266,0.094775,-0.255071,964.850983,-0,2169.851549,
+ -0.91848,0.181999,-0.3511,926.689746,-184.330051,2234.768955,
+ -0.925281,0.091132,-0.36817,944.844672,-0,2234.768955,
+ -0.458274,0.687833,0.562913,490.247555,-733.707316,1715.237645,
+ -0.559613,0.559613,0.611282,594.604481,-594.604481,1661.47676,
+ -0.417941,0.672244,0.611076,467.177743,-699.180902,1661.47676,
+ -0.559613,0.559613,0.611282,594.604481,-594.604481,1661.47676,
+ -0.458274,0.687833,0.562913,490.247555,-733.707316,1715.237645,
+ -0.59226,0.59226,0.546311,623.966782,-623.966782,1715.237645,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ -0.59226,0.59226,0.546311,623.966782,-623.966782,1715.237645,
+ -0.458274,0.687833,0.562913,490.247555,-733.707316,1715.237645,
+ -0.59226,0.59226,0.546311,623.966782,-623.966782,1715.237645,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.460101,0.686612,-0.562913,490.247555,-733.707316,2355.166755,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.468784,0.754023,-0.460099,509.589579,-762.654701,2296.83617,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.460101,0.686612,-0.562913,490.247555,-733.707316,2355.166755,
+ -0.585212,0.583657,-0.562913,623.966782,-623.966782,2355.166755,
+ -0.870883,0.172314,-0.460294,899.612557,-178.944064,2296.83617,
+ -0.925281,0.091132,-0.36817,944.844672,-0,2234.768955,
+ -0.91848,0.181999,-0.3511,926.689746,-184.330051,2234.768955,
+ -0.925281,0.091132,-0.36817,944.844672,-0,2234.768955,
+ -0.870883,0.172314,-0.460294,899.612557,-178.944064,2296.83617,
+ -0.875139,0.086194,-0.476133,917.237009,-0,2296.83617,
+ -0.810848,0.160167,-0.562913,865.466789,-172.152048,2355.166755,
+ -0.875139,0.086194,-0.476133,917.237009,-0,2296.83617,
+ -0.870883,0.172314,-0.460294,899.612557,-178.944064,2296.83617,
+ -0.875139,0.086194,-0.476133,917.237009,-0,2296.83617,
+ -0.810848,0.160167,-0.562913,865.466789,-172.152048,2355.166755,
+ -0.812508,0.080025,-0.577431,882.422286,-0,2355.166755,
+ -0.781011,0.12887,-0.611076,824.740108,-164.051007,2408.92764,
+ -0.812508,0.080025,-0.577431,882.422286,-0,2355.166755,
+ -0.810848,0.160167,-0.562913,865.466789,-172.152048,2355.166755,
+ -0.812508,0.080025,-0.577431,882.422286,-0,2355.166755,
+ -0.781011,0.12887,-0.611076,824.740108,-164.051007,2408.92764,
+ -0.789019,0.077712,-0.609434,840.897722,-0,2408.92764,
+ -0.995185,0.098017,-0,747.450884,-0,2549.07468,
+ -0.980785,0.19509,-0,733.088824,-145.820434,2408.92764,
+ -0.980785,0.19509,-0,733.088824,-145.820434,2549.07468,
+ -0.980785,0.19509,-0,733.088824,-145.820434,2408.92764,
+ -0.995185,0.098017,-0,747.450884,-0,2549.07468,
+ -0.995185,0.098017,0,747.450884,-0,2408.92764,
+ -0.461133,0.643383,-0.611076,467.177743,-699.180902,2408.92764,
+ -0.585212,0.583657,-0.562913,623.966782,-623.966782,2355.166755,
+ -0.460101,0.686612,-0.562913,490.247555,-733.707316,2355.166755,
+ -0.585212,0.583657,-0.562913,623.966782,-623.966782,2355.166755,
+ -0.461133,0.643383,-0.611076,467.177743,-699.180902,2408.92764,
+ -0.577791,0.541058,-0.611076,594.604481,-594.604481,2408.92764,
+ -0.582554,0.812792,-0,415.261462,-621.482696,2549.07468,
+ -0.683524,0.729928,-0,528.527588,-528.527588,2408.92764,
+ -0.527988,0.849252,-0,415.261462,-621.482696,2408.92764,
+ -0.683524,0.729928,-0,528.527588,-528.527588,2408.92764,
+ -0.582554,0.812792,-0,415.261462,-621.482696,2549.07468,
+ -0.729928,0.683524,-0,528.527588,-528.527588,2549.07468,
+ -0.410175,0.619164,0.669621,388.509618,-581.445733,628.271002,
+ -0.442288,0.472315,0.762431,460.088221,-460.088221,587.016307,
+ -0.341645,0.549525,0.762431,361.488996,-541.006514,587.016307,
+ -0.442288,0.472315,0.762431,460.088221,-460.088221,587.016307,
+ -0.410175,0.619164,0.669621,388.509618,-581.445733,628.271002,
+ -0.540644,0.52765,0.655203,494.47895,-494.47895,628.271002,
+ -0.743805,0.494626,0.449554,611.383516,-408.513405,680.911024,
+ -0.540644,0.52765,0.655203,494.47895,-494.47895,628.271002,
+ -0.645232,0.645232,0.409086,519.938942,-519.938942,680.911024,
+ -0.540644,0.52765,0.655203,494.47895,-494.47895,628.271002,
+ -0.743805,0.494626,0.449554,611.383516,-408.513405,680.911024,
+ -0.630892,0.392232,0.669425,581.445733,-388.509618,628.271002,
+ -0.815571,0.543908,0.197505,628.691656,-420.078334,741.194313,
+ -0.645232,0.645232,0.409086,519.938942,-519.938942,680.911024,
+ -0.698738,0.698738,0.153394,534.658304,-534.658304,741.194313,
+ -0.645232,0.645232,0.409086,519.938942,-519.938942,680.911024,
+ -0.815571,0.543908,0.197505,628.691656,-420.078334,741.194313,
+ -0.743805,0.494626,0.449554,611.383516,-408.513405,680.911024,
+ -0.81088,0.581183,-0.06856,632.139755,-422.38228,804.835469,
+ -0.698738,0.698738,0.153394,534.658304,-534.658304,741.194313,
+ -0.689987,0.717509,-0.095383,537.590672,-537.590672,804.835469,
+ -0.698738,0.698738,0.153394,534.658304,-534.658304,741.194313,
+ -0.81088,0.581183,-0.06856,632.139755,-422.38228,804.835469,
+ -0.815571,0.543908,0.197505,628.691656,-420.078334,741.194313,
+ -0.715051,0.669593,-0.200867,528.527588,-528.527588,867.310387,
+ -0.81088,0.581183,-0.06856,632.139755,-422.38228,804.835469,
+ -0.689987,0.717509,-0.095383,537.590672,-537.590672,804.835469,
+ -0.81088,0.581183,-0.06856,632.139755,-422.38228,804.835469,
+ -0.715051,0.669593,-0.200867,528.527588,-528.527588,867.310387,
+ -0.831943,0.517227,-0.200867,621.482696,-415.261462,867.310387,
+ -0.520502,0.37306,-0.768052,388.426686,-259.538414,1100.8886,
+ -0.467437,0.43772,-0.768052,528.527588,-528.527588,867.310387,
+ -0.43772,0.467437,-0.768052,330.329744,-330.329744,1100.8886,
+ -0.467437,0.43772,-0.768052,528.527588,-528.527588,867.310387,
+ -0.520502,0.37306,-0.768052,388.426686,-259.538414,1100.8886,
+ -0.54385,0.338117,-0.768052,621.482696,-415.261462,867.310387,
+ 0.952958,0.189085,-0.236891,-946.311642,-188.233089,2169.851549,
+ 0.865325,0.357689,-0.3511,-872.922654,-361.576402,2234.768955,
+ 0.897759,0.371365,-0.236891,-891.406075,-369.232486,2169.851549,
+ 0.865325,0.357689,-0.3511,-872.922654,-361.576402,2234.768955,
+ 0.952958,0.189085,-0.236891,-946.311642,-188.233089,2169.851549,
+ 0.91848,0.181999,-0.3511,-926.689746,-184.330051,2234.768955,
+ -0.652938,0.611428,-0.447021,429.428666,-429.428666,1287.75132,
+ -0.727062,0.521108,-0.447021,582.640028,-389.30762,1100.8886,
+ -0.611428,0.652938,-0.447021,495.494614,-495.494614,1100.8886,
+ -0.727062,0.521108,-0.447021,582.640028,-389.30762,1100.8886,
+ -0.652938,0.611428,-0.447021,429.428666,-429.428666,1287.75132,
+ -0.759676,0.472298,-0.447021,504.954691,-337.399938,1287.75132,
+ -0.652938,0.611428,-0.447021,462.46164,-462.46164,1474.61404,
+ -0.727062,0.521108,-0.447021,621.482696,-415.261462,1287.75132,
+ -0.611428,0.652938,-0.447021,528.527588,-528.527588,1287.75132,
+ -0.727062,0.521108,-0.447021,621.482696,-415.261462,1287.75132,
+ -0.652938,0.611428,-0.447021,462.46164,-462.46164,1474.61404,
+ -0.759676,0.472298,-0.447021,543.79736,-363.353779,1474.61404,
+ -0.652938,0.611428,-0.447021,495.494614,-495.494614,1661.47676,
+ -0.727062,0.521108,-0.447021,660.325365,-441.215303,1474.61404,
+ -0.611428,0.652938,-0.447021,561.560563,-561.560563,1474.61404,
+ -0.727062,0.521108,-0.447021,660.325365,-441.215303,1474.61404,
+ -0.652938,0.611428,-0.447021,495.494614,-495.494614,1661.47676,
+ -0.759676,0.472298,-0.447021,582.640028,-389.30762,1661.47676,
+ -0.732968,0.120943,0.669425,685.862006,-136.426435,628.271002,
+ -0.645559,0.063582,0.761059,650.663002,-0,587.016307,
+ -0.630153,0.146993,0.762431,638.160695,-126.938055,587.016307,
+ -0.645559,0.063582,0.761059,650.663002,-0,587.016307,
+ -0.732968,0.120943,0.669425,685.862006,-136.426435,628.271002,
+ -0.740721,0.072955,0.66784,699.298837,-0,628.271002,
+ -0.687833,0.458274,0.562913,733.707316,-490.247555,1715.237645,
+ -0.559613,0.559613,0.611282,594.604481,-594.604481,1661.47676,
+ -0.59226,0.59226,0.546311,623.966782,-623.966782,1715.237645,
+ -0.559613,0.559613,0.611282,594.604481,-594.604481,1661.47676,
+ -0.687833,0.458274,0.562913,733.707316,-490.247555,1715.237645,
+ -0.672244,0.417941,0.611076,699.180902,-467.177743,1661.47676,
+ -0.738649,0.49247,0.460294,762.654701,-509.589579,1773.56823,
+ -0.59226,0.59226,0.546311,623.966782,-623.966782,1715.237645,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.59226,0.59226,0.546311,623.966782,-623.966782,1715.237645,
+ -0.738649,0.49247,0.460294,762.654701,-509.589579,1773.56823,
+ -0.687833,0.458274,0.562913,733.707316,-490.247555,1715.237645,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.662575,0.661607,0.3511,668.106075,-668.106075,1835.635445,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.738649,0.49247,0.460294,762.654701,-509.589579,1773.56823,
+ -0.130866,0.717913,0.683722,136.426435,-685.862006,628.271002,
+ -0.021232,0.646722,0.762431,0,-650.663002,587.016307,
+ 0.024376,0.742479,0.669425,0,-699.298837,628.271002,
+ -0.021232,0.646722,0.762431,0,-650.663002,587.016307,
+ -0.130866,0.717913,0.683722,136.426435,-685.862006,628.271002,
+ -0.126198,0.634438,0.762603,126.938055,-638.160695,587.016307,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.662575,0.661607,-0.3511,668.106075,-668.106075,2234.768955,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.738649,0.49247,-0.460294,762.654701,-509.589579,2296.83617,
+ -0.585212,0.583657,-0.562913,623.966782,-623.966782,2355.166755,
+ -0.738649,0.49247,-0.460294,762.654701,-509.589579,2296.83617,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.738649,0.49247,-0.460294,762.654701,-509.589579,2296.83617,
+ -0.585212,0.583657,-0.562913,623.966782,-623.966782,2355.166755,
+ -0.687833,0.458274,-0.562913,733.707316,-490.247555,2355.166755,
+ -0.577791,0.541058,-0.611076,594.604481,-594.604481,2408.92764,
+ -0.687833,0.458274,-0.562913,733.707316,-490.247555,2355.166755,
+ -0.585212,0.583657,-0.562913,623.966782,-623.966782,2355.166755,
+ -0.687833,0.458274,-0.562913,733.707316,-490.247555,2355.166755,
+ -0.577791,0.541058,-0.611076,594.604481,-594.604481,2408.92764,
+ -0.672244,0.417941,-0.611076,699.180902,-467.177743,2408.92764,
+ -0.729928,0.683524,-0,528.527588,-528.527588,2549.07468,
+ -0.812792,0.582554,-0,621.482696,-415.261462,2408.92764,
+ -0.683524,0.729928,-0,528.527588,-528.527588,2408.92764,
+ -0.812792,0.582554,-0,621.482696,-415.261462,2408.92764,
+ -0.729928,0.683524,-0,528.527588,-528.527588,2549.07468,
+ -0.849252,0.527988,-0,621.482696,-415.261462,2549.07468,
+ -0.540644,0.52765,0.655203,494.47895,-494.47895,628.271002,
+ -0.525933,0.376953,0.762431,541.006514,-361.488996,587.016307,
+ -0.442288,0.472315,0.762431,460.088221,-460.088221,587.016307,
+ -0.525933,0.376953,0.762431,541.006514,-361.488996,587.016307,
+ -0.540644,0.52765,0.655203,494.47895,-494.47895,628.271002,
+ -0.630892,0.392232,0.669425,581.445733,-388.509618,628.271002,
+ -0.906011,0.374347,0.197505,698.56474,-289.354989,741.194313,
+ -0.743805,0.494626,0.449554,611.383516,-408.513405,680.911024,
+ -0.815571,0.543908,0.197505,628.691656,-420.078334,741.194313,
+ -0.743805,0.494626,0.449554,611.383516,-408.513405,680.911024,
+ -0.906011,0.374347,0.197505,698.56474,-289.354989,741.194313,
+ -0.82601,0.340012,0.449554,679.332965,-281.388928,680.911024,
+ -0.908682,0.411821,-0.06856,702.396062,-290.941975,804.835469,
+ -0.815571,0.543908,0.197505,628.691656,-420.078334,741.194313,
+ -0.81088,0.581183,-0.06856,632.139755,-422.38228,804.835469,
+ -0.815571,0.543908,0.197505,628.691656,-420.078334,741.194313,
+ -0.908682,0.411821,-0.06856,702.396062,-290.941975,804.835469,
+ -0.906011,0.374347,0.197505,698.56474,-289.354989,741.194313,
+ -0.831943,0.517227,-0.200867,621.482696,-415.261462,867.310387,
+ -0.908682,0.411821,-0.06856,702.396062,-290.941975,804.835469,
+ -0.81088,0.581183,-0.06856,632.139755,-422.38228,804.835469,
+ -0.908682,0.411821,-0.06856,702.396062,-290.941975,804.835469,
+ -0.831943,0.517227,-0.200867,621.482696,-415.261462,867.310387,
+ -0.916863,0.344985,-0.200867,690.554573,-286.03707,867.310387,
+ -0.759676,0.472298,-0.447021,543.79736,-363.353779,1474.61404,
+ -0.814754,0.369253,-0.447021,690.554573,-286.03707,1287.75132,
+ -0.727062,0.521108,-0.447021,621.482696,-415.261462,1287.75132,
+ -0.814754,0.369253,-0.447021,690.554573,-286.03707,1287.75132,
+ -0.759676,0.472298,-0.447021,543.79736,-363.353779,1474.61404,
+ -0.837219,0.315017,-0.447021,604.235252,-250.282436,1474.61404,
+ -0.583281,0.264347,-0.768052,431.596609,-178.773169,1100.8886,
+ -0.54385,0.338117,-0.768052,621.482696,-415.261462,867.310387,
+ -0.520502,0.37306,-0.768052,388.426686,-259.538414,1100.8886,
+ -0.54385,0.338117,-0.768052,621.482696,-415.261462,867.310387,
+ -0.583281,0.264347,-0.768052,431.596609,-178.773169,1100.8886,
+ -0.599364,0.22552,-0.768052,690.554573,-286.03707,867.310387,
+ -0.759676,0.472298,-0.447021,504.954691,-337.399938,1287.75132,
+ -0.814754,0.369253,-0.447021,647.394912,-268.159753,1100.8886,
+ -0.727062,0.521108,-0.447021,582.640028,-389.30762,1100.8886,
+ -0.814754,0.369253,-0.447021,647.394912,-268.159753,1100.8886,
+ -0.759676,0.472298,-0.447021,504.954691,-337.399938,1287.75132,
+ -0.837219,0.315017,-0.447021,561.075591,-232.405119,1287.75132,
+ 0.952958,0.189085,0.236891,-946.311642,-188.233089,1900.552851,
+ 0.985604,0.097074,0.138423,-976.970216,-0,1967.393306,
+ 0.973826,0.193469,0.119297,-958.198007,-190.597434,1967.393306,
+ 0.985604,0.097074,0.138423,-976.970216,-0,1967.393306,
+ 0.952958,0.189085,0.236891,-946.311642,-188.233089,1900.552851,
+ 0.962266,0.094775,0.255071,-964.850983,-0,1900.552851,
+ -0.759676,0.472298,-0.447021,582.640028,-389.30762,1661.47676,
+ -0.814754,0.369253,-0.447021,733.714234,-303.914386,1474.61404,
+ -0.727062,0.521108,-0.447021,660.325365,-441.215303,1474.61404,
+ -0.814754,0.369253,-0.447021,733.714234,-303.914386,1474.61404,
+ -0.759676,0.472298,-0.447021,582.640028,-389.30762,1661.47676,
+ -0.837219,0.315017,-0.447021,647.394912,-268.159753,1661.47676,
+ -0.764021,0.315278,0.562913,815.251889,-337.688389,1715.237645,
+ -0.672244,0.417941,0.611076,699.180902,-467.177743,1661.47676,
+ -0.687833,0.458274,0.562913,733.707316,-490.247555,1715.237645,
+ -0.672244,0.417941,0.611076,699.180902,-467.177743,1661.47676,
+ -0.764021,0.315278,0.562913,815.251889,-337.688389,1715.237645,
+ -0.740863,0.278762,0.611076,776.888194,-321.797626,1661.47676,
+ -0.820532,0.338904,0.460294,847.416499,-351.011407,1773.56823,
+ -0.687833,0.458274,0.562913,733.707316,-490.247555,1715.237645,
+ -0.738649,0.49247,0.460294,762.654701,-509.589579,1773.56823,
+ -0.687833,0.458274,0.562913,733.707316,-490.247555,1715.237645,
+ -0.820532,0.338904,0.460294,847.416499,-351.011407,1773.56823,
+ -0.764021,0.315278,0.562913,815.251889,-337.688389,1715.237645,
+ -0.865325,0.357689,0.3511,872.922654,-361.576402,1835.635445,
+ -0.738649,0.49247,0.460294,762.654701,-509.589579,1773.56823,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.738649,0.49247,0.460294,762.654701,-509.589579,1773.56823,
+ -0.865325,0.357689,0.3511,872.922654,-361.576402,1835.635445,
+ -0.820532,0.338904,0.460294,847.416499,-351.011407,1773.56823,
+ -0.897759,0.371365,0.236891,891.406075,-369.232486,1900.552851,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.897759,0.371365,0.236891,891.406075,-369.232486,1900.552851,
+ -0.865325,0.357689,0.3511,872.922654,-361.576402,1835.635445,
+ -0.910825,0.412792,0,906.352876,-375.423654,2035.2022,
+ -0.819909,0.56476,0.093785,812.321046,-542.77557,1967.393306,
+ -0.831469,0.55557,-0,815.696038,-545.030668,2035.2022,
+ -0.819909,0.56476,0.093785,812.321046,-542.77557,1967.393306,
+ -0.910825,0.412792,0,906.352876,-375.423654,2035.2022,
+ -0.917371,0.379736,0.119297,902.602786,-373.870315,1967.393306,
+ -0.917371,0.379736,0.119297,902.602786,-373.870315,1967.393306,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.819909,0.56476,0.093785,812.321046,-542.77557,1967.393306,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.917371,0.379736,0.119297,902.602786,-373.870315,1967.393306,
+ -0.897759,0.371365,0.236891,891.406075,-369.232486,1900.552851,
+ -0.819909,0.56476,-0.093785,812.321046,-542.77557,2103.011094,
+ -0.910825,0.412792,0,906.352876,-375.423654,2035.2022,
+ -0.831469,0.55557,-0,815.696038,-545.030668,2035.2022,
+ -0.910825,0.412792,0,906.352876,-375.423654,2035.2022,
+ -0.819909,0.56476,-0.093785,812.321046,-542.77557,2103.011094,
+ -0.917371,0.379736,-0.119297,902.602786,-373.870315,2103.011094,
+ 0.91848,0.181999,0.3511,-926.689746,-184.330051,1835.635445,
+ 0.962266,0.094775,0.255071,-964.850983,-0,1900.552851,
+ 0.952958,0.189085,0.236891,-946.311642,-188.233089,1900.552851,
+ 0.962266,0.094775,0.255071,-964.850983,-0,1900.552851,
+ 0.91848,0.181999,0.3511,-926.689746,-184.330051,1835.635445,
+ 0.925281,0.091132,0.36817,-944.844672,0,1835.635445,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.917371,0.379736,-0.119297,902.602786,-373.870315,2103.011094,
+ -0.819909,0.56476,-0.093785,812.321046,-542.77557,2103.011094,
+ -0.917371,0.379736,-0.119297,902.602786,-373.870315,2103.011094,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.897759,0.371365,-0.236891,891.406075,-369.232486,2169.851549,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.897759,0.371365,-0.236891,891.406075,-369.232486,2169.851549,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.897759,0.371365,-0.236891,891.406075,-369.232486,2169.851549,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.865325,0.357689,-0.3511,872.922654,-361.576402,2234.768955,
+ 0.633017,0.630231,0.449554,-519.938942,-519.938942,680.911024,
+ 0.432767,0.603806,0.669425,-388.509618,-581.445733,628.271002,
+ 0.542249,0.507776,0.669425,-494.47895,-494.47895,628.271002,
+ 0.432767,0.603806,0.669425,-388.509618,-581.445733,628.271002,
+ 0.633017,0.630231,0.449554,-519.938942,-519.938942,680.911024,
+ 0.497902,0.741616,0.449554,-408.513405,-611.383516,680.911024,
+ -0.738649,0.49247,-0.460294,762.654701,-509.589579,2296.83617,
+ -0.865325,0.357689,-0.3511,872.922654,-361.576402,2234.768955,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.865325,0.357689,-0.3511,872.922654,-361.576402,2234.768955,
+ -0.738649,0.49247,-0.460294,762.654701,-509.589579,2296.83617,
+ -0.820532,0.338904,-0.460294,847.416499,-351.011407,2296.83617,
+ -0.687833,0.458274,-0.562913,733.707316,-490.247555,2355.166755,
+ -0.820532,0.338904,-0.460294,847.416499,-351.011407,2296.83617,
+ -0.738649,0.49247,-0.460294,762.654701,-509.589579,2296.83617,
+ -0.820532,0.338904,-0.460294,847.416499,-351.011407,2296.83617,
+ -0.687833,0.458274,-0.562913,733.707316,-490.247555,2355.166755,
+ -0.764021,0.315278,-0.562913,815.251889,-337.688389,2355.166755,
+ -0.672244,0.417941,-0.611076,699.180902,-467.177743,2408.92764,
+ -0.764021,0.315278,-0.562913,815.251889,-337.688389,2355.166755,
+ -0.687833,0.458274,-0.562913,733.707316,-490.247555,2355.166755,
+ -0.764021,0.315278,-0.562913,815.251889,-337.688389,2355.166755,
+ -0.672244,0.417941,-0.611076,699.180902,-467.177743,2408.92764,
+ -0.740863,0.278762,-0.611076,776.888194,-321.797626,2408.92764,
+ -0.849252,0.527988,-0,621.482696,-415.261462,2549.07468,
+ -0.910825,0.412792,-0,690.554573,-286.03707,2408.92764,
+ -0.812792,0.582554,-0,621.482696,-415.261462,2408.92764,
+ -0.910825,0.412792,-0,690.554573,-286.03707,2408.92764,
+ -0.849252,0.527988,-0,621.482696,-415.261462,2549.07468,
+ -0.935939,0.352162,-0,690.554573,-286.03707,2549.07468,
+ -0.630892,0.392232,0.669425,581.445733,-388.509618,628.271002,
+ -0.589368,0.267106,0.762431,601.13423,-248.997951,587.016307,
+ -0.525933,0.376953,0.762431,541.006514,-361.488996,587.016307,
+ -0.589368,0.267106,0.762431,601.13423,-248.997951,587.016307,
+ -0.630892,0.392232,0.669425,581.445733,-388.509618,628.271002,
+ -0.69529,0.261614,0.669425,646.067883,-267.610079,628.271002,
+ -0.876472,0.172332,0.449554,721.176029,-143.450831,680.911024,
+ -0.69529,0.261614,0.669425,646.067883,-267.610079,628.271002,
+ -0.82601,0.340012,0.449554,679.332965,-281.388928,680.911024,
+ -0.69529,0.261614,0.669425,646.067883,-267.610079,628.271002,
+ -0.876472,0.172332,0.449554,721.176029,-143.450831,680.911024,
+ -0.732968,0.120943,0.669425,685.862006,-136.426435,628.271002,
+ -0.961634,0.1904,0.197505,741.592372,-147.511894,741.194313,
+ -0.82601,0.340012,0.449554,679.332965,-281.388928,680.911024,
+ -0.906011,0.374347,0.197505,698.56474,-289.354989,741.194313,
+ -0.82601,0.340012,0.449554,679.332965,-281.388928,680.911024,
+ -0.961634,0.1904,0.197505,741.592372,-147.511894,741.194313,
+ -0.876472,0.172332,0.449554,721.176029,-143.450831,680.911024,
+ -0.971564,0.226633,-0.06856,745.659682,-148.320933,804.835469,
+ -0.906011,0.374347,0.197505,698.56474,-289.354989,741.194313,
+ -0.908682,0.411821,-0.06856,702.396062,-290.941975,804.835469,
+ -0.906011,0.374347,0.197505,698.56474,-289.354989,741.194313,
+ -0.971564,0.226633,-0.06856,745.659682,-148.320933,804.835469,
+ -0.961634,0.1904,0.197505,741.592372,-147.511894,741.194313,
+ -0.916863,0.344985,-0.200867,690.554573,-286.03707,867.310387,
+ -0.971564,0.226633,-0.06856,745.659682,-148.320933,804.835469,
+ -0.908682,0.411821,-0.06856,702.396062,-290.941975,804.835469,
+ -0.971564,0.226633,-0.06856,745.659682,-148.320933,804.835469,
+ -0.916863,0.344985,-0.200867,690.554573,-286.03707,867.310387,
+ -0.966549,0.159485,-0.200867,733.088824,-145.820434,867.310387,
+ -0.623645,0.145475,-0.768052,458.180517,-91.137771,1100.8886,
+ -0.599364,0.22552,-0.768052,690.554573,-286.03707,867.310387,
+ -0.583281,0.264347,-0.768052,431.596609,-178.773169,1100.8886,
+ -0.599364,0.22552,-0.768052,690.554573,-286.03707,867.310387,
+ -0.623645,0.145475,-0.768052,458.180517,-91.137771,1100.8886,
+ -0.631844,0.104257,-0.768052,733.088824,-145.820434,867.310387,
+ -0.837219,0.315017,-0.447021,561.075591,-232.405119,1287.75132,
+ -0.871137,0.203207,-0.447021,687.270773,-136.706657,1100.8886,
+ -0.814754,0.369253,-0.447021,647.394912,-268.159753,1100.8886,
+ -0.871137,0.203207,-0.447021,687.270773,-136.706657,1100.8886,
+ -0.837219,0.315017,-0.447021,561.075591,-232.405119,1287.75132,
+ -0.882589,0.145631,-0.447021,595.634671,-118.479102,1287.75132,
+ -0.837219,0.315017,-0.447021,604.235252,-250.282436,1474.61404,
+ -0.871137,0.203207,-0.447021,733.088824,-145.820434,1287.75132,
+ -0.814754,0.369253,-0.447021,690.554573,-286.03707,1287.75132,
+ -0.871137,0.203207,-0.447021,733.088824,-145.820434,1287.75132,
+ -0.837219,0.315017,-0.447021,604.235252,-250.282436,1474.61404,
+ -0.882589,0.145631,-0.447021,641.452722,-127.592879,1474.61404,
+ -0.837219,0.315017,-0.447021,647.394912,-268.159753,1661.47676,
+ -0.871137,0.203207,-0.447021,778.906876,-154.934211,1474.61404,
+ -0.814754,0.369253,-0.447021,733.714234,-303.914386,1474.61404,
+ -0.871137,0.203207,-0.447021,778.906876,-154.934211,1474.61404,
+ -0.837219,0.315017,-0.447021,647.394912,-268.159753,1661.47676,
+ -0.882589,0.145631,-0.447021,687.270773,-136.706657,1661.47676,
+ -0.810848,0.160167,0.562913,865.466789,-172.152048,1715.237645,
+ -0.740863,0.278762,0.611076,776.888194,-321.797626,1661.47676,
+ -0.764021,0.315278,0.562913,815.251889,-337.688389,1715.237645,
+ -0.740863,0.278762,0.611076,776.888194,-321.797626,1661.47676,
+ -0.810848,0.160167,0.562913,865.466789,-172.152048,1715.237645,
+ -0.781011,0.12887,0.611076,824.740108,-164.051007,1661.47676,
+ -0.870883,0.172314,0.460294,899.612557,-178.944064,1773.56823,
+ -0.764021,0.315278,0.562913,815.251889,-337.688389,1715.237645,
+ -0.820532,0.338904,0.460294,847.416499,-351.011407,1773.56823,
+ -0.764021,0.315278,0.562913,815.251889,-337.688389,1715.237645,
+ -0.870883,0.172314,0.460294,899.612557,-178.944064,1773.56823,
+ -0.810848,0.160167,0.562913,865.466789,-172.152048,1715.237645,
+ -0.91848,0.181999,0.3511,926.689746,-184.330051,1835.635445,
+ -0.820532,0.338904,0.460294,847.416499,-351.011407,1773.56823,
+ -0.865325,0.357689,0.3511,872.922654,-361.576402,1835.635445,
+ -0.820532,0.338904,0.460294,847.416499,-351.011407,1773.56823,
+ -0.91848,0.181999,0.3511,926.689746,-184.330051,1835.635445,
+ -0.870883,0.172314,0.460294,899.612557,-178.944064,1773.56823,
+ -0.952958,0.189085,0.236891,946.311642,-188.233089,1900.552851,
+ -0.865325,0.357689,0.3511,872.922654,-361.576402,1835.635445,
+ -0.897759,0.371365,0.236891,891.406075,-369.232486,1900.552851,
+ -0.865325,0.357689,0.3511,872.922654,-361.576402,1835.635445,
+ -0.952958,0.189085,0.236891,946.311642,-188.233089,1900.552851,
+ -0.91848,0.181999,0.3511,926.689746,-184.330051,1835.635445,
+ -0.973826,0.193469,0.119297,958.198007,-190.597434,1967.393306,
+ -0.897759,0.371365,0.236891,891.406075,-369.232486,1900.552851,
+ -0.917371,0.379736,0.119297,902.602786,-373.870315,1967.393306,
+ -0.897759,0.371365,0.236891,891.406075,-369.232486,1900.552851,
+ -0.973826,0.193469,0.119297,958.198007,-190.597434,1967.393306,
+ -0.952958,0.189085,0.236891,946.311642,-188.233089,1900.552851,
+ -0.973856,0.227168,-0,962.179081,-191.389319,2035.2022,
+ -0.917371,0.379736,0.119297,902.602786,-373.870315,1967.393306,
+ -0.910825,0.412792,0,906.352876,-375.423654,2035.2022,
+ -0.917371,0.379736,0.119297,902.602786,-373.870315,1967.393306,
+ -0.973856,0.227168,-0,962.179081,-191.389319,2035.2022,
+ -0.973826,0.193469,0.119297,958.198007,-190.597434,1967.393306,
+ -0.917371,0.379736,-0.119297,902.602786,-373.870315,2103.011094,
+ -0.973856,0.227168,-0,962.179081,-191.389319,2035.2022,
+ -0.910825,0.412792,0,906.352876,-375.423654,2035.2022,
+ -0.973856,0.227168,-0,962.179081,-191.389319,2035.2022,
+ -0.917371,0.379736,-0.119297,902.602786,-373.870315,2103.011094,
+ -0.973826,0.193469,-0.119297,958.198007,-190.597434,2103.011094,
+ -0.897759,0.371365,-0.236891,891.406075,-369.232486,2169.851549,
+ -0.973826,0.193469,-0.119297,958.198007,-190.597434,2103.011094,
+ -0.917371,0.379736,-0.119297,902.602786,-373.870315,2103.011094,
+ -0.973826,0.193469,-0.119297,958.198007,-190.597434,2103.011094,
+ -0.897759,0.371365,-0.236891,891.406075,-369.232486,2169.851549,
+ -0.952958,0.189085,-0.236891,946.311642,-188.233089,2169.851549,
+ -0.865325,0.357689,-0.3511,872.922654,-361.576402,2234.768955,
+ -0.952958,0.189085,-0.236891,946.311642,-188.233089,2169.851549,
+ -0.897759,0.371365,-0.236891,891.406075,-369.232486,2169.851549,
+ -0.952958,0.189085,-0.236891,946.311642,-188.233089,2169.851549,
+ -0.865325,0.357689,-0.3511,872.922654,-361.576402,2234.768955,
+ -0.91848,0.181999,-0.3511,926.689746,-184.330051,2234.768955,
+ -0.740863,0.278762,-0.611076,776.888194,-321.797626,2408.92764,
+ -0.810848,0.160167,-0.562913,865.466789,-172.152048,2355.166755,
+ -0.764021,0.315278,-0.562913,815.251889,-337.688389,2355.166755,
+ -0.810848,0.160167,-0.562913,865.466789,-172.152048,2355.166755,
+ -0.740863,0.278762,-0.611076,776.888194,-321.797626,2408.92764,
+ -0.781011,0.12887,-0.611076,824.740108,-164.051007,2408.92764,
+ -0.820532,0.338904,-0.460294,847.416499,-351.011407,2296.83617,
+ -0.91848,0.181999,-0.3511,926.689746,-184.330051,2234.768955,
+ -0.865325,0.357689,-0.3511,872.922654,-361.576402,2234.768955,
+ -0.91848,0.181999,-0.3511,926.689746,-184.330051,2234.768955,
+ -0.820532,0.338904,-0.460294,847.416499,-351.011407,2296.83617,
+ -0.870883,0.172314,-0.460294,899.612557,-178.944064,2296.83617,
+ -0.764021,0.315278,-0.562913,815.251889,-337.688389,2355.166755,
+ -0.870883,0.172314,-0.460294,899.612557,-178.944064,2296.83617,
+ -0.820532,0.338904,-0.460294,847.416499,-351.011407,2296.83617,
+ -0.870883,0.172314,-0.460294,899.612557,-178.944064,2296.83617,
+ -0.764021,0.315278,-0.562913,815.251889,-337.688389,2355.166755,
+ -0.810848,0.160167,-0.562913,865.466789,-172.152048,2355.166755,
+ -0.935939,0.352162,-0,690.554573,-286.03707,2549.07468,
+ -0.980785,0.19509,-0,733.088824,-145.820434,2408.92764,
+ -0.910825,0.412792,-0,690.554573,-286.03707,2408.92764,
+ -0.980785,0.19509,-0,733.088824,-145.820434,2408.92764,
+ -0.935939,0.352162,-0,690.554573,-286.03707,2549.07468,
+ -0.980785,0.19509,-0,733.088824,-145.820434,2549.07468,
+ 0.890977,0.087754,-0.445488,-700.735204,0,1100.8886,
+ 0.882589,0.145631,-0.447021,-595.634671,-118.479102,1287.75132,
+ 0.871137,0.203207,-0.447021,-687.270773,-136.706657,1100.8886,
+ 0.882589,0.145631,-0.447021,-595.634671,-118.479102,1287.75132,
+ 0.890977,0.087754,-0.445488,-700.735204,0,1100.8886,
+ 0.890977,0.087754,-0.445488,-607.303844,0,1287.75132,
+ 0.69529,0.261614,0.669425,-646.067883,-267.610079,628.271002,
+ 0.876472,0.172332,0.449554,-721.176029,-143.450831,680.911024,
+ 0.82601,0.340012,0.449554,-679.332965,-281.388928,680.911024,
+ 0.876472,0.172332,0.449554,-721.176029,-143.450831,680.911024,
+ 0.69529,0.261614,0.669425,-646.067883,-267.610079,628.271002,
+ 0.732968,0.120943,0.669425,-685.862006,-136.426435,628.271002,
+ -0.377198,0.832286,0.406229,357.792969,-863.788639,1813.40854,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ -0.32859,0.82894,0.452643,351.011407,-847.416499,1773.56823,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ -0.377198,0.832286,0.406229,357.792969,-863.788639,1813.40854,
+ -0.431053,0.806443,0.404776,395.941832,-839.735343,1806.112064,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ -0.431053,0.806443,0.404776,395.941832,-839.735343,1806.112064,
+ -0.431053,0.806443,0.404776,476.980677,-794.166464,1801.623942,
+ -0.532321,0.742706,0.406229,517.019027,-773.773655,1803.632468,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ -0.431053,0.806443,0.404776,476.980677,-794.166464,1801.623942,
+ -0.532321,0.742706,0.406229,517.019027,-773.773655,1803.632468,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.477566,0.756484,0.446838,509.589579,-762.654701,1773.56823,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.532321,0.742706,0.406229,517.019027,-773.773655,1803.632468,
+ -0.580099,0.706853,0.404776,549.426369,-748.597589,1806.112103,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.580099,0.706853,0.404776,549.426369,-748.597589,1806.112103,
+ -0.580099,0.706853,0.404776,612.093113,-704.779902,1819.404068,
+ -0.621118,0.652965,0.433416,648.584509,-648.584509,1773.56823,
+ -0.580099,0.706853,0.404776,612.093113,-704.779902,1819.404068,
+ -0.662575,0.661607,0.3511,668.106075,-668.106075,1835.635445,
+ -0.662575,0.661607,0.3511,668.106075,-668.106075,1835.635445,
+ -0.580099,0.706853,0.404776,612.093113,-704.779902,1819.404068,
+ -0.594359,0.724228,0.349616,660.420878,-674.413152,1835.635445,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ -0.32859,0.82894,0.452643,351.011407,-847.416499,1773.56823,
+ -0.172314,0.870883,0.460294,178.944064,-899.612557,1773.56823,
+ -0.32859,0.82894,0.452643,351.011407,-847.416499,1773.56823,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ -0.265441,0.875041,0.404776,301.781055,-883.553039,1819.403991,
+ -0.32859,0.82894,0.452643,351.011407,-847.416499,1773.56823,
+ -0.265441,0.875041,0.404776,301.781055,-883.553039,1819.403991,
+ -0.377198,0.832286,0.406229,357.792969,-863.788639,1813.40854,
+ -0.265441,0.875041,0.404776,301.781055,-883.553039,1819.403991,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ -0.271966,0.896551,0.349616,226.426278,-913.919995,1835.635445,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ -0.277526,0.914879,0.293216,199.065204,-923.935663,1840.988923,
+ -0.271966,0.896551,0.349616,226.426278,-913.919995,1835.635445,
+ -0.277526,0.914879,0.293216,199.065204,-923.935663,1840.988923,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ -0.186438,0.937285,0.294512,184.93882,-929.750234,1845.760812,
+ -0.01288,0.939228,0.343052,0,-944.844672,1835.635445,
+ -0.093709,0.951442,0.293216,104.493637,-940.355693,1854.464465,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ -0.093709,0.951442,0.293216,104.493637,-940.355693,1854.464465,
+ -0.01288,0.939228,0.343052,0,-944.844672,1835.635445,
+ 0.000461,0.971536,0.236891,0,-964.850983,1900.552851,
+ -0.204727,0.913717,0.351011,184.330051,-926.689746,1835.635445,
+ -0.093709,0.951442,0.293216,104.493637,-940.355693,1854.464465,
+ -0.186438,0.937285,0.294512,184.93882,-929.750234,1845.760812,
+ -0.093709,0.951442,0.293216,104.493637,-940.355693,1854.464465,
+ 0.000461,0.971536,0.236891,0,-964.850983,1900.552851,
+ -0.095693,0.97159,0.216463,104.493633,-954.559259,1900.552851,
+ -0.760725,0.624311,0.177575,750.933323,-599.953185,1905.43317,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.747441,0.613409,0.255071,746.507157,-603.958357,1900.552851,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.760725,0.624311,0.177575,750.933323,-599.953185,1905.43317,
+ -0.760725,0.624311,0.177575,778.074089,-578.368237,1945.815784,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.760725,0.624311,0.177575,778.074089,-578.368237,1945.815784,
+ -0.765569,0.628286,0.138423,788.482625,-571.822771,1967.393306,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.765569,0.628286,0.138423,788.482625,-571.822771,1967.393306,
+ -0.819909,0.56476,0.093785,812.321046,-542.77557,1967.393306,
+ -0.739034,0.606509,0.293216,673.273867,-664.397292,1840.989037,
+ -0.662575,0.661607,0.3511,668.106075,-668.106075,1835.635445,
+ -0.675745,0.675745,0.294512,668.764074,-668.764074,1838.654942,
+ -0.662575,0.661607,0.3511,668.106075,-668.106075,1835.635445,
+ -0.739034,0.606509,0.293216,673.273867,-664.397292,1840.989037,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.739034,0.606509,0.293216,673.273867,-664.397292,1840.989037,
+ -0.739034,0.606509,0.293216,713.8475,-629.001642,1870.037509,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.739034,0.606509,0.293216,713.8475,-629.001642,1870.037509,
+ -0.747441,0.613409,0.255071,746.507157,-603.958357,1900.552851,
+ -0.766636,0.549472,0.33219,785.609633,-524.927574,1835.635445,
+ -0.747441,0.613409,0.255071,746.507157,-603.958357,1900.552851,
+ -0.799622,0.563457,0.207656,802.244273,-536.042486,1900.552851,
+ -0.675745,0.675745,0.294512,668.764074,-668.764074,1838.654942,
+ -0.662575,0.661607,0.3511,668.106075,-668.106075,1835.635445,
+ -0.594359,0.724228,0.349616,660.420878,-674.413152,1835.635445,
+ -0.819909,0.56476,-0.093785,812.321046,-542.77557,2103.011094,
+ -0.771642,0.633271,-0.059467,795.73322,-565.076313,2080.771204,
+ -0.765569,0.628286,-0.138423,788.48267,-571.822716,2103.011094,
+ -0.771642,0.633271,-0.059467,795.73322,-565.076313,2080.771204,
+ -0.819909,0.56476,-0.093785,812.321046,-542.77557,2103.011094,
+ -0.77301,0.634393,-0,802.928322,-560.588162,2035.202339,
+ -0.77301,0.634393,-0,802.928322,-560.588162,2035.202339,
+ -0.819909,0.56476,-0.093785,812.321046,-542.77557,2103.011094,
+ -0.831469,0.55557,-0,815.696038,-545.030668,2035.2022,
+ -0.771643,0.63327,0.059467,795.733256,-565.076295,1989.63347,
+ -0.819909,0.56476,0.093785,812.321046,-542.77557,1967.393306,
+ -0.765569,0.628286,0.138423,788.482625,-571.822771,1967.393306,
+ -0.819909,0.56476,0.093785,812.321046,-542.77557,1967.393306,
+ -0.771643,0.63327,0.059467,795.733256,-565.076295,1989.63347,
+ -0.77301,0.634393,-0,802.928322,-560.588162,2035.202339,
+ -0.819909,0.56476,0.093785,812.321046,-542.77557,1967.393306,
+ -0.77301,0.634393,-0,802.928322,-560.588162,2035.202339,
+ -0.831469,0.55557,-0,815.696038,-545.030668,2035.2022,
+ 0.014067,0.991704,-0.12777,0,-976.970216,2103.011094,
+ -0.095693,0.97159,-0.216463,104.493598,-954.559262,2169.851549,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.095693,0.97159,-0.216463,104.493598,-954.559262,2169.851549,
+ 0.014067,0.991704,-0.12777,0,-976.970216,2103.011094,
+ 0,0.966617,-0.256224,0,-964.850983,2169.851549,
+ 0,0.966617,-0.256224,0,-964.850983,2169.851549,
+ -0.093709,0.951442,-0.293216,104.49359,-940.355699,2215.939931,
+ -0.095693,0.97159,-0.216463,104.493598,-954.559262,2169.851549,
+ -0.093709,0.951442,-0.293216,104.49359,-940.355699,2215.939931,
+ 0,0.966617,-0.256224,0,-964.850983,2169.851549,
+ -0.014053,0.939213,-0.343046,0,-944.844672,2234.768955,
+ -0.093709,0.951442,-0.293216,104.49359,-940.355699,2215.939931,
+ -0.014053,0.939213,-0.343046,0,-944.844672,2234.768955,
+ -0.15559,0.942942,-0.294368,184.938818,-929.750222,2224.643627,
+ -0.15559,0.942942,-0.294368,184.938818,-929.750222,2224.643627,
+ -0.014053,0.939213,-0.343046,0,-944.844672,2234.768955,
+ -0.183341,0.918213,-0.3511,184.330051,-926.689746,2234.768955,
+ -0.183341,0.918213,-0.3511,184.330051,-926.689746,2234.768955,
+ -0.277526,0.914879,-0.293216,199.064977,-923.935741,2229.415451,
+ -0.15559,0.942942,-0.294368,184.938818,-929.750222,2224.643627,
+ -0.277526,0.914879,-0.293216,199.064977,-923.935741,2229.415451,
+ -0.183341,0.918213,-0.3511,184.330051,-926.689746,2234.768955,
+ -0.269895,0.889723,-0.36817,226.426113,-913.920046,2234.768955,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ -0.269895,0.889723,-0.36817,226.426113,-913.920046,2234.768955,
+ -0.183341,0.918213,-0.3511,184.330051,-926.689746,2234.768955,
+ -0.269895,0.889723,-0.36817,226.426113,-913.920046,2234.768955,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ -0.265441,0.875041,-0.404776,301.780746,-883.553125,2251.000425,
+ -0.265441,0.875041,-0.404776,301.780746,-883.553125,2251.000425,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ -0.321796,0.855234,-0.406229,357.792956,-863.788608,2256.995935,
+ -0.321796,0.855234,-0.406229,357.792956,-863.788608,2256.995935,
+ -0.197225,0.872604,-0.446838,178.944064,-899.612557,2296.83617,
+ -0.353801,0.818498,-0.452643,351.011407,-847.416499,2296.83617,
+ -0.353801,0.818498,-0.452643,351.011407,-847.416499,2296.83617,
+ -0.431053,0.806443,-0.404776,395.941605,-839.735435,2264.292394,
+ -0.321796,0.855234,-0.406229,357.792956,-863.788608,2256.995935,
+ -0.431053,0.806443,-0.404776,395.941605,-839.735435,2264.292394,
+ -0.353801,0.818498,-0.452643,351.011407,-847.416499,2296.83617,
+ -0.431053,0.806443,-0.404776,476.98041,-794.166558,2268.780556,
+ -0.431053,0.806443,-0.404776,476.98041,-794.166558,2268.780556,
+ -0.468784,0.754023,-0.460099,509.589579,-762.654701,2296.83617,
+ -0.532321,0.742706,-0.406229,517.019001,-773.773617,2266.772036,
+ -0.468784,0.754023,-0.460099,509.589579,-762.654701,2296.83617,
+ -0.431053,0.806443,-0.404776,476.98041,-794.166558,2268.780556,
+ -0.353801,0.818498,-0.452643,351.011407,-847.416499,2296.83617,
+ -0.580099,0.706853,-0.404776,612.09289,-704.779988,2251.000501,
+ -0.662575,0.661607,-0.3511,668.106075,-668.106075,2234.768955,
+ -0.594359,0.724228,-0.349616,660.421224,-674.412869,2234.768955,
+ -0.662575,0.661607,-0.3511,668.106075,-668.106075,2234.768955,
+ -0.580099,0.706853,-0.404776,612.09289,-704.779988,2251.000501,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.580099,0.706853,-0.404776,612.09289,-704.779988,2251.000501,
+ -0.580099,0.706853,-0.404776,549.426162,-748.59768,2264.292433,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.580099,0.706853,-0.404776,549.426162,-748.59768,2264.292433,
+ -0.532321,0.742706,-0.406229,517.019001,-773.773617,2266.772036,
+ -0.61303,0.654649,-0.442299,648.584509,-648.584509,2296.83617,
+ -0.532321,0.742706,-0.406229,517.019001,-773.773617,2266.772036,
+ -0.468784,0.754023,-0.460099,509.589579,-762.654701,2296.83617,
+ -0.662575,0.661607,-0.3511,668.106075,-668.106075,2234.768955,
+ -0.739034,0.606509,-0.293216,673.273723,-664.39737,2229.415565,
+ -0.675745,0.675745,-0.294512,668.764043,-668.764043,2231.749598,
+ -0.739034,0.606509,-0.293216,673.273723,-664.39737,2229.415565,
+ -0.662575,0.661607,-0.3511,668.106075,-668.106075,2234.768955,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.739034,0.606509,-0.293216,673.273723,-664.39737,2229.415565,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.739034,0.606509,-0.293216,713.847356,-629.001708,2200.367118,
+ -0.739034,0.606509,-0.293216,713.847356,-629.001708,2200.367118,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.747441,0.613409,-0.255071,746.507278,-603.95821,2169.851549,
+ -0.747441,0.613409,-0.255071,746.507278,-603.95821,2169.851549,
+ -0.766636,0.549472,-0.33219,785.609633,-524.927574,2234.768955,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.662575,0.661607,-0.3511,668.106075,-668.106075,2234.768955,
+ -0.675745,0.675745,-0.294512,668.764043,-668.764043,2231.749598,
+ -0.594359,0.724228,-0.349616,660.421224,-674.412869,2234.768955,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.760725,0.624311,-0.177575,750.933223,-599.953237,2164.971478,
+ -0.747441,0.613409,-0.255071,746.507278,-603.95821,2169.851549,
+ -0.760725,0.624311,-0.177575,750.933223,-599.953237,2164.971478,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.760725,0.624311,-0.177575,778.073998,-578.368273,2124.58888,
+ -0.760725,0.624311,-0.177575,778.073998,-578.368273,2124.58888,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.765569,0.628286,-0.138423,788.48267,-571.822716,2103.011094,
+ -0.765569,0.628286,-0.138423,788.48267,-571.822716,2103.011094,
+ -0.799622,0.563457,-0.207656,802.244273,-536.042486,2169.851549,
+ -0.819909,0.56476,-0.093785,812.321046,-542.77557,2103.011094,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ -0.095693,0.97159,0.216463,104.493633,-954.559259,1900.552851,
+ 0.000461,0.971536,0.236891,0,-964.850983,1900.552851,
+ -0.095693,0.97159,0.216463,104.493633,-954.559259,1900.552851,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ -0.097677,0.991736,0.083183,104.493626,-966.678492,1967.393306,
+ -0,0.803137,-0.595794,104.493586,-599.95327,1905.433085,
+ 0,0.707107,-0.707107,713.8475,-629.001642,1870.037509,
+ 0,0.707107,-0.707107,104.493594,-629.001722,1870.037429,
+ 0,0.707107,-0.707107,713.8475,-629.001642,1870.037509,
+ -0,0.803137,-0.595794,104.493586,-599.95327,1905.433085,
+ -0,0.773011,-0.634393,746.507157,-603.958357,1900.552851,
+ -0,0.773011,-0.634393,746.507157,-603.958357,1900.552851,
+ -0,0.803137,-0.595794,104.493586,-599.95327,1905.433085,
+ -0,0.849252,-0.527988,750.933323,-599.953185,1905.43317,
+ -0,0.910825,-0.412792,104.493578,-578.368325,1945.815695,
+ -0,0.849252,-0.527988,750.933323,-599.953185,1905.43317,
+ -0,0.803137,-0.595794,104.493586,-599.95327,1905.433085,
+ -0,0.849252,-0.527988,750.933323,-599.953185,1905.43317,
+ -0,0.910825,-0.412792,104.493578,-578.368325,1945.815695,
+ -0,0.935939,-0.352162,778.074089,-578.368237,1945.815784,
+ -0,0.582554,0.812792,104.493552,-664.397445,2229.41549,
+ -0,0.683524,0.729928,713.847356,-629.001708,2200.367118,
+ -0,0.741031,0.671471,104.493551,-629.001789,2200.367038,
+ -0,0.683524,0.729928,713.847356,-629.001708,2200.367118,
+ -0,0.582554,0.812792,104.493552,-664.397445,2229.41549,
+ -0,0.505553,0.862796,673.273723,-664.39737,2229.415565,
+ -0,-0.527988,0.849252,104.493586,-923.935753,2229.415438,
+ -0,-0.400805,0.916164,301.780746,-883.553125,2251.000425,
+ -0,-0.352162,0.935939,104.493578,-883.553151,2251.000399,
+ -0,-0.400805,0.916164,301.780746,-883.553125,2251.000425,
+ -0,-0.527988,0.849252,104.493586,-923.935753,2229.415438,
+ -0,-0.55557,0.83147,199.064977,-923.935741,2229.415451,
+ -0,-0.400805,0.916164,301.780746,-883.553125,2251.000425,
+ -0,-0.55557,0.83147,199.064977,-923.935741,2229.415451,
+ -0,-0.471397,0.881921,226.426113,-913.920046,2234.768955,
+ 0,0,-1,476.980677,-794.166464,1801.623942,
+ 0,-0.162803,-0.986659,104.493631,-839.735381,1806.112026,
+ 0,0.032813,-0.999462,104.493625,-794.166513,1801.623893,
+ 0,-0.162803,-0.986659,104.493631,-839.735381,1806.112026,
+ 0,0,-1,476.980677,-794.166464,1801.623942,
+ 0,-0.243095,-0.970002,395.941832,-839.735343,1806.112064,
+ 0,-0.243095,-0.970002,395.941832,-839.735343,1806.112064,
+ 0,-0.352162,-0.935939,104.493635,-883.553065,1819.403965,
+ 0,-0.162803,-0.986659,104.493631,-839.735381,1806.112026,
+ 0,-0.352162,-0.935939,104.493635,-883.553065,1819.403965,
+ 0,-0.243095,-0.970002,395.941832,-839.735343,1806.112064,
+ 0,-0.400804,-0.916164,301.781055,-883.553039,1819.403991,
+ 0,-0.400804,-0.916164,301.781055,-883.553039,1819.403991,
+ 0,-0.243095,-0.970002,395.941832,-839.735343,1806.112064,
+ 0,-0.290284,-0.95694,357.792969,-863.788639,1813.40854,
+ 0,-0.400804,-0.916164,301.781055,-883.553039,1819.403991,
+ 0,-0.527988,-0.849252,104.493637,-923.935675,1840.98891,
+ 0,-0.352162,-0.935939,104.493635,-883.553065,1819.403965,
+ 0,-0.527988,-0.849252,104.493637,-923.935675,1840.98891,
+ 0,-0.400804,-0.916164,301.781055,-883.553039,1819.403991,
+ 0,-0.55557,-0.83147,199.065204,-923.935663,1840.988923,
+ 0,-0.55557,-0.83147,199.065204,-923.935663,1840.988923,
+ 0,-0.400804,-0.916164,301.781055,-883.553039,1819.403991,
+ 0,-0.471397,-0.881921,226.426278,-913.919995,1835.635445,
+ 0,0.707107,-0.707107,713.8475,-629.001642,1870.037509,
+ 0,0.582554,-0.812792,104.493603,-664.397367,1840.988962,
+ 0,0.707107,-0.707107,104.493594,-629.001722,1870.037429,
+ 0,0.582554,-0.812792,104.493603,-664.397367,1840.988962,
+ 0,0.707107,-0.707107,713.8475,-629.001642,1870.037509,
+ 0,0.505553,-0.862796,673.273867,-664.397292,1840.989037,
+ 0,0.505553,-0.862796,673.273867,-664.397292,1840.989037,
+ 0,0.412793,-0.910825,104.493611,-704.779969,1819.404001,
+ 0,0.582554,-0.812792,104.493603,-664.397367,1840.988962,
+ 0,0.412793,-0.910825,104.493611,-704.779969,1819.404001,
+ 0,0.505553,-0.862796,673.273867,-664.397292,1840.989037,
+ 0,0.382684,-0.923879,612.093113,-704.779902,1819.404068,
+ 0,0.382684,-0.923879,612.093113,-704.779902,1819.404068,
+ 0,0.505553,-0.862796,673.273867,-664.397292,1840.989037,
+ 0,0.471397,-0.881921,660.420878,-674.413152,1835.635445,
+ 0,0.471397,-0.881921,660.420878,-674.413152,1835.635445,
+ 0,0.505553,-0.862796,673.273867,-664.397292,1840.989037,
+ 0,0.471397,-0.881921,668.764074,-668.764074,1838.654942,
+ 0,0.382684,-0.923879,612.093113,-704.779902,1819.404068,
+ 0,0.227168,-0.973856,104.493619,-748.597647,1806.112044,
+ 0,0.412793,-0.910825,104.493611,-704.779969,1819.404001,
+ 0,0.227168,-0.973856,104.493619,-748.597647,1806.112044,
+ 0,0.382684,-0.923879,612.093113,-704.779902,1819.404068,
+ 0,0.146613,-0.989194,549.426369,-748.597589,1806.112103,
+ -0,0.227167,0.973856,104.493558,-748.597739,2264.292374,
+ -0,0.382683,0.92388,612.09289,-704.779988,2251.000501,
+ -0,0.412792,0.910825,104.493554,-704.780055,2251.000435,
+ -0,0.382683,0.92388,612.09289,-704.779988,2251.000501,
+ -0,0.227167,0.973856,104.493558,-748.597739,2264.292374,
+ -0,0.146613,0.989194,549.426162,-748.59768,2264.292433,
+ -0,0.741031,0.671471,104.493551,-629.001789,2200.367038,
+ -0,0.812792,0.582554,750.933223,-599.953237,2164.971478,
+ -0,0.849252,0.527988,104.493552,-599.953322,2164.971393,
+ -0,0.812792,0.582554,750.933223,-599.953237,2164.971478,
+ -0,0.741031,0.671471,104.493551,-629.001789,2200.367038,
+ -0,0.77301,0.634393,746.507278,-603.95821,2169.851549,
+ -0,0.77301,0.634393,746.507278,-603.95821,2169.851549,
+ -0,0.741031,0.671471,104.493551,-629.001789,2200.367038,
+ -0,0.683524,0.729928,713.847356,-629.001708,2200.367118,
+ -0,0.849252,0.527988,104.493552,-599.953322,2164.971393,
+ -0,0.910825,0.412793,778.073998,-578.368273,2124.58888,
+ -0,0.941584,0.336778,104.493554,-578.368361,2124.588791,
+ -0,0.910825,0.412793,778.073998,-578.368273,2124.58888,
+ -0,0.849252,0.527988,104.493552,-599.953322,2164.971393,
+ -0,0.812792,0.582554,750.933223,-599.953237,2164.971478,
+ -0,0.941584,0.336778,104.493554,-578.368361,2124.588791,
+ -0,0.973856,0.227168,795.73322,-565.076313,2080.771204,
+ -0,0.986659,0.162803,104.493558,-565.076404,2080.771113,
+ -0,0.973856,0.227168,795.73322,-565.076313,2080.771204,
+ -0,0.941584,0.336778,104.493554,-578.368361,2124.588791,
+ -0,0.95694,0.290285,788.48267,-571.822716,2103.011094,
+ -0,0.95694,0.290285,788.48267,-571.822716,2103.011094,
+ -0,0.941584,0.336778,104.493554,-578.368361,2124.588791,
+ -0,0.910825,0.412793,778.073998,-578.368273,2124.58888,
+ -0,0.986659,0.162803,104.493558,-565.076404,2080.771113,
+ -0,0.999462,0.032813,802.928322,-560.588162,2035.202339,
+ -0,0.999462,-0.032813,104.493564,-560.588253,2035.202247,
+ -0,0.999462,0.032813,802.928322,-560.588162,2035.202339,
+ -0,0.986659,0.162803,104.493558,-565.076404,2080.771113,
+ -0,0.973856,0.227168,795.73322,-565.076313,2080.771204,
+ -0,0.999462,-0.032813,104.493564,-560.588253,2035.202247,
+ -0,0.986659,-0.162803,795.733256,-565.076295,1989.63347,
+ -0,0.970002,-0.243095,104.49357,-565.076386,1989.633379,
+ -0,0.986659,-0.162803,795.733256,-565.076295,1989.63347,
+ -0,0.999462,-0.032813,104.493564,-560.588253,2035.202247,
+ -0,0.999462,0.032813,802.928322,-560.588162,2035.202339,
+ -0,0.970002,-0.243095,104.49357,-565.076386,1989.633379,
+ -0,0.935939,-0.352162,778.074089,-578.368237,1945.815784,
+ -0,0.910825,-0.412792,104.493578,-578.368325,1945.815695,
+ -0,0.935939,-0.352162,778.074089,-578.368237,1945.815784,
+ -0,0.970002,-0.243095,104.49357,-565.076386,1989.633379,
+ -0,0.95694,-0.290284,788.482625,-571.822771,1967.393306,
+ -0,0.95694,-0.290284,788.482625,-571.822771,1967.393306,
+ -0,0.970002,-0.243095,104.49357,-565.076386,1989.633379,
+ -0,0.986659,-0.162803,795.733256,-565.076295,1989.63347,
+ -0,-0.162803,0.986659,104.49357,-839.735473,2264.292356,
+ -0,-0,1,476.98041,-794.166558,2268.780556,
+ -0,0.032813,0.999462,104.493564,-794.166607,2268.780507,
+ -0,-0,1,476.98041,-794.166558,2268.780556,
+ -0,-0.162803,0.986659,104.49357,-839.735473,2264.292356,
+ -0,-0.243095,0.970002,395.941605,-839.735435,2264.292394,
+ -0,0.032813,0.999462,104.493564,-794.166607,2268.780507,
+ -0,0.146613,0.989194,549.426162,-748.59768,2264.292433,
+ -0,0.227167,0.973856,104.493558,-748.597739,2264.292374,
+ -0,0.146613,0.989194,549.426162,-748.59768,2264.292433,
+ -0,0.032813,0.999462,104.493564,-794.166607,2268.780507,
+ -0,-0,1,476.98041,-794.166558,2268.780556,
+ -0,0.146613,0.989194,549.426162,-748.59768,2264.292433,
+ -0,-0,1,476.98041,-794.166558,2268.780556,
+ -0,0.098017,0.995185,517.019001,-773.773617,2266.772036,
+ -0,-0.634393,0.77301,104.49359,-940.355699,2215.939931,
+ -0,-0.55557,0.83147,199.064977,-923.935741,2229.415451,
+ -0,-0.527988,0.849252,104.493586,-923.935753,2229.415438,
+ -0,-0.55557,0.83147,199.064977,-923.935741,2229.415451,
+ -0,-0.634393,0.77301,104.49359,-940.355699,2215.939931,
+ -0,-0.634393,0.77301,184.938818,-929.750222,2224.643627,
+ -1,-0,-0,104.493608,-966.678494,2103.011094,
+ -1,-0,-0,104.493626,-966.678492,1967.393306,
+ -1,-0,-0,104.493618,-970.737561,2035.2022,
+ -1,-0,-0,104.493626,-966.678492,1967.393306,
+ -1,-0,-0,104.493608,-966.678494,2103.011094,
+ -1,-0,-0,104.493598,-954.559262,2169.851549,
+ -1,-0,-0,104.493626,-966.678492,1967.393306,
+ -1,-0,-0,104.493598,-954.559262,2169.851549,
+ -1,-0,-0,104.493633,-954.559259,1900.552851,
+ -1,-0,-0,104.493633,-954.559259,1900.552851,
+ -1,-0,-0,104.493598,-954.559262,2169.851549,
+ -1,-0,-0,104.49359,-940.355699,2215.939931,
+ -1,-0,-0,104.493633,-954.559259,1900.552851,
+ -1,-0,-0,104.49359,-940.355699,2215.939931,
+ -1,-0,-0,104.493637,-940.355693,1854.464465,
+ -1,-0,-0,104.493637,-940.355693,1854.464465,
+ -1,-0,-0,104.49359,-940.355699,2215.939931,
+ -1,-0,-0,104.493586,-923.935753,2229.415438,
+ -1,-0,-0,104.493637,-940.355693,1854.464465,
+ -1,-0,-0,104.493586,-923.935753,2229.415438,
+ -1,-0,-0,104.493637,-923.935675,1840.98891,
+ -1,-0,-0,104.493637,-923.935675,1840.98891,
+ -1,-0,-0,104.493586,-923.935753,2229.415438,
+ -1,-0,-0,104.493578,-883.553151,2251.000399,
+ -1,-0,-0,104.493637,-923.935675,1840.98891,
+ -1,-0,-0,104.493578,-883.553151,2251.000399,
+ -1,-0,-0,104.493635,-883.553065,1819.403965,
+ -1,-0,-0,104.493635,-883.553065,1819.403965,
+ -1,-0,-0,104.493578,-883.553151,2251.000399,
+ -1,-0,-0,104.493606,-882.926352,2035.2022,
+ -1,-0,-0,104.493606,-882.926352,2035.2022,
+ -1,-0,-0,104.493578,-883.553151,2251.000399,
+ -1,-0,-0,104.493604,-881.220857,2052.518376,
+ -1,-0,-0,104.493604,-881.220857,2052.518376,
+ -1,-0,-0,104.493578,-883.553151,2251.000399,
+ -1,-0,-0,104.49357,-839.735473,2264.292356,
+ -1,-0,-0,104.493604,-881.220857,2052.518376,
+ -1,-0,-0,104.49357,-839.735473,2264.292356,
+ -1,-0,-0,104.493601,-876.169915,2069.169102,
+ -1,-0,-0,104.493601,-876.169915,2069.169102,
+ -1,-0,-0,104.49357,-839.735473,2264.292356,
+ -1,-0,-0,104.493598,-867.96763,2084.514498,
+ -1,-0,-0,104.493598,-867.96763,2084.514498,
+ -1,-0,-0,104.49357,-839.735473,2264.292356,
+ -1,-0,-0,104.493594,-856.929211,2097.964851,
+ -1,-0,-0,104.493594,-856.929211,2097.964851,
+ -1,-0,-0,104.49357,-839.735473,2264.292356,
+ -1,-0,-0,104.493591,-843.478858,2109.00327,
+ -1,-0,-0,104.493591,-843.478858,2109.00327,
+ -1,-0,-0,104.49357,-839.735473,2264.292356,
+ -1,-0,-0,104.493588,-828.133462,2117.205555,
+ -1,-0,-0,104.493588,-828.133462,2117.205555,
+ -1,-0,-0,104.49357,-839.735473,2264.292356,
+ -1,-0,-0,104.493564,-794.166607,2268.780507,
+ -1,-0,-0,104.493588,-828.133462,2117.205555,
+ -1,-0,-0,104.493564,-794.166607,2268.780507,
+ -1,-0,-0,104.493585,-811.482736,2122.256498,
+ -1,-0,-0,104.493585,-811.482736,2122.256498,
+ -1,-0,-0,104.493564,-794.166607,2268.780507,
+ -1,-0,-0,104.493583,-794.16656,2123.961992,
+ -1,-0,-0,104.493583,-794.16656,2123.961992,
+ -1,-0,-0,104.493564,-794.166607,2268.780507,
+ -1,-0,-0,104.493558,-748.597739,2264.292374,
+ -1,-0,-0,104.493583,-794.16656,2123.961992,
+ -1,-0,-0,104.493558,-748.597739,2264.292374,
+ -1,-0,-0,104.493581,-776.850384,2122.256498,
+ -1,-0,-0,104.493581,-776.850384,2122.256498,
+ -1,-0,-0,104.493558,-748.597739,2264.292374,
+ -1,-0,-0,104.493579,-760.199658,2117.205555,
+ -1,-0,-0,104.493579,-760.199658,2117.205555,
+ -1,-0,-0,104.493558,-748.597739,2264.292374,
+ -1,-0,-0,104.493578,-744.854262,2109.00327,
+ -1,-0,-0,104.493578,-744.854262,2109.00327,
+ -1,-0,-0,104.493558,-748.597739,2264.292374,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493578,-744.854262,2109.00327,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493578,-731.403909,2097.964851,
+ -1,-0,-0,104.493578,-731.403909,2097.964851,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493578,-720.36549,2084.514498,
+ -1,-0,-0,104.493578,-720.36549,2084.514498,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493579,-712.163205,2069.169102,
+ -1,-0,-0,104.493579,-712.163205,2069.169102,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493581,-707.112263,2052.518376,
+ -1,-0,-0,104.493581,-707.112263,2052.518376,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493583,-705.406768,2035.2022,
+ -1,-0,-0,104.493635,-883.553065,1819.403965,
+ -1,-0,-0,104.493608,-881.220857,2017.886024,
+ -1,-0,-0,104.493631,-839.735381,1806.112026,
+ -1,-0,-0,104.493608,-881.220857,2017.886024,
+ -1,-0,-0,104.493635,-883.553065,1819.403965,
+ -1,-0,-0,104.493606,-882.926352,2035.2022,
+ -1,-0,-0,104.493631,-839.735381,1806.112026,
+ -1,-0,-0,104.493608,-881.220857,2017.886024,
+ -1,-0,-0,104.49361,-876.169915,2001.235298,
+ -1,-0,-0,104.493631,-839.735381,1806.112026,
+ -1,-0,-0,104.49361,-876.169915,2001.235298,
+ -1,-0,-0,104.493611,-867.96763,1985.889902,
+ -1,-0,-0,104.493631,-839.735381,1806.112026,
+ -1,-0,-0,104.493611,-867.96763,1985.889902,
+ -1,-0,-0,104.493611,-856.929211,1972.439549,
+ -1,-0,-0,104.493631,-839.735381,1806.112026,
+ -1,-0,-0,104.493611,-856.929211,1972.439549,
+ -1,-0,-0,104.493611,-843.478858,1961.40113,
+ -1,-0,-0,104.493631,-839.735381,1806.112026,
+ -1,-0,-0,104.493611,-843.478858,1961.40113,
+ -1,-0,-0,104.49361,-828.133462,1953.198845,
+ -1,-0,-0,104.493631,-839.735381,1806.112026,
+ -1,-0,-0,104.49361,-828.133462,1953.198845,
+ -1,-0,-0,104.493625,-794.166513,1801.623893,
+ -1,-0,-0,104.493625,-794.166513,1801.623893,
+ -1,-0,-0,104.49361,-828.133462,1953.198845,
+ -1,-0,-0,104.493608,-811.482736,1948.147903,
+ -1,-0,-0,104.493625,-794.166513,1801.623893,
+ -1,-0,-0,104.493608,-811.482736,1948.147903,
+ -1,-0,-0,104.493606,-794.16656,1946.442408,
+ -1,-0,-0,104.493625,-794.166513,1801.623893,
+ -1,-0,-0,104.493606,-794.16656,1946.442408,
+ -1,-0,-0,104.493604,-776.850384,1948.147903,
+ -1,-0,-0,104.493625,-794.166513,1801.623893,
+ -1,-0,-0,104.493604,-776.850384,1948.147903,
+ -1,-0,-0,104.493619,-748.597647,1806.112044,
+ -1,-0,-0,104.493619,-748.597647,1806.112044,
+ -1,-0,-0,104.493604,-776.850384,1948.147903,
+ -1,-0,-0,104.493601,-760.199658,1953.198845,
+ -1,-0,-0,104.493619,-748.597647,1806.112044,
+ -1,-0,-0,104.493601,-760.199658,1953.198845,
+ -1,-0,-0,104.493598,-744.854262,1961.40113,
+ -1,-0,-0,104.493619,-748.597647,1806.112044,
+ -1,-0,-0,104.493598,-744.854262,1961.40113,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493598,-744.854262,1961.40113,
+ -1,-0,-0,104.493594,-731.403909,1972.439549,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493594,-731.403909,1972.439549,
+ -1,-0,-0,104.493591,-720.36549,1985.889902,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493591,-720.36549,1985.889902,
+ -1,-0,-0,104.493588,-712.163205,2001.235298,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493588,-712.163205,2001.235298,
+ -1,-0,-0,104.493585,-707.112263,2017.886024,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493585,-707.112263,2017.886024,
+ -1,-0,-0,104.493583,-705.406768,2035.2022,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493583,-705.406768,2035.2022,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493554,-704.780055,2251.000435,
+ -1,-0,-0,104.493552,-664.397445,2229.41549,
+ -1,-0,-0,104.493611,-704.779969,1819.404001,
+ -1,-0,-0,104.493552,-664.397445,2229.41549,
+ -1,-0,-0,104.493603,-664.397367,1840.988962,
+ -1,-0,-0,104.493603,-664.397367,1840.988962,
+ -1,-0,-0,104.493552,-664.397445,2229.41549,
+ -1,-0,-0,104.493551,-629.001789,2200.367038,
+ -1,-0,-0,104.493603,-664.397367,1840.988962,
+ -1,-0,-0,104.493551,-629.001789,2200.367038,
+ -1,-0,-0,104.493594,-629.001722,1870.037429,
+ -1,-0,-0,104.493594,-629.001722,1870.037429,
+ -1,-0,-0,104.493551,-629.001789,2200.367038,
+ -1,-0,-0,104.493552,-599.953322,2164.971393,
+ -1,-0,-0,104.493594,-629.001722,1870.037429,
+ -1,-0,-0,104.493552,-599.953322,2164.971393,
+ -1,-0,-0,104.493586,-599.95327,1905.433085,
+ -1,-0,-0,104.493586,-599.95327,1905.433085,
+ -1,-0,-0,104.493552,-599.953322,2164.971393,
+ -1,-0,-0,104.493554,-578.368361,2124.588791,
+ -1,-0,-0,104.493586,-599.95327,1905.433085,
+ -1,-0,-0,104.493554,-578.368361,2124.588791,
+ -1,-0,-0,104.493578,-578.368325,1945.815695,
+ -1,-0,-0,104.493578,-578.368325,1945.815695,
+ -1,-0,-0,104.493554,-578.368361,2124.588791,
+ -1,-0,-0,104.493558,-565.076404,2080.771113,
+ -1,-0,-0,104.493578,-578.368325,1945.815695,
+ -1,-0,-0,104.493558,-565.076404,2080.771113,
+ -1,-0,-0,104.49357,-565.076386,1989.633379,
+ -1,-0,-0,104.49357,-565.076386,1989.633379,
+ -1,-0,-0,104.493558,-565.076404,2080.771113,
+ -1,-0,-0,104.493564,-560.588253,2035.202247,
+ 0,-0.55557,-0.83147,199.065204,-923.935663,1840.988923,
+ 0,-0.634393,-0.773011,104.493637,-940.355693,1854.464465,
+ 0,-0.527988,-0.849252,104.493637,-923.935675,1840.98891,
+ 0,-0.634393,-0.773011,104.493637,-940.355693,1854.464465,
+ 0,-0.55557,-0.83147,199.065204,-923.935663,1840.988923,
+ 0,-0.634393,-0.773011,184.93882,-929.750234,1845.760812,
+ -0,-0.352162,0.935939,104.493578,-883.553151,2251.000399,
+ -0,-0.243095,0.970002,395.941605,-839.735435,2264.292394,
+ -0,-0.162803,0.986659,104.49357,-839.735473,2264.292356,
+ -0,-0.243095,0.970002,395.941605,-839.735435,2264.292394,
+ -0,-0.352162,0.935939,104.493578,-883.553151,2251.000399,
+ -0,-0.400805,0.916164,301.780746,-883.553125,2251.000425,
+ -0,-0.243095,0.970002,395.941605,-839.735435,2264.292394,
+ -0,-0.400805,0.916164,301.780746,-883.553125,2251.000425,
+ -0,-0.290285,0.95694,357.792956,-863.788608,2256.995935,
+ -0,0.412792,0.910825,104.493554,-704.780055,2251.000435,
+ -0,0.505553,0.862796,673.273723,-664.39737,2229.415565,
+ -0,0.582554,0.812792,104.493552,-664.397445,2229.41549,
+ -0,0.505553,0.862796,673.273723,-664.39737,2229.415565,
+ -0,0.412792,0.910825,104.493554,-704.780055,2251.000435,
+ -0,0.382683,0.92388,612.09289,-704.779988,2251.000501,
+ -0,0.505553,0.862796,673.273723,-664.39737,2229.415565,
+ -0,0.382683,0.92388,612.09289,-704.779988,2251.000501,
+ -0,0.471397,0.881921,660.421224,-674.412869,2234.768955,
+ -0,0.505553,0.862796,673.273723,-664.39737,2229.415565,
+ -0,0.471397,0.881921,660.421224,-674.412869,2234.768955,
+ -0,0.471397,0.881921,668.764043,-668.764043,2231.749598,
+ 0,0.146613,-0.989194,549.426369,-748.597589,1806.112103,
+ 0,0.032813,-0.999462,104.493625,-794.166513,1801.623893,
+ 0,0.227168,-0.973856,104.493619,-748.597647,1806.112044,
+ 0,0.032813,-0.999462,104.493625,-794.166513,1801.623893,
+ 0,0.146613,-0.989194,549.426369,-748.597589,1806.112103,
+ 0,0,-1,476.980677,-794.166464,1801.623942,
+ 0,0,-1,476.980677,-794.166464,1801.623942,
+ 0,0.146613,-0.989194,549.426369,-748.597589,1806.112103,
+ 0,0.098017,-0.995185,517.019027,-773.773655,1803.632468,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ 0.193925,0.973736,0.119297,-190.597434,-958.198007,1967.393306,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-10.248119,-977.344466,1990.507106,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ 0.097844,0.993424,0.059467,-10.248119,-977.344466,1990.507106,
+ 0.097844,0.993424,0.059467,-1.468161,-978.157452,1989.642356,
+ 0.097844,0.993424,0.059467,-10.248119,-977.344466,1990.507106,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-18.690668,-976.666251,1993.068126,
+ 0.097844,0.993424,0.059467,-18.690668,-976.666251,1993.068126,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-26.471367,-976.14887,1997.226995,
+ 0.097844,0.993424,0.059467,-26.471367,-976.14887,1997.226995,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-33.291206,-975.812207,2002.823893,
+ 0.097844,0.993424,0.059467,-33.291206,-975.812207,2002.823893,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-38.888103,-975.6692,2009.643732,
+ 0.097844,0.993424,0.059467,-38.888103,-975.6692,2009.643732,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-43.046973,-975.725342,2017.42443,
+ 0.097844,0.993424,0.059467,-43.046973,-975.725342,2017.42443,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-45.607992,-975.978478,2025.866979,
+ 0.097844,0.993424,0.059467,-45.607992,-975.978478,2025.866979,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097844,0.993424,0.059467,-46.472742,-976.41888,2034.646937,
+ 0.097844,0.993424,0.059467,-46.472742,-976.41888,2034.646937,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097998,0.994989,-0.019853,-46.418054,-976.457504,2035.2022,
+ -0.032754,0.997678,0.059721,0,-978.310709,1989.786957,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ 0.097844,0.993424,0.059467,-1.468161,-978.157452,1989.642356,
+ -0.097998,0.994989,-0.019853,43.481732,-976.746707,2035.2022,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097998,0.994989,-0.019853,43.481732,-976.746707,2035.2022,
+ -0.097844,0.993424,-0.059467,42.671671,-976.334157,2043.426896,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097844,0.993424,-0.059467,42.671671,-976.334157,2043.426896,
+ -0.097844,0.993424,-0.059467,40.110651,-976.081021,2051.869445,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097844,0.993424,-0.059467,40.110651,-976.081021,2051.869445,
+ -0.097844,0.993424,-0.059467,35.951781,-976.024878,2059.650143,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097844,0.993424,-0.059467,35.951781,-976.024878,2059.650143,
+ -0.097844,0.993424,-0.059467,30.354884,-976.167886,2066.469982,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097844,0.993424,-0.059467,30.354884,-976.167886,2066.469982,
+ -0.097844,0.993424,-0.059467,23.535045,-976.504549,2072.06688,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097844,0.993424,-0.059467,23.535045,-976.504549,2072.06688,
+ -0.097844,0.993424,-0.059467,15.754347,-977.02193,2076.225749,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097844,0.993424,-0.059467,15.754347,-977.02193,2076.225749,
+ -0.097844,0.993424,-0.059467,7.311798,-977.700144,2078.786769,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.097844,0.993424,-0.059467,7.311798,-977.700144,2078.786769,
+ -0.032754,0.997678,-0.059721,0,-978.377185,2079.506918,
+ -0.097775,0.992726,-0.070245,104.493608,-966.678494,2103.011094,
+ -0.032754,0.997678,-0.059721,0,-978.377185,2079.506918,
+ 0.014067,0.991704,-0.12777,0,-976.970216,2103.011094,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097998,0.994989,-0.019853,-46.418054,-976.457504,2035.2022,
+ 0.139589,0.989621,0.034132,-191.389319,-962.179081,2035.2022,
+ 0.097998,0.994989,-0.019853,-46.418054,-976.457504,2035.2022,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-45.607992,-976.044955,2043.426896,
+ 0.097844,0.993424,-0.059467,-45.607992,-976.044955,2043.426896,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-43.046973,-975.791819,2051.869445,
+ 0.097844,0.993424,-0.059467,-43.046973,-975.791819,2051.869445,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-38.888103,-975.735676,2059.650143,
+ 0.097844,0.993424,-0.059467,-38.888103,-975.735676,2059.650143,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-33.291206,-975.878684,2066.469982,
+ 0.097844,0.993424,-0.059467,-33.291206,-975.878684,2066.469982,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-26.471367,-976.215347,2072.06688,
+ 0.097844,0.993424,-0.059467,-26.471367,-976.215347,2072.06688,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-18.690668,-976.732727,2076.225749,
+ 0.097844,0.993424,-0.059467,-18.690668,-976.732727,2076.225749,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-10.248119,-977.410942,2078.786769,
+ 0.097844,0.993424,-0.059467,-10.248119,-977.410942,2078.786769,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ 0.097844,0.993424,-0.059467,-1.468161,-978.223928,2079.651519,
+ 0.097844,0.993424,-0.059467,-1.468161,-978.223928,2079.651519,
+ 0.014067,0.991704,-0.12777,0,-976.970216,2103.011094,
+ -0.032754,0.997678,-0.059721,0,-978.377185,2079.506918,
+ 0.014067,0.991704,-0.12777,0,-976.970216,2103.011094,
+ 0.097844,0.993424,-0.059467,-1.468161,-978.223928,2079.651519,
+ 0.138896,0.986639,-0.085149,-190.597434,-958.198007,2103.011094,
+ -0.032754,0.997678,0.059721,0,-978.310709,1989.786957,
+ -0.097677,0.991736,0.083183,104.493626,-966.678492,1967.393306,
+ 0.024785,0.994227,0.104395,0,-976.970216,1967.393306,
+ -0.097677,0.991736,0.083183,104.493626,-966.678492,1967.393306,
+ -0.032754,0.997678,0.059721,0,-978.310709,1989.786957,
+ -0.097844,0.993424,0.059467,7.311798,-977.633668,1990.507106,
+ -0.097677,0.991736,0.083183,104.493626,-966.678492,1967.393306,
+ -0.097844,0.993424,0.059467,7.311798,-977.633668,1990.507106,
+ -0.097844,0.993424,0.059467,15.754347,-976.955453,1993.068126,
+ -0.097677,0.991736,0.083183,104.493626,-966.678492,1967.393306,
+ -0.097844,0.993424,0.059467,15.754347,-976.955453,1993.068126,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097844,0.993424,0.059467,15.754347,-976.955453,1993.068126,
+ -0.097844,0.993424,0.059467,23.535045,-976.438073,1997.226995,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097844,0.993424,0.059467,23.535045,-976.438073,1997.226995,
+ -0.097844,0.993424,0.059467,30.354884,-976.10141,2002.823893,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097844,0.993424,0.059467,30.354884,-976.10141,2002.823893,
+ -0.097844,0.993424,0.059467,35.951781,-975.958402,2009.643732,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097844,0.993424,0.059467,35.951781,-975.958402,2009.643732,
+ -0.097844,0.993424,0.059467,40.110651,-976.014545,2017.42443,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097844,0.993424,0.059467,40.110651,-976.014545,2017.42443,
+ -0.097844,0.993424,0.059467,42.671671,-976.267681,2025.866979,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097844,0.993424,0.059467,42.671671,-976.267681,2025.866979,
+ -0.097844,0.993424,0.059467,43.536421,-976.708082,2034.646937,
+ -0.097912,0.994118,0.046284,104.493618,-970.737561,2035.2022,
+ -0.097844,0.993424,0.059467,43.536421,-976.708082,2034.646937,
+ -0.097998,0.994989,-0.019853,43.481732,-976.746707,2035.2022
+};
+static const struct gllist robot_body_half_inside_frame = { GL_N3F_V3F, GL_TRIANGLES, 3072, robot_body_half_inside_data, 0 };
+const struct gllist *robot_body_half_inside = &robot_body_half_inside_frame;
+
+static const float robot_body_half_outside_data[] = {
+ -0.000001,0.92388,0.382683,104.49361,-876.169915,2001.235298,
+ -0.000001,0.973856,0.227168,180.675225,-881.220765,2017.886009,
+ -0.000001,0.92388,0.382683,180.675225,-876.169825,2001.235293,
+ -0.000001,0.973856,0.227168,180.675225,-881.220765,2017.886009,
+ -0.000001,0.92388,0.382683,104.49361,-876.169915,2001.235298,
+ -0.000001,0.986659,0.162803,104.493608,-881.220857,2017.886024,
+ 0,-0.707107,0.707107,180.675225,-731.403895,1972.439559,
+ 0,-0.812792,0.582554,104.493591,-720.36549,1985.889902,
+ 0,-0.707107,0.707107,104.493594,-731.403909,1972.439549,
+ 0,-0.812792,0.582554,104.493591,-720.36549,1985.889902,
+ 0,-0.707107,0.707107,180.675225,-731.403895,1972.439559,
+ 0,-0.849252,0.527988,180.675225,-720.365482,1985.889904,
+ -0.000001,0.527988,0.849252,104.493611,-843.478858,1961.40113,
+ -0.000001,0.412792,0.910825,180.675225,-828.133397,1953.198865,
+ -0.000001,0.352162,0.935939,104.49361,-828.133462,1953.198845,
+ -0.000001,0.412792,0.910825,180.675225,-828.133397,1953.198865,
+ -0.000001,0.527988,0.849252,104.493611,-843.478858,1961.40113,
+ -0.000001,0.582554,0.812792,180.675225,-843.478786,1961.401146,
+ -0.873668,-0.191744,0.447144,-778.906876,-154.934211,1614.76108,
+ -0.890977,-0.087754,0.445488,-878.796251,-89.364884,1427.89836,
+ -0.877241,-0.174494,0.447214,-870.542978,-173.161765,1427.89836,
+ -0.890977,-0.087754,0.445488,-878.796251,-89.364884,1427.89836,
+ -0.873668,-0.191744,0.447144,-778.906876,-154.934211,1614.76108,
+ -0.890977,-0.087754,0.445488,-794.166564,0,1614.76108,
+ -0.890977,-0.087754,0.445488,-878.796251,-89.364884,1427.89836,
+ -0.890977,-0.087754,0.445488,-794.166564,0,1614.76108,
+ -0.890977,-0.087754,0.445488,-887.597924,0,1427.89836,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ 0.777333,-0.292484,0.556961,863.20747,-357.552241,2455.64332,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ 0.777333,-0.292484,0.556961,863.20747,-357.552241,2455.64332,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ 0.795831,-0.241413,0.555314,887.227327,-278.369385,2455.64332,
+ 0.795831,-0.241413,0.555314,887.227327,-278.369385,2455.64332,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ 0.795831,-0.241413,0.555314,914.651021,-187.965581,2455.64332,
+ 0.795831,-0.241413,0.555314,914.651021,-187.965581,2455.64332,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ 0.819458,-0.135214,0.556961,916.376162,-182.278552,2455.64332,
+ 0.472298,-0.759676,0.447021,415.261462,-621.482696,1427.89836,
+ 0.369253,-0.814754,0.447021,321.791703,-776.873894,1241.03564,
+ 0.521108,-0.727062,0.447021,467.169144,-699.168033,1241.03564,
+ 0.369253,-0.814754,0.447021,321.791703,-776.873894,1241.03564,
+ 0.472298,-0.759676,0.447021,415.261462,-621.482696,1427.89836,
+ 0.315017,-0.837219,0.447021,286.03707,-690.554573,1427.89836,
+ -0.551707,-0.826255,-0.113678,-470.848959,-704.675266,796.15315,
+ -0.684138,-0.684138,-0.252806,-590.997993,-590.997993,738.078199,
+ -0.532672,-0.798598,-0.280182,-464.344144,-694.940121,738.078199,
+ -0.684138,-0.684138,-0.252806,-590.997993,-590.997993,738.078199,
+ -0.551707,-0.826255,-0.113678,-470.848959,-704.675266,796.15315,
+ -0.704523,-0.704523,-0.085417,-599.277053,-599.277053,796.15315,
+ 0.162803,-0.986659,0,164.047988,-824.724927,2549.07468,
+ 0.032813,-0.999462,0,0,-840.882244,2455.64332,
+ 0.227168,-0.973856,0,164.047988,-824.724927,2455.64332,
+ 0.032813,-0.999462,0,0,-840.882244,2455.64332,
+ 0.162803,-0.986659,0,164.047988,-824.724927,2549.07468,
+ -0.032813,-0.999462,0,0,-840.882244,2549.07468,
+ 0,0,-1,0,-840.882244,2549.07468,
+ 0,0,-1,164.047988,-824.724927,2549.07468,
+ 0,0,-1,126.90366,-828.383324,2549.07468,
+ 0,0,1,0,-840.882244,2549.07468,
+ 0,0,1,126.90366,-828.383324,2549.07468,
+ 0,0,1,42.432775,-836.70298,2549.07468,
+ 0.683524,-0.729928,0,594.593537,-594.593537,2549.07468,
+ 0.582554,-0.812792,0,467.169144,-699.168033,2455.64332,
+ 0.729928,-0.683524,0,594.593537,-594.593537,2455.64332,
+ 0.582554,-0.812792,0,467.169144,-699.168033,2455.64332,
+ 0.683524,-0.729928,0,594.593537,-594.593537,2549.07468,
+ 0.527988,-0.849252,0,467.169144,-699.168033,2549.07468,
+ 0,0,1,467.169144,-699.168033,2549.07468,
+ 0,0,1,594.593537,-594.593537,2549.07468,
+ 0,0,1,578.083233,-608.143192,2549.07468,
+ 0,0,-1,467.169144,-699.168033,2549.07468,
+ 0,0,-1,578.083233,-608.143192,2549.07468,
+ 0,0,-1,512.438727,-662.016247,2549.07468,
+ -0.882512,-0.08692,-0.462187,-814.429823,0,682.822311,
+ -0.796215,-0.15672,-0.584364,-768.954752,-152.95461,631.979457,
+ -0.881651,-0.17413,-0.438601,-798.780783,-158.887376,682.822311,
+ -0.796215,-0.15672,-0.584364,-768.954752,-152.95461,631.979457,
+ -0.882512,-0.08692,-0.462187,-814.429823,0,682.822311,
+ -0.792149,-0.07802,-0.60532,-784.019466,0,631.979457,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ 0.393751,-0.867338,0.304443,399.515588,-964.515951,2258.006804,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.169277,-0.85787,0.485186,194.606371,-978.352295,2361.464898,
+ 0.292484,-0.777333,0.556961,357.552241,-863.20747,2455.64332,
+ 0.169277,-0.85787,0.485186,194.606371,-978.352295,2361.464898,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.169277,-0.85787,0.485186,194.606371,-978.352295,2361.464898,
+ 0.292484,-0.777333,0.556961,357.552241,-863.20747,2455.64332,
+ 0.135214,-0.819458,0.556961,182.278552,-916.376162,2455.64332,
+ 0,0,-1,182.278552,-916.376162,2455.64332,
+ 0,0,-1,357.552241,-863.20747,2455.64332,
+ 0,0,-1,323.520353,-873.53093,2455.64332,
+ 0,0,-1,182.278552,-916.376162,2455.64332,
+ 0,0,-1,323.520353,-873.53093,2455.64332,
+ 0,0,-1,233.2619,-900.910533,2455.64332,
+ 0.881651,-0.17413,-0.438601,798.780783,-158.887376,682.822311,
+ 0.947451,-0.093316,-0.305988,835.797377,0,738.078199,
+ 0.941653,-0.186514,-0.280182,819.737765,-163.055979,738.078199,
+ 0.947451,-0.093316,-0.305988,835.797377,0,738.078199,
+ 0.881651,-0.17413,-0.438601,798.780783,-158.887376,682.822311,
+ 0.882512,-0.08692,-0.462187,814.429823,0,682.822311,
+ -0.057894,0.301631,-0.951665,-723.842933,-790.8427,2109.126834,
+ -0.223394,0.469138,-0.854403,-768.60281,-861.729009,2086.282702,
+ 0.032027,0.211366,-0.976882,-783.644995,-846.504457,2095.122795,
+ -0.223394,0.469138,-0.854403,-768.60281,-861.729009,2086.282702,
+ -0.057894,0.301631,-0.951665,-723.842933,-790.8427,2109.126834,
+ -0.298975,0.546381,-0.782357,-703.270205,-808.916878,2098.19893,
+ -0.925561,-0.183175,0.331336,-1023.924672,-203.671281,2258.006804,
+ -0.976104,-0.096138,0.19488,-1072.403033,0,2148.211628,
+ -0.966926,-0.191862,0.168059,-1051.797109,-209.215453,2148.211628,
+ -0.976104,-0.096138,0.19488,-1072.403033,0,2148.211628,
+ -0.925561,-0.183175,0.331336,-1023.924672,-203.671281,2258.006804,
+ -0.929871,-0.091584,0.356303,-1043.984543,0,2258.006804,
+ 0.176337,-0.98433,0,279.79211,-1038.255787,2035.202177,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.146586,-0.98666,-0.07081,287.457755,-1035.930439,2011.592523,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.176337,-0.98433,0,279.79211,-1038.255787,2035.202177,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.176337,-0.98433,0,279.79211,-1038.255787,2035.202177,
+ 0.117205,-0.990162,0.07644,287.45777,-1035.930435,2058.811877,
+ 0,-0.582554,0.812792,806.222013,-670.885845,1850.699619,
+ 0,-0.707107,0.707107,180.675225,-637.259985,1878.295649,
+ 0,-0.527988,0.849252,180.675225,-670.885845,1850.699619,
+ 0,-0.707107,0.707107,180.675225,-637.259985,1878.295649,
+ 0,-0.582554,0.812792,806.222013,-670.885845,1850.699619,
+ 0,-0.707107,0.707107,843.013698,-637.259985,1878.295649,
+ 0,-0.527988,-0.849252,806.222028,-670.885845,2219.704735,
+ 0,-0.412792,-0.910825,180.675225,-709.249312,2240.210435,
+ 0,-0.582554,-0.812792,180.675225,-670.885845,2219.704735,
+ 0,-0.412792,-0.910825,180.675225,-709.249312,2240.210435,
+ 0,-0.527988,-0.849252,806.222028,-670.885845,2219.704735,
+ 0,-0.336778,-0.941584,767.904956,-709.249312,2240.210435,
+ 0,-0.336778,-0.941584,767.904956,-709.249312,2240.210435,
+ 0,-0.227168,-0.973856,180.675225,-750.8761,2252.837783,
+ 0,-0.412792,-0.910825,180.675225,-709.249312,2240.210435,
+ 0,-0.227168,-0.973856,180.675225,-750.8761,2252.837783,
+ 0,-0.336778,-0.941584,767.904956,-709.249312,2240.210435,
+ 0,-0.19509,-0.980785,724.871896,-750.8761,2252.837783,
+ 0,-0.19509,-0.980785,724.871896,-750.8761,2252.837783,
+ 0,-0.336778,-0.941584,767.904956,-709.249312,2240.210435,
+ 0,-0.290285,-0.95694,739.77113,-739.77113,2249.469127,
+ -0.360223,-0.872041,-0.331336,-399.515588,-964.515951,1812.397596,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.360223,-0.872041,-0.331336,-399.515588,-964.515951,1812.397596,
+ -0.523429,-0.785009,-0.331336,-580.006736,-868.041423,1812.397596,
+ 0.376942,-0.89216,0.24893,-644.282481,-861.55593,2059.381644,
+ 0.314449,-0.823891,0.471514,-740.177565,-890.06034,2085.821102,
+ 0.392379,-0.910791,0.128444,-731.284145,-899.775643,2054.145111,
+ 0.314449,-0.823891,0.471514,-740.177565,-890.06034,2085.821102,
+ 0.376942,-0.89216,0.24893,-644.282481,-861.55593,2059.381644,
+ 0.267392,-0.774255,0.573613,-655.637458,-847.372595,2104.031681,
+ 0.702746,-0.7023,-0.113678,599.277053,-599.277053,796.15315,
+ 0.811513,-0.581637,0.056077,706.098253,-471.799769,855.371869,
+ 0.69246,-0.720397,0.039075,600.487204,-600.487204,855.371869,
+ 0.811513,-0.581637,0.056077,706.098253,-471.799769,855.371869,
+ 0.702746,-0.7023,-0.113678,599.277053,-599.277053,796.15315,
+ 0.826255,-0.551707,-0.113678,704.675266,-470.848959,796.15315,
+ 0.472298,-0.759676,0.447021,389.30762,-582.640028,1241.03564,
+ 0.369253,-0.814754,0.447021,303.914386,-733.714234,1054.17292,
+ 0.521108,-0.727062,0.447021,441.215303,-660.325365,1054.17292,
+ 0.369253,-0.814754,0.447021,303.914386,-733.714234,1054.17292,
+ 0.472298,-0.759676,0.447021,389.30762,-582.640028,1241.03564,
+ 0.315017,-0.837219,0.447021,268.159753,-647.394912,1241.03564,
+ 0.819458,-0.135214,-0.556961,916.376162,-182.278552,1614.76108,
+ 0.850126,-0.08373,-0.51988,997.51935,0,1708.939502,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.850126,-0.08373,-0.51988,997.51935,0,1708.939502,
+ 0.819458,-0.135214,-0.556961,916.376162,-182.278552,1614.76108,
+ 0.827636,-0.081515,-0.555314,925.063958,-94.069878,1614.76108,
+ 0.850126,-0.08373,-0.51988,997.51935,0,1708.939502,
+ 0.827636,-0.081515,-0.555314,925.063958,-94.069878,1614.76108,
+ 0.827636,-0.081515,-0.555314,934.329033,0,1614.76108,
+ -0.722676,-0.676733,0.140615,-594.593537,-594.593537,914.026067,
+ -0.811513,-0.581637,0.056077,-706.098253,-471.799769,855.371869,
+ -0.691243,-0.718915,0.073102,-600.487204,-600.487204,855.371869,
+ -0.811513,-0.581637,0.056077,-706.098253,-471.799769,855.371869,
+ -0.722676,-0.676733,0.140615,-594.593537,-594.593537,914.026067,
+ -0.840814,-0.522742,0.140615,-699.168033,-467.169144,914.026067,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.925561,-0.183175,-0.331336,1023.924672,-203.671281,1812.397596,
+ 0.872041,-0.360223,-0.331336,964.515951,-399.515588,1812.397596,
+ 0.925561,-0.183175,-0.331336,1023.924672,-203.671281,1812.397596,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.706214,-0.448152,-0.548107,-781.183382,-739.911027,2076.744949,
+ 0.548529,-0.297921,-0.781255,-815.31953,-815.188756,2086.221945,
+ 0.706214,-0.448152,-0.548107,-827.129718,-803.865138,2069.836076,
+ 0.548529,-0.297921,-0.781255,-815.31953,-815.188756,2086.221945,
+ 0.706214,-0.448152,-0.548107,-781.183382,-739.911027,2076.744949,
+ 0.471095,-0.222728,-0.8535,-766.822004,-754.694855,2097.204109,
+ 0.212519,0.031556,-0.976647,-746.579505,-772.239793,2108.608099,
+ 0.032027,0.211366,-0.976882,-783.644995,-846.504457,2095.122795,
+ 0.324878,-0.080164,-0.942352,-800.049726,-830.161694,2095.10146,
+ 0.032027,0.211366,-0.976882,-783.644995,-846.504457,2095.122795,
+ 0.212519,0.031556,-0.976647,-746.579505,-772.239793,2108.608099,
+ -0.057894,0.301631,-0.951665,-723.842933,-790.8427,2109.126834,
+ -0.298975,0.546381,-0.782357,-703.270205,-808.916878,2098.19893,
+ -0.464702,0.719023,-0.516777,-757.213206,-873.517548,2069.927006,
+ -0.223394,0.469138,-0.854403,-768.60281,-861.729009,2086.282702,
+ -0.464702,0.719023,-0.516777,-757.213206,-873.517548,2069.927006,
+ -0.298975,0.546381,-0.782357,-703.270205,-808.916878,2098.19893,
+ -0.450105,0.703799,-0.549611,-688.216174,-823.53445,2077.427173,
+ 0.471095,-0.222728,-0.8535,-766.822004,-754.694855,2097.204109,
+ 0.324878,-0.080164,-0.942352,-800.049726,-830.161694,2095.10146,
+ 0.548529,-0.297921,-0.781255,-815.31953,-815.188756,2086.221945,
+ 0.324878,-0.080164,-0.942352,-800.049726,-830.161694,2095.10146,
+ 0.471095,-0.222728,-0.8535,-766.822004,-754.694855,2097.204109,
+ 0.387184,-0.145107,-0.910512,-761.149822,-761.149822,2100.644855,
+ 0.324878,-0.080164,-0.942352,-800.049726,-830.161694,2095.10146,
+ 0.387184,-0.145107,-0.910512,-761.149822,-761.149822,2100.644855,
+ 0.212519,0.031556,-0.976647,-746.579505,-772.239793,2108.608099,
+ 0.349001,-0.053498,0.935594,-801.544846,-831.814429,1978.709589,
+ 0.49294,-0.19858,0.847098,-766.912924,-754.581509,1973.179733,
+ 0.568521,-0.275822,0.775053,-816.587031,-816.589878,1987.549682,
+ 0.49294,-0.19858,0.847098,-766.912924,-754.581509,1973.179733,
+ 0.349001,-0.053498,0.935594,-801.544846,-831.814429,1978.709589,
+ 0.410493,-0.119341,0.904021,-761.145932,-761.145932,1969.694508,
+ 0.410493,-0.119341,0.904021,-761.145932,-761.145932,1969.694508,
+ 0.349001,-0.053498,0.935594,-801.544846,-831.814429,1978.709589,
+ 0.237519,0.059192,0.969578,-746.546206,-772.245717,1961.599842,
+ -0.183175,-0.925561,-0.331336,-203.671281,-1023.924672,1812.397596,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ -0.183175,-0.925561,-0.331336,-203.671281,-1023.924672,1812.397596,
+ -0.360223,-0.872041,-0.331336,-399.515588,-964.515951,1812.397596,
+ 0.727062,-0.521108,0.447021,699.168033,-467.169144,1241.03564,
+ 0.632456,-0.632456,0.447214,528.527588,-528.527588,1427.89836,
+ 0.632456,-0.632456,0.447214,594.593537,-594.593537,1241.03564,
+ 0.632456,-0.632456,0.447214,528.527588,-528.527588,1427.89836,
+ 0.727062,-0.521108,0.447021,699.168033,-467.169144,1241.03564,
+ 0.759676,-0.472298,0.447021,621.482696,-415.261462,1427.89836,
+ 0.727062,-0.521108,0.447021,738.010701,-493.122985,1427.89836,
+ 0.632456,-0.632456,0.447214,561.560563,-561.560563,1614.76108,
+ 0.632456,-0.632456,0.447214,627.626511,-627.626511,1427.89836,
+ 0.632456,-0.632456,0.447214,561.560563,-561.560563,1614.76108,
+ 0.727062,-0.521108,0.447021,738.010701,-493.122985,1427.89836,
+ 0.759676,-0.472298,0.447021,660.325365,-441.215303,1614.76108,
+ 0.606233,-0.567693,-0.556961,660.670395,-660.670395,1614.76108,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.606593,-0.621557,-0.495693,705.352697,-705.352697,1708.939502,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.606233,-0.567693,-0.556961,660.670395,-660.670395,1614.76108,
+ 0.642867,-0.527587,-0.555314,705.689443,-605.814526,1614.76108,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.642867,-0.527587,-0.555314,705.689443,-605.814526,1614.76108,
+ 0.642867,-0.527587,-0.555314,765.568628,-532.851527,1614.76108,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.642867,-0.527587,-0.555314,765.568628,-532.851527,1614.76108,
+ 0.705336,-0.438515,-0.556961,776.866198,-519.085398,1614.76108,
+ 0.606593,-0.621557,-0.495693,705.352697,-705.352697,1708.939502,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.606593,-0.621557,-0.495693,705.352697,-705.352697,1708.939502,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.916164,-0.400805,0,776.873894,-321.791703,2455.64332,
+ 0.95694,-0.290285,-0,798.491403,-250.528327,2549.07468,
+ 0.92388,-0.382683,0,776.873894,-321.791703,2549.07468,
+ 0.95694,-0.290285,-0,798.491403,-250.528327,2549.07468,
+ 0.916164,-0.400805,0,776.873894,-321.791703,2455.64332,
+ 0.976753,-0.214369,-0,824.724927,-164.047988,2455.64332,
+ 0.95694,-0.290285,-0,798.491403,-250.528327,2549.07468,
+ 0.976753,-0.214369,-0,824.724927,-164.047988,2455.64332,
+ 0.95694,-0.290285,-0,823.172321,-169.166243,2549.07468,
+ 0.95694,-0.290285,-0,823.172321,-169.166243,2549.07468,
+ 0.976753,-0.214369,-0,824.724927,-164.047988,2455.64332,
+ 0.980785,-0.19509,0,824.724927,-164.047988,2549.07468,
+ 0,-0.19509,-0.980785,724.871896,-750.8761,2252.837783,
+ 0,-0.032813,-0.999462,180.675225,-794.166513,2257.101517,
+ 0,-0.227168,-0.973856,180.675225,-750.8761,2252.837783,
+ 0,-0.032813,-0.999462,180.675225,-794.166513,2257.101517,
+ 0,-0.19509,-0.980785,724.871896,-750.8761,2252.837783,
+ -0,0.032813,-0.999462,670.391152,-794.166513,2257.101517,
+ 0,-0.881921,-0.471397,892.684338,-596.472605,2133.803565,
+ 0,-0.92388,-0.382683,180.675225,-589.158255,2120.119378,
+ 0,-0.92388,-0.382683,897.900698,-589.158255,2120.119378,
+ 0,-0.92388,-0.382683,180.675225,-589.158255,2120.119378,
+ 0,-0.881921,-0.471397,892.684338,-596.472605,2133.803565,
+ 0,-0.84225,-0.539087,180.675225,-609.663955,2158.482845,
+ 0,-0.84225,-0.539087,180.675225,-609.663955,2158.482845,
+ 0,-0.881921,-0.471397,892.684338,-596.472605,2133.803565,
+ 0,-0.881921,-0.471397,884.794335,-604.173876,2148.211628,
+ 0,-0.84225,-0.539087,180.675225,-609.663955,2158.482845,
+ 0,-0.881921,-0.471397,884.794335,-604.173876,2148.211628,
+ 0,-0.83147,-0.55557,876.866129,-609.663955,2158.482845,
+ 0,0.352162,0.935939,653.750225,-879.083714,1830.193918,
+ 0,0.227168,0.973856,180.675225,-837.456927,1817.56657,
+ 0,0.412792,0.910825,180.675225,-879.083714,1830.193918,
+ 0,0.227168,0.973856,180.675225,-837.456927,1817.56657,
+ 0,0.352162,0.935939,653.750225,-879.083714,1830.193918,
+ 0,0.162803,0.986659,653.750225,-837.456927,1817.56657,
+ 0.636324,-0.634602,-0.438601,575.888851,-575.888851,682.822311,
+ 0.798598,-0.532672,-0.280182,694.940121,-464.344144,738.078199,
+ 0.679334,-0.678235,-0.280182,590.997993,-590.997993,738.078199,
+ 0.798598,-0.532672,-0.280182,694.940121,-464.344144,738.078199,
+ 0.636324,-0.634602,-0.438601,575.888851,-575.888851,682.822311,
+ 0.747902,-0.498268,-0.438601,677.173649,-452.472967,682.822311,
+ 0.192603,-0.882117,-0.429853,406.150723,-980.534583,1879.384872,
+ 0.184965,-0.925205,-0.331336,203.671281,-1023.924672,1812.397596,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.184965,-0.925205,-0.331336,203.671281,-1023.924672,1812.397596,
+ 0.192603,-0.882117,-0.429853,406.150723,-980.534583,1879.384872,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.192603,-0.882117,-0.429853,406.150723,-980.534583,1879.384872,
+ 0.115001,-0.89802,-0.424659,369.41032,-997.119327,1899.593442,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.115001,-0.89802,-0.424659,369.41032,-997.119327,1899.593442,
+ 0.146136,-0.933668,-0.326969,349.642862,-1009.198921,1922.192772,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.925561,-0.183175,0.331336,-1023.924672,-203.671281,2258.006804,
+ -0.872041,-0.360223,0.331336,-964.515951,-399.515588,2258.006804,
+ -0.925561,-0.183175,0.331336,-1023.924672,-203.671281,2258.006804,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ 0.979923,-0.19486,0.0422,1059.217255,-210.691412,2058.811877,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.923514,-0.382532,0.028131,997.760837,-413.286071,2058.811877,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.979923,-0.19486,0.0422,1059.217255,-210.691412,2058.811877,
+ 0.966926,-0.191862,0.168059,1051.797109,-209.215453,2148.211628,
+ -0.785009,-0.523429,0.331336,-868.041423,-580.006736,2258.006804,
+ -0.910916,-0.376813,0.168059,-990.771213,-410.390874,2148.211628,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.910916,-0.376813,0.168059,-990.771213,-410.390874,2148.211628,
+ -0.785009,-0.523429,0.331336,-868.041423,-580.006736,2258.006804,
+ -0.872041,-0.360223,0.331336,-964.515951,-399.515588,2258.006804,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0.872041,-0.360223,0.331336,-964.515951,-399.515588,2258.006804,
+ -0.785009,-0.523429,0.331336,-868.041423,-580.006736,2258.006804,
+ -0.872041,-0.360223,0.331336,-964.515951,-399.515588,2258.006804,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.705336,-0.438515,0.556961,-776.866198,-519.085398,2455.64332,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.705336,-0.438515,0.556961,-776.866198,-519.085398,2455.64332,
+ -0.733442,-0.392033,0.555314,-813.095616,-451.304926,2455.64332,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.733442,-0.392033,0.555314,-813.095616,-451.304926,2455.64332,
+ -0.733442,-0.392033,0.555314,-857.607798,-368.02849,2455.64332,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.733442,-0.392033,0.555314,-857.607798,-368.02849,2455.64332,
+ -0.777333,-0.292484,0.556961,-863.20747,-357.552241,2455.64332,
+ -0.436098,0.719283,0.540788,-758.060123,-874.453748,2003.996308,
+ -0.505482,0.778826,0.371374,-683.32915,-829.573232,2011.592523,
+ -0.436098,0.719283,0.540788,-687.957453,-823.760435,1993.102587,
+ -0.505482,0.778826,0.371374,-683.32915,-829.573232,2011.592523,
+ -0.436098,0.719283,0.540788,-758.060123,-874.453748,2003.996308,
+ -0.544468,0.817693,0.186902,-751.507545,-880.404128,2025.39393,
+ -0.505482,0.778826,0.371374,-683.32915,-829.573232,2011.592523,
+ -0.544468,0.817693,0.186902,-751.507545,-880.404128,2025.39393,
+ -0.544468,0.817693,0.186902,-680.414811,-831.964968,2020.575089,
+ 0.057027,0.239002,0.969343,-785.140115,-848.157193,1978.730924,
+ 0.237519,0.059192,0.969578,-746.546206,-772.245717,1961.599842,
+ 0.349001,-0.053498,0.935594,-801.544846,-831.814429,1978.709589,
+ 0.237519,0.059192,0.969578,-746.546206,-772.245717,1961.599842,
+ 0.057027,0.239002,0.969343,-785.140115,-848.157193,1978.730924,
+ -0.033544,0.328548,0.943892,-723.636295,-790.983771,1961.015863,
+ -0.464702,0.719023,-0.516777,-757.213206,-873.517548,2069.927006,
+ -0.549387,0.812256,-0.195995,-680.521947,-831.877044,2050.149043,
+ -0.549387,0.812256,-0.195995,-751.210147,-880.075378,2048.545713,
+ -0.549387,0.812256,-0.195995,-680.521947,-831.877044,2050.149043,
+ -0.464702,0.719023,-0.516777,-757.213206,-873.517548,2069.927006,
+ -0.515137,0.768153,-0.38023,-683.397325,-829.517282,2058.811877,
+ -0.515137,0.768153,-0.38023,-683.397325,-829.517282,2058.811877,
+ -0.464702,0.719023,-0.516777,-757.213206,-873.517548,2069.927006,
+ -0.450105,0.703799,-0.549611,-688.216174,-823.53445,2077.427173,
+ 0.568521,-0.275822,0.775053,-816.587031,-816.589878,1987.549682,
+ 0.720221,-0.432668,0.542292,-781.308062,-739.778792,1993.802906,
+ 0.720221,-0.432668,0.542292,-827.976635,-804.801338,2003.905378,
+ 0.720221,-0.432668,0.542292,-781.308062,-739.778792,1993.802906,
+ 0.568521,-0.275822,0.775053,-816.587031,-816.589878,1987.549682,
+ 0.49294,-0.19858,0.847098,-766.912924,-754.581509,1973.179733,
+ -0.532672,-0.798598,-0.280182,-464.344144,-694.940121,738.078199,
+ -0.644016,-0.644016,-0.412901,-575.888851,-575.888851,682.822311,
+ -0.498268,-0.747902,-0.438601,-452.472967,-677.173649,682.822311,
+ -0.644016,-0.644016,-0.412901,-575.888851,-575.888851,682.822311,
+ -0.532672,-0.798598,-0.280182,-464.344144,-694.940121,738.078199,
+ -0.684138,-0.684138,-0.252806,-590.997993,-590.997993,738.078199,
+ 0.468978,-0.782653,-0.409285,577.578281,-864.406983,1802.66502,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.468978,-0.782653,-0.409285,577.578281,-864.406983,1802.66502,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.468978,-0.782653,-0.409285,577.578281,-864.406983,1802.66502,
+ 0.430365,-0.805157,-0.408054,540.896876,-887.575434,1809.693092,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.430365,-0.805157,-0.408054,540.896876,-887.575434,1809.693092,
+ 0.445004,-0.832543,-0.329915,533.995007,-892.635204,1812.397596,
+ -0.770284,-0.632155,-0.083921,-781.354664,-731.718944,1933.517963,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.75819,-0.62223,-0.19488,-761.987077,-753.814953,1922.192772,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.770284,-0.632155,-0.083921,-781.354664,-731.718944,1933.517963,
+ -0.770284,-0.632155,-0.083921,-804.883918,-707.527533,1967.257586,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.770284,-0.632155,-0.083921,-804.883918,-707.527533,1967.257586,
+ -0.772328,-0.633835,-0.041994,-818.480102,-696.846173,2011.592491,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.772328,-0.633835,-0.041994,-818.480102,-696.846173,2011.592491,
+ -0.841785,-0.538757,-0.033753,-897.96103,-599.998378,2011.592523,
+ -0.966926,-0.191862,0.168059,-1051.797109,-209.215453,2148.211628,
+ -0.994307,-0.097931,0.041998,-1079.968548,0,2058.811877,
+ -0.972989,-0.226965,0.042178,-1059.217255,-210.691412,2058.811877,
+ -0.994307,-0.097931,0.041998,-1079.968548,0,2058.811877,
+ -0.966926,-0.191862,0.168059,-1051.797109,-209.215453,2148.211628,
+ -0.976104,-0.096138,0.19488,-1072.403033,0,2148.211628,
+ 0,0,1,-832.543812,-84.66152,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-840.882244,0,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-832.543812,-84.66152,2549.07468,
+ 0,0,1,-824.724927,-164.047988,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-824.724927,-164.047988,2549.07468,
+ 0,0,1,-823.172319,-169.16625,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-823.172319,-169.16625,2549.07468,
+ 0,0,1,-798.491399,-250.528339,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-798.491399,-250.528339,2549.07468,
+ 0,0,1,-776.873894,-321.791703,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-776.873894,-321.791703,2549.07468,
+ 0,0,1,-771.834238,-331.220236,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-771.834238,-331.220236,2549.07468,
+ 0,0,1,-731.773964,-406.167737,2549.07468,
+ 0,0,1,-747.450884,0,2549.07468,
+ 0,0,1,-731.773964,-406.167737,2549.07468,
+ 0,0,1,-733.088824,-145.820434,2549.07468,
+ 0,0,1,-733.088824,-145.820434,2549.07468,
+ 0,0,1,-731.773964,-406.167737,2549.07468,
+ 0,0,1,-690.554573,-286.03707,2549.07468,
+ 0,0,1,-690.554573,-286.03707,2549.07468,
+ 0,0,1,-731.773964,-406.167737,2549.07468,
+ 0,0,1,-699.168033,-467.169144,2549.07468,
+ 0,0,1,-690.554573,-286.03707,2549.07468,
+ 0,0,1,-699.168033,-467.169144,2549.07468,
+ 0,0,1,-689.000369,-479.558478,2549.07468,
+ 0,0,1,-690.554573,-286.03707,2549.07468,
+ 0,0,1,-689.000369,-479.558478,2549.07468,
+ 0,0,1,-621.482696,-415.261462,2549.07468,
+ 0,0,1,-621.482696,-415.261462,2549.07468,
+ 0,0,1,-689.000369,-479.558478,2549.07468,
+ 0,0,1,-635.110018,-545.224061,2549.07468,
+ 0,0,1,-621.482696,-415.261462,2549.07468,
+ 0,0,1,-635.110018,-545.224061,2549.07468,
+ 0,0,1,-594.593537,-594.593537,2549.07468,
+ 0,0,1,-621.482696,-415.261462,2549.07468,
+ 0,0,1,-594.593537,-594.593537,2549.07468,
+ 0,0,1,-528.527588,-528.527588,2549.07468,
+ 0,0,1,-528.527588,-528.527588,2549.07468,
+ 0,0,1,-594.593537,-594.593537,2549.07468,
+ 0,0,1,-578.083211,-608.143211,2549.07468,
+ 0,0,1,-528.527588,-528.527588,2549.07468,
+ 0,0,1,-578.083211,-608.143211,2549.07468,
+ 0,0,1,-512.438676,-662.016288,2549.07468,
+ 0,0,1,-528.527588,-528.527588,2549.07468,
+ 0,0,1,-512.438676,-662.016288,2549.07468,
+ 0,0,1,-415.261462,-621.482696,2549.07468,
+ 0,0,1,-415.261462,-621.482696,2549.07468,
+ 0,0,1,-512.438676,-662.016288,2549.07468,
+ 0,0,1,-467.169144,-699.168033,2549.07468,
+ 0,0,1,-415.261462,-621.482696,2549.07468,
+ 0,0,1,-467.169144,-699.168033,2549.07468,
+ 0,0,1,-443.63534,-711.747113,2549.07468,
+ 0,0,1,-415.261462,-621.482696,2549.07468,
+ 0,0,1,-443.63534,-711.747113,2549.07468,
+ 0,0,1,-368.760189,-751.768716,2549.07468,
+ 0,0,1,-415.261462,-621.482696,2549.07468,
+ 0,0,1,-368.760189,-751.768716,2549.07468,
+ 0,0,1,-286.03707,-690.554573,2549.07468,
+ 0,0,1,-286.03707,-690.554573,2549.07468,
+ 0,0,1,-368.760189,-751.768716,2549.07468,
+ 0,0,1,-321.791703,-776.873894,2549.07468,
+ 0,0,1,-286.03707,-690.554573,2549.07468,
+ 0,0,1,-321.791703,-776.873894,2549.07468,
+ 0,0,1,-291.163467,-786.164868,2549.07468,
+ 0,0,1,-286.03707,-690.554573,2549.07468,
+ 0,0,1,-291.163467,-786.164868,2549.07468,
+ 0,0,1,-209.932195,-810.806105,2549.07468,
+ 0,0,1,-286.03707,-690.554573,2549.07468,
+ 0,0,1,-209.932195,-810.806105,2549.07468,
+ 0,0,1,-145.820434,-733.088824,2549.07468,
+ 0,0,1,-145.820434,-733.088824,2549.07468,
+ 0,0,1,-209.932195,-810.806105,2549.07468,
+ 0,0,1,-164.047988,-824.724927,2549.07468,
+ 0,0,1,-145.820434,-733.088824,2549.07468,
+ 0,0,1,-164.047988,-824.724927,2549.07468,
+ 0,0,1,-126.903621,-828.383328,2549.07468,
+ 0,0,1,-145.820434,-733.088824,2549.07468,
+ 0,0,1,-126.903621,-828.383328,2549.07468,
+ 0,0,1,0,-747.450884,2549.07468,
+ 0,0,1,0,-747.450884,2549.07468,
+ 0,0,1,-126.903621,-828.383328,2549.07468,
+ 0,0,1,-42.432781,-836.702979,2549.07468,
+ 0,0,1,0,-747.450884,2549.07468,
+ 0,0,1,-42.432781,-836.702979,2549.07468,
+ 0,0,1,0,-840.882244,2549.07468,
+ 0,0,1,0,-747.450884,2549.07468,
+ 0,0,1,0,-840.882244,2549.07468,
+ 0,0,1,42.432775,-836.70298,2549.07468,
+ 0,0,1,0,-747.450884,2549.07468,
+ 0,0,1,42.432775,-836.70298,2549.07468,
+ 0,0,1,145.820434,-733.088824,2549.07468,
+ 0,0,1,145.820434,-733.088824,2549.07468,
+ 0,0,1,42.432775,-836.70298,2549.07468,
+ 0,0,1,126.90366,-828.383324,2549.07468,
+ 0,0,1,145.820434,-733.088824,2549.07468,
+ 0,0,1,126.90366,-828.383324,2549.07468,
+ 0,0,1,164.047988,-824.724927,2549.07468,
+ 0,0,1,145.820434,-733.088824,2549.07468,
+ 0,0,1,164.047988,-824.724927,2549.07468,
+ 0,0,1,286.03707,-690.554573,2549.07468,
+ 0,0,1,286.03707,-690.554573,2549.07468,
+ 0,0,1,164.047988,-824.724927,2549.07468,
+ 0,0,1,209.932273,-810.806081,2549.07468,
+ 0,0,1,286.03707,-690.554573,2549.07468,
+ 0,0,1,209.932273,-810.806081,2549.07468,
+ 0,0,1,291.163503,-786.164857,2549.07468,
+ 0,0,1,286.03707,-690.554573,2549.07468,
+ 0,0,1,291.163503,-786.164857,2549.07468,
+ 0,0,1,415.261462,-621.482696,2549.07468,
+ 0,0,1,415.261462,-621.482696,2549.07468,
+ 0,0,1,291.163503,-786.164857,2549.07468,
+ 0,0,1,321.791703,-776.873894,2549.07468,
+ 0,0,1,415.261462,-621.482696,2549.07468,
+ 0,0,1,321.791703,-776.873894,2549.07468,
+ 0,0,1,368.760184,-751.768718,2549.07468,
+ 0,0,1,415.261462,-621.482696,2549.07468,
+ 0,0,1,368.760184,-751.768718,2549.07468,
+ 0,0,1,443.635404,-711.747079,2549.07468,
+ 0,0,1,415.261462,-621.482696,2549.07468,
+ 0,0,1,443.635404,-711.747079,2549.07468,
+ 0,0,1,528.527588,-528.527588,2549.07468,
+ 0,0,1,528.527588,-528.527588,2549.07468,
+ 0,0,1,443.635404,-711.747079,2549.07468,
+ 0,0,1,467.169144,-699.168033,2549.07468,
+ 0,0,1,528.527588,-528.527588,2549.07468,
+ 0,0,1,467.169144,-699.168033,2549.07468,
+ 0,0,1,512.438727,-662.016247,2549.07468,
+ 0,0,1,528.527588,-528.527588,2549.07468,
+ 0,0,1,512.438727,-662.016247,2549.07468,
+ 0,0,1,578.083233,-608.143192,2549.07468,
+ 0,0,1,528.527588,-528.527588,2549.07468,
+ 0,0,1,578.083233,-608.143192,2549.07468,
+ 0,0,1,621.482696,-415.261462,2549.07468,
+ 0,0,1,621.482696,-415.261462,2549.07468,
+ 0,0,1,578.083233,-608.143192,2549.07468,
+ 0,0,1,594.593537,-594.593537,2549.07468,
+ 0,0,1,621.482696,-415.261462,2549.07468,
+ 0,0,1,594.593537,-594.593537,2549.07468,
+ 0,0,1,635.110016,-545.224064,2549.07468,
+ 0,0,1,621.482696,-415.261462,2549.07468,
+ 0,0,1,635.110016,-545.224064,2549.07468,
+ 0,0,1,690.554573,-286.03707,2549.07468,
+ 0,0,1,690.554573,-286.03707,2549.07468,
+ 0,0,1,635.110016,-545.224064,2549.07468,
+ 0,0,1,689.000383,-479.558461,2549.07468,
+ 0,0,1,690.554573,-286.03707,2549.07468,
+ 0,0,1,689.000383,-479.558461,2549.07468,
+ 0,0,1,699.168033,-467.169144,2549.07468,
+ 0,0,1,690.554573,-286.03707,2549.07468,
+ 0,0,1,699.168033,-467.169144,2549.07468,
+ 0,0,1,733.088824,-145.820434,2549.07468,
+ 0,0,1,733.088824,-145.820434,2549.07468,
+ 0,0,1,699.168033,-467.169144,2549.07468,
+ 0,0,1,731.773963,-406.167739,2549.07468,
+ 0,0,1,733.088824,-145.820434,2549.07468,
+ 0,0,1,731.773963,-406.167739,2549.07468,
+ 0,0,1,771.834246,-331.220222,2549.07468,
+ 0,0,1,733.088824,-145.820434,2549.07468,
+ 0,0,1,771.834246,-331.220222,2549.07468,
+ 0,0,1,747.450884,0,2549.07468,
+ 0,0,1,747.450884,0,2549.07468,
+ 0,0,1,771.834246,-331.220222,2549.07468,
+ 0,0,1,840.882244,0,2549.07468,
+ 0,0,1,840.882244,0,2549.07468,
+ 0,0,1,771.834246,-331.220222,2549.07468,
+ 0,0,1,776.873894,-321.791703,2549.07468,
+ 0,0,1,840.882244,0,2549.07468,
+ 0,0,1,776.873894,-321.791703,2549.07468,
+ 0,0,1,798.491403,-250.528327,2549.07468,
+ 0,0,1,840.882244,0,2549.07468,
+ 0,0,1,798.491403,-250.528327,2549.07468,
+ 0,0,1,823.172321,-169.166243,2549.07468,
+ 0,0,1,840.882244,0,2549.07468,
+ 0,0,1,823.172321,-169.166243,2549.07468,
+ 0,0,1,824.724927,-164.047988,2549.07468,
+ 0,0,1,840.882244,0,2549.07468,
+ 0,0,1,824.724927,-164.047988,2549.07468,
+ 0,0,1,832.543812,-84.661515,2549.07468,
+ 0.832671,-0.532692,-0.151323,891.670534,-595.795203,1922.192772,
+ 0.828508,-0.553591,-0.084324,892.684335,-596.472603,1936.600792,
+ 0.75819,-0.62223,-0.19488,884.794356,-604.173851,1922.192772,
+ 0.832671,-0.532692,-0.151323,891.670534,-595.795203,1922.192772,
+ 0.87881,-0.469734,-0.083921,897.900693,-589.158255,1950.284976,
+ 0.828508,-0.553591,-0.084324,892.684335,-596.472603,1936.600792,
+ 0.87881,-0.469734,-0.083921,897.900693,-589.158255,1950.284976,
+ 0.832671,-0.532692,-0.151323,891.670534,-595.795203,1922.192772,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.87881,-0.469734,-0.083921,897.900693,-589.158255,1950.284976,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.87881,-0.469734,-0.083921,908.62526,-576.530907,1991.911763,
+ 0.87881,-0.469734,-0.083921,908.62526,-576.530907,1991.911763,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.880538,-0.470657,-0.055991,911.540742,-574.592523,2011.592523,
+ 0.880538,-0.470657,-0.055991,911.540742,-574.592523,2011.592523,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.91563,-0.400602,-0.033753,997.760837,-413.286071,2011.592523,
+ 0.702746,-0.7023,-0.113678,599.277053,-599.277053,796.15315,
+ 0.533964,-0.797735,-0.280182,464.344144,-694.940121,738.078199,
+ 0.679334,-0.678235,-0.280182,590.997993,-590.997993,738.078199,
+ 0.533964,-0.797735,-0.280182,464.344144,-694.940121,738.078199,
+ 0.702746,-0.7023,-0.113678,599.277053,-599.277053,796.15315,
+ 0.552231,-0.825905,-0.113678,470.848959,-704.675266,796.15315,
+ 0,-0.849252,0.527988,180.675225,-720.365482,1985.889904,
+ 0,-0.92388,0.382683,104.493588,-712.163205,2001.235298,
+ 0,-0.812792,0.582554,104.493591,-720.36549,1985.889902,
+ 0,-0.92388,0.382683,104.493588,-712.163205,2001.235298,
+ 0,-0.849252,0.527988,180.675225,-720.365482,1985.889904,
+ 0,-0.92388,0.382683,180.675225,-712.163201,2001.235293,
+ -0.747902,-0.498268,-0.438601,-677.173649,-452.472967,682.822311,
+ -0.586347,-0.571185,-0.574408,-554.385481,-554.385481,631.979457,
+ -0.644016,-0.644016,-0.412901,-575.888851,-575.888851,682.822311,
+ -0.586347,-0.571185,-0.574408,-554.385481,-554.385481,631.979457,
+ -0.747902,-0.498268,-0.438601,-677.173649,-452.472967,682.822311,
+ -0.692236,-0.442144,-0.570366,-651.888362,-435.577878,631.979457,
+ -0.798598,-0.532672,-0.280182,-694.940121,-464.344144,738.078199,
+ -0.644016,-0.644016,-0.412901,-575.888851,-575.888851,682.822311,
+ -0.684138,-0.684138,-0.252806,-590.997993,-590.997993,738.078199,
+ -0.644016,-0.644016,-0.412901,-575.888851,-575.888851,682.822311,
+ -0.798598,-0.532672,-0.280182,-694.940121,-464.344144,738.078199,
+ -0.747902,-0.498268,-0.438601,-677.173649,-452.472967,682.822311,
+ 0.903939,-0,-0.427662,-43.046973,-1075.728791,2051.869445,
+ 0.849252,-0,-0.527988,-38.888103,-1076.067465,2059.650143,
+ 0.881921,-0,-0.471397,-39.336165,-1076.094273,2058.811877,
+ 0.849252,-0,-0.527988,-38.888103,-1076.067465,2059.650143,
+ 0.903939,-0,-0.427662,-43.046973,-1075.728791,2051.869445,
+ 0.83147,-0,-0.55557,-38.888103,-975.735676,2059.650143,
+ 0.83147,-0,-0.55557,-38.888103,-975.735676,2059.650143,
+ 0.903939,-0,-0.427662,-43.046973,-1075.728791,2051.869445,
+ 0.935939,0,-0.352162,-43.046973,-975.791819,2051.869445,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.770284,-0.632156,0.083915,-780.975409,-732.347203,2135.633781,
+ -0.75819,-0.62223,0.194878,-759.379832,-756.991889,2148.211628,
+ -0.770284,-0.632156,0.083915,-780.975409,-732.347203,2135.633781,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.770287,-0.632154,0.083906,-804.422958,-708.167768,2102.551876,
+ -0.770287,-0.632154,0.083906,-804.422958,-708.167768,2102.551876,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.771796,-0.633401,0.055987,-818.273878,-697.096462,2058.801607,
+ -0.771796,-0.633401,0.055987,-818.273878,-697.096462,2058.801607,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.819881,-0.571538,0.033755,-897.96103,-599.998378,2058.811877,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.523429,-0.785009,-0.331336,-580.006736,-868.041423,1812.397596,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.61434,-0.748575,-0.249443,-712.20051,-793.069744,1912.981477,
+ -0.61434,-0.748575,-0.249443,-712.20051,-793.069744,1912.981477,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.625455,-0.762119,-0.167272,-697.040319,-808.580815,1922.192772,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.61434,-0.748575,-0.249443,-750.03201,-762.726244,1915.0942,
+ -0.684548,-0.684548,-0.250574,-757.858868,-757.858868,1919.763614,
+ -0.61434,-0.748575,-0.249443,-750.03201,-762.726244,1915.0942,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.61434,-0.748575,-0.249443,-712.20051,-793.069744,1912.981477,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.632155,-0.770284,-0.083921,-679.407718,-824.046894,1931.329012,
+ -0.625455,-0.762119,-0.167272,-697.040319,-808.580815,1922.192772,
+ -0.632155,-0.770284,-0.083921,-679.407718,-824.046894,1931.329012,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.632155,-0.770284,-0.083921,-679.407718,-824.046894,1931.329012,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.632155,-0.770284,-0.083921,-654.791104,-848.015122,1965.894902,
+ -0.632155,-0.770284,-0.083921,-654.791104,-848.015122,1965.894902,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.632155,-0.770284,-0.083921,-643.970452,-861.831591,2011.202527,
+ -0.632155,-0.770284,-0.083921,-643.970452,-861.831591,2011.202527,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.634145,-0.772707,-0.027996,-644.00684,-861.844218,2011.592523,
+ 0.700074,-0.700074,0.140689,594.593537,-594.593537,914.026067,
+ 0.554566,-0.830246,0.056107,471.799769,-706.098253,855.371869,
+ 0.69246,-0.720397,0.039075,600.487204,-600.487204,855.371869,
+ 0.554566,-0.830246,0.056107,471.799769,-706.098253,855.371869,
+ 0.700074,-0.700074,0.140689,594.593537,-594.593537,914.026067,
+ 0.522742,-0.840814,0.140615,467.169144,-699.168033,914.026067,
+ 0.349653,-0.487843,0.799845,467.169144,-699.168033,914.026067,
+ 0.410255,-0.438107,0.799845,462.46164,-462.46164,1054.17292,
+ 0.316902,-0.509726,0.799845,363.353779,-543.79736,1054.17292,
+ 0.410255,-0.438107,0.799845,462.46164,-462.46164,1054.17292,
+ 0.349653,-0.487843,0.799845,467.169144,-699.168033,914.026067,
+ 0.438107,-0.410255,0.799845,594.593537,-594.593537,914.026067,
+ 0.632456,-0.632456,0.447214,495.494614,-495.494614,1241.03564,
+ 0.521108,-0.727062,0.447021,441.215303,-660.325365,1054.17292,
+ 0.632456,-0.632456,0.447214,561.560563,-561.560563,1054.17292,
+ 0.521108,-0.727062,0.447021,441.215303,-660.325365,1054.17292,
+ 0.632456,-0.632456,0.447214,495.494614,-495.494614,1241.03564,
+ 0.472298,-0.759676,0.447021,389.30762,-582.640028,1241.03564,
+ 0.632456,-0.632456,0.447214,528.527588,-528.527588,1427.89836,
+ 0.521108,-0.727062,0.447021,467.169144,-699.168033,1241.03564,
+ 0.632456,-0.632456,0.447214,594.593537,-594.593537,1241.03564,
+ 0.521108,-0.727062,0.447021,467.169144,-699.168033,1241.03564,
+ 0.632456,-0.632456,0.447214,528.527588,-528.527588,1427.89836,
+ 0.472298,-0.759676,0.447021,415.261462,-621.482696,1427.89836,
+ -0.819458,-0.135214,0.556961,-916.376162,-182.278552,2455.64332,
+ -0.850126,-0.08373,0.51988,-997.51935,0,2361.464898,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ -0.850126,-0.08373,0.51988,-997.51935,0,2361.464898,
+ -0.819458,-0.135214,0.556961,-916.376162,-182.278552,2455.64332,
+ -0.827636,-0.081515,0.555314,-925.063958,-94.069883,2455.64332,
+ -0.850126,-0.08373,0.51988,-997.51935,0,2361.464898,
+ -0.827636,-0.081515,0.555314,-925.063958,-94.069883,2455.64332,
+ -0.827636,-0.081515,0.555314,-934.329033,0,2455.64332,
+ -0.644814,-0.619901,0.447144,-561.560563,-561.560563,1614.76108,
+ -0.692067,-0.567965,0.445488,-670.393897,-575.514299,1427.89836,
+ -0.632456,-0.632456,0.447214,-627.626511,-627.626511,1427.89836,
+ -0.692067,-0.567965,0.445488,-670.393897,-575.514299,1427.89836,
+ -0.644814,-0.619901,0.447144,-561.560563,-561.560563,1614.76108,
+ -0.692067,-0.567965,0.445488,-727.278191,-506.200587,1427.89836,
+ -0.692067,-0.567965,0.445488,-727.278191,-506.200587,1427.89836,
+ -0.644814,-0.619901,0.447144,-561.560563,-561.560563,1614.76108,
+ -0.743689,-0.496917,0.447214,-660.325365,-441.215303,1614.76108,
+ -0.692067,-0.567965,0.445488,-727.278191,-506.200587,1427.89836,
+ -0.743689,-0.496917,0.447214,-660.325365,-441.215303,1614.76108,
+ -0.743689,-0.496917,0.447214,-738.010701,-493.122985,1427.89836,
+ 0.850126,-0.08373,0.51988,997.51935,0,2361.464898,
+ 0.819458,-0.135214,0.556961,916.376162,-182.278552,2455.64332,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ 0.819458,-0.135214,0.556961,916.376162,-182.278552,2455.64332,
+ 0.850126,-0.08373,0.51988,997.51935,0,2361.464898,
+ 0.827636,-0.081515,0.555314,925.063958,-94.069877,2455.64332,
+ 0.827636,-0.081515,0.555314,925.063958,-94.069877,2455.64332,
+ 0.850126,-0.08373,0.51988,997.51935,0,2361.464898,
+ 0.827636,-0.081515,0.555314,934.329033,0,2455.64332,
+ 0.091725,-0.593783,0.79938,-757.051053,-872.595836,2110.051763,
+ -0.079281,-0.419958,0.904074,-713.051374,-793.031289,2155.442781,
+ -0.164361,-0.334551,0.927934,-779.335772,-850.040945,2123.148196,
+ -0.079281,-0.419958,0.904074,-713.051374,-793.031289,2155.442781,
+ 0.091725,-0.593783,0.79938,-757.051053,-872.595836,2110.051763,
+ 0.005714,-0.4979,0.867215,-700.811797,-805.485643,2148.211628,
+ 0.005714,-0.4979,0.867215,-700.811797,-805.485643,2148.211628,
+ 0.091725,-0.593783,0.79938,-757.051053,-872.595836,2110.051763,
+ 0.113282,-0.616155,0.779436,-680.351355,-823.413171,2137.783955,
+ -0.453201,-0.045611,0.890241,-803.639077,-825.829444,2123.116588,
+ -0.617596,0.111962,0.778485,-780.975409,-732.347203,2135.633781,
+ -0.617596,0.111962,0.778485,-826.261008,-803.647314,2109.961752,
+ -0.617596,0.111962,0.778485,-780.975409,-732.347203,2135.633781,
+ -0.453201,-0.045611,0.890241,-803.639077,-825.829444,2123.116588,
+ -0.49905,0.004957,0.866559,-759.379832,-756.991889,2148.211628,
+ -0.49905,0.004957,0.866559,-759.379832,-756.991889,2148.211628,
+ -0.453201,-0.045611,0.890241,-803.639077,-825.829444,2123.116588,
+ -0.49905,0.004957,0.866559,-758.175253,-758.175253,2148.912113,
+ -0.49905,0.004957,0.866559,-758.175253,-758.175253,2148.912113,
+ -0.453201,-0.045611,0.890241,-803.639077,-825.829444,2123.116588,
+ -0.335138,-0.164419,0.927712,-750.226481,-763.163738,2153.518338,
+ -0.554824,-0.830073,0.056107,-471.799769,-706.098253,855.371869,
+ -0.704523,-0.704523,-0.085417,-599.277053,-599.277053,796.15315,
+ -0.551707,-0.826255,-0.113678,-470.848959,-704.675266,796.15315,
+ -0.704523,-0.704523,-0.085417,-599.277053,-599.277053,796.15315,
+ -0.554824,-0.830073,0.056107,-471.799769,-706.098253,855.371869,
+ -0.691243,-0.718915,0.073102,-600.487204,-600.487204,855.371869,
+ 0.169277,-0.85787,0.485186,194.606371,-978.352295,2361.464898,
+ -0.000913,-0.943512,0.331336,0,-1043.984543,2258.006804,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ -0.000913,-0.943512,0.331336,0,-1043.984543,2258.006804,
+ 0.169277,-0.85787,0.485186,194.606371,-978.352295,2361.464898,
+ -0.001338,-0.87441,0.485186,0,-997.51935,2361.464898,
+ -0.617596,0.111962,0.778485,-780.975409,-732.347203,2135.633781,
+ -0.776009,0.265205,0.572256,-843.757583,-786.871584,2085.686391,
+ -0.617596,0.111962,0.778485,-826.261008,-803.647314,2109.961752,
+ -0.776009,0.265205,0.572256,-843.757583,-786.871584,2085.686391,
+ -0.617596,0.111962,0.778485,-780.975409,-732.347203,2135.633781,
+ -0.825684,0.31192,0.470055,-804.422958,-708.167768,2102.551876,
+ -0.772331,-0.633831,-0.041995,-786.927339,-735.293322,2011.59251,
+ -0.704588,-0.704588,-0.084324,-761.145932,-761.145932,1969.694508,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.704588,-0.704588,-0.084324,-761.145932,-761.145932,1969.694508,
+ -0.772331,-0.633831,-0.041995,-786.927339,-735.293322,2011.59251,
+ -0.770284,-0.632155,-0.083921,-766.912924,-754.581509,1973.179733,
+ -0.770284,-0.632155,-0.083921,-766.912924,-754.581509,1973.179733,
+ -0.772331,-0.633831,-0.041995,-786.927339,-735.293322,2011.59251,
+ -0.770284,-0.632155,-0.083921,-781.308062,-739.778792,1993.802906,
+ -0.511487,-0.733787,0.447144,-441.215303,-660.325365,1614.76108,
+ -0.567965,-0.692067,0.445488,-540.907488,-698.794973,1427.89836,
+ -0.496917,-0.743689,0.447214,-493.122985,-738.010701,1427.89836,
+ -0.567965,-0.692067,0.445488,-540.907488,-698.794973,1427.89836,
+ -0.511487,-0.733787,0.447144,-441.215303,-660.325365,1614.76108,
+ -0.567965,-0.692067,0.445488,-610.198918,-641.928967,1427.89836,
+ -0.567965,-0.692067,0.445488,-610.198918,-641.928967,1427.89836,
+ -0.644814,-0.619901,0.447144,-561.560563,-561.560563,1614.76108,
+ -0.632456,-0.632456,0.447214,-627.626511,-627.626511,1427.89836,
+ -0.644814,-0.619901,0.447144,-561.560563,-561.560563,1614.76108,
+ -0.567965,-0.692067,0.445488,-610.198918,-641.928967,1427.89836,
+ -0.511487,-0.733787,0.447144,-441.215303,-660.325365,1614.76108,
+ -0.376813,-0.910916,-0.168059,-410.390874,-990.771213,1922.192772,
+ -0.523429,-0.785009,-0.331336,-580.006736,-868.041423,1812.397596,
+ -0.360223,-0.872041,-0.331336,-399.515588,-964.515951,1812.397596,
+ -0.523429,-0.785009,-0.331336,-580.006736,-868.041423,1812.397596,
+ -0.376813,-0.910916,-0.168059,-410.390874,-990.771213,1922.192772,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.382289,-0.923079,-0.0422,-413.286071,-997.760837,2011.592523,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.376813,-0.910916,-0.168059,-410.390874,-990.771213,1922.192772,
+ -0.567399,-0.80612,-0.168011,-595.795203,-891.670534,1922.192772,
+ -0.382289,-0.923079,-0.0422,-413.286071,-997.760837,2011.592523,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.376813,-0.910916,-0.168059,-410.390874,-990.771213,1922.192772,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ -0.376813,-0.910916,-0.168059,-410.390874,-990.771213,1922.192772,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.382289,-0.923079,-0.0422,-413.286071,-997.760837,2011.592523,
+ -0.171901,-0.857347,0.485186,-194.606371,-978.352295,2361.464898,
+ -0.36191,-0.871342,0.331336,-399.515588,-964.515951,2258.006804,
+ -0.184965,-0.925205,0.331336,-203.671281,-1023.924672,2258.006804,
+ -0.36191,-0.871342,0.331336,-399.515588,-964.515951,2258.006804,
+ -0.171901,-0.857347,0.485186,-194.606371,-978.352295,2361.464898,
+ -0.335858,-0.807337,0.485186,-381.734129,-921.587711,2361.464898,
+ -0.881921,-0.471397,-0,-731.773964,-406.167737,2549.07468,
+ -0.820367,-0.571838,-0,-699.168033,-467.169144,2455.64332,
+ -0.83147,-0.55557,-0,-699.168033,-467.169144,2549.07468,
+ -0.820367,-0.571838,-0,-699.168033,-467.169144,2455.64332,
+ -0.881921,-0.471397,-0,-731.773964,-406.167737,2549.07468,
+ -0.916164,-0.400805,-0,-776.873894,-321.791703,2455.64332,
+ -0.916164,-0.400805,-0,-776.873894,-321.791703,2455.64332,
+ -0.881921,-0.471397,-0,-731.773964,-406.167737,2549.07468,
+ -0.881921,-0.471397,-0,-771.834238,-331.220236,2549.07468,
+ -0.916164,-0.400805,-0,-776.873894,-321.791703,2455.64332,
+ -0.881921,-0.471397,-0,-771.834238,-331.220236,2549.07468,
+ -0.92388,-0.382683,-0,-776.873894,-321.791703,2549.07468,
+ -0.972323,-0.22681,0.056077,-832.899679,-165.674047,855.371869,
+ -0.918011,-0.379912,-0.113678,-782.993204,-324.326404,796.15315,
+ -0.909392,-0.412143,0.056077,-784.574342,-324.981333,855.371869,
+ -0.918011,-0.379912,-0.113678,-782.993204,-324.326404,796.15315,
+ -0.972323,-0.22681,0.056077,-832.899679,-165.674047,855.371869,
+ -0.974489,-0.193517,-0.113678,-831.221151,-165.340167,796.15315,
+ 0.147851,-0.963743,-0.222127,320.792433,-1019.675597,1941.793256,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.146136,-0.933668,-0.326969,349.642862,-1009.198921,1922.192772,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.147851,-0.963743,-0.222127,320.792433,-1019.675597,1941.793256,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.147851,-0.963743,-0.222127,320.792433,-1019.675597,1941.793256,
+ 0.117291,-0.984202,-0.132626,288.287532,-1033.56568,1987.582722,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.117291,-0.984202,-0.132626,288.287532,-1033.56568,1987.582722,
+ 0.146586,-0.98666,-0.07081,287.457755,-1035.930439,2011.592523,
+ 0.62118,-0.639379,0.453133,705.352697,-705.352697,2361.464898,
+ 0.598874,-0.72973,0.329915,653.750225,-807.521706,2258.006804,
+ 0.665498,-0.684813,0.29689,738.20855,-738.20855,2258.006804,
+ 0.598874,-0.72973,0.329915,653.750225,-807.521706,2258.006804,
+ 0.62118,-0.639379,0.453133,705.352697,-705.352697,2361.464898,
+ 0.579174,-0.705726,0.408054,653.750225,-795.278128,2279.181966,
+ 0.579174,-0.705726,0.408054,600.307509,-841.785968,2274.601344,
+ 0.51982,-0.710547,0.474247,554.192058,-829.407027,2361.464898,
+ 0.481686,-0.774776,0.409514,577.578294,-864.407003,2267.739328,
+ 0.51982,-0.710547,0.474247,554.192058,-829.407027,2361.464898,
+ 0.579174,-0.705726,0.408054,600.307509,-841.785968,2274.601344,
+ 0.579174,-0.705726,0.408054,653.750225,-795.278128,2279.181966,
+ 0.51982,-0.710547,0.474247,554.192058,-829.407027,2361.464898,
+ 0.579174,-0.705726,0.408054,653.750225,-795.278128,2279.181966,
+ 0.62118,-0.639379,0.453133,705.352697,-705.352697,2361.464898,
+ 0.720221,-0.432668,0.542292,-781.308062,-739.778792,1993.802906,
+ 0.803422,-0.523835,0.283037,-833.979694,-798.243508,2025.286671,
+ 0.720221,-0.432668,0.542292,-827.976635,-804.801338,2003.905378,
+ 0.803422,-0.523835,0.283037,-833.979694,-798.243508,2025.286671,
+ 0.720221,-0.432668,0.542292,-781.308062,-739.778792,1993.802906,
+ 0.780247,-0.502047,0.373046,-786.927339,-735.293322,2011.59251,
+ 0.803422,-0.523835,0.283037,-833.979694,-798.243508,2025.286671,
+ 0.780247,-0.502047,0.373046,-786.927339,-735.293322,2011.59251,
+ 0.82593,-0.549829,0.124608,-789.394717,-732.286733,2020.799449,
+ -0.032813,-0,-0.999462,-1.468161,-978.223928,2079.651519,
+ -0.098017,-0,-0.995185,0,-1078.217216,2079.506918,
+ 0.032813,-0,-0.999462,-1.468161,-1078.060378,2079.651519,
+ -0.098017,-0,-0.995185,0,-1078.217216,2079.506918,
+ -0.032813,-0,-0.999462,-1.468161,-978.223928,2079.651519,
+ -0.098017,-0,-0.995185,0,-978.377185,2079.506918,
+ -0.098017,-0,-0.995185,0,-1078.217216,2079.506918,
+ -0.098017,-0,-0.995185,0,-978.377185,2079.506918,
+ -0.162803,-0,-0.986659,7.311798,-977.700144,2078.786769,
+ -0.098017,-0,-0.995185,0,-1078.217216,2079.506918,
+ -0.162803,-0,-0.986659,7.311798,-977.700144,2078.786769,
+ -0.227168,0,-0.973856,7.311798,-1077.55801,2078.786769,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.748575,-0.61434,-0.249443,767.904941,-709.249312,1830.193918,
+ 0.684548,-0.684548,-0.250574,739.771122,-739.771122,1820.935228,
+ 0.748575,-0.61434,-0.249443,767.904941,-709.249312,1830.193918,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.748575,-0.61434,-0.249443,767.904941,-709.249312,1830.193918,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.748575,-0.61434,-0.249443,806.222013,-670.885845,1850.699619,
+ 0.748575,-0.61434,-0.249443,806.222013,-670.885845,1850.699619,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.748575,-0.61434,-0.249443,843.013698,-637.259985,1878.295649,
+ 0.748575,-0.61434,-0.249443,843.013698,-637.259985,1878.295649,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.748575,-0.61434,-0.249443,876.866113,-609.663955,1911.921509,
+ 0.748575,-0.61434,-0.249443,876.866113,-609.663955,1911.921509,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.75819,-0.62223,-0.19488,884.794356,-604.173851,1922.192772,
+ 0.75819,-0.62223,-0.19488,884.794356,-604.173851,1922.192772,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.832671,-0.532692,-0.151323,891.670534,-595.795203,1922.192772,
+ -0.592199,-0.097715,0.799845,-824.724927,-164.047988,914.026067,
+ -0.598955,-0.058992,0.798607,-654.019524,0,1054.17292,
+ -0.598955,-0.058992,0.798607,-840.882244,0,914.026067,
+ -0.598955,-0.058992,0.798607,-654.019524,0,1054.17292,
+ -0.592199,-0.097715,0.799845,-824.724927,-164.047988,914.026067,
+ -0.584514,-0.136347,0.799845,-641.452722,-127.592879,1054.17292,
+ -0.976104,-0.096138,-0.19488,-1072.403033,0,1922.192772,
+ -0.925561,-0.183175,-0.331336,-1023.924672,-203.671281,1812.397596,
+ -0.966926,-0.191862,-0.168059,-1051.797109,-209.215453,1922.192772,
+ -0.925561,-0.183175,-0.331336,-1023.924672,-203.671281,1812.397596,
+ -0.976104,-0.096138,-0.19488,-1072.403033,0,1922.192772,
+ -0.929871,-0.091584,-0.356303,-1043.984543,0,1812.397596,
+ -0.976856,-0.161185,0.140615,-824.724927,-164.047988,914.026067,
+ -0.993632,-0.097864,0.055838,-849.217148,0,855.371869,
+ -0.972323,-0.22681,0.056077,-832.899679,-165.674047,855.371869,
+ -0.993632,-0.097864,0.055838,-849.217148,0,855.371869,
+ -0.976856,-0.161185,0.140615,-824.724927,-164.047988,914.026067,
+ -0.98538,-0.097051,0.140025,-840.882244,0,914.026067,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ -0.000463,-0.985777,0.168059,0,-1072.403033,2148.211628,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ -0.000463,-0.985777,0.168059,0,-1072.403033,2148.211628,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ -0.000913,-0.943512,0.331336,0,-1043.984543,2258.006804,
+ 0.352162,-0.935939,0,321.791703,-776.873894,2549.07468,
+ 0.227168,-0.973856,0,164.047988,-824.724927,2455.64332,
+ 0.412792,-0.910825,0,321.791703,-776.873894,2455.64332,
+ 0.227168,-0.973856,0,164.047988,-824.724927,2455.64332,
+ 0.352162,-0.935939,0,321.791703,-776.873894,2549.07468,
+ 0.162803,-0.986659,0,164.047988,-824.724927,2549.07468,
+ 0,0,1,164.047988,-824.724927,2549.07468,
+ 0,0,1,321.791703,-776.873894,2549.07468,
+ 0,0,1,291.163503,-786.164857,2549.07468,
+ 0,0,1,164.047988,-824.724927,2549.07468,
+ 0,0,1,291.163503,-786.164857,2549.07468,
+ 0,0,1,209.932273,-810.806081,2549.07468,
+ 0,0.162803,0.986659,653.750225,-837.456927,1817.56657,
+ 0,0.049186,0.99879,180.675225,-794.166513,1813.302837,
+ 0,0.227168,0.973856,180.675225,-837.456927,1817.56657,
+ 0,0.049186,0.99879,180.675225,-794.166513,1813.302837,
+ 0,0.162803,0.986659,653.750225,-837.456927,1817.56657,
+ 0,0.098017,0.995185,653.750225,-808.286776,1814.693561,
+ 0,-0.032813,0.999462,670.391133,-794.166513,1813.302837,
+ 0,0.049186,0.99879,180.675225,-794.166513,1813.302837,
+ 0,0.098017,0.995185,653.750225,-808.286776,1814.693561,
+ 0,-0.812792,0.582554,876.866113,-609.663955,1911.921509,
+ 0,-0.707107,0.707107,180.675225,-637.259985,1878.295649,
+ 0,-0.707107,0.707107,843.013698,-637.259985,1878.295649,
+ 0,-0.707107,0.707107,180.675225,-637.259985,1878.295649,
+ 0,-0.812792,0.582554,876.866113,-609.663955,1911.921509,
+ -0,-0.849252,0.527988,180.675225,-609.663955,1911.921509,
+ -0.438107,-0.410255,0.799845,-594.593537,-594.593537,914.026067,
+ -0.487843,-0.349653,0.799845,-543.79736,-363.353779,1054.17292,
+ -0.509726,-0.316902,0.799845,-699.168033,-467.169144,914.026067,
+ -0.487843,-0.349653,0.799845,-543.79736,-363.353779,1054.17292,
+ -0.438107,-0.410255,0.799845,-594.593537,-594.593537,914.026067,
+ -0.410255,-0.438107,0.799845,-462.46164,-462.46164,1054.17292,
+ 0.19509,-0,-0.980785,-10.248119,-977.410942,2078.786769,
+ 0.382683,-0,-0.92388,-18.690668,-1076.654017,2076.225749,
+ 0.382683,0,-0.92388,-18.690668,-976.732727,2076.225749,
+ 0.382683,-0,-0.92388,-18.690668,-1076.654017,2076.225749,
+ 0.19509,-0,-0.980785,-10.248119,-977.410942,2078.786769,
+ 0.19509,-0,-0.980785,-10.248119,-1077.268807,2078.786769,
+ 0,-0.973856,-0.227168,908.625264,-576.530907,2078.49259,
+ 0,-0.92388,-0.382683,180.675225,-589.158255,2120.119378,
+ 0,-0.989194,-0.146613,180.675225,-576.530907,2078.49259,
+ 0,-0.92388,-0.382683,180.675225,-589.158255,2120.119378,
+ 0,-0.973856,-0.227168,908.625264,-576.530907,2078.49259,
+ 0,-0.92388,-0.382683,897.900698,-589.158255,2120.119378,
+ 0.679334,-0.678235,-0.280182,590.997993,-590.997993,738.078199,
+ 0.826255,-0.551707,-0.113678,704.675266,-470.848959,796.15315,
+ 0.702746,-0.7023,-0.113678,599.277053,-599.277053,796.15315,
+ 0.826255,-0.551707,-0.113678,704.675266,-470.848959,796.15315,
+ 0.679334,-0.678235,-0.280182,590.997993,-590.997993,738.078199,
+ 0.798598,-0.532672,-0.280182,694.940121,-464.344144,738.078199,
+ -0.882589,-0.145631,0.447021,-733.088824,-145.820434,1427.89836,
+ -0.890977,-0.087754,0.445488,-840.882244,0,1241.03564,
+ -0.871137,-0.203207,0.447021,-824.724927,-164.047988,1241.03564,
+ -0.890977,-0.087754,0.445488,-840.882244,0,1241.03564,
+ -0.882589,-0.145631,0.447021,-733.088824,-145.820434,1427.89836,
+ -0.890977,-0.087754,0.445488,-747.450884,0,1427.89836,
+ 0,-0.973856,0.227168,908.62526,-576.530907,1991.911763,
+ 0,-0.916164,0.400805,180.675225,-589.158255,1950.284976,
+ 0,-0.92388,0.382683,897.900693,-589.158255,1950.284976,
+ 0,-0.916164,0.400805,180.675225,-589.158255,1950.284976,
+ 0,-0.973856,0.227168,908.62526,-576.530907,1991.911763,
+ -0,-0.986659,0.162803,180.675225,-576.530907,1991.911763,
+ -0.349653,-0.487843,0.799845,-467.169144,-699.168033,914.026067,
+ -0.410255,-0.438107,0.799845,-462.46164,-462.46164,1054.17292,
+ -0.438107,-0.410255,0.799845,-594.593537,-594.593537,914.026067,
+ -0.410255,-0.438107,0.799845,-462.46164,-462.46164,1054.17292,
+ -0.349653,-0.487843,0.799845,-467.169144,-699.168033,914.026067,
+ -0.316902,-0.509726,0.799845,-363.353779,-543.79736,1054.17292,
+ 0,-0.999462,0.032813,180.675225,-705.406768,2035.202177,
+ 0,-0.986659,0.162803,104.493585,-707.112263,2017.886024,
+ 0,-0.973856,0.227168,180.675225,-707.112262,2017.886009,
+ 0,-0.986659,0.162803,104.493585,-707.112263,2017.886024,
+ 0,-0.999462,0.032813,180.675225,-705.406768,2035.202177,
+ -0,-0.999462,-0.032813,104.493583,-705.406768,2035.2022,
+ -0.637426,0.090042,-0.765232,-781.354664,-731.718944,1933.517963,
+ -0.475897,-0.070701,-0.876654,-805.854069,-828.277941,1950.684188,
+ -0.637426,0.090042,-0.765232,-828.138788,-805.72305,1963.780621,
+ -0.475897,-0.070701,-0.876654,-805.854069,-828.277941,1950.684188,
+ -0.637426,0.090042,-0.765232,-781.354664,-731.718944,1933.517963,
+ -0.521142,-0.019464,-0.853248,-761.987077,-753.814953,1922.192772,
+ -0.475897,-0.070701,-0.876654,-805.854069,-828.277941,1950.684188,
+ -0.521142,-0.019464,-0.853248,-761.987077,-753.814953,1922.192772,
+ -0.521142,-0.019464,-0.853248,-757.858868,-757.858868,1919.763614,
+ -0.475897,-0.070701,-0.876654,-805.854069,-828.277941,1950.684188,
+ -0.521142,-0.019464,-0.853248,-757.858868,-757.858868,1919.763614,
+ -0.358793,-0.190568,-0.913757,-750.03201,-762.726244,1915.0942,
+ 0.749001,-0.123588,-0.65094,731.120069,-145.428824,587.016307,
+ 0.792149,-0.07802,-0.60532,784.019466,0,631.979457,
+ 0.787008,-0.166056,-0.594175,768.954752,-152.95461,631.979457,
+ 0.792149,-0.07802,-0.60532,784.019466,0,631.979457,
+ 0.749001,-0.123588,-0.65094,731.120069,-145.428824,587.016307,
+ 0.756844,-0.074543,-0.649331,745.443558,0,587.016307,
+ 1,0,0,180.675225,-1011.80212,1991.911763,
+ 1,0,0,180.675225,-1011.80212,2078.49259,
+ 1,0,0,180.675225,-1016.065853,2035.202177,
+ 1,0,0,180.675225,-1011.80212,2078.49259,
+ 1,0,0,180.675225,-1011.80212,1991.911763,
+ 1,0,0,180.675225,-999.174772,1950.284976,
+ 1,0,0,180.675225,-1011.80212,2078.49259,
+ 1,0,0,180.675225,-999.174772,1950.284976,
+ 1,0,0,180.675225,-999.174772,2120.119378,
+ 1,0,0,180.675225,-999.174772,2120.119378,
+ 1,0,0,180.675225,-999.174772,1950.284976,
+ 1,0,0,180.675225,-978.669071,1911.921509,
+ 1,0,0,180.675225,-999.174772,2120.119378,
+ 1,0,0,180.675225,-978.669071,1911.921509,
+ 1,0,0,180.675225,-978.669071,2158.482845,
+ 1,0,0,180.675225,-978.669071,2158.482845,
+ 1,0,0,180.675225,-978.669071,1911.921509,
+ 1,0,0,180.675225,-951.073041,1878.295649,
+ 1,0,0,180.675225,-978.669071,2158.482845,
+ 1,0,0,180.675225,-951.073041,1878.295649,
+ 1,0,0,180.675225,-951.073041,2192.108705,
+ 1,0,0,180.675225,-951.073041,2192.108705,
+ 1,0,0,180.675225,-951.073041,1878.295649,
+ 1,0,0,180.675225,-917.447181,1850.699619,
+ 1,0,0,180.675225,-951.073041,2192.108705,
+ 1,0,0,180.675225,-917.447181,1850.699619,
+ 1,0,0,180.675225,-917.447181,2219.704735,
+ 1,0,0,180.675225,-917.447181,2219.704735,
+ 1,0,0,180.675225,-917.447181,1850.699619,
+ 1,0,0,180.675225,-879.083714,1830.193918,
+ 1,0,0,180.675225,-917.447181,2219.704735,
+ 1,0,0,180.675225,-879.083714,1830.193918,
+ 1,0,0,180.675225,-882.926259,2035.202177,
+ 1,0,0,180.675225,-882.926259,2035.202177,
+ 1,0,0,180.675225,-879.083714,1830.193918,
+ 1,0,0,180.675225,-881.220765,2017.886009,
+ 1,0,0,180.675225,-881.220765,2017.886009,
+ 1,0,0,180.675225,-879.083714,1830.193918,
+ 1,0,0,180.675225,-876.169825,2001.235293,
+ 1,0,0,180.675225,-876.169825,2001.235293,
+ 1,0,0,180.675225,-879.083714,1830.193918,
+ 1,0,0,180.675225,-837.456927,1817.56657,
+ 1,0,0,180.675225,-876.169825,2001.235293,
+ 1,0,0,180.675225,-837.456927,1817.56657,
+ 1,0,0,180.675225,-867.967544,1985.889904,
+ 1,0,0,180.675225,-867.967544,1985.889904,
+ 1,0,0,180.675225,-837.456927,1817.56657,
+ 1,0,0,180.675225,-856.929131,1972.439559,
+ 1,0,0,180.675225,-856.929131,1972.439559,
+ 1,0,0,180.675225,-837.456927,1817.56657,
+ 1,0,0,180.675225,-843.478786,1961.401146,
+ 1,0,0,180.675225,-843.478786,1961.401146,
+ 1,0,0,180.675225,-837.456927,1817.56657,
+ 1,0,0,180.675225,-828.133397,1953.198865,
+ 1,0,0,180.675225,-828.133397,1953.198865,
+ 1,0,0,180.675225,-837.456927,1817.56657,
+ 1,0,0,180.675225,-794.166513,1813.302837,
+ 1,0,0,180.675225,-828.133397,1953.198865,
+ 1,0,0,180.675225,-794.166513,1813.302837,
+ 1,0,0,180.675225,-811.482681,1948.147925,
+ 1,0,0,180.675225,-811.482681,1948.147925,
+ 1,0,0,180.675225,-794.166513,1813.302837,
+ 1,0,0,180.675225,-794.166513,1946.442431,
+ 1,0,0,180.675225,-794.166513,1946.442431,
+ 1,0,0,180.675225,-794.166513,1813.302837,
+ 1,0,0,180.675225,-750.8761,1817.56657,
+ 1,0,0,180.675225,-794.166513,1946.442431,
+ 1,0,0,180.675225,-750.8761,1817.56657,
+ 1,0,0,180.675225,-776.850346,1948.147925,
+ 1,0,0,180.675225,-776.850346,1948.147925,
+ 1,0,0,180.675225,-750.8761,1817.56657,
+ 1,0,0,180.675225,-760.199629,1953.198865,
+ 1,0,0,180.675225,-760.199629,1953.198865,
+ 1,0,0,180.675225,-750.8761,1817.56657,
+ 1,0,0,180.675225,-744.854241,1961.401146,
+ 1,0,0,180.675225,-744.854241,1961.401146,
+ 1,0,0,180.675225,-750.8761,1817.56657,
+ 1,0,0,180.675225,-709.249312,1830.193918,
+ 1,0,0,180.675225,-744.854241,1961.401146,
+ 1,0,0,180.675225,-709.249312,1830.193918,
+ 1,0,0,180.675225,-731.403895,1972.439559,
+ 1,0,0,180.675225,-731.403895,1972.439559,
+ 1,0,0,180.675225,-709.249312,1830.193918,
+ 1,0,0,180.675225,-720.365482,1985.889904,
+ 1,0,0,180.675225,-720.365482,1985.889904,
+ 1,0,0,180.675225,-709.249312,1830.193918,
+ 1,0,0,180.675225,-712.163201,2001.235293,
+ 1,0,0,180.675225,-712.163201,2001.235293,
+ 1,0,0,180.675225,-709.249312,1830.193918,
+ 1,0,0,180.675225,-707.112262,2017.886009,
+ 1,0,0,180.675225,-707.112262,2017.886009,
+ 1,0,0,180.675225,-709.249312,1830.193918,
+ 1,0,0,180.675225,-670.885845,1850.699619,
+ 1,0,0,180.675225,-707.112262,2017.886009,
+ 1,0,0,180.675225,-670.885845,1850.699619,
+ 1,0,0,180.675225,-705.406768,2035.202177,
+ 1,0,0,180.675225,-882.926259,2035.202177,
+ 1,0,0,180.675225,-879.083714,2240.210435,
+ 1,0,0,180.675225,-917.447181,2219.704735,
+ 1,0,0,180.675225,-879.083714,2240.210435,
+ 1,0,0,180.675225,-882.926259,2035.202177,
+ 1,0,0,180.675225,-881.220765,2052.518344,
+ 1,0,0,180.675225,-879.083714,2240.210435,
+ 1,0,0,180.675225,-881.220765,2052.518344,
+ 1,0,0,180.675225,-876.169825,2069.169061,
+ 1,0,0,180.675225,-879.083714,2240.210435,
+ 1,0,0,180.675225,-876.169825,2069.169061,
+ 1,0,0,180.675225,-837.456927,2252.837783,
+ 1,0,0,180.675225,-837.456927,2252.837783,
+ 1,0,0,180.675225,-876.169825,2069.169061,
+ 1,0,0,180.675225,-867.967544,2084.514449,
+ 1,0,0,180.675225,-837.456927,2252.837783,
+ 1,0,0,180.675225,-867.967544,2084.514449,
+ 1,0,0,180.675225,-856.929131,2097.964794,
+ 1,0,0,180.675225,-837.456927,2252.837783,
+ 1,0,0,180.675225,-856.929131,2097.964794,
+ 1,0,0,180.675225,-843.478786,2109.003208,
+ 1,0,0,180.675225,-837.456927,2252.837783,
+ 1,0,0,180.675225,-843.478786,2109.003208,
+ 1,0,0,180.675225,-828.133397,2117.205489,
+ 1,0,0,180.675225,-837.456927,2252.837783,
+ 1,0,0,180.675225,-828.133397,2117.205489,
+ 1,0,0,180.675225,-794.166513,2257.101517,
+ 1,0,0,180.675225,-794.166513,2257.101517,
+ 1,0,0,180.675225,-828.133397,2117.205489,
+ 1,0,0,180.675225,-811.482681,2122.256428,
+ 1,0,0,180.675225,-794.166513,2257.101517,
+ 1,0,0,180.675225,-811.482681,2122.256428,
+ 1,0,0,180.675225,-794.166513,2123.961922,
+ 1,0,0,180.675225,-794.166513,2257.101517,
+ 1,0,0,180.675225,-794.166513,2123.961922,
+ 1,0,0,180.675225,-776.850346,2122.256428,
+ 1,0,0,180.675225,-794.166513,2257.101517,
+ 1,0,0,180.675225,-776.850346,2122.256428,
+ 1,0,0,180.675225,-750.8761,2252.837783,
+ 1,0,0,180.675225,-750.8761,2252.837783,
+ 1,0,0,180.675225,-776.850346,2122.256428,
+ 1,0,0,180.675225,-760.199629,2117.205489,
+ 1,0,0,180.675225,-750.8761,2252.837783,
+ 1,0,0,180.675225,-760.199629,2117.205489,
+ 1,0,0,180.675225,-744.854241,2109.003208,
+ 1,0,0,180.675225,-750.8761,2252.837783,
+ 1,0,0,180.675225,-744.854241,2109.003208,
+ 1,0,0,180.675225,-709.249312,2240.210435,
+ 1,0,0,180.675225,-709.249312,2240.210435,
+ 1,0,0,180.675225,-744.854241,2109.003208,
+ 1,0,0,180.675225,-731.403895,2097.964794,
+ 1,0,0,180.675225,-709.249312,2240.210435,
+ 1,0,0,180.675225,-731.403895,2097.964794,
+ 1,0,0,180.675225,-720.365482,2084.514449,
+ 1,0,0,180.675225,-709.249312,2240.210435,
+ 1,0,0,180.675225,-720.365482,2084.514449,
+ 1,0,0,180.675225,-712.163201,2069.169061,
+ 1,0,0,180.675225,-709.249312,2240.210435,
+ 1,0,0,180.675225,-712.163201,2069.169061,
+ 1,0,0,180.675225,-707.112262,2052.518344,
+ 1,0,0,180.675225,-709.249312,2240.210435,
+ 1,0,0,180.675225,-707.112262,2052.518344,
+ 1,0,0,180.675225,-670.885845,2219.704735,
+ 1,0,0,180.675225,-670.885845,2219.704735,
+ 1,0,0,180.675225,-707.112262,2052.518344,
+ 1,0,0,180.675225,-705.406768,2035.202177,
+ 1,0,0,180.675225,-670.885845,2219.704735,
+ 1,0,0,180.675225,-705.406768,2035.202177,
+ 1,0,0,180.675225,-670.885845,1850.699619,
+ 1,0,0,180.675225,-670.885845,2219.704735,
+ 1,0,0,180.675225,-670.885845,1850.699619,
+ 1,0,0,180.675225,-637.259985,1878.295649,
+ 1,0,0,180.675225,-670.885845,2219.704735,
+ 1,0,0,180.675225,-637.259985,1878.295649,
+ 1,0,0,180.675225,-637.259985,2192.108705,
+ 1,0,0,180.675225,-637.259985,2192.108705,
+ 1,0,0,180.675225,-637.259985,1878.295649,
+ 1,0,0,180.675225,-609.663955,1911.921509,
+ 1,0,0,180.675225,-637.259985,2192.108705,
+ 1,0,0,180.675225,-609.663955,1911.921509,
+ 1,0,0,180.675225,-609.663955,2158.482845,
+ 1,0,0,180.675225,-609.663955,2158.482845,
+ 1,0,0,180.675225,-609.663955,1911.921509,
+ 1,0,0,180.675225,-589.158255,1950.284976,
+ 1,0,0,180.675225,-609.663955,2158.482845,
+ 1,0,0,180.675225,-589.158255,1950.284976,
+ 1,0,0,180.675225,-589.158255,2120.119378,
+ 1,0,0,180.675225,-589.158255,2120.119378,
+ 1,0,0,180.675225,-589.158255,1950.284976,
+ 1,0,0,180.675225,-576.530907,1991.911763,
+ 1,0,0,180.675225,-589.158255,2120.119378,
+ 1,0,0,180.675225,-576.530907,1991.911763,
+ 1,0,0,180.675225,-576.530907,2078.49259,
+ 1,0,0,180.675225,-576.530907,2078.49259,
+ 1,0,0,180.675225,-576.530907,1991.911763,
+ 1,0,0,180.675225,-572.267173,2035.202177,
+ -0.796215,-0.15672,-0.584364,-768.954752,-152.95461,631.979457,
+ -0.710498,-0.267337,-0.65094,-688.700045,-285.268899,587.016307,
+ -0.750341,-0.309043,-0.584364,-724.339538,-300.03126,631.979457,
+ -0.710498,-0.267337,-0.65094,-688.700045,-285.268899,587.016307,
+ -0.796215,-0.15672,-0.584364,-768.954752,-152.95461,631.979457,
+ -0.749001,-0.123588,-0.65094,-731.120069,-145.428824,587.016307,
+ -0.881651,-0.17413,-0.438601,-798.780783,-158.887376,682.822311,
+ -0.750341,-0.309043,-0.584364,-724.339538,-300.03126,631.979457,
+ -0.830739,-0.342785,-0.438601,-752.435044,-311.6688,682.822311,
+ -0.750341,-0.309043,-0.584364,-724.339538,-300.03126,631.979457,
+ -0.881651,-0.17413,-0.438601,-798.780783,-158.887376,682.822311,
+ -0.796215,-0.15672,-0.584364,-768.954752,-152.95461,631.979457,
+ -0.941653,-0.186514,-0.280182,-819.737765,-163.055979,738.078199,
+ -0.830739,-0.342785,-0.438601,-752.435044,-311.6688,682.822311,
+ -0.887172,-0.366638,-0.280182,-772.17609,-319.845809,738.078199,
+ -0.830739,-0.342785,-0.438601,-752.435044,-311.6688,682.822311,
+ -0.941653,-0.186514,-0.280182,-819.737765,-163.055979,738.078199,
+ -0.881651,-0.17413,-0.438601,-798.780783,-158.887376,682.822311,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.972989,-0.226965,-0.042178,1059.217255,-210.691412,2011.592523,
+ 0.91563,-0.400602,-0.033753,997.760837,-413.286071,2011.592523,
+ 0.972989,-0.226965,-0.042178,1059.217255,-210.691412,2011.592523,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.966926,-0.191862,-0.168059,1051.797109,-209.215453,1922.192772,
+ -0.184965,-0.925205,0.331336,-203.671281,-1023.924672,2258.006804,
+ -0.377668,-0.910562,0.168059,-410.390874,-990.771213,2148.211628,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.377668,-0.910562,0.168059,-410.390874,-990.771213,2148.211628,
+ -0.184965,-0.925205,0.331336,-203.671281,-1023.924672,2258.006804,
+ -0.36191,-0.871342,0.331336,-399.515588,-964.515951,2258.006804,
+ -0.194936,-0.97921,0.056107,-165.674047,-832.899679,855.371869,
+ -0.379912,-0.918011,-0.113678,-324.326404,-782.993204,796.15315,
+ -0.193517,-0.974489,-0.113678,-165.340167,-831.221151,796.15315,
+ -0.379912,-0.918011,-0.113678,-324.326404,-782.993204,796.15315,
+ -0.194936,-0.97921,0.056107,-165.674047,-832.899679,855.371869,
+ -0.382224,-0.922365,0.056107,-324.981333,-784.574342,855.371869,
+ -0.972989,-0.226965,0.042178,-1059.217255,-210.691412,2058.811877,
+ -0.923079,-0.382289,-0.0422,-997.760837,-413.286071,2011.592523,
+ -0.910015,-0.412425,0.042178,-997.760837,-413.286071,2058.811877,
+ -0.923079,-0.382289,-0.0422,-997.760837,-413.286071,2011.592523,
+ -0.972989,-0.226965,0.042178,-1059.217255,-210.691412,2058.811877,
+ -0.979923,-0.19486,-0.0422,-1059.217255,-210.691412,2011.592523,
+ -0.979923,-0.19486,-0.0422,-1059.217255,-210.691412,2011.592523,
+ -0.910916,-0.376813,-0.168059,-990.771213,-410.390874,1922.192772,
+ -0.923079,-0.382289,-0.0422,-997.760837,-413.286071,2011.592523,
+ -0.910916,-0.376813,-0.168059,-990.771213,-410.390874,1922.192772,
+ -0.979923,-0.19486,-0.0422,-1059.217255,-210.691412,2011.592523,
+ -0.966926,-0.191862,-0.168059,-1051.797109,-209.215453,1922.192772,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.929871,-0.091584,-0.356303,1043.984543,0,1812.397596,
+ 0.925561,-0.183175,-0.331336,1023.924672,-203.671281,1812.397596,
+ 0.929871,-0.091584,-0.356303,1043.984543,0,1812.397596,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.850126,-0.08373,-0.51988,997.51935,0,1708.939502,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ -0.360223,-0.872041,-0.331336,-399.515588,-964.515951,1812.397596,
+ -0.183175,-0.925561,-0.331336,-203.671281,-1023.924672,1812.397596,
+ -0.360223,-0.872041,-0.331336,-399.515588,-964.515951,1812.397596,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ -0.376813,-0.910916,-0.168059,-410.390874,-990.771213,1922.192772,
+ 0.925561,-0.183175,0.331336,1023.924672,-203.671281,2258.006804,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ 0.872041,-0.360223,0.331336,964.515951,-399.515588,2258.006804,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ 0.925561,-0.183175,0.331336,1023.924672,-203.671281,2258.006804,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ -0.900096,0.367041,-0.234753,-853.905696,-778.543243,2019.687273,
+ -0.837602,0.298772,-0.457337,-804.883918,-707.527533,1967.257586,
+ -0.790546,0.249135,-0.559436,-845.012276,-788.258547,1988.011282,
+ -0.837602,0.298772,-0.457337,-804.883918,-707.527533,1967.257586,
+ -0.900096,0.367041,-0.234753,-853.905696,-778.543243,2019.687273,
+ -0.915533,0.385671,-0.11427,-818.480102,-696.846173,2011.592491,
+ -0.561756,-0.21137,0.799845,-776.873894,-321.791703,914.026067,
+ -0.584514,-0.136347,0.799845,-641.452722,-127.592879,1054.17292,
+ -0.592199,-0.097715,0.799845,-824.724927,-164.047988,914.026067,
+ -0.584514,-0.136347,0.799845,-641.452722,-127.592879,1054.17292,
+ -0.561756,-0.21137,0.799845,-776.873894,-321.791703,914.026067,
+ -0.546683,-0.247761,0.799845,-604.235252,-250.282436,1054.17292,
+ 0.014463,-0.987633,-0.156114,0,-1072.403033,1922.192772,
+ -0.183175,-0.925561,-0.331336,-203.671281,-1023.924672,1812.397596,
+ 0.000913,-0.943512,-0.331336,0,-1043.984543,1812.397596,
+ -0.183175,-0.925561,-0.331336,-203.671281,-1023.924672,1812.397596,
+ 0.014463,-0.987633,-0.156114,0,-1072.403033,1922.192772,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ 0,-0.903939,-0.427662,653.750225,-1019.675597,1941.793256,
+ 0.115001,-0.89802,-0.424659,369.41032,-997.119327,1899.593442,
+ 0,-0.812792,-0.582554,653.750225,-997.119327,1899.593442,
+ 0.115001,-0.89802,-0.424659,369.41032,-997.119327,1899.593442,
+ 0,-0.903939,-0.427662,653.750225,-1019.675597,1941.793256,
+ 0.146136,-0.933668,-0.326969,349.642862,-1009.198921,1922.192772,
+ 0.146136,-0.933668,-0.326969,349.642862,-1009.198921,1922.192772,
+ 0,-0.903939,-0.427662,653.750225,-1019.675597,1941.793256,
+ 0.147851,-0.963743,-0.222127,320.792433,-1019.675597,1941.793256,
+ 0.972989,-0.226965,-0.042178,1059.217255,-210.691412,2011.592523,
+ 0.923514,-0.382532,0.028131,997.760837,-413.286071,2058.811877,
+ 0.91563,-0.400602,-0.033753,997.760837,-413.286071,2011.592523,
+ 0.923514,-0.382532,0.028131,997.760837,-413.286071,2058.811877,
+ 0.972989,-0.226965,-0.042178,1059.217255,-210.691412,2011.592523,
+ 0.979923,-0.19486,0.0422,1059.217255,-210.691412,2058.811877,
+ -0.985217,-0.097035,-0.141176,-847.505736,0,796.15315,
+ -0.941653,-0.186514,-0.280182,-819.737765,-163.055979,738.078199,
+ -0.974489,-0.193517,-0.113678,-831.221151,-165.340167,796.15315,
+ -0.941653,-0.186514,-0.280182,-819.737765,-163.055979,738.078199,
+ -0.985217,-0.097035,-0.141176,-847.505736,0,796.15315,
+ -0.947451,-0.093316,-0.305988,-835.797377,0,738.078199,
+ 0.135214,-0.819458,0.556961,182.278552,-916.376162,2455.64332,
+ -0.001338,-0.87441,0.485186,0,-997.51935,2361.464898,
+ 0.169277,-0.85787,0.485186,194.606371,-978.352295,2361.464898,
+ -0.001338,-0.87441,0.485186,0,-997.51935,2361.464898,
+ 0.135214,-0.819458,0.556961,182.278552,-916.376162,2455.64332,
+ -0.027252,-0.830091,0.556961,0,-934.329033,2455.64332,
+ 0,0,-1,0,-934.329033,2455.64332,
+ 0,0,-1,182.278552,-916.376162,2455.64332,
+ 0,0,-1,141.006388,-920.441116,2455.64332,
+ 0,0,1,0,-934.329033,2455.64332,
+ 0,0,1,141.006388,-920.441116,2455.64332,
+ 0,0,1,47.148335,-929.685327,2455.64332,
+ -0.849252,-0,-0.527988,35.951781,-1076.356667,2059.650143,
+ -0.903939,-0,-0.427662,40.110651,-1076.017993,2051.869445,
+ -0.881921,-0,-0.471397,36.399844,-1076.383476,2058.811877,
+ -0.903939,-0,-0.427662,40.110651,-1076.017993,2051.869445,
+ -0.849252,-0,-0.527988,35.951781,-1076.356667,2059.650143,
+ -0.83147,0,-0.55557,35.951781,-976.024878,2059.650143,
+ -0.903939,-0,-0.427662,40.110651,-1076.017993,2051.869445,
+ -0.83147,0,-0.55557,35.951781,-976.024878,2059.650143,
+ -0.935939,0,-0.352162,40.110651,-976.081021,2051.869445,
+ 0.19509,-0,-0.980785,-10.248119,-977.410942,2078.786769,
+ 0.032813,-0,-0.999462,-1.468161,-1078.060378,2079.651519,
+ 0.19509,-0,-0.980785,-10.248119,-1077.268807,2078.786769,
+ 0.032813,-0,-0.999462,-1.468161,-1078.060378,2079.651519,
+ 0.19509,-0,-0.980785,-10.248119,-977.410942,2078.786769,
+ -0.032813,-0,-0.999462,-1.468161,-978.223928,2079.651519,
+ 0,-0.881921,0.471397,884.794356,-604.173851,1922.192772,
+ -0,-0.849252,0.527988,180.675225,-609.663955,1911.921509,
+ 0,-0.812792,0.582554,876.866113,-609.663955,1911.921509,
+ -0,-0.849252,0.527988,180.675225,-609.663955,1911.921509,
+ 0,-0.881921,0.471397,884.794356,-604.173851,1922.192772,
+ 0,-0.916164,0.400805,180.675225,-589.158255,1950.284976,
+ 0,-0.916164,0.400805,180.675225,-589.158255,1950.284976,
+ 0,-0.881921,0.471397,884.794356,-604.173851,1922.192772,
+ 0,-0.881921,0.471397,892.684335,-596.472603,1936.600792,
+ 0,-0.916164,0.400805,180.675225,-589.158255,1950.284976,
+ 0,-0.881921,0.471397,892.684335,-596.472603,1936.600792,
+ 0,-0.92388,0.382683,897.900693,-589.158255,1950.284976,
+ -0.436098,0.719283,0.540788,-758.060123,-874.453748,2003.996308,
+ -0.278983,0.56848,0.77395,-702.965588,-809.153242,1972.08037,
+ -0.201549,0.493286,0.846195,-769.870311,-863.13013,1987.610439,
+ -0.278983,0.56848,0.77395,-702.965588,-809.153242,1972.08037,
+ -0.436098,0.719283,0.540788,-758.060123,-874.453748,2003.996308,
+ -0.436098,0.719283,0.540788,-687.957453,-823.760435,1993.102587,
+ 0.37075,-0.899004,-0.2331,-643.970452,-861.831591,2011.202527,
+ 0.302536,-0.83706,-0.455854,-741.432258,-891.447302,1988.145993,
+ 0.252855,-0.790324,-0.558079,-654.791104,-848.015122,1965.894902,
+ 0.302536,-0.83706,-0.455854,-741.432258,-891.447302,1988.145993,
+ 0.37075,-0.899004,-0.2331,-643.970452,-861.831591,2011.202527,
+ 0.392989,-0.915858,-0.082244,-731.724734,-900.26268,2019.846175,
+ 0,0.999462,0.032813,180.675225,-1016.065853,2035.202177,
+ 0,0.986659,0.162803,653.750225,-1011.80212,1991.911763,
+ 0,0.973856,0.227168,180.675225,-1011.80212,1991.911763,
+ 0,0.986659,0.162803,653.750225,-1011.80212,1991.911763,
+ 0,0.999462,0.032813,180.675225,-1016.065853,2035.202177,
+ 0,0.999462,-0.032813,653.750225,-1016.065853,2035.202177,
+ 0.679334,-0.678235,-0.280182,590.997993,-590.997993,738.078199,
+ 0.500293,-0.746549,-0.438601,452.472967,-677.173649,682.822311,
+ 0.636324,-0.634602,-0.438601,575.888851,-575.888851,682.822311,
+ 0.500293,-0.746549,-0.438601,452.472967,-677.173649,682.822311,
+ 0.679334,-0.678235,-0.280182,590.997993,-590.997993,738.078199,
+ 0.533964,-0.797735,-0.280182,464.344144,-694.940121,738.078199,
+ 0.966926,-0.191862,0.168059,1051.797109,-209.215453,2148.211628,
+ 0.872041,-0.360223,0.331336,964.515951,-399.515588,2258.006804,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.872041,-0.360223,0.331336,964.515951,-399.515588,2258.006804,
+ 0.966926,-0.191862,0.168059,1051.797109,-209.215453,2148.211628,
+ 0.925561,-0.183175,0.331336,1023.924672,-203.671281,2258.006804,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-878.796251,-89.364884,1427.89836,
+ 0,0,-1,-887.597924,0,1427.89836,
+ 0,0,-1,-878.796251,-89.364884,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-870.542978,-173.161765,1427.89836,
+ 0,0,-1,-870.542978,-173.161765,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-868.904109,-178.564394,1427.89836,
+ 0,0,-1,-868.904109,-178.564394,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-842.852042,-264.446548,1427.89836,
+ 0,0,-1,-842.852042,-264.446548,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-820.033555,-339.66902,1427.89836,
+ 0,0,-1,-820.033555,-339.66902,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-814.713927,-349.621343,1427.89836,
+ 0,0,-1,-814.713927,-349.621343,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-772.428086,-428.732587,1427.89836,
+ 0,0,-1,-772.428086,-428.732587,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-738.010701,-493.122985,1427.89836,
+ 0,0,-1,-738.010701,-493.122985,1427.89836,
+ 0,0,-1,-747.450884,0,1427.89836,
+ 0,0,-1,-733.088824,-145.820434,1427.89836,
+ 0,0,-1,-738.010701,-493.122985,1427.89836,
+ 0,0,-1,-733.088824,-145.820434,1427.89836,
+ 0,0,-1,-727.278191,-506.200587,1427.89836,
+ 0,0,-1,-727.278191,-506.200587,1427.89836,
+ 0,0,-1,-733.088824,-145.820434,1427.89836,
+ 0,0,-1,-690.554573,-286.03707,1427.89836,
+ 0,0,-1,-727.278191,-506.200587,1427.89836,
+ 0,0,-1,-690.554573,-286.03707,1427.89836,
+ 0,0,-1,-670.393897,-575.514299,1427.89836,
+ 0,0,-1,-670.393897,-575.514299,1427.89836,
+ 0,0,-1,-690.554573,-286.03707,1427.89836,
+ 0,0,-1,-621.482696,-415.261462,1427.89836,
+ 0,0,-1,-670.393897,-575.514299,1427.89836,
+ 0,0,-1,-621.482696,-415.261462,1427.89836,
+ 0,0,-1,-627.626511,-627.626511,1427.89836,
+ 0,0,-1,-627.626511,-627.626511,1427.89836,
+ 0,0,-1,-621.482696,-415.261462,1427.89836,
+ 0,0,-1,-610.198918,-641.928967,1427.89836,
+ 0,0,-1,-610.198918,-641.928967,1427.89836,
+ 0,0,-1,-621.482696,-415.261462,1427.89836,
+ 0,0,-1,-528.527588,-528.527588,1427.89836,
+ 0,0,-1,-610.198918,-641.928967,1427.89836,
+ 0,0,-1,-528.527588,-528.527588,1427.89836,
+ 0,0,-1,-540.907488,-698.794973,1427.89836,
+ 0,0,-1,-540.907488,-698.794973,1427.89836,
+ 0,0,-1,-528.527588,-528.527588,1427.89836,
+ 0,0,-1,-493.122985,-738.010701,1427.89836,
+ 0,0,-1,-493.122985,-738.010701,1427.89836,
+ 0,0,-1,-528.527588,-528.527588,1427.89836,
+ 0,0,-1,-415.261462,-621.482696,1427.89836,
+ 0,0,-1,-493.122985,-738.010701,1427.89836,
+ 0,0,-1,-415.261462,-621.482696,1427.89836,
+ 0,0,-1,-468.281767,-751.288609,1427.89836,
+ 0,0,-1,-468.281767,-751.288609,1427.89836,
+ 0,0,-1,-415.261462,-621.482696,1427.89836,
+ 0,0,-1,-389.246833,-793.533662,1427.89836,
+ 0,0,-1,-389.246833,-793.533662,1427.89836,
+ 0,0,-1,-415.261462,-621.482696,1427.89836,
+ 0,0,-1,-286.03707,-690.554573,1427.89836,
+ 0,0,-1,-389.246833,-793.533662,1427.89836,
+ 0,0,-1,-286.03707,-690.554573,1427.89836,
+ 0,0,-1,-339.66902,-820.033555,1427.89836,
+ 0,0,-1,-339.66902,-820.033555,1427.89836,
+ 0,0,-1,-286.03707,-690.554573,1427.89836,
+ 0,0,-1,-307.339193,-829.840701,1427.89836,
+ 0,0,-1,-307.339193,-829.840701,1427.89836,
+ 0,0,-1,-286.03707,-690.554573,1427.89836,
+ 0,0,-1,-221.595076,-855.850894,1427.89836,
+ 0,0,-1,-221.595076,-855.850894,1427.89836,
+ 0,0,-1,-286.03707,-690.554573,1427.89836,
+ 0,0,-1,-145.820434,-733.088824,1427.89836,
+ 0,0,-1,-221.595076,-855.850894,1427.89836,
+ 0,0,-1,-145.820434,-733.088824,1427.89836,
+ 0,0,-1,-173.161765,-870.542978,1427.89836,
+ 0,0,-1,-173.161765,-870.542978,1427.89836,
+ 0,0,-1,-145.820434,-733.088824,1427.89836,
+ 0,0,-1,-44.790103,-883.186483,1427.89836,
+ 0,0,-1,-44.790103,-883.186483,1427.89836,
+ 0,0,-1,-145.820434,-733.088824,1427.89836,
+ 0,0,-1,0,-747.450884,1427.89836,
+ 0,0,-1,-44.790103,-883.186483,1427.89836,
+ 0,0,-1,0,-747.450884,1427.89836,
+ 0,0,-1,0,-887.597924,1427.89836,
+ 0,0,-1,0,-887.597924,1427.89836,
+ 0,0,-1,0,-747.450884,1427.89836,
+ 0,0,-1,145.820434,-733.088824,1427.89836,
+ 0,0,-1,0,-887.597924,1427.89836,
+ 0,0,-1,145.820434,-733.088824,1427.89836,
+ 0,0,-1,44.790142,-883.18648,1427.89836,
+ 0,0,-1,44.790142,-883.18648,1427.89836,
+ 0,0,-1,145.820434,-733.088824,1427.89836,
+ 0,0,-1,133.953889,-874.404617,1427.89836,
+ 0,0,-1,133.953889,-874.404617,1427.89836,
+ 0,0,-1,145.820434,-733.088824,1427.89836,
+ 0,0,-1,173.161765,-870.542978,1427.89836,
+ 0,0,-1,173.161765,-870.542978,1427.89836,
+ 0,0,-1,145.820434,-733.088824,1427.89836,
+ 0,0,-1,286.03707,-690.554573,1427.89836,
+ 0,0,-1,173.161765,-870.542978,1427.89836,
+ 0,0,-1,286.03707,-690.554573,1427.89836,
+ 0,0,-1,221.595155,-855.85087,1427.89836,
+ 0,0,-1,221.595155,-855.85087,1427.89836,
+ 0,0,-1,286.03707,-690.554573,1427.89836,
+ 0,0,-1,307.339229,-829.84069,1427.89836,
+ 0,0,-1,307.339229,-829.84069,1427.89836,
+ 0,0,-1,286.03707,-690.554573,1427.89836,
+ 0,0,-1,415.261462,-621.482696,1427.89836,
+ 0,0,-1,307.339229,-829.84069,1427.89836,
+ 0,0,-1,415.261462,-621.482696,1427.89836,
+ 0,0,-1,339.66902,-820.033555,1427.89836,
+ 0,0,-1,339.66902,-820.033555,1427.89836,
+ 0,0,-1,415.261462,-621.482696,1427.89836,
+ 0,0,-1,389.246864,-793.533645,1427.89836,
+ 0,0,-1,389.246864,-793.533645,1427.89836,
+ 0,0,-1,415.261462,-621.482696,1427.89836,
+ 0,0,-1,468.281762,-751.288612,1427.89836,
+ 0,0,-1,468.281762,-751.288612,1427.89836,
+ 0,0,-1,415.261462,-621.482696,1427.89836,
+ 0,0,-1,528.527588,-528.527588,1427.89836,
+ 0,0,-1,468.281762,-751.288612,1427.89836,
+ 0,0,-1,528.527588,-528.527588,1427.89836,
+ 0,0,-1,493.122985,-738.010701,1427.89836,
+ 0,0,-1,493.122985,-738.010701,1427.89836,
+ 0,0,-1,528.527588,-528.527588,1427.89836,
+ 0,0,-1,540.907511,-698.794954,1427.89836,
+ 0,0,-1,540.907511,-698.794954,1427.89836,
+ 0,0,-1,528.527588,-528.527588,1427.89836,
+ 0,0,-1,621.482696,-415.261462,1427.89836,
+ 0,0,-1,540.907511,-698.794954,1427.89836,
+ 0,0,-1,621.482696,-415.261462,1427.89836,
+ 0,0,-1,627.626511,-627.626511,1427.89836,
+ 0,0,-1,627.626511,-627.626511,1427.89836,
+ 0,0,-1,621.482696,-415.261462,1427.89836,
+ 0,0,-1,690.554573,-286.03707,1427.89836,
+ 0,0,-1,627.626511,-627.626511,1427.89836,
+ 0,0,-1,690.554573,-286.03707,1427.89836,
+ 0,0,-1,738.010701,-493.122985,1427.89836,
+ 0,0,-1,738.010701,-493.122985,1427.89836,
+ 0,0,-1,690.554573,-286.03707,1427.89836,
+ 0,0,-1,733.088824,-145.820434,1427.89836,
+ 0,0,-1,738.010701,-493.122985,1427.89836,
+ 0,0,-1,733.088824,-145.820434,1427.89836,
+ 0,0,-1,747.450884,0,1427.89836,
+ 0,0,-1,738.010701,-493.122985,1427.89836,
+ 0,0,-1,747.450884,0,1427.89836,
+ 0,0,-1,820.033555,-339.66902,1427.89836,
+ 0,0,-1,820.033555,-339.66902,1427.89836,
+ 0,0,-1,747.450884,0,1427.89836,
+ 0,0,-1,887.597924,0,1427.89836,
+ 0,0,-1,820.033555,-339.66902,1427.89836,
+ 0,0,-1,887.597924,0,1427.89836,
+ 0,0,-1,870.542978,-173.161765,1427.89836,
+ 0.456892,-0.661987,-0.594157,435.577878,-651.888362,631.979457,
+ 0.313363,-0.691434,-0.65094,285.268899,-688.700045,587.016307,
+ 0.421653,-0.631049,-0.651142,414.146251,-619.813666,587.016307,
+ 0.313363,-0.691434,-0.65094,285.268899,-688.700045,587.016307,
+ 0.456892,-0.661987,-0.594157,435.577878,-651.888362,631.979457,
+ 0.312045,-0.749097,-0.584364,300.03126,-724.339538,631.979457,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ -0.606233,-0.567693,-0.556961,-660.670395,-660.670395,1614.76108,
+ -0.614068,-0.630655,-0.474547,-705.352697,-705.352697,1708.939502,
+ -0.606233,-0.567693,-0.556961,-660.670395,-660.670395,1614.76108,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ -0.642867,-0.527587,-0.555314,-705.689426,-605.814546,1614.76108,
+ -0.642867,-0.527587,-0.555314,-705.689426,-605.814546,1614.76108,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ -0.642867,-0.527587,-0.555314,-765.568614,-532.851545,1614.76108,
+ -0.642867,-0.527587,-0.555314,-765.568614,-532.851545,1614.76108,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ -0.705336,-0.438515,-0.556961,-776.866198,-519.085398,1614.76108,
+ 0.345035,-0.829807,-0.438601,311.6688,-752.435044,682.822311,
+ 0.159907,-0.795581,-0.584364,152.95461,-768.954752,631.979457,
+ 0.312045,-0.749097,-0.584364,300.03126,-724.339538,631.979457,
+ 0.159907,-0.795581,-0.584364,152.95461,-768.954752,631.979457,
+ 0.345035,-0.829807,-0.438601,311.6688,-752.435044,682.822311,
+ 0.176518,-0.881175,-0.438601,158.887376,-798.780783,682.822311,
+ 0.368074,-0.886578,-0.280182,319.845809,-772.17609,738.078199,
+ 0.176518,-0.881175,-0.438601,158.887376,-798.780783,682.822311,
+ 0.345035,-0.829807,-0.438601,311.6688,-752.435044,682.822311,
+ 0.176518,-0.881175,-0.438601,158.887376,-798.780783,682.822311,
+ 0.368074,-0.886578,-0.280182,319.845809,-772.17609,738.078199,
+ 0.188038,-0.94135,-0.280182,163.055979,-819.737765,738.078199,
+ 0.727062,-0.521108,0.447021,660.325365,-441.215303,1054.17292,
+ 0.632456,-0.632456,0.447214,495.494614,-495.494614,1241.03564,
+ 0.632456,-0.632456,0.447214,561.560563,-561.560563,1054.17292,
+ 0.632456,-0.632456,0.447214,495.494614,-495.494614,1241.03564,
+ 0.727062,-0.521108,0.447021,660.325365,-441.215303,1054.17292,
+ 0.759676,-0.472298,0.447021,582.640028,-389.30762,1241.03564,
+ 0.636324,-0.634602,-0.438601,575.888851,-575.888851,682.822311,
+ 0.456892,-0.661987,-0.594157,435.577878,-651.888362,631.979457,
+ 0.592439,-0.554776,-0.584157,554.385481,-554.385481,631.979457,
+ 0.456892,-0.661987,-0.594157,435.577878,-651.888362,631.979457,
+ 0.636324,-0.634602,-0.438601,575.888851,-575.888851,682.822311,
+ 0.500293,-0.746549,-0.438601,452.472967,-677.173649,682.822311,
+ -0.999806,-0,-0.019694,43.536421,-1075.680584,2034.646937,
+ -0.986659,-0,0.162803,42.671671,-976.267681,2025.866979,
+ -0.973856,-0,0.227168,42.671671,-1075.765755,2025.866979,
+ -0.986659,-0,0.162803,42.671671,-976.267681,2025.866979,
+ -0.999806,-0,-0.019694,43.536421,-1075.680584,2034.646937,
+ -1,-0,-0,43.536421,-976.708082,2034.646937,
+ 0,0.227168,-0.973856,653.750225,-837.456927,2252.837783,
+ 0,0.352162,-0.935939,180.675225,-879.083714,2240.210435,
+ -0,0.146613,-0.989194,180.675225,-837.456927,2252.837783,
+ 0,0.352162,-0.935939,180.675225,-879.083714,2240.210435,
+ 0,0.227168,-0.973856,653.750225,-837.456927,2252.837783,
+ 0,0.412792,-0.910825,653.750225,-879.083714,2240.210435,
+ -0.825684,0.31192,0.470055,-804.422958,-708.167768,2102.551876,
+ -0.904882,0.382198,0.187384,-853.465107,-778.056207,2053.98621,
+ -0.776009,0.265205,0.572256,-843.757583,-786.871584,2085.686391,
+ -0.904882,0.382198,0.187384,-853.465107,-778.056207,2053.98621,
+ -0.825684,0.31192,0.470055,-804.422958,-708.167768,2102.551876,
+ -0.904884,0.382185,0.187402,-818.273878,-697.096462,2058.801607,
+ 0,-0.995185,-0.098017,911.540741,-574.592525,2058.811877,
+ 0,-0.995185,-0.098017,907.767925,-572.267173,2035.202247,
+ 0,-1,-0,912.783669,-572.267169,2035.202245,
+ 0,-0.995185,-0.098017,907.767925,-572.267173,2035.202247,
+ 0,-0.989194,-0.146613,180.675225,-576.530907,2078.49259,
+ 0,-0.999462,0.032813,180.675225,-572.267173,2035.202177,
+ 0,-0.989194,-0.146613,180.675225,-576.530907,2078.49259,
+ 0,-0.995185,-0.098017,907.767925,-572.267173,2035.202247,
+ 0,-0.995185,-0.098017,911.540741,-574.592525,2058.811877,
+ 0,-0.989194,-0.146613,180.675225,-576.530907,2078.49259,
+ 0,-0.995185,-0.098017,911.540741,-574.592525,2058.811877,
+ 0,-0.973856,-0.227168,908.625264,-576.530907,2078.49259,
+ 0.518883,-0.55411,-0.65094,527.108195,-527.108195,587.016307,
+ 0.456892,-0.661987,-0.594157,435.577878,-651.888362,631.979457,
+ 0.421653,-0.631049,-0.651142,414.146251,-619.813666,587.016307,
+ 0.456892,-0.661987,-0.594157,435.577878,-651.888362,631.979457,
+ 0.518883,-0.55411,-0.65094,527.108195,-527.108195,587.016307,
+ 0.592439,-0.554776,-0.584157,554.385481,-554.385481,631.979457,
+ 0.144571,-0.892809,0.426605,369.410361,-997.119327,2170.810911,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.146136,-0.933668,0.326969,349.642944,-1009.198896,2148.211628,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.144571,-0.892809,0.426605,369.410361,-997.119327,2170.810911,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ 0.144571,-0.892809,0.426605,369.410361,-997.119327,2170.810911,
+ 0.211506,-0.883105,0.418796,406.150729,-980.534599,2191.019462,
+ 0.208122,-0.927269,0.31122,203.671281,-1023.924672,2258.006804,
+ 0.211506,-0.883105,0.418796,406.150729,-980.534599,2191.019462,
+ 0.393751,-0.867338,0.304443,399.515588,-964.515951,2258.006804,
+ -0.837219,-0.315017,0.447021,-647.394912,-268.159753,1241.03564,
+ -0.871137,-0.203207,0.447021,-778.906876,-154.934211,1054.17292,
+ -0.814754,-0.369253,0.447021,-733.714234,-303.914386,1054.17292,
+ -0.871137,-0.203207,0.447021,-778.906876,-154.934211,1054.17292,
+ -0.837219,-0.315017,0.447021,-647.394912,-268.159753,1241.03564,
+ -0.882589,-0.145631,0.447021,-687.270773,-136.706657,1241.03564,
+ -0.974489,-0.193517,-0.113678,-831.221151,-165.340167,796.15315,
+ -0.887172,-0.366638,-0.280182,-772.17609,-319.845809,738.078199,
+ -0.918011,-0.379912,-0.113678,-782.993204,-324.326404,796.15315,
+ -0.887172,-0.366638,-0.280182,-772.17609,-319.845809,738.078199,
+ -0.974489,-0.193517,-0.113678,-831.221151,-165.340167,796.15315,
+ -0.941653,-0.186514,-0.280182,-819.737765,-163.055979,738.078199,
+ -0.830739,-0.342785,-0.438601,-752.435044,-311.6688,682.822311,
+ -0.692236,-0.442144,-0.570366,-651.888362,-435.577878,631.979457,
+ -0.747902,-0.498268,-0.438601,-677.173649,-452.472967,682.822311,
+ -0.692236,-0.442144,-0.570366,-651.888362,-435.577878,631.979457,
+ -0.830739,-0.342785,-0.438601,-752.435044,-311.6688,682.822311,
+ -0.750341,-0.309043,-0.584364,-724.339538,-300.03126,631.979457,
+ -0.887172,-0.366638,-0.280182,-772.17609,-319.845809,738.078199,
+ -0.747902,-0.498268,-0.438601,-677.173649,-452.472967,682.822311,
+ -0.798598,-0.532672,-0.280182,-694.940121,-464.344144,738.078199,
+ -0.747902,-0.498268,-0.438601,-677.173649,-452.472967,682.822311,
+ -0.887172,-0.366638,-0.280182,-772.17609,-319.845809,738.078199,
+ -0.830739,-0.342785,-0.438601,-752.435044,-311.6688,682.822311,
+ -0.521108,-0.727062,0.447021,-389.30762,-582.640028,1241.03564,
+ -0.611428,-0.652938,0.447021,-561.560563,-561.560563,1054.17292,
+ -0.472298,-0.759676,0.447021,-441.215303,-660.325365,1054.17292,
+ -0.611428,-0.652938,0.447021,-561.560563,-561.560563,1054.17292,
+ -0.521108,-0.727062,0.447021,-389.30762,-582.640028,1241.03564,
+ -0.652938,-0.611428,0.447021,-495.494614,-495.494614,1241.03564,
+ -0.521108,-0.727062,0.447021,-415.261462,-621.482696,1427.89836,
+ -0.611428,-0.652938,0.447021,-594.593537,-594.593537,1241.03564,
+ -0.472298,-0.759676,0.447021,-467.169144,-699.168033,1241.03564,
+ -0.611428,-0.652938,0.447021,-594.593537,-594.593537,1241.03564,
+ -0.521108,-0.727062,0.447021,-415.261462,-621.482696,1427.89836,
+ -0.652938,-0.611428,0.447021,-528.527588,-528.527588,1427.89836,
+ -0.850126,-0.08373,-0.51988,-997.51935,0,1708.939502,
+ -0.819458,-0.135214,-0.556961,-916.376162,-182.278552,1614.76108,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.819458,-0.135214,-0.556961,-916.376162,-182.278552,1614.76108,
+ -0.850126,-0.08373,-0.51988,-997.51935,0,1708.939502,
+ -0.827636,-0.081515,-0.555314,-925.063958,-94.069882,1614.76108,
+ -0.827636,-0.081515,-0.555314,-925.063958,-94.069882,1614.76108,
+ -0.850126,-0.08373,-0.51988,-997.51935,0,1708.939502,
+ -0.827636,-0.081515,-0.555314,-934.329033,0,1614.76108,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ -0.929871,-0.091584,0.356303,-1043.984543,0,2258.006804,
+ -0.925561,-0.183175,0.331336,-1023.924672,-203.671281,2258.006804,
+ -0.929871,-0.091584,0.356303,-1043.984543,0,2258.006804,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ -0.850126,-0.08373,0.51988,-997.51935,0,2361.464898,
+ 0.890977,-0.087754,0.445488,794.166564,0,1054.17292,
+ 0.882589,-0.145631,0.447021,687.270773,-136.706657,1241.03564,
+ 0.871137,-0.203207,0.447021,778.906876,-154.934211,1054.17292,
+ 0.882589,-0.145631,0.447021,687.270773,-136.706657,1241.03564,
+ 0.890977,-0.087754,0.445488,794.166564,0,1054.17292,
+ 0.890977,-0.087754,0.445488,700.735204,0,1241.03564,
+ -0.995185,-0.098017,-0,-832.543812,-84.66152,2549.07468,
+ -0.976753,-0.214369,-0,-824.724927,-164.047988,2455.64332,
+ -0.980785,-0.19509,0,-824.724927,-164.047988,2549.07468,
+ -0.976753,-0.214369,-0,-824.724927,-164.047988,2455.64332,
+ -0.995185,-0.098017,-0,-832.543812,-84.66152,2549.07468,
+ -0.995185,-0.098017,-0,-840.882244,0,2455.64332,
+ -0.995185,-0.098017,-0,-840.882244,0,2455.64332,
+ -0.995185,-0.098017,-0,-832.543812,-84.66152,2549.07468,
+ -0.995185,-0.098017,0,-840.882244,0,2549.07468,
+ -0.759676,-0.472298,0.447021,-621.482696,-415.261462,1427.89836,
+ -0.814754,-0.369253,0.447021,-776.873894,-321.791703,1241.03564,
+ -0.727062,-0.521108,0.447021,-699.168033,-467.169144,1241.03564,
+ -0.814754,-0.369253,0.447021,-776.873894,-321.791703,1241.03564,
+ -0.759676,-0.472298,0.447021,-621.482696,-415.261462,1427.89836,
+ -0.837219,-0.315017,0.447021,-690.554573,-286.03707,1427.89836,
+ 0.533964,-0.797735,-0.280182,464.344144,-694.940121,738.078199,
+ 0.345035,-0.829807,-0.438601,311.6688,-752.435044,682.822311,
+ 0.500293,-0.746549,-0.438601,452.472967,-677.173649,682.822311,
+ 0.345035,-0.829807,-0.438601,311.6688,-752.435044,682.822311,
+ 0.533964,-0.797735,-0.280182,464.344144,-694.940121,738.078199,
+ 0.368074,-0.886578,-0.280182,319.845809,-772.17609,738.078199,
+ 0.552231,-0.825905,-0.113678,470.848959,-704.675266,796.15315,
+ 0.368074,-0.886578,-0.280182,319.845809,-772.17609,738.078199,
+ 0.533964,-0.797735,-0.280182,464.344144,-694.940121,738.078199,
+ 0.368074,-0.886578,-0.280182,319.845809,-772.17609,738.078199,
+ 0.552231,-0.825905,-0.113678,470.848959,-704.675266,796.15315,
+ 0.380494,-0.91777,-0.113678,324.326404,-782.993204,796.15315,
+ 0.872041,-0.360223,0.331336,964.515951,-399.515588,2258.006804,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.872041,-0.360223,0.331336,964.515951,-399.515588,2258.006804,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ -0.382396,-0.923034,0.0422,-413.286071,-997.760837,2058.811877,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.382289,-0.923079,-0.0422,-413.286071,-997.760837,2011.592523,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.382396,-0.923034,0.0422,-413.286071,-997.760837,2058.811877,
+ -0.555123,-0.830697,0.0422,-599.998378,-897.96103,2058.811877,
+ -0.909392,-0.412143,0.056077,-784.574342,-324.981333,855.371869,
+ -0.826255,-0.551707,-0.113678,-704.675266,-470.848959,796.15315,
+ -0.811513,-0.581637,0.056077,-706.098253,-471.799769,855.371869,
+ -0.826255,-0.551707,-0.113678,-704.675266,-470.848959,796.15315,
+ -0.909392,-0.412143,0.056077,-784.574342,-324.981333,855.371869,
+ -0.918011,-0.379912,-0.113678,-782.993204,-324.326404,796.15315,
+ 0.582554,-0,0.812792,-26.471367,-1076.145653,1997.226995,
+ 0.683524,-0,0.729928,-33.291206,-975.812207,2002.823893,
+ 0.729928,0,0.683524,-33.291206,-1075.947599,2002.823893,
+ 0.683524,-0,0.729928,-33.291206,-975.812207,2002.823893,
+ 0.582554,-0,0.812792,-26.471367,-1076.145653,1997.226995,
+ 0.527988,0,0.849252,-26.471367,-976.14887,1997.226995,
+ 0.83147,-0,-0.55557,-38.888103,-975.735676,2059.650143,
+ 0.707107,-0,-0.707107,-33.291206,-1076.041578,2066.469982,
+ 0.849252,-0,-0.527988,-38.888103,-1076.067465,2059.650143,
+ 0.707107,-0,-0.707107,-33.291206,-1076.041578,2066.469982,
+ 0.83147,-0,-0.55557,-38.888103,-975.735676,2059.650143,
+ 0.707107,0,-0.707107,-33.291206,-975.878684,2066.469982,
+ -0.527988,0,0.849252,23.535045,-1076.434855,1997.226995,
+ -0.382683,-0,0.92388,15.754347,-976.955453,1993.068126,
+ -0.382683,0,0.92388,15.754347,-1076.84924,1993.068126,
+ -0.382683,-0,0.92388,15.754347,-976.955453,1993.068126,
+ -0.527988,0,0.849252,23.535045,-1076.434855,1997.226995,
+ -0.582554,0,0.812792,23.535045,-976.438073,1997.226995,
+ -0.227168,-0,0.973856,7.311798,-1077.464031,1990.507106,
+ -0.382683,-0,0.92388,15.754347,-976.955453,1993.068126,
+ -0.162803,-0,0.986659,7.311798,-977.633668,1990.507106,
+ -0.382683,-0,0.92388,15.754347,-976.955453,1993.068126,
+ -0.227168,-0,0.973856,7.311798,-1077.464031,1990.507106,
+ -0.382683,0,0.92388,15.754347,-1076.84924,1993.068126,
+ -0.935939,0,-0.352162,40.110651,-976.081021,2051.869445,
+ -0.973856,-0,-0.227168,42.671671,-1075.765755,2043.426896,
+ -0.903939,-0,-0.427662,40.110651,-1076.017993,2051.869445,
+ -0.973856,-0,-0.227168,42.671671,-1075.765755,2043.426896,
+ -0.935939,0,-0.352162,40.110651,-976.081021,2051.869445,
+ -0.986659,-0,-0.162803,42.671671,-976.334157,2043.426896,
+ -0.377668,-0.910562,0.168059,-410.390874,-990.771213,2148.211628,
+ -0.555123,-0.830697,0.0422,-599.998378,-897.96103,2058.811877,
+ -0.382396,-0.923034,0.0422,-413.286071,-997.760837,2058.811877,
+ -0.555123,-0.830697,0.0422,-599.998378,-897.96103,2058.811877,
+ -0.377668,-0.910562,0.168059,-410.390874,-990.771213,2148.211628,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.759676,-0.472298,0.447021,-582.640028,-389.30762,1241.03564,
+ -0.814754,-0.369253,0.447021,-733.714234,-303.914386,1054.17292,
+ -0.727062,-0.521108,0.447021,-660.325365,-441.215303,1054.17292,
+ -0.814754,-0.369253,0.447021,-733.714234,-303.914386,1054.17292,
+ -0.759676,-0.472298,0.447021,-582.640028,-389.30762,1241.03564,
+ -0.837219,-0.315017,0.447021,-647.394912,-268.159753,1241.03564,
+ -0.993624,-0.097863,-0.055991,-1079.968548,0,2011.592523,
+ -0.966926,-0.191862,-0.168059,-1051.797109,-209.215453,1922.192772,
+ -0.979923,-0.19486,-0.0422,-1059.217255,-210.691412,2011.592523,
+ -0.966926,-0.191862,-0.168059,-1051.797109,-209.215453,1922.192772,
+ -0.993624,-0.097863,-0.055991,-1079.968548,0,2011.592523,
+ -0.976104,-0.096138,-0.19488,-1072.403033,0,1922.192772,
+ 0.69246,-0.720397,0.039075,600.487204,-600.487204,855.371869,
+ 0.552231,-0.825905,-0.113678,470.848959,-704.675266,796.15315,
+ 0.702746,-0.7023,-0.113678,599.277053,-599.277053,796.15315,
+ 0.552231,-0.825905,-0.113678,470.848959,-704.675266,796.15315,
+ 0.69246,-0.720397,0.039075,600.487204,-600.487204,855.371869,
+ 0.554566,-0.830246,0.056107,471.799769,-706.098253,855.371869,
+ -0.000001,0.812792,-0.582554,104.493598,-867.96763,2084.514498,
+ -0.000001,0.729928,-0.683524,180.675225,-856.929131,2097.964794,
+ -0.000001,0.849252,-0.527988,180.675225,-867.967544,2084.514449,
+ -0.000001,0.729928,-0.683524,180.675225,-856.929131,2097.964794,
+ -0.000001,0.812792,-0.582554,104.493598,-867.96763,2084.514498,
+ -0.000001,0.683524,-0.729928,104.493594,-856.929211,2097.964851,
+ -0.000001,0.582554,-0.812792,180.675225,-843.478786,2109.003208,
+ -0.000001,0.683524,-0.729928,104.493594,-856.929211,2097.964851,
+ -0.000001,0.527988,-0.849252,104.493591,-843.478858,2109.00327,
+ -0.000001,0.683524,-0.729928,104.493594,-856.929211,2097.964851,
+ -0.000001,0.582554,-0.812792,180.675225,-843.478786,2109.003208,
+ -0.000001,0.729928,-0.683524,180.675225,-856.929131,2097.964794,
+ -0.000001,0.412792,-0.910825,180.675225,-828.133397,2117.205489,
+ -0.000001,0.527988,-0.849252,104.493591,-843.478858,2109.00327,
+ -0.000001,0.352162,-0.935939,104.493588,-828.133462,2117.205555,
+ -0.000001,0.527988,-0.849252,104.493591,-843.478858,2109.00327,
+ -0.000001,0.412792,-0.910825,180.675225,-828.133397,2117.205489,
+ -0.000001,0.582554,-0.812792,180.675225,-843.478786,2109.003208,
+ -0.000001,0.227168,-0.973856,180.675225,-811.482681,2122.256428,
+ -0.000001,0.352162,-0.935939,104.493588,-828.133462,2117.205555,
+ -0.000001,0.162803,-0.986659,104.493585,-811.482736,2122.256498,
+ -0.000001,0.352162,-0.935939,104.493588,-828.133462,2117.205555,
+ -0.000001,0.227168,-0.973856,180.675225,-811.482681,2122.256428,
+ -0.000001,0.412792,-0.910825,180.675225,-828.133397,2117.205489,
+ -0.000001,0.032813,-0.999462,180.675225,-794.166513,2123.961922,
+ -0.000001,0.162803,-0.986659,104.493585,-811.482736,2122.256498,
+ -0.000001,-0.032813,-0.999462,104.493583,-794.16656,2123.961992,
+ -0.000001,0.162803,-0.986659,104.493585,-811.482736,2122.256498,
+ -0.000001,0.032813,-0.999462,180.675225,-794.166513,2123.961922,
+ -0.000001,0.227168,-0.973856,180.675225,-811.482681,2122.256428,
+ -0.000001,-0.162803,-0.986659,180.675225,-776.850346,2122.256428,
+ -0.000001,-0.032813,-0.999462,104.493583,-794.16656,2123.961992,
+ -0.000001,-0.227168,-0.973856,104.493581,-776.850384,2122.256498,
+ -0.000001,-0.032813,-0.999462,104.493583,-794.16656,2123.961992,
+ -0.000001,-0.162803,-0.986659,180.675225,-776.850346,2122.256428,
+ -0.000001,0.032813,-0.999462,180.675225,-794.166513,2123.961922,
+ -0.000001,-0.352162,-0.935939,180.675225,-760.199629,2117.205489,
+ -0.000001,-0.227168,-0.973856,104.493581,-776.850384,2122.256498,
+ -0.000001,-0.412792,-0.910825,104.493579,-760.199658,2117.205555,
+ -0.000001,-0.227168,-0.973856,104.493581,-776.850384,2122.256498,
+ -0.000001,-0.352162,-0.935939,180.675225,-760.199629,2117.205489,
+ -0.000001,-0.162803,-0.986659,180.675225,-776.850346,2122.256428,
+ -0.000001,-0.527988,-0.849252,180.675225,-744.854241,2109.003208,
+ -0.000001,-0.412792,-0.910825,104.493579,-760.199658,2117.205555,
+ -0.000001,-0.582554,-0.812792,104.493578,-744.854262,2109.00327,
+ -0.000001,-0.412792,-0.910825,104.493579,-760.199658,2117.205555,
+ -0.000001,-0.527988,-0.849252,180.675225,-744.854241,2109.003208,
+ -0.000001,-0.352162,-0.935939,180.675225,-760.199629,2117.205489,
+ -0,-0.707107,-0.707107,180.675225,-731.403895,2097.964794,
+ -0.000001,-0.582554,-0.812792,104.493578,-744.854262,2109.00327,
+ -0,-0.707107,-0.707107,104.493578,-731.403909,2097.964851,
+ -0.000001,-0.582554,-0.812792,104.493578,-744.854262,2109.00327,
+ -0,-0.707107,-0.707107,180.675225,-731.403895,2097.964794,
+ -0.000001,-0.527988,-0.849252,180.675225,-744.854241,2109.003208,
+ -0,-0.707107,-0.707107,180.675225,-731.403895,2097.964794,
+ -0,-0.812792,-0.582554,104.493578,-720.36549,2084.514498,
+ -0,-0.849252,-0.527988,180.675225,-720.365482,2084.514449,
+ -0,-0.812792,-0.582554,104.493578,-720.36549,2084.514498,
+ -0,-0.707107,-0.707107,180.675225,-731.403895,2097.964794,
+ -0,-0.707107,-0.707107,104.493578,-731.403909,2097.964851,
+ -0,-0.849252,-0.527988,180.675225,-720.365482,2084.514449,
+ -0,-0.910825,-0.412792,104.493579,-712.163205,2069.169102,
+ -0,-0.935939,-0.352162,180.675225,-712.163201,2069.169061,
+ -0,-0.910825,-0.412792,104.493579,-712.163205,2069.169102,
+ -0,-0.849252,-0.527988,180.675225,-720.365482,2084.514449,
+ -0,-0.812792,-0.582554,104.493578,-720.36549,2084.514498,
+ -0,-0.935939,-0.352162,180.675225,-712.163201,2069.169061,
+ -0,-0.973856,-0.227168,104.493581,-707.112263,2052.518376,
+ -0,-0.986659,-0.162803,180.675225,-707.112262,2052.518344,
+ -0,-0.973856,-0.227168,104.493581,-707.112263,2052.518376,
+ -0,-0.935939,-0.352162,180.675225,-712.163201,2069.169061,
+ -0,-0.910825,-0.412792,104.493579,-712.163205,2069.169102,
+ -0,-0.986659,-0.162803,180.675225,-707.112262,2052.518344,
+ -0,-0.999462,-0.032813,104.493583,-705.406768,2035.2022,
+ 0,-0.999462,0.032813,180.675225,-705.406768,2035.202177,
+ -0,-0.999462,-0.032813,104.493583,-705.406768,2035.2022,
+ -0,-0.986659,-0.162803,180.675225,-707.112262,2052.518344,
+ -0,-0.973856,-0.227168,104.493581,-707.112263,2052.518376,
+ 0.438515,-0.705336,0.556961,519.085398,-776.866198,2455.64332,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.51982,-0.710547,0.474247,554.192058,-829.407027,2361.464898,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.438515,-0.705336,0.556961,519.085398,-776.866198,2455.64332,
+ 0.292484,-0.777333,0.556961,357.552241,-863.20747,2455.64332,
+ 0,0,1,357.552241,-863.20747,2455.64332,
+ 0,0,1,519.085398,-776.866198,2455.64332,
+ 0,0,1,492.936359,-790.843151,2455.64332,
+ 0,0,-1,357.552241,-863.20747,2455.64332,
+ 0,0,-1,492.936359,-790.843151,2455.64332,
+ 0,0,-1,409.740311,-835.312366,2455.64332,
+ -0.947451,-0.093316,-0.305988,-835.797377,0,738.078199,
+ -0.881651,-0.17413,-0.438601,-798.780783,-158.887376,682.822311,
+ -0.941653,-0.186514,-0.280182,-819.737765,-163.055979,738.078199,
+ -0.881651,-0.17413,-0.438601,-798.780783,-158.887376,682.822311,
+ -0.947451,-0.093316,-0.305988,-835.797377,0,738.078199,
+ -0.882512,-0.08692,-0.462187,-814.429823,0,682.822311,
+ -0.538332,-0.779667,0.319873,-580.006736,-868.041423,2258.006804,
+ -0.62223,-0.75819,0.19488,-700.811797,-805.485643,2148.211628,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.62223,-0.75819,0.19488,-700.811797,-805.485643,2148.211628,
+ -0.538332,-0.779667,0.319873,-580.006736,-868.041423,2258.006804,
+ -0.61434,-0.748575,0.249443,-713.051374,-793.031289,2155.442781,
+ -0.61434,-0.748575,0.249443,-750.226481,-763.163738,2153.518338,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.684548,-0.684548,0.250574,-758.175253,-758.175253,2148.912113,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.61434,-0.748575,0.249443,-750.226481,-763.163738,2153.518338,
+ -0.61434,-0.748575,0.249443,-713.051374,-793.031289,2155.442781,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.61434,-0.748575,0.249443,-713.051374,-793.031289,2155.442781,
+ -0.538332,-0.779667,0.319873,-580.006736,-868.041423,2258.006804,
+ 0.252855,-0.790324,-0.558079,-654.791104,-848.015122,1965.894902,
+ 0.071382,-0.616271,-0.784292,-758.928833,-874.671572,1963.870632,
+ 0.093452,-0.638076,-0.764282,-679.407718,-824.046894,1931.329012,
+ 0.071382,-0.616271,-0.784292,-758.928833,-874.671572,1963.870632,
+ 0.252855,-0.790324,-0.558079,-654.791104,-848.015122,1965.894902,
+ 0.302536,-0.83706,-0.455854,-741.432258,-891.447302,1988.145993,
+ 0.032813,0,0.999462,-1.468161,-1077.966399,1989.642356,
+ 0.162803,0,0.986659,-10.248119,-977.344466,1990.507106,
+ 0.227168,0,0.973856,-10.248119,-1077.174828,1990.507106,
+ 0.162803,0,0.986659,-10.248119,-977.344466,1990.507106,
+ 0.032813,0,0.999462,-1.468161,-1077.966399,1989.642356,
+ -0.032813,-0,0.999462,-1.468161,-978.157452,1989.642356,
+ 0.554566,-0.830246,0.056107,471.799769,-706.098253,855.371869,
+ 0.380494,-0.91777,-0.113678,324.326404,-782.993204,796.15315,
+ 0.552231,-0.825905,-0.113678,470.848959,-704.675266,796.15315,
+ 0.380494,-0.91777,-0.113678,324.326404,-782.993204,796.15315,
+ 0.554566,-0.830246,0.056107,471.799769,-706.098253,855.371869,
+ 0.381937,-0.922484,0.056107,324.981333,-784.574342,855.371869,
+ 0.482193,-0.753361,0.447144,441.215303,-660.325365,1614.76108,
+ 0.422036,-0.789573,0.445488,468.281762,-751.288612,1427.89836,
+ 0.496917,-0.743689,0.447214,493.122985,-738.010701,1427.89836,
+ 0.422036,-0.789573,0.445488,468.281762,-751.288612,1427.89836,
+ 0.482193,-0.753361,0.447144,441.215303,-660.325365,1614.76108,
+ 0.422036,-0.789573,0.445488,389.246864,-793.533645,1427.89836,
+ 0.422036,-0.789573,0.445488,389.246864,-793.533645,1427.89836,
+ 0.325954,-0.832956,0.447144,303.914386,-733.714234,1614.76108,
+ 0.342282,-0.826343,0.447214,339.66902,-820.033555,1427.89836,
+ 0.325954,-0.832956,0.447144,303.914386,-733.714234,1614.76108,
+ 0.422036,-0.789573,0.445488,389.246864,-793.533645,1427.89836,
+ 0.482193,-0.753361,0.447144,441.215303,-660.325365,1614.76108,
+ 0.87881,-0.469734,0.083921,897.900698,-589.158255,2120.119378,
+ 0.832671,-0.532692,0.151323,891.670534,-595.795203,2148.211628,
+ 0.828508,-0.553591,0.084324,892.684338,-596.472605,2133.803565,
+ 0.832671,-0.532692,0.151323,891.670534,-595.795203,2148.211628,
+ 0.87881,-0.469734,0.083921,897.900698,-589.158255,2120.119378,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.87881,-0.469734,0.083921,897.900698,-589.158255,2120.119378,
+ 0.87881,-0.469734,0.083921,908.625264,-576.530907,2078.49259,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.87881,-0.469734,0.083921,908.625264,-576.530907,2078.49259,
+ 0.880538,-0.470657,0.055991,911.540741,-574.592525,2058.811877,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.880538,-0.470657,0.055991,911.540741,-574.592525,2058.811877,
+ 0.923514,-0.382532,0.028131,997.760837,-413.286071,2058.811877,
+ -0.000001,0.352162,0.935939,104.49361,-828.133462,1953.198845,
+ -0,0.227168,0.973856,180.675225,-811.482681,1948.147925,
+ -0,0.162803,0.986659,104.493608,-811.482736,1948.147903,
+ -0,0.227168,0.973856,180.675225,-811.482681,1948.147925,
+ -0.000001,0.352162,0.935939,104.49361,-828.133462,1953.198845,
+ -0.000001,0.412792,0.910825,180.675225,-828.133397,1953.198865,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.392033,-0.733442,-0.555314,492.936359,-790.843151,1614.76108,
+ 0.461345,-0.690452,-0.557168,519.085398,-776.866198,1614.76108,
+ 0.392033,-0.733442,-0.555314,492.936359,-790.843151,1614.76108,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.392033,-0.733442,-0.555314,409.740311,-835.312366,1614.76108,
+ 0.392033,-0.733442,-0.555314,409.740311,-835.312366,1614.76108,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.31778,-0.767189,-0.557168,357.552241,-863.20747,1614.76108,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.392033,-0.733442,-0.555314,409.740311,-835.312366,1614.76108,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ -0,-0.582554,0.812792,104.493598,-744.854262,1961.40113,
+ 0,-0.707107,0.707107,180.675225,-731.403895,1972.439559,
+ 0,-0.707107,0.707107,104.493594,-731.403909,1972.439549,
+ 0,-0.707107,0.707107,180.675225,-731.403895,1972.439559,
+ -0,-0.582554,0.812792,104.493598,-744.854262,1961.40113,
+ -0,-0.527988,0.849252,180.675225,-744.854241,1961.401146,
+ -0.000001,0.973856,-0.227168,104.493604,-881.220857,2052.518376,
+ -0.000001,0.935939,-0.352162,180.675225,-876.169825,2069.169061,
+ -0.000001,0.986659,-0.162803,180.675225,-881.220765,2052.518344,
+ -0.000001,0.935939,-0.352162,180.675225,-876.169825,2069.169061,
+ -0.000001,0.973856,-0.227168,104.493604,-881.220857,2052.518376,
+ -0.000001,0.910825,-0.412792,104.493601,-876.169915,2069.169102,
+ -0.000001,0.910825,-0.412792,104.493601,-876.169915,2069.169102,
+ -0.000001,0.849252,-0.527988,180.675225,-867.967544,2084.514449,
+ -0.000001,0.935939,-0.352162,180.675225,-876.169825,2069.169061,
+ -0.000001,0.849252,-0.527988,180.675225,-867.967544,2084.514449,
+ -0.000001,0.910825,-0.412792,104.493601,-876.169915,2069.169102,
+ -0.000001,0.812792,-0.582554,104.493598,-867.96763,2084.514498,
+ -0.000001,0.999462,-0.032813,104.493606,-882.926352,2035.2022,
+ -0.000001,0.986659,-0.162803,180.675225,-881.220765,2052.518344,
+ -0.000001,0.999462,0.032813,180.675225,-882.926259,2035.202177,
+ -0.000001,0.986659,-0.162803,180.675225,-881.220765,2052.518344,
+ -0.000001,0.999462,-0.032813,104.493606,-882.926352,2035.2022,
+ -0.000001,0.973856,-0.227168,104.493604,-881.220857,2052.518376,
+ -0,-0.227168,0.973856,104.493604,-776.850384,1948.147903,
+ -0,-0.352162,0.935939,180.675225,-760.199629,1953.198865,
+ -0,-0.412792,0.910825,104.493601,-760.199658,1953.198845,
+ -0,-0.352162,0.935939,180.675225,-760.199629,1953.198865,
+ -0,-0.227168,0.973856,104.493604,-776.850384,1948.147903,
+ -0,-0.162803,0.986659,180.675225,-776.850346,1948.147925,
+ -0,-0.336778,0.941584,653.750225,-887.575434,2260.711261,
+ -0,-0.290285,0.95694,577.578294,-864.407003,2267.739328,
+ -0,-0.412792,0.910825,540.89692,-887.575434,2260.711261,
+ -0,-0.290285,0.95694,577.578294,-864.407003,2267.739328,
+ -0,-0.336778,0.941584,653.750225,-887.575434,2260.711261,
+ -0,-0.227168,0.973856,600.307509,-841.785968,2274.601344,
+ -0,-0.227168,0.973856,600.307509,-841.785968,2274.601344,
+ -0,-0.336778,0.941584,653.750225,-887.575434,2260.711261,
+ 0,-0.19509,0.980785,653.750225,-841.785968,2274.601344,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ -0.392033,-0.733442,-0.555314,-409.740279,-835.312382,1614.76108,
+ -0.31778,-0.767189,-0.557168,-357.552241,-863.20747,1614.76108,
+ -0.392033,-0.733442,-0.555314,-409.740279,-835.312382,1614.76108,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ -0.392033,-0.733442,-0.555314,-492.936329,-790.843167,1614.76108,
+ -0.392033,-0.733442,-0.555314,-492.936329,-790.843167,1614.76108,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.461345,-0.690452,-0.557168,-519.085398,-776.866198,1614.76108,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.392033,-0.733442,-0.555314,-492.936329,-790.843167,1614.76108,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ 0.918011,-0.379912,-0.113678,782.993204,-324.326404,796.15315,
+ 0.972323,-0.22681,0.056077,832.899679,-165.674047,855.371869,
+ 0.909392,-0.412143,0.056077,784.574342,-324.981333,855.371869,
+ 0.972323,-0.22681,0.056077,832.899679,-165.674047,855.371869,
+ 0.918011,-0.379912,-0.113678,782.993204,-324.326404,796.15315,
+ 0.974489,-0.193517,-0.113678,831.221151,-165.340167,796.15315,
+ 0.82593,-0.549829,0.124608,-789.394717,-732.286733,2020.799449,
+ 0.80808,-0.541317,-0.232341,-833.682296,-797.914759,2048.438454,
+ 0.803422,-0.523835,0.283037,-833.979694,-798.243508,2025.286671,
+ 0.80808,-0.541317,-0.232341,-833.682296,-797.914759,2048.438454,
+ 0.82593,-0.549829,0.124608,-789.394717,-732.286733,2020.799449,
+ 0.814584,-0.546562,-0.194222,-789.342859,-732.349615,2049.894341,
+ -0.000155,-0.998425,0.056107,0,-849.217148,855.371869,
+ -0.193517,-0.974489,-0.113678,-165.340167,-831.221151,796.15315,
+ 0.000315,-0.993518,-0.113678,0,-847.505736,796.15315,
+ -0.193517,-0.974489,-0.113678,-165.340167,-831.221151,796.15315,
+ -0.000155,-0.998425,0.056107,0,-849.217148,855.371869,
+ -0.194936,-0.97921,0.056107,-165.674047,-832.899679,855.371869,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ 0.881651,-0.17413,-0.438601,798.780783,-158.887376,682.822311,
+ 0.830739,-0.342785,-0.438601,752.435044,-311.6688,682.822311,
+ 0.881651,-0.17413,-0.438601,798.780783,-158.887376,682.822311,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ 0.787008,-0.166056,-0.594175,768.954752,-152.95461,631.979457,
+ 0.500293,-0.746549,-0.438601,452.472967,-677.173649,682.822311,
+ 0.312045,-0.749097,-0.584364,300.03126,-724.339538,631.979457,
+ 0.456892,-0.661987,-0.594157,435.577878,-651.888362,631.979457,
+ 0.312045,-0.749097,-0.584364,300.03126,-724.339538,631.979457,
+ 0.500293,-0.746549,-0.438601,452.472967,-677.173649,682.822311,
+ 0.345035,-0.829807,-0.438601,311.6688,-752.435044,682.822311,
+ -0.750341,-0.309043,-0.584364,-724.339538,-300.03126,631.979457,
+ -0.631049,-0.421653,-0.651142,-619.813666,-414.146251,587.016307,
+ -0.692236,-0.442144,-0.570366,-651.888362,-435.577878,631.979457,
+ -0.631049,-0.421653,-0.651142,-619.813666,-414.146251,587.016307,
+ -0.750341,-0.309043,-0.584364,-724.339538,-300.03126,631.979457,
+ -0.710498,-0.267337,-0.65094,-688.700045,-285.268899,587.016307,
+ 0.227168,0,0.973856,-10.248119,-1077.174828,1990.507106,
+ 0.352162,0,0.935939,-18.690668,-976.666251,1993.068126,
+ 0.412792,0,0.910825,-18.690668,-1076.560038,1993.068126,
+ 0.352162,0,0.935939,-18.690668,-976.666251,1993.068126,
+ 0.227168,0,0.973856,-10.248119,-1077.174828,1990.507106,
+ 0.162803,0,0.986659,-10.248119,-977.344466,1990.507106,
+ 0.312045,-0.749097,-0.584364,300.03126,-724.339538,631.979457,
+ 0.172449,-0.739282,-0.65094,145.428824,-731.120069,587.016307,
+ 0.313363,-0.691434,-0.65094,285.268899,-688.700045,587.016307,
+ 0.172449,-0.739282,-0.65094,145.428824,-731.120069,587.016307,
+ 0.312045,-0.749097,-0.584364,300.03126,-724.339538,631.979457,
+ 0.159907,-0.795581,-0.584364,152.95461,-768.954752,631.979457,
+ -0.652938,-0.611428,0.447021,-495.494614,-495.494614,1241.03564,
+ -0.727062,-0.521108,0.447021,-660.325365,-441.215303,1054.17292,
+ -0.611428,-0.652938,0.447021,-561.560563,-561.560563,1054.17292,
+ -0.727062,-0.521108,0.447021,-660.325365,-441.215303,1054.17292,
+ -0.652938,-0.611428,0.447021,-495.494614,-495.494614,1241.03564,
+ -0.759676,-0.472298,0.447021,-582.640028,-389.30762,1241.03564,
+ -0.652938,-0.611428,0.447021,-528.527588,-528.527588,1427.89836,
+ -0.727062,-0.521108,0.447021,-699.168033,-467.169144,1241.03564,
+ -0.611428,-0.652938,0.447021,-594.593537,-594.593537,1241.03564,
+ -0.727062,-0.521108,0.447021,-699.168033,-467.169144,1241.03564,
+ -0.652938,-0.611428,0.447021,-528.527588,-528.527588,1427.89836,
+ -0.759676,-0.472298,0.447021,-621.482696,-415.261462,1427.89836,
+ -0.777333,-0.292484,0.556961,-863.20747,-357.552241,2455.64332,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ -0.79057,-0.348586,0.503476,-921.587711,-381.734129,2361.464898,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ -0.777333,-0.292484,0.556961,-863.20747,-357.552241,2455.64332,
+ -0.795831,-0.241413,0.555314,-887.227323,-278.369396,2455.64332,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ -0.795831,-0.241413,0.555314,-887.227323,-278.369396,2455.64332,
+ -0.795831,-0.241413,0.555314,-914.651019,-187.965588,2455.64332,
+ -0.843385,-0.187656,0.503476,-978.352295,-194.606371,2361.464898,
+ -0.795831,-0.241413,0.555314,-914.651019,-187.965588,2455.64332,
+ -0.819458,-0.135214,0.556961,-916.376162,-182.278552,2455.64332,
+ 0,0,-1,-650.663002,0,587.016307,
+ 0,0,-1,-731.120069,-145.428824,587.016307,
+ 0,0,-1,-745.443558,0,587.016307,
+ 0,0,-1,-731.120069,-145.428824,587.016307,
+ 0,0,-1,-650.663002,0,587.016307,
+ 0,0,-1,-688.700045,-285.268899,587.016307,
+ 0,0,-1,-688.700045,-285.268899,587.016307,
+ 0,0,-1,-650.663002,0,587.016307,
+ 0,0,-1,-619.813666,-414.146251,587.016307,
+ 0,0,-1,-619.813666,-414.146251,587.016307,
+ 0,0,-1,-650.663002,0,587.016307,
+ 0,0,-1,-638.160695,-126.938055,587.016307,
+ 0,0,-1,-619.813666,-414.146251,587.016307,
+ 0,0,-1,-638.160695,-126.938055,587.016307,
+ 0,0,-1,-601.13423,-248.997951,587.016307,
+ 0,0,-1,-619.813666,-414.146251,587.016307,
+ 0,0,-1,-601.13423,-248.997951,587.016307,
+ 0,0,-1,-527.108195,-527.108195,587.016307,
+ 0,0,-1,-527.108195,-527.108195,587.016307,
+ 0,0,-1,-601.13423,-248.997951,587.016307,
+ 0,0,-1,-541.006514,-361.488996,587.016307,
+ 0,0,-1,-527.108195,-527.108195,587.016307,
+ 0,0,-1,-541.006514,-361.488996,587.016307,
+ 0,0,-1,-460.088221,-460.088221,587.016307,
+ 0,0,-1,-527.108195,-527.108195,587.016307,
+ 0,0,-1,-460.088221,-460.088221,587.016307,
+ 0,0,-1,-414.146251,-619.813666,587.016307,
+ 0,0,-1,-414.146251,-619.813666,587.016307,
+ 0,0,-1,-460.088221,-460.088221,587.016307,
+ 0,0,-1,-361.488996,-541.006514,587.016307,
+ 0,0,-1,-414.146251,-619.813666,587.016307,
+ 0,0,-1,-361.488996,-541.006514,587.016307,
+ 0,0,-1,-285.268899,-688.700045,587.016307,
+ 0,0,-1,-285.268899,-688.700045,587.016307,
+ 0,0,-1,-361.488996,-541.006514,587.016307,
+ 0,0,-1,-248.997951,-601.13423,587.016307,
+ 0,0,-1,-285.268899,-688.700045,587.016307,
+ 0,0,-1,-248.997951,-601.13423,587.016307,
+ 0,0,-1,-145.428824,-731.120069,587.016307,
+ 0,0,-1,-145.428824,-731.120069,587.016307,
+ 0,0,-1,-248.997951,-601.13423,587.016307,
+ 0,0,-1,-126.938055,-638.160695,587.016307,
+ 0,0,-1,-145.428824,-731.120069,587.016307,
+ 0,0,-1,-126.938055,-638.160695,587.016307,
+ 0,0,-1,0,-745.443558,587.016307,
+ 0,0,-1,0,-745.443558,587.016307,
+ 0,0,-1,-126.938055,-638.160695,587.016307,
+ 0,0,-1,0,-650.663002,587.016307,
+ 0,0,-1,0,-745.443558,587.016307,
+ 0,0,-1,0,-650.663002,587.016307,
+ 0,0,-1,126.938055,-638.160695,587.016307,
+ 0,0,-1,0,-745.443558,587.016307,
+ 0,0,-1,126.938055,-638.160695,587.016307,
+ 0,0,-1,145.428824,-731.120069,587.016307,
+ 0,0,-1,145.428824,-731.120069,587.016307,
+ 0,0,-1,126.938055,-638.160695,587.016307,
+ 0,0,-1,248.997951,-601.13423,587.016307,
+ 0,0,-1,145.428824,-731.120069,587.016307,
+ 0,0,-1,248.997951,-601.13423,587.016307,
+ 0,0,-1,285.268899,-688.700045,587.016307,
+ 0,0,-1,285.268899,-688.700045,587.016307,
+ 0,0,-1,248.997951,-601.13423,587.016307,
+ 0,0,-1,361.488996,-541.006514,587.016307,
+ 0,0,-1,285.268899,-688.700045,587.016307,
+ 0,0,-1,361.488996,-541.006514,587.016307,
+ 0,0,-1,414.146251,-619.813666,587.016307,
+ 0,0,-1,414.146251,-619.813666,587.016307,
+ 0,0,-1,361.488996,-541.006514,587.016307,
+ 0,0,-1,460.088221,-460.088221,587.016307,
+ 0,0,-1,414.146251,-619.813666,587.016307,
+ 0,0,-1,460.088221,-460.088221,587.016307,
+ 0,0,-1,527.108195,-527.108195,587.016307,
+ 0,0,-1,527.108195,-527.108195,587.016307,
+ 0,0,-1,460.088221,-460.088221,587.016307,
+ 0,0,-1,541.006514,-361.488996,587.016307,
+ 0,0,-1,527.108195,-527.108195,587.016307,
+ 0,0,-1,541.006514,-361.488996,587.016307,
+ 0,0,-1,610.800046,-425.129379,587.016307,
+ 0,0,-1,610.800046,-425.129379,587.016307,
+ 0,0,-1,541.006514,-361.488996,587.016307,
+ 0,0,-1,601.13423,-248.997951,587.016307,
+ 0,0,-1,610.800046,-425.129379,587.016307,
+ 0,0,-1,601.13423,-248.997951,587.016307,
+ 0,0,-1,638.160695,-126.938055,587.016307,
+ 0,0,-1,610.800046,-425.129379,587.016307,
+ 0,0,-1,638.160695,-126.938055,587.016307,
+ 0,0,-1,619.813666,-414.146251,587.016307,
+ 0,0,-1,619.813666,-414.146251,587.016307,
+ 0,0,-1,638.160695,-126.938055,587.016307,
+ 0,0,-1,648.718891,-360.068379,587.016307,
+ 0,0,-1,648.718891,-360.068379,587.016307,
+ 0,0,-1,638.160695,-126.938055,587.016307,
+ 0,0,-1,650.663002,0,587.016307,
+ 0,0,-1,648.718891,-360.068379,587.016307,
+ 0,0,-1,650.663002,0,587.016307,
+ 0,0,-1,684.232405,-293.627267,587.016307,
+ 0,0,-1,684.232405,-293.627267,587.016307,
+ 0,0,-1,650.663002,0,587.016307,
+ 0,0,-1,745.443558,0,587.016307,
+ 0,0,-1,684.232405,-293.627267,587.016307,
+ 0,0,-1,745.443558,0,587.016307,
+ 0,0,-1,688.700045,-285.268899,587.016307,
+ 0,0,-1,688.700045,-285.268899,587.016307,
+ 0,0,-1,745.443558,0,587.016307,
+ 0,0,-1,707.864018,-222.093747,587.016307,
+ 0,0,-1,707.864018,-222.093747,587.016307,
+ 0,0,-1,745.443558,0,587.016307,
+ 0,0,-1,731.120069,-145.428824,587.016307,
+ -0.918011,-0.379912,-0.113678,-782.993204,-324.326404,796.15315,
+ -0.798598,-0.532672,-0.280182,-694.940121,-464.344144,738.078199,
+ -0.826255,-0.551707,-0.113678,-704.675266,-470.848959,796.15315,
+ -0.798598,-0.532672,-0.280182,-694.940121,-464.344144,738.078199,
+ -0.918011,-0.379912,-0.113678,-782.993204,-324.326404,796.15315,
+ -0.887172,-0.366638,-0.280182,-772.17609,-319.845809,738.078199,
+ 0.966926,-0.191862,-0.168059,1051.797109,-209.215453,1922.192772,
+ 0.994307,-0.097931,-0.041998,1079.968548,0,2011.592523,
+ 0.972989,-0.226965,-0.042178,1059.217255,-210.691412,2011.592523,
+ 0.994307,-0.097931,-0.041998,1079.968548,0,2011.592523,
+ 0.966926,-0.191862,-0.168059,1051.797109,-209.215453,1922.192772,
+ 0.976104,-0.096138,-0.19488,1072.403033,0,1922.192772,
+ -0.032696,-0.995906,-0.084279,0,-1078.123237,1989.786957,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ 0.014463,-0.987633,-0.156114,0,-1072.403033,1922.192772,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ -0.032696,-0.995906,-0.084279,0,-1078.123237,1989.786957,
+ -0.097671,-0.991674,-0.083921,-1.468161,-1077.966399,1989.642356,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ -0.097671,-0.991674,-0.083921,-10.248119,-1077.174828,1990.507106,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.097671,-0.991674,-0.083921,-10.248119,-1077.174828,1990.507106,
+ -0.168431,-0.974672,-0.147124,-209.215453,-1051.797109,1922.192772,
+ -0.097671,-0.991674,-0.083921,-1.468161,-1077.966399,1989.642356,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.097671,-0.991674,-0.083921,-10.248119,-1077.174828,1990.507106,
+ -0.097671,-0.991674,-0.083921,-18.690668,-1076.560038,1993.068126,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.097671,-0.991674,-0.083921,-18.690668,-1076.560038,1993.068126,
+ -0.097671,-0.991674,-0.083921,-26.471367,-1076.145653,1997.226995,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.097671,-0.991674,-0.083921,-26.471367,-1076.145653,1997.226995,
+ -0.097671,-0.991674,-0.083921,-33.291206,-1075.947599,2002.823893,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.097671,-0.991674,-0.083921,-33.291206,-1075.947599,2002.823893,
+ -0.097671,-0.991674,-0.083921,-38.888103,-1075.973486,2009.643732,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.097671,-0.991674,-0.083921,-38.888103,-1075.973486,2009.643732,
+ -0.097931,-0.994307,-0.041998,-39.929753,-1076.03581,2011.592523,
+ -0.973856,-0,0.227168,42.671671,-1075.765755,2025.866979,
+ -0.935939,0,0.352162,40.110651,-976.014545,2017.42443,
+ -0.903939,-0,0.427662,40.110651,-1076.017993,2017.42443,
+ -0.935939,0,0.352162,40.110651,-976.014545,2017.42443,
+ -0.973856,-0,0.227168,42.671671,-1075.765755,2025.866979,
+ -0.986659,-0,0.162803,42.671671,-976.267681,2025.866979,
+ 0.909392,-0.412143,0.056077,784.574342,-324.981333,855.371869,
+ 0.840814,-0.522742,0.140615,699.168033,-467.169144,914.026067,
+ 0.811513,-0.581637,0.056077,706.098253,-471.799769,855.371869,
+ 0.840814,-0.522742,0.140615,699.168033,-467.169144,914.026067,
+ 0.909392,-0.412143,0.056077,784.574342,-324.981333,855.371869,
+ 0.92664,-0.348663,0.140615,776.873894,-321.791703,914.026067,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-925.063958,-94.069882,1614.76108,
+ 0,0,-1,-934.329033,0,1614.76108,
+ 0,0,-1,-925.063958,-94.069882,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-916.376162,-182.278552,1614.76108,
+ 0,0,-1,-916.376162,-182.278552,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-914.651019,-187.965588,1614.76108,
+ 0,0,-1,-914.651019,-187.965588,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-887.227324,-278.369395,1614.76108,
+ 0,0,-1,-887.227324,-278.369395,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-863.20747,-357.552241,1614.76108,
+ 0,0,-1,-863.20747,-357.552241,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-857.607798,-368.02849,1614.76108,
+ 0,0,-1,-857.607798,-368.02849,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-813.095616,-451.304926,1614.76108,
+ 0,0,-1,-813.095616,-451.304926,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-776.866198,-519.085398,1614.76108,
+ 0,0,-1,-776.866198,-519.085398,1614.76108,
+ 0,0,-1,-794.166564,0,1614.76108,
+ 0,0,-1,-778.906876,-154.934211,1614.76108,
+ 0,0,-1,-776.866198,-519.085398,1614.76108,
+ 0,0,-1,-778.906876,-154.934211,1614.76108,
+ 0,0,-1,-733.714234,-303.914386,1614.76108,
+ 0,0,-1,-776.866198,-519.085398,1614.76108,
+ 0,0,-1,-733.714234,-303.914386,1614.76108,
+ 0,0,-1,-765.568614,-532.851545,1614.76108,
+ 0,0,-1,-765.568614,-532.851545,1614.76108,
+ 0,0,-1,-733.714234,-303.914386,1614.76108,
+ 0,0,-1,-705.689426,-605.814546,1614.76108,
+ 0,0,-1,-705.689426,-605.814546,1614.76108,
+ 0,0,-1,-733.714234,-303.914386,1614.76108,
+ 0,0,-1,-660.325365,-441.215303,1614.76108,
+ 0,0,-1,-705.689426,-605.814546,1614.76108,
+ 0,0,-1,-660.325365,-441.215303,1614.76108,
+ 0,0,-1,-660.670395,-660.670395,1614.76108,
+ 0,0,-1,-660.670395,-660.670395,1614.76108,
+ 0,0,-1,-660.325365,-441.215303,1614.76108,
+ 0,0,-1,-642.325255,-675.725862,1614.76108,
+ 0,0,-1,-642.325255,-675.725862,1614.76108,
+ 0,0,-1,-660.325365,-441.215303,1614.76108,
+ 0,0,-1,-561.560563,-561.560563,1614.76108,
+ 0,0,-1,-642.325255,-675.725862,1614.76108,
+ 0,0,-1,-561.560563,-561.560563,1614.76108,
+ 0,0,-1,-569.385752,-735.585765,1614.76108,
+ 0,0,-1,-569.385752,-735.585765,1614.76108,
+ 0,0,-1,-561.560563,-561.560563,1614.76108,
+ 0,0,-1,-519.085398,-776.866198,1614.76108,
+ 0,0,-1,-519.085398,-776.866198,1614.76108,
+ 0,0,-1,-561.560563,-561.560563,1614.76108,
+ 0,0,-1,-441.215303,-660.325365,1614.76108,
+ 0,0,-1,-519.085398,-776.866198,1614.76108,
+ 0,0,-1,-441.215303,-660.325365,1614.76108,
+ 0,0,-1,-492.936329,-790.843167,1614.76108,
+ 0,0,-1,-492.936329,-790.843167,1614.76108,
+ 0,0,-1,-441.215303,-660.325365,1614.76108,
+ 0,0,-1,-409.740279,-835.312382,1614.76108,
+ 0,0,-1,-409.740279,-835.312382,1614.76108,
+ 0,0,-1,-441.215303,-660.325365,1614.76108,
+ 0,0,-1,-303.914386,-733.714234,1614.76108,
+ 0,0,-1,-409.740279,-835.312382,1614.76108,
+ 0,0,-1,-303.914386,-733.714234,1614.76108,
+ 0,0,-1,-357.552241,-863.20747,1614.76108,
+ 0,0,-1,-357.552241,-863.20747,1614.76108,
+ 0,0,-1,-303.914386,-733.714234,1614.76108,
+ 0,0,-1,-323.520318,-873.530941,1614.76108,
+ 0,0,-1,-323.520318,-873.530941,1614.76108,
+ 0,0,-1,-303.914386,-733.714234,1614.76108,
+ 0,0,-1,-233.261862,-900.910544,1614.76108,
+ 0,0,-1,-233.261862,-900.910544,1614.76108,
+ 0,0,-1,-303.914386,-733.714234,1614.76108,
+ 0,0,-1,-154.934211,-778.906876,1614.76108,
+ 0,0,-1,-233.261862,-900.910544,1614.76108,
+ 0,0,-1,-154.934211,-778.906876,1614.76108,
+ 0,0,-1,-182.278552,-916.376162,1614.76108,
+ 0,0,-1,-182.278552,-916.376162,1614.76108,
+ 0,0,-1,-154.934211,-778.906876,1614.76108,
+ 0,0,-1,-141.006395,-920.441115,1614.76108,
+ 0,0,-1,-141.006395,-920.441115,1614.76108,
+ 0,0,-1,-154.934211,-778.906876,1614.76108,
+ 0,0,-1,0,-794.166564,1614.76108,
+ 0,0,-1,-141.006395,-920.441115,1614.76108,
+ 0,0,-1,0,-794.166564,1614.76108,
+ 0,0,-1,-47.148297,-929.685331,1614.76108,
+ 0,0,-1,-47.148297,-929.685331,1614.76108,
+ 0,0,-1,0,-794.166564,1614.76108,
+ 0,0,-1,0,-934.329033,1614.76108,
+ 0,0,-1,0,-934.329033,1614.76108,
+ 0,0,-1,0,-794.166564,1614.76108,
+ 0,0,-1,154.934211,-778.906876,1614.76108,
+ 0,0,-1,0,-934.329033,1614.76108,
+ 0,0,-1,154.934211,-778.906876,1614.76108,
+ 0,0,-1,47.148336,-929.685327,1614.76108,
+ 0,0,-1,47.148336,-929.685327,1614.76108,
+ 0,0,-1,154.934211,-778.906876,1614.76108,
+ 0,0,-1,141.006389,-920.441115,1614.76108,
+ 0,0,-1,141.006389,-920.441115,1614.76108,
+ 0,0,-1,154.934211,-778.906876,1614.76108,
+ 0,0,-1,182.278552,-916.376162,1614.76108,
+ 0,0,-1,182.278552,-916.376162,1614.76108,
+ 0,0,-1,154.934211,-778.906876,1614.76108,
+ 0,0,-1,303.914386,-733.714234,1614.76108,
+ 0,0,-1,182.278552,-916.376162,1614.76108,
+ 0,0,-1,303.914386,-733.714234,1614.76108,
+ 0,0,-1,233.261899,-900.910533,1614.76108,
+ 0,0,-1,233.261899,-900.910533,1614.76108,
+ 0,0,-1,303.914386,-733.714234,1614.76108,
+ 0,0,-1,323.520353,-873.53093,1614.76108,
+ 0,0,-1,323.520353,-873.53093,1614.76108,
+ 0,0,-1,303.914386,-733.714234,1614.76108,
+ 0,0,-1,441.215303,-660.325365,1614.76108,
+ 0,0,-1,323.520353,-873.53093,1614.76108,
+ 0,0,-1,441.215303,-660.325365,1614.76108,
+ 0,0,-1,357.552241,-863.20747,1614.76108,
+ 0,0,-1,357.552241,-863.20747,1614.76108,
+ 0,0,-1,441.215303,-660.325365,1614.76108,
+ 0,0,-1,409.740311,-835.312366,1614.76108,
+ 0,0,-1,409.740311,-835.312366,1614.76108,
+ 0,0,-1,441.215303,-660.325365,1614.76108,
+ 0,0,-1,492.936359,-790.843151,1614.76108,
+ 0,0,-1,492.936359,-790.843151,1614.76108,
+ 0,0,-1,441.215303,-660.325365,1614.76108,
+ 0,0,-1,561.560563,-561.560563,1614.76108,
+ 0,0,-1,492.936359,-790.843151,1614.76108,
+ 0,0,-1,561.560563,-561.560563,1614.76108,
+ 0,0,-1,519.085398,-776.866198,1614.76108,
+ 0,0,-1,519.085398,-776.866198,1614.76108,
+ 0,0,-1,561.560563,-561.560563,1614.76108,
+ 0,0,-1,569.385776,-735.585745,1614.76108,
+ 0,0,-1,569.385776,-735.585745,1614.76108,
+ 0,0,-1,561.560563,-561.560563,1614.76108,
+ 0,0,-1,660.325365,-441.215303,1614.76108,
+ 0,0,-1,569.385776,-735.585745,1614.76108,
+ 0,0,-1,660.325365,-441.215303,1614.76108,
+ 0,0,-1,642.325277,-675.725844,1614.76108,
+ 0,0,-1,642.325277,-675.725844,1614.76108,
+ 0,0,-1,660.325365,-441.215303,1614.76108,
+ 0,0,-1,660.670395,-660.670395,1614.76108,
+ 0,0,-1,660.670395,-660.670395,1614.76108,
+ 0,0,-1,660.325365,-441.215303,1614.76108,
+ 0,0,-1,733.714234,-303.914386,1614.76108,
+ 0,0,-1,660.670395,-660.670395,1614.76108,
+ 0,0,-1,733.714234,-303.914386,1614.76108,
+ 0,0,-1,705.689443,-605.814526,1614.76108,
+ 0,0,-1,705.689443,-605.814526,1614.76108,
+ 0,0,-1,733.714234,-303.914386,1614.76108,
+ 0,0,-1,765.568628,-532.851527,1614.76108,
+ 0,0,-1,765.568628,-532.851527,1614.76108,
+ 0,0,-1,733.714234,-303.914386,1614.76108,
+ 0,0,-1,778.906876,-154.934211,1614.76108,
+ 0,0,-1,765.568628,-532.851527,1614.76108,
+ 0,0,-1,778.906876,-154.934211,1614.76108,
+ 0,0,-1,776.866198,-519.085398,1614.76108,
+ 0,0,-1,776.866198,-519.085398,1614.76108,
+ 0,0,-1,778.906876,-154.934211,1614.76108,
+ 0,0,-1,813.095625,-451.304909,1614.76108,
+ 0,0,-1,813.095625,-451.304909,1614.76108,
+ 0,0,-1,778.906876,-154.934211,1614.76108,
+ 0,0,-1,794.166564,0,1614.76108,
+ 0,0,-1,813.095625,-451.304909,1614.76108,
+ 0,0,-1,794.166564,0,1614.76108,
+ 0,0,-1,934.329033,0,1614.76108,
+ 0,0,-1,813.095625,-451.304909,1614.76108,
+ 0,0,-1,934.329033,0,1614.76108,
+ 0,0,-1,857.607806,-368.028476,1614.76108,
+ 0,0,-1,857.607806,-368.028476,1614.76108,
+ 0,0,-1,934.329033,0,1614.76108,
+ 0,0,-1,863.20747,-357.552241,1614.76108,
+ 0,0,-1,863.20747,-357.552241,1614.76108,
+ 0,0,-1,934.329033,0,1614.76108,
+ 0,0,-1,887.227327,-278.369384,1614.76108,
+ 0,0,-1,887.227327,-278.369384,1614.76108,
+ 0,0,-1,934.329033,0,1614.76108,
+ 0,0,-1,914.651021,-187.96558,1614.76108,
+ 0,0,-1,914.651021,-187.96558,1614.76108,
+ 0,0,-1,934.329033,0,1614.76108,
+ 0,0,-1,925.063958,-94.069878,1614.76108,
+ 0,0,-1,914.651021,-187.96558,1614.76108,
+ 0,0,-1,925.063958,-94.069878,1614.76108,
+ 0,0,-1,916.376162,-182.278552,1614.76108,
+ 0.798598,-0.532672,-0.280182,694.940121,-464.344144,738.078199,
+ 0.918011,-0.379912,-0.113678,782.993204,-324.326404,796.15315,
+ 0.826255,-0.551707,-0.113678,704.675266,-470.848959,796.15315,
+ 0.918011,-0.379912,-0.113678,782.993204,-324.326404,796.15315,
+ 0.798598,-0.532672,-0.280182,694.940121,-464.344144,738.078199,
+ 0.887172,-0.366638,-0.280182,772.17609,-319.845809,738.078199,
+ -0.358504,-0.819473,0.447144,-303.914386,-733.714234,1614.76108,
+ -0.422036,-0.789573,0.445488,-389.246833,-793.533662,1427.89836,
+ -0.342282,-0.826343,0.447214,-339.66902,-820.033555,1427.89836,
+ -0.422036,-0.789573,0.445488,-389.246833,-793.533662,1427.89836,
+ -0.358504,-0.819473,0.447144,-303.914386,-733.714234,1614.76108,
+ -0.422036,-0.789573,0.445488,-468.281767,-751.288609,1427.89836,
+ -0.422036,-0.789573,0.445488,-468.281767,-751.288609,1427.89836,
+ -0.511487,-0.733787,0.447144,-441.215303,-660.325365,1614.76108,
+ -0.496917,-0.743689,0.447214,-493.122985,-738.010701,1427.89836,
+ -0.511487,-0.733787,0.447144,-441.215303,-660.325365,1614.76108,
+ -0.422036,-0.789573,0.445488,-468.281767,-751.288609,1427.89836,
+ -0.358504,-0.819473,0.447144,-303.914386,-733.714234,1614.76108,
+ -0.707107,0,-0.707107,30.354884,-1076.33078,2066.469982,
+ -0.83147,0,-0.55557,35.951781,-976.024878,2059.650143,
+ -0.849252,-0,-0.527988,35.951781,-1076.356667,2059.650143,
+ -0.83147,0,-0.55557,35.951781,-976.024878,2059.650143,
+ -0.707107,0,-0.707107,30.354884,-1076.33078,2066.469982,
+ -0.707107,0,-0.707107,30.354884,-976.167886,2066.469982,
+ -0.55557,0,-0.83147,23.535045,-976.504549,2072.06688,
+ -0.707107,0,-0.707107,30.354884,-1076.33078,2066.469982,
+ -0.55557,0,-0.83147,23.535045,-1076.528834,2072.06688,
+ -0.707107,0,-0.707107,30.354884,-1076.33078,2066.469982,
+ -0.55557,0,-0.83147,23.535045,-976.504549,2072.06688,
+ -0.707107,0,-0.707107,30.354884,-976.167886,2066.469982,
+ -0.705651,-0.708302,0.019122,-758.928833,-874.671572,1963.870632,
+ -0.705651,-0.708302,0.019122,-785.140115,-848.157193,1978.730924,
+ -0.705651,-0.708302,0.019122,-801.544846,-831.814429,1978.709589,
+ -0.705651,-0.708302,0.019122,-785.140115,-848.157193,1978.730924,
+ -0.705651,-0.708302,0.019122,-758.928833,-874.671572,1963.870632,
+ -0.705651,-0.708302,0.019122,-741.432258,-891.447302,1988.145993,
+ -0.705651,-0.708302,0.019122,-785.140115,-848.157193,1978.730924,
+ -0.705651,-0.708302,0.019122,-741.432258,-891.447302,1988.145993,
+ -0.705651,-0.708302,0.019122,-769.870311,-863.13013,1987.610439,
+ -0.705651,-0.708302,0.019122,-769.870311,-863.13013,1987.610439,
+ -0.705651,-0.708302,0.019122,-741.432258,-891.447302,1988.145993,
+ -0.705651,-0.708302,0.019122,-758.060123,-874.453748,2003.996308,
+ -0.705651,-0.708302,0.019122,-758.060123,-874.453748,2003.996308,
+ -0.705651,-0.708302,0.019122,-741.432258,-891.447302,1988.145993,
+ -0.705651,-0.708302,0.019122,-731.724734,-900.26268,2019.846175,
+ -0.705651,-0.708302,0.019122,-758.060123,-874.453748,2003.996308,
+ -0.705651,-0.708302,0.019122,-731.724734,-900.26268,2019.846175,
+ -0.705651,-0.708302,0.019122,-751.507545,-880.404128,2025.39393,
+ -0.705651,-0.708302,0.019122,-751.507545,-880.404128,2025.39393,
+ -0.705651,-0.708302,0.019122,-731.724734,-900.26268,2019.846175,
+ -0.705651,-0.708302,0.019122,-731.284145,-899.775643,2054.145111,
+ -0.705651,-0.708302,0.019122,-751.507545,-880.404128,2025.39393,
+ -0.705651,-0.708302,0.019122,-731.284145,-899.775643,2054.145111,
+ -0.705651,-0.708302,0.019122,-751.210147,-880.075378,2048.545713,
+ -0.705651,-0.708302,0.019122,-751.210147,-880.075378,2048.545713,
+ -0.705651,-0.708302,0.019122,-731.284145,-899.775643,2054.145111,
+ -0.705651,-0.708302,0.019122,-757.213206,-873.517548,2069.927006,
+ -0.705651,-0.708302,0.019122,-757.213206,-873.517548,2069.927006,
+ -0.705651,-0.708302,0.019122,-731.284145,-899.775643,2054.145111,
+ -0.705651,-0.708302,0.019122,-740.177565,-890.06034,2085.821102,
+ -0.705651,-0.708302,0.019122,-757.213206,-873.517548,2069.927006,
+ -0.705651,-0.708302,0.019122,-740.177565,-890.06034,2085.821102,
+ -0.705651,-0.708302,0.019122,-768.60281,-861.729009,2086.282702,
+ -0.705651,-0.708302,0.019122,-768.60281,-861.729009,2086.282702,
+ -0.705651,-0.708302,0.019122,-740.177565,-890.06034,2085.821102,
+ -0.705651,-0.708302,0.019122,-757.051053,-872.595836,2110.051763,
+ -0.705651,-0.708302,0.019122,-768.60281,-861.729009,2086.282702,
+ -0.705651,-0.708302,0.019122,-757.051053,-872.595836,2110.051763,
+ -0.705651,-0.708302,0.019122,-783.644995,-846.504457,2095.122795,
+ -0.705651,-0.708302,0.019122,-783.644995,-846.504457,2095.122795,
+ -0.705651,-0.708302,0.019122,-757.051053,-872.595836,2110.051763,
+ -0.705651,-0.708302,0.019122,-826.261008,-803.647314,2109.961752,
+ -0.705651,-0.708302,0.019122,-826.261008,-803.647314,2109.961752,
+ -0.705651,-0.708302,0.019122,-757.051053,-872.595836,2110.051763,
+ -0.705651,-0.708302,0.019122,-803.639077,-825.829444,2123.116588,
+ -0.705651,-0.708302,0.019122,-803.639077,-825.829444,2123.116588,
+ -0.705651,-0.708302,0.019122,-757.051053,-872.595836,2110.051763,
+ -0.705651,-0.708302,0.019122,-779.335772,-850.040945,2123.148196,
+ -0.705651,-0.708302,0.019122,-781.550765,-852.489443,1950.715796,
+ -0.705651,-0.708302,0.019122,-828.138788,-805.72305,1963.780621,
+ -0.705651,-0.708302,0.019122,-805.854069,-828.277941,1950.684188,
+ -0.705651,-0.708302,0.019122,-828.138788,-805.72305,1963.780621,
+ -0.705651,-0.708302,0.019122,-781.550765,-852.489443,1950.715796,
+ -0.705651,-0.708302,0.019122,-758.928833,-874.671572,1963.870632,
+ -0.705651,-0.708302,0.019122,-828.138788,-805.72305,1963.780621,
+ -0.705651,-0.708302,0.019122,-758.928833,-874.671572,1963.870632,
+ -0.705651,-0.708302,0.019122,-845.012276,-788.258547,1988.011282,
+ -0.705651,-0.708302,0.019122,-845.012276,-788.258547,1988.011282,
+ -0.705651,-0.708302,0.019122,-758.928833,-874.671572,1963.870632,
+ -0.705651,-0.708302,0.019122,-801.544846,-831.814429,1978.709589,
+ -0.705651,-0.708302,0.019122,-845.012276,-788.258547,1988.011282,
+ -0.705651,-0.708302,0.019122,-801.544846,-831.814429,1978.709589,
+ -0.705651,-0.708302,0.019122,-816.587031,-816.589878,1987.549682,
+ -0.705651,-0.708302,0.019122,-845.012276,-788.258547,1988.011282,
+ -0.705651,-0.708302,0.019122,-816.587031,-816.589878,1987.549682,
+ -0.705651,-0.708302,0.019122,-827.976635,-804.801338,2003.905378,
+ -0.705651,-0.708302,0.019122,-845.012276,-788.258547,1988.011282,
+ -0.705651,-0.708302,0.019122,-827.976635,-804.801338,2003.905378,
+ -0.705651,-0.708302,0.019122,-853.905696,-778.543243,2019.687273,
+ -0.705651,-0.708302,0.019122,-853.905696,-778.543243,2019.687273,
+ -0.705651,-0.708302,0.019122,-827.976635,-804.801338,2003.905378,
+ -0.705651,-0.708302,0.019122,-833.979694,-798.243508,2025.286671,
+ -0.705651,-0.708302,0.019122,-853.905696,-778.543243,2019.687273,
+ -0.705651,-0.708302,0.019122,-833.979694,-798.243508,2025.286671,
+ -0.705651,-0.708302,0.019122,-853.465107,-778.056207,2053.98621,
+ -0.705651,-0.708302,0.019122,-853.465107,-778.056207,2053.98621,
+ -0.705651,-0.708302,0.019122,-833.979694,-798.243508,2025.286671,
+ -0.705651,-0.708302,0.019122,-833.682296,-797.914759,2048.438454,
+ -0.705651,-0.708302,0.019122,-853.465107,-778.056207,2053.98621,
+ -0.705651,-0.708302,0.019122,-833.682296,-797.914759,2048.438454,
+ -0.705651,-0.708302,0.019122,-827.129718,-803.865138,2069.836076,
+ -0.705651,-0.708302,0.019122,-853.465107,-778.056207,2053.98621,
+ -0.705651,-0.708302,0.019122,-827.129718,-803.865138,2069.836076,
+ -0.705651,-0.708302,0.019122,-843.757583,-786.871584,2085.686391,
+ -0.705651,-0.708302,0.019122,-843.757583,-786.871584,2085.686391,
+ -0.705651,-0.708302,0.019122,-827.129718,-803.865138,2069.836076,
+ -0.705651,-0.708302,0.019122,-815.31953,-815.188756,2086.221945,
+ -0.705651,-0.708302,0.019122,-843.757583,-786.871584,2085.686391,
+ -0.705651,-0.708302,0.019122,-815.31953,-815.188756,2086.221945,
+ -0.705651,-0.708302,0.019122,-826.261008,-803.647314,2109.961752,
+ -0.705651,-0.708302,0.019122,-826.261008,-803.647314,2109.961752,
+ -0.705651,-0.708302,0.019122,-815.31953,-815.188756,2086.221945,
+ -0.705651,-0.708302,0.019122,-800.049726,-830.161694,2095.10146,
+ -0.705651,-0.708302,0.019122,-826.261008,-803.647314,2109.961752,
+ -0.705651,-0.708302,0.019122,-800.049726,-830.161694,2095.10146,
+ -0.705651,-0.708302,0.019122,-783.644995,-846.504457,2095.122795,
+ 0.986659,-0,0.162803,-45.607992,-975.978478,2025.866979,
+ 0.999806,0,-0.019694,-46.472742,-1075.391382,2034.646937,
+ 0.973856,0,0.227168,-45.607992,-1075.476552,2025.866979,
+ 0.999806,0,-0.019694,-46.472742,-1075.391382,2034.646937,
+ 0.986659,-0,0.162803,-45.607992,-975.978478,2025.866979,
+ 1,0,0,-46.472742,-976.41888,2034.646937,
+ 0,0.986659,-0.162803,180.675225,-1011.80212,2078.49259,
+ 0,0.999462,-0.032813,653.750225,-1016.065853,2035.202177,
+ 0,0.999462,0.032813,180.675225,-1016.065853,2035.202177,
+ 0,0.999462,-0.032813,653.750225,-1016.065853,2035.202177,
+ 0,0.986659,-0.162803,180.675225,-1011.80212,2078.49259,
+ 0,0.973856,-0.227168,653.750225,-1011.80212,2078.49259,
+ 0,-0.707107,-0.707107,653.750225,-966.763694,1862.604996,
+ 0.14518,-0.877819,-0.456461,406.150723,-980.534583,1879.384872,
+ 0,-0.707107,-0.707107,422.745208,-966.763694,1862.604996,
+ 0.14518,-0.877819,-0.456461,406.150723,-980.534583,1879.384872,
+ 0,-0.707107,-0.707107,653.750225,-966.763694,1862.604996,
+ 0,-0.812792,-0.582554,653.750225,-997.119327,1899.593442,
+ 0.14518,-0.877819,-0.456461,406.150723,-980.534583,1879.384872,
+ 0,-0.812792,-0.582554,653.750225,-997.119327,1899.593442,
+ 0.115001,-0.89802,-0.424659,369.41032,-997.119327,1899.593442,
+ 0,-0.19509,-0.980785,653.750225,-841.785968,1795.80301,
+ 0,-0.227168,-0.973856,600.307476,-841.785968,1795.80301,
+ 0,-0.098017,-0.995185,653.750225,-795.278099,1791.222384,
+ -0.352162,0,-0.935939,15.754347,-977.02193,2076.225749,
+ -0.227168,0,-0.973856,7.311798,-1077.55801,2078.786769,
+ -0.162803,-0,-0.986659,7.311798,-977.700144,2078.786769,
+ -0.227168,0,-0.973856,7.311798,-1077.55801,2078.786769,
+ -0.352162,0,-0.935939,15.754347,-977.02193,2076.225749,
+ -0.412792,0,-0.910825,15.754347,-1076.943219,2076.225749,
+ -0.000463,-0.985777,0.168059,0,-1072.403033,2148.211628,
+ -0.097671,-0.991674,0.083921,-1.468161,-1078.060378,2079.651519,
+ 0.032696,-0.995906,0.084279,0,-1078.217216,2079.506918,
+ -0.097671,-0.991674,0.083921,-38.888103,-1076.067465,2059.650143,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.097931,-0.994307,0.041998,-39.336165,-1076.094273,2058.811877,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.097671,-0.991674,0.083921,-38.888103,-1076.067465,2059.650143,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.097671,-0.991674,0.083921,-38.888103,-1076.067465,2059.650143,
+ -0.097671,-0.991674,0.083921,-33.291206,-1076.041578,2066.469982,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.097671,-0.991674,0.083921,-33.291206,-1076.041578,2066.469982,
+ -0.097671,-0.991674,0.083921,-26.471367,-1076.239632,2072.06688,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.097671,-0.991674,0.083921,-26.471367,-1076.239632,2072.06688,
+ -0.097671,-0.991674,0.083921,-18.690668,-1076.654017,2076.225749,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.097671,-0.991674,0.083921,-18.690668,-1076.654017,2076.225749,
+ -0.097671,-0.991674,0.083921,-10.248119,-1077.268807,2078.786769,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.097671,-0.991674,0.083921,-10.248119,-1077.268807,2078.786769,
+ -0.097671,-0.991674,0.083921,-1.468161,-1078.060378,2079.651519,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.097671,-0.991674,0.083921,-1.468161,-1078.060378,2079.651519,
+ -0.000463,-0.985777,0.168059,0,-1072.403033,2148.211628,
+ -0.75819,-0.62223,-0.19488,-761.987077,-753.814953,1922.192772,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.684548,-0.684548,-0.250574,-757.858868,-757.858868,1919.763614,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.75819,-0.62223,-0.19488,-761.987077,-753.814953,1922.192772,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.785009,-0.523429,-0.331336,-868.041423,-580.006736,1812.397596,
+ -0,-0.894427,0.447214,0,-794.166564,1614.76108,
+ -0.087754,-0.890977,0.445488,-44.790103,-883.186483,1427.89836,
+ -0,-0.894427,0.447214,0,-887.597924,1427.89836,
+ -0.087754,-0.890977,0.445488,-44.790103,-883.186483,1427.89836,
+ -0.191744,-0.873668,0.447144,-154.934211,-778.906876,1614.76108,
+ -0.174494,-0.877241,0.447214,-173.161765,-870.542978,1427.89836,
+ -0.191744,-0.873668,0.447144,-154.934211,-778.906876,1614.76108,
+ -0.087754,-0.890977,0.445488,-44.790103,-883.186483,1427.89836,
+ -0,-0.894427,0.447214,0,-794.166564,1614.76108,
+ -0.029352,-0.894042,0.447021,0,-747.450884,1427.89836,
+ -0.145631,-0.882589,0.447021,-164.047988,-824.724927,1241.03564,
+ 0.029352,-0.894042,0.447021,0,-840.882244,1241.03564,
+ -0.145631,-0.882589,0.447021,-164.047988,-824.724927,1241.03564,
+ -0.029352,-0.894042,0.447021,0,-747.450884,1427.89836,
+ -0.203207,-0.871137,0.447021,-145.820434,-733.088824,1427.89836,
+ -0.632155,-0.770284,-0.083921,-702.965588,-809.153242,1972.08037,
+ -0.632155,-0.770284,-0.083921,-746.546206,-772.245717,1961.599842,
+ -0.632155,-0.770284,-0.083921,-723.636295,-790.983771,1961.015863,
+ -0.632155,-0.770284,-0.083921,-746.546206,-772.245717,1961.599842,
+ -0.632155,-0.770284,-0.083921,-702.965588,-809.153242,1972.08037,
+ -0.704588,-0.704588,-0.084324,-761.145932,-761.145932,1969.694508,
+ -0.704588,-0.704588,-0.084324,-761.145932,-761.145932,1969.694508,
+ -0.632155,-0.770284,-0.083921,-702.965588,-809.153242,1972.08037,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.632155,-0.770284,-0.083921,-702.965588,-809.153242,1972.08037,
+ -0.632155,-0.770284,-0.083921,-687.957453,-823.760435,1993.102587,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.632155,-0.770284,-0.083921,-687.957453,-823.760435,1993.102587,
+ -0.633834,-0.772328,-0.041998,-683.32915,-829.573232,2011.592523,
+ -0.000913,-0.943512,0.331336,0,-1043.984543,2258.006804,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.000463,-0.985777,0.168059,0,-1072.403033,2148.211628,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.000913,-0.943512,0.331336,0,-1043.984543,2258.006804,
+ -0.184965,-0.925205,0.331336,-203.671281,-1023.924672,2258.006804,
+ -0.10232,-0.445425,-0.889453,-712.20051,-793.069744,1912.981477,
+ 0.071382,-0.616271,-0.784292,-758.928833,-874.671572,1963.870632,
+ -0.188016,-0.3607,-0.913535,-781.550765,-852.489443,1950.715796,
+ 0.071382,-0.616271,-0.784292,-758.928833,-874.671572,1963.870632,
+ -0.10232,-0.445425,-0.889453,-712.20051,-793.069744,1912.981477,
+ -0.016378,-0.522321,-0.852592,-697.040319,-808.580815,1922.192772,
+ 0.071382,-0.616271,-0.784292,-758.928833,-874.671572,1963.870632,
+ -0.016378,-0.522321,-0.852592,-697.040319,-808.580815,1922.192772,
+ 0.093452,-0.638076,-0.764282,-679.407718,-824.046894,1931.329012,
+ -0.098017,-0,0.995185,0,-1078.123237,1989.786957,
+ -0.032813,-0,0.999462,-1.468161,-978.157452,1989.642356,
+ 0.032813,0,0.999462,-1.468161,-1077.966399,1989.642356,
+ -0.032813,-0,0.999462,-1.468161,-978.157452,1989.642356,
+ -0.098017,-0,0.995185,0,-1078.123237,1989.786957,
+ -0.098017,-0,0.995185,0,-978.310709,1989.786957,
+ -0.098017,-0,0.995185,0,-978.310709,1989.786957,
+ -0.098017,-0,0.995185,0,-1078.123237,1989.786957,
+ -0.162803,-0,0.986659,7.311798,-977.633668,1990.507106,
+ -0.162803,-0,0.986659,7.311798,-977.633668,1990.507106,
+ -0.098017,-0,0.995185,0,-1078.123237,1989.786957,
+ -0.227168,-0,0.973856,7.311798,-1077.464031,1990.507106,
+ 0.587181,-0.587181,0.557168,660.670395,-660.670395,2455.64332,
+ 0.51982,-0.710547,0.474247,554.192058,-829.407027,2361.464898,
+ 0.62118,-0.639379,0.453133,705.352697,-705.352697,2361.464898,
+ 0.51982,-0.710547,0.474247,554.192058,-829.407027,2361.464898,
+ 0.587181,-0.587181,0.557168,660.670395,-660.670395,2455.64332,
+ 0.438515,-0.705336,0.556961,519.085398,-776.866198,2455.64332,
+ 0,0,1,519.085398,-776.866198,2455.64332,
+ 0,0,1,660.670395,-660.670395,2455.64332,
+ 0,0,1,642.325277,-675.725844,2455.64332,
+ 0,0,-1,519.085398,-776.866198,2455.64332,
+ 0,0,-1,642.325277,-675.725844,2455.64332,
+ 0,0,-1,569.385776,-735.585746,2455.64332,
+ 0.832671,-0.532692,0.151323,891.670534,-595.795203,2148.211628,
+ 0.75819,-0.62223,0.19488,884.794335,-604.173876,2148.211628,
+ 0.828508,-0.553591,0.084324,892.684338,-596.472605,2133.803565,
+ 0.665498,-0.684813,0.29689,738.20855,-738.20855,2258.006804,
+ 0.61434,-0.748575,0.249443,724.871896,-750.8761,2252.837783,
+ 0.684548,-0.684548,0.250574,739.77113,-739.77113,2249.469127,
+ 0.61434,-0.748575,0.249443,724.871896,-750.8761,2252.837783,
+ 0.665498,-0.684813,0.29689,738.20855,-738.20855,2258.006804,
+ 0.61434,-0.748575,0.249443,670.391152,-794.166513,2257.101517,
+ 0.61434,-0.748575,0.249443,670.391152,-794.166513,2257.101517,
+ 0.598874,-0.72973,0.329915,653.750225,-807.521706,2258.006804,
+ 0.61434,-0.748575,0.249443,653.750225,-808.286792,2255.71079,
+ 0.598874,-0.72973,0.329915,653.750225,-807.521706,2258.006804,
+ 0.61434,-0.748575,0.249443,670.391152,-794.166513,2257.101517,
+ 0.665498,-0.684813,0.29689,738.20855,-738.20855,2258.006804,
+ 0.401793,-0.915697,0.007841,-644.00684,-861.844218,2011.592523,
+ 0.392989,-0.915858,-0.082244,-731.724734,-900.26268,2019.846175,
+ 0.37075,-0.899004,-0.2331,-643.970452,-861.831591,2011.202527,
+ 0.392989,-0.915858,-0.082244,-731.724734,-900.26268,2019.846175,
+ 0.401793,-0.915697,0.007841,-644.00684,-861.844218,2011.592523,
+ 0.401793,-0.915697,0.007841,-644.327894,-861.580736,2058.811877,
+ 0.392989,-0.915858,-0.082244,-731.724734,-900.26268,2019.846175,
+ 0.401793,-0.915697,0.007841,-644.327894,-861.580736,2058.811877,
+ 0.392379,-0.910791,0.128444,-731.284145,-899.775643,2054.145111,
+ 0.392379,-0.910791,0.128444,-731.284145,-899.775643,2054.145111,
+ 0.401793,-0.915697,0.007841,-644.327894,-861.580736,2058.811877,
+ 0.376942,-0.89216,0.24893,-644.282481,-861.55593,2059.381644,
+ -0.36191,-0.871342,0.331336,-399.515588,-964.515951,2258.006804,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.377668,-0.910562,0.168059,-410.390874,-990.771213,2148.211628,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.36191,-0.871342,0.331336,-399.515588,-964.515951,2258.006804,
+ -0.538332,-0.779667,0.319873,-580.006736,-868.041423,2258.006804,
+ 0.826255,-0.551707,-0.113678,704.675266,-470.848959,796.15315,
+ 0.909392,-0.412143,0.056077,784.574342,-324.981333,855.371869,
+ 0.811513,-0.581637,0.056077,706.098253,-471.799769,855.371869,
+ 0.909392,-0.412143,0.056077,784.574342,-324.981333,855.371869,
+ 0.826255,-0.551707,-0.113678,704.675266,-470.848959,796.15315,
+ 0.918011,-0.379912,-0.113678,782.993204,-324.326404,796.15315,
+ 0.887172,-0.366638,-0.280182,772.17609,-319.845809,738.078199,
+ 0.974489,-0.193517,-0.113678,831.221151,-165.340167,796.15315,
+ 0.918011,-0.379912,-0.113678,782.993204,-324.326404,796.15315,
+ 0.974489,-0.193517,-0.113678,831.221151,-165.340167,796.15315,
+ 0.887172,-0.366638,-0.280182,772.17609,-319.845809,738.078199,
+ 0.941653,-0.186514,-0.280182,819.737765,-163.055979,738.078199,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.098017,-0.995185,0,40.110651,-1076.017993,2017.42443,
+ 0.097931,-0.994307,-0.041998,36.993432,-1076.325013,2011.592523,
+ 0.098017,-0.995185,0,40.110651,-1076.017993,2017.42443,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.098017,-0.995185,0,40.110651,-1076.017993,2017.42443,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.098017,-0.995185,-0,42.671671,-1075.765755,2025.866979,
+ 0.098017,-0.995185,-0,42.671671,-1075.765755,2025.866979,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.098017,-0.995185,-0,43.536421,-1075.680584,2034.646937,
+ 0.098017,-0.995185,-0,43.536421,-1075.680584,2034.646937,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.098017,-0.995185,0,42.671671,-1075.765755,2043.426896,
+ 0.098017,-0.995185,0,42.671671,-1075.765755,2043.426896,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.098017,-0.995185,-0,40.110651,-1076.017993,2051.869445,
+ 0.098017,-0.995185,-0,40.110651,-1076.017993,2051.869445,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.097863,-0.993624,0.055991,36.399844,-1076.383476,2058.811877,
+ 0.80808,-0.541317,-0.232341,-833.682296,-797.914759,2048.438454,
+ 0.706214,-0.448152,-0.548107,-781.183382,-739.911027,2076.744949,
+ 0.706214,-0.448152,-0.548107,-827.129718,-803.865138,2069.836076,
+ 0.706214,-0.448152,-0.548107,-781.183382,-739.911027,2076.744949,
+ 0.80808,-0.541317,-0.232341,-833.682296,-797.914759,2048.438454,
+ 0.770593,-0.512719,-0.378558,-786.924742,-735.296195,2058.807508,
+ 0.770593,-0.512719,-0.378558,-786.924742,-735.296195,2058.807508,
+ 0.80808,-0.541317,-0.232341,-833.682296,-797.914759,2048.438454,
+ 0.814584,-0.546562,-0.194222,-789.342859,-732.349615,2049.894341,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.014463,-0.987633,-0.156114,0,-1072.403033,1922.192772,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.014463,-0.987633,-0.156114,0,-1072.403033,1922.192772,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.097671,-0.991674,-0.083921,7.311798,-1077.464031,1990.507106,
+ 0.014463,-0.987633,-0.156114,0,-1072.403033,1922.192772,
+ 0.097671,-0.991674,-0.083921,7.311798,-1077.464031,1990.507106,
+ -0.032696,-0.995906,-0.084279,0,-1078.123237,1989.786957,
+ 0.097671,-0.991674,-0.083921,7.311798,-1077.464031,1990.507106,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.097671,-0.991674,-0.083921,15.754347,-1076.84924,1993.068126,
+ 0.097671,-0.991674,-0.083921,15.754347,-1076.84924,1993.068126,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.097671,-0.991674,-0.083921,23.535045,-1076.434855,1997.226995,
+ 0.097671,-0.991674,-0.083921,23.535045,-1076.434855,1997.226995,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.097671,-0.991674,-0.083921,30.354884,-1076.236801,2002.823893,
+ 0.097671,-0.991674,-0.083921,30.354884,-1076.236801,2002.823893,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.097671,-0.991674,-0.083921,35.951781,-1076.262688,2009.643732,
+ 0.097671,-0.991674,-0.083921,35.951781,-1076.262688,2009.643732,
+ 0.167148,-0.984089,-0.060252,210.691412,-1059.217255,2011.592523,
+ 0.097931,-0.994307,-0.041998,36.993432,-1076.325013,2011.592523,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.382396,-0.923034,0.0422,-413.286071,-997.760837,2058.811877,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.382396,-0.923034,0.0422,-413.286071,-997.760837,2058.811877,
+ -0.145329,-0.981317,0.126081,-209.215453,-1051.797109,2148.211628,
+ -0.377668,-0.910562,0.168059,-410.390874,-990.771213,2148.211628,
+ -0.369253,-0.814754,0.447021,-268.159753,-647.394912,1241.03564,
+ -0.472298,-0.759676,0.447021,-441.215303,-660.325365,1054.17292,
+ -0.315017,-0.837219,0.447021,-303.914386,-733.714234,1054.17292,
+ -0.472298,-0.759676,0.447021,-441.215303,-660.325365,1054.17292,
+ -0.369253,-0.814754,0.447021,-268.159753,-647.394912,1241.03564,
+ -0.521108,-0.727062,0.447021,-389.30762,-582.640028,1241.03564,
+ 0.941653,-0.186514,-0.280182,819.737765,-163.055979,738.078199,
+ 0.985217,-0.097035,-0.141176,847.505736,0,796.15315,
+ 0.974489,-0.193517,-0.113678,831.221151,-165.340167,796.15315,
+ 0.985217,-0.097035,-0.141176,847.505736,0,796.15315,
+ 0.941653,-0.186514,-0.280182,819.737765,-163.055979,738.078199,
+ 0.947451,-0.093316,-0.305988,835.797377,0,738.078199,
+ -0.019694,-0.599883,0.799845,0,-840.882244,914.026067,
+ -0.097715,-0.592199,0.799845,-127.592879,-641.452722,1054.17292,
+ -0.136347,-0.584514,0.799845,-164.047988,-824.724927,914.026067,
+ -0.097715,-0.592199,0.799845,-127.592879,-641.452722,1054.17292,
+ -0.019694,-0.599883,0.799845,0,-840.882244,914.026067,
+ 0.019694,-0.599883,0.799845,0,-654.019524,1054.17292,
+ 1,0,0,653.750225,-1033.56568,1987.582722,
+ 1,0,0,653.750225,-1033.56568,2082.821632,
+ 1,0,0,653.750225,-1038.255787,2035.202177,
+ 1,0,0,653.750225,-1033.56568,2082.821632,
+ 1,0,0,653.750225,-1033.56568,1987.582722,
+ 1,0,0,653.750225,-1019.675597,1941.793256,
+ 1,0,0,653.750225,-1033.56568,2082.821632,
+ 1,0,0,653.750225,-1019.675597,1941.793256,
+ 1,0,0,653.750225,-1019.675597,2128.611098,
+ 1,0,0,653.750225,-1019.675597,2128.611098,
+ 1,0,0,653.750225,-1019.675597,1941.793256,
+ 1,0,0,653.750225,-1016.065853,2035.202177,
+ 1,0,0,653.750225,-1016.065853,2035.202177,
+ 1,0,0,653.750225,-1019.675597,1941.793256,
+ 1,0,0,653.750225,-1011.80212,1991.911763,
+ 1,0,0,653.750225,-1011.80212,1991.911763,
+ 1,0,0,653.750225,-1019.675597,1941.793256,
+ 1,0,0,653.750225,-997.119327,1899.593442,
+ 1,0,0,653.750225,-1011.80212,1991.911763,
+ 1,0,0,653.750225,-997.119327,1899.593442,
+ 1,0,0,653.750225,-999.174772,1950.284976,
+ 1,0,0,653.750225,-999.174772,1950.284976,
+ 1,0,0,653.750225,-997.119327,1899.593442,
+ 1,0,0,653.750225,-978.669071,1911.921509,
+ 1,0,0,653.750225,-978.669071,1911.921509,
+ 1,0,0,653.750225,-997.119327,1899.593442,
+ 1,0,0,653.750225,-966.763694,1862.604996,
+ 1,0,0,653.750225,-978.669071,1911.921509,
+ 1,0,0,653.750225,-966.763694,1862.604996,
+ 1,0,0,653.750225,-951.073041,1878.295649,
+ 1,0,0,653.750225,-951.073041,1878.295649,
+ 1,0,0,653.750225,-966.763694,1862.604996,
+ 1,0,0,653.750225,-929.775248,1832.249363,
+ 1,0,0,653.750225,-951.073041,1878.295649,
+ 1,0,0,653.750225,-929.775248,1832.249363,
+ 1,0,0,653.750225,-917.447181,1850.699619,
+ 1,0,0,653.750225,-917.447181,1850.699619,
+ 1,0,0,653.750225,-929.775248,1832.249363,
+ 1,0,0,653.750225,-887.575434,1809.693092,
+ 1,0,0,653.750225,-917.447181,1850.699619,
+ 1,0,0,653.750225,-887.575434,1809.693092,
+ 1,0,0,653.750225,-879.083714,1830.193918,
+ 1,0,0,653.750225,-879.083714,1830.193918,
+ 1,0,0,653.750225,-887.575434,1809.693092,
+ 1,0,-0,653.750225,-841.785968,1795.80301,
+ 1,0,0,653.750225,-879.083714,1830.193918,
+ 1,0,-0,653.750225,-841.785968,1795.80301,
+ 1,0,0,653.750225,-837.456927,1817.56657,
+ 1,0,0,653.750225,-837.456927,1817.56657,
+ 1,0,-0,653.750225,-841.785968,1795.80301,
+ 1,0,-0,653.750225,-795.278099,1791.222384,
+ 1,0,0,653.750225,-837.456927,1817.56657,
+ 1,0,-0,653.750225,-795.278099,1791.222384,
+ 1,0,0,653.750225,-807.521706,1812.397596,
+ 1,0,0,653.750225,-837.456927,1817.56657,
+ 1,0,0,653.750225,-807.521706,1812.397596,
+ 1,0,0,653.750225,-808.286776,1814.693561,
+ 1,0,0,653.750225,-1019.675597,2128.611098,
+ 1,0,0,653.750225,-1011.80212,2078.49259,
+ 1,0,0,653.750225,-997.119327,2170.810911,
+ 1,0,0,653.750225,-1011.80212,2078.49259,
+ 1,0,0,653.750225,-1019.675597,2128.611098,
+ 1,0,0,653.750225,-1016.065853,2035.202177,
+ 1,0,0,653.750225,-997.119327,2170.810911,
+ 1,0,0,653.750225,-1011.80212,2078.49259,
+ 1,0,0,653.750225,-999.174772,2120.119378,
+ 1,0,0,653.750225,-997.119327,2170.810911,
+ 1,0,0,653.750225,-999.174772,2120.119378,
+ 1,0,0,653.750225,-978.669071,2158.482845,
+ 1,0,0,653.750225,-997.119327,2170.810911,
+ 1,0,0,653.750225,-978.669071,2158.482845,
+ 1,0,0,653.750225,-966.763694,2207.799357,
+ 1,0,0,653.750225,-966.763694,2207.799357,
+ 1,0,0,653.750225,-978.669071,2158.482845,
+ 1,0,0,653.750225,-951.073041,2192.108705,
+ 1,0,0,653.750225,-966.763694,2207.799357,
+ 1,0,0,653.750225,-951.073041,2192.108705,
+ 1,0,0,653.750225,-929.775248,2238.154991,
+ 1,0,0,653.750225,-929.775248,2238.154991,
+ 1,0,0,653.750225,-951.073041,2192.108705,
+ 1,0,0,653.750225,-917.447181,2219.704735,
+ 1,0,0,653.750225,-929.775248,2238.154991,
+ 1,0,0,653.750225,-917.447181,2219.704735,
+ 1,0,0,653.750225,-887.575434,2260.711261,
+ 1,0,0,653.750225,-887.575434,2260.711261,
+ 1,0,0,653.750225,-917.447181,2219.704735,
+ 1,0,0,653.750225,-879.083714,2240.210435,
+ 1,0,0,653.750225,-887.575434,2260.711261,
+ 1,0,0,653.750225,-879.083714,2240.210435,
+ 1,0,0,653.750225,-841.785968,2274.601344,
+ 1,0,0,653.750225,-841.785968,2274.601344,
+ 1,0,0,653.750225,-879.083714,2240.210435,
+ 1,0,0,653.750225,-837.456927,2252.837783,
+ 1,0,0,653.750225,-841.785968,2274.601344,
+ 1,0,0,653.750225,-837.456927,2252.837783,
+ 1,0,0,653.750225,-795.278128,2279.181966,
+ 1,0,0,653.750225,-795.278128,2279.181966,
+ 1,0,0,653.750225,-837.456927,2252.837783,
+ 1,-0,0,653.750225,-807.521706,2258.006804,
+ 1,-0,0,653.750225,-807.521706,2258.006804,
+ 1,0,0,653.750225,-837.456927,2252.837783,
+ 1,0,0,653.750225,-808.286792,2255.71079,
+ -0.15672,-0.796215,-0.584364,-152.95461,-768.954752,631.979457,
+ -0.267337,-0.710498,-0.65094,-285.268899,-688.700045,587.016307,
+ -0.123588,-0.749001,-0.65094,-145.428824,-731.120069,587.016307,
+ -0.267337,-0.710498,-0.65094,-285.268899,-688.700045,587.016307,
+ -0.15672,-0.796215,-0.584364,-152.95461,-768.954752,631.979457,
+ -0.309043,-0.750341,-0.584364,-300.03126,-724.339538,631.979457,
+ 0.729928,-0.683524,0,594.593537,-594.593537,2455.64332,
+ 0.77301,-0.634393,-0,635.110016,-545.224064,2549.07468,
+ 0.683524,-0.729928,0,594.593537,-594.593537,2549.07468,
+ 0.77301,-0.634393,-0,635.110016,-545.224064,2549.07468,
+ 0.729928,-0.683524,0,594.593537,-594.593537,2455.64332,
+ 0.820367,-0.571838,-0,699.168033,-467.169144,2455.64332,
+ 0.77301,-0.634393,-0,635.110016,-545.224064,2549.07468,
+ 0.820367,-0.571838,-0,699.168033,-467.169144,2455.64332,
+ 0.77301,-0.634393,-0,689.000383,-479.558461,2549.07468,
+ 0.77301,-0.634393,-0,689.000383,-479.558461,2549.07468,
+ 0.820367,-0.571838,-0,699.168033,-467.169144,2455.64332,
+ 0.83147,-0.55557,-0,699.168033,-467.169144,2549.07468,
+ -0.188671,-0.808825,0.556961,-182.278552,-916.376162,2455.64332,
+ -0.335858,-0.807337,0.485186,-381.734129,-921.587711,2361.464898,
+ -0.171901,-0.857347,0.485186,-194.606371,-978.352295,2361.464898,
+ -0.335858,-0.807337,0.485186,-381.734129,-921.587711,2361.464898,
+ -0.188671,-0.808825,0.556961,-182.278552,-916.376162,2455.64332,
+ -0.34284,-0.756475,0.556961,-357.552241,-863.20747,2455.64332,
+ 0,0,-1,-357.552241,-863.20747,2455.64332,
+ 0,0,-1,-182.278552,-916.376162,2455.64332,
+ 0,0,-1,-233.261861,-900.910544,2455.64332,
+ 0,0,-1,-357.552241,-863.20747,2455.64332,
+ 0,0,-1,-233.261861,-900.910544,2455.64332,
+ 0,0,-1,-323.520318,-873.530941,2455.64332,
+ -0.227168,-0.973856,-0,-164.047988,-824.724927,2549.07468,
+ -0.352162,-0.935939,-0,-321.791703,-776.873894,2455.64332,
+ -0.162803,-0.986659,0,-164.047988,-824.724927,2455.64332,
+ -0.352162,-0.935939,-0,-321.791703,-776.873894,2455.64332,
+ -0.227168,-0.973856,-0,-164.047988,-824.724927,2549.07468,
+ -0.412792,-0.910825,-0,-321.791703,-776.873894,2549.07468,
+ 0,0,-1,-321.791703,-776.873894,2549.07468,
+ 0,0,-1,-164.047988,-824.724927,2549.07468,
+ 0,0,-1,-209.932195,-810.806105,2549.07468,
+ 0,0,1,-321.791703,-776.873894,2549.07468,
+ 0,0,1,-209.932195,-810.806105,2549.07468,
+ 0,0,1,-291.163467,-786.164868,2549.07468,
+ -0.17413,-0.881651,-0.438601,-158.887376,-798.780783,682.822311,
+ -0.309043,-0.750341,-0.584364,-300.03126,-724.339538,631.979457,
+ -0.15672,-0.796215,-0.584364,-152.95461,-768.954752,631.979457,
+ -0.309043,-0.750341,-0.584364,-300.03126,-724.339538,631.979457,
+ -0.17413,-0.881651,-0.438601,-158.887376,-798.780783,682.822311,
+ -0.342785,-0.830739,-0.438601,-311.6688,-752.435044,682.822311,
+ -0.186514,-0.941653,-0.280182,-163.055979,-819.737765,738.078199,
+ -0.342785,-0.830739,-0.438601,-311.6688,-752.435044,682.822311,
+ -0.17413,-0.881651,-0.438601,-158.887376,-798.780783,682.822311,
+ -0.342785,-0.830739,-0.438601,-311.6688,-752.435044,682.822311,
+ -0.186514,-0.941653,-0.280182,-163.055979,-819.737765,738.078199,
+ -0.366638,-0.887172,-0.280182,-319.845809,-772.17609,738.078199,
+ -0.193517,-0.974489,-0.113678,-165.340167,-831.221151,796.15315,
+ -0.366638,-0.887172,-0.280182,-319.845809,-772.17609,738.078199,
+ -0.186514,-0.941653,-0.280182,-163.055979,-819.737765,738.078199,
+ -0.366638,-0.887172,-0.280182,-319.845809,-772.17609,738.078199,
+ -0.193517,-0.974489,-0.113678,-165.340167,-831.221151,796.15315,
+ -0.379912,-0.918011,-0.113678,-324.326404,-782.993204,796.15315,
+ 0.440459,-0.824041,0.356303,533.995171,-892.635117,2258.006804,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.393751,-0.867338,0.304443,399.515588,-964.515951,2258.006804,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.440459,-0.824041,0.356303,533.995171,-892.635117,2258.006804,
+ 0.430365,-0.805157,0.408054,540.89692,-887.575434,2260.711261,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.430365,-0.805157,0.408054,540.89692,-887.575434,2260.711261,
+ 0.481686,-0.774776,0.409514,577.578294,-864.407003,2267.739328,
+ 0.366496,-0.808673,0.460139,381.734129,-921.587711,2361.464898,
+ 0.481686,-0.774776,0.409514,577.578294,-864.407003,2267.739328,
+ 0.51982,-0.710547,0.474247,554.192058,-829.407027,2361.464898,
+ 0.194135,-0.974366,-0.113678,165.340167,-831.221151,796.15315,
+ 0.000777,-0.959946,-0.280182,0,-835.797377,738.078199,
+ 0.188038,-0.94135,-0.280182,163.055979,-819.737765,738.078199,
+ 0.000777,-0.959946,-0.280182,0,-835.797377,738.078199,
+ 0.194135,-0.974366,-0.113678,165.340167,-831.221151,796.15315,
+ 0.000315,-0.993518,-0.113678,0,-847.505736,796.15315,
+ -0.910916,-0.376813,0.168059,-990.771213,-410.390874,2148.211628,
+ -0.972989,-0.226965,0.042178,-1059.217255,-210.691412,2058.811877,
+ -0.910015,-0.412425,0.042178,-997.760837,-413.286071,2058.811877,
+ -0.972989,-0.226965,0.042178,-1059.217255,-210.691412,2058.811877,
+ -0.910916,-0.376813,0.168059,-990.771213,-410.390874,2148.211628,
+ -0.966926,-0.191862,0.168059,-1051.797109,-209.215453,2148.211628,
+ 0,0.707107,-0.707107,180.675225,-951.073041,2192.108705,
+ 0,0.812792,-0.582554,653.750225,-978.669071,2158.482845,
+ 0,0.849252,-0.527988,180.675225,-978.669071,2158.482845,
+ 0,0.812792,-0.582554,653.750225,-978.669071,2158.482845,
+ 0,0.707107,-0.707107,180.675225,-951.073041,2192.108705,
+ 0,0.707107,-0.707107,653.750225,-951.073041,2192.108705,
+ 0,0.935939,-0.352162,180.675225,-999.174772,2120.119378,
+ 0,0.973856,-0.227168,653.750225,-1011.80212,2078.49259,
+ 0,0.986659,-0.162803,180.675225,-1011.80212,2078.49259,
+ 0,0.973856,-0.227168,653.750225,-1011.80212,2078.49259,
+ 0,0.935939,-0.352162,180.675225,-999.174772,2120.119378,
+ 0,0.910825,-0.412792,653.750225,-999.174772,2120.119378,
+ 0.587879,-0.48246,-0.649331,610.800046,-425.129379,587.016307,
+ 0.592439,-0.554776,-0.584157,554.385481,-554.385481,631.979457,
+ 0.518883,-0.55411,-0.65094,527.108195,-527.108195,587.016307,
+ 0.592439,-0.554776,-0.584157,554.385481,-554.385481,631.979457,
+ 0.587879,-0.48246,-0.649331,610.800046,-425.129379,587.016307,
+ 0.675632,-0.449489,-0.584364,651.888362,-435.577878,631.979457,
+ 0.675632,-0.449489,-0.584364,651.888362,-435.577878,631.979457,
+ 0.587879,-0.48246,-0.649331,610.800046,-425.129379,587.016307,
+ 0.644692,-0.400811,-0.65094,619.813666,-414.146251,587.016307,
+ 0,-0.720896,0.693044,653.750225,-966.763694,2207.799357,
+ 0.144571,-0.892809,0.426605,369.410361,-997.119327,2170.810911,
+ 0,-0.85779,0.514001,653.750225,-997.119327,2170.810911,
+ 0.144571,-0.892809,0.426605,369.410361,-997.119327,2170.810911,
+ 0,-0.720896,0.693044,653.750225,-966.763694,2207.799357,
+ 0.14518,-0.877819,0.456461,406.150729,-980.534599,2191.019462,
+ 0.14518,-0.877819,0.456461,406.150729,-980.534599,2191.019462,
+ 0,-0.720896,0.693044,653.750225,-966.763694,2207.799357,
+ 0,-0.707107,0.707107,422.745234,-966.763694,2207.799357,
+ 0.710498,-0.267337,-0.65094,688.700045,-285.268899,587.016307,
+ 0.787008,-0.166056,-0.594175,768.954752,-152.95461,631.979457,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ 0.787008,-0.166056,-0.594175,768.954752,-152.95461,631.979457,
+ 0.710498,-0.267337,-0.65094,688.700045,-285.268899,587.016307,
+ 0.727759,-0.220763,-0.649331,707.864018,-222.093747,587.016307,
+ 0.787008,-0.166056,-0.594175,768.954752,-152.95461,631.979457,
+ 0.727759,-0.220763,-0.649331,707.864018,-222.093747,587.016307,
+ 0.749001,-0.123588,-0.65094,731.120069,-145.428824,587.016307,
+ 0.871137,-0.203207,0.447021,778.906876,-154.934211,1054.17292,
+ 0.837219,-0.315017,0.447021,647.394912,-268.159753,1241.03564,
+ 0.814754,-0.369253,0.447021,733.714234,-303.914386,1054.17292,
+ 0.837219,-0.315017,0.447021,647.394912,-268.159753,1241.03564,
+ 0.871137,-0.203207,0.447021,778.906876,-154.934211,1054.17292,
+ 0.882589,-0.145631,0.447021,687.270773,-136.706657,1241.03564,
+ -0.191744,-0.873668,0.447144,-154.934211,-778.906876,1614.76108,
+ -0.259888,-0.856737,0.445488,-221.595076,-855.850894,1427.89836,
+ -0.174494,-0.877241,0.447214,-173.161765,-870.542978,1427.89836,
+ -0.259888,-0.856737,0.445488,-221.595076,-855.850894,1427.89836,
+ -0.191744,-0.873668,0.447144,-154.934211,-778.906876,1614.76108,
+ -0.259888,-0.856737,0.445488,-307.339193,-829.840701,1427.89836,
+ -0.259888,-0.856737,0.445488,-307.339193,-829.840701,1427.89836,
+ -0.358504,-0.819473,0.447144,-303.914386,-733.714234,1614.76108,
+ -0.342282,-0.826343,0.447214,-339.66902,-820.033555,1427.89836,
+ -0.358504,-0.819473,0.447144,-303.914386,-733.714234,1614.76108,
+ -0.259888,-0.856737,0.445488,-307.339193,-829.840701,1427.89836,
+ -0.191744,-0.873668,0.447144,-154.934211,-778.906876,1614.76108,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ -0.241413,-0.795831,-0.555314,-233.261862,-900.910544,1614.76108,
+ -0.162003,-0.814444,-0.557168,-182.278552,-916.376162,1614.76108,
+ -0.241413,-0.795831,-0.555314,-233.261862,-900.910544,1614.76108,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ -0.241413,-0.795831,-0.555314,-323.520318,-873.530941,1614.76108,
+ -0.241413,-0.795831,-0.555314,-323.520318,-873.530941,1614.76108,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ -0.31778,-0.767189,-0.557168,-357.552241,-863.20747,1614.76108,
+ -0.329694,-0.798573,-0.503571,-381.734129,-921.587711,1708.939502,
+ -0.241413,-0.795831,-0.555314,-323.520318,-873.530941,1614.76108,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ -0.819881,-0.571538,0.033755,-897.96103,-599.998378,2058.811877,
+ -0.772328,-0.633835,-0.041994,-818.480102,-696.846173,2011.592491,
+ -0.771796,-0.633401,0.055987,-818.273878,-697.096462,2058.801607,
+ -0.772328,-0.633835,-0.041994,-818.480102,-696.846173,2011.592491,
+ -0.819881,-0.571538,0.033755,-897.96103,-599.998378,2058.811877,
+ -0.841785,-0.538757,-0.033753,-897.96103,-599.998378,2011.592523,
+ 0.117054,-0.588471,0.8,164.047988,-824.724927,914.026067,
+ 0.019694,-0.599883,0.799845,0,-654.019524,1054.17292,
+ -0.019694,-0.599883,0.799845,0,-840.882244,914.026067,
+ 0.019694,-0.599883,0.799845,0,-654.019524,1054.17292,
+ 0.117054,-0.588471,0.8,164.047988,-824.724927,914.026067,
+ 0.117054,-0.588471,0.8,127.592879,-641.452722,1054.17292,
+ 0,0.910825,0.412792,180.675225,-999.174772,1950.284976,
+ 0,0.849252,0.527988,653.750225,-978.669071,1911.921509,
+ 0,0.812792,0.582554,180.675225,-978.669071,1911.921509,
+ 0,0.849252,0.527988,653.750225,-978.669071,1911.921509,
+ 0,0.910825,0.412792,180.675225,-999.174772,1950.284976,
+ 0,0.935939,0.352162,653.750225,-999.174772,1950.284976,
+ 0.925561,-0.183175,-0.331336,1023.924672,-203.671281,1812.397596,
+ 0.976104,-0.096138,-0.19488,1072.403033,0,1922.192772,
+ 0.966926,-0.191862,-0.168059,1051.797109,-209.215453,1922.192772,
+ 0.976104,-0.096138,-0.19488,1072.403033,0,1922.192772,
+ 0.925561,-0.183175,-0.331336,1023.924672,-203.671281,1812.397596,
+ 0.929871,-0.091584,-0.356303,1043.984543,0,1812.397596,
+ -0,0.032813,-0.999462,670.391152,-794.166513,2257.101517,
+ -0,0.146613,-0.989194,180.675225,-837.456927,2252.837783,
+ 0,-0.032813,-0.999462,180.675225,-794.166513,2257.101517,
+ -0,0.146613,-0.989194,180.675225,-837.456927,2252.837783,
+ -0,0.032813,-0.999462,670.391152,-794.166513,2257.101517,
+ -0,0.098017,-0.995185,653.750225,-808.286792,2255.71079,
+ 0,0.227168,-0.973856,653.750225,-837.456927,2252.837783,
+ -0,0.146613,-0.989194,180.675225,-837.456927,2252.837783,
+ -0,0.098017,-0.995185,653.750225,-808.286792,2255.71079,
+ 0.456496,-0.854043,0.249443,422.745234,-966.763694,2207.799357,
+ 0.393751,-0.867338,0.304443,399.515588,-964.515951,2258.006804,
+ 0.340939,-0.906111,0.250448,406.150729,-980.534599,2191.019462,
+ 0.393751,-0.867338,0.304443,399.515588,-964.515951,2258.006804,
+ 0.456496,-0.854043,0.249443,422.745234,-966.763694,2207.799357,
+ 0.456496,-0.854043,0.249443,475.358507,-929.775248,2238.154991,
+ 0.393751,-0.867338,0.304443,399.515588,-964.515951,2258.006804,
+ 0.456496,-0.854043,0.249443,475.358507,-929.775248,2238.154991,
+ 0.440459,-0.824041,0.356303,533.995171,-892.635117,2258.006804,
+ -0.098017,-0.995185,-0,-43.046973,-1075.728791,2017.42443,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.097931,-0.994307,-0.041998,-39.929753,-1076.03581,2011.592523,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.098017,-0.995185,-0,-43.046973,-1075.728791,2017.42443,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.098017,-0.995185,-0,-43.046973,-1075.728791,2017.42443,
+ -0.098017,-0.995185,-0,-45.607992,-1075.476552,2025.866979,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.098017,-0.995185,-0,-45.607992,-1075.476552,2025.866979,
+ -0.098017,-0.995185,-0,-46.472742,-1075.391382,2034.646937,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.098017,-0.995185,-0,-46.472742,-1075.391382,2034.646937,
+ -0.098017,-0.995185,0,-45.607992,-1075.476552,2043.426896,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.098017,-0.995185,0,-45.607992,-1075.476552,2043.426896,
+ -0.098017,-0.995185,0,-43.046973,-1075.728791,2051.869445,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.098017,-0.995185,0,-43.046973,-1075.728791,2051.869445,
+ -0.097931,-0.994307,0.041998,-39.336165,-1076.094273,2058.811877,
+ -0.925561,-0.183175,-0.331336,-1023.924672,-203.671281,1812.397596,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.872041,-0.360223,-0.331336,-964.515951,-399.515588,1812.397596,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.925561,-0.183175,-0.331336,-1023.924672,-203.671281,1812.397596,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.966926,-0.191862,-0.168059,-1051.797109,-209.215453,1922.192772,
+ -0.872041,-0.360223,-0.331336,-964.515951,-399.515588,1812.397596,
+ -0.910916,-0.376813,-0.168059,-990.771213,-410.390874,1922.192772,
+ -0.872041,-0.360223,-0.331336,-964.515951,-399.515588,1812.397596,
+ -0.966926,-0.191862,-0.168059,-1051.797109,-209.215453,1922.192772,
+ -0.925561,-0.183175,-0.331336,-1023.924672,-203.671281,1812.397596,
+ -0.634393,-0.77301,-0,-680.414811,-831.964968,2020.575089,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.633834,-0.772328,-0.041998,-683.32915,-829.573232,2011.592523,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.634393,-0.77301,-0,-680.414811,-831.964968,2020.575089,
+ -0.683228,-0.729664,0.028116,-763.653083,-763.653083,2058.811877,
+ -0.683228,-0.729664,0.028116,-763.653083,-763.653083,2058.811877,
+ -0.634393,-0.77301,-0,-680.414811,-831.964968,2020.575089,
+ -0.634393,-0.77301,-0,-680.521947,-831.877044,2050.149043,
+ -0.683228,-0.729664,0.028116,-763.653083,-763.653083,2058.811877,
+ -0.634393,-0.77301,-0,-680.521947,-831.877044,2050.149043,
+ -0.633398,-0.771798,0.055991,-683.397325,-829.517282,2058.811877,
+ 0.814754,-0.369253,0.447021,733.714234,-303.914386,1054.17292,
+ 0.759676,-0.472298,0.447021,582.640028,-389.30762,1241.03564,
+ 0.727062,-0.521108,0.447021,660.325365,-441.215303,1054.17292,
+ 0.759676,-0.472298,0.447021,582.640028,-389.30762,1241.03564,
+ 0.814754,-0.369253,0.447021,733.714234,-303.914386,1054.17292,
+ 0.837219,-0.315017,0.447021,647.394912,-268.159753,1241.03564,
+ -0.819473,-0.358504,0.447144,-733.714234,-303.914386,1614.76108,
+ -0.856737,-0.259888,0.445488,-842.852042,-264.446548,1427.89836,
+ -0.826343,-0.342282,0.447214,-820.033555,-339.66902,1427.89836,
+ -0.856737,-0.259888,0.445488,-842.852042,-264.446548,1427.89836,
+ -0.819473,-0.358504,0.447144,-733.714234,-303.914386,1614.76108,
+ -0.873668,-0.191744,0.447144,-778.906876,-154.934211,1614.76108,
+ -0.856737,-0.259888,0.445488,-842.852042,-264.446548,1427.89836,
+ -0.873668,-0.191744,0.447144,-778.906876,-154.934211,1614.76108,
+ -0.856737,-0.259888,0.445488,-868.904109,-178.564394,1427.89836,
+ -0.856737,-0.259888,0.445488,-868.904109,-178.564394,1427.89836,
+ -0.873668,-0.191744,0.447144,-778.906876,-154.934211,1614.76108,
+ -0.877241,-0.174494,0.447214,-870.542978,-173.161765,1427.89836,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.777333,-0.292484,-0.556961,-863.20747,-357.552241,1614.76108,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.777333,-0.292484,-0.556961,-863.20747,-357.552241,1614.76108,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.795831,-0.241413,-0.555314,-887.227324,-278.369395,1614.76108,
+ -0.795831,-0.241413,-0.555314,-887.227324,-278.369395,1614.76108,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.795831,-0.241413,-0.555314,-914.651019,-187.965588,1614.76108,
+ -0.795831,-0.241413,-0.555314,-914.651019,-187.965588,1614.76108,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.819458,-0.135214,-0.556961,-916.376162,-182.278552,1614.76108,
+ 0.747902,-0.498268,-0.438601,677.173649,-452.472967,682.822311,
+ 0.887172,-0.366638,-0.280182,772.17609,-319.845809,738.078199,
+ 0.798598,-0.532672,-0.280182,694.940121,-464.344144,738.078199,
+ 0.887172,-0.366638,-0.280182,772.17609,-319.845809,738.078199,
+ 0.747902,-0.498268,-0.438601,677.173649,-452.472967,682.822311,
+ 0.830739,-0.342785,-0.438601,752.435044,-311.6688,682.822311,
+ -0.342785,-0.830739,-0.438601,-311.6688,-752.435044,682.822311,
+ -0.449489,-0.675632,-0.584364,-435.577878,-651.888362,631.979457,
+ -0.309043,-0.750341,-0.584364,-300.03126,-724.339538,631.979457,
+ -0.449489,-0.675632,-0.584364,-435.577878,-651.888362,631.979457,
+ -0.342785,-0.830739,-0.438601,-311.6688,-752.435044,682.822311,
+ -0.498268,-0.747902,-0.438601,-452.472967,-677.173649,682.822311,
+ -0.366638,-0.887172,-0.280182,-319.845809,-772.17609,738.078199,
+ -0.498268,-0.747902,-0.438601,-452.472967,-677.173649,682.822311,
+ -0.342785,-0.830739,-0.438601,-311.6688,-752.435044,682.822311,
+ -0.498268,-0.747902,-0.438601,-452.472967,-677.173649,682.822311,
+ -0.366638,-0.887172,-0.280182,-319.845809,-772.17609,738.078199,
+ -0.532672,-0.798598,-0.280182,-464.344144,-694.940121,738.078199,
+ -0.986659,-0,-0.162803,42.671671,-976.334157,2043.426896,
+ -0.999806,-0,-0.019694,43.536421,-1075.680584,2034.646937,
+ -0.973856,-0,-0.227168,42.671671,-1075.765755,2043.426896,
+ -0.999806,-0,-0.019694,43.536421,-1075.680584,2034.646937,
+ -0.986659,-0,-0.162803,42.671671,-976.334157,2043.426896,
+ -0.995185,-0,-0.098017,43.481732,-976.746707,2035.2022,
+ -1,-0,-0,43.536421,-976.708082,2034.646937,
+ -0.999806,-0,-0.019694,43.536421,-1075.680584,2034.646937,
+ -0.995185,-0,-0.098017,43.481732,-976.746707,2035.2022,
+ 0.729928,0,0.683524,-33.291206,-1075.947599,2002.823893,
+ 0.83147,0,0.55557,-38.888103,-975.6692,2009.643732,
+ 0.849252,-0,0.527988,-38.888103,-1075.973486,2009.643732,
+ 0.83147,0,0.55557,-38.888103,-975.6692,2009.643732,
+ 0.729928,0,0.683524,-33.291206,-1075.947599,2002.823893,
+ 0.683524,-0,0.729928,-33.291206,-975.812207,2002.823893,
+ -0.837219,-0.315017,0.447021,-690.554573,-286.03707,1427.89836,
+ -0.871137,-0.203207,0.447021,-824.724927,-164.047988,1241.03564,
+ -0.814754,-0.369253,0.447021,-776.873894,-321.791703,1241.03564,
+ -0.871137,-0.203207,0.447021,-824.724927,-164.047988,1241.03564,
+ -0.837219,-0.315017,0.447021,-690.554573,-286.03707,1427.89836,
+ -0.882589,-0.145631,0.447021,-733.088824,-145.820434,1427.89836,
+ 0.675632,-0.449489,-0.584364,651.888362,-435.577878,631.979457,
+ 0.830739,-0.342785,-0.438601,752.435044,-311.6688,682.822311,
+ 0.747902,-0.498268,-0.438601,677.173649,-452.472967,682.822311,
+ 0.830739,-0.342785,-0.438601,752.435044,-311.6688,682.822311,
+ 0.675632,-0.449489,-0.584364,651.888362,-435.577878,631.979457,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ -0.032813,-0.999462,0,0,-840.882244,2549.07468,
+ -0.162803,-0.986659,0,-164.047988,-824.724927,2455.64332,
+ 0.032813,-0.999462,0,0,-840.882244,2455.64332,
+ -0.162803,-0.986659,0,-164.047988,-824.724927,2455.64332,
+ -0.032813,-0.999462,0,0,-840.882244,2549.07468,
+ -0.227168,-0.973856,-0,-164.047988,-824.724927,2549.07468,
+ 0,0,-1,-164.047988,-824.724927,2549.07468,
+ 0,0,-1,0,-840.882244,2549.07468,
+ 0,0,-1,-42.432781,-836.702979,2549.07468,
+ 0,0,1,-164.047988,-824.724927,2549.07468,
+ 0,0,1,-42.432781,-836.702979,2549.07468,
+ 0,0,1,-126.903621,-828.383328,2549.07468,
+ -0.811513,-0.581637,0.056077,-706.098253,-471.799769,855.371869,
+ -0.704523,-0.704523,-0.085417,-599.277053,-599.277053,796.15315,
+ -0.691243,-0.718915,0.073102,-600.487204,-600.487204,855.371869,
+ -0.704523,-0.704523,-0.085417,-599.277053,-599.277053,796.15315,
+ -0.811513,-0.581637,0.056077,-706.098253,-471.799769,855.371869,
+ -0.826255,-0.551707,-0.113678,-704.675266,-470.848959,796.15315,
+ 0.55557,-0,-0.83147,-26.471367,-976.215347,2072.06688,
+ 0.382683,-0,-0.92388,-18.690668,-1076.654017,2076.225749,
+ 0.55557,-0,-0.83147,-26.471367,-1076.239632,2072.06688,
+ 0.382683,-0,-0.92388,-18.690668,-1076.654017,2076.225749,
+ 0.55557,-0,-0.83147,-26.471367,-976.215347,2072.06688,
+ 0.382683,0,-0.92388,-18.690668,-976.732727,2076.225749,
+ -0.412792,-0.910825,-0,-321.791703,-776.873894,2549.07468,
+ -0.527988,-0.849252,-0,-467.169144,-699.168033,2455.64332,
+ -0.352162,-0.935939,-0,-321.791703,-776.873894,2455.64332,
+ -0.527988,-0.849252,-0,-467.169144,-699.168033,2455.64332,
+ -0.412792,-0.910825,-0,-321.791703,-776.873894,2549.07468,
+ -0.582554,-0.812792,-0,-467.169144,-699.168033,2549.07468,
+ 0,0,-1,-467.169144,-699.168033,2549.07468,
+ 0,0,-1,-321.791703,-776.873894,2549.07468,
+ 0,0,-1,-368.760189,-751.768716,2549.07468,
+ 0,0,1,-467.169144,-699.168033,2549.07468,
+ 0,0,1,-368.760189,-751.768716,2549.07468,
+ 0,0,1,-443.63534,-711.747113,2549.07468,
+ -0.309043,-0.750341,-0.584364,-300.03126,-724.339538,631.979457,
+ -0.400811,-0.644692,-0.65094,-414.146251,-619.813666,587.016307,
+ -0.267337,-0.710498,-0.65094,-285.268899,-688.700045,587.016307,
+ -0.400811,-0.644692,-0.65094,-414.146251,-619.813666,587.016307,
+ -0.309043,-0.750341,-0.584364,-300.03126,-724.339538,631.979457,
+ -0.449489,-0.675632,-0.584364,-435.577878,-651.888362,631.979457,
+ 0.561756,-0.21137,0.799845,776.873894,-321.791703,914.026067,
+ 0.584514,-0.136347,0.799845,641.452722,-127.592879,1054.17292,
+ 0.546683,-0.247761,0.799845,604.235252,-250.282436,1054.17292,
+ 0.584514,-0.136347,0.799845,641.452722,-127.592879,1054.17292,
+ 0.561756,-0.21137,0.799845,776.873894,-321.791703,914.026067,
+ 0.592199,-0.097715,0.799845,824.724927,-164.047988,914.026067,
+ 0.55557,-0,-0.83147,-26.471367,-976.215347,2072.06688,
+ 0.707107,-0,-0.707107,-33.291206,-1076.041578,2066.469982,
+ 0.707107,0,-0.707107,-33.291206,-975.878684,2066.469982,
+ 0.707107,-0,-0.707107,-33.291206,-1076.041578,2066.469982,
+ 0.55557,-0,-0.83147,-26.471367,-976.215347,2072.06688,
+ 0.55557,-0,-0.83147,-26.471367,-1076.239632,2072.06688,
+ 0,-0.720896,0.693044,653.750225,-966.763694,2207.799357,
+ 0,-0.582554,0.812792,475.358507,-929.775248,2238.154991,
+ 0,-0.707107,0.707107,422.745234,-966.763694,2207.799357,
+ 0,-0.582554,0.812792,475.358507,-929.775248,2238.154991,
+ 0,-0.720896,0.693044,653.750225,-966.763694,2207.799357,
+ -0,-0.514001,0.85779,653.750225,-929.775248,2238.154991,
+ 0,-0.471397,-0.881921,533.995007,-892.635204,1812.397596,
+ 0,-0.514001,-0.85779,653.750225,-929.775248,1832.249363,
+ 0,-0.582554,-0.812792,475.358482,-929.775248,1832.249363,
+ 0,-0.514001,-0.85779,653.750225,-929.775248,1832.249363,
+ 0,-0.471397,-0.881921,533.995007,-892.635204,1812.397596,
+ 0,-0.412792,-0.910825,540.896876,-887.575434,1809.693092,
+ 0,-0.514001,-0.85779,653.750225,-929.775248,1832.249363,
+ 0,-0.412792,-0.910825,540.896876,-887.575434,1809.693092,
+ 0,-0.336778,-0.941584,653.750225,-887.575434,1809.693092,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.832671,-0.532692,0.151323,891.670534,-595.795203,2148.211628,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.901839,-0.40872,0.140121,990.771213,-410.390874,2148.211628,
+ 0.872041,-0.360223,0.331336,964.515951,-399.515588,2258.006804,
+ -0.790546,0.249135,-0.559436,-845.012276,-788.258547,1988.011282,
+ -0.637426,0.090042,-0.765232,-781.354664,-731.718944,1933.517963,
+ -0.637426,0.090042,-0.765232,-828.138788,-805.72305,1963.780621,
+ -0.637426,0.090042,-0.765232,-781.354664,-731.718944,1933.517963,
+ -0.790546,0.249135,-0.559436,-845.012276,-788.258547,1988.011282,
+ -0.837602,0.298772,-0.457337,-804.883918,-707.527533,1967.257586,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.382289,-0.923079,-0.0422,-413.286071,-997.760837,2011.592523,
+ -0.150758,-0.986668,-0.06131,-210.691412,-1059.217255,2011.592523,
+ -0.382289,-0.923079,-0.0422,-413.286071,-997.760837,2011.592523,
+ -0.150979,-0.98827,0.022991,-210.691412,-1059.217255,2058.811877,
+ -0.382396,-0.923034,0.0422,-413.286071,-997.760837,2058.811877,
+ 0.644692,-0.400811,-0.65094,619.813666,-414.146251,587.016307,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ 0.675632,-0.449489,-0.584364,651.888362,-435.577878,631.979457,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ 0.644692,-0.400811,-0.65094,619.813666,-414.146251,587.016307,
+ 0.670707,-0.3585,-0.649331,648.718891,-360.068379,587.016307,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ 0.670707,-0.3585,-0.649331,648.718891,-360.068379,587.016307,
+ 0.670707,-0.3585,-0.649331,684.232405,-293.627267,587.016307,
+ 0.731226,-0.321864,-0.601425,724.339538,-300.03126,631.979457,
+ 0.670707,-0.3585,-0.649331,684.232405,-293.627267,587.016307,
+ 0.710498,-0.267337,-0.65094,688.700045,-285.268899,587.016307,
+ 0.000913,-0.943512,-0.331336,0,-1043.984543,1812.397596,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ 0.000913,-0.943512,-0.331336,0,-1043.984543,1812.397596,
+ -0.183175,-0.925561,-0.331336,-203.671281,-1023.924672,1812.397596,
+ -0.369253,-0.814754,0.447021,-286.03707,-690.554573,1427.89836,
+ -0.472298,-0.759676,0.447021,-467.169144,-699.168033,1241.03564,
+ -0.315017,-0.837219,0.447021,-321.791703,-776.873894,1241.03564,
+ -0.472298,-0.759676,0.447021,-467.169144,-699.168033,1241.03564,
+ -0.369253,-0.814754,0.447021,-286.03707,-690.554573,1427.89836,
+ -0.521108,-0.727062,0.447021,-415.261462,-621.482696,1427.89836,
+ 0,0,1,-925.063958,-94.069883,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-934.329033,0,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-925.063958,-94.069883,2455.64332,
+ 0,0,1,-916.376162,-182.278552,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-916.376162,-182.278552,2455.64332,
+ 0,0,1,-914.651019,-187.965588,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-914.651019,-187.965588,2455.64332,
+ 0,0,1,-887.227323,-278.369396,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-887.227323,-278.369396,2455.64332,
+ 0,0,1,-863.20747,-357.552241,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-863.20747,-357.552241,2455.64332,
+ 0,0,1,-857.607798,-368.02849,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-857.607798,-368.02849,2455.64332,
+ 0,0,1,-813.095616,-451.304926,2455.64332,
+ 0,0,1,-840.882244,0,2455.64332,
+ 0,0,1,-813.095616,-451.304926,2455.64332,
+ 0,0,1,-824.724927,-164.047988,2455.64332,
+ 0,0,1,-824.724927,-164.047988,2455.64332,
+ 0,0,1,-813.095616,-451.304926,2455.64332,
+ 0,0,1,-776.873894,-321.791703,2455.64332,
+ 0,0,1,-776.873894,-321.791703,2455.64332,
+ 0,0,1,-813.095616,-451.304926,2455.64332,
+ 0,0,1,-776.866198,-519.085398,2455.64332,
+ 0,0,1,-776.873894,-321.791703,2455.64332,
+ 0,0,1,-776.866198,-519.085398,2455.64332,
+ 0,0,1,-699.168033,-467.169144,2455.64332,
+ 0,0,1,-699.168033,-467.169144,2455.64332,
+ 0,0,1,-776.866198,-519.085398,2455.64332,
+ 0,0,1,-765.568614,-532.851545,2455.64332,
+ 0,0,1,-699.168033,-467.169144,2455.64332,
+ 0,0,1,-765.568614,-532.851545,2455.64332,
+ 0,0,1,-705.689427,-605.814545,2455.64332,
+ 0,0,1,-699.168033,-467.169144,2455.64332,
+ 0,0,1,-705.689427,-605.814545,2455.64332,
+ 0,0,1,-660.670395,-660.670395,2455.64332,
+ 0,0,1,-699.168033,-467.169144,2455.64332,
+ 0,0,1,-660.670395,-660.670395,2455.64332,
+ 0,0,1,-594.593537,-594.593537,2455.64332,
+ 0,0,1,-594.593537,-594.593537,2455.64332,
+ 0,0,1,-660.670395,-660.670395,2455.64332,
+ 0,0,1,-642.325255,-675.725862,2455.64332,
+ 0,0,1,-594.593537,-594.593537,2455.64332,
+ 0,0,1,-642.325255,-675.725862,2455.64332,
+ 0,0,1,-569.38575,-735.585766,2455.64332,
+ 0,0,1,-594.593537,-594.593537,2455.64332,
+ 0,0,1,-569.38575,-735.585766,2455.64332,
+ 0,0,1,-467.169144,-699.168033,2455.64332,
+ 0,0,1,-467.169144,-699.168033,2455.64332,
+ 0,0,1,-569.38575,-735.585766,2455.64332,
+ 0,0,1,-519.085398,-776.866198,2455.64332,
+ 0,0,1,-467.169144,-699.168033,2455.64332,
+ 0,0,1,-519.085398,-776.866198,2455.64332,
+ 0,0,1,-492.936329,-790.843167,2455.64332,
+ 0,0,1,-467.169144,-699.168033,2455.64332,
+ 0,0,1,-492.936329,-790.843167,2455.64332,
+ 0,0,1,-409.740281,-835.312381,2455.64332,
+ 0,0,1,-467.169144,-699.168033,2455.64332,
+ 0,0,1,-409.740281,-835.312381,2455.64332,
+ 0,0,1,-321.791703,-776.873894,2455.64332,
+ 0,0,1,-321.791703,-776.873894,2455.64332,
+ 0,0,1,-409.740281,-835.312381,2455.64332,
+ 0,0,1,-357.552241,-863.20747,2455.64332,
+ 0,0,1,-321.791703,-776.873894,2455.64332,
+ 0,0,1,-357.552241,-863.20747,2455.64332,
+ 0,0,1,-323.520318,-873.530941,2455.64332,
+ 0,0,1,-321.791703,-776.873894,2455.64332,
+ 0,0,1,-323.520318,-873.530941,2455.64332,
+ 0,0,1,-233.261861,-900.910544,2455.64332,
+ 0,0,1,-321.791703,-776.873894,2455.64332,
+ 0,0,1,-233.261861,-900.910544,2455.64332,
+ 0,0,1,-164.047988,-824.724927,2455.64332,
+ 0,0,1,-164.047988,-824.724927,2455.64332,
+ 0,0,1,-233.261861,-900.910544,2455.64332,
+ 0,0,1,-182.278552,-916.376162,2455.64332,
+ 0,0,1,-164.047988,-824.724927,2455.64332,
+ 0,0,1,-182.278552,-916.376162,2455.64332,
+ 0,0,1,-141.006393,-920.441115,2455.64332,
+ 0,0,1,-164.047988,-824.724927,2455.64332,
+ 0,0,1,-141.006393,-920.441115,2455.64332,
+ 0,0,1,0,-840.882244,2455.64332,
+ 0,0,1,0,-840.882244,2455.64332,
+ 0,0,1,-141.006393,-920.441115,2455.64332,
+ 0,0,1,-47.148298,-929.685331,2455.64332,
+ 0,0,1,0,-840.882244,2455.64332,
+ 0,0,1,-47.148298,-929.685331,2455.64332,
+ 0,0,1,0,-934.329033,2455.64332,
+ 0,0,1,0,-840.882244,2455.64332,
+ 0,0,1,0,-934.329033,2455.64332,
+ 0,0,1,164.047988,-824.724927,2455.64332,
+ 0,0,1,164.047988,-824.724927,2455.64332,
+ 0,0,1,0,-934.329033,2455.64332,
+ 0,0,1,47.148335,-929.685327,2455.64332,
+ 0,0,1,164.047988,-824.724927,2455.64332,
+ 0,0,1,47.148335,-929.685327,2455.64332,
+ 0,0,1,141.006388,-920.441116,2455.64332,
+ 0,0,1,164.047988,-824.724927,2455.64332,
+ 0,0,1,141.006388,-920.441116,2455.64332,
+ 0,0,1,182.278552,-916.376162,2455.64332,
+ 0,0,1,164.047988,-824.724927,2455.64332,
+ 0,0,1,182.278552,-916.376162,2455.64332,
+ 0,0,1,321.791703,-776.873894,2455.64332,
+ 0,0,1,321.791703,-776.873894,2455.64332,
+ 0,0,1,182.278552,-916.376162,2455.64332,
+ 0,0,1,233.2619,-900.910533,2455.64332,
+ 0,0,1,321.791703,-776.873894,2455.64332,
+ 0,0,1,233.2619,-900.910533,2455.64332,
+ 0,0,1,323.520353,-873.53093,2455.64332,
+ 0,0,1,321.791703,-776.873894,2455.64332,
+ 0,0,1,323.520353,-873.53093,2455.64332,
+ 0,0,1,467.169144,-699.168033,2455.64332,
+ 0,0,1,467.169144,-699.168033,2455.64332,
+ 0,0,1,323.520353,-873.53093,2455.64332,
+ 0,0,1,357.552241,-863.20747,2455.64332,
+ 0,0,1,467.169144,-699.168033,2455.64332,
+ 0,0,1,357.552241,-863.20747,2455.64332,
+ 0,0,1,409.740311,-835.312366,2455.64332,
+ 0,0,1,467.169144,-699.168033,2455.64332,
+ 0,0,1,409.740311,-835.312366,2455.64332,
+ 0,0,1,492.936359,-790.843151,2455.64332,
+ 0,0,1,467.169144,-699.168033,2455.64332,
+ 0,0,1,492.936359,-790.843151,2455.64332,
+ 0,0,1,594.593537,-594.593537,2455.64332,
+ 0,0,1,594.593537,-594.593537,2455.64332,
+ 0,0,1,492.936359,-790.843151,2455.64332,
+ 0,0,1,519.085398,-776.866198,2455.64332,
+ 0,0,1,594.593537,-594.593537,2455.64332,
+ 0,0,1,519.085398,-776.866198,2455.64332,
+ 0,0,1,569.385776,-735.585746,2455.64332,
+ 0,0,1,594.593537,-594.593537,2455.64332,
+ 0,0,1,569.385776,-735.585746,2455.64332,
+ 0,0,1,642.325277,-675.725844,2455.64332,
+ 0,0,1,594.593537,-594.593537,2455.64332,
+ 0,0,1,642.325277,-675.725844,2455.64332,
+ 0,0,1,699.168033,-467.169144,2455.64332,
+ 0,0,1,699.168033,-467.169144,2455.64332,
+ 0,0,1,642.325277,-675.725844,2455.64332,
+ 0,0,1,660.670395,-660.670395,2455.64332,
+ 0,0,1,699.168033,-467.169144,2455.64332,
+ 0,0,1,660.670395,-660.670395,2455.64332,
+ 0,0,1,705.689443,-605.814526,2455.64332,
+ 0,0,1,699.168033,-467.169144,2455.64332,
+ 0,0,1,705.689443,-605.814526,2455.64332,
+ 0,0,1,776.873894,-321.791703,2455.64332,
+ 0,0,1,776.873894,-321.791703,2455.64332,
+ 0,0,1,705.689443,-605.814526,2455.64332,
+ 0,0,1,765.568628,-532.851527,2455.64332,
+ 0,0,1,776.873894,-321.791703,2455.64332,
+ 0,0,1,765.568628,-532.851527,2455.64332,
+ 0,0,1,776.866198,-519.085398,2455.64332,
+ 0,0,1,776.873894,-321.791703,2455.64332,
+ 0,0,1,776.866198,-519.085398,2455.64332,
+ 0,0,1,813.095624,-451.30491,2455.64332,
+ 0,0,1,776.873894,-321.791703,2455.64332,
+ 0,0,1,813.095624,-451.30491,2455.64332,
+ 0,0,1,824.724927,-164.047988,2455.64332,
+ 0,0,1,824.724927,-164.047988,2455.64332,
+ 0,0,1,813.095624,-451.30491,2455.64332,
+ 0,0,1,857.607805,-368.028476,2455.64332,
+ 0,0,1,824.724927,-164.047988,2455.64332,
+ 0,0,1,857.607805,-368.028476,2455.64332,
+ 0,0,1,840.882244,0,2455.64332,
+ 0,0,1,840.882244,0,2455.64332,
+ 0,0,1,857.607805,-368.028476,2455.64332,
+ 0,0,1,934.329033,0,2455.64332,
+ 0,0,1,934.329033,0,2455.64332,
+ 0,0,1,857.607805,-368.028476,2455.64332,
+ 0,0,1,863.20747,-357.552241,2455.64332,
+ 0,0,1,934.329033,0,2455.64332,
+ 0,0,1,863.20747,-357.552241,2455.64332,
+ 0,0,1,887.227327,-278.369385,2455.64332,
+ 0,0,1,934.329033,0,2455.64332,
+ 0,0,1,887.227327,-278.369385,2455.64332,
+ 0,0,1,914.651021,-187.965581,2455.64332,
+ 0,0,1,934.329033,0,2455.64332,
+ 0,0,1,914.651021,-187.965581,2455.64332,
+ 0,0,1,925.063958,-94.069877,2455.64332,
+ 0,0,1,925.063958,-94.069877,2455.64332,
+ 0,0,1,914.651021,-187.965581,2455.64332,
+ 0,0,1,916.376162,-182.278552,2455.64332,
+ 0.146874,-0.976542,0.157463,288.287545,-1033.56568,2082.821632,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.117205,-0.990162,0.07644,287.45777,-1035.930435,2058.811877,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.146874,-0.976542,0.157463,288.287545,-1033.56568,2082.821632,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.146874,-0.976542,0.157463,288.287545,-1033.56568,2082.821632,
+ 0.118798,-0.950331,0.287676,320.792446,-1019.675597,2128.611098,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.118798,-0.950331,0.287676,320.792446,-1019.675597,2128.611098,
+ 0.146136,-0.933668,0.326969,349.642944,-1009.198896,2148.211628,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ -0.081515,-0.827636,-0.555314,-47.148297,-929.685331,1614.76108,
+ 0,-0.8304,-0.557168,0,-934.329033,1614.76108,
+ -0.081515,-0.827636,-0.555314,-47.148297,-929.685331,1614.76108,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ -0.081515,-0.827636,-0.555314,-141.006395,-920.441115,1614.76108,
+ -0.081515,-0.827636,-0.555314,-141.006395,-920.441115,1614.76108,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ -0.162003,-0.814444,-0.557168,-182.278552,-916.376162,1614.76108,
+ -0.167565,-0.847548,-0.503571,-194.606371,-978.352295,1708.939502,
+ -0.081515,-0.827636,-0.555314,-141.006395,-920.441115,1614.76108,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ -0.544468,0.817693,0.186902,-751.507545,-880.404128,2025.39393,
+ -0.549387,0.812256,-0.195995,-680.521947,-831.877044,2050.149043,
+ -0.544468,0.817693,0.186902,-680.414811,-831.964968,2020.575089,
+ -0.549387,0.812256,-0.195995,-680.521947,-831.877044,2050.149043,
+ -0.544468,0.817693,0.186902,-751.507545,-880.404128,2025.39393,
+ -0.549387,0.812256,-0.195995,-751.210147,-880.075378,2048.545713,
+ -0.707107,0,0.707107,30.354884,-1076.236801,2002.823893,
+ -0.582554,0,0.812792,23.535045,-976.438073,1997.226995,
+ -0.527988,0,0.849252,23.535045,-1076.434855,1997.226995,
+ -0.582554,0,0.812792,23.535045,-976.438073,1997.226995,
+ -0.707107,0,0.707107,30.354884,-1076.236801,2002.823893,
+ -0.707107,0,0.707107,30.354884,-976.10141,2002.823893,
+ 0.161185,-0.976856,0.140615,164.047988,-824.724927,914.026067,
+ -0.000155,-0.998425,0.056107,0,-849.217148,855.371869,
+ 0.19463,-0.979271,0.056107,165.674047,-832.899679,855.371869,
+ -0.000155,-0.998425,0.056107,0,-849.217148,855.371869,
+ 0.161185,-0.976856,0.140615,164.047988,-824.724927,914.026067,
+ -0.032487,-0.989531,0.140615,0,-840.882244,914.026067,
+ 0.19463,-0.979271,0.056107,165.674047,-832.899679,855.371869,
+ 0.000315,-0.993518,-0.113678,0,-847.505736,796.15315,
+ 0.194135,-0.974366,-0.113678,165.340167,-831.221151,796.15315,
+ 0.000315,-0.993518,-0.113678,0,-847.505736,796.15315,
+ 0.19463,-0.979271,0.056107,165.674047,-832.899679,855.371869,
+ -0.000155,-0.998425,0.056107,0,-849.217148,855.371869,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.872041,-0.360223,-0.331336,964.515951,-399.515588,1812.397596,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.872041,-0.360223,-0.331336,964.515951,-399.515588,1812.397596,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.832671,-0.532692,-0.151323,891.670534,-595.795203,1922.192772,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.769936,-0.566074,-0.294549,868.041423,-580.006736,1812.397596,
+ 0.872041,-0.360223,-0.331336,964.515951,-399.515588,1812.397596,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.62118,-0.639379,0.453133,705.352697,-705.352697,2361.464898,
+ 0.665498,-0.684813,0.29689,738.20855,-738.20855,2258.006804,
+ 0.62118,-0.639379,0.453133,705.352697,-705.352697,2361.464898,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.587181,-0.587181,0.557168,660.670395,-660.670395,2455.64332,
+ 0.62118,-0.639379,0.453133,705.352697,-705.352697,2361.464898,
+ 0.587181,-0.587181,0.557168,660.670395,-660.670395,2455.64332,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.642867,-0.527587,0.555314,705.689443,-605.814526,2455.64332,
+ 0.642867,-0.527587,0.555314,705.689443,-605.814526,2455.64332,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.642867,-0.527587,0.555314,765.568628,-532.851527,2455.64332,
+ 0.642867,-0.527587,0.555314,765.568628,-532.851527,2455.64332,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.705336,-0.438515,0.556961,776.866198,-519.085398,2455.64332,
+ 0.705336,-0.438515,-0.556961,776.866198,-519.085398,1614.76108,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.707373,-0.49612,-0.503476,829.407027,-554.192058,1708.939502,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.705336,-0.438515,-0.556961,776.866198,-519.085398,1614.76108,
+ 0.733442,-0.392033,-0.555314,813.095625,-451.304909,1614.76108,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.733442,-0.392033,-0.555314,813.095625,-451.304909,1614.76108,
+ 0.733442,-0.392033,-0.555314,857.607806,-368.028476,1614.76108,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.733442,-0.392033,-0.555314,857.607806,-368.028476,1614.76108,
+ 0.777333,-0.292484,-0.556961,863.20747,-357.552241,1614.76108,
+ 0.814754,-0.369253,0.447021,776.873894,-321.791703,1241.03564,
+ 0.759676,-0.472298,0.447021,621.482696,-415.261462,1427.89836,
+ 0.727062,-0.521108,0.447021,699.168033,-467.169144,1241.03564,
+ 0.759676,-0.472298,0.447021,621.482696,-415.261462,1427.89836,
+ 0.814754,-0.369253,0.447021,776.873894,-321.791703,1241.03564,
+ 0.837219,-0.315017,0.447021,690.554573,-286.03707,1427.89836,
+ 0.814754,-0.369253,0.447021,820.033555,-339.66902,1427.89836,
+ 0.759676,-0.472298,0.447021,660.325365,-441.215303,1614.76108,
+ 0.727062,-0.521108,0.447021,738.010701,-493.122985,1427.89836,
+ 0.759676,-0.472298,0.447021,660.325365,-441.215303,1614.76108,
+ 0.814754,-0.369253,0.447021,820.033555,-339.66902,1427.89836,
+ 0.837219,-0.315017,0.447021,733.714234,-303.914386,1614.76108,
+ 0.001625,-0.81149,-0.584364,0,-784.019466,631.979457,
+ -0.123588,-0.749001,-0.65094,-145.428824,-731.120069,587.016307,
+ 0.024909,-0.75872,-0.65094,0,-745.443558,587.016307,
+ -0.123588,-0.749001,-0.65094,-145.428824,-731.120069,587.016307,
+ 0.001625,-0.81149,-0.584364,0,-784.019466,631.979457,
+ -0.15672,-0.796215,-0.584364,-152.95461,-768.954752,631.979457,
+ -0.34284,-0.756475,0.556961,-357.552241,-863.20747,2455.64332,
+ -0.486909,-0.726302,0.485186,-554.192058,-829.407027,2361.464898,
+ -0.335858,-0.807337,0.485186,-381.734129,-921.587711,2361.464898,
+ -0.486909,-0.726302,0.485186,-554.192058,-829.407027,2361.464898,
+ -0.34284,-0.756475,0.556961,-357.552241,-863.20747,2455.64332,
+ -0.483833,-0.675055,0.556961,-519.085398,-776.866198,2455.64332,
+ 0,0,-1,-519.085398,-776.866198,2455.64332,
+ 0,0,-1,-357.552241,-863.20747,2455.64332,
+ 0,0,-1,-409.740281,-835.312381,2455.64332,
+ 0,0,-1,-519.085398,-776.866198,2455.64332,
+ 0,0,-1,-409.740281,-835.312381,2455.64332,
+ 0,0,-1,-492.936329,-790.843167,2455.64332,
+ 0.993632,-0.097864,0.055838,849.217148,0,855.371869,
+ 0.976856,-0.161185,0.140615,824.724927,-164.047988,914.026067,
+ 0.972323,-0.22681,0.056077,832.899679,-165.674047,855.371869,
+ 0.976856,-0.161185,0.140615,824.724927,-164.047988,914.026067,
+ 0.993632,-0.097864,0.055838,849.217148,0,855.371869,
+ 0.98538,-0.097051,0.140025,840.882244,0,914.026067,
+ 0.976104,-0.096138,0.19488,1072.403033,0,2148.211628,
+ 0.925561,-0.183175,0.331336,1023.924672,-203.671281,2258.006804,
+ 0.966926,-0.191862,0.168059,1051.797109,-209.215453,2148.211628,
+ 0.925561,-0.183175,0.331336,1023.924672,-203.671281,2258.006804,
+ 0.976104,-0.096138,0.19488,1072.403033,0,2148.211628,
+ 0.929871,-0.091584,0.356303,1043.984543,0,2258.006804,
+ 0,0.707107,0.707107,653.750225,-951.073041,1878.295649,
+ 0,0.582554,0.812792,180.675225,-917.447181,1850.699619,
+ 0,0.707107,0.707107,180.675225,-951.073041,1878.295649,
+ 0,0.582554,0.812792,180.675225,-917.447181,1850.699619,
+ 0,0.707107,0.707107,653.750225,-951.073041,1878.295649,
+ 0,0.527988,0.849252,653.750225,-917.447181,1850.699619,
+ -0.379912,-0.918011,-0.113678,-324.326404,-782.993204,796.15315,
+ -0.532672,-0.798598,-0.280182,-464.344144,-694.940121,738.078199,
+ -0.366638,-0.887172,-0.280182,-319.845809,-772.17609,738.078199,
+ -0.532672,-0.798598,-0.280182,-464.344144,-694.940121,738.078199,
+ -0.379912,-0.918011,-0.113678,-324.326404,-782.993204,796.15315,
+ -0.551707,-0.826255,-0.113678,-470.848959,-704.675266,796.15315,
+ -0.382224,-0.922365,0.056107,-324.981333,-784.574342,855.371869,
+ -0.551707,-0.826255,-0.113678,-470.848959,-704.675266,796.15315,
+ -0.379912,-0.918011,-0.113678,-324.326404,-782.993204,796.15315,
+ -0.551707,-0.826255,-0.113678,-470.848959,-704.675266,796.15315,
+ -0.382224,-0.922365,0.056107,-324.981333,-784.574342,855.371869,
+ -0.554824,-0.830073,0.056107,-471.799769,-706.098253,855.371869,
+ -0.408691,-0.901776,0.140615,-321.791703,-776.873894,914.026067,
+ -0.554824,-0.830073,0.056107,-471.799769,-706.098253,855.371869,
+ -0.382224,-0.922365,0.056107,-324.981333,-784.574342,855.371869,
+ -0.554824,-0.830073,0.056107,-471.799769,-706.098253,855.371869,
+ -0.408691,-0.901776,0.140615,-321.791703,-776.873894,914.026067,
+ -0.576766,-0.804716,0.140615,-467.169144,-699.168033,914.026067,
+ -0.224911,-0.96418,0.140615,-164.047988,-824.724927,914.026067,
+ -0.382224,-0.922365,0.056107,-324.981333,-784.574342,855.371869,
+ -0.194936,-0.97921,0.056107,-165.674047,-832.899679,855.371869,
+ -0.382224,-0.922365,0.056107,-324.981333,-784.574342,855.371869,
+ -0.224911,-0.96418,0.140615,-164.047988,-824.724927,914.026067,
+ -0.408691,-0.901776,0.140615,-321.791703,-776.873894,914.026067,
+ 0,0.973856,0.227168,180.675225,-1011.80212,1991.911763,
+ 0,0.935939,0.352162,653.750225,-999.174772,1950.284976,
+ 0,0.910825,0.412792,180.675225,-999.174772,1950.284976,
+ 0,0.935939,0.352162,653.750225,-999.174772,1950.284976,
+ 0,0.973856,0.227168,180.675225,-1011.80212,1991.911763,
+ 0,0.986659,0.162803,653.750225,-1011.80212,1991.911763,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.633398,-0.771798,0.055991,-644.327894,-861.580736,2058.811877,
+ -0.555123,-0.830697,0.0422,-599.998378,-897.96103,2058.811877,
+ -0.633398,-0.771798,0.055991,-644.327894,-861.580736,2058.811877,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.632155,-0.770284,0.083921,-644.282481,-861.55593,2059.381644,
+ -0.632155,-0.770284,0.083921,-644.282481,-861.55593,2059.381644,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.632155,-0.770284,0.083921,-655.637458,-847.372595,2104.031681,
+ -0.632155,-0.770284,0.083921,-655.637458,-847.372595,2104.031681,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.632155,-0.770284,0.083921,-680.351355,-823.413171,2137.783955,
+ -0.632155,-0.770284,0.083921,-680.351355,-823.413171,2137.783955,
+ -0.577307,-0.804415,0.140118,-595.795203,-891.670534,2148.211628,
+ -0.62223,-0.75819,0.19488,-700.811797,-805.485643,2148.211628,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.081515,-0.827636,-0.555314,141.006389,-920.441115,1614.76108,
+ 0.162003,-0.814444,-0.557168,182.278552,-916.376162,1614.76108,
+ 0.081515,-0.827636,-0.555314,141.006389,-920.441115,1614.76108,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.081515,-0.827636,-0.555314,47.148336,-929.685327,1614.76108,
+ 0.081515,-0.827636,-0.555314,47.148336,-929.685327,1614.76108,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ 0,-0.8304,-0.557168,0,-934.329033,1614.76108,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ 0.081515,-0.827636,-0.555314,47.148336,-929.685327,1614.76108,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.935939,0,0.352162,-43.046973,-975.725342,2017.42443,
+ 0.973856,0,0.227168,-45.607992,-1075.476552,2025.866979,
+ 0.903939,-0,0.427662,-43.046973,-1075.728791,2017.42443,
+ 0.973856,0,0.227168,-45.607992,-1075.476552,2025.866979,
+ 0.935939,0,0.352162,-43.046973,-975.725342,2017.42443,
+ 0.986659,-0,0.162803,-45.607992,-975.978478,2025.866979,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ 0.705336,-0.438515,0.556961,776.866198,-519.085398,2455.64332,
+ 0.707373,-0.49612,0.503476,829.407027,-554.192058,2361.464898,
+ 0.705336,-0.438515,0.556961,776.866198,-519.085398,2455.64332,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ 0.733442,-0.392033,0.555314,813.095624,-451.30491,2455.64332,
+ 0.733442,-0.392033,0.555314,813.095624,-451.30491,2455.64332,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ 0.733442,-0.392033,0.555314,857.607805,-368.028476,2455.64332,
+ 0.733442,-0.392033,0.555314,857.607805,-368.028476,2455.64332,
+ 0.79057,-0.348586,0.503476,921.587711,-381.734129,2361.464898,
+ 0.777333,-0.292484,0.556961,863.20747,-357.552241,2455.64332,
+ -0.95694,-0.290285,-0,-798.491399,-250.528339,2549.07468,
+ -0.916164,-0.400805,-0,-776.873894,-321.791703,2455.64332,
+ -0.92388,-0.382683,-0,-776.873894,-321.791703,2549.07468,
+ -0.916164,-0.400805,-0,-776.873894,-321.791703,2455.64332,
+ -0.95694,-0.290285,-0,-798.491399,-250.528339,2549.07468,
+ -0.976753,-0.214369,-0,-824.724927,-164.047988,2455.64332,
+ -0.976753,-0.214369,-0,-824.724927,-164.047988,2455.64332,
+ -0.95694,-0.290285,-0,-798.491399,-250.528339,2549.07468,
+ -0.95694,-0.290285,0,-823.172319,-169.16625,2549.07468,
+ -0.976753,-0.214369,-0,-824.724927,-164.047988,2455.64332,
+ -0.95694,-0.290285,0,-823.172319,-169.16625,2549.07468,
+ -0.980785,-0.19509,0,-824.724927,-164.047988,2549.07468,
+ 0,-0.85779,0.514001,653.750225,-997.119327,2170.810911,
+ 0.118798,-0.950331,0.287676,320.792446,-1019.675597,2128.611098,
+ 0,-0.935939,0.352162,653.750225,-1019.675597,2128.611098,
+ 0.118798,-0.950331,0.287676,320.792446,-1019.675597,2128.611098,
+ 0,-0.85779,0.514001,653.750225,-997.119327,2170.810911,
+ 0.146136,-0.933668,0.326969,349.642944,-1009.198896,2148.211628,
+ 0.146136,-0.933668,0.326969,349.642944,-1009.198896,2148.211628,
+ 0,-0.85779,0.514001,653.750225,-997.119327,2170.810911,
+ 0.144571,-0.892809,0.426605,369.410361,-997.119327,2170.810911,
+ -0.029352,-0.894042,0.447021,0,-700.735204,1241.03564,
+ -0.145631,-0.882589,0.447021,-154.934211,-778.906876,1054.17292,
+ 0.029352,-0.894042,0.447021,0,-794.166564,1054.17292,
+ -0.145631,-0.882589,0.447021,-154.934211,-778.906876,1054.17292,
+ -0.029352,-0.894042,0.447021,0,-700.735204,1241.03564,
+ -0.203207,-0.871137,0.447021,-136.706657,-687.270773,1241.03564,
+ -0.136347,-0.584514,0.799845,-164.047988,-824.724927,914.026067,
+ -0.21137,-0.561756,0.799845,-250.282436,-604.235252,1054.17292,
+ -0.247761,-0.546683,0.799845,-321.791703,-776.873894,914.026067,
+ -0.21137,-0.561756,0.799845,-250.282436,-604.235252,1054.17292,
+ -0.136347,-0.584514,0.799845,-164.047988,-824.724927,914.026067,
+ -0.097715,-0.592199,0.799845,-127.592879,-641.452722,1054.17292,
+ -0.203207,-0.871137,0.447021,-136.706657,-687.270773,1241.03564,
+ -0.315017,-0.837219,0.447021,-303.914386,-733.714234,1054.17292,
+ -0.145631,-0.882589,0.447021,-154.934211,-778.906876,1054.17292,
+ -0.315017,-0.837219,0.447021,-303.914386,-733.714234,1054.17292,
+ -0.203207,-0.871137,0.447021,-136.706657,-687.270773,1241.03564,
+ -0.369253,-0.814754,0.447021,-268.159753,-647.394912,1241.03564,
+ -0.203207,-0.871137,0.447021,-145.820434,-733.088824,1427.89836,
+ -0.315017,-0.837219,0.447021,-321.791703,-776.873894,1241.03564,
+ -0.145631,-0.882589,0.447021,-164.047988,-824.724927,1241.03564,
+ -0.315017,-0.837219,0.447021,-321.791703,-776.873894,1241.03564,
+ -0.203207,-0.871137,0.447021,-145.820434,-733.088824,1427.89836,
+ -0.369253,-0.814754,0.447021,-286.03707,-690.554573,1427.89836,
+ 0.820367,-0.571838,-0,699.168033,-467.169144,2455.64332,
+ 0.881921,-0.471397,-0,731.773963,-406.167739,2549.07468,
+ 0.83147,-0.55557,-0,699.168033,-467.169144,2549.07468,
+ 0.881921,-0.471397,-0,731.773963,-406.167739,2549.07468,
+ 0.820367,-0.571838,-0,699.168033,-467.169144,2455.64332,
+ 0.916164,-0.400805,0,776.873894,-321.791703,2455.64332,
+ 0.881921,-0.471397,-0,731.773963,-406.167739,2549.07468,
+ 0.916164,-0.400805,0,776.873894,-321.791703,2455.64332,
+ 0.881921,-0.471397,0,771.834246,-331.220222,2549.07468,
+ 0.881921,-0.471397,0,771.834246,-331.220222,2549.07468,
+ 0.916164,-0.400805,0,776.873894,-321.791703,2455.64332,
+ 0.92388,-0.382683,0,776.873894,-321.791703,2549.07468,
+ 0.000315,-0.993518,-0.113678,0,-847.505736,796.15315,
+ -0.186514,-0.941653,-0.280182,-163.055979,-819.737765,738.078199,
+ 0.000777,-0.959946,-0.280182,0,-835.797377,738.078199,
+ -0.186514,-0.941653,-0.280182,-163.055979,-819.737765,738.078199,
+ 0.000315,-0.993518,-0.113678,0,-847.505736,796.15315,
+ -0.193517,-0.974489,-0.113678,-165.340167,-831.221151,796.15315,
+ 1,0,0,-46.472742,-976.41888,2034.646937,
+ 0.995185,0,-0.098017,-46.418054,-976.457504,2035.2022,
+ 0.999806,0,-0.019694,-46.472742,-1075.391382,2034.646937,
+ 0.999806,0,-0.019694,-46.472742,-1075.391382,2034.646937,
+ 0.986659,0,-0.162803,-45.607992,-976.044955,2043.426896,
+ 0.973856,0,-0.227168,-45.607992,-1075.476552,2043.426896,
+ 0.986659,0,-0.162803,-45.607992,-976.044955,2043.426896,
+ 0.999806,0,-0.019694,-46.472742,-1075.391382,2034.646937,
+ 0.995185,0,-0.098017,-46.418054,-976.457504,2035.2022,
+ 0.001218,-0.898681,-0.438601,0,-814.429823,682.822311,
+ -0.15672,-0.796215,-0.584364,-152.95461,-768.954752,631.979457,
+ 0.001625,-0.81149,-0.584364,0,-784.019466,631.979457,
+ -0.15672,-0.796215,-0.584364,-152.95461,-768.954752,631.979457,
+ 0.001218,-0.898681,-0.438601,0,-814.429823,682.822311,
+ -0.17413,-0.881651,-0.438601,-158.887376,-798.780783,682.822311,
+ 0.000777,-0.959946,-0.280182,0,-835.797377,738.078199,
+ -0.17413,-0.881651,-0.438601,-158.887376,-798.780783,682.822311,
+ 0.001218,-0.898681,-0.438601,0,-814.429823,682.822311,
+ -0.17413,-0.881651,-0.438601,-158.887376,-798.780783,682.822311,
+ 0.000777,-0.959946,-0.280182,0,-835.797377,738.078199,
+ -0.186514,-0.941653,-0.280182,-163.055979,-819.737765,738.078199,
+ -0.785009,-0.523429,-0.331336,-868.041423,-580.006736,1812.397596,
+ -0.614068,-0.630655,-0.474547,-705.352697,-705.352697,1708.939502,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.614068,-0.630655,-0.474547,-705.352697,-705.352697,1708.939502,
+ -0.785009,-0.523429,-0.331336,-868.041423,-580.006736,1812.397596,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ 0,-0.999806,-0.019694,653.750225,-1038.255787,2035.202177,
+ 0.117291,-0.984202,-0.132626,288.287532,-1033.56568,1987.582722,
+ 0,-0.973856,-0.227168,653.750225,-1033.56568,1987.582722,
+ 0.117291,-0.984202,-0.132626,288.287532,-1033.56568,1987.582722,
+ 0,-0.999806,-0.019694,653.750225,-1038.255787,2035.202177,
+ 0.146586,-0.98666,-0.07081,287.457755,-1035.930439,2011.592523,
+ 0.146586,-0.98666,-0.07081,287.457755,-1035.930439,2011.592523,
+ 0,-0.999806,-0.019694,653.750225,-1038.255787,2035.202177,
+ 0.176337,-0.98433,0,279.79211,-1038.255787,2035.202177,
+ 0.974489,-0.193517,-0.113678,831.221151,-165.340167,796.15315,
+ 0.993632,-0.097864,0.055838,849.217148,0,855.371869,
+ 0.972323,-0.22681,0.056077,832.899679,-165.674047,855.371869,
+ 0.993632,-0.097864,0.055838,849.217148,0,855.371869,
+ 0.974489,-0.193517,-0.113678,831.221151,-165.340167,796.15315,
+ 0.985217,-0.097035,-0.141176,847.505736,0,796.15315,
+ 0,-0.582554,-0.812792,475.358482,-929.775248,1832.249363,
+ 0,-0.707107,-0.707107,653.750225,-966.763694,1862.604996,
+ 0,-0.707107,-0.707107,422.745208,-966.763694,1862.604996,
+ 0,-0.707107,-0.707107,653.750225,-966.763694,1862.604996,
+ 0,-0.582554,-0.812792,475.358482,-929.775248,1832.249363,
+ 0,-0.514001,-0.85779,653.750225,-929.775248,1832.249363,
+ 0,-0.999806,-0.019694,653.750225,-1038.255787,2035.202177,
+ 0.117205,-0.990162,0.07644,287.45777,-1035.930435,2058.811877,
+ 0.176337,-0.98433,0,279.79211,-1038.255787,2035.202177,
+ 0.117205,-0.990162,0.07644,287.45777,-1035.930435,2058.811877,
+ 0,-0.999806,-0.019694,653.750225,-1038.255787,2035.202177,
+ 0,-0.986659,0.162803,653.750225,-1033.56568,2082.821632,
+ 0.117205,-0.990162,0.07644,287.45777,-1035.930435,2058.811877,
+ 0,-0.986659,0.162803,653.750225,-1033.56568,2082.821632,
+ 0.146874,-0.976542,0.157463,288.287545,-1033.56568,2082.821632,
+ 0,0.582554,-0.812792,653.750225,-917.447181,2219.704735,
+ 0,0.707107,-0.707107,180.675225,-951.073041,2192.108705,
+ 0,0.527988,-0.849252,180.675225,-917.447181,2219.704735,
+ 0,0.707107,-0.707107,180.675225,-951.073041,2192.108705,
+ 0,0.582554,-0.812792,653.750225,-917.447181,2219.704735,
+ 0,0.707107,-0.707107,653.750225,-951.073041,2192.108705,
+ 0.315017,-0.837219,0.447021,286.03707,-690.554573,1427.89836,
+ 0.203207,-0.871137,0.447021,164.047988,-824.724927,1241.03564,
+ 0.369253,-0.814754,0.447021,321.791703,-776.873894,1241.03564,
+ 0.203207,-0.871137,0.447021,164.047988,-824.724927,1241.03564,
+ 0.315017,-0.837219,0.447021,286.03707,-690.554573,1427.89836,
+ 0.145631,-0.882589,0.447021,145.820434,-733.088824,1427.89836,
+ 0.890977,-0.087754,0.445488,840.882244,0,1241.03564,
+ 0.882589,-0.145631,0.447021,733.088824,-145.820434,1427.89836,
+ 0.871137,-0.203207,0.447021,824.724927,-164.047988,1241.03564,
+ 0.882589,-0.145631,0.447021,733.088824,-145.820434,1427.89836,
+ 0.890977,-0.087754,0.445488,840.882244,0,1241.03564,
+ 0.890977,-0.087754,0.445488,747.450884,0,1427.89836,
+ 0.830739,-0.342785,-0.438601,752.435044,-311.6688,682.822311,
+ 0.941653,-0.186514,-0.280182,819.737765,-163.055979,738.078199,
+ 0.887172,-0.366638,-0.280182,772.17609,-319.845809,738.078199,
+ 0.941653,-0.186514,-0.280182,819.737765,-163.055979,738.078199,
+ 0.830739,-0.342785,-0.438601,752.435044,-311.6688,682.822311,
+ 0.881651,-0.17413,-0.438601,798.780783,-158.887376,682.822311,
+ -0.993632,-0.097864,0.055838,-849.217148,0,855.371869,
+ -0.974489,-0.193517,-0.113678,-831.221151,-165.340167,796.15315,
+ -0.972323,-0.22681,0.056077,-832.899679,-165.674047,855.371869,
+ -0.974489,-0.193517,-0.113678,-831.221151,-165.340167,796.15315,
+ -0.993632,-0.097864,0.055838,-849.217148,0,855.371869,
+ -0.985217,-0.097035,-0.141176,-847.505736,0,796.15315,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.000913,-0.943512,-0.331336,0,-1043.984543,1812.397596,
+ 0.184965,-0.925205,-0.331336,203.671281,-1023.924672,1812.397596,
+ 0.000913,-0.943512,-0.331336,0,-1043.984543,1812.397596,
+ 0.215316,-0.958117,-0.188816,209.215453,-1051.797109,1922.192772,
+ 0.014463,-0.987633,-0.156114,0,-1072.403033,1922.192772,
+ 0,0.527988,0.849252,653.750225,-917.447181,1850.699619,
+ 0,0.412792,0.910825,180.675225,-879.083714,1830.193918,
+ 0,0.582554,0.812792,180.675225,-917.447181,1850.699619,
+ 0,0.412792,0.910825,180.675225,-879.083714,1830.193918,
+ 0,0.527988,0.849252,653.750225,-917.447181,1850.699619,
+ 0,0.352162,0.935939,653.750225,-879.083714,1830.193918,
+ 0.527988,-0.849252,0,467.169144,-699.168033,2549.07468,
+ 0.412792,-0.910825,0,321.791703,-776.873894,2455.64332,
+ 0.582554,-0.812792,0,467.169144,-699.168033,2455.64332,
+ 0.412792,-0.910825,0,321.791703,-776.873894,2455.64332,
+ 0.527988,-0.849252,0,467.169144,-699.168033,2549.07468,
+ 0.352162,-0.935939,0,321.791703,-776.873894,2549.07468,
+ 0,0,-1,321.791703,-776.873894,2549.07468,
+ 0,0,-1,467.169144,-699.168033,2549.07468,
+ 0,0,-1,443.635404,-711.747079,2549.07468,
+ 0,0,1,321.791703,-776.873894,2549.07468,
+ 0,0,1,443.635404,-711.747079,2549.07468,
+ 0,0,1,368.760184,-751.768718,2549.07468,
+ 0.994307,-0.097931,-0.041998,1079.968548,0,2011.592523,
+ 0.979923,-0.19486,0.0422,1059.217255,-210.691412,2058.811877,
+ 0.972989,-0.226965,-0.042178,1059.217255,-210.691412,2011.592523,
+ 0.979923,-0.19486,0.0422,1059.217255,-210.691412,2058.811877,
+ 0.994307,-0.097931,-0.041998,1079.968548,0,2011.592523,
+ 0.993624,-0.097863,0.055991,1079.968548,0,2058.811877,
+ 0.606593,-0.621557,-0.495693,705.352697,-705.352697,1708.939502,
+ 0.527587,-0.642867,-0.555314,642.325277,-675.725844,1614.76108,
+ 0.606233,-0.567693,-0.556961,660.670395,-660.670395,1614.76108,
+ 0.527587,-0.642867,-0.555314,642.325277,-675.725844,1614.76108,
+ 0.606593,-0.621557,-0.495693,705.352697,-705.352697,1708.939502,
+ 0.527587,-0.642867,-0.555314,569.385776,-735.585745,1614.76108,
+ 0.527587,-0.642867,-0.555314,569.385776,-735.585745,1614.76108,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.461345,-0.690452,-0.557168,519.085398,-776.866198,1614.76108,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.527587,-0.642867,-0.555314,569.385776,-735.585745,1614.76108,
+ 0.606593,-0.621557,-0.495693,705.352697,-705.352697,1708.939502,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.606593,-0.621557,-0.495693,705.352697,-705.352697,1708.939502,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.579174,-0.705726,-0.408054,653.750225,-795.278099,1791.222384,
+ 0.579174,-0.705726,-0.408054,653.750225,-795.278099,1791.222384,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.604517,-0.736606,-0.303266,653.750225,-807.521706,1812.397596,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.579174,-0.705726,-0.408054,600.307476,-841.785968,1795.80301,
+ 0.468978,-0.782653,-0.409285,577.578281,-864.406983,1802.66502,
+ 0.579174,-0.705726,-0.408054,600.307476,-841.785968,1795.80301,
+ 0.501364,-0.716458,-0.4851,554.192058,-829.407027,1708.939502,
+ 0.579174,-0.705726,-0.408054,653.750225,-795.278099,1791.222384,
+ 0.592439,-0.554776,-0.584157,554.385481,-554.385481,631.979457,
+ 0.747902,-0.498268,-0.438601,677.173649,-452.472967,682.822311,
+ 0.636324,-0.634602,-0.438601,575.888851,-575.888851,682.822311,
+ 0.747902,-0.498268,-0.438601,677.173649,-452.472967,682.822311,
+ 0.592439,-0.554776,-0.584157,554.385481,-554.385481,631.979457,
+ 0.675632,-0.449489,-0.584364,651.888362,-435.577878,631.979457,
+ 0.849252,-0,0.527988,-38.888103,-1075.973486,2009.643732,
+ 0.903939,-0,0.427662,-43.046973,-1075.728791,2017.42443,
+ 0.881921,-0,0.471397,-39.929753,-1076.03581,2011.592523,
+ 0.903939,-0,0.427662,-43.046973,-1075.728791,2017.42443,
+ 0.849252,-0,0.527988,-38.888103,-1075.973486,2009.643732,
+ 0.83147,0,0.55557,-38.888103,-975.6692,2009.643732,
+ 0.903939,-0,0.427662,-43.046973,-1075.728791,2017.42443,
+ 0.83147,0,0.55557,-38.888103,-975.6692,2009.643732,
+ 0.935939,0,0.352162,-43.046973,-975.725342,2017.42443,
+ 0,-0.19509,0.980785,653.750225,-841.785968,2274.601344,
+ 0,-0.098017,0.995185,653.750225,-795.278128,2279.181966,
+ -0,-0.227168,0.973856,600.307509,-841.785968,2274.601344,
+ 0,0.812792,0.582554,180.675225,-978.669071,1911.921509,
+ 0,0.707107,0.707107,653.750225,-951.073041,1878.295649,
+ 0,0.707107,0.707107,180.675225,-951.073041,1878.295649,
+ 0,0.707107,0.707107,653.750225,-951.073041,1878.295649,
+ 0,0.812792,0.582554,180.675225,-978.669071,1911.921509,
+ 0,0.849252,0.527988,653.750225,-978.669071,1911.921509,
+ -0.001338,-0.87441,0.485186,0,-997.51935,2361.464898,
+ -0.184965,-0.925205,0.331336,-203.671281,-1023.924672,2258.006804,
+ -0.000913,-0.943512,0.331336,0,-1043.984543,2258.006804,
+ -0.184965,-0.925205,0.331336,-203.671281,-1023.924672,2258.006804,
+ -0.001338,-0.87441,0.485186,0,-997.51935,2361.464898,
+ -0.171901,-0.857347,0.485186,-194.606371,-978.352295,2361.464898,
+ -0.335858,-0.807337,0.485186,-381.734129,-921.587711,2361.464898,
+ -0.538332,-0.779667,0.319873,-580.006736,-868.041423,2258.006804,
+ -0.36191,-0.871342,0.331336,-399.515588,-964.515951,2258.006804,
+ -0.538332,-0.779667,0.319873,-580.006736,-868.041423,2258.006804,
+ -0.335858,-0.807337,0.485186,-381.734129,-921.587711,2361.464898,
+ -0.486909,-0.726302,0.485186,-554.192058,-829.407027,2361.464898,
+ -0,-0.514001,0.85779,653.750225,-929.775248,2238.154991,
+ -0,-0.471397,0.881921,533.995171,-892.635117,2258.006804,
+ 0,-0.582554,0.812792,475.358507,-929.775248,2238.154991,
+ -0,-0.471397,0.881921,533.995171,-892.635117,2258.006804,
+ -0,-0.514001,0.85779,653.750225,-929.775248,2238.154991,
+ -0,-0.412792,0.910825,540.89692,-887.575434,2260.711261,
+ -0,-0.412792,0.910825,540.89692,-887.575434,2260.711261,
+ -0,-0.514001,0.85779,653.750225,-929.775248,2238.154991,
+ -0,-0.336778,0.941584,653.750225,-887.575434,2260.711261,
+ 0.412792,0,0.910825,-18.690668,-1076.560038,1993.068126,
+ 0.527988,0,0.849252,-26.471367,-976.14887,1997.226995,
+ 0.582554,-0,0.812792,-26.471367,-1076.145653,1997.226995,
+ 0.527988,0,0.849252,-26.471367,-976.14887,1997.226995,
+ 0.412792,0,0.910825,-18.690668,-1076.560038,1993.068126,
+ 0.352162,0,0.935939,-18.690668,-976.666251,1993.068126,
+ 0.509726,-0.316902,0.799845,699.168033,-467.169144,914.026067,
+ 0.546683,-0.247761,0.799845,604.235252,-250.282436,1054.17292,
+ 0.487843,-0.349653,0.799845,543.79736,-363.353779,1054.17292,
+ 0.546683,-0.247761,0.799845,604.235252,-250.282436,1054.17292,
+ 0.509726,-0.316902,0.799845,699.168033,-467.169144,914.026067,
+ 0.561756,-0.21137,0.799845,776.873894,-321.791703,914.026067,
+ -0.83147,0,0.55557,35.951781,-975.958402,2009.643732,
+ -0.707107,0,0.707107,30.354884,-1076.236801,2002.823893,
+ -0.849252,-0,0.527988,35.951781,-1076.262688,2009.643732,
+ -0.707107,0,0.707107,30.354884,-1076.236801,2002.823893,
+ -0.83147,0,0.55557,35.951781,-975.958402,2009.643732,
+ -0.707107,0,0.707107,30.354884,-976.10141,2002.823893,
+ 0.973856,0,-0.227168,-45.607992,-1075.476552,2043.426896,
+ 0.935939,0,-0.352162,-43.046973,-975.791819,2051.869445,
+ 0.903939,-0,-0.427662,-43.046973,-1075.728791,2051.869445,
+ 0.935939,0,-0.352162,-43.046973,-975.791819,2051.869445,
+ 0.973856,0,-0.227168,-45.607992,-1075.476552,2043.426896,
+ 0.986659,0,-0.162803,-45.607992,-976.044955,2043.426896,
+ 0,-0.707107,-0.707107,843.013714,-637.259985,2192.108705,
+ 0,-0.84225,-0.539087,180.675225,-609.663955,2158.482845,
+ 0,-0.83147,-0.55557,876.866129,-609.663955,2158.482845,
+ 0,-0.84225,-0.539087,180.675225,-609.663955,2158.482845,
+ 0,-0.707107,-0.707107,843.013714,-637.259985,2192.108705,
+ 0,-0.707107,-0.707107,180.675225,-637.259985,2192.108705,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.527587,-0.642867,-0.555314,-569.385752,-735.585765,1614.76108,
+ -0.461345,-0.690452,-0.557168,-519.085398,-776.866198,1614.76108,
+ -0.527587,-0.642867,-0.555314,-569.385752,-735.585765,1614.76108,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.527587,-0.642867,-0.555314,-642.325255,-675.725862,1614.76108,
+ -0.527587,-0.642867,-0.555314,-642.325255,-675.725862,1614.76108,
+ -0.614068,-0.630655,-0.474547,-705.352697,-705.352697,1708.939502,
+ -0.606233,-0.567693,-0.556961,-660.670395,-660.670395,1614.76108,
+ -0.614068,-0.630655,-0.474547,-705.352697,-705.352697,1708.939502,
+ -0.527587,-0.642867,-0.555314,-642.325255,-675.725862,1614.76108,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.994307,-0.097931,0.041998,-1079.968548,0,2058.811877,
+ -0.979923,-0.19486,-0.0422,-1059.217255,-210.691412,2011.592523,
+ -0.972989,-0.226965,0.042178,-1059.217255,-210.691412,2058.811877,
+ -0.979923,-0.19486,-0.0422,-1059.217255,-210.691412,2011.592523,
+ -0.994307,-0.097931,0.041998,-1079.968548,0,2058.811877,
+ -0.993624,-0.097863,-0.055991,-1079.968548,0,2011.592523,
+ -0.882589,-0.145631,0.447021,-687.270773,-136.706657,1241.03564,
+ -0.890977,-0.087754,0.445488,-794.166564,0,1054.17292,
+ -0.871137,-0.203207,0.447021,-778.906876,-154.934211,1054.17292,
+ -0.890977,-0.087754,0.445488,-794.166564,0,1054.17292,
+ -0.882589,-0.145631,0.447021,-687.270773,-136.706657,1241.03564,
+ -0.890977,-0.087754,0.445488,-700.735204,0,1241.03564,
+ 0.61434,-0.748575,-0.249443,653.750225,-808.286776,1814.693561,
+ 0.604517,-0.736606,-0.303266,653.750225,-807.521706,1812.397596,
+ 0.61434,-0.748575,-0.249443,670.391133,-794.166513,1813.302837,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.61434,-0.748575,-0.249443,670.391133,-794.166513,1813.302837,
+ 0.604517,-0.736606,-0.303266,653.750225,-807.521706,1812.397596,
+ 0.61434,-0.748575,-0.249443,670.391133,-794.166513,1813.302837,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.61434,-0.748575,-0.249443,724.871877,-750.8761,1817.56657,
+ 0.61434,-0.748575,-0.249443,724.871877,-750.8761,1817.56657,
+ 0.647345,-0.690701,-0.322298,738.20855,-738.20855,1812.397596,
+ 0.684548,-0.684548,-0.250574,739.771122,-739.771122,1820.935228,
+ 0.381937,-0.922484,0.056107,324.981333,-784.574342,855.371869,
+ 0.194135,-0.974366,-0.113678,165.340167,-831.221151,796.15315,
+ 0.380494,-0.91777,-0.113678,324.326404,-782.993204,796.15315,
+ 0.194135,-0.974366,-0.113678,165.340167,-831.221151,796.15315,
+ 0.381937,-0.922484,0.056107,324.981333,-784.574342,855.371869,
+ 0.19463,-0.979271,0.056107,165.674047,-832.899679,855.371869,
+ 0.787008,-0.166056,-0.594175,768.954752,-152.95461,631.979457,
+ 0.882512,-0.08692,-0.462187,814.429823,0,682.822311,
+ 0.881651,-0.17413,-0.438601,798.780783,-158.887376,682.822311,
+ 0.882512,-0.08692,-0.462187,814.429823,0,682.822311,
+ 0.787008,-0.166056,-0.594175,768.954752,-152.95461,631.979457,
+ 0.792149,-0.07802,-0.60532,784.019466,0,631.979457,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.241413,-0.795831,-0.555314,323.520353,-873.53093,1614.76108,
+ 0.31778,-0.767189,-0.557168,357.552241,-863.20747,1614.76108,
+ 0.241413,-0.795831,-0.555314,323.520353,-873.53093,1614.76108,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.241413,-0.795831,-0.555314,233.261899,-900.910533,1614.76108,
+ 0.241413,-0.795831,-0.555314,233.261899,-900.910533,1614.76108,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.162003,-0.814444,-0.557168,182.278552,-916.376162,1614.76108,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.241413,-0.795831,-0.555314,233.261899,-900.910533,1614.76108,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.331547,-0.797805,-0.503571,381.734129,-921.587711,1708.939502,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.184965,-0.925205,-0.331336,203.671281,-1023.924672,1812.397596,
+ 0,0,-1,-654.019524,0,1054.17292,
+ 0,0,-1,-778.906876,-154.934211,1054.17292,
+ 0,0,-1,-794.166564,0,1054.17292,
+ 0,0,-1,-778.906876,-154.934211,1054.17292,
+ 0,0,-1,-654.019524,0,1054.17292,
+ 0,0,-1,-733.714234,-303.914386,1054.17292,
+ 0,0,-1,-733.714234,-303.914386,1054.17292,
+ 0,0,-1,-654.019524,0,1054.17292,
+ 0,0,-1,-660.325365,-441.215303,1054.17292,
+ 0,0,-1,-660.325365,-441.215303,1054.17292,
+ 0,0,-1,-654.019524,0,1054.17292,
+ 0,0,-1,-641.452722,-127.592879,1054.17292,
+ 0,0,-1,-660.325365,-441.215303,1054.17292,
+ 0,0,-1,-641.452722,-127.592879,1054.17292,
+ 0,0,-1,-561.560563,-561.560563,1054.17292,
+ 0,0,-1,-561.560563,-561.560563,1054.17292,
+ 0,0,-1,-641.452722,-127.592879,1054.17292,
+ 0,0,-1,-604.235252,-250.282436,1054.17292,
+ 0,0,-1,-561.560563,-561.560563,1054.17292,
+ 0,0,-1,-604.235252,-250.282436,1054.17292,
+ 0,0,-1,-543.79736,-363.353779,1054.17292,
+ 0,0,-1,-561.560563,-561.560563,1054.17292,
+ 0,0,-1,-543.79736,-363.353779,1054.17292,
+ 0,0,-1,-441.215303,-660.325365,1054.17292,
+ 0,0,-1,-441.215303,-660.325365,1054.17292,
+ 0,0,-1,-543.79736,-363.353779,1054.17292,
+ 0,0,-1,-462.46164,-462.46164,1054.17292,
+ 0,0,-1,-441.215303,-660.325365,1054.17292,
+ 0,0,-1,-462.46164,-462.46164,1054.17292,
+ 0,0,-1,-363.353779,-543.79736,1054.17292,
+ 0,0,-1,-441.215303,-660.325365,1054.17292,
+ 0,0,-1,-363.353779,-543.79736,1054.17292,
+ 0,0,-1,-303.914386,-733.714234,1054.17292,
+ 0,0,-1,-303.914386,-733.714234,1054.17292,
+ 0,0,-1,-363.353779,-543.79736,1054.17292,
+ 0,0,-1,-250.282436,-604.235252,1054.17292,
+ 0,0,-1,-303.914386,-733.714234,1054.17292,
+ 0,0,-1,-250.282436,-604.235252,1054.17292,
+ 0,0,-1,-154.934211,-778.906876,1054.17292,
+ 0,0,-1,-154.934211,-778.906876,1054.17292,
+ 0,0,-1,-250.282436,-604.235252,1054.17292,
+ 0,0,-1,-127.592879,-641.452722,1054.17292,
+ 0,0,-1,-154.934211,-778.906876,1054.17292,
+ 0,0,-1,-127.592879,-641.452722,1054.17292,
+ 0,0,-1,0,-794.166564,1054.17292,
+ 0,0,-1,0,-794.166564,1054.17292,
+ 0,0,-1,-127.592879,-641.452722,1054.17292,
+ 0,0,-1,0,-654.019524,1054.17292,
+ 0,0,-1,0,-794.166564,1054.17292,
+ 0,0,-1,0,-654.019524,1054.17292,
+ 0,0,-1,127.592879,-641.452722,1054.17292,
+ 0,0,-1,0,-794.166564,1054.17292,
+ 0,0,-1,127.592879,-641.452722,1054.17292,
+ 0,0,-1,154.934211,-778.906876,1054.17292,
+ 0,0,-1,154.934211,-778.906876,1054.17292,
+ 0,0,-1,127.592879,-641.452722,1054.17292,
+ 0,0,-1,250.282436,-604.235252,1054.17292,
+ 0,0,-1,154.934211,-778.906876,1054.17292,
+ 0,0,-1,250.282436,-604.235252,1054.17292,
+ 0,0,-1,303.914386,-733.714234,1054.17292,
+ 0,0,-1,303.914386,-733.714234,1054.17292,
+ 0,0,-1,250.282436,-604.235252,1054.17292,
+ 0,0,-1,363.353779,-543.79736,1054.17292,
+ 0,0,-1,303.914386,-733.714234,1054.17292,
+ 0,0,-1,363.353779,-543.79736,1054.17292,
+ 0,0,-1,441.215303,-660.325365,1054.17292,
+ 0,0,-1,441.215303,-660.325365,1054.17292,
+ 0,0,-1,363.353779,-543.79736,1054.17292,
+ 0,0,-1,462.46164,-462.46164,1054.17292,
+ 0,0,-1,441.215303,-660.325365,1054.17292,
+ 0,0,-1,462.46164,-462.46164,1054.17292,
+ 0,0,-1,561.560563,-561.560563,1054.17292,
+ 0,0,-1,561.560563,-561.560563,1054.17292,
+ 0,0,-1,462.46164,-462.46164,1054.17292,
+ 0,0,-1,543.79736,-363.353779,1054.17292,
+ 0,0,-1,561.560563,-561.560563,1054.17292,
+ 0,0,-1,543.79736,-363.353779,1054.17292,
+ 0,0,-1,604.235252,-250.282436,1054.17292,
+ 0,0,-1,561.560563,-561.560563,1054.17292,
+ 0,0,-1,604.235252,-250.282436,1054.17292,
+ 0,0,-1,660.325365,-441.215303,1054.17292,
+ 0,0,-1,660.325365,-441.215303,1054.17292,
+ 0,0,-1,604.235252,-250.282436,1054.17292,
+ 0,0,-1,641.452722,-127.592879,1054.17292,
+ 0,0,-1,660.325365,-441.215303,1054.17292,
+ 0,0,-1,641.452722,-127.592879,1054.17292,
+ 0,0,-1,654.019524,0,1054.17292,
+ 0,0,-1,660.325365,-441.215303,1054.17292,
+ 0,0,-1,654.019524,0,1054.17292,
+ 0,0,-1,794.166564,0,1054.17292,
+ 0,0,-1,660.325365,-441.215303,1054.17292,
+ 0,0,-1,794.166564,0,1054.17292,
+ 0,0,-1,733.714234,-303.914386,1054.17292,
+ 0,0,-1,733.714234,-303.914386,1054.17292,
+ 0,0,-1,794.166564,0,1054.17292,
+ 0,0,-1,778.906876,-154.934211,1054.17292,
+ -0.027252,-0.830091,0.556961,0,-934.329033,2455.64332,
+ -0.171901,-0.857347,0.485186,-194.606371,-978.352295,2361.464898,
+ -0.001338,-0.87441,0.485186,0,-997.51935,2361.464898,
+ -0.171901,-0.857347,0.485186,-194.606371,-978.352295,2361.464898,
+ -0.027252,-0.830091,0.556961,0,-934.329033,2455.64332,
+ -0.188671,-0.808825,0.556961,-182.278552,-916.376162,2455.64332,
+ 0,0,1,-182.278552,-916.376162,2455.64332,
+ 0,0,1,0,-934.329033,2455.64332,
+ 0,0,1,-47.148298,-929.685331,2455.64332,
+ 0,0,-1,-182.278552,-916.376162,2455.64332,
+ 0,0,-1,-47.148298,-929.685331,2455.64332,
+ 0,0,-1,-141.006393,-920.441115,2455.64332,
+ 0,-0.707107,-0.707107,843.013714,-637.259985,2192.108705,
+ 0,-0.582554,-0.812792,180.675225,-670.885845,2219.704735,
+ 0,-0.707107,-0.707107,180.675225,-637.259985,2192.108705,
+ 0,-0.582554,-0.812792,180.675225,-670.885845,2219.704735,
+ 0,-0.707107,-0.707107,843.013714,-637.259985,2192.108705,
+ 0,-0.527988,-0.849252,806.222028,-670.885845,2219.704735,
+ -0.77301,-0.634393,-0,-635.110018,-545.224061,2549.07468,
+ -0.707107,-0.707107,-0,-594.593537,-594.593537,2455.64332,
+ -0.707107,-0.707107,-0,-594.593537,-594.593537,2549.07468,
+ -0.707107,-0.707107,-0,-594.593537,-594.593537,2455.64332,
+ -0.77301,-0.634393,-0,-635.110018,-545.224061,2549.07468,
+ -0.820367,-0.571838,-0,-699.168033,-467.169144,2455.64332,
+ -0.820367,-0.571838,-0,-699.168033,-467.169144,2455.64332,
+ -0.77301,-0.634393,-0,-635.110018,-545.224061,2549.07468,
+ -0.77301,-0.634393,-0,-689.000369,-479.558478,2549.07468,
+ -0.820367,-0.571838,-0,-699.168033,-467.169144,2455.64332,
+ -0.77301,-0.634393,-0,-689.000369,-479.558478,2549.07468,
+ -0.83147,-0.55557,-0,-699.168033,-467.169144,2549.07468,
+ 0.777333,-0.292484,-0.556961,863.20747,-357.552241,1614.76108,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.79057,-0.348586,-0.503476,921.587711,-381.734129,1708.939502,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.777333,-0.292484,-0.556961,863.20747,-357.552241,1614.76108,
+ 0.795831,-0.241413,-0.555314,887.227327,-278.369384,1614.76108,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.795831,-0.241413,-0.555314,887.227327,-278.369384,1614.76108,
+ 0.795831,-0.241413,-0.555314,914.651021,-187.96558,1614.76108,
+ 0.843385,-0.187656,-0.503476,978.352295,-194.606371,1708.939502,
+ 0.795831,-0.241413,-0.555314,914.651021,-187.96558,1614.76108,
+ 0.819458,-0.135214,-0.556961,916.376162,-182.278552,1614.76108,
+ 0.176518,-0.881175,-0.438601,158.887376,-798.780783,682.822311,
+ 0.001625,-0.81149,-0.584364,0,-784.019466,631.979457,
+ 0.159907,-0.795581,-0.584364,152.95461,-768.954752,631.979457,
+ 0.001625,-0.81149,-0.584364,0,-784.019466,631.979457,
+ 0.176518,-0.881175,-0.438601,158.887376,-798.780783,682.822311,
+ 0.001218,-0.898681,-0.438601,0,-814.429823,682.822311,
+ -0.523429,-0.785009,-0.331336,-580.006736,-868.041423,1812.397596,
+ -0.614068,-0.630655,-0.474547,-705.352697,-705.352697,1708.939502,
+ -0.479152,-0.718908,-0.503571,-554.192058,-829.407027,1708.939502,
+ -0.614068,-0.630655,-0.474547,-705.352697,-705.352697,1708.939502,
+ -0.523429,-0.785009,-0.331336,-580.006736,-868.041423,1812.397596,
+ -0.669886,-0.684903,-0.286639,-738.20855,-738.20855,1812.397596,
+ -0.910015,-0.412425,0.042178,-997.760837,-413.286071,2058.811877,
+ -0.841785,-0.538757,-0.033753,-897.96103,-599.998378,2011.592523,
+ -0.819881,-0.571538,0.033755,-897.96103,-599.998378,2058.811877,
+ -0.841785,-0.538757,-0.033753,-897.96103,-599.998378,2011.592523,
+ -0.910015,-0.412425,0.042178,-997.760837,-413.286071,2058.811877,
+ -0.923079,-0.382289,-0.0422,-997.760837,-413.286071,2011.592523,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.910015,-0.412425,0.042178,-997.760837,-413.286071,2058.811877,
+ -0.819881,-0.571538,0.033755,-897.96103,-599.998378,2058.811877,
+ -0.910015,-0.412425,0.042178,-997.760837,-413.286071,2058.811877,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.910916,-0.376813,0.168059,-990.771213,-410.390874,2148.211628,
+ -0.576766,-0.804716,0.140615,-467.169144,-699.168033,914.026067,
+ -0.691243,-0.718915,0.073102,-600.487204,-600.487204,855.371869,
+ -0.554824,-0.830073,0.056107,-471.799769,-706.098253,855.371869,
+ -0.691243,-0.718915,0.073102,-600.487204,-600.487204,855.371869,
+ -0.576766,-0.804716,0.140615,-467.169144,-699.168033,914.026067,
+ -0.722676,-0.676733,0.140615,-594.593537,-594.593537,914.026067,
+ 0.159907,-0.795581,-0.584364,152.95461,-768.954752,631.979457,
+ 0.024909,-0.75872,-0.65094,0,-745.443558,587.016307,
+ 0.172449,-0.739282,-0.65094,145.428824,-731.120069,587.016307,
+ 0.024909,-0.75872,-0.65094,0,-745.443558,587.016307,
+ 0.159907,-0.795581,-0.584364,152.95461,-768.954752,631.979457,
+ 0.001625,-0.81149,-0.584364,0,-784.019466,631.979457,
+ -0.631049,-0.421653,-0.651142,-619.813666,-414.146251,587.016307,
+ -0.586347,-0.571185,-0.574408,-554.385481,-554.385481,631.979457,
+ -0.692236,-0.442144,-0.570366,-651.888362,-435.577878,631.979457,
+ -0.586347,-0.571185,-0.574408,-554.385481,-554.385481,631.979457,
+ -0.631049,-0.421653,-0.651142,-619.813666,-414.146251,587.016307,
+ -0.518883,-0.55411,-0.65094,-527.108195,-527.108195,587.016307,
+ 0.456496,-0.854043,-0.249443,475.358482,-929.775248,1832.249363,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.445004,-0.832543,-0.329915,533.995007,-892.635204,1812.397596,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.456496,-0.854043,-0.249443,475.358482,-929.775248,1832.249363,
+ 0.456496,-0.854043,-0.249443,422.745208,-966.763694,1862.604996,
+ 0.388566,-0.856387,-0.340026,399.515588,-964.515951,1812.397596,
+ 0.456496,-0.854043,-0.249443,422.745208,-966.763694,1862.604996,
+ 0.326059,-0.911614,-0.25029,406.150723,-980.534583,1879.384872,
+ -0.483833,-0.675055,0.556961,-519.085398,-776.866198,2455.64332,
+ -0.619247,-0.617355,0.485186,-705.352697,-705.352697,2361.464898,
+ -0.486909,-0.726302,0.485186,-554.192058,-829.407027,2361.464898,
+ -0.619247,-0.617355,0.485186,-705.352697,-705.352697,2361.464898,
+ -0.483833,-0.675055,0.556961,-519.085398,-776.866198,2455.64332,
+ -0.606233,-0.567693,0.556961,-660.670395,-660.670395,2455.64332,
+ 0,0,-1,-660.670395,-660.670395,2455.64332,
+ 0,0,-1,-519.085398,-776.866198,2455.64332,
+ 0,0,-1,-569.38575,-735.585766,2455.64332,
+ 0,0,-1,-660.670395,-660.670395,2455.64332,
+ 0,0,-1,-569.38575,-735.585766,2455.64332,
+ 0,0,-1,-642.325255,-675.725862,2455.64332,
+ 0.380494,-0.91777,-0.113678,324.326404,-782.993204,796.15315,
+ 0.188038,-0.94135,-0.280182,163.055979,-819.737765,738.078199,
+ 0.368074,-0.886578,-0.280182,319.845809,-772.17609,738.078199,
+ 0.188038,-0.94135,-0.280182,163.055979,-819.737765,738.078199,
+ 0.380494,-0.91777,-0.113678,324.326404,-782.993204,796.15315,
+ 0.194135,-0.974366,-0.113678,165.340167,-831.221151,796.15315,
+ 0.976753,-0.214369,-0,824.724927,-164.047988,2455.64332,
+ 0.995185,-0.098017,-0,832.543812,-84.661515,2549.07468,
+ 0.980785,-0.19509,0,824.724927,-164.047988,2549.07468,
+ 0.995185,-0.098017,-0,832.543812,-84.661515,2549.07468,
+ 0.976753,-0.214369,-0,824.724927,-164.047988,2455.64332,
+ 0.995185,-0.098017,-0,840.882244,0,2455.64332,
+ 0.995185,-0.098017,-0,832.543812,-84.661515,2549.07468,
+ 0.995185,-0.098017,-0,840.882244,0,2455.64332,
+ 0.995185,-0.098017,0,840.882244,0,2549.07468,
+ -0.929871,-0.091584,-0.356303,-1043.984543,0,1812.397596,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.925561,-0.183175,-0.331336,-1023.924672,-203.671281,1812.397596,
+ -0.843385,-0.187656,-0.503476,-978.352295,-194.606371,1708.939502,
+ -0.929871,-0.091584,-0.356303,-1043.984543,0,1812.397596,
+ -0.850126,-0.08373,-0.51988,-997.51935,0,1708.939502,
+ -0.518883,-0.55411,-0.65094,-527.108195,-527.108195,587.016307,
+ -0.449489,-0.675632,-0.584364,-435.577878,-651.888362,631.979457,
+ -0.586347,-0.571185,-0.574408,-554.385481,-554.385481,631.979457,
+ -0.449489,-0.675632,-0.584364,-435.577878,-651.888362,631.979457,
+ -0.518883,-0.55411,-0.65094,-527.108195,-527.108195,587.016307,
+ -0.400811,-0.644692,-0.65094,-414.146251,-619.813666,587.016307,
+ -0.498268,-0.747902,-0.438601,-452.472967,-677.173649,682.822311,
+ -0.586347,-0.571185,-0.574408,-554.385481,-554.385481,631.979457,
+ -0.449489,-0.675632,-0.584364,-435.577878,-651.888362,631.979457,
+ -0.586347,-0.571185,-0.574408,-554.385481,-554.385481,631.979457,
+ -0.498268,-0.747902,-0.438601,-452.472967,-677.173649,682.822311,
+ -0.644016,-0.644016,-0.412901,-575.888851,-575.888851,682.822311,
+ 0.91563,-0.400602,-0.033753,997.760837,-413.286071,2011.592523,
+ 0.881921,-0.471397,-0,912.783669,-572.267169,2035.202245,
+ 0.880538,-0.470657,-0.055991,911.540742,-574.592523,2011.592523,
+ 0.881921,-0.471397,-0,912.783669,-572.267169,2035.202245,
+ 0.923514,-0.382532,0.028131,997.760837,-413.286071,2058.811877,
+ 0.880538,-0.470657,0.055991,911.540741,-574.592525,2058.811877,
+ 0.923514,-0.382532,0.028131,997.760837,-413.286071,2058.811877,
+ 0.881921,-0.471397,-0,912.783669,-572.267169,2035.202245,
+ 0.91563,-0.400602,-0.033753,997.760837,-413.286071,2011.592523,
+ 0.184965,-0.925205,-0.331336,203.671281,-1023.924672,1812.397596,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ 0.169533,-0.847157,-0.503571,194.606371,-978.352295,1708.939502,
+ 0.001003,-0.863953,-0.503571,0,-997.51935,1708.939502,
+ 0.184965,-0.925205,-0.331336,203.671281,-1023.924672,1812.397596,
+ 0.000913,-0.943512,-0.331336,0,-1043.984543,1812.397596,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.097863,-0.993624,0.055991,36.399844,-1076.383476,2058.811877,
+ 0.168583,-0.985419,0.023006,210.691412,-1059.217255,2058.811877,
+ 0.097863,-0.993624,0.055991,36.399844,-1076.383476,2058.811877,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.097671,-0.991674,0.083921,35.951781,-1076.356667,2059.650143,
+ 0.097671,-0.991674,0.083921,35.951781,-1076.356667,2059.650143,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.097671,-0.991674,0.083921,30.354884,-1076.33078,2066.469982,
+ 0.097671,-0.991674,0.083921,30.354884,-1076.33078,2066.469982,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.097671,-0.991674,0.083921,23.535045,-1076.528834,2072.06688,
+ 0.097671,-0.991674,0.083921,23.535045,-1076.528834,2072.06688,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.097671,-0.991674,0.083921,15.754347,-1076.943219,2076.225749,
+ 0.097671,-0.991674,0.083921,15.754347,-1076.943219,2076.225749,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.097671,-0.991674,0.083921,7.311798,-1077.55801,2078.786769,
+ 0.097671,-0.991674,0.083921,7.311798,-1077.55801,2078.786769,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ 0.032696,-0.995906,0.084279,0,-1078.217216,2079.506918,
+ 0.032696,-0.995906,0.084279,0,-1078.217216,2079.506918,
+ 0.165848,-0.978799,0.120197,209.215453,-1051.797109,2148.211628,
+ -0.000463,-0.985777,0.168059,0,-1072.403033,2148.211628,
+ 0.592199,-0.097715,0.799845,824.724927,-164.047988,914.026067,
+ 0.598955,-0.058992,0.798607,654.019524,0,1054.17292,
+ 0.584514,-0.136347,0.799845,641.452722,-127.592879,1054.17292,
+ 0.598955,-0.058992,0.798607,654.019524,0,1054.17292,
+ 0.592199,-0.097715,0.799845,824.724927,-164.047988,914.026067,
+ 0.598955,-0.058992,0.798607,840.882244,0,914.026067,
+ 0,0.412792,-0.910825,653.750225,-879.083714,2240.210435,
+ 0,0.527988,-0.849252,180.675225,-917.447181,2219.704735,
+ 0,0.352162,-0.935939,180.675225,-879.083714,2240.210435,
+ 0,0.527988,-0.849252,180.675225,-917.447181,2219.704735,
+ 0,0.412792,-0.910825,653.750225,-879.083714,2240.210435,
+ 0,0.582554,-0.812792,653.750225,-917.447181,2219.704735,
+ 0.145631,-0.882589,0.447021,145.820434,-733.088824,1427.89836,
+ 0.029352,-0.894042,0.447021,0,-840.882244,1241.03564,
+ 0.203207,-0.871137,0.447021,164.047988,-824.724927,1241.03564,
+ 0.029352,-0.894042,0.447021,0,-840.882244,1241.03564,
+ 0.145631,-0.882589,0.447021,145.820434,-733.088824,1427.89836,
+ -0.029352,-0.894042,0.447021,0,-747.450884,1427.89836,
+ -0.247761,-0.546683,0.799845,-321.791703,-776.873894,914.026067,
+ -0.316902,-0.509726,0.799845,-363.353779,-543.79736,1054.17292,
+ -0.349653,-0.487843,0.799845,-467.169144,-699.168033,914.026067,
+ -0.316902,-0.509726,0.799845,-363.353779,-543.79736,1054.17292,
+ -0.247761,-0.546683,0.799845,-321.791703,-776.873894,914.026067,
+ -0.21137,-0.561756,0.799845,-250.282436,-604.235252,1054.17292,
+ 0,-0.290285,-0.95694,577.578281,-864.406983,1802.66502,
+ 0,-0.336778,-0.941584,653.750225,-887.575434,1809.693092,
+ 0,-0.412792,-0.910825,540.896876,-887.575434,1809.693092,
+ 0,-0.336778,-0.941584,653.750225,-887.575434,1809.693092,
+ 0,-0.290285,-0.95694,577.578281,-864.406983,1802.66502,
+ 0,-0.227168,-0.973856,600.307476,-841.785968,1795.80301,
+ 0,-0.336778,-0.941584,653.750225,-887.575434,1809.693092,
+ 0,-0.227168,-0.973856,600.307476,-841.785968,1795.80301,
+ 0,-0.19509,-0.980785,653.750225,-841.785968,1795.80301,
+ 0,-0.973856,-0.227168,653.750225,-1033.56568,1987.582722,
+ 0.147851,-0.963743,-0.222127,320.792433,-1019.675597,1941.793256,
+ 0,-0.903939,-0.427662,653.750225,-1019.675597,1941.793256,
+ 0.147851,-0.963743,-0.222127,320.792433,-1019.675597,1941.793256,
+ 0,-0.973856,-0.227168,653.750225,-1033.56568,1987.582722,
+ 0.117291,-0.984202,-0.132626,288.287532,-1033.56568,1987.582722,
+ 0.145631,-0.882589,0.447021,136.706657,-687.270773,1241.03564,
+ 0.029352,-0.894042,0.447021,0,-794.166564,1054.17292,
+ 0.203207,-0.871137,0.447021,154.934211,-778.906876,1054.17292,
+ 0.029352,-0.894042,0.447021,0,-794.166564,1054.17292,
+ 0.145631,-0.882589,0.447021,136.706657,-687.270773,1241.03564,
+ -0.029352,-0.894042,0.447021,0,-700.735204,1241.03564,
+ -0.555123,-0.830697,0.0422,-599.998378,-897.96103,2058.811877,
+ -0.634145,-0.772707,-0.027996,-644.00684,-861.844218,2011.592523,
+ -0.575005,-0.816448,-0.052732,-599.998378,-897.96103,2011.592523,
+ -0.634145,-0.772707,-0.027996,-644.00684,-861.844218,2011.592523,
+ -0.555123,-0.830697,0.0422,-599.998378,-897.96103,2058.811877,
+ -0.633398,-0.771798,0.055991,-644.327894,-861.580736,2058.811877,
+ -0.032487,-0.989531,0.140615,0,-840.882244,914.026067,
+ -0.194936,-0.97921,0.056107,-165.674047,-832.899679,855.371869,
+ -0.000155,-0.998425,0.056107,0,-849.217148,855.371869,
+ -0.194936,-0.97921,0.056107,-165.674047,-832.899679,855.371869,
+ -0.032487,-0.989531,0.140615,0,-840.882244,914.026067,
+ -0.224911,-0.96418,0.140615,-164.047988,-824.724927,914.026067,
+ 0.993624,-0.097863,0.055991,1079.968548,0,2058.811877,
+ 0.966926,-0.191862,0.168059,1051.797109,-209.215453,2148.211628,
+ 0.979923,-0.19486,0.0422,1059.217255,-210.691412,2058.811877,
+ 0.966926,-0.191862,0.168059,1051.797109,-209.215453,2148.211628,
+ 0.993624,-0.097863,0.055991,1079.968548,0,2058.811877,
+ 0.976104,-0.096138,0.19488,1072.403033,0,2148.211628,
+ -0.55557,0,-0.83147,23.535045,-976.504549,2072.06688,
+ -0.412792,0,-0.910825,15.754347,-1076.943219,2076.225749,
+ -0.352162,0,-0.935939,15.754347,-977.02193,2076.225749,
+ -0.412792,0,-0.910825,15.754347,-1076.943219,2076.225749,
+ -0.55557,0,-0.83147,23.535045,-976.504549,2072.06688,
+ -0.55557,0,-0.83147,23.535045,-1076.528834,2072.06688,
+ -0.509726,-0.316902,0.799845,-699.168033,-467.169144,914.026067,
+ -0.546683,-0.247761,0.799845,-604.235252,-250.282436,1054.17292,
+ -0.561756,-0.21137,0.799845,-776.873894,-321.791703,914.026067,
+ -0.546683,-0.247761,0.799845,-604.235252,-250.282436,1054.17292,
+ -0.509726,-0.316902,0.799845,-699.168033,-467.169144,914.026067,
+ -0.487843,-0.349653,0.799845,-543.79736,-363.353779,1054.17292,
+ 0.188038,-0.94135,-0.280182,163.055979,-819.737765,738.078199,
+ 0.001218,-0.898681,-0.438601,0,-814.429823,682.822311,
+ 0.176518,-0.881175,-0.438601,158.887376,-798.780783,682.822311,
+ 0.001218,-0.898681,-0.438601,0,-814.429823,682.822311,
+ 0.188038,-0.94135,-0.280182,163.055979,-819.737765,738.078199,
+ 0.000777,-0.959946,-0.280182,0,-835.797377,738.078199,
+ -0.92664,-0.348663,0.140615,-776.873894,-321.791703,914.026067,
+ -0.972323,-0.22681,0.056077,-832.899679,-165.674047,855.371869,
+ -0.909392,-0.412143,0.056077,-784.574342,-324.981333,855.371869,
+ -0.972323,-0.22681,0.056077,-832.899679,-165.674047,855.371869,
+ -0.92664,-0.348663,0.140615,-776.873894,-321.791703,914.026067,
+ -0.976856,-0.161185,0.140615,-824.724927,-164.047988,914.026067,
+ -0.743689,-0.496917,0.447214,-660.325365,-441.215303,1614.76108,
+ -0.789573,-0.422036,0.445488,-772.428086,-428.732587,1427.89836,
+ -0.743689,-0.496917,0.447214,-738.010701,-493.122985,1427.89836,
+ -0.789573,-0.422036,0.445488,-772.428086,-428.732587,1427.89836,
+ -0.743689,-0.496917,0.447214,-660.325365,-441.215303,1614.76108,
+ -0.819473,-0.358504,0.447144,-733.714234,-303.914386,1614.76108,
+ -0.789573,-0.422036,0.445488,-772.428086,-428.732587,1427.89836,
+ -0.819473,-0.358504,0.447144,-733.714234,-303.914386,1614.76108,
+ -0.789573,-0.422036,0.445488,-814.713927,-349.621343,1427.89836,
+ -0.789573,-0.422036,0.445488,-814.713927,-349.621343,1427.89836,
+ -0.819473,-0.358504,0.447144,-733.714234,-303.914386,1614.76108,
+ -0.826343,-0.342282,0.447214,-820.033555,-339.66902,1427.89836,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.705336,-0.438515,-0.556961,-776.866198,-519.085398,1614.76108,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ -0.705336,-0.438515,-0.556961,-776.866198,-519.085398,1614.76108,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.733442,-0.392033,-0.555314,-813.095616,-451.304926,1614.76108,
+ -0.733442,-0.392033,-0.555314,-813.095616,-451.304926,1614.76108,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.733442,-0.392033,-0.555314,-857.607798,-368.02849,1614.76108,
+ -0.733442,-0.392033,-0.555314,-857.607798,-368.02849,1614.76108,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.777333,-0.292484,-0.556961,-863.20747,-357.552241,1614.76108,
+ 0.871137,-0.203207,0.447021,824.724927,-164.047988,1241.03564,
+ 0.837219,-0.315017,0.447021,690.554573,-286.03707,1427.89836,
+ 0.814754,-0.369253,0.447021,776.873894,-321.791703,1241.03564,
+ 0.837219,-0.315017,0.447021,690.554573,-286.03707,1427.89836,
+ 0.871137,-0.203207,0.447021,824.724927,-164.047988,1241.03564,
+ 0.882589,-0.145631,0.447021,733.088824,-145.820434,1427.89836,
+ 0,0,-1,-700.735204,0,1241.03564,
+ 0,0,-1,-824.724927,-164.047988,1241.03564,
+ 0,0,-1,-840.882244,0,1241.03564,
+ 0,0,-1,-824.724927,-164.047988,1241.03564,
+ 0,0,-1,-700.735204,0,1241.03564,
+ 0,0,-1,-776.873894,-321.791703,1241.03564,
+ 0,0,-1,-776.873894,-321.791703,1241.03564,
+ 0,0,-1,-700.735204,0,1241.03564,
+ 0,0,-1,-699.168033,-467.169144,1241.03564,
+ 0,0,-1,-699.168033,-467.169144,1241.03564,
+ 0,0,-1,-700.735204,0,1241.03564,
+ 0,0,-1,-687.270773,-136.706657,1241.03564,
+ 0,0,-1,-699.168033,-467.169144,1241.03564,
+ 0,0,-1,-687.270773,-136.706657,1241.03564,
+ 0,0,-1,-594.593537,-594.593537,1241.03564,
+ 0,0,-1,-594.593537,-594.593537,1241.03564,
+ 0,0,-1,-687.270773,-136.706657,1241.03564,
+ 0,0,-1,-647.394912,-268.159753,1241.03564,
+ 0,0,-1,-594.593537,-594.593537,1241.03564,
+ 0,0,-1,-647.394912,-268.159753,1241.03564,
+ 0,0,-1,-582.640028,-389.30762,1241.03564,
+ 0,0,-1,-594.593537,-594.593537,1241.03564,
+ 0,0,-1,-582.640028,-389.30762,1241.03564,
+ 0,0,-1,-467.169144,-699.168033,1241.03564,
+ 0,0,-1,-467.169144,-699.168033,1241.03564,
+ 0,0,-1,-582.640028,-389.30762,1241.03564,
+ 0,0,-1,-495.494614,-495.494614,1241.03564,
+ 0,0,-1,-467.169144,-699.168033,1241.03564,
+ 0,0,-1,-495.494614,-495.494614,1241.03564,
+ 0,0,-1,-389.30762,-582.640028,1241.03564,
+ 0,0,-1,-467.169144,-699.168033,1241.03564,
+ 0,0,-1,-389.30762,-582.640028,1241.03564,
+ 0,0,-1,-321.791703,-776.873894,1241.03564,
+ 0,0,-1,-321.791703,-776.873894,1241.03564,
+ 0,0,-1,-389.30762,-582.640028,1241.03564,
+ 0,0,-1,-268.159753,-647.394912,1241.03564,
+ 0,0,-1,-321.791703,-776.873894,1241.03564,
+ 0,0,-1,-268.159753,-647.394912,1241.03564,
+ 0,0,-1,-164.047988,-824.724927,1241.03564,
+ 0,0,-1,-164.047988,-824.724927,1241.03564,
+ 0,0,-1,-268.159753,-647.394912,1241.03564,
+ 0,0,-1,-136.706657,-687.270773,1241.03564,
+ 0,0,-1,-164.047988,-824.724927,1241.03564,
+ 0,0,-1,-136.706657,-687.270773,1241.03564,
+ 0,0,-1,0,-840.882244,1241.03564,
+ 0,0,-1,0,-840.882244,1241.03564,
+ 0,0,-1,-136.706657,-687.270773,1241.03564,
+ 0,0,-1,0,-700.735204,1241.03564,
+ 0,0,-1,0,-840.882244,1241.03564,
+ 0,0,-1,0,-700.735204,1241.03564,
+ 0,0,-1,136.706657,-687.270773,1241.03564,
+ 0,0,-1,0,-840.882244,1241.03564,
+ 0,0,-1,136.706657,-687.270773,1241.03564,
+ 0,0,-1,164.047988,-824.724927,1241.03564,
+ 0,0,-1,164.047988,-824.724927,1241.03564,
+ 0,0,-1,136.706657,-687.270773,1241.03564,
+ 0,0,-1,268.159753,-647.394912,1241.03564,
+ 0,0,-1,164.047988,-824.724927,1241.03564,
+ 0,0,-1,268.159753,-647.394912,1241.03564,
+ 0,0,-1,321.791703,-776.873894,1241.03564,
+ 0,0,-1,321.791703,-776.873894,1241.03564,
+ 0,0,-1,268.159753,-647.394912,1241.03564,
+ 0,0,-1,389.30762,-582.640028,1241.03564,
+ 0,0,-1,321.791703,-776.873894,1241.03564,
+ 0,0,-1,389.30762,-582.640028,1241.03564,
+ 0,0,-1,467.169144,-699.168033,1241.03564,
+ 0,0,-1,467.169144,-699.168033,1241.03564,
+ 0,0,-1,389.30762,-582.640028,1241.03564,
+ 0,0,-1,495.494614,-495.494614,1241.03564,
+ 0,0,-1,467.169144,-699.168033,1241.03564,
+ 0,0,-1,495.494614,-495.494614,1241.03564,
+ 0,0,-1,594.593537,-594.593537,1241.03564,
+ 0,0,-1,594.593537,-594.593537,1241.03564,
+ 0,0,-1,495.494614,-495.494614,1241.03564,
+ 0,0,-1,582.640028,-389.30762,1241.03564,
+ 0,0,-1,594.593537,-594.593537,1241.03564,
+ 0,0,-1,582.640028,-389.30762,1241.03564,
+ 0,0,-1,647.394912,-268.159753,1241.03564,
+ 0,0,-1,594.593537,-594.593537,1241.03564,
+ 0,0,-1,647.394912,-268.159753,1241.03564,
+ 0,0,-1,699.168033,-467.169144,1241.03564,
+ 0,0,-1,699.168033,-467.169144,1241.03564,
+ 0,0,-1,647.394912,-268.159753,1241.03564,
+ 0,0,-1,687.270773,-136.706657,1241.03564,
+ 0,0,-1,699.168033,-467.169144,1241.03564,
+ 0,0,-1,687.270773,-136.706657,1241.03564,
+ 0,0,-1,700.735204,0,1241.03564,
+ 0,0,-1,699.168033,-467.169144,1241.03564,
+ 0,0,-1,700.735204,0,1241.03564,
+ 0,0,-1,776.873894,-321.791703,1241.03564,
+ 0,0,-1,776.873894,-321.791703,1241.03564,
+ 0,0,-1,700.735204,0,1241.03564,
+ 0,0,-1,840.882244,0,1241.03564,
+ 0,0,-1,776.873894,-321.791703,1241.03564,
+ 0,0,-1,840.882244,0,1241.03564,
+ 0,0,-1,824.724927,-164.047988,1241.03564,
+ 0.15719,-0.880542,0.447144,154.934211,-778.906876,1614.76108,
+ 0.087754,-0.890977,0.445488,133.953889,-874.404617,1427.89836,
+ 0.174494,-0.877241,0.447214,173.161765,-870.542978,1427.89836,
+ 0.087754,-0.890977,0.445488,133.953889,-874.404617,1427.89836,
+ 0.15719,-0.880542,0.447144,154.934211,-778.906876,1614.76108,
+ 0.087754,-0.890977,0.445488,44.790142,-883.18648,1427.89836,
+ 0.087754,-0.890977,0.445488,44.790142,-883.18648,1427.89836,
+ -0,-0.894427,0.447214,0,-794.166564,1614.76108,
+ -0,-0.894427,0.447214,0,-887.597924,1427.89836,
+ -0,-0.894427,0.447214,0,-794.166564,1614.76108,
+ 0.087754,-0.890977,0.445488,44.790142,-883.18648,1427.89836,
+ 0.15719,-0.880542,0.447144,154.934211,-778.906876,1614.76108,
+ 0,-0.935939,0.352162,653.750225,-1019.675597,2128.611098,
+ 0.146874,-0.976542,0.157463,288.287545,-1033.56568,2082.821632,
+ 0,-0.986659,0.162803,653.750225,-1033.56568,2082.821632,
+ 0.146874,-0.976542,0.157463,288.287545,-1033.56568,2082.821632,
+ 0,-0.935939,0.352162,653.750225,-1019.675597,2128.611098,
+ 0.118798,-0.950331,0.287676,320.792446,-1019.675597,2128.611098,
+ -0.582554,-0.812792,-0,-467.169144,-699.168033,2549.07468,
+ -0.707107,-0.707107,-0,-594.593537,-594.593537,2455.64332,
+ -0.527988,-0.849252,-0,-467.169144,-699.168033,2455.64332,
+ -0.707107,-0.707107,-0,-594.593537,-594.593537,2455.64332,
+ -0.582554,-0.812792,-0,-467.169144,-699.168033,2549.07468,
+ -0.707107,-0.707107,-0,-594.593537,-594.593537,2549.07468,
+ 0,0,1,-594.593537,-594.593537,2549.07468,
+ 0,0,1,-467.169144,-699.168033,2549.07468,
+ 0,0,1,-512.438676,-662.016288,2549.07468,
+ 0,0,1,-594.593537,-594.593537,2549.07468,
+ 0,0,1,-512.438676,-662.016288,2549.07468,
+ 0,0,1,-578.083211,-608.143211,2549.07468,
+ -0.840814,-0.522742,0.140615,-699.168033,-467.169144,914.026067,
+ -0.909392,-0.412143,0.056077,-784.574342,-324.981333,855.371869,
+ -0.811513,-0.581637,0.056077,-706.098253,-471.799769,855.371869,
+ -0.909392,-0.412143,0.056077,-784.574342,-324.981333,855.371869,
+ -0.840814,-0.522742,0.140615,-699.168033,-467.169144,914.026067,
+ -0.92664,-0.348663,0.140615,-776.873894,-321.791703,914.026067,
+ -0.923079,-0.382289,-0.0422,-997.760837,-413.286071,2011.592523,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.841785,-0.538757,-0.033753,-897.96103,-599.998378,2011.592523,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.923079,-0.382289,-0.0422,-997.760837,-413.286071,2011.592523,
+ -0.910916,-0.376813,-0.168059,-990.771213,-410.390874,1922.192772,
+ -0.910916,-0.376813,-0.168059,-990.771213,-410.390874,1922.192772,
+ -0.785009,-0.523429,-0.331336,-868.041423,-580.006736,1812.397596,
+ -0.804773,-0.576807,-0.140121,-891.670534,-595.795203,1922.192772,
+ -0.785009,-0.523429,-0.331336,-868.041423,-580.006736,1812.397596,
+ -0.910916,-0.376813,-0.168059,-990.771213,-410.390874,1922.192772,
+ -0.872041,-0.360223,-0.331336,-964.515951,-399.515588,1812.397596,
+ -0.872041,-0.360223,-0.331336,-964.515951,-399.515588,1812.397596,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ -0.785009,-0.523429,-0.331336,-868.041423,-580.006736,1812.397596,
+ -0.707373,-0.49612,-0.503476,-829.407027,-554.192058,1708.939502,
+ -0.872041,-0.360223,-0.331336,-964.515951,-399.515588,1812.397596,
+ -0.79057,-0.348586,-0.503476,-921.587711,-381.734129,1708.939502,
+ -0.674254,-0.733678,0.084249,-761.149822,-761.149822,2100.644855,
+ -0.772335,-0.633825,0.041998,-786.924742,-735.296195,2058.807508,
+ -0.683228,-0.729664,0.028116,-763.653083,-763.653083,2058.811877,
+ -0.772335,-0.633825,0.041998,-786.924742,-735.296195,2058.807508,
+ -0.674254,-0.733678,0.084249,-761.149822,-761.149822,2100.644855,
+ -0.770291,-0.632147,0.083917,-766.822004,-754.694855,2097.204109,
+ -0.772335,-0.633825,0.041998,-786.924742,-735.296195,2058.807508,
+ -0.770291,-0.632147,0.083917,-766.822004,-754.694855,2097.204109,
+ -0.770291,-0.632147,0.083917,-781.183382,-739.911027,2076.744949,
+ 0.890977,-0.087754,0.445488,887.597924,0,1427.89836,
+ 0.882589,-0.145631,0.447021,778.906876,-154.934211,1614.76108,
+ 0.871137,-0.203207,0.447021,870.542978,-173.161765,1427.89836,
+ 0.882589,-0.145631,0.447021,778.906876,-154.934211,1614.76108,
+ 0.890977,-0.087754,0.445488,887.597924,0,1427.89836,
+ 0.890977,-0.087754,0.445488,794.166564,0,1614.76108,
+ -0.872041,-0.360223,0.331336,-964.515951,-399.515588,2258.006804,
+ -0.966926,-0.191862,0.168059,-1051.797109,-209.215453,2148.211628,
+ -0.910916,-0.376813,0.168059,-990.771213,-410.390874,2148.211628,
+ -0.966926,-0.191862,0.168059,-1051.797109,-209.215453,2148.211628,
+ -0.872041,-0.360223,0.331336,-964.515951,-399.515588,2258.006804,
+ -0.925561,-0.183175,0.331336,-1023.924672,-203.671281,2258.006804,
+ 0.522742,-0.840814,0.140615,467.169144,-699.168033,914.026067,
+ 0.381937,-0.922484,0.056107,324.981333,-784.574342,855.371869,
+ 0.554566,-0.830246,0.056107,471.799769,-706.098253,855.371869,
+ 0.381937,-0.922484,0.056107,324.981333,-784.574342,855.371869,
+ 0.522742,-0.840814,0.140615,467.169144,-699.168033,914.026067,
+ 0.348663,-0.92664,0.140615,321.791703,-776.873894,914.026067,
+ 0.247761,-0.546683,0.799845,321.791703,-776.873894,914.026067,
+ 0.316902,-0.509726,0.799845,363.353779,-543.79736,1054.17292,
+ 0.21137,-0.561756,0.799845,250.282436,-604.235252,1054.17292,
+ 0.316902,-0.509726,0.799845,363.353779,-543.79736,1054.17292,
+ 0.247761,-0.546683,0.799845,321.791703,-776.873894,914.026067,
+ 0.349653,-0.487843,0.799845,467.169144,-699.168033,914.026067,
+ 0.872041,-0.360223,-0.331336,964.515951,-399.515588,1812.397596,
+ 0.966926,-0.191862,-0.168059,1051.797109,-209.215453,1922.192772,
+ 0.901839,-0.40872,-0.140121,990.771213,-410.390874,1922.192772,
+ 0.966926,-0.191862,-0.168059,1051.797109,-209.215453,1922.192772,
+ 0.872041,-0.360223,-0.331336,964.515951,-399.515588,1812.397596,
+ 0.925561,-0.183175,-0.331336,1023.924672,-203.671281,1812.397596,
+ 0.929871,-0.091584,0.356303,1043.984543,0,2258.006804,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ 0.925561,-0.183175,0.331336,1023.924672,-203.671281,2258.006804,
+ 0.843385,-0.187656,0.503476,978.352295,-194.606371,2361.464898,
+ 0.929871,-0.091584,0.356303,1043.984543,0,2258.006804,
+ 0.850126,-0.08373,0.51988,997.51935,0,2361.464898,
+ 0.748575,-0.61434,0.249443,767.904956,-709.249312,2240.210435,
+ 0.665498,-0.684813,0.29689,738.20855,-738.20855,2258.006804,
+ 0.684548,-0.684548,0.250574,739.77113,-739.77113,2249.469127,
+ 0.665498,-0.684813,0.29689,738.20855,-738.20855,2258.006804,
+ 0.748575,-0.61434,0.249443,767.904956,-709.249312,2240.210435,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.748575,-0.61434,0.249443,767.904956,-709.249312,2240.210435,
+ 0.748575,-0.61434,0.249443,806.222028,-670.885845,2219.704735,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.748575,-0.61434,0.249443,806.222028,-670.885845,2219.704735,
+ 0.748575,-0.61434,0.249443,843.013714,-637.259985,2192.108705,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.748575,-0.61434,0.249443,843.013714,-637.259985,2192.108705,
+ 0.748575,-0.61434,0.249443,876.866129,-609.663955,2158.482845,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.748575,-0.61434,0.249443,876.866129,-609.663955,2158.482845,
+ 0.75819,-0.62223,0.19488,884.794335,-604.173876,2148.211628,
+ 0.769936,-0.566074,0.294549,868.041423,-580.006736,2258.006804,
+ 0.75819,-0.62223,0.19488,884.794335,-604.173876,2148.211628,
+ 0.832671,-0.532692,0.151323,891.670534,-595.795203,2148.211628,
+ -0.619247,-0.617355,0.485186,-705.352697,-705.352697,2361.464898,
+ -0.785009,-0.523429,0.331336,-868.041423,-580.006736,2258.006804,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.785009,-0.523429,0.331336,-868.041423,-580.006736,2258.006804,
+ -0.619247,-0.617355,0.485186,-705.352697,-705.352697,2361.464898,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0,-0.995185,0.098017,911.540742,-574.592523,2011.592523,
+ -0,-0.986659,0.162803,180.675225,-576.530907,1991.911763,
+ 0,-0.973856,0.227168,908.62526,-576.530907,1991.911763,
+ -0,-0.986659,0.162803,180.675225,-576.530907,1991.911763,
+ -0,-0.995185,0.098017,911.540742,-574.592523,2011.592523,
+ 0,-0.999462,0.032813,180.675225,-572.267173,2035.202177,
+ 0,-0.999462,0.032813,180.675225,-572.267173,2035.202177,
+ -0,-0.995185,0.098017,911.540742,-574.592523,2011.592523,
+ 0,-1,-0,912.783669,-572.267169,2035.202245,
+ 0,-0.520969,-0.853575,180.675225,-572.267173,2035.202177,
+ 0,-0.520969,-0.853575,912.783669,-572.267169,2035.202245,
+ 0,-0.520969,-0.853575,907.767925,-572.267173,2035.202247,
+ -0,-0.382683,0.92388,767.904941,-709.249312,1830.193918,
+ 0,-0.527988,0.849252,180.675225,-670.885845,1850.699619,
+ 0,-0.352162,0.935939,180.675225,-709.249312,1830.193918,
+ 0,-0.527988,0.849252,180.675225,-670.885845,1850.699619,
+ -0,-0.382683,0.92388,767.904941,-709.249312,1830.193918,
+ 0,-0.582554,0.812792,806.222013,-670.885845,1850.699619,
+ 0.325954,-0.832956,0.447144,303.914386,-733.714234,1614.76108,
+ 0.259888,-0.856737,0.445488,307.339229,-829.84069,1427.89836,
+ 0.342282,-0.826343,0.447214,339.66902,-820.033555,1427.89836,
+ 0.259888,-0.856737,0.445488,307.339229,-829.84069,1427.89836,
+ 0.325954,-0.832956,0.447144,303.914386,-733.714234,1614.76108,
+ 0.259888,-0.856737,0.445488,221.595155,-855.85087,1427.89836,
+ 0.259888,-0.856737,0.445488,221.595155,-855.85087,1427.89836,
+ 0.15719,-0.880542,0.447144,154.934211,-778.906876,1614.76108,
+ 0.174494,-0.877241,0.447214,173.161765,-870.542978,1427.89836,
+ 0.15719,-0.880542,0.447144,154.934211,-778.906876,1614.76108,
+ 0.259888,-0.856737,0.445488,221.595155,-855.85087,1427.89836,
+ 0.325954,-0.832956,0.447144,303.914386,-733.714234,1614.76108,
+ -0.903939,-0,0.427662,40.110651,-1076.017993,2017.42443,
+ -0.849252,-0,0.527988,35.951781,-1076.262688,2009.643732,
+ -0.881921,-0,0.471397,36.993432,-1076.325013,2011.592523,
+ -0.849252,-0,0.527988,35.951781,-1076.262688,2009.643732,
+ -0.903939,-0,0.427662,40.110651,-1076.017993,2017.42443,
+ -0.83147,0,0.55557,35.951781,-975.958402,2009.643732,
+ -0.83147,0,0.55557,35.951781,-975.958402,2009.643732,
+ -0.903939,-0,0.427662,40.110651,-1076.017993,2017.42443,
+ -0.935939,0,0.352162,40.110651,-976.014545,2017.42443,
+ -0.904882,0.382198,0.187384,-853.465107,-778.056207,2053.98621,
+ -0.915533,0.385671,-0.11427,-818.480102,-696.846173,2011.592491,
+ -0.900096,0.367041,-0.234753,-853.905696,-778.543243,2019.687273,
+ -0.915533,0.385671,-0.11427,-818.480102,-696.846173,2011.592491,
+ -0.904882,0.382198,0.187384,-853.465107,-778.056207,2053.98621,
+ -0.904884,0.382185,0.187402,-818.273878,-697.096462,2058.801607,
+ 0.117054,-0.588471,0.8,164.047988,-824.724927,914.026067,
+ 0.21137,-0.561756,0.799845,250.282436,-604.235252,1054.17292,
+ 0.117054,-0.588471,0.8,127.592879,-641.452722,1054.17292,
+ 0.21137,-0.561756,0.799845,250.282436,-604.235252,1054.17292,
+ 0.117054,-0.588471,0.8,164.047988,-824.724927,914.026067,
+ 0.247761,-0.546683,0.799845,321.791703,-776.873894,914.026067,
+ 0.315017,-0.837219,0.447021,268.159753,-647.394912,1241.03564,
+ 0.203207,-0.871137,0.447021,154.934211,-778.906876,1054.17292,
+ 0.369253,-0.814754,0.447021,303.914386,-733.714234,1054.17292,
+ 0.203207,-0.871137,0.447021,154.934211,-778.906876,1054.17292,
+ 0.315017,-0.837219,0.447021,268.159753,-647.394912,1241.03564,
+ 0.145631,-0.882589,0.447021,136.706657,-687.270773,1241.03564,
+ -0.792149,-0.07802,-0.60532,-784.019466,0,631.979457,
+ -0.749001,-0.123588,-0.65094,-731.120069,-145.428824,587.016307,
+ -0.796215,-0.15672,-0.584364,-768.954752,-152.95461,631.979457,
+ -0.749001,-0.123588,-0.65094,-731.120069,-145.428824,587.016307,
+ -0.792149,-0.07802,-0.60532,-784.019466,0,631.979457,
+ -0.756844,-0.074543,-0.649331,-745.443558,0,587.016307,
+ -0.606233,-0.567693,0.556961,-660.670395,-660.670395,2455.64332,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0.619247,-0.617355,0.485186,-705.352697,-705.352697,2361.464898,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0.606233,-0.567693,0.556961,-660.670395,-660.670395,2455.64332,
+ -0.642867,-0.527587,0.555314,-705.689427,-605.814545,2455.64332,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0.642867,-0.527587,0.555314,-705.689427,-605.814545,2455.64332,
+ -0.642867,-0.527587,0.555314,-765.568614,-532.851545,2455.64332,
+ -0.707373,-0.49612,0.503476,-829.407027,-554.192058,2361.464898,
+ -0.642867,-0.527587,0.555314,-765.568614,-532.851545,2455.64332,
+ -0.705336,-0.438515,0.556961,-776.866198,-519.085398,2455.64332,
+ 0.811513,-0.581637,0.056077,706.098253,-471.799769,855.371869,
+ 0.700074,-0.700074,0.140689,594.593537,-594.593537,914.026067,
+ 0.69246,-0.720397,0.039075,600.487204,-600.487204,855.371869,
+ 0.700074,-0.700074,0.140689,594.593537,-594.593537,914.026067,
+ 0.811513,-0.581637,0.056077,706.098253,-471.799769,855.371869,
+ 0.840814,-0.522742,0.140615,699.168033,-467.169144,914.026067,
+ 0.348663,-0.92664,0.140615,321.791703,-776.873894,914.026067,
+ 0.19463,-0.979271,0.056107,165.674047,-832.899679,855.371869,
+ 0.381937,-0.922484,0.056107,324.981333,-784.574342,855.371869,
+ 0.19463,-0.979271,0.056107,165.674047,-832.899679,855.371869,
+ 0.348663,-0.92664,0.140615,321.791703,-776.873894,914.026067,
+ 0.161185,-0.976856,0.140615,164.047988,-824.724927,914.026067,
+ 0,-0.032813,0.999462,670.391133,-794.166513,1813.302837,
+ 0,-0.162803,0.986659,180.675225,-750.8761,1817.56657,
+ 0,0.049186,0.99879,180.675225,-794.166513,1813.302837,
+ 0,-0.162803,0.986659,180.675225,-750.8761,1817.56657,
+ 0,-0.032813,0.999462,670.391133,-794.166513,1813.302837,
+ -0,-0.243095,0.970002,724.871877,-750.8761,1817.56657,
+ 0,0.849252,-0.527988,180.675225,-978.669071,2158.482845,
+ 0,0.910825,-0.412792,653.750225,-999.174772,2120.119378,
+ 0,0.935939,-0.352162,180.675225,-999.174772,2120.119378,
+ 0,0.910825,-0.412792,653.750225,-999.174772,2120.119378,
+ 0,0.849252,-0.527988,180.675225,-978.669071,2158.482845,
+ 0,0.812792,-0.582554,653.750225,-978.669071,2158.482845,
+ 0,-0.973856,0.227168,180.675225,-707.112262,2017.886009,
+ 0,-0.92388,0.382683,104.493588,-712.163205,2001.235298,
+ 0,-0.92388,0.382683,180.675225,-712.163201,2001.235293,
+ 0,-0.92388,0.382683,104.493588,-712.163205,2001.235298,
+ 0,-0.973856,0.227168,180.675225,-707.112262,2017.886009,
+ 0,-0.986659,0.162803,104.493585,-707.112263,2017.886024,
+ 0.632456,-0.632456,0.447214,561.560563,-561.560563,1614.76108,
+ 0.567965,-0.692067,0.445488,540.907511,-698.794954,1427.89836,
+ 0.632456,-0.632456,0.447214,627.626511,-627.626511,1427.89836,
+ 0.567965,-0.692067,0.445488,540.907511,-698.794954,1427.89836,
+ 0.482193,-0.753361,0.447144,441.215303,-660.325365,1614.76108,
+ 0.496917,-0.743689,0.447214,493.122985,-738.010701,1427.89836,
+ 0.482193,-0.753361,0.447144,441.215303,-660.325365,1614.76108,
+ 0.567965,-0.692067,0.445488,540.907511,-698.794954,1427.89836,
+ 0.632456,-0.632456,0.447214,561.560563,-561.560563,1614.76108,
+ -0.358793,-0.190568,-0.913757,-750.03201,-762.726244,1915.0942,
+ -0.188016,-0.3607,-0.913535,-781.550765,-852.489443,1950.715796,
+ -0.475897,-0.070701,-0.876654,-805.854069,-828.277941,1950.684188,
+ -0.188016,-0.3607,-0.913535,-781.550765,-852.489443,1950.715796,
+ -0.358793,-0.190568,-0.913757,-750.03201,-762.726244,1915.0942,
+ -0.10232,-0.445425,-0.889453,-712.20051,-793.069744,1912.981477,
+ 0.438107,-0.410255,0.799845,594.593537,-594.593537,914.026067,
+ 0.487843,-0.349653,0.799845,543.79736,-363.353779,1054.17292,
+ 0.410255,-0.438107,0.799845,462.46164,-462.46164,1054.17292,
+ 0.487843,-0.349653,0.799845,543.79736,-363.353779,1054.17292,
+ 0.438107,-0.410255,0.799845,594.593537,-594.593537,914.026067,
+ 0.509726,-0.316902,0.799845,699.168033,-467.169144,914.026067,
+ -0.633398,-0.771798,0.055991,-683.397325,-829.517282,2058.811877,
+ -0.674254,-0.733678,0.084249,-761.149822,-761.149822,2100.644855,
+ -0.683228,-0.729664,0.028116,-763.653083,-763.653083,2058.811877,
+ -0.674254,-0.733678,0.084249,-761.149822,-761.149822,2100.644855,
+ -0.633398,-0.771798,0.055991,-683.397325,-829.517282,2058.811877,
+ -0.632155,-0.770284,0.083921,-688.216174,-823.53445,2077.427173,
+ -0.674254,-0.733678,0.084249,-761.149822,-761.149822,2100.644855,
+ -0.632155,-0.770284,0.083921,-688.216174,-823.53445,2077.427173,
+ -0.632155,-0.770284,0.083921,-703.270205,-808.916878,2098.19893,
+ -0.674254,-0.733678,0.084249,-761.149822,-761.149822,2100.644855,
+ -0.632155,-0.770284,0.083921,-703.270205,-808.916878,2098.19893,
+ -0.632155,-0.770284,0.083921,-723.842933,-790.8427,2109.126834,
+ -0.674254,-0.733678,0.084249,-761.149822,-761.149822,2100.644855,
+ -0.632155,-0.770284,0.083921,-723.842933,-790.8427,2109.126834,
+ -0.632155,-0.770284,0.083921,-746.579505,-772.239793,2108.608099,
+ -0.826255,-0.551707,-0.113678,-704.675266,-470.848959,796.15315,
+ -0.684138,-0.684138,-0.252806,-590.997993,-590.997993,738.078199,
+ -0.704523,-0.704523,-0.085417,-599.277053,-599.277053,796.15315,
+ -0.684138,-0.684138,-0.252806,-590.997993,-590.997993,738.078199,
+ -0.826255,-0.551707,-0.113678,-704.675266,-470.848959,796.15315,
+ -0.798598,-0.532672,-0.280182,-694.940121,-464.344144,738.078199,
+ -0.164361,-0.334551,0.927934,-779.335772,-850.040945,2123.148196,
+ -0.335138,-0.164419,0.927712,-750.226481,-763.163738,2153.518338,
+ -0.453201,-0.045611,0.890241,-803.639077,-825.829444,2123.116588,
+ -0.335138,-0.164419,0.927712,-750.226481,-763.163738,2153.518338,
+ -0.164361,-0.334551,0.927934,-779.335772,-850.040945,2123.148196,
+ -0.079281,-0.419958,0.904074,-713.051374,-793.031289,2155.442781,
+ -0,-0.243095,0.970002,724.871877,-750.8761,1817.56657,
+ 0,-0.352162,0.935939,180.675225,-709.249312,1830.193918,
+ 0,-0.162803,0.986659,180.675225,-750.8761,1817.56657,
+ 0,-0.352162,0.935939,180.675225,-709.249312,1830.193918,
+ -0,-0.243095,0.970002,724.871877,-750.8761,1817.56657,
+ -0,-0.382683,0.92388,767.904941,-709.249312,1830.193918,
+ -0,-0.382683,0.92388,767.904941,-709.249312,1830.193918,
+ -0,-0.243095,0.970002,724.871877,-750.8761,1817.56657,
+ -0,-0.290285,0.95694,739.771122,-739.771122,1820.935228,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.75819,-0.62223,0.194878,-759.379832,-756.991889,2148.211628,
+ -0.684548,-0.684548,0.250574,-758.175253,-758.175253,2148.912113,
+ -0.75819,-0.62223,0.194878,-759.379832,-756.991889,2148.211628,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.804774,-0.576808,0.140116,-891.670534,-595.795203,2148.211628,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.785009,-0.523429,0.331336,-868.041423,-580.006736,2258.006804,
+ -0.201549,0.493286,0.846195,-769.870311,-863.13013,1987.610439,
+ -0.033544,0.328548,0.943892,-723.636295,-790.983771,1961.015863,
+ 0.057027,0.239002,0.969343,-785.140115,-848.157193,1978.730924,
+ -0.033544,0.328548,0.943892,-723.636295,-790.983771,1961.015863,
+ -0.201549,0.493286,0.846195,-769.870311,-863.13013,1987.610439,
+ -0.278983,0.56848,0.77395,-702.965588,-809.153242,1972.08037,
+ 0.267392,-0.774255,0.573613,-655.637458,-847.372595,2104.031681,
+ 0.091725,-0.593783,0.79938,-757.051053,-872.595836,2110.051763,
+ 0.314449,-0.823891,0.471514,-740.177565,-890.06034,2085.821102,
+ 0.091725,-0.593783,0.79938,-757.051053,-872.595836,2110.051763,
+ 0.267392,-0.774255,0.573613,-655.637458,-847.372595,2104.031681,
+ 0.113282,-0.616155,0.779436,-680.351355,-823.413171,2137.783955,
+ -0.772335,-0.633825,0.041998,-786.924742,-735.296195,2058.807508,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.683228,-0.729664,0.028116,-763.653083,-763.653083,2058.811877,
+ -0.688905,-0.723623,-0.042187,-763.653083,-763.653083,2011.592523,
+ -0.772335,-0.633825,0.041998,-786.924742,-735.296195,2058.807508,
+ -0.772331,-0.633831,-0.041995,-786.927339,-735.293322,2011.59251,
+ -0.772331,-0.633831,-0.041995,-786.927339,-735.293322,2011.59251,
+ -0.772335,-0.633825,0.041998,-786.924742,-735.296195,2058.807508,
+ -0.773018,-0.634385,0.000005,-789.342859,-732.349615,2049.894341,
+ -0.772331,-0.633831,-0.041995,-786.927339,-735.293322,2011.59251,
+ -0.773018,-0.634385,0.000005,-789.342859,-732.349615,2049.894341,
+ -0.773009,-0.634395,0.000007,-789.394717,-732.286733,2020.799449,
+ -0.000001,0.683524,0.729928,104.493611,-856.929211,1972.439549,
+ -0.000001,0.582554,0.812792,180.675225,-843.478786,1961.401146,
+ -0.000001,0.527988,0.849252,104.493611,-843.478858,1961.40113,
+ -0.000001,0.582554,0.812792,180.675225,-843.478786,1961.401146,
+ -0.000001,0.683524,0.729928,104.493611,-856.929211,1972.439549,
+ -0.000001,0.729928,0.683524,180.675225,-856.929131,1972.439559,
+ -0,-0.412792,0.910825,104.493601,-760.199658,1953.198845,
+ -0,-0.527988,0.849252,180.675225,-744.854241,1961.401146,
+ -0,-0.582554,0.812792,104.493598,-744.854262,1961.40113,
+ -0,-0.527988,0.849252,180.675225,-744.854241,1961.401146,
+ -0,-0.412792,0.910825,104.493601,-760.199658,1953.198845,
+ -0,-0.352162,0.935939,180.675225,-760.199629,1953.198865,
+ -0.000001,0.986659,0.162803,104.493608,-881.220857,2017.886024,
+ -0.000001,0.999462,0.032813,180.675225,-882.926259,2035.202177,
+ -0.000001,0.973856,0.227168,180.675225,-881.220765,2017.886009,
+ -0.000001,0.999462,0.032813,180.675225,-882.926259,2035.202177,
+ -0.000001,0.986659,0.162803,104.493608,-881.220857,2017.886024,
+ -0.000001,0.999462,-0.032813,104.493606,-882.926352,2035.2022,
+ 0.972323,-0.22681,0.056077,832.899679,-165.674047,855.371869,
+ 0.92664,-0.348663,0.140615,776.873894,-321.791703,914.026067,
+ 0.909392,-0.412143,0.056077,784.574342,-324.981333,855.371869,
+ 0.92664,-0.348663,0.140615,776.873894,-321.791703,914.026067,
+ 0.972323,-0.22681,0.056077,832.899679,-165.674047,855.371869,
+ 0.976856,-0.161185,0.140615,824.724927,-164.047988,914.026067,
+ -0.486909,-0.726302,0.485186,-554.192058,-829.407027,2361.464898,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.538332,-0.779667,0.319873,-580.006736,-868.041423,2258.006804,
+ -0.666389,-0.680555,0.304582,-738.20855,-738.20855,2258.006804,
+ -0.486909,-0.726302,0.485186,-554.192058,-829.407027,2361.464898,
+ -0.619247,-0.617355,0.485186,-705.352697,-705.352697,2361.464898,
+ -0,0.162803,0.986659,104.493608,-811.482736,1948.147903,
+ -0,0.032813,0.999462,180.675225,-794.166513,1946.442431,
+ -0,-0.032813,0.999462,104.493606,-794.16656,1946.442408,
+ -0,0.032813,0.999462,180.675225,-794.166513,1946.442431,
+ -0,0.162803,0.986659,104.493608,-811.482736,1948.147903,
+ -0,0.227168,0.973856,180.675225,-811.482681,1948.147925,
+ -0.000001,0.92388,0.382683,104.49361,-876.169915,2001.235298,
+ -0.000001,0.849252,0.527988,180.675225,-867.967544,1985.889904,
+ -0.000001,0.812792,0.582554,104.493611,-867.96763,1985.889902,
+ -0.000001,0.849252,0.527988,180.675225,-867.967544,1985.889904,
+ -0.000001,0.92388,0.382683,104.49361,-876.169915,2001.235298,
+ -0.000001,0.92388,0.382683,180.675225,-876.169825,2001.235293,
+ 0.871137,-0.203207,0.447021,870.542978,-173.161765,1427.89836,
+ 0.837219,-0.315017,0.447021,733.714234,-303.914386,1614.76108,
+ 0.814754,-0.369253,0.447021,820.033555,-339.66902,1427.89836,
+ 0.837219,-0.315017,0.447021,733.714234,-303.914386,1614.76108,
+ 0.871137,-0.203207,0.447021,870.542978,-173.161765,1427.89836,
+ 0.882589,-0.145631,0.447021,778.906876,-154.934211,1614.76108,
+ -0,-0.032813,0.999462,104.493606,-794.16656,1946.442408,
+ -0,-0.162803,0.986659,180.675225,-776.850346,1948.147925,
+ -0,-0.227168,0.973856,104.493604,-776.850384,1948.147903,
+ -0,-0.162803,0.986659,180.675225,-776.850346,1948.147925,
+ -0,-0.032813,0.999462,104.493606,-794.16656,1946.442408,
+ -0,0.032813,0.999462,180.675225,-794.166513,1946.442431,
+ -0.000001,0.812792,0.582554,104.493611,-867.96763,1985.889902,
+ -0.000001,0.729928,0.683524,180.675225,-856.929131,1972.439559,
+ -0.000001,0.683524,0.729928,104.493611,-856.929211,1972.439549,
+ -0.000001,0.729928,0.683524,180.675225,-856.929131,1972.439559,
+ -0.000001,0.812792,0.582554,104.493611,-867.96763,1985.889902,
+ -0.000001,0.849252,0.527988,180.675225,-867.967544,1985.889904
+};
+static const struct gllist robot_body_half_outside_frame = { GL_N3F_V3F, GL_TRIANGLES, 4980, robot_body_half_outside_data, 0 };
+const struct gllist *robot_body_half_outside = &robot_body_half_outside_frame;
+
+static const float robot_crank_full_data[] = {
+ 0.494392,-0.002816,-0.869234,21.079139,-1635.024615,2001.52588,
+ 0.264054,-0.000004,-0.964508,7.982213,-1575.775514,1996.029042,
+ 0.604615,-0.002819,-0.796513,22.36552,-1575.775401,2002.065588,
+ 0.264054,-0.000004,-0.964508,7.982213,-1575.775514,1996.029042,
+ 0.494392,-0.002816,-0.869234,21.079139,-1635.024615,2001.52588,
+ 0.134401,-0.000005,-0.990927,7.982547,-1635.024718,1996.029357,
+ -0.29795,0.65913,-0.690488,-67.67685,-1260.036772,1941.044079,
+ -0.157155,0.595594,-0.787762,-7.617619,-1175.364474,1995.955026,
+ -0.310189,0.662309,-0.682004,-26.493073,-1260.036639,1922.313042,
+ 0.263844,0.659288,-0.704078,18.723832,-1260.036393,1920.768168,
+ 0.188248,0.621463,-0.760491,7.980911,-1175.364562,1996.027815,
+ 0.276537,0.662012,-0.696611,61.090003,-1260.03607,1936.644652,
+ 0.000006,-1,0.000005,39.173475,-1635.024291,2043.184745,
+ 0.000006,-1,0.000005,33.136928,-1635.024249,2057.568052,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.701587,-0.662307,0.262918,98.556303,-1491.102301,2096.293522,
+ 0.679262,-0.618094,0.395681,33.136594,-1575.775046,2057.567737,
+ 0.698932,-0.659128,0.277569,114.432787,-1491.102437,2053.927351,
+ -0.968686,-0.000003,0.24829,22.124996,-1479.423627,2131.053624,
+ -0.968686,-0.000002,0.24829,26.490435,-1260.035141,2148.088903,
+ -0.968685,-0.000002,0.248291,22.123694,-1271.716449,2131.052397,
+ -0.968686,-0.000002,0.24829,26.490435,-1260.035141,2148.088903,
+ -0.968686,-0.000003,0.24829,22.124996,-1479.423627,2131.053624,
+ -0.968686,-0.000003,0.248288,26.491737,-1491.102432,2148.090131,
+ -0.24829,-0.000002,-0.968686,-39.245963,-1575.775532,2042.8185,
+ -0.248291,-0.000005,-0.968685,-112.887948,-1491.103676,2061.693954,
+ -0.248289,-0.000005,-0.968686,-95.851569,-1479.424684,2057.327217,
+ 0.509398,-0.000001,-0.860531,-83.423414,-1271.715068,1983.068468,
+ 0.509398,-0.000001,-0.860531,-98.556338,-1491.104061,1974.110878,
+ 0.509398,-0.000001,-0.860531,-98.55764,-1260.03677,1974.10965,
+ 0.509398,-0.000001,-0.860531,-98.556338,-1491.104061,1974.110878,
+ 0.509398,-0.000001,-0.860531,-83.423414,-1271.715068,1983.068468,
+ 0.509399,-0.000001,-0.860531,-83.422112,-1479.425008,1983.069695,
+ 0.509398,-0.000001,-0.860531,-33.136629,-1575.775657,2012.836663,
+ 0.509398,-0.000001,-0.860531,-98.556338,-1491.104061,1974.110878,
+ 0.509399,-0.000001,-0.860531,-83.422112,-1479.425008,1983.069695,
+ 0.134401,-0.000005,-0.990927,7.982547,-1635.024718,1996.029357,
+ -0.125147,-0.000006,-0.992138,-7.616317,-1575.775602,1995.956254,
+ 0.264054,-0.000004,-0.964508,7.982213,-1575.775514,1996.029042,
+ -0.125147,-0.000006,-0.992138,-7.616317,-1575.775602,1995.956254,
+ 0.134401,-0.000005,-0.990927,7.982547,-1635.024718,1996.029357,
+ -0.255041,-0.000007,-0.96693,-7.615983,-1635.024806,1995.956569,
+ 0.968687,0.000002,-0.248286,-7.616317,-1575.775602,1995.956254,
+ 0.968687,0.000003,-0.248285,-26.491771,-1491.10393,1922.314269,
+ 0.968687,0.000003,-0.248287,-22.125162,-1479.424895,1939.350652,
+ -0.989965,-0.000002,-0.141315,7.982213,-1575.775514,1996.029042,
+ -0.989965,-0.000005,-0.141313,16.239785,-1479.424685,1938.180011,
+ -0.989965,-0.000005,-0.141316,18.725134,-1491.103683,1920.769396,
+ 0.860529,0.000003,0.509402,22.36552,-1575.775401,2002.065588,
+ 0.860528,0.000006,0.509402,61.091305,-1491.10336,1936.64588,
+ 0.86053,0.000006,0.5094,52.13236,-1479.42441,1951.780109,
+ -0.600085,-0.000006,-0.799936,94.156876,-1491.10301,1967.52667,
+ -0.600085,-0.000004,-0.799936,80.08694,-1271.715963,1978.079227,
+ -0.600083,-0.000002,-0.799938,94.155574,-1260.035719,1967.525442,
+ -0.600085,-0.000004,-0.799936,80.08694,-1271.715963,1978.079227,
+ -0.600085,-0.000006,-0.799936,94.156876,-1491.10301,1967.52667,
+ -0.600087,-0.000006,-0.799935,80.088242,-1479.424113,1978.080455,
+ -0.600086,-0.000003,-0.799936,33.343877,-1575.77528,2013.146883,
+ -0.600087,-0.000006,-0.799935,80.088242,-1479.424113,1978.080455,
+ -0.600085,-0.000006,-0.799936,94.156876,-1491.10301,1967.52667,
+ -0.011122,0.512212,-0.858787,16.238483,-1271.715391,1938.178783,
+ -0.157155,0.595594,-0.787762,-7.617619,-1175.364474,1995.955026,
+ 0.188248,0.621463,-0.760491,7.980911,-1175.364562,1996.027815,
+ -0.026244,0.509307,-0.860185,-22.126464,-1271.715181,1939.349424,
+ -0.157155,0.595594,-0.787762,-7.617619,-1175.364474,1995.955026,
+ -0.011122,0.512212,-0.858787,16.238483,-1271.715391,1938.178783,
+ 0.670858,0.621465,-0.404636,33.342575,-1175.364796,2013.145656,
+ 0.599391,0.512211,-0.615118,80.08694,-1271.715963,1978.079227,
+ 0.503006,0.570988,-0.648812,22.364218,-1175.364675,2002.064361,
+ 0.589687,0.509305,-0.6268,52.131057,-1271.715666,1951.778881,
+ 0.503006,0.570988,-0.648812,22.364218,-1175.364675,2002.064361,
+ 0.599391,0.512211,-0.615118,80.08694,-1271.715963,1978.079227,
+ 0.011083,0.509565,0.860361,22.123694,-1271.716449,2131.052397,
+ 0.200522,0.618102,0.760093,7.61498,-1175.364977,2074.446919,
+ -0.134987,0.595762,0.791736,-7.983549,-1175.364888,2074.374131,
+ 0.026184,0.512918,0.858038,-16.241253,-1271.716239,2132.223038,
+ 0.011083,0.509565,0.860361,22.123694,-1271.716449,2131.052397,
+ -0.134987,0.595762,0.791736,-7.983549,-1175.364888,2074.374131,
+ -0.600529,0.509567,0.616204,-52.133828,-1271.715965,2118.62294,
+ -0.458828,0.595592,0.659353,-22.366857,-1175.364775,2068.337584,
+ -0.655293,0.595761,0.464393,-33.345214,-1175.364654,2057.256289,
+ -0.588208,0.51292,0.62524,-80.08971,-1271.715667,2092.322594,
+ -0.600529,0.509567,0.616204,-52.133828,-1271.715965,2118.62294,
+ -0.655293,0.595761,0.464393,-33.345214,-1175.364654,2057.256289,
+ -0.860359,0.509569,0.011083,-95.852871,-1271.715393,2057.325989,
+ -0.818468,0.567229,-0.091441,-39.174477,-1175.364462,2027.218743,
+ -0.858036,0.512921,0.026184,-97.023513,-1271.715182,2018.961042,
+ -0.860359,0.509569,0.011083,-95.852871,-1271.715393,2057.325989,
+ -0.790675,0.595591,0.141793,-39.247265,-1175.364544,2042.817272,
+ -0.818468,0.567229,-0.091441,-39.174477,-1175.364462,2027.218743,
+ 0.964508,-0.000007,0.264054,39.184537,1078.14493,2043.195173,
+ 0.805975,-0.000008,0.59195,33.135292,-1175.365031,2057.56651,
+ 0.990927,-0.000006,0.134401,39.171839,-1175.364988,2043.183203,
+ 0.805975,-0.000008,0.59195,33.135292,-1175.365031,2057.56651,
+ 0.964508,-0.000007,0.264054,39.184537,1078.14493,2043.195173,
+ 0.828868,-0.000008,0.559444,33.147991,1078.144888,2057.578481,
+ -0.052104,-0.998211,0.029324,60.450424,1076.228739,1995.974225,
+ -0.058592,-0.99822,0.011094,39.257325,1078.145013,2027.596644,
+ -0.047585,-0.998218,0.036011,33.355273,1078.145123,2013.157627,
+ -0.058592,-0.99822,0.011094,39.257325,1078.145013,2027.596644,
+ -0.052104,-0.998211,0.029324,60.450424,1076.228739,1995.974225,
+ -0.058629,-0.998221,0.010878,70.865779,1076.228541,2022.090119,
+ 0.000006,-1,0.000005,39.246263,-1635.024374,2027.586215,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,33.344211,-1635.024484,2013.147198,
+ 0.600091,0.000004,0.799931,-80.08971,-1271.715667,2092.322594,
+ 0.600091,-0.000003,0.799932,-33.345214,-1175.364654,2057.256289,
+ 0.600093,0.000002,0.79993,-94.158213,-1260.036061,2102.876503,
+ 0.799933,0.000001,-0.600089,67.674211,-1260.035009,2129.357866,
+ 0.799933,0,-0.600089,57.120298,-1271.716562,2115.289236,
+ 0.799934,-0,-0.600089,22.053997,-1175.365027,2068.544867,
+ 0.141315,-0.000004,-0.989965,97.022044,-1479.423628,2051.442006,
+ 0.141353,-0.000057,-0.989959,97.020742,-1271.716448,2051.440779,
+ 0.141386,0.000019,-0.989955,114.431485,-1260.035146,2053.926124,
+ 0.141353,-0.000057,-0.989959,97.020742,-1271.716448,2051.440779,
+ 0.141456,0.000042,-0.989944,80.510481,-1244.216424,2049.079715,
+ 0.141386,0.000019,-0.989955,114.431485,-1260.035146,2053.926124,
+ 0.141386,0.000019,-0.989955,114.431485,-1260.035146,2053.926124,
+ 0.141456,0.000042,-0.989944,80.510481,-1244.216424,2049.079715,
+ 0.141525,0.000193,-0.989935,39.171839,-1175.364988,2043.183203,
+ 0.157159,-0.595592,0.787764,7.616282,-1575.7751,2074.448146,
+ 0.297952,-0.659128,0.690489,67.675513,-1491.1023,2129.359093,
+ 0.310189,-0.662307,0.682006,26.491737,-1491.102432,2148.090131,
+ 0.041321,0.973936,0.223028,6.624005,1105.461218,2070.640199,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.038908,0.962171,0.269655,-7.432857,1105.461298,2070.454406,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.218012,0.962233,0.163028,-30.156931,1105.461509,2054.832348,
+ -0.139076,0.962205,0.234133,-20.348604,1105.4614,2064.903427,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.296253,0.953532,0.054877,-35.364608,1105.461607,2041.774401,
+ -0.218012,0.962233,0.163028,-30.156931,1105.461509,2054.832348,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.261885,0.962249,-0.074108,-35.178814,1105.461681,2027.717539,
+ -0.296253,0.953532,0.054877,-35.364608,1105.461607,2041.774401,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.213632,0.962233,-0.168727,-29.627835,1105.461718,2014.801793,
+ -0.261885,0.962249,-0.074108,-35.178814,1105.461681,2027.717539,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.031768,0.962171,-0.270589,-6.49881,1105.461668,1999.785789,
+ -0.132844,0.962206,-0.237725,-19.556757,1105.461714,2004.993466,
+ 0.047203,0.973936,-0.221856,7.558052,1105.461588,1999.971583,
+ -0.031768,0.962171,-0.270589,-6.49881,1105.461668,1999.785789,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.139273,0.962112,-0.234402,20.473799,1105.461485,2005.522562,
+ 0.047203,0.973936,-0.221856,7.558052,1105.461588,1999.971583,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.21845,0.962084,-0.163322,30.282126,1105.461377,2015.59364,
+ 0.139273,0.962112,-0.234402,20.473799,1105.461485,2005.522562,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.296962,0.953305,-0.054991,35.489803,1105.461278,2028.651587,
+ 0.21845,0.962084,-0.163322,30.282126,1105.461377,2015.59364,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.296962,0.953305,-0.054991,35.489803,1105.461278,2028.651587,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.262503,0.962067,0.074285,35.304009,1105.461204,2042.708449,
+ 0.262503,0.962067,0.074285,35.304009,1105.461204,2042.708449,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.214052,0.962084,0.169045,29.75303,1105.461167,2055.624196,
+ 0.214052,0.962084,0.169045,29.75303,1105.461167,2055.624196,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.133025,0.962112,0.238003,19.681952,1105.461172,2065.432522,
+ 0.133025,0.962112,0.238003,19.681952,1105.461172,2065.432522,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ 0.041321,0.973936,0.223028,6.624005,1105.461218,2070.640199,
+ -0.261885,0.962249,-0.074108,-35.178814,1105.461681,2027.717539,
+ -0.380743,0.896586,-0.226203,-59.369433,1087.682068,1994.390591,
+ -0.438262,0.896618,-0.063262,-70.471391,1087.681993,2020.222085,
+ -0.380743,0.896586,-0.226203,-59.369433,1087.682068,1994.390591,
+ -0.261885,0.962249,-0.074108,-35.178814,1105.461681,2027.717539,
+ -0.213632,0.962233,-0.168727,-29.627835,1105.461718,2014.801793,
+ 0.381511,0.896149,0.22664,59.392298,1087.680965,2076.035397,
+ 0.262503,0.962067,0.074285,35.304009,1105.461204,2042.708449,
+ 0.214052,0.962084,0.169045,29.75303,1105.461167,2055.624196,
+ 0.262503,0.962067,0.074285,35.304009,1105.461204,2042.708449,
+ 0.381511,0.896149,0.22664,59.392298,1087.680965,2076.035397,
+ 0.439265,0.896117,0.063408,70.494256,1087.68104,2050.203904,
+ 0.08063,0.896706,0.435221,13.134247,1087.681066,2106.067405,
+ 0.133025,0.962112,0.238003,19.681952,1105.461172,2065.432522,
+ 0.041321,0.973936,0.223028,6.624005,1105.461218,2070.640199,
+ 0.133025,0.962112,0.238003,19.681952,1105.461172,2065.432522,
+ 0.08063,0.896706,0.435221,13.134247,1087.681066,2106.067405,
+ 0.265666,0.896215,0.355276,39.250141,1087.680974,2095.65205,
+ 0.439265,0.896117,0.063408,70.494256,1087.68104,2050.203904,
+ 0.296962,0.953305,-0.054991,35.489803,1105.461278,2028.651587,
+ 0.262503,0.962067,0.074285,35.304009,1105.461204,2042.708449,
+ 0.296962,0.953305,-0.054991,35.489803,1105.461278,2028.651587,
+ 0.439265,0.896117,0.063408,70.494256,1087.68104,2050.203904,
+ 0.435624,0.896507,-0.080672,70.865843,1087.681187,2022.09018,
+ -0.386582,0.896588,0.216066,-60.427624,1087.681648,2074.451703,
+ -0.296253,0.953532,0.054877,-35.364608,1105.461607,2041.774401,
+ -0.434637,0.897,0.080508,-70.842978,1087.681846,2048.335808,
+ -0.296253,0.953532,0.054877,-35.364608,1105.461607,2041.774401,
+ -0.386582,0.896588,0.216066,-60.427624,1087.681648,2074.451703,
+ -0.218012,0.962233,0.163028,-30.156931,1105.461509,2054.832348,
+ -0.213632,0.962233,-0.168727,-29.627835,1105.461718,2014.801793,
+ -0.26527,0.896521,-0.354799,-39.227276,1087.682058,1974.773938,
+ -0.380743,0.896586,-0.226203,-59.369433,1087.682068,1994.390591,
+ -0.26527,0.896521,-0.354799,-39.227276,1087.682058,1974.773938,
+ -0.213632,0.962233,-0.168727,-29.627835,1105.461718,2014.801793,
+ -0.132844,0.962206,-0.237725,-19.556757,1105.461714,2004.993466,
+ 0.139273,0.962112,-0.234402,20.473799,1105.461485,2005.522562,
+ 0.092108,0.896703,-0.432943,15.002342,1087.681806,1964.730171,
+ 0.047203,0.973936,-0.221856,7.558052,1105.461588,1999.971583,
+ 0.092108,0.896703,-0.432943,15.002342,1087.681806,1964.730171,
+ 0.139273,0.962112,-0.234402,20.473799,1105.461485,2005.522562,
+ 0.27497,0.896212,-0.34813,40.833836,1087.681602,1975.832129,
+ -0.296253,0.953532,0.054877,-35.364608,1105.461607,2041.774401,
+ -0.438262,0.896618,-0.063262,-70.471391,1087.681993,2020.222085,
+ -0.434637,0.897,0.080508,-70.842978,1087.681846,2048.335808,
+ -0.438262,0.896618,-0.063262,-70.471391,1087.681993,2020.222085,
+ -0.296253,0.953532,0.054877,-35.364608,1105.461607,2041.774401,
+ -0.261885,0.962249,-0.074108,-35.178814,1105.461681,2027.717539,
+ 0.296962,0.953305,-0.054991,35.489803,1105.461278,2028.651587,
+ 0.387375,0.896148,-0.216472,60.450489,1087.681384,1995.974286,
+ 0.21845,0.962084,-0.163322,30.282126,1105.461377,2015.59364,
+ 0.387375,0.896148,-0.216472,60.450489,1087.681384,1995.974286,
+ 0.296962,0.953305,-0.054991,35.489803,1105.461278,2028.651587,
+ 0.435624,0.896507,-0.080672,70.865843,1087.681187,2022.09018,
+ -0.12065,0.896435,0.426435,-14.979477,1087.681226,2105.695818,
+ -0.139076,0.962205,0.234133,-20.348604,1105.4614,2064.903427,
+ -0.274547,0.896523,0.347663,-40.810971,1087.681431,2094.593859,
+ -0.139076,0.962205,0.234133,-20.348604,1105.4614,2064.903427,
+ -0.12065,0.896435,0.426435,-14.979477,1087.681226,2105.695818,
+ -0.038908,0.962171,0.269655,-7.432857,1105.461298,2070.454406,
+ -0.274547,0.896523,0.347663,-40.810971,1087.681431,2094.593859,
+ -0.218012,0.962233,0.163028,-30.156931,1105.461509,2054.832348,
+ -0.386582,0.896588,0.216066,-60.427624,1087.681648,2074.451703,
+ -0.218012,0.962233,0.163028,-30.156931,1105.461509,2054.832348,
+ -0.274547,0.896523,0.347663,-40.810971,1087.681431,2094.593859,
+ -0.139076,0.962205,0.234133,-20.348604,1105.4614,2064.903427,
+ -0.132844,0.962206,-0.237725,-19.556757,1105.461714,2004.993466,
+ -0.109341,0.896433,-0.42948,-13.111382,1087.681967,1964.358584,
+ -0.26527,0.896521,-0.354799,-39.227276,1087.682058,1974.773938,
+ -0.109341,0.896433,-0.42948,-13.111382,1087.681967,1964.358584,
+ -0.132844,0.962206,-0.237725,-19.556757,1105.461714,2004.993466,
+ -0.031768,0.962171,-0.270589,-6.49881,1105.461668,1999.785789,
+ 0.21845,0.962084,-0.163322,30.282126,1105.461377,2015.59364,
+ 0.27497,0.896212,-0.34813,40.833836,1087.681602,1975.832129,
+ 0.139273,0.962112,-0.234402,20.473799,1105.461485,2005.522562,
+ 0.27497,0.896212,-0.34813,40.833836,1087.681602,1975.832129,
+ 0.21845,0.962084,-0.163322,30.282126,1105.461377,2015.59364,
+ 0.387375,0.896148,-0.216472,60.450489,1087.681384,1995.974286,
+ 0.08063,0.896706,0.435221,13.134247,1087.681066,2106.067405,
+ -0.038908,0.962171,0.269655,-7.432857,1105.461298,2070.454406,
+ -0.12065,0.896435,0.426435,-14.979477,1087.681226,2105.695818,
+ -0.038908,0.962171,0.269655,-7.432857,1105.461298,2070.454406,
+ 0.08063,0.896706,0.435221,13.134247,1087.681066,2106.067405,
+ 0.041321,0.973936,0.223028,6.624005,1105.461218,2070.640199,
+ -0.031768,0.962171,-0.270589,-6.49881,1105.461668,1999.785789,
+ 0.092108,0.896703,-0.432943,15.002342,1087.681806,1964.730171,
+ -0.109341,0.896433,-0.42948,-13.111382,1087.681967,1964.358584,
+ 0.092108,0.896703,-0.432943,15.002342,1087.681806,1964.730171,
+ -0.031768,0.962171,-0.270589,-6.49881,1105.461668,1999.785789,
+ 0.047203,0.973936,-0.221856,7.558052,1105.461588,1999.971583,
+ 0.265666,0.896215,0.355276,39.250141,1087.680974,2095.65205,
+ 0.214052,0.962084,0.169045,29.75303,1105.461167,2055.624196,
+ 0.133025,0.962112,0.238003,19.681952,1105.461172,2065.432522,
+ 0.214052,0.962084,0.169045,29.75303,1105.461167,2055.624196,
+ 0.265666,0.896215,0.355276,39.250141,1087.680974,2095.65205,
+ 0.381511,0.896149,0.22664,59.392298,1087.680965,2076.035397,
+ -0.828868,0.000008,-0.559444,-33.137931,-1175.36442,2012.835435,
+ -0.828868,0.000008,-0.559444,-33.129537,314.385267,2012.843349,
+ -0.584403,0.000008,-0.811464,-22.056636,-1175.364424,2001.857078,
+ 0.000006,1,0.000005,-33.345214,-1175.364654,2057.256289,
+ 0.000006,1,0.000005,-39.174477,-1175.364462,2027.218743,
+ 0.000006,1,0.000005,-39.247265,-1175.364544,2042.817272,
+ 0.000006,1,0.000005,-39.174477,-1175.364462,2027.218743,
+ 0.000006,1,0.000005,-33.345214,-1175.364654,2057.256289,
+ 0.000006,1,0.000005,-33.137931,-1175.36442,2012.835435,
+ 0.000006,1,0.000005,-33.137931,-1175.36442,2012.835435,
+ 0.000006,1,0.000005,-33.345214,-1175.364654,2057.256289,
+ 0.000006,1,0.000005,-22.366857,-1175.364775,2068.337584,
+ 0.000006,1,0.000005,-33.137931,-1175.36442,2012.835435,
+ 0.000006,1,0.000005,-22.366857,-1175.364775,2068.337584,
+ 0.000006,1,0.000005,-22.056636,-1175.364424,2001.857078,
+ 0.000006,1,0.000005,-22.056636,-1175.364424,2001.857078,
+ 0.000006,1,0.000005,-22.366857,-1175.364775,2068.337584,
+ 0.000006,1,0.000005,-7.983549,-1175.364888,2074.374131,
+ 0.000006,1,0.000005,-22.056636,-1175.364424,2001.857078,
+ 0.000006,1,0.000005,-7.983549,-1175.364888,2074.374131,
+ 0.000006,1,0.000005,-7.617619,-1175.364474,1995.955026,
+ 0.000006,1,0.000005,-7.617619,-1175.364474,1995.955026,
+ 0.000006,1,0.000005,-7.983549,-1175.364888,2074.374131,
+ 0.000006,1,0.000005,7.61498,-1175.364977,2074.446919,
+ 0.000006,1,0.000005,-7.617619,-1175.364474,1995.955026,
+ 0.000006,1,0.000005,7.61498,-1175.364977,2074.446919,
+ 0.000006,1,0.000005,7.980911,-1175.364562,1996.027815,
+ 0.000006,1,0.000005,7.980911,-1175.364562,1996.027815,
+ 0.000006,1,0.000005,7.61498,-1175.364977,2074.446919,
+ 0.000006,1,0.000005,22.053997,-1175.365027,2068.544867,
+ 0.000006,1,0.000005,7.980911,-1175.364562,1996.027815,
+ 0.000006,1,0.000005,22.053997,-1175.365027,2068.544867,
+ 0.000006,1,0.000005,22.364218,-1175.364675,2002.064361,
+ 0.000006,1,0.000005,22.364218,-1175.364675,2002.064361,
+ 0.000006,1,0.000005,22.053997,-1175.365027,2068.544867,
+ 0.000006,1,0.000005,33.135292,-1175.365031,2057.56651,
+ 0.000006,1,0.000005,22.364218,-1175.364675,2002.064361,
+ 0.000006,1,0.000005,33.135292,-1175.365031,2057.56651,
+ 0.000006,1,0.000005,33.342575,-1175.364796,2013.145656,
+ 0.000006,1,0.000005,33.342575,-1175.364796,2013.145656,
+ 0.000006,1,0.000005,33.135292,-1175.365031,2057.56651,
+ 0.000006,1,0.000005,39.171839,-1175.364988,2043.183203,
+ 0.000006,1,0.000005,33.342575,-1175.364796,2013.145656,
+ 0.000006,1,0.000005,39.171839,-1175.364988,2043.183203,
+ 0.000006,1,0.000005,39.244627,-1175.364906,2027.584673,
+ -0.968686,-0.000002,0.24829,26.490435,-1260.035141,2148.088903,
+ -0.968686,0.000002,0.248289,7.61498,-1175.364977,2074.446919,
+ -0.968685,-0.000002,0.248291,22.123694,-1271.716449,2131.052397,
+ 0.616202,0.509565,0.600532,83.420644,-1271.716562,2087.333353,
+ 0.679257,0.618102,0.395677,33.135292,-1175.365031,2057.56651,
+ 0.514085,0.56723,0.643402,22.053997,-1175.365027,2068.544867,
+ 0.625238,0.512917,0.588212,57.120298,-1271.716562,2115.289236,
+ 0.616202,0.509565,0.600532,83.420644,-1271.716562,2087.333353,
+ 0.514085,0.56723,0.643402,22.053997,-1175.365027,2068.544867,
+ 0.858794,0.512199,-0.011179,97.020742,-1271.716448,2051.440779,
+ 0.860187,0.509303,-0.026244,95.850101,-1271.716238,2013.075832,
+ 0.826538,0.557702,-0.076187,39.244627,-1175.364906,2027.584673,
+ 0.858794,0.512199,-0.011179,97.020742,-1271.716448,2051.440779,
+ 0.826538,0.557702,-0.076187,39.244627,-1175.364906,2027.584673,
+ 0.85719,0.514985,0.003946,80.510481,-1244.216424,2049.079715,
+ 0.85719,0.514985,0.003946,80.510481,-1244.216424,2049.079715,
+ 0.826538,0.557702,-0.076187,39.244627,-1175.364906,2027.584673,
+ 0.789459,0.595062,0.15052,39.171839,-1175.364988,2043.183203,
+ 0.679262,-0.618094,0.395681,33.136594,-1575.775046,2057.567737,
+ 0.789465,-0.595053,0.150522,39.173141,-1575.775088,2043.18443,
+ 0.698932,-0.659128,0.277569,114.432787,-1491.102437,2053.927351,
+ -0.510751,-0.000002,0.859729,-40.810971,1087.681431,2094.593859,
+ -0.272291,-0.000004,0.962215,-14.979542,1076.228581,2105.695757,
+ -0.142868,-0.000004,0.989742,-14.979477,1087.681226,2105.695818,
+ -0.272291,-0.000004,0.962215,-14.979542,1076.228581,2105.695757,
+ -0.510751,-0.000002,0.859729,-40.810971,1087.681431,2094.593859,
+ -0.619788,-0.000001,0.784769,-40.811035,1076.228785,2094.593798,
+ 0.246765,-0.000007,0.969075,13.134247,1087.681066,2106.067405,
+ 0.48785,-0.000007,0.872928,39.250077,1076.228329,2095.65199,
+ 0.59883,-0.000008,0.800876,39.250141,1087.680974,2095.65205,
+ 0.48785,-0.000007,0.872928,39.250077,1076.228329,2095.65199,
+ 0.246765,-0.000007,0.969075,13.134247,1087.681066,2106.067405,
+ 0.11666,-0.000006,0.993172,13.134182,1076.228421,2106.067344,
+ -0.246765,0.000007,-0.969075,-13.111446,1076.229321,1964.358523,
+ -0.48785,0.000007,-0.872928,-39.227276,1087.682058,1974.773938,
+ -0.11666,0.000006,-0.993172,-13.111382,1087.681967,1964.358584,
+ -0.48785,0.000007,-0.872928,-39.227276,1087.682058,1974.773938,
+ -0.246765,0.000007,-0.969075,-13.111446,1076.229321,1964.358523,
+ -0.59883,0.000008,-0.800876,-39.22734,1076.229413,1974.773877,
+ 0.872928,-0.000002,-0.48785,60.450489,1087.681384,1995.974286,
+ 0.969075,-0.000004,-0.246765,70.865779,1076.228541,2022.090119,
+ 0.800876,-0.000001,-0.59883,60.450424,1076.228739,1995.974225,
+ 0.969075,-0.000004,-0.246765,70.865779,1076.228541,2022.090119,
+ 0.872928,-0.000002,-0.48785,60.450489,1087.681384,1995.974286,
+ 0.993172,-0.000005,-0.11666,70.865843,1087.681187,2022.09018,
+ -0.584403,0.000008,-0.811464,-22.056636,-1175.364424,2001.857078,
+ -0.828868,0.000008,-0.559444,-33.125233,1078.145499,2012.847406,
+ -0.495296,0.000007,-0.868724,-22.043938,1078.145495,2001.869049,
+ -0.828868,0.000008,-0.559444,-33.125233,1078.145499,2012.847406,
+ -0.584403,0.000008,-0.811464,-22.056636,-1175.364424,2001.857078,
+ -0.828868,0.000008,-0.559444,-33.129537,314.385267,2012.843349,
+ 0.613055,0.000001,-0.79004,22.376916,1078.145244,2002.076332,
+ 0.795727,-0.000001,-0.605656,33.342575,-1175.364796,2013.145656,
+ 0.503381,0.000002,-0.864064,22.364218,-1175.364675,2002.064361,
+ 0.795727,-0.000001,-0.605656,33.342575,-1175.364796,2013.145656,
+ 0.613055,0.000001,-0.79004,22.376916,1078.145244,2002.076332,
+ 0.868724,-0.000002,-0.495296,33.355273,1078.145123,2013.157627,
+ -0.029512,-0.998207,-0.052072,22.066696,1078.144892,2068.556838,
+ -0.011125,-0.99822,-0.058587,13.134182,1076.228421,2106.067344,
+ -0.011411,-0.99822,-0.058537,7.627679,1078.144942,2074.45889,
+ -0.011125,-0.99822,-0.058587,13.134182,1076.228421,2106.067344,
+ -0.029512,-0.998207,-0.052072,22.066696,1078.144892,2068.556838,
+ -0.035923,-0.998214,-0.047727,39.250077,1076.228329,2095.65199,
+ 0.030169,-0.998218,-0.051488,-22.354159,1078.145144,2068.349555,
+ 0.016094,-0.998211,-0.057584,-14.979542,1076.228581,2105.695757,
+ 0.036903,-0.998211,-0.04704,-40.811035,1076.228785,2094.593798,
+ 0.016094,-0.998211,-0.057584,-14.979542,1076.228581,2105.695757,
+ 0.030169,-0.998218,-0.051488,-22.354159,1078.145144,2068.349555,
+ 0.00817,-0.998218,-0.059117,-7.970851,1078.145031,2074.386102,
+ -0.012151,-0.998221,0.058373,15.002278,1076.229161,1964.73011,
+ -0.03018,-0.998218,0.051478,22.376916,1078.145244,2002.076332,
+ -0.011868,-0.998221,0.058436,7.993609,1078.145357,1996.039785,
+ -0.03018,-0.998218,0.051478,22.376916,1078.145244,2002.076332,
+ -0.012151,-0.998221,0.058373,15.002278,1076.229161,1964.73011,
+ -0.036914,-0.998211,0.047029,40.833771,1076.228956,1975.832068,
+ -0.012151,-0.998221,0.058373,15.002278,1076.229161,1964.73011,
+ 0.00733,-0.998208,0.05939,-7.604921,1078.145445,1995.966997,
+ 0.014915,-0.998215,0.057829,-13.111446,1076.229321,1964.358523,
+ 0.00733,-0.998208,0.05939,-7.604921,1078.145445,1995.966997,
+ -0.012151,-0.998221,0.058373,15.002278,1076.229161,1964.73011,
+ -0.011868,-0.998221,0.058436,7.993609,1078.145357,1996.039785,
+ 0.968687,-0.000002,-0.248286,-7.617619,-1175.364474,1995.955026,
+ 0.968687,0.000002,-0.248285,-22.126464,-1271.715181,1939.349424,
+ 0.968687,0.000001,-0.248284,-26.493073,-1260.036639,1922.313042,
+ -0.989965,0.000002,-0.141315,7.980911,-1175.364562,1996.027815,
+ -0.989964,-0.000002,-0.141318,18.723832,-1260.036393,1920.768168,
+ -0.989965,-0.000004,-0.141316,16.238483,-1271.715391,1938.178783,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-22.055,-1635.024856,2001.85862,
+ 0.000006,-1,0.000005,-7.615983,-1635.024806,1995.956569,
+ 0.000006,-1,0.000005,33.136928,-1635.024249,2057.568052,
+ 0.000006,-1,0.000005,22.055633,-1635.024253,2068.546409,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-39.172841,-1635.024818,2027.220285,
+ 0.000006,-1,0.000005,-33.136295,-1635.02486,2012.836977,
+ 0.000006,-1,0.000005,7.616616,-1635.024303,2074.448461,
+ 0.000006,-1,0.000005,-7.981913,-1635.024391,2074.375673,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ -0.5094,0.000001,0.86053,83.420644,-1271.716562,2087.333353,
+ -0.5094,0.000001,0.86053,98.556303,-1491.102301,2096.293522,
+ -0.5094,0.000001,0.86053,98.555001,-1260.035011,2096.292295,
+ -0.5094,0.000001,0.86053,98.556303,-1491.102301,2096.293522,
+ -0.5094,0.000001,0.86053,83.420644,-1271.716562,2087.333353,
+ -0.509399,0.000001,0.86053,83.421946,-1479.423514,2087.334581,
+ 0.141313,-0.000003,-0.989965,114.432787,-1491.102437,2053.927351,
+ 0.141315,-0.000004,-0.989965,97.022044,-1479.423628,2051.442006,
+ 0.141386,0.000019,-0.989955,114.431485,-1260.035146,2053.926124,
+ -0.134401,-0.000005,0.990927,-7.970851,1078.145031,2074.386102,
+ 0.190512,-0.000006,0.981685,7.61498,-1175.364977,2074.446919,
+ 0.255041,-0.000007,0.96693,7.627679,1078.144942,2074.45889,
+ 0.190512,-0.000006,0.981685,7.61498,-1175.364977,2074.446919,
+ -0.134401,-0.000005,0.990927,-7.970851,1078.145031,2074.386102,
+ -0.264054,-0.000004,0.964508,-7.983549,-1175.364888,2074.374131,
+ -0.936408,-0.000007,-0.350914,-98.556338,-1491.104061,1974.110878,
+ -0.936408,-0.000007,-0.350914,-114.434123,-1260.036635,2016.475821,
+ -0.936408,-0.000007,-0.350914,-98.55764,-1260.03677,1974.10965,
+ -0.936408,-0.000007,-0.350914,-114.434123,-1260.036635,2016.475821,
+ -0.936408,-0.000007,-0.350914,-98.556338,-1491.104061,1974.110878,
+ -0.936408,-0.000007,-0.350914,-114.432821,-1491.103925,2016.477049,
+ -0.188244,-0.621459,0.760495,-7.982247,-1575.775188,2074.375358,
+ -0.263845,-0.659285,0.70408,-18.725169,-1491.102679,2149.635004,
+ -0.276534,-0.662009,0.696616,-61.09134,-1491.103002,2133.75852,
+ 0.000006,-1,0.000005,22.055633,-1635.024253,2068.546409,
+ 0.000006,-1,0.000005,7.616616,-1635.024303,2074.448461,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,21.079139,-1635.024615,2001.52588,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,7.982547,-1635.024718,1996.029357,
+ 0.799934,0.000001,-0.600088,67.675513,-1491.1023,2129.359093,
+ 0.799934,0,-0.600089,22.055299,-1575.77505,2068.546095,
+ 0.799933,0.000001,-0.600089,57.1216,-1479.423514,2115.290463,
+ -0.276536,0.662015,0.696609,-61.092642,-1260.035711,2133.757293,
+ -0.134987,0.595762,0.791736,-7.983549,-1175.364888,2074.374131,
+ -0.458828,0.595592,0.659353,-22.366857,-1175.364775,2068.337584,
+ -0.276536,0.662015,0.696609,-61.092642,-1260.035711,2133.757293,
+ -0.263852,0.659293,0.704071,-18.726471,-1260.035388,2149.633777,
+ -0.134987,0.595762,0.791736,-7.983549,-1175.364888,2074.374131,
+ 0.297947,0.65914,0.69048,67.674211,-1260.035009,2129.357866,
+ 0.514085,0.56723,0.643402,22.053997,-1175.365027,2068.544867,
+ 0.200522,0.618102,0.760093,7.61498,-1175.364977,2074.446919,
+ -0.14131,0.000004,0.989965,-114.432821,-1491.103925,2016.477049,
+ -0.141312,0.000003,0.989965,-97.022211,-1479.424894,2018.96227,
+ -0.14131,0.000003,0.989965,-97.023513,-1271.715182,2018.961042,
+ -0.141311,0.000002,0.989965,-39.173175,-1575.775614,2027.21997,
+ -0.141312,0.000003,0.989965,-97.022211,-1479.424894,2018.96227,
+ -0.14131,0.000004,0.989965,-114.432821,-1491.103925,2016.477049,
+ -0.14131,0.000003,0.989965,-97.023513,-1271.715182,2018.961042,
+ -0.141311,-0.000002,0.989965,-39.174477,-1175.364462,2027.218743,
+ -0.141308,0.000001,0.989966,-114.434123,-1260.036635,2016.475821,
+ -0.14131,0.000004,0.989965,-114.432821,-1491.103925,2016.477049,
+ -0.14131,0.000003,0.989965,-97.023513,-1271.715182,2018.961042,
+ -0.141308,0.000001,0.989966,-114.434123,-1260.036635,2016.475821,
+ -0.552864,-0.002116,0.833269,-22.365555,-1575.775301,2068.338812,
+ -0.868724,-0.000002,0.495296,-33.343912,-1575.775422,2057.257517,
+ -0.789247,-0.002827,0.614069,-33.343578,-1635.024625,2057.257832,
+ -0.789247,-0.002827,0.614069,-33.343578,-1635.024625,2057.257832,
+ -0.546267,-0.004228,0.837601,-21.078506,-1635.024494,2068.87915,
+ -0.552864,-0.002116,0.833269,-22.365555,-1575.775301,2068.338812,
+ 0.494392,-0.002816,-0.869234,21.079139,-1635.024615,2001.52588,
+ 0.623957,-0.133857,-0.769909,22.36552,-1575.775401,2002.065588,
+ 0.829674,-0.002123,-0.558245,33.344211,-1635.024484,2013.147198,
+ 0.829674,-0.002123,-0.558245,33.344211,-1635.024484,2013.147198,
+ 0.604615,-0.002819,-0.796513,22.36552,-1575.775401,2002.065588,
+ 0.834053,0.000002,-0.551684,33.343877,-1575.77528,2013.146883,
+ 0.962215,-0.000007,0.272291,70.494256,1087.68104,2050.203904,
+ 0.824055,-0.000008,0.566511,59.392233,1076.228319,2076.035337,
+ 0.989742,-0.000006,0.142868,70.494191,1076.228394,2050.203843,
+ 0.824055,-0.000008,0.566511,59.392233,1076.228319,2076.035337,
+ 0.962215,-0.000007,0.272291,70.494256,1087.68104,2050.203904,
+ 0.824055,-0.000008,0.566511,59.392298,1087.680965,2076.035397,
+ 0.510751,0.000002,-0.859729,40.833771,1076.228956,1975.832068,
+ 0.272291,0.000004,-0.962215,15.002342,1087.681806,1964.730171,
+ 0.619788,0.000001,-0.784769,40.833836,1087.681602,1975.832129,
+ 0.272291,0.000004,-0.962215,15.002342,1087.681806,1964.730171,
+ 0.510751,0.000002,-0.859729,40.833771,1076.228956,1975.832068,
+ 0.142868,0.000004,-0.989742,15.002278,1076.229161,1964.73011,
+ -0.962215,0.000007,-0.272291,-70.471455,1076.229348,2020.222024,
+ -0.824055,0.000008,-0.566511,-59.369433,1087.682068,1994.390591,
+ -0.824055,0.000008,-0.566511,-59.369497,1076.229422,1994.39053,
+ -0.824055,0.000008,-0.566511,-59.369433,1087.682068,1994.390591,
+ -0.962215,0.000007,-0.272291,-70.471455,1076.229348,2020.222024,
+ -0.989742,0.000006,-0.142868,-70.471391,1087.681993,2020.222085,
+ -0.872928,0.000002,0.48785,-60.427688,1076.229003,2074.451642,
+ -0.969075,0.000004,0.246765,-70.842978,1087.681846,2048.335808,
+ -0.993172,0.000005,0.11666,-70.843043,1076.2292,2048.335748,
+ -0.969075,0.000004,0.246765,-70.842978,1087.681846,2048.335808,
+ -0.872928,0.000002,0.48785,-60.427688,1076.229003,2074.451642,
+ -0.800876,0.000001,0.59883,-60.427624,1087.681648,2074.451703,
+ 0.910274,0.000003,-0.414007,112.886611,-1260.035395,2008.709218,
+ 0.910274,0.000003,-0.414007,94.156876,-1491.10301,1967.52667,
+ 0.910274,0.000003,-0.414007,94.155574,-1260.035719,1967.525442,
+ 0.910274,0.000003,-0.414007,94.156876,-1491.10301,1967.52667,
+ 0.910274,0.000003,-0.414007,112.886611,-1260.035395,2008.709218,
+ 0.910274,0.000003,-0.414007,112.887913,-1491.102686,2008.710446,
+ -0.688119,-0.66201,0.297042,-112.887948,-1491.103676,2061.693954,
+ -0.790675,-0.595591,0.141793,-39.245963,-1575.775532,2042.8185,
+ -0.670858,-0.621461,0.404642,-33.343912,-1575.775422,2057.257517,
+ -0.552864,-0.002116,0.833269,-22.365555,-1575.775301,2068.338812,
+ -0.264054,0.000004,0.964508,-7.981913,-1635.024391,2074.375673,
+ -0.134401,0.000005,0.990927,-7.982247,-1575.775188,2074.375358,
+ -0.264054,0.000004,0.964508,-7.981913,-1635.024391,2074.375673,
+ -0.552864,-0.002116,0.833269,-22.365555,-1575.775301,2068.338812,
+ -0.546267,-0.004228,0.837601,-21.078506,-1635.024494,2068.87915,
+ 0.551684,-0.000008,0.834053,22.053997,-1175.365027,2068.544867,
+ 0.805975,-0.000008,0.59195,33.135292,-1175.365031,2057.56651,
+ 0.518094,-0.000007,0.855324,22.062392,314.38466,2068.552781,
+ 0.134993,-0.595761,-0.791736,7.982213,-1575.775514,1996.029042,
+ 0.276542,-0.66201,-0.696611,61.091305,-1491.10336,1936.64588,
+ 0.458836,-0.595589,-0.65935,22.36552,-1575.775401,2002.065588,
+ -0.29795,0.65913,-0.690488,-67.67685,-1260.036772,1941.044079,
+ -0.514083,0.56723,-0.643404,-22.056636,-1175.364424,2001.857078,
+ -0.157155,0.595594,-0.787762,-7.617619,-1175.364474,1995.955026,
+ 0.655297,-0.595759,-0.464388,33.343877,-1575.77528,2013.146883,
+ 0.600534,-0.509567,-0.616198,52.13236,-1479.42441,1951.780109,
+ 0.588214,-0.51292,-0.625234,80.088242,-1479.424113,1978.080455,
+ 0.047573,-0.998218,-0.036022,-33.332516,1078.145264,2057.26826,
+ 0.036903,-0.998211,-0.04704,-40.811035,1076.228785,2094.593798,
+ 0.052093,-0.998211,-0.029335,-60.427688,1076.229003,2074.451642,
+ 0.036903,-0.998211,-0.04704,-40.811035,1076.228785,2094.593798,
+ 0.047573,-0.998218,-0.036022,-33.332516,1078.145264,2057.26826,
+ 0.030169,-0.998218,-0.051488,-22.354159,1078.145144,2068.349555,
+ -0.248291,-0.000004,-0.968685,-95.852871,-1271.715393,2057.325989,
+ -0.248291,-0.000005,-0.968685,-112.887948,-1491.103676,2061.693954,
+ -0.248293,-0.000002,-0.968685,-112.88925,-1260.036386,2061.692727,
+ -0.248291,-0.000005,-0.968685,-112.887948,-1491.103676,2061.693954,
+ -0.248291,-0.000004,-0.968685,-95.852871,-1271.715393,2057.325989,
+ -0.248289,-0.000005,-0.968686,-95.851569,-1479.424684,2057.327217,
+ -0.502999,-0.570987,0.648819,-22.365555,-1575.775301,2068.338812,
+ -0.188244,-0.621459,0.760495,-7.982247,-1575.775188,2074.375358,
+ -0.276534,-0.662009,0.696616,-61.09134,-1491.103002,2133.75852,
+ 0.992138,-0.000005,-0.125147,39.257325,1078.145013,2027.596644,
+ 0.990927,-0.000006,0.134401,39.171839,-1175.364988,2043.183203,
+ 0.96693,-0.000004,-0.255041,39.244627,-1175.364906,2027.584673,
+ 0.990927,-0.000006,0.134401,39.171839,-1175.364988,2043.183203,
+ 0.992138,-0.000005,-0.125147,39.257325,1078.145013,2027.596644,
+ 0.964508,-0.000007,0.264054,39.184537,1078.14493,2043.195173,
+ 0.101709,0.000005,-0.994814,7.980911,-1175.364562,1996.027815,
+ -0.125147,0.000006,-0.992138,-7.604921,1078.145445,1995.966997,
+ 0.264054,0.000004,-0.964508,7.993609,1078.145357,1996.039785,
+ -0.125147,0.000006,-0.992138,-7.604921,1078.145445,1995.966997,
+ 0.101709,0.000005,-0.994814,7.980911,-1175.364562,1996.027815,
+ -0.229384,0.000006,-0.973336,-7.609225,314.385213,1995.96294,
+ -0.058592,-0.99822,0.011094,39.257325,1078.145013,2027.596644,
+ -0.059147,-0.998214,-0.008352,70.494191,1076.228394,2050.203843,
+ -0.057687,-0.998207,-0.015958,39.184537,1078.14493,2043.195173,
+ -0.059147,-0.998214,-0.008352,70.494191,1076.228394,2050.203843,
+ -0.058592,-0.99822,0.011094,39.257325,1078.145013,2027.596644,
+ -0.058629,-0.998221,0.010878,70.865779,1076.228541,2022.090119,
+ -0.414007,-0.000007,-0.910274,-26.491771,-1491.10393,1922.314269,
+ -0.414007,-0.000007,-0.910274,-67.67685,-1260.036772,1941.044079,
+ -0.414007,-0.000007,-0.910274,-26.493073,-1260.036639,1922.313042,
+ -0.414007,-0.000007,-0.910274,-67.67685,-1260.036772,1941.044079,
+ -0.414007,-0.000007,-0.910274,-26.491771,-1491.10393,1922.314269,
+ -0.414007,-0.000007,-0.910274,-67.675548,-1491.104063,1941.045307,
+ -0.047191,-0.998207,-0.036817,33.147991,1078.144888,2057.578481,
+ -0.035923,-0.998214,-0.047727,39.250077,1076.228329,2095.65199,
+ -0.029512,-0.998207,-0.052072,22.066696,1078.144892,2068.556838,
+ -0.035923,-0.998214,-0.047727,39.250077,1076.228329,2095.65199,
+ -0.047191,-0.998207,-0.036817,33.147991,1078.144888,2057.578481,
+ -0.051451,-0.998214,-0.030349,59.392233,1076.228319,2076.035337,
+ -0.350914,0.000003,0.936408,-61.092642,-1260.035711,2133.757293,
+ -0.350914,0.000003,0.936408,-18.725169,-1491.102679,2149.635004,
+ -0.350914,0.000003,0.936408,-18.726471,-1260.035388,2149.633777,
+ -0.350914,0.000003,0.936408,-18.725169,-1491.102679,2149.635004,
+ -0.350914,0.000003,0.936408,-61.092642,-1260.035711,2133.757293,
+ -0.350914,0.000003,0.936408,-61.09134,-1491.103002,2133.75852,
+ -0.799934,-0,0.600088,-22.055334,-1575.775652,2001.858305,
+ -0.799934,-0.000001,0.600088,-57.121766,-1479.425008,1955.113813,
+ -0.799934,-0.000001,0.600088,-67.675548,-1491.104063,1941.045307,
+ -0.860533,-0.000006,-0.509395,-52.132526,-1479.424112,2118.624167,
+ -0.860533,-0.000004,-0.509395,-61.092642,-1260.035711,2133.757293,
+ -0.860534,-0.000003,-0.509393,-52.133828,-1271.715965,2118.62294,
+ -0.860533,-0.000004,-0.509395,-61.092642,-1260.035711,2133.757293,
+ -0.860533,-0.000006,-0.509395,-52.132526,-1479.424112,2118.624167,
+ -0.860531,-0.000005,-0.509397,-61.09134,-1491.103002,2133.75852,
+ 0.058581,-0.998221,-0.011105,-39.234567,1078.145374,2042.829243,
+ 0.052093,-0.998211,-0.029335,-60.427688,1076.229003,2074.451642,
+ 0.058617,-0.998221,-0.010888,-70.843043,1076.2292,2048.335748,
+ 0.052093,-0.998211,-0.029335,-60.427688,1076.229003,2074.451642,
+ 0.058581,-0.998221,-0.011105,-39.234567,1078.145374,2042.829243,
+ 0.047573,-0.998218,-0.036022,-33.332516,1078.145264,2057.26826,
+ -0.968686,-0.000003,0.248288,26.491737,-1491.102432,2148.090131,
+ -0.968686,-0.000003,0.24829,22.124996,-1479.423627,2131.053624,
+ -0.968686,-0.000002,0.248289,7.616282,-1575.7751,2074.448146,
+ -0.134401,0.000005,0.990927,-7.982247,-1575.775188,2074.375358,
+ 0.125147,0.000006,0.992138,7.616616,-1635.024303,2074.448461,
+ 0.255041,0.000007,0.96693,7.616282,-1575.7751,2074.448146,
+ 0.125147,0.000006,0.992138,7.616616,-1635.024303,2074.448461,
+ -0.134401,0.000005,0.990927,-7.982247,-1575.775188,2074.375358,
+ -0.264054,0.000004,0.964508,-7.981913,-1635.024391,2074.375673,
+ -0.600085,-0.000004,-0.799936,80.08694,-1271.715963,1978.079227,
+ -0.600086,0.000003,-0.799936,33.342575,-1175.364796,2013.145656,
+ -0.600083,-0.000002,-0.799938,94.155574,-1260.035719,1967.525442,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-7.981913,-1635.024391,2074.375673,
+ 0.000006,-1,0.000005,-21.078506,-1635.024494,2068.87915,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-39.24563,-1635.024735,2042.818814,
+ 0.000006,-1,0.000005,-39.172841,-1635.024818,2027.220285,
+ 0.000006,-1,0.000005,33.344211,-1635.024484,2013.147198,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,21.079139,-1635.024615,2001.52588,
+ 0.000006,-1,0.000005,39.246263,-1635.024374,2027.586215,
+ 0.000006,-1,0.000005,39.173475,-1635.024291,2043.184745,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-33.343578,-1635.024625,2057.257832,
+ 0.000006,-1,0.000005,-39.24563,-1635.024735,2042.818814,
+ 0.989966,0.000004,0.141309,-18.726471,-1260.035388,2149.633777,
+ 0.989966,0.000002,0.141307,-16.241253,-1271.716239,2132.223038,
+ 0.989965,-0.000002,0.14131,-7.983549,-1175.364888,2074.374131,
+ -0.860533,-0.000004,-0.509395,-61.092642,-1260.035711,2133.757293,
+ -0.860532,0.000003,-0.509396,-22.366857,-1175.364775,2068.337584,
+ -0.860534,-0.000003,-0.509393,-52.133828,-1271.715965,2118.62294,
+ 0.014915,-0.998215,0.057829,-13.111446,1076.229321,1964.358523,
+ 0.029501,-0.998208,0.052061,-22.043938,1078.145495,2001.869049,
+ 0.035912,-0.998215,0.047716,-39.22734,1076.229413,1974.773877,
+ 0.029501,-0.998208,0.052061,-22.043938,1078.145495,2001.869049,
+ 0.014915,-0.998215,0.057829,-13.111446,1076.229321,1964.358523,
+ 0.00733,-0.998208,0.05939,-7.604921,1078.145445,1995.966997,
+ -0.503381,-0.000002,0.864064,-22.354159,1078.145144,2068.349555,
+ -0.264054,-0.000004,0.964508,-7.983549,-1175.364888,2074.374131,
+ -0.134401,-0.000005,0.990927,-7.970851,1078.145031,2074.386102,
+ -0.264054,-0.000004,0.964508,-7.983549,-1175.364888,2074.374131,
+ -0.503381,-0.000002,0.864064,-22.354159,1078.145144,2068.349555,
+ -0.613055,-0.000001,0.79004,-22.366857,-1175.364775,2068.337584,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-33.136295,-1635.02486,2012.836977,
+ 0.000006,-1,0.000005,-22.055,-1635.024856,2001.85862,
+ -0.248291,-0.000004,-0.968685,-95.852871,-1271.715393,2057.325989,
+ -0.248293,-0.000002,-0.968685,-112.88925,-1260.036386,2061.692727,
+ -0.24829,0.000002,-0.968686,-39.247265,-1175.364544,2042.817272,
+ 0.864064,0.000008,0.503381,33.136594,-1575.775046,2057.567737,
+ 0.964508,0.000007,0.264054,39.173475,-1635.024291,2043.184745,
+ 0.990927,0.000006,0.134401,39.173141,-1575.775088,2043.18443,
+ 0.964508,0.000007,0.264054,39.173475,-1635.024291,2043.184745,
+ 0.864064,0.000008,0.503381,33.136594,-1575.775046,2057.567737,
+ 0.79004,0.000008,0.613055,33.136928,-1635.024249,2057.568052,
+ 0.141314,-0.000002,-0.989965,39.173141,-1575.775088,2043.18443,
+ 0.141315,-0.000004,-0.989965,97.022044,-1479.423628,2051.442006,
+ 0.141313,-0.000003,-0.989965,114.432787,-1491.102437,2053.927351,
+ -0.59883,0.000008,-0.800876,-39.22734,1076.229413,1974.773877,
+ -0.824055,0.000008,-0.566511,-59.369433,1087.682068,1994.390591,
+ -0.48785,0.000007,-0.872928,-39.227276,1087.682058,1974.773938,
+ -0.824055,0.000008,-0.566511,-59.369433,1087.682068,1994.390591,
+ -0.59883,0.000008,-0.800876,-39.22734,1076.229413,1974.773877,
+ -0.824055,0.000008,-0.566511,-59.369497,1076.229422,1994.39053,
+ 0.035912,-0.998215,0.047716,-39.22734,1076.229413,1974.773877,
+ 0.04718,-0.998208,0.036806,-33.125233,1078.145499,2012.847406,
+ 0.05144,-0.998215,0.030339,-59.369497,1076.229422,1994.39053,
+ 0.04718,-0.998208,0.036806,-33.125233,1078.145499,2012.847406,
+ 0.035912,-0.998215,0.047716,-39.22734,1076.229413,1974.773877,
+ 0.029501,-0.998208,0.052061,-22.043938,1078.145495,2001.869049,
+ 0.05144,-0.998215,0.030339,-59.369497,1076.229422,1994.39053,
+ 0.057675,-0.998208,0.015947,-39.161779,1078.145457,2027.230714,
+ 0.059136,-0.998215,0.008341,-70.471455,1076.229348,2020.222024,
+ 0.057675,-0.998208,0.015947,-39.161779,1078.145457,2027.230714,
+ 0.05144,-0.998215,0.030339,-59.369497,1076.229422,1994.39053,
+ 0.04718,-0.998208,0.036806,-33.125233,1078.145499,2012.847406,
+ 0.989965,0.000004,0.141311,-18.725169,-1491.102679,2149.635004,
+ 0.989965,0.000002,0.14131,-7.982247,-1575.775188,2074.375358,
+ 0.989966,0.000005,0.141309,-16.239951,-1479.423837,2132.224265,
+ 0.600091,0.000003,0.799932,-33.343912,-1575.775422,2057.257517,
+ 0.600089,0.000006,0.799933,-80.088408,-1479.424409,2092.323821,
+ 0.600091,0.000006,0.799931,-94.156911,-1491.103352,2102.87773,
+ -0.864064,-0.000008,-0.503381,-33.136295,-1635.02486,2012.836977,
+ -0.964508,-0.000007,-0.264054,-39.173175,-1575.775614,2027.21997,
+ -0.79004,-0.000008,-0.613055,-33.136629,-1575.775657,2012.836663,
+ -0.964508,-0.000007,-0.264054,-39.173175,-1575.775614,2027.21997,
+ -0.864064,-0.000008,-0.503381,-33.136295,-1635.02486,2012.836977,
+ -0.990927,-0.000006,-0.134401,-39.172841,-1635.024818,2027.220285,
+ 0.00817,-0.998218,-0.059117,-7.970851,1078.145031,2074.386102,
+ -0.011125,-0.99822,-0.058587,13.134182,1076.228421,2106.067344,
+ 0.016094,-0.998211,-0.057584,-14.979542,1076.228581,2105.695757,
+ -0.011125,-0.99822,-0.058587,13.134182,1076.228421,2106.067344,
+ 0.00817,-0.998218,-0.059117,-7.970851,1078.145031,2074.386102,
+ -0.011411,-0.99822,-0.058537,7.627679,1078.144942,2074.45889,
+ -0.057687,-0.998207,-0.015958,39.184537,1078.14493,2043.195173,
+ -0.051451,-0.998214,-0.030349,59.392233,1076.228319,2076.035337,
+ -0.047191,-0.998207,-0.036817,33.147991,1078.144888,2057.578481,
+ -0.051451,-0.998214,-0.030349,59.392233,1076.228319,2076.035337,
+ -0.057687,-0.998207,-0.015958,39.184537,1078.14493,2043.195173,
+ -0.059147,-0.998214,-0.008352,70.494191,1076.228394,2050.203843,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.139076,0.962205,0.234133,-20.348604,1105.4614,2064.903427,
+ -0.038908,0.962171,0.269655,-7.432857,1105.461298,2070.454406,
+ -0.619788,-0.000001,0.784769,-40.811035,1076.228785,2094.593798,
+ -0.800876,0.000001,0.59883,-60.427624,1087.681648,2074.451703,
+ -0.872928,0.000002,0.48785,-60.427688,1076.229003,2074.451642,
+ -0.800876,0.000001,0.59883,-60.427624,1087.681648,2074.451703,
+ -0.619788,-0.000001,0.784769,-40.811035,1076.228785,2094.593798,
+ -0.510751,-0.000002,0.859729,-40.810971,1087.681431,2094.593859,
+ -0.860531,-0.000005,-0.509397,-61.09134,-1491.103002,2133.75852,
+ -0.860533,-0.000006,-0.509395,-52.132526,-1479.424112,2118.624167,
+ -0.860532,-0.000003,-0.509396,-22.365555,-1575.775301,2068.338812,
+ -0.860359,-0.509569,0.011083,-95.851569,-1479.424684,2057.327217,
+ -0.818467,-0.56723,-0.09144,-39.173175,-1575.775614,2027.21997,
+ -0.790675,-0.595591,0.141793,-39.245963,-1575.775532,2042.8185,
+ -0.698931,0.65913,-0.277566,-114.434123,-1260.036635,2016.475821,
+ -0.679261,0.618097,-0.395679,-33.137931,-1175.36442,2012.835435,
+ -0.701586,0.662308,-0.262917,-98.55764,-1260.03677,1974.10965,
+ 0.968687,0.000002,-0.248285,-22.126464,-1271.715181,1939.349424,
+ 0.968687,0.000003,-0.248285,-26.491771,-1491.10393,1922.314269,
+ 0.968687,0.000001,-0.248284,-26.493073,-1260.036639,1922.313042,
+ 0.968687,0.000003,-0.248285,-26.491771,-1491.10393,1922.314269,
+ 0.968687,0.000002,-0.248285,-22.126464,-1271.715181,1939.349424,
+ 0.968687,0.000003,-0.248287,-22.125162,-1479.424895,1939.350652,
+ 0.860529,-0.000003,0.509402,22.364218,-1175.364675,2002.064361,
+ 0.860528,0.000004,0.509402,52.131057,-1271.715666,1951.778881,
+ 0.860527,0.000002,0.509404,61.090003,-1260.03607,1936.644652,
+ -0.599385,-0.512211,0.615124,-80.088408,-1479.424409,2092.323821,
+ -0.670858,-0.621461,0.404642,-33.343912,-1575.775422,2057.257517,
+ -0.502999,-0.570987,0.648819,-22.365555,-1575.775301,2068.338812,
+ 0.414007,0.000007,0.910274,26.490435,-1260.035141,2148.088903,
+ 0.414007,0.000007,0.910274,67.675513,-1491.1023,2129.359093,
+ 0.414007,0.000007,0.910274,67.674211,-1260.035009,2129.357866,
+ 0.414007,0.000007,0.910274,67.675513,-1491.1023,2129.359093,
+ 0.414007,0.000007,0.910274,26.490435,-1260.035141,2148.088903,
+ 0.414007,0.000007,0.910274,26.491737,-1491.102432,2148.090131,
+ 0.990927,0.000006,0.134401,39.173141,-1575.775088,2043.18443,
+ 0.992138,0.000005,-0.125147,39.246263,-1635.024374,2027.586215,
+ 0.96693,0.000004,-0.255041,39.245929,-1575.77517,2027.5859,
+ 0.992138,0.000005,-0.125147,39.246263,-1635.024374,2027.586215,
+ 0.990927,0.000006,0.134401,39.173141,-1575.775088,2043.18443,
+ 0.964508,0.000007,0.264054,39.173475,-1635.024291,2043.184745,
+ -0.990927,-0.000006,-0.134401,-39.172841,-1635.024818,2027.220285,
+ -0.992138,-0.000005,0.125147,-39.245963,-1575.775532,2042.8185,
+ -0.964508,-0.000007,-0.264054,-39.173175,-1575.775614,2027.21997,
+ -0.992138,-0.000005,0.125147,-39.245963,-1575.775532,2042.8185,
+ -0.990927,-0.000006,-0.134401,-39.172841,-1635.024818,2027.220285,
+ -0.96693,-0.000004,0.255041,-39.24563,-1635.024735,2042.818814,
+ -0.190512,0.000006,-0.981685,-7.617619,-1175.364474,1995.955026,
+ -0.229384,0.000006,-0.973336,-7.609225,314.385213,1995.96294,
+ 0.101709,0.000005,-0.994814,7.980911,-1175.364562,1996.027815,
+ 0.685212,-0,-0.728344,80.088242,-1479.424113,1978.080455,
+ 0.685212,-0,-0.728344,52.131057,-1271.715666,1951.778881,
+ 0.685212,-0,-0.728344,80.08694,-1271.715963,1978.079227,
+ 0.685212,-0,-0.728344,52.131057,-1271.715666,1951.778881,
+ 0.685212,-0,-0.728344,80.088242,-1479.424113,1978.080455,
+ 0.685212,-0,-0.728344,52.13236,-1479.42441,1951.780109,
+ 0.157159,-0.595592,0.787764,7.616282,-1575.7751,2074.448146,
+ 0.02625,-0.509303,0.860187,22.124996,-1479.423627,2131.053624,
+ 0.011128,-0.512209,0.858789,-16.239951,-1479.423837,2132.224265,
+ -0.229384,0.000006,-0.973336,-7.609225,314.385213,1995.96294,
+ -0.495296,0.000007,-0.868724,-22.043938,1078.145495,2001.869049,
+ -0.125147,0.000006,-0.992138,-7.604921,1078.145445,1995.966997,
+ -0.495296,0.000007,-0.868724,-22.043938,1078.145495,2001.869049,
+ -0.229384,0.000006,-0.973336,-7.609225,314.385213,1995.96294,
+ -0.584403,0.000008,-0.811464,-22.056636,-1175.364424,2001.857078,
+ -0.584403,0.000008,-0.811464,-22.056636,-1175.364424,2001.857078,
+ -0.229384,0.000006,-0.973336,-7.609225,314.385213,1995.96294,
+ -0.190512,0.000006,-0.981685,-7.617619,-1175.364474,1995.955026,
+ -0.993172,0.000005,0.11666,-70.843043,1076.2292,2048.335748,
+ -0.989742,0.000006,-0.142868,-70.471391,1087.681993,2020.222085,
+ -0.962215,0.000007,-0.272291,-70.471455,1076.229348,2020.222024,
+ -0.989742,0.000006,-0.142868,-70.471391,1087.681993,2020.222085,
+ -0.993172,0.000005,0.11666,-70.843043,1076.2292,2048.335748,
+ -0.969075,0.000004,0.246765,-70.842978,1087.681846,2048.335808,
+ 0.157159,-0.595592,0.787764,7.616282,-1575.7751,2074.448146,
+ 0.514086,-0.567226,0.643405,22.055299,-1575.77505,2068.546095,
+ 0.297952,-0.659128,0.690489,67.675513,-1491.1023,2129.359093,
+ 0.728344,0.000009,0.685212,57.120298,-1271.716562,2115.289236,
+ 0.728344,0.000009,0.685212,83.421946,-1479.423514,2087.334581,
+ 0.728344,0.000009,0.685212,83.420644,-1271.716562,2087.333353,
+ 0.728344,0.000009,0.685212,83.421946,-1479.423514,2087.334581,
+ 0.728344,0.000009,0.685212,57.120298,-1271.716562,2115.289236,
+ 0.728344,0.000009,0.685212,57.1216,-1479.423514,2115.290463,
+ -0.989965,-0.000005,-0.141316,18.725134,-1491.103683,1920.769396,
+ -0.989965,-0.000004,-0.141316,16.238483,-1271.715391,1938.178783,
+ -0.989964,-0.000002,-0.141318,18.723832,-1260.036393,1920.768168,
+ -0.989965,-0.000004,-0.141316,16.238483,-1271.715391,1938.178783,
+ -0.989965,-0.000005,-0.141316,18.725134,-1491.103683,1920.769396,
+ -0.989965,-0.000005,-0.141313,16.239785,-1479.424685,1938.180011,
+ 0.310182,0.662318,0.681999,26.490435,-1260.035141,2148.088903,
+ 0.297947,0.65914,0.69048,67.674211,-1260.035009,2129.357866,
+ 0.200522,0.618102,0.760093,7.61498,-1175.364977,2074.446919,
+ 0.701579,0.662318,0.26291,98.555001,-1260.035011,2096.292295,
+ 0.698924,0.659139,0.277563,114.431485,-1260.035146,2053.926124,
+ 0.679257,0.618102,0.395677,33.135292,-1175.365031,2057.56651,
+ 0.670858,0.621465,-0.404636,33.342575,-1175.364796,2013.145656,
+ 0.688116,0.662016,-0.297036,112.886611,-1260.035395,2008.709218,
+ 0.684421,0.659292,-0.311291,94.155574,-1260.035719,1967.525442,
+ 0.679257,0.618102,0.395677,33.135292,-1175.365031,2057.56651,
+ 0.698924,0.659139,0.277563,114.431485,-1260.035146,2053.926124,
+ 0.789459,0.595062,0.15052,39.171839,-1175.364988,2043.183203,
+ 0.989966,0.000004,0.141309,-18.726471,-1260.035388,2149.633777,
+ 0.989966,0.000005,0.141309,-16.239951,-1479.423837,2132.224265,
+ 0.989966,0.000002,0.141307,-16.241253,-1271.716239,2132.223038,
+ 0.989966,0.000005,0.141309,-16.239951,-1479.423837,2132.224265,
+ 0.989966,0.000004,0.141309,-18.726471,-1260.035388,2149.633777,
+ 0.989965,0.000004,0.141311,-18.725169,-1491.102679,2149.635004,
+ -0.000006,1,-0.000005,-33.343912,-1575.775422,2057.257517,
+ -0.000006,1,-0.000005,-39.173175,-1575.775614,2027.21997,
+ -0.000006,1,-0.000005,-39.245963,-1575.775532,2042.8185,
+ -0.000006,1,-0.000005,-39.173175,-1575.775614,2027.21997,
+ -0.000006,1,-0.000005,-33.343912,-1575.775422,2057.257517,
+ -0.000006,1,-0.000005,-33.136629,-1575.775657,2012.836663,
+ -0.000006,1,-0.000005,-33.136629,-1575.775657,2012.836663,
+ -0.000006,1,-0.000005,-33.343912,-1575.775422,2057.257517,
+ -0.000006,1,-0.000005,-22.365555,-1575.775301,2068.338812,
+ -0.000006,1,-0.000005,-33.136629,-1575.775657,2012.836663,
+ -0.000006,1,-0.000005,-22.365555,-1575.775301,2068.338812,
+ -0.000006,1,-0.000005,-22.055334,-1575.775652,2001.858305,
+ -0.000006,1,-0.000005,-22.055334,-1575.775652,2001.858305,
+ -0.000006,1,-0.000005,-22.365555,-1575.775301,2068.338812,
+ -0.000006,1,-0.000005,-7.982247,-1575.775188,2074.375358,
+ -0.000006,1,-0.000005,-22.055334,-1575.775652,2001.858305,
+ -0.000006,1,-0.000005,-7.982247,-1575.775188,2074.375358,
+ -0.000006,1,-0.000005,-7.616317,-1575.775602,1995.956254,
+ -0.000006,1,-0.000005,-7.616317,-1575.775602,1995.956254,
+ -0.000006,1,-0.000005,-7.982247,-1575.775188,2074.375358,
+ -0.000006,1,-0.000005,7.616282,-1575.7751,2074.448146,
+ -0.000006,1,-0.000005,-7.616317,-1575.775602,1995.956254,
+ -0.000006,1,-0.000005,7.616282,-1575.7751,2074.448146,
+ -0.000006,1,-0.000005,7.982213,-1575.775514,1996.029042,
+ -0.000006,1,-0.000005,7.982213,-1575.775514,1996.029042,
+ -0.000006,1,-0.000005,7.616282,-1575.7751,2074.448146,
+ -0.000006,1,-0.000005,22.055299,-1575.77505,2068.546095,
+ -0.000006,1,-0.000005,7.982213,-1575.775514,1996.029042,
+ -0.000006,1,-0.000005,22.055299,-1575.77505,2068.546095,
+ -0.000006,1,-0.000005,22.36552,-1575.775401,2002.065588,
+ -0.000006,1,-0.000005,22.36552,-1575.775401,2002.065588,
+ -0.000006,1,-0.000005,22.055299,-1575.77505,2068.546095,
+ -0.000006,1,-0.000005,33.136594,-1575.775046,2057.567737,
+ -0.000006,1,-0.000005,22.36552,-1575.775401,2002.065588,
+ -0.000006,1,-0.000005,33.136594,-1575.775046,2057.567737,
+ -0.000006,1,-0.000005,33.343877,-1575.77528,2013.146883,
+ -0.000006,1,-0.000005,33.343877,-1575.77528,2013.146883,
+ -0.000006,1,-0.000005,33.136594,-1575.775046,2057.567737,
+ -0.000006,1,-0.000005,39.173141,-1575.775088,2043.18443,
+ -0.000006,1,-0.000005,33.343877,-1575.77528,2013.146883,
+ -0.000006,1,-0.000005,39.173141,-1575.775088,2043.18443,
+ -0.000006,1,-0.000005,39.245929,-1575.77517,2027.5859,
+ 0.605656,0.000008,0.795727,22.055299,-1575.77505,2068.546095,
+ 0.79004,0.000008,0.613055,33.136928,-1635.024249,2057.568052,
+ 0.864064,0.000008,0.503381,33.136594,-1575.775046,2057.567737,
+ 0.79004,0.000008,0.613055,33.136928,-1635.024249,2057.568052,
+ 0.605656,0.000008,0.795727,22.055299,-1575.77505,2068.546095,
+ 0.495296,0.000007,0.868724,22.055633,-1635.024253,2068.546409,
+ -0.868724,0.000002,0.495296,-33.345214,-1175.364654,2057.256289,
+ -0.96693,0.000004,0.255041,-39.234567,1078.145374,2042.829243,
+ -0.992138,0.000005,0.125147,-39.247265,-1175.364544,2042.817272,
+ -0.96693,0.000004,0.255041,-39.234567,1078.145374,2042.829243,
+ -0.868724,0.000002,0.495296,-33.345214,-1175.364654,2057.256289,
+ -0.795727,0.000001,0.605656,-33.332516,1078.145264,2057.26826,
+ 0.503381,0.000002,-0.864064,22.364218,-1175.364675,2002.064361,
+ 0.264054,0.000004,-0.964508,7.993609,1078.145357,1996.039785,
+ 0.613055,0.000001,-0.79004,22.376916,1078.145244,2002.076332,
+ 0.264054,0.000004,-0.964508,7.993609,1078.145357,1996.039785,
+ 0.503381,0.000002,-0.864064,22.364218,-1175.364675,2002.064361,
+ 0.101709,0.000005,-0.994814,7.980911,-1175.364562,1996.027815,
+ 0.868724,-0.000002,-0.495296,33.355273,1078.145123,2013.157627,
+ 0.96693,-0.000004,-0.255041,39.244627,-1175.364906,2027.584673,
+ 0.795727,-0.000001,-0.605656,33.342575,-1175.364796,2013.145656,
+ 0.96693,-0.000004,-0.255041,39.244627,-1175.364906,2027.584673,
+ 0.868724,-0.000002,-0.495296,33.355273,1078.145123,2013.157627,
+ 0.992138,-0.000005,-0.125147,39.257325,1078.145013,2027.596644,
+ -0.684425,-0.659287,0.311293,-94.156911,-1491.103352,2102.87773,
+ -0.688119,-0.66201,0.297042,-112.887948,-1491.103676,2061.693954,
+ -0.670858,-0.621461,0.404642,-33.343912,-1575.775422,2057.257517,
+ -0.142868,-0.000004,0.989742,-14.979477,1087.681226,2105.695818,
+ 0.11666,-0.000006,0.993172,13.134182,1076.228421,2106.067344,
+ 0.246765,-0.000007,0.969075,13.134247,1087.681066,2106.067405,
+ 0.11666,-0.000006,0.993172,13.134182,1076.228421,2106.067344,
+ -0.142868,-0.000004,0.989742,-14.979477,1087.681226,2105.695818,
+ -0.272291,-0.000004,0.962215,-14.979542,1076.228581,2105.695757,
+ 0.255041,-0.000007,0.96693,7.627679,1078.144942,2074.45889,
+ 0.518094,-0.000007,0.855324,22.062392,314.38466,2068.552781,
+ 0.605656,-0.000008,0.795727,22.066696,1078.144892,2068.556838,
+ 0.518094,-0.000007,0.855324,22.062392,314.38466,2068.552781,
+ 0.255041,-0.000007,0.96693,7.627679,1078.144942,2074.45889,
+ 0.190512,-0.000006,0.981685,7.61498,-1175.364977,2074.446919,
+ 0.518094,-0.000007,0.855324,22.062392,314.38466,2068.552781,
+ 0.190512,-0.000006,0.981685,7.61498,-1175.364977,2074.446919,
+ 0.551684,-0.000008,0.834053,22.053997,-1175.365027,2068.544867,
+ -0.188244,-0.621459,0.760495,-7.982247,-1575.775188,2074.375358,
+ 0.157159,-0.595592,0.787764,7.616282,-1575.7751,2074.448146,
+ 0.011128,-0.512209,0.858789,-16.239951,-1479.423837,2132.224265,
+ 0.514086,-0.567226,0.643405,22.055299,-1575.77505,2068.546095,
+ 0.679262,-0.618094,0.395681,33.136594,-1575.775046,2057.567737,
+ 0.616202,-0.509565,0.600532,83.421946,-1479.423514,2087.334581,
+ -0.685212,0,0.728344,-80.08971,-1271.715667,2092.322594,
+ -0.685212,0,0.728344,-52.132526,-1479.424112,2118.624167,
+ -0.685212,0,0.728344,-52.133828,-1271.715965,2118.62294,
+ -0.685212,0,0.728344,-52.132526,-1479.424112,2118.624167,
+ -0.685212,0,0.728344,-80.08971,-1271.715667,2092.322594,
+ -0.685212,0,0.728344,-80.088408,-1479.424409,2092.323821,
+ -0.799934,-0.000001,0.600088,-67.675548,-1491.104063,1941.045307,
+ -0.799934,-0.000001,0.600088,-57.123068,-1271.715068,1955.112585,
+ -0.799935,-0,0.600087,-67.67685,-1260.036772,1941.044079,
+ -0.799934,-0.000001,0.600088,-57.123068,-1271.715068,1955.112585,
+ -0.799934,-0.000001,0.600088,-67.675548,-1491.104063,1941.045307,
+ -0.799934,-0.000001,0.600088,-57.121766,-1479.425008,1955.113813,
+ -0.613055,-0.000001,0.79004,-22.366857,-1175.364775,2068.337584,
+ -0.795727,0.000001,0.605656,-33.332516,1078.145264,2057.26826,
+ -0.868724,0.000002,0.495296,-33.345214,-1175.364654,2057.256289,
+ -0.795727,0.000001,0.605656,-33.332516,1078.145264,2057.26826,
+ -0.613055,-0.000001,0.79004,-22.366857,-1175.364775,2068.337584,
+ -0.503381,-0.000002,0.864064,-22.354159,1078.145144,2068.349555,
+ 0.605656,-0.000008,0.795727,22.066696,1078.144892,2068.556838,
+ 0.805975,-0.000008,0.59195,33.135292,-1175.365031,2057.56651,
+ 0.828868,-0.000008,0.559444,33.147991,1078.144888,2057.578481,
+ 0.805975,-0.000008,0.59195,33.135292,-1175.365031,2057.56651,
+ 0.605656,-0.000008,0.795727,22.066696,1078.144892,2068.556838,
+ 0.518094,-0.000007,0.855324,22.062392,314.38466,2068.552781,
+ 0.059136,-0.998215,0.008341,-70.471455,1076.229348,2020.222024,
+ 0.058581,-0.998221,-0.011105,-39.234567,1078.145374,2042.829243,
+ 0.058617,-0.998221,-0.010888,-70.843043,1076.2292,2048.335748,
+ 0.058581,-0.998221,-0.011105,-39.234567,1078.145374,2042.829243,
+ 0.059136,-0.998215,0.008341,-70.471455,1076.229348,2020.222024,
+ 0.057675,-0.998208,0.015947,-39.161779,1078.145457,2027.230714,
+ -0.036914,-0.998211,0.047029,40.833771,1076.228956,1975.832068,
+ -0.047585,-0.998218,0.036011,33.355273,1078.145123,2013.157627,
+ -0.03018,-0.998218,0.051478,22.376916,1078.145244,2002.076332,
+ -0.047585,-0.998218,0.036011,33.355273,1078.145123,2013.157627,
+ -0.036914,-0.998211,0.047029,40.833771,1076.228956,1975.832068,
+ -0.052104,-0.998211,0.029324,60.450424,1076.228739,1995.974225,
+ 0.655297,-0.595759,-0.464388,33.343877,-1575.77528,2013.146883,
+ 0.561851,-0.416707,-0.714617,22.36552,-1575.775401,2002.065588,
+ 0.600534,-0.509567,-0.616198,52.13236,-1479.42441,1951.780109,
+ -0.818467,-0.56723,-0.09144,-39.173175,-1575.775614,2027.21997,
+ -0.69893,-0.659132,-0.277564,-114.432821,-1491.103925,2016.477049,
+ -0.67926,-0.618099,-0.395677,-33.136629,-1575.775657,2012.836663,
+ 0.59883,-0.000008,0.800876,39.250141,1087.680974,2095.65205,
+ 0.824055,-0.000008,0.566511,59.392233,1076.228319,2076.035337,
+ 0.824055,-0.000008,0.566511,59.392298,1087.680965,2076.035397,
+ 0.824055,-0.000008,0.566511,59.392233,1076.228319,2076.035337,
+ 0.59883,-0.000008,0.800876,39.250141,1087.680974,2095.65205,
+ 0.48785,-0.000007,0.872928,39.250077,1076.228329,2095.65199,
+ -0.514083,-0.567231,-0.643403,-22.055334,-1575.775652,2001.858305,
+ -0.6162,-0.509569,-0.600531,-83.422112,-1479.425008,1983.069695,
+ -0.625236,-0.512922,-0.58821,-57.121766,-1479.425008,1955.113813,
+ 0.858789,-0.512209,-0.011122,97.022044,-1479.423628,2051.442006,
+ 0.789465,-0.595053,0.150522,39.173141,-1575.775088,2043.18443,
+ 0.81446,-0.570986,-0.103102,39.245929,-1575.77517,2027.5859,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-21.078506,-1635.024494,2068.87915,
+ 0.000006,-1,0.000005,-33.343578,-1635.024625,2057.257832,
+ 0.000006,-1,0.000005,7.982547,-1635.024718,1996.029357,
+ 0.000006,-1,0.000005,0.000317,-1635.024555,2035.202515,
+ 0.000006,-1,0.000005,-7.615983,-1635.024806,1995.956569,
+ -0.514083,0.56723,-0.643404,-22.056636,-1175.364424,2001.857078,
+ -0.625236,0.512922,-0.58821,-57.123068,-1271.715068,1955.112585,
+ -0.6162,0.509569,-0.600531,-83.423414,-1271.715068,1983.068468,
+ -0.999535,-0.000006,0.030499,-97.022211,-1479.424894,2018.96227,
+ -0.999535,-0.000006,0.030499,-95.852871,-1271.715393,2057.325989,
+ -0.999535,-0.000006,0.030499,-97.023513,-1271.715182,2018.961042,
+ -0.999535,-0.000006,0.030499,-95.852871,-1271.715393,2057.325989,
+ -0.999535,-0.000006,0.030499,-97.022211,-1479.424894,2018.96227,
+ -0.999535,-0.000006,0.030499,-95.851569,-1479.424684,2057.327217,
+ 0.000006,1,0.000005,0.062597,1105.461443,2035.212994,
+ -0.132844,0.962206,-0.237725,-19.556757,1105.461714,2004.993466,
+ -0.213632,0.962233,-0.168727,-29.627835,1105.461718,2014.801793,
+ -0.255041,-0.000007,-0.96693,-7.615983,-1635.024806,1995.956569,
+ -0.495296,-0.000007,-0.868724,-22.055334,-1575.775652,2001.858305,
+ -0.125147,-0.000006,-0.992138,-7.616317,-1575.775602,1995.956254,
+ -0.495296,-0.000007,-0.868724,-22.055334,-1575.775652,2001.858305,
+ -0.255041,-0.000007,-0.96693,-7.615983,-1635.024806,1995.956569,
+ -0.605656,-0.000008,-0.795727,-22.055,-1635.024856,2001.85862,
+ -0.68812,0.662011,0.297038,-112.88925,-1260.036386,2061.692727,
+ -0.655293,0.595761,0.464393,-33.345214,-1175.364654,2057.256289,
+ -0.790675,0.595591,0.141793,-39.247265,-1175.364544,2042.817272,
+ 0.799933,0.000001,-0.600089,67.674211,-1260.035009,2129.357866,
+ 0.799933,0.000001,-0.600089,57.1216,-1479.423514,2115.290463,
+ 0.799933,0,-0.600089,57.120298,-1271.716562,2115.289236,
+ 0.799933,0.000001,-0.600089,57.1216,-1479.423514,2115.290463,
+ 0.799933,0.000001,-0.600089,67.674211,-1260.035009,2129.357866,
+ 0.799934,0.000001,-0.600088,67.675513,-1491.1023,2129.359093,
+ 0.134993,-0.595761,-0.791736,7.982213,-1575.775514,1996.029042,
+ 0.263853,-0.659287,-0.704075,18.725134,-1491.103683,1920.769396,
+ 0.276542,-0.66201,-0.696611,61.091305,-1491.10336,1936.64588,
+ 0.625238,-0.512917,0.588212,57.1216,-1479.423514,2115.290463,
+ 0.514086,-0.567226,0.643405,22.055299,-1575.77505,2068.546095,
+ 0.616202,-0.509565,0.600532,83.421946,-1479.423514,2087.334581,
+ 0.248284,0.000004,0.968687,95.850101,-1271.716238,2013.075832,
+ 0.248282,0.000002,0.968688,112.886611,-1260.035395,2008.709218,
+ 0.248285,-0.000002,0.968687,39.244627,-1175.364906,2027.584673,
+ -0.5094,0.000001,0.86053,83.420644,-1271.716562,2087.333353,
+ -0.5094,0.000001,0.86053,98.555001,-1260.035011,2096.292295,
+ -0.509399,-0.000001,0.86053,33.135292,-1175.365031,2057.56651,
+ 0.248285,0.000002,0.968687,39.245929,-1575.77517,2027.5859,
+ 0.248284,0.000005,0.968687,112.887913,-1491.102686,2008.710446,
+ 0.248287,0.000005,0.968687,95.851403,-1479.423838,2013.077059,
+ -0.509399,0.000001,0.86053,33.136594,-1575.775046,2057.567737,
+ -0.5094,0.000001,0.86053,98.556303,-1491.102301,2096.293522,
+ -0.509399,0.000001,0.86053,83.421946,-1479.423514,2087.334581,
+ 0.993172,-0.000005,-0.11666,70.865843,1087.681187,2022.09018,
+ 0.989742,-0.000006,0.142868,70.494191,1076.228394,2050.203843,
+ 0.969075,-0.000004,-0.246765,70.865779,1076.228541,2022.090119,
+ 0.989742,-0.000006,0.142868,70.494191,1076.228394,2050.203843,
+ 0.993172,-0.000005,-0.11666,70.865843,1087.681187,2022.09018,
+ 0.962215,-0.000007,0.272291,70.494256,1087.68104,2050.203904,
+ -0.514083,-0.567231,-0.643403,-22.055334,-1575.775652,2001.858305,
+ -0.297947,-0.659132,-0.690487,-67.675548,-1491.104063,1941.045307,
+ -0.20052,-0.618098,-0.760096,-7.616317,-1575.775602,1995.956254,
+ 0.655297,-0.595759,-0.464388,33.343877,-1575.77528,2013.146883,
+ 0.684431,-0.659285,-0.311285,94.156876,-1491.10301,1967.52667,
+ 0.688124,-0.662008,-0.297034,112.887913,-1491.102686,2008.710446,
+ -0.955293,0.000007,-0.29566,-39.174477,-1175.364462,2027.218743,
+ -0.828868,0.000008,-0.559444,-33.129537,314.385267,2012.843349,
+ -0.828868,0.000008,-0.559444,-33.137931,-1175.36442,2012.835435,
+ -0.828868,0.000008,-0.559444,-33.129537,314.385267,2012.843349,
+ -0.955293,0.000007,-0.29566,-39.174477,-1175.364462,2027.218743,
+ -0.828868,0.000008,-0.559444,-33.125233,1078.145499,2012.847406,
+ -0.828868,0.000008,-0.559444,-33.125233,1078.145499,2012.847406,
+ -0.955293,0.000007,-0.29566,-39.174477,-1175.364462,2027.218743,
+ -0.990927,0.000006,-0.134401,-39.161779,1078.145457,2027.230714,
+ -0.20052,-0.618098,-0.760096,-7.616317,-1575.775602,1995.956254,
+ -0.297947,-0.659132,-0.690487,-67.675548,-1491.104063,1941.045307,
+ -0.310184,-0.662311,-0.682004,-26.491771,-1491.10393,1922.314269,
+ 0.255041,0.000007,0.96693,7.616282,-1575.7751,2074.448146,
+ 0.495296,0.000007,0.868724,22.055633,-1635.024253,2068.546409,
+ 0.605656,0.000008,0.795727,22.055299,-1575.77505,2068.546095,
+ 0.495296,0.000007,0.868724,22.055633,-1635.024253,2068.546409,
+ 0.255041,0.000007,0.96693,7.616282,-1575.7751,2074.448146,
+ 0.125147,0.000006,0.992138,7.616616,-1635.024303,2074.448461,
+ -0.96693,-0.000004,0.255041,-39.24563,-1635.024735,2042.818814,
+ -0.868724,-0.000002,0.495296,-33.343912,-1575.775422,2057.257517,
+ -0.992138,-0.000005,0.125147,-39.245963,-1575.775532,2042.8185,
+ -0.868724,-0.000002,0.495296,-33.343912,-1575.775422,2057.257517,
+ -0.96693,-0.000004,0.255041,-39.24563,-1635.024735,2042.818814,
+ -0.789247,-0.002827,0.614069,-33.343578,-1635.024625,2057.257832,
+ -0.818468,0.567229,-0.091441,-39.174477,-1175.364462,2027.218743,
+ -0.679261,0.618097,-0.395679,-33.137931,-1175.36442,2012.835435,
+ -0.698931,0.65913,-0.277566,-114.434123,-1260.036635,2016.475821,
+ -0.684428,0.659289,0.311283,-94.158213,-1260.036061,2102.876503,
+ -0.655293,0.595761,0.464393,-33.345214,-1175.364654,2057.256289,
+ -0.68812,0.662011,0.297038,-112.88925,-1260.036386,2061.692727,
+ 0.030499,0.000006,0.999535,-16.241253,-1271.716239,2132.223038,
+ 0.030499,0.000006,0.999535,22.124996,-1479.423627,2131.053624,
+ 0.030499,0.000006,0.999535,22.123694,-1271.716449,2131.052397,
+ 0.030499,0.000006,0.999535,22.124996,-1479.423627,2131.053624,
+ 0.030499,0.000006,0.999535,-16.241253,-1271.716239,2132.223038,
+ 0.030499,0.000006,0.999535,-16.239951,-1479.423837,2132.224265,
+ -0.605656,-0.000008,-0.795727,-22.055,-1635.024856,2001.85862,
+ -0.79004,-0.000008,-0.613055,-33.136629,-1575.775657,2012.836663,
+ -0.495296,-0.000007,-0.868724,-22.055334,-1575.775652,2001.858305,
+ -0.79004,-0.000008,-0.613055,-33.136629,-1575.775657,2012.836663,
+ -0.605656,-0.000008,-0.795727,-22.055,-1635.024856,2001.85862,
+ -0.864064,-0.000008,-0.503381,-33.136295,-1635.02486,2012.836977,
+ 0.999535,0.000006,-0.030499,97.020742,-1271.716448,2051.440779,
+ 0.999535,0.000006,-0.030499,95.851403,-1479.423838,2013.077059,
+ 0.999535,0.000006,-0.030499,95.850101,-1271.716238,2013.075832,
+ 0.999535,0.000006,-0.030499,95.851403,-1479.423838,2013.077059,
+ 0.999535,0.000006,-0.030499,97.020742,-1271.716448,2051.440779,
+ 0.999535,0.000006,-0.030499,97.022044,-1479.423628,2051.442006,
+ -0.69893,-0.659132,-0.277564,-114.432821,-1491.103925,2016.477049,
+ -0.701584,-0.662311,-0.262913,-98.556338,-1491.104061,1974.110878,
+ -0.67926,-0.618099,-0.395677,-33.136629,-1575.775657,2012.836663,
+ 0.826538,0.557702,-0.076187,39.244627,-1175.364906,2027.584673,
+ 0.688116,0.662016,-0.297036,112.886611,-1260.035395,2008.709218,
+ 0.670858,0.621465,-0.404636,33.342575,-1175.364796,2013.145656,
+ 0.509398,-0.000001,-0.860531,-83.423414,-1271.715068,1983.068468,
+ 0.509398,-0.000001,-0.860531,-98.55764,-1260.03677,1974.10965,
+ 0.509398,0.000001,-0.860531,-33.137931,-1175.36442,2012.835435,
+ -0.799934,0,0.600088,-22.056636,-1175.364424,2001.857078,
+ -0.799935,-0,0.600087,-67.67685,-1260.036772,1941.044079,
+ -0.799934,-0.000001,0.600088,-57.123068,-1271.715068,1955.112585,
+ 0.142868,0.000004,-0.989742,15.002278,1076.229161,1964.73011,
+ -0.11666,0.000006,-0.993172,-13.111382,1087.681967,1964.358584,
+ 0.272291,0.000004,-0.962215,15.002342,1087.681806,1964.730171,
+ -0.11666,0.000006,-0.993172,-13.111382,1087.681967,1964.358584,
+ 0.142868,0.000004,-0.989742,15.002278,1076.229161,1964.73011,
+ -0.246765,0.000007,-0.969075,-13.111446,1076.229321,1964.358523,
+ -0.992138,0.000005,0.125147,-39.247265,-1175.364544,2042.817272,
+ -0.990927,0.000006,-0.134401,-39.161779,1078.145457,2027.230714,
+ -0.955293,0.000007,-0.29566,-39.174477,-1175.364462,2027.218743,
+ -0.990927,0.000006,-0.134401,-39.161779,1078.145457,2027.230714,
+ -0.992138,0.000005,0.125147,-39.247265,-1175.364544,2042.817272,
+ -0.96693,0.000004,0.255041,-39.234567,1078.145374,2042.829243,
+ -0.6162,0.509569,-0.600531,-83.423414,-1271.715068,1983.068468,
+ -0.679261,0.618097,-0.395679,-33.137931,-1175.36442,2012.835435,
+ -0.514083,0.56723,-0.643404,-22.056636,-1175.364424,2001.857078,
+ 0.134993,-0.595761,-0.791736,7.982213,-1575.775514,1996.029042,
+ -0.011077,-0.509569,-0.860359,-22.125162,-1479.424895,1939.350652,
+ -0.026179,-0.512921,-0.858036,16.239785,-1479.424685,1938.180011,
+ -0.20052,-0.618098,-0.760096,-7.616317,-1575.775602,1995.956254,
+ -0.011077,-0.509569,-0.860359,-22.125162,-1479.424895,1939.350652,
+ 0.134993,-0.595761,-0.791736,7.982213,-1575.775514,1996.029042,
+ 0.936408,0.000007,0.350914,98.555001,-1260.035011,2096.292295,
+ 0.936408,0.000007,0.350914,114.432787,-1491.102437,2053.927351,
+ 0.936408,0.000007,0.350914,114.431485,-1260.035146,2053.926124,
+ 0.936408,0.000007,0.350914,114.432787,-1491.102437,2053.927351,
+ 0.936408,0.000007,0.350914,98.555001,-1260.035011,2096.292295,
+ 0.936408,0.000007,0.350914,98.556303,-1491.102301,2096.293522,
+ -0.728344,-0.000009,-0.685212,-57.121766,-1479.425008,1955.113813,
+ -0.728344,-0.000009,-0.685212,-83.423414,-1271.715068,1983.068468,
+ -0.728344,-0.000009,-0.685212,-57.123068,-1271.715068,1955.112585,
+ -0.728344,-0.000009,-0.685212,-83.423414,-1271.715068,1983.068468,
+ -0.728344,-0.000009,-0.685212,-57.121766,-1479.425008,1955.113813,
+ -0.728344,-0.000009,-0.685212,-83.422112,-1479.425008,1983.069695,
+ -0.030499,-0.000006,-0.999535,16.239785,-1479.424685,1938.180011,
+ -0.030499,-0.000006,-0.999535,-22.126464,-1271.715181,1939.349424,
+ -0.030499,-0.000006,-0.999535,16.238483,-1271.715391,1938.178783,
+ -0.030499,-0.000006,-0.999535,-22.126464,-1271.715181,1939.349424,
+ -0.030499,-0.000006,-0.999535,16.239785,-1479.424685,1938.180011,
+ -0.030499,-0.000006,-0.999535,-22.125162,-1479.424895,1939.350652,
+ -0.502999,-0.570987,0.648819,-22.365555,-1575.775301,2068.338812,
+ -0.589681,-0.509305,0.626805,-52.132526,-1479.424112,2118.624167,
+ -0.599385,-0.512211,0.615124,-80.088408,-1479.424409,2092.323821,
+ 0.858789,-0.512209,-0.011122,97.022044,-1479.423628,2051.442006,
+ 0.81446,-0.570986,-0.103102,39.245929,-1575.77517,2027.5859,
+ 0.860187,-0.509303,-0.026244,95.851403,-1479.423838,2013.077059,
+ 0.276537,0.662012,-0.696611,61.090003,-1260.03607,1936.644652,
+ 0.188248,0.621463,-0.760491,7.980911,-1175.364562,1996.027815,
+ 0.503006,0.570988,-0.648812,22.364218,-1175.364675,2002.064361,
+ 0.81446,-0.570986,-0.103102,39.245929,-1575.77517,2027.5859,
+ 0.655297,-0.595759,-0.464388,33.343877,-1575.77528,2013.146883,
+ 0.688124,-0.662008,-0.297034,112.887913,-1491.102686,2008.710446,
+ -0.67926,-0.618099,-0.395677,-33.136629,-1575.775657,2012.836663,
+ -0.6162,-0.509569,-0.600531,-83.422112,-1479.425008,1983.069695,
+ -0.514083,-0.567231,-0.643403,-22.055334,-1575.775652,2001.858305,
+ 0.860528,0.000004,0.509402,52.131057,-1271.715666,1951.778881,
+ 0.860528,0.000006,0.509402,61.091305,-1491.10336,1936.64588,
+ 0.860527,0.000002,0.509404,61.090003,-1260.03607,1936.644652,
+ 0.860528,0.000006,0.509402,61.091305,-1491.10336,1936.64588,
+ 0.860528,0.000004,0.509402,52.131057,-1271.715666,1951.778881,
+ 0.86053,0.000006,0.5094,52.13236,-1479.42441,1951.780109,
+ 0.350914,-0.000003,-0.936408,61.091305,-1491.10336,1936.64588,
+ 0.350914,-0.000003,-0.936408,18.723832,-1260.036393,1920.768168,
+ 0.350914,-0.000003,-0.936408,61.090003,-1260.03607,1936.644652,
+ 0.350914,-0.000003,-0.936408,18.723832,-1260.036393,1920.768168,
+ 0.350914,-0.000003,-0.936408,61.091305,-1491.10336,1936.64588,
+ 0.350914,-0.000003,-0.936408,18.725134,-1491.103683,1920.769396,
+ 0.600091,0.000006,0.799931,-94.156911,-1491.103352,2102.87773,
+ 0.600091,0.000004,0.799931,-80.08971,-1271.715667,2092.322594,
+ 0.600093,0.000002,0.79993,-94.158213,-1260.036061,2102.876503,
+ 0.600091,0.000004,0.799931,-80.08971,-1271.715667,2092.322594,
+ 0.600091,0.000006,0.799931,-94.156911,-1491.103352,2102.87773,
+ 0.600089,0.000006,0.799933,-80.088408,-1479.424409,2092.323821,
+ 0.248284,0.000004,0.968687,95.850101,-1271.716238,2013.075832,
+ 0.248284,0.000005,0.968687,112.887913,-1491.102686,2008.710446,
+ 0.248282,0.000002,0.968688,112.886611,-1260.035395,2008.709218,
+ 0.248284,0.000005,0.968687,112.887913,-1491.102686,2008.710446,
+ 0.248284,0.000004,0.968687,95.850101,-1271.716238,2013.075832,
+ 0.248287,0.000005,0.968687,95.851403,-1479.423838,2013.077059,
+ -0.860359,-0.509569,0.011083,-95.851569,-1479.424684,2057.327217,
+ -0.858036,-0.512921,0.026184,-97.022211,-1479.424894,2018.96227,
+ -0.818467,-0.56723,-0.09144,-39.173175,-1575.775614,2027.21997,
+ 0.96693,0.000004,-0.255041,39.245929,-1575.77517,2027.5859,
+ 0.829674,-0.002123,-0.558245,33.344211,-1635.024484,2013.147198,
+ 0.834053,0.000002,-0.551684,33.343877,-1575.77528,2013.146883,
+ 0.829674,-0.002123,-0.558245,33.344211,-1635.024484,2013.147198,
+ 0.96693,0.000004,-0.255041,39.245929,-1575.77517,2027.5859,
+ 0.992138,0.000005,-0.125147,39.246263,-1635.024374,2027.586215,
+ 0.619788,0.000001,-0.784769,40.833836,1087.681602,1975.832129,
+ 0.800876,-0.000001,-0.59883,60.450424,1076.228739,1995.974225,
+ 0.510751,0.000002,-0.859729,40.833771,1076.228956,1975.832068,
+ 0.800876,-0.000001,-0.59883,60.450424,1076.228739,1995.974225,
+ 0.619788,0.000001,-0.784769,40.833836,1087.681602,1975.832129,
+ 0.872928,-0.000002,-0.48785,60.450489,1087.681384,1995.974286,
+ -0.910274,-0.000003,0.414007,-112.887948,-1491.103676,2061.693954,
+ -0.910274,-0.000003,0.414007,-94.158213,-1260.036061,2102.876503,
+ -0.910274,-0.000003,0.414007,-112.88925,-1260.036386,2061.692727,
+ -0.910274,-0.000003,0.414007,-94.158213,-1260.036061,2102.876503,
+ -0.910274,-0.000003,0.414007,-112.887948,-1491.103676,2061.693954,
+ -0.910274,-0.000003,0.414007,-94.156911,-1491.103352,2102.87773
+};
+static const struct gllist robot_crank_full_frame = { GL_N3F_V3F, GL_TRIANGLES, 1164, robot_crank_full_data, 0 };
+const struct gllist *robot_crank_full = &robot_crank_full_frame;
+
+static const float robot_gearbox_half_data[] = {
+ 0.412791,0,-0.910826,-16.408995,-70.07352,1719.887419,
+ 0.527987,0,-0.849253,-23.822213,-116.7892,1715.924987,
+ 0.582553,0,-0.812793,-23.822213,-70.07352,1715.924987,
+ 0.527987,0,-0.849253,-23.822213,-116.7892,1715.924987,
+ 0.412791,0,-0.910826,-16.408995,-70.07352,1719.887419,
+ 0.352161,0,-0.93594,-16.408995,-116.7892,1719.887419,
+ 0,-1,0,712.934349,-116.7892,1614.073004,
+ 0,-1,0,-758.547422,-116.7892,1522.846858,
+ 0,-1,0,758.547422,-116.7892,1522.846858,
+ 0,-1,0,-758.547422,-116.7892,1522.846858,
+ 0,-1,0,712.934349,-116.7892,1614.073004,
+ 0,-1,0,-712.590311,-116.7892,1614.76108,
+ 0,-1,0,-712.590311,-116.7892,1614.76108,
+ 0,-1,0,712.934349,-116.7892,1614.073004,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,-712.590311,-116.7892,1614.76108,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,8.365227,-116.7892,1638.217273,
+ 0,-1,0,8.365227,-116.7892,1638.217273,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,16.409035,-116.7892,1640.657321,
+ 0,-1,0,16.409035,-116.7892,1640.657321,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,23.822253,-116.7892,1644.619753,
+ 0,-1,0,23.822253,-116.7892,1644.619753,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,30.319996,-116.7892,1649.952295,
+ 0,-1,0,30.319996,-116.7892,1649.952295,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,35.652559,-116.7892,1656.450021,
+ 0,-1,0,35.652559,-116.7892,1656.450021,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,39.615015,-116.7892,1663.863226,
+ 0,-1,0,39.615015,-116.7892,1663.863226,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,42.05509,-116.7892,1671.907025,
+ 0,-1,0,42.05509,-116.7892,1671.907025,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,42.879011,-116.7892,1680.2723,
+ 0,-1,0,42.879011,-116.7892,1680.2723,
+ 0,-1,0,93.432274,-116.7892,1614.761079,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,8.365227,-116.7892,1638.217273,
+ 0,-1,0,-0.00005,-116.7892,1637.393379,
+ 0,-1,0,42.879011,-116.7892,1680.2723,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,42.055117,-116.7892,1688.637578,
+ 0,-1,0,42.055117,-116.7892,1688.637578,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,39.615069,-116.7892,1696.681385,
+ 0,-1,0,39.615069,-116.7892,1696.681385,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,35.652637,-116.7892,1704.094603,
+ 0,-1,0,35.652637,-116.7892,1704.094603,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,30.320095,-116.7892,1710.592346,
+ 0,-1,0,30.320095,-116.7892,1710.592346,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,23.822369,-116.7892,1715.924909,
+ 0,-1,0,23.822369,-116.7892,1715.924909,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,16.409164,-116.7892,1719.887366,
+ 0,-1,0,16.409164,-116.7892,1719.887366,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,42.879011,-116.7892,2035.202107,
+ 0,-1,0,16.409164,-116.7892,1719.887366,
+ 0,-1,0,42.879011,-116.7892,2035.202107,
+ 0,-1,0,42.055094,-116.7892,2026.836831,
+ 0,-1,0,16.409164,-116.7892,1719.887366,
+ 0,-1,0,42.055094,-116.7892,2026.836831,
+ 0,-1,0,8.365365,-116.7892,1722.32744,
+ 0,-1,0,8.365365,-116.7892,1722.32744,
+ 0,-1,0,42.055094,-116.7892,2026.836831,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,42.055094,-116.7892,2026.836831,
+ 0,-1,0,39.615024,-116.7892,2018.793031,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,39.615024,-116.7892,2018.793031,
+ 0,-1,0,35.652572,-116.7892,2011.379823,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,35.652572,-116.7892,2011.379823,
+ 0,-1,0,30.320012,-116.7892,2004.882095,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,30.320012,-116.7892,2004.882095,
+ 0,-1,0,23.822272,-116.7892,1999.549549,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,23.822272,-116.7892,1999.549549,
+ 0,-1,0,16.409056,-116.7892,1995.587113,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,16.409056,-116.7892,1995.587113,
+ 0,-1,0,8.36525,-116.7892,1993.147061,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,8.36525,-116.7892,1993.147061,
+ 0,-1,0,-0.000027,-116.7892,1992.323162,
+ 0,-1,0,42.879011,-116.7892,2035.202107,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,42.055112,-116.7892,2043.567384,
+ 0,-1,0,42.055112,-116.7892,2043.567384,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,39.61506,-116.7892,2051.61119,
+ 0,-1,0,39.61506,-116.7892,2051.61119,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,35.652624,-116.7892,2059.024406,
+ 0,-1,0,35.652624,-116.7892,2059.024406,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,30.320078,-116.7892,2065.522146,
+ 0,-1,0,30.320078,-116.7892,2065.522146,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,23.82235,-116.7892,2070.854706,
+ 0,-1,0,23.82235,-116.7892,2070.854706,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,16.409142,-116.7892,2074.817158,
+ 0,-1,0,16.409142,-116.7892,2074.817158,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,8.365342,-116.7892,2077.257228,
+ 0,-1,0,8.365342,-116.7892,2077.257228,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,39.615042,-116.7892,2409.402612,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,39.615042,-116.7892,2409.402612,
+ 0,-1,0,35.652598,-116.7892,2401.9894,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,35.652598,-116.7892,2401.9894,
+ 0,-1,0,30.320045,-116.7892,2395.491666,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,30.320045,-116.7892,2395.491666,
+ 0,-1,0,23.822311,-116.7892,2390.159113,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,23.822311,-116.7892,2390.159113,
+ 0,-1,0,16.409099,-116.7892,2386.196669,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,16.409099,-116.7892,2386.196669,
+ 0,-1,0,8.365296,-116.7892,2383.756608,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,8.365296,-116.7892,2383.756608,
+ 0,-1,0,0.00002,-116.7892,2382.9327,
+ 0,-1,0,39.615042,-116.7892,2409.402612,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,42.055103,-116.7892,2417.446415,
+ 0,-1,0,42.055103,-116.7892,2417.446415,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,42.879011,-116.7892,2425.811691,
+ 0,-1,0,42.879011,-116.7892,2425.811691,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,42.055103,-116.7892,2434.176967,
+ 0,-1,0,42.055103,-116.7892,2434.176967,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,39.615042,-116.7892,2442.220771,
+ 0,-1,0,39.615042,-116.7892,2442.220771,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,35.652598,-116.7892,2449.633982,
+ 0,-1,0,35.652598,-116.7892,2449.633982,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,30.320045,-116.7892,2456.131717,
+ 0,-1,0,30.320045,-116.7892,2456.131717,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,23.822311,-116.7892,2461.464269,
+ 0,-1,0,23.822311,-116.7892,2461.464269,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,16.409099,-116.7892,2465.426714,
+ 0,-1,0,16.409099,-116.7892,2465.426714,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,8.365296,-116.7892,2467.866775,
+ 0,-1,0,8.365296,-116.7892,2467.866775,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0,-1,0,0.00002,-116.7892,2468.690683,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-42.878972,-116.7892,1680.27244,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.878972,-116.7892,1680.27244,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-42.055077,-116.7892,1671.907163,
+ 0,-1,0,-42.055077,-116.7892,1671.907163,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-39.615029,-116.7892,1663.863355,
+ 0,-1,0,-39.615029,-116.7892,1663.863355,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-35.652597,-116.7892,1656.450137,
+ 0,-1,0,-35.652597,-116.7892,1656.450137,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-30.320055,-116.7892,1649.952394,
+ 0,-1,0,-30.320055,-116.7892,1649.952394,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-23.82233,-116.7892,1644.619831,
+ 0,-1,0,-23.82233,-116.7892,1644.619831,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-16.409125,-116.7892,1640.657374,
+ 0,-1,0,-16.409125,-116.7892,1640.657374,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-8.365325,-116.7892,1638.2173,
+ 0,-1,0,-8.365325,-116.7892,1638.2173,
+ 0,-1,0,-93.431364,-116.7892,1614.76108,
+ 0,-1,0,-0.00005,-116.7892,1637.393379,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.878972,-116.7892,1680.27244,
+ 0,-1,0,-42.05505,-116.7892,1688.637715,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.05505,-116.7892,1688.637715,
+ 0,-1,0,-39.614976,-116.7892,1696.681514,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-39.614976,-116.7892,1696.681514,
+ 0,-1,0,-35.65252,-116.7892,1704.09472,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-35.65252,-116.7892,1704.09472,
+ 0,-1,0,-30.319956,-116.7892,1710.592445,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-30.319956,-116.7892,1710.592445,
+ 0,-1,0,-23.822213,-116.7892,1715.924987,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-23.822213,-116.7892,1715.924987,
+ 0,-1,0,-16.408995,-116.7892,1719.887419,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-16.408995,-116.7892,1719.887419,
+ 0,-1,0,-42.878972,-116.7892,2035.2022,
+ 0,-1,0,-42.878972,-116.7892,2035.2022,
+ 0,-1,0,-16.408995,-116.7892,1719.887419,
+ 0,-1,0,-42.055073,-116.7892,2026.836923,
+ 0,-1,0,-42.055073,-116.7892,2026.836923,
+ 0,-1,0,-16.408995,-116.7892,1719.887419,
+ 0,-1,0,-8.365188,-116.7892,1722.327467,
+ 0,-1,0,-42.055073,-116.7892,2026.836923,
+ 0,-1,0,-8.365188,-116.7892,1722.327467,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-42.055073,-116.7892,2026.836923,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-39.615021,-116.7892,2018.793117,
+ 0,-1,0,-39.615021,-116.7892,2018.793117,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-35.652584,-116.7892,2011.379901,
+ 0,-1,0,-35.652584,-116.7892,2011.379901,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-30.320039,-116.7892,2004.882161,
+ 0,-1,0,-30.320039,-116.7892,2004.882161,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-23.82231,-116.7892,1999.549601,
+ 0,-1,0,-23.82231,-116.7892,1999.549601,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-16.409103,-116.7892,1995.587149,
+ 0,-1,0,-16.409103,-116.7892,1995.587149,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-8.365302,-116.7892,1993.147079,
+ 0,-1,0,-8.365302,-116.7892,1993.147079,
+ 0,-1,0,0.00009,-116.7892,1723.151361,
+ 0,-1,0,-0.000027,-116.7892,1992.323162,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.878972,-116.7892,2035.2022,
+ 0,-1,0,-42.055055,-116.7892,2043.567475,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.055055,-116.7892,2043.567475,
+ 0,-1,0,-39.614985,-116.7892,2051.611276,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-39.614985,-116.7892,2051.611276,
+ 0,-1,0,-35.652533,-116.7892,2059.024483,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-35.652533,-116.7892,2059.024483,
+ 0,-1,0,-30.319973,-116.7892,2065.522212,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-30.319973,-116.7892,2065.522212,
+ 0,-1,0,-23.822233,-116.7892,2070.854758,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-23.822233,-116.7892,2070.854758,
+ 0,-1,0,-16.409017,-116.7892,2074.817194,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-16.409017,-116.7892,2074.817194,
+ 0,-1,0,-8.365211,-116.7892,2077.257246,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-8.365211,-116.7892,2077.257246,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,-39.615003,-116.7892,2409.402612,
+ 0,-1,0,-39.615003,-116.7892,2409.402612,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,-35.652558,-116.7892,2401.9894,
+ 0,-1,0,-35.652558,-116.7892,2401.9894,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,-30.320006,-116.7892,2395.491666,
+ 0,-1,0,-30.320006,-116.7892,2395.491666,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,-23.822271,-116.7892,2390.159113,
+ 0,-1,0,-23.822271,-116.7892,2390.159113,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,-16.40906,-116.7892,2386.196669,
+ 0,-1,0,-16.40906,-116.7892,2386.196669,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,-8.365256,-116.7892,2383.756608,
+ 0,-1,0,-8.365256,-116.7892,2383.756608,
+ 0,-1,0,0.000066,-116.7892,2078.081145,
+ 0,-1,0,0.00002,-116.7892,2382.9327,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-39.615003,-116.7892,2409.402612,
+ 0,-1,0,-42.055064,-116.7892,2417.446415,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.055064,-116.7892,2417.446415,
+ 0,-1,0,-42.878972,-116.7892,2425.811691,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.878972,-116.7892,2425.811691,
+ 0,-1,0,-42.055064,-116.7892,2434.176967,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-42.055064,-116.7892,2434.176967,
+ 0,-1,0,-39.615003,-116.7892,2442.220771,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-39.615003,-116.7892,2442.220771,
+ 0,-1,0,-35.652558,-116.7892,2449.633982,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-35.652558,-116.7892,2449.633982,
+ 0,-1,0,-30.320006,-116.7892,2456.131717,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-30.320006,-116.7892,2456.131717,
+ 0,-1,0,-23.822271,-116.7892,2461.464269,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-23.822271,-116.7892,2461.464269,
+ 0,-1,0,-16.40906,-116.7892,2465.426714,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-16.40906,-116.7892,2465.426714,
+ 0,-1,0,-8.365256,-116.7892,2467.866775,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,-8.365256,-116.7892,2467.866775,
+ 0,-1,0,0.00002,-116.7892,2468.690683,
+ 0,-1,0,-93.431364,-116.7892,2549.07468,
+ 0,-1,0,0.00002,-116.7892,2468.690683,
+ 0,-1,0,93.431356,-116.7892,2549.07468,
+ 0.582553,0,-0.812793,-23.822213,-70.07352,1715.924987,
+ 0.707106,0,-0.707108,-30.319956,-116.7892,1710.592445,
+ 0.707106,0,-0.707108,-30.319956,-70.07352,1710.592445,
+ 0.707106,0,-0.707108,-30.319956,-116.7892,1710.592445,
+ 0.582553,0,-0.812793,-23.822213,-70.07352,1715.924987,
+ 0.527987,0,-0.849253,-23.822213,-116.7892,1715.924987,
+ -0.973856,0,-0.227168,-42.055064,-116.7892,2417.446415,
+ -0.935939,0,-0.352162,-39.615003,-741.88772,2409.402612,
+ -0.986659,0,-0.162803,-42.055064,-741.90215,2417.446415,
+ -0.935939,0,-0.352162,-39.615003,-741.88772,2409.402612,
+ -0.973856,0,-0.227168,-42.055064,-116.7892,2417.446415,
+ -0.910825,0,-0.412792,-39.615003,-116.7892,2409.402612,
+ 0,0,1,-39.361125,-835.428664,2408.92764,
+ 0,0,1,39.361165,-741.420677,2408.92764,
+ 0,0,1,-39.361125,-741.886218,2408.92764,
+ 0,0,1,39.361165,-741.420677,2408.92764,
+ 0,0,1,-39.361125,-835.428664,2408.92764,
+ 0,0,1,39.361165,-835.428664,2408.92764,
+ 0.162803,0,-0.986659,8.365296,-116.7892,2383.756608,
+ 0.032813,0,-0.999462,0.00002,-858.151437,2382.9327,
+ -0.032813,0,-0.999462,0.00002,-116.7892,2382.9327,
+ 0.032813,0,-0.999462,0.00002,-858.151437,2382.9327,
+ 0.162803,0,-0.986659,8.365296,-116.7892,2383.756608,
+ 0.227168,0,-0.973856,8.365296,-857.431241,2383.756608,
+ -0.890977,-0.087754,0.445488,-717.191404,-70.07352,1614.76108,
+ -0.890977,-0.087754,0.445488,-758.547422,-116.7892,1522.846858,
+ -0.890977,-0.087754,0.445488,-712.590311,-116.7892,1614.76108,
+ -0.890977,-0.087754,0.445488,-758.547422,-116.7892,1522.846858,
+ -0.890977,-0.087754,0.445488,-717.191404,-70.07352,1614.76108,
+ -0.890977,-0.087754,0.445488,-763.148515,-70.07352,1522.846858,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-8.365325,-70.07352,1638.2173,
+ 0,1,0,-0.00005,-70.07352,1637.393379,
+ 0,1,0,-8.365325,-70.07352,1638.2173,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-16.409125,-70.07352,1640.657374,
+ 0,1,0,-16.409125,-70.07352,1640.657374,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-23.82233,-70.07352,1644.619831,
+ 0,1,0,-23.82233,-70.07352,1644.619831,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-30.320055,-70.07352,1649.952394,
+ 0,1,0,-30.320055,-70.07352,1649.952394,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-35.652597,-70.07352,1656.450137,
+ 0,1,0,-35.652597,-70.07352,1656.450137,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-39.615029,-70.07352,1663.863355,
+ 0,1,0,-39.615029,-70.07352,1663.863355,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-42.055077,-70.07352,1671.907163,
+ 0,1,0,-42.055077,-70.07352,1671.907163,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-42.878972,-70.07352,1680.27244,
+ 0,1,0,-42.878972,-70.07352,1680.27244,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-42.878972,-70.07352,1680.27244,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-42.05505,-70.07352,1688.637715,
+ 0,1,0,-42.05505,-70.07352,1688.637715,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-39.614976,-70.07352,1696.681514,
+ 0,1,0,-39.614976,-70.07352,1696.681514,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-35.65252,-70.07352,1704.09472,
+ 0,1,0,-35.65252,-70.07352,1704.09472,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-30.319956,-70.07352,1710.592445,
+ 0,1,0,-30.319956,-70.07352,1710.592445,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-23.822213,-70.07352,1715.924987,
+ 0,1,0,-23.822213,-70.07352,1715.924987,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-16.408995,-70.07352,1719.887419,
+ 0,1,0,-16.408995,-70.07352,1719.887419,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-42.878972,-70.07352,2035.2022,
+ 0,1,0,-16.408995,-70.07352,1719.887419,
+ 0,1,0,-42.878972,-70.07352,2035.2022,
+ 0,1,0,-42.055073,-70.07352,2026.836923,
+ 0,1,0,-16.408995,-70.07352,1719.887419,
+ 0,1,0,-42.055073,-70.07352,2026.836923,
+ 0,1,0,-8.365188,-70.07352,1722.327467,
+ 0,1,0,-8.365188,-70.07352,1722.327467,
+ 0,1,0,-42.055073,-70.07352,2026.836923,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-42.055073,-70.07352,2026.836923,
+ 0,1,0,-39.615021,-70.07352,2018.793117,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-39.615021,-70.07352,2018.793117,
+ 0,1,0,-35.652584,-70.07352,2011.379901,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-35.652584,-70.07352,2011.379901,
+ 0,1,0,-30.320039,-70.07352,2004.882161,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-30.320039,-70.07352,2004.882161,
+ 0,1,0,-23.82231,-70.07352,1999.549601,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-23.82231,-70.07352,1999.549601,
+ 0,1,0,-16.409103,-70.07352,1995.587149,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-16.409103,-70.07352,1995.587149,
+ 0,1,0,-8.365302,-70.07352,1993.147079,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-8.365302,-70.07352,1993.147079,
+ 0,1,0,-0.000027,-70.07352,1992.323162,
+ 0,1,0,-42.878972,-70.07352,2035.2022,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-42.055055,-70.07352,2043.567475,
+ 0,1,0,-42.055055,-70.07352,2043.567475,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-39.614985,-70.07352,2051.611276,
+ 0,1,0,-39.614985,-70.07352,2051.611276,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-35.652533,-70.07352,2059.024483,
+ 0,1,0,-35.652533,-70.07352,2059.024483,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-30.319973,-70.07352,2065.522212,
+ 0,1,0,-30.319973,-70.07352,2065.522212,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-23.822233,-70.07352,2070.854758,
+ 0,1,0,-23.822233,-70.07352,2070.854758,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-16.409017,-70.07352,2074.817194,
+ 0,1,0,-16.409017,-70.07352,2074.817194,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-8.365211,-70.07352,2077.257246,
+ 0,1,0,-8.365211,-70.07352,2077.257246,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-39.615003,-70.07352,2409.402612,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,-39.615003,-70.07352,2409.402612,
+ 0,1,0,-35.652558,-70.07352,2401.9894,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,-35.652558,-70.07352,2401.9894,
+ 0,1,0,-30.320006,-70.07352,2395.491666,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,-30.320006,-70.07352,2395.491666,
+ 0,1,0,-23.822271,-70.07352,2390.159113,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,-23.822271,-70.07352,2390.159113,
+ 0,1,0,-16.40906,-70.07352,2386.196669,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,-16.40906,-70.07352,2386.196669,
+ 0,1,0,-8.365256,-70.07352,2383.756608,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,-8.365256,-70.07352,2383.756608,
+ 0,1,0,0.00002,-70.07352,2382.9327,
+ 0,1,0,-39.615003,-70.07352,2409.402612,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-42.055064,-70.07352,2417.446415,
+ 0,1,0,-42.055064,-70.07352,2417.446415,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-42.878972,-70.07352,2425.811691,
+ 0,1,0,-42.878972,-70.07352,2425.811691,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-42.055064,-70.07352,2434.176967,
+ 0,1,0,-42.055064,-70.07352,2434.176967,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-39.615003,-70.07352,2442.220771,
+ 0,1,0,-39.615003,-70.07352,2442.220771,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-35.652558,-70.07352,2449.633982,
+ 0,1,0,-35.652558,-70.07352,2449.633982,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-30.320006,-70.07352,2456.131717,
+ 0,1,0,-30.320006,-70.07352,2456.131717,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-23.822271,-70.07352,2461.464269,
+ 0,1,0,-23.822271,-70.07352,2461.464269,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-16.40906,-70.07352,2465.426714,
+ 0,1,0,-16.40906,-70.07352,2465.426714,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,-8.365256,-70.07352,2467.866775,
+ 0,1,0,-8.365256,-70.07352,2467.866775,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0,1,0,0.00002,-70.07352,2468.690683,
+ 0,1,0,-717.191404,-70.07352,1614.76108,
+ 0,1,0,763.148515,-70.07352,1522.846858,
+ 0,1,0,-763.148515,-70.07352,1522.846858,
+ 0,1,0,763.148515,-70.07352,1522.846858,
+ 0,1,0,-717.191404,-70.07352,1614.76108,
+ 0,1,0,717.537999,-70.07352,1614.067891,
+ 0,1,0,717.537999,-70.07352,1614.067891,
+ 0,1,0,-717.191404,-70.07352,1614.76108,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,-717.191404,-70.07352,1614.76108,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,8.365227,-70.07352,1638.217273,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,8.365227,-70.07352,1638.217273,
+ 0,1,0,16.409035,-70.07352,1640.657321,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,16.409035,-70.07352,1640.657321,
+ 0,1,0,23.822253,-70.07352,1644.619753,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,23.822253,-70.07352,1644.619753,
+ 0,1,0,30.319996,-70.07352,1649.952295,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,30.319996,-70.07352,1649.952295,
+ 0,1,0,35.652559,-70.07352,1656.450021,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,35.652559,-70.07352,1656.450021,
+ 0,1,0,39.615015,-70.07352,1663.863226,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,39.615015,-70.07352,1663.863226,
+ 0,1,0,42.05509,-70.07352,1671.907025,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,42.05509,-70.07352,1671.907025,
+ 0,1,0,42.879011,-70.07352,1680.2723,
+ 0,1,0,93.432274,-70.07352,1614.761079,
+ 0,1,0,42.879011,-70.07352,1680.2723,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,8.365227,-70.07352,1638.217273,
+ 0,1,0,-93.431364,-70.07352,1614.76108,
+ 0,1,0,-0.00005,-70.07352,1637.393379,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,42.879011,-70.07352,1680.2723,
+ 0,1,0,42.055117,-70.07352,1688.637578,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,42.055117,-70.07352,1688.637578,
+ 0,1,0,39.615069,-70.07352,1696.681385,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,39.615069,-70.07352,1696.681385,
+ 0,1,0,35.652637,-70.07352,1704.094603,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,35.652637,-70.07352,1704.094603,
+ 0,1,0,30.320095,-70.07352,1710.592346,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,30.320095,-70.07352,1710.592346,
+ 0,1,0,23.822369,-70.07352,1715.924909,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,23.822369,-70.07352,1715.924909,
+ 0,1,0,16.409164,-70.07352,1719.887366,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,16.409164,-70.07352,1719.887366,
+ 0,1,0,42.879011,-70.07352,2035.202107,
+ 0,1,0,42.879011,-70.07352,2035.202107,
+ 0,1,0,16.409164,-70.07352,1719.887366,
+ 0,1,0,42.055094,-70.07352,2026.836831,
+ 0,1,0,42.055094,-70.07352,2026.836831,
+ 0,1,0,16.409164,-70.07352,1719.887366,
+ 0,1,0,8.365365,-70.07352,1722.32744,
+ 0,1,0,42.055094,-70.07352,2026.836831,
+ 0,1,0,8.365365,-70.07352,1722.32744,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,42.055094,-70.07352,2026.836831,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,39.615024,-70.07352,2018.793031,
+ 0,1,0,39.615024,-70.07352,2018.793031,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,35.652572,-70.07352,2011.379823,
+ 0,1,0,35.652572,-70.07352,2011.379823,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,30.320012,-70.07352,2004.882095,
+ 0,1,0,30.320012,-70.07352,2004.882095,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,23.822272,-70.07352,1999.549549,
+ 0,1,0,23.822272,-70.07352,1999.549549,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,16.409056,-70.07352,1995.587113,
+ 0,1,0,16.409056,-70.07352,1995.587113,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,8.36525,-70.07352,1993.147061,
+ 0,1,0,8.36525,-70.07352,1993.147061,
+ 0,1,0,0.00009,-70.07352,1723.151361,
+ 0,1,0,-0.000027,-70.07352,1992.323162,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,42.879011,-70.07352,2035.202107,
+ 0,1,0,42.055112,-70.07352,2043.567384,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,42.055112,-70.07352,2043.567384,
+ 0,1,0,39.61506,-70.07352,2051.61119,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,39.61506,-70.07352,2051.61119,
+ 0,1,0,35.652624,-70.07352,2059.024406,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,35.652624,-70.07352,2059.024406,
+ 0,1,0,30.320078,-70.07352,2065.522146,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,30.320078,-70.07352,2065.522146,
+ 0,1,0,23.82235,-70.07352,2070.854706,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,23.82235,-70.07352,2070.854706,
+ 0,1,0,16.409142,-70.07352,2074.817158,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,16.409142,-70.07352,2074.817158,
+ 0,1,0,8.365342,-70.07352,2077.257228,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,8.365342,-70.07352,2077.257228,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,39.615042,-70.07352,2409.402612,
+ 0,1,0,39.615042,-70.07352,2409.402612,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,35.652598,-70.07352,2401.9894,
+ 0,1,0,35.652598,-70.07352,2401.9894,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,30.320045,-70.07352,2395.491666,
+ 0,1,0,30.320045,-70.07352,2395.491666,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,23.822311,-70.07352,2390.159113,
+ 0,1,0,23.822311,-70.07352,2390.159113,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,16.409099,-70.07352,2386.196669,
+ 0,1,0,16.409099,-70.07352,2386.196669,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,8.365296,-70.07352,2383.756608,
+ 0,1,0,8.365296,-70.07352,2383.756608,
+ 0,1,0,0.000066,-70.07352,2078.081145,
+ 0,1,0,0.00002,-70.07352,2382.9327,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,39.615042,-70.07352,2409.402612,
+ 0,1,0,42.055103,-70.07352,2417.446415,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,42.055103,-70.07352,2417.446415,
+ 0,1,0,42.879011,-70.07352,2425.811691,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,42.879011,-70.07352,2425.811691,
+ 0,1,0,42.055103,-70.07352,2434.176967,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,42.055103,-70.07352,2434.176967,
+ 0,1,0,39.615042,-70.07352,2442.220771,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,39.615042,-70.07352,2442.220771,
+ 0,1,0,35.652598,-70.07352,2449.633982,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,35.652598,-70.07352,2449.633982,
+ 0,1,0,30.320045,-70.07352,2456.131717,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,30.320045,-70.07352,2456.131717,
+ 0,1,0,23.822311,-70.07352,2461.464269,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,23.822311,-70.07352,2461.464269,
+ 0,1,0,16.409099,-70.07352,2465.426714,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,16.409099,-70.07352,2465.426714,
+ 0,1,0,8.365296,-70.07352,2467.866775,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,8.365296,-70.07352,2467.866775,
+ 0,1,0,0.00002,-70.07352,2468.690683,
+ 0,1,0,93.431356,-70.07352,2549.07468,
+ 0,1,0,0.00002,-70.07352,2468.690683,
+ 0,1,0,-93.431364,-70.07352,2549.07468,
+ 0.890977,-0.087754,0.445488,763.148515,-70.07352,1522.846858,
+ 0.890977,-0.087754,0.445488,712.934349,-116.7892,1614.073004,
+ 0.890977,-0.087754,0.445488,758.547422,-116.7892,1522.846858,
+ 0.890977,-0.087754,0.445488,712.934349,-116.7892,1614.073004,
+ 0.890977,-0.087754,0.445488,763.148515,-70.07352,1522.846858,
+ 0.890977,-0.087754,0.445488,717.537999,-70.07352,1614.067891,
+ -1,0,0,-42.878972,-116.7892,2425.811691,
+ -0.986659,0,-0.162803,-42.055064,-741.90215,2417.446415,
+ -1,0,0,-42.878972,-741.907022,2425.811691,
+ -0.986659,0,-0.162803,-42.055064,-741.90215,2417.446415,
+ -1,0,0,-42.878972,-116.7892,2425.811691,
+ -0.973856,0,-0.227168,-42.055064,-116.7892,2417.446415,
+ -0.352162,-0,0.935939,-16.40906,-741.750486,2465.426714,
+ -0.19509,-0,0.980785,-8.365256,-116.7892,2467.866775,
+ -0.412792,-0,0.910825,-16.40906,-116.7892,2465.426714,
+ -0.19509,-0,0.980785,-8.365256,-116.7892,2467.866775,
+ -0.352162,-0,0.935939,-16.40906,-741.750486,2465.426714,
+ -0.19509,0,0.980785,-8.365256,-741.702917,2467.866775,
+ 0,0,-1,763.148515,-70.07352,1522.846858,
+ 0,0,-1,-758.547422,-116.7892,1522.846858,
+ 0,0,-1,-763.148515,-70.07352,1522.846858,
+ 0,0,-1,-758.547422,-116.7892,1522.846858,
+ 0,0,-1,763.148515,-70.07352,1522.846858,
+ 0,0,-1,758.547422,-116.7892,1522.846858,
+ -0.582554,-0,-0.812792,-23.822271,-116.7892,2390.159113,
+ -0.683524,-0,-0.729928,-30.320006,-847.173358,2395.491666,
+ -0.729928,0,-0.683524,-30.320006,-116.7892,2395.491666,
+ -0.683524,-0,-0.729928,-30.320006,-847.173358,2395.491666,
+ -0.582554,-0,-0.812792,-23.822271,-116.7892,2390.159113,
+ -0.527988,-0,-0.849252,-23.822271,-851.834664,2390.159113,
+ 0.862796,0,-0.505553,35.652598,-116.7892,2401.9894,
+ 0.881921,-0,-0.471397,39.361165,-835.428664,2408.92764,
+ 0.812792,0,-0.582554,35.652598,-841.493539,2401.9894,
+ 0.881921,-0,-0.471397,39.361165,-835.428664,2408.92764,
+ 0.862796,0,-0.505553,35.652598,-116.7892,2401.9894,
+ 0.881921,0,-0.471397,39.361165,-741.420677,2408.92764,
+ 0.881921,0,-0.471397,39.361165,-741.420677,2408.92764,
+ 0.862796,0,-0.505553,35.652598,-116.7892,2401.9894,
+ 0.910825,0,-0.412792,39.615042,-741.419175,2409.402612,
+ 0.910825,0,-0.412792,39.615042,-741.419175,2409.402612,
+ 0.862796,0,-0.505553,35.652598,-116.7892,2401.9894,
+ 0.935939,0,-0.352162,39.615042,-116.7892,2409.402612,
+ -0.412792,-0,-0.910825,-16.40906,-116.7892,2386.196669,
+ -0.527988,-0,-0.849252,-23.822271,-851.834664,2390.159113,
+ -0.582554,-0,-0.812792,-23.822271,-116.7892,2390.159113,
+ -0.527988,-0,-0.849252,-23.822271,-851.834664,2390.159113,
+ -0.412792,-0,-0.910825,-16.40906,-116.7892,2386.196669,
+ -0.352162,-0,-0.935939,-16.40906,-855.298327,2386.196669,
+ 0.001111,-0,0.999999,712.934349,-116.7892,1614.073004,
+ 0.001111,-0,0.999999,93.432274,-70.07352,1614.761079,
+ 0.001111,0,0.999999,93.432274,-116.7892,1614.761079,
+ 0.001111,-0,0.999999,93.432274,-70.07352,1614.761079,
+ 0.001111,-0,0.999999,712.934349,-116.7892,1614.073004,
+ 0.001111,-0,0.999999,717.537999,-70.07352,1614.067891,
+ 0.812792,0,0.582554,35.652598,-741.442608,2449.633982,
+ 0.729928,0,0.683524,30.320045,-116.7892,2456.131717,
+ 0.683524,-0,0.729928,30.320045,-741.474143,2456.131717,
+ 0.729928,0,0.683524,30.320045,-116.7892,2456.131717,
+ 0.812792,0,0.582554,35.652598,-741.442608,2449.633982,
+ 0.849252,0,0.527988,35.652598,-116.7892,2449.633982,
+ -0.52799,0,-0.849251,23.822369,-70.07352,1715.924909,
+ -0.412794,0,-0.910824,16.409164,-116.7892,1719.887366,
+ -0.352164,0,-0.935938,16.409164,-70.07352,1719.887366,
+ -0.412794,0,-0.910824,16.409164,-116.7892,1719.887366,
+ -0.52799,0,-0.849251,23.822369,-70.07352,1715.924909,
+ -0.582555,0,-0.812791,23.822369,-116.7892,1715.924909,
+ -0.910824,0,0.412794,39.615015,-70.07352,1663.863226,
+ -0.849251,0,0.52799,35.652559,-116.7892,1656.450021,
+ -0.935938,0,0.352164,39.615015,-116.7892,1663.863226,
+ -0.849251,0,0.52799,35.652559,-116.7892,1656.450021,
+ -0.910824,0,0.412794,39.615015,-70.07352,1663.863226,
+ -0.812791,0,0.582555,35.652559,-70.07352,1656.450021,
+ -0.352164,0,-0.935938,16.409164,-70.07352,1719.887366,
+ -0.227169,0,-0.973855,8.365365,-116.7892,1722.32744,
+ -0.162805,0,-0.986658,8.365365,-70.07352,1722.32744,
+ -0.227169,0,-0.973855,8.365365,-116.7892,1722.32744,
+ -0.352164,0,-0.935938,16.409164,-70.07352,1719.887366,
+ -0.412794,0,-0.910824,16.409164,-116.7892,1719.887366,
+ 0.93594,0,0.352161,-39.615029,-70.07352,1663.863355,
+ 0.973856,0,0.227166,-42.055077,-116.7892,1671.907163,
+ 0.910826,0,0.412791,-39.615029,-116.7892,1663.863355,
+ 0.973856,0,0.227166,-42.055077,-116.7892,1671.907163,
+ 0.93594,0,0.352161,-39.615029,-70.07352,1663.863355,
+ 0.986659,0,0.162801,-42.055077,-70.07352,1671.907163,
+ -0.973856,0,-0.227168,-42.055064,0,2417.446415,
+ -0.935939,0,-0.352162,-39.615003,-70.07352,2409.402612,
+ -0.986659,0,-0.162803,-42.055064,-70.07352,2417.446415,
+ -0.935939,0,-0.352162,-39.615003,-70.07352,2409.402612,
+ -0.973856,0,-0.227168,-42.055064,0,2417.446415,
+ -0.910825,0,-0.412792,-39.615003,0,2409.402612,
+ -0.999462,0,-0.032813,-42.878972,0,2425.811691,
+ -0.986659,0,-0.162803,-42.055064,-70.07352,2417.446415,
+ -0.999462,0,0.032813,-42.878972,-70.07352,2425.811691,
+ -0.986659,0,-0.162803,-42.055064,-70.07352,2417.446415,
+ -0.999462,0,-0.032813,-42.878972,0,2425.811691,
+ -0.973856,0,-0.227168,-42.055064,0,2417.446415,
+ -0.412792,0,-0.910825,-16.40906,0,2386.196669,
+ -0.527988,0,-0.849252,-23.822271,-70.07352,2390.159113,
+ -0.582554,0,-0.812792,-23.822271,0,2390.159113,
+ -0.527988,0,-0.849252,-23.822271,-70.07352,2390.159113,
+ -0.412792,0,-0.910825,-16.40906,0,2386.196669,
+ -0.352162,0,-0.935939,-16.40906,-70.07352,2386.196669,
+ 0.352162,0,-0.935939,16.409099,0,2386.196669,
+ 0.227168,0,-0.973856,8.365296,-70.07352,2383.756608,
+ 0.162803,0,-0.986659,8.365296,0,2383.756608,
+ 0.227168,0,-0.973856,8.365296,-70.07352,2383.756608,
+ 0.352162,0,-0.935939,16.409099,0,2386.196669,
+ 0.412792,0,-0.910825,16.409099,-70.07352,2386.196669,
+ 0.527988,0,0.849252,23.822311,-70.07352,2461.464269,
+ 0.412792,0,0.910825,16.409099,0,2465.426714,
+ 0.352162,0,0.935939,16.409099,-70.07352,2465.426714,
+ 0.412792,0,0.910825,16.409099,0,2465.426714,
+ 0.527988,0,0.849252,23.822311,-70.07352,2461.464269,
+ 0.582554,0,0.812792,23.822311,0,2461.464269,
+ 0.582555,0,0.812791,-23.82233,-116.7892,1644.619831,
+ 0.707108,0,0.707106,-30.320055,-70.07352,1649.952394,
+ 0.707108,0,0.707106,-30.320055,-116.7892,1649.952394,
+ 0.707108,0,0.707106,-30.320055,-70.07352,1649.952394,
+ 0.582555,0,0.812791,-23.82233,-116.7892,1644.619831,
+ 0.52799,0,0.849251,-23.82233,-70.07352,1644.619831,
+ 0.812791,0,-0.582555,-35.65252,-70.07352,1704.09472,
+ 0.707106,0,-0.707108,-30.319956,-116.7892,1710.592445,
+ 0.849251,0,-0.52799,-35.65252,-116.7892,1704.09472,
+ 0.707106,0,-0.707108,-30.319956,-116.7892,1710.592445,
+ 0.812791,0,-0.582555,-35.65252,-70.07352,1704.09472,
+ 0.707106,0,-0.707108,-30.319956,-70.07352,1710.592445,
+ 0.227166,0,-0.973856,-8.365188,-70.07352,1722.327467,
+ 0.352161,0,-0.93594,-16.408995,-116.7892,1719.887419,
+ 0.412791,0,-0.910826,-16.408995,-70.07352,1719.887419,
+ 0.352161,0,-0.93594,-16.408995,-116.7892,1719.887419,
+ 0.227166,0,-0.973856,-8.365188,-70.07352,1722.327467,
+ 0.162801,0,-0.986659,-8.365188,-116.7892,1722.327467,
+ -0.527987,0,0.849253,23.822253,-116.7892,1644.619753,
+ -0.412791,0,0.910826,16.409035,-70.07352,1640.657321,
+ -0.352161,0,0.93594,16.409035,-116.7892,1640.657321,
+ -0.412791,0,0.910826,16.409035,-70.07352,1640.657321,
+ -0.527987,0,0.849253,23.822253,-116.7892,1644.619753,
+ -0.582553,0,0.812793,23.822253,-70.07352,1644.619753,
+ 0.986659,0,0.162801,-42.055077,-70.07352,1671.907163,
+ 0.999462,0,0.032811,-42.878972,-116.7892,1680.27244,
+ 0.973856,0,0.227166,-42.055077,-116.7892,1671.907163,
+ 0.999462,0,0.032811,-42.878972,-116.7892,1680.27244,
+ 0.986659,0,0.162801,-42.055077,-70.07352,1671.907163,
+ 0.999461,0,-0.032814,-42.878972,-70.07352,1680.27244,
+ -0.849253,0,-0.527987,35.652637,-70.07352,1704.094603,
+ -0.910826,0,-0.412791,39.615069,-116.7892,1696.681385,
+ -0.812793,0,-0.582553,35.652637,-116.7892,1704.094603,
+ -0.910826,0,-0.412791,39.615069,-116.7892,1696.681385,
+ -0.849253,0,-0.527987,35.652637,-70.07352,1704.094603,
+ -0.93594,0,-0.352161,39.615069,-70.07352,1696.681385,
+ -0.986659,0,-0.162801,42.055117,-70.07352,1688.637578,
+ -0.999462,0,-0.032811,42.879011,-116.7892,1680.2723,
+ -0.973856,0,-0.227166,42.055117,-116.7892,1688.637578,
+ -0.999462,0,-0.032811,42.879011,-116.7892,1680.2723,
+ -0.986659,0,-0.162801,42.055117,-70.07352,1688.637578,
+ -0.999461,0,0.032814,42.879011,-70.07352,1680.2723,
+ -0.986659,0,0.162803,-42.055064,-741.90215,2434.176967,
+ -1,0,0,-42.878972,-116.7892,2425.811691,
+ -1,0,0,-42.878972,-741.907022,2425.811691,
+ -1,0,0,-42.878972,-116.7892,2425.811691,
+ -0.986659,0,0.162803,-42.055064,-741.90215,2434.176967,
+ -0.973856,-0,0.227168,-42.055064,-116.7892,2434.176967,
+ 1,0,-0,42.879011,-741.399873,2425.811691,
+ 0.986659,0,0.162803,42.055103,-116.7892,2434.176967,
+ 0.973856,0,0.227168,42.055103,-741.404745,2434.176967,
+ 0.986659,0,0.162803,42.055103,-116.7892,2434.176967,
+ 1,0,-0,42.879011,-741.399873,2425.811691,
+ 1,0,-0,42.879011,-116.7892,2425.811691,
+ -0,0,1,0.00002,-741.653448,2468.690683,
+ -0.19509,-0,0.980785,-8.365256,-116.7892,2467.866775,
+ -0.19509,0,0.980785,-8.365256,-741.702917,2467.866775,
+ -0.19509,-0,0.980785,-8.365256,-116.7892,2467.866775,
+ -0,0,1,0.00002,-741.653448,2468.690683,
+ -0,-0,1,0.00002,-116.7892,2468.690683,
+ -0.527988,-0,0.849252,-23.822271,-741.794326,2461.464269,
+ -0.412792,-0,0.910825,-16.40906,-116.7892,2465.426714,
+ -0.582554,-0,0.812792,-23.822271,-116.7892,2461.464269,
+ -0.412792,-0,0.910825,-16.40906,-116.7892,2465.426714,
+ -0.527988,-0,0.849252,-23.822271,-741.794326,2461.464269,
+ -0.352162,-0,0.935939,-16.40906,-741.750486,2465.426714,
+ -0.582554,0,-0.812792,-23.822271,0,2390.159113,
+ -0.707107,0,-0.707107,-30.320006,-70.07352,2395.491666,
+ -0.707107,0,-0.707107,-30.320006,0,2395.491666,
+ -0.707107,0,-0.707107,-30.320006,-70.07352,2395.491666,
+ -0.582554,0,-0.812792,-23.822271,0,2390.159113,
+ -0.527988,0,-0.849252,-23.822271,-70.07352,2390.159113,
+ -0.986659,0,0.162803,-42.055064,0,2434.176967,
+ -0.999462,0,0.032813,-42.878972,-70.07352,2425.811691,
+ -0.973856,0,0.227168,-42.055064,-70.07352,2434.176967,
+ -0.999462,0,0.032813,-42.878972,-70.07352,2425.811691,
+ -0.986659,0,0.162803,-42.055064,0,2434.176967,
+ -0.999462,0,-0.032813,-42.878972,0,2425.811691,
+ 0.986659,0,-0.162803,42.055103,0,2417.446415,
+ 0.999462,0,-0.032813,42.879011,-70.07352,2425.811691,
+ 0.973856,0,-0.227168,42.055103,-70.07352,2417.446415,
+ 0.999462,0,-0.032813,42.879011,-70.07352,2425.811691,
+ 0.986659,0,-0.162803,42.055103,0,2417.446415,
+ 0.999462,0,0.032813,42.879011,0,2425.811691,
+ -0.032813,0,-0.999462,0.00002,0,2382.9327,
+ -0.162803,0,-0.986659,-8.365256,-70.07352,2383.756608,
+ -0.227168,0,-0.973856,-8.365256,0,2383.756608,
+ -0.162803,0,-0.986659,-8.365256,-70.07352,2383.756608,
+ -0.032813,0,-0.999462,0.00002,0,2382.9327,
+ 0.032813,0,-0.999462,0.00002,-70.07352,2382.9327,
+ -0.582554,0,0.812792,-23.822271,-70.07352,2461.464269,
+ -0.707107,0,0.707107,-30.320006,0,2456.131717,
+ -0.707107,0,0.707107,-30.320006,-70.07352,2456.131717,
+ -0.707107,0,0.707107,-30.320006,0,2456.131717,
+ -0.582554,0,0.812792,-23.822271,-70.07352,2461.464269,
+ -0.527988,0,0.849252,-23.822271,0,2461.464269,
+ 0.352162,0,0.935939,16.409099,-70.07352,2465.426714,
+ 0.227168,0,0.973856,8.365296,0,2467.866775,
+ 0.162803,0,0.986659,8.365296,-70.07352,2467.866775,
+ 0.227168,0,0.973856,8.365296,0,2467.866775,
+ 0.352162,0,0.935939,16.409099,-70.07352,2465.426714,
+ 0.412792,0,0.910825,16.409099,0,2465.426714,
+ -0.849252,-0,0.527988,-35.652558,-741.864287,2449.633982,
+ -0.910825,-0,0.412792,-39.615003,-116.7892,2442.220771,
+ -0.935939,-0,0.352162,-39.615003,-741.88772,2442.220771,
+ -0.910825,-0,0.412792,-39.615003,-116.7892,2442.220771,
+ -0.849252,-0,0.527988,-35.652558,-741.864287,2449.633982,
+ -0.812792,-0,0.582554,-35.652558,-116.7892,2449.633982,
+ -0.999461,0,0.032814,42.879011,-70.07352,2035.202107,
+ -0.986658,0,0.162804,42.055094,-116.7892,2026.836831,
+ -0.999462,0,-0.032812,42.879011,-116.7892,2035.202107,
+ -0.986658,0,0.162804,42.055094,-116.7892,2026.836831,
+ -0.999461,0,0.032814,42.879011,-70.07352,2035.202107,
+ -0.973855,0,0.227169,42.055094,-70.07352,2026.836831,
+ 0.986659,-0,-0.162803,42.055103,-116.7892,2417.446415,
+ 1,0,-0,42.879011,-741.399873,2425.811691,
+ 0.973856,0,-0.227168,42.055103,-741.404745,2417.446415,
+ 1,0,-0,42.879011,-741.399873,2425.811691,
+ 0.986659,-0,-0.162803,42.055103,-116.7892,2417.446415,
+ 1,0,-0,42.879011,-116.7892,2425.811691,
+ 0.582555,0,0.812791,-23.82231,-116.7892,1999.549601,
+ 0.707108,0,0.707106,-30.320039,-70.07352,2004.882161,
+ 0.707108,0,0.707106,-30.320039,-116.7892,2004.882161,
+ 0.707108,0,0.707106,-30.320039,-70.07352,2004.882161,
+ 0.582555,0,0.812791,-23.82231,-116.7892,1999.549601,
+ 0.527989,0,0.849251,-23.82231,-70.07352,1999.549601,
+ 0.707107,0,-0.707107,30.320045,0,2395.491666,
+ 0.582554,0,-0.812792,23.822311,-70.07352,2390.159113,
+ 0.527988,0,-0.849252,23.822311,0,2390.159113,
+ 0.582554,0,-0.812792,23.822311,-70.07352,2390.159113,
+ 0.707107,0,-0.707107,30.320045,0,2395.491666,
+ 0.707107,0,-0.707107,30.320045,-70.07352,2395.491666,
+ 0.849252,0,-0.527988,35.652598,0,2401.9894,
+ 0.910825,0,-0.412792,39.615042,-70.07352,2409.402612,
+ 0.812792,0,-0.582554,35.652598,-70.07352,2401.9894,
+ 0.910825,0,-0.412792,39.615042,-70.07352,2409.402612,
+ 0.849252,0,-0.527988,35.652598,0,2401.9894,
+ 0.935939,0,-0.352162,39.615042,0,2409.402612,
+ -0.162804,0,-0.986658,8.365342,-70.07352,2077.257228,
+ -0.032814,0,-0.999461,0.000066,-116.7892,2078.081145,
+ 0.032812,0,-0.999462,0.000066,-70.07352,2078.081145,
+ -0.032814,0,-0.999461,0.000066,-116.7892,2078.081145,
+ -0.162804,0,-0.986658,8.365342,-70.07352,2077.257228,
+ -0.227169,0,-0.973855,8.365342,-116.7892,2077.257228,
+ -0.973855,0,0.227169,42.055094,-70.07352,2026.836831,
+ -0.935939,0,0.352163,39.615024,-116.7892,2018.793031,
+ -0.986658,0,0.162804,42.055094,-116.7892,2026.836831,
+ -0.935939,0,0.352163,39.615024,-116.7892,2018.793031,
+ -0.973855,0,0.227169,42.055094,-70.07352,2026.836831,
+ -0.910825,0,0.412793,39.615024,-70.07352,2018.793031,
+ -0.707108,0,-0.707106,30.320095,-70.07352,1710.592346,
+ -0.582555,0,-0.812791,23.822369,-116.7892,1715.924909,
+ -0.52799,0,-0.849251,23.822369,-70.07352,1715.924909,
+ -0.582555,0,-0.812791,23.822369,-116.7892,1715.924909,
+ -0.707108,0,-0.707106,30.320095,-70.07352,1710.592346,
+ -0.707108,0,-0.707106,30.320095,-116.7892,1710.592346,
+ 0.412793,0,0.910825,-16.409103,-116.7892,1995.587149,
+ 0.527989,0,0.849251,-23.82231,-70.07352,1999.549601,
+ 0.582555,0,0.812791,-23.82231,-116.7892,1999.549601,
+ 0.527989,0,0.849251,-23.82231,-70.07352,1999.549601,
+ 0.412793,0,0.910825,-16.409103,-116.7892,1995.587149,
+ 0.352163,0,0.935939,-16.409103,-70.07352,1995.587149,
+ -0.812792,0,-0.582554,-35.652558,-841.493539,2401.9894,
+ -0.729928,0,-0.683524,-30.320006,-116.7892,2395.491666,
+ -0.683524,-0,-0.729928,-30.320006,-847.173358,2395.491666,
+ -0.729928,0,-0.683524,-30.320006,-116.7892,2395.491666,
+ -0.812792,0,-0.582554,-35.652558,-841.493539,2401.9894,
+ -0.85779,0,-0.514001,-35.652558,-116.7892,2401.9894,
+ 0,0,1,-712.590311,-116.7892,1614.76108,
+ 0,0,1,-93.431364,-70.07352,1614.76108,
+ 0,0,1,-717.191404,-70.07352,1614.76108,
+ 0,0,1,-93.431364,-70.07352,1614.76108,
+ 0,0,1,-712.590311,-116.7892,1614.76108,
+ 0,0,1,-93.431364,-116.7892,1614.76108,
+ 0.227168,0,0.973856,8.365296,-741.603978,2467.866775,
+ 0.382683,-0,0.92388,16.409099,-116.7892,2465.426714,
+ 0.162803,0,0.986659,8.365296,-116.7892,2467.866775,
+ 0.382683,-0,0.92388,16.409099,-116.7892,2465.426714,
+ 0.227168,0,0.973856,8.365296,-741.603978,2467.866775,
+ 0.382683,0,0.92388,16.409099,-741.556409,2465.426714,
+ 0.973855,0,-0.227169,-42.05505,-70.07352,1688.637715,
+ 0.935938,0,-0.352164,-39.614976,-116.7892,1696.681514,
+ 0.986658,0,-0.162805,-42.05505,-116.7892,1688.637715,
+ 0.935938,0,-0.352164,-39.614976,-116.7892,1696.681514,
+ 0.973855,0,-0.227169,-42.05505,-70.07352,1688.637715,
+ 0.910824,0,-0.412794,-39.614976,-70.07352,1696.681514,
+ -0.973855,0,0.227169,42.05509,-70.07352,1671.907025,
+ -0.935938,0,0.352164,39.615015,-116.7892,1663.863226,
+ -0.986658,0,0.162805,42.05509,-116.7892,1671.907025,
+ -0.935938,0,0.352164,39.615015,-116.7892,1663.863226,
+ -0.973855,0,0.227169,42.05509,-70.07352,1671.907025,
+ -0.910824,0,0.412794,39.615015,-70.07352,1663.863226,
+ -0.849252,0,0.527988,-35.652558,0,2449.633982,
+ -0.910825,0,0.412792,-39.615003,-70.07352,2442.220771,
+ -0.812792,0,0.582554,-35.652558,-70.07352,2449.633982,
+ -0.910825,0,0.412792,-39.615003,-70.07352,2442.220771,
+ -0.849252,0,0.527988,-35.652558,0,2449.633982,
+ -0.935939,0,0.352162,-39.615003,0,2442.220771,
+ -1,0,0,-93.431364,-70.07352,2549.07468,
+ -1,0,0,-93.431364,-116.7892,1614.76108,
+ -1,0,0,-93.431364,-116.7892,2549.07468,
+ -1,0,0,-93.431364,-116.7892,1614.76108,
+ -1,0,0,-93.431364,-70.07352,2549.07468,
+ -1,0,0,-93.431364,-70.07352,1614.76108,
+ 0.032812,0,-0.999462,0.000066,-70.07352,2078.081145,
+ 0.162802,0,-0.986659,-8.365211,-116.7892,2077.257246,
+ 0.227167,0,-0.973856,-8.365211,-70.07352,2077.257246,
+ 0.162802,0,-0.986659,-8.365211,-116.7892,2077.257246,
+ 0.032812,0,-0.999462,0.000066,-70.07352,2078.081145,
+ -0.032814,0,-0.999461,0.000066,-116.7892,2078.081145,
+ -0.707108,0,-0.707106,30.320078,-70.07352,2065.522146,
+ -0.582555,0,-0.812791,23.82235,-116.7892,2070.854706,
+ -0.527989,0,-0.849251,23.82235,-70.07352,2070.854706,
+ -0.582555,0,-0.812791,23.82235,-116.7892,2070.854706,
+ -0.707108,0,-0.707106,30.320078,-70.07352,2065.522146,
+ -0.707108,0,-0.707106,30.320078,-116.7892,2065.522146,
+ 0.412791,0,-0.910826,-16.409017,-70.07352,2074.817194,
+ 0.527987,0,-0.849252,-23.822233,-116.7892,2070.854758,
+ 0.582553,0,-0.812793,-23.822233,-70.07352,2070.854758,
+ 0.527987,0,-0.849252,-23.822233,-116.7892,2070.854758,
+ 0.412791,0,-0.910826,-16.409017,-70.07352,2074.817194,
+ 0.352161,0,-0.935939,-16.409017,-116.7892,2074.817194,
+ -0,0,1,0.00002,-741.653448,2468.690683,
+ 0.162803,0,0.986659,8.365296,-116.7892,2467.866775,
+ -0,-0,1,0.00002,-116.7892,2468.690683,
+ 0.162803,0,0.986659,8.365296,-116.7892,2467.866775,
+ -0,0,1,0.00002,-741.653448,2468.690683,
+ 0.227168,0,0.973856,8.365296,-741.603978,2467.866775,
+ -0.227168,0,-0.973856,-8.365256,0,2383.756608,
+ -0.352162,0,-0.935939,-16.40906,-70.07352,2386.196669,
+ -0.412792,0,-0.910825,-16.40906,0,2386.196669,
+ -0.352162,0,-0.935939,-16.40906,-70.07352,2386.196669,
+ -0.227168,0,-0.973856,-8.365256,0,2383.756608,
+ -0.162803,0,-0.986659,-8.365256,-70.07352,2383.756608,
+ 0.707107,0,-0.707107,30.320045,-116.7892,2395.491666,
+ 0.812792,0,-0.582554,35.652598,-841.493539,2401.9894,
+ 0.707107,0,-0.707107,30.320045,-847.173358,2395.491666,
+ 0.812792,0,-0.582554,35.652598,-841.493539,2401.9894,
+ 0.707107,0,-0.707107,30.320045,-116.7892,2395.491666,
+ 0.862796,0,-0.505553,35.652598,-116.7892,2401.9894,
+ -0.812791,0,0.582555,35.652572,-70.07352,2011.379823,
+ -0.707106,0,0.707108,30.320012,-116.7892,2004.882095,
+ -0.849251,0,0.527989,35.652572,-116.7892,2011.379823,
+ -0.707106,0,0.707108,30.320012,-116.7892,2004.882095,
+ -0.812791,0,0.582555,35.652572,-70.07352,2011.379823,
+ -0.707106,0,0.707108,30.320012,-70.07352,2004.882095,
+ 0.412794,0,0.910824,-16.409125,-116.7892,1640.657374,
+ 0.52799,0,0.849251,-23.82233,-70.07352,1644.619831,
+ 0.582555,0,0.812791,-23.82233,-116.7892,1644.619831,
+ 0.52799,0,0.849251,-23.82233,-70.07352,1644.619831,
+ 0.412794,0,0.910824,-16.409125,-116.7892,1640.657374,
+ 0.352164,0,0.935938,-16.409125,-70.07352,1640.657374,
+ 0.812792,0,0.582554,35.652598,0,2449.633982,
+ 0.707107,0,0.707107,30.320045,-70.07352,2456.131717,
+ 0.849252,0,0.527988,35.652598,-70.07352,2449.633982,
+ 0.707107,0,0.707107,30.320045,-70.07352,2456.131717,
+ 0.812792,0,0.582554,35.652598,0,2449.633982,
+ 0.707107,0,0.707107,30.320045,0,2456.131717,
+ 0.032814,0,0.999461,-0.000027,-116.7892,1992.323162,
+ 0.162804,0,0.986658,-8.365302,-70.07352,1993.147079,
+ 0.227169,0,0.973855,-8.365302,-116.7892,1993.147079,
+ 0.162804,0,0.986658,-8.365302,-70.07352,1993.147079,
+ 0.032814,0,0.999461,-0.000027,-116.7892,1992.323162,
+ -0.032812,0,0.999462,-0.000027,-70.07352,1992.323162,
+ -0.986659,0,-0.162802,42.055112,-70.07352,2043.567384,
+ -0.999462,0,-0.032812,42.879011,-116.7892,2035.202107,
+ -0.973856,0,-0.227167,42.055112,-116.7892,2043.567384,
+ -0.999462,0,-0.032812,42.879011,-116.7892,2035.202107,
+ -0.986659,0,-0.162802,42.055112,-70.07352,2043.567384,
+ -0.999461,0,0.032814,42.879011,-70.07352,2035.202107,
+ -0.162805,0,-0.986658,8.365365,-70.07352,1722.32744,
+ -0.032814,0,-0.999461,0.00009,-116.7892,1723.151361,
+ 0.032811,0,-0.999462,0.00009,-70.07352,1723.151361,
+ -0.032814,0,-0.999461,0.00009,-116.7892,1723.151361,
+ -0.162805,0,-0.986658,8.365365,-70.07352,1722.32744,
+ -0.227169,0,-0.973855,8.365365,-116.7892,1722.32744,
+ -0.032813,0,0.999462,0.00002,-70.07352,2468.690683,
+ -0.162803,0,0.986659,-8.365256,0,2467.866775,
+ -0.227168,0,0.973856,-8.365256,-70.07352,2467.866775,
+ -0.162803,0,0.986659,-8.365256,0,2467.866775,
+ -0.032813,0,0.999462,0.00002,-70.07352,2468.690683,
+ 0.032813,0,0.999462,0.00002,0,2468.690683,
+ -0.935939,-0,0.352162,-39.615003,-741.88772,2442.220771,
+ -0.973856,-0,0.227168,-42.055064,-116.7892,2434.176967,
+ -0.986659,0,0.162803,-42.055064,-741.90215,2434.176967,
+ -0.973856,-0,0.227168,-42.055064,-116.7892,2434.176967,
+ -0.935939,-0,0.352162,-39.615003,-741.88772,2442.220771,
+ -0.910825,-0,0.412792,-39.615003,-116.7892,2442.220771,
+ 0.032811,0,-0.999462,0.00009,-70.07352,1723.151361,
+ 0.162801,0,-0.986659,-8.365188,-116.7892,1722.327467,
+ 0.227166,0,-0.973856,-8.365188,-70.07352,1722.327467,
+ 0.162801,0,-0.986659,-8.365188,-116.7892,1722.327467,
+ 0.032811,0,-0.999462,0.00009,-70.07352,1723.151361,
+ -0.032814,0,-0.999461,0.00009,-116.7892,1723.151361,
+ 0.227169,0,0.973855,-8.365325,-116.7892,1638.2173,
+ 0.352164,0,0.935938,-16.409125,-70.07352,1640.657374,
+ 0.412794,0,0.910824,-16.409125,-116.7892,1640.657374,
+ 0.352164,0,0.935938,-16.409125,-70.07352,1640.657374,
+ 0.227169,0,0.973855,-8.365325,-116.7892,1638.2173,
+ 0.162805,0,0.986658,-8.365325,-70.07352,1638.2173,
+ 0,0,1,93.431356,-116.7892,2549.07468,
+ 0,0,1,-93.431364,-70.07352,2549.07468,
+ 0,0,1,-93.431364,-116.7892,2549.07468,
+ 0,0,1,-93.431364,-70.07352,2549.07468,
+ 0,0,1,93.431356,-116.7892,2549.07468,
+ 0,0,1,93.431356,-70.07352,2549.07468,
+ 0.973856,0,0.227168,42.055103,-741.404745,2434.176967,
+ 0.935939,0,0.352162,39.615042,-116.7892,2442.220771,
+ 0.910825,0,0.412792,39.615042,-741.419175,2442.220771,
+ 0.935939,0,0.352162,39.615042,-116.7892,2442.220771,
+ 0.973856,0,0.227168,42.055103,-741.404745,2434.176967,
+ 0.986659,0,0.162803,42.055103,-116.7892,2434.176967,
+ -0.227168,-0,-0.973856,-8.365256,-116.7892,2383.756608,
+ -0.352162,-0,-0.935939,-16.40906,-855.298327,2386.196669,
+ -0.412792,-0,-0.910825,-16.40906,-116.7892,2386.196669,
+ -0.352162,-0,-0.935939,-16.40906,-855.298327,2386.196669,
+ -0.227168,-0,-0.973856,-8.365256,-116.7892,2383.756608,
+ -0.162803,0,-0.986659,-8.365256,-857.431241,2383.756608,
+ -0.352161,0,0.935939,16.409056,-116.7892,1995.587113,
+ -0.227167,0,0.973856,8.36525,-70.07352,1993.147061,
+ -0.162802,0,0.986659,8.36525,-116.7892,1993.147061,
+ -0.227167,0,0.973856,8.36525,-70.07352,1993.147061,
+ -0.352161,0,0.935939,16.409056,-116.7892,1995.587113,
+ -0.412791,0,0.910826,16.409056,-70.07352,1995.587113,
+ -0.999461,0,0.032814,42.879011,-70.07352,1680.2723,
+ -0.986658,0,0.162805,42.05509,-116.7892,1671.907025,
+ -0.999462,0,-0.032811,42.879011,-116.7892,1680.2723,
+ -0.986658,0,0.162805,42.05509,-116.7892,1671.907025,
+ -0.999461,0,0.032814,42.879011,-70.07352,1680.2723,
+ -0.973855,0,0.227169,42.05509,-70.07352,1671.907025,
+ -0.93594,0,-0.352161,39.615069,-70.07352,1696.681385,
+ -0.973856,0,-0.227166,42.055117,-116.7892,1688.637578,
+ -0.910826,0,-0.412791,39.615069,-116.7892,1696.681385,
+ -0.973856,0,-0.227166,42.055117,-116.7892,1688.637578,
+ -0.93594,0,-0.352161,39.615069,-70.07352,1696.681385,
+ -0.986659,0,-0.162801,42.055117,-70.07352,1688.637578,
+ 0.849253,0,0.527987,-35.652597,-70.07352,1656.450137,
+ 0.910826,0,0.412791,-39.615029,-116.7892,1663.863355,
+ 0.812793,0,0.582553,-35.652597,-116.7892,1656.450137,
+ 0.910826,0,0.412791,-39.615029,-116.7892,1663.863355,
+ 0.849253,0,0.527987,-35.652597,-70.07352,1656.450137,
+ 0.93594,0,0.352161,-39.615029,-70.07352,1663.863355,
+ -0.935939,0,-0.352161,39.61506,-70.07352,2051.61119,
+ -0.973856,0,-0.227167,42.055112,-116.7892,2043.567384,
+ -0.910826,0,-0.412791,39.61506,-116.7892,2051.61119,
+ -0.973856,0,-0.227167,42.055112,-116.7892,2043.567384,
+ -0.935939,0,-0.352161,39.61506,-70.07352,2051.61119,
+ -0.986659,0,-0.162802,42.055112,-70.07352,2043.567384,
+ -0,-0.752904,0.658131,8.365296,-857.431241,2383.756608,
+ -0,-0.752904,0.658131,-8.365256,-857.431241,2383.756608,
+ -0,-0.752904,0.658131,0.00002,-858.151437,2382.9327,
+ -0,-0.752904,0.658131,-8.365256,-857.431241,2383.756608,
+ -0,-0.752904,0.658131,8.365296,-857.431241,2383.756608,
+ -0,-0.752904,0.658131,16.409099,-855.298327,2386.196669,
+ -0,-0.752904,0.658131,-8.365256,-857.431241,2383.756608,
+ -0,-0.752904,0.658131,16.409099,-855.298327,2386.196669,
+ -0,-0.752904,0.658131,-16.40906,-855.298327,2386.196669,
+ -0,-0.752904,0.658131,-16.40906,-855.298327,2386.196669,
+ -0,-0.752904,0.658131,16.409099,-855.298327,2386.196669,
+ -0,-0.752904,0.658131,23.822311,-851.834664,2390.159113,
+ -0,-0.752904,0.658131,-16.40906,-855.298327,2386.196669,
+ -0,-0.752904,0.658131,23.822311,-851.834664,2390.159113,
+ 0,-0.752904,0.658131,-23.822271,-851.834664,2390.159113,
+ 0,-0.752904,0.658131,-23.822271,-851.834664,2390.159113,
+ -0,-0.752904,0.658131,23.822311,-851.834664,2390.159113,
+ 0,-0.752904,0.658131,30.320045,-847.173358,2395.491666,
+ 0,-0.752904,0.658131,-23.822271,-851.834664,2390.159113,
+ 0,-0.752904,0.658131,30.320045,-847.173358,2395.491666,
+ -0,-0.752904,0.658131,-30.320006,-847.173358,2395.491666,
+ -0,-0.752904,0.658131,-30.320006,-847.173358,2395.491666,
+ 0,-0.752904,0.658131,30.320045,-847.173358,2395.491666,
+ -0,-0.752904,0.658131,35.652598,-841.493539,2401.9894,
+ -0,-0.752904,0.658131,-30.320006,-847.173358,2395.491666,
+ -0,-0.752904,0.658131,35.652598,-841.493539,2401.9894,
+ -0,-0.752904,0.658131,-35.652558,-841.493539,2401.9894,
+ -0,-0.752904,0.658131,-35.652558,-841.493539,2401.9894,
+ -0,-0.752904,0.658131,35.652598,-841.493539,2401.9894,
+ -0,-0.752904,0.658131,39.361165,-835.428664,2408.92764,
+ -0,-0.752904,0.658131,-35.652558,-841.493539,2401.9894,
+ -0,-0.752904,0.658131,39.361165,-835.428664,2408.92764,
+ 0,-0.752904,0.658131,-39.361125,-835.428664,2408.92764,
+ 0.352162,0,-0.935939,16.409099,-116.7892,2386.196669,
+ 0.227168,0,-0.973856,8.365296,-857.431241,2383.756608,
+ 0.162803,0,-0.986659,8.365296,-116.7892,2383.756608,
+ 0.227168,0,-0.973856,8.365296,-857.431241,2383.756608,
+ 0.352162,0,-0.935939,16.409099,-116.7892,2386.196669,
+ 0.412792,0,-0.910825,16.409099,-855.298327,2386.196669,
+ -0.707107,-0,0.707107,-30.320006,-741.832752,2456.131717,
+ -0.582554,-0,0.812792,-23.822271,-116.7892,2461.464269,
+ -0.707107,-0,0.707107,-30.320006,-116.7892,2456.131717,
+ -0.582554,-0,0.812792,-23.822271,-116.7892,2461.464269,
+ -0.707107,-0,0.707107,-30.320006,-741.832752,2456.131717,
+ -0.527988,-0,0.849252,-23.822271,-741.794326,2461.464269,
+ 1,0,0.000001,93.432274,-70.07352,1614.761079,
+ 1,0,0.000001,93.431356,-116.7892,2549.07468,
+ 1,0,0.000001,93.432274,-116.7892,1614.761079,
+ 1,0,0.000001,93.431356,-116.7892,2549.07468,
+ 1,0,0.000001,93.432274,-70.07352,1614.761079,
+ 1,0,0.000001,93.431356,-70.07352,2549.07468,
+ -0.707107,-0,0.707107,-30.320006,-741.832752,2456.131717,
+ -0.812792,-0,0.582554,-35.652558,-116.7892,2449.633982,
+ -0.849252,-0,0.527988,-35.652558,-741.864287,2449.633982,
+ -0.812792,-0,0.582554,-35.652558,-116.7892,2449.633982,
+ -0.707107,-0,0.707107,-30.320006,-741.832752,2456.131717,
+ -0.707107,-0,0.707107,-30.320006,-116.7892,2456.131717,
+ 0.527988,0,-0.849252,23.822311,-116.7892,2390.159113,
+ 0.412792,0,-0.910825,16.409099,-855.298327,2386.196669,
+ 0.352162,0,-0.935939,16.409099,-116.7892,2386.196669,
+ 0.412792,0,-0.910825,16.409099,-855.298327,2386.196669,
+ 0.527988,0,-0.849252,23.822311,-116.7892,2390.159113,
+ 0.582554,0,-0.812792,23.822311,-851.834664,2390.159113,
+ -0.707108,0,-0.707106,30.320078,-70.07352,2065.522146,
+ -0.812793,0,-0.582553,35.652624,-116.7892,2059.024406,
+ -0.707108,0,-0.707106,30.320078,-116.7892,2065.522146,
+ -0.812793,0,-0.582553,35.652624,-116.7892,2059.024406,
+ -0.707108,0,-0.707106,30.320078,-70.07352,2065.522146,
+ -0.849252,0,-0.527987,35.652624,-70.07352,2059.024406,
+ -0.352161,0,0.93594,16.409035,-116.7892,1640.657321,
+ -0.227166,0,0.973856,8.365227,-70.07352,1638.217273,
+ -0.162801,0,0.986659,8.365227,-116.7892,1638.217273,
+ -0.227166,0,0.973856,8.365227,-70.07352,1638.217273,
+ -0.352161,0,0.93594,16.409035,-116.7892,1640.657321,
+ -0.412791,0,0.910826,16.409035,-70.07352,1640.657321,
+ 0.935939,0,-0.352162,39.615042,0,2409.402612,
+ 0.973856,0,-0.227168,42.055103,-70.07352,2417.446415,
+ 0.910825,0,-0.412792,39.615042,-70.07352,2409.402612,
+ 0.973856,0,-0.227168,42.055103,-70.07352,2417.446415,
+ 0.935939,0,-0.352162,39.615042,0,2409.402612,
+ 0.986659,0,-0.162803,42.055103,0,2417.446415,
+ 0.005914,-0.999983,0,39.361165,-741.420677,2408.92764,
+ 0.005914,-0.999983,0,-39.615003,-741.88772,2409.402612,
+ 0.005914,-0.999983,0,-39.361125,-741.886218,2408.92764,
+ 0.005914,-0.999983,0,-39.615003,-741.88772,2409.402612,
+ 0.005914,-0.999983,0,39.361165,-741.420677,2408.92764,
+ 0.005914,-0.999983,-0,39.615042,-741.419175,2409.402612,
+ 0.005914,-0.999983,0,-39.615003,-741.88772,2409.402612,
+ 0.005914,-0.999983,-0,39.615042,-741.419175,2409.402612,
+ 0.005914,-0.999983,-0,-42.055064,-741.90215,2417.446415,
+ 0.005914,-0.999983,-0,-42.055064,-741.90215,2417.446415,
+ 0.005914,-0.999983,-0,39.615042,-741.419175,2409.402612,
+ 0.005914,-0.999983,0,42.055103,-741.404745,2417.446415,
+ 0.005914,-0.999983,-0,-42.055064,-741.90215,2417.446415,
+ 0.005914,-0.999983,0,42.055103,-741.404745,2417.446415,
+ 0.005914,-0.999983,0,42.879011,-741.399873,2425.811691,
+ 0.005914,-0.999983,-0,-42.055064,-741.90215,2417.446415,
+ 0.005914,-0.999983,0,42.879011,-741.399873,2425.811691,
+ 0.005914,-0.999983,0,-42.878972,-741.907022,2425.811691,
+ 0.005914,-0.999983,0,-42.878972,-741.907022,2425.811691,
+ 0.005914,-0.999983,0,42.879011,-741.399873,2425.811691,
+ 0.005914,-0.999983,-0,42.055103,-741.404745,2434.176967,
+ 0.005914,-0.999983,0,-42.878972,-741.907022,2425.811691,
+ 0.005914,-0.999983,-0,42.055103,-741.404745,2434.176967,
+ 0.005914,-0.999983,-0,-42.055064,-741.90215,2434.176967,
+ 0.005914,-0.999983,-0,-42.055064,-741.90215,2434.176967,
+ 0.005914,-0.999983,-0,42.055103,-741.404745,2434.176967,
+ 0.005914,-0.999983,0,39.615042,-741.419175,2442.220771,
+ 0.005914,-0.999983,-0,-42.055064,-741.90215,2434.176967,
+ 0.005914,-0.999983,0,39.615042,-741.419175,2442.220771,
+ 0.005914,-0.999983,-0,-39.615003,-741.88772,2442.220771,
+ 0.005914,-0.999983,-0,-39.615003,-741.88772,2442.220771,
+ 0.005914,-0.999983,0,39.615042,-741.419175,2442.220771,
+ 0.005914,-0.999983,-0,35.652598,-741.442608,2449.633982,
+ 0.005914,-0.999983,-0,-39.615003,-741.88772,2442.220771,
+ 0.005914,-0.999983,-0,35.652598,-741.442608,2449.633982,
+ 0.005914,-0.999983,0,-35.652558,-741.864287,2449.633982,
+ 0.005914,-0.999983,0,-35.652558,-741.864287,2449.633982,
+ 0.005914,-0.999983,-0,35.652598,-741.442608,2449.633982,
+ 0.005914,-0.999983,0,30.320045,-741.474143,2456.131717,
+ 0.005914,-0.999983,0,-35.652558,-741.864287,2449.633982,
+ 0.005914,-0.999983,0,30.320045,-741.474143,2456.131717,
+ 0.005914,-0.999983,-0,-30.320006,-741.832752,2456.131717,
+ 0.005914,-0.999983,-0,-30.320006,-741.832752,2456.131717,
+ 0.005914,-0.999983,0,30.320045,-741.474143,2456.131717,
+ 0.005914,-0.999983,0,23.822311,-741.512569,2461.464269,
+ 0.005914,-0.999983,-0,-30.320006,-741.832752,2456.131717,
+ 0.005914,-0.999983,0,23.822311,-741.512569,2461.464269,
+ 0.005914,-0.999983,-0,-23.822271,-741.794326,2461.464269,
+ 0.005914,-0.999983,-0,-23.822271,-741.794326,2461.464269,
+ 0.005914,-0.999983,0,23.822311,-741.512569,2461.464269,
+ 0.005914,-0.999983,0,-16.40906,-741.750486,2465.426714,
+ 0.005914,-0.999983,0,-16.40906,-741.750486,2465.426714,
+ 0.005914,-0.999983,0,23.822311,-741.512569,2461.464269,
+ 0.005914,-0.999983,0,16.409099,-741.556409,2465.426714,
+ 0.005914,-0.999983,0,-16.40906,-741.750486,2465.426714,
+ 0.005914,-0.999983,0,16.409099,-741.556409,2465.426714,
+ 0.005914,-0.999983,0,-8.365256,-741.702917,2467.866775,
+ 0.005914,-0.999983,0,-8.365256,-741.702917,2467.866775,
+ 0.005914,-0.999983,0,16.409099,-741.556409,2465.426714,
+ 0.005914,-0.999983,0,8.365296,-741.603978,2467.866775,
+ 0.005914,-0.999983,0,-8.365256,-741.702917,2467.866775,
+ 0.005914,-0.999983,0,8.365296,-741.603978,2467.866775,
+ 0.005914,-0.999983,0,0.00002,-741.653448,2468.690683,
+ 0.162803,0,0.986659,8.365296,-70.07352,2467.866775,
+ 0.032813,0,0.999462,0.00002,0,2468.690683,
+ -0.032813,0,0.999462,0.00002,-70.07352,2468.690683,
+ 0.032813,0,0.999462,0.00002,0,2468.690683,
+ 0.162803,0,0.986659,8.365296,-70.07352,2467.866775,
+ 0.227168,0,0.973856,8.365296,0,2467.866775,
+ -0.910825,0,0.412793,39.615024,-70.07352,2018.793031,
+ -0.849251,0,0.527989,35.652572,-116.7892,2011.379823,
+ -0.935939,0,0.352163,39.615024,-116.7892,2018.793031,
+ -0.849251,0,0.527989,35.652572,-116.7892,2011.379823,
+ -0.910825,0,0.412793,39.615024,-70.07352,2018.793031,
+ -0.812791,0,0.582555,35.652572,-70.07352,2011.379823,
+ -0.527987,0,0.849252,23.822272,-116.7892,1999.549549,
+ -0.412791,0,0.910826,16.409056,-70.07352,1995.587113,
+ -0.352161,0,0.935939,16.409056,-116.7892,1995.587113,
+ -0.412791,0,0.910826,16.409056,-70.07352,1995.587113,
+ -0.527987,0,0.849252,23.822272,-116.7892,1999.549549,
+ -0.582553,0,0.812793,23.822272,-70.07352,1999.549549,
+ 0.999461,0,-0.032814,-42.878972,-70.07352,1680.27244,
+ 0.986658,0,-0.162805,-42.05505,-116.7892,1688.637715,
+ 0.999462,0,0.032811,-42.878972,-116.7892,1680.27244,
+ 0.986658,0,-0.162805,-42.05505,-116.7892,1688.637715,
+ 0.999461,0,-0.032814,-42.878972,-70.07352,1680.27244,
+ 0.973855,0,-0.227169,-42.05505,-70.07352,1688.637715,
+ -0.812792,0,-0.582554,-35.652558,0,2401.9894,
+ -0.707107,0,-0.707107,-30.320006,-70.07352,2395.491666,
+ -0.849252,0,-0.527988,-35.652558,-70.07352,2401.9894,
+ -0.707107,0,-0.707107,-30.320006,-70.07352,2395.491666,
+ -0.812792,0,-0.582554,-35.652558,0,2401.9894,
+ -0.707107,0,-0.707107,-30.320006,0,2395.491666,
+ 0.707107,0,-0.707107,30.320045,-116.7892,2395.491666,
+ 0.582554,0,-0.812792,23.822311,-851.834664,2390.159113,
+ 0.527988,0,-0.849252,23.822311,-116.7892,2390.159113,
+ 0.582554,0,-0.812792,23.822311,-851.834664,2390.159113,
+ 0.707107,0,-0.707107,30.320045,-116.7892,2395.491666,
+ 0.707107,0,-0.707107,30.320045,-847.173358,2395.491666,
+ -0.910825,0,-0.412792,-39.615003,-116.7892,2409.402612,
+ -0.881921,0,-0.471397,-39.361125,-741.886218,2408.92764,
+ -0.935939,0,-0.352162,-39.615003,-741.88772,2409.402612,
+ -0.881921,-0,-0.471397,-39.361125,-835.428664,2408.92764,
+ -0.85779,0,-0.514001,-35.652558,-116.7892,2401.9894,
+ -0.812792,0,-0.582554,-35.652558,-841.493539,2401.9894,
+ -0.85779,0,-0.514001,-35.652558,-116.7892,2401.9894,
+ -0.881921,-0,-0.471397,-39.361125,-835.428664,2408.92764,
+ -0.881921,0,-0.471397,-39.361125,-741.886218,2408.92764,
+ -0.85779,0,-0.514001,-35.652558,-116.7892,2401.9894,
+ -0.881921,0,-0.471397,-39.361125,-741.886218,2408.92764,
+ -0.910825,0,-0.412792,-39.615003,-116.7892,2409.402612,
+ 0.162803,0,-0.986659,8.365296,0,2383.756608,
+ 0.032813,0,-0.999462,0.00002,-70.07352,2382.9327,
+ -0.032813,0,-0.999462,0.00002,0,2382.9327,
+ 0.032813,0,-0.999462,0.00002,-70.07352,2382.9327,
+ 0.162803,0,-0.986659,8.365296,0,2383.756608,
+ 0.227168,0,-0.973856,8.365296,-70.07352,2383.756608,
+ 0.032814,0,0.999461,-0.00005,-116.7892,1637.393379,
+ 0.162805,0,0.986658,-8.365325,-70.07352,1638.2173,
+ 0.227169,0,0.973855,-8.365325,-116.7892,1638.2173,
+ 0.162805,0,0.986658,-8.365325,-70.07352,1638.2173,
+ 0.032814,0,0.999461,-0.00005,-116.7892,1637.393379,
+ -0.032811,0,0.999462,-0.00005,-70.07352,1637.393379,
+ 0.227169,0,0.973855,-8.365302,-116.7892,1993.147079,
+ 0.352163,0,0.935939,-16.409103,-70.07352,1995.587149,
+ 0.412793,0,0.910825,-16.409103,-116.7892,1995.587149,
+ 0.352163,0,0.935939,-16.409103,-70.07352,1995.587149,
+ 0.227169,0,0.973855,-8.365302,-116.7892,1993.147079,
+ 0.162804,0,0.986658,-8.365302,-70.07352,1993.147079,
+ -0.352163,0,-0.935939,16.409142,-70.07352,2074.817158,
+ -0.227169,0,-0.973855,8.365342,-116.7892,2077.257228,
+ -0.162804,0,-0.986658,8.365342,-70.07352,2077.257228,
+ -0.227169,0,-0.973855,8.365342,-116.7892,2077.257228,
+ -0.352163,0,-0.935939,16.409142,-70.07352,2074.817158,
+ -0.412793,0,-0.910825,16.409142,-116.7892,2074.817158,
+ 0.707107,0,-0.707107,30.320045,0,2395.491666,
+ 0.812792,0,-0.582554,35.652598,-70.07352,2401.9894,
+ 0.707107,0,-0.707107,30.320045,-70.07352,2395.491666,
+ 0.812792,0,-0.582554,35.652598,-70.07352,2401.9894,
+ 0.707107,0,-0.707107,30.320045,0,2395.491666,
+ 0.849252,0,-0.527988,35.652598,0,2401.9894,
+ -0.227168,0,0.973856,-8.365256,-70.07352,2467.866775,
+ -0.352162,0,0.935939,-16.40906,0,2465.426714,
+ -0.412792,0,0.910825,-16.40906,-70.07352,2465.426714,
+ -0.352162,0,0.935939,-16.40906,0,2465.426714,
+ -0.227168,0,0.973856,-8.365256,-70.07352,2467.866775,
+ -0.162803,0,0.986659,-8.365256,0,2467.866775,
+ -0.527989,0,-0.849251,23.82235,-70.07352,2070.854706,
+ -0.412793,0,-0.910825,16.409142,-116.7892,2074.817158,
+ -0.352163,0,-0.935939,16.409142,-70.07352,2074.817158,
+ -0.412793,0,-0.910825,16.409142,-116.7892,2074.817158,
+ -0.527989,0,-0.849251,23.82235,-70.07352,2070.854706,
+ -0.582555,0,-0.812791,23.82235,-116.7892,2070.854706,
+ -0.707106,0,0.707108,30.320012,-116.7892,2004.882095,
+ -0.582553,0,0.812793,23.822272,-70.07352,1999.549549,
+ -0.527987,0,0.849252,23.822272,-116.7892,1999.549549,
+ -0.582553,0,0.812793,23.822272,-70.07352,1999.549549,
+ -0.707106,0,0.707108,30.320012,-116.7892,2004.882095,
+ -0.707106,0,0.707108,30.320012,-70.07352,2004.882095,
+ 0.707107,0,0.707107,30.320045,-70.07352,2456.131717,
+ 0.582554,0,0.812792,23.822311,0,2461.464269,
+ 0.527988,0,0.849252,23.822311,-70.07352,2461.464269,
+ 0.582554,0,0.812792,23.822311,0,2461.464269,
+ 0.707107,0,0.707107,30.320045,-70.07352,2456.131717,
+ 0.707107,0,0.707107,30.320045,0,2456.131717,
+ -0.412792,0,0.910825,-16.40906,-70.07352,2465.426714,
+ -0.527988,0,0.849252,-23.822271,0,2461.464269,
+ -0.582554,0,0.812792,-23.822271,-70.07352,2461.464269,
+ -0.527988,0,0.849252,-23.822271,0,2461.464269,
+ -0.412792,0,0.910825,-16.40906,-70.07352,2465.426714,
+ -0.352162,0,0.935939,-16.40906,0,2465.426714,
+ -0.162802,0,0.986659,8.36525,-116.7892,1993.147061,
+ -0.032812,0,0.999462,-0.000027,-70.07352,1992.323162,
+ 0.032814,0,0.999461,-0.000027,-116.7892,1992.323162,
+ -0.032812,0,0.999462,-0.000027,-70.07352,1992.323162,
+ -0.162802,0,0.986659,8.36525,-116.7892,1993.147061,
+ -0.227167,0,0.973856,8.36525,-70.07352,1993.147061,
+ 0.527988,0,-0.849252,23.822311,0,2390.159113,
+ 0.412792,0,-0.910825,16.409099,-70.07352,2386.196669,
+ 0.352162,0,-0.935939,16.409099,0,2386.196669,
+ 0.412792,0,-0.910825,16.409099,-70.07352,2386.196669,
+ 0.527988,0,-0.849252,23.822311,0,2390.159113,
+ 0.582554,0,-0.812792,23.822311,-70.07352,2390.159113,
+ -0.812791,0,0.582555,35.652559,-70.07352,1656.450021,
+ -0.707106,0,0.707108,30.319996,-116.7892,1649.952295,
+ -0.849251,0,0.52799,35.652559,-116.7892,1656.450021,
+ -0.707106,0,0.707108,30.319996,-116.7892,1649.952295,
+ -0.812791,0,0.582555,35.652559,-70.07352,1656.450021,
+ -0.707106,0,0.707108,30.319996,-70.07352,1649.952295,
+ 0.910824,0,-0.412794,-39.614976,-70.07352,1696.681514,
+ 0.849251,0,-0.52799,-35.65252,-116.7892,1704.09472,
+ 0.935938,0,-0.352164,-39.614976,-116.7892,1696.681514,
+ 0.849251,0,-0.52799,-35.65252,-116.7892,1704.09472,
+ 0.910824,0,-0.412794,-39.614976,-70.07352,1696.681514,
+ 0.812791,0,-0.582555,-35.65252,-70.07352,1704.09472,
+ 0.935939,0,-0.352162,39.615042,-116.7892,2409.402612,
+ 0.973856,0,-0.227168,42.055103,-741.404745,2417.446415,
+ 0.910825,0,-0.412792,39.615042,-741.419175,2409.402612,
+ 0.973856,0,-0.227168,42.055103,-741.404745,2417.446415,
+ 0.935939,0,-0.352162,39.615042,-116.7892,2409.402612,
+ 0.986659,-0,-0.162803,42.055103,-116.7892,2417.446415,
+ -0.707107,0,0.707107,-30.320006,0,2456.131717,
+ -0.812792,0,0.582554,-35.652558,-70.07352,2449.633982,
+ -0.707107,0,0.707107,-30.320006,-70.07352,2456.131717,
+ -0.812792,0,0.582554,-35.652558,-70.07352,2449.633982,
+ -0.707107,0,0.707107,-30.320006,0,2456.131717,
+ -0.849252,0,0.527988,-35.652558,0,2449.633982,
+ 0.910825,0,0.412792,39.615042,0,2442.220771,
+ 0.849252,0,0.527988,35.652598,-70.07352,2449.633982,
+ 0.935939,0,0.352162,39.615042,-70.07352,2442.220771,
+ 0.849252,0,0.527988,35.652598,-70.07352,2449.633982,
+ 0.910825,0,0.412792,39.615042,0,2442.220771,
+ 0.812792,0,0.582554,35.652598,0,2449.633982,
+ 0.527988,-0,0.849252,23.822311,-741.512569,2461.464269,
+ 0.382683,-0,0.92388,16.409099,-116.7892,2465.426714,
+ 0.382683,0,0.92388,16.409099,-741.556409,2465.426714,
+ 0.382683,-0,0.92388,16.409099,-116.7892,2465.426714,
+ 0.527988,-0,0.849252,23.822311,-741.512569,2461.464269,
+ 0.582554,-0,0.812792,23.822311,-116.7892,2461.464269,
+ 0.910825,0,0.412792,39.615042,-741.419175,2442.220771,
+ 0.849252,0,0.527988,35.652598,-116.7892,2449.633982,
+ 0.812792,0,0.582554,35.652598,-741.442608,2449.633982,
+ 0.849252,0,0.527988,35.652598,-116.7892,2449.633982,
+ 0.910825,0,0.412792,39.615042,-741.419175,2442.220771,
+ 0.935939,0,0.352162,39.615042,-116.7892,2442.220771,
+ 0.973855,0,-0.227169,-42.055055,-70.07352,2043.567475,
+ 0.935939,0,-0.352163,-39.614985,-116.7892,2051.611276,
+ 0.986658,0,-0.162804,-42.055055,-116.7892,2043.567475,
+ 0.935939,0,-0.352163,-39.614985,-116.7892,2051.611276,
+ 0.973855,0,-0.227169,-42.055055,-70.07352,2043.567475,
+ 0.910825,0,-0.412793,-39.614985,-70.07352,2051.611276,
+ -0.910825,0,-0.412792,-39.615003,0,2409.402612,
+ -0.849252,0,-0.527988,-35.652558,-70.07352,2401.9894,
+ -0.935939,0,-0.352162,-39.615003,-70.07352,2409.402612,
+ -0.849252,0,-0.527988,-35.652558,-70.07352,2401.9894,
+ -0.910825,0,-0.412792,-39.615003,0,2409.402612,
+ -0.812792,0,-0.582554,-35.652558,0,2401.9894,
+ 0.227167,0,-0.973856,-8.365211,-70.07352,2077.257246,
+ 0.352161,0,-0.935939,-16.409017,-116.7892,2074.817194,
+ 0.412791,0,-0.910826,-16.409017,-70.07352,2074.817194,
+ 0.352161,0,-0.935939,-16.409017,-116.7892,2074.817194,
+ 0.227167,0,-0.973856,-8.365211,-70.07352,2077.257246,
+ 0.162802,0,-0.986659,-8.365211,-116.7892,2077.257246,
+ -0.849252,0,-0.527987,35.652624,-70.07352,2059.024406,
+ -0.910826,0,-0.412791,39.61506,-116.7892,2051.61119,
+ -0.812793,0,-0.582553,35.652624,-116.7892,2059.024406,
+ -0.910826,0,-0.412791,39.61506,-116.7892,2051.61119,
+ -0.849252,0,-0.527987,35.652624,-70.07352,2059.024406,
+ -0.935939,0,-0.352161,39.61506,-70.07352,2051.61119,
+ 0.812791,0,-0.582555,-35.652533,-70.07352,2059.024483,
+ 0.707106,0,-0.707108,-30.319973,-116.7892,2065.522212,
+ 0.849251,0,-0.527989,-35.652533,-116.7892,2059.024483,
+ 0.707106,0,-0.707108,-30.319973,-116.7892,2065.522212,
+ 0.812791,0,-0.582555,-35.652533,-70.07352,2059.024483,
+ 0.707106,0,-0.707108,-30.319973,-70.07352,2065.522212,
+ -0.707108,0,-0.707106,30.320095,-70.07352,1710.592346,
+ -0.812793,0,-0.582553,35.652637,-116.7892,1704.094603,
+ -0.707108,0,-0.707106,30.320095,-116.7892,1710.592346,
+ -0.812793,0,-0.582553,35.652637,-116.7892,1704.094603,
+ -0.707108,0,-0.707106,30.320095,-70.07352,1710.592346,
+ -0.849253,0,-0.527987,35.652637,-70.07352,1704.094603,
+ 0.910825,0,-0.412793,-39.614985,-70.07352,2051.611276,
+ 0.849251,0,-0.527989,-35.652533,-116.7892,2059.024483,
+ 0.935939,0,-0.352163,-39.614985,-116.7892,2051.611276,
+ 0.849251,0,-0.527989,-35.652533,-116.7892,2059.024483,
+ 0.910825,0,-0.412793,-39.614985,-70.07352,2051.611276,
+ 0.812791,0,-0.582555,-35.652533,-70.07352,2059.024483,
+ 0.582553,0,-0.812793,-23.822233,-70.07352,2070.854758,
+ 0.707106,0,-0.707108,-30.319973,-116.7892,2065.522212,
+ 0.707106,0,-0.707108,-30.319973,-70.07352,2065.522212,
+ 0.707106,0,-0.707108,-30.319973,-116.7892,2065.522212,
+ 0.582553,0,-0.812793,-23.822233,-70.07352,2070.854758,
+ 0.527987,0,-0.849252,-23.822233,-116.7892,2070.854758,
+ 0.707108,0,0.707106,-30.320039,-70.07352,2004.882161,
+ 0.812793,0,0.582553,-35.652584,-116.7892,2011.379901,
+ 0.707108,0,0.707106,-30.320039,-116.7892,2004.882161,
+ 0.812793,0,0.582553,-35.652584,-116.7892,2011.379901,
+ 0.707108,0,0.707106,-30.320039,-70.07352,2004.882161,
+ 0.849252,0,0.527987,-35.652584,-70.07352,2011.379901,
+ 0.935939,0,0.352161,-39.615021,-70.07352,2018.793117,
+ 0.973856,0,0.227167,-42.055073,-116.7892,2026.836923,
+ 0.910826,0,0.412791,-39.615021,-116.7892,2018.793117,
+ 0.973856,0,0.227167,-42.055073,-116.7892,2026.836923,
+ 0.935939,0,0.352161,-39.615021,-70.07352,2018.793117,
+ 0.986659,0,0.162802,-42.055073,-70.07352,2026.836923,
+ 0.986659,0,0.162802,-42.055073,-70.07352,2026.836923,
+ 0.999462,0,0.032812,-42.878972,-116.7892,2035.2022,
+ 0.973856,0,0.227167,-42.055073,-116.7892,2026.836923,
+ 0.999462,0,0.032812,-42.878972,-116.7892,2035.2022,
+ 0.986659,0,0.162802,-42.055073,-70.07352,2026.836923,
+ 0.999461,0,-0.032814,-42.878972,-70.07352,2035.2022,
+ 0.707108,0,0.707106,-30.320055,-70.07352,1649.952394,
+ 0.812793,0,0.582553,-35.652597,-116.7892,1656.450137,
+ 0.707108,0,0.707106,-30.320055,-116.7892,1649.952394,
+ 0.812793,0,0.582553,-35.652597,-116.7892,1656.450137,
+ 0.707108,0,0.707106,-30.320055,-70.07352,1649.952394,
+ 0.849253,0,0.527987,-35.652597,-70.07352,1656.450137,
+ 0.683524,-0,0.729928,30.320045,-741.474143,2456.131717,
+ 0.582554,-0,0.812792,23.822311,-116.7892,2461.464269,
+ 0.527988,-0,0.849252,23.822311,-741.512569,2461.464269,
+ 0.582554,-0,0.812792,23.822311,-116.7892,2461.464269,
+ 0.683524,-0,0.729928,30.320045,-741.474143,2456.131717,
+ 0.729928,0,0.683524,30.320045,-116.7892,2456.131717,
+ -0.162801,0,0.986659,8.365227,-116.7892,1638.217273,
+ -0.032811,0,0.999462,-0.00005,-70.07352,1637.393379,
+ 0.032814,0,0.999461,-0.00005,-116.7892,1637.393379,
+ -0.032811,0,0.999462,-0.00005,-70.07352,1637.393379,
+ -0.162801,0,0.986659,8.365227,-116.7892,1638.217273,
+ -0.227166,0,0.973856,8.365227,-70.07352,1638.217273,
+ -0.935939,0,0.352162,-39.615003,0,2442.220771,
+ -0.973856,0,0.227168,-42.055064,-70.07352,2434.176967,
+ -0.910825,0,0.412792,-39.615003,-70.07352,2442.220771,
+ -0.973856,0,0.227168,-42.055064,-70.07352,2434.176967,
+ -0.935939,0,0.352162,-39.615003,0,2442.220771,
+ -0.986659,0,0.162803,-42.055064,0,2434.176967,
+ -0.707106,0,0.707108,30.319996,-116.7892,1649.952295,
+ -0.582553,0,0.812793,23.822253,-70.07352,1644.619753,
+ -0.527987,0,0.849253,23.822253,-116.7892,1644.619753,
+ -0.582553,0,0.812793,23.822253,-70.07352,1644.619753,
+ -0.707106,0,0.707108,30.319996,-116.7892,1649.952295,
+ -0.707106,0,0.707108,30.319996,-70.07352,1649.952295,
+ -0.032813,0,-0.999462,0.00002,-116.7892,2382.9327,
+ -0.162803,0,-0.986659,-8.365256,-857.431241,2383.756608,
+ -0.227168,-0,-0.973856,-8.365256,-116.7892,2383.756608,
+ -0.162803,0,-0.986659,-8.365256,-857.431241,2383.756608,
+ -0.032813,0,-0.999462,0.00002,-116.7892,2382.9327,
+ 0.032813,0,-0.999462,0.00002,-858.151437,2382.9327,
+ 0.999462,0,0.032813,42.879011,0,2425.811691,
+ 0.986659,0,0.162803,42.055103,-70.07352,2434.176967,
+ 0.999462,0,-0.032813,42.879011,-70.07352,2425.811691,
+ 0.986659,0,0.162803,42.055103,-70.07352,2434.176967,
+ 0.999462,0,0.032813,42.879011,0,2425.811691,
+ 0.973856,0,0.227168,42.055103,0,2434.176967,
+ 0.973856,0,0.227168,42.055103,0,2434.176967,
+ 0.935939,0,0.352162,39.615042,-70.07352,2442.220771,
+ 0.986659,0,0.162803,42.055103,-70.07352,2434.176967,
+ 0.935939,0,0.352162,39.615042,-70.07352,2442.220771,
+ 0.973856,0,0.227168,42.055103,0,2434.176967,
+ 0.910825,0,0.412792,39.615042,0,2442.220771,
+ 0.849252,0,0.527987,-35.652584,-70.07352,2011.379901,
+ 0.910826,0,0.412791,-39.615021,-116.7892,2018.793117,
+ 0.812793,0,0.582553,-35.652584,-116.7892,2011.379901,
+ 0.910826,0,0.412791,-39.615021,-116.7892,2018.793117,
+ 0.849252,0,0.527987,-35.652584,-70.07352,2011.379901,
+ 0.935939,0,0.352161,-39.615021,-70.07352,2018.793117,
+ 0.999461,0,-0.032814,-42.878972,-70.07352,2035.2022,
+ 0.986658,0,-0.162804,-42.055055,-116.7892,2043.567475,
+ 0.999462,0,0.032812,-42.878972,-116.7892,2035.2022,
+ 0.986658,0,-0.162804,-42.055055,-116.7892,2043.567475,
+ 0.999461,0,-0.032814,-42.878972,-70.07352,2035.2022,
+ 0.973855,0,-0.227169,-42.055055,-70.07352,2043.567475
+};
+static const struct gllist robot_gearbox_half_frame = { GL_N3F_V3F, GL_TRIANGLES, 1578, robot_gearbox_half_data, 0 };
+const struct gllist *robot_gearbox_half = &robot_gearbox_half_frame;
+
+static const float robot_hand_half_data[] = {
+ -0.418515,-0.90821,0,1034.126632,-1016.895232,2093.596753,
+ -0.476936,-0.878938,0,993.755282,-994.9886,1976.807553,
+ -0.358044,-0.933705,0,1034.126632,-1016.895232,1976.807553,
+ -0.476936,-0.878938,0,993.755282,-994.9886,1976.807553,
+ -0.418515,-0.90821,0,1034.126632,-1016.895232,2093.596753,
+ -0.476936,-0.878938,0,993.755282,-994.9886,2093.596753,
+ 0.878938,-0.476936,0,1351.758968,-887.662995,1976.807553,
+ 0.845913,-0.533321,0,1329.088262,-929.442444,2093.596753,
+ 0.809111,-0.587656,0,1329.088262,-929.442444,1976.807553,
+ 0.845913,-0.533321,0,1329.088262,-929.442444,2093.596753,
+ 0.878938,-0.476936,0,1351.758968,-887.662995,1976.807553,
+ 0.878938,-0.476936,0,1351.758968,-887.662995,2093.596753,
+ 0.702644,-0.711542,0,1298.7024,-965.996278,2093.596753,
+ 0.577428,-0.816441,0,1261.769095,-995.919752,1976.807553,
+ 0.702644,-0.711542,0,1298.7024,-965.996278,1976.807553,
+ 0.577428,-0.816441,0,1261.769095,-995.919752,1976.807553,
+ 0.702644,-0.711542,0,1298.7024,-965.996278,2093.596753,
+ 0.522634,-0.852557,0,1261.769095,-995.919752,2093.596753,
+ 0,0,-1,993.755282,-887.662995,1976.807553,
+ 0,0,-1,1034.126632,-1016.895232,1976.807553,
+ 0,0,-1,993.755282,-994.9886,1976.807553,
+ 0,0,-1,1034.126632,-1016.895232,1976.807553,
+ 0,0,-1,993.755282,-887.662995,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1034.126632,-1016.895232,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1079.526136,-1030.979562,1976.807553,
+ 0,0,-1,1079.526136,-1030.979562,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1126.801018,-1035.936261,1976.807553,
+ 0,0,-1,1126.801018,-1035.936261,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1174.13453,-1031.574846,1976.807553,
+ 0,0,-1,1174.13453,-1031.574846,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1219.707673,-1018.062925,1976.807553,
+ 0,0,-1,1219.707673,-1018.062925,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1261.769095,-995.919752,1976.807553,
+ 0,0,-1,1261.769095,-995.919752,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1298.7024,-965.996278,1976.807553,
+ 0,0,-1,1298.7024,-965.996278,1976.807553,
+ 0,0,-1,1351.758968,-887.662995,1976.807553,
+ 0,0,-1,1329.088262,-929.442444,1976.807553,
+ 0,0,1,1034.126632,-1016.895232,2093.596753,
+ 0,0,1,993.755282,-887.662995,2093.596753,
+ 0,0,1,993.755282,-994.9886,2093.596753,
+ 0,0,1,993.755282,-887.662995,2093.596753,
+ 0,0,1,1034.126632,-1016.895232,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1034.126632,-1016.895232,2093.596753,
+ 0,0,1,1079.526136,-1030.979562,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1079.526136,-1030.979562,2093.596753,
+ 0,0,1,1126.801018,-1035.936261,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1126.801018,-1035.936261,2093.596753,
+ 0,0,1,1174.13453,-1031.574846,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1174.13453,-1031.574846,2093.596753,
+ 0,0,1,1219.707673,-1018.062925,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1219.707673,-1018.062925,2093.596753,
+ 0,0,1,1261.769095,-995.919752,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1261.769095,-995.919752,2093.596753,
+ 0,0,1,1298.7024,-965.996278,2093.596753,
+ 0,0,1,1351.758968,-887.662995,2093.596753,
+ 0,0,1,1298.7024,-965.996278,2093.596753,
+ 0,0,1,1329.088262,-929.442444,2093.596753,
+ -0,1,0,993.755282,-887.662995,2093.596753,
+ -0,1,0,1351.758968,-887.662995,1976.807553,
+ -0,1,0,993.755282,-887.662995,1976.807553,
+ -0,1,0,1351.758968,-887.662995,1976.807553,
+ -0,1,0,993.755282,-887.662995,2093.596753,
+ -0,1,0,1351.758968,-887.662995,2093.596753,
+ 0.809111,-0.587656,0,1329.088262,-929.442444,1976.807553,
+ 0.702644,-0.711542,0,1298.7024,-965.996278,2093.596753,
+ 0.702644,-0.711542,0,1298.7024,-965.996278,1976.807553,
+ 0.702644,-0.711542,0,1298.7024,-965.996278,2093.596753,
+ 0.809111,-0.587656,0,1329.088262,-929.442444,1976.807553,
+ 0.845913,-0.533321,0,1329.088262,-929.442444,2093.596753,
+ -0.039101,-0.999235,0,1126.801018,-1035.936261,2093.596753,
+ -0.169008,-0.985615,0,1079.526136,-1030.979562,1976.807553,
+ 0.026524,-0.999648,0,1126.801018,-1035.936261,1976.807553,
+ -0.169008,-0.985615,0,1079.526136,-1030.979562,1976.807553,
+ -0.039101,-0.999235,0,1126.801018,-1035.936261,2093.596753,
+ -0.233291,-0.972407,0,1079.526136,-1030.979562,2093.596753,
+ 0.156592,-0.987663,0,1174.13453,-1031.574846,2093.596753,
+ 0.026524,-0.999648,0,1126.801018,-1035.936261,1976.807553,
+ 0.221036,-0.975266,0,1174.13453,-1031.574846,1976.807553,
+ 0.026524,-0.999648,0,1126.801018,-1035.936261,1976.807553,
+ 0.156592,-0.987663,0,1174.13453,-1031.574846,2093.596753,
+ -0.039101,-0.999235,0,1126.801018,-1035.936261,2093.596753,
+ -0.233291,-0.972407,0,1079.526136,-1030.979562,2093.596753,
+ -0.358044,-0.933705,0,1034.126632,-1016.895232,1976.807553,
+ -0.169008,-0.985615,0,1079.526136,-1030.979562,1976.807553,
+ -0.358044,-0.933705,0,1034.126632,-1016.895232,1976.807553,
+ -0.233291,-0.972407,0,1079.526136,-1030.979562,2093.596753,
+ -0.418515,-0.90821,0,1034.126632,-1016.895232,2093.596753,
+ 0.346266,-0.938136,0,1219.707673,-1018.062925,2093.596753,
+ 0.221036,-0.975266,0,1174.13453,-1031.574846,1976.807553,
+ 0.407053,-0.913404,0,1219.707673,-1018.062925,1976.807553,
+ 0.221036,-0.975266,0,1174.13453,-1031.574846,1976.807553,
+ 0.346266,-0.938136,0,1219.707673,-1018.062925,2093.596753,
+ 0.156592,-0.987663,0,1174.13453,-1031.574846,2093.596753,
+ 0.522634,-0.852557,0,1261.769095,-995.919752,2093.596753,
+ 0.407053,-0.913404,0,1219.707673,-1018.062925,1976.807553,
+ 0.577428,-0.816441,0,1261.769095,-995.919752,1976.807553,
+ 0.407053,-0.913404,0,1219.707673,-1018.062925,1976.807553,
+ 0.522634,-0.852557,0,1261.769095,-995.919752,2093.596753,
+ 0.346266,-0.938136,0,1219.707673,-1018.062925,2093.596753
+};
+static const struct gllist robot_hand_half_frame = { GL_N3F_V3F, GL_TRIANGLES, 114, robot_hand_half_data, 0 };
+const struct gllist *robot_hand_half = &robot_hand_half_frame;
+
+static const float robot_leg_half_data[] = {
+ -0.935939,0,-0.352162,166.455213,-280.29408,1639.761005,
+ -0.973856,0,-0.227168,176.700984,-186.86272,1605.985223,
+ -0.986659,0,-0.162803,176.700984,-280.29408,1605.985223,
+ -0.973856,0,-0.227168,176.700984,-186.86272,1605.985223,
+ -0.935939,0,-0.352162,166.455213,-280.29408,1639.761005,
+ -0.910825,0,-0.412792,166.455213,-186.86272,1639.761005,
+ -0.83147,0,-0.55557,149.816983,-280.29408,1670.888943,
+ -0.910825,0,-0.412792,166.455213,-186.86272,1639.761005,
+ -0.935939,0,-0.352162,166.455213,-280.29408,1639.761005,
+ -0.910825,0,-0.412792,166.455213,-186.86272,1639.761005,
+ -0.83147,0,-0.55557,149.816983,-280.29408,1670.888943,
+ -0.83147,0,-0.55557,149.816983,-186.86272,1670.888943,
+ 1,-0,0,93.530885,-186.86272,242.726639,
+ 1,-0,0,93.530885,-280.29408,1315.222366,
+ 1,-0,0,93.530885,-280.29408,242.726639,
+ 1,-0,0,93.530885,-280.29408,1315.222366,
+ 1,-0,0,93.530885,-186.86272,242.726639,
+ 1,-0,0,93.530885,-186.86272,1315.222366,
+ -0.582554,0,0.812792,100.141826,-280.29408,1421.155065,
+ -0.707107,0,0.707107,127.425692,-186.86272,1443.546356,
+ -0.527988,0,0.849252,100.141826,-186.86272,1421.155065,
+ -0.707107,0,0.707107,127.425692,-186.86272,1443.546356,
+ -0.582554,0,0.812792,100.141826,-280.29408,1421.155065,
+ -0.707107,0,0.707107,127.425692,-280.29408,1443.546356,
+ -0.615705,0.787976,-0,653.291518,-646.340639,5.83946,
+ -0.559296,0.828968,-0,642.023926,-654.528574,-0,
+ -0.530018,0.847987,-0,642.023926,-654.528574,5.83946,
+ -0.559296,0.828968,-0,642.023926,-654.528574,-0,
+ -0.615705,0.787976,-0,653.291518,-646.340639,5.83946,
+ -0.642837,0.766003,-0,653.291518,-646.340639,-0,
+ -0.83147,0,-0.55557,149.816983,-280.29408,1670.888943,
+ -0.729928,0,-0.683524,127.425692,-186.86272,1698.17281,
+ -0.83147,0,-0.55557,149.816983,-186.86272,1670.888943,
+ -0.729928,0,-0.683524,127.425692,-186.86272,1698.17281,
+ -0.83147,0,-0.55557,149.816983,-280.29408,1670.888943,
+ -0.683524,0,-0.729928,127.425692,-280.29408,1698.17281,
+ 0,1,0,806.270901,56.185652,23.357838,
+ 0,1,0,847.545902,56.185652,0,
+ 0,1,0,806.270901,56.185652,0,
+ 0,1,0,847.545902,56.185652,0,
+ 0,1,0,806.270901,56.185652,23.357838,
+ 0,1,0,847.545902,56.185652,23.357838,
+ 0.487279,-0.526963,0.696326,461.27,-697.739849,192.761586,
+ 0.603343,-0.550894,0.576621,464.090792,-720.287768,170.665181,
+ 0.603343,-0.467182,0.646311,464.09079,-696.627201,191.294034,
+ 0.603343,-0.550894,0.576621,464.090792,-720.287768,170.665181,
+ 0.487279,-0.526963,0.696326,461.27,-697.739849,192.761586,
+ 0.487279,-0.616933,0.618023,461.270002,-721.590015,171.967428,
+ 0.998111,-0.031311,0.052854,793.410423,-566.321374,23.357838,
+ 0.991932,-0.07777,0.100113,792.007218,-582.090797,40.223697,
+ 0.998111,-0.038222,0.048094,793.309566,-569.30368,23.357838,
+ 0.991932,-0.07777,0.100113,792.007218,-582.090797,40.223697,
+ 0.998111,-0.031311,0.052854,793.410423,-566.321374,23.357838,
+ 0.991932,-0.063402,0.109777,792.007217,-577.494024,43.23773,
+ 0.127347,-0.864568,0.486113,624.955342,-738.83011,109.90761,
+ 0.030867,-0.796473,0.603886,599.602156,-724.524748,134.576836,
+ 0.030867,-0.871333,0.489721,599.602151,-740.19647,110.675522,
+ 0.030867,-0.796473,0.603886,599.602156,-724.524748,134.576836,
+ 0.127347,-0.864568,0.486113,624.955342,-738.83011,109.90761,
+ 0.127347,-0.790262,0.59939,624.955347,-723.275771,133.6299,
+ -0.285905,0.891387,-0.351693,436.335613,-749.104397,83.53758,
+ -0.415875,0.883495,-0.215602,439.690597,-756.366969,56.464997,
+ -0.285905,0.930996,-0.226946,436.335601,-757.591911,56.762987,
+ -0.415875,0.883495,-0.215602,439.690597,-756.366969,56.464997,
+ -0.285905,0.891387,-0.351693,436.335613,-749.104397,83.53758,
+ -0.415875,0.845875,-0.333982,439.690608,-747.931487,83.075452,
+ -0.415875,0.845875,-0.333982,439.690608,-747.931487,83.075452,
+ -0.537771,0.818998,-0.200111,442.839466,-754.702001,56.059962,
+ -0.415875,0.883495,-0.215602,439.690597,-756.366969,56.464997,
+ -0.537771,0.818998,-0.200111,442.839466,-754.702001,56.059962,
+ -0.415875,0.845875,-0.333982,439.690608,-747.931487,83.075452,
+ -0.537771,0.78409,-0.309846,442.839477,-746.337241,82.447316,
+ 0.361665,-0.92741,0.095445,458.222215,-789.666464,31.875739,
+ 0.229025,-0.94575,0.230443,455.006085,-785.239687,63.48879,
+ 0.229024,-0.96833,0.09942,455.006069,-790.65817,31.977188,
+ 0.229025,-0.94575,0.230443,455.006085,-785.239687,63.48879,
+ 0.361665,-0.92741,0.095445,458.222215,-789.666464,31.875739,
+ 0.361665,-0.905753,0.220929,458.222231,-784.271055,63.253152,
+ 0,1,0,764.9959,-186.86272,23.357838,
+ 0,1,0,0.001765,-186.86272,5.83946,
+ 0,1,0,0.001765,-186.86272,23.357838,
+ 0,1,0,0.001765,-186.86272,5.83946,
+ 0,1,0,764.9959,-186.86272,23.357838,
+ 0,1,0,764.9959,-186.86272,5.83946,
+ 0.932875,-0.177759,0.313282,472.107204,-665.162054,199.228412,
+ 0.874212,-0.294445,0.386077,470.677524,-692.04293,185.247507,
+ 0.932875,-0.218791,0.286137,472.107209,-690.197308,182.813182,
+ 0.874212,-0.294445,0.386077,470.677524,-692.04293,185.247507,
+ 0.932875,-0.177759,0.313282,472.107204,-665.162054,199.228412,
+ 0.874212,-0.239089,0.422598,470.677518,-666.658744,201.891525,
+ -0.022507,0.01679,-0.999606,602.133251,-548.673148,186.220487,
+ 0,0,-1,454.66772,-186.86272,186.220487,
+ -0.030004,0,-0.99955,602.133251,-186.86272,186.220487,
+ 0,0,-1,454.66772,-186.86272,186.220487,
+ -0.022507,0.01679,-0.999606,602.133251,-548.673148,186.220487,
+ -0,0.022395,-0.999749,454.66772,-548.673192,186.220487,
+ 0.381503,-0.21794,0.898308,673.957358,-603.792753,197.311473,
+ 0.499663,-0.316836,0.806196,696.758793,-625.025898,178.836737,
+ 0.499663,-0.204023,0.84185,696.758783,-601.14038,186.408417,
+ 0.499663,-0.316836,0.806196,696.758793,-625.025898,178.836737,
+ 0.381503,-0.21794,0.898308,673.957358,-603.792753,197.311473,
+ 0.381503,-0.338316,0.860231,673.957369,-629.139245,189.276665,
+ 0,-0.016797,0.999859,473.71772,-549.195746,217.326639,
+ 0.020529,0,0.999789,599.602099,-186.86272,217.326639,
+ 0,0,1,473.71772,-186.86272,217.326639,
+ 0.020529,0,0.999789,599.602099,-186.86272,217.326639,
+ 0,-0.016797,0.999859,473.71772,-549.195746,217.326639,
+ 0.041063,-0.016783,0.999016,599.602099,-549.195708,217.326639,
+ 0,-1,-0,93.530885,-280.29408,242.726639,
+ 0,-1,-0,0.112465,-280.29408,1390.81149,
+ 0,-1,-0,0.000488,-280.29408,242.726639,
+ 0,-1,-0,0.112465,-280.29408,1390.81149,
+ 0,-1,-0,93.530885,-280.29408,242.726639,
+ 0,-1,-0,35.238106,-280.29408,1394.271064,
+ 0,-1,-0,35.238106,-280.29408,1394.271064,
+ 0,-1,-0,93.530885,-280.29408,242.726639,
+ 0,-1,-0,69.013887,-280.29408,1404.516835,
+ 0,-1,-0,69.013887,-280.29408,1404.516835,
+ 0,-1,-0,93.530885,-280.29408,242.726639,
+ 0,-1,-0,93.530885,-280.29408,1315.222366,
+ 0,-1,-0,69.013887,-280.29408,1404.516835,
+ 0,-1,-0,93.530885,-280.29408,1315.222366,
+ 0,-1,-0,100.141826,-280.29408,1421.155065,
+ 0,-1,-0,100.141826,-280.29408,1421.155065,
+ 0,-1,-0,93.530885,-280.29408,1315.222366,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,-0,100.141826,-280.29408,1421.155065,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,0,127.425692,-280.29408,1443.546356,
+ 0,-1,0,127.425692,-280.29408,1443.546356,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,0,149.816983,-280.29408,1470.830222,
+ 0,-1,0,149.816983,-280.29408,1470.830222,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,0,166.455213,-280.29408,1501.958161,
+ 0,-1,0,166.455213,-280.29408,1501.958161,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,0,176.700984,-280.29408,1535.733942,
+ 0,-1,0,176.700984,-280.29408,1535.733942,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,0,180.160558,-280.29408,1570.859583,
+ 0,-1,0,180.160558,-280.29408,1570.859583,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,0,180.185724,-280.29408,1903.252111,
+ 0,-1,0,35.243015,-280.29408,2079.865312,
+ 0,-1,0,0.179984,-280.29408,2125.502553,
+ 0,-1,0,0.112465,-280.29408,2083.325369,
+ 0,-1,0,0.179984,-280.29408,2125.502553,
+ 0,-1,0,35.243015,-280.29408,2079.865312,
+ 0,-1,0,46.868397,-280.29408,2125.502553,
+ 0,-1,0,46.868397,-280.29408,2125.502553,
+ 0,-1,0,35.243015,-280.29408,2079.865312,
+ 0,-1,0,69.023518,-280.29408,2069.618109,
+ 0,-1,0,46.868397,-280.29408,2125.502553,
+ 0,-1,0,69.023518,-280.29408,2069.618109,
+ 0,-1,0,46.868397,-280.29408,2499.208064,
+ 0,-1,0,46.868397,-280.29408,2499.208064,
+ 0,-1,0,69.023518,-280.29408,2069.618109,
+ 0,-1,0,93.652471,-280.29408,2499.208064,
+ 0,-1,0,93.652471,-280.29408,2499.208064,
+ 0,-1,0,69.023518,-280.29408,2069.618109,
+ -0,-1,0,100.155807,-280.29408,2052.977553,
+ 0,-1,0,93.652471,-280.29408,2499.208064,
+ -0,-1,0,100.155807,-280.29408,2052.977553,
+ -0,-1,0,123.089852,-280.29408,2224.766097,
+ -0,-1,0,123.089852,-280.29408,2224.766097,
+ -0,-1,0,100.155807,-280.29408,2052.977553,
+ -0,-1,0,127.443487,-280.29408,2030.583133,
+ -0,-1,0,123.089852,-280.29408,2224.766097,
+ -0,-1,0,127.443487,-280.29408,2030.583133,
+ 0,-1,0,221.73981,-280.29408,2013.443961,
+ 0,-1,0,221.73981,-280.29408,2013.443961,
+ -0,-1,0,127.443487,-280.29408,2030.583133,
+ 0,-1,0,149.837908,-280.29408,2003.295453,
+ 0,-1,0,221.73981,-280.29408,2013.443961,
+ 0,-1,0,149.837908,-280.29408,2003.295453,
+ 0,-1,0,166.478463,-280.29408,1972.163164,
+ 0,-1,0,221.73981,-280.29408,2013.443961,
+ 0,-1,0,166.478463,-280.29408,1972.163164,
+ 0,-1,0,176.725666,-280.29408,1938.382661,
+ 0,-1,0,221.73981,-280.29408,2013.443961,
+ 0,-1,0,176.725666,-280.29408,1938.382661,
+ 0,-1,0,180.185724,-280.29408,1903.252111,
+ 0,-1,0,221.73981,-280.29408,2013.443961,
+ 0,-1,0,180.185724,-280.29408,1903.252111,
+ 0,-1,-0,221.73981,-280.29408,1435.598634,
+ 0,-1,0,100.141826,-280.29408,1720.5641,
+ 0,-1,0,100.155807,-280.29408,1753.526669,
+ 0,-1,0,69.327289,-280.29408,1737.048483,
+ 0,-1,0,100.155807,-280.29408,1753.526669,
+ 0,-1,0,100.141826,-280.29408,1720.5641,
+ 0,-1,0,127.425692,-280.29408,1698.17281,
+ 0,-1,0,100.155807,-280.29408,1753.526669,
+ 0,-1,0,127.425692,-280.29408,1698.17281,
+ 0,-1,0,127.443487,-280.29408,1775.921089,
+ 0,-1,0,127.443487,-280.29408,1775.921089,
+ 0,-1,0,127.425692,-280.29408,1698.17281,
+ 0,-1,0,149.816983,-280.29408,1670.888943,
+ 0,-1,0,127.443487,-280.29408,1775.921089,
+ 0,-1,0,149.816983,-280.29408,1670.888943,
+ 0,-1,0,149.837908,-280.29408,1803.208769,
+ 0,-1,0,149.837908,-280.29408,1803.208769,
+ 0,-1,0,149.816983,-280.29408,1670.888943,
+ 0,-1,0,166.455213,-280.29408,1639.761005,
+ 0,-1,0,149.837908,-280.29408,1803.208769,
+ 0,-1,0,166.455213,-280.29408,1639.761005,
+ 0,-1,0,166.478463,-280.29408,1834.341059,
+ 0,-1,0,166.478463,-280.29408,1834.341059,
+ 0,-1,0,166.455213,-280.29408,1639.761005,
+ 0,-1,0,176.700984,-280.29408,1605.985223,
+ 0,-1,0,166.478463,-280.29408,1834.341059,
+ 0,-1,0,176.700984,-280.29408,1605.985223,
+ 0,-1,0,176.725666,-280.29408,1868.121561,
+ 0,-1,0,176.725666,-280.29408,1868.121561,
+ 0,-1,0,176.700984,-280.29408,1605.985223,
+ 0,-1,0,180.160558,-280.29408,1570.859583,
+ 0,-1,0,176.725666,-280.29408,1868.121561,
+ 0,-1,0,180.160558,-280.29408,1570.859583,
+ 0,-1,0,180.185724,-280.29408,1903.252111,
+ -0.952384,0.284225,-0.110366,453.575559,-733.364268,77.335952,
+ -0.985345,0.149457,-0.082208,454.431271,-719.259121,98.908612,
+ -0.985345,0.159265,-0.061075,454.431263,-730.119577,76.057541,
+ -0.985345,0.149457,-0.082208,454.431271,-719.259121,98.908612,
+ -0.952384,0.284225,-0.110366,453.575559,-733.364268,77.335952,
+ -0.952384,0.266534,-0.148066,453.575567,-722.299342,100.61724,
+ 0.854897,-0.518797,-0,813.090986,-692.336727,-0,
+ 0.806461,-0.591287,-0,794.401548,-720.307447,23.357838,
+ 0.779867,-0.625945,-0,794.401548,-720.307447,-0,
+ 0.806461,-0.591287,-0,794.401548,-720.307447,23.357838,
+ 0.854897,-0.518797,-0,813.090986,-692.336727,-0,
+ 0.87674,-0.480964,-0,813.090986,-692.336727,23.357838,
+ 0.995804,-0.010878,0.090867,473.642039,-579.415029,219.678492,
+ 0.973657,-0.055392,0.221186,473.101737,-608.824017,217.993091,
+ 0.995804,-0.023158,0.088537,473.642053,-608.036762,214.756927,
+ 0.973657,-0.055392,0.221186,473.101737,-608.824017,217.993091,
+ 0.995804,-0.010878,0.090867,473.642039,-579.415029,219.678492,
+ 0.973657,-0.024735,0.226671,473.101722,-579.75396,222.991746,
+ 0.924993,-0.331932,0.184956,779.024167,-635.678246,51.93544,
+ 0.867227,-0.463727,0.18131,767.829328,-662.181333,49.28971,
+ 0.924993,-0.354039,0.138,779.024163,-640.917494,40.911739,
+ 0.867227,-0.463727,0.18131,767.829328,-662.181333,49.28971,
+ 0.924993,-0.331932,0.184956,779.024167,-635.678246,51.93544,
+ 0.867227,-0.434695,0.24281,767.829333,-655.602109,63.132805,
+ 0.924993,-0.230673,0.301955,779.024169,-611.764971,79.363123,
+ 0.867227,-0.352996,0.351156,767.829337,-637.125516,87.502929,
+ 0.924993,-0.269668,0.267706,779.02417,-620.964741,71.342153,
+ 0.867227,-0.352996,0.351156,767.829337,-637.125516,87.502929,
+ 0.924993,-0.230673,0.301955,779.024169,-611.764971,79.363123,
+ 0.867227,-0.301852,0.395982,767.829336,-625.572837,97.575321,
+ -0.832687,0.392486,-0.390624,450.471126,-695.789522,146.166935,
+ -0.901181,0.263001,-0.344532,452.247014,-673.811262,161.200429,
+ -0.901181,0.307496,-0.305481,452.247015,-693.58391,143.961322,
+ -0.901181,0.263001,-0.344532,452.247014,-673.811262,161.200429,
+ -0.832687,0.392486,-0.390624,450.471126,-695.789522,146.166935,
+ -0.832687,0.335596,-0.440463,450.471124,-675.695751,163.686019,
+ 0,0,-1,847.545902,-186.86272,0,
+ -0,0,-1,806.270901,56.185652,0,
+ 0,0,-1,847.545902,56.185652,0,
+ -0,0,-1,806.270901,56.185652,0,
+ 0,0,-1,847.545902,-186.86272,0,
+ -0,0,-1,700.992217,-563.749227,-0,
+ -0,0,-1,700.992217,-563.749227,-0,
+ 0,0,-1,847.545902,-186.86272,0,
+ 0,0,-1,847.545902,-563.749227,0,
+ -0,0,-1,700.992217,-563.749227,-0,
+ 0,0,-1,847.545902,-563.749227,0,
+ -0,0,-1,843.130723,-608.452917,-0,
+ -0,0,-1,700.992217,-563.749227,-0,
+ -0,0,-1,843.130723,-608.452917,-0,
+ -0,-0,-1,698.091838,-577.372321,-0,
+ -0,-0,-1,698.091838,-577.372321,-0,
+ -0,0,-1,843.130723,-608.452917,-0,
+ -0,0,-1,693.784142,-590.617874,-0,
+ -0,0,-1,693.784142,-590.617874,-0,
+ -0,0,-1,843.130723,-608.452917,-0,
+ -0,0,-1,688.11627,-603.340929,-0,
+ -0,0,-1,688.11627,-603.340929,-0,
+ -0,0,-1,843.130723,-608.452917,-0,
+ -0,0,-1,681.15025,-615.40225,-0,
+ -0,0,-1,681.15025,-615.40225,-0,
+ -0,0,-1,843.130723,-608.452917,-0,
+ -0,0,-1,838.782877,-630.311015,-0,
+ -0,0,-1,681.15025,-615.40225,-0,
+ -0,0,-1,838.782877,-630.311015,-0,
+ -0,0,-1,672.962315,-626.669842,-0,
+ -0,0,-1,672.962315,-626.669842,-0,
+ -0,0,-1,838.782877,-630.311015,-0,
+ -0,0,-1,663.642072,-637.020396,-0,
+ -0,0,-1,663.642072,-637.020396,-0,
+ -0,0,-1,838.782877,-630.311015,-0,
+ -0,0,-1,827.969621,-662.165838,-0,
+ -0,0,-1,663.642072,-637.020396,-0,
+ -0,0,-1,827.969621,-662.165838,-0,
+ -0,0,-1,653.291518,-646.340639,-0,
+ -0,0,-1,653.291518,-646.340639,-0,
+ -0,0,-1,827.969621,-662.165838,-0,
+ -0,0,-1,642.023926,-654.528574,-0,
+ -0,0,-1,642.023926,-654.528574,-0,
+ -0,0,-1,827.969621,-662.165838,-0,
+ -0,0,-1,629.962605,-661.494594,-0,
+ -0,0,-1,629.962605,-661.494594,-0,
+ -0,0,-1,827.969621,-662.165838,-0,
+ -0,0,-1,617.239549,-667.162466,-0,
+ -0,0,-1,617.239549,-667.162466,-0,
+ -0,0,-1,827.969621,-662.165838,-0,
+ -0,0,-1,813.090986,-692.336727,-0,
+ -0,0,-1,617.239549,-667.162466,-0,
+ -0,0,-1,813.090986,-692.336727,-0,
+ -0,0,-1,603.993997,-671.470162,-0,
+ -0,0,-1,603.993997,-671.470162,-0,
+ -0,0,-1,813.090986,-692.336727,-0,
+ -0,0,-1,590.370902,-674.370541,0,
+ -0,0,-1,590.370902,-674.370541,0,
+ -0,0,-1,813.090986,-692.336727,-0,
+ -0,0,-1,0.000468,-674.370541,0,
+ -0,0,-1,0.000468,-674.370541,0,
+ -0,0,-1,813.090986,-692.336727,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,0,-1,813.090986,-692.336727,-0,
+ -0,0,-1,794.401548,-720.307447,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,0,-1,794.401548,-720.307447,-0,
+ -0,0,-1,772.221089,-745.599413,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,0,-1,772.221089,-745.599413,-0,
+ -0,-0,-1,746.929123,-767.779872,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,-0,-1,746.929123,-767.779872,-0,
+ -0,-0,-1,718.958402,-786.46931,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,-0,-1,718.958402,-786.46931,-0,
+ -0,-0,-1,688.787514,-801.347945,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,-0,-1,688.787514,-801.347945,-0,
+ -0,-0,-1,656.93269,-812.161201,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,-0,-1,656.93269,-812.161201,-0,
+ -0,-0,-1,623.938976,-818.724059,-0,
+ -0,-0,-1,0.000468,-820.924227,0,
+ -0,-0,-1,623.938976,-818.724059,-0,
+ 0,-0,-1,590.370902,-820.924227,0,
+ -0.412792,0,0.910825,69.013887,-280.29408,1404.516835,
+ -0.527988,0,0.849252,100.141826,-186.86272,1421.155065,
+ -0.352162,0,0.935939,69.013887,-186.86272,1404.516835,
+ -0.527988,0,0.849252,100.141826,-186.86272,1421.155065,
+ -0.412792,0,0.910825,69.013887,-280.29408,1404.516835,
+ -0.582554,0,0.812792,100.141826,-280.29408,1421.155065,
+ -0.112343,0.23471,-0.965552,623.546346,-599.640892,180.244333,
+ -0.022557,0.101727,-0.994557,602.133267,-575.89875,185.30549,
+ -0.112343,0.100949,-0.988528,623.546333,-575.800358,184.343761,
+ -0.022557,0.101727,-0.994557,602.133267,-575.89875,185.30549,
+ -0.112343,0.23471,-0.965552,623.546346,-599.640892,180.244333,
+ -0.022557,0.236303,-0.971418,602.13328,-599.869416,181.183686,
+ -0.649152,0.701164,-0.294909,445.721732,-744.352284,81.665241,
+ -0.748179,0.578988,-0.324038,448.282012,-730.404697,105.172511,
+ -0.748179,0.617743,-0.242119,448.282005,-742.014746,80.744249,
+ -0.748179,0.578988,-0.324038,448.282012,-730.404697,105.172511,
+ -0.649152,0.701164,-0.294909,445.721732,-744.352284,81.665241,
+ -0.649152,0.654437,-0.387703,445.72174,-732.59493,106.40344,
+ 0.874212,-0.050786,0.482881,470.677482,-580.392895,229.237697,
+ 0.79876,-0.143441,0.5843,468.840142,-610.976426,226.840986,
+ 0.874212,-0.116112,0.471456,470.677497,-610.308103,224.093716,
+ 0.79876,-0.143441,0.5843,468.840142,-610.976426,226.840986,
+ 0.874212,-0.050786,0.482881,470.677482,-580.392895,229.237697,
+ 0.79876,-0.062483,0.598396,468.840127,-580.680624,232.05041,
+ 0.988867,-0.134398,0.063875,792.007216,-595.005501,23.357838,
+ 0.969153,-0.229071,0.090936,787.130187,-618.467587,32.066457,
+ 0.98147,-0.179832,0.066156,791.767078,-596.364536,23.357838,
+ 0.969153,-0.229071,0.090936,787.130187,-618.467587,32.066457,
+ 0.988867,-0.134398,0.063875,792.007216,-595.005501,23.357838,
+ 0.991932,-0.111235,0.060808,792.007217,-592.860317,27.871437,
+ 0.969153,-0.229071,0.090936,787.130187,-618.467587,32.066457,
+ 0.991932,-0.111235,0.060808,792.007217,-592.860317,27.871437,
+ 0.966794,-0.223491,0.12394,787.130189,-614.643058,40.113503,
+ 0.382469,-0.01552,0.923838,458.222196,-549.595395,241.116069,
+ 0.466054,-0,0.884757,461.269937,-186.86272,239.686382,
+ 0.339245,0,0.940698,458.222196,-186.86272,241.116069,
+ 0.466054,-0,0.884757,461.269937,-186.86272,239.686382,
+ 0.382469,-0.01552,0.923838,458.222196,-549.595395,241.116069,
+ 0.506559,-0.014482,0.862083,461.269937,-549.571376,239.686382,
+ 0.707932,-0.563451,0.425857,736.997696,-679.337949,100.317733,
+ 0.616524,-0.682339,0.392825,717.894074,-705.391609,91.114894,
+ 0.717149,-0.603071,0.349289,736.997692,-690.762817,82.893397,
+ 0.616524,-0.682339,0.392825,717.894074,-705.391609,91.114894,
+ 0.707932,-0.563451,0.425857,736.997696,-679.337949,100.317733,
+ 0.609002,-0.620953,0.493491,717.894078,-692.709977,110.455949,
+ -0.928388,0.225646,-0.295263,753.576412,-604.820821,70.203974,
+ -0.9698,0.12079,-0.21189,760.201826,-585.915972,58.223185,
+ -0.9698,0.148537,-0.193454,760.201828,-592.476195,53.921748,
+ -0.9698,0.12079,-0.21189,760.201826,-585.915972,58.223185,
+ -0.928388,0.225646,-0.295263,753.576412,-604.820821,70.203974,
+ -0.928388,0.183307,-0.323257,753.57641,-595.926736,76.035688,
+ -0.985345,0.018907,-0.169523,454.43124,-576.627626,192.429881,
+ -0.999453,0.000944,-0.033066,454.797637,-548.733344,189.801127,
+ -0.999454,0.00493,-0.032673,454.797654,-576.264066,188.875876,
+ -0.999453,0.000944,-0.033066,454.797637,-548.733344,189.801127,
+ -0.985345,0.018907,-0.169523,454.43124,-576.627626,192.429881,
+ -0.985283,0.003254,-0.170901,454.431224,-548.79322,193.365338,
+ -0.415875,0.214324,-0.883806,439.690597,-606.087584,206.744382,
+ -0.285905,0.097067,-0.953329,436.335587,-578.704167,212.729198,
+ -0.415875,0.091892,-0.904767,439.690582,-578.575874,211.475076,
+ -0.285905,0.097067,-0.953329,436.335587,-578.704167,212.729198,
+ -0.415875,0.214324,-0.883806,439.690597,-606.087584,206.744382,
+ -0.285905,0.226068,-0.93121,436.335601,-606.385575,207.969324,
+ -0.537771,0.08495,-0.8388,442.839452,-578.401496,209.770445,
+ -0.41512,0.01512,-0.909641,439.690565,-549.114088,212.465226,
+ -0.536932,0.013961,-0.84351,442.839435,-549.085368,210.7557,
+ -0.41512,0.01512,-0.909641,439.690565,-549.114088,212.465226,
+ -0.537771,0.08495,-0.8388,442.839452,-578.401496,209.770445,
+ -0.415875,0.091892,-0.904767,439.690582,-578.575874,211.475076,
+ 0.499663,-0.204023,0.84185,696.758783,-601.14038,186.408417,
+ 0.609101,-0.289877,0.738219,717.894067,-619.848758,165.69683,
+ 0.609101,-0.186578,0.770833,717.894058,-597.802054,172.685609,
+ 0.609101,-0.289877,0.738219,717.894067,-619.848758,165.69683,
+ 0.499663,-0.204023,0.84185,696.758783,-601.14038,186.408417,
+ 0.499663,-0.316836,0.806196,696.758793,-625.025898,178.836737,
+ 0.995804,-0.08054,0.043457,473.642074,-743.137303,112.328326,
+ 0.973657,-0.212704,0.08215,473.101749,-758.702385,87.31918,
+ 0.995804,-0.08571,0.032077,473.642065,-755.603683,86.09829,
+ 0.973657,-0.212704,0.08215,473.101749,-758.702385,87.31918,
+ 0.995804,-0.08054,0.043457,473.642074,-743.137303,112.328326,
+ 0.973657,-0.199526,0.110368,473.101758,-746.040734,113.960076,
+ 0.237659,-0.971349,-0,656.93269,-812.161201,-0,
+ 0.152151,-0.988357,-0,623.938976,-818.724059,23.357838,
+ 0.108839,-0.994059,-0,623.938976,-818.724059,-0,
+ 0.152151,-0.988357,-0,623.938976,-818.724059,23.357838,
+ 0.237659,-0.971349,-0,656.93269,-812.161201,-0,
+ 0.279856,-0.960042,-0,656.93269,-812.161201,23.357838,
+ 0.932875,-0.038122,0.358177,472.107168,-580.082016,226.198682,
+ 0.874212,-0.116112,0.471456,470.677497,-610.308103,224.093716,
+ 0.932875,-0.086574,0.349641,472.107183,-609.58601,221.125411,
+ 0.874212,-0.116112,0.471456,470.677497,-610.308103,224.093716,
+ 0.932875,-0.038122,0.358177,472.107168,-580.082016,226.198682,
+ 0.874212,-0.050786,0.482881,470.677482,-580.392895,229.237697,
+ -0.040706,0.101643,-0.993988,429.267738,-578.813573,213.798664,
+ -0,0.022395,-0.999749,0.016247,-549.153365,214.795487,
+ -0.040617,0.016774,-0.999034,429.26772,-549.153238,214.795487,
+ -0,0.022395,-0.999749,0.016247,-549.153365,214.795487,
+ -0.040706,0.101643,-0.993988,429.267738,-578.813573,213.798664,
+ -0,0.124431,-0.992228,0.016265,-578.81381,213.79866,
+ 0.707841,-0.682368,0.182581,466.630415,-778.937032,61.955552,
+ 0.603443,-0.741548,0.293196,464.090775,-771.60356,92.402256,
+ 0.603443,-0.774584,0.189413,464.090763,-781.089165,62.479098,
+ 0.603443,-0.741548,0.293196,464.090775,-771.60356,92.402256,
+ 0.707841,-0.682368,0.182581,466.630415,-778.937032,61.955552,
+ 0.707841,-0.651123,0.273862,466.630427,-769.542842,91.59033,
+ -0.999454,0.009337,-0.031696,454.797666,-600.717836,184.671001,
+ -0.999345,-0.004503,0.035903,454.667737,-575.898832,185.305489,
+ -0.999345,-0.009353,0.034955,454.667749,-599.869485,181.183687,
+ -0.999345,-0.004503,0.035903,454.667737,-575.898832,185.305489,
+ -0.999454,0.009337,-0.031696,454.797666,-600.717836,184.671001,
+ -0.999454,0.00493,-0.032673,454.797654,-576.264066,188.875876,
+ 0.966794,-0.223491,0.12394,787.130189,-614.643058,40.113503,
+ 0.924993,-0.354039,0.138,779.024163,-640.917494,40.911739,
+ 0.969153,-0.229071,0.090936,787.130187,-618.467587,32.066457,
+ 0.924993,-0.354039,0.138,779.024163,-640.917494,40.911739,
+ 0.966794,-0.223491,0.12394,787.130189,-614.643058,40.113503,
+ 0.924993,-0.331932,0.184956,779.024167,-635.678246,51.93544,
+ 0.707841,-0.682368,0.182581,736.997677,-706.002952,44.212918,
+ 0.609101,-0.737549,0.291577,717.894067,-715.319418,70.22617,
+ 0.609101,-0.770402,0.188354,717.894058,-722.308196,48.179466,
+ 0.609101,-0.737549,0.291577,717.894067,-715.319418,70.22617,
+ 0.707841,-0.682368,0.182581,736.997677,-706.002952,44.212918,
+ 0.707841,-0.651123,0.273862,736.997686,-699.706769,64.074769,
+ -0.795651,0.010475,-0.605664,732.466031,-547.618545,123.445905,
+ -0.858411,0,-0.512963,744.275028,-186.86272,105.557439,
+ -0.869747,0.008617,-0.493422,744.275028,-547.318028,105.557439,
+ -0.858411,0,-0.512963,744.275028,-186.86272,105.557439,
+ -0.795651,0.010475,-0.605664,732.466031,-547.618545,123.445905,
+ -0.7818,0,-0.623529,732.466031,-186.86272,123.445905,
+ 0.091928,-0.967513,0.235514,451.683317,-785.765921,63.616808,
+ 0.011271,-0.930329,0.366553,448.317768,-776.152256,94.194451,
+ 0.01127,-0.9716,0.236362,448.317755,-785.839647,63.634744,
+ 0.011271,-0.930329,0.366553,448.317768,-776.152256,94.194451,
+ 0.091928,-0.967513,0.235514,451.683317,-785.765921,63.616808,
+ 0.091928,-0.926396,0.365157,451.68333,-776.081661,94.166635,
+ -0.494423,0.614096,-0.615169,684.332898,-669.009253,119.386665,
+ -0.606606,0.622389,-0.494632,702.22136,-673.696701,96.040736,
+ -0.494423,0.692194,-0.52575,684.332897,-683.128909,103.191916,
+ -0.606606,0.622389,-0.494632,702.22136,-673.696701,96.040736,
+ -0.494423,0.614096,-0.615169,684.332898,-669.009253,119.386665,
+ -0.606606,0.549182,-0.574829,702.221362,-660.639487,111.0169,
+ -0.244971,0.228806,-0.942145,644.636243,-598.733545,176.514546,
+ -0.112343,0.100949,-0.988528,623.546333,-575.800358,184.343761,
+ -0.244971,0.09829,-0.964535,644.636231,-575.409716,180.525125,
+ -0.112343,0.100949,-0.988528,623.546333,-575.800358,184.343761,
+ -0.244971,0.228806,-0.942145,644.636243,-598.733545,176.514546,
+ -0.112343,0.23471,-0.965552,623.546346,-599.640892,180.244333,
+ 0.874212,-0.116112,0.471456,470.677497,-610.308103,224.093716,
+ 0.79876,-0.221723,0.559304,468.840155,-640.279768,217.551861,
+ 0.874212,-0.179273,0.451236,470.677509,-639.24332,214.921287,
+ 0.79876,-0.221723,0.559304,468.840155,-640.279768,217.551861,
+ 0.874212,-0.116112,0.471456,470.677497,-610.308103,224.093716,
+ 0.79876,-0.143441,0.5843,468.840142,-610.976426,226.840986,
+ 0.989572,-0,0.144037,221.73981,-186.86272,2013.443961,
+ 1,-0,0,221.73981,-280.29408,1435.598634,
+ 1,-0,0,221.73981,-186.86272,1435.598634,
+ 1,-0,0,221.73981,-280.29408,1435.598634,
+ 0.989572,-0,0.144037,221.73981,-186.86272,2013.443961,
+ 0.957608,-0,0.288074,221.73981,-280.29408,2013.443961,
+ 0.362412,-0.932018,-0,688.787514,-801.347945,-0,
+ 0.279856,-0.960042,-0,656.93269,-812.161201,23.357838,
+ 0.237659,-0.971349,-0,656.93269,-812.161201,-0,
+ 0.279856,-0.960042,-0,656.93269,-812.161201,23.357838,
+ 0.362412,-0.932018,-0,688.787514,-801.347945,-0,
+ 0.402772,-0.9153,-0,688.787514,-801.347945,23.357838,
+ -0.986659,0,-0.162803,176.725666,-280.29408,1938.382661,
+ -0.999462,0,-0.032813,180.185724,-186.86272,1903.252111,
+ -0.999462,0,0.032813,180.185724,-280.29408,1903.252111,
+ -0.999462,0,-0.032813,180.185724,-186.86272,1903.252111,
+ -0.986659,0,-0.162803,176.725666,-280.29408,1938.382661,
+ -0.973856,0,-0.227168,176.725666,-186.86272,1938.382661,
+ -0.707841,0.151267,-0.689985,718.363091,-588.820775,135.766294,
+ -0.796291,0.062774,-0.601647,732.466044,-569.495502,122.710666,
+ -0.796291,0.144172,-0.587481,732.466052,-584.996349,120.045264,
+ -0.796291,0.062774,-0.601647,732.466044,-569.495502,122.710666,
+ -0.707841,0.151267,-0.689985,718.363091,-588.820775,135.766294,
+ -0.707841,0.055835,-0.704162,718.363082,-571.142012,138.806193,
+ -0.373111,0.655639,-0.656449,665.021391,-675.601701,125.979113,
+ -0.244971,0.585448,-0.772813,644.636264,-662.459295,146.227532,
+ -0.373111,0.560072,-0.739667,665.02139,-658.447133,140.935603,
+ -0.244971,0.585448,-0.772813,644.636264,-662.459295,146.227532,
+ -0.373111,0.655639,-0.656449,665.021391,-675.601701,125.979113,
+ -0.244971,0.685296,-0.685827,644.636265,-680.297547,130.67496,
+ -0.714681,0.677849,-0.172485,718.363091,-685.388881,39.198188,
+ -0.796291,0.563252,-0.220608,732.466058,-664.91507,50.366817,
+ -0.809671,0.570253,-0.138724,732.466052,-669.667851,35.373762,
+ -0.796291,0.563252,-0.220608,732.466058,-664.91507,50.366817,
+ -0.714681,0.677849,-0.172485,718.363091,-685.388881,39.198188,
+ -0.707841,0.651123,-0.273862,718.363098,-679.96832,56.297814,
+ 0.256673,-0.899078,0.354651,649.884111,-746.45866,82.495079,
+ 0.127347,-0.864568,0.486113,624.955342,-738.83011,109.90761,
+ 0.127347,-0.922744,0.363767,624.955334,-751.006818,84.287065,
+ 0.127347,-0.864568,0.486113,624.955342,-738.83011,109.90761,
+ 0.256673,-0.899078,0.354651,649.884111,-746.45866,82.495079,
+ 0.256673,-0.842365,0.473857,649.884119,-734.568562,107.512581,
+ 0.381503,-0.898037,0.219052,673.957358,-746.934061,54.170165,
+ 0.256673,-0.899078,0.354651,649.884111,-746.45866,82.495079,
+ 0.256673,-0.939019,0.228829,649.8841,-754.828812,56.090715,
+ 0.256673,-0.899078,0.354651,649.884111,-746.45866,82.495079,
+ 0.381503,-0.898037,0.219052,673.957358,-746.934061,54.170165,
+ 0.381503,-0.859811,0.339381,673.957369,-738.899253,79.516658,
+ -0.040706,0.871018,-0.489562,429.267772,-737.984764,109.432572,
+ -0.150375,0.919722,-0.362627,432.838941,-749.833439,83.824825,
+ -0.040706,0.929604,-0.366305,429.267763,-750.104609,83.931667,
+ -0.150375,0.919722,-0.362627,432.838941,-749.833439,83.824825,
+ -0.040706,0.871018,-0.489562,429.267772,-737.984764,109.432572,
+ -0.150375,0.86173,-0.484571,432.838949,-737.730682,109.289775,
+ -0.928388,0.346265,-0.134897,753.576407,-630.223631,36.698359,
+ -0.9698,0.213348,-0.118196,760.201826,-607.845772,36.293385,
+ -0.9721,0.218065,-0.086424,760.201824,-611.21315,29.208214,
+ -0.9698,0.213348,-0.118196,760.201826,-607.845772,36.293385,
+ -0.928388,0.346265,-0.134897,753.576407,-630.223631,36.698359,
+ -0.928388,0.324653,-0.180823,753.57641,-625.658276,46.304148,
+ 0.105242,-0.993886,0.033402,624.955304,-764.585289,23.357838,
+ 0.030866,-0.994332,0.101738,599.602117,-765.945157,29.449075,
+ 0.020529,-0.999225,0.033582,599.602113,-766.149871,23.357838,
+ 0.030866,-0.994332,0.101738,599.602117,-765.945157,29.449075,
+ 0.105242,-0.993886,0.033402,624.955304,-764.585289,23.357838,
+ 0.127347,-0.98669,0.101126,624.955308,-764.385936,29.28956,
+ 0.603443,-0.29142,0.742247,464.090775,-642.024843,221.980973,
+ 0.700875,-0.343846,0.624935,466.630436,-669.291161,206.575475,
+ 0.707841,-0.243878,0.662936,466.630427,-641.212918,219.920255,
+ 0.700875,-0.343846,0.624935,466.630436,-669.291161,206.575475,
+ 0.603443,-0.29142,0.742247,464.090775,-642.024843,221.980973,
+ 0.592261,-0.384709,0.707974,464.090784,-670.376318,208.506333,
+ 0.867227,-0.397554,0.299779,767.829336,-647.197908,75.95025,
+ 0.794465,-0.530011,0.296503,753.739286,-674.070091,73.511955,
+ 0.867227,-0.434695,0.24281,767.829333,-655.602109,63.132805,
+ 0.794465,-0.530011,0.296503,753.739286,-674.070091,73.511955,
+ 0.867227,-0.397554,0.299779,767.829336,-647.197908,75.95025,
+ 0.794465,-0.484664,0.36596,753.739289,-664.079301,88.749145,
+ 0.999748,-0.019808,0.010545,473.717772,-740.196479,110.67556,
+ 0.995804,-0.08571,0.032077,473.642065,-755.603683,86.09829,
+ 0.999748,-0.02106,0.007747,473.717764,-752.465075,84.861676,
+ 0.995804,-0.08571,0.032077,473.642065,-755.603683,86.09829,
+ 0.999748,-0.019808,0.010545,473.717772,-740.196479,110.67556,
+ 0.995804,-0.08054,0.043457,473.642074,-743.137303,112.328326,
+ 0.251027,-0.016259,0.967844,455.00605,-549.612103,242.110623,
+ 0.339245,0,0.940698,458.222196,-186.86272,241.116069,
+ 0.20592,0,0.978569,455.00605,-186.86272,242.110623,
+ 0.339245,0,0.940698,458.222196,-186.86272,241.116069,
+ 0.251027,-0.016259,0.967844,455.00605,-549.612103,242.110623,
+ 0.382469,-0.01552,0.923838,458.222196,-549.595395,241.116069,
+ 0.999747,-0.000377,0.02248,473.71772,-549.195746,217.326639,
+ 0.995804,-0.010878,0.090867,473.642039,-579.415029,219.678492,
+ 0.999748,-0.002792,0.022266,473.717738,-579.071732,216.322569,
+ 0.995804,-0.010878,0.090867,473.642039,-579.415029,219.678492,
+ 0.999747,-0.000377,0.02248,473.71772,-549.195746,217.326639,
+ 0.994417,-0.002312,0.105501,473.642021,-549.252285,220.6922,
+ -0.796291,0.144172,-0.587481,732.466052,-584.996349,120.045264,
+ -0.870211,0.051465,-0.489984,744.27504,-567.670824,104.873423,
+ -0.870211,0.117753,-0.4784,744.275047,-580.75808,102.623043,
+ -0.870211,0.051465,-0.489984,744.27504,-567.670824,104.873423,
+ -0.796291,0.144172,-0.587481,732.466052,-584.996349,120.045264,
+ -0.796291,0.062774,-0.601647,732.466044,-569.495502,122.710666,
+ 0.932875,-0.350339,0.083707,472.107183,-770.747999,59.963422,
+ 0.885205,-0.462786,0.04734,470.677482,-778.860284,30.770308,
+ 0.940951,-0.336786,0.034451,472.107168,-775.82127,30.459429,
+ 0.885205,-0.462786,0.04734,470.677482,-778.860284,30.770308,
+ 0.932875,-0.350339,0.083707,472.107183,-770.747999,59.963422,
+ 0.874212,-0.47211,0.113426,470.677497,-773.716304,60.685516,
+ -0.638578,0.17117,-0.75028,445.721721,-605.178251,203.006401,
+ -0.537771,0.08495,-0.8388,442.839452,-578.401496,209.770445,
+ -0.649249,0.076378,-0.756731,445.721707,-578.184383,207.648051,
+ -0.537771,0.08495,-0.8388,442.839452,-578.401496,209.770445,
+ -0.638578,0.17117,-0.75028,445.721721,-605.178251,203.006401,
+ -0.537771,0.198458,-0.8194,442.839466,-605.68255,205.079413,
+ 0.999748,-0.013961,0.017568,473.717777,-684.199453,174.902175,
+ 0.995804,-0.065815,0.063588,473.64208,-708.127668,158.505081,
+ 0.999748,-0.016225,0.015501,473.717779,-705.742288,156.119701,
+ 0.995804,-0.065815,0.063588,473.64208,-708.127668,158.505081,
+ 0.999748,-0.013961,0.017568,473.717777,-684.199453,174.902175,
+ 0.995804,-0.056536,0.071964,473.642079,-686.237536,177.590351,
+ -0.537771,0.198458,-0.8194,442.839466,-605.68255,205.079413,
+ -0.415875,0.091892,-0.904767,439.690582,-578.575874,211.475076,
+ -0.537771,0.08495,-0.8388,442.839452,-578.401496,209.770445,
+ -0.415875,0.091892,-0.904767,439.690582,-578.575874,211.475076,
+ -0.537771,0.198458,-0.8194,442.839466,-605.68255,205.079413,
+ -0.415875,0.214324,-0.883806,439.690597,-606.087584,206.744382,
+ 0.973657,-0.024735,0.226671,473.101722,-579.75396,222.991746,
+ 0.932875,-0.086574,0.349641,472.107183,-609.58601,221.125411,
+ 0.973657,-0.055392,0.221186,473.101737,-608.824017,217.993091,
+ 0.932875,-0.086574,0.349641,472.107183,-609.58601,221.125411,
+ 0.973657,-0.024735,0.226671,473.101722,-579.75396,222.991746,
+ 0.932875,-0.038122,0.358177,472.107168,-580.082016,226.198682,
+ 0.79876,-0.143441,0.5843,468.840142,-610.976426,226.840986,
+ 0.707841,-0.243878,0.662936,466.630427,-641.212918,219.920255,
+ 0.79876,-0.221723,0.559304,468.840155,-640.279768,217.551861,
+ 0.707841,-0.243878,0.662936,466.630427,-641.212918,219.920255,
+ 0.79876,-0.143441,0.5843,468.840142,-610.976426,226.840986,
+ 0.707841,-0.151267,0.689985,466.630415,-611.57814,229.314444,
+ 0.928983,-0.005506,0.370082,472.10715,-549.362134,227.231115,
+ 0.874212,-0.050786,0.482881,470.677482,-580.392895,229.237697,
+ 0.932875,-0.038122,0.358177,472.107168,-580.082016,226.198682,
+ 0.874212,-0.050786,0.482881,470.677482,-580.392895,229.237697,
+ 0.928983,-0.005506,0.370082,472.10715,-549.362134,227.231115,
+ 0.866918,-0.01021,0.498346,470.677463,-549.413334,230.278856,
+ 0.991932,-0.101911,0.075398,792.007218,-589.846284,32.468209,
+ 0.966794,-0.223491,0.12394,787.130189,-614.643058,40.113503,
+ 0.991932,-0.111235,0.060808,792.007217,-592.860317,27.871437,
+ 0.966794,-0.223491,0.12394,787.130189,-614.643058,40.113503,
+ 0.991932,-0.101911,0.075398,792.007218,-589.846284,32.468209,
+ 0.966794,-0.204518,0.153238,787.130191,-609.757662,47.564335,
+ 0.969153,-0.229071,0.090936,787.130187,-618.467587,32.066457,
+ 0.933102,-0.349421,0.085002,779.024159,-644.605714,29.276931,
+ 0.966774,-0.246753,0.066789,787.130183,-621.159902,23.573317,
+ 0.933102,-0.349421,0.085002,779.024159,-644.605714,29.276931,
+ 0.969153,-0.229071,0.090936,787.130187,-618.467587,32.066457,
+ 0.924993,-0.354039,0.138,779.024163,-640.917494,40.911739,
+ 0.960042,-0.279856,-0,838.782877,-630.311015,-0,
+ 0.932018,-0.362412,-0,827.969621,-662.165838,23.357838,
+ 0.9153,-0.402772,-0,827.969621,-662.165838,-0,
+ 0.932018,-0.362412,-0,827.969621,-662.165838,23.357838,
+ 0.960042,-0.279856,-0,838.782877,-630.311015,-0,
+ 0.971349,-0.237659,-0,838.782877,-630.311015,23.357838,
+ -0.729928,0,-0.683524,127.443487,-280.29408,2030.583133,
+ -0.812792,0,-0.582554,149.837908,-186.86272,2003.295453,
+ -0.849252,0,-0.527988,149.837908,-280.29408,2003.295453,
+ -0.812792,0,-0.582554,149.837908,-186.86272,2003.295453,
+ -0.729928,0,-0.683524,127.443487,-280.29408,2030.583133,
+ -0.683524,0,-0.729928,127.443487,-186.86272,2030.583133,
+ 0.946935,-0,0.321426,123.089852,-186.86272,2224.766097,
+ 0.957608,-0,0.288074,221.73981,-280.29408,2013.443961,
+ 0.989572,-0,0.144037,221.73981,-186.86272,2013.443961,
+ 0.957608,-0,0.288074,221.73981,-280.29408,2013.443961,
+ 0.946935,-0,0.321426,123.089852,-186.86272,2224.766097,
+ 0.976682,-0,0.214689,123.089852,-280.29408,2224.766097,
+ 0.932875,-0.314728,0.175187,472.107204,-748.850999,115.539467,
+ 0.874212,-0.45225,0.176701,470.677509,-764.543874,89.620732,
+ 0.932875,-0.335664,0.130666,472.107195,-761.701654,88.500895,
+ 0.874212,-0.45225,0.176701,470.677509,-764.543874,89.620732,
+ 0.932875,-0.314728,0.175187,472.107204,-748.850999,115.539467,
+ 0.874212,-0.423953,0.236679,470.677518,-751.514112,117.036157,
+ -0.985345,0.149457,-0.082208,454.431271,-719.259121,98.908612,
+ -0.999454,0.027255,-0.01868,454.797688,-702.539296,117.908241,
+ -0.999454,0.029547,-0.014792,454.797683,-716.144717,97.158293,
+ -0.999454,0.027255,-0.01868,454.797688,-702.539296,117.908241,
+ -0.985345,0.149457,-0.082208,454.431271,-719.259121,98.908612,
+ -0.985345,0.136861,-0.101808,454.431275,-705.386141,120.066621,
+ 0.361665,-0.219818,0.906024,458.222231,-612.875739,234.648467,
+ 0.487278,-0.319392,0.812741,461.269985,-642.699947,223.694428,
+ 0.487278,-0.205664,0.848683,461.269972,-612.537006,233.256044,
+ 0.487278,-0.319392,0.812741,461.269985,-642.699947,223.694428,
+ 0.361665,-0.219818,0.906024,458.222231,-612.875739,234.648467,
+ 0.361665,-0.341228,0.867619,458.222244,-643.22526,225.027705,
+ -0.9698,0.09079,-0.226373,760.201824,-578.830801,61.590563,
+ -0.993727,0.027914,-0.108296,764.031421,-566.356087,43.420852,
+ -0.993727,0.042411,-0.103482,764.031423,-571.081703,41.922837,
+ -0.993727,0.027914,-0.108296,764.031421,-566.356087,43.420852,
+ -0.9698,0.09079,-0.226373,760.201824,-578.830801,61.590563,
+ -0.9698,0.059096,-0.236633,760.201821,-571.352859,63.961061,
+ -0.040706,0.929604,-0.366305,429.267763,-750.104609,83.931667,
+ -0.150374,0.960557,-0.233917,432.83893,-758.353294,56.948209,
+ -0.040706,0.970848,-0.236215,429.267752,-758.636494,57.017104,
+ -0.150374,0.960557,-0.233917,432.83893,-758.353294,56.948209,
+ -0.040706,0.929604,-0.366305,429.267763,-750.104609,83.931667,
+ -0.150375,0.919722,-0.362627,432.838941,-749.833439,83.824825,
+ -0.985345,0.063975,-0.158123,454.431263,-625.680129,180.496989,
+ -0.999454,0.009337,-0.031696,454.797666,-600.717836,184.671001,
+ -0.999454,0.013569,-0.030128,454.797676,-624.370524,177.173126,
+ -0.999454,0.009337,-0.031696,454.797666,-600.717836,184.671001,
+ -0.985345,0.063975,-0.158123,454.431263,-625.680129,180.496989,
+ -0.985345,0.041831,-0.165366,454.431253,-601.562294,188.142314,
+ 0.874212,-0.45225,0.176701,470.677509,-764.543874,89.620732,
+ 0.79876,-0.584897,0.140986,468.840142,-776.463573,61.353839,
+ 0.874212,-0.47211,0.113426,470.677497,-773.716304,60.685516,
+ 0.79876,-0.584897,0.140986,468.840142,-776.463573,61.353839,
+ 0.874212,-0.45225,0.176701,470.677509,-764.543874,89.620732,
+ 0.79876,-0.56023,0.219373,468.840155,-767.174448,90.657181,
+ -0.494423,0.808436,-0.31934,684.332887,-704.132939,65.818702,
+ -0.599001,0.779767,-0.182103,702.221343,-699.124264,42.539571,
+ -0.494423,0.84441,-0.206198,684.332878,-710.625471,45.337452,
+ -0.599001,0.779767,-0.182103,702.221343,-699.124264,42.539571,
+ -0.494423,0.808436,-0.31934,684.332887,-704.132939,65.818702,
+ -0.606705,0.739249,-0.292265,702.221351,-693.120267,61.479696,
+ 0.506559,-0.014482,0.862083,461.269937,-549.571376,239.686382,
+ 0.583909,-0,0.811819,464.090728,-186.86272,237.849027,
+ 0.466054,-0,0.884757,461.269937,-186.86272,239.686382,
+ 0.583909,-0,0.811819,464.090728,-186.86272,237.849027,
+ 0.506559,-0.014482,0.862083,461.269937,-549.571376,239.686382,
+ 0.620913,-0.013167,0.783769,464.090728,-549.540509,237.849027,
+ 0.030867,-0.971194,0.236282,599.602131,-761.101673,57.616723,
+ 0,-0.938509,0.345255,473.717764,-752.465075,84.861676,
+ 0,-0.976801,0.214147,473.717752,-761.101674,57.616782,
+ 0,-0.938509,0.345255,473.717764,-752.465075,84.861676,
+ 0.030867,-0.971194,0.236282,599.602131,-761.101673,57.616723,
+ 0.030867,-0.929938,0.366419,599.602143,-752.465071,84.861627,
+ -0.936465,0.339085,-0.089746,753.576403,-633.437458,26.560066,
+ -0.96393,0.253712,-0.080426,760.201822,-613.067712,23.357838,
+ -0.951243,0.299703,-0.072908,757.969157,-620.274076,23.357838,
+ -0.96393,0.253712,-0.080426,760.201822,-613.067712,23.357838,
+ -0.936465,0.339085,-0.089746,753.576403,-633.437458,26.560066,
+ -0.9721,0.218065,-0.086424,760.201824,-611.21315,29.208214,
+ -0.9721,0.218065,-0.086424,760.201824,-611.21315,29.208214,
+ -0.936465,0.339085,-0.089746,753.576403,-633.437458,26.560066,
+ -0.928388,0.346265,-0.134897,753.576407,-630.223631,36.698359,
+ 0.00966,-0.995709,0.092029,448.317739,-791.272422,32.040027,
+ 0,-0.976801,0.214147,0.000035,-785.83965,63.634954,
+ 0,-0.994809,0.101765,0.000019,-791.272419,32.040275,
+ 0,-0.976801,0.214147,0.000035,-785.83965,63.634954,
+ 0.00966,-0.995709,0.092029,448.317739,-791.272422,32.040027,
+ 0.01127,-0.9716,0.236362,448.317755,-785.839647,63.634744,
+ -0.952384,0.073533,-0.295901,453.575549,-602.386639,191.530944,
+ -0.985345,0.018907,-0.169523,454.43124,-576.627626,192.429881,
+ -0.985345,0.041831,-0.165366,454.431253,-601.562294,188.142314,
+ -0.985345,0.018907,-0.169523,454.43124,-576.627626,192.429881,
+ -0.952384,0.073533,-0.295901,453.575549,-602.386639,191.530944,
+ -0.952384,0.032525,-0.303161,453.575536,-576.982526,195.899232,
+ 0.98147,-0.179832,0.066156,791.767078,-596.364536,23.357838,
+ 0.966774,-0.246753,0.066789,787.130183,-621.159902,23.573317,
+ 0.981395,-0.183023,0.058018,787.308111,-620.274132,23.357838,
+ 0.966774,-0.246753,0.066789,787.130183,-621.159902,23.573317,
+ 0.98147,-0.179832,0.066156,791.767078,-596.364536,23.357838,
+ 0.969153,-0.229071,0.090936,787.130187,-618.467587,32.066457,
+ 0.924993,-0.303632,0.228462,779.024169,-628.985711,62.142384,
+ 0.867227,-0.434695,0.24281,767.829333,-655.602109,63.132805,
+ 0.924993,-0.331932,0.184956,779.024167,-635.678246,51.93544,
+ 0.867227,-0.434695,0.24281,767.829333,-655.602109,63.132805,
+ 0.924993,-0.303632,0.228462,779.024169,-628.985711,62.142384,
+ 0.867227,-0.397554,0.299779,767.829336,-647.197908,75.95025,
+ 0.707841,-0.651123,0.273862,466.630427,-769.542842,91.59033,
+ 0.611311,-0.685845,0.394863,464.090784,-758.12892,120.753731,
+ 0.603443,-0.741548,0.293196,464.090775,-771.60356,92.402256,
+ 0.611311,-0.685845,0.394863,464.090784,-758.12892,120.753731,
+ 0.707841,-0.651123,0.273862,466.630427,-769.542842,91.59033,
+ 0.717647,-0.602641,0.349008,466.630436,-756.198062,119.668573,
+ -0.952384,0.266534,-0.148066,453.575567,-722.299342,100.61724,
+ -0.985345,0.136861,-0.101808,454.431275,-705.386141,120.066621,
+ -0.985345,0.149457,-0.082208,454.431271,-719.259121,98.908612,
+ -0.985345,0.136861,-0.101808,454.431275,-705.386141,120.066621,
+ -0.952384,0.266534,-0.148066,453.575567,-722.299342,100.61724,
+ -0.952384,0.243872,-0.183005,453.575571,-708.165176,122.173591,
+ 0,-0.016797,0.999859,0,-549.622587,242.726639,
+ -0,-0,1,93.530885,-280.29408,242.726639,
+ 0,0,1,0.000488,-280.29408,242.726639,
+ -0,-0,1,93.530885,-280.29408,242.726639,
+ 0,-0.016797,0.999859,0,-549.622587,242.726639,
+ 0.012852,-0.014396,0.999814,448.31772,-549.622454,242.726639,
+ -0,-0,1,93.530885,-280.29408,242.726639,
+ 0.007496,-0,0.999972,448.31772,-186.86272,242.726639,
+ -0,-0,1,93.530885,-186.86272,242.726639,
+ 0.007496,-0,0.999972,448.31772,-186.86272,242.726639,
+ -0,-0,1,93.530885,-280.29408,242.726639,
+ 0.012852,-0.014396,0.999814,448.31772,-549.622454,242.726639,
+ 0.277314,-0.016138,0.960644,649.884069,-549.087494,210.885907,
+ 0.360344,0,0.932819,673.957328,-186.86272,202.77988,
+ 0.234823,0,0.972038,649.884069,-186.86272,210.885907,
+ 0.360344,0,0.932819,673.957328,-186.86272,202.77988,
+ 0.277314,-0.016138,0.960644,649.884069,-549.087494,210.885907,
+ 0.401003,-0.015387,0.915947,673.957328,-548.951312,202.77988,
+ 0.499663,-0.754768,0.425045,696.7588,-717.703482,98.034266,
+ 0.381503,-0.736251,0.558918,673.957381,-712.905798,125.767735,
+ 0.381503,-0.805545,0.453379,673.957376,-727.485522,103.531853,
+ 0.381503,-0.736251,0.558918,673.957381,-712.905798,125.767735,
+ 0.499663,-0.754768,0.425045,696.7588,-717.703482,98.034266,
+ 0.499663,-0.689808,0.523929,696.758805,-703.964135,118.988469,
+ -0,0.938509,-0.345255,0.01629,-750.104623,83.931833,
+ -0.040706,0.970848,-0.236215,429.267752,-758.636494,57.017104,
+ -0,0.976801,-0.214147,0.016279,-758.636496,57.017305,
+ -0.040706,0.970848,-0.236215,429.267752,-758.636494,57.017104,
+ -0,0.938509,-0.345255,0.01629,-750.104623,83.931833,
+ -0.040706,0.929604,-0.366305,429.267763,-750.104609,83.931667,
+ -0.999454,0.031287,-0.010628,454.797676,-726.795714,74.747937,
+ -0.999345,-0.03194,0.017004,454.667766,-713.015957,95.399907,
+ -0.999345,-0.033959,0.012493,454.667758,-723.45653,73.432296,
+ -0.999345,-0.03194,0.017004,454.667766,-713.015957,95.399907,
+ -0.999454,0.031287,-0.010628,454.797676,-726.795714,74.747937,
+ -0.999454,0.029547,-0.014792,454.797683,-716.144717,97.158293,
+ 0.256673,-0.228081,0.939201,649.8841,-605.713302,205.206225,
+ 0.381503,-0.338316,0.860231,673.957369,-629.139245,189.276665,
+ 0.381503,-0.21794,0.898308,673.957358,-603.792753,197.311473,
+ 0.381503,-0.338316,0.860231,673.957369,-629.139245,189.276665,
+ 0.256673,-0.228081,0.939201,649.8841,-605.713302,205.206225,
+ 0.256673,-0.353935,0.899361,649.884111,-632.117666,196.836073,
+ -0.373111,0.862993,-0.340635,665.021379,-712.807071,69.236324,
+ -0.494423,0.84441,-0.206198,684.332878,-710.625471,45.337452,
+ -0.373111,0.90136,-0.219861,665.02137,-719.684398,47.541206,
+ -0.494423,0.84441,-0.206198,684.332878,-710.625471,45.337452,
+ -0.373111,0.862993,-0.340635,665.021379,-712.807071,69.236324,
+ -0.494423,0.808436,-0.31934,684.332887,-704.132939,65.818702,
+ -0.716622,0.0095,-0.697397,718.363068,-547.889718,139.587655,
+ -0.7818,0,-0.623529,732.466031,-186.86272,123.445905,
+ -0.795651,0.010475,-0.605664,732.466031,-547.618545,123.445905,
+ -0.7818,0,-0.623529,732.466031,-186.86272,123.445905,
+ -0.716622,0.0095,-0.697397,718.363068,-547.889718,139.587655,
+ -0.691044,0,-0.722813,718.363068,-186.86272,139.587655,
+ -0.373111,0.808526,-0.455054,665.021386,-703.037584,89.791929,
+ -0.494423,0.808436,-0.31934,684.332887,-704.132939,65.818702,
+ -0.373111,0.862993,-0.340635,665.021379,-712.807071,69.236324,
+ -0.494423,0.808436,-0.31934,684.332887,-704.132939,65.818702,
+ -0.373111,0.808526,-0.455054,665.021386,-703.037584,89.791929,
+ -0.494423,0.75738,-0.426523,684.332893,-694.910066,85.224197,
+ 0.966794,-0.204518,0.153238,787.130191,-609.757662,47.564335,
+ 0.924993,-0.331932,0.184956,779.024167,-635.678246,51.93544,
+ 0.966794,-0.223491,0.12394,787.130189,-614.643058,40.113503,
+ 0.924993,-0.331932,0.184956,779.024167,-635.678246,51.93544,
+ 0.966794,-0.204518,0.153238,787.130191,-609.757662,47.564335,
+ 0.924993,-0.303632,0.228462,779.024169,-628.985711,62.142384,
+ 0.794465,-0.14471,0.589818,753.739273,-589.30933,137.774661,
+ 0.707841,-0.243878,0.662936,736.997686,-613.697356,150.084182,
+ 0.794465,-0.223732,0.564597,753.73928,-606.678073,132.26879,
+ 0.707841,-0.243878,0.662936,736.997686,-613.697356,150.084182,
+ 0.794465,-0.14471,0.589818,753.739273,-589.30933,137.774661,
+ 0.707841,-0.151267,0.689985,736.997677,-593.835505,156.380365,
+ 0.487278,-0.088099,0.868791,461.269956,-581.352493,238.618284,
+ 0.603443,-0.187559,0.775035,464.090763,-612.101686,231.466578,
+ 0.603443,-0.080198,0.793363,464.090747,-581.165077,236.78619,
+ 0.603443,-0.187559,0.775035,464.090763,-612.101686,231.466578,
+ 0.487278,-0.088099,0.868791,461.269956,-581.352493,238.618284,
+ 0.487278,-0.205664,0.848683,461.269972,-612.537006,233.256044,
+ -0.606705,0.739249,-0.292265,702.221351,-693.120267,61.479696,
+ -0.714681,0.677849,-0.172485,718.363091,-685.388881,39.198188,
+ -0.599001,0.779767,-0.182103,702.221343,-699.124264,42.539571,
+ -0.714681,0.677849,-0.172485,718.363091,-685.388881,39.198188,
+ -0.606705,0.739249,-0.292265,702.221351,-693.120267,61.479696,
+ -0.707841,0.651123,-0.273862,718.363098,-679.96832,56.297814,
+ -0.150375,0.919722,-0.362627,432.838941,-749.833439,83.824825,
+ -0.285905,0.930996,-0.226946,436.335601,-757.591911,56.762987,
+ -0.150374,0.960557,-0.233917,432.83893,-758.353294,56.948209,
+ -0.285905,0.930996,-0.226946,436.335601,-757.591911,56.762987,
+ -0.150375,0.919722,-0.362627,432.838941,-749.833439,83.824825,
+ -0.285905,0.891387,-0.351693,436.335613,-749.104397,83.53758,
+ 0.01127,-0.9716,0.236362,448.317755,-785.839647,63.634744,
+ 0,-0.938509,0.345255,0.000048,-776.152271,94.194624,
+ 0,-0.976801,0.214147,0.000035,-785.83965,63.634954,
+ 0,-0.938509,0.345255,0.000048,-776.152271,94.194624,
+ 0.01127,-0.9716,0.236362,448.317755,-785.839647,63.634744,
+ 0.011271,-0.930329,0.366553,448.317768,-776.152256,94.194451,
+ -0.901181,0.378553,-0.211115,452.247009,-725.206979,102.251354,
+ -0.952384,0.243872,-0.183005,453.575571,-708.165176,122.173591,
+ -0.952384,0.266534,-0.148066,453.575567,-722.299342,100.61724,
+ -0.952384,0.243872,-0.183005,453.575571,-708.165176,122.173591,
+ -0.901181,0.378553,-0.211115,452.247009,-725.206979,102.251354,
+ -0.901181,0.346254,-0.26073,452.247014,-710.823017,124.188674,
+ -0.9698,0.213348,-0.118196,760.201826,-607.845772,36.293385,
+ -0.993727,0.090031,-0.066344,764.031425,-586.699189,30.082194,
+ -0.993727,0.098232,-0.053457,764.031424,-589.417442,25.936523,
+ -0.993727,0.090031,-0.066344,764.031425,-586.699189,30.082194,
+ -0.9698,0.213348,-0.118196,760.201826,-607.845772,36.293385,
+ -0.9698,0.195252,-0.146165,760.201828,-603.544336,42.853607,
+ -0.537771,0.671316,-0.510036,442.83949,-719.276356,130.597708,
+ -0.649152,0.654437,-0.387703,445.72174,-732.59493,106.40344,
+ -0.537771,0.734555,-0.413801,442.839485,-734.454802,107.448703,
+ -0.649152,0.654437,-0.387703,445.72174,-732.59493,106.40344,
+ -0.537771,0.671316,-0.510036,442.83949,-719.276356,130.597708,
+ -0.649152,0.595502,-0.473264,445.721745,-717.576266,129.308758,
+ -0.707841,0.055835,-0.704162,718.363082,-571.142012,138.806193,
+ -0.613495,0.011257,-0.789618,702.221319,-548.126642,153.690618,
+ -0.716622,0.0095,-0.697397,718.363068,-547.889718,139.587655,
+ -0.613495,0.011257,-0.789618,702.221319,-548.126642,153.690618,
+ -0.707841,0.055835,-0.704162,718.363082,-571.142012,138.806193,
+ -0.606705,0.079969,-0.790894,702.221333,-572.580561,152.868772,
+ -0.285905,0.76333,-0.579298,436.335626,-721.646389,132.394587,
+ -0.415875,0.792474,-0.446131,439.690616,-735.948584,108.28822,
+ -0.285905,0.835148,-0.469878,436.335621,-737.047581,108.905866,
+ -0.415875,0.792474,-0.446131,439.690616,-735.948584,108.28822,
+ -0.285905,0.76333,-0.579298,436.335626,-721.646389,132.394587,
+ -0.415875,0.72429,-0.549957,439.690621,-720.641807,131.632947,
+ -0.691044,0,-0.722813,718.363068,-186.86272,139.587655,
+ -0.613495,0.011257,-0.789618,702.221319,-548.126642,153.690618,
+ -0.605809,0,-0.79561,702.221319,-186.86272,153.690618,
+ -0.613495,0.011257,-0.789618,702.221319,-548.126642,153.690618,
+ -0.691044,0,-0.722813,718.363068,-186.86272,139.587655,
+ -0.716622,0.0095,-0.697397,718.363068,-547.889718,139.587655,
+ 0.999748,-0.02106,0.007747,473.717764,-752.465075,84.861676,
+ 0.995804,-0.089282,0.020098,473.642053,-764.379515,58.414175,
+ 0.999748,-0.021919,0.004805,473.717752,-761.101674,57.616782,
+ 0.995804,-0.089282,0.020098,473.642053,-764.379515,58.414175,
+ 0.999748,-0.02106,0.007747,473.717764,-752.465075,84.861676,
+ 0.995804,-0.08571,0.032077,473.642065,-755.603683,86.09829,
+ -0.438529,0.898717,-0,629.962605,-661.494594,5.83946,
+ -0.374833,0.927092,-0,617.239549,-667.162466,-0,
+ -0.342242,0.939612,-0,617.239549,-667.162466,5.83946,
+ -0.374833,0.927092,-0,617.239549,-667.162466,-0,
+ -0.438529,0.898717,-0,629.962605,-661.494594,5.83946,
+ -0.469634,0.882861,-0,629.962605,-661.494594,-0,
+ -0.022557,0.236303,-0.971418,602.13328,-599.869416,181.183686,
+ -0,0.124431,-0.992228,454.667737,-575.898832,185.305489,
+ -0.022557,0.101727,-0.994557,602.133267,-575.89875,185.30549,
+ -0,0.124431,-0.992228,454.667737,-575.898832,185.305489,
+ -0.022557,0.236303,-0.971418,602.13328,-599.869416,181.183686,
+ -0,0.258478,-0.966017,454.667749,-599.869485,181.183687,
+ -0.881047,0.459625,-0.111811,744.275047,-652.24563,31.135492,
+ -0.928388,0.346265,-0.134897,753.576407,-630.223631,36.698359,
+ -0.936465,0.339085,-0.089746,753.576403,-633.437458,26.560066,
+ -0.928388,0.346265,-0.134897,753.576407,-630.223631,36.698359,
+ -0.881047,0.459625,-0.111811,744.275047,-652.24563,31.135492,
+ -0.870211,0.458871,-0.17936,744.275052,-648.232891,43.794023,
+ 0.79876,-0.062483,0.598396,468.840127,-580.680624,232.05041,
+ 0.707841,-0.151267,0.689985,466.630415,-611.57814,229.314444,
+ 0.79876,-0.143441,0.5843,468.840142,-610.976426,226.840986,
+ 0.707841,-0.151267,0.689985,466.630415,-611.57814,229.314444,
+ 0.79876,-0.062483,0.598396,468.840127,-580.680624,232.05041,
+ 0.707841,-0.055835,0.704162,466.630399,-580.939677,234.58279,
+ -0.748179,0.617743,-0.242119,448.282005,-742.014746,80.744249,
+ -0.832687,0.483376,-0.27015,450.47112,-727.926176,103.779563,
+ -0.832687,0.515679,-0.201762,450.471112,-739.369533,79.702032,
+ -0.832687,0.483376,-0.27015,450.47112,-727.926176,103.779563,
+ -0.748179,0.617743,-0.242119,448.282005,-742.014746,80.744249,
+ -0.748179,0.578988,-0.324038,448.282012,-730.404697,105.172511,
+ 0.603443,-0.080198,0.793363,464.090747,-581.165077,236.78619,
+ 0.707841,-0.151267,0.689985,466.630415,-611.57814,229.314444,
+ 0.707841,-0.055835,0.704162,466.630399,-580.939677,234.58279,
+ 0.707841,-0.151267,0.689985,466.630415,-611.57814,229.314444,
+ 0.603443,-0.080198,0.793363,464.090747,-581.165077,236.78619,
+ 0.603443,-0.187559,0.775035,464.090763,-612.101686,231.466578,
+ 0.361665,-0.094307,0.927526,458.222215,-581.498327,240.043877,
+ 0.487278,-0.205664,0.848683,461.269972,-612.537006,233.256044,
+ 0.487278,-0.088099,0.868791,461.269956,-581.352493,238.618284,
+ 0.487278,-0.205664,0.848683,461.269972,-612.537006,233.256044,
+ 0.361665,-0.094307,0.927526,458.222215,-581.498327,240.043877,
+ 0.361665,-0.219818,0.906024,458.222231,-612.875739,234.648467,
+ -0.683524,0,-0.729928,127.443487,-186.86272,2030.583133,
+ -0.582554,0,-0.812792,100.155807,-280.29408,2052.977553,
+ -0.527988,0,-0.849252,100.155807,-186.86272,2052.977553,
+ -0.582554,0,-0.812792,100.155807,-280.29408,2052.977553,
+ -0.683524,0,-0.729928,127.443487,-186.86272,2030.583133,
+ -0.729928,0,-0.683524,127.443487,-280.29408,2030.583133,
+ -0.227168,0,0.973856,35.238106,-280.29408,1394.271064,
+ -0.352162,0,0.935939,69.013887,-186.86272,1404.516835,
+ -0.162803,0,0.986659,35.238106,-186.86272,1394.271064,
+ -0.352162,0,0.935939,69.013887,-186.86272,1404.516835,
+ -0.227168,0,0.973856,35.238106,-280.29408,1394.271064,
+ -0.412792,0,0.910825,69.013887,-280.29408,1404.516835,
+ -0.415875,0.792474,-0.446131,439.690616,-735.948584,108.28822,
+ -0.537771,0.78409,-0.309846,442.839477,-746.337241,82.447316,
+ -0.415875,0.845875,-0.333982,439.690608,-747.931487,83.075452,
+ -0.537771,0.78409,-0.309846,442.839477,-746.337241,82.447316,
+ -0.415875,0.792474,-0.446131,439.690616,-735.948584,108.28822,
+ -0.537771,0.734555,-0.413801,442.839485,-734.454802,107.448703,
+ 0.041063,-0.016783,0.999016,599.602099,-549.195708,217.326639,
+ 0.127347,-0.100746,0.986728,624.955308,-578.912147,214.763349,
+ 0.148826,-0.01661,0.988724,624.95529,-549.169432,215.762941,
+ 0.127347,-0.100746,0.986728,624.955308,-578.912147,214.763349,
+ 0.041063,-0.016783,0.999016,599.602099,-549.195708,217.326639,
+ 0.030866,-0.101695,0.994337,599.602117,-579.071663,216.32257,
+ 0,-0.258478,0.966017,0.000035,-613.257542,236.217062,
+ 0.011271,-0.366548,0.930331,448.317768,-643.817038,226.529669,
+ 0.01127,-0.236356,0.971601,448.317755,-613.257332,236.21706,
+ 0.011271,-0.366548,0.930331,448.317768,-643.817038,226.529669,
+ 0,-0.258478,0.966017,0.000035,-613.257542,236.217062,
+ 0,-0.387702,0.921785,0.000048,-643.817211,226.529683,
+ 0,-0.124431,0.992228,473.717738,-579.071732,216.322569,
+ 0.030867,-0.23624,0.971204,599.602131,-607.23931,211.479086,
+ 0.030866,-0.101695,0.994337,599.602117,-579.071663,216.32257,
+ 0.030867,-0.23624,0.971204,599.602131,-607.23931,211.479086,
+ 0,-0.124431,0.992228,473.717738,-579.071732,216.322569,
+ 0,-0.258478,0.966017,473.717752,-607.239369,211.479086,
+ 0.924993,-0.354039,0.138,779.024163,-640.917494,40.911739,
+ 0.87794,-0.465203,0.113169,767.829322,-666.812843,34.679214,
+ 0.933102,-0.349421,0.085002,779.024159,-644.605714,29.276931,
+ 0.87794,-0.465203,0.113169,767.829322,-666.812843,34.679214,
+ 0.924993,-0.354039,0.138,779.024163,-640.917494,40.911739,
+ 0.867227,-0.463727,0.18131,767.829328,-662.181333,49.28971,
+ 0.999748,-0.002792,0.022266,473.717738,-579.071732,216.322569,
+ 0.995804,-0.023158,0.088537,473.642053,-608.036762,214.756927,
+ 0.999748,-0.0058,0.021677,473.717752,-607.239369,211.479086,
+ 0.995804,-0.023158,0.088537,473.642053,-608.036762,214.756927,
+ 0.999748,-0.002792,0.022266,473.717738,-579.071732,216.322569,
+ 0.995804,-0.010878,0.090867,473.642039,-579.415029,219.678492,
+ -0.373111,0.655639,-0.656449,665.021391,-675.601701,125.979113,
+ -0.494423,0.692194,-0.52575,684.332897,-683.128909,103.191916,
+ -0.373111,0.738976,-0.560984,665.02139,-690.558191,108.824546,
+ -0.494423,0.692194,-0.52575,684.332897,-683.128909,103.191916,
+ -0.373111,0.655639,-0.656449,665.021391,-675.601701,125.979113,
+ -0.494423,0.614096,-0.615169,684.332898,-669.009253,119.386665,
+ -0.9698,0.0263,-0.242479,760.201817,-563.621651,65.290458,
+ -0.9937,0.002257,-0.112046,764.031409,-546.296855,44.770904,
+ -0.993727,0.012896,-0.111089,764.031418,-561.470422,44.260952,
+ -0.9937,0.002257,-0.112046,764.031409,-546.296855,44.770904,
+ -0.9698,0.0263,-0.242479,760.201817,-563.621651,65.290458,
+ -0.969674,0.004471,-0.24436,760.201807,-546.651151,65.860802,
+ 0.229024,-0.098699,0.968404,455.006069,-581.599776,241.035583,
+ 0.361665,-0.219818,0.906024,458.222231,-612.875739,234.648467,
+ 0.361665,-0.094307,0.927526,458.222215,-581.498327,240.043877,
+ 0.361665,-0.219818,0.906024,458.222231,-612.875739,234.648467,
+ 0.229024,-0.098699,0.968404,455.006069,-581.599776,241.035583,
+ 0.229025,-0.229739,0.945922,455.006085,-613.111378,235.617099,
+ -0.985345,0.041831,-0.165366,454.431253,-601.562294,188.142314,
+ -0.999454,0.00493,-0.032673,454.797654,-576.264066,188.875876,
+ -0.999454,0.009337,-0.031696,454.797666,-600.717836,184.671001,
+ -0.999454,0.00493,-0.032673,454.797654,-576.264066,188.875876,
+ -0.985345,0.041831,-0.165366,454.431253,-601.562294,188.142314,
+ -0.985345,0.018907,-0.169523,454.43124,-576.627626,192.429881,
+ -0.9698,0.059096,-0.236633,760.201821,-571.352859,63.961061,
+ -0.993727,0.012896,-0.111089,764.031418,-561.470422,44.260952,
+ -0.993727,0.027914,-0.108296,764.031421,-566.356087,43.420852,
+ -0.993727,0.012896,-0.111089,764.031418,-561.470422,44.260952,
+ -0.9698,0.059096,-0.236633,760.201821,-571.352859,63.961061,
+ -0.9698,0.0263,-0.242479,760.201817,-563.621651,65.290458,
+ 0.973657,-0.055392,0.221186,473.101737,-608.824017,217.993091,
+ 0.932875,-0.133411,0.334583,472.107195,-638.123482,212.079066,
+ 0.973657,-0.085015,0.211575,473.101749,-636.941768,209.079797,
+ 0.932875,-0.133411,0.334583,472.107195,-638.123482,212.079066,
+ 0.973657,-0.055392,0.221186,473.101737,-608.824017,217.993091,
+ 0.932875,-0.086574,0.349641,472.107183,-609.58601,221.125411,
+ 0.999748,-0.0087,0.020685,473.717764,-634.484263,202.842487,
+ 0.995804,-0.046203,0.078997,473.642074,-661.950913,193.514715,
+ 0.999748,-0.011437,0.019306,473.717772,-660.298148,190.573891,
+ 0.995804,-0.046203,0.078997,473.642074,-661.950913,193.514715,
+ 0.999748,-0.0087,0.020685,473.717764,-634.484263,202.842487,
+ 0.995804,-0.035007,0.084556,473.642065,-635.720877,205.981096,
+ -0.244971,0.845012,-0.475335,644.636259,-708.826871,93.045557,
+ -0.373111,0.862993,-0.340635,665.021379,-712.807071,69.236324,
+ -0.244971,0.901902,-0.355754,644.636252,-718.985715,71.670721,
+ -0.373111,0.862993,-0.340635,665.021379,-712.807071,69.236324,
+ -0.244971,0.845012,-0.475335,644.636259,-708.826871,93.045557,
+ -0.373111,0.808526,-0.455054,665.021386,-703.037584,89.791929,
+ -0.9721,0.218065,-0.086424,760.201824,-611.21315,29.208214,
+ -0.99093,0.121368,-0.057682,764.031423,-590.643016,23.357838,
+ -0.983984,0.16585,-0.065345,763.093075,-596.364509,23.357838,
+ -0.99093,0.121368,-0.057682,764.031423,-590.643016,23.357838,
+ -0.9721,0.218065,-0.086424,760.201824,-611.21315,29.208214,
+ -0.993727,0.098232,-0.053457,764.031424,-589.417442,25.936523,
+ -0.993727,0.098232,-0.053457,764.031424,-589.417442,25.936523,
+ -0.9721,0.218065,-0.086424,760.201824,-611.21315,29.208214,
+ -0.9698,0.213348,-0.118196,760.201826,-607.845772,36.293385,
+ -0.748179,0.529432,-0.399912,448.282017,-715.574197,127.790857,
+ -0.832687,0.392486,-0.390624,450.471126,-695.789522,146.166935,
+ -0.832687,0.442054,-0.333498,450.471124,-713.308606,126.073164,
+ -0.832687,0.392486,-0.390624,450.471126,-695.789522,146.166935,
+ -0.748179,0.529432,-0.399912,448.282017,-715.574197,127.790857,
+ -0.748179,0.469999,-0.468325,448.282019,-697.799917,148.177329,
+ 0.499663,-0.805647,0.318231,696.758793,-728.459324,75.40331,
+ 0.381503,-0.805545,0.453379,673.957376,-727.485522,103.531853,
+ 0.381503,-0.859811,0.339381,673.957369,-738.899253,79.516658,
+ 0.381503,-0.805545,0.453379,673.957376,-727.485522,103.531853,
+ 0.499663,-0.805647,0.318231,696.758793,-728.459324,75.40331,
+ 0.499663,-0.754768,0.425045,696.7588,-717.703482,98.034266,
+ 0.256673,-0.842365,0.473857,649.884119,-734.568562,107.512581,
+ 0.127347,-0.790262,0.59939,624.955347,-723.275771,133.6299,
+ 0.127347,-0.864568,0.486113,624.955342,-738.83011,109.90761,
+ 0.127347,-0.790262,0.59939,624.955347,-723.275771,133.6299,
+ 0.256673,-0.842365,0.473857,649.884119,-734.568562,107.512581,
+ 0.256673,-0.769937,0.584223,649.884124,-719.380332,130.676509,
+ 0.932875,-0.335664,0.130666,472.107195,-761.701654,88.500895,
+ 0.874212,-0.47211,0.113426,470.677497,-773.716304,60.685516,
+ 0.932875,-0.350339,0.083707,472.107183,-770.747999,59.963422,
+ 0.874212,-0.47211,0.113426,470.677497,-773.716304,60.685516,
+ 0.932875,-0.335664,0.130666,472.107195,-761.701654,88.500895,
+ 0.874212,-0.45225,0.176701,470.677509,-764.543874,89.620732,
+ -0.040706,0.970848,-0.236215,429.267752,-758.636494,57.017104,
+ -0.150374,0.983472,-0.100844,432.838915,-763.131306,29.161323,
+ -0.040706,0.99398,-0.101718,429.267738,-763.421251,29.190985,
+ -0.150374,0.983472,-0.100844,432.838915,-763.131306,29.161323,
+ -0.040706,0.970848,-0.236215,429.267752,-758.636494,57.017104,
+ -0.150374,0.960557,-0.233917,432.83893,-758.353294,56.948209,
+ -0.040706,0.706494,-0.706547,429.267778,-703.948313,154.325725,
+ -0.150375,0.787661,-0.597476,432.838954,-722.270805,132.867998,
+ -0.040706,0.796183,-0.603686,429.267777,-722.503059,133.044086,
+ -0.150375,0.787661,-0.597476,432.838954,-722.270805,132.867998,
+ -0.040706,0.706494,-0.706547,429.267778,-703.948313,154.325725,
+ -0.150375,0.698898,-0.699234,432.838956,-703.74222,154.119632,
+ -0.656747,0.730839,-0.185896,445.721721,-752.628988,55.555664,
+ -0.754707,0.651908,-0.073718,448.28198,-754.771252,28.306118,
+ -0.649249,0.756522,-0.078421,445.721707,-757.270639,28.561795,
+ -0.754707,0.651908,-0.073718,448.28198,-754.771252,28.306118,
+ -0.656747,0.730839,-0.185896,445.721721,-752.628988,55.555664,
+ -0.757296,0.632534,-0.162491,448.281994,-750.187755,54.961789,
+ 0.361665,-0.742579,0.563715,458.222259,-743.526109,148.983038,
+ 0.229025,-0.688056,0.688568,455.006115,-723.308225,173.685638,
+ 0.229025,-0.775467,0.588387,455.006113,-744.32049,149.585311,
+ 0.229025,-0.688056,0.688568,455.006115,-723.308225,173.685638,
+ 0.361665,-0.742579,0.563715,458.222259,-743.526109,148.983038,
+ 0.361665,-0.658837,0.659646,458.22226,-722.603323,172.980735,
+ -0.748179,0.469999,-0.468325,448.282019,-697.799917,148.177329,
+ -0.832687,0.335596,-0.440463,450.471124,-675.695751,163.686019,
+ -0.832687,0.392486,-0.390624,450.471126,-695.789522,146.166935,
+ -0.832687,0.335596,-0.440463,450.471124,-675.695751,163.686019,
+ -0.748179,0.469999,-0.468325,448.282019,-697.799917,148.177329,
+ -0.748179,0.401798,-0.528002,448.282017,-677.413444,165.951609,
+ 0.932875,-0.255741,0.253655,472.107211,-712.762199,163.139612,
+ 0.874212,-0.387747,0.292242,470.677524,-734.870094,142.420342,
+ 0.932875,-0.28792,0.21644,472.107209,-732.43577,140.574721,
+ 0.874212,-0.387747,0.292242,470.677524,-734.870094,142.420342,
+ 0.932875,-0.255741,0.253655,472.107211,-712.762199,163.139612,
+ 0.874212,-0.344308,0.342352,470.677525,-714.922322,165.299734,
+ 0.874212,-0.344308,0.342352,470.677525,-714.922322,165.299734,
+ 0.79876,-0.480196,0.362483,468.840169,-737.123146,144.128529,
+ 0.874212,-0.387747,0.292242,470.677524,-734.870094,142.420342,
+ 0.79876,-0.480196,0.362483,468.840169,-737.123146,144.128529,
+ 0.874212,-0.344308,0.342352,470.677525,-714.922322,165.299734,
+ 0.79876,-0.426323,0.424536,468.840171,-716.92159,167.299002,
+ 0.011271,-0.930329,0.366553,448.317768,-776.152256,94.194451,
+ 0,-0.882708,0.469921,0.000057,-762.391004,123.149179,
+ 0,-0.938509,0.345255,0.000048,-776.152271,94.194624,
+ 0,-0.882708,0.469921,0.000057,-762.391004,123.149179,
+ 0.011271,-0.930329,0.366553,448.317768,-776.152256,94.194451,
+ 0.011271,-0.871702,0.489906,448.317778,-762.390973,123.149041,
+ -0.999454,0.024455,-0.02222,454.797689,-686.233268,136.610681,
+ -0.999345,-0.022513,0.028328,454.66777,-665.3625,150.056742,
+ -0.999345,-0.026163,0.024996,454.667771,-683.695448,134.072861,
+ -0.999345,-0.022513,0.028328,454.66777,-665.3625,150.056742,
+ -0.999454,0.024455,-0.02222,454.797689,-686.233268,136.610681,
+ -0.999454,0.021199,-0.025346,454.797688,-667.530829,152.916709,
+ -0.537771,0.308263,-0.784714,442.839477,-632.069904,196.714653,
+ -0.415875,0.214324,-0.883806,439.690597,-606.087584,206.744382,
+ -0.537771,0.198458,-0.8194,442.839466,-605.68255,205.079413,
+ -0.415875,0.214324,-0.883806,439.690597,-606.087584,206.744382,
+ -0.537771,0.308263,-0.784714,442.839477,-632.069904,196.714653,
+ -0.415875,0.332758,-0.846357,439.690608,-632.698039,198.308899,
+ -0.748179,0.578988,-0.324038,448.282012,-730.404697,105.172511,
+ -0.832687,0.442054,-0.333498,450.471124,-713.308606,126.073164,
+ -0.832687,0.483376,-0.27015,450.47112,-727.926176,103.779563,
+ -0.832687,0.442054,-0.333498,450.471124,-713.308606,126.073164,
+ -0.748179,0.578988,-0.324038,448.282012,-730.404697,105.172511,
+ -0.748179,0.529432,-0.399912,448.282017,-715.574197,127.790857,
+ -0.415875,0.091892,-0.904767,439.690582,-578.575874,211.475076,
+ -0.285329,0.015988,-0.958296,436.33557,-549.135218,213.722949,
+ -0.41512,0.01512,-0.909641,439.690565,-549.114088,212.465226,
+ -0.285329,0.015988,-0.958296,436.33557,-549.135218,213.722949,
+ -0.415875,0.091892,-0.904767,439.690582,-578.575874,211.475076,
+ -0.285905,0.097067,-0.953329,436.335587,-578.704167,212.729198,
+ -0.832687,0.204213,-0.514714,450.471112,-629.324619,189.746946,
+ -0.901181,0.103838,-0.42082,452.246991,-603.175034,194.771794,
+ -0.901181,0.160213,-0.402745,452.247002,-628.181199,186.84487,
+ -0.901181,0.103838,-0.42082,452.246991,-603.175034,194.771794,
+ -0.832687,0.204213,-0.514714,450.471112,-629.324619,189.746946,
+ -0.832687,0.13217,-0.53774,450.471101,-603.912334,197.80261,
+ 0.381503,-0.91951,0.094637,673.957345,-751.440053,27.965226,
+ 0.256673,-0.939019,0.228829,649.8841,-754.828812,56.090715,
+ 0.256672,-0.961442,0.098738,649.884086,-759.522868,28.792076,
+ 0.256673,-0.939019,0.228829,649.8841,-754.828812,56.090715,
+ 0.381503,-0.91951,0.094637,673.957345,-751.440053,27.965226,
+ 0.381503,-0.898037,0.219052,673.957358,-746.934061,54.170165,
+ 0.625544,-0.013105,0.780079,717.89403,-548.526532,177.494989,
+ 0.691408,-0,0.722464,736.997652,-186.86272,160.753391,
+ 0.590628,-0,0.806944,717.89403,-186.86272,177.494989,
+ 0.691408,-0,0.722464,736.997652,-186.86272,160.753391,
+ 0.625544,-0.013105,0.780079,717.89403,-548.526532,177.494989,
+ 0.716411,-0.0095,0.697614,736.997652,-548.24528,160.753391,
+ -0.022557,0.36647,-0.930156,602.133289,-623.054827,173.833938,
+ -0,0.258478,-0.966017,454.667749,-599.869485,181.183687,
+ -0.022557,0.236303,-0.971418,602.13328,-599.869416,181.183686,
+ -0,0.258478,-0.966017,454.667749,-599.869485,181.183687,
+ -0.022557,0.36647,-0.930156,602.133289,-623.054827,173.833938,
+ -0,0.387702,-0.921785,454.667758,-623.054884,173.833943,
+ 0.499663,-0.689808,0.523929,696.758805,-703.964135,118.988469,
+ 0.381503,-0.653222,0.654031,673.957383,-695.432071,145.809483,
+ 0.381503,-0.736251,0.558918,673.957381,-712.905798,125.767735,
+ 0.381503,-0.653222,0.654031,673.957383,-695.432071,145.809483,
+ 0.499663,-0.689808,0.523929,696.758805,-703.964135,118.988469,
+ 0.499663,-0.61198,0.61304,696.758806,-687.497596,137.875009,
+ -0.901181,0.40379,-0.157562,452.247002,-736.467457,78.558611,
+ -0.952384,0.266534,-0.148066,453.575567,-722.299342,100.61724,
+ -0.952384,0.284225,-0.110366,453.575559,-733.364268,77.335952,
+ -0.952384,0.266534,-0.148066,453.575567,-722.299342,100.61724,
+ -0.901181,0.40379,-0.157562,452.247002,-736.467457,78.558611,
+ -0.901181,0.378553,-0.211115,452.247009,-725.206979,102.251354,
+ 0.381503,-0.805545,0.453379,673.957376,-727.485522,103.531853,
+ 0.256673,-0.769937,0.584223,649.884124,-719.380332,130.676509,
+ 0.256673,-0.842365,0.473857,649.884119,-734.568562,107.512581,
+ 0.256673,-0.769937,0.584223,649.884124,-719.380332,130.676509,
+ 0.381503,-0.805545,0.453379,673.957376,-727.485522,103.531853,
+ 0.381503,-0.736251,0.558918,673.957381,-712.905798,125.767735,
+ -0.606606,0.46573,-0.644302,702.22136,-645.663324,124.074113,
+ -0.494423,0.4252,-0.758123,684.332893,-634.846784,145.287478,
+ -0.595888,0.383438,-0.705615,702.221357,-629.047597,134.968788,
+ -0.494423,0.4252,-0.758123,684.332893,-634.846784,145.287478,
+ -0.606606,0.46573,-0.644302,702.22136,-645.663324,124.074113,
+ -0.494423,0.524541,-0.693111,684.332897,-652.814504,133.506322,
+ -0.244971,0.585448,-0.772813,644.636264,-662.459295,146.227532,
+ -0.112343,0.486683,-0.866325,623.546362,-644.548798,162.550587,
+ -0.244971,0.474679,-0.845381,644.636259,-642.668145,159.204284,
+ -0.112343,0.486683,-0.866325,623.546362,-644.548798,162.550587,
+ -0.244971,0.585448,-0.772813,644.636264,-662.459295,146.227532,
+ -0.112343,0.600194,-0.791925,623.546367,-664.778393,149.286355,
+ 0.030867,-0.871333,0.489721,599.602151,-740.19647,110.675522,
+ 0,-0.81044,0.585821,473.717777,-724.524762,134.576865,
+ 0,-0.882708,0.469921,473.717772,-740.196479,110.67556,
+ 0,-0.81044,0.585821,473.717777,-724.524762,134.576865,
+ 0.030867,-0.871333,0.489721,599.602151,-740.19647,110.675522,
+ 0.030867,-0.796473,0.603886,599.602156,-724.524748,134.576836,
+ 0.993395,-0.114677,0.003853,473.642035,-769.517334,23.357838,
+ 0.978666,-0.204393,0.020908,473.101722,-772.614333,30.131373,
+ 0.967989,-0.250852,0.00843,473.101718,-772.841978,23.357838,
+ 0.978666,-0.204393,0.020908,473.101722,-772.614333,30.131373,
+ 0.993395,-0.114677,0.003853,473.642035,-769.517334,23.357838,
+ 0.997653,-0.068124,0.006968,473.642039,-769.30108,29.792441,
+ -0.040706,0.603626,-0.796228,429.267777,-682.666673,172.880471,
+ -0,0.509694,-0.860356,0.016298,-659.055291,188.362206,
+ -0.040706,0.489496,-0.871055,429.267772,-659.055159,188.362176,
+ -0,0.509694,-0.860356,0.016298,-659.055291,188.362206,
+ -0.040706,0.603626,-0.796228,429.267777,-682.666673,172.880471,
+ -0,0.622177,-0.782877,0.016303,-682.666775,172.880521,
+ -0.150375,0.597097,-0.787948,432.838954,-682.490586,172.648217,
+ -0.040706,0.489496,-0.871055,429.267772,-659.055159,188.362176,
+ -0.150375,0.484157,-0.861963,432.838949,-658.912362,188.108094,
+ -0.040706,0.489496,-0.871055,429.267772,-659.055159,188.362176,
+ -0.150375,0.597097,-0.787948,432.838954,-682.490586,172.648217,
+ -0.040706,0.603626,-0.796228,429.267777,-682.666673,172.880471,
+ 0.707932,-0.427595,0.562134,466.630442,-695.289055,189.529057,
+ 0.603343,-0.550894,0.576621,464.090792,-720.287768,170.665181,
+ 0.707932,-0.500206,0.498623,466.630444,-718.721598,169.09901,
+ 0.603343,-0.550894,0.576621,464.090792,-720.287768,170.665181,
+ 0.707932,-0.427595,0.562134,466.630442,-695.289055,189.529057,
+ 0.603343,-0.467182,0.646311,464.09079,-696.627201,191.294034,
+ 0.011271,-0.604116,0.796817,448.317783,-699.580941,195.189934,
+ 0.091928,-0.70401,0.704215,451.683346,-723.691181,174.068594,
+ 0.091928,-0.601482,0.793579,451.683345,-699.535099,195.12947,
+ 0.091928,-0.70401,0.704215,451.683346,-723.691181,174.068594,
+ 0.011271,-0.604116,0.796817,448.317783,-699.580941,195.189934,
+ 0.011271,-0.70706,0.707064,448.317785,-723.744835,174.122247,
+ -0.150375,0.362184,-0.919897,432.838941,-633.447412,200.210852,
+ -0.040706,0.236142,-0.970866,429.267752,-606.639691,209.013907,
+ -0.150374,0.233455,-0.96067,432.83893,-606.570796,208.730707,
+ -0.040706,0.236142,-0.970866,429.267752,-606.639691,209.013907,
+ -0.150375,0.362184,-0.919897,432.838941,-633.447412,200.210852,
+ -0.040706,0.366235,-0.929632,429.267763,-633.554255,200.482022,
+ 0.091928,-0.235232,0.967582,451.683317,-613.239395,236.143333,
+ 0.229025,-0.356494,0.905793,455.006098,-643.590692,225.955193,
+ 0.229025,-0.229739,0.945922,455.006085,-613.111378,235.617099,
+ 0.229025,-0.356494,0.905793,455.006098,-643.590692,225.955193,
+ 0.091928,-0.235232,0.967582,451.683317,-613.239395,236.143333,
+ 0.091928,-0.364886,0.926503,451.68333,-643.789223,226.459074,
+ 0,0,1,0.179984,-280.29408,2125.502553,
+ 0,0,1,46.868397,-186.86272,2125.502553,
+ 0,0,1,0.179984,-186.86272,2125.502553,
+ 0,0,1,46.868397,-186.86272,2125.502553,
+ 0,0,1,0.179984,-280.29408,2125.502553,
+ 0,0,1,46.868397,-280.29408,2125.502553,
+ -0.606606,0.46573,-0.644302,702.22136,-645.663324,124.074113,
+ -0.701084,0.343733,-0.624763,718.363103,-622.121887,122.645633,
+ -0.707932,0.427569,-0.562154,718.363107,-637.122986,112.809644,
+ -0.701084,0.343733,-0.624763,718.363103,-622.121887,122.645633,
+ -0.606606,0.46573,-0.644302,702.22136,-645.663324,124.074113,
+ -0.595888,0.383438,-0.705615,702.221357,-629.047597,134.968788,
+ 0.783922,-0.620509,0.020854,468.840122,-781.931785,23.357838,
+ 0.714887,-0.69482,0.078501,466.630399,-784.205377,31.31709,
+ 0.690548,-0.722878,0.024294,466.630394,-784.472872,23.357838,
+ 0.714887,-0.69482,0.078501,466.630399,-784.205377,31.31709,
+ 0.783922,-0.620509,0.020854,468.840122,-781.931785,23.357838,
+ 0.812465,-0.579983,0.059329,468.840127,-781.672997,31.058037,
+ -0.952384,0.216659,-0.21453,453.575573,-691.225448,141.602861,
+ -0.985345,0.104291,-0.134978,454.431275,-669.689209,155.763554,
+ -0.985345,0.121711,-0.119507,454.431277,-688.759444,139.136857,
+ -0.985345,0.104291,-0.134978,454.431275,-669.689209,155.763554,
+ -0.952384,0.216659,-0.21453,453.575573,-691.225448,141.602861,
+ -0.952384,0.185405,-0.242052,453.575571,-671.796178,158.542589,
+ 0.229024,-0.96833,0.09942,455.006069,-790.65817,31.977188,
+ 0.091928,-0.967513,0.235514,451.683317,-785.765921,63.616808,
+ 0.091928,-0.990581,0.101478,451.683301,-791.19694,32.032304,
+ 0.091928,-0.967513,0.235514,451.683317,-785.765921,63.616808,
+ 0.229024,-0.96833,0.09942,455.006069,-790.65817,31.977188,
+ 0.229025,-0.94575,0.230443,455.006085,-785.239687,63.48879,
+ -0.796291,0.366435,-0.481296,732.466066,-627.348021,99.916734,
+ -0.870211,0.242544,-0.428841,744.275056,-605.410265,92.910065,
+ -0.870211,0.298718,-0.391791,744.275058,-616.515297,85.628667,
+ -0.870211,0.242544,-0.428841,744.275056,-605.410265,92.910065,
+ -0.796291,0.366435,-0.481296,732.466066,-627.348021,99.916734,
+ -0.796291,0.297433,-0.526739,732.466063,-614.194966,108.540989,
+ 0.487278,-0.205664,0.848683,461.269972,-612.537006,233.256044,
+ 0.603443,-0.29142,0.742247,464.090775,-642.024843,221.980973,
+ 0.603443,-0.187559,0.775035,464.090763,-612.101686,231.466578,
+ 0.603443,-0.29142,0.742247,464.090775,-642.024843,221.980973,
+ 0.487278,-0.205664,0.848683,461.269972,-612.537006,233.256044,
+ 0.487278,-0.319392,0.812741,461.269985,-642.699947,223.694428,
+ -0.112343,0.600194,-0.791925,623.546367,-664.778393,149.286355,
+ -0.022557,0.4898,-0.871543,602.133296,-645.022449,163.39336,
+ -0.112343,0.486683,-0.866325,623.546362,-644.548798,162.550587,
+ -0.022557,0.4898,-0.871543,602.133296,-645.022449,163.39336,
+ -0.112343,0.600194,-0.791925,623.546367,-664.778393,149.286355,
+ -0.022557,0.603993,-0.79667,602.133301,-665.362465,150.056725,
+ -0,0.723053,-0.690793,0.016305,-703.948386,154.325799,
+ -0.040706,0.796183,-0.603686,429.267777,-722.503059,133.044086,
+ -0,0.81044,-0.585821,0.016303,-722.503108,133.044187,
+ -0.040706,0.796183,-0.603686,429.267777,-722.503059,133.044086,
+ -0,0.723053,-0.690793,0.016305,-703.948386,154.325799,
+ -0.040706,0.706494,-0.706547,429.267778,-703.948313,154.325725,
+ -0.649152,0.44561,-0.616469,445.721745,-678.931346,167.953679,
+ -0.537771,0.412318,-0.735388,442.839485,-657.07129,184.832214,
+ -0.649152,0.35745,-0.67144,445.72174,-656.026027,182.972343,
+ -0.537771,0.412318,-0.735388,442.839485,-657.07129,184.832214,
+ -0.649152,0.44561,-0.616469,445.721745,-678.931346,167.953679,
+ -0.537771,0.508681,-0.672344,442.83949,-680.220296,169.653769,
+ 0.603343,-0.62433,0.496175,464.09079,-740.916622,147.004613,
+ 0.487279,-0.616933,0.618023,461.270002,-721.590015,171.967428,
+ 0.487279,-0.695395,0.528191,461.27,-742.384174,148.117261,
+ 0.487279,-0.616933,0.618023,461.270002,-721.590015,171.967428,
+ 0.603343,-0.62433,0.496175,464.09079,-740.916622,147.004613,
+ 0.603343,-0.550894,0.576621,464.090792,-720.287768,170.665181,
+ 0.487279,-0.695395,0.528191,461.27,-742.384174,148.117261,
+ 0.361665,-0.658837,0.659646,458.22226,-722.603323,172.980735,
+ 0.361665,-0.742579,0.563715,458.222259,-743.526109,148.983038,
+ 0.361665,-0.658837,0.659646,458.22226,-722.603323,172.980735,
+ 0.487279,-0.695395,0.528191,461.27,-742.384174,148.117261,
+ 0.487279,-0.616933,0.618023,461.270002,-721.590015,171.967428,
+ 0.114758,-0.016686,0.993253,451.683281,-549.621181,242.65094,
+ 0.20592,0,0.978569,455.00605,-186.86272,242.110623,
+ 0.068639,0,0.997642,451.683281,-186.86272,242.65094,
+ 0.20592,0,0.978569,455.00605,-186.86272,242.110623,
+ 0.114758,-0.016686,0.993253,451.683281,-549.621181,242.65094,
+ 0.251027,-0.016259,0.967844,455.00605,-549.612103,242.110623,
+ 0.707932,-0.500166,0.498664,736.997697,-665.645303,116.022715,
+ 0.609002,-0.620953,0.493491,717.894078,-692.709977,110.455949,
+ 0.707932,-0.563451,0.425857,736.997696,-679.337949,100.317733,
+ 0.609002,-0.620953,0.493491,717.894078,-692.709977,110.455949,
+ 0.707932,-0.500166,0.498664,736.997697,-665.645303,116.022715,
+ 0.609002,-0.547915,0.573503,717.894079,-677.511106,127.888519,
+ 0.609002,-0.620953,0.493491,717.894078,-692.709977,110.455949,
+ 0.499663,-0.61198,0.61304,696.758806,-687.497596,137.875009,
+ 0.499663,-0.689808,0.523929,696.758805,-703.964135,118.988469,
+ 0.499663,-0.61198,0.61304,696.758806,-687.497596,137.875009,
+ 0.609002,-0.620953,0.493491,717.894078,-692.709977,110.455949,
+ 0.609002,-0.547915,0.573503,717.894079,-677.511106,127.888519,
+ 0.855563,-0.510212,0.087731,767.829317,-668.759577,23.357838,
+ 0.800126,-0.584324,0.13551,753.739273,-687.397248,39.686742,
+ 0.780232,-0.616443,0.105998,753.739265,-690.205036,23.357838,
+ 0.800126,-0.584324,0.13551,753.739273,-687.397248,39.686742,
+ 0.855563,-0.510212,0.087731,767.829317,-668.759577,23.357838,
+ 0.87794,-0.465203,0.113169,767.829322,-666.812843,34.679214,
+ -0.537771,0.595553,-0.596756,442.839492,-701.085065,151.462478,
+ -0.415875,0.548909,-0.725084,439.690621,-681.255534,171.01922,
+ -0.537771,0.508681,-0.672344,442.83949,-680.220296,169.653769,
+ -0.415875,0.548909,-0.725084,439.690621,-681.255534,171.01922,
+ -0.537771,0.595553,-0.596756,442.839492,-701.085065,151.462478,
+ -0.415875,0.642593,-0.643523,439.690622,-702.296712,152.674124,
+ 0.361665,-0.905753,0.220929,458.222231,-784.271055,63.253152,
+ 0.229025,-0.905527,0.357167,455.006098,-775.57778,93.968105,
+ 0.229025,-0.94575,0.230443,455.006085,-785.239687,63.48879,
+ 0.229025,-0.905527,0.357167,455.006098,-775.57778,93.968105,
+ 0.361665,-0.905753,0.220929,458.222231,-784.271055,63.253152,
+ 0.361665,-0.867199,0.342292,458.222244,-774.650293,93.602673,
+ 0.229025,-0.94575,0.230443,455.006085,-785.239687,63.48879,
+ 0.091928,-0.926396,0.365157,451.68333,-776.081661,94.166635,
+ 0.091928,-0.967513,0.235514,451.683317,-785.765921,63.616808,
+ 0.091928,-0.926396,0.365157,451.68333,-776.081661,94.166635,
+ 0.229025,-0.94575,0.230443,455.006085,-785.239687,63.48879,
+ 0.229025,-0.905527,0.357167,455.006098,-775.57778,93.968105,
+ 0.986627,-0.162996,-0,843.130723,-608.452917,-0,
+ 0.971349,-0.237659,-0,838.782877,-630.311015,23.357838,
+ 0.960042,-0.279856,-0,838.782877,-630.311015,-0,
+ 0.971349,-0.237659,-0,838.782877,-630.311015,23.357838,
+ 0.986627,-0.162996,-0,843.130723,-608.452917,-0,
+ 0.991423,-0.130694,-0,843.130723,-608.452917,23.357838,
+ 0.691493,-0.722383,-0,772.221089,-745.599413,-0,
+ 0.625945,-0.779867,-0,746.929123,-767.779872,23.357838,
+ 0.591287,-0.806461,-0,746.929123,-767.779872,-0,
+ 0.625945,-0.779867,-0,746.929123,-767.779872,23.357838,
+ 0.691493,-0.722383,-0,772.221089,-745.599413,-0,
+ 0.722383,-0.691493,-0,772.221089,-745.599413,23.357838,
+ -0.614316,0.68383,-0.393691,702.221357,-684.591376,79.42501,
+ -0.707932,0.563466,-0.425837,718.363107,-662.432231,87.500399,
+ -0.71736,0.602889,-0.34917,718.363103,-672.268221,72.499299,
+ -0.707932,0.563466,-0.425837,718.363107,-662.432231,87.500399,
+ -0.614316,0.68383,-0.393691,702.221357,-684.591376,79.42501,
+ -0.606606,0.622389,-0.494632,702.22136,-673.696701,96.040736,
+ -0.537771,0.818998,-0.200111,442.839466,-754.702001,56.059962,
+ -0.649249,0.756522,-0.078421,445.721707,-757.270639,28.561795,
+ -0.537771,0.838627,-0.086642,442.839452,-759.393033,28.778909,
+ -0.649249,0.756522,-0.078421,445.721707,-757.270639,28.561795,
+ -0.537771,0.818998,-0.200111,442.839466,-754.702001,56.059962,
+ -0.656747,0.730839,-0.185896,445.721721,-752.628988,55.555664,
+ 1,-0,-0,847.545902,-186.86272,0,
+ 0.999698,-0.024594,-0,847.545902,-563.749227,23.357838,
+ 0.997846,-0.065595,-0,847.545902,-563.749227,0,
+ 0.999698,-0.024594,-0,847.545902,-563.749227,23.357838,
+ 1,-0,-0,847.545902,-186.86272,0,
+ 1,-0,-0,847.545902,56.185652,0,
+ 0.999698,-0.024594,-0,847.545902,-563.749227,23.357838,
+ 1,-0,-0,847.545902,56.185652,0,
+ 1,-0,-0,847.545902,56.185652,23.357838,
+ -0.754707,0.651908,-0.073718,448.28198,-754.771252,28.306118,
+ -0.819027,0.573431,-0.019271,450.471085,-752.099463,23.357838,
+ -0.731829,0.681103,-0.02289,448.281977,-754.937554,23.357838,
+ -0.819027,0.573431,-0.019271,450.471085,-752.099463,23.357838,
+ -0.754707,0.651908,-0.073718,448.28198,-754.771252,28.306118,
+ -0.845271,0.531564,-0.054376,450.471088,-751.942886,28.016787,
+ 0.780232,-0,0.62549,753.73925,-186.86272,141.649769,
+ 0.716411,-0.0095,0.697614,736.997652,-548.24528,160.753391,
+ 0.793821,-0.010508,0.608061,753.73925,-547.924349,141.649769,
+ 0.716411,-0.0095,0.697614,736.997652,-548.24528,160.753391,
+ 0.780232,-0,0.62549,753.73925,-186.86272,141.649769,
+ 0.691408,-0,0.722464,736.997652,-186.86272,160.753391,
+ -0.999454,0.021199,-0.025346,454.797688,-667.530829,152.916709,
+ -0.999345,-0.018443,0.031131,454.667766,-645.022494,163.39337,
+ -0.999345,-0.022513,0.028328,454.66777,-665.3625,150.056742,
+ -0.999345,-0.018443,0.031131,454.667766,-645.022494,163.39337,
+ -0.999454,0.021199,-0.025346,454.797688,-667.530829,152.916709,
+ -0.999454,0.017548,-0.027998,454.797683,-646.780881,166.522129,
+ -0.613495,0.011257,-0.789618,702.221319,-548.126642,153.690618,
+ -0.512963,0,-0.858411,684.332852,-186.86272,165.499615,
+ -0.605809,0,-0.79561,702.221319,-186.86272,153.690618,
+ -0.512963,0,-0.858411,684.332852,-186.86272,165.499615,
+ -0.613495,0.011257,-0.789618,702.221319,-548.126642,153.690618,
+ -0.493603,0.014422,-0.869568,684.332852,-548.325029,165.499615,
+ -0.150375,0.787661,-0.597476,432.838954,-722.270805,132.867998,
+ -0.285905,0.835148,-0.469878,436.335621,-737.047581,108.905866,
+ -0.150375,0.86173,-0.484571,432.838949,-737.730682,109.289775,
+ -0.285905,0.835148,-0.469878,436.335621,-737.047581,108.905866,
+ -0.150375,0.787661,-0.597476,432.838954,-722.270805,132.867998,
+ -0.285905,0.76333,-0.579298,436.335626,-721.646389,132.394587,
+ -0.040617,0.016774,-0.999034,429.26772,-549.153238,214.795487,
+ 0,0,-1,0.016247,-186.86272,214.795487,
+ -0.054143,0,-0.998533,429.26772,-186.86272,214.795487,
+ 0,0,-1,0.016247,-186.86272,214.795487,
+ -0.040617,0.016774,-0.999034,429.26772,-549.153238,214.795487,
+ -0,0.022395,-0.999749,0.016247,-549.153365,214.795487,
+ -0.415875,0.642593,-0.643523,439.690622,-702.296712,152.674124,
+ -0.285905,0.578577,-0.763876,436.335626,-682.017175,172.023802,
+ -0.415875,0.548909,-0.725084,439.690621,-681.255534,171.01922,
+ -0.285905,0.578577,-0.763876,436.335626,-682.017175,172.023802,
+ -0.415875,0.642593,-0.643523,439.690622,-702.296712,152.674124,
+ -0.285905,0.677271,-0.67791,436.335627,-703.188138,153.565551,
+ 0.381503,-0.859811,0.339381,673.957369,-738.899253,79.516658,
+ 0.256673,-0.842365,0.473857,649.884119,-734.568562,107.512581,
+ 0.256673,-0.899078,0.354651,649.884111,-746.45866,82.495079,
+ 0.256673,-0.842365,0.473857,649.884119,-734.568562,107.512581,
+ 0.381503,-0.859811,0.339381,673.957369,-738.899253,79.516658,
+ 0.381503,-0.805545,0.453379,673.957376,-727.485522,103.531853,
+ -0.870211,0.458871,-0.17936,744.275052,-648.232891,43.794023,
+ -0.928388,0.324653,-0.180823,753.57641,-625.658276,46.304148,
+ -0.928388,0.346265,-0.134897,753.576407,-630.223631,36.698359,
+ -0.928388,0.324653,-0.180823,753.57641,-625.658276,46.304148,
+ -0.870211,0.458871,-0.17936,744.275052,-648.232891,43.794023,
+ -0.870211,0.43015,-0.240215,744.275056,-642.532652,55.787678,
+ 0.487278,-0.868635,0.089632,461.269956,-788.240871,31.729906,
+ 0.361665,-0.905753,0.220929,458.222231,-784.271055,63.253152,
+ 0.361665,-0.92741,0.095445,458.222215,-789.666464,31.875739,
+ 0.361665,-0.905753,0.220929,458.222231,-784.271055,63.253152,
+ 0.487278,-0.868635,0.089632,461.269956,-788.240871,31.729906,
+ 0.487278,-0.848318,0.207161,461.269972,-782.878631,62.914419,
+ 0.947715,-0.314502,0.054079,787.130183,-621.196954,23.357838,
+ 0.933102,-0.349421,0.085002,779.024159,-644.605714,29.276931,
+ 0.916097,-0.395156,0.067947,779.024156,-645.623514,23.357838,
+ 0.933102,-0.349421,0.085002,779.024159,-644.605714,29.276931,
+ 0.947715,-0.314502,0.054079,787.130183,-621.196954,23.357838,
+ 0.966774,-0.246753,0.066789,787.130183,-621.159902,23.573317,
+ 0.916097,-0.395156,0.067947,779.024156,-645.623514,23.357838,
+ 0.87794,-0.465203,0.113169,767.829322,-666.812843,34.679214,
+ 0.855563,-0.510212,0.087731,767.829317,-668.759577,23.357838,
+ 0.87794,-0.465203,0.113169,767.829322,-666.812843,34.679214,
+ 0.916097,-0.395156,0.067947,779.024156,-645.623514,23.357838,
+ 0.933102,-0.349421,0.085002,779.024159,-644.605714,29.276931,
+ 0.487278,-0.812176,0.320826,461.269985,-773.317015,93.077359,
+ 0.361665,-0.812468,0.457269,458.222253,-760.983658,122.358117,
+ 0.361665,-0.867199,0.342292,458.222244,-774.650293,93.602673,
+ 0.361665,-0.812468,0.457269,458.222253,-760.983658,122.358117,
+ 0.487278,-0.812176,0.320826,461.269985,-773.317015,93.077359,
+ 0.487279,-0.760883,0.428506,461.269994,-759.734399,121.656023,
+ 0.973657,-0.162317,0.16014,473.101765,-710.482719,160.860131,
+ 0.932875,-0.28792,0.21644,472.107209,-732.43577,140.574721,
+ 0.973657,-0.182625,0.136528,473.101763,-729.866936,138.627118,
+ 0.932875,-0.28792,0.21644,472.107209,-732.43577,140.574721,
+ 0.973657,-0.162317,0.16014,473.101765,-710.482719,160.860131,
+ 0.932875,-0.255741,0.253655,472.107211,-712.762199,163.139612,
+ 0.091928,-0.990581,0.101478,451.683301,-791.19694,32.032304,
+ 0.01127,-0.9716,0.236362,448.317755,-785.839647,63.634744,
+ 0.00966,-0.995709,0.092029,448.317739,-791.272422,32.040027,
+ 0.01127,-0.9716,0.236362,448.317755,-785.839647,63.634744,
+ 0.091928,-0.990581,0.101478,451.683301,-791.19694,32.032304,
+ 0.091928,-0.967513,0.235514,451.683317,-785.765921,63.616808,
+ 0.229025,-0.775467,0.588387,455.006113,-744.32049,149.585311,
+ 0.091928,-0.70401,0.704215,451.683346,-723.691181,174.068594,
+ 0.091928,-0.793404,0.601714,451.683345,-744.752058,149.912511,
+ 0.091928,-0.70401,0.704215,451.683346,-723.691181,174.068594,
+ 0.229025,-0.775467,0.588387,455.006113,-744.32049,149.585311,
+ 0.229025,-0.688056,0.688568,455.006115,-723.308225,173.685638,
+ 0.091928,-0.793404,0.601714,451.683345,-744.752058,149.912511,
+ 0.011271,-0.70706,0.707064,448.317785,-723.744835,174.122247,
+ 0.011271,-0.796813,0.60412,448.317783,-744.812521,149.958353,
+ 0.011271,-0.70706,0.707064,448.317785,-723.744835,174.122247,
+ 0.091928,-0.793404,0.601714,451.683345,-744.752058,149.912511,
+ 0.091928,-0.70401,0.704215,451.683346,-723.691181,174.068594,
+ 0.011271,-0.796813,0.60412,448.317783,-744.812521,149.958353,
+ 0,-0.723053,0.690793,0.000065,-723.744912,174.122324,
+ 0,-0.81044,0.585821,0.000063,-744.812573,149.958459,
+ 0,-0.723053,0.690793,0.000065,-723.744912,174.122324,
+ 0.011271,-0.796813,0.60412,448.317783,-744.812521,149.958353,
+ 0.011271,-0.70706,0.707064,448.317785,-723.744835,174.122247,
+ 0.256673,-0.353935,0.899361,649.884111,-632.117666,196.836073,
+ 0.381503,-0.452381,0.806106,673.957376,-653.15444,177.862935,
+ 0.381503,-0.338316,0.860231,673.957369,-629.139245,189.276665,
+ 0.381503,-0.452381,0.806106,673.957376,-653.15444,177.862935,
+ 0.256673,-0.353935,0.899361,649.884111,-632.117666,196.836073,
+ 0.256673,-0.473186,0.842742,649.884119,-657.135168,184.945974,
+ 0.779867,-0.625945,-0,794.401548,-720.307447,-0,
+ 0.722383,-0.691493,-0,772.221089,-745.599413,23.357838,
+ 0.691493,-0.722383,-0,772.221089,-745.599413,-0,
+ 0.722383,-0.691493,-0,772.221089,-745.599413,23.357838,
+ 0.779867,-0.625945,-0,794.401548,-720.307447,-0,
+ 0.806461,-0.591287,-0,794.401548,-720.307447,23.357838,
+ 0.620913,-0.013167,0.783769,464.090728,-549.540509,237.849027,
+ 0.707107,0,0.707107,466.63038,-186.86272,235.639299,
+ 0.583909,-0,0.811819,464.090728,-186.86272,237.849027,
+ 0.707107,0,0.707107,466.63038,-186.86272,235.639299,
+ 0.620913,-0.013167,0.783769,464.090728,-549.540509,237.849027,
+ 0.707157,-0.011876,0.706957,466.63038,-549.503387,235.639299,
+ 0.793821,-0.010508,0.608061,753.73925,-547.924349,141.649769,
+ 0.707841,-0.055835,0.704162,736.997667,-573.300963,159.911321,
+ 0.794465,-0.062988,0.604035,753.739264,-571.352333,140.862403,
+ 0.707841,-0.055835,0.704162,736.997667,-573.300963,159.911321,
+ 0.793821,-0.010508,0.608061,753.73925,-547.924349,141.649769,
+ 0.716411,-0.0095,0.697614,736.997652,-548.24528,160.753391,
+ 0.625544,-0.013105,0.780079,717.89403,-548.526532,177.494989,
+ 0.707841,-0.055835,0.704162,736.997667,-573.300963,159.911321,
+ 0.716411,-0.0095,0.697614,736.997652,-548.24528,160.753391,
+ 0.707841,-0.055835,0.704162,736.997667,-573.300963,159.911321,
+ 0.625544,-0.013105,0.780079,717.89403,-548.526532,177.494989,
+ 0.609101,-0.079799,0.789068,717.894046,-575.008662,176.604979,
+ 0.499663,-0.423738,0.755502,696.7588,-647.656853,168.080895,
+ 0.609002,-0.464655,0.642816,717.894078,-660.078536,143.08739,
+ 0.598552,-0.382497,0.703869,717.894074,-640.737481,155.769021,
+ 0.609002,-0.464655,0.642816,717.894078,-660.078536,143.08739,
+ 0.499663,-0.423738,0.755502,696.7588,-647.656853,168.080895,
+ 0.499663,-0.522735,0.690714,696.758805,-668.611056,154.341548,
+ -0.9721,0.218065,-0.086424,760.201824,-611.21315,29.208214,
+ -0.983984,0.16585,-0.065345,763.093075,-596.364509,23.357838,
+ -0.96393,0.253712,-0.080426,760.201822,-613.067712,23.357838,
+ -0.537771,0.78409,-0.309846,442.839477,-746.337241,82.447316,
+ -0.656747,0.730839,-0.185896,445.721721,-752.628988,55.555664,
+ -0.537771,0.818998,-0.200111,442.839466,-754.702001,56.059962,
+ -0.656747,0.730839,-0.185896,445.721721,-752.628988,55.555664,
+ -0.537771,0.78409,-0.309846,442.839477,-746.337241,82.447316,
+ -0.649152,0.701164,-0.294909,445.721732,-744.352284,81.665241,
+ 0.995804,-0.089282,0.020098,473.642053,-764.379515,58.414175,
+ 0.978666,-0.204393,0.020908,473.101722,-772.614333,30.131373,
+ 0.997653,-0.068124,0.006968,473.642039,-769.30108,29.792441,
+ 0.978666,-0.204393,0.020908,473.101722,-772.614333,30.131373,
+ 0.995804,-0.089282,0.020098,473.642053,-764.379515,58.414175,
+ 0.973657,-0.221914,0.0524,473.101737,-767.615679,59.201429,
+ 0.973657,-0.221914,0.0524,473.101737,-767.615679,59.201429,
+ 0.940951,-0.336786,0.034451,472.107168,-775.82127,30.459429,
+ 0.978666,-0.204393,0.020908,473.101722,-772.614333,30.131373,
+ 0.940951,-0.336786,0.034451,472.107168,-775.82127,30.459429,
+ 0.973657,-0.221914,0.0524,473.101737,-767.615679,59.201429,
+ 0.932875,-0.350339,0.083707,472.107183,-770.747999,59.963422,
+ -0.757296,0.632534,-0.162491,448.281994,-750.187755,54.961789,
+ -0.832687,0.515679,-0.201762,450.471112,-739.369533,79.702032,
+ -0.832687,0.538362,-0.129611,450.471101,-747.425197,54.289747,
+ -0.832687,0.515679,-0.201762,450.471112,-739.369533,79.702032,
+ -0.757296,0.632534,-0.162491,448.281994,-750.187755,54.961789,
+ -0.748179,0.617743,-0.242119,448.282005,-742.014746,80.744249,
+ 0.701238,-0.343649,0.624636,736.997692,-632.515985,141.14023,
+ 0.609002,-0.464655,0.642816,717.894078,-660.078536,143.08739,
+ 0.707932,-0.427549,0.562168,736.997696,-649.94032,129.715362,
+ 0.609002,-0.464655,0.642816,717.894078,-660.078536,143.08739,
+ 0.701238,-0.343649,0.624636,736.997692,-632.515985,141.14023,
+ 0.598552,-0.382497,0.703869,717.894074,-640.737481,155.769021,
+ -0.656747,0.730839,-0.185896,445.721721,-752.628988,55.555664,
+ -0.748179,0.617743,-0.242119,448.282005,-742.014746,80.744249,
+ -0.757296,0.632534,-0.162491,448.281994,-750.187755,54.961789,
+ -0.748179,0.617743,-0.242119,448.282005,-742.014746,80.744249,
+ -0.656747,0.730839,-0.185896,445.721721,-752.628988,55.555664,
+ -0.649152,0.701164,-0.294909,445.721732,-744.352284,81.665241,
+ -0.985345,0.121711,-0.119507,454.431277,-688.759444,139.136857,
+ -0.999454,0.021199,-0.025346,454.797688,-667.530829,152.916709,
+ -0.999454,0.024455,-0.02222,454.797689,-686.233268,136.610681,
+ -0.999454,0.021199,-0.025346,454.797688,-667.530829,152.916709,
+ -0.985345,0.121711,-0.119507,454.431277,-688.759444,139.136857,
+ -0.985345,0.104291,-0.134978,454.431275,-669.689209,155.763554,
+ 0.361665,-0.867199,0.342292,458.222244,-774.650293,93.602673,
+ 0.229025,-0.848411,0.477229,455.006107,-761.852699,122.846525,
+ 0.229025,-0.905527,0.357167,455.006098,-775.57778,93.968105,
+ 0.229025,-0.848411,0.477229,455.006107,-761.852699,122.846525,
+ 0.361665,-0.867199,0.342292,458.222244,-774.650293,93.602673,
+ 0.361665,-0.812468,0.457269,458.222253,-760.983658,122.358117,
+ 0.932875,-0.086574,0.349641,472.107183,-609.58601,221.125411,
+ 0.874212,-0.179273,0.451236,470.677509,-639.24332,214.921287,
+ 0.932875,-0.133411,0.334583,472.107195,-638.123482,212.079066,
+ 0.874212,-0.179273,0.451236,470.677509,-639.24332,214.921287,
+ 0.932875,-0.086574,0.349641,472.107183,-609.58601,221.125411,
+ 0.874212,-0.116112,0.471456,470.677497,-610.308103,224.093716,
+ -0.150374,0.960557,-0.233917,432.83893,-758.353294,56.948209,
+ -0.285905,0.953237,-0.097966,436.335587,-762.351785,29.08158,
+ -0.150374,0.983472,-0.100844,432.838915,-763.131306,29.161323,
+ -0.285905,0.953237,-0.097966,436.335587,-762.351785,29.08158,
+ -0.150374,0.960557,-0.233917,432.83893,-758.353294,56.948209,
+ -0.285905,0.930996,-0.226946,436.335601,-757.591911,56.762987,
+ -0.939612,0.342242,0,693.784142,-590.617874,-0,
+ -0.961178,0.27593,0,698.091838,-577.372321,5.83946,
+ -0.970224,0.242209,-0,698.091838,-577.372321,-0,
+ -0.961178,0.27593,0,698.091838,-577.372321,5.83946,
+ -0.939612,0.342242,0,693.784142,-590.617874,-0,
+ -0.927092,0.374833,-0,693.784142,-590.617874,5.83946,
+ 0,1,-0,0.000468,-674.370541,5.83946,
+ -0.104693,0.994505,-0,590.370902,-674.370541,0,
+ 0,1,-0,0.000468,-674.370541,0,
+ -0.104693,0.994505,-0,590.370902,-674.370541,0,
+ 0,1,-0,0.000468,-674.370541,5.83946,
+ -0.104693,0.994505,-0,590.370902,-674.370541,5.83946,
+ -0.242209,0.970224,-0,603.993997,-671.470162,5.83946,
+ -0.104693,0.994505,-0,590.370902,-674.370541,0,
+ -0.104693,0.994505,-0,590.370902,-674.370541,5.83946,
+ -0.104693,0.994505,-0,590.370902,-674.370541,0,
+ -0.242209,0.970224,-0,603.993997,-671.470162,5.83946,
+ -0.27593,0.961178,-0,603.993997,-671.470162,-0,
+ -0.342242,0.939612,-0,617.239549,-667.162466,5.83946,
+ -0.27593,0.961178,-0,603.993997,-671.470162,-0,
+ -0.242209,0.970224,-0,603.993997,-671.470162,5.83946,
+ -0.27593,0.961178,-0,603.993997,-671.470162,-0,
+ -0.342242,0.939612,-0,617.239549,-667.162466,5.83946,
+ -0.374833,0.927092,-0,617.239549,-667.162466,-0,
+ 0.480964,-0.87674,-0,718.958402,-786.46931,-0,
+ 0.402772,-0.9153,-0,688.787514,-801.347945,23.357838,
+ 0.362412,-0.932018,-0,688.787514,-801.347945,-0,
+ 0.402772,-0.9153,-0,688.787514,-801.347945,23.357838,
+ 0.480964,-0.87674,-0,718.958402,-786.46931,-0,
+ 0.518797,-0.854897,-0,718.958402,-786.46931,23.357838,
+ -0.606606,0.549182,-0.574829,702.221362,-660.639487,111.0169,
+ -0.707932,0.427569,-0.562154,718.363107,-637.122986,112.809644,
+ -0.707932,0.500183,-0.498647,718.363108,-650.643847,101.02126,
+ -0.707932,0.427569,-0.562154,718.363107,-637.122986,112.809644,
+ -0.606606,0.549182,-0.574829,702.221362,-660.639487,111.0169,
+ -0.606606,0.46573,-0.644302,702.22136,-645.663324,124.074113,
+ 0.994447,0,0.105242,792.007202,-186.86272,48.711029,
+ 0.998104,-0.001034,0.061542,793.5709,-545.937124,23.357838,
+ 0.998103,0,0.06156,793.5709,-186.86272,23.357838,
+ 0.998104,-0.001034,0.061542,793.5709,-545.937124,23.357838,
+ 0.994447,0,0.105242,792.007202,-186.86272,48.711029,
+ 0.98887,-0.002499,0.148764,792.007202,-546.363038,48.711029,
+ 0.714887,-0.69482,0.078501,466.630399,-784.205377,31.31709,
+ 0.603443,-0.774584,0.189413,464.090763,-781.089165,62.479098,
+ 0.603443,-0.793169,0.082097,464.090747,-786.408778,31.542489,
+ 0.603443,-0.774584,0.189413,464.090763,-781.089165,62.479098,
+ 0.714887,-0.69482,0.078501,466.630399,-784.205377,31.31709,
+ 0.707841,-0.682368,0.182581,466.630415,-778.937032,61.955552,
+ 0.855563,-0,0.517699,767.829302,-186.86272,120.514493,
+ 0.793821,-0.010508,0.608061,753.73925,-547.924349,141.649769,
+ 0.866755,-0.008697,0.498658,767.829302,-547.569289,120.514493,
+ 0.793821,-0.010508,0.608061,753.73925,-547.924349,141.649769,
+ 0.855563,-0,0.517699,767.829302,-186.86272,120.514493,
+ 0.780232,-0,0.62549,753.73925,-186.86272,141.649769,
+ 0.79876,-0.364496,0.47867,468.840169,-693.751117,187.500559,
+ 0.707932,-0.500206,0.498623,466.630444,-718.721598,169.09901,
+ 0.79876,-0.426323,0.424536,468.840171,-716.92159,167.299002,
+ 0.707932,-0.500206,0.498623,466.630444,-718.721598,169.09901,
+ 0.79876,-0.364496,0.47867,468.840169,-693.751117,187.500559,
+ 0.707932,-0.427595,0.562134,466.630442,-695.289055,189.529057,
+ -0.494423,0.524541,-0.693111,684.332897,-652.814504,133.506322,
+ -0.373111,0.454056,-0.809087,665.021386,-639.414516,153.414997,
+ -0.494423,0.4252,-0.758123,684.332893,-634.846784,145.287478,
+ -0.373111,0.454056,-0.809087,665.021386,-639.414516,153.414997,
+ -0.494423,0.524541,-0.693111,684.332897,-652.814504,133.506322,
+ -0.373111,0.560072,-0.739667,665.02139,-658.447133,140.935603,
+ 0.973657,-0.113053,0.198017,473.101758,-663.582664,196.418147,
+ 0.932875,-0.218791,0.286137,472.107209,-690.197308,182.813182,
+ 0.973657,-0.138981,0.180764,473.101763,-688.249706,180.244348,
+ 0.932875,-0.218791,0.286137,472.107209,-690.197308,182.813182,
+ 0.973657,-0.113053,0.198017,473.101758,-663.582664,196.418147,
+ 0.932875,-0.177759,0.313282,472.107204,-665.162054,199.228412,
+ -0.022557,0.871531,-0.489821,602.133296,-713.015947,95.399861,
+ -0.112343,0.924436,-0.364414,623.546355,-722.557073,73.077847,
+ -0.022557,0.930148,-0.366491,602.133289,-723.456525,73.43224,
+ -0.112343,0.924436,-0.364414,623.546355,-722.557073,73.077847,
+ -0.022557,0.871531,-0.489821,602.133296,-713.015947,95.399861,
+ -0.112343,0.866156,-0.486984,623.546362,-712.173175,94.926211,
+ -0.112343,0.866156,-0.486984,623.546362,-712.173175,94.926211,
+ -0.244971,0.901902,-0.355754,644.636252,-718.985715,71.670721,
+ -0.112343,0.924436,-0.364414,623.546355,-722.557073,73.077847,
+ -0.244971,0.901902,-0.355754,644.636252,-718.985715,71.670721,
+ -0.112343,0.866156,-0.486984,623.546362,-712.173175,94.926211,
+ -0.244971,0.845012,-0.475335,644.636259,-708.826871,93.045557,
+ 0.499663,-0.841496,0.20548,696.758783,-736.031005,51.517793,
+ 0.381503,-0.859811,0.339381,673.957369,-738.899253,79.516658,
+ 0.381503,-0.898037,0.219052,673.957358,-746.934061,54.170165,
+ 0.381503,-0.859811,0.339381,673.957369,-738.899253,79.516658,
+ 0.499663,-0.841496,0.20548,696.758783,-736.031005,51.517793,
+ 0.499663,-0.805647,0.318231,696.758793,-728.459324,75.40331,
+ 0.021811,-0.999762,0,590.370902,-820.924227,0,
+ -0,-1,-0,0.000797,-820.924227,17.047527,
+ 0,-1,0,0.000468,-820.924227,0,
+ -0,-1,-0,0.000797,-820.924227,17.047527,
+ 0.032719,-0.999465,-0,590.370902,-820.924227,23.357838,
+ 0,-1,-0,0.000468,-820.924227,23.357838,
+ 0.032719,-0.999465,-0,590.370902,-820.924227,23.357838,
+ -0,-1,-0,0.000797,-820.924227,17.047527,
+ 0.021811,-0.999762,0,590.370902,-820.924227,0,
+ 0.401003,-0.015387,0.915947,673.957328,-548.951312,202.77988,
+ 0.479633,0,0.877469,696.758754,-186.86272,191.585041,
+ 0.360344,0,0.932819,673.957328,-186.86272,202.77988,
+ 0.479633,0,0.877469,696.758754,-186.86272,191.585041,
+ 0.401003,-0.015387,0.915947,673.957328,-548.951312,202.77988,
+ 0.517753,-0.01437,0.85541,696.758754,-548.76324,191.585041,
+ -0.747451,0.007439,-0.664276,448.281963,-549.007501,206.120647,
+ -0.665822,0,-0.746111,445.72169,-186.86272,208.627211,
+ -0.747409,0,-0.664364,448.281963,-186.86272,206.120647,
+ -0.665822,0,-0.746111,445.72169,-186.86272,208.627211,
+ -0.747451,0.007439,-0.664276,448.281963,-549.007501,206.120647,
+ -0.648424,0.012535,-0.761176,445.72169,-549.049611,208.627211,
+ -0.832687,0.272446,-0.482085,450.47112,-653.402151,178.303588,
+ -0.901181,0.160213,-0.402745,452.247002,-628.181199,186.84487,
+ -0.901181,0.2136,-0.377157,452.247009,-651.873941,175.584392,
+ -0.901181,0.160213,-0.402745,452.247002,-628.181199,186.84487,
+ -0.832687,0.272446,-0.482085,450.47112,-653.402151,178.303588,
+ -0.832687,0.204213,-0.514714,450.471112,-629.324619,189.746946,
+ -0.741547,0.152765,-0.653277,448.281994,-604.584377,200.565168,
+ -0.832687,0.057661,-0.550734,450.471088,-577.639374,202.320298,
+ -0.832687,0.13217,-0.53774,450.471101,-603.912334,197.80261,
+ -0.832687,0.057661,-0.550734,450.471088,-577.639374,202.320298,
+ -0.741547,0.152765,-0.653277,448.281994,-604.584377,200.565168,
+ -0.748094,0.052453,-0.661516,448.28198,-577.928705,205.148665,
+ 0.499663,-0.861647,0.088896,696.75877,-740.277271,26.823309,
+ 0.381503,-0.898037,0.219052,673.957358,-746.934061,54.170165,
+ 0.381503,-0.91951,0.094637,673.957345,-751.440053,27.965226,
+ 0.381503,-0.898037,0.219052,673.957358,-746.934061,54.170165,
+ 0.499663,-0.861647,0.088896,696.75877,-740.277271,26.823309,
+ 0.499663,-0.841496,0.20548,696.758783,-736.031005,51.517793,
+ 0.603443,-0.793169,0.082097,464.090747,-786.408778,31.542489,
+ 0.487278,-0.848318,0.207161,461.269972,-782.878631,62.914419,
+ 0.487278,-0.868635,0.089632,461.269956,-788.240871,31.729906,
+ 0.487278,-0.848318,0.207161,461.269972,-782.878631,62.914419,
+ 0.603443,-0.793169,0.082097,464.090747,-786.408778,31.542489,
+ 0.603443,-0.774584,0.189413,464.090763,-781.089165,62.479098,
+ -0.373111,0.560072,-0.739667,665.02139,-658.447133,140.935603,
+ -0.244971,0.474679,-0.845381,644.636259,-642.668145,159.204284,
+ -0.373111,0.454056,-0.809087,665.021386,-639.414516,153.414997,
+ -0.244971,0.474679,-0.845381,644.636259,-642.668145,159.204284,
+ -0.373111,0.560072,-0.739667,665.02139,-658.447133,140.935603,
+ -0.244971,0.585448,-0.772813,644.636264,-662.459295,146.227532,
+ 0.924681,-0,0.380742,779.024141,-186.86272,97.713067,
+ 0.9608,-0.004657,0.277203,787.130168,-546.781824,73.639808,
+ 0.972038,0,0.234823,787.130168,-186.86272,73.639808,
+ 0.9608,-0.004657,0.277203,787.130168,-546.781824,73.639808,
+ 0.924681,-0,0.380742,779.024141,-186.86272,97.713067,
+ 0.919603,-0.008082,0.392766,779.024141,-547.186239,97.713067,
+ 0.794465,-0.430275,0.42859,753.73929,-652.105388,102.482801,
+ 0.707932,-0.563451,0.425857,736.997696,-679.337949,100.317733,
+ 0.794465,-0.484664,0.36596,753.739289,-664.079301,88.749145,
+ 0.707932,-0.563451,0.425857,736.997696,-679.337949,100.317733,
+ 0.794465,-0.430275,0.42859,753.73929,-652.105388,102.482801,
+ 0.707932,-0.500166,0.498664,736.997697,-665.645303,116.022715,
+ -0.993727,0.068775,-0.088188,764.031425,-579.704781,37.076602,
+ -0.998991,0.022887,-0.038633,764.878707,-566.321382,23.357838,
+ -0.998991,0.027938,-0.035154,764.805052,-569.303684,23.357838,
+ -0.998991,0.022887,-0.038633,764.878707,-566.321382,23.357838,
+ -0.993727,0.068775,-0.088188,764.031425,-579.704781,37.076602,
+ -0.993727,0.056116,-0.096737,764.031424,-575.55911,39.794854,
+ -0.022557,0.971412,-0.236325,602.13328,-730.806273,50.246828,
+ -0.112343,0.988493,-0.101292,623.546333,-733.966349,26.17777,
+ -0.022557,0.994554,-0.10175,602.133267,-734.928078,26.276163,
+ -0.112343,0.988493,-0.101292,623.546333,-733.966349,26.17777,
+ -0.022557,0.971412,-0.236325,602.13328,-730.806273,50.246828,
+ -0.112343,0.96547,-0.235045,623.546346,-729.866921,50.018304,
+ -0,0.882708,-0.469921,454.667766,-713.015957,95.399907,
+ -0.022557,0.930148,-0.366491,602.133289,-723.456525,73.43224,
+ -0,0.938509,-0.345255,454.667758,-723.45653,73.432296,
+ -0.022557,0.930148,-0.366491,602.133289,-723.456525,73.43224,
+ -0,0.882708,-0.469921,454.667766,-713.015957,95.399907,
+ -0.022557,0.871531,-0.489821,602.133296,-713.015947,95.399861,
+ 0.874212,-0.423953,0.236679,470.677518,-751.514112,117.036157,
+ 0.79876,-0.56023,0.219373,468.840155,-767.174448,90.657181,
+ 0.874212,-0.45225,0.176701,470.677509,-764.543874,89.620732,
+ 0.79876,-0.56023,0.219373,468.840155,-767.174448,90.657181,
+ 0.874212,-0.423953,0.236679,470.677518,-751.514112,117.036157,
+ 0.79876,-0.525111,0.293667,468.840164,-753.978916,118.421396,
+ 0.108839,-0.994059,-0,623.938976,-818.724059,-0,
+ 0.032719,-0.999465,-0,590.370902,-820.924227,23.357838,
+ 0.021811,-0.999762,0,590.370902,-820.924227,0,
+ 0.032719,-0.999465,-0,590.370902,-820.924227,23.357838,
+ 0.108839,-0.994059,-0,623.938976,-818.724059,-0,
+ 0.152151,-0.988357,-0,623.938976,-818.724059,23.357838,
+ 0.79876,-0.584897,0.140986,468.840142,-776.463573,61.353839,
+ 0.714887,-0.69482,0.078501,466.630399,-784.205377,31.31709,
+ 0.812465,-0.579983,0.059329,468.840127,-781.672997,31.058037,
+ 0.714887,-0.69482,0.078501,466.630399,-784.205377,31.31709,
+ 0.79876,-0.584897,0.140986,468.840142,-776.463573,61.353839,
+ 0.707841,-0.682368,0.182581,466.630415,-778.937032,61.955552,
+ 0.866755,-0.008697,0.498658,767.829302,-547.569289,120.514493,
+ 0.794465,-0.062988,0.604035,753.739264,-571.352333,140.862403,
+ 0.867227,-0.051963,0.495193,767.829315,-569.19647,119.787648,
+ 0.794465,-0.062988,0.604035,753.739264,-571.352333,140.862403,
+ 0.866755,-0.008697,0.498658,767.829302,-547.569289,120.514493,
+ 0.793821,-0.010508,0.608061,753.73925,-547.924349,141.649769,
+ -0.999951,0.009862,-0.001008,454.797654,-738.498463,26.641479,
+ -0.999345,-0.035345,0.007749,454.667749,-730.806274,50.246897,
+ -0.999345,-0.035987,0.003682,454.667737,-734.928076,26.276244,
+ -0.999345,-0.035345,0.007749,454.667749,-730.806274,50.246897,
+ -0.999951,0.009862,-0.001008,454.797654,-738.498463,26.641479,
+ -0.999454,0.032443,-0.006265,454.797666,-734.293588,51.095248,
+ -0.754707,0.651908,-0.073718,448.28198,-754.771252,28.306118,
+ -0.832687,0.538362,-0.129611,450.471101,-747.425197,54.289747,
+ -0.845271,0.531564,-0.054376,450.471088,-751.942886,28.016787,
+ -0.832687,0.538362,-0.129611,450.471101,-747.425197,54.289747,
+ -0.754707,0.651908,-0.073718,448.28198,-754.771252,28.306118,
+ -0.757296,0.632534,-0.162491,448.281994,-750.187755,54.961789,
+ -0.870211,0.117753,-0.4784,744.275047,-580.75808,102.623043,
+ -0.928388,0.039234,-0.369537,753.576397,-565.700992,85.617213,
+ -0.928388,0.089223,-0.360743,753.576403,-576.182654,83.81487,
+ -0.928388,0.039234,-0.369537,753.576397,-565.700992,85.617213,
+ -0.870211,0.117753,-0.4784,744.275047,-580.75808,102.623043,
+ -0.870211,0.051465,-0.489984,744.27504,-567.670824,104.873423,
+ -0.150052,0.016548,-0.98854,432.838898,-549.148352,214.504709,
+ -0.054143,0,-0.998533,429.26772,-186.86272,214.795487,
+ -0.172878,0,-0.984943,432.838898,-186.86272,214.504709,
+ -0.054143,0,-0.998533,429.26772,-186.86272,214.795487,
+ -0.150052,0.016548,-0.98854,432.838898,-549.148352,214.504709,
+ -0.040617,0.016774,-0.999034,429.26772,-549.153238,214.795487,
+ -0,0.81044,-0.585821,454.66777,-699.67933,115.739913,
+ -0.022557,0.871531,-0.489821,602.133296,-713.015947,95.399861,
+ -0,0.882708,-0.469921,454.667766,-713.015957,95.399907,
+ -0.022557,0.871531,-0.489821,602.133296,-713.015947,95.399861,
+ -0,0.81044,-0.585821,454.66777,-699.67933,115.739913,
+ -0.022557,0.796656,-0.604012,602.133301,-699.679313,115.739878,
+ 0.79876,-0.525111,0.293667,468.840164,-753.978916,118.421396,
+ 0.707841,-0.651123,0.273862,466.630427,-769.542842,91.59033,
+ 0.79876,-0.56023,0.219373,468.840155,-767.174448,90.657181,
+ 0.707841,-0.651123,0.273862,466.630427,-769.542842,91.59033,
+ 0.79876,-0.525111,0.293667,468.840164,-753.978916,118.421396,
+ 0.717647,-0.602641,0.349008,466.630436,-756.198062,119.668573,
+ -0.901181,0.2136,-0.377157,452.247009,-651.873941,175.584392,
+ -0.952384,0.113168,-0.283121,453.575559,-626.95854,183.741681,
+ -0.952384,0.150692,-0.265059,453.575567,-650.239827,172.676755,
+ -0.952384,0.113168,-0.283121,453.575559,-626.95854,183.741681,
+ -0.901181,0.2136,-0.377157,452.247009,-651.873941,175.584392,
+ -0.901181,0.160213,-0.402745,452.247002,-628.181199,186.84487,
+ -0.599001,0.779767,-0.182103,702.221343,-699.124264,42.539571,
+ -0.691044,0.712358,-0.122491,718.363083,-688.112661,23.357838,
+ -0.605809,0.784102,-0.134828,702.221333,-702.422602,23.357838,
+ -0.691044,0.712358,-0.122491,718.363083,-688.112661,23.357838,
+ -0.599001,0.779767,-0.182103,702.221343,-699.124264,42.539571,
+ -0.714681,0.677849,-0.172485,718.363091,-685.388881,39.198188,
+ 0,-0.016797,0.999859,0,-549.622587,242.726639,
+ 0.01127,-0.101755,0.994746,448.317739,-581.662615,241.649835,
+ 0.012852,-0.014396,0.999814,448.31772,-549.622454,242.726639,
+ 0.01127,-0.101755,0.994746,448.317739,-581.662615,241.649835,
+ 0,-0.016797,0.999859,0,-549.622587,242.726639,
+ 0,-0.124431,0.992228,0.000019,-581.662862,241.649831,
+ -0.649152,0.525457,-0.549997,445.721747,-699.576473,149.953886,
+ -0.537771,0.508681,-0.672344,442.83949,-680.220296,169.653769,
+ -0.649152,0.44561,-0.616469,445.721745,-678.931346,167.953679,
+ -0.537771,0.508681,-0.672344,442.83949,-680.220296,169.653769,
+ -0.649152,0.525457,-0.549997,445.721747,-699.576473,149.953886,
+ -0.537771,0.595553,-0.596756,442.839492,-701.085065,151.462478,
+ 0.012852,-0.014396,0.999814,448.31772,-549.622454,242.726639,
+ 0.091928,-0.101189,0.990611,451.683301,-581.654891,241.574352,
+ 0.114758,-0.016686,0.993253,451.683281,-549.621181,242.65094,
+ 0.091928,-0.101189,0.990611,451.683301,-581.654891,241.574352,
+ 0.012852,-0.014396,0.999814,448.31772,-549.622454,242.726639,
+ 0.01127,-0.101755,0.994746,448.317739,-581.662615,241.649835,
+ -0.901181,0.160213,-0.402745,452.247002,-628.181199,186.84487,
+ -0.952384,0.073533,-0.295901,453.575549,-602.386639,191.530944,
+ -0.952384,0.113168,-0.283121,453.575559,-626.95854,183.741681,
+ -0.952384,0.073533,-0.295901,453.575549,-602.386639,191.530944,
+ -0.901181,0.160213,-0.402745,452.247002,-628.181199,186.84487,
+ -0.901181,0.103838,-0.42082,452.246991,-603.175034,194.771794,
+ -0.415875,0.72429,-0.549957,439.690621,-720.641807,131.632947,
+ -0.537771,0.734555,-0.413801,442.839485,-734.454802,107.448703,
+ -0.415875,0.792474,-0.446131,439.690616,-735.948584,108.28822,
+ -0.537771,0.734555,-0.413801,442.839485,-734.454802,107.448703,
+ -0.415875,0.72429,-0.549957,439.690621,-720.641807,131.632947,
+ -0.537771,0.671316,-0.510036,442.83949,-719.276356,130.597708,
+ 0.966794,-0.15555,0.202766,787.130191,-597.186922,60.135075,
+ 0.924993,-0.269668,0.267706,779.02417,-620.964741,71.342153,
+ 0.966794,-0.181729,0.179678,787.130191,-603.902541,54.279953,
+ 0.924993,-0.269668,0.267706,779.02417,-620.964741,71.342153,
+ 0.966794,-0.15555,0.202766,787.130191,-597.186922,60.135075,
+ 0.924993,-0.230673,0.301955,779.024169,-611.764971,79.363123,
+ 0.603443,-0.187559,0.775035,464.090763,-612.101686,231.466578,
+ 0.707841,-0.243878,0.662936,466.630427,-641.212918,219.920255,
+ 0.707841,-0.151267,0.689985,466.630415,-611.57814,229.314444,
+ 0.707841,-0.243878,0.662936,466.630427,-641.212918,219.920255,
+ 0.603443,-0.187559,0.775035,464.090763,-612.101686,231.466578,
+ 0.603443,-0.29142,0.742247,464.090775,-642.024843,221.980973,
+ -0.530018,0.847987,-0,642.023926,-654.528574,5.83946,
+ -0.469634,0.882861,-0,629.962605,-661.494594,-0,
+ -0.438529,0.898717,-0,629.962605,-661.494594,5.83946,
+ -0.469634,0.882861,-0,629.962605,-661.494594,-0,
+ -0.530018,0.847987,-0,642.023926,-654.528574,5.83946,
+ -0.559296,0.828968,-0,642.023926,-654.528574,-0,
+ -0.847987,0.530018,-0,681.15025,-615.40225,-0,
+ -0.882861,0.469634,-0,688.11627,-603.340929,5.83946,
+ -0.898717,0.438529,-0,688.11627,-603.340929,-0,
+ -0.882861,0.469634,-0,688.11627,-603.340929,5.83946,
+ -0.847987,0.530018,-0,681.15025,-615.40225,-0,
+ -0.828968,0.559296,-0,681.15025,-615.40225,5.83946,
+ -0.982194,0.18787,-0,700.992217,-563.749227,5.83946,
+ -0.985885,0.167425,-0,806.270901,56.185652,0,
+ -0.982194,0.18787,-0,700.992217,-563.749227,-0,
+ -0.985885,0.167425,-0,806.270901,56.185652,0,
+ -0.982194,0.18787,-0,700.992217,-563.749227,5.83946,
+ -0.985885,0.167425,-0,764.9959,-186.86272,5.83946,
+ -0.985885,0.167425,-0,806.270901,56.185652,0,
+ -0.985885,0.167425,-0,764.9959,-186.86272,5.83946,
+ -0.985885,0.167425,0,806.270901,56.185652,23.357838,
+ -0.985885,0.167425,0,806.270901,56.185652,23.357838,
+ -0.985885,0.167425,-0,764.9959,-186.86272,5.83946,
+ -0.997977,0.055997,-0.030099,764.9959,-186.86272,23.357838,
+ 0.994417,-0.002312,0.105501,473.642021,-549.252285,220.6922,
+ 0.973657,-0.024735,0.226671,473.101722,-579.75396,222.991746,
+ 0.995804,-0.010878,0.090867,473.642039,-579.415029,219.678492,
+ 0.973657,-0.024735,0.226671,473.101722,-579.75396,222.991746,
+ 0.994417,-0.002312,0.105501,473.642021,-549.252285,220.6922,
+ 0.973547,-0.004216,0.228449,473.101704,-549.308105,224.014969,
+ 0.998104,-0.001034,0.061542,793.5709,-545.937124,23.357838,
+ 0.991932,-0.01438,0.125953,792.007211,-561.87231,48.189795,
+ 0.998111,-0.007644,0.060955,793.543158,-559.332109,23.357838,
+ 0.991932,-0.01438,0.125953,792.007211,-561.87231,48.189795,
+ 0.998104,-0.001034,0.061542,793.5709,-545.937124,23.357838,
+ 0.98887,-0.002499,0.148764,792.007202,-546.363038,48.711029,
+ 0.381503,-0.736251,0.558918,673.957381,-712.905798,125.767735,
+ 0.256673,-0.683145,0.68369,649.884126,-701.177315,151.554728,
+ 0.256673,-0.769937,0.584223,649.884124,-719.380332,130.676509,
+ 0.256673,-0.683145,0.68369,649.884126,-701.177315,151.554728,
+ 0.381503,-0.736251,0.558918,673.957381,-712.905798,125.767735,
+ 0.381503,-0.653222,0.654031,673.957383,-695.432071,145.809483,
+ 0.256673,-0.769937,0.584223,649.884124,-719.380332,130.676509,
+ 0.127347,-0.701215,0.701485,624.955349,-704.633973,155.011385,
+ 0.127347,-0.790262,0.59939,624.955347,-723.275771,133.6299,
+ 0.127347,-0.701215,0.701485,624.955349,-704.633973,155.011385,
+ 0.256673,-0.769937,0.584223,649.884124,-719.380332,130.676509,
+ 0.256673,-0.683145,0.68369,649.884126,-701.177315,151.554728,
+ 0.127347,-0.790262,0.59939,624.955347,-723.275771,133.6299,
+ 0.030867,-0.706755,0.706785,599.602158,-705.742267,156.119679,
+ 0.030867,-0.796473,0.603886,599.602156,-724.524748,134.576836,
+ 0.030867,-0.706755,0.706785,599.602158,-705.742267,156.119679,
+ 0.127347,-0.790262,0.59939,624.955347,-723.275771,133.6299,
+ 0.127347,-0.701215,0.701485,624.955349,-704.633973,155.011385,
+ 0.030867,-0.796473,0.603886,599.602156,-724.524748,134.576836,
+ 0,-0.723053,0.690793,473.717779,-705.742288,156.119701,
+ 0,-0.81044,0.585821,473.717777,-724.524762,134.576865,
+ 0,-0.723053,0.690793,473.717779,-705.742288,156.119701,
+ 0.030867,-0.796473,0.603886,599.602156,-724.524748,134.576836,
+ 0.030867,-0.706755,0.706785,599.602158,-705.742267,156.119679,
+ 0.999748,-0.016225,0.015501,473.717779,-705.742288,156.119701,
+ 0.995804,-0.073866,0.054027,473.642079,-727.212939,136.614949,
+ 0.999748,-0.018186,0.013146,473.717777,-724.524762,134.576865,
+ 0.995804,-0.073866,0.054027,473.642079,-727.212939,136.614949,
+ 0.999748,-0.016225,0.015501,473.717779,-705.742288,156.119701,
+ 0.995804,-0.065815,0.063588,473.64208,-708.127668,158.505081,
+ 0,-0.999436,0.033589,0.00089,-791.564218,23.357838,
+ 0.00966,-0.995709,0.092029,448.317739,-791.272422,32.040027,
+ 0,-0.994809,0.101765,0.000019,-791.272419,32.040275,
+ 0.00966,-0.995709,0.092029,448.317739,-791.272422,32.040027,
+ 0,-0.999436,0.033589,0.00089,-791.564218,23.357838,
+ 0.011244,-0.999373,0.033587,448.317734,-791.564213,23.357838,
+ -0.970224,0.242209,-0,698.091838,-577.372321,-0,
+ -0.982194,0.18787,-0,700.992217,-563.749227,5.83946,
+ -0.982194,0.18787,-0,700.992217,-563.749227,-0,
+ -0.982194,0.18787,-0,700.992217,-563.749227,5.83946,
+ -0.970224,0.242209,-0,698.091838,-577.372321,-0,
+ -0.961178,0.27593,0,698.091838,-577.372321,5.83946,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.9959,-186.86272,23.357838,
+ 0,-0,1,0.001765,-186.86272,23.357838,
+ -0,-0,1,764.9959,-186.86272,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.9959,-545.937132,23.357838,
+ -0,-0,1,764.9959,-545.937132,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.975642,-559.332125,23.357838,
+ -0,-0,1,764.975642,-559.332125,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.959284,-561.475403,23.357838,
+ -0,-0,1,764.959284,-561.475403,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.928093,-563.76708,23.357838,
+ -0,-0,1,764.928093,-563.76708,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.878707,-566.321382,23.357838,
+ -0,-0,1,764.878707,-566.321382,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.805052,-569.303684,23.357838,
+ -0,-0,1,764.805052,-569.303684,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.696221,-572.980425,23.357838,
+ -0,-0,1,764.696221,-572.980425,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.531578,-577.829947,23.357838,
+ -0,-0,1,764.531578,-577.829947,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.267941,-584.829097,23.357838,
+ -0,-0,1,764.267941,-584.829097,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,764.031423,-590.643016,23.357838,
+ -0,-0,1,764.031423,-590.643016,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,763.093075,-596.364509,23.357838,
+ -0,0,1,763.093075,-596.364509,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,760.201822,-613.067712,23.357838,
+ -0,0,1,760.201822,-613.067712,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,757.969157,-620.274076,23.357838,
+ -0,0,1,757.969157,-620.274076,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,753.576401,-633.988087,23.357838,
+ -0,0,1,753.576401,-633.988087,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,744.275043,-653.583014,23.357838,
+ -0,0,1,744.275043,-653.583014,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,732.466046,-671.734013,23.357838,
+ -0,0,1,732.466046,-671.734013,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,718.363083,-688.112661,23.357838,
+ -0,0,1,718.363083,-688.112661,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,702.221333,-702.422602,23.357838,
+ -0,0,1,702.221333,-702.422602,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,696.28309,-706.40024,23.357838,
+ -0,0,1,696.28309,-706.40024,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,684.332867,-714.293585,23.357838,
+ -0,0,1,684.332867,-714.293585,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,454.667735,-735.026158,23.357838,
+ -0,0,1,684.332867,-714.293585,23.357838,
+ -0,0,1,454.667735,-735.026158,23.357838,
+ -0,-0,1,665.021358,-723.600195,23.357838,
+ -0,-0,1,665.021358,-723.600195,23.357838,
+ -0,0,1,454.667735,-735.026158,23.357838,
+ -0,-0,1,644.63623,-730.229356,23.357838,
+ -0,-0,1,644.63623,-730.229356,23.357838,
+ -0,0,1,454.667735,-735.026158,23.357838,
+ -0,-0,1,623.546332,-734.061121,23.357838,
+ -0,-0,1,623.546332,-734.061121,23.357838,
+ -0,0,1,454.667735,-735.026158,23.357838,
+ -0,-0,1,602.133266,-735.026157,23.357838,
+ -0,0,1,454.667735,-735.026158,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,-0,1,454.797652,-738.60882,23.357838,
+ -0,-0,1,454.797652,-738.60882,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,454.431238,-742.175043,23.357838,
+ -0,0,1,454.431238,-742.175043,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,453.575534,-745.656322,23.357838,
+ -0,0,1,453.575534,-745.656322,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,452.246975,-748.985782,23.357838,
+ -0,0,1,452.246975,-748.985782,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,450.471085,-752.099463,23.357838,
+ -0,0,1,450.471085,-752.099463,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,448.281977,-754.937554,23.357838,
+ -0,0,1,448.281977,-754.937554,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,445.721704,-757.445533,23.357838,
+ -0,0,1,445.721704,-757.445533,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,442.839449,-759.575224,23.357838,
+ -0,0,1,442.839449,-759.575224,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,439.690579,-761.285715,23.357838,
+ -0,0,1,439.690579,-761.285715,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,436.335584,-762.544148,23.357838,
+ -0,0,1,436.335584,-762.544148,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,432.838912,-763.326349,23.357838,
+ -0,0,1,432.838912,-763.326349,23.357838,
+ -0,0,1,0.00829,-763.617296,23.357836,
+ -0,0,1,429.267734,-763.617291,23.357838,
+ 0.999748,-0.018186,0.013146,473.717777,-724.524762,134.576865,
+ 0.995804,-0.08054,0.043457,473.642074,-743.137303,112.328326,
+ 0.999748,-0.019808,0.010545,473.717772,-740.196479,110.67556,
+ 0.995804,-0.08054,0.043457,473.642074,-743.137303,112.328326,
+ 0.999748,-0.018186,0.013146,473.717777,-724.524762,134.576865,
+ 0.995804,-0.073866,0.054027,473.642079,-727.212939,136.614949,
+ 0.609101,-0.737549,0.291577,717.894067,-715.319418,70.22617,
+ 0.499663,-0.754768,0.425045,696.7588,-717.703482,98.034266,
+ 0.499663,-0.805647,0.318231,696.758793,-728.459324,75.40331,
+ 0.499663,-0.754768,0.425045,696.7588,-717.703482,98.034266,
+ 0.609101,-0.737549,0.291577,717.894067,-715.319418,70.22617,
+ 0.616524,-0.682339,0.392825,717.894074,-705.391609,91.114894,
+ -0.614316,0.68383,-0.393691,702.221357,-684.591376,79.42501,
+ -0.707841,0.651123,-0.273862,718.363098,-679.96832,56.297814,
+ -0.606705,0.739249,-0.292265,702.221351,-693.120267,61.479696,
+ -0.707841,0.651123,-0.273862,718.363098,-679.96832,56.297814,
+ -0.614316,0.68383,-0.393691,702.221357,-684.591376,79.42501,
+ -0.71736,0.602889,-0.34917,718.363103,-672.268221,72.499299,
+ 0.874212,-0.47211,0.113426,470.677497,-773.716304,60.685516,
+ 0.812465,-0.579983,0.059329,468.840127,-781.672997,31.058037,
+ 0.885205,-0.462786,0.04734,470.677482,-778.860284,30.770308,
+ 0.812465,-0.579983,0.059329,468.840127,-781.672997,31.058037,
+ 0.874212,-0.47211,0.113426,470.677497,-773.716304,60.685516,
+ 0.79876,-0.584897,0.140986,468.840142,-776.463573,61.353839,
+ 0.867227,-0.463727,0.18131,767.829328,-662.181333,49.28971,
+ 0.800126,-0.584324,0.13551,753.739273,-687.397248,39.686742,
+ 0.87794,-0.465203,0.113169,767.829322,-666.812843,34.679214,
+ 0.800126,-0.584324,0.13551,753.739273,-687.397248,39.686742,
+ 0.867227,-0.463727,0.18131,767.829328,-662.181333,49.28971,
+ 0.794465,-0.565471,0.221515,753.73928,-681.891377,57.055486,
+ -0.832687,0.483376,-0.27015,450.47112,-727.926176,103.779563,
+ -0.901181,0.346254,-0.26073,452.247014,-710.823017,124.188674,
+ -0.901181,0.378553,-0.211115,452.247009,-725.206979,102.251354,
+ -0.901181,0.346254,-0.26073,452.247014,-710.823017,124.188674,
+ -0.832687,0.483376,-0.27015,450.47112,-727.926176,103.779563,
+ -0.832687,0.442054,-0.333498,450.471124,-713.308606,126.073164,
+ -0.832687,0.515679,-0.201762,450.471112,-739.369533,79.702032,
+ -0.901181,0.378553,-0.211115,452.247009,-725.206979,102.251354,
+ -0.901181,0.40379,-0.157562,452.247002,-736.467457,78.558611,
+ -0.901181,0.378553,-0.211115,452.247009,-725.206979,102.251354,
+ -0.832687,0.515679,-0.201762,450.471112,-739.369533,79.702032,
+ -0.832687,0.483376,-0.27015,450.47112,-727.926176,103.779563,
+ 0.148826,-0.01661,0.988724,624.95529,-549.169432,215.762941,
+ 0.234823,0,0.972038,649.884069,-186.86272,210.885907,
+ 0.105242,0,0.994447,624.95529,-186.86272,215.762941,
+ 0.234823,0,0.972038,649.884069,-186.86272,210.885907,
+ 0.148826,-0.01661,0.988724,624.95529,-549.169432,215.762941,
+ 0.277314,-0.016138,0.960644,649.884069,-549.087494,210.885907,
+ -0.9937,0.002257,-0.112046,764.031409,-546.296855,44.770904,
+ -0.997977,0.055997,-0.030099,764.9959,-186.86272,23.357838,
+ -0.998987,0.001007,-0.04498,764.9959,-545.937132,23.357838,
+ -0.997977,0.055997,-0.030099,764.9959,-186.86272,23.357838,
+ -0.9937,0.002257,-0.112046,764.031409,-546.296855,44.770904,
+ -0.99093,0,-0.134378,764.031409,-186.86272,44.770904,
+ -0.112343,0.486683,-0.866325,623.546362,-644.548798,162.550587,
+ -0.022557,0.36647,-0.930156,602.133289,-623.054827,173.833938,
+ -0.112343,0.364093,-0.924562,623.546355,-622.700434,172.934486,
+ -0.022557,0.36647,-0.930156,602.133289,-623.054827,173.833938,
+ -0.112343,0.486683,-0.866325,623.546362,-644.548798,162.550587,
+ -0.022557,0.4898,-0.871543,602.133296,-645.022449,163.39336,
+ -0.649152,0.35745,-0.67144,445.72174,-656.026027,182.972343,
+ -0.748179,0.244321,-0.616875,448.282005,-630.366836,192.392159,
+ -0.748179,0.326101,-0.577828,448.282012,-654.795099,180.782109,
+ -0.748179,0.244321,-0.616875,448.282005,-630.366836,192.392159,
+ -0.649152,0.35745,-0.67144,445.72174,-656.026027,182.972343,
+ -0.649152,0.262621,-0.713885,445.721732,-631.287828,194.729696,
+ 0.229025,-0.229739,0.945922,455.006085,-613.111378,235.617099,
+ 0.361665,-0.341228,0.867619,458.222244,-643.22526,225.027705,
+ 0.361665,-0.219818,0.906024,458.222231,-612.875739,234.648467,
+ 0.361665,-0.341228,0.867619,458.222244,-643.22526,225.027705,
+ 0.229025,-0.229739,0.945922,455.006085,-613.111378,235.617099,
+ 0.229025,-0.356494,0.905793,455.006098,-643.590692,225.955193,
+ -0,0.81044,-0.585821,0.016303,-722.503108,133.044187,
+ -0.040706,0.871018,-0.489562,429.267772,-737.984764,109.432572,
+ -0,0.882708,-0.469921,0.016298,-737.984793,109.432704,
+ -0.040706,0.871018,-0.489562,429.267772,-737.984764,109.432572,
+ -0,0.81044,-0.585821,0.016303,-722.503108,133.044187,
+ -0.040706,0.796183,-0.603686,429.267777,-722.503059,133.044086,
+ -0.040706,0.796183,-0.603686,429.267777,-722.503059,133.044086,
+ -0.150375,0.86173,-0.484571,432.838949,-737.730682,109.289775,
+ -0.040706,0.871018,-0.489562,429.267772,-737.984764,109.432572,
+ -0.150375,0.86173,-0.484571,432.838949,-737.730682,109.289775,
+ -0.040706,0.796183,-0.603686,429.267777,-722.503059,133.044086,
+ -0.150375,0.787661,-0.597476,432.838954,-722.270805,132.867998,
+ 0.127347,-0.98669,0.101126,624.955308,-764.385936,29.28956,
+ 0.030867,-0.971194,0.236282,599.602131,-761.101673,57.616723,
+ 0.030866,-0.994332,0.101738,599.602117,-765.945157,29.449075,
+ 0.030867,-0.971194,0.236282,599.602131,-761.101673,57.616723,
+ 0.127347,-0.98669,0.101126,624.955308,-764.385936,29.28956,
+ 0.127347,-0.963706,0.234635,624.955322,-759.578731,57.246228,
+ -0.928106,0.006604,-0.372257,753.576386,-546.993607,86.24593,
+ -0.96393,0,-0.266155,760.201807,-186.86272,65.860802,
+ -0.969674,0.004471,-0.24436,760.201807,-546.651151,65.860802,
+ -0.96393,0,-0.266155,760.201807,-186.86272,65.860802,
+ -0.928106,0.006604,-0.372257,753.576386,-546.993607,86.24593,
+ -0.919489,0,-0.393115,753.576386,-186.86272,86.24593,
+ -0.969674,0.004471,-0.24436,760.201807,-546.651151,65.860802,
+ -0.99093,0,-0.134378,764.031409,-186.86272,44.770904,
+ -0.9937,0.002257,-0.112046,764.031409,-546.296855,44.770904,
+ -0.99093,0,-0.134378,764.031409,-186.86272,44.770904,
+ -0.969674,0.004471,-0.24436,760.201807,-546.651151,65.860802,
+ -0.96393,0,-0.266155,760.201807,-186.86272,65.860802,
+ -0.494423,0.75738,-0.426523,684.332893,-694.910066,85.224197,
+ -0.606705,0.739249,-0.292265,702.221351,-693.120267,61.479696,
+ -0.494423,0.808436,-0.31934,684.332887,-704.132939,65.818702,
+ -0.606705,0.739249,-0.292265,702.221351,-693.120267,61.479696,
+ -0.494423,0.75738,-0.426523,684.332893,-694.910066,85.224197,
+ -0.614316,0.68383,-0.393691,702.221357,-684.591376,79.42501,
+ -0.649152,0.595502,-0.473264,445.721745,-717.576266,129.308758,
+ -0.748179,0.469999,-0.468325,448.282019,-697.799917,148.177329,
+ -0.748179,0.529432,-0.399912,448.282017,-715.574197,127.790857,
+ -0.748179,0.469999,-0.468325,448.282019,-697.799917,148.177329,
+ -0.649152,0.595502,-0.473264,445.721745,-717.576266,129.308758,
+ -0.649152,0.525457,-0.549997,445.721747,-699.576473,149.953886,
+ -0.022557,0.603993,-0.79667,602.133301,-665.362465,150.056725,
+ -0,0.509694,-0.860356,454.667766,-645.022494,163.39337,
+ -0.022557,0.4898,-0.871543,602.133296,-645.022449,163.39336,
+ -0,0.509694,-0.860356,454.667766,-645.022494,163.39337,
+ -0.022557,0.603993,-0.79667,602.133301,-665.362465,150.056725,
+ -0,0.622177,-0.782877,454.66777,-665.3625,150.056742,
+ 0.127347,-0.963706,0.234635,624.955322,-759.578731,57.246228,
+ 0.030867,-0.929938,0.366419,599.602143,-752.465071,84.861627,
+ 0.030867,-0.971194,0.236282,599.602131,-761.101673,57.616723,
+ 0.030867,-0.929938,0.366419,599.602143,-752.465071,84.861627,
+ 0.127347,-0.963706,0.234635,624.955322,-759.578731,57.246228,
+ 0.127347,-0.922744,0.363767,624.955334,-751.006818,84.287065,
+ -0,0.882708,-0.469921,0.016298,-737.984793,109.432704,
+ -0.040706,0.929604,-0.366305,429.267763,-750.104609,83.931667,
+ -0,0.938509,-0.345255,0.01629,-750.104623,83.931833,
+ -0.040706,0.929604,-0.366305,429.267763,-750.104609,83.931667,
+ -0,0.882708,-0.469921,0.016298,-737.984793,109.432704,
+ -0.040706,0.871018,-0.489562,429.267772,-737.984764,109.432572,
+ 0.999748,-0.021919,0.004805,473.717752,-761.101674,57.616782,
+ 0.997653,-0.068124,0.006968,473.642039,-769.30108,29.792441,
+ 0.999748,-0.022318,0.002282,473.717738,-765.945156,29.449145,
+ 0.997653,-0.068124,0.006968,473.642039,-769.30108,29.792441,
+ 0.999748,-0.021919,0.004805,473.717752,-761.101674,57.616782,
+ 0.995804,-0.089282,0.020098,473.642053,-764.379515,58.414175,
+ 0.091928,-0.601482,0.793579,451.683345,-699.535099,195.12947,
+ 0.229025,-0.688056,0.688568,455.006115,-723.308225,173.685638,
+ 0.229025,-0.58781,0.775904,455.006113,-699.207898,194.697902,
+ 0.229025,-0.688056,0.688568,455.006115,-723.308225,173.685638,
+ 0.091928,-0.601482,0.793579,451.683345,-699.535099,195.12947,
+ 0.091928,-0.70401,0.704215,451.683346,-723.691181,174.068594,
+ 0.995804,-0.035007,0.084556,473.642065,-635.720877,205.981096,
+ 0.973657,-0.113053,0.198017,473.101758,-663.582664,196.418147,
+ 0.995804,-0.046203,0.078997,473.642074,-661.950913,193.514715,
+ 0.973657,-0.113053,0.198017,473.101758,-663.582664,196.418147,
+ 0.995804,-0.035007,0.084556,473.642065,-635.720877,205.981096,
+ 0.973657,-0.085015,0.211575,473.101749,-636.941768,209.079797,
+ 0.609101,-0.770402,0.188354,717.894058,-722.308196,48.179466,
+ 0.499663,-0.805647,0.318231,696.758793,-728.459324,75.40331,
+ 0.499663,-0.841496,0.20548,696.758783,-736.031005,51.517793,
+ 0.499663,-0.805647,0.318231,696.758793,-728.459324,75.40331,
+ 0.609101,-0.770402,0.188354,717.894058,-722.308196,48.179466,
+ 0.609101,-0.737549,0.291577,717.894067,-715.319418,70.22617,
+ -0.537771,0.734555,-0.413801,442.839485,-734.454802,107.448703,
+ -0.649152,0.701164,-0.294909,445.721732,-744.352284,81.665241,
+ -0.537771,0.78409,-0.309846,442.839477,-746.337241,82.447316,
+ -0.649152,0.701164,-0.294909,445.721732,-744.352284,81.665241,
+ -0.537771,0.734555,-0.413801,442.839485,-734.454802,107.448703,
+ -0.649152,0.654437,-0.387703,445.72174,-732.59493,106.40344,
+ 0.381503,-0.452381,0.806106,673.957376,-653.15444,177.862935,
+ 0.499663,-0.522735,0.690714,696.758805,-668.611056,154.341548,
+ 0.499663,-0.423738,0.755502,696.7588,-647.656853,168.080895,
+ 0.499663,-0.522735,0.690714,696.758805,-668.611056,154.341548,
+ 0.381503,-0.452381,0.806106,673.957376,-653.15444,177.862935,
+ 0.381503,-0.558006,0.736942,673.957381,-675.390322,163.28321,
+ 0.256673,-0.473186,0.842742,649.884119,-657.135168,184.945974,
+ 0.381503,-0.558006,0.736942,673.957381,-675.390322,163.28321,
+ 0.381503,-0.452381,0.806106,673.957376,-653.15444,177.862935,
+ 0.381503,-0.558006,0.736942,673.957381,-675.390322,163.28321,
+ 0.256673,-0.473186,0.842742,649.884119,-657.135168,184.945974,
+ 0.256673,-0.583609,0.770402,649.884124,-680.299096,169.757745,
+ 0.127347,-0.48578,0.864755,624.955342,-659.530197,189.207523,
+ 0.256673,-0.583609,0.770402,649.884124,-680.299096,169.757745,
+ 0.256673,-0.473186,0.842742,649.884119,-657.135168,184.945974,
+ 0.256673,-0.583609,0.770402,649.884124,-680.299096,169.757745,
+ 0.127347,-0.48578,0.864755,624.955342,-659.530197,189.207523,
+ 0.127347,-0.599085,0.790493,624.955347,-683.252488,173.653183,
+ 0.030867,-0.489683,0.871354,599.602151,-660.298109,190.573883,
+ 0.127347,-0.599085,0.790493,624.955347,-683.252488,173.653183,
+ 0.127347,-0.48578,0.864755,624.955342,-659.530197,189.207523,
+ 0.127347,-0.599085,0.790493,624.955347,-683.252488,173.653183,
+ 0.030867,-0.489683,0.871354,599.602151,-660.298109,190.573883,
+ 0.030867,-0.603851,0.796499,599.602156,-684.199423,174.90216,
+ 0,-0.509694,0.860356,473.717772,-660.298148,190.573891,
+ 0.030867,-0.603851,0.796499,599.602156,-684.199423,174.90216,
+ 0.030867,-0.489683,0.871354,599.602151,-660.298109,190.573883,
+ 0.030867,-0.603851,0.796499,599.602156,-684.199423,174.90216,
+ 0,-0.509694,0.860356,473.717772,-660.298148,190.573891,
+ 0,-0.622177,0.782877,473.717777,-684.199453,174.902175,
+ 0.999748,-0.011437,0.019306,473.717772,-660.298148,190.573891,
+ 0.995804,-0.056536,0.071964,473.642079,-686.237536,177.590351,
+ 0.999748,-0.013961,0.017568,473.717777,-684.199453,174.902175,
+ 0.995804,-0.056536,0.071964,473.642079,-686.237536,177.590351,
+ 0.999748,-0.011437,0.019306,473.717772,-660.298148,190.573891,
+ 0.995804,-0.046203,0.078997,473.642074,-661.950913,193.514715,
+ 0.995804,-0.046203,0.078997,473.642074,-661.950913,193.514715,
+ 0.973657,-0.138981,0.180764,473.101763,-688.249706,180.244348,
+ 0.995804,-0.056536,0.071964,473.642079,-686.237536,177.590351,
+ 0.973657,-0.138981,0.180764,473.101763,-688.249706,180.244348,
+ 0.995804,-0.046203,0.078997,473.642074,-661.950913,193.514715,
+ 0.973657,-0.113053,0.198017,473.101758,-663.582664,196.418147,
+ -0.285905,0.677271,-0.67791,436.335627,-703.188138,153.565551,
+ -0.415875,0.72429,-0.549957,439.690621,-720.641807,131.632947,
+ -0.285905,0.76333,-0.579298,436.335626,-721.646389,132.394587,
+ -0.415875,0.72429,-0.549957,439.690621,-720.641807,131.632947,
+ -0.285905,0.677271,-0.67791,436.335627,-703.188138,153.565551,
+ -0.415875,0.642593,-0.643523,439.690622,-702.296712,152.674124,
+ 0.997846,-0.065595,-0,847.545902,-563.749227,0,
+ 0.991423,-0.130694,-0,843.130723,-608.452917,23.357838,
+ 0.986627,-0.162996,-0,843.130723,-608.452917,-0,
+ 0.991423,-0.130694,-0,843.130723,-608.452917,23.357838,
+ 0.997846,-0.065595,-0,847.545902,-563.749227,0,
+ 0.999698,-0.024594,-0,847.545902,-563.749227,23.357838,
+ 0.012852,-0.014396,0.999814,448.31772,-549.622454,242.726639,
+ 0.068639,0,0.997642,451.683281,-186.86272,242.65094,
+ 0.007496,-0,0.999972,448.31772,-186.86272,242.726639,
+ 0.068639,0,0.997642,451.683281,-186.86272,242.65094,
+ 0.012852,-0.014396,0.999814,448.31772,-549.622454,242.726639,
+ 0.114758,-0.016686,0.993253,451.683281,-549.621181,242.65094,
+ 0.874212,-0.294445,0.386077,470.677524,-692.04293,185.247507,
+ 0.79876,-0.426323,0.424536,468.840171,-716.92159,167.299002,
+ 0.874212,-0.344308,0.342352,470.677525,-714.922322,165.299734,
+ 0.79876,-0.426323,0.424536,468.840171,-716.92159,167.299002,
+ 0.874212,-0.294445,0.386077,470.677524,-692.04293,185.247507,
+ 0.79876,-0.364496,0.47867,468.840169,-693.751117,187.500559,
+ 0,-0.622177,0.782877,473.717777,-684.199453,174.902175,
+ 0.030867,-0.706755,0.706785,599.602158,-705.742267,156.119679,
+ 0.030867,-0.603851,0.796499,599.602156,-684.199423,174.90216,
+ 0.030867,-0.706755,0.706785,599.602158,-705.742267,156.119679,
+ 0,-0.622177,0.782877,473.717777,-684.199453,174.902175,
+ 0,-0.723053,0.690793,473.717779,-705.742288,156.119701,
+ 0.973657,-0.182625,0.136528,473.101763,-729.866936,138.627118,
+ 0.932875,-0.314728,0.175187,472.107204,-748.850999,115.539467,
+ 0.973657,-0.199526,0.110368,473.101758,-746.040734,113.960076,
+ 0.932875,-0.314728,0.175187,472.107204,-748.850999,115.539467,
+ 0.973657,-0.182625,0.136528,473.101763,-729.866936,138.627118,
+ 0.932875,-0.28792,0.21644,472.107209,-732.43577,140.574721,
+ 0.932875,-0.28792,0.21644,472.107209,-732.43577,140.574721,
+ 0.874212,-0.423953,0.236679,470.677518,-751.514112,117.036157,
+ 0.932875,-0.314728,0.175187,472.107204,-748.850999,115.539467,
+ 0.874212,-0.423953,0.236679,470.677518,-751.514112,117.036157,
+ 0.932875,-0.28792,0.21644,472.107209,-732.43577,140.574721,
+ 0.874212,-0.387747,0.292242,470.677524,-734.870094,142.420342,
+ 0.874212,-0.387747,0.292242,470.677524,-734.870094,142.420342,
+ 0.79876,-0.525111,0.293667,468.840164,-753.978916,118.421396,
+ 0.874212,-0.423953,0.236679,470.677518,-751.514112,117.036157,
+ 0.79876,-0.525111,0.293667,468.840164,-753.978916,118.421396,
+ 0.874212,-0.387747,0.292242,470.677524,-734.870094,142.420342,
+ 0.79876,-0.480196,0.362483,468.840169,-737.123146,144.128529,
+ -0.901181,0.307496,-0.305481,452.247015,-693.58391,143.961322,
+ -0.952384,0.185405,-0.242052,453.575571,-671.796178,158.542589,
+ -0.952384,0.216659,-0.21453,453.575573,-691.225448,141.602861,
+ -0.952384,0.185405,-0.242052,453.575571,-671.796178,158.542589,
+ -0.901181,0.307496,-0.305481,452.247015,-693.58391,143.961322,
+ -0.901181,0.263001,-0.344532,452.247014,-673.811262,161.200429,
+ 0.20592,-0.978017,0.032869,455.006064,-790.947849,23.357838,
+ 0.091928,-0.990581,0.101478,451.683301,-791.19694,32.032304,
+ 0.068639,-0.997079,0.03351,451.683295,-791.488471,23.357838,
+ 0.091928,-0.990581,0.101478,451.683301,-791.19694,32.032304,
+ 0.20592,-0.978017,0.032869,455.006064,-790.947849,23.357838,
+ 0.229024,-0.96833,0.09942,455.006069,-790.65817,31.977188,
+ 0.972038,0,0.234823,787.130168,-186.86272,73.639808,
+ 0.98887,-0.002499,0.148764,792.007202,-546.363038,48.711029,
+ 0.994447,0,0.105242,792.007202,-186.86272,48.711029,
+ 0.98887,-0.002499,0.148764,792.007202,-546.363038,48.711029,
+ 0.972038,0,0.234823,787.130168,-186.86272,73.639808,
+ 0.9608,-0.004657,0.277203,787.130168,-546.781824,73.639808,
+ -0,0.976801,-0.214147,454.667749,-730.806274,50.246897,
+ -0.022557,0.994554,-0.10175,602.133267,-734.928078,26.276163,
+ -0,0.996871,-0.079045,454.667737,-734.928076,26.276244,
+ -0.022557,0.994554,-0.10175,602.133267,-734.928078,26.276163,
+ -0,0.976801,-0.214147,454.667749,-730.806274,50.246897,
+ -0.022557,0.971412,-0.236325,602.13328,-730.806273,50.246828,
+ 0.79876,-0.480196,0.362483,468.840169,-737.123146,144.128529,
+ 0.717647,-0.602641,0.349008,466.630436,-756.198062,119.668573,
+ 0.79876,-0.525111,0.293667,468.840164,-753.978916,118.421396,
+ 0.717647,-0.602641,0.349008,466.630436,-756.198062,119.668573,
+ 0.79876,-0.480196,0.362483,468.840169,-737.123146,144.128529,
+ 0.707932,-0.563486,0.425811,466.630442,-739.151644,145.666467,
+ -0.244971,0.355055,-0.902178,644.636252,-621.293309,169.363128,
+ -0.112343,0.23471,-0.965552,623.546346,-599.640892,180.244333,
+ -0.244971,0.228806,-0.942145,644.636243,-598.733545,176.514546,
+ -0.112343,0.23471,-0.965552,623.546346,-599.640892,180.244333,
+ -0.244971,0.355055,-0.902178,644.636252,-621.293309,169.363128,
+ -0.112343,0.364093,-0.924562,623.546355,-622.700434,172.934486,
+ 0,-0.258478,0.966017,473.717752,-607.239369,211.479086,
+ 0.030867,-0.366379,0.929954,599.602143,-634.484215,202.842483,
+ 0.030867,-0.23624,0.971204,599.602131,-607.23931,211.479086,
+ 0.030867,-0.366379,0.929954,599.602143,-634.484215,202.842483,
+ 0,-0.258478,0.966017,473.717752,-607.239369,211.479086,
+ 0,-0.387702,0.921785,473.717764,-634.484263,202.842487,
+ 0.794465,-0.565471,0.221515,753.73928,-681.891377,57.055486,
+ 0.707841,-0.682368,0.182581,736.997677,-706.002952,44.212918,
+ 0.800126,-0.584324,0.13551,753.739273,-687.397248,39.686742,
+ 0.707841,-0.682368,0.182581,736.997677,-706.002952,44.212918,
+ 0.794465,-0.565471,0.221515,753.73928,-681.891377,57.055486,
+ 0.707841,-0.651123,0.273862,736.997686,-699.706769,64.074769,
+ 0.616524,-0.682339,0.392825,717.894074,-705.391609,91.114894,
+ 0.499663,-0.689808,0.523929,696.758805,-703.964135,118.988469,
+ 0.499663,-0.754768,0.425045,696.7588,-717.703482,98.034266,
+ 0.499663,-0.689808,0.523929,696.758805,-703.964135,118.988469,
+ 0.616524,-0.682339,0.392825,717.894074,-705.391609,91.114894,
+ 0.609002,-0.620953,0.493491,717.894078,-692.709977,110.455949,
+ 0.995785,-0,0.091715,473.642021,-186.86272,220.6922,
+ 0.999747,-0.000377,0.02248,473.71772,-549.195746,217.326639,
+ 0.999747,0,0.022487,473.71772,-186.86272,217.326639,
+ 0.999747,-0.000377,0.02248,473.71772,-549.195746,217.326639,
+ 0.995785,-0,0.091715,473.642021,-186.86272,220.6922,
+ 0.994417,-0.002312,0.105501,473.642021,-549.252285,220.6922,
+ 0.361665,-0.341228,0.867619,458.222244,-643.22526,225.027705,
+ 0.487279,-0.427162,0.761638,461.269994,-671.27861,210.111812,
+ 0.487278,-0.319392,0.812741,461.269985,-642.699947,223.694428,
+ 0.487279,-0.427162,0.761638,461.269994,-671.27861,210.111812,
+ 0.361665,-0.341228,0.867619,458.222244,-643.22526,225.027705,
+ 0.361665,-0.456272,0.813028,458.222253,-671.980704,211.361071,
+ -0.985345,0.084925,-0.14793,454.431271,-648.531199,169.636534,
+ -0.999454,0.013569,-0.030128,454.797676,-624.370524,177.173126,
+ -0.999454,0.017548,-0.027998,454.797683,-646.780881,166.522129,
+ -0.999454,0.013569,-0.030128,454.797676,-624.370524,177.173126,
+ -0.985345,0.084925,-0.14793,454.431271,-648.531199,169.636534,
+ -0.985345,0.063975,-0.158123,454.431263,-625.680129,180.496989,
+ -0,0.976801,-0.214147,0.016279,-758.636496,57.017305,
+ -0.040706,0.99398,-0.101718,429.267738,-763.421251,29.190985,
+ -0,0.996871,-0.079045,0.016265,-763.421248,29.191222,
+ -0.040706,0.99398,-0.101718,429.267738,-763.421251,29.190985,
+ -0,0.976801,-0.214147,0.016279,-758.636496,57.017305,
+ -0.040706,0.970848,-0.236215,429.267752,-758.636494,57.017104,
+ -0.832126,0.009639,-0.554503,450.471071,-548.95985,203.284158,
+ -0.890491,0,-0.455,452.246961,-186.86272,200.172234,
+ -0.90081,0.007643,-0.434147,452.246961,-548.907571,200.172234,
+ -0.890491,0,-0.455,452.246961,-186.86272,200.172234,
+ -0.832126,0.009639,-0.554503,450.471071,-548.95985,203.284158,
+ -0.819027,0,-0.573755,450.471071,-186.86272,203.284158,
+ 0.229025,-0.356494,0.905793,455.006098,-643.590692,225.955193,
+ 0.361665,-0.456272,0.813028,458.222253,-671.980704,211.361071,
+ 0.361665,-0.341228,0.867619,458.222244,-643.22526,225.027705,
+ 0.361665,-0.456272,0.813028,458.222253,-671.980704,211.361071,
+ 0.229025,-0.356494,0.905793,455.006098,-643.590692,225.955193,
+ 0.229025,-0.476597,0.848766,455.006107,-672.469112,212.230111,
+ -0.993727,0.098232,-0.053457,764.031424,-589.417442,25.936523,
+ -0.998992,0.039135,-0.021994,764.267941,-584.829097,23.357838,
+ -0.99093,0.121368,-0.057682,764.031423,-590.643016,23.357838,
+ -0.150375,0.86173,-0.484571,432.838949,-737.730682,109.289775,
+ -0.285905,0.891387,-0.351693,436.335613,-749.104397,83.53758,
+ -0.150375,0.919722,-0.362627,432.838941,-749.833439,83.824825,
+ -0.285905,0.891387,-0.351693,436.335613,-749.104397,83.53758,
+ -0.150375,0.86173,-0.484571,432.838949,-737.730682,109.289775,
+ -0.285905,0.835148,-0.469878,436.335621,-737.047581,108.905866,
+ 0.995804,-0.073866,0.054027,473.642079,-727.212939,136.614949,
+ 0.973657,-0.199526,0.110368,473.101758,-746.040734,113.960076,
+ 0.995804,-0.08054,0.043457,473.642074,-743.137303,112.328326,
+ 0.973657,-0.199526,0.110368,473.101758,-746.040734,113.960076,
+ 0.995804,-0.073866,0.054027,473.642079,-727.212939,136.614949,
+ 0.973657,-0.182625,0.136528,473.101763,-729.866936,138.627118,
+ 0.707932,-0.427549,0.562168,736.997696,-649.94032,129.715362,
+ 0.609002,-0.547915,0.573503,717.894079,-677.511106,127.888519,
+ 0.707932,-0.500166,0.498664,736.997697,-665.645303,116.022715,
+ 0.609002,-0.547915,0.573503,717.894079,-677.511106,127.888519,
+ 0.707932,-0.427549,0.562168,736.997696,-649.94032,129.715362,
+ 0.609002,-0.464655,0.642816,717.894078,-660.078536,143.08739,
+ 0.499663,-0.522735,0.690714,696.758805,-668.611056,154.341548,
+ 0.609002,-0.547915,0.573503,717.894079,-677.511106,127.888519,
+ 0.609002,-0.464655,0.642816,717.894078,-660.078536,143.08739,
+ 0.609002,-0.547915,0.573503,717.894079,-677.511106,127.888519,
+ 0.499663,-0.522735,0.690714,696.758805,-668.611056,154.341548,
+ 0.499663,-0.61198,0.61304,696.758806,-687.497596,137.875009,
+ 0.381503,-0.558006,0.736942,673.957381,-675.390322,163.28321,
+ 0.499663,-0.61198,0.61304,696.758806,-687.497596,137.875009,
+ 0.499663,-0.522735,0.690714,696.758805,-668.611056,154.341548,
+ 0.499663,-0.61198,0.61304,696.758806,-687.497596,137.875009,
+ 0.381503,-0.558006,0.736942,673.957381,-675.390322,163.28321,
+ 0.381503,-0.653222,0.654031,673.957383,-695.432071,145.809483,
+ 0.256673,-0.583609,0.770402,649.884124,-680.299096,169.757745,
+ 0.381503,-0.653222,0.654031,673.957383,-695.432071,145.809483,
+ 0.381503,-0.558006,0.736942,673.957381,-675.390322,163.28321,
+ 0.381503,-0.653222,0.654031,673.957383,-695.432071,145.809483,
+ 0.256673,-0.583609,0.770402,649.884124,-680.299096,169.757745,
+ 0.256673,-0.683145,0.68369,649.884126,-701.177315,151.554728,
+ 0.127347,-0.599085,0.790493,624.955347,-683.252488,173.653183,
+ 0.256673,-0.683145,0.68369,649.884126,-701.177315,151.554728,
+ 0.256673,-0.583609,0.770402,649.884124,-680.299096,169.757745,
+ 0.256673,-0.683145,0.68369,649.884126,-701.177315,151.554728,
+ 0.127347,-0.599085,0.790493,624.955347,-683.252488,173.653183,
+ 0.127347,-0.701215,0.701485,624.955349,-704.633973,155.011385,
+ 0.867227,-0.434695,0.24281,767.829333,-655.602109,63.132805,
+ 0.794465,-0.565471,0.221515,753.73928,-681.891377,57.055486,
+ 0.867227,-0.463727,0.18131,767.829328,-662.181333,49.28971,
+ 0.794465,-0.565471,0.221515,753.73928,-681.891377,57.055486,
+ 0.867227,-0.434695,0.24281,767.829333,-655.602109,63.132805,
+ 0.794465,-0.530011,0.296503,753.739286,-674.070091,73.511955,
+ 0.794465,-0.530011,0.296503,753.739286,-674.070091,73.511955,
+ 0.707841,-0.651123,0.273862,736.997686,-699.706769,64.074769,
+ 0.794465,-0.565471,0.221515,753.73928,-681.891377,57.055486,
+ 0.707841,-0.651123,0.273862,736.997686,-699.706769,64.074769,
+ 0.794465,-0.530011,0.296503,753.739286,-674.070091,73.511955,
+ 0.717149,-0.603071,0.349289,736.997692,-690.762817,82.893397,
+ 0.707841,-0.651123,0.273862,736.997686,-699.706769,64.074769,
+ 0.616524,-0.682339,0.392825,717.894074,-705.391609,91.114894,
+ 0.609101,-0.737549,0.291577,717.894067,-715.319418,70.22617,
+ 0.616524,-0.682339,0.392825,717.894074,-705.391609,91.114894,
+ 0.707841,-0.651123,0.273862,736.997686,-699.706769,64.074769,
+ 0.717149,-0.603071,0.349289,736.997692,-690.762817,82.893397,
+ 0.487278,-0.319392,0.812741,461.269985,-642.699947,223.694428,
+ 0.592261,-0.384709,0.707974,464.090784,-670.376318,208.506333,
+ 0.603443,-0.29142,0.742247,464.090775,-642.024843,221.980973,
+ 0.592261,-0.384709,0.707974,464.090784,-670.376318,208.506333,
+ 0.487278,-0.319392,0.812741,461.269985,-642.699947,223.694428,
+ 0.487279,-0.427162,0.761638,461.269994,-671.27861,210.111812,
+ 0.603443,-0.774584,0.189413,464.090763,-781.089165,62.479098,
+ 0.487278,-0.812176,0.320826,461.269985,-773.317015,93.077359,
+ 0.487278,-0.848318,0.207161,461.269972,-782.878631,62.914419,
+ 0.487278,-0.812176,0.320826,461.269985,-773.317015,93.077359,
+ 0.603443,-0.774584,0.189413,464.090763,-781.089165,62.479098,
+ 0.603443,-0.741548,0.293196,464.090775,-771.60356,92.402256,
+ -0.832687,0.538362,-0.129611,450.471101,-747.425197,54.289747,
+ -0.901181,0.40379,-0.157562,452.247002,-736.467457,78.558611,
+ -0.901181,0.421494,-0.101069,452.246991,-744.394382,53.552447,
+ -0.901181,0.40379,-0.157562,452.247002,-736.467457,78.558611,
+ -0.832687,0.538362,-0.129611,450.471101,-747.425197,54.289747,
+ -0.832687,0.515679,-0.201762,450.471112,-739.369533,79.702032,
+ -0.901181,0.421494,-0.101069,452.246991,-744.394382,53.552447,
+ -0.952384,0.284225,-0.110366,453.575559,-733.364268,77.335952,
+ -0.952384,0.296613,-0.070606,453.575549,-741.153531,52.764052,
+ -0.952384,0.284225,-0.110366,453.575559,-733.364268,77.335952,
+ -0.901181,0.421494,-0.101069,452.246991,-744.394382,53.552447,
+ -0.901181,0.40379,-0.157562,452.247002,-736.467457,78.558611,
+ -0.952384,0.296613,-0.070606,453.575549,-741.153531,52.764052,
+ -0.985345,0.159265,-0.061075,454.431263,-730.119577,76.057541,
+ -0.985345,0.166102,-0.038803,454.431253,-737.764902,51.939707,
+ -0.985345,0.159265,-0.061075,454.431263,-730.119577,76.057541,
+ -0.952384,0.296613,-0.070606,453.575549,-741.153531,52.764052,
+ -0.952384,0.284225,-0.110366,453.575559,-733.364268,77.335952,
+ -0.985345,0.166102,-0.038803,454.431253,-737.764902,51.939707,
+ -0.999454,0.031287,-0.010628,454.797676,-726.795714,74.747937,
+ -0.999454,0.032443,-0.006265,454.797666,-734.293588,51.095248,
+ -0.999454,0.031287,-0.010628,454.797676,-726.795714,74.747937,
+ -0.985345,0.166102,-0.038803,454.431253,-737.764902,51.939707,
+ -0.985345,0.159265,-0.061075,454.431263,-730.119577,76.057541,
+ -0.999454,0.032443,-0.006265,454.797666,-734.293588,51.095248,
+ -0.999345,-0.033959,0.012493,454.667758,-723.45653,73.432296,
+ -0.999345,-0.035345,0.007749,454.667749,-730.806274,50.246897,
+ -0.999345,-0.033959,0.012493,454.667758,-723.45653,73.432296,
+ -0.999454,0.032443,-0.006265,454.797666,-734.293588,51.095248,
+ -0.999454,0.031287,-0.010628,454.797676,-726.795714,74.747937,
+ -0,0.938509,-0.345255,454.667758,-723.45653,73.432296,
+ -0.022557,0.971412,-0.236325,602.13328,-730.806273,50.246828,
+ -0,0.976801,-0.214147,454.667749,-730.806274,50.246897,
+ -0.022557,0.971412,-0.236325,602.13328,-730.806273,50.246828,
+ -0,0.938509,-0.345255,454.667758,-723.45653,73.432296,
+ -0.022557,0.930148,-0.366491,602.133289,-723.456525,73.43224,
+ -0.022557,0.930148,-0.366491,602.133289,-723.456525,73.43224,
+ -0.112343,0.96547,-0.235045,623.546346,-729.866921,50.018304,
+ -0.022557,0.971412,-0.236325,602.13328,-730.806273,50.246828,
+ -0.112343,0.96547,-0.235045,623.546346,-729.866921,50.018304,
+ -0.022557,0.930148,-0.366491,602.133289,-723.456525,73.43224,
+ -0.112343,0.924436,-0.364414,623.546355,-722.557073,73.077847,
+ -0.112343,0.924436,-0.364414,623.546355,-722.557073,73.077847,
+ -0.244971,0.941967,-0.229537,644.636243,-726.137133,49.110957,
+ -0.112343,0.96547,-0.235045,623.546346,-729.866921,50.018304,
+ -0.244971,0.941967,-0.229537,644.636243,-726.137133,49.110957,
+ -0.112343,0.924436,-0.364414,623.546355,-722.557073,73.077847,
+ -0.244971,0.901902,-0.355754,644.636252,-718.985715,71.670721,
+ -0.244971,0.901902,-0.355754,644.636252,-718.985715,71.670721,
+ -0.373111,0.90136,-0.219861,665.02137,-719.684398,47.541206,
+ -0.244971,0.941967,-0.229537,644.636243,-726.137133,49.110957,
+ -0.373111,0.90136,-0.219861,665.02137,-719.684398,47.541206,
+ -0.244971,0.901902,-0.355754,644.636252,-718.985715,71.670721,
+ -0.373111,0.862993,-0.340635,665.021379,-712.807071,69.236324,
+ -0.787976,0.615705,-0,672.962315,-626.669842,-0,
+ -0.828968,0.559296,-0,681.15025,-615.40225,5.83946,
+ -0.847987,0.530018,-0,681.15025,-615.40225,-0,
+ -0.828968,0.559296,-0,681.15025,-615.40225,5.83946,
+ -0.787976,0.615705,-0,672.962315,-626.669842,-0,
+ -0.766003,0.642837,-0,672.962315,-626.669842,5.83946,
+ -0,-0,-1,700.992217,-563.749227,5.83946,
+ -0,0,-1,0.001765,-186.86272,5.83946,
+ 0,0,-1,764.9959,-186.86272,5.83946,
+ -0,0,-1,0.001765,-186.86272,5.83946,
+ -0,-0,-1,700.992217,-563.749227,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,700.992217,-563.749227,5.83946,
+ -0,-0,-1,698.091838,-577.372321,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,698.091838,-577.372321,5.83946,
+ -0,-0,-1,693.784142,-590.617874,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,693.784142,-590.617874,5.83946,
+ -0,-0,-1,688.11627,-603.340929,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,688.11627,-603.340929,5.83946,
+ -0,-0,-1,681.15025,-615.40225,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,681.15025,-615.40225,5.83946,
+ -0,-0,-1,672.962315,-626.669842,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,672.962315,-626.669842,5.83946,
+ -0,-0,-1,663.642072,-637.020396,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,663.642072,-637.020396,5.83946,
+ -0,-0,-1,653.291518,-646.340639,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,653.291518,-646.340639,5.83946,
+ -0,-0,-1,642.023926,-654.528574,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,642.023926,-654.528574,5.83946,
+ -0,-0,-1,629.962605,-661.494594,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,629.962605,-661.494594,5.83946,
+ -0,-0,-1,617.239549,-667.162466,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,617.239549,-667.162466,5.83946,
+ -0,-0,-1,603.993997,-671.470162,5.83946,
+ -0,-0,-1,0.000468,-674.370541,5.83946,
+ -0,-0,-1,603.993997,-671.470162,5.83946,
+ 0,-0,-1,590.370902,-674.370541,5.83946,
+ -0.898717,0.438529,-0,688.11627,-603.340929,-0,
+ -0.927092,0.374833,-0,693.784142,-590.617874,5.83946,
+ -0.939612,0.342242,0,693.784142,-590.617874,-0,
+ -0.927092,0.374833,-0,693.784142,-590.617874,5.83946,
+ -0.898717,0.438529,-0,688.11627,-603.340929,-0,
+ -0.882861,0.469634,-0,688.11627,-603.340929,5.83946,
+ -0.719343,0.694655,-0,663.642072,-637.020396,-0,
+ -0.766003,0.642837,-0,672.962315,-626.669842,5.83946,
+ -0.787976,0.615705,-0,672.962315,-626.669842,-0,
+ -0.766003,0.642837,-0,672.962315,-626.669842,5.83946,
+ -0.719343,0.694655,-0,663.642072,-637.020396,-0,
+ -0.694655,0.719343,-0,663.642072,-637.020396,5.83946,
+ -0.694655,0.719343,-0,663.642072,-637.020396,5.83946,
+ -0.642837,0.766003,-0,653.291518,-646.340639,-0,
+ -0.615705,0.787976,-0,653.291518,-646.340639,5.83946,
+ -0.642837,0.766003,-0,653.291518,-646.340639,-0,
+ -0.694655,0.719343,-0,663.642072,-637.020396,5.83946,
+ -0.719343,0.694655,-0,663.642072,-637.020396,-0,
+ -0.985345,0.159265,-0.061075,454.431263,-730.119577,76.057541,
+ -0.999454,0.029547,-0.014792,454.797683,-716.144717,97.158293,
+ -0.999454,0.031287,-0.010628,454.797676,-726.795714,74.747937,
+ -0.999454,0.029547,-0.014792,454.797683,-716.144717,97.158293,
+ -0.985345,0.159265,-0.061075,454.431263,-730.119577,76.057541,
+ -0.985345,0.149457,-0.082208,454.431271,-719.259121,98.908612,
+ -0.040706,0.489496,-0.871055,429.267772,-659.055159,188.362176,
+ -0,0.387702,-0.921785,0.01629,-633.55442,200.482036,
+ -0.040706,0.366235,-0.929632,429.267763,-633.554255,200.482022,
+ -0,0.387702,-0.921785,0.01629,-633.55442,200.482036,
+ -0.040706,0.489496,-0.871055,429.267772,-659.055159,188.362176,
+ -0,0.509694,-0.860356,0.016298,-659.055291,188.362206,
+ 0.091928,-0.364886,0.926503,451.68333,-643.789223,226.459074,
+ 0.229025,-0.476597,0.848766,455.006107,-672.469112,212.230111,
+ 0.229025,-0.356494,0.905793,455.006098,-643.590692,225.955193,
+ 0.229025,-0.476597,0.848766,455.006107,-672.469112,212.230111,
+ 0.091928,-0.364886,0.926503,451.68333,-643.789223,226.459074,
+ 0.091928,-0.487734,0.868139,451.683339,-672.734453,212.70224,
+ -0.244971,0.685296,-0.685827,644.636265,-680.297547,130.67496,
+ -0.373111,0.738976,-0.560984,665.02139,-690.558191,108.824546,
+ -0.244971,0.772358,-0.586047,644.636264,-695.850119,112.836708,
+ -0.373111,0.738976,-0.560984,665.02139,-690.558191,108.824546,
+ -0.244971,0.685296,-0.685827,644.636265,-680.297547,130.67496,
+ -0.373111,0.655639,-0.656449,665.021391,-675.601701,125.979113,
+ 0.487278,-0.848318,0.207161,461.269972,-782.878631,62.914419,
+ 0.361665,-0.867199,0.342292,458.222244,-774.650293,93.602673,
+ 0.361665,-0.905753,0.220929,458.222231,-784.271055,63.253152,
+ 0.361665,-0.867199,0.342292,458.222244,-774.650293,93.602673,
+ 0.487278,-0.848318,0.207161,461.269972,-782.878631,62.914419,
+ 0.487278,-0.812176,0.320826,461.269985,-773.317015,93.077359,
+ -0.748179,0.244321,-0.616875,448.282005,-630.366836,192.392159,
+ -0.832687,0.13217,-0.53774,450.471101,-603.912334,197.80261,
+ -0.832687,0.204213,-0.514714,450.471112,-629.324619,189.746946,
+ -0.832687,0.13217,-0.53774,450.471101,-603.912334,197.80261,
+ -0.748179,0.244321,-0.616875,448.282005,-630.366836,192.392159,
+ -0.741547,0.152765,-0.653277,448.281994,-604.584377,200.565168,
+ 0.79876,-0.221723,0.559304,468.840155,-640.279768,217.551861,
+ 0.700875,-0.343846,0.624935,466.630436,-669.291161,206.575475,
+ 0.79876,-0.29587,0.523873,468.840164,-668.043983,204.356329,
+ 0.700875,-0.343846,0.624935,466.630436,-669.291161,206.575475,
+ 0.79876,-0.221723,0.559304,468.840155,-640.279768,217.551861,
+ 0.707841,-0.243878,0.662936,466.630427,-641.212918,219.920255,
+ -0.999454,0.017548,-0.027998,454.797683,-646.780881,166.522129,
+ -0.999345,-0.014029,0.033354,454.667758,-623.054884,173.833943,
+ -0.999345,-0.018443,0.031131,454.667766,-645.022494,163.39337,
+ -0.999345,-0.014029,0.033354,454.667758,-623.054884,173.833943,
+ -0.999454,0.017548,-0.027998,454.797683,-646.780881,166.522129,
+ -0.999454,0.013569,-0.030128,454.797676,-624.370524,177.173126,
+ -0.022557,0.4898,-0.871543,602.133296,-645.022449,163.39336,
+ -0,0.387702,-0.921785,454.667758,-623.054884,173.833943,
+ -0.022557,0.36647,-0.930156,602.133289,-623.054827,173.833938,
+ -0,0.387702,-0.921785,454.667758,-623.054884,173.833943,
+ -0.022557,0.4898,-0.871543,602.133296,-645.022449,163.39336,
+ -0,0.509694,-0.860356,454.667766,-645.022494,163.39337,
+ 0.603443,-0.741548,0.293196,464.090775,-771.60356,92.402256,
+ 0.487279,-0.760883,0.428506,461.269994,-759.734399,121.656023,
+ 0.487278,-0.812176,0.320826,461.269985,-773.317015,93.077359,
+ 0.487279,-0.760883,0.428506,461.269994,-759.734399,121.656023,
+ 0.603443,-0.741548,0.293196,464.090775,-771.60356,92.402256,
+ 0.611311,-0.685845,0.394863,464.090784,-758.12892,120.753731,
+ 0.229025,-0.476597,0.848766,455.006107,-672.469112,212.230111,
+ 0.361665,-0.562804,0.74327,458.222259,-698.605625,193.903521,
+ 0.361665,-0.456272,0.813028,458.222253,-671.980704,211.361071,
+ 0.361665,-0.562804,0.74327,458.222259,-698.605625,193.903521,
+ 0.229025,-0.476597,0.848766,455.006107,-672.469112,212.230111,
+ 0.229025,-0.58781,0.775904,455.006113,-699.207898,194.697902,
+ -0.527988,0,-0.849252,100.155807,-186.86272,2052.977553,
+ -0.382683,0,-0.92388,69.023518,-280.29408,2069.618109,
+ -0.382683,0,-0.92388,69.023518,-186.86272,2069.618109,
+ -0.382683,0,-0.92388,69.023518,-280.29408,2069.618109,
+ -0.527988,0,-0.849252,100.155807,-186.86272,2052.977553,
+ -0.582554,0,-0.812792,100.155807,-280.29408,2052.977553,
+ -0.582554,0,0.812792,100.155807,-280.29408,1753.526669,
+ -0.707107,0,0.707107,127.443487,-186.86272,1775.921089,
+ -0.527988,0,0.849252,100.155807,-186.86272,1753.526669,
+ -0.707107,0,0.707107,127.443487,-186.86272,1775.921089,
+ -0.582554,0,0.812792,100.155807,-280.29408,1753.526669,
+ -0.707107,0,0.707107,127.443487,-280.29408,1775.921089,
+ -0.812792,0,0.582554,149.837908,-280.29408,1803.208769,
+ -0.707107,0,0.707107,127.443487,-186.86272,1775.921089,
+ -0.707107,0,0.707107,127.443487,-280.29408,1775.921089,
+ -0.707107,0,0.707107,127.443487,-186.86272,1775.921089,
+ -0.812792,0,0.582554,149.837908,-280.29408,1803.208769,
+ -0.849252,0,0.527988,149.837908,-186.86272,1803.208769,
+ -0.849252,0,-0.527988,149.837908,-280.29408,2003.295453,
+ -0.910825,0,-0.412792,166.478463,-186.86272,1972.163164,
+ -0.935939,0,-0.352162,166.478463,-280.29408,1972.163164,
+ -0.910825,0,-0.412792,166.478463,-186.86272,1972.163164,
+ -0.849252,0,-0.527988,149.837908,-280.29408,2003.295453,
+ -0.812792,0,-0.582554,149.837908,-186.86272,2003.295453,
+ -0.870211,0.298718,-0.391791,744.275058,-616.515297,85.628667,
+ -0.928388,0.183307,-0.323257,753.57641,-595.926736,76.035688,
+ -0.928388,0.225646,-0.295263,753.576412,-604.820821,70.203974,
+ -0.928388,0.183307,-0.323257,753.57641,-595.926736,76.035688,
+ -0.870211,0.298718,-0.391791,744.275058,-616.515297,85.628667,
+ -0.870211,0.242544,-0.428841,744.275056,-605.410265,92.910065,
+ 0.973657,-0.085015,0.211575,473.101749,-636.941768,209.079797,
+ 0.932875,-0.177759,0.313282,472.107204,-665.162054,199.228412,
+ 0.973657,-0.113053,0.198017,473.101758,-663.582664,196.418147,
+ 0.932875,-0.177759,0.313282,472.107204,-665.162054,199.228412,
+ 0.973657,-0.085015,0.211575,473.101749,-636.941768,209.079797,
+ 0.932875,-0.133411,0.334583,472.107195,-638.123482,212.079066,
+ -0.112343,0.364093,-0.924562,623.546355,-622.700434,172.934486,
+ -0.022557,0.236303,-0.971418,602.13328,-599.869416,181.183686,
+ -0.112343,0.23471,-0.965552,623.546346,-599.640892,180.244333,
+ -0.022557,0.236303,-0.971418,602.13328,-599.869416,181.183686,
+ -0.112343,0.364093,-0.924562,623.546355,-622.700434,172.934486,
+ -0.022557,0.36647,-0.930156,602.133289,-623.054827,173.833938,
+ 0,-0.622177,0.782877,0.000063,-699.581047,195.189986,
+ 0.011271,-0.70706,0.707064,448.317785,-723.744835,174.122247,
+ 0.011271,-0.604116,0.796817,448.317783,-699.580941,195.189934,
+ 0.011271,-0.70706,0.707064,448.317785,-723.744835,174.122247,
+ 0,-0.622177,0.782877,0.000063,-699.581047,195.189986,
+ 0,-0.723053,0.690793,0.000065,-723.744912,174.122324,
+ -0.999454,0.027255,-0.01868,454.797688,-702.539296,117.908241,
+ -0.999345,-0.026163,0.024996,454.667771,-683.695448,134.072861,
+ -0.999345,-0.029325,0.021198,454.66777,-699.67933,115.739913,
+ -0.999345,-0.026163,0.024996,454.667771,-683.695448,134.072861,
+ -0.999454,0.027255,-0.01868,454.797688,-702.539296,117.908241,
+ -0.999454,0.024455,-0.02222,454.797689,-686.233268,136.610681,
+ -0,0.723053,-0.690793,454.667771,-683.695448,134.072861,
+ -0.022557,0.796656,-0.604012,602.133301,-699.679313,115.739878,
+ -0,0.81044,-0.585821,454.66777,-699.67933,115.739913,
+ -0.022557,0.796656,-0.604012,602.133301,-699.679313,115.739878,
+ -0,0.723053,-0.690793,454.667771,-683.695448,134.072861,
+ -0.022557,0.706919,-0.706935,602.133302,-683.695423,134.072836,
+ 0.361665,-0.456272,0.813028,458.222253,-671.980704,211.361071,
+ 0.487279,-0.526963,0.696326,461.27,-697.739849,192.761586,
+ 0.487279,-0.427162,0.761638,461.269994,-671.27861,210.111812,
+ 0.487279,-0.526963,0.696326,461.27,-697.739849,192.761586,
+ 0.361665,-0.456272,0.813028,458.222253,-671.980704,211.361071,
+ 0.361665,-0.562804,0.74327,458.222259,-698.605625,193.903521,
+ 0.030866,-0.101695,0.994337,599.602117,-579.071663,216.32257,
+ 0.127347,-0.234264,0.963796,624.955322,-606.868816,209.956143,
+ 0.127347,-0.100746,0.986728,624.955308,-578.912147,214.763349,
+ 0.127347,-0.234264,0.963796,624.955322,-606.868816,209.956143,
+ 0.030866,-0.101695,0.994337,599.602117,-579.071663,216.32257,
+ 0.030867,-0.23624,0.971204,599.602131,-607.23931,211.479086,
+ 0.091928,-0.926396,0.365157,451.68333,-776.081661,94.166635,
+ 0.011271,-0.871702,0.489906,448.317778,-762.390973,123.149041,
+ 0.011271,-0.930329,0.366553,448.317768,-776.152256,94.194451,
+ 0.011271,-0.871702,0.489906,448.317778,-762.390973,123.149041,
+ 0.091928,-0.926396,0.365157,451.68333,-776.081661,94.166635,
+ 0.091928,-0.867996,0.487987,451.683339,-762.324827,123.111865,
+ -0.796291,0.563252,-0.220608,732.466058,-664.91507,50.366817,
+ -0.870211,0.43015,-0.240215,744.275056,-642.532652,55.787678,
+ -0.870211,0.458871,-0.17936,744.275052,-648.232891,43.794023,
+ -0.870211,0.43015,-0.240215,744.275056,-642.532652,55.787678,
+ -0.796291,0.563252,-0.220608,732.466058,-664.91507,50.366817,
+ -0.796291,0.527936,-0.295302,732.466063,-658.163576,64.572379,
+ 0.229025,-0.905527,0.357167,455.006098,-775.57778,93.968105,
+ 0.091928,-0.867996,0.487987,451.683339,-762.324827,123.111865,
+ 0.091928,-0.926396,0.365157,451.68333,-776.081661,94.166635,
+ 0.091928,-0.867996,0.487987,451.683339,-762.324827,123.111865,
+ 0.229025,-0.905527,0.357167,455.006098,-775.57778,93.968105,
+ 0.229025,-0.848411,0.477229,455.006107,-761.852699,122.846525,
+ -0.112099,0.016649,-0.993558,623.546317,-548.656939,185.255996,
+ -0.030004,0,-0.99955,602.133251,-186.86272,186.220487,
+ -0.134378,0,-0.99093,623.546317,-186.86272,185.255996,
+ -0.030004,0,-0.99955,602.133251,-186.86272,186.220487,
+ -0.112099,0.016649,-0.993558,623.546317,-548.656939,185.255996,
+ -0.022507,0.01679,-0.999606,602.133251,-548.673148,186.220487,
+ 0.867227,-0.051963,0.495193,767.829315,-569.19647,119.787648,
+ 0.794465,-0.14471,0.589818,753.739273,-589.30933,137.774661,
+ 0.867227,-0.118957,0.483493,767.829322,-584.301801,117.190256,
+ 0.794465,-0.14471,0.589818,753.739273,-589.30933,137.774661,
+ 0.867227,-0.051963,0.495193,767.829315,-569.19647,119.787648,
+ 0.794465,-0.062988,0.604035,753.739264,-571.352333,140.862403,
+ 0.794465,-0.062988,0.604035,753.739264,-571.352333,140.862403,
+ 0.707841,-0.151267,0.689985,736.997677,-593.835505,156.380365,
+ 0.794465,-0.14471,0.589818,753.739273,-589.30933,137.774661,
+ 0.707841,-0.151267,0.689985,736.997677,-593.835505,156.380365,
+ 0.794465,-0.062988,0.604035,753.739264,-571.352333,140.862403,
+ 0.707841,-0.055835,0.704162,736.997667,-573.300963,159.911321,
+ 0.995804,-0.056536,0.071964,473.642079,-686.237536,177.590351,
+ 0.973657,-0.162317,0.16014,473.101765,-710.482719,160.860131,
+ 0.995804,-0.065815,0.063588,473.64208,-708.127668,158.505081,
+ 0.973657,-0.162317,0.16014,473.101765,-710.482719,160.860131,
+ 0.995804,-0.056536,0.071964,473.642079,-686.237536,177.590351,
+ 0.973657,-0.138981,0.180764,473.101763,-688.249706,180.244348,
+ -0.9698,0.173513,-0.171408,760.201828,-598.389085,48.766498,
+ -0.993727,0.068775,-0.088188,764.031425,-579.704781,37.076602,
+ -0.993727,0.08015,-0.077994,764.031425,-583.441377,33.81879,
+ -0.993727,0.068775,-0.088188,764.031425,-579.704781,37.076602,
+ -0.9698,0.173513,-0.171408,760.201828,-598.389085,48.766498,
+ -0.9698,0.148537,-0.193454,760.201828,-592.476195,53.921748,
+ -0.649152,0.654437,-0.387703,445.72174,-732.59493,106.40344,
+ -0.748179,0.529432,-0.399912,448.282017,-715.574197,127.790857,
+ -0.748179,0.578988,-0.324038,448.282012,-730.404697,105.172511,
+ -0.748179,0.529432,-0.399912,448.282017,-715.574197,127.790857,
+ -0.649152,0.654437,-0.387703,445.72174,-732.59493,106.40344,
+ -0.649152,0.595502,-0.473264,445.721745,-717.576266,129.308758,
+ -0.022557,0.796656,-0.604012,602.133301,-699.679313,115.739878,
+ -0.112343,0.866156,-0.486984,623.546362,-712.173175,94.926211,
+ -0.022557,0.871531,-0.489821,602.133296,-713.015947,95.399861,
+ -0.112343,0.866156,-0.486984,623.546362,-712.173175,94.926211,
+ -0.022557,0.796656,-0.604012,602.133301,-699.679313,115.739878,
+ -0.112343,0.791717,-0.600469,623.546367,-698.908942,115.155806,
+ 0.707932,-0.563486,0.425811,466.630442,-739.151644,145.666467,
+ 0.611311,-0.685845,0.394863,464.090784,-758.12892,120.753731,
+ 0.717647,-0.602641,0.349008,466.630436,-756.198062,119.668573,
+ 0.611311,-0.685845,0.394863,464.090784,-758.12892,120.753731,
+ 0.707932,-0.563486,0.425811,466.630442,-739.151644,145.666467,
+ 0.603343,-0.62433,0.496175,464.09079,-740.916622,147.004613,
+ 0.611311,-0.685845,0.394863,464.090784,-758.12892,120.753731,
+ 0.487279,-0.695395,0.528191,461.27,-742.384174,148.117261,
+ 0.487279,-0.760883,0.428506,461.269994,-759.734399,121.656023,
+ 0.487279,-0.695395,0.528191,461.27,-742.384174,148.117261,
+ 0.611311,-0.685845,0.394863,464.090784,-758.12892,120.753731,
+ 0.603343,-0.62433,0.496175,464.09079,-740.916622,147.004613,
+ 0.487279,-0.760883,0.428506,461.269994,-759.734399,121.656023,
+ 0.361665,-0.742579,0.563715,458.222259,-743.526109,148.983038,
+ 0.361665,-0.812468,0.457269,458.222253,-760.983658,122.358117,
+ 0.361665,-0.742579,0.563715,458.222259,-743.526109,148.983038,
+ 0.487279,-0.760883,0.428506,461.269994,-759.734399,121.656023,
+ 0.487279,-0.695395,0.528191,461.27,-742.384174,148.117261,
+ -0.71736,0.602889,-0.34917,718.363103,-672.268221,72.499299,
+ -0.796291,0.482772,-0.364488,732.466066,-649.539321,77.725434,
+ -0.796291,0.527936,-0.295302,732.466063,-658.163576,64.572379,
+ -0.796291,0.482772,-0.364488,732.466066,-649.539321,77.725434,
+ -0.71736,0.602889,-0.34917,718.363103,-672.268221,72.499299,
+ -0.707932,0.563466,-0.425837,718.363107,-662.432231,87.500399,
+ -0.796291,0.527936,-0.295302,732.466063,-658.163576,64.572379,
+ -0.870211,0.393404,-0.29659,744.275058,-635.251255,66.89271,
+ -0.870211,0.43015,-0.240215,744.275056,-642.532652,55.787678,
+ -0.870211,0.393404,-0.29659,744.275058,-635.251255,66.89271,
+ -0.796291,0.527936,-0.295302,732.466063,-658.163576,64.572379,
+ -0.796291,0.482772,-0.364488,732.466066,-649.539321,77.725434,
+ -0.870211,0.43015,-0.240215,744.275056,-642.532652,55.787678,
+ -0.928388,0.296985,-0.223376,753.576412,-619.826561,55.198234,
+ -0.928388,0.324653,-0.180823,753.57641,-625.658276,46.304148,
+ -0.928388,0.296985,-0.223376,753.576412,-619.826561,55.198234,
+ -0.870211,0.43015,-0.240215,744.275056,-642.532652,55.787678,
+ -0.870211,0.393404,-0.29659,744.275058,-635.251255,66.89271,
+ -0.928388,0.324653,-0.180823,753.57641,-625.658276,46.304148,
+ -0.9698,0.195252,-0.146165,760.201828,-603.544336,42.853607,
+ -0.9698,0.213348,-0.118196,760.201826,-607.845772,36.293385,
+ -0.9698,0.195252,-0.146165,760.201828,-603.544336,42.853607,
+ -0.928388,0.324653,-0.180823,753.57641,-625.658276,46.304148,
+ -0.928388,0.296985,-0.223376,753.576412,-619.826561,55.198234,
+ 0.991932,-0.090686,0.088582,792.007219,-586.233981,36.611394,
+ 0.966794,-0.204518,0.153238,787.130191,-609.757662,47.564335,
+ 0.991932,-0.101911,0.075398,792.007218,-589.846284,32.468209,
+ 0.966794,-0.204518,0.153238,787.130191,-609.757662,47.564335,
+ 0.991932,-0.090686,0.088582,792.007219,-586.233981,36.611394,
+ 0.966794,-0.181729,0.179678,787.130191,-603.902541,54.279953,
+ 0.966794,-0.181729,0.179678,787.130191,-603.902541,54.279953,
+ 0.924993,-0.303632,0.228462,779.024169,-628.985711,62.142384,
+ 0.966794,-0.204518,0.153238,787.130191,-609.757662,47.564335,
+ 0.924993,-0.303632,0.228462,779.024169,-628.985711,62.142384,
+ 0.966794,-0.181729,0.179678,787.130191,-603.902541,54.279953,
+ 0.924993,-0.269668,0.267706,779.02417,-620.964741,71.342153,
+ 0.924993,-0.269668,0.267706,779.02417,-620.964741,71.342153,
+ 0.867227,-0.397554,0.299779,767.829336,-647.197908,75.95025,
+ 0.924993,-0.303632,0.228462,779.024169,-628.985711,62.142384,
+ 0.867227,-0.397554,0.299779,767.829336,-647.197908,75.95025,
+ 0.924993,-0.269668,0.267706,779.02417,-620.964741,71.342153,
+ 0.867227,-0.352996,0.351156,767.829337,-637.125516,87.502929,
+ 0.867227,-0.352996,0.351156,767.829337,-637.125516,87.502929,
+ 0.794465,-0.484664,0.36596,753.739289,-664.079301,88.749145,
+ 0.867227,-0.397554,0.299779,767.829336,-647.197908,75.95025,
+ 0.794465,-0.484664,0.36596,753.739289,-664.079301,88.749145,
+ 0.867227,-0.352996,0.351156,767.829337,-637.125516,87.502929,
+ 0.794465,-0.430275,0.42859,753.73929,-652.105388,102.482801,
+ -0.928388,0.296985,-0.223376,753.576412,-619.826561,55.198234,
+ -0.9698,0.173513,-0.171408,760.201828,-598.389085,48.766498,
+ -0.9698,0.195252,-0.146165,760.201828,-603.544336,42.853607,
+ -0.9698,0.173513,-0.171408,760.201828,-598.389085,48.766498,
+ -0.928388,0.296985,-0.223376,753.576412,-619.826561,55.198234,
+ -0.928388,0.263776,-0.261761,753.576413,-612.83728,63.214693,
+ 0.780232,-0.616443,0.105998,753.739265,-690.205036,23.357838,
+ 0.714403,-0.693748,0.091332,736.997667,-709.533908,23.678376,
+ 0.752834,-0.654794,0.066982,739.751559,-706.400475,23.357838,
+ 0.714403,-0.693748,0.091332,736.997667,-709.533908,23.678376,
+ 0.780232,-0.616443,0.105998,753.739265,-690.205036,23.357838,
+ 0.800126,-0.584324,0.13551,753.739273,-687.397248,39.686742,
+ 0.714403,-0.693748,0.091332,736.997667,-709.533908,23.678376,
+ 0.800126,-0.584324,0.13551,753.739273,-687.397248,39.686742,
+ 0.707841,-0.682368,0.182581,736.997677,-706.002952,44.212918,
+ 0.714403,-0.693748,0.091332,736.997667,-709.533908,23.678376,
+ 0.609101,-0.770402,0.188354,717.894058,-722.308196,48.179466,
+ 0.609101,-0.788882,0.081617,717.894046,-726.227566,25.386075,
+ 0.609101,-0.770402,0.188354,717.894058,-722.308196,48.179466,
+ 0.714403,-0.693748,0.091332,736.997667,-709.533908,23.678376,
+ 0.707841,-0.682368,0.182581,736.997677,-706.002952,44.212918,
+ 0.609101,-0.788882,0.081617,717.894046,-726.227566,25.386075,
+ 0.499663,-0.841496,0.20548,696.758783,-736.031005,51.517793,
+ 0.499663,-0.861647,0.088896,696.75877,-740.277271,26.823309,
+ 0.499663,-0.841496,0.20548,696.758783,-736.031005,51.517793,
+ 0.609101,-0.788882,0.081617,717.894046,-726.227566,25.386075,
+ 0.609101,-0.770402,0.188354,717.894058,-722.308196,48.179466,
+ -0.606606,0.549182,-0.574829,702.221362,-660.639487,111.0169,
+ -0.494423,0.524541,-0.693111,684.332897,-652.814504,133.506322,
+ -0.606606,0.46573,-0.644302,702.22136,-645.663324,124.074113,
+ -0.494423,0.524541,-0.693111,684.332897,-652.814504,133.506322,
+ -0.606606,0.549182,-0.574829,702.221362,-660.639487,111.0169,
+ -0.494423,0.614096,-0.615169,684.332898,-669.009253,119.386665,
+ -0.150374,0.100371,-0.983521,432.838915,-578.78391,213.508718,
+ -0.040617,0.016774,-0.999034,429.26772,-549.153238,214.795487,
+ -0.150052,0.016548,-0.98854,432.838898,-549.148352,214.504709,
+ -0.040617,0.016774,-0.999034,429.26772,-549.153238,214.795487,
+ -0.150374,0.100371,-0.983521,432.838915,-578.78391,213.508718,
+ -0.040706,0.101643,-0.993988,429.267738,-578.813573,213.798664,
+ -0.748179,0.401798,-0.528002,448.282017,-677.413444,165.951609,
+ -0.832687,0.272446,-0.482085,450.47112,-653.402151,178.303588,
+ -0.832687,0.335596,-0.440463,450.471124,-675.695751,163.686019,
+ -0.832687,0.272446,-0.482085,450.47112,-653.402151,178.303588,
+ -0.748179,0.401798,-0.528002,448.282017,-677.413444,165.951609,
+ -0.748179,0.326101,-0.577828,448.282012,-654.795099,180.782109,
+ -0.832687,0.335596,-0.440463,450.471124,-675.695751,163.686019,
+ -0.901181,0.2136,-0.377157,452.247009,-651.873941,175.584392,
+ -0.901181,0.263001,-0.344532,452.247014,-673.811262,161.200429,
+ -0.901181,0.2136,-0.377157,452.247009,-651.873941,175.584392,
+ -0.832687,0.335596,-0.440463,450.471124,-675.695751,163.686019,
+ -0.832687,0.272446,-0.482085,450.47112,-653.402151,178.303588,
+ -0.901181,0.263001,-0.344532,452.247014,-673.811262,161.200429,
+ -0.952384,0.150692,-0.265059,453.575567,-650.239827,172.676755,
+ -0.952384,0.185405,-0.242052,453.575571,-671.796178,158.542589,
+ -0.952384,0.150692,-0.265059,453.575567,-650.239827,172.676755,
+ -0.901181,0.263001,-0.344532,452.247014,-673.811262,161.200429,
+ -0.901181,0.2136,-0.377157,452.247009,-651.873941,175.584392,
+ -0.952384,0.185405,-0.242052,453.575571,-671.796178,158.542589,
+ -0.985345,0.084925,-0.14793,454.431271,-648.531199,169.636534,
+ -0.985345,0.104291,-0.134978,454.431275,-669.689209,155.763554,
+ -0.985345,0.084925,-0.14793,454.431271,-648.531199,169.636534,
+ -0.952384,0.185405,-0.242052,453.575571,-671.796178,158.542589,
+ -0.952384,0.150692,-0.265059,453.575567,-650.239827,172.676755,
+ 0.9608,-0.004657,0.277203,787.130168,-546.781824,73.639808,
+ 0.924993,-0.040048,0.377867,779.024152,-566.870657,97.051514,
+ 0.966794,-0.027448,0.254079,787.130178,-564.415116,73.047189,
+ 0.924993,-0.040048,0.377867,779.024152,-566.870657,97.051514,
+ 0.9608,-0.004657,0.277203,787.130168,-546.781824,73.639808,
+ 0.919603,-0.008082,0.392766,779.024141,-547.186239,97.713067,
+ 0.919603,-0.008082,0.392766,779.024141,-547.186239,97.713067,
+ 0.867227,-0.051963,0.495193,767.829315,-569.19647,119.787648,
+ 0.924993,-0.040048,0.377867,779.024152,-566.870657,97.051514,
+ 0.867227,-0.051963,0.495193,767.829315,-569.19647,119.787648,
+ 0.919603,-0.008082,0.392766,779.024141,-547.186239,97.713067,
+ 0.866755,-0.008697,0.498658,767.829302,-547.569289,120.514493,
+ 0.591287,-0.806461,-0,746.929123,-767.779872,-0,
+ 0.518797,-0.854897,-0,718.958402,-786.46931,23.357838,
+ 0.480964,-0.87674,-0,718.958402,-786.46931,-0,
+ 0.518797,-0.854897,-0,718.958402,-786.46931,23.357838,
+ 0.591287,-0.806461,-0,746.929123,-767.779872,-0,
+ 0.625945,-0.779867,-0,746.929123,-767.779872,23.357838,
+ 0.9153,-0.402772,-0,827.969621,-662.165838,-0,
+ 0.87674,-0.480964,-0,813.090986,-692.336727,23.357838,
+ 0.854897,-0.518797,-0,813.090986,-692.336727,-0,
+ 0.87674,-0.480964,-0,813.090986,-692.336727,23.357838,
+ 0.9153,-0.402772,-0,827.969621,-662.165838,-0,
+ 0.932018,-0.362412,-0,827.969621,-662.165838,23.357838,
+ 0.973657,-0.199526,0.110368,473.101758,-746.040734,113.960076,
+ 0.932875,-0.335664,0.130666,472.107195,-761.701654,88.500895,
+ 0.973657,-0.212704,0.08215,473.101749,-758.702385,87.31918,
+ 0.932875,-0.335664,0.130666,472.107195,-761.701654,88.500895,
+ 0.973657,-0.199526,0.110368,473.101758,-746.040734,113.960076,
+ 0.932875,-0.314728,0.175187,472.107204,-748.850999,115.539467,
+ -0.870211,0.181845,-0.457892,744.275052,-593.41661,98.610304,
+ -0.928388,0.089223,-0.360743,753.576403,-576.182654,83.81487,
+ -0.928388,0.137548,-0.34522,753.576407,-586.320946,80.601044,
+ -0.928388,0.089223,-0.360743,753.576403,-576.182654,83.81487,
+ -0.870211,0.181845,-0.457892,744.275052,-593.41661,98.610304,
+ -0.870211,0.117753,-0.4784,744.275047,-580.75808,102.623043,
+ -0.9698,0.195252,-0.146165,760.201828,-603.544336,42.853607,
+ -0.993727,0.08015,-0.077994,764.031425,-583.441377,33.81879,
+ -0.993727,0.090031,-0.066344,764.031425,-586.699189,30.082194,
+ -0.993727,0.08015,-0.077994,764.031425,-583.441377,33.81879,
+ -0.9698,0.195252,-0.146165,760.201828,-603.544336,42.853607,
+ -0.9698,0.173513,-0.171408,760.201828,-598.389085,48.766498,
+ 0.794465,-0.484664,0.36596,753.739289,-664.079301,88.749145,
+ 0.717149,-0.603071,0.349289,736.997692,-690.762817,82.893397,
+ 0.794465,-0.530011,0.296503,753.739286,-674.070091,73.511955,
+ 0.717149,-0.603071,0.349289,736.997692,-690.762817,82.893397,
+ 0.794465,-0.484664,0.36596,753.739289,-664.079301,88.749145,
+ 0.707932,-0.563451,0.425857,736.997696,-679.337949,100.317733,
+ 0.79876,-0.426323,0.424536,468.840171,-716.92159,167.299002,
+ 0.707932,-0.563486,0.425811,466.630442,-739.151644,145.666467,
+ 0.79876,-0.480196,0.362483,468.840169,-737.123146,144.128529,
+ 0.707932,-0.563486,0.425811,466.630442,-739.151644,145.666467,
+ 0.79876,-0.426323,0.424536,468.840171,-716.92159,167.299002,
+ 0.707932,-0.500206,0.498623,466.630444,-718.721598,169.09901,
+ 0.707932,-0.500206,0.498623,466.630444,-718.721598,169.09901,
+ 0.603343,-0.62433,0.496175,464.09079,-740.916622,147.004613,
+ 0.707932,-0.563486,0.425811,466.630442,-739.151644,145.666467,
+ 0.603343,-0.62433,0.496175,464.09079,-740.916622,147.004613,
+ 0.707932,-0.500206,0.498623,466.630444,-718.721598,169.09901,
+ 0.603343,-0.550894,0.576621,464.090792,-720.287768,170.665181,
+ -0.707841,0.651123,-0.273862,718.363098,-679.96832,56.297814,
+ -0.796291,0.527936,-0.295302,732.466063,-658.163576,64.572379,
+ -0.796291,0.563252,-0.220608,732.466058,-664.91507,50.366817,
+ -0.796291,0.527936,-0.295302,732.466063,-658.163576,64.572379,
+ -0.707841,0.651123,-0.273862,718.363098,-679.96832,56.297814,
+ -0.71736,0.602889,-0.34917,718.363103,-672.268221,72.499299,
+ 0.011271,-0.366548,0.930331,448.317768,-643.817038,226.529669,
+ 0.091928,-0.487734,0.868139,451.683339,-672.734453,212.70224,
+ 0.091928,-0.364886,0.926503,451.68333,-643.789223,226.459074,
+ 0.091928,-0.487734,0.868139,451.683339,-672.734453,212.70224,
+ 0.011271,-0.366548,0.930331,448.317768,-643.817038,226.529669,
+ 0.011271,-0.489901,0.871705,448.317778,-672.771628,212.768386,
+ 0.874212,-0.179273,0.451236,470.677509,-639.24332,214.921287,
+ 0.79876,-0.29587,0.523873,468.840164,-668.043983,204.356329,
+ 0.874212,-0.239089,0.422598,470.677518,-666.658744,201.891525,
+ 0.79876,-0.29587,0.523873,468.840164,-668.043983,204.356329,
+ 0.874212,-0.179273,0.451236,470.677509,-639.24332,214.921287,
+ 0.79876,-0.221723,0.559304,468.840155,-640.279768,217.551861,
+ 0.874212,-0.239089,0.422598,470.677518,-666.658744,201.891525,
+ 0.79876,-0.364496,0.47867,468.840169,-693.751117,187.500559,
+ 0.874212,-0.294445,0.386077,470.677524,-692.04293,185.247507,
+ 0.79876,-0.364496,0.47867,468.840169,-693.751117,187.500559,
+ 0.874212,-0.239089,0.422598,470.677518,-666.658744,201.891525,
+ 0.79876,-0.29587,0.523873,468.840164,-668.043983,204.356329,
+ 0.79876,-0.29587,0.523873,468.840164,-668.043983,204.356329,
+ 0.707932,-0.427595,0.562134,466.630442,-695.289055,189.529057,
+ 0.79876,-0.364496,0.47867,468.840169,-693.751117,187.500559,
+ 0.707932,-0.427595,0.562134,466.630442,-695.289055,189.529057,
+ 0.79876,-0.29587,0.523873,468.840164,-668.043983,204.356329,
+ 0.700875,-0.343846,0.624935,466.630436,-669.291161,206.575475,
+ 0.700875,-0.343846,0.624935,466.630436,-669.291161,206.575475,
+ 0.603343,-0.467182,0.646311,464.09079,-696.627201,191.294034,
+ 0.707932,-0.427595,0.562134,466.630442,-695.289055,189.529057,
+ 0.603343,-0.467182,0.646311,464.09079,-696.627201,191.294034,
+ 0.700875,-0.343846,0.624935,466.630436,-669.291161,206.575475,
+ 0.592261,-0.384709,0.707974,464.090784,-670.376318,208.506333,
+ 0.487279,-0.427162,0.761638,461.269994,-671.27861,210.111812,
+ 0.603343,-0.467182,0.646311,464.09079,-696.627201,191.294034,
+ 0.592261,-0.384709,0.707974,464.090784,-670.376318,208.506333,
+ 0.603343,-0.467182,0.646311,464.09079,-696.627201,191.294034,
+ 0.487279,-0.427162,0.761638,461.269994,-671.27861,210.111812,
+ 0.487279,-0.526963,0.696326,461.27,-697.739849,192.761586,
+ -0,0.996871,-0.079045,0.016265,-763.421248,29.191222,
+ -0.027072,0.999069,-0.033577,429.267734,-763.617291,23.357838,
+ -0,0.999436,-0.033589,0.00829,-763.617296,23.357836,
+ -0.027072,0.999069,-0.033577,429.267734,-763.617291,23.357838,
+ -0,0.996871,-0.079045,0.016265,-763.421248,29.191222,
+ -0.040706,0.99398,-0.101718,429.267738,-763.421251,29.190985,
+ -0.415875,0.904633,-0.093201,439.690582,-761.097663,28.953287,
+ -0.517204,0.855379,-0.028747,442.839449,-759.575224,23.357838,
+ -0.393899,0.918635,-0.030873,439.690579,-761.285715,23.357838,
+ -0.517204,0.855379,-0.028747,442.839449,-759.575224,23.357838,
+ -0.415875,0.904633,-0.093201,439.690582,-761.097663,28.953287,
+ -0.537771,0.838627,-0.086642,442.839452,-759.393033,28.778909,
+ -0.809671,0.570253,-0.138724,732.466052,-669.667851,35.373762,
+ -0.858411,0.505544,-0.086929,744.275043,-653.583014,23.357838,
+ -0.7818,0.61451,-0.105666,732.466046,-671.734013,23.357838,
+ -0.858411,0.505544,-0.086929,744.275043,-653.583014,23.357838,
+ -0.809671,0.570253,-0.138724,732.466052,-669.667851,35.373762,
+ -0.881047,0.459625,-0.111811,744.275047,-652.24563,31.135492,
+ -0.373111,0.90136,-0.219861,665.02137,-719.684398,47.541206,
+ -0.482609,0.869945,-0.101409,684.332867,-714.266541,24.162533,
+ -0.373111,0.922912,-0.094985,665.021359,-723.541264,25.111307,
+ -0.482609,0.869945,-0.101409,684.332867,-714.266541,24.162533,
+ -0.373111,0.90136,-0.219861,665.02137,-719.684398,47.541206,
+ -0.494423,0.84441,-0.206198,684.332878,-710.625471,45.337452,
+ 0.583909,-0.811361,0.027268,464.090742,-786.683847,23.357838,
+ 0.487278,-0.868635,0.089632,461.269956,-788.240871,31.729906,
+ 0.466054,-0.884257,0.029718,461.269951,-788.52224,23.357838,
+ 0.487278,-0.868635,0.089632,461.269956,-788.240871,31.729906,
+ 0.583909,-0.811361,0.027268,464.090742,-786.683847,23.357838,
+ 0.603443,-0.793169,0.082097,464.090747,-786.408778,31.542489,
+ -0.244971,0.941967,-0.229537,644.636243,-726.137133,49.110957,
+ -0.373111,0.922912,-0.094985,665.021359,-723.541264,25.111307,
+ -0.244971,0.964459,-0.099038,644.636231,-730.147713,25.787129,
+ -0.373111,0.922912,-0.094985,665.021359,-723.541264,25.111307,
+ -0.244971,0.941967,-0.229537,644.636243,-726.137133,49.110957,
+ -0.373111,0.90136,-0.219861,665.02137,-719.684398,47.541206,
+ -0.999462,0,0.032813,180.160558,-280.29408,1570.859583,
+ -0.986659,0,0.162803,176.700984,-186.86272,1535.733942,
+ -0.973856,0,0.227168,176.700984,-280.29408,1535.733942,
+ -0.986659,0,0.162803,176.700984,-186.86272,1535.733942,
+ -0.999462,0,0.032813,180.160558,-280.29408,1570.859583,
+ -0.999462,0,-0.032813,180.160558,-186.86272,1570.859583,
+ -0.973856,0,0.227168,176.700984,-280.29408,1535.733942,
+ -0.935939,0,0.352162,166.455213,-186.86272,1501.958161,
+ -0.910825,0,0.412792,166.455213,-280.29408,1501.958161,
+ -0.935939,0,0.352162,166.455213,-186.86272,1501.958161,
+ -0.973856,0,0.227168,176.700984,-280.29408,1535.733942,
+ -0.986659,0,0.162803,176.700984,-186.86272,1535.733942,
+ -0.910825,0,0.412792,166.455213,-280.29408,1501.958161,
+ -0.849252,0,0.527988,149.816983,-186.86272,1470.830222,
+ -0.812792,0,0.582554,149.816983,-280.29408,1470.830222,
+ -0.849252,0,0.527988,149.816983,-186.86272,1470.830222,
+ -0.910825,0,0.412792,166.455213,-280.29408,1501.958161,
+ -0.935939,0,0.352162,166.455213,-186.86272,1501.958161,
+ -0.812792,0,0.582554,149.816983,-280.29408,1470.830222,
+ -0.707107,0,0.707107,127.425692,-186.86272,1443.546356,
+ -0.707107,0,0.707107,127.425692,-280.29408,1443.546356,
+ -0.707107,0,0.707107,127.425692,-186.86272,1443.546356,
+ -0.812792,0,0.582554,149.816983,-280.29408,1470.830222,
+ -0.849252,0,0.527988,149.816983,-186.86272,1470.830222,
+ 0,-0.387702,0.921785,473.717764,-634.484263,202.842487,
+ 0.030867,-0.489683,0.871354,599.602151,-660.298109,190.573883,
+ 0.030867,-0.366379,0.929954,599.602143,-634.484215,202.842483,
+ 0.030867,-0.489683,0.871354,599.602151,-660.298109,190.573883,
+ 0,-0.387702,0.921785,473.717764,-634.484263,202.842487,
+ 0,-0.509694,0.860356,473.717772,-660.298148,190.573891,
+ -0.649152,0.262621,-0.713885,445.721732,-631.287828,194.729696,
+ -0.537771,0.198458,-0.8194,442.839466,-605.68255,205.079413,
+ -0.638578,0.17117,-0.75028,445.721721,-605.178251,203.006401,
+ -0.537771,0.198458,-0.8194,442.839466,-605.68255,205.079413,
+ -0.649152,0.262621,-0.713885,445.721732,-631.287828,194.729696,
+ -0.537771,0.308263,-0.784714,442.839477,-632.069904,196.714653,
+ -0.112343,0.96547,-0.235045,623.546346,-729.866921,50.018304,
+ -0.244971,0.964459,-0.099038,644.636231,-730.147713,25.787129,
+ -0.112343,0.988493,-0.101292,623.546333,-733.966349,26.17777,
+ -0.244971,0.964459,-0.099038,644.636231,-730.147713,25.787129,
+ -0.112343,0.96547,-0.235045,623.546346,-729.866921,50.018304,
+ -0.244971,0.941967,-0.229537,644.636243,-726.137133,49.110957,
+ -0.989023,0.146995,-0.015036,454.43124,-742.052468,27.005038,
+ -0.999454,0.032443,-0.006265,454.797666,-734.293588,51.095248,
+ -0.999951,0.009862,-0.001008,454.797654,-738.498463,26.641479,
+ -0.999454,0.032443,-0.006265,454.797666,-734.293588,51.095248,
+ -0.989023,0.146995,-0.015036,454.43124,-742.052468,27.005038,
+ -0.985345,0.166102,-0.038803,454.431253,-737.764902,51.939707,
+ -0.881047,0.459625,-0.111811,744.275047,-652.24563,31.135492,
+ -0.919489,0.387429,-0.066619,753.576401,-633.988087,23.357838,
+ -0.858411,0.505544,-0.086929,744.275043,-653.583014,23.357838,
+ -0.919489,0.387429,-0.066619,753.576401,-633.988087,23.357838,
+ -0.881047,0.459625,-0.111811,744.275047,-652.24563,31.135492,
+ -0.936465,0.339085,-0.089746,753.576403,-633.437458,26.560066,
+ -0.845271,0.531564,-0.054376,450.471088,-751.942886,28.016787,
+ -0.901181,0.421494,-0.101069,452.246991,-744.394382,53.552447,
+ -0.91096,0.410353,-0.041977,452.246978,-748.839872,27.699361,
+ -0.901181,0.421494,-0.101069,452.246991,-744.394382,53.552447,
+ -0.845271,0.531564,-0.054376,450.471088,-751.942886,28.016787,
+ -0.832687,0.538362,-0.129611,450.471101,-747.425197,54.289747,
+ 0.114758,-0.016686,0.993253,451.683281,-549.621181,242.65094,
+ 0.229024,-0.098699,0.968404,455.006069,-581.599776,241.035583,
+ 0.251027,-0.016259,0.967844,455.00605,-549.612103,242.110623,
+ 0.229024,-0.098699,0.968404,455.006069,-581.599776,241.035583,
+ 0.114758,-0.016686,0.993253,451.683281,-549.621181,242.65094,
+ 0.091928,-0.101189,0.990611,451.683301,-581.654891,241.574352,
+ 0.998111,-0.038222,0.048094,793.309566,-569.30368,23.357838,
+ 0.991932,-0.090686,0.088582,792.007219,-586.233981,36.611394,
+ 0.998111,-0.044419,0.042437,793.160542,-572.980425,23.357838,
+ 0.991932,-0.090686,0.088582,792.007219,-586.233981,36.611394,
+ 0.998111,-0.038222,0.048094,793.309566,-569.30368,23.357838,
+ 0.991932,-0.07777,0.100113,792.007218,-582.090797,40.223697,
+ -0.040706,0.366235,-0.929632,429.267763,-633.554255,200.482022,
+ -0,0.258478,-0.966017,0.016279,-606.639892,209.013909,
+ -0.040706,0.236142,-0.970866,429.267752,-606.639691,209.013907,
+ -0,0.258478,-0.966017,0.016279,-606.639892,209.013909,
+ -0.040706,0.366235,-0.929632,429.267763,-633.554255,200.482022,
+ -0,0.387702,-0.921785,0.01629,-633.55442,200.482036,
+ -0.707841,0.243878,-0.662936,718.363098,-605.920401,130.345733,
+ -0.606705,0.186995,-0.77262,702.221343,-592.162158,149.501677,
+ -0.707841,0.151267,-0.689985,718.363091,-588.820775,135.766294,
+ -0.606705,0.186995,-0.77262,702.221343,-592.162158,149.501677,
+ -0.707841,0.243878,-0.662936,718.363098,-605.920401,130.345733,
+ -0.606705,0.290533,-0.739932,702.221351,-611.102283,143.49768,
+ 0.924993,-0.091165,0.368885,779.024159,-578.899518,94.983127,
+ 0.867227,-0.183731,0.462774,767.829328,-598.912297,112.558746,
+ 0.924993,-0.140582,0.353021,779.024163,-590.534326,91.294907,
+ 0.867227,-0.183731,0.462774,767.829328,-598.912297,112.558746,
+ 0.924993,-0.091165,0.368885,779.024159,-578.899518,94.983127,
+ 0.867227,-0.118957,0.483493,767.829322,-584.301801,117.190256,
+ 0.994297,-0,0.106651,93.652471,-186.86272,2499.208064,
+ 0.976682,-0,0.214689,123.089852,-280.29408,2224.766097,
+ 0.946935,-0,0.321426,123.089852,-186.86272,2224.766097,
+ 0.976682,-0,0.214689,123.089852,-280.29408,2224.766097,
+ 0.994297,-0,0.106651,93.652471,-186.86272,2499.208064,
+ 0.994297,-0,0.106651,93.652471,-280.29408,2499.208064,
+ 0.466054,-0.884257,0.029718,461.269951,-788.52224,23.357838,
+ 0.361665,-0.92741,0.095445,458.222215,-789.666464,31.875739,
+ 0.339245,-0.940167,0.031597,458.22221,-789.952733,23.357838,
+ 0.361665,-0.92741,0.095445,458.222215,-789.666464,31.875739,
+ 0.466054,-0.884257,0.029718,461.269951,-788.52224,23.357838,
+ 0.487278,-0.868635,0.089632,461.269956,-788.240871,31.729906,
+ -0.91096,0.410353,-0.041977,452.246978,-748.839872,27.699361,
+ -0.952384,0.296613,-0.070606,453.575549,-741.153531,52.764052,
+ -0.959176,0.281343,-0.02878,453.575536,-745.52182,27.359938,
+ -0.952384,0.296613,-0.070606,453.575549,-741.153531,52.764052,
+ -0.91096,0.410353,-0.041977,452.246978,-748.839872,27.699361,
+ -0.901181,0.421494,-0.101069,452.246991,-744.394382,53.552447,
+ -0.649249,0.756522,-0.078421,445.721707,-757.270639,28.561795,
+ -0.731829,0.681103,-0.02289,448.281977,-754.937554,23.357838,
+ -0.630573,0.775692,-0.026069,445.721704,-757.445533,23.357838,
+ -0.731829,0.681103,-0.02289,448.281977,-754.937554,23.357838,
+ -0.649249,0.756522,-0.078421,445.721707,-757.270639,28.561795,
+ -0.754707,0.651908,-0.073718,448.28198,-754.771252,28.306118,
+ -0.150374,0.983472,-0.100844,432.838915,-763.131306,29.161323,
+ -0.263028,0.964244,-0.032406,436.335584,-762.544148,23.357838,
+ -0.127104,0.99133,-0.033316,432.838912,-763.326349,23.357838,
+ -0.263028,0.964244,-0.032406,436.335584,-762.544148,23.357838,
+ -0.150374,0.983472,-0.100844,432.838915,-763.131306,29.161323,
+ -0.285905,0.953237,-0.097966,436.335587,-762.351785,29.08158,
+ -0,0.996871,-0.079045,454.667737,-734.928076,26.276244,
+ -0.015002,0.999323,-0.033585,602.133266,-735.026157,23.357838,
+ -0,0.999436,-0.033589,454.667735,-735.026158,23.357838,
+ -0.015002,0.999323,-0.033585,602.133266,-735.026157,23.357838,
+ -0,0.996871,-0.079045,454.667737,-734.928076,26.276244,
+ -0.022557,0.994554,-0.10175,602.133267,-734.928078,26.276163,
+ 0.794465,-0.298581,0.528844,753.739286,-623.134542,124.447504,
+ 0.707932,-0.427549,0.562168,736.997696,-649.94032,129.715362,
+ 0.794465,-0.367859,0.483224,753.739289,-638.371733,114.456714,
+ 0.707932,-0.427549,0.562168,736.997696,-649.94032,129.715362,
+ 0.794465,-0.298581,0.528844,753.739286,-623.134542,124.447504,
+ 0.701238,-0.343649,0.624636,736.997692,-632.515985,141.14023,
+ -0.606606,0.622389,-0.494632,702.22136,-673.696701,96.040736,
+ -0.707932,0.500183,-0.498647,718.363108,-650.643847,101.02126,
+ -0.707932,0.563466,-0.425837,718.363107,-662.432231,87.500399,
+ -0.707932,0.500183,-0.498647,718.363108,-650.643847,101.02126,
+ -0.606606,0.622389,-0.494632,702.22136,-673.696701,96.040736,
+ -0.606606,0.549182,-0.574829,702.221362,-660.639487,111.0169,
+ -0.707932,0.563466,-0.425837,718.363107,-662.432231,87.500399,
+ -0.796291,0.428601,-0.426873,732.466067,-639.203194,89.580607,
+ -0.796291,0.482772,-0.364488,732.466066,-649.539321,77.725434,
+ -0.796291,0.428601,-0.426873,732.466067,-639.203194,89.580607,
+ -0.707932,0.563466,-0.425837,718.363107,-662.432231,87.500399,
+ -0.707932,0.500183,-0.498647,718.363108,-650.643847,101.02126,
+ -0.796291,0.482772,-0.364488,732.466066,-649.539321,77.725434,
+ -0.870211,0.349319,-0.347431,744.275059,-626.524536,76.901948,
+ -0.870211,0.393404,-0.29659,744.275058,-635.251255,66.89271,
+ -0.870211,0.349319,-0.347431,744.275059,-626.524536,76.901948,
+ -0.796291,0.482772,-0.364488,732.466066,-649.539321,77.725434,
+ -0.796291,0.428601,-0.426873,732.466067,-639.203194,89.580607,
+ 0.030867,-0.929938,0.366419,599.602143,-752.465071,84.861627,
+ 0,-0.882708,0.469921,473.717772,-740.196479,110.67556,
+ 0,-0.938509,0.345255,473.717764,-752.465075,84.861676,
+ 0,-0.882708,0.469921,473.717772,-740.196479,110.67556,
+ 0.030867,-0.929938,0.366419,599.602143,-752.465071,84.861627,
+ 0.030867,-0.871333,0.489721,599.602151,-740.19647,110.675522,
+ -0.999454,0.00493,-0.032673,454.797654,-576.264066,188.875876,
+ -0.999343,-0.000812,0.036246,454.66772,-548.673192,186.220487,
+ -0.999345,-0.004503,0.035903,454.667737,-575.898832,185.305489,
+ -0.999343,-0.000812,0.036246,454.66772,-548.673192,186.220487,
+ -0.999454,0.00493,-0.032673,454.797654,-576.264066,188.875876,
+ -0.999453,0.000944,-0.033066,454.797637,-548.733344,189.801127,
+ 0.867227,-0.118957,0.483493,767.829322,-584.301801,117.190256,
+ 0.794465,-0.223732,0.564597,753.73928,-606.678073,132.26879,
+ 0.867227,-0.183731,0.462774,767.829328,-598.912297,112.558746,
+ 0.794465,-0.223732,0.564597,753.73928,-606.678073,132.26879,
+ 0.867227,-0.118957,0.483493,767.829322,-584.301801,117.190256,
+ 0.794465,-0.14471,0.589818,753.739273,-589.30933,137.774661,
+ -0.022557,0.101727,-0.994557,602.133267,-575.89875,185.30549,
+ -0,0.022395,-0.999749,454.66772,-548.673192,186.220487,
+ -0.022507,0.01679,-0.999606,602.133251,-548.673148,186.220487,
+ -0,0.022395,-0.999749,454.66772,-548.673192,186.220487,
+ -0.022557,0.101727,-0.994557,602.133267,-575.89875,185.30549,
+ -0,0.124431,-0.992228,454.667737,-575.898832,185.305489,
+ -0.112343,0.100949,-0.988528,623.546333,-575.800358,184.343761,
+ -0.022507,0.01679,-0.999606,602.133251,-548.673148,186.220487,
+ -0.112099,0.016649,-0.993558,623.546317,-548.656939,185.255996,
+ -0.022507,0.01679,-0.999606,602.133251,-548.673148,186.220487,
+ -0.112343,0.100949,-0.988528,623.546333,-575.800358,184.343761,
+ -0.022557,0.101727,-0.994557,602.133267,-575.89875,185.30549,
+ -0.707932,0.427569,-0.562154,718.363107,-637.122986,112.809644,
+ -0.796291,0.297433,-0.526739,732.466063,-614.194966,108.540989,
+ -0.796291,0.366435,-0.481296,732.466066,-627.348021,99.916734,
+ -0.796291,0.297433,-0.526739,732.466063,-614.194966,108.540989,
+ -0.707932,0.427569,-0.562154,718.363107,-637.122986,112.809644,
+ -0.701084,0.343733,-0.624763,718.363103,-622.121887,122.645633,
+ -0.999454,0.013569,-0.030128,454.797676,-624.370524,177.173126,
+ -0.999345,-0.009353,0.034955,454.667749,-599.869485,181.183687,
+ -0.999345,-0.014029,0.033354,454.667758,-623.054884,173.833943,
+ -0.999345,-0.009353,0.034955,454.667749,-599.869485,181.183687,
+ -0.999454,0.013569,-0.030128,454.797676,-624.370524,177.173126,
+ -0.999454,0.009337,-0.031696,454.797666,-600.717836,184.671001,
+ -0.606705,0.290533,-0.739932,702.221351,-611.102283,143.49768,
+ -0.494423,0.204724,-0.844769,684.332878,-594.960039,161.002883,
+ -0.606705,0.186995,-0.77262,702.221343,-592.162158,149.501677,
+ -0.494423,0.204724,-0.844769,684.332878,-594.960039,161.002883,
+ -0.606705,0.290533,-0.739932,702.221351,-611.102283,143.49768,
+ -0.494423,0.317928,-0.808992,684.332887,-615.44129,154.510351,
+ 0.98887,-0.002499,0.148764,792.007202,-546.363038,48.711029,
+ 0.966794,-0.027448,0.254079,787.130178,-564.415116,73.047189,
+ 0.991932,-0.01438,0.125953,792.007211,-561.87231,48.189795,
+ 0.966794,-0.027448,0.254079,787.130178,-564.415116,73.047189,
+ 0.98887,-0.002499,0.148764,792.007202,-546.363038,48.711029,
+ 0.9608,-0.004657,0.277203,787.130168,-546.781824,73.639808,
+ -0.928388,0.263776,-0.261761,753.576413,-612.83728,63.214693,
+ -0.9698,0.148537,-0.193454,760.201828,-592.476195,53.921748,
+ -0.9698,0.173513,-0.171408,760.201828,-598.389085,48.766498,
+ -0.9698,0.148537,-0.193454,760.201828,-592.476195,53.921748,
+ -0.928388,0.263776,-0.261761,753.576413,-612.83728,63.214693,
+ -0.928388,0.225646,-0.295263,753.576412,-604.820821,70.203974,
+ 0.041063,-0.016783,0.999016,599.602099,-549.195708,217.326639,
+ 0.105242,0,0.994447,624.95529,-186.86272,215.762941,
+ 0.020529,0,0.999789,599.602099,-186.86272,217.326639,
+ 0.105242,0,0.994447,624.95529,-186.86272,215.762941,
+ 0.041063,-0.016783,0.999016,599.602099,-549.195708,217.326639,
+ 0.148826,-0.01661,0.988724,624.95529,-549.169432,215.762941,
+ -0.606705,0.079969,-0.790894,702.221333,-572.580561,152.868772,
+ -0.493603,0.014422,-0.869568,684.332852,-548.325029,165.499615,
+ -0.613495,0.011257,-0.789618,702.221319,-548.126642,153.690618,
+ -0.493603,0.014422,-0.869568,684.332852,-548.325029,165.499615,
+ -0.606705,0.079969,-0.790894,702.221333,-572.580561,152.868772,
+ -0.494423,0.087701,-0.864786,684.332867,-573.78512,164.643953,
+ -0.112343,0.791717,-0.600469,623.546367,-698.908942,115.155806,
+ -0.244971,0.845012,-0.475335,644.636259,-708.826871,93.045557,
+ -0.112343,0.866156,-0.486984,623.546362,-712.173175,94.926211,
+ -0.244971,0.845012,-0.475335,644.636259,-708.826871,93.045557,
+ -0.112343,0.791717,-0.600469,623.546367,-698.908942,115.155806,
+ -0.244971,0.772358,-0.586047,644.636264,-695.850119,112.836708,
+ -0.244971,0.772358,-0.586047,644.636264,-695.850119,112.836708,
+ -0.373111,0.808526,-0.455054,665.021386,-703.037584,89.791929,
+ -0.244971,0.845012,-0.475335,644.636259,-708.826871,93.045557,
+ -0.373111,0.808526,-0.455054,665.021386,-703.037584,89.791929,
+ -0.244971,0.772358,-0.586047,644.636264,-695.850119,112.836708,
+ -0.373111,0.738976,-0.560984,665.02139,-690.558191,108.824546,
+ -0.536932,0.013961,-0.84351,442.839435,-549.085368,210.7557,
+ -0.436021,0,-0.899936,439.690565,-186.86272,212.465226,
+ -0.556264,0,-0.831005,442.839435,-186.86272,210.7557,
+ -0.436021,0,-0.899936,439.690565,-186.86272,212.465226,
+ -0.536932,0.013961,-0.84351,442.839435,-549.085368,210.7557,
+ -0.41512,0.01512,-0.909641,439.690565,-549.114088,212.465226,
+ 0,0,1,46.868397,-280.29408,2499.208064,
+ 0,0,1,93.652471,-186.86272,2499.208064,
+ 0,0,1,46.868397,-186.86272,2499.208064,
+ 0,0,1,93.652471,-186.86272,2499.208064,
+ 0,0,1,46.868397,-280.29408,2499.208064,
+ 0,0,1,93.652471,-280.29408,2499.208064,
+ -0.373111,0.738976,-0.560984,665.02139,-690.558191,108.824546,
+ -0.494423,0.75738,-0.426523,684.332893,-694.910066,85.224197,
+ -0.373111,0.808526,-0.455054,665.021386,-703.037584,89.791929,
+ -0.494423,0.75738,-0.426523,684.332893,-694.910066,85.224197,
+ -0.373111,0.738976,-0.560984,665.02139,-690.558191,108.824546,
+ -0.494423,0.692194,-0.52575,684.332897,-683.128909,103.191916,
+ 0.030867,-0.366379,0.929954,599.602143,-634.484215,202.842483,
+ 0.127347,-0.48578,0.864755,624.955342,-659.530197,189.207523,
+ 0.127347,-0.363412,0.922884,624.955334,-633.909652,201.38423,
+ 0.127347,-0.48578,0.864755,624.955342,-659.530197,189.207523,
+ 0.030867,-0.366379,0.929954,599.602143,-634.484215,202.842483,
+ 0.030867,-0.489683,0.871354,599.602151,-660.298109,190.573883,
+ -0.714681,0.677849,-0.172485,718.363091,-685.388881,39.198188,
+ -0.7818,0.61451,-0.105666,732.466046,-671.734013,23.357838,
+ -0.691044,0.712358,-0.122491,718.363083,-688.112661,23.357838,
+ -0.7818,0.61451,-0.105666,732.466046,-671.734013,23.357838,
+ -0.714681,0.677849,-0.172485,718.363091,-685.388881,39.198188,
+ -0.809671,0.570253,-0.138724,732.466052,-669.667851,35.373762,
+ 0.234823,-0.97149,0.03265,649.884083,-759.705502,23.357838,
+ 0.127347,-0.98669,0.101126,624.955308,-764.385936,29.28956,
+ 0.105242,-0.993886,0.033402,624.955304,-764.585289,23.357838,
+ 0.127347,-0.98669,0.101126,624.955308,-764.385936,29.28956,
+ 0.234823,-0.97149,0.03265,649.884083,-759.705502,23.357838,
+ 0.256672,-0.961442,0.098738,649.884086,-759.522868,28.792076,
+ -0.993727,0.027914,-0.108296,764.031421,-566.356087,43.420852,
+ -0.998991,0.005587,-0.044554,764.975642,-559.332125,23.357838,
+ -0.998991,0.011606,-0.043377,764.959284,-561.475403,23.357838,
+ -0.998991,0.005587,-0.044554,764.975642,-559.332125,23.357838,
+ -0.993727,0.027914,-0.108296,764.031421,-566.356087,43.420852,
+ -0.993727,0.012896,-0.111089,764.031418,-561.470422,44.260952,
+ -0.150375,0.484157,-0.861963,432.838949,-658.912362,188.108094,
+ -0.040706,0.366235,-0.929632,429.267763,-633.554255,200.482022,
+ -0.150375,0.362184,-0.919897,432.838941,-633.447412,200.210852,
+ -0.040706,0.366235,-0.929632,429.267763,-633.554255,200.482022,
+ -0.150375,0.484157,-0.861963,432.838949,-658.912362,188.108094,
+ -0.040706,0.489496,-0.871055,429.267772,-659.055159,188.362176,
+ -0.244466,0.016195,-0.969523,644.636215,-548.592598,181.426394,
+ -0.134378,0,-0.99093,623.546317,-186.86272,185.255996,
+ -0.266155,0,-0.96393,644.636215,-186.86272,181.426394,
+ -0.134378,0,-0.99093,623.546317,-186.86272,185.255996,
+ -0.244466,0.016195,-0.969523,644.636215,-548.592598,181.426394,
+ -0.112099,0.016649,-0.993558,623.546317,-548.656939,185.255996,
+ -0.999454,0.029547,-0.014792,454.797683,-716.144717,97.158293,
+ -0.999345,-0.029325,0.021198,454.66777,-699.67933,115.739913,
+ -0.999345,-0.03194,0.017004,454.667766,-713.015957,95.399907,
+ -0.999345,-0.029325,0.021198,454.66777,-699.67933,115.739913,
+ -0.999454,0.029547,-0.014792,454.797683,-716.144717,97.158293,
+ -0.999454,0.027255,-0.01868,454.797688,-702.539296,117.908241,
+ -0.870211,0.393404,-0.29659,744.275058,-635.251255,66.89271,
+ -0.928388,0.263776,-0.261761,753.576413,-612.83728,63.214693,
+ -0.928388,0.296985,-0.223376,753.576412,-619.826561,55.198234,
+ -0.928388,0.263776,-0.261761,753.576413,-612.83728,63.214693,
+ -0.870211,0.393404,-0.29659,744.275058,-635.251255,66.89271,
+ -0.870211,0.349319,-0.347431,744.275059,-626.524536,76.901948,
+ -0.928388,0.089223,-0.360743,753.576403,-576.182654,83.81487,
+ -0.9698,0.0263,-0.242479,760.201817,-563.621651,65.290458,
+ -0.9698,0.059096,-0.236633,760.201821,-571.352859,63.961061,
+ -0.9698,0.0263,-0.242479,760.201817,-563.621651,65.290458,
+ -0.928388,0.089223,-0.360743,753.576403,-576.182654,83.81487,
+ -0.928388,0.039234,-0.369537,753.576397,-565.700992,85.617213,
+ -0.494423,0.692194,-0.52575,684.332897,-683.128909,103.191916,
+ -0.614316,0.68383,-0.393691,702.221357,-684.591376,79.42501,
+ -0.494423,0.75738,-0.426523,684.332893,-694.910066,85.224197,
+ -0.614316,0.68383,-0.393691,702.221357,-684.591376,79.42501,
+ -0.494423,0.692194,-0.52575,684.332897,-683.128909,103.191916,
+ -0.606606,0.622389,-0.494632,702.22136,-673.696701,96.040736,
+ -0.373111,0.33957,-0.863412,665.021379,-618.858911,163.184484,
+ -0.244971,0.228806,-0.942145,644.636243,-598.733545,176.514546,
+ -0.373111,0.218748,-0.901631,665.02137,-597.163793,170.061811,
+ -0.244971,0.228806,-0.942145,644.636243,-598.733545,176.514546,
+ -0.373111,0.33957,-0.863412,665.021379,-618.858911,163.184484,
+ -0.244971,0.355055,-0.902178,644.636252,-621.293309,169.363128,
+ -0.959176,0.281343,-0.02878,453.575536,-745.52182,27.359938,
+ -0.985345,0.166102,-0.038803,454.431253,-737.764902,51.939707,
+ -0.989023,0.146995,-0.015036,454.43124,-742.052468,27.005038,
+ -0.985345,0.166102,-0.038803,454.431253,-737.764902,51.939707,
+ -0.959176,0.281343,-0.02878,453.575536,-745.52182,27.359938,
+ -0.952384,0.296613,-0.070606,453.575549,-741.153531,52.764052,
+ -0.985345,0.104291,-0.134978,454.431275,-669.689209,155.763554,
+ -0.999454,0.017548,-0.027998,454.797683,-646.780881,166.522129,
+ -0.999454,0.021199,-0.025346,454.797688,-667.530829,152.916709,
+ -0.999454,0.017548,-0.027998,454.797683,-646.780881,166.522129,
+ -0.985345,0.104291,-0.134978,454.431275,-669.689209,155.763554,
+ -0.985345,0.084925,-0.14793,454.431271,-648.531199,169.636534,
+ 0.866918,-0.01021,0.498346,470.677463,-549.413334,230.278856,
+ 0.79876,-0.062483,0.598396,468.840127,-580.680624,232.05041,
+ 0.874212,-0.050786,0.482881,470.677482,-580.392895,229.237697,
+ 0.79876,-0.062483,0.598396,468.840127,-580.680624,232.05041,
+ 0.866918,-0.01021,0.498346,470.677463,-549.413334,230.278856,
+ 0.792107,-0.00894,0.610317,468.840108,-549.460722,233.099647,
+ -0.648424,0.012535,-0.761176,445.72169,-549.049611,208.627211,
+ -0.556264,0,-0.831005,442.839435,-186.86272,210.7557,
+ -0.665822,0,-0.746111,445.72169,-186.86272,208.627211,
+ -0.556264,0,-0.831005,442.839435,-186.86272,210.7557,
+ -0.648424,0.012535,-0.761176,445.72169,-549.049611,208.627211,
+ -0.536932,0.013961,-0.84351,442.839435,-549.085368,210.7557,
+ 0.381503,-0.338316,0.860231,673.957369,-629.139245,189.276665,
+ 0.499663,-0.423738,0.755502,696.7588,-647.656853,168.080895,
+ 0.499663,-0.316836,0.806196,696.758793,-625.025898,178.836737,
+ 0.499663,-0.423738,0.755502,696.7588,-647.656853,168.080895,
+ 0.381503,-0.338316,0.860231,673.957369,-629.139245,189.276665,
+ 0.381503,-0.452381,0.806106,673.957376,-653.15444,177.862935,
+ 0.609101,-0.079799,0.789068,717.894046,-575.008662,176.604979,
+ 0.707841,-0.151267,0.689985,736.997677,-593.835505,156.380365,
+ 0.707841,-0.055835,0.704162,736.997667,-573.300963,159.911321,
+ 0.707841,-0.151267,0.689985,736.997677,-593.835505,156.380365,
+ 0.609101,-0.079799,0.789068,717.894046,-575.008662,176.604979,
+ 0.609101,-0.186578,0.770833,717.894058,-597.802054,172.685609,
+ -0.649249,0.076378,-0.756731,445.721707,-578.184383,207.648051,
+ -0.536932,0.013961,-0.84351,442.839435,-549.085368,210.7557,
+ -0.648424,0.012535,-0.761176,445.72169,-549.049611,208.627211,
+ -0.536932,0.013961,-0.84351,442.839435,-549.085368,210.7557,
+ -0.649249,0.076378,-0.756731,445.721707,-578.184383,207.648051,
+ -0.537771,0.08495,-0.8388,442.839452,-578.401496,209.770445,
+ -0.537771,0.838627,-0.086642,442.839452,-759.393033,28.778909,
+ -0.630573,0.775692,-0.026069,445.721704,-757.445533,23.357838,
+ -0.517204,0.855379,-0.028747,442.839449,-759.575224,23.357838,
+ -0.630573,0.775692,-0.026069,445.721704,-757.445533,23.357838,
+ -0.537771,0.838627,-0.086642,442.839452,-759.393033,28.778909,
+ -0.649249,0.756522,-0.078421,445.721707,-757.270639,28.561795,
+ 0.590628,-0.806489,0.027104,717.894045,-726.295731,23.357838,
+ 0.499663,-0.861647,0.088896,696.75877,-740.277271,26.823309,
+ 0.479633,-0.876974,0.029473,696.758768,-740.393738,23.357838,
+ 0.499663,-0.861647,0.088896,696.75877,-740.277271,26.823309,
+ 0.590628,-0.806489,0.027104,717.894045,-726.295731,23.357838,
+ 0.609101,-0.788882,0.081617,717.894046,-726.227566,25.386075,
+ 0.251027,-0.016259,0.967844,455.00605,-549.612103,242.110623,
+ 0.361665,-0.094307,0.927526,458.222215,-581.498327,240.043877,
+ 0.382469,-0.01552,0.923838,458.222196,-549.595395,241.116069,
+ 0.361665,-0.094307,0.927526,458.222215,-581.498327,240.043877,
+ 0.251027,-0.016259,0.967844,455.00605,-549.612103,242.110623,
+ 0.229024,-0.098699,0.968404,455.006069,-581.599776,241.035583,
+ 0.924993,-0.140582,0.353021,779.024163,-590.534326,91.294907,
+ 0.867227,-0.245078,0.433421,767.829333,-612.755392,105.979521,
+ 0.924993,-0.187375,0.330572,779.024167,-601.558028,86.055659,
+ 0.867227,-0.245078,0.433421,767.829333,-612.755392,105.979521,
+ 0.924993,-0.140582,0.353021,779.024163,-590.534326,91.294907,
+ 0.867227,-0.183731,0.462774,767.829328,-598.912297,112.558746,
+ 0.867227,-0.183731,0.462774,767.829328,-598.912297,112.558746,
+ 0.794465,-0.298581,0.528844,753.739286,-623.134542,124.447504,
+ 0.867227,-0.245078,0.433421,767.829333,-612.755392,105.979521,
+ 0.794465,-0.298581,0.528844,753.739286,-623.134542,124.447504,
+ 0.867227,-0.183731,0.462774,767.829328,-598.912297,112.558746,
+ 0.794465,-0.223732,0.564597,753.73928,-606.678073,132.26879,
+ 0.794465,-0.223732,0.564597,753.73928,-606.678073,132.26879,
+ 0.701238,-0.343649,0.624636,736.997692,-632.515985,141.14023,
+ 0.794465,-0.298581,0.528844,753.739286,-623.134542,124.447504,
+ 0.701238,-0.343649,0.624636,736.997692,-632.515985,141.14023,
+ 0.794465,-0.223732,0.564597,753.73928,-606.678073,132.26879,
+ 0.707841,-0.243878,0.662936,736.997686,-613.697356,150.084182,
+ 0.609101,-0.289877,0.738219,717.894067,-619.848758,165.69683,
+ 0.701238,-0.343649,0.624636,736.997692,-632.515985,141.14023,
+ 0.707841,-0.243878,0.662936,736.997686,-613.697356,150.084182,
+ 0.701238,-0.343649,0.624636,736.997692,-632.515985,141.14023,
+ 0.609101,-0.289877,0.738219,717.894067,-619.848758,165.69683,
+ 0.598552,-0.382497,0.703869,717.894074,-640.737481,155.769021,
+ 0.499663,-0.316836,0.806196,696.758793,-625.025898,178.836737,
+ 0.598552,-0.382497,0.703869,717.894074,-640.737481,155.769021,
+ 0.609101,-0.289877,0.738219,717.894067,-619.848758,165.69683,
+ 0.598552,-0.382497,0.703869,717.894074,-640.737481,155.769021,
+ 0.499663,-0.316836,0.806196,696.758793,-625.025898,178.836737,
+ 0.499663,-0.423738,0.755502,696.7588,-647.656853,168.080895,
+ -0.796291,0.428601,-0.426873,732.466067,-639.203194,89.580607,
+ -0.870211,0.298718,-0.391791,744.275058,-616.515297,85.628667,
+ -0.870211,0.349319,-0.347431,744.275059,-626.524536,76.901948,
+ -0.870211,0.298718,-0.391791,744.275058,-616.515297,85.628667,
+ -0.796291,0.428601,-0.426873,732.466067,-639.203194,89.580607,
+ -0.796291,0.366435,-0.481296,732.466066,-627.348021,99.916734,
+ 0.256673,-0.939019,0.228829,649.8841,-754.828812,56.090715,
+ 0.127347,-0.922744,0.363767,624.955334,-751.006818,84.287065,
+ 0.127347,-0.963706,0.234635,624.955322,-759.578731,57.246228,
+ 0.127347,-0.922744,0.363767,624.955334,-751.006818,84.287065,
+ 0.256673,-0.939019,0.228829,649.8841,-754.828812,56.090715,
+ 0.256673,-0.899078,0.354651,649.884111,-746.45866,82.495079,
+ 0.79876,-0.56023,0.219373,468.840155,-767.174448,90.657181,
+ 0.707841,-0.682368,0.182581,466.630415,-778.937032,61.955552,
+ 0.79876,-0.584897,0.140986,468.840142,-776.463573,61.353839,
+ 0.707841,-0.682368,0.182581,466.630415,-778.937032,61.955552,
+ 0.79876,-0.56023,0.219373,468.840155,-767.174448,90.657181,
+ 0.707841,-0.651123,0.273862,466.630427,-769.542842,91.59033,
+ 0.973547,-0.004216,0.228449,473.101704,-549.308105,224.014969,
+ 0.932875,-0.038122,0.358177,472.107168,-580.082016,226.198682,
+ 0.973657,-0.024735,0.226671,473.101722,-579.75396,222.991746,
+ 0.932875,-0.038122,0.358177,472.107168,-580.082016,226.198682,
+ 0.973547,-0.004216,0.228449,473.101704,-549.308105,224.014969,
+ 0.928983,-0.005506,0.370082,472.10715,-549.362134,227.231115,
+ 0.127347,-0.922744,0.363767,624.955334,-751.006818,84.287065,
+ 0.030867,-0.871333,0.489721,599.602151,-740.19647,110.675522,
+ 0.030867,-0.929938,0.366419,599.602143,-752.465071,84.861627,
+ 0.030867,-0.871333,0.489721,599.602151,-740.19647,110.675522,
+ 0.127347,-0.922744,0.363767,624.955334,-751.006818,84.287065,
+ 0.127347,-0.864568,0.486113,624.955342,-738.83011,109.90761,
+ -0.986659,0,-0.162803,176.700984,-280.29408,1605.985223,
+ -0.999462,0,-0.032813,180.160558,-186.86272,1570.859583,
+ -0.999462,0,0.032813,180.160558,-280.29408,1570.859583,
+ -0.999462,0,-0.032813,180.160558,-186.86272,1570.859583,
+ -0.986659,0,-0.162803,176.700984,-280.29408,1605.985223,
+ -0.973856,0,-0.227168,176.700984,-186.86272,1605.985223,
+ -0.809671,0.570253,-0.138724,732.466052,-669.667851,35.373762,
+ -0.870211,0.458871,-0.17936,744.275052,-648.232891,43.794023,
+ -0.881047,0.459625,-0.111811,744.275047,-652.24563,31.135492,
+ -0.870211,0.458871,-0.17936,744.275052,-648.232891,43.794023,
+ -0.809671,0.570253,-0.138724,732.466052,-669.667851,35.373762,
+ -0.796291,0.563252,-0.220608,732.466058,-664.91507,50.366817,
+ -0.285905,0.097067,-0.953329,436.335587,-578.704167,212.729198,
+ -0.150052,0.016548,-0.98854,432.838898,-549.148352,214.504709,
+ -0.285329,0.015988,-0.958296,436.33557,-549.135218,213.722949,
+ -0.150052,0.016548,-0.98854,432.838898,-549.148352,214.504709,
+ -0.285905,0.097067,-0.953329,436.335587,-578.704167,212.729198,
+ -0.150374,0.100371,-0.983521,432.838915,-578.78391,213.508718,
+ 0.995804,-0.08571,0.032077,473.642065,-755.603683,86.09829,
+ 0.973657,-0.221914,0.0524,473.101737,-767.615679,59.201429,
+ 0.995804,-0.089282,0.020098,473.642053,-764.379515,58.414175,
+ 0.973657,-0.221914,0.0524,473.101737,-767.615679,59.201429,
+ 0.995804,-0.08571,0.032077,473.642065,-755.603683,86.09829,
+ 0.973657,-0.212704,0.08215,473.101749,-758.702385,87.31918,
+ -0.285905,0.835148,-0.469878,436.335621,-737.047581,108.905866,
+ -0.415875,0.845875,-0.333982,439.690608,-747.931487,83.075452,
+ -0.285905,0.891387,-0.351693,436.335613,-749.104397,83.53758,
+ -0.415875,0.845875,-0.333982,439.690608,-747.931487,83.075452,
+ -0.285905,0.835148,-0.469878,436.335621,-737.047581,108.905866,
+ -0.415875,0.792474,-0.446131,439.690616,-735.948584,108.28822,
+ 0,-0.016797,0.999859,473.71772,-549.195746,217.326639,
+ 0.030866,-0.101695,0.994337,599.602117,-579.071663,216.32257,
+ 0.041063,-0.016783,0.999016,599.602099,-549.195708,217.326639,
+ 0.030866,-0.101695,0.994337,599.602117,-579.071663,216.32257,
+ 0,-0.016797,0.999859,473.71772,-549.195746,217.326639,
+ 0,-0.124431,0.992228,473.717738,-579.071732,216.322569,
+ 0.479633,-0.876974,0.029473,696.758768,-740.393738,23.357838,
+ 0.381503,-0.91951,0.094637,673.957345,-751.440053,27.965226,
+ 0.360344,-0.932293,0.031332,673.957342,-751.594898,23.357838,
+ 0.381503,-0.91951,0.094637,673.957345,-751.440053,27.965226,
+ 0.479633,-0.876974,0.029473,696.758768,-740.393738,23.357838,
+ 0.499663,-0.861647,0.088896,696.75877,-740.277271,26.823309,
+ -0.707932,0.500183,-0.498647,718.363108,-650.643847,101.02126,
+ -0.796291,0.366435,-0.481296,732.466066,-627.348021,99.916734,
+ -0.796291,0.428601,-0.426873,732.466067,-639.203194,89.580607,
+ -0.796291,0.366435,-0.481296,732.466066,-627.348021,99.916734,
+ -0.707932,0.500183,-0.498647,718.363108,-650.643847,101.02126,
+ -0.707932,0.427569,-0.562154,718.363107,-637.122986,112.809644,
+ 0.966794,-0.061815,0.247969,787.130183,-573.195905,71.537315,
+ 0.924993,-0.140582,0.353021,779.024163,-590.534326,91.294907,
+ 0.966794,-0.095028,0.237232,787.130187,-581.689044,68.845,
+ 0.924993,-0.140582,0.353021,779.024163,-590.534326,91.294907,
+ 0.966794,-0.061815,0.247969,787.130183,-573.195905,71.537315,
+ 0.924993,-0.091165,0.368885,779.024159,-578.899518,94.983127,
+ -0.285905,0.350852,-0.891718,436.335613,-633.160168,199.481809,
+ -0.150374,0.233455,-0.96067,432.83893,-606.570796,208.730707,
+ -0.285905,0.226068,-0.93121,436.335601,-606.385575,207.969324,
+ -0.150374,0.233455,-0.96067,432.83893,-606.570796,208.730707,
+ -0.285905,0.350852,-0.891718,436.335613,-633.160168,199.481809,
+ -0.150375,0.362184,-0.919897,432.838941,-633.447412,200.210852,
+ 0.998111,-0.023817,0.056627,793.478048,-563.767069,23.357838,
+ 0.991932,-0.063402,0.109777,792.007217,-577.494024,43.23773,
+ 0.998111,-0.031311,0.052854,793.410423,-566.321374,23.357838,
+ 0.991932,-0.063402,0.109777,792.007217,-577.494024,43.23773,
+ 0.998111,-0.023817,0.056627,793.478048,-563.767069,23.357838,
+ 0.991932,-0.047852,0.117393,792.007216,-572.529419,45.597264,
+ 0.127347,-0.363412,0.922884,624.955334,-633.909652,201.38423,
+ 0.256673,-0.473186,0.842742,649.884119,-657.135168,184.945974,
+ 0.256673,-0.353935,0.899361,649.884111,-632.117666,196.836073,
+ 0.256673,-0.473186,0.842742,649.884119,-657.135168,184.945974,
+ 0.127347,-0.363412,0.922884,624.955334,-633.909652,201.38423,
+ 0.127347,-0.48578,0.864755,624.955342,-659.530197,189.207523,
+ -0.91096,0.410353,-0.041977,452.246978,-748.839872,27.699361,
+ -0.94485,0.32732,-0.011,453.575534,-745.656322,23.357838,
+ -0.890491,0.454743,-0.015282,452.246975,-748.985782,23.357838,
+ -0.94485,0.32732,-0.011,453.575534,-745.656322,23.357838,
+ -0.91096,0.410353,-0.041977,452.246978,-748.839872,27.699361,
+ -0.959176,0.281343,-0.02878,453.575536,-745.52182,27.359938,
+ -0.999951,0.009862,-0.001008,454.797654,-738.498463,26.641479,
+ -0.999342,-0.036239,0.001219,454.667735,-735.026158,23.357838,
+ -0.998419,0.056178,-0.001887,454.797652,-738.60882,23.357838,
+ -0.999342,-0.036239,0.001219,454.667735,-735.026158,23.357838,
+ -0.999951,0.009862,-0.001008,454.797654,-738.498463,26.641479,
+ -0.999345,-0.035987,0.003682,454.667737,-734.928076,26.276244,
+ -0.415875,0.883495,-0.215602,439.690597,-756.366969,56.464997,
+ -0.537771,0.838627,-0.086642,442.839452,-759.393033,28.778909,
+ -0.415875,0.904633,-0.093201,439.690582,-761.097663,28.953287,
+ -0.537771,0.838627,-0.086642,442.839452,-759.393033,28.778909,
+ -0.415875,0.883495,-0.215602,439.690597,-756.366969,56.464997,
+ -0.537771,0.818998,-0.200111,442.839466,-754.702001,56.059962,
+ 0.030867,-0.603851,0.796499,599.602156,-684.199423,174.90216,
+ 0.127347,-0.701215,0.701485,624.955349,-704.633973,155.011385,
+ 0.127347,-0.599085,0.790493,624.955347,-683.252488,173.653183,
+ 0.127347,-0.701215,0.701485,624.955349,-704.633973,155.011385,
+ 0.030867,-0.603851,0.796499,599.602156,-684.199423,174.90216,
+ 0.030867,-0.706755,0.706785,599.602158,-705.742267,156.119679,
+ -0.537771,0.508681,-0.672344,442.83949,-680.220296,169.653769,
+ -0.415875,0.444984,-0.793119,439.690616,-657.910808,186.325996,
+ -0.537771,0.412318,-0.735388,442.839485,-657.07129,184.832214,
+ -0.415875,0.444984,-0.793119,439.690616,-657.910808,186.325996,
+ -0.537771,0.508681,-0.672344,442.83949,-680.220296,169.653769,
+ -0.415875,0.548909,-0.725084,439.690621,-681.255534,171.01922,
+ -0.244971,0.474679,-0.845381,644.636259,-642.668145,159.204284,
+ -0.112343,0.364093,-0.924562,623.546355,-622.700434,172.934486,
+ -0.244971,0.355055,-0.902178,644.636252,-621.293309,169.363128,
+ -0.112343,0.364093,-0.924562,623.546355,-622.700434,172.934486,
+ -0.244971,0.474679,-0.845381,644.636259,-642.668145,159.204284,
+ -0.112343,0.486683,-0.866325,623.546362,-644.548798,162.550587,
+ -0.373111,0.454056,-0.809087,665.021386,-639.414516,153.414997,
+ -0.244971,0.355055,-0.902178,644.636252,-621.293309,169.363128,
+ -0.373111,0.33957,-0.863412,665.021379,-618.858911,163.184484,
+ -0.244971,0.355055,-0.902178,644.636252,-621.293309,169.363128,
+ -0.373111,0.454056,-0.809087,665.021386,-639.414516,153.414997,
+ -0.244971,0.474679,-0.845381,644.636259,-642.668145,159.204284,
+ -0.494423,0.4252,-0.758123,684.332893,-634.846784,145.287478,
+ -0.373111,0.33957,-0.863412,665.021379,-618.858911,163.184484,
+ -0.494423,0.317928,-0.808992,684.332887,-615.44129,154.510351,
+ -0.373111,0.33957,-0.863412,665.021379,-618.858911,163.184484,
+ -0.494423,0.4252,-0.758123,684.332893,-634.846784,145.287478,
+ -0.373111,0.454056,-0.809087,665.021386,-639.414516,153.414997,
+ -0.595888,0.383438,-0.705615,702.221357,-629.047597,134.968788,
+ -0.494423,0.317928,-0.808992,684.332887,-615.44129,154.510351,
+ -0.606705,0.290533,-0.739932,702.221351,-611.102283,143.49768,
+ -0.494423,0.317928,-0.808992,684.332887,-615.44129,154.510351,
+ -0.595888,0.383438,-0.705615,702.221357,-629.047597,134.968788,
+ -0.494423,0.4252,-0.758123,684.332893,-634.846784,145.287478,
+ -0.701084,0.343733,-0.624763,718.363103,-622.121887,122.645633,
+ -0.606705,0.290533,-0.739932,702.221351,-611.102283,143.49768,
+ -0.707841,0.243878,-0.662936,718.363098,-605.920401,130.345733,
+ -0.606705,0.290533,-0.739932,702.221351,-611.102283,143.49768,
+ -0.701084,0.343733,-0.624763,718.363103,-622.121887,122.645633,
+ -0.595888,0.383438,-0.705615,702.221357,-629.047597,134.968788,
+ -0.701084,0.343733,-0.624763,718.363103,-622.121887,122.645633,
+ -0.796291,0.222882,-0.562356,732.466058,-599.989405,115.292483,
+ -0.796291,0.297433,-0.526739,732.466063,-614.194966,108.540989,
+ -0.796291,0.222882,-0.562356,732.466058,-599.989405,115.292483,
+ -0.701084,0.343733,-0.624763,718.363103,-622.121887,122.645633,
+ -0.707841,0.243878,-0.662936,718.363098,-605.920401,130.345733,
+ -0.993727,0.090031,-0.066344,764.031425,-586.699189,30.082194,
+ -0.998991,0.032467,-0.031019,764.696221,-572.980425,23.357838,
+ -0.998991,0.036391,-0.026305,764.531578,-577.829947,23.357838,
+ -0.998991,0.032467,-0.031019,764.696221,-572.980425,23.357838,
+ -0.993727,0.090031,-0.066344,764.031425,-586.699189,30.082194,
+ -0.993727,0.08015,-0.077994,764.031425,-583.441377,33.81879,
+ 0.998111,-0.049787,0.035988,792.935095,-577.829952,23.357838,
+ 0.991932,-0.111235,0.060808,792.007217,-592.860317,27.871437,
+ 0.998112,-0.05354,0.03009,792.574093,-584.829111,23.357838,
+ 0.991932,-0.111235,0.060808,792.007217,-592.860317,27.871437,
+ 0.998111,-0.049787,0.035988,792.935095,-577.829952,23.357838,
+ 0.991932,-0.101911,0.075398,792.007218,-589.846284,32.468209,
+ -0.993727,0.012896,-0.111089,764.031418,-561.470422,44.260952,
+ -0.998987,0.001007,-0.04498,764.9959,-545.937132,23.357838,
+ -0.998991,0.005587,-0.044554,764.975642,-559.332125,23.357838,
+ -0.998987,0.001007,-0.04498,764.9959,-545.937132,23.357838,
+ -0.993727,0.012896,-0.111089,764.031418,-561.470422,44.260952,
+ -0.9937,0.002257,-0.112046,764.031409,-546.296855,44.770904,
+ 0.924681,-0,0.380742,779.024141,-186.86272,97.713067,
+ 0.866755,-0.008697,0.498658,767.829302,-547.569289,120.514493,
+ 0.919603,-0.008082,0.392766,779.024141,-547.186239,97.713067,
+ 0.866755,-0.008697,0.498658,767.829302,-547.569289,120.514493,
+ 0.924681,-0,0.380742,779.024141,-186.86272,97.713067,
+ 0.855563,-0,0.517699,767.829302,-186.86272,120.514493,
+ -0.901181,0.346254,-0.26073,452.247014,-710.823017,124.188674,
+ -0.952384,0.216659,-0.21453,453.575573,-691.225448,141.602861,
+ -0.952384,0.243872,-0.183005,453.575571,-708.165176,122.173591,
+ -0.952384,0.216659,-0.21453,453.575573,-691.225448,141.602861,
+ -0.901181,0.346254,-0.26073,452.247014,-710.823017,124.188674,
+ -0.901181,0.307496,-0.305481,452.247015,-693.58391,143.961322,
+ -0.952384,0.243872,-0.183005,453.575571,-708.165176,122.173591,
+ -0.985345,0.121711,-0.119507,454.431277,-688.759444,139.136857,
+ -0.985345,0.136861,-0.101808,454.431275,-705.386141,120.066621,
+ -0.985345,0.121711,-0.119507,454.431277,-688.759444,139.136857,
+ -0.952384,0.243872,-0.183005,453.575571,-708.165176,122.173591,
+ -0.952384,0.216659,-0.21453,453.575573,-691.225448,141.602861,
+ -0.285905,0.930996,-0.226946,436.335601,-757.591911,56.762987,
+ -0.415875,0.904633,-0.093201,439.690582,-761.097663,28.953287,
+ -0.285905,0.953237,-0.097966,436.335587,-762.351785,29.08158,
+ -0.415875,0.904633,-0.093201,439.690582,-761.097663,28.953287,
+ -0.285905,0.930996,-0.226946,436.335601,-757.591911,56.762987,
+ -0.415875,0.883495,-0.215602,439.690597,-756.366969,56.464997,
+ 0.229025,-0.58781,0.775904,455.006113,-699.207898,194.697902,
+ 0.361665,-0.658837,0.659646,458.22226,-722.603323,172.980735,
+ 0.361665,-0.562804,0.74327,458.222259,-698.605625,193.903521,
+ 0.361665,-0.658837,0.659646,458.22226,-722.603323,172.980735,
+ 0.229025,-0.58781,0.775904,455.006113,-699.207898,194.697902,
+ 0.229025,-0.688056,0.688568,455.006115,-723.308225,173.685638,
+ 0.361665,-0.562804,0.74327,458.222259,-698.605625,193.903521,
+ 0.487279,-0.616933,0.618023,461.270002,-721.590015,171.967428,
+ 0.487279,-0.526963,0.696326,461.27,-697.739849,192.761586,
+ 0.487279,-0.616933,0.618023,461.270002,-721.590015,171.967428,
+ 0.361665,-0.562804,0.74327,458.222259,-698.605625,193.903521,
+ 0.361665,-0.658837,0.659646,458.22226,-722.603323,172.980735,
+ -0.845271,0.531564,-0.054376,450.471088,-751.942886,28.016787,
+ -0.890491,0.454743,-0.015282,452.246975,-748.985782,23.357838,
+ -0.819027,0.573431,-0.019271,450.471085,-752.099463,23.357838,
+ -0.890491,0.454743,-0.015282,452.246975,-748.985782,23.357838,
+ -0.845271,0.531564,-0.054376,450.471088,-751.942886,28.016787,
+ -0.91096,0.410353,-0.041977,452.246978,-748.839872,27.699361,
+ -0.494423,0.84441,-0.206198,684.332878,-710.625471,45.337452,
+ -0.551599,0.82639,-0.113216,696.28309,-706.40024,23.357838,
+ -0.482609,0.869945,-0.101409,684.332867,-714.266541,24.162533,
+ -0.551599,0.82639,-0.113216,696.28309,-706.40024,23.357838,
+ -0.494423,0.84441,-0.206198,684.332878,-710.625471,45.337452,
+ -0.599001,0.779767,-0.182103,702.221343,-699.124264,42.539571,
+ -0.551599,0.82639,-0.113216,696.28309,-706.40024,23.357838,
+ -0.599001,0.779767,-0.182103,702.221343,-699.124264,42.539571,
+ -0.605809,0.784102,-0.134828,702.221333,-702.422602,23.357838,
+ -0.796291,0.297433,-0.526739,732.466063,-614.194966,108.540989,
+ -0.870211,0.181845,-0.457892,744.275052,-593.41661,98.610304,
+ -0.870211,0.242544,-0.428841,744.275056,-605.410265,92.910065,
+ -0.870211,0.181845,-0.457892,744.275052,-593.41661,98.610304,
+ -0.796291,0.297433,-0.526739,732.466063,-614.194966,108.540989,
+ -0.796291,0.222882,-0.562356,732.466058,-599.989405,115.292483,
+ -0.870211,0.242544,-0.428841,744.275056,-605.410265,92.910065,
+ -0.928388,0.137548,-0.34522,753.576407,-586.320946,80.601044,
+ -0.928388,0.183307,-0.323257,753.57641,-595.926736,76.035688,
+ -0.928388,0.137548,-0.34522,753.576407,-586.320946,80.601044,
+ -0.870211,0.242544,-0.428841,744.275056,-605.410265,92.910065,
+ -0.870211,0.181845,-0.457892,744.275052,-593.41661,98.610304,
+ -0.928388,0.183307,-0.323257,753.57641,-595.926736,76.035688,
+ -0.9698,0.09079,-0.226373,760.201824,-578.830801,61.590563,
+ -0.9698,0.12079,-0.21189,760.201826,-585.915972,58.223185,
+ -0.9698,0.09079,-0.226373,760.201824,-578.830801,61.590563,
+ -0.928388,0.183307,-0.323257,753.57641,-595.926736,76.035688,
+ -0.928388,0.137548,-0.34522,753.576407,-586.320946,80.601044,
+ -0.9698,0.12079,-0.21189,760.201826,-585.915972,58.223185,
+ -0.993727,0.042411,-0.103482,764.031423,-571.081703,41.922837,
+ -0.993727,0.056116,-0.096737,764.031424,-575.55911,39.794854,
+ -0.993727,0.042411,-0.103482,764.031423,-571.081703,41.922837,
+ -0.9698,0.12079,-0.21189,760.201826,-585.915972,58.223185,
+ -0.9698,0.09079,-0.226373,760.201824,-578.830801,61.590563,
+ -0.993727,0.056116,-0.096737,764.031424,-575.55911,39.794854,
+ -0.998991,0.017409,-0.041391,764.928093,-563.76708,23.357838,
+ -0.998991,0.022887,-0.038633,764.878707,-566.321382,23.357838,
+ -0.998991,0.017409,-0.041391,764.928093,-563.76708,23.357838,
+ -0.993727,0.056116,-0.096737,764.031424,-575.55911,39.794854,
+ -0.993727,0.042411,-0.103482,764.031423,-571.081703,41.922837,
+ 0.991932,-0.063402,0.109777,792.007217,-577.494024,43.23773,
+ 0.966794,-0.15555,0.202766,787.130191,-597.186922,60.135075,
+ 0.991932,-0.07777,0.100113,792.007218,-582.090797,40.223697,
+ 0.966794,-0.15555,0.202766,787.130191,-597.186922,60.135075,
+ 0.991932,-0.063402,0.109777,792.007217,-577.494024,43.23773,
+ 0.966794,-0.126469,0.22207,787.130189,-589.736091,65.02047,
+ 0.966794,-0.126469,0.22207,787.130189,-589.736091,65.02047,
+ 0.924993,-0.230673,0.301955,779.024169,-611.764971,79.363123,
+ 0.966794,-0.15555,0.202766,787.130191,-597.186922,60.135075,
+ 0.924993,-0.230673,0.301955,779.024169,-611.764971,79.363123,
+ 0.966794,-0.126469,0.22207,787.130189,-589.736091,65.02047,
+ 0.924993,-0.187375,0.330572,779.024167,-601.558028,86.055659,
+ 0.924993,-0.187375,0.330572,779.024167,-601.558028,86.055659,
+ 0.867227,-0.301852,0.395982,767.829336,-625.572837,97.575321,
+ 0.924993,-0.230673,0.301955,779.024169,-611.764971,79.363123,
+ 0.867227,-0.301852,0.395982,767.829336,-625.572837,97.575321,
+ 0.924993,-0.187375,0.330572,779.024167,-601.558028,86.055659,
+ 0.867227,-0.245078,0.433421,767.829333,-612.755392,105.979521,
+ 0.867227,-0.245078,0.433421,767.829333,-612.755392,105.979521,
+ 0.794465,-0.367859,0.483224,753.739289,-638.371733,114.456714,
+ 0.867227,-0.301852,0.395982,767.829336,-625.572837,97.575321,
+ 0.794465,-0.367859,0.483224,753.739289,-638.371733,114.456714,
+ 0.867227,-0.245078,0.433421,767.829333,-612.755392,105.979521,
+ 0.794465,-0.298581,0.528844,753.739286,-623.134542,124.447504,
+ -0.244971,0.09829,-0.964535,644.636231,-575.409716,180.525125,
+ -0.112099,0.016649,-0.993558,623.546317,-548.656939,185.255996,
+ -0.244466,0.016195,-0.969523,644.636215,-548.592598,181.426394,
+ -0.112099,0.016649,-0.993558,623.546317,-548.656939,185.255996,
+ -0.244971,0.09829,-0.964535,644.636231,-575.409716,180.525125,
+ -0.112343,0.100949,-0.988528,623.546333,-575.800358,184.343761,
+ -0.373111,0.093846,-0.923028,665.021359,-574.733894,173.918677,
+ -0.244466,0.016195,-0.969523,644.636215,-548.592598,181.426394,
+ -0.372406,0.015448,-0.927941,665.021343,-548.48129,174.800973,
+ -0.244466,0.016195,-0.969523,644.636215,-548.592598,181.426394,
+ -0.373111,0.093846,-0.923028,665.021359,-574.733894,173.918677,
+ -0.244971,0.09829,-0.964535,644.636231,-575.409716,180.525125,
+ 0.923987,-0.382207,0.012845,472.107164,-776.05994,23.357838,
+ 0.885205,-0.462786,0.04734,470.677482,-778.860284,30.770308,
+ 0.862236,-0.50622,0.017013,470.677477,-779.109402,23.357838,
+ 0.885205,-0.462786,0.04734,470.677482,-778.860284,30.770308,
+ 0.923987,-0.382207,0.012845,472.107164,-776.05994,23.357838,
+ 0.940951,-0.336786,0.034451,472.107168,-775.82127,30.459429,
+ -0.040706,0.99398,-0.101718,429.267738,-763.421251,29.190985,
+ -0.127104,0.99133,-0.033316,432.838912,-763.326349,23.357838,
+ -0.027072,0.999069,-0.033577,429.267734,-763.617291,23.357838,
+ -0.127104,0.99133,-0.033316,432.838912,-763.326349,23.357838,
+ -0.040706,0.99398,-0.101718,429.267738,-763.421251,29.190985,
+ -0.150374,0.983472,-0.100844,432.838915,-763.131306,29.161323,
+ -0.959176,0.281343,-0.02878,453.575536,-745.52182,27.359938,
+ -0.981057,0.193609,-0.006506,454.431238,-742.175043,23.357838,
+ -0.94485,0.32732,-0.011,453.575534,-745.656322,23.357838,
+ -0.981057,0.193609,-0.006506,454.431238,-742.175043,23.357838,
+ -0.959176,0.281343,-0.02878,453.575536,-745.52182,27.359938,
+ -0.989023,0.146995,-0.015036,454.43124,-742.052468,27.005038,
+ 0.998111,-0.044419,0.042437,793.160542,-572.980425,23.357838,
+ 0.991932,-0.101911,0.075398,792.007218,-589.846284,32.468209,
+ 0.998111,-0.049787,0.035988,792.935095,-577.829952,23.357838,
+ 0.991932,-0.101911,0.075398,792.007218,-589.846284,32.468209,
+ 0.998111,-0.044419,0.042437,793.160542,-572.980425,23.357838,
+ 0.991932,-0.090686,0.088582,792.007219,-586.233981,36.611394,
+ 0.690548,-0.722878,0.024294,466.630394,-784.472872,23.357838,
+ 0.603443,-0.793169,0.082097,464.090747,-786.408778,31.542489,
+ 0.583909,-0.811361,0.027268,464.090742,-786.683847,23.357838,
+ 0.603443,-0.793169,0.082097,464.090747,-786.408778,31.542489,
+ 0.690548,-0.722878,0.024294,466.630394,-784.472872,23.357838,
+ 0.714887,-0.69482,0.078501,466.630399,-784.205377,31.31709,
+ -0.551599,0.82639,-0.113216,696.28309,-706.40024,23.357838,
+ -0.473888,0.880088,-0.029578,684.332867,-714.293585,23.357838,
+ -0.482609,0.869945,-0.101409,684.332867,-714.266541,24.162533,
+ -0.989023,0.146995,-0.015036,454.43124,-742.052468,27.005038,
+ -0.998419,0.056178,-0.001887,454.797652,-738.60882,23.357838,
+ -0.981057,0.193609,-0.006506,454.431238,-742.175043,23.357838,
+ -0.998419,0.056178,-0.001887,454.797652,-738.60882,23.357838,
+ -0.989023,0.146995,-0.015036,454.43124,-742.052468,27.005038,
+ -0.999951,0.009862,-0.001008,454.797654,-738.498463,26.641479,
+ 0.862236,-0.50622,0.017013,470.677477,-779.109402,23.357838,
+ 0.812465,-0.579983,0.059329,468.840127,-781.672997,31.058037,
+ 0.783922,-0.620509,0.020854,468.840122,-781.931785,23.357838,
+ 0.812465,-0.579983,0.059329,468.840127,-781.672997,31.058037,
+ 0.862236,-0.50622,0.017013,470.677477,-779.109402,23.357838,
+ 0.885205,-0.462786,0.04734,470.677482,-778.860284,30.770308,
+ -0.993727,0.08015,-0.077994,764.031425,-583.441377,33.81879,
+ -0.998991,0.027938,-0.035154,764.805052,-569.303684,23.357838,
+ -0.998991,0.032467,-0.031019,764.696221,-572.980425,23.357838,
+ -0.998991,0.027938,-0.035154,764.805052,-569.303684,23.357838,
+ -0.993727,0.08015,-0.077994,764.031425,-583.441377,33.81879,
+ -0.993727,0.068775,-0.088188,764.031425,-579.704781,37.076602,
+ 0.020529,-0.999225,0.033582,599.602113,-766.149871,23.357838,
+ 0,-0.996871,0.079045,473.717738,-765.945156,29.449145,
+ 0,-0.999436,0.033589,473.717734,-766.149872,23.357838,
+ 0,-0.996871,0.079045,473.717738,-765.945156,29.449145,
+ 0.020529,-0.999225,0.033582,599.602113,-766.149871,23.357838,
+ 0.030866,-0.994332,0.101738,599.602117,-765.945157,29.449075,
+ -0.683524,0,-0.729928,127.425692,-280.29408,1698.17281,
+ -0.582647,0,-0.812725,100.141826,-186.86272,1720.5641,
+ -0.729928,0,-0.683524,127.425692,-186.86272,1698.17281,
+ -0.582647,0,-0.812725,100.141826,-186.86272,1720.5641,
+ -0.683524,0,-0.729928,127.425692,-280.29408,1698.17281,
+ -0.528184,0,-0.84913,100.141826,-280.29408,1720.5641,
+ -0.832687,0.442054,-0.333498,450.471124,-713.308606,126.073164,
+ -0.901181,0.307496,-0.305481,452.247015,-693.58391,143.961322,
+ -0.901181,0.346254,-0.26073,452.247014,-710.823017,124.188674,
+ -0.901181,0.307496,-0.305481,452.247015,-693.58391,143.961322,
+ -0.832687,0.442054,-0.333498,450.471124,-713.308606,126.073164,
+ -0.832687,0.392486,-0.390624,450.471126,-695.789522,146.166935,
+ -0.649152,0.44561,-0.616469,445.721745,-678.931346,167.953679,
+ -0.748179,0.326101,-0.577828,448.282012,-654.795099,180.782109,
+ -0.748179,0.401798,-0.528002,448.282017,-677.413444,165.951609,
+ -0.748179,0.326101,-0.577828,448.282012,-654.795099,180.782109,
+ -0.649152,0.44561,-0.616469,445.721745,-678.931346,167.953679,
+ -0.649152,0.35745,-0.67144,445.72174,-656.026027,182.972343,
+ -0.372406,0.015448,-0.927941,665.021343,-548.48129,174.800973,
+ -0.266155,0,-0.96393,644.636215,-186.86272,181.426394,
+ -0.393115,0,-0.919489,665.021343,-186.86272,174.800973,
+ -0.266155,0,-0.96393,644.636215,-186.86272,181.426394,
+ -0.372406,0.015448,-0.927941,665.021343,-548.48129,174.800973,
+ -0.244466,0.016195,-0.969523,644.636215,-548.592598,181.426394,
+ 0.792107,-0.00894,0.610317,468.840108,-549.460722,233.099647,
+ 0.707841,-0.055835,0.704162,466.630399,-580.939677,234.58279,
+ 0.79876,-0.062483,0.598396,468.840127,-580.680624,232.05041,
+ 0.707841,-0.055835,0.704162,466.630399,-580.939677,234.58279,
+ 0.792107,-0.00894,0.610317,468.840108,-549.460722,233.099647,
+ 0.707157,-0.011876,0.706957,466.63038,-549.503387,235.639299,
+ 0.517753,-0.01437,0.85541,696.758754,-548.76324,191.585041,
+ 0.609101,-0.079799,0.789068,717.894046,-575.008662,176.604979,
+ 0.625544,-0.013105,0.780079,717.89403,-548.526532,177.494989,
+ 0.609101,-0.079799,0.789068,717.894046,-575.008662,176.604979,
+ 0.517753,-0.01437,0.85541,696.758754,-548.76324,191.585041,
+ 0.499663,-0.087405,0.861799,696.75877,-576.445897,190.654684,
+ 0.499663,-0.087405,0.861799,696.75877,-576.445897,190.654684,
+ 0.609101,-0.186578,0.770833,717.894058,-597.802054,172.685609,
+ 0.609101,-0.079799,0.789068,717.894046,-575.008662,176.604979,
+ 0.609101,-0.186578,0.770833,717.894058,-597.802054,172.685609,
+ 0.499663,-0.087405,0.861799,696.75877,-576.445897,190.654684,
+ 0.499663,-0.204023,0.84185,696.758783,-601.14038,186.408417,
+ 0.381503,-0.093498,0.919627,673.957345,-577.587813,201.817466,
+ 0.499663,-0.204023,0.84185,696.758783,-601.14038,186.408417,
+ 0.499663,-0.087405,0.861799,696.75877,-576.445897,190.654684,
+ 0.499663,-0.204023,0.84185,696.758783,-601.14038,186.408417,
+ 0.381503,-0.093498,0.919627,673.957345,-577.587813,201.817466,
+ 0.381503,-0.21794,0.898308,673.957358,-603.792753,197.311473,
+ 0.256672,-0.097972,0.96152,649.884086,-578.414663,209.900281,
+ 0.381503,-0.21794,0.898308,673.957358,-603.792753,197.311473,
+ 0.381503,-0.093498,0.919627,673.957345,-577.587813,201.817466,
+ 0.381503,-0.21794,0.898308,673.957358,-603.792753,197.311473,
+ 0.256672,-0.097972,0.96152,649.884086,-578.414663,209.900281,
+ 0.256673,-0.228081,0.939201,649.8841,-605.713302,205.206225,
+ 0.127347,-0.100746,0.986728,624.955308,-578.912147,214.763349,
+ 0.256673,-0.228081,0.939201,649.8841,-605.713302,205.206225,
+ 0.256672,-0.097972,0.96152,649.884086,-578.414663,209.900281,
+ 0.256673,-0.228081,0.939201,649.8841,-605.713302,205.206225,
+ 0.127347,-0.100746,0.986728,624.955308,-578.912147,214.763349,
+ 0.127347,-0.234264,0.963796,624.955322,-606.868816,209.956143,
+ -0.993727,0.042411,-0.103482,764.031423,-571.081703,41.922837,
+ -0.998991,0.011606,-0.043377,764.959284,-561.475403,23.357838,
+ -0.998991,0.017409,-0.041391,764.928093,-563.76708,23.357838,
+ -0.998991,0.011606,-0.043377,764.959284,-561.475403,23.357838,
+ -0.993727,0.042411,-0.103482,764.031423,-571.081703,41.922837,
+ -0.993727,0.027914,-0.108296,764.031421,-566.356087,43.420852,
+ -0.494423,0.614096,-0.615169,684.332898,-669.009253,119.386665,
+ -0.373111,0.560072,-0.739667,665.02139,-658.447133,140.935603,
+ -0.494423,0.524541,-0.693111,684.332897,-652.814504,133.506322,
+ -0.373111,0.560072,-0.739667,665.02139,-658.447133,140.935603,
+ -0.494423,0.614096,-0.615169,684.332898,-669.009253,119.386665,
+ -0.373111,0.655639,-0.656449,665.021391,-675.601701,125.979113,
+ 0.517753,-0.01437,0.85541,696.758754,-548.76324,191.585041,
+ 0.590628,-0,0.806944,717.89403,-186.86272,177.494989,
+ 0.479633,0,0.877469,696.758754,-186.86272,191.585041,
+ 0.590628,-0,0.806944,717.89403,-186.86272,177.494989,
+ 0.517753,-0.01437,0.85541,696.758754,-548.76324,191.585041,
+ 0.625544,-0.013105,0.780079,717.89403,-548.526532,177.494989,
+ -0.928388,0.137548,-0.34522,753.576407,-586.320946,80.601044,
+ -0.9698,0.059096,-0.236633,760.201821,-571.352859,63.961061,
+ -0.9698,0.09079,-0.226373,760.201824,-578.830801,61.590563,
+ -0.9698,0.059096,-0.236633,760.201821,-571.352859,63.961061,
+ -0.928388,0.137548,-0.34522,753.576407,-586.320946,80.601044,
+ -0.928388,0.089223,-0.360743,753.576403,-576.182654,83.81487,
+ -0.494423,0.317928,-0.808992,684.332887,-615.44129,154.510351,
+ -0.373111,0.218748,-0.901631,665.02137,-597.163793,170.061811,
+ -0.494423,0.204724,-0.844769,684.332878,-594.960039,161.002883,
+ -0.373111,0.218748,-0.901631,665.02137,-597.163793,170.061811,
+ -0.494423,0.317928,-0.808992,684.332887,-615.44129,154.510351,
+ -0.373111,0.33957,-0.863412,665.021379,-618.858911,163.184484,
+ 0.127347,-0.234264,0.963796,624.955322,-606.868816,209.956143,
+ 0.256673,-0.353935,0.899361,649.884111,-632.117666,196.836073,
+ 0.256673,-0.228081,0.939201,649.8841,-605.713302,205.206225,
+ 0.256673,-0.353935,0.899361,649.884111,-632.117666,196.836073,
+ 0.127347,-0.234264,0.963796,624.955322,-606.868816,209.956143,
+ 0.127347,-0.363412,0.922884,624.955334,-633.909652,201.38423,
+ -0.285905,0.953237,-0.097966,436.335587,-762.351785,29.08158,
+ -0.393899,0.918635,-0.030873,439.690579,-761.285715,23.357838,
+ -0.263028,0.964244,-0.032406,436.335584,-762.544148,23.357838,
+ -0.393899,0.918635,-0.030873,439.690579,-761.285715,23.357838,
+ -0.285905,0.953237,-0.097966,436.335587,-762.351785,29.08158,
+ -0.415875,0.904633,-0.093201,439.690582,-761.097663,28.953287,
+ 0.999747,-0.022474,0.000755,473.717734,-766.149872,23.357838,
+ 0.997653,-0.068124,0.006968,473.642039,-769.30108,29.792441,
+ 0.993395,-0.114677,0.003853,473.642035,-769.517334,23.357838,
+ 0.997653,-0.068124,0.006968,473.642039,-769.30108,29.792441,
+ 0.999747,-0.022474,0.000755,473.717734,-766.149872,23.357838,
+ 0.999748,-0.022318,0.002282,473.717738,-765.945156,29.449145,
+ -0.373111,0.922912,-0.094985,665.021359,-723.541264,25.111307,
+ -0.473888,0.880088,-0.029578,684.332867,-714.293585,23.357838,
+ -0.351418,0.935691,-0.031446,665.021358,-723.600195,23.357838,
+ -0.473888,0.880088,-0.029578,684.332867,-714.293585,23.357838,
+ -0.373111,0.922912,-0.094985,665.021359,-723.541264,25.111307,
+ -0.482609,0.869945,-0.101409,684.332867,-714.266541,24.162533,
+ -0.244971,0.964459,-0.099038,644.636231,-730.147713,25.787129,
+ -0.351418,0.935691,-0.031446,665.021358,-723.600195,23.357838,
+ -0.222589,0.974362,-0.032746,644.63623,-730.229356,23.357838,
+ -0.351418,0.935691,-0.031446,665.021358,-723.600195,23.357838,
+ -0.244971,0.964459,-0.099038,644.636231,-730.147713,25.787129,
+ -0.373111,0.922912,-0.094985,665.021359,-723.541264,25.111307,
+ -0.022557,0.994554,-0.10175,602.133267,-734.928078,26.276163,
+ -0.089733,0.995404,-0.033453,623.546332,-734.061121,23.357838,
+ -0.015002,0.999323,-0.033585,602.133266,-735.026157,23.357838,
+ -0.089733,0.995404,-0.033453,623.546332,-734.061121,23.357838,
+ -0.022557,0.994554,-0.10175,602.133267,-734.928078,26.276163,
+ -0.112343,0.988493,-0.101292,623.546333,-733.966349,26.17777,
+ 0.691408,-0.722056,0.024266,736.997667,-709.544681,23.357838,
+ 0.609101,-0.788882,0.081617,717.894046,-726.227566,25.386075,
+ 0.590628,-0.806489,0.027104,717.894045,-726.295731,23.357838,
+ 0.609101,-0.788882,0.081617,717.894046,-726.227566,25.386075,
+ 0.691408,-0.722056,0.024266,736.997667,-709.544681,23.357838,
+ 0.714403,-0.693748,0.091332,736.997667,-709.533908,23.678376,
+ -0.936465,0.339085,-0.089746,753.576403,-633.437458,26.560066,
+ -0.951243,0.299703,-0.072908,757.969157,-620.274076,23.357838,
+ -0.919489,0.387429,-0.066619,753.576401,-633.988087,23.357838,
+ 0.967989,-0.250852,0.00843,473.101718,-772.841978,23.357838,
+ 0.940951,-0.336786,0.034451,472.107168,-775.82127,30.459429,
+ 0.923987,-0.382207,0.012845,472.107164,-776.05994,23.357838,
+ 0.940951,-0.336786,0.034451,472.107168,-775.82127,30.459429,
+ 0.967989,-0.250852,0.00843,473.101718,-772.841978,23.357838,
+ 0.978666,-0.204393,0.020908,473.101722,-772.614333,30.131373,
+ 0.360344,-0.932293,0.031332,673.957342,-751.594898,23.357838,
+ 0.256672,-0.961442,0.098738,649.884086,-759.522868,28.792076,
+ 0.234823,-0.97149,0.03265,649.884083,-759.705502,23.357838,
+ 0.256672,-0.961442,0.098738,649.884086,-759.522868,28.792076,
+ 0.360344,-0.932293,0.031332,673.957342,-751.594898,23.357838,
+ 0.381503,-0.91951,0.094637,673.957345,-751.440053,27.965226,
+ 0.068639,-0.997079,0.03351,451.683295,-791.488471,23.357838,
+ 0.00966,-0.995709,0.092029,448.317739,-791.272422,32.040027,
+ 0.011244,-0.999373,0.033587,448.317734,-791.564213,23.357838,
+ 0.00966,-0.995709,0.092029,448.317739,-791.272422,32.040027,
+ 0.068639,-0.997079,0.03351,451.683295,-791.488471,23.357838,
+ 0.091928,-0.990581,0.101478,451.683301,-791.19694,32.032304,
+ 0.714403,-0.693748,0.091332,736.997667,-709.533908,23.678376,
+ 0.691408,-0.722056,0.024266,736.997667,-709.544681,23.357838,
+ 0.752834,-0.654794,0.066982,739.751559,-706.400475,23.357838,
+ -0.112343,0.988493,-0.101292,623.546333,-733.966349,26.17777,
+ -0.222589,0.974362,-0.032746,644.63623,-730.229356,23.357838,
+ -0.089733,0.995404,-0.033453,623.546332,-734.061121,23.357838,
+ -0.222589,0.974362,-0.032746,644.63623,-730.229356,23.357838,
+ -0.112343,0.988493,-0.101292,623.546333,-733.966349,26.17777,
+ -0.244971,0.964459,-0.099038,644.636231,-730.147713,25.787129,
+ 0.999748,-0.0058,0.021677,473.717752,-607.239369,211.479086,
+ 0.995804,-0.035007,0.084556,473.642065,-635.720877,205.981096,
+ 0.999748,-0.0087,0.020685,473.717764,-634.484263,202.842487,
+ 0.995804,-0.035007,0.084556,473.642065,-635.720877,205.981096,
+ 0.999748,-0.0058,0.021677,473.717752,-607.239369,211.479086,
+ 0.995804,-0.023158,0.088537,473.642053,-608.036762,214.756927,
+ 0.091928,-0.487734,0.868139,451.683339,-672.734453,212.70224,
+ 0.229025,-0.58781,0.775904,455.006113,-699.207898,194.697902,
+ 0.229025,-0.476597,0.848766,455.006107,-672.469112,212.230111,
+ 0.229025,-0.58781,0.775904,455.006113,-699.207898,194.697902,
+ 0.091928,-0.487734,0.868139,451.683339,-672.734453,212.70224,
+ 0.091928,-0.601482,0.793579,451.683345,-699.535099,195.12947,
+ 0.011271,-0.489901,0.871705,448.317778,-672.771628,212.768386,
+ 0.091928,-0.601482,0.793579,451.683345,-699.535099,195.12947,
+ 0.091928,-0.487734,0.868139,451.683339,-672.734453,212.70224,
+ 0.091928,-0.601482,0.793579,451.683345,-699.535099,195.12947,
+ 0.011271,-0.489901,0.871705,448.317778,-672.771628,212.768386,
+ 0.011271,-0.604116,0.796817,448.317783,-699.580941,195.189934,
+ -0.415875,0.642593,-0.643523,439.690622,-702.296712,152.674124,
+ -0.537771,0.671316,-0.510036,442.83949,-719.276356,130.597708,
+ -0.415875,0.72429,-0.549957,439.690621,-720.641807,131.632947,
+ -0.537771,0.671316,-0.510036,442.83949,-719.276356,130.597708,
+ -0.415875,0.642593,-0.643523,439.690622,-702.296712,152.674124,
+ -0.537771,0.595553,-0.596756,442.839492,-701.085065,151.462478,
+ -0.537771,0.595553,-0.596756,442.839492,-701.085065,151.462478,
+ -0.649152,0.595502,-0.473264,445.721745,-717.576266,129.308758,
+ -0.537771,0.671316,-0.510036,442.83949,-719.276356,130.597708,
+ -0.649152,0.595502,-0.473264,445.721745,-717.576266,129.308758,
+ -0.537771,0.595553,-0.596756,442.839492,-701.085065,151.462478,
+ -0.649152,0.525457,-0.549997,445.721747,-699.576473,149.953886,
+ -0.150375,0.698898,-0.699234,432.838956,-703.74222,154.119632,
+ -0.285905,0.76333,-0.579298,436.335626,-721.646389,132.394587,
+ -0.150375,0.787661,-0.597476,432.838954,-722.270805,132.867998,
+ -0.285905,0.76333,-0.579298,436.335626,-721.646389,132.394587,
+ -0.150375,0.698898,-0.699234,432.838956,-703.74222,154.119632,
+ -0.285905,0.677271,-0.67791,436.335627,-703.188138,153.565551,
+ -0.112343,0.702509,-0.702752,623.546368,-683.011825,133.389238,
+ -0.244971,0.772358,-0.586047,644.636264,-695.850119,112.836708,
+ -0.112343,0.791717,-0.600469,623.546367,-698.908942,115.155806,
+ -0.244971,0.772358,-0.586047,644.636264,-695.850119,112.836708,
+ -0.112343,0.702509,-0.702752,623.546368,-683.011825,133.389238,
+ -0.244971,0.685296,-0.685827,644.636265,-680.297547,130.67496,
+ 0.382469,-0.01552,0.923838,458.222196,-549.595395,241.116069,
+ 0.487278,-0.088099,0.868791,461.269956,-581.352493,238.618284,
+ 0.506559,-0.014482,0.862083,461.269937,-549.571376,239.686382,
+ 0.487278,-0.088099,0.868791,461.269956,-581.352493,238.618284,
+ 0.382469,-0.01552,0.923838,458.222196,-549.595395,241.116069,
+ 0.361665,-0.094307,0.927526,458.222215,-581.498327,240.043877,
+ -0.19509,0,-0.980785,35.243015,-186.86272,2079.865312,
+ -0.098017,0,-0.995185,0.112465,-280.29408,2083.325369,
+ -0.098017,0,-0.995185,0.112465,-186.86272,2083.325369,
+ -0.098017,0,-0.995185,0.112465,-280.29408,2083.325369,
+ -0.19509,0,-0.980785,35.243015,-186.86272,2079.865312,
+ -0.19509,0,-0.980785,35.243015,-280.29408,2079.865312,
+ -0.382683,0,-0.92388,69.023518,-280.29408,2069.618109,
+ -0.19509,0,-0.980785,35.243015,-186.86272,2079.865312,
+ -0.382683,0,-0.92388,69.023518,-186.86272,2069.618109,
+ -0.19509,0,-0.980785,35.243015,-186.86272,2079.865312,
+ -0.382683,0,-0.92388,69.023518,-280.29408,2069.618109,
+ -0.19509,0,-0.980785,35.243015,-280.29408,2079.865312,
+ 0.684487,-0,-0.729025,221.73981,-186.86272,1435.598634,
+ 0.684487,-0,-0.729025,93.530885,-280.29408,1315.222366,
+ 0.684487,-0,-0.729025,93.530885,-186.86272,1315.222366,
+ 0.684487,-0,-0.729025,93.530885,-280.29408,1315.222366,
+ 0.684487,-0,-0.729025,221.73981,-186.86272,1435.598634,
+ 0.684487,-0,-0.729025,221.73981,-280.29408,1435.598634,
+ -0.494423,0.087701,-0.864786,684.332867,-573.78512,164.643953,
+ -0.372406,0.015448,-0.927941,665.021343,-548.48129,174.800973,
+ -0.493603,0.014422,-0.869568,684.332852,-548.325029,165.499615,
+ -0.372406,0.015448,-0.927941,665.021343,-548.48129,174.800973,
+ -0.494423,0.087701,-0.864786,684.332867,-573.78512,164.643953,
+ -0.373111,0.093846,-0.923028,665.021359,-574.733894,173.918677,
+ -0.985345,0.136861,-0.101808,454.431275,-705.386141,120.066621,
+ -0.999454,0.024455,-0.02222,454.797689,-686.233268,136.610681,
+ -0.999454,0.027255,-0.01868,454.797688,-702.539296,117.908241,
+ -0.999454,0.024455,-0.02222,454.797689,-686.233268,136.610681,
+ -0.985345,0.136861,-0.101808,454.431275,-705.386141,120.066621,
+ -0.985345,0.121711,-0.119507,454.431277,-688.759444,139.136857,
+ -0.022557,0.706919,-0.706935,602.133302,-683.695423,134.072836,
+ -0.112343,0.791717,-0.600469,623.546367,-698.908942,115.155806,
+ -0.022557,0.796656,-0.604012,602.133301,-699.679313,115.739878,
+ -0.112343,0.791717,-0.600469,623.546367,-698.908942,115.155806,
+ -0.022557,0.706919,-0.706935,602.133302,-683.695423,134.072836,
+ -0.112343,0.702509,-0.702752,623.546368,-683.011825,133.389238,
+ -0.741547,0.152765,-0.653277,448.281994,-604.584377,200.565168,
+ -0.649249,0.076378,-0.756731,445.721707,-578.184383,207.648051,
+ -0.748094,0.052453,-0.661516,448.28198,-577.928705,205.148665,
+ -0.649249,0.076378,-0.756731,445.721707,-578.184383,207.648051,
+ -0.741547,0.152765,-0.653277,448.281994,-604.584377,200.565168,
+ -0.638578,0.17117,-0.75028,445.721721,-605.178251,203.006401,
+ 0.030867,-0.23624,0.971204,599.602131,-607.23931,211.479086,
+ 0.127347,-0.363412,0.922884,624.955334,-633.909652,201.38423,
+ 0.127347,-0.234264,0.963796,624.955322,-606.868816,209.956143,
+ 0.127347,-0.363412,0.922884,624.955334,-633.909652,201.38423,
+ 0.030867,-0.23624,0.971204,599.602131,-607.23931,211.479086,
+ 0.030867,-0.366379,0.929954,599.602143,-634.484215,202.842483,
+ 0.991932,-0.047852,0.117393,792.007216,-572.529419,45.597264,
+ 0.966794,-0.126469,0.22207,787.130189,-589.736091,65.02047,
+ 0.991932,-0.063402,0.109777,792.007217,-577.494024,43.23773,
+ 0.966794,-0.126469,0.22207,787.130189,-589.736091,65.02047,
+ 0.991932,-0.047852,0.117393,792.007216,-572.529419,45.597264,
+ 0.966794,-0.095028,0.237232,787.130187,-581.689044,68.845,
+ 0.966794,-0.095028,0.237232,787.130187,-581.689044,68.845,
+ 0.924993,-0.187375,0.330572,779.024167,-601.558028,86.055659,
+ 0.966794,-0.126469,0.22207,787.130189,-589.736091,65.02047,
+ 0.924993,-0.187375,0.330572,779.024167,-601.558028,86.055659,
+ 0.966794,-0.095028,0.237232,787.130187,-581.689044,68.845,
+ 0.924993,-0.140582,0.353021,779.024163,-590.534326,91.294907,
+ -0.707841,0.055835,-0.704162,718.363082,-571.142012,138.806193,
+ -0.795651,0.010475,-0.605664,732.466031,-547.618545,123.445905,
+ -0.796291,0.062774,-0.601647,732.466044,-569.495502,122.710666,
+ -0.795651,0.010475,-0.605664,732.466031,-547.618545,123.445905,
+ -0.707841,0.055835,-0.704162,718.363082,-571.142012,138.806193,
+ -0.716622,0.0095,-0.697397,718.363068,-547.889718,139.587655,
+ -0.796291,0.062774,-0.601647,732.466044,-569.495502,122.710666,
+ -0.869747,0.008617,-0.493422,744.275028,-547.318028,105.557439,
+ -0.870211,0.051465,-0.489984,744.27504,-567.670824,104.873423,
+ -0.869747,0.008617,-0.493422,744.275028,-547.318028,105.557439,
+ -0.796291,0.062774,-0.601647,732.466044,-569.495502,122.710666,
+ -0.795651,0.010475,-0.605664,732.466031,-547.618545,123.445905,
+ -0.870211,0.051465,-0.489984,744.27504,-567.670824,104.873423,
+ -0.928106,0.006604,-0.372257,753.576386,-546.993607,86.24593,
+ -0.928388,0.039234,-0.369537,753.576397,-565.700992,85.617213,
+ -0.928106,0.006604,-0.372257,753.576386,-546.993607,86.24593,
+ -0.870211,0.051465,-0.489984,744.27504,-567.670824,104.873423,
+ -0.869747,0.008617,-0.493422,744.275028,-547.318028,105.557439,
+ -0.928388,0.039234,-0.369537,753.576397,-565.700992,85.617213,
+ -0.969674,0.004471,-0.24436,760.201807,-546.651151,65.860802,
+ -0.9698,0.0263,-0.242479,760.201817,-563.621651,65.290458,
+ -0.969674,0.004471,-0.24436,760.201807,-546.651151,65.860802,
+ -0.928388,0.039234,-0.369537,753.576397,-565.700992,85.617213,
+ -0.928106,0.006604,-0.372257,753.576386,-546.993607,86.24593,
+ 0.991932,-0.07777,0.100113,792.007218,-582.090797,40.223697,
+ 0.966794,-0.181729,0.179678,787.130191,-603.902541,54.279953,
+ 0.991932,-0.090686,0.088582,792.007219,-586.233981,36.611394,
+ 0.966794,-0.181729,0.179678,787.130191,-603.902541,54.279953,
+ 0.991932,-0.07777,0.100113,792.007218,-582.090797,40.223697,
+ 0.966794,-0.15555,0.202766,787.130191,-597.186922,60.135075,
+ -0.040706,0.706494,-0.706547,429.267778,-703.948313,154.325725,
+ -0,0.622177,-0.782877,0.016303,-682.666775,172.880521,
+ -0.040706,0.603626,-0.796228,429.267777,-682.666673,172.880471,
+ -0,0.622177,-0.782877,0.016303,-682.666775,172.880521,
+ -0.040706,0.706494,-0.706547,429.267778,-703.948313,154.325725,
+ -0,0.723053,-0.690793,0.016305,-703.948386,154.325799,
+ -0.150375,0.698898,-0.699234,432.838956,-703.74222,154.119632,
+ -0.040706,0.603626,-0.796228,429.267777,-682.666673,172.880471,
+ -0.150375,0.597097,-0.787948,432.838954,-682.490586,172.648217,
+ -0.040706,0.603626,-0.796228,429.267777,-682.666673,172.880471,
+ -0.150375,0.698898,-0.699234,432.838956,-703.74222,154.119632,
+ -0.040706,0.706494,-0.706547,429.267778,-703.948313,154.325725,
+ -0.285905,0.677271,-0.67791,436.335627,-703.188138,153.565551,
+ -0.150375,0.597097,-0.787948,432.838954,-682.490586,172.648217,
+ -0.285905,0.578577,-0.763876,436.335626,-682.017175,172.023802,
+ -0.150375,0.597097,-0.787948,432.838954,-682.490586,172.648217,
+ -0.285905,0.677271,-0.67791,436.335627,-703.188138,153.565551,
+ -0.150375,0.698898,-0.699234,432.838956,-703.74222,154.119632,
+ 0.620913,-0.013167,0.783769,464.090728,-549.540509,237.849027,
+ 0.707841,-0.055835,0.704162,466.630399,-580.939677,234.58279,
+ 0.707157,-0.011876,0.706957,466.63038,-549.503387,235.639299,
+ 0.707841,-0.055835,0.704162,466.630399,-580.939677,234.58279,
+ 0.620913,-0.013167,0.783769,464.090728,-549.540509,237.849027,
+ 0.603443,-0.080198,0.793363,464.090747,-581.165077,236.78619,
+ -0.748094,0.052453,-0.661516,448.28198,-577.928705,205.148665,
+ -0.648424,0.012535,-0.761176,445.72169,-549.049611,208.627211,
+ -0.747451,0.007439,-0.664276,448.281963,-549.007501,206.120647,
+ -0.648424,0.012535,-0.761176,445.72169,-549.049611,208.627211,
+ -0.748094,0.052453,-0.661516,448.28198,-577.928705,205.148665,
+ -0.649249,0.076378,-0.756731,445.721707,-578.184383,207.648051,
+ -0.748094,0.052453,-0.661516,448.28198,-577.928705,205.148665,
+ -0.832126,0.009639,-0.554503,450.471071,-548.95985,203.284158,
+ -0.832687,0.057661,-0.550734,450.471088,-577.639374,202.320298,
+ -0.832126,0.009639,-0.554503,450.471071,-548.95985,203.284158,
+ -0.748094,0.052453,-0.661516,448.28198,-577.928705,205.148665,
+ -0.747451,0.007439,-0.664276,448.281963,-549.007501,206.120647,
+ -0.832687,0.057661,-0.550734,450.471088,-577.639374,202.320298,
+ -0.90081,0.007643,-0.434147,452.246961,-548.907571,200.172234,
+ -0.901181,0.045526,-0.431045,452.246978,-577.321949,199.217285,
+ -0.90081,0.007643,-0.434147,452.246961,-548.907571,200.172234,
+ -0.832687,0.057661,-0.550734,450.471088,-577.639374,202.320298,
+ -0.832126,0.009639,-0.554503,450.471071,-548.95985,203.284158,
+ -0.901181,0.045526,-0.431045,452.246978,-577.321949,199.217285,
+ -0.95219,0.005502,-0.305456,453.575519,-548.85167,196.844653,
+ -0.952384,0.032525,-0.303161,453.575536,-576.982526,195.899232,
+ -0.95219,0.005502,-0.305456,453.575519,-548.85167,196.844653,
+ -0.901181,0.045526,-0.431045,452.246978,-577.321949,199.217285,
+ -0.90081,0.007643,-0.434147,452.246961,-548.907571,200.172234,
+ -0.952384,0.032525,-0.303161,453.575536,-576.982526,195.899232,
+ -0.985283,0.003254,-0.170901,454.431224,-548.79322,193.365338,
+ -0.985345,0.018907,-0.169523,454.43124,-576.627626,192.429881,
+ -0.985283,0.003254,-0.170901,454.431224,-548.79322,193.365338,
+ -0.952384,0.032525,-0.303161,453.575536,-576.982526,195.899232,
+ -0.95219,0.005502,-0.305456,453.575519,-548.85167,196.844653,
+ 0.794465,-0.367859,0.483224,753.739289,-638.371733,114.456714,
+ 0.707932,-0.500166,0.498664,736.997697,-665.645303,116.022715,
+ 0.794465,-0.430275,0.42859,753.73929,-652.105388,102.482801,
+ 0.707932,-0.500166,0.498664,736.997697,-665.645303,116.022715,
+ 0.794465,-0.367859,0.483224,753.739289,-638.371733,114.456714,
+ 0.707932,-0.427549,0.562168,736.997696,-649.94032,129.715362,
+ 0.967989,-0,0.250993,473.101704,-186.86272,224.014969,
+ 0.928983,-0.005506,0.370082,472.10715,-549.362134,227.231115,
+ 0.973547,-0.004216,0.228449,473.101704,-549.308105,224.014969,
+ 0.928983,-0.005506,0.370082,472.10715,-549.362134,227.231115,
+ 0.967989,-0,0.250993,473.101704,-186.86272,224.014969,
+ 0.932593,0,0.360931,472.10715,-186.86272,227.231115,
+ -0.901181,0.103838,-0.42082,452.246991,-603.175034,194.771794,
+ -0.952384,0.032525,-0.303161,453.575536,-576.982526,195.899232,
+ -0.952384,0.073533,-0.295901,453.575549,-602.386639,191.530944,
+ -0.952384,0.032525,-0.303161,453.575536,-576.982526,195.899232,
+ -0.901181,0.103838,-0.42082,452.246991,-603.175034,194.771794,
+ -0.901181,0.045526,-0.431045,452.246978,-577.321949,199.217285,
+ -0.285329,0.015988,-0.958296,436.33557,-549.135218,213.722949,
+ -0.172878,0,-0.984943,432.838898,-186.86272,214.504709,
+ -0.307402,0,-0.95158,436.33557,-186.86272,213.722949,
+ -0.172878,0,-0.984943,432.838898,-186.86272,214.504709,
+ -0.285329,0.015988,-0.958296,436.33557,-549.135218,213.722949,
+ -0.150052,0.016548,-0.98854,432.838898,-549.148352,214.504709,
+ 0.998111,-0.007644,0.060955,793.543158,-559.332109,23.357838,
+ 0.991932,-0.031409,0.122818,792.007213,-567.289597,47.258281,
+ 0.998111,-0.015878,0.059345,793.520758,-561.475389,23.357838,
+ 0.991932,-0.031409,0.122818,792.007213,-567.289597,47.258281,
+ 0.998111,-0.007644,0.060955,793.543158,-559.332109,23.357838,
+ 0.991932,-0.01438,0.125953,792.007211,-561.87231,48.189795,
+ 0.991932,-0.01438,0.125953,792.007211,-561.87231,48.189795,
+ 0.966794,-0.061815,0.247969,787.130183,-573.195905,71.537315,
+ 0.991932,-0.031409,0.122818,792.007213,-567.289597,47.258281,
+ 0.966794,-0.061815,0.247969,787.130183,-573.195905,71.537315,
+ 0.991932,-0.01438,0.125953,792.007211,-561.87231,48.189795,
+ 0.966794,-0.027448,0.254079,787.130178,-564.415116,73.047189,
+ 0.966794,-0.027448,0.254079,787.130178,-564.415116,73.047189,
+ 0.924993,-0.091165,0.368885,779.024159,-578.899518,94.983127,
+ 0.966794,-0.061815,0.247969,787.130183,-573.195905,71.537315,
+ 0.924993,-0.091165,0.368885,779.024159,-578.899518,94.983127,
+ 0.966794,-0.027448,0.254079,787.130178,-564.415116,73.047189,
+ 0.924993,-0.040048,0.377867,779.024152,-566.870657,97.051514,
+ 0.924993,-0.040048,0.377867,779.024152,-566.870657,97.051514,
+ 0.867227,-0.118957,0.483493,767.829322,-584.301801,117.190256,
+ 0.924993,-0.091165,0.368885,779.024159,-578.899518,94.983127,
+ 0.867227,-0.118957,0.483493,767.829322,-584.301801,117.190256,
+ 0.924993,-0.040048,0.377867,779.024152,-566.870657,97.051514,
+ 0.867227,-0.051963,0.495193,767.829315,-569.19647,119.787648,
+ 0.277314,-0.016138,0.960644,649.884069,-549.087494,210.885907,
+ 0.381503,-0.093498,0.919627,673.957345,-577.587813,201.817466,
+ 0.401003,-0.015387,0.915947,673.957328,-548.951312,202.77988,
+ 0.381503,-0.093498,0.919627,673.957345,-577.587813,201.817466,
+ 0.277314,-0.016138,0.960644,649.884069,-549.087494,210.885907,
+ 0.256672,-0.097972,0.96152,649.884086,-578.414663,209.900281,
+ 0.148826,-0.01661,0.988724,624.95529,-549.169432,215.762941,
+ 0.256672,-0.097972,0.96152,649.884086,-578.414663,209.900281,
+ 0.277314,-0.016138,0.960644,649.884069,-549.087494,210.885907,
+ 0.256672,-0.097972,0.96152,649.884086,-578.414663,209.900281,
+ 0.148826,-0.01661,0.988724,624.95529,-549.169432,215.762941,
+ 0.127347,-0.100746,0.986728,624.955308,-578.912147,214.763349,
+ 0.867227,-0.301852,0.395982,767.829336,-625.572837,97.575321,
+ 0.794465,-0.430275,0.42859,753.73929,-652.105388,102.482801,
+ 0.867227,-0.352996,0.351156,767.829337,-637.125516,87.502929,
+ 0.794465,-0.430275,0.42859,753.73929,-652.105388,102.482801,
+ 0.867227,-0.301852,0.395982,767.829336,-625.572837,97.575321,
+ 0.794465,-0.367859,0.483224,753.739289,-638.371733,114.456714,
+ -0.41512,0.01512,-0.909641,439.690565,-549.114088,212.465226,
+ -0.307402,0,-0.95158,436.33557,-186.86272,213.722949,
+ -0.436021,0,-0.899936,439.690565,-186.86272,212.465226,
+ -0.307402,0,-0.95158,436.33557,-186.86272,213.722949,
+ -0.41512,0.01512,-0.909641,439.690565,-549.114088,212.465226,
+ -0.285329,0.015988,-0.958296,436.33557,-549.135218,213.722949,
+ 0.998111,-0.015878,0.059345,793.520758,-561.475389,23.357838,
+ 0.991932,-0.047852,0.117393,792.007216,-572.529419,45.597264,
+ 0.998111,-0.023817,0.056627,793.478048,-563.767069,23.357838,
+ 0.991932,-0.047852,0.117393,792.007216,-572.529419,45.597264,
+ 0.998111,-0.015878,0.059345,793.520758,-561.475389,23.357838,
+ 0.991932,-0.031409,0.122818,792.007213,-567.289597,47.258281,
+ -0,1,0,35.238106,-186.86272,1394.271064,
+ -0,1,0,18.722685,-186.86272,1315.222366,
+ -0,1,0,0.112465,-186.86272,1390.81149,
+ -0,1,0,18.722685,-186.86272,1315.222366,
+ -0,1,0,35.238106,-186.86272,1394.271064,
+ 0,1,0,56.126785,-186.86272,1315.222366,
+ 0,1,0,56.126785,-186.86272,1315.222366,
+ -0,1,0,35.238106,-186.86272,1394.271064,
+ -0,1,0,69.013887,-186.86272,1404.516835,
+ 0,1,0,56.126785,-186.86272,1315.222366,
+ -0,1,0,69.013887,-186.86272,1404.516835,
+ 0,1,0,56.126785,-186.86272,268.426375,
+ -0,1,0,100.155807,-186.86272,1753.526669,
+ 0,1,0,100.141826,-186.86272,1720.5641,
+ -0,1,0,69.327289,-186.86272,1737.048483,
+ 0,1,0,100.141826,-186.86272,1720.5641,
+ -0,1,0,100.155807,-186.86272,1753.526669,
+ 0,1,0,127.425692,-186.86272,1698.17281,
+ 0,1,0,127.425692,-186.86272,1698.17281,
+ -0,1,0,100.155807,-186.86272,1753.526669,
+ 0,1,0,127.443487,-186.86272,1775.921089,
+ 0,1,0,127.425692,-186.86272,1698.17281,
+ 0,1,0,127.443487,-186.86272,1775.921089,
+ 0,1,0,149.816983,-186.86272,1670.888943,
+ 0,1,0,149.816983,-186.86272,1670.888943,
+ 0,1,0,127.443487,-186.86272,1775.921089,
+ 0,1,0,149.837908,-186.86272,1803.208769,
+ 0,1,0,149.816983,-186.86272,1670.888943,
+ 0,1,0,149.837908,-186.86272,1803.208769,
+ 0,1,0,166.455213,-186.86272,1639.761005,
+ 0,1,0,166.455213,-186.86272,1639.761005,
+ 0,1,0,149.837908,-186.86272,1803.208769,
+ 0,1,0,166.478463,-186.86272,1834.341059,
+ 0,1,0,166.455213,-186.86272,1639.761005,
+ 0,1,0,166.478463,-186.86272,1834.341059,
+ 0,1,0,176.700984,-186.86272,1605.985223,
+ 0,1,0,176.700984,-186.86272,1605.985223,
+ 0,1,0,166.478463,-186.86272,1834.341059,
+ 0,1,0,176.725666,-186.86272,1868.121561,
+ 0,1,0,176.700984,-186.86272,1605.985223,
+ 0,1,0,176.725666,-186.86272,1868.121561,
+ 0,1,0,180.160558,-186.86272,1570.859583,
+ 0,1,0,180.160558,-186.86272,1570.859583,
+ 0,1,0,176.725666,-186.86272,1868.121561,
+ 0,1,0,180.185724,-186.86272,1903.252111,
+ 0,1,0,93.652471,-186.86272,2499.208064,
+ 0,1,0,46.868397,-186.86272,2125.502553,
+ 0,1,0,46.868397,-186.86272,2499.208064,
+ 0,1,0,46.868397,-186.86272,2125.502553,
+ 0,1,0,93.652471,-186.86272,2499.208064,
+ 0,1,0,69.023518,-186.86272,2069.618109,
+ 0,1,0,69.023518,-186.86272,2069.618109,
+ 0,1,0,93.652471,-186.86272,2499.208064,
+ 0,1,-0,100.155807,-186.86272,2052.977553,
+ 0,1,-0,100.155807,-186.86272,2052.977553,
+ 0,1,0,93.652471,-186.86272,2499.208064,
+ 0,1,-0,123.089852,-186.86272,2224.766097,
+ 0,1,-0,100.155807,-186.86272,2052.977553,
+ 0,1,-0,123.089852,-186.86272,2224.766097,
+ 0,1,-0,127.443487,-186.86272,2030.583133,
+ 0,1,-0,127.443487,-186.86272,2030.583133,
+ 0,1,-0,123.089852,-186.86272,2224.766097,
+ -0,1,-0,221.73981,-186.86272,2013.443961,
+ 0,1,-0,127.443487,-186.86272,2030.583133,
+ -0,1,-0,221.73981,-186.86272,2013.443961,
+ 0,1,0,149.837908,-186.86272,2003.295453,
+ 0,1,0,149.837908,-186.86272,2003.295453,
+ -0,1,-0,221.73981,-186.86272,2013.443961,
+ 0,1,0,166.478463,-186.86272,1972.163164,
+ 0,1,0,166.478463,-186.86272,1972.163164,
+ -0,1,-0,221.73981,-186.86272,2013.443961,
+ 0,1,0,176.725666,-186.86272,1938.382661,
+ 0,1,0,176.725666,-186.86272,1938.382661,
+ -0,1,-0,221.73981,-186.86272,2013.443961,
+ 0,1,0,180.185724,-186.86272,1903.252111,
+ -0,1,0,100.141826,-186.86272,1421.155065,
+ -0,1,0,93.530885,-186.86272,1315.222366,
+ -0,1,0,69.013887,-186.86272,1404.516835,
+ -0,1,0,93.530885,-186.86272,1315.222366,
+ -0,1,0,100.141826,-186.86272,1421.155065,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ -0,1,0,100.141826,-186.86272,1421.155065,
+ 0,1,0,127.425692,-186.86272,1443.546356,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ 0,1,0,127.425692,-186.86272,1443.546356,
+ 0,1,0,149.816983,-186.86272,1470.830222,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ 0,1,0,149.816983,-186.86272,1470.830222,
+ 0,1,0,166.455213,-186.86272,1501.958161,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ 0,1,0,166.455213,-186.86272,1501.958161,
+ 0,1,0,176.700984,-186.86272,1535.733942,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ 0,1,0,176.700984,-186.86272,1535.733942,
+ 0,1,0,180.160558,-186.86272,1570.859583,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ 0,1,0,180.160558,-186.86272,1570.859583,
+ 0,1,0,180.185724,-186.86272,1903.252111,
+ -0,1,0,221.73981,-186.86272,1435.598634,
+ 0,1,0,180.185724,-186.86272,1903.252111,
+ -0,1,-0,221.73981,-186.86272,2013.443961,
+ -0,1,-0,0.016247,-186.86272,214.795487,
+ -0,1,-0,93.530885,-186.86272,242.726639,
+ 0,1,-0,429.26772,-186.86272,214.795487,
+ -0,1,-0,93.530885,-186.86272,242.726639,
+ -0,1,-0,0.016247,-186.86272,214.795487,
+ -0,1,-0,18.722685,-186.86272,268.426375,
+ -0,1,-0,18.722685,-186.86272,268.426375,
+ -0,1,-0,0.016247,-186.86272,214.795487,
+ -0,1,0,0.112465,-186.86272,1390.81149,
+ -0,1,-0,18.722685,-186.86272,268.426375,
+ -0,1,0,0.112465,-186.86272,1390.81149,
+ -0,1,0,18.722685,-186.86272,1315.222366,
+ -0,1,-0,93.530885,-186.86272,242.726639,
+ -0,1,-0,18.722685,-186.86272,268.426375,
+ 0,1,0,56.126785,-186.86272,268.426375,
+ -0,1,-0,93.530885,-186.86272,242.726639,
+ 0,1,0,56.126785,-186.86272,268.426375,
+ -0,1,0,69.013887,-186.86272,1404.516835,
+ -0,1,-0,93.530885,-186.86272,242.726639,
+ -0,1,0,69.013887,-186.86272,1404.516835,
+ -0,1,0,93.530885,-186.86272,1315.222366,
+ 0,1,-0,429.26772,-186.86272,214.795487,
+ -0,1,-0,93.530885,-186.86272,242.726639,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,-0,429.26772,-186.86272,214.795487,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,432.838898,-186.86272,214.504709,
+ 0,1,0,432.838898,-186.86272,214.504709,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,436.33557,-186.86272,213.722949,
+ 0,1,0,436.33557,-186.86272,213.722949,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,439.690565,-186.86272,212.465226,
+ 0,1,0,439.690565,-186.86272,212.465226,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,442.839435,-186.86272,210.7557,
+ 0,1,0,442.839435,-186.86272,210.7557,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,445.72169,-186.86272,208.627211,
+ 0,1,0,445.72169,-186.86272,208.627211,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,448.281963,-186.86272,206.120647,
+ 0,1,0,448.281963,-186.86272,206.120647,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,450.471071,-186.86272,203.284158,
+ 0,1,0,450.471071,-186.86272,203.284158,
+ 0,1,-0,448.31772,-186.86272,242.726639,
+ 0,1,0,451.683281,-186.86272,242.65094,
+ 0,1,0,450.471071,-186.86272,203.284158,
+ 0,1,0,451.683281,-186.86272,242.65094,
+ 0,1,0,452.246961,-186.86272,200.172234,
+ 0,1,0,452.246961,-186.86272,200.172234,
+ 0,1,0,451.683281,-186.86272,242.65094,
+ 0,1,0,455.00605,-186.86272,242.110623,
+ 0,1,0,452.246961,-186.86272,200.172234,
+ 0,1,0,455.00605,-186.86272,242.110623,
+ 0,1,0,453.575519,-186.86272,196.844653,
+ 0,1,0,453.575519,-186.86272,196.844653,
+ 0,1,0,455.00605,-186.86272,242.110623,
+ 0,1,0,454.431224,-186.86272,193.365338,
+ 0,1,0,454.431224,-186.86272,193.365338,
+ 0,1,0,455.00605,-186.86272,242.110623,
+ 0,1,0,454.797637,-186.86272,189.801127,
+ 0,1,0,454.797637,-186.86272,189.801127,
+ 0,1,0,602.133251,-186.86272,186.220487,
+ 0,1,0,454.66772,-186.86272,186.220487,
+ 0,1,0,602.133251,-186.86272,186.220487,
+ 0,1,0,454.797637,-186.86272,189.801127,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,454.797637,-186.86272,189.801127,
+ 0,1,0,455.00605,-186.86272,242.110623,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,455.00605,-186.86272,242.110623,
+ 0,1,0,458.222196,-186.86272,241.116069,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,458.222196,-186.86272,241.116069,
+ 0,1,0,461.269937,-186.86272,239.686382,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,461.269937,-186.86272,239.686382,
+ 0,1,0,464.090728,-186.86272,237.849027,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,464.090728,-186.86272,237.849027,
+ 0,1,0,466.63038,-186.86272,235.639299,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,466.63038,-186.86272,235.639299,
+ 0,1,0,468.840108,-186.86272,233.099647,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,468.840108,-186.86272,233.099647,
+ 0,1,0,470.677463,-186.86272,230.278856,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,470.677463,-186.86272,230.278856,
+ 0,1,0,472.10715,-186.86272,227.231115,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,472.10715,-186.86272,227.231115,
+ 0,1,0,473.101704,-186.86272,224.014969,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,473.101704,-186.86272,224.014969,
+ 0,1,0,473.642021,-186.86272,220.6922,
+ 0,1,0,602.133251,-186.86272,186.220487,
+ 0,1,0,473.71772,-186.86272,217.326639,
+ 0,1,0,599.602099,-186.86272,217.326639,
+ 0,1,0,602.133251,-186.86272,186.220487,
+ 0,1,0,599.602099,-186.86272,217.326639,
+ 0,1,0,624.95529,-186.86272,215.762941,
+ 0,1,0,602.133251,-186.86272,186.220487,
+ 0,1,0,624.95529,-186.86272,215.762941,
+ 0,1,0,623.546317,-186.86272,185.255996,
+ 0,1,0,623.546317,-186.86272,185.255996,
+ 0,1,0,624.95529,-186.86272,215.762941,
+ 0,1,0,644.636215,-186.86272,181.426394,
+ 0,1,0,644.636215,-186.86272,181.426394,
+ 0,1,0,624.95529,-186.86272,215.762941,
+ 0,1,0,649.884069,-186.86272,210.885907,
+ 0,1,0,644.636215,-186.86272,181.426394,
+ 0,1,0,649.884069,-186.86272,210.885907,
+ 0,1,0,665.021343,-186.86272,174.800973,
+ 0,1,0,665.021343,-186.86272,174.800973,
+ 0,1,0,649.884069,-186.86272,210.885907,
+ 0,1,0,673.957328,-186.86272,202.77988,
+ 0,1,0,665.021343,-186.86272,174.800973,
+ 0,1,0,673.957328,-186.86272,202.77988,
+ 0,1,0,684.332852,-186.86272,165.499615,
+ 0,1,0,684.332852,-186.86272,165.499615,
+ 0,1,0,673.957328,-186.86272,202.77988,
+ 0,1,0,696.758754,-186.86272,191.585041,
+ 0,1,0,684.332852,-186.86272,165.499615,
+ 0,1,0,696.758754,-186.86272,191.585041,
+ 0,1,0,702.221319,-186.86272,153.690618,
+ 0,1,0,702.221319,-186.86272,153.690618,
+ 0,1,0,696.758754,-186.86272,191.585041,
+ 0,1,0,717.89403,-186.86272,177.494989,
+ 0,1,0,702.221319,-186.86272,153.690618,
+ 0,1,0,717.89403,-186.86272,177.494989,
+ 0,1,0,718.363068,-186.86272,139.587655,
+ 0,1,0,718.363068,-186.86272,139.587655,
+ 0,1,0,717.89403,-186.86272,177.494989,
+ 0,1,0,736.997652,-186.86272,160.753391,
+ 0,1,0,718.363068,-186.86272,139.587655,
+ 0,1,0,736.997652,-186.86272,160.753391,
+ 0,1,0,732.466031,-186.86272,123.445905,
+ 0,1,0,732.466031,-186.86272,123.445905,
+ 0,1,0,736.997652,-186.86272,160.753391,
+ 0,1,0,744.275028,-186.86272,105.557439,
+ 0,1,0,744.275028,-186.86272,105.557439,
+ 0,1,0,736.997652,-186.86272,160.753391,
+ 0,1,0,753.73925,-186.86272,141.649769,
+ 0,1,0,744.275028,-186.86272,105.557439,
+ 0,1,0,753.73925,-186.86272,141.649769,
+ 0,1,0,753.576386,-186.86272,86.24593,
+ 0,1,0,753.576386,-186.86272,86.24593,
+ 0,1,0,753.73925,-186.86272,141.649769,
+ 0,1,0,760.201807,-186.86272,65.860802,
+ 0,1,0,760.201807,-186.86272,65.860802,
+ 0,1,0,753.73925,-186.86272,141.649769,
+ 0,1,0,767.829302,-186.86272,120.514493,
+ 0,1,0,760.201807,-186.86272,65.860802,
+ 0,1,0,767.829302,-186.86272,120.514493,
+ 0,1,0,764.031409,-186.86272,44.770904,
+ 0,1,0,764.031409,-186.86272,44.770904,
+ 0,1,0,767.829302,-186.86272,120.514493,
+ 0,1,0,764.9959,-186.86272,23.357838,
+ 0,1,0,764.9959,-186.86272,23.357838,
+ 0,1,0,767.829302,-186.86272,120.514493,
+ 0,1,0,793.5709,-186.86272,23.357838,
+ 0,1,0,793.5709,-186.86272,23.357838,
+ 0,1,0,767.829302,-186.86272,120.514493,
+ 0,1,0,779.024141,-186.86272,97.713067,
+ 0,1,0,793.5709,-186.86272,23.357838,
+ 0,1,0,779.024141,-186.86272,97.713067,
+ 0,1,0,787.130168,-186.86272,73.639808,
+ 0,1,0,793.5709,-186.86272,23.357838,
+ 0,1,0,787.130168,-186.86272,73.639808,
+ 0,1,0,792.007202,-186.86272,48.711029,
+ 0,1,0,0.179984,-186.86272,2125.502553,
+ 0,1,0,35.243015,-186.86272,2079.865312,
+ 0,1,0,0.112465,-186.86272,2083.325369,
+ 0,1,0,35.243015,-186.86272,2079.865312,
+ 0,1,0,0.179984,-186.86272,2125.502553,
+ 0,1,0,46.868397,-186.86272,2125.502553,
+ 0,1,0,35.243015,-186.86272,2079.865312,
+ 0,1,0,46.868397,-186.86272,2125.502553,
+ 0,1,0,69.023518,-186.86272,2069.618109,
+ -0.935939,0,-0.352162,166.478463,-280.29408,1972.163164,
+ -0.973856,0,-0.227168,176.725666,-186.86272,1938.382661,
+ -0.986659,0,-0.162803,176.725666,-280.29408,1938.382661,
+ -0.973856,0,-0.227168,176.725666,-186.86272,1938.382661,
+ -0.935939,0,-0.352162,166.478463,-280.29408,1972.163164,
+ -0.910825,0,-0.412792,166.478463,-186.86272,1972.163164,
+ -0.098017,0,0.995185,0.112465,-280.29408,1390.81149,
+ -0.162803,0,0.986659,35.238106,-186.86272,1394.271064,
+ -0.098017,0,0.995185,0.112465,-186.86272,1390.81149,
+ -0.162803,0,0.986659,35.238106,-186.86272,1394.271064,
+ -0.098017,0,0.995185,0.112465,-280.29408,1390.81149,
+ -0.227168,0,0.973856,35.238106,-280.29408,1394.271064,
+ -0.471397,0,0.881921,69.327289,-280.29408,1737.048483,
+ -0.527988,0,0.849252,100.155807,-186.86272,1753.526669,
+ -0.471397,0,0.881921,69.327289,-186.86272,1737.048483,
+ -0.527988,0,0.849252,100.155807,-186.86272,1753.526669,
+ -0.471397,0,0.881921,69.327289,-280.29408,1737.048483,
+ -0.582554,0,0.812792,100.155807,-280.29408,1753.526669,
+ -0.528184,0,-0.84913,100.141826,-280.29408,1720.5641,
+ -0.471701,0,-0.881759,69.327289,-186.86272,1737.048483,
+ -0.582647,0,-0.812725,100.141826,-186.86272,1720.5641,
+ -0.471701,0,-0.881759,69.327289,-186.86272,1737.048483,
+ -0.528184,0,-0.84913,100.141826,-280.29408,1720.5641,
+ -0.471701,0,-0.881759,69.327289,-280.29408,1737.048483,
+ -0.999462,0,0.032813,180.185724,-280.29408,1903.252111,
+ -0.986659,0,0.162803,176.725666,-186.86272,1868.121561,
+ -0.973856,0,0.227168,176.725666,-280.29408,1868.121561,
+ -0.986659,0,0.162803,176.725666,-186.86272,1868.121561,
+ -0.999462,0,0.032813,180.185724,-280.29408,1903.252111,
+ -0.999462,0,-0.032813,180.185724,-186.86272,1903.252111,
+ -0.973856,0,0.227168,176.725666,-280.29408,1868.121561,
+ -0.935939,0,0.352162,166.478463,-186.86272,1834.341059,
+ -0.910825,0,0.412792,166.478463,-280.29408,1834.341059,
+ -0.935939,0,0.352162,166.478463,-186.86272,1834.341059,
+ -0.973856,0,0.227168,176.725666,-280.29408,1868.121561,
+ -0.986659,0,0.162803,176.725666,-186.86272,1868.121561,
+ -0.910825,0,0.412792,166.478463,-280.29408,1834.341059,
+ -0.849252,0,0.527988,149.837908,-186.86272,1803.208769,
+ -0.812792,0,0.582554,149.837908,-280.29408,1803.208769,
+ -0.849252,0,0.527988,149.837908,-186.86272,1803.208769,
+ -0.910825,0,0.412792,166.478463,-280.29408,1834.341059,
+ -0.935939,0,0.352162,166.478463,-186.86272,1834.341059,
+ -0.748179,0.326101,-0.577828,448.282012,-654.795099,180.782109,
+ -0.832687,0.204213,-0.514714,450.471112,-629.324619,189.746946,
+ -0.832687,0.272446,-0.482085,450.47112,-653.402151,178.303588,
+ -0.832687,0.204213,-0.514714,450.471112,-629.324619,189.746946,
+ -0.748179,0.326101,-0.577828,448.282012,-654.795099,180.782109,
+ -0.748179,0.244321,-0.616875,448.282005,-630.366836,192.392159,
+ 0.256672,-0.961442,0.098738,649.884086,-759.522868,28.792076,
+ 0.127347,-0.963706,0.234635,624.955322,-759.578731,57.246228,
+ 0.127347,-0.98669,0.101126,624.955308,-764.385936,29.28956,
+ 0.127347,-0.963706,0.234635,624.955322,-759.578731,57.246228,
+ 0.256672,-0.961442,0.098738,649.884086,-759.522868,28.792076,
+ 0.256673,-0.939019,0.228829,649.8841,-754.828812,56.090715,
+ -0.747451,0.007439,-0.664276,448.281963,-549.007501,206.120647,
+ -0.819027,0,-0.573755,450.471071,-186.86272,203.284158,
+ -0.832126,0.009639,-0.554503,450.471071,-548.95985,203.284158,
+ -0.819027,0,-0.573755,450.471071,-186.86272,203.284158,
+ -0.747451,0.007439,-0.664276,448.281963,-549.007501,206.120647,
+ -0.747409,0,-0.664364,448.281963,-186.86272,206.120647,
+ -0.493603,0.014422,-0.869568,684.332852,-548.325029,165.499615,
+ -0.393115,0,-0.919489,665.021343,-186.86272,174.800973,
+ -0.512963,0,-0.858411,684.332852,-186.86272,165.499615,
+ -0.393115,0,-0.919489,665.021343,-186.86272,174.800973,
+ -0.493603,0.014422,-0.869568,684.332852,-548.325029,165.499615,
+ -0.372406,0.015448,-0.927941,665.021343,-548.48129,174.800973,
+ 0.030866,-0.994332,0.101738,599.602117,-765.945157,29.449075,
+ 0,-0.976801,0.214147,473.717752,-761.101674,57.616782,
+ 0,-0.996871,0.079045,473.717738,-765.945156,29.449145,
+ 0,-0.976801,0.214147,473.717752,-761.101674,57.616782,
+ 0.030866,-0.994332,0.101738,599.602117,-765.945157,29.449075,
+ 0.030867,-0.971194,0.236282,599.602131,-761.101673,57.616723,
+ -0.707841,0.243878,-0.662936,718.363098,-605.920401,130.345733,
+ -0.796291,0.144172,-0.587481,732.466052,-584.996349,120.045264,
+ -0.796291,0.222882,-0.562356,732.466058,-599.989405,115.292483,
+ -0.796291,0.144172,-0.587481,732.466052,-584.996349,120.045264,
+ -0.707841,0.243878,-0.662936,718.363098,-605.920401,130.345733,
+ -0.707841,0.151267,-0.689985,718.363091,-588.820775,135.766294,
+ -1,0,0,46.868397,-280.29408,2499.208064,
+ -1,0,0,46.868397,-186.86272,2125.502553,
+ -1,0,0,46.868397,-280.29408,2125.502553,
+ -1,0,0,46.868397,-186.86272,2125.502553,
+ -1,0,0,46.868397,-280.29408,2499.208064,
+ -1,0,0,46.868397,-186.86272,2499.208064,
+ 0.401003,-0.015387,0.915947,673.957328,-548.951312,202.77988,
+ 0.499663,-0.087405,0.861799,696.75877,-576.445897,190.654684,
+ 0.517753,-0.01437,0.85541,696.758754,-548.76324,191.585041,
+ 0.499663,-0.087405,0.861799,696.75877,-576.445897,190.654684,
+ 0.401003,-0.015387,0.915947,673.957328,-548.951312,202.77988,
+ 0.381503,-0.093498,0.919627,673.957345,-577.587813,201.817466,
+ -0.285905,0.578577,-0.763876,436.335626,-682.017175,172.023802,
+ -0.150375,0.484157,-0.861963,432.838949,-658.912362,188.108094,
+ -0.285905,0.46909,-0.835591,436.335621,-658.528453,187.424994,
+ -0.150375,0.484157,-0.861963,432.838949,-658.912362,188.108094,
+ -0.285905,0.578577,-0.763876,436.335626,-682.017175,172.023802,
+ -0.150375,0.597097,-0.787948,432.838954,-682.490586,172.648217,
+ 0.339245,-0.940167,0.031597,458.22221,-789.952733,23.357838,
+ 0.229024,-0.96833,0.09942,455.006069,-790.65817,31.977188,
+ 0.20592,-0.978017,0.032869,455.006064,-790.947849,23.357838,
+ 0.229024,-0.96833,0.09942,455.006069,-790.65817,31.977188,
+ 0.339245,-0.940167,0.031597,458.22221,-789.952733,23.357838,
+ 0.361665,-0.92741,0.095445,458.222215,-789.666464,31.875739,
+ -0,-0,1,764.9959,-186.86272,23.357838,
+ -0,-0,1,847.545902,56.185652,23.357838,
+ -0,-0,1,806.270901,56.185652,23.357838,
+ -0,-0,1,847.545902,56.185652,23.357838,
+ -0,-0,1,764.9959,-186.86272,23.357838,
+ -0,-0,1,793.5709,-186.86272,23.357838,
+ -0,-0,1,793.5709,-186.86272,23.357838,
+ -0,-0,1,847.545902,-563.749227,23.357838,
+ -0,-0,1,847.545902,56.185652,23.357838,
+ -0,-0,1,847.545902,-563.749227,23.357838,
+ -0,-0,1,793.5709,-186.86272,23.357838,
+ -0,-0,1,793.5709,-545.937124,23.357838,
+ -0,-0,1,847.545902,-563.749227,23.357838,
+ -0,-0,1,793.5709,-545.937124,23.357838,
+ -0,-0,1,793.543158,-559.332109,23.357838,
+ -0,-0,1,847.545902,-563.749227,23.357838,
+ -0,-0,1,793.543158,-559.332109,23.357838,
+ -0,-0,1,793.520758,-561.475389,23.357838,
+ -0,-0,1,847.545902,-563.749227,23.357838,
+ -0,-0,1,793.520758,-561.475389,23.357838,
+ -0,-0,1,793.478048,-563.767069,23.357838,
+ -0,-0,1,847.545902,-563.749227,23.357838,
+ -0,-0,1,793.478048,-563.767069,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,793.478048,-563.767069,23.357838,
+ -0,-0,1,793.410423,-566.321374,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,793.410423,-566.321374,23.357838,
+ -0,-0,1,793.309566,-569.30368,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,793.309566,-569.30368,23.357838,
+ -0,-0,1,793.160542,-572.980425,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,793.160542,-572.980425,23.357838,
+ -0,-0,1,792.935095,-577.829952,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,792.935095,-577.829952,23.357838,
+ -0,-0,1,792.574093,-584.829111,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,792.574093,-584.829111,23.357838,
+ -0,-0,1,792.007216,-595.005501,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,792.007216,-595.005501,23.357838,
+ -0,-0,1,791.767078,-596.364536,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,-0,1,791.767078,-596.364536,23.357838,
+ -0,0,1,787.308111,-620.274132,23.357838,
+ -0,-0,1,843.130723,-608.452917,23.357838,
+ -0,0,1,787.308111,-620.274132,23.357838,
+ -0,0,1,838.782877,-630.311015,23.357838,
+ -0,0,1,838.782877,-630.311015,23.357838,
+ -0,0,1,787.308111,-620.274132,23.357838,
+ -0,0,1,787.130183,-621.196954,23.357838,
+ -0,0,1,838.782877,-630.311015,23.357838,
+ -0,0,1,787.130183,-621.196954,23.357838,
+ -0,0,1,779.024156,-645.623514,23.357838,
+ -0,0,1,838.782877,-630.311015,23.357838,
+ -0,0,1,779.024156,-645.623514,23.357838,
+ -0,0,1,827.969621,-662.165838,23.357838,
+ -0,0,1,827.969621,-662.165838,23.357838,
+ -0,0,1,779.024156,-645.623514,23.357838,
+ -0,0,1,767.829317,-668.759577,23.357838,
+ -0,0,1,827.969621,-662.165838,23.357838,
+ -0,0,1,767.829317,-668.759577,23.357838,
+ -0,0,1,813.090986,-692.336727,23.357838,
+ -0,0,1,813.090986,-692.336727,23.357838,
+ -0,0,1,767.829317,-668.759577,23.357838,
+ -0,0,1,753.739265,-690.205036,23.357838,
+ -0,0,1,813.090986,-692.336727,23.357838,
+ -0,0,1,753.739265,-690.205036,23.357838,
+ -0,0,1,739.751559,-706.400475,23.357838,
+ -0,0,1,813.090986,-692.336727,23.357838,
+ -0,0,1,739.751559,-706.400475,23.357838,
+ -0,0,1,794.401548,-720.307447,23.357838,
+ -0,0,1,794.401548,-720.307447,23.357838,
+ -0,0,1,739.751559,-706.400475,23.357838,
+ -0,0,1,736.997667,-709.544681,23.357838,
+ -0,0,1,794.401548,-720.307447,23.357838,
+ -0,0,1,736.997667,-709.544681,23.357838,
+ -0,0,1,717.894045,-726.295731,23.357838,
+ -0,0,1,794.401548,-720.307447,23.357838,
+ -0,0,1,717.894045,-726.295731,23.357838,
+ -0,0,1,772.221089,-745.599413,23.357838,
+ -0,0,1,772.221089,-745.599413,23.357838,
+ -0,0,1,717.894045,-726.295731,23.357838,
+ -0,0,1,696.758768,-740.393738,23.357838,
+ -0,0,1,772.221089,-745.599413,23.357838,
+ -0,0,1,696.758768,-740.393738,23.357838,
+ -0,0,1,673.957342,-751.594898,23.357838,
+ -0,0,1,772.221089,-745.599413,23.357838,
+ -0,0,1,673.957342,-751.594898,23.357838,
+ -0,0,1,746.929123,-767.779872,23.357838,
+ -0,0,1,746.929123,-767.779872,23.357838,
+ -0,0,1,673.957342,-751.594898,23.357838,
+ -0,0,1,649.884083,-759.705502,23.357838,
+ -0,0,1,746.929123,-767.779872,23.357838,
+ -0,0,1,649.884083,-759.705502,23.357838,
+ -0,0,1,624.955304,-764.585289,23.357838,
+ -0,0,1,746.929123,-767.779872,23.357838,
+ -0,0,1,624.955304,-764.585289,23.357838,
+ -0,0,1,599.602113,-766.149871,23.357838,
+ -0,0,1,746.929123,-767.779872,23.357838,
+ -0,0,1,599.602113,-766.149871,23.357838,
+ -0,0,1,473.717734,-766.149872,23.357838,
+ -0,0,1,746.929123,-767.779872,23.357838,
+ -0,0,1,473.717734,-766.149872,23.357838,
+ -0,0,1,473.642035,-769.517334,23.357838,
+ -0,0,1,746.929123,-767.779872,23.357838,
+ -0,0,1,473.642035,-769.517334,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,0,1,473.642035,-769.517334,23.357838,
+ -0,-0,1,473.101718,-772.841978,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,-0,1,473.101718,-772.841978,23.357838,
+ -0,-0,1,472.107164,-776.05994,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,-0,1,472.107164,-776.05994,23.357838,
+ -0,0,1,470.677477,-779.109402,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,0,1,470.677477,-779.109402,23.357838,
+ -0,0,1,468.840122,-781.931785,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,0,1,468.840122,-781.931785,23.357838,
+ -0,0,1,466.630394,-784.472872,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,0,1,466.630394,-784.472872,23.357838,
+ -0,0,1,464.090742,-786.683847,23.357838,
+ -0,0,1,718.958402,-786.46931,23.357838,
+ -0,0,1,464.090742,-786.683847,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ -0,0,1,464.090742,-786.683847,23.357838,
+ -0,0,1,461.269951,-788.52224,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ -0,0,1,461.269951,-788.52224,23.357838,
+ -0,0,1,458.22221,-789.952733,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ -0,0,1,458.22221,-789.952733,23.357838,
+ -0,0,1,455.006064,-790.947849,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ -0,0,1,455.006064,-790.947849,23.357838,
+ -0,0,1,451.683295,-791.488471,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ -0,0,1,451.683295,-791.488471,23.357838,
+ -0,0,1,448.317734,-791.564213,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ -0,0,1,448.317734,-791.564213,23.357838,
+ 0,0,1,0.00089,-791.564218,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ 0,0,1,0.00089,-791.564218,23.357838,
+ 0,0,1,0.000468,-820.924227,23.357838,
+ -0,0,1,688.787514,-801.347945,23.357838,
+ 0,0,1,0.000468,-820.924227,23.357838,
+ 0,0,1,656.93269,-812.161201,23.357838,
+ 0,0,1,656.93269,-812.161201,23.357838,
+ 0,0,1,0.000468,-820.924227,23.357838,
+ 0,0,1,623.938976,-818.724059,23.357838,
+ 0,0,1,623.938976,-818.724059,23.357838,
+ 0,0,1,0.000468,-820.924227,23.357838,
+ 0,0,1,590.370902,-820.924227,23.357838,
+ 0,-0.509694,0.860356,0.000057,-672.771767,212.768417,
+ 0.011271,-0.604116,0.796817,448.317783,-699.580941,195.189934,
+ 0.011271,-0.489901,0.871705,448.317778,-672.771628,212.768386,
+ 0.011271,-0.604116,0.796817,448.317783,-699.580941,195.189934,
+ 0,-0.509694,0.860356,0.000057,-672.771767,212.768417,
+ 0,-0.622177,0.782877,0.000063,-699.581047,195.189986,
+ -0.649152,0.262621,-0.713885,445.721732,-631.287828,194.729696,
+ -0.741547,0.152765,-0.653277,448.281994,-604.584377,200.565168,
+ -0.748179,0.244321,-0.616875,448.282005,-630.366836,192.392159,
+ -0.741547,0.152765,-0.653277,448.281994,-604.584377,200.565168,
+ -0.649152,0.262621,-0.713885,445.721732,-631.287828,194.729696,
+ -0.638578,0.17117,-0.75028,445.721721,-605.178251,203.006401,
+ -0.415875,0.548909,-0.725084,439.690621,-681.255534,171.01922,
+ -0.285905,0.46909,-0.835591,436.335621,-658.528453,187.424994,
+ -0.415875,0.444984,-0.793119,439.690616,-657.910808,186.325996,
+ -0.285905,0.46909,-0.835591,436.335621,-658.528453,187.424994,
+ -0.415875,0.548909,-0.725084,439.690621,-681.255534,171.01922,
+ -0.285905,0.578577,-0.763876,436.335626,-682.017175,172.023802,
+ 0.973657,-0.212704,0.08215,473.101749,-758.702385,87.31918,
+ 0.932875,-0.350339,0.083707,472.107183,-770.747999,59.963422,
+ 0.973657,-0.221914,0.0524,473.101737,-767.615679,59.201429,
+ 0.932875,-0.350339,0.083707,472.107183,-770.747999,59.963422,
+ 0.973657,-0.212704,0.08215,473.101749,-758.702385,87.31918,
+ 0.932875,-0.335664,0.130666,472.107195,-761.701654,88.500895,
+ -0.649152,0.525457,-0.549997,445.721747,-699.576473,149.953886,
+ -0.748179,0.401798,-0.528002,448.282017,-677.413444,165.951609,
+ -0.748179,0.469999,-0.468325,448.282019,-697.799917,148.177329,
+ -0.748179,0.401798,-0.528002,448.282017,-677.413444,165.951609,
+ -0.649152,0.525457,-0.549997,445.721747,-699.576473,149.953886,
+ -0.649152,0.44561,-0.616469,445.721745,-678.931346,167.953679,
+ 0.995804,-0.065815,0.063588,473.64208,-708.127668,158.505081,
+ 0.973657,-0.182625,0.136528,473.101763,-729.866936,138.627118,
+ 0.995804,-0.073866,0.054027,473.642079,-727.212939,136.614949,
+ 0.973657,-0.182625,0.136528,473.101763,-729.866936,138.627118,
+ 0.995804,-0.065815,0.063588,473.64208,-708.127668,158.505081,
+ 0.973657,-0.162317,0.16014,473.101765,-710.482719,160.860131,
+ -0.9698,0.148537,-0.193454,760.201828,-592.476195,53.921748,
+ -0.993727,0.056116,-0.096737,764.031424,-575.55911,39.794854,
+ -0.993727,0.068775,-0.088188,764.031425,-579.704781,37.076602,
+ -0.993727,0.056116,-0.096737,764.031424,-575.55911,39.794854,
+ -0.9698,0.148537,-0.193454,760.201828,-592.476195,53.921748,
+ -0.9698,0.12079,-0.21189,760.201826,-585.915972,58.223185,
+ -0.870211,0.349319,-0.347431,744.275059,-626.524536,76.901948,
+ -0.928388,0.225646,-0.295263,753.576412,-604.820821,70.203974,
+ -0.928388,0.263776,-0.261761,753.576413,-612.83728,63.214693,
+ -0.928388,0.225646,-0.295263,753.576412,-604.820821,70.203974,
+ -0.870211,0.349319,-0.347431,744.275059,-626.524536,76.901948,
+ -0.870211,0.298718,-0.391791,744.275058,-616.515297,85.628667,
+ -0.869747,0.008617,-0.493422,744.275028,-547.318028,105.557439,
+ -0.919489,0,-0.393115,753.576386,-186.86272,86.24593,
+ -0.928106,0.006604,-0.372257,753.576386,-546.993607,86.24593,
+ -0.919489,0,-0.393115,753.576386,-186.86272,86.24593,
+ -0.869747,0.008617,-0.493422,744.275028,-547.318028,105.557439,
+ -0.858411,0,-0.512963,744.275028,-186.86272,105.557439,
+ -0.373111,0.218748,-0.901631,665.02137,-597.163793,170.061811,
+ -0.244971,0.09829,-0.964535,644.636231,-575.409716,180.525125,
+ -0.373111,0.093846,-0.923028,665.021359,-574.733894,173.918677,
+ -0.244971,0.09829,-0.964535,644.636231,-575.409716,180.525125,
+ -0.373111,0.218748,-0.901631,665.02137,-597.163793,170.061811,
+ -0.244971,0.228806,-0.942145,644.636243,-598.733545,176.514546,
+ 0.991932,-0.031409,0.122818,792.007213,-567.289597,47.258281,
+ 0.966794,-0.095028,0.237232,787.130187,-581.689044,68.845,
+ 0.991932,-0.047852,0.117393,792.007216,-572.529419,45.597264,
+ 0.966794,-0.095028,0.237232,787.130187,-581.689044,68.845,
+ 0.991932,-0.031409,0.122818,792.007213,-567.289597,47.258281,
+ 0.966794,-0.061815,0.247969,787.130183,-573.195905,71.537315,
+ 0.091928,-0.101189,0.990611,451.683301,-581.654891,241.574352,
+ 0.229025,-0.229739,0.945922,455.006085,-613.111378,235.617099,
+ 0.229024,-0.098699,0.968404,455.006069,-581.599776,241.035583,
+ 0.229025,-0.229739,0.945922,455.006085,-613.111378,235.617099,
+ 0.091928,-0.101189,0.990611,451.683301,-581.654891,241.574352,
+ 0.091928,-0.235232,0.967582,451.683317,-613.239395,236.143333,
+ 0.01127,-0.101755,0.994746,448.317739,-581.662615,241.649835,
+ 0.091928,-0.235232,0.967582,451.683317,-613.239395,236.143333,
+ 0.091928,-0.101189,0.990611,451.683301,-581.654891,241.574352,
+ 0.091928,-0.235232,0.967582,451.683317,-613.239395,236.143333,
+ 0.01127,-0.101755,0.994746,448.317739,-581.662615,241.649835,
+ 0.01127,-0.236356,0.971601,448.317755,-613.257332,236.21706,
+ -0.494423,0.204724,-0.844769,684.332878,-594.960039,161.002883,
+ -0.373111,0.093846,-0.923028,665.021359,-574.733894,173.918677,
+ -0.494423,0.087701,-0.864786,684.332867,-573.78512,164.643953,
+ -0.373111,0.093846,-0.923028,665.021359,-574.733894,173.918677,
+ -0.494423,0.204724,-0.844769,684.332878,-594.960039,161.002883,
+ -0.373111,0.218748,-0.901631,665.02137,-597.163793,170.061811,
+ 0,-0.124431,0.992228,0.000019,-581.662862,241.649831,
+ 0.01127,-0.236356,0.971601,448.317755,-613.257332,236.21706,
+ 0.01127,-0.101755,0.994746,448.317739,-581.662615,241.649835,
+ 0.01127,-0.236356,0.971601,448.317755,-613.257332,236.21706,
+ 0,-0.124431,0.992228,0.000019,-581.662862,241.649831,
+ 0,-0.258478,0.966017,0.000035,-613.257542,236.217062,
+ 0.995804,-0.023158,0.088537,473.642053,-608.036762,214.756927,
+ 0.973657,-0.085015,0.211575,473.101749,-636.941768,209.079797,
+ 0.995804,-0.035007,0.084556,473.642065,-635.720877,205.981096,
+ 0.973657,-0.085015,0.211575,473.101749,-636.941768,209.079797,
+ 0.995804,-0.023158,0.088537,473.642053,-608.036762,214.756927,
+ 0.973657,-0.055392,0.221186,473.101737,-608.824017,217.993091,
+ 0.973657,-0.138981,0.180764,473.101763,-688.249706,180.244348,
+ 0.932875,-0.255741,0.253655,472.107211,-712.762199,163.139612,
+ 0.973657,-0.162317,0.16014,473.101765,-710.482719,160.860131,
+ 0.932875,-0.255741,0.253655,472.107211,-712.762199,163.139612,
+ 0.973657,-0.138981,0.180764,473.101763,-688.249706,180.244348,
+ 0.932875,-0.218791,0.286137,472.107209,-690.197308,182.813182,
+ 0.932875,-0.218791,0.286137,472.107209,-690.197308,182.813182,
+ 0.874212,-0.344308,0.342352,470.677525,-714.922322,165.299734,
+ 0.932875,-0.255741,0.253655,472.107211,-712.762199,163.139612,
+ 0.874212,-0.344308,0.342352,470.677525,-714.922322,165.299734,
+ 0.932875,-0.218791,0.286137,472.107209,-690.197308,182.813182,
+ 0.874212,-0.294445,0.386077,470.677524,-692.04293,185.247507,
+ -0.952384,0.113168,-0.283121,453.575559,-626.95854,183.741681,
+ -0.985345,0.041831,-0.165366,454.431253,-601.562294,188.142314,
+ -0.985345,0.063975,-0.158123,454.431263,-625.680129,180.496989,
+ -0.985345,0.041831,-0.165366,454.431253,-601.562294,188.142314,
+ -0.952384,0.113168,-0.283121,453.575559,-626.95854,183.741681,
+ -0.952384,0.073533,-0.295901,453.575549,-602.386639,191.530944,
+ 0.01127,-0.236356,0.971601,448.317755,-613.257332,236.21706,
+ 0.091928,-0.364886,0.926503,451.68333,-643.789223,226.459074,
+ 0.091928,-0.235232,0.967582,451.683317,-613.239395,236.143333,
+ 0.091928,-0.364886,0.926503,451.68333,-643.789223,226.459074,
+ 0.01127,-0.236356,0.971601,448.317755,-613.257332,236.21706,
+ 0.011271,-0.366548,0.930331,448.317768,-643.817038,226.529669,
+ 0.609101,-0.186578,0.770833,717.894058,-597.802054,172.685609,
+ 0.707841,-0.243878,0.662936,736.997686,-613.697356,150.084182,
+ 0.707841,-0.151267,0.689985,736.997677,-593.835505,156.380365,
+ 0.707841,-0.243878,0.662936,736.997686,-613.697356,150.084182,
+ 0.609101,-0.186578,0.770833,717.894058,-597.802054,172.685609,
+ 0.609101,-0.289877,0.738219,717.894067,-619.848758,165.69683,
+ -0.040706,0.236142,-0.970866,429.267752,-606.639691,209.013907,
+ -0,0.124431,-0.992228,0.016265,-578.81381,213.79866,
+ -0.040706,0.101643,-0.993988,429.267738,-578.813573,213.798664,
+ -0,0.124431,-0.992228,0.016265,-578.81381,213.79866,
+ -0.040706,0.236142,-0.970866,429.267752,-606.639691,209.013907,
+ -0,0.258478,-0.966017,0.016279,-606.639892,209.013909,
+ -0.606705,0.186995,-0.77262,702.221343,-592.162158,149.501677,
+ -0.494423,0.087701,-0.864786,684.332867,-573.78512,164.643953,
+ -0.606705,0.079969,-0.790894,702.221333,-572.580561,152.868772,
+ -0.494423,0.087701,-0.864786,684.332867,-573.78512,164.643953,
+ -0.606705,0.186995,-0.77262,702.221343,-592.162158,149.501677,
+ -0.494423,0.204724,-0.844769,684.332878,-594.960039,161.002883,
+ -0.150374,0.233455,-0.96067,432.83893,-606.570796,208.730707,
+ -0.040706,0.101643,-0.993988,429.267738,-578.813573,213.798664,
+ -0.150374,0.100371,-0.983521,432.838915,-578.78391,213.508718,
+ -0.040706,0.101643,-0.993988,429.267738,-578.813573,213.798664,
+ -0.150374,0.233455,-0.96067,432.83893,-606.570796,208.730707,
+ -0.040706,0.236142,-0.970866,429.267752,-606.639691,209.013907,
+ -0.285905,0.226068,-0.93121,436.335601,-606.385575,207.969324,
+ -0.150374,0.100371,-0.983521,432.838915,-578.78391,213.508718,
+ -0.285905,0.097067,-0.953329,436.335587,-578.704167,212.729198,
+ -0.150374,0.100371,-0.983521,432.838915,-578.78391,213.508718,
+ -0.285905,0.226068,-0.93121,436.335601,-606.385575,207.969324,
+ -0.150374,0.233455,-0.96067,432.83893,-606.570796,208.730707,
+ -0.707841,0.151267,-0.689985,718.363091,-588.820775,135.766294,
+ -0.606705,0.079969,-0.790894,702.221333,-572.580561,152.868772,
+ -0.707841,0.055835,-0.704162,718.363082,-571.142012,138.806193,
+ -0.606705,0.079969,-0.790894,702.221333,-572.580561,152.868772,
+ -0.707841,0.151267,-0.689985,718.363091,-588.820775,135.766294,
+ -0.606705,0.186995,-0.77262,702.221343,-592.162158,149.501677,
+ -0.993727,0.098232,-0.053457,764.031424,-589.417442,25.936523,
+ -0.998991,0.036391,-0.026305,764.531578,-577.829947,23.357838,
+ -0.998992,0.039135,-0.021994,764.267941,-584.829097,23.357838,
+ -0.998991,0.036391,-0.026305,764.531578,-577.829947,23.357838,
+ -0.993727,0.098232,-0.053457,764.031424,-589.417442,25.936523,
+ -0.993727,0.090031,-0.066344,764.031425,-586.699189,30.082194,
+ 0.991932,-0.111235,0.060808,792.007217,-592.860317,27.871437,
+ 0.988867,-0.134398,0.063875,792.007216,-595.005501,23.357838,
+ 0.998112,-0.05354,0.03009,792.574093,-584.829111,23.357838,
+ 0.361665,-0.812468,0.457269,458.222253,-760.983658,122.358117,
+ 0.229025,-0.775467,0.588387,455.006113,-744.32049,149.585311,
+ 0.229025,-0.848411,0.477229,455.006107,-761.852699,122.846525,
+ 0.229025,-0.775467,0.588387,455.006113,-744.32049,149.585311,
+ 0.361665,-0.812468,0.457269,458.222253,-760.983658,122.358117,
+ 0.361665,-0.742579,0.563715,458.222259,-743.526109,148.983038,
+ 0.229025,-0.848411,0.477229,455.006107,-761.852699,122.846525,
+ 0.091928,-0.793404,0.601714,451.683345,-744.752058,149.912511,
+ 0.091928,-0.867996,0.487987,451.683339,-762.324827,123.111865,
+ 0.091928,-0.793404,0.601714,451.683345,-744.752058,149.912511,
+ 0.229025,-0.848411,0.477229,455.006107,-761.852699,122.846525,
+ 0.229025,-0.775467,0.588387,455.006113,-744.32049,149.585311,
+ 0.091928,-0.867996,0.487987,451.683339,-762.324827,123.111865,
+ 0.011271,-0.796813,0.60412,448.317783,-744.812521,149.958353,
+ 0.011271,-0.871702,0.489906,448.317778,-762.390973,123.149041,
+ 0.011271,-0.796813,0.60412,448.317783,-744.812521,149.958353,
+ 0.091928,-0.867996,0.487987,451.683339,-762.324827,123.111865,
+ 0.091928,-0.793404,0.601714,451.683345,-744.752058,149.912511,
+ 0.011271,-0.871702,0.489906,448.317778,-762.390973,123.149041,
+ 0,-0.81044,0.585821,0.000063,-744.812573,149.958459,
+ 0,-0.882708,0.469921,0.000057,-762.391004,123.149179,
+ 0,-0.81044,0.585821,0.000063,-744.812573,149.958459,
+ 0.011271,-0.871702,0.489906,448.317778,-762.390973,123.149041,
+ 0.011271,-0.796813,0.60412,448.317783,-744.812521,149.958353,
+ 0.506559,-0.014482,0.862083,461.269937,-549.571376,239.686382,
+ 0.603443,-0.080198,0.793363,464.090747,-581.165077,236.78619,
+ 0.620913,-0.013167,0.783769,464.090728,-549.540509,237.849027,
+ 0.603443,-0.080198,0.793363,464.090747,-581.165077,236.78619,
+ 0.506559,-0.014482,0.862083,461.269937,-549.571376,239.686382,
+ 0.487278,-0.088099,0.868791,461.269956,-581.352493,238.618284,
+ -0.022557,0.706919,-0.706935,602.133302,-683.695423,134.072836,
+ -0,0.622177,-0.782877,454.66777,-665.3625,150.056742,
+ -0.022557,0.603993,-0.79667,602.133301,-665.362465,150.056725,
+ -0,0.622177,-0.782877,454.66777,-665.3625,150.056742,
+ -0.022557,0.706919,-0.706935,602.133302,-683.695423,134.072836,
+ -0,0.723053,-0.690793,454.667771,-683.695448,134.072861,
+ -0.112343,0.702509,-0.702752,623.546368,-683.011825,133.389238,
+ -0.022557,0.603993,-0.79667,602.133301,-665.362465,150.056725,
+ -0.112343,0.600194,-0.791925,623.546367,-664.778393,149.286355,
+ -0.022557,0.603993,-0.79667,602.133301,-665.362465,150.056725,
+ -0.112343,0.702509,-0.702752,623.546368,-683.011825,133.389238,
+ -0.022557,0.706919,-0.706935,602.133302,-683.695423,134.072836,
+ -0.244971,0.685296,-0.685827,644.636265,-680.297547,130.67496,
+ -0.112343,0.600194,-0.791925,623.546367,-664.778393,149.286355,
+ -0.244971,0.585448,-0.772813,644.636264,-662.459295,146.227532,
+ -0.112343,0.600194,-0.791925,623.546367,-664.778393,149.286355,
+ -0.244971,0.685296,-0.685827,644.636265,-680.297547,130.67496,
+ -0.112343,0.702509,-0.702752,623.546368,-683.011825,133.389238,
+ -0.832687,0.13217,-0.53774,450.471101,-603.912334,197.80261,
+ -0.901181,0.045526,-0.431045,452.246978,-577.321949,199.217285,
+ -0.901181,0.103838,-0.42082,452.246991,-603.175034,194.771794,
+ -0.901181,0.045526,-0.431045,452.246978,-577.321949,199.217285,
+ -0.832687,0.13217,-0.53774,450.471101,-603.912334,197.80261,
+ -0.832687,0.057661,-0.550734,450.471088,-577.639374,202.320298,
+ 0.995785,-0,0.091715,473.642021,-186.86272,220.6922,
+ 0.973547,-0.004216,0.228449,473.101704,-549.308105,224.014969,
+ 0.994417,-0.002312,0.105501,473.642021,-549.252285,220.6922,
+ 0.973547,-0.004216,0.228449,473.101704,-549.308105,224.014969,
+ 0.995785,-0,0.091715,473.642021,-186.86272,220.6922,
+ 0.967989,-0,0.250993,473.101704,-186.86272,224.014969,
+ 0.873731,0,0.48641,470.677463,-186.86272,230.278856,
+ 0.928983,-0.005506,0.370082,472.10715,-549.362134,227.231115,
+ 0.932593,0,0.360931,472.10715,-186.86272,227.231115,
+ 0.928983,-0.005506,0.370082,472.10715,-549.362134,227.231115,
+ 0.873731,0,0.48641,470.677463,-186.86272,230.278856,
+ 0.866918,-0.01021,0.498346,470.677463,-549.413334,230.278856,
+ 0.873731,0,0.48641,470.677463,-186.86272,230.278856,
+ 0.792107,-0.00894,0.610317,468.840108,-549.460722,233.099647,
+ 0.866918,-0.01021,0.498346,470.677463,-549.413334,230.278856,
+ 0.792107,-0.00894,0.610317,468.840108,-549.460722,233.099647,
+ 0.873731,0,0.48641,470.677463,-186.86272,230.278856,
+ 0.798084,0,0.602546,468.840108,-186.86272,233.099647,
+ 0.707107,0,0.707107,466.63038,-186.86272,235.639299,
+ 0.792107,-0.00894,0.610317,468.840108,-549.460722,233.099647,
+ 0.798084,0,0.602546,468.840108,-186.86272,233.099647,
+ 0.792107,-0.00894,0.610317,468.840108,-549.460722,233.099647,
+ 0.707107,0,0.707107,466.63038,-186.86272,235.639299,
+ 0.707157,-0.011876,0.706957,466.63038,-549.503387,235.639299,
+ -0.415875,0.332758,-0.846357,439.690608,-632.698039,198.308899,
+ -0.285905,0.226068,-0.93121,436.335601,-606.385575,207.969324,
+ -0.415875,0.214324,-0.883806,439.690597,-606.087584,206.744382,
+ -0.285905,0.226068,-0.93121,436.335601,-606.385575,207.969324,
+ -0.415875,0.332758,-0.846357,439.690608,-632.698039,198.308899,
+ -0.285905,0.350852,-0.891718,436.335613,-633.160168,199.481809,
+ -0.796291,0.222882,-0.562356,732.466058,-599.989405,115.292483,
+ -0.870211,0.117753,-0.4784,744.275047,-580.75808,102.623043,
+ -0.870211,0.181845,-0.457892,744.275052,-593.41661,98.610304,
+ -0.870211,0.117753,-0.4784,744.275047,-580.75808,102.623043,
+ -0.796291,0.222882,-0.562356,732.466058,-599.989405,115.292483,
+ -0.796291,0.144172,-0.587481,732.466052,-584.996349,120.045264,
+ 0.932875,-0.133411,0.334583,472.107195,-638.123482,212.079066,
+ 0.874212,-0.239089,0.422598,470.677518,-666.658744,201.891525,
+ 0.932875,-0.177759,0.313282,472.107204,-665.162054,199.228412,
+ 0.874212,-0.239089,0.422598,470.677518,-666.658744,201.891525,
+ 0.932875,-0.133411,0.334583,472.107195,-638.123482,212.079066,
+ 0.874212,-0.179273,0.451236,470.677509,-639.24332,214.921287,
+ 0,-0.387702,0.921785,0.000048,-643.817211,226.529683,
+ 0.011271,-0.489901,0.871705,448.317778,-672.771628,212.768386,
+ 0.011271,-0.366548,0.930331,448.317768,-643.817038,226.529669,
+ 0.011271,-0.489901,0.871705,448.317778,-672.771628,212.768386,
+ 0,-0.387702,0.921785,0.000048,-643.817211,226.529683,
+ 0,-0.509694,0.860356,0.000057,-672.771767,212.768417,
+ -0.285905,0.46909,-0.835591,436.335621,-658.528453,187.424994,
+ -0.150375,0.362184,-0.919897,432.838941,-633.447412,200.210852,
+ -0.285905,0.350852,-0.891718,436.335613,-633.160168,199.481809,
+ -0.150375,0.362184,-0.919897,432.838941,-633.447412,200.210852,
+ -0.285905,0.46909,-0.835591,436.335621,-658.528453,187.424994,
+ -0.150375,0.484157,-0.861963,432.838949,-658.912362,188.108094,
+ -0.415875,0.444984,-0.793119,439.690616,-657.910808,186.325996,
+ -0.285905,0.350852,-0.891718,436.335613,-633.160168,199.481809,
+ -0.415875,0.332758,-0.846357,439.690608,-632.698039,198.308899,
+ -0.285905,0.350852,-0.891718,436.335613,-633.160168,199.481809,
+ -0.415875,0.444984,-0.793119,439.690616,-657.910808,186.325996,
+ -0.285905,0.46909,-0.835591,436.335621,-658.528453,187.424994,
+ -0.537771,0.412318,-0.735388,442.839485,-657.07129,184.832214,
+ -0.415875,0.332758,-0.846357,439.690608,-632.698039,198.308899,
+ -0.537771,0.308263,-0.784714,442.839477,-632.069904,196.714653,
+ -0.415875,0.332758,-0.846357,439.690608,-632.698039,198.308899,
+ -0.537771,0.412318,-0.735388,442.839485,-657.07129,184.832214,
+ -0.415875,0.444984,-0.793119,439.690616,-657.910808,186.325996,
+ -0.649152,0.35745,-0.67144,445.72174,-656.026027,182.972343,
+ -0.537771,0.308263,-0.784714,442.839477,-632.069904,196.714653,
+ -0.649152,0.262621,-0.713885,445.721732,-631.287828,194.729696,
+ -0.537771,0.308263,-0.784714,442.839477,-632.069904,196.714653,
+ -0.649152,0.35745,-0.67144,445.72174,-656.026027,182.972343,
+ -0.537771,0.412318,-0.735388,442.839485,-657.07129,184.832214,
+ -0.952384,0.150692,-0.265059,453.575567,-650.239827,172.676755,
+ -0.985345,0.063975,-0.158123,454.431263,-625.680129,180.496989,
+ -0.985345,0.084925,-0.14793,454.431271,-648.531199,169.636534,
+ -0.985345,0.063975,-0.158123,454.431263,-625.680129,180.496989,
+ -0.952384,0.150692,-0.265059,453.575567,-650.239827,172.676755,
+ -0.952384,0.113168,-0.283121,453.575559,-626.95854,183.741681,
+ -0.90081,0.007643,-0.434147,452.246961,-548.907571,200.172234,
+ -0.94485,0,-0.327505,453.575519,-186.86272,196.844653,
+ -0.95219,0.005502,-0.305456,453.575519,-548.85167,196.844653,
+ -0.94485,0,-0.327505,453.575519,-186.86272,196.844653,
+ -0.90081,0.007643,-0.434147,452.246961,-548.907571,200.172234,
+ -0.890491,0,-0.455,452.246961,-186.86272,200.172234,
+ -0.95219,0.005502,-0.305456,453.575519,-548.85167,196.844653,
+ -0.981057,0,-0.193718,454.431224,-186.86272,193.365338,
+ -0.985283,0.003254,-0.170901,454.431224,-548.79322,193.365338,
+ -0.981057,0,-0.193718,454.431224,-186.86272,193.365338,
+ -0.95219,0.005502,-0.305456,453.575519,-548.85167,196.844653,
+ -0.94485,0,-0.327505,453.575519,-186.86272,196.844653,
+ -0.985283,0.003254,-0.170901,454.431224,-548.79322,193.365338,
+ -0.998419,0,-0.05621,454.797637,-186.86272,189.801127,
+ -0.999453,0.000944,-0.033066,454.797637,-548.733344,189.801127,
+ -0.998419,0,-0.05621,454.797637,-186.86272,189.801127,
+ -0.985283,0.003254,-0.170901,454.431224,-548.79322,193.365338,
+ -0.981057,0,-0.193718,454.431224,-186.86272,193.365338,
+ -0.999453,0.000944,-0.033066,454.797637,-548.733344,189.801127,
+ -0.999342,-0,0.036259,454.66772,-186.86272,186.220487,
+ -0.999343,-0.000812,0.036246,454.66772,-548.673192,186.220487,
+ -0.999342,-0,0.036259,454.66772,-186.86272,186.220487,
+ -0.999453,0.000944,-0.033066,454.797637,-548.733344,189.801127,
+ -0.998419,0,-0.05621,454.797637,-186.86272,189.801127,
+ -0,1,-0,56.126785,-233.5784,1315.222366,
+ -0,1,-0,18.722685,-233.5784,268.426375,
+ 0,1,-0,18.722685,-233.5784,1315.222366,
+ -0,1,-0,18.722685,-233.5784,268.426375,
+ -0,1,-0,56.126785,-233.5784,1315.222366,
+ -0,1,0,56.126785,-233.5784,268.426375,
+ 0,0,1,18.722685,-186.86272,268.426375,
+ 0,0,1,56.126785,-233.5784,268.426375,
+ 0,0,1,56.126785,-186.86272,268.426375,
+ 0,0,1,56.126785,-233.5784,268.426375,
+ 0,0,1,18.722685,-186.86272,268.426375,
+ 0,0,1,18.722685,-233.5784,268.426375,
+ 1,0,-0,18.722685,-186.86272,1315.222366,
+ 1,0,-0,18.722685,-233.5784,268.426375,
+ 1,0,0,18.722685,-186.86272,268.426375,
+ 1,0,-0,18.722685,-233.5784,268.426375,
+ 1,0,-0,18.722685,-186.86272,1315.222366,
+ 1,0,-0,18.722685,-233.5784,1315.222366,
+ 0,0,-1,56.126785,-233.5784,1315.222366,
+ 0,0,-1,18.722685,-186.86272,1315.222366,
+ 0,0,-1,56.126785,-186.86272,1315.222366,
+ 0,0,-1,18.722685,-186.86272,1315.222366,
+ 0,0,-1,56.126785,-233.5784,1315.222366,
+ 0,0,-1,18.722685,-233.5784,1315.222366,
+ -1,-0,0,56.126785,-233.5784,1315.222366,
+ -1,-0,0,56.126785,-186.86272,268.426375,
+ -1,-0,0,56.126785,-233.5784,268.426375,
+ -1,-0,0,56.126785,-186.86272,268.426375,
+ -1,-0,0,56.126785,-233.5784,1315.222366,
+ -1,-0,0,56.126785,-186.86272,1315.222366
+};
+static const struct gllist robot_leg_half_frame = { GL_N3F_V3F, GL_TRIANGLES, 5190, robot_leg_half_data, 0 };
+const struct gllist *robot_leg_half = &robot_leg_half_frame;
+
+static const float robot_rotator_half_data[] = {
+ 0.707107,0,-0.707106,123.957535,-140.14704,1438.610184,
+ 0.812792,0,-0.582553,145.758595,-327.00976,1465.174884,
+ 0.707107,0,-0.707106,123.957535,-327.00976,1438.610184,
+ 0.812792,0,-0.582553,145.758595,-327.00976,1465.174884,
+ 0.707107,0,-0.707106,123.957535,-140.14704,1438.610184,
+ 0.849252,0,-0.527988,145.758595,-140.14704,1465.174884,
+ -0.812792,-0,-0.582554,-145.758282,-327.00976,1465.174712,
+ -0.707106,-0,-0.707107,-123.957191,-140.14704,1438.610037,
+ -0.707106,-0,-0.707107,-123.957191,-327.00976,1438.610037,
+ -0.707106,-0,-0.707107,-123.957191,-140.14704,1438.610037,
+ -0.812792,-0,-0.582554,-145.758282,-327.00976,1465.174712,
+ -0.849251,0,-0.527989,-145.758282,-140.14704,1465.174712,
+ 0.227167,0,0.973856,34.199757,-140.14704,1734.501295,
+ 0.352162,0,0.935939,67.085244,-327.00976,1724.525612,
+ 0.412792,0,0.910825,67.085244,-140.14704,1724.525612,
+ 0.352162,0,0.935939,67.085244,-327.00976,1724.525612,
+ 0.227167,0,0.973856,34.199757,-140.14704,1734.501295,
+ 0.162802,0,0.986659,34.199757,-327.00976,1734.501295,
+ -0.227167,0,-0.973856,-34.199559,-327.00976,1390.633652,
+ -0.352162,0,-0.935939,-67.085047,-140.14704,1400.609334,
+ -0.162802,0,-0.986659,-34.199559,-140.14704,1390.633652,
+ -0.352162,0,-0.935939,-67.085047,-140.14704,1400.609334,
+ -0.227167,0,-0.973856,-34.199559,-327.00976,1390.633652,
+ -0.412792,-0,-0.910825,-67.085047,-327.00976,1400.609334,
+ 0.849252,0,-0.527988,145.758595,-140.14704,1465.174884,
+ 0.910825,0,-0.412792,161.958238,-327.00976,1495.482328,
+ 0.812792,0,-0.582553,145.758595,-327.00976,1465.174884,
+ 0.910825,0,-0.412792,161.958238,-327.00976,1495.482328,
+ 0.849252,0,-0.527988,145.758595,-140.14704,1465.174884,
+ 0.935939,0,-0.352162,161.958238,-140.14704,1495.482328,
+ 0.032812,0,0.999462,-0.000005,-140.14704,1737.869657,
+ 0.162802,0,0.986659,34.199757,-327.00976,1734.501295,
+ 0.227167,0,0.973856,34.199757,-140.14704,1734.501295,
+ 0.162802,0,0.986659,34.199757,-327.00976,1734.501295,
+ 0.032812,0,0.999462,-0.000005,-140.14704,1737.869657,
+ -0.032813,-0,0.999461,-0.000005,-327.00976,1737.869657,
+ 0.973856,0,0.227168,171.93388,-140.14704,1596.767334,
+ 0.935939,0,0.352163,161.958159,-327.00976,1629.65281,
+ 0.986659,0,0.162804,171.93388,-327.00976,1596.767334,
+ 0.935939,0,0.352163,161.958159,-327.00976,1629.65281,
+ 0.973856,0,0.227168,171.93388,-140.14704,1596.767334,
+ 0.910825,0,0.412793,161.958159,-140.14704,1629.65281,
+ -0.412792,-0,-0.910825,-67.085047,-327.00976,1400.609334,
+ -0.527988,-0,-0.849252,-97.39249,-140.14704,1416.808977,
+ -0.352162,0,-0.935939,-67.085047,-140.14704,1400.609334,
+ -0.527988,-0,-0.849252,-97.39249,-140.14704,1416.808977,
+ -0.412792,-0,-0.910825,-67.085047,-327.00976,1400.609334,
+ -0.582553,-0,-0.812792,-97.39249,-327.00976,1416.808977,
+ 0.999461,0,0.032813,175.302282,-140.14704,1562.567577,
+ 0.986659,0,0.162804,171.93388,-327.00976,1596.767334,
+ 0.999462,0,-0.032812,175.302282,-327.00976,1562.567577,
+ 0.986659,0,0.162804,171.93388,-327.00976,1596.767334,
+ 0.999461,0,0.032813,175.302282,-140.14704,1562.567577,
+ 0.973856,0,0.227168,171.93388,-140.14704,1596.767334,
+ -0.707107,-0,0.707106,-123.957337,-327.00976,1686.524763,
+ -0.812792,-0,0.582553,-145.758398,-140.14704,1659.960062,
+ -0.849252,-0,0.527988,-145.758398,-327.00976,1659.960062,
+ -0.812792,-0,0.582553,-145.758398,-140.14704,1659.960062,
+ -0.707107,-0,0.707106,-123.957337,-327.00976,1686.524763,
+ -0.707107,-0,0.707106,-123.957337,-140.14704,1686.524763,
+ 0.910825,0,0.412793,161.958159,-140.14704,1629.65281,
+ 0.849251,0,0.527989,145.75848,-327.00976,1659.960235,
+ 0.935939,0,0.352163,161.958159,-327.00976,1629.65281,
+ 0.849251,0,0.527989,145.75848,-327.00976,1659.960235,
+ 0.910825,0,0.412793,161.958159,-140.14704,1629.65281,
+ 0.812792,-0,0.582554,145.75848,-140.14704,1659.960235,
+ -0.582553,-0,-0.812792,-97.39249,-327.00976,1416.808977,
+ -0.707106,-0,-0.707107,-123.957191,-140.14704,1438.610037,
+ -0.527988,-0,-0.849252,-97.39249,-140.14704,1416.808977,
+ -0.707106,-0,-0.707107,-123.957191,-140.14704,1438.610037,
+ -0.582553,-0,-0.812792,-97.39249,-327.00976,1416.808977,
+ -0.707106,-0,-0.707107,-123.957191,-327.00976,1438.610037,
+ -0.935939,-0,0.352162,-161.95804,-327.00976,1629.652619,
+ -0.973856,-0,0.227167,-171.933723,-140.14704,1596.767131,
+ -0.986659,-0,0.162802,-171.933723,-327.00976,1596.767131,
+ -0.973856,-0,0.227167,-171.933723,-140.14704,1596.767131,
+ -0.935939,-0,0.352162,-161.95804,-327.00976,1629.652619,
+ -0.910825,-0,0.412792,-161.95804,-140.14704,1629.652619,
+ 0.412792,0,0.910825,67.085244,-140.14704,1724.525612,
+ 0.527988,0,0.849252,97.392688,-327.00976,1708.32597,
+ 0.582553,-0,0.812792,97.392688,-140.14704,1708.32597,
+ 0.527988,0,0.849252,97.392688,-327.00976,1708.32597,
+ 0.412792,0,0.910825,67.085244,-140.14704,1724.525612,
+ 0.352162,0,0.935939,67.085244,-327.00976,1724.525612,
+ -0.352163,-0,0.935939,-67.085238,-140.14704,1724.525533,
+ -0.227168,-0,0.973856,-34.199762,-327.00976,1734.501255,
+ -0.162804,-0,0.986659,-34.199762,-140.14704,1734.501255,
+ -0.227168,-0,0.973856,-34.199762,-327.00976,1734.501255,
+ -0.352163,-0,0.935939,-67.085238,-140.14704,1724.525533,
+ -0.412793,-0,0.910825,-67.085238,-327.00976,1724.525533,
+ 0.162804,0,-0.986659,34.19996,-327.00976,1390.633692,
+ 0.032813,0,-0.999461,0.000202,-140.14704,1387.26529,
+ 0.227168,0,-0.973856,34.19996,-140.14704,1390.633692,
+ 0.032813,0,-0.999461,0.000202,-140.14704,1387.26529,
+ 0.162804,0,-0.986659,34.19996,-327.00976,1390.633692,
+ -0.032812,0,-0.999462,0.000202,-327.00976,1387.26529,
+ -0.032812,0,-0.999462,0.000202,-327.00976,1387.26529,
+ -0.162802,0,-0.986659,-34.199559,-140.14704,1390.633652,
+ 0.032813,0,-0.999461,0.000202,-140.14704,1387.26529,
+ -0.162802,0,-0.986659,-34.199559,-140.14704,1390.633652,
+ -0.032812,0,-0.999462,0.000202,-327.00976,1387.26529,
+ -0.227167,0,-0.973856,-34.199559,-327.00976,1390.633652,
+ 0.752338,0,0.658777,21.00973,-0,1702.42617,
+ 0.896537,0,0.442969,27.450543,-140.14704,1692.786831,
+ 0.947173,0,0.320723,27.450543,-0,1692.786831,
+ 0.896537,0,0.442969,27.450543,-140.14704,1692.786831,
+ 0.752338,0,0.658777,21.00973,-0,1702.42617,
+ 0.658776,0,0.75234,21.00973,-140.14704,1702.42617,
+ 0.352163,0,-0.935939,67.085436,-327.00976,1400.609414,
+ 0.227168,0,-0.973856,34.19996,-140.14704,1390.633692,
+ 0.412793,0,-0.910825,67.085436,-140.14704,1400.609414,
+ 0.227168,0,-0.973856,34.19996,-140.14704,1390.633692,
+ 0.352163,0,-0.935939,67.085436,-327.00976,1400.609414,
+ 0.162804,0,-0.986659,34.19996,-327.00976,1390.633692,
+ 0.582553,-0,0.812792,97.392688,-140.14704,1708.32597,
+ 0.707106,-0,0.707107,123.957388,-327.00976,1686.524909,
+ 0.707106,-0,0.707107,123.957388,-140.14704,1686.524909,
+ 0.707106,-0,0.707107,123.957388,-327.00976,1686.524909,
+ 0.582553,-0,0.812792,97.392688,-140.14704,1708.32597,
+ 0.527988,0,0.849252,97.392688,-327.00976,1708.32597,
+ 0.935939,0,-0.352162,161.958238,-140.14704,1495.482328,
+ 0.973856,0,-0.227167,171.93392,-327.00976,1528.367816,
+ 0.910825,0,-0.412792,161.958238,-327.00976,1495.482328,
+ 0.973856,0,-0.227167,171.93392,-327.00976,1528.367816,
+ 0.935939,0,-0.352162,161.958238,-140.14704,1495.482328,
+ 0.986659,0,-0.162802,171.93392,-140.14704,1528.367816,
+ 0.986659,0,-0.162802,171.93392,-140.14704,1528.367816,
+ 0.999462,0,-0.032812,175.302282,-327.00976,1562.567577,
+ 0.973856,0,-0.227167,171.93392,-327.00976,1528.367816,
+ 0.999462,0,-0.032812,175.302282,-327.00976,1562.567577,
+ 0.986659,0,-0.162802,171.93392,-140.14704,1528.367816,
+ 0.999461,0,0.032813,175.302282,-140.14704,1562.567577,
+ 0.555571,0,-0.831469,97.39286,-327.00976,1416.809092,
+ 0.412793,0,-0.910825,67.085436,-140.14704,1400.609414,
+ 0.555571,0,-0.831469,97.39286,-140.14704,1416.809092,
+ 0.412793,0,-0.910825,67.085436,-140.14704,1400.609414,
+ 0.555571,0,-0.831469,97.39286,-327.00976,1416.809092,
+ 0.352163,0,-0.935939,67.085436,-327.00976,1400.609414,
+ -0.849252,-0,0.527988,-145.758398,-327.00976,1659.960062,
+ -0.910825,-0,0.412792,-161.95804,-140.14704,1629.652619,
+ -0.935939,-0,0.352162,-161.95804,-327.00976,1629.652619,
+ -0.910825,-0,0.412792,-161.95804,-140.14704,1629.652619,
+ -0.849252,-0,0.527988,-145.758398,-327.00976,1659.960062,
+ -0.812792,-0,0.582553,-145.758398,-140.14704,1659.960062,
+ 0.707107,0,-0.707106,123.957535,-140.14704,1438.610184,
+ 0.555571,0,-0.831469,97.39286,-327.00976,1416.809092,
+ 0.555571,0,-0.831469,97.39286,-140.14704,1416.809092,
+ 0.555571,0,-0.831469,97.39286,-327.00976,1416.809092,
+ 0.707107,0,-0.707106,123.957535,-140.14704,1438.610184,
+ 0.707107,0,-0.707106,123.957535,-327.00976,1438.610184,
+ -0.986659,-0,0.162802,-171.933723,-327.00976,1596.767131,
+ -0.999462,-0,0.032812,-175.302085,-140.14704,1562.56737,
+ -0.999461,-0,-0.032813,-175.302085,-327.00976,1562.56737,
+ -0.999462,-0,0.032812,-175.302085,-140.14704,1562.56737,
+ -0.986659,-0,0.162802,-171.933723,-327.00976,1596.767131,
+ -0.973856,-0,0.227167,-171.933723,-140.14704,1596.767131,
+ -0.999461,-0,-0.032813,-175.302085,-327.00976,1562.56737,
+ -0.986659,-0,-0.162804,-171.933682,-140.14704,1528.367612,
+ -0.973856,-0,-0.227168,-171.933682,-327.00976,1528.367612,
+ -0.986659,-0,-0.162804,-171.933682,-140.14704,1528.367612,
+ -0.999461,-0,-0.032813,-175.302085,-327.00976,1562.56737,
+ -0.999462,-0,0.032812,-175.302085,-140.14704,1562.56737,
+ -0.973856,-0,-0.227168,-171.933682,-327.00976,1528.367612,
+ -0.935939,0,-0.352163,-161.957961,-140.14704,1495.482136,
+ -0.910825,0,-0.412793,-161.957961,-327.00976,1495.482136,
+ -0.935939,0,-0.352163,-161.957961,-140.14704,1495.482136,
+ -0.973856,-0,-0.227168,-171.933682,-327.00976,1528.367612,
+ -0.986659,-0,-0.162804,-171.933682,-140.14704,1528.367612,
+ -0.910825,0,-0.412793,-161.957961,-327.00976,1495.482136,
+ -0.849251,0,-0.527989,-145.758282,-140.14704,1465.174712,
+ -0.812792,-0,-0.582554,-145.758282,-327.00976,1465.174712,
+ -0.849251,0,-0.527989,-145.758282,-140.14704,1465.174712,
+ -0.910825,0,-0.412793,-161.957961,-327.00976,1495.482136,
+ -0.935939,0,-0.352163,-161.957961,-140.14704,1495.482136,
+ 0.812792,-0,0.582554,145.75848,-140.14704,1659.960235,
+ 0.707106,-0,0.707107,123.957388,-327.00976,1686.524909,
+ 0.849251,0,0.527989,145.75848,-327.00976,1659.960235,
+ 0.707106,-0,0.707107,123.957388,-327.00976,1686.524909,
+ 0.812792,-0,0.582554,145.75848,-140.14704,1659.960235,
+ 0.707106,-0,0.707107,123.957388,-140.14704,1686.524909,
+ -0.555571,-0,0.831469,-97.392662,-140.14704,1708.325854,
+ -0.412793,-0,0.910825,-67.085238,-327.00976,1724.525533,
+ -0.352163,-0,0.935939,-67.085238,-140.14704,1724.525533,
+ -0.412793,-0,0.910825,-67.085238,-327.00976,1724.525533,
+ -0.555571,-0,0.831469,-97.392662,-140.14704,1708.325854,
+ -0.555571,-0,0.831469,-97.392662,-327.00976,1708.325854,
+ -0.707107,-0,0.707106,-123.957337,-327.00976,1686.524763,
+ -0.555571,-0,0.831469,-97.392662,-140.14704,1708.325854,
+ -0.707107,-0,0.707106,-123.957337,-140.14704,1686.524763,
+ -0.555571,-0,0.831469,-97.392662,-140.14704,1708.325854,
+ -0.707107,-0,0.707106,-123.957337,-327.00976,1686.524763,
+ -0.555571,-0,0.831469,-97.392662,-327.00976,1708.325854,
+ 0.707107,-0,-0.707106,21.009767,-140.14704,1660.406714,
+ 0.382684,-0,-0.923879,11.370427,-0,1653.965901,
+ 0.707107,0,-0.707106,21.009767,-0,1660.406714,
+ 0.382684,-0,-0.923879,11.370427,-0,1653.965901,
+ 0.707107,-0,-0.707106,21.009767,-140.14704,1660.406714,
+ 0.382684,-0,-0.923879,11.370427,-140.14704,1653.965901,
+ -0.442967,-0,-0.896538,-11.370339,-140.14704,1653.965881,
+ -0.707106,-0,-0.707107,-21.00969,-0,1660.406677,
+ -0.320721,-0,-0.947174,-11.370339,-0,1653.965881,
+ -0.707106,-0,-0.707107,-21.00969,-0,1660.406677,
+ -0.442967,-0,-0.896538,-11.370339,-140.14704,1653.965881,
+ -0.707106,-0,-0.707107,-21.00969,-140.14704,1660.406677,
+ -0.000001,0,1,-0.000006,-0,1711.128666,
+ 0.320721,0,0.947174,11.370379,-140.14704,1708.866966,
+ 0.442967,0,0.896538,11.370379,-0,1708.866966,
+ 0.320721,0,0.947174,11.370379,-140.14704,1708.866966,
+ -0.000001,0,1,-0.000006,-0,1711.128666,
+ -0.000001,0,1,-0.000006,-140.14704,1711.128666,
+ -0.896537,-0,-0.442969,-27.450503,-140.14704,1670.046016,
+ -0.707106,-0,-0.707107,-21.00969,-0,1660.406677,
+ -0.707106,-0,-0.707107,-21.00969,-140.14704,1660.406677,
+ -0.707106,-0,-0.707107,-21.00969,-0,1660.406677,
+ -0.896537,-0,-0.442969,-27.450503,-140.14704,1670.046016,
+ -0.947173,-0,-0.320723,-27.450503,-0,1670.046016,
+ 0.442967,0,0.896538,11.370379,-0,1708.866966,
+ 0.658776,0,0.75234,21.00973,-140.14704,1702.42617,
+ 0.752338,0,0.658777,21.00973,-0,1702.42617,
+ 0.658776,0,0.75234,21.00973,-140.14704,1702.42617,
+ 0.442967,0,0.896538,11.370379,-0,1708.866966,
+ 0.320721,0,0.947174,11.370379,-140.14704,1708.866966,
+ 0.947173,0,0.320723,27.450543,-0,1692.786831,
+ 0.997809,0,0.06616,29.712263,-140.14704,1681.41645,
+ 0.997809,0,-0.066158,29.712263,-0,1681.41645,
+ 0.997809,0,0.06616,29.712263,-140.14704,1681.41645,
+ 0.947173,0,0.320723,27.450543,-0,1692.786831,
+ 0.896537,0,0.442969,27.450543,-140.14704,1692.786831,
+ 0.997809,0,-0.066158,29.712263,-0,1681.41645,
+ 0.947174,0,-0.320721,27.450563,-140.14704,1670.046065,
+ 0.896538,0,-0.442967,27.450563,-0,1670.046065,
+ 0.947174,0,-0.320721,27.450563,-140.14704,1670.046065,
+ 0.997809,0,-0.066158,29.712263,-0,1681.41645,
+ 0.997809,0,0.06616,29.712263,-140.14704,1681.41645,
+ -0.707107,-0,0.707106,-21.009727,-0,1702.426133,
+ -0.382684,-0,0.923879,-11.370387,-140.14704,1708.866946,
+ -0.382684,-0,0.923879,-11.370387,-0,1708.866946,
+ -0.382684,-0,0.923879,-11.370387,-140.14704,1708.866946,
+ -0.707107,-0,0.707106,-21.009727,-0,1702.426133,
+ -0.707107,-0,0.707106,-21.009727,-140.14704,1702.426133,
+ -0,1,0,-171.933723,-140.14704,1596.767131,
+ -0,1,0,-171.933682,-140.14704,1528.367612,
+ -0,1,0,-175.302085,-140.14704,1562.56737,
+ -0,1,0,-171.933682,-140.14704,1528.367612,
+ -0,1,0,-171.933723,-140.14704,1596.767131,
+ 0,1,0,-161.95804,-140.14704,1629.652619,
+ -0,1,0,-171.933682,-140.14704,1528.367612,
+ 0,1,0,-161.95804,-140.14704,1629.652619,
+ 0,1,0,-161.957961,-140.14704,1495.482136,
+ 0,1,0,-161.957961,-140.14704,1495.482136,
+ 0,1,0,-161.95804,-140.14704,1629.652619,
+ -0,1,0,-145.758398,-140.14704,1659.960062,
+ 0,1,0,-161.957961,-140.14704,1495.482136,
+ -0,1,0,-145.758398,-140.14704,1659.960062,
+ -0,1,0,-145.758282,-140.14704,1465.174712,
+ -0,1,0,-145.758282,-140.14704,1465.174712,
+ -0,1,0,-145.758398,-140.14704,1659.960062,
+ -0,1,0,-123.957337,-140.14704,1686.524763,
+ -0,1,0,-145.758282,-140.14704,1465.174712,
+ -0,1,0,-123.957337,-140.14704,1686.524763,
+ 0,1,0,-123.957191,-140.14704,1438.610037,
+ 0,1,0,-123.957191,-140.14704,1438.610037,
+ -0,1,0,-123.957337,-140.14704,1686.524763,
+ -0,1,0,-97.392662,-140.14704,1708.325854,
+ 0,1,0,-123.957191,-140.14704,1438.610037,
+ -0,1,0,-97.392662,-140.14704,1708.325854,
+ -0,1,0,-97.39249,-140.14704,1416.808977,
+ -0,1,0,-97.39249,-140.14704,1416.808977,
+ -0,1,0,-97.392662,-140.14704,1708.325854,
+ -0,1,0,-85.022439,-140.14704,1562.567379,
+ -0,1,0,-85.022439,-140.14704,1562.567379,
+ -0,1,0,-97.392662,-140.14704,1708.325854,
+ -0,1,0,-83.388773,-140.14704,1579.154455,
+ -0,1,0,-83.388773,-140.14704,1579.154455,
+ -0,1,0,-97.392662,-140.14704,1708.325854,
+ 0,1,0,-67.085238,-140.14704,1724.525533,
+ -0,1,0,-83.388773,-140.14704,1579.154455,
+ 0,1,0,-67.085238,-140.14704,1724.525533,
+ 0,1,0,-78.55052,-140.14704,1595.104103,
+ 0,1,0,-78.55052,-140.14704,1595.104103,
+ 0,1,0,-67.085238,-140.14704,1724.525533,
+ 0,1,0,-70.69361,-140.14704,1609.803386,
+ 0,1,0,-70.69361,-140.14704,1609.803386,
+ 0,1,0,-67.085238,-140.14704,1724.525533,
+ -0,1,0,-60.119981,-140.14704,1622.687419,
+ -0,1,0,-60.119981,-140.14704,1622.687419,
+ 0,1,0,-67.085238,-140.14704,1724.525533,
+ -0,1,0,-34.199762,-140.14704,1734.501255,
+ -0,1,0,-60.119981,-140.14704,1622.687419,
+ -0,1,0,-34.199762,-140.14704,1734.501255,
+ -0,1,0,-47.235971,-140.14704,1633.261077,
+ -0,1,0,-47.235971,-140.14704,1633.261077,
+ -0,1,0,-34.199762,-140.14704,1734.501255,
+ -0,1,0,-32.536705,-140.14704,1641.118019,
+ -0,1,0,-32.536705,-140.14704,1641.118019,
+ -0,1,0,-34.199762,-140.14704,1734.501255,
+ -0,1,0,-29.712222,-140.14704,1681.416397,
+ -0,1,0,-29.712222,-140.14704,1681.416397,
+ -0,1,0,-34.199762,-140.14704,1734.501255,
+ -0,1,0,-27.450523,-140.14704,1692.786782,
+ -0,1,0,-27.450523,-140.14704,1692.786782,
+ -0,1,0,-34.199762,-140.14704,1734.501255,
+ -0,1,0,-0.000005,-140.14704,1737.869657,
+ -0,1,0,-27.450523,-140.14704,1692.786782,
+ -0,1,0,-0.000005,-140.14704,1737.869657,
+ 0,1,0,-21.009727,-140.14704,1702.426133,
+ 0,1,0,-21.009727,-140.14704,1702.426133,
+ -0,1,0,-0.000005,-140.14704,1737.869657,
+ 0,1,0,-11.370387,-140.14704,1708.866946,
+ 0,1,0,-11.370387,-140.14704,1708.866946,
+ -0,1,0,-0.000005,-140.14704,1737.869657,
+ 0,1,0,-0.000006,-140.14704,1711.128666,
+ 0,1,0,-0.000006,-140.14704,1711.128666,
+ -0,1,0,-0.000005,-140.14704,1737.869657,
+ 0,1,0,11.370379,-140.14704,1708.866966,
+ 0,1,0,11.370379,-140.14704,1708.866966,
+ -0,1,0,-0.000005,-140.14704,1737.869657,
+ -0,1,0,34.199757,-140.14704,1734.501295,
+ 0,1,0,11.370379,-140.14704,1708.866966,
+ -0,1,0,34.199757,-140.14704,1734.501295,
+ 0,1,0,21.00973,-140.14704,1702.42617,
+ 0,1,0,21.00973,-140.14704,1702.42617,
+ -0,1,0,34.199757,-140.14704,1734.501295,
+ 0,1,0,27.450543,-140.14704,1692.786831,
+ 0,1,0,27.450543,-140.14704,1692.786831,
+ -0,1,0,34.199757,-140.14704,1734.501295,
+ -0,1,0,29.712263,-140.14704,1681.41645,
+ -0,1,0,29.712263,-140.14704,1681.41645,
+ -0,1,0,34.199757,-140.14704,1734.501295,
+ -0,1,0,32.536728,-140.14704,1641.118092,
+ -0,1,0,32.536728,-140.14704,1641.118092,
+ -0,1,0,34.199757,-140.14704,1734.501295,
+ 0,1,0,47.236011,-140.14704,1633.261182,
+ 0,1,0,47.236011,-140.14704,1633.261182,
+ -0,1,0,34.199757,-140.14704,1734.501295,
+ -0,1,0,67.085244,-140.14704,1724.525612,
+ 0,1,0,47.236011,-140.14704,1633.261182,
+ -0,1,0,67.085244,-140.14704,1724.525612,
+ -0,1,0,60.120045,-140.14704,1622.687553,
+ -0,1,0,60.120045,-140.14704,1622.687553,
+ -0,1,0,67.085244,-140.14704,1724.525612,
+ -0,1,0,70.693703,-140.14704,1609.803543,
+ -0,1,0,70.693703,-140.14704,1609.803543,
+ -0,1,0,67.085244,-140.14704,1724.525612,
+ 0,1,0,97.392688,-140.14704,1708.32597,
+ -0,1,0,70.693703,-140.14704,1609.803543,
+ 0,1,0,97.392688,-140.14704,1708.32597,
+ 0,1,0,78.550645,-140.14704,1595.104277,
+ 0,1,0,78.550645,-140.14704,1595.104277,
+ 0,1,0,97.392688,-140.14704,1708.32597,
+ 0,1,0,83.388934,-140.14704,1579.15464,
+ 0,1,0,83.388934,-140.14704,1579.15464,
+ 0,1,0,97.392688,-140.14704,1708.32597,
+ 0,1,0,85.022636,-140.14704,1562.567568,
+ -0,1,0,-97.39249,-140.14704,1416.808977,
+ 0,1,0,-83.388736,-140.14704,1545.980306,
+ -0,1,0,-67.085047,-140.14704,1400.609334,
+ 0,1,0,-83.388736,-140.14704,1545.980306,
+ -0,1,0,-97.39249,-140.14704,1416.808977,
+ -0,1,0,-85.022439,-140.14704,1562.567379,
+ -0,1,0,-67.085047,-140.14704,1400.609334,
+ 0,1,0,-83.388736,-140.14704,1545.980306,
+ -0,1,0,-78.550447,-140.14704,1530.030669,
+ -0,1,0,-67.085047,-140.14704,1400.609334,
+ -0,1,0,-78.550447,-140.14704,1530.030669,
+ -0,1,0,-70.693505,-140.14704,1515.331404,
+ -0,1,0,-67.085047,-140.14704,1400.609334,
+ -0,1,0,-70.693505,-140.14704,1515.331404,
+ 0,1,0,-60.119847,-140.14704,1502.447394,
+ -0,1,0,-67.085047,-140.14704,1400.609334,
+ 0,1,0,-60.119847,-140.14704,1502.447394,
+ -0,1,0,-34.199559,-140.14704,1390.633652,
+ -0,1,0,-34.199559,-140.14704,1390.633652,
+ 0,1,0,-60.119847,-140.14704,1502.447394,
+ 0,1,0,-47.235814,-140.14704,1491.873764,
+ -0,1,0,-34.199559,-140.14704,1390.633652,
+ 0,1,0,-47.235814,-140.14704,1491.873764,
+ -0,1,0,-32.53653,-140.14704,1484.016855,
+ -0,1,0,-34.199559,-140.14704,1390.633652,
+ -0,1,0,-32.53653,-140.14704,1484.016855,
+ -0,1,0,0.000202,-140.14704,1387.26529,
+ -0,1,0,0.000202,-140.14704,1387.26529,
+ -0,1,0,-32.53653,-140.14704,1484.016855,
+ -0,1,0,-16.586883,-140.14704,1479.178602,
+ -0,1,0,0.000202,-140.14704,1387.26529,
+ -0,1,0,-16.586883,-140.14704,1479.178602,
+ -0,1,0,0.000193,-140.14704,1477.544936,
+ -0,1,0,0.000202,-140.14704,1387.26529,
+ -0,1,0,0.000193,-140.14704,1477.544936,
+ -0,1,0,16.587266,-140.14704,1479.178638,
+ -0,1,0,0.000202,-140.14704,1387.26529,
+ -0,1,0,16.587266,-140.14704,1479.178638,
+ -0,1,0,34.19996,-140.14704,1390.633692,
+ -0,1,0,34.19996,-140.14704,1390.633692,
+ -0,1,0,16.587266,-140.14704,1479.178638,
+ -0,1,0,32.536903,-140.14704,1484.016927,
+ -0,1,0,34.19996,-140.14704,1390.633692,
+ -0,1,0,32.536903,-140.14704,1484.016927,
+ -0,1,0,47.236168,-140.14704,1491.87387,
+ -0,1,0,34.19996,-140.14704,1390.633692,
+ -0,1,0,47.236168,-140.14704,1491.87387,
+ -0,1,0,67.085436,-140.14704,1400.609414,
+ -0,1,0,67.085436,-140.14704,1400.609414,
+ -0,1,0,47.236168,-140.14704,1491.87387,
+ -0,1,0,60.120178,-140.14704,1502.447527,
+ -0,1,0,67.085436,-140.14704,1400.609414,
+ -0,1,0,60.120178,-140.14704,1502.447527,
+ -0,1,0,70.693808,-140.14704,1515.331561,
+ -0,1,0,67.085436,-140.14704,1400.609414,
+ -0,1,0,70.693808,-140.14704,1515.331561,
+ 0,1,0,97.39286,-140.14704,1416.809092,
+ 0,1,0,97.39286,-140.14704,1416.809092,
+ -0,1,0,70.693808,-140.14704,1515.331561,
+ -0,1,0,78.550717,-140.14704,1530.030844,
+ 0,1,0,97.39286,-140.14704,1416.809092,
+ -0,1,0,78.550717,-140.14704,1530.030844,
+ 0,1,0,83.388971,-140.14704,1545.980492,
+ 0,1,0,97.39286,-140.14704,1416.809092,
+ 0,1,0,83.388971,-140.14704,1545.980492,
+ 0,1,0,85.022636,-140.14704,1562.567568,
+ 0,1,0,97.39286,-140.14704,1416.809092,
+ 0,1,0,85.022636,-140.14704,1562.567568,
+ 0,1,0,97.392688,-140.14704,1708.32597,
+ 0,1,0,97.39286,-140.14704,1416.809092,
+ 0,1,0,97.392688,-140.14704,1708.32597,
+ -0,1,0,123.957388,-140.14704,1686.524909,
+ 0,1,0,97.39286,-140.14704,1416.809092,
+ -0,1,0,123.957388,-140.14704,1686.524909,
+ -0,1,0,123.957535,-140.14704,1438.610184,
+ -0,1,0,123.957535,-140.14704,1438.610184,
+ -0,1,0,123.957388,-140.14704,1686.524909,
+ -0,1,0,145.75848,-140.14704,1659.960235,
+ -0,1,0,123.957535,-140.14704,1438.610184,
+ -0,1,0,145.75848,-140.14704,1659.960235,
+ -0,1,0,145.758595,-140.14704,1465.174884,
+ -0,1,0,145.758595,-140.14704,1465.174884,
+ -0,1,0,145.75848,-140.14704,1659.960235,
+ 0,1,0,161.958159,-140.14704,1629.65281,
+ -0,1,0,145.758595,-140.14704,1465.174884,
+ 0,1,0,161.958159,-140.14704,1629.65281,
+ 0,1,0,161.958238,-140.14704,1495.482328,
+ 0,1,0,161.958238,-140.14704,1495.482328,
+ 0,1,0,161.958159,-140.14704,1629.65281,
+ -0,1,0,171.93388,-140.14704,1596.767334,
+ 0,1,0,161.958238,-140.14704,1495.482328,
+ -0,1,0,171.93388,-140.14704,1596.767334,
+ -0,1,0,171.93392,-140.14704,1528.367816,
+ -0,1,0,171.93392,-140.14704,1528.367816,
+ -0,1,0,171.93388,-140.14704,1596.767334,
+ -0,1,0,175.302282,-140.14704,1562.567577,
+ -0,1,0,-32.536705,-140.14704,1641.118019,
+ 0,1,0,-27.450503,-140.14704,1670.046016,
+ -0,1,0,-16.587068,-140.14704,1645.956308,
+ 0,1,0,-27.450503,-140.14704,1670.046016,
+ -0,1,0,-32.536705,-140.14704,1641.118019,
+ -0,1,0,-29.712222,-140.14704,1681.416397,
+ -0,1,0,-16.587068,-140.14704,1645.956308,
+ 0,1,0,-27.450503,-140.14704,1670.046016,
+ 0,1,0,-21.00969,-140.14704,1660.406677,
+ -0,1,0,-16.587068,-140.14704,1645.956308,
+ 0,1,0,-21.00969,-140.14704,1660.406677,
+ -0,1,0,-11.370339,-140.14704,1653.965881,
+ -0,1,0,-16.587068,-140.14704,1645.956308,
+ -0,1,0,-11.370339,-140.14704,1653.965881,
+ 0,1,0,0.000004,-140.14704,1647.590011,
+ 0,1,0,0.000004,-140.14704,1647.590011,
+ -0,1,0,-11.370339,-140.14704,1653.965881,
+ 0,1,0,0.000046,-140.14704,1651.704181,
+ 0,1,0,0.000004,-140.14704,1647.590011,
+ 0,1,0,0.000046,-140.14704,1651.704181,
+ -0,1,0,16.58708,-140.14704,1645.956345,
+ -0,1,0,16.58708,-140.14704,1645.956345,
+ 0,1,0,0.000046,-140.14704,1651.704181,
+ -0,1,0,11.370427,-140.14704,1653.965901,
+ -0,1,0,16.58708,-140.14704,1645.956345,
+ -0,1,0,11.370427,-140.14704,1653.965901,
+ -0,1,0,21.009767,-140.14704,1660.406714,
+ -0,1,0,16.58708,-140.14704,1645.956345,
+ -0,1,0,21.009767,-140.14704,1660.406714,
+ -0,1,0,32.536728,-140.14704,1641.118092,
+ -0,1,0,32.536728,-140.14704,1641.118092,
+ -0,1,0,21.009767,-140.14704,1660.406714,
+ -0,1,0,27.450563,-140.14704,1670.046065,
+ -0,1,0,32.536728,-140.14704,1641.118092,
+ -0,1,0,27.450563,-140.14704,1670.046065,
+ -0,1,0,29.712263,-140.14704,1681.41645,
+ -0.162804,-0,0.986659,-34.199762,-140.14704,1734.501255,
+ -0.032813,-0,0.999461,-0.000005,-327.00976,1737.869657,
+ 0.032812,0,0.999462,-0.000005,-140.14704,1737.869657,
+ -0.032813,-0,0.999461,-0.000005,-327.00976,1737.869657,
+ -0.162804,-0,0.986659,-34.199762,-140.14704,1734.501255,
+ -0.227168,-0,0.973856,-34.199762,-327.00976,1734.501255,
+ 0.812791,0,0.582555,-70.693505,-301.60976,1515.331404,
+ 0.729927,0,0.683525,-60.119847,-327.00976,1502.447394,
+ 0.683523,0,0.729929,-60.119847,-301.60976,1502.447394,
+ 0.729927,0,0.683525,-60.119847,-327.00976,1502.447394,
+ 0.812791,0,0.582555,-70.693505,-301.60976,1515.331404,
+ 0.849251,0,0.527989,-70.693505,-327.00976,1515.331404,
+ 0,-1,0,-83.388736,-301.60976,1545.980306,
+ 0,-1,0,-83.388773,-301.60976,1579.154455,
+ 0,-1,0,-85.022439,-301.60976,1562.567379,
+ 0,-1,0,-83.388773,-301.60976,1579.154455,
+ 0,-1,0,-83.388736,-301.60976,1545.980306,
+ 0,-1,0,-78.55052,-301.60976,1595.104103,
+ 0,-1,0,-78.55052,-301.60976,1595.104103,
+ 0,-1,0,-83.388736,-301.60976,1545.980306,
+ 0,-1,-0,-78.550447,-301.60976,1530.030669,
+ 0,-1,0,-78.55052,-301.60976,1595.104103,
+ 0,-1,-0,-78.550447,-301.60976,1530.030669,
+ 0,-1,-0,-70.69361,-301.60976,1609.803386,
+ 0,-1,-0,-70.69361,-301.60976,1609.803386,
+ 0,-1,-0,-78.550447,-301.60976,1530.030669,
+ -0,-1,-0,-70.693505,-301.60976,1515.331404,
+ 0,-1,-0,-70.69361,-301.60976,1609.803386,
+ -0,-1,-0,-70.693505,-301.60976,1515.331404,
+ -0,-1,-0,-60.119981,-301.60976,1622.687419,
+ -0,-1,-0,-60.119981,-301.60976,1622.687419,
+ -0,-1,-0,-70.693505,-301.60976,1515.331404,
+ -0,-1,-0,-60.119847,-301.60976,1502.447394,
+ -0,-1,-0,-60.119981,-301.60976,1622.687419,
+ -0,-1,-0,-60.119847,-301.60976,1502.447394,
+ 0,-1,-0,-47.235971,-301.60976,1633.261077,
+ 0,-1,-0,-47.235971,-301.60976,1633.261077,
+ -0,-1,-0,-60.119847,-301.60976,1502.447394,
+ -0,-1,-0,-47.235814,-301.60976,1491.873764,
+ 0,-1,-0,-47.235971,-301.60976,1633.261077,
+ -0,-1,-0,-47.235814,-301.60976,1491.873764,
+ 0,-1,-0,-32.536705,-301.60976,1641.118019,
+ 0,-1,-0,-32.536705,-301.60976,1641.118019,
+ -0,-1,-0,-47.235814,-301.60976,1491.873764,
+ 0,-1,-0,-32.53653,-301.60976,1484.016855,
+ 0,-1,-0,-32.536705,-301.60976,1641.118019,
+ 0,-1,-0,-32.53653,-301.60976,1484.016855,
+ 0,-1,-0,-16.587068,-301.60976,1645.956308,
+ 0,-1,-0,-16.587068,-301.60976,1645.956308,
+ 0,-1,-0,-32.53653,-301.60976,1484.016855,
+ 0,-1,-0,-16.586883,-301.60976,1479.178602,
+ 0,-1,-0,-16.587068,-301.60976,1645.956308,
+ 0,-1,-0,-16.586883,-301.60976,1479.178602,
+ -0,-1,-0,0.000004,-301.60976,1647.590011,
+ -0,-1,-0,0.000004,-301.60976,1647.590011,
+ 0,-1,-0,-16.586883,-301.60976,1479.178602,
+ -0,-1,-0,0.000193,-301.60976,1477.544936,
+ -0,-1,-0,0.000004,-301.60976,1647.590011,
+ -0,-1,-0,0.000193,-301.60976,1477.544936,
+ -0,-1,-0,16.58708,-301.60976,1645.956345,
+ -0,-1,-0,16.58708,-301.60976,1645.956345,
+ -0,-1,-0,0.000193,-301.60976,1477.544936,
+ 0,-1,-0,16.587266,-301.60976,1479.178638,
+ -0,-1,-0,16.58708,-301.60976,1645.956345,
+ 0,-1,-0,16.587266,-301.60976,1479.178638,
+ -0,-1,-0,32.536728,-301.60976,1641.118092,
+ -0,-1,-0,32.536728,-301.60976,1641.118092,
+ 0,-1,-0,16.587266,-301.60976,1479.178638,
+ 0,-1,-0,32.536903,-301.60976,1484.016927,
+ -0,-1,-0,32.536728,-301.60976,1641.118092,
+ 0,-1,-0,32.536903,-301.60976,1484.016927,
+ -0,-1,-0,47.236011,-301.60976,1633.261182,
+ -0,-1,-0,47.236011,-301.60976,1633.261182,
+ 0,-1,-0,32.536903,-301.60976,1484.016927,
+ 0,-1,-0,47.236168,-301.60976,1491.87387,
+ -0,-1,-0,47.236011,-301.60976,1633.261182,
+ 0,-1,-0,47.236168,-301.60976,1491.87387,
+ 0,-1,-0,60.120045,-301.60976,1622.687553,
+ 0,-1,-0,60.120045,-301.60976,1622.687553,
+ 0,-1,-0,47.236168,-301.60976,1491.87387,
+ 0,-1,-0,60.120178,-301.60976,1502.447527,
+ 0,-1,-0,60.120045,-301.60976,1622.687553,
+ 0,-1,-0,60.120178,-301.60976,1502.447527,
+ 0,-1,-0,70.693703,-301.60976,1609.803543,
+ 0,-1,-0,70.693703,-301.60976,1609.803543,
+ 0,-1,-0,60.120178,-301.60976,1502.447527,
+ 0,-1,-0,70.693808,-301.60976,1515.331561,
+ 0,-1,-0,70.693703,-301.60976,1609.803543,
+ 0,-1,-0,70.693808,-301.60976,1515.331561,
+ -0,-1,-0,78.550645,-301.60976,1595.104277,
+ -0,-1,-0,78.550645,-301.60976,1595.104277,
+ 0,-1,-0,70.693808,-301.60976,1515.331561,
+ 0,-1,-0,78.550717,-301.60976,1530.030844,
+ -0,-1,-0,78.550645,-301.60976,1595.104277,
+ 0,-1,-0,78.550717,-301.60976,1530.030844,
+ -0,-1,-0,83.388934,-301.60976,1579.15464,
+ -0,-1,-0,83.388934,-301.60976,1579.15464,
+ 0,-1,-0,78.550717,-301.60976,1530.030844,
+ -0,-1,-0,83.388971,-301.60976,1545.980492,
+ -0,-1,-0,83.388934,-301.60976,1579.15464,
+ -0,-1,-0,83.388971,-301.60976,1545.980492,
+ -0,-1,-0,85.022636,-301.60976,1562.567568,
+ 0.973855,0,0.227169,-83.388736,-301.60976,1545.980306,
+ 0.935939,0,0.352163,-78.550447,-327.00976,1530.030669,
+ 0.910825,0,0.412793,-78.550447,-301.60976,1530.030669,
+ 0.935939,0,0.352163,-78.550447,-327.00976,1530.030669,
+ 0.973855,0,0.227169,-83.388736,-301.60976,1545.980306,
+ 0.986658,0,0.162804,-83.388736,-327.00976,1545.980306,
+ 0.582555,0,-0.812791,-47.235971,-327.00976,1633.261077,
+ 0.707108,0,-0.707106,-60.119981,-301.60976,1622.687419,
+ 0.527989,0,-0.849251,-47.235971,-301.60976,1633.261077,
+ 0.707108,0,-0.707106,-60.119981,-301.60976,1622.687419,
+ 0.582555,0,-0.812791,-47.235971,-327.00976,1633.261077,
+ 0.707108,0,-0.707106,-60.119981,-327.00976,1622.687419,
+ 0.999461,0,0.032814,-85.022439,-301.60976,1562.567379,
+ 0.986658,0,0.162804,-83.388736,-327.00976,1545.980306,
+ 0.973855,0,0.227169,-83.388736,-301.60976,1545.980306,
+ 0.986658,0,0.162804,-83.388736,-327.00976,1545.980306,
+ 0.999461,0,0.032814,-85.022439,-301.60976,1562.567379,
+ 0.999462,0,-0.032812,-85.022439,-327.00976,1562.567379,
+ 0.412793,0,-0.910825,-32.536705,-327.00976,1641.118019,
+ 0.527989,0,-0.849251,-47.235971,-301.60976,1633.261077,
+ 0.352163,0,-0.935939,-32.536705,-301.60976,1641.118019,
+ 0.527989,0,-0.849251,-47.235971,-301.60976,1633.261077,
+ 0.412793,0,-0.910825,-32.536705,-327.00976,1641.118019,
+ 0.582555,0,-0.812791,-47.235971,-327.00976,1633.261077,
+ 0.935939,0,-0.352161,-78.55052,-301.60976,1595.104103,
+ 0.973856,0,-0.227166,-83.388773,-327.00976,1579.154455,
+ 0.986659,0,-0.162802,-83.388773,-301.60976,1579.154455,
+ 0.973856,0,-0.227166,-83.388773,-327.00976,1579.154455,
+ 0.935939,0,-0.352161,-78.55052,-301.60976,1595.104103,
+ 0.910826,0,-0.412791,-78.55052,-327.00976,1595.104103,
+ -0.582555,-0,0.812791,47.236168,-165.54704,1491.87387,
+ -0.683525,-0,0.729927,60.120178,-140.14704,1502.447527,
+ -0.527989,-0,0.849251,47.236168,-140.14704,1491.87387,
+ -0.683525,-0,0.729927,60.120178,-140.14704,1502.447527,
+ -0.582555,-0,0.812791,47.236168,-165.54704,1491.87387,
+ -0.729929,-0,0.683523,60.120178,-165.54704,1502.447527,
+ -0.729929,-0,0.683523,60.120178,-165.54704,1502.447527,
+ -0.812793,-0,0.582553,70.693808,-140.14704,1515.331561,
+ -0.683525,-0,0.729927,60.120178,-140.14704,1502.447527,
+ -0.812793,-0,0.582553,70.693808,-140.14704,1515.331561,
+ -0.729929,-0,0.683523,60.120178,-165.54704,1502.447527,
+ -0.849252,-0,0.527987,70.693808,-165.54704,1515.331561,
+ -0.849252,-0,0.527987,70.693808,-165.54704,1515.331561,
+ -0.910826,-0,0.412791,78.550717,-140.14704,1530.030844,
+ -0.812793,-0,0.582553,70.693808,-140.14704,1515.331561,
+ -0.910826,-0,0.412791,78.550717,-140.14704,1530.030844,
+ -0.849252,-0,0.527987,70.693808,-165.54704,1515.331561,
+ -0.935939,-0,0.352161,78.550717,-165.54704,1530.030844,
+ -0,-1,-0,-97.39249,-327.00976,1416.808977,
+ -0,-1,-0,-83.388736,-327.00976,1545.980306,
+ -0,-1,-0,-85.022439,-327.00976,1562.567379,
+ -0,-1,-0,-83.388736,-327.00976,1545.980306,
+ -0,-1,-0,-97.39249,-327.00976,1416.808977,
+ 0,-1,-0,-67.085047,-327.00976,1400.609334,
+ -0,-1,-0,-83.388736,-327.00976,1545.980306,
+ 0,-1,-0,-67.085047,-327.00976,1400.609334,
+ 0,-1,-0,-78.550447,-327.00976,1530.030669,
+ 0,-1,-0,-78.550447,-327.00976,1530.030669,
+ 0,-1,-0,-67.085047,-327.00976,1400.609334,
+ 0,-1,-0,-70.693505,-327.00976,1515.331404,
+ 0,-1,-0,-70.693505,-327.00976,1515.331404,
+ 0,-1,-0,-67.085047,-327.00976,1400.609334,
+ -0,-1,-0,-60.119847,-327.00976,1502.447394,
+ -0,-1,-0,-60.119847,-327.00976,1502.447394,
+ 0,-1,-0,-67.085047,-327.00976,1400.609334,
+ 0,-1,-0,-34.199559,-327.00976,1390.633652,
+ -0,-1,-0,-60.119847,-327.00976,1502.447394,
+ 0,-1,-0,-34.199559,-327.00976,1390.633652,
+ -0,-1,-0,-47.235814,-327.00976,1491.873764,
+ -0,-1,-0,-47.235814,-327.00976,1491.873764,
+ 0,-1,-0,-34.199559,-327.00976,1390.633652,
+ 0,-1,-0,-32.53653,-327.00976,1484.016855,
+ 0,-1,-0,-32.53653,-327.00976,1484.016855,
+ 0,-1,-0,-34.199559,-327.00976,1390.633652,
+ 0,-1,-0,0.000202,-327.00976,1387.26529,
+ 0,-1,-0,-32.53653,-327.00976,1484.016855,
+ 0,-1,-0,0.000202,-327.00976,1387.26529,
+ 0,-1,-0,-16.586883,-327.00976,1479.178602,
+ 0,-1,-0,-16.586883,-327.00976,1479.178602,
+ 0,-1,-0,0.000202,-327.00976,1387.26529,
+ 0,-1,-0,0.000193,-327.00976,1477.544936,
+ 0,-1,-0,0.000193,-327.00976,1477.544936,
+ 0,-1,-0,0.000202,-327.00976,1387.26529,
+ 0,-1,-0,16.587266,-327.00976,1479.178638,
+ 0,-1,-0,16.587266,-327.00976,1479.178638,
+ 0,-1,-0,0.000202,-327.00976,1387.26529,
+ 0,-1,-0,34.19996,-327.00976,1390.633692,
+ 0,-1,-0,16.587266,-327.00976,1479.178638,
+ 0,-1,-0,34.19996,-327.00976,1390.633692,
+ 0,-1,-0,32.536903,-327.00976,1484.016927,
+ 0,-1,-0,32.536903,-327.00976,1484.016927,
+ 0,-1,-0,34.19996,-327.00976,1390.633692,
+ 0,-1,-0,47.236168,-327.00976,1491.87387,
+ 0,-1,-0,47.236168,-327.00976,1491.87387,
+ 0,-1,-0,34.19996,-327.00976,1390.633692,
+ 0,-1,-0,67.085436,-327.00976,1400.609414,
+ 0,-1,-0,47.236168,-327.00976,1491.87387,
+ 0,-1,-0,67.085436,-327.00976,1400.609414,
+ 0,-1,-0,60.120178,-327.00976,1502.447527,
+ 0,-1,-0,60.120178,-327.00976,1502.447527,
+ 0,-1,-0,67.085436,-327.00976,1400.609414,
+ 0,-1,-0,70.693808,-327.00976,1515.331561,
+ 0,-1,-0,70.693808,-327.00976,1515.331561,
+ 0,-1,-0,67.085436,-327.00976,1400.609414,
+ -0,-1,-0,97.39286,-327.00976,1416.809092,
+ 0,-1,-0,70.693808,-327.00976,1515.331561,
+ -0,-1,-0,97.39286,-327.00976,1416.809092,
+ 0,-1,-0,78.550717,-327.00976,1530.030844,
+ 0,-1,-0,78.550717,-327.00976,1530.030844,
+ -0,-1,-0,97.39286,-327.00976,1416.809092,
+ -0,-1,-0,83.388971,-327.00976,1545.980492,
+ -0,-1,-0,83.388971,-327.00976,1545.980492,
+ -0,-1,-0,97.39286,-327.00976,1416.809092,
+ -0,-1,-0,85.022636,-327.00976,1562.567568,
+ -0,-1,-0,85.022636,-327.00976,1562.567568,
+ -0,-1,-0,97.39286,-327.00976,1416.809092,
+ -0,-1,-0,97.392688,-327.00976,1708.32597,
+ -0,-1,-0,97.392688,-327.00976,1708.32597,
+ -0,-1,-0,97.39286,-327.00976,1416.809092,
+ 0,-1,-0,123.957388,-327.00976,1686.524909,
+ 0,-1,-0,123.957388,-327.00976,1686.524909,
+ -0,-1,-0,97.39286,-327.00976,1416.809092,
+ 0,-1,-0,123.957535,-327.00976,1438.610184,
+ 0,-1,-0,123.957388,-327.00976,1686.524909,
+ 0,-1,-0,123.957535,-327.00976,1438.610184,
+ 0,-1,-0,145.75848,-327.00976,1659.960235,
+ 0,-1,-0,145.75848,-327.00976,1659.960235,
+ 0,-1,-0,123.957535,-327.00976,1438.610184,
+ 0,-1,-0,145.758595,-327.00976,1465.174884,
+ 0,-1,-0,145.75848,-327.00976,1659.960235,
+ 0,-1,-0,145.758595,-327.00976,1465.174884,
+ 0,-1,-0,161.958159,-327.00976,1629.65281,
+ 0,-1,-0,161.958159,-327.00976,1629.65281,
+ 0,-1,-0,145.758595,-327.00976,1465.174884,
+ -0,-1,-0,161.958238,-327.00976,1495.482328,
+ 0,-1,-0,161.958159,-327.00976,1629.65281,
+ -0,-1,-0,161.958238,-327.00976,1495.482328,
+ -0,-1,-0,171.93388,-327.00976,1596.767334,
+ -0,-1,-0,171.93388,-327.00976,1596.767334,
+ -0,-1,-0,161.958238,-327.00976,1495.482328,
+ -0,-1,-0,171.93392,-327.00976,1528.367816,
+ -0,-1,-0,171.93388,-327.00976,1596.767334,
+ -0,-1,-0,171.93392,-327.00976,1528.367816,
+ 0,-1,0,175.302282,-327.00976,1562.567577,
+ 0,-1,-0,-171.933682,-327.00976,1528.367612,
+ 0,-1,-0,-171.933723,-327.00976,1596.767131,
+ 0,-1,-0,-175.302085,-327.00976,1562.56737,
+ 0,-1,-0,-171.933723,-327.00976,1596.767131,
+ 0,-1,-0,-171.933682,-327.00976,1528.367612,
+ -0,-1,-0,-161.95804,-327.00976,1629.652619,
+ -0,-1,-0,-161.95804,-327.00976,1629.652619,
+ 0,-1,-0,-171.933682,-327.00976,1528.367612,
+ -0,-1,-0,-161.957961,-327.00976,1495.482136,
+ -0,-1,-0,-161.95804,-327.00976,1629.652619,
+ -0,-1,-0,-161.957961,-327.00976,1495.482136,
+ 0,-1,-0,-145.758398,-327.00976,1659.960062,
+ 0,-1,-0,-145.758398,-327.00976,1659.960062,
+ -0,-1,-0,-161.957961,-327.00976,1495.482136,
+ 0,-1,-0,-145.758282,-327.00976,1465.174712,
+ 0,-1,-0,-145.758398,-327.00976,1659.960062,
+ 0,-1,-0,-145.758282,-327.00976,1465.174712,
+ 0,-1,-0,-123.957337,-327.00976,1686.524763,
+ 0,-1,-0,-123.957337,-327.00976,1686.524763,
+ 0,-1,-0,-145.758282,-327.00976,1465.174712,
+ 0,-1,-0,-123.957191,-327.00976,1438.610037,
+ 0,-1,-0,-123.957337,-327.00976,1686.524763,
+ 0,-1,-0,-123.957191,-327.00976,1438.610037,
+ 0,-1,-0,-97.392662,-327.00976,1708.325854,
+ 0,-1,-0,-97.392662,-327.00976,1708.325854,
+ 0,-1,-0,-123.957191,-327.00976,1438.610037,
+ -0,-1,-0,-97.39249,-327.00976,1416.808977,
+ 0,-1,-0,-97.392662,-327.00976,1708.325854,
+ -0,-1,-0,-97.39249,-327.00976,1416.808977,
+ -0,-1,-0,-85.022439,-327.00976,1562.567379,
+ 0,-1,-0,-97.392662,-327.00976,1708.325854,
+ -0,-1,-0,-85.022439,-327.00976,1562.567379,
+ 0,-1,-0,-83.388773,-327.00976,1579.154455,
+ 0,-1,-0,-97.392662,-327.00976,1708.325854,
+ 0,-1,-0,-83.388773,-327.00976,1579.154455,
+ 0,-1,-0,-67.085238,-327.00976,1724.525533,
+ 0,-1,-0,-67.085238,-327.00976,1724.525533,
+ 0,-1,-0,-83.388773,-327.00976,1579.154455,
+ 0,-1,-0,-78.55052,-327.00976,1595.104103,
+ 0,-1,-0,-67.085238,-327.00976,1724.525533,
+ 0,-1,-0,-78.55052,-327.00976,1595.104103,
+ -0,-1,-0,-70.69361,-327.00976,1609.803386,
+ 0,-1,-0,-67.085238,-327.00976,1724.525533,
+ -0,-1,-0,-70.69361,-327.00976,1609.803386,
+ -0,-1,-0,-60.119981,-327.00976,1622.687419,
+ 0,-1,-0,-67.085238,-327.00976,1724.525533,
+ -0,-1,-0,-60.119981,-327.00976,1622.687419,
+ 0,-1,-0,-34.199762,-327.00976,1734.501255,
+ 0,-1,-0,-34.199762,-327.00976,1734.501255,
+ -0,-1,-0,-60.119981,-327.00976,1622.687419,
+ 0,-1,-0,-47.235971,-327.00976,1633.261077,
+ 0,-1,-0,-34.199762,-327.00976,1734.501255,
+ 0,-1,-0,-47.235971,-327.00976,1633.261077,
+ 0,-1,-0,-32.536705,-327.00976,1641.118019,
+ 0,-1,-0,-34.199762,-327.00976,1734.501255,
+ 0,-1,-0,-32.536705,-327.00976,1641.118019,
+ 0,-1,-0,-0.000005,-327.00976,1737.869657,
+ 0,-1,-0,-0.000005,-327.00976,1737.869657,
+ 0,-1,-0,-32.536705,-327.00976,1641.118019,
+ 0,-1,-0,-16.587068,-327.00976,1645.956308,
+ 0,-1,-0,-0.000005,-327.00976,1737.869657,
+ 0,-1,-0,-16.587068,-327.00976,1645.956308,
+ -0,-1,-0,0.000004,-327.00976,1647.590011,
+ 0,-1,-0,-0.000005,-327.00976,1737.869657,
+ -0,-1,-0,0.000004,-327.00976,1647.590011,
+ -0,-1,-0,34.199757,-327.00976,1734.501295,
+ -0,-1,-0,34.199757,-327.00976,1734.501295,
+ -0,-1,-0,0.000004,-327.00976,1647.590011,
+ -0,-1,-0,16.58708,-327.00976,1645.956345,
+ -0,-1,-0,34.199757,-327.00976,1734.501295,
+ -0,-1,-0,16.58708,-327.00976,1645.956345,
+ -0,-1,-0,32.536728,-327.00976,1641.118092,
+ -0,-1,-0,34.199757,-327.00976,1734.501295,
+ -0,-1,-0,32.536728,-327.00976,1641.118092,
+ -0,-1,-0,47.236011,-327.00976,1633.261182,
+ -0,-1,-0,34.199757,-327.00976,1734.501295,
+ -0,-1,-0,47.236011,-327.00976,1633.261182,
+ 0,-1,-0,67.085244,-327.00976,1724.525612,
+ 0,-1,-0,67.085244,-327.00976,1724.525612,
+ -0,-1,-0,47.236011,-327.00976,1633.261182,
+ 0,-1,-0,60.120045,-327.00976,1622.687553,
+ 0,-1,-0,67.085244,-327.00976,1724.525612,
+ 0,-1,-0,60.120045,-327.00976,1622.687553,
+ 0,-1,-0,70.693703,-327.00976,1609.803543,
+ 0,-1,-0,67.085244,-327.00976,1724.525612,
+ 0,-1,-0,70.693703,-327.00976,1609.803543,
+ -0,-1,-0,97.392688,-327.00976,1708.32597,
+ -0,-1,-0,97.392688,-327.00976,1708.32597,
+ 0,-1,-0,70.693703,-327.00976,1609.803543,
+ -0,-1,-0,78.550645,-327.00976,1595.104277,
+ -0,-1,-0,97.392688,-327.00976,1708.32597,
+ -0,-1,-0,78.550645,-327.00976,1595.104277,
+ -0,-1,-0,83.388934,-327.00976,1579.15464,
+ -0,-1,-0,97.392688,-327.00976,1708.32597,
+ -0,-1,-0,83.388934,-327.00976,1579.15464,
+ -0,-1,-0,85.022636,-327.00976,1562.567568,
+ 0,1,0,-83.388773,-165.54704,1579.154455,
+ 0,1,0,-83.388736,-165.54704,1545.980306,
+ 0,1,0,-85.022439,-165.54704,1562.567379,
+ 0,1,0,-83.388736,-165.54704,1545.980306,
+ 0,1,0,-83.388773,-165.54704,1579.154455,
+ 0,1,0,-78.55052,-165.54704,1595.104103,
+ 0,1,0,-83.388736,-165.54704,1545.980306,
+ 0,1,0,-78.55052,-165.54704,1595.104103,
+ 0,1,0,-78.550447,-165.54704,1530.030669,
+ 0,1,0,-78.550447,-165.54704,1530.030669,
+ 0,1,0,-78.55052,-165.54704,1595.104103,
+ 0,1,0,-70.69361,-165.54704,1609.803386,
+ 0,1,0,-78.550447,-165.54704,1530.030669,
+ 0,1,0,-70.69361,-165.54704,1609.803386,
+ -0,1,0,-70.693505,-165.54704,1515.331404,
+ -0,1,0,-70.693505,-165.54704,1515.331404,
+ 0,1,0,-70.69361,-165.54704,1609.803386,
+ -0,1,0,-60.119981,-165.54704,1622.687419,
+ -0,1,0,-70.693505,-165.54704,1515.331404,
+ -0,1,0,-60.119981,-165.54704,1622.687419,
+ 0,1,0,-60.119847,-165.54704,1502.447394,
+ 0,1,0,-60.119847,-165.54704,1502.447394,
+ -0,1,0,-60.119981,-165.54704,1622.687419,
+ -0,1,0,-47.235971,-165.54704,1633.261077,
+ 0,1,0,-60.119847,-165.54704,1502.447394,
+ -0,1,0,-47.235971,-165.54704,1633.261077,
+ 0,1,0,-47.235814,-165.54704,1491.873764,
+ 0,1,0,-47.235814,-165.54704,1491.873764,
+ -0,1,0,-47.235971,-165.54704,1633.261077,
+ -0,1,0,-32.536705,-165.54704,1641.118019,
+ 0,1,0,-47.235814,-165.54704,1491.873764,
+ -0,1,0,-32.536705,-165.54704,1641.118019,
+ -0,1,0,-32.53653,-165.54704,1484.016855,
+ -0,1,0,-32.53653,-165.54704,1484.016855,
+ -0,1,0,-32.536705,-165.54704,1641.118019,
+ -0,1,0,-16.587068,-165.54704,1645.956308,
+ -0,1,0,-32.53653,-165.54704,1484.016855,
+ -0,1,0,-16.587068,-165.54704,1645.956308,
+ -0,1,0,-16.586883,-165.54704,1479.178602,
+ -0,1,0,-16.586883,-165.54704,1479.178602,
+ -0,1,0,-16.587068,-165.54704,1645.956308,
+ -0,1,0,0.000004,-165.54704,1647.590011,
+ -0,1,0,-16.586883,-165.54704,1479.178602,
+ -0,1,0,0.000004,-165.54704,1647.590011,
+ 0,1,0,0.000193,-165.54704,1477.544936,
+ 0,1,0,0.000193,-165.54704,1477.544936,
+ -0,1,0,0.000004,-165.54704,1647.590011,
+ 0,1,0,16.58708,-165.54704,1645.956345,
+ 0,1,0,0.000193,-165.54704,1477.544936,
+ 0,1,0,16.58708,-165.54704,1645.956345,
+ -0,1,0,16.587266,-165.54704,1479.178638,
+ -0,1,0,16.587266,-165.54704,1479.178638,
+ 0,1,0,16.58708,-165.54704,1645.956345,
+ 0,1,0,32.536728,-165.54704,1641.118092,
+ -0,1,0,16.587266,-165.54704,1479.178638,
+ 0,1,0,32.536728,-165.54704,1641.118092,
+ -0,1,0,32.536903,-165.54704,1484.016927,
+ -0,1,0,32.536903,-165.54704,1484.016927,
+ 0,1,0,32.536728,-165.54704,1641.118092,
+ 0,1,0,47.236011,-165.54704,1633.261182,
+ -0,1,0,32.536903,-165.54704,1484.016927,
+ 0,1,0,47.236011,-165.54704,1633.261182,
+ -0,1,0,47.236168,-165.54704,1491.87387,
+ -0,1,0,47.236168,-165.54704,1491.87387,
+ 0,1,0,47.236011,-165.54704,1633.261182,
+ -0,1,0,60.120045,-165.54704,1622.687553,
+ -0,1,0,47.236168,-165.54704,1491.87387,
+ -0,1,0,60.120045,-165.54704,1622.687553,
+ -0,1,0,60.120178,-165.54704,1502.447527,
+ -0,1,0,60.120178,-165.54704,1502.447527,
+ -0,1,0,60.120045,-165.54704,1622.687553,
+ -0,1,0,70.693703,-165.54704,1609.803543,
+ -0,1,0,60.120178,-165.54704,1502.447527,
+ -0,1,0,70.693703,-165.54704,1609.803543,
+ -0,1,0,70.693808,-165.54704,1515.331561,
+ -0,1,0,70.693808,-165.54704,1515.331561,
+ -0,1,0,70.693703,-165.54704,1609.803543,
+ 0,1,0,78.550645,-165.54704,1595.104277,
+ -0,1,0,70.693808,-165.54704,1515.331561,
+ 0,1,0,78.550645,-165.54704,1595.104277,
+ -0,1,0,78.550717,-165.54704,1530.030844,
+ -0,1,0,78.550717,-165.54704,1530.030844,
+ 0,1,0,78.550645,-165.54704,1595.104277,
+ 0,1,0,83.388934,-165.54704,1579.15464,
+ -0,1,0,78.550717,-165.54704,1530.030844,
+ 0,1,0,83.388934,-165.54704,1579.15464,
+ 0,1,0,83.388971,-165.54704,1545.980492,
+ 0,1,0,83.388971,-165.54704,1545.980492,
+ 0,1,0,83.388934,-165.54704,1579.15464,
+ 0,1,0,85.022636,-165.54704,1562.567568,
+ -0.032814,-0,0.999461,0.000193,-140.14704,1477.544936,
+ -0.162804,-0,0.986658,16.587266,-165.54704,1479.178638,
+ -0.227169,-0,0.973855,16.587266,-140.14704,1479.178638,
+ -0.162804,-0,0.986658,16.587266,-165.54704,1479.178638,
+ -0.032814,-0,0.999461,0.000193,-140.14704,1477.544936,
+ 0.032812,0,0.999462,0.000193,-165.54704,1477.544936,
+ -0.227169,-0,0.973855,16.587266,-140.14704,1479.178638,
+ -0.382684,-0,0.923879,32.536903,-165.54704,1484.016927,
+ -0.382684,-0,0.923879,32.536903,-140.14704,1484.016927,
+ -0.382684,-0,0.923879,32.536903,-165.54704,1484.016927,
+ -0.227169,-0,0.973855,16.587266,-140.14704,1479.178638,
+ -0.162804,-0,0.986658,16.587266,-165.54704,1479.178638,
+ -0.382684,-0,0.923879,32.536903,-165.54704,1484.016927,
+ -0.527989,-0,0.849251,47.236168,-140.14704,1491.87387,
+ -0.382684,-0,0.923879,32.536903,-140.14704,1484.016927,
+ -0.527989,-0,0.849251,47.236168,-140.14704,1491.87387,
+ -0.382684,-0,0.923879,32.536903,-165.54704,1484.016927,
+ -0.582555,-0,0.812791,47.236168,-165.54704,1491.87387,
+ -0.935939,-0,0.352161,78.550717,-165.54704,1530.030844,
+ -0.973856,-0,0.227166,83.388971,-140.14704,1545.980492,
+ -0.910826,-0,0.412791,78.550717,-140.14704,1530.030844,
+ -0.973856,-0,0.227166,83.388971,-140.14704,1545.980492,
+ -0.935939,-0,0.352161,78.550717,-165.54704,1530.030844,
+ -0.986659,-0,0.162802,83.388971,-165.54704,1545.980492,
+ -0.986659,-0,0.162802,83.388971,-165.54704,1545.980492,
+ -0.999462,-0,0.032812,85.022636,-140.14704,1562.567568,
+ -0.973856,-0,0.227166,83.388971,-140.14704,1545.980492,
+ -0.999462,-0,0.032812,85.022636,-140.14704,1562.567568,
+ -0.986659,-0,0.162802,83.388971,-165.54704,1545.980492,
+ -0.999461,-0,-0.032814,85.022636,-165.54704,1562.567568,
+ -0.999461,-0,-0.032814,85.022636,-165.54704,1562.567568,
+ -0.986658,-0,-0.162804,83.388934,-140.14704,1579.15464,
+ -0.999462,-0,0.032812,85.022636,-140.14704,1562.567568,
+ -0.986658,-0,-0.162804,83.388934,-140.14704,1579.15464,
+ -0.999461,-0,-0.032814,85.022636,-165.54704,1562.567568,
+ -0.973855,-0,-0.227169,83.388934,-165.54704,1579.15464,
+ -0.973855,-0,-0.227169,83.388934,-165.54704,1579.15464,
+ -0.935939,-0,-0.352163,78.550645,-140.14704,1595.104277,
+ -0.986658,-0,-0.162804,83.388934,-140.14704,1579.15464,
+ -0.935939,-0,-0.352163,78.550645,-140.14704,1595.104277,
+ -0.973855,-0,-0.227169,83.388934,-165.54704,1579.15464,
+ -0.910825,-0,-0.412793,78.550645,-165.54704,1595.104277,
+ -0.910825,-0,-0.412793,78.550645,-165.54704,1595.104277,
+ -0.849251,-0,-0.527989,70.693703,-140.14704,1609.803543,
+ -0.935939,-0,-0.352163,78.550645,-140.14704,1595.104277,
+ -0.849251,-0,-0.527989,70.693703,-140.14704,1609.803543,
+ -0.910825,-0,-0.412793,78.550645,-165.54704,1595.104277,
+ -0.812791,-0,-0.582555,70.693703,-165.54704,1609.803543,
+ -0.812791,-0,-0.582555,70.693703,-165.54704,1609.803543,
+ -0.729927,-0,-0.683525,60.120045,-140.14704,1622.687553,
+ -0.849251,-0,-0.527989,70.693703,-140.14704,1609.803543,
+ -0.729927,-0,-0.683525,60.120045,-140.14704,1622.687553,
+ -0.812791,-0,-0.582555,70.693703,-165.54704,1609.803543,
+ -0.683523,-0,-0.729929,60.120045,-165.54704,1622.687553,
+ -0.683523,-0,-0.729929,60.120045,-165.54704,1622.687553,
+ -0.582553,-0,-0.812793,47.236011,-140.14704,1633.261182,
+ -0.729927,-0,-0.683525,60.120045,-140.14704,1622.687553,
+ -0.582553,-0,-0.812793,47.236011,-140.14704,1633.261182,
+ -0.683523,-0,-0.729929,60.120045,-165.54704,1622.687553,
+ -0.527987,-0,-0.849252,47.236011,-165.54704,1633.261182,
+ -0.527987,-0,-0.849252,47.236011,-165.54704,1633.261182,
+ -0.412791,-0,-0.910826,32.536728,-140.14704,1641.118092,
+ -0.582553,-0,-0.812793,47.236011,-140.14704,1633.261182,
+ -0.412791,-0,-0.910826,32.536728,-140.14704,1641.118092,
+ -0.527987,-0,-0.849252,47.236011,-165.54704,1633.261182,
+ -0.352161,-0,-0.935939,32.536728,-165.54704,1641.118092,
+ -0.352161,-0,-0.935939,32.536728,-165.54704,1641.118092,
+ -0.227166,-0,-0.973856,16.58708,-140.14704,1645.956345,
+ -0.412791,-0,-0.910826,32.536728,-140.14704,1641.118092,
+ -0.227166,-0,-0.973856,16.58708,-140.14704,1645.956345,
+ -0.352161,-0,-0.935939,32.536728,-165.54704,1641.118092,
+ -0.162802,-0,-0.986659,16.58708,-165.54704,1645.956345,
+ -0.162802,-0,-0.986659,16.58708,-165.54704,1645.956345,
+ -0.032812,-0,-0.999462,0.000004,-140.14704,1647.590011,
+ -0.227166,-0,-0.973856,16.58708,-140.14704,1645.956345,
+ -0.032812,-0,-0.999462,0.000004,-140.14704,1647.590011,
+ -0.162802,-0,-0.986659,16.58708,-165.54704,1645.956345,
+ 0.032814,0,-0.999461,0.000004,-165.54704,1647.590011,
+ 0.032814,0,-0.999461,0.000004,-165.54704,1647.590011,
+ 0.162804,0,-0.986658,-16.587068,-140.14704,1645.956308,
+ -0.032812,-0,-0.999462,0.000004,-140.14704,1647.590011,
+ 0.162804,0,-0.986658,-16.587068,-140.14704,1645.956308,
+ 0.032814,0,-0.999461,0.000004,-165.54704,1647.590011,
+ 0.227169,0,-0.973855,-16.587068,-165.54704,1645.956308,
+ 0.227169,0,-0.973855,-16.587068,-165.54704,1645.956308,
+ 0.352163,0,-0.935939,-32.536705,-140.14704,1641.118019,
+ 0.162804,0,-0.986658,-16.587068,-140.14704,1645.956308,
+ 0.352163,0,-0.935939,-32.536705,-140.14704,1641.118019,
+ 0.227169,0,-0.973855,-16.587068,-165.54704,1645.956308,
+ 0.412793,0,-0.910825,-32.536705,-165.54704,1641.118019,
+ 0.412793,0,-0.910825,-32.536705,-165.54704,1641.118019,
+ 0.527989,0,-0.849251,-47.235971,-140.14704,1633.261077,
+ 0.352163,0,-0.935939,-32.536705,-140.14704,1641.118019,
+ 0.527989,0,-0.849251,-47.235971,-140.14704,1633.261077,
+ 0.412793,0,-0.910825,-32.536705,-165.54704,1641.118019,
+ 0.582555,0,-0.812791,-47.235971,-165.54704,1633.261077,
+ 0.582555,0,-0.812791,-47.235971,-165.54704,1633.261077,
+ 0.707108,-0,-0.707106,-60.119981,-140.14704,1622.687419,
+ 0.527989,0,-0.849251,-47.235971,-140.14704,1633.261077,
+ 0.707108,-0,-0.707106,-60.119981,-140.14704,1622.687419,
+ 0.582555,0,-0.812791,-47.235971,-165.54704,1633.261077,
+ 0.707108,0,-0.707106,-60.119981,-165.54704,1622.687419,
+ 0.707108,-0,-0.707106,-60.119981,-140.14704,1622.687419,
+ 0.812793,-0,-0.582553,-70.69361,-165.54704,1609.803386,
+ 0.849252,-0,-0.527987,-70.69361,-140.14704,1609.803386,
+ 0.812793,-0,-0.582553,-70.69361,-165.54704,1609.803386,
+ 0.707108,-0,-0.707106,-60.119981,-140.14704,1622.687419,
+ 0.707108,0,-0.707106,-60.119981,-165.54704,1622.687419,
+ 0.849252,-0,-0.527987,-70.69361,-140.14704,1609.803386,
+ 0.910826,-0,-0.412791,-78.55052,-165.54704,1595.104103,
+ 0.935939,0,-0.352161,-78.55052,-140.14704,1595.104103,
+ 0.910826,-0,-0.412791,-78.55052,-165.54704,1595.104103,
+ 0.849252,-0,-0.527987,-70.69361,-140.14704,1609.803386,
+ 0.812793,-0,-0.582553,-70.69361,-165.54704,1609.803386,
+ 0.935939,0,-0.352161,-78.55052,-140.14704,1595.104103,
+ 0.973856,0,-0.227166,-83.388773,-165.54704,1579.154455,
+ 0.986659,0,-0.162802,-83.388773,-140.14704,1579.154455,
+ 0.973856,0,-0.227166,-83.388773,-165.54704,1579.154455,
+ 0.935939,0,-0.352161,-78.55052,-140.14704,1595.104103,
+ 0.910826,-0,-0.412791,-78.55052,-165.54704,1595.104103,
+ 0.986659,0,-0.162802,-83.388773,-140.14704,1579.154455,
+ 0.999462,0,-0.032812,-85.022439,-165.54704,1562.567379,
+ 0.999461,0,0.032814,-85.022439,-140.14704,1562.567379,
+ 0.999462,0,-0.032812,-85.022439,-165.54704,1562.567379,
+ 0.986659,0,-0.162802,-83.388773,-140.14704,1579.154455,
+ 0.973856,0,-0.227166,-83.388773,-165.54704,1579.154455,
+ 0.999461,0,0.032814,-85.022439,-140.14704,1562.567379,
+ 0.986658,0,0.162804,-83.388736,-165.54704,1545.980306,
+ 0.973855,0,0.227169,-83.388736,-140.14704,1545.980306,
+ 0.986658,0,0.162804,-83.388736,-165.54704,1545.980306,
+ 0.999461,0,0.032814,-85.022439,-140.14704,1562.567379,
+ 0.999462,0,-0.032812,-85.022439,-165.54704,1562.567379,
+ 0.973855,0,0.227169,-83.388736,-140.14704,1545.980306,
+ 0.935939,0,0.352163,-78.550447,-165.54704,1530.030669,
+ 0.910825,0,0.412793,-78.550447,-140.14704,1530.030669,
+ 0.935939,0,0.352163,-78.550447,-165.54704,1530.030669,
+ 0.973855,0,0.227169,-83.388736,-140.14704,1545.980306,
+ 0.986658,0,0.162804,-83.388736,-165.54704,1545.980306,
+ 0.910825,0,0.412793,-78.550447,-140.14704,1530.030669,
+ 0.849251,0,0.527989,-70.693505,-165.54704,1515.331404,
+ 0.812791,0,0.582555,-70.693505,-140.14704,1515.331404,
+ 0.849251,0,0.527989,-70.693505,-165.54704,1515.331404,
+ 0.910825,0,0.412793,-78.550447,-140.14704,1530.030669,
+ 0.935939,0,0.352163,-78.550447,-165.54704,1530.030669,
+ 0.812791,0,0.582555,-70.693505,-140.14704,1515.331404,
+ 0.729927,0,0.683525,-60.119847,-165.54704,1502.447394,
+ 0.683523,0,0.729929,-60.119847,-140.14704,1502.447394,
+ 0.729927,0,0.683525,-60.119847,-165.54704,1502.447394,
+ 0.812791,0,0.582555,-70.693505,-140.14704,1515.331404,
+ 0.849251,0,0.527989,-70.693505,-165.54704,1515.331404,
+ 0.683523,0,0.729929,-60.119847,-140.14704,1502.447394,
+ 0.582553,0,0.812793,-47.235814,-165.54704,1491.873764,
+ 0.527987,0,0.849252,-47.235814,-140.14704,1491.873764,
+ 0.582553,0,0.812793,-47.235814,-165.54704,1491.873764,
+ 0.683523,0,0.729929,-60.119847,-140.14704,1502.447394,
+ 0.729927,0,0.683525,-60.119847,-165.54704,1502.447394,
+ 0.527987,0,0.849252,-47.235814,-140.14704,1491.873764,
+ 0.412791,0,0.910826,-32.53653,-165.54704,1484.016855,
+ 0.352161,0,0.935939,-32.53653,-140.14704,1484.016855,
+ 0.412791,0,0.910826,-32.53653,-165.54704,1484.016855,
+ 0.527987,0,0.849252,-47.235814,-140.14704,1491.873764,
+ 0.582553,0,0.812793,-47.235814,-165.54704,1491.873764,
+ 0.352161,0,0.935939,-32.53653,-140.14704,1484.016855,
+ 0.227166,0,0.973856,-16.586883,-165.54704,1479.178602,
+ 0.162802,0,0.986659,-16.586883,-140.14704,1479.178602,
+ 0.227166,0,0.973856,-16.586883,-165.54704,1479.178602,
+ 0.352161,0,0.935939,-32.53653,-140.14704,1484.016855,
+ 0.412791,0,0.910826,-32.53653,-165.54704,1484.016855,
+ 0.162802,0,0.986659,-16.586883,-140.14704,1479.178602,
+ 0.032812,0,0.999462,0.000193,-165.54704,1477.544936,
+ -0.032814,-0,0.999461,0.000193,-140.14704,1477.544936,
+ 0.032812,0,0.999462,0.000193,-165.54704,1477.544936,
+ 0.162802,0,0.986659,-16.586883,-140.14704,1479.178602,
+ 0.227166,0,0.973856,-16.586883,-165.54704,1479.178602,
+ 0.849252,0,-0.527987,-70.69361,-301.60976,1609.803386,
+ 0.910826,0,-0.412791,-78.55052,-327.00976,1595.104103,
+ 0.935939,0,-0.352161,-78.55052,-301.60976,1595.104103,
+ 0.910826,0,-0.412791,-78.55052,-327.00976,1595.104103,
+ 0.849252,0,-0.527987,-70.69361,-301.60976,1609.803386,
+ 0.812793,0,-0.582553,-70.69361,-327.00976,1609.803386,
+ -0.162802,-0,-0.986659,16.58708,-327.00976,1645.956345,
+ -0.032812,-0,-0.999462,0.000004,-301.60976,1647.590011,
+ -0.227166,-0,-0.973856,16.58708,-301.60976,1645.956345,
+ -0.032812,-0,-0.999462,0.000004,-301.60976,1647.590011,
+ -0.162802,-0,-0.986659,16.58708,-327.00976,1645.956345,
+ 0.032814,0,-0.999461,0.000004,-327.00976,1647.590011,
+ 0.227169,0,-0.973855,-16.587068,-327.00976,1645.956308,
+ 0.352163,0,-0.935939,-32.536705,-301.60976,1641.118019,
+ 0.162804,0,-0.986658,-16.587068,-301.60976,1645.956308,
+ 0.352163,0,-0.935939,-32.536705,-301.60976,1641.118019,
+ 0.227169,0,-0.973855,-16.587068,-327.00976,1645.956308,
+ 0.412793,0,-0.910825,-32.536705,-327.00976,1641.118019,
+ 0.032814,0,-0.999461,0.000004,-327.00976,1647.590011,
+ 0.162804,0,-0.986658,-16.587068,-301.60976,1645.956308,
+ -0.032812,-0,-0.999462,0.000004,-301.60976,1647.590011,
+ 0.162804,0,-0.986658,-16.587068,-301.60976,1645.956308,
+ 0.032814,0,-0.999461,0.000004,-327.00976,1647.590011,
+ 0.227169,0,-0.973855,-16.587068,-327.00976,1645.956308,
+ 0.527987,0,0.849252,-47.235814,-301.60976,1491.873764,
+ 0.412791,0,0.910826,-32.53653,-327.00976,1484.016855,
+ 0.352161,0,0.935939,-32.53653,-301.60976,1484.016855,
+ 0.412791,0,0.910826,-32.53653,-327.00976,1484.016855,
+ 0.527987,0,0.849252,-47.235814,-301.60976,1491.873764,
+ 0.582553,0,0.812793,-47.235814,-327.00976,1491.873764,
+ 0.910825,0,0.412793,-78.550447,-301.60976,1530.030669,
+ 0.849251,0,0.527989,-70.693505,-327.00976,1515.331404,
+ 0.812791,0,0.582555,-70.693505,-301.60976,1515.331404,
+ 0.849251,0,0.527989,-70.693505,-327.00976,1515.331404,
+ 0.910825,0,0.412793,-78.550447,-301.60976,1530.030669,
+ 0.935939,0,0.352163,-78.550447,-327.00976,1530.030669,
+ 0.707108,0,-0.707106,-60.119981,-301.60976,1622.687419,
+ 0.812793,0,-0.582553,-70.69361,-327.00976,1609.803386,
+ 0.849252,0,-0.527987,-70.69361,-301.60976,1609.803386,
+ 0.812793,0,-0.582553,-70.69361,-327.00976,1609.803386,
+ 0.707108,0,-0.707106,-60.119981,-301.60976,1622.687419,
+ 0.707108,0,-0.707106,-60.119981,-327.00976,1622.687419,
+ 0.352161,0,0.935939,-32.53653,-301.60976,1484.016855,
+ 0.227166,0,0.973856,-16.586883,-327.00976,1479.178602,
+ 0.162802,0,0.986659,-16.586883,-301.60976,1479.178602,
+ 0.227166,0,0.973856,-16.586883,-327.00976,1479.178602,
+ 0.352161,0,0.935939,-32.53653,-301.60976,1484.016855,
+ 0.412791,0,0.910826,-32.53653,-327.00976,1484.016855,
+ 0.683523,0,0.729929,-60.119847,-301.60976,1502.447394,
+ 0.582553,0,0.812793,-47.235814,-327.00976,1491.873764,
+ 0.527987,0,0.849252,-47.235814,-301.60976,1491.873764,
+ 0.582553,0,0.812793,-47.235814,-327.00976,1491.873764,
+ 0.683523,0,0.729929,-60.119847,-301.60976,1502.447394,
+ 0.729927,0,0.683525,-60.119847,-327.00976,1502.447394,
+ 0.986659,0,-0.162802,-83.388773,-301.60976,1579.154455,
+ 0.999462,0,-0.032812,-85.022439,-327.00976,1562.567379,
+ 0.999461,0,0.032814,-85.022439,-301.60976,1562.567379,
+ 0.999462,0,-0.032812,-85.022439,-327.00976,1562.567379,
+ 0.986659,0,-0.162802,-83.388773,-301.60976,1579.154455,
+ 0.973856,0,-0.227166,-83.388773,-327.00976,1579.154455,
+ 0.162802,0,0.986659,-16.586883,-301.60976,1479.178602,
+ 0.032812,0,0.999462,0.000193,-327.00976,1477.544936,
+ -0.032814,-0,0.999461,0.000193,-301.60976,1477.544936,
+ 0.032812,0,0.999462,0.000193,-327.00976,1477.544936,
+ 0.162802,0,0.986659,-16.586883,-301.60976,1479.178602,
+ 0.227166,0,0.973856,-16.586883,-327.00976,1479.178602,
+ -0.032814,-0,0.999461,0.000193,-301.60976,1477.544936,
+ -0.162804,-0,0.986658,16.587266,-327.00976,1479.178638,
+ -0.227169,-0,0.973855,16.587266,-301.60976,1479.178638,
+ -0.162804,-0,0.986658,16.587266,-327.00976,1479.178638,
+ -0.032814,-0,0.999461,0.000193,-301.60976,1477.544936,
+ 0.032812,0,0.999462,0.000193,-327.00976,1477.544936,
+ -0.227169,-0,0.973855,16.587266,-301.60976,1479.178638,
+ -0.382684,-0,0.923879,32.536903,-327.00976,1484.016927,
+ -0.382684,-0,0.923879,32.536903,-301.60976,1484.016927,
+ -0.382684,-0,0.923879,32.536903,-327.00976,1484.016927,
+ -0.227169,-0,0.973855,16.587266,-301.60976,1479.178638,
+ -0.162804,-0,0.986658,16.587266,-327.00976,1479.178638,
+ -0.382684,-0,0.923879,32.536903,-327.00976,1484.016927,
+ -0.527989,-0,0.849251,47.236168,-301.60976,1491.87387,
+ -0.382684,-0,0.923879,32.536903,-301.60976,1484.016927,
+ -0.527989,-0,0.849251,47.236168,-301.60976,1491.87387,
+ -0.382684,-0,0.923879,32.536903,-327.00976,1484.016927,
+ -0.582555,-0,0.812791,47.236168,-327.00976,1491.87387,
+ -0.582555,-0,0.812791,47.236168,-327.00976,1491.87387,
+ -0.707108,-0,0.707106,60.120178,-301.60976,1502.447527,
+ -0.527989,-0,0.849251,47.236168,-301.60976,1491.87387,
+ -0.707108,-0,0.707106,60.120178,-301.60976,1502.447527,
+ -0.582555,-0,0.812791,47.236168,-327.00976,1491.87387,
+ -0.707108,-0,0.707106,60.120178,-327.00976,1502.447527,
+ -0.812793,-0,0.582553,70.693808,-327.00976,1515.331561,
+ -0.707108,-0,0.707106,60.120178,-301.60976,1502.447527,
+ -0.707108,-0,0.707106,60.120178,-327.00976,1502.447527,
+ -0.707108,-0,0.707106,60.120178,-301.60976,1502.447527,
+ -0.812793,-0,0.582553,70.693808,-327.00976,1515.331561,
+ -0.849252,-0,0.527987,70.693808,-301.60976,1515.331561,
+ -0.910826,-0,0.412791,78.550717,-327.00976,1530.030844,
+ -0.849252,-0,0.527987,70.693808,-301.60976,1515.331561,
+ -0.812793,-0,0.582553,70.693808,-327.00976,1515.331561,
+ -0.849252,-0,0.527987,70.693808,-301.60976,1515.331561,
+ -0.910826,-0,0.412791,78.550717,-327.00976,1530.030844,
+ -0.935939,-0,0.352161,78.550717,-301.60976,1530.030844,
+ -0.973856,-0,0.227166,83.388971,-327.00976,1545.980492,
+ -0.935939,-0,0.352161,78.550717,-301.60976,1530.030844,
+ -0.910826,-0,0.412791,78.550717,-327.00976,1530.030844,
+ -0.935939,-0,0.352161,78.550717,-301.60976,1530.030844,
+ -0.973856,-0,0.227166,83.388971,-327.00976,1545.980492,
+ -0.986659,-0,0.162802,83.388971,-301.60976,1545.980492,
+ -0.999462,-0,0.032812,85.022636,-327.00976,1562.567568,
+ -0.986659,-0,0.162802,83.388971,-301.60976,1545.980492,
+ -0.973856,-0,0.227166,83.388971,-327.00976,1545.980492,
+ -0.986659,-0,0.162802,83.388971,-301.60976,1545.980492,
+ -0.999462,-0,0.032812,85.022636,-327.00976,1562.567568,
+ -0.999461,-0,-0.032814,85.022636,-301.60976,1562.567568,
+ -0.986658,-0,-0.162804,83.388934,-327.00976,1579.15464,
+ -0.999461,-0,-0.032814,85.022636,-301.60976,1562.567568,
+ -0.999462,-0,0.032812,85.022636,-327.00976,1562.567568,
+ -0.999461,-0,-0.032814,85.022636,-301.60976,1562.567568,
+ -0.986658,-0,-0.162804,83.388934,-327.00976,1579.15464,
+ -0.973855,-0,-0.227169,83.388934,-301.60976,1579.15464,
+ -0.935939,-0,-0.352163,78.550645,-327.00976,1595.104277,
+ -0.973855,-0,-0.227169,83.388934,-301.60976,1579.15464,
+ -0.986658,-0,-0.162804,83.388934,-327.00976,1579.15464,
+ -0.973855,-0,-0.227169,83.388934,-301.60976,1579.15464,
+ -0.935939,-0,-0.352163,78.550645,-327.00976,1595.104277,
+ -0.910825,-0,-0.412793,78.550645,-301.60976,1595.104277,
+ -0.849251,-0,-0.527989,70.693703,-327.00976,1609.803543,
+ -0.910825,-0,-0.412793,78.550645,-301.60976,1595.104277,
+ -0.935939,-0,-0.352163,78.550645,-327.00976,1595.104277,
+ -0.910825,-0,-0.412793,78.550645,-301.60976,1595.104277,
+ -0.849251,-0,-0.527989,70.693703,-327.00976,1609.803543,
+ -0.812791,-0,-0.582555,70.693703,-301.60976,1609.803543,
+ -0.707106,-0,-0.707108,60.120045,-327.00976,1622.687553,
+ -0.812791,-0,-0.582555,70.693703,-301.60976,1609.803543,
+ -0.849251,-0,-0.527989,70.693703,-327.00976,1609.803543,
+ -0.812791,-0,-0.582555,70.693703,-301.60976,1609.803543,
+ -0.707106,-0,-0.707108,60.120045,-327.00976,1622.687553,
+ -0.707106,-0,-0.707108,60.120045,-301.60976,1622.687553,
+ -0.707106,-0,-0.707108,60.120045,-327.00976,1622.687553,
+ -0.582553,-0,-0.812793,47.236011,-301.60976,1633.261182,
+ -0.707106,-0,-0.707108,60.120045,-301.60976,1622.687553,
+ -0.582553,-0,-0.812793,47.236011,-301.60976,1633.261182,
+ -0.707106,-0,-0.707108,60.120045,-327.00976,1622.687553,
+ -0.527987,-0,-0.849252,47.236011,-327.00976,1633.261182,
+ -0.527987,-0,-0.849252,47.236011,-327.00976,1633.261182,
+ -0.412791,-0,-0.910826,32.536728,-301.60976,1641.118092,
+ -0.582553,-0,-0.812793,47.236011,-301.60976,1633.261182,
+ -0.412791,-0,-0.910826,32.536728,-301.60976,1641.118092,
+ -0.527987,-0,-0.849252,47.236011,-327.00976,1633.261182,
+ -0.352161,-0,-0.935939,32.536728,-327.00976,1641.118092,
+ -0.352161,-0,-0.935939,32.536728,-327.00976,1641.118092,
+ -0.227166,-0,-0.973856,16.58708,-301.60976,1645.956345,
+ -0.412791,-0,-0.910826,32.536728,-301.60976,1641.118092,
+ -0.227166,-0,-0.973856,16.58708,-301.60976,1645.956345,
+ -0.352161,-0,-0.935939,32.536728,-327.00976,1641.118092,
+ -0.162802,-0,-0.986659,16.58708,-327.00976,1645.956345,
+ -1,-0,-0.000001,-29.712222,-140.14704,1681.416397,
+ -0.947173,-0,-0.320723,-27.450503,-0,1670.046016,
+ -0.896537,-0,-0.442969,-27.450503,-140.14704,1670.046016,
+ -0.947173,-0,-0.320723,-27.450503,-0,1670.046016,
+ -1,-0,-0.000001,-29.712222,-140.14704,1681.416397,
+ -1,-0,-0.000001,-29.712222,-0,1681.416397,
+ 0.382684,-0,-0.923879,11.370427,-0,1653.965901,
+ 0.000001,-0,-1,0.000046,-140.14704,1651.704181,
+ 0.000001,-0,-1,0.000046,-0,1651.704181,
+ 0.000001,-0,-1,0.000046,-140.14704,1651.704181,
+ 0.382684,-0,-0.923879,11.370427,-0,1653.965901,
+ 0.382684,-0,-0.923879,11.370427,-140.14704,1653.965901,
+ -0.896538,-0,0.442967,-27.450523,-140.14704,1692.786782,
+ -0.707107,-0,0.707106,-21.009727,-0,1702.426133,
+ -0.947174,-0,0.320721,-27.450523,-0,1692.786782,
+ -0.707107,-0,0.707106,-21.009727,-0,1702.426133,
+ -0.896538,-0,0.442967,-27.450523,-140.14704,1692.786782,
+ -0.707107,-0,0.707106,-21.009727,-140.14704,1702.426133,
+ 0.896538,0,-0.442967,27.450563,-0,1670.046065,
+ 0.707107,-0,-0.707106,21.009767,-140.14704,1660.406714,
+ 0.707107,0,-0.707106,21.009767,-0,1660.406714,
+ 0.707107,-0,-0.707106,21.009767,-140.14704,1660.406714,
+ 0.896538,0,-0.442967,27.450563,-0,1670.046065,
+ 0.947174,0,-0.320721,27.450563,-140.14704,1670.046065,
+ -1,-0,-0.000001,-29.712222,-140.14704,1681.416397,
+ -0.947174,-0,0.320721,-27.450523,-0,1692.786782,
+ -1,-0,-0.000001,-29.712222,-0,1681.416397,
+ -0.947174,-0,0.320721,-27.450523,-0,1692.786782,
+ -1,-0,-0.000001,-29.712222,-140.14704,1681.416397,
+ -0.896538,-0,0.442967,-27.450523,-140.14704,1692.786782,
+ 0.000001,-0,-1,0.000046,-140.14704,1651.704181,
+ -0.320721,-0,-0.947174,-11.370339,-0,1653.965881,
+ 0.000001,-0,-1,0.000046,-0,1651.704181,
+ -0.320721,-0,-0.947174,-11.370339,-0,1653.965881,
+ 0.000001,-0,-1,0.000046,-140.14704,1651.704181,
+ -0.442967,-0,-0.896538,-11.370339,-140.14704,1653.965881,
+ -0.382684,-0,0.923879,-11.370387,-140.14704,1708.866946,
+ -0.000001,0,1,-0.000006,-0,1711.128666,
+ -0.382684,-0,0.923879,-11.370387,-0,1708.866946,
+ -0.000001,0,1,-0.000006,-0,1711.128666,
+ -0.382684,-0,0.923879,-11.370387,-140.14704,1708.866946,
+ -0.000001,0,1,-0.000006,-140.14704,1711.128666
+};
+static const struct gllist robot_rotator_half_frame = { GL_N3F_V3F, GL_TRIANGLES, 1290, robot_rotator_half_data, 0 };
+const struct gllist *robot_rotator_half = &robot_rotator_half_frame;
diff --git a/hacks/glx/robot.dxf b/hacks/glx/robot.dxf
new file mode 100644
index 0000000..33337a2
--- /dev/null
+++ b/hacks/glx/robot.dxf
@@ -0,0 +1,185616 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+LINE
+ 8
+body_half_outside
+10
+49.3833285852636
+20
+-973.755695339679
+30
+2091.49823824434
+11
+-1.46818399649623
+21
+-975.178141079999
+31
+2078.18338184642
+ 0
+LINE
+ 8
+body_half_outside
+10
+49.3833285852636
+20
+-973.755695339679
+30
+2091.49823824434
+11
+104.493582702864
+21
+-954.855979397759
+31
+2142.57132329634
+ 0
+LINE
+ 8
+body_half_outside
+10
+49.3833285852636
+20
+-973.755695339678
+30
+1978.90616179826
+11
+104.493582702864
+21
+-970.431454266559
+31
+2000.14082085794
+ 0
+LINE
+ 8
+body_half_outside
+10
+47.4423855126237
+20
+-935.483454058559
+30
+2215.03930219042
+11
+104.493582702864
+21
+-941.451475609919
+31
+2182.48702219986
+ 0
+LINE
+ 8
+body_half_outside
+10
+49.3833285852636
+20
+-973.755695339678
+30
+1978.90616179826
+11
+7.02533393134383
+21
+-975.148943779999
+31
+1991.94707744866
+ 0
+LINE
+ 8
+body_half_outside
+10
+104.493582702864
+20
+-954.855979397759
+30
+2142.57132329634
+11
+48.5792115854235
+21
+-957.900066537919
+31
+2152.7213325213
+ 0
+LINE
+ 8
+body_half_outside
+10
+48.5792115854235
+20
+-957.900066537919
+30
+2152.7213325213
+11
+104.493582702864
+21
+-941.451475609919
+31
+2182.48702219986
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493609641047
+20
+-876.169915138752
+30
+2001.23529816273
+11
+180.675224578544
+21
+-881.220764951522
+31
+2017.88600937388
+12
+180.675224578544
+22
+-876.169825263419
+32
+2001.23529268221
+13
+180.675224578544
+23
+-876.169825263419
+33
+2001.23529268221
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-881.220764951522
+30
+2017.88600937388
+11
+104.493609641047
+21
+-876.169915138752
+31
+2001.23529816273
+12
+104.493608114757
+22
+-881.220857485245
+32
+2017.88602361794
+13
+104.493608114757
+23
+-881.220857485245
+33
+2017.88602361794
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-731.403895497386
+30
+1972.43955887653
+11
+104.493591159588
+21
+-720.365490157703
+31
+1985.88990169709
+12
+104.493594381798
+22
+-731.40390918009
+32
+1972.4395492014
+13
+104.493594381798
+23
+-731.40390918009
+33
+1972.4395492014
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493591159588
+20
+-720.365490157703
+30
+1985.88990169709
+11
+180.675224578544
+21
+-731.403895497386
+31
+1972.43955887653
+12
+180.675224578544
+22
+-720.365482284693
+32
+1985.88990429309
+13
+180.675224578544
+23
+-720.365482284693
+33
+1985.88990429309
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493610580936
+20
+-843.478858324204
+30
+1961.40113017901
+11
+180.675224578544
+21
+-828.133397265575
+31
+1953.19886468436
+12
+104.493609641054
+22
+-828.133461858565
+32
+1953.19884488255
+13
+104.493609641054
+23
+-828.133461858565
+33
+1953.19884488255
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-828.133397265575
+30
+1953.19886468436
+11
+104.493610580936
+21
+-843.478858324204
+31
+1961.40113017901
+12
+180.675224578544
+22
+-843.478785654691
+32
+1961.40114566384
+13
+180.675224578544
+23
+-843.478785654691
+33
+1961.40114566384
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-778.906875772646
+20
+-154.93421062823
+30
+1614.7610800213
+11
+-878.79625075709
+21
+-89.3648841254364
+31
+1427.8983600213
+12
+-870.542978388701
+22
+-173.161764737035
+32
+1427.8983600213
+13
+-870.542978388701
+23
+-173.161764737035
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-878.79625075709
+20
+-89.3648841254364
+30
+1427.8983600213
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+-794.166563605455
+22
+1.80477854883065e-13
+32
+1614.7610800213
+13
+-794.166563605455
+23
+1.80477854883065e-13
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-878.79625075709
+20
+-89.3648841254364
+30
+1427.8983600213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-887.597923605455
+22
+3.60955709766131e-13
+32
+1427.8983600213
+13
+-887.597923605455
+23
+3.60955709766131e-13
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+978.352295145615
+20
+-194.606371158736
+30
+2361.46489814399
+11
+863.207469797099
+21
+-357.552241131722
+31
+2455.6433200213
+12
+921.587710511789
+22
+-381.734128610352
+32
+2361.46489814399
+13
+921.587710511789
+23
+-381.734128610352
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+863.207469797099
+20
+-357.552241131722
+30
+2455.6433200213
+11
+978.352295145615
+21
+-194.606371158736
+31
+2361.46489814399
+12
+887.227326571027
+22
+-278.369385106107
+32
+2455.6433200213
+13
+887.227326571027
+23
+-278.369385106107
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+887.227326571027
+20
+-278.369385106107
+30
+2455.6433200213
+11
+978.352295145615
+21
+-194.606371158736
+31
+2361.46489814399
+12
+914.651020883606
+22
+-187.965580500561
+32
+2455.6433200213
+13
+914.651020883606
+23
+-187.965580500561
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+914.651020883606
+20
+-187.965580500561
+30
+2455.6433200213
+11
+978.352295145615
+21
+-194.606371158736
+31
+2361.46489814399
+12
+916.376162171087
+22
+-182.278551827737
+32
+2455.6433200213
+13
+916.376162171087
+23
+-182.278551827737
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+415.26146157539
+20
+-621.482696406623
+30
+1427.8983600213
+11
+321.791703197793
+21
+-776.873894119249
+31
+1241.03564002131
+12
+467.169144021928
+22
+-699.168033082722
+32
+1241.03564002131
+13
+467.169144021928
+23
+-699.168033082722
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.873894119249
+30
+1241.03564002131
+11
+415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+286.037069662455
+22
+-690.554572920556
+32
+1427.8983600213
+13
+286.037069662455
+23
+-690.554572920556
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-470.848959476119
+20
+-704.67526609701
+30
+796.153149972084
+11
+-590.997993226901
+21
+-590.997993226901
+31
+738.078199114136
+12
+-464.344143695271
+22
+-694.940121314314
+32
+738.078199114136
+13
+-464.344143695271
+23
+-694.940121314314
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-590.997993226901
+20
+-590.997993226901
+30
+738.078199114136
+11
+-470.848959476119
+21
+-704.67526609701
+31
+796.153149972084
+12
+-599.277053327022
+22
+-599.277053327022
+32
+796.153149972084
+13
+-599.277053327022
+23
+-599.277053327022
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2549.0746800213
+11
+0.0
+21
+-840.882243605455
+31
+2455.6433200213
+12
+164.047987682633
+22
+-824.724927080674
+32
+2455.6433200213
+13
+164.047987682633
+23
+-824.724927080674
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+2455.6433200213
+11
+164.047987682633
+21
+-824.724927080674
+31
+2549.0746800213
+12
+0.0
+22
+-840.882243605455
+32
+2549.0746800213
+13
+0.0
+23
+-840.882243605455
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+2549.0746800213
+11
+164.047987682633
+21
+-824.724927080674
+31
+2549.0746800213
+12
+126.903660366379
+22
+-828.38332400481
+32
+2549.0746800213
+13
+126.903660366379
+23
+-828.38332400481
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+2549.0746800213
+11
+126.903660366379
+21
+-828.38332400481
+31
+2549.0746800213
+12
+42.4327751671525
+22
+-836.702980030903
+32
+2549.0746800213
+13
+42.4327751671525
+23
+-836.702980030903
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+2549.0746800213
+11
+467.169144021928
+21
+-699.168033082722
+31
+2455.6433200213
+12
+594.593536632776
+22
+-594.593536632776
+32
+2455.6433200213
+13
+594.593536632776
+23
+-594.593536632776
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+594.593536632776
+21
+-594.593536632776
+31
+2549.0746800213
+12
+467.169144021928
+22
+-699.168033082722
+32
+2549.0746800213
+13
+467.169144021928
+23
+-699.168033082722
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2549.0746800213
+11
+594.593536632776
+21
+-594.593536632776
+31
+2549.0746800213
+12
+578.083233221301
+22
+-608.143192472719
+32
+2549.0746800213
+13
+578.083233221301
+23
+-608.143192472719
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2549.0746800213
+11
+578.083233221301
+21
+-608.143192472719
+31
+2549.0746800213
+12
+512.438726622327
+22
+-662.016246772909
+32
+2549.0746800213
+13
+512.438726622327
+23
+-662.016246772909
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-814.429823327873
+20
+1.80477854883065e-13
+30
+682.822310520627
+11
+-768.954752250597
+21
+-152.954610178005
+31
+631.979456702016
+12
+-798.780782641381
+22
+-158.887376492573
+32
+682.822310520627
+13
+-798.780782641381
+23
+-158.887376492573
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-768.954752250597
+20
+-152.954610178005
+30
+631.979456702016
+11
+-814.429823327873
+21
+1.80477854883065e-13
+31
+682.822310520627
+12
+-784.019466456977
+22
+1.80477854883065e-13
+32
+631.979456702016
+13
+-784.019466456977
+23
+1.80477854883065e-13
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+2361.46489814399
+11
+203.671280618918
+21
+-1023.92467246733
+31
+2258.00680432354
+12
+399.51558814382
+22
+-964.515951276275
+32
+2258.00680432354
+13
+399.51558814382
+23
+-964.515951276275
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+203.671280618918
+20
+-1023.92467246733
+30
+2258.00680432354
+11
+381.734128610352
+21
+-921.587710511788
+31
+2361.46489814399
+12
+194.606371158736
+22
+-978.352295145615
+32
+2361.46489814399
+13
+194.606371158736
+23
+-978.352295145615
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+357.552241131722
+20
+-863.2074697971
+30
+2455.6433200213
+11
+194.606371158736
+21
+-978.352295145615
+31
+2361.46489814399
+12
+381.734128610352
+22
+-921.587710511788
+32
+2361.46489814399
+13
+381.734128610352
+23
+-921.587710511788
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+194.606371158736
+20
+-978.352295145615
+30
+2361.46489814399
+11
+357.552241131722
+21
+-863.2074697971
+31
+2455.6433200213
+12
+182.278551827736
+22
+-916.376162171087
+32
+2455.6433200213
+13
+182.278551827736
+23
+-916.376162171087
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+182.278551827736
+20
+-916.376162171087
+30
+2455.6433200213
+11
+357.552241131722
+21
+-863.2074697971
+31
+2455.6433200213
+12
+323.520353242804
+22
+-873.5309301251
+32
+2455.6433200213
+13
+323.520353242804
+23
+-873.5309301251
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+182.278551827736
+20
+-916.376162171087
+30
+2455.6433200213
+11
+323.520353242804
+21
+-873.5309301251
+31
+2455.6433200213
+12
+233.261899594599
+22
+-900.91053270681
+32
+2455.6433200213
+13
+233.261899594599
+23
+-900.91053270681
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+798.780782641381
+20
+-158.887376492573
+30
+682.822310520627
+11
+835.797377356766
+21
+1.80477854883065e-13
+31
+738.078199114136
+12
+819.73776511114
+22
+-163.055979488767
+32
+738.078199114136
+13
+819.73776511114
+23
+-163.055979488767
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+835.797377356766
+20
+1.80477854883065e-13
+30
+738.078199114136
+11
+798.780782641381
+21
+-158.887376492573
+31
+682.822310520627
+12
+814.429823327873
+22
+1.80477854883065e-13
+32
+682.822310520627
+13
+814.429823327873
+23
+1.80477854883065e-13
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-723.84293286299
+20
+-790.84270017674
+30
+2109.1268343449
+11
+-768.602809842621
+21
+-861.72900857618
+31
+2086.28270221439
+12
+-783.644995364665
+22
+-846.504456965985
+32
+2095.12279472996
+13
+-783.644995364665
+23
+-846.504456965985
+33
+2095.12279472996
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-768.602809842621
+20
+-861.72900857618
+30
+2086.28270221439
+11
+-723.84293286299
+21
+-790.84270017674
+31
+2109.1268343449
+12
+-703.270205185374
+22
+-808.916878172158
+32
+2098.19892992261
+13
+-703.270205185374
+23
+-808.916878172158
+33
+2098.19892992261
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1023.92467246733
+20
+-203.671280618918
+30
+2258.00680432354
+11
+-1072.40303302985
+21
+3.60955709766131e-13
+31
+2148.21162800104
+12
+-1051.79710945546
+22
+-209.215453044867
+32
+2148.21162800104
+13
+-1051.79710945546
+23
+-209.215453044867
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1072.40303302985
+20
+3.60955709766131e-13
+30
+2148.21162800104
+11
+-1023.92467246733
+21
+-203.671280618918
+31
+2258.00680432354
+12
+-1043.98454271904
+22
+3.60955709766131e-13
+32
+2258.00680432354
+13
+-1043.98454271904
+23
+3.60955709766131e-13
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+279.792110043812
+20
+-1038.25578712258
+30
+2035.20217666346
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+287.457754814725
+22
+-1035.93043920361
+32
+2011.5925230317
+13
+287.457754814725
+23
+-1035.93043920361
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+279.792110043812
+21
+-1038.25578712258
+31
+2035.20217666346
+12
+210.691411720441
+22
+-1059.21725479392
+32
+2058.8118770109
+13
+210.691411720441
+23
+-1059.21725479392
+33
+2058.8118770109
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+279.792110043812
+21
+-1038.25578712258
+31
+2035.20217666346
+12
+287.457769982496
+22
+-1035.93043460251
+32
+2058.8118770109
+13
+287.457769982496
+23
+-1035.93043460251
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+806.222012671193
+20
+-670.885845335315
+30
+1850.69961858573
+11
+180.675224578544
+21
+-637.259985333474
+31
+1878.29564871262
+12
+180.675224578544
+22
+-670.885845335315
+32
+1850.69961858573
+13
+180.675224578544
+23
+-670.885845335315
+33
+1850.69961858573
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-637.259985333474
+30
+1878.29564871262
+11
+806.222012671193
+21
+-670.885845335315
+31
+1850.69961858573
+12
+843.01369820043
+22
+-637.259985333474
+32
+1878.29564871262
+13
+843.01369820043
+23
+-637.259985333474
+33
+1878.29564871262
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+806.222028237971
+20
+-670.885845335315
+30
+2219.70473474119
+11
+180.675224578544
+21
+-709.249312269842
+31
+2240.21043503138
+12
+180.675224578544
+22
+-670.885845335315
+32
+2219.70473474119
+13
+180.675224578544
+23
+-670.885845335315
+33
+2219.70473474119
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-709.249312269842
+30
+2240.21043503138
+11
+806.222028237971
+21
+-670.885845335315
+31
+2219.70473474119
+12
+767.904956185432
+22
+-709.249312269841
+32
+2240.21043503138
+13
+767.904956185432
+23
+-709.249312269841
+33
+2240.21043503138
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+767.904956185432
+20
+-709.249312269841
+30
+2240.21043503138
+11
+180.675224578544
+21
+-750.87609961724
+31
+2252.83778292244
+12
+180.675224578544
+22
+-709.249312269842
+32
+2240.21043503138
+13
+180.675224578544
+23
+-709.249312269842
+33
+2240.21043503138
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-750.87609961724
+30
+2252.83778292244
+11
+767.904956185432
+21
+-709.249312269841
+31
+2240.21043503138
+12
+724.871895956044
+22
+-750.87609961724
+32
+2252.83778292244
+13
+724.871895956044
+23
+-750.87609961724
+33
+2252.83778292244
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.871895956044
+20
+-750.87609961724
+30
+2252.83778292244
+11
+767.904956185432
+21
+-709.249312269841
+31
+2240.21043503138
+12
+739.771130343929
+22
+-739.771130343928
+32
+2249.46912732182
+13
+739.771130343929
+23
+-739.771130343928
+33
+2249.46912732182
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-399.515588143821
+20
+-964.515951276276
+30
+1812.39759571907
+11
+-554.192057578438
+21
+-829.407026995335
+31
+1708.93950189862
+12
+-381.734128610353
+22
+-921.587710511788
+32
+1708.93950189862
+13
+-381.734128610353
+23
+-921.587710511788
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.192057578438
+20
+-829.407026995335
+30
+1708.93950189862
+11
+-399.515588143821
+21
+-964.515951276276
+31
+1812.39759571907
+12
+-580.006735667279
+22
+-868.04142298445
+32
+1812.39759571907
+13
+-580.006735667279
+23
+-868.04142298445
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-644.282480658799
+20
+-861.555930289753
+30
+2059.38164426315
+11
+-740.177565197592
+21
+-890.060339871748
+31
+2085.82110165668
+12
+-731.284144746345
+22
+-899.775643285913
+32
+2054.14511148709
+13
+-731.284144746345
+23
+-899.775643285913
+33
+2054.14511148709
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-740.177565197592
+20
+-890.060339871748
+30
+2085.82110165668
+11
+-644.282480658799
+21
+-861.555930289753
+31
+2059.38164426315
+12
+-655.637457605706
+22
+-847.372595440649
+32
+2104.03168141582
+13
+-655.637457605706
+23
+-847.372595440649
+33
+2104.03168141582
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+599.277053327022
+20
+-599.277053327022
+30
+796.153149972084
+11
+706.098253038493
+21
+-471.799768952456
+31
+855.37186879426
+12
+600.487204246519
+22
+-600.48720424652
+32
+855.37186879426
+13
+600.487204246519
+23
+-600.48720424652
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+706.098253038493
+20
+-471.799768952456
+30
+855.37186879426
+11
+599.277053327022
+21
+-599.277053327022
+31
+796.153149972084
+12
+704.67526609701
+22
+-470.84895947612
+32
+796.153149972084
+13
+704.67526609701
+23
+-470.84895947612
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+389.307620352121
+20
+-582.640028068573
+30
+1241.03564002131
+11
+303.914386430124
+21
+-733.714233519903
+31
+1054.1729200213
+12
+441.215302798659
+22
+-660.325364744672
+32
+1054.1729200213
+13
+441.215302798659
+23
+-660.325364744672
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+303.914386430124
+20
+-733.714233519903
+30
+1054.1729200213
+11
+389.307620352121
+21
+-582.640028068573
+31
+1241.03564002131
+12
+268.159752894785
+22
+-647.394912321209
+32
+1241.03564002131
+13
+268.159752894785
+23
+-647.394912321209
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+916.376162171087
+20
+-182.278551827737
+30
+1614.7610800213
+11
+997.519349743285
+21
+1.80477854883065e-13
+31
+1708.93950189862
+12
+978.352295145615
+22
+-194.606371158736
+32
+1708.93950189862
+13
+978.352295145615
+23
+-194.606371158736
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+997.519349743285
+20
+1.80477854883065e-13
+30
+1708.93950189862
+11
+916.376162171087
+21
+-182.278551827737
+31
+1614.7610800213
+12
+925.063958273825
+22
+-94.0698777038381
+32
+1614.7610800213
+13
+925.063958273825
+23
+-94.0698777038381
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+997.519349743285
+20
+1.80477854883065e-13
+30
+1708.93950189862
+11
+925.063958273825
+21
+-94.0698777038381
+31
+1614.7610800213
+12
+934.329032542513
+22
+1.80477854883065e-13
+32
+1614.7610800213
+13
+934.329032542513
+23
+1.80477854883065e-13
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632776
+20
+-594.593536632776
+30
+914.026066884025
+11
+-706.098253038492
+21
+-471.799768952456
+31
+855.37186879426
+12
+-600.487204246519
+22
+-600.487204246519
+32
+855.37186879426
+13
+-600.487204246519
+23
+-600.487204246519
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-706.098253038492
+20
+-471.799768952456
+30
+855.37186879426
+11
+-594.593536632776
+21
+-594.593536632776
+31
+914.026066884025
+12
+-699.168033082722
+22
+-467.169144021929
+32
+914.026066884025
+13
+-699.168033082722
+23
+-467.169144021929
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+921.587710511789
+20
+-381.734128610352
+30
+1708.93950189862
+11
+1023.92467246733
+21
+-203.671280618918
+31
+1812.39759571907
+12
+964.515951276275
+22
+-399.515588143821
+32
+1812.39759571907
+13
+964.515951276275
+23
+-399.515588143821
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1023.92467246733
+20
+-203.671280618918
+30
+1812.39759571907
+11
+921.587710511789
+21
+-381.734128610352
+31
+1708.93950189862
+12
+978.352295145615
+22
+-194.606371158736
+32
+1708.93950189862
+13
+978.352295145615
+23
+-194.606371158736
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.183382327347
+20
+-739.911027417745
+30
+2076.74494872451
+11
+-815.319529832985
+21
+-815.188756027286
+31
+2086.22194499561
+12
+-827.129718036832
+22
+-803.86513828916
+32
+2069.83607643134
+13
+-827.129718036832
+23
+-803.86513828916
+33
+2069.83607643134
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-815.319529832985
+20
+-815.188756027286
+30
+2086.22194499561
+11
+-781.183382327347
+21
+-739.911027417745
+31
+2076.74494872451
+12
+-766.822004083969
+22
+-754.694855069672
+32
+2097.20410948883
+13
+-766.822004083969
+23
+-754.694855069672
+33
+2097.20410948883
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-746.579505030633
+20
+-772.239793008819
+30
+2108.60809856919
+11
+-783.644995364665
+21
+-846.504456965985
+31
+2095.12279472996
+12
+-800.049725864573
+22
+-830.16169359091
+32
+2095.10145963194
+13
+-800.049725864573
+23
+-830.16169359091
+33
+2095.10145963194
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-783.644995364665
+20
+-846.504456965985
+30
+2095.12279472996
+11
+-746.579505030633
+21
+-772.239793008819
+31
+2108.60809856919
+12
+-723.84293286299
+22
+-790.84270017674
+32
+2109.1268343449
+13
+-723.84293286299
+23
+-790.84270017674
+33
+2109.1268343449
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-703.270205185374
+20
+-808.916878172158
+30
+2098.19892992261
+11
+-757.213205686422
+21
+-873.517548449742
+31
+2069.9270060351
+12
+-768.602809842621
+22
+-861.72900857618
+32
+2086.28270221439
+13
+-768.602809842621
+23
+-861.72900857618
+33
+2086.28270221439
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-757.213205686422
+20
+-873.517548449742
+30
+2069.9270060351
+11
+-703.270205185374
+21
+-808.916878172158
+31
+2098.19892992261
+12
+-688.216174174222
+22
+-823.534449985187
+32
+2077.42717273413
+13
+-688.216174174222
+23
+-823.534449985187
+33
+2077.42717273413
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-766.822004083969
+20
+-754.694855069672
+30
+2097.20410948883
+11
+-800.049725864573
+21
+-830.16169359091
+31
+2095.10145963194
+12
+-815.319529832985
+22
+-815.188756027286
+32
+2086.22194499561
+13
+-815.319529832985
+23
+-815.188756027286
+33
+2086.22194499561
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-800.049725864573
+20
+-830.16169359091
+30
+2095.10145963194
+11
+-766.822004083969
+21
+-754.694855069672
+31
+2097.20410948883
+12
+-761.149821895316
+22
+-761.14982219046
+32
+2100.64485501639
+13
+-761.149821895316
+23
+-761.14982219046
+33
+2100.64485501639
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-800.049725864573
+20
+-830.16169359091
+30
+2095.10145963194
+11
+-761.149821895316
+21
+-761.14982219046
+31
+2100.64485501639
+12
+-746.579505030633
+22
+-772.239793008819
+32
+2108.60809856919
+13
+-746.579505030633
+23
+-772.239793008819
+33
+2108.60809856919
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-801.544845731016
+20
+-831.814429411314
+30
+1978.70958937363
+11
+-766.91292419702
+21
+-754.581509059306
+31
+1973.17973333127
+12
+-816.587031253059
+22
+-816.589877801121
+32
+1987.54968188919
+13
+-816.587031253059
+23
+-816.589877801121
+33
+1987.54968188919
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-766.91292419702
+20
+-754.581509059306
+30
+1973.17973333127
+11
+-801.544845731016
+21
+-831.814429411314
+31
+1978.70958937363
+12
+-761.145931803741
+22
+-761.14593180374
+32
+1969.69450846846
+13
+-761.145931803741
+23
+-761.14593180374
+33
+1969.69450846846
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.145931803741
+20
+-761.14593180374
+30
+1969.69450846846
+11
+-801.544845731016
+21
+-831.814429411314
+31
+1978.70958937363
+12
+-746.546206077474
+22
+-772.245716838241
+32
+1961.59984211439
+13
+-746.546206077474
+23
+-772.245716838241
+33
+1961.59984211439
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-203.671280618918
+20
+-1023.92467246733
+30
+1812.39759571907
+11
+-381.734128610353
+21
+-921.587710511788
+31
+1708.93950189862
+12
+-194.606371158736
+22
+-978.352295145615
+32
+1708.93950189862
+13
+-194.606371158736
+23
+-978.352295145615
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-381.734128610353
+20
+-921.587710511788
+30
+1708.93950189862
+11
+-203.671280618918
+21
+-1023.92467246733
+31
+1812.39759571907
+12
+-399.515588143821
+22
+-964.515951276276
+32
+1812.39759571907
+13
+-399.515588143821
+23
+-964.515951276276
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+1241.03564002131
+11
+528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+594.593536632776
+22
+-594.593536632775
+32
+1241.03564002131
+13
+594.593536632776
+23
+-594.593536632775
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+528.527588401294
+20
+-528.527588401294
+30
+1427.8983600213
+11
+699.168033082722
+21
+-467.169144021928
+31
+1241.03564002131
+12
+621.482696406623
+22
+-415.26146157539
+32
+1427.8983600213
+13
+621.482696406623
+23
+-415.26146157539
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.010701420772
+20
+-493.122985245198
+30
+1427.8983600213
+11
+561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+627.626510748516
+22
+-627.626510748516
+32
+1427.8983600213
+13
+627.626510748516
+23
+-627.626510748516
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+561.560562517035
+20
+-561.560562517035
+30
+1614.7610800213
+11
+738.010701420772
+21
+-493.122985245198
+31
+1427.8983600213
+12
+660.325364744673
+22
+-441.215302798659
+32
+1614.7610800213
+13
+660.325364744673
+23
+-441.215302798659
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.670394770277
+20
+-660.670394770277
+30
+1614.7610800213
+11
+829.407026995336
+21
+-554.192057578438
+31
+1708.93950189862
+12
+705.352696568272
+22
+-705.352696568272
+32
+1708.93950189862
+13
+705.352696568272
+23
+-705.352696568272
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+829.407026995336
+20
+-554.192057578438
+30
+1708.93950189862
+11
+660.670394770277
+21
+-660.670394770277
+31
+1614.7610800213
+12
+705.689442544718
+22
+-605.814526338507
+32
+1614.7610800213
+13
+705.689442544718
+23
+-605.814526338507
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+829.407026995336
+20
+-554.192057578438
+30
+1708.93950189862
+11
+705.689442544718
+21
+-605.814526338507
+31
+1614.7610800213
+12
+765.568628348261
+22
+-532.851527327553
+32
+1614.7610800213
+13
+765.568628348261
+23
+-532.851527327553
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+829.407026995336
+20
+-554.192057578438
+30
+1708.93950189862
+11
+765.568628348261
+21
+-532.851527327553
+31
+1614.7610800213
+12
+776.866198451135
+22
+-519.085398326623
+32
+1614.7610800213
+13
+776.866198451135
+23
+-519.085398326623
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+705.352696568272
+20
+-705.352696568272
+30
+1708.93950189862
+11
+868.04142298445
+21
+-580.006735667279
+31
+1812.39759571907
+12
+738.20854961057
+22
+-738.20854961057
+32
+1812.39759571907
+13
+738.20854961057
+23
+-738.20854961057
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+1812.39759571907
+11
+705.352696568272
+21
+-705.352696568272
+31
+1708.93950189862
+12
+829.407026995336
+22
+-554.192057578438
+32
+1708.93950189862
+13
+829.407026995336
+23
+-554.192057578438
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+2455.6433200213
+11
+798.491402853314
+21
+-250.528327323719
+31
+2549.0746800213
+12
+776.87389411925
+22
+-321.791703197793
+32
+2549.0746800213
+13
+776.87389411925
+23
+-321.791703197793
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+798.491402853314
+20
+-250.528327323719
+30
+2549.0746800213
+11
+776.87389411925
+21
+-321.791703197793
+31
+2455.6433200213
+12
+824.724927080674
+22
+-164.047987682633
+32
+2455.6433200213
+13
+824.724927080674
+23
+-164.047987682633
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+798.491402853314
+20
+-250.528327323719
+30
+2549.0746800213
+11
+824.724927080674
+21
+-164.047987682633
+31
+2455.6433200213
+12
+823.17232140581
+22
+-169.166242665351
+32
+2549.0746800213
+13
+823.17232140581
+23
+-169.166242665351
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+823.17232140581
+20
+-169.166242665351
+30
+2549.0746800213
+11
+824.724927080674
+21
+-164.047987682633
+31
+2455.6433200213
+12
+824.724927080674
+22
+-164.047987682633
+32
+2549.0746800213
+13
+824.724927080674
+23
+-164.047987682633
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.871895956044
+20
+-750.87609961724
+30
+2252.83778292244
+11
+180.675224578544
+21
+-794.16651328432
+31
+2257.10151651642
+12
+180.675224578544
+22
+-750.87609961724
+32
+2252.83778292244
+13
+180.675224578544
+23
+-750.87609961724
+33
+2252.83778292244
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+2257.10151651642
+11
+724.871895956044
+21
+-750.87609961724
+31
+2252.83778292244
+12
+670.391151613542
+22
+-794.16651328432
+32
+2257.10151651642
+13
+670.391151613542
+23
+-794.16651328432
+33
+2257.10151651642
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+892.684338449561
+20
+-596.472605357118
+30
+2133.80356487023
+11
+180.675224578544
+21
+-589.158254916404
+31
+2120.11937767794
+12
+897.900697882446
+22
+-589.158254916404
+32
+2120.11937767794
+13
+897.900697882446
+23
+-589.158254916404
+33
+2120.11937767794
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-589.158254916404
+30
+2120.11937767794
+11
+892.684338449561
+21
+-596.472605357118
+31
+2133.80356487023
+12
+180.675224578544
+22
+-609.663955206589
+32
+2158.48284461247
+13
+180.675224578544
+23
+-609.663955206589
+33
+2158.48284461247
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-609.663955206589
+30
+2158.48284461247
+11
+892.684338449561
+21
+-596.472605357118
+31
+2133.80356487023
+12
+884.794335210004
+22
+-604.173875548016
+32
+2148.21162800104
+13
+884.794335210004
+23
+-604.173875548016
+33
+2148.21162800104
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-609.663955206589
+30
+2158.48284461247
+11
+884.794335210004
+21
+-604.173875548016
+31
+2148.21162800104
+12
+876.866128931272
+22
+-609.663955206588
+32
+2158.48284461247
+13
+876.866128931272
+23
+-609.663955206588
+33
+2158.48284461247
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-879.083714298799
+30
+1830.19391829555
+11
+180.675224578544
+21
+-837.4569269514
+31
+1817.56657040449
+12
+180.675224578544
+22
+-879.083714298798
+32
+1830.19391829555
+13
+180.675224578544
+23
+-879.083714298798
+33
+1830.19391829555
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-837.4569269514
+30
+1817.56657040449
+11
+653.750224578544
+21
+-879.083714298799
+31
+1830.19391829555
+12
+653.750224578544
+22
+-837.4569269514
+32
+1817.56657040449
+13
+653.750224578544
+23
+-837.4569269514
+33
+1817.56657040449
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+575.888850875701
+20
+-575.888850875701
+30
+682.822310520627
+11
+694.940121314314
+21
+-464.344143695271
+31
+738.078199114136
+12
+590.997993226901
+22
+-590.997993226901
+32
+738.078199114136
+13
+590.997993226901
+23
+-590.997993226901
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+694.940121314314
+20
+-464.344143695271
+30
+738.078199114136
+11
+575.888850875701
+21
+-575.888850875701
+31
+682.822310520627
+12
+677.173649450057
+22
+-452.47296672438
+32
+682.822310520627
+13
+677.173649450057
+23
+-452.47296672438
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+406.150722558891
+20
+-980.534582769308
+30
+1879.38487239655
+11
+203.671280618918
+21
+-1023.92467246733
+31
+1812.39759571907
+12
+399.51558814382
+22
+-964.515951276276
+32
+1812.39759571907
+13
+399.51558814382
+23
+-964.515951276276
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+203.671280618918
+20
+-1023.92467246733
+30
+1812.39759571907
+11
+406.150722558891
+21
+-980.534582769308
+31
+1879.38487239655
+12
+209.215453044867
+22
+-1051.79710945546
+32
+1922.19277204157
+13
+209.215453044867
+23
+-1051.79710945546
+33
+1922.19277204157
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+1922.19277204157
+11
+406.150722558891
+21
+-980.534582769308
+31
+1879.38487239655
+12
+369.41031965462
+22
+-997.119327169824
+32
+1899.59344191956
+13
+369.41031965462
+23
+-997.119327169824
+33
+1899.59344191956
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+1922.19277204157
+11
+369.41031965462
+21
+-997.119327169824
+31
+1899.59344191956
+12
+349.642861592144
+22
+-1009.19892078507
+32
+1922.19277204157
+13
+349.642861592144
+23
+-1009.19892078507
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-921.587710511788
+20
+-381.734128610352
+30
+2361.46489814399
+11
+-1023.92467246733
+21
+-203.671280618918
+31
+2258.00680432354
+12
+-964.515951276275
+22
+-399.515588143821
+32
+2258.00680432354
+13
+-964.515951276275
+23
+-399.515588143821
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1023.92467246733
+20
+-203.671280618918
+30
+2258.00680432354
+11
+-921.587710511788
+21
+-381.734128610352
+31
+2361.46489814399
+12
+-978.352295145615
+22
+-194.606371158736
+32
+2361.46489814399
+13
+-978.352295145615
+23
+-194.606371158736
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1059.21725479392
+20
+-210.691411720441
+30
+2058.8118770109
+11
+990.771212819308
+21
+-410.390873558597
+31
+2148.21162800104
+12
+997.760836892423
+22
+-413.286070645571
+32
+2058.8118770109
+13
+997.760836892423
+23
+-413.286070645571
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+990.771212819308
+20
+-410.390873558597
+30
+2148.21162800104
+11
+1059.21725479392
+21
+-210.691411720441
+31
+2058.8118770109
+12
+1051.79710945546
+22
+-209.215453044867
+32
+2148.21162800104
+13
+1051.79710945546
+23
+-209.215453044867
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-868.041422984449
+20
+-580.006735667279
+30
+2258.00680432354
+11
+-990.771212819307
+21
+-410.390873558597
+31
+2148.21162800104
+12
+-891.670534105406
+22
+-595.795202951324
+32
+2148.21162800104
+13
+-891.670534105406
+23
+-595.795202951324
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-990.771212819307
+20
+-410.390873558597
+30
+2148.21162800104
+11
+-868.041422984449
+21
+-580.006735667279
+31
+2258.00680432354
+12
+-964.515951276275
+22
+-399.515588143821
+32
+2258.00680432354
+13
+-964.515951276275
+23
+-399.515588143821
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-829.407026995335
+20
+-554.192057578438
+30
+2361.46489814399
+11
+-964.515951276275
+21
+-399.515588143821
+31
+2258.00680432354
+12
+-868.041422984449
+22
+-580.006735667279
+32
+2258.00680432354
+13
+-868.041422984449
+23
+-580.006735667279
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-964.515951276275
+20
+-399.515588143821
+30
+2258.00680432354
+11
+-829.407026995335
+21
+-554.192057578438
+31
+2361.46489814399
+12
+-921.587710511788
+22
+-381.734128610352
+32
+2361.46489814399
+13
+-921.587710511788
+23
+-381.734128610352
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.866198451135
+20
+-519.085398326623
+30
+2455.6433200213
+11
+-921.587710511788
+21
+-381.734128610352
+31
+2361.46489814399
+12
+-829.407026995335
+22
+-554.192057578438
+32
+2361.46489814399
+13
+-829.407026995335
+23
+-554.192057578438
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-921.587710511788
+20
+-381.734128610352
+30
+2361.46489814399
+11
+-776.866198451135
+21
+-519.085398326623
+31
+2455.6433200213
+12
+-813.095615905849
+22
+-451.304925633068
+32
+2455.6433200213
+13
+-813.095615905849
+23
+-451.304925633068
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-921.587710511788
+20
+-381.734128610352
+30
+2361.46489814399
+11
+-813.095615905849
+21
+-451.304925633068
+31
+2455.6433200213
+12
+-857.607798059122
+22
+-368.028490102694
+32
+2455.6433200213
+13
+-857.607798059122
+23
+-368.028490102694
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-921.587710511788
+20
+-381.734128610352
+30
+2361.46489814399
+11
+-857.607798059122
+21
+-368.028490102694
+31
+2455.6433200213
+12
+-863.207469797099
+22
+-357.552241131722
+32
+2455.6433200213
+13
+-863.207469797099
+23
+-357.552241131722
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.060123058849
+20
+-874.453748088142
+30
+2003.99630767223
+11
+-683.329149560927
+21
+-829.573232448602
+31
+2011.5925230317
+12
+-687.957452549297
+22
+-823.760435027841
+32
+1993.10258668608
+13
+-687.957452549297
+23
+-823.760435027841
+33
+1993.10258668608
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-683.329149560927
+20
+-829.573232448602
+30
+2011.5925230317
+11
+-758.060123058849
+21
+-874.453748088142
+31
+2003.99630767223
+12
+-751.507544713982
+22
+-880.404127848991
+32
+2025.39393021379
+13
+-751.507544713982
+23
+-880.404127848991
+33
+2025.39393021379
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-683.329149560927
+20
+-829.573232448602
+30
+2011.5925230317
+11
+-751.507544713982
+21
+-880.404127848991
+31
+2025.39393021379
+12
+-680.414811030127
+22
+-831.964968270127
+32
+2020.57508939225
+13
+-680.414811030127
+23
+-831.964968270127
+33
+2020.57508939225
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-785.140115231108
+20
+-848.157192786392
+30
+1978.73092447164
+11
+-746.546206077474
+21
+-772.245716838241
+31
+1961.59984211439
+12
+-801.544845731016
+22
+-831.814429411314
+32
+1978.70958937363
+13
+-801.544845731016
+23
+-831.814429411314
+33
+1978.70958937363
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-746.546206077474
+20
+-772.245716838241
+30
+1961.59984211439
+11
+-785.140115231108
+21
+-848.157192786392
+31
+1978.73092447164
+12
+-723.636295253065
+22
+-790.983771266745
+32
+1961.01586348506
+13
+-723.636295253065
+23
+-790.983771266745
+33
+1961.01586348506
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-757.213205686422
+20
+-873.517548449742
+30
+2069.9270060351
+11
+-680.521947020029
+21
+-831.877044035484
+31
+2050.14904337117
+12
+-751.210146881832
+22
+-880.075378254302
+32
+2048.54571267062
+13
+-751.210146881832
+23
+-880.075378254302
+33
+2048.54571267062
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-680.521947020029
+20
+-831.877044035484
+30
+2050.14904337117
+11
+-757.213205686422
+21
+-873.517548449742
+31
+2069.9270060351
+12
+-683.397324988288
+22
+-829.51728232132
+32
+2058.8118770109
+13
+-683.397324988288
+23
+-829.51728232132
+33
+2058.8118770109
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-683.397324988288
+20
+-829.51728232132
+30
+2058.8118770109
+11
+-757.213205686422
+21
+-873.517548449742
+31
+2069.9270060351
+12
+-688.216174174222
+22
+-823.534449985187
+32
+2077.42717273413
+13
+-688.216174174222
+23
+-823.534449985187
+33
+2077.42717273413
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-816.587031253059
+20
+-816.589877801121
+30
+1987.54968188919
+11
+-781.308061641118
+21
+-739.778791807586
+31
+1993.80290570042
+12
+-827.976635409257
+22
+-804.801337927561
+32
+2003.90537806848
+13
+-827.976635409257
+23
+-804.801337927561
+33
+2003.90537806848
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.308061641118
+20
+-739.778791807586
+30
+1993.80290570042
+11
+-816.587031253059
+21
+-816.589877801121
+31
+1987.54968188919
+12
+-766.91292419702
+22
+-754.581509059306
+32
+1973.17973333127
+13
+-766.91292419702
+23
+-754.581509059306
+33
+1973.17973333127
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-464.344143695271
+20
+-694.940121314314
+30
+738.078199114136
+11
+-575.888850875701
+21
+-575.888850875701
+31
+682.822310520627
+12
+-452.472966724379
+22
+-677.173649450057
+32
+682.822310520627
+13
+-452.472966724379
+23
+-677.173649450057
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-575.888850875701
+20
+-575.888850875701
+30
+682.822310520627
+11
+-464.344143695271
+21
+-694.940121314314
+31
+738.078199114136
+12
+-590.997993226901
+22
+-590.997993226901
+32
+738.078199114136
+13
+-590.997993226901
+23
+-590.997993226901
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+577.57828073944
+20
+-864.406983345072
+30
+1802.66501966685
+11
+381.734128610352
+21
+-921.587710511788
+31
+1708.93950189862
+12
+554.192057578438
+22
+-829.407026995336
+32
+1708.93950189862
+13
+554.192057578438
+23
+-829.407026995336
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+1708.93950189862
+11
+577.57828073944
+21
+-864.406983345072
+31
+1802.66501966685
+12
+399.51558814382
+22
+-964.515951276276
+32
+1812.39759571907
+13
+399.51558814382
+23
+-964.515951276276
+33
+1812.39759571907
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+399.51558814382
+20
+-964.515951276276
+30
+1812.39759571907
+11
+577.57828073944
+21
+-864.406983345072
+31
+1802.66501966685
+12
+540.896876185886
+22
+-887.575434400246
+32
+1809.69309245876
+13
+540.896876185886
+23
+-887.575434400246
+33
+1809.69309245876
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+399.51558814382
+20
+-964.515951276276
+30
+1812.39759571907
+11
+540.896876185886
+21
+-887.575434400246
+31
+1809.69309245876
+12
+533.995007415167
+22
+-892.635204119545
+32
+1812.39759571907
+13
+533.995007415167
+23
+-892.635204119545
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.35466353334
+20
+-731.718944065101
+30
+1933.51796332002
+11
+-891.670534105406
+21
+-595.795202951324
+31
+1922.19277204157
+12
+-761.987076679027
+22
+-753.814953035805
+32
+1922.19277204157
+13
+-761.987076679027
+23
+-753.814953035805
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-891.670534105406
+20
+-595.795202951324
+30
+1922.19277204157
+11
+-781.35466353334
+21
+-731.718944065101
+31
+1933.51796332002
+12
+-804.883917627287
+22
+-707.527532613081
+32
+1967.25758629213
+13
+-804.883917627287
+23
+-707.527532613081
+33
+1967.25758629213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-891.670534105406
+20
+-595.795202951324
+30
+1922.19277204157
+11
+-804.883917627287
+21
+-707.527532613081
+31
+1967.25758629213
+12
+-818.480102290147
+22
+-696.846172894875
+32
+2011.59249120966
+13
+-818.480102290147
+23
+-696.846172894875
+33
+2011.59249120966
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-891.670534105406
+20
+-595.795202951324
+30
+1922.19277204157
+11
+-818.480102290147
+21
+-696.846172894875
+31
+2011.59249120966
+12
+-897.961029579872
+22
+-599.99837764929
+32
+2011.5925230317
+13
+-897.961029579872
+23
+-599.99837764929
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1051.79710945546
+20
+-209.215453044867
+30
+2148.21162800104
+11
+-1079.96854760957
+21
+3.60955709766131e-13
+31
+2058.8118770109
+12
+-1059.21725479392
+22
+-210.691411720441
+32
+2058.8118770109
+13
+-1059.21725479392
+23
+-210.691411720441
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1079.96854760957
+20
+3.60955709766131e-13
+30
+2058.8118770109
+11
+-1051.79710945546
+21
+-209.215453044867
+31
+2148.21162800104
+12
+-1072.40303302985
+22
+3.60955709766131e-13
+32
+2148.21162800104
+13
+-1072.40303302985
+23
+3.60955709766131e-13
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-832.543811724793
+20
+-84.6615196498334
+30
+2549.0746800213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+2549.0746800213
+12
+-840.882243605455
+22
+1.80477854883065e-13
+32
+2549.0746800213
+13
+-840.882243605455
+23
+1.80477854883065e-13
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+-832.543811724793
+21
+-84.6615196498334
+31
+2549.0746800213
+12
+-824.724927080674
+22
+-164.047987682633
+32
+2549.0746800213
+13
+-824.724927080674
+23
+-164.047987682633
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+-824.724927080674
+21
+-164.047987682633
+31
+2549.0746800213
+12
+-823.172319072743
+22
+-169.166250356441
+32
+2549.0746800213
+13
+-823.172319072743
+23
+-169.166250356441
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+-823.172319072743
+21
+-169.166250356441
+31
+2549.0746800213
+12
+-798.491399420167
+22
+-250.528338641286
+32
+2549.0746800213
+13
+-798.491399420167
+23
+-250.528338641286
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+-798.491399420167
+21
+-250.528338641286
+31
+2549.0746800213
+12
+-776.87389411925
+22
+-321.791703197793
+32
+2549.0746800213
+13
+-776.87389411925
+23
+-321.791703197793
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+-776.87389411925
+21
+-321.791703197793
+31
+2549.0746800213
+12
+-771.834238188426
+22
+-331.220236285058
+32
+2549.0746800213
+13
+-771.834238188426
+23
+-331.220236285058
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+-771.834238188426
+21
+-331.220236285058
+31
+2549.0746800213
+12
+-731.773964383885
+22
+-406.167737113607
+32
+2549.0746800213
+13
+-731.773964383885
+23
+-406.167737113607
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+-731.773964383885
+21
+-406.167737113607
+31
+2549.0746800213
+12
+-733.088824464619
+22
+-145.820433573828
+32
+2549.0746800213
+13
+-733.088824464619
+23
+-145.820433573828
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-733.088824464619
+20
+-145.820433573828
+30
+2549.0746800213
+11
+-731.773964383885
+21
+-406.167737113607
+31
+2549.0746800213
+12
+-690.554572920556
+22
+-286.037069662455
+32
+2549.0746800213
+13
+-690.554572920556
+23
+-286.037069662455
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+-731.773964383885
+21
+-406.167737113607
+31
+2549.0746800213
+12
+-699.168033082722
+22
+-467.169144021929
+32
+2549.0746800213
+13
+-699.168033082722
+23
+-467.169144021929
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+-699.168033082722
+21
+-467.169144021929
+31
+2549.0746800213
+12
+-689.000369065216
+22
+-479.558478474255
+32
+2549.0746800213
+13
+-689.000369065216
+23
+-479.558478474255
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+-689.000369065216
+21
+-479.558478474255
+31
+2549.0746800213
+12
+-621.482696406623
+22
+-415.26146157539
+32
+2549.0746800213
+13
+-621.482696406623
+23
+-415.26146157539
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+2549.0746800213
+11
+-689.000369065216
+21
+-479.558478474255
+31
+2549.0746800213
+12
+-635.110018052195
+22
+-545.224061178794
+32
+2549.0746800213
+13
+-635.110018052195
+23
+-545.224061178794
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+2549.0746800213
+11
+-635.110018052195
+21
+-545.224061178794
+31
+2549.0746800213
+12
+-594.593536632776
+22
+-594.593536632776
+32
+2549.0746800213
+13
+-594.593536632776
+23
+-594.593536632776
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+2549.0746800213
+11
+-594.593536632776
+21
+-594.593536632776
+31
+2549.0746800213
+12
+-528.527588401294
+22
+-528.527588401294
+32
+2549.0746800213
+13
+-528.527588401294
+23
+-528.527588401294
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+-594.593536632776
+21
+-594.593536632776
+31
+2549.0746800213
+12
+-578.08321102903
+22
+-608.143210685445
+32
+2549.0746800213
+13
+-578.08321102903
+23
+-608.143210685445
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+-578.08321102903
+21
+-608.143210685445
+31
+2549.0746800213
+12
+-512.438676164039
+22
+-662.016288182956
+32
+2549.0746800213
+13
+-512.438676164039
+23
+-662.016288182956
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+-512.438676164039
+21
+-662.016288182956
+31
+2549.0746800213
+12
+-415.26146157539
+22
+-621.482696406623
+32
+2549.0746800213
+13
+-415.26146157539
+23
+-621.482696406623
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+-512.438676164039
+21
+-662.016288182956
+31
+2549.0746800213
+12
+-467.169144021929
+22
+-699.168033082722
+32
+2549.0746800213
+13
+-467.169144021929
+23
+-699.168033082722
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+-467.169144021929
+21
+-699.168033082722
+31
+2549.0746800213
+12
+-443.635339973588
+22
+-711.747113417844
+32
+2549.0746800213
+13
+-443.635339973588
+23
+-711.747113417844
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+-443.635339973588
+21
+-711.747113417844
+31
+2549.0746800213
+12
+-368.760188696337
+22
+-751.768715581535
+32
+2549.0746800213
+13
+-368.760188696337
+23
+-751.768715581535
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+-368.760188696337
+21
+-751.768715581535
+31
+2549.0746800213
+12
+-286.037069662455
+22
+-690.554572920556
+32
+2549.0746800213
+13
+-286.037069662455
+23
+-690.554572920556
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+-368.760188696337
+21
+-751.768715581535
+31
+2549.0746800213
+12
+-321.791703197793
+22
+-776.87389411925
+32
+2549.0746800213
+13
+-321.791703197793
+23
+-776.87389411925
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+-321.791703197793
+21
+-776.87389411925
+31
+2549.0746800213
+12
+-291.163466606751
+22
+-786.164868113883
+32
+2549.0746800213
+13
+-291.163466606751
+23
+-786.164868113883
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+-291.163466606751
+21
+-786.164868113883
+31
+2549.0746800213
+12
+-209.932194866118
+22
+-810.806105001612
+32
+2549.0746800213
+13
+-209.932194866118
+23
+-810.806105001612
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+-209.932194866118
+21
+-810.806105001612
+31
+2549.0746800213
+12
+-145.820433573828
+22
+-733.088824464619
+32
+2549.0746800213
+13
+-145.820433573828
+23
+-733.088824464619
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-145.820433573828
+20
+-733.088824464619
+30
+2549.0746800213
+11
+-209.932194866118
+21
+-810.806105001612
+31
+2549.0746800213
+12
+-164.047987682633
+22
+-824.724927080674
+32
+2549.0746800213
+13
+-164.047987682633
+23
+-824.724927080674
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-145.820433573828
+20
+-733.088824464619
+30
+2549.0746800213
+11
+-164.047987682633
+21
+-824.724927080674
+31
+2549.0746800213
+12
+-126.903621448811
+22
+-828.383327837855
+32
+2549.0746800213
+13
+-126.903621448811
+23
+-828.383327837855
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-145.820433573828
+20
+-733.088824464619
+30
+2549.0746800213
+11
+-126.903621448811
+21
+-828.383327837855
+31
+2549.0746800213
+12
+0.0
+22
+-747.450883605455
+32
+2549.0746800213
+13
+0.0
+23
+-747.450883605455
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-747.450883605455
+30
+2549.0746800213
+11
+-126.903621448811
+21
+-828.383327837855
+31
+2549.0746800213
+12
+-42.4327807980229
+22
+-836.702979476311
+32
+2549.0746800213
+13
+-42.4327807980229
+23
+-836.702979476311
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-747.450883605455
+30
+2549.0746800213
+11
+-42.4327807980229
+21
+-836.702979476311
+31
+2549.0746800213
+12
+0.0
+22
+-840.882243605455
+32
+2549.0746800213
+13
+0.0
+23
+-840.882243605455
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-747.450883605455
+30
+2549.0746800213
+11
+0.0
+21
+-840.882243605455
+31
+2549.0746800213
+12
+42.4327751671525
+22
+-836.702980030903
+32
+2549.0746800213
+13
+42.4327751671525
+23
+-836.702980030903
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-747.450883605455
+30
+2549.0746800213
+11
+42.4327751671525
+21
+-836.702980030903
+31
+2549.0746800213
+12
+145.820433573828
+22
+-733.088824464618
+32
+2549.0746800213
+13
+145.820433573828
+23
+-733.088824464618
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+145.820433573828
+20
+-733.088824464618
+30
+2549.0746800213
+11
+42.4327751671525
+21
+-836.702980030903
+31
+2549.0746800213
+12
+126.903660366379
+22
+-828.38332400481
+32
+2549.0746800213
+13
+126.903660366379
+23
+-828.38332400481
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+145.820433573828
+20
+-733.088824464618
+30
+2549.0746800213
+11
+126.903660366379
+21
+-828.38332400481
+31
+2549.0746800213
+12
+164.047987682633
+22
+-824.724927080674
+32
+2549.0746800213
+13
+164.047987682633
+23
+-824.724927080674
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+145.820433573828
+20
+-733.088824464618
+30
+2549.0746800213
+11
+164.047987682633
+21
+-824.724927080674
+31
+2549.0746800213
+12
+286.037069662455
+22
+-690.554572920556
+32
+2549.0746800213
+13
+286.037069662455
+23
+-690.554572920556
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+164.047987682633
+21
+-824.724927080674
+31
+2549.0746800213
+12
+209.932273259994
+22
+-810.806081221089
+32
+2549.0746800213
+13
+209.932273259994
+23
+-810.806081221089
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+209.932273259994
+21
+-810.806081221089
+31
+2549.0746800213
+12
+291.163503259545
+22
+-786.16485699538
+32
+2549.0746800213
+13
+291.163503259545
+23
+-786.16485699538
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+291.163503259545
+21
+-786.16485699538
+31
+2549.0746800213
+12
+415.26146157539
+22
+-621.482696406623
+32
+2549.0746800213
+13
+415.26146157539
+23
+-621.482696406623
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+291.163503259545
+21
+-786.16485699538
+31
+2549.0746800213
+12
+321.791703197793
+22
+-776.87389411925
+32
+2549.0746800213
+13
+321.791703197793
+23
+-776.87389411925
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+321.791703197793
+21
+-776.87389411925
+31
+2549.0746800213
+12
+368.760184385968
+22
+-751.768717885475
+32
+2549.0746800213
+13
+368.760184385968
+23
+-751.768717885475
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+368.760184385968
+21
+-751.768717885475
+31
+2549.0746800213
+12
+443.635403824213
+22
+-711.747079288974
+32
+2549.0746800213
+13
+443.635403824213
+23
+-711.747079288974
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+415.26146157539
+20
+-621.482696406623
+30
+2549.0746800213
+11
+443.635403824213
+21
+-711.747079288974
+31
+2549.0746800213
+12
+528.527588401294
+22
+-528.527588401294
+32
+2549.0746800213
+13
+528.527588401294
+23
+-528.527588401294
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+443.635403824213
+21
+-711.747079288974
+31
+2549.0746800213
+12
+467.169144021928
+22
+-699.168033082722
+32
+2549.0746800213
+13
+467.169144021928
+23
+-699.168033082722
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+467.169144021928
+21
+-699.168033082722
+31
+2549.0746800213
+12
+512.438726622327
+22
+-662.016246772909
+32
+2549.0746800213
+13
+512.438726622327
+23
+-662.016246772909
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+512.438726622327
+21
+-662.016246772909
+31
+2549.0746800213
+12
+578.083233221301
+22
+-608.143192472719
+32
+2549.0746800213
+13
+578.083233221301
+23
+-608.143192472719
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+578.083233221301
+21
+-608.143192472719
+31
+2549.0746800213
+12
+621.482696406623
+22
+-415.26146157539
+32
+2549.0746800213
+13
+621.482696406623
+23
+-415.26146157539
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+621.482696406623
+20
+-415.26146157539
+30
+2549.0746800213
+11
+578.083233221301
+21
+-608.143192472719
+31
+2549.0746800213
+12
+594.593536632776
+22
+-594.593536632776
+32
+2549.0746800213
+13
+594.593536632776
+23
+-594.593536632776
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+621.482696406623
+20
+-415.26146157539
+30
+2549.0746800213
+11
+594.593536632776
+21
+-594.593536632776
+31
+2549.0746800213
+12
+635.110015865962
+22
+-545.224063842726
+32
+2549.0746800213
+13
+635.110015865962
+23
+-545.224063842726
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+621.482696406623
+20
+-415.26146157539
+30
+2549.0746800213
+11
+635.110015865962
+21
+-545.224063842726
+31
+2549.0746800213
+12
+690.554572920556
+22
+-286.037069662455
+32
+2549.0746800213
+13
+690.554572920556
+23
+-286.037069662455
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+635.110015865962
+21
+-545.224063842726
+31
+2549.0746800213
+12
+689.000383427084
+22
+-479.558460974267
+32
+2549.0746800213
+13
+689.000383427084
+23
+-479.558460974267
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+689.000383427084
+21
+-479.558460974267
+31
+2549.0746800213
+12
+699.168033082722
+22
+-467.169144021929
+32
+2549.0746800213
+13
+699.168033082722
+23
+-467.169144021929
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+699.168033082722
+21
+-467.169144021929
+31
+2549.0746800213
+12
+733.088824464618
+22
+-145.820433573828
+32
+2549.0746800213
+13
+733.088824464618
+23
+-145.820433573828
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+733.088824464618
+20
+-145.820433573828
+30
+2549.0746800213
+11
+699.168033082722
+21
+-467.169144021929
+31
+2549.0746800213
+12
+731.773963185201
+22
+-406.167739356189
+32
+2549.0746800213
+13
+731.773963185201
+23
+-406.167739356189
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+733.088824464618
+20
+-145.820433573828
+30
+2549.0746800213
+11
+731.773963185201
+21
+-406.167739356189
+31
+2549.0746800213
+12
+771.834245650684
+22
+-331.220222324155
+32
+2549.0746800213
+13
+771.834245650684
+23
+-331.220222324155
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+733.088824464618
+20
+-145.820433573828
+30
+2549.0746800213
+11
+771.834245650684
+21
+-331.220222324155
+31
+2549.0746800213
+12
+747.450883605455
+22
+1.80477854883065e-13
+32
+2549.0746800213
+13
+747.450883605455
+23
+1.80477854883065e-13
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+747.450883605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+771.834245650684
+21
+-331.220222324155
+31
+2549.0746800213
+12
+840.882243605455
+22
+1.80477854883065e-13
+32
+2549.0746800213
+13
+840.882243605455
+23
+1.80477854883065e-13
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+840.882243605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+771.834245650684
+21
+-331.220222324155
+31
+2549.0746800213
+12
+776.87389411925
+22
+-321.791703197793
+32
+2549.0746800213
+13
+776.87389411925
+23
+-321.791703197793
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+840.882243605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+776.87389411925
+21
+-321.791703197793
+31
+2549.0746800213
+12
+798.491402853314
+22
+-250.528327323719
+32
+2549.0746800213
+13
+798.491402853314
+23
+-250.528327323719
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+840.882243605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+798.491402853314
+21
+-250.528327323719
+31
+2549.0746800213
+12
+823.17232140581
+22
+-169.166242665351
+32
+2549.0746800213
+13
+823.17232140581
+23
+-169.166242665351
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+840.882243605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+823.17232140581
+21
+-169.166242665351
+31
+2549.0746800213
+12
+824.724927080674
+22
+-164.047987682633
+32
+2549.0746800213
+13
+824.724927080674
+23
+-164.047987682633
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+840.882243605455
+20
+1.80477854883065e-13
+30
+2549.0746800213
+11
+824.724927080674
+21
+-164.047987682633
+31
+2549.0746800213
+12
+832.543812136584
+22
+-84.6615154688545
+32
+2549.0746800213
+13
+832.543812136584
+23
+-84.6615154688545
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+891.670534105407
+20
+-595.795202951324
+30
+1922.19277204157
+11
+892.68433542823
+21
+-596.472603338329
+31
+1936.60079223358
+12
+884.794355702396
+22
+-604.173850577965
+32
+1922.19277204157
+13
+884.794355702396
+23
+-604.173850577965
+33
+1922.19277204157
+70
+0
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+891.670534105407
+20
+-595.795202951324
+30
+1922.19277204157
+11
+897.90069342138
+21
+-589.158254916404
+31
+1950.28497564898
+12
+892.68433542823
+22
+-596.472603338329
+32
+1936.60079223358
+13
+892.68433542823
+23
+-596.472603338329
+33
+1936.60079223358
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+897.90069342138
+20
+-589.158254916404
+30
+1950.28497564898
+11
+891.670534105407
+21
+-595.795202951324
+31
+1922.19277204157
+12
+990.771212819308
+22
+-410.390873558597
+32
+1922.19277204157
+13
+990.771212819308
+23
+-410.390873558597
+33
+1922.19277204157
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+897.90069342138
+20
+-589.158254916404
+30
+1950.28497564898
+11
+990.771212819308
+21
+-410.390873558597
+31
+1922.19277204157
+12
+908.625259608371
+22
+-576.530907025343
+32
+1991.91176299638
+13
+908.625259608371
+23
+-576.530907025343
+33
+1991.91176299638
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+908.625259608371
+20
+-576.530907025343
+30
+1991.91176299638
+11
+990.771212819308
+21
+-410.390873558597
+31
+1922.19277204157
+12
+911.540741979581
+22
+-574.59252267949
+32
+2011.5925230317
+13
+911.540741979581
+23
+-574.59252267949
+33
+2011.5925230317
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+911.540741979581
+20
+-574.59252267949
+30
+2011.5925230317
+11
+990.771212819308
+21
+-410.390873558597
+31
+1922.19277204157
+12
+997.760836892423
+22
+-413.286070645571
+32
+2011.5925230317
+13
+997.760836892423
+23
+-413.286070645571
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+599.277053327022
+20
+-599.277053327022
+30
+796.153149972084
+11
+464.344143695271
+21
+-694.940121314314
+31
+738.078199114136
+12
+590.997993226901
+22
+-590.997993226901
+32
+738.078199114136
+13
+590.997993226901
+23
+-590.997993226901
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+464.344143695271
+20
+-694.940121314314
+30
+738.078199114136
+11
+599.277053327022
+21
+-599.277053327022
+31
+796.153149972084
+12
+470.84895947612
+22
+-704.67526609701
+32
+796.153149972084
+13
+470.84895947612
+23
+-704.67526609701
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-720.365482284693
+30
+1985.88990429309
+11
+104.493588061205
+21
+-712.163204861239
+31
+2001.23529816273
+12
+104.493591159588
+22
+-720.365490157703
+32
+1985.88990169709
+13
+104.493591159588
+23
+-720.365490157703
+33
+1985.88990169709
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493588061205
+20
+-712.163204861239
+30
+2001.23529816273
+11
+180.675224578544
+21
+-720.365482284693
+31
+1985.88990429309
+12
+180.675224578544
+22
+-712.163201305221
+32
+2001.23529268221
+13
+180.675224578544
+23
+-712.163201305221
+33
+2001.23529268221
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-677.173649450057
+20
+-452.47296672438
+30
+682.822310520627
+11
+-554.385481313987
+21
+-554.385481313987
+31
+631.979456702016
+12
+-575.888850875701
+22
+-575.888850875701
+32
+682.822310520627
+13
+-575.888850875701
+23
+-575.888850875701
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.385481313987
+20
+-554.385481313987
+30
+631.979456702016
+11
+-677.173649450057
+21
+-452.47296672438
+31
+682.822310520627
+12
+-651.888361812631
+22
+-435.577877671407
+32
+631.979456702016
+13
+-651.888361812631
+23
+-435.577877671407
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-694.940121314314
+20
+-464.344143695271
+30
+738.078199114136
+11
+-575.888850875701
+21
+-575.888850875701
+31
+682.822310520627
+12
+-590.997993226901
+22
+-590.997993226901
+32
+738.078199114136
+13
+-590.997993226901
+23
+-590.997993226901
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-575.888850875701
+20
+-575.888850875701
+30
+682.822310520627
+11
+-694.940121314314
+21
+-464.344143695271
+31
+738.078199114136
+12
+-677.173649450057
+22
+-452.47296672438
+32
+682.822310520627
+13
+-677.173649450057
+23
+-452.47296672438
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-43.0469725205787
+20
+-1075.72879087574
+30
+2051.86944523768
+11
+-38.8881027186488
+21
+-1076.06746493881
+31
+2059.65014337885
+12
+-39.3361654272124
+22
+-1076.09427347395
+32
+2058.8118770109
+13
+-39.3361654272124
+23
+-1076.09427347395
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-38.8881027186488
+20
+-1076.06746493881
+30
+2059.65014337885
+11
+-43.0469725205787
+21
+-1075.72879087574
+31
+2051.86944523768
+12
+-38.8881027186484
+22
+-975.735675994198
+32
+2059.65014337885
+13
+-38.8881027186484
+23
+-975.735675994198
+33
+2059.65014337885
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-38.8881027186484
+20
+-975.735675994198
+30
+2059.65014337885
+11
+-43.0469725205787
+21
+-1075.72879087574
+31
+2051.86944523768
+12
+-43.0469725205787
+22
+-975.791818816059
+32
+2051.86944523768
+13
+-43.0469725205787
+23
+-975.791818816059
+33
+2051.86944523768
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-891.670534105406
+20
+-595.795202951324
+30
+2148.21162800104
+11
+-780.975408992987
+21
+-732.34720289276
+31
+2135.63378054399
+12
+-759.379832416841
+22
+-756.991889361348
+32
+2148.21162800104
+13
+-759.379832416841
+23
+-756.991889361348
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-780.975408992987
+20
+-732.34720289276
+30
+2135.63378054399
+11
+-891.670534105406
+21
+-595.795202951324
+31
+2148.21162800104
+12
+-804.422958470166
+22
+-708.167767562713
+32
+2102.55187642937
+13
+-804.422958470166
+23
+-708.167767562713
+33
+2102.55187642937
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-804.422958470166
+20
+-708.167767562713
+30
+2102.55187642937
+11
+-891.670534105406
+21
+-595.795202951324
+31
+2148.21162800104
+12
+-818.273878310588
+22
+-697.096462294947
+32
+2058.80160712022
+13
+-818.273878310588
+23
+-697.096462294947
+33
+2058.80160712022
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-818.273878310588
+20
+-697.096462294947
+30
+2058.80160712022
+11
+-891.670534105406
+21
+-595.795202951324
+31
+2148.21162800104
+12
+-897.961029579872
+22
+-599.99837764929
+32
+2058.8118770109
+13
+-897.961029579872
+23
+-599.99837764929
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-595.795202951324
+20
+-891.670534105406
+30
+1922.19277204157
+11
+-738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+-580.006735667279
+22
+-868.04142298445
+32
+1812.39759571907
+13
+-580.006735667279
+23
+-868.04142298445
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.20854961057
+20
+-738.20854961057
+30
+1812.39759571907
+11
+-595.795202951324
+21
+-891.670534105406
+31
+1922.19277204157
+12
+-712.200510303116
+22
+-793.069743896677
+32
+1912.98147661467
+13
+-712.200510303116
+23
+-793.069743896677
+33
+1912.98147661467
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-712.200510303116
+20
+-793.069743896677
+30
+1912.98147661467
+11
+-595.795202951324
+21
+-891.670534105406
+31
+1922.19277204157
+12
+-697.04031921187
+22
+-808.580814515394
+32
+1922.19277204157
+13
+-697.04031921187
+23
+-808.580814515394
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.20854961057
+20
+-738.20854961057
+30
+1812.39759571907
+11
+-750.032010089465
+21
+-762.726244296354
+31
+1915.09420023775
+12
+-757.858868059522
+22
+-757.858868059522
+32
+1919.76361420147
+13
+-757.858868059522
+23
+-757.858868059522
+33
+1919.76361420147
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-750.032010089465
+20
+-762.726244296354
+30
+1915.09420023775
+11
+-738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+-712.200510303116
+22
+-793.069743896677
+32
+1912.98147661467
+13
+-712.200510303116
+23
+-793.069743896677
+33
+1912.98147661467
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-595.795202951324
+20
+-891.670534105406
+30
+1922.19277204157
+11
+-679.407718084958
+21
+-824.046894149155
+31
+1931.32901160226
+12
+-697.04031921187
+22
+-808.580814515394
+32
+1922.19277204157
+13
+-697.04031921187
+23
+-808.580814515394
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-679.407718084958
+20
+-824.046894149155
+30
+1931.32901160226
+11
+-595.795202951324
+21
+-891.670534105406
+31
+1922.19277204157
+12
+-599.99837764929
+22
+-897.961029579872
+32
+2011.5925230317
+13
+-599.99837764929
+23
+-897.961029579872
+33
+2011.5925230317
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-679.407718084958
+20
+-824.046894149155
+30
+1931.32901160226
+11
+-599.99837764929
+21
+-897.961029579872
+31
+2011.5925230317
+12
+-654.791104458432
+22
+-848.015122202593
+32
+1965.89490198638
+13
+-654.791104458432
+23
+-848.015122202593
+33
+1965.89490198638
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-654.791104458432
+20
+-848.015122202593
+30
+1965.89490198638
+11
+-599.99837764929
+21
+-897.961029579872
+31
+2011.5925230317
+12
+-643.970452120392
+22
+-861.831591212861
+32
+2011.20252653019
+13
+-643.970452120392
+23
+-861.831591212861
+33
+2011.20252653019
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-643.970452120392
+20
+-861.831591212861
+30
+2011.20252653019
+11
+-599.99837764929
+21
+-897.961029579872
+31
+2011.5925230317
+12
+-644.006839982028
+22
+-861.844217926399
+32
+2011.59252303171
+13
+-644.006839982028
+23
+-861.844217926399
+33
+2011.59252303171
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+914.026066884025
+11
+471.799768952456
+21
+-706.098253038493
+31
+855.37186879426
+12
+600.487204246519
+22
+-600.48720424652
+32
+855.37186879426
+13
+600.487204246519
+23
+-600.48720424652
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+471.799768952456
+20
+-706.098253038493
+30
+855.37186879426
+11
+594.593536632776
+21
+-594.593536632776
+31
+914.026066884025
+12
+467.169144021928
+22
+-699.168033082722
+32
+914.026066884025
+13
+467.169144021928
+23
+-699.168033082722
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+914.026066884025
+11
+462.461640169813
+21
+-462.461640169813
+31
+1054.1729200213
+12
+363.353779128852
+22
+-543.797359730523
+32
+1054.1729200213
+13
+363.353779128852
+23
+-543.797359730523
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+462.461640169813
+20
+-462.461640169813
+30
+1054.1729200213
+11
+467.169144021928
+21
+-699.168033082722
+31
+914.026066884025
+12
+594.593536632776
+22
+-594.593536632776
+32
+914.026066884025
+13
+594.593536632776
+23
+-594.593536632776
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+495.494614285553
+20
+-495.494614285553
+30
+1241.03564002131
+11
+441.215302798659
+21
+-660.325364744672
+31
+1054.1729200213
+12
+561.560562517035
+22
+-561.560562517035
+32
+1054.1729200213
+13
+561.560562517035
+23
+-561.560562517035
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+441.215302798659
+20
+-660.325364744672
+30
+1054.1729200213
+11
+495.494614285553
+21
+-495.494614285553
+31
+1241.03564002131
+12
+389.307620352121
+22
+-582.640028068573
+32
+1241.03564002131
+13
+389.307620352121
+23
+-582.640028068573
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+528.527588401294
+20
+-528.527588401294
+30
+1427.8983600213
+11
+467.169144021928
+21
+-699.168033082722
+31
+1241.03564002131
+12
+594.593536632776
+22
+-594.593536632775
+32
+1241.03564002131
+13
+594.593536632776
+23
+-594.593536632775
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+1241.03564002131
+11
+528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+415.26146157539
+22
+-621.482696406623
+32
+1427.8983600213
+13
+415.26146157539
+23
+-621.482696406623
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-916.376162171087
+20
+-182.278551827736
+30
+2455.6433200213
+11
+-997.519349743285
+21
+3.60955709766131e-13
+31
+2361.46489814399
+12
+-978.352295145615
+22
+-194.606371158736
+32
+2361.46489814399
+13
+-978.352295145615
+23
+-194.606371158736
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-997.519349743285
+20
+3.60955709766131e-13
+30
+2361.46489814399
+11
+-916.376162171087
+21
+-182.278551827736
+31
+2455.6433200213
+12
+-925.06395772174
+22
+-94.0698833092507
+32
+2455.6433200213
+13
+-925.06395772174
+23
+-94.0698833092507
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-997.519349743285
+20
+3.60955709766131e-13
+30
+2361.46489814399
+11
+-925.06395772174
+21
+-94.0698833092507
+31
+2455.6433200213
+12
+-934.329032542513
+22
+3.60955709766131e-13
+32
+2455.6433200213
+13
+-934.329032542513
+23
+3.60955709766131e-13
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-561.560562517035
+20
+-561.560562517035
+30
+1614.7610800213
+11
+-670.393897307106
+21
+-575.514299446691
+31
+1427.8983600213
+12
+-627.626510748516
+22
+-627.626510748516
+32
+1427.8983600213
+13
+-627.626510748516
+23
+-627.626510748516
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-670.393897307106
+20
+-575.514299446691
+30
+1427.8983600213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+-727.278190985583
+22
+-506.200587048885
+32
+1427.8983600213
+13
+-727.278190985583
+23
+-506.200587048885
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-727.278190985583
+20
+-506.200587048885
+30
+1427.8983600213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+-660.325364744672
+22
+-441.215302798659
+32
+1614.7610800213
+13
+-660.325364744672
+23
+-441.215302798659
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-727.278190985583
+20
+-506.200587048885
+30
+1427.8983600213
+11
+-660.325364744672
+21
+-441.215302798659
+31
+1614.7610800213
+12
+-738.010701420772
+22
+-493.122985245198
+32
+1427.8983600213
+13
+-738.010701420772
+23
+-493.122985245198
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+997.519349743285
+20
+1.80477854883065e-13
+30
+2361.46489814399
+11
+916.376162171087
+21
+-182.278551827737
+31
+2455.6433200213
+12
+978.352295145615
+22
+-194.606371158736
+32
+2361.46489814399
+13
+978.352295145615
+23
+-194.606371158736
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+916.376162171087
+20
+-182.278551827737
+30
+2455.6433200213
+11
+997.519349743285
+21
+1.80477854883065e-13
+31
+2361.46489814399
+12
+925.063958382437
+22
+-94.0698766010765
+32
+2455.6433200213
+13
+925.063958382437
+23
+-94.0698766010765
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+925.063958382437
+20
+-94.0698766010765
+30
+2455.6433200213
+11
+997.519349743285
+21
+1.80477854883065e-13
+31
+2361.46489814399
+12
+934.329032542513
+22
+1.80477854883065e-13
+32
+2455.6433200213
+13
+934.329032542513
+23
+1.80477854883065e-13
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-757.051052836406
+20
+-872.59583635536
+30
+2110.05176266305
+11
+-713.051374182295
+21
+-793.031288591004
+31
+2155.44278114838
+12
+-779.335772128321
+22
+-850.040945080999
+32
+2123.14819601944
+13
+-779.335772128321
+23
+-850.040945080999
+33
+2123.14819601944
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-713.051374182295
+20
+-793.031288591004
+30
+2155.44278114838
+11
+-757.051052836406
+21
+-872.59583635536
+31
+2110.05176266305
+12
+-700.811796716974
+22
+-805.485642916867
+32
+2148.21162800104
+13
+-700.811796716974
+23
+-805.485642916867
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-700.811796716974
+20
+-805.485642916867
+30
+2148.21162800104
+11
+-757.051052836406
+21
+-872.59583635536
+31
+2110.05176266305
+12
+-680.351354626835
+22
+-823.413171149779
+32
+2137.7839549476
+13
+-680.351354626835
+23
+-823.413171149779
+33
+2137.7839549476
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-803.639076572628
+20
+-825.829443784589
+30
+2123.11658846682
+11
+-780.975408992987
+21
+-732.34720289276
+31
+2135.63378054399
+12
+-826.261008377686
+22
+-803.647314060702
+32
+2109.96175196855
+13
+-826.261008377686
+23
+-803.647314060702
+33
+2109.96175196855
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-780.975408992987
+20
+-732.34720289276
+30
+2135.63378054399
+11
+-803.639076572628
+21
+-825.829443784589
+31
+2123.11658846682
+12
+-759.379832416841
+22
+-756.991889361348
+32
+2148.21162800104
+13
+-759.379832416841
+23
+-756.991889361348
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-759.379832416841
+20
+-756.991889361348
+30
+2148.21162800104
+11
+-803.639076572628
+21
+-825.829443784589
+31
+2123.11658846682
+12
+-758.175252738136
+22
+-758.175252738136
+32
+2148.91211343617
+13
+-758.175252738136
+23
+-758.175252738136
+33
+2148.91211343617
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.175252738136
+20
+-758.175252738136
+30
+2148.91211343617
+11
+-803.639076572628
+21
+-825.829443784589
+31
+2123.11658846682
+12
+-750.226480623555
+22
+-763.163737563064
+32
+2153.51833793914
+13
+-750.226480623555
+23
+-763.163737563064
+33
+2153.51833793914
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-471.799768952456
+20
+-706.098253038492
+30
+855.37186879426
+11
+-599.277053327022
+21
+-599.277053327022
+31
+796.153149972084
+12
+-470.848959476119
+22
+-704.67526609701
+32
+796.153149972084
+13
+-470.848959476119
+23
+-704.67526609701
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-599.277053327022
+20
+-599.277053327022
+30
+796.153149972084
+11
+-471.799768952456
+21
+-706.098253038492
+31
+855.37186879426
+12
+-600.487204246519
+22
+-600.487204246519
+32
+855.37186879426
+13
+-600.487204246519
+23
+-600.487204246519
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+194.606371158736
+20
+-978.352295145615
+30
+2361.46489814399
+11
+1.80477854883065e-13
+21
+-1043.98454271904
+31
+2258.00680432354
+12
+203.671280618918
+22
+-1023.92467246733
+32
+2258.00680432354
+13
+203.671280618918
+23
+-1023.92467246733
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1043.98454271904
+30
+2258.00680432354
+11
+194.606371158736
+21
+-978.352295145615
+31
+2361.46489814399
+12
+1.80477854883065e-13
+22
+-997.519349743284
+32
+2361.46489814399
+13
+1.80477854883065e-13
+23
+-997.519349743284
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-780.975408992987
+20
+-732.34720289276
+30
+2135.63378054399
+11
+-843.757583494495
+21
+-786.871584078293
+31
+2085.68639113261
+12
+-826.261008377686
+22
+-803.647314060702
+32
+2109.96175196855
+13
+-826.261008377686
+23
+-803.647314060702
+33
+2109.96175196855
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-843.757583494495
+20
+-786.871584078293
+30
+2085.68639113261
+11
+-780.975408992987
+21
+-732.34720289276
+31
+2135.63378054399
+12
+-804.422958470166
+22
+-708.167767562713
+32
+2102.55187642937
+13
+-804.422958470166
+23
+-708.167767562713
+33
+2102.55187642937
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-786.927339360508
+20
+-735.2933223192
+30
+2011.59250954971
+11
+-761.145931803741
+21
+-761.14593180374
+31
+1969.69450846846
+12
+-763.653083482914
+22
+-763.653083482914
+32
+2011.5925230317
+13
+-763.653083482914
+23
+-763.653083482914
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.145931803741
+20
+-761.14593180374
+30
+1969.69450846846
+11
+-786.927339360508
+21
+-735.2933223192
+31
+2011.59250954971
+12
+-766.91292419702
+22
+-754.581509059306
+32
+1973.17973333127
+13
+-766.91292419702
+23
+-754.581509059306
+33
+1973.17973333127
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-766.91292419702
+20
+-754.581509059306
+30
+1973.17973333127
+11
+-786.927339360508
+21
+-735.2933223192
+31
+2011.59250954971
+12
+-781.308061641118
+22
+-739.778791807586
+32
+1993.80290570042
+13
+-781.308061641118
+23
+-739.778791807586
+33
+1993.80290570042
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-441.215302798659
+20
+-660.325364744672
+30
+1614.7610800213
+11
+-540.907488126092
+21
+-698.794973376131
+31
+1427.8983600213
+12
+-493.122985245198
+22
+-738.010701420772
+32
+1427.8983600213
+13
+-493.122985245198
+23
+-738.010701420772
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-540.907488126092
+20
+-698.794973376131
+30
+1427.8983600213
+11
+-441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+-610.198917737466
+22
+-641.92896670788
+32
+1427.8983600213
+13
+-610.198917737466
+23
+-641.92896670788
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-610.198917737466
+20
+-641.92896670788
+30
+1427.8983600213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+-627.626510748516
+22
+-627.626510748516
+32
+1427.8983600213
+13
+-627.626510748516
+23
+-627.626510748516
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-561.560562517035
+20
+-561.560562517035
+30
+1614.7610800213
+11
+-610.198917737466
+21
+-641.92896670788
+31
+1427.8983600213
+12
+-441.215302798659
+22
+-660.325364744672
+32
+1614.7610800213
+13
+-441.215302798659
+23
+-660.325364744672
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-410.390873558597
+20
+-990.771212819307
+30
+1922.19277204157
+11
+-580.006735667279
+21
+-868.04142298445
+31
+1812.39759571907
+12
+-399.515588143821
+22
+-964.515951276276
+32
+1812.39759571907
+13
+-399.515588143821
+23
+-964.515951276276
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-580.006735667279
+20
+-868.04142298445
+30
+1812.39759571907
+11
+-410.390873558597
+21
+-990.771212819307
+31
+1922.19277204157
+12
+-595.795202951324
+22
+-891.670534105406
+32
+1922.19277204157
+13
+-595.795202951324
+23
+-891.670534105406
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-413.286070645571
+20
+-997.760836892423
+30
+2011.5925230317
+11
+-595.795202951324
+21
+-891.670534105406
+31
+1922.19277204157
+12
+-410.390873558597
+22
+-990.771212819307
+32
+1922.19277204157
+13
+-410.390873558597
+23
+-990.771212819307
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-595.795202951324
+20
+-891.670534105406
+30
+1922.19277204157
+11
+-413.286070645571
+21
+-997.760836892423
+31
+2011.5925230317
+12
+-599.99837764929
+22
+-897.961029579872
+32
+2011.5925230317
+13
+-599.99837764929
+23
+-897.961029579872
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+-410.390873558597
+21
+-990.771212819307
+31
+1922.19277204157
+12
+-209.215453044867
+22
+-1051.79710945546
+32
+1922.19277204157
+13
+-209.215453044867
+23
+-1051.79710945546
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-410.390873558597
+20
+-990.771212819307
+30
+1922.19277204157
+11
+-210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+-413.286070645571
+22
+-997.760836892423
+32
+2011.5925230317
+13
+-413.286070645571
+23
+-997.760836892423
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-194.606371158736
+20
+-978.352295145615
+30
+2361.46489814399
+11
+-399.515588143821
+21
+-964.515951276275
+31
+2258.00680432354
+12
+-203.671280618918
+22
+-1023.92467246733
+32
+2258.00680432354
+13
+-203.671280618918
+23
+-1023.92467246733
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-399.515588143821
+20
+-964.515951276275
+30
+2258.00680432354
+11
+-194.606371158736
+21
+-978.352295145615
+31
+2361.46489814399
+12
+-381.734128610353
+22
+-921.587710511788
+32
+2361.46489814399
+13
+-381.734128610353
+23
+-921.587710511788
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-731.773964383885
+20
+-406.167737113607
+30
+2549.0746800213
+11
+-699.168033082722
+21
+-467.169144021928
+31
+2455.6433200213
+12
+-699.168033082722
+22
+-467.169144021929
+32
+2549.0746800213
+13
+-699.168033082722
+23
+-467.169144021929
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+-731.773964383885
+21
+-406.167737113607
+31
+2549.0746800213
+12
+-776.873894119249
+22
+-321.791703197793
+32
+2455.6433200213
+13
+-776.873894119249
+23
+-321.791703197793
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.873894119249
+20
+-321.791703197793
+30
+2455.6433200213
+11
+-731.773964383885
+21
+-406.167737113607
+31
+2549.0746800213
+12
+-771.834238188426
+22
+-331.220236285058
+32
+2549.0746800213
+13
+-771.834238188426
+23
+-331.220236285058
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.873894119249
+20
+-321.791703197793
+30
+2455.6433200213
+11
+-771.834238188426
+21
+-331.220236285058
+31
+2549.0746800213
+12
+-776.87389411925
+22
+-321.791703197793
+32
+2549.0746800213
+13
+-776.87389411925
+23
+-321.791703197793
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-832.899678896021
+20
+-165.674046918964
+30
+855.37186879426
+11
+-782.993203577332
+21
+-324.326404167689
+31
+796.153149972084
+12
+-784.574341950659
+22
+-324.981333125909
+32
+855.37186879426
+13
+-784.574341950659
+23
+-324.981333125909
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-782.993203577332
+20
+-324.326404167689
+30
+796.153149972084
+11
+-832.899678896021
+21
+-165.674046918964
+31
+855.37186879426
+12
+-831.221151351825
+22
+-165.340167031437
+32
+796.153149972084
+13
+-831.221151351825
+23
+-165.340167031437
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+320.792432759964
+20
+-1019.67559748903
+30
+1941.79325554754
+11
+209.215453044867
+21
+-1051.79710945546
+31
+1922.19277204157
+12
+349.642861592144
+22
+-1009.19892078507
+32
+1922.19277204157
+13
+349.642861592144
+23
+-1009.19892078507
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+1922.19277204157
+11
+320.792432759964
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+210.691411720441
+22
+-1059.21725479392
+32
+2011.5925230317
+13
+210.691411720441
+23
+-1059.21725479392
+33
+2011.5925230317
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+320.792432759964
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+288.287531523413
+22
+-1033.5656801692
+32
+1987.58272162968
+13
+288.287531523413
+23
+-1033.5656801692
+33
+1987.58272162968
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+288.287531523413
+21
+-1033.5656801692
+31
+1987.58272162968
+12
+287.457754814725
+22
+-1035.93043920361
+32
+2011.5925230317
+13
+287.457754814725
+23
+-1035.93043920361
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+705.352696568272
+20
+-705.352696568272
+30
+2361.46489814399
+11
+653.750224578544
+21
+-807.521705673266
+31
+2258.00680432354
+12
+738.20854961057
+22
+-738.208549610569
+32
+2258.00680432354
+13
+738.20854961057
+23
+-738.208549610569
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-807.521705673266
+30
+2258.00680432354
+11
+705.352696568272
+21
+-705.352696568272
+31
+2361.46489814399
+12
+653.750224578543
+22
+-795.278127928135
+32
+2279.18196601546
+13
+653.750224578543
+23
+-795.278127928135
+33
+2279.18196601546
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+600.307509232711
+20
+-841.785968318108
+30
+2274.60134354834
+11
+554.192057578438
+21
+-829.407026995336
+31
+2361.46489814399
+12
+577.578293884962
+22
+-864.407003018736
+32
+2267.73932769213
+13
+577.578293884962
+23
+-864.407003018736
+33
+2267.73932769213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.192057578438
+20
+-829.407026995336
+30
+2361.46489814399
+11
+600.307509232711
+21
+-841.785968318108
+31
+2274.60134354834
+12
+653.750224578543
+22
+-795.278127928135
+32
+2279.18196601546
+13
+653.750224578543
+23
+-795.278127928135
+33
+2279.18196601546
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.192057578438
+20
+-829.407026995336
+30
+2361.46489814399
+11
+653.750224578543
+21
+-795.278127928135
+31
+2279.18196601546
+12
+705.352696568272
+22
+-705.352696568272
+32
+2361.46489814399
+13
+705.352696568272
+23
+-705.352696568272
+33
+2361.46489814399
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.308061641118
+20
+-739.778791807586
+30
+1993.80290570042
+11
+-833.979694213849
+21
+-798.243508123
+31
+2025.28667143296
+12
+-827.976635409257
+22
+-804.801337927561
+32
+2003.90537806848
+13
+-827.976635409257
+23
+-804.801337927561
+33
+2003.90537806848
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-833.979694213849
+20
+-798.243508123
+30
+2025.28667143296
+11
+-781.308061641118
+21
+-739.778791807586
+31
+1993.80290570042
+12
+-786.927339360508
+22
+-735.2933223192
+32
+2011.59250954971
+13
+-786.927339360508
+23
+-735.2933223192
+33
+2011.59250954971
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-833.979694213849
+20
+-798.243508123
+30
+2025.28667143296
+11
+-786.927339360508
+21
+-735.2933223192
+31
+2011.59250954971
+12
+-789.394716623343
+22
+-732.286733093936
+32
+2020.79944934296
+13
+-789.394716623343
+23
+-732.286733093936
+33
+2020.79944934296
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1.46816063865592
+20
+-978.223928142328
+30
+2079.65151912724
+11
+1.80477854883065e-13
+21
+-1078.21721573187
+31
+2079.50691792559
+12
+-1.4681606386561
+22
+-1078.06037755542
+32
+2079.65151912724
+13
+-1.4681606386561
+23
+-1078.06037755542
+33
+2079.65151912724
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1078.21721573187
+30
+2079.50691792559
+11
+-1.46816063865592
+21
+-978.223928142328
+31
+2079.65151912724
+12
+0.0
+22
+-978.377185230535
+32
+2079.50691792559
+13
+0.0
+23
+-978.377185230535
+33
+2079.50691792559
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1078.21721573187
+30
+2079.50691792559
+11
+0.0
+21
+-978.377185230535
+31
+2079.50691792559
+12
+7.31179769318775
+22
+-977.70014443868
+32
+2078.78676870972
+13
+7.31179769318775
+23
+-977.70014443868
+33
+2078.78676870972
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1078.21721573187
+30
+2079.50691792559
+11
+7.31179769318775
+21
+-977.70014443868
+31
+2078.78676870972
+12
+7.31179769318775
+22
+-1077.55800963197
+32
+2078.78676870972
+13
+7.31179769318775
+23
+-1077.55800963197
+33
+2078.78676870972
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.20854961057
+20
+-738.20854961057
+30
+1812.39759571907
+11
+767.904940618653
+21
+-709.249312269841
+31
+1830.19391829555
+12
+739.771122243662
+22
+-739.771122243661
+32
+1820.9352284623
+13
+739.771122243662
+23
+-739.771122243661
+33
+1820.9352284623
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+767.904940618653
+20
+-709.249312269841
+30
+1830.19391829555
+11
+738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+868.04142298445
+22
+-580.006735667279
+32
+1812.39759571907
+13
+868.04142298445
+23
+-580.006735667279
+33
+1812.39759571907
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+767.904940618653
+20
+-709.249312269841
+30
+1830.19391829555
+11
+868.04142298445
+21
+-580.006735667279
+31
+1812.39759571907
+12
+806.222012671193
+22
+-670.885845335315
+32
+1850.69961858573
+13
+806.222012671193
+23
+-670.885845335315
+33
+1850.69961858573
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+806.222012671193
+20
+-670.885845335315
+30
+1850.69961858573
+11
+868.04142298445
+21
+-580.006735667279
+31
+1812.39759571907
+12
+843.01369820043
+22
+-637.259985333474
+32
+1878.29564871262
+13
+843.01369820043
+23
+-637.259985333474
+33
+1878.29564871262
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+843.01369820043
+20
+-637.259985333474
+30
+1878.29564871262
+11
+868.04142298445
+21
+-580.006735667279
+31
+1812.39759571907
+12
+876.866113364493
+22
+-609.663955206589
+32
+1911.92150871446
+13
+876.866113364493
+23
+-609.663955206589
+33
+1911.92150871446
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+876.866113364493
+20
+-609.663955206589
+30
+1911.92150871446
+11
+868.04142298445
+21
+-580.006735667279
+31
+1812.39759571907
+12
+884.794355702396
+22
+-604.173850577965
+32
+1922.19277204157
+13
+884.794355702396
+23
+-604.173850577965
+33
+1922.19277204157
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+884.794355702396
+20
+-604.173850577965
+30
+1922.19277204157
+11
+868.04142298445
+21
+-580.006735667279
+31
+1812.39759571907
+12
+891.670534105407
+22
+-595.795202951324
+32
+1922.19277204157
+13
+891.670534105407
+23
+-595.795202951324
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+914.026066884025
+11
+-654.019523605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+-840.882243605455
+22
+1.80477854883065e-13
+32
+914.026066884025
+13
+-840.882243605455
+23
+1.80477854883065e-13
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-654.019523605455
+20
+1.80477854883065e-13
+30
+1054.1729200213
+11
+-824.724927080674
+21
+-164.047987682633
+31
+914.026066884025
+12
+-641.452721848564
+22
+-127.592879465023
+32
+1054.1729200213
+13
+-641.452721848564
+23
+-127.592879465023
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1072.40303302985
+20
+3.60955709766131e-13
+30
+1922.19277204157
+11
+-1023.92467246733
+21
+-203.671280618918
+31
+1812.39759571907
+12
+-1051.79710945546
+22
+-209.215453044867
+32
+1922.19277204157
+13
+-1051.79710945546
+23
+-209.215453044867
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1023.92467246733
+20
+-203.671280618918
+30
+1812.39759571907
+11
+-1072.40303302985
+21
+3.60955709766131e-13
+31
+1922.19277204157
+12
+-1043.98454271904
+22
+3.60955709766131e-13
+32
+1812.39759571907
+13
+-1043.98454271904
+23
+3.60955709766131e-13
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+914.026066884025
+11
+-849.217148276931
+21
+3.60955709766131e-13
+31
+855.37186879426
+12
+-832.899678896021
+22
+-165.674046918964
+32
+855.37186879426
+13
+-832.899678896021
+23
+-165.674046918964
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-849.217148276931
+20
+3.60955709766131e-13
+30
+855.37186879426
+11
+-824.724927080674
+21
+-164.047987682633
+31
+914.026066884025
+12
+-840.882243605455
+22
+1.80477854883065e-13
+32
+914.026066884025
+13
+-840.882243605455
+23
+1.80477854883065e-13
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+203.671280618918
+20
+-1023.92467246733
+30
+2258.00680432354
+11
+1.80477854883065e-13
+21
+-1072.40303302985
+31
+2148.21162800104
+12
+209.215453044867
+22
+-1051.79710945546
+32
+2148.21162800104
+13
+209.215453044867
+23
+-1051.79710945546
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1072.40303302985
+30
+2148.21162800104
+11
+203.671280618918
+21
+-1023.92467246733
+31
+2258.00680432354
+12
+1.80477854883065e-13
+22
+-1043.98454271904
+32
+2258.00680432354
+13
+1.80477854883065e-13
+23
+-1043.98454271904
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+2549.0746800213
+11
+164.047987682633
+21
+-824.724927080674
+31
+2455.6433200213
+12
+321.791703197793
+22
+-776.87389411925
+32
+2455.6433200213
+13
+321.791703197793
+23
+-776.87389411925
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+321.791703197793
+21
+-776.87389411925
+31
+2549.0746800213
+12
+164.047987682633
+22
+-824.724927080674
+32
+2549.0746800213
+13
+164.047987682633
+23
+-824.724927080674
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2549.0746800213
+11
+321.791703197793
+21
+-776.87389411925
+31
+2549.0746800213
+12
+291.163503259545
+22
+-786.16485699538
+32
+2549.0746800213
+13
+291.163503259545
+23
+-786.16485699538
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2549.0746800213
+11
+291.163503259545
+21
+-786.16485699538
+31
+2549.0746800213
+12
+209.932273259994
+22
+-810.806081221089
+32
+2549.0746800213
+13
+209.932273259994
+23
+-810.806081221089
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-837.4569269514
+30
+1817.56657040449
+11
+180.675224578544
+21
+-794.16651328432
+31
+1813.3028368105
+12
+180.675224578544
+22
+-837.4569269514
+32
+1817.56657040449
+13
+180.675224578544
+23
+-837.4569269514
+33
+1817.56657040449
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+1813.3028368105
+11
+653.750224578544
+21
+-837.4569269514
+31
+1817.56657040449
+12
+653.750224578543
+22
+-808.286776169451
+32
+1814.69356131783
+13
+653.750224578543
+23
+-808.286776169451
+33
+1814.69356131783
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+670.391132645368
+20
+-794.16651328432
+30
+1813.3028368105
+11
+180.675224578544
+21
+-794.16651328432
+31
+1813.3028368105
+12
+653.750224578543
+22
+-808.286776169451
+32
+1814.69356131783
+13
+653.750224578543
+23
+-808.286776169451
+33
+1814.69356131783
+70
+2
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+876.866113364493
+20
+-609.663955206589
+30
+1911.92150871446
+11
+180.675224578544
+21
+-637.259985333474
+31
+1878.29564871262
+12
+843.01369820043
+22
+-637.259985333474
+32
+1878.29564871262
+13
+843.01369820043
+23
+-637.259985333474
+33
+1878.29564871262
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-637.259985333474
+30
+1878.29564871262
+11
+876.866113364493
+21
+-609.663955206589
+31
+1911.92150871446
+12
+180.675224578544
+22
+-609.663955206589
+32
+1911.92150871446
+13
+180.675224578544
+23
+-609.663955206589
+33
+1911.92150871446
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632776
+20
+-594.593536632776
+30
+914.026066884025
+11
+-543.797359730523
+21
+-363.353779128852
+31
+1054.1729200213
+12
+-699.168033082722
+22
+-467.169144021929
+32
+914.026066884025
+13
+-699.168033082722
+23
+-467.169144021929
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-543.797359730523
+20
+-363.353779128852
+30
+1054.1729200213
+11
+-594.593536632776
+21
+-594.593536632776
+31
+914.026066884025
+12
+-462.461640169813
+22
+-462.461640169813
+32
+1054.1729200213
+13
+-462.461640169813
+23
+-462.461640169813
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-10.2481189704998
+20
+-977.41094203537
+30
+2078.78676870972
+11
+-18.690668427508
+21
+-1076.65401668716
+31
+2076.22574933075
+12
+-18.690668427508
+22
+-976.732727149702
+32
+2076.22574933075
+13
+-18.690668427508
+23
+-976.732727149702
+33
+2076.22574933075
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-18.690668427508
+20
+-1076.65401668716
+30
+2076.22574933075
+11
+-10.2481189704998
+21
+-977.41094203537
+31
+2078.78676870972
+12
+-10.2481189705
+22
+-1077.26880722866
+32
+2078.78676870972
+13
+-10.2481189705
+23
+-1077.26880722866
+33
+2078.78676870972
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+908.625264240696
+20
+-576.530906699202
+30
+2078.49259036266
+11
+180.675224578544
+21
+-589.158254916404
+31
+2120.11937767794
+12
+180.675224578544
+22
+-576.530907025343
+32
+2078.49259033054
+13
+180.675224578544
+23
+-576.530907025343
+33
+2078.49259033054
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-589.158254916404
+30
+2120.11937767794
+11
+908.625264240696
+21
+-576.530906699202
+31
+2078.49259036266
+12
+897.900697882446
+22
+-589.158254916404
+32
+2120.11937767794
+13
+897.900697882446
+23
+-589.158254916404
+33
+2120.11937767794
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+590.997993226901
+20
+-590.997993226901
+30
+738.078199114136
+11
+704.67526609701
+21
+-470.84895947612
+31
+796.153149972084
+12
+599.277053327022
+22
+-599.277053327022
+32
+796.153149972084
+13
+599.277053327022
+23
+-599.277053327022
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+704.67526609701
+20
+-470.84895947612
+30
+796.153149972084
+11
+590.997993226901
+21
+-590.997993226901
+31
+738.078199114136
+12
+694.940121314314
+22
+-464.344143695271
+32
+738.078199114136
+13
+694.940121314314
+23
+-464.344143695271
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-733.088824464619
+20
+-145.820433573828
+30
+1427.8983600213
+11
+-840.882243605455
+21
+1.80477854883065e-13
+31
+1241.03564002131
+12
+-824.724927080674
+22
+-164.047987682633
+32
+1241.03564002131
+13
+-824.724927080674
+23
+-164.047987682633
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+1241.03564002131
+11
+-733.088824464619
+21
+-145.820433573828
+31
+1427.8983600213
+12
+-747.450883605455
+22
+1.80477854883065e-13
+32
+1427.8983600213
+13
+-747.450883605455
+23
+1.80477854883065e-13
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+908.625259608371
+20
+-576.530907025343
+30
+1991.91176299638
+11
+180.675224578544
+21
+-589.158254916404
+31
+1950.28497564898
+12
+897.90069342138
+22
+-589.158254916404
+32
+1950.28497564898
+13
+897.90069342138
+23
+-589.158254916404
+33
+1950.28497564898
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-589.158254916404
+30
+1950.28497564898
+11
+908.625259608371
+21
+-576.530907025343
+31
+1991.91176299638
+12
+180.675224578544
+22
+-576.530907025343
+32
+1991.91176299638
+13
+180.675224578544
+23
+-576.530907025343
+33
+1991.91176299638
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021929
+20
+-699.168033082722
+30
+914.026066884025
+11
+-462.461640169813
+21
+-462.461640169813
+31
+1054.1729200213
+12
+-594.593536632776
+22
+-594.593536632776
+32
+914.026066884025
+13
+-594.593536632776
+23
+-594.593536632776
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-462.461640169813
+20
+-462.461640169813
+30
+1054.1729200213
+11
+-467.169144021929
+21
+-699.168033082722
+31
+914.026066884025
+12
+-363.353779128852
+22
+-543.797359730523
+32
+1054.1729200213
+13
+-363.353779128852
+23
+-543.797359730523
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-705.406767999999
+30
+2035.20217666346
+11
+104.493585205719
+21
+-707.112262514746
+31
+2017.88602361794
+12
+180.675224578544
+22
+-707.112261617118
+32
+2017.88600937388
+13
+180.675224578544
+23
+-707.112261617118
+33
+2017.88600937388
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493585205719
+20
+-707.112262514746
+30
+2017.88602361794
+11
+180.675224578544
+21
+-705.406767999999
+31
+2035.20217666346
+12
+104.493582702864
+22
+-705.406767999999
+32
+2035.2022000213
+13
+104.493582702864
+23
+-705.406767999999
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.35466353334
+20
+-731.718944065101
+30
+1933.51796332002
+11
+-805.85406896736
+21
+-828.277941296301
+31
+1950.68418808414
+12
+-828.138788259274
+22
+-805.723050021943
+32
+1963.78062144053
+13
+-828.138788259274
+23
+-805.723050021943
+33
+1963.78062144053
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-805.85406896736
+20
+-828.277941296301
+30
+1950.68418808414
+11
+-781.35466353334
+21
+-731.718944065101
+31
+1933.51796332002
+12
+-761.987076679027
+22
+-753.814953035805
+32
+1922.19277204157
+13
+-761.987076679027
+23
+-753.814953035805
+33
+1922.19277204157
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-805.85406896736
+20
+-828.277941296301
+30
+1950.68418808414
+11
+-761.987076679027
+21
+-753.814953035805
+31
+1922.19277204157
+12
+-757.858868059522
+22
+-757.858868059522
+32
+1919.76361420147
+13
+-757.858868059522
+23
+-757.858868059522
+33
+1919.76361420147
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-805.85406896736
+20
+-828.277941296301
+30
+1950.68418808414
+11
+-757.858868059522
+21
+-757.858868059522
+31
+1919.76361420147
+12
+-750.032010089465
+22
+-762.726244296354
+32
+1915.09420023775
+13
+-750.032010089465
+23
+-762.726244296354
+33
+1915.09420023775
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+731.120068617964
+20
+-145.428823687577
+30
+587.016306884026
+11
+784.019466456977
+21
+1.80477854883065e-13
+31
+631.979456702016
+12
+768.954752250597
+22
+-152.954610178005
+32
+631.979456702016
+13
+768.954752250597
+23
+-152.954610178005
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+784.019466456977
+20
+1.80477854883065e-13
+30
+631.979456702016
+11
+731.120068617964
+21
+-145.428823687577
+31
+587.016306884026
+12
+745.443557551535
+22
+1.80477854883065e-13
+32
+587.016306884026
+13
+745.443557551535
+23
+1.80477854883065e-13
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-1011.8021195433
+30
+1991.91176299638
+11
+180.675224578544
+21
+-1011.8021195433
+31
+2078.49259033054
+12
+180.675224578544
+22
+-1016.06585313728
+32
+2035.20217666346
+13
+180.675224578544
+23
+-1016.06585313728
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-1011.8021195433
+30
+2078.49259033054
+11
+180.675224578544
+21
+-1011.8021195433
+31
+1991.91176299638
+12
+180.675224578544
+22
+-999.174771652236
+32
+1950.28497564898
+13
+180.675224578544
+23
+-999.174771652236
+33
+1950.28497564898
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-1011.8021195433
+30
+2078.49259033054
+11
+180.675224578544
+21
+-999.174771652236
+31
+1950.28497564898
+12
+180.675224578544
+22
+-999.174771652236
+32
+2120.11937767794
+13
+180.675224578544
+23
+-999.174771652236
+33
+2120.11937767794
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-999.174771652236
+30
+2120.11937767794
+11
+180.675224578544
+21
+-999.174771652236
+31
+1950.28497564898
+12
+180.675224578544
+22
+-978.669071362051
+32
+1911.92150871446
+13
+180.675224578544
+23
+-978.669071362051
+33
+1911.92150871446
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-999.174771652236
+30
+2120.11937767794
+11
+180.675224578544
+21
+-978.669071362051
+31
+1911.92150871446
+12
+180.675224578544
+22
+-978.669071362051
+32
+2158.48284461247
+13
+180.675224578544
+23
+-978.669071362051
+33
+2158.48284461247
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-978.669071362051
+30
+2158.48284461247
+11
+180.675224578544
+21
+-978.669071362051
+31
+1911.92150871446
+12
+180.675224578544
+22
+-951.073041235166
+32
+1878.29564871262
+13
+180.675224578544
+23
+-951.073041235166
+33
+1878.29564871262
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-978.669071362051
+30
+2158.48284461247
+11
+180.675224578544
+21
+-951.073041235166
+31
+1878.29564871262
+12
+180.675224578544
+22
+-951.073041235166
+32
+2192.10870461431
+13
+180.675224578544
+23
+-951.073041235166
+33
+2192.10870461431
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-951.073041235166
+30
+2192.10870461431
+11
+180.675224578544
+21
+-951.073041235166
+31
+1878.29564871262
+12
+180.675224578544
+22
+-917.447181233325
+32
+1850.69961858573
+13
+180.675224578544
+23
+-917.447181233325
+33
+1850.69961858573
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-951.073041235166
+30
+2192.10870461431
+11
+180.675224578544
+21
+-917.447181233325
+31
+1850.69961858573
+12
+180.675224578544
+22
+-917.447181233325
+32
+2219.70473474119
+13
+180.675224578544
+23
+-917.447181233325
+33
+2219.70473474119
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-917.447181233325
+30
+2219.70473474119
+11
+180.675224578544
+21
+-917.447181233325
+31
+1850.69961858573
+12
+180.675224578544
+22
+-879.083714298798
+32
+1830.19391829555
+13
+180.675224578544
+23
+-879.083714298798
+33
+1830.19391829555
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-917.447181233325
+30
+2219.70473474119
+11
+180.675224578544
+21
+-879.083714298798
+31
+1830.19391829555
+12
+180.675224578544
+22
+-882.926258568641
+32
+2035.20217666346
+13
+180.675224578544
+23
+-882.926258568641
+33
+2035.20217666346
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-882.926258568641
+30
+2035.20217666346
+11
+180.675224578544
+21
+-879.083714298798
+31
+1830.19391829555
+12
+180.675224578544
+22
+-881.220764951522
+32
+2017.88600937388
+13
+180.675224578544
+23
+-881.220764951522
+33
+2017.88600937388
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-881.220764951522
+30
+2017.88600937388
+11
+180.675224578544
+21
+-879.083714298798
+31
+1830.19391829555
+12
+180.675224578544
+22
+-876.169825263419
+32
+2001.23529268221
+13
+180.675224578544
+23
+-876.169825263419
+33
+2001.23529268221
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-876.169825263419
+30
+2001.23529268221
+11
+180.675224578544
+21
+-879.083714298798
+31
+1830.19391829555
+12
+180.675224578544
+22
+-837.4569269514
+32
+1817.56657040449
+13
+180.675224578544
+23
+-837.4569269514
+33
+1817.56657040449
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-876.169825263419
+30
+2001.23529268221
+11
+180.675224578544
+21
+-837.4569269514
+31
+1817.56657040449
+12
+180.675224578544
+22
+-867.967544283947
+32
+1985.88990429309
+13
+180.675224578544
+23
+-867.967544283947
+33
+1985.88990429309
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-867.967544283947
+30
+1985.88990429309
+11
+180.675224578544
+21
+-837.4569269514
+31
+1817.56657040449
+12
+180.675224578544
+22
+-856.929131071254
+32
+1972.43955887653
+13
+180.675224578544
+23
+-856.929131071254
+33
+1972.43955887653
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-856.929131071254
+30
+1972.43955887653
+11
+180.675224578544
+21
+-837.4569269514
+31
+1817.56657040449
+12
+180.675224578544
+22
+-843.478785654691
+32
+1961.40114566384
+13
+180.675224578544
+23
+-843.478785654691
+33
+1961.40114566384
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-843.478785654691
+30
+1961.40114566384
+11
+180.675224578544
+21
+-837.4569269514
+31
+1817.56657040449
+12
+180.675224578544
+22
+-828.133397265575
+32
+1953.19886468436
+13
+180.675224578544
+23
+-828.133397265575
+33
+1953.19886468436
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-828.133397265575
+30
+1953.19886468436
+11
+180.675224578544
+21
+-837.4569269514
+31
+1817.56657040449
+12
+180.675224578544
+22
+-794.16651328432
+32
+1813.3028368105
+13
+180.675224578544
+23
+-794.16651328432
+33
+1813.3028368105
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-828.133397265575
+30
+1953.19886468436
+11
+180.675224578544
+21
+-794.16651328432
+31
+1813.3028368105
+12
+180.675224578544
+22
+-811.482680573908
+32
+1948.14792499626
+13
+180.675224578544
+23
+-811.482680573908
+33
+1948.14792499626
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-811.482680573908
+30
+1948.14792499626
+11
+180.675224578544
+21
+-794.16651328432
+31
+1813.3028368105
+12
+180.675224578544
+22
+-794.16651328432
+32
+1946.44243137914
+13
+180.675224578544
+23
+-794.16651328432
+33
+1946.44243137914
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+1946.44243137914
+11
+180.675224578544
+21
+-794.16651328432
+31
+1813.3028368105
+12
+180.675224578544
+22
+-750.87609961724
+32
+1817.56657040449
+13
+180.675224578544
+23
+-750.87609961724
+33
+1817.56657040449
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+1946.44243137914
+11
+180.675224578544
+21
+-750.87609961724
+31
+1817.56657040449
+12
+180.675224578544
+22
+-776.850345994732
+32
+1948.14792499626
+13
+180.675224578544
+23
+-776.850345994732
+33
+1948.14792499626
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-776.850345994732
+30
+1948.14792499626
+11
+180.675224578544
+21
+-750.87609961724
+31
+1817.56657040449
+12
+180.675224578544
+22
+-760.199629303065
+32
+1953.19886468436
+13
+180.675224578544
+23
+-760.199629303065
+33
+1953.19886468436
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-760.199629303065
+30
+1953.19886468436
+11
+180.675224578544
+21
+-750.87609961724
+31
+1817.56657040449
+12
+180.675224578544
+22
+-744.854240913949
+32
+1961.40114566384
+13
+180.675224578544
+23
+-744.854240913949
+33
+1961.40114566384
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-744.854240913949
+30
+1961.40114566384
+11
+180.675224578544
+21
+-750.87609961724
+31
+1817.56657040449
+12
+180.675224578544
+22
+-709.249312269842
+32
+1830.19391829555
+13
+180.675224578544
+23
+-709.249312269842
+33
+1830.19391829555
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-744.854240913949
+30
+1961.40114566384
+11
+180.675224578544
+21
+-709.249312269842
+31
+1830.19391829555
+12
+180.675224578544
+22
+-731.403895497386
+32
+1972.43955887653
+13
+180.675224578544
+23
+-731.403895497386
+33
+1972.43955887653
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-731.403895497386
+30
+1972.43955887653
+11
+180.675224578544
+21
+-709.249312269842
+31
+1830.19391829555
+12
+180.675224578544
+22
+-720.365482284693
+32
+1985.88990429309
+13
+180.675224578544
+23
+-720.365482284693
+33
+1985.88990429309
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-720.365482284693
+30
+1985.88990429309
+11
+180.675224578544
+21
+-709.249312269842
+31
+1830.19391829555
+12
+180.675224578544
+22
+-712.163201305221
+32
+2001.23529268221
+13
+180.675224578544
+23
+-712.163201305221
+33
+2001.23529268221
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-712.163201305221
+30
+2001.23529268221
+11
+180.675224578544
+21
+-709.249312269842
+31
+1830.19391829555
+12
+180.675224578544
+22
+-707.112261617118
+32
+2017.88600937388
+13
+180.675224578544
+23
+-707.112261617118
+33
+2017.88600937388
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-707.112261617118
+30
+2017.88600937388
+11
+180.675224578544
+21
+-709.249312269842
+31
+1830.19391829555
+12
+180.675224578544
+22
+-670.885845335315
+32
+1850.69961858573
+13
+180.675224578544
+23
+-670.885845335315
+33
+1850.69961858573
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-707.112261617118
+30
+2017.88600937388
+11
+180.675224578544
+21
+-670.885845335315
+31
+1850.69961858573
+12
+180.675224578544
+22
+-705.406767999999
+32
+2035.20217666346
+13
+180.675224578544
+23
+-705.406767999999
+33
+2035.20217666346
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-882.926258568641
+30
+2035.20217666346
+11
+180.675224578544
+21
+-879.083714298798
+31
+2240.21043503138
+12
+180.675224578544
+22
+-917.447181233325
+32
+2219.70473474119
+13
+180.675224578544
+23
+-917.447181233325
+33
+2219.70473474119
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-879.083714298798
+30
+2240.21043503138
+11
+180.675224578544
+21
+-882.926258568641
+31
+2035.20217666346
+12
+180.675224578544
+22
+-881.220764951522
+32
+2052.51834395305
+13
+180.675224578544
+23
+-881.220764951522
+33
+2052.51834395305
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-879.083714298798
+30
+2240.21043503138
+11
+180.675224578544
+21
+-881.220764951522
+31
+2052.51834395305
+12
+180.675224578544
+22
+-876.169825263419
+32
+2069.16906064472
+13
+180.675224578544
+23
+-876.169825263419
+33
+2069.16906064472
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-879.083714298798
+30
+2240.21043503138
+11
+180.675224578544
+21
+-876.169825263419
+31
+2069.16906064472
+12
+180.675224578544
+22
+-837.4569269514
+32
+2252.83778292244
+13
+180.675224578544
+23
+-837.4569269514
+33
+2252.83778292244
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+180.675224578544
+21
+-876.169825263419
+31
+2069.16906064472
+12
+180.675224578544
+22
+-867.967544283947
+32
+2084.51444903383
+13
+180.675224578544
+23
+-867.967544283947
+33
+2084.51444903383
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+180.675224578544
+21
+-867.967544283947
+31
+2084.51444903383
+12
+180.675224578544
+22
+-856.929131071254
+32
+2097.9647944504
+13
+180.675224578544
+23
+-856.929131071254
+33
+2097.9647944504
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+180.675224578544
+21
+-856.929131071254
+31
+2097.9647944504
+12
+180.675224578544
+22
+-843.478785654691
+32
+2109.00320766309
+13
+180.675224578544
+23
+-843.478785654691
+33
+2109.00320766309
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+180.675224578544
+21
+-843.478785654691
+31
+2109.00320766309
+12
+180.675224578544
+22
+-828.133397265575
+32
+2117.20548864256
+13
+180.675224578544
+23
+-828.133397265575
+33
+2117.20548864256
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+180.675224578544
+21
+-828.133397265575
+31
+2117.20548864256
+12
+180.675224578544
+22
+-794.16651328432
+32
+2257.10151651642
+13
+180.675224578544
+23
+-794.16651328432
+33
+2257.10151651642
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+2257.10151651642
+11
+180.675224578544
+21
+-828.133397265575
+31
+2117.20548864256
+12
+180.675224578544
+22
+-811.482680573908
+32
+2122.25642833066
+13
+180.675224578544
+23
+-811.482680573908
+33
+2122.25642833066
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+2257.10151651642
+11
+180.675224578544
+21
+-811.482680573908
+31
+2122.25642833066
+12
+180.675224578544
+22
+-794.16651328432
+32
+2123.96192194778
+13
+180.675224578544
+23
+-794.16651328432
+33
+2123.96192194778
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+2257.10151651642
+11
+180.675224578544
+21
+-794.16651328432
+31
+2123.96192194778
+12
+180.675224578544
+22
+-776.850345994732
+32
+2122.25642833066
+13
+180.675224578544
+23
+-776.850345994732
+33
+2122.25642833066
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+2257.10151651642
+11
+180.675224578544
+21
+-776.850345994732
+31
+2122.25642833066
+12
+180.675224578544
+22
+-750.87609961724
+32
+2252.83778292244
+13
+180.675224578544
+23
+-750.87609961724
+33
+2252.83778292244
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-750.87609961724
+30
+2252.83778292244
+11
+180.675224578544
+21
+-776.850345994732
+31
+2122.25642833066
+12
+180.675224578544
+22
+-760.199629303065
+32
+2117.20548864256
+13
+180.675224578544
+23
+-760.199629303065
+33
+2117.20548864256
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-750.87609961724
+30
+2252.83778292244
+11
+180.675224578544
+21
+-760.199629303065
+31
+2117.20548864256
+12
+180.675224578544
+22
+-744.854240913949
+32
+2109.00320766309
+13
+180.675224578544
+23
+-744.854240913949
+33
+2109.00320766309
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-750.87609961724
+30
+2252.83778292244
+11
+180.675224578544
+21
+-744.854240913949
+31
+2109.00320766309
+12
+180.675224578544
+22
+-709.249312269842
+32
+2240.21043503138
+13
+180.675224578544
+23
+-709.249312269842
+33
+2240.21043503138
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-709.249312269842
+30
+2240.21043503138
+11
+180.675224578544
+21
+-744.854240913949
+31
+2109.00320766309
+12
+180.675224578544
+22
+-731.403895497386
+32
+2097.9647944504
+13
+180.675224578544
+23
+-731.403895497386
+33
+2097.9647944504
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-709.249312269842
+30
+2240.21043503138
+11
+180.675224578544
+21
+-731.403895497386
+31
+2097.9647944504
+12
+180.675224578544
+22
+-720.365482284693
+32
+2084.51444903383
+13
+180.675224578544
+23
+-720.365482284693
+33
+2084.51444903383
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-709.249312269842
+30
+2240.21043503138
+11
+180.675224578544
+21
+-720.365482284693
+31
+2084.51444903383
+12
+180.675224578544
+22
+-712.163201305221
+32
+2069.16906064472
+13
+180.675224578544
+23
+-712.163201305221
+33
+2069.16906064472
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-709.249312269842
+30
+2240.21043503138
+11
+180.675224578544
+21
+-712.163201305221
+31
+2069.16906064472
+12
+180.675224578544
+22
+-707.112261617118
+32
+2052.51834395305
+13
+180.675224578544
+23
+-707.112261617118
+33
+2052.51834395305
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-709.249312269842
+30
+2240.21043503138
+11
+180.675224578544
+21
+-707.112261617118
+31
+2052.51834395305
+12
+180.675224578544
+22
+-670.885845335315
+32
+2219.70473474119
+13
+180.675224578544
+23
+-670.885845335315
+33
+2219.70473474119
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-670.885845335315
+30
+2219.70473474119
+11
+180.675224578544
+21
+-707.112261617118
+31
+2052.51834395305
+12
+180.675224578544
+22
+-705.406767999999
+32
+2035.20217666346
+13
+180.675224578544
+23
+-705.406767999999
+33
+2035.20217666346
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-670.885845335315
+30
+2219.70473474119
+11
+180.675224578544
+21
+-705.406767999999
+31
+2035.20217666346
+12
+180.675224578544
+22
+-670.885845335315
+32
+1850.69961858573
+13
+180.675224578544
+23
+-670.885845335315
+33
+1850.69961858573
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-670.885845335315
+30
+2219.70473474119
+11
+180.675224578544
+21
+-670.885845335315
+31
+1850.69961858573
+12
+180.675224578544
+22
+-637.259985333474
+32
+1878.29564871262
+13
+180.675224578544
+23
+-637.259985333474
+33
+1878.29564871262
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-670.885845335315
+30
+2219.70473474119
+11
+180.675224578544
+21
+-637.259985333474
+31
+1878.29564871262
+12
+180.675224578544
+22
+-637.259985333474
+32
+2192.10870461431
+13
+180.675224578544
+23
+-637.259985333474
+33
+2192.10870461431
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-637.259985333474
+30
+2192.10870461431
+11
+180.675224578544
+21
+-637.259985333474
+31
+1878.29564871262
+12
+180.675224578544
+22
+-609.663955206589
+32
+1911.92150871446
+13
+180.675224578544
+23
+-609.663955206589
+33
+1911.92150871446
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-637.259985333474
+30
+2192.10870461431
+11
+180.675224578544
+21
+-609.663955206589
+31
+1911.92150871446
+12
+180.675224578544
+22
+-609.663955206589
+32
+2158.48284461247
+13
+180.675224578544
+23
+-609.663955206589
+33
+2158.48284461247
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-609.663955206589
+30
+2158.48284461247
+11
+180.675224578544
+21
+-609.663955206589
+31
+1911.92150871446
+12
+180.675224578544
+22
+-589.158254916404
+32
+1950.28497564898
+13
+180.675224578544
+23
+-589.158254916404
+33
+1950.28497564898
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-609.663955206589
+30
+2158.48284461247
+11
+180.675224578544
+21
+-589.158254916404
+31
+1950.28497564898
+12
+180.675224578544
+22
+-589.158254916404
+32
+2120.11937767794
+13
+180.675224578544
+23
+-589.158254916404
+33
+2120.11937767794
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-589.158254916404
+30
+2120.11937767794
+11
+180.675224578544
+21
+-589.158254916404
+31
+1950.28497564898
+12
+180.675224578544
+22
+-576.530907025343
+32
+1991.91176299638
+13
+180.675224578544
+23
+-576.530907025343
+33
+1991.91176299638
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-589.158254916404
+30
+2120.11937767794
+11
+180.675224578544
+21
+-576.530907025343
+31
+1991.91176299638
+12
+180.675224578544
+22
+-576.530907025343
+32
+2078.49259033054
+13
+180.675224578544
+23
+-576.530907025343
+33
+2078.49259033054
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-576.530907025343
+30
+2078.49259033054
+11
+180.675224578544
+21
+-576.530907025343
+31
+1991.91176299638
+12
+180.675224578544
+22
+-572.26717343136
+32
+2035.20217666346
+13
+180.675224578544
+23
+-572.26717343136
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-768.954752250597
+20
+-152.954610178005
+30
+631.979456702016
+11
+-688.700045464263
+21
+-285.268899238265
+31
+587.016306884026
+12
+-724.33953815002
+22
+-300.031260464802
+32
+631.979456702016
+13
+-724.33953815002
+23
+-300.031260464802
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-688.700045464263
+20
+-285.268899238265
+30
+587.016306884026
+11
+-768.954752250597
+21
+-152.954610178005
+31
+631.979456702016
+12
+-731.120068617964
+22
+-145.428823687577
+32
+587.016306884026
+13
+-731.120068617964
+23
+-145.428823687577
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-798.780782641381
+20
+-158.887376492573
+30
+682.822310520627
+11
+-724.33953815002
+21
+-300.031260464802
+31
+631.979456702016
+12
+-752.435044439405
+22
+-311.668800211604
+32
+682.822310520627
+13
+-752.435044439405
+23
+-311.668800211604
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-724.33953815002
+20
+-300.031260464802
+30
+631.979456702016
+11
+-798.780782641381
+21
+-158.887376492573
+31
+682.822310520627
+12
+-768.954752250597
+22
+-152.954610178005
+32
+631.979456702016
+13
+-768.954752250597
+23
+-152.954610178005
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-819.73776511114
+20
+-163.055979488767
+30
+738.078199114136
+11
+-752.435044439405
+21
+-311.668800211604
+31
+682.822310520627
+12
+-772.176090266528
+22
+-319.845809128627
+32
+738.078199114136
+13
+-772.176090266528
+23
+-319.845809128627
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-752.435044439405
+20
+-311.668800211604
+30
+682.822310520627
+11
+-819.73776511114
+21
+-163.055979488767
+31
+738.078199114136
+12
+-798.780782641381
+22
+-158.887376492573
+32
+682.822310520627
+13
+-798.780782641381
+23
+-158.887376492573
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+990.771212819308
+20
+-410.390873558597
+30
+1922.19277204157
+11
+1059.21725479392
+21
+-210.691411720441
+31
+2011.5925230317
+12
+997.760836892423
+22
+-413.286070645571
+32
+2011.5925230317
+13
+997.760836892423
+23
+-413.286070645571
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1059.21725479392
+20
+-210.691411720441
+30
+2011.5925230317
+11
+990.771212819308
+21
+-410.390873558597
+31
+1922.19277204157
+12
+1051.79710945546
+22
+-209.215453044867
+32
+1922.19277204157
+13
+1051.79710945546
+23
+-209.215453044867
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-203.671280618918
+20
+-1023.92467246733
+30
+2258.00680432354
+11
+-410.390873558597
+21
+-990.771212819307
+31
+2148.21162800104
+12
+-209.215453044867
+22
+-1051.79710945546
+32
+2148.21162800104
+13
+-209.215453044867
+23
+-1051.79710945546
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-410.390873558597
+20
+-990.771212819307
+30
+2148.21162800104
+11
+-203.671280618918
+21
+-1023.92467246733
+31
+2258.00680432354
+12
+-399.515588143821
+22
+-964.515951276275
+32
+2258.00680432354
+13
+-399.515588143821
+23
+-964.515951276275
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-165.674046918965
+20
+-832.899678896021
+30
+855.37186879426
+11
+-324.326404167689
+21
+-782.993203577332
+31
+796.153149972084
+12
+-165.340167031437
+22
+-831.221151351825
+32
+796.153149972084
+13
+-165.340167031437
+23
+-831.221151351825
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-324.326404167689
+20
+-782.993203577332
+30
+796.153149972084
+11
+-165.674046918965
+21
+-832.899678896021
+31
+855.37186879426
+12
+-324.981333125909
+22
+-784.574341950658
+32
+855.37186879426
+13
+-324.981333125909
+23
+-784.574341950658
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1059.21725479392
+20
+-210.691411720441
+30
+2058.8118770109
+11
+-997.760836892423
+21
+-413.286070645571
+31
+2011.5925230317
+12
+-997.760836892423
+22
+-413.286070645571
+32
+2058.8118770109
+13
+-997.760836892423
+23
+-413.286070645571
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-997.760836892423
+20
+-413.286070645571
+30
+2011.5925230317
+11
+-1059.21725479392
+21
+-210.691411720441
+31
+2058.8118770109
+12
+-1059.21725479392
+22
+-210.691411720441
+32
+2011.5925230317
+13
+-1059.21725479392
+23
+-210.691411720441
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1059.21725479392
+20
+-210.691411720441
+30
+2011.5925230317
+11
+-990.771212819307
+21
+-410.390873558597
+31
+1922.19277204157
+12
+-997.760836892423
+22
+-413.286070645571
+32
+2011.5925230317
+13
+-997.760836892423
+23
+-413.286070645571
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-990.771212819307
+20
+-410.390873558597
+30
+1922.19277204157
+11
+-1059.21725479392
+21
+-210.691411720441
+31
+2011.5925230317
+12
+-1051.79710945546
+22
+-209.215453044867
+32
+1922.19277204157
+13
+-1051.79710945546
+23
+-209.215453044867
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+978.352295145615
+20
+-194.606371158736
+30
+1708.93950189862
+11
+1043.98454271904
+21
+1.80477854883065e-13
+31
+1812.39759571907
+12
+1023.92467246733
+22
+-203.671280618918
+32
+1812.39759571907
+13
+1023.92467246733
+23
+-203.671280618918
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1043.98454271904
+20
+1.80477854883065e-13
+30
+1812.39759571907
+11
+978.352295145615
+21
+-194.606371158736
+31
+1708.93950189862
+12
+997.519349743285
+22
+1.80477854883065e-13
+32
+1708.93950189862
+13
+997.519349743285
+23
+1.80477854883065e-13
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+1922.19277204157
+11
+-399.515588143821
+21
+-964.515951276276
+31
+1812.39759571907
+12
+-203.671280618918
+22
+-1023.92467246733
+32
+1812.39759571907
+13
+-203.671280618918
+23
+-1023.92467246733
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-399.515588143821
+20
+-964.515951276276
+30
+1812.39759571907
+11
+-209.215453044867
+21
+-1051.79710945546
+31
+1922.19277204157
+12
+-410.390873558597
+22
+-990.771212819307
+32
+1922.19277204157
+13
+-410.390873558597
+23
+-990.771212819307
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1023.92467246733
+20
+-203.671280618918
+30
+2258.00680432354
+11
+921.587710511789
+21
+-381.734128610352
+31
+2361.46489814399
+12
+964.515951276275
+22
+-399.51558814382
+32
+2258.00680432354
+13
+964.515951276275
+23
+-399.51558814382
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+921.587710511789
+20
+-381.734128610352
+30
+2361.46489814399
+11
+1023.92467246733
+21
+-203.671280618918
+31
+2258.00680432354
+12
+978.352295145615
+22
+-194.606371158736
+32
+2361.46489814399
+13
+978.352295145615
+23
+-194.606371158736
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.905696349335
+20
+-778.54324309139
+30
+2019.68727261649
+11
+-804.883917627287
+21
+-707.527532613081
+31
+1967.25758629213
+12
+-845.012275898089
+22
+-788.258546505553
+32
+1988.01128244689
+13
+-845.012275898089
+23
+-788.258546505553
+33
+1988.01128244689
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-804.883917627287
+20
+-707.527532613081
+30
+1967.25758629213
+11
+-853.905696349335
+21
+-778.54324309139
+31
+2019.68727261649
+12
+-818.480102290147
+22
+-696.846172894875
+32
+2011.59249120966
+13
+-818.480102290147
+23
+-696.846172894875
+33
+2011.59249120966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.87389411925
+20
+-321.791703197793
+30
+914.026066884025
+11
+-641.452721848564
+21
+-127.592879465023
+31
+1054.1729200213
+12
+-824.724927080674
+22
+-164.047987682633
+32
+914.026066884025
+13
+-824.724927080674
+23
+-164.047987682633
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-641.452721848564
+20
+-127.592879465023
+30
+1054.1729200213
+11
+-776.87389411925
+21
+-321.791703197793
+31
+914.026066884025
+12
+-604.235251721862
+22
+-250.282436127116
+32
+1054.1729200213
+13
+-604.235251721862
+23
+-250.282436127116
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1072.40303302985
+30
+1922.19277204157
+11
+-203.671280618918
+21
+-1023.92467246733
+31
+1812.39759571907
+12
+1.80477854883065e-13
+22
+-1043.98454271904
+32
+1812.39759571907
+13
+1.80477854883065e-13
+23
+-1043.98454271904
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-203.671280618918
+20
+-1023.92467246733
+30
+1812.39759571907
+11
+1.80477854883065e-13
+21
+-1072.40303302985
+31
+1922.19277204157
+12
+-209.215453044867
+22
+-1051.79710945546
+32
+1922.19277204157
+13
+-209.215453044867
+23
+-1051.79710945546
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1019.67559748903
+30
+1941.79325554754
+11
+369.41031965462
+21
+-997.119327169824
+31
+1899.59344191956
+12
+653.750224578544
+22
+-997.119327169824
+32
+1899.59344191956
+13
+653.750224578544
+23
+-997.119327169824
+33
+1899.59344191956
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+369.41031965462
+20
+-997.119327169824
+30
+1899.59344191956
+11
+653.750224578544
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+349.642861592144
+22
+-1009.19892078507
+32
+1922.19277204157
+13
+349.642861592144
+23
+-1009.19892078507
+33
+1922.19277204157
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+349.642861592144
+20
+-1009.19892078507
+30
+1922.19277204157
+11
+653.750224578544
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+320.792432759964
+22
+-1019.67559748903
+32
+1941.79325554754
+13
+320.792432759964
+23
+-1019.67559748903
+33
+1941.79325554754
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1059.21725479392
+20
+-210.691411720441
+30
+2011.5925230317
+11
+997.760836892423
+21
+-413.286070645571
+31
+2058.8118770109
+12
+997.760836892423
+22
+-413.286070645571
+32
+2011.5925230317
+13
+997.760836892423
+23
+-413.286070645571
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+997.760836892423
+20
+-413.286070645571
+30
+2058.8118770109
+11
+1059.21725479392
+21
+-210.691411720441
+31
+2011.5925230317
+12
+1059.21725479392
+22
+-210.691411720441
+32
+2058.8118770109
+13
+1059.21725479392
+23
+-210.691411720441
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-847.505736434059
+20
+1.80477854883065e-13
+30
+796.153149972084
+11
+-819.73776511114
+21
+-163.055979488767
+31
+738.078199114136
+12
+-831.221151351825
+22
+-165.340167031437
+32
+796.153149972084
+13
+-831.221151351825
+23
+-165.340167031437
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-819.73776511114
+20
+-163.055979488767
+30
+738.078199114136
+11
+-847.505736434059
+21
+1.80477854883065e-13
+31
+796.153149972084
+12
+-835.797377356766
+22
+1.80477854883065e-13
+32
+738.078199114136
+13
+-835.797377356766
+23
+1.80477854883065e-13
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+182.278551827736
+20
+-916.376162171087
+30
+2455.6433200213
+11
+1.80477854883065e-13
+21
+-997.519349743284
+31
+2361.46489814399
+12
+194.606371158736
+22
+-978.352295145615
+32
+2361.46489814399
+13
+194.606371158736
+23
+-978.352295145615
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-997.519349743284
+30
+2361.46489814399
+11
+182.278551827736
+21
+-916.376162171087
+31
+2455.6433200213
+12
+1.80477854883065e-13
+22
+-934.329032542513
+32
+2455.6433200213
+13
+1.80477854883065e-13
+23
+-934.329032542513
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-934.329032542513
+30
+2455.6433200213
+11
+182.278551827736
+21
+-916.376162171087
+31
+2455.6433200213
+12
+141.00638791784
+22
+-920.44111551416
+32
+2455.6433200213
+13
+141.00638791784
+23
+-920.44111551416
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-934.329032542513
+30
+2455.6433200213
+11
+141.00638791784
+21
+-920.44111551416
+31
+2455.6433200213
+12
+47.148335412588
+22
+-929.685326821772
+32
+2455.6433200213
+13
+47.148335412588
+23
+-929.685326821772
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+35.9517814413365
+20
+-1076.35666734212
+30
+2059.65014337885
+11
+40.1106512432663
+21
+-1076.01799327905
+31
+2051.86944523768
+12
+36.3998441498995
+22
+-1076.38347587727
+32
+2058.8118770109
+13
+36.3998441498995
+23
+-1076.38347587727
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.1106512432663
+20
+-1076.01799327905
+30
+2051.86944523768
+11
+35.9517814413365
+21
+-1076.35666734212
+31
+2059.65014337885
+12
+35.9517814413358
+22
+-976.024878397508
+32
+2059.65014337886
+13
+35.9517814413358
+23
+-976.024878397508
+33
+2059.65014337886
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.1106512432663
+20
+-1076.01799327905
+30
+2051.86944523768
+11
+35.9517814413358
+21
+-976.024878397508
+31
+2059.65014337886
+12
+40.1106512432667
+22
+-976.081021219369
+32
+2051.86944523768
+13
+40.1106512432667
+23
+-976.081021219369
+33
+2051.86944523768
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-10.2481189704998
+20
+-977.41094203537
+30
+2078.78676870972
+11
+-1.4681606386561
+21
+-1078.06037755542
+31
+2079.65151912724
+12
+-10.2481189705
+22
+-1077.26880722866
+32
+2078.78676870972
+13
+-10.2481189705
+23
+-1077.26880722866
+33
+2078.78676870972
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1.4681606386561
+20
+-1078.06037755542
+30
+2079.65151912724
+11
+-10.2481189704998
+21
+-977.41094203537
+31
+2078.78676870972
+12
+-1.46816063865592
+22
+-978.223928142328
+32
+2079.65151912724
+13
+-1.46816063865592
+23
+-978.223928142328
+33
+2079.65151912724
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+884.794355702396
+20
+-604.173850577965
+30
+1922.19277204157
+11
+180.675224578544
+21
+-609.663955206589
+31
+1911.92150871446
+12
+876.866113364493
+22
+-609.663955206589
+32
+1911.92150871446
+13
+876.866113364493
+23
+-609.663955206589
+33
+1911.92150871446
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-609.663955206589
+30
+1911.92150871446
+11
+884.794355702396
+21
+-604.173850577965
+31
+1922.19277204157
+12
+180.675224578544
+22
+-589.158254916404
+32
+1950.28497564898
+13
+180.675224578544
+23
+-589.158254916404
+33
+1950.28497564898
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-589.158254916404
+30
+1950.28497564898
+11
+884.794355702396
+21
+-604.173850577965
+31
+1922.19277204157
+12
+892.68433542823
+22
+-596.472603338329
+32
+1936.60079223358
+13
+892.68433542823
+23
+-596.472603338329
+33
+1936.60079223358
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-589.158254916404
+30
+1950.28497564898
+11
+892.68433542823
+21
+-596.472603338329
+31
+1936.60079223358
+12
+897.90069342138
+22
+-589.158254916404
+32
+1950.28497564898
+13
+897.90069342138
+23
+-589.158254916404
+33
+1950.28497564898
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.060123058849
+20
+-874.453748088142
+30
+2003.99630767223
+11
+-702.965588161926
+21
+-809.153241506708
+31
+1972.08037046597
+12
+-769.870311262695
+22
+-863.130130350016
+32
+1987.61043910797
+13
+-769.870311262695
+23
+-863.130130350016
+33
+1987.61043910797
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-702.965588161926
+20
+-809.153241506708
+30
+1972.08037046597
+11
+-758.060123058849
+21
+-874.453748088142
+31
+2003.99630767223
+12
+-687.957452549297
+22
+-823.760435027841
+32
+1993.10258668608
+13
+-687.957452549297
+23
+-823.760435027841
+33
+1993.10258668608
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-643.970452120392
+20
+-861.831591212861
+30
+2011.20252653019
+11
+-741.432257601186
+21
+-891.447302299009
+31
+1988.14599297097
+12
+-654.791104458432
+22
+-848.015122202593
+32
+1965.89490198638
+13
+-654.791104458432
+23
+-848.015122202593
+33
+1965.89490198638
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-741.432257601186
+20
+-891.447302299009
+30
+1988.14599297097
+11
+-643.970452120392
+21
+-861.831591212861
+31
+2011.20252653019
+12
+-731.724734127308
+22
+-900.26267972249
+32
+2019.84617451401
+13
+-731.724734127308
+23
+-900.26267972249
+33
+2019.84617451401
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-1016.06585313728
+30
+2035.20217666346
+11
+653.750224578544
+21
+-1011.8021195433
+31
+1991.91176299638
+12
+180.675224578544
+22
+-1011.8021195433
+32
+1991.91176299638
+13
+180.675224578544
+23
+-1011.8021195433
+33
+1991.91176299638
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1011.8021195433
+30
+1991.91176299638
+11
+180.675224578544
+21
+-1016.06585313728
+31
+2035.20217666346
+12
+653.750224578544
+22
+-1016.06585313728
+32
+2035.20217666346
+13
+653.750224578544
+23
+-1016.06585313728
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+590.997993226901
+20
+-590.997993226901
+30
+738.078199114136
+11
+452.472966724379
+21
+-677.173649450057
+31
+682.822310520627
+12
+575.888850875701
+22
+-575.888850875701
+32
+682.822310520627
+13
+575.888850875701
+23
+-575.888850875701
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+452.472966724379
+20
+-677.173649450057
+30
+682.822310520627
+11
+590.997993226901
+21
+-590.997993226901
+31
+738.078199114136
+12
+464.344143695271
+22
+-694.940121314314
+32
+738.078199114136
+13
+464.344143695271
+23
+-694.940121314314
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1051.79710945546
+20
+-209.215453044867
+30
+2148.21162800104
+11
+964.515951276275
+21
+-399.51558814382
+31
+2258.00680432354
+12
+990.771212819308
+22
+-410.390873558597
+32
+2148.21162800104
+13
+990.771212819308
+23
+-410.390873558597
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+964.515951276275
+20
+-399.51558814382
+30
+2258.00680432354
+11
+1051.79710945546
+21
+-209.215453044867
+31
+2148.21162800104
+12
+1023.92467246733
+22
+-203.671280618918
+32
+2258.00680432354
+13
+1023.92467246733
+23
+-203.671280618918
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-747.450883605455
+20
+1.80477854883065e-13
+30
+1427.8983600213
+11
+-878.79625075709
+21
+-89.3648841254364
+31
+1427.8983600213
+12
+-887.597923605455
+22
+3.60955709766131e-13
+32
+1427.8983600213
+13
+-887.597923605455
+23
+3.60955709766131e-13
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-878.79625075709
+20
+-89.3648841254364
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-870.542978388701
+22
+-173.161764737035
+32
+1427.8983600213
+13
+-870.542978388701
+23
+-173.161764737035
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-870.542978388701
+20
+-173.161764737035
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-868.904108801094
+22
+-178.564393729439
+32
+1427.8983600213
+13
+-868.904108801094
+23
+-178.564393729439
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-868.904108801094
+20
+-178.564393729439
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-842.852042179446
+22
+-264.446547810842
+32
+1427.8983600213
+13
+-842.852042179446
+23
+-264.446547810842
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-842.852042179446
+20
+-264.446547810842
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-820.033554718597
+22
+-339.669019965462
+32
+1427.8983600213
+13
+-820.033554718597
+23
+-339.669019965462
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-820.033554718597
+20
+-339.669019965462
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-814.713927134819
+22
+-349.621343174435
+32
+1427.8983600213
+13
+-814.713927134819
+23
+-349.621343174435
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-814.713927134819
+20
+-349.621343174435
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-772.428086079136
+22
+-428.73258747146
+32
+1427.8983600213
+13
+-772.428086079136
+23
+-428.73258747146
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-772.428086079136
+20
+-428.73258747146
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-738.010701420772
+22
+-493.122985245198
+32
+1427.8983600213
+13
+-738.010701420772
+23
+-493.122985245198
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.010701420772
+20
+-493.122985245198
+30
+1427.8983600213
+11
+-747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+-733.088824464619
+22
+-145.820433573828
+32
+1427.8983600213
+13
+-733.088824464619
+23
+-145.820433573828
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.010701420772
+20
+-493.122985245198
+30
+1427.8983600213
+11
+-733.088824464619
+21
+-145.820433573828
+31
+1427.8983600213
+12
+-727.278190985583
+22
+-506.200587048885
+32
+1427.8983600213
+13
+-727.278190985583
+23
+-506.200587048885
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-727.278190985583
+20
+-506.200587048885
+30
+1427.8983600213
+11
+-733.088824464619
+21
+-145.820433573828
+31
+1427.8983600213
+12
+-690.554572920556
+22
+-286.037069662455
+32
+1427.8983600213
+13
+-690.554572920556
+23
+-286.037069662455
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-727.278190985583
+20
+-506.200587048885
+30
+1427.8983600213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+1427.8983600213
+12
+-670.393897307106
+22
+-575.514299446691
+32
+1427.8983600213
+13
+-670.393897307106
+23
+-575.514299446691
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-670.393897307106
+20
+-575.514299446691
+30
+1427.8983600213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+1427.8983600213
+12
+-621.482696406623
+22
+-415.26146157539
+32
+1427.8983600213
+13
+-621.482696406623
+23
+-415.26146157539
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-670.393897307106
+20
+-575.514299446691
+30
+1427.8983600213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+1427.8983600213
+12
+-627.626510748516
+22
+-627.626510748516
+32
+1427.8983600213
+13
+-627.626510748516
+23
+-627.626510748516
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-627.626510748516
+20
+-627.626510748516
+30
+1427.8983600213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+1427.8983600213
+12
+-610.198917737466
+22
+-641.92896670788
+32
+1427.8983600213
+13
+-610.198917737466
+23
+-641.92896670788
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-610.198917737466
+20
+-641.92896670788
+30
+1427.8983600213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+1427.8983600213
+12
+-528.527588401294
+22
+-528.527588401294
+32
+1427.8983600213
+13
+-528.527588401294
+23
+-528.527588401294
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-610.198917737466
+20
+-641.92896670788
+30
+1427.8983600213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+-540.907488126092
+22
+-698.794973376131
+32
+1427.8983600213
+13
+-540.907488126092
+23
+-698.794973376131
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-540.907488126092
+20
+-698.794973376131
+30
+1427.8983600213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+-493.122985245198
+22
+-738.010701420772
+32
+1427.8983600213
+13
+-493.122985245198
+23
+-738.010701420772
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-493.122985245198
+20
+-738.010701420772
+30
+1427.8983600213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+-415.26146157539
+22
+-621.482696406623
+32
+1427.8983600213
+13
+-415.26146157539
+23
+-621.482696406623
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-493.122985245198
+20
+-738.010701420772
+30
+1427.8983600213
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+-468.281766857471
+22
+-751.288609279597
+32
+1427.8983600213
+13
+-468.281766857471
+23
+-751.288609279597
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-468.281766857471
+20
+-751.288609279597
+30
+1427.8983600213
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+-389.246833055444
+22
+-793.533661525914
+32
+1427.8983600213
+13
+-389.246833055444
+23
+-793.533661525914
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-389.246833055444
+20
+-793.533661525914
+30
+1427.8983600213
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+-286.037069662455
+22
+-690.554572920556
+32
+1427.8983600213
+13
+-286.037069662455
+23
+-690.554572920556
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-389.246833055444
+20
+-793.533661525914
+30
+1427.8983600213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+-339.669019965462
+22
+-820.033554718597
+32
+1427.8983600213
+13
+-339.669019965462
+23
+-820.033554718597
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-339.669019965462
+20
+-820.033554718597
+30
+1427.8983600213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+-307.339192645458
+22
+-829.840700617718
+32
+1427.8983600213
+13
+-307.339192645458
+23
+-829.840700617718
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-307.339192645458
+20
+-829.840700617718
+30
+1427.8983600213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+-221.595075742173
+22
+-855.85089411917
+32
+1427.8983600213
+13
+-221.595075742173
+23
+-855.85089411917
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-221.595075742173
+20
+-855.85089411917
+30
+1427.8983600213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+-145.820433573828
+22
+-733.088824464619
+32
+1427.8983600213
+13
+-145.820433573828
+23
+-733.088824464619
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-221.595075742173
+20
+-855.85089411917
+30
+1427.8983600213
+11
+-145.820433573828
+21
+-733.088824464619
+31
+1427.8983600213
+12
+-173.161764737035
+22
+-870.542978388701
+32
+1427.8983600213
+13
+-173.161764737035
+23
+-870.542978388701
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-173.161764737035
+20
+-870.542978388701
+30
+1427.8983600213
+11
+-145.820433573828
+21
+-733.088824464619
+31
+1427.8983600213
+12
+-44.7901031548271
+22
+-883.186483489224
+32
+1427.8983600213
+13
+-44.7901031548271
+23
+-883.186483489224
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-44.7901031548271
+20
+-883.186483489224
+30
+1427.8983600213
+11
+-145.820433573828
+21
+-733.088824464619
+31
+1427.8983600213
+12
+0.0
+22
+-747.450883605455
+32
+1427.8983600213
+13
+0.0
+23
+-747.450883605455
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-44.7901031548271
+20
+-883.186483489224
+30
+1427.8983600213
+11
+0.0
+21
+-747.450883605455
+31
+1427.8983600213
+12
+1.80477854883065e-13
+22
+-887.597923605455
+32
+1427.8983600213
+13
+1.80477854883065e-13
+23
+-887.597923605455
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-887.597923605455
+30
+1427.8983600213
+11
+0.0
+21
+-747.450883605455
+31
+1427.8983600213
+12
+145.820433573828
+22
+-733.088824464618
+32
+1427.8983600213
+13
+145.820433573828
+23
+-733.088824464618
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-887.597923605455
+30
+1427.8983600213
+11
+145.820433573828
+21
+-733.088824464618
+31
+1427.8983600213
+12
+44.7901424632535
+22
+-883.186479617682
+32
+1427.8983600213
+13
+44.7901424632535
+23
+-883.186479617682
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+44.7901424632535
+20
+-883.186479617682
+30
+1427.8983600213
+11
+145.820433573828
+21
+-733.088824464618
+31
+1427.8983600213
+12
+133.953889402395
+22
+-874.404617053063
+32
+1427.8983600213
+13
+133.953889402395
+23
+-874.404617053063
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+133.953889402395
+20
+-874.404617053063
+30
+1427.8983600213
+11
+145.820433573828
+21
+-733.088824464618
+31
+1427.8983600213
+12
+173.161764737035
+22
+-870.542978388701
+32
+1427.8983600213
+13
+173.161764737035
+23
+-870.542978388701
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+173.161764737035
+20
+-870.542978388701
+30
+1427.8983600213
+11
+145.820433573828
+21
+-733.088824464618
+31
+1427.8983600213
+12
+286.037069662455
+22
+-690.554572920556
+32
+1427.8983600213
+13
+286.037069662455
+23
+-690.554572920556
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+173.161764737035
+20
+-870.542978388701
+30
+1427.8983600213
+11
+286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+221.595154594654
+22
+-855.850870199531
+32
+1427.8983600213
+13
+221.595154594654
+23
+-855.850870199531
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+221.595154594654
+20
+-855.850870199531
+30
+1427.8983600213
+11
+286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+307.339228961076
+22
+-829.840689601495
+32
+1427.8983600213
+13
+307.339228961076
+23
+-829.840689601495
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+307.339228961076
+20
+-829.840689601495
+30
+1427.8983600213
+11
+286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+415.26146157539
+22
+-621.482696406623
+32
+1427.8983600213
+13
+415.26146157539
+23
+-621.482696406623
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+307.339228961076
+20
+-829.840689601495
+30
+1427.8983600213
+11
+415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+339.669019965462
+22
+-820.033554718597
+32
+1427.8983600213
+13
+339.669019965462
+23
+-820.033554718597
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+339.669019965462
+20
+-820.033554718597
+30
+1427.8983600213
+11
+415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+389.246864354028
+22
+-793.533644796473
+32
+1427.8983600213
+13
+389.246864354028
+23
+-793.533644796473
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+389.246864354028
+20
+-793.533644796473
+30
+1427.8983600213
+11
+415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+468.281762027731
+22
+-751.288611861147
+32
+1427.8983600213
+13
+468.281762027731
+23
+-751.288611861147
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+468.281762027731
+20
+-751.288611861147
+30
+1427.8983600213
+11
+415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+528.527588401294
+22
+-528.527588401294
+32
+1427.8983600213
+13
+528.527588401294
+23
+-528.527588401294
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+468.281762027731
+20
+-751.288611861147
+30
+1427.8983600213
+11
+528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+493.122985245198
+22
+-738.010701420772
+32
+1427.8983600213
+13
+493.122985245198
+23
+-738.010701420772
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+493.122985245198
+20
+-738.010701420772
+30
+1427.8983600213
+11
+528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+540.907511486368
+22
+-698.794954204847
+32
+1427.8983600213
+13
+540.907511486368
+23
+-698.794954204847
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+540.907511486368
+20
+-698.794954204847
+30
+1427.8983600213
+11
+528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+621.482696406623
+22
+-415.26146157539
+32
+1427.8983600213
+13
+621.482696406623
+23
+-415.26146157539
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+540.907511486368
+20
+-698.794954204847
+30
+1427.8983600213
+11
+621.482696406623
+21
+-415.26146157539
+31
+1427.8983600213
+12
+627.626510748516
+22
+-627.626510748516
+32
+1427.8983600213
+13
+627.626510748516
+23
+-627.626510748516
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+627.626510748516
+20
+-627.626510748516
+30
+1427.8983600213
+11
+621.482696406623
+21
+-415.26146157539
+31
+1427.8983600213
+12
+690.554572920556
+22
+-286.037069662455
+32
+1427.8983600213
+13
+690.554572920556
+23
+-286.037069662455
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+627.626510748516
+20
+-627.626510748516
+30
+1427.8983600213
+11
+690.554572920556
+21
+-286.037069662455
+31
+1427.8983600213
+12
+738.010701420772
+22
+-493.122985245198
+32
+1427.8983600213
+13
+738.010701420772
+23
+-493.122985245198
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.010701420772
+20
+-493.122985245198
+30
+1427.8983600213
+11
+690.554572920556
+21
+-286.037069662455
+31
+1427.8983600213
+12
+733.088824464618
+22
+-145.820433573828
+32
+1427.8983600213
+13
+733.088824464618
+23
+-145.820433573828
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.010701420772
+20
+-493.122985245198
+30
+1427.8983600213
+11
+733.088824464618
+21
+-145.820433573828
+31
+1427.8983600213
+12
+747.450883605455
+22
+1.80477854883065e-13
+32
+1427.8983600213
+13
+747.450883605455
+23
+1.80477854883065e-13
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.010701420772
+20
+-493.122985245198
+30
+1427.8983600213
+11
+747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+820.033554718597
+22
+-339.669019965462
+32
+1427.8983600213
+13
+820.033554718597
+23
+-339.669019965462
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+820.033554718597
+20
+-339.669019965462
+30
+1427.8983600213
+11
+747.450883605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+887.597923605455
+22
+1.80477854883065e-13
+32
+1427.8983600213
+13
+887.597923605455
+23
+1.80477854883065e-13
+33
+1427.8983600213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+820.033554718597
+20
+-339.669019965462
+30
+1427.8983600213
+11
+887.597923605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+870.542978388702
+22
+-173.161764737035
+32
+1427.8983600213
+13
+870.542978388702
+23
+-173.161764737035
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+435.577877671407
+20
+-651.888361812631
+30
+631.979456702016
+11
+285.268899238265
+21
+-688.700045464263
+31
+587.016306884026
+12
+414.146250971868
+22
+-619.813665790805
+32
+587.016306884026
+13
+414.146250971868
+23
+-619.813665790805
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+285.268899238265
+20
+-688.700045464263
+30
+587.016306884026
+11
+435.577877671407
+21
+-651.888361812631
+31
+631.979456702016
+12
+300.031260464802
+22
+-724.33953815002
+32
+631.979456702016
+13
+300.031260464802
+23
+-724.33953815002
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-829.407026995335
+20
+-554.192057578438
+30
+1708.93950189862
+11
+-660.670394770277
+21
+-660.670394770277
+31
+1614.7610800213
+12
+-705.352696568271
+22
+-705.352696568271
+32
+1708.93950189862
+13
+-705.352696568271
+23
+-705.352696568271
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.670394770277
+20
+-660.670394770277
+30
+1614.7610800213
+11
+-829.407026995335
+21
+-554.192057578438
+31
+1708.93950189862
+12
+-705.689426216297
+22
+-605.814546234746
+32
+1614.7610800213
+13
+-705.689426216297
+23
+-605.814546234746
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.689426216297
+20
+-605.814546234746
+30
+1614.7610800213
+11
+-829.407026995335
+21
+-554.192057578438
+31
+1708.93950189862
+12
+-765.568613986399
+22
+-532.851544827532
+32
+1614.7610800213
+13
+-765.568613986399
+23
+-532.851544827532
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-765.568613986399
+20
+-532.851544827532
+30
+1614.7610800213
+11
+-829.407026995335
+21
+-554.192057578438
+31
+1708.93950189862
+12
+-776.866198451135
+22
+-519.085398326623
+32
+1614.7610800213
+13
+-776.866198451135
+23
+-519.085398326623
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+311.668800211604
+20
+-752.435044439405
+30
+682.822310520627
+11
+152.954610178005
+21
+-768.954752250597
+31
+631.979456702016
+12
+300.031260464802
+22
+-724.33953815002
+32
+631.979456702016
+13
+300.031260464802
+23
+-724.33953815002
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+152.954610178005
+20
+-768.954752250597
+30
+631.979456702016
+11
+311.668800211604
+21
+-752.435044439405
+31
+682.822310520627
+12
+158.887376492573
+22
+-798.780782641381
+32
+682.822310520627
+13
+158.887376492573
+23
+-798.780782641381
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+319.845809128627
+20
+-772.176090266528
+30
+738.078199114136
+11
+158.887376492573
+21
+-798.780782641381
+31
+682.822310520627
+12
+311.668800211604
+22
+-752.435044439405
+32
+682.822310520627
+13
+311.668800211604
+23
+-752.435044439405
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+158.887376492573
+20
+-798.780782641381
+30
+682.822310520627
+11
+319.845809128627
+21
+-772.176090266528
+31
+738.078199114136
+12
+163.055979488767
+22
+-819.73776511114
+32
+738.078199114136
+13
+163.055979488767
+23
+-819.73776511114
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.325364744673
+20
+-441.215302798659
+30
+1054.1729200213
+11
+495.494614285553
+21
+-495.494614285553
+31
+1241.03564002131
+12
+561.560562517035
+22
+-561.560562517035
+32
+1054.1729200213
+13
+561.560562517035
+23
+-561.560562517035
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+495.494614285553
+20
+-495.494614285553
+30
+1241.03564002131
+11
+660.325364744673
+21
+-441.215302798659
+31
+1054.1729200213
+12
+582.640028068573
+22
+-389.307620352121
+32
+1241.03564002131
+13
+582.640028068573
+23
+-389.307620352121
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+575.888850875701
+20
+-575.888850875701
+30
+682.822310520627
+11
+435.577877671407
+21
+-651.888361812631
+31
+631.979456702016
+12
+554.385481313987
+22
+-554.385481313987
+32
+631.979456702016
+13
+554.385481313987
+23
+-554.385481313987
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+435.577877671407
+20
+-651.888361812631
+30
+631.979456702016
+11
+575.888850875701
+21
+-575.888850875701
+31
+682.822310520627
+12
+452.472966724379
+22
+-677.173649450057
+32
+682.822310520627
+13
+452.472966724379
+23
+-677.173649450057
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+43.536421039762
+20
+-1075.68058440422
+30
+2034.64693744883
+11
+42.6716706222411
+21
+-976.267680774437
+31
+2025.86697911698
+12
+42.6716706222413
+22
+-1075.76575488639
+32
+2025.86697911698
+13
+42.6716706222413
+23
+-1075.76575488639
+33
+2025.86697911698
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+42.6716706222411
+20
+-976.267680774437
+30
+2025.86697911698
+11
+43.536421039762
+21
+-1075.68058440422
+31
+2034.64693744883
+12
+43.5364210397618
+22
+-976.708082157409
+32
+2034.64693744883
+13
+43.5364210397618
+23
+-976.708082157409
+33
+2034.64693744883
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+180.675224578544
+21
+-879.083714298798
+31
+2240.21043503138
+12
+180.675224578544
+22
+-837.4569269514
+32
+2252.83778292244
+13
+180.675224578544
+23
+-837.4569269514
+33
+2252.83778292244
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-879.083714298798
+30
+2240.21043503138
+11
+653.750224578544
+21
+-837.4569269514
+31
+2252.83778292244
+12
+653.750224578544
+22
+-879.083714298799
+32
+2240.21043503138
+13
+653.750224578544
+23
+-879.083714298799
+33
+2240.21043503138
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-804.422958470166
+20
+-708.167767562713
+30
+2102.55187642937
+11
+-853.465106968372
+21
+-778.056206654812
+31
+2053.98620958956
+12
+-843.757583494495
+22
+-786.871584078293
+32
+2085.68639113261
+13
+-843.757583494495
+23
+-786.871584078293
+33
+2085.68639113261
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.465106968372
+20
+-778.056206654812
+30
+2053.98620958956
+11
+-804.422958470166
+21
+-708.167767562713
+31
+2102.55187642937
+12
+-818.273878310588
+22
+-697.096462294947
+32
+2058.80160712022
+13
+-818.273878310588
+23
+-697.096462294947
+33
+2058.80160712022
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+911.54074094115
+20
+-574.592524622259
+30
+2058.8118770109
+11
+907.767925107023
+21
+-572.267173431359
+31
+2035.20224673698
+12
+912.783669278017
+22
+-572.267169258698
+32
+2035.20224467364
+13
+912.783669278017
+23
+-572.267169258698
+33
+2035.20224467364
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+907.767925107023
+20
+-572.267173431359
+30
+2035.20224673698
+11
+180.675224578544
+21
+-576.530907025343
+31
+2078.49259033054
+12
+180.675224578544
+22
+-572.26717343136
+32
+2035.20217666346
+13
+180.675224578544
+23
+-572.26717343136
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-576.530907025343
+30
+2078.49259033054
+11
+907.767925107023
+21
+-572.267173431359
+31
+2035.20224673698
+12
+911.54074094115
+22
+-574.592524622259
+32
+2058.8118770109
+13
+911.54074094115
+23
+-574.592524622259
+33
+2058.8118770109
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-576.530907025343
+30
+2078.49259033054
+11
+911.54074094115
+21
+-574.592524622259
+31
+2058.8118770109
+12
+908.625264240696
+22
+-576.530906699202
+32
+2078.49259036266
+13
+908.625264240696
+23
+-576.530906699202
+33
+2078.49259036266
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+527.108194536515
+20
+-527.108194536515
+30
+587.016306884026
+11
+435.577877671407
+21
+-651.888361812631
+31
+631.979456702016
+12
+414.146250971868
+22
+-619.813665790805
+32
+587.016306884026
+13
+414.146250971868
+23
+-619.813665790805
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+435.577877671407
+20
+-651.888361812631
+30
+631.979456702016
+11
+527.108194536515
+21
+-527.108194536515
+31
+587.016306884026
+12
+554.385481313987
+22
+-554.385481313987
+32
+631.979456702016
+13
+554.385481313987
+23
+-554.385481313987
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+369.410361108008
+20
+-997.119327169824
+30
+2170.81091140737
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+349.642943907379
+22
+-1009.19889581502
+32
+2148.21162800104
+13
+349.642943907379
+23
+-1009.19889581502
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+369.410361108008
+21
+-997.119327169824
+31
+2170.81091140737
+12
+203.671280618918
+22
+-1023.92467246733
+32
+2258.00680432354
+13
+203.671280618918
+23
+-1023.92467246733
+33
+2258.00680432354
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+203.671280618918
+20
+-1023.92467246733
+30
+2258.00680432354
+11
+369.410361108008
+21
+-997.119327169824
+31
+2170.81091140737
+12
+406.150729088795
+22
+-980.53459853389
+32
+2191.01946172118
+13
+406.150729088795
+23
+-980.53459853389
+33
+2191.01946172118
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+203.671280618918
+20
+-1023.92467246733
+30
+2258.00680432354
+11
+406.150729088795
+21
+-980.53459853389
+31
+2191.01946172118
+12
+399.51558814382
+22
+-964.515951276275
+32
+2258.00680432354
+13
+399.51558814382
+23
+-964.515951276275
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-647.394912321209
+20
+-268.159752894786
+30
+1241.03564002131
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1054.1729200213
+12
+-733.714233519903
+22
+-303.914386430124
+32
+1054.1729200213
+13
+-733.714233519903
+23
+-303.914386430124
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-778.906875772646
+20
+-154.93421062823
+30
+1054.1729200213
+11
+-647.394912321209
+21
+-268.159752894786
+31
+1241.03564002131
+12
+-687.270773156591
+22
+-136.706656519425
+32
+1241.03564002131
+13
+-687.270773156591
+23
+-136.706656519425
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-831.221151351825
+20
+-165.340167031437
+30
+796.153149972084
+11
+-772.176090266528
+21
+-319.845809128627
+31
+738.078199114136
+12
+-782.993203577332
+22
+-324.326404167689
+32
+796.153149972084
+13
+-782.993203577332
+23
+-324.326404167689
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-772.176090266528
+20
+-319.845809128627
+30
+738.078199114136
+11
+-831.221151351825
+21
+-165.340167031437
+31
+796.153149972084
+12
+-819.73776511114
+22
+-163.055979488767
+32
+738.078199114136
+13
+-819.73776511114
+23
+-163.055979488767
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-752.435044439405
+20
+-311.668800211604
+30
+682.822310520627
+11
+-651.888361812631
+21
+-435.577877671407
+31
+631.979456702016
+12
+-677.173649450057
+22
+-452.47296672438
+32
+682.822310520627
+13
+-677.173649450057
+23
+-452.47296672438
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-651.888361812631
+20
+-435.577877671407
+30
+631.979456702016
+11
+-752.435044439405
+21
+-311.668800211604
+31
+682.822310520627
+12
+-724.33953815002
+22
+-300.031260464802
+32
+631.979456702016
+13
+-724.33953815002
+23
+-300.031260464802
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-772.176090266528
+20
+-319.845809128627
+30
+738.078199114136
+11
+-677.173649450057
+21
+-452.47296672438
+31
+682.822310520627
+12
+-694.940121314314
+22
+-464.344143695271
+32
+738.078199114136
+13
+-694.940121314314
+23
+-464.344143695271
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-677.173649450057
+20
+-452.47296672438
+30
+682.822310520627
+11
+-772.176090266528
+21
+-319.845809128627
+31
+738.078199114136
+12
+-752.435044439405
+22
+-311.668800211604
+32
+682.822310520627
+13
+-752.435044439405
+23
+-311.668800211604
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-389.307620352121
+20
+-582.640028068573
+30
+1241.03564002131
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1054.1729200213
+12
+-441.215302798659
+22
+-660.325364744672
+32
+1054.1729200213
+13
+-441.215302798659
+23
+-660.325364744672
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-561.560562517035
+20
+-561.560562517035
+30
+1054.1729200213
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1241.03564002131
+12
+-495.494614285553
+22
+-495.494614285553
+32
+1241.03564002131
+13
+-495.494614285553
+23
+-495.494614285553
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-415.26146157539
+20
+-621.482696406623
+30
+1427.8983600213
+11
+-594.593536632775
+21
+-594.593536632776
+31
+1241.03564002131
+12
+-467.169144021928
+22
+-699.168033082722
+32
+1241.03564002131
+13
+-467.169144021928
+23
+-699.168033082722
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+1241.03564002131
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1427.8983600213
+12
+-528.527588401294
+22
+-528.527588401294
+32
+1427.8983600213
+13
+-528.527588401294
+23
+-528.527588401294
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-997.519349743285
+20
+3.60955709766131e-13
+30
+1708.93950189862
+11
+-916.376162171087
+21
+-182.278551827736
+31
+1614.7610800213
+12
+-978.352295145615
+22
+-194.606371158736
+32
+1708.93950189862
+13
+-978.352295145615
+23
+-194.606371158736
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-916.376162171087
+20
+-182.278551827736
+30
+1614.7610800213
+11
+-997.519349743285
+21
+3.60955709766131e-13
+31
+1708.93950189862
+12
+-925.063957882084
+22
+-94.0698816812515
+32
+1614.7610800213
+13
+-925.063957882084
+23
+-94.0698816812515
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-925.063957882084
+20
+-94.0698816812515
+30
+1614.7610800213
+11
+-997.519349743285
+21
+3.60955709766131e-13
+31
+1708.93950189862
+12
+-934.329032542513
+22
+3.60955709766131e-13
+32
+1614.7610800213
+13
+-934.329032542513
+23
+3.60955709766131e-13
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-978.352295145615
+20
+-194.606371158736
+30
+2361.46489814399
+11
+-1043.98454271904
+21
+3.60955709766131e-13
+31
+2258.00680432354
+12
+-1023.92467246733
+22
+-203.671280618918
+32
+2258.00680432354
+13
+-1023.92467246733
+23
+-203.671280618918
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1043.98454271904
+20
+3.60955709766131e-13
+30
+2258.00680432354
+11
+-978.352295145615
+21
+-194.606371158736
+31
+2361.46489814399
+12
+-997.519349743285
+22
+3.60955709766131e-13
+32
+2361.46489814399
+13
+-997.519349743285
+23
+3.60955709766131e-13
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+794.166563605455
+20
+1.80477854883065e-13
+30
+1054.1729200213
+11
+687.270773156591
+21
+-136.706656519426
+31
+1241.03564002131
+12
+778.906875772646
+22
+-154.93421062823
+32
+1054.1729200213
+13
+778.906875772646
+23
+-154.93421062823
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+687.270773156591
+20
+-136.706656519426
+30
+1241.03564002131
+11
+794.166563605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+700.735203605455
+22
+0.0
+32
+1241.03564002131
+13
+700.735203605455
+23
+0.0
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-832.543811724793
+20
+-84.6615196498334
+30
+2549.0746800213
+11
+-824.724927080674
+21
+-164.047987682633
+31
+2455.6433200213
+12
+-824.724927080674
+22
+-164.047987682633
+32
+2549.0746800213
+13
+-824.724927080674
+23
+-164.047987682633
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+2455.6433200213
+11
+-832.543811724793
+21
+-84.6615196498334
+31
+2549.0746800213
+12
+-840.882243605455
+22
+1.80477854883065e-13
+32
+2455.6433200213
+13
+-840.882243605455
+23
+1.80477854883065e-13
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-832.543811724793
+21
+-84.6615196498334
+31
+2549.0746800213
+12
+-840.882243605455
+22
+1.80477854883065e-13
+32
+2549.0746800213
+13
+-840.882243605455
+23
+1.80477854883065e-13
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+1427.8983600213
+11
+-776.873894119249
+21
+-321.791703197793
+31
+1241.03564002131
+12
+-699.168033082722
+22
+-467.169144021928
+32
+1241.03564002131
+13
+-699.168033082722
+23
+-467.169144021928
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.873894119249
+20
+-321.791703197793
+30
+1241.03564002131
+11
+-621.482696406623
+21
+-415.26146157539
+31
+1427.8983600213
+12
+-690.554572920556
+22
+-286.037069662455
+32
+1427.8983600213
+13
+-690.554572920556
+23
+-286.037069662455
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+464.344143695271
+20
+-694.940121314314
+30
+738.078199114136
+11
+311.668800211604
+21
+-752.435044439405
+31
+682.822310520627
+12
+452.472966724379
+22
+-677.173649450057
+32
+682.822310520627
+13
+452.472966724379
+23
+-677.173649450057
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+311.668800211604
+20
+-752.435044439405
+30
+682.822310520627
+11
+464.344143695271
+21
+-694.940121314314
+31
+738.078199114136
+12
+319.845809128627
+22
+-772.176090266528
+32
+738.078199114136
+13
+319.845809128627
+23
+-772.176090266528
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+470.84895947612
+20
+-704.67526609701
+30
+796.153149972084
+11
+319.845809128627
+21
+-772.176090266528
+31
+738.078199114136
+12
+464.344143695271
+22
+-694.940121314314
+32
+738.078199114136
+13
+464.344143695271
+23
+-694.940121314314
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+319.845809128627
+20
+-772.176090266528
+30
+738.078199114136
+11
+470.84895947612
+21
+-704.67526609701
+31
+796.153149972084
+12
+324.326404167689
+22
+-782.993203577332
+32
+796.153149972084
+13
+324.326404167689
+23
+-782.993203577332
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+964.515951276275
+20
+-399.51558814382
+30
+2258.00680432354
+11
+829.407026995336
+21
+-554.192057578438
+31
+2361.46489814399
+12
+868.04142298445
+22
+-580.006735667279
+32
+2258.00680432354
+13
+868.04142298445
+23
+-580.006735667279
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+829.407026995336
+20
+-554.192057578438
+30
+2361.46489814399
+11
+964.515951276275
+21
+-399.51558814382
+31
+2258.00680432354
+12
+921.587710511789
+22
+-381.734128610352
+32
+2361.46489814399
+13
+921.587710511789
+23
+-381.734128610352
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-413.286070645571
+20
+-997.760836892423
+30
+2058.8118770109
+11
+-599.99837764929
+21
+-897.961029579872
+31
+2011.5925230317
+12
+-413.286070645571
+22
+-997.760836892423
+32
+2011.5925230317
+13
+-413.286070645571
+23
+-997.760836892423
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-599.99837764929
+20
+-897.961029579872
+30
+2011.5925230317
+11
+-413.286070645571
+21
+-997.760836892423
+31
+2058.8118770109
+12
+-599.99837764929
+22
+-897.961029579872
+32
+2058.8118770109
+13
+-599.99837764929
+23
+-897.961029579872
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-784.574341950659
+20
+-324.981333125909
+30
+855.37186879426
+11
+-704.67526609701
+21
+-470.84895947612
+31
+796.153149972084
+12
+-706.098253038492
+22
+-471.799768952456
+32
+855.37186879426
+13
+-706.098253038492
+23
+-471.799768952456
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-704.67526609701
+20
+-470.84895947612
+30
+796.153149972084
+11
+-784.574341950659
+21
+-324.981333125909
+31
+855.37186879426
+12
+-782.993203577332
+22
+-324.326404167689
+32
+796.153149972084
+13
+-782.993203577332
+23
+-324.326404167689
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-26.4713665686843
+20
+-1076.14565304285
+30
+1997.22699536883
+11
+-33.2912055279291
+21
+-975.812207442705
+31
+2002.82389255955
+12
+-33.2912055279292
+22
+-1075.947598755
+32
+2002.82389255955
+13
+-33.2912055279292
+23
+-1075.947598755
+33
+2002.82389255955
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-33.2912055279291
+20
+-975.812207442705
+30
+2002.82389255955
+11
+-26.4713665686843
+21
+-1076.14565304285
+31
+1997.22699536883
+12
+-26.4713665686843
+22
+-976.148870417647
+32
+1997.22699536883
+13
+-26.4713665686843
+23
+-976.148870417647
+33
+1997.22699536883
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-38.8881027186484
+20
+-975.735675994198
+30
+2059.65014337885
+11
+-33.2912055279292
+21
+-1076.04157769881
+31
+2066.4699823381
+12
+-38.8881027186488
+22
+-1076.06746493881
+32
+2059.65014337885
+13
+-38.8881027186488
+23
+-1076.06746493881
+33
+2059.65014337885
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-33.2912055279292
+20
+-1076.04157769881
+30
+2066.4699823381
+11
+-38.8881027186484
+21
+-975.735675994198
+31
+2059.65014337885
+12
+-33.2912055279292
+22
+-975.878683928089
+32
+2066.4699823381
+13
+-33.2912055279292
+23
+-975.878683928089
+33
+2066.4699823381
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+23.5350452913723
+20
+-1076.43485544616
+30
+1997.22699536883
+11
+15.754347150196
+21
+-976.955453067628
+31
+1993.0681255669
+12
+15.754347150196
+22
+-1076.84924014666
+32
+1993.0681255669
+13
+15.754347150196
+23
+-1076.84924014666
+33
+1993.0681255669
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+15.754347150196
+20
+-976.955453067628
+30
+1993.0681255669
+11
+23.5350452913723
+21
+-1076.43485544616
+31
+1997.22699536883
+12
+23.5350452913723
+22
+-976.438072820957
+32
+1997.22699536883
+13
+23.5350452913723
+23
+-976.438072820957
+33
+1997.22699536883
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+7.31179769318775
+20
+-1077.46403068815
+30
+1990.50710618793
+11
+15.754347150196
+21
+-976.955453067628
+31
+1993.0681255669
+12
+7.31179769318757
+22
+-977.633667953296
+32
+1990.50710618793
+13
+7.31179769318757
+23
+-977.633667953296
+33
+1990.50710618793
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+15.754347150196
+20
+-976.955453067628
+30
+1993.0681255669
+11
+7.31179769318775
+21
+-1077.46403068815
+31
+1990.50710618793
+12
+15.754347150196
+22
+-1076.84924014666
+32
+1993.0681255669
+13
+15.754347150196
+23
+-1076.84924014666
+33
+1993.0681255669
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.1106512432667
+20
+-976.081021219369
+30
+2051.86944523768
+11
+42.6716706222413
+21
+-1075.76575488639
+31
+2043.42689578067
+12
+40.1106512432663
+22
+-1076.01799327905
+32
+2051.86944523768
+13
+40.1106512432663
+23
+-1076.01799327905
+33
+2051.86944523768
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+42.6716706222413
+20
+-1075.76575488639
+30
+2043.42689578067
+11
+40.1106512432667
+21
+-976.081021219369
+31
+2051.86944523768
+12
+42.6716706222411
+22
+-976.334157259822
+32
+2043.42689578067
+13
+42.6716706222411
+23
+-976.334157259822
+33
+2043.42689578067
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-410.390873558597
+20
+-990.771212819307
+30
+2148.21162800104
+11
+-599.99837764929
+21
+-897.961029579872
+31
+2058.8118770109
+12
+-413.286070645571
+22
+-997.760836892423
+32
+2058.8118770109
+13
+-413.286070645571
+23
+-997.760836892423
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-599.99837764929
+20
+-897.961029579872
+30
+2058.8118770109
+11
+-410.390873558597
+21
+-990.771212819307
+31
+2148.21162800104
+12
+-595.795202951324
+22
+-891.670534105406
+32
+2148.21162800104
+13
+-595.795202951324
+23
+-891.670534105406
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-582.640028068573
+20
+-389.307620352121
+30
+1241.03564002131
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1054.1729200213
+12
+-660.325364744672
+22
+-441.215302798659
+32
+1054.1729200213
+13
+-660.325364744672
+23
+-441.215302798659
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-733.714233519903
+20
+-303.914386430124
+30
+1054.1729200213
+11
+-582.640028068573
+21
+-389.307620352121
+31
+1241.03564002131
+12
+-647.394912321209
+22
+-268.159752894786
+32
+1241.03564002131
+13
+-647.394912321209
+23
+-268.159752894786
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1079.96854760957
+20
+3.60955709766131e-13
+30
+2011.5925230317
+11
+-1051.79710945546
+21
+-209.215453044867
+31
+1922.19277204157
+12
+-1059.21725479392
+22
+-210.691411720441
+32
+2011.5925230317
+13
+-1059.21725479392
+23
+-210.691411720441
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1051.79710945546
+20
+-209.215453044867
+30
+1922.19277204157
+11
+-1079.96854760957
+21
+3.60955709766131e-13
+31
+2011.5925230317
+12
+-1072.40303302985
+22
+3.60955709766131e-13
+32
+1922.19277204157
+13
+-1072.40303302985
+23
+3.60955709766131e-13
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+600.487204246519
+20
+-600.48720424652
+30
+855.37186879426
+11
+470.84895947612
+21
+-704.67526609701
+31
+796.153149972084
+12
+599.277053327022
+22
+-599.277053327022
+32
+796.153149972084
+13
+599.277053327022
+23
+-599.277053327022
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+470.84895947612
+20
+-704.67526609701
+30
+796.153149972084
+11
+600.487204246519
+21
+-600.48720424652
+31
+855.37186879426
+12
+471.799768952456
+22
+-706.098253038493
+32
+855.37186879426
+13
+471.799768952456
+23
+-706.098253038493
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493597603992
+20
+-867.967629842289
+30
+2084.51449834551
+11
+180.675224578544
+21
+-856.929131071254
+31
+2097.9647944504
+12
+180.675224578544
+22
+-867.967544283947
+32
+2084.51444903383
+13
+180.675224578544
+23
+-867.967544283947
+33
+2084.51444903383
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-856.929131071254
+30
+2097.9647944504
+11
+104.493597603992
+21
+-867.967629842289
+31
+2084.51449834551
+12
+104.493594381781
+22
+-856.929210819903
+32
+2097.96485084121
+13
+104.493594381781
+23
+-856.929210819903
+33
+2097.96485084121
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-843.478785654691
+30
+2109.00320766309
+11
+104.493594381781
+21
+-856.929210819903
+31
+2097.96485084121
+12
+104.493591159571
+22
+-843.478858324207
+32
+2109.0032698636
+13
+104.493591159571
+23
+-843.478858324207
+33
+2109.0032698636
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493594381781
+20
+-856.929210819903
+30
+2097.96485084121
+11
+180.675224578544
+21
+-843.478785654691
+31
+2109.00320766309
+12
+180.675224578544
+22
+-856.929131071254
+32
+2097.9647944504
+13
+180.675224578544
+23
+-856.929131071254
+33
+2097.9647944504
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-828.133397265575
+30
+2117.20548864256
+11
+104.493591159571
+21
+-843.478858324207
+31
+2109.0032698636
+12
+104.493588061189
+22
+-828.133461858568
+32
+2117.20555516006
+13
+104.493588061189
+23
+-828.133461858568
+33
+2117.20555516006
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493591159571
+20
+-843.478858324207
+30
+2109.0032698636
+11
+180.675224578544
+21
+-828.133397265575
+31
+2117.20548864256
+12
+180.675224578544
+22
+-843.478785654691
+32
+2109.00320766309
+13
+180.675224578544
+23
+-843.478785654691
+33
+2109.00320766309
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-811.482680573908
+30
+2122.25642833066
+11
+104.493588061189
+21
+-828.133461858568
+31
+2117.20555516006
+12
+104.493585205705
+22
+-811.482736403362
+32
+2122.25649750655
+13
+104.493585205705
+23
+-811.482736403362
+33
+2122.25649750655
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493588061189
+20
+-828.133461858568
+30
+2117.20555516006
+11
+180.675224578544
+21
+-811.482680573908
+31
+2122.25642833066
+12
+180.675224578544
+22
+-828.133397265575
+32
+2117.20548864256
+13
+180.675224578544
+23
+-828.133397265575
+33
+2117.20548864256
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+2123.96192194778
+11
+104.493585205705
+21
+-811.482736403362
+31
+2122.25649750655
+12
+104.493582702852
+22
+-794.166559999998
+32
+2123.9619920213
+13
+104.493582702852
+23
+-794.166559999998
+33
+2123.9619920213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493585205705
+20
+-811.482736403362
+30
+2122.25649750655
+11
+180.675224578544
+21
+-794.16651328432
+31
+2123.96192194778
+12
+180.675224578544
+22
+-811.482680573908
+32
+2122.25642833066
+13
+180.675224578544
+23
+-811.482680573908
+33
+2122.25642833066
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-776.850345994732
+30
+2122.25642833066
+11
+104.493582702852
+21
+-794.166559999998
+31
+2123.9619920213
+12
+104.493580648814
+22
+-776.850383596634
+32
+2122.25649750655
+13
+104.493580648814
+23
+-776.850383596634
+33
+2122.25649750655
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493582702852
+20
+-794.166559999998
+30
+2123.9619920213
+11
+180.675224578544
+21
+-776.850345994732
+31
+2122.25642833066
+12
+180.675224578544
+22
+-794.16651328432
+32
+2123.96192194778
+13
+180.675224578544
+23
+-794.16651328432
+33
+2123.96192194778
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-760.199629303065
+30
+2117.20548864256
+11
+104.493580648814
+21
+-776.850383596634
+31
+2122.25649750655
+12
+104.493579122526
+22
+-760.199658141427
+32
+2117.20555516006
+13
+104.493579122526
+23
+-760.199658141427
+33
+2117.20555516006
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493580648814
+20
+-776.850383596634
+30
+2122.25649750655
+11
+180.675224578544
+21
+-760.199629303065
+31
+2117.20548864256
+12
+180.675224578544
+22
+-776.850345994732
+32
+2122.25642833066
+13
+180.675224578544
+23
+-776.850345994732
+33
+2122.25642833066
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-744.854240913949
+30
+2109.00320766309
+11
+104.493579122526
+21
+-760.199658141427
+31
+2117.20555516006
+12
+104.493578182644
+22
+-744.854261675788
+32
+2109.0032698636
+13
+104.493578182644
+23
+-744.854261675788
+33
+2109.0032698636
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493579122526
+20
+-760.199658141427
+30
+2117.20555516006
+11
+180.675224578544
+21
+-744.854240913949
+31
+2109.00320766309
+12
+180.675224578544
+22
+-760.199629303065
+32
+2117.20548864256
+13
+180.675224578544
+23
+-760.199629303065
+33
+2117.20548864256
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-731.403895497386
+30
+2097.9647944504
+11
+104.493578182644
+21
+-744.854261675788
+31
+2109.0032698636
+12
+104.493577865285
+22
+-731.403909180092
+32
+2097.96485084121
+13
+104.493577865285
+23
+-731.403909180092
+33
+2097.96485084121
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493578182644
+20
+-744.854261675788
+30
+2109.0032698636
+11
+180.675224578544
+21
+-731.403895497386
+31
+2097.9647944504
+12
+180.675224578544
+22
+-744.854240913949
+32
+2109.00320766309
+13
+180.675224578544
+23
+-744.854240913949
+33
+2109.00320766309
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-731.403895497386
+30
+2097.9647944504
+11
+104.493578182647
+21
+-720.365490157705
+31
+2084.51449834551
+12
+180.675224578544
+22
+-720.365482284693
+32
+2084.51444903383
+13
+180.675224578544
+23
+-720.365482284693
+33
+2084.51444903383
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493578182647
+20
+-720.365490157705
+30
+2084.51449834551
+11
+180.675224578544
+21
+-731.403895497386
+31
+2097.9647944504
+12
+104.493577865285
+22
+-731.403909180092
+32
+2097.96485084121
+13
+104.493577865285
+23
+-731.403909180092
+33
+2097.96485084121
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-720.365482284693
+30
+2084.51444903383
+11
+104.493579122533
+21
+-712.163204861241
+31
+2069.16910187987
+12
+180.675224578544
+22
+-712.163201305221
+32
+2069.16906064472
+13
+180.675224578544
+23
+-712.163201305221
+33
+2069.16906064472
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493579122533
+20
+-712.163204861241
+30
+2069.16910187987
+11
+180.675224578544
+21
+-720.365482284693
+31
+2084.51444903383
+12
+104.493578182647
+22
+-720.365490157705
+32
+2084.51449834551
+13
+104.493578182647
+23
+-720.365490157705
+33
+2084.51449834551
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-712.163201305221
+30
+2069.16906064472
+11
+104.493580648823
+21
+-707.112262514747
+31
+2052.51837642467
+12
+180.675224578544
+22
+-707.112261617118
+32
+2052.51834395305
+13
+180.675224578544
+23
+-707.112261617118
+33
+2052.51834395305
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493580648823
+20
+-707.112262514747
+30
+2052.51837642467
+11
+180.675224578544
+21
+-712.163201305221
+31
+2069.16906064472
+12
+104.493579122533
+22
+-712.163204861241
+32
+2069.16910187987
+13
+104.493579122533
+23
+-712.163204861241
+33
+2069.16910187987
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-707.112261617118
+30
+2052.51834395305
+11
+104.493582702864
+21
+-705.406767999999
+31
+2035.2022000213
+12
+180.675224578544
+22
+-705.406767999999
+32
+2035.20217666346
+13
+180.675224578544
+23
+-705.406767999999
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493582702864
+20
+-705.406767999999
+30
+2035.2022000213
+11
+180.675224578544
+21
+-707.112261617118
+31
+2052.51834395305
+12
+104.493580648823
+22
+-707.112262514747
+32
+2052.51837642467
+13
+104.493580648823
+23
+-707.112262514747
+33
+2052.51837642467
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+519.085398326623
+20
+-776.866198451135
+30
+2455.6433200213
+11
+381.734128610352
+21
+-921.587710511788
+31
+2361.46489814399
+12
+554.192057578438
+22
+-829.407026995336
+32
+2361.46489814399
+13
+554.192057578438
+23
+-829.407026995336
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+2361.46489814399
+11
+519.085398326623
+21
+-776.866198451135
+31
+2455.6433200213
+12
+357.552241131722
+22
+-863.2074697971
+32
+2455.6433200213
+13
+357.552241131722
+23
+-863.2074697971
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+357.552241131722
+20
+-863.2074697971
+30
+2455.6433200213
+11
+519.085398326623
+21
+-776.866198451135
+31
+2455.6433200213
+12
+492.936359391337
+22
+-790.843150956456
+32
+2455.6433200213
+13
+492.936359391337
+23
+-790.843150956456
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+357.552241131722
+20
+-863.2074697971
+30
+2455.6433200213
+11
+492.936359391337
+21
+-790.843150956456
+31
+2455.6433200213
+12
+409.740310523406
+22
+-835.312365543472
+32
+2455.6433200213
+13
+409.740310523406
+23
+-835.312365543472
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-835.797377356766
+20
+1.80477854883065e-13
+30
+738.078199114136
+11
+-798.780782641381
+21
+-158.887376492573
+31
+682.822310520627
+12
+-819.73776511114
+22
+-163.055979488767
+32
+738.078199114136
+13
+-819.73776511114
+23
+-163.055979488767
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-798.780782641381
+20
+-158.887376492573
+30
+682.822310520627
+11
+-835.797377356766
+21
+1.80477854883065e-13
+31
+738.078199114136
+12
+-814.429823327873
+22
+1.80477854883065e-13
+32
+682.822310520627
+13
+-814.429823327873
+23
+1.80477854883065e-13
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-580.006735667279
+20
+-868.041422984449
+30
+2258.00680432354
+11
+-700.811796716974
+21
+-805.485642916867
+31
+2148.21162800104
+12
+-595.795202951324
+22
+-891.670534105406
+32
+2148.21162800104
+13
+-595.795202951324
+23
+-891.670534105406
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-700.811796716974
+20
+-805.485642916867
+30
+2148.21162800104
+11
+-580.006735667279
+21
+-868.041422984449
+31
+2258.00680432354
+12
+-713.051374182295
+22
+-793.031288591004
+32
+2155.44278114838
+13
+-713.051374182295
+23
+-793.031288591004
+33
+2155.44278114838
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-750.226480623555
+20
+-763.163737563064
+30
+2153.51833793914
+11
+-738.208549610569
+21
+-738.20854961057
+31
+2258.00680432354
+12
+-758.175252738136
+22
+-758.175252738136
+32
+2148.91211343617
+13
+-758.175252738136
+23
+-758.175252738136
+33
+2148.91211343617
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.208549610569
+20
+-738.20854961057
+30
+2258.00680432354
+11
+-750.226480623555
+21
+-763.163737563064
+31
+2153.51833793914
+12
+-713.051374182295
+22
+-793.031288591004
+32
+2155.44278114838
+13
+-713.051374182295
+23
+-793.031288591004
+33
+2155.44278114838
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.208549610569
+20
+-738.20854961057
+30
+2258.00680432354
+11
+-713.051374182295
+21
+-793.031288591004
+31
+2155.44278114838
+12
+-580.006735667279
+22
+-868.041422984449
+32
+2258.00680432354
+13
+-580.006735667279
+23
+-868.041422984449
+33
+2258.00680432354
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-654.791104458432
+20
+-848.015122202593
+30
+1965.89490198638
+11
+-758.928832717995
+21
+-874.671572316599
+31
+1963.87063213502
+12
+-679.407718084958
+22
+-824.046894149155
+32
+1931.32901160226
+13
+-679.407718084958
+23
+-824.046894149155
+33
+1931.32901160226
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.928832717995
+20
+-874.671572316599
+30
+1963.87063213502
+11
+-654.791104458432
+21
+-848.015122202593
+31
+1965.89490198638
+12
+-741.432257601186
+22
+-891.447302299009
+32
+1988.14599297097
+13
+-741.432257601186
+23
+-891.447302299009
+33
+1988.14599297097
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1.4681606386561
+20
+-1077.9663986116
+30
+1989.64235577041
+11
+-10.2481189704998
+21
+-977.344465549986
+31
+1990.50710618793
+12
+-10.2481189704998
+22
+-1077.17482828484
+32
+1990.50710618793
+13
+-10.2481189704998
+23
+-1077.17482828484
+33
+1990.50710618793
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-10.2481189704998
+20
+-977.344465549986
+30
+1990.50710618793
+11
+-1.4681606386561
+21
+-1077.9663986116
+31
+1989.64235577041
+12
+-1.4681606386561
+22
+-978.157451656943
+32
+1989.64235577041
+13
+-1.4681606386561
+23
+-978.157451656943
+33
+1989.64235577041
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+471.799768952456
+20
+-706.098253038493
+30
+855.37186879426
+11
+324.326404167689
+21
+-782.993203577332
+31
+796.153149972084
+12
+470.84895947612
+22
+-704.67526609701
+32
+796.153149972084
+13
+470.84895947612
+23
+-704.67526609701
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+324.326404167689
+20
+-782.993203577332
+30
+796.153149972084
+11
+471.799768952456
+21
+-706.098253038493
+31
+855.37186879426
+12
+324.981333125909
+22
+-784.574341950659
+32
+855.37186879426
+13
+324.981333125909
+23
+-784.574341950659
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+441.215302798659
+20
+-660.325364744672
+30
+1614.7610800213
+11
+468.281762027731
+21
+-751.288611861147
+31
+1427.8983600213
+12
+493.122985245198
+22
+-738.010701420772
+32
+1427.8983600213
+13
+493.122985245198
+23
+-738.010701420772
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+468.281762027731
+20
+-751.288611861147
+30
+1427.8983600213
+11
+441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+389.246864354028
+22
+-793.533644796473
+32
+1427.8983600213
+13
+389.246864354028
+23
+-793.533644796473
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+389.246864354028
+20
+-793.533644796473
+30
+1427.8983600213
+11
+303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+339.669019965462
+22
+-820.033554718597
+32
+1427.8983600213
+13
+339.669019965462
+23
+-820.033554718597
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+303.914386430124
+20
+-733.714233519903
+30
+1614.7610800213
+11
+389.246864354028
+21
+-793.533644796473
+31
+1427.8983600213
+12
+441.215302798659
+22
+-660.325364744672
+32
+1614.7610800213
+13
+441.215302798659
+23
+-660.325364744672
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+897.900697882446
+20
+-589.158254916404
+30
+2120.11937767794
+11
+891.670534105407
+21
+-595.795202951324
+31
+2148.21162800104
+12
+892.684338449561
+22
+-596.472605357118
+32
+2133.80356487023
+13
+892.684338449561
+23
+-596.472605357118
+33
+2133.80356487023
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+891.670534105407
+20
+-595.795202951324
+30
+2148.21162800104
+11
+897.900697882446
+21
+-589.158254916404
+31
+2120.11937767794
+12
+990.771212819308
+22
+-410.390873558597
+32
+2148.21162800104
+13
+990.771212819308
+23
+-410.390873558597
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+990.771212819308
+20
+-410.390873558597
+30
+2148.21162800104
+11
+897.900697882446
+21
+-589.158254916404
+31
+2120.11937767794
+12
+908.625264240696
+22
+-576.530906699202
+32
+2078.49259036266
+13
+908.625264240696
+23
+-576.530906699202
+33
+2078.49259036266
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+990.771212819308
+20
+-410.390873558597
+30
+2148.21162800104
+11
+908.625264240696
+21
+-576.530906699202
+31
+2078.49259036266
+12
+911.54074094115
+22
+-574.592524622259
+32
+2058.8118770109
+13
+911.54074094115
+23
+-574.592524622259
+33
+2058.8118770109
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+990.771212819308
+20
+-410.390873558597
+30
+2148.21162800104
+11
+911.54074094115
+21
+-574.592524622259
+31
+2058.8118770109
+12
+997.760836892423
+22
+-413.286070645571
+32
+2058.8118770109
+13
+997.760836892423
+23
+-413.286070645571
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493609641054
+20
+-828.133461858565
+30
+1953.19884488255
+11
+180.675224578544
+21
+-811.482680573908
+31
+1948.14792499626
+12
+104.493608114766
+22
+-811.482736403359
+32
+1948.14790253605
+13
+104.493608114766
+23
+-811.482736403359
+33
+1948.14790253605
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-811.482680573908
+30
+1948.14792499626
+11
+104.493609641054
+21
+-828.133461858565
+31
+1953.19884488255
+12
+180.675224578544
+22
+-828.133397265575
+32
+1953.19886468436
+13
+180.675224578544
+23
+-828.133397265575
+33
+1953.19886468436
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.192057578438
+20
+-829.407026995336
+30
+1708.93950189862
+11
+492.936358899678
+21
+-790.843151219254
+31
+1614.7610800213
+12
+519.085398326623
+22
+-776.866198451135
+32
+1614.7610800213
+13
+519.085398326623
+23
+-776.866198451135
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+492.936358899678
+20
+-790.843151219254
+30
+1614.7610800213
+11
+554.192057578438
+21
+-829.407026995336
+31
+1708.93950189862
+12
+409.740310523407
+22
+-835.312365543471
+32
+1614.7610800213
+13
+409.740310523407
+23
+-835.312365543471
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+409.740310523407
+20
+-835.312365543471
+30
+1614.7610800213
+11
+381.734128610352
+21
+-921.587710511788
+31
+1708.93950189862
+12
+357.552241131722
+22
+-863.2074697971
+32
+1614.7610800213
+13
+357.552241131722
+23
+-863.2074697971
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+1708.93950189862
+11
+409.740310523407
+21
+-835.312365543471
+31
+1614.7610800213
+12
+554.192057578438
+22
+-829.407026995336
+32
+1708.93950189862
+13
+554.192057578438
+23
+-829.407026995336
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493597604008
+20
+-744.854261675785
+30
+1961.40113017901
+11
+180.675224578544
+21
+-731.403895497386
+31
+1972.43955887653
+12
+104.493594381798
+22
+-731.40390918009
+32
+1972.4395492014
+13
+104.493594381798
+23
+-731.40390918009
+33
+1972.4395492014
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-731.403895497386
+30
+1972.43955887653
+11
+104.493597604008
+21
+-744.854261675785
+31
+1961.40113017901
+12
+180.675224578544
+22
+-744.854240913949
+32
+1961.40114566384
+13
+180.675224578544
+23
+-744.854240913949
+33
+1961.40114566384
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493603557861
+20
+-881.220857485246
+30
+2052.51837642467
+11
+180.675224578544
+21
+-876.169825263419
+31
+2069.16906064472
+12
+180.675224578544
+22
+-881.220764951522
+32
+2052.51834395305
+13
+180.675224578544
+23
+-881.220764951522
+33
+2052.51834395305
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-876.169825263419
+30
+2069.16906064472
+11
+104.493603557861
+21
+-881.220857485246
+31
+2052.51837642467
+12
+104.493600702375
+22
+-876.169915138753
+32
+2069.16910187987
+13
+104.493600702375
+23
+-876.169915138753
+33
+2069.16910187987
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493600702375
+20
+-876.169915138753
+30
+2069.16910187987
+11
+180.675224578544
+21
+-867.967544283947
+31
+2084.51444903383
+12
+180.675224578544
+22
+-876.169825263419
+32
+2069.16906064472
+13
+180.675224578544
+23
+-876.169825263419
+33
+2069.16906064472
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-867.967544283947
+30
+2084.51444903383
+11
+104.493600702375
+21
+-876.169915138753
+31
+2069.16910187987
+12
+104.493597603992
+22
+-867.967629842289
+32
+2084.51449834551
+13
+104.493597603992
+23
+-867.967629842289
+33
+2084.51449834551
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493606060716
+20
+-882.926351999993
+30
+2035.2022000213
+11
+180.675224578544
+21
+-881.220764951522
+31
+2052.51834395305
+12
+180.675224578544
+22
+-882.926258568641
+32
+2035.20217666346
+13
+180.675224578544
+23
+-882.926258568641
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-881.220764951522
+30
+2052.51834395305
+11
+104.493606060716
+21
+-882.926351999993
+31
+2035.2022000213
+12
+104.493603557861
+22
+-881.220857485246
+32
+2052.51837642467
+13
+104.493603557861
+23
+-881.220857485246
+33
+2052.51837642467
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493603557875
+20
+-776.850383596631
+30
+1948.14790253605
+11
+180.675224578544
+21
+-760.199629303065
+31
+1953.19886468436
+12
+104.49360070239
+22
+-760.199658141424
+32
+1953.19884488255
+13
+104.49360070239
+23
+-760.199658141424
+33
+1953.19884488255
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-760.199629303065
+30
+1953.19886468436
+11
+104.493603557875
+21
+-776.850383596631
+31
+1948.14790253605
+12
+180.675224578544
+22
+-776.850345994732
+32
+1948.14792499626
+13
+180.675224578544
+23
+-776.850345994732
+33
+1948.14792499626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-887.575434400246
+30
+2260.71126086817
+11
+577.578293884962
+21
+-864.407003018736
+31
+2267.73932769213
+12
+540.896920479706
+22
+-887.575434400246
+32
+2260.71126086817
+13
+540.896920479706
+23
+-887.575434400246
+33
+2260.71126086817
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+577.578293884962
+20
+-864.407003018736
+30
+2267.73932769213
+11
+653.750224578544
+21
+-887.575434400246
+31
+2260.71126086817
+12
+600.307509232711
+22
+-841.785968318108
+32
+2274.60134354834
+13
+600.307509232711
+23
+-841.785968318108
+33
+2274.60134354834
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+600.307509232711
+20
+-841.785968318108
+30
+2274.60134354834
+11
+653.750224578544
+21
+-887.575434400246
+31
+2260.71126086817
+12
+653.750224578544
+22
+-841.785968318108
+32
+2274.60134354834
+13
+653.750224578544
+23
+-841.785968318108
+33
+2274.60134354834
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-381.734128610353
+20
+-921.587710511788
+30
+1708.93950189862
+11
+-409.740279224824
+21
+-835.312382272912
+31
+1614.7610800213
+12
+-357.552241131723
+22
+-863.207469797099
+32
+1614.7610800213
+13
+-357.552241131723
+23
+-863.207469797099
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-409.740279224824
+20
+-835.312382272912
+30
+1614.7610800213
+11
+-381.734128610353
+21
+-921.587710511788
+31
+1708.93950189862
+12
+-492.936329267328
+22
+-790.843167058075
+32
+1614.7610800213
+13
+-492.936329267328
+23
+-790.843167058075
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-492.936329267328
+20
+-790.843167058075
+30
+1614.7610800213
+11
+-554.192057578438
+21
+-829.407026995335
+31
+1708.93950189862
+12
+-519.085398326623
+22
+-776.866198451135
+32
+1614.7610800213
+13
+-519.085398326623
+23
+-776.866198451135
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.192057578438
+20
+-829.407026995335
+30
+1708.93950189862
+11
+-492.936329267328
+21
+-790.843167058075
+31
+1614.7610800213
+12
+-381.734128610353
+22
+-921.587710511788
+32
+1708.93950189862
+13
+-381.734128610353
+23
+-921.587710511788
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+782.993203577332
+20
+-324.326404167689
+30
+796.153149972084
+11
+832.899678896021
+21
+-165.674046918965
+31
+855.37186879426
+12
+784.574341950659
+22
+-324.981333125909
+32
+855.37186879426
+13
+784.574341950659
+23
+-324.981333125909
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+832.899678896021
+20
+-165.674046918965
+30
+855.37186879426
+11
+782.993203577332
+21
+-324.326404167689
+31
+796.153149972084
+12
+831.221151351825
+22
+-165.340167031437
+32
+796.153149972084
+13
+831.221151351825
+23
+-165.340167031437
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-789.394716623343
+20
+-732.286733093936
+30
+2020.79944934296
+11
+-833.682296381699
+21
+-797.91475852831
+31
+2048.43845388979
+12
+-833.979694213849
+22
+-798.243508123
+32
+2025.28667143296
+13
+-833.979694213849
+23
+-798.243508123
+33
+2025.28667143296
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-833.682296381699
+20
+-797.91475852831
+30
+2048.43845388979
+11
+-789.394716623343
+21
+-732.286733093936
+31
+2020.79944934296
+12
+-789.34285913936
+22
+-732.349614898499
+32
+2049.89434090933
+13
+-789.34285913936
+23
+-732.349614898499
+33
+2049.89434090933
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-849.217148276931
+30
+855.37186879426
+11
+-165.340167031437
+21
+-831.221151351825
+31
+796.153149972084
+12
+1.80477854883065e-13
+22
+-847.505736434059
+32
+796.153149972084
+13
+1.80477854883065e-13
+23
+-847.505736434059
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-165.340167031437
+20
+-831.221151351825
+30
+796.153149972084
+11
+1.80477854883065e-13
+21
+-849.217148276931
+31
+855.37186879426
+12
+-165.674046918965
+22
+-832.899678896021
+32
+855.37186879426
+13
+-165.674046918965
+23
+-832.899678896021
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.33953815002
+20
+-300.031260464802
+30
+631.979456702016
+11
+798.780782641381
+21
+-158.887376492573
+31
+682.822310520627
+12
+752.435044439405
+22
+-311.668800211604
+32
+682.822310520627
+13
+752.435044439405
+23
+-311.668800211604
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+798.780782641381
+20
+-158.887376492573
+30
+682.822310520627
+11
+724.33953815002
+21
+-300.031260464802
+31
+631.979456702016
+12
+768.954752250597
+22
+-152.954610178005
+32
+631.979456702016
+13
+768.954752250597
+23
+-152.954610178005
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+452.472966724379
+20
+-677.173649450057
+30
+682.822310520627
+11
+300.031260464802
+21
+-724.33953815002
+31
+631.979456702016
+12
+435.577877671407
+22
+-651.888361812631
+32
+631.979456702016
+13
+435.577877671407
+23
+-651.888361812631
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+300.031260464802
+20
+-724.33953815002
+30
+631.979456702016
+11
+452.472966724379
+21
+-677.173649450057
+31
+682.822310520627
+12
+311.668800211604
+22
+-752.435044439405
+32
+682.822310520627
+13
+311.668800211604
+23
+-752.435044439405
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-724.33953815002
+20
+-300.031260464802
+30
+631.979456702016
+11
+-619.813665790805
+21
+-414.146250971868
+31
+587.016306884026
+12
+-651.888361812631
+22
+-435.577877671407
+32
+631.979456702016
+13
+-651.888361812631
+23
+-435.577877671407
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-619.813665790805
+20
+-414.146250971868
+30
+587.016306884026
+11
+-724.33953815002
+21
+-300.031260464802
+31
+631.979456702016
+12
+-688.700045464263
+22
+-285.268899238265
+32
+587.016306884026
+13
+-688.700045464263
+23
+-285.268899238265
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-10.2481189704998
+20
+-1077.17482828484
+30
+1990.50710618793
+11
+-18.6906684275082
+21
+-976.666250664317
+31
+1993.0681255669
+12
+-18.6906684275082
+22
+-1076.56003774335
+32
+1993.0681255669
+13
+-18.6906684275082
+23
+-1076.56003774335
+33
+1993.0681255669
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-18.6906684275082
+20
+-976.666250664317
+30
+1993.0681255669
+11
+-10.2481189704998
+21
+-1077.17482828484
+31
+1990.50710618793
+12
+-10.2481189704998
+22
+-977.344465549986
+32
+1990.50710618793
+13
+-10.2481189704998
+23
+-977.344465549986
+33
+1990.50710618793
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+300.031260464802
+20
+-724.33953815002
+30
+631.979456702016
+11
+145.428823687577
+21
+-731.120068617964
+31
+587.016306884026
+12
+285.268899238265
+22
+-688.700045464263
+32
+587.016306884026
+13
+285.268899238265
+23
+-688.700045464263
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+145.428823687577
+20
+-731.120068617964
+30
+587.016306884026
+11
+300.031260464802
+21
+-724.33953815002
+31
+631.979456702016
+12
+152.954610178005
+22
+-768.954752250597
+32
+631.979456702016
+13
+152.954610178005
+23
+-768.954752250597
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-495.494614285553
+20
+-495.494614285553
+30
+1241.03564002131
+11
+-660.325364744672
+21
+-441.215302798659
+31
+1054.1729200213
+12
+-561.560562517035
+22
+-561.560562517035
+32
+1054.1729200213
+13
+-561.560562517035
+23
+-561.560562517035
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.325364744672
+20
+-441.215302798659
+30
+1054.1729200213
+11
+-495.494614285553
+21
+-495.494614285553
+31
+1241.03564002131
+12
+-582.640028068573
+22
+-389.307620352121
+32
+1241.03564002131
+13
+-582.640028068573
+23
+-389.307620352121
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+1427.8983600213
+11
+-699.168033082722
+21
+-467.169144021928
+31
+1241.03564002131
+12
+-594.593536632775
+22
+-594.593536632776
+32
+1241.03564002131
+13
+-594.593536632775
+23
+-594.593536632776
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+1241.03564002131
+11
+-528.527588401294
+21
+-528.527588401294
+31
+1427.8983600213
+12
+-621.482696406623
+22
+-415.26146157539
+32
+1427.8983600213
+13
+-621.482696406623
+23
+-415.26146157539
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-863.207469797099
+20
+-357.552241131722
+30
+2455.6433200213
+11
+-978.352295145615
+21
+-194.606371158736
+31
+2361.46489814399
+12
+-921.587710511788
+22
+-381.734128610352
+32
+2361.46489814399
+13
+-921.587710511788
+23
+-381.734128610352
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-978.352295145615
+20
+-194.606371158736
+30
+2361.46489814399
+11
+-863.207469797099
+21
+-357.552241131722
+31
+2455.6433200213
+12
+-887.22732313789
+22
+-278.369396423646
+32
+2455.6433200213
+13
+-887.22732313789
+23
+-278.369396423646
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-978.352295145615
+20
+-194.606371158736
+30
+2361.46489814399
+11
+-887.22732313789
+21
+-278.369396423646
+31
+2455.6433200213
+12
+-914.651018565421
+22
+-187.965588142593
+32
+2455.6433200213
+13
+-914.651018565421
+23
+-187.965588142593
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-978.352295145615
+20
+-194.606371158736
+30
+2361.46489814399
+11
+-914.651018565421
+21
+-187.965588142593
+31
+2455.6433200213
+12
+-916.376162171087
+22
+-182.278551827736
+32
+2455.6433200213
+13
+-916.376162171087
+23
+-182.278551827736
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-650.663001997456
+20
+1.80477854883065e-13
+30
+587.016306884026
+11
+-731.120068617964
+21
+-145.428823687577
+31
+587.016306884026
+12
+-745.443557551536
+22
+1.80477854883065e-13
+32
+587.016306884026
+13
+-745.443557551536
+23
+1.80477854883065e-13
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-731.120068617964
+20
+-145.428823687577
+30
+587.016306884026
+11
+-650.663001997456
+21
+1.80477854883065e-13
+31
+587.016306884026
+12
+-688.700045464263
+22
+-285.268899238265
+32
+587.016306884026
+13
+-688.700045464263
+23
+-285.268899238265
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-688.700045464263
+20
+-285.268899238265
+30
+587.016306884026
+11
+-650.663001997456
+21
+1.80477854883065e-13
+31
+587.016306884026
+12
+-619.813665790805
+22
+-414.146250971868
+32
+587.016306884026
+13
+-619.813665790805
+23
+-414.146250971868
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-619.813665790805
+20
+-414.146250971868
+30
+587.016306884026
+11
+-650.663001997456
+21
+1.80477854883065e-13
+31
+587.016306884026
+12
+-638.160694862082
+22
+-126.938054583664
+32
+587.016306884026
+13
+-638.160694862082
+23
+-126.938054583664
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-619.813665790805
+20
+-414.146250971868
+30
+587.016306884026
+11
+-638.160694862082
+21
+-126.938054583664
+31
+587.016306884026
+12
+-601.1342301078
+22
+-248.997950917359
+32
+587.016306884026
+13
+-601.1342301078
+23
+-248.997950917359
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-619.813665790805
+20
+-414.146250971868
+30
+587.016306884026
+11
+-601.1342301078
+21
+-248.997950917359
+31
+587.016306884026
+12
+-527.108194536515
+22
+-527.108194536515
+32
+587.016306884026
+13
+-527.108194536515
+23
+-527.108194536515
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-527.108194536515
+20
+-527.108194536515
+30
+587.016306884026
+11
+-601.1342301078
+21
+-248.997950917359
+31
+587.016306884026
+12
+-541.006514010435
+22
+-361.48899563696
+32
+587.016306884026
+13
+-541.006514010435
+23
+-361.48899563696
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-527.108194536515
+20
+-527.108194536515
+30
+587.016306884026
+11
+-541.006514010435
+21
+-361.48899563696
+31
+587.016306884026
+12
+-460.088220979597
+22
+-460.088220979597
+32
+587.016306884026
+13
+-460.088220979597
+23
+-460.088220979597
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-527.108194536515
+20
+-527.108194536515
+30
+587.016306884026
+11
+-460.088220979597
+21
+-460.088220979597
+31
+587.016306884026
+12
+-414.146250971868
+22
+-619.813665790805
+32
+587.016306884026
+13
+-414.146250971868
+23
+-619.813665790805
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-414.146250971868
+20
+-619.813665790805
+30
+587.016306884026
+11
+-460.088220979597
+21
+-460.088220979597
+31
+587.016306884026
+12
+-361.48899563696
+22
+-541.006514010435
+32
+587.016306884026
+13
+-361.48899563696
+23
+-541.006514010435
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-414.146250971868
+20
+-619.813665790805
+30
+587.016306884026
+11
+-361.48899563696
+21
+-541.006514010435
+31
+587.016306884026
+12
+-285.268899238265
+22
+-688.700045464263
+32
+587.016306884026
+13
+-285.268899238265
+23
+-688.700045464263
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-285.268899238265
+20
+-688.700045464263
+30
+587.016306884026
+11
+-361.48899563696
+21
+-541.006514010435
+31
+587.016306884026
+12
+-248.99795091736
+22
+-601.1342301078
+32
+587.016306884026
+13
+-248.99795091736
+23
+-601.1342301078
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-285.268899238265
+20
+-688.700045464263
+30
+587.016306884026
+11
+-248.99795091736
+21
+-601.1342301078
+31
+587.016306884026
+12
+-145.428823687577
+22
+-731.120068617964
+32
+587.016306884026
+13
+-145.428823687577
+23
+-731.120068617964
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-145.428823687577
+20
+-731.120068617964
+30
+587.016306884026
+11
+-248.99795091736
+21
+-601.1342301078
+31
+587.016306884026
+12
+-126.938054583664
+22
+-638.160694862082
+32
+587.016306884026
+13
+-126.938054583664
+23
+-638.160694862082
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-145.428823687577
+20
+-731.120068617964
+30
+587.016306884026
+11
+-126.938054583664
+21
+-638.160694862082
+31
+587.016306884026
+12
+0.0
+22
+-745.443557551535
+32
+587.016306884026
+13
+0.0
+23
+-745.443557551535
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-745.443557551535
+30
+587.016306884026
+11
+-126.938054583664
+21
+-638.160694862082
+31
+587.016306884026
+12
+0.0
+22
+-650.663001997455
+32
+587.016306884026
+13
+0.0
+23
+-650.663001997455
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-745.443557551535
+30
+587.016306884026
+11
+0.0
+21
+-650.663001997455
+31
+587.016306884026
+12
+126.938054583664
+22
+-638.160694862082
+32
+587.016306884026
+13
+126.938054583664
+23
+-638.160694862082
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-745.443557551535
+30
+587.016306884026
+11
+126.938054583664
+21
+-638.160694862082
+31
+587.016306884026
+12
+145.428823687577
+22
+-731.120068617964
+32
+587.016306884026
+13
+145.428823687577
+23
+-731.120068617964
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+145.428823687577
+20
+-731.120068617964
+30
+587.016306884026
+11
+126.938054583664
+21
+-638.160694862082
+31
+587.016306884026
+12
+248.997950917359
+22
+-601.1342301078
+32
+587.016306884026
+13
+248.997950917359
+23
+-601.1342301078
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+145.428823687577
+20
+-731.120068617964
+30
+587.016306884026
+11
+248.997950917359
+21
+-601.1342301078
+31
+587.016306884026
+12
+285.268899238265
+22
+-688.700045464263
+32
+587.016306884026
+13
+285.268899238265
+23
+-688.700045464263
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+285.268899238265
+20
+-688.700045464263
+30
+587.016306884026
+11
+248.997950917359
+21
+-601.1342301078
+31
+587.016306884026
+12
+361.48899563696
+22
+-541.006514010435
+32
+587.016306884026
+13
+361.48899563696
+23
+-541.006514010435
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+285.268899238265
+20
+-688.700045464263
+30
+587.016306884026
+11
+361.48899563696
+21
+-541.006514010435
+31
+587.016306884026
+12
+414.146250971868
+22
+-619.813665790805
+32
+587.016306884026
+13
+414.146250971868
+23
+-619.813665790805
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+414.146250971868
+20
+-619.813665790805
+30
+587.016306884026
+11
+361.48899563696
+21
+-541.006514010435
+31
+587.016306884026
+12
+460.088220979597
+22
+-460.088220979597
+32
+587.016306884026
+13
+460.088220979597
+23
+-460.088220979597
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+414.146250971868
+20
+-619.813665790805
+30
+587.016306884026
+11
+460.088220979597
+21
+-460.088220979597
+31
+587.016306884026
+12
+527.108194536515
+22
+-527.108194536515
+32
+587.016306884026
+13
+527.108194536515
+23
+-527.108194536515
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+527.108194536515
+20
+-527.108194536515
+30
+587.016306884026
+11
+460.088220979597
+21
+-460.088220979597
+31
+587.016306884026
+12
+541.006514010435
+22
+-361.48899563696
+32
+587.016306884026
+13
+541.006514010435
+23
+-361.48899563696
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+527.108194536515
+20
+-527.108194536515
+30
+587.016306884026
+11
+541.006514010435
+21
+-361.48899563696
+31
+587.016306884026
+12
+610.800045742856
+22
+-425.129378778605
+32
+587.016306884026
+13
+610.800045742856
+23
+-425.129378778605
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+610.800045742856
+20
+-425.129378778605
+30
+587.016306884026
+11
+541.006514010435
+21
+-361.48899563696
+31
+587.016306884026
+12
+601.1342301078
+22
+-248.997950917359
+32
+587.016306884026
+13
+601.1342301078
+23
+-248.997950917359
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+610.800045742856
+20
+-425.129378778605
+30
+587.016306884026
+11
+601.1342301078
+21
+-248.997950917359
+31
+587.016306884026
+12
+638.160694862082
+22
+-126.938054583664
+32
+587.016306884026
+13
+638.160694862082
+23
+-126.938054583664
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+610.800045742856
+20
+-425.129378778605
+30
+587.016306884026
+11
+638.160694862082
+21
+-126.938054583664
+31
+587.016306884026
+12
+619.813665790805
+22
+-414.146250971868
+32
+587.016306884026
+13
+619.813665790805
+23
+-414.146250971868
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+619.813665790805
+20
+-414.146250971868
+30
+587.016306884026
+11
+638.160694862082
+21
+-126.938054583664
+31
+587.016306884026
+12
+648.718890655847
+22
+-360.068378836192
+32
+587.016306884026
+13
+648.718890655847
+23
+-360.068378836192
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+648.718890655847
+20
+-360.068378836192
+30
+587.016306884026
+11
+638.160694862082
+21
+-126.938054583664
+31
+587.016306884026
+12
+650.663001997456
+22
+0.0
+32
+587.016306884026
+13
+650.663001997456
+23
+0.0
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+648.718890655847
+20
+-360.068378836192
+30
+587.016306884026
+11
+650.663001997456
+21
+0.0
+31
+587.016306884026
+12
+684.232404647772
+22
+-293.627267317059
+32
+587.016306884026
+13
+684.232404647772
+23
+-293.627267317059
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+684.232404647772
+20
+-293.627267317059
+30
+587.016306884026
+11
+650.663001997456
+21
+0.0
+31
+587.016306884026
+12
+745.443557551535
+22
+1.80477854883065e-13
+32
+587.016306884026
+13
+745.443557551535
+23
+1.80477854883065e-13
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+684.232404647772
+20
+-293.627267317059
+30
+587.016306884026
+11
+745.443557551535
+21
+1.80477854883065e-13
+31
+587.016306884026
+12
+688.700045464263
+22
+-285.268899238265
+32
+587.016306884026
+13
+688.700045464263
+23
+-285.268899238265
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+688.700045464263
+20
+-285.268899238265
+30
+587.016306884026
+11
+745.443557551535
+21
+1.80477854883065e-13
+31
+587.016306884026
+12
+707.864018296911
+22
+-222.093747280928
+32
+587.016306884026
+13
+707.864018296911
+23
+-222.093747280928
+33
+587.016306884026
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+707.864018296911
+20
+-222.093747280928
+30
+587.016306884026
+11
+745.443557551535
+21
+1.80477854883065e-13
+31
+587.016306884026
+12
+731.120068617964
+22
+-145.428823687577
+32
+587.016306884026
+13
+731.120068617964
+23
+-145.428823687577
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-782.993203577332
+20
+-324.326404167689
+30
+796.153149972084
+11
+-694.940121314314
+21
+-464.344143695271
+31
+738.078199114136
+12
+-704.67526609701
+22
+-470.84895947612
+32
+796.153149972084
+13
+-704.67526609701
+23
+-470.84895947612
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-694.940121314314
+20
+-464.344143695271
+30
+738.078199114136
+11
+-782.993203577332
+21
+-324.326404167689
+31
+796.153149972084
+12
+-772.176090266528
+22
+-319.845809128627
+32
+738.078199114136
+13
+-772.176090266528
+23
+-319.845809128627
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1051.79710945546
+20
+-209.215453044867
+30
+1922.19277204157
+11
+1079.96854760957
+21
+1.80477854883065e-13
+31
+2011.5925230317
+12
+1059.21725479392
+22
+-210.691411720441
+32
+2011.5925230317
+13
+1059.21725479392
+23
+-210.691411720441
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1079.96854760957
+20
+1.80477854883065e-13
+30
+2011.5925230317
+11
+1051.79710945546
+21
+-209.215453044867
+31
+1922.19277204157
+12
+1072.40303302985
+22
+1.80477854883065e-13
+32
+1922.19277204157
+13
+1072.40303302985
+23
+1.80477854883065e-13
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1078.12323678805
+30
+1989.78695697206
+11
+-209.215453044867
+21
+-1051.79710945546
+31
+1922.19277204157
+12
+1.80477854883065e-13
+22
+-1072.40303302985
+32
+1922.19277204157
+13
+1.80477854883065e-13
+23
+-1072.40303302985
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+1922.19277204157
+11
+1.80477854883065e-13
+21
+-1078.12323678805
+31
+1989.78695697206
+12
+-1.4681606386561
+22
+-1077.9663986116
+32
+1989.64235577041
+13
+-1.4681606386561
+23
+-1077.9663986116
+33
+1989.64235577041
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+1922.19277204157
+11
+-10.2481189704998
+21
+-1077.17482828484
+31
+1990.50710618793
+12
+-210.691411720441
+22
+-1059.21725479392
+32
+2011.5925230317
+13
+-210.691411720441
+23
+-1059.21725479392
+33
+2011.5925230317
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-10.2481189704998
+20
+-1077.17482828484
+30
+1990.50710618793
+11
+-209.215453044867
+21
+-1051.79710945546
+31
+1922.19277204157
+12
+-1.4681606386561
+22
+-1077.9663986116
+32
+1989.64235577041
+13
+-1.4681606386561
+23
+-1077.9663986116
+33
+1989.64235577041
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+-10.2481189704998
+21
+-1077.17482828484
+31
+1990.50710618793
+12
+-18.6906684275082
+22
+-1076.56003774335
+32
+1993.0681255669
+13
+-18.6906684275082
+23
+-1076.56003774335
+33
+1993.0681255669
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+-18.6906684275082
+21
+-1076.56003774335
+31
+1993.0681255669
+12
+-26.4713665686843
+22
+-1076.14565304285
+32
+1997.22699536883
+13
+-26.4713665686843
+23
+-1076.14565304285
+33
+1997.22699536883
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+-26.4713665686843
+21
+-1076.14565304285
+31
+1997.22699536883
+12
+-33.2912055279292
+22
+-1075.947598755
+32
+2002.82389255955
+13
+-33.2912055279292
+23
+-1075.947598755
+33
+2002.82389255955
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+-33.2912055279292
+21
+-1075.947598755
+31
+2002.82389255955
+12
+-38.8881027186482
+22
+-1075.973485995
+32
+2009.6437315188
+13
+-38.8881027186482
+23
+-1075.973485995
+33
+2009.6437315188
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+-38.8881027186482
+21
+-1075.973485995
+31
+2009.6437315188
+12
+-39.9297534839436
+22
+-1076.03581015323
+32
+2011.5925230317
+13
+-39.9297534839436
+23
+-1076.03581015323
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+42.6716706222413
+20
+-1075.76575488639
+30
+2025.86697911698
+11
+40.110651243267
+21
+-976.014544733984
+31
+2017.42442965997
+12
+40.1106512432667
+22
+-1076.01799327905
+32
+2017.42442965997
+13
+40.1106512432667
+23
+-1076.01799327905
+33
+2017.42442965997
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.110651243267
+20
+-976.014544733984
+30
+2017.42442965997
+11
+42.6716706222413
+21
+-1075.76575488639
+31
+2025.86697911698
+12
+42.6716706222411
+22
+-976.267680774437
+32
+2025.86697911698
+13
+42.6716706222411
+23
+-976.267680774437
+33
+2025.86697911698
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+784.574341950659
+20
+-324.981333125909
+30
+855.37186879426
+11
+699.168033082722
+21
+-467.169144021929
+31
+914.026066884025
+12
+706.098253038493
+22
+-471.799768952456
+32
+855.37186879426
+13
+706.098253038493
+23
+-471.799768952456
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021929
+30
+914.026066884025
+11
+784.574341950659
+21
+-324.981333125909
+31
+855.37186879426
+12
+776.87389411925
+22
+-321.791703197793
+32
+914.026066884025
+13
+776.87389411925
+23
+-321.791703197793
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-794.166563605455
+20
+1.80477854883065e-13
+30
+1614.7610800213
+11
+-925.063957882084
+21
+-94.0698816812515
+31
+1614.7610800213
+12
+-934.329032542513
+22
+3.60955709766131e-13
+32
+1614.7610800213
+13
+-934.329032542513
+23
+3.60955709766131e-13
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-925.063957882084
+20
+-94.0698816812515
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-916.376162171087
+22
+-182.278551827736
+32
+1614.7610800213
+13
+-916.376162171087
+23
+-182.278551827736
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-916.376162171087
+20
+-182.278551827736
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-914.651018607606
+22
+-187.965588003526
+32
+1614.7610800213
+13
+-914.651018607606
+23
+-187.965588003526
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-914.651018607606
+20
+-187.965588003526
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-887.227323624272
+22
+-278.369394820258
+32
+1614.7610800213
+13
+-887.227323624272
+23
+-278.369394820258
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-887.227323624272
+20
+-278.369394820258
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-863.207469797099
+22
+-357.552241131722
+32
+1614.7610800213
+13
+-863.207469797099
+23
+-357.552241131722
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-863.207469797099
+20
+-357.552241131722
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-857.607798337338
+22
+-368.028489582189
+32
+1614.7610800213
+13
+-857.607798337338
+23
+-368.028489582189
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-857.607798337338
+20
+-368.028489582189
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-813.095615539802
+22
+-451.304926317894
+32
+1614.7610800213
+13
+-813.095615539802
+23
+-451.304926317894
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-813.095615539802
+20
+-451.304926317894
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-776.866198451135
+22
+-519.085398326623
+32
+1614.7610800213
+13
+-776.866198451135
+23
+-519.085398326623
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.866198451135
+20
+-519.085398326623
+30
+1614.7610800213
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+-778.906875772646
+22
+-154.93421062823
+32
+1614.7610800213
+13
+-778.906875772646
+23
+-154.93421062823
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.866198451135
+20
+-519.085398326623
+30
+1614.7610800213
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+-733.714233519903
+22
+-303.914386430124
+32
+1614.7610800213
+13
+-733.714233519903
+23
+-303.914386430124
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.866198451135
+20
+-519.085398326623
+30
+1614.7610800213
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+-765.568613986399
+22
+-532.851544827532
+32
+1614.7610800213
+13
+-765.568613986399
+23
+-532.851544827532
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-765.568613986399
+20
+-532.851544827532
+30
+1614.7610800213
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+-705.689426216297
+22
+-605.814546234746
+32
+1614.7610800213
+13
+-705.689426216297
+23
+-605.814546234746
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.689426216297
+20
+-605.814546234746
+30
+1614.7610800213
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+-660.325364744672
+22
+-441.215302798659
+32
+1614.7610800213
+13
+-660.325364744672
+23
+-441.215302798659
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.689426216297
+20
+-605.814546234746
+30
+1614.7610800213
+11
+-660.325364744672
+21
+-441.215302798659
+31
+1614.7610800213
+12
+-660.670394770277
+22
+-660.670394770277
+32
+1614.7610800213
+13
+-660.670394770277
+23
+-660.670394770277
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.670394770277
+20
+-660.670394770277
+30
+1614.7610800213
+11
+-660.325364744672
+21
+-441.215302798659
+31
+1614.7610800213
+12
+-642.32525459148
+22
+-675.725862229795
+32
+1614.7610800213
+13
+-642.32525459148
+23
+-675.725862229795
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-642.32525459148
+20
+-675.725862229795
+30
+1614.7610800213
+11
+-660.325364744672
+21
+-441.215302798659
+31
+1614.7610800213
+12
+-561.560562517035
+22
+-561.560562517035
+32
+1614.7610800213
+13
+-561.560562517035
+23
+-561.560562517035
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-642.32525459148
+20
+-675.725862229795
+30
+1614.7610800213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+-569.385752125536
+22
+-735.58576491719
+32
+1614.7610800213
+13
+-569.385752125536
+23
+-735.58576491719
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-569.385752125536
+20
+-735.58576491719
+30
+1614.7610800213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+-519.085398326623
+22
+-776.866198451135
+32
+1614.7610800213
+13
+-519.085398326623
+23
+-776.866198451135
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-519.085398326623
+20
+-776.866198451135
+30
+1614.7610800213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+-441.215302798659
+22
+-660.325364744672
+32
+1614.7610800213
+13
+-441.215302798659
+23
+-660.325364744672
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-519.085398326623
+20
+-776.866198451135
+30
+1614.7610800213
+11
+-441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+-492.936329267328
+22
+-790.843167058075
+32
+1614.7610800213
+13
+-492.936329267328
+23
+-790.843167058075
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-492.936329267328
+20
+-790.843167058075
+30
+1614.7610800213
+11
+-441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+-409.740279224824
+22
+-835.312382272912
+32
+1614.7610800213
+13
+-409.740279224824
+23
+-835.312382272912
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-409.740279224824
+20
+-835.312382272912
+30
+1614.7610800213
+11
+-441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+-303.914386430124
+22
+-733.714233519903
+32
+1614.7610800213
+13
+-303.914386430124
+23
+-733.714233519903
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-409.740279224824
+20
+-835.312382272912
+30
+1614.7610800213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+-357.552241131723
+22
+-863.207469797099
+32
+1614.7610800213
+13
+-357.552241131723
+23
+-863.207469797099
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-357.552241131723
+20
+-863.207469797099
+30
+1614.7610800213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+-323.520317681463
+22
+-873.530940912515
+32
+1614.7610800213
+13
+-323.520317681463
+23
+-873.530940912515
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-323.520317681463
+20
+-873.530940912515
+30
+1614.7610800213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+-233.261861972698
+22
+-900.910544119288
+32
+1614.7610800213
+13
+-233.261861972698
+23
+-900.910544119288
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-233.261861972698
+20
+-900.910544119288
+30
+1614.7610800213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+-154.93421062823
+22
+-778.906875772646
+32
+1614.7610800213
+13
+-154.93421062823
+23
+-778.906875772646
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-233.261861972698
+20
+-900.910544119288
+30
+1614.7610800213
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+-182.278551827737
+22
+-916.376162171087
+32
+1614.7610800213
+13
+-182.278551827737
+23
+-916.376162171087
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-182.278551827737
+20
+-916.376162171087
+30
+1614.7610800213
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+-141.006394822338
+22
+-920.441114834126
+32
+1614.7610800213
+13
+-141.006394822338
+23
+-920.441114834126
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-141.006394822338
+20
+-920.441114834126
+30
+1614.7610800213
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+0.0
+22
+-794.166563605455
+32
+1614.7610800213
+13
+0.0
+23
+-794.166563605455
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-141.006394822338
+20
+-920.441114834126
+30
+1614.7610800213
+11
+0.0
+21
+-794.166563605455
+31
+1614.7610800213
+12
+-47.1482966446679
+22
+-929.685330640079
+32
+1614.7610800213
+13
+-47.1482966446679
+23
+-929.685330640079
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-47.1482966446679
+20
+-929.685330640079
+30
+1614.7610800213
+11
+0.0
+21
+-794.166563605455
+31
+1614.7610800213
+12
+1.80477854883065e-13
+22
+-934.329032542513
+32
+1614.7610800213
+13
+1.80477854883065e-13
+23
+-934.329032542513
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-934.329032542513
+30
+1614.7610800213
+11
+0.0
+21
+-794.166563605455
+31
+1614.7610800213
+12
+154.93421062823
+22
+-778.906875772646
+32
+1614.7610800213
+13
+154.93421062823
+23
+-778.906875772646
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-934.329032542513
+30
+1614.7610800213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+47.1483359530928
+22
+-929.685326768537
+32
+1614.7610800213
+13
+47.1483359530928
+23
+-929.685326768537
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+47.1483359530928
+20
+-929.685326768537
+30
+1614.7610800213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+141.006388747634
+22
+-920.441115432432
+32
+1614.7610800213
+13
+141.006388747634
+23
+-920.441115432432
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+141.006388747634
+20
+-920.441115432432
+30
+1614.7610800213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+182.278551827736
+22
+-916.376162171087
+32
+1614.7610800213
+13
+182.278551827736
+23
+-916.376162171087
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+182.278551827736
+20
+-916.376162171087
+30
+1614.7610800213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+303.914386430124
+22
+-733.714233519903
+32
+1614.7610800213
+13
+303.914386430124
+23
+-733.714233519903
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+182.278551827736
+20
+-916.376162171087
+30
+1614.7610800213
+11
+303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+233.261898600639
+22
+-900.910533008324
+32
+1614.7610800213
+13
+233.261898600639
+23
+-900.910533008324
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+233.261898600639
+20
+-900.910533008324
+30
+1614.7610800213
+11
+303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+323.520353196241
+22
+-873.530930139225
+32
+1614.7610800213
+13
+323.520353196241
+23
+-873.530930139225
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+323.520353196241
+20
+-873.530930139225
+30
+1614.7610800213
+11
+303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+441.215302798659
+22
+-660.325364744672
+32
+1614.7610800213
+13
+441.215302798659
+23
+-660.325364744672
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+323.520353196241
+20
+-873.530930139225
+30
+1614.7610800213
+11
+441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+357.552241131722
+22
+-863.2074697971
+32
+1614.7610800213
+13
+357.552241131722
+23
+-863.2074697971
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+357.552241131722
+20
+-863.2074697971
+30
+1614.7610800213
+11
+441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+409.740310523407
+22
+-835.312365543471
+32
+1614.7610800213
+13
+409.740310523407
+23
+-835.312365543471
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+409.740310523407
+20
+-835.312365543471
+30
+1614.7610800213
+11
+441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+492.936358899678
+22
+-790.843151219254
+32
+1614.7610800213
+13
+492.936358899678
+23
+-790.843151219254
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+492.936358899678
+20
+-790.843151219254
+30
+1614.7610800213
+11
+441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+561.560562517035
+22
+-561.560562517035
+32
+1614.7610800213
+13
+561.560562517035
+23
+-561.560562517035
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+492.936358899678
+20
+-790.843151219254
+30
+1614.7610800213
+11
+561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+519.085398326623
+22
+-776.866198451135
+32
+1614.7610800213
+13
+519.085398326623
+23
+-776.866198451135
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+519.085398326623
+20
+-776.866198451135
+30
+1614.7610800213
+11
+561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+569.38577628374
+22
+-735.585745091064
+32
+1614.7610800213
+13
+569.38577628374
+23
+-735.585745091064
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+569.38577628374
+20
+-735.585745091064
+30
+1614.7610800213
+11
+561.560562517035
+21
+-561.560562517035
+31
+1614.7610800213
+12
+660.325364744673
+22
+-441.215302798659
+32
+1614.7610800213
+13
+660.325364744673
+23
+-441.215302798659
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+569.38577628374
+20
+-735.585745091064
+30
+1614.7610800213
+11
+660.325364744673
+21
+-441.215302798659
+31
+1614.7610800213
+12
+642.325276783758
+22
+-675.725844017062
+32
+1614.7610800213
+13
+642.325276783758
+23
+-675.725844017062
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+642.325276783758
+20
+-675.725844017062
+30
+1614.7610800213
+11
+660.325364744673
+21
+-441.215302798659
+31
+1614.7610800213
+12
+660.670394770277
+22
+-660.670394770277
+32
+1614.7610800213
+13
+660.670394770277
+23
+-660.670394770277
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.670394770277
+20
+-660.670394770277
+30
+1614.7610800213
+11
+660.325364744673
+21
+-441.215302798659
+31
+1614.7610800213
+12
+733.714233519903
+22
+-303.914386430124
+32
+1614.7610800213
+13
+733.714233519903
+23
+-303.914386430124
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.670394770277
+20
+-660.670394770277
+30
+1614.7610800213
+11
+733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+705.689442544718
+22
+-605.814526338507
+32
+1614.7610800213
+13
+705.689442544718
+23
+-605.814526338507
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+705.689442544718
+20
+-605.814526338507
+30
+1614.7610800213
+11
+733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+765.568628348261
+22
+-532.851527327553
+32
+1614.7610800213
+13
+765.568628348261
+23
+-532.851527327553
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+765.568628348261
+20
+-532.851527327553
+30
+1614.7610800213
+11
+733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+778.906875772646
+22
+-154.93421062823
+32
+1614.7610800213
+13
+778.906875772646
+23
+-154.93421062823
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+765.568628348261
+20
+-532.851527327553
+30
+1614.7610800213
+11
+778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+776.866198451135
+22
+-519.085398326623
+32
+1614.7610800213
+13
+776.866198451135
+23
+-519.085398326623
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.866198451135
+20
+-519.085398326623
+30
+1614.7610800213
+11
+778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+813.09562491145
+22
+-451.304908784773
+32
+1614.7610800213
+13
+813.09562491145
+23
+-451.304908784773
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+813.09562491145
+20
+-451.304908784773
+30
+1614.7610800213
+11
+778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+794.166563605455
+22
+1.80477854883065e-13
+32
+1614.7610800213
+13
+794.166563605455
+23
+1.80477854883065e-13
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+813.09562491145
+20
+-451.304908784773
+30
+1614.7610800213
+11
+794.166563605455
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+934.329032542513
+22
+1.80477854883065e-13
+32
+1614.7610800213
+13
+934.329032542513
+23
+1.80477854883065e-13
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+813.09562491145
+20
+-451.304908784773
+30
+1614.7610800213
+11
+934.329032542513
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+857.607805708123
+22
+-368.02847579242
+32
+1614.7610800213
+13
+857.607805708123
+23
+-368.02847579242
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+857.607805708123
+20
+-368.02847579242
+30
+1614.7610800213
+11
+934.329032542513
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+863.207469797099
+22
+-357.552241131722
+32
+1614.7610800213
+13
+863.207469797099
+23
+-357.552241131722
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+863.207469797099
+20
+-357.552241131722
+30
+1614.7610800213
+11
+934.329032542513
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+887.227327057414
+22
+-278.369383502706
+32
+1614.7610800213
+13
+887.227327057414
+23
+-278.369383502706
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+887.227327057414
+20
+-278.369383502706
+30
+1614.7610800213
+11
+934.329032542513
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+914.651020925795
+22
+-187.965580361484
+32
+1614.7610800213
+13
+914.651020925795
+23
+-187.965580361484
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+914.651020925795
+20
+-187.965580361484
+30
+1614.7610800213
+11
+934.329032542513
+21
+1.80477854883065e-13
+31
+1614.7610800213
+12
+925.063958273825
+22
+-94.0698777038381
+32
+1614.7610800213
+13
+925.063958273825
+23
+-94.0698777038381
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+914.651020925795
+20
+-187.965580361484
+30
+1614.7610800213
+11
+925.063958273825
+21
+-94.0698777038381
+31
+1614.7610800213
+12
+916.376162171087
+22
+-182.278551827737
+32
+1614.7610800213
+13
+916.376162171087
+23
+-182.278551827737
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+694.940121314314
+20
+-464.344143695271
+30
+738.078199114136
+11
+782.993203577332
+21
+-324.326404167689
+31
+796.153149972084
+12
+704.67526609701
+22
+-470.84895947612
+32
+796.153149972084
+13
+704.67526609701
+23
+-470.84895947612
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+782.993203577332
+20
+-324.326404167689
+30
+796.153149972084
+11
+694.940121314314
+21
+-464.344143695271
+31
+738.078199114136
+12
+772.176090266528
+22
+-319.845809128627
+32
+738.078199114136
+13
+772.176090266528
+23
+-319.845809128627
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-303.914386430124
+20
+-733.714233519903
+30
+1614.7610800213
+11
+-389.246833055444
+21
+-793.533661525914
+31
+1427.8983600213
+12
+-339.669019965462
+22
+-820.033554718597
+32
+1427.8983600213
+13
+-339.669019965462
+23
+-820.033554718597
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-389.246833055444
+20
+-793.533661525914
+30
+1427.8983600213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+-468.281766857471
+22
+-751.288609279597
+32
+1427.8983600213
+13
+-468.281766857471
+23
+-751.288609279597
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-468.281766857471
+20
+-751.288609279597
+30
+1427.8983600213
+11
+-441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+-493.122985245198
+22
+-738.010701420772
+32
+1427.8983600213
+13
+-493.122985245198
+23
+-738.010701420772
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-441.215302798659
+20
+-660.325364744672
+30
+1614.7610800213
+11
+-468.281766857471
+21
+-751.288609279597
+31
+1427.8983600213
+12
+-303.914386430124
+22
+-733.714233519903
+32
+1614.7610800213
+13
+-303.914386430124
+23
+-733.714233519903
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+30.354884250617
+20
+-1076.33078010212
+30
+2066.4699823381
+11
+35.9517814413358
+21
+-976.024878397508
+31
+2059.65014337886
+12
+35.9517814413365
+22
+-1076.35666734212
+32
+2059.65014337885
+13
+35.9517814413365
+23
+-1076.35666734212
+33
+2059.65014337885
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+35.9517814413358
+20
+-976.024878397508
+30
+2059.65014337886
+11
+30.354884250617
+21
+-1076.33078010212
+31
+2066.4699823381
+12
+30.354884250617
+22
+-976.1678863314
+32
+2066.4699823381
+13
+30.354884250617
+23
+-976.1678863314
+33
+2066.4699823381
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+23.5350452913725
+20
+-976.504549306342
+30
+2072.06687952882
+11
+30.354884250617
+21
+-1076.33078010212
+31
+2066.4699823381
+12
+23.5350452913723
+22
+-1076.52883438997
+32
+2072.06687952882
+13
+23.5350452913723
+23
+-1076.52883438997
+33
+2072.06687952882
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+30.354884250617
+20
+-1076.33078010212
+30
+2066.4699823381
+11
+23.5350452913725
+21
+-976.504549306342
+31
+2072.06687952882
+12
+30.354884250617
+22
+-976.1678863314
+32
+2066.4699823381
+13
+30.354884250617
+23
+-976.1678863314
+33
+2066.4699823381
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.928832717995
+20
+-874.671572316599
+30
+1963.87063213502
+11
+-785.140115231108
+21
+-848.157192786392
+31
+1978.73092447164
+12
+-801.544845731016
+22
+-831.814429411314
+32
+1978.70958937363
+13
+-801.544845731016
+23
+-831.814429411314
+33
+1978.70958937363
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-785.140115231108
+20
+-848.157192786392
+30
+1978.73092447164
+11
+-758.928832717995
+21
+-874.671572316599
+31
+1963.87063213502
+12
+-741.432257601186
+22
+-891.447302299009
+32
+1988.14599297097
+13
+-741.432257601186
+23
+-891.447302299009
+33
+1988.14599297097
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-785.140115231108
+20
+-848.157192786392
+30
+1978.73092447164
+11
+-741.432257601186
+21
+-891.447302299009
+31
+1988.14599297097
+12
+-769.870311262695
+22
+-863.130130350016
+32
+1987.61043910797
+13
+-769.870311262695
+23
+-863.130130350016
+33
+1987.61043910797
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-769.870311262695
+20
+-863.130130350016
+30
+1987.61043910797
+11
+-741.432257601186
+21
+-891.447302299009
+31
+1988.14599297097
+12
+-758.060123058849
+22
+-874.453748088142
+32
+2003.99630767223
+13
+-758.060123058849
+23
+-874.453748088142
+33
+2003.99630767223
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.060123058849
+20
+-874.453748088142
+30
+2003.99630767223
+11
+-741.432257601186
+21
+-891.447302299009
+31
+1988.14599297097
+12
+-731.724734127308
+22
+-900.26267972249
+32
+2019.84617451401
+13
+-731.724734127308
+23
+-900.26267972249
+33
+2019.84617451401
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.060123058849
+20
+-874.453748088142
+30
+2003.99630767223
+11
+-731.724734127308
+21
+-900.26267972249
+31
+2019.84617451401
+12
+-751.507544713982
+22
+-880.404127848991
+32
+2025.39393021379
+13
+-751.507544713982
+23
+-880.404127848991
+33
+2025.39393021379
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-751.507544713982
+20
+-880.404127848991
+30
+2025.39393021379
+11
+-731.724734127308
+21
+-900.26267972249
+31
+2019.84617451401
+12
+-731.284144746345
+22
+-899.775643285913
+32
+2054.14511148709
+13
+-731.284144746345
+23
+-899.775643285913
+33
+2054.14511148709
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-751.507544713982
+20
+-880.404127848991
+30
+2025.39393021379
+11
+-731.284144746345
+21
+-899.775643285913
+31
+2054.14511148709
+12
+-751.210146881832
+22
+-880.075378254302
+32
+2048.54571267062
+13
+-751.210146881832
+23
+-880.075378254302
+33
+2048.54571267062
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-751.210146881832
+20
+-880.075378254302
+30
+2048.54571267062
+11
+-731.284144746345
+21
+-899.775643285913
+31
+2054.14511148709
+12
+-757.213205686422
+22
+-873.517548449742
+32
+2069.9270060351
+13
+-757.213205686422
+23
+-873.517548449742
+33
+2069.9270060351
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-757.213205686422
+20
+-873.517548449742
+30
+2069.9270060351
+11
+-731.284144746345
+21
+-899.775643285913
+31
+2054.14511148709
+12
+-740.177565197592
+22
+-890.060339871748
+32
+2085.82110165668
+13
+-740.177565197592
+23
+-890.060339871748
+33
+2085.82110165668
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-757.213205686422
+20
+-873.517548449742
+30
+2069.9270060351
+11
+-740.177565197592
+21
+-890.060339871748
+31
+2085.82110165668
+12
+-768.602809842621
+22
+-861.72900857618
+32
+2086.28270221439
+13
+-768.602809842621
+23
+-861.72900857618
+33
+2086.28270221439
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-768.602809842621
+20
+-861.72900857618
+30
+2086.28270221439
+11
+-740.177565197592
+21
+-890.060339871748
+31
+2085.82110165668
+12
+-757.051052836406
+22
+-872.59583635536
+32
+2110.05176266305
+13
+-757.051052836406
+23
+-872.59583635536
+33
+2110.05176266305
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-768.602809842621
+20
+-861.72900857618
+30
+2086.28270221439
+11
+-757.051052836406
+21
+-872.59583635536
+31
+2110.05176266305
+12
+-783.644995364665
+22
+-846.504456965985
+32
+2095.12279472996
+13
+-783.644995364665
+23
+-846.504456965985
+33
+2095.12279472996
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-783.644995364665
+20
+-846.504456965985
+30
+2095.12279472996
+11
+-757.051052836406
+21
+-872.59583635536
+31
+2110.05176266305
+12
+-826.261008377686
+22
+-803.647314060702
+32
+2109.96175196855
+13
+-826.261008377686
+23
+-803.647314060702
+33
+2109.96175196855
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-826.261008377686
+20
+-803.647314060702
+30
+2109.96175196855
+11
+-757.051052836406
+21
+-872.59583635536
+31
+2110.05176266305
+12
+-803.639076572628
+22
+-825.829443784589
+32
+2123.11658846682
+13
+-803.639076572628
+23
+-825.829443784589
+33
+2123.11658846682
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-803.639076572628
+20
+-825.829443784589
+30
+2123.11658846682
+11
+-757.051052836406
+21
+-872.59583635536
+31
+2110.05176266305
+12
+-779.335772128321
+22
+-850.040945080999
+32
+2123.14819601944
+13
+-779.335772128321
+23
+-850.040945080999
+33
+2123.14819601944
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.550764523053
+20
+-852.489442592712
+30
+1950.71579563676
+11
+-828.138788259274
+21
+-805.723050021943
+31
+1963.78062144053
+12
+-805.85406896736
+22
+-828.277941296301
+32
+1950.68418808414
+13
+-805.85406896736
+23
+-828.277941296301
+33
+1950.68418808414
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-828.138788259274
+20
+-805.723050021943
+30
+1963.78062144053
+11
+-781.550764523053
+21
+-852.489442592712
+31
+1950.71579563676
+12
+-758.928832717995
+22
+-874.671572316599
+32
+1963.87063213502
+13
+-758.928832717995
+23
+-874.671572316599
+33
+1963.87063213502
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-828.138788259274
+20
+-805.723050021943
+30
+1963.78062144053
+11
+-758.928832717995
+21
+-874.671572316599
+31
+1963.87063213502
+12
+-845.012275898089
+22
+-788.258546505553
+32
+1988.01128244689
+13
+-845.012275898089
+23
+-788.258546505553
+33
+1988.01128244689
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-845.012275898089
+20
+-788.258546505553
+30
+1988.01128244689
+11
+-758.928832717995
+21
+-874.671572316599
+31
+1963.87063213502
+12
+-801.544845731016
+22
+-831.814429411314
+32
+1978.70958937363
+13
+-801.544845731016
+23
+-831.814429411314
+33
+1978.70958937363
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-845.012275898089
+20
+-788.258546505553
+30
+1988.01128244689
+11
+-801.544845731016
+21
+-831.814429411314
+31
+1978.70958937363
+12
+-816.587031253059
+22
+-816.589877801121
+32
+1987.54968188919
+13
+-816.587031253059
+23
+-816.589877801121
+33
+1987.54968188919
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-845.012275898089
+20
+-788.258546505553
+30
+1988.01128244689
+11
+-816.587031253059
+21
+-816.589877801121
+31
+1987.54968188919
+12
+-827.976635409257
+22
+-804.801337927561
+32
+2003.90537806848
+13
+-827.976635409257
+23
+-804.801337927561
+33
+2003.90537806848
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-845.012275898089
+20
+-788.258546505553
+30
+1988.01128244689
+11
+-827.976635409257
+21
+-804.801337927561
+31
+2003.90537806848
+12
+-853.905696349335
+22
+-778.54324309139
+32
+2019.68727261649
+13
+-853.905696349335
+23
+-778.54324309139
+33
+2019.68727261649
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.905696349335
+20
+-778.54324309139
+30
+2019.68727261649
+11
+-827.976635409257
+21
+-804.801337927561
+31
+2003.90537806848
+12
+-833.979694213849
+22
+-798.243508123
+32
+2025.28667143296
+13
+-833.979694213849
+23
+-798.243508123
+33
+2025.28667143296
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.905696349335
+20
+-778.54324309139
+30
+2019.68727261649
+11
+-833.979694213849
+21
+-798.243508123
+31
+2025.28667143296
+12
+-853.465106968372
+22
+-778.056206654812
+32
+2053.98620958956
+13
+-853.465106968372
+23
+-778.056206654812
+33
+2053.98620958956
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.465106968372
+20
+-778.056206654812
+30
+2053.98620958956
+11
+-833.979694213849
+21
+-798.243508123
+31
+2025.28667143296
+12
+-833.682296381699
+22
+-797.91475852831
+32
+2048.43845388979
+13
+-833.682296381699
+23
+-797.91475852831
+33
+2048.43845388979
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.465106968372
+20
+-778.056206654812
+30
+2053.98620958956
+11
+-833.682296381699
+21
+-797.91475852831
+31
+2048.43845388979
+12
+-827.129718036832
+22
+-803.86513828916
+32
+2069.83607643134
+13
+-827.129718036832
+23
+-803.86513828916
+33
+2069.83607643134
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.465106968372
+20
+-778.056206654812
+30
+2053.98620958956
+11
+-827.129718036832
+21
+-803.86513828916
+31
+2069.83607643134
+12
+-843.757583494495
+22
+-786.871584078293
+32
+2085.68639113261
+13
+-843.757583494495
+23
+-786.871584078293
+33
+2085.68639113261
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-843.757583494495
+20
+-786.871584078293
+30
+2085.68639113261
+11
+-827.129718036832
+21
+-803.86513828916
+31
+2069.83607643134
+12
+-815.319529832985
+22
+-815.188756027286
+32
+2086.22194499561
+13
+-815.319529832985
+23
+-815.188756027286
+33
+2086.22194499561
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-843.757583494495
+20
+-786.871584078293
+30
+2085.68639113261
+11
+-815.319529832985
+21
+-815.188756027286
+31
+2086.22194499561
+12
+-826.261008377686
+22
+-803.647314060702
+32
+2109.96175196855
+13
+-826.261008377686
+23
+-803.647314060702
+33
+2109.96175196855
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-826.261008377686
+20
+-803.647314060702
+30
+2109.96175196855
+11
+-815.319529832985
+21
+-815.188756027286
+31
+2086.22194499561
+12
+-800.049725864573
+22
+-830.16169359091
+32
+2095.10145963194
+13
+-800.049725864573
+23
+-830.16169359091
+33
+2095.10145963194
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-826.261008377686
+20
+-803.647314060702
+30
+2109.96175196855
+11
+-800.049725864573
+21
+-830.16169359091
+31
+2095.10145963194
+12
+-783.644995364665
+22
+-846.504456965985
+32
+2095.12279472996
+13
+-783.644995364665
+23
+-846.504456965985
+33
+2095.12279472996
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-45.6079918995534
+20
+-975.978478371127
+30
+2025.86697911698
+11
+-46.4727423170739
+21
+-1075.39138200091
+31
+2034.64693744883
+12
+-45.6079918995535
+22
+-1075.47655248308
+32
+2025.86697911698
+13
+-45.6079918995535
+23
+-1075.47655248308
+33
+2025.86697911698
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-46.4727423170739
+20
+-1075.39138200091
+30
+2034.64693744883
+11
+-45.6079918995534
+21
+-975.978478371127
+31
+2025.86697911698
+12
+-46.4727423170739
+22
+-976.418879754098
+32
+2034.64693744883
+13
+-46.4727423170739
+23
+-976.418879754098
+33
+2034.64693744883
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-1011.8021195433
+30
+2078.49259033054
+11
+653.750224578544
+21
+-1016.06585313728
+31
+2035.20217666346
+12
+180.675224578544
+22
+-1016.06585313728
+32
+2035.20217666346
+13
+180.675224578544
+23
+-1016.06585313728
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1016.06585313728
+30
+2035.20217666346
+11
+180.675224578544
+21
+-1011.8021195433
+31
+2078.49259033054
+12
+653.750224578544
+22
+-1011.8021195433
+32
+2078.49259033054
+13
+653.750224578544
+23
+-1011.8021195433
+33
+2078.49259033054
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-966.763694030251
+30
+1862.60499591753
+11
+406.150722558891
+21
+-980.534582769308
+31
+1879.38487239655
+12
+422.745208264425
+22
+-966.763694030251
+32
+1862.60499591753
+13
+422.745208264425
+23
+-966.763694030251
+33
+1862.60499591753
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+406.150722558891
+20
+-980.534582769308
+30
+1879.38487239655
+11
+653.750224578544
+21
+-966.763694030251
+31
+1862.60499591753
+12
+653.750224578544
+22
+-997.119327169824
+32
+1899.59344191956
+13
+653.750224578544
+23
+-997.119327169824
+33
+1899.59344191956
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+406.150722558891
+20
+-980.534582769308
+30
+1879.38487239655
+11
+653.750224578544
+21
+-997.119327169824
+31
+1899.59344191956
+12
+369.41031965462
+22
+-997.119327169824
+32
+1899.59344191956
+13
+369.41031965462
+23
+-997.119327169824
+33
+1899.59344191956
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-841.785968318108
+30
+1795.80300977859
+11
+600.307476319437
+21
+-841.785968318108
+31
+1795.80300977859
+12
+653.750224578543
+22
+-795.278099285779
+32
+1791.22238449044
+13
+653.750224578543
+23
+-795.278099285779
+33
+1791.22238449044
+70
+0
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+15.754347150196
+20
+-977.021929553012
+30
+2076.22574933075
+11
+7.31179769318775
+21
+-1077.55800963197
+31
+2078.78676870972
+12
+7.31179769318775
+22
+-977.70014443868
+32
+2078.78676870972
+13
+7.31179769318775
+23
+-977.70014443868
+33
+2078.78676870972
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+7.31179769318775
+20
+-1077.55800963197
+30
+2078.78676870972
+11
+15.754347150196
+21
+-977.021929553012
+31
+2076.22574933075
+12
+15.754347150196
+22
+-1076.94321909047
+32
+2076.22574933075
+13
+15.754347150196
+23
+-1076.94321909047
+33
+2076.22574933075
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1072.40303302985
+30
+2148.21162800104
+11
+-1.4681606386561
+21
+-1078.06037755542
+31
+2079.65151912724
+12
+1.80477854883065e-13
+22
+-1078.21721573187
+32
+2079.50691792559
+13
+1.80477854883065e-13
+23
+-1078.21721573187
+33
+2079.50691792559
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-38.8881027186488
+20
+-1076.06746493881
+30
+2059.65014337885
+11
+-210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+-39.3361654272124
+22
+-1076.09427347395
+32
+2058.8118770109
+13
+-39.3361654272124
+23
+-1076.09427347395
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+-38.8881027186488
+21
+-1076.06746493881
+31
+2059.65014337885
+12
+-209.215453044867
+22
+-1051.79710945546
+32
+2148.21162800104
+13
+-209.215453044867
+23
+-1051.79710945546
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+-38.8881027186488
+21
+-1076.06746493881
+31
+2059.65014337885
+12
+-33.2912055279292
+22
+-1076.04157769881
+32
+2066.4699823381
+13
+-33.2912055279292
+23
+-1076.04157769881
+33
+2066.4699823381
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+-33.2912055279292
+21
+-1076.04157769881
+31
+2066.4699823381
+12
+-26.4713665686845
+22
+-1076.23963198666
+32
+2072.06687952882
+13
+-26.4713665686845
+23
+-1076.23963198666
+33
+2072.06687952882
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+-26.4713665686845
+21
+-1076.23963198666
+31
+2072.06687952882
+12
+-18.690668427508
+22
+-1076.65401668716
+32
+2076.22574933075
+13
+-18.690668427508
+23
+-1076.65401668716
+33
+2076.22574933075
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+-18.690668427508
+21
+-1076.65401668716
+31
+2076.22574933075
+12
+-10.2481189705
+22
+-1077.26880722866
+32
+2078.78676870972
+13
+-10.2481189705
+23
+-1077.26880722866
+33
+2078.78676870972
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+-10.2481189705
+21
+-1077.26880722866
+31
+2078.78676870972
+12
+-1.4681606386561
+22
+-1078.06037755542
+32
+2079.65151912724
+13
+-1.4681606386561
+23
+-1078.06037755542
+33
+2079.65151912724
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+-1.4681606386561
+21
+-1078.06037755542
+31
+2079.65151912724
+12
+1.80477854883065e-13
+22
+-1072.40303302985
+32
+2148.21162800104
+13
+1.80477854883065e-13
+23
+-1072.40303302985
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.987076679027
+20
+-753.814953035805
+30
+1922.19277204157
+11
+-738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+-757.858868059522
+22
+-757.858868059522
+32
+1919.76361420147
+13
+-757.858868059522
+23
+-757.858868059522
+33
+1919.76361420147
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.20854961057
+20
+-738.20854961057
+30
+1812.39759571907
+11
+-761.987076679027
+21
+-753.814953035805
+31
+1922.19277204157
+12
+-891.670534105406
+22
+-595.795202951324
+32
+1922.19277204157
+13
+-891.670534105406
+23
+-595.795202951324
+33
+1922.19277204157
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.20854961057
+20
+-738.20854961057
+30
+1812.39759571907
+11
+-891.670534105406
+21
+-595.795202951324
+31
+1922.19277204157
+12
+-868.04142298445
+22
+-580.00673566728
+32
+1812.39759571907
+13
+-868.04142298445
+23
+-580.00673566728
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-794.166563605455
+30
+1614.7610800213
+11
+-44.7901031548271
+21
+-883.186483489224
+31
+1427.8983600213
+12
+1.80477854883065e-13
+22
+-887.597923605455
+32
+1427.8983600213
+13
+1.80477854883065e-13
+23
+-887.597923605455
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-44.7901031548271
+20
+-883.186483489224
+30
+1427.8983600213
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+-173.161764737035
+22
+-870.542978388701
+32
+1427.8983600213
+13
+-173.161764737035
+23
+-870.542978388701
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-154.93421062823
+20
+-778.906875772646
+30
+1614.7610800213
+11
+-44.7901031548271
+21
+-883.186483489224
+31
+1427.8983600213
+12
+0.0
+22
+-794.166563605455
+32
+1614.7610800213
+13
+0.0
+23
+-794.166563605455
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-747.450883605455
+30
+1427.8983600213
+11
+-164.047987682633
+21
+-824.724927080674
+31
+1241.03564002131
+12
+0.0
+22
+-840.882243605455
+32
+1241.03564002131
+13
+0.0
+23
+-840.882243605455
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+1241.03564002131
+11
+0.0
+21
+-747.450883605455
+31
+1427.8983600213
+12
+-145.820433573828
+22
+-733.088824464619
+32
+1427.8983600213
+13
+-145.820433573828
+23
+-733.088824464619
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-702.965588161926
+20
+-809.153241506708
+30
+1972.08037046597
+11
+-746.546206077474
+21
+-772.245716838241
+31
+1961.59984211439
+12
+-723.636295253065
+22
+-790.983771266745
+32
+1961.01586348506
+13
+-723.636295253065
+23
+-790.983771266745
+33
+1961.01586348506
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-746.546206077474
+20
+-772.245716838241
+30
+1961.59984211439
+11
+-702.965588161926
+21
+-809.153241506708
+31
+1972.08037046597
+12
+-761.145931803741
+22
+-761.14593180374
+32
+1969.69450846846
+13
+-761.145931803741
+23
+-761.14593180374
+33
+1969.69450846846
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.145931803741
+20
+-761.14593180374
+30
+1969.69450846846
+11
+-702.965588161926
+21
+-809.153241506708
+31
+1972.08037046597
+12
+-763.653083482914
+22
+-763.653083482914
+32
+2011.5925230317
+13
+-763.653083482914
+23
+-763.653083482914
+33
+2011.5925230317
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-763.653083482914
+20
+-763.653083482914
+30
+2011.5925230317
+11
+-702.965588161926
+21
+-809.153241506708
+31
+1972.08037046597
+12
+-687.957452549297
+22
+-823.760435027841
+32
+1993.10258668608
+13
+-687.957452549297
+23
+-823.760435027841
+33
+1993.10258668608
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-763.653083482914
+20
+-763.653083482914
+30
+2011.5925230317
+11
+-687.957452549297
+21
+-823.760435027841
+31
+1993.10258668608
+12
+-683.329149560927
+22
+-829.573232448602
+32
+2011.5925230317
+13
+-683.329149560927
+23
+-829.573232448602
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1043.98454271904
+30
+2258.00680432354
+11
+-209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+1.80477854883065e-13
+22
+-1072.40303302985
+32
+2148.21162800104
+13
+1.80477854883065e-13
+23
+-1072.40303302985
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+1.80477854883065e-13
+21
+-1043.98454271904
+31
+2258.00680432354
+12
+-203.671280618918
+22
+-1023.92467246733
+32
+2258.00680432354
+13
+-203.671280618918
+23
+-1023.92467246733
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-712.200510303116
+20
+-793.069743896677
+30
+1912.98147661467
+11
+-758.928832717995
+21
+-874.671572316599
+31
+1963.87063213502
+12
+-781.550764523053
+22
+-852.489442592712
+32
+1950.71579563676
+13
+-781.550764523053
+23
+-852.489442592712
+33
+1950.71579563676
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.928832717995
+20
+-874.671572316599
+30
+1963.87063213502
+11
+-712.200510303116
+21
+-793.069743896677
+31
+1912.98147661467
+12
+-697.04031921187
+22
+-808.580814515394
+32
+1922.19277204157
+13
+-697.04031921187
+23
+-808.580814515394
+33
+1922.19277204157
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-758.928832717995
+20
+-874.671572316599
+30
+1963.87063213502
+11
+-697.04031921187
+21
+-808.580814515394
+31
+1922.19277204157
+12
+-679.407718084958
+22
+-824.046894149155
+32
+1931.32901160226
+13
+-679.407718084958
+23
+-824.046894149155
+33
+1931.32901160226
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1078.12323678805
+30
+1989.78695697206
+11
+-1.4681606386561
+21
+-978.157451656943
+31
+1989.64235577041
+12
+-1.4681606386561
+22
+-1077.9663986116
+32
+1989.64235577041
+13
+-1.4681606386561
+23
+-1077.9663986116
+33
+1989.64235577041
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1.4681606386561
+20
+-978.157451656943
+30
+1989.64235577041
+11
+1.80477854883065e-13
+21
+-1078.12323678805
+31
+1989.78695697206
+12
+0.0
+22
+-978.310708745151
+32
+1989.78695697206
+13
+0.0
+23
+-978.310708745151
+33
+1989.78695697206
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-978.310708745151
+30
+1989.78695697206
+11
+1.80477854883065e-13
+21
+-1078.12323678805
+31
+1989.78695697206
+12
+7.31179769318757
+22
+-977.633667953296
+32
+1990.50710618793
+13
+7.31179769318757
+23
+-977.633667953296
+33
+1990.50710618793
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+7.31179769318757
+20
+-977.633667953296
+30
+1990.50710618793
+11
+1.80477854883065e-13
+21
+-1078.12323678805
+31
+1989.78695697206
+12
+7.31179769318775
+22
+-1077.46403068815
+32
+1990.50710618793
+13
+7.31179769318775
+23
+-1077.46403068815
+33
+1990.50710618793
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.670394770277
+20
+-660.670394770277
+30
+2455.6433200213
+11
+554.192057578438
+21
+-829.407026995336
+31
+2361.46489814399
+12
+705.352696568272
+22
+-705.352696568272
+32
+2361.46489814399
+13
+705.352696568272
+23
+-705.352696568272
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.192057578438
+20
+-829.407026995336
+30
+2361.46489814399
+11
+660.670394770277
+21
+-660.670394770277
+31
+2455.6433200213
+12
+519.085398326623
+22
+-776.866198451135
+32
+2455.6433200213
+13
+519.085398326623
+23
+-776.866198451135
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+519.085398326623
+20
+-776.866198451135
+30
+2455.6433200213
+11
+660.670394770277
+21
+-660.670394770277
+31
+2455.6433200213
+12
+642.325277330117
+22
+-675.725843568677
+32
+2455.6433200213
+13
+642.325277330117
+23
+-675.725843568677
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+519.085398326623
+20
+-776.866198451135
+30
+2455.6433200213
+11
+642.325277330117
+21
+-675.725843568677
+31
+2455.6433200213
+12
+569.3857757708
+22
+-735.585745512023
+32
+2455.6433200213
+13
+569.3857757708
+23
+-735.585745512023
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+891.670534105407
+20
+-595.795202951324
+30
+2148.21162800104
+11
+884.794335210004
+21
+-604.173875548016
+31
+2148.21162800104
+12
+892.684338449561
+22
+-596.472605357118
+32
+2133.80356487023
+13
+892.684338449561
+23
+-596.472605357118
+33
+2133.80356487023
+70
+0
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.20854961057
+20
+-738.208549610569
+30
+2258.00680432354
+11
+724.871895956044
+21
+-750.87609961724
+31
+2252.83778292244
+12
+739.771130343929
+22
+-739.771130343928
+32
+2249.46912732182
+13
+739.771130343929
+23
+-739.771130343928
+33
+2249.46912732182
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.871895956044
+20
+-750.87609961724
+30
+2252.83778292244
+11
+738.20854961057
+21
+-738.208549610569
+31
+2258.00680432354
+12
+670.391151613542
+22
+-794.16651328432
+32
+2257.10151651642
+13
+670.391151613542
+23
+-794.16651328432
+33
+2257.10151651642
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+670.391151613542
+20
+-794.16651328432
+30
+2257.10151651642
+11
+653.750224578544
+21
+-807.521705673266
+31
+2258.00680432354
+12
+653.750224578544
+22
+-808.286792264463
+32
+2255.71079042387
+13
+653.750224578544
+23
+-808.286792264463
+33
+2255.71079042387
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-807.521705673266
+30
+2258.00680432354
+11
+670.391151613542
+21
+-794.16651328432
+31
+2257.10151651642
+12
+738.20854961057
+22
+-738.208549610569
+32
+2258.00680432354
+13
+738.20854961057
+23
+-738.208549610569
+33
+2258.00680432354
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-644.006839982028
+20
+-861.844217926399
+30
+2011.59252303171
+11
+-731.724734127308
+21
+-900.26267972249
+31
+2019.84617451401
+12
+-643.970452120392
+22
+-861.831591212861
+32
+2011.20252653019
+13
+-643.970452120392
+23
+-861.831591212861
+33
+2011.20252653019
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-731.724734127308
+20
+-900.26267972249
+30
+2019.84617451401
+11
+-644.006839982028
+21
+-861.844217926399
+31
+2011.59252303171
+12
+-644.327893757466
+22
+-861.580735902195
+32
+2058.8118770109
+13
+-644.327893757466
+23
+-861.580735902195
+33
+2058.8118770109
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-731.724734127308
+20
+-900.26267972249
+30
+2019.84617451401
+11
+-644.327893757466
+21
+-861.580735902195
+31
+2058.8118770109
+12
+-731.284144746345
+22
+-899.775643285913
+32
+2054.14511148709
+13
+-731.284144746345
+23
+-899.775643285913
+33
+2054.14511148709
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-731.284144746345
+20
+-899.775643285913
+30
+2054.14511148709
+11
+-644.327893757466
+21
+-861.580735902195
+31
+2058.8118770109
+12
+-644.282480658799
+22
+-861.555930289753
+32
+2059.38164426315
+13
+-644.282480658799
+23
+-861.555930289753
+33
+2059.38164426315
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-399.515588143821
+20
+-964.515951276275
+30
+2258.00680432354
+11
+-595.795202951324
+21
+-891.670534105406
+31
+2148.21162800104
+12
+-410.390873558597
+22
+-990.771212819307
+32
+2148.21162800104
+13
+-410.390873558597
+23
+-990.771212819307
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-595.795202951324
+20
+-891.670534105406
+30
+2148.21162800104
+11
+-399.515588143821
+21
+-964.515951276275
+31
+2258.00680432354
+12
+-580.006735667279
+22
+-868.041422984449
+32
+2258.00680432354
+13
+-580.006735667279
+23
+-868.041422984449
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+704.67526609701
+20
+-470.84895947612
+30
+796.153149972084
+11
+784.574341950659
+21
+-324.981333125909
+31
+855.37186879426
+12
+706.098253038493
+22
+-471.799768952456
+32
+855.37186879426
+13
+706.098253038493
+23
+-471.799768952456
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+784.574341950659
+20
+-324.981333125909
+30
+855.37186879426
+11
+704.67526609701
+21
+-470.84895947612
+31
+796.153149972084
+12
+782.993203577332
+22
+-324.326404167689
+32
+796.153149972084
+13
+782.993203577332
+23
+-324.326404167689
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+772.176090266528
+20
+-319.845809128627
+30
+738.078199114136
+11
+831.221151351825
+21
+-165.340167031437
+31
+796.153149972084
+12
+782.993203577332
+22
+-324.326404167689
+32
+796.153149972084
+13
+782.993203577332
+23
+-324.326404167689
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+831.221151351825
+20
+-165.340167031437
+30
+796.153149972084
+11
+772.176090266528
+21
+-319.845809128627
+31
+738.078199114136
+12
+819.73776511114
+22
+-163.055979488767
+32
+738.078199114136
+13
+819.73776511114
+23
+-163.055979488767
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+40.1106512432667
+21
+-1076.01799327905
+31
+2017.42442965997
+12
+36.9934322066314
+22
+-1076.32501255654
+32
+2011.5925230317
+13
+36.9934322066314
+23
+-1076.32501255654
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.1106512432667
+20
+-1076.01799327905
+30
+2017.42442965997
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+210.691411720441
+22
+-1059.21725479392
+32
+2058.8118770109
+13
+210.691411720441
+23
+-1059.21725479392
+33
+2058.8118770109
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.1106512432667
+20
+-1076.01799327905
+30
+2017.42442965997
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+42.6716706222413
+22
+-1075.76575488639
+32
+2025.86697911698
+13
+42.6716706222413
+23
+-1075.76575488639
+33
+2025.86697911698
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+42.6716706222413
+20
+-1075.76575488639
+30
+2025.86697911698
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+43.536421039762
+22
+-1075.68058440422
+32
+2034.64693744883
+13
+43.536421039762
+23
+-1075.68058440422
+33
+2034.64693744883
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+43.536421039762
+20
+-1075.68058440422
+30
+2034.64693744883
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+42.6716706222413
+22
+-1075.76575488639
+32
+2043.42689578067
+13
+42.6716706222413
+23
+-1075.76575488639
+33
+2043.42689578067
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+42.6716706222413
+20
+-1075.76575488639
+30
+2043.42689578067
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+40.1106512432663
+22
+-1076.01799327905
+32
+2051.86944523768
+13
+40.1106512432663
+23
+-1076.01799327905
+33
+2051.86944523768
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.1106512432663
+20
+-1076.01799327905
+30
+2051.86944523768
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+36.3998441498995
+22
+-1076.38347587727
+32
+2058.8118770109
+13
+36.3998441498995
+23
+-1076.38347587727
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-833.682296381699
+20
+-797.91475852831
+30
+2048.43845388979
+11
+-781.183382327347
+21
+-739.911027417745
+31
+2076.74494872451
+12
+-827.129718036832
+22
+-803.86513828916
+32
+2069.83607643134
+13
+-827.129718036832
+23
+-803.86513828916
+33
+2069.83607643134
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.183382327347
+20
+-739.911027417745
+30
+2076.74494872451
+11
+-833.682296381699
+21
+-797.91475852831
+31
+2048.43845388979
+12
+-786.92474167715
+22
+-735.296194513125
+32
+2058.80750841657
+13
+-786.92474167715
+23
+-735.296194513125
+33
+2058.80750841657
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-786.92474167715
+20
+-735.296194513125
+30
+2058.80750841657
+11
+-833.682296381699
+21
+-797.91475852831
+31
+2048.43845388979
+12
+-789.34285913936
+22
+-732.349614898499
+32
+2049.89434090933
+13
+-789.34285913936
+23
+-732.349614898499
+33
+2049.89434090933
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+1.80477854883065e-13
+21
+-1072.40303302985
+31
+1922.19277204157
+12
+209.215453044867
+22
+-1051.79710945546
+32
+1922.19277204157
+13
+209.215453044867
+23
+-1051.79710945546
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1072.40303302985
+30
+1922.19277204157
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+7.31179769318775
+22
+-1077.46403068815
+32
+1990.50710618793
+13
+7.31179769318775
+23
+-1077.46403068815
+33
+1990.50710618793
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1072.40303302985
+30
+1922.19277204157
+11
+7.31179769318775
+21
+-1077.46403068815
+31
+1990.50710618793
+12
+1.80477854883065e-13
+22
+-1078.12323678805
+32
+1989.78695697206
+13
+1.80477854883065e-13
+23
+-1078.12323678805
+33
+1989.78695697206
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+7.31179769318775
+20
+-1077.46403068815
+30
+1990.50710618793
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+15.754347150196
+22
+-1076.84924014666
+32
+1993.0681255669
+13
+15.754347150196
+23
+-1076.84924014666
+33
+1993.0681255669
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+15.754347150196
+20
+-1076.84924014666
+30
+1993.0681255669
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+23.5350452913723
+22
+-1076.43485544616
+32
+1997.22699536883
+13
+23.5350452913723
+23
+-1076.43485544616
+33
+1997.22699536883
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+23.5350452913723
+20
+-1076.43485544616
+30
+1997.22699536883
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+30.3548842506176
+22
+-1076.23680115831
+32
+2002.82389255955
+13
+30.3548842506176
+23
+-1076.23680115831
+33
+2002.82389255955
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+30.3548842506176
+20
+-1076.23680115831
+30
+2002.82389255955
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+35.9517814413362
+22
+-1076.26268839831
+32
+2009.6437315188
+13
+35.9517814413362
+23
+-1076.26268839831
+33
+2009.6437315188
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+35.9517814413362
+20
+-1076.26268839831
+30
+2009.6437315188
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+36.9934322066314
+22
+-1076.32501255654
+32
+2011.5925230317
+13
+36.9934322066314
+23
+-1076.32501255654
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+-413.286070645571
+21
+-997.760836892423
+31
+2058.8118770109
+12
+-210.691411720441
+22
+-1059.21725479392
+32
+2058.8118770109
+13
+-210.691411720441
+23
+-1059.21725479392
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-413.286070645571
+20
+-997.760836892423
+30
+2058.8118770109
+11
+-209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+-410.390873558597
+22
+-990.771212819307
+32
+2148.21162800104
+13
+-410.390873558597
+23
+-990.771212819307
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-268.159752894786
+20
+-647.394912321209
+30
+1241.03564002131
+11
+-441.215302798659
+21
+-660.325364744672
+31
+1054.1729200213
+12
+-303.914386430124
+22
+-733.714233519903
+32
+1054.1729200213
+13
+-303.914386430124
+23
+-733.714233519903
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-441.215302798659
+20
+-660.325364744672
+30
+1054.1729200213
+11
+-268.159752894786
+21
+-647.394912321209
+31
+1241.03564002131
+12
+-389.307620352121
+22
+-582.640028068573
+32
+1241.03564002131
+13
+-389.307620352121
+23
+-582.640028068573
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+819.73776511114
+20
+-163.055979488767
+30
+738.078199114136
+11
+847.505736434059
+21
+1.80477854883065e-13
+31
+796.153149972084
+12
+831.221151351825
+22
+-165.340167031437
+32
+796.153149972084
+13
+831.221151351825
+23
+-165.340167031437
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+847.505736434059
+20
+1.80477854883065e-13
+30
+796.153149972084
+11
+819.73776511114
+21
+-163.055979488767
+31
+738.078199114136
+12
+835.797377356766
+22
+1.80477854883065e-13
+32
+738.078199114136
+13
+835.797377356766
+23
+1.80477854883065e-13
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+914.026066884025
+11
+-127.592879465023
+21
+-641.452721848564
+31
+1054.1729200213
+12
+-164.047987682633
+22
+-824.724927080674
+32
+914.026066884025
+13
+-164.047987682633
+23
+-824.724927080674
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-127.592879465023
+20
+-641.452721848564
+30
+1054.1729200213
+11
+0.0
+21
+-840.882243605455
+31
+914.026066884025
+12
+0.0
+22
+-654.019523605455
+32
+1054.1729200213
+13
+0.0
+23
+-654.019523605455
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1033.56568016919
+30
+1987.58272162967
+11
+653.750224578544
+21
+-1033.56568016919
+31
+2082.82163169725
+12
+653.750224578544
+22
+-1038.25578712258
+32
+2035.20217666346
+13
+653.750224578544
+23
+-1038.25578712258
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1033.56568016919
+30
+2082.82163169725
+11
+653.750224578544
+21
+-1033.56568016919
+31
+1987.58272162967
+12
+653.750224578544
+22
+-1019.67559748903
+32
+1941.79325554754
+13
+653.750224578544
+23
+-1019.67559748903
+33
+1941.79325554754
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1033.56568016919
+30
+2082.82163169725
+11
+653.750224578544
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+653.750224578544
+22
+-1019.67559748903
+32
+2128.61109777939
+13
+653.750224578544
+23
+-1019.67559748903
+33
+2128.61109777939
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1019.67559748903
+30
+2128.61109777939
+11
+653.750224578544
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+653.750224578544
+22
+-1016.06585313728
+32
+2035.20217666346
+13
+653.750224578544
+23
+-1016.06585313728
+33
+2035.20217666346
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1016.06585313728
+30
+2035.20217666346
+11
+653.750224578544
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+653.750224578544
+22
+-1011.8021195433
+32
+1991.91176299638
+13
+653.750224578544
+23
+-1011.8021195433
+33
+1991.91176299638
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1011.8021195433
+30
+1991.91176299638
+11
+653.750224578544
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+653.750224578544
+22
+-997.119327169824
+32
+1899.59344191956
+13
+653.750224578544
+23
+-997.119327169824
+33
+1899.59344191956
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1011.8021195433
+30
+1991.91176299638
+11
+653.750224578544
+21
+-997.119327169824
+31
+1899.59344191956
+12
+653.750224578544
+22
+-999.174771652236
+32
+1950.28497564898
+13
+653.750224578544
+23
+-999.174771652236
+33
+1950.28497564898
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-999.174771652236
+30
+1950.28497564898
+11
+653.750224578544
+21
+-997.119327169824
+31
+1899.59344191956
+12
+653.750224578544
+22
+-978.669071362052
+32
+1911.92150871446
+13
+653.750224578544
+23
+-978.669071362052
+33
+1911.92150871446
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-978.669071362052
+30
+1911.92150871446
+11
+653.750224578544
+21
+-997.119327169824
+31
+1899.59344191956
+12
+653.750224578544
+22
+-966.763694030251
+32
+1862.60499591753
+13
+653.750224578544
+23
+-966.763694030251
+33
+1862.60499591753
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-978.669071362052
+30
+1911.92150871446
+11
+653.750224578544
+21
+-966.763694030251
+31
+1862.60499591753
+12
+653.750224578544
+22
+-951.073041235167
+32
+1878.29564871262
+13
+653.750224578544
+23
+-951.073041235167
+33
+1878.29564871262
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-951.073041235167
+30
+1878.29564871262
+11
+653.750224578544
+21
+-966.763694030251
+31
+1862.60499591753
+12
+653.750224578544
+22
+-929.775248028225
+32
+1832.24936277796
+13
+653.750224578544
+23
+-929.775248028225
+33
+1832.24936277796
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-951.073041235167
+30
+1878.29564871262
+11
+653.750224578544
+21
+-929.775248028225
+31
+1832.24936277796
+12
+653.750224578544
+22
+-917.447181233325
+32
+1850.69961858573
+13
+653.750224578544
+23
+-917.447181233325
+33
+1850.69961858573
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-917.447181233325
+30
+1850.69961858573
+11
+653.750224578544
+21
+-929.775248028225
+31
+1832.24936277796
+12
+653.750224578544
+22
+-887.575434400246
+32
+1809.69309245876
+13
+653.750224578544
+23
+-887.575434400246
+33
+1809.69309245876
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-917.447181233325
+30
+1850.69961858573
+11
+653.750224578544
+21
+-887.575434400246
+31
+1809.69309245876
+12
+653.750224578544
+22
+-879.083714298799
+32
+1830.19391829555
+13
+653.750224578544
+23
+-879.083714298799
+33
+1830.19391829555
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-879.083714298799
+30
+1830.19391829555
+11
+653.750224578544
+21
+-887.575434400246
+31
+1809.69309245876
+12
+653.750224578544
+22
+-841.785968318108
+32
+1795.80300977859
+13
+653.750224578544
+23
+-841.785968318108
+33
+1795.80300977859
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-879.083714298799
+30
+1830.19391829555
+11
+653.750224578544
+21
+-841.785968318108
+31
+1795.80300977859
+12
+653.750224578544
+22
+-837.4569269514
+32
+1817.56657040449
+13
+653.750224578544
+23
+-837.4569269514
+33
+1817.56657040449
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-837.4569269514
+30
+1817.56657040449
+11
+653.750224578544
+21
+-841.785968318108
+31
+1795.80300977859
+12
+653.750224578543
+22
+-795.278099285779
+32
+1791.22238449044
+13
+653.750224578543
+23
+-795.278099285779
+33
+1791.22238449044
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-837.4569269514
+30
+1817.56657040449
+11
+653.750224578543
+21
+-795.278099285779
+31
+1791.22238449044
+12
+653.750224578544
+22
+-807.521705673267
+32
+1812.39759571907
+13
+653.750224578544
+23
+-807.521705673267
+33
+1812.39759571907
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-837.4569269514
+30
+1817.56657040449
+11
+653.750224578544
+21
+-807.521705673267
+31
+1812.39759571907
+12
+653.750224578543
+22
+-808.286776169451
+32
+1814.69356131783
+13
+653.750224578543
+23
+-808.286776169451
+33
+1814.69356131783
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1019.67559748903
+30
+2128.61109777939
+11
+653.750224578544
+21
+-1011.8021195433
+31
+2078.49259033054
+12
+653.750224578544
+22
+-997.119327169824
+32
+2170.81091140737
+13
+653.750224578544
+23
+-997.119327169824
+33
+2170.81091140737
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1011.8021195433
+30
+2078.49259033054
+11
+653.750224578544
+21
+-1019.67559748903
+31
+2128.61109777939
+12
+653.750224578544
+22
+-1016.06585313728
+32
+2035.20217666346
+13
+653.750224578544
+23
+-1016.06585313728
+33
+2035.20217666346
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-997.119327169824
+30
+2170.81091140737
+11
+653.750224578544
+21
+-1011.8021195433
+31
+2078.49259033054
+12
+653.750224578544
+22
+-999.174771652236
+32
+2120.11937767794
+13
+653.750224578544
+23
+-999.174771652236
+33
+2120.11937767794
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-997.119327169824
+30
+2170.81091140737
+11
+653.750224578544
+21
+-999.174771652236
+31
+2120.11937767794
+12
+653.750224578544
+22
+-978.669071362051
+32
+2158.48284461247
+13
+653.750224578544
+23
+-978.669071362051
+33
+2158.48284461247
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-997.119327169824
+30
+2170.81091140737
+11
+653.750224578544
+21
+-978.669071362051
+31
+2158.48284461247
+12
+653.750224578544
+22
+-966.763694030251
+32
+2207.79935740939
+13
+653.750224578544
+23
+-966.763694030251
+33
+2207.79935740939
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-966.763694030251
+30
+2207.79935740939
+11
+653.750224578544
+21
+-978.669071362051
+31
+2158.48284461247
+12
+653.750224578544
+22
+-951.073041235167
+32
+2192.10870461431
+13
+653.750224578544
+23
+-951.073041235167
+33
+2192.10870461431
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-966.763694030251
+30
+2207.79935740939
+11
+653.750224578544
+21
+-951.073041235167
+31
+2192.10870461431
+12
+653.750224578544
+22
+-929.775248028225
+32
+2238.15499054897
+13
+653.750224578544
+23
+-929.775248028225
+33
+2238.15499054897
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-929.775248028225
+30
+2238.15499054897
+11
+653.750224578544
+21
+-951.073041235167
+31
+2192.10870461431
+12
+653.750224578544
+22
+-917.447181233325
+32
+2219.70473474119
+13
+653.750224578544
+23
+-917.447181233325
+33
+2219.70473474119
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-929.775248028225
+30
+2238.15499054897
+11
+653.750224578544
+21
+-917.447181233325
+31
+2219.70473474119
+12
+653.750224578544
+22
+-887.575434400246
+32
+2260.71126086817
+13
+653.750224578544
+23
+-887.575434400246
+33
+2260.71126086817
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-887.575434400246
+30
+2260.71126086817
+11
+653.750224578544
+21
+-917.447181233325
+31
+2219.70473474119
+12
+653.750224578544
+22
+-879.083714298799
+32
+2240.21043503138
+13
+653.750224578544
+23
+-879.083714298799
+33
+2240.21043503138
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-887.575434400246
+30
+2260.71126086817
+11
+653.750224578544
+21
+-879.083714298799
+31
+2240.21043503138
+12
+653.750224578544
+22
+-841.785968318108
+32
+2274.60134354834
+13
+653.750224578544
+23
+-841.785968318108
+33
+2274.60134354834
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-841.785968318108
+30
+2274.60134354834
+11
+653.750224578544
+21
+-879.083714298799
+31
+2240.21043503138
+12
+653.750224578544
+22
+-837.4569269514
+32
+2252.83778292244
+13
+653.750224578544
+23
+-837.4569269514
+33
+2252.83778292244
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-841.785968318108
+30
+2274.60134354834
+11
+653.750224578544
+21
+-837.4569269514
+31
+2252.83778292244
+12
+653.750224578543
+22
+-795.278127928135
+32
+2279.18196601546
+13
+653.750224578543
+23
+-795.278127928135
+33
+2279.18196601546
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578543
+20
+-795.278127928135
+30
+2279.18196601546
+11
+653.750224578544
+21
+-837.4569269514
+31
+2252.83778292244
+12
+653.750224578544
+22
+-807.521705673266
+32
+2258.00680432354
+13
+653.750224578544
+23
+-807.521705673266
+33
+2258.00680432354
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-807.521705673266
+30
+2258.00680432354
+11
+653.750224578544
+21
+-837.4569269514
+31
+2252.83778292244
+12
+653.750224578544
+22
+-808.286792264463
+32
+2255.71079042387
+13
+653.750224578544
+23
+-808.286792264463
+33
+2255.71079042387
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-152.954610178005
+20
+-768.954752250597
+30
+631.979456702016
+11
+-285.268899238265
+21
+-688.700045464263
+31
+587.016306884026
+12
+-145.428823687577
+22
+-731.120068617964
+32
+587.016306884026
+13
+-145.428823687577
+23
+-731.120068617964
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-285.268899238265
+20
+-688.700045464263
+30
+587.016306884026
+11
+-152.954610178005
+21
+-768.954752250597
+31
+631.979456702016
+12
+-300.031260464802
+22
+-724.33953815002
+32
+631.979456702016
+13
+-300.031260464802
+23
+-724.33953815002
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+2455.6433200213
+11
+635.110015865962
+21
+-545.224063842726
+31
+2549.0746800213
+12
+594.593536632776
+22
+-594.593536632776
+32
+2549.0746800213
+13
+594.593536632776
+23
+-594.593536632776
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+635.110015865962
+20
+-545.224063842726
+30
+2549.0746800213
+11
+594.593536632776
+21
+-594.593536632776
+31
+2455.6433200213
+12
+699.168033082722
+22
+-467.169144021928
+32
+2455.6433200213
+13
+699.168033082722
+23
+-467.169144021928
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+635.110015865962
+20
+-545.224063842726
+30
+2549.0746800213
+11
+699.168033082722
+21
+-467.169144021928
+31
+2455.6433200213
+12
+689.000383427084
+22
+-479.558460974267
+32
+2549.0746800213
+13
+689.000383427084
+23
+-479.558460974267
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+689.000383427084
+20
+-479.558460974267
+30
+2549.0746800213
+11
+699.168033082722
+21
+-467.169144021928
+31
+2455.6433200213
+12
+699.168033082722
+22
+-467.169144021929
+32
+2549.0746800213
+13
+699.168033082722
+23
+-467.169144021929
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-182.278551827737
+20
+-916.376162171087
+30
+2455.6433200213
+11
+-381.734128610353
+21
+-921.587710511788
+31
+2361.46489814399
+12
+-194.606371158736
+22
+-978.352295145615
+32
+2361.46489814399
+13
+-194.606371158736
+23
+-978.352295145615
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-381.734128610353
+20
+-921.587710511788
+30
+2361.46489814399
+11
+-182.278551827737
+21
+-916.376162171087
+31
+2455.6433200213
+12
+-357.552241131723
+22
+-863.207469797099
+32
+2455.6433200213
+13
+-357.552241131723
+23
+-863.207469797099
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-357.552241131723
+20
+-863.207469797099
+30
+2455.6433200213
+11
+-182.278551827737
+21
+-916.376162171087
+31
+2455.6433200213
+12
+-233.261861254001
+22
+-900.910544337303
+32
+2455.6433200213
+13
+-233.261861254001
+23
+-900.910544337303
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-357.552241131723
+20
+-863.207469797099
+30
+2455.6433200213
+11
+-233.261861254001
+21
+-900.910544337303
+31
+2455.6433200213
+12
+-323.520317728025
+22
+-873.53094089839
+32
+2455.6433200213
+13
+-323.520317728025
+23
+-873.53094089839
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+2549.0746800213
+11
+-321.791703197793
+21
+-776.873894119249
+31
+2455.6433200213
+12
+-164.047987682633
+22
+-824.724927080674
+32
+2455.6433200213
+13
+-164.047987682633
+23
+-824.724927080674
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+2455.6433200213
+11
+-164.047987682633
+21
+-824.724927080674
+31
+2549.0746800213
+12
+-321.791703197793
+22
+-776.87389411925
+32
+2549.0746800213
+13
+-321.791703197793
+23
+-776.87389411925
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.87389411925
+30
+2549.0746800213
+11
+-164.047987682633
+21
+-824.724927080674
+31
+2549.0746800213
+12
+-209.932194866118
+22
+-810.806105001612
+32
+2549.0746800213
+13
+-209.932194866118
+23
+-810.806105001612
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.87389411925
+30
+2549.0746800213
+11
+-209.932194866118
+21
+-810.806105001612
+31
+2549.0746800213
+12
+-291.163466606751
+22
+-786.164868113883
+32
+2549.0746800213
+13
+-291.163466606751
+23
+-786.164868113883
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-158.887376492573
+20
+-798.780782641381
+30
+682.822310520627
+11
+-300.031260464802
+21
+-724.33953815002
+31
+631.979456702016
+12
+-152.954610178005
+22
+-768.954752250597
+32
+631.979456702016
+13
+-152.954610178005
+23
+-768.954752250597
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-300.031260464802
+20
+-724.33953815002
+30
+631.979456702016
+11
+-158.887376492573
+21
+-798.780782641381
+31
+682.822310520627
+12
+-311.668800211604
+22
+-752.435044439405
+32
+682.822310520627
+13
+-311.668800211604
+23
+-752.435044439405
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-163.055979488767
+20
+-819.73776511114
+30
+738.078199114136
+11
+-311.668800211604
+21
+-752.435044439405
+31
+682.822310520627
+12
+-158.887376492573
+22
+-798.780782641381
+32
+682.822310520627
+13
+-158.887376492573
+23
+-798.780782641381
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-311.668800211604
+20
+-752.435044439405
+30
+682.822310520627
+11
+-163.055979488767
+21
+-819.73776511114
+31
+738.078199114136
+12
+-319.845809128627
+22
+-772.176090266528
+32
+738.078199114136
+13
+-319.845809128627
+23
+-772.176090266528
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-165.340167031437
+20
+-831.221151351825
+30
+796.153149972084
+11
+-319.845809128627
+21
+-772.176090266528
+31
+738.078199114136
+12
+-163.055979488767
+22
+-819.73776511114
+32
+738.078199114136
+13
+-163.055979488767
+23
+-819.73776511114
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-319.845809128627
+20
+-772.176090266528
+30
+738.078199114136
+11
+-165.340167031437
+21
+-831.221151351825
+31
+796.153149972084
+12
+-324.326404167689
+22
+-782.993203577332
+32
+796.153149972084
+13
+-324.326404167689
+23
+-782.993203577332
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+533.995170927003
+20
+-892.63511672065
+30
+2258.00680432354
+11
+381.734128610352
+21
+-921.587710511788
+31
+2361.46489814399
+12
+399.51558814382
+22
+-964.515951276275
+32
+2258.00680432354
+13
+399.51558814382
+23
+-964.515951276275
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+2361.46489814399
+11
+533.995170927003
+21
+-892.63511672065
+31
+2258.00680432354
+12
+540.896920479706
+22
+-887.575434400246
+32
+2260.71126086817
+13
+540.896920479706
+23
+-887.575434400246
+33
+2260.71126086817
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+2361.46489814399
+11
+540.896920479706
+21
+-887.575434400246
+31
+2260.71126086817
+12
+577.578293884962
+22
+-864.407003018736
+32
+2267.73932769213
+13
+577.578293884962
+23
+-864.407003018736
+33
+2267.73932769213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+2361.46489814399
+11
+577.578293884962
+21
+-864.407003018736
+31
+2267.73932769213
+12
+554.192057578438
+22
+-829.407026995336
+32
+2361.46489814399
+13
+554.192057578438
+23
+-829.407026995336
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+165.340167031437
+20
+-831.221151351825
+30
+796.153149972084
+11
+1.80477854883065e-13
+21
+-835.797377356766
+31
+738.078199114136
+12
+163.055979488767
+22
+-819.73776511114
+32
+738.078199114136
+13
+163.055979488767
+23
+-819.73776511114
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-835.797377356766
+30
+738.078199114136
+11
+165.340167031437
+21
+-831.221151351825
+31
+796.153149972084
+12
+1.80477854883065e-13
+22
+-847.505736434059
+32
+796.153149972084
+13
+1.80477854883065e-13
+23
+-847.505736434059
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-990.771212819307
+20
+-410.390873558597
+30
+2148.21162800104
+11
+-1059.21725479392
+21
+-210.691411720441
+31
+2058.8118770109
+12
+-997.760836892423
+22
+-413.286070645571
+32
+2058.8118770109
+13
+-997.760836892423
+23
+-413.286070645571
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1059.21725479392
+20
+-210.691411720441
+30
+2058.8118770109
+11
+-990.771212819307
+21
+-410.390873558597
+31
+2148.21162800104
+12
+-1051.79710945546
+22
+-209.215453044867
+32
+2148.21162800104
+13
+-1051.79710945546
+23
+-209.215453044867
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-951.073041235166
+30
+2192.10870461431
+11
+653.750224578544
+21
+-978.669071362051
+31
+2158.48284461247
+12
+180.675224578544
+22
+-978.669071362051
+32
+2158.48284461247
+13
+180.675224578544
+23
+-978.669071362051
+33
+2158.48284461247
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-978.669071362051
+30
+2158.48284461247
+11
+180.675224578544
+21
+-951.073041235166
+31
+2192.10870461431
+12
+653.750224578544
+22
+-951.073041235167
+32
+2192.10870461431
+13
+653.750224578544
+23
+-951.073041235167
+33
+2192.10870461431
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-999.174771652236
+30
+2120.11937767794
+11
+653.750224578544
+21
+-1011.8021195433
+31
+2078.49259033054
+12
+180.675224578544
+22
+-1011.8021195433
+32
+2078.49259033054
+13
+180.675224578544
+23
+-1011.8021195433
+33
+2078.49259033054
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1011.8021195433
+30
+2078.49259033054
+11
+180.675224578544
+21
+-999.174771652236
+31
+2120.11937767794
+12
+653.750224578544
+22
+-999.174771652236
+32
+2120.11937767794
+13
+653.750224578544
+23
+-999.174771652236
+33
+2120.11937767794
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+610.800045742856
+20
+-425.129378778605
+30
+587.016306884026
+11
+554.385481313987
+21
+-554.385481313987
+31
+631.979456702016
+12
+527.108194536515
+22
+-527.108194536515
+32
+587.016306884026
+13
+527.108194536515
+23
+-527.108194536515
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.385481313987
+20
+-554.385481313987
+30
+631.979456702016
+11
+610.800045742856
+21
+-425.129378778605
+31
+587.016306884026
+12
+651.888361812631
+22
+-435.577877671407
+32
+631.979456702016
+13
+651.888361812631
+23
+-435.577877671407
+33
+631.979456702016
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+651.888361812631
+20
+-435.577877671407
+30
+631.979456702016
+11
+610.800045742856
+21
+-425.129378778605
+31
+587.016306884026
+12
+619.813665790805
+22
+-414.146250971868
+32
+587.016306884026
+13
+619.813665790805
+23
+-414.146250971868
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-966.763694030251
+30
+2207.79935740939
+11
+369.410361108008
+21
+-997.119327169824
+31
+2170.81091140737
+12
+653.750224578544
+22
+-997.119327169824
+32
+2170.81091140737
+13
+653.750224578544
+23
+-997.119327169824
+33
+2170.81091140737
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+369.410361108008
+20
+-997.119327169824
+30
+2170.81091140737
+11
+653.750224578544
+21
+-966.763694030251
+31
+2207.79935740939
+12
+406.150729088795
+22
+-980.53459853389
+32
+2191.01946172118
+13
+406.150729088795
+23
+-980.53459853389
+33
+2191.01946172118
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+406.150729088795
+20
+-980.53459853389
+30
+2191.01946172118
+11
+653.750224578544
+21
+-966.763694030251
+31
+2207.79935740939
+12
+422.745233791294
+22
+-966.763694030251
+32
+2207.79935740939
+13
+422.745233791294
+23
+-966.763694030251
+33
+2207.79935740939
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+688.700045464263
+20
+-285.268899238265
+30
+587.016306884026
+11
+768.954752250597
+21
+-152.954610178005
+31
+631.979456702016
+12
+724.33953815002
+22
+-300.031260464802
+32
+631.979456702016
+13
+724.33953815002
+23
+-300.031260464802
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+768.954752250597
+20
+-152.954610178005
+30
+631.979456702016
+11
+688.700045464263
+21
+-285.268899238265
+31
+587.016306884026
+12
+707.864018296911
+22
+-222.093747280928
+32
+587.016306884026
+13
+707.864018296911
+23
+-222.093747280928
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+768.954752250597
+20
+-152.954610178005
+30
+631.979456702016
+11
+707.864018296911
+21
+-222.093747280928
+31
+587.016306884026
+12
+731.120068617964
+22
+-145.428823687577
+32
+587.016306884026
+13
+731.120068617964
+23
+-145.428823687577
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+778.906875772646
+20
+-154.93421062823
+30
+1054.1729200213
+11
+647.394912321209
+21
+-268.159752894786
+31
+1241.03564002131
+12
+733.714233519903
+22
+-303.914386430124
+32
+1054.1729200213
+13
+733.714233519903
+23
+-303.914386430124
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+647.394912321209
+20
+-268.159752894786
+30
+1241.03564002131
+11
+778.906875772646
+21
+-154.93421062823
+31
+1054.1729200213
+12
+687.270773156591
+22
+-136.706656519426
+32
+1241.03564002131
+13
+687.270773156591
+23
+-136.706656519426
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-154.93421062823
+20
+-778.906875772646
+30
+1614.7610800213
+11
+-221.595075742173
+21
+-855.85089411917
+31
+1427.8983600213
+12
+-173.161764737035
+22
+-870.542978388701
+32
+1427.8983600213
+13
+-173.161764737035
+23
+-870.542978388701
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-221.595075742173
+20
+-855.85089411917
+30
+1427.8983600213
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+-307.339192645458
+22
+-829.840700617718
+32
+1427.8983600213
+13
+-307.339192645458
+23
+-829.840700617718
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-307.339192645458
+20
+-829.840700617718
+30
+1427.8983600213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+-339.669019965462
+22
+-820.033554718597
+32
+1427.8983600213
+13
+-339.669019965462
+23
+-820.033554718597
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-303.914386430124
+20
+-733.714233519903
+30
+1614.7610800213
+11
+-307.339192645458
+21
+-829.840700617718
+31
+1427.8983600213
+12
+-154.93421062823
+22
+-778.906875772646
+32
+1614.7610800213
+13
+-154.93421062823
+23
+-778.906875772646
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-194.606371158736
+20
+-978.352295145615
+30
+1708.93950189862
+11
+-233.261861972698
+21
+-900.910544119288
+31
+1614.7610800213
+12
+-182.278551827737
+22
+-916.376162171087
+32
+1614.7610800213
+13
+-182.278551827737
+23
+-916.376162171087
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-233.261861972698
+20
+-900.910544119288
+30
+1614.7610800213
+11
+-194.606371158736
+21
+-978.352295145615
+31
+1708.93950189862
+12
+-323.520317681463
+22
+-873.530940912515
+32
+1614.7610800213
+13
+-323.520317681463
+23
+-873.530940912515
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-323.520317681463
+20
+-873.530940912515
+30
+1614.7610800213
+11
+-381.734128610353
+21
+-921.587710511788
+31
+1708.93950189862
+12
+-357.552241131723
+22
+-863.207469797099
+32
+1614.7610800213
+13
+-357.552241131723
+23
+-863.207469797099
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-381.734128610353
+20
+-921.587710511788
+30
+1708.93950189862
+11
+-323.520317681463
+21
+-873.530940912515
+31
+1614.7610800213
+12
+-194.606371158736
+22
+-978.352295145615
+32
+1708.93950189862
+13
+-194.606371158736
+23
+-978.352295145615
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-897.961029579872
+20
+-599.99837764929
+30
+2058.8118770109
+11
+-818.480102290147
+21
+-696.846172894875
+31
+2011.59249120966
+12
+-818.273878310588
+22
+-697.096462294947
+32
+2058.80160712022
+13
+-818.273878310588
+23
+-697.096462294947
+33
+2058.80160712022
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-818.480102290147
+20
+-696.846172894875
+30
+2011.59249120966
+11
+-897.961029579872
+21
+-599.99837764929
+31
+2058.8118770109
+12
+-897.961029579872
+22
+-599.99837764929
+32
+2011.5925230317
+13
+-897.961029579872
+23
+-599.99837764929
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+914.026066884025
+11
+0.0
+21
+-654.019523605455
+31
+1054.1729200213
+12
+0.0
+22
+-840.882243605455
+32
+914.026066884025
+13
+0.0
+23
+-840.882243605455
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-654.019523605455
+30
+1054.1729200213
+11
+164.047987682633
+21
+-824.724927080674
+31
+914.026066884025
+12
+127.592879465023
+22
+-641.452721848564
+32
+1054.1729200213
+13
+127.592879465023
+23
+-641.452721848564
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-999.174771652236
+30
+1950.28497564898
+11
+653.750224578544
+21
+-978.669071362052
+31
+1911.92150871446
+12
+180.675224578544
+22
+-978.669071362051
+32
+1911.92150871446
+13
+180.675224578544
+23
+-978.669071362051
+33
+1911.92150871446
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-978.669071362052
+30
+1911.92150871446
+11
+180.675224578544
+21
+-999.174771652236
+31
+1950.28497564898
+12
+653.750224578544
+22
+-999.174771652236
+32
+1950.28497564898
+13
+653.750224578544
+23
+-999.174771652236
+33
+1950.28497564898
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1023.92467246733
+20
+-203.671280618918
+30
+1812.39759571907
+11
+1072.40303302985
+21
+1.80477854883065e-13
+31
+1922.19277204157
+12
+1051.79710945546
+22
+-209.215453044867
+32
+1922.19277204157
+13
+1051.79710945546
+23
+-209.215453044867
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1072.40303302985
+20
+1.80477854883065e-13
+30
+1922.19277204157
+11
+1023.92467246733
+21
+-203.671280618918
+31
+1812.39759571907
+12
+1043.98454271904
+22
+1.80477854883065e-13
+32
+1812.39759571907
+13
+1043.98454271904
+23
+1.80477854883065e-13
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+670.391151613542
+20
+-794.16651328432
+30
+2257.10151651642
+11
+180.675224578544
+21
+-837.4569269514
+31
+2252.83778292244
+12
+180.675224578544
+22
+-794.16651328432
+32
+2257.10151651642
+13
+180.675224578544
+23
+-794.16651328432
+33
+2257.10151651642
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+670.391151613542
+21
+-794.16651328432
+31
+2257.10151651642
+12
+653.750224578544
+22
+-808.286792264463
+32
+2255.71079042387
+13
+653.750224578544
+23
+-808.286792264463
+33
+2255.71079042387
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-837.4569269514
+30
+2252.83778292244
+11
+180.675224578544
+21
+-837.4569269514
+31
+2252.83778292244
+12
+653.750224578544
+22
+-808.286792264463
+32
+2255.71079042387
+13
+653.750224578544
+23
+-808.286792264463
+33
+2255.71079042387
+70
+2
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+422.745233791294
+20
+-966.763694030251
+30
+2207.79935740939
+11
+399.51558814382
+21
+-964.515951276275
+31
+2258.00680432354
+12
+406.150729088795
+22
+-980.53459853389
+32
+2191.01946172118
+13
+406.150729088795
+23
+-980.53459853389
+33
+2191.01946172118
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+399.51558814382
+20
+-964.515951276275
+30
+2258.00680432354
+11
+422.745233791294
+21
+-966.763694030251
+31
+2207.79935740939
+12
+475.358507495069
+22
+-929.775248028225
+32
+2238.15499054897
+13
+475.358507495069
+23
+-929.775248028225
+33
+2238.15499054897
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+399.51558814382
+20
+-964.515951276275
+30
+2258.00680432354
+11
+475.358507495069
+21
+-929.775248028225
+31
+2238.15499054897
+12
+533.995170927003
+22
+-892.63511672065
+32
+2258.00680432354
+13
+533.995170927003
+23
+-892.63511672065
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-43.0469725205787
+20
+-1075.72879087574
+30
+2017.42442965997
+11
+-210.691411720441
+21
+-1059.21725479392
+31
+2011.5925230317
+12
+-39.9297534839436
+22
+-1076.03581015323
+32
+2011.5925230317
+13
+-39.9297534839436
+23
+-1076.03581015323
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2011.5925230317
+11
+-43.0469725205787
+21
+-1075.72879087574
+31
+2017.42442965997
+12
+-210.691411720441
+22
+-1059.21725479392
+32
+2058.8118770109
+13
+-210.691411720441
+23
+-1059.21725479392
+33
+2058.8118770109
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+-43.0469725205787
+21
+-1075.72879087574
+31
+2017.42442965997
+12
+-45.6079918995535
+22
+-1075.47655248308
+32
+2025.86697911698
+13
+-45.6079918995535
+23
+-1075.47655248308
+33
+2025.86697911698
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+-45.6079918995535
+21
+-1075.47655248308
+31
+2025.86697911698
+12
+-46.4727423170739
+22
+-1075.39138200091
+32
+2034.64693744883
+13
+-46.4727423170739
+23
+-1075.39138200091
+33
+2034.64693744883
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+-46.4727423170739
+21
+-1075.39138200091
+31
+2034.64693744883
+12
+-45.6079918995532
+22
+-1075.47655248308
+32
+2043.42689578067
+13
+-45.6079918995532
+23
+-1075.47655248308
+33
+2043.42689578067
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+-45.6079918995532
+21
+-1075.47655248308
+31
+2043.42689578067
+12
+-43.0469725205787
+22
+-1075.72879087574
+32
+2051.86944523768
+13
+-43.0469725205787
+23
+-1075.72879087574
+33
+2051.86944523768
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+-43.0469725205787
+21
+-1075.72879087574
+31
+2051.86944523768
+12
+-39.3361654272124
+22
+-1076.09427347395
+32
+2058.8118770109
+13
+-39.3361654272124
+23
+-1076.09427347395
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1023.92467246733
+20
+-203.671280618918
+30
+1812.39759571907
+11
+-921.587710511788
+21
+-381.734128610352
+31
+1708.93950189862
+12
+-964.515951276276
+22
+-399.515588143821
+32
+1812.39759571907
+13
+-964.515951276276
+23
+-399.515588143821
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-921.587710511788
+20
+-381.734128610352
+30
+1708.93950189862
+11
+-1023.92467246733
+21
+-203.671280618918
+31
+1812.39759571907
+12
+-978.352295145615
+22
+-194.606371158736
+32
+1708.93950189862
+13
+-978.352295145615
+23
+-194.606371158736
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1051.79710945546
+20
+-209.215453044867
+30
+1922.19277204157
+11
+-964.515951276276
+21
+-399.515588143821
+31
+1812.39759571907
+12
+-990.771212819307
+22
+-410.390873558597
+32
+1922.19277204157
+13
+-990.771212819307
+23
+-410.390873558597
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-964.515951276276
+20
+-399.515588143821
+30
+1812.39759571907
+11
+-1051.79710945546
+21
+-209.215453044867
+31
+1922.19277204157
+12
+-1023.92467246733
+22
+-203.671280618918
+32
+1812.39759571907
+13
+-1023.92467246733
+23
+-203.671280618918
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-680.414811030127
+20
+-831.964968270127
+30
+2020.57508939225
+11
+-763.653083482914
+21
+-763.653083482914
+31
+2011.5925230317
+12
+-683.329149560927
+22
+-829.573232448602
+32
+2011.5925230317
+13
+-683.329149560927
+23
+-829.573232448602
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-763.653083482914
+20
+-763.653083482914
+30
+2011.5925230317
+11
+-680.414811030127
+21
+-831.964968270127
+31
+2020.57508939225
+12
+-763.653083482914
+22
+-763.653083482914
+32
+2058.8118770109
+13
+-763.653083482914
+23
+-763.653083482914
+33
+2058.8118770109
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-763.653083482914
+20
+-763.653083482914
+30
+2058.8118770109
+11
+-680.414811030127
+21
+-831.964968270127
+31
+2020.57508939225
+12
+-680.521947020029
+22
+-831.877044035484
+32
+2050.14904337117
+13
+-680.521947020029
+23
+-831.877044035484
+33
+2050.14904337117
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-763.653083482914
+20
+-763.653083482914
+30
+2058.8118770109
+11
+-680.521947020029
+21
+-831.877044035484
+31
+2050.14904337117
+12
+-683.397324988288
+22
+-829.51728232132
+32
+2058.8118770109
+13
+-683.397324988288
+23
+-829.51728232132
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+733.714233519903
+20
+-303.914386430124
+30
+1054.1729200213
+11
+582.640028068573
+21
+-389.307620352121
+31
+1241.03564002131
+12
+660.325364744673
+22
+-441.215302798659
+32
+1054.1729200213
+13
+660.325364744673
+23
+-441.215302798659
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+582.640028068573
+20
+-389.307620352121
+30
+1241.03564002131
+11
+733.714233519903
+21
+-303.914386430124
+31
+1054.1729200213
+12
+647.394912321209
+22
+-268.159752894786
+32
+1241.03564002131
+13
+647.394912321209
+23
+-268.159752894786
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-733.714233519903
+20
+-303.914386430124
+30
+1614.7610800213
+11
+-842.852042179446
+21
+-264.446547810842
+31
+1427.8983600213
+12
+-820.033554718597
+22
+-339.669019965462
+32
+1427.8983600213
+13
+-820.033554718597
+23
+-339.669019965462
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-842.852042179446
+20
+-264.446547810842
+30
+1427.8983600213
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+-778.906875772646
+22
+-154.93421062823
+32
+1614.7610800213
+13
+-778.906875772646
+23
+-154.93421062823
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-842.852042179446
+20
+-264.446547810842
+30
+1427.8983600213
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+-868.904108801094
+22
+-178.564393729439
+32
+1427.8983600213
+13
+-868.904108801094
+23
+-178.564393729439
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-868.904108801094
+20
+-178.564393729439
+30
+1427.8983600213
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+-870.542978388701
+22
+-173.161764737035
+32
+1427.8983600213
+13
+-870.542978388701
+23
+-173.161764737035
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-978.352295145615
+20
+-194.606371158736
+30
+1708.93950189862
+11
+-863.207469797099
+21
+-357.552241131722
+31
+1614.7610800213
+12
+-921.587710511788
+22
+-381.734128610352
+32
+1708.93950189862
+13
+-921.587710511788
+23
+-381.734128610352
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-863.207469797099
+20
+-357.552241131722
+30
+1614.7610800213
+11
+-978.352295145615
+21
+-194.606371158736
+31
+1708.93950189862
+12
+-887.227323624272
+22
+-278.369394820258
+32
+1614.7610800213
+13
+-887.227323624272
+23
+-278.369394820258
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-887.227323624272
+20
+-278.369394820258
+30
+1614.7610800213
+11
+-978.352295145615
+21
+-194.606371158736
+31
+1708.93950189862
+12
+-914.651018607606
+22
+-187.965588003526
+32
+1614.7610800213
+13
+-914.651018607606
+23
+-187.965588003526
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-914.651018607606
+20
+-187.965588003526
+30
+1614.7610800213
+11
+-978.352295145615
+21
+-194.606371158736
+31
+1708.93950189862
+12
+-916.376162171087
+22
+-182.278551827736
+32
+1614.7610800213
+13
+-916.376162171087
+23
+-182.278551827736
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+677.173649450057
+20
+-452.47296672438
+30
+682.822310520627
+11
+772.176090266528
+21
+-319.845809128627
+31
+738.078199114136
+12
+694.940121314314
+22
+-464.344143695271
+32
+738.078199114136
+13
+694.940121314314
+23
+-464.344143695271
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+772.176090266528
+20
+-319.845809128627
+30
+738.078199114136
+11
+677.173649450057
+21
+-452.47296672438
+31
+682.822310520627
+12
+752.435044439405
+22
+-311.668800211604
+32
+682.822310520627
+13
+752.435044439405
+23
+-311.668800211604
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-311.668800211604
+20
+-752.435044439405
+30
+682.822310520627
+11
+-435.577877671407
+21
+-651.888361812631
+31
+631.979456702016
+12
+-300.031260464802
+22
+-724.33953815002
+32
+631.979456702016
+13
+-300.031260464802
+23
+-724.33953815002
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-435.577877671407
+20
+-651.888361812631
+30
+631.979456702016
+11
+-311.668800211604
+21
+-752.435044439405
+31
+682.822310520627
+12
+-452.472966724379
+22
+-677.173649450057
+32
+682.822310520627
+13
+-452.472966724379
+23
+-677.173649450057
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-319.845809128627
+20
+-772.176090266528
+30
+738.078199114136
+11
+-452.472966724379
+21
+-677.173649450057
+31
+682.822310520627
+12
+-311.668800211604
+22
+-752.435044439405
+32
+682.822310520627
+13
+-311.668800211604
+23
+-752.435044439405
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-452.472966724379
+20
+-677.173649450057
+30
+682.822310520627
+11
+-319.845809128627
+21
+-772.176090266528
+31
+738.078199114136
+12
+-464.344143695271
+22
+-694.940121314314
+32
+738.078199114136
+13
+-464.344143695271
+23
+-694.940121314314
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+42.6716706222411
+20
+-976.334157259822
+30
+2043.42689578067
+11
+43.536421039762
+21
+-1075.68058440422
+31
+2034.64693744883
+12
+42.6716706222413
+22
+-1075.76575488639
+32
+2043.42689578067
+13
+42.6716706222413
+23
+-1075.76575488639
+33
+2043.42689578067
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+43.536421039762
+20
+-1075.68058440422
+30
+2034.64693744883
+11
+42.6716706222411
+21
+-976.334157259822
+31
+2043.42689578067
+12
+43.4817324497669
+22
+-976.746706756077
+32
+2035.2022000213
+13
+43.4817324497669
+23
+-976.746706756077
+33
+2035.2022000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+43.5364210397618
+20
+-976.708082157409
+30
+2034.64693744883
+11
+43.536421039762
+21
+-1075.68058440422
+31
+2034.64693744883
+12
+43.4817324497669
+22
+-976.746706756077
+32
+2035.2022000213
+13
+43.4817324497669
+23
+-976.746706756077
+33
+2035.2022000213
+70
+2
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-33.2912055279292
+20
+-1075.947598755
+30
+2002.82389255955
+11
+-38.8881027186488
+21
+-975.669199508814
+31
+2009.6437315188
+12
+-38.8881027186482
+22
+-1075.973485995
+32
+2009.6437315188
+13
+-38.8881027186482
+23
+-1075.973485995
+33
+2009.6437315188
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-38.8881027186488
+20
+-975.669199508814
+30
+2009.6437315188
+11
+-33.2912055279292
+21
+-1075.947598755
+31
+2002.82389255955
+12
+-33.2912055279291
+22
+-975.812207442705
+32
+2002.82389255955
+13
+-33.2912055279291
+23
+-975.812207442705
+33
+2002.82389255955
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+1427.8983600213
+11
+-824.724927080674
+21
+-164.047987682633
+31
+1241.03564002131
+12
+-776.873894119249
+22
+-321.791703197793
+32
+1241.03564002131
+13
+-776.873894119249
+23
+-321.791703197793
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+1241.03564002131
+11
+-690.554572920556
+21
+-286.037069662455
+31
+1427.8983600213
+12
+-733.088824464619
+22
+-145.820433573828
+32
+1427.8983600213
+13
+-733.088824464619
+23
+-145.820433573828
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+651.888361812631
+20
+-435.577877671407
+30
+631.979456702016
+11
+752.435044439405
+21
+-311.668800211604
+31
+682.822310520627
+12
+677.173649450057
+22
+-452.47296672438
+32
+682.822310520627
+13
+677.173649450057
+23
+-452.47296672438
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+752.435044439405
+20
+-311.668800211604
+30
+682.822310520627
+11
+651.888361812631
+21
+-435.577877671407
+31
+631.979456702016
+12
+724.33953815002
+22
+-300.031260464802
+32
+631.979456702016
+13
+724.33953815002
+23
+-300.031260464802
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+2549.0746800213
+11
+-164.047987682633
+21
+-824.724927080674
+31
+2455.6433200213
+12
+0.0
+22
+-840.882243605455
+32
+2455.6433200213
+13
+0.0
+23
+-840.882243605455
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+0.0
+21
+-840.882243605455
+31
+2549.0746800213
+12
+-164.047987682633
+22
+-824.724927080674
+32
+2549.0746800213
+13
+-164.047987682633
+23
+-824.724927080674
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+2549.0746800213
+11
+0.0
+21
+-840.882243605455
+31
+2549.0746800213
+12
+-42.4327807980229
+22
+-836.702979476311
+32
+2549.0746800213
+13
+-42.4327807980229
+23
+-836.702979476311
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+2549.0746800213
+11
+-42.4327807980229
+21
+-836.702979476311
+31
+2549.0746800213
+12
+-126.903621448811
+22
+-828.383327837855
+32
+2549.0746800213
+13
+-126.903621448811
+23
+-828.383327837855
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-706.098253038492
+20
+-471.799768952456
+30
+855.37186879426
+11
+-599.277053327022
+21
+-599.277053327022
+31
+796.153149972084
+12
+-600.487204246519
+22
+-600.487204246519
+32
+855.37186879426
+13
+-600.487204246519
+23
+-600.487204246519
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-599.277053327022
+20
+-599.277053327022
+30
+796.153149972084
+11
+-706.098253038492
+21
+-471.799768952456
+31
+855.37186879426
+12
+-704.67526609701
+22
+-470.84895947612
+32
+796.153149972084
+13
+-704.67526609701
+23
+-470.84895947612
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-26.4713665686843
+20
+-976.215346903032
+30
+2072.06687952882
+11
+-18.690668427508
+21
+-1076.65401668716
+31
+2076.22574933075
+12
+-26.4713665686845
+22
+-1076.23963198666
+32
+2072.06687952882
+13
+-26.4713665686845
+23
+-1076.23963198666
+33
+2072.06687952882
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-18.690668427508
+20
+-1076.65401668716
+30
+2076.22574933075
+11
+-26.4713665686843
+21
+-976.215346903032
+31
+2072.06687952882
+12
+-18.690668427508
+22
+-976.732727149702
+32
+2076.22574933075
+13
+-18.690668427508
+23
+-976.732727149702
+33
+2076.22574933075
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.87389411925
+30
+2549.0746800213
+11
+-467.169144021928
+21
+-699.168033082722
+31
+2455.6433200213
+12
+-321.791703197793
+22
+-776.873894119249
+32
+2455.6433200213
+13
+-321.791703197793
+23
+-776.873894119249
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+-321.791703197793
+21
+-776.87389411925
+31
+2549.0746800213
+12
+-467.169144021929
+22
+-699.168033082722
+32
+2549.0746800213
+13
+-467.169144021929
+23
+-699.168033082722
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021929
+20
+-699.168033082722
+30
+2549.0746800213
+11
+-321.791703197793
+21
+-776.87389411925
+31
+2549.0746800213
+12
+-368.760188696337
+22
+-751.768715581535
+32
+2549.0746800213
+13
+-368.760188696337
+23
+-751.768715581535
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021929
+20
+-699.168033082722
+30
+2549.0746800213
+11
+-368.760188696337
+21
+-751.768715581535
+31
+2549.0746800213
+12
+-443.635339973588
+22
+-711.747113417844
+32
+2549.0746800213
+13
+-443.635339973588
+23
+-711.747113417844
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-300.031260464802
+20
+-724.33953815002
+30
+631.979456702016
+11
+-414.146250971868
+21
+-619.813665790805
+31
+587.016306884026
+12
+-285.268899238265
+22
+-688.700045464263
+32
+587.016306884026
+13
+-285.268899238265
+23
+-688.700045464263
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-414.146250971868
+20
+-619.813665790805
+30
+587.016306884026
+11
+-300.031260464802
+21
+-724.33953815002
+31
+631.979456702016
+12
+-435.577877671407
+22
+-651.888361812631
+32
+631.979456702016
+13
+-435.577877671407
+23
+-651.888361812631
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+914.026066884025
+11
+641.452721848564
+21
+-127.592879465023
+31
+1054.1729200213
+12
+604.235251721863
+22
+-250.282436127116
+32
+1054.1729200213
+13
+604.235251721863
+23
+-250.282436127116
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+641.452721848564
+20
+-127.592879465023
+30
+1054.1729200213
+11
+776.87389411925
+21
+-321.791703197793
+31
+914.026066884025
+12
+824.724927080674
+22
+-164.047987682633
+32
+914.026066884025
+13
+824.724927080674
+23
+-164.047987682633
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-26.4713665686843
+20
+-976.215346903032
+30
+2072.06687952882
+11
+-33.2912055279292
+21
+-1076.04157769881
+31
+2066.4699823381
+12
+-33.2912055279292
+22
+-975.878683928089
+32
+2066.4699823381
+13
+-33.2912055279292
+23
+-975.878683928089
+33
+2066.4699823381
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-33.2912055279292
+20
+-1076.04157769881
+30
+2066.4699823381
+11
+-26.4713665686843
+21
+-976.215346903032
+31
+2072.06687952882
+12
+-26.4713665686845
+22
+-1076.23963198666
+32
+2072.06687952882
+13
+-26.4713665686845
+23
+-1076.23963198666
+33
+2072.06687952882
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-966.763694030251
+30
+2207.79935740939
+11
+475.358507495069
+21
+-929.775248028225
+31
+2238.15499054897
+12
+422.745233791294
+22
+-966.763694030251
+32
+2207.79935740939
+13
+422.745233791294
+23
+-966.763694030251
+33
+2207.79935740939
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+475.358507495069
+20
+-929.775248028225
+30
+2238.15499054897
+11
+653.750224578544
+21
+-966.763694030251
+31
+2207.79935740939
+12
+653.750224578544
+22
+-929.775248028225
+32
+2238.15499054897
+13
+653.750224578544
+23
+-929.775248028225
+33
+2238.15499054897
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+533.995007415167
+20
+-892.635204119545
+30
+1812.39759571907
+11
+653.750224578544
+21
+-929.775248028225
+31
+1832.24936277796
+12
+475.358481968201
+22
+-929.775248028225
+32
+1832.24936277796
+13
+475.358481968201
+23
+-929.775248028225
+33
+1832.24936277796
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-929.775248028225
+30
+1832.24936277796
+11
+533.995007415167
+21
+-892.635204119545
+31
+1812.39759571907
+12
+540.896876185886
+22
+-887.575434400246
+32
+1809.69309245876
+13
+540.896876185886
+23
+-887.575434400246
+33
+1809.69309245876
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-929.775248028225
+30
+1832.24936277796
+11
+540.896876185886
+21
+-887.575434400246
+31
+1809.69309245876
+12
+653.750224578544
+22
+-887.575434400246
+32
+1809.69309245876
+13
+653.750224578544
+23
+-887.575434400246
+33
+1809.69309245876
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+990.771212819308
+20
+-410.390873558597
+30
+2148.21162800104
+11
+868.04142298445
+21
+-580.006735667279
+31
+2258.00680432354
+12
+891.670534105407
+22
+-595.795202951324
+32
+2148.21162800104
+13
+891.670534105407
+23
+-595.795202951324
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+2258.00680432354
+11
+990.771212819308
+21
+-410.390873558597
+31
+2148.21162800104
+12
+964.515951276275
+22
+-399.51558814382
+32
+2258.00680432354
+13
+964.515951276275
+23
+-399.51558814382
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-845.012275898089
+20
+-788.258546505553
+30
+1988.01128244689
+11
+-781.35466353334
+21
+-731.718944065101
+31
+1933.51796332002
+12
+-828.138788259274
+22
+-805.723050021943
+32
+1963.78062144053
+13
+-828.138788259274
+23
+-805.723050021943
+33
+1963.78062144053
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.35466353334
+20
+-731.718944065101
+30
+1933.51796332002
+11
+-845.012275898089
+21
+-788.258546505553
+31
+1988.01128244689
+12
+-804.883917627287
+22
+-707.527532613081
+32
+1967.25758629213
+13
+-804.883917627287
+23
+-707.527532613081
+33
+1967.25758629213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+-413.286070645571
+21
+-997.760836892423
+31
+2011.5925230317
+12
+-210.691411720441
+22
+-1059.21725479392
+32
+2011.5925230317
+13
+-210.691411720441
+23
+-1059.21725479392
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-413.286070645571
+20
+-997.760836892423
+30
+2011.5925230317
+11
+-210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+-413.286070645571
+22
+-997.760836892423
+32
+2058.8118770109
+13
+-413.286070645571
+23
+-997.760836892423
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+619.813665790805
+20
+-414.146250971868
+30
+587.016306884026
+11
+724.33953815002
+21
+-300.031260464802
+31
+631.979456702016
+12
+651.888361812631
+22
+-435.577877671407
+32
+631.979456702016
+13
+651.888361812631
+23
+-435.577877671407
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.33953815002
+20
+-300.031260464802
+30
+631.979456702016
+11
+619.813665790805
+21
+-414.146250971868
+31
+587.016306884026
+12
+648.718890655847
+22
+-360.068378836192
+32
+587.016306884026
+13
+648.718890655847
+23
+-360.068378836192
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.33953815002
+20
+-300.031260464802
+30
+631.979456702016
+11
+648.718890655847
+21
+-360.068378836192
+31
+587.016306884026
+12
+684.232404647772
+22
+-293.627267317059
+32
+587.016306884026
+13
+684.232404647772
+23
+-293.627267317059
+33
+587.016306884026
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.33953815002
+20
+-300.031260464802
+30
+631.979456702016
+11
+684.232404647772
+21
+-293.627267317059
+31
+587.016306884026
+12
+688.700045464263
+22
+-285.268899238265
+32
+587.016306884026
+13
+688.700045464263
+23
+-285.268899238265
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1043.98454271904
+30
+1812.39759571907
+11
+-194.606371158736
+21
+-978.352295145615
+31
+1708.93950189862
+12
+1.80477854883065e-13
+22
+-997.519349743284
+32
+1708.93950189862
+13
+1.80477854883065e-13
+23
+-997.519349743284
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-194.606371158736
+20
+-978.352295145615
+30
+1708.93950189862
+11
+1.80477854883065e-13
+21
+-1043.98454271904
+31
+1812.39759571907
+12
+-203.671280618918
+22
+-1023.92467246733
+32
+1812.39759571907
+13
+-203.671280618918
+23
+-1023.92467246733
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+1427.8983600213
+11
+-467.169144021928
+21
+-699.168033082722
+31
+1241.03564002131
+12
+-321.791703197793
+22
+-776.873894119249
+32
+1241.03564002131
+13
+-321.791703197793
+23
+-776.873894119249
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+1241.03564002131
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+-415.26146157539
+22
+-621.482696406623
+32
+1427.8983600213
+13
+-415.26146157539
+23
+-621.482696406623
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-925.06395772174
+20
+-94.0698833092507
+30
+2455.6433200213
+11
+-840.882243605455
+21
+1.80477854883065e-13
+31
+2455.6433200213
+12
+-934.329032542513
+22
+3.60955709766131e-13
+32
+2455.6433200213
+13
+-934.329032542513
+23
+3.60955709766131e-13
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-925.06395772174
+21
+-94.0698833092507
+31
+2455.6433200213
+12
+-916.376162171087
+22
+-182.278551827736
+32
+2455.6433200213
+13
+-916.376162171087
+23
+-182.278551827736
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-916.376162171087
+21
+-182.278551827736
+31
+2455.6433200213
+12
+-914.651018565421
+22
+-187.965588142593
+32
+2455.6433200213
+13
+-914.651018565421
+23
+-187.965588142593
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-914.651018565421
+21
+-187.965588142593
+31
+2455.6433200213
+12
+-887.22732313789
+22
+-278.369396423646
+32
+2455.6433200213
+13
+-887.22732313789
+23
+-278.369396423646
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-887.22732313789
+21
+-278.369396423646
+31
+2455.6433200213
+12
+-863.207469797099
+22
+-357.552241131722
+32
+2455.6433200213
+13
+-863.207469797099
+23
+-357.552241131722
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-863.207469797099
+21
+-357.552241131722
+31
+2455.6433200213
+12
+-857.607798059122
+22
+-368.028490102694
+32
+2455.6433200213
+13
+-857.607798059122
+23
+-368.028490102694
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-857.607798059122
+21
+-368.028490102694
+31
+2455.6433200213
+12
+-813.095615905849
+22
+-451.304925633068
+32
+2455.6433200213
+13
+-813.095615905849
+23
+-451.304925633068
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+-813.095615905849
+21
+-451.304925633068
+31
+2455.6433200213
+12
+-824.724927080674
+22
+-164.047987682633
+32
+2455.6433200213
+13
+-824.724927080674
+23
+-164.047987682633
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+2455.6433200213
+11
+-813.095615905849
+21
+-451.304925633068
+31
+2455.6433200213
+12
+-776.873894119249
+22
+-321.791703197793
+32
+2455.6433200213
+13
+-776.873894119249
+23
+-321.791703197793
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.873894119249
+20
+-321.791703197793
+30
+2455.6433200213
+11
+-813.095615905849
+21
+-451.304925633068
+31
+2455.6433200213
+12
+-776.866198451135
+22
+-519.085398326623
+32
+2455.6433200213
+13
+-776.866198451135
+23
+-519.085398326623
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.873894119249
+20
+-321.791703197793
+30
+2455.6433200213
+11
+-776.866198451135
+21
+-519.085398326623
+31
+2455.6433200213
+12
+-699.168033082722
+22
+-467.169144021928
+32
+2455.6433200213
+13
+-699.168033082722
+23
+-467.169144021928
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+-776.866198451135
+21
+-519.085398326623
+31
+2455.6433200213
+12
+-765.568613945096
+22
+-532.851544877859
+32
+2455.6433200213
+13
+-765.568613945096
+23
+-532.851544877859
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+-765.568613945096
+21
+-532.851544877859
+31
+2455.6433200213
+12
+-705.689427437034
+22
+-605.814544747273
+32
+2455.6433200213
+13
+-705.689427437034
+23
+-605.814544747273
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+-705.689427437034
+21
+-605.814544747273
+31
+2455.6433200213
+12
+-660.670394770277
+22
+-660.670394770277
+32
+2455.6433200213
+13
+-660.670394770277
+23
+-660.670394770277
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+-660.670394770277
+21
+-660.670394770277
+31
+2455.6433200213
+12
+-594.593536632775
+22
+-594.593536632776
+32
+2455.6433200213
+13
+-594.593536632775
+23
+-594.593536632776
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+2455.6433200213
+11
+-660.670394770277
+21
+-660.670394770277
+31
+2455.6433200213
+12
+-642.325255137832
+22
+-675.725861781415
+32
+2455.6433200213
+13
+-642.325255137832
+23
+-675.725861781415
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+2455.6433200213
+11
+-642.325255137832
+21
+-675.725861781415
+31
+2455.6433200213
+12
+-569.385750357394
+22
+-735.585766368266
+32
+2455.6433200213
+13
+-569.385750357394
+23
+-735.585766368266
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+2455.6433200213
+11
+-569.385750357394
+21
+-735.585766368266
+31
+2455.6433200213
+12
+-467.169144021928
+22
+-699.168033082722
+32
+2455.6433200213
+13
+-467.169144021928
+23
+-699.168033082722
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+-569.385750357394
+21
+-735.585766368266
+31
+2455.6433200213
+12
+-519.085398326623
+22
+-776.866198451135
+32
+2455.6433200213
+13
+-519.085398326623
+23
+-776.866198451135
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+-519.085398326623
+21
+-776.866198451135
+31
+2455.6433200213
+12
+-492.93632885036
+22
+-790.843167280949
+32
+2455.6433200213
+13
+-492.93632885036
+23
+-790.843167280949
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+-492.93632885036
+21
+-790.843167280949
+31
+2455.6433200213
+12
+-409.740280777215
+22
+-835.312381443142
+32
+2455.6433200213
+13
+-409.740280777215
+23
+-835.312381443142
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+-409.740280777215
+21
+-835.312381443142
+31
+2455.6433200213
+12
+-321.791703197793
+22
+-776.873894119249
+32
+2455.6433200213
+13
+-321.791703197793
+23
+-776.873894119249
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+2455.6433200213
+11
+-409.740280777215
+21
+-835.312381443142
+31
+2455.6433200213
+12
+-357.552241131723
+22
+-863.207469797099
+32
+2455.6433200213
+13
+-357.552241131723
+23
+-863.207469797099
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+2455.6433200213
+11
+-357.552241131723
+21
+-863.207469797099
+31
+2455.6433200213
+12
+-323.520317728025
+22
+-873.53094089839
+32
+2455.6433200213
+13
+-323.520317728025
+23
+-873.53094089839
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+2455.6433200213
+11
+-323.520317728025
+21
+-873.53094089839
+31
+2455.6433200213
+12
+-233.261861254001
+22
+-900.910544337303
+32
+2455.6433200213
+13
+-233.261861254001
+23
+-900.910544337303
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+2455.6433200213
+11
+-233.261861254001
+21
+-900.910544337303
+31
+2455.6433200213
+12
+-164.047987682633
+22
+-824.724927080674
+32
+2455.6433200213
+13
+-164.047987682633
+23
+-824.724927080674
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+-233.261861254001
+21
+-900.910544337303
+31
+2455.6433200213
+12
+-182.278551827737
+22
+-916.376162171087
+32
+2455.6433200213
+13
+-182.278551827737
+23
+-916.376162171087
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+-182.278551827737
+21
+-916.376162171087
+31
+2455.6433200213
+12
+-141.006393478031
+22
+-920.441114966529
+32
+2455.6433200213
+13
+-141.006393478031
+23
+-920.441114966529
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+-141.006393478031
+21
+-920.441114966529
+31
+2455.6433200213
+12
+0.0
+22
+-840.882243605455
+32
+2455.6433200213
+13
+0.0
+23
+-840.882243605455
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+2455.6433200213
+11
+-141.006393478031
+21
+-920.441114966529
+31
+2455.6433200213
+12
+-47.1482978123039
+22
+-929.685330525077
+32
+2455.6433200213
+13
+-47.1482978123039
+23
+-929.685330525077
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+2455.6433200213
+11
+-47.1482978123039
+21
+-929.685330525077
+31
+2455.6433200213
+12
+1.80477854883065e-13
+22
+-934.329032542513
+32
+2455.6433200213
+13
+1.80477854883065e-13
+23
+-934.329032542513
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+2455.6433200213
+11
+1.80477854883065e-13
+21
+-934.329032542513
+31
+2455.6433200213
+12
+164.047987682633
+22
+-824.724927080674
+32
+2455.6433200213
+13
+164.047987682633
+23
+-824.724927080674
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+1.80477854883065e-13
+21
+-934.329032542513
+31
+2455.6433200213
+12
+47.148335412588
+22
+-929.685326821772
+32
+2455.6433200213
+13
+47.148335412588
+23
+-929.685326821772
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+47.148335412588
+21
+-929.685326821772
+31
+2455.6433200213
+12
+141.00638791784
+22
+-920.44111551416
+32
+2455.6433200213
+13
+141.00638791784
+23
+-920.44111551416
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+141.00638791784
+21
+-920.44111551416
+31
+2455.6433200213
+12
+182.278551827736
+22
+-916.376162171087
+32
+2455.6433200213
+13
+182.278551827736
+23
+-916.376162171087
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+2455.6433200213
+11
+182.278551827736
+21
+-916.376162171087
+31
+2455.6433200213
+12
+321.791703197793
+22
+-776.87389411925
+32
+2455.6433200213
+13
+321.791703197793
+23
+-776.87389411925
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+2455.6433200213
+11
+182.278551827736
+21
+-916.376162171087
+31
+2455.6433200213
+12
+233.261899594599
+22
+-900.91053270681
+32
+2455.6433200213
+13
+233.261899594599
+23
+-900.91053270681
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+2455.6433200213
+11
+233.261899594599
+21
+-900.91053270681
+31
+2455.6433200213
+12
+323.520353242804
+22
+-873.5309301251
+32
+2455.6433200213
+13
+323.520353242804
+23
+-873.5309301251
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+2455.6433200213
+11
+323.520353242804
+21
+-873.5309301251
+31
+2455.6433200213
+12
+467.169144021928
+22
+-699.168033082722
+32
+2455.6433200213
+13
+467.169144021928
+23
+-699.168033082722
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+323.520353242804
+21
+-873.5309301251
+31
+2455.6433200213
+12
+357.552241131722
+22
+-863.2074697971
+32
+2455.6433200213
+13
+357.552241131722
+23
+-863.2074697971
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+357.552241131722
+21
+-863.2074697971
+31
+2455.6433200213
+12
+409.740310523406
+22
+-835.312365543472
+32
+2455.6433200213
+13
+409.740310523406
+23
+-835.312365543472
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+409.740310523406
+21
+-835.312365543472
+31
+2455.6433200213
+12
+492.936359391337
+22
+-790.843150956456
+32
+2455.6433200213
+13
+492.936359391337
+23
+-790.843150956456
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2455.6433200213
+11
+492.936359391337
+21
+-790.843150956456
+31
+2455.6433200213
+12
+594.593536632776
+22
+-594.593536632776
+32
+2455.6433200213
+13
+594.593536632776
+23
+-594.593536632776
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+2455.6433200213
+11
+492.936359391337
+21
+-790.843150956456
+31
+2455.6433200213
+12
+519.085398326623
+22
+-776.866198451135
+32
+2455.6433200213
+13
+519.085398326623
+23
+-776.866198451135
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+2455.6433200213
+11
+519.085398326623
+21
+-776.866198451135
+31
+2455.6433200213
+12
+569.3857757708
+22
+-735.585745512023
+32
+2455.6433200213
+13
+569.3857757708
+23
+-735.585745512023
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+2455.6433200213
+11
+569.3857757708
+21
+-735.585745512023
+31
+2455.6433200213
+12
+642.325277330117
+22
+-675.725843568677
+32
+2455.6433200213
+13
+642.325277330117
+23
+-675.725843568677
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+2455.6433200213
+11
+642.325277330117
+21
+-675.725843568677
+31
+2455.6433200213
+12
+699.168033082722
+22
+-467.169144021928
+32
+2455.6433200213
+13
+699.168033082722
+23
+-467.169144021928
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+642.325277330117
+21
+-675.725843568677
+31
+2455.6433200213
+12
+660.670394770277
+22
+-660.670394770277
+32
+2455.6433200213
+13
+660.670394770277
+23
+-660.670394770277
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+660.670394770277
+21
+-660.670394770277
+31
+2455.6433200213
+12
+705.689442886146
+22
+-605.814525922476
+32
+2455.6433200213
+13
+705.689442886146
+23
+-605.814525922476
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+705.689442886146
+21
+-605.814525922476
+31
+2455.6433200213
+12
+776.87389411925
+22
+-321.791703197793
+32
+2455.6433200213
+13
+776.87389411925
+23
+-321.791703197793
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+2455.6433200213
+11
+705.689442886146
+21
+-605.814525922476
+31
+2455.6433200213
+12
+765.568628306957
+22
+-532.851527377882
+32
+2455.6433200213
+13
+765.568628306957
+23
+-532.851527377882
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+2455.6433200213
+11
+765.568628306957
+21
+-532.851527377882
+31
+2455.6433200213
+12
+776.866198451135
+22
+-519.085398326623
+32
+2455.6433200213
+13
+776.866198451135
+23
+-519.085398326623
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+2455.6433200213
+11
+776.866198451135
+21
+-519.085398326623
+31
+2455.6433200213
+12
+813.095624444942
+22
+-451.304909657549
+32
+2455.6433200213
+13
+813.095624444942
+23
+-451.304909657549
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+2455.6433200213
+11
+813.095624444942
+21
+-451.304909657549
+31
+2455.6433200213
+12
+824.724927080674
+22
+-164.047987682633
+32
+2455.6433200213
+13
+824.724927080674
+23
+-164.047987682633
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+824.724927080674
+20
+-164.047987682633
+30
+2455.6433200213
+11
+813.095624444942
+21
+-451.304909657549
+31
+2455.6433200213
+12
+857.607805429898
+22
+-368.028476312943
+32
+2455.6433200213
+13
+857.607805429898
+23
+-368.028476312943
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+824.724927080674
+20
+-164.047987682633
+30
+2455.6433200213
+11
+857.607805429898
+21
+-368.028476312943
+31
+2455.6433200213
+12
+840.882243605455
+22
+1.80477854883065e-13
+32
+2455.6433200213
+13
+840.882243605455
+23
+1.80477854883065e-13
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+840.882243605455
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+857.607805429898
+21
+-368.028476312943
+31
+2455.6433200213
+12
+934.329032542513
+22
+1.80477854883065e-13
+32
+2455.6433200213
+13
+934.329032542513
+23
+1.80477854883065e-13
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+934.329032542513
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+857.607805429898
+21
+-368.028476312943
+31
+2455.6433200213
+12
+863.207469797099
+22
+-357.552241131722
+32
+2455.6433200213
+13
+863.207469797099
+23
+-357.552241131722
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+934.329032542513
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+863.207469797099
+21
+-357.552241131722
+31
+2455.6433200213
+12
+887.227326571027
+22
+-278.369385106107
+32
+2455.6433200213
+13
+887.227326571027
+23
+-278.369385106107
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+934.329032542513
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+887.227326571027
+21
+-278.369385106107
+31
+2455.6433200213
+12
+914.651020883606
+22
+-187.965580500561
+32
+2455.6433200213
+13
+914.651020883606
+23
+-187.965580500561
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+934.329032542513
+20
+1.80477854883065e-13
+30
+2455.6433200213
+11
+914.651020883606
+21
+-187.965580500561
+31
+2455.6433200213
+12
+925.063958382437
+22
+-94.0698766010765
+32
+2455.6433200213
+13
+925.063958382437
+23
+-94.0698766010765
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+925.063958382437
+20
+-94.0698766010765
+30
+2455.6433200213
+11
+914.651020883606
+21
+-187.965580500561
+31
+2455.6433200213
+12
+916.376162171087
+22
+-182.278551827737
+32
+2455.6433200213
+13
+916.376162171087
+23
+-182.278551827737
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+288.287545076695
+20
+-1033.5656801692
+30
+2082.82163169725
+11
+210.691411720441
+21
+-1059.21725479392
+31
+2058.8118770109
+12
+287.457769982496
+22
+-1035.93043460251
+32
+2058.8118770109
+13
+287.457769982496
+23
+-1035.93043460251
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+210.691411720441
+20
+-1059.21725479392
+30
+2058.8118770109
+11
+288.287545076695
+21
+-1033.5656801692
+31
+2082.82163169725
+12
+209.215453044867
+22
+-1051.79710945546
+32
+2148.21162800104
+13
+209.215453044867
+23
+-1051.79710945546
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+288.287545076695
+21
+-1033.5656801692
+31
+2082.82163169725
+12
+320.792446313246
+22
+-1019.67559748903
+32
+2128.61109777939
+13
+320.792446313246
+23
+-1019.67559748903
+33
+2128.61109777939
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+320.792446313246
+21
+-1019.67559748903
+31
+2128.61109777939
+12
+349.642943907379
+22
+-1009.19889581502
+32
+2148.21162800104
+13
+349.642943907379
+23
+-1009.19889581502
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-997.519349743284
+30
+1708.93950189862
+11
+-47.1482966446679
+21
+-929.685330640079
+31
+1614.7610800213
+12
+1.80477854883065e-13
+22
+-934.329032542513
+32
+1614.7610800213
+13
+1.80477854883065e-13
+23
+-934.329032542513
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-47.1482966446679
+20
+-929.685330640079
+30
+1614.7610800213
+11
+1.80477854883065e-13
+21
+-997.519349743284
+31
+1708.93950189862
+12
+-141.006394822338
+22
+-920.441114834126
+32
+1614.7610800213
+13
+-141.006394822338
+23
+-920.441114834126
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-141.006394822338
+20
+-920.441114834126
+30
+1614.7610800213
+11
+-194.606371158736
+21
+-978.352295145615
+31
+1708.93950189862
+12
+-182.278551827737
+22
+-916.376162171087
+32
+1614.7610800213
+13
+-182.278551827737
+23
+-916.376162171087
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-194.606371158736
+20
+-978.352295145615
+30
+1708.93950189862
+11
+-141.006394822338
+21
+-920.441114834126
+31
+1614.7610800213
+12
+1.80477854883065e-13
+22
+-997.519349743284
+32
+1708.93950189862
+13
+1.80477854883065e-13
+23
+-997.519349743284
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-751.507544713982
+20
+-880.404127848991
+30
+2025.39393021379
+11
+-680.521947020029
+21
+-831.877044035484
+31
+2050.14904337117
+12
+-680.414811030127
+22
+-831.964968270127
+32
+2020.57508939225
+13
+-680.414811030127
+23
+-831.964968270127
+33
+2020.57508939225
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-680.521947020029
+20
+-831.877044035484
+30
+2050.14904337117
+11
+-751.507544713982
+21
+-880.404127848991
+31
+2025.39393021379
+12
+-751.210146881832
+22
+-880.075378254302
+32
+2048.54571267062
+13
+-751.210146881832
+23
+-880.075378254302
+33
+2048.54571267062
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+30.3548842506176
+20
+-1076.23680115831
+30
+2002.82389255955
+11
+23.5350452913723
+21
+-976.438072820957
+31
+1997.22699536883
+12
+23.5350452913723
+22
+-1076.43485544616
+32
+1997.22699536883
+13
+23.5350452913723
+23
+-1076.43485544616
+33
+1997.22699536883
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+23.5350452913723
+20
+-976.438072820957
+30
+1997.22699536883
+11
+30.3548842506176
+21
+-1076.23680115831
+31
+2002.82389255955
+12
+30.3548842506176
+22
+-976.101409846015
+32
+2002.82389255955
+13
+30.3548842506176
+23
+-976.101409846015
+33
+2002.82389255955
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+914.026066884025
+11
+1.80477854883065e-13
+21
+-849.217148276931
+31
+855.37186879426
+12
+165.674046918965
+22
+-832.899678896021
+32
+855.37186879426
+13
+165.674046918965
+23
+-832.899678896021
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-849.217148276931
+30
+855.37186879426
+11
+164.047987682633
+21
+-824.724927080674
+31
+914.026066884025
+12
+0.0
+22
+-840.882243605455
+32
+914.026066884025
+13
+0.0
+23
+-840.882243605455
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+165.674046918965
+20
+-832.899678896021
+30
+855.37186879426
+11
+1.80477854883065e-13
+21
+-847.505736434059
+31
+796.153149972084
+12
+165.340167031437
+22
+-831.221151351825
+32
+796.153149972084
+13
+165.340167031437
+23
+-831.221151351825
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-847.505736434059
+30
+796.153149972084
+11
+165.674046918965
+21
+-832.899678896021
+31
+855.37186879426
+12
+1.80477854883065e-13
+22
+-849.217148276931
+32
+855.37186879426
+13
+1.80477854883065e-13
+23
+-849.217148276931
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+829.407026995336
+20
+-554.192057578438
+30
+1708.93950189862
+11
+964.515951276275
+21
+-399.515588143821
+31
+1812.39759571907
+12
+868.04142298445
+22
+-580.006735667279
+32
+1812.39759571907
+13
+868.04142298445
+23
+-580.006735667279
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+964.515951276275
+20
+-399.515588143821
+30
+1812.39759571907
+11
+829.407026995336
+21
+-554.192057578438
+31
+1708.93950189862
+12
+921.587710511789
+22
+-381.734128610352
+32
+1708.93950189862
+13
+921.587710511789
+23
+-381.734128610352
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+1812.39759571907
+11
+990.771212819308
+21
+-410.390873558597
+31
+1922.19277204157
+12
+891.670534105407
+22
+-595.795202951324
+32
+1922.19277204157
+13
+891.670534105407
+23
+-595.795202951324
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+990.771212819308
+20
+-410.390873558597
+30
+1922.19277204157
+11
+868.04142298445
+21
+-580.006735667279
+31
+1812.39759571907
+12
+964.515951276275
+22
+-399.515588143821
+32
+1812.39759571907
+13
+964.515951276275
+23
+-399.515588143821
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+2258.00680432354
+11
+705.352696568272
+21
+-705.352696568272
+31
+2361.46489814399
+12
+738.20854961057
+22
+-738.208549610569
+32
+2258.00680432354
+13
+738.20854961057
+23
+-738.208549610569
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+705.352696568272
+20
+-705.352696568272
+30
+2361.46489814399
+11
+868.04142298445
+21
+-580.006735667279
+31
+2258.00680432354
+12
+829.407026995336
+22
+-554.192057578438
+32
+2361.46489814399
+13
+829.407026995336
+23
+-554.192057578438
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+829.407026995336
+20
+-554.192057578438
+30
+2361.46489814399
+11
+660.670394770277
+21
+-660.670394770277
+31
+2455.6433200213
+12
+705.352696568272
+22
+-705.352696568272
+32
+2361.46489814399
+13
+705.352696568272
+23
+-705.352696568272
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.670394770277
+20
+-660.670394770277
+30
+2455.6433200213
+11
+829.407026995336
+21
+-554.192057578438
+31
+2361.46489814399
+12
+705.689442886146
+22
+-605.814525922476
+32
+2455.6433200213
+13
+705.689442886146
+23
+-605.814525922476
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+705.689442886146
+20
+-605.814525922476
+30
+2455.6433200213
+11
+829.407026995336
+21
+-554.192057578438
+31
+2361.46489814399
+12
+765.568628306957
+22
+-532.851527377882
+32
+2455.6433200213
+13
+765.568628306957
+23
+-532.851527377882
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+765.568628306957
+20
+-532.851527377882
+30
+2455.6433200213
+11
+829.407026995336
+21
+-554.192057578438
+31
+2361.46489814399
+12
+776.866198451135
+22
+-519.085398326623
+32
+2455.6433200213
+13
+776.866198451135
+23
+-519.085398326623
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.866198451135
+20
+-519.085398326623
+30
+1614.7610800213
+11
+921.587710511789
+21
+-381.734128610352
+31
+1708.93950189862
+12
+829.407026995336
+22
+-554.192057578438
+32
+1708.93950189862
+13
+829.407026995336
+23
+-554.192057578438
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+921.587710511789
+20
+-381.734128610352
+30
+1708.93950189862
+11
+776.866198451135
+21
+-519.085398326623
+31
+1614.7610800213
+12
+813.09562491145
+22
+-451.304908784773
+32
+1614.7610800213
+13
+813.09562491145
+23
+-451.304908784773
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+921.587710511789
+20
+-381.734128610352
+30
+1708.93950189862
+11
+813.09562491145
+21
+-451.304908784773
+31
+1614.7610800213
+12
+857.607805708123
+22
+-368.02847579242
+32
+1614.7610800213
+13
+857.607805708123
+23
+-368.02847579242
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+921.587710511789
+20
+-381.734128610352
+30
+1708.93950189862
+11
+857.607805708123
+21
+-368.02847579242
+31
+1614.7610800213
+12
+863.207469797099
+22
+-357.552241131722
+32
+1614.7610800213
+13
+863.207469797099
+23
+-357.552241131722
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+1241.03564002131
+11
+621.482696406623
+21
+-415.26146157539
+31
+1427.8983600213
+12
+699.168033082722
+22
+-467.169144021928
+32
+1241.03564002131
+13
+699.168033082722
+23
+-467.169144021928
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+621.482696406623
+20
+-415.26146157539
+30
+1427.8983600213
+11
+776.87389411925
+21
+-321.791703197793
+31
+1241.03564002131
+12
+690.554572920556
+22
+-286.037069662455
+32
+1427.8983600213
+13
+690.554572920556
+23
+-286.037069662455
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+820.033554718597
+20
+-339.669019965462
+30
+1427.8983600213
+11
+660.325364744673
+21
+-441.215302798659
+31
+1614.7610800213
+12
+738.010701420772
+22
+-493.122985245198
+32
+1427.8983600213
+13
+738.010701420772
+23
+-493.122985245198
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.325364744673
+20
+-441.215302798659
+30
+1614.7610800213
+11
+820.033554718597
+21
+-339.669019965462
+31
+1427.8983600213
+12
+733.714233519903
+22
+-303.914386430124
+32
+1614.7610800213
+13
+733.714233519903
+23
+-303.914386430124
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-784.019466456977
+30
+631.979456702016
+11
+-145.428823687577
+21
+-731.120068617964
+31
+587.016306884026
+12
+0.0
+22
+-745.443557551535
+32
+587.016306884026
+13
+0.0
+23
+-745.443557551535
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-145.428823687577
+20
+-731.120068617964
+30
+587.016306884026
+11
+0.0
+21
+-784.019466456977
+31
+631.979456702016
+12
+-152.954610178005
+22
+-768.954752250597
+32
+631.979456702016
+13
+-152.954610178005
+23
+-768.954752250597
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-357.552241131723
+20
+-863.207469797099
+30
+2455.6433200213
+11
+-554.192057578438
+21
+-829.407026995335
+31
+2361.46489814399
+12
+-381.734128610353
+22
+-921.587710511788
+32
+2361.46489814399
+13
+-381.734128610353
+23
+-921.587710511788
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.192057578438
+20
+-829.407026995335
+30
+2361.46489814399
+11
+-357.552241131723
+21
+-863.207469797099
+31
+2455.6433200213
+12
+-519.085398326623
+22
+-776.866198451135
+32
+2455.6433200213
+13
+-519.085398326623
+23
+-776.866198451135
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-519.085398326623
+20
+-776.866198451135
+30
+2455.6433200213
+11
+-357.552241131723
+21
+-863.207469797099
+31
+2455.6433200213
+12
+-409.740280777215
+22
+-835.312381443142
+32
+2455.6433200213
+13
+-409.740280777215
+23
+-835.312381443142
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-519.085398326623
+20
+-776.866198451135
+30
+2455.6433200213
+11
+-409.740280777215
+21
+-835.312381443142
+31
+2455.6433200213
+12
+-492.93632885036
+22
+-790.843167280949
+32
+2455.6433200213
+13
+-492.93632885036
+23
+-790.843167280949
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+849.217148276931
+20
+1.80477854883065e-13
+30
+855.37186879426
+11
+824.724927080674
+21
+-164.047987682633
+31
+914.026066884025
+12
+832.899678896021
+22
+-165.674046918965
+32
+855.37186879426
+13
+832.899678896021
+23
+-165.674046918965
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+824.724927080674
+20
+-164.047987682633
+30
+914.026066884025
+11
+849.217148276931
+21
+1.80477854883065e-13
+31
+855.37186879426
+12
+840.882243605455
+22
+1.80477854883065e-13
+32
+914.026066884025
+13
+840.882243605455
+23
+1.80477854883065e-13
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1072.40303302985
+20
+1.80477854883065e-13
+30
+2148.21162800104
+11
+1023.92467246733
+21
+-203.671280618918
+31
+2258.00680432354
+12
+1051.79710945546
+22
+-209.215453044867
+32
+2148.21162800104
+13
+1051.79710945546
+23
+-209.215453044867
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1023.92467246733
+20
+-203.671280618918
+30
+2258.00680432354
+11
+1072.40303302985
+21
+1.80477854883065e-13
+31
+2148.21162800104
+12
+1043.98454271904
+22
+1.80477854883065e-13
+32
+2258.00680432354
+13
+1043.98454271904
+23
+1.80477854883065e-13
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-951.073041235167
+30
+1878.29564871262
+11
+180.675224578544
+21
+-917.447181233325
+31
+1850.69961858573
+12
+180.675224578544
+22
+-951.073041235166
+32
+1878.29564871262
+13
+180.675224578544
+23
+-951.073041235166
+33
+1878.29564871262
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-917.447181233325
+30
+1850.69961858573
+11
+653.750224578544
+21
+-951.073041235167
+31
+1878.29564871262
+12
+653.750224578544
+22
+-917.447181233325
+32
+1850.69961858573
+13
+653.750224578544
+23
+-917.447181233325
+33
+1850.69961858573
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-324.326404167689
+20
+-782.993203577332
+30
+796.153149972084
+11
+-464.344143695271
+21
+-694.940121314314
+31
+738.078199114136
+12
+-319.845809128627
+22
+-772.176090266528
+32
+738.078199114136
+13
+-319.845809128627
+23
+-772.176090266528
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-464.344143695271
+20
+-694.940121314314
+30
+738.078199114136
+11
+-324.326404167689
+21
+-782.993203577332
+31
+796.153149972084
+12
+-470.848959476119
+22
+-704.67526609701
+32
+796.153149972084
+13
+-470.848959476119
+23
+-704.67526609701
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-324.981333125909
+20
+-784.574341950658
+30
+855.37186879426
+11
+-470.848959476119
+21
+-704.67526609701
+31
+796.153149972084
+12
+-324.326404167689
+22
+-782.993203577332
+32
+796.153149972084
+13
+-324.326404167689
+23
+-782.993203577332
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-470.848959476119
+20
+-704.67526609701
+30
+796.153149972084
+11
+-324.981333125909
+21
+-784.574341950658
+31
+855.37186879426
+12
+-471.799768952456
+22
+-706.098253038492
+32
+855.37186879426
+13
+-471.799768952456
+23
+-706.098253038492
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.87389411925
+30
+914.026066884025
+11
+-471.799768952456
+21
+-706.098253038492
+31
+855.37186879426
+12
+-324.981333125909
+22
+-784.574341950658
+32
+855.37186879426
+13
+-324.981333125909
+23
+-784.574341950658
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-471.799768952456
+20
+-706.098253038492
+30
+855.37186879426
+11
+-321.791703197793
+21
+-776.87389411925
+31
+914.026066884025
+12
+-467.169144021929
+22
+-699.168033082722
+32
+914.026066884025
+13
+-467.169144021929
+23
+-699.168033082722
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+914.026066884025
+11
+-324.981333125909
+21
+-784.574341950658
+31
+855.37186879426
+12
+-165.674046918965
+22
+-832.899678896021
+32
+855.37186879426
+13
+-165.674046918965
+23
+-832.899678896021
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-324.981333125909
+20
+-784.574341950658
+30
+855.37186879426
+11
+-164.047987682633
+21
+-824.724927080674
+31
+914.026066884025
+12
+-321.791703197793
+22
+-776.87389411925
+32
+914.026066884025
+13
+-321.791703197793
+23
+-776.87389411925
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-1011.8021195433
+30
+1991.91176299638
+11
+653.750224578544
+21
+-999.174771652236
+31
+1950.28497564898
+12
+180.675224578544
+22
+-999.174771652236
+32
+1950.28497564898
+13
+180.675224578544
+23
+-999.174771652236
+33
+1950.28497564898
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-999.174771652236
+30
+1950.28497564898
+11
+180.675224578544
+21
+-1011.8021195433
+31
+1991.91176299638
+12
+653.750224578544
+22
+-1011.8021195433
+32
+1991.91176299638
+13
+653.750224578544
+23
+-1011.8021195433
+33
+1991.91176299638
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-595.795202951324
+20
+-891.670534105406
+30
+2148.21162800104
+11
+-644.327893757466
+21
+-861.580735902195
+31
+2058.8118770109
+12
+-599.99837764929
+22
+-897.961029579872
+32
+2058.8118770109
+13
+-599.99837764929
+23
+-897.961029579872
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-644.327893757466
+20
+-861.580735902195
+30
+2058.8118770109
+11
+-595.795202951324
+21
+-891.670534105406
+31
+2148.21162800104
+12
+-644.282480658799
+22
+-861.555930289753
+32
+2059.38164426315
+13
+-644.282480658799
+23
+-861.555930289753
+33
+2059.38164426315
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-644.282480658799
+20
+-861.555930289753
+30
+2059.38164426315
+11
+-595.795202951324
+21
+-891.670534105406
+31
+2148.21162800104
+12
+-655.637457605706
+22
+-847.372595440649
+32
+2104.03168141582
+13
+-655.637457605706
+23
+-847.372595440649
+33
+2104.03168141582
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-655.637457605706
+20
+-847.372595440649
+30
+2104.03168141582
+11
+-595.795202951324
+21
+-891.670534105406
+31
+2148.21162800104
+12
+-680.351354626835
+22
+-823.413171149779
+32
+2137.7839549476
+13
+-680.351354626835
+23
+-823.413171149779
+33
+2137.7839549476
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-680.351354626835
+20
+-823.413171149779
+30
+2137.7839549476
+11
+-595.795202951324
+21
+-891.670534105406
+31
+2148.21162800104
+12
+-700.811796716974
+22
+-805.485642916867
+32
+2148.21162800104
+13
+-700.811796716974
+23
+-805.485642916867
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+194.606371158736
+20
+-978.352295145615
+30
+1708.93950189862
+11
+141.006388747634
+21
+-920.441115432432
+31
+1614.7610800213
+12
+182.278551827736
+22
+-916.376162171087
+32
+1614.7610800213
+13
+182.278551827736
+23
+-916.376162171087
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+141.006388747634
+20
+-920.441115432432
+30
+1614.7610800213
+11
+194.606371158736
+21
+-978.352295145615
+31
+1708.93950189862
+12
+47.1483359530928
+22
+-929.685326768537
+32
+1614.7610800213
+13
+47.1483359530928
+23
+-929.685326768537
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+47.1483359530928
+20
+-929.685326768537
+30
+1614.7610800213
+11
+1.80477854883065e-13
+21
+-997.519349743284
+31
+1708.93950189862
+12
+1.80477854883065e-13
+22
+-934.329032542513
+32
+1614.7610800213
+13
+1.80477854883065e-13
+23
+-934.329032542513
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-997.519349743284
+30
+1708.93950189862
+11
+47.1483359530928
+21
+-929.685326768537
+31
+1614.7610800213
+12
+194.606371158736
+22
+-978.352295145615
+32
+1708.93950189862
+13
+194.606371158736
+23
+-978.352295145615
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-43.0469725205791
+20
+-975.725342330674
+30
+2017.42442965997
+11
+-45.6079918995535
+21
+-1075.47655248308
+31
+2025.86697911698
+12
+-43.0469725205787
+22
+-1075.72879087574
+32
+2017.42442965997
+13
+-43.0469725205787
+23
+-1075.72879087574
+33
+2017.42442965997
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-45.6079918995535
+20
+-1075.47655248308
+30
+2025.86697911698
+11
+-43.0469725205791
+21
+-975.725342330674
+31
+2017.42442965997
+12
+-45.6079918995534
+22
+-975.978478371127
+32
+2025.86697911698
+13
+-45.6079918995534
+23
+-975.978478371127
+33
+2025.86697911698
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+921.587710511789
+20
+-381.734128610352
+30
+2361.46489814399
+11
+776.866198451135
+21
+-519.085398326623
+31
+2455.6433200213
+12
+829.407026995336
+22
+-554.192057578438
+32
+2361.46489814399
+13
+829.407026995336
+23
+-554.192057578438
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.866198451135
+20
+-519.085398326623
+30
+2455.6433200213
+11
+921.587710511789
+21
+-381.734128610352
+31
+2361.46489814399
+12
+813.095624444942
+22
+-451.304909657549
+32
+2455.6433200213
+13
+813.095624444942
+23
+-451.304909657549
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+813.095624444942
+20
+-451.304909657549
+30
+2455.6433200213
+11
+921.587710511789
+21
+-381.734128610352
+31
+2361.46489814399
+12
+857.607805429898
+22
+-368.028476312943
+32
+2455.6433200213
+13
+857.607805429898
+23
+-368.028476312943
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+857.607805429898
+20
+-368.028476312943
+30
+2455.6433200213
+11
+921.587710511789
+21
+-381.734128610352
+31
+2361.46489814399
+12
+863.207469797099
+22
+-357.552241131722
+32
+2455.6433200213
+13
+863.207469797099
+23
+-357.552241131722
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-798.491399420167
+20
+-250.528338641286
+30
+2549.0746800213
+11
+-776.873894119249
+21
+-321.791703197793
+31
+2455.6433200213
+12
+-776.87389411925
+22
+-321.791703197793
+32
+2549.0746800213
+13
+-776.87389411925
+23
+-321.791703197793
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.873894119249
+20
+-321.791703197793
+30
+2455.6433200213
+11
+-798.491399420167
+21
+-250.528338641286
+31
+2549.0746800213
+12
+-824.724927080674
+22
+-164.047987682633
+32
+2455.6433200213
+13
+-824.724927080674
+23
+-164.047987682633
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+2455.6433200213
+11
+-798.491399420167
+21
+-250.528338641286
+31
+2549.0746800213
+12
+-823.172319072743
+22
+-169.166250356441
+32
+2549.0746800213
+13
+-823.172319072743
+23
+-169.166250356441
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+2455.6433200213
+11
+-823.172319072743
+21
+-169.166250356441
+31
+2549.0746800213
+12
+-824.724927080674
+22
+-164.047987682633
+32
+2549.0746800213
+13
+-824.724927080674
+23
+-164.047987682633
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-997.119327169824
+30
+2170.81091140737
+11
+320.792446313246
+21
+-1019.67559748903
+31
+2128.61109777939
+12
+653.750224578544
+22
+-1019.67559748903
+32
+2128.61109777939
+13
+653.750224578544
+23
+-1019.67559748903
+33
+2128.61109777939
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+320.792446313246
+20
+-1019.67559748903
+30
+2128.61109777939
+11
+653.750224578544
+21
+-997.119327169824
+31
+2170.81091140737
+12
+349.642943907379
+22
+-1009.19889581502
+32
+2148.21162800104
+13
+349.642943907379
+23
+-1009.19889581502
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+349.642943907379
+20
+-1009.19889581502
+30
+2148.21162800104
+11
+653.750224578544
+21
+-997.119327169824
+31
+2170.81091140737
+12
+369.410361108008
+22
+-997.119327169824
+32
+2170.81091140737
+13
+369.410361108008
+23
+-997.119327169824
+33
+2170.81091140737
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-700.735203605455
+30
+1241.03564002131
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1054.1729200213
+12
+0.0
+22
+-794.166563605455
+32
+1054.1729200213
+13
+0.0
+23
+-794.166563605455
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-154.93421062823
+20
+-778.906875772646
+30
+1054.1729200213
+11
+0.0
+21
+-700.735203605455
+31
+1241.03564002131
+12
+-136.706656519425
+22
+-687.270773156591
+32
+1241.03564002131
+13
+-136.706656519425
+23
+-687.270773156591
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+914.026066884025
+11
+-250.282436127117
+21
+-604.235251721862
+31
+1054.1729200213
+12
+-321.791703197793
+22
+-776.87389411925
+32
+914.026066884025
+13
+-321.791703197793
+23
+-776.87389411925
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-250.282436127117
+20
+-604.235251721862
+30
+1054.1729200213
+11
+-164.047987682633
+21
+-824.724927080674
+31
+914.026066884025
+12
+-127.592879465023
+22
+-641.452721848564
+32
+1054.1729200213
+13
+-127.592879465023
+23
+-641.452721848564
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-136.706656519425
+20
+-687.270773156591
+30
+1241.03564002131
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1054.1729200213
+12
+-154.93421062823
+22
+-778.906875772646
+32
+1054.1729200213
+13
+-154.93421062823
+23
+-778.906875772646
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-303.914386430124
+20
+-733.714233519903
+30
+1054.1729200213
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1241.03564002131
+12
+-268.159752894786
+22
+-647.394912321209
+32
+1241.03564002131
+13
+-268.159752894786
+23
+-647.394912321209
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-145.820433573828
+20
+-733.088824464619
+30
+1427.8983600213
+11
+-321.791703197793
+21
+-776.873894119249
+31
+1241.03564002131
+12
+-164.047987682633
+22
+-824.724927080674
+32
+1241.03564002131
+13
+-164.047987682633
+23
+-824.724927080674
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+1241.03564002131
+11
+-145.820433573828
+21
+-733.088824464619
+31
+1427.8983600213
+12
+-286.037069662455
+22
+-690.554572920556
+32
+1427.8983600213
+13
+-286.037069662455
+23
+-690.554572920556
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+731.773963185201
+21
+-406.167739356189
+31
+2549.0746800213
+12
+699.168033082722
+22
+-467.169144021929
+32
+2549.0746800213
+13
+699.168033082722
+23
+-467.169144021929
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+731.773963185201
+20
+-406.167739356189
+30
+2549.0746800213
+11
+699.168033082722
+21
+-467.169144021928
+31
+2455.6433200213
+12
+776.87389411925
+22
+-321.791703197793
+32
+2455.6433200213
+13
+776.87389411925
+23
+-321.791703197793
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+731.773963185201
+20
+-406.167739356189
+30
+2549.0746800213
+11
+776.87389411925
+21
+-321.791703197793
+31
+2455.6433200213
+12
+771.834245650684
+22
+-331.220222324155
+32
+2549.0746800213
+13
+771.834245650684
+23
+-331.220222324155
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+771.834245650684
+20
+-331.220222324155
+30
+2549.0746800213
+11
+776.87389411925
+21
+-321.791703197793
+31
+2455.6433200213
+12
+776.87389411925
+22
+-321.791703197793
+32
+2549.0746800213
+13
+776.87389411925
+23
+-321.791703197793
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-847.505736434059
+30
+796.153149972084
+11
+-163.055979488767
+21
+-819.73776511114
+31
+738.078199114136
+12
+1.80477854883065e-13
+22
+-835.797377356766
+32
+738.078199114136
+13
+1.80477854883065e-13
+23
+-835.797377356766
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-163.055979488767
+20
+-819.73776511114
+30
+738.078199114136
+11
+1.80477854883065e-13
+21
+-847.505736434059
+31
+796.153149972084
+12
+-165.340167031437
+22
+-831.221151351825
+32
+796.153149972084
+13
+-165.340167031437
+23
+-831.221151351825
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-46.4727423170739
+20
+-976.418879754098
+30
+2034.64693744883
+11
+-46.4180537270787
+21
+-976.457504352767
+31
+2035.20220002131
+12
+-46.4727423170739
+22
+-1075.39138200091
+32
+2034.64693744883
+13
+-46.4727423170739
+23
+-1075.39138200091
+33
+2034.64693744883
+70
+2
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-46.4727423170739
+20
+-1075.39138200091
+30
+2034.64693744883
+11
+-45.6079918995534
+21
+-976.044954856512
+31
+2043.42689578067
+12
+-45.6079918995532
+22
+-1075.47655248308
+32
+2043.42689578067
+13
+-45.6079918995532
+23
+-1075.47655248308
+33
+2043.42689578067
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-45.6079918995534
+20
+-976.044954856512
+30
+2043.42689578067
+11
+-46.4727423170739
+21
+-1075.39138200091
+31
+2034.64693744883
+12
+-46.4180537270787
+22
+-976.457504352767
+32
+2035.20220002131
+13
+-46.4180537270787
+23
+-976.457504352767
+33
+2035.20220002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-814.429823327873
+30
+682.822310520627
+11
+-152.954610178005
+21
+-768.954752250597
+31
+631.979456702016
+12
+0.0
+22
+-784.019466456977
+32
+631.979456702016
+13
+0.0
+23
+-784.019466456977
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-152.954610178005
+20
+-768.954752250597
+30
+631.979456702016
+11
+0.0
+21
+-814.429823327873
+31
+682.822310520627
+12
+-158.887376492573
+22
+-798.780782641381
+32
+682.822310520627
+13
+-158.887376492573
+23
+-798.780782641381
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-835.797377356766
+30
+738.078199114136
+11
+-158.887376492573
+21
+-798.780782641381
+31
+682.822310520627
+12
+0.0
+22
+-814.429823327873
+32
+682.822310520627
+13
+0.0
+23
+-814.429823327873
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-158.887376492573
+20
+-798.780782641381
+30
+682.822310520627
+11
+1.80477854883065e-13
+21
+-835.797377356766
+31
+738.078199114136
+12
+-163.055979488767
+22
+-819.73776511114
+32
+738.078199114136
+13
+-163.055979488767
+23
+-819.73776511114
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-868.04142298445
+20
+-580.00673566728
+30
+1812.39759571907
+11
+-705.352696568271
+21
+-705.352696568271
+31
+1708.93950189862
+12
+-738.20854961057
+22
+-738.20854961057
+32
+1812.39759571907
+13
+-738.20854961057
+23
+-738.20854961057
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.352696568271
+20
+-705.352696568271
+30
+1708.93950189862
+11
+-868.04142298445
+21
+-580.00673566728
+31
+1812.39759571907
+12
+-829.407026995335
+22
+-554.192057578438
+32
+1708.93950189862
+13
+-829.407026995335
+23
+-554.192057578438
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1038.25578712258
+30
+2035.20217666346
+11
+288.287531523413
+21
+-1033.5656801692
+31
+1987.58272162968
+12
+653.750224578544
+22
+-1033.56568016919
+32
+1987.58272162967
+13
+653.750224578544
+23
+-1033.56568016919
+33
+1987.58272162967
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+288.287531523413
+20
+-1033.5656801692
+30
+1987.58272162968
+11
+653.750224578544
+21
+-1038.25578712258
+31
+2035.20217666346
+12
+287.457754814725
+22
+-1035.93043920361
+32
+2011.5925230317
+13
+287.457754814725
+23
+-1035.93043920361
+33
+2011.5925230317
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+287.457754814725
+20
+-1035.93043920361
+30
+2011.5925230317
+11
+653.750224578544
+21
+-1038.25578712258
+31
+2035.20217666346
+12
+279.792110043812
+22
+-1038.25578712258
+32
+2035.20217666346
+13
+279.792110043812
+23
+-1038.25578712258
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+831.221151351825
+20
+-165.340167031437
+30
+796.153149972084
+11
+849.217148276931
+21
+1.80477854883065e-13
+31
+855.37186879426
+12
+832.899678896021
+22
+-165.674046918965
+32
+855.37186879426
+13
+832.899678896021
+23
+-165.674046918965
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+849.217148276931
+20
+1.80477854883065e-13
+30
+855.37186879426
+11
+831.221151351825
+21
+-165.340167031437
+31
+796.153149972084
+12
+847.505736434059
+22
+1.80477854883065e-13
+32
+796.153149972084
+13
+847.505736434059
+23
+1.80477854883065e-13
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+475.358481968201
+20
+-929.775248028225
+30
+1832.24936277796
+11
+653.750224578544
+21
+-966.763694030251
+31
+1862.60499591753
+12
+422.745208264425
+22
+-966.763694030251
+32
+1862.60499591753
+13
+422.745208264425
+23
+-966.763694030251
+33
+1862.60499591753
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-966.763694030251
+30
+1862.60499591753
+11
+475.358481968201
+21
+-929.775248028225
+31
+1832.24936277796
+12
+653.750224578544
+22
+-929.775248028225
+32
+1832.24936277796
+13
+653.750224578544
+23
+-929.775248028225
+33
+1832.24936277796
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1038.25578712258
+30
+2035.20217666346
+11
+287.457769982496
+21
+-1035.93043460251
+31
+2058.8118770109
+12
+279.792110043812
+22
+-1038.25578712258
+32
+2035.20217666346
+13
+279.792110043812
+23
+-1038.25578712258
+33
+2035.20217666346
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+287.457769982496
+20
+-1035.93043460251
+30
+2058.8118770109
+11
+653.750224578544
+21
+-1038.25578712258
+31
+2035.20217666346
+12
+653.750224578544
+22
+-1033.56568016919
+32
+2082.82163169725
+13
+653.750224578544
+23
+-1033.56568016919
+33
+2082.82163169725
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+287.457769982496
+20
+-1035.93043460251
+30
+2058.8118770109
+11
+653.750224578544
+21
+-1033.56568016919
+31
+2082.82163169725
+12
+288.287545076695
+22
+-1033.5656801692
+32
+2082.82163169725
+13
+288.287545076695
+23
+-1033.5656801692
+33
+2082.82163169725
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-917.447181233325
+30
+2219.70473474119
+11
+180.675224578544
+21
+-951.073041235166
+31
+2192.10870461431
+12
+180.675224578544
+22
+-917.447181233325
+32
+2219.70473474119
+13
+180.675224578544
+23
+-917.447181233325
+33
+2219.70473474119
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-951.073041235166
+30
+2192.10870461431
+11
+653.750224578544
+21
+-917.447181233325
+31
+2219.70473474119
+12
+653.750224578544
+22
+-951.073041235167
+32
+2192.10870461431
+13
+653.750224578544
+23
+-951.073041235167
+33
+2192.10870461431
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+286.037069662455
+20
+-690.554572920556
+30
+1427.8983600213
+11
+164.047987682633
+21
+-824.724927080674
+31
+1241.03564002131
+12
+321.791703197793
+22
+-776.873894119249
+32
+1241.03564002131
+13
+321.791703197793
+23
+-776.873894119249
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+1241.03564002131
+11
+286.037069662455
+21
+-690.554572920556
+31
+1427.8983600213
+12
+145.820433573828
+22
+-733.088824464618
+32
+1427.8983600213
+13
+145.820433573828
+23
+-733.088824464618
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+840.882243605455
+20
+1.80477854883065e-13
+30
+1241.03564002131
+11
+733.088824464618
+21
+-145.820433573828
+31
+1427.8983600213
+12
+824.724927080674
+22
+-164.047987682633
+32
+1241.03564002131
+13
+824.724927080674
+23
+-164.047987682633
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+733.088824464618
+20
+-145.820433573828
+30
+1427.8983600213
+11
+840.882243605455
+21
+1.80477854883065e-13
+31
+1241.03564002131
+12
+747.450883605455
+22
+1.80477854883065e-13
+32
+1427.8983600213
+13
+747.450883605455
+23
+1.80477854883065e-13
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+752.435044439405
+20
+-311.668800211604
+30
+682.822310520627
+11
+819.73776511114
+21
+-163.055979488767
+31
+738.078199114136
+12
+772.176090266528
+22
+-319.845809128627
+32
+738.078199114136
+13
+772.176090266528
+23
+-319.845809128627
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+819.73776511114
+20
+-163.055979488767
+30
+738.078199114136
+11
+752.435044439405
+21
+-311.668800211604
+31
+682.822310520627
+12
+798.780782641381
+22
+-158.887376492573
+32
+682.822310520627
+13
+798.780782641381
+23
+-158.887376492573
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-849.217148276931
+20
+3.60955709766131e-13
+30
+855.37186879426
+11
+-831.221151351825
+21
+-165.340167031437
+31
+796.153149972084
+12
+-832.899678896021
+22
+-165.674046918964
+32
+855.37186879426
+13
+-832.899678896021
+23
+-165.674046918964
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-831.221151351825
+20
+-165.340167031437
+30
+796.153149972084
+11
+-849.217148276931
+21
+3.60955709766131e-13
+31
+855.37186879426
+12
+-847.505736434059
+22
+1.80477854883065e-13
+32
+796.153149972084
+13
+-847.505736434059
+23
+1.80477854883065e-13
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+1922.19277204157
+11
+1.80477854883065e-13
+21
+-1043.98454271904
+31
+1812.39759571907
+12
+203.671280618918
+22
+-1023.92467246733
+32
+1812.39759571907
+13
+203.671280618918
+23
+-1023.92467246733
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1043.98454271904
+30
+1812.39759571907
+11
+209.215453044867
+21
+-1051.79710945546
+31
+1922.19277204157
+12
+1.80477854883065e-13
+22
+-1072.40303302985
+32
+1922.19277204157
+13
+1.80477854883065e-13
+23
+-1072.40303302985
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-917.447181233325
+30
+1850.69961858573
+11
+180.675224578544
+21
+-879.083714298798
+31
+1830.19391829555
+12
+180.675224578544
+22
+-917.447181233325
+32
+1850.69961858573
+13
+180.675224578544
+23
+-917.447181233325
+33
+1850.69961858573
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-879.083714298798
+30
+1830.19391829555
+11
+653.750224578544
+21
+-917.447181233325
+31
+1850.69961858573
+12
+653.750224578544
+22
+-879.083714298799
+32
+1830.19391829555
+13
+653.750224578544
+23
+-879.083714298799
+33
+1830.19391829555
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+2549.0746800213
+11
+321.791703197793
+21
+-776.87389411925
+31
+2455.6433200213
+12
+467.169144021928
+22
+-699.168033082722
+32
+2455.6433200213
+13
+467.169144021928
+23
+-699.168033082722
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+2455.6433200213
+11
+467.169144021928
+21
+-699.168033082722
+31
+2549.0746800213
+12
+321.791703197793
+22
+-776.87389411925
+32
+2549.0746800213
+13
+321.791703197793
+23
+-776.87389411925
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+2549.0746800213
+11
+467.169144021928
+21
+-699.168033082722
+31
+2549.0746800213
+12
+443.635403824213
+22
+-711.747079288974
+32
+2549.0746800213
+13
+443.635403824213
+23
+-711.747079288974
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+2549.0746800213
+11
+443.635403824213
+21
+-711.747079288974
+31
+2549.0746800213
+12
+368.760184385968
+22
+-751.768717885475
+32
+2549.0746800213
+13
+368.760184385968
+23
+-751.768717885475
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1079.96854760957
+20
+1.80477854883065e-13
+30
+2011.5925230317
+11
+1059.21725479392
+21
+-210.691411720441
+31
+2058.8118770109
+12
+1059.21725479392
+22
+-210.691411720441
+32
+2011.5925230317
+13
+1059.21725479392
+23
+-210.691411720441
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1059.21725479392
+20
+-210.691411720441
+30
+2058.8118770109
+11
+1079.96854760957
+21
+1.80477854883065e-13
+31
+2011.5925230317
+12
+1079.96854760957
+22
+1.80477854883065e-13
+32
+2058.8118770109
+13
+1079.96854760957
+23
+1.80477854883065e-13
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+705.352696568272
+20
+-705.352696568272
+30
+1708.93950189862
+11
+642.325276783758
+21
+-675.725844017062
+31
+1614.7610800213
+12
+660.670394770277
+22
+-660.670394770277
+32
+1614.7610800213
+13
+660.670394770277
+23
+-660.670394770277
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+642.325276783758
+20
+-675.725844017062
+30
+1614.7610800213
+11
+705.352696568272
+21
+-705.352696568272
+31
+1708.93950189862
+12
+569.38577628374
+22
+-735.585745091064
+32
+1614.7610800213
+13
+569.38577628374
+23
+-735.585745091064
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+569.38577628374
+20
+-735.585745091064
+30
+1614.7610800213
+11
+554.192057578438
+21
+-829.407026995336
+31
+1708.93950189862
+12
+519.085398326623
+22
+-776.866198451135
+32
+1614.7610800213
+13
+519.085398326623
+23
+-776.866198451135
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.192057578438
+20
+-829.407026995336
+30
+1708.93950189862
+11
+569.38577628374
+21
+-735.585745091064
+31
+1614.7610800213
+12
+705.352696568272
+22
+-705.352696568272
+32
+1708.93950189862
+13
+705.352696568272
+23
+-705.352696568272
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.20854961057
+20
+-738.20854961057
+30
+1812.39759571907
+11
+554.192057578438
+21
+-829.407026995336
+31
+1708.93950189862
+12
+705.352696568272
+22
+-705.352696568272
+32
+1708.93950189862
+13
+705.352696568272
+23
+-705.352696568272
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.192057578438
+20
+-829.407026995336
+30
+1708.93950189862
+11
+738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+653.750224578543
+22
+-795.278099285779
+32
+1791.22238449044
+13
+653.750224578543
+23
+-795.278099285779
+33
+1791.22238449044
+70
+15
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578543
+20
+-795.278099285779
+30
+1791.22238449044
+11
+738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+653.750224578544
+22
+-807.521705673267
+32
+1812.39759571907
+13
+653.750224578544
+23
+-807.521705673267
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.192057578438
+20
+-829.407026995336
+30
+1708.93950189862
+11
+600.307476319437
+21
+-841.785968318108
+31
+1795.80300977859
+12
+577.57828073944
+22
+-864.406983345072
+32
+1802.66501966685
+13
+577.57828073944
+23
+-864.406983345072
+33
+1802.66501966685
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+600.307476319437
+20
+-841.785968318108
+30
+1795.80300977859
+11
+554.192057578438
+21
+-829.407026995336
+31
+1708.93950189862
+12
+653.750224578543
+22
+-795.278099285779
+32
+1791.22238449044
+13
+653.750224578543
+23
+-795.278099285779
+33
+1791.22238449044
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+554.385481313987
+20
+-554.385481313987
+30
+631.979456702016
+11
+677.173649450057
+21
+-452.47296672438
+31
+682.822310520627
+12
+575.888850875701
+22
+-575.888850875701
+32
+682.822310520627
+13
+575.888850875701
+23
+-575.888850875701
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+677.173649450057
+20
+-452.47296672438
+30
+682.822310520627
+11
+554.385481313987
+21
+-554.385481313987
+31
+631.979456702016
+12
+651.888361812631
+22
+-435.577877671407
+32
+631.979456702016
+13
+651.888361812631
+23
+-435.577877671407
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-38.8881027186482
+20
+-1075.973485995
+30
+2009.6437315188
+11
+-43.0469725205787
+21
+-1075.72879087574
+31
+2017.42442965997
+12
+-39.9297534839436
+22
+-1076.03581015323
+32
+2011.5925230317
+13
+-39.9297534839436
+23
+-1076.03581015323
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-43.0469725205787
+20
+-1075.72879087574
+30
+2017.42442965997
+11
+-38.8881027186482
+21
+-1075.973485995
+31
+2009.6437315188
+12
+-38.8881027186488
+22
+-975.669199508814
+32
+2009.6437315188
+13
+-38.8881027186488
+23
+-975.669199508814
+33
+2009.6437315188
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-43.0469725205787
+20
+-1075.72879087574
+30
+2017.42442965997
+11
+-38.8881027186488
+21
+-975.669199508814
+31
+2009.6437315188
+12
+-43.0469725205791
+22
+-975.725342330674
+32
+2017.42442965997
+13
+-43.0469725205791
+23
+-975.725342330674
+33
+2017.42442965997
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-841.785968318108
+30
+2274.60134354834
+11
+653.750224578543
+21
+-795.278127928135
+31
+2279.18196601546
+12
+600.307509232711
+22
+-841.785968318108
+32
+2274.60134354834
+13
+600.307509232711
+23
+-841.785968318108
+33
+2274.60134354834
+70
+0
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-978.669071362051
+30
+1911.92150871446
+11
+653.750224578544
+21
+-951.073041235167
+31
+1878.29564871262
+12
+180.675224578544
+22
+-951.073041235166
+32
+1878.29564871262
+13
+180.675224578544
+23
+-951.073041235166
+33
+1878.29564871262
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-951.073041235167
+30
+1878.29564871262
+11
+180.675224578544
+21
+-978.669071362051
+31
+1911.92150871446
+12
+653.750224578544
+22
+-978.669071362052
+32
+1911.92150871446
+13
+653.750224578544
+23
+-978.669071362052
+33
+1911.92150871446
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-997.519349743284
+30
+2361.46489814399
+11
+-203.671280618918
+21
+-1023.92467246733
+31
+2258.00680432354
+12
+1.80477854883065e-13
+22
+-1043.98454271904
+32
+2258.00680432354
+13
+1.80477854883065e-13
+23
+-1043.98454271904
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-203.671280618918
+20
+-1023.92467246733
+30
+2258.00680432354
+11
+1.80477854883065e-13
+21
+-997.519349743284
+31
+2361.46489814399
+12
+-194.606371158736
+22
+-978.352295145615
+32
+2361.46489814399
+13
+-194.606371158736
+23
+-978.352295145615
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-381.734128610353
+20
+-921.587710511788
+30
+2361.46489814399
+11
+-580.006735667279
+21
+-868.041422984449
+31
+2258.00680432354
+12
+-399.515588143821
+22
+-964.515951276275
+32
+2258.00680432354
+13
+-399.515588143821
+23
+-964.515951276275
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-580.006735667279
+20
+-868.041422984449
+30
+2258.00680432354
+11
+-381.734128610353
+21
+-921.587710511788
+31
+2361.46489814399
+12
+-554.192057578438
+22
+-829.407026995335
+32
+2361.46489814399
+13
+-554.192057578438
+23
+-829.407026995335
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-929.775248028225
+30
+2238.15499054897
+11
+533.995170927003
+21
+-892.63511672065
+31
+2258.00680432354
+12
+475.358507495069
+22
+-929.775248028225
+32
+2238.15499054897
+13
+475.358507495069
+23
+-929.775248028225
+33
+2238.15499054897
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+533.995170927003
+20
+-892.63511672065
+30
+2258.00680432354
+11
+653.750224578544
+21
+-929.775248028225
+31
+2238.15499054897
+12
+540.896920479706
+22
+-887.575434400246
+32
+2260.71126086817
+13
+540.896920479706
+23
+-887.575434400246
+33
+2260.71126086817
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+540.896920479706
+20
+-887.575434400246
+30
+2260.71126086817
+11
+653.750224578544
+21
+-929.775248028225
+31
+2238.15499054897
+12
+653.750224578544
+22
+-887.575434400246
+32
+2260.71126086817
+13
+653.750224578544
+23
+-887.575434400246
+33
+2260.71126086817
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-18.6906684275082
+20
+-1076.56003774335
+30
+1993.0681255669
+11
+-26.4713665686843
+21
+-976.148870417647
+31
+1997.22699536883
+12
+-26.4713665686843
+22
+-1076.14565304285
+32
+1997.22699536883
+13
+-26.4713665686843
+23
+-1076.14565304285
+33
+1997.22699536883
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-26.4713665686843
+20
+-976.148870417647
+30
+1997.22699536883
+11
+-18.6906684275082
+21
+-1076.56003774335
+31
+1993.0681255669
+12
+-18.6906684275082
+22
+-976.666250664317
+32
+1993.0681255669
+13
+-18.6906684275082
+23
+-976.666250664317
+33
+1993.0681255669
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021929
+30
+914.026066884025
+11
+604.235251721863
+21
+-250.282436127116
+31
+1054.1729200213
+12
+543.797359730523
+22
+-363.353779128852
+32
+1054.1729200213
+13
+543.797359730523
+23
+-363.353779128852
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+604.235251721863
+20
+-250.282436127116
+30
+1054.1729200213
+11
+699.168033082722
+21
+-467.169144021929
+31
+914.026066884025
+12
+776.87389411925
+22
+-321.791703197793
+32
+914.026066884025
+13
+776.87389411925
+23
+-321.791703197793
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+35.9517814413364
+20
+-975.958401912124
+30
+2009.6437315188
+11
+30.3548842506176
+21
+-1076.23680115831
+31
+2002.82389255955
+12
+35.9517814413362
+22
+-1076.26268839831
+32
+2009.6437315188
+13
+35.9517814413362
+23
+-1076.26268839831
+33
+2009.6437315188
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+30.3548842506176
+20
+-1076.23680115831
+30
+2002.82389255955
+11
+35.9517814413364
+21
+-975.958401912124
+31
+2009.6437315188
+12
+30.3548842506176
+22
+-976.101409846015
+32
+2002.82389255955
+13
+30.3548842506176
+23
+-976.101409846015
+33
+2002.82389255955
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-45.6079918995532
+20
+-1075.47655248308
+30
+2043.42689578067
+11
+-43.0469725205787
+21
+-975.791818816059
+31
+2051.86944523768
+12
+-43.0469725205787
+22
+-1075.72879087574
+32
+2051.86944523768
+13
+-43.0469725205787
+23
+-1075.72879087574
+33
+2051.86944523768
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-43.0469725205787
+20
+-975.791818816059
+30
+2051.86944523768
+11
+-45.6079918995532
+21
+-1075.47655248308
+31
+2043.42689578067
+12
+-45.6079918995534
+22
+-976.044954856512
+32
+2043.42689578067
+13
+-45.6079918995534
+23
+-976.044954856512
+33
+2043.42689578067
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+843.013713767209
+20
+-637.259985333474
+30
+2192.10870461431
+11
+180.675224578544
+21
+-609.663955206589
+31
+2158.48284461247
+12
+876.866128931272
+22
+-609.663955206588
+32
+2158.48284461247
+13
+876.866128931272
+23
+-609.663955206588
+33
+2158.48284461247
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-609.663955206589
+30
+2158.48284461247
+11
+843.013713767209
+21
+-637.259985333474
+31
+2192.10870461431
+12
+180.675224578544
+22
+-637.259985333474
+32
+2192.10870461431
+13
+180.675224578544
+23
+-637.259985333474
+33
+2192.10870461431
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.192057578438
+20
+-829.407026995335
+30
+1708.93950189862
+11
+-569.385752125536
+21
+-735.58576491719
+31
+1614.7610800213
+12
+-519.085398326623
+22
+-776.866198451135
+32
+1614.7610800213
+13
+-519.085398326623
+23
+-776.866198451135
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-569.385752125536
+20
+-735.58576491719
+30
+1614.7610800213
+11
+-554.192057578438
+21
+-829.407026995335
+31
+1708.93950189862
+12
+-642.32525459148
+22
+-675.725862229795
+32
+1614.7610800213
+13
+-642.32525459148
+23
+-675.725862229795
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-642.32525459148
+20
+-675.725862229795
+30
+1614.7610800213
+11
+-705.352696568271
+21
+-705.352696568271
+31
+1708.93950189862
+12
+-660.670394770277
+22
+-660.670394770277
+32
+1614.7610800213
+13
+-660.670394770277
+23
+-660.670394770277
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.352696568271
+20
+-705.352696568271
+30
+1708.93950189862
+11
+-642.32525459148
+21
+-675.725862229795
+31
+1614.7610800213
+12
+-554.192057578438
+22
+-829.407026995335
+32
+1708.93950189862
+13
+-554.192057578438
+23
+-829.407026995335
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1079.96854760957
+20
+3.60955709766131e-13
+30
+2058.8118770109
+11
+-1059.21725479392
+21
+-210.691411720441
+31
+2011.5925230317
+12
+-1059.21725479392
+22
+-210.691411720441
+32
+2058.8118770109
+13
+-1059.21725479392
+23
+-210.691411720441
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1059.21725479392
+20
+-210.691411720441
+30
+2011.5925230317
+11
+-1079.96854760957
+21
+3.60955709766131e-13
+31
+2058.8118770109
+12
+-1079.96854760957
+22
+3.60955709766131e-13
+32
+2011.5925230317
+13
+-1079.96854760957
+23
+3.60955709766131e-13
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-687.270773156591
+20
+-136.706656519425
+30
+1241.03564002131
+11
+-794.166563605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+-778.906875772646
+22
+-154.93421062823
+32
+1054.1729200213
+13
+-778.906875772646
+23
+-154.93421062823
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-794.166563605455
+20
+1.80477854883065e-13
+30
+1054.1729200213
+11
+-687.270773156591
+21
+-136.706656519425
+31
+1241.03564002131
+12
+-700.735203605455
+22
+1.80477854883065e-13
+32
+1241.03564002131
+13
+-700.735203605455
+23
+1.80477854883065e-13
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578543
+20
+-808.286776169451
+30
+1814.69356131783
+11
+653.750224578544
+21
+-807.521705673267
+31
+1812.39759571907
+12
+670.391132645368
+22
+-794.16651328432
+32
+1813.3028368105
+13
+670.391132645368
+23
+-794.16651328432
+33
+1813.3028368105
+70
+2
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.20854961057
+20
+-738.20854961057
+30
+1812.39759571907
+11
+670.391132645368
+21
+-794.16651328432
+31
+1813.3028368105
+12
+653.750224578544
+22
+-807.521705673267
+32
+1812.39759571907
+13
+653.750224578544
+23
+-807.521705673267
+33
+1812.39759571907
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+670.391132645368
+20
+-794.16651328432
+30
+1813.3028368105
+11
+738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+724.87187698787
+22
+-750.87609961724
+32
+1817.56657040449
+13
+724.87187698787
+23
+-750.87609961724
+33
+1817.56657040449
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.87187698787
+20
+-750.87609961724
+30
+1817.56657040449
+11
+738.20854961057
+21
+-738.20854961057
+31
+1812.39759571907
+12
+739.771122243662
+22
+-739.771122243661
+32
+1820.9352284623
+13
+739.771122243662
+23
+-739.771122243661
+33
+1820.9352284623
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+324.981333125909
+20
+-784.574341950659
+30
+855.37186879426
+11
+165.340167031437
+21
+-831.221151351825
+31
+796.153149972084
+12
+324.326404167689
+22
+-782.993203577332
+32
+796.153149972084
+13
+324.326404167689
+23
+-782.993203577332
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+165.340167031437
+20
+-831.221151351825
+30
+796.153149972084
+11
+324.981333125909
+21
+-784.574341950659
+31
+855.37186879426
+12
+165.674046918965
+22
+-832.899678896021
+32
+855.37186879426
+13
+165.674046918965
+23
+-832.899678896021
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+768.954752250597
+20
+-152.954610178005
+30
+631.979456702016
+11
+814.429823327873
+21
+1.80477854883065e-13
+31
+682.822310520627
+12
+798.780782641381
+22
+-158.887376492573
+32
+682.822310520627
+13
+798.780782641381
+23
+-158.887376492573
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+814.429823327873
+20
+1.80477854883065e-13
+30
+682.822310520627
+11
+768.954752250597
+21
+-152.954610178005
+31
+631.979456702016
+12
+784.019466456977
+22
+1.80477854883065e-13
+32
+631.979456702016
+13
+784.019466456977
+23
+1.80477854883065e-13
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+381.734128610352
+20
+-921.587710511788
+30
+1708.93950189862
+11
+323.520353196241
+21
+-873.530930139225
+31
+1614.7610800213
+12
+357.552241131722
+22
+-863.2074697971
+32
+1614.7610800213
+13
+357.552241131722
+23
+-863.2074697971
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+323.520353196241
+20
+-873.530930139225
+30
+1614.7610800213
+11
+381.734128610352
+21
+-921.587710511788
+31
+1708.93950189862
+12
+233.261898600639
+22
+-900.910533008324
+32
+1614.7610800213
+13
+233.261898600639
+23
+-900.910533008324
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+233.261898600639
+20
+-900.910533008324
+30
+1614.7610800213
+11
+194.606371158736
+21
+-978.352295145615
+31
+1708.93950189862
+12
+182.278551827736
+22
+-916.376162171087
+32
+1614.7610800213
+13
+182.278551827736
+23
+-916.376162171087
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+194.606371158736
+20
+-978.352295145615
+30
+1708.93950189862
+11
+233.261898600639
+21
+-900.910533008324
+31
+1614.7610800213
+12
+381.734128610352
+22
+-921.587710511788
+32
+1708.93950189862
+13
+381.734128610352
+23
+-921.587710511788
+33
+1708.93950189862
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+399.51558814382
+20
+-964.515951276276
+30
+1812.39759571907
+11
+194.606371158736
+21
+-978.352295145615
+31
+1708.93950189862
+12
+381.734128610352
+22
+-921.587710511788
+32
+1708.93950189862
+13
+381.734128610352
+23
+-921.587710511788
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+194.606371158736
+20
+-978.352295145615
+30
+1708.93950189862
+11
+399.51558814382
+21
+-964.515951276276
+31
+1812.39759571907
+12
+203.671280618918
+22
+-1023.92467246733
+32
+1812.39759571907
+13
+203.671280618918
+23
+-1023.92467246733
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-654.019523605455
+20
+1.80477854883065e-13
+30
+1054.1729200213
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1054.1729200213
+12
+-794.166563605455
+22
+1.80477854883065e-13
+32
+1054.1729200213
+13
+-794.166563605455
+23
+1.80477854883065e-13
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-778.906875772646
+20
+-154.93421062823
+30
+1054.1729200213
+11
+-654.019523605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+-733.714233519903
+22
+-303.914386430124
+32
+1054.1729200213
+13
+-733.714233519903
+23
+-303.914386430124
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-733.714233519903
+20
+-303.914386430124
+30
+1054.1729200213
+11
+-654.019523605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+-660.325364744672
+22
+-441.215302798659
+32
+1054.1729200213
+13
+-660.325364744672
+23
+-441.215302798659
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.325364744672
+20
+-441.215302798659
+30
+1054.1729200213
+11
+-654.019523605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+-641.452721848564
+22
+-127.592879465023
+32
+1054.1729200213
+13
+-641.452721848564
+23
+-127.592879465023
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.325364744672
+20
+-441.215302798659
+30
+1054.1729200213
+11
+-641.452721848564
+21
+-127.592879465023
+31
+1054.1729200213
+12
+-561.560562517035
+22
+-561.560562517035
+32
+1054.1729200213
+13
+-561.560562517035
+23
+-561.560562517035
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-561.560562517035
+20
+-561.560562517035
+30
+1054.1729200213
+11
+-641.452721848564
+21
+-127.592879465023
+31
+1054.1729200213
+12
+-604.235251721862
+22
+-250.282436127116
+32
+1054.1729200213
+13
+-604.235251721862
+23
+-250.282436127116
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-561.560562517035
+20
+-561.560562517035
+30
+1054.1729200213
+11
+-604.235251721862
+21
+-250.282436127116
+31
+1054.1729200213
+12
+-543.797359730523
+22
+-363.353779128852
+32
+1054.1729200213
+13
+-543.797359730523
+23
+-363.353779128852
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-561.560562517035
+20
+-561.560562517035
+30
+1054.1729200213
+11
+-543.797359730523
+21
+-363.353779128852
+31
+1054.1729200213
+12
+-441.215302798659
+22
+-660.325364744672
+32
+1054.1729200213
+13
+-441.215302798659
+23
+-660.325364744672
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-441.215302798659
+20
+-660.325364744672
+30
+1054.1729200213
+11
+-543.797359730523
+21
+-363.353779128852
+31
+1054.1729200213
+12
+-462.461640169813
+22
+-462.461640169813
+32
+1054.1729200213
+13
+-462.461640169813
+23
+-462.461640169813
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-441.215302798659
+20
+-660.325364744672
+30
+1054.1729200213
+11
+-462.461640169813
+21
+-462.461640169813
+31
+1054.1729200213
+12
+-363.353779128852
+22
+-543.797359730523
+32
+1054.1729200213
+13
+-363.353779128852
+23
+-543.797359730523
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-441.215302798659
+20
+-660.325364744672
+30
+1054.1729200213
+11
+-363.353779128852
+21
+-543.797359730523
+31
+1054.1729200213
+12
+-303.914386430124
+22
+-733.714233519903
+32
+1054.1729200213
+13
+-303.914386430124
+23
+-733.714233519903
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-303.914386430124
+20
+-733.714233519903
+30
+1054.1729200213
+11
+-363.353779128852
+21
+-543.797359730523
+31
+1054.1729200213
+12
+-250.282436127117
+22
+-604.235251721862
+32
+1054.1729200213
+13
+-250.282436127117
+23
+-604.235251721862
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-303.914386430124
+20
+-733.714233519903
+30
+1054.1729200213
+11
+-250.282436127117
+21
+-604.235251721862
+31
+1054.1729200213
+12
+-154.93421062823
+22
+-778.906875772646
+32
+1054.1729200213
+13
+-154.93421062823
+23
+-778.906875772646
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-154.93421062823
+20
+-778.906875772646
+30
+1054.1729200213
+11
+-250.282436127117
+21
+-604.235251721862
+31
+1054.1729200213
+12
+-127.592879465023
+22
+-641.452721848564
+32
+1054.1729200213
+13
+-127.592879465023
+23
+-641.452721848564
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-154.93421062823
+20
+-778.906875772646
+30
+1054.1729200213
+11
+-127.592879465023
+21
+-641.452721848564
+31
+1054.1729200213
+12
+0.0
+22
+-794.166563605455
+32
+1054.1729200213
+13
+0.0
+23
+-794.166563605455
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-794.166563605455
+30
+1054.1729200213
+11
+-127.592879465023
+21
+-641.452721848564
+31
+1054.1729200213
+12
+0.0
+22
+-654.019523605455
+32
+1054.1729200213
+13
+0.0
+23
+-654.019523605455
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-794.166563605455
+30
+1054.1729200213
+11
+0.0
+21
+-654.019523605455
+31
+1054.1729200213
+12
+127.592879465023
+22
+-641.452721848564
+32
+1054.1729200213
+13
+127.592879465023
+23
+-641.452721848564
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-794.166563605455
+30
+1054.1729200213
+11
+127.592879465023
+21
+-641.452721848564
+31
+1054.1729200213
+12
+154.93421062823
+22
+-778.906875772646
+32
+1054.1729200213
+13
+154.93421062823
+23
+-778.906875772646
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+154.93421062823
+20
+-778.906875772646
+30
+1054.1729200213
+11
+127.592879465023
+21
+-641.452721848564
+31
+1054.1729200213
+12
+250.282436127116
+22
+-604.235251721862
+32
+1054.1729200213
+13
+250.282436127116
+23
+-604.235251721862
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+154.93421062823
+20
+-778.906875772646
+30
+1054.1729200213
+11
+250.282436127116
+21
+-604.235251721862
+31
+1054.1729200213
+12
+303.914386430124
+22
+-733.714233519903
+32
+1054.1729200213
+13
+303.914386430124
+23
+-733.714233519903
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+303.914386430124
+20
+-733.714233519903
+30
+1054.1729200213
+11
+250.282436127116
+21
+-604.235251721862
+31
+1054.1729200213
+12
+363.353779128852
+22
+-543.797359730523
+32
+1054.1729200213
+13
+363.353779128852
+23
+-543.797359730523
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+303.914386430124
+20
+-733.714233519903
+30
+1054.1729200213
+11
+363.353779128852
+21
+-543.797359730523
+31
+1054.1729200213
+12
+441.215302798659
+22
+-660.325364744672
+32
+1054.1729200213
+13
+441.215302798659
+23
+-660.325364744672
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+441.215302798659
+20
+-660.325364744672
+30
+1054.1729200213
+11
+363.353779128852
+21
+-543.797359730523
+31
+1054.1729200213
+12
+462.461640169813
+22
+-462.461640169813
+32
+1054.1729200213
+13
+462.461640169813
+23
+-462.461640169813
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+441.215302798659
+20
+-660.325364744672
+30
+1054.1729200213
+11
+462.461640169813
+21
+-462.461640169813
+31
+1054.1729200213
+12
+561.560562517035
+22
+-561.560562517035
+32
+1054.1729200213
+13
+561.560562517035
+23
+-561.560562517035
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+561.560562517035
+20
+-561.560562517035
+30
+1054.1729200213
+11
+462.461640169813
+21
+-462.461640169813
+31
+1054.1729200213
+12
+543.797359730523
+22
+-363.353779128852
+32
+1054.1729200213
+13
+543.797359730523
+23
+-363.353779128852
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+561.560562517035
+20
+-561.560562517035
+30
+1054.1729200213
+11
+543.797359730523
+21
+-363.353779128852
+31
+1054.1729200213
+12
+604.235251721863
+22
+-250.282436127116
+32
+1054.1729200213
+13
+604.235251721863
+23
+-250.282436127116
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+561.560562517035
+20
+-561.560562517035
+30
+1054.1729200213
+11
+604.235251721863
+21
+-250.282436127116
+31
+1054.1729200213
+12
+660.325364744673
+22
+-441.215302798659
+32
+1054.1729200213
+13
+660.325364744673
+23
+-441.215302798659
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.325364744673
+20
+-441.215302798659
+30
+1054.1729200213
+11
+604.235251721863
+21
+-250.282436127116
+31
+1054.1729200213
+12
+641.452721848564
+22
+-127.592879465023
+32
+1054.1729200213
+13
+641.452721848564
+23
+-127.592879465023
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.325364744673
+20
+-441.215302798659
+30
+1054.1729200213
+11
+641.452721848564
+21
+-127.592879465023
+31
+1054.1729200213
+12
+654.019523605455
+22
+0.0
+32
+1054.1729200213
+13
+654.019523605455
+23
+0.0
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.325364744673
+20
+-441.215302798659
+30
+1054.1729200213
+11
+654.019523605455
+21
+0.0
+31
+1054.1729200213
+12
+794.166563605455
+22
+1.80477854883065e-13
+32
+1054.1729200213
+13
+794.166563605455
+23
+1.80477854883065e-13
+33
+1054.1729200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+660.325364744673
+20
+-441.215302798659
+30
+1054.1729200213
+11
+794.166563605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+733.714233519903
+22
+-303.914386430124
+32
+1054.1729200213
+13
+733.714233519903
+23
+-303.914386430124
+33
+1054.1729200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+733.714233519903
+20
+-303.914386430124
+30
+1054.1729200213
+11
+794.166563605455
+21
+1.80477854883065e-13
+31
+1054.1729200213
+12
+778.906875772646
+22
+-154.93421062823
+32
+1054.1729200213
+13
+778.906875772646
+23
+-154.93421062823
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-934.329032542513
+30
+2455.6433200213
+11
+-194.606371158736
+21
+-978.352295145615
+31
+2361.46489814399
+12
+1.80477854883065e-13
+22
+-997.519349743284
+32
+2361.46489814399
+13
+1.80477854883065e-13
+23
+-997.519349743284
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-194.606371158736
+20
+-978.352295145615
+30
+2361.46489814399
+11
+1.80477854883065e-13
+21
+-934.329032542513
+31
+2455.6433200213
+12
+-182.278551827737
+22
+-916.376162171087
+32
+2455.6433200213
+13
+-182.278551827737
+23
+-916.376162171087
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-182.278551827737
+20
+-916.376162171087
+30
+2455.6433200213
+11
+1.80477854883065e-13
+21
+-934.329032542513
+31
+2455.6433200213
+12
+-47.1482978123039
+22
+-929.685330525077
+32
+2455.6433200213
+13
+-47.1482978123039
+23
+-929.685330525077
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-182.278551827737
+20
+-916.376162171087
+30
+2455.6433200213
+11
+-47.1482978123039
+21
+-929.685330525077
+31
+2455.6433200213
+12
+-141.006393478031
+22
+-920.441114966529
+32
+2455.6433200213
+13
+-141.006393478031
+23
+-920.441114966529
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+843.013713767209
+20
+-637.259985333474
+30
+2192.10870461431
+11
+180.675224578544
+21
+-670.885845335315
+31
+2219.70473474119
+12
+180.675224578544
+22
+-637.259985333474
+32
+2192.10870461431
+13
+180.675224578544
+23
+-637.259985333474
+33
+2192.10870461431
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-670.885845335315
+30
+2219.70473474119
+11
+843.013713767209
+21
+-637.259985333474
+31
+2192.10870461431
+12
+806.222028237971
+22
+-670.885845335315
+32
+2219.70473474119
+13
+806.222028237971
+23
+-670.885845335315
+33
+2219.70473474119
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-635.110018052195
+20
+-545.224061178794
+30
+2549.0746800213
+11
+-594.593536632775
+21
+-594.593536632776
+31
+2455.6433200213
+12
+-594.593536632776
+22
+-594.593536632776
+32
+2549.0746800213
+13
+-594.593536632776
+23
+-594.593536632776
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+2455.6433200213
+11
+-635.110018052195
+21
+-545.224061178794
+31
+2549.0746800213
+12
+-699.168033082722
+22
+-467.169144021928
+32
+2455.6433200213
+13
+-699.168033082722
+23
+-467.169144021928
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+-635.110018052195
+21
+-545.224061178794
+31
+2549.0746800213
+12
+-689.000369065216
+22
+-479.558478474255
+32
+2549.0746800213
+13
+-689.000369065216
+23
+-479.558478474255
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+2455.6433200213
+11
+-689.000369065216
+21
+-479.558478474255
+31
+2549.0746800213
+12
+-699.168033082722
+22
+-467.169144021929
+32
+2549.0746800213
+13
+-699.168033082722
+23
+-467.169144021929
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+863.207469797099
+20
+-357.552241131722
+30
+1614.7610800213
+11
+978.352295145615
+21
+-194.606371158736
+31
+1708.93950189862
+12
+921.587710511789
+22
+-381.734128610352
+32
+1708.93950189862
+13
+921.587710511789
+23
+-381.734128610352
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+978.352295145615
+20
+-194.606371158736
+30
+1708.93950189862
+11
+863.207469797099
+21
+-357.552241131722
+31
+1614.7610800213
+12
+887.227327057414
+22
+-278.369383502706
+32
+1614.7610800213
+13
+887.227327057414
+23
+-278.369383502706
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+978.352295145615
+20
+-194.606371158736
+30
+1708.93950189862
+11
+887.227327057414
+21
+-278.369383502706
+31
+1614.7610800213
+12
+914.651020925795
+22
+-187.965580361484
+32
+1614.7610800213
+13
+914.651020925795
+23
+-187.965580361484
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+978.352295145615
+20
+-194.606371158736
+30
+1708.93950189862
+11
+914.651020925795
+21
+-187.965580361484
+31
+1614.7610800213
+12
+916.376162171087
+22
+-182.278551827737
+32
+1614.7610800213
+13
+916.376162171087
+23
+-182.278551827737
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+158.887376492573
+20
+-798.780782641381
+30
+682.822310520627
+11
+0.0
+21
+-784.019466456977
+31
+631.979456702016
+12
+152.954610178005
+22
+-768.954752250597
+32
+631.979456702016
+13
+152.954610178005
+23
+-768.954752250597
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-784.019466456977
+30
+631.979456702016
+11
+158.887376492573
+21
+-798.780782641381
+31
+682.822310520627
+12
+0.0
+22
+-814.429823327873
+32
+682.822310520627
+13
+0.0
+23
+-814.429823327873
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-580.006735667279
+20
+-868.04142298445
+30
+1812.39759571907
+11
+-705.352696568271
+21
+-705.352696568271
+31
+1708.93950189862
+12
+-554.192057578438
+22
+-829.407026995335
+32
+1708.93950189862
+13
+-554.192057578438
+23
+-829.407026995335
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.352696568271
+20
+-705.352696568271
+30
+1708.93950189862
+11
+-580.006735667279
+21
+-868.04142298445
+31
+1812.39759571907
+12
+-738.20854961057
+22
+-738.20854961057
+32
+1812.39759571907
+13
+-738.20854961057
+23
+-738.20854961057
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-997.760836892423
+20
+-413.286070645571
+30
+2058.8118770109
+11
+-897.961029579872
+21
+-599.99837764929
+31
+2011.5925230317
+12
+-897.961029579872
+22
+-599.99837764929
+32
+2058.8118770109
+13
+-897.961029579872
+23
+-599.99837764929
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-897.961029579872
+20
+-599.99837764929
+30
+2011.5925230317
+11
+-997.760836892423
+21
+-413.286070645571
+31
+2058.8118770109
+12
+-997.760836892423
+22
+-413.286070645571
+32
+2011.5925230317
+13
+-997.760836892423
+23
+-413.286070645571
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-891.670534105406
+20
+-595.795202951324
+30
+2148.21162800104
+11
+-997.760836892423
+21
+-413.286070645571
+31
+2058.8118770109
+12
+-897.961029579872
+22
+-599.99837764929
+32
+2058.8118770109
+13
+-897.961029579872
+23
+-599.99837764929
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-997.760836892423
+20
+-413.286070645571
+30
+2058.8118770109
+11
+-891.670534105406
+21
+-595.795202951324
+31
+2148.21162800104
+12
+-990.771212819307
+22
+-410.390873558597
+32
+2148.21162800104
+13
+-990.771212819307
+23
+-410.390873558597
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021929
+20
+-699.168033082722
+30
+914.026066884025
+11
+-600.487204246519
+21
+-600.487204246519
+31
+855.37186879426
+12
+-471.799768952456
+22
+-706.098253038492
+32
+855.37186879426
+13
+-471.799768952456
+23
+-706.098253038492
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-600.487204246519
+20
+-600.487204246519
+30
+855.37186879426
+11
+-467.169144021929
+21
+-699.168033082722
+31
+914.026066884025
+12
+-594.593536632776
+22
+-594.593536632776
+32
+914.026066884025
+13
+-594.593536632776
+23
+-594.593536632776
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+152.954610178005
+20
+-768.954752250597
+30
+631.979456702016
+11
+0.0
+21
+-745.443557551535
+31
+587.016306884026
+12
+145.428823687577
+22
+-731.120068617964
+32
+587.016306884026
+13
+145.428823687577
+23
+-731.120068617964
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-745.443557551535
+30
+587.016306884026
+11
+152.954610178005
+21
+-768.954752250597
+31
+631.979456702016
+12
+0.0
+22
+-784.019466456977
+32
+631.979456702016
+13
+0.0
+23
+-784.019466456977
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-619.813665790805
+20
+-414.146250971868
+30
+587.016306884026
+11
+-554.385481313987
+21
+-554.385481313987
+31
+631.979456702016
+12
+-651.888361812631
+22
+-435.577877671407
+32
+631.979456702016
+13
+-651.888361812631
+23
+-435.577877671407
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.385481313987
+20
+-554.385481313987
+30
+631.979456702016
+11
+-619.813665790805
+21
+-414.146250971868
+31
+587.016306884026
+12
+-527.108194536515
+22
+-527.108194536515
+32
+587.016306884026
+13
+-527.108194536515
+23
+-527.108194536515
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+475.358481968201
+20
+-929.775248028225
+30
+1832.24936277796
+11
+399.51558814382
+21
+-964.515951276276
+31
+1812.39759571907
+12
+533.995007415167
+22
+-892.635204119545
+32
+1812.39759571907
+13
+533.995007415167
+23
+-892.635204119545
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+399.51558814382
+20
+-964.515951276276
+30
+1812.39759571907
+11
+475.358481968201
+21
+-929.775248028225
+31
+1832.24936277796
+12
+422.745208264425
+22
+-966.763694030251
+32
+1862.60499591753
+13
+422.745208264425
+23
+-966.763694030251
+33
+1862.60499591753
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+399.51558814382
+20
+-964.515951276276
+30
+1812.39759571907
+11
+422.745208264425
+21
+-966.763694030251
+31
+1862.60499591753
+12
+406.150722558891
+22
+-980.534582769308
+32
+1879.38487239655
+13
+406.150722558891
+23
+-980.534582769308
+33
+1879.38487239655
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-519.085398326623
+20
+-776.866198451135
+30
+2455.6433200213
+11
+-705.352696568271
+21
+-705.352696568271
+31
+2361.46489814399
+12
+-554.192057578438
+22
+-829.407026995335
+32
+2361.46489814399
+13
+-554.192057578438
+23
+-829.407026995335
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.352696568271
+20
+-705.352696568271
+30
+2361.46489814399
+11
+-519.085398326623
+21
+-776.866198451135
+31
+2455.6433200213
+12
+-660.670394770277
+22
+-660.670394770277
+32
+2455.6433200213
+13
+-660.670394770277
+23
+-660.670394770277
+33
+2455.6433200213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.670394770277
+20
+-660.670394770277
+30
+2455.6433200213
+11
+-519.085398326623
+21
+-776.866198451135
+31
+2455.6433200213
+12
+-569.385750357394
+22
+-735.585766368266
+32
+2455.6433200213
+13
+-569.385750357394
+23
+-735.585766368266
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.670394770277
+20
+-660.670394770277
+30
+2455.6433200213
+11
+-569.385750357394
+21
+-735.585766368266
+31
+2455.6433200213
+12
+-642.325255137832
+22
+-675.725861781415
+32
+2455.6433200213
+13
+-642.325255137832
+23
+-675.725861781415
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+324.326404167689
+20
+-782.993203577332
+30
+796.153149972084
+11
+163.055979488767
+21
+-819.73776511114
+31
+738.078199114136
+12
+319.845809128627
+22
+-772.176090266528
+32
+738.078199114136
+13
+319.845809128627
+23
+-772.176090266528
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+163.055979488767
+20
+-819.73776511114
+30
+738.078199114136
+11
+324.326404167689
+21
+-782.993203577332
+31
+796.153149972084
+12
+165.340167031437
+22
+-831.221151351825
+32
+796.153149972084
+13
+165.340167031437
+23
+-831.221151351825
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+824.724927080674
+20
+-164.047987682633
+30
+2455.6433200213
+11
+832.543812136584
+21
+-84.6615154688545
+31
+2549.0746800213
+12
+824.724927080674
+22
+-164.047987682633
+32
+2549.0746800213
+13
+824.724927080674
+23
+-164.047987682633
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+832.543812136584
+20
+-84.6615154688545
+30
+2549.0746800213
+11
+824.724927080674
+21
+-164.047987682633
+31
+2455.6433200213
+12
+840.882243605455
+22
+1.80477854883065e-13
+32
+2455.6433200213
+13
+840.882243605455
+23
+1.80477854883065e-13
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+832.543812136584
+20
+-84.6615154688545
+30
+2549.0746800213
+11
+840.882243605455
+21
+1.80477854883065e-13
+31
+2455.6433200213
+12
+840.882243605455
+22
+1.80477854883065e-13
+32
+2549.0746800213
+13
+840.882243605455
+23
+1.80477854883065e-13
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1043.98454271904
+20
+3.60955709766131e-13
+30
+1812.39759571907
+11
+-978.352295145615
+21
+-194.606371158736
+31
+1708.93950189862
+12
+-1023.92467246733
+22
+-203.671280618918
+32
+1812.39759571907
+13
+-1023.92467246733
+23
+-203.671280618918
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-978.352295145615
+20
+-194.606371158736
+30
+1708.93950189862
+11
+-1043.98454271904
+21
+3.60955709766131e-13
+31
+1812.39759571907
+12
+-997.519349743285
+22
+3.60955709766131e-13
+32
+1708.93950189862
+13
+-997.519349743285
+23
+3.60955709766131e-13
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-527.108194536515
+20
+-527.108194536515
+30
+587.016306884026
+11
+-435.577877671407
+21
+-651.888361812631
+31
+631.979456702016
+12
+-554.385481313987
+22
+-554.385481313987
+32
+631.979456702016
+13
+-554.385481313987
+23
+-554.385481313987
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-435.577877671407
+20
+-651.888361812631
+30
+631.979456702016
+11
+-527.108194536515
+21
+-527.108194536515
+31
+587.016306884026
+12
+-414.146250971868
+22
+-619.813665790805
+32
+587.016306884026
+13
+-414.146250971868
+23
+-619.813665790805
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-452.472966724379
+20
+-677.173649450057
+30
+682.822310520627
+11
+-554.385481313987
+21
+-554.385481313987
+31
+631.979456702016
+12
+-435.577877671407
+22
+-651.888361812631
+32
+631.979456702016
+13
+-435.577877671407
+23
+-651.888361812631
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.385481313987
+20
+-554.385481313987
+30
+631.979456702016
+11
+-452.472966724379
+21
+-677.173649450057
+31
+682.822310520627
+12
+-575.888850875701
+22
+-575.888850875701
+32
+682.822310520627
+13
+-575.888850875701
+23
+-575.888850875701
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+997.760836892423
+20
+-413.286070645571
+30
+2011.5925230317
+11
+912.783669278017
+21
+-572.267169258698
+31
+2035.20224467364
+12
+911.540741979581
+22
+-574.59252267949
+32
+2011.5925230317
+13
+911.540741979581
+23
+-574.59252267949
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+912.783669278017
+20
+-572.267169258698
+30
+2035.20224467364
+11
+997.760836892423
+21
+-413.286070645571
+31
+2058.8118770109
+12
+911.54074094115
+22
+-574.592524622259
+32
+2058.8118770109
+13
+911.54074094115
+23
+-574.592524622259
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+997.760836892423
+20
+-413.286070645571
+30
+2058.8118770109
+11
+912.783669278017
+21
+-572.267169258698
+31
+2035.20224467364
+12
+997.760836892423
+22
+-413.286070645571
+32
+2011.5925230317
+13
+997.760836892423
+23
+-413.286070645571
+33
+2011.5925230317
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+203.671280618918
+20
+-1023.92467246733
+30
+1812.39759571907
+11
+1.80477854883065e-13
+21
+-997.519349743284
+31
+1708.93950189862
+12
+194.606371158736
+22
+-978.352295145615
+32
+1708.93950189862
+13
+194.606371158736
+23
+-978.352295145615
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-997.519349743284
+30
+1708.93950189862
+11
+203.671280618918
+21
+-1023.92467246733
+31
+1812.39759571907
+12
+1.80477854883065e-13
+22
+-1043.98454271904
+32
+1812.39759571907
+13
+1.80477854883065e-13
+23
+-1043.98454271904
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+209.215453044867
+20
+-1051.79710945546
+30
+2148.21162800104
+11
+36.3998441498995
+21
+-1076.38347587727
+31
+2058.8118770109
+12
+210.691411720441
+22
+-1059.21725479392
+32
+2058.8118770109
+13
+210.691411720441
+23
+-1059.21725479392
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+36.3998441498995
+20
+-1076.38347587727
+30
+2058.8118770109
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+35.9517814413365
+22
+-1076.35666734212
+32
+2059.65014337885
+13
+35.9517814413365
+23
+-1076.35666734212
+33
+2059.65014337885
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+35.9517814413365
+20
+-1076.35666734212
+30
+2059.65014337885
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+30.354884250617
+22
+-1076.33078010212
+32
+2066.4699823381
+13
+30.354884250617
+23
+-1076.33078010212
+33
+2066.4699823381
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+30.354884250617
+20
+-1076.33078010212
+30
+2066.4699823381
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+23.5350452913723
+22
+-1076.52883438997
+32
+2072.06687952882
+13
+23.5350452913723
+23
+-1076.52883438997
+33
+2072.06687952882
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+23.5350452913723
+20
+-1076.52883438997
+30
+2072.06687952882
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+15.754347150196
+22
+-1076.94321909047
+32
+2076.22574933075
+13
+15.754347150196
+23
+-1076.94321909047
+33
+2076.22574933075
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+15.754347150196
+20
+-1076.94321909047
+30
+2076.22574933075
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+7.31179769318775
+22
+-1077.55800963197
+32
+2078.78676870972
+13
+7.31179769318775
+23
+-1077.55800963197
+33
+2078.78676870972
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+7.31179769318775
+20
+-1077.55800963197
+30
+2078.78676870972
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+1.80477854883065e-13
+22
+-1078.21721573187
+32
+2079.50691792559
+13
+1.80477854883065e-13
+23
+-1078.21721573187
+33
+2079.50691792559
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1.80477854883065e-13
+20
+-1078.21721573187
+30
+2079.50691792559
+11
+209.215453044867
+21
+-1051.79710945546
+31
+2148.21162800104
+12
+1.80477854883065e-13
+22
+-1072.40303302985
+32
+2148.21162800104
+13
+1.80477854883065e-13
+23
+-1072.40303302985
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+824.724927080674
+20
+-164.047987682633
+30
+914.026066884025
+11
+654.019523605455
+21
+0.0
+31
+1054.1729200213
+12
+641.452721848564
+22
+-127.592879465023
+32
+1054.1729200213
+13
+641.452721848564
+23
+-127.592879465023
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+654.019523605455
+20
+0.0
+30
+1054.1729200213
+11
+824.724927080674
+21
+-164.047987682633
+31
+914.026066884025
+12
+840.882243605455
+22
+1.80477854883065e-13
+32
+914.026066884025
+13
+840.882243605455
+23
+1.80477854883065e-13
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-879.083714298799
+30
+2240.21043503138
+11
+180.675224578544
+21
+-917.447181233325
+31
+2219.70473474119
+12
+180.675224578544
+22
+-879.083714298798
+32
+2240.21043503138
+13
+180.675224578544
+23
+-879.083714298798
+33
+2240.21043503138
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-917.447181233325
+30
+2219.70473474119
+11
+653.750224578544
+21
+-879.083714298799
+31
+2240.21043503138
+12
+653.750224578544
+22
+-917.447181233325
+32
+2219.70473474119
+13
+653.750224578544
+23
+-917.447181233325
+33
+2219.70473474119
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+145.820433573828
+20
+-733.088824464618
+30
+1427.8983600213
+11
+0.0
+21
+-840.882243605455
+31
+1241.03564002131
+12
+164.047987682633
+22
+-824.724927080674
+32
+1241.03564002131
+13
+164.047987682633
+23
+-824.724927080674
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+1241.03564002131
+11
+145.820433573828
+21
+-733.088824464618
+31
+1427.8983600213
+12
+0.0
+22
+-747.450883605455
+32
+1427.8983600213
+13
+0.0
+23
+-747.450883605455
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.87389411925
+30
+914.026066884025
+11
+-363.353779128852
+21
+-543.797359730523
+31
+1054.1729200213
+12
+-467.169144021929
+22
+-699.168033082722
+32
+914.026066884025
+13
+-467.169144021929
+23
+-699.168033082722
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-363.353779128852
+20
+-543.797359730523
+30
+1054.1729200213
+11
+-321.791703197793
+21
+-776.87389411925
+31
+914.026066884025
+12
+-250.282436127117
+22
+-604.235251721862
+32
+1054.1729200213
+13
+-250.282436127117
+23
+-604.235251721862
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+577.57828073944
+20
+-864.406983345072
+30
+1802.66501966685
+11
+653.750224578544
+21
+-887.575434400246
+31
+1809.69309245876
+12
+540.896876185886
+22
+-887.575434400246
+32
+1809.69309245876
+13
+540.896876185886
+23
+-887.575434400246
+33
+1809.69309245876
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-887.575434400246
+30
+1809.69309245876
+11
+577.57828073944
+21
+-864.406983345072
+31
+1802.66501966685
+12
+600.307476319437
+22
+-841.785968318108
+32
+1795.80300977859
+13
+600.307476319437
+23
+-841.785968318108
+33
+1795.80300977859
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-887.575434400246
+30
+1809.69309245876
+11
+600.307476319437
+21
+-841.785968318108
+31
+1795.80300977859
+12
+653.750224578544
+22
+-841.785968318108
+32
+1795.80300977859
+13
+653.750224578544
+23
+-841.785968318108
+33
+1795.80300977859
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1033.56568016919
+30
+1987.58272162967
+11
+320.792432759964
+21
+-1019.67559748903
+31
+1941.79325554754
+12
+653.750224578544
+22
+-1019.67559748903
+32
+1941.79325554754
+13
+653.750224578544
+23
+-1019.67559748903
+33
+1941.79325554754
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+320.792432759964
+20
+-1019.67559748903
+30
+1941.79325554754
+11
+653.750224578544
+21
+-1033.56568016919
+31
+1987.58272162967
+12
+288.287531523413
+22
+-1033.5656801692
+32
+1987.58272162968
+13
+288.287531523413
+23
+-1033.5656801692
+33
+1987.58272162968
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+136.706656519425
+20
+-687.270773156591
+30
+1241.03564002131
+11
+0.0
+21
+-794.166563605455
+31
+1054.1729200213
+12
+154.93421062823
+22
+-778.906875772646
+32
+1054.1729200213
+13
+154.93421062823
+23
+-778.906875772646
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-794.166563605455
+30
+1054.1729200213
+11
+136.706656519425
+21
+-687.270773156591
+31
+1241.03564002131
+12
+0.0
+22
+-700.735203605455
+32
+1241.03564002131
+13
+0.0
+23
+-700.735203605455
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-599.99837764929
+20
+-897.961029579872
+30
+2058.8118770109
+11
+-644.006839982028
+21
+-861.844217926399
+31
+2011.59252303171
+12
+-599.99837764929
+22
+-897.961029579872
+32
+2011.5925230317
+13
+-599.99837764929
+23
+-897.961029579872
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-644.006839982028
+20
+-861.844217926399
+30
+2011.59252303171
+11
+-599.99837764929
+21
+-897.961029579872
+31
+2058.8118770109
+12
+-644.327893757466
+22
+-861.580735902195
+32
+2058.8118770109
+13
+-644.327893757466
+23
+-861.580735902195
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+914.026066884025
+11
+-165.674046918965
+21
+-832.899678896021
+31
+855.37186879426
+12
+1.80477854883065e-13
+22
+-849.217148276931
+32
+855.37186879426
+13
+1.80477854883065e-13
+23
+-849.217148276931
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-165.674046918965
+20
+-832.899678896021
+30
+855.37186879426
+11
+0.0
+21
+-840.882243605455
+31
+914.026066884025
+12
+-164.047987682633
+22
+-824.724927080674
+32
+914.026066884025
+13
+-164.047987682633
+23
+-824.724927080674
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1079.96854760957
+20
+1.80477854883065e-13
+30
+2058.8118770109
+11
+1051.79710945546
+21
+-209.215453044867
+31
+2148.21162800104
+12
+1059.21725479392
+22
+-210.691411720441
+32
+2058.8118770109
+13
+1059.21725479392
+23
+-210.691411720441
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1051.79710945546
+20
+-209.215453044867
+30
+2148.21162800104
+11
+1079.96854760957
+21
+1.80477854883065e-13
+31
+2058.8118770109
+12
+1072.40303302985
+22
+1.80477854883065e-13
+32
+2148.21162800104
+13
+1072.40303302985
+23
+1.80477854883065e-13
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+23.5350452913725
+20
+-976.504549306342
+30
+2072.06687952882
+11
+15.754347150196
+21
+-1076.94321909047
+31
+2076.22574933075
+12
+15.754347150196
+22
+-977.021929553012
+32
+2076.22574933075
+13
+15.754347150196
+23
+-977.021929553012
+33
+2076.22574933075
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+15.754347150196
+20
+-1076.94321909047
+30
+2076.22574933075
+11
+23.5350452913725
+21
+-976.504549306342
+31
+2072.06687952882
+12
+23.5350452913723
+22
+-1076.52883438997
+32
+2072.06687952882
+13
+23.5350452913723
+23
+-1076.52883438997
+33
+2072.06687952882
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021929
+30
+914.026066884025
+11
+-604.235251721862
+21
+-250.282436127116
+31
+1054.1729200213
+12
+-776.87389411925
+22
+-321.791703197793
+32
+914.026066884025
+13
+-776.87389411925
+23
+-321.791703197793
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-604.235251721862
+20
+-250.282436127116
+30
+1054.1729200213
+11
+-699.168033082722
+21
+-467.169144021929
+31
+914.026066884025
+12
+-543.797359730523
+22
+-363.353779128852
+32
+1054.1729200213
+13
+-543.797359730523
+23
+-363.353779128852
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+163.055979488767
+20
+-819.73776511114
+30
+738.078199114136
+11
+0.0
+21
+-814.429823327873
+31
+682.822310520627
+12
+158.887376492573
+22
+-798.780782641381
+32
+682.822310520627
+13
+158.887376492573
+23
+-798.780782641381
+33
+682.822310520627
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-814.429823327873
+30
+682.822310520627
+11
+163.055979488767
+21
+-819.73776511114
+31
+738.078199114136
+12
+1.80477854883065e-13
+22
+-835.797377356766
+32
+738.078199114136
+13
+1.80477854883065e-13
+23
+-835.797377356766
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.87389411925
+20
+-321.791703197793
+30
+914.026066884025
+11
+-832.899678896021
+21
+-165.674046918964
+31
+855.37186879426
+12
+-784.574341950659
+22
+-324.981333125909
+32
+855.37186879426
+13
+-784.574341950659
+23
+-324.981333125909
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-832.899678896021
+20
+-165.674046918964
+30
+855.37186879426
+11
+-776.87389411925
+21
+-321.791703197793
+31
+914.026066884025
+12
+-824.724927080674
+22
+-164.047987682633
+32
+914.026066884025
+13
+-824.724927080674
+23
+-164.047987682633
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.325364744672
+20
+-441.215302798659
+30
+1614.7610800213
+11
+-772.428086079136
+21
+-428.73258747146
+31
+1427.8983600213
+12
+-738.010701420772
+22
+-493.122985245198
+32
+1427.8983600213
+13
+-738.010701420772
+23
+-493.122985245198
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-772.428086079136
+20
+-428.73258747146
+30
+1427.8983600213
+11
+-660.325364744672
+21
+-441.215302798659
+31
+1614.7610800213
+12
+-733.714233519903
+22
+-303.914386430124
+32
+1614.7610800213
+13
+-733.714233519903
+23
+-303.914386430124
+33
+1614.7610800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-772.428086079136
+20
+-428.73258747146
+30
+1427.8983600213
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+-814.713927134819
+22
+-349.621343174435
+32
+1427.8983600213
+13
+-814.713927134819
+23
+-349.621343174435
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-814.713927134819
+20
+-349.621343174435
+30
+1427.8983600213
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+-820.033554718597
+22
+-339.669019965462
+32
+1427.8983600213
+13
+-820.033554718597
+23
+-339.669019965462
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-921.587710511788
+20
+-381.734128610352
+30
+1708.93950189862
+11
+-776.866198451135
+21
+-519.085398326623
+31
+1614.7610800213
+12
+-829.407026995335
+22
+-554.192057578438
+32
+1708.93950189862
+13
+-829.407026995335
+23
+-554.192057578438
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.866198451135
+20
+-519.085398326623
+30
+1614.7610800213
+11
+-921.587710511788
+21
+-381.734128610352
+31
+1708.93950189862
+12
+-813.095615539802
+22
+-451.304926317894
+32
+1614.7610800213
+13
+-813.095615539802
+23
+-451.304926317894
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-813.095615539802
+20
+-451.304926317894
+30
+1614.7610800213
+11
+-921.587710511788
+21
+-381.734128610352
+31
+1708.93950189862
+12
+-857.607798337338
+22
+-368.028489582189
+32
+1614.7610800213
+13
+-857.607798337338
+23
+-368.028489582189
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-857.607798337338
+20
+-368.028489582189
+30
+1614.7610800213
+11
+-921.587710511788
+21
+-381.734128610352
+31
+1708.93950189862
+12
+-863.207469797099
+22
+-357.552241131722
+32
+1614.7610800213
+13
+-863.207469797099
+23
+-357.552241131722
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+824.724927080674
+20
+-164.047987682633
+30
+1241.03564002131
+11
+690.554572920556
+21
+-286.037069662455
+31
+1427.8983600213
+12
+776.87389411925
+22
+-321.791703197793
+32
+1241.03564002131
+13
+776.87389411925
+23
+-321.791703197793
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+690.554572920556
+20
+-286.037069662455
+30
+1427.8983600213
+11
+824.724927080674
+21
+-164.047987682633
+31
+1241.03564002131
+12
+733.088824464618
+22
+-145.820433573828
+32
+1427.8983600213
+13
+733.088824464618
+23
+-145.820433573828
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-700.735203605455
+20
+1.80477854883065e-13
+30
+1241.03564002131
+11
+-824.724927080674
+21
+-164.047987682633
+31
+1241.03564002131
+12
+-840.882243605455
+22
+1.80477854883065e-13
+32
+1241.03564002131
+13
+-840.882243605455
+23
+1.80477854883065e-13
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-824.724927080674
+20
+-164.047987682633
+30
+1241.03564002131
+11
+-700.735203605455
+21
+1.80477854883065e-13
+31
+1241.03564002131
+12
+-776.873894119249
+22
+-321.791703197793
+32
+1241.03564002131
+13
+-776.873894119249
+23
+-321.791703197793
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-776.873894119249
+20
+-321.791703197793
+30
+1241.03564002131
+11
+-700.735203605455
+21
+1.80477854883065e-13
+31
+1241.03564002131
+12
+-699.168033082722
+22
+-467.169144021928
+32
+1241.03564002131
+13
+-699.168033082722
+23
+-467.169144021928
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+1241.03564002131
+11
+-700.735203605455
+21
+1.80477854883065e-13
+31
+1241.03564002131
+12
+-687.270773156591
+22
+-136.706656519425
+32
+1241.03564002131
+13
+-687.270773156591
+23
+-136.706656519425
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021928
+30
+1241.03564002131
+11
+-687.270773156591
+21
+-136.706656519425
+31
+1241.03564002131
+12
+-594.593536632775
+22
+-594.593536632776
+32
+1241.03564002131
+13
+-594.593536632775
+23
+-594.593536632776
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+1241.03564002131
+11
+-687.270773156591
+21
+-136.706656519425
+31
+1241.03564002131
+12
+-647.394912321209
+22
+-268.159752894786
+32
+1241.03564002131
+13
+-647.394912321209
+23
+-268.159752894786
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+1241.03564002131
+11
+-647.394912321209
+21
+-268.159752894786
+31
+1241.03564002131
+12
+-582.640028068573
+22
+-389.307620352121
+32
+1241.03564002131
+13
+-582.640028068573
+23
+-389.307620352121
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+1241.03564002131
+11
+-582.640028068573
+21
+-389.307620352121
+31
+1241.03564002131
+12
+-467.169144021928
+22
+-699.168033082722
+32
+1241.03564002131
+13
+-467.169144021928
+23
+-699.168033082722
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+1241.03564002131
+11
+-582.640028068573
+21
+-389.307620352121
+31
+1241.03564002131
+12
+-495.494614285553
+22
+-495.494614285553
+32
+1241.03564002131
+13
+-495.494614285553
+23
+-495.494614285553
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+1241.03564002131
+11
+-495.494614285553
+21
+-495.494614285553
+31
+1241.03564002131
+12
+-389.307620352121
+22
+-582.640028068573
+32
+1241.03564002131
+13
+-389.307620352121
+23
+-582.640028068573
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021928
+20
+-699.168033082722
+30
+1241.03564002131
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1241.03564002131
+12
+-321.791703197793
+22
+-776.873894119249
+32
+1241.03564002131
+13
+-321.791703197793
+23
+-776.873894119249
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+1241.03564002131
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1241.03564002131
+12
+-268.159752894786
+22
+-647.394912321209
+32
+1241.03564002131
+13
+-268.159752894786
+23
+-647.394912321209
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-321.791703197793
+20
+-776.873894119249
+30
+1241.03564002131
+11
+-268.159752894786
+21
+-647.394912321209
+31
+1241.03564002131
+12
+-164.047987682633
+22
+-824.724927080674
+32
+1241.03564002131
+13
+-164.047987682633
+23
+-824.724927080674
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+1241.03564002131
+11
+-268.159752894786
+21
+-647.394912321209
+31
+1241.03564002131
+12
+-136.706656519425
+22
+-687.270773156591
+32
+1241.03564002131
+13
+-136.706656519425
+23
+-687.270773156591
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-164.047987682633
+20
+-824.724927080674
+30
+1241.03564002131
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1241.03564002131
+12
+0.0
+22
+-840.882243605455
+32
+1241.03564002131
+13
+0.0
+23
+-840.882243605455
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+1241.03564002131
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1241.03564002131
+12
+0.0
+22
+-700.735203605455
+32
+1241.03564002131
+13
+0.0
+23
+-700.735203605455
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+1241.03564002131
+11
+0.0
+21
+-700.735203605455
+31
+1241.03564002131
+12
+136.706656519425
+22
+-687.270773156591
+32
+1241.03564002131
+13
+136.706656519425
+23
+-687.270773156591
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-840.882243605455
+30
+1241.03564002131
+11
+136.706656519425
+21
+-687.270773156591
+31
+1241.03564002131
+12
+164.047987682633
+22
+-824.724927080674
+32
+1241.03564002131
+13
+164.047987682633
+23
+-824.724927080674
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+1241.03564002131
+11
+136.706656519425
+21
+-687.270773156591
+31
+1241.03564002131
+12
+268.159752894785
+22
+-647.394912321209
+32
+1241.03564002131
+13
+268.159752894785
+23
+-647.394912321209
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+1241.03564002131
+11
+268.159752894785
+21
+-647.394912321209
+31
+1241.03564002131
+12
+321.791703197793
+22
+-776.873894119249
+32
+1241.03564002131
+13
+321.791703197793
+23
+-776.873894119249
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.873894119249
+30
+1241.03564002131
+11
+268.159752894785
+21
+-647.394912321209
+31
+1241.03564002131
+12
+389.307620352121
+22
+-582.640028068573
+32
+1241.03564002131
+13
+389.307620352121
+23
+-582.640028068573
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.873894119249
+30
+1241.03564002131
+11
+389.307620352121
+21
+-582.640028068573
+31
+1241.03564002131
+12
+467.169144021928
+22
+-699.168033082722
+32
+1241.03564002131
+13
+467.169144021928
+23
+-699.168033082722
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+1241.03564002131
+11
+389.307620352121
+21
+-582.640028068573
+31
+1241.03564002131
+12
+495.494614285553
+22
+-495.494614285553
+32
+1241.03564002131
+13
+495.494614285553
+23
+-495.494614285553
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+1241.03564002131
+11
+495.494614285553
+21
+-495.494614285553
+31
+1241.03564002131
+12
+594.593536632776
+22
+-594.593536632775
+32
+1241.03564002131
+13
+594.593536632776
+23
+-594.593536632775
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632775
+30
+1241.03564002131
+11
+495.494614285553
+21
+-495.494614285553
+31
+1241.03564002131
+12
+582.640028068573
+22
+-389.307620352121
+32
+1241.03564002131
+13
+582.640028068573
+23
+-389.307620352121
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632775
+30
+1241.03564002131
+11
+582.640028068573
+21
+-389.307620352121
+31
+1241.03564002131
+12
+647.394912321209
+22
+-268.159752894786
+32
+1241.03564002131
+13
+647.394912321209
+23
+-268.159752894786
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632775
+30
+1241.03564002131
+11
+647.394912321209
+21
+-268.159752894786
+31
+1241.03564002131
+12
+699.168033082722
+22
+-467.169144021928
+32
+1241.03564002131
+13
+699.168033082722
+23
+-467.169144021928
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+1241.03564002131
+11
+647.394912321209
+21
+-268.159752894786
+31
+1241.03564002131
+12
+687.270773156591
+22
+-136.706656519426
+32
+1241.03564002131
+13
+687.270773156591
+23
+-136.706656519426
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+1241.03564002131
+11
+687.270773156591
+21
+-136.706656519426
+31
+1241.03564002131
+12
+700.735203605455
+22
+0.0
+32
+1241.03564002131
+13
+700.735203605455
+23
+0.0
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+699.168033082722
+20
+-467.169144021928
+30
+1241.03564002131
+11
+700.735203605455
+21
+0.0
+31
+1241.03564002131
+12
+776.87389411925
+22
+-321.791703197793
+32
+1241.03564002131
+13
+776.87389411925
+23
+-321.791703197793
+33
+1241.03564002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+1241.03564002131
+11
+700.735203605455
+21
+0.0
+31
+1241.03564002131
+12
+840.882243605455
+22
+1.80477854883065e-13
+32
+1241.03564002131
+13
+840.882243605455
+23
+1.80477854883065e-13
+33
+1241.03564002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+1241.03564002131
+11
+840.882243605455
+21
+1.80477854883065e-13
+31
+1241.03564002131
+12
+824.724927080674
+22
+-164.047987682633
+32
+1241.03564002131
+13
+824.724927080674
+23
+-164.047987682633
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+154.93421062823
+20
+-778.906875772646
+30
+1614.7610800213
+11
+133.953889402395
+21
+-874.404617053063
+31
+1427.8983600213
+12
+173.161764737035
+22
+-870.542978388701
+32
+1427.8983600213
+13
+173.161764737035
+23
+-870.542978388701
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+133.953889402395
+20
+-874.404617053063
+30
+1427.8983600213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+44.7901424632535
+22
+-883.186479617682
+32
+1427.8983600213
+13
+44.7901424632535
+23
+-883.186479617682
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+44.7901424632535
+20
+-883.186479617682
+30
+1427.8983600213
+11
+0.0
+21
+-794.166563605455
+31
+1614.7610800213
+12
+1.80477854883065e-13
+22
+-887.597923605455
+32
+1427.8983600213
+13
+1.80477854883065e-13
+23
+-887.597923605455
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+0.0
+20
+-794.166563605455
+30
+1614.7610800213
+11
+44.7901424632535
+21
+-883.186479617682
+31
+1427.8983600213
+12
+154.93421062823
+22
+-778.906875772646
+32
+1614.7610800213
+13
+154.93421062823
+23
+-778.906875772646
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-1019.67559748903
+30
+2128.61109777939
+11
+288.287545076695
+21
+-1033.5656801692
+31
+2082.82163169725
+12
+653.750224578544
+22
+-1033.56568016919
+32
+2082.82163169725
+13
+653.750224578544
+23
+-1033.56568016919
+33
+2082.82163169725
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+288.287545076695
+20
+-1033.5656801692
+30
+2082.82163169725
+11
+653.750224578544
+21
+-1019.67559748903
+31
+2128.61109777939
+12
+320.792446313246
+22
+-1019.67559748903
+32
+2128.61109777939
+13
+320.792446313246
+23
+-1019.67559748903
+33
+2128.61109777939
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-467.169144021929
+20
+-699.168033082722
+30
+2549.0746800213
+11
+-594.593536632775
+21
+-594.593536632776
+31
+2455.6433200213
+12
+-467.169144021928
+22
+-699.168033082722
+32
+2455.6433200213
+13
+-467.169144021928
+23
+-699.168033082722
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632775
+20
+-594.593536632776
+30
+2455.6433200213
+11
+-467.169144021929
+21
+-699.168033082722
+31
+2549.0746800213
+12
+-594.593536632776
+22
+-594.593536632776
+32
+2549.0746800213
+13
+-594.593536632776
+23
+-594.593536632776
+33
+2549.0746800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632776
+20
+-594.593536632776
+30
+2549.0746800213
+11
+-467.169144021929
+21
+-699.168033082722
+31
+2549.0746800213
+12
+-512.438676164039
+22
+-662.016288182956
+32
+2549.0746800213
+13
+-512.438676164039
+23
+-662.016288182956
+33
+2549.0746800213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-594.593536632776
+20
+-594.593536632776
+30
+2549.0746800213
+11
+-512.438676164039
+21
+-662.016288182956
+31
+2549.0746800213
+12
+-578.08321102903
+22
+-608.143210685445
+32
+2549.0746800213
+13
+-578.08321102903
+23
+-608.143210685445
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-699.168033082722
+20
+-467.169144021929
+30
+914.026066884025
+11
+-784.574341950659
+21
+-324.981333125909
+31
+855.37186879426
+12
+-706.098253038492
+22
+-471.799768952456
+32
+855.37186879426
+13
+-706.098253038492
+23
+-471.799768952456
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-784.574341950659
+20
+-324.981333125909
+30
+855.37186879426
+11
+-699.168033082722
+21
+-467.169144021929
+31
+914.026066884025
+12
+-776.87389411925
+22
+-321.791703197793
+32
+914.026066884025
+13
+-776.87389411925
+23
+-321.791703197793
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-997.760836892423
+20
+-413.286070645571
+30
+2011.5925230317
+11
+-891.670534105406
+21
+-595.795202951324
+31
+1922.19277204157
+12
+-897.961029579872
+22
+-599.99837764929
+32
+2011.5925230317
+13
+-897.961029579872
+23
+-599.99837764929
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-891.670534105406
+20
+-595.795202951324
+30
+1922.19277204157
+11
+-997.760836892423
+21
+-413.286070645571
+31
+2011.5925230317
+12
+-990.771212819307
+22
+-410.390873558597
+32
+1922.19277204157
+13
+-990.771212819307
+23
+-410.390873558597
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-990.771212819307
+20
+-410.390873558597
+30
+1922.19277204157
+11
+-868.04142298445
+21
+-580.00673566728
+31
+1812.39759571907
+12
+-891.670534105406
+22
+-595.795202951324
+32
+1922.19277204157
+13
+-891.670534105406
+23
+-595.795202951324
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-868.04142298445
+20
+-580.00673566728
+30
+1812.39759571907
+11
+-990.771212819307
+21
+-410.390873558597
+31
+1922.19277204157
+12
+-964.515951276276
+22
+-399.515588143821
+32
+1812.39759571907
+13
+-964.515951276276
+23
+-399.515588143821
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-964.515951276276
+20
+-399.515588143821
+30
+1812.39759571907
+11
+-829.407026995335
+21
+-554.192057578438
+31
+1708.93950189862
+12
+-868.04142298445
+22
+-580.00673566728
+32
+1812.39759571907
+13
+-868.04142298445
+23
+-580.00673566728
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-829.407026995335
+20
+-554.192057578438
+30
+1708.93950189862
+11
+-964.515951276276
+21
+-399.515588143821
+31
+1812.39759571907
+12
+-921.587710511788
+22
+-381.734128610352
+32
+1708.93950189862
+13
+-921.587710511788
+23
+-381.734128610352
+33
+1708.93950189862
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.149821895316
+20
+-761.14982219046
+30
+2100.64485501639
+11
+-786.92474167715
+21
+-735.296194513125
+31
+2058.80750841657
+12
+-763.653083482914
+22
+-763.653083482914
+32
+2058.8118770109
+13
+-763.653083482914
+23
+-763.653083482914
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-786.92474167715
+20
+-735.296194513125
+30
+2058.80750841657
+11
+-761.149821895316
+21
+-761.14982219046
+31
+2100.64485501639
+12
+-766.822004083969
+22
+-754.694855069672
+32
+2097.20410948883
+13
+-766.822004083969
+23
+-754.694855069672
+33
+2097.20410948883
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-786.92474167715
+20
+-735.296194513125
+30
+2058.80750841657
+11
+-766.822004083969
+21
+-754.694855069672
+31
+2097.20410948883
+12
+-781.183382327347
+22
+-739.911027417745
+32
+2076.74494872451
+13
+-781.183382327347
+23
+-739.911027417745
+33
+2076.74494872451
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+887.597923605455
+20
+1.80477854883065e-13
+30
+1427.8983600213
+11
+778.906875772646
+21
+-154.93421062823
+31
+1614.7610800213
+12
+870.542978388702
+22
+-173.161764737035
+32
+1427.8983600213
+13
+870.542978388702
+23
+-173.161764737035
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+778.906875772646
+20
+-154.93421062823
+30
+1614.7610800213
+11
+887.597923605455
+21
+1.80477854883065e-13
+31
+1427.8983600213
+12
+794.166563605455
+22
+1.80477854883065e-13
+32
+1614.7610800213
+13
+794.166563605455
+23
+1.80477854883065e-13
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-964.515951276275
+20
+-399.515588143821
+30
+2258.00680432354
+11
+-1051.79710945546
+21
+-209.215453044867
+31
+2148.21162800104
+12
+-990.771212819307
+22
+-410.390873558597
+32
+2148.21162800104
+13
+-990.771212819307
+23
+-410.390873558597
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-1051.79710945546
+20
+-209.215453044867
+30
+2148.21162800104
+11
+-964.515951276275
+21
+-399.515588143821
+31
+2258.00680432354
+12
+-1023.92467246733
+22
+-203.671280618918
+32
+2258.00680432354
+13
+-1023.92467246733
+23
+-203.671280618918
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+467.169144021928
+20
+-699.168033082722
+30
+914.026066884025
+11
+324.981333125909
+21
+-784.574341950659
+31
+855.37186879426
+12
+471.799768952456
+22
+-706.098253038493
+32
+855.37186879426
+13
+471.799768952456
+23
+-706.098253038493
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+324.981333125909
+20
+-784.574341950659
+30
+855.37186879426
+11
+467.169144021928
+21
+-699.168033082722
+31
+914.026066884025
+12
+321.791703197793
+22
+-776.87389411925
+32
+914.026066884025
+13
+321.791703197793
+23
+-776.87389411925
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+914.026066884025
+11
+363.353779128852
+21
+-543.797359730523
+31
+1054.1729200213
+12
+250.282436127116
+22
+-604.235251721862
+32
+1054.1729200213
+13
+250.282436127116
+23
+-604.235251721862
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+363.353779128852
+20
+-543.797359730523
+30
+1054.1729200213
+11
+321.791703197793
+21
+-776.87389411925
+31
+914.026066884025
+12
+467.169144021928
+22
+-699.168033082722
+32
+914.026066884025
+13
+467.169144021928
+23
+-699.168033082722
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+964.515951276275
+20
+-399.515588143821
+30
+1812.39759571907
+11
+1051.79710945546
+21
+-209.215453044867
+31
+1922.19277204157
+12
+990.771212819308
+22
+-410.390873558597
+32
+1922.19277204157
+13
+990.771212819308
+23
+-410.390873558597
+33
+1922.19277204157
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1051.79710945546
+20
+-209.215453044867
+30
+1922.19277204157
+11
+964.515951276275
+21
+-399.515588143821
+31
+1812.39759571907
+12
+1023.92467246733
+22
+-203.671280618918
+32
+1812.39759571907
+13
+1023.92467246733
+23
+-203.671280618918
+33
+1812.39759571907
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+1043.98454271904
+20
+1.80477854883065e-13
+30
+2258.00680432354
+11
+978.352295145615
+21
+-194.606371158736
+31
+2361.46489814399
+12
+1023.92467246733
+22
+-203.671280618918
+32
+2258.00680432354
+13
+1023.92467246733
+23
+-203.671280618918
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+978.352295145615
+20
+-194.606371158736
+30
+2361.46489814399
+11
+1043.98454271904
+21
+1.80477854883065e-13
+31
+2258.00680432354
+12
+997.519349743285
+22
+1.80477854883065e-13
+32
+2361.46489814399
+13
+997.519349743285
+23
+1.80477854883065e-13
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+767.904956185432
+20
+-709.249312269841
+30
+2240.21043503138
+11
+738.20854961057
+21
+-738.208549610569
+31
+2258.00680432354
+12
+739.771130343929
+22
+-739.771130343928
+32
+2249.46912732182
+13
+739.771130343929
+23
+-739.771130343928
+33
+2249.46912732182
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+738.20854961057
+20
+-738.208549610569
+30
+2258.00680432354
+11
+767.904956185432
+21
+-709.249312269841
+31
+2240.21043503138
+12
+868.04142298445
+22
+-580.006735667279
+32
+2258.00680432354
+13
+868.04142298445
+23
+-580.006735667279
+33
+2258.00680432354
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+2258.00680432354
+11
+767.904956185432
+21
+-709.249312269841
+31
+2240.21043503138
+12
+806.222028237971
+22
+-670.885845335315
+32
+2219.70473474119
+13
+806.222028237971
+23
+-670.885845335315
+33
+2219.70473474119
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+2258.00680432354
+11
+806.222028237971
+21
+-670.885845335315
+31
+2219.70473474119
+12
+843.013713767209
+22
+-637.259985333474
+32
+2192.10870461431
+13
+843.013713767209
+23
+-637.259985333474
+33
+2192.10870461431
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+2258.00680432354
+11
+843.013713767209
+21
+-637.259985333474
+31
+2192.10870461431
+12
+876.866128931272
+22
+-609.663955206588
+32
+2158.48284461247
+13
+876.866128931272
+23
+-609.663955206588
+33
+2158.48284461247
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+2258.00680432354
+11
+876.866128931272
+21
+-609.663955206588
+31
+2158.48284461247
+12
+884.794335210004
+22
+-604.173875548016
+32
+2148.21162800104
+13
+884.794335210004
+23
+-604.173875548016
+33
+2148.21162800104
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+868.04142298445
+20
+-580.006735667279
+30
+2258.00680432354
+11
+884.794335210004
+21
+-604.173875548016
+31
+2148.21162800104
+12
+891.670534105407
+22
+-595.795202951324
+32
+2148.21162800104
+13
+891.670534105407
+23
+-595.795202951324
+33
+2148.21162800104
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-705.352696568271
+20
+-705.352696568271
+30
+2361.46489814399
+11
+-868.041422984449
+21
+-580.006735667279
+31
+2258.00680432354
+12
+-738.208549610569
+22
+-738.20854961057
+32
+2258.00680432354
+13
+-738.208549610569
+23
+-738.20854961057
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-868.041422984449
+20
+-580.006735667279
+30
+2258.00680432354
+11
+-705.352696568271
+21
+-705.352696568271
+31
+2361.46489814399
+12
+-829.407026995335
+22
+-554.192057578438
+32
+2361.46489814399
+13
+-829.407026995335
+23
+-554.192057578438
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+911.540741979581
+20
+-574.59252267949
+30
+2011.5925230317
+11
+180.675224578544
+21
+-576.530907025343
+31
+1991.91176299638
+12
+908.625259608371
+22
+-576.530907025343
+32
+1991.91176299638
+13
+908.625259608371
+23
+-576.530907025343
+33
+1991.91176299638
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-576.530907025343
+30
+1991.91176299638
+11
+911.540741979581
+21
+-574.59252267949
+31
+2011.5925230317
+12
+180.675224578544
+22
+-572.26717343136
+32
+2035.20217666346
+13
+180.675224578544
+23
+-572.26717343136
+33
+2035.20217666346
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-572.26717343136
+30
+2035.20217666346
+11
+911.540741979581
+21
+-574.59252267949
+31
+2011.5925230317
+12
+912.783669278017
+22
+-572.267169258698
+32
+2035.20224467364
+13
+912.783669278017
+23
+-572.267169258698
+33
+2035.20224467364
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-572.26717343136
+30
+2035.20217666346
+11
+912.783669278017
+21
+-572.267169258698
+31
+2035.20224467364
+12
+907.767925107023
+22
+-572.267173431359
+32
+2035.20224673698
+13
+907.767925107023
+23
+-572.267173431359
+33
+2035.20224673698
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+767.904940618653
+20
+-709.249312269841
+30
+1830.19391829555
+11
+180.675224578544
+21
+-670.885845335315
+31
+1850.69961858573
+12
+180.675224578544
+22
+-709.249312269842
+32
+1830.19391829555
+13
+180.675224578544
+23
+-709.249312269842
+33
+1830.19391829555
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-670.885845335315
+30
+1850.69961858573
+11
+767.904940618653
+21
+-709.249312269841
+31
+1830.19391829555
+12
+806.222012671193
+22
+-670.885845335315
+32
+1850.69961858573
+13
+806.222012671193
+23
+-670.885845335315
+33
+1850.69961858573
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+303.914386430124
+20
+-733.714233519903
+30
+1614.7610800213
+11
+307.339228961076
+21
+-829.840689601495
+31
+1427.8983600213
+12
+339.669019965462
+22
+-820.033554718597
+32
+1427.8983600213
+13
+339.669019965462
+23
+-820.033554718597
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+307.339228961076
+20
+-829.840689601495
+30
+1427.8983600213
+11
+303.914386430124
+21
+-733.714233519903
+31
+1614.7610800213
+12
+221.595154594654
+22
+-855.850870199531
+32
+1427.8983600213
+13
+221.595154594654
+23
+-855.850870199531
+33
+1427.8983600213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+221.595154594654
+20
+-855.850870199531
+30
+1427.8983600213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1614.7610800213
+12
+173.161764737035
+22
+-870.542978388701
+32
+1427.8983600213
+13
+173.161764737035
+23
+-870.542978388701
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+154.93421062823
+20
+-778.906875772646
+30
+1614.7610800213
+11
+221.595154594654
+21
+-855.850870199531
+31
+1427.8983600213
+12
+303.914386430124
+22
+-733.714233519903
+32
+1614.7610800213
+13
+303.914386430124
+23
+-733.714233519903
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+40.1106512432667
+20
+-1076.01799327905
+30
+2017.42442965997
+11
+35.9517814413362
+21
+-1076.26268839831
+31
+2009.6437315188
+12
+36.9934322066314
+22
+-1076.32501255654
+32
+2011.5925230317
+13
+36.9934322066314
+23
+-1076.32501255654
+33
+2011.5925230317
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+35.9517814413362
+20
+-1076.26268839831
+30
+2009.6437315188
+11
+40.1106512432667
+21
+-1076.01799327905
+31
+2017.42442965997
+12
+35.9517814413364
+22
+-975.958401912124
+32
+2009.6437315188
+13
+35.9517814413364
+23
+-975.958401912124
+33
+2009.6437315188
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+35.9517814413364
+20
+-975.958401912124
+30
+2009.6437315188
+11
+40.1106512432667
+21
+-1076.01799327905
+31
+2017.42442965997
+12
+40.110651243267
+22
+-976.014544733984
+32
+2017.42442965997
+13
+40.110651243267
+23
+-976.014544733984
+33
+2017.42442965997
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-853.465106968372
+20
+-778.056206654812
+30
+2053.98620958956
+11
+-818.480102290147
+21
+-696.846172894875
+31
+2011.59249120966
+12
+-853.905696349335
+22
+-778.54324309139
+32
+2019.68727261649
+13
+-853.905696349335
+23
+-778.54324309139
+33
+2019.68727261649
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-818.480102290147
+20
+-696.846172894875
+30
+2011.59249120966
+11
+-853.465106968372
+21
+-778.056206654812
+31
+2053.98620958956
+12
+-818.273878310588
+22
+-697.096462294947
+32
+2058.80160712022
+13
+-818.273878310588
+23
+-697.096462294947
+33
+2058.80160712022
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+164.047987682633
+20
+-824.724927080674
+30
+914.026066884025
+11
+250.282436127116
+21
+-604.235251721862
+31
+1054.1729200213
+12
+127.592879465023
+22
+-641.452721848564
+32
+1054.1729200213
+13
+127.592879465023
+23
+-641.452721848564
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+250.282436127116
+20
+-604.235251721862
+30
+1054.1729200213
+11
+164.047987682633
+21
+-824.724927080674
+31
+914.026066884025
+12
+321.791703197793
+22
+-776.87389411925
+32
+914.026066884025
+13
+321.791703197793
+23
+-776.87389411925
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+268.159752894785
+20
+-647.394912321209
+30
+1241.03564002131
+11
+154.93421062823
+21
+-778.906875772646
+31
+1054.1729200213
+12
+303.914386430124
+22
+-733.714233519903
+32
+1054.1729200213
+13
+303.914386430124
+23
+-733.714233519903
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+154.93421062823
+20
+-778.906875772646
+30
+1054.1729200213
+11
+268.159752894785
+21
+-647.394912321209
+31
+1241.03564002131
+12
+136.706656519425
+22
+-687.270773156591
+32
+1241.03564002131
+13
+136.706656519425
+23
+-687.270773156591
+33
+1241.03564002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-784.019466456977
+20
+1.80477854883065e-13
+30
+631.979456702016
+11
+-731.120068617964
+21
+-145.428823687577
+31
+587.016306884026
+12
+-768.954752250597
+22
+-152.954610178005
+32
+631.979456702016
+13
+-768.954752250597
+23
+-152.954610178005
+33
+631.979456702016
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-731.120068617964
+20
+-145.428823687577
+30
+587.016306884026
+11
+-784.019466456977
+21
+1.80477854883065e-13
+31
+631.979456702016
+12
+-745.443557551536
+22
+1.80477854883065e-13
+32
+587.016306884026
+13
+-745.443557551536
+23
+1.80477854883065e-13
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-660.670394770277
+20
+-660.670394770277
+30
+2455.6433200213
+11
+-829.407026995335
+21
+-554.192057578438
+31
+2361.46489814399
+12
+-705.352696568271
+22
+-705.352696568271
+32
+2361.46489814399
+13
+-705.352696568271
+23
+-705.352696568271
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-829.407026995335
+20
+-554.192057578438
+30
+2361.46489814399
+11
+-660.670394770277
+21
+-660.670394770277
+31
+2455.6433200213
+12
+-705.689427437034
+22
+-605.814544747273
+32
+2455.6433200213
+13
+-705.689427437034
+23
+-605.814544747273
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-829.407026995335
+20
+-554.192057578438
+30
+2361.46489814399
+11
+-705.689427437034
+21
+-605.814544747273
+31
+2455.6433200213
+12
+-765.568613945096
+22
+-532.851544877859
+32
+2455.6433200213
+13
+-765.568613945096
+23
+-532.851544877859
+33
+2455.6433200213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-829.407026995335
+20
+-554.192057578438
+30
+2361.46489814399
+11
+-765.568613945096
+21
+-532.851544877859
+31
+2455.6433200213
+12
+-776.866198451135
+22
+-519.085398326623
+32
+2455.6433200213
+13
+-776.866198451135
+23
+-519.085398326623
+33
+2455.6433200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+706.098253038493
+20
+-471.799768952456
+30
+855.37186879426
+11
+594.593536632776
+21
+-594.593536632776
+31
+914.026066884025
+12
+600.487204246519
+22
+-600.48720424652
+32
+855.37186879426
+13
+600.487204246519
+23
+-600.48720424652
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+914.026066884025
+11
+706.098253038493
+21
+-471.799768952456
+31
+855.37186879426
+12
+699.168033082722
+22
+-467.169144021929
+32
+914.026066884025
+13
+699.168033082722
+23
+-467.169144021929
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+321.791703197793
+20
+-776.87389411925
+30
+914.026066884025
+11
+165.674046918965
+21
+-832.899678896021
+31
+855.37186879426
+12
+324.981333125909
+22
+-784.574341950659
+32
+855.37186879426
+13
+324.981333125909
+23
+-784.574341950659
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+165.674046918965
+20
+-832.899678896021
+30
+855.37186879426
+11
+321.791703197793
+21
+-776.87389411925
+31
+914.026066884025
+12
+164.047987682633
+22
+-824.724927080674
+32
+914.026066884025
+13
+164.047987682633
+23
+-824.724927080674
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+670.391132645368
+20
+-794.16651328432
+30
+1813.3028368105
+11
+180.675224578544
+21
+-750.87609961724
+31
+1817.56657040449
+12
+180.675224578544
+22
+-794.16651328432
+32
+1813.3028368105
+13
+180.675224578544
+23
+-794.16651328432
+33
+1813.3028368105
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-750.87609961724
+30
+1817.56657040449
+11
+670.391132645368
+21
+-794.16651328432
+31
+1813.3028368105
+12
+724.87187698787
+22
+-750.87609961724
+32
+1817.56657040449
+13
+724.87187698787
+23
+-750.87609961724
+33
+1817.56657040449
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-978.669071362051
+30
+2158.48284461247
+11
+653.750224578544
+21
+-999.174771652236
+31
+2120.11937767794
+12
+180.675224578544
+22
+-999.174771652236
+32
+2120.11937767794
+13
+180.675224578544
+23
+-999.174771652236
+33
+2120.11937767794
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+653.750224578544
+20
+-999.174771652236
+30
+2120.11937767794
+11
+180.675224578544
+21
+-978.669071362051
+31
+2158.48284461247
+12
+653.750224578544
+22
+-978.669071362051
+32
+2158.48284461247
+13
+653.750224578544
+23
+-978.669071362051
+33
+2158.48284461247
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-707.112261617118
+30
+2017.88600937388
+11
+104.493588061205
+21
+-712.163204861239
+31
+2001.23529816273
+12
+180.675224578544
+22
+-712.163201305221
+32
+2001.23529268221
+13
+180.675224578544
+23
+-712.163201305221
+33
+2001.23529268221
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493588061205
+20
+-712.163204861239
+30
+2001.23529816273
+11
+180.675224578544
+21
+-707.112261617118
+31
+2017.88600937388
+12
+104.493585205719
+22
+-707.112262514746
+32
+2017.88602361794
+13
+104.493585205719
+23
+-707.112262514746
+33
+2017.88602361794
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+561.560562517035
+20
+-561.560562517035
+30
+1614.7610800213
+11
+540.907511486368
+21
+-698.794954204847
+31
+1427.8983600213
+12
+627.626510748516
+22
+-627.626510748516
+32
+1427.8983600213
+13
+627.626510748516
+23
+-627.626510748516
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+540.907511486368
+20
+-698.794954204847
+30
+1427.8983600213
+11
+441.215302798659
+21
+-660.325364744672
+31
+1614.7610800213
+12
+493.122985245198
+22
+-738.010701420772
+32
+1427.8983600213
+13
+493.122985245198
+23
+-738.010701420772
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+441.215302798659
+20
+-660.325364744672
+30
+1614.7610800213
+11
+540.907511486368
+21
+-698.794954204847
+31
+1427.8983600213
+12
+561.560562517035
+22
+-561.560562517035
+32
+1614.7610800213
+13
+561.560562517035
+23
+-561.560562517035
+33
+1614.7610800213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-750.032010089465
+20
+-762.726244296354
+30
+1915.09420023775
+11
+-781.550764523053
+21
+-852.489442592712
+31
+1950.71579563676
+12
+-805.85406896736
+22
+-828.277941296301
+32
+1950.68418808414
+13
+-805.85406896736
+23
+-828.277941296301
+33
+1950.68418808414
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-781.550764523053
+20
+-852.489442592712
+30
+1950.71579563676
+11
+-750.032010089465
+21
+-762.726244296354
+31
+1915.09420023775
+12
+-712.200510303116
+22
+-793.069743896677
+32
+1912.98147661467
+13
+-712.200510303116
+23
+-793.069743896677
+33
+1912.98147661467
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+594.593536632776
+20
+-594.593536632776
+30
+914.026066884025
+11
+543.797359730523
+21
+-363.353779128852
+31
+1054.1729200213
+12
+462.461640169813
+22
+-462.461640169813
+32
+1054.1729200213
+13
+462.461640169813
+23
+-462.461640169813
+33
+1054.1729200213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+543.797359730523
+20
+-363.353779128852
+30
+1054.1729200213
+11
+594.593536632776
+21
+-594.593536632776
+31
+914.026066884025
+12
+699.168033082722
+22
+-467.169144021929
+32
+914.026066884025
+13
+699.168033082722
+23
+-467.169144021929
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-683.397324988288
+20
+-829.51728232132
+30
+2058.8118770109
+11
+-761.149821895316
+21
+-761.14982219046
+31
+2100.64485501639
+12
+-763.653083482914
+22
+-763.653083482914
+32
+2058.8118770109
+13
+-763.653083482914
+23
+-763.653083482914
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.149821895316
+20
+-761.14982219046
+30
+2100.64485501639
+11
+-683.397324988288
+21
+-829.51728232132
+31
+2058.8118770109
+12
+-688.216174174222
+22
+-823.534449985187
+32
+2077.42717273413
+13
+-688.216174174222
+23
+-823.534449985187
+33
+2077.42717273413
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.149821895316
+20
+-761.14982219046
+30
+2100.64485501639
+11
+-688.216174174222
+21
+-823.534449985187
+31
+2077.42717273413
+12
+-703.270205185374
+22
+-808.916878172158
+32
+2098.19892992261
+13
+-703.270205185374
+23
+-808.916878172158
+33
+2098.19892992261
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.149821895316
+20
+-761.14982219046
+30
+2100.64485501639
+11
+-703.270205185374
+21
+-808.916878172158
+31
+2098.19892992261
+12
+-723.84293286299
+22
+-790.84270017674
+32
+2109.1268343449
+13
+-723.84293286299
+23
+-790.84270017674
+33
+2109.1268343449
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-761.149821895316
+20
+-761.14982219046
+30
+2100.64485501639
+11
+-723.84293286299
+21
+-790.84270017674
+31
+2109.1268343449
+12
+-746.579505030633
+22
+-772.239793008819
+32
+2108.60809856919
+13
+-746.579505030633
+23
+-772.239793008819
+33
+2108.60809856919
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-704.67526609701
+20
+-470.84895947612
+30
+796.153149972084
+11
+-590.997993226901
+21
+-590.997993226901
+31
+738.078199114136
+12
+-599.277053327022
+22
+-599.277053327022
+32
+796.153149972084
+13
+-599.277053327022
+23
+-599.277053327022
+33
+796.153149972084
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-590.997993226901
+20
+-590.997993226901
+30
+738.078199114136
+11
+-704.67526609701
+21
+-470.84895947612
+31
+796.153149972084
+12
+-694.940121314314
+22
+-464.344143695271
+32
+738.078199114136
+13
+-694.940121314314
+23
+-464.344143695271
+33
+738.078199114136
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-779.335772128321
+20
+-850.040945080999
+30
+2123.14819601944
+11
+-750.226480623555
+21
+-763.163737563064
+31
+2153.51833793914
+12
+-803.639076572628
+22
+-825.829443784589
+32
+2123.11658846682
+13
+-803.639076572628
+23
+-825.829443784589
+33
+2123.11658846682
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-750.226480623555
+20
+-763.163737563064
+30
+2153.51833793914
+11
+-779.335772128321
+21
+-850.040945080999
+31
+2123.14819601944
+12
+-713.051374182295
+22
+-793.031288591004
+32
+2155.44278114838
+13
+-713.051374182295
+23
+-793.031288591004
+33
+2155.44278114838
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+724.87187698787
+20
+-750.87609961724
+30
+1817.56657040449
+11
+180.675224578544
+21
+-709.249312269842
+31
+1830.19391829555
+12
+180.675224578544
+22
+-750.87609961724
+32
+1817.56657040449
+13
+180.675224578544
+23
+-750.87609961724
+33
+1817.56657040449
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-709.249312269842
+30
+1830.19391829555
+11
+724.87187698787
+21
+-750.87609961724
+31
+1817.56657040449
+12
+767.904940618653
+22
+-709.249312269841
+32
+1830.19391829555
+13
+767.904940618653
+23
+-709.249312269841
+33
+1830.19391829555
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+767.904940618653
+20
+-709.249312269841
+30
+1830.19391829555
+11
+724.87187698787
+21
+-750.87609961724
+31
+1817.56657040449
+12
+739.771122243662
+22
+-739.771122243661
+32
+1820.9352284623
+13
+739.771122243662
+23
+-739.771122243661
+33
+1820.9352284623
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.208549610569
+20
+-738.20854961057
+30
+2258.00680432354
+11
+-759.379832416841
+21
+-756.991889361348
+31
+2148.21162800104
+12
+-758.175252738136
+22
+-758.175252738136
+32
+2148.91211343617
+13
+-758.175252738136
+23
+-758.175252738136
+33
+2148.91211343617
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-759.379832416841
+20
+-756.991889361348
+30
+2148.21162800104
+11
+-738.208549610569
+21
+-738.20854961057
+31
+2258.00680432354
+12
+-891.670534105406
+22
+-595.795202951324
+32
+2148.21162800104
+13
+-891.670534105406
+23
+-595.795202951324
+33
+2148.21162800104
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-891.670534105406
+20
+-595.795202951324
+30
+2148.21162800104
+11
+-738.208549610569
+21
+-738.20854961057
+31
+2258.00680432354
+12
+-868.041422984449
+22
+-580.006735667279
+32
+2258.00680432354
+13
+-868.041422984449
+23
+-580.006735667279
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-769.870311262695
+20
+-863.130130350016
+30
+1987.61043910797
+11
+-723.636295253065
+21
+-790.983771266745
+31
+1961.01586348506
+12
+-785.140115231108
+22
+-848.157192786392
+32
+1978.73092447164
+13
+-785.140115231108
+23
+-848.157192786392
+33
+1978.73092447164
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-723.636295253065
+20
+-790.983771266745
+30
+1961.01586348506
+11
+-769.870311262695
+21
+-863.130130350016
+31
+1987.61043910797
+12
+-702.965588161926
+22
+-809.153241506708
+32
+1972.08037046597
+13
+-702.965588161926
+23
+-809.153241506708
+33
+1972.08037046597
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-655.637457605706
+20
+-847.372595440649
+30
+2104.03168141582
+11
+-757.051052836406
+21
+-872.59583635536
+31
+2110.05176266305
+12
+-740.177565197592
+22
+-890.060339871748
+32
+2085.82110165668
+13
+-740.177565197592
+23
+-890.060339871748
+33
+2085.82110165668
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-757.051052836406
+20
+-872.59583635536
+30
+2110.05176266305
+11
+-655.637457605706
+21
+-847.372595440649
+31
+2104.03168141582
+12
+-680.351354626835
+22
+-823.413171149779
+32
+2137.7839549476
+13
+-680.351354626835
+23
+-823.413171149779
+33
+2137.7839549476
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-786.92474167715
+20
+-735.296194513125
+30
+2058.80750841657
+11
+-763.653083482914
+21
+-763.653083482914
+31
+2011.5925230317
+12
+-763.653083482914
+22
+-763.653083482914
+32
+2058.8118770109
+13
+-763.653083482914
+23
+-763.653083482914
+33
+2058.8118770109
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-763.653083482914
+20
+-763.653083482914
+30
+2011.5925230317
+11
+-786.92474167715
+21
+-735.296194513125
+31
+2058.80750841657
+12
+-786.927339360508
+22
+-735.2933223192
+32
+2011.59250954971
+13
+-786.927339360508
+23
+-735.2933223192
+33
+2011.59250954971
+70
+3
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-786.927339360508
+20
+-735.2933223192
+30
+2011.59250954971
+11
+-786.92474167715
+21
+-735.296194513125
+31
+2058.80750841657
+12
+-789.34285913936
+22
+-732.349614898499
+32
+2049.89434090933
+13
+-789.34285913936
+23
+-732.349614898499
+33
+2049.89434090933
+70
+13
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-786.927339360508
+20
+-735.2933223192
+30
+2011.59250954971
+11
+-789.34285913936
+21
+-732.349614898499
+31
+2049.89434090933
+12
+-789.394716623343
+22
+-732.286733093936
+32
+2020.79944934296
+13
+-789.394716623343
+23
+-732.286733093936
+33
+2020.79944934296
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493610898294
+20
+-856.9292108199
+30
+1972.4395492014
+11
+180.675224578544
+21
+-843.478785654691
+31
+1961.40114566384
+12
+104.493610580936
+22
+-843.478858324204
+32
+1961.40113017901
+13
+104.493610580936
+23
+-843.478858324204
+33
+1961.40113017901
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-843.478785654691
+30
+1961.40114566384
+11
+104.493610898294
+21
+-856.9292108199
+31
+1972.4395492014
+12
+180.675224578544
+22
+-856.929131071254
+32
+1972.43955887653
+13
+180.675224578544
+23
+-856.929131071254
+33
+1972.43955887653
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.49360070239
+20
+-760.199658141424
+30
+1953.19884488255
+11
+180.675224578544
+21
+-744.854240913949
+31
+1961.40114566384
+12
+104.493597604008
+22
+-744.854261675785
+32
+1961.40113017901
+13
+104.493597604008
+23
+-744.854261675785
+33
+1961.40113017901
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-744.854240913949
+30
+1961.40114566384
+11
+104.49360070239
+21
+-760.199658141424
+31
+1953.19884488255
+12
+180.675224578544
+22
+-760.199629303065
+32
+1953.19886468436
+13
+180.675224578544
+23
+-760.199629303065
+33
+1953.19886468436
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493608114757
+20
+-881.220857485245
+30
+2017.88602361794
+11
+180.675224578544
+21
+-882.926258568641
+31
+2035.20217666346
+12
+180.675224578544
+22
+-881.220764951522
+32
+2017.88600937388
+13
+180.675224578544
+23
+-881.220764951522
+33
+2017.88600937388
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-882.926258568641
+30
+2035.20217666346
+11
+104.493608114757
+21
+-881.220857485245
+31
+2017.88602361794
+12
+104.493606060716
+22
+-882.926351999993
+32
+2035.2022000213
+13
+104.493606060716
+23
+-882.926351999993
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+832.899678896021
+20
+-165.674046918965
+30
+855.37186879426
+11
+776.87389411925
+21
+-321.791703197793
+31
+914.026066884025
+12
+784.574341950659
+22
+-324.981333125909
+32
+855.37186879426
+13
+784.574341950659
+23
+-324.981333125909
+33
+855.37186879426
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+776.87389411925
+20
+-321.791703197793
+30
+914.026066884025
+11
+832.899678896021
+21
+-165.674046918965
+31
+855.37186879426
+12
+824.724927080674
+22
+-164.047987682633
+32
+914.026066884025
+13
+824.724927080674
+23
+-164.047987682633
+33
+914.026066884025
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-554.192057578438
+20
+-829.407026995335
+30
+2361.46489814399
+11
+-738.208549610569
+21
+-738.20854961057
+31
+2258.00680432354
+12
+-580.006735667279
+22
+-868.041422984449
+32
+2258.00680432354
+13
+-580.006735667279
+23
+-868.041422984449
+33
+2258.00680432354
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+-738.208549610569
+20
+-738.20854961057
+30
+2258.00680432354
+11
+-554.192057578438
+21
+-829.407026995335
+31
+2361.46489814399
+12
+-705.352696568271
+22
+-705.352696568271
+32
+2361.46489814399
+13
+-705.352696568271
+23
+-705.352696568271
+33
+2361.46489814399
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493608114766
+20
+-811.482736403359
+30
+1948.14790253605
+11
+180.675224578544
+21
+-794.16651328432
+31
+1946.44243137914
+12
+104.493606060728
+22
+-794.166559999995
+32
+1946.44240802131
+13
+104.493606060728
+23
+-794.166559999995
+33
+1946.44240802131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-794.16651328432
+30
+1946.44243137914
+11
+104.493608114766
+21
+-811.482736403359
+31
+1948.14790253605
+12
+180.675224578544
+22
+-811.482680573908
+32
+1948.14792499626
+13
+180.675224578544
+23
+-811.482680573908
+33
+1948.14792499626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493609641047
+20
+-876.169915138752
+30
+2001.23529816273
+11
+180.675224578544
+21
+-867.967544283947
+31
+1985.88990429309
+12
+104.493610580933
+22
+-867.967629842287
+32
+1985.88990169709
+13
+104.493610580933
+23
+-867.967629842287
+33
+1985.88990169709
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-867.967544283947
+30
+1985.88990429309
+11
+104.493609641047
+21
+-876.169915138752
+31
+2001.23529816273
+12
+180.675224578544
+22
+-876.169825263419
+32
+2001.23529268221
+13
+180.675224578544
+23
+-876.169825263419
+33
+2001.23529268221
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+870.542978388702
+20
+-173.161764737035
+30
+1427.8983600213
+11
+733.714233519903
+21
+-303.914386430124
+31
+1614.7610800213
+12
+820.033554718597
+22
+-339.669019965462
+32
+1427.8983600213
+13
+820.033554718597
+23
+-339.669019965462
+33
+1427.8983600213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+733.714233519903
+20
+-303.914386430124
+30
+1614.7610800213
+11
+870.542978388702
+21
+-173.161764737035
+31
+1427.8983600213
+12
+778.906875772646
+22
+-154.93421062823
+32
+1614.7610800213
+13
+778.906875772646
+23
+-154.93421062823
+33
+1614.7610800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493606060728
+20
+-794.166559999995
+30
+1946.44240802131
+11
+180.675224578544
+21
+-776.850345994732
+31
+1948.14792499626
+12
+104.493603557875
+22
+-776.850383596631
+32
+1948.14790253605
+13
+104.493603557875
+23
+-776.850383596631
+33
+1948.14790253605
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-776.850345994732
+30
+1948.14792499626
+11
+104.493606060728
+21
+-794.166559999995
+31
+1946.44240802131
+12
+180.675224578544
+22
+-794.16651328432
+32
+1946.44243137914
+13
+180.675224578544
+23
+-794.16651328432
+33
+1946.44243137914
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+104.493610580933
+20
+-867.967629842287
+30
+1985.88990169709
+11
+180.675224578544
+21
+-856.929131071254
+31
+1972.43955887653
+12
+104.493610898294
+22
+-856.9292108199
+32
+1972.4395492014
+13
+104.493610898294
+23
+-856.9292108199
+33
+1972.4395492014
+70
+1
+ 0
+3DFACE
+ 8
+body_half_outside
+10
+180.675224578544
+20
+-856.929131071254
+30
+1972.43955887653
+11
+104.493610580933
+21
+-867.967629842287
+31
+1985.88990169709
+12
+180.675224578544
+22
+-867.967544283947
+32
+1985.88990429309
+13
+180.675224578544
+23
+-867.967544283947
+33
+1985.88990429309
+70
+1
+ 0
+LINE
+ 8
+gearbox_half
+10
+30.4100782304564
+20
+-746.49013258163
+30
+2453.45715065631
+11
+24.34322336653
+21
+-746.490281375615
+31
+2458.93184091804
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+40.5223071141985
+21
+-746.489826768683
+31
+2418.48410781754
+ 0
+LINE
+ 8
+gearbox_half
+10
+38.1044882661712
+20
+-746.472597450548
+30
+2441.59510408829
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+28.6886074277319
+21
+-845.586914684007
+31
+2396.25770684411
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.80083252567691
+20
+-746.490516835407
+30
+2466.03430060887
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+24.34322336653
+21
+-746.490281375615
+31
+2458.93184091804
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+-38.4950902517974
+21
+-746.468944067437
+31
+2440.30734482534
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+1.97523338443695e-05
+21
+-746.466300328333
+31
+2408.44996985759
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+-33.4678737118522
+21
+-842.638323863285
+31
+2401.89221007289
+ 0
+LINE
+ 8
+gearbox_half
+10
+1.97523338443695e-05
+20
+-746.466300328333
+30
+2408.44996985759
+11
+-8.51065249376504e-06
+21
+-839.802827497933
+31
+2407.23923490746
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+-28.6885754589981
+21
+-845.586914071948
+31
+2396.25770800615
+ 0
+LINE
+ 8
+gearbox_half
+10
+-15.9204113486204
+20
+-849.898361163922
+30
+2387.78046547824
+11
+-8.51065249376504e-06
+21
+-839.802827497933
+31
+2407.23923490746
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+8.20040795902847
+21
+-851.106221594429
+31
+2385.4069325561
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+40.5223036225517
+21
+-746.489826768019
+31
+2433.13926654555
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+22.8299783182512
+21
+-848.019743175159
+31
+2391.47368489106
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+-8.20037490092574
+21
+-851.106218203592
+31
+2385.40693910603
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.12757738010438e-05
+20
+-746.490561947348
+30
+2467.05568035128
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+38.4951388369074
+20
+-746.468944065183
+30
+2440.307304368
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+-40.5222597845463
+20
+-746.489826767721
+30
+2433.13935135064
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+15.9204143676902
+21
+-849.898373872036
+31
+2387.78044098382
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+33.4679083982488
+21
+-842.638324380738
+31
+2401.8922090971
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+-40.5222636135967
+21
+-746.489826768433
+31
+2418.48410805367
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+1.72997611565862e-05
+21
+-851.533505856544
+31
+2384.56770196969
+ 0
+LINE
+ 8
+gearbox_half
+10
+30.4100782304564
+20
+-746.49013258163
+30
+2453.45715065631
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+-8.51065249376504e-06
+20
+-839.802827497933
+30
+2407.23923490746
+11
+-22.8299485734197
+21
+-848.019743098533
+31
+2391.47368503808
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+-38.4950971525309
+21
+-746.468944065041
+31
+2411.31607076746
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+35.1336643413592
+21
+-746.489997426872
+31
+2447.15311715482
+ 0
+LINE
+ 8
+gearbox_half
+10
+-35.1336147072826
+20
+-746.489997435648
+30
+2447.15314153492
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+-41.243969438466
+20
+-746.489812236375
+30
+2425.81166701568
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+41.2440089431315
+21
+-746.489812235881
+31
+2425.81169037352
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+-17.0525826131802
+21
+-746.490415123346
+31
+2463.2377628621
+ 0
+LINE
+ 8
+gearbox_half
+10
+-24.3431841465257
+20
+-746.490281376331
+30
+2458.9318438987
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+17.0526628275986
+20
+-746.490415117915
+30
+2463.23773775863
+11
+2.7574625836424e-05
+21
+-746.482315034391
+31
+2425.81166985652
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+8.80087264672179
+21
+-746.490516834585
+31
+2466.03429657022
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+38.4951397868556
+21
+-746.468944064851
+31
+2411.31607056148
+ 0
+LINE
+ 8
+gearbox_half
+10
+2.7574625836424e-05
+20
+-746.482315034391
+30
+2425.81166985652
+11
+-30.4100395457505
+21
+-746.490132582396
+31
+2453.45715336784
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4089950656911
+20
+-70.0735200000139
+30
+1719.8874193002
+11
+-23.8222131580276
+21
+-116.789200000014
+31
+1715.92498725262
+12
+-23.8222131580276
+22
+-70.0735200000139
+32
+1715.92498725262
+13
+-23.8222131580276
+23
+-70.0735200000139
+33
+1715.92498725262
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222131580276
+20
+-116.789200000014
+30
+1715.92498725262
+11
+-16.4089950656911
+21
+-70.0735200000139
+31
+1719.8874193002
+12
+-16.4089950656911
+22
+-116.789200000014
+32
+1719.8874193002
+13
+-16.4089950656911
+23
+-116.789200000014
+33
+1719.8874193002
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+712.934349429914
+20
+-116.789200000014
+30
+1614.07300396247
+11
+-758.547422188618
+21
+-116.789200000014
+31
+1522.84685844505
+12
+758.547422188619
+22
+-116.789200000014
+32
+1522.84685844505
+13
+758.547422188619
+23
+-116.789200000014
+33
+1522.84685844505
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-758.547422188618
+20
+-116.789200000014
+30
+1522.84685844505
+11
+712.934349429914
+21
+-116.789200000014
+31
+1614.07300396247
+12
+-712.59031140046
+22
+-116.789200000014
+32
+1614.76108002137
+13
+-712.59031140046
+23
+-116.789200000014
+33
+1614.76108002137
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-712.59031140046
+20
+-116.789200000014
+30
+1614.76108002137
+11
+712.934349429914
+21
+-116.789200000014
+31
+1614.07300396247
+12
+93.4322738363532
+22
+-116.789200000014
+32
+1614.76107890595
+13
+93.4322738363532
+23
+-116.789200000014
+33
+1614.76107890595
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-712.59031140046
+20
+-116.789200000014
+30
+1614.76108002137
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+-93.4313636055058
+22
+-116.789200000014
+32
+1614.76108002137
+13
+-93.4313636055058
+23
+-116.789200000014
+33
+1614.76108002137
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+1614.76108002137
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+8.36522724084684
+22
+-116.789200000014
+32
+1638.21727291857
+13
+8.36522724084684
+23
+-116.789200000014
+33
+1638.21727291857
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36522724084684
+20
+-116.789200000014
+30
+1638.21727291857
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+16.4090345703586
+22
+-116.789200000014
+32
+1640.65732084063
+13
+16.4090345703586
+23
+-116.789200000014
+33
+1640.65732084063
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090345703586
+20
+-116.789200000014
+30
+1640.65732084063
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+23.8222526626951
+22
+-116.789200000014
+32
+1644.61975288821
+13
+23.8222526626951
+23
+-116.789200000014
+33
+1644.61975288821
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8222526626951
+20
+-116.789200000014
+30
+1644.61975288821
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+30.3199957039486
+22
+-116.789200000014
+32
+1649.95229501988
+13
+30.3199957039486
+23
+-116.789200000014
+33
+1649.95229501988
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3199957039486
+20
+-116.789200000014
+30
+1649.95229501988
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+35.65255907302
+22
+-116.789200000014
+32
+1656.45002063205
+13
+35.65255907302
+23
+-116.789200000014
+33
+1656.45002063205
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.65255907302
+20
+-116.789200000014
+30
+1656.45002063205
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+39.6150153501718
+22
+-116.789200000014
+32
+1663.86322577341
+13
+39.6150153501718
+23
+-116.789200000014
+33
+1663.86322577341
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150153501718
+20
+-116.789200000014
+30
+1663.86322577341
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+42.0550895628442
+22
+-116.789200000014
+32
+1671.90702512775
+13
+42.0550895628442
+23
+-116.789200000014
+33
+1671.90702512775
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550895628442
+20
+-116.789200000014
+30
+1671.90702512775
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+42.8790110274535
+22
+-116.789200000014
+32
+1680.2722999969
+13
+42.8790110274535
+23
+-116.789200000014
+33
+1680.2722999969
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-116.789200000014
+30
+1680.2722999969
+11
+93.4322738363532
+21
+-116.789200000014
+31
+1614.76107890595
+12
+93.4313563944944
+22
+-116.789200000014
+32
+2549.07468002137
+13
+93.4313563944944
+23
+-116.789200000014
+33
+2549.07468002137
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+1614.76108002137
+11
+8.36522724084684
+21
+-116.789200000014
+31
+1638.21727291857
+12
+-5.03211860767294e-05
+22
+-116.789200000014
+32
+1637.3933787953
+13
+-5.03211860767294e-05
+23
+-116.789200000014
+33
+1637.3933787953
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-116.789200000014
+30
+1680.2722999969
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+42.0551169041753
+22
+-116.789200000014
+32
+1688.63757755893
+13
+42.0551169041753
+23
+-116.789200000014
+33
+1688.63757755893
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551169041753
+20
+-116.789200000014
+30
+1688.63757755893
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+39.615068982122
+22
+-116.789200000014
+32
+1696.68138488844
+13
+39.615068982122
+23
+-116.789200000014
+33
+1696.68138488844
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.615068982122
+20
+-116.789200000014
+30
+1696.68138488844
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+35.6526369345435
+22
+-116.789200000014
+32
+1704.09460298078
+13
+35.6526369345435
+23
+-116.789200000014
+33
+1704.09460298078
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6526369345435
+20
+-116.789200000014
+30
+1704.09460298078
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+30.3200948028707
+22
+-116.789200000014
+32
+1710.59234602203
+13
+30.3200948028707
+23
+-116.789200000014
+33
+1710.59234602203
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200948028707
+20
+-116.789200000014
+30
+1710.59234602203
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+23.8223691906999
+22
+-116.789200000014
+32
+1715.9249093911
+13
+23.8223691906999
+23
+-116.789200000014
+33
+1715.9249093911
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223691906999
+20
+-116.789200000014
+30
+1715.9249093911
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+16.4091640493401
+22
+-116.789200000014
+32
+1719.88736566825
+13
+16.4091640493401
+23
+-116.789200000014
+33
+1719.88736566825
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091640493401
+20
+-116.789200000014
+30
+1719.88736566825
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+42.8790110274535
+22
+-116.789200000014
+32
+2035.20210659002
+13
+42.8790110274535
+23
+-116.789200000014
+33
+2035.20210659002
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091640493401
+20
+-116.789200000014
+30
+1719.88736566825
+11
+42.8790110274535
+21
+-116.789200000014
+31
+2035.20210659002
+12
+42.0550941197328
+22
+-116.789200000014
+32
+2026.83683127205
+13
+42.0550941197328
+23
+-116.789200000014
+33
+2026.83683127205
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091640493401
+20
+-116.789200000014
+30
+1719.88736566825
+11
+42.0550941197328
+21
+-116.789200000014
+31
+2026.83683127205
+12
+8.36536469500046
+22
+-116.789200000014
+32
+1722.32743988093
+13
+8.36536469500046
+23
+-116.789200000014
+33
+1722.32743988093
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36536469500046
+20
+-116.789200000014
+30
+1722.32743988093
+11
+42.0550941197328
+21
+-116.789200000014
+31
+2026.83683127205
+12
+8.98258536075502e-05
+22
+-116.789200000014
+32
+1723.15136134553
+13
+8.98258536075502e-05
+23
+-116.789200000014
+33
+1723.15136134553
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+42.0550941197328
+21
+-116.789200000014
+31
+2026.83683127205
+12
+39.6150242888304
+22
+-116.789200000014
+32
+2018.79303058852
+13
+39.6150242888304
+23
+-116.789200000014
+33
+2018.79303058852
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+39.6150242888304
+21
+-116.789200000014
+31
+2018.79303058852
+12
+35.652572049941
+22
+-116.789200000014
+32
+2011.37982328866
+13
+35.652572049941
+23
+-116.789200000014
+33
+2011.37982328866
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+35.652572049941
+21
+-116.789200000014
+31
+2011.37982328866
+12
+30.3200122204362
+22
+-116.789200000014
+32
+2004.88209477165
+13
+30.3200122204362
+23
+-116.789200000014
+33
+2004.88209477165
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+30.3200122204362
+21
+-116.789200000014
+31
+2004.88209477165
+12
+23.8222720840299
+22
+-116.789200000014
+32
+1999.54954910041
+13
+23.8222720840299
+23
+-116.789200000014
+33
+1999.54954910041
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+23.8222720840299
+21
+-116.789200000014
+31
+1999.54954910041
+12
+16.4090561501895
+22
+-116.789200000014
+32
+1995.58711301456
+13
+16.4090561501895
+23
+-116.789200000014
+33
+1995.58711301456
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+16.4090561501895
+21
+-116.789200000014
+31
+1995.58711301456
+12
+8.36525014987311
+22
+-116.789200000014
+32
+1993.14706071074
+13
+8.36525014987311
+23
+-116.789200000014
+33
+1993.14706071074
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+8.36525014987311
+21
+-116.789200000014
+31
+1993.14706071074
+12
+-2.69633454074381e-05
+22
+-116.789200000014
+32
+1992.32316203057
+13
+-2.69633454074381e-05
+23
+-116.789200000014
+33
+1992.32316203057
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-116.789200000014
+30
+2035.20210659002
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+42.0551123472866
+22
+-116.789200000014
+32
+2043.56738370323
+13
+42.0551123472866
+23
+-116.789200000014
+33
+2043.56738370323
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551123472866
+20
+-116.789200000014
+30
+2043.56738370323
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+39.6150600434633
+22
+-116.789200000014
+32
+2051.61118970355
+13
+39.6150600434633
+23
+-116.789200000014
+33
+2051.61118970355
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150600434633
+20
+-116.789200000014
+30
+2051.61118970355
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+35.6526239576226
+22
+-116.789200000014
+32
+2059.02440563739
+13
+35.6526239576226
+23
+-116.789200000014
+33
+2059.02440563739
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6526239576226
+20
+-116.789200000014
+30
+2059.02440563739
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+30.3200782863833
+22
+-116.789200000014
+32
+2065.5221457738
+13
+30.3200782863833
+23
+-116.789200000014
+33
+2065.5221457738
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200782863833
+20
+-116.789200000014
+30
+2065.5221457738
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+23.8223497693652
+22
+-116.789200000014
+32
+2070.8547056033
+13
+23.8223497693652
+23
+-116.789200000014
+33
+2070.8547056033
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223497693652
+20
+-116.789200000014
+30
+2070.8547056033
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+16.4091424695092
+22
+-116.789200000014
+32
+2074.81715784219
+13
+16.4091424695092
+23
+-116.789200000014
+33
+2074.81715784219
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091424695092
+20
+-116.789200000014
+30
+2074.81715784219
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+8.3653417859741
+22
+-116.789200000014
+32
+2077.25722767309
+13
+8.3653417859741
+23
+-116.789200000014
+33
+2077.25722767309
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.3653417859741
+20
+-116.789200000014
+30
+2077.25722767309
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+6.64680129382589e-05
+22
+-116.789200000014
+32
+2078.08114458081
+13
+6.64680129382589e-05
+23
+-116.789200000014
+33
+2078.08114458081
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+39.6150423666468
+22
+-116.789200000014
+32
+2409.40261154673
+13
+39.6150423666468
+23
+-116.789200000014
+33
+2409.40261154673
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+39.6150423666468
+21
+-116.789200000014
+31
+2409.40261154673
+12
+35.652598194651
+22
+-116.789200000014
+32
+2401.98939991186
+13
+35.652598194651
+23
+-116.789200000014
+33
+2401.98939991186
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+35.652598194651
+21
+-116.789200000014
+31
+2401.98939991186
+12
+30.3200454313183
+22
+-116.789200000014
+32
+2395.49166556936
+13
+30.3200454313183
+23
+-116.789200000014
+33
+2395.49166556936
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+30.3200454313183
+21
+-116.789200000014
+31
+2395.49166556936
+12
+23.8223110888135
+22
+-116.789200000014
+32
+2390.15911280603
+13
+23.8223110888135
+23
+-116.789200000014
+33
+2390.15911280603
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+23.8223110888135
+21
+-116.789200000014
+31
+2390.15911280603
+12
+16.4090994539476
+22
+-116.789200000014
+32
+2386.19666863403
+13
+16.4090994539476
+23
+-116.789200000014
+33
+2386.19666863403
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+16.4090994539476
+21
+-116.789200000014
+31
+2386.19666863403
+12
+8.36529609247169
+22
+-116.789200000014
+32
+2383.75660756074
+13
+8.36529609247169
+23
+-116.789200000014
+33
+2383.75660756074
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+8.36529609247169
+21
+-116.789200000014
+31
+2383.75660756074
+12
+1.98565501612791e-05
+22
+-116.789200000014
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-116.789200000014
+33
+2382.93269976479
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666468
+20
+-116.789200000014
+30
+2409.40261154673
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+42.05510343994
+22
+-116.789200000014
+32
+2417.44641490821
+13
+42.05510343994
+23
+-116.789200000014
+33
+2417.44641490821
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+-116.789200000014
+30
+2417.44641490821
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+42.8790112358864
+22
+-116.789200000014
+32
+2425.81169114413
+13
+42.8790112358864
+23
+-116.789200000014
+33
+2425.81169114413
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790112358864
+20
+-116.789200000014
+30
+2425.81169114413
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+42.05510343994
+22
+-116.789200000014
+32
+2434.17696738005
+13
+42.05510343994
+23
+-116.789200000014
+33
+2434.17696738005
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+-116.789200000014
+30
+2434.17696738005
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+39.6150423666468
+22
+-116.789200000014
+32
+2442.22077074152
+13
+39.6150423666468
+23
+-116.789200000014
+33
+2442.22077074152
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666468
+20
+-116.789200000014
+30
+2442.22077074152
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+35.652598194651
+22
+-116.789200000014
+32
+2449.63398237639
+13
+35.652598194651
+23
+-116.789200000014
+33
+2449.63398237639
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+-116.789200000014
+30
+2449.63398237639
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+30.3200454313183
+22
+-116.789200000014
+32
+2456.13171671889
+13
+30.3200454313183
+23
+-116.789200000014
+33
+2456.13171671889
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+-116.789200000014
+30
+2456.13171671889
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+23.8223110888135
+22
+-116.789200000014
+32
+2461.46426948223
+13
+23.8223110888135
+23
+-116.789200000014
+33
+2461.46426948223
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+-116.789200000014
+30
+2461.46426948223
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+16.4090994539477
+22
+-116.789200000014
+32
+2465.42671365422
+13
+16.4090994539477
+23
+-116.789200000014
+33
+2465.42671365422
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539477
+20
+-116.789200000014
+30
+2465.42671365422
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+8.36529609247169
+22
+-116.789200000014
+32
+2467.86677472752
+13
+8.36529609247169
+23
+-116.789200000014
+33
+2467.86677472752
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-116.789200000014
+30
+2467.86677472752
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+1.98565501612791e-05
+22
+-116.789200000014
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+-116.789200000014
+33
+2468.69068252346
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+1614.76108002137
+11
+-42.878971522786
+21
+-116.789200000014
+31
+1680.27244014393
+12
+-93.4313636055058
+22
+-116.789200000014
+32
+2549.07468002137
+13
+-93.4313636055058
+23
+-116.789200000014
+33
+2549.07468002137
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-116.789200000014
+30
+1680.27244014393
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-42.0550773995078
+22
+-116.789200000014
+32
+1671.9071625819
+13
+-42.0550773995078
+23
+-116.789200000014
+33
+1671.9071625819
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550773995078
+20
+-116.789200000014
+30
+1671.9071625819
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-39.6150294774544
+22
+-116.789200000014
+32
+1663.86335525239
+13
+-39.6150294774544
+23
+-116.789200000014
+33
+1663.86335525239
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150294774544
+20
+-116.789200000014
+30
+1663.86335525239
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-35.652597429876
+22
+-116.789200000014
+32
+1656.45013716005
+13
+-35.652597429876
+23
+-116.789200000014
+33
+1656.45013716005
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.652597429876
+20
+-116.789200000014
+30
+1656.45013716005
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-30.3200552982032
+22
+-116.789200000014
+32
+1649.9523941188
+13
+-30.3200552982032
+23
+-116.789200000014
+33
+1649.9523941188
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200552982032
+20
+-116.789200000014
+30
+1649.9523941188
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-23.8223296860324
+22
+-116.789200000014
+32
+1644.61983074973
+13
+-23.8223296860324
+23
+-116.789200000014
+33
+1644.61983074973
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8223296860324
+20
+-116.789200000014
+30
+1644.61983074973
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-16.4091245446726
+22
+-116.789200000014
+32
+1640.65737447258
+13
+-16.4091245446726
+23
+-116.789200000014
+33
+1640.65737447258
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4091245446726
+20
+-116.789200000014
+30
+1640.65737447258
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-8.36532519033293
+22
+-116.789200000014
+32
+1638.2173002599
+13
+-8.36532519033293
+23
+-116.789200000014
+33
+1638.2173002599
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36532519033293
+20
+-116.789200000014
+30
+1638.2173002599
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-5.03211860767294e-05
+22
+-116.789200000014
+32
+1637.3933787953
+13
+-5.03211860767294e-05
+23
+-116.789200000014
+33
+1637.3933787953
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-42.878971522786
+21
+-116.789200000014
+31
+1680.27244014393
+12
+-42.0550500581767
+22
+-116.789200000014
+32
+1688.63771501308
+13
+-42.0550500581767
+23
+-116.789200000014
+33
+1688.63771501308
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-42.0550500581767
+21
+-116.789200000014
+31
+1688.63771501308
+12
+-39.6149758455043
+22
+-116.789200000014
+32
+1696.68151436742
+13
+-39.6149758455043
+23
+-116.789200000014
+33
+1696.68151436742
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-39.6149758455043
+21
+-116.789200000014
+31
+1696.68151436742
+12
+-35.6525195683525
+22
+-116.789200000014
+32
+1704.09471950878
+13
+-35.6525195683525
+23
+-116.789200000014
+33
+1704.09471950878
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-35.6525195683525
+21
+-116.789200000014
+31
+1704.09471950878
+12
+-30.3199561992811
+22
+-116.789200000014
+32
+1710.59244512095
+13
+-30.3199561992811
+23
+-116.789200000014
+33
+1710.59244512095
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-30.3199561992811
+21
+-116.789200000014
+31
+1710.59244512095
+12
+-23.8222131580276
+22
+-116.789200000014
+32
+1715.92498725262
+13
+-23.8222131580276
+23
+-116.789200000014
+33
+1715.92498725262
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-23.8222131580276
+21
+-116.789200000014
+31
+1715.92498725262
+12
+-16.4089950656911
+22
+-116.789200000014
+32
+1719.8874193002
+13
+-16.4089950656911
+23
+-116.789200000014
+33
+1719.8874193002
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-16.4089950656911
+21
+-116.789200000014
+31
+1719.8874193002
+12
+-42.878971522786
+22
+-116.789200000014
+32
+2035.20220002137
+13
+-42.878971522786
+23
+-116.789200000014
+33
+2035.20220002137
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-116.789200000014
+30
+2035.20220002137
+11
+-16.4089950656911
+21
+-116.789200000014
+31
+1719.8874193002
+12
+-42.0550728426191
+22
+-116.789200000014
+32
+2026.83692290816
+13
+-42.0550728426191
+23
+-116.789200000014
+33
+2026.83692290816
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550728426191
+20
+-116.789200000014
+30
+2026.83692290816
+11
+-16.4089950656911
+21
+-116.789200000014
+31
+1719.8874193002
+12
+-8.36518773617931
+22
+-116.789200000014
+32
+1722.32746722226
+13
+-8.36518773617931
+23
+-116.789200000014
+33
+1722.32746722226
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550728426191
+20
+-116.789200000014
+30
+2026.83692290816
+11
+-8.36518773617931
+21
+-116.789200000014
+31
+1722.32746722226
+12
+8.98258536075502e-05
+22
+-116.789200000014
+32
+1723.15136134553
+13
+8.98258536075502e-05
+23
+-116.789200000014
+33
+1723.15136134553
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550728426191
+20
+-116.789200000014
+30
+2026.83692290816
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+-39.6150205387958
+22
+-116.789200000014
+32
+2018.79311690784
+13
+-39.6150205387958
+23
+-116.789200000014
+33
+2018.79311690784
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150205387958
+20
+-116.789200000014
+30
+2018.79311690784
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+-35.652584452955
+22
+-116.789200000014
+32
+2011.379900974
+13
+-35.652584452955
+23
+-116.789200000014
+33
+2011.379900974
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.652584452955
+20
+-116.789200000014
+30
+2011.379900974
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+-30.3200387817157
+22
+-116.789200000014
+32
+2004.88216083759
+13
+-30.3200387817157
+23
+-116.789200000014
+33
+2004.88216083759
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200387817157
+20
+-116.789200000014
+30
+2004.88216083759
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+-23.8223102646976
+22
+-116.789200000014
+32
+1999.54960100809
+13
+-23.8223102646976
+23
+-116.789200000014
+33
+1999.54960100809
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8223102646976
+20
+-116.789200000014
+30
+1999.54960100809
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+-16.4091029648416
+22
+-116.789200000014
+32
+1995.5871487692
+13
+-16.4091029648416
+23
+-116.789200000014
+33
+1995.5871487692
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4091029648416
+20
+-116.789200000014
+30
+1995.5871487692
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+-8.36530228130657
+22
+-116.789200000014
+32
+1993.1470789383
+13
+-8.36530228130657
+23
+-116.789200000014
+33
+1993.1470789383
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36530228130657
+20
+-116.789200000014
+30
+1993.1470789383
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+-2.69633454074381e-05
+22
+-116.789200000014
+32
+1992.32316203057
+13
+-2.69633454074381e-05
+23
+-116.789200000014
+33
+1992.32316203057
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-42.878971522786
+21
+-116.789200000014
+31
+2035.20220002137
+12
+-42.0550546150653
+22
+-116.789200000014
+32
+2043.56747533934
+13
+-42.0550546150653
+23
+-116.789200000014
+33
+2043.56747533934
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-42.0550546150653
+21
+-116.789200000014
+31
+2043.56747533934
+12
+-39.6149847841629
+22
+-116.789200000014
+32
+2051.61127602287
+13
+-39.6149847841629
+23
+-116.789200000014
+33
+2051.61127602287
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-39.6149847841629
+21
+-116.789200000014
+31
+2051.61127602287
+12
+-35.6525325452735
+22
+-116.789200000014
+32
+2059.02448332273
+13
+-35.6525325452735
+23
+-116.789200000014
+33
+2059.02448332273
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-35.6525325452735
+21
+-116.789200000014
+31
+2059.02448332273
+12
+-30.3199727157687
+22
+-116.789200000014
+32
+2065.52221183974
+13
+-30.3199727157687
+23
+-116.789200000014
+33
+2065.52221183974
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-30.3199727157687
+21
+-116.789200000014
+31
+2065.52221183974
+12
+-23.8222325793624
+22
+-116.789200000014
+32
+2070.85475751098
+13
+-23.8222325793624
+23
+-116.789200000014
+33
+2070.85475751098
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-23.8222325793624
+21
+-116.789200000014
+31
+2070.85475751098
+12
+-16.4090166455219
+22
+-116.789200000014
+32
+2074.81719359682
+13
+-16.4090166455219
+23
+-116.789200000014
+33
+2074.81719359682
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-16.4090166455219
+21
+-116.789200000014
+31
+2074.81719359682
+12
+-8.36521064520558
+22
+-116.789200000014
+32
+2077.25724590065
+13
+-8.36521064520558
+23
+-116.789200000014
+33
+2077.25724590065
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-8.36521064520558
+21
+-116.789200000014
+31
+2077.25724590065
+12
+6.64680129382589e-05
+22
+-116.789200000014
+32
+2078.08114458081
+13
+6.64680129382589e-05
+23
+-116.789200000014
+33
+2078.08114458081
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+-39.6150026535464
+22
+-116.789200000014
+32
+2409.40261154673
+13
+-39.6150026535464
+23
+-116.789200000014
+33
+2409.40261154673
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+-116.789200000014
+30
+2409.40261154673
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+-35.6525584815506
+22
+-116.789200000014
+32
+2401.98939991186
+13
+-35.6525584815506
+23
+-116.789200000014
+33
+2401.98939991186
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-116.789200000014
+30
+2401.98939991186
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+-30.3200057182179
+22
+-116.789200000014
+32
+2395.49166556936
+13
+-30.3200057182179
+23
+-116.789200000014
+33
+2395.49166556936
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182179
+20
+-116.789200000014
+30
+2395.49166556936
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+-23.8222713757131
+22
+-116.789200000014
+32
+2390.15911280603
+13
+-23.8222713757131
+23
+-116.789200000014
+33
+2390.15911280603
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+-116.789200000014
+30
+2390.15911280603
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+-16.4090597408473
+22
+-116.789200000014
+32
+2386.19666863403
+13
+-16.4090597408473
+23
+-116.789200000014
+33
+2386.19666863403
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+-116.789200000014
+30
+2386.19666863403
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+-8.36525637937127
+22
+-116.789200000014
+32
+2383.75660756074
+13
+-8.36525637937127
+23
+-116.789200000014
+33
+2383.75660756074
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-116.789200000014
+30
+2383.75660756074
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+1.98565501612791e-05
+22
+-116.789200000014
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-116.789200000014
+33
+2382.93269976479
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-39.6150026535464
+21
+-116.789200000014
+31
+2409.40261154673
+12
+-42.0550637268397
+22
+-116.789200000014
+32
+2417.44641490821
+13
+-42.0550637268397
+23
+-116.789200000014
+33
+2417.44641490821
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-42.0550637268397
+21
+-116.789200000014
+31
+2417.44641490821
+12
+-42.878971522786
+22
+-116.789200000014
+32
+2425.81169114413
+13
+-42.878971522786
+23
+-116.789200000014
+33
+2425.81169114413
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-42.878971522786
+21
+-116.789200000014
+31
+2425.81169114413
+12
+-42.0550637268397
+22
+-116.789200000014
+32
+2434.17696738005
+13
+-42.0550637268397
+23
+-116.789200000014
+33
+2434.17696738005
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-42.0550637268397
+21
+-116.789200000014
+31
+2434.17696738005
+12
+-39.6150026535464
+22
+-116.789200000014
+32
+2442.22077074152
+13
+-39.6150026535464
+23
+-116.789200000014
+33
+2442.22077074152
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-39.6150026535464
+21
+-116.789200000014
+31
+2442.22077074152
+12
+-35.6525584815506
+22
+-116.789200000014
+32
+2449.63398237639
+13
+-35.6525584815506
+23
+-116.789200000014
+33
+2449.63398237639
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-35.6525584815506
+21
+-116.789200000014
+31
+2449.63398237639
+12
+-30.3200057182179
+22
+-116.789200000014
+32
+2456.13171671889
+13
+-30.3200057182179
+23
+-116.789200000014
+33
+2456.13171671889
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-30.3200057182179
+21
+-116.789200000014
+31
+2456.13171671889
+12
+-23.8222713757131
+22
+-116.789200000014
+32
+2461.46426948223
+13
+-23.8222713757131
+23
+-116.789200000014
+33
+2461.46426948223
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-23.8222713757131
+21
+-116.789200000014
+31
+2461.46426948223
+12
+-16.4090597408473
+22
+-116.789200000014
+32
+2465.42671365422
+13
+-16.4090597408473
+23
+-116.789200000014
+33
+2465.42671365422
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-16.4090597408473
+21
+-116.789200000014
+31
+2465.42671365422
+12
+-8.36525637937127
+22
+-116.789200000014
+32
+2467.86677472752
+13
+-8.36525637937127
+23
+-116.789200000014
+33
+2467.86677472752
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-8.36525637937127
+21
+-116.789200000014
+31
+2467.86677472752
+12
+1.98565501612791e-05
+22
+-116.789200000014
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+-116.789200000014
+33
+2468.69068252346
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+2549.07468002137
+11
+1.98565501612791e-05
+21
+-116.789200000014
+31
+2468.69068252346
+12
+93.4313563944944
+22
+-116.789200000014
+32
+2549.07468002137
+13
+93.4313563944944
+23
+-116.789200000014
+33
+2549.07468002137
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222131580276
+20
+-70.0735200000139
+30
+1715.92498725262
+11
+-30.3199561992811
+21
+-116.789200000014
+31
+1710.59244512095
+12
+-30.3199561992811
+22
+-70.0735200000139
+32
+1710.59244512095
+13
+-30.3199561992811
+23
+-70.0735200000139
+33
+1710.59244512095
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3199561992811
+20
+-116.789200000014
+30
+1710.59244512095
+11
+-23.8222131580276
+21
+-70.0735200000139
+31
+1715.92498725262
+12
+-23.8222131580276
+22
+-116.789200000014
+32
+1715.92498725262
+13
+-23.8222131580276
+23
+-116.789200000014
+33
+1715.92498725262
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-116.789200000014
+30
+2417.44641490821
+11
+-39.615002653547
+21
+-741.887719751186
+31
+2409.40261154673
+12
+-42.0550637268399
+22
+-741.902149593115
+32
+2417.44641490821
+13
+-42.0550637268399
+23
+-741.902149593115
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.615002653547
+20
+-741.887719751186
+30
+2409.40261154673
+11
+-42.0550637268397
+21
+-116.789200000014
+31
+2417.44641490821
+12
+-39.6150026535464
+22
+-116.789200000014
+32
+2409.40261154673
+13
+-39.6150026535464
+23
+-116.789200000014
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.3611250839466
+20
+-835.428664280087
+30
+2408.9276400213
+11
+39.3611647970476
+21
+-741.420676682108
+31
+2408.9276400213
+12
+-39.3611250839469
+22
+-741.886218389914
+32
+2408.9276400213
+13
+-39.3611250839469
+23
+-741.886218389914
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.3611647970476
+20
+-741.420676682108
+30
+2408.9276400213
+11
+-39.3611250839466
+21
+-835.428664280087
+31
+2408.9276400213
+12
+39.3611647970471
+22
+-835.428664280087
+32
+2408.9276400213
+13
+39.3611647970471
+23
+-835.428664280087
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-116.789200000014
+30
+2383.75660756074
+11
+1.98565501612791e-05
+21
+-858.151437401893
+31
+2382.93269976479
+12
+1.98565501612791e-05
+22
+-116.789200000014
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-116.789200000014
+33
+2382.93269976479
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.98565501612791e-05
+20
+-858.151437401893
+30
+2382.93269976479
+11
+8.36529609247169
+21
+-116.789200000014
+31
+2383.75660756074
+12
+8.36529609247169
+22
+-857.431240712237
+32
+2383.75660756074
+13
+8.36529609247169
+23
+-857.431240712237
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-717.191404282444
+20
+-70.0735200000139
+30
+1614.76108002137
+11
+-758.547422188618
+21
+-116.789200000014
+31
+1522.84685844505
+12
+-712.59031140046
+22
+-116.789200000014
+32
+1614.76108002137
+13
+-712.59031140046
+23
+-116.789200000014
+33
+1614.76108002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-758.547422188618
+20
+-116.789200000014
+30
+1522.84685844505
+11
+-717.191404282444
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-763.148515070603
+22
+-70.0735200000139
+32
+1522.84685844505
+13
+-763.148515070603
+23
+-70.0735200000139
+33
+1522.84685844505
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-70.0735200000139
+30
+1614.76108002137
+11
+-8.36532519033293
+21
+-70.0735200000139
+31
+1638.2173002599
+12
+-5.03211860767294e-05
+22
+-70.0735200000139
+32
+1637.3933787953
+13
+-5.03211860767294e-05
+23
+-70.0735200000139
+33
+1637.3933787953
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36532519033293
+20
+-70.0735200000139
+30
+1638.2173002599
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-16.4091245446726
+22
+-70.0735200000139
+32
+1640.65737447258
+13
+-16.4091245446726
+23
+-70.0735200000139
+33
+1640.65737447258
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4091245446726
+20
+-70.0735200000139
+30
+1640.65737447258
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-23.8223296860324
+22
+-70.0735200000139
+32
+1644.61983074973
+13
+-23.8223296860324
+23
+-70.0735200000139
+33
+1644.61983074973
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8223296860324
+20
+-70.0735200000139
+30
+1644.61983074973
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-30.3200552982032
+22
+-70.0735200000139
+32
+1649.9523941188
+13
+-30.3200552982032
+23
+-70.0735200000139
+33
+1649.9523941188
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200552982032
+20
+-70.0735200000139
+30
+1649.9523941188
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-35.652597429876
+22
+-70.0735200000139
+32
+1656.45013716005
+13
+-35.652597429876
+23
+-70.0735200000139
+33
+1656.45013716005
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.652597429876
+20
+-70.0735200000139
+30
+1656.45013716005
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-39.6150294774544
+22
+-70.0735200000139
+32
+1663.86335525239
+13
+-39.6150294774544
+23
+-70.0735200000139
+33
+1663.86335525239
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150294774544
+20
+-70.0735200000139
+30
+1663.86335525239
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-42.0550773995078
+22
+-70.0735200000139
+32
+1671.9071625819
+13
+-42.0550773995078
+23
+-70.0735200000139
+33
+1671.9071625819
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550773995078
+20
+-70.0735200000139
+30
+1671.9071625819
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-42.878971522786
+22
+-70.0735200000139
+32
+1680.27244014393
+13
+-42.878971522786
+23
+-70.0735200000139
+33
+1680.27244014393
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-70.0735200000139
+30
+1680.27244014393
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-93.4313636055058
+22
+-70.0735200000139
+32
+2549.07468002137
+13
+-93.4313636055058
+23
+-70.0735200000139
+33
+2549.07468002137
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-70.0735200000139
+30
+1680.27244014393
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-42.0550500581767
+22
+-70.0735200000139
+32
+1688.63771501308
+13
+-42.0550500581767
+23
+-70.0735200000139
+33
+1688.63771501308
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550500581767
+20
+-70.0735200000139
+30
+1688.63771501308
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-39.6149758455043
+22
+-70.0735200000139
+32
+1696.68151436742
+13
+-39.6149758455043
+23
+-70.0735200000139
+33
+1696.68151436742
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6149758455043
+20
+-70.0735200000139
+30
+1696.68151436742
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-35.6525195683525
+22
+-70.0735200000139
+32
+1704.09471950878
+13
+-35.6525195683525
+23
+-70.0735200000139
+33
+1704.09471950878
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525195683525
+20
+-70.0735200000139
+30
+1704.09471950878
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-30.3199561992811
+22
+-70.0735200000139
+32
+1710.59244512095
+13
+-30.3199561992811
+23
+-70.0735200000139
+33
+1710.59244512095
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3199561992811
+20
+-70.0735200000139
+30
+1710.59244512095
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-23.8222131580276
+22
+-70.0735200000139
+32
+1715.92498725262
+13
+-23.8222131580276
+23
+-70.0735200000139
+33
+1715.92498725262
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222131580276
+20
+-70.0735200000139
+30
+1715.92498725262
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-16.4089950656911
+22
+-70.0735200000139
+32
+1719.8874193002
+13
+-16.4089950656911
+23
+-70.0735200000139
+33
+1719.8874193002
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4089950656911
+20
+-70.0735200000139
+30
+1719.8874193002
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-42.878971522786
+22
+-70.0735200000139
+32
+2035.20220002137
+13
+-42.878971522786
+23
+-70.0735200000139
+33
+2035.20220002137
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4089950656911
+20
+-70.0735200000139
+30
+1719.8874193002
+11
+-42.878971522786
+21
+-70.0735200000139
+31
+2035.20220002137
+12
+-42.0550728426191
+22
+-70.0735200000139
+32
+2026.83692290816
+13
+-42.0550728426191
+23
+-70.0735200000139
+33
+2026.83692290816
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4089950656911
+20
+-70.0735200000139
+30
+1719.8874193002
+11
+-42.0550728426191
+21
+-70.0735200000139
+31
+2026.83692290816
+12
+-8.36518773617931
+22
+-70.0735200000139
+32
+1722.32746722226
+13
+-8.36518773617931
+23
+-70.0735200000139
+33
+1722.32746722226
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36518773617931
+20
+-70.0735200000139
+30
+1722.32746722226
+11
+-42.0550728426191
+21
+-70.0735200000139
+31
+2026.83692290816
+12
+8.98258536075502e-05
+22
+-70.0735200000139
+32
+1723.15136134553
+13
+8.98258536075502e-05
+23
+-70.0735200000139
+33
+1723.15136134553
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-42.0550728426191
+21
+-70.0735200000139
+31
+2026.83692290816
+12
+-39.6150205387958
+22
+-70.0735200000139
+32
+2018.79311690784
+13
+-39.6150205387958
+23
+-70.0735200000139
+33
+2018.79311690784
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-39.6150205387958
+21
+-70.0735200000139
+31
+2018.79311690784
+12
+-35.652584452955
+22
+-70.0735200000139
+32
+2011.379900974
+13
+-35.652584452955
+23
+-70.0735200000139
+33
+2011.379900974
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-35.652584452955
+21
+-70.0735200000139
+31
+2011.379900974
+12
+-30.3200387817157
+22
+-70.0735200000139
+32
+2004.88216083759
+13
+-30.3200387817157
+23
+-70.0735200000139
+33
+2004.88216083759
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-30.3200387817157
+21
+-70.0735200000139
+31
+2004.88216083759
+12
+-23.8223102646976
+22
+-70.0735200000139
+32
+1999.54960100809
+13
+-23.8223102646976
+23
+-70.0735200000139
+33
+1999.54960100809
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-23.8223102646976
+21
+-70.0735200000139
+31
+1999.54960100809
+12
+-16.4091029648416
+22
+-70.0735200000139
+32
+1995.5871487692
+13
+-16.4091029648416
+23
+-70.0735200000139
+33
+1995.5871487692
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-16.4091029648416
+21
+-70.0735200000139
+31
+1995.5871487692
+12
+-8.36530228130657
+22
+-70.0735200000139
+32
+1993.1470789383
+13
+-8.36530228130657
+23
+-70.0735200000139
+33
+1993.1470789383
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-8.36530228130657
+21
+-70.0735200000139
+31
+1993.1470789383
+12
+-2.69633454074381e-05
+22
+-70.0735200000139
+32
+1992.32316203057
+13
+-2.69633454074381e-05
+23
+-70.0735200000139
+33
+1992.32316203057
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-70.0735200000139
+30
+2035.20220002137
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-42.0550546150653
+22
+-70.0735200000139
+32
+2043.56747533934
+13
+-42.0550546150653
+23
+-70.0735200000139
+33
+2043.56747533934
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550546150653
+20
+-70.0735200000139
+30
+2043.56747533934
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-39.6149847841629
+22
+-70.0735200000139
+32
+2051.61127602287
+13
+-39.6149847841629
+23
+-70.0735200000139
+33
+2051.61127602287
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6149847841629
+20
+-70.0735200000139
+30
+2051.61127602287
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-35.6525325452735
+22
+-70.0735200000139
+32
+2059.02448332273
+13
+-35.6525325452735
+23
+-70.0735200000139
+33
+2059.02448332273
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525325452735
+20
+-70.0735200000139
+30
+2059.02448332273
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-30.3199727157687
+22
+-70.0735200000139
+32
+2065.52221183974
+13
+-30.3199727157687
+23
+-70.0735200000139
+33
+2065.52221183974
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3199727157687
+20
+-70.0735200000139
+30
+2065.52221183974
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-23.8222325793624
+22
+-70.0735200000139
+32
+2070.85475751098
+13
+-23.8222325793624
+23
+-70.0735200000139
+33
+2070.85475751098
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222325793624
+20
+-70.0735200000139
+30
+2070.85475751098
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-16.4090166455219
+22
+-70.0735200000139
+32
+2074.81719359682
+13
+-16.4090166455219
+23
+-70.0735200000139
+33
+2074.81719359682
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090166455219
+20
+-70.0735200000139
+30
+2074.81719359682
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-8.36521064520558
+22
+-70.0735200000139
+32
+2077.25724590065
+13
+-8.36521064520558
+23
+-70.0735200000139
+33
+2077.25724590065
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36521064520558
+20
+-70.0735200000139
+30
+2077.25724590065
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+6.64680129382589e-05
+22
+-70.0735200000139
+32
+2078.08114458081
+13
+6.64680129382589e-05
+23
+-70.0735200000139
+33
+2078.08114458081
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-39.6150026535464
+22
+-70.0735200000139
+32
+2409.40261154673
+13
+-39.6150026535464
+23
+-70.0735200000139
+33
+2409.40261154673
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-39.6150026535464
+21
+-70.0735200000139
+31
+2409.40261154673
+12
+-35.6525584815506
+22
+-70.0735200000139
+32
+2401.98939991186
+13
+-35.6525584815506
+23
+-70.0735200000139
+33
+2401.98939991186
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-35.6525584815506
+21
+-70.0735200000139
+31
+2401.98939991186
+12
+-30.3200057182179
+22
+-70.0735200000139
+32
+2395.49166556936
+13
+-30.3200057182179
+23
+-70.0735200000139
+33
+2395.49166556936
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-30.3200057182179
+21
+-70.0735200000139
+31
+2395.49166556936
+12
+-23.8222713757131
+22
+-70.0735200000139
+32
+2390.15911280603
+13
+-23.8222713757131
+23
+-70.0735200000139
+33
+2390.15911280603
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-23.8222713757131
+21
+-70.0735200000139
+31
+2390.15911280603
+12
+-16.4090597408473
+22
+-70.0735200000139
+32
+2386.19666863403
+13
+-16.4090597408473
+23
+-70.0735200000139
+33
+2386.19666863403
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-16.4090597408473
+21
+-70.0735200000139
+31
+2386.19666863403
+12
+-8.36525637937127
+22
+-70.0735200000139
+32
+2383.75660756074
+13
+-8.36525637937127
+23
+-70.0735200000139
+33
+2383.75660756074
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-8.36525637937127
+21
+-70.0735200000139
+31
+2383.75660756074
+12
+1.98565501612791e-05
+22
+-70.0735200000139
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-70.0735200000139
+33
+2382.93269976479
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+-70.0735200000139
+30
+2409.40261154673
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-42.0550637268397
+22
+-70.0735200000139
+32
+2417.44641490821
+13
+-42.0550637268397
+23
+-70.0735200000139
+33
+2417.44641490821
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-70.0735200000139
+30
+2417.44641490821
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-42.878971522786
+22
+-70.0735200000139
+32
+2425.81169114413
+13
+-42.878971522786
+23
+-70.0735200000139
+33
+2425.81169114413
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-70.0735200000139
+30
+2425.81169114413
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-42.0550637268397
+22
+-70.0735200000139
+32
+2434.17696738005
+13
+-42.0550637268397
+23
+-70.0735200000139
+33
+2434.17696738005
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-70.0735200000139
+30
+2434.17696738005
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-39.6150026535464
+22
+-70.0735200000139
+32
+2442.22077074152
+13
+-39.6150026535464
+23
+-70.0735200000139
+33
+2442.22077074152
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+-70.0735200000139
+30
+2442.22077074152
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-35.6525584815506
+22
+-70.0735200000139
+32
+2449.63398237639
+13
+-35.6525584815506
+23
+-70.0735200000139
+33
+2449.63398237639
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-70.0735200000139
+30
+2449.63398237639
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-30.3200057182179
+22
+-70.0735200000139
+32
+2456.13171671889
+13
+-30.3200057182179
+23
+-70.0735200000139
+33
+2456.13171671889
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182179
+20
+-70.0735200000139
+30
+2456.13171671889
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-23.8222713757131
+22
+-70.0735200000139
+32
+2461.46426948223
+13
+-23.8222713757131
+23
+-70.0735200000139
+33
+2461.46426948223
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+-70.0735200000139
+30
+2461.46426948223
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-16.4090597408473
+22
+-70.0735200000139
+32
+2465.42671365422
+13
+-16.4090597408473
+23
+-70.0735200000139
+33
+2465.42671365422
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+-70.0735200000139
+30
+2465.42671365422
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-8.36525637937127
+22
+-70.0735200000139
+32
+2467.86677472752
+13
+-8.36525637937127
+23
+-70.0735200000139
+33
+2467.86677472752
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-70.0735200000139
+30
+2467.86677472752
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+1.98565501612791e-05
+22
+-70.0735200000139
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+-70.0735200000139
+33
+2468.69068252346
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-717.191404282444
+20
+-70.0735200000139
+30
+1614.76108002137
+11
+763.148515070603
+21
+-70.0735200000139
+31
+1522.84685844505
+12
+-763.148515070603
+22
+-70.0735200000139
+32
+1522.84685844505
+13
+-763.148515070603
+23
+-70.0735200000139
+33
+1522.84685844505
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+763.148515070603
+20
+-70.0735200000139
+30
+1522.84685844505
+11
+-717.191404282444
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+717.537998926308
+22
+-70.0735200000139
+32
+1614.06789073365
+13
+717.537998926308
+23
+-70.0735200000139
+33
+1614.06789073365
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+717.537998926308
+20
+-70.0735200000139
+30
+1614.06789073365
+11
+-717.191404282444
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+93.4322738363532
+22
+-70.0735200000139
+32
+1614.76107890595
+13
+93.4322738363532
+23
+-70.0735200000139
+33
+1614.76107890595
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+-717.191404282444
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-93.4313636055058
+22
+-70.0735200000139
+32
+1614.76108002137
+13
+-93.4313636055058
+23
+-70.0735200000139
+33
+1614.76108002137
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+8.36522724084684
+22
+-70.0735200000139
+32
+1638.21727291857
+13
+8.36522724084684
+23
+-70.0735200000139
+33
+1638.21727291857
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+8.36522724084684
+21
+-70.0735200000139
+31
+1638.21727291857
+12
+16.4090345703586
+22
+-70.0735200000139
+32
+1640.65732084063
+13
+16.4090345703586
+23
+-70.0735200000139
+33
+1640.65732084063
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+16.4090345703586
+21
+-70.0735200000139
+31
+1640.65732084063
+12
+23.8222526626951
+22
+-70.0735200000139
+32
+1644.61975288821
+13
+23.8222526626951
+23
+-70.0735200000139
+33
+1644.61975288821
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+23.8222526626951
+21
+-70.0735200000139
+31
+1644.61975288821
+12
+30.3199957039486
+22
+-70.0735200000139
+32
+1649.95229501988
+13
+30.3199957039486
+23
+-70.0735200000139
+33
+1649.95229501988
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+30.3199957039486
+21
+-70.0735200000139
+31
+1649.95229501988
+12
+35.65255907302
+22
+-70.0735200000139
+32
+1656.45002063205
+13
+35.65255907302
+23
+-70.0735200000139
+33
+1656.45002063205
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+35.65255907302
+21
+-70.0735200000139
+31
+1656.45002063205
+12
+39.6150153501718
+22
+-70.0735200000139
+32
+1663.86322577341
+13
+39.6150153501718
+23
+-70.0735200000139
+33
+1663.86322577341
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+39.6150153501718
+21
+-70.0735200000139
+31
+1663.86322577341
+12
+42.0550895628442
+22
+-70.0735200000139
+32
+1671.90702512775
+13
+42.0550895628442
+23
+-70.0735200000139
+33
+1671.90702512775
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+42.0550895628442
+21
+-70.0735200000139
+31
+1671.90702512775
+12
+42.8790110274535
+22
+-70.0735200000139
+32
+1680.2722999969
+13
+42.8790110274535
+23
+-70.0735200000139
+33
+1680.2722999969
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+42.8790110274535
+21
+-70.0735200000139
+31
+1680.2722999969
+12
+93.4313563944944
+22
+-70.0735200000139
+32
+2549.07468002137
+13
+93.4313563944944
+23
+-70.0735200000139
+33
+2549.07468002137
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36522724084684
+20
+-70.0735200000139
+30
+1638.21727291857
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-5.03211860767294e-05
+22
+-70.0735200000139
+32
+1637.3933787953
+13
+-5.03211860767294e-05
+23
+-70.0735200000139
+33
+1637.3933787953
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+42.8790110274535
+21
+-70.0735200000139
+31
+1680.2722999969
+12
+42.0551169041753
+22
+-70.0735200000139
+32
+1688.63757755893
+13
+42.0551169041753
+23
+-70.0735200000139
+33
+1688.63757755893
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+42.0551169041753
+21
+-70.0735200000139
+31
+1688.63757755893
+12
+39.615068982122
+22
+-70.0735200000139
+32
+1696.68138488844
+13
+39.615068982122
+23
+-70.0735200000139
+33
+1696.68138488844
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+39.615068982122
+21
+-70.0735200000139
+31
+1696.68138488844
+12
+35.6526369345435
+22
+-70.0735200000139
+32
+1704.09460298078
+13
+35.6526369345435
+23
+-70.0735200000139
+33
+1704.09460298078
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+35.6526369345435
+21
+-70.0735200000139
+31
+1704.09460298078
+12
+30.3200948028707
+22
+-70.0735200000139
+32
+1710.59234602203
+13
+30.3200948028707
+23
+-70.0735200000139
+33
+1710.59234602203
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+30.3200948028707
+21
+-70.0735200000139
+31
+1710.59234602203
+12
+23.8223691906999
+22
+-70.0735200000139
+32
+1715.9249093911
+13
+23.8223691906999
+23
+-70.0735200000139
+33
+1715.9249093911
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+23.8223691906999
+21
+-70.0735200000139
+31
+1715.9249093911
+12
+16.4091640493401
+22
+-70.0735200000139
+32
+1719.88736566825
+13
+16.4091640493401
+23
+-70.0735200000139
+33
+1719.88736566825
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+16.4091640493401
+21
+-70.0735200000139
+31
+1719.88736566825
+12
+42.8790110274535
+22
+-70.0735200000139
+32
+2035.20210659002
+13
+42.8790110274535
+23
+-70.0735200000139
+33
+2035.20210659002
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-70.0735200000139
+30
+2035.20210659002
+11
+16.4091640493401
+21
+-70.0735200000139
+31
+1719.88736566825
+12
+42.0550941197328
+22
+-70.0735200000139
+32
+2026.83683127205
+13
+42.0550941197328
+23
+-70.0735200000139
+33
+2026.83683127205
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550941197328
+20
+-70.0735200000139
+30
+2026.83683127205
+11
+16.4091640493401
+21
+-70.0735200000139
+31
+1719.88736566825
+12
+8.36536469500046
+22
+-70.0735200000139
+32
+1722.32743988093
+13
+8.36536469500046
+23
+-70.0735200000139
+33
+1722.32743988093
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550941197328
+20
+-70.0735200000139
+30
+2026.83683127205
+11
+8.36536469500046
+21
+-70.0735200000139
+31
+1722.32743988093
+12
+8.98258536075502e-05
+22
+-70.0735200000139
+32
+1723.15136134553
+13
+8.98258536075502e-05
+23
+-70.0735200000139
+33
+1723.15136134553
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550941197328
+20
+-70.0735200000139
+30
+2026.83683127205
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+39.6150242888304
+22
+-70.0735200000139
+32
+2018.79303058852
+13
+39.6150242888304
+23
+-70.0735200000139
+33
+2018.79303058852
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150242888304
+20
+-70.0735200000139
+30
+2018.79303058852
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+35.652572049941
+22
+-70.0735200000139
+32
+2011.37982328866
+13
+35.652572049941
+23
+-70.0735200000139
+33
+2011.37982328866
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652572049941
+20
+-70.0735200000139
+30
+2011.37982328866
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+30.3200122204362
+22
+-70.0735200000139
+32
+2004.88209477165
+13
+30.3200122204362
+23
+-70.0735200000139
+33
+2004.88209477165
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200122204362
+20
+-70.0735200000139
+30
+2004.88209477165
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+23.8222720840299
+22
+-70.0735200000139
+32
+1999.54954910041
+13
+23.8222720840299
+23
+-70.0735200000139
+33
+1999.54954910041
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8222720840299
+20
+-70.0735200000139
+30
+1999.54954910041
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+16.4090561501895
+22
+-70.0735200000139
+32
+1995.58711301456
+13
+16.4090561501895
+23
+-70.0735200000139
+33
+1995.58711301456
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090561501895
+20
+-70.0735200000139
+30
+1995.58711301456
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+8.36525014987311
+22
+-70.0735200000139
+32
+1993.14706071074
+13
+8.36525014987311
+23
+-70.0735200000139
+33
+1993.14706071074
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36525014987311
+20
+-70.0735200000139
+30
+1993.14706071074
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+-2.69633454074381e-05
+22
+-70.0735200000139
+32
+1992.32316203057
+13
+-2.69633454074381e-05
+23
+-70.0735200000139
+33
+1992.32316203057
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+42.8790110274535
+21
+-70.0735200000139
+31
+2035.20210659002
+12
+42.0551123472866
+22
+-70.0735200000139
+32
+2043.56738370323
+13
+42.0551123472866
+23
+-70.0735200000139
+33
+2043.56738370323
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+42.0551123472866
+21
+-70.0735200000139
+31
+2043.56738370323
+12
+39.6150600434633
+22
+-70.0735200000139
+32
+2051.61118970355
+13
+39.6150600434633
+23
+-70.0735200000139
+33
+2051.61118970355
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+39.6150600434633
+21
+-70.0735200000139
+31
+2051.61118970355
+12
+35.6526239576226
+22
+-70.0735200000139
+32
+2059.02440563739
+13
+35.6526239576226
+23
+-70.0735200000139
+33
+2059.02440563739
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+35.6526239576226
+21
+-70.0735200000139
+31
+2059.02440563739
+12
+30.3200782863833
+22
+-70.0735200000139
+32
+2065.5221457738
+13
+30.3200782863833
+23
+-70.0735200000139
+33
+2065.5221457738
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+30.3200782863833
+21
+-70.0735200000139
+31
+2065.5221457738
+12
+23.8223497693652
+22
+-70.0735200000139
+32
+2070.8547056033
+13
+23.8223497693652
+23
+-70.0735200000139
+33
+2070.8547056033
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+23.8223497693652
+21
+-70.0735200000139
+31
+2070.8547056033
+12
+16.4091424695092
+22
+-70.0735200000139
+32
+2074.81715784219
+13
+16.4091424695092
+23
+-70.0735200000139
+33
+2074.81715784219
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+16.4091424695092
+21
+-70.0735200000139
+31
+2074.81715784219
+12
+8.3653417859741
+22
+-70.0735200000139
+32
+2077.25722767309
+13
+8.3653417859741
+23
+-70.0735200000139
+33
+2077.25722767309
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+8.3653417859741
+21
+-70.0735200000139
+31
+2077.25722767309
+12
+6.64680129382589e-05
+22
+-70.0735200000139
+32
+2078.08114458081
+13
+6.64680129382589e-05
+23
+-70.0735200000139
+33
+2078.08114458081
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+39.6150423666467
+22
+-70.0735200000139
+32
+2409.40261154673
+13
+39.6150423666467
+23
+-70.0735200000139
+33
+2409.40261154673
+70
+15
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666467
+20
+-70.0735200000139
+30
+2409.40261154673
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+35.652598194651
+22
+-70.0735200000139
+32
+2401.98939991186
+13
+35.652598194651
+23
+-70.0735200000139
+33
+2401.98939991186
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+-70.0735200000139
+30
+2401.98939991186
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+30.3200454313183
+22
+-70.0735200000139
+32
+2395.49166556936
+13
+30.3200454313183
+23
+-70.0735200000139
+33
+2395.49166556936
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+-70.0735200000139
+30
+2395.49166556936
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+23.8223110888135
+22
+-70.0735200000139
+32
+2390.15911280603
+13
+23.8223110888135
+23
+-70.0735200000139
+33
+2390.15911280603
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+-70.0735200000139
+30
+2390.15911280603
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+16.4090994539476
+22
+-70.0735200000139
+32
+2386.19666863403
+13
+16.4090994539476
+23
+-70.0735200000139
+33
+2386.19666863403
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539476
+20
+-70.0735200000139
+30
+2386.19666863403
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+8.36529609247169
+22
+-70.0735200000139
+32
+2383.75660756074
+13
+8.36529609247169
+23
+-70.0735200000139
+33
+2383.75660756074
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-70.0735200000139
+30
+2383.75660756074
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+1.98565501612791e-05
+22
+-70.0735200000139
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-70.0735200000139
+33
+2382.93269976479
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+39.6150423666467
+21
+-70.0735200000139
+31
+2409.40261154673
+12
+42.05510343994
+22
+-70.0735200000139
+32
+2417.44641490821
+13
+42.05510343994
+23
+-70.0735200000139
+33
+2417.44641490821
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+42.05510343994
+21
+-70.0735200000139
+31
+2417.44641490821
+12
+42.8790112358864
+22
+-70.0735200000139
+32
+2425.81169114413
+13
+42.8790112358864
+23
+-70.0735200000139
+33
+2425.81169114413
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+42.8790112358864
+21
+-70.0735200000139
+31
+2425.81169114413
+12
+42.05510343994
+22
+-70.0735200000139
+32
+2434.17696738005
+13
+42.05510343994
+23
+-70.0735200000139
+33
+2434.17696738005
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+42.05510343994
+21
+-70.0735200000139
+31
+2434.17696738005
+12
+39.6150423666467
+22
+-70.0735200000139
+32
+2442.22077074152
+13
+39.6150423666467
+23
+-70.0735200000139
+33
+2442.22077074152
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+39.6150423666467
+21
+-70.0735200000139
+31
+2442.22077074152
+12
+35.652598194651
+22
+-70.0735200000139
+32
+2449.63398237639
+13
+35.652598194651
+23
+-70.0735200000139
+33
+2449.63398237639
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+35.652598194651
+21
+-70.0735200000139
+31
+2449.63398237639
+12
+30.3200454313183
+22
+-70.0735200000139
+32
+2456.13171671889
+13
+30.3200454313183
+23
+-70.0735200000139
+33
+2456.13171671889
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+30.3200454313183
+21
+-70.0735200000139
+31
+2456.13171671889
+12
+23.8223110888135
+22
+-70.0735200000139
+32
+2461.46426948223
+13
+23.8223110888135
+23
+-70.0735200000139
+33
+2461.46426948223
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+23.8223110888135
+21
+-70.0735200000139
+31
+2461.46426948223
+12
+16.4090994539477
+22
+-70.0735200000139
+32
+2465.42671365422
+13
+16.4090994539477
+23
+-70.0735200000139
+33
+2465.42671365422
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+16.4090994539477
+21
+-70.0735200000139
+31
+2465.42671365422
+12
+8.36529609247169
+22
+-70.0735200000139
+32
+2467.86677472752
+13
+8.36529609247169
+23
+-70.0735200000139
+33
+2467.86677472752
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+8.36529609247169
+21
+-70.0735200000139
+31
+2467.86677472752
+12
+1.98565501612791e-05
+22
+-70.0735200000139
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+-70.0735200000139
+33
+2468.69068252346
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+1.98565501612791e-05
+21
+-70.0735200000139
+31
+2468.69068252346
+12
+-93.4313636055058
+22
+-70.0735200000139
+32
+2549.07468002137
+13
+-93.4313636055058
+23
+-70.0735200000139
+33
+2549.07468002137
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+763.148515070603
+20
+-70.0735200000139
+30
+1522.84685844505
+11
+712.934349429914
+21
+-116.789200000014
+31
+1614.07300396247
+12
+758.547422188619
+22
+-116.789200000014
+32
+1522.84685844505
+13
+758.547422188619
+23
+-116.789200000014
+33
+1522.84685844505
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+712.934349429914
+20
+-116.789200000014
+30
+1614.07300396247
+11
+763.148515070603
+21
+-70.0735200000139
+31
+1522.84685844505
+12
+717.537998926308
+22
+-70.0735200000139
+32
+1614.06789073365
+13
+717.537998926308
+23
+-70.0735200000139
+33
+1614.06789073365
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-116.789200000014
+30
+2425.81169114413
+11
+-42.0550637268399
+21
+-741.902149593115
+31
+2417.44641490821
+12
+-42.878971522786
+22
+-741.907021954462
+32
+2425.81169114413
+13
+-42.878971522786
+23
+-741.907021954462
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268399
+20
+-741.902149593115
+30
+2417.44641490821
+11
+-42.878971522786
+21
+-116.789200000014
+31
+2425.81169114413
+12
+-42.0550637268397
+22
+-116.789200000014
+32
+2417.44641490821
+13
+-42.0550637268397
+23
+-116.789200000014
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408471
+20
+-741.750486264824
+30
+2465.42671365422
+11
+-8.36525637937127
+21
+-116.789200000014
+31
+2467.86677472752
+12
+-16.4090597408473
+22
+-116.789200000014
+32
+2465.42671365422
+13
+-16.4090597408473
+23
+-116.789200000014
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-116.789200000014
+30
+2467.86677472752
+11
+-16.4090597408471
+21
+-741.750486264824
+31
+2465.42671365422
+12
+-8.36525637937127
+22
+-741.702917450962
+32
+2467.86677472752
+13
+-8.36525637937127
+23
+-741.702917450962
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+763.148515070603
+20
+-70.0735200000139
+30
+1522.84685844505
+11
+-758.547422188618
+21
+-116.789200000014
+31
+1522.84685844505
+12
+-763.148515070603
+22
+-70.0735200000139
+32
+1522.84685844505
+13
+-763.148515070603
+23
+-70.0735200000139
+33
+1522.84685844505
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-758.547422188618
+20
+-116.789200000014
+30
+1522.84685844505
+11
+763.148515070603
+21
+-70.0735200000139
+31
+1522.84685844505
+12
+758.547422188619
+22
+-116.789200000014
+32
+1522.84685844505
+13
+758.547422188619
+23
+-116.789200000014
+33
+1522.84685844505
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+-116.789200000014
+30
+2390.15911280603
+11
+-30.3200057182178
+21
+-847.173357521512
+31
+2395.49166556936
+12
+-30.3200057182179
+22
+-116.789200000014
+32
+2395.49166556936
+13
+-30.3200057182179
+23
+-116.789200000014
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182178
+20
+-847.173357521512
+30
+2395.49166556936
+11
+-23.8222713757131
+21
+-116.789200000014
+31
+2390.15911280603
+12
+-23.822271375713
+22
+-851.834664122165
+32
+2390.15911280603
+13
+-23.822271375713
+23
+-851.834664122165
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+-116.789200000014
+30
+2401.98939991186
+11
+39.3611647970471
+21
+-835.428664280087
+31
+2408.9276400213
+12
+35.6525981946511
+22
+-841.49353899477
+32
+2401.98939991186
+13
+35.6525981946511
+23
+-841.49353899477
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.3611647970471
+20
+-835.428664280087
+30
+2408.9276400213
+11
+35.652598194651
+21
+-116.789200000014
+31
+2401.98939991186
+12
+39.3611647970476
+22
+-741.420676682108
+32
+2408.9276400213
+13
+39.3611647970476
+23
+-741.420676682108
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.3611647970476
+20
+-741.420676682108
+30
+2408.9276400213
+11
+35.652598194651
+21
+-116.789200000014
+31
+2401.98939991186
+12
+39.6150423666477
+22
+-741.419175320836
+32
+2409.40261154673
+13
+39.6150423666477
+23
+-741.419175320836
+33
+2409.40261154673
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666477
+20
+-741.419175320836
+30
+2409.40261154673
+11
+35.652598194651
+21
+-116.789200000014
+31
+2401.98939991186
+12
+39.6150423666468
+22
+-116.789200000014
+32
+2409.40261154673
+13
+39.6150423666468
+23
+-116.789200000014
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+-116.789200000014
+30
+2386.19666863403
+11
+-23.822271375713
+21
+-851.834664122165
+31
+2390.15911280603
+12
+-23.8222713757131
+22
+-116.789200000014
+32
+2390.15911280603
+13
+-23.8222713757131
+23
+-116.789200000014
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.822271375713
+20
+-851.834664122165
+30
+2390.15911280603
+11
+-16.4090597408473
+21
+-116.789200000014
+31
+2386.19666863403
+12
+-16.4090597408471
+22
+-855.298327398157
+32
+2386.19666863403
+13
+-16.4090597408471
+23
+-855.298327398157
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+712.934349429914
+20
+-116.789200000014
+30
+1614.07300396247
+11
+93.4322738363532
+21
+-70.0735200000139
+31
+1614.76107890595
+12
+93.4322738363532
+22
+-116.789200000014
+32
+1614.76107890595
+13
+93.4322738363532
+23
+-116.789200000014
+33
+1614.76107890595
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+712.934349429914
+21
+-116.789200000014
+31
+1614.07300396247
+12
+717.537998926308
+22
+-70.0735200000139
+32
+1614.06789073365
+13
+717.537998926308
+23
+-70.0735200000139
+33
+1614.06789073365
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6525981946522
+20
+-741.442608112612
+30
+2449.63398237639
+11
+30.3200454313183
+21
+-116.789200000014
+31
+2456.13171671889
+12
+30.3200454313182
+22
+-741.474143345189
+32
+2456.13171671889
+13
+30.3200454313182
+23
+-741.474143345189
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+-116.789200000014
+30
+2456.13171671889
+11
+35.6525981946522
+21
+-741.442608112612
+31
+2449.63398237639
+12
+35.652598194651
+22
+-116.789200000014
+32
+2449.63398237639
+13
+35.652598194651
+23
+-116.789200000014
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223691906999
+20
+-70.0735200000139
+30
+1715.9249093911
+11
+16.4091640493401
+21
+-116.789200000014
+31
+1719.88736566825
+12
+16.4091640493401
+22
+-70.0735200000139
+32
+1719.88736566825
+13
+16.4091640493401
+23
+-70.0735200000139
+33
+1719.88736566825
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091640493401
+20
+-116.789200000014
+30
+1719.88736566825
+11
+23.8223691906999
+21
+-70.0735200000139
+31
+1715.9249093911
+12
+23.8223691906999
+22
+-116.789200000014
+32
+1715.9249093911
+13
+23.8223691906999
+23
+-116.789200000014
+33
+1715.9249093911
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150153501718
+20
+-70.0735200000139
+30
+1663.86322577341
+11
+35.65255907302
+21
+-116.789200000014
+31
+1656.45002063205
+12
+39.6150153501718
+22
+-116.789200000014
+32
+1663.86322577341
+13
+39.6150153501718
+23
+-116.789200000014
+33
+1663.86322577341
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.65255907302
+20
+-116.789200000014
+30
+1656.45002063205
+11
+39.6150153501718
+21
+-70.0735200000139
+31
+1663.86322577341
+12
+35.65255907302
+22
+-70.0735200000139
+32
+1656.45002063205
+13
+35.65255907302
+23
+-70.0735200000139
+33
+1656.45002063205
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091640493401
+20
+-70.0735200000139
+30
+1719.88736566825
+11
+8.36536469500046
+21
+-116.789200000014
+31
+1722.32743988093
+12
+8.36536469500046
+22
+-70.0735200000139
+32
+1722.32743988093
+13
+8.36536469500046
+23
+-70.0735200000139
+33
+1722.32743988093
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36536469500046
+20
+-116.789200000014
+30
+1722.32743988093
+11
+16.4091640493401
+21
+-70.0735200000139
+31
+1719.88736566825
+12
+16.4091640493401
+22
+-116.789200000014
+32
+1719.88736566825
+13
+16.4091640493401
+23
+-116.789200000014
+33
+1719.88736566825
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150294774544
+20
+-70.0735200000139
+30
+1663.86335525239
+11
+-42.0550773995078
+21
+-116.789200000014
+31
+1671.9071625819
+12
+-39.6150294774544
+22
+-116.789200000014
+32
+1663.86335525239
+13
+-39.6150294774544
+23
+-116.789200000014
+33
+1663.86335525239
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550773995078
+20
+-116.789200000014
+30
+1671.9071625819
+11
+-39.6150294774544
+21
+-70.0735200000139
+31
+1663.86335525239
+12
+-42.0550773995078
+22
+-70.0735200000139
+32
+1671.9071625819
+13
+-42.0550773995078
+23
+-70.0735200000139
+33
+1671.9071625819
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+0.0
+30
+2417.44641490821
+11
+-39.6150026535464
+21
+-70.0735200000139
+31
+2409.40261154673
+12
+-42.0550637268397
+22
+-70.0735200000139
+32
+2417.44641490821
+13
+-42.0550637268397
+23
+-70.0735200000139
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+-70.0735200000139
+30
+2409.40261154673
+11
+-42.0550637268397
+21
+0.0
+31
+2417.44641490821
+12
+-39.6150026535464
+22
+0.0
+32
+2409.40261154673
+13
+-39.6150026535464
+23
+0.0
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+0.0
+30
+2425.81169114413
+11
+-42.0550637268397
+21
+-70.0735200000139
+31
+2417.44641490821
+12
+-42.878971522786
+22
+-70.0735200000139
+32
+2425.81169114413
+13
+-42.878971522786
+23
+-70.0735200000139
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-70.0735200000139
+30
+2417.44641490821
+11
+-42.878971522786
+21
+0.0
+31
+2425.81169114413
+12
+-42.0550637268397
+22
+0.0
+32
+2417.44641490821
+13
+-42.0550637268397
+23
+0.0
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+0.0
+30
+2386.19666863403
+11
+-23.8222713757131
+21
+-70.0735200000139
+31
+2390.15911280603
+12
+-23.8222713757131
+22
+0.0
+32
+2390.15911280603
+13
+-23.8222713757131
+23
+0.0
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+-70.0735200000139
+30
+2390.15911280603
+11
+-16.4090597408473
+21
+0.0
+31
+2386.19666863403
+12
+-16.4090597408473
+22
+-70.0735200000139
+32
+2386.19666863403
+13
+-16.4090597408473
+23
+-70.0735200000139
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539476
+20
+0.0
+30
+2386.19666863403
+11
+8.36529609247169
+21
+-70.0735200000139
+31
+2383.75660756074
+12
+8.36529609247169
+22
+0.0
+32
+2383.75660756074
+13
+8.36529609247169
+23
+0.0
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-70.0735200000139
+30
+2383.75660756074
+11
+16.4090994539476
+21
+0.0
+31
+2386.19666863403
+12
+16.4090994539476
+22
+-70.0735200000139
+32
+2386.19666863403
+13
+16.4090994539476
+23
+-70.0735200000139
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+-70.0735200000139
+30
+2461.46426948223
+11
+16.4090994539477
+21
+0.0
+31
+2465.42671365422
+12
+16.4090994539477
+22
+-70.0735200000139
+32
+2465.42671365422
+13
+16.4090994539477
+23
+-70.0735200000139
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539477
+20
+0.0
+30
+2465.42671365422
+11
+23.8223110888135
+21
+-70.0735200000139
+31
+2461.46426948223
+12
+23.8223110888135
+22
+0.0
+32
+2461.46426948223
+13
+23.8223110888135
+23
+0.0
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8223296860324
+20
+-116.789200000014
+30
+1644.61983074973
+11
+-30.3200552982032
+21
+-70.0735200000139
+31
+1649.9523941188
+12
+-30.3200552982032
+22
+-116.789200000014
+32
+1649.9523941188
+13
+-30.3200552982032
+23
+-116.789200000014
+33
+1649.9523941188
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200552982032
+20
+-70.0735200000139
+30
+1649.9523941188
+11
+-23.8223296860324
+21
+-116.789200000014
+31
+1644.61983074973
+12
+-23.8223296860324
+22
+-70.0735200000139
+32
+1644.61983074973
+13
+-23.8223296860324
+23
+-70.0735200000139
+33
+1644.61983074973
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525195683525
+20
+-70.0735200000139
+30
+1704.09471950878
+11
+-30.3199561992811
+21
+-116.789200000014
+31
+1710.59244512095
+12
+-35.6525195683525
+22
+-116.789200000014
+32
+1704.09471950878
+13
+-35.6525195683525
+23
+-116.789200000014
+33
+1704.09471950878
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3199561992811
+20
+-116.789200000014
+30
+1710.59244512095
+11
+-35.6525195683525
+21
+-70.0735200000139
+31
+1704.09471950878
+12
+-30.3199561992811
+22
+-70.0735200000139
+32
+1710.59244512095
+13
+-30.3199561992811
+23
+-70.0735200000139
+33
+1710.59244512095
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36518773617931
+20
+-70.0735200000139
+30
+1722.32746722226
+11
+-16.4089950656911
+21
+-116.789200000014
+31
+1719.8874193002
+12
+-16.4089950656911
+22
+-70.0735200000139
+32
+1719.8874193002
+13
+-16.4089950656911
+23
+-70.0735200000139
+33
+1719.8874193002
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4089950656911
+20
+-116.789200000014
+30
+1719.8874193002
+11
+-8.36518773617931
+21
+-70.0735200000139
+31
+1722.32746722226
+12
+-8.36518773617931
+22
+-116.789200000014
+32
+1722.32746722226
+13
+-8.36518773617931
+23
+-116.789200000014
+33
+1722.32746722226
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8222526626951
+20
+-116.789200000014
+30
+1644.61975288821
+11
+16.4090345703586
+21
+-70.0735200000139
+31
+1640.65732084063
+12
+16.4090345703586
+22
+-116.789200000014
+32
+1640.65732084063
+13
+16.4090345703586
+23
+-116.789200000014
+33
+1640.65732084063
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090345703586
+20
+-70.0735200000139
+30
+1640.65732084063
+11
+23.8222526626951
+21
+-116.789200000014
+31
+1644.61975288821
+12
+23.8222526626951
+22
+-70.0735200000139
+32
+1644.61975288821
+13
+23.8222526626951
+23
+-70.0735200000139
+33
+1644.61975288821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550773995078
+20
+-70.0735200000139
+30
+1671.9071625819
+11
+-42.878971522786
+21
+-116.789200000014
+31
+1680.27244014393
+12
+-42.0550773995078
+22
+-116.789200000014
+32
+1671.9071625819
+13
+-42.0550773995078
+23
+-116.789200000014
+33
+1671.9071625819
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-116.789200000014
+30
+1680.27244014393
+11
+-42.0550773995078
+21
+-70.0735200000139
+31
+1671.9071625819
+12
+-42.878971522786
+22
+-70.0735200000139
+32
+1680.27244014393
+13
+-42.878971522786
+23
+-70.0735200000139
+33
+1680.27244014393
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6526369345435
+20
+-70.0735200000139
+30
+1704.09460298078
+11
+39.615068982122
+21
+-116.789200000014
+31
+1696.68138488844
+12
+35.6526369345435
+22
+-116.789200000014
+32
+1704.09460298078
+13
+35.6526369345435
+23
+-116.789200000014
+33
+1704.09460298078
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.615068982122
+20
+-116.789200000014
+30
+1696.68138488844
+11
+35.6526369345435
+21
+-70.0735200000139
+31
+1704.09460298078
+12
+39.615068982122
+22
+-70.0735200000139
+32
+1696.68138488844
+13
+39.615068982122
+23
+-70.0735200000139
+33
+1696.68138488844
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551169041753
+20
+-70.0735200000139
+30
+1688.63757755893
+11
+42.8790110274535
+21
+-116.789200000014
+31
+1680.2722999969
+12
+42.0551169041753
+22
+-116.789200000014
+32
+1688.63757755893
+13
+42.0551169041753
+23
+-116.789200000014
+33
+1688.63757755893
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-116.789200000014
+30
+1680.2722999969
+11
+42.0551169041753
+21
+-70.0735200000139
+31
+1688.63757755893
+12
+42.8790110274535
+22
+-70.0735200000139
+32
+1680.2722999969
+13
+42.8790110274535
+23
+-70.0735200000139
+33
+1680.2722999969
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-741.902149593115
+30
+2434.17696738005
+11
+-42.878971522786
+21
+-116.789200000014
+31
+2425.81169114413
+12
+-42.878971522786
+22
+-741.907021954462
+32
+2425.81169114413
+13
+-42.878971522786
+23
+-741.907021954462
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-116.789200000014
+30
+2425.81169114413
+11
+-42.0550637268397
+21
+-741.902149593115
+31
+2434.17696738005
+12
+-42.0550637268397
+22
+-116.789200000014
+32
+2434.17696738005
+13
+-42.0550637268397
+23
+-116.789200000014
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790112358864
+20
+-741.39987311756
+30
+2425.81169114413
+11
+42.05510343994
+21
+-116.789200000014
+31
+2434.17696738005
+12
+42.0551034399401
+22
+-741.404745478907
+32
+2434.17696738005
+13
+42.0551034399401
+23
+-741.404745478907
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+-116.789200000014
+30
+2434.17696738005
+11
+42.8790112358864
+21
+-741.39987311756
+31
+2425.81169114413
+12
+42.8790112358864
+22
+-116.789200000014
+32
+2425.81169114413
+13
+42.8790112358864
+23
+-116.789200000014
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.9856550251518e-05
+20
+-741.653447536011
+30
+2468.69068252346
+11
+-8.36525637937127
+21
+-116.789200000014
+31
+2467.86677472752
+12
+-8.36525637937127
+22
+-741.702917450962
+32
+2467.86677472752
+13
+-8.36525637937127
+23
+-741.702917450962
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-116.789200000014
+30
+2467.86677472752
+11
+1.9856550251518e-05
+21
+-741.653447536011
+31
+2468.69068252346
+12
+1.98565501612791e-05
+22
+-116.789200000014
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+-116.789200000014
+33
+2468.69068252346
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.822271375713
+20
+-741.794325934758
+30
+2461.46426948223
+11
+-16.4090597408473
+21
+-116.789200000014
+31
+2465.42671365422
+12
+-23.8222713757131
+22
+-116.789200000014
+32
+2461.46426948223
+13
+-23.8222713757131
+23
+-116.789200000014
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+-116.789200000014
+30
+2465.42671365422
+11
+-23.822271375713
+21
+-741.794325934758
+31
+2461.46426948223
+12
+-16.4090597408471
+22
+-741.750486264824
+32
+2465.42671365422
+13
+-16.4090597408471
+23
+-741.750486264824
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+0.0
+30
+2390.15911280603
+11
+-30.3200057182179
+21
+-70.0735200000139
+31
+2395.49166556936
+12
+-30.3200057182179
+22
+0.0
+32
+2395.49166556936
+13
+-30.3200057182179
+23
+0.0
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182179
+20
+-70.0735200000139
+30
+2395.49166556936
+11
+-23.8222713757131
+21
+0.0
+31
+2390.15911280603
+12
+-23.8222713757131
+22
+-70.0735200000139
+32
+2390.15911280603
+13
+-23.8222713757131
+23
+-70.0735200000139
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+0.0
+30
+2434.17696738005
+11
+-42.878971522786
+21
+-70.0735200000139
+31
+2425.81169114413
+12
+-42.0550637268397
+22
+-70.0735200000139
+32
+2434.17696738005
+13
+-42.0550637268397
+23
+-70.0735200000139
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-70.0735200000139
+30
+2425.81169114413
+11
+-42.0550637268397
+21
+0.0
+31
+2434.17696738005
+12
+-42.878971522786
+22
+0.0
+32
+2425.81169114413
+13
+-42.878971522786
+23
+0.0
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+0.0
+30
+2417.44641490821
+11
+42.8790112358864
+21
+-70.0735200000139
+31
+2425.81169114413
+12
+42.05510343994
+22
+-70.0735200000139
+32
+2417.44641490821
+13
+42.05510343994
+23
+-70.0735200000139
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790112358864
+20
+-70.0735200000139
+30
+2425.81169114413
+11
+42.05510343994
+21
+0.0
+31
+2417.44641490821
+12
+42.8790112358864
+22
+0.0
+32
+2425.81169114413
+13
+42.8790112358864
+23
+0.0
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.98565501612791e-05
+20
+0.0
+30
+2382.93269976479
+11
+-8.36525637937127
+21
+-70.0735200000139
+31
+2383.75660756074
+12
+-8.36525637937127
+22
+0.0
+32
+2383.75660756074
+13
+-8.36525637937127
+23
+0.0
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-70.0735200000139
+30
+2383.75660756074
+11
+1.98565501612791e-05
+21
+0.0
+31
+2382.93269976479
+12
+1.98565501612791e-05
+22
+-70.0735200000139
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-70.0735200000139
+33
+2382.93269976479
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+-70.0735200000139
+30
+2461.46426948223
+11
+-30.3200057182179
+21
+0.0
+31
+2456.13171671889
+12
+-30.3200057182179
+22
+-70.0735200000139
+32
+2456.13171671889
+13
+-30.3200057182179
+23
+-70.0735200000139
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182179
+20
+0.0
+30
+2456.13171671889
+11
+-23.8222713757131
+21
+-70.0735200000139
+31
+2461.46426948223
+12
+-23.8222713757131
+22
+0.0
+32
+2461.46426948223
+13
+-23.8222713757131
+23
+0.0
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539477
+20
+-70.0735200000139
+30
+2465.42671365422
+11
+8.36529609247169
+21
+0.0
+31
+2467.86677472752
+12
+8.36529609247169
+22
+-70.0735200000139
+32
+2467.86677472752
+13
+8.36529609247169
+23
+-70.0735200000139
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+0.0
+30
+2467.86677472752
+11
+16.4090994539477
+21
+-70.0735200000139
+31
+2465.42671365422
+12
+16.4090994539477
+22
+0.0
+32
+2465.42671365422
+13
+16.4090994539477
+23
+0.0
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-741.864286959411
+30
+2449.63398237639
+11
+-39.6150026535464
+21
+-116.789200000014
+31
+2442.22077074152
+12
+-39.6150026535458
+22
+-741.887719751186
+32
+2442.22077074152
+13
+-39.6150026535458
+23
+-741.887719751186
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+-116.789200000014
+30
+2442.22077074152
+11
+-35.6525584815506
+21
+-741.864286959411
+31
+2449.63398237639
+12
+-35.6525584815506
+22
+-116.789200000014
+32
+2449.63398237639
+13
+-35.6525584815506
+23
+-116.789200000014
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-70.0735200000139
+30
+2035.20210659002
+11
+42.0550941197328
+21
+-116.789200000014
+31
+2026.83683127205
+12
+42.8790110274535
+22
+-116.789200000014
+32
+2035.20210659002
+13
+42.8790110274535
+23
+-116.789200000014
+33
+2035.20210659002
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550941197328
+20
+-116.789200000014
+30
+2026.83683127205
+11
+42.8790110274535
+21
+-70.0735200000139
+31
+2035.20210659002
+12
+42.0550941197328
+22
+-70.0735200000139
+32
+2026.83683127205
+13
+42.0550941197328
+23
+-70.0735200000139
+33
+2026.83683127205
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+-116.789200000014
+30
+2417.44641490821
+11
+42.8790112358864
+21
+-741.39987311756
+31
+2425.81169114413
+12
+42.0551034399399
+22
+-741.404745478908
+32
+2417.44641490821
+13
+42.0551034399399
+23
+-741.404745478908
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790112358864
+20
+-741.39987311756
+30
+2425.81169114413
+11
+42.05510343994
+21
+-116.789200000014
+31
+2417.44641490821
+12
+42.8790112358864
+22
+-116.789200000014
+32
+2425.81169114413
+13
+42.8790112358864
+23
+-116.789200000014
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8223102646976
+20
+-116.789200000014
+30
+1999.54960100809
+11
+-30.3200387817157
+21
+-70.0735200000139
+31
+2004.88216083759
+12
+-30.3200387817157
+22
+-116.789200000014
+32
+2004.88216083759
+13
+-30.3200387817157
+23
+-116.789200000014
+33
+2004.88216083759
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200387817157
+20
+-70.0735200000139
+30
+2004.88216083759
+11
+-23.8223102646976
+21
+-116.789200000014
+31
+1999.54960100809
+12
+-23.8223102646976
+22
+-70.0735200000139
+32
+1999.54960100809
+13
+-23.8223102646976
+23
+-70.0735200000139
+33
+1999.54960100809
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+0.0
+30
+2395.49166556936
+11
+23.8223110888135
+21
+-70.0735200000139
+31
+2390.15911280603
+12
+23.8223110888135
+22
+0.0
+32
+2390.15911280603
+13
+23.8223110888135
+23
+0.0
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+-70.0735200000139
+30
+2390.15911280603
+11
+30.3200454313183
+21
+0.0
+31
+2395.49166556936
+12
+30.3200454313183
+22
+-70.0735200000139
+32
+2395.49166556936
+13
+30.3200454313183
+23
+-70.0735200000139
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+0.0
+30
+2401.98939991186
+11
+39.6150423666467
+21
+-70.0735200000139
+31
+2409.40261154673
+12
+35.652598194651
+22
+-70.0735200000139
+32
+2401.98939991186
+13
+35.652598194651
+23
+-70.0735200000139
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666467
+20
+-70.0735200000139
+30
+2409.40261154673
+11
+35.652598194651
+21
+0.0
+31
+2401.98939991186
+12
+39.6150423666467
+22
+0.0
+32
+2409.40261154673
+13
+39.6150423666467
+23
+0.0
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.3653417859741
+20
+-70.0735200000139
+30
+2077.25722767309
+11
+6.64680129382589e-05
+21
+-116.789200000014
+31
+2078.08114458081
+12
+6.64680129382589e-05
+22
+-70.0735200000139
+32
+2078.08114458081
+13
+6.64680129382589e-05
+23
+-70.0735200000139
+33
+2078.08114458081
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-116.789200000014
+30
+2078.08114458081
+11
+8.3653417859741
+21
+-70.0735200000139
+31
+2077.25722767309
+12
+8.3653417859741
+22
+-116.789200000014
+32
+2077.25722767309
+13
+8.3653417859741
+23
+-116.789200000014
+33
+2077.25722767309
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550941197328
+20
+-70.0735200000139
+30
+2026.83683127205
+11
+39.6150242888304
+21
+-116.789200000014
+31
+2018.79303058852
+12
+42.0550941197328
+22
+-116.789200000014
+32
+2026.83683127205
+13
+42.0550941197328
+23
+-116.789200000014
+33
+2026.83683127205
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150242888304
+20
+-116.789200000014
+30
+2018.79303058852
+11
+42.0550941197328
+21
+-70.0735200000139
+31
+2026.83683127205
+12
+39.6150242888304
+22
+-70.0735200000139
+32
+2018.79303058852
+13
+39.6150242888304
+23
+-70.0735200000139
+33
+2018.79303058852
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200948028707
+20
+-70.0735200000139
+30
+1710.59234602203
+11
+23.8223691906999
+21
+-116.789200000014
+31
+1715.9249093911
+12
+23.8223691906999
+22
+-70.0735200000139
+32
+1715.9249093911
+13
+23.8223691906999
+23
+-70.0735200000139
+33
+1715.9249093911
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223691906999
+20
+-116.789200000014
+30
+1715.9249093911
+11
+30.3200948028707
+21
+-70.0735200000139
+31
+1710.59234602203
+12
+30.3200948028707
+22
+-116.789200000014
+32
+1710.59234602203
+13
+30.3200948028707
+23
+-116.789200000014
+33
+1710.59234602203
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4091029648416
+20
+-116.789200000014
+30
+1995.5871487692
+11
+-23.8223102646976
+21
+-70.0735200000139
+31
+1999.54960100809
+12
+-23.8223102646976
+22
+-116.789200000014
+32
+1999.54960100809
+13
+-23.8223102646976
+23
+-116.789200000014
+33
+1999.54960100809
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8223102646976
+20
+-70.0735200000139
+30
+1999.54960100809
+11
+-16.4091029648416
+21
+-116.789200000014
+31
+1995.5871487692
+12
+-16.4091029648416
+22
+-70.0735200000139
+32
+1995.5871487692
+13
+-16.4091029648416
+23
+-70.0735200000139
+33
+1995.5871487692
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815511
+20
+-841.493538994769
+30
+2401.98939991186
+11
+-30.3200057182179
+21
+-116.789200000014
+31
+2395.49166556936
+12
+-30.3200057182178
+22
+-847.173357521512
+32
+2395.49166556936
+13
+-30.3200057182178
+23
+-847.173357521512
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182179
+20
+-116.789200000014
+30
+2395.49166556936
+11
+-35.6525584815511
+21
+-841.493538994769
+31
+2401.98939991186
+12
+-35.6525584815506
+22
+-116.789200000014
+32
+2401.98939991186
+13
+-35.6525584815506
+23
+-116.789200000014
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-712.59031140046
+20
+-116.789200000014
+30
+1614.76108002137
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+1614.76108002137
+12
+-717.191404282444
+22
+-70.0735200000139
+32
+1614.76108002137
+13
+-717.191404282444
+23
+-70.0735200000139
+33
+1614.76108002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-70.0735200000139
+30
+1614.76108002137
+11
+-712.59031140046
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-93.4313636055058
+22
+-116.789200000014
+32
+1614.76108002137
+13
+-93.4313636055058
+23
+-116.789200000014
+33
+1614.76108002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247178
+20
+-741.60397762106
+30
+2467.86677472752
+11
+16.4090994539477
+21
+-116.789200000014
+31
+2465.42671365422
+12
+8.36529609247169
+22
+-116.789200000014
+32
+2467.86677472752
+13
+8.36529609247169
+23
+-116.789200000014
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539477
+20
+-116.789200000014
+30
+2465.42671365422
+11
+8.36529609247178
+21
+-741.60397762106
+31
+2467.86677472752
+12
+16.4090994539477
+22
+-741.556408807198
+32
+2465.42671365422
+13
+16.4090994539477
+23
+-741.556408807198
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550500581767
+20
+-70.0735200000139
+30
+1688.63771501308
+11
+-39.6149758455043
+21
+-116.789200000014
+31
+1696.68151436742
+12
+-42.0550500581767
+22
+-116.789200000014
+32
+1688.63771501308
+13
+-42.0550500581767
+23
+-116.789200000014
+33
+1688.63771501308
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6149758455043
+20
+-116.789200000014
+30
+1696.68151436742
+11
+-42.0550500581767
+21
+-70.0735200000139
+31
+1688.63771501308
+12
+-39.6149758455043
+22
+-70.0735200000139
+32
+1696.68151436742
+13
+-39.6149758455043
+23
+-70.0735200000139
+33
+1696.68151436742
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550895628442
+20
+-70.0735200000139
+30
+1671.90702512775
+11
+39.6150153501718
+21
+-116.789200000014
+31
+1663.86322577341
+12
+42.0550895628442
+22
+-116.789200000014
+32
+1671.90702512775
+13
+42.0550895628442
+23
+-116.789200000014
+33
+1671.90702512775
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150153501718
+20
+-116.789200000014
+30
+1663.86322577341
+11
+42.0550895628442
+21
+-70.0735200000139
+31
+1671.90702512775
+12
+39.6150153501718
+22
+-70.0735200000139
+32
+1663.86322577341
+13
+39.6150153501718
+23
+-70.0735200000139
+33
+1663.86322577341
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+0.0
+30
+2449.63398237639
+11
+-39.6150026535464
+21
+-70.0735200000139
+31
+2442.22077074152
+12
+-35.6525584815506
+22
+-70.0735200000139
+32
+2449.63398237639
+13
+-35.6525584815506
+23
+-70.0735200000139
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+-70.0735200000139
+30
+2442.22077074152
+11
+-35.6525584815506
+21
+0.0
+31
+2449.63398237639
+12
+-39.6150026535464
+22
+0.0
+32
+2442.22077074152
+13
+-39.6150026535464
+23
+0.0
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+-93.4313636055058
+21
+-116.789200000014
+31
+1614.76108002137
+12
+-93.4313636055058
+22
+-116.789200000014
+32
+2549.07468002137
+13
+-93.4313636055058
+23
+-116.789200000014
+33
+2549.07468002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-116.789200000014
+30
+1614.76108002137
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-93.4313636055058
+22
+-70.0735200000139
+32
+1614.76108002137
+13
+-93.4313636055058
+23
+-70.0735200000139
+33
+1614.76108002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+6.64680129382589e-05
+20
+-70.0735200000139
+30
+2078.08114458081
+11
+-8.36521064520558
+21
+-116.789200000014
+31
+2077.25724590065
+12
+-8.36521064520558
+22
+-70.0735200000139
+32
+2077.25724590065
+13
+-8.36521064520558
+23
+-70.0735200000139
+33
+2077.25724590065
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36521064520558
+20
+-116.789200000014
+30
+2077.25724590065
+11
+6.64680129382589e-05
+21
+-70.0735200000139
+31
+2078.08114458081
+12
+6.64680129382589e-05
+22
+-116.789200000014
+32
+2078.08114458081
+13
+6.64680129382589e-05
+23
+-116.789200000014
+33
+2078.08114458081
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200782863833
+20
+-70.0735200000139
+30
+2065.5221457738
+11
+23.8223497693652
+21
+-116.789200000014
+31
+2070.8547056033
+12
+23.8223497693652
+22
+-70.0735200000139
+32
+2070.8547056033
+13
+23.8223497693652
+23
+-70.0735200000139
+33
+2070.8547056033
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223497693652
+20
+-116.789200000014
+30
+2070.8547056033
+11
+30.3200782863833
+21
+-70.0735200000139
+31
+2065.5221457738
+12
+30.3200782863833
+22
+-116.789200000014
+32
+2065.5221457738
+13
+30.3200782863833
+23
+-116.789200000014
+33
+2065.5221457738
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090166455219
+20
+-70.0735200000139
+30
+2074.81719359682
+11
+-23.8222325793624
+21
+-116.789200000014
+31
+2070.85475751098
+12
+-23.8222325793624
+22
+-70.0735200000139
+32
+2070.85475751098
+13
+-23.8222325793624
+23
+-70.0735200000139
+33
+2070.85475751098
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222325793624
+20
+-116.789200000014
+30
+2070.85475751098
+11
+-16.4090166455219
+21
+-70.0735200000139
+31
+2074.81719359682
+12
+-16.4090166455219
+22
+-116.789200000014
+32
+2074.81719359682
+13
+-16.4090166455219
+23
+-116.789200000014
+33
+2074.81719359682
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.9856550251518e-05
+20
+-741.653447536011
+30
+2468.69068252346
+11
+8.36529609247169
+21
+-116.789200000014
+31
+2467.86677472752
+12
+1.98565501612791e-05
+22
+-116.789200000014
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+-116.789200000014
+33
+2468.69068252346
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-116.789200000014
+30
+2467.86677472752
+11
+1.9856550251518e-05
+21
+-741.653447536011
+31
+2468.69068252346
+12
+8.36529609247178
+22
+-741.60397762106
+32
+2467.86677472752
+13
+8.36529609247178
+23
+-741.60397762106
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+0.0
+30
+2383.75660756074
+11
+-16.4090597408473
+21
+-70.0735200000139
+31
+2386.19666863403
+12
+-16.4090597408473
+22
+0.0
+32
+2386.19666863403
+13
+-16.4090597408473
+23
+0.0
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+-70.0735200000139
+30
+2386.19666863403
+11
+-8.36525637937127
+21
+0.0
+31
+2383.75660756074
+12
+-8.36525637937127
+22
+-70.0735200000139
+32
+2383.75660756074
+13
+-8.36525637937127
+23
+-70.0735200000139
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+-116.789200000014
+30
+2395.49166556936
+11
+35.6525981946511
+21
+-841.49353899477
+31
+2401.98939991186
+12
+30.3200454313184
+22
+-847.173357521512
+32
+2395.49166556936
+13
+30.3200454313184
+23
+-847.173357521512
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6525981946511
+20
+-841.49353899477
+30
+2401.98939991186
+11
+30.3200454313183
+21
+-116.789200000014
+31
+2395.49166556936
+12
+35.652598194651
+22
+-116.789200000014
+32
+2401.98939991186
+13
+35.652598194651
+23
+-116.789200000014
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652572049941
+20
+-70.0735200000139
+30
+2011.37982328866
+11
+30.3200122204362
+21
+-116.789200000014
+31
+2004.88209477165
+12
+35.652572049941
+22
+-116.789200000014
+32
+2011.37982328866
+13
+35.652572049941
+23
+-116.789200000014
+33
+2011.37982328866
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200122204362
+20
+-116.789200000014
+30
+2004.88209477165
+11
+35.652572049941
+21
+-70.0735200000139
+31
+2011.37982328866
+12
+30.3200122204362
+22
+-70.0735200000139
+32
+2004.88209477165
+13
+30.3200122204362
+23
+-70.0735200000139
+33
+2004.88209477165
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4091245446726
+20
+-116.789200000014
+30
+1640.65737447258
+11
+-23.8223296860324
+21
+-70.0735200000139
+31
+1644.61983074973
+12
+-23.8223296860324
+22
+-116.789200000014
+32
+1644.61983074973
+13
+-23.8223296860324
+23
+-116.789200000014
+33
+1644.61983074973
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8223296860324
+20
+-70.0735200000139
+30
+1644.61983074973
+11
+-16.4091245446726
+21
+-116.789200000014
+31
+1640.65737447258
+12
+-16.4091245446726
+22
+-70.0735200000139
+32
+1640.65737447258
+13
+-16.4091245446726
+23
+-70.0735200000139
+33
+1640.65737447258
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+0.0
+30
+2449.63398237639
+11
+30.3200454313183
+21
+-70.0735200000139
+31
+2456.13171671889
+12
+35.652598194651
+22
+-70.0735200000139
+32
+2449.63398237639
+13
+35.652598194651
+23
+-70.0735200000139
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+-70.0735200000139
+30
+2456.13171671889
+11
+35.652598194651
+21
+0.0
+31
+2449.63398237639
+12
+30.3200454313183
+22
+0.0
+32
+2456.13171671889
+13
+30.3200454313183
+23
+0.0
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-2.69633454074381e-05
+20
+-116.789200000014
+30
+1992.32316203057
+11
+-8.36530228130657
+21
+-70.0735200000139
+31
+1993.1470789383
+12
+-8.36530228130657
+22
+-116.789200000014
+32
+1993.1470789383
+13
+-8.36530228130657
+23
+-116.789200000014
+33
+1993.1470789383
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36530228130657
+20
+-70.0735200000139
+30
+1993.1470789383
+11
+-2.69633454074381e-05
+21
+-116.789200000014
+31
+1992.32316203057
+12
+-2.69633454074381e-05
+22
+-70.0735200000139
+32
+1992.32316203057
+13
+-2.69633454074381e-05
+23
+-70.0735200000139
+33
+1992.32316203057
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551123472866
+20
+-70.0735200000139
+30
+2043.56738370323
+11
+42.8790110274535
+21
+-116.789200000014
+31
+2035.20210659002
+12
+42.0551123472866
+22
+-116.789200000014
+32
+2043.56738370323
+13
+42.0551123472866
+23
+-116.789200000014
+33
+2043.56738370323
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-116.789200000014
+30
+2035.20210659002
+11
+42.0551123472866
+21
+-70.0735200000139
+31
+2043.56738370323
+12
+42.8790110274535
+22
+-70.0735200000139
+32
+2035.20210659002
+13
+42.8790110274535
+23
+-70.0735200000139
+33
+2035.20210659002
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36536469500046
+20
+-70.0735200000139
+30
+1722.32743988093
+11
+8.98258536075502e-05
+21
+-116.789200000014
+31
+1723.15136134553
+12
+8.98258536075502e-05
+22
+-70.0735200000139
+32
+1723.15136134553
+13
+8.98258536075502e-05
+23
+-70.0735200000139
+33
+1723.15136134553
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-116.789200000014
+30
+1723.15136134553
+11
+8.36536469500046
+21
+-70.0735200000139
+31
+1722.32743988093
+12
+8.36536469500046
+22
+-116.789200000014
+32
+1722.32743988093
+13
+8.36536469500046
+23
+-116.789200000014
+33
+1722.32743988093
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.98565501612791e-05
+20
+-70.0735200000139
+30
+2468.69068252346
+11
+-8.36525637937127
+21
+0.0
+31
+2467.86677472752
+12
+-8.36525637937127
+22
+-70.0735200000139
+32
+2467.86677472752
+13
+-8.36525637937127
+23
+-70.0735200000139
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+0.0
+30
+2467.86677472752
+11
+1.98565501612791e-05
+21
+-70.0735200000139
+31
+2468.69068252346
+12
+1.98565501612791e-05
+22
+0.0
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+0.0
+33
+2468.69068252346
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535458
+20
+-741.887719751186
+30
+2442.22077074152
+11
+-42.0550637268397
+21
+-116.789200000014
+31
+2434.17696738005
+12
+-42.0550637268397
+22
+-741.902149593115
+32
+2434.17696738005
+13
+-42.0550637268397
+23
+-741.902149593115
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-116.789200000014
+30
+2434.17696738005
+11
+-39.6150026535458
+21
+-741.887719751186
+31
+2442.22077074152
+12
+-39.6150026535464
+22
+-116.789200000014
+32
+2442.22077074152
+13
+-39.6150026535464
+23
+-116.789200000014
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.98258536075502e-05
+20
+-70.0735200000139
+30
+1723.15136134553
+11
+-8.36518773617931
+21
+-116.789200000014
+31
+1722.32746722226
+12
+-8.36518773617931
+22
+-70.0735200000139
+32
+1722.32746722226
+13
+-8.36518773617931
+23
+-70.0735200000139
+33
+1722.32746722226
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36518773617931
+20
+-116.789200000014
+30
+1722.32746722226
+11
+8.98258536075502e-05
+21
+-70.0735200000139
+31
+1723.15136134553
+12
+8.98258536075502e-05
+22
+-116.789200000014
+32
+1723.15136134553
+13
+8.98258536075502e-05
+23
+-116.789200000014
+33
+1723.15136134553
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36532519033293
+20
+-116.789200000014
+30
+1638.2173002599
+11
+-16.4091245446726
+21
+-70.0735200000139
+31
+1640.65737447258
+12
+-16.4091245446726
+22
+-116.789200000014
+32
+1640.65737447258
+13
+-16.4091245446726
+23
+-116.789200000014
+33
+1640.65737447258
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4091245446726
+20
+-70.0735200000139
+30
+1640.65737447258
+11
+-8.36532519033293
+21
+-116.789200000014
+31
+1638.2173002599
+12
+-8.36532519033293
+22
+-70.0735200000139
+32
+1638.2173002599
+13
+-8.36532519033293
+23
+-70.0735200000139
+33
+1638.2173002599
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-116.789200000014
+30
+2549.07468002137
+11
+-93.4313636055058
+21
+-70.0735200000139
+31
+2549.07468002137
+12
+-93.4313636055058
+22
+-116.789200000014
+32
+2549.07468002137
+13
+-93.4313636055058
+23
+-116.789200000014
+33
+2549.07468002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-93.4313636055058
+20
+-70.0735200000139
+30
+2549.07468002137
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+93.4313563944944
+22
+-70.0735200000139
+32
+2549.07468002137
+13
+93.4313563944944
+23
+-70.0735200000139
+33
+2549.07468002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551034399401
+20
+-741.404745478907
+30
+2434.17696738005
+11
+39.6150423666468
+21
+-116.789200000014
+31
+2442.22077074152
+12
+39.6150423666469
+22
+-741.419175320836
+32
+2442.22077074152
+13
+39.6150423666469
+23
+-741.419175320836
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666468
+20
+-116.789200000014
+30
+2442.22077074152
+11
+42.0551034399401
+21
+-741.404745478907
+31
+2434.17696738005
+12
+42.05510343994
+22
+-116.789200000014
+32
+2434.17696738005
+13
+42.05510343994
+23
+-116.789200000014
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-116.789200000014
+30
+2383.75660756074
+11
+-16.4090597408471
+21
+-855.298327398157
+31
+2386.19666863403
+12
+-16.4090597408473
+22
+-116.789200000014
+32
+2386.19666863403
+13
+-16.4090597408473
+23
+-116.789200000014
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408471
+20
+-855.298327398157
+30
+2386.19666863403
+11
+-8.36525637937127
+21
+-116.789200000014
+31
+2383.75660756074
+12
+-8.36525637937127
+22
+-857.431240712236
+32
+2383.75660756074
+13
+-8.36525637937127
+23
+-857.431240712236
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090561501895
+20
+-116.789200000014
+30
+1995.58711301456
+11
+8.36525014987311
+21
+-70.0735200000139
+31
+1993.14706071074
+12
+8.36525014987311
+22
+-116.789200000014
+32
+1993.14706071074
+13
+8.36525014987311
+23
+-116.789200000014
+33
+1993.14706071074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36525014987311
+20
+-70.0735200000139
+30
+1993.14706071074
+11
+16.4090561501895
+21
+-116.789200000014
+31
+1995.58711301456
+12
+16.4090561501895
+22
+-70.0735200000139
+32
+1995.58711301456
+13
+16.4090561501895
+23
+-70.0735200000139
+33
+1995.58711301456
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790110274535
+20
+-70.0735200000139
+30
+1680.2722999969
+11
+42.0550895628442
+21
+-116.789200000014
+31
+1671.90702512775
+12
+42.8790110274535
+22
+-116.789200000014
+32
+1680.2722999969
+13
+42.8790110274535
+23
+-116.789200000014
+33
+1680.2722999969
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0550895628442
+20
+-116.789200000014
+30
+1671.90702512775
+11
+42.8790110274535
+21
+-70.0735200000139
+31
+1680.2722999969
+12
+42.0550895628442
+22
+-70.0735200000139
+32
+1671.90702512775
+13
+42.0550895628442
+23
+-70.0735200000139
+33
+1671.90702512775
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.615068982122
+20
+-70.0735200000139
+30
+1696.68138488844
+11
+42.0551169041753
+21
+-116.789200000014
+31
+1688.63757755893
+12
+39.615068982122
+22
+-116.789200000014
+32
+1696.68138488844
+13
+39.615068982122
+23
+-116.789200000014
+33
+1696.68138488844
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551169041753
+20
+-116.789200000014
+30
+1688.63757755893
+11
+39.615068982122
+21
+-70.0735200000139
+31
+1696.68138488844
+12
+42.0551169041753
+22
+-70.0735200000139
+32
+1688.63757755893
+13
+42.0551169041753
+23
+-70.0735200000139
+33
+1688.63757755893
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.652597429876
+20
+-70.0735200000139
+30
+1656.45013716005
+11
+-39.6150294774544
+21
+-116.789200000014
+31
+1663.86335525239
+12
+-35.652597429876
+22
+-116.789200000014
+32
+1656.45013716005
+13
+-35.652597429876
+23
+-116.789200000014
+33
+1656.45013716005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150294774544
+20
+-116.789200000014
+30
+1663.86335525239
+11
+-35.652597429876
+21
+-70.0735200000139
+31
+1656.45013716005
+12
+-39.6150294774544
+22
+-70.0735200000139
+32
+1663.86335525239
+13
+-39.6150294774544
+23
+-70.0735200000139
+33
+1663.86335525239
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150600434633
+20
+-70.0735200000139
+30
+2051.61118970355
+11
+42.0551123472866
+21
+-116.789200000014
+31
+2043.56738370323
+12
+39.6150600434633
+22
+-116.789200000014
+32
+2051.61118970355
+13
+39.6150600434633
+23
+-116.789200000014
+33
+2051.61118970355
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551123472866
+20
+-116.789200000014
+30
+2043.56738370323
+11
+39.6150600434633
+21
+-70.0735200000139
+31
+2051.61118970355
+12
+42.0551123472866
+22
+-70.0735200000139
+32
+2043.56738370323
+13
+42.0551123472866
+23
+-70.0735200000139
+33
+2043.56738370323
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-857.431240712237
+30
+2383.75660756074
+11
+-8.36525637937127
+21
+-857.431240712236
+31
+2383.75660756074
+12
+1.98565501612791e-05
+22
+-858.151437401893
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-858.151437401893
+33
+2382.93269976479
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-857.431240712236
+30
+2383.75660756074
+11
+8.36529609247169
+21
+-857.431240712237
+31
+2383.75660756074
+12
+16.4090994539476
+22
+-855.298327398158
+32
+2386.19666863403
+13
+16.4090994539476
+23
+-855.298327398158
+33
+2386.19666863403
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-857.431240712236
+30
+2383.75660756074
+11
+16.4090994539476
+21
+-855.298327398158
+31
+2386.19666863403
+12
+-16.4090597408471
+22
+-855.298327398157
+32
+2386.19666863403
+13
+-16.4090597408471
+23
+-855.298327398157
+33
+2386.19666863403
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408471
+20
+-855.298327398157
+30
+2386.19666863403
+11
+16.4090994539476
+21
+-855.298327398158
+31
+2386.19666863403
+12
+23.8223110888136
+22
+-851.834664122165
+32
+2390.15911280603
+13
+23.8223110888136
+23
+-851.834664122165
+33
+2390.15911280603
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408471
+20
+-855.298327398157
+30
+2386.19666863403
+11
+23.8223110888136
+21
+-851.834664122165
+31
+2390.15911280603
+12
+-23.822271375713
+22
+-851.834664122165
+32
+2390.15911280603
+13
+-23.822271375713
+23
+-851.834664122165
+33
+2390.15911280603
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.822271375713
+20
+-851.834664122165
+30
+2390.15911280603
+11
+23.8223110888136
+21
+-851.834664122165
+31
+2390.15911280603
+12
+30.3200454313184
+22
+-847.173357521512
+32
+2395.49166556936
+13
+30.3200454313184
+23
+-847.173357521512
+33
+2395.49166556936
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.822271375713
+20
+-851.834664122165
+30
+2390.15911280603
+11
+30.3200454313184
+21
+-847.173357521512
+31
+2395.49166556936
+12
+-30.3200057182178
+22
+-847.173357521512
+32
+2395.49166556936
+13
+-30.3200057182178
+23
+-847.173357521512
+33
+2395.49166556936
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182178
+20
+-847.173357521512
+30
+2395.49166556936
+11
+30.3200454313184
+21
+-847.173357521512
+31
+2395.49166556936
+12
+35.6525981946511
+22
+-841.49353899477
+32
+2401.98939991186
+13
+35.6525981946511
+23
+-841.49353899477
+33
+2401.98939991186
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182178
+20
+-847.173357521512
+30
+2395.49166556936
+11
+35.6525981946511
+21
+-841.49353899477
+31
+2401.98939991186
+12
+-35.6525584815511
+22
+-841.493538994769
+32
+2401.98939991186
+13
+-35.6525584815511
+23
+-841.493538994769
+33
+2401.98939991186
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815511
+20
+-841.493538994769
+30
+2401.98939991186
+11
+35.6525981946511
+21
+-841.49353899477
+31
+2401.98939991186
+12
+39.3611647970471
+22
+-835.428664280087
+32
+2408.9276400213
+13
+39.3611647970471
+23
+-835.428664280087
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815511
+20
+-841.493538994769
+30
+2401.98939991186
+11
+39.3611647970471
+21
+-835.428664280087
+31
+2408.9276400213
+12
+-39.3611250839466
+22
+-835.428664280087
+32
+2408.9276400213
+13
+-39.3611250839466
+23
+-835.428664280087
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539476
+20
+-116.789200000014
+30
+2386.19666863403
+11
+8.36529609247169
+21
+-857.431240712237
+31
+2383.75660756074
+12
+8.36529609247169
+22
+-116.789200000014
+32
+2383.75660756074
+13
+8.36529609247169
+23
+-116.789200000014
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-857.431240712237
+30
+2383.75660756074
+11
+16.4090994539476
+21
+-116.789200000014
+31
+2386.19666863403
+12
+16.4090994539476
+22
+-855.298327398158
+32
+2386.19666863403
+13
+16.4090994539476
+23
+-855.298327398158
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182176
+20
+-741.832751726833
+30
+2456.13171671889
+11
+-23.8222713757131
+21
+-116.789200000014
+31
+2461.46426948223
+12
+-30.3200057182179
+22
+-116.789200000014
+32
+2456.13171671889
+13
+-30.3200057182179
+23
+-116.789200000014
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+-116.789200000014
+30
+2461.46426948223
+11
+-30.3200057182176
+21
+-741.832751726833
+31
+2456.13171671889
+12
+-23.822271375713
+22
+-741.794325934758
+32
+2461.46426948223
+13
+-23.822271375713
+23
+-741.794325934758
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4322738363532
+20
+-70.0735200000139
+30
+1614.76107890595
+11
+93.4313563944944
+21
+-116.789200000014
+31
+2549.07468002137
+12
+93.4322738363532
+22
+-116.789200000014
+32
+1614.76107890595
+13
+93.4322738363532
+23
+-116.789200000014
+33
+1614.76107890595
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+93.4313563944944
+20
+-116.789200000014
+30
+2549.07468002137
+11
+93.4322738363532
+21
+-70.0735200000139
+31
+1614.76107890595
+12
+93.4313563944944
+22
+-70.0735200000139
+32
+2549.07468002137
+13
+93.4313563944944
+23
+-70.0735200000139
+33
+2549.07468002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182176
+20
+-741.832751726833
+30
+2456.13171671889
+11
+-35.6525584815506
+21
+-116.789200000014
+31
+2449.63398237639
+12
+-35.6525584815506
+22
+-741.864286959411
+32
+2449.63398237639
+13
+-35.6525584815506
+23
+-741.864286959411
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-116.789200000014
+30
+2449.63398237639
+11
+-30.3200057182176
+21
+-741.832751726833
+31
+2456.13171671889
+12
+-30.3200057182179
+22
+-116.789200000014
+32
+2456.13171671889
+13
+-30.3200057182179
+23
+-116.789200000014
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+-116.789200000014
+30
+2390.15911280603
+11
+16.4090994539476
+21
+-855.298327398158
+31
+2386.19666863403
+12
+16.4090994539476
+22
+-116.789200000014
+32
+2386.19666863403
+13
+16.4090994539476
+23
+-116.789200000014
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539476
+20
+-855.298327398158
+30
+2386.19666863403
+11
+23.8223110888135
+21
+-116.789200000014
+31
+2390.15911280603
+12
+23.8223110888136
+22
+-851.834664122165
+32
+2390.15911280603
+13
+23.8223110888136
+23
+-851.834664122165
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200782863833
+20
+-70.0735200000139
+30
+2065.5221457738
+11
+35.6526239576226
+21
+-116.789200000014
+31
+2059.02440563739
+12
+30.3200782863833
+22
+-116.789200000014
+32
+2065.5221457738
+13
+30.3200782863833
+23
+-116.789200000014
+33
+2065.5221457738
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6526239576226
+20
+-116.789200000014
+30
+2059.02440563739
+11
+30.3200782863833
+21
+-70.0735200000139
+31
+2065.5221457738
+12
+35.6526239576226
+22
+-70.0735200000139
+32
+2059.02440563739
+13
+35.6526239576226
+23
+-70.0735200000139
+33
+2059.02440563739
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090345703586
+20
+-116.789200000014
+30
+1640.65732084063
+11
+8.36522724084684
+21
+-70.0735200000139
+31
+1638.21727291857
+12
+8.36522724084684
+22
+-116.789200000014
+32
+1638.21727291857
+13
+8.36522724084684
+23
+-116.789200000014
+33
+1638.21727291857
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36522724084684
+20
+-70.0735200000139
+30
+1638.21727291857
+11
+16.4090345703586
+21
+-116.789200000014
+31
+1640.65732084063
+12
+16.4090345703586
+22
+-70.0735200000139
+32
+1640.65732084063
+13
+16.4090345703586
+23
+-70.0735200000139
+33
+1640.65732084063
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666467
+20
+0.0
+30
+2409.40261154673
+11
+42.05510343994
+21
+-70.0735200000139
+31
+2417.44641490821
+12
+39.6150423666467
+22
+-70.0735200000139
+32
+2409.40261154673
+13
+39.6150423666467
+23
+-70.0735200000139
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+-70.0735200000139
+30
+2417.44641490821
+11
+39.6150423666467
+21
+0.0
+31
+2409.40261154673
+12
+42.05510343994
+22
+0.0
+32
+2417.44641490821
+13
+42.05510343994
+23
+0.0
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.3611647970476
+20
+-741.420676682108
+30
+2408.9276400213
+11
+-39.615002653547
+21
+-741.887719751186
+31
+2409.40261154673
+12
+-39.3611250839469
+22
+-741.886218389914
+32
+2408.9276400213
+13
+-39.3611250839469
+23
+-741.886218389914
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.615002653547
+20
+-741.887719751186
+30
+2409.40261154673
+11
+39.3611647970476
+21
+-741.420676682108
+31
+2408.9276400213
+12
+39.6150423666477
+22
+-741.419175320836
+32
+2409.40261154673
+13
+39.6150423666477
+23
+-741.419175320836
+33
+2409.40261154673
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.615002653547
+20
+-741.887719751186
+30
+2409.40261154673
+11
+39.6150423666477
+21
+-741.419175320836
+31
+2409.40261154673
+12
+-42.0550637268399
+22
+-741.902149593115
+32
+2417.44641490821
+13
+-42.0550637268399
+23
+-741.902149593115
+33
+2417.44641490821
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268399
+20
+-741.902149593115
+30
+2417.44641490821
+11
+39.6150423666477
+21
+-741.419175320836
+31
+2409.40261154673
+12
+42.0551034399399
+22
+-741.404745478908
+32
+2417.44641490821
+13
+42.0551034399399
+23
+-741.404745478908
+33
+2417.44641490821
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268399
+20
+-741.902149593115
+30
+2417.44641490821
+11
+42.0551034399399
+21
+-741.404745478908
+31
+2417.44641490821
+12
+42.8790112358864
+22
+-741.39987311756
+32
+2425.81169114413
+13
+42.8790112358864
+23
+-741.39987311756
+33
+2425.81169114413
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268399
+20
+-741.902149593115
+30
+2417.44641490821
+11
+42.8790112358864
+21
+-741.39987311756
+31
+2425.81169114413
+12
+-42.878971522786
+22
+-741.907021954462
+32
+2425.81169114413
+13
+-42.878971522786
+23
+-741.907021954462
+33
+2425.81169114413
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-741.907021954462
+30
+2425.81169114413
+11
+42.8790112358864
+21
+-741.39987311756
+31
+2425.81169114413
+12
+42.0551034399401
+22
+-741.404745478907
+32
+2434.17696738005
+13
+42.0551034399401
+23
+-741.404745478907
+33
+2434.17696738005
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-741.907021954462
+30
+2425.81169114413
+11
+42.0551034399401
+21
+-741.404745478907
+31
+2434.17696738005
+12
+-42.0550637268397
+22
+-741.902149593115
+32
+2434.17696738005
+13
+-42.0550637268397
+23
+-741.902149593115
+33
+2434.17696738005
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-741.902149593115
+30
+2434.17696738005
+11
+42.0551034399401
+21
+-741.404745478907
+31
+2434.17696738005
+12
+39.6150423666469
+22
+-741.419175320836
+32
+2442.22077074152
+13
+39.6150423666469
+23
+-741.419175320836
+33
+2442.22077074152
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-741.902149593115
+30
+2434.17696738005
+11
+39.6150423666469
+21
+-741.419175320836
+31
+2442.22077074152
+12
+-39.6150026535458
+22
+-741.887719751186
+32
+2442.22077074152
+13
+-39.6150026535458
+23
+-741.887719751186
+33
+2442.22077074152
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535458
+20
+-741.887719751186
+30
+2442.22077074152
+11
+39.6150423666469
+21
+-741.419175320836
+31
+2442.22077074152
+12
+35.6525981946522
+22
+-741.442608112612
+32
+2449.63398237639
+13
+35.6525981946522
+23
+-741.442608112612
+33
+2449.63398237639
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535458
+20
+-741.887719751186
+30
+2442.22077074152
+11
+35.6525981946522
+21
+-741.442608112612
+31
+2449.63398237639
+12
+-35.6525584815506
+22
+-741.864286959411
+32
+2449.63398237639
+13
+-35.6525584815506
+23
+-741.864286959411
+33
+2449.63398237639
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-741.864286959411
+30
+2449.63398237639
+11
+35.6525981946522
+21
+-741.442608112612
+31
+2449.63398237639
+12
+30.3200454313182
+22
+-741.474143345189
+32
+2456.13171671889
+13
+30.3200454313182
+23
+-741.474143345189
+33
+2456.13171671889
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-741.864286959411
+30
+2449.63398237639
+11
+30.3200454313182
+21
+-741.474143345189
+31
+2456.13171671889
+12
+-30.3200057182176
+22
+-741.832751726833
+32
+2456.13171671889
+13
+-30.3200057182176
+23
+-741.832751726833
+33
+2456.13171671889
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182176
+20
+-741.832751726833
+30
+2456.13171671889
+11
+30.3200454313182
+21
+-741.474143345189
+31
+2456.13171671889
+12
+23.8223110888134
+22
+-741.512569137265
+32
+2461.46426948223
+13
+23.8223110888134
+23
+-741.512569137265
+33
+2461.46426948223
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182176
+20
+-741.832751726833
+30
+2456.13171671889
+11
+23.8223110888134
+21
+-741.512569137265
+31
+2461.46426948223
+12
+-23.822271375713
+22
+-741.794325934758
+32
+2461.46426948223
+13
+-23.822271375713
+23
+-741.794325934758
+33
+2461.46426948223
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.822271375713
+20
+-741.794325934758
+30
+2461.46426948223
+11
+23.8223110888134
+21
+-741.512569137265
+31
+2461.46426948223
+12
+-16.4090597408471
+22
+-741.750486264824
+32
+2465.42671365422
+13
+-16.4090597408471
+23
+-741.750486264824
+33
+2465.42671365422
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408471
+20
+-741.750486264824
+30
+2465.42671365422
+11
+23.8223110888134
+21
+-741.512569137265
+31
+2461.46426948223
+12
+16.4090994539477
+22
+-741.556408807198
+32
+2465.42671365422
+13
+16.4090994539477
+23
+-741.556408807198
+33
+2465.42671365422
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408471
+20
+-741.750486264824
+30
+2465.42671365422
+11
+16.4090994539477
+21
+-741.556408807198
+31
+2465.42671365422
+12
+-8.36525637937127
+22
+-741.702917450962
+32
+2467.86677472752
+13
+-8.36525637937127
+23
+-741.702917450962
+33
+2467.86677472752
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-741.702917450962
+30
+2467.86677472752
+11
+16.4090994539477
+21
+-741.556408807198
+31
+2465.42671365422
+12
+8.36529609247178
+22
+-741.60397762106
+32
+2467.86677472752
+13
+8.36529609247178
+23
+-741.60397762106
+33
+2467.86677472752
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-741.702917450962
+30
+2467.86677472752
+11
+8.36529609247178
+21
+-741.60397762106
+31
+2467.86677472752
+12
+1.9856550251518e-05
+22
+-741.653447536011
+32
+2468.69068252346
+13
+1.9856550251518e-05
+23
+-741.653447536011
+33
+2468.69068252346
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+-70.0735200000139
+30
+2467.86677472752
+11
+1.98565501612791e-05
+21
+0.0
+31
+2468.69068252346
+12
+1.98565501612791e-05
+22
+-70.0735200000139
+32
+2468.69068252346
+13
+1.98565501612791e-05
+23
+-70.0735200000139
+33
+2468.69068252346
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.98565501612791e-05
+20
+0.0
+30
+2468.69068252346
+11
+8.36529609247169
+21
+-70.0735200000139
+31
+2467.86677472752
+12
+8.36529609247169
+22
+0.0
+32
+2467.86677472752
+13
+8.36529609247169
+23
+0.0
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150242888304
+20
+-70.0735200000139
+30
+2018.79303058852
+11
+35.652572049941
+21
+-116.789200000014
+31
+2011.37982328866
+12
+39.6150242888304
+22
+-116.789200000014
+32
+2018.79303058852
+13
+39.6150242888304
+23
+-116.789200000014
+33
+2018.79303058852
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652572049941
+20
+-116.789200000014
+30
+2011.37982328866
+11
+39.6150242888304
+21
+-70.0735200000139
+31
+2018.79303058852
+12
+35.652572049941
+22
+-70.0735200000139
+32
+2011.37982328866
+13
+35.652572049941
+23
+-70.0735200000139
+33
+2011.37982328866
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8222720840299
+20
+-116.789200000014
+30
+1999.54954910041
+11
+16.4090561501895
+21
+-70.0735200000139
+31
+1995.58711301456
+12
+16.4090561501895
+22
+-116.789200000014
+32
+1995.58711301456
+13
+16.4090561501895
+23
+-116.789200000014
+33
+1995.58711301456
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090561501895
+20
+-70.0735200000139
+30
+1995.58711301456
+11
+23.8222720840299
+21
+-116.789200000014
+31
+1999.54954910041
+12
+23.8222720840299
+22
+-70.0735200000139
+32
+1999.54954910041
+13
+23.8222720840299
+23
+-70.0735200000139
+33
+1999.54954910041
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-70.0735200000139
+30
+1680.27244014393
+11
+-42.0550500581767
+21
+-116.789200000014
+31
+1688.63771501308
+12
+-42.878971522786
+22
+-116.789200000014
+32
+1680.27244014393
+13
+-42.878971522786
+23
+-116.789200000014
+33
+1680.27244014393
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550500581767
+20
+-116.789200000014
+30
+1688.63771501308
+11
+-42.878971522786
+21
+-70.0735200000139
+31
+1680.27244014393
+12
+-42.0550500581767
+22
+-70.0735200000139
+32
+1688.63771501308
+13
+-42.0550500581767
+23
+-70.0735200000139
+33
+1688.63771501308
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+0.0
+30
+2401.98939991186
+11
+-30.3200057182179
+21
+-70.0735200000139
+31
+2395.49166556936
+12
+-35.6525584815506
+22
+-70.0735200000139
+32
+2401.98939991186
+13
+-35.6525584815506
+23
+-70.0735200000139
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182179
+20
+-70.0735200000139
+30
+2395.49166556936
+11
+-35.6525584815506
+21
+0.0
+31
+2401.98939991186
+12
+-30.3200057182179
+22
+0.0
+32
+2395.49166556936
+13
+-30.3200057182179
+23
+0.0
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+-116.789200000014
+30
+2395.49166556936
+11
+23.8223110888136
+21
+-851.834664122165
+31
+2390.15911280603
+12
+23.8223110888135
+22
+-116.789200000014
+32
+2390.15911280603
+13
+23.8223110888135
+23
+-116.789200000014
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888136
+20
+-851.834664122165
+30
+2390.15911280603
+11
+30.3200454313183
+21
+-116.789200000014
+31
+2395.49166556936
+12
+30.3200454313184
+22
+-847.173357521512
+32
+2395.49166556936
+13
+30.3200454313184
+23
+-847.173357521512
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+-116.789200000014
+30
+2409.40261154673
+11
+-39.3611250839469
+21
+-741.886218389914
+31
+2408.9276400213
+12
+-39.615002653547
+22
+-741.887719751186
+32
+2409.40261154673
+13
+-39.615002653547
+23
+-741.887719751186
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.3611250839466
+20
+-835.428664280087
+30
+2408.9276400213
+11
+-35.6525584815506
+21
+-116.789200000014
+31
+2401.98939991186
+12
+-35.6525584815511
+22
+-841.493538994769
+32
+2401.98939991186
+13
+-35.6525584815511
+23
+-841.493538994769
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-116.789200000014
+30
+2401.98939991186
+11
+-39.3611250839466
+21
+-835.428664280087
+31
+2408.9276400213
+12
+-39.3611250839469
+22
+-741.886218389914
+32
+2408.9276400213
+13
+-39.3611250839469
+23
+-741.886218389914
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-116.789200000014
+30
+2401.98939991186
+11
+-39.3611250839469
+21
+-741.886218389914
+31
+2408.9276400213
+12
+-39.6150026535464
+22
+-116.789200000014
+32
+2409.40261154673
+13
+-39.6150026535464
+23
+-116.789200000014
+33
+2409.40261154673
+70
+3
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36529609247169
+20
+0.0
+30
+2383.75660756074
+11
+1.98565501612791e-05
+21
+-70.0735200000139
+31
+2382.93269976479
+12
+1.98565501612791e-05
+22
+0.0
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+0.0
+33
+2382.93269976479
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.98565501612791e-05
+20
+-70.0735200000139
+30
+2382.93269976479
+11
+8.36529609247169
+21
+0.0
+31
+2383.75660756074
+12
+8.36529609247169
+22
+-70.0735200000139
+32
+2383.75660756074
+13
+8.36529609247169
+23
+-70.0735200000139
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-5.03211860767294e-05
+20
+-116.789200000014
+30
+1637.3933787953
+11
+-8.36532519033293
+21
+-70.0735200000139
+31
+1638.2173002599
+12
+-8.36532519033293
+22
+-116.789200000014
+32
+1638.2173002599
+13
+-8.36532519033293
+23
+-116.789200000014
+33
+1638.2173002599
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36532519033293
+20
+-70.0735200000139
+30
+1638.2173002599
+11
+-5.03211860767294e-05
+21
+-116.789200000014
+31
+1637.3933787953
+12
+-5.03211860767294e-05
+22
+-70.0735200000139
+32
+1637.3933787953
+13
+-5.03211860767294e-05
+23
+-70.0735200000139
+33
+1637.3933787953
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36530228130657
+20
+-116.789200000014
+30
+1993.1470789383
+11
+-16.4091029648416
+21
+-70.0735200000139
+31
+1995.5871487692
+12
+-16.4091029648416
+22
+-116.789200000014
+32
+1995.5871487692
+13
+-16.4091029648416
+23
+-116.789200000014
+33
+1995.5871487692
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4091029648416
+20
+-70.0735200000139
+30
+1995.5871487692
+11
+-8.36530228130657
+21
+-116.789200000014
+31
+1993.1470789383
+12
+-8.36530228130657
+22
+-70.0735200000139
+32
+1993.1470789383
+13
+-8.36530228130657
+23
+-70.0735200000139
+33
+1993.1470789383
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091424695092
+20
+-70.0735200000139
+30
+2074.81715784219
+11
+8.3653417859741
+21
+-116.789200000014
+31
+2077.25722767309
+12
+8.3653417859741
+22
+-70.0735200000139
+32
+2077.25722767309
+13
+8.3653417859741
+23
+-70.0735200000139
+33
+2077.25722767309
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.3653417859741
+20
+-116.789200000014
+30
+2077.25722767309
+11
+16.4091424695092
+21
+-70.0735200000139
+31
+2074.81715784219
+12
+16.4091424695092
+22
+-116.789200000014
+32
+2074.81715784219
+13
+16.4091424695092
+23
+-116.789200000014
+33
+2074.81715784219
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+0.0
+30
+2395.49166556936
+11
+35.652598194651
+21
+-70.0735200000139
+31
+2401.98939991186
+12
+30.3200454313183
+22
+-70.0735200000139
+32
+2395.49166556936
+13
+30.3200454313183
+23
+-70.0735200000139
+33
+2395.49166556936
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+-70.0735200000139
+30
+2401.98939991186
+11
+30.3200454313183
+21
+0.0
+31
+2395.49166556936
+12
+35.652598194651
+22
+0.0
+32
+2401.98939991186
+13
+35.652598194651
+23
+0.0
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-70.0735200000139
+30
+2467.86677472752
+11
+-16.4090597408473
+21
+0.0
+31
+2465.42671365422
+12
+-16.4090597408473
+22
+-70.0735200000139
+32
+2465.42671365422
+13
+-16.4090597408473
+23
+-70.0735200000139
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+0.0
+30
+2465.42671365422
+11
+-8.36525637937127
+21
+-70.0735200000139
+31
+2467.86677472752
+12
+-8.36525637937127
+22
+0.0
+32
+2467.86677472752
+13
+-8.36525637937127
+23
+0.0
+33
+2467.86677472752
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223497693652
+20
+-70.0735200000139
+30
+2070.8547056033
+11
+16.4091424695092
+21
+-116.789200000014
+31
+2074.81715784219
+12
+16.4091424695092
+22
+-70.0735200000139
+32
+2074.81715784219
+13
+16.4091424695092
+23
+-70.0735200000139
+33
+2074.81715784219
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4091424695092
+20
+-116.789200000014
+30
+2074.81715784219
+11
+23.8223497693652
+21
+-70.0735200000139
+31
+2070.8547056033
+12
+23.8223497693652
+22
+-116.789200000014
+32
+2070.8547056033
+13
+23.8223497693652
+23
+-116.789200000014
+33
+2070.8547056033
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200122204362
+20
+-116.789200000014
+30
+2004.88209477165
+11
+23.8222720840299
+21
+-70.0735200000139
+31
+1999.54954910041
+12
+23.8222720840299
+22
+-116.789200000014
+32
+1999.54954910041
+13
+23.8222720840299
+23
+-116.789200000014
+33
+1999.54954910041
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8222720840299
+20
+-70.0735200000139
+30
+1999.54954910041
+11
+30.3200122204362
+21
+-116.789200000014
+31
+2004.88209477165
+12
+30.3200122204362
+22
+-70.0735200000139
+32
+2004.88209477165
+13
+30.3200122204362
+23
+-70.0735200000139
+33
+2004.88209477165
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313183
+20
+-70.0735200000139
+30
+2456.13171671889
+11
+23.8223110888135
+21
+0.0
+31
+2461.46426948223
+12
+23.8223110888135
+22
+-70.0735200000139
+32
+2461.46426948223
+13
+23.8223110888135
+23
+-70.0735200000139
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+0.0
+30
+2461.46426948223
+11
+30.3200454313183
+21
+-70.0735200000139
+31
+2456.13171671889
+12
+30.3200454313183
+22
+0.0
+32
+2456.13171671889
+13
+30.3200454313183
+23
+0.0
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090597408473
+20
+-70.0735200000139
+30
+2465.42671365422
+11
+-23.8222713757131
+21
+0.0
+31
+2461.46426948223
+12
+-23.8222713757131
+22
+-70.0735200000139
+32
+2461.46426948223
+13
+-23.8222713757131
+23
+-70.0735200000139
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222713757131
+20
+0.0
+30
+2461.46426948223
+11
+-16.4090597408473
+21
+-70.0735200000139
+31
+2465.42671365422
+12
+-16.4090597408473
+22
+0.0
+32
+2465.42671365422
+13
+-16.4090597408473
+23
+0.0
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36525014987311
+20
+-116.789200000014
+30
+1993.14706071074
+11
+-2.69633454074381e-05
+21
+-70.0735200000139
+31
+1992.32316203057
+12
+-2.69633454074381e-05
+22
+-116.789200000014
+32
+1992.32316203057
+13
+-2.69633454074381e-05
+23
+-116.789200000014
+33
+1992.32316203057
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-2.69633454074381e-05
+20
+-70.0735200000139
+30
+1992.32316203057
+11
+8.36525014987311
+21
+-116.789200000014
+31
+1993.14706071074
+12
+8.36525014987311
+22
+-70.0735200000139
+32
+1993.14706071074
+13
+8.36525014987311
+23
+-70.0735200000139
+33
+1993.14706071074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+0.0
+30
+2390.15911280603
+11
+16.4090994539476
+21
+-70.0735200000139
+31
+2386.19666863403
+12
+16.4090994539476
+22
+0.0
+32
+2386.19666863403
+13
+16.4090994539476
+23
+0.0
+33
+2386.19666863403
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539476
+20
+-70.0735200000139
+30
+2386.19666863403
+11
+23.8223110888135
+21
+0.0
+31
+2390.15911280603
+12
+23.8223110888135
+22
+-70.0735200000139
+32
+2390.15911280603
+13
+23.8223110888135
+23
+-70.0735200000139
+33
+2390.15911280603
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.65255907302
+20
+-70.0735200000139
+30
+1656.45002063205
+11
+30.3199957039486
+21
+-116.789200000014
+31
+1649.95229501988
+12
+35.65255907302
+22
+-116.789200000014
+32
+1656.45002063205
+13
+35.65255907302
+23
+-116.789200000014
+33
+1656.45002063205
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3199957039486
+20
+-116.789200000014
+30
+1649.95229501988
+11
+35.65255907302
+21
+-70.0735200000139
+31
+1656.45002063205
+12
+30.3199957039486
+22
+-70.0735200000139
+32
+1649.95229501988
+13
+30.3199957039486
+23
+-70.0735200000139
+33
+1649.95229501988
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6149758455043
+20
+-70.0735200000139
+30
+1696.68151436742
+11
+-35.6525195683525
+21
+-116.789200000014
+31
+1704.09471950878
+12
+-39.6149758455043
+22
+-116.789200000014
+32
+1696.68151436742
+13
+-39.6149758455043
+23
+-116.789200000014
+33
+1696.68151436742
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525195683525
+20
+-116.789200000014
+30
+1704.09471950878
+11
+-39.6149758455043
+21
+-70.0735200000139
+31
+1696.68151436742
+12
+-35.6525195683525
+22
+-70.0735200000139
+32
+1704.09471950878
+13
+-35.6525195683525
+23
+-70.0735200000139
+33
+1704.09471950878
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666468
+20
+-116.789200000014
+30
+2409.40261154673
+11
+42.0551034399399
+21
+-741.404745478908
+31
+2417.44641490821
+12
+39.6150423666477
+22
+-741.419175320836
+32
+2409.40261154673
+13
+39.6150423666477
+23
+-741.419175320836
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.0551034399399
+20
+-741.404745478908
+30
+2417.44641490821
+11
+39.6150423666468
+21
+-116.789200000014
+31
+2409.40261154673
+12
+42.05510343994
+22
+-116.789200000014
+32
+2417.44641490821
+13
+42.05510343994
+23
+-116.789200000014
+33
+2417.44641490821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200057182179
+20
+0.0
+30
+2456.13171671889
+11
+-35.6525584815506
+21
+-70.0735200000139
+31
+2449.63398237639
+12
+-30.3200057182179
+22
+-70.0735200000139
+32
+2456.13171671889
+13
+-30.3200057182179
+23
+-70.0735200000139
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-70.0735200000139
+30
+2449.63398237639
+11
+-30.3200057182179
+21
+0.0
+31
+2456.13171671889
+12
+-35.6525584815506
+22
+0.0
+32
+2449.63398237639
+13
+-35.6525584815506
+23
+0.0
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666467
+20
+0.0
+30
+2442.22077074152
+11
+35.652598194651
+21
+-70.0735200000139
+31
+2449.63398237639
+12
+39.6150423666467
+22
+-70.0735200000139
+32
+2442.22077074152
+13
+39.6150423666467
+23
+-70.0735200000139
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+-70.0735200000139
+30
+2449.63398237639
+11
+39.6150423666467
+21
+0.0
+31
+2442.22077074152
+12
+35.652598194651
+22
+0.0
+32
+2449.63398237639
+13
+35.652598194651
+23
+0.0
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888134
+20
+-741.512569137265
+30
+2461.46426948223
+11
+16.4090994539477
+21
+-116.789200000014
+31
+2465.42671365422
+12
+16.4090994539477
+22
+-741.556408807198
+32
+2465.42671365422
+13
+16.4090994539477
+23
+-741.556408807198
+33
+2465.42671365422
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+16.4090994539477
+20
+-116.789200000014
+30
+2465.42671365422
+11
+23.8223110888134
+21
+-741.512569137265
+31
+2461.46426948223
+12
+23.8223110888135
+22
+-116.789200000014
+32
+2461.46426948223
+13
+23.8223110888135
+23
+-116.789200000014
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666469
+20
+-741.419175320836
+30
+2442.22077074152
+11
+35.652598194651
+21
+-116.789200000014
+31
+2449.63398237639
+12
+35.6525981946522
+22
+-741.442608112612
+32
+2449.63398237639
+13
+35.6525981946522
+23
+-741.442608112612
+33
+2449.63398237639
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.652598194651
+20
+-116.789200000014
+30
+2449.63398237639
+11
+39.6150423666469
+21
+-741.419175320836
+31
+2442.22077074152
+12
+39.6150423666468
+22
+-116.789200000014
+32
+2442.22077074152
+13
+39.6150423666468
+23
+-116.789200000014
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550546150653
+20
+-70.0735200000139
+30
+2043.56747533934
+11
+-39.6149847841629
+21
+-116.789200000014
+31
+2051.61127602287
+12
+-42.0550546150653
+22
+-116.789200000014
+32
+2043.56747533934
+13
+-42.0550546150653
+23
+-116.789200000014
+33
+2043.56747533934
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6149847841629
+20
+-116.789200000014
+30
+2051.61127602287
+11
+-42.0550546150653
+21
+-70.0735200000139
+31
+2043.56747533934
+12
+-39.6149847841629
+22
+-70.0735200000139
+32
+2051.61127602287
+13
+-39.6149847841629
+23
+-70.0735200000139
+33
+2051.61127602287
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+0.0
+30
+2409.40261154673
+11
+-35.6525584815506
+21
+-70.0735200000139
+31
+2401.98939991186
+12
+-39.6150026535464
+22
+-70.0735200000139
+32
+2409.40261154673
+13
+-39.6150026535464
+23
+-70.0735200000139
+33
+2409.40261154673
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525584815506
+20
+-70.0735200000139
+30
+2401.98939991186
+11
+-39.6150026535464
+21
+0.0
+31
+2409.40261154673
+12
+-35.6525584815506
+22
+0.0
+32
+2401.98939991186
+13
+-35.6525584815506
+23
+0.0
+33
+2401.98939991186
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36521064520558
+20
+-70.0735200000139
+30
+2077.25724590065
+11
+-16.4090166455219
+21
+-116.789200000014
+31
+2074.81719359682
+12
+-16.4090166455219
+22
+-70.0735200000139
+32
+2074.81719359682
+13
+-16.4090166455219
+23
+-70.0735200000139
+33
+2074.81719359682
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-16.4090166455219
+20
+-116.789200000014
+30
+2074.81719359682
+11
+-8.36521064520558
+21
+-70.0735200000139
+31
+2077.25724590065
+12
+-8.36521064520558
+22
+-116.789200000014
+32
+2077.25724590065
+13
+-8.36521064520558
+23
+-116.789200000014
+33
+2077.25724590065
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6526239576226
+20
+-70.0735200000139
+30
+2059.02440563739
+11
+39.6150600434633
+21
+-116.789200000014
+31
+2051.61118970355
+12
+35.6526239576226
+22
+-116.789200000014
+32
+2059.02440563739
+13
+35.6526239576226
+23
+-116.789200000014
+33
+2059.02440563739
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150600434633
+20
+-116.789200000014
+30
+2051.61118970355
+11
+35.6526239576226
+21
+-70.0735200000139
+31
+2059.02440563739
+12
+39.6150600434633
+22
+-70.0735200000139
+32
+2051.61118970355
+13
+39.6150600434633
+23
+-70.0735200000139
+33
+2051.61118970355
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525325452735
+20
+-70.0735200000139
+30
+2059.02448332273
+11
+-30.3199727157687
+21
+-116.789200000014
+31
+2065.52221183974
+12
+-35.6525325452735
+22
+-116.789200000014
+32
+2059.02448332273
+13
+-35.6525325452735
+23
+-116.789200000014
+33
+2059.02448332273
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3199727157687
+20
+-116.789200000014
+30
+2065.52221183974
+11
+-35.6525325452735
+21
+-70.0735200000139
+31
+2059.02448332273
+12
+-30.3199727157687
+22
+-70.0735200000139
+32
+2065.52221183974
+13
+-30.3199727157687
+23
+-70.0735200000139
+33
+2065.52221183974
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200948028707
+20
+-70.0735200000139
+30
+1710.59234602203
+11
+35.6526369345435
+21
+-116.789200000014
+31
+1704.09460298078
+12
+30.3200948028707
+22
+-116.789200000014
+32
+1710.59234602203
+13
+30.3200948028707
+23
+-116.789200000014
+33
+1710.59234602203
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+35.6526369345435
+20
+-116.789200000014
+30
+1704.09460298078
+11
+30.3200948028707
+21
+-70.0735200000139
+31
+1710.59234602203
+12
+35.6526369345435
+22
+-70.0735200000139
+32
+1704.09460298078
+13
+35.6526369345435
+23
+-70.0735200000139
+33
+1704.09460298078
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6149847841629
+20
+-70.0735200000139
+30
+2051.61127602287
+11
+-35.6525325452735
+21
+-116.789200000014
+31
+2059.02448332273
+12
+-39.6149847841629
+22
+-116.789200000014
+32
+2051.61127602287
+13
+-39.6149847841629
+23
+-116.789200000014
+33
+2051.61127602287
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.6525325452735
+20
+-116.789200000014
+30
+2059.02448332273
+11
+-39.6149847841629
+21
+-70.0735200000139
+31
+2051.61127602287
+12
+-35.6525325452735
+22
+-70.0735200000139
+32
+2059.02448332273
+13
+-35.6525325452735
+23
+-70.0735200000139
+33
+2059.02448332273
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-23.8222325793624
+20
+-70.0735200000139
+30
+2070.85475751098
+11
+-30.3199727157687
+21
+-116.789200000014
+31
+2065.52221183974
+12
+-30.3199727157687
+22
+-70.0735200000139
+32
+2065.52221183974
+13
+-30.3199727157687
+23
+-70.0735200000139
+33
+2065.52221183974
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3199727157687
+20
+-116.789200000014
+30
+2065.52221183974
+11
+-23.8222325793624
+21
+-70.0735200000139
+31
+2070.85475751098
+12
+-23.8222325793624
+22
+-116.789200000014
+32
+2070.85475751098
+13
+-23.8222325793624
+23
+-116.789200000014
+33
+2070.85475751098
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200387817157
+20
+-70.0735200000139
+30
+2004.88216083759
+11
+-35.652584452955
+21
+-116.789200000014
+31
+2011.379900974
+12
+-30.3200387817157
+22
+-116.789200000014
+32
+2004.88216083759
+13
+-30.3200387817157
+23
+-116.789200000014
+33
+2004.88216083759
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.652584452955
+20
+-116.789200000014
+30
+2011.379900974
+11
+-30.3200387817157
+21
+-70.0735200000139
+31
+2004.88216083759
+12
+-35.652584452955
+22
+-70.0735200000139
+32
+2011.379900974
+13
+-35.652584452955
+23
+-70.0735200000139
+33
+2011.379900974
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150205387958
+20
+-70.0735200000139
+30
+2018.79311690784
+11
+-42.0550728426191
+21
+-116.789200000014
+31
+2026.83692290816
+12
+-39.6150205387958
+22
+-116.789200000014
+32
+2018.79311690784
+13
+-39.6150205387958
+23
+-116.789200000014
+33
+2018.79311690784
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550728426191
+20
+-116.789200000014
+30
+2026.83692290816
+11
+-39.6150205387958
+21
+-70.0735200000139
+31
+2018.79311690784
+12
+-42.0550728426191
+22
+-70.0735200000139
+32
+2026.83692290816
+13
+-42.0550728426191
+23
+-70.0735200000139
+33
+2026.83692290816
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550728426191
+20
+-70.0735200000139
+30
+2026.83692290816
+11
+-42.878971522786
+21
+-116.789200000014
+31
+2035.20220002137
+12
+-42.0550728426191
+22
+-116.789200000014
+32
+2026.83692290816
+13
+-42.0550728426191
+23
+-116.789200000014
+33
+2026.83692290816
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-116.789200000014
+30
+2035.20220002137
+11
+-42.0550728426191
+21
+-70.0735200000139
+31
+2026.83692290816
+12
+-42.878971522786
+22
+-70.0735200000139
+32
+2035.20220002137
+13
+-42.878971522786
+23
+-70.0735200000139
+33
+2035.20220002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-30.3200552982032
+20
+-70.0735200000139
+30
+1649.9523941188
+11
+-35.652597429876
+21
+-116.789200000014
+31
+1656.45013716005
+12
+-30.3200552982032
+22
+-116.789200000014
+32
+1649.9523941188
+13
+-30.3200552982032
+23
+-116.789200000014
+33
+1649.9523941188
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.652597429876
+20
+-116.789200000014
+30
+1656.45013716005
+11
+-30.3200552982032
+21
+-70.0735200000139
+31
+1649.9523941188
+12
+-35.652597429876
+22
+-70.0735200000139
+32
+1656.45013716005
+13
+-35.652597429876
+23
+-70.0735200000139
+33
+1656.45013716005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3200454313182
+20
+-741.474143345189
+30
+2456.13171671889
+11
+23.8223110888135
+21
+-116.789200000014
+31
+2461.46426948223
+12
+23.8223110888134
+22
+-741.512569137265
+32
+2461.46426948223
+13
+23.8223110888134
+23
+-741.512569137265
+33
+2461.46426948223
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8223110888135
+20
+-116.789200000014
+30
+2461.46426948223
+11
+30.3200454313182
+21
+-741.474143345189
+31
+2456.13171671889
+12
+30.3200454313183
+22
+-116.789200000014
+32
+2456.13171671889
+13
+30.3200454313183
+23
+-116.789200000014
+33
+2456.13171671889
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+8.36522724084684
+20
+-116.789200000014
+30
+1638.21727291857
+11
+-5.03211860767294e-05
+21
+-70.0735200000139
+31
+1637.3933787953
+12
+-5.03211860767294e-05
+22
+-116.789200000014
+32
+1637.3933787953
+13
+-5.03211860767294e-05
+23
+-116.789200000014
+33
+1637.3933787953
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-5.03211860767294e-05
+20
+-70.0735200000139
+30
+1637.3933787953
+11
+8.36522724084684
+21
+-116.789200000014
+31
+1638.21727291857
+12
+8.36522724084684
+22
+-70.0735200000139
+32
+1638.21727291857
+13
+8.36522724084684
+23
+-70.0735200000139
+33
+1638.21727291857
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150026535464
+20
+0.0
+30
+2442.22077074152
+11
+-42.0550637268397
+21
+-70.0735200000139
+31
+2434.17696738005
+12
+-39.6150026535464
+22
+-70.0735200000139
+32
+2442.22077074152
+13
+-39.6150026535464
+23
+-70.0735200000139
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550637268397
+20
+-70.0735200000139
+30
+2434.17696738005
+11
+-39.6150026535464
+21
+0.0
+31
+2442.22077074152
+12
+-42.0550637268397
+22
+0.0
+32
+2434.17696738005
+13
+-42.0550637268397
+23
+0.0
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+30.3199957039486
+20
+-116.789200000014
+30
+1649.95229501988
+11
+23.8222526626951
+21
+-70.0735200000139
+31
+1644.61975288821
+12
+23.8222526626951
+22
+-116.789200000014
+32
+1644.61975288821
+13
+23.8222526626951
+23
+-116.789200000014
+33
+1644.61975288821
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+23.8222526626951
+20
+-70.0735200000139
+30
+1644.61975288821
+11
+30.3199957039486
+21
+-116.789200000014
+31
+1649.95229501988
+12
+30.3199957039486
+22
+-70.0735200000139
+32
+1649.95229501988
+13
+30.3199957039486
+23
+-70.0735200000139
+33
+1649.95229501988
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+1.98565501612791e-05
+20
+-116.789200000014
+30
+2382.93269976479
+11
+-8.36525637937127
+21
+-857.431240712236
+31
+2383.75660756074
+12
+-8.36525637937127
+22
+-116.789200000014
+32
+2383.75660756074
+13
+-8.36525637937127
+23
+-116.789200000014
+33
+2383.75660756074
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-8.36525637937127
+20
+-857.431240712236
+30
+2383.75660756074
+11
+1.98565501612791e-05
+21
+-116.789200000014
+31
+2382.93269976479
+12
+1.98565501612791e-05
+22
+-858.151437401893
+32
+2382.93269976479
+13
+1.98565501612791e-05
+23
+-858.151437401893
+33
+2382.93269976479
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.8790112358864
+20
+0.0
+30
+2425.81169114413
+11
+42.05510343994
+21
+-70.0735200000139
+31
+2434.17696738005
+12
+42.8790112358864
+22
+-70.0735200000139
+32
+2425.81169114413
+13
+42.8790112358864
+23
+-70.0735200000139
+33
+2425.81169114413
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+-70.0735200000139
+30
+2434.17696738005
+11
+42.8790112358864
+21
+0.0
+31
+2425.81169114413
+12
+42.05510343994
+22
+0.0
+32
+2434.17696738005
+13
+42.05510343994
+23
+0.0
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+42.05510343994
+20
+0.0
+30
+2434.17696738005
+11
+39.6150423666467
+21
+-70.0735200000139
+31
+2442.22077074152
+12
+42.05510343994
+22
+-70.0735200000139
+32
+2434.17696738005
+13
+42.05510343994
+23
+-70.0735200000139
+33
+2434.17696738005
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+39.6150423666467
+20
+-70.0735200000139
+30
+2442.22077074152
+11
+42.05510343994
+21
+0.0
+31
+2434.17696738005
+12
+39.6150423666467
+22
+0.0
+32
+2442.22077074152
+13
+39.6150423666467
+23
+0.0
+33
+2442.22077074152
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-35.652584452955
+20
+-70.0735200000139
+30
+2011.379900974
+11
+-39.6150205387958
+21
+-116.789200000014
+31
+2018.79311690784
+12
+-35.652584452955
+22
+-116.789200000014
+32
+2011.379900974
+13
+-35.652584452955
+23
+-116.789200000014
+33
+2011.379900974
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-39.6150205387958
+20
+-116.789200000014
+30
+2018.79311690784
+11
+-35.652584452955
+21
+-70.0735200000139
+31
+2011.379900974
+12
+-39.6150205387958
+22
+-70.0735200000139
+32
+2018.79311690784
+13
+-39.6150205387958
+23
+-70.0735200000139
+33
+2018.79311690784
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.878971522786
+20
+-70.0735200000139
+30
+2035.20220002137
+11
+-42.0550546150653
+21
+-116.789200000014
+31
+2043.56747533934
+12
+-42.878971522786
+22
+-116.789200000014
+32
+2035.20220002137
+13
+-42.878971522786
+23
+-116.789200000014
+33
+2035.20220002137
+70
+1
+ 0
+3DFACE
+ 8
+gearbox_half
+10
+-42.0550546150653
+20
+-116.789200000014
+30
+2043.56747533934
+11
+-42.878971522786
+21
+-70.0735200000139
+31
+2035.20220002137
+12
+-42.0550546150653
+22
+-70.0735200000139
+32
+2043.56747533934
+13
+-42.0550546150653
+23
+-70.0735200000139
+33
+2043.56747533934
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-899.612557411553
+20
+-178.944063519201
+30
+1773.56823006635
+11
+-944.844671731792
+21
+0.0
+31
+1835.6354447734
+12
+-926.689746301964
+22
+-184.330051263378
+32
+1835.6354447734
+13
+-926.689746301964
+23
+-184.330051263378
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-944.844671731792
+20
+0.0
+30
+1835.6354447734
+11
+-899.612557411553
+21
+-178.944063519201
+31
+1773.56823006635
+12
+-917.237009349992
+22
+0.0
+32
+1773.56823006635
+13
+-917.237009349992
+23
+0.0
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-964.850983209364
+20
+0.0
+30
+2169.85154878419
+11
+-926.689746301964
+21
+-184.330051263378
+31
+2234.76895526921
+12
+-946.311642114328
+22
+-188.233089011893
+32
+2169.85154878419
+13
+-946.311642114328
+23
+-188.233089011893
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-926.689746301964
+20
+-184.330051263378
+30
+2234.76895526921
+11
+-964.850983209364
+21
+0.0
+31
+2169.85154878419
+12
+-944.844671731792
+22
+0.0
+32
+2234.76895526921
+13
+-944.844671731792
+23
+0.0
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-958.198006960111
+20
+-190.597433982906
+30
+1967.39330582966
+11
+-981.029283605455
+21
+-1.80477854883065e-13
+31
+2035.2022000213
+12
+-962.179081004757
+22
+-191.38931884584
+32
+2035.2022000213
+13
+-962.179081004757
+23
+-191.38931884584
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-981.029283605455
+20
+-1.80477854883065e-13
+30
+2035.2022000213
+11
+-958.198006960111
+21
+-190.597433982906
+31
+1967.39330582966
+12
+-976.970215709362
+22
+-1.80477854883065e-13
+32
+1967.39330582966
+13
+-976.970215709362
+23
+-1.80477854883065e-13
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-776.88819383121
+20
+-321.797626332425
+30
+1661.47676002131
+11
+-865.466789057043
+21
+-172.152047899808
+31
+1715.23764468454
+12
+-815.251888924487
+22
+-337.688389142806
+32
+1715.23764468454
+13
+-815.251888924487
+23
+-337.688389142806
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-865.466789057043
+20
+-172.152047899808
+30
+1715.23764468454
+11
+-776.88819383121
+21
+-321.797626332425
+31
+1661.47676002131
+12
+-824.740107573921
+22
+-164.051007270482
+32
+1661.47676002131
+13
+-824.740107573921
+23
+-164.051007270482
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-668.106074549528
+20
+-668.106074549528
+30
+1835.6354447734
+11
+-802.244272938819
+21
+-536.042485570818
+31
+1900.55285125842
+12
+-682.252673061849
+22
+-682.252673061849
+32
+1900.55285125842
+13
+-682.252673061849
+23
+-682.252673061849
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-802.244272938819
+20
+-536.042485570818
+30
+1900.55285125842
+11
+-668.106074549528
+21
+-668.106074549528
+31
+1835.6354447734
+12
+-785.609632890959
+22
+-524.927574441361
+32
+1835.6354447734
+13
+-785.609632890959
+23
+-524.927574441361
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-721.176029454062
+20
+-143.450831316169
+30
+680.911023534629
+11
+-756.121025443459
+21
+0.0
+31
+741.194313252463
+12
+-741.592371958341
+22
+-147.511894336929
+32
+741.194313252463
+13
+-741.592371958341
+23
+-147.511894336929
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-756.121025443459
+20
+0.0
+30
+741.194313252463
+11
+-721.176029454062
+21
+-143.450831316169
+31
+680.911023534629
+12
+-735.304703143143
+22
+0.0
+32
+680.911023534629
+13
+-735.304703143143
+23
+0.0
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-926.689746301964
+20
+-184.330051263378
+30
+2234.76895526921
+11
+-847.416499400322
+21
+-351.011407030345
+31
+2296.83616997626
+12
+-872.922653615348
+22
+-361.576402030189
+32
+2234.76895526921
+13
+-872.922653615348
+23
+-361.576402030189
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-847.416499400322
+20
+-351.011407030345
+30
+2296.83616997626
+11
+-926.689746301964
+21
+-184.330051263378
+31
+2234.76895526921
+12
+-899.612557411553
+22
+-178.9440635192
+32
+2296.83616997626
+13
+-899.612557411553
+23
+-178.9440635192
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-172.152047899808
+20
+-865.466789057043
+30
+2355.16675535807
+11
+0.0
+21
+-917.237009349992
+31
+2296.83616997626
+12
+-178.9440635192
+22
+-899.612557411553
+32
+2296.83616997626
+13
+-178.9440635192
+23
+-899.612557411553
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-917.237009349992
+30
+2296.83616997626
+11
+-172.152047899808
+21
+-865.466789057043
+31
+2355.16675535807
+12
+0.0
+22
+-882.422285845505
+32
+2355.16675535807
+13
+0.0
+23
+-882.422285845505
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-429.428666054072
+20
+-429.428666054072
+30
+1287.75132002131
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+-495.494614285554
+22
+-495.494614285554
+32
+1100.8886000213
+13
+-495.494614285554
+23
+-495.494614285554
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-389.307620352121
+20
+-582.640028068573
+30
+1100.8886000213
+11
+-429.428666054072
+21
+-429.428666054072
+31
+1287.75132002131
+12
+-337.399937905583
+22
+-504.954691392473
+32
+1287.75132002131
+13
+-337.399937905583
+23
+-504.954691392473
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-188.233089011893
+20
+-946.311642114328
+30
+2169.85154878419
+11
+0.0
+21
+-976.970215709361
+31
+2103.01109421295
+12
+-190.597433982906
+22
+-958.19800696011
+32
+2103.01109421295
+13
+-190.597433982906
+23
+-958.19800696011
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-976.970215709361
+30
+2103.01109421295
+11
+-188.233089011893
+21
+-946.311642114328
+31
+2169.85154878419
+12
+0.0
+22
+-964.850983209363
+32
+2169.85154878419
+13
+0.0
+23
+-964.850983209363
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-184.330051263378
+20
+-926.689746301964
+30
+2234.76895526921
+11
+0.0
+21
+-964.850983209363
+31
+2169.85154878419
+12
+-188.233089011893
+22
+-946.311642114328
+32
+2169.85154878419
+13
+-188.233089011893
+23
+-946.311642114328
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-964.850983209363
+30
+2169.85154878419
+11
+-184.330051263378
+21
+-926.689746301964
+31
+2234.76895526921
+12
+0.0
+22
+-944.844671731792
+32
+2234.76895526921
+13
+0.0
+23
+-944.844671731792
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-178.9440635192
+20
+-899.612557411553
+30
+2296.83616997626
+11
+0.0
+21
+-944.844671731792
+31
+2234.76895526921
+12
+-184.330051263378
+22
+-926.689746301964
+32
+2234.76895526921
+13
+-184.330051263378
+23
+-926.689746301964
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-944.844671731792
+30
+2234.76895526921
+11
+-178.9440635192
+21
+-899.612557411553
+31
+2296.83616997626
+12
+0.0
+22
+-917.237009349992
+32
+2296.83616997626
+13
+0.0
+23
+-917.237009349992
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-178.9440635192
+20
+-899.612557411553
+30
+1773.56823006635
+11
+0.0
+21
+-882.422285845505
+31
+1715.23764468454
+12
+-172.152047899808
+22
+-865.466789057044
+32
+1715.23764468454
+13
+-172.152047899808
+23
+-865.466789057044
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-882.422285845505
+30
+1715.23764468454
+11
+-178.9440635192
+21
+-899.612557411553
+31
+1773.56823006635
+12
+0.0
+22
+-917.237009349992
+32
+1773.56823006635
+13
+0.0
+23
+-917.237009349992
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-682.252673061849
+20
+-682.252673061849
+30
+1900.55285125842
+11
+-524.927574441361
+21
+-785.609632890959
+31
+1835.6354447734
+12
+-668.106074549528
+22
+-668.106074549528
+32
+1835.6354447734
+13
+-668.106074549528
+23
+-668.106074549528
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-524.927574441361
+20
+-785.609632890959
+30
+1835.6354447734
+11
+-682.252673061849
+21
+-682.252673061849
+31
+1900.55285125842
+12
+-536.042485570819
+22
+-802.244272938819
+32
+1900.55285125842
+13
+-536.042485570819
+23
+-802.244272938819
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-693.692458979998
+20
+-693.692458979998
+30
+2035.2022000213
+11
+-542.775570394861
+21
+-812.321046486997
+31
+1967.39330582966
+12
+-690.822264545374
+22
+-690.822264545374
+32
+1967.39330582966
+13
+-690.822264545374
+23
+-690.822264545374
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-542.775570394861
+20
+-812.321046486997
+30
+1967.39330582966
+11
+-693.692458979998
+21
+-693.692458979998
+31
+2035.2022000213
+12
+-545.030667691736
+22
+-815.696038096871
+32
+2035.2022000213
+13
+-545.030667691736
+23
+-815.696038096871
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+1287.75132002131
+11
+-543.797359730523
+21
+-363.353779128852
+31
+1474.6140400213
+12
+-621.482696406623
+22
+-415.26146157539
+32
+1287.75132002131
+13
+-621.482696406623
+23
+-415.26146157539
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-543.797359730523
+20
+-363.353779128852
+30
+1474.6140400213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+1287.75132002131
+12
+-604.235251721863
+22
+-250.282436127117
+32
+1474.6140400213
+13
+-604.235251721863
+23
+-250.282436127117
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-747.450883605455
+20
+0.0
+30
+2408.9276400213
+11
+-824.740107573921
+21
+-164.051007270482
+31
+2408.9276400213
+12
+-840.897721502147
+22
+0.0
+32
+2408.9276400213
+13
+-840.897721502147
+23
+0.0
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-824.740107573921
+20
+-164.051007270482
+30
+2408.9276400213
+11
+-747.450883605455
+21
+0.0
+31
+2408.9276400213
+12
+-776.88819383121
+22
+-321.797626332425
+32
+2408.9276400213
+13
+-776.88819383121
+23
+-321.797626332425
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-776.88819383121
+20
+-321.797626332425
+30
+2408.9276400213
+11
+-747.450883605455
+21
+0.0
+31
+2408.9276400213
+12
+-733.088824464619
+22
+-145.820433573828
+32
+2408.9276400213
+13
+-733.088824464619
+23
+-145.820433573828
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-776.88819383121
+20
+-321.797626332425
+30
+2408.9276400213
+11
+-733.088824464619
+21
+-145.820433573828
+31
+2408.9276400213
+12
+-699.180902483484
+22
+-467.1777430806
+32
+2408.9276400213
+13
+-699.180902483484
+23
+-467.1777430806
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-699.180902483484
+20
+-467.1777430806
+30
+2408.9276400213
+11
+-733.088824464619
+21
+-145.820433573828
+31
+2408.9276400213
+12
+-690.554572920556
+22
+-286.037069662455
+32
+2408.9276400213
+13
+-690.554572920556
+23
+-286.037069662455
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-699.180902483484
+20
+-467.1777430806
+30
+2408.9276400213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+2408.9276400213
+12
+-594.604481158485
+22
+-594.604481158485
+32
+2408.9276400213
+13
+-594.604481158485
+23
+-594.604481158485
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+2408.9276400213
+12
+-621.482696406623
+22
+-415.26146157539
+32
+2408.9276400213
+13
+-621.482696406623
+23
+-415.26146157539
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+2408.9276400213
+12
+-528.527588401294
+22
+-528.527588401294
+32
+2408.9276400213
+13
+-528.527588401294
+23
+-528.527588401294
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+2408.9276400213
+12
+-467.1777430806
+22
+-699.180902483483
+32
+2408.9276400213
+13
+-467.1777430806
+23
+-699.180902483483
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.1777430806
+20
+-699.180902483483
+30
+2408.9276400213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+2408.9276400213
+12
+-415.26146157539
+22
+-621.482696406623
+32
+2408.9276400213
+13
+-415.26146157539
+23
+-621.482696406623
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.1777430806
+20
+-699.180902483483
+30
+2408.9276400213
+11
+-415.26146157539
+21
+-621.482696406623
+31
+2408.9276400213
+12
+-321.797626332425
+22
+-776.88819383121
+32
+2408.9276400213
+13
+-321.797626332425
+23
+-776.88819383121
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-321.797626332425
+20
+-776.88819383121
+30
+2408.9276400213
+11
+-415.26146157539
+21
+-621.482696406623
+31
+2408.9276400213
+12
+-286.037069662455
+22
+-690.554572920556
+32
+2408.9276400213
+13
+-286.037069662455
+23
+-690.554572920556
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-321.797626332425
+20
+-776.88819383121
+30
+2408.9276400213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+2408.9276400213
+12
+-164.051007270482
+22
+-824.740107573921
+32
+2408.9276400213
+13
+-164.051007270482
+23
+-824.740107573921
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-164.051007270482
+20
+-824.740107573921
+30
+2408.9276400213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+2408.9276400213
+12
+-145.820433573828
+22
+-733.088824464619
+32
+2408.9276400213
+13
+-145.820433573828
+23
+-733.088824464619
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-164.051007270482
+20
+-824.740107573921
+30
+2408.9276400213
+11
+-145.820433573828
+21
+-733.088824464619
+31
+2408.9276400213
+12
+0.0
+22
+-840.897721502147
+32
+2408.9276400213
+13
+0.0
+23
+-840.897721502147
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-840.897721502147
+30
+2408.9276400213
+11
+-145.820433573828
+21
+-733.088824464619
+31
+2408.9276400213
+12
+0.0
+22
+-747.450883605455
+32
+2408.9276400213
+13
+0.0
+23
+-747.450883605455
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-840.897721502147
+30
+2408.9276400213
+11
+0.0
+21
+-747.450883605455
+31
+2408.9276400213
+12
+145.820433573828
+22
+-733.088824464619
+32
+2408.9276400213
+13
+145.820433573828
+23
+-733.088824464619
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-840.897721502147
+30
+2408.9276400213
+11
+145.820433573828
+21
+-733.088824464619
+31
+2408.9276400213
+12
+164.051007270482
+22
+-824.740107573921
+32
+2408.9276400213
+13
+164.051007270482
+23
+-824.740107573921
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+164.051007270482
+20
+-824.740107573921
+30
+2408.9276400213
+11
+145.820433573828
+21
+-733.088824464619
+31
+2408.9276400213
+12
+286.037069662455
+22
+-690.554572920556
+32
+2408.9276400213
+13
+286.037069662455
+23
+-690.554572920556
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+164.051007270482
+20
+-824.740107573921
+30
+2408.9276400213
+11
+286.037069662455
+21
+-690.554572920556
+31
+2408.9276400213
+12
+321.797626332425
+22
+-776.88819383121
+32
+2408.9276400213
+13
+321.797626332425
+23
+-776.88819383121
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+321.797626332425
+20
+-776.88819383121
+30
+2408.9276400213
+11
+286.037069662455
+21
+-690.554572920556
+31
+2408.9276400213
+12
+415.26146157539
+22
+-621.482696406623
+32
+2408.9276400213
+13
+415.26146157539
+23
+-621.482696406623
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+321.797626332425
+20
+-776.88819383121
+30
+2408.9276400213
+11
+415.26146157539
+21
+-621.482696406623
+31
+2408.9276400213
+12
+467.1777430806
+22
+-699.180902483484
+32
+2408.9276400213
+13
+467.1777430806
+23
+-699.180902483484
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+467.1777430806
+20
+-699.180902483484
+30
+2408.9276400213
+11
+415.26146157539
+21
+-621.482696406623
+31
+2408.9276400213
+12
+528.527588401294
+22
+-528.527588401294
+32
+2408.9276400213
+13
+528.527588401294
+23
+-528.527588401294
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+467.1777430806
+20
+-699.180902483484
+30
+2408.9276400213
+11
+528.527588401294
+21
+-528.527588401294
+31
+2408.9276400213
+12
+594.604481158485
+22
+-594.604481158485
+32
+2408.9276400213
+13
+594.604481158485
+23
+-594.604481158485
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+528.527588401294
+21
+-528.527588401294
+31
+2408.9276400213
+12
+621.482696406623
+22
+-415.26146157539
+32
+2408.9276400213
+13
+621.482696406623
+23
+-415.26146157539
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+621.482696406623
+21
+-415.26146157539
+31
+2408.9276400213
+12
+699.180902483483
+22
+-467.1777430806
+32
+2408.9276400213
+13
+699.180902483483
+23
+-467.1777430806
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+699.180902483483
+20
+-467.1777430806
+30
+2408.9276400213
+11
+621.482696406623
+21
+-415.26146157539
+31
+2408.9276400213
+12
+690.554572920556
+22
+-286.037069662455
+32
+2408.9276400213
+13
+690.554572920556
+23
+-286.037069662455
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+699.180902483483
+20
+-467.1777430806
+30
+2408.9276400213
+11
+690.554572920556
+21
+-286.037069662455
+31
+2408.9276400213
+12
+733.088824464619
+22
+-145.820433573828
+32
+2408.9276400213
+13
+733.088824464619
+23
+-145.820433573828
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+699.180902483483
+20
+-467.1777430806
+30
+2408.9276400213
+11
+733.088824464619
+21
+-145.820433573828
+31
+2408.9276400213
+12
+776.88819383121
+22
+-321.797626332425
+32
+2408.9276400213
+13
+776.88819383121
+23
+-321.797626332425
+33
+2408.9276400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+776.88819383121
+20
+-321.797626332425
+30
+2408.9276400213
+11
+733.088824464619
+21
+-145.820433573828
+31
+2408.9276400213
+12
+747.450883605455
+22
+-1.80477854883065e-13
+32
+2408.9276400213
+13
+747.450883605455
+23
+-1.80477854883065e-13
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+776.88819383121
+20
+-321.797626332425
+30
+2408.9276400213
+11
+747.450883605455
+21
+-1.80477854883065e-13
+31
+2408.9276400213
+12
+840.897721502147
+22
+-1.80477854883065e-13
+32
+2408.9276400213
+13
+840.897721502147
+23
+-1.80477854883065e-13
+33
+2408.9276400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+776.88819383121
+20
+-321.797626332425
+30
+2408.9276400213
+11
+840.897721502147
+21
+-1.80477854883065e-13
+31
+2408.9276400213
+12
+824.740107573921
+22
+-164.051007270483
+32
+2408.9276400213
+13
+824.740107573921
+23
+-164.051007270483
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-824.740107573921
+20
+-164.051007270482
+30
+1661.47676002131
+11
+-700.735203605456
+21
+0.0
+31
+1661.47676002131
+12
+-840.897721502147
+22
+0.0
+32
+1661.47676002131
+13
+-840.897721502147
+23
+0.0
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-700.735203605456
+20
+0.0
+30
+1661.47676002131
+11
+-824.740107573921
+21
+-164.051007270482
+31
+1661.47676002131
+12
+-776.88819383121
+22
+-321.797626332425
+32
+1661.47676002131
+13
+-776.88819383121
+23
+-321.797626332425
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-700.735203605456
+20
+0.0
+30
+1661.47676002131
+11
+-776.88819383121
+21
+-321.797626332425
+31
+1661.47676002131
+12
+-699.180902483484
+22
+-467.1777430806
+32
+1661.47676002131
+13
+-699.180902483484
+23
+-467.1777430806
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-700.735203605456
+20
+0.0
+30
+1661.47676002131
+11
+-699.180902483484
+21
+-467.1777430806
+31
+1661.47676002131
+12
+-687.270773156591
+22
+-136.706656519425
+32
+1661.47676002131
+13
+-687.270773156591
+23
+-136.706656519425
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-687.270773156591
+20
+-136.706656519425
+30
+1661.47676002131
+11
+-699.180902483484
+21
+-467.1777430806
+31
+1661.47676002131
+12
+-594.604481158485
+22
+-594.604481158485
+32
+1661.47676002131
+13
+-594.604481158485
+23
+-594.604481158485
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-687.270773156591
+20
+-136.706656519425
+30
+1661.47676002131
+11
+-594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+-647.39491232121
+22
+-268.159752894786
+32
+1661.47676002131
+13
+-647.39491232121
+23
+-268.159752894786
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-647.39491232121
+20
+-268.159752894786
+30
+1661.47676002131
+11
+-594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+-582.640028068573
+22
+-389.307620352121
+32
+1661.47676002131
+13
+-582.640028068573
+23
+-389.307620352121
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-582.640028068573
+20
+-389.307620352121
+30
+1661.47676002131
+11
+-594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+-467.1777430806
+22
+-699.180902483483
+32
+1661.47676002131
+13
+-467.1777430806
+23
+-699.180902483483
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-582.640028068573
+20
+-389.307620352121
+30
+1661.47676002131
+11
+-467.1777430806
+21
+-699.180902483483
+31
+1661.47676002131
+12
+-495.494614285554
+22
+-495.494614285554
+32
+1661.47676002131
+13
+-495.494614285554
+23
+-495.494614285554
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-495.494614285554
+20
+-495.494614285554
+30
+1661.47676002131
+11
+-467.1777430806
+21
+-699.180902483483
+31
+1661.47676002131
+12
+-389.307620352121
+22
+-582.640028068573
+32
+1661.47676002131
+13
+-389.307620352121
+23
+-582.640028068573
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-389.307620352121
+20
+-582.640028068573
+30
+1661.47676002131
+11
+-467.1777430806
+21
+-699.180902483483
+31
+1661.47676002131
+12
+-321.797626332425
+22
+-776.88819383121
+32
+1661.47676002131
+13
+-321.797626332425
+23
+-776.88819383121
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-389.307620352121
+20
+-582.640028068573
+30
+1661.47676002131
+11
+-321.797626332425
+21
+-776.88819383121
+31
+1661.47676002131
+12
+-268.159752894786
+22
+-647.39491232121
+32
+1661.47676002131
+13
+-268.159752894786
+23
+-647.39491232121
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-268.159752894786
+20
+-647.39491232121
+30
+1661.47676002131
+11
+-321.797626332425
+21
+-776.88819383121
+31
+1661.47676002131
+12
+-164.051007270482
+22
+-824.740107573921
+32
+1661.47676002131
+13
+-164.051007270482
+23
+-824.740107573921
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-268.159752894786
+20
+-647.39491232121
+30
+1661.47676002131
+11
+-164.051007270482
+21
+-824.740107573921
+31
+1661.47676002131
+12
+-136.706656519425
+22
+-687.270773156591
+32
+1661.47676002131
+13
+-136.706656519425
+23
+-687.270773156591
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-136.706656519425
+20
+-687.270773156591
+30
+1661.47676002131
+11
+-164.051007270482
+21
+-824.740107573921
+31
+1661.47676002131
+12
+0.0
+22
+-840.897721502147
+32
+1661.47676002131
+13
+0.0
+23
+-840.897721502147
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-136.706656519425
+20
+-687.270773156591
+30
+1661.47676002131
+11
+0.0
+21
+-840.897721502147
+31
+1661.47676002131
+12
+0.0
+22
+-700.735203605455
+32
+1661.47676002131
+13
+0.0
+23
+-700.735203605455
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-700.735203605455
+30
+1661.47676002131
+11
+0.0
+21
+-840.897721502147
+31
+1661.47676002131
+12
+164.051007270482
+22
+-824.740107573921
+32
+1661.47676002131
+13
+164.051007270482
+23
+-824.740107573921
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-700.735203605455
+30
+1661.47676002131
+11
+164.051007270482
+21
+-824.740107573921
+31
+1661.47676002131
+12
+136.706656519425
+22
+-687.270773156591
+32
+1661.47676002131
+13
+136.706656519425
+23
+-687.270773156591
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+136.706656519425
+20
+-687.270773156591
+30
+1661.47676002131
+11
+164.051007270482
+21
+-824.740107573921
+31
+1661.47676002131
+12
+268.159752894786
+22
+-647.39491232121
+32
+1661.47676002131
+13
+268.159752894786
+23
+-647.39491232121
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+268.159752894786
+20
+-647.39491232121
+30
+1661.47676002131
+11
+164.051007270482
+21
+-824.740107573921
+31
+1661.47676002131
+12
+321.797626332425
+22
+-776.88819383121
+32
+1661.47676002131
+13
+321.797626332425
+23
+-776.88819383121
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+268.159752894786
+20
+-647.39491232121
+30
+1661.47676002131
+11
+321.797626332425
+21
+-776.88819383121
+31
+1661.47676002131
+12
+389.307620352121
+22
+-582.640028068573
+32
+1661.47676002131
+13
+389.307620352121
+23
+-582.640028068573
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+389.307620352121
+20
+-582.640028068573
+30
+1661.47676002131
+11
+321.797626332425
+21
+-776.88819383121
+31
+1661.47676002131
+12
+467.1777430806
+22
+-699.180902483484
+32
+1661.47676002131
+13
+467.1777430806
+23
+-699.180902483484
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+389.307620352121
+20
+-582.640028068573
+30
+1661.47676002131
+11
+467.1777430806
+21
+-699.180902483484
+31
+1661.47676002131
+12
+495.494614285554
+22
+-495.494614285554
+32
+1661.47676002131
+13
+495.494614285554
+23
+-495.494614285554
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+495.494614285554
+20
+-495.494614285554
+30
+1661.47676002131
+11
+467.1777430806
+21
+-699.180902483484
+31
+1661.47676002131
+12
+594.604481158485
+22
+-594.604481158485
+32
+1661.47676002131
+13
+594.604481158485
+23
+-594.604481158485
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+495.494614285554
+20
+-495.494614285554
+30
+1661.47676002131
+11
+594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+582.640028068573
+22
+-389.307620352121
+32
+1661.47676002131
+13
+582.640028068573
+23
+-389.307620352121
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+582.640028068573
+20
+-389.307620352121
+30
+1661.47676002131
+11
+594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+647.39491232121
+22
+-268.159752894786
+32
+1661.47676002131
+13
+647.39491232121
+23
+-268.159752894786
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+647.39491232121
+20
+-268.159752894786
+30
+1661.47676002131
+11
+594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+699.180902483483
+22
+-467.1777430806
+32
+1661.47676002131
+13
+699.180902483483
+23
+-467.1777430806
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+647.39491232121
+20
+-268.159752894786
+30
+1661.47676002131
+11
+699.180902483483
+21
+-467.1777430806
+31
+1661.47676002131
+12
+687.270773156591
+22
+-136.706656519426
+32
+1661.47676002131
+13
+687.270773156591
+23
+-136.706656519426
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+687.270773156591
+20
+-136.706656519426
+30
+1661.47676002131
+11
+699.180902483483
+21
+-467.1777430806
+31
+1661.47676002131
+12
+700.735203605455
+22
+-1.80477854883065e-13
+32
+1661.47676002131
+13
+700.735203605455
+23
+-1.80477854883065e-13
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+700.735203605455
+20
+-1.80477854883065e-13
+30
+1661.47676002131
+11
+699.180902483483
+21
+-467.1777430806
+31
+1661.47676002131
+12
+776.88819383121
+22
+-321.797626332425
+32
+1661.47676002131
+13
+776.88819383121
+23
+-321.797626332425
+33
+1661.47676002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+700.735203605455
+20
+-1.80477854883065e-13
+30
+1661.47676002131
+11
+776.88819383121
+21
+-321.797626332425
+31
+1661.47676002131
+12
+840.897721502147
+22
+-1.80477854883065e-13
+32
+1661.47676002131
+13
+840.897721502147
+23
+-1.80477854883065e-13
+33
+1661.47676002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+840.897721502147
+20
+-1.80477854883065e-13
+30
+1661.47676002131
+11
+776.88819383121
+21
+-321.797626332425
+31
+1661.47676002131
+12
+824.740107573921
+22
+-164.051007270483
+32
+1661.47676002131
+13
+824.740107573921
+23
+-164.051007270483
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-778.906875772646
+20
+-154.93421062823
+30
+1474.6140400213
+11
+-654.019523605455
+21
+0.0
+31
+1474.6140400213
+12
+-794.166563605455
+22
+0.0
+32
+1474.6140400213
+13
+-794.166563605455
+23
+0.0
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-654.019523605455
+20
+0.0
+30
+1474.6140400213
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1474.6140400213
+12
+-733.714233519903
+22
+-303.914386430124
+32
+1474.6140400213
+13
+-733.714233519903
+23
+-303.914386430124
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-654.019523605455
+20
+0.0
+30
+1474.6140400213
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1474.6140400213
+12
+-660.325364744673
+22
+-441.215302798659
+32
+1474.6140400213
+13
+-660.325364744673
+23
+-441.215302798659
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-654.019523605455
+20
+0.0
+30
+1474.6140400213
+11
+-660.325364744673
+21
+-441.215302798659
+31
+1474.6140400213
+12
+-641.452721848564
+22
+-127.592879465023
+32
+1474.6140400213
+13
+-641.452721848564
+23
+-127.592879465023
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-641.452721848564
+20
+-127.592879465023
+30
+1474.6140400213
+11
+-660.325364744673
+21
+-441.215302798659
+31
+1474.6140400213
+12
+-561.560562517035
+22
+-561.560562517035
+32
+1474.6140400213
+13
+-561.560562517035
+23
+-561.560562517035
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-641.452721848564
+20
+-127.592879465023
+30
+1474.6140400213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1474.6140400213
+12
+-604.235251721863
+22
+-250.282436127117
+32
+1474.6140400213
+13
+-604.235251721863
+23
+-250.282436127117
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-604.235251721863
+20
+-250.282436127117
+30
+1474.6140400213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1474.6140400213
+12
+-543.797359730523
+22
+-363.353779128852
+32
+1474.6140400213
+13
+-543.797359730523
+23
+-363.353779128852
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-543.797359730523
+20
+-363.353779128852
+30
+1474.6140400213
+11
+-561.560562517035
+21
+-561.560562517035
+31
+1474.6140400213
+12
+-441.21530279866
+22
+-660.325364744672
+32
+1474.6140400213
+13
+-441.21530279866
+23
+-660.325364744672
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-543.797359730523
+20
+-363.353779128852
+30
+1474.6140400213
+11
+-441.21530279866
+21
+-660.325364744672
+31
+1474.6140400213
+12
+-462.461640169813
+22
+-462.461640169813
+32
+1474.6140400213
+13
+-462.461640169813
+23
+-462.461640169813
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-462.461640169813
+20
+-462.461640169813
+30
+1474.6140400213
+11
+-441.21530279866
+21
+-660.325364744672
+31
+1474.6140400213
+12
+-363.353779128852
+22
+-543.797359730523
+32
+1474.6140400213
+13
+-363.353779128852
+23
+-543.797359730523
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-363.353779128852
+20
+-543.797359730523
+30
+1474.6140400213
+11
+-441.21530279866
+21
+-660.325364744672
+31
+1474.6140400213
+12
+-303.914386430124
+22
+-733.714233519903
+32
+1474.6140400213
+13
+-303.914386430124
+23
+-733.714233519903
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-363.353779128852
+20
+-543.797359730523
+30
+1474.6140400213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1474.6140400213
+12
+-250.282436127117
+22
+-604.235251721863
+32
+1474.6140400213
+13
+-250.282436127117
+23
+-604.235251721863
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-250.282436127117
+20
+-604.235251721863
+30
+1474.6140400213
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1474.6140400213
+12
+-154.93421062823
+22
+-778.906875772646
+32
+1474.6140400213
+13
+-154.93421062823
+23
+-778.906875772646
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-250.282436127117
+20
+-604.235251721863
+30
+1474.6140400213
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1474.6140400213
+12
+-127.592879465023
+22
+-641.452721848564
+32
+1474.6140400213
+13
+-127.592879465023
+23
+-641.452721848564
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-127.592879465023
+20
+-641.452721848564
+30
+1474.6140400213
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1474.6140400213
+12
+0.0
+22
+-794.166563605455
+32
+1474.6140400213
+13
+0.0
+23
+-794.166563605455
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-127.592879465023
+20
+-641.452721848564
+30
+1474.6140400213
+11
+0.0
+21
+-794.166563605455
+31
+1474.6140400213
+12
+0.0
+22
+-654.019523605455
+32
+1474.6140400213
+13
+0.0
+23
+-654.019523605455
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-654.019523605455
+30
+1474.6140400213
+11
+0.0
+21
+-794.166563605455
+31
+1474.6140400213
+12
+154.93421062823
+22
+-778.906875772646
+32
+1474.6140400213
+13
+154.93421062823
+23
+-778.906875772646
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-654.019523605455
+30
+1474.6140400213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1474.6140400213
+12
+127.592879465023
+22
+-641.452721848564
+32
+1474.6140400213
+13
+127.592879465023
+23
+-641.452721848564
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+127.592879465023
+20
+-641.452721848564
+30
+1474.6140400213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1474.6140400213
+12
+250.282436127116
+22
+-604.235251721863
+32
+1474.6140400213
+13
+250.282436127116
+23
+-604.235251721863
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+250.282436127116
+20
+-604.235251721863
+30
+1474.6140400213
+11
+154.93421062823
+21
+-778.906875772646
+31
+1474.6140400213
+12
+303.914386430124
+22
+-733.714233519903
+32
+1474.6140400213
+13
+303.914386430124
+23
+-733.714233519903
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+250.282436127116
+20
+-604.235251721863
+30
+1474.6140400213
+11
+303.914386430124
+21
+-733.714233519903
+31
+1474.6140400213
+12
+363.353779128852
+22
+-543.797359730523
+32
+1474.6140400213
+13
+363.353779128852
+23
+-543.797359730523
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+363.353779128852
+20
+-543.797359730523
+30
+1474.6140400213
+11
+303.914386430124
+21
+-733.714233519903
+31
+1474.6140400213
+12
+441.215302798659
+22
+-660.325364744673
+32
+1474.6140400213
+13
+441.215302798659
+23
+-660.325364744673
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+363.353779128852
+20
+-543.797359730523
+30
+1474.6140400213
+11
+441.215302798659
+21
+-660.325364744673
+31
+1474.6140400213
+12
+462.461640169813
+22
+-462.461640169813
+32
+1474.6140400213
+13
+462.461640169813
+23
+-462.461640169813
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+462.461640169813
+20
+-462.461640169813
+30
+1474.6140400213
+11
+441.215302798659
+21
+-660.325364744673
+31
+1474.6140400213
+12
+561.560562517035
+22
+-561.560562517035
+32
+1474.6140400213
+13
+561.560562517035
+23
+-561.560562517035
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+462.461640169813
+20
+-462.461640169813
+30
+1474.6140400213
+11
+561.560562517035
+21
+-561.560562517035
+31
+1474.6140400213
+12
+543.797359730523
+22
+-363.353779128852
+32
+1474.6140400213
+13
+543.797359730523
+23
+-363.353779128852
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+543.797359730523
+20
+-363.353779128852
+30
+1474.6140400213
+11
+561.560562517035
+21
+-561.560562517035
+31
+1474.6140400213
+12
+604.235251721863
+22
+-250.282436127116
+32
+1474.6140400213
+13
+604.235251721863
+23
+-250.282436127116
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+604.235251721863
+20
+-250.282436127116
+30
+1474.6140400213
+11
+561.560562517035
+21
+-561.560562517035
+31
+1474.6140400213
+12
+660.325364744673
+22
+-441.21530279866
+32
+1474.6140400213
+13
+660.325364744673
+23
+-441.21530279866
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+604.235251721863
+20
+-250.282436127116
+30
+1474.6140400213
+11
+660.325364744673
+21
+-441.21530279866
+31
+1474.6140400213
+12
+641.452721848564
+22
+-127.592879465023
+32
+1474.6140400213
+13
+641.452721848564
+23
+-127.592879465023
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+641.452721848564
+20
+-127.592879465023
+30
+1474.6140400213
+11
+660.325364744673
+21
+-441.21530279866
+31
+1474.6140400213
+12
+654.019523605455
+22
+-1.80477854883065e-13
+32
+1474.6140400213
+13
+654.019523605455
+23
+-1.80477854883065e-13
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+654.019523605455
+20
+-1.80477854883065e-13
+30
+1474.6140400213
+11
+660.325364744673
+21
+-441.21530279866
+31
+1474.6140400213
+12
+794.166563605455
+22
+-1.80477854883065e-13
+32
+1474.6140400213
+13
+794.166563605455
+23
+-1.80477854883065e-13
+33
+1474.6140400213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+794.166563605455
+20
+-1.80477854883065e-13
+30
+1474.6140400213
+11
+660.325364744673
+21
+-441.21530279866
+31
+1474.6140400213
+12
+733.714233519903
+22
+-303.914386430124
+32
+1474.6140400213
+13
+733.714233519903
+23
+-303.914386430124
+33
+1474.6140400213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+794.166563605455
+20
+-1.80477854883065e-13
+30
+1474.6140400213
+11
+733.714233519903
+21
+-303.914386430124
+31
+1474.6140400213
+12
+778.906875772646
+22
+-154.934210628231
+32
+1474.6140400213
+13
+778.906875772646
+23
+-154.934210628231
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-687.270773156591
+20
+-136.706656519425
+30
+1100.8886000213
+11
+-467.156803605456
+21
+0.0
+31
+1100.8886000213
+12
+-700.735203605456
+22
+0.0
+32
+1100.8886000213
+13
+-700.735203605456
+23
+0.0
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.156803605456
+20
+0.0
+30
+1100.8886000213
+11
+-687.270773156591
+21
+-136.706656519425
+31
+1100.8886000213
+12
+-647.39491232121
+22
+-268.159752894786
+32
+1100.8886000213
+13
+-647.39491232121
+23
+-268.159752894786
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.156803605456
+20
+0.0
+30
+1100.8886000213
+11
+-647.39491232121
+21
+-268.159752894786
+31
+1100.8886000213
+12
+-582.640028068573
+22
+-389.307620352121
+32
+1100.8886000213
+13
+-582.640028068573
+23
+-389.307620352121
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.156803605456
+20
+0.0
+30
+1100.8886000213
+11
+-582.640028068573
+21
+-389.307620352121
+31
+1100.8886000213
+12
+-495.494614285554
+22
+-495.494614285554
+32
+1100.8886000213
+13
+-495.494614285554
+23
+-495.494614285554
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.156803605456
+20
+0.0
+30
+1100.8886000213
+11
+-495.494614285554
+21
+-495.494614285554
+31
+1100.8886000213
+12
+-458.180516616454
+22
+-91.1377712474136
+32
+1100.8886000213
+13
+-458.180516616454
+23
+-91.1377712474136
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-458.180516616454
+20
+-91.1377712474136
+30
+1100.8886000213
+11
+-495.494614285554
+21
+-495.494614285554
+31
+1100.8886000213
+12
+-389.307620352121
+22
+-582.640028068573
+32
+1100.8886000213
+13
+-389.307620352121
+23
+-582.640028068573
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-458.180516616454
+20
+-91.1377712474136
+30
+1100.8886000213
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+-431.596609324475
+22
+-178.77316905644
+32
+1100.8886000213
+13
+-431.596609324475
+23
+-178.77316905644
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-431.596609324475
+20
+-178.77316905644
+30
+1100.8886000213
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+-388.426686378325
+22
+-259.538414235776
+32
+1100.8886000213
+13
+-388.426686378325
+23
+-259.538414235776
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-388.426686378325
+20
+-259.538414235776
+30
+1100.8886000213
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+-268.159752894786
+22
+-647.39491232121
+32
+1100.8886000213
+13
+-268.159752894786
+23
+-647.39491232121
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-388.426686378325
+20
+-259.538414235776
+30
+1100.8886000213
+11
+-268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+-330.32974370685
+22
+-330.32974370685
+32
+1100.8886000213
+13
+-330.32974370685
+23
+-330.32974370685
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-330.32974370685
+20
+-330.32974370685
+30
+1100.8886000213
+11
+-268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+-259.538414235776
+22
+-388.426686378324
+32
+1100.8886000213
+13
+-259.538414235776
+23
+-388.426686378324
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-259.538414235776
+20
+-388.426686378324
+30
+1100.8886000213
+11
+-268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+-136.706656519425
+22
+-687.270773156591
+32
+1100.8886000213
+13
+-136.706656519425
+23
+-687.270773156591
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-259.538414235776
+20
+-388.426686378324
+30
+1100.8886000213
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+-178.77316905644
+22
+-431.596609324475
+32
+1100.8886000213
+13
+-178.77316905644
+23
+-431.596609324475
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-178.77316905644
+20
+-431.596609324475
+30
+1100.8886000213
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+-91.1377712474136
+22
+-458.180516616454
+32
+1100.8886000213
+13
+-91.1377712474136
+23
+-458.180516616454
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-91.1377712474136
+20
+-458.180516616454
+30
+1100.8886000213
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+0.0
+22
+-700.735203605455
+32
+1100.8886000213
+13
+0.0
+23
+-700.735203605455
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-91.1377712474136
+20
+-458.180516616454
+30
+1100.8886000213
+11
+0.0
+21
+-700.735203605455
+31
+1100.8886000213
+12
+0.0
+22
+-467.156803605456
+32
+1100.8886000213
+13
+0.0
+23
+-467.156803605456
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-467.156803605456
+30
+1100.8886000213
+11
+0.0
+21
+-700.735203605455
+31
+1100.8886000213
+12
+136.706656519425
+22
+-687.270773156591
+32
+1100.8886000213
+13
+136.706656519425
+23
+-687.270773156591
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-467.156803605456
+30
+1100.8886000213
+11
+136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+91.1377712474136
+22
+-458.180516616454
+32
+1100.8886000213
+13
+91.1377712474136
+23
+-458.180516616454
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+91.1377712474136
+20
+-458.180516616454
+30
+1100.8886000213
+11
+136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+178.77316905644
+22
+-431.596609324475
+32
+1100.8886000213
+13
+178.77316905644
+23
+-431.596609324475
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+178.77316905644
+20
+-431.596609324475
+30
+1100.8886000213
+11
+136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+268.159752894786
+22
+-647.39491232121
+32
+1100.8886000213
+13
+268.159752894786
+23
+-647.39491232121
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+178.77316905644
+20
+-431.596609324475
+30
+1100.8886000213
+11
+268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+259.538414235775
+22
+-388.426686378325
+32
+1100.8886000213
+13
+259.538414235775
+23
+-388.426686378325
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+259.538414235775
+20
+-388.426686378325
+30
+1100.8886000213
+11
+268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+330.32974370685
+22
+-330.32974370685
+32
+1100.8886000213
+13
+330.32974370685
+23
+-330.32974370685
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+330.32974370685
+20
+-330.32974370685
+30
+1100.8886000213
+11
+268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+389.307620352121
+22
+-582.640028068573
+32
+1100.8886000213
+13
+389.307620352121
+23
+-582.640028068573
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+330.32974370685
+20
+-330.32974370685
+30
+1100.8886000213
+11
+389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+388.426686378325
+22
+-259.538414235776
+32
+1100.8886000213
+13
+388.426686378325
+23
+-259.538414235776
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+388.426686378325
+20
+-259.538414235776
+30
+1100.8886000213
+11
+389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+431.596609324475
+22
+-178.77316905644
+32
+1100.8886000213
+13
+431.596609324475
+23
+-178.77316905644
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+431.596609324475
+20
+-178.77316905644
+30
+1100.8886000213
+11
+389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+495.494614285554
+22
+-495.494614285554
+32
+1100.8886000213
+13
+495.494614285554
+23
+-495.494614285554
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+431.596609324475
+20
+-178.77316905644
+30
+1100.8886000213
+11
+495.494614285554
+21
+-495.494614285554
+31
+1100.8886000213
+12
+458.180516616454
+22
+-91.1377712474138
+32
+1100.8886000213
+13
+458.180516616454
+23
+-91.1377712474138
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+458.180516616454
+20
+-91.1377712474138
+30
+1100.8886000213
+11
+495.494614285554
+21
+-495.494614285554
+31
+1100.8886000213
+12
+467.156803605456
+22
+0.0
+32
+1100.8886000213
+13
+467.156803605456
+23
+0.0
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+467.156803605456
+20
+0.0
+30
+1100.8886000213
+11
+495.494614285554
+21
+-495.494614285554
+31
+1100.8886000213
+12
+700.735203605455
+22
+-1.80477854883065e-13
+32
+1100.8886000213
+13
+700.735203605455
+23
+-1.80477854883065e-13
+33
+1100.8886000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+700.735203605455
+20
+-1.80477854883065e-13
+30
+1100.8886000213
+11
+495.494614285554
+21
+-495.494614285554
+31
+1100.8886000213
+12
+582.640028068573
+22
+-389.307620352121
+32
+1100.8886000213
+13
+582.640028068573
+23
+-389.307620352121
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+700.735203605455
+20
+-1.80477854883065e-13
+30
+1100.8886000213
+11
+582.640028068573
+21
+-389.307620352121
+31
+1100.8886000213
+12
+647.39491232121
+22
+-268.159752894786
+32
+1100.8886000213
+13
+647.39491232121
+23
+-268.159752894786
+33
+1100.8886000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+700.735203605455
+20
+-1.80477854883065e-13
+30
+1100.8886000213
+11
+647.39491232121
+21
+-268.159752894786
+31
+1100.8886000213
+12
+687.270773156591
+22
+-136.706656519426
+32
+1100.8886000213
+13
+687.270773156591
+23
+-136.706656519426
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.088824464619
+20
+-145.820433573828
+30
+1287.75132002131
+11
+-607.303843605455
+21
+0.0
+31
+1287.75132002131
+12
+-747.450883605455
+22
+0.0
+32
+1287.75132002131
+13
+-747.450883605455
+23
+0.0
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-607.303843605455
+20
+0.0
+30
+1287.75132002131
+11
+-733.088824464619
+21
+-145.820433573828
+31
+1287.75132002131
+12
+-690.554572920556
+22
+-286.037069662455
+32
+1287.75132002131
+13
+-690.554572920556
+23
+-286.037069662455
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-607.303843605455
+20
+0.0
+30
+1287.75132002131
+11
+-690.554572920556
+21
+-286.037069662455
+31
+1287.75132002131
+12
+-621.482696406623
+22
+-415.26146157539
+32
+1287.75132002131
+13
+-621.482696406623
+23
+-415.26146157539
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-607.303843605455
+20
+0.0
+30
+1287.75132002131
+11
+-621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+-595.634670540536
+22
+-118.479102410621
+32
+1287.75132002131
+13
+-595.634670540536
+23
+-118.479102410621
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-595.634670540536
+20
+-118.479102410621
+30
+1287.75132002131
+11
+-621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+-528.527588401294
+22
+-528.527588401294
+32
+1287.75132002131
+13
+-528.527588401294
+23
+-528.527588401294
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-595.634670540536
+20
+-118.479102410621
+30
+1287.75132002131
+11
+-528.527588401294
+21
+-528.527588401294
+31
+1287.75132002131
+12
+-561.075591122516
+22
+-232.405119359447
+32
+1287.75132002131
+13
+-561.075591122516
+23
+-232.405119359447
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-561.075591122516
+20
+-232.405119359447
+30
+1287.75132002131
+11
+-528.527588401294
+21
+-528.527588401294
+31
+1287.75132002131
+12
+-504.954691392474
+22
+-337.399937905583
+32
+1287.75132002131
+13
+-504.954691392474
+23
+-337.399937905583
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-504.954691392474
+20
+-337.399937905583
+30
+1287.75132002131
+11
+-528.527588401294
+21
+-528.527588401294
+31
+1287.75132002131
+12
+-415.26146157539
+22
+-621.482696406623
+32
+1287.75132002131
+13
+-415.26146157539
+23
+-621.482696406623
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-504.954691392474
+20
+-337.399937905583
+30
+1287.75132002131
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1287.75132002131
+12
+-429.428666054072
+22
+-429.428666054072
+32
+1287.75132002131
+13
+-429.428666054072
+23
+-429.428666054072
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-429.428666054072
+20
+-429.428666054072
+30
+1287.75132002131
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1287.75132002131
+12
+-337.399937905583
+22
+-504.954691392473
+32
+1287.75132002131
+13
+-337.399937905583
+23
+-504.954691392473
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-337.399937905583
+20
+-504.954691392473
+30
+1287.75132002131
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1287.75132002131
+12
+-286.037069662455
+22
+-690.554572920556
+32
+1287.75132002131
+13
+-286.037069662455
+23
+-690.554572920556
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-337.399937905583
+20
+-504.954691392473
+30
+1287.75132002131
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1287.75132002131
+12
+-232.405119359447
+22
+-561.075591122516
+32
+1287.75132002131
+13
+-232.405119359447
+23
+-561.075591122516
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-232.405119359447
+20
+-561.075591122516
+30
+1287.75132002131
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1287.75132002131
+12
+-145.820433573828
+22
+-733.088824464619
+32
+1287.75132002131
+13
+-145.820433573828
+23
+-733.088824464619
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-232.405119359447
+20
+-561.075591122516
+30
+1287.75132002131
+11
+-145.820433573828
+21
+-733.088824464619
+31
+1287.75132002131
+12
+-118.479102410621
+22
+-595.634670540536
+32
+1287.75132002131
+13
+-118.479102410621
+23
+-595.634670540536
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-118.479102410621
+20
+-595.634670540536
+30
+1287.75132002131
+11
+-145.820433573828
+21
+-733.088824464619
+31
+1287.75132002131
+12
+0.0
+22
+-747.450883605455
+32
+1287.75132002131
+13
+0.0
+23
+-747.450883605455
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-118.479102410621
+20
+-595.634670540536
+30
+1287.75132002131
+11
+0.0
+21
+-747.450883605455
+31
+1287.75132002131
+12
+0.0
+22
+-607.303843605455
+32
+1287.75132002131
+13
+0.0
+23
+-607.303843605455
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-607.303843605455
+30
+1287.75132002131
+11
+0.0
+21
+-747.450883605455
+31
+1287.75132002131
+12
+145.820433573828
+22
+-733.088824464619
+32
+1287.75132002131
+13
+145.820433573828
+23
+-733.088824464619
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-607.303843605455
+30
+1287.75132002131
+11
+145.820433573828
+21
+-733.088824464619
+31
+1287.75132002131
+12
+118.479102410621
+22
+-595.634670540536
+32
+1287.75132002131
+13
+118.479102410621
+23
+-595.634670540536
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+118.479102410621
+20
+-595.634670540536
+30
+1287.75132002131
+11
+145.820433573828
+21
+-733.088824464619
+31
+1287.75132002131
+12
+232.405119359447
+22
+-561.075591122516
+32
+1287.75132002131
+13
+232.405119359447
+23
+-561.075591122516
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+232.405119359447
+20
+-561.075591122516
+30
+1287.75132002131
+11
+145.820433573828
+21
+-733.088824464619
+31
+1287.75132002131
+12
+286.037069662455
+22
+-690.554572920556
+32
+1287.75132002131
+13
+286.037069662455
+23
+-690.554572920556
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+232.405119359447
+20
+-561.075591122516
+30
+1287.75132002131
+11
+286.037069662455
+21
+-690.554572920556
+31
+1287.75132002131
+12
+337.399937905583
+22
+-504.954691392474
+32
+1287.75132002131
+13
+337.399937905583
+23
+-504.954691392474
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+337.399937905583
+20
+-504.954691392474
+30
+1287.75132002131
+11
+286.037069662455
+21
+-690.554572920556
+31
+1287.75132002131
+12
+415.26146157539
+22
+-621.482696406623
+32
+1287.75132002131
+13
+415.26146157539
+23
+-621.482696406623
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+337.399937905583
+20
+-504.954691392474
+30
+1287.75132002131
+11
+415.26146157539
+21
+-621.482696406623
+31
+1287.75132002131
+12
+429.428666054072
+22
+-429.428666054072
+32
+1287.75132002131
+13
+429.428666054072
+23
+-429.428666054072
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+429.428666054072
+20
+-429.428666054072
+30
+1287.75132002131
+11
+415.26146157539
+21
+-621.482696406623
+31
+1287.75132002131
+12
+528.527588401294
+22
+-528.527588401294
+32
+1287.75132002131
+13
+528.527588401294
+23
+-528.527588401294
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+429.428666054072
+20
+-429.428666054072
+30
+1287.75132002131
+11
+528.527588401294
+21
+-528.527588401294
+31
+1287.75132002131
+12
+504.954691392474
+22
+-337.399937905583
+32
+1287.75132002131
+13
+504.954691392474
+23
+-337.399937905583
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+504.954691392474
+20
+-337.399937905583
+30
+1287.75132002131
+11
+528.527588401294
+21
+-528.527588401294
+31
+1287.75132002131
+12
+561.075591122516
+22
+-232.405119359447
+32
+1287.75132002131
+13
+561.075591122516
+23
+-232.405119359447
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+561.075591122516
+20
+-232.405119359447
+30
+1287.75132002131
+11
+528.527588401294
+21
+-528.527588401294
+31
+1287.75132002131
+12
+621.482696406623
+22
+-415.26146157539
+32
+1287.75132002131
+13
+621.482696406623
+23
+-415.26146157539
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+561.075591122516
+20
+-232.405119359447
+30
+1287.75132002131
+11
+621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+595.634670540536
+22
+-118.479102410621
+32
+1287.75132002131
+13
+595.634670540536
+23
+-118.479102410621
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+595.634670540536
+20
+-118.479102410621
+30
+1287.75132002131
+11
+621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+607.303843605455
+22
+-1.80477854883065e-13
+32
+1287.75132002131
+13
+607.303843605455
+23
+-1.80477854883065e-13
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+607.303843605455
+20
+-1.80477854883065e-13
+30
+1287.75132002131
+11
+621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+747.450883605455
+22
+-1.80477854883065e-13
+32
+1287.75132002131
+13
+747.450883605455
+23
+-1.80477854883065e-13
+33
+1287.75132002131
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+747.450883605455
+20
+-1.80477854883065e-13
+30
+1287.75132002131
+11
+621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+690.554572920556
+22
+-286.037069662455
+32
+1287.75132002131
+13
+690.554572920556
+23
+-286.037069662455
+33
+1287.75132002131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+747.450883605455
+20
+-1.80477854883065e-13
+30
+1287.75132002131
+11
+690.554572920556
+21
+-286.037069662455
+31
+1287.75132002131
+12
+733.088824464619
+22
+-145.820433573828
+32
+1287.75132002131
+13
+733.088824464619
+23
+-145.820433573828
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-699.298837021391
+30
+628.271001705821
+11
+-126.938054583664
+21
+-638.160694862082
+31
+587.016306884026
+12
+-136.426435300007
+22
+-685.862005953678
+32
+628.271001705821
+13
+-136.426435300007
+23
+-685.862005953678
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-126.938054583664
+20
+-638.160694862082
+30
+587.016306884026
+11
+0.0
+21
+-699.298837021391
+31
+628.271001705821
+12
+0.0
+22
+-650.663001997455
+32
+587.016306884026
+13
+0.0
+23
+-650.663001997455
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-373.870315466121
+20
+-902.602786167016
+30
+1967.39330582966
+11
+-188.233089011893
+21
+-946.311642114328
+31
+1900.55285125842
+12
+-369.232485975391
+22
+-891.406075310522
+32
+1900.55285125842
+13
+-369.232485975391
+23
+-891.406075310522
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-188.233089011893
+20
+-946.311642114328
+30
+1900.55285125842
+11
+-373.870315466121
+21
+-902.602786167016
+31
+1967.39330582966
+12
+-190.597433982906
+22
+-958.19800696011
+32
+1967.39330582966
+13
+-190.597433982906
+23
+-958.19800696011
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-462.461640169813
+20
+-462.461640169813
+30
+1474.6140400213
+11
+-415.26146157539
+21
+-621.482696406623
+31
+1287.75132002131
+12
+-528.527588401294
+22
+-528.527588401294
+32
+1287.75132002131
+13
+-528.527588401294
+23
+-528.527588401294
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-415.26146157539
+20
+-621.482696406623
+30
+1287.75132002131
+11
+-462.461640169813
+21
+-462.461640169813
+31
+1474.6140400213
+12
+-363.353779128852
+22
+-543.797359730523
+32
+1474.6140400213
+13
+-363.353779128852
+23
+-543.797359730523
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-902.602786167016
+20
+-373.87031546612
+30
+2103.01109421295
+11
+-802.244272938819
+21
+-536.042485570818
+31
+2169.85154878419
+12
+-812.321046486997
+22
+-542.775570394861
+32
+2103.01109421295
+13
+-812.321046486997
+23
+-542.775570394861
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-802.244272938819
+20
+-536.042485570818
+30
+2169.85154878419
+11
+-902.602786167016
+21
+-373.87031546612
+31
+2103.01109421295
+12
+-891.406075310522
+22
+-369.232485975391
+32
+2169.85154878419
+13
+-891.406075310522
+23
+-369.232485975391
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-815.696038096872
+20
+-545.030667691736
+30
+2035.2022000213
+11
+-690.822264545374
+21
+-690.822264545373
+31
+2103.01109421295
+12
+-693.692458979998
+22
+-693.692458979998
+32
+2035.2022000213
+13
+-693.692458979998
+23
+-693.692458979998
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.822264545374
+20
+-690.822264545373
+30
+2103.01109421295
+11
+-815.696038096872
+21
+-545.030667691736
+31
+2035.2022000213
+12
+-812.321046486997
+22
+-542.775570394861
+32
+2103.01109421295
+13
+-812.321046486997
+23
+-542.775570394861
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-812.321046486997
+20
+-542.775570394861
+30
+2103.01109421295
+11
+-682.252673061849
+21
+-682.252673061848
+31
+2169.85154878419
+12
+-690.822264545374
+22
+-690.822264545373
+32
+2103.01109421295
+13
+-690.822264545374
+23
+-690.822264545373
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-682.252673061849
+20
+-682.252673061848
+30
+2169.85154878419
+11
+-812.321046486997
+21
+-542.775570394861
+31
+2103.01109421295
+12
+-802.244272938819
+22
+-536.042485570818
+32
+2169.85154878419
+13
+-802.244272938819
+23
+-536.042485570818
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-802.244272938819
+20
+-536.042485570818
+30
+2169.85154878419
+11
+-668.106074549528
+21
+-668.106074549528
+31
+2234.76895526921
+12
+-682.252673061849
+22
+-682.252673061848
+32
+2169.85154878419
+13
+-682.252673061849
+23
+-682.252673061848
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-668.106074549528
+20
+-668.106074549528
+30
+2234.76895526921
+11
+-802.244272938819
+21
+-536.042485570818
+31
+2169.85154878419
+12
+-785.609632890959
+22
+-524.927574441361
+32
+2234.76895526921
+13
+-785.609632890959
+23
+-524.927574441361
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-785.609632890959
+20
+-524.927574441361
+30
+2234.76895526921
+11
+-648.584509266648
+21
+-648.584509266648
+31
+2296.83616997626
+12
+-668.106074549528
+22
+-668.106074549528
+32
+2234.76895526921
+13
+-668.106074549528
+23
+-668.106074549528
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-648.584509266648
+20
+-648.584509266648
+30
+2296.83616997626
+11
+-785.609632890959
+21
+-524.927574441361
+31
+2234.76895526921
+12
+-762.654700553784
+22
+-509.589579018778
+32
+2296.83616997626
+13
+-762.654700553784
+23
+-509.589579018778
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+646.067882633009
+20
+-267.610079200261
+30
+628.271001705821
+11
+638.160694862082
+21
+-126.938054583664
+31
+587.016306884026
+12
+601.1342301078
+22
+-248.997950917359
+32
+587.016306884026
+13
+601.1342301078
+23
+-248.997950917359
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+638.160694862082
+20
+-126.938054583664
+30
+587.016306884026
+11
+646.067882633009
+21
+-267.610079200261
+31
+628.271001705821
+12
+685.862005953678
+22
+-136.426435300007
+32
+628.271001705821
+13
+685.862005953678
+23
+-136.426435300007
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+735.304703143143
+20
+-1.80477854883065e-13
+30
+680.911023534629
+11
+685.862005953678
+21
+-136.426435300007
+31
+628.271001705821
+12
+721.176029454062
+22
+-143.45083131617
+32
+680.911023534629
+13
+721.176029454062
+23
+-143.45083131617
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+685.862005953678
+20
+-136.426435300007
+30
+628.271001705821
+11
+735.304703143143
+21
+-1.80477854883065e-13
+31
+680.911023534629
+12
+699.298837021391
+22
+-1.80477854883065e-13
+32
+628.271001705821
+13
+699.298837021391
+23
+-1.80477854883065e-13
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+756.121025443459
+20
+-1.80477854883065e-13
+30
+741.194313252463
+11
+721.176029454062
+21
+-143.45083131617
+31
+680.911023534629
+12
+741.592371958341
+22
+-147.51189433693
+32
+741.194313252463
+13
+741.592371958341
+23
+-147.51189433693
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+721.176029454062
+20
+-143.45083131617
+30
+680.911023534629
+11
+756.121025443459
+21
+-1.80477854883065e-13
+31
+741.194313252463
+12
+735.304703143143
+22
+-1.80477854883065e-13
+32
+680.911023534629
+13
+735.304703143143
+23
+-1.80477854883065e-13
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.707315899088
+20
+-490.247554968877
+30
+1715.23764468454
+11
+-847.416499400322
+21
+-351.011407030345
+31
+1773.56823006635
+12
+-762.654700553784
+22
+-509.589579018778
+32
+1773.56823006635
+13
+-762.654700553784
+23
+-509.589579018778
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-847.416499400322
+20
+-351.011407030345
+30
+1773.56823006635
+11
+-733.707315899088
+21
+-490.247554968877
+31
+1715.23764468454
+12
+-815.251888924487
+22
+-337.688389142806
+32
+1715.23764468454
+13
+-815.251888924487
+23
+-337.688389142806
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+760.268019036986
+20
+-1.80477854883065e-13
+30
+804.835469255871
+11
+741.592371958341
+21
+-147.51189433693
+31
+741.194313252463
+12
+745.659682232799
+22
+-148.32093265249
+32
+804.835469255871
+13
+745.659682232799
+23
+-148.32093265249
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+741.592371958341
+20
+-147.51189433693
+30
+741.194313252463
+11
+760.268019036986
+21
+-1.80477854883065e-13
+31
+804.835469255871
+12
+756.121025443459
+22
+-1.80477854883065e-13
+32
+741.194313252463
+13
+756.121025443459
+23
+-1.80477854883065e-13
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.088824464618
+20
+-145.820433573828
+30
+867.310386884026
+11
+760.268019036986
+21
+-1.80477854883065e-13
+31
+804.835469255871
+12
+745.659682232799
+22
+-148.32093265249
+32
+804.835469255871
+13
+745.659682232799
+23
+-148.32093265249
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+760.268019036986
+20
+-1.80477854883065e-13
+30
+804.835469255871
+11
+733.088824464618
+21
+-145.820433573828
+31
+867.310386884026
+12
+747.450883605455
+22
+-1.80477854883065e-13
+32
+867.310386884026
+13
+747.450883605455
+23
+-1.80477854883065e-13
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+467.156803605456
+20
+0.0
+30
+1100.8886000213
+11
+733.088824464618
+21
+-145.820433573828
+31
+867.310386884026
+12
+458.180516616454
+22
+-91.1377712474138
+32
+1100.8886000213
+13
+458.180516616454
+23
+-91.1377712474138
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.088824464618
+20
+-145.820433573828
+30
+867.310386884026
+11
+467.156803605456
+21
+0.0
+31
+1100.8886000213
+12
+747.450883605455
+22
+-1.80477854883065e-13
+32
+867.310386884026
+13
+747.450883605455
+23
+-1.80477854883065e-13
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.714233519903
+20
+-303.914386430124
+30
+1474.6140400213
+11
+-582.640028068573
+21
+-389.307620352121
+31
+1661.47676002131
+12
+-660.325364744673
+22
+-441.215302798659
+32
+1474.6140400213
+13
+-660.325364744673
+23
+-441.215302798659
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-582.640028068573
+20
+-389.307620352121
+30
+1661.47676002131
+11
+-733.714233519903
+21
+-303.914386430124
+31
+1474.6140400213
+12
+-647.39491232121
+22
+-268.159752894786
+32
+1661.47676002131
+13
+-647.39491232121
+23
+-268.159752894786
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-815.251888924486
+20
+-337.688389142806
+30
+2355.16675535807
+11
+-699.180902483484
+21
+-467.1777430806
+31
+2408.9276400213
+12
+-733.707315899088
+22
+-490.247554968877
+32
+2355.16675535807
+13
+-733.707315899088
+23
+-490.247554968877
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-699.180902483484
+20
+-467.1777430806
+30
+2408.9276400213
+11
+-815.251888924486
+21
+-337.688389142806
+31
+2355.16675535807
+12
+-776.88819383121
+22
+-321.797626332425
+32
+2408.9276400213
+13
+-776.88819383121
+23
+-321.797626332425
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-847.416499400322
+20
+-351.011407030345
+30
+2296.83616997626
+11
+-733.707315899088
+21
+-490.247554968877
+31
+2355.16675535807
+12
+-762.654700553784
+22
+-509.589579018778
+32
+2296.83616997626
+13
+-762.654700553784
+23
+-509.589579018778
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.707315899088
+20
+-490.247554968877
+30
+2355.16675535807
+11
+-847.416499400322
+21
+-351.011407030345
+31
+2296.83616997626
+12
+-815.251888924486
+22
+-337.688389142806
+32
+2355.16675535807
+13
+-815.251888924486
+23
+-337.688389142806
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-824.740107573921
+20
+-164.051007270482
+30
+1661.47676002131
+11
+-882.422285845505
+21
+0.0
+31
+1715.23764468454
+12
+-865.466789057043
+22
+-172.152047899808
+32
+1715.23764468454
+13
+-865.466789057043
+23
+-172.152047899808
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-882.422285845505
+20
+0.0
+30
+1715.23764468454
+11
+-824.740107573921
+21
+-164.051007270482
+31
+1661.47676002131
+12
+-840.897721502147
+22
+0.0
+32
+1661.47676002131
+13
+-840.897721502147
+23
+0.0
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-458.180516616454
+20
+-91.1377712474136
+30
+1100.8886000213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+867.310386884026
+12
+-733.088824464618
+22
+-145.820433573828
+32
+867.310386884026
+13
+-733.088824464618
+23
+-145.820433573828
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+867.310386884026
+11
+-458.180516616454
+21
+-91.1377712474136
+31
+1100.8886000213
+12
+-431.596609324475
+22
+-178.77316905644
+32
+1100.8886000213
+13
+-431.596609324475
+23
+-178.77316905644
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-865.466789057043
+20
+-172.152047899808
+30
+2355.16675535807
+11
+-776.88819383121
+21
+-321.797626332425
+31
+2408.9276400213
+12
+-815.251888924486
+22
+-337.688389142806
+32
+2355.16675535807
+13
+-815.251888924486
+23
+-337.688389142806
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-776.88819383121
+20
+-321.797626332425
+30
+2408.9276400213
+11
+-865.466789057043
+21
+-172.152047899808
+31
+2355.16675535807
+12
+-824.740107573921
+22
+-164.051007270482
+32
+2408.9276400213
+13
+-824.740107573921
+23
+-164.051007270482
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.088824464619
+20
+-145.820433573828
+30
+1287.75132002131
+11
+-604.235251721863
+21
+-250.282436127117
+31
+1474.6140400213
+12
+-690.554572920556
+22
+-286.037069662455
+32
+1287.75132002131
+13
+-690.554572920556
+23
+-286.037069662455
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-604.235251721863
+20
+-250.282436127117
+30
+1474.6140400213
+11
+-733.088824464619
+21
+-145.820433573828
+31
+1287.75132002131
+12
+-641.452721848564
+22
+-127.592879465023
+32
+1474.6140400213
+13
+-641.452721848564
+23
+-127.592879465023
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-962.179081004757
+20
+-191.38931884584
+30
+2035.2022000213
+11
+-902.602786167016
+21
+-373.87031546612
+31
+2103.01109421295
+12
+-906.352875917291
+22
+-375.423653500801
+32
+2035.2022000213
+13
+-906.352875917291
+23
+-375.423653500801
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-902.602786167016
+20
+-373.87031546612
+30
+2103.01109421295
+11
+-962.179081004757
+21
+-191.38931884584
+31
+2035.2022000213
+12
+-958.19800696011
+22
+-190.597433982906
+32
+2103.01109421295
+13
+-958.19800696011
+23
+-190.597433982906
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.088824464619
+20
+-145.820433573828
+30
+2408.9276400213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+2549.0746800213
+12
+-690.554572920556
+22
+-286.037069662455
+32
+2408.9276400213
+13
+-690.554572920556
+23
+-286.037069662455
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+-733.088824464619
+21
+-145.820433573828
+31
+2408.9276400213
+12
+-733.088824464618
+22
+-145.820433573828
+32
+2549.0746800213
+13
+-733.088824464618
+23
+-145.820433573828
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-741.592371958341
+20
+-147.511894336929
+30
+741.194313252463
+11
+-760.268019036986
+21
+0.0
+31
+804.835469255871
+12
+-745.659682232799
+22
+-148.32093265249
+32
+804.835469255871
+13
+-745.659682232799
+23
+-148.32093265249
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-760.268019036986
+20
+0.0
+30
+804.835469255871
+11
+-741.592371958341
+21
+-147.511894336929
+31
+741.194313252463
+12
+-756.121025443459
+22
+0.0
+32
+741.194313252463
+13
+-756.121025443459
+23
+0.0
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-882.422285845505
+30
+2355.16675535807
+11
+178.9440635192
+21
+-899.612557411553
+31
+2296.83616997626
+12
+0.0
+22
+-917.237009349992
+32
+2296.83616997626
+13
+0.0
+23
+-917.237009349992
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+178.9440635192
+20
+-899.612557411553
+30
+2296.83616997626
+11
+0.0
+21
+-882.422285845505
+31
+2355.16675535807
+12
+172.152047899807
+22
+-865.466789057043
+32
+2355.16675535807
+13
+172.152047899807
+23
+-865.466789057043
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-840.897721502147
+30
+2408.9276400213
+11
+172.152047899807
+21
+-865.466789057043
+31
+2355.16675535807
+12
+0.0
+22
+-882.422285845505
+32
+2355.16675535807
+13
+0.0
+23
+-882.422285845505
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+172.152047899807
+20
+-865.466789057043
+30
+2355.16675535807
+11
+0.0
+21
+-840.897721502147
+31
+2408.9276400213
+12
+164.051007270482
+22
+-824.740107573921
+32
+2408.9276400213
+13
+164.051007270482
+23
+-824.740107573921
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-815.251888924487
+20
+-337.688389142806
+30
+1715.23764468454
+11
+-899.612557411553
+21
+-178.944063519201
+31
+1773.56823006635
+12
+-847.416499400322
+22
+-351.011407030345
+32
+1773.56823006635
+13
+-847.416499400322
+23
+-351.011407030345
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-899.612557411553
+20
+-178.944063519201
+30
+1773.56823006635
+11
+-815.251888924487
+21
+-337.688389142806
+31
+1715.23764468454
+12
+-865.466789057043
+22
+-172.152047899808
+32
+1715.23764468454
+13
+-865.466789057043
+23
+-172.152047899808
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.707315899088
+20
+-490.247554968877
+30
+2355.16675535807
+11
+-594.604481158485
+21
+-594.604481158485
+31
+2408.9276400213
+12
+-623.966782191491
+22
+-623.96678219149
+32
+2355.16675535807
+13
+-623.966782191491
+23
+-623.96678219149
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+-733.707315899088
+21
+-490.247554968877
+31
+2355.16675535807
+12
+-699.180902483484
+22
+-467.1777430806
+32
+2408.9276400213
+13
+-699.180902483484
+23
+-467.1777430806
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-534.658304488796
+20
+-534.658304488796
+30
+741.194313252463
+11
+-408.513405265646
+21
+-611.383516446667
+31
+680.911023534629
+12
+-519.938941830878
+22
+-519.938941830878
+32
+680.911023534629
+13
+-519.938941830878
+23
+-519.938941830878
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-408.513405265646
+20
+-611.383516446667
+30
+680.911023534629
+11
+-534.658304488796
+21
+-534.658304488796
+31
+741.194313252463
+12
+-420.078334296643
+22
+-628.691655879275
+32
+741.194313252463
+13
+-420.078334296643
+23
+-628.691655879275
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-537.590671780316
+20
+-537.590671780316
+30
+804.835469255871
+11
+-420.078334296643
+21
+-628.691655879275
+31
+741.194313252463
+12
+-534.658304488796
+22
+-534.658304488796
+32
+741.194313252463
+13
+-534.658304488796
+23
+-534.658304488796
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-420.078334296643
+20
+-628.691655879275
+30
+741.194313252463
+11
+-537.590671780316
+21
+-537.590671780316
+31
+804.835469255871
+12
+-422.38228049373
+22
+-632.139755034707
+32
+804.835469255871
+13
+-422.38228049373
+23
+-632.139755034707
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+867.310386884026
+11
+-422.38228049373
+21
+-632.139755034707
+31
+804.835469255871
+12
+-537.590671780316
+22
+-537.590671780316
+32
+804.835469255871
+13
+-537.590671780316
+23
+-537.590671780316
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-422.38228049373
+20
+-632.139755034707
+30
+804.835469255871
+11
+-528.527588401294
+21
+-528.527588401294
+31
+867.310386884026
+12
+-415.26146157539
+22
+-621.482696406622
+32
+867.310386884026
+13
+-415.26146157539
+23
+-621.482696406622
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-330.32974370685
+20
+-330.32974370685
+30
+1100.8886000213
+11
+-415.26146157539
+21
+-621.482696406622
+31
+867.310386884026
+12
+-528.527588401294
+22
+-528.527588401294
+32
+867.310386884026
+13
+-528.527588401294
+23
+-528.527588401294
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-415.26146157539
+20
+-621.482696406622
+30
+867.310386884026
+11
+-330.32974370685
+21
+-330.32974370685
+31
+1100.8886000213
+12
+-259.538414235776
+22
+-388.426686378324
+32
+1100.8886000213
+13
+-259.538414235776
+23
+-388.426686378324
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-702.396062011173
+20
+-290.941975042481
+30
+804.835469255871
+11
+-621.482696406623
+21
+-415.26146157539
+31
+867.310386884026
+12
+-632.139755034707
+22
+-422.38228049373
+32
+804.835469255871
+13
+-632.139755034707
+23
+-422.38228049373
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+867.310386884026
+11
+-702.396062011173
+21
+-290.941975042481
+31
+804.835469255871
+12
+-690.554572920556
+22
+-286.037069662455
+32
+867.310386884026
+13
+-690.554572920556
+23
+-286.037069662455
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-762.654700553784
+20
+-509.589579018778
+30
+2296.83616997626
+11
+-623.966782191491
+21
+-623.96678219149
+31
+2355.16675535807
+12
+-648.584509266648
+22
+-648.584509266648
+32
+2296.83616997626
+13
+-648.584509266648
+23
+-648.584509266648
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-623.966782191491
+20
+-623.96678219149
+30
+2355.16675535807
+11
+-762.654700553784
+21
+-509.589579018778
+31
+2296.83616997626
+12
+-733.707315899088
+22
+-490.247554968877
+32
+2355.16675535807
+13
+-733.707315899088
+23
+-490.247554968877
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-944.844671731792
+30
+1835.6354447734
+11
+178.9440635192
+21
+-899.612557411553
+31
+1773.56823006635
+12
+0.0
+22
+-917.237009349992
+32
+1773.56823006635
+13
+0.0
+23
+-917.237009349992
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+178.9440635192
+20
+-899.612557411553
+30
+1773.56823006635
+11
+0.0
+21
+-944.844671731792
+31
+1835.6354447734
+12
+184.330051263378
+22
+-926.689746301964
+32
+1835.6354447734
+13
+184.330051263378
+23
+-926.689746301964
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-363.353779128852
+20
+-543.797359730523
+30
+1474.6140400213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+1287.75132002131
+12
+-415.26146157539
+22
+-621.482696406623
+32
+1287.75132002131
+13
+-415.26146157539
+23
+-621.482696406623
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+1287.75132002131
+11
+-363.353779128852
+21
+-543.797359730523
+31
+1474.6140400213
+12
+-250.282436127117
+22
+-604.235251721863
+32
+1474.6140400213
+13
+-250.282436127117
+23
+-604.235251721863
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-582.640028068573
+20
+-389.307620352121
+30
+1100.8886000213
+11
+-429.428666054072
+21
+-429.428666054072
+31
+1287.75132002131
+12
+-495.494614285554
+22
+-495.494614285554
+32
+1100.8886000213
+13
+-495.494614285554
+23
+-495.494614285554
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-429.428666054072
+20
+-429.428666054072
+30
+1287.75132002131
+11
+-582.640028068573
+21
+-389.307620352121
+31
+1100.8886000213
+12
+-504.954691392474
+22
+-337.399937905583
+32
+1287.75132002131
+13
+-504.954691392474
+23
+-337.399937905583
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-747.450883605455
+30
+2549.0746800213
+11
+145.820433573828
+21
+-733.088824464619
+31
+2408.9276400213
+12
+0.0
+22
+-747.450883605455
+32
+2408.9276400213
+13
+0.0
+23
+-747.450883605455
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+145.820433573828
+20
+-733.088824464619
+30
+2408.9276400213
+11
+0.0
+21
+-747.450883605455
+31
+2549.0746800213
+12
+145.820433573828
+22
+-733.088824464618
+32
+2549.0746800213
+13
+145.820433573828
+23
+-733.088824464618
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-699.180902483484
+20
+-467.1777430806
+30
+1661.47676002131
+11
+-815.251888924487
+21
+-337.688389142806
+31
+1715.23764468454
+12
+-733.707315899088
+22
+-490.247554968877
+32
+1715.23764468454
+13
+-733.707315899088
+23
+-490.247554968877
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-815.251888924487
+20
+-337.688389142806
+30
+1715.23764468454
+11
+-699.180902483484
+21
+-467.1777430806
+31
+1661.47676002131
+12
+-776.88819383121
+22
+-321.797626332425
+32
+1661.47676002131
+13
+-776.88819383121
+23
+-321.797626332425
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-902.602786167016
+20
+-373.87031546612
+30
+1967.39330582966
+11
+-962.179081004757
+21
+-191.38931884584
+31
+2035.2022000213
+12
+-906.352875917291
+22
+-375.423653500801
+32
+2035.2022000213
+13
+-906.352875917291
+23
+-375.423653500801
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-962.179081004757
+20
+-191.38931884584
+30
+2035.2022000213
+11
+-902.602786167016
+21
+-373.87031546612
+31
+1967.39330582966
+12
+-958.198006960111
+22
+-190.597433982906
+32
+1967.39330582966
+13
+-958.198006960111
+23
+-190.597433982906
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-647.39491232121
+20
+-268.159752894786
+30
+1100.8886000213
+11
+-504.954691392474
+21
+-337.399937905583
+31
+1287.75132002131
+12
+-582.640028068573
+22
+-389.307620352121
+32
+1100.8886000213
+13
+-582.640028068573
+23
+-389.307620352121
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-504.954691392474
+20
+-337.399937905583
+30
+1287.75132002131
+11
+-647.39491232121
+21
+-268.159752894786
+31
+1100.8886000213
+12
+-561.075591122516
+22
+-232.405119359447
+32
+1287.75132002131
+13
+-561.075591122516
+23
+-232.405119359447
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-747.450883605455
+20
+0.0
+30
+2408.9276400213
+11
+-733.088824464618
+21
+-145.820433573828
+31
+2549.0746800213
+12
+-733.088824464619
+22
+-145.820433573828
+32
+2408.9276400213
+13
+-733.088824464619
+23
+-145.820433573828
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.088824464618
+20
+-145.820433573828
+30
+2549.0746800213
+11
+-747.450883605455
+21
+0.0
+31
+2408.9276400213
+12
+-747.450883605455
+22
+0.0
+32
+2549.0746800213
+13
+-747.450883605455
+23
+0.0
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-581.445732901797
+20
+-388.509617834311
+30
+628.271001705821
+11
+-601.134230107799
+21
+-248.997950917359
+31
+587.016306884026
+12
+-646.067882633009
+22
+-267.610079200261
+32
+628.271001705821
+13
+-646.067882633009
+23
+-267.610079200261
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-601.134230107799
+20
+-248.997950917359
+30
+587.016306884026
+11
+-581.445732901797
+21
+-388.509617834311
+31
+628.271001705821
+12
+-541.006514010434
+22
+-361.48899563696
+32
+587.016306884026
+13
+-541.006514010434
+23
+-361.48899563696
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-494.478949733692
+20
+-494.478949733692
+30
+628.271001705821
+11
+-611.383516446667
+21
+-408.513405265645
+31
+680.911023534629
+12
+-519.938941830878
+22
+-519.938941830878
+32
+680.911023534629
+13
+-519.938941830878
+23
+-519.938941830878
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-611.383516446667
+20
+-408.513405265645
+30
+680.911023534629
+11
+-494.478949733692
+21
+-494.478949733692
+31
+628.271001705821
+12
+-581.445732901797
+22
+-388.509617834311
+32
+628.271001705821
+13
+-581.445732901797
+23
+-388.509617834311
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-534.658304488796
+20
+-534.658304488796
+30
+741.194313252463
+11
+-632.139755034707
+21
+-422.38228049373
+31
+804.835469255871
+12
+-537.590671780316
+22
+-537.590671780316
+32
+804.835469255871
+13
+-537.590671780316
+23
+-537.590671780316
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-632.139755034707
+20
+-422.38228049373
+30
+804.835469255871
+11
+-534.658304488796
+21
+-534.658304488796
+31
+741.194313252463
+12
+-628.691655879276
+22
+-420.078334296643
+32
+741.194313252463
+13
+-628.691655879276
+23
+-420.078334296643
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-632.139755034707
+20
+-422.38228049373
+30
+804.835469255871
+11
+-528.527588401294
+21
+-528.527588401294
+31
+867.310386884026
+12
+-537.590671780316
+22
+-537.590671780316
+32
+804.835469255871
+13
+-537.590671780316
+23
+-537.590671780316
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+867.310386884026
+11
+-632.139755034707
+21
+-422.38228049373
+31
+804.835469255871
+12
+-621.482696406623
+22
+-415.26146157539
+32
+867.310386884026
+13
+-621.482696406623
+23
+-415.26146157539
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-388.426686378325
+20
+-259.538414235776
+30
+1100.8886000213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+867.310386884026
+12
+-621.482696406623
+22
+-415.26146157539
+32
+867.310386884026
+13
+-621.482696406623
+23
+-415.26146157539
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+867.310386884026
+11
+-388.426686378325
+21
+-259.538414235776
+31
+1100.8886000213
+12
+-330.32974370685
+22
+-330.32974370685
+32
+1100.8886000213
+13
+-330.32974370685
+23
+-330.32974370685
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-164.051007270482
+20
+-824.740107573921
+30
+2408.9276400213
+11
+0.0
+21
+-882.422285845505
+31
+2355.16675535807
+12
+-172.152047899808
+22
+-865.466789057043
+32
+2355.16675535807
+13
+-172.152047899808
+23
+-865.466789057043
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-882.422285845505
+30
+2355.16675535807
+11
+-164.051007270482
+21
+-824.740107573921
+31
+2408.9276400213
+12
+0.0
+22
+-840.897721502147
+32
+2408.9276400213
+13
+0.0
+23
+-840.897721502147
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.822264545374
+20
+-690.822264545374
+30
+1967.39330582966
+11
+-536.042485570819
+21
+-802.244272938819
+31
+1900.55285125842
+12
+-682.252673061849
+22
+-682.252673061849
+32
+1900.55285125842
+13
+-682.252673061849
+23
+-682.252673061849
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-536.042485570819
+20
+-802.244272938819
+30
+1900.55285125842
+11
+-690.822264545374
+21
+-690.822264545374
+31
+1967.39330582966
+12
+-542.775570394861
+22
+-812.321046486997
+32
+1967.39330582966
+13
+-542.775570394861
+23
+-812.321046486997
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+595.634670540536
+20
+-118.479102410621
+30
+1287.75132002131
+11
+700.735203605455
+21
+-1.80477854883065e-13
+31
+1100.8886000213
+12
+687.270773156591
+22
+-136.706656519426
+32
+1100.8886000213
+13
+687.270773156591
+23
+-136.706656519426
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+700.735203605455
+20
+-1.80477854883065e-13
+30
+1100.8886000213
+11
+595.634670540536
+21
+-118.479102410621
+31
+1287.75132002131
+12
+607.303843605455
+22
+-1.80477854883065e-13
+32
+1287.75132002131
+13
+607.303843605455
+23
+-1.80477854883065e-13
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-735.304703143143
+30
+680.911023534629
+11
+136.426435300007
+21
+-685.862005953678
+31
+628.271001705821
+12
+0.0
+22
+-699.298837021391
+32
+628.271001705821
+13
+0.0
+23
+-699.298837021391
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+136.426435300007
+20
+-685.862005953678
+30
+628.271001705821
+11
+0.0
+21
+-735.304703143143
+31
+680.911023534629
+12
+143.450831316169
+22
+-721.176029454062
+32
+680.911023534629
+13
+143.450831316169
+23
+-721.176029454062
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-785.609632890959
+20
+-524.927574441361
+30
+1835.6354447734
+11
+-891.406075310523
+21
+-369.232485975391
+31
+1900.55285125842
+12
+-802.244272938819
+22
+-536.042485570818
+32
+1900.55285125842
+13
+-802.244272938819
+23
+-536.042485570818
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-891.406075310523
+20
+-369.232485975391
+30
+1900.55285125842
+11
+-785.609632890959
+21
+-524.927574441361
+31
+1835.6354447734
+12
+-872.922653615348
+22
+-361.576402030189
+32
+1835.6354447734
+13
+-872.922653615348
+23
+-361.576402030189
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-917.237009349992
+20
+0.0
+30
+2296.83616997626
+11
+-865.466789057043
+21
+-172.152047899808
+31
+2355.16675535807
+12
+-899.612557411553
+22
+-178.9440635192
+32
+2296.83616997626
+13
+-899.612557411553
+23
+-178.9440635192
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-865.466789057043
+20
+-172.152047899808
+30
+2355.16675535807
+11
+-917.237009349992
+21
+0.0
+31
+2296.83616997626
+12
+-882.422285845505
+22
+0.0
+32
+2355.16675535807
+13
+-882.422285845505
+23
+0.0
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-337.688389142806
+20
+-815.251888924486
+30
+2355.16675535807
+11
+-178.9440635192
+21
+-899.612557411553
+31
+2296.83616997626
+12
+-351.011407030345
+22
+-847.416499400322
+32
+2296.83616997626
+13
+-351.011407030345
+23
+-847.416499400322
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-178.9440635192
+20
+-899.612557411553
+30
+2296.83616997626
+11
+-337.688389142806
+21
+-815.251888924486
+31
+2355.16675535807
+12
+-172.152047899808
+22
+-865.466789057043
+32
+2355.16675535807
+13
+-172.152047899808
+23
+-865.466789057043
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-321.797626332425
+20
+-776.88819383121
+30
+2408.9276400213
+11
+-172.152047899808
+21
+-865.466789057043
+31
+2355.16675535807
+12
+-337.688389142806
+22
+-815.251888924486
+32
+2355.16675535807
+13
+-337.688389142806
+23
+-815.251888924486
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-172.152047899808
+20
+-865.466789057043
+30
+2355.16675535807
+11
+-321.797626332425
+21
+-776.88819383121
+31
+2408.9276400213
+12
+-164.051007270482
+22
+-824.740107573921
+32
+2408.9276400213
+13
+-164.051007270482
+23
+-824.740107573921
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-747.450883605455
+20
+0.0
+30
+1287.75132002131
+11
+-641.452721848564
+21
+-127.592879465023
+31
+1474.6140400213
+12
+-733.088824464619
+22
+-145.820433573828
+32
+1287.75132002131
+13
+-733.088824464619
+23
+-145.820433573828
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-641.452721848564
+20
+-127.592879465023
+30
+1474.6140400213
+11
+-747.450883605455
+21
+0.0
+31
+1287.75132002131
+12
+-654.019523605455
+22
+0.0
+32
+1474.6140400213
+13
+-654.019523605455
+23
+0.0
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-623.966782191491
+20
+-623.966782191491
+30
+1715.23764468454
+11
+-467.1777430806
+21
+-699.180902483483
+31
+1661.47676002131
+12
+-594.604481158485
+22
+-594.604481158485
+32
+1661.47676002131
+13
+-594.604481158485
+23
+-594.604481158485
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.1777430806
+20
+-699.180902483483
+30
+1661.47676002131
+11
+-623.966782191491
+21
+-623.966782191491
+31
+1715.23764468454
+12
+-490.247554968878
+22
+-733.707315899088
+32
+1715.23764468454
+13
+-490.247554968878
+23
+-733.707315899088
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-369.232485975391
+20
+-891.406075310522
+30
+2169.85154878419
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-373.87031546612
+22
+-902.602786167016
+32
+2103.01109421295
+13
+-373.87031546612
+23
+-902.602786167016
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-190.597433982906
+20
+-958.19800696011
+30
+2103.01109421295
+11
+-369.232485975391
+21
+-891.406075310522
+31
+2169.85154878419
+12
+-188.233089011893
+22
+-946.311642114328
+32
+2169.85154878419
+13
+-188.233089011893
+23
+-946.311642114328
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+2408.9276400213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+2549.0746800213
+12
+-621.482696406623
+22
+-415.26146157539
+32
+2408.9276400213
+13
+-621.482696406623
+23
+-415.26146157539
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+2549.0746800213
+11
+-690.554572920556
+21
+-286.037069662455
+31
+2408.9276400213
+12
+-690.554572920556
+22
+-286.037069662455
+32
+2549.0746800213
+13
+-690.554572920556
+23
+-286.037069662455
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-388.509617834311
+20
+-581.445732901797
+30
+628.271001705821
+11
+-460.088220979597
+21
+-460.088220979597
+31
+587.016306884026
+12
+-494.478949733692
+22
+-494.478949733692
+32
+628.271001705821
+13
+-494.478949733692
+23
+-494.478949733692
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-460.088220979597
+20
+-460.088220979597
+30
+587.016306884026
+11
+-388.509617834311
+21
+-581.445732901797
+31
+628.271001705821
+12
+-361.48899563696
+22
+-541.006514010434
+32
+587.016306884026
+13
+-361.48899563696
+23
+-541.006514010434
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-542.775570394861
+20
+-812.321046486997
+30
+1967.39330582966
+11
+-369.232485975391
+21
+-891.406075310522
+31
+1900.55285125842
+12
+-536.042485570819
+22
+-802.244272938819
+32
+1900.55285125842
+13
+-536.042485570819
+23
+-802.244272938819
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-369.232485975391
+20
+-891.406075310522
+30
+1900.55285125842
+11
+-542.775570394861
+21
+-812.321046486997
+31
+1967.39330582966
+12
+-373.870315466121
+22
+-902.602786167016
+32
+1967.39330582966
+13
+-373.870315466121
+23
+-902.602786167016
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-778.906875772646
+20
+-154.93421062823
+30
+1474.6140400213
+11
+-647.39491232121
+21
+-268.159752894786
+31
+1661.47676002131
+12
+-733.714233519903
+22
+-303.914386430124
+32
+1474.6140400213
+13
+-733.714233519903
+23
+-303.914386430124
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-647.39491232121
+20
+-268.159752894786
+30
+1661.47676002131
+11
+-778.906875772646
+21
+-154.93421062823
+31
+1474.6140400213
+12
+-687.270773156591
+22
+-136.706656519425
+32
+1661.47676002131
+13
+-687.270773156591
+23
+-136.706656519425
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-369.232485975391
+20
+-891.406075310522
+30
+1900.55285125842
+11
+-184.330051263378
+21
+-926.689746301964
+31
+1835.6354447734
+12
+-361.576402030189
+22
+-872.922653615348
+32
+1835.6354447734
+13
+-361.576402030189
+23
+-872.922653615348
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-184.330051263378
+20
+-926.689746301964
+30
+1835.6354447734
+11
+-369.232485975391
+21
+-891.406075310522
+31
+1900.55285125842
+12
+-188.233089011893
+22
+-946.311642114328
+32
+1900.55285125842
+13
+-188.233089011893
+23
+-946.311642114328
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-698.564739508658
+20
+-289.354989300114
+30
+741.194313252463
+11
+-745.659682232799
+21
+-148.32093265249
+31
+804.835469255871
+12
+-702.396062011173
+22
+-290.941975042481
+32
+804.835469255871
+13
+-702.396062011173
+23
+-290.941975042481
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-745.659682232799
+20
+-148.32093265249
+30
+804.835469255871
+11
+-698.564739508658
+21
+-289.354989300114
+31
+741.194313252463
+12
+-741.592371958341
+22
+-147.511894336929
+32
+741.194313252463
+13
+-741.592371958341
+23
+-147.511894336929
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-127.592879465023
+20
+-641.452721848564
+30
+1474.6140400213
+11
+0.0
+21
+-747.450883605455
+31
+1287.75132002131
+12
+-145.820433573828
+22
+-733.088824464619
+32
+1287.75132002131
+13
+-145.820433573828
+23
+-733.088824464619
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-747.450883605455
+30
+1287.75132002131
+11
+-127.592879465023
+21
+-641.452721848564
+31
+1474.6140400213
+12
+0.0
+22
+-654.019523605455
+32
+1474.6140400213
+13
+0.0
+23
+-654.019523605455
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-981.029283605455
+20
+-1.80477854883065e-13
+30
+2035.2022000213
+11
+-958.19800696011
+21
+-190.597433982906
+31
+2103.01109421295
+12
+-962.179081004757
+22
+-191.38931884584
+32
+2035.2022000213
+13
+-962.179081004757
+23
+-191.38931884584
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-958.19800696011
+20
+-190.597433982906
+30
+2103.01109421295
+11
+-981.029283605455
+21
+-1.80477854883065e-13
+31
+2035.2022000213
+12
+-976.970215709361
+22
+0.0
+32
+2103.01109421295
+13
+-976.970215709361
+23
+0.0
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-865.466789057043
+20
+-172.152047899808
+30
+1715.23764468454
+11
+-917.237009349992
+21
+0.0
+31
+1773.56823006635
+12
+-899.612557411553
+22
+-178.944063519201
+32
+1773.56823006635
+13
+-899.612557411553
+23
+-178.944063519201
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-917.237009349992
+20
+0.0
+30
+1773.56823006635
+11
+-865.466789057043
+21
+-172.152047899808
+31
+1715.23764468454
+12
+-882.422285845505
+22
+0.0
+32
+1715.23764468454
+13
+-882.422285845505
+23
+0.0
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-944.844671731792
+20
+0.0
+30
+2234.76895526921
+11
+-899.612557411553
+21
+-178.9440635192
+31
+2296.83616997626
+12
+-926.689746301964
+22
+-184.330051263378
+32
+2234.76895526921
+13
+-926.689746301964
+23
+-184.330051263378
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-899.612557411553
+20
+-178.9440635192
+30
+2296.83616997626
+11
+-944.844671731792
+21
+0.0
+31
+2234.76895526921
+12
+-917.237009349992
+22
+0.0
+32
+2296.83616997626
+13
+-917.237009349992
+23
+0.0
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-762.654700553784
+20
+-509.589579018778
+30
+1773.56823006635
+11
+-872.922653615348
+21
+-361.576402030189
+31
+1835.6354447734
+12
+-785.609632890959
+22
+-524.927574441361
+32
+1835.6354447734
+13
+-785.609632890959
+23
+-524.927574441361
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-872.922653615348
+20
+-361.576402030189
+30
+1835.6354447734
+11
+-762.654700553784
+21
+-509.589579018778
+31
+1773.56823006635
+12
+-847.416499400322
+22
+-351.011407030345
+32
+1773.56823006635
+13
+-847.416499400322
+23
+-351.011407030345
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-679.332965393238
+20
+-281.388927633011
+30
+680.911023534629
+11
+-741.592371958341
+21
+-147.511894336929
+31
+741.194313252463
+12
+-698.564739508658
+22
+-289.354989300114
+32
+741.194313252463
+13
+-698.564739508658
+23
+-289.354989300114
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-741.592371958341
+20
+-147.511894336929
+30
+741.194313252463
+11
+-679.332965393238
+21
+-281.388927633011
+31
+680.911023534629
+12
+-721.176029454062
+22
+-143.450831316169
+32
+680.911023534629
+13
+-721.176029454062
+23
+-143.450831316169
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-389.307620352121
+20
+-582.640028068573
+30
+1661.47676002131
+11
+-303.914386430124
+21
+-733.714233519903
+31
+1474.6140400213
+12
+-441.21530279866
+22
+-660.325364744672
+32
+1474.6140400213
+13
+-441.21530279866
+23
+-660.325364744672
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-303.914386430124
+20
+-733.714233519903
+30
+1474.6140400213
+11
+-389.307620352121
+21
+-582.640028068573
+31
+1661.47676002131
+12
+-268.159752894786
+22
+-647.39491232121
+32
+1661.47676002131
+13
+-268.159752894786
+23
+-647.39491232121
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-594.604481158485
+20
+-594.604481158485
+30
+1661.47676002131
+11
+-733.707315899088
+21
+-490.247554968877
+31
+1715.23764468454
+12
+-623.966782191491
+22
+-623.966782191491
+32
+1715.23764468454
+13
+-623.966782191491
+23
+-623.966782191491
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.707315899088
+20
+-490.247554968877
+30
+1715.23764468454
+11
+-594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+-699.180902483484
+22
+-467.1777430806
+32
+1661.47676002131
+13
+-699.180902483484
+23
+-467.1777430806
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-623.966782191491
+20
+-623.966782191491
+30
+1715.23764468454
+11
+-762.654700553784
+21
+-509.589579018778
+31
+1773.56823006635
+12
+-648.584509266648
+22
+-648.584509266648
+32
+1773.56823006635
+13
+-648.584509266648
+23
+-648.584509266648
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-762.654700553784
+20
+-509.589579018778
+30
+1773.56823006635
+11
+-623.966782191491
+21
+-623.966782191491
+31
+1715.23764468454
+12
+-733.707315899088
+22
+-490.247554968877
+32
+1715.23764468454
+13
+-733.707315899088
+23
+-490.247554968877
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-519.938941830878
+20
+-519.938941830878
+30
+680.911023534629
+11
+-628.691655879276
+21
+-420.078334296643
+31
+741.194313252463
+12
+-534.658304488796
+22
+-534.658304488796
+32
+741.194313252463
+13
+-534.658304488796
+23
+-534.658304488796
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-628.691655879276
+20
+-420.078334296643
+30
+741.194313252463
+11
+-519.938941830878
+21
+-519.938941830878
+31
+680.911023534629
+12
+-611.383516446667
+22
+-408.513405265645
+32
+680.911023534629
+13
+-611.383516446667
+23
+-408.513405265645
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-685.862005953678
+20
+-136.426435300007
+30
+628.271001705821
+11
+-650.663001997455
+21
+0.0
+31
+587.016306884026
+12
+-699.298837021391
+22
+0.0
+32
+628.271001705821
+13
+-699.298837021391
+23
+0.0
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-650.663001997455
+20
+0.0
+30
+587.016306884026
+11
+-685.862005953678
+21
+-136.426435300007
+31
+628.271001705821
+12
+-638.160694862082
+22
+-126.938054583664
+32
+587.016306884026
+13
+-638.160694862082
+23
+-126.938054583664
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.822264545374
+20
+-690.822264545373
+30
+2103.01109421295
+11
+-545.030667691736
+21
+-815.696038096871
+31
+2035.2022000213
+12
+-693.692458979998
+22
+-693.692458979998
+32
+2035.2022000213
+13
+-693.692458979998
+23
+-693.692458979998
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-545.030667691736
+20
+-815.696038096871
+30
+2035.2022000213
+11
+-690.822264545374
+21
+-690.822264545373
+31
+2103.01109421295
+12
+-542.775570394861
+22
+-812.321046486996
+32
+2103.01109421295
+13
+-542.775570394861
+23
+-812.321046486996
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-682.252673061849
+20
+-682.252673061848
+30
+2169.85154878419
+11
+-542.775570394861
+21
+-812.321046486996
+31
+2103.01109421295
+12
+-690.822264545374
+22
+-690.822264545373
+32
+2103.01109421295
+13
+-690.822264545374
+23
+-690.822264545373
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-542.775570394861
+20
+-812.321046486996
+30
+2103.01109421295
+11
+-682.252673061849
+21
+-682.252673061848
+31
+2169.85154878419
+12
+-536.042485570818
+22
+-802.244272938819
+32
+2169.85154878419
+13
+-536.042485570818
+23
+-802.244272938819
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-747.450883605455
+30
+867.310386884026
+11
+148.32093265249
+21
+-745.659682232799
+31
+804.835469255871
+12
+0.0
+22
+-760.268019036986
+32
+804.835469255871
+13
+0.0
+23
+-760.268019036986
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+148.32093265249
+20
+-745.659682232799
+30
+804.835469255871
+11
+0.0
+21
+-747.450883605455
+31
+867.310386884026
+12
+145.820433573828
+22
+-733.088824464618
+32
+867.310386884026
+13
+145.820433573828
+23
+-733.088824464618
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+91.1377712474136
+20
+-458.180516616454
+30
+1100.8886000213
+11
+0.0
+21
+-747.450883605455
+31
+867.310386884026
+12
+0.0
+22
+-467.156803605456
+32
+1100.8886000213
+13
+0.0
+23
+-467.156803605456
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-747.450883605455
+30
+867.310386884026
+11
+91.1377712474136
+21
+-458.180516616454
+31
+1100.8886000213
+12
+145.820433573828
+22
+-733.088824464618
+32
+867.310386884026
+13
+145.820433573828
+23
+-733.088824464618
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-847.416499400322
+20
+-351.011407030345
+30
+1773.56823006635
+11
+-926.689746301964
+21
+-184.330051263378
+31
+1835.6354447734
+12
+-872.922653615348
+22
+-361.576402030189
+32
+1835.6354447734
+13
+-872.922653615348
+23
+-361.576402030189
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-926.689746301964
+20
+-184.330051263378
+30
+1835.6354447734
+11
+-847.416499400322
+21
+-351.011407030345
+31
+1773.56823006635
+12
+-899.612557411553
+22
+-178.944063519201
+32
+1773.56823006635
+13
+-899.612557411553
+23
+-178.944063519201
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-190.597433982906
+20
+-958.19800696011
+30
+1967.39330582966
+11
+0.0
+21
+-964.850983209364
+31
+1900.55285125842
+12
+-188.233089011893
+22
+-946.311642114328
+32
+1900.55285125842
+13
+-188.233089011893
+23
+-946.311642114328
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-964.850983209364
+30
+1900.55285125842
+11
+-190.597433982906
+21
+-958.19800696011
+31
+1967.39330582966
+12
+0.0
+22
+-976.970215709361
+32
+1967.39330582966
+13
+0.0
+23
+-976.970215709361
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-756.121025443459
+30
+741.194313252463
+11
+143.450831316169
+21
+-721.176029454062
+31
+680.911023534629
+12
+0.0
+22
+-735.304703143143
+32
+680.911023534629
+13
+0.0
+23
+-735.304703143143
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+143.450831316169
+20
+-721.176029454062
+30
+680.911023534629
+11
+0.0
+21
+-756.121025443459
+31
+741.194313252463
+12
+147.511894336929
+22
+-741.592371958341
+32
+741.194313252463
+13
+147.511894336929
+23
+-741.592371958341
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-760.268019036986
+30
+804.835469255871
+11
+147.511894336929
+21
+-741.592371958341
+31
+741.194313252463
+12
+0.0
+22
+-756.121025443459
+32
+741.194313252463
+13
+0.0
+23
+-756.121025443459
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+147.511894336929
+20
+-741.592371958341
+30
+741.194313252463
+11
+0.0
+21
+-760.268019036986
+31
+804.835469255871
+12
+148.32093265249
+22
+-745.659682232799
+32
+804.835469255871
+13
+148.32093265249
+23
+-745.659682232799
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-760.268019036986
+20
+0.0
+30
+804.835469255871
+11
+-733.088824464618
+21
+-145.820433573828
+31
+867.310386884026
+12
+-745.659682232799
+22
+-148.32093265249
+32
+804.835469255871
+13
+-745.659682232799
+23
+-148.32093265249
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.088824464618
+20
+-145.820433573828
+30
+867.310386884026
+11
+-760.268019036986
+21
+0.0
+31
+804.835469255871
+12
+-747.450883605455
+22
+0.0
+32
+867.310386884026
+13
+-747.450883605455
+23
+0.0
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-872.922653615348
+20
+-361.576402030189
+30
+1835.6354447734
+11
+-946.311642114328
+21
+-188.233089011893
+31
+1900.55285125842
+12
+-891.406075310523
+22
+-369.232485975391
+32
+1900.55285125842
+13
+-891.406075310523
+23
+-369.232485975391
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-946.311642114328
+20
+-188.233089011893
+30
+1900.55285125842
+11
+-872.922653615348
+21
+-361.576402030189
+31
+1835.6354447734
+12
+-926.689746301964
+22
+-184.330051263378
+32
+1835.6354447734
+13
+-926.689746301964
+23
+-184.330051263378
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+641.452721848564
+20
+-127.592879465023
+30
+1474.6140400213
+11
+747.450883605455
+21
+-1.80477854883065e-13
+31
+1287.75132002131
+12
+733.088824464619
+22
+-145.820433573828
+32
+1287.75132002131
+13
+733.088824464619
+23
+-145.820433573828
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+747.450883605455
+20
+-1.80477854883065e-13
+30
+1287.75132002131
+11
+641.452721848564
+21
+-127.592879465023
+31
+1474.6140400213
+12
+654.019523605455
+22
+-1.80477854883065e-13
+32
+1474.6140400213
+13
+654.019523605455
+23
+-1.80477854883065e-13
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-745.659682232799
+20
+-148.32093265249
+30
+804.835469255871
+11
+-690.554572920556
+21
+-286.037069662455
+31
+867.310386884026
+12
+-702.396062011173
+22
+-290.941975042481
+32
+804.835469255871
+13
+-702.396062011173
+23
+-290.941975042481
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.554572920556
+20
+-286.037069662455
+30
+867.310386884026
+11
+-745.659682232799
+21
+-148.32093265249
+31
+804.835469255871
+12
+-733.088824464618
+22
+-145.820433573828
+32
+867.310386884026
+13
+-733.088824464618
+23
+-145.820433573828
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-373.87031546612
+20
+-902.602786167016
+30
+2103.01109421295
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-375.423653500801
+22
+-906.352875917291
+32
+2035.2022000213
+13
+-375.423653500801
+23
+-906.352875917291
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-191.38931884584
+20
+-962.179081004757
+30
+2035.2022000213
+11
+-373.87031546612
+21
+-902.602786167016
+31
+2103.01109421295
+12
+-190.597433982906
+22
+-958.19800696011
+32
+2103.01109421295
+13
+-190.597433982906
+23
+-958.19800696011
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-259.538414235776
+20
+-388.426686378324
+30
+1100.8886000213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+867.310386884026
+12
+-415.26146157539
+22
+-621.482696406622
+32
+867.310386884026
+13
+-415.26146157539
+23
+-621.482696406622
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+867.310386884026
+11
+-259.538414235776
+21
+-388.426686378324
+31
+1100.8886000213
+12
+-178.77316905644
+22
+-431.596609324475
+32
+1100.8886000213
+13
+-178.77316905644
+23
+-431.596609324475
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-628.691655879276
+20
+-420.078334296643
+30
+741.194313252463
+11
+-702.396062011173
+21
+-290.941975042481
+31
+804.835469255871
+12
+-632.139755034707
+22
+-422.38228049373
+32
+804.835469255871
+13
+-632.139755034707
+23
+-422.38228049373
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-702.396062011173
+20
+-290.941975042481
+30
+804.835469255871
+11
+-628.691655879276
+21
+-420.078334296643
+31
+741.194313252463
+12
+-698.564739508658
+22
+-289.354989300114
+32
+741.194313252463
+13
+-698.564739508658
+23
+-289.354989300114
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-794.166563605455
+20
+0.0
+30
+1474.6140400213
+11
+-687.270773156591
+21
+-136.706656519425
+31
+1661.47676002131
+12
+-778.906875772646
+22
+-154.93421062823
+32
+1474.6140400213
+13
+-778.906875772646
+23
+-154.93421062823
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-687.270773156591
+20
+-136.706656519425
+30
+1661.47676002131
+11
+-794.166563605455
+21
+0.0
+31
+1474.6140400213
+12
+-700.735203605456
+22
+0.0
+32
+1661.47676002131
+13
+-700.735203605456
+23
+0.0
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-337.399937905583
+20
+-504.954691392473
+30
+1287.75132002131
+11
+-268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+-389.307620352121
+22
+-582.640028068573
+32
+1100.8886000213
+13
+-389.307620352121
+23
+-582.640028068573
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-268.159752894786
+20
+-647.39491232121
+30
+1100.8886000213
+11
+-337.399937905583
+21
+-504.954691392473
+31
+1287.75132002131
+12
+-232.405119359447
+22
+-561.075591122516
+32
+1287.75132002131
+13
+-232.405119359447
+23
+-561.075591122516
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-976.970215709361
+20
+0.0
+30
+2103.01109421295
+11
+-946.311642114328
+21
+-188.233089011893
+31
+2169.85154878419
+12
+-958.19800696011
+22
+-190.597433982906
+32
+2103.01109421295
+13
+-958.19800696011
+23
+-190.597433982906
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-946.311642114328
+20
+-188.233089011893
+30
+2169.85154878419
+11
+-976.970215709361
+21
+0.0
+31
+2103.01109421295
+12
+-964.850983209364
+22
+0.0
+32
+2169.85154878419
+13
+-964.850983209364
+23
+0.0
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+679.332965393237
+20
+-281.388927633011
+30
+680.911023534629
+11
+581.445732901797
+21
+-388.509617834311
+31
+628.271001705821
+12
+611.383516446667
+22
+-408.513405265645
+32
+680.911023534629
+13
+611.383516446667
+23
+-408.513405265645
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+581.445732901797
+20
+-388.509617834311
+30
+628.271001705821
+11
+679.332965393237
+21
+-281.388927633011
+31
+680.911023534629
+12
+646.067882633009
+22
+-267.610079200261
+32
+628.271001705821
+13
+646.067882633009
+23
+-267.610079200261
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-145.820433573828
+20
+-733.088824464618
+30
+2549.0746800213
+11
+0.0
+21
+-747.450883605455
+31
+2408.9276400213
+12
+-145.820433573828
+22
+-733.088824464619
+32
+2408.9276400213
+13
+-145.820433573828
+23
+-733.088824464619
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-747.450883605455
+30
+2408.9276400213
+11
+-145.820433573828
+21
+-733.088824464618
+31
+2549.0746800213
+12
+0.0
+22
+-747.450883605455
+32
+2549.0746800213
+13
+0.0
+23
+-747.450883605455
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+1287.75132002131
+11
+-462.461640169813
+21
+-462.461640169813
+31
+1474.6140400213
+12
+-528.527588401294
+22
+-528.527588401294
+32
+1287.75132002131
+13
+-528.527588401294
+23
+-528.527588401294
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-462.461640169813
+20
+-462.461640169813
+30
+1474.6140400213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+-543.797359730523
+22
+-363.353779128852
+32
+1474.6140400213
+13
+-543.797359730523
+23
+-363.353779128852
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-668.106074549528
+20
+-668.106074549528
+30
+2234.76895526921
+11
+-536.042485570818
+21
+-802.244272938819
+31
+2169.85154878419
+12
+-682.252673061849
+22
+-682.252673061848
+32
+2169.85154878419
+13
+-682.252673061849
+23
+-682.252673061848
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-536.042485570818
+20
+-802.244272938819
+30
+2169.85154878419
+11
+-668.106074549528
+21
+-668.106074549528
+31
+2234.76895526921
+12
+-524.927574441361
+22
+-785.609632890959
+32
+2234.76895526921
+13
+-524.927574441361
+23
+-785.609632890959
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-646.067882633009
+20
+-267.610079200261
+30
+628.271001705821
+11
+-638.160694862082
+21
+-126.938054583664
+31
+587.016306884026
+12
+-685.862005953678
+22
+-136.426435300007
+32
+628.271001705821
+13
+-685.862005953678
+23
+-136.426435300007
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-638.160694862082
+20
+-126.938054583664
+30
+587.016306884026
+11
+-646.067882633009
+21
+-267.610079200261
+31
+628.271001705821
+12
+-601.134230107799
+22
+-248.997950917359
+32
+587.016306884026
+13
+-601.134230107799
+23
+-248.997950917359
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.156803605456
+20
+0.0
+30
+1100.8886000213
+11
+-733.088824464618
+21
+-145.820433573828
+31
+867.310386884026
+12
+-747.450883605455
+22
+0.0
+32
+867.310386884026
+13
+-747.450883605455
+23
+0.0
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-733.088824464618
+20
+-145.820433573828
+30
+867.310386884026
+11
+-467.156803605456
+21
+0.0
+31
+1100.8886000213
+12
+-458.180516616454
+22
+-91.1377712474136
+32
+1100.8886000213
+13
+-458.180516616454
+23
+-91.1377712474136
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-891.406075310523
+20
+-369.232485975391
+30
+1900.55285125842
+11
+-958.198006960111
+21
+-190.597433982906
+31
+1967.39330582966
+12
+-902.602786167016
+22
+-373.87031546612
+32
+1967.39330582966
+13
+-902.602786167016
+23
+-373.87031546612
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-958.198006960111
+20
+-190.597433982906
+30
+1967.39330582966
+11
+-891.406075310523
+21
+-369.232485975391
+31
+1900.55285125842
+12
+-946.311642114328
+22
+-188.233089011893
+32
+1900.55285125842
+13
+-946.311642114328
+23
+-188.233089011893
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-648.584509266648
+20
+-648.584509266648
+30
+1773.56823006635
+11
+-490.247554968878
+21
+-733.707315899088
+31
+1715.23764468454
+12
+-623.966782191491
+22
+-623.966782191491
+32
+1715.23764468454
+13
+-623.966782191491
+23
+-623.966782191491
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-490.247554968878
+20
+-733.707315899088
+30
+1715.23764468454
+11
+-648.584509266648
+21
+-648.584509266648
+31
+1773.56823006635
+12
+-509.589579018779
+22
+-762.654700553784
+32
+1773.56823006635
+13
+-509.589579018779
+23
+-762.654700553784
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-668.106074549528
+20
+-668.106074549528
+30
+1835.6354447734
+11
+-509.589579018779
+21
+-762.654700553784
+31
+1773.56823006635
+12
+-648.584509266648
+22
+-648.584509266648
+32
+1773.56823006635
+13
+-648.584509266648
+23
+-648.584509266648
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-509.589579018779
+20
+-762.654700553784
+30
+1773.56823006635
+11
+-668.106074549528
+21
+-668.106074549528
+31
+1835.6354447734
+12
+-524.927574441361
+22
+-785.609632890959
+32
+1835.6354447734
+13
+-524.927574441361
+23
+-785.609632890959
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-415.26146157539
+20
+-621.482696406622
+30
+867.310386884026
+11
+-290.941975042481
+21
+-702.396062011173
+31
+804.835469255871
+12
+-422.38228049373
+22
+-632.139755034707
+32
+804.835469255871
+13
+-422.38228049373
+23
+-632.139755034707
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-290.941975042481
+20
+-702.396062011173
+30
+804.835469255871
+11
+-415.26146157539
+21
+-621.482696406622
+31
+867.310386884026
+12
+-286.037069662455
+22
+-690.554572920556
+32
+867.310386884026
+13
+-286.037069662455
+23
+-690.554572920556
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-648.584509266648
+20
+-648.584509266648
+30
+1773.56823006635
+11
+-785.609632890959
+21
+-524.927574441361
+31
+1835.6354447734
+12
+-668.106074549528
+22
+-668.106074549528
+32
+1835.6354447734
+13
+-668.106074549528
+23
+-668.106074549528
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-785.609632890959
+20
+-524.927574441361
+30
+1835.6354447734
+11
+-648.584509266648
+21
+-648.584509266648
+31
+1773.56823006635
+12
+-762.654700553784
+22
+-509.589579018778
+32
+1773.56823006635
+13
+-762.654700553784
+23
+-509.589579018778
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-660.325364744673
+20
+-441.215302798659
+30
+1474.6140400213
+11
+-495.494614285554
+21
+-495.494614285554
+31
+1661.47676002131
+12
+-561.560562517035
+22
+-561.560562517035
+32
+1474.6140400213
+13
+-561.560562517035
+23
+-561.560562517035
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-495.494614285554
+20
+-495.494614285554
+30
+1661.47676002131
+11
+-660.325364744673
+21
+-441.215302798659
+31
+1474.6140400213
+12
+-582.640028068573
+22
+-389.307620352121
+32
+1661.47676002131
+13
+-582.640028068573
+23
+-389.307620352121
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-682.252673061849
+20
+-682.252673061849
+30
+1900.55285125842
+11
+-812.321046486997
+21
+-542.775570394861
+31
+1967.39330582966
+12
+-690.822264545374
+22
+-690.822264545374
+32
+1967.39330582966
+13
+-690.822264545374
+23
+-690.822264545374
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-812.321046486997
+20
+-542.775570394861
+30
+1967.39330582966
+11
+-682.252673061849
+21
+-682.252673061849
+31
+1900.55285125842
+12
+-802.244272938819
+22
+-536.042485570818
+32
+1900.55285125842
+13
+-802.244272938819
+23
+-536.042485570818
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-690.822264545374
+20
+-690.822264545374
+30
+1967.39330582966
+11
+-815.696038096872
+21
+-545.030667691736
+31
+2035.2022000213
+12
+-693.692458979998
+22
+-693.692458979998
+32
+2035.2022000213
+13
+-693.692458979998
+23
+-693.692458979998
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-815.696038096872
+20
+-545.030667691736
+30
+2035.2022000213
+11
+-690.822264545374
+21
+-690.822264545374
+31
+1967.39330582966
+12
+-812.321046486997
+22
+-542.775570394861
+32
+1967.39330582966
+13
+-812.321046486997
+23
+-542.775570394861
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-648.584509266648
+20
+-648.584509266648
+30
+2296.83616997626
+11
+-524.927574441361
+21
+-785.609632890959
+31
+2234.76895526921
+12
+-668.106074549528
+22
+-668.106074549528
+32
+2234.76895526921
+13
+-668.106074549528
+23
+-668.106074549528
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-524.927574441361
+20
+-785.609632890959
+30
+2234.76895526921
+11
+-648.584509266648
+21
+-648.584509266648
+31
+2296.83616997626
+12
+-509.589579018778
+22
+-762.654700553784
+32
+2296.83616997626
+13
+-509.589579018778
+23
+-762.654700553784
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-623.966782191491
+20
+-623.96678219149
+30
+2355.16675535807
+11
+-509.589579018778
+21
+-762.654700553784
+31
+2296.83616997626
+12
+-648.584509266648
+22
+-648.584509266648
+32
+2296.83616997626
+13
+-648.584509266648
+23
+-648.584509266648
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-509.589579018778
+20
+-762.654700553784
+30
+2296.83616997626
+11
+-623.966782191491
+21
+-623.96678219149
+31
+2355.16675535807
+12
+-490.247554968877
+22
+-733.707315899088
+32
+2355.16675535807
+13
+-490.247554968877
+23
+-733.707315899088
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-495.494614285554
+20
+-495.494614285554
+30
+1661.47676002131
+11
+-441.21530279866
+21
+-660.325364744672
+31
+1474.6140400213
+12
+-561.560562517035
+22
+-561.560562517035
+32
+1474.6140400213
+13
+-561.560562517035
+23
+-561.560562517035
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-441.21530279866
+20
+-660.325364744672
+30
+1474.6140400213
+11
+-495.494614285554
+21
+-495.494614285554
+31
+1661.47676002131
+12
+-389.307620352121
+22
+-582.640028068573
+32
+1661.47676002131
+13
+-389.307620352121
+23
+-582.640028068573
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-431.596609324475
+20
+-178.77316905644
+30
+1100.8886000213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+867.310386884026
+12
+-690.554572920556
+22
+-286.037069662455
+32
+867.310386884026
+13
+-690.554572920556
+23
+-286.037069662455
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+867.310386884026
+11
+-431.596609324475
+21
+-178.77316905644
+31
+1100.8886000213
+12
+-388.426686378325
+22
+-259.538414235776
+32
+1100.8886000213
+13
+-388.426686378325
+23
+-259.538414235776
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-408.513405265646
+20
+-611.383516446667
+30
+680.911023534629
+11
+-267.610079200261
+21
+-646.067882633009
+31
+628.271001705821
+12
+-388.509617834311
+22
+-581.445732901797
+32
+628.271001705821
+13
+-388.509617834311
+23
+-581.445732901797
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-267.610079200261
+20
+-646.067882633009
+30
+628.271001705821
+11
+-408.513405265646
+21
+-611.383516446667
+31
+680.911023534629
+12
+-281.388927633011
+22
+-679.332965393238
+32
+680.911023534629
+13
+-281.388927633011
+23
+-679.332965393238
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-420.078334296643
+20
+-628.691655879275
+30
+741.194313252463
+11
+-281.388927633011
+21
+-679.332965393238
+31
+680.911023534629
+12
+-408.513405265646
+22
+-611.383516446667
+32
+680.911023534629
+13
+-408.513405265646
+23
+-611.383516446667
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-281.388927633011
+20
+-679.332965393238
+30
+680.911023534629
+11
+-420.078334296643
+21
+-628.691655879275
+31
+741.194313252463
+12
+-289.354989300114
+22
+-698.564739508657
+32
+741.194313252463
+13
+-289.354989300114
+23
+-698.564739508657
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-422.38228049373
+20
+-632.139755034707
+30
+804.835469255871
+11
+-289.354989300114
+21
+-698.564739508657
+31
+741.194313252463
+12
+-420.078334296643
+22
+-628.691655879275
+32
+741.194313252463
+13
+-420.078334296643
+23
+-628.691655879275
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-289.354989300114
+20
+-698.564739508657
+30
+741.194313252463
+11
+-422.38228049373
+21
+-632.139755034707
+31
+804.835469255871
+12
+-290.941975042481
+22
+-702.396062011173
+32
+804.835469255871
+13
+-290.941975042481
+23
+-702.396062011173
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-917.237009349992
+30
+1773.56823006635
+11
+172.152047899807
+21
+-865.466789057044
+31
+1715.23764468454
+12
+0.0
+22
+-882.422285845505
+32
+1715.23764468454
+13
+0.0
+23
+-882.422285845505
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+172.152047899807
+20
+-865.466789057044
+30
+1715.23764468454
+11
+0.0
+21
+-917.237009349992
+31
+1773.56823006635
+12
+178.9440635192
+22
+-899.612557411553
+32
+1773.56823006635
+13
+178.9440635192
+23
+-899.612557411553
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+-490.247554968877
+21
+-733.707315899088
+31
+2355.16675535807
+12
+-623.966782191491
+22
+-623.96678219149
+32
+2355.16675535807
+13
+-623.966782191491
+23
+-623.96678219149
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-490.247554968877
+20
+-733.707315899088
+30
+2355.16675535807
+11
+-594.604481158485
+21
+-594.604481158485
+31
+2408.9276400213
+12
+-467.1777430806
+22
+-699.180902483483
+32
+2408.9276400213
+13
+-467.1777430806
+23
+-699.180902483483
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+-415.26146157539
+21
+-621.482696406623
+31
+2408.9276400213
+12
+-528.527588401294
+22
+-528.527588401294
+32
+2408.9276400213
+13
+-528.527588401294
+23
+-528.527588401294
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-415.26146157539
+20
+-621.482696406623
+30
+2408.9276400213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+2549.0746800213
+12
+-415.26146157539
+22
+-621.482696406622
+32
+2549.0746800213
+13
+-415.26146157539
+23
+-621.482696406622
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-621.482696406623
+20
+-415.26146157539
+30
+2408.9276400213
+11
+-528.527588401294
+21
+-528.527588401294
+31
+2549.0746800213
+12
+-528.527588401294
+22
+-528.527588401294
+32
+2408.9276400213
+13
+-528.527588401294
+23
+-528.527588401294
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+-621.482696406623
+21
+-415.26146157539
+31
+2408.9276400213
+12
+-621.482696406623
+22
+-415.26146157539
+32
+2549.0746800213
+13
+-621.482696406623
+23
+-415.26146157539
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+687.270773156591
+20
+-136.706656519426
+30
+1661.47676002131
+11
+794.166563605455
+21
+-1.80477854883065e-13
+31
+1474.6140400213
+12
+778.906875772646
+22
+-154.934210628231
+32
+1474.6140400213
+13
+778.906875772646
+23
+-154.934210628231
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+794.166563605455
+20
+-1.80477854883065e-13
+30
+1474.6140400213
+11
+687.270773156591
+21
+-136.706656519426
+31
+1661.47676002131
+12
+700.735203605455
+22
+-1.80477854883065e-13
+32
+1661.47676002131
+13
+700.735203605455
+23
+-1.80477854883065e-13
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+882.422285845505
+20
+-1.80477854883065e-13
+30
+1715.23764468454
+11
+824.740107573921
+21
+-164.051007270483
+31
+1661.47676002131
+12
+865.466789057043
+22
+-172.152047899808
+32
+1715.23764468454
+13
+865.466789057043
+23
+-172.152047899808
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+824.740107573921
+20
+-164.051007270483
+30
+1661.47676002131
+11
+882.422285845505
+21
+-1.80477854883065e-13
+31
+1715.23764468454
+12
+840.897721502147
+22
+-1.80477854883065e-13
+32
+1661.47676002131
+13
+840.897721502147
+23
+-1.80477854883065e-13
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-524.927574441361
+20
+-785.609632890959
+30
+2234.76895526921
+11
+-369.232485975391
+21
+-891.406075310522
+31
+2169.85154878419
+12
+-536.042485570818
+22
+-802.244272938819
+32
+2169.85154878419
+13
+-536.042485570818
+23
+-802.244272938819
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-369.232485975391
+20
+-891.406075310522
+30
+2169.85154878419
+11
+-524.927574441361
+21
+-785.609632890959
+31
+2234.76895526921
+12
+-361.576402030189
+22
+-872.922653615348
+32
+2234.76895526921
+13
+-361.576402030189
+23
+-872.922653615348
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-509.589579018778
+20
+-762.654700553784
+30
+2296.83616997626
+11
+-361.576402030189
+21
+-872.922653615348
+31
+2234.76895526921
+12
+-524.927574441361
+22
+-785.609632890959
+32
+2234.76895526921
+13
+-524.927574441361
+23
+-785.609632890959
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-361.576402030189
+20
+-872.922653615348
+30
+2234.76895526921
+11
+-509.589579018778
+21
+-762.654700553784
+31
+2296.83616997626
+12
+-351.011407030345
+22
+-847.416499400322
+32
+2296.83616997626
+13
+-351.011407030345
+23
+-847.416499400322
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-490.247554968878
+20
+-733.707315899088
+30
+1715.23764468454
+11
+-321.797626332425
+21
+-776.88819383121
+31
+1661.47676002131
+12
+-467.1777430806
+22
+-699.180902483483
+32
+1661.47676002131
+13
+-467.1777430806
+23
+-699.180902483483
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-321.797626332425
+20
+-776.88819383121
+30
+1661.47676002131
+11
+-490.247554968878
+21
+-733.707315899088
+31
+1715.23764468454
+12
+-337.688389142806
+22
+-815.251888924487
+32
+1715.23764468454
+13
+-337.688389142806
+23
+-815.251888924487
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-494.478949733692
+20
+-494.478949733692
+30
+628.271001705821
+11
+-541.006514010434
+21
+-361.48899563696
+31
+587.016306884026
+12
+-581.445732901797
+22
+-388.509617834311
+32
+628.271001705821
+13
+-581.445732901797
+23
+-388.509617834311
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-541.006514010434
+20
+-361.48899563696
+30
+587.016306884026
+11
+-494.478949733692
+21
+-494.478949733692
+31
+628.271001705821
+12
+-460.088220979597
+22
+-460.088220979597
+32
+587.016306884026
+13
+-460.088220979597
+23
+-460.088220979597
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-509.589579018779
+20
+-762.654700553784
+30
+1773.56823006635
+11
+-337.688389142806
+21
+-815.251888924487
+31
+1715.23764468454
+12
+-490.247554968878
+22
+-733.707315899088
+32
+1715.23764468454
+13
+-490.247554968878
+23
+-733.707315899088
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-337.688389142806
+20
+-815.251888924487
+30
+1715.23764468454
+11
+-509.589579018779
+21
+-762.654700553784
+31
+1773.56823006635
+12
+-351.011407030345
+22
+-847.416499400322
+32
+1773.56823006635
+13
+-351.011407030345
+23
+-847.416499400322
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-524.927574441361
+20
+-785.609632890959
+30
+1835.6354447734
+11
+-351.011407030345
+21
+-847.416499400322
+31
+1773.56823006635
+12
+-509.589579018779
+22
+-762.654700553784
+32
+1773.56823006635
+13
+-509.589579018779
+23
+-762.654700553784
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-351.011407030345
+20
+-847.416499400322
+30
+1773.56823006635
+11
+-524.927574441361
+21
+-785.609632890959
+31
+1835.6354447734
+12
+-361.576402030189
+22
+-872.922653615348
+32
+1835.6354447734
+13
+-361.576402030189
+23
+-872.922653615348
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-536.042485570819
+20
+-802.244272938819
+30
+1900.55285125842
+11
+-361.576402030189
+21
+-872.922653615348
+31
+1835.6354447734
+12
+-524.927574441361
+22
+-785.609632890959
+32
+1835.6354447734
+13
+-524.927574441361
+23
+-785.609632890959
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-361.576402030189
+20
+-872.922653615348
+30
+1835.6354447734
+11
+-536.042485570819
+21
+-802.244272938819
+31
+1900.55285125842
+12
+-369.232485975391
+22
+-891.406075310522
+32
+1900.55285125842
+13
+-369.232485975391
+23
+-891.406075310522
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-700.735203605455
+30
+1661.47676002131
+11
+154.93421062823
+21
+-778.906875772646
+31
+1474.6140400213
+12
+0.0
+22
+-794.166563605455
+32
+1474.6140400213
+13
+0.0
+23
+-794.166563605455
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+154.93421062823
+20
+-778.906875772646
+30
+1474.6140400213
+11
+0.0
+21
+-700.735203605455
+31
+1661.47676002131
+12
+136.706656519425
+22
+-687.270773156591
+32
+1661.47676002131
+13
+136.706656519425
+23
+-687.270773156591
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-542.775570394861
+20
+-812.321046486996
+30
+2103.01109421295
+11
+-375.423653500801
+21
+-906.352875917291
+31
+2035.2022000213
+12
+-545.030667691736
+22
+-815.696038096871
+32
+2035.2022000213
+13
+-545.030667691736
+23
+-815.696038096871
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-375.423653500801
+20
+-906.352875917291
+30
+2035.2022000213
+11
+-542.775570394861
+21
+-812.321046486996
+31
+2103.01109421295
+12
+-373.87031546612
+22
+-902.602786167016
+32
+2103.01109421295
+13
+-373.87031546612
+23
+-902.602786167016
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-536.042485570818
+20
+-802.244272938819
+30
+2169.85154878419
+11
+-373.87031546612
+21
+-902.602786167016
+31
+2103.01109421295
+12
+-542.775570394861
+22
+-812.321046486996
+32
+2103.01109421295
+13
+-542.775570394861
+23
+-812.321046486996
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-373.87031546612
+20
+-902.602786167016
+30
+2103.01109421295
+11
+-536.042485570818
+21
+-802.244272938819
+31
+2169.85154878419
+12
+-369.232485975391
+22
+-891.406075310522
+32
+2169.85154878419
+13
+-369.232485975391
+23
+-891.406075310522
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-891.406075310522
+20
+-369.232485975391
+30
+2169.85154878419
+11
+-785.609632890959
+21
+-524.927574441361
+31
+2234.76895526921
+12
+-802.244272938819
+22
+-536.042485570818
+32
+2169.85154878419
+13
+-802.244272938819
+23
+-536.042485570818
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-785.609632890959
+20
+-524.927574441361
+30
+2234.76895526921
+11
+-891.406075310522
+21
+-369.232485975391
+31
+2169.85154878419
+12
+-872.922653615348
+22
+-361.576402030189
+32
+2234.76895526921
+13
+-872.922653615348
+23
+-361.576402030189
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-872.922653615348
+20
+-361.576402030189
+30
+2234.76895526921
+11
+-762.654700553784
+21
+-509.589579018778
+31
+2296.83616997626
+12
+-785.609632890959
+22
+-524.927574441361
+32
+2234.76895526921
+13
+-785.609632890959
+23
+-524.927574441361
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-762.654700553784
+20
+-509.589579018778
+30
+2296.83616997626
+11
+-872.922653615348
+21
+-361.576402030189
+31
+2234.76895526921
+12
+-847.416499400322
+22
+-351.011407030345
+32
+2296.83616997626
+13
+-847.416499400322
+23
+-351.011407030345
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-611.383516446667
+20
+-408.513405265645
+30
+680.911023534629
+11
+-698.564739508658
+21
+-289.354989300114
+31
+741.194313252463
+12
+-628.691655879276
+22
+-420.078334296643
+32
+741.194313252463
+13
+-628.691655879276
+23
+-420.078334296643
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-698.564739508658
+20
+-289.354989300114
+30
+741.194313252463
+11
+-611.383516446667
+21
+-408.513405265645
+31
+680.911023534629
+12
+-679.332965393238
+22
+-281.388927633011
+32
+680.911023534629
+13
+-679.332965393238
+23
+-281.388927633011
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-545.030667691736
+20
+-815.696038096871
+30
+2035.2022000213
+11
+-373.870315466121
+21
+-902.602786167016
+31
+1967.39330582966
+12
+-542.775570394861
+22
+-812.321046486997
+32
+1967.39330582966
+13
+-542.775570394861
+23
+-812.321046486997
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-373.870315466121
+20
+-902.602786167016
+30
+1967.39330582966
+11
+-545.030667691736
+21
+-815.696038096871
+31
+2035.2022000213
+12
+-375.423653500801
+22
+-906.352875917291
+32
+2035.2022000213
+13
+-375.423653500801
+23
+-906.352875917291
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-490.247554968877
+20
+-733.707315899088
+30
+2355.16675535807
+11
+-351.011407030345
+21
+-847.416499400322
+31
+2296.83616997626
+12
+-509.589579018778
+22
+-762.654700553784
+32
+2296.83616997626
+13
+-509.589579018778
+23
+-762.654700553784
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-351.011407030345
+20
+-847.416499400322
+30
+2296.83616997626
+11
+-490.247554968877
+21
+-733.707315899088
+31
+2355.16675535807
+12
+-337.688389142806
+22
+-815.251888924486
+32
+2355.16675535807
+13
+-337.688389142806
+23
+-815.251888924486
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-467.1777430806
+20
+-699.180902483483
+30
+2408.9276400213
+11
+-337.688389142806
+21
+-815.251888924486
+31
+2355.16675535807
+12
+-490.247554968877
+22
+-733.707315899088
+32
+2355.16675535807
+13
+-490.247554968877
+23
+-733.707315899088
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-337.688389142806
+20
+-815.251888924486
+30
+2355.16675535807
+11
+-467.1777430806
+21
+-699.180902483483
+31
+2408.9276400213
+12
+-321.797626332425
+22
+-776.88819383121
+32
+2408.9276400213
+13
+-321.797626332425
+23
+-776.88819383121
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-267.610079200261
+20
+-646.067882633009
+30
+628.271001705821
+11
+-361.48899563696
+21
+-541.006514010434
+31
+587.016306884026
+12
+-388.509617834311
+22
+-581.445732901797
+32
+628.271001705821
+13
+-388.509617834311
+23
+-581.445732901797
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-361.48899563696
+20
+-541.006514010434
+30
+587.016306884026
+11
+-267.610079200261
+21
+-646.067882633009
+31
+628.271001705821
+12
+-248.997950917359
+22
+-601.134230107799
+32
+587.016306884026
+13
+-248.997950917359
+23
+-601.134230107799
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-415.26146157539
+20
+-621.482696406622
+30
+2549.0746800213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+2408.9276400213
+12
+-415.26146157539
+22
+-621.482696406623
+32
+2408.9276400213
+13
+-415.26146157539
+23
+-621.482696406623
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+2408.9276400213
+11
+-415.26146157539
+21
+-621.482696406622
+31
+2549.0746800213
+12
+-286.037069662455
+22
+-690.554572920556
+32
+2549.0746800213
+13
+-286.037069662455
+23
+-690.554572920556
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-281.388927633011
+20
+-679.332965393238
+30
+680.911023534629
+11
+-136.426435300007
+21
+-685.862005953678
+31
+628.271001705821
+12
+-267.610079200261
+22
+-646.067882633009
+32
+628.271001705821
+13
+-267.610079200261
+23
+-646.067882633009
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-136.426435300007
+20
+-685.862005953678
+30
+628.271001705821
+11
+-281.388927633011
+21
+-679.332965393238
+31
+680.911023534629
+12
+-143.450831316169
+22
+-721.176029454062
+32
+680.911023534629
+13
+-143.450831316169
+23
+-721.176029454062
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-290.941975042481
+20
+-702.396062011173
+30
+804.835469255871
+11
+-147.511894336929
+21
+-741.592371958341
+31
+741.194313252463
+12
+-289.354989300114
+22
+-698.564739508657
+32
+741.194313252463
+13
+-289.354989300114
+23
+-698.564739508657
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-147.511894336929
+20
+-741.592371958341
+30
+741.194313252463
+11
+-290.941975042481
+21
+-702.396062011173
+31
+804.835469255871
+12
+-148.32093265249
+22
+-745.659682232799
+32
+804.835469255871
+13
+-148.32093265249
+23
+-745.659682232799
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-882.422285845505
+30
+1715.23764468454
+11
+164.051007270482
+21
+-824.740107573921
+31
+1661.47676002131
+12
+0.0
+22
+-840.897721502147
+32
+1661.47676002131
+13
+0.0
+23
+-840.897721502147
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+164.051007270482
+20
+-824.740107573921
+30
+1661.47676002131
+11
+0.0
+21
+-882.422285845505
+31
+1715.23764468454
+12
+172.152047899807
+22
+-865.466789057044
+32
+1715.23764468454
+13
+172.152047899807
+23
+-865.466789057044
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-289.354989300114
+20
+-698.564739508657
+30
+741.194313252463
+11
+-143.450831316169
+21
+-721.176029454062
+31
+680.911023534629
+12
+-281.388927633011
+22
+-679.332965393238
+32
+680.911023534629
+13
+-281.388927633011
+23
+-679.332965393238
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-143.450831316169
+20
+-721.176029454062
+30
+680.911023534629
+11
+-289.354989300114
+21
+-698.564739508657
+31
+741.194313252463
+12
+-147.511894336929
+22
+-741.592371958341
+32
+741.194313252463
+13
+-147.511894336929
+23
+-741.592371958341
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-172.152047899808
+20
+-865.466789057044
+30
+1715.23764468454
+11
+0.0
+21
+-840.897721502147
+31
+1661.47676002131
+12
+-164.051007270482
+22
+-824.740107573921
+32
+1661.47676002131
+13
+-164.051007270482
+23
+-824.740107573921
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-840.897721502147
+30
+1661.47676002131
+11
+-172.152047899808
+21
+-865.466789057044
+31
+1715.23764468454
+12
+0.0
+22
+-882.422285845505
+32
+1715.23764468454
+13
+0.0
+23
+-882.422285845505
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+867.310386884026
+11
+-148.32093265249
+21
+-745.659682232799
+31
+804.835469255871
+12
+-290.941975042481
+22
+-702.396062011173
+32
+804.835469255871
+13
+-290.941975042481
+23
+-702.396062011173
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-148.32093265249
+20
+-745.659682232799
+30
+804.835469255871
+11
+-286.037069662455
+21
+-690.554572920556
+31
+867.310386884026
+12
+-145.820433573828
+22
+-733.088824464618
+32
+867.310386884026
+13
+-145.820433573828
+23
+-733.088824464618
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-178.77316905644
+20
+-431.596609324475
+30
+1100.8886000213
+11
+-145.820433573828
+21
+-733.088824464618
+31
+867.310386884026
+12
+-286.037069662455
+22
+-690.554572920556
+32
+867.310386884026
+13
+-286.037069662455
+23
+-690.554572920556
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-145.820433573828
+20
+-733.088824464618
+30
+867.310386884026
+11
+-178.77316905644
+21
+-431.596609324475
+31
+1100.8886000213
+12
+-91.1377712474136
+22
+-458.180516616454
+32
+1100.8886000213
+13
+-91.1377712474136
+23
+-458.180516616454
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-232.405119359447
+20
+-561.075591122516
+30
+1287.75132002131
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+-268.159752894786
+22
+-647.39491232121
+32
+1100.8886000213
+13
+-268.159752894786
+23
+-647.39491232121
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-136.706656519425
+20
+-687.270773156591
+30
+1100.8886000213
+11
+-232.405119359447
+21
+-561.075591122516
+31
+1287.75132002131
+12
+-118.479102410621
+22
+-595.634670540536
+32
+1287.75132002131
+13
+-118.479102410621
+23
+-595.634670540536
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-250.282436127117
+20
+-604.235251721863
+30
+1474.6140400213
+11
+-145.820433573828
+21
+-733.088824464619
+31
+1287.75132002131
+12
+-286.037069662455
+22
+-690.554572920556
+32
+1287.75132002131
+13
+-286.037069662455
+23
+-690.554572920556
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-145.820433573828
+20
+-733.088824464619
+30
+1287.75132002131
+11
+-250.282436127117
+21
+-604.235251721863
+31
+1474.6140400213
+12
+-127.592879465023
+22
+-641.452721848564
+32
+1474.6140400213
+13
+-127.592879465023
+23
+-641.452721848564
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-268.159752894786
+20
+-647.39491232121
+30
+1661.47676002131
+11
+-154.93421062823
+21
+-778.906875772646
+31
+1474.6140400213
+12
+-303.914386430124
+22
+-733.714233519903
+32
+1474.6140400213
+13
+-303.914386430124
+23
+-733.714233519903
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-154.93421062823
+20
+-778.906875772646
+30
+1474.6140400213
+11
+-268.159752894786
+21
+-647.39491232121
+31
+1661.47676002131
+12
+-136.706656519425
+22
+-687.270773156591
+32
+1661.47676002131
+13
+-136.706656519425
+23
+-687.270773156591
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-337.688389142806
+20
+-815.251888924487
+30
+1715.23764468454
+11
+-164.051007270482
+21
+-824.740107573921
+31
+1661.47676002131
+12
+-321.797626332425
+22
+-776.88819383121
+32
+1661.47676002131
+13
+-321.797626332425
+23
+-776.88819383121
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-164.051007270482
+20
+-824.740107573921
+30
+1661.47676002131
+11
+-337.688389142806
+21
+-815.251888924487
+31
+1715.23764468454
+12
+-172.152047899808
+22
+-865.466789057044
+32
+1715.23764468454
+13
+-172.152047899808
+23
+-865.466789057044
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-351.011407030345
+20
+-847.416499400322
+30
+1773.56823006635
+11
+-172.152047899808
+21
+-865.466789057044
+31
+1715.23764468454
+12
+-337.688389142806
+22
+-815.251888924487
+32
+1715.23764468454
+13
+-337.688389142806
+23
+-815.251888924487
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-172.152047899808
+20
+-865.466789057044
+30
+1715.23764468454
+11
+-351.011407030345
+21
+-847.416499400322
+31
+1773.56823006635
+12
+-178.9440635192
+22
+-899.612557411553
+32
+1773.56823006635
+13
+-178.9440635192
+23
+-899.612557411553
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-361.576402030189
+20
+-872.922653615348
+30
+1835.6354447734
+11
+-178.9440635192
+21
+-899.612557411553
+31
+1773.56823006635
+12
+-351.011407030345
+22
+-847.416499400322
+32
+1773.56823006635
+13
+-351.011407030345
+23
+-847.416499400322
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-178.9440635192
+20
+-899.612557411553
+30
+1773.56823006635
+11
+-361.576402030189
+21
+-872.922653615348
+31
+1835.6354447734
+12
+-184.330051263378
+22
+-926.689746301964
+32
+1835.6354447734
+13
+-184.330051263378
+23
+-926.689746301964
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-375.423653500801
+20
+-906.352875917291
+30
+2035.2022000213
+11
+-190.597433982906
+21
+-958.19800696011
+31
+1967.39330582966
+12
+-373.870315466121
+22
+-902.602786167016
+32
+1967.39330582966
+13
+-373.870315466121
+23
+-902.602786167016
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-190.597433982906
+20
+-958.19800696011
+30
+1967.39330582966
+11
+-375.423653500801
+21
+-906.352875917291
+31
+2035.2022000213
+12
+-191.38931884584
+22
+-962.179081004757
+32
+2035.2022000213
+13
+-191.38931884584
+23
+-962.179081004757
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-351.011407030345
+20
+-847.416499400322
+30
+2296.83616997626
+11
+-184.330051263378
+21
+-926.689746301964
+31
+2234.76895526921
+12
+-361.576402030189
+22
+-872.922653615348
+32
+2234.76895526921
+13
+-361.576402030189
+23
+-872.922653615348
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-184.330051263378
+20
+-926.689746301964
+30
+2234.76895526921
+11
+-351.011407030345
+21
+-847.416499400322
+31
+2296.83616997626
+12
+-178.9440635192
+22
+-899.612557411553
+32
+2296.83616997626
+13
+-178.9440635192
+23
+-899.612557411553
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-361.576402030189
+20
+-872.922653615348
+30
+2234.76895526921
+11
+-188.233089011893
+21
+-946.311642114328
+31
+2169.85154878419
+12
+-369.232485975391
+22
+-891.406075310522
+32
+2169.85154878419
+13
+-369.232485975391
+23
+-891.406075310522
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-188.233089011893
+20
+-946.311642114328
+30
+2169.85154878419
+11
+-361.576402030189
+21
+-872.922653615348
+31
+2234.76895526921
+12
+-184.330051263378
+22
+-926.689746301964
+32
+2234.76895526921
+13
+-184.330051263378
+23
+-926.689746301964
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+-145.820433573828
+21
+-733.088824464619
+31
+2408.9276400213
+12
+-286.037069662455
+22
+-690.554572920556
+32
+2408.9276400213
+13
+-286.037069662455
+23
+-690.554572920556
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-145.820433573828
+20
+-733.088824464619
+30
+2408.9276400213
+11
+-286.037069662455
+21
+-690.554572920556
+31
+2549.0746800213
+12
+-145.820433573828
+22
+-733.088824464618
+32
+2549.0746800213
+13
+-145.820433573828
+23
+-733.088824464618
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-136.426435300007
+20
+-685.862005953678
+30
+628.271001705821
+11
+-248.997950917359
+21
+-601.134230107799
+31
+587.016306884026
+12
+-267.610079200261
+22
+-646.067882633009
+32
+628.271001705821
+13
+-267.610079200261
+23
+-646.067882633009
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-248.997950917359
+20
+-601.134230107799
+30
+587.016306884026
+11
+-136.426435300007
+21
+-685.862005953678
+31
+628.271001705821
+12
+-126.938054583664
+22
+-638.160694862082
+32
+587.016306884026
+13
+-126.938054583664
+23
+-638.160694862082
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-143.450831316169
+20
+-721.176029454062
+30
+680.911023534629
+11
+0.0
+21
+-699.298837021391
+31
+628.271001705821
+12
+-136.426435300007
+22
+-685.862005953678
+32
+628.271001705821
+13
+-136.426435300007
+23
+-685.862005953678
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-699.298837021391
+30
+628.271001705821
+11
+-143.450831316169
+21
+-721.176029454062
+31
+680.911023534629
+12
+0.0
+22
+-735.304703143143
+32
+680.911023534629
+13
+0.0
+23
+-735.304703143143
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-147.511894336929
+20
+-741.592371958341
+30
+741.194313252463
+11
+0.0
+21
+-735.304703143143
+31
+680.911023534629
+12
+-143.450831316169
+22
+-721.176029454062
+32
+680.911023534629
+13
+-143.450831316169
+23
+-721.176029454062
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-735.304703143143
+30
+680.911023534629
+11
+-147.511894336929
+21
+-741.592371958341
+31
+741.194313252463
+12
+0.0
+22
+-756.121025443459
+32
+741.194313252463
+13
+0.0
+23
+-756.121025443459
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-148.32093265249
+20
+-745.659682232799
+30
+804.835469255871
+11
+0.0
+21
+-756.121025443459
+31
+741.194313252463
+12
+-147.511894336929
+22
+-741.592371958341
+32
+741.194313252463
+13
+-147.511894336929
+23
+-741.592371958341
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-756.121025443459
+30
+741.194313252463
+11
+-148.32093265249
+21
+-745.659682232799
+31
+804.835469255871
+12
+0.0
+22
+-760.268019036986
+32
+804.835469255871
+13
+0.0
+23
+-760.268019036986
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-145.820433573828
+20
+-733.088824464618
+30
+867.310386884026
+11
+0.0
+21
+-760.268019036986
+31
+804.835469255871
+12
+-148.32093265249
+22
+-745.659682232799
+32
+804.835469255871
+13
+-148.32093265249
+23
+-745.659682232799
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-760.268019036986
+30
+804.835469255871
+11
+-145.820433573828
+21
+-733.088824464618
+31
+867.310386884026
+12
+0.0
+22
+-747.450883605455
+32
+867.310386884026
+13
+0.0
+23
+-747.450883605455
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-91.1377712474136
+20
+-458.180516616454
+30
+1100.8886000213
+11
+0.0
+21
+-747.450883605455
+31
+867.310386884026
+12
+-145.820433573828
+22
+-733.088824464618
+32
+867.310386884026
+13
+-145.820433573828
+23
+-733.088824464618
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-747.450883605455
+30
+867.310386884026
+11
+-91.1377712474136
+21
+-458.180516616454
+31
+1100.8886000213
+12
+0.0
+22
+-467.156803605456
+32
+1100.8886000213
+13
+0.0
+23
+-467.156803605456
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-118.479102410621
+20
+-595.634670540536
+30
+1287.75132002131
+11
+0.0
+21
+-700.735203605455
+31
+1100.8886000213
+12
+-136.706656519425
+22
+-687.270773156591
+32
+1100.8886000213
+13
+-136.706656519425
+23
+-687.270773156591
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-700.735203605455
+30
+1100.8886000213
+11
+-118.479102410621
+21
+-595.634670540536
+31
+1287.75132002131
+12
+0.0
+22
+-607.303843605455
+32
+1287.75132002131
+13
+0.0
+23
+-607.303843605455
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-685.862005953678
+20
+-136.426435300007
+30
+628.271001705821
+11
+-735.304703143143
+21
+0.0
+31
+680.911023534629
+12
+-721.176029454062
+22
+-143.450831316169
+32
+680.911023534629
+13
+-721.176029454062
+23
+-143.450831316169
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-735.304703143143
+20
+0.0
+30
+680.911023534629
+11
+-685.862005953678
+21
+-136.426435300007
+31
+628.271001705821
+12
+-699.298837021391
+22
+0.0
+32
+628.271001705821
+13
+-699.298837021391
+23
+0.0
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+917.237009349992
+20
+-1.80477854883065e-13
+30
+1773.56823006635
+11
+865.466789057043
+21
+-172.152047899808
+31
+1715.23764468454
+12
+899.612557411552
+22
+-178.944063519201
+32
+1773.56823006635
+13
+899.612557411552
+23
+-178.944063519201
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+865.466789057043
+20
+-172.152047899808
+30
+1715.23764468454
+11
+917.237009349992
+21
+-1.80477854883065e-13
+31
+1773.56823006635
+12
+882.422285845505
+22
+-1.80477854883065e-13
+32
+1715.23764468454
+13
+882.422285845505
+23
+-1.80477854883065e-13
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-654.019523605455
+30
+1474.6140400213
+11
+145.820433573828
+21
+-733.088824464619
+31
+1287.75132002131
+12
+0.0
+22
+-747.450883605455
+32
+1287.75132002131
+13
+0.0
+23
+-747.450883605455
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+145.820433573828
+20
+-733.088824464619
+30
+1287.75132002131
+11
+0.0
+21
+-654.019523605455
+31
+1474.6140400213
+12
+127.592879465023
+22
+-641.452721848564
+32
+1474.6140400213
+13
+127.592879465023
+23
+-641.452721848564
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-136.706656519425
+20
+-687.270773156591
+30
+1661.47676002131
+11
+0.0
+21
+-794.166563605455
+31
+1474.6140400213
+12
+-154.93421062823
+22
+-778.906875772646
+32
+1474.6140400213
+13
+-154.93421062823
+23
+-778.906875772646
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-794.166563605455
+30
+1474.6140400213
+11
+-136.706656519425
+21
+-687.270773156591
+31
+1661.47676002131
+12
+0.0
+22
+-700.735203605455
+32
+1661.47676002131
+13
+0.0
+23
+-700.735203605455
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+944.844671731792
+20
+-1.80477854883065e-13
+30
+1835.6354447734
+11
+899.612557411552
+21
+-178.944063519201
+31
+1773.56823006635
+12
+926.689746301964
+22
+-184.330051263379
+32
+1835.6354447734
+13
+926.689746301964
+23
+-184.330051263379
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+899.612557411552
+20
+-178.944063519201
+30
+1773.56823006635
+11
+944.844671731792
+21
+-1.80477854883065e-13
+31
+1835.6354447734
+12
+917.237009349992
+22
+-1.80477854883065e-13
+32
+1773.56823006635
+13
+917.237009349992
+23
+-1.80477854883065e-13
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-917.237009349992
+30
+2296.83616997626
+11
+184.330051263378
+21
+-926.689746301964
+31
+2234.76895526921
+12
+0.0
+22
+-944.844671731792
+32
+2234.76895526921
+13
+0.0
+23
+-944.844671731792
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+184.330051263378
+20
+-926.689746301964
+30
+2234.76895526921
+11
+0.0
+21
+-917.237009349992
+31
+2296.83616997626
+12
+178.9440635192
+22
+-899.612557411553
+32
+2296.83616997626
+13
+178.9440635192
+23
+-899.612557411553
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-184.330051263378
+20
+-926.689746301964
+30
+1835.6354447734
+11
+0.0
+21
+-917.237009349992
+31
+1773.56823006635
+12
+-178.9440635192
+22
+-899.612557411553
+32
+1773.56823006635
+13
+-178.9440635192
+23
+-899.612557411553
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-917.237009349992
+30
+1773.56823006635
+11
+-184.330051263378
+21
+-926.689746301964
+31
+1835.6354447734
+12
+0.0
+22
+-944.844671731792
+32
+1835.6354447734
+13
+0.0
+23
+-944.844671731792
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-188.233089011893
+20
+-946.311642114328
+30
+1900.55285125842
+11
+0.0
+21
+-944.844671731792
+31
+1835.6354447734
+12
+-184.330051263378
+22
+-926.689746301964
+32
+1835.6354447734
+13
+-184.330051263378
+23
+-926.689746301964
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-944.844671731792
+30
+1835.6354447734
+11
+-188.233089011893
+21
+-946.311642114328
+31
+1900.55285125842
+12
+0.0
+22
+-964.850983209364
+32
+1900.55285125842
+13
+0.0
+23
+-964.850983209364
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+143.450831316169
+20
+-721.176029454062
+30
+680.911023534629
+11
+267.610079200261
+21
+-646.067882633009
+31
+628.271001705821
+12
+136.426435300007
+22
+-685.862005953678
+32
+628.271001705821
+13
+136.426435300007
+23
+-685.862005953678
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+267.610079200261
+20
+-646.067882633009
+30
+628.271001705821
+11
+143.450831316169
+21
+-721.176029454062
+31
+680.911023534629
+12
+281.388927633011
+22
+-679.332965393237
+32
+680.911023534629
+13
+281.388927633011
+23
+-679.332965393237
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+147.511894336929
+20
+-741.592371958341
+30
+741.194313252463
+11
+281.388927633011
+21
+-679.332965393237
+31
+680.911023534629
+12
+143.450831316169
+22
+-721.176029454062
+32
+680.911023534629
+13
+143.450831316169
+23
+-721.176029454062
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+281.388927633011
+20
+-679.332965393237
+30
+680.911023534629
+11
+147.511894336929
+21
+-741.592371958341
+31
+741.194313252463
+12
+289.354989300114
+22
+-698.564739508657
+32
+741.194313252463
+13
+289.354989300114
+23
+-698.564739508657
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+148.32093265249
+20
+-745.659682232799
+30
+804.835469255871
+11
+289.354989300114
+21
+-698.564739508657
+31
+741.194313252463
+12
+147.511894336929
+22
+-741.592371958341
+32
+741.194313252463
+13
+147.511894336929
+23
+-741.592371958341
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+289.354989300114
+20
+-698.564739508657
+30
+741.194313252463
+11
+148.32093265249
+21
+-745.659682232799
+31
+804.835469255871
+12
+290.941975042481
+22
+-702.396062011173
+32
+804.835469255871
+13
+290.941975042481
+23
+-702.396062011173
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+145.820433573828
+20
+-733.088824464618
+30
+867.310386884026
+11
+290.941975042481
+21
+-702.396062011173
+31
+804.835469255871
+12
+148.32093265249
+22
+-745.659682232799
+32
+804.835469255871
+13
+148.32093265249
+23
+-745.659682232799
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+290.941975042481
+20
+-702.396062011173
+30
+804.835469255871
+11
+145.820433573828
+21
+-733.088824464618
+31
+867.310386884026
+12
+286.037069662455
+22
+-690.554572920556
+32
+867.310386884026
+13
+286.037069662455
+23
+-690.554572920556
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+178.77316905644
+20
+-431.596609324475
+30
+1100.8886000213
+11
+145.820433573828
+21
+-733.088824464618
+31
+867.310386884026
+12
+91.1377712474136
+22
+-458.180516616454
+32
+1100.8886000213
+13
+91.1377712474136
+23
+-458.180516616454
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+145.820433573828
+20
+-733.088824464618
+30
+867.310386884026
+11
+178.77316905644
+21
+-431.596609324475
+31
+1100.8886000213
+12
+286.037069662455
+22
+-690.554572920556
+32
+867.310386884026
+13
+286.037069662455
+23
+-690.554572920556
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+118.479102410621
+20
+-595.634670540536
+30
+1287.75132002131
+11
+268.159752894786
+21
+-647.39491232121
+31
+1100.8886000213
+12
+136.706656519425
+22
+-687.270773156591
+32
+1100.8886000213
+13
+136.706656519425
+23
+-687.270773156591
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+268.159752894786
+20
+-647.39491232121
+30
+1100.8886000213
+11
+118.479102410621
+21
+-595.634670540536
+31
+1287.75132002131
+12
+232.405119359447
+22
+-561.075591122516
+32
+1287.75132002131
+13
+232.405119359447
+23
+-561.075591122516
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+127.592879465023
+20
+-641.452721848564
+30
+1474.6140400213
+11
+286.037069662455
+21
+-690.554572920556
+31
+1287.75132002131
+12
+145.820433573828
+22
+-733.088824464619
+32
+1287.75132002131
+13
+145.820433573828
+23
+-733.088824464619
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+286.037069662455
+20
+-690.554572920556
+30
+1287.75132002131
+11
+127.592879465023
+21
+-641.452721848564
+31
+1474.6140400213
+12
+250.282436127116
+22
+-604.235251721863
+32
+1474.6140400213
+13
+250.282436127116
+23
+-604.235251721863
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+136.706656519425
+20
+-687.270773156591
+30
+1661.47676002131
+11
+303.914386430124
+21
+-733.714233519903
+31
+1474.6140400213
+12
+154.93421062823
+22
+-778.906875772646
+32
+1474.6140400213
+13
+154.93421062823
+23
+-778.906875772646
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+303.914386430124
+20
+-733.714233519903
+30
+1474.6140400213
+11
+136.706656519425
+21
+-687.270773156591
+31
+1661.47676002131
+12
+268.159752894786
+22
+-647.39491232121
+32
+1661.47676002131
+13
+268.159752894786
+23
+-647.39491232121
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+172.152047899807
+20
+-865.466789057044
+30
+1715.23764468454
+11
+321.797626332425
+21
+-776.88819383121
+31
+1661.47676002131
+12
+164.051007270482
+22
+-824.740107573921
+32
+1661.47676002131
+13
+164.051007270482
+23
+-824.740107573921
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+321.797626332425
+20
+-776.88819383121
+30
+1661.47676002131
+11
+172.152047899807
+21
+-865.466789057044
+31
+1715.23764468454
+12
+337.688389142806
+22
+-815.251888924487
+32
+1715.23764468454
+13
+337.688389142806
+23
+-815.251888924487
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+964.850983209364
+20
+-1.80477854883065e-13
+30
+1900.55285125842
+11
+926.689746301964
+21
+-184.330051263379
+31
+1835.6354447734
+12
+946.311642114328
+22
+-188.233089011893
+32
+1900.55285125842
+13
+946.311642114328
+23
+-188.233089011893
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+926.689746301964
+20
+-184.330051263379
+30
+1835.6354447734
+11
+964.850983209364
+21
+-1.80477854883065e-13
+31
+1900.55285125842
+12
+944.844671731792
+22
+-1.80477854883065e-13
+32
+1835.6354447734
+13
+944.844671731792
+23
+-1.80477854883065e-13
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-882.422285845505
+20
+0.0
+30
+2355.16675535807
+11
+-824.740107573921
+21
+-164.051007270482
+31
+2408.9276400213
+12
+-865.466789057043
+22
+-172.152047899808
+32
+2355.16675535807
+13
+-865.466789057043
+23
+-172.152047899808
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-824.740107573921
+20
+-164.051007270482
+30
+2408.9276400213
+11
+-882.422285845505
+21
+0.0
+31
+2355.16675535807
+12
+-840.897721502147
+22
+0.0
+32
+2408.9276400213
+13
+-840.897721502147
+23
+0.0
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+178.9440635192
+20
+-899.612557411553
+30
+1773.56823006635
+11
+337.688389142806
+21
+-815.251888924487
+31
+1715.23764468454
+12
+172.152047899807
+22
+-865.466789057044
+32
+1715.23764468454
+13
+172.152047899807
+23
+-865.466789057044
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+337.688389142806
+20
+-815.251888924487
+30
+1715.23764468454
+11
+178.9440635192
+21
+-899.612557411553
+31
+1773.56823006635
+12
+351.011407030345
+22
+-847.416499400322
+32
+1773.56823006635
+13
+351.011407030345
+23
+-847.416499400322
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-687.270773156591
+20
+-136.706656519425
+30
+1100.8886000213
+11
+-561.075591122516
+21
+-232.405119359447
+31
+1287.75132002131
+12
+-647.39491232121
+22
+-268.159752894786
+32
+1100.8886000213
+13
+-647.39491232121
+23
+-268.159752894786
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-561.075591122516
+20
+-232.405119359447
+30
+1287.75132002131
+11
+-687.270773156591
+21
+-136.706656519425
+31
+1100.8886000213
+12
+-595.634670540536
+22
+-118.479102410621
+32
+1287.75132002131
+13
+-595.634670540536
+23
+-118.479102410621
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+976.970215709362
+20
+-1.80477854883065e-13
+30
+1967.39330582966
+11
+946.311642114328
+21
+-188.233089011893
+31
+1900.55285125842
+12
+958.198006960111
+22
+-190.597433982906
+32
+1967.39330582966
+13
+958.198006960111
+23
+-190.597433982906
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+946.311642114328
+20
+-188.233089011893
+30
+1900.55285125842
+11
+976.970215709362
+21
+-1.80477854883065e-13
+31
+1967.39330582966
+12
+964.850983209364
+22
+-1.80477854883065e-13
+32
+1900.55285125842
+13
+964.850983209364
+23
+-1.80477854883065e-13
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+172.152047899807
+20
+-865.466789057043
+30
+2355.16675535807
+11
+351.011407030345
+21
+-847.416499400322
+31
+2296.83616997626
+12
+178.9440635192
+22
+-899.612557411553
+32
+2296.83616997626
+13
+178.9440635192
+23
+-899.612557411553
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+351.011407030345
+20
+-847.416499400322
+30
+2296.83616997626
+11
+172.152047899807
+21
+-865.466789057043
+31
+2355.16675535807
+12
+337.688389142806
+22
+-815.251888924486
+32
+2355.16675535807
+13
+337.688389142806
+23
+-815.251888924486
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+981.029283605455
+20
+-1.80477854883065e-13
+30
+2035.2022000213
+11
+958.198006960111
+21
+-190.597433982906
+31
+1967.39330582966
+12
+962.179081004756
+22
+-191.38931884584
+32
+2035.2022000213
+13
+962.179081004756
+23
+-191.38931884584
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+958.198006960111
+20
+-190.597433982906
+30
+1967.39330582966
+11
+981.029283605455
+21
+-1.80477854883065e-13
+31
+2035.2022000213
+12
+976.970215709362
+22
+-1.80477854883065e-13
+32
+1967.39330582966
+13
+976.970215709362
+23
+-1.80477854883065e-13
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+164.051007270482
+20
+-824.740107573921
+30
+2408.9276400213
+11
+337.688389142806
+21
+-815.251888924486
+31
+2355.16675535807
+12
+172.152047899807
+22
+-865.466789057043
+32
+2355.16675535807
+13
+172.152047899807
+23
+-865.466789057043
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+337.688389142806
+20
+-815.251888924486
+30
+2355.16675535807
+11
+164.051007270482
+21
+-824.740107573921
+31
+2408.9276400213
+12
+321.797626332425
+22
+-776.88819383121
+32
+2408.9276400213
+13
+321.797626332425
+23
+-776.88819383121
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+145.820433573828
+20
+-733.088824464618
+30
+2549.0746800213
+11
+286.037069662455
+21
+-690.554572920556
+31
+2408.9276400213
+12
+145.820433573828
+22
+-733.088824464619
+32
+2408.9276400213
+13
+145.820433573828
+23
+-733.088824464619
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+286.037069662455
+20
+-690.554572920556
+30
+2408.9276400213
+11
+145.820433573828
+21
+-733.088824464618
+31
+2549.0746800213
+12
+286.037069662455
+22
+-690.554572920556
+32
+2549.0746800213
+13
+286.037069662455
+23
+-690.554572920556
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+136.426435300007
+20
+-685.862005953678
+30
+628.271001705821
+11
+248.997950917359
+21
+-601.1342301078
+31
+587.016306884026
+12
+126.938054583664
+22
+-638.160694862082
+32
+587.016306884026
+13
+126.938054583664
+23
+-638.160694862082
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+248.997950917359
+20
+-601.1342301078
+30
+587.016306884026
+11
+136.426435300007
+21
+-685.862005953678
+31
+628.271001705821
+12
+267.610079200261
+22
+-646.067882633009
+32
+628.271001705821
+13
+267.610079200261
+23
+-646.067882633009
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+281.388927633011
+20
+-679.332965393237
+30
+680.911023534629
+11
+388.509617834311
+21
+-581.445732901797
+31
+628.271001705821
+12
+267.610079200261
+22
+-646.067882633009
+32
+628.271001705821
+13
+267.610079200261
+23
+-646.067882633009
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+388.509617834311
+20
+-581.445732901797
+30
+628.271001705821
+11
+281.388927633011
+21
+-679.332965393237
+31
+680.911023534629
+12
+408.513405265645
+22
+-611.383516446667
+32
+680.911023534629
+13
+408.513405265645
+23
+-611.383516446667
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+289.354989300114
+20
+-698.564739508657
+30
+741.194313252463
+11
+408.513405265645
+21
+-611.383516446667
+31
+680.911023534629
+12
+281.388927633011
+22
+-679.332965393237
+32
+680.911023534629
+13
+281.388927633011
+23
+-679.332965393237
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+408.513405265645
+20
+-611.383516446667
+30
+680.911023534629
+11
+289.354989300114
+21
+-698.564739508657
+31
+741.194313252463
+12
+420.078334296643
+22
+-628.691655879276
+32
+741.194313252463
+13
+420.078334296643
+23
+-628.691655879276
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+290.941975042481
+20
+-702.396062011173
+30
+804.835469255871
+11
+420.078334296643
+21
+-628.691655879276
+31
+741.194313252463
+12
+289.354989300114
+22
+-698.564739508657
+32
+741.194313252463
+13
+289.354989300114
+23
+-698.564739508657
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+420.078334296643
+20
+-628.691655879276
+30
+741.194313252463
+11
+290.941975042481
+21
+-702.396062011173
+31
+804.835469255871
+12
+422.38228049373
+22
+-632.139755034707
+32
+804.835469255871
+13
+422.38228049373
+23
+-632.139755034707
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+286.037069662455
+20
+-690.554572920556
+30
+867.310386884026
+11
+422.38228049373
+21
+-632.139755034707
+31
+804.835469255871
+12
+290.941975042481
+22
+-702.396062011173
+32
+804.835469255871
+13
+290.941975042481
+23
+-702.396062011173
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+422.38228049373
+20
+-632.139755034707
+30
+804.835469255871
+11
+286.037069662455
+21
+-690.554572920556
+31
+867.310386884026
+12
+415.26146157539
+22
+-621.482696406622
+32
+867.310386884026
+13
+415.26146157539
+23
+-621.482696406622
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+958.19800696011
+20
+-190.597433982906
+30
+2103.01109421295
+11
+981.029283605455
+21
+-1.80477854883065e-13
+31
+2035.2022000213
+12
+962.179081004756
+22
+-191.38931884584
+32
+2035.2022000213
+13
+962.179081004756
+23
+-191.38931884584
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+981.029283605455
+20
+-1.80477854883065e-13
+30
+2035.2022000213
+11
+958.19800696011
+21
+-190.597433982906
+31
+2103.01109421295
+12
+976.970215709361
+22
+-1.80477854883065e-13
+32
+2103.01109421295
+13
+976.970215709361
+23
+-1.80477854883065e-13
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+946.311642114328
+20
+-188.233089011893
+30
+2169.85154878419
+11
+976.970215709361
+21
+-1.80477854883065e-13
+31
+2103.01109421295
+12
+958.19800696011
+22
+-190.597433982906
+32
+2103.01109421295
+13
+958.19800696011
+23
+-190.597433982906
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+976.970215709361
+20
+-1.80477854883065e-13
+30
+2103.01109421295
+11
+946.311642114328
+21
+-188.233089011893
+31
+2169.85154878419
+12
+964.850983209363
+22
+-1.80477854883065e-13
+32
+2169.85154878419
+13
+964.850983209363
+23
+-1.80477854883065e-13
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+259.538414235775
+20
+-388.426686378325
+30
+1100.8886000213
+11
+286.037069662455
+21
+-690.554572920556
+31
+867.310386884026
+12
+178.77316905644
+22
+-431.596609324475
+32
+1100.8886000213
+13
+178.77316905644
+23
+-431.596609324475
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+286.037069662455
+20
+-690.554572920556
+30
+867.310386884026
+11
+259.538414235775
+21
+-388.426686378325
+31
+1100.8886000213
+12
+415.26146157539
+22
+-621.482696406622
+32
+867.310386884026
+13
+415.26146157539
+23
+-621.482696406622
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+232.405119359447
+20
+-561.075591122516
+30
+1287.75132002131
+11
+389.307620352121
+21
+-582.640028068573
+31
+1100.8886000213
+12
+268.159752894786
+22
+-647.39491232121
+32
+1100.8886000213
+13
+268.159752894786
+23
+-647.39491232121
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+389.307620352121
+20
+-582.640028068573
+30
+1100.8886000213
+11
+232.405119359447
+21
+-561.075591122516
+31
+1287.75132002131
+12
+337.399937905583
+22
+-504.954691392474
+32
+1287.75132002131
+13
+337.399937905583
+23
+-504.954691392474
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-899.612557411553
+20
+-178.9440635192
+30
+2296.83616997626
+11
+-815.251888924486
+21
+-337.688389142806
+31
+2355.16675535807
+12
+-847.416499400322
+22
+-351.011407030345
+32
+2296.83616997626
+13
+-847.416499400322
+23
+-351.011407030345
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-815.251888924486
+20
+-337.688389142806
+30
+2355.16675535807
+11
+-899.612557411553
+21
+-178.9440635192
+31
+2296.83616997626
+12
+-865.466789057043
+22
+-172.152047899808
+32
+2355.16675535807
+13
+-865.466789057043
+23
+-172.152047899808
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-958.19800696011
+20
+-190.597433982906
+30
+2103.01109421295
+11
+-891.406075310522
+21
+-369.232485975391
+31
+2169.85154878419
+12
+-902.602786167016
+22
+-373.87031546612
+32
+2103.01109421295
+13
+-902.602786167016
+23
+-373.87031546612
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-891.406075310522
+20
+-369.232485975391
+30
+2169.85154878419
+11
+-958.19800696011
+21
+-190.597433982906
+31
+2103.01109421295
+12
+-946.311642114328
+22
+-188.233089011893
+32
+2169.85154878419
+13
+-946.311642114328
+23
+-188.233089011893
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+250.282436127116
+20
+-604.235251721863
+30
+1474.6140400213
+11
+415.26146157539
+21
+-621.482696406623
+31
+1287.75132002131
+12
+286.037069662455
+22
+-690.554572920556
+32
+1287.75132002131
+13
+286.037069662455
+23
+-690.554572920556
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+415.26146157539
+20
+-621.482696406623
+30
+1287.75132002131
+11
+250.282436127116
+21
+-604.235251721863
+31
+1474.6140400213
+12
+363.353779128852
+22
+-543.797359730523
+32
+1474.6140400213
+13
+363.353779128852
+23
+-543.797359730523
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+268.159752894786
+20
+-647.39491232121
+30
+1661.47676002131
+11
+441.215302798659
+21
+-660.325364744673
+31
+1474.6140400213
+12
+303.914386430124
+22
+-733.714233519903
+32
+1474.6140400213
+13
+303.914386430124
+23
+-733.714233519903
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+441.215302798659
+20
+-660.325364744673
+30
+1474.6140400213
+11
+268.159752894786
+21
+-647.39491232121
+31
+1661.47676002131
+12
+389.307620352121
+22
+-582.640028068573
+32
+1661.47676002131
+13
+389.307620352121
+23
+-582.640028068573
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+337.688389142806
+20
+-815.251888924487
+30
+1715.23764468454
+11
+467.1777430806
+21
+-699.180902483484
+31
+1661.47676002131
+12
+321.797626332425
+22
+-776.88819383121
+32
+1661.47676002131
+13
+321.797626332425
+23
+-776.88819383121
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+467.1777430806
+20
+-699.180902483484
+30
+1661.47676002131
+11
+337.688389142806
+21
+-815.251888924487
+31
+1715.23764468454
+12
+490.247554968877
+22
+-733.707315899088
+32
+1715.23764468454
+13
+490.247554968877
+23
+-733.707315899088
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+351.011407030345
+20
+-847.416499400322
+30
+1773.56823006635
+11
+490.247554968877
+21
+-733.707315899088
+31
+1715.23764468454
+12
+337.688389142806
+22
+-815.251888924487
+32
+1715.23764468454
+13
+337.688389142806
+23
+-815.251888924487
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+490.247554968877
+20
+-733.707315899088
+30
+1715.23764468454
+11
+351.011407030345
+21
+-847.416499400322
+31
+1773.56823006635
+12
+509.589579018778
+22
+-762.654700553784
+32
+1773.56823006635
+13
+509.589579018778
+23
+-762.654700553784
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-802.244272938819
+20
+-536.042485570818
+30
+1900.55285125842
+11
+-902.602786167016
+21
+-373.87031546612
+31
+1967.39330582966
+12
+-812.321046486997
+22
+-542.775570394861
+32
+1967.39330582966
+13
+-812.321046486997
+23
+-542.775570394861
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-902.602786167016
+20
+-373.87031546612
+30
+1967.39330582966
+11
+-802.244272938819
+21
+-536.042485570818
+31
+1900.55285125842
+12
+-891.406075310523
+22
+-369.232485975391
+32
+1900.55285125842
+13
+-891.406075310523
+23
+-369.232485975391
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-812.321046486997
+20
+-542.775570394861
+30
+1967.39330582966
+11
+-906.352875917291
+21
+-375.423653500801
+31
+2035.2022000213
+12
+-815.696038096872
+22
+-545.030667691736
+32
+2035.2022000213
+13
+-815.696038096872
+23
+-545.030667691736
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-906.352875917291
+20
+-375.423653500801
+30
+2035.2022000213
+11
+-812.321046486997
+21
+-542.775570394861
+31
+1967.39330582966
+12
+-902.602786167016
+22
+-373.87031546612
+32
+1967.39330582966
+13
+-902.602786167016
+23
+-373.87031546612
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-906.352875917291
+20
+-375.423653500801
+30
+2035.2022000213
+11
+-812.321046486997
+21
+-542.775570394861
+31
+2103.01109421295
+12
+-815.696038096872
+22
+-545.030667691736
+32
+2035.2022000213
+13
+-815.696038096872
+23
+-545.030667691736
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-812.321046486997
+20
+-542.775570394861
+30
+2103.01109421295
+11
+-906.352875917291
+21
+-375.423653500801
+31
+2035.2022000213
+12
+-902.602786167016
+22
+-373.87031546612
+32
+2103.01109421295
+13
+-902.602786167016
+23
+-373.87031546612
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-581.445732901797
+20
+-388.509617834311
+30
+628.271001705821
+11
+-679.332965393238
+21
+-281.388927633011
+31
+680.911023534629
+12
+-611.383516446667
+22
+-408.513405265645
+32
+680.911023534629
+13
+-611.383516446667
+23
+-408.513405265645
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-679.332965393238
+20
+-281.388927633011
+30
+680.911023534629
+11
+-581.445732901797
+21
+-388.509617834311
+31
+628.271001705821
+12
+-646.067882633009
+22
+-267.610079200261
+32
+628.271001705821
+13
+-646.067882633009
+23
+-267.610079200261
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+337.688389142806
+20
+-815.251888924486
+30
+2355.16675535807
+11
+509.589579018778
+21
+-762.654700553784
+31
+2296.83616997626
+12
+351.011407030345
+22
+-847.416499400322
+32
+2296.83616997626
+13
+351.011407030345
+23
+-847.416499400322
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+509.589579018778
+20
+-762.654700553784
+30
+2296.83616997626
+11
+337.688389142806
+21
+-815.251888924486
+31
+2355.16675535807
+12
+490.247554968877
+22
+-733.707315899088
+32
+2355.16675535807
+13
+490.247554968877
+23
+-733.707315899088
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+321.797626332425
+20
+-776.88819383121
+30
+2408.9276400213
+11
+490.247554968877
+21
+-733.707315899088
+31
+2355.16675535807
+12
+337.688389142806
+22
+-815.251888924486
+32
+2355.16675535807
+13
+337.688389142806
+23
+-815.251888924486
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+490.247554968877
+20
+-733.707315899088
+30
+2355.16675535807
+11
+321.797626332425
+21
+-776.88819383121
+31
+2408.9276400213
+12
+467.1777430806
+22
+-699.180902483484
+32
+2408.9276400213
+13
+467.1777430806
+23
+-699.180902483484
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+286.037069662455
+20
+-690.554572920556
+30
+2549.0746800213
+11
+415.26146157539
+21
+-621.482696406623
+31
+2408.9276400213
+12
+286.037069662455
+22
+-690.554572920556
+32
+2408.9276400213
+13
+286.037069662455
+23
+-690.554572920556
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+415.26146157539
+20
+-621.482696406623
+30
+2408.9276400213
+11
+286.037069662455
+21
+-690.554572920556
+31
+2549.0746800213
+12
+415.26146157539
+22
+-621.482696406622
+32
+2549.0746800213
+13
+415.26146157539
+23
+-621.482696406622
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+267.610079200261
+20
+-646.067882633009
+30
+628.271001705821
+11
+361.48899563696
+21
+-541.006514010435
+31
+587.016306884026
+12
+248.997950917359
+22
+-601.1342301078
+32
+587.016306884026
+13
+248.997950917359
+23
+-601.1342301078
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+361.48899563696
+20
+-541.006514010435
+30
+587.016306884026
+11
+267.610079200261
+21
+-646.067882633009
+31
+628.271001705821
+12
+388.509617834311
+22
+-581.445732901797
+32
+628.271001705821
+13
+388.509617834311
+23
+-581.445732901797
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+408.513405265645
+20
+-611.383516446667
+30
+680.911023534629
+11
+494.478949733692
+21
+-494.478949733692
+31
+628.271001705821
+12
+388.509617834311
+22
+-581.445732901797
+32
+628.271001705821
+13
+388.509617834311
+23
+-581.445732901797
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+494.478949733692
+20
+-494.478949733692
+30
+628.271001705821
+11
+408.513405265645
+21
+-611.383516446667
+31
+680.911023534629
+12
+519.938941830878
+22
+-519.938941830878
+32
+680.911023534629
+13
+519.938941830878
+23
+-519.938941830878
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+420.078334296643
+20
+-628.691655879276
+30
+741.194313252463
+11
+519.938941830878
+21
+-519.938941830878
+31
+680.911023534629
+12
+408.513405265645
+22
+-611.383516446667
+32
+680.911023534629
+13
+408.513405265645
+23
+-611.383516446667
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+519.938941830878
+20
+-519.938941830878
+30
+680.911023534629
+11
+420.078334296643
+21
+-628.691655879276
+31
+741.194313252463
+12
+534.658304488796
+22
+-534.658304488796
+32
+741.194313252463
+13
+534.658304488796
+23
+-534.658304488796
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+422.38228049373
+20
+-632.139755034707
+30
+804.835469255871
+11
+534.658304488796
+21
+-534.658304488796
+31
+741.194313252463
+12
+420.078334296643
+22
+-628.691655879276
+32
+741.194313252463
+13
+420.078334296643
+23
+-628.691655879276
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+534.658304488796
+20
+-534.658304488796
+30
+741.194313252463
+11
+422.38228049373
+21
+-632.139755034707
+31
+804.835469255871
+12
+537.590671780316
+22
+-537.590671780316
+32
+804.835469255871
+13
+537.590671780316
+23
+-537.590671780316
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+415.26146157539
+20
+-621.482696406622
+30
+867.310386884026
+11
+537.590671780316
+21
+-537.590671780316
+31
+804.835469255871
+12
+422.38228049373
+22
+-632.139755034707
+32
+804.835469255871
+13
+422.38228049373
+23
+-632.139755034707
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+537.590671780316
+20
+-537.590671780316
+30
+804.835469255871
+11
+415.26146157539
+21
+-621.482696406622
+31
+867.310386884026
+12
+528.527588401294
+22
+-528.527588401294
+32
+867.310386884026
+13
+528.527588401294
+23
+-528.527588401294
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+330.32974370685
+20
+-330.32974370685
+30
+1100.8886000213
+11
+415.26146157539
+21
+-621.482696406622
+31
+867.310386884026
+12
+259.538414235775
+22
+-388.426686378325
+32
+1100.8886000213
+13
+259.538414235775
+23
+-388.426686378325
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+415.26146157539
+20
+-621.482696406622
+30
+867.310386884026
+11
+330.32974370685
+21
+-330.32974370685
+31
+1100.8886000213
+12
+528.527588401294
+22
+-528.527588401294
+32
+867.310386884026
+13
+528.527588401294
+23
+-528.527588401294
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+337.399937905583
+20
+-504.954691392474
+30
+1287.75132002131
+11
+495.494614285554
+21
+-495.494614285554
+31
+1100.8886000213
+12
+389.307620352121
+22
+-582.640028068573
+32
+1100.8886000213
+13
+389.307620352121
+23
+-582.640028068573
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+495.494614285554
+20
+-495.494614285554
+30
+1100.8886000213
+11
+337.399937905583
+21
+-504.954691392474
+31
+1287.75132002131
+12
+429.428666054072
+22
+-429.428666054072
+32
+1287.75132002131
+13
+429.428666054072
+23
+-429.428666054072
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+363.353779128852
+20
+-543.797359730523
+30
+1474.6140400213
+11
+528.527588401294
+21
+-528.527588401294
+31
+1287.75132002131
+12
+415.26146157539
+22
+-621.482696406623
+32
+1287.75132002131
+13
+415.26146157539
+23
+-621.482696406623
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+528.527588401294
+20
+-528.527588401294
+30
+1287.75132002131
+11
+363.353779128852
+21
+-543.797359730523
+31
+1474.6140400213
+12
+462.461640169813
+22
+-462.461640169813
+32
+1474.6140400213
+13
+462.461640169813
+23
+-462.461640169813
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-607.303843605455
+30
+1287.75132002131
+11
+136.706656519425
+21
+-687.270773156591
+31
+1100.8886000213
+12
+0.0
+22
+-700.735203605455
+32
+1100.8886000213
+13
+0.0
+23
+-700.735203605455
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+136.706656519425
+20
+-687.270773156591
+30
+1100.8886000213
+11
+0.0
+21
+-607.303843605455
+31
+1287.75132002131
+12
+118.479102410621
+22
+-595.634670540536
+32
+1287.75132002131
+13
+118.479102410621
+23
+-595.634670540536
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+389.307620352121
+20
+-582.640028068573
+30
+1661.47676002131
+11
+561.560562517035
+21
+-561.560562517035
+31
+1474.6140400213
+12
+441.215302798659
+22
+-660.325364744673
+32
+1474.6140400213
+13
+441.215302798659
+23
+-660.325364744673
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+561.560562517035
+20
+-561.560562517035
+30
+1474.6140400213
+11
+389.307620352121
+21
+-582.640028068573
+31
+1661.47676002131
+12
+495.494614285554
+22
+-495.494614285554
+32
+1661.47676002131
+13
+495.494614285554
+23
+-495.494614285554
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+926.689746301964
+20
+-184.330051263379
+30
+2234.76895526921
+11
+964.850983209363
+21
+-1.80477854883065e-13
+31
+2169.85154878419
+12
+946.311642114328
+22
+-188.233089011893
+32
+2169.85154878419
+13
+946.311642114328
+23
+-188.233089011893
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+964.850983209363
+20
+-1.80477854883065e-13
+30
+2169.85154878419
+11
+926.689746301964
+21
+-184.330051263379
+31
+2234.76895526921
+12
+944.844671731792
+22
+-1.80477854883065e-13
+32
+2234.76895526921
+13
+944.844671731792
+23
+-1.80477854883065e-13
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+490.247554968877
+20
+-733.707315899088
+30
+1715.23764468454
+11
+594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+467.1777430806
+22
+-699.180902483484
+32
+1661.47676002131
+13
+467.1777430806
+23
+-699.180902483484
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+594.604481158485
+20
+-594.604481158485
+30
+1661.47676002131
+11
+490.247554968877
+21
+-733.707315899088
+31
+1715.23764468454
+12
+623.966782191491
+22
+-623.966782191491
+32
+1715.23764468454
+13
+623.966782191491
+23
+-623.966782191491
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+509.589579018778
+20
+-762.654700553784
+30
+1773.56823006635
+11
+623.966782191491
+21
+-623.966782191491
+31
+1715.23764468454
+12
+490.247554968877
+22
+-733.707315899088
+32
+1715.23764468454
+13
+490.247554968877
+23
+-733.707315899088
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+623.966782191491
+20
+-623.966782191491
+30
+1715.23764468454
+11
+509.589579018778
+21
+-762.654700553784
+31
+1773.56823006635
+12
+648.584509266648
+22
+-648.584509266648
+32
+1773.56823006635
+13
+648.584509266648
+23
+-648.584509266648
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+490.247554968877
+20
+-733.707315899088
+30
+2355.16675535807
+11
+648.584509266648
+21
+-648.584509266648
+31
+2296.83616997626
+12
+509.589579018778
+22
+-762.654700553784
+32
+2296.83616997626
+13
+509.589579018778
+23
+-762.654700553784
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+2296.83616997626
+11
+490.247554968877
+21
+-733.707315899088
+31
+2355.16675535807
+12
+623.96678219149
+22
+-623.966782191491
+32
+2355.16675535807
+13
+623.96678219149
+23
+-623.966782191491
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+899.612557411552
+20
+-178.944063519201
+30
+2296.83616997626
+11
+944.844671731792
+21
+-1.80477854883065e-13
+31
+2234.76895526921
+12
+926.689746301964
+22
+-184.330051263379
+32
+2234.76895526921
+13
+926.689746301964
+23
+-184.330051263379
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+944.844671731792
+20
+-1.80477854883065e-13
+30
+2234.76895526921
+11
+899.612557411552
+21
+-178.944063519201
+31
+2296.83616997626
+12
+917.237009349992
+22
+-1.80477854883065e-13
+32
+2296.83616997626
+13
+917.237009349992
+23
+-1.80477854883065e-13
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+865.466789057043
+20
+-172.152047899808
+30
+2355.16675535807
+11
+917.237009349992
+21
+-1.80477854883065e-13
+31
+2296.83616997626
+12
+899.612557411552
+22
+-178.944063519201
+32
+2296.83616997626
+13
+899.612557411552
+23
+-178.944063519201
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+917.237009349992
+20
+-1.80477854883065e-13
+30
+2296.83616997626
+11
+865.466789057043
+21
+-172.152047899808
+31
+2355.16675535807
+12
+882.422285845505
+22
+-1.80477854883065e-13
+32
+2355.16675535807
+13
+882.422285845505
+23
+-1.80477854883065e-13
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+824.740107573921
+20
+-164.051007270483
+30
+2408.9276400213
+11
+882.422285845505
+21
+-1.80477854883065e-13
+31
+2355.16675535807
+12
+865.466789057043
+22
+-172.152047899808
+32
+2355.16675535807
+13
+865.466789057043
+23
+-172.152047899808
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+882.422285845505
+20
+-1.80477854883065e-13
+30
+2355.16675535807
+11
+824.740107573921
+21
+-164.051007270483
+31
+2408.9276400213
+12
+840.897721502147
+22
+-1.80477854883065e-13
+32
+2408.9276400213
+13
+840.897721502147
+23
+-1.80477854883065e-13
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+747.450883605455
+20
+-1.80477854883065e-13
+30
+2549.0746800213
+11
+733.088824464619
+21
+-145.820433573828
+31
+2408.9276400213
+12
+733.088824464618
+22
+-145.820433573828
+32
+2549.0746800213
+13
+733.088824464618
+23
+-145.820433573828
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.088824464619
+20
+-145.820433573828
+30
+2408.9276400213
+11
+747.450883605455
+21
+-1.80477854883065e-13
+31
+2549.0746800213
+12
+747.450883605455
+22
+-1.80477854883065e-13
+32
+2408.9276400213
+13
+747.450883605455
+23
+-1.80477854883065e-13
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+467.1777430806
+20
+-699.180902483484
+30
+2408.9276400213
+11
+623.96678219149
+21
+-623.966782191491
+31
+2355.16675535807
+12
+490.247554968877
+22
+-733.707315899088
+32
+2355.16675535807
+13
+490.247554968877
+23
+-733.707315899088
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+623.96678219149
+20
+-623.966782191491
+30
+2355.16675535807
+11
+467.1777430806
+21
+-699.180902483484
+31
+2408.9276400213
+12
+594.604481158485
+22
+-594.604481158485
+32
+2408.9276400213
+13
+594.604481158485
+23
+-594.604481158485
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+415.26146157539
+20
+-621.482696406622
+30
+2549.0746800213
+11
+528.527588401294
+21
+-528.527588401294
+31
+2408.9276400213
+12
+415.26146157539
+22
+-621.482696406623
+32
+2408.9276400213
+13
+415.26146157539
+23
+-621.482696406623
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+528.527588401294
+20
+-528.527588401294
+30
+2408.9276400213
+11
+415.26146157539
+21
+-621.482696406622
+31
+2549.0746800213
+12
+528.527588401294
+22
+-528.527588401294
+32
+2549.0746800213
+13
+528.527588401294
+23
+-528.527588401294
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+388.509617834311
+20
+-581.445732901797
+30
+628.271001705821
+11
+460.088220979597
+21
+-460.088220979597
+31
+587.016306884026
+12
+361.48899563696
+22
+-541.006514010435
+32
+587.016306884026
+13
+361.48899563696
+23
+-541.006514010435
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+460.088220979597
+20
+-460.088220979597
+30
+587.016306884026
+11
+388.509617834311
+21
+-581.445732901797
+31
+628.271001705821
+12
+494.478949733692
+22
+-494.478949733692
+32
+628.271001705821
+13
+494.478949733692
+23
+-494.478949733692
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+611.383516446667
+20
+-408.513405265645
+30
+680.911023534629
+11
+494.478949733692
+21
+-494.478949733692
+31
+628.271001705821
+12
+519.938941830878
+22
+-519.938941830878
+32
+680.911023534629
+13
+519.938941830878
+23
+-519.938941830878
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+494.478949733692
+20
+-494.478949733692
+30
+628.271001705821
+11
+611.383516446667
+21
+-408.513405265645
+31
+680.911023534629
+12
+581.445732901797
+22
+-388.509617834311
+32
+628.271001705821
+13
+581.445732901797
+23
+-388.509617834311
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+628.691655879276
+20
+-420.078334296643
+30
+741.194313252463
+11
+519.938941830878
+21
+-519.938941830878
+31
+680.911023534629
+12
+534.658304488796
+22
+-534.658304488796
+32
+741.194313252463
+13
+534.658304488796
+23
+-534.658304488796
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+519.938941830878
+20
+-519.938941830878
+30
+680.911023534629
+11
+628.691655879276
+21
+-420.078334296643
+31
+741.194313252463
+12
+611.383516446667
+22
+-408.513405265645
+32
+680.911023534629
+13
+611.383516446667
+23
+-408.513405265645
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+632.139755034707
+20
+-422.38228049373
+30
+804.835469255871
+11
+534.658304488796
+21
+-534.658304488796
+31
+741.194313252463
+12
+537.590671780316
+22
+-537.590671780316
+32
+804.835469255871
+13
+537.590671780316
+23
+-537.590671780316
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+534.658304488796
+20
+-534.658304488796
+30
+741.194313252463
+11
+632.139755034707
+21
+-422.38228049373
+31
+804.835469255871
+12
+628.691655879276
+22
+-420.078334296643
+32
+741.194313252463
+13
+628.691655879276
+23
+-420.078334296643
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+528.527588401294
+20
+-528.527588401294
+30
+867.310386884026
+11
+632.139755034707
+21
+-422.38228049373
+31
+804.835469255871
+12
+537.590671780316
+22
+-537.590671780316
+32
+804.835469255871
+13
+537.590671780316
+23
+-537.590671780316
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+632.139755034707
+20
+-422.38228049373
+30
+804.835469255871
+11
+528.527588401294
+21
+-528.527588401294
+31
+867.310386884026
+12
+621.482696406622
+22
+-415.26146157539
+32
+867.310386884026
+13
+621.482696406622
+23
+-415.26146157539
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+388.426686378325
+20
+-259.538414235776
+30
+1100.8886000213
+11
+528.527588401294
+21
+-528.527588401294
+31
+867.310386884026
+12
+330.32974370685
+22
+-330.32974370685
+32
+1100.8886000213
+13
+330.32974370685
+23
+-330.32974370685
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+528.527588401294
+20
+-528.527588401294
+30
+867.310386884026
+11
+388.426686378325
+21
+-259.538414235776
+31
+1100.8886000213
+12
+621.482696406622
+22
+-415.26146157539
+32
+867.310386884026
+13
+621.482696406622
+23
+-415.26146157539
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-946.311642114328
+20
+-188.233089011893
+30
+2169.85154878419
+11
+-872.922653615348
+21
+-361.576402030189
+31
+2234.76895526921
+12
+-891.406075310522
+22
+-369.232485975391
+32
+2169.85154878419
+13
+-891.406075310522
+23
+-369.232485975391
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-872.922653615348
+20
+-361.576402030189
+30
+2234.76895526921
+11
+-946.311642114328
+21
+-188.233089011893
+31
+2169.85154878419
+12
+-926.689746301964
+22
+-184.330051263378
+32
+2234.76895526921
+13
+-926.689746301964
+23
+-184.330051263378
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+429.428666054072
+20
+-429.428666054072
+30
+1287.75132002131
+11
+582.640028068573
+21
+-389.307620352121
+31
+1100.8886000213
+12
+495.494614285554
+22
+-495.494614285554
+32
+1100.8886000213
+13
+495.494614285554
+23
+-495.494614285554
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+582.640028068573
+20
+-389.307620352121
+30
+1100.8886000213
+11
+429.428666054072
+21
+-429.428666054072
+31
+1287.75132002131
+12
+504.954691392474
+22
+-337.399937905583
+32
+1287.75132002131
+13
+504.954691392474
+23
+-337.399937905583
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+462.461640169813
+20
+-462.461640169813
+30
+1474.6140400213
+11
+621.482696406623
+21
+-415.26146157539
+31
+1287.75132002131
+12
+528.527588401294
+22
+-528.527588401294
+32
+1287.75132002131
+13
+528.527588401294
+23
+-528.527588401294
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+621.482696406623
+20
+-415.26146157539
+30
+1287.75132002131
+11
+462.461640169813
+21
+-462.461640169813
+31
+1474.6140400213
+12
+543.797359730523
+22
+-363.353779128852
+32
+1474.6140400213
+13
+543.797359730523
+23
+-363.353779128852
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+495.494614285554
+20
+-495.494614285554
+30
+1661.47676002131
+11
+660.325364744673
+21
+-441.21530279866
+31
+1474.6140400213
+12
+561.560562517035
+22
+-561.560562517035
+32
+1474.6140400213
+13
+561.560562517035
+23
+-561.560562517035
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+660.325364744673
+20
+-441.21530279866
+30
+1474.6140400213
+11
+495.494614285554
+21
+-495.494614285554
+31
+1661.47676002131
+12
+582.640028068573
+22
+-389.307620352121
+32
+1661.47676002131
+13
+582.640028068573
+23
+-389.307620352121
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+685.862005953678
+20
+-136.426435300007
+30
+628.271001705821
+11
+650.663001997455
+21
+-1.80477854883065e-13
+31
+587.016306884026
+12
+638.160694862082
+22
+-126.938054583664
+32
+587.016306884026
+13
+638.160694862082
+23
+-126.938054583664
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+650.663001997455
+20
+-1.80477854883065e-13
+30
+587.016306884026
+11
+685.862005953678
+21
+-136.426435300007
+31
+628.271001705821
+12
+699.298837021391
+22
+-1.80477854883065e-13
+32
+628.271001705821
+13
+699.298837021391
+23
+-1.80477854883065e-13
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.707315899088
+20
+-490.247554968878
+30
+1715.23764468454
+11
+594.604481158485
+21
+-594.604481158485
+31
+1661.47676002131
+12
+623.966782191491
+22
+-623.966782191491
+32
+1715.23764468454
+13
+623.966782191491
+23
+-623.966782191491
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+594.604481158485
+20
+-594.604481158485
+30
+1661.47676002131
+11
+733.707315899088
+21
+-490.247554968878
+31
+1715.23764468454
+12
+699.180902483483
+22
+-467.1777430806
+32
+1661.47676002131
+13
+699.180902483483
+23
+-467.1777430806
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+762.654700553784
+20
+-509.589579018778
+30
+1773.56823006635
+11
+623.966782191491
+21
+-623.966782191491
+31
+1715.23764468454
+12
+648.584509266648
+22
+-648.584509266648
+32
+1773.56823006635
+13
+648.584509266648
+23
+-648.584509266648
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+623.966782191491
+20
+-623.966782191491
+30
+1715.23764468454
+11
+762.654700553784
+21
+-509.589579018778
+31
+1773.56823006635
+12
+733.707315899088
+22
+-490.247554968878
+32
+1715.23764468454
+13
+733.707315899088
+23
+-490.247554968878
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+785.609632890959
+20
+-524.927574441361
+30
+1835.6354447734
+11
+648.584509266648
+21
+-648.584509266648
+31
+1773.56823006635
+12
+668.106074549527
+22
+-668.106074549528
+32
+1835.6354447734
+13
+668.106074549527
+23
+-668.106074549528
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+1773.56823006635
+11
+785.609632890959
+21
+-524.927574441361
+31
+1835.6354447734
+12
+762.654700553784
+22
+-509.589579018778
+32
+1773.56823006635
+13
+762.654700553784
+23
+-509.589579018778
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+136.426435300007
+20
+-685.862005953678
+30
+628.271001705821
+11
+0.0
+21
+-650.663001997455
+31
+587.016306884026
+12
+0.0
+22
+-699.298837021391
+32
+628.271001705821
+13
+0.0
+23
+-699.298837021391
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-650.663001997455
+30
+587.016306884026
+11
+136.426435300007
+21
+-685.862005953678
+31
+628.271001705821
+12
+126.938054583664
+22
+-638.160694862082
+32
+587.016306884026
+13
+126.938054583664
+23
+-638.160694862082
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+2296.83616997626
+11
+785.609632890959
+21
+-524.927574441361
+31
+2234.76895526921
+12
+668.106074549527
+22
+-668.106074549528
+32
+2234.76895526921
+13
+668.106074549527
+23
+-668.106074549528
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+785.609632890959
+20
+-524.927574441361
+30
+2234.76895526921
+11
+648.584509266648
+21
+-648.584509266648
+31
+2296.83616997626
+12
+762.654700553784
+22
+-509.589579018778
+32
+2296.83616997626
+13
+762.654700553784
+23
+-509.589579018778
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+623.96678219149
+20
+-623.966782191491
+30
+2355.16675535807
+11
+762.654700553784
+21
+-509.589579018778
+31
+2296.83616997626
+12
+648.584509266648
+22
+-648.584509266648
+32
+2296.83616997626
+13
+648.584509266648
+23
+-648.584509266648
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+762.654700553784
+20
+-509.589579018778
+30
+2296.83616997626
+11
+623.96678219149
+21
+-623.966782191491
+31
+2355.16675535807
+12
+733.707315899088
+22
+-490.247554968877
+32
+2355.16675535807
+13
+733.707315899088
+23
+-490.247554968877
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+594.604481158485
+20
+-594.604481158485
+30
+2408.9276400213
+11
+733.707315899088
+21
+-490.247554968877
+31
+2355.16675535807
+12
+623.96678219149
+22
+-623.966782191491
+32
+2355.16675535807
+13
+623.96678219149
+23
+-623.966782191491
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.707315899088
+20
+-490.247554968877
+30
+2355.16675535807
+11
+594.604481158485
+21
+-594.604481158485
+31
+2408.9276400213
+12
+699.180902483483
+22
+-467.1777430806
+32
+2408.9276400213
+13
+699.180902483483
+23
+-467.1777430806
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+528.527588401294
+20
+-528.527588401294
+30
+2549.0746800213
+11
+621.482696406623
+21
+-415.26146157539
+31
+2408.9276400213
+12
+528.527588401294
+22
+-528.527588401294
+32
+2408.9276400213
+13
+528.527588401294
+23
+-528.527588401294
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+621.482696406623
+20
+-415.26146157539
+30
+2408.9276400213
+11
+528.527588401294
+21
+-528.527588401294
+31
+2549.0746800213
+12
+621.482696406622
+22
+-415.26146157539
+32
+2549.0746800213
+13
+621.482696406622
+23
+-415.26146157539
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+494.478949733692
+20
+-494.478949733692
+30
+628.271001705821
+11
+541.006514010434
+21
+-361.48899563696
+31
+587.016306884026
+12
+460.088220979597
+22
+-460.088220979597
+32
+587.016306884026
+13
+460.088220979597
+23
+-460.088220979597
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+541.006514010434
+20
+-361.48899563696
+30
+587.016306884026
+11
+494.478949733692
+21
+-494.478949733692
+31
+628.271001705821
+12
+581.445732901797
+22
+-388.509617834311
+32
+628.271001705821
+13
+581.445732901797
+23
+-388.509617834311
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+698.564739508658
+20
+-289.354989300114
+30
+741.194313252463
+11
+611.383516446667
+21
+-408.513405265645
+31
+680.911023534629
+12
+628.691655879276
+22
+-420.078334296643
+32
+741.194313252463
+13
+628.691655879276
+23
+-420.078334296643
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+611.383516446667
+20
+-408.513405265645
+30
+680.911023534629
+11
+698.564739508658
+21
+-289.354989300114
+31
+741.194313252463
+12
+679.332965393237
+22
+-281.388927633011
+32
+680.911023534629
+13
+679.332965393237
+23
+-281.388927633011
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+702.396062011173
+20
+-290.941975042481
+30
+804.835469255871
+11
+628.691655879276
+21
+-420.078334296643
+31
+741.194313252463
+12
+632.139755034707
+22
+-422.38228049373
+32
+804.835469255871
+13
+632.139755034707
+23
+-422.38228049373
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+628.691655879276
+20
+-420.078334296643
+30
+741.194313252463
+11
+702.396062011173
+21
+-290.941975042481
+31
+804.835469255871
+12
+698.564739508658
+22
+-289.354989300114
+32
+741.194313252463
+13
+698.564739508658
+23
+-289.354989300114
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+621.482696406622
+20
+-415.26146157539
+30
+867.310386884026
+11
+702.396062011173
+21
+-290.941975042481
+31
+804.835469255871
+12
+632.139755034707
+22
+-422.38228049373
+32
+804.835469255871
+13
+632.139755034707
+23
+-422.38228049373
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+702.396062011173
+20
+-290.941975042481
+30
+804.835469255871
+11
+621.482696406622
+21
+-415.26146157539
+31
+867.310386884026
+12
+690.554572920556
+22
+-286.037069662455
+32
+867.310386884026
+13
+690.554572920556
+23
+-286.037069662455
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+543.797359730523
+20
+-363.353779128852
+30
+1474.6140400213
+11
+690.554572920556
+21
+-286.037069662455
+31
+1287.75132002131
+12
+621.482696406623
+22
+-415.26146157539
+32
+1287.75132002131
+13
+621.482696406623
+23
+-415.26146157539
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+690.554572920556
+20
+-286.037069662455
+30
+1287.75132002131
+11
+543.797359730523
+21
+-363.353779128852
+31
+1474.6140400213
+12
+604.235251721863
+22
+-250.282436127116
+32
+1474.6140400213
+13
+604.235251721863
+23
+-250.282436127116
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+431.596609324475
+20
+-178.77316905644
+30
+1100.8886000213
+11
+621.482696406622
+21
+-415.26146157539
+31
+867.310386884026
+12
+388.426686378325
+22
+-259.538414235776
+32
+1100.8886000213
+13
+388.426686378325
+23
+-259.538414235776
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+621.482696406622
+20
+-415.26146157539
+30
+867.310386884026
+11
+431.596609324475
+21
+-178.77316905644
+31
+1100.8886000213
+12
+690.554572920556
+22
+-286.037069662455
+32
+867.310386884026
+13
+690.554572920556
+23
+-286.037069662455
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+504.954691392474
+20
+-337.399937905583
+30
+1287.75132002131
+11
+647.39491232121
+21
+-268.159752894786
+31
+1100.8886000213
+12
+582.640028068573
+22
+-389.307620352121
+32
+1100.8886000213
+13
+582.640028068573
+23
+-389.307620352121
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+647.39491232121
+20
+-268.159752894786
+30
+1100.8886000213
+11
+504.954691392474
+21
+-337.399937905583
+31
+1287.75132002131
+12
+561.075591122516
+22
+-232.405119359447
+32
+1287.75132002131
+13
+561.075591122516
+23
+-232.405119359447
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-946.311642114328
+20
+-188.233089011893
+30
+1900.55285125842
+11
+-976.970215709362
+21
+-1.80477854883065e-13
+31
+1967.39330582966
+12
+-958.198006960111
+22
+-190.597433982906
+32
+1967.39330582966
+13
+-958.198006960111
+23
+-190.597433982906
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-976.970215709362
+20
+-1.80477854883065e-13
+30
+1967.39330582966
+11
+-946.311642114328
+21
+-188.233089011893
+31
+1900.55285125842
+12
+-964.850983209364
+22
+-1.80477854883065e-13
+32
+1900.55285125842
+13
+-964.850983209364
+23
+-1.80477854883065e-13
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+582.640028068573
+20
+-389.307620352121
+30
+1661.47676002131
+11
+733.714233519903
+21
+-303.914386430124
+31
+1474.6140400213
+12
+660.325364744673
+22
+-441.21530279866
+32
+1474.6140400213
+13
+660.325364744673
+23
+-441.21530279866
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.714233519903
+20
+-303.914386430124
+30
+1474.6140400213
+11
+582.640028068573
+21
+-389.307620352121
+31
+1661.47676002131
+12
+647.39491232121
+22
+-268.159752894786
+32
+1661.47676002131
+13
+647.39491232121
+23
+-268.159752894786
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+815.251888924487
+20
+-337.688389142806
+30
+1715.23764468454
+11
+699.180902483483
+21
+-467.1777430806
+31
+1661.47676002131
+12
+733.707315899088
+22
+-490.247554968878
+32
+1715.23764468454
+13
+733.707315899088
+23
+-490.247554968878
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+699.180902483483
+20
+-467.1777430806
+30
+1661.47676002131
+11
+815.251888924487
+21
+-337.688389142806
+31
+1715.23764468454
+12
+776.88819383121
+22
+-321.797626332425
+32
+1661.47676002131
+13
+776.88819383121
+23
+-321.797626332425
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+847.416499400322
+20
+-351.011407030345
+30
+1773.56823006635
+11
+733.707315899088
+21
+-490.247554968878
+31
+1715.23764468454
+12
+762.654700553784
+22
+-509.589579018778
+32
+1773.56823006635
+13
+762.654700553784
+23
+-509.589579018778
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.707315899088
+20
+-490.247554968878
+30
+1715.23764468454
+11
+847.416499400322
+21
+-351.011407030345
+31
+1773.56823006635
+12
+815.251888924487
+22
+-337.688389142806
+32
+1715.23764468454
+13
+815.251888924487
+23
+-337.688389142806
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+872.922653615349
+20
+-361.576402030189
+30
+1835.6354447734
+11
+762.654700553784
+21
+-509.589579018778
+31
+1773.56823006635
+12
+785.609632890959
+22
+-524.927574441361
+32
+1835.6354447734
+13
+785.609632890959
+23
+-524.927574441361
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+762.654700553784
+20
+-509.589579018778
+30
+1773.56823006635
+11
+872.922653615349
+21
+-361.576402030189
+31
+1835.6354447734
+12
+847.416499400322
+22
+-351.011407030345
+32
+1773.56823006635
+13
+847.416499400322
+23
+-351.011407030345
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+891.406075310522
+20
+-369.232485975391
+30
+1900.55285125842
+11
+785.609632890959
+21
+-524.927574441361
+31
+1835.6354447734
+12
+802.244272938819
+22
+-536.042485570819
+32
+1900.55285125842
+13
+802.244272938819
+23
+-536.042485570819
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+785.609632890959
+20
+-524.927574441361
+30
+1835.6354447734
+11
+891.406075310522
+21
+-369.232485975391
+31
+1900.55285125842
+12
+872.922653615349
+22
+-361.576402030189
+32
+1835.6354447734
+13
+872.922653615349
+23
+-361.576402030189
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+906.35287591729
+20
+-375.423653500801
+30
+2035.2022000213
+11
+812.321046486997
+21
+-542.775570394861
+31
+1967.39330582966
+12
+815.696038096871
+22
+-545.030667691736
+32
+2035.2022000213
+13
+815.696038096871
+23
+-545.030667691736
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+812.321046486997
+20
+-542.775570394861
+30
+1967.39330582966
+11
+906.35287591729
+21
+-375.423653500801
+31
+2035.2022000213
+12
+902.602786167016
+22
+-373.87031546612
+32
+1967.39330582966
+13
+902.602786167016
+23
+-373.87031546612
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+902.602786167016
+20
+-373.87031546612
+30
+1967.39330582966
+11
+802.244272938819
+21
+-536.042485570819
+31
+1900.55285125842
+12
+812.321046486997
+22
+-542.775570394861
+32
+1967.39330582966
+13
+812.321046486997
+23
+-542.775570394861
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.244272938819
+20
+-536.042485570819
+30
+1900.55285125842
+11
+902.602786167016
+21
+-373.87031546612
+31
+1967.39330582966
+12
+891.406075310522
+22
+-369.232485975391
+32
+1900.55285125842
+13
+891.406075310522
+23
+-369.232485975391
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+812.321046486996
+20
+-542.775570394861
+30
+2103.01109421295
+11
+906.35287591729
+21
+-375.423653500801
+31
+2035.2022000213
+12
+815.696038096871
+22
+-545.030667691736
+32
+2035.2022000213
+13
+815.696038096871
+23
+-545.030667691736
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+906.35287591729
+20
+-375.423653500801
+30
+2035.2022000213
+11
+812.321046486996
+21
+-542.775570394861
+31
+2103.01109421295
+12
+902.602786167016
+22
+-373.87031546612
+32
+2103.01109421295
+13
+902.602786167016
+23
+-373.87031546612
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-926.689746301964
+20
+-184.330051263378
+30
+1835.6354447734
+11
+-964.850983209364
+21
+-1.80477854883065e-13
+31
+1900.55285125842
+12
+-946.311642114328
+22
+-188.233089011893
+32
+1900.55285125842
+13
+-946.311642114328
+23
+-188.233089011893
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-964.850983209364
+20
+-1.80477854883065e-13
+30
+1900.55285125842
+11
+-926.689746301964
+21
+-184.330051263378
+31
+1835.6354447734
+12
+-944.844671731792
+22
+0.0
+32
+1835.6354447734
+13
+-944.844671731792
+23
+0.0
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.244272938819
+20
+-536.042485570818
+30
+2169.85154878419
+11
+902.602786167016
+21
+-373.87031546612
+31
+2103.01109421295
+12
+812.321046486996
+22
+-542.775570394861
+32
+2103.01109421295
+13
+812.321046486996
+23
+-542.775570394861
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+902.602786167016
+20
+-373.87031546612
+30
+2103.01109421295
+11
+802.244272938819
+21
+-536.042485570818
+31
+2169.85154878419
+12
+891.406075310522
+22
+-369.232485975391
+32
+2169.85154878419
+13
+891.406075310522
+23
+-369.232485975391
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+785.609632890959
+20
+-524.927574441361
+30
+2234.76895526921
+11
+891.406075310522
+21
+-369.232485975391
+31
+2169.85154878419
+12
+802.244272938819
+22
+-536.042485570818
+32
+2169.85154878419
+13
+802.244272938819
+23
+-536.042485570818
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+891.406075310522
+20
+-369.232485975391
+30
+2169.85154878419
+11
+785.609632890959
+21
+-524.927574441361
+31
+2234.76895526921
+12
+872.922653615349
+22
+-361.576402030189
+32
+2234.76895526921
+13
+872.922653615349
+23
+-361.576402030189
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-519.938941830878
+20
+-519.938941830878
+30
+680.911023534629
+11
+-388.509617834311
+21
+-581.445732901797
+31
+628.271001705821
+12
+-494.478949733692
+22
+-494.478949733692
+32
+628.271001705821
+13
+-494.478949733692
+23
+-494.478949733692
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-388.509617834311
+20
+-581.445732901797
+30
+628.271001705821
+11
+-519.938941830878
+21
+-519.938941830878
+31
+680.911023534629
+12
+-408.513405265646
+22
+-611.383516446667
+32
+680.911023534629
+13
+-408.513405265646
+23
+-611.383516446667
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+762.654700553784
+20
+-509.589579018778
+30
+2296.83616997626
+11
+872.922653615349
+21
+-361.576402030189
+31
+2234.76895526921
+12
+785.609632890959
+22
+-524.927574441361
+32
+2234.76895526921
+13
+785.609632890959
+23
+-524.927574441361
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+872.922653615349
+20
+-361.576402030189
+30
+2234.76895526921
+11
+762.654700553784
+21
+-509.589579018778
+31
+2296.83616997626
+12
+847.416499400322
+22
+-351.011407030345
+32
+2296.83616997626
+13
+847.416499400322
+23
+-351.011407030345
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.707315899088
+20
+-490.247554968877
+30
+2355.16675535807
+11
+847.416499400322
+21
+-351.011407030345
+31
+2296.83616997626
+12
+762.654700553784
+22
+-509.589579018778
+32
+2296.83616997626
+13
+762.654700553784
+23
+-509.589579018778
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+847.416499400322
+20
+-351.011407030345
+30
+2296.83616997626
+11
+733.707315899088
+21
+-490.247554968877
+31
+2355.16675535807
+12
+815.251888924486
+22
+-337.688389142806
+32
+2355.16675535807
+13
+815.251888924486
+23
+-337.688389142806
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+699.180902483483
+20
+-467.1777430806
+30
+2408.9276400213
+11
+815.251888924486
+21
+-337.688389142806
+31
+2355.16675535807
+12
+733.707315899088
+22
+-490.247554968877
+32
+2355.16675535807
+13
+733.707315899088
+23
+-490.247554968877
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+815.251888924486
+20
+-337.688389142806
+30
+2355.16675535807
+11
+699.180902483483
+21
+-467.1777430806
+31
+2408.9276400213
+12
+776.88819383121
+22
+-321.797626332425
+32
+2408.9276400213
+13
+776.88819383121
+23
+-321.797626332425
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+621.482696406622
+20
+-415.26146157539
+30
+2549.0746800213
+11
+690.554572920556
+21
+-286.037069662455
+31
+2408.9276400213
+12
+621.482696406623
+22
+-415.26146157539
+32
+2408.9276400213
+13
+621.482696406623
+23
+-415.26146157539
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+690.554572920556
+20
+-286.037069662455
+30
+2408.9276400213
+11
+621.482696406622
+21
+-415.26146157539
+31
+2549.0746800213
+12
+690.554572920556
+22
+-286.037069662455
+32
+2549.0746800213
+13
+690.554572920556
+23
+-286.037069662455
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+581.445732901797
+20
+-388.509617834311
+30
+628.271001705821
+11
+601.1342301078
+21
+-248.997950917359
+31
+587.016306884026
+12
+541.006514010434
+22
+-361.48899563696
+32
+587.016306884026
+13
+541.006514010434
+23
+-361.48899563696
+33
+587.016306884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+601.1342301078
+20
+-248.997950917359
+30
+587.016306884026
+11
+581.445732901797
+21
+-388.509617834311
+31
+628.271001705821
+12
+646.067882633009
+22
+-267.610079200261
+32
+628.271001705821
+13
+646.067882633009
+23
+-267.610079200261
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+721.176029454062
+20
+-143.45083131617
+30
+680.911023534629
+11
+646.067882633009
+21
+-267.610079200261
+31
+628.271001705821
+12
+679.332965393237
+22
+-281.388927633011
+32
+680.911023534629
+13
+679.332965393237
+23
+-281.388927633011
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+646.067882633009
+20
+-267.610079200261
+30
+628.271001705821
+11
+721.176029454062
+21
+-143.45083131617
+31
+680.911023534629
+12
+685.862005953678
+22
+-136.426435300007
+32
+628.271001705821
+13
+685.862005953678
+23
+-136.426435300007
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+741.592371958341
+20
+-147.51189433693
+30
+741.194313252463
+11
+679.332965393237
+21
+-281.388927633011
+31
+680.911023534629
+12
+698.564739508658
+22
+-289.354989300114
+32
+741.194313252463
+13
+698.564739508658
+23
+-289.354989300114
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+679.332965393237
+20
+-281.388927633011
+30
+680.911023534629
+11
+741.592371958341
+21
+-147.51189433693
+31
+741.194313252463
+12
+721.176029454062
+22
+-143.45083131617
+32
+680.911023534629
+13
+721.176029454062
+23
+-143.45083131617
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+745.659682232799
+20
+-148.32093265249
+30
+804.835469255871
+11
+698.564739508658
+21
+-289.354989300114
+31
+741.194313252463
+12
+702.396062011173
+22
+-290.941975042481
+32
+804.835469255871
+13
+702.396062011173
+23
+-290.941975042481
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+698.564739508658
+20
+-289.354989300114
+30
+741.194313252463
+11
+745.659682232799
+21
+-148.32093265249
+31
+804.835469255871
+12
+741.592371958341
+22
+-147.51189433693
+32
+741.194313252463
+13
+741.592371958341
+23
+-147.51189433693
+33
+741.194313252463
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+690.554572920556
+20
+-286.037069662455
+30
+867.310386884026
+11
+745.659682232799
+21
+-148.32093265249
+31
+804.835469255871
+12
+702.396062011173
+22
+-290.941975042481
+32
+804.835469255871
+13
+702.396062011173
+23
+-290.941975042481
+33
+804.835469255871
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+745.659682232799
+20
+-148.32093265249
+30
+804.835469255871
+11
+690.554572920556
+21
+-286.037069662455
+31
+867.310386884026
+12
+733.088824464618
+22
+-145.820433573828
+32
+867.310386884026
+13
+733.088824464618
+23
+-145.820433573828
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+458.180516616454
+20
+-91.1377712474138
+30
+1100.8886000213
+11
+690.554572920556
+21
+-286.037069662455
+31
+867.310386884026
+12
+431.596609324475
+22
+-178.77316905644
+32
+1100.8886000213
+13
+431.596609324475
+23
+-178.77316905644
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+690.554572920556
+20
+-286.037069662455
+30
+867.310386884026
+11
+458.180516616454
+21
+-91.1377712474138
+31
+1100.8886000213
+12
+733.088824464618
+22
+-145.820433573828
+32
+867.310386884026
+13
+733.088824464618
+23
+-145.820433573828
+33
+867.310386884026
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+561.075591122516
+20
+-232.405119359447
+30
+1287.75132002131
+11
+687.270773156591
+21
+-136.706656519426
+31
+1100.8886000213
+12
+647.39491232121
+22
+-268.159752894786
+32
+1100.8886000213
+13
+647.39491232121
+23
+-268.159752894786
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+687.270773156591
+20
+-136.706656519426
+30
+1100.8886000213
+11
+561.075591122516
+21
+-232.405119359447
+31
+1287.75132002131
+12
+595.634670540536
+22
+-118.479102410621
+32
+1287.75132002131
+13
+595.634670540536
+23
+-118.479102410621
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+604.235251721863
+20
+-250.282436127116
+30
+1474.6140400213
+11
+733.088824464619
+21
+-145.820433573828
+31
+1287.75132002131
+12
+690.554572920556
+22
+-286.037069662455
+32
+1287.75132002131
+13
+690.554572920556
+23
+-286.037069662455
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.088824464619
+20
+-145.820433573828
+30
+1287.75132002131
+11
+604.235251721863
+21
+-250.282436127116
+31
+1474.6140400213
+12
+641.452721848564
+22
+-127.592879465023
+32
+1474.6140400213
+13
+641.452721848564
+23
+-127.592879465023
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+647.39491232121
+20
+-268.159752894786
+30
+1661.47676002131
+11
+778.906875772646
+21
+-154.934210628231
+31
+1474.6140400213
+12
+733.714233519903
+22
+-303.914386430124
+32
+1474.6140400213
+13
+733.714233519903
+23
+-303.914386430124
+33
+1474.6140400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+778.906875772646
+20
+-154.934210628231
+30
+1474.6140400213
+11
+647.39491232121
+21
+-268.159752894786
+31
+1661.47676002131
+12
+687.270773156591
+22
+-136.706656519426
+32
+1661.47676002131
+13
+687.270773156591
+23
+-136.706656519426
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+865.466789057043
+20
+-172.152047899808
+30
+1715.23764468454
+11
+776.88819383121
+21
+-321.797626332425
+31
+1661.47676002131
+12
+815.251888924487
+22
+-337.688389142806
+32
+1715.23764468454
+13
+815.251888924487
+23
+-337.688389142806
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+776.88819383121
+20
+-321.797626332425
+30
+1661.47676002131
+11
+865.466789057043
+21
+-172.152047899808
+31
+1715.23764468454
+12
+824.740107573921
+22
+-164.051007270483
+32
+1661.47676002131
+13
+824.740107573921
+23
+-164.051007270483
+33
+1661.47676002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+899.612557411552
+20
+-178.944063519201
+30
+1773.56823006635
+11
+815.251888924487
+21
+-337.688389142806
+31
+1715.23764468454
+12
+847.416499400322
+22
+-351.011407030345
+32
+1773.56823006635
+13
+847.416499400322
+23
+-351.011407030345
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+815.251888924487
+20
+-337.688389142806
+30
+1715.23764468454
+11
+899.612557411552
+21
+-178.944063519201
+31
+1773.56823006635
+12
+865.466789057043
+22
+-172.152047899808
+32
+1715.23764468454
+13
+865.466789057043
+23
+-172.152047899808
+33
+1715.23764468454
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+926.689746301964
+20
+-184.330051263379
+30
+1835.6354447734
+11
+847.416499400322
+21
+-351.011407030345
+31
+1773.56823006635
+12
+872.922653615349
+22
+-361.576402030189
+32
+1835.6354447734
+13
+872.922653615349
+23
+-361.576402030189
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+847.416499400322
+20
+-351.011407030345
+30
+1773.56823006635
+11
+926.689746301964
+21
+-184.330051263379
+31
+1835.6354447734
+12
+899.612557411552
+22
+-178.944063519201
+32
+1773.56823006635
+13
+899.612557411552
+23
+-178.944063519201
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+946.311642114328
+20
+-188.233089011893
+30
+1900.55285125842
+11
+872.922653615349
+21
+-361.576402030189
+31
+1835.6354447734
+12
+891.406075310522
+22
+-369.232485975391
+32
+1900.55285125842
+13
+891.406075310522
+23
+-369.232485975391
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+872.922653615349
+20
+-361.576402030189
+30
+1835.6354447734
+11
+946.311642114328
+21
+-188.233089011893
+31
+1900.55285125842
+12
+926.689746301964
+22
+-184.330051263379
+32
+1835.6354447734
+13
+926.689746301964
+23
+-184.330051263379
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+958.198006960111
+20
+-190.597433982906
+30
+1967.39330582966
+11
+891.406075310522
+21
+-369.232485975391
+31
+1900.55285125842
+12
+902.602786167016
+22
+-373.87031546612
+32
+1967.39330582966
+13
+902.602786167016
+23
+-373.87031546612
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+891.406075310522
+20
+-369.232485975391
+30
+1900.55285125842
+11
+958.198006960111
+21
+-190.597433982906
+31
+1967.39330582966
+12
+946.311642114328
+22
+-188.233089011893
+32
+1900.55285125842
+13
+946.311642114328
+23
+-188.233089011893
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+962.179081004756
+20
+-191.38931884584
+30
+2035.2022000213
+11
+902.602786167016
+21
+-373.87031546612
+31
+1967.39330582966
+12
+906.35287591729
+22
+-375.423653500801
+32
+2035.2022000213
+13
+906.35287591729
+23
+-375.423653500801
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+902.602786167016
+20
+-373.87031546612
+30
+1967.39330582966
+11
+962.179081004756
+21
+-191.38931884584
+31
+2035.2022000213
+12
+958.198006960111
+22
+-190.597433982906
+32
+1967.39330582966
+13
+958.198006960111
+23
+-190.597433982906
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+902.602786167016
+20
+-373.87031546612
+30
+2103.01109421295
+11
+962.179081004756
+21
+-191.38931884584
+31
+2035.2022000213
+12
+906.35287591729
+22
+-375.423653500801
+32
+2035.2022000213
+13
+906.35287591729
+23
+-375.423653500801
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+962.179081004756
+20
+-191.38931884584
+30
+2035.2022000213
+11
+902.602786167016
+21
+-373.87031546612
+31
+2103.01109421295
+12
+958.19800696011
+22
+-190.597433982906
+32
+2103.01109421295
+13
+958.19800696011
+23
+-190.597433982906
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+891.406075310522
+20
+-369.232485975391
+30
+2169.85154878419
+11
+958.19800696011
+21
+-190.597433982906
+31
+2103.01109421295
+12
+902.602786167016
+22
+-373.87031546612
+32
+2103.01109421295
+13
+902.602786167016
+23
+-373.87031546612
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+958.19800696011
+20
+-190.597433982906
+30
+2103.01109421295
+11
+891.406075310522
+21
+-369.232485975391
+31
+2169.85154878419
+12
+946.311642114328
+22
+-188.233089011893
+32
+2169.85154878419
+13
+946.311642114328
+23
+-188.233089011893
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+872.922653615349
+20
+-361.576402030189
+30
+2234.76895526921
+11
+946.311642114328
+21
+-188.233089011893
+31
+2169.85154878419
+12
+891.406075310522
+22
+-369.232485975391
+32
+2169.85154878419
+13
+891.406075310522
+23
+-369.232485975391
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+946.311642114328
+20
+-188.233089011893
+30
+2169.85154878419
+11
+872.922653615349
+21
+-361.576402030189
+31
+2234.76895526921
+12
+926.689746301964
+22
+-184.330051263379
+32
+2234.76895526921
+13
+926.689746301964
+23
+-184.330051263379
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+776.88819383121
+20
+-321.797626332425
+30
+2408.9276400213
+11
+865.466789057043
+21
+-172.152047899808
+31
+2355.16675535807
+12
+815.251888924486
+22
+-337.688389142806
+32
+2355.16675535807
+13
+815.251888924486
+23
+-337.688389142806
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+865.466789057043
+20
+-172.152047899808
+30
+2355.16675535807
+11
+776.88819383121
+21
+-321.797626332425
+31
+2408.9276400213
+12
+824.740107573921
+22
+-164.051007270483
+32
+2408.9276400213
+13
+824.740107573921
+23
+-164.051007270483
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+847.416499400322
+20
+-351.011407030345
+30
+2296.83616997626
+11
+926.689746301964
+21
+-184.330051263379
+31
+2234.76895526921
+12
+872.922653615349
+22
+-361.576402030189
+32
+2234.76895526921
+13
+872.922653615349
+23
+-361.576402030189
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+926.689746301964
+20
+-184.330051263379
+30
+2234.76895526921
+11
+847.416499400322
+21
+-351.011407030345
+31
+2296.83616997626
+12
+899.612557411552
+22
+-178.944063519201
+32
+2296.83616997626
+13
+899.612557411552
+23
+-178.944063519201
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+815.251888924486
+20
+-337.688389142806
+30
+2355.16675535807
+11
+899.612557411552
+21
+-178.944063519201
+31
+2296.83616997626
+12
+847.416499400322
+22
+-351.011407030345
+32
+2296.83616997626
+13
+847.416499400322
+23
+-351.011407030345
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+899.612557411552
+20
+-178.944063519201
+30
+2296.83616997626
+11
+815.251888924486
+21
+-337.688389142806
+31
+2355.16675535807
+12
+865.466789057043
+22
+-172.152047899808
+32
+2355.16675535807
+13
+865.466789057043
+23
+-172.152047899808
+33
+2355.16675535807
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+690.554572920556
+20
+-286.037069662455
+30
+2549.0746800213
+11
+733.088824464619
+21
+-145.820433573828
+31
+2408.9276400213
+12
+690.554572920556
+22
+-286.037069662455
+32
+2408.9276400213
+13
+690.554572920556
+23
+-286.037069662455
+33
+2408.9276400213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+733.088824464619
+20
+-145.820433573828
+30
+2408.9276400213
+11
+690.554572920556
+21
+-286.037069662455
+31
+2549.0746800213
+12
+733.088824464618
+22
+-145.820433573828
+32
+2549.0746800213
+13
+733.088824464618
+23
+-145.820433573828
+33
+2549.0746800213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-700.735203605456
+20
+0.0
+30
+1100.8886000213
+11
+-595.634670540536
+21
+-118.479102410621
+31
+1287.75132002131
+12
+-687.270773156591
+22
+-136.706656519425
+32
+1100.8886000213
+13
+-687.270773156591
+23
+-136.706656519425
+33
+1100.8886000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-595.634670540536
+20
+-118.479102410621
+30
+1287.75132002131
+11
+-700.735203605456
+21
+0.0
+31
+1100.8886000213
+12
+-607.303843605455
+22
+0.0
+32
+1287.75132002131
+13
+-607.303843605455
+23
+0.0
+33
+1287.75132002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-646.067882633009
+20
+-267.610079200261
+30
+628.271001705821
+11
+-721.176029454062
+21
+-143.450831316169
+31
+680.911023534629
+12
+-679.332965393238
+22
+-281.388927633011
+32
+680.911023534629
+13
+-679.332965393238
+23
+-281.388927633011
+33
+680.911023534629
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-721.176029454062
+20
+-143.450831316169
+30
+680.911023534629
+11
+-646.067882633009
+21
+-267.610079200261
+31
+628.271001705821
+12
+-685.862005953678
+22
+-136.426435300007
+32
+628.271001705821
+13
+-685.862005953678
+23
+-136.426435300007
+33
+628.271001705821
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+357.792969218307
+20
+-863.788638808576
+30
+1813.40854010679
+11
+509.589579018778
+21
+-762.654700553784
+31
+1773.56823006635
+12
+351.011407030345
+22
+-847.416499400322
+32
+1773.56823006635
+13
+351.011407030345
+23
+-847.416499400322
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+509.589579018778
+20
+-762.654700553784
+30
+1773.56823006635
+11
+357.792969218307
+21
+-863.788638808576
+31
+1813.40854010679
+12
+395.941831606783
+22
+-839.735342877931
+32
+1806.11206435201
+13
+395.941831606783
+23
+-839.735342877931
+33
+1806.11206435201
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+509.589579018778
+20
+-762.654700553784
+30
+1773.56823006635
+11
+395.941831606783
+21
+-839.735342877931
+31
+1806.11206435201
+12
+476.980677127978
+22
+-794.166464272834
+32
+1801.6239424642
+13
+476.980677127978
+23
+-794.166464272834
+33
+1801.6239424642
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+517.019026944331
+20
+-773.773655132591
+30
+1803.63246772228
+11
+509.589579018778
+21
+-762.654700553784
+31
+1773.56823006635
+12
+476.980677127978
+22
+-794.166464272834
+32
+1801.6239424642
+13
+476.980677127978
+23
+-794.166464272834
+33
+1801.6239424642
+70
+2
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+517.019026944331
+20
+-773.773655132591
+30
+1803.63246772228
+11
+648.584509266648
+21
+-648.584509266648
+31
+1773.56823006635
+12
+509.589579018778
+22
+-762.654700553784
+32
+1773.56823006635
+13
+509.589579018778
+23
+-762.654700553784
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+1773.56823006635
+11
+517.019026944331
+21
+-773.773655132591
+31
+1803.63246772228
+12
+549.426368572047
+22
+-748.597588593672
+32
+1806.11210277493
+13
+549.426368572047
+23
+-748.597588593672
+33
+1806.11210277493
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+1773.56823006635
+11
+549.426368572047
+21
+-748.597588593672
+31
+1806.11210277493
+12
+612.093113289132
+22
+-704.779901967179
+32
+1819.40406801073
+13
+612.093113289132
+23
+-704.779901967179
+33
+1819.40406801073
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+1773.56823006635
+11
+612.093113289132
+21
+-704.779901967179
+31
+1819.40406801073
+12
+668.106074549527
+22
+-668.106074549528
+32
+1835.6354447734
+13
+668.106074549527
+23
+-668.106074549528
+33
+1835.6354447734
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+668.106074549527
+20
+-668.106074549528
+30
+1835.6354447734
+11
+612.093113289132
+21
+-704.779901967179
+31
+1819.40406801073
+12
+660.420878380816
+22
+-674.413152048547
+32
+1835.6354447734
+13
+660.420878380816
+23
+-674.413152048547
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+184.330051263378
+20
+-926.689746301964
+30
+1835.6354447734
+11
+351.011407030345
+21
+-847.416499400322
+31
+1773.56823006635
+12
+178.9440635192
+22
+-899.612557411553
+32
+1773.56823006635
+13
+178.9440635192
+23
+-899.612557411553
+33
+1773.56823006635
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+351.011407030345
+20
+-847.416499400322
+30
+1773.56823006635
+11
+184.330051263378
+21
+-926.689746301964
+31
+1835.6354447734
+12
+301.781055330838
+22
+-883.553038965158
+32
+1819.40399142549
+13
+301.781055330838
+23
+-883.553038965158
+33
+1819.40399142549
+70
+15
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+351.011407030345
+20
+-847.416499400322
+30
+1773.56823006635
+11
+301.781055330838
+21
+-883.553038965158
+31
+1819.40399142549
+12
+357.792969218307
+22
+-863.788638808576
+32
+1813.40854010679
+13
+357.792969218307
+23
+-863.788638808576
+33
+1813.40854010679
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+301.781055330838
+20
+-883.553038965158
+30
+1819.40399142549
+11
+184.330051263378
+21
+-926.689746301964
+31
+1835.6354447734
+12
+226.426278474808
+22
+-913.919995384996
+32
+1835.6354447734
+13
+226.426278474808
+23
+-913.919995384996
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+184.330051263378
+20
+-926.689746301964
+30
+1835.6354447734
+11
+199.0652044353
+21
+-923.935662922352
+31
+1840.9889225062
+12
+226.426278474808
+22
+-913.919995384996
+32
+1835.6354447734
+13
+226.426278474808
+23
+-913.919995384996
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+199.0652044353
+20
+-923.935662922352
+30
+1840.9889225062
+11
+184.330051263378
+21
+-926.689746301964
+31
+1835.6354447734
+12
+184.938820049334
+22
+-929.750233661175
+32
+1845.76081205901
+13
+184.938820049334
+23
+-929.750233661175
+33
+1845.76081205901
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-944.844671731792
+30
+1835.6354447734
+11
+104.493637398531
+21
+-940.355693033463
+31
+1854.46446481146
+12
+184.330051263378
+22
+-926.689746301964
+32
+1835.6354447734
+13
+184.330051263378
+23
+-926.689746301964
+33
+1835.6354447734
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637398531
+20
+-940.355693033463
+30
+1854.46446481146
+11
+0.0
+21
+-944.844671731792
+31
+1835.6354447734
+12
+0.0
+22
+-964.850983209364
+32
+1900.55285125842
+13
+0.0
+23
+-964.850983209364
+33
+1900.55285125842
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+184.330051263378
+20
+-926.689746301964
+30
+1835.6354447734
+11
+104.493637398531
+21
+-940.355693033463
+31
+1854.46446481146
+12
+184.938820049334
+22
+-929.750233661175
+32
+1845.76081205901
+13
+184.938820049334
+23
+-929.750233661175
+33
+1845.76081205901
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637398531
+20
+-940.355693033463
+30
+1854.46446481146
+11
+0.0
+21
+-964.850983209364
+31
+1900.55285125842
+12
+104.493633203151
+22
+-954.559258633297
+32
+1900.55285125842
+13
+104.493633203151
+23
+-954.559258633297
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+750.933323308422
+20
+-599.953184983341
+30
+1905.4331697133
+11
+802.244272938819
+21
+-536.042485570819
+31
+1900.55285125842
+12
+746.507157447799
+22
+-603.958357302731
+32
+1900.55285125842
+13
+746.507157447799
+23
+-603.958357302731
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.244272938819
+20
+-536.042485570819
+30
+1900.55285125842
+11
+750.933323308422
+21
+-599.953184983341
+31
+1905.4331697133
+12
+778.074089358318
+22
+-578.368236816208
+32
+1945.81578372641
+13
+778.074089358318
+23
+-578.368236816208
+33
+1945.81578372641
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.244272938819
+20
+-536.042485570819
+30
+1900.55285125842
+11
+778.074089358318
+21
+-578.368236816208
+31
+1945.81578372641
+12
+788.482625178071
+22
+-571.822770804239
+32
+1967.39330582966
+13
+788.482625178071
+23
+-571.822770804239
+33
+1967.39330582966
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.244272938819
+20
+-536.042485570819
+30
+1900.55285125842
+11
+788.482625178071
+21
+-571.822770804239
+31
+1967.39330582966
+12
+812.321046486997
+22
+-542.775570394861
+32
+1967.39330582966
+13
+812.321046486997
+23
+-542.775570394861
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+673.273866809931
+20
+-664.397292109118
+30
+1840.98903680986
+11
+668.106074549527
+21
+-668.106074549528
+31
+1835.6354447734
+12
+668.764073934129
+22
+-668.76407393413
+32
+1838.65494189703
+13
+668.764073934129
+23
+-668.76407393413
+33
+1838.65494189703
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+668.106074549527
+20
+-668.106074549528
+30
+1835.6354447734
+11
+673.273866809931
+21
+-664.397292109118
+31
+1840.98903680986
+12
+785.609632890959
+22
+-524.927574441361
+32
+1835.6354447734
+13
+785.609632890959
+23
+-524.927574441361
+33
+1835.6354447734
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+785.609632890959
+20
+-524.927574441361
+30
+1835.6354447734
+11
+673.273866809931
+21
+-664.397292109118
+31
+1840.98903680986
+12
+713.847499937789
+22
+-629.001642276081
+32
+1870.0375087198
+13
+713.847499937789
+23
+-629.001642276081
+33
+1870.0375087198
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+785.609632890959
+20
+-524.927574441361
+30
+1835.6354447734
+11
+713.847499937789
+21
+-629.001642276081
+31
+1870.0375087198
+12
+746.507157447799
+22
+-603.958357302731
+32
+1900.55285125842
+13
+746.507157447799
+23
+-603.958357302731
+33
+1900.55285125842
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+785.609632890959
+20
+-524.927574441361
+30
+1835.6354447734
+11
+746.507157447799
+21
+-603.958357302731
+31
+1900.55285125842
+12
+802.244272938819
+22
+-536.042485570819
+32
+1900.55285125842
+13
+802.244272938819
+23
+-536.042485570819
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+668.764073934129
+20
+-668.76407393413
+30
+1838.65494189703
+11
+668.106074549527
+21
+-668.106074549528
+31
+1835.6354447734
+12
+660.420878380816
+22
+-674.413152048547
+32
+1835.6354447734
+13
+660.420878380816
+23
+-674.413152048547
+33
+1835.6354447734
+70
+0
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+812.321046486996
+20
+-542.775570394861
+30
+2103.01109421295
+11
+795.733220134071
+21
+-565.076313257107
+31
+2080.77120383654
+12
+788.482669869741
+22
+-571.822716347281
+32
+2103.01109421295
+13
+788.482669869741
+23
+-571.822716347281
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+795.733220134071
+20
+-565.076313257107
+30
+2080.77120383654
+11
+812.321046486996
+21
+-542.775570394861
+31
+2103.01109421295
+12
+802.928322181323
+22
+-560.588161532002
+32
+2035.20233863644
+13
+802.928322181323
+23
+-560.588161532002
+33
+2035.20233863644
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.928322181323
+20
+-560.588161532002
+30
+2035.20233863644
+11
+812.321046486996
+21
+-542.775570394861
+31
+2103.01109421295
+12
+815.696038096871
+22
+-545.030667691736
+32
+2035.2022000213
+13
+815.696038096871
+23
+-545.030667691736
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+795.73325617356
+20
+-565.07629502955
+30
+1989.63346974763
+11
+812.321046486997
+21
+-542.775570394861
+31
+1967.39330582966
+12
+788.482625178071
+22
+-571.822770804239
+32
+1967.39330582966
+13
+788.482625178071
+23
+-571.822770804239
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+812.321046486997
+20
+-542.775570394861
+30
+1967.39330582966
+11
+795.73325617356
+21
+-565.07629502955
+31
+1989.63346974763
+12
+802.928322181323
+22
+-560.588161532002
+32
+2035.20233863644
+13
+802.928322181323
+23
+-560.588161532002
+33
+2035.20233863644
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+812.321046486997
+20
+-542.775570394861
+30
+1967.39330582966
+11
+802.928322181323
+21
+-560.588161532002
+31
+2035.20233863644
+12
+815.696038096871
+22
+-545.030667691736
+32
+2035.2022000213
+13
+815.696038096871
+23
+-545.030667691736
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-976.970215709361
+30
+2103.01109421295
+11
+104.493597769057
+21
+-954.55926212325
+31
+2169.85154878419
+12
+104.493608158504
+22
+-966.678493599977
+32
+2103.01109421295
+13
+104.493608158504
+23
+-966.678493599977
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493597769057
+20
+-954.55926212325
+30
+2169.85154878419
+11
+0.0
+21
+-976.970215709361
+31
+2103.01109421295
+12
+0.0
+22
+-964.850983209363
+32
+2169.85154878419
+13
+0.0
+23
+-964.850983209363
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-964.850983209363
+30
+2169.85154878419
+11
+104.493589835895
+21
+-940.355698951006
+31
+2215.93993123015
+12
+104.493597769057
+22
+-954.55926212325
+32
+2169.85154878419
+13
+104.493597769057
+23
+-954.55926212325
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493589835895
+20
+-940.355698951006
+30
+2215.93993123015
+11
+0.0
+21
+-964.850983209363
+31
+2169.85154878419
+12
+0.0
+22
+-944.844671731792
+32
+2234.76895526921
+13
+0.0
+23
+-944.844671731792
+33
+2234.76895526921
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493589835895
+20
+-940.355698951006
+30
+2215.93993123015
+11
+0.0
+21
+-944.844671731792
+31
+2234.76895526921
+12
+184.938817720617
+22
+-929.750221953924
+32
+2224.64362671606
+13
+184.938817720617
+23
+-929.750221953924
+33
+2224.64362671606
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+184.938817720617
+20
+-929.750221953924
+30
+2224.64362671606
+11
+0.0
+21
+-944.844671731792
+31
+2234.76895526921
+12
+184.330051263378
+22
+-926.689746301964
+32
+2234.76895526921
+13
+184.330051263378
+23
+-926.689746301964
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+184.330051263378
+20
+-926.689746301964
+30
+2234.76895526921
+11
+199.064976889088
+21
+-923.935740607716
+31
+2229.41545051599
+12
+184.938817720617
+22
+-929.750221953924
+32
+2224.64362671606
+13
+184.938817720617
+23
+-929.750221953924
+33
+2224.64362671606
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+199.064976889088
+20
+-923.935740607716
+30
+2229.41545051599
+11
+184.330051263378
+21
+-926.689746301964
+31
+2234.76895526921
+12
+226.426112851944
+22
+-913.920045626142
+32
+2234.76895526921
+13
+226.426112851944
+23
+-913.920045626142
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+178.9440635192
+20
+-899.612557411553
+30
+2296.83616997626
+11
+226.426112851944
+21
+-913.920045626142
+31
+2234.76895526921
+12
+184.330051263378
+22
+-926.689746301964
+32
+2234.76895526921
+13
+184.330051263378
+23
+-926.689746301964
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+226.426112851944
+20
+-913.920045626142
+30
+2234.76895526921
+11
+178.9440635192
+21
+-899.612557411553
+31
+2296.83616997626
+12
+301.780746126529
+22
+-883.553125284517
+32
+2251.00042478027
+13
+301.780746126529
+23
+-883.553125284517
+33
+2251.00042478027
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+301.780746126529
+20
+-883.553125284517
+30
+2251.00042478027
+11
+178.9440635192
+21
+-899.612557411553
+31
+2296.83616997626
+12
+357.792956438195
+22
+-863.788607954656
+32
+2256.9959350164
+13
+357.792956438195
+23
+-863.788607954656
+33
+2256.9959350164
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+357.792956438195
+20
+-863.788607954656
+30
+2256.9959350164
+11
+178.9440635192
+21
+-899.612557411553
+31
+2296.83616997626
+12
+351.011407030345
+22
+-847.416499400322
+32
+2296.83616997626
+13
+351.011407030345
+23
+-847.416499400322
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+351.011407030345
+20
+-847.416499400322
+30
+2296.83616997626
+11
+395.941605262448
+21
+-839.735434514061
+31
+2264.29239416004
+12
+357.792956438195
+22
+-863.788607954656
+32
+2256.9959350164
+13
+357.792956438195
+23
+-863.788607954656
+33
+2256.9959350164
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+395.941605262448
+20
+-839.735434514061
+30
+2264.29239416004
+11
+351.011407030345
+21
+-847.416499400322
+31
+2296.83616997626
+12
+476.980410282499
+22
+-794.166557704225
+32
+2268.78055560144
+13
+476.980410282499
+23
+-794.166557704225
+33
+2268.78055560144
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+476.980410282499
+20
+-794.166557704225
+30
+2268.78055560144
+11
+509.589579018778
+21
+-762.654700553784
+31
+2296.83616997626
+12
+517.019001290372
+22
+-773.773616738727
+32
+2266.77203613245
+13
+517.019001290372
+23
+-773.773616738727
+33
+2266.77203613245
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+509.589579018778
+20
+-762.654700553784
+30
+2296.83616997626
+11
+476.980410282499
+21
+-794.166557704225
+31
+2268.78055560144
+12
+351.011407030345
+22
+-847.416499400322
+32
+2296.83616997626
+13
+351.011407030345
+23
+-847.416499400322
+33
+2296.83616997626
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+612.092889952714
+20
+-704.779988286527
+30
+2251.00050136552
+11
+668.106074549527
+21
+-668.106074549528
+31
+2234.76895526921
+12
+660.421223817861
+22
+-674.412868555691
+32
+2234.76895526921
+13
+660.421223817861
+23
+-674.412868555691
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+668.106074549527
+20
+-668.106074549528
+30
+2234.76895526921
+11
+612.092889952714
+21
+-704.779988286527
+31
+2251.00050136552
+12
+648.584509266648
+22
+-648.584509266648
+32
+2296.83616997626
+13
+648.584509266648
+23
+-648.584509266648
+33
+2296.83616997626
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+2296.83616997626
+11
+612.092889952714
+21
+-704.779988286527
+31
+2251.00050136552
+12
+549.426162494113
+22
+-748.597680229798
+32
+2264.29243258297
+13
+549.426162494113
+23
+-748.597680229798
+33
+2264.29243258297
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+2296.83616997626
+11
+549.426162494113
+21
+-748.597680229798
+31
+2264.29243258297
+12
+517.019001290372
+22
+-773.773616738727
+32
+2266.77203613245
+13
+517.019001290372
+23
+-773.773616738727
+33
+2266.77203613245
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+648.584509266648
+20
+-648.584509266648
+30
+2296.83616997626
+11
+517.019001290372
+21
+-773.773616738727
+31
+2266.77203613245
+12
+509.589579018778
+22
+-762.654700553784
+32
+2296.83616997626
+13
+509.589579018778
+23
+-762.654700553784
+33
+2296.83616997626
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+668.106074549527
+20
+-668.106074549528
+30
+2234.76895526921
+11
+673.273723074262
+21
+-664.397369794469
+31
+2229.41556481967
+12
+668.764043362589
+22
+-668.76404336259
+32
+2231.74959843549
+13
+668.764043362589
+23
+-668.76404336259
+33
+2231.74959843549
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+673.273723074262
+20
+-664.397369794469
+30
+2229.41556481967
+11
+668.106074549527
+21
+-668.106074549528
+31
+2234.76895526921
+12
+785.609632890959
+22
+-524.927574441361
+32
+2234.76895526921
+13
+785.609632890959
+23
+-524.927574441361
+33
+2234.76895526921
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+673.273723074262
+20
+-664.397369794469
+30
+2229.41556481967
+11
+785.609632890959
+21
+-524.927574441361
+31
+2234.76895526921
+12
+713.847355884234
+22
+-629.001708342044
+32
+2200.36711774529
+13
+713.847355884234
+23
+-629.001708342044
+33
+2200.36711774529
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+713.847355884234
+20
+-629.001708342044
+30
+2200.36711774529
+11
+785.609632890959
+21
+-524.927574441361
+31
+2234.76895526921
+12
+746.507278280356
+22
+-603.958210067833
+32
+2169.85154878419
+13
+746.507278280356
+23
+-603.958210067833
+33
+2169.85154878419
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+746.507278280356
+20
+-603.958210067833
+30
+2169.85154878419
+11
+785.609632890959
+21
+-524.927574441361
+31
+2234.76895526921
+12
+802.244272938819
+22
+-536.042485570818
+32
+2169.85154878419
+13
+802.244272938819
+23
+-536.042485570818
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+668.106074549527
+20
+-668.106074549528
+30
+2234.76895526921
+11
+668.764043362589
+21
+-668.76404336259
+31
+2231.74959843549
+12
+660.421223817861
+22
+-674.412868555691
+32
+2234.76895526921
+13
+660.421223817861
+23
+-674.412868555691
+33
+2234.76895526921
+70
+0
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.244272938819
+20
+-536.042485570818
+30
+2169.85154878419
+11
+750.933222864967
+21
+-599.953236891033
+31
+2164.97147813062
+12
+746.507278280356
+22
+-603.958210067833
+32
+2169.85154878419
+13
+746.507278280356
+23
+-603.958210067833
+33
+2169.85154878419
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+750.933222864967
+20
+-599.953236891033
+30
+2164.97147813062
+11
+802.244272938819
+21
+-536.042485570818
+31
+2169.85154878419
+12
+778.073998488686
+22
+-578.368272570852
+32
+2124.58887989382
+13
+778.073998488686
+23
+-578.368272570852
+33
+2124.58887989382
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+778.073998488686
+20
+-578.368272570852
+30
+2124.58887989382
+11
+802.244272938819
+21
+-536.042485570818
+31
+2169.85154878419
+12
+788.482669869741
+22
+-571.822716347281
+32
+2103.01109421295
+13
+788.482669869741
+23
+-571.822716347281
+33
+2103.01109421295
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+788.482669869741
+20
+-571.822716347281
+30
+2103.01109421295
+11
+802.244272938819
+21
+-536.042485570818
+31
+2169.85154878419
+12
+812.321046486996
+22
+-542.775570394861
+32
+2103.01109421295
+13
+812.321046486996
+23
+-542.775570394861
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-976.970215709361
+30
+1967.39330582966
+11
+104.493633203151
+21
+-954.559258633297
+31
+1900.55285125842
+12
+0.0
+22
+-964.850983209364
+32
+1900.55285125842
+13
+0.0
+23
+-964.850983209364
+33
+1900.55285125842
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493633203151
+20
+-954.559258633297
+30
+1900.55285125842
+11
+0.0
+21
+-976.970215709361
+31
+1967.39330582966
+12
+104.493626002977
+22
+-966.678491842449
+32
+1967.39330582966
+13
+104.493626002977
+23
+-966.678491842449
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493585902306
+20
+-599.953270041246
+30
+1905.43308465531
+11
+713.847499937789
+21
+-629.001642276081
+31
+1870.0375087198
+12
+104.493594381804
+22
+-629.001722454268
+32
+1870.03742854153
+13
+104.493594381804
+23
+-629.001722454268
+33
+1870.03742854153
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+713.847499937789
+20
+-629.001642276081
+30
+1870.0375087198
+11
+104.493585902306
+21
+-599.953270041246
+31
+1905.43308465531
+12
+746.507157447799
+22
+-603.958357302731
+32
+1900.55285125842
+13
+746.507157447799
+23
+-603.958357302731
+33
+1900.55285125842
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+746.507157447799
+20
+-603.958357302731
+30
+1900.55285125842
+11
+104.493585902306
+21
+-599.953270041246
+31
+1905.43308465531
+12
+750.933323308422
+22
+-599.953184983341
+32
+1905.4331697133
+13
+750.933323308422
+23
+-599.953184983341
+33
+1905.4331697133
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493577748671
+20
+-578.36832544527
+30
+1945.81569509725
+11
+750.933323308422
+21
+-599.953184983341
+31
+1905.4331697133
+12
+104.493585902306
+22
+-599.953270041246
+32
+1905.43308465531
+13
+104.493585902306
+23
+-599.953270041246
+33
+1905.43308465531
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+750.933323308422
+20
+-599.953184983341
+30
+1905.4331697133
+11
+104.493577748671
+21
+-578.36832544527
+31
+1945.81569509725
+12
+778.074089358318
+22
+-578.368236816208
+32
+1945.81578372641
+13
+778.074089358318
+23
+-578.368236816208
+33
+1945.81578372641
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493551752477
+20
+-664.397444634006
+30
+2229.41548998005
+11
+713.847355884234
+21
+-629.001708342044
+31
+2200.36711774529
+12
+104.493550917322
+22
+-629.00178852022
+32
+2200.36703756703
+13
+104.493550917322
+23
+-629.00178852022
+33
+2200.36703756703
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+713.847355884234
+20
+-629.001708342044
+30
+2200.36711774529
+11
+104.493551752477
+21
+-664.397444634006
+31
+2229.41548998005
+12
+673.273723074262
+22
+-664.397369794469
+32
+2229.41556481967
+13
+673.273723074262
+23
+-664.397369794469
+33
+2229.41556481967
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493585902279
+20
+-923.935753051327
+30
+2229.41543807237
+11
+301.780746126529
+21
+-883.553125284517
+31
+2251.00042478027
+12
+104.493577748645
+22
+-883.553151243369
+32
+2251.0003988214
+13
+104.493577748645
+23
+-883.553151243369
+33
+2251.0003988214
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+301.780746126529
+20
+-883.553125284517
+30
+2251.00042478027
+11
+104.493585902279
+21
+-923.935753051327
+31
+2229.41543807237
+12
+199.064976889088
+22
+-923.935740607716
+32
+2229.41545051599
+13
+199.064976889088
+23
+-923.935740607716
+33
+2229.41545051599
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+301.780746126529
+20
+-883.553125284517
+30
+2251.00042478027
+11
+199.064976889088
+21
+-923.935740607716
+31
+2229.41545051599
+12
+226.426112851944
+22
+-913.920045626142
+32
+2234.76895526921
+13
+226.426112851944
+23
+-913.920045626142
+33
+2234.76895526921
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+476.980677127978
+20
+-794.166464272834
+30
+1801.6239424642
+11
+104.493630521182
+21
+-839.735381226399
+31
+1806.1120260035
+12
+104.49362511582
+22
+-794.166513284314
+32
+1801.62389345267
+13
+104.49362511582
+23
+-794.166513284314
+33
+1801.62389345267
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493630521182
+20
+-839.735381226399
+30
+1806.1120260035
+11
+476.980677127978
+21
+-794.166464272834
+31
+1801.6239424642
+12
+395.941831606783
+22
+-839.735342877931
+32
+1806.11206435201
+13
+395.941831606783
+23
+-839.735342877931
+33
+1806.11206435201
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+395.941831606783
+20
+-839.735342877931
+30
+1806.11206435201
+11
+104.493634537727
+21
+-883.553064924044
+31
+1819.40396546658
+12
+104.493630521182
+22
+-839.735381226399
+32
+1806.1120260035
+13
+104.493630521182
+23
+-839.735381226399
+33
+1806.1120260035
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493634537727
+20
+-883.553064924044
+30
+1819.40396546658
+11
+395.941831606783
+21
+-839.735342877931
+31
+1806.11206435201
+12
+301.781055330838
+22
+-883.553038965158
+32
+1819.40399142549
+13
+301.781055330838
+23
+-883.553038965158
+33
+1819.40399142549
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+301.781055330838
+20
+-883.553038965158
+30
+1819.40399142549
+11
+395.941831606783
+21
+-839.735342877931
+31
+1806.11206435201
+12
+357.792969218307
+22
+-863.788638808576
+32
+1813.40854010679
+13
+357.792969218307
+23
+-863.788638808576
+33
+1813.40854010679
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+301.781055330838
+20
+-883.553038965158
+30
+1819.40399142549
+11
+104.493637011103
+21
+-923.935675365986
+31
+1840.98891006256
+12
+104.493634537727
+22
+-883.553064924044
+32
+1819.40396546658
+13
+104.493634537727
+23
+-883.553064924044
+33
+1819.40396546658
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637011103
+20
+-923.935675365986
+30
+1840.98891006256
+11
+301.781055330838
+21
+-883.553038965158
+31
+1819.40399142549
+12
+199.0652044353
+22
+-923.935662922352
+32
+1840.9889225062
+13
+199.0652044353
+23
+-923.935662922352
+33
+1840.9889225062
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+199.0652044353
+20
+-923.935662922352
+30
+1840.9889225062
+11
+301.781055330838
+21
+-883.553038965158
+31
+1819.40399142549
+12
+226.426278474808
+22
+-913.919995384996
+32
+1835.6354447734
+13
+226.426278474808
+23
+-913.919995384996
+33
+1835.6354447734
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+713.847499937789
+20
+-629.001642276081
+30
+1870.0375087198
+11
+104.4936028613
+21
+-664.397366948665
+31
+1840.98896197024
+12
+104.493594381804
+22
+-629.001722454268
+32
+1870.03742854153
+13
+104.493594381804
+23
+-629.001722454268
+33
+1870.03742854153
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.4936028613
+20
+-664.397366948665
+30
+1840.98896197024
+11
+713.847499937789
+21
+-629.001642276081
+31
+1870.0375087198
+12
+673.273866809931
+22
+-664.397292109118
+32
+1840.98903680986
+13
+673.273866809931
+23
+-664.397292109118
+33
+1840.98903680986
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+673.273866809931
+20
+-664.397292109118
+30
+1840.98903680986
+11
+104.493611014934
+21
+-704.779968756623
+31
+1819.40400122121
+12
+104.4936028613
+22
+-664.397366948665
+32
+1840.98896197024
+13
+104.4936028613
+23
+-664.397366948665
+33
+1840.98896197024
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+673.273866809931
+21
+-664.397292109118
+31
+1840.98903680986
+12
+612.093113289132
+22
+-704.779901967179
+32
+1819.40406801073
+13
+612.093113289132
+23
+-704.779901967179
+33
+1819.40406801073
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+612.093113289132
+20
+-704.779901967179
+30
+1819.40406801073
+11
+673.273866809931
+21
+-664.397292109118
+31
+1840.98903680986
+12
+660.420878380816
+22
+-674.413152048547
+32
+1835.6354447734
+13
+660.420878380816
+23
+-674.413152048547
+33
+1835.6354447734
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+660.420878380816
+20
+-674.413152048547
+30
+1835.6354447734
+11
+673.273866809931
+21
+-664.397292109118
+31
+1840.98903680986
+12
+668.764073934129
+22
+-668.76407393413
+32
+1838.65494189703
+13
+668.764073934129
+23
+-668.76407393413
+33
+1838.65494189703
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+612.093113289132
+20
+-704.779901967179
+30
+1819.40406801073
+11
+104.493618529366
+21
+-748.597647137485
+31
+1806.11204423105
+12
+104.493611014934
+22
+-704.779968756623
+32
+1819.40400122121
+13
+104.493611014934
+23
+-704.779968756623
+33
+1819.40400122121
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493618529366
+20
+-748.597647137485
+30
+1806.11204423105
+11
+612.093113289132
+21
+-704.779901967179
+31
+1819.40406801073
+12
+549.426368572047
+22
+-748.597588593672
+32
+1806.11210277493
+13
+549.426368572047
+23
+-748.597588593672
+33
+1806.11210277493
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493558242398
+20
+-748.597738773593
+30
+2264.29237403911
+11
+612.092889952714
+21
+-704.779988286527
+31
+2251.00050136552
+12
+104.493554225852
+22
+-704.780055075949
+32
+2251.00043457603
+13
+104.493554225852
+23
+-704.780055075949
+33
+2251.00043457603
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+612.092889952714
+20
+-704.779988286527
+30
+2251.00050136552
+11
+104.493558242398
+21
+-748.597738773593
+31
+2264.29237403911
+12
+549.426162494113
+22
+-748.597680229798
+32
+2264.29243258297
+13
+549.426162494113
+23
+-748.597680229798
+33
+2264.29243258297
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493550917322
+20
+-629.00178852022
+30
+2200.36703756703
+11
+750.933222864967
+21
+-599.953236891033
+31
+2164.97147813062
+12
+104.493551752482
+22
+-599.953321948931
+32
+2164.97139307263
+13
+104.493551752482
+23
+-599.953321948931
+33
+2164.97139307263
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+750.933222864967
+20
+-599.953236891033
+30
+2164.97147813062
+11
+104.493550917322
+21
+-629.00178852022
+31
+2200.36703756703
+12
+746.507278280356
+22
+-603.958210067833
+32
+2169.85154878419
+13
+746.507278280356
+23
+-603.958210067833
+33
+2169.85154878419
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+746.507278280356
+20
+-603.958210067833
+30
+2169.85154878419
+11
+104.493550917322
+21
+-629.00178852022
+31
+2200.36703756703
+12
+713.847355884234
+22
+-629.001708342044
+32
+2200.36711774529
+13
+713.847355884234
+23
+-629.001708342044
+33
+2200.36711774529
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493551752482
+20
+-599.953321948931
+30
+2164.97139307263
+11
+778.073998488686
+21
+-578.368272570852
+31
+2124.58887989382
+12
+104.493554225863
+22
+-578.368361199906
+32
+2124.58879126467
+13
+104.493554225863
+23
+-578.368361199906
+33
+2124.58879126467
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+778.073998488686
+20
+-578.368272570852
+30
+2124.58887989382
+11
+104.493551752482
+21
+-599.953321948931
+31
+2164.97139307263
+12
+750.933222864967
+22
+-599.953236891033
+32
+2164.97147813062
+13
+750.933222864967
+23
+-599.953236891033
+33
+2164.97147813062
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493554225863
+20
+-578.368361199906
+30
+2124.58879126467
+11
+795.733220134071
+21
+-565.076313257107
+31
+2080.77120383654
+12
+104.493558242413
+22
+-565.076404209743
+32
+2080.77111288381
+13
+104.493558242413
+23
+-565.076404209743
+33
+2080.77111288381
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+795.733220134071
+20
+-565.076313257107
+30
+2080.77120383654
+11
+104.493554225863
+21
+-578.368361199906
+31
+2124.58879126467
+12
+788.482669869741
+22
+-571.822716347281
+32
+2103.01109421295
+13
+788.482669869741
+23
+-571.822716347281
+33
+2103.01109421295
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+788.482669869741
+20
+-571.822716347281
+30
+2103.01109421295
+11
+104.493554225863
+21
+-578.368361199906
+31
+2124.58879126467
+12
+778.073998488686
+22
+-578.368272570852
+32
+2124.58887989382
+13
+778.073998488686
+23
+-578.368272570852
+33
+2124.58887989382
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493558242413
+20
+-565.076404209743
+30
+2080.77111288381
+11
+802.928322181323
+21
+-560.588161532002
+31
+2035.20233863644
+12
+104.49356364778
+22
+-560.588253431361
+32
+2035.20224673698
+13
+104.49356364778
+23
+-560.588253431361
+33
+2035.20224673698
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+802.928322181323
+20
+-560.588161532002
+30
+2035.20233863644
+11
+104.493558242413
+21
+-565.076404209743
+31
+2080.77111288381
+12
+795.733220134071
+22
+-565.076313257107
+32
+2080.77120383654
+13
+795.733220134071
+23
+-565.076313257107
+33
+2080.77120383654
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.49356364778
+20
+-560.588253431361
+30
+2035.20224673698
+11
+795.73325617356
+21
+-565.07629502955
+31
+1989.63346974763
+12
+104.493570234237
+22
+-565.076385982188
+32
+1989.6333787949
+13
+104.493570234237
+23
+-565.076385982188
+33
+1989.6333787949
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+795.73325617356
+20
+-565.07629502955
+30
+1989.63346974763
+11
+104.49356364778
+21
+-560.588253431361
+31
+2035.20224673698
+12
+802.928322181323
+22
+-560.588161532002
+32
+2035.20233863644
+13
+802.928322181323
+23
+-560.588161532002
+33
+2035.20233863644
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493570234237
+20
+-565.076385982188
+30
+1989.6333787949
+11
+778.074089358318
+21
+-578.368236816208
+31
+1945.81578372641
+12
+104.493577748671
+22
+-578.36832544527
+32
+1945.81569509725
+13
+104.493577748671
+23
+-578.36832544527
+33
+1945.81569509725
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+778.074089358318
+20
+-578.368236816208
+30
+1945.81578372641
+11
+104.493570234237
+21
+-565.076385982188
+31
+1989.6333787949
+12
+788.482625178071
+22
+-571.822770804239
+32
+1967.39330582966
+13
+788.482625178071
+23
+-571.822770804239
+33
+1967.39330582966
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+788.482625178071
+20
+-571.822770804239
+30
+1967.39330582966
+11
+104.493570234237
+21
+-565.076385982188
+31
+1989.6333787949
+12
+795.73325617356
+22
+-565.07629502955
+32
+1989.63346974763
+13
+795.73325617356
+23
+-565.07629502955
+33
+1989.63346974763
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493570234214
+20
+-839.735472862507
+30
+2264.29235581156
+11
+476.980410282499
+21
+-794.166557704225
+31
+2268.78055560144
+12
+104.49356364776
+22
+-794.166606715679
+32
+2268.78050658994
+13
+104.49356364776
+23
+-794.166606715679
+33
+2268.78050658994
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+476.980410282499
+20
+-794.166557704225
+30
+2268.78055560144
+11
+104.493570234214
+21
+-839.735472862507
+31
+2264.29235581156
+12
+395.941605262448
+22
+-839.735434514061
+32
+2264.29239416004
+13
+395.941605262448
+23
+-839.735434514061
+33
+2264.29239416004
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.49356364776
+20
+-794.166606715679
+30
+2268.78050658994
+11
+549.426162494113
+21
+-748.597680229798
+31
+2264.29243258297
+12
+104.493558242398
+22
+-748.597738773593
+32
+2264.29237403911
+13
+104.493558242398
+23
+-748.597738773593
+33
+2264.29237403911
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+549.426162494113
+20
+-748.597680229798
+30
+2264.29243258297
+11
+104.49356364776
+21
+-794.166606715679
+31
+2268.78050658994
+12
+476.980410282499
+22
+-794.166557704225
+32
+2268.78055560144
+13
+476.980410282499
+23
+-794.166557704225
+33
+2268.78055560144
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+549.426162494113
+20
+-748.597680229798
+30
+2264.29243258297
+11
+476.980410282499
+21
+-794.166557704225
+31
+2268.78055560144
+12
+517.019001290372
+22
+-773.773616738727
+32
+2266.77203613245
+13
+517.019001290372
+23
+-773.773616738727
+33
+2266.77203613245
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493589835895
+20
+-940.355698951006
+30
+2215.93993123015
+11
+199.064976889088
+21
+-923.935740607716
+31
+2229.41545051599
+12
+104.493585902279
+22
+-923.935753051327
+32
+2229.41543807237
+13
+104.493585902279
+23
+-923.935753051327
+33
+2229.41543807237
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+199.064976889088
+20
+-923.935740607716
+30
+2229.41545051599
+11
+104.493589835895
+21
+-940.355698951006
+31
+2215.93993123015
+12
+184.938817720617
+22
+-929.750221953924
+32
+2224.64362671606
+13
+184.938817720617
+23
+-929.750221953924
+33
+2224.64362671606
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+104.493626002977
+21
+-966.678491842449
+31
+1967.39330582966
+12
+104.493617614829
+22
+-970.737560564704
+32
+2035.2022000213
+13
+104.493617614829
+23
+-970.737560564704
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493626002977
+20
+-966.678491842449
+30
+1967.39330582966
+11
+104.493608158504
+21
+-966.678493599977
+31
+2103.01109421295
+12
+104.493597769057
+22
+-954.55926212325
+32
+2169.85154878419
+13
+104.493597769057
+23
+-954.55926212325
+33
+2169.85154878419
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493626002977
+20
+-966.678491842449
+30
+1967.39330582966
+11
+104.493597769057
+21
+-954.55926212325
+31
+2169.85154878419
+12
+104.493633203151
+22
+-954.559258633297
+32
+1900.55285125842
+13
+104.493633203151
+23
+-954.559258633297
+33
+1900.55285125842
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493633203151
+20
+-954.559258633297
+30
+1900.55285125842
+11
+104.493597769057
+21
+-954.55926212325
+31
+2169.85154878419
+12
+104.493589835895
+22
+-940.355698951006
+32
+2215.93993123015
+13
+104.493589835895
+23
+-940.355698951006
+33
+2215.93993123015
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493633203151
+20
+-954.559258633297
+30
+1900.55285125842
+11
+104.493589835895
+21
+-940.355698951006
+31
+2215.93993123015
+12
+104.493637398531
+22
+-940.355693033463
+32
+1854.46446481146
+13
+104.493637398531
+23
+-940.355693033463
+33
+1854.46446481146
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637398531
+20
+-940.355693033463
+30
+1854.46446481146
+11
+104.493589835895
+21
+-940.355698951006
+31
+2215.93993123015
+12
+104.493585902279
+22
+-923.935753051327
+32
+2229.41543807237
+13
+104.493585902279
+23
+-923.935753051327
+33
+2229.41543807237
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637398531
+20
+-940.355693033463
+30
+1854.46446481146
+11
+104.493585902279
+21
+-923.935753051327
+31
+2229.41543807237
+12
+104.493637011103
+22
+-923.935675365986
+32
+1840.98891006256
+13
+104.493637011103
+23
+-923.935675365986
+33
+1840.98891006256
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637011103
+20
+-923.935675365986
+30
+1840.98891006256
+11
+104.493585902279
+21
+-923.935753051327
+31
+2229.41543807237
+12
+104.493577748645
+22
+-883.553151243369
+32
+2251.0003988214
+13
+104.493577748645
+23
+-883.553151243369
+33
+2251.0003988214
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637011103
+20
+-923.935675365986
+30
+1840.98891006256
+11
+104.493577748645
+21
+-883.553151243369
+31
+2251.0003988214
+12
+104.493634537727
+22
+-883.553064924044
+32
+1819.40396546658
+13
+104.493634537727
+23
+-883.553064924044
+33
+1819.40396546658
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493634537727
+20
+-883.553064924044
+30
+1819.40396546658
+11
+104.493577748645
+21
+-883.553151243369
+31
+2251.0003988214
+12
+104.493606060716
+22
+-882.926351999993
+32
+2035.2022000213
+13
+104.493606060716
+23
+-882.926351999993
+33
+2035.2022000213
+70
+15
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493606060716
+20
+-882.926351999993
+30
+2035.2022000213
+11
+104.493577748645
+21
+-883.553151243369
+31
+2251.0003988214
+12
+104.493603557861
+22
+-881.220857485246
+32
+2052.51837642467
+13
+104.493603557861
+23
+-881.220857485246
+33
+2052.51837642467
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493603557861
+20
+-881.220857485246
+30
+2052.51837642467
+11
+104.493577748645
+21
+-883.553151243369
+31
+2251.0003988214
+12
+104.493570234214
+22
+-839.735472862507
+32
+2264.29235581156
+13
+104.493570234214
+23
+-839.735472862507
+33
+2264.29235581156
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493603557861
+20
+-881.220857485246
+30
+2052.51837642467
+11
+104.493570234214
+21
+-839.735472862507
+31
+2264.29235581156
+12
+104.493600702375
+22
+-876.169915138753
+32
+2069.16910187987
+13
+104.493600702375
+23
+-876.169915138753
+33
+2069.16910187987
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493600702375
+20
+-876.169915138753
+30
+2069.16910187987
+11
+104.493570234214
+21
+-839.735472862507
+31
+2264.29235581156
+12
+104.493597603992
+22
+-867.967629842289
+32
+2084.51449834551
+13
+104.493597603992
+23
+-867.967629842289
+33
+2084.51449834551
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493597603992
+20
+-867.967629842289
+30
+2084.51449834551
+11
+104.493570234214
+21
+-839.735472862507
+31
+2264.29235581156
+12
+104.493594381781
+22
+-856.929210819903
+32
+2097.96485084121
+13
+104.493594381781
+23
+-856.929210819903
+33
+2097.96485084121
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493594381781
+20
+-856.929210819903
+30
+2097.96485084121
+11
+104.493570234214
+21
+-839.735472862507
+31
+2264.29235581156
+12
+104.493591159571
+22
+-843.478858324207
+32
+2109.0032698636
+13
+104.493591159571
+23
+-843.478858324207
+33
+2109.0032698636
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493591159571
+20
+-843.478858324207
+30
+2109.0032698636
+11
+104.493570234214
+21
+-839.735472862507
+31
+2264.29235581156
+12
+104.493588061189
+22
+-828.133461858568
+32
+2117.20555516006
+13
+104.493588061189
+23
+-828.133461858568
+33
+2117.20555516006
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493588061189
+20
+-828.133461858568
+30
+2117.20555516006
+11
+104.493570234214
+21
+-839.735472862507
+31
+2264.29235581156
+12
+104.49356364776
+22
+-794.166606715679
+32
+2268.78050658994
+13
+104.49356364776
+23
+-794.166606715679
+33
+2268.78050658994
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493588061189
+20
+-828.133461858568
+30
+2117.20555516006
+11
+104.49356364776
+21
+-794.166606715679
+31
+2268.78050658994
+12
+104.493585205705
+22
+-811.482736403362
+32
+2122.25649750655
+13
+104.493585205705
+23
+-811.482736403362
+33
+2122.25649750655
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493585205705
+20
+-811.482736403362
+30
+2122.25649750655
+11
+104.49356364776
+21
+-794.166606715679
+31
+2268.78050658994
+12
+104.493582702852
+22
+-794.166559999998
+32
+2123.9619920213
+13
+104.493582702852
+23
+-794.166559999998
+33
+2123.9619920213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493582702852
+20
+-794.166559999998
+30
+2123.9619920213
+11
+104.49356364776
+21
+-794.166606715679
+31
+2268.78050658994
+12
+104.493558242398
+22
+-748.597738773593
+32
+2264.29237403911
+13
+104.493558242398
+23
+-748.597738773593
+33
+2264.29237403911
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493582702852
+20
+-794.166559999998
+30
+2123.9619920213
+11
+104.493558242398
+21
+-748.597738773593
+31
+2264.29237403911
+12
+104.493580648814
+22
+-776.850383596634
+32
+2122.25649750655
+13
+104.493580648814
+23
+-776.850383596634
+33
+2122.25649750655
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493580648814
+20
+-776.850383596634
+30
+2122.25649750655
+11
+104.493558242398
+21
+-748.597738773593
+31
+2264.29237403911
+12
+104.493579122526
+22
+-760.199658141427
+32
+2117.20555516006
+13
+104.493579122526
+23
+-760.199658141427
+33
+2117.20555516006
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493579122526
+20
+-760.199658141427
+30
+2117.20555516006
+11
+104.493558242398
+21
+-748.597738773593
+31
+2264.29237403911
+12
+104.493578182644
+22
+-744.854261675788
+32
+2109.0032698636
+13
+104.493578182644
+23
+-744.854261675788
+33
+2109.0032698636
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493578182644
+20
+-744.854261675788
+30
+2109.0032698636
+11
+104.493558242398
+21
+-748.597738773593
+31
+2264.29237403911
+12
+104.493554225852
+22
+-704.780055075949
+32
+2251.00043457603
+13
+104.493554225852
+23
+-704.780055075949
+33
+2251.00043457603
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493578182644
+20
+-744.854261675788
+30
+2109.0032698636
+11
+104.493554225852
+21
+-704.780055075949
+31
+2251.00043457603
+12
+104.493577865285
+22
+-731.403909180092
+32
+2097.96485084121
+13
+104.493577865285
+23
+-731.403909180092
+33
+2097.96485084121
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493577865285
+20
+-731.403909180092
+30
+2097.96485084121
+11
+104.493554225852
+21
+-704.780055075949
+31
+2251.00043457603
+12
+104.493578182647
+22
+-720.365490157705
+32
+2084.51449834551
+13
+104.493578182647
+23
+-720.365490157705
+33
+2084.51449834551
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493578182647
+20
+-720.365490157705
+30
+2084.51449834551
+11
+104.493554225852
+21
+-704.780055075949
+31
+2251.00043457603
+12
+104.493579122533
+22
+-712.163204861241
+32
+2069.16910187987
+13
+104.493579122533
+23
+-712.163204861241
+33
+2069.16910187987
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493579122533
+20
+-712.163204861241
+30
+2069.16910187987
+11
+104.493554225852
+21
+-704.780055075949
+31
+2251.00043457603
+12
+104.493580648823
+22
+-707.112262514747
+32
+2052.51837642467
+13
+104.493580648823
+23
+-707.112262514747
+33
+2052.51837642467
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493580648823
+20
+-707.112262514747
+30
+2052.51837642467
+11
+104.493554225852
+21
+-704.780055075949
+31
+2251.00043457603
+12
+104.493582702864
+22
+-705.406767999999
+32
+2035.2022000213
+13
+104.493582702864
+23
+-705.406767999999
+33
+2035.2022000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493634537727
+20
+-883.553064924044
+30
+1819.40396546658
+11
+104.493608114757
+21
+-881.220857485245
+31
+2017.88602361794
+12
+104.493630521182
+22
+-839.735381226399
+32
+1806.1120260035
+13
+104.493630521182
+23
+-839.735381226399
+33
+1806.1120260035
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608114757
+20
+-881.220857485245
+30
+2017.88602361794
+11
+104.493634537727
+21
+-883.553064924044
+31
+1819.40396546658
+12
+104.493606060716
+22
+-882.926351999993
+32
+2035.2022000213
+13
+104.493606060716
+23
+-882.926351999993
+33
+2035.2022000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493630521182
+20
+-839.735381226399
+30
+1806.1120260035
+11
+104.493608114757
+21
+-881.220857485245
+31
+2017.88602361794
+12
+104.493609641047
+22
+-876.169915138752
+32
+2001.23529816273
+13
+104.493609641047
+23
+-876.169915138752
+33
+2001.23529816273
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493630521182
+20
+-839.735381226399
+30
+1806.1120260035
+11
+104.493609641047
+21
+-876.169915138752
+31
+2001.23529816273
+12
+104.493610580933
+22
+-867.967629842287
+32
+1985.88990169709
+13
+104.493610580933
+23
+-867.967629842287
+33
+1985.88990169709
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493630521182
+20
+-839.735381226399
+30
+1806.1120260035
+11
+104.493610580933
+21
+-867.967629842287
+31
+1985.88990169709
+12
+104.493610898294
+22
+-856.9292108199
+32
+1972.4395492014
+13
+104.493610898294
+23
+-856.9292108199
+33
+1972.4395492014
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493630521182
+20
+-839.735381226399
+30
+1806.1120260035
+11
+104.493610898294
+21
+-856.9292108199
+31
+1972.4395492014
+12
+104.493610580936
+22
+-843.478858324204
+32
+1961.40113017901
+13
+104.493610580936
+23
+-843.478858324204
+33
+1961.40113017901
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493630521182
+20
+-839.735381226399
+30
+1806.1120260035
+11
+104.493610580936
+21
+-843.478858324204
+31
+1961.40113017901
+12
+104.493609641054
+22
+-828.133461858565
+32
+1953.19884488255
+13
+104.493609641054
+23
+-828.133461858565
+33
+1953.19884488255
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493630521182
+20
+-839.735381226399
+30
+1806.1120260035
+11
+104.493609641054
+21
+-828.133461858565
+31
+1953.19884488255
+12
+104.49362511582
+22
+-794.166513284314
+32
+1801.62389345267
+13
+104.49362511582
+23
+-794.166513284314
+33
+1801.62389345267
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.49362511582
+20
+-794.166513284314
+30
+1801.62389345267
+11
+104.493609641054
+21
+-828.133461858565
+31
+1953.19884488255
+12
+104.493608114766
+22
+-811.482736403359
+32
+1948.14790253605
+13
+104.493608114766
+23
+-811.482736403359
+33
+1948.14790253605
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.49362511582
+20
+-794.166513284314
+30
+1801.62389345267
+11
+104.493608114766
+21
+-811.482736403359
+31
+1948.14790253605
+12
+104.493606060728
+22
+-794.166559999995
+32
+1946.44240802131
+13
+104.493606060728
+23
+-794.166559999995
+33
+1946.44240802131
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.49362511582
+20
+-794.166513284314
+30
+1801.62389345267
+11
+104.493606060728
+21
+-794.166559999995
+31
+1946.44240802131
+12
+104.493603557875
+22
+-776.850383596631
+32
+1948.14790253605
+13
+104.493603557875
+23
+-776.850383596631
+33
+1948.14790253605
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.49362511582
+20
+-794.166513284314
+30
+1801.62389345267
+11
+104.493603557875
+21
+-776.850383596631
+31
+1948.14790253605
+12
+104.493618529366
+22
+-748.597647137485
+32
+1806.11204423105
+13
+104.493618529366
+23
+-748.597647137485
+33
+1806.11204423105
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493618529366
+20
+-748.597647137485
+30
+1806.11204423105
+11
+104.493603557875
+21
+-776.850383596631
+31
+1948.14790253605
+12
+104.49360070239
+22
+-760.199658141424
+32
+1953.19884488255
+13
+104.49360070239
+23
+-760.199658141424
+33
+1953.19884488255
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493618529366
+20
+-748.597647137485
+30
+1806.11204423105
+11
+104.49360070239
+21
+-760.199658141424
+31
+1953.19884488255
+12
+104.493597604008
+22
+-744.854261675785
+32
+1961.40113017901
+13
+104.493597604008
+23
+-744.854261675785
+33
+1961.40113017901
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493618529366
+20
+-748.597647137485
+30
+1806.11204423105
+11
+104.493597604008
+21
+-744.854261675785
+31
+1961.40113017901
+12
+104.493611014934
+22
+-704.779968756623
+32
+1819.40400122121
+13
+104.493611014934
+23
+-704.779968756623
+33
+1819.40400122121
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493597604008
+21
+-744.854261675785
+31
+1961.40113017901
+12
+104.493594381798
+22
+-731.40390918009
+32
+1972.4395492014
+13
+104.493594381798
+23
+-731.40390918009
+33
+1972.4395492014
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493594381798
+21
+-731.40390918009
+31
+1972.4395492014
+12
+104.493591159588
+22
+-720.365490157703
+32
+1985.88990169709
+13
+104.493591159588
+23
+-720.365490157703
+33
+1985.88990169709
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493591159588
+21
+-720.365490157703
+31
+1985.88990169709
+12
+104.493588061205
+22
+-712.163204861239
+32
+2001.23529816273
+13
+104.493588061205
+23
+-712.163204861239
+33
+2001.23529816273
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493588061205
+21
+-712.163204861239
+31
+2001.23529816273
+12
+104.493585205719
+22
+-707.112262514746
+32
+2017.88602361794
+13
+104.493585205719
+23
+-707.112262514746
+33
+2017.88602361794
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493585205719
+21
+-707.112262514746
+31
+2017.88602361794
+12
+104.493582702864
+22
+-705.406767999999
+32
+2035.2022000213
+13
+104.493582702864
+23
+-705.406767999999
+33
+2035.2022000213
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493582702864
+21
+-705.406767999999
+31
+2035.2022000213
+12
+104.493554225852
+22
+-704.780055075949
+32
+2251.00043457603
+13
+104.493554225852
+23
+-704.780055075949
+33
+2251.00043457603
+70
+15
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493554225852
+21
+-704.780055075949
+31
+2251.00043457603
+12
+104.493551752477
+22
+-664.397444634006
+32
+2229.41548998005
+13
+104.493551752477
+23
+-664.397444634006
+33
+2229.41548998005
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493611014934
+20
+-704.779968756623
+30
+1819.40400122121
+11
+104.493551752477
+21
+-664.397444634006
+31
+2229.41548998005
+12
+104.4936028613
+22
+-664.397366948665
+32
+1840.98896197024
+13
+104.4936028613
+23
+-664.397366948665
+33
+1840.98896197024
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.4936028613
+20
+-664.397366948665
+30
+1840.98896197024
+11
+104.493551752477
+21
+-664.397444634006
+31
+2229.41548998005
+12
+104.493550917322
+22
+-629.00178852022
+32
+2200.36703756703
+13
+104.493550917322
+23
+-629.00178852022
+33
+2200.36703756703
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.4936028613
+20
+-664.397366948665
+30
+1840.98896197024
+11
+104.493550917322
+21
+-629.00178852022
+31
+2200.36703756703
+12
+104.493594381804
+22
+-629.001722454268
+32
+1870.03742854153
+13
+104.493594381804
+23
+-629.001722454268
+33
+1870.03742854153
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493594381804
+20
+-629.001722454268
+30
+1870.03742854153
+11
+104.493550917322
+21
+-629.00178852022
+31
+2200.36703756703
+12
+104.493551752482
+22
+-599.953321948931
+32
+2164.97139307263
+13
+104.493551752482
+23
+-599.953321948931
+33
+2164.97139307263
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493594381804
+20
+-629.001722454268
+30
+1870.03742854153
+11
+104.493551752482
+21
+-599.953321948931
+31
+2164.97139307263
+12
+104.493585902306
+22
+-599.953270041246
+32
+1905.43308465531
+13
+104.493585902306
+23
+-599.953270041246
+33
+1905.43308465531
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493585902306
+20
+-599.953270041246
+30
+1905.43308465531
+11
+104.493551752482
+21
+-599.953321948931
+31
+2164.97139307263
+12
+104.493554225863
+22
+-578.368361199906
+32
+2124.58879126467
+13
+104.493554225863
+23
+-578.368361199906
+33
+2124.58879126467
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493585902306
+20
+-599.953270041246
+30
+1905.43308465531
+11
+104.493554225863
+21
+-578.368361199906
+31
+2124.58879126467
+12
+104.493577748671
+22
+-578.36832544527
+32
+1945.81569509725
+13
+104.493577748671
+23
+-578.36832544527
+33
+1945.81569509725
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493577748671
+20
+-578.36832544527
+30
+1945.81569509725
+11
+104.493554225863
+21
+-578.368361199906
+31
+2124.58879126467
+12
+104.493558242413
+22
+-565.076404209743
+32
+2080.77111288381
+13
+104.493558242413
+23
+-565.076404209743
+33
+2080.77111288381
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493577748671
+20
+-578.36832544527
+30
+1945.81569509725
+11
+104.493558242413
+21
+-565.076404209743
+31
+2080.77111288381
+12
+104.493570234237
+22
+-565.076385982188
+32
+1989.6333787949
+13
+104.493570234237
+23
+-565.076385982188
+33
+1989.6333787949
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493570234237
+20
+-565.076385982188
+30
+1989.6333787949
+11
+104.493558242413
+21
+-565.076404209743
+31
+2080.77111288381
+12
+104.49356364778
+22
+-560.588253431361
+32
+2035.20224673698
+13
+104.49356364778
+23
+-560.588253431361
+33
+2035.20224673698
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+199.0652044353
+20
+-923.935662922352
+30
+1840.9889225062
+11
+104.493637398531
+21
+-940.355693033463
+31
+1854.46446481146
+12
+104.493637011103
+22
+-923.935675365986
+32
+1840.98891006256
+13
+104.493637011103
+23
+-923.935675365986
+33
+1840.98891006256
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493637398531
+20
+-940.355693033463
+30
+1854.46446481146
+11
+199.0652044353
+21
+-923.935662922352
+31
+1840.9889225062
+12
+184.938820049334
+22
+-929.750233661175
+32
+1845.76081205901
+13
+184.938820049334
+23
+-929.750233661175
+33
+1845.76081205901
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493577748645
+20
+-883.553151243369
+30
+2251.0003988214
+11
+395.941605262448
+21
+-839.735434514061
+31
+2264.29239416004
+12
+104.493570234214
+22
+-839.735472862507
+32
+2264.29235581156
+13
+104.493570234214
+23
+-839.735472862507
+33
+2264.29235581156
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+395.941605262448
+20
+-839.735434514061
+30
+2264.29239416004
+11
+104.493577748645
+21
+-883.553151243369
+31
+2251.0003988214
+12
+301.780746126529
+22
+-883.553125284517
+32
+2251.00042478027
+13
+301.780746126529
+23
+-883.553125284517
+33
+2251.00042478027
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+395.941605262448
+20
+-839.735434514061
+30
+2264.29239416004
+11
+301.780746126529
+21
+-883.553125284517
+31
+2251.00042478027
+12
+357.792956438195
+22
+-863.788607954656
+32
+2256.9959350164
+13
+357.792956438195
+23
+-863.788607954656
+33
+2256.9959350164
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493554225852
+20
+-704.780055075949
+30
+2251.00043457603
+11
+673.273723074262
+21
+-664.397369794469
+31
+2229.41556481967
+12
+104.493551752477
+22
+-664.397444634006
+32
+2229.41548998005
+13
+104.493551752477
+23
+-664.397444634006
+33
+2229.41548998005
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+673.273723074262
+20
+-664.397369794469
+30
+2229.41556481967
+11
+104.493554225852
+21
+-704.780055075949
+31
+2251.00043457603
+12
+612.092889952714
+22
+-704.779988286527
+32
+2251.00050136552
+13
+612.092889952714
+23
+-704.779988286527
+33
+2251.00050136552
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+673.273723074262
+20
+-664.397369794469
+30
+2229.41556481967
+11
+612.092889952714
+21
+-704.779988286527
+31
+2251.00050136552
+12
+660.421223817861
+22
+-674.412868555691
+32
+2234.76895526921
+13
+660.421223817861
+23
+-674.412868555691
+33
+2234.76895526921
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+673.273723074262
+20
+-664.397369794469
+30
+2229.41556481967
+11
+660.421223817861
+21
+-674.412868555691
+31
+2234.76895526921
+12
+668.764043362589
+22
+-668.76404336259
+32
+2231.74959843549
+13
+668.764043362589
+23
+-668.76404336259
+33
+2231.74959843549
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+549.426368572047
+20
+-748.597588593672
+30
+1806.11210277493
+11
+104.49362511582
+21
+-794.166513284314
+31
+1801.62389345267
+12
+104.493618529366
+22
+-748.597647137485
+32
+1806.11204423105
+13
+104.493618529366
+23
+-748.597647137485
+33
+1806.11204423105
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.49362511582
+20
+-794.166513284314
+30
+1801.62389345267
+11
+549.426368572047
+21
+-748.597588593672
+31
+1806.11210277493
+12
+476.980677127978
+22
+-794.166464272834
+32
+1801.6239424642
+13
+476.980677127978
+23
+-794.166464272834
+33
+1801.6239424642
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+476.980677127978
+20
+-794.166464272834
+30
+1801.6239424642
+11
+549.426368572047
+21
+-748.597588593672
+31
+1806.11210277493
+12
+517.019026944331
+22
+-773.773655132591
+32
+1803.63246772228
+13
+517.019026944331
+23
+-773.773655132591
+33
+1803.63246772228
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-191.38931884584
+20
+-962.179081004757
+30
+2035.2022000213
+11
+0.0
+21
+-976.970215709361
+31
+1967.39330582966
+12
+-190.597433982906
+22
+-958.19800696011
+32
+1967.39330582966
+13
+-190.597433982906
+23
+-958.19800696011
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-976.970215709361
+30
+1967.39330582966
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-10.2481189704998
+22
+-977.344465549986
+32
+1990.50710618793
+13
+-10.2481189704998
+23
+-977.344465549986
+33
+1990.50710618793
+70
+15
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-976.970215709361
+30
+1967.39330582966
+11
+-10.2481189704998
+21
+-977.344465549986
+31
+1990.50710618793
+12
+-1.4681606386561
+22
+-978.157451656943
+32
+1989.64235577041
+13
+-1.4681606386561
+23
+-978.157451656943
+33
+1989.64235577041
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-10.2481189704998
+20
+-977.344465549986
+30
+1990.50710618793
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-18.6906684275082
+22
+-976.666250664317
+32
+1993.0681255669
+13
+-18.6906684275082
+23
+-976.666250664317
+33
+1993.0681255669
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-18.6906684275082
+20
+-976.666250664317
+30
+1993.0681255669
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-26.4713665686843
+22
+-976.148870417647
+32
+1997.22699536883
+13
+-26.4713665686843
+23
+-976.148870417647
+33
+1997.22699536883
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-26.4713665686843
+20
+-976.148870417647
+30
+1997.22699536883
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-33.2912055279291
+22
+-975.812207442705
+32
+2002.82389255955
+13
+-33.2912055279291
+23
+-975.812207442705
+33
+2002.82389255955
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-33.2912055279291
+20
+-975.812207442705
+30
+2002.82389255955
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-38.8881027186488
+22
+-975.669199508814
+32
+2009.6437315188
+13
+-38.8881027186488
+23
+-975.669199508814
+33
+2009.6437315188
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-38.8881027186488
+20
+-975.669199508814
+30
+2009.6437315188
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-43.0469725205791
+22
+-975.725342330674
+32
+2017.42442965997
+13
+-43.0469725205791
+23
+-975.725342330674
+33
+2017.42442965997
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-43.0469725205791
+20
+-975.725342330674
+30
+2017.42442965997
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-45.6079918995534
+22
+-975.978478371127
+32
+2025.86697911698
+13
+-45.6079918995534
+23
+-975.978478371127
+33
+2025.86697911698
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-45.6079918995534
+20
+-975.978478371127
+30
+2025.86697911698
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-46.4727423170739
+22
+-976.418879754098
+32
+2034.64693744883
+13
+-46.4727423170739
+23
+-976.418879754098
+33
+2034.64693744883
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-46.4727423170739
+20
+-976.418879754098
+30
+2034.64693744883
+11
+-191.38931884584
+21
+-962.179081004757
+31
+2035.2022000213
+12
+-46.4180537270787
+22
+-976.457504352767
+32
+2035.20220002131
+13
+-46.4180537270787
+23
+-976.457504352767
+33
+2035.20220002131
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-978.310708745151
+30
+1989.78695697206
+11
+0.0
+21
+-976.970215709361
+31
+1967.39330582966
+12
+-1.4681606386561
+22
+-978.157451656943
+32
+1989.64235577041
+13
+-1.4681606386561
+23
+-978.157451656943
+33
+1989.64235577041
+70
+2
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+43.4817324497669
+20
+-976.746706756077
+30
+2035.2022000213
+11
+104.493608158504
+21
+-966.678493599977
+31
+2103.01109421295
+12
+104.493617614829
+22
+-970.737560564704
+32
+2035.2022000213
+13
+104.493617614829
+23
+-970.737560564704
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+43.4817324497669
+21
+-976.746706756077
+31
+2035.2022000213
+12
+42.6716706222411
+22
+-976.334157259822
+32
+2043.42689578067
+13
+42.6716706222411
+23
+-976.334157259822
+33
+2043.42689578067
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+42.6716706222411
+21
+-976.334157259822
+31
+2043.42689578067
+12
+40.1106512432667
+22
+-976.081021219369
+32
+2051.86944523768
+13
+40.1106512432667
+23
+-976.081021219369
+33
+2051.86944523768
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+40.1106512432667
+21
+-976.081021219369
+31
+2051.86944523768
+12
+35.9517814413358
+22
+-976.024878397508
+32
+2059.65014337886
+13
+35.9517814413358
+23
+-976.024878397508
+33
+2059.65014337886
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+35.9517814413358
+21
+-976.024878397508
+31
+2059.65014337886
+12
+30.354884250617
+22
+-976.1678863314
+32
+2066.4699823381
+13
+30.354884250617
+23
+-976.1678863314
+33
+2066.4699823381
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+30.354884250617
+21
+-976.1678863314
+31
+2066.4699823381
+12
+23.5350452913725
+22
+-976.504549306342
+32
+2072.06687952882
+13
+23.5350452913725
+23
+-976.504549306342
+33
+2072.06687952882
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+23.5350452913725
+21
+-976.504549306342
+31
+2072.06687952882
+12
+15.754347150196
+22
+-977.021929553012
+32
+2076.22574933075
+13
+15.754347150196
+23
+-977.021929553012
+33
+2076.22574933075
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+15.754347150196
+21
+-977.021929553012
+31
+2076.22574933075
+12
+7.31179769318775
+22
+-977.70014443868
+32
+2078.78676870972
+13
+7.31179769318775
+23
+-977.70014443868
+33
+2078.78676870972
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+7.31179769318775
+21
+-977.70014443868
+31
+2078.78676870972
+12
+0.0
+22
+-978.377185230535
+32
+2079.50691792559
+13
+0.0
+23
+-978.377185230535
+33
+2079.50691792559
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493608158504
+20
+-966.678493599977
+30
+2103.01109421295
+11
+0.0
+21
+-978.377185230535
+31
+2079.50691792559
+12
+0.0
+22
+-976.970215709361
+32
+2103.01109421295
+13
+0.0
+23
+-976.970215709361
+33
+2103.01109421295
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-190.597433982906
+20
+-958.19800696011
+30
+2103.01109421295
+11
+-46.4180537270787
+21
+-976.457504352767
+31
+2035.20220002131
+12
+-191.38931884584
+22
+-962.179081004757
+32
+2035.2022000213
+13
+-191.38931884584
+23
+-962.179081004757
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-46.4180537270787
+20
+-976.457504352767
+30
+2035.20220002131
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-45.6079918995534
+22
+-976.044954856512
+32
+2043.42689578067
+13
+-45.6079918995534
+23
+-976.044954856512
+33
+2043.42689578067
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-45.6079918995534
+20
+-976.044954856512
+30
+2043.42689578067
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-43.0469725205787
+22
+-975.791818816059
+32
+2051.86944523768
+13
+-43.0469725205787
+23
+-975.791818816059
+33
+2051.86944523768
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-43.0469725205787
+20
+-975.791818816059
+30
+2051.86944523768
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-38.8881027186484
+22
+-975.735675994198
+32
+2059.65014337885
+13
+-38.8881027186484
+23
+-975.735675994198
+33
+2059.65014337885
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-38.8881027186484
+20
+-975.735675994198
+30
+2059.65014337885
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-33.2912055279292
+22
+-975.878683928089
+32
+2066.4699823381
+13
+-33.2912055279292
+23
+-975.878683928089
+33
+2066.4699823381
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-33.2912055279292
+20
+-975.878683928089
+30
+2066.4699823381
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-26.4713665686843
+22
+-976.215346903032
+32
+2072.06687952882
+13
+-26.4713665686843
+23
+-976.215346903032
+33
+2072.06687952882
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-26.4713665686843
+20
+-976.215346903032
+30
+2072.06687952882
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-18.690668427508
+22
+-976.732727149702
+32
+2076.22574933075
+13
+-18.690668427508
+23
+-976.732727149702
+33
+2076.22574933075
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-18.690668427508
+20
+-976.732727149702
+30
+2076.22574933075
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-10.2481189704998
+22
+-977.41094203537
+32
+2078.78676870972
+13
+-10.2481189704998
+23
+-977.41094203537
+33
+2078.78676870972
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-10.2481189704998
+20
+-977.41094203537
+30
+2078.78676870972
+11
+-190.597433982906
+21
+-958.19800696011
+31
+2103.01109421295
+12
+-1.46816063865592
+22
+-978.223928142328
+32
+2079.65151912724
+13
+-1.46816063865592
+23
+-978.223928142328
+33
+2079.65151912724
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+-1.46816063865592
+20
+-978.223928142328
+30
+2079.65151912724
+11
+0.0
+21
+-976.970215709361
+31
+2103.01109421295
+12
+0.0
+22
+-978.377185230535
+32
+2079.50691792559
+13
+0.0
+23
+-978.377185230535
+33
+2079.50691792559
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-976.970215709361
+30
+2103.01109421295
+11
+-1.46816063865592
+21
+-978.223928142328
+31
+2079.65151912724
+12
+-190.597433982906
+22
+-958.19800696011
+32
+2103.01109421295
+13
+-190.597433982906
+23
+-958.19800696011
+33
+2103.01109421295
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+0.0
+20
+-978.310708745151
+30
+1989.78695697206
+11
+104.493626002977
+21
+-966.678491842449
+31
+1967.39330582966
+12
+0.0
+22
+-976.970215709361
+32
+1967.39330582966
+13
+0.0
+23
+-976.970215709361
+33
+1967.39330582966
+70
+1
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493626002977
+20
+-966.678491842449
+30
+1967.39330582966
+11
+0.0
+21
+-978.310708745151
+31
+1989.78695697206
+12
+7.31179769318757
+22
+-977.633667953296
+32
+1990.50710618793
+13
+7.31179769318757
+23
+-977.633667953296
+33
+1990.50710618793
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493626002977
+20
+-966.678491842449
+30
+1967.39330582966
+11
+7.31179769318757
+21
+-977.633667953296
+31
+1990.50710618793
+12
+15.754347150196
+22
+-976.955453067628
+32
+1993.0681255669
+13
+15.754347150196
+23
+-976.955453067628
+33
+1993.0681255669
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493626002977
+20
+-966.678491842449
+30
+1967.39330582966
+11
+15.754347150196
+21
+-976.955453067628
+31
+1993.0681255669
+12
+104.493617614829
+22
+-970.737560564704
+32
+2035.2022000213
+13
+104.493617614829
+23
+-970.737560564704
+33
+2035.2022000213
+70
+3
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493617614829
+20
+-970.737560564704
+30
+2035.2022000213
+11
+15.754347150196
+21
+-976.955453067628
+31
+1993.0681255669
+12
+23.5350452913723
+22
+-976.438072820957
+32
+1997.22699536883
+13
+23.5350452913723
+23
+-976.438072820957
+33
+1997.22699536883
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493617614829
+20
+-970.737560564704
+30
+2035.2022000213
+11
+23.5350452913723
+21
+-976.438072820957
+31
+1997.22699536883
+12
+30.3548842506176
+22
+-976.101409846015
+32
+2002.82389255955
+13
+30.3548842506176
+23
+-976.101409846015
+33
+2002.82389255955
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493617614829
+20
+-970.737560564704
+30
+2035.2022000213
+11
+30.3548842506176
+21
+-976.101409846015
+31
+2002.82389255955
+12
+35.9517814413364
+22
+-975.958401912124
+32
+2009.6437315188
+13
+35.9517814413364
+23
+-975.958401912124
+33
+2009.6437315188
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493617614829
+20
+-970.737560564704
+30
+2035.2022000213
+11
+35.9517814413364
+21
+-975.958401912124
+31
+2009.6437315188
+12
+40.110651243267
+22
+-976.014544733984
+32
+2017.42442965997
+13
+40.110651243267
+23
+-976.014544733984
+33
+2017.42442965997
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493617614829
+20
+-970.737560564704
+30
+2035.2022000213
+11
+40.110651243267
+21
+-976.014544733984
+31
+2017.42442965997
+12
+42.6716706222411
+22
+-976.267680774437
+32
+2025.86697911698
+13
+42.6716706222411
+23
+-976.267680774437
+33
+2025.86697911698
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493617614829
+20
+-970.737560564704
+30
+2035.2022000213
+11
+42.6716706222411
+21
+-976.267680774437
+31
+2025.86697911698
+12
+43.5364210397618
+22
+-976.708082157409
+32
+2034.64693744883
+13
+43.5364210397618
+23
+-976.708082157409
+33
+2034.64693744883
+70
+13
+ 0
+3DFACE
+ 8
+body_half_inside
+10
+104.493617614829
+20
+-970.737560564704
+30
+2035.2022000213
+11
+43.5364210397618
+21
+-976.708082157409
+31
+2034.64693744883
+12
+43.4817324497669
+22
+-976.746706756077
+32
+2035.2022000213
+13
+43.4817324497669
+23
+-976.746706756077
+33
+2035.2022000213
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.455212576234
+20
+-280.29408
+30
+1639.76100453833
+11
+176.700983922342
+21
+-186.86272
+31
+1605.98522290042
+12
+176.700983922341
+22
+-280.29408
+32
+1605.98522290042
+13
+176.700983922341
+23
+-280.29408
+33
+1605.98522290042
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.700983922342
+20
+-186.86272
+30
+1605.98522290042
+11
+166.455212576234
+21
+-280.29408
+31
+1639.76100453833
+12
+166.455212576235
+22
+-186.86272
+32
+1639.76100453833
+13
+166.455212576235
+23
+-186.86272
+33
+1639.76100453833
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.816982737509
+20
+-280.29408
+30
+1670.8889431717
+11
+166.455212576235
+21
+-186.86272
+31
+1639.76100453833
+12
+166.455212576234
+22
+-280.29408
+32
+1639.76100453833
+13
+166.455212576234
+23
+-280.29408
+33
+1639.76100453833
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.455212576235
+20
+-186.86272
+30
+1639.76100453833
+11
+149.816982737509
+21
+-280.29408
+31
+1670.8889431717
+12
+149.816982737509
+22
+-186.86272
+32
+1670.8889431717
+13
+149.816982737509
+23
+-186.86272
+33
+1670.8889431717
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.530885442671
+20
+-186.862719999999
+30
+242.726639240051
+11
+93.5308854426706
+21
+-280.294079999998
+31
+1315.22236639941
+12
+93.5308854426706
+22
+-280.294079999998
+32
+242.726639192693
+13
+93.5308854426706
+23
+-280.294079999998
+33
+242.726639192693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.5308854426706
+20
+-280.294079999998
+30
+1315.22236639941
+11
+93.530885442671
+21
+-186.862719999999
+31
+242.726639240051
+12
+93.530885442671
+22
+-186.862719999998
+32
+1315.22236639941
+13
+93.530885442671
+23
+-186.862719999998
+33
+1315.22236639941
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844156
+20
+-280.29408
+30
+1421.1550651442
+11
+127.42569224804
+21
+-186.86272
+31
+1443.54635563367
+12
+100.141825844157
+22
+-186.86272
+32
+1421.1550651442
+13
+100.141825844157
+23
+-186.86272
+33
+1421.1550651442
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.42569224804
+20
+-186.86272
+30
+1443.54635563367
+11
+100.141825844156
+21
+-280.29408
+31
+1421.1550651442
+12
+127.425692248039
+22
+-280.29408
+32
+1443.54635563367
+13
+127.425692248039
+23
+-280.29408
+33
+1443.54635563367
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+653.29151769208
+20
+-646.340639254846
+30
+5.83945951983237
+11
+642.023925698404
+21
+-654.528573978645
+31
+-3.60955709766131e-12
+12
+642.023925698403
+22
+-654.528573978644
+32
+5.83945951983345
+13
+642.023925698403
+23
+-654.528573978644
+33
+5.83945951983345
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+642.023925698404
+20
+-654.528573978645
+30
+-3.60955709766131e-12
+11
+653.29151769208
+21
+-646.340639254846
+31
+5.83945951983237
+12
+653.29151769208
+22
+-646.340639254847
+32
+-4.51194637207664e-12
+13
+653.29151769208
+23
+-646.340639254847
+33
+-4.51194637207664e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.816982737509
+20
+-280.29408
+30
+1670.8889431717
+11
+127.425692248039
+21
+-186.862719999999
+31
+1698.17280957558
+12
+149.816982737509
+22
+-186.86272
+32
+1670.8889431717
+13
+149.816982737509
+23
+-186.86272
+33
+1670.8889431717
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.425692248039
+20
+-186.862719999999
+30
+1698.17280957558
+11
+149.816982737509
+21
+-280.29408
+31
+1670.8889431717
+12
+127.425692248039
+22
+-280.29408
+32
+1698.17280957558
+13
+127.425692248039
+23
+-280.29408
+33
+1698.17280957558
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+806.270901222105
+20
+56.1856515497994
+30
+23.3578380793657
+11
+847.545902396362
+21
+56.1856515498016
+31
+1.46187062455283e-11
+12
+806.270901222104
+22
+56.1856515498016
+32
+1.46187062455283e-11
+13
+806.270901222104
+23
+56.1856515498016
+33
+1.46187062455283e-11
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.545902396362
+20
+56.1856515498016
+30
+1.46187062455283e-11
+11
+806.270901222105
+21
+56.1856515497994
+31
+23.3578380793657
+12
+847.545902396365
+22
+56.1856515497976
+32
+23.3578380793863
+13
+847.545902396365
+23
+56.1856515497976
+33
+23.3578380793863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269999782869
+20
+-697.7398487668
+30
+192.761586394987
+11
+464.090791712392
+21
+-720.287768351753
+31
+170.665180957976
+12
+464.090789844927
+22
+-696.627200742591
+32
+191.294034464012
+13
+464.090789844927
+23
+-696.627200742591
+33
+191.294034464012
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090791712392
+20
+-720.287768351753
+30
+170.665180957976
+11
+461.269999782869
+21
+-697.7398487668
+31
+192.761586394987
+12
+461.270001665299
+22
+-721.590015329221
+32
+171.967427935313
+13
+461.270001665299
+23
+-721.590015329221
+33
+171.967427935313
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.410423174187
+20
+-566.321374409616
+30
+23.357838010706
+11
+792.007218281129
+21
+-582.09079684746
+31
+40.22369700007
+12
+793.309565768095
+22
+-569.303680096418
+32
+23.3578380100164
+13
+793.309565768095
+23
+-569.303680096418
+33
+23.3578380100164
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007218281129
+20
+-582.09079684746
+30
+40.22369700007
+11
+793.410423174187
+21
+-566.321374409616
+31
+23.357838010706
+12
+792.007217306199
+22
+-577.494024343961
+32
+43.2377297488181
+13
+792.007217306199
+23
+-577.494024343961
+33
+43.2377297488181
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955341833487
+20
+-738.830110282484
+30
+109.907610082888
+11
+599.602155913773
+21
+-724.524747581215
+31
+134.576835581469
+12
+599.602150844536
+22
+-740.196470143783
+32
+110.675521501907
+13
+599.602150844536
+23
+-740.196470143783
+33
+110.675521501907
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602155913773
+20
+-724.524747581215
+30
+134.576835581469
+11
+624.955341833487
+21
+-738.830110282484
+31
+109.907610082888
+12
+624.955346864755
+22
+-723.275770827742
+32
+133.629900413365
+13
+624.955346864755
+23
+-723.275770827742
+33
+133.629900413365
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335612575248
+20
+-749.104396759147
+30
+83.5375802413299
+11
+439.690596528004
+21
+-756.366969281262
+31
+56.4649968373303
+12
+436.335601310833
+22
+-757.591910929275
+32
+56.7629871862785
+13
+436.335601310833
+23
+-757.591910929275
+33
+56.7629871862785
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690596528004
+20
+-756.366969281262
+30
+56.4649968373303
+11
+436.335612575248
+21
+-749.104396759147
+31
+83.5375802413299
+12
+439.690607723364
+22
+-747.931486742049
+32
+83.0754516399063
+13
+439.690607723364
+23
+-747.931486742049
+33
+83.0754516399063
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690607723364
+20
+-747.931486742049
+30
+83.0754516399063
+11
+442.839466299903
+21
+-754.702000509797
+31
+56.0599621810555
+12
+439.690596528004
+22
+-756.366969281262
+32
+56.4649968373303
+13
+439.690596528004
+23
+-756.366969281262
+33
+56.4649968373303
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839466299903
+20
+-754.702000509797
+30
+56.0599621810555
+11
+439.690607723364
+21
+-747.931486742049
+31
+83.0754516399063
+12
+442.839477401402
+22
+-746.337240593148
+32
+82.4473163912804
+13
+442.839477401402
+23
+-746.337240593148
+33
+82.4473163912804
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222214863865
+20
+-789.666464186592
+30
+31.8757394304439
+11
+455.006085098156
+21
+-785.239686816274
+31
+63.4887904110616
+12
+455.006069025402
+22
+-790.658170470477
+32
+31.9771884161607
+13
+455.006069025402
+23
+-790.658170470477
+33
+31.9771884161607
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006085098156
+20
+-785.239686816274
+30
+63.4887904110616
+11
+458.222214863865
+21
+-789.666464186592
+31
+31.8757394304439
+12
+458.222230868175
+22
+-784.271054681722
+32
+63.2531519626526
+13
+458.222230868175
+23
+-784.271054681722
+33
+63.2531519626526
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.995900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+0.00176534768975319
+21
+-186.86272
+31
+5.83945951983706
+12
+0.00176534768970384
+22
+-186.86272
+32
+23.3578380793295
+13
+0.00176534768970384
+23
+-186.86272
+33
+23.3578380793295
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.00176534768975319
+20
+-186.86272
+30
+5.83945951983706
+11
+764.995900047839
+21
+-186.86272
+31
+23.3578380793295
+12
+764.995900047839
+22
+-186.86272
+32
+5.83945951983706
+13
+764.995900047839
+23
+-186.86272
+33
+5.83945951983706
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.10720415349
+20
+-665.162054034067
+30
+199.228411696097
+11
+470.677523524142
+21
+-692.042929592268
+31
+185.247506781241
+12
+472.107209463225
+22
+-690.197307940468
+32
+182.813182295542
+13
+472.107209463225
+23
+-690.197307940468
+33
+182.813182295542
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677523524142
+20
+-692.042929592268
+30
+185.247506781241
+11
+472.10720415349
+21
+-665.162054034067
+31
+199.228411696097
+12
+470.677518140403
+22
+-666.658744301589
+32
+201.891525102388
+13
+470.677518140403
+23
+-666.658744301589
+33
+201.891525102388
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133251163261
+20
+-548.67314817835
+30
+186.220486963908
+11
+454.66772029492
+21
+-186.86272
+31
+186.220486963908
+12
+602.133251163261
+22
+-186.86272
+32
+186.220486963908
+13
+602.133251163261
+23
+-186.86272
+33
+186.220486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.66772029492
+20
+-186.86272
+30
+186.220486963908
+11
+602.133251163261
+21
+-548.67314817835
+31
+186.220486963908
+12
+454.66772029492
+22
+-548.673192057237
+32
+186.220486963908
+13
+454.66772029492
+23
+-548.673192057237
+33
+186.220486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957358037872
+20
+-603.792752711355
+30
+197.311473394829
+11
+696.758793128571
+21
+-625.025897634329
+31
+178.836736613072
+12
+696.758783079627
+22
+-601.140380260496
+32
+186.408417229293
+13
+696.758783079627
+23
+-601.140380260496
+33
+186.408417229293
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758793128571
+20
+-625.025897634329
+30
+178.836736613072
+11
+673.957358037872
+21
+-603.792752711355
+31
+197.311473394829
+12
+673.957368701467
+22
+-629.139245228331
+32
+189.276665394806
+13
+673.957368701467
+23
+-629.139245228331
+33
+189.276665394806
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-549.195745909472
+30
+217.326639240051
+11
+599.602098887118
+21
+-186.86272
+31
+217.326639240051
+12
+473.71772029492
+22
+-186.86272
+32
+217.326639240051
+13
+473.71772029492
+23
+-186.86272
+33
+217.326639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602098887118
+20
+-186.86272
+30
+217.326639240051
+11
+473.71772029492
+21
+-549.195745909472
+31
+217.326639240051
+12
+599.602098887118
+22
+-549.195708452133
+32
+217.326639240051
+13
+599.602098887118
+23
+-549.195708452133
+33
+217.326639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.5308854426706
+20
+-280.294079999998
+30
+242.726639192693
+11
+0.112465277083136
+21
+-280.29408
+31
+1390.81149035281
+12
+0.000487681863777811
+22
+-280.294079999998
+32
+242.726639192693
+13
+0.000487681863777811
+23
+-280.294079999998
+33
+242.726639192693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.112465277083136
+20
+-280.29408
+30
+1390.81149035281
+11
+93.5308854426706
+21
+-280.294079999998
+31
+242.726639192693
+12
+35.2381055728783
+22
+-280.29408
+32
+1394.27106395937
+13
+35.2381055728783
+23
+-280.29408
+33
+1394.27106395937
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.2381055728783
+20
+-280.29408
+30
+1394.27106395937
+11
+93.5308854426706
+21
+-280.294079999998
+31
+242.726639192693
+12
+69.0138872107921
+22
+-280.29408
+32
+1404.51683530547
+13
+69.0138872107921
+23
+-280.29408
+33
+1404.51683530547
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.0138872107921
+20
+-280.29408
+30
+1404.51683530547
+11
+93.5308854426706
+21
+-280.294079999998
+31
+242.726639192693
+12
+93.5308854426706
+22
+-280.294079999998
+32
+1315.22236639941
+13
+93.5308854426706
+23
+-280.294079999998
+33
+1315.22236639941
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.0138872107921
+20
+-280.29408
+30
+1404.51683530547
+11
+93.5308854426706
+21
+-280.294079999998
+31
+1315.22236639941
+12
+100.141825844156
+22
+-280.29408
+32
+1421.1550651442
+13
+100.141825844156
+23
+-280.29408
+33
+1421.1550651442
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844156
+20
+-280.29408
+30
+1421.1550651442
+11
+93.5308854426706
+21
+-280.294079999998
+31
+1315.22236639941
+12
+221.73980966547
+22
+-280.29408
+32
+1435.59863370269
+13
+221.73980966547
+23
+-280.29408
+33
+1435.59863370269
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844156
+20
+-280.29408
+30
+1421.1550651442
+11
+221.73980966547
+21
+-280.29408
+31
+1435.59863370269
+12
+127.425692248039
+22
+-280.29408
+32
+1443.54635563367
+13
+127.425692248039
+23
+-280.29408
+33
+1443.54635563367
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.425692248039
+20
+-280.29408
+30
+1443.54635563367
+11
+221.73980966547
+21
+-280.29408
+31
+1435.59863370269
+12
+149.816982737509
+22
+-280.29408
+32
+1470.83022203755
+13
+149.816982737509
+23
+-280.29408
+33
+1470.83022203755
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.816982737509
+20
+-280.29408
+30
+1470.83022203755
+11
+221.73980966547
+21
+-280.29408
+31
+1435.59863370269
+12
+166.455212576234
+22
+-280.29408
+32
+1501.95816067091
+13
+166.455212576234
+23
+-280.29408
+33
+1501.95816067091
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.455212576234
+20
+-280.29408
+30
+1501.95816067091
+11
+221.73980966547
+21
+-280.29408
+31
+1435.59863370269
+12
+176.700983922341
+22
+-280.29408
+32
+1535.73394230883
+13
+176.700983922341
+23
+-280.29408
+33
+1535.73394230883
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.700983922341
+20
+-280.29408
+30
+1535.73394230883
+11
+221.73980966547
+21
+-280.29408
+31
+1435.59863370269
+12
+180.160557528893
+22
+-280.29408
+32
+1570.85958260462
+13
+180.160557528893
+23
+-280.29408
+33
+1570.85958260462
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+180.160557528893
+20
+-280.29408
+30
+1570.85958260462
+11
+221.73980966547
+21
+-280.29408
+31
+1435.59863370269
+12
+180.185723589149
+22
+-280.29408
+32
+1903.25211107687
+13
+180.185723589149
+23
+-280.29408
+33
+1903.25211107687
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.2430152276776
+20
+-280.294079999999
+30
+2079.8653122236
+11
+0.179983602711226
+21
+-280.294079999999
+31
+2125.50255258978
+12
+0.112465277083137
+22
+-280.294079999999
+32
+2083.32536938894
+13
+0.112465277083137
+23
+-280.294079999999
+33
+2083.32536938894
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.179983602711226
+20
+-280.294079999999
+30
+2125.50255258978
+11
+35.2430152276776
+21
+-280.294079999999
+31
+2079.8653122236
+12
+46.8683973136999
+22
+-280.294079999999
+32
+2125.50255258978
+13
+46.8683973136999
+23
+-280.294079999999
+33
+2125.50255258978
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973136999
+20
+-280.294079999999
+30
+2125.50255258978
+11
+35.2430152276776
+21
+-280.294079999999
+31
+2079.8653122236
+12
+69.0235178451101
+22
+-280.294079999999
+32
+2069.61810878401
+13
+69.0235178451101
+23
+-280.294079999999
+33
+2069.61810878401
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973136999
+20
+-280.294079999999
+30
+2125.50255258978
+11
+69.0235178451101
+21
+-280.294079999999
+31
+2069.61810878401
+12
+46.8683973136999
+22
+-280.294079999999
+32
+2499.20806403607
+13
+46.8683973136999
+23
+-280.294079999999
+33
+2499.20806403607
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973136999
+20
+-280.294079999999
+30
+2499.20806403607
+11
+69.0235178451101
+21
+-280.294079999999
+31
+2069.61810878401
+12
+93.6524710483026
+22
+-280.294079999999
+32
+2499.20806403607
+13
+93.6524710483026
+23
+-280.294079999999
+33
+2499.20806403607
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.6524710483026
+20
+-280.294079999999
+30
+2499.20806403607
+11
+69.0235178451101
+21
+-280.294079999999
+31
+2069.61810878401
+12
+100.155807358117
+22
+-280.294079999999
+32
+2052.97755335166
+13
+100.155807358117
+23
+-280.294079999999
+33
+2052.97755335166
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.6524710483026
+20
+-280.294079999999
+30
+2499.20806403607
+11
+100.155807358117
+21
+-280.294079999999
+31
+2052.97755335166
+12
+123.089851596878
+22
+-280.294079999999
+32
+2224.76609686633
+13
+123.089851596878
+23
+-280.294079999999
+33
+2224.76609686633
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+123.089851596878
+20
+-280.294079999999
+30
+2224.76609686633
+11
+100.155807358117
+21
+-280.294079999999
+31
+2052.97755335166
+12
+127.443487339902
+22
+-280.29408
+32
+2030.58313313969
+13
+127.443487339902
+23
+-280.29408
+33
+2030.58313313969
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+123.089851596878
+20
+-280.294079999999
+30
+2224.76609686633
+11
+127.443487339902
+21
+-280.29408
+31
+2030.58313313969
+12
+221.73980966547
+22
+-280.29408
+32
+2013.4439613934
+13
+221.73980966547
+23
+-280.29408
+33
+2013.4439613934
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.73980966547
+20
+-280.29408
+30
+2013.4439613934
+11
+127.443487339902
+21
+-280.29408
+31
+2030.58313313969
+12
+149.837907551873
+22
+-280.29408
+32
+2003.29545315791
+13
+149.837907551873
+23
+-280.29408
+33
+2003.29545315791
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.73980966547
+20
+-280.29408
+30
+2013.4439613934
+11
+149.837907551873
+21
+-280.29408
+31
+2003.29545315791
+12
+166.478462984219
+22
+-280.29408
+32
+1972.1631636449
+13
+166.478462984219
+23
+-280.29408
+33
+1972.1631636449
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.73980966547
+20
+-280.29408
+30
+2013.4439613934
+11
+166.478462984219
+21
+-280.29408
+31
+1972.1631636449
+12
+176.725666423806
+22
+-280.29408
+32
+1938.38266102747
+13
+176.725666423806
+23
+-280.29408
+33
+1938.38266102747
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.73980966547
+20
+-280.29408
+30
+2013.4439613934
+11
+176.725666423806
+21
+-280.29408
+31
+1938.38266102747
+12
+180.185723589149
+22
+-280.29408
+32
+1903.25211107687
+13
+180.185723589149
+23
+-280.29408
+33
+1903.25211107687
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.73980966547
+20
+-280.29408
+30
+2013.4439613934
+11
+180.185723589149
+21
+-280.29408
+31
+1903.25211107687
+12
+221.73980966547
+22
+-280.29408
+32
+1435.59863370269
+13
+221.73980966547
+23
+-280.29408
+33
+1435.59863370269
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844156
+20
+-280.29408
+30
+1720.56410006505
+11
+100.155807358117
+21
+-280.29408
+31
+1753.52666880208
+12
+69.3272894690769
+22
+-280.29408
+32
+1737.04848268553
+13
+69.3272894690769
+23
+-280.29408
+33
+1737.04848268553
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-280.29408
+30
+1753.52666880208
+11
+100.141825844156
+21
+-280.29408
+31
+1720.56410006505
+12
+127.425692248039
+22
+-280.29408
+32
+1698.17280957558
+13
+127.425692248039
+23
+-280.29408
+33
+1698.17280957558
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-280.29408
+30
+1753.52666880208
+11
+127.425692248039
+21
+-280.29408
+31
+1698.17280957558
+12
+127.443487339902
+22
+-280.29408
+32
+1775.92108901406
+13
+127.443487339902
+23
+-280.29408
+33
+1775.92108901406
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339902
+20
+-280.29408
+30
+1775.92108901406
+11
+127.425692248039
+21
+-280.29408
+31
+1698.17280957558
+12
+149.816982737509
+22
+-280.29408
+32
+1670.8889431717
+13
+149.816982737509
+23
+-280.29408
+33
+1670.8889431717
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339902
+20
+-280.29408
+30
+1775.92108901406
+11
+149.816982737509
+21
+-280.29408
+31
+1670.8889431717
+12
+149.837907551873
+22
+-280.29408
+32
+1803.20876899584
+13
+149.837907551873
+23
+-280.29408
+33
+1803.20876899584
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.837907551873
+20
+-280.29408
+30
+1803.20876899584
+11
+149.816982737509
+21
+-280.29408
+31
+1670.8889431717
+12
+166.455212576234
+22
+-280.29408
+32
+1639.76100453833
+13
+166.455212576234
+23
+-280.29408
+33
+1639.76100453833
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.837907551873
+20
+-280.29408
+30
+1803.20876899584
+11
+166.455212576234
+21
+-280.29408
+31
+1639.76100453833
+12
+166.478462984219
+22
+-280.29408
+32
+1834.34105850885
+13
+166.478462984219
+23
+-280.29408
+33
+1834.34105850885
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.478462984219
+20
+-280.29408
+30
+1834.34105850885
+11
+166.455212576234
+21
+-280.29408
+31
+1639.76100453833
+12
+176.700983922341
+22
+-280.29408
+32
+1605.98522290042
+13
+176.700983922341
+23
+-280.29408
+33
+1605.98522290042
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.478462984219
+20
+-280.29408
+30
+1834.34105850885
+11
+176.700983922341
+21
+-280.29408
+31
+1605.98522290042
+12
+176.725666423806
+22
+-280.29408
+32
+1868.12156112628
+13
+176.725666423806
+23
+-280.29408
+33
+1868.12156112628
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.725666423806
+20
+-280.29408
+30
+1868.12156112628
+11
+176.700983922341
+21
+-280.29408
+31
+1605.98522290042
+12
+180.160557528893
+22
+-280.29408
+32
+1570.85958260462
+13
+180.160557528893
+23
+-280.29408
+33
+1570.85958260462
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.725666423806
+20
+-280.29408
+30
+1868.12156112628
+11
+180.160557528893
+21
+-280.29408
+31
+1570.85958260462
+12
+180.185723589149
+22
+-280.29408
+32
+1903.25211107687
+13
+180.185723589149
+23
+-280.29408
+33
+1903.25211107687
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575559198051
+20
+-733.364267924859
+30
+77.3359522782304
+11
+454.431270729568
+21
+-719.25912090813
+31
+98.9086120013344
+12
+454.431263343628
+22
+-730.119576764422
+32
+76.0575414220674
+13
+454.431263343628
+23
+-730.119576764422
+33
+76.0575414220674
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431270729568
+20
+-719.25912090813
+30
+98.9086120013344
+11
+453.575559198051
+21
+-733.364267924859
+31
+77.3359522782304
+12
+453.575566723046
+22
+-722.299342389133
+32
+100.617239704551
+13
+453.575566723046
+23
+-722.299342389133
+33
+100.617239704551
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+813.09098561462
+20
+-692.336726612815
+30
+-1.92750349015114e-10
+11
+794.401547685759
+21
+-720.307447118137
+31
+23.3578380791593
+12
+794.401547685756
+22
+-720.307447118133
+32
+-2.12061479487602e-10
+13
+794.401547685756
+23
+-720.307447118133
+33
+-2.12061479487602e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+794.401547685759
+20
+-720.307447118137
+30
+23.3578380791593
+11
+813.09098561462
+21
+-692.336726612815
+31
+-1.92750349015114e-10
+12
+813.090985614623
+22
+-692.336726612819
+32
+23.3578380791782
+13
+813.090985614623
+23
+-692.336726612819
+33
+23.3578380791782
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642038802113
+20
+-579.415028713919
+30
+219.67849237548
+11
+473.10173725466
+21
+-608.824016722648
+31
+217.993091128508
+12
+473.642053400866
+22
+-608.036762247305
+32
+214.756927441262
+13
+473.642053400866
+23
+-608.036762247305
+33
+214.756927441262
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.10173725466
+20
+-608.824016722648
+30
+217.993091128508
+11
+473.642038802113
+21
+-579.415028713919
+31
+219.67849237548
+12
+473.101722427237
+22
+-579.753960348852
+32
+222.99174608133
+13
+473.101722427237
+23
+-579.753960348852
+33
+222.99174608133
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024166993188
+20
+-635.678245979518
+30
+51.9354404084483
+11
+767.829328484993
+21
+-662.181333229905
+31
+49.2897100106075
+12
+779.024163430099
+22
+-640.917494008958
+32
+40.9117386331972
+13
+779.024163430099
+23
+-640.917494008958
+33
+40.9117386331972
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829328484993
+20
+-662.181333229905
+30
+49.2897100106075
+11
+779.024166993188
+21
+-635.678245979518
+31
+51.9354404084483
+12
+767.829332959368
+22
+-655.602108768076
+32
+63.1328050448759
+13
+767.829332959368
+23
+-655.602108768076
+33
+63.1328050448759
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024169157982
+20
+-611.764971197169
+30
+79.3631234201936
+11
+767.829336589646
+21
+-637.125515922866
+31
+87.5029285374647
+12
+779.024169884095
+22
+-620.964740882273
+32
+71.3421534984996
+13
+779.024169884095
+23
+-620.964740882273
+33
+71.3421534984996
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829336589646
+20
+-637.125515922866
+30
+87.5029285374647
+11
+779.024169157982
+21
+-611.764971197169
+31
+79.3631234201936
+12
+767.829335677824
+22
+-625.572837100386
+32
+97.5753208387769
+13
+767.829335677824
+23
+-625.572837100386
+33
+97.5753208387769
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471125884842
+20
+-695.789522350054
+30
+146.166934958744
+11
+452.247013852634
+21
+-673.811261880626
+31
+161.200429262907
+12
+452.247015413237
+22
+-693.583909707096
+32
+143.961322316008
+13
+452.247015413237
+23
+-693.583909707096
+33
+143.961322316008
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247013852634
+20
+-673.811261880626
+30
+161.200429262907
+11
+450.471125884842
+21
+-695.789522350054
+31
+146.166934958744
+12
+450.471124298894
+22
+-675.695750953173
+32
+163.686018751541
+13
+450.471124298894
+23
+-675.695750953173
+33
+163.686018751541
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.545902396357
+20
+-186.86272
+30
+3.60955709766131e-13
+11
+806.270901222104
+21
+56.1856515498016
+31
+1.46187062455283e-11
+12
+847.545902396362
+22
+56.1856515498016
+32
+1.46187062455283e-11
+13
+847.545902396362
+23
+56.1856515498016
+33
+1.46187062455283e-11
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+806.270901222104
+20
+56.1856515498016
+30
+1.46187062455283e-11
+11
+847.545902396357
+21
+-186.86272
+31
+3.60955709766131e-13
+12
+700.992216732393
+22
+-563.749226612815
+32
+-1.11896270027501e-11
+13
+700.992216732393
+23
+-563.749226612815
+33
+-1.11896270027501e-11
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+700.992216732393
+20
+-563.749226612815
+30
+-1.11896270027501e-11
+11
+847.545902396357
+21
+-186.86272
+31
+3.60955709766131e-13
+12
+847.545902396357
+22
+-563.749226612815
+32
+1.80477854883065e-13
+13
+847.545902396357
+23
+-563.749226612815
+33
+1.80477854883065e-13
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+700.992216732393
+20
+-563.749226612815
+30
+-1.11896270027501e-11
+11
+847.545902396357
+21
+-563.749226612815
+31
+1.80477854883065e-13
+12
+843.130722681614
+22
+-608.45291709122
+32
+-4.11489509133389e-11
+13
+843.130722681614
+23
+-608.45291709122
+33
+-4.11489509133389e-11
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+700.992216732393
+20
+-563.749226612815
+30
+-1.11896270027501e-11
+11
+843.130722681614
+21
+-608.45291709122
+31
+-4.11489509133389e-11
+12
+698.091838084213
+22
+-577.37232127131
+32
+-1.01067598734517e-11
+13
+698.091838084213
+23
+-577.37232127131
+33
+-1.01067598734517e-11
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+698.091838084213
+20
+-577.37232127131
+30
+-1.01067598734517e-11
+11
+843.130722681614
+21
+-608.45291709122
+31
+-4.11489509133389e-11
+12
+693.784141830299
+22
+-590.617873632807
+32
+-9.20437059903634e-12
+13
+693.784141830299
+23
+-590.617873632807
+33
+-9.20437059903634e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+693.784141830299
+20
+-590.617873632807
+30
+-9.20437059903634e-12
+11
+843.130722681614
+21
+-608.45291709122
+31
+-4.11489509133389e-11
+12
+688.116269958089
+22
+-603.340928801176
+32
+-8.48245917950408e-12
+13
+688.116269958089
+23
+-603.340928801176
+33
+-8.48245917950408e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.116269958089
+20
+-603.340928801176
+30
+-8.48245917950408e-12
+11
+843.130722681614
+21
+-608.45291709122
+31
+-4.11489509133389e-11
+12
+681.150249762187
+22
+-615.402249914861
+32
+-7.58006990508875e-12
+13
+681.150249762187
+23
+-615.402249914861
+33
+-7.58006990508875e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+681.150249762187
+20
+-615.402249914861
+30
+-7.58006990508875e-12
+11
+843.130722681614
+21
+-608.45291709122
+31
+-4.11489509133389e-11
+12
+838.782876772249
+22
+-630.311014537056
+32
+-1.18393472803291e-10
+13
+838.782876772249
+23
+-630.311014537056
+33
+-1.18393472803291e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+681.150249762187
+20
+-615.402249914861
+30
+-7.58006990508875e-12
+11
+838.782876772249
+21
+-630.311014537056
+31
+-1.18393472803291e-10
+12
+672.962315038389
+22
+-626.669841908538
+32
+-6.49720277579036e-12
+13
+672.962315038389
+23
+-626.669841908538
+33
+-6.49720277579036e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+672.962315038389
+20
+-626.669841908538
+30
+-6.49720277579036e-12
+11
+838.782876772249
+21
+-630.311014537056
+31
+-1.18393472803291e-10
+12
+663.642071806514
+22
+-637.020396022971
+32
+-5.59481350137503e-12
+13
+663.642071806514
+23
+-637.020396022971
+33
+-5.59481350137503e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+663.642071806514
+20
+-637.020396022971
+30
+-5.59481350137503e-12
+11
+838.782876772249
+21
+-630.311014537056
+31
+-1.18393472803291e-10
+12
+827.969621169947
+22
+-662.165838331307
+32
+-1.61527680120344e-10
+13
+827.969621169947
+23
+-662.165838331307
+33
+-1.61527680120344e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+663.642071806514
+20
+-637.020396022971
+30
+-5.59481350137503e-12
+11
+827.969621169947
+21
+-662.165838331307
+31
+-1.61527680120344e-10
+12
+653.29151769208
+22
+-646.340639254847
+32
+-4.51194637207664e-12
+13
+653.29151769208
+23
+-646.340639254847
+33
+-4.51194637207664e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+653.29151769208
+20
+-646.340639254847
+30
+-4.51194637207664e-12
+11
+827.969621169947
+21
+-662.165838331307
+31
+-1.61527680120344e-10
+12
+642.023925698404
+22
+-654.528573978645
+32
+-3.60955709766131e-12
+13
+642.023925698404
+23
+-654.528573978645
+33
+-3.60955709766131e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+642.023925698404
+20
+-654.528573978645
+30
+-3.60955709766131e-12
+11
+827.969621169947
+21
+-662.165838331307
+31
+-1.61527680120344e-10
+12
+629.962604584718
+22
+-661.494594174547
+32
+-2.52668996836292e-12
+13
+629.962604584718
+23
+-661.494594174547
+33
+-2.52668996836292e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+629.962604584718
+20
+-661.494594174547
+30
+-2.52668996836292e-12
+11
+827.969621169947
+21
+-662.165838331307
+31
+-1.61527680120344e-10
+12
+617.23954941635
+22
+-667.162466046757
+32
+-1.62430069394759e-12
+13
+617.23954941635
+23
+-667.162466046757
+33
+-1.62430069394759e-12
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+617.23954941635
+20
+-667.162466046757
+30
+-1.62430069394759e-12
+11
+827.969621169947
+21
+-662.165838331307
+31
+-1.61527680120344e-10
+12
+813.09098561462
+22
+-692.336726612815
+32
+-1.92750349015114e-10
+13
+813.09098561462
+23
+-692.336726612815
+33
+-1.92750349015114e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+617.23954941635
+20
+-667.162466046757
+30
+-1.62430069394759e-12
+11
+813.09098561462
+21
+-692.336726612815
+31
+-1.92750349015114e-10
+12
+603.993997054853
+22
+-671.470162300671
+32
+-5.41433564649196e-13
+13
+603.993997054853
+23
+-671.470162300671
+33
+-5.41433564649196e-13
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+603.993997054853
+20
+-671.470162300671
+30
+-5.41433564649196e-13
+11
+813.09098561462
+21
+-692.336726612815
+31
+-1.92750349015114e-10
+12
+590.370902396357
+22
+-674.370540948851
+32
+1.80477854883065e-13
+13
+590.370902396357
+23
+-674.370540948851
+33
+1.80477854883065e-13
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+590.370902396357
+20
+-674.370540948851
+30
+1.80477854883065e-13
+11
+813.09098561462
+21
+-692.336726612815
+31
+-1.92750349015114e-10
+12
+0.000467548731318024
+22
+-674.370540948851
+32
+1.80477854883065e-13
+13
+0.000467548731318024
+23
+-674.370540948851
+33
+1.80477854883065e-13
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731318024
+20
+-674.370540948851
+30
+1.80477854883065e-13
+11
+813.09098561462
+21
+-692.336726612815
+31
+-1.92750349015114e-10
+12
+0.000467548731319434
+22
+-820.924226612815
+32
+1.80477854883065e-13
+13
+0.000467548731319434
+23
+-820.924226612815
+33
+1.80477854883065e-13
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+813.09098561462
+21
+-692.336726612815
+31
+-1.92750349015114e-10
+12
+794.401547685756
+22
+-720.307447118133
+32
+-2.12061479487602e-10
+13
+794.401547685756
+23
+-720.307447118133
+33
+-2.12061479487602e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+794.401547685756
+21
+-720.307447118133
+31
+-2.12061479487602e-10
+12
+772.221088848008
+22
+-745.599413064465
+32
+-2.18378204408509e-10
+13
+772.221088848008
+23
+-745.599413064465
+33
+-2.18378204408509e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+772.221088848008
+21
+-745.599413064465
+31
+-2.18378204408509e-10
+12
+746.929122901675
+22
+-767.779871902213
+32
+-2.12061479487602e-10
+13
+746.929122901675
+23
+-767.779871902213
+33
+-2.12061479487602e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+746.929122901675
+21
+-767.779871902213
+31
+-2.12061479487602e-10
+12
+718.958402396357
+22
+-786.469309831078
+32
+-1.92750349015114e-10
+13
+718.958402396357
+23
+-786.469309831078
+33
+-1.92750349015114e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+718.958402396357
+21
+-786.469309831078
+31
+-1.92750349015114e-10
+12
+688.787514114849
+22
+-801.347945386405
+32
+-1.61527680120344e-10
+13
+688.787514114849
+23
+-801.347945386405
+33
+-1.61527680120344e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+688.787514114849
+21
+-801.347945386405
+31
+-1.61527680120344e-10
+12
+656.932690320598
+22
+-812.161200988706
+32
+-1.18393472803291e-10
+13
+656.932690320598
+23
+-812.161200988706
+33
+-1.18393472803291e-10
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+656.932690320598
+21
+-812.161200988706
+31
+-1.18393472803291e-10
+12
+623.938975880549
+22
+-818.724058836624
+32
+-6.38891606286052e-11
+13
+623.938975880549
+23
+-818.724058836624
+33
+-6.38891606286052e-11
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731319434
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+623.938975880549
+21
+-818.724058836624
+31
+-6.38891606286052e-11
+12
+590.370902396357
+22
+-820.924226612815
+32
+1.80477854883065e-13
+13
+590.370902396357
+23
+-820.924226612815
+33
+1.80477854883065e-13
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.0138872107921
+20
+-280.29408
+30
+1404.51683530547
+11
+100.141825844157
+21
+-186.86272
+31
+1421.1550651442
+12
+69.0138872107926
+22
+-186.86272
+32
+1404.51683530547
+13
+69.0138872107926
+23
+-186.86272
+33
+1404.51683530547
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844157
+20
+-186.86272
+30
+1421.1550651442
+11
+69.0138872107921
+21
+-280.29408
+31
+1404.51683530547
+12
+100.141825844156
+22
+-280.29408
+32
+1421.1550651442
+13
+100.141825844156
+23
+-280.29408
+33
+1421.1550651442
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546345594915
+20
+-599.640891643383
+30
+180.244333371467
+11
+602.133267369982
+21
+-575.898750159264
+31
+185.30549023988
+12
+623.546333434853
+22
+-575.80035767001
+32
+184.343761377095
+13
+623.546333434853
+23
+-575.80035767001
+33
+184.343761377095
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133267369982
+20
+-575.898750159264
+30
+185.30549023988
+11
+623.546345594915
+21
+-599.640891643383
+31
+180.244333371467
+12
+602.133279596418
+22
+-599.869415774734
+32
+181.183685835358
+13
+602.133279596418
+23
+-599.869415774734
+33
+181.183685835358
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721732248607
+20
+-744.352283565408
+30
+81.6652408886482
+11
+448.282012434797
+21
+-730.404696521621
+31
+105.17251147419
+12
+448.282004539076
+22
+-742.014746414944
+32
+80.7442486966709
+13
+448.282004539076
+23
+-742.014746414944
+33
+80.7442486966709
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282012434797
+20
+-730.404696521621
+30
+105.17251147419
+11
+445.721732248607
+21
+-744.352283565408
+31
+81.6652408886482
+12
+445.721740244506
+22
+-732.59492990622
+32
+106.403439896738
+13
+445.721740244506
+23
+-732.59492990622
+33
+106.403439896738
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677481847252
+20
+-580.392895076207
+30
+229.237696767784
+11
+468.840142428527
+21
+-610.976425980055
+31
+226.840985547634
+12
+470.677497105752
+22
+-610.308103138718
+32
+224.093716273781
+13
+470.677497105752
+23
+-610.308103138718
+33
+224.093716273781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840142428527
+20
+-610.976425980055
+30
+226.840985547634
+11
+470.677481847252
+21
+-580.392895076207
+31
+229.237696767784
+12
+468.840126975903
+22
+-580.680624318909
+32
+232.050409880217
+13
+468.840126975903
+23
+-580.680624318909
+33
+232.050409880217
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.00721584731
+20
+-595.005500745675
+30
+23.3578380039372
+11
+787.130186503031
+21
+-618.467587074047
+31
+32.066456918151
+12
+791.767077835926
+22
+-596.364536149864
+32
+23.3578380035618
+13
+791.767077835926
+23
+-596.364536149864
+33
+23.3578380035618
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130186503031
+20
+-618.467587074047
+30
+32.066456918151
+11
+792.00721584731
+21
+-595.005500745675
+31
+23.3578380039372
+12
+792.007217306199
+22
+-592.860317128213
+32
+27.8714369630177
+13
+792.007217306199
+23
+-592.860317128213
+33
+27.8714369630177
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130186503031
+20
+-618.467587074047
+30
+32.066456918151
+11
+792.007217306199
+21
+-592.860317128213
+31
+27.8714369630177
+12
+787.130189104003
+22
+-614.643057664062
+32
+40.1135032517926
+13
+787.130189104003
+23
+-614.643057664062
+33
+40.1135032517926
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222195872847
+20
+-549.595394709904
+30
+241.116069017578
+11
+461.269937419119
+21
+-186.86272
+31
+239.686382351025
+12
+458.222195872847
+22
+-186.86272
+32
+241.116069017578
+13
+458.222195872847
+23
+-186.86272
+33
+241.116069017578
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269937419119
+20
+-186.86272
+30
+239.686382351025
+11
+458.222195872847
+21
+-549.595394709904
+31
+241.116069017578
+12
+461.269937419119
+22
+-549.571376162653
+32
+239.686382351024
+13
+461.269937419119
+23
+-549.571376162653
+33
+239.686382351024
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997695535365
+20
+-679.337949441333
+30
+100.317732616843
+11
+717.894073612081
+21
+-705.391608581792
+31
+91.1148940822994
+12
+736.997691839832
+22
+-690.762816990611
+32
+82.8933973835911
+13
+736.997691839832
+23
+-690.762816990611
+33
+82.8933973835911
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894073612081
+20
+-705.391608581792
+30
+91.1148940822994
+11
+736.997695535365
+21
+-679.337949441333
+31
+100.317732616843
+12
+717.894077714131
+22
+-692.709977485149
+32
+110.455949073024
+13
+717.894077714131
+23
+-692.709977485149
+33
+110.455949073024
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576412075941
+20
+-604.820821451585
+30
+70.2039737536023
+11
+760.201826420081
+21
+-585.915972100795
+31
+58.2231849183613
+12
+760.20182781144
+22
+-592.476194788978
+32
+53.921748202446
+13
+760.20182781144
+23
+-592.476194788978
+33
+53.921748202446
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201826420081
+20
+-585.915972100795
+30
+58.2231849183613
+11
+753.576412075941
+21
+-604.820821451585
+31
+70.2039737536023
+12
+753.576410189591
+22
+-595.926735646398
+32
+76.0356884766169
+13
+753.576410189591
+23
+-595.926735646398
+33
+76.0356884766169
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431240478811
+20
+-576.627625779333
+30
+192.429880890276
+11
+454.797637205561
+21
+-548.733344026199
+31
+189.801126938624
+12
+454.797653593913
+22
+-576.264066422956
+32
+188.875875742312
+13
+454.797653593913
+23
+-576.264066422956
+33
+188.875875742312
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797637205561
+20
+-548.733344026199
+30
+189.801126938624
+11
+454.431240478811
+21
+-576.627625779333
+31
+192.429880890276
+12
+454.431223909685
+22
+-548.793220154026
+32
+193.36533825795
+13
+454.431223909685
+23
+-548.793220154026
+33
+193.36533825795
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690596528004
+20
+-606.087584234742
+30
+206.744381898986
+11
+436.335587191701
+21
+-578.704166932226
+31
+212.72919754513
+12
+439.690582495428
+22
+-578.575873947693
+32
+211.475076092305
+13
+439.690582495428
+23
+-578.575873947693
+33
+211.475076092305
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335587191701
+20
+-578.704166932226
+30
+212.72919754513
+11
+439.690596528004
+21
+-606.087584234742
+31
+206.744381898986
+12
+436.335601310833
+22
+-606.385574583813
+32
+207.969323546969
+13
+436.335601310833
+23
+-606.385574583813
+33
+207.969323546969
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839452384975
+20
+-578.401495960111
+30
+209.770445440443
+11
+439.690564957562
+21
+-549.114088023756
+31
+212.46522637891
+12
+442.839434933817
+22
+-549.08536836124
+32
+210.755700449054
+13
+442.839434933817
+23
+-549.08536836124
+33
+210.755700449054
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690564957562
+20
+-549.114088023756
+30
+212.46522637891
+11
+442.839452384975
+21
+-578.401495960111
+31
+209.770445440443
+12
+439.690582495428
+22
+-578.575873947693
+32
+211.475076092305
+13
+439.690582495428
+23
+-578.575873947693
+33
+211.475076092305
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758783079627
+20
+-601.140380260496
+30
+186.408417229293
+11
+717.894066860413
+21
+-619.848757614325
+31
+165.696830164561
+12
+717.894057585081
+22
+-597.802053886837
+32
+172.685609040578
+13
+717.894057585081
+23
+-597.802053886837
+33
+172.685609040578
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894066860413
+20
+-619.848757614325
+30
+165.696830164561
+11
+696.758783079627
+21
+-601.140380260496
+31
+186.408417229293
+12
+696.758793128571
+22
+-625.025897634329
+32
+178.836736613072
+13
+696.758793128571
+23
+-625.025897634329
+33
+178.836736613072
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.64207352602
+20
+-743.137302565856
+30
+112.328325554405
+11
+473.101749084159
+21
+-758.702384848233
+31
+87.3191803898169
+12
+473.642065047928
+22
+-755.603683334388
+32
+86.0982896720056
+13
+473.642065047928
+23
+-755.603683334388
+33
+86.0982896720056
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101749084159
+20
+-758.702384848233
+30
+87.3191803898169
+11
+473.64207352602
+21
+-743.137302565856
+31
+112.328325554405
+12
+473.101757695049
+22
+-746.04073417303
+32
+113.960076228591
+13
+473.101757695049
+23
+-746.04073417303
+33
+113.960076228591
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+656.932690320598
+20
+-812.161200988706
+30
+-1.18393472803291e-10
+11
+623.938975880552
+21
+-818.724058836629
+31
+23.3578380793071
+12
+623.938975880549
+22
+-818.724058836624
+32
+-6.38891606286052e-11
+13
+623.938975880549
+23
+-818.724058836624
+33
+-6.38891606286052e-11
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.938975880552
+20
+-818.724058836629
+30
+23.3578380793071
+11
+656.932690320598
+21
+-812.161200988706
+31
+-1.18393472803291e-10
+12
+656.932690320601
+22
+-812.16120098871
+32
+23.3578380792528
+13
+656.932690320601
+23
+-812.16120098871
+33
+23.3578380792528
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107168359226
+20
+-580.08201644067
+30
+226.198682483658
+11
+470.677497105752
+21
+-610.308103138718
+31
+224.093716273781
+12
+472.107183407982
+22
+-609.586009613252
+32
+221.125411221167
+13
+472.107183407982
+23
+-609.586009613252
+33
+221.125411221167
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677497105752
+20
+-610.308103138718
+30
+224.093716273781
+11
+472.107168359226
+21
+-580.08201644067
+31
+226.198682483658
+12
+470.677481847252
+22
+-580.392895076207
+32
+229.237696767784
+13
+470.677481847252
+23
+-580.392895076207
+33
+229.237696767784
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267737950976
+20
+-578.813572557816
+30
+213.798663854844
+11
+0.0162469754877819
+21
+-549.153365442471
+31
+214.795486963908
+12
+429.26772029492
+22
+-549.153237717187
+32
+214.795486963908
+13
+429.26772029492
+23
+-549.153237717187
+33
+214.795486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162469754877819
+20
+-549.153365442471
+30
+214.795486963908
+11
+429.267737950976
+21
+-578.813572557816
+31
+213.798663854844
+12
+0.0162646316092562
+22
+-578.813809543233
+32
+213.798660182835
+13
+0.0162646316092562
+23
+-578.813809543233
+33
+213.798660182835
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630414711229
+20
+-778.937031754263
+30
+61.9555523461604
+11
+464.090775113584
+21
+-771.603559996758
+31
+92.4022555870175
+12
+464.090762524528
+22
+-781.089165318495
+32
+62.4790981961044
+13
+464.090762524528
+23
+-781.089165318495
+33
+62.4790981961044
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090775113584
+20
+-771.603559996758
+30
+92.4022555870175
+11
+466.630414711229
+21
+-778.937031754263
+31
+61.9555523461604
+12
+466.630427178961
+22
+-769.542842319152
+32
+91.5903304644009
+13
+466.630427178961
+23
+-769.542842319152
+33
+91.5903304644009
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797666066761
+20
+-600.71783565349
+30
+184.671000694682
+11
+454.667736501664
+21
+-575.898831573499
+31
+185.305488978394
+12
+454.667748728094
+22
+-599.869484727166
+32
+181.183686716704
+13
+454.667748728094
+23
+-599.869484727166
+33
+181.183686716704
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667736501664
+20
+-575.898831573499
+30
+185.305488978394
+11
+454.797666066761
+21
+-600.71783565349
+31
+184.671000694682
+12
+454.797653593913
+22
+-576.264066422956
+32
+188.875875742312
+13
+454.797653593913
+23
+-576.264066422956
+33
+188.875875742312
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130189104003
+20
+-614.643057664062
+30
+40.1135032517926
+11
+779.024163430099
+21
+-640.917494008958
+31
+40.9117386331972
+12
+787.130186503031
+22
+-618.467587074047
+32
+32.066456918151
+13
+787.130186503031
+23
+-618.467587074047
+33
+32.066456918151
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024163430099
+20
+-640.917494008958
+30
+40.9117386331972
+11
+787.130189104003
+21
+-614.643057664062
+31
+40.1135032517926
+12
+779.024166993188
+22
+-635.678245979518
+32
+51.9354404084483
+13
+779.024166993188
+23
+-635.678245979518
+33
+51.9354404084483
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997677401125
+20
+-706.00295242646
+30
+44.2129177479029
+11
+717.894066860413
+21
+-715.319417548222
+31
+70.2261702210487
+12
+717.894057585081
+22
+-722.308196422019
+32
+48.1794664928565
+13
+717.894057585081
+23
+-722.308196422019
+33
+48.1794664928565
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894066860413
+20
+-715.319417548222
+30
+70.2261702210487
+11
+736.997677401125
+21
+-706.00295242646
+31
+44.2129177479029
+12
+736.997685757261
+22
+-699.706769202407
+32
+64.0747689619352
+13
+736.997685757261
+23
+-699.706769202407
+33
+64.0747689619352
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466031085639
+20
+-547.618544534505
+30
+123.445905477124
+11
+744.275027999012
+21
+-186.86272
+31
+105.557438942816
+12
+744.275027999012
+22
+-547.318028491407
+32
+105.557438942816
+13
+744.275027999012
+23
+-547.318028491407
+33
+105.557438942816
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275027999012
+20
+-186.86272
+30
+105.557438942816
+11
+732.466031085639
+21
+-547.618544534505
+31
+123.445905477124
+12
+732.466031085639
+22
+-186.86272
+32
+123.445905477124
+13
+732.466031085639
+23
+-186.86272
+33
+123.445905477124
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683316658874
+20
+-785.765920539638
+30
+63.616807647956
+11
+448.317768339636
+21
+-776.152256350036
+31
+94.1944509495159
+12
+448.317755482775
+22
+-785.839646973143
+32
+63.6347444795237
+13
+448.317755482775
+23
+-785.839646973143
+33
+63.6347444795237
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317768339636
+20
+-776.152256350036
+30
+94.1944509495159
+11
+451.683316658874
+21
+-785.765920539638
+31
+63.616807647956
+12
+451.683329511579
+22
+-776.081661498503
+32
+94.1666352734205
+13
+451.683329511579
+23
+-776.081661498503
+33
+94.1666352734205
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332897960916
+20
+-669.009252539392
+30
+119.38666515078
+11
+702.221360398304
+21
+-673.696700650341
+31
+96.0407362022104
+12
+684.332896682708
+22
+-683.128909470703
+32
+103.191916498769
+13
+684.332896682708
+23
+-683.128909470703
+33
+103.191916498769
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221360398304
+20
+-673.696700650341
+30
+96.0407362022104
+11
+684.332897960916
+21
+-669.009252539392
+31
+119.38666515078
+12
+702.221361580333
+22
+-660.639487120937
+32
+111.016899733167
+13
+702.221361580333
+23
+-660.639487120937
+33
+111.016899733167
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636242951136
+20
+-598.733544865996
+30
+176.514545976725
+11
+623.546333434853
+21
+-575.80035767001
+31
+184.343761377095
+12
+644.636231054623
+22
+-575.409716284687
+32
+180.525125445771
+13
+644.636231054623
+23
+-575.409716284687
+33
+180.525125445771
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546333434853
+20
+-575.80035767001
+30
+184.343761377095
+11
+644.636242951136
+21
+-598.733544865996
+31
+176.514545976725
+12
+623.546345594915
+22
+-599.640891643383
+32
+180.244333371467
+13
+623.546345594915
+23
+-599.640891643383
+33
+180.244333371467
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677497105752
+20
+-610.308103138718
+30
+224.093716273781
+11
+468.84015475682
+21
+-640.279768170507
+31
+217.551860904389
+12
+470.677509279169
+22
+-639.24331958749
+32
+214.92128705308
+13
+470.677509279169
+23
+-639.24331958749
+33
+214.92128705308
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84015475682
+20
+-640.279768170507
+30
+217.551860904389
+11
+470.677497105752
+21
+-610.308103138718
+31
+224.093716273781
+12
+468.840142428527
+22
+-610.976425980055
+32
+226.840985547634
+13
+468.840142428527
+23
+-610.976425980055
+33
+226.840985547634
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+2013.4439613934
+11
+221.73980966547
+21
+-280.29408
+31
+1435.59863370269
+12
+221.739809665471
+22
+-186.86272
+32
+1435.59863370269
+13
+221.739809665471
+23
+-186.86272
+33
+1435.59863370269
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.73980966547
+20
+-280.29408
+30
+1435.59863370269
+11
+221.739809665471
+21
+-186.86272
+31
+2013.4439613934
+12
+221.73980966547
+22
+-280.29408
+32
+2013.4439613934
+13
+221.73980966547
+23
+-280.29408
+33
+2013.4439613934
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114849
+20
+-801.347945386405
+30
+-1.61527680120344e-10
+11
+656.932690320601
+21
+-812.16120098871
+31
+23.3578380792528
+12
+656.932690320598
+22
+-812.161200988706
+32
+-1.18393472803291e-10
+13
+656.932690320598
+23
+-812.161200988706
+33
+-1.18393472803291e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+656.932690320601
+20
+-812.16120098871
+30
+23.3578380792528
+11
+688.787514114849
+21
+-801.347945386405
+31
+-1.61527680120344e-10
+12
+688.787514114852
+22
+-801.347945386409
+32
+23.3578380792096
+13
+688.787514114852
+23
+-801.347945386409
+33
+23.3578380792096
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.725666423806
+20
+-280.29408
+30
+1938.38266102747
+11
+180.18572358915
+21
+-186.86272
+31
+1903.25211107687
+12
+180.185723589149
+22
+-280.29408
+32
+1903.25211107687
+13
+180.185723589149
+23
+-280.29408
+33
+1903.25211107687
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+180.18572358915
+20
+-186.86272
+30
+1903.25211107687
+11
+176.725666423806
+21
+-280.29408
+31
+1938.38266102747
+12
+176.725666423807
+22
+-186.86272
+32
+1938.38266102747
+13
+176.725666423807
+23
+-186.86272
+33
+1938.38266102747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363090933403
+20
+-588.820775333035
+30
+135.766293848309
+11
+732.466044108445
+21
+-569.495501821011
+31
+122.710665747149
+12
+732.466052014781
+22
+-584.996349297051
+32
+120.045263691758
+13
+732.466052014781
+23
+-584.996349297051
+33
+120.045263691758
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466044108445
+20
+-569.495501821011
+30
+122.710665747149
+11
+718.363090933403
+21
+-588.820775333035
+31
+135.766293848309
+12
+718.363081916203
+22
+-571.142011532184
+32
+138.806193017976
+13
+718.363081916203
+23
+-571.142011532184
+33
+138.806193017976
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021391353748
+20
+-675.601700530057
+30
+125.979113140781
+11
+644.636263548619
+21
+-662.459295238253
+31
+146.227531781659
+12
+665.021389999784
+22
+-658.447133448378
+32
+140.935603497775
+13
+665.021389999784
+23
+-658.447133448378
+33
+140.935603497775
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636263548619
+20
+-662.459295238253
+30
+146.227531781659
+11
+665.021391353748
+21
+-675.601700530057
+31
+125.979113140781
+12
+644.636264956545
+22
+-680.297547066858
+32
+130.674959677109
+13
+644.636264956545
+23
+-680.297547066858
+33
+130.674959677109
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363090933403
+20
+-685.388881228845
+30
+39.1981879427727
+11
+732.466058322552
+21
+-664.91507027919
+31
+50.366817478493
+12
+732.466052014781
+22
+-669.667851071909
+32
+35.3737619083722
+13
+732.466052014781
+23
+-669.667851071909
+33
+35.3737619083722
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466058322552
+20
+-664.91507027919
+30
+50.366817478493
+11
+718.363090933403
+21
+-685.388881228845
+31
+39.1981879427727
+12
+718.363098127435
+22
+-679.968320245868
+32
+56.297813526916
+13
+718.363098127435
+23
+-679.968320245868
+33
+56.297813526916
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884111397057
+20
+-746.458660352302
+30
+82.4950785735168
+11
+624.955341833487
+21
+-738.830110282484
+31
+109.907610082888
+12
+624.955333552396
+22
+-751.006817642042
+32
+84.2870649622931
+13
+624.955333552396
+23
+-751.006817642042
+33
+84.2870649622931
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955341833487
+20
+-738.830110282484
+30
+109.907610082888
+11
+649.884111397057
+21
+-746.458660352302
+31
+82.4950785735168
+12
+649.884119483233
+22
+-734.56856186502
+32
+107.512580906988
+13
+649.884119483233
+23
+-734.56856186502
+33
+107.512580906988
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957358037872
+20
+-746.934060776874
+30
+54.170165314894
+11
+649.884111397057
+21
+-746.458660352302
+31
+82.4950785735168
+12
+649.884100288402
+22
+-754.828812255533
+32
+56.0907148781112
+13
+649.884100288402
+23
+-754.828812255533
+33
+56.0907148781112
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884111397057
+20
+-746.458660352302
+30
+82.4950785735168
+11
+673.957358037872
+21
+-746.934060776874
+31
+54.170165314894
+12
+673.957368701467
+22
+-738.899252779403
+32
+79.5166578326792
+13
+673.957368701467
+23
+-738.899252779403
+33
+79.5166578326792
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267771709642
+20
+-737.984763689194
+30
+109.432571697368
+11
+432.838940960221
+21
+-749.833439201604
+31
+83.824824767603
+12
+429.267763467221
+22
+-750.104609262675
+32
+83.9316672902124
+13
+429.267763467221
+23
+-750.104609262675
+33
+83.9316672902124
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838940960221
+20
+-749.833439201604
+30
+83.824824767603
+11
+429.267771709642
+21
+-737.984763689194
+31
+109.432571697368
+12
+432.838949191021
+22
+-737.730681730485
+32
+109.289774750901
+13
+432.838949191021
+23
+-737.730681730485
+33
+109.289774750901
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576407084801
+20
+-630.223630997654
+30
+36.698358790781
+11
+760.201826420081
+21
+-607.845772298605
+31
+36.2933847183422
+12
+760.201824130007
+22
+-611.213150017197
+32
+29.2082138072124
+13
+760.201824130007
+23
+-611.213150017197
+33
+29.2082138072124
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201826420081
+20
+-607.845772298605
+30
+36.2933847183422
+11
+753.576407084801
+21
+-630.223630997654
+31
+36.698358790781
+12
+753.576410189591
+22
+-625.658275857869
+32
+46.3041482621511
+13
+753.576410189591
+23
+-625.658275857869
+33
+46.3041482621511
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955304385432
+20
+-764.585289351978
+30
+23.3578379140486
+11
+599.602116671527
+21
+-765.945156978237
+31
+29.4490754688794
+12
+599.602113045565
+22
+-766.149870997149
+32
+23.3578379057383
+13
+599.602113045565
+23
+-766.149870997149
+33
+23.3578379057383
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602116671527
+20
+-765.945156978237
+30
+29.4490754688794
+11
+624.955304385432
+21
+-764.585289351978
+31
+23.3578379140486
+12
+624.955307916438
+22
+-764.38593632126
+32
+29.2895600085649
+13
+624.955307916438
+23
+-764.38593632126
+33
+29.2895600085649
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090775113584
+20
+-642.024842985963
+30
+221.980972610863
+11
+466.630436254431
+21
+-669.291160506739
+31
+206.575474706326
+12
+466.630427178961
+22
+-641.212917863139
+32
+219.920254933339
+13
+466.630427178961
+23
+-641.212917863139
+33
+219.920254933339
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630436254431
+20
+-669.291160506739
+30
+206.575474706326
+11
+464.090775113584
+21
+-642.024842985963
+31
+221.980972610863
+12
+464.090784277369
+22
+-670.376318084996
+32
+208.5063328654
+13
+464.090784277369
+23
+-670.376318084996
+33
+208.5063328654
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829335677824
+20
+-647.197908223015
+30
+75.9502497139702
+11
+753.73928554472
+21
+-674.070091498716
+31
+73.5119548557674
+12
+767.829332959368
+22
+-655.602108768076
+32
+63.1328050448759
+13
+767.829332959368
+23
+-655.602108768076
+33
+63.1328050448759
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928554472
+20
+-674.070091498716
+30
+73.5119548557674
+11
+767.829335677824
+21
+-647.197908223015
+31
+75.9502497139702
+12
+753.73928877638
+22
+-664.079300898903
+32
+88.749145475747
+13
+753.73928877638
+23
+-664.079300898903
+33
+88.749145475747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717772252345
+20
+-740.196478791399
+30
+110.675560324675
+11
+473.642065047928
+21
+-755.603683334388
+31
+86.0982896720056
+12
+473.717763908762
+22
+-752.465074828487
+32
+84.861675745457
+13
+473.717763908762
+23
+-752.465074828487
+33
+84.861675745457
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642065047928
+20
+-755.603683334388
+30
+86.0982896720056
+11
+473.717772252345
+21
+-740.196478791399
+31
+110.675560324675
+12
+473.64207352602
+22
+-743.137302565856
+32
+112.328325554405
+13
+473.64207352602
+23
+-743.137302565856
+33
+112.328325554405
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.00604998394
+20
+-549.612103415805
+30
+242.110623248711
+11
+458.222195872847
+21
+-186.86272
+31
+241.116069017578
+12
+455.00604998394
+22
+-186.86272
+32
+242.110623248711
+13
+455.00604998394
+23
+-186.86272
+33
+242.110623248711
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222195872847
+20
+-186.86272
+30
+241.116069017578
+11
+455.00604998394
+21
+-549.612103415805
+31
+242.110623248711
+12
+458.222195872847
+22
+-549.595394709904
+32
+241.116069017578
+13
+458.222195872847
+23
+-549.595394709904
+33
+241.116069017578
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-549.195745909472
+30
+217.326639240051
+11
+473.642038802113
+21
+-579.415028713919
+31
+219.67849237548
+12
+473.717738079349
+22
+-579.071732366754
+32
+216.322568521811
+13
+473.717738079349
+23
+-579.071732366754
+33
+216.322568521811
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642038802113
+20
+-579.415028713919
+30
+219.67849237548
+11
+473.71772029492
+21
+-549.195745909472
+31
+217.326639240051
+12
+473.642020846985
+22
+-549.252284780773
+32
+220.6922004252
+13
+473.642020846985
+23
+-549.252284780773
+33
+220.6922004252
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466052014781
+20
+-584.996349297051
+30
+120.045263691758
+11
+744.275040114523
+21
+-567.670823535761
+31
+104.873423184286
+12
+744.275046789786
+22
+-580.758079568763
+32
+102.623043056121
+13
+744.275046789786
+23
+-580.758079568763
+33
+102.623043056121
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275040114523
+20
+-567.670823535761
+30
+104.873423184286
+11
+732.466052014781
+21
+-584.996349297051
+31
+120.045263691758
+12
+732.466044108445
+22
+-569.495501821011
+32
+122.710665747149
+13
+732.466044108445
+23
+-569.495501821011
+33
+122.710665747149
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107183407982
+20
+-770.747998603796
+30
+59.9634222143927
+11
+470.677481847252
+21
+-778.860284147472
+31
+30.7703076765303
+12
+472.107168359226
+22
+-775.821269863314
+32
+30.4594290412997
+13
+472.107168359226
+23
+-775.821269863314
+33
+30.4594290412997
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677481847252
+20
+-778.860284147472
+30
+30.7703076765303
+11
+472.107183407982
+21
+-770.747998603796
+31
+59.9634222143927
+12
+470.677497105752
+22
+-773.716303656482
+32
+60.6855157395589
+13
+470.677497105752
+23
+-773.716303656482
+33
+60.6855157395589
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721721263973
+20
+-605.178251275471
+30
+203.006401057676
+11
+442.839452384975
+21
+-578.401495960111
+31
+209.770445440443
+12
+445.721707495526
+22
+-578.184382747044
+32
+207.648051313885
+13
+445.721707495526
+23
+-578.184382747044
+33
+207.648051313885
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839452384975
+20
+-578.401495960111
+30
+209.770445440443
+11
+445.721721263973
+21
+-605.178251275471
+31
+203.006401057676
+12
+442.839466299903
+22
+-605.682549578299
+32
+205.079413127562
+13
+442.839466299903
+23
+-605.682549578299
+33
+205.079413127562
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71777732158
+20
+-684.199452771651
+30
+174.902174757415
+11
+473.642080404707
+21
+-708.127668368109
+31
+158.505080975556
+12
+473.717779021898
+22
+-705.742288168363
+32
+156.11970077605
+13
+473.717779021898
+23
+-705.742288168363
+33
+156.11970077605
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642080404707
+20
+-708.127668368109
+30
+158.505080975556
+11
+473.71777732158
+21
+-684.199452771651
+31
+174.902174757415
+12
+473.642078676977
+22
+-686.237536190199
+32
+177.590351345444
+13
+473.642078676977
+23
+-686.237536190199
+33
+177.590351345444
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839466299903
+20
+-605.682549578299
+30
+205.079413127562
+11
+439.690582495428
+21
+-578.575873947693
+31
+211.475076092305
+12
+442.839452384975
+22
+-578.401495960111
+32
+209.770445440443
+13
+442.839452384975
+23
+-578.401495960111
+33
+209.770445440443
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690582495428
+20
+-578.575873947693
+30
+211.475076092305
+11
+442.839466299903
+21
+-605.682549578299
+31
+205.079413127562
+12
+439.690596528004
+22
+-606.087584234742
+32
+206.744381898986
+13
+439.690596528004
+23
+-606.087584234742
+33
+206.744381898986
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101722427237
+20
+-579.753960348852
+30
+222.99174608133
+11
+472.107183407982
+21
+-609.586009613252
+31
+221.125411221167
+12
+473.10173725466
+22
+-608.824016722648
+32
+217.993091128508
+13
+473.10173725466
+23
+-608.824016722648
+33
+217.993091128508
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107183407982
+20
+-609.586009613252
+30
+221.125411221167
+11
+473.101722427237
+21
+-579.753960348852
+31
+222.99174608133
+12
+472.107168359226
+22
+-580.08201644067
+32
+226.198682483658
+13
+472.107168359226
+23
+-580.08201644067
+33
+226.198682483658
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840142428527
+20
+-610.976425980055
+30
+226.840985547634
+11
+466.630427178961
+21
+-641.212917863139
+31
+219.920254933339
+12
+468.84015475682
+22
+-640.279768170507
+32
+217.551860904389
+13
+468.84015475682
+23
+-640.279768170507
+33
+217.551860904389
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630427178961
+20
+-641.212917863139
+30
+219.920254933339
+11
+468.840142428527
+21
+-610.976425980055
+31
+226.840985547634
+12
+466.630414711229
+22
+-611.578139745845
+32
+229.314444371434
+13
+466.630414711229
+23
+-611.578139745845
+33
+229.314444371434
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107150072447
+20
+-549.362133988305
+30
+227.231114817978
+11
+470.677481847252
+21
+-580.392895076207
+31
+229.237696767784
+12
+472.107168359226
+22
+-580.08201644067
+32
+226.198682483658
+13
+472.107168359226
+23
+-580.08201644067
+33
+226.198682483658
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677481847252
+20
+-580.392895076207
+30
+229.237696767784
+11
+472.107150072447
+21
+-549.362133988305
+31
+227.231114817978
+12
+470.677463405893
+22
+-549.413334136112
+32
+230.27885636425
+13
+470.677463405893
+23
+-549.413334136112
+33
+230.27885636425
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007218281129
+20
+-589.846284379929
+30
+32.4682094668199
+11
+787.130189104003
+21
+-614.643057664062
+31
+40.1135032517926
+12
+792.007217306199
+22
+-592.860317128213
+32
+27.8714369630177
+13
+792.007217306199
+23
+-592.860317128213
+33
+27.8714369630177
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130189104003
+20
+-614.643057664062
+30
+40.1135032517926
+11
+792.007218281129
+21
+-589.846284379929
+31
+32.4682094668199
+12
+787.130190684252
+22
+-609.757662381006
+32
+47.5643349390529
+13
+787.130190684252
+23
+-609.757662381006
+33
+47.5643349390529
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130186503031
+20
+-618.467587074047
+30
+32.066456918151
+11
+779.024158535186
+21
+-644.605714246329
+31
+29.2769308468913
+12
+787.130182929858
+22
+-621.15990220955
+32
+23.5733173858747
+13
+787.130182929858
+23
+-621.15990220955
+33
+23.5733173858747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024158535186
+20
+-644.605714246329
+30
+29.2769308468913
+11
+787.130186503031
+21
+-618.467587074047
+31
+32.066456918151
+12
+779.024163430099
+22
+-640.917494008958
+32
+40.9117386331972
+13
+779.024163430099
+23
+-640.917494008958
+33
+40.9117386331972
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+838.782876772249
+20
+-630.311014537056
+30
+-1.18393472803291e-10
+11
+827.96962116995
+21
+-662.165838331311
+31
+23.3578380792096
+12
+827.969621169947
+22
+-662.165838331307
+32
+-1.61527680120344e-10
+13
+827.969621169947
+23
+-662.165838331307
+33
+-1.61527680120344e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+827.96962116995
+20
+-662.165838331311
+30
+23.3578380792096
+11
+838.782876772249
+21
+-630.311014537056
+31
+-1.18393472803291e-10
+12
+838.782876772251
+22
+-630.31101453706
+32
+23.3578380792528
+13
+838.782876772251
+23
+-630.31101453706
+33
+23.3578380792528
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339902
+20
+-280.29408
+30
+2030.58313313969
+11
+149.837907551873
+21
+-186.86272
+31
+2003.29545315791
+12
+149.837907551873
+22
+-280.29408
+32
+2003.29545315791
+13
+149.837907551873
+23
+-280.29408
+33
+2003.29545315791
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.837907551873
+20
+-186.86272
+30
+2003.29545315791
+11
+127.443487339902
+21
+-280.29408
+31
+2030.58313313969
+12
+127.443487339903
+22
+-186.86272
+32
+2030.58313313969
+13
+127.443487339903
+23
+-186.86272
+33
+2030.58313313969
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+123.089851596878
+20
+-186.862719999999
+30
+2224.76609686633
+11
+221.73980966547
+21
+-280.29408
+31
+2013.4439613934
+12
+221.739809665471
+22
+-186.86272
+32
+2013.4439613934
+13
+221.739809665471
+23
+-186.86272
+33
+2013.4439613934
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.73980966547
+20
+-280.29408
+30
+2013.4439613934
+11
+123.089851596878
+21
+-186.862719999999
+31
+2224.76609686633
+12
+123.089851596878
+22
+-280.294079999999
+32
+2224.76609686633
+13
+123.089851596878
+23
+-280.294079999999
+33
+2224.76609686633
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.10720415349
+20
+-748.850999084323
+30
+115.539466637413
+11
+470.677509279169
+21
+-764.543874438695
+31
+89.6207321892548
+12
+472.107195414063
+22
+-761.701653732916
+32
+88.5008947532808
+13
+472.107195414063
+23
+-761.701653732916
+33
+88.5008947532808
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677509279169
+20
+-764.543874438695
+30
+89.6207321892548
+11
+472.10720415349
+21
+-748.850999084323
+31
+115.539466637413
+12
+470.677518140403
+22
+-751.514112490764
+32
+117.036156904666
+13
+470.677518140403
+23
+-751.514112490764
+33
+117.036156904666
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431270729568
+20
+-719.25912090813
+30
+98.9086120013344
+11
+454.797687662105
+21
+-702.539296405596
+31
+117.908241171874
+12
+454.797683261242
+22
+-716.144716838612
+32
+97.1582932541697
+13
+454.797683261242
+23
+-716.144716838612
+33
+97.1582932541697
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797687662105
+20
+-702.539296405596
+30
+117.908241171874
+11
+454.431270729568
+21
+-719.25912090813
+31
+98.9086120013344
+12
+454.431275216977
+22
+-705.386140960936
+32
+120.066621251022
+13
+454.431275216977
+23
+-705.386140960936
+33
+120.066621251022
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222230868175
+20
+-612.875739362874
+30
+234.648467298763
+11
+461.26998493348
+21
+-642.699946567149
+31
+223.694427829008
+12
+461.269972243544
+22
+-612.537006285544
+32
+233.256044045395
+13
+461.269972243544
+23
+-612.537006285544
+33
+233.256044045395
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.26998493348
+20
+-642.699946567149
+30
+223.694427829008
+11
+458.222230868175
+21
+-612.875739362874
+31
+234.648467298763
+12
+458.222243636608
+22
+-643.225259958184
+32
+225.027705344708
+13
+458.222243636608
+23
+-643.225259958184
+33
+225.027705344708
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201824130007
+20
+-578.830801190005
+30
+61.5905626376661
+11
+764.031420693374
+21
+-566.35608713258
+31
+43.4208517516957
+12
+764.031422681501
+22
+-571.081702518113
+32
+41.9228372915384
+13
+764.031422681501
+23
+-571.081702518113
+33
+41.9228372915384
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031420693374
+20
+-566.35608713258
+30
+43.4208517516957
+11
+760.201824130007
+21
+-578.830801190005
+31
+61.5905626376661
+12
+760.20182098394
+22
+-571.352859264312
+32
+63.961061339529
+13
+760.20182098394
+23
+-571.352859264312
+33
+63.961061339529
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267763467221
+20
+-750.104609262675
+30
+83.9316672902124
+11
+432.838929652884
+21
+-758.353294490404
+31
+56.9482088735863
+12
+429.267752143919
+22
+-758.636493889386
+32
+57.017103815686
+13
+429.267752143919
+23
+-758.636493889386
+33
+57.017103815686
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838929652884
+20
+-758.353294490404
+30
+56.9482088735863
+11
+429.267763467221
+21
+-750.104609262675
+31
+83.9316672902124
+12
+432.838940960221
+22
+-749.833439201604
+32
+83.824824767603
+13
+432.838940960221
+23
+-749.833439201604
+33
+83.824824767603
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431263343628
+20
+-625.680128816835
+30
+180.496989380173
+11
+454.797666066761
+21
+-600.71783565349
+31
+184.671000694682
+12
+454.797676017751
+22
+-624.370524419528
+32
+177.173126470384
+13
+454.797676017751
+23
+-624.370524419528
+33
+177.173126470384
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797666066761
+20
+-600.71783565349
+30
+184.671000694682
+11
+454.431263343628
+21
+-625.680128816835
+31
+180.496989380173
+12
+454.431253196946
+22
+-601.562294416642
+32
+188.142314217608
+13
+454.431253196946
+23
+-601.562294416642
+33
+188.142314217608
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677509279169
+20
+-764.543874438695
+30
+89.6207321892548
+11
+468.840142428527
+21
+-776.463572930403
+31
+61.353838580619
+12
+470.677497105752
+22
+-773.716303656482
+32
+60.6855157395589
+13
+470.677497105752
+23
+-773.716303656482
+33
+60.6855157395589
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840142428527
+20
+-776.463572930403
+30
+61.353838580619
+11
+470.677509279169
+21
+-764.543874438695
+31
+89.6207321892548
+12
+468.84015475682
+22
+-767.174448290109
+32
+90.6571807720069
+13
+468.84015475682
+23
+-767.174448290109
+33
+90.6571807720069
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332886599671
+20
+-704.132938548301
+30
+65.8187023707334
+11
+702.221343105619
+21
+-699.12426393804
+31
+42.5395709625037
+12
+684.332877982946
+22
+-710.625470617764
+32
+45.3374518452758
+13
+684.332877982946
+23
+-710.625470617764
+33
+45.3374518452758
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221343105619
+20
+-699.12426393804
+30
+42.5395709625037
+11
+684.332886599671
+21
+-704.132938548301
+31
+65.8187023707334
+12
+702.221351073972
+22
+-693.120266957808
+32
+61.4796955534277
+13
+702.221351073972
+23
+-693.120266957808
+33
+61.4796955534277
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269937419119
+20
+-549.571376162653
+30
+239.686382351024
+11
+464.090727919739
+21
+-186.86272
+31
+237.849027336606
+12
+461.269937419119
+22
+-186.86272
+32
+239.686382351025
+13
+461.269937419119
+23
+-186.86272
+33
+239.686382351025
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090727919739
+20
+-186.86272
+30
+237.849027336606
+11
+461.269937419119
+21
+-549.571376162653
+31
+239.686382351024
+12
+464.090727919739
+22
+-549.540509167097
+32
+237.849027336606
+13
+464.090727919739
+23
+-549.540509167097
+33
+237.849027336606
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602131038669
+20
+-761.101673056328
+30
+57.616722979916
+11
+473.717763908762
+21
+-752.465074828487
+31
+84.861675745457
+12
+473.717752446486
+22
+-761.101673808691
+32
+57.6167818413605
+13
+473.717752446486
+23
+-761.101673808691
+33
+57.6167818413605
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717763908762
+20
+-752.465074828487
+30
+84.861675745457
+11
+599.602131038669
+21
+-761.101673056328
+31
+57.616722979916
+12
+599.60214250095
+22
+-752.465070814344
+32
+84.8616271735756
+13
+599.60214250095
+23
+-752.465070814344
+33
+84.8616271735756
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576402819491
+20
+-633.437457700021
+30
+26.5600661905556
+11
+760.201821668678
+21
+-613.067712196625
+31
+23.3578379899606
+12
+757.969157364208
+22
+-620.27407578666
+32
+23.3578379876696
+13
+757.969157364208
+23
+-620.27407578666
+33
+23.3578379876696
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201821668678
+20
+-613.067712196625
+30
+23.3578379899606
+11
+753.576402819491
+21
+-633.437457700021
+31
+26.5600661905556
+12
+760.201824130007
+22
+-611.213150017197
+32
+29.2082138072124
+13
+760.201824130007
+23
+-611.213150017197
+33
+29.2082138072124
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201824130007
+20
+-611.213150017197
+30
+29.2082138072124
+11
+753.576402819491
+21
+-633.437457700021
+31
+26.5600661905556
+12
+753.576407084801
+22
+-630.223630997654
+32
+36.698358790781
+13
+753.576407084801
+23
+-630.223630997654
+33
+36.698358790781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317739367628
+20
+-791.272422434329
+30
+32.0400273988949
+11
+3.51879034228841e-05
+21
+-785.839649652569
+31
+63.6349541054433
+12
+1.90727753096809e-05
+22
+-791.272418599218
+32
+32.0402749105959
+13
+1.90727753096809e-05
+23
+-791.272418599218
+33
+32.0402749105959
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+3.51879034228841e-05
+20
+-785.839649652569
+30
+63.6349541054433
+11
+448.317739367628
+21
+-791.272422434329
+31
+32.0400273988949
+12
+448.317755482775
+22
+-785.839646973143
+32
+63.6347444795237
+13
+448.317755482775
+23
+-785.839646973143
+33
+63.6347444795237
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575548860337
+20
+-602.386639077964
+30
+191.530943822063
+11
+454.431240478811
+21
+-576.627625779333
+31
+192.429880890276
+12
+454.431253196946
+22
+-601.562294416642
+32
+188.142314217608
+13
+454.431253196946
+23
+-601.562294416642
+33
+188.142314217608
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431240478811
+20
+-576.627625779333
+30
+192.429880890276
+11
+453.575548860337
+21
+-602.386639077964
+31
+191.530943822063
+12
+453.575535902759
+22
+-576.982525716554
+32
+195.89923246393
+13
+453.575535902759
+23
+-576.982525716554
+33
+195.89923246393
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+791.767077835926
+20
+-596.364536149864
+30
+23.3578380035618
+11
+787.130182929858
+21
+-621.15990220955
+31
+23.5733173858747
+12
+787.308111270966
+22
+-620.27413204142
+32
+23.3578379968868
+13
+787.308111270966
+23
+-620.27413204142
+33
+23.3578379968868
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130182929858
+20
+-621.15990220955
+30
+23.5733173858747
+11
+791.767077835926
+21
+-596.364536149864
+31
+23.3578380035618
+12
+787.130186503031
+22
+-618.467587074047
+32
+32.066456918151
+13
+787.130186503031
+23
+-618.467587074047
+33
+32.066456918151
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024169157982
+20
+-628.985710803041
+30
+62.1423838125873
+11
+767.829332959368
+21
+-655.602108768076
+31
+63.1328050448759
+12
+779.024166993188
+22
+-635.678245979518
+32
+51.9354404084483
+13
+779.024166993188
+23
+-635.678245979518
+33
+51.9354404084483
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829332959368
+20
+-655.602108768076
+30
+63.1328050448759
+11
+779.024169157982
+21
+-628.985710803041
+31
+62.1423838125873
+12
+767.829335677824
+22
+-647.197908223015
+32
+75.9502497139702
+13
+767.829335677824
+23
+-647.197908223015
+33
+75.9502497139702
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630427178961
+20
+-769.542842319152
+30
+91.5903304644009
+11
+464.090784277369
+21
+-758.12892025415
+31
+120.753730687408
+12
+464.090775113584
+22
+-771.603559996758
+32
+92.4022555870175
+13
+464.090775113584
+23
+-771.603559996758
+33
+92.4022555870175
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090784277369
+20
+-758.12892025415
+30
+120.753730687408
+11
+466.630427178961
+21
+-769.542842319152
+31
+91.5903304644009
+12
+466.630436254431
+22
+-756.198062094967
+32
+119.668573109345
+13
+466.630436254431
+23
+-756.198062094967
+33
+119.668573109345
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575566723046
+20
+-722.299342389133
+30
+100.617239704551
+11
+454.431275216977
+21
+-705.386140960936
+31
+120.066621251022
+12
+454.431270729568
+22
+-719.25912090813
+32
+98.9086120013344
+13
+454.431270729568
+23
+-719.25912090813
+33
+98.9086120013344
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431275216977
+20
+-705.386140960936
+30
+120.066621251022
+11
+453.575566723046
+21
+-722.299342389133
+31
+100.617239704551
+12
+453.575571294939
+22
+-708.165176005556
+32
+122.173590554812
+13
+453.575571294939
+23
+-708.165176005556
+33
+122.173590554812
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0
+20
+-549.622587401036
+30
+242.726639240051
+11
+93.5308854426706
+21
+-280.294079999998
+31
+242.726639192693
+12
+0.000487681863777811
+22
+-280.294079999998
+32
+242.726639192693
+13
+0.000487681863777811
+23
+-280.294079999998
+33
+242.726639192693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.5308854426706
+20
+-280.294079999998
+30
+242.726639192693
+11
+0.0
+21
+-549.622587401036
+31
+242.726639240051
+12
+448.31772029492
+22
+-549.622454002523
+32
+242.726639240051
+13
+448.31772029492
+23
+-549.622454002523
+33
+242.726639240051
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.5308854426706
+20
+-280.294079999998
+30
+242.726639192693
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+93.530885442671
+22
+-186.862719999999
+32
+242.726639240051
+13
+93.530885442671
+23
+-186.862719999999
+33
+242.726639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.31772029492
+20
+-186.86272
+30
+242.726639240051
+11
+93.5308854426706
+21
+-280.294079999998
+31
+242.726639192693
+12
+448.31772029492
+22
+-549.622454002523
+32
+242.726639240051
+13
+448.31772029492
+23
+-549.622454002523
+33
+242.726639240051
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884068906774
+20
+-549.087494127121
+30
+210.885907146698
+11
+673.957327625231
+21
+-186.86272
+31
+202.779879874335
+12
+649.884068906774
+22
+-186.86272
+32
+210.885907146698
+13
+649.884068906774
+23
+-186.86272
+33
+210.885907146698
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957327625231
+20
+-186.86272
+30
+202.779879874335
+11
+649.884068906774
+21
+-549.087494127121
+31
+210.885907146698
+12
+673.957327625231
+22
+-548.951311917762
+32
+202.779879874335
+13
+673.957327625231
+23
+-548.951311917762
+33
+202.779879874335
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758800443365
+20
+-717.703482376537
+30
+98.03426599948
+11
+673.957381179691
+21
+-712.905797682657
+31
+125.767734693656
+12
+673.957376463676
+22
+-727.485522237732
+32
+103.531852556699
+13
+673.957376463676
+23
+-727.485522237732
+33
+103.531852556699
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957381179691
+20
+-712.905797682657
+30
+125.767734693656
+11
+696.758800443365
+21
+-717.703482376537
+31
+98.03426599948
+12
+696.758804887548
+22
+-703.964135051352
+32
+118.98846898236
+13
+696.758804887548
+23
+-703.964135051352
+33
+118.98846898236
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162901478210909
+20
+-750.104622950446
+30
+83.93183291483
+11
+429.267752143919
+21
+-758.636493889386
+31
+57.017103815686
+12
+0.0162788245333154
+22
+-758.636496454861
+32
+57.0173045265452
+13
+0.0162788245333154
+23
+-758.636496454861
+33
+57.0173045265452
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267752143919
+20
+-758.636493889386
+30
+57.017103815686
+11
+0.0162901478210909
+21
+-750.104622950446
+31
+83.93183291483
+12
+429.267763467221
+22
+-750.104609262675
+32
+83.9316672902124
+13
+429.267763467221
+23
+-750.104609262675
+33
+83.9316672902124
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797676017751
+20
+-726.7957138545
+30
+74.7479370250946
+11
+454.667765582876
+21
+-713.015957461653
+31
+95.3999068495287
+12
+454.667758482489
+22
+-723.456530152174
+32
+73.4322964107047
+13
+454.667758482489
+23
+-723.456530152174
+33
+73.4322964107047
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667765582876
+20
+-713.015957461653
+30
+95.3999068495287
+11
+454.797676017751
+21
+-726.7957138545
+31
+74.7479370250946
+12
+454.797683261242
+22
+-716.144716838612
+32
+97.1582932541697
+13
+454.797683261242
+23
+-716.144716838612
+33
+97.1582932541697
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884100288402
+20
+-605.713302275367
+30
+205.206224873295
+11
+673.957368701467
+21
+-629.139245228331
+31
+189.276665394806
+12
+673.957358037872
+22
+-603.792752711355
+32
+197.311473394829
+13
+673.957358037872
+23
+-603.792752711355
+33
+197.311473394829
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957368701467
+20
+-629.139245228331
+30
+189.276665394806
+11
+649.884100288402
+21
+-605.713302275367
+31
+205.206224873295
+12
+649.884111397057
+22
+-632.11766596993
+32
+196.836072967405
+13
+649.884111397057
+23
+-632.11766596993
+33
+196.836072967405
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021379319153
+20
+-712.807071282992
+30
+69.2363238103713
+11
+684.332877982946
+21
+-710.625470617764
+31
+45.3374518452758
+12
+665.021370191738
+22
+-719.684397959595
+32
+47.5412056189011
+13
+665.021370191738
+23
+-719.684397959595
+33
+47.5412056189011
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332877982946
+20
+-710.625470617764
+30
+45.3374518452758
+11
+665.021379319153
+21
+-712.807071282992
+31
+69.2363238103713
+12
+684.332886599671
+22
+-704.132938548301
+32
+65.8187023707334
+13
+684.332886599671
+23
+-704.132938548301
+33
+65.8187023707334
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363068074693
+20
+-547.889717752797
+30
+139.587654990762
+11
+732.466031085639
+21
+-186.86272
+31
+123.445905477124
+12
+732.466031085639
+22
+-547.618544534505
+32
+123.445905477124
+13
+732.466031085639
+23
+-547.618544534505
+33
+123.445905477124
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466031085639
+20
+-186.86272
+30
+123.445905477124
+11
+718.363068074693
+21
+-547.889717752797
+31
+139.587654990762
+12
+718.363068074693
+22
+-186.86272
+32
+139.587654990762
+13
+718.363068074693
+23
+-186.86272
+33
+139.587654990762
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.02138596315
+20
+-703.037584126794
+30
+89.7919287945006
+11
+684.332886599671
+21
+-704.132938548301
+31
+65.8187023707334
+12
+665.021379319153
+22
+-712.807071282992
+32
+69.2363238103713
+13
+665.021379319153
+23
+-712.807071282992
+33
+69.2363238103713
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332886599671
+20
+-704.132938548301
+30
+65.8187023707334
+11
+665.02138596315
+21
+-703.037584126794
+31
+89.7919287945006
+12
+684.332892871929
+22
+-694.910065817882
+32
+85.2241968080869
+13
+684.332892871929
+23
+-694.910065817882
+33
+85.2241968080869
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130190684252
+20
+-609.757662381006
+30
+47.5643349390529
+11
+779.024166993188
+21
+-635.678245979518
+31
+51.9354404084483
+12
+787.130189104003
+22
+-614.643057664062
+32
+40.1135032517926
+13
+787.130189104003
+23
+-614.643057664062
+33
+40.1135032517926
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024166993188
+20
+-635.678245979518
+30
+51.9354404084483
+11
+787.130190684252
+21
+-609.757662381006
+31
+47.5643349390529
+12
+779.024169157982
+22
+-628.985710803041
+32
+62.1423838125873
+13
+779.024169157982
+23
+-628.985710803041
+33
+62.1423838125873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739272918395
+20
+-589.30932977233
+30
+137.774660970991
+11
+736.997685757261
+21
+-613.69735635364
+31
+150.084181819366
+12
+753.739280225648
+22
+-606.678073483521
+32
+132.268789859729
+13
+753.739280225648
+23
+-606.678073483521
+33
+132.268789859729
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997685757261
+20
+-613.69735635364
+30
+150.084181819366
+11
+753.739272918395
+21
+-589.30932977233
+31
+137.774660970991
+12
+736.997677401125
+22
+-593.835505140242
+32
+156.380365045419
+13
+736.997677401125
+23
+-593.835505140242
+33
+156.380365045419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269956337624
+20
+-581.352493258009
+30
+238.618284093782
+11
+464.090762524528
+21
+-612.101685596006
+31
+231.466577935614
+12
+464.090746745054
+22
+-581.165076540648
+32
+236.786190394896
+13
+464.090746745054
+23
+-581.165076540648
+33
+236.786190394896
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090762524528
+20
+-612.101685596006
+30
+231.466577935614
+11
+461.269956337624
+21
+-581.352493258009
+31
+238.618284093782
+12
+461.269972243544
+22
+-612.537006285544
+32
+233.256044045395
+13
+461.269972243544
+23
+-612.537006285544
+33
+233.256044045395
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221351073972
+20
+-693.120266957808
+30
+61.4796955534277
+11
+718.363090933403
+21
+-685.388881228845
+31
+39.1981879427727
+12
+702.221343105619
+22
+-699.12426393804
+32
+42.5395709625037
+13
+702.221343105619
+23
+-699.12426393804
+33
+42.5395709625037
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363090933403
+20
+-685.388881228845
+30
+39.1981879427727
+11
+702.221351073972
+21
+-693.120266957808
+31
+61.4796955534277
+12
+718.363098127435
+22
+-679.968320245868
+32
+56.297813526916
+13
+718.363098127435
+23
+-679.968320245868
+33
+56.297813526916
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838940960221
+20
+-749.833439201604
+30
+83.824824767603
+11
+436.335601310833
+21
+-757.591910929275
+31
+56.7629871862785
+12
+432.838929652884
+22
+-758.353294490404
+32
+56.9482088735863
+13
+432.838929652884
+23
+-758.353294490404
+33
+56.9482088735863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335601310833
+20
+-757.591910929275
+30
+56.7629871862785
+11
+432.838940960221
+21
+-749.833439201604
+31
+83.824824767603
+12
+436.335612575248
+22
+-749.104396759147
+32
+83.5375802413299
+13
+436.335612575248
+23
+-749.104396759147
+33
+83.5375802413299
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317755482775
+20
+-785.839646973143
+30
+63.6347444795237
+11
+4.80447490185498e-05
+21
+-776.152270645783
+31
+94.1946239307526
+12
+3.51879034228841e-05
+22
+-785.839649652569
+32
+63.6349541054433
+13
+3.51879034228841e-05
+23
+-785.839649652569
+33
+63.6349541054433
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+4.80447490185498e-05
+20
+-776.152270645783
+30
+94.1946239307526
+11
+448.317755482775
+21
+-785.839646973143
+31
+63.6347444795237
+12
+448.317768339636
+22
+-776.152256350036
+32
+94.1944509495159
+13
+448.317768339636
+23
+-776.152256350036
+33
+94.1944509495159
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247009199941
+20
+-725.20697903804
+30
+102.251353856666
+11
+453.575571294939
+21
+-708.165176005556
+31
+122.173590554812
+12
+453.575566723046
+22
+-722.299342389133
+32
+100.617239704551
+13
+453.575566723046
+23
+-722.299342389133
+33
+100.617239704551
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575571294939
+20
+-708.165176005556
+30
+122.173590554812
+11
+452.247009199941
+21
+-725.20697903804
+31
+102.251353856666
+12
+452.247013852634
+22
+-710.823016652003
+32
+124.188674487802
+13
+452.247013852634
+23
+-710.823016652003
+33
+124.188674487802
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201826420081
+20
+-607.845772298605
+30
+36.2933847183422
+11
+764.031425007948
+21
+-586.699189190326
+31
+30.0821938636906
+12
+764.031424128692
+22
+-589.417441849078
+32
+25.9365225576139
+13
+764.031424128692
+23
+-589.417441849078
+33
+25.9365225576139
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031425007948
+20
+-586.699189190326
+30
+30.0821938636906
+11
+760.201826420081
+21
+-607.845772298605
+31
+36.2933847183422
+12
+760.20182781144
+22
+-603.54433558335
+32
+42.8536074069585
+13
+760.20182781144
+23
+-603.54433558335
+33
+42.8536074069585
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839490392048
+20
+-719.276356082042
+30
+130.597708279963
+11
+445.721740244506
+21
+-732.59492990622
+31
+106.403439896738
+12
+442.839485482368
+22
+-734.454801614587
+32
+107.448702644845
+13
+442.839485482368
+23
+-734.454801614587
+33
+107.448702644845
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721740244506
+20
+-732.59492990622
+30
+106.403439896738
+11
+442.839490392048
+21
+-719.276356082042
+31
+130.597708279963
+12
+445.721745102502
+22
+-717.576266444547
+32
+129.308758123214
+13
+445.721745102502
+23
+-717.576266444547
+33
+129.308758123214
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363081916203
+20
+-571.142011532184
+30
+138.806193017976
+11
+702.221318561055
+21
+-548.126641526877
+31
+153.690618001708
+12
+718.363068074693
+22
+-547.889717752797
+32
+139.587654990762
+13
+718.363068074693
+23
+-547.889717752797
+33
+139.587654990762
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221318561055
+20
+-548.126641526877
+30
+153.690618001708
+11
+718.363081916203
+21
+-571.142011532184
+31
+138.806193017976
+12
+702.221333117862
+22
+-572.580560654599
+32
+152.868771861916
+13
+702.221333117862
+23
+-572.580560654599
+33
+152.868771861916
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335625756533
+20
+-721.646389233184
+30
+132.394587199654
+11
+439.690615872653
+21
+-735.948583762681
+31
+108.288220362449
+12
+436.335620774804
+22
+-737.047580997407
+32
+108.905866027708
+13
+436.335620774804
+23
+-737.047580997407
+33
+108.905866027708
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690615872653
+20
+-735.948583762681
+30
+108.288220362449
+11
+436.335625756533
+21
+-721.646389233184
+31
+132.394587199654
+12
+439.690620823844
+22
+-720.64180705444
+32
+131.632946903436
+13
+439.690620823844
+23
+-720.64180705444
+33
+131.632946903436
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363068074693
+20
+-186.86272
+30
+139.587654990762
+11
+702.221318561055
+21
+-548.126641526877
+31
+153.690618001708
+12
+702.221318561055
+22
+-186.86272
+32
+153.690618001708
+13
+702.221318561055
+23
+-186.86272
+33
+153.690618001708
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221318561055
+20
+-548.126641526877
+30
+153.690618001708
+11
+718.363068074693
+21
+-186.86272
+31
+139.587654990762
+12
+718.363068074693
+22
+-547.889717752797
+32
+139.587654990762
+13
+718.363068074693
+23
+-547.889717752797
+33
+139.587654990762
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717763908762
+20
+-752.465074828487
+30
+84.861675745457
+11
+473.642053400866
+21
+-764.379514823734
+31
+58.4141748490874
+12
+473.717752446486
+22
+-761.101673808691
+32
+57.6167818413605
+13
+473.717752446486
+23
+-761.101673808691
+33
+57.6167818413605
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642053400866
+20
+-764.379514823734
+30
+58.4141748490874
+11
+473.717763908762
+21
+-752.465074828487
+31
+84.861675745457
+12
+473.642065047928
+22
+-755.603683334388
+32
+86.0982896720056
+13
+473.642065047928
+23
+-755.603683334388
+33
+86.0982896720056
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+629.962604584718
+20
+-661.494594174546
+30
+5.83945951983435
+11
+617.23954941635
+21
+-667.162466046757
+31
+-1.62430069394759e-12
+12
+617.239549416349
+22
+-667.162466046756
+32
+5.83945951983507
+13
+617.239549416349
+23
+-667.162466046756
+33
+5.83945951983507
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+617.23954941635
+20
+-667.162466046757
+30
+-1.62430069394759e-12
+11
+629.962604584718
+21
+-661.494594174546
+31
+5.83945951983435
+12
+629.962604584718
+22
+-661.494594174547
+32
+-2.52668996836292e-12
+13
+629.962604584718
+23
+-661.494594174547
+33
+-2.52668996836292e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133279596418
+20
+-599.869415774734
+30
+181.183685835358
+11
+454.667736501664
+21
+-575.898831573499
+31
+185.305488978394
+12
+602.133267369982
+22
+-575.898750159264
+32
+185.30549023988
+13
+602.133267369982
+23
+-575.898750159264
+33
+185.30549023988
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667736501664
+20
+-575.898831573499
+30
+185.305488978394
+11
+602.133279596418
+21
+-599.869415774734
+31
+181.183685835358
+12
+454.667748728094
+22
+-599.869484727166
+32
+181.183686716704
+13
+454.667748728094
+23
+-599.869484727166
+33
+181.183686716704
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275046789786
+20
+-652.245630435845
+30
+31.1354921818382
+11
+753.576407084801
+21
+-630.223630997654
+31
+36.698358790781
+12
+753.576402819491
+22
+-633.437457700021
+32
+26.5600661905556
+13
+753.576402819491
+23
+-633.437457700021
+33
+26.5600661905556
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576407084801
+20
+-630.223630997654
+30
+36.698358790781
+11
+744.275046789786
+21
+-652.245630435845
+31
+31.1354921818382
+12
+744.275052115393
+22
+-648.23289118406
+32
+43.7940230954864
+13
+744.275052115393
+23
+-648.23289118406
+33
+43.7940230954864
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840126975903
+20
+-580.680624318909
+30
+232.050409880217
+11
+466.630414711229
+21
+-611.578139745845
+31
+229.314444371434
+12
+468.840142428527
+22
+-610.976425980055
+32
+226.840985547634
+13
+468.840142428527
+23
+-610.976425980055
+33
+226.840985547634
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630414711229
+20
+-611.578139745845
+30
+229.314444371434
+11
+468.840126975903
+21
+-580.680624318909
+31
+232.050409880217
+12
+466.630399083827
+22
+-580.939676928926
+32
+234.582789982374
+13
+466.630399083827
+23
+-580.939676928926
+33
+234.582789982374
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282004539076
+20
+-742.014746414944
+30
+80.7442486966709
+11
+450.471119570638
+21
+-727.926175547966
+31
+103.779563345764
+12
+450.471111788281
+22
+-739.369532914357
+32
+79.7020319508277
+13
+450.471111788281
+23
+-739.369532914357
+33
+79.7020319508277
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471119570638
+20
+-727.926175547966
+30
+103.779563345764
+11
+448.282004539076
+21
+-742.014746414944
+31
+80.7442486966709
+12
+448.282012434797
+22
+-730.404696521621
+32
+105.17251147419
+13
+448.282012434797
+23
+-730.404696521621
+33
+105.17251147419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090746745054
+20
+-581.165076540648
+30
+236.786190394896
+11
+466.630414711229
+21
+-611.578139745845
+31
+229.314444371434
+12
+466.630399083827
+22
+-580.939676928926
+32
+234.582789982374
+13
+466.630399083827
+23
+-580.939676928926
+33
+234.582789982374
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630414711229
+20
+-611.578139745845
+30
+229.314444371434
+11
+464.090746745054
+21
+-581.165076540648
+31
+236.786190394896
+12
+464.090762524528
+22
+-612.101685596006
+32
+231.466577935614
+13
+464.090762524528
+23
+-612.101685596006
+33
+231.466577935614
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222214863865
+20
+-581.498326831209
+30
+240.043876806793
+11
+461.269972243544
+21
+-612.537006285544
+31
+233.256044045395
+12
+461.269956337624
+22
+-581.352493258009
+32
+238.618284093782
+13
+461.269956337624
+23
+-581.352493258009
+33
+238.618284093782
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269972243544
+20
+-612.537006285544
+30
+233.256044045395
+11
+458.222214863865
+21
+-581.498326831209
+31
+240.043876806793
+12
+458.222230868175
+22
+-612.875739362874
+32
+234.648467298763
+13
+458.222230868175
+23
+-612.875739362874
+33
+234.648467298763
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339903
+20
+-186.86272
+30
+2030.58313313969
+11
+100.155807358117
+21
+-280.294079999999
+31
+2052.97755335166
+12
+100.155807358117
+22
+-186.862719999999
+32
+2052.97755335166
+13
+100.155807358117
+23
+-186.862719999999
+33
+2052.97755335166
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-280.294079999999
+30
+2052.97755335166
+11
+127.443487339903
+21
+-186.86272
+31
+2030.58313313969
+12
+127.443487339902
+22
+-280.29408
+32
+2030.58313313969
+13
+127.443487339902
+23
+-280.29408
+33
+2030.58313313969
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.2381055728783
+20
+-280.29408
+30
+1394.27106395937
+11
+69.0138872107926
+21
+-186.86272
+31
+1404.51683530547
+12
+35.2381055728787
+22
+-186.86272
+32
+1394.27106395937
+13
+35.2381055728787
+23
+-186.86272
+33
+1394.27106395937
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.0138872107926
+20
+-186.86272
+30
+1404.51683530547
+11
+35.2381055728783
+21
+-280.29408
+31
+1394.27106395937
+12
+69.0138872107921
+22
+-280.29408
+32
+1404.51683530547
+13
+69.0138872107921
+23
+-280.29408
+33
+1404.51683530547
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690615872653
+20
+-735.948583762681
+30
+108.288220362449
+11
+442.839477401402
+21
+-746.337240593148
+31
+82.4473163912804
+12
+439.690607723364
+22
+-747.931486742049
+32
+83.0754516399063
+13
+439.690607723364
+23
+-747.931486742049
+33
+83.0754516399063
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839477401402
+20
+-746.337240593148
+30
+82.4473163912804
+11
+439.690615872653
+21
+-735.948583762681
+31
+108.288220362449
+12
+442.839485482368
+22
+-734.454801614587
+32
+107.448702644845
+13
+442.839485482368
+23
+-734.454801614587
+33
+107.448702644845
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602098887118
+20
+-549.195708452133
+30
+217.326639240051
+11
+624.955307916438
+21
+-578.912147406784
+31
+214.763348941721
+12
+624.955290211342
+22
+-549.169431970937
+32
+215.762940693873
+13
+624.955290211342
+23
+-549.169431970937
+33
+215.762940693873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955307916438
+20
+-578.912147406784
+30
+214.763348941721
+11
+599.602098887118
+21
+-549.195708452133
+31
+217.326639240051
+12
+599.602116671527
+22
+-579.071662867255
+32
+216.322569598682
+13
+599.602116671527
+23
+-579.071662867255
+33
+216.322569598682
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+3.51879034228841e-05
+20
+-613.257541505822
+30
+236.217062269571
+11
+448.317768339636
+21
+-643.81703834892
+31
+226.52966896396
+12
+448.317755482775
+22
+-613.257331879904
+32
+236.217059590145
+13
+448.317755482775
+23
+-613.257331879904
+33
+236.217059590145
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317768339636
+20
+-643.81703834892
+30
+226.52966896396
+11
+3.51879034228841e-05
+21
+-613.257541505822
+31
+236.217062269571
+12
+4.80447490185498e-05
+22
+-643.817211330157
+32
+226.529683259707
+13
+4.80447490185498e-05
+23
+-643.817211330157
+33
+226.529683259707
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717738079349
+20
+-579.071732366754
+30
+216.322568521811
+11
+599.602131038669
+21
+-607.239310377804
+31
+211.479085673936
+12
+599.602116671527
+22
+-579.071662867255
+32
+216.322569598682
+13
+599.602116671527
+23
+-579.071662867255
+33
+216.322569598682
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602131038669
+20
+-607.239310377804
+30
+211.479085673936
+11
+473.717738079349
+21
+-579.071732366754
+31
+216.322568521811
+12
+473.717752446486
+22
+-607.239369239249
+32
+211.479086426299
+13
+473.717752446486
+23
+-607.239369239249
+33
+211.479086426299
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024163430099
+20
+-640.917494008958
+30
+40.9117386331972
+11
+767.82932233817
+21
+-666.812843070624
+31
+34.6792140832892
+12
+779.024158535186
+22
+-644.605714246329
+32
+29.2769308468913
+13
+779.024158535186
+23
+-644.605714246329
+33
+29.2769308468913
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.82932233817
+20
+-666.812843070624
+30
+34.6792140832892
+11
+779.024163430099
+21
+-640.917494008958
+31
+40.9117386331972
+12
+767.829328484993
+22
+-662.181333229905
+32
+49.2897100106075
+13
+767.829328484993
+23
+-662.181333229905
+33
+49.2897100106075
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717738079349
+20
+-579.071732366754
+30
+216.322568521811
+11
+473.642053400866
+21
+-608.036762247305
+31
+214.756927441262
+12
+473.717752446486
+22
+-607.239369239249
+32
+211.479086426299
+13
+473.717752446486
+23
+-607.239369239249
+33
+211.479086426299
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642053400866
+20
+-608.036762247305
+30
+214.756927441262
+11
+473.717738079349
+21
+-579.071732366754
+31
+216.322568521811
+12
+473.642038802113
+22
+-579.415028713919
+32
+219.67849237548
+13
+473.642038802113
+23
+-579.415028713919
+33
+219.67849237548
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021391353748
+20
+-675.601700530057
+30
+125.979113140781
+11
+684.332896682708
+21
+-683.128909470703
+31
+103.191916498769
+12
+665.021389999784
+22
+-690.558190885324
+32
+108.824546057595
+13
+665.021389999784
+23
+-690.558190885324
+33
+108.824546057595
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332896682708
+20
+-683.128909470703
+30
+103.191916498769
+11
+665.021391353748
+21
+-675.601700530057
+31
+125.979113140781
+12
+684.332897960916
+22
+-669.009252539392
+32
+119.38666515078
+13
+684.332897960916
+23
+-669.009252539392
+33
+119.38666515078
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201817040574
+20
+-563.621650860098
+30
+65.2904582517363
+11
+764.031409168954
+21
+-546.296855411639
+31
+44.7709041931231
+12
+764.0314182014
+22
+-561.470422367227
+32
+44.2609516834995
+13
+764.0314182014
+23
+-561.470422367227
+33
+44.2609516834995
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031409168954
+20
+-546.296855411639
+30
+44.7709041931231
+11
+760.201817040574
+21
+-563.621650860098
+31
+65.2904582517363
+12
+760.201806938459
+22
+-546.651150672583
+32
+65.8608020071314
+13
+760.201806938459
+23
+-546.651150672583
+33
+65.8608020071314
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006069025402
+20
+-581.599775817026
+30
+241.035583090668
+11
+458.222230868175
+21
+-612.875739362874
+31
+234.648467298763
+12
+458.222214863865
+22
+-581.498326831209
+32
+240.043876806793
+13
+458.222214863865
+23
+-581.498326831209
+33
+240.043876806793
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222230868175
+20
+-612.875739362874
+30
+234.648467298763
+11
+455.006069025402
+21
+-581.599775817026
+31
+241.035583090668
+12
+455.006085098156
+22
+-613.111377811381
+32
+235.617099433291
+13
+455.006085098156
+23
+-613.111377811381
+33
+235.617099433291
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431253196946
+20
+-601.562294416642
+30
+188.142314217608
+11
+454.797653593913
+21
+-576.264066422956
+31
+188.875875742312
+12
+454.797666066761
+22
+-600.71783565349
+32
+184.671000694682
+13
+454.797666066761
+23
+-600.71783565349
+33
+184.671000694682
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797653593913
+20
+-576.264066422956
+30
+188.875875742312
+11
+454.431253196946
+21
+-601.562294416642
+31
+188.142314217608
+12
+454.431240478811
+22
+-576.627625779333
+32
+192.429880890276
+13
+454.431240478811
+23
+-576.627625779333
+33
+192.429880890276
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.20182098394
+20
+-571.352859264312
+30
+63.961061339529
+11
+764.0314182014
+21
+-561.470422367227
+31
+44.2609516834995
+12
+764.031420693374
+22
+-566.35608713258
+32
+43.4208517516957
+13
+764.031420693374
+23
+-566.35608713258
+33
+43.4208517516957
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.0314182014
+20
+-561.470422367227
+30
+44.2609516834995
+11
+760.20182098394
+21
+-571.352859264312
+31
+63.961061339529
+12
+760.201817040574
+22
+-563.621650860098
+32
+65.2904582517363
+13
+760.201817040574
+23
+-563.621650860098
+33
+65.2904582517363
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.10173725466
+20
+-608.824016722648
+30
+217.993091128508
+11
+472.107195414063
+21
+-638.12348215123
+31
+212.079066347413
+12
+473.101749084159
+22
+-636.941767787464
+32
+209.079797462849
+13
+473.101749084159
+23
+-636.941767787464
+33
+209.079797462849
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107195414063
+20
+-638.12348215123
+30
+212.079066347413
+11
+473.10173725466
+21
+-608.824016722648
+31
+217.993091128508
+12
+472.107183407982
+22
+-609.586009613252
+32
+221.125411221167
+13
+472.107183407982
+23
+-609.586009613252
+33
+221.125411221167
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717763908762
+20
+-634.484263142475
+30
+202.842487443351
+11
+473.64207352602
+21
+-661.950912950484
+31
+193.514715177954
+12
+473.717772252345
+22
+-660.298147720458
+32
+190.573891403664
+13
+473.717772252345
+23
+-660.298147720458
+33
+190.573891403664
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.64207352602
+20
+-661.950912950484
+30
+193.514715177954
+11
+473.717763908762
+21
+-634.484263142475
+31
+202.842487443351
+12
+473.642065047928
+22
+-635.720877069339
+32
+205.981095949127
+13
+473.642065047928
+23
+-635.720877069339
+33
+205.981095949127
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636259351108
+20
+-708.826870972768
+30
+93.0455572990973
+11
+665.021379319153
+21
+-712.807071282992
+31
+69.2363238103713
+12
+644.636252442318
+22
+-718.985715046116
+32
+71.6707212889357
+13
+644.636252442318
+23
+-718.985715046116
+33
+71.6707212889357
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021379319153
+20
+-712.807071282992
+30
+69.2363238103713
+11
+644.636259351108
+21
+-708.826870972768
+31
+93.0455572990973
+12
+665.02138596315
+22
+-703.037584126794
+32
+89.7919287945006
+13
+665.02138596315
+23
+-703.037584126794
+33
+89.7919287945006
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201824130007
+20
+-611.213150017197
+30
+29.2082138072124
+11
+764.031423295207
+21
+-590.643016368677
+31
+23.3578379961104
+12
+763.093075318335
+22
+-596.364508960869
+32
+23.3578379945534
+13
+763.093075318335
+23
+-596.364508960869
+33
+23.3578379945534
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031423295207
+20
+-590.643016368677
+30
+23.3578379961104
+11
+760.201824130007
+21
+-611.213150017197
+31
+29.2082138072124
+12
+764.031424128692
+22
+-589.417441849078
+32
+25.9365225576139
+13
+764.031424128692
+23
+-589.417441849078
+33
+25.9365225576139
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031424128692
+20
+-589.417441849078
+30
+25.9365225576139
+11
+760.201824130007
+21
+-611.213150017197
+31
+29.2082138072124
+12
+760.201826420081
+22
+-607.845772298605
+32
+36.2933847183422
+13
+760.201826420081
+23
+-607.845772298605
+33
+36.2933847183422
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282017231929
+20
+-715.574196634022
+30
+127.790856991425
+11
+450.471125884842
+21
+-695.789522350054
+31
+146.166934958744
+12
+450.471124298894
+22
+-713.308606140826
+32
+126.073163560098
+13
+450.471124298894
+23
+-713.308606140826
+33
+126.073163560098
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471125884842
+20
+-695.789522350054
+30
+146.166934958744
+11
+448.282017231929
+21
+-715.574196634022
+31
+127.790856991425
+12
+448.282018840978
+22
+-697.799916727886
+32
+148.177329336375
+13
+448.282018840978
+23
+-697.799916727886
+33
+148.177329336375
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758793128571
+20
+-728.459323997255
+30
+75.4033102397292
+11
+673.957376463676
+21
+-727.485522237732
+31
+103.531852556699
+12
+673.957368701467
+22
+-738.899252779403
+32
+79.5166578326792
+13
+673.957368701467
+23
+-738.899252779403
+33
+79.5166578326792
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957376463676
+20
+-727.485522237732
+30
+103.531852556699
+11
+696.758793128571
+21
+-728.459323997255
+31
+75.4033102397292
+12
+696.758800443365
+22
+-717.703482376537
+32
+98.03426599948
+13
+696.758800443365
+23
+-717.703482376537
+33
+98.03426599948
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884119483233
+20
+-734.56856186502
+30
+107.512580906988
+11
+624.955346864755
+21
+-723.275770827742
+31
+133.629900413365
+12
+624.955341833487
+22
+-738.830110282484
+32
+109.907610082888
+13
+624.955341833487
+23
+-738.830110282484
+33
+109.907610082888
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955346864755
+20
+-723.275770827742
+30
+133.629900413365
+11
+649.884119483233
+21
+-734.56856186502
+31
+107.512580906988
+12
+649.884124396077
+22
+-719.380332193364
+32
+130.67650856366
+13
+649.884124396077
+23
+-719.380332193364
+33
+130.67650856366
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107195414063
+20
+-761.701653732916
+30
+88.5008947532808
+11
+470.677497105752
+21
+-773.716303656482
+31
+60.6855157395589
+12
+472.107183407982
+22
+-770.747998603796
+32
+59.9634222143927
+13
+472.107183407982
+23
+-770.747998603796
+33
+59.9634222143927
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677497105752
+20
+-773.716303656482
+30
+60.6855157395589
+11
+472.107195414063
+21
+-761.701653732916
+31
+88.5008947532808
+12
+470.677509279169
+22
+-764.543874438695
+32
+89.6207321892548
+13
+470.677509279169
+23
+-764.543874438695
+33
+89.6207321892548
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267752143919
+20
+-758.636493889386
+30
+57.017103815686
+11
+432.838915479952
+21
+-763.131305674907
+31
+29.1613230247316
+12
+429.267737950976
+22
+-763.421251234373
+32
+29.1909851596944
+13
+429.267737950976
+23
+-763.421251234373
+33
+29.1909851596944
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838915479952
+20
+-763.131305674907
+30
+29.1613230247316
+11
+429.267752143919
+21
+-758.636493889386
+31
+57.017103815686
+12
+432.838929652884
+22
+-758.353294490404
+32
+56.9482088735863
+13
+432.838929652884
+23
+-758.353294490404
+33
+56.9482088735863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267778397118
+20
+-703.948312537967
+30
+154.325725145835
+11
+432.838954191733
+21
+-722.270804730449
+31
+132.867998161508
+12
+429.267776717416
+22
+-722.503058608961
+32
+133.044085628428
+13
+429.267776717416
+23
+-722.503058608961
+33
+133.044085628428
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838954191733
+20
+-722.270804730449
+30
+132.867998161508
+11
+429.267778397118
+21
+-703.948312537967
+31
+154.325725145835
+12
+432.838955869068
+22
+-703.742219504346
+32
+154.119632112235
+13
+432.838955869068
+23
+-703.742219504346
+33
+154.119632112235
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721721263973
+20
+-752.62898843986
+30
+55.5556638784362
+11
+448.281980096118
+21
+-754.771251996272
+31
+28.306117626709
+12
+445.721707495526
+22
+-757.270638693351
+32
+28.5617953495419
+13
+445.721707495526
+23
+-757.270638693351
+33
+28.5617953495419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281980096118
+20
+-754.771251996272
+30
+28.306117626709
+11
+445.721721263973
+21
+-752.62898843986
+31
+55.5556638784362
+12
+448.281993692064
+22
+-750.187755353023
+32
+54.9617894316777
+13
+448.281993692064
+23
+-750.187755353023
+33
+54.9617894316777
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222258577851
+20
+-743.526108574926
+30
+148.983037664963
+11
+455.006114828511
+21
+-723.308225016813
+31
+173.685637622731
+12
+455.006112926336
+22
+-744.320489807817
+32
+149.585310783685
+13
+455.006112926336
+23
+-744.320489807817
+33
+149.585310783685
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006114828511
+20
+-723.308225016813
+30
+173.685637622731
+11
+458.222258577851
+21
+-743.526108574926
+31
+148.983037664963
+12
+458.222260471925
+22
+-722.603322716877
+32
+172.980735322867
+13
+458.222260471925
+23
+-722.603322716877
+33
+172.980735322867
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282018840978
+20
+-697.799916727886
+30
+148.177329336375
+11
+450.471124298894
+21
+-675.695750953173
+31
+163.686018751541
+12
+450.471125884842
+22
+-695.789522350054
+32
+146.166934958744
+13
+450.471125884842
+23
+-695.789522350054
+33
+146.166934958744
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471124298894
+20
+-675.695750953173
+30
+163.686018751541
+11
+448.282018840978
+21
+-697.799916727886
+31
+148.177329336375
+12
+448.282017231929
+22
+-677.413444384727
+32
+165.951609244563
+13
+448.282017231929
+23
+-677.413444384727
+33
+165.951609244563
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107211244211
+20
+-712.762199391597
+30
+163.139611998578
+11
+470.677523524142
+21
+-734.870094172174
+31
+142.420342197022
+12
+472.107209463225
+22
+-732.435769686289
+32
+140.574720545467
+13
+472.107209463225
+23
+-732.435769686289
+33
+140.574720545467
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677523524142
+20
+-734.870094172174
+30
+142.420342197022
+11
+472.107211244211
+21
+-712.762199391597
+31
+163.139611998578
+12
+470.677525329952
+22
+-714.922321501014
+32
+165.299734107777
+13
+470.677525329952
+23
+-714.922321501014
+33
+165.299734107777
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677525329952
+20
+-714.922321501014
+30
+165.299734107777
+11
+468.840169183023
+21
+-737.123145968814
+31
+144.128529165728
+12
+470.677523524142
+22
+-734.870094172174
+32
+142.420342197022
+13
+470.677523524142
+23
+-734.870094172174
+33
+142.420342197022
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840169183023
+20
+-737.123145968814
+30
+144.128529165728
+11
+470.677525329952
+21
+-714.922321501014
+31
+165.299734107777
+12
+468.840171011807
+22
+-716.921589517517
+32
+167.299002124079
+13
+468.840171011807
+23
+-716.921589517517
+33
+167.299002124079
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317768339636
+20
+-776.152256350036
+30
+94.1944509495159
+11
+5.74034615733243e-05
+21
+-762.391004206896
+31
+123.149179321074
+12
+4.80447490185498e-05
+22
+-776.152270645783
+32
+94.1946239307526
+13
+4.80447490185498e-05
+23
+-776.152270645783
+33
+94.1946239307526
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+5.74034615733243e-05
+20
+-762.391004206896
+30
+123.149179321074
+11
+448.317768339636
+21
+-776.152256350036
+31
+94.1944509495159
+12
+448.31777769836
+22
+-762.390973409752
+32
+123.149041059795
+13
+448.31777769836
+23
+-762.390973409752
+33
+123.149041059795
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797689138238
+20
+-686.233268095701
+30
+136.610680705353
+11
+454.667769896794
+21
+-665.362499898554
+31
+150.056742450276
+12
+454.667771343765
+22
+-683.695448366281
+32
+134.072860976189
+13
+454.667771343765
+23
+-683.695448366281
+33
+134.072860976189
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667769896794
+20
+-665.362499898554
+30
+150.056742450276
+11
+454.797689138238
+21
+-686.233268095701
+31
+136.610680705353
+12
+454.797687662105
+22
+-667.530828563864
+32
+152.916709017132
+13
+454.797687662105
+23
+-667.530828563864
+33
+152.916709017132
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839477401402
+20
+-632.069903787681
+30
+196.714653208256
+11
+439.690596528004
+21
+-606.087584234742
+31
+206.744381898986
+12
+442.839466299903
+22
+-605.682549578299
+32
+205.079413127562
+13
+442.839466299903
+23
+-605.682549578299
+33
+205.079413127562
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690596528004
+20
+-606.087584234742
+30
+206.744381898986
+11
+442.839477401402
+21
+-632.069903787681
+31
+196.714653208256
+12
+439.690607723364
+22
+-632.698039036468
+32
+198.308899357094
+13
+439.690607723364
+23
+-632.698039036468
+33
+198.308899357094
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282012434797
+20
+-730.404696521621
+30
+105.17251147419
+11
+450.471124298894
+21
+-713.308606140826
+31
+126.073163560098
+12
+450.471119570638
+22
+-727.926175547966
+32
+103.779563345764
+13
+450.471119570638
+23
+-727.926175547966
+33
+103.779563345764
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471124298894
+20
+-713.308606140826
+30
+126.073163560098
+11
+448.282012434797
+21
+-730.404696521621
+31
+105.17251147419
+12
+448.282017231929
+22
+-715.574196634022
+32
+127.790856991425
+13
+448.282017231929
+23
+-715.574196634022
+33
+127.790856991425
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690582495428
+20
+-578.575873947693
+30
+211.475076092305
+11
+436.335569590044
+21
+-549.135217804424
+31
+213.722949367545
+12
+439.690564957562
+22
+-549.114088023756
+32
+212.46522637891
+13
+439.690564957562
+23
+-549.114088023756
+33
+212.46522637891
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335569590044
+20
+-549.135217804424
+30
+213.722949367545
+11
+439.690582495428
+21
+-578.575873947693
+31
+211.475076092305
+12
+436.335587191701
+22
+-578.704166932226
+32
+212.72919754513
+13
+436.335587191701
+23
+-578.704166932226
+33
+212.72919754513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471111788281
+20
+-629.324619346527
+30
+189.746945529741
+11
+452.246991021541
+21
+-603.175034087969
+31
+194.771794391524
+12
+452.247001541956
+22
+-628.181198889296
+32
+186.844869872835
+13
+452.247001541956
+23
+-628.181198889296
+33
+186.844869872835
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246991021541
+20
+-603.175034087969
+30
+194.771794391524
+11
+450.471111788281
+21
+-629.324619346527
+31
+189.746945529741
+12
+450.471101097006
+22
+-603.912334485117
+32
+197.802609624747
+13
+450.471101097006
+23
+-603.912334485117
+33
+197.802609624747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957344671825
+20
+-751.440053094339
+30
+27.9652257853831
+11
+649.884100288402
+21
+-754.828812255533
+31
+56.0907148781112
+12
+649.884086364505
+22
+-759.522868440055
+32
+28.7920756889693
+13
+649.884086364505
+23
+-759.522868440055
+33
+28.7920756889693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884100288402
+20
+-754.828812255533
+30
+56.0907148781112
+11
+673.957344671825
+21
+-751.440053094339
+31
+27.9652257853831
+12
+673.957358037872
+22
+-746.934060776874
+32
+54.170165314894
+13
+673.957358037872
+23
+-746.934060776874
+33
+54.170165314894
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894030194972
+20
+-548.526532054241
+30
+177.494989005398
+11
+736.99765201229
+21
+-186.86272
+31
+160.753391204502
+12
+717.894030194972
+22
+-186.86272
+32
+177.494989005399
+13
+717.894030194972
+23
+-186.86272
+33
+177.494989005399
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.99765201229
+20
+-186.86272
+30
+160.753391204502
+11
+717.894030194972
+21
+-548.526532054241
+31
+177.494989005398
+12
+736.99765201229
+22
+-548.245280356442
+32
+160.753391204502
+13
+736.99765201229
+23
+-548.245280356442
+33
+160.753391204502
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133289350819
+20
+-623.054826905935
+30
+173.833938065877
+11
+454.667748728094
+21
+-599.869484727166
+31
+181.183686716704
+12
+602.133279596418
+22
+-599.869415774734
+32
+181.183685835358
+13
+602.133279596418
+23
+-599.869415774734
+33
+181.183685835358
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667748728094
+20
+-599.869484727166
+30
+181.183686716704
+11
+602.133289350819
+21
+-623.054826905935
+31
+173.833938065877
+12
+454.667758482489
+22
+-623.054883804802
+32
+173.83394276819
+13
+454.667758482489
+23
+-623.054883804802
+33
+173.83394276819
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758804887548
+20
+-703.964135051352
+30
+118.98846898236
+11
+673.957382761532
+21
+-695.432070757716
+31
+145.809483366442
+12
+673.957381179691
+22
+-712.905797682657
+32
+125.767734693656
+13
+673.957381179691
+23
+-712.905797682657
+33
+125.767734693656
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957382761532
+20
+-695.432070757716
+30
+145.809483366442
+11
+696.758804887548
+21
+-703.964135051352
+31
+118.98846898236
+12
+696.758806378212
+22
+-687.497596031337
+32
+137.875008640862
+13
+696.758806378212
+23
+-687.497596031337
+33
+137.875008640862
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247001541956
+20
+-736.467457257336
+30
+78.5586114938894
+11
+453.575566723046
+21
+-722.299342389133
+31
+100.617239704551
+12
+453.575559198051
+22
+-733.364267924859
+32
+77.3359522782304
+13
+453.575559198051
+23
+-733.364267924859
+33
+77.3359522782304
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575566723046
+20
+-722.299342389133
+30
+100.617239704551
+11
+452.247001541956
+21
+-736.467457257336
+31
+78.5586114938894
+12
+452.247009199941
+22
+-725.20697903804
+32
+102.251353856666
+13
+452.247009199941
+23
+-725.20697903804
+33
+102.251353856666
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957376463676
+20
+-727.485522237732
+30
+103.531852556699
+11
+649.884124396077
+21
+-719.380332193364
+31
+130.67650856366
+12
+649.884119483233
+22
+-734.56856186502
+32
+107.512580906988
+13
+649.884119483233
+23
+-734.56856186502
+33
+107.512580906988
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884124396077
+20
+-719.380332193364
+30
+130.67650856366
+11
+673.957376463676
+21
+-727.485522237732
+31
+103.531852556699
+12
+673.957381179691
+22
+-712.905797682657
+32
+125.767734693656
+13
+673.957381179691
+23
+-712.905797682657
+33
+125.767734693656
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221360398304
+20
+-645.663323591295
+30
+124.074113264079
+11
+684.332892871929
+21
+-634.846784199308
+31
+145.28747843271
+12
+702.22135687427
+22
+-629.047597461153
+32
+134.968788313225
+13
+702.22135687427
+23
+-629.047597461153
+33
+134.968788313225
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332892871929
+20
+-634.846784199308
+30
+145.28747843271
+11
+702.221360398304
+21
+-645.663323591295
+31
+124.074113264079
+12
+684.332896682708
+22
+-652.814503888805
+32
+133.506322083721
+13
+684.332896682708
+23
+-652.814503888805
+33
+133.506322083721
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636263548619
+20
+-662.459295238253
+30
+146.227531781659
+11
+623.546362358205
+21
+-644.548798426367
+31
+162.550587374486
+12
+644.636259351108
+22
+-642.668144691721
+32
+159.204283586808
+13
+644.636259351108
+23
+-642.668144691721
+33
+159.204283586808
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546362358205
+20
+-644.548798426367
+30
+162.550587374486
+11
+644.636263548619
+21
+-662.459295238253
+31
+146.227531781659
+12
+623.546366648706
+22
+-664.778393037384
+32
+149.286354566558
+13
+623.546366648706
+23
+-664.778393037384
+33
+149.286354566558
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602150844536
+20
+-740.196470143783
+30
+110.675521501907
+11
+473.71777732158
+21
+-724.524762147558
+31
+134.576865377446
+12
+473.717772252345
+22
+-740.196478791399
+32
+110.675560324675
+13
+473.717772252345
+23
+-740.196478791399
+33
+110.675560324675
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71777732158
+20
+-724.524762147558
+30
+134.576865377446
+11
+599.602150844536
+21
+-740.196470143783
+31
+110.675521501907
+12
+599.602155913773
+22
+-724.524747581215
+32
+134.576835581469
+13
+599.602155913773
+23
+-724.524747581215
+33
+134.576835581469
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642034971754
+20
+-769.517333598178
+30
+23.3578378654237
+11
+473.101722427237
+21
+-772.614333460954
+31
+30.1313729498036
+12
+473.101718395121
+22
+-772.841978102158
+32
+23.3578378645206
+13
+473.101718395121
+23
+-772.841978102158
+33
+23.3578378645206
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101722427237
+20
+-772.614333460954
+30
+30.1313729498036
+11
+473.642034971754
+21
+-769.517333598178
+31
+23.3578378654237
+12
+473.642038802113
+22
+-769.301079755069
+32
+29.7924413152051
+13
+473.642038802113
+23
+-769.301079755069
+33
+29.7924413152051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267776717416
+20
+-682.666673022429
+30
+172.880471218973
+11
+0.016298390231306
+21
+-659.055291474171
+31
+188.362205788973
+12
+429.267771709642
+22
+-659.055159092928
+32
+188.362176301584
+13
+429.267771709642
+23
+-659.055159092928
+33
+188.362176301584
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.016298390231306
+20
+-659.055291474171
+30
+188.362205788973
+11
+429.267776717416
+21
+-682.666673022429
+31
+172.880471218973
+12
+0.016303397997907
+22
+-682.666774623337
+32
+172.880520888553
+13
+0.016303397997907
+23
+-682.666774623337
+33
+172.880520888553
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838954191733
+20
+-682.490585555484
+30
+172.648217340479
+11
+429.267771709642
+21
+-659.055159092928
+31
+188.362176301584
+12
+432.838949191021
+22
+-658.912362146436
+32
+188.108094342889
+13
+432.838949191021
+23
+-658.912362146436
+33
+188.108094342889
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267771709642
+20
+-659.055159092928
+30
+188.362176301584
+11
+432.838954191733
+21
+-682.490585555484
+31
+172.648217340479
+12
+429.267776717416
+22
+-682.666673022429
+32
+172.880471218973
+13
+429.267776717416
+23
+-682.666673022429
+33
+172.880471218973
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630441768332
+20
+-695.289054806558
+30
+189.529056864572
+11
+464.090791712392
+21
+-720.287768351753
+31
+170.665180957976
+12
+466.6304436178
+22
+-718.721597772832
+32
+169.099010379212
+13
+466.6304436178
+23
+-718.721597772832
+33
+169.099010379212
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090791712392
+20
+-720.287768351753
+30
+170.665180957976
+11
+466.630441768332
+21
+-695.289054806558
+31
+189.529056864572
+12
+464.090789844927
+22
+-696.627200742591
+32
+191.294034464012
+13
+464.090789844927
+23
+-696.627200742591
+33
+191.294034464012
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317783384355
+20
+-699.580940660874
+30
+195.189933989489
+11
+451.68334645801
+21
+-723.691181151156
+31
+174.068593757036
+12
+451.683344551435
+22
+-699.535098538027
+32
+195.129470137406
+13
+451.683344551435
+23
+-699.535098538027
+33
+195.129470137406
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.68334645801
+20
+-723.691181151156
+30
+174.068593757036
+11
+448.317783384355
+21
+-699.580940660874
+31
+195.189933989489
+12
+448.317785291547
+22
+-723.744834584347
+32
+174.122247190222
+13
+448.317785291547
+23
+-723.744834584347
+33
+174.122247190222
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838940960221
+20
+-633.447412164356
+30
+200.210851816573
+11
+429.267752143919
+21
+-606.639691213326
+31
+209.013906507055
+12
+432.838929652884
+22
+-606.570796271198
+32
+208.73070710808
+13
+432.838929652884
+23
+-606.570796271198
+33
+208.73070710808
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267752143919
+20
+-606.639691213326
+30
+209.013906507055
+11
+432.838940960221
+21
+-633.447412164356
+31
+200.210851816573
+12
+429.267763467221
+22
+-633.554254686993
+32
+200.482021877632
+13
+429.267763467221
+23
+-633.554254686993
+33
+200.482021877632
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683316658874
+20
+-613.239395048328
+30
+236.143333156642
+11
+455.006097921195
+21
+-643.590691959854
+31
+225.95519307716
+12
+455.006085098156
+22
+-613.111377811381
+32
+235.617099433291
+13
+455.006085098156
+23
+-613.111377811381
+33
+235.617099433291
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006097921195
+20
+-643.590691959854
+30
+225.95519307716
+11
+451.683316658874
+21
+-613.239395048328
+31
+236.143333156642
+12
+451.683329511579
+22
+-643.789222672817
+32
+226.45907411243
+13
+451.683329511579
+23
+-643.789222672817
+33
+226.45907411243
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.179983602711226
+20
+-280.294079999999
+30
+2125.50255258978
+11
+46.8683973137003
+21
+-186.862719999999
+31
+2125.50255258978
+12
+0.179983602711646
+22
+-186.862719999999
+32
+2125.50255258978
+13
+0.179983602711646
+23
+-186.862719999999
+33
+2125.50255258978
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973137003
+20
+-186.862719999999
+30
+2125.50255258978
+11
+0.179983602711226
+21
+-280.294079999999
+31
+2125.50255258978
+12
+46.8683973136999
+22
+-280.294079999999
+32
+2125.50255258978
+13
+46.8683973136999
+23
+-280.294079999999
+33
+2125.50255258978
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221360398304
+20
+-645.663323591295
+30
+124.074113264079
+11
+718.363103364091
+21
+-622.121886696301
+31
+122.645633187677
+12
+718.363106545679
+22
+-637.12298630735
+32
+112.809643814588
+13
+718.363106545679
+23
+-637.12298630735
+33
+112.809643814588
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363103364091
+20
+-622.121886696301
+30
+122.645633187677
+11
+702.221360398304
+21
+-645.663323591295
+31
+124.074113264079
+12
+702.22135687427
+22
+-629.047597461153
+32
+134.968788313225
+13
+702.22135687427
+23
+-629.047597461153
+33
+134.968788313225
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840122392167
+20
+-781.931785179335
+30
+23.3578378611765
+11
+466.630399083827
+21
+-784.205377362117
+31
+31.3170895287116
+12
+466.630394345883
+22
+-784.472871509203
+32
+23.3578378599218
+13
+466.630394345883
+23
+-784.472871509203
+33
+23.3578378599218
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630399083827
+20
+-784.205377362117
+30
+31.3170895287116
+11
+468.840122392167
+21
+-781.931785179335
+31
+23.3578378611765
+12
+468.840126975903
+22
+-781.672997259934
+32
+31.0580369189494
+13
+468.840126975903
+23
+-781.672997259934
+33
+31.0580369189494
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575572828439
+20
+-691.225448319662
+30
+141.602860928812
+11
+454.431275216977
+21
+-669.689208643299
+31
+155.763553572255
+12
+454.431276722139
+22
+-688.759443912117
+32
+139.136856521515
+13
+454.431276722139
+23
+-688.759443912117
+33
+139.136856521515
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431275216977
+20
+-669.689208643299
+30
+155.763553572255
+11
+453.575572828439
+21
+-691.225448319662
+31
+141.602860928812
+12
+453.575571294939
+22
+-671.796177947369
+32
+158.542588616663
+13
+453.575571294939
+23
+-671.796177947369
+33
+158.542588616663
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006069025402
+20
+-790.658170470477
+30
+31.9771884161607
+11
+451.683316658874
+21
+-785.765920539638
+31
+63.616807647956
+12
+451.683300548936
+22
+-791.196939781596
+32
+32.0323039932388
+13
+451.683300548936
+23
+-791.196939781596
+33
+32.0323039932388
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683316658874
+20
+-785.765920539638
+30
+63.616807647956
+11
+455.006069025402
+21
+-790.658170470477
+31
+31.9771884161607
+12
+455.006085098156
+22
+-785.239686816274
+32
+63.4887904110616
+13
+455.006085098156
+23
+-785.239686816274
+33
+63.4887904110616
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466065703719
+20
+-627.348021252322
+30
+99.9167335104564
+11
+744.27505599199
+21
+-605.41026540619
+31
+92.9100649699753
+12
+744.27505834726
+22
+-616.515297047424
+32
+85.6286672029373
+13
+744.27505834726
+23
+-616.515297047424
+33
+85.6286672029373
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505599199
+20
+-605.41026540619
+30
+92.9100649699753
+11
+732.466065703719
+21
+-627.348021252322
+31
+99.9167335104564
+12
+732.466062914084
+22
+-614.194966001222
+32
+108.540988733599
+13
+732.466062914084
+23
+-614.194966001222
+33
+108.540988733599
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269972243544
+20
+-612.537006285544
+30
+233.256044045395
+11
+464.090775113584
+21
+-642.024842985963
+31
+221.980972610863
+12
+464.090762524528
+22
+-612.101685596006
+32
+231.466577935614
+13
+464.090762524528
+23
+-612.101685596006
+33
+231.466577935614
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090775113584
+20
+-642.024842985963
+30
+221.980972610863
+11
+461.269972243544
+21
+-612.537006285544
+31
+233.256044045395
+12
+461.26998493348
+22
+-642.699946567149
+32
+223.694427829008
+13
+461.26998493348
+23
+-642.699946567149
+33
+223.694427829008
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546366648706
+20
+-664.778393037384
+30
+149.286354566558
+11
+602.13329645121
+21
+-645.022448764174
+31
+163.393359945326
+12
+623.546362358205
+22
+-644.548798426367
+32
+162.550587374486
+13
+623.546362358205
+23
+-644.548798426367
+33
+162.550587374486
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13329645121
+20
+-645.022448764174
+30
+163.393359945326
+11
+623.546366648706
+21
+-664.778393037384
+31
+149.286354566558
+12
+602.13330076513
+22
+-665.362464994464
+32
+150.056725386733
+13
+602.13330076513
+23
+-665.362464994464
+33
+150.056725386733
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0163050776986444
+20
+-703.948386395801
+30
+154.325799003669
+11
+429.267776717416
+21
+-722.503058608961
+31
+133.044085628428
+12
+0.016303397997907
+22
+-722.503108278541
+32
+133.044187229337
+13
+0.016303397997907
+23
+-722.503108278541
+33
+133.044187229337
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267776717416
+20
+-722.503058608961
+30
+133.044085628428
+11
+0.0163050776986444
+21
+-703.948386395801
+31
+154.325799003669
+12
+429.267778397118
+22
+-703.948312537967
+32
+154.325725145835
+13
+429.267778397118
+23
+-703.948312537967
+33
+154.325725145835
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721745102502
+20
+-678.931345516719
+30
+167.953679054935
+11
+442.839485482368
+21
+-657.071290040049
+31
+184.832214227177
+12
+445.721740244506
+22
+-656.026027291755
+32
+182.972342518915
+13
+445.721740244506
+23
+-656.026027291755
+33
+182.972342518915
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839485482368
+20
+-657.071290040049
+30
+184.832214227177
+11
+445.721745102502
+21
+-678.931345516719
+31
+167.953679054935
+12
+442.839490392048
+22
+-680.220295673638
+32
+169.6537686923
+13
+442.839490392048
+23
+-680.220295673638
+33
+169.6537686923
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090789844927
+20
+-740.916621855406
+30
+147.004613346736
+11
+461.270001665299
+21
+-721.590015329221
+31
+171.967427935313
+12
+461.269999782869
+22
+-742.384173786494
+32
+148.117261370797
+13
+461.269999782869
+23
+-742.384173786494
+33
+148.117261370797
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.270001665299
+20
+-721.590015329221
+30
+171.967427935313
+11
+464.090789844927
+21
+-740.916621855406
+31
+147.004613346736
+12
+464.090791712392
+22
+-720.287768351753
+32
+170.665180957976
+13
+464.090791712392
+23
+-720.287768351753
+33
+170.665180957976
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269999782869
+20
+-742.384173786494
+30
+148.117261370797
+11
+458.222260471925
+21
+-722.603322716877
+31
+172.980735322867
+12
+458.222258577851
+22
+-743.526108574926
+32
+148.983037664963
+13
+458.222258577851
+23
+-743.526108574926
+33
+148.983037664963
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222260471925
+20
+-722.603322716877
+30
+172.980735322867
+11
+461.269999782869
+21
+-742.384173786494
+31
+148.117261370797
+12
+461.270001665299
+22
+-721.590015329221
+32
+171.967427935313
+13
+461.270001665299
+23
+-721.590015329221
+33
+171.967427935313
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683281480069
+20
+-549.621181308374
+30
+242.650939792116
+11
+455.00604998394
+21
+-186.86272
+31
+242.110623248711
+12
+451.683281480069
+22
+-186.86272
+32
+242.650939792116
+13
+451.683281480069
+23
+-186.86272
+33
+242.650939792116
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.00604998394
+20
+-186.86272
+30
+242.110623248711
+11
+451.683281480069
+21
+-549.621181308374
+31
+242.650939792116
+12
+455.00604998394
+22
+-549.612103415805
+32
+242.110623248711
+13
+455.00604998394
+23
+-549.612103415805
+33
+242.110623248711
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997696774917
+20
+-665.645302851503
+30
+116.022715463229
+11
+717.894077714131
+21
+-692.709977485149
+31
+110.455949073024
+12
+736.997695535365
+22
+-679.337949441333
+32
+100.317732616843
+13
+736.997695535365
+23
+-679.337949441333
+33
+100.317732616843
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894077714131
+20
+-692.709977485149
+30
+110.455949073024
+11
+736.997696774917
+21
+-665.645302851503
+31
+116.022715463229
+12
+717.894079090038
+22
+-677.51110607242
+32
+127.888518682951
+13
+717.894079090038
+23
+-677.51110607242
+33
+127.888518682951
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894077714131
+20
+-692.709977485149
+30
+110.455949073024
+11
+696.758806378212
+21
+-687.497596031337
+31
+137.875008640862
+12
+696.758804887548
+22
+-703.964135051352
+32
+118.98846898236
+13
+696.758804887548
+23
+-703.964135051352
+33
+118.98846898236
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758806378212
+20
+-687.497596031337
+30
+137.875008640862
+11
+717.894077714131
+21
+-692.709977485149
+31
+110.455949073024
+12
+717.894079090038
+22
+-677.51110607242
+32
+127.888518682951
+13
+717.894079090038
+23
+-677.51110607242
+33
+127.888518682951
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829316563608
+20
+-668.759576574313
+30
+23.3578379800722
+11
+753.739272918395
+21
+-687.397248351576
+31
+39.6867423818656
+12
+753.739264589701
+22
+-690.205036468984
+32
+23.3578379709152
+13
+753.739264589701
+23
+-690.205036468984
+33
+23.3578379709152
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739272918395
+20
+-687.397248351576
+30
+39.6867423818656
+11
+767.829316563608
+21
+-668.759576574313
+31
+23.3578379800722
+12
+767.82932233817
+22
+-666.812843070624
+32
+34.6792140832892
+13
+767.82932233817
+23
+-666.812843070624
+33
+34.6792140832892
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839492038848
+20
+-701.085065061495
+30
+151.462477669651
+11
+439.690620823844
+21
+-681.255534297249
+31
+171.019219664594
+12
+442.839490392048
+22
+-680.220295673638
+32
+169.6537686923
+13
+442.839490392048
+23
+-680.220295673638
+33
+169.6537686923
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690620823844
+20
+-681.255534297249
+30
+171.019219664594
+11
+442.839492038848
+21
+-701.085065061495
+31
+151.462477669651
+12
+439.690622484567
+22
+-702.296711761968
+32
+152.674124370004
+13
+439.690622484567
+23
+-702.296711761968
+33
+152.674124370004
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222230868175
+20
+-784.271054681722
+30
+63.2531519626526
+11
+455.006097921195
+21
+-775.577780463213
+31
+93.968104560508
+12
+455.006085098156
+22
+-785.239686816274
+32
+63.4887904110616
+13
+455.006085098156
+23
+-785.239686816274
+33
+63.4887904110616
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006097921195
+20
+-775.577780463213
+30
+93.968104560508
+11
+458.222230868175
+21
+-784.271054681722
+31
+63.2531519626526
+12
+458.222243636608
+22
+-774.650292730724
+32
+93.6026725589312
+13
+458.222243636608
+23
+-774.650292730724
+33
+93.6026725589312
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006085098156
+20
+-785.239686816274
+30
+63.4887904110616
+11
+451.683329511579
+21
+-776.081661498503
+31
+94.1666352734205
+12
+451.683316658874
+22
+-785.765920539638
+32
+63.616807647956
+13
+451.683316658874
+23
+-785.765920539638
+33
+63.616807647956
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683329511579
+20
+-776.081661498503
+30
+94.1666352734205
+11
+455.006085098156
+21
+-785.239686816274
+31
+63.4887904110616
+12
+455.006097921195
+22
+-775.577780463213
+32
+93.968104560508
+13
+455.006097921195
+23
+-775.577780463213
+33
+93.968104560508
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681614
+20
+-608.45291709122
+30
+-4.11489509133389e-11
+11
+838.782876772251
+21
+-630.31101453706
+31
+23.3578380792528
+12
+838.782876772249
+22
+-630.311014537056
+32
+-1.18393472803291e-10
+13
+838.782876772249
+23
+-630.311014537056
+33
+-1.18393472803291e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+838.782876772251
+20
+-630.31101453706
+30
+23.3578380792528
+11
+843.130722681614
+21
+-608.45291709122
+31
+-4.11489509133389e-11
+12
+843.130722681617
+22
+-608.452917091224
+32
+23.3578380793307
+13
+843.130722681617
+23
+-608.452917091224
+33
+23.3578380793307
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+772.221088848008
+20
+-745.599413064465
+30
+-2.18378204408509e-10
+11
+746.929122901678
+21
+-767.779871902217
+31
+23.3578380791593
+12
+746.929122901675
+22
+-767.779871902213
+32
+-2.12061479487602e-10
+13
+746.929122901675
+23
+-767.779871902213
+33
+-2.12061479487602e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901678
+20
+-767.779871902217
+30
+23.3578380791593
+11
+772.221088848008
+21
+-745.599413064465
+31
+-2.18378204408509e-10
+12
+772.221088848011
+22
+-745.599413064469
+32
+23.3578380791531
+13
+772.221088848011
+23
+-745.599413064469
+33
+23.3578380791531
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.22135687427
+20
+-684.591375697813
+30
+79.4250100709702
+11
+718.363106545679
+21
+-662.432231199989
+31
+87.5003989193992
+12
+718.363103364091
+22
+-672.268220571567
+32
+72.49929930736
+13
+718.363103364091
+23
+-672.268220571567
+33
+72.49929930736
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363106545679
+20
+-662.432231199989
+30
+87.5003989193992
+11
+702.22135687427
+21
+-684.591375697813
+31
+79.4250100709702
+12
+702.221360398304
+22
+-673.696700650341
+32
+96.0407362022104
+13
+702.221360398304
+23
+-673.696700650341
+33
+96.0407362022104
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839466299903
+20
+-754.702000509797
+30
+56.0599621810555
+11
+445.721707495526
+21
+-757.270638693351
+31
+28.5617953495419
+12
+442.839452384975
+22
+-759.393032819931
+32
+28.7789085623947
+13
+442.839452384975
+23
+-759.393032819931
+33
+28.7789085623947
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721707495526
+20
+-757.270638693351
+30
+28.5617953495419
+11
+442.839466299903
+21
+-754.702000509797
+31
+56.0599621810555
+12
+445.721721263973
+22
+-752.62898843986
+32
+55.5556638784362
+13
+445.721721263973
+23
+-752.62898843986
+33
+55.5556638784362
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.545902396357
+20
+-186.86272
+30
+3.60955709766131e-13
+11
+847.54590239636
+21
+-563.749226612819
+31
+23.3578380793719
+12
+847.545902396357
+22
+-563.749226612815
+32
+1.80477854883065e-13
+13
+847.545902396357
+23
+-563.749226612815
+33
+1.80477854883065e-13
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.54590239636
+20
+-563.749226612819
+30
+23.3578380793719
+11
+847.545902396357
+21
+-186.86272
+31
+3.60955709766131e-13
+12
+847.545902396362
+22
+56.1856515498016
+32
+1.46187062455283e-11
+13
+847.545902396362
+23
+56.1856515498016
+33
+1.46187062455283e-11
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.54590239636
+20
+-563.749226612819
+30
+23.3578380793719
+11
+847.545902396362
+21
+56.1856515498016
+31
+1.46187062455283e-11
+12
+847.545902396365
+22
+56.1856515497976
+32
+23.3578380793863
+13
+847.545902396365
+23
+56.1856515497976
+33
+23.3578380793863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281980096118
+20
+-754.771251996272
+30
+28.306117626709
+11
+450.471084922909
+21
+-752.099463345238
+31
+23.3578378619863
+12
+448.28197715053
+22
+-754.937553544539
+32
+23.3578378606726
+13
+448.28197715053
+23
+-754.937553544539
+33
+23.3578378606726
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471084922909
+20
+-752.099463345238
+30
+23.3578378619863
+11
+448.281980096118
+21
+-754.771251996272
+31
+28.306117626709
+12
+450.471087696265
+22
+-751.942885609203
+32
+28.0167869283821
+13
+450.471087696265
+23
+-751.942885609203
+33
+28.0167869283821
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739249813186
+20
+-186.86272
+30
+141.649769387185
+11
+736.99765201229
+21
+-548.245280356442
+31
+160.753391204502
+12
+753.739249813186
+22
+-547.924349168088
+32
+141.649769387184
+13
+753.739249813186
+23
+-547.924349168088
+33
+141.649769387184
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.99765201229
+20
+-548.245280356442
+30
+160.753391204502
+11
+753.739249813186
+21
+-186.86272
+31
+141.649769387185
+12
+736.99765201229
+22
+-186.86272
+32
+160.753391204502
+13
+736.99765201229
+23
+-186.86272
+33
+160.753391204502
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797687662105
+20
+-667.530828563864
+30
+152.916709017132
+11
+454.667765582876
+21
+-645.022494242574
+31
+163.393370075456
+12
+454.667769896794
+22
+-665.362499898554
+32
+150.056742450276
+13
+454.667769896794
+23
+-665.362499898554
+33
+150.056742450276
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667765582876
+20
+-645.022494242574
+30
+163.393370075456
+11
+454.797687662105
+21
+-667.530828563864
+31
+152.916709017132
+12
+454.797683261242
+22
+-646.78088064753
+32
+166.522129452237
+13
+454.797683261242
+23
+-646.78088064753
+33
+166.522129452237
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221318561055
+20
+-548.126641526877
+30
+153.690618001708
+11
+684.332852026746
+21
+-186.86272
+31
+165.499614915081
+12
+702.221318561055
+22
+-186.86272
+32
+153.690618001708
+13
+702.221318561055
+23
+-186.86272
+33
+153.690618001708
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332852026746
+20
+-186.86272
+30
+165.499614915081
+11
+702.221318561055
+21
+-548.126641526877
+31
+153.690618001708
+12
+684.332852026746
+22
+-548.325028948197
+32
+165.499614915081
+13
+684.332852026746
+23
+-548.325028948197
+33
+165.499614915081
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838954191733
+20
+-722.270804730449
+30
+132.867998161508
+11
+436.335620774804
+21
+-737.047580997407
+31
+108.905866027708
+12
+432.838949191021
+22
+-737.730681730485
+32
+109.289774750901
+13
+432.838949191021
+23
+-737.730681730485
+33
+109.289774750901
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335620774804
+20
+-737.047580997407
+30
+108.905866027708
+11
+432.838954191733
+21
+-722.270804730449
+31
+132.867998161508
+12
+436.335625756533
+22
+-721.646389233184
+32
+132.394587199654
+13
+436.335625756533
+23
+-721.646389233184
+33
+132.394587199654
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.26772029492
+20
+-549.153237717187
+30
+214.795486963908
+11
+0.0162469754877819
+21
+-186.86272
+31
+214.795486963908
+12
+429.26772029492
+22
+-186.86272
+32
+214.795486963908
+13
+429.26772029492
+23
+-186.86272
+33
+214.795486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162469754877819
+20
+-186.86272
+30
+214.795486963908
+11
+429.26772029492
+21
+-549.153237717187
+31
+214.795486963908
+12
+0.0162469754877819
+22
+-549.153365442471
+32
+214.795486963908
+13
+0.0162469754877819
+23
+-549.153365442471
+33
+214.795486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690622484567
+20
+-702.296711761968
+30
+152.674124370004
+11
+436.335625756533
+21
+-682.017174593568
+31
+172.023801843262
+12
+439.690620823844
+22
+-681.255534297249
+32
+171.019219664594
+13
+439.690620823844
+23
+-681.255534297249
+33
+171.019219664594
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335625756533
+20
+-682.017174593568
+30
+172.023801843262
+11
+439.690622484567
+21
+-702.296711761968
+31
+152.674124370004
+12
+436.335627427501
+22
+-703.188137968552
+32
+153.565550576497
+13
+436.335627427501
+23
+-703.188137968552
+33
+153.565550576497
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957368701467
+20
+-738.899252779403
+30
+79.5166578326792
+11
+649.884119483233
+21
+-734.56856186502
+31
+107.512580906988
+12
+649.884111397057
+22
+-746.458660352302
+32
+82.4950785735168
+13
+649.884111397057
+23
+-746.458660352302
+33
+82.4950785735168
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884119483233
+20
+-734.56856186502
+30
+107.512580906988
+11
+673.957368701467
+21
+-738.899252779403
+31
+79.5166578326792
+12
+673.957376463676
+22
+-727.485522237732
+32
+103.531852556699
+13
+673.957376463676
+23
+-727.485522237732
+33
+103.531852556699
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275052115393
+20
+-648.23289118406
+30
+43.7940230954864
+11
+753.576410189591
+21
+-625.658275857869
+31
+46.3041482621511
+12
+753.576407084801
+22
+-630.223630997654
+32
+36.698358790781
+13
+753.576407084801
+23
+-630.223630997654
+33
+36.698358790781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576410189591
+20
+-625.658275857869
+30
+46.3041482621511
+11
+744.275052115393
+21
+-648.23289118406
+31
+43.7940230954864
+12
+744.27505599199
+22
+-642.532652352182
+32
+55.7876780202442
+13
+744.27505599199
+23
+-642.532652352182
+33
+55.7876780202442
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269956337624
+20
+-788.240871473567
+30
+31.7299058573872
+11
+458.222230868175
+21
+-784.271054681722
+31
+63.2531519626526
+12
+458.222214863865
+22
+-789.666464186592
+32
+31.8757394304439
+13
+458.222214863865
+23
+-789.666464186592
+33
+31.8757394304439
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222230868175
+20
+-784.271054681722
+30
+63.2531519626526
+11
+461.269956337624
+21
+-788.240871473567
+31
+31.7299058573872
+12
+461.269972243544
+22
+-782.87863142832
+32
+62.9144188854628
+13
+461.269972243544
+23
+-782.87863142832
+33
+62.9144188854628
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130182819951
+20
+-621.196954326058
+30
+23.3578379966277
+11
+779.024158535186
+21
+-644.605714246329
+31
+29.2769308468913
+12
+779.024155516104
+22
+-645.623514226953
+32
+23.3578379886926
+13
+779.024155516104
+23
+-645.623514226953
+33
+23.3578379886926
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024158535186
+20
+-644.605714246329
+30
+29.2769308468913
+11
+787.130182819951
+21
+-621.196954326058
+31
+23.3578379966277
+12
+787.130182929858
+22
+-621.15990220955
+32
+23.5733173858747
+13
+787.130182929858
+23
+-621.15990220955
+33
+23.5733173858747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024155516104
+20
+-645.623514226953
+30
+23.3578379886926
+11
+767.82932233817
+21
+-666.812843070624
+31
+34.6792140832892
+12
+767.829316563608
+22
+-668.759576574313
+32
+23.3578379800722
+13
+767.829316563608
+23
+-668.759576574313
+33
+23.3578379800722
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.82932233817
+20
+-666.812843070624
+30
+34.6792140832892
+11
+779.024155516104
+21
+-645.623514226953
+31
+23.3578379886926
+12
+779.024158535186
+22
+-644.605714246329
+32
+29.2769308468913
+13
+779.024158535186
+23
+-644.605714246329
+33
+29.2769308468913
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.26998493348
+20
+-773.317015214971
+30
+93.0773591680305
+11
+458.222252930963
+21
+-760.983658189012
+31
+122.358116586891
+12
+458.222243636608
+22
+-774.650292730724
+32
+93.6026725589312
+13
+458.222243636608
+23
+-774.650292730724
+33
+93.6026725589312
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222252930963
+20
+-760.983658189012
+30
+122.358116586891
+11
+461.26998493348
+21
+-773.317015214971
+31
+93.0773591680305
+12
+461.269994170696
+22
+-759.734399297279
+32
+121.656022816523
+13
+461.269994170696
+23
+-759.734399297279
+33
+121.656022816523
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101764681482
+20
+-710.482718842918
+30
+160.860131450129
+11
+472.107209463225
+21
+-732.435769686289
+31
+140.574720545467
+12
+473.101762926689
+22
+-729.866935555387
+32
+138.627118353444
+13
+473.101762926689
+23
+-729.866935555387
+33
+138.627118353444
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107209463225
+20
+-732.435769686289
+30
+140.574720545467
+11
+473.101764681482
+21
+-710.482718842918
+31
+160.860131450129
+12
+472.107211244211
+22
+-712.762199391597
+32
+163.139611998578
+13
+472.107211244211
+23
+-712.762199391597
+33
+163.139611998578
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683300548936
+20
+-791.196939781596
+30
+32.0323039932388
+11
+448.317755482775
+21
+-785.839646973143
+31
+63.6347444795237
+12
+448.317739367628
+22
+-791.272422434329
+32
+32.0400273988949
+13
+448.317739367628
+23
+-791.272422434329
+33
+32.0400273988949
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317755482775
+20
+-785.839646973143
+30
+63.6347444795237
+11
+451.683300548936
+21
+-791.196939781596
+31
+32.0323039932388
+12
+451.683316658874
+22
+-785.765920539638
+32
+63.616807647956
+13
+451.683316658874
+23
+-785.765920539638
+33
+63.616807647956
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006112926336
+20
+-744.320489807817
+30
+149.585310783685
+11
+451.68334645801
+21
+-723.691181151156
+31
+174.068593757036
+12
+451.683344551435
+22
+-744.752057529093
+32
+149.912511141786
+13
+451.683344551435
+23
+-744.752057529093
+33
+149.912511141786
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.68334645801
+20
+-723.691181151156
+30
+174.068593757036
+11
+455.006112926336
+21
+-744.320489807817
+31
+149.585310783685
+12
+455.006114828511
+22
+-723.308225016813
+32
+173.685637622731
+13
+455.006114828511
+23
+-723.308225016813
+33
+173.685637622731
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683344551435
+20
+-744.752057529093
+30
+149.912511141786
+11
+448.317785291547
+21
+-723.744834584347
+31
+174.122247190222
+12
+448.317783384355
+22
+-744.812521381181
+32
+149.958353264626
+13
+448.317783384355
+23
+-744.812521381181
+33
+149.958353264626
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317785291547
+20
+-723.744834584347
+30
+174.122247190222
+11
+451.683344551435
+21
+-744.752057529093
+31
+149.912511141786
+12
+451.68334645801
+22
+-723.691181151156
+32
+174.068593757036
+13
+451.68334645801
+23
+-723.691181151156
+33
+174.068593757036
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317783384355
+20
+-744.812521381181
+30
+149.958353264626
+11
+6.49966391634282e-05
+21
+-723.744911722756
+31
+174.12232432863
+12
+6.30894498883872e-05
+22
+-744.812573256956
+32
+149.958459378386
+13
+6.30894498883872e-05
+23
+-744.812573256956
+33
+149.958459378386
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+6.49966391634282e-05
+20
+-723.744911722756
+30
+174.12232432863
+11
+448.317783384355
+21
+-744.812521381181
+31
+149.958353264626
+12
+448.317785291547
+22
+-723.744834584347
+32
+174.122247190222
+13
+448.317785291547
+23
+-723.744834584347
+33
+174.122247190222
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884111397057
+20
+-632.11766596993
+30
+196.836072967405
+11
+673.957376463676
+21
+-653.154439951202
+31
+177.862934850716
+12
+673.957368701467
+22
+-629.139245228331
+32
+189.276665394806
+13
+673.957368701467
+23
+-629.139245228331
+33
+189.276665394806
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957376463676
+20
+-653.154439951202
+30
+177.862934850716
+11
+649.884111397057
+21
+-632.11766596993
+31
+196.836072967405
+12
+649.884119483233
+22
+-657.135168302204
+32
+184.945974477603
+13
+649.884119483233
+23
+-657.135168302204
+33
+184.945974477603
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+794.401547685756
+20
+-720.307447118133
+30
+-2.12061479487602e-10
+11
+772.221088848011
+21
+-745.599413064469
+31
+23.3578380791531
+12
+772.221088848008
+22
+-745.599413064465
+32
+-2.18378204408509e-10
+13
+772.221088848008
+23
+-745.599413064465
+33
+-2.18378204408509e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+772.221088848011
+20
+-745.599413064469
+30
+23.3578380791531
+11
+794.401547685756
+21
+-720.307447118133
+31
+-2.12061479487602e-10
+12
+794.401547685759
+22
+-720.307447118137
+32
+23.3578380791593
+13
+794.401547685759
+23
+-720.307447118137
+33
+23.3578380791593
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090727919739
+20
+-549.540509167097
+30
+237.849027336606
+11
+466.630380370588
+21
+-186.86272
+31
+235.63929931572
+12
+464.090727919739
+22
+-186.86272
+32
+237.849027336606
+13
+464.090727919739
+23
+-186.86272
+33
+237.849027336606
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630380370588
+20
+-186.86272
+30
+235.63929931572
+11
+464.090727919739
+21
+-549.540509167097
+31
+237.849027336606
+12
+466.630380370588
+22
+-549.503386674047
+32
+235.63929931572
+13
+466.630380370588
+23
+-549.503386674047
+33
+235.63929931572
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739249813186
+20
+-547.924349168088
+30
+141.649769387184
+11
+736.997666927312
+21
+-573.300963343833
+31
+159.911321013811
+12
+753.73926375928
+22
+-571.352333223692
+32
+140.862402824032
+13
+753.73926375928
+23
+-571.352333223692
+33
+140.862402824032
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997666927312
+20
+-573.300963343833
+30
+159.911321013811
+11
+753.739249813186
+21
+-547.924349168088
+31
+141.649769387184
+12
+736.99765201229
+22
+-548.245280356442
+32
+160.753391204502
+13
+736.99765201229
+23
+-548.245280356442
+33
+160.753391204502
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894030194972
+20
+-548.526532054241
+30
+177.494989005398
+11
+736.997666927312
+21
+-573.300963343833
+31
+159.911321013811
+12
+736.99765201229
+22
+-548.245280356442
+32
+160.753391204502
+13
+736.99765201229
+23
+-548.245280356442
+33
+160.753391204502
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997666927312
+20
+-573.300963343833
+30
+159.911321013811
+11
+717.894030194972
+21
+-548.526532054241
+31
+177.494989005398
+12
+717.894045959123
+22
+-575.008661956696
+32
+176.604978855282
+13
+717.894045959123
+23
+-575.008661956696
+33
+176.604978855282
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758800443365
+20
+-647.656853392997
+30
+168.080894990074
+11
+717.894077714131
+21
+-660.078536464024
+31
+143.087390097436
+12
+717.894073612081
+22
+-640.737481474577
+32
+155.769021196026
+13
+717.894073612081
+23
+-640.737481474577
+33
+155.769021196026
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894077714131
+20
+-660.078536464024
+30
+143.087390097436
+11
+696.758800443365
+21
+-647.656853392997
+31
+168.080894990074
+12
+696.758804887548
+22
+-668.611056374494
+32
+154.341547662779
+13
+696.758804887548
+23
+-668.611056374494
+33
+154.341547662779
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201824130007
+20
+-611.213150017197
+30
+29.2082138072124
+11
+763.093075318335
+21
+-596.364508960869
+31
+23.3578379945534
+12
+760.201821668678
+22
+-613.067712196625
+32
+23.3578379899606
+13
+760.201821668678
+23
+-613.067712196625
+33
+23.3578379899606
+70
+0
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839477401402
+20
+-746.337240593148
+30
+82.4473163912804
+11
+445.721721263973
+21
+-752.62898843986
+31
+55.5556638784362
+12
+442.839466299903
+22
+-754.702000509797
+32
+56.0599621810555
+13
+442.839466299903
+23
+-754.702000509797
+33
+56.0599621810555
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721721263973
+20
+-752.62898843986
+30
+55.5556638784362
+11
+442.839477401402
+21
+-746.337240593148
+31
+82.4473163912804
+12
+445.721732248607
+22
+-744.352283565408
+32
+81.6652408886482
+13
+445.721732248607
+23
+-744.352283565408
+33
+81.6652408886482
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642053400866
+20
+-764.379514823734
+30
+58.4141748490874
+11
+473.101722427237
+21
+-772.614333460954
+31
+30.1313729498036
+12
+473.642038802113
+22
+-769.301079755069
+32
+29.7924413152051
+13
+473.642038802113
+23
+-769.301079755069
+33
+29.7924413152051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101722427237
+20
+-772.614333460954
+30
+30.1313729498036
+11
+473.642053400866
+21
+-764.379514823734
+31
+58.4141748490874
+12
+473.10173725466
+22
+-767.61567851106
+32
+59.2014293241045
+13
+473.10173725466
+23
+-767.61567851106
+33
+59.2014293241045
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.10173725466
+20
+-767.61567851106
+30
+59.2014293241045
+11
+472.107168359226
+21
+-775.821269863314
+31
+30.4594290412997
+12
+473.101722427237
+22
+-772.614333460954
+32
+30.1313729498036
+13
+473.101722427237
+23
+-772.614333460954
+33
+30.1313729498036
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107168359226
+20
+-775.821269863314
+30
+30.4594290412997
+11
+473.10173725466
+21
+-767.61567851106
+31
+59.2014293241045
+12
+472.107183407982
+22
+-770.747998603796
+32
+59.9634222143927
+13
+472.107183407982
+23
+-770.747998603796
+33
+59.9634222143927
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281993692064
+20
+-750.187755353023
+30
+54.9617894316777
+11
+450.471111788281
+21
+-739.369532914357
+31
+79.7020319508277
+12
+450.471101097006
+22
+-747.425197006803
+32
+54.2897470886059
+13
+450.471101097006
+23
+-747.425197006803
+33
+54.2897470886059
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471111788281
+20
+-739.369532914357
+30
+79.7020319508277
+11
+448.281993692064
+21
+-750.187755353023
+31
+54.9617894316777
+12
+448.282004539076
+22
+-742.014746414944
+32
+80.7442486966709
+13
+448.282004539076
+23
+-742.014746414944
+33
+80.7442486966709
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997691839832
+20
+-632.515984774395
+30
+141.140229605674
+11
+717.894077714131
+21
+-660.078536464024
+31
+143.087390097436
+12
+736.997695535365
+22
+-649.940320006495
+32
+129.715362054641
+13
+736.997695535365
+23
+-649.940320006495
+33
+129.715362054641
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894077714131
+20
+-660.078536464024
+30
+143.087390097436
+11
+736.997691839832
+21
+-632.515984774395
+31
+141.140229605674
+12
+717.894073612081
+22
+-640.737481474577
+32
+155.769021196026
+13
+717.894073612081
+23
+-640.737481474577
+33
+155.769021196026
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721721263973
+20
+-752.62898843986
+30
+55.5556638784362
+11
+448.282004539076
+21
+-742.014746414944
+31
+80.7442486966709
+12
+448.281993692064
+22
+-750.187755353023
+32
+54.9617894316777
+13
+448.281993692064
+23
+-750.187755353023
+33
+54.9617894316777
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282004539076
+20
+-742.014746414944
+30
+80.7442486966709
+11
+445.721721263973
+21
+-752.62898843986
+31
+55.5556638784362
+12
+445.721732248607
+22
+-744.352283565408
+32
+81.6652408886482
+13
+445.721732248607
+23
+-744.352283565408
+33
+81.6652408886482
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431276722139
+20
+-688.759443912117
+30
+139.136856521515
+11
+454.797687662105
+21
+-667.530828563864
+31
+152.916709017132
+12
+454.797689138238
+22
+-686.233268095701
+32
+136.610680705353
+13
+454.797689138238
+23
+-686.233268095701
+33
+136.610680705353
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797687662105
+20
+-667.530828563864
+30
+152.916709017132
+11
+454.431276722139
+21
+-688.759443912117
+31
+139.136856521515
+12
+454.431275216977
+22
+-669.689208643299
+32
+155.763553572255
+13
+454.431275216977
+23
+-669.689208643299
+33
+155.763553572255
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222243636608
+20
+-774.650292730724
+30
+93.6026725589312
+11
+455.006107255299
+21
+-761.852698834952
+31
+122.846524872111
+12
+455.006097921195
+22
+-775.577780463213
+32
+93.968104560508
+13
+455.006097921195
+23
+-775.577780463213
+33
+93.968104560508
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006107255299
+20
+-761.852698834952
+30
+122.846524872111
+11
+458.222243636608
+21
+-774.650292730724
+31
+93.6026725589312
+12
+458.222252930963
+22
+-760.983658189012
+32
+122.358116586891
+13
+458.222252930963
+23
+-760.983658189012
+33
+122.358116586891
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107183407982
+20
+-609.586009613252
+30
+221.125411221167
+11
+470.677509279169
+21
+-639.24331958749
+31
+214.92128705308
+12
+472.107195414063
+22
+-638.12348215123
+32
+212.079066347413
+13
+472.107195414063
+23
+-638.12348215123
+33
+212.079066347413
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677509279169
+20
+-639.24331958749
+30
+214.92128705308
+11
+472.107183407982
+21
+-609.586009613252
+31
+221.125411221167
+12
+470.677497105752
+22
+-610.308103138718
+32
+224.093716273781
+13
+470.677497105752
+23
+-610.308103138718
+33
+224.093716273781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838929652884
+20
+-758.353294490404
+30
+56.9482088735863
+11
+436.335587191701
+21
+-762.351784924648
+31
+29.0815795342117
+12
+432.838915479952
+22
+-763.131305674907
+32
+29.1613230247316
+13
+432.838915479952
+23
+-763.131305674907
+33
+29.1613230247316
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335587191701
+20
+-762.351784924648
+30
+29.0815795342117
+11
+432.838929652884
+21
+-758.353294490404
+31
+56.9482088735863
+12
+436.335601310833
+22
+-757.591910929275
+32
+56.7629871862785
+13
+436.335601310833
+23
+-757.591910929275
+33
+56.7629871862785
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+693.784141830299
+20
+-590.617873632807
+30
+-9.20437059903634e-12
+11
+698.091838084213
+21
+-577.37232127131
+31
+5.83945951982641
+12
+698.091838084213
+22
+-577.37232127131
+32
+-1.01067598734517e-11
+13
+698.091838084213
+23
+-577.37232127131
+33
+-1.01067598734517e-11
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+698.091838084213
+20
+-577.37232127131
+30
+5.83945951982641
+11
+693.784141830299
+21
+-590.617873632807
+31
+-9.20437059903634e-12
+12
+693.784141830299
+22
+-590.617873632807
+32
+5.83945951982749
+13
+693.784141830299
+23
+-590.617873632807
+33
+5.83945951982749
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+590.370902396357
+21
+-674.370540948851
+31
+1.80477854883065e-13
+12
+0.000467548731318024
+22
+-674.370540948851
+32
+1.80477854883065e-13
+13
+0.000467548731318024
+23
+-674.370540948851
+33
+1.80477854883065e-13
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+590.370902396357
+20
+-674.370540948851
+30
+1.80477854883065e-13
+11
+0.000467548731367373
+21
+-674.37054094885
+31
+5.83945951983706
+12
+590.370902396357
+22
+-674.37054094885
+32
+5.83945951983706
+13
+590.370902396357
+23
+-674.37054094885
+33
+5.83945951983706
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+603.993997054852
+20
+-671.47016230067
+30
+5.83945951983598
+11
+590.370902396357
+21
+-674.370540948851
+31
+1.80477854883065e-13
+12
+590.370902396357
+22
+-674.37054094885
+32
+5.83945951983706
+13
+590.370902396357
+23
+-674.37054094885
+33
+5.83945951983706
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+590.370902396357
+20
+-674.370540948851
+30
+1.80477854883065e-13
+11
+603.993997054852
+21
+-671.47016230067
+31
+5.83945951983598
+12
+603.993997054853
+22
+-671.470162300671
+32
+-5.41433564649196e-13
+13
+603.993997054853
+23
+-671.470162300671
+33
+-5.41433564649196e-13
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+617.239549416349
+20
+-667.162466046756
+30
+5.83945951983507
+11
+603.993997054853
+21
+-671.470162300671
+31
+-5.41433564649196e-13
+12
+603.993997054852
+22
+-671.47016230067
+32
+5.83945951983598
+13
+603.993997054852
+23
+-671.47016230067
+33
+5.83945951983598
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+603.993997054853
+20
+-671.470162300671
+30
+-5.41433564649196e-13
+11
+617.239549416349
+21
+-667.162466046756
+31
+5.83945951983507
+12
+617.23954941635
+22
+-667.162466046757
+32
+-1.62430069394759e-12
+13
+617.23954941635
+23
+-667.162466046757
+33
+-1.62430069394759e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.958402396357
+20
+-786.469309831078
+30
+-1.92750349015114e-10
+11
+688.787514114852
+21
+-801.347945386409
+31
+23.3578380792096
+12
+688.787514114849
+22
+-801.347945386405
+32
+-1.61527680120344e-10
+13
+688.787514114849
+23
+-801.347945386405
+33
+-1.61527680120344e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+718.958402396357
+21
+-786.469309831078
+31
+-1.92750349015114e-10
+12
+718.95840239636
+22
+-786.469309831082
+32
+23.3578380791782
+13
+718.95840239636
+23
+-786.469309831082
+33
+23.3578380791782
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221361580333
+20
+-660.639487120937
+30
+111.016899733167
+11
+718.363106545679
+21
+-637.12298630735
+31
+112.809643814588
+12
+718.363107612844
+22
+-650.643847155672
+32
+101.021259768909
+13
+718.363107612844
+23
+-650.643847155672
+33
+101.021259768909
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363106545679
+20
+-637.12298630735
+30
+112.809643814588
+11
+702.221361580333
+21
+-660.639487120937
+31
+111.016899733167
+12
+702.221360398304
+22
+-645.663323591295
+32
+124.074113264079
+13
+702.221360398304
+23
+-645.663323591295
+33
+124.074113264079
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.00720150166
+20
+-186.86272
+30
+48.7110294035543
+11
+793.570900047839
+21
+-545.937123520845
+31
+23.3578380793295
+12
+793.570900047839
+22
+-186.86272
+32
+23.3578380793295
+13
+793.570900047839
+23
+-186.86272
+33
+23.3578380793295
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.570900047839
+20
+-545.937123520845
+30
+23.3578380793295
+11
+792.00720150166
+21
+-186.86272
+31
+48.7110294035543
+12
+792.00720150166
+22
+-546.363038171439
+32
+48.7110294035543
+13
+792.00720150166
+23
+-546.363038171439
+33
+48.7110294035543
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630399083827
+20
+-784.205377362117
+30
+31.3170895287116
+11
+464.090762524528
+21
+-781.089165318495
+31
+62.4790981961044
+12
+464.090746745054
+22
+-786.408777774662
+32
+31.5424891402109
+13
+464.090746745054
+23
+-786.408777774662
+33
+31.5424891402109
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090762524528
+20
+-781.089165318495
+30
+62.4790981961044
+11
+466.630399083827
+21
+-784.205377362117
+31
+31.3170895287116
+12
+466.630414711229
+22
+-778.937031754263
+32
+61.9555523461604
+13
+466.630414711229
+23
+-778.937031754263
+33
+61.9555523461604
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829301759449
+20
+-186.86272
+30
+120.51449319742
+11
+753.739249813186
+21
+-547.924349168088
+31
+141.649769387184
+12
+767.829301759449
+22
+-547.569288532173
+32
+120.514493197419
+13
+767.829301759449
+23
+-547.569288532173
+33
+120.514493197419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739249813186
+20
+-547.924349168088
+30
+141.649769387184
+11
+767.829301759449
+21
+-186.86272
+31
+120.51449319742
+12
+753.739249813186
+22
+-186.86272
+32
+141.649769387185
+13
+753.739249813186
+23
+-186.86272
+33
+141.649769387185
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840169183023
+20
+-693.751116561201
+30
+187.500558577709
+11
+466.6304436178
+21
+-718.721597772832
+31
+169.099010379212
+12
+468.840171011807
+22
+-716.921589517517
+32
+167.299002124079
+13
+468.840171011807
+23
+-716.921589517517
+33
+167.299002124079
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.6304436178
+20
+-718.721597772832
+30
+169.099010379212
+11
+468.840169183023
+21
+-693.751116561201
+31
+187.500558577709
+12
+466.630441768332
+22
+-695.289054806558
+32
+189.529056864572
+13
+466.630441768332
+23
+-695.289054806558
+33
+189.529056864572
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332896682708
+20
+-652.814503888805
+30
+133.506322083721
+11
+665.02138596315
+21
+-639.414516186541
+31
+153.414996741162
+12
+684.332892871929
+22
+-634.846784199308
+32
+145.28747843271
+13
+684.332892871929
+23
+-634.846784199308
+33
+145.28747843271
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.02138596315
+20
+-639.414516186541
+30
+153.414996741162
+11
+684.332896682708
+21
+-652.814503888805
+31
+133.506322083721
+12
+665.021389999784
+22
+-658.447133448378
+32
+140.935603497775
+13
+665.021389999784
+23
+-658.447133448378
+33
+140.935603497775
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101757695049
+20
+-663.582663624963
+30
+196.418146784964
+11
+472.107209463225
+21
+-690.197307940468
+31
+182.813182295542
+12
+473.101762926689
+22
+-688.249705748186
+32
+180.244348164837
+13
+473.101762926689
+23
+-688.249705748186
+33
+180.244348164837
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107209463225
+20
+-690.197307940468
+30
+182.813182295542
+11
+473.101757695049
+21
+-663.582663624963
+31
+196.418146784964
+12
+472.10720415349
+22
+-665.162054034067
+32
+199.228411696097
+13
+472.10720415349
+23
+-665.162054034067
+33
+199.228411696097
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13329645121
+20
+-713.015947331523
+30
+95.3998613711292
+11
+623.546355296361
+21
+-722.557073202373
+31
+73.0778467179566
+12
+602.133289350819
+22
+-723.456525449862
+32
+73.4322395118387
+13
+602.133289350819
+23
+-723.456525449862
+33
+73.4322395118387
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546355296361
+20
+-722.557073202373
+30
+73.0778467179566
+11
+602.13329645121
+21
+-713.015947331523
+31
+95.3998613711292
+12
+623.546362358205
+22
+-712.173174760634
+32
+94.9262110334071
+13
+623.546362358205
+23
+-712.173174760634
+33
+94.9262110334071
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546362358205
+20
+-712.173174760634
+30
+94.9262110334071
+11
+644.636252442318
+21
+-718.985715046116
+31
+71.6707212889357
+12
+623.546355296361
+22
+-722.557073202373
+32
+73.0778467179566
+13
+623.546355296361
+23
+-722.557073202373
+33
+73.0778467179566
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636252442318
+20
+-718.985715046116
+30
+71.6707212889357
+11
+623.546362358205
+21
+-712.173174760634
+31
+94.9262110334071
+12
+644.636259351108
+22
+-708.826870972768
+32
+93.0455572990973
+13
+644.636259351108
+23
+-708.826870972768
+33
+93.0455572990973
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758783079627
+20
+-736.03100461107
+30
+51.5177928651329
+11
+673.957368701467
+21
+-738.899252779403
+31
+79.5166578326792
+12
+673.957358037872
+22
+-746.934060776874
+32
+54.170165314894
+13
+673.957358037872
+23
+-746.934060776874
+33
+54.170165314894
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957368701467
+20
+-738.899252779403
+30
+79.5166578326792
+11
+696.758783079627
+21
+-736.03100461107
+31
+51.5177928651329
+12
+696.758793128571
+22
+-728.459323997255
+32
+75.4033102397292
+13
+696.758793128571
+23
+-728.459323997255
+33
+75.4033102397292
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+590.370902396357
+20
+-820.924226612815
+30
+1.80477854883065e-13
+11
+0.000796879066902634
+21
+-820.924226610164
+31
+17.0475267240553
+12
+0.000467548731319434
+22
+-820.924226612815
+32
+1.80477854883065e-13
+13
+0.000467548731319434
+23
+-820.924226612815
+33
+1.80477854883065e-13
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000796879066902634
+20
+-820.924226610164
+30
+17.0475267240553
+11
+590.37090239636
+21
+-820.924226612819
+31
+23.3578380793719
+12
+0.000467548734387557
+22
+-820.924226612819
+32
+23.3578380793719
+13
+0.000467548734387557
+23
+-820.924226612819
+33
+23.3578380793719
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+590.37090239636
+20
+-820.924226612819
+30
+23.3578380793719
+11
+0.000796879066902634
+21
+-820.924226610164
+31
+17.0475267240553
+12
+590.370902396357
+22
+-820.924226612815
+32
+1.80477854883065e-13
+13
+590.370902396357
+23
+-820.924226612815
+33
+1.80477854883065e-13
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957327625231
+20
+-548.951311917762
+30
+202.779879874335
+11
+696.758754005207
+21
+-186.86272
+31
+191.585040951661
+12
+673.957327625231
+22
+-186.86272
+32
+202.779879874335
+13
+673.957327625231
+23
+-186.86272
+33
+202.779879874335
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758754005207
+20
+-186.86272
+30
+191.585040951661
+11
+673.957327625231
+21
+-548.951311917762
+31
+202.779879874335
+12
+696.758754005207
+22
+-548.76324041817
+32
+191.585040951661
+13
+696.758754005207
+23
+-548.76324041817
+33
+191.585040951661
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281962880048
+20
+-549.007501396503
+30
+206.120647039576
+11
+445.721690152324
+21
+-186.86272
+31
+208.627211339945
+12
+448.281962880048
+22
+-186.86272
+32
+206.120647039576
+13
+448.281962880048
+23
+-186.86272
+33
+206.120647039576
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721690152324
+20
+-186.86272
+30
+208.627211339945
+11
+448.281962880048
+21
+-549.007501396503
+31
+206.120647039576
+12
+445.721690152324
+22
+-549.049610517709
+32
+208.627211339945
+13
+445.721690152324
+23
+-549.049610517709
+33
+208.627211339945
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471119570638
+20
+-653.402150740311
+30
+178.303588160926
+11
+452.247001541956
+21
+-628.181198889296
+31
+186.844869872835
+12
+452.247009199941
+22
+-651.873941250939
+32
+175.584391651154
+13
+452.247009199941
+23
+-651.873941250939
+33
+175.584391651154
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247001541956
+20
+-628.181198889296
+30
+186.844869872835
+11
+450.471119570638
+21
+-653.402150740311
+31
+178.303588160926
+12
+450.471111788281
+22
+-629.324619346527
+32
+189.746945529741
+13
+450.471111788281
+23
+-629.324619346527
+33
+189.746945529741
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281993692064
+20
+-604.584376828467
+30
+200.565167970899
+11
+450.471087696265
+21
+-577.639374325348
+31
+202.320298229792
+12
+450.471101097006
+22
+-603.912334485117
+32
+197.802609624747
+13
+450.471101097006
+23
+-603.912334485117
+33
+197.802609624747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471087696265
+20
+-577.639374325348
+30
+202.320298229792
+11
+448.281993692064
+21
+-604.584376828467
+31
+200.565167970899
+12
+448.281980096118
+22
+-577.92870502396
+32
+205.148664616833
+13
+448.281980096118
+23
+-577.92870502396
+33
+205.148664616833
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758770484001
+20
+-740.277270942125
+30
+26.8233094768247
+11
+673.957358037872
+21
+-746.934060776874
+31
+54.170165314894
+12
+673.957344671825
+22
+-751.440053094339
+32
+27.9652257853831
+13
+673.957344671825
+23
+-751.440053094339
+33
+27.9652257853831
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957358037872
+20
+-746.934060776874
+30
+54.170165314894
+11
+696.758770484001
+21
+-740.277270942125
+31
+26.8233094768247
+12
+696.758783079627
+22
+-736.03100461107
+32
+51.5177928651329
+13
+696.758783079627
+23
+-736.03100461107
+33
+51.5177928651329
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090746745054
+20
+-786.408777774662
+30
+31.5424891402109
+11
+461.269972243544
+21
+-782.87863142832
+31
+62.9144188854628
+12
+461.269956337624
+22
+-788.240871473567
+32
+31.7299058573872
+13
+461.269956337624
+23
+-788.240871473567
+33
+31.7299058573872
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269972243544
+20
+-782.87863142832
+30
+62.9144188854628
+11
+464.090746745054
+21
+-786.408777774662
+31
+31.5424891402109
+12
+464.090762524528
+22
+-781.089165318495
+32
+62.4790981961044
+13
+464.090762524528
+23
+-781.089165318495
+33
+62.4790981961044
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021389999784
+20
+-658.447133448378
+30
+140.935603497775
+11
+644.636259351108
+21
+-642.668144691721
+31
+159.204283586808
+12
+665.02138596315
+22
+-639.414516186541
+32
+153.414996741162
+13
+665.02138596315
+23
+-639.414516186541
+33
+153.414996741162
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636259351108
+20
+-642.668144691721
+30
+159.204283586808
+11
+665.021389999784
+21
+-658.447133448378
+31
+140.935603497775
+12
+644.636263548619
+22
+-662.459295238253
+32
+146.227531781659
+13
+644.636263548619
+23
+-662.459295238253
+33
+146.227531781659
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024140682123
+20
+-186.86272
+30
+97.713066817443
+11
+787.130167954486
+21
+-546.781824001004
+31
+73.639808098986
+12
+787.130167954486
+22
+-186.86272
+32
+73.639808098986
+13
+787.130167954486
+23
+-186.86272
+33
+73.639808098986
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130167954486
+20
+-546.781824001004
+30
+73.639808098986
+11
+779.024140682123
+21
+-186.86272
+31
+97.713066817443
+12
+779.024140682123
+22
+-547.186238711366
+32
+97.7130668174428
+13
+779.024140682123
+23
+-547.186238711366
+33
+97.7130668174428
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739289860341
+20
+-652.105388357143
+30
+102.482800970232
+11
+736.997695535365
+21
+-679.337949441333
+31
+100.317732616843
+12
+753.73928877638
+22
+-664.079300898903
+32
+88.749145475747
+13
+753.73928877638
+23
+-664.079300898903
+33
+88.749145475747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997695535365
+20
+-679.337949441333
+30
+100.317732616843
+11
+753.739289860341
+21
+-652.105388357143
+31
+102.482800970232
+12
+736.997696774917
+22
+-665.645302851503
+32
+116.022715463229
+13
+736.997696774917
+23
+-665.645302851503
+33
+116.022715463229
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031425007948
+20
+-579.704781244013
+30
+37.0766018107078
+11
+764.878707491771
+21
+-566.32138210224
+31
+23.3578380017417
+12
+764.805052044838
+22
+-569.303684335783
+32
+23.3578380010606
+13
+764.805052044838
+23
+-569.303684335783
+33
+23.3578380010606
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.878707491771
+20
+-566.32138210224
+30
+23.3578380017417
+11
+764.031425007948
+21
+-579.704781244013
+31
+37.0766018107078
+12
+764.031424128692
+22
+-575.559109938211
+32
+39.7948544698768
+13
+764.031424128692
+23
+-575.559109938211
+33
+39.7948544698768
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133279596418
+20
+-730.806273217008
+30
+50.2468283798967
+11
+623.546333434853
+21
+-733.96634875632
+31
+26.1777702748551
+12
+602.133267369982
+22
+-734.928077619115
+32
+26.2761627640122
+13
+602.133267369982
+23
+-734.928077619115
+33
+26.2761627640122
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546333434853
+20
+-733.96634875632
+30
+26.1777702748551
+11
+602.133279596418
+21
+-730.806273217008
+31
+50.2468283798967
+12
+623.546345594915
+22
+-729.866920753093
+32
+50.0183042486409
+13
+623.546345594915
+23
+-729.866920753093
+33
+50.0183042486409
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667765582876
+20
+-713.015957461653
+30
+95.3999068495287
+11
+602.133289350819
+21
+-723.456525449862
+31
+73.4322395118387
+12
+454.667758482489
+22
+-723.456530152174
+32
+73.4322964107047
+13
+454.667758482489
+23
+-723.456530152174
+33
+73.4322964107047
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133289350819
+20
+-723.456525449862
+30
+73.4322395118387
+11
+454.667765582876
+21
+-713.015957461653
+31
+95.3999068495287
+12
+602.13329645121
+22
+-713.015947331523
+32
+95.3998613711292
+13
+602.13329645121
+23
+-713.015947331523
+33
+95.3998613711292
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677518140403
+20
+-751.514112490764
+30
+117.036156904666
+11
+468.84015475682
+21
+-767.174448290109
+31
+90.6571807720069
+12
+470.677509279169
+22
+-764.543874438695
+32
+89.6207321892548
+13
+470.677509279169
+23
+-764.543874438695
+33
+89.6207321892548
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84015475682
+20
+-767.174448290109
+30
+90.6571807720069
+11
+470.677518140403
+21
+-751.514112490764
+31
+117.036156904666
+12
+468.84016373079
+22
+-753.978916343896
+32
+118.421395812685
+13
+468.84016373079
+23
+-753.978916343896
+33
+118.421395812685
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.938975880549
+20
+-818.724058836624
+30
+-6.38891606286052e-11
+11
+590.37090239636
+21
+-820.924226612819
+31
+23.3578380793719
+12
+590.370902396357
+22
+-820.924226612815
+32
+1.80477854883065e-13
+13
+590.370902396357
+23
+-820.924226612815
+33
+1.80477854883065e-13
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+590.37090239636
+20
+-820.924226612819
+30
+23.3578380793719
+11
+623.938975880549
+21
+-818.724058836624
+31
+-6.38891606286052e-11
+12
+623.938975880552
+22
+-818.724058836629
+32
+23.3578380793071
+13
+623.938975880552
+23
+-818.724058836629
+33
+23.3578380793071
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840142428527
+20
+-776.463572930403
+30
+61.353838580619
+11
+466.630399083827
+21
+-784.205377362117
+31
+31.3170895287116
+12
+468.840126975903
+22
+-781.672997259934
+32
+31.0580369189494
+13
+468.840126975903
+23
+-781.672997259934
+33
+31.0580369189494
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630399083827
+20
+-784.205377362117
+30
+31.3170895287116
+11
+468.840142428527
+21
+-776.463572930403
+31
+61.353838580619
+12
+466.630414711229
+22
+-778.937031754263
+32
+61.9555523461604
+13
+466.630414711229
+23
+-778.937031754263
+33
+61.9555523461604
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829301759449
+20
+-547.569288532173
+30
+120.514493197419
+11
+753.73926375928
+21
+-571.352333223692
+31
+140.862402824032
+12
+767.82931463357
+22
+-569.196470349584
+32
+119.787647909415
+13
+767.82931463357
+23
+-569.196470349584
+33
+119.787647909415
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73926375928
+20
+-571.352333223692
+30
+140.862402824032
+11
+767.829301759449
+21
+-547.569288532173
+31
+120.514493197419
+12
+753.739249813186
+22
+-547.924349168088
+32
+141.649769387184
+13
+753.739249813186
+23
+-547.924349168088
+33
+141.649769387184
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797653593913
+20
+-738.498463121584
+30
+26.6414790273437
+11
+454.667748728094
+21
+-730.806274098353
+31
+50.2468973323294
+12
+454.667736501664
+22
+-734.928076357629
+32
+26.2762441782473
+13
+454.667736501664
+23
+-734.928076357629
+33
+26.2762441782473
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667748728094
+20
+-730.806274098353
+30
+50.2468973323294
+11
+454.797653593913
+21
+-738.498463121584
+31
+26.6414790273437
+12
+454.797666066761
+22
+-734.293588076417
+32
+51.0952482583018
+13
+454.797666066761
+23
+-734.293588076417
+33
+51.0952482583018
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281980096118
+20
+-754.771251996272
+30
+28.306117626709
+11
+450.471101097006
+21
+-747.425197006803
+31
+54.2897470886059
+12
+450.471087696265
+22
+-751.942885609203
+32
+28.0167869283821
+13
+450.471087696265
+23
+-751.942885609203
+33
+28.0167869283821
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471101097006
+20
+-747.425197006803
+30
+54.2897470886059
+11
+448.281980096118
+21
+-754.771251996272
+31
+28.306117626709
+12
+448.281993692064
+22
+-750.187755353023
+32
+54.9617894316777
+13
+448.281993692064
+23
+-750.187755353023
+33
+54.9617894316777
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275046789786
+20
+-580.758079568763
+30
+102.623043056121
+11
+753.576397473233
+21
+-565.700992480648
+31
+85.6172131326287
+12
+753.576402819491
+22
+-576.182653575586
+32
+83.8148703207571
+13
+753.576402819491
+23
+-576.182653575586
+33
+83.8148703207571
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576397473233
+20
+-565.700992480648
+30
+85.6172131326287
+11
+744.275046789786
+21
+-580.758079568763
+31
+102.623043056121
+12
+744.275040114523
+22
+-567.670823535761
+32
+104.873423184286
+13
+744.275040114523
+23
+-567.670823535761
+33
+104.873423184286
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838897838644
+20
+-549.148351803013
+30
+214.504708726405
+11
+429.26772029492
+21
+-186.86272
+31
+214.795486963908
+12
+432.838897838644
+22
+-186.86272
+32
+214.504708726405
+13
+432.838897838644
+23
+-186.86272
+33
+214.504708726405
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.26772029492
+20
+-186.86272
+30
+214.795486963908
+11
+432.838897838644
+21
+-549.148351803013
+31
+214.504708726405
+12
+429.26772029492
+22
+-549.153237717187
+32
+214.795486963908
+13
+429.26772029492
+23
+-549.153237717187
+33
+214.795486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667769896794
+20
+-699.679329838522
+30
+115.739912506852
+11
+602.13329645121
+21
+-713.015947331523
+31
+95.3998613711292
+12
+454.667765582876
+22
+-713.015957461653
+32
+95.3999068495287
+13
+454.667765582876
+23
+-713.015957461653
+33
+95.3999068495287
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13329645121
+20
+-713.015947331523
+30
+95.3998613711292
+11
+454.667769896794
+21
+-699.679329838522
+31
+115.739912506852
+12
+602.13330076513
+22
+-699.679312774979
+32
+115.739877602763
+13
+602.13330076513
+23
+-699.679312774979
+33
+115.739877602763
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84016373079
+20
+-753.978916343896
+30
+118.421395812685
+11
+466.630427178961
+21
+-769.542842319152
+31
+91.5903304644009
+12
+468.84015475682
+22
+-767.174448290109
+32
+90.6571807720069
+13
+468.84015475682
+23
+-767.174448290109
+33
+90.6571807720069
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630427178961
+20
+-769.542842319152
+30
+91.5903304644009
+11
+468.84016373079
+21
+-753.978916343896
+31
+118.421395812685
+12
+466.630436254431
+22
+-756.198062094967
+32
+119.668573109345
+13
+466.630436254431
+23
+-756.198062094967
+33
+119.668573109345
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247009199941
+20
+-651.873941250939
+30
+175.584391651154
+11
+453.575559198051
+21
+-626.958539673324
+31
+183.741680540481
+12
+453.575566723046
+22
+-650.239827098532
+32
+172.676755002411
+13
+453.575566723046
+23
+-650.239827098532
+33
+172.676755002411
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575559198051
+20
+-626.958539673324
+30
+183.741680540481
+11
+452.247009199941
+21
+-651.873941250939
+31
+175.584391651154
+12
+452.247001541956
+22
+-628.181198889296
+32
+186.844869872835
+13
+452.247001541956
+23
+-628.181198889296
+33
+186.844869872835
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221343105619
+20
+-699.12426393804
+30
+42.5395709625037
+11
+718.363082853901
+21
+-688.112661424818
+31
+23.3578379602634
+12
+702.221333321817
+22
+-702.422601699266
+32
+23.3578379520354
+13
+702.221333321817
+23
+-702.422601699266
+33
+23.3578379520354
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363082853901
+20
+-688.112661424818
+30
+23.3578379602634
+11
+702.221343105619
+21
+-699.12426393804
+31
+42.5395709625037
+12
+718.363090933403
+22
+-685.388881228845
+32
+39.1981879427727
+13
+718.363090933403
+23
+-685.388881228845
+33
+39.1981879427727
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0
+20
+-549.622587401036
+30
+242.726639240051
+11
+448.317739367628
+21
+-581.662614799822
+31
+241.649835054513
+12
+448.31772029492
+22
+-549.622454002523
+32
+242.726639240051
+13
+448.31772029492
+23
+-549.622454002523
+33
+242.726639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317739367628
+20
+-581.662614799822
+30
+241.649835054513
+11
+0.0
+21
+-549.622587401036
+31
+242.726639240051
+12
+1.90727753096809e-05
+22
+-581.662862311522
+32
+241.649831219402
+13
+1.90727753096809e-05
+23
+-581.662862311522
+33
+241.649831219402
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721746731967
+20
+-699.576473436421
+30
+149.95388604473
+11
+442.839490392048
+21
+-680.220295673638
+31
+169.6537686923
+12
+445.721745102502
+22
+-678.931345516719
+32
+167.953679054935
+13
+445.721745102502
+23
+-678.931345516719
+33
+167.953679054935
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839490392048
+20
+-680.220295673638
+30
+169.6537686923
+11
+445.721746731967
+21
+-699.576473436421
+31
+149.95388604473
+12
+442.839492038848
+22
+-701.085065061495
+32
+151.462477669651
+13
+442.839492038848
+23
+-701.085065061495
+33
+151.462477669651
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.31772029492
+20
+-549.622454002523
+30
+242.726639240051
+11
+451.683300548936
+21
+-581.654891394158
+31
+241.574352401781
+12
+451.683281480069
+22
+-549.621181308374
+32
+242.650939792116
+13
+451.683281480069
+23
+-549.621181308374
+33
+242.650939792116
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683300548936
+20
+-581.654891394158
+30
+241.574352401781
+11
+448.31772029492
+21
+-549.622454002523
+31
+242.726639240051
+12
+448.317739367628
+22
+-581.662614799822
+32
+241.649835054513
+13
+448.317739367628
+23
+-581.662614799822
+33
+241.649835054513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247001541956
+20
+-628.181198889296
+30
+186.844869872835
+11
+453.575548860337
+21
+-602.386639077964
+31
+191.530943822063
+12
+453.575559198051
+22
+-626.958539673324
+32
+183.741680540481
+13
+453.575559198051
+23
+-626.958539673324
+33
+183.741680540481
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575548860337
+20
+-602.386639077964
+30
+191.530943822063
+11
+452.247001541956
+21
+-628.181198889296
+31
+186.844869872835
+12
+452.246991021541
+22
+-603.175034087969
+32
+194.771794391524
+13
+452.246991021541
+23
+-603.175034087969
+33
+194.771794391524
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690620823844
+20
+-720.64180705444
+30
+131.632946903436
+11
+442.839485482368
+21
+-734.454801614587
+31
+107.448702644845
+12
+439.690615872653
+22
+-735.948583762681
+32
+108.288220362449
+13
+439.690615872653
+23
+-735.948583762681
+33
+108.288220362449
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839485482368
+20
+-734.454801614587
+30
+107.448702644845
+11
+439.690620823844
+21
+-720.64180705444
+31
+131.632946903436
+12
+442.839490392048
+22
+-719.276356082042
+32
+130.597708279963
+13
+442.839490392048
+23
+-719.276356082042
+33
+130.597708279963
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130190684252
+20
+-597.186922321698
+30
+60.1350749996264
+11
+779.024169884095
+21
+-620.964740882273
+31
+71.3421534984996
+12
+787.130191214298
+22
+-603.902540579901
+32
+54.279953197846
+13
+787.130191214298
+23
+-603.902540579901
+33
+54.279953197846
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024169884095
+20
+-620.964740882273
+30
+71.3421534984996
+11
+787.130190684252
+21
+-597.186922321698
+31
+60.1350749996264
+12
+779.024169157982
+22
+-611.764971197169
+32
+79.3631234201936
+13
+779.024169157982
+23
+-611.764971197169
+33
+79.3631234201936
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090762524528
+20
+-612.101685596006
+30
+231.466577935614
+11
+466.630427178961
+21
+-641.212917863139
+31
+219.920254933339
+12
+466.630414711229
+22
+-611.578139745845
+32
+229.314444371434
+13
+466.630414711229
+23
+-611.578139745845
+33
+229.314444371434
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630427178961
+20
+-641.212917863139
+30
+219.920254933339
+11
+464.090762524528
+21
+-612.101685596006
+31
+231.466577935614
+12
+464.090775113584
+22
+-642.024842985963
+32
+221.980972610863
+13
+464.090775113584
+23
+-642.024842985963
+33
+221.980972610863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+642.023925698403
+20
+-654.528573978644
+30
+5.83945951983345
+11
+629.962604584718
+21
+-661.494594174547
+31
+-2.52668996836292e-12
+12
+629.962604584718
+22
+-661.494594174546
+32
+5.83945951983435
+13
+629.962604584718
+23
+-661.494594174546
+33
+5.83945951983435
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+629.962604584718
+20
+-661.494594174547
+30
+-2.52668996836292e-12
+11
+642.023925698403
+21
+-654.528573978644
+31
+5.83945951983345
+12
+642.023925698404
+22
+-654.528573978645
+32
+-3.60955709766131e-12
+13
+642.023925698404
+23
+-654.528573978645
+33
+-3.60955709766131e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+681.150249762187
+20
+-615.402249914861
+30
+-7.58006990508875e-12
+11
+688.116269958089
+21
+-603.340928801175
+31
+5.8394595198284
+12
+688.116269958089
+22
+-603.340928801176
+32
+-8.48245917950408e-12
+13
+688.116269958089
+23
+-603.340928801176
+33
+-8.48245917950408e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.116269958089
+20
+-603.340928801175
+30
+5.8394595198284
+11
+681.150249762187
+21
+-615.402249914861
+31
+-7.58006990508875e-12
+12
+681.150249762187
+22
+-615.402249914861
+32
+5.83945951982948
+13
+681.150249762187
+23
+-615.402249914861
+33
+5.83945951982948
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+700.992216732393
+20
+-563.749226612814
+30
+5.83945951982569
+11
+806.270901222104
+21
+56.1856515498016
+31
+1.46187062455283e-11
+12
+700.992216732393
+22
+-563.749226612815
+32
+-1.11896270027501e-11
+13
+700.992216732393
+23
+-563.749226612815
+33
+-1.11896270027501e-11
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+806.270901222104
+20
+56.1856515498016
+30
+1.46187062455283e-11
+11
+700.992216732393
+21
+-563.749226612814
+31
+5.83945951982569
+12
+764.995900047839
+22
+-186.86272
+32
+5.83945951983706
+13
+764.995900047839
+23
+-186.86272
+33
+5.83945951983706
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+806.270901222104
+20
+56.1856515498016
+30
+1.46187062455283e-11
+11
+764.995900047839
+21
+-186.86272
+31
+5.83945951983706
+12
+806.270901222105
+22
+56.1856515497994
+32
+23.3578380793657
+13
+806.270901222105
+23
+56.1856515497994
+33
+23.3578380793657
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+806.270901222105
+20
+56.1856515497994
+30
+23.3578380793657
+11
+764.995900047839
+21
+-186.86272
+31
+5.83945951983706
+12
+764.995900047839
+22
+-186.86272
+32
+23.3578380793295
+13
+764.995900047839
+23
+-186.86272
+33
+23.3578380793295
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642020846985
+20
+-549.252284780773
+30
+220.6922004252
+11
+473.101722427237
+21
+-579.753960348852
+31
+222.99174608133
+12
+473.642038802113
+22
+-579.415028713919
+32
+219.67849237548
+13
+473.642038802113
+23
+-579.415028713919
+33
+219.67849237548
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101722427237
+20
+-579.753960348852
+30
+222.99174608133
+11
+473.642020846985
+21
+-549.252284780773
+31
+220.6922004252
+12
+473.10170430358
+22
+-549.308104906071
+32
+224.014968929071
+13
+473.10170430358
+23
+-549.308104906071
+33
+224.014968929071
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.570900047839
+20
+-545.937123520845
+30
+23.3578380793295
+11
+792.007210733943
+21
+-561.872310305502
+31
+48.1897945304127
+12
+793.543158239603
+22
+-559.33210911257
+32
+23.3578380122893
+13
+793.543158239603
+23
+-559.33210911257
+33
+23.3578380122893
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007210733943
+20
+-561.872310305502
+30
+48.1897945304127
+11
+793.570900047839
+21
+-545.937123520845
+31
+23.3578380793295
+12
+792.00720150166
+22
+-546.363038171439
+32
+48.7110294035543
+13
+792.00720150166
+23
+-546.363038171439
+33
+48.7110294035543
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957381179691
+20
+-712.905797682657
+30
+125.767734693656
+11
+649.884126043939
+21
+-701.17731493105
+31
+151.554727539197
+12
+649.884124396077
+22
+-719.380332193364
+32
+130.67650856366
+13
+649.884124396077
+23
+-719.380332193364
+33
+130.67650856366
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884126043939
+20
+-701.17731493105
+30
+151.554727539197
+11
+673.957381179691
+21
+-712.905797682657
+31
+125.767734693656
+12
+673.957382761532
+22
+-695.432070757716
+32
+145.809483366442
+13
+673.957382761532
+23
+-695.432070757716
+33
+145.809483366442
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884124396077
+20
+-719.380332193364
+30
+130.67650856366
+11
+624.955348552338
+21
+-704.633972822346
+31
+155.011385430145
+12
+624.955346864755
+22
+-723.275770827742
+32
+133.629900413365
+13
+624.955346864755
+23
+-723.275770827742
+33
+133.629900413365
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955348552338
+20
+-704.633972822346
+30
+155.011385430145
+11
+649.884124396077
+21
+-719.380332193364
+31
+130.67650856366
+12
+649.884126043939
+22
+-701.17731493105
+32
+151.554727539197
+13
+649.884126043939
+23
+-701.17731493105
+33
+151.554727539197
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955346864755
+20
+-723.275770827742
+30
+133.629900413365
+11
+599.602157614092
+21
+-705.742266508454
+31
+156.119679116142
+12
+599.602155913773
+22
+-724.524747581215
+32
+134.576835581469
+13
+599.602155913773
+23
+-724.524747581215
+33
+134.576835581469
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602157614092
+20
+-705.742266508454
+30
+156.119679116142
+11
+624.955346864755
+21
+-723.275770827742
+31
+133.629900413365
+12
+624.955348552338
+22
+-704.633972822346
+32
+155.011385430145
+13
+624.955348552338
+23
+-704.633972822346
+33
+155.011385430145
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602155913773
+20
+-724.524747581215
+30
+134.576835581469
+11
+473.717779021898
+21
+-705.742288168363
+31
+156.11970077605
+12
+473.71777732158
+22
+-724.524762147558
+32
+134.576865377446
+13
+473.71777732158
+23
+-724.524762147558
+33
+134.576865377446
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717779021898
+20
+-705.742288168363
+30
+156.11970077605
+11
+599.602155913773
+21
+-724.524747581215
+31
+134.576835581469
+12
+599.602157614092
+22
+-705.742266508454
+32
+156.119679116142
+13
+599.602157614092
+23
+-705.742266508454
+33
+156.119679116142
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717779021898
+20
+-705.742288168363
+30
+156.11970077605
+11
+473.642078676977
+21
+-727.212938735792
+31
+136.614948795724
+12
+473.71777732158
+22
+-724.524762147558
+32
+134.576865377446
+13
+473.71777732158
+23
+-724.524762147558
+33
+134.576865377446
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642078676977
+20
+-727.212938735792
+30
+136.614948795724
+11
+473.717779021898
+21
+-705.742288168363
+31
+156.11970077605
+12
+473.642080404707
+22
+-708.127668368109
+32
+158.505080975556
+13
+473.642080404707
+23
+-708.127668368109
+33
+158.505080975556
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000889626013624645
+20
+-791.564217518411
+30
+23.3578380798509
+11
+448.317739367628
+21
+-791.272422434329
+31
+32.0400273988949
+12
+1.90727753096809e-05
+22
+-791.272418599218
+32
+32.0402749105959
+13
+1.90727753096809e-05
+23
+-791.272418599218
+33
+32.0402749105959
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317739367628
+20
+-791.272422434329
+30
+32.0400273988949
+11
+0.000889626013624645
+21
+-791.564217518411
+31
+23.3578380798509
+12
+448.317734199337
+22
+-791.564213042815
+32
+23.3578378526045
+13
+448.317734199337
+23
+-791.564213042815
+33
+23.3578378526045
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+698.091838084213
+20
+-577.37232127131
+30
+-1.01067598734517e-11
+11
+700.992216732393
+21
+-563.749226612814
+31
+5.83945951982569
+12
+700.992216732393
+22
+-563.749226612815
+32
+-1.11896270027501e-11
+13
+700.992216732393
+23
+-563.749226612815
+33
+-1.11896270027501e-11
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+700.992216732393
+20
+-563.749226612814
+30
+5.83945951982569
+11
+698.091838084213
+21
+-577.37232127131
+31
+-1.01067598734517e-11
+12
+698.091838084213
+22
+-577.37232127131
+32
+5.83945951982641
+13
+698.091838084213
+23
+-577.37232127131
+33
+5.83945951982641
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.00828976046904545
+20
+-763.617295762417
+30
+23.3578364570492
+11
+764.995900047839
+21
+-186.86272
+31
+23.3578380793295
+12
+0.00176534768970384
+22
+-186.86272
+32
+23.3578380793295
+13
+0.00176534768970384
+23
+-186.86272
+33
+23.3578380793295
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.995900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.995900047839
+22
+-545.937132023437
+32
+23.3578380793295
+13
+764.995900047839
+23
+-545.937132023437
+33
+23.3578380793295
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.995900047839
+20
+-545.937132023437
+30
+23.3578380793295
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.975642457445
+22
+-559.332124908489
+32
+23.3578380033138
+13
+764.975642457445
+23
+-559.332124908489
+33
+23.3578380033138
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.975642457445
+20
+-559.332124908489
+30
+23.3578380033138
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.959283764737
+22
+-561.475402706277
+32
+23.3578380028359
+13
+764.959283764737
+23
+-561.475402706277
+33
+23.3578380028359
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.959283764737
+20
+-561.475402706277
+30
+23.3578380028359
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.92809314571
+22
+-563.7670797619
+32
+23.357838002321
+13
+764.92809314571
+23
+-563.7670797619
+33
+23.357838002321
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.92809314571
+20
+-563.7670797619
+30
+23.357838002321
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.878707491771
+22
+-566.32138210224
+32
+23.3578380017417
+13
+764.878707491771
+23
+-566.32138210224
+33
+23.3578380017417
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.878707491771
+20
+-566.32138210224
+30
+23.3578380017417
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.805052044838
+22
+-569.303684335783
+32
+23.3578380010606
+13
+764.805052044838
+23
+-569.303684335783
+33
+23.3578380010606
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.805052044838
+20
+-569.303684335783
+30
+23.3578380010606
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.696220629469
+22
+-572.980425379156
+32
+23.3578380002154
+13
+764.696220629469
+23
+-572.980425379156
+33
+23.3578380002154
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.696220629469
+20
+-572.980425379156
+30
+23.3578380002154
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.531578361879
+22
+-577.829946771796
+32
+23.3578379990944
+13
+764.531578361879
+23
+-577.829946771796
+33
+23.3578379990944
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.531578361879
+20
+-577.829946771796
+30
+23.3578379990944
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.267940787943
+22
+-584.829097037034
+32
+23.3578379974678
+13
+764.267940787943
+23
+-584.829097037034
+33
+23.3578379974678
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.267940787943
+20
+-584.829097037034
+30
+23.3578379974678
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+764.031423295207
+22
+-590.643016368677
+32
+23.3578379961104
+13
+764.031423295207
+23
+-590.643016368677
+33
+23.3578379961104
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031423295207
+20
+-590.643016368677
+30
+23.3578379961104
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+763.093075318335
+22
+-596.364508960869
+32
+23.3578379945534
+13
+763.093075318335
+23
+-596.364508960869
+33
+23.3578379945534
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+763.093075318335
+20
+-596.364508960869
+30
+23.3578379945534
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+760.201821668678
+22
+-613.067712196625
+32
+23.3578379899606
+13
+760.201821668678
+23
+-613.067712196625
+33
+23.3578379899606
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201821668678
+20
+-613.067712196625
+30
+23.3578379899606
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+757.969157364208
+22
+-620.27407578666
+32
+23.3578379876696
+13
+757.969157364208
+23
+-620.27407578666
+33
+23.3578379876696
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+757.969157364208
+20
+-620.27407578666
+30
+23.3578379876696
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+753.576401186168
+22
+-633.988087312601
+32
+23.3578379832645
+13
+753.576401186168
+23
+-633.988087312601
+33
+23.3578379832645
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576401186168
+20
+-633.988087312601
+30
+23.3578379832645
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+744.275042822729
+22
+-653.583013796713
+32
+23.35783797602
+13
+744.275042822729
+23
+-653.583013796713
+33
+23.35783797602
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275042822729
+20
+-653.583013796713
+30
+23.35783797602
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+732.466045885959
+22
+-671.734013479962
+32
+23.3578379683062
+13
+732.466045885959
+23
+-671.734013479962
+33
+23.3578379683062
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466045885959
+20
+-671.734013479962
+30
+23.3578379683062
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+718.363082853901
+22
+-688.112661424818
+32
+23.3578379602634
+13
+718.363082853901
+23
+-688.112661424818
+33
+23.3578379602634
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363082853901
+20
+-688.112661424818
+30
+23.3578379602634
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+702.221333321817
+22
+-702.422601699266
+32
+23.3578379520354
+13
+702.221333321817
+23
+-702.422601699266
+33
+23.3578379520354
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221333321817
+20
+-702.422601699266
+30
+23.3578379520354
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+696.283090443709
+22
+-706.400240289655
+32
+23.3578379492919
+13
+696.283090443709
+23
+-706.400240289655
+33
+23.3578379492919
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.283090443709
+20
+-706.400240289655
+30
+23.3578379492919
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+684.332866703488
+22
+-714.293584916115
+32
+23.3578379437967
+13
+684.332866703488
+23
+-714.293584916115
+33
+23.3578379437967
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332866703488
+20
+-714.293584916115
+30
+23.3578379437967
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+454.667734764409
+22
+-735.026158016502
+32
+23.3578378670709
+13
+454.667734764409
+23
+-735.026158016502
+33
+23.3578378670709
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332866703488
+20
+-714.293584916115
+30
+23.3578379437967
+11
+454.667734764409
+21
+-735.026158016502
+31
+23.3578378670709
+12
+665.021357707386
+22
+-723.600194881456
+32
+23.3578379356765
+13
+665.021357707386
+23
+-723.600194881456
+33
+23.3578379356765
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021357707386
+20
+-723.600194881456
+30
+23.3578379356765
+11
+454.667734764409
+21
+-735.026158016502
+31
+23.3578378670709
+12
+644.636229608527
+22
+-730.229356318714
+32
+23.35783792781
+13
+644.636229608527
+23
+-730.229356318714
+33
+23.35783792781
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636229608527
+20
+-730.229356318714
+30
+23.35783792781
+11
+454.667734764409
+21
+-735.026158016502
+31
+23.3578378670709
+12
+623.546331756218
+22
+-734.061120907196
+32
+23.3578379203391
+13
+623.546331756218
+23
+-734.061120907196
+33
+23.3578379203391
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546331756218
+20
+-734.061120907196
+30
+23.3578379203391
+11
+454.667734764409
+21
+-735.026158016502
+31
+23.3578378670709
+12
+602.133265632776
+22
+-735.026156540265
+32
+23.357837913399
+13
+602.133265632776
+23
+-735.026156540265
+33
+23.357837913399
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667734764409
+20
+-735.026158016502
+30
+23.3578378670709
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+454.797651639243
+22
+-738.608819575715
+32
+23.3578378663214
+13
+454.797651639243
+23
+-738.608819575715
+33
+23.3578378663214
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797651639243
+20
+-738.608819575715
+30
+23.3578378663214
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+454.431238307724
+22
+-742.175043209088
+32
+23.3578378654204
+13
+454.431238307724
+23
+-742.175043209088
+33
+23.3578378654204
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431238307724
+20
+-742.175043209088
+30
+23.3578378654204
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+453.575533520408
+22
+-745.656322242814
+32
+23.3578378643829
+13
+453.575533520408
+23
+-745.656322242814
+33
+23.3578378643829
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575533520408
+20
+-745.656322242814
+30
+23.3578378643829
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+452.24697525056
+22
+-748.985781777358
+32
+23.3578378632311
+13
+452.24697525056
+23
+-748.985781777358
+33
+23.3578378632311
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.24697525056
+20
+-748.985781777358
+30
+23.3578378632311
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+450.471084922909
+22
+-752.099463345238
+32
+23.3578378619863
+13
+450.471084922909
+23
+-752.099463345238
+33
+23.3578378619863
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471084922909
+20
+-752.099463345238
+30
+23.3578378619863
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+448.28197715053
+22
+-754.937553544539
+32
+23.3578378606726
+13
+448.28197715053
+23
+-754.937553544539
+33
+23.3578378606726
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.28197715053
+20
+-754.937553544539
+30
+23.3578378606726
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+445.72170439774
+22
+-757.445533046268
+32
+23.3578378593151
+13
+445.72170439774
+23
+-757.445533046268
+33
+23.3578378593151
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.72170439774
+20
+-757.445533046268
+30
+23.3578378593151
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+442.839449157947
+22
+-759.575223903305
+32
+23.3578378579396
+13
+442.839449157947
+23
+-759.575223903305
+33
+23.3578378579396
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839449157947
+20
+-759.575223903305
+30
+23.3578378579396
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+439.690579164597
+22
+-761.285715042239
+32
+23.357837856573
+13
+439.690579164597
+23
+-761.285715042239
+33
+23.357837856573
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690579164597
+20
+-761.285715042239
+30
+23.357837856573
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+436.335583784501
+22
+-762.544148159569
+32
+23.3578378552417
+13
+436.335583784501
+23
+-762.544148159569
+33
+23.3578378552417
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335583784501
+20
+-762.544148159569
+30
+23.3578378552417
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+432.838912025282
+22
+-763.326348925263
+32
+23.3578378539704
+13
+432.838912025282
+23
+-763.326348925263
+33
+23.3578378539704
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838912025282
+20
+-763.326348925263
+30
+23.3578378539704
+11
+0.00828976046904545
+21
+-763.617295762417
+31
+23.3578364570492
+12
+429.267734478649
+22
+-763.617291372796
+32
+23.3578378527852
+13
+429.267734478649
+23
+-763.617291372796
+33
+23.3578378527852
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71777732158
+20
+-724.524762147558
+30
+134.576865377446
+11
+473.64207352602
+21
+-743.137302565856
+31
+112.328325554405
+12
+473.717772252345
+22
+-740.196478791399
+32
+110.675560324675
+13
+473.717772252345
+23
+-740.196478791399
+33
+110.675560324675
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.64207352602
+20
+-743.137302565856
+30
+112.328325554405
+11
+473.71777732158
+21
+-724.524762147558
+31
+134.576865377446
+12
+473.642078676977
+22
+-727.212938735792
+32
+136.614948795724
+13
+473.642078676977
+23
+-727.212938735792
+33
+136.614948795724
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894066860413
+20
+-715.319417548222
+30
+70.2261702210487
+11
+696.758800443365
+21
+-717.703482376537
+31
+98.03426599948
+12
+696.758793128571
+22
+-728.459323997255
+32
+75.4033102397292
+13
+696.758793128571
+23
+-728.459323997255
+33
+75.4033102397292
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758800443365
+20
+-717.703482376537
+30
+98.03426599948
+11
+717.894066860413
+21
+-715.319417548222
+31
+70.2261702210487
+12
+717.894073612081
+22
+-705.391608581792
+32
+91.1148940822994
+13
+717.894073612081
+23
+-705.391608581792
+33
+91.1148940822994
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.22135687427
+20
+-684.591375697813
+30
+79.4250100709702
+11
+718.363098127435
+21
+-679.968320245868
+31
+56.297813526916
+12
+702.221351073972
+22
+-693.120266957808
+32
+61.4796955534277
+13
+702.221351073972
+23
+-693.120266957808
+33
+61.4796955534277
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363098127435
+20
+-679.968320245868
+30
+56.297813526916
+11
+702.22135687427
+21
+-684.591375697813
+31
+79.4250100709702
+12
+718.363103364091
+22
+-672.268220571567
+32
+72.49929930736
+13
+718.363103364091
+23
+-672.268220571567
+33
+72.49929930736
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677497105752
+20
+-773.716303656482
+30
+60.6855157395589
+11
+468.840126975903
+21
+-781.672997259934
+31
+31.0580369189494
+12
+470.677481847252
+22
+-778.860284147472
+32
+30.7703076765303
+13
+470.677481847252
+23
+-778.860284147472
+33
+30.7703076765303
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840126975903
+20
+-781.672997259934
+30
+31.0580369189494
+11
+470.677497105752
+21
+-773.716303656482
+31
+60.6855157395589
+12
+468.840142428527
+22
+-776.463572930403
+32
+61.353838580619
+13
+468.840142428527
+23
+-776.463572930403
+33
+61.353838580619
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829328484993
+20
+-662.181333229905
+30
+49.2897100106075
+11
+753.739272918395
+21
+-687.397248351576
+31
+39.6867423818656
+12
+767.82932233817
+22
+-666.812843070624
+32
+34.6792140832892
+13
+767.82932233817
+23
+-666.812843070624
+33
+34.6792140832892
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739272918395
+20
+-687.397248351576
+30
+39.6867423818656
+11
+767.829328484993
+21
+-662.181333229905
+31
+49.2897100106075
+12
+753.739280225648
+22
+-681.891377242064
+32
+57.0554860936115
+13
+753.739280225648
+23
+-681.891377242064
+33
+57.0554860936115
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471119570638
+20
+-727.926175547966
+30
+103.779563345764
+11
+452.247013852634
+21
+-710.823016652003
+31
+124.188674487802
+12
+452.247009199941
+22
+-725.20697903804
+32
+102.251353856666
+13
+452.247009199941
+23
+-725.20697903804
+33
+102.251353856666
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247013852634
+20
+-710.823016652003
+30
+124.188674487802
+11
+450.471119570638
+21
+-727.926175547966
+31
+103.779563345764
+12
+450.471124298894
+22
+-713.308606140826
+32
+126.073163560098
+13
+450.471124298894
+23
+-713.308606140826
+33
+126.073163560098
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471111788281
+20
+-739.369532914357
+30
+79.7020319508277
+11
+452.247009199941
+21
+-725.20697903804
+31
+102.251353856666
+12
+452.247001541956
+22
+-736.467457257336
+32
+78.5586114938894
+13
+452.247001541956
+23
+-736.467457257336
+33
+78.5586114938894
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247009199941
+20
+-725.20697903804
+30
+102.251353856666
+11
+450.471111788281
+21
+-739.369532914357
+31
+79.7020319508277
+12
+450.471119570638
+22
+-727.926175547966
+32
+103.779563345764
+13
+450.471119570638
+23
+-727.926175547966
+33
+103.779563345764
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955290211342
+20
+-549.169431970937
+30
+215.762940693873
+11
+649.884068906774
+21
+-186.86272
+31
+210.885907146698
+12
+624.955290211342
+22
+-186.86272
+32
+215.762940693873
+13
+624.955290211342
+23
+-186.86272
+33
+215.762940693873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884068906774
+20
+-186.86272
+30
+210.885907146698
+11
+624.955290211342
+21
+-549.169431970937
+31
+215.762940693873
+12
+649.884068906774
+22
+-549.087494127121
+32
+210.885907146698
+13
+649.884068906774
+23
+-549.087494127121
+33
+210.885907146698
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031409168954
+20
+-546.296855411639
+30
+44.7709041931231
+11
+764.995900047839
+21
+-186.86272
+31
+23.3578380793295
+12
+764.995900047839
+22
+-545.937132023437
+32
+23.3578380793295
+13
+764.995900047839
+23
+-545.937132023437
+33
+23.3578380793295
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.995900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+764.031409168954
+21
+-546.296855411639
+31
+44.7709041931231
+12
+764.031409168954
+22
+-186.86272
+32
+44.7709041931231
+13
+764.031409168954
+23
+-186.86272
+33
+44.7709041931231
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546362358205
+20
+-644.548798426367
+30
+162.550587374486
+11
+602.133289350819
+21
+-623.054826905935
+31
+173.833938065877
+12
+623.546355296361
+22
+-622.700434111963
+32
+172.934485818424
+13
+623.546355296361
+23
+-622.700434111963
+33
+172.934485818424
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133289350819
+20
+-623.054826905935
+30
+173.833938065877
+11
+623.546362358205
+21
+-644.548798426367
+31
+162.550587374486
+12
+602.13329645121
+22
+-645.022448764174
+32
+163.393359945326
+13
+602.13329645121
+23
+-645.022448764174
+33
+163.393359945326
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721740244506
+20
+-656.026027291755
+30
+182.972342518915
+11
+448.282004539076
+21
+-630.366836092636
+31
+192.392159030223
+12
+448.282012434797
+22
+-654.795098868987
+32
+180.78210913444
+13
+448.282012434797
+23
+-654.795098868987
+33
+180.78210913444
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282004539076
+20
+-630.366836092636
+30
+192.392159030223
+11
+445.721740244506
+21
+-656.026027291755
+31
+182.972342518915
+12
+445.721732248607
+22
+-631.28782828485
+32
+194.729696180594
+13
+445.721732248607
+23
+-631.28782828485
+33
+194.729696180594
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006085098156
+20
+-613.111377811381
+30
+235.617099433291
+11
+458.222243636608
+21
+-643.225259958184
+31
+225.027705344708
+12
+458.222230868175
+22
+-612.875739362874
+32
+234.648467298763
+13
+458.222230868175
+23
+-612.875739362874
+33
+234.648467298763
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222243636608
+20
+-643.225259958184
+30
+225.027705344708
+11
+455.006085098156
+21
+-613.111377811381
+31
+235.617099433291
+12
+455.006097921195
+22
+-643.590691959854
+32
+225.95519307716
+13
+455.006097921195
+23
+-643.590691959854
+33
+225.95519307716
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.016303397997907
+20
+-722.503108278541
+30
+133.044187229337
+11
+429.267771709642
+21
+-737.984763689194
+31
+109.432571697368
+12
+0.016298390231306
+22
+-737.984793176583
+32
+109.432704078611
+13
+0.016298390231306
+23
+-737.984793176583
+33
+109.432704078611
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267771709642
+20
+-737.984763689194
+30
+109.432571697368
+11
+0.016303397997907
+21
+-722.503108278541
+31
+133.044187229337
+12
+429.267776717416
+22
+-722.503058608961
+32
+133.044085628428
+13
+429.267776717416
+23
+-722.503058608961
+33
+133.044085628428
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267776717416
+20
+-722.503058608961
+30
+133.044085628428
+11
+432.838949191021
+21
+-737.730681730485
+31
+109.289774750901
+12
+429.267771709642
+22
+-737.984763689194
+32
+109.432571697368
+13
+429.267771709642
+23
+-737.984763689194
+33
+109.432571697368
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838949191021
+20
+-737.730681730485
+30
+109.289774750901
+11
+429.267776717416
+21
+-722.503058608961
+31
+133.044085628428
+12
+432.838954191733
+22
+-722.270804730449
+32
+132.867998161508
+13
+432.838954191733
+23
+-722.270804730449
+33
+132.867998161508
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955307916438
+20
+-764.38593632126
+30
+29.2895600085649
+11
+599.602131038669
+21
+-761.101673056328
+31
+57.616722979916
+12
+599.602116671527
+22
+-765.945156978237
+32
+29.4490754688794
+13
+599.602116671527
+23
+-765.945156978237
+33
+29.4490754688794
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602131038669
+20
+-761.101673056328
+30
+57.616722979916
+11
+624.955307916438
+21
+-764.38593632126
+31
+29.2895600085649
+12
+624.955322175969
+22
+-759.578730682939
+32
+57.2462284142879
+13
+624.955322175969
+23
+-759.578730682939
+33
+57.2462284142879
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576386337194
+20
+-546.993607173192
+30
+86.2459300397311
+11
+760.201806938459
+21
+-186.86272
+31
+65.8608020071314
+12
+760.201806938459
+22
+-546.651150672583
+32
+65.8608020071314
+13
+760.201806938459
+23
+-546.651150672583
+33
+65.8608020071314
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201806938459
+20
+-186.86272
+30
+65.8608020071314
+11
+753.576386337194
+21
+-546.993607173192
+31
+86.2459300397311
+12
+753.576386337194
+22
+-186.86272
+32
+86.2459300397311
+13
+753.576386337194
+23
+-186.86272
+33
+86.2459300397311
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201806938459
+20
+-546.651150672583
+30
+65.8608020071314
+11
+764.031409168954
+21
+-186.86272
+31
+44.7709041931231
+12
+764.031409168954
+22
+-546.296855411639
+32
+44.7709041931231
+13
+764.031409168954
+23
+-546.296855411639
+33
+44.7709041931231
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031409168954
+20
+-186.86272
+30
+44.7709041931231
+11
+760.201806938459
+21
+-546.651150672583
+31
+65.8608020071314
+12
+760.201806938459
+22
+-186.86272
+32
+65.8608020071314
+13
+760.201806938459
+23
+-186.86272
+33
+65.8608020071314
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332892871929
+20
+-694.910065817882
+30
+85.2241968080869
+11
+702.221351073972
+21
+-693.120266957808
+31
+61.4796955534277
+12
+684.332886599671
+22
+-704.132938548301
+32
+65.8187023707334
+13
+684.332886599671
+23
+-704.132938548301
+33
+65.8187023707334
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221351073972
+20
+-693.120266957808
+30
+61.4796955534277
+11
+684.332892871929
+21
+-694.910065817882
+31
+85.2241968080869
+12
+702.22135687427
+22
+-684.591375697813
+32
+79.4250100709702
+13
+702.22135687427
+23
+-684.591375697813
+33
+79.4250100709702
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721745102502
+20
+-717.576266444547
+30
+129.308758123214
+11
+448.282018840978
+21
+-697.799916727886
+31
+148.177329336375
+12
+448.282017231929
+22
+-715.574196634022
+32
+127.790856991425
+13
+448.282017231929
+23
+-715.574196634022
+33
+127.790856991425
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282018840978
+20
+-697.799916727886
+30
+148.177329336375
+11
+445.721745102502
+21
+-717.576266444547
+31
+129.308758123214
+12
+445.721746731967
+22
+-699.576473436421
+32
+149.95388604473
+13
+445.721746731967
+23
+-699.576473436421
+33
+149.95388604473
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13330076513
+20
+-665.362464994464
+30
+150.056725386733
+11
+454.667765582876
+21
+-645.022494242574
+31
+163.393370075456
+12
+602.13329645121
+22
+-645.022448764174
+32
+163.393359945326
+13
+602.13329645121
+23
+-645.022448764174
+33
+163.393359945326
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667765582876
+20
+-645.022494242574
+30
+163.393370075456
+11
+602.13330076513
+21
+-665.362464994464
+31
+150.056725386733
+12
+454.667769896794
+22
+-665.362499898554
+32
+150.056742450276
+13
+454.667769896794
+23
+-665.362499898554
+33
+150.056742450276
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955322175969
+20
+-759.578730682939
+30
+57.2462284142879
+11
+599.60214250095
+21
+-752.465070814344
+31
+84.8616271735756
+12
+599.602131038669
+22
+-761.101673056328
+32
+57.616722979916
+13
+599.602131038669
+23
+-761.101673056328
+33
+57.616722979916
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.60214250095
+20
+-752.465070814344
+30
+84.8616271735756
+11
+624.955322175969
+21
+-759.578730682939
+31
+57.2462284142879
+12
+624.955333552396
+22
+-751.006817642042
+32
+84.2870649622931
+13
+624.955333552396
+23
+-751.006817642042
+33
+84.2870649622931
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.016298390231306
+20
+-737.984793176583
+30
+109.432704078611
+11
+429.267763467221
+21
+-750.104609262675
+31
+83.9316672902124
+12
+0.0162901478210909
+22
+-750.104622950446
+32
+83.93183291483
+13
+0.0162901478210909
+23
+-750.104622950446
+33
+83.93183291483
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267763467221
+20
+-750.104609262675
+30
+83.9316672902124
+11
+0.016298390231306
+21
+-737.984793176583
+31
+109.432704078611
+12
+429.267771709642
+22
+-737.984763689194
+32
+109.432571697368
+13
+429.267771709642
+23
+-737.984763689194
+33
+109.432571697368
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717752446486
+20
+-761.101673808691
+30
+57.6167818413605
+11
+473.642038802113
+21
+-769.301079755069
+31
+29.7924413152051
+12
+473.717738079349
+22
+-765.945155901366
+32
+29.449144968378
+13
+473.717738079349
+23
+-765.945155901366
+33
+29.449144968378
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642038802113
+20
+-769.301079755069
+30
+29.7924413152051
+11
+473.717752446486
+21
+-761.101673808691
+31
+57.6167818413605
+12
+473.642053400866
+22
+-764.379514823734
+32
+58.4141748490874
+13
+473.642053400866
+23
+-764.379514823734
+33
+58.4141748490874
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683344551435
+20
+-699.535098538027
+30
+195.129470137406
+11
+455.006114828511
+21
+-723.308225016813
+31
+173.685637622731
+12
+455.006112926336
+22
+-699.207898179883
+32
+194.697902416163
+13
+455.006112926336
+23
+-699.207898179883
+33
+194.697902416163
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006114828511
+20
+-723.308225016813
+30
+173.685637622731
+11
+451.683344551435
+21
+-699.535098538027
+31
+195.129470137406
+12
+451.68334645801
+22
+-723.691181151156
+32
+174.068593757036
+13
+451.68334645801
+23
+-723.691181151156
+33
+174.068593757036
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642065047928
+20
+-635.720877069339
+30
+205.981095949127
+11
+473.101757695049
+21
+-663.582663624963
+31
+196.418146784964
+12
+473.64207352602
+22
+-661.950912950484
+32
+193.514715177954
+13
+473.64207352602
+23
+-661.950912950484
+33
+193.514715177954
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101757695049
+20
+-663.582663624963
+30
+196.418146784964
+11
+473.642065047928
+21
+-635.720877069339
+31
+205.981095949127
+12
+473.101749084159
+22
+-636.941767787464
+32
+209.079797462849
+13
+473.101749084159
+23
+-636.941767787464
+33
+209.079797462849
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894057585081
+20
+-722.308196422019
+30
+48.1794664928565
+11
+696.758793128571
+21
+-728.459323997255
+31
+75.4033102397292
+12
+696.758783079627
+22
+-736.03100461107
+32
+51.5177928651329
+13
+696.758783079627
+23
+-736.03100461107
+33
+51.5177928651329
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758793128571
+20
+-728.459323997255
+30
+75.4033102397292
+11
+717.894057585081
+21
+-722.308196422019
+31
+48.1794664928565
+12
+717.894066860413
+22
+-715.319417548222
+32
+70.2261702210487
+13
+717.894066860413
+23
+-715.319417548222
+33
+70.2261702210487
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839485482368
+20
+-734.454801614587
+30
+107.448702644845
+11
+445.721732248607
+21
+-744.352283565408
+31
+81.6652408886482
+12
+442.839477401402
+22
+-746.337240593148
+32
+82.4473163912804
+13
+442.839477401402
+23
+-746.337240593148
+33
+82.4473163912804
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721732248607
+20
+-744.352283565408
+30
+81.6652408886482
+11
+442.839485482368
+21
+-734.454801614587
+31
+107.448702644845
+12
+445.721740244506
+22
+-732.59492990622
+32
+106.403439896738
+13
+445.721740244506
+23
+-732.59492990622
+33
+106.403439896738
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957376463676
+20
+-653.154439951202
+30
+177.862934850716
+11
+696.758804887548
+21
+-668.611056374494
+31
+154.341547662779
+12
+696.758800443365
+22
+-647.656853392997
+32
+168.080894990074
+13
+696.758800443365
+23
+-647.656853392997
+33
+168.080894990074
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758804887548
+20
+-668.611056374494
+30
+154.341547662779
+11
+673.957376463676
+21
+-653.154439951202
+31
+177.862934850716
+12
+673.957381179691
+22
+-675.39032208669
+32
+163.283210293402
+13
+673.957381179691
+23
+-675.39032208669
+33
+163.283210293402
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884119483233
+20
+-657.135168302204
+30
+184.945974477603
+11
+673.957381179691
+21
+-675.39032208669
+31
+163.283210293402
+12
+673.957376463676
+22
+-653.154439951202
+32
+177.862934850716
+13
+673.957376463676
+23
+-653.154439951202
+33
+177.862934850716
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957381179691
+20
+-675.39032208669
+30
+163.283210293402
+11
+649.884119483233
+21
+-657.135168302204
+31
+184.945974477603
+12
+649.884124396077
+22
+-680.299095957346
+32
+169.757744803614
+13
+649.884124396077
+23
+-680.299095957346
+33
+169.757744803614
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955341833487
+20
+-659.530197478533
+30
+189.207522894826
+11
+649.884124396077
+21
+-680.299095957346
+31
+169.757744803614
+12
+649.884119483233
+22
+-657.135168302204
+32
+184.945974477603
+13
+649.884119483233
+23
+-657.135168302204
+33
+184.945974477603
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884124396077
+20
+-680.299095957346
+30
+169.757744803614
+11
+624.955341833487
+21
+-659.530197478533
+31
+189.207522894826
+12
+624.955346864755
+22
+-683.252487807443
+32
+173.653183437694
+13
+624.955346864755
+23
+-683.252487807443
+33
+173.653183437694
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602150844536
+20
+-660.298108897689
+30
+190.573882756048
+11
+624.955346864755
+21
+-683.252487807443
+31
+173.653183437694
+12
+624.955341833487
+22
+-659.530197478533
+32
+189.207522894826
+13
+624.955341833487
+23
+-659.530197478533
+33
+189.207522894826
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955346864755
+20
+-683.252487807443
+30
+173.653183437694
+11
+599.602150844536
+21
+-660.298108897689
+31
+190.573882756048
+12
+599.602155913773
+22
+-684.199422975673
+32
+174.902160191072
+13
+599.602155913773
+23
+-684.199422975673
+33
+174.902160191072
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717772252345
+20
+-660.298147720458
+30
+190.573891403664
+11
+599.602155913773
+21
+-684.199422975673
+31
+174.902160191072
+12
+599.602150844536
+22
+-660.298108897689
+32
+190.573882756048
+13
+599.602150844536
+23
+-660.298108897689
+33
+190.573882756048
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602155913773
+20
+-684.199422975673
+30
+174.902160191072
+11
+473.717772252345
+21
+-660.298147720458
+31
+190.573891403664
+12
+473.71777732158
+22
+-684.199452771651
+32
+174.902174757415
+13
+473.71777732158
+23
+-684.199452771651
+33
+174.902174757415
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717772252345
+20
+-660.298147720458
+30
+190.573891403664
+11
+473.642078676977
+21
+-686.237536190199
+31
+177.590351345444
+12
+473.71777732158
+22
+-684.199452771651
+32
+174.902174757415
+13
+473.71777732158
+23
+-684.199452771651
+33
+174.902174757415
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642078676977
+20
+-686.237536190199
+30
+177.590351345444
+11
+473.717772252345
+21
+-660.298147720458
+31
+190.573891403664
+12
+473.64207352602
+22
+-661.950912950484
+32
+193.514715177954
+13
+473.64207352602
+23
+-661.950912950484
+33
+193.514715177954
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.64207352602
+20
+-661.950912950484
+30
+193.514715177954
+11
+473.101762926689
+21
+-688.249705748186
+31
+180.244348164837
+12
+473.642078676977
+22
+-686.237536190199
+32
+177.590351345444
+13
+473.642078676977
+23
+-686.237536190199
+33
+177.590351345444
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101762926689
+20
+-688.249705748186
+30
+180.244348164837
+11
+473.64207352602
+21
+-661.950912950484
+31
+193.514715177954
+12
+473.101757695049
+22
+-663.582663624963
+32
+196.418146784964
+13
+473.101757695049
+23
+-663.582663624963
+33
+196.418146784964
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335627427501
+20
+-703.188137968552
+30
+153.565550576497
+11
+439.690620823844
+21
+-720.64180705444
+31
+131.632946903436
+12
+436.335625756533
+22
+-721.646389233184
+32
+132.394587199654
+13
+436.335625756533
+23
+-721.646389233184
+33
+132.394587199654
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690620823844
+20
+-720.64180705444
+30
+131.632946903436
+11
+436.335627427501
+21
+-703.188137968552
+31
+153.565550576497
+12
+439.690622484567
+22
+-702.296711761968
+32
+152.674124370004
+13
+439.690622484567
+23
+-702.296711761968
+33
+152.674124370004
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.545902396357
+20
+-563.749226612815
+30
+1.80477854883065e-13
+11
+843.130722681617
+21
+-608.452917091224
+31
+23.3578380793307
+12
+843.130722681614
+22
+-608.45291709122
+32
+-4.11489509133389e-11
+13
+843.130722681614
+23
+-608.45291709122
+33
+-4.11489509133389e-11
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+847.545902396357
+21
+-563.749226612815
+31
+1.80477854883065e-13
+12
+847.54590239636
+22
+-563.749226612819
+32
+23.3578380793719
+13
+847.54590239636
+23
+-563.749226612819
+33
+23.3578380793719
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.31772029492
+20
+-549.622454002523
+30
+242.726639240051
+11
+451.683281480069
+21
+-186.86272
+31
+242.650939792116
+12
+448.31772029492
+22
+-186.86272
+32
+242.726639240051
+13
+448.31772029492
+23
+-186.86272
+33
+242.726639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683281480069
+20
+-186.86272
+30
+242.650939792116
+11
+448.31772029492
+21
+-549.622454002523
+31
+242.726639240051
+12
+451.683281480069
+22
+-549.621181308374
+32
+242.650939792116
+13
+451.683281480069
+23
+-549.621181308374
+33
+242.650939792116
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677523524142
+20
+-692.042929592268
+30
+185.247506781241
+11
+468.840171011807
+21
+-716.921589517517
+31
+167.299002124079
+12
+470.677525329952
+22
+-714.922321501014
+32
+165.299734107777
+13
+470.677525329952
+23
+-714.922321501014
+33
+165.299734107777
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840171011807
+20
+-716.921589517517
+30
+167.299002124079
+11
+470.677523524142
+21
+-692.042929592268
+31
+185.247506781241
+12
+468.840169183023
+22
+-693.751116561201
+32
+187.500558577709
+13
+468.840169183023
+23
+-693.751116561201
+33
+187.500558577709
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71777732158
+20
+-684.199452771651
+30
+174.902174757415
+11
+599.602157614092
+21
+-705.742266508454
+31
+156.119679116142
+12
+599.602155913773
+22
+-684.199422975673
+32
+174.902160191072
+13
+599.602155913773
+23
+-684.199422975673
+33
+174.902160191072
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602157614092
+20
+-705.742266508454
+30
+156.119679116142
+11
+473.71777732158
+21
+-684.199452771651
+31
+174.902174757415
+12
+473.717779021898
+22
+-705.742288168363
+32
+156.11970077605
+13
+473.717779021898
+23
+-705.742288168363
+33
+156.11970077605
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101762926689
+20
+-729.866935555387
+30
+138.627118353444
+11
+472.10720415349
+21
+-748.850999084323
+31
+115.539466637413
+12
+473.101757695049
+22
+-746.04073417303
+32
+113.960076228591
+13
+473.101757695049
+23
+-746.04073417303
+33
+113.960076228591
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.10720415349
+20
+-748.850999084323
+30
+115.539466637413
+11
+473.101762926689
+21
+-729.866935555387
+31
+138.627118353444
+12
+472.107209463225
+22
+-732.435769686289
+32
+140.574720545467
+13
+472.107209463225
+23
+-732.435769686289
+33
+140.574720545467
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107209463225
+20
+-732.435769686289
+30
+140.574720545467
+11
+470.677518140403
+21
+-751.514112490764
+31
+117.036156904666
+12
+472.10720415349
+22
+-748.850999084323
+32
+115.539466637413
+13
+472.10720415349
+23
+-748.850999084323
+33
+115.539466637413
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677518140403
+20
+-751.514112490764
+30
+117.036156904666
+11
+472.107209463225
+21
+-732.435769686289
+31
+140.574720545467
+12
+470.677523524142
+22
+-734.870094172174
+32
+142.420342197022
+13
+470.677523524142
+23
+-734.870094172174
+33
+142.420342197022
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677523524142
+20
+-734.870094172174
+30
+142.420342197022
+11
+468.84016373079
+21
+-753.978916343896
+31
+118.421395812685
+12
+470.677518140403
+22
+-751.514112490764
+32
+117.036156904666
+13
+470.677518140403
+23
+-751.514112490764
+33
+117.036156904666
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84016373079
+20
+-753.978916343896
+30
+118.421395812685
+11
+470.677523524142
+21
+-734.870094172174
+31
+142.420342197022
+12
+468.840169183023
+22
+-737.123145968814
+32
+144.128529165728
+13
+468.840169183023
+23
+-737.123145968814
+33
+144.128529165728
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247015413237
+20
+-693.583909707096
+30
+143.961322316008
+11
+453.575571294939
+21
+-671.796177947369
+31
+158.542588616663
+12
+453.575572828439
+22
+-691.225448319662
+32
+141.602860928812
+13
+453.575572828439
+23
+-691.225448319662
+33
+141.602860928812
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575571294939
+20
+-671.796177947369
+30
+158.542588616663
+11
+452.247015413237
+21
+-693.583909707096
+31
+143.961322316008
+12
+452.247013852634
+22
+-673.811261880626
+32
+161.200429262907
+13
+452.247013852634
+23
+-673.811261880626
+33
+161.200429262907
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006063894518
+20
+-790.94784918938
+30
+23.3578378548415
+11
+451.683300548936
+21
+-791.196939781596
+31
+32.0323039932388
+12
+451.683295385243
+22
+-791.4884708222
+32
+23.3578378536789
+13
+451.683295385243
+23
+-791.4884708222
+33
+23.3578378536789
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683300548936
+20
+-791.196939781596
+30
+32.0323039932388
+11
+455.006063894518
+21
+-790.94784918938
+31
+23.3578378548415
+12
+455.006069025402
+22
+-790.658170470477
+32
+31.9771884161607
+13
+455.006069025402
+23
+-790.658170470477
+33
+31.9771884161607
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130167954486
+20
+-186.86272
+30
+73.639808098986
+11
+792.00720150166
+21
+-546.363038171439
+31
+48.7110294035543
+12
+792.00720150166
+22
+-186.86272
+32
+48.7110294035543
+13
+792.00720150166
+23
+-186.86272
+33
+48.7110294035543
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.00720150166
+20
+-546.363038171439
+30
+48.7110294035543
+11
+787.130167954486
+21
+-186.86272
+31
+73.639808098986
+12
+787.130167954486
+22
+-546.781824001004
+32
+73.639808098986
+13
+787.130167954486
+23
+-546.781824001004
+33
+73.639808098986
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667748728094
+20
+-730.806274098353
+30
+50.2468973323294
+11
+602.133267369982
+21
+-734.928077619115
+31
+26.2761627640122
+12
+454.667736501664
+22
+-734.928076357629
+32
+26.2762441782473
+13
+454.667736501664
+23
+-734.928076357629
+33
+26.2762441782473
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133267369982
+20
+-734.928077619115
+30
+26.2761627640122
+11
+454.667748728094
+21
+-730.806274098353
+31
+50.2468973323294
+12
+602.133279596418
+22
+-730.806273217008
+32
+50.2468283798967
+13
+602.133279596418
+23
+-730.806273217008
+33
+50.2468283798967
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840169183023
+20
+-737.123145968814
+30
+144.128529165728
+11
+466.630436254431
+21
+-756.198062094967
+31
+119.668573109345
+12
+468.84016373079
+22
+-753.978916343896
+32
+118.421395812685
+13
+468.84016373079
+23
+-753.978916343896
+33
+118.421395812685
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630436254431
+20
+-756.198062094967
+30
+119.668573109345
+11
+468.840169183023
+21
+-737.123145968814
+31
+144.128529165728
+12
+466.630441768332
+22
+-739.151644255831
+32
+145.666467410881
+13
+466.630441768332
+23
+-739.151644255831
+33
+145.666467410881
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636252442318
+20
+-621.293308682581
+30
+169.363127662308
+11
+623.546345594915
+21
+-599.640891643383
+31
+180.244333371467
+12
+644.636242951136
+22
+-598.733544865996
+32
+176.514545976725
+13
+644.636242951136
+23
+-598.733544865996
+33
+176.514545976725
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546345594915
+20
+-599.640891643383
+30
+180.244333371467
+11
+644.636252442318
+21
+-621.293308682581
+31
+169.363127662308
+12
+623.546355296361
+22
+-622.700434111963
+32
+172.934485818424
+13
+623.546355296361
+23
+-622.700434111963
+33
+172.934485818424
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717752446486
+20
+-607.239369239249
+30
+211.479086426299
+11
+599.60214250095
+21
+-634.484214570593
+31
+202.842483429208
+12
+599.602131038669
+22
+-607.239310377804
+32
+211.479085673936
+13
+599.602131038669
+23
+-607.239310377804
+33
+211.479085673936
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.60214250095
+20
+-634.484214570593
+30
+202.842483429208
+11
+473.717752446486
+21
+-607.239369239249
+31
+211.479086426299
+12
+473.717763908762
+22
+-634.484263142475
+32
+202.842487443351
+13
+473.717763908762
+23
+-634.484263142475
+33
+202.842487443351
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739280225648
+20
+-681.891377242064
+30
+57.0554860936115
+11
+736.997677401125
+21
+-706.00295242646
+31
+44.2129177479029
+12
+753.739272918395
+22
+-687.397248351576
+32
+39.6867423818656
+13
+753.739272918395
+23
+-687.397248351576
+33
+39.6867423818656
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997677401125
+20
+-706.00295242646
+30
+44.2129177479029
+11
+753.739280225648
+21
+-681.891377242064
+31
+57.0554860936115
+12
+736.997685757261
+22
+-699.706769202407
+32
+64.0747689619352
+13
+736.997685757261
+23
+-699.706769202407
+33
+64.0747689619352
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894073612081
+20
+-705.391608581792
+30
+91.1148940822994
+11
+696.758804887548
+21
+-703.964135051352
+31
+118.98846898236
+12
+696.758800443365
+22
+-717.703482376537
+32
+98.03426599948
+13
+696.758800443365
+23
+-717.703482376537
+33
+98.03426599948
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758804887548
+20
+-703.964135051352
+30
+118.98846898236
+11
+717.894073612081
+21
+-705.391608581792
+31
+91.1148940822994
+12
+717.894077714131
+22
+-692.709977485149
+32
+110.455949073024
+13
+717.894077714131
+23
+-692.709977485149
+33
+110.455949073024
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642020846985
+20
+-186.86272
+30
+220.692200425201
+11
+473.71772029492
+21
+-549.195745909472
+31
+217.326639240051
+12
+473.71772029492
+22
+-186.86272
+32
+217.326639240051
+13
+473.71772029492
+23
+-186.86272
+33
+217.326639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-549.195745909472
+30
+217.326639240051
+11
+473.642020846985
+21
+-186.86272
+31
+220.692200425201
+12
+473.642020846985
+22
+-549.252284780773
+32
+220.6922004252
+13
+473.642020846985
+23
+-549.252284780773
+33
+220.6922004252
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222243636608
+20
+-643.225259958184
+30
+225.027705344708
+11
+461.269994170696
+21
+-671.278610214274
+31
+210.111811908437
+12
+461.26998493348
+22
+-642.699946567149
+32
+223.694427829008
+13
+461.26998493348
+23
+-642.699946567149
+33
+223.694427829008
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269994170696
+20
+-671.278610214274
+30
+210.111811908437
+11
+458.222243636608
+21
+-643.225259958184
+31
+225.027705344708
+12
+458.222252930963
+22
+-671.980703984767
+32
+211.3610708001
+13
+458.222252930963
+23
+-671.980703984767
+33
+211.3610708001
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431270729568
+20
+-648.531199395009
+30
+169.63653352158
+11
+454.797676017751
+21
+-624.370524419528
+31
+177.173126470384
+12
+454.797683261242
+22
+-646.78088064753
+32
+166.522129452237
+13
+454.797683261242
+23
+-646.78088064753
+33
+166.522129452237
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797676017751
+20
+-624.370524419528
+30
+177.173126470384
+11
+454.431270729568
+21
+-648.531199395009
+31
+169.63653352158
+12
+454.431263343628
+22
+-625.680128816835
+32
+180.496989380173
+13
+454.431263343628
+23
+-625.680128816835
+33
+180.496989380173
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162788245333154
+20
+-758.636496454861
+30
+57.0173045265452
+11
+429.267737950976
+21
+-763.421251234373
+31
+29.1909851596944
+12
+0.0162646316092562
+22
+-763.421247562364
+32
+29.1912221451116
+13
+0.0162646316092562
+23
+-763.421247562364
+33
+29.1912221451116
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267737950976
+20
+-763.421251234373
+30
+29.1909851596944
+11
+0.0162788245333154
+21
+-758.636496454861
+31
+57.0173045265452
+12
+429.267752143919
+22
+-758.636493889386
+32
+57.017103815686
+13
+429.267752143919
+23
+-758.636493889386
+33
+57.017103815686
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471070624061
+20
+-548.959849908146
+30
+203.284158309243
+11
+452.246960920592
+21
+-186.86272
+31
+200.172233713933
+12
+452.246960920592
+22
+-548.907571431286
+32
+200.172233713933
+13
+452.246960920592
+23
+-548.907571431286
+33
+200.172233713933
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246960920592
+20
+-186.86272
+30
+200.172233713933
+11
+450.471070624061
+21
+-548.959849908146
+31
+203.284158309243
+12
+450.471070624061
+22
+-186.86272
+32
+203.284158309244
+13
+450.471070624061
+23
+-186.86272
+33
+203.284158309244
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006097921195
+20
+-643.590691959854
+30
+225.95519307716
+11
+458.222252930963
+21
+-671.980703984767
+31
+211.3610708001
+12
+458.222243636608
+22
+-643.225259958184
+32
+225.027705344708
+13
+458.222243636608
+23
+-643.225259958184
+33
+225.027705344708
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222252930963
+20
+-671.980703984767
+30
+211.3610708001
+11
+455.006097921195
+21
+-643.590691959854
+31
+225.95519307716
+12
+455.006107255299
+22
+-672.469112270075
+32
+212.230111445991
+13
+455.006107255299
+23
+-672.469112270075
+33
+212.230111445991
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031424128692
+20
+-589.417441849078
+30
+25.9365225576139
+11
+764.267940787943
+21
+-584.829097037034
+31
+23.3578379974678
+12
+764.031423295207
+22
+-590.643016368677
+32
+23.3578379961104
+13
+764.031423295207
+23
+-590.643016368677
+33
+23.3578379961104
+70
+0
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838949191021
+20
+-737.730681730485
+30
+109.289774750901
+11
+436.335612575248
+21
+-749.104396759147
+31
+83.5375802413299
+12
+432.838940960221
+22
+-749.833439201604
+32
+83.824824767603
+13
+432.838940960221
+23
+-749.833439201604
+33
+83.824824767603
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335612575248
+20
+-749.104396759147
+30
+83.5375802413299
+11
+432.838949191021
+21
+-737.730681730485
+31
+109.289774750901
+12
+436.335620774804
+22
+-737.047580997407
+32
+108.905866027708
+13
+436.335620774804
+23
+-737.047580997407
+33
+108.905866027708
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642078676977
+20
+-727.212938735792
+30
+136.614948795724
+11
+473.101757695049
+21
+-746.04073417303
+31
+113.960076228591
+12
+473.64207352602
+22
+-743.137302565856
+32
+112.328325554405
+13
+473.64207352602
+23
+-743.137302565856
+33
+112.328325554405
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101757695049
+20
+-746.04073417303
+30
+113.960076228591
+11
+473.642078676977
+21
+-727.212938735792
+31
+136.614948795724
+12
+473.101762926689
+22
+-729.866935555387
+32
+138.627118353444
+13
+473.101762926689
+23
+-729.866935555387
+33
+138.627118353444
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997695535365
+20
+-649.940320006495
+30
+129.715362054641
+11
+717.894079090038
+21
+-677.51110607242
+31
+127.888518682951
+12
+736.997696774917
+22
+-665.645302851503
+32
+116.022715463229
+13
+736.997696774917
+23
+-665.645302851503
+33
+116.022715463229
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894079090038
+20
+-677.51110607242
+30
+127.888518682951
+11
+736.997695535365
+21
+-649.940320006495
+31
+129.715362054641
+12
+717.894077714131
+22
+-660.078536464024
+32
+143.087390097436
+13
+717.894077714131
+23
+-660.078536464024
+33
+143.087390097436
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758804887548
+20
+-668.611056374494
+30
+154.341547662779
+11
+717.894079090038
+21
+-677.51110607242
+31
+127.888518682951
+12
+717.894077714131
+22
+-660.078536464024
+32
+143.087390097436
+13
+717.894077714131
+23
+-660.078536464024
+33
+143.087390097436
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894079090038
+20
+-677.51110607242
+30
+127.888518682951
+11
+696.758804887548
+21
+-668.611056374494
+31
+154.341547662779
+12
+696.758806378212
+22
+-687.497596031337
+32
+137.875008640862
+13
+696.758806378212
+23
+-687.497596031337
+33
+137.875008640862
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957381179691
+20
+-675.39032208669
+30
+163.283210293402
+11
+696.758806378212
+21
+-687.497596031337
+31
+137.875008640862
+12
+696.758804887548
+22
+-668.611056374494
+32
+154.341547662779
+13
+696.758804887548
+23
+-668.611056374494
+33
+154.341547662779
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758806378212
+20
+-687.497596031337
+30
+137.875008640862
+11
+673.957381179691
+21
+-675.39032208669
+31
+163.283210293402
+12
+673.957382761532
+22
+-695.432070757716
+32
+145.809483366442
+13
+673.957382761532
+23
+-695.432070757716
+33
+145.809483366442
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884124396077
+20
+-680.299095957346
+30
+169.757744803614
+11
+673.957382761532
+21
+-695.432070757716
+31
+145.809483366442
+12
+673.957381179691
+22
+-675.39032208669
+32
+163.283210293402
+13
+673.957381179691
+23
+-675.39032208669
+33
+163.283210293402
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957382761532
+20
+-695.432070757716
+30
+145.809483366442
+11
+649.884124396077
+21
+-680.299095957346
+31
+169.757744803614
+12
+649.884126043939
+22
+-701.17731493105
+32
+151.554727539197
+13
+649.884126043939
+23
+-701.17731493105
+33
+151.554727539197
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955346864755
+20
+-683.252487807443
+30
+173.653183437694
+11
+649.884126043939
+21
+-701.17731493105
+31
+151.554727539197
+12
+649.884124396077
+22
+-680.299095957346
+32
+169.757744803614
+13
+649.884124396077
+23
+-680.299095957346
+33
+169.757744803614
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884126043939
+20
+-701.17731493105
+30
+151.554727539197
+11
+624.955346864755
+21
+-683.252487807443
+31
+173.653183437694
+12
+624.955348552338
+22
+-704.633972822346
+32
+155.011385430145
+13
+624.955348552338
+23
+-704.633972822346
+33
+155.011385430145
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829332959368
+20
+-655.602108768076
+30
+63.1328050448759
+11
+753.739280225648
+21
+-681.891377242064
+31
+57.0554860936115
+12
+767.829328484993
+22
+-662.181333229905
+32
+49.2897100106075
+13
+767.829328484993
+23
+-662.181333229905
+33
+49.2897100106075
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739280225648
+20
+-681.891377242064
+30
+57.0554860936115
+11
+767.829332959368
+21
+-655.602108768076
+31
+63.1328050448759
+12
+753.73928554472
+22
+-674.070091498716
+32
+73.5119548557674
+13
+753.73928554472
+23
+-674.070091498716
+33
+73.5119548557674
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928554472
+20
+-674.070091498716
+30
+73.5119548557674
+11
+736.997685757261
+21
+-699.706769202407
+31
+64.0747689619352
+12
+753.739280225648
+22
+-681.891377242064
+32
+57.0554860936115
+13
+753.739280225648
+23
+-681.891377242064
+33
+57.0554860936115
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997685757261
+20
+-699.706769202407
+30
+64.0747689619352
+11
+753.73928554472
+21
+-674.070091498716
+31
+73.5119548557674
+12
+736.997691839832
+22
+-690.762816990611
+32
+82.8933973835911
+13
+736.997691839832
+23
+-690.762816990611
+33
+82.8933973835911
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997685757261
+20
+-699.706769202407
+30
+64.0747689619352
+11
+717.894073612081
+21
+-705.391608581792
+31
+91.1148940822994
+12
+717.894066860413
+22
+-715.319417548222
+32
+70.2261702210487
+13
+717.894066860413
+23
+-715.319417548222
+33
+70.2261702210487
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894073612081
+20
+-705.391608581792
+30
+91.1148940822994
+11
+736.997685757261
+21
+-699.706769202407
+31
+64.0747689619352
+12
+736.997691839832
+22
+-690.762816990611
+32
+82.8933973835911
+13
+736.997691839832
+23
+-690.762816990611
+33
+82.8933973835911
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.26998493348
+20
+-642.699946567149
+30
+223.694427829008
+11
+464.090784277369
+21
+-670.376318084996
+31
+208.5063328654
+12
+464.090775113584
+22
+-642.024842985963
+32
+221.980972610863
+13
+464.090775113584
+23
+-642.024842985963
+33
+221.980972610863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090784277369
+20
+-670.376318084996
+30
+208.5063328654
+11
+461.26998493348
+21
+-642.699946567149
+31
+223.694427829008
+12
+461.269994170696
+22
+-671.278610214274
+32
+210.111811908437
+13
+461.269994170696
+23
+-671.278610214274
+33
+210.111811908437
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090762524528
+20
+-781.089165318495
+30
+62.4790981961044
+11
+461.26998493348
+21
+-773.317015214971
+31
+93.0773591680305
+12
+461.269972243544
+22
+-782.87863142832
+32
+62.9144188854628
+13
+461.269972243544
+23
+-782.87863142832
+33
+62.9144188854628
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.26998493348
+20
+-773.317015214971
+30
+93.0773591680305
+11
+464.090762524528
+21
+-781.089165318495
+31
+62.4790981961044
+12
+464.090775113584
+22
+-771.603559996758
+32
+92.4022555870175
+13
+464.090775113584
+23
+-771.603559996758
+33
+92.4022555870175
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471101097006
+20
+-747.425197006803
+30
+54.2897470886059
+11
+452.247001541956
+21
+-736.467457257336
+31
+78.5586114938894
+12
+452.246991021541
+22
+-744.394381773506
+32
+53.5524466917642
+13
+452.246991021541
+23
+-744.394381773506
+33
+53.5524466917642
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247001541956
+20
+-736.467457257336
+30
+78.5586114938894
+11
+450.471101097006
+21
+-747.425197006803
+31
+54.2897470886059
+12
+450.471111788281
+22
+-739.369532914357
+32
+79.7020319508277
+13
+450.471111788281
+23
+-739.369532914357
+33
+79.7020319508277
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246991021541
+20
+-744.394381773506
+30
+53.5524466917642
+11
+453.575559198051
+21
+-733.364267924859
+31
+77.3359522782304
+12
+453.575548860337
+22
+-741.153531203966
+32
+52.7640516820845
+13
+453.575548860337
+23
+-741.153531203966
+33
+52.7640516820845
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575559198051
+20
+-733.364267924859
+30
+77.3359522782304
+11
+452.246991021541
+21
+-744.394381773506
+31
+53.5524466917642
+12
+452.247001541956
+22
+-736.467457257336
+32
+78.5586114938894
+13
+452.247001541956
+23
+-736.467457257336
+33
+78.5586114938894
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575548860337
+20
+-741.153531203966
+30
+52.7640516820845
+11
+454.431263343628
+21
+-730.119576764422
+31
+76.0575414220674
+12
+454.431253196946
+22
+-737.764901599428
+32
+51.9397070211046
+13
+454.431253196946
+23
+-737.764901599428
+33
+51.9397070211046
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431263343628
+20
+-730.119576764422
+30
+76.0575414220674
+11
+453.575548860337
+21
+-741.153531203966
+31
+52.7640516820845
+12
+453.575559198051
+22
+-733.364267924859
+32
+77.3359522782304
+13
+453.575559198051
+23
+-733.364267924859
+33
+77.3359522782304
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431253196946
+20
+-737.764901599428
+30
+51.9397070211046
+11
+454.797676017751
+21
+-726.7957138545
+31
+74.7479370250946
+12
+454.797666066761
+22
+-734.293588076417
+32
+51.0952482583018
+13
+454.797666066761
+23
+-734.293588076417
+33
+51.0952482583018
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797676017751
+20
+-726.7957138545
+30
+74.7479370250946
+11
+454.431253196946
+21
+-737.764901599428
+31
+51.9397070211046
+12
+454.431263343628
+22
+-730.119576764422
+32
+76.0575414220674
+13
+454.431263343628
+23
+-730.119576764422
+33
+76.0575414220674
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797666066761
+20
+-734.293588076417
+30
+51.0952482583018
+11
+454.667758482489
+21
+-723.456530152174
+31
+73.4322964107047
+12
+454.667748728094
+22
+-730.806274098353
+32
+50.2468973323294
+13
+454.667748728094
+23
+-730.806274098353
+33
+50.2468973323294
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667758482489
+20
+-723.456530152174
+30
+73.4322964107047
+11
+454.797666066761
+21
+-734.293588076417
+31
+51.0952482583018
+12
+454.797676017751
+22
+-726.7957138545
+32
+74.7479370250946
+13
+454.797676017751
+23
+-726.7957138545
+33
+74.7479370250946
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667758482489
+20
+-723.456530152174
+30
+73.4322964107047
+11
+602.133279596418
+21
+-730.806273217008
+31
+50.2468283798967
+12
+454.667748728094
+22
+-730.806274098353
+32
+50.2468973323294
+13
+454.667748728094
+23
+-730.806274098353
+33
+50.2468973323294
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133279596418
+20
+-730.806273217008
+30
+50.2468283798967
+11
+454.667758482489
+21
+-723.456530152174
+31
+73.4322964107047
+12
+602.133289350819
+22
+-723.456525449862
+32
+73.4322395118387
+13
+602.133289350819
+23
+-723.456525449862
+33
+73.4322395118387
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133289350819
+20
+-723.456525449862
+30
+73.4322395118387
+11
+623.546345594915
+21
+-729.866920753093
+31
+50.0183042486409
+12
+602.133279596418
+22
+-730.806273217008
+32
+50.2468283798967
+13
+602.133279596418
+23
+-730.806273217008
+33
+50.2468283798967
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546345594915
+20
+-729.866920753093
+30
+50.0183042486409
+11
+602.133289350819
+21
+-723.456525449862
+31
+73.4322395118387
+12
+623.546355296361
+22
+-722.557073202373
+32
+73.0778467179566
+13
+623.546355296361
+23
+-722.557073202373
+33
+73.0778467179566
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546355296361
+20
+-722.557073202373
+30
+73.0778467179566
+11
+644.636242951136
+21
+-726.13713335826
+31
+49.1109574716297
+12
+623.546345594915
+22
+-729.866920753093
+32
+50.0183042486409
+13
+623.546345594915
+23
+-729.866920753093
+33
+50.0183042486409
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636242951136
+20
+-726.13713335826
+30
+49.1109574716297
+11
+623.546355296361
+21
+-722.557073202373
+31
+73.0778467179566
+12
+644.636252442318
+22
+-718.985715046116
+32
+71.6707212889357
+13
+644.636252442318
+23
+-718.985715046116
+33
+71.6707212889357
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636252442318
+20
+-718.985715046116
+30
+71.6707212889357
+11
+665.021370191738
+21
+-719.684397959595
+31
+47.5412056189011
+12
+644.636242951136
+22
+-726.13713335826
+32
+49.1109574716297
+13
+644.636242951136
+23
+-726.13713335826
+33
+49.1109574716297
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021370191738
+20
+-719.684397959595
+30
+47.5412056189011
+11
+644.636252442318
+21
+-718.985715046116
+31
+71.6707212889357
+12
+665.021379319153
+22
+-712.807071282992
+32
+69.2363238103713
+13
+665.021379319153
+23
+-712.807071282992
+33
+69.2363238103713
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+672.962315038389
+20
+-626.669841908538
+30
+-6.49720277579036e-12
+11
+681.150249762187
+21
+-615.402249914861
+31
+5.83945951982948
+12
+681.150249762187
+22
+-615.402249914861
+32
+-7.58006990508875e-12
+13
+681.150249762187
+23
+-615.402249914861
+33
+-7.58006990508875e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+681.150249762187
+20
+-615.402249914861
+30
+5.83945951982948
+11
+672.962315038389
+21
+-626.669841908538
+31
+-6.49720277579036e-12
+12
+672.962315038389
+22
+-626.669841908537
+32
+5.83945951983038
+13
+672.962315038389
+23
+-626.669841908537
+33
+5.83945951983038
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+700.992216732393
+20
+-563.749226612814
+30
+5.83945951982569
+11
+0.00176534768975319
+21
+-186.86272
+31
+5.83945951983706
+12
+764.995900047839
+22
+-186.86272
+32
+5.83945951983706
+13
+764.995900047839
+23
+-186.86272
+33
+5.83945951983706
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.00176534768975319
+20
+-186.86272
+30
+5.83945951983706
+11
+700.992216732393
+21
+-563.749226612814
+31
+5.83945951982569
+12
+0.000467548731367373
+22
+-674.37054094885
+32
+5.83945951983706
+13
+0.000467548731367373
+23
+-674.37054094885
+33
+5.83945951983706
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+700.992216732393
+21
+-563.749226612814
+31
+5.83945951982569
+12
+698.091838084213
+22
+-577.37232127131
+32
+5.83945951982641
+13
+698.091838084213
+23
+-577.37232127131
+33
+5.83945951982641
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+698.091838084213
+21
+-577.37232127131
+31
+5.83945951982641
+12
+693.784141830299
+22
+-590.617873632807
+32
+5.83945951982749
+13
+693.784141830299
+23
+-590.617873632807
+33
+5.83945951982749
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+693.784141830299
+21
+-590.617873632807
+31
+5.83945951982749
+12
+688.116269958089
+22
+-603.340928801175
+32
+5.8394595198284
+13
+688.116269958089
+23
+-603.340928801175
+33
+5.8394595198284
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+688.116269958089
+21
+-603.340928801175
+31
+5.8394595198284
+12
+681.150249762187
+22
+-615.402249914861
+32
+5.83945951982948
+13
+681.150249762187
+23
+-615.402249914861
+33
+5.83945951982948
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+681.150249762187
+21
+-615.402249914861
+31
+5.83945951982948
+12
+672.962315038389
+22
+-626.669841908537
+32
+5.83945951983038
+13
+672.962315038389
+23
+-626.669841908537
+33
+5.83945951983038
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+672.962315038389
+21
+-626.669841908537
+31
+5.83945951983038
+12
+663.642071806513
+22
+-637.020396022971
+32
+5.83945951983146
+13
+663.642071806513
+23
+-637.020396022971
+33
+5.83945951983146
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+663.642071806513
+21
+-637.020396022971
+31
+5.83945951983146
+12
+653.29151769208
+22
+-646.340639254846
+32
+5.83945951983237
+13
+653.29151769208
+23
+-646.340639254846
+33
+5.83945951983237
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+653.29151769208
+21
+-646.340639254846
+31
+5.83945951983237
+12
+642.023925698403
+22
+-654.528573978644
+32
+5.83945951983345
+13
+642.023925698403
+23
+-654.528573978644
+33
+5.83945951983345
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+642.023925698403
+21
+-654.528573978644
+31
+5.83945951983345
+12
+629.962604584718
+22
+-661.494594174546
+32
+5.83945951983435
+13
+629.962604584718
+23
+-661.494594174546
+33
+5.83945951983435
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+629.962604584718
+21
+-661.494594174546
+31
+5.83945951983435
+12
+617.239549416349
+22
+-667.162466046756
+32
+5.83945951983507
+13
+617.239549416349
+23
+-667.162466046756
+33
+5.83945951983507
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+617.239549416349
+21
+-667.162466046756
+31
+5.83945951983507
+12
+603.993997054852
+22
+-671.47016230067
+32
+5.83945951983598
+13
+603.993997054852
+23
+-671.47016230067
+33
+5.83945951983598
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.000467548731367373
+20
+-674.37054094885
+30
+5.83945951983706
+11
+603.993997054852
+21
+-671.47016230067
+31
+5.83945951983598
+12
+590.370902396357
+22
+-674.37054094885
+32
+5.83945951983706
+13
+590.370902396357
+23
+-674.37054094885
+33
+5.83945951983706
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.116269958089
+20
+-603.340928801176
+30
+-8.48245917950408e-12
+11
+693.784141830299
+21
+-590.617873632807
+31
+5.83945951982749
+12
+693.784141830299
+22
+-590.617873632807
+32
+-9.20437059903634e-12
+13
+693.784141830299
+23
+-590.617873632807
+33
+-9.20437059903634e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+693.784141830299
+20
+-590.617873632807
+30
+5.83945951982749
+11
+688.116269958089
+21
+-603.340928801176
+31
+-8.48245917950408e-12
+12
+688.116269958089
+22
+-603.340928801175
+32
+5.8394595198284
+13
+688.116269958089
+23
+-603.340928801175
+33
+5.8394595198284
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+663.642071806514
+20
+-637.020396022971
+30
+-5.59481350137503e-12
+11
+672.962315038389
+21
+-626.669841908537
+31
+5.83945951983038
+12
+672.962315038389
+22
+-626.669841908538
+32
+-6.49720277579036e-12
+13
+672.962315038389
+23
+-626.669841908538
+33
+-6.49720277579036e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+672.962315038389
+20
+-626.669841908537
+30
+5.83945951983038
+11
+663.642071806514
+21
+-637.020396022971
+31
+-5.59481350137503e-12
+12
+663.642071806513
+22
+-637.020396022971
+32
+5.83945951983146
+13
+663.642071806513
+23
+-637.020396022971
+33
+5.83945951983146
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+663.642071806513
+20
+-637.020396022971
+30
+5.83945951983146
+11
+653.29151769208
+21
+-646.340639254847
+31
+-4.51194637207664e-12
+12
+653.29151769208
+22
+-646.340639254846
+32
+5.83945951983237
+13
+653.29151769208
+23
+-646.340639254846
+33
+5.83945951983237
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+653.29151769208
+20
+-646.340639254847
+30
+-4.51194637207664e-12
+11
+663.642071806513
+21
+-637.020396022971
+31
+5.83945951983146
+12
+663.642071806514
+22
+-637.020396022971
+32
+-5.59481350137503e-12
+13
+663.642071806514
+23
+-637.020396022971
+33
+-5.59481350137503e-12
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431263343628
+20
+-730.119576764422
+30
+76.0575414220674
+11
+454.797683261242
+21
+-716.144716838612
+31
+97.1582932541697
+12
+454.797676017751
+22
+-726.7957138545
+32
+74.7479370250946
+13
+454.797676017751
+23
+-726.7957138545
+33
+74.7479370250946
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797683261242
+20
+-716.144716838612
+30
+97.1582932541697
+11
+454.431263343628
+21
+-730.119576764422
+31
+76.0575414220674
+12
+454.431270729568
+22
+-719.25912090813
+32
+98.9086120013344
+13
+454.431270729568
+23
+-719.25912090813
+33
+98.9086120013344
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267771709642
+20
+-659.055159092928
+30
+188.362176301584
+11
+0.0162901478210909
+21
+-633.55442031161
+31
+200.482035565403
+12
+429.267763467221
+22
+-633.554254686993
+32
+200.482021877632
+13
+429.267763467221
+23
+-633.554254686993
+33
+200.482021877632
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162901478210909
+20
+-633.55442031161
+30
+200.482035565403
+11
+429.267771709642
+21
+-659.055159092928
+31
+188.362176301584
+12
+0.016298390231306
+22
+-659.055291474171
+32
+188.362205788973
+13
+0.016298390231306
+23
+-659.055291474171
+33
+188.362205788973
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683329511579
+20
+-643.789222672817
+30
+226.45907411243
+11
+455.006107255299
+21
+-672.469112270075
+31
+212.230111445991
+12
+455.006097921195
+22
+-643.590691959854
+32
+225.95519307716
+13
+455.006097921195
+23
+-643.590691959854
+33
+225.95519307716
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006107255299
+20
+-672.469112270075
+30
+212.230111445991
+11
+451.683329511579
+21
+-643.789222672817
+31
+226.45907411243
+12
+451.683338867278
+22
+-672.734452813075
+32
+212.702239692806
+13
+451.683338867278
+23
+-672.734452813075
+33
+212.702239692806
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636264956545
+20
+-680.297547066858
+30
+130.674959677109
+11
+665.021389999784
+21
+-690.558190885324
+31
+108.824546057595
+12
+644.636263548619
+22
+-695.850119169612
+32
+112.836707846937
+13
+644.636263548619
+23
+-695.850119169612
+33
+112.836707846937
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021389999784
+20
+-690.558190885324
+30
+108.824546057595
+11
+644.636264956545
+21
+-680.297547066858
+31
+130.674959677109
+12
+665.021391353748
+22
+-675.601700530057
+32
+125.979113140781
+13
+665.021391353748
+23
+-675.601700530057
+33
+125.979113140781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269972243544
+20
+-782.87863142832
+30
+62.9144188854628
+11
+458.222243636608
+21
+-774.650292730724
+31
+93.6026725589312
+12
+458.222230868175
+22
+-784.271054681722
+32
+63.2531519626526
+13
+458.222230868175
+23
+-784.271054681722
+33
+63.2531519626526
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222243636608
+20
+-774.650292730724
+30
+93.6026725589312
+11
+461.269972243544
+21
+-782.87863142832
+31
+62.9144188854628
+12
+461.26998493348
+22
+-773.317015214971
+32
+93.0773591680305
+13
+461.26998493348
+23
+-773.317015214971
+33
+93.0773591680305
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282004539076
+20
+-630.366836092636
+30
+192.392159030223
+11
+450.471101097006
+21
+-603.912334485117
+31
+197.802609624747
+12
+450.471111788281
+22
+-629.324619346527
+32
+189.746945529741
+13
+450.471111788281
+23
+-629.324619346527
+33
+189.746945529741
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471101097006
+20
+-603.912334485117
+30
+197.802609624747
+11
+448.282004539076
+21
+-630.366836092636
+31
+192.392159030223
+12
+448.281993692064
+22
+-604.584376828467
+32
+200.565167970899
+13
+448.281993692064
+23
+-604.584376828467
+33
+200.565167970899
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84015475682
+20
+-640.279768170507
+30
+217.551860904389
+11
+466.630436254431
+21
+-669.291160506739
+31
+206.575474706326
+12
+468.84016373079
+22
+-668.043983209856
+32
+204.35632895538
+13
+468.84016373079
+23
+-668.043983209856
+33
+204.35632895538
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630436254431
+20
+-669.291160506739
+30
+206.575474706326
+11
+468.84015475682
+21
+-640.279768170507
+31
+217.551860904389
+12
+466.630427178961
+22
+-641.212917863139
+32
+219.920254933339
+13
+466.630427178961
+23
+-641.212917863139
+33
+219.920254933339
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797683261242
+20
+-646.78088064753
+30
+166.522129452237
+11
+454.667758482489
+21
+-623.054883804802
+31
+173.83394276819
+12
+454.667765582876
+22
+-645.022494242574
+32
+163.393370075456
+13
+454.667765582876
+23
+-645.022494242574
+33
+163.393370075456
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667758482489
+20
+-623.054883804802
+30
+173.83394276819
+11
+454.797683261242
+21
+-646.78088064753
+31
+166.522129452237
+12
+454.797676017751
+22
+-624.370524419528
+32
+177.173126470384
+13
+454.797676017751
+23
+-624.370524419528
+33
+177.173126470384
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13329645121
+20
+-645.022448764174
+30
+163.393359945326
+11
+454.667758482489
+21
+-623.054883804802
+31
+173.83394276819
+12
+602.133289350819
+22
+-623.054826905935
+32
+173.833938065877
+13
+602.133289350819
+23
+-623.054826905935
+33
+173.833938065877
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667758482489
+20
+-623.054883804802
+30
+173.83394276819
+11
+602.13329645121
+21
+-645.022448764174
+31
+163.393359945326
+12
+454.667765582876
+22
+-645.022494242574
+32
+163.393370075456
+13
+454.667765582876
+23
+-645.022494242574
+33
+163.393370075456
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090775113584
+20
+-771.603559996758
+30
+92.4022555870175
+11
+461.269994170696
+21
+-759.734399297279
+31
+121.656022816523
+12
+461.26998493348
+22
+-773.317015214971
+32
+93.0773591680305
+13
+461.26998493348
+23
+-773.317015214971
+33
+93.0773591680305
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269994170696
+20
+-759.734399297279
+30
+121.656022816523
+11
+464.090775113584
+21
+-771.603559996758
+31
+92.4022555870175
+12
+464.090784277369
+22
+-758.12892025415
+32
+120.753730687408
+13
+464.090784277369
+23
+-758.12892025415
+33
+120.753730687408
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006107255299
+20
+-672.469112270075
+30
+212.230111445991
+11
+458.222258577851
+21
+-698.605625061081
+31
+193.903521183332
+12
+458.222252930963
+22
+-671.980703984767
+32
+211.3610708001
+13
+458.222252930963
+23
+-671.980703984767
+33
+211.3610708001
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222258577851
+20
+-698.605625061081
+30
+193.903521183332
+11
+455.006107255299
+21
+-672.469112270075
+31
+212.230111445991
+12
+455.006112926336
+22
+-699.207898179883
+32
+194.697902416163
+13
+455.006112926336
+23
+-699.207898179883
+33
+194.697902416163
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-186.862719999999
+30
+2052.97755335166
+11
+69.0235178451101
+21
+-280.294079999999
+31
+2069.61810878401
+12
+69.0235178451106
+22
+-186.862719999999
+32
+2069.61810878401
+13
+69.0235178451106
+23
+-186.862719999999
+33
+2069.61810878401
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.0235178451101
+20
+-280.294079999999
+30
+2069.61810878401
+11
+100.155807358117
+21
+-186.862719999999
+31
+2052.97755335166
+12
+100.155807358117
+22
+-280.294079999999
+32
+2052.97755335166
+13
+100.155807358117
+23
+-280.294079999999
+33
+2052.97755335166
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-280.29408
+30
+1753.52666880208
+11
+127.443487339903
+21
+-186.86272
+31
+1775.92108901406
+12
+100.155807358117
+22
+-186.86272
+32
+1753.52666880208
+13
+100.155807358117
+23
+-186.86272
+33
+1753.52666880208
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339903
+20
+-186.86272
+30
+1775.92108901406
+11
+100.155807358117
+21
+-280.29408
+31
+1753.52666880208
+12
+127.443487339902
+22
+-280.29408
+32
+1775.92108901406
+13
+127.443487339902
+23
+-280.29408
+33
+1775.92108901406
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.837907551873
+20
+-280.29408
+30
+1803.20876899584
+11
+127.443487339903
+21
+-186.86272
+31
+1775.92108901406
+12
+127.443487339902
+22
+-280.29408
+32
+1775.92108901406
+13
+127.443487339902
+23
+-280.29408
+33
+1775.92108901406
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339903
+20
+-186.86272
+30
+1775.92108901406
+11
+149.837907551873
+21
+-280.29408
+31
+1803.20876899584
+12
+149.837907551873
+22
+-186.86272
+32
+1803.20876899584
+13
+149.837907551873
+23
+-186.86272
+33
+1803.20876899584
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.837907551873
+20
+-280.29408
+30
+2003.29545315791
+11
+166.47846298422
+21
+-186.86272
+31
+1972.1631636449
+12
+166.478462984219
+22
+-280.29408
+32
+1972.1631636449
+13
+166.478462984219
+23
+-280.29408
+33
+1972.1631636449
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.47846298422
+20
+-186.86272
+30
+1972.1631636449
+11
+149.837907551873
+21
+-280.29408
+31
+2003.29545315791
+12
+149.837907551873
+22
+-186.86272
+32
+2003.29545315791
+13
+149.837907551873
+23
+-186.86272
+33
+2003.29545315791
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505834726
+20
+-616.515297047424
+30
+85.6286672029373
+11
+753.576410189591
+21
+-595.926735646398
+31
+76.0356884766169
+12
+753.576412075941
+22
+-604.820821451585
+32
+70.2039737536023
+13
+753.576412075941
+23
+-604.820821451585
+33
+70.2039737536023
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576410189591
+20
+-595.926735646398
+30
+76.0356884766169
+11
+744.27505834726
+21
+-616.515297047424
+31
+85.6286672029373
+12
+744.27505599199
+22
+-605.41026540619
+32
+92.9100649699753
+13
+744.27505599199
+23
+-605.41026540619
+33
+92.9100649699753
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101749084159
+20
+-636.941767787464
+30
+209.079797462849
+11
+472.10720415349
+21
+-665.162054034067
+31
+199.228411696097
+12
+473.101757695049
+22
+-663.582663624963
+32
+196.418146784964
+13
+473.101757695049
+23
+-663.582663624963
+33
+196.418146784964
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.10720415349
+20
+-665.162054034067
+30
+199.228411696097
+11
+473.101749084159
+21
+-636.941767787464
+31
+209.079797462849
+12
+472.107195414063
+22
+-638.12348215123
+32
+212.079066347413
+13
+472.107195414063
+23
+-638.12348215123
+33
+212.079066347413
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546355296361
+20
+-622.700434111963
+30
+172.934485818424
+11
+602.133279596418
+21
+-599.869415774734
+31
+181.183685835358
+12
+623.546345594915
+22
+-599.640891643383
+32
+180.244333371467
+13
+623.546345594915
+23
+-599.640891643383
+33
+180.244333371467
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133279596418
+20
+-599.869415774734
+30
+181.183685835358
+11
+623.546355296361
+21
+-622.700434111963
+31
+172.934485818424
+12
+602.133289350819
+22
+-623.054826905935
+32
+173.833938065877
+13
+602.133289350819
+23
+-623.054826905935
+33
+173.833938065877
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+6.30894498883872e-05
+20
+-699.581046774633
+30
+195.189985865263
+11
+448.317785291547
+21
+-723.744834584347
+31
+174.122247190222
+12
+448.317783384355
+22
+-699.580940660874
+32
+195.189933989489
+13
+448.317783384355
+23
+-699.580940660874
+33
+195.189933989489
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317785291547
+20
+-723.744834584347
+30
+174.122247190222
+11
+6.30894498883872e-05
+21
+-699.581046774633
+31
+195.189985865263
+12
+6.49966391634282e-05
+22
+-723.744911722756
+32
+174.12232432863
+13
+6.49966391634282e-05
+23
+-723.744911722756
+33
+174.12232432863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797687662105
+20
+-702.539296405596
+30
+117.908241171874
+11
+454.667771343765
+21
+-683.695448366281
+31
+134.072860976189
+12
+454.667769896794
+22
+-699.679329838522
+32
+115.739912506852
+13
+454.667769896794
+23
+-699.679329838522
+33
+115.739912506852
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667771343765
+20
+-683.695448366281
+30
+134.072860976189
+11
+454.797687662105
+21
+-702.539296405596
+31
+117.908241171874
+12
+454.797689138238
+22
+-686.233268095701
+32
+136.610680705353
+13
+454.797689138238
+23
+-686.233268095701
+33
+136.610680705353
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667771343765
+20
+-683.695448366281
+30
+134.072860976189
+11
+602.13330076513
+21
+-699.679312774979
+31
+115.739877602763
+12
+454.667769896794
+22
+-699.679329838522
+32
+115.739912506852
+13
+454.667769896794
+23
+-699.679329838522
+33
+115.739912506852
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13330076513
+20
+-699.679312774979
+30
+115.739877602763
+11
+454.667771343765
+21
+-683.695448366281
+31
+134.072860976189
+12
+602.133302212101
+22
+-683.695422993079
+32
+134.072835602987
+13
+602.133302212101
+23
+-683.695422993079
+33
+134.072835602987
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222252930963
+20
+-671.980703984767
+30
+211.3610708001
+11
+461.269999782869
+21
+-697.7398487668
+31
+192.761586394987
+12
+461.269994170696
+22
+-671.278610214274
+32
+210.111811908437
+13
+461.269994170696
+23
+-671.278610214274
+33
+210.111811908437
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269999782869
+20
+-697.7398487668
+30
+192.761586394987
+11
+458.222252930963
+21
+-671.980703984767
+31
+211.3610708001
+12
+458.222258577851
+22
+-698.605625061081
+32
+193.903521183332
+13
+458.222258577851
+23
+-698.605625061081
+33
+193.903521183332
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602116671527
+20
+-579.071662867255
+30
+216.322569598682
+11
+624.955322175969
+21
+-606.868815812022
+31
+209.956143300585
+12
+624.955307916438
+22
+-578.912147406784
+32
+214.763348941721
+13
+624.955307916438
+23
+-578.912147406784
+33
+214.763348941721
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955322175969
+20
+-606.868815812022
+30
+209.956143300585
+11
+599.602116671527
+21
+-579.071662867255
+31
+216.322569598682
+12
+599.602131038669
+22
+-607.239310377804
+32
+211.479085673936
+13
+599.602131038669
+23
+-607.239310377804
+33
+211.479085673936
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683329511579
+20
+-776.081661498503
+30
+94.1666352734205
+11
+448.31777769836
+21
+-762.390973409752
+31
+123.149041059795
+12
+448.317768339636
+22
+-776.152256350036
+32
+94.1944509495159
+13
+448.317768339636
+23
+-776.152256350036
+33
+94.1944509495159
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.31777769836
+20
+-762.390973409752
+30
+123.149041059795
+11
+451.683329511579
+21
+-776.081661498503
+31
+94.1666352734205
+12
+451.683338867278
+22
+-762.324827081794
+32
+123.111865415064
+13
+451.683338867278
+23
+-762.324827081794
+33
+123.111865415064
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466058322552
+20
+-664.91507027919
+30
+50.366817478493
+11
+744.27505599199
+21
+-642.532652352182
+31
+55.7876780202442
+12
+744.275052115393
+22
+-648.23289118406
+32
+43.7940230954864
+13
+744.275052115393
+23
+-648.23289118406
+33
+43.7940230954864
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505599199
+20
+-642.532652352182
+30
+55.7876780202442
+11
+732.466058322552
+21
+-664.91507027919
+31
+50.366817478493
+12
+732.466062914084
+22
+-658.163576116691
+32
+64.5723786137012
+13
+732.466062914084
+23
+-658.163576116691
+33
+64.5723786137012
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006097921195
+20
+-775.577780463213
+30
+93.968104560508
+11
+451.683338867278
+21
+-762.324827081794
+31
+123.111865415064
+12
+451.683329511579
+22
+-776.081661498503
+32
+94.1666352734205
+13
+451.683329511579
+23
+-776.081661498503
+33
+94.1666352734205
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683338867278
+20
+-762.324827081794
+30
+123.111865415064
+11
+455.006097921195
+21
+-775.577780463213
+31
+93.968104560508
+12
+455.006107255299
+22
+-761.852698834952
+32
+122.846524872111
+13
+455.006107255299
+23
+-761.852698834952
+33
+122.846524872111
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546317277054
+20
+-548.656939099171
+30
+185.255996085023
+11
+602.133251163261
+21
+-186.86272
+31
+186.220486963908
+12
+623.546317277054
+22
+-186.86272
+32
+185.255996085023
+13
+623.546317277054
+23
+-186.86272
+33
+185.255996085023
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133251163261
+20
+-186.86272
+30
+186.220486963908
+11
+623.546317277054
+21
+-548.656939099171
+31
+185.255996085023
+12
+602.133251163261
+22
+-548.67314817835
+32
+186.220486963908
+13
+602.133251163261
+23
+-548.67314817835
+33
+186.220486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.82931463357
+20
+-569.196470349584
+30
+119.787647909415
+11
+753.739272918395
+21
+-589.30932977233
+31
+137.774660970991
+12
+767.82932233817
+22
+-584.301801471681
+32
+117.190255690543
+13
+767.82932233817
+23
+-584.301801471681
+33
+117.190255690543
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739272918395
+20
+-589.30932977233
+30
+137.774660970991
+11
+767.82931463357
+21
+-569.196470349584
+31
+119.787647909415
+12
+753.73926375928
+22
+-571.352333223692
+32
+140.862402824032
+13
+753.73926375928
+23
+-571.352333223692
+33
+140.862402824032
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73926375928
+20
+-571.352333223692
+30
+140.862402824032
+11
+736.997677401125
+21
+-593.835505140242
+31
+156.380365045419
+12
+753.739272918395
+22
+-589.30932977233
+32
+137.774660970991
+13
+753.739272918395
+23
+-589.30932977233
+33
+137.774660970991
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997677401125
+20
+-593.835505140242
+30
+156.380365045419
+11
+753.73926375928
+21
+-571.352333223692
+31
+140.862402824032
+12
+736.997666927312
+22
+-573.300963343833
+32
+159.911321013811
+13
+736.997666927312
+23
+-573.300963343833
+33
+159.911321013811
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642078676977
+20
+-686.237536190199
+30
+177.590351345444
+11
+473.101764681482
+21
+-710.482718842918
+31
+160.860131450129
+12
+473.642080404707
+22
+-708.127668368109
+32
+158.505080975556
+13
+473.642080404707
+23
+-708.127668368109
+33
+158.505080975556
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101764681482
+20
+-710.482718842918
+30
+160.860131450129
+11
+473.642078676977
+21
+-686.237536190199
+31
+177.590351345444
+12
+473.101762926689
+22
+-688.249705748186
+32
+180.244348164837
+13
+473.101762926689
+23
+-688.249705748186
+33
+180.244348164837
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201828278129
+20
+-598.389085203732
+30
+48.7664978222319
+11
+764.031425007948
+21
+-579.704781244013
+31
+37.0766018107078
+12
+764.031425302868
+22
+-583.441376980459
+32
+33.8187896004645
+13
+764.031425302868
+23
+-583.441376980459
+33
+33.8187896004645
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031425007948
+20
+-579.704781244013
+30
+37.0766018107078
+11
+760.201828278129
+21
+-598.389085203732
+31
+48.7664978222319
+12
+760.20182781144
+22
+-592.476194788978
+32
+53.921748202446
+13
+760.20182781144
+23
+-592.476194788978
+33
+53.921748202446
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721740244506
+20
+-732.59492990622
+30
+106.403439896738
+11
+448.282017231929
+21
+-715.574196634022
+31
+127.790856991425
+12
+448.282012434797
+22
+-730.404696521621
+32
+105.17251147419
+13
+448.282012434797
+23
+-730.404696521621
+33
+105.17251147419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282017231929
+20
+-715.574196634022
+30
+127.790856991425
+11
+445.721740244506
+21
+-732.59492990622
+31
+106.403439896738
+12
+445.721745102502
+22
+-717.576266444547
+32
+129.308758123214
+13
+445.721745102502
+23
+-717.576266444547
+33
+129.308758123214
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13330076513
+20
+-699.679312774979
+30
+115.739877602763
+11
+623.546362358205
+21
+-712.173174760634
+31
+94.9262110334071
+12
+602.13329645121
+22
+-713.015947331523
+32
+95.3998613711292
+13
+602.13329645121
+23
+-713.015947331523
+33
+95.3998613711292
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546362358205
+20
+-712.173174760634
+30
+94.9262110334071
+11
+602.13330076513
+21
+-699.679312774979
+31
+115.739877602763
+12
+623.546366648706
+22
+-698.908941954744
+32
+115.155805645761
+13
+623.546366648706
+23
+-698.908941954744
+33
+115.155805645761
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630441768332
+20
+-739.151644255831
+30
+145.666467410881
+11
+464.090784277369
+21
+-758.12892025415
+31
+120.753730687408
+12
+466.630436254431
+22
+-756.198062094967
+32
+119.668573109345
+13
+466.630436254431
+23
+-756.198062094967
+33
+119.668573109345
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090784277369
+20
+-758.12892025415
+30
+120.753730687408
+11
+466.630441768332
+21
+-739.151644255831
+31
+145.666467410881
+12
+464.090789844927
+22
+-740.916621855406
+32
+147.004613346736
+13
+464.090789844927
+23
+-740.916621855406
+33
+147.004613346736
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090784277369
+20
+-758.12892025415
+30
+120.753730687408
+11
+461.269999782869
+21
+-742.384173786494
+31
+148.117261370797
+12
+461.269994170696
+22
+-759.734399297279
+32
+121.656022816523
+13
+461.269994170696
+23
+-759.734399297279
+33
+121.656022816523
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269999782869
+20
+-742.384173786494
+30
+148.117261370797
+11
+464.090784277369
+21
+-758.12892025415
+31
+120.753730687408
+12
+464.090789844927
+22
+-740.916621855406
+32
+147.004613346736
+13
+464.090789844927
+23
+-740.916621855406
+33
+147.004613346736
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269994170696
+20
+-759.734399297279
+30
+121.656022816523
+11
+458.222258577851
+21
+-743.526108574926
+31
+148.983037664963
+12
+458.222252930963
+22
+-760.983658189012
+32
+122.358116586891
+13
+458.222252930963
+23
+-760.983658189012
+33
+122.358116586891
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222258577851
+20
+-743.526108574926
+30
+148.983037664963
+11
+461.269994170696
+21
+-759.734399297279
+31
+121.656022816523
+12
+461.269999782869
+22
+-742.384173786494
+32
+148.117261370797
+13
+461.269999782869
+23
+-742.384173786494
+33
+148.117261370797
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363103364091
+20
+-672.268220571567
+30
+72.49929930736
+11
+732.466065703719
+21
+-649.539320894872
+31
+77.7254338656707
+12
+732.466062914084
+22
+-658.163576116691
+32
+64.5723786137012
+13
+732.466062914084
+23
+-658.163576116691
+33
+64.5723786137012
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466065703719
+20
+-649.539320894872
+30
+77.7254338656707
+11
+718.363103364091
+21
+-672.268220571567
+31
+72.49929930736
+12
+718.363106545679
+22
+-662.432231199989
+32
+87.5003989193992
+13
+718.363106545679
+23
+-662.432231199989
+33
+87.5003989193992
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466062914084
+20
+-658.163576116691
+30
+64.5723786137012
+11
+744.27505834726
+21
+-635.251254586263
+31
+66.8927096622113
+12
+744.27505599199
+22
+-642.532652352182
+32
+55.7876780202442
+13
+744.27505599199
+23
+-642.532652352182
+33
+55.7876780202442
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505834726
+20
+-635.251254586263
+30
+66.8927096622113
+11
+732.466062914084
+21
+-658.163576116691
+31
+64.5723786137012
+12
+732.466065703719
+22
+-649.539320894872
+32
+77.7254338656707
+13
+732.466065703719
+23
+-649.539320894872
+33
+77.7254338656707
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505599199
+20
+-642.532652352182
+30
+55.7876780202442
+11
+753.576412075941
+21
+-619.82656113575
+31
+55.1982340679256
+12
+753.576410189591
+22
+-625.658275857869
+32
+46.3041482621511
+13
+753.576410189591
+23
+-625.658275857869
+33
+46.3041482621511
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576412075941
+20
+-619.82656113575
+30
+55.1982340679256
+11
+744.27505599199
+21
+-642.532652352182
+31
+55.7876780202442
+12
+744.27505834726
+22
+-635.251254586263
+32
+66.8927096622113
+13
+744.27505834726
+23
+-635.251254586263
+33
+66.8927096622113
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576410189591
+20
+-625.658275857869
+30
+46.3041482621511
+11
+760.20182781144
+21
+-603.54433558335
+31
+42.8536074069585
+12
+760.201826420081
+22
+-607.845772298605
+32
+36.2933847183422
+13
+760.201826420081
+23
+-607.845772298605
+33
+36.2933847183422
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.20182781144
+20
+-603.54433558335
+30
+42.8536074069585
+11
+753.576410189591
+21
+-625.658275857869
+31
+46.3041482621511
+12
+753.576412075941
+22
+-619.82656113575
+32
+55.1982340679256
+13
+753.576412075941
+23
+-619.82656113575
+33
+55.1982340679256
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.00721860814
+20
+-586.233981212786
+30
+36.6113938325108
+11
+787.130190684252
+21
+-609.757662381006
+31
+47.5643349390529
+12
+792.007218281129
+22
+-589.846284379929
+32
+32.4682094668199
+13
+792.007218281129
+23
+-589.846284379929
+33
+32.4682094668199
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130190684252
+20
+-609.757662381006
+30
+47.5643349390529
+11
+792.00721860814
+21
+-586.233981212786
+31
+36.6113938325108
+12
+787.130191214298
+22
+-603.902540579901
+32
+54.279953197846
+13
+787.130191214298
+23
+-603.902540579901
+33
+54.279953197846
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130191214298
+20
+-603.902540579901
+30
+54.279953197846
+11
+779.024169157982
+21
+-628.985710803041
+31
+62.1423838125873
+12
+787.130190684252
+22
+-609.757662381006
+32
+47.5643349390529
+13
+787.130190684252
+23
+-609.757662381006
+33
+47.5643349390529
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024169157982
+20
+-628.985710803041
+30
+62.1423838125873
+11
+787.130191214298
+21
+-603.902540579901
+31
+54.279953197846
+12
+779.024169884095
+22
+-620.964740882273
+32
+71.3421534984996
+13
+779.024169884095
+23
+-620.964740882273
+33
+71.3421534984996
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024169884095
+20
+-620.964740882273
+30
+71.3421534984996
+11
+767.829335677824
+21
+-647.197908223015
+31
+75.9502497139702
+12
+779.024169157982
+22
+-628.985710803041
+32
+62.1423838125873
+13
+779.024169157982
+23
+-628.985710803041
+33
+62.1423838125873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829335677824
+20
+-647.197908223015
+30
+75.9502497139702
+11
+779.024169884095
+21
+-620.964740882273
+31
+71.3421534984996
+12
+767.829336589646
+22
+-637.125515922866
+32
+87.5029285374647
+13
+767.829336589646
+23
+-637.125515922866
+33
+87.5029285374647
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829336589646
+20
+-637.125515922866
+30
+87.5029285374647
+11
+753.73928877638
+21
+-664.079300898903
+31
+88.749145475747
+12
+767.829335677824
+22
+-647.197908223015
+32
+75.9502497139702
+13
+767.829335677824
+23
+-647.197908223015
+33
+75.9502497139702
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928877638
+20
+-664.079300898903
+30
+88.749145475747
+11
+767.829336589646
+21
+-637.125515922866
+31
+87.5029285374647
+12
+753.739289860341
+22
+-652.105388357143
+32
+102.482800970232
+13
+753.739289860341
+23
+-652.105388357143
+33
+102.482800970232
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576412075941
+20
+-619.82656113575
+30
+55.1982340679256
+11
+760.201828278129
+21
+-598.389085203732
+31
+48.7664978222319
+12
+760.20182781144
+22
+-603.54433558335
+32
+42.8536074069585
+13
+760.20182781144
+23
+-603.54433558335
+33
+42.8536074069585
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201828278129
+20
+-598.389085203732
+30
+48.7664978222319
+11
+753.576412075941
+21
+-619.82656113575
+31
+55.1982340679256
+12
+753.576412708658
+22
+-612.837280222141
+32
+63.214692839186
+13
+753.576412708658
+23
+-612.837280222141
+33
+63.214692839186
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739264589701
+20
+-690.205036468984
+30
+23.3578379709152
+11
+736.997666927312
+21
+-709.533908392784
+31
+23.6783759511398
+12
+739.751559375878
+22
+-706.400475394532
+32
+23.357837962948
+13
+739.751559375878
+23
+-706.400475394532
+33
+23.357837962948
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997666927312
+20
+-709.533908392784
+30
+23.6783759511398
+11
+753.739264589701
+21
+-690.205036468984
+31
+23.3578379709152
+12
+753.739272918395
+22
+-687.397248351576
+32
+39.6867423818656
+13
+753.739272918395
+23
+-687.397248351576
+33
+39.6867423818656
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997666927312
+20
+-709.533908392784
+30
+23.6783759511398
+11
+753.739272918395
+21
+-687.397248351576
+31
+39.6867423818656
+12
+736.997677401125
+22
+-706.00295242646
+32
+44.2129177479029
+13
+736.997677401125
+23
+-706.00295242646
+33
+44.2129177479029
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997666927312
+20
+-709.533908392784
+30
+23.6783759511398
+11
+717.894057585081
+21
+-722.308196422019
+31
+48.1794664928565
+12
+717.894045959123
+22
+-726.227566234427
+32
+25.3860745623198
+13
+717.894045959123
+23
+-726.227566234427
+33
+25.3860745623198
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894057585081
+20
+-722.308196422019
+30
+48.1794664928565
+11
+736.997666927312
+21
+-709.533908392784
+31
+23.6783759511398
+12
+736.997677401125
+22
+-706.00295242646
+32
+44.2129177479029
+13
+736.997677401125
+23
+-706.00295242646
+33
+44.2129177479029
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894045959123
+20
+-726.227566234427
+30
+25.3860745623198
+11
+696.758783079627
+21
+-736.03100461107
+31
+51.5177928651329
+12
+696.758770484001
+22
+-740.277270942125
+32
+26.8233094768247
+13
+696.758770484001
+23
+-740.277270942125
+33
+26.8233094768247
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758783079627
+20
+-736.03100461107
+30
+51.5177928651329
+11
+717.894045959123
+21
+-726.227566234427
+31
+25.3860745623198
+12
+717.894057585081
+22
+-722.308196422019
+32
+48.1794664928565
+13
+717.894057585081
+23
+-722.308196422019
+33
+48.1794664928565
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221361580333
+20
+-660.639487120937
+30
+111.016899733167
+11
+684.332896682708
+21
+-652.814503888805
+31
+133.506322083721
+12
+702.221360398304
+22
+-645.663323591295
+32
+124.074113264079
+13
+702.221360398304
+23
+-645.663323591295
+33
+124.074113264079
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332896682708
+20
+-652.814503888805
+30
+133.506322083721
+11
+702.221361580333
+21
+-660.639487120937
+31
+111.016899733167
+12
+684.332897960916
+22
+-669.009252539392
+32
+119.38666515078
+13
+684.332897960916
+23
+-669.009252539392
+33
+119.38666515078
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838915479952
+20
+-578.783910422824
+30
+213.508718295381
+11
+429.26772029492
+21
+-549.153237717187
+31
+214.795486963908
+12
+432.838897838644
+22
+-549.148351803013
+32
+214.504708726405
+13
+432.838897838644
+23
+-549.148351803013
+33
+214.504708726405
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.26772029492
+20
+-549.153237717187
+30
+214.795486963908
+11
+432.838915479952
+21
+-578.783910422824
+31
+213.508718295381
+12
+429.267737950976
+22
+-578.813572557816
+32
+213.798663854844
+13
+429.267737950976
+23
+-578.813572557816
+33
+213.798663854844
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282017231929
+20
+-677.413444384727
+30
+165.951609244563
+11
+450.471119570638
+21
+-653.402150740311
+31
+178.303588160926
+12
+450.471124298894
+22
+-675.695750953173
+32
+163.686018751541
+13
+450.471124298894
+23
+-675.695750953173
+33
+163.686018751541
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471119570638
+20
+-653.402150740311
+30
+178.303588160926
+11
+448.282017231929
+21
+-677.413444384727
+31
+165.951609244563
+12
+448.282012434797
+22
+-654.795098868987
+32
+180.78210913444
+13
+448.282012434797
+23
+-654.795098868987
+33
+180.78210913444
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471124298894
+20
+-675.695750953173
+30
+163.686018751541
+11
+452.247009199941
+21
+-651.873941250939
+31
+175.584391651154
+12
+452.247013852634
+22
+-673.811261880626
+32
+161.200429262907
+13
+452.247013852634
+23
+-673.811261880626
+33
+161.200429262907
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247009199941
+20
+-651.873941250939
+30
+175.584391651154
+11
+450.471124298894
+21
+-675.695750953173
+31
+163.686018751541
+12
+450.471119570638
+22
+-653.402150740311
+32
+178.303588160926
+13
+450.471119570638
+23
+-653.402150740311
+33
+178.303588160926
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247013852634
+20
+-673.811261880626
+30
+161.200429262907
+11
+453.575566723046
+21
+-650.239827098532
+31
+172.676755002411
+12
+453.575571294939
+22
+-671.796177947369
+32
+158.542588616663
+13
+453.575571294939
+23
+-671.796177947369
+33
+158.542588616663
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575566723046
+20
+-650.239827098532
+30
+172.676755002411
+11
+452.247013852634
+21
+-673.811261880626
+31
+161.200429262907
+12
+452.247009199941
+22
+-651.873941250939
+32
+175.584391651154
+13
+452.247009199941
+23
+-651.873941250939
+33
+175.584391651154
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575571294939
+20
+-671.796177947369
+30
+158.542588616663
+11
+454.431270729568
+21
+-648.531199395009
+31
+169.63653352158
+12
+454.431275216977
+22
+-669.689208643299
+32
+155.763553572255
+13
+454.431275216977
+23
+-669.689208643299
+33
+155.763553572255
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431270729568
+20
+-648.531199395009
+30
+169.63653352158
+11
+453.575571294939
+21
+-671.796177947369
+31
+158.542588616663
+12
+453.575566723046
+22
+-650.239827098532
+32
+172.676755002411
+13
+453.575566723046
+23
+-650.239827098532
+33
+172.676755002411
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130167954486
+20
+-546.781824001004
+30
+73.639808098986
+11
+779.024152399766
+21
+-566.87065726704
+31
+97.0515138238504
+12
+787.130178451143
+22
+-564.415115565838
+32
+73.0471892828083
+13
+787.130178451143
+23
+-564.415115565838
+33
+73.0471892828083
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024152399766
+20
+-566.87065726704
+30
+97.0515138238504
+11
+787.130167954486
+21
+-546.781824001004
+31
+73.639808098986
+12
+779.024140682123
+22
+-547.186238711366
+32
+97.7130668174428
+13
+779.024140682123
+23
+-547.186238711366
+33
+97.7130668174428
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024140682123
+20
+-547.186238711366
+30
+97.7130668174428
+11
+767.82931463357
+21
+-569.196470349584
+31
+119.787647909415
+12
+779.024152399766
+22
+-566.87065726704
+32
+97.0515138238504
+13
+779.024152399766
+23
+-566.87065726704
+33
+97.0515138238504
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.82931463357
+20
+-569.196470349584
+30
+119.787647909415
+11
+779.024140682123
+21
+-547.186238711366
+31
+97.7130668174428
+12
+767.829301759449
+22
+-547.569288532173
+32
+120.514493197419
+13
+767.829301759449
+23
+-547.569288532173
+33
+120.514493197419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901675
+20
+-767.779871902213
+30
+-2.12061479487602e-10
+11
+718.95840239636
+21
+-786.469309831082
+31
+23.3578380791782
+12
+718.958402396357
+22
+-786.469309831078
+32
+-1.92750349015114e-10
+13
+718.958402396357
+23
+-786.469309831078
+33
+-1.92750349015114e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+746.929122901675
+21
+-767.779871902213
+31
+-2.12061479487602e-10
+12
+746.929122901678
+22
+-767.779871902217
+32
+23.3578380791593
+13
+746.929122901678
+23
+-767.779871902217
+33
+23.3578380791593
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+827.969621169947
+20
+-662.165838331307
+30
+-1.61527680120344e-10
+11
+813.090985614623
+21
+-692.336726612819
+31
+23.3578380791782
+12
+813.09098561462
+22
+-692.336726612815
+32
+-1.92750349015114e-10
+13
+813.09098561462
+23
+-692.336726612815
+33
+-1.92750349015114e-10
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+813.090985614623
+20
+-692.336726612819
+30
+23.3578380791782
+11
+827.969621169947
+21
+-662.165838331307
+31
+-1.61527680120344e-10
+12
+827.96962116995
+22
+-662.165838331311
+32
+23.3578380792096
+13
+827.96962116995
+23
+-662.165838331311
+33
+23.3578380792096
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101757695049
+20
+-746.04073417303
+30
+113.960076228591
+11
+472.107195414063
+21
+-761.701653732916
+31
+88.5008947532808
+12
+473.101749084159
+22
+-758.702384848233
+32
+87.3191803898169
+13
+473.101749084159
+23
+-758.702384848233
+33
+87.3191803898169
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107195414063
+20
+-761.701653732916
+30
+88.5008947532808
+11
+473.101757695049
+21
+-746.04073417303
+31
+113.960076228591
+12
+472.10720415349
+22
+-748.850999084323
+32
+115.539466637413
+13
+472.10720415349
+23
+-748.850999084323
+33
+115.539466637413
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275052115393
+20
+-593.416610482006
+30
+98.6103038030606
+11
+753.576402819491
+21
+-576.182653575586
+31
+83.8148703207571
+12
+753.576407084801
+22
+-586.320946175488
+32
+80.6010436173693
+13
+753.576407084801
+23
+-586.320946175488
+33
+80.6010436173693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576402819491
+20
+-576.182653575586
+30
+83.8148703207571
+11
+744.275052115393
+21
+-593.416610482006
+31
+98.6103038030606
+12
+744.275046789786
+22
+-580.758079568763
+32
+102.623043056121
+13
+744.275046789786
+23
+-580.758079568763
+33
+102.623043056121
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.20182781144
+20
+-603.54433558335
+30
+42.8536074069585
+11
+764.031425302868
+21
+-583.441376980459
+31
+33.8187896004645
+12
+764.031425007948
+22
+-586.699189190326
+32
+30.0821938636906
+13
+764.031425007948
+23
+-586.699189190326
+33
+30.0821938636906
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031425302868
+20
+-583.441376980459
+30
+33.8187896004645
+11
+760.20182781144
+21
+-603.54433558335
+31
+42.8536074069585
+12
+760.201828278129
+22
+-598.389085203732
+32
+48.7664978222319
+13
+760.201828278129
+23
+-598.389085203732
+33
+48.7664978222319
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928877638
+20
+-664.079300898903
+30
+88.749145475747
+11
+736.997691839832
+21
+-690.762816990611
+31
+82.8933973835911
+12
+753.73928554472
+22
+-674.070091498716
+32
+73.5119548557674
+13
+753.73928554472
+23
+-674.070091498716
+33
+73.5119548557674
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997691839832
+20
+-690.762816990611
+30
+82.8933973835911
+11
+753.73928877638
+21
+-664.079300898903
+31
+88.749145475747
+12
+736.997695535365
+22
+-679.337949441333
+32
+100.317732616843
+13
+736.997695535365
+23
+-679.337949441333
+33
+100.317732616843
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840171011807
+20
+-716.921589517517
+30
+167.299002124079
+11
+466.630441768332
+21
+-739.151644255831
+31
+145.666467410881
+12
+468.840169183023
+22
+-737.123145968814
+32
+144.128529165728
+13
+468.840169183023
+23
+-737.123145968814
+33
+144.128529165728
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630441768332
+20
+-739.151644255831
+30
+145.666467410881
+11
+468.840171011807
+21
+-716.921589517517
+31
+167.299002124079
+12
+466.6304436178
+22
+-718.721597772832
+32
+169.099010379212
+13
+466.6304436178
+23
+-718.721597772832
+33
+169.099010379212
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.6304436178
+20
+-718.721597772832
+30
+169.099010379212
+11
+464.090789844927
+21
+-740.916621855406
+31
+147.004613346736
+12
+466.630441768332
+22
+-739.151644255831
+32
+145.666467410881
+13
+466.630441768332
+23
+-739.151644255831
+33
+145.666467410881
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090789844927
+20
+-740.916621855406
+30
+147.004613346736
+11
+466.6304436178
+21
+-718.721597772832
+31
+169.099010379212
+12
+464.090791712392
+22
+-720.287768351753
+32
+170.665180957976
+13
+464.090791712392
+23
+-720.287768351753
+33
+170.665180957976
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363098127435
+20
+-679.968320245868
+30
+56.297813526916
+11
+732.466062914084
+21
+-658.163576116691
+31
+64.5723786137012
+12
+732.466058322552
+22
+-664.91507027919
+32
+50.366817478493
+13
+732.466058322552
+23
+-664.91507027919
+33
+50.366817478493
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466062914084
+20
+-658.163576116691
+30
+64.5723786137012
+11
+718.363098127435
+21
+-679.968320245868
+31
+56.297813526916
+12
+718.363103364091
+22
+-672.268220571567
+32
+72.49929930736
+13
+718.363103364091
+23
+-672.268220571567
+33
+72.49929930736
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317768339636
+20
+-643.81703834892
+30
+226.52966896396
+11
+451.683338867278
+21
+-672.734452813075
+31
+212.702239692806
+12
+451.683329511579
+22
+-643.789222672817
+32
+226.45907411243
+13
+451.683329511579
+23
+-643.789222672817
+33
+226.45907411243
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683338867278
+20
+-672.734452813075
+30
+212.702239692806
+11
+448.317768339636
+21
+-643.81703834892
+31
+226.52966896396
+12
+448.31777769836
+22
+-672.771628457813
+32
+212.76838602076
+13
+448.31777769836
+23
+-672.771628457813
+33
+212.76838602076
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677509279169
+20
+-639.24331958749
+30
+214.92128705308
+11
+468.84016373079
+21
+-668.043983209856
+31
+204.35632895538
+12
+470.677518140403
+22
+-666.658744301589
+32
+201.891525102388
+13
+470.677518140403
+23
+-666.658744301589
+33
+201.891525102388
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84016373079
+20
+-668.043983209856
+30
+204.35632895538
+11
+470.677509279169
+21
+-639.24331958749
+31
+214.92128705308
+12
+468.84015475682
+22
+-640.279768170507
+32
+217.551860904389
+13
+468.84015475682
+23
+-640.279768170507
+33
+217.551860904389
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677518140403
+20
+-666.658744301589
+30
+201.891525102388
+11
+468.840169183023
+21
+-693.751116561201
+31
+187.500558577709
+12
+470.677523524142
+22
+-692.042929592268
+32
+185.247506781241
+13
+470.677523524142
+23
+-692.042929592268
+33
+185.247506781241
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840169183023
+20
+-693.751116561201
+30
+187.500558577709
+11
+470.677518140403
+21
+-666.658744301589
+31
+201.891525102388
+12
+468.84016373079
+22
+-668.043983209856
+32
+204.35632895538
+13
+468.84016373079
+23
+-668.043983209856
+33
+204.35632895538
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84016373079
+20
+-668.043983209856
+30
+204.35632895538
+11
+466.630441768332
+21
+-695.289054806558
+31
+189.529056864572
+12
+468.840169183023
+22
+-693.751116561201
+32
+187.500558577709
+13
+468.840169183023
+23
+-693.751116561201
+33
+187.500558577709
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630441768332
+20
+-695.289054806558
+30
+189.529056864572
+11
+468.84016373079
+21
+-668.043983209856
+31
+204.35632895538
+12
+466.630436254431
+22
+-669.291160506739
+32
+206.575474706326
+13
+466.630436254431
+23
+-669.291160506739
+33
+206.575474706326
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630436254431
+20
+-669.291160506739
+30
+206.575474706326
+11
+464.090789844927
+21
+-696.627200742591
+31
+191.294034464012
+12
+466.630441768332
+22
+-695.289054806558
+32
+189.529056864572
+13
+466.630441768332
+23
+-695.289054806558
+33
+189.529056864572
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090789844927
+20
+-696.627200742591
+30
+191.294034464012
+11
+466.630436254431
+21
+-669.291160506739
+31
+206.575474706326
+12
+464.090784277369
+22
+-670.376318084996
+32
+208.5063328654
+13
+464.090784277369
+23
+-670.376318084996
+33
+208.5063328654
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269994170696
+20
+-671.278610214274
+30
+210.111811908437
+11
+464.090789844927
+21
+-696.627200742591
+31
+191.294034464012
+12
+464.090784277369
+22
+-670.376318084996
+32
+208.5063328654
+13
+464.090784277369
+23
+-670.376318084996
+33
+208.5063328654
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090789844927
+20
+-696.627200742591
+30
+191.294034464012
+11
+461.269994170696
+21
+-671.278610214274
+31
+210.111811908437
+12
+461.269999782869
+22
+-697.7398487668
+32
+192.761586394987
+13
+461.269999782869
+23
+-697.7398487668
+33
+192.761586394987
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162646316092562
+20
+-763.421247562364
+30
+29.1912221451116
+11
+429.267734478649
+21
+-763.617291372796
+31
+23.3578378527852
+12
+0.00828976046904545
+22
+-763.617295762417
+32
+23.3578364570492
+13
+0.00828976046904545
+23
+-763.617295762417
+33
+23.3578364570492
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267734478649
+20
+-763.617291372796
+30
+23.3578378527852
+11
+0.0162646316092562
+21
+-763.421247562364
+31
+29.1912221451116
+12
+429.267737950976
+22
+-763.421251234373
+32
+29.1909851596944
+13
+429.267737950976
+23
+-763.421251234373
+33
+29.1909851596944
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690582495428
+20
+-761.097663471809
+30
+28.9532865498045
+11
+442.839449157947
+21
+-759.575223903305
+31
+23.3578378579396
+12
+439.690579164597
+22
+-761.285715042239
+32
+23.357837856573
+13
+439.690579164597
+23
+-761.285715042239
+33
+23.357837856573
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839449157947
+20
+-759.575223903305
+30
+23.3578378579396
+11
+439.690582495428
+21
+-761.097663471809
+31
+28.9532865498045
+12
+442.839452384975
+22
+-759.393032819931
+32
+28.7789085623947
+13
+442.839452384975
+23
+-759.393032819931
+33
+28.7789085623947
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466052014781
+20
+-669.667851071909
+30
+35.3737619083722
+11
+744.275042822729
+21
+-653.583013796713
+31
+23.35783797602
+12
+732.466045885959
+22
+-671.734013479962
+32
+23.3578379683062
+13
+732.466045885959
+23
+-671.734013479962
+33
+23.3578379683062
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275042822729
+20
+-653.583013796713
+30
+23.35783797602
+11
+732.466052014781
+21
+-669.667851071909
+31
+35.3737619083722
+12
+744.275046789786
+22
+-652.245630435845
+32
+31.1354921818382
+13
+744.275046789786
+23
+-652.245630435845
+33
+31.1354921818382
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021370191738
+20
+-719.684397959595
+30
+47.5412056189011
+11
+684.332867182503
+21
+-714.266540775895
+31
+24.1625326278822
+12
+665.021358751182
+22
+-723.541264381198
+32
+25.1113068905408
+13
+665.021358751182
+23
+-723.541264381198
+33
+25.1113068905408
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332867182503
+20
+-714.266540775895
+30
+24.1625326278822
+11
+665.021370191738
+21
+-719.684397959595
+31
+47.5412056189011
+12
+684.332877982946
+22
+-710.625470617764
+32
+45.3374518452758
+13
+684.332877982946
+23
+-710.625470617764
+33
+45.3374518452758
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090741872935
+20
+-786.683847141088
+30
+23.3578378586363
+11
+461.269956337624
+21
+-788.240871473567
+31
+31.7299058573872
+12
+461.269951353941
+22
+-788.522239532049
+32
+23.3578378573451
+13
+461.269951353941
+23
+-788.522239532049
+33
+23.3578378573451
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269956337624
+20
+-788.240871473567
+30
+31.7299058573872
+11
+464.090741872935
+21
+-786.683847141088
+31
+23.3578378586363
+12
+464.090746745054
+22
+-786.408777774662
+32
+31.5424891402109
+13
+464.090746745054
+23
+-786.408777774662
+33
+31.5424891402109
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636242951136
+20
+-726.13713335826
+30
+49.1109574716297
+11
+665.021358751182
+21
+-723.541264381198
+31
+25.1113068905408
+12
+644.636231054623
+22
+-730.147712824956
+32
+25.7871288899166
+13
+644.636231054623
+23
+-730.147712824956
+33
+25.7871288899166
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021358751182
+20
+-723.541264381198
+30
+25.1113068905408
+11
+644.636242951136
+21
+-726.13713335826
+31
+49.1109574716297
+12
+665.021370191738
+22
+-719.684397959595
+32
+47.5412056189011
+13
+665.021370191738
+23
+-719.684397959595
+33
+47.5412056189011
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+180.160557528893
+20
+-280.29408
+30
+1570.85958260462
+11
+176.700983922342
+21
+-186.86272
+31
+1535.73394230883
+12
+176.700983922341
+22
+-280.29408
+32
+1535.73394230883
+13
+176.700983922341
+23
+-280.29408
+33
+1535.73394230883
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.700983922342
+20
+-186.86272
+30
+1535.73394230883
+11
+180.160557528893
+21
+-280.29408
+31
+1570.85958260462
+12
+180.160557528894
+22
+-186.86272
+32
+1570.85958260462
+13
+180.160557528894
+23
+-186.86272
+33
+1570.85958260462
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.700983922341
+20
+-280.29408
+30
+1535.73394230883
+11
+166.455212576235
+21
+-186.86272
+31
+1501.95816067091
+12
+166.455212576234
+22
+-280.29408
+32
+1501.95816067091
+13
+166.455212576234
+23
+-280.29408
+33
+1501.95816067091
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.455212576235
+20
+-186.86272
+30
+1501.95816067091
+11
+176.700983922341
+21
+-280.29408
+31
+1535.73394230883
+12
+176.700983922342
+22
+-186.86272
+32
+1535.73394230883
+13
+176.700983922342
+23
+-186.86272
+33
+1535.73394230883
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.455212576234
+20
+-280.29408
+30
+1501.95816067091
+11
+149.816982737509
+21
+-186.86272
+31
+1470.83022203755
+12
+149.816982737509
+22
+-280.29408
+32
+1470.83022203755
+13
+149.816982737509
+23
+-280.29408
+33
+1470.83022203755
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.816982737509
+20
+-186.86272
+30
+1470.83022203755
+11
+166.455212576234
+21
+-280.29408
+31
+1501.95816067091
+12
+166.455212576235
+22
+-186.86272
+32
+1501.95816067091
+13
+166.455212576235
+23
+-186.86272
+33
+1501.95816067091
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.816982737509
+20
+-280.29408
+30
+1470.83022203755
+11
+127.42569224804
+21
+-186.86272
+31
+1443.54635563367
+12
+127.425692248039
+22
+-280.29408
+32
+1443.54635563367
+13
+127.425692248039
+23
+-280.29408
+33
+1443.54635563367
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.42569224804
+20
+-186.86272
+30
+1443.54635563367
+11
+149.816982737509
+21
+-280.29408
+31
+1470.83022203755
+12
+149.816982737509
+22
+-186.86272
+32
+1470.83022203755
+13
+149.816982737509
+23
+-186.86272
+33
+1470.83022203755
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717763908762
+20
+-634.484263142475
+30
+202.842487443351
+11
+599.602150844536
+21
+-660.298108897689
+31
+190.573882756048
+12
+599.60214250095
+22
+-634.484214570593
+32
+202.842483429208
+13
+599.60214250095
+23
+-634.484214570593
+33
+202.842483429208
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602150844536
+20
+-660.298108897689
+30
+190.573882756048
+11
+473.717763908762
+21
+-634.484263142475
+31
+202.842487443351
+12
+473.717772252345
+22
+-660.298147720458
+32
+190.573891403664
+13
+473.717772252345
+23
+-660.298147720458
+33
+190.573891403664
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721732248607
+20
+-631.28782828485
+30
+194.729696180594
+11
+442.839466299903
+21
+-605.682549578299
+31
+205.079413127562
+12
+445.721721263973
+22
+-605.178251275471
+32
+203.006401057676
+13
+445.721721263973
+23
+-605.178251275471
+33
+203.006401057676
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839466299903
+20
+-605.682549578299
+30
+205.079413127562
+11
+445.721732248607
+21
+-631.28782828485
+31
+194.729696180594
+12
+442.839477401402
+22
+-632.069903787681
+32
+196.714653208256
+13
+442.839477401402
+23
+-632.069903787681
+33
+196.714653208256
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546345594915
+20
+-729.866920753093
+30
+50.0183042486409
+11
+644.636231054623
+21
+-730.147712824956
+31
+25.7871288899166
+12
+623.546333434853
+22
+-733.96634875632
+32
+26.1777702748551
+13
+623.546333434853
+23
+-733.96634875632
+33
+26.1777702748551
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636231054623
+20
+-730.147712824956
+30
+25.7871288899166
+11
+623.546345594915
+21
+-729.866920753093
+31
+50.0183042486409
+12
+644.636242951136
+22
+-726.13713335826
+32
+49.1109574716297
+13
+644.636242951136
+23
+-726.13713335826
+33
+49.1109574716297
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431240478811
+20
+-742.052468269584
+30
+27.0050383833634
+11
+454.797666066761
+21
+-734.293588076417
+31
+51.0952482583018
+12
+454.797653593913
+22
+-738.498463121584
+32
+26.6414790273437
+13
+454.797653593913
+23
+-738.498463121584
+33
+26.6414790273437
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797666066761
+20
+-734.293588076417
+30
+51.0952482583018
+11
+454.431240478811
+21
+-742.052468269584
+31
+27.0050383833634
+12
+454.431253196946
+22
+-737.764901599428
+32
+51.9397070211046
+13
+454.431253196946
+23
+-737.764901599428
+33
+51.9397070211046
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275046789786
+20
+-652.245630435845
+30
+31.1354921818382
+11
+753.576401186168
+21
+-633.988087312601
+31
+23.3578379832645
+12
+744.275042822729
+22
+-653.583013796713
+32
+23.35783797602
+13
+744.275042822729
+23
+-653.583013796713
+33
+23.35783797602
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576401186168
+20
+-633.988087312601
+30
+23.3578379832645
+11
+744.275046789786
+21
+-652.245630435845
+31
+31.1354921818382
+12
+753.576402819491
+22
+-633.437457700021
+32
+26.5600661905556
+13
+753.576402819491
+23
+-633.437457700021
+33
+26.5600661905556
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471087696265
+20
+-751.942885609203
+30
+28.0167869283821
+11
+452.246991021541
+21
+-744.394381773506
+31
+53.5524466917642
+12
+452.246977834961
+22
+-748.839872068014
+32
+27.6993612581553
+13
+452.246977834961
+23
+-748.839872068014
+33
+27.6993612581553
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246991021541
+20
+-744.394381773506
+30
+53.5524466917642
+11
+450.471087696265
+21
+-751.942885609203
+31
+28.0167869283821
+12
+450.471101097006
+22
+-747.425197006803
+32
+54.2897470886059
+13
+450.471101097006
+23
+-747.425197006803
+33
+54.2897470886059
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683281480069
+20
+-549.621181308374
+30
+242.650939792116
+11
+455.006069025402
+21
+-581.599775817026
+31
+241.035583090668
+12
+455.00604998394
+22
+-549.612103415805
+32
+242.110623248711
+13
+455.00604998394
+23
+-549.612103415805
+33
+242.110623248711
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006069025402
+20
+-581.599775817026
+30
+241.035583090668
+11
+451.683281480069
+21
+-549.621181308374
+31
+242.650939792116
+12
+451.683300548936
+22
+-581.654891394158
+32
+241.574352401781
+13
+451.683300548936
+23
+-581.654891394158
+33
+241.574352401781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.309565768095
+20
+-569.303680096418
+30
+23.3578380100164
+11
+792.00721860814
+21
+-586.233981212786
+31
+36.6113938325108
+12
+793.160541596036
+22
+-572.980425388099
+32
+23.3578380091579
+13
+793.160541596036
+23
+-572.980425388099
+33
+23.3578380091579
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.00721860814
+20
+-586.233981212786
+30
+36.6113938325108
+11
+793.309565768095
+21
+-569.303680096418
+31
+23.3578380100164
+12
+792.007218281129
+22
+-582.09079684746
+32
+40.22369700007
+13
+792.007218281129
+23
+-582.09079684746
+33
+40.22369700007
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267763467221
+20
+-633.554254686993
+30
+200.482021877632
+11
+0.0162788245333154
+21
+-606.639891924184
+31
+209.013909072529
+12
+429.267752143919
+22
+-606.639691213326
+32
+209.013906507055
+13
+429.267752143919
+23
+-606.639691213326
+33
+209.013906507055
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162788245333154
+20
+-606.639891924184
+30
+209.013909072529
+11
+429.267763467221
+21
+-633.554254686993
+31
+200.482021877632
+12
+0.0162901478210909
+22
+-633.55442031161
+32
+200.482035565403
+13
+0.0162901478210909
+23
+-633.55442031161
+33
+200.482035565403
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363098127435
+20
+-605.920400916633
+30
+130.345732863609
+11
+702.221343105619
+21
+-592.16215835415
+31
+149.501676557166
+12
+718.363090933403
+22
+-588.820775333035
+32
+135.766293848309
+13
+718.363090933403
+23
+-588.820775333035
+33
+135.766293848309
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221343105619
+20
+-592.16215835415
+30
+149.501676557166
+11
+718.363098127435
+21
+-605.920400916633
+31
+130.345732863609
+12
+702.221351073972
+22
+-611.102282944468
+32
+143.497679575028
+13
+702.221351073972
+23
+-611.102282944468
+33
+143.497679575028
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024158535186
+20
+-578.899518233046
+30
+94.9831268667919
+11
+767.829328484993
+21
+-598.912297398533
+31
+112.558745848353
+12
+779.024163430099
+22
+-590.534326018981
+32
+91.2949066282494
+13
+779.024163430099
+23
+-590.534326018981
+33
+91.2949066282494
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829328484993
+20
+-598.912297398533
+30
+112.558745848353
+11
+779.024158535186
+21
+-578.899518233046
+31
+94.9831268667919
+12
+767.82932233817
+22
+-584.301801471681
+32
+117.190255690543
+13
+767.82932233817
+23
+-584.301801471681
+33
+117.190255690543
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.652471048303
+20
+-186.862719999999
+30
+2499.20806403607
+11
+123.089851596878
+21
+-280.294079999999
+31
+2224.76609686633
+12
+123.089851596878
+22
+-186.862719999999
+32
+2224.76609686633
+13
+123.089851596878
+23
+-186.862719999999
+33
+2224.76609686633
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+123.089851596878
+20
+-280.294079999999
+30
+2224.76609686633
+11
+93.652471048303
+21
+-186.862719999999
+31
+2499.20806403607
+12
+93.6524710483026
+22
+-280.294079999999
+32
+2499.20806403607
+13
+93.6524710483026
+23
+-280.294079999999
+33
+2499.20806403607
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269951353941
+20
+-788.522239532049
+30
+23.3578378573451
+11
+458.222214863865
+21
+-789.666464186592
+31
+31.8757394304439
+12
+458.222209793371
+22
+-789.952733412824
+32
+23.3578378560715
+13
+458.222209793371
+23
+-789.952733412824
+33
+23.3578378560715
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222214863865
+20
+-789.666464186592
+30
+31.8757394304439
+11
+461.269951353941
+21
+-788.522239532049
+31
+23.3578378573451
+12
+461.269956337624
+22
+-788.240871473567
+32
+31.7299058573872
+13
+461.269956337624
+23
+-788.240871473567
+33
+31.7299058573872
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246977834961
+20
+-748.839872068014
+30
+27.6993612581553
+11
+453.575548860337
+21
+-741.153531203966
+31
+52.7640516820845
+12
+453.575535902759
+22
+-745.521819843274
+32
+27.3599383202345
+13
+453.575535902759
+23
+-745.521819843274
+33
+27.3599383202345
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575548860337
+20
+-741.153531203966
+30
+52.7640516820845
+11
+452.246977834961
+21
+-748.839872068014
+31
+27.6993612581553
+12
+452.246991021541
+22
+-744.394381773506
+32
+53.5524466917642
+13
+452.246991021541
+23
+-744.394381773506
+33
+53.5524466917642
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721707495526
+20
+-757.270638693351
+30
+28.5617953495419
+11
+448.28197715053
+21
+-754.937553544539
+31
+23.3578378606726
+12
+445.72170439774
+22
+-757.445533046268
+32
+23.3578378593151
+13
+445.72170439774
+23
+-757.445533046268
+33
+23.3578378593151
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.28197715053
+20
+-754.937553544539
+30
+23.3578378606726
+11
+445.721707495526
+21
+-757.270638693351
+31
+28.5617953495419
+12
+448.281980096118
+22
+-754.771251996272
+32
+28.306117626709
+13
+448.281980096118
+23
+-754.771251996272
+33
+28.306117626709
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838915479952
+20
+-763.131305674907
+30
+29.1613230247316
+11
+436.335583784501
+21
+-762.544148159569
+31
+23.3578378552417
+12
+432.838912025282
+22
+-763.326348925263
+32
+23.3578378539704
+13
+432.838912025282
+23
+-763.326348925263
+33
+23.3578378539704
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335583784501
+20
+-762.544148159569
+30
+23.3578378552417
+11
+432.838915479952
+21
+-763.131305674907
+31
+29.1613230247316
+12
+436.335587191701
+22
+-762.351784924648
+32
+29.0815795342117
+13
+436.335587191701
+23
+-762.351784924648
+33
+29.0815795342117
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667736501664
+20
+-734.928076357629
+30
+26.2762441782473
+11
+602.133265632776
+21
+-735.026156540265
+31
+23.357837913399
+12
+454.667734764409
+22
+-735.026158016502
+32
+23.3578378670709
+13
+454.667734764409
+23
+-735.026158016502
+33
+23.3578378670709
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133265632776
+20
+-735.026156540265
+30
+23.357837913399
+11
+454.667736501664
+21
+-734.928076357629
+31
+26.2762441782473
+12
+602.133267369982
+22
+-734.928077619115
+32
+26.2761627640122
+13
+602.133267369982
+23
+-734.928077619115
+33
+26.2761627640122
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928554472
+20
+-623.13454224489
+30
+124.447504114724
+11
+736.997695535365
+21
+-649.940320006495
+31
+129.715362054641
+12
+753.73928877638
+22
+-638.371732863863
+32
+114.456713513376
+13
+753.73928877638
+23
+-638.371732863863
+33
+114.456713513376
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997695535365
+20
+-649.940320006495
+30
+129.715362054641
+11
+753.73928554472
+21
+-623.13454224489
+31
+124.447504114724
+12
+736.997691839832
+22
+-632.515984774395
+32
+141.140229605674
+13
+736.997691839832
+23
+-632.515984774395
+33
+141.140229605674
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221360398304
+20
+-673.696700650341
+30
+96.0407362022104
+11
+718.363107612844
+21
+-650.643847155672
+31
+101.021259768909
+12
+718.363106545679
+22
+-662.432231199989
+32
+87.5003989193992
+13
+718.363106545679
+23
+-662.432231199989
+33
+87.5003989193992
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363107612844
+20
+-650.643847155672
+30
+101.021259768909
+11
+702.221360398304
+21
+-673.696700650341
+31
+96.0407362022104
+12
+702.221361580333
+22
+-660.639487120937
+32
+111.016899733167
+13
+702.221361580333
+23
+-660.639487120937
+33
+111.016899733167
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363106545679
+20
+-662.432231199989
+30
+87.5003989193992
+11
+732.466066639417
+21
+-639.203194165743
+31
+89.5806067801329
+12
+732.466065703719
+22
+-649.539320894872
+32
+77.7254338656707
+13
+732.466065703719
+23
+-649.539320894872
+33
+77.7254338656707
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466066639417
+20
+-639.203194165743
+30
+89.5806067801329
+11
+718.363106545679
+21
+-662.432231199989
+31
+87.5003989193992
+12
+718.363107612844
+22
+-650.643847155672
+32
+101.021259768909
+13
+718.363107612844
+23
+-650.643847155672
+33
+101.021259768909
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466065703719
+20
+-649.539320894872
+30
+77.7254338656707
+11
+744.275059137262
+21
+-626.524535798612
+31
+76.9019484142785
+12
+744.27505834726
+22
+-635.251254586263
+32
+66.8927096622113
+13
+744.27505834726
+23
+-635.251254586263
+33
+66.8927096622113
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275059137262
+20
+-626.524535798612
+30
+76.9019484142785
+11
+732.466065703719
+21
+-649.539320894872
+31
+77.7254338656707
+12
+732.466066639417
+22
+-639.203194165743
+32
+89.5806067801329
+13
+732.466066639417
+23
+-639.203194165743
+33
+89.5806067801329
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.60214250095
+20
+-752.465070814344
+30
+84.8616271735756
+11
+473.717772252345
+21
+-740.196478791399
+31
+110.675560324675
+12
+473.717763908762
+22
+-752.465074828487
+32
+84.861675745457
+13
+473.717763908762
+23
+-752.465074828487
+33
+84.861675745457
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717772252345
+20
+-740.196478791399
+30
+110.675560324675
+11
+599.60214250095
+21
+-752.465070814344
+31
+84.8616271735756
+12
+599.602150844536
+22
+-740.196470143783
+32
+110.675521501907
+13
+599.602150844536
+23
+-740.196470143783
+33
+110.675521501907
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797653593913
+20
+-576.264066422956
+30
+188.875875742312
+11
+454.66772029492
+21
+-548.673192057237
+31
+186.220486963908
+12
+454.667736501664
+22
+-575.898831573499
+32
+185.305488978394
+13
+454.667736501664
+23
+-575.898831573499
+33
+185.305488978394
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.66772029492
+20
+-548.673192057237
+30
+186.220486963908
+11
+454.797653593913
+21
+-576.264066422956
+31
+188.875875742312
+12
+454.797637205561
+22
+-548.733344026199
+32
+189.801126938624
+13
+454.797637205561
+23
+-548.733344026199
+33
+189.801126938624
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.82932233817
+20
+-584.301801471681
+30
+117.190255690543
+11
+753.739280225648
+21
+-606.678073483521
+31
+132.268789859729
+12
+767.829328484993
+22
+-598.912297398533
+32
+112.558745848353
+13
+767.829328484993
+23
+-598.912297398533
+33
+112.558745848353
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739280225648
+20
+-606.678073483521
+30
+132.268789859729
+11
+767.82932233817
+21
+-584.301801471681
+31
+117.190255690543
+12
+753.739272918395
+22
+-589.30932977233
+32
+137.774660970991
+13
+753.739272918395
+23
+-589.30932977233
+33
+137.774660970991
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133267369982
+20
+-575.898750159264
+30
+185.30549023988
+11
+454.66772029492
+21
+-548.673192057237
+31
+186.220486963908
+12
+602.133251163261
+22
+-548.67314817835
+32
+186.220486963908
+13
+602.133251163261
+23
+-548.67314817835
+33
+186.220486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.66772029492
+20
+-548.673192057237
+30
+186.220486963908
+11
+602.133267369982
+21
+-575.898750159264
+31
+185.30549023988
+12
+454.667736501664
+22
+-575.898831573499
+32
+185.305488978394
+13
+454.667736501664
+23
+-575.898831573499
+33
+185.305488978394
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546333434853
+20
+-575.80035767001
+30
+184.343761377095
+11
+602.133251163261
+21
+-548.67314817835
+31
+186.220486963908
+12
+623.546317277054
+22
+-548.656939099171
+32
+185.255996085023
+13
+623.546317277054
+23
+-548.656939099171
+33
+185.255996085023
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133251163261
+20
+-548.67314817835
+30
+186.220486963908
+11
+623.546333434853
+21
+-575.80035767001
+31
+184.343761377095
+12
+602.133267369982
+22
+-575.898750159264
+32
+185.30549023988
+13
+602.133267369982
+23
+-575.898750159264
+33
+185.30549023988
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363106545679
+20
+-637.12298630735
+30
+112.809643814588
+11
+732.466062914084
+21
+-614.194966001222
+31
+108.540988733599
+12
+732.466065703719
+22
+-627.348021252322
+32
+99.9167335104564
+13
+732.466065703719
+23
+-627.348021252322
+33
+99.9167335104564
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466062914084
+20
+-614.194966001222
+30
+108.540988733599
+11
+718.363106545679
+21
+-637.12298630735
+31
+112.809643814588
+12
+718.363103364091
+22
+-622.121886696301
+32
+122.645633187677
+13
+718.363103364091
+23
+-622.121886696301
+33
+122.645633187677
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797676017751
+20
+-624.370524419528
+30
+177.173126470384
+11
+454.667748728094
+21
+-599.869484727166
+31
+181.183686716704
+12
+454.667758482489
+22
+-623.054883804802
+32
+173.83394276819
+13
+454.667758482489
+23
+-623.054883804802
+33
+173.83394276819
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667748728094
+20
+-599.869484727166
+30
+181.183686716704
+11
+454.797676017751
+21
+-624.370524419528
+31
+177.173126470384
+12
+454.797666066761
+22
+-600.71783565349
+32
+184.671000694682
+13
+454.797666066761
+23
+-600.71783565349
+33
+184.671000694682
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221351073972
+20
+-611.102282944468
+30
+143.497679575028
+11
+684.332877982946
+21
+-594.96003923808
+31
+161.00288323661
+12
+702.221343105619
+22
+-592.16215835415
+32
+149.501676557166
+13
+702.221343105619
+23
+-592.16215835415
+33
+149.501676557166
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332877982946
+20
+-594.96003923808
+30
+161.00288323661
+11
+702.221351073972
+21
+-611.102282944468
+31
+143.497679575028
+12
+684.332886599671
+22
+-615.441289762884
+32
+154.510351165083
+13
+684.332886599671
+23
+-615.441289762884
+33
+154.510351165083
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.00720150166
+20
+-546.363038171439
+30
+48.7110294035543
+11
+787.130178451143
+21
+-564.415115565838
+31
+73.0471892828083
+12
+792.007210733943
+22
+-561.872310305502
+32
+48.1897945304127
+13
+792.007210733943
+23
+-561.872310305502
+33
+48.1897945304127
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130178451143
+20
+-564.415115565838
+30
+73.0471892828083
+11
+792.00720150166
+21
+-546.363038171439
+31
+48.7110294035543
+12
+787.130167954486
+22
+-546.781824001004
+32
+73.639808098986
+13
+787.130167954486
+23
+-546.781824001004
+33
+73.639808098986
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576412708658
+20
+-612.837280222141
+30
+63.214692839186
+11
+760.20182781144
+21
+-592.476194788978
+31
+53.921748202446
+12
+760.201828278129
+22
+-598.389085203732
+32
+48.7664978222319
+13
+760.201828278129
+23
+-598.389085203732
+33
+48.7664978222319
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.20182781144
+20
+-592.476194788978
+30
+53.921748202446
+11
+753.576412708658
+21
+-612.837280222141
+31
+63.214692839186
+12
+753.576412075941
+22
+-604.820821451585
+32
+70.2039737536023
+13
+753.576412075941
+23
+-604.820821451585
+33
+70.2039737536023
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602098887118
+20
+-549.195708452133
+30
+217.326639240051
+11
+624.955290211342
+21
+-186.86272
+31
+215.762940693873
+12
+599.602098887118
+22
+-186.86272
+32
+217.326639240051
+13
+599.602098887118
+23
+-186.86272
+33
+217.326639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955290211342
+20
+-186.86272
+30
+215.762940693873
+11
+599.602098887118
+21
+-549.195708452133
+31
+217.326639240051
+12
+624.955290211342
+22
+-549.169431970937
+32
+215.762940693873
+13
+624.955290211342
+23
+-549.169431970937
+33
+215.762940693873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221333117862
+20
+-572.580560654599
+30
+152.868771861916
+11
+684.332852026746
+21
+-548.325028948197
+31
+165.499614915081
+12
+702.221318561055
+22
+-548.126641526877
+32
+153.690618001708
+13
+702.221318561055
+23
+-548.126641526877
+33
+153.690618001708
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332852026746
+20
+-548.325028948197
+30
+165.499614915081
+11
+702.221333117862
+21
+-572.580560654599
+31
+152.868771861916
+12
+684.332867182503
+22
+-573.785120021053
+32
+164.643953396873
+13
+684.332867182503
+23
+-573.785120021053
+33
+164.643953396873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546366648706
+20
+-698.908941954744
+30
+115.155805645761
+11
+644.636259351108
+21
+-708.826870972768
+31
+93.0455572990973
+12
+623.546362358205
+22
+-712.173174760634
+32
+94.9262110334071
+13
+623.546362358205
+23
+-712.173174760634
+33
+94.9262110334071
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636259351108
+20
+-708.826870972768
+30
+93.0455572990973
+11
+623.546366648706
+21
+-698.908941954744
+31
+115.155805645761
+12
+644.636263548619
+22
+-695.850119169612
+32
+112.836707846937
+13
+644.636263548619
+23
+-695.850119169612
+33
+112.836707846937
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636263548619
+20
+-695.850119169612
+30
+112.836707846937
+11
+665.02138596315
+21
+-703.037584126794
+31
+89.7919287945006
+12
+644.636259351108
+22
+-708.826870972768
+32
+93.0455572990973
+13
+644.636259351108
+23
+-708.826870972768
+33
+93.0455572990973
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.02138596315
+20
+-703.037584126794
+30
+89.7919287945006
+11
+644.636263548619
+21
+-695.850119169612
+31
+112.836707846937
+12
+665.021389999784
+22
+-690.558190885324
+32
+108.824546057595
+13
+665.021389999784
+23
+-690.558190885324
+33
+108.824546057595
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839434933817
+20
+-549.08536836124
+30
+210.755700449054
+11
+439.690564957562
+21
+-186.86272
+31
+212.46522637891
+12
+442.839434933817
+22
+-186.86272
+32
+210.755700449054
+13
+442.839434933817
+23
+-186.86272
+33
+210.755700449054
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690564957562
+20
+-186.86272
+30
+212.46522637891
+11
+442.839434933817
+21
+-549.08536836124
+31
+210.755700449054
+12
+439.690564957562
+22
+-549.114088023756
+32
+212.46522637891
+13
+439.690564957562
+23
+-549.114088023756
+33
+212.46522637891
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973136999
+20
+-280.294079999999
+30
+2499.20806403607
+11
+93.652471048303
+21
+-186.862719999999
+31
+2499.20806403607
+12
+46.8683973137003
+22
+-186.862719999999
+32
+2499.20806403607
+13
+46.8683973137003
+23
+-186.862719999999
+33
+2499.20806403607
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.652471048303
+20
+-186.862719999999
+30
+2499.20806403607
+11
+46.8683973136999
+21
+-280.294079999999
+31
+2499.20806403607
+12
+93.6524710483026
+22
+-280.294079999999
+32
+2499.20806403607
+13
+93.6524710483026
+23
+-280.294079999999
+33
+2499.20806403607
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021389999784
+20
+-690.558190885324
+30
+108.824546057595
+11
+684.332892871929
+21
+-694.910065817882
+31
+85.2241968080869
+12
+665.02138596315
+22
+-703.037584126794
+32
+89.7919287945006
+13
+665.02138596315
+23
+-703.037584126794
+33
+89.7919287945006
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332892871929
+20
+-694.910065817882
+30
+85.2241968080869
+11
+665.021389999784
+21
+-690.558190885324
+31
+108.824546057595
+12
+684.332896682708
+22
+-683.128909470703
+32
+103.191916498769
+13
+684.332896682708
+23
+-683.128909470703
+33
+103.191916498769
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.60214250095
+20
+-634.484214570593
+30
+202.842483429208
+11
+624.955341833487
+21
+-659.530197478533
+31
+189.207522894826
+12
+624.955333552396
+22
+-633.909652359165
+32
+201.384230256964
+13
+624.955333552396
+23
+-633.909652359165
+33
+201.384230256964
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955341833487
+20
+-659.530197478533
+30
+189.207522894826
+11
+599.60214250095
+21
+-634.484214570593
+31
+202.842483429208
+12
+599.602150844536
+22
+-660.298108897689
+32
+190.573882756048
+13
+599.602150844536
+23
+-660.298108897689
+33
+190.573882756048
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363090933403
+20
+-685.388881228845
+30
+39.1981879427727
+11
+732.466045885959
+21
+-671.734013479962
+31
+23.3578379683062
+12
+718.363082853901
+22
+-688.112661424818
+32
+23.3578379602634
+13
+718.363082853901
+23
+-688.112661424818
+33
+23.3578379602634
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466045885959
+20
+-671.734013479962
+30
+23.3578379683062
+11
+718.363090933403
+21
+-685.388881228845
+31
+39.1981879427727
+12
+732.466052014781
+22
+-669.667851071909
+32
+35.3737619083722
+13
+732.466052014781
+23
+-669.667851071909
+33
+35.3737619083722
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884083129639
+20
+-759.7055020414
+30
+23.3578379229566
+11
+624.955307916438
+21
+-764.38593632126
+31
+29.2895600085649
+12
+624.955304385432
+22
+-764.585289351978
+32
+23.3578379140486
+13
+624.955304385432
+23
+-764.585289351978
+33
+23.3578379140486
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955307916438
+20
+-764.38593632126
+30
+29.2895600085649
+11
+649.884083129639
+21
+-759.7055020414
+31
+23.3578379229566
+12
+649.884086364505
+22
+-759.522868440055
+32
+28.7920756889693
+13
+649.884086364505
+23
+-759.522868440055
+33
+28.7920756889693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031420693374
+20
+-566.35608713258
+30
+43.4208517516957
+11
+764.975642457445
+21
+-559.332124908489
+31
+23.3578380033138
+12
+764.959283764737
+22
+-561.475402706277
+32
+23.3578380028359
+13
+764.959283764737
+23
+-561.475402706277
+33
+23.3578380028359
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.975642457445
+20
+-559.332124908489
+30
+23.3578380033138
+11
+764.031420693374
+21
+-566.35608713258
+31
+43.4208517516957
+12
+764.0314182014
+22
+-561.470422367227
+32
+44.2609516834995
+13
+764.0314182014
+23
+-561.470422367227
+33
+44.2609516834995
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838949191021
+20
+-658.912362146436
+30
+188.108094342889
+11
+429.267763467221
+21
+-633.554254686993
+31
+200.482021877632
+12
+432.838940960221
+22
+-633.447412164356
+32
+200.210851816573
+13
+432.838940960221
+23
+-633.447412164356
+33
+200.210851816573
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267763467221
+20
+-633.554254686993
+30
+200.482021877632
+11
+432.838949191021
+21
+-658.912362146436
+31
+188.108094342889
+12
+429.267771709642
+22
+-659.055159092928
+32
+188.362176301584
+13
+429.267771709642
+23
+-659.055159092928
+33
+188.362176301584
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636215091063
+20
+-548.592598441069
+30
+181.426393854527
+11
+623.546317277054
+21
+-186.86272
+31
+185.255996085023
+12
+644.636215091063
+22
+-186.86272
+32
+181.426393854527
+13
+644.636215091063
+23
+-186.86272
+33
+181.426393854527
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546317277054
+20
+-186.86272
+30
+185.255996085023
+11
+644.636215091063
+21
+-548.592598441069
+31
+181.426393854527
+12
+623.546317277054
+22
+-548.656939099171
+32
+185.255996085023
+13
+623.546317277054
+23
+-548.656939099171
+33
+185.255996085023
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797683261242
+20
+-716.144716838612
+30
+97.1582932541697
+11
+454.667769896794
+21
+-699.679329838522
+31
+115.739912506852
+12
+454.667765582876
+22
+-713.015957461653
+32
+95.3999068495287
+13
+454.667765582876
+23
+-713.015957461653
+33
+95.3999068495287
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667769896794
+20
+-699.679329838522
+30
+115.739912506852
+11
+454.797683261242
+21
+-716.144716838612
+31
+97.1582932541697
+12
+454.797687662105
+22
+-702.539296405596
+32
+117.908241171874
+13
+454.797687662105
+23
+-702.539296405596
+33
+117.908241171874
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505834726
+20
+-635.251254586263
+30
+66.8927096622113
+11
+753.576412708658
+21
+-612.837280222141
+31
+63.214692839186
+12
+753.576412075941
+22
+-619.82656113575
+32
+55.1982340679256
+13
+753.576412075941
+23
+-619.82656113575
+33
+55.1982340679256
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576412708658
+20
+-612.837280222141
+30
+63.214692839186
+11
+744.27505834726
+21
+-635.251254586263
+31
+66.8927096622113
+12
+744.275059137262
+22
+-626.524535798612
+32
+76.9019484142785
+13
+744.275059137262
+23
+-626.524535798612
+33
+76.9019484142785
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576402819491
+20
+-576.182653575586
+30
+83.8148703207571
+11
+760.201817040574
+21
+-563.621650860098
+31
+65.2904582517363
+12
+760.20182098394
+22
+-571.352859264312
+32
+63.961061339529
+13
+760.20182098394
+23
+-571.352859264312
+33
+63.961061339529
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201817040574
+20
+-563.621650860098
+30
+65.2904582517363
+11
+753.576402819491
+21
+-576.182653575586
+31
+83.8148703207571
+12
+753.576397473233
+22
+-565.700992480648
+32
+85.6172131326287
+13
+753.576397473233
+23
+-565.700992480648
+33
+85.6172131326287
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332896682708
+20
+-683.128909470703
+30
+103.191916498769
+11
+702.22135687427
+21
+-684.591375697813
+31
+79.4250100709702
+12
+684.332892871929
+22
+-694.910065817882
+32
+85.2241968080869
+13
+684.332892871929
+23
+-694.910065817882
+33
+85.2241968080869
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.22135687427
+20
+-684.591375697813
+30
+79.4250100709702
+11
+684.332896682708
+21
+-683.128909470703
+31
+103.191916498769
+12
+702.221360398304
+22
+-673.696700650341
+32
+96.0407362022104
+13
+702.221360398304
+23
+-673.696700650341
+33
+96.0407362022104
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021379319153
+20
+-618.858911203396
+30
+163.184483899429
+11
+644.636242951136
+21
+-598.733544865996
+31
+176.514545976725
+12
+665.021370191738
+22
+-597.163793012617
+32
+170.061810578218
+13
+665.021370191738
+23
+-597.163793012617
+33
+170.061810578218
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636242951136
+20
+-598.733544865996
+30
+176.514545976725
+11
+665.021379319153
+21
+-618.858911203396
+31
+163.184483899429
+12
+644.636252442318
+22
+-621.293308682581
+32
+169.363127662308
+13
+644.636252442318
+23
+-621.293308682581
+33
+169.363127662308
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575535902759
+20
+-745.521819843274
+30
+27.3599383202345
+11
+454.431253196946
+21
+-737.764901599428
+31
+51.9397070211046
+12
+454.431240478811
+22
+-742.052468269584
+32
+27.0050383833634
+13
+454.431240478811
+23
+-742.052468269584
+33
+27.0050383833634
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431253196946
+20
+-737.764901599428
+30
+51.9397070211046
+11
+453.575535902759
+21
+-745.521819843274
+31
+27.3599383202345
+12
+453.575548860337
+22
+-741.153531203966
+32
+52.7640516820845
+13
+453.575548860337
+23
+-741.153531203966
+33
+52.7640516820845
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431275216977
+20
+-669.689208643299
+30
+155.763553572255
+11
+454.797683261242
+21
+-646.78088064753
+31
+166.522129452237
+12
+454.797687662105
+22
+-667.530828563864
+32
+152.916709017132
+13
+454.797687662105
+23
+-667.530828563864
+33
+152.916709017132
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797683261242
+20
+-646.78088064753
+30
+166.522129452237
+11
+454.431275216977
+21
+-669.689208643299
+31
+155.763553572255
+12
+454.431270729568
+22
+-648.531199395009
+32
+169.63653352158
+13
+454.431270729568
+23
+-648.531199395009
+33
+169.63653352158
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677463405893
+20
+-549.413334136112
+30
+230.27885636425
+11
+468.840126975903
+21
+-580.680624318909
+31
+232.050409880217
+12
+470.677481847252
+22
+-580.392895076207
+32
+229.237696767784
+13
+470.677481847252
+23
+-580.392895076207
+33
+229.237696767784
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840126975903
+20
+-580.680624318909
+30
+232.050409880217
+11
+470.677463405893
+21
+-549.413334136112
+31
+230.27885636425
+12
+468.840108391474
+22
+-549.460721801574
+32
+233.09964686487
+13
+468.840108391474
+23
+-549.460721801574
+33
+233.09964686487
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721690152324
+20
+-549.049610517709
+30
+208.627211339945
+11
+442.839434933817
+21
+-186.86272
+31
+210.755700449054
+12
+445.721690152324
+22
+-186.86272
+32
+208.627211339945
+13
+445.721690152324
+23
+-186.86272
+33
+208.627211339945
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839434933817
+20
+-186.86272
+30
+210.755700449054
+11
+445.721690152324
+21
+-549.049610517709
+31
+208.627211339945
+12
+442.839434933817
+22
+-549.08536836124
+32
+210.755700449054
+13
+442.839434933817
+23
+-549.08536836124
+33
+210.755700449054
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957368701467
+20
+-629.139245228331
+30
+189.276665394806
+11
+696.758800443365
+21
+-647.656853392997
+31
+168.080894990074
+12
+696.758793128571
+22
+-625.025897634329
+32
+178.836736613072
+13
+696.758793128571
+23
+-625.025897634329
+33
+178.836736613072
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758800443365
+20
+-647.656853392997
+30
+168.080894990074
+11
+673.957368701467
+21
+-629.139245228331
+31
+189.276665394806
+12
+673.957376463676
+22
+-653.154439951202
+32
+177.862934850716
+13
+673.957376463676
+23
+-653.154439951202
+33
+177.862934850716
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894045959123
+20
+-575.008661956696
+30
+176.604978855282
+11
+736.997677401125
+21
+-593.835505140242
+31
+156.380365045419
+12
+736.997666927312
+22
+-573.300963343833
+32
+159.911321013811
+13
+736.997666927312
+23
+-573.300963343833
+33
+159.911321013811
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997677401125
+20
+-593.835505140242
+30
+156.380365045419
+11
+717.894045959123
+21
+-575.008661956696
+31
+176.604978855282
+12
+717.894057585081
+22
+-597.802053886837
+32
+172.685609040578
+13
+717.894057585081
+23
+-597.802053886837
+33
+172.685609040578
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721707495526
+20
+-578.184382747044
+30
+207.648051313885
+11
+442.839434933817
+21
+-549.08536836124
+31
+210.755700449054
+12
+445.721690152324
+22
+-549.049610517709
+32
+208.627211339945
+13
+445.721690152324
+23
+-549.049610517709
+33
+208.627211339945
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839434933817
+20
+-549.08536836124
+30
+210.755700449054
+11
+445.721707495526
+21
+-578.184382747044
+31
+207.648051313885
+12
+442.839452384975
+22
+-578.401495960111
+32
+209.770445440443
+13
+442.839452384975
+23
+-578.401495960111
+33
+209.770445440443
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839452384975
+20
+-759.393032819931
+30
+28.7789085623947
+11
+445.72170439774
+21
+-757.445533046268
+31
+23.3578378593151
+12
+442.839449157947
+22
+-759.575223903305
+32
+23.3578378579396
+13
+442.839449157947
+23
+-759.575223903305
+33
+23.3578378579396
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.72170439774
+20
+-757.445533046268
+30
+23.3578378593151
+11
+442.839452384975
+21
+-759.393032819931
+31
+28.7789085623947
+12
+445.721707495526
+22
+-757.270638693351
+32
+28.5617953495419
+13
+445.721707495526
+23
+-757.270638693351
+33
+28.5617953495419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894044751764
+20
+-726.295731112839
+30
+23.3578379516926
+11
+696.758770484001
+21
+-740.277270942125
+31
+26.8233094768247
+12
+696.758768421093
+22
+-740.393738342711
+32
+23.357837941943
+13
+696.758768421093
+23
+-740.393738342711
+33
+23.357837941943
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758770484001
+20
+-740.277270942125
+30
+26.8233094768247
+11
+717.894044751764
+21
+-726.295731112839
+31
+23.3578379516926
+12
+717.894045959123
+22
+-726.227566234427
+32
+25.3860745623198
+13
+717.894045959123
+23
+-726.227566234427
+33
+25.3860745623198
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.00604998394
+20
+-549.612103415805
+30
+242.110623248711
+11
+458.222214863865
+21
+-581.498326831209
+31
+240.043876806793
+12
+458.222195872847
+22
+-549.595394709904
+32
+241.116069017578
+13
+458.222195872847
+23
+-549.595394709904
+33
+241.116069017578
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222214863865
+20
+-581.498326831209
+30
+240.043876806793
+11
+455.00604998394
+21
+-549.612103415805
+31
+242.110623248711
+12
+455.006069025402
+22
+-581.599775817026
+32
+241.035583090668
+13
+455.006069025402
+23
+-581.599775817026
+33
+241.035583090668
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024163430099
+20
+-590.534326018981
+30
+91.2949066282494
+11
+767.829332959368
+21
+-612.755392432138
+31
+105.979521385129
+12
+779.024166993188
+22
+-601.558027793705
+32
+86.0556585976989
+13
+779.024166993188
+23
+-601.558027793705
+33
+86.0556585976989
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829332959368
+20
+-612.755392432138
+30
+105.979521385129
+11
+779.024163430099
+21
+-590.534326018981
+31
+91.2949066282494
+12
+767.829328484993
+22
+-598.912297398533
+32
+112.558745848353
+13
+767.829328484993
+23
+-598.912297398533
+33
+112.558745848353
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829328484993
+20
+-598.912297398533
+30
+112.558745848353
+11
+753.73928554472
+21
+-623.13454224489
+31
+124.447504114724
+12
+767.829332959368
+22
+-612.755392432138
+32
+105.979521385129
+13
+767.829332959368
+23
+-612.755392432138
+33
+105.979521385129
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928554472
+20
+-623.13454224489
+30
+124.447504114724
+11
+767.829328484993
+21
+-598.912297398533
+31
+112.558745848353
+12
+753.739280225648
+22
+-606.678073483521
+32
+132.268789859729
+13
+753.739280225648
+23
+-606.678073483521
+33
+132.268789859729
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739280225648
+20
+-606.678073483521
+30
+132.268789859729
+11
+736.997691839832
+21
+-632.515984774395
+31
+141.140229605674
+12
+753.73928554472
+22
+-623.13454224489
+32
+124.447504114724
+13
+753.73928554472
+23
+-623.13454224489
+33
+124.447504114724
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997691839832
+20
+-632.515984774395
+30
+141.140229605674
+11
+753.739280225648
+21
+-606.678073483521
+31
+132.268789859729
+12
+736.997685757261
+22
+-613.69735635364
+32
+150.084181819366
+13
+736.997685757261
+23
+-613.69735635364
+33
+150.084181819366
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894066860413
+20
+-619.848757614325
+30
+165.696830164561
+11
+736.997691839832
+21
+-632.515984774395
+31
+141.140229605674
+12
+736.997685757261
+22
+-613.69735635364
+32
+150.084181819366
+13
+736.997685757261
+23
+-613.69735635364
+33
+150.084181819366
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997691839832
+20
+-632.515984774395
+30
+141.140229605674
+11
+717.894066860413
+21
+-619.848757614325
+31
+165.696830164561
+12
+717.894073612081
+22
+-640.737481474577
+32
+155.769021196026
+13
+717.894073612081
+23
+-640.737481474577
+33
+155.769021196026
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758793128571
+20
+-625.025897634329
+30
+178.836736613072
+11
+717.894073612081
+21
+-640.737481474577
+31
+155.769021196026
+12
+717.894066860413
+22
+-619.848757614325
+32
+165.696830164561
+13
+717.894066860413
+23
+-619.848757614325
+33
+165.696830164561
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894073612081
+20
+-640.737481474577
+30
+155.769021196026
+11
+696.758793128571
+21
+-625.025897634329
+31
+178.836736613072
+12
+696.758800443365
+22
+-647.656853392997
+32
+168.080894990074
+13
+696.758800443365
+23
+-647.656853392997
+33
+168.080894990074
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466066639417
+20
+-639.203194165743
+30
+89.5806067801329
+11
+744.27505834726
+21
+-616.515297047424
+31
+85.6286672029373
+12
+744.275059137262
+22
+-626.524535798612
+32
+76.9019484142785
+13
+744.275059137262
+23
+-626.524535798612
+33
+76.9019484142785
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505834726
+20
+-616.515297047424
+30
+85.6286672029373
+11
+732.466066639417
+21
+-639.203194165743
+31
+89.5806067801329
+12
+732.466065703719
+22
+-627.348021252322
+32
+99.9167335104564
+13
+732.466065703719
+23
+-627.348021252322
+33
+99.9167335104564
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884100288402
+20
+-754.828812255533
+30
+56.0907148781112
+11
+624.955333552396
+21
+-751.006817642042
+31
+84.2870649622931
+12
+624.955322175969
+22
+-759.578730682939
+32
+57.2462284142879
+13
+624.955322175969
+23
+-759.578730682939
+33
+57.2462284142879
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955333552396
+20
+-751.006817642042
+30
+84.2870649622931
+11
+649.884100288402
+21
+-754.828812255533
+31
+56.0907148781112
+12
+649.884111397057
+22
+-746.458660352302
+32
+82.4950785735168
+13
+649.884111397057
+23
+-746.458660352302
+33
+82.4950785735168
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.84015475682
+20
+-767.174448290109
+30
+90.6571807720069
+11
+466.630414711229
+21
+-778.937031754263
+31
+61.9555523461604
+12
+468.840142428527
+22
+-776.463572930403
+32
+61.353838580619
+13
+468.840142428527
+23
+-776.463572930403
+33
+61.353838580619
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630414711229
+20
+-778.937031754263
+30
+61.9555523461604
+11
+468.84015475682
+21
+-767.174448290109
+31
+90.6571807720069
+12
+466.630427178961
+22
+-769.542842319152
+32
+91.5903304644009
+13
+466.630427178961
+23
+-769.542842319152
+33
+91.5903304644009
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.10170430358
+20
+-549.308104906071
+30
+224.014968929071
+11
+472.107168359226
+21
+-580.08201644067
+31
+226.198682483658
+12
+473.101722427237
+22
+-579.753960348852
+32
+222.99174608133
+13
+473.101722427237
+23
+-579.753960348852
+33
+222.99174608133
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107168359226
+20
+-580.08201644067
+30
+226.198682483658
+11
+473.10170430358
+21
+-549.308104906071
+31
+224.014968929071
+12
+472.107150072447
+22
+-549.362133988305
+32
+227.231114817978
+13
+472.107150072447
+23
+-549.362133988305
+33
+227.231114817978
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955333552396
+20
+-751.006817642042
+30
+84.2870649622931
+11
+599.602150844536
+21
+-740.196470143783
+31
+110.675521501907
+12
+599.60214250095
+22
+-752.465070814344
+32
+84.8616271735756
+13
+599.60214250095
+23
+-752.465070814344
+33
+84.8616271735756
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602150844536
+20
+-740.196470143783
+30
+110.675521501907
+11
+624.955333552396
+21
+-751.006817642042
+31
+84.2870649622931
+12
+624.955341833487
+22
+-738.830110282484
+32
+109.907610082888
+13
+624.955341833487
+23
+-738.830110282484
+33
+109.907610082888
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.700983922341
+20
+-280.29408
+30
+1605.98522290042
+11
+180.160557528894
+21
+-186.86272
+31
+1570.85958260462
+12
+180.160557528893
+22
+-280.29408
+32
+1570.85958260462
+13
+180.160557528893
+23
+-280.29408
+33
+1570.85958260462
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+180.160557528894
+20
+-186.86272
+30
+1570.85958260462
+11
+176.700983922341
+21
+-280.29408
+31
+1605.98522290042
+12
+176.700983922342
+22
+-186.86272
+32
+1605.98522290042
+13
+176.700983922342
+23
+-186.86272
+33
+1605.98522290042
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466052014781
+20
+-669.667851071909
+30
+35.3737619083722
+11
+744.275052115393
+21
+-648.23289118406
+31
+43.7940230954864
+12
+744.275046789786
+22
+-652.245630435845
+32
+31.1354921818382
+13
+744.275046789786
+23
+-652.245630435845
+33
+31.1354921818382
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275052115393
+20
+-648.23289118406
+30
+43.7940230954864
+11
+732.466052014781
+21
+-669.667851071909
+31
+35.3737619083722
+12
+732.466058322552
+22
+-664.91507027919
+32
+50.366817478493
+13
+732.466058322552
+23
+-664.91507027919
+33
+50.366817478493
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335587191701
+20
+-578.704166932226
+30
+212.72919754513
+11
+432.838897838644
+21
+-549.148351803013
+31
+214.504708726405
+12
+436.335569590044
+22
+-549.135217804424
+32
+213.722949367545
+13
+436.335569590044
+23
+-549.135217804424
+33
+213.722949367545
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838897838644
+20
+-549.148351803013
+30
+214.504708726405
+11
+436.335587191701
+21
+-578.704166932226
+31
+212.72919754513
+12
+432.838915479952
+22
+-578.783910422824
+32
+213.508718295381
+13
+432.838915479952
+23
+-578.783910422824
+33
+213.508718295381
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642065047928
+20
+-755.603683334388
+30
+86.0982896720056
+11
+473.10173725466
+21
+-767.61567851106
+31
+59.2014293241045
+12
+473.642053400866
+22
+-764.379514823734
+32
+58.4141748490874
+13
+473.642053400866
+23
+-764.379514823734
+33
+58.4141748490874
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.10173725466
+20
+-767.61567851106
+30
+59.2014293241045
+11
+473.642065047928
+21
+-755.603683334388
+31
+86.0982896720056
+12
+473.101749084159
+22
+-758.702384848233
+32
+87.3191803898169
+13
+473.101749084159
+23
+-758.702384848233
+33
+87.3191803898169
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335620774804
+20
+-737.047580997407
+30
+108.905866027708
+11
+439.690607723364
+21
+-747.931486742049
+31
+83.0754516399063
+12
+436.335612575248
+22
+-749.104396759147
+32
+83.5375802413299
+13
+436.335612575248
+23
+-749.104396759147
+33
+83.5375802413299
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690607723364
+20
+-747.931486742049
+30
+83.0754516399063
+11
+436.335620774804
+21
+-737.047580997407
+31
+108.905866027708
+12
+439.690615872653
+22
+-735.948583762681
+32
+108.288220362449
+13
+439.690615872653
+23
+-735.948583762681
+33
+108.288220362449
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-549.195745909472
+30
+217.326639240051
+11
+599.602116671527
+21
+-579.071662867255
+31
+216.322569598682
+12
+599.602098887118
+22
+-549.195708452133
+32
+217.326639240051
+13
+599.602098887118
+23
+-549.195708452133
+33
+217.326639240051
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602116671527
+20
+-579.071662867255
+30
+216.322569598682
+11
+473.71772029492
+21
+-549.195745909472
+31
+217.326639240051
+12
+473.717738079349
+22
+-579.071732366754
+32
+216.322568521811
+13
+473.717738079349
+23
+-579.071732366754
+33
+216.322568521811
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758768421093
+20
+-740.393738342711
+30
+23.357837941943
+11
+673.957344671825
+21
+-751.440053094339
+31
+27.9652257853831
+12
+673.957341929162
+22
+-751.594897963598
+32
+23.3578379323091
+13
+673.957341929162
+23
+-751.594897963598
+33
+23.3578379323091
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957344671825
+20
+-751.440053094339
+30
+27.9652257853831
+11
+696.758768421093
+21
+-740.393738342711
+31
+23.357837941943
+12
+696.758770484001
+22
+-740.277270942125
+32
+26.8233094768247
+13
+696.758770484001
+23
+-740.277270942125
+33
+26.8233094768247
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363107612844
+20
+-650.643847155672
+30
+101.021259768909
+11
+732.466065703719
+21
+-627.348021252322
+31
+99.9167335104564
+12
+732.466066639417
+22
+-639.203194165743
+32
+89.5806067801329
+13
+732.466066639417
+23
+-639.203194165743
+33
+89.5806067801329
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466065703719
+20
+-627.348021252322
+30
+99.9167335104564
+11
+718.363107612844
+21
+-650.643847155672
+31
+101.021259768909
+12
+718.363106545679
+22
+-637.12298630735
+32
+112.809643814588
+13
+718.363106545679
+23
+-637.12298630735
+33
+112.809643814588
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130182929858
+20
+-573.195904769668
+30
+71.5373148305873
+11
+779.024163430099
+21
+-590.534326018981
+31
+91.2949066282494
+12
+787.130186503031
+22
+-581.689044301674
+32
+68.844999694228
+13
+787.130186503031
+23
+-581.689044301674
+33
+68.844999694228
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024163430099
+20
+-590.534326018981
+30
+91.2949066282494
+11
+787.130182929858
+21
+-573.195904769668
+31
+71.5373148305873
+12
+779.024158535186
+22
+-578.899518233046
+32
+94.9831268667919
+13
+779.024158535186
+23
+-578.899518233046
+33
+94.9831268667919
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335612575248
+20
+-633.16016763801
+30
+199.481809374145
+11
+432.838929652884
+21
+-606.570796271198
+31
+208.73070710808
+12
+436.335601310833
+22
+-606.385574583813
+32
+207.969323546969
+13
+436.335601310833
+23
+-606.385574583813
+33
+207.969323546969
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838929652884
+20
+-606.570796271198
+30
+208.73070710808
+11
+436.335612575248
+21
+-633.16016763801
+31
+199.481809374145
+12
+432.838940960221
+22
+-633.447412164356
+32
+200.210851816573
+13
+432.838940960221
+23
+-633.447412164356
+33
+200.210851816573
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.478047748674
+20
+-563.767069108265
+30
+23.3578380112902
+11
+792.007217306199
+21
+-577.494024343961
+31
+43.2377297488181
+12
+793.410423174187
+22
+-566.321374409616
+32
+23.357838010706
+13
+793.410423174187
+23
+-566.321374409616
+33
+23.357838010706
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007217306199
+20
+-577.494024343961
+30
+43.2377297488181
+11
+793.478047748674
+21
+-563.767069108265
+31
+23.3578380112902
+12
+792.007215701535
+22
+-572.529418663124
+32
+45.597263875134
+13
+792.007215701535
+23
+-572.529418663124
+33
+45.597263875134
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955333552396
+20
+-633.909652359165
+30
+201.384230256964
+11
+649.884119483233
+21
+-657.135168302204
+31
+184.945974477603
+12
+649.884111397057
+22
+-632.11766596993
+32
+196.836072967405
+13
+649.884111397057
+23
+-632.11766596993
+33
+196.836072967405
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884119483233
+20
+-657.135168302204
+30
+184.945974477603
+11
+624.955333552396
+21
+-633.909652359165
+31
+201.384230256964
+12
+624.955341833487
+22
+-659.530197478533
+32
+189.207522894826
+13
+624.955341833487
+23
+-659.530197478533
+33
+189.207522894826
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246977834961
+20
+-748.839872068014
+30
+27.6993612581553
+11
+453.575533520408
+21
+-745.656322242814
+31
+23.3578378643829
+12
+452.24697525056
+22
+-748.985781777358
+32
+23.3578378632311
+13
+452.24697525056
+23
+-748.985781777358
+33
+23.3578378632311
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575533520408
+20
+-745.656322242814
+30
+23.3578378643829
+11
+452.246977834961
+21
+-748.839872068014
+31
+27.6993612581553
+12
+453.575535902759
+22
+-745.521819843274
+32
+27.3599383202345
+13
+453.575535902759
+23
+-745.521819843274
+33
+27.3599383202345
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797653593913
+20
+-738.498463121584
+30
+26.6414790273437
+11
+454.667734764409
+21
+-735.026158016502
+31
+23.3578378670709
+12
+454.797651639243
+22
+-738.608819575715
+32
+23.3578378663214
+13
+454.797651639243
+23
+-738.608819575715
+33
+23.3578378663214
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667734764409
+20
+-735.026158016502
+30
+23.3578378670709
+11
+454.797653593913
+21
+-738.498463121584
+31
+26.6414790273437
+12
+454.667736501664
+22
+-734.928076357629
+32
+26.2762441782473
+13
+454.667736501664
+23
+-734.928076357629
+33
+26.2762441782473
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690596528004
+20
+-756.366969281262
+30
+56.4649968373303
+11
+442.839452384975
+21
+-759.393032819931
+31
+28.7789085623947
+12
+439.690582495428
+22
+-761.097663471809
+32
+28.9532865498045
+13
+439.690582495428
+23
+-761.097663471809
+33
+28.9532865498045
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839452384975
+20
+-759.393032819931
+30
+28.7789085623947
+11
+439.690596528004
+21
+-756.366969281262
+31
+56.4649968373303
+12
+442.839466299903
+22
+-754.702000509797
+32
+56.0599621810555
+13
+442.839466299903
+23
+-754.702000509797
+33
+56.0599621810555
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602155913773
+20
+-684.199422975673
+30
+174.902160191072
+11
+624.955348552338
+21
+-704.633972822346
+31
+155.011385430145
+12
+624.955346864755
+22
+-683.252487807443
+32
+173.653183437694
+13
+624.955346864755
+23
+-683.252487807443
+33
+173.653183437694
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955348552338
+20
+-704.633972822346
+30
+155.011385430145
+11
+599.602155913773
+21
+-684.199422975673
+31
+174.902160191072
+12
+599.602157614092
+22
+-705.742266508454
+32
+156.119679116142
+13
+599.602157614092
+23
+-705.742266508454
+33
+156.119679116142
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839490392048
+20
+-680.220295673638
+30
+169.6537686923
+11
+439.690615872653
+21
+-657.910807757804
+31
+186.325996375185
+12
+442.839485482368
+22
+-657.071290040049
+32
+184.832214227177
+13
+442.839485482368
+23
+-657.071290040049
+33
+184.832214227177
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690615872653
+20
+-657.910807757804
+30
+186.325996375185
+11
+442.839490392048
+21
+-680.220295673638
+31
+169.6537686923
+12
+439.690620823844
+22
+-681.255534297249
+32
+171.019219664594
+13
+439.690620823844
+23
+-681.255534297249
+33
+171.019219664594
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636259351108
+20
+-642.668144691721
+30
+159.204283586808
+11
+623.546355296361
+21
+-622.700434111963
+31
+172.934485818424
+12
+644.636252442318
+22
+-621.293308682581
+32
+169.363127662308
+13
+644.636252442318
+23
+-621.293308682581
+33
+169.363127662308
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546355296361
+20
+-622.700434111963
+30
+172.934485818424
+11
+644.636259351108
+21
+-642.668144691721
+31
+159.204283586808
+12
+623.546362358205
+22
+-644.548798426367
+32
+162.550587374486
+13
+623.546362358205
+23
+-644.548798426367
+33
+162.550587374486
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.02138596315
+20
+-639.414516186541
+30
+153.414996741162
+11
+644.636252442318
+21
+-621.293308682581
+31
+169.363127662308
+12
+665.021379319153
+22
+-618.858911203396
+32
+163.184483899429
+13
+665.021379319153
+23
+-618.858911203396
+33
+163.184483899429
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636252442318
+20
+-621.293308682581
+30
+169.363127662308
+11
+665.02138596315
+21
+-639.414516186541
+31
+153.414996741162
+12
+644.636259351108
+22
+-642.668144691721
+32
+159.204283586808
+13
+644.636259351108
+23
+-642.668144691721
+33
+159.204283586808
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332892871929
+20
+-634.846784199308
+30
+145.28747843271
+11
+665.021379319153
+21
+-618.858911203396
+31
+163.184483899429
+12
+684.332886599671
+22
+-615.441289762884
+32
+154.510351165083
+13
+684.332886599671
+23
+-615.441289762884
+33
+154.510351165083
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021379319153
+20
+-618.858911203396
+30
+163.184483899429
+11
+684.332892871929
+21
+-634.846784199308
+31
+145.28747843271
+12
+665.02138596315
+22
+-639.414516186541
+32
+153.414996741162
+13
+665.02138596315
+23
+-639.414516186541
+33
+153.414996741162
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.22135687427
+20
+-629.047597461153
+30
+134.968788313225
+11
+684.332886599671
+21
+-615.441289762884
+31
+154.510351165083
+12
+702.221351073972
+22
+-611.102282944468
+32
+143.497679575028
+13
+702.221351073972
+23
+-611.102282944468
+33
+143.497679575028
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332886599671
+20
+-615.441289762884
+30
+154.510351165083
+11
+702.22135687427
+21
+-629.047597461153
+31
+134.968788313225
+12
+684.332892871929
+22
+-634.846784199308
+32
+145.28747843271
+13
+684.332892871929
+23
+-634.846784199308
+33
+145.28747843271
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363103364091
+20
+-622.121886696301
+30
+122.645633187677
+11
+702.221351073972
+21
+-611.102282944468
+31
+143.497679575028
+12
+718.363098127435
+22
+-605.920400916633
+32
+130.345732863609
+13
+718.363098127435
+23
+-605.920400916633
+33
+130.345732863609
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221351073972
+20
+-611.102282944468
+30
+143.497679575028
+11
+718.363103364091
+21
+-622.121886696301
+31
+122.645633187677
+12
+702.22135687427
+22
+-629.047597461153
+32
+134.968788313225
+13
+702.22135687427
+23
+-629.047597461153
+33
+134.968788313225
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363103364091
+20
+-622.121886696301
+30
+122.645633187677
+11
+732.466058322552
+21
+-599.989404866694
+31
+115.292482897529
+12
+732.466062914084
+22
+-614.194966001222
+32
+108.540988733599
+13
+732.466062914084
+23
+-614.194966001222
+33
+108.540988733599
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466058322552
+20
+-599.989404866694
+30
+115.292482897529
+11
+718.363103364091
+21
+-622.121886696301
+31
+122.645633187677
+12
+718.363098127435
+22
+-605.920400916633
+32
+130.345732863609
+13
+718.363098127435
+23
+-605.920400916633
+33
+130.345732863609
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031425007948
+20
+-586.699189190326
+30
+30.0821938636906
+11
+764.696220629469
+21
+-572.980425379156
+31
+23.3578380002154
+12
+764.531578361879
+22
+-577.829946771796
+32
+23.3578379990944
+13
+764.531578361879
+23
+-577.829946771796
+33
+23.3578379990944
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.696220629469
+20
+-572.980425379156
+30
+23.3578380002154
+11
+764.031425007948
+21
+-586.699189190326
+31
+30.0821938636906
+12
+764.031425302868
+22
+-583.441376980459
+32
+33.8187896004645
+13
+764.031425302868
+23
+-583.441376980459
+33
+33.8187896004645
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.935095112731
+20
+-577.829952364284
+30
+23.3578380080173
+11
+792.007217306199
+21
+-592.860317128213
+31
+27.8714369630177
+12
+792.574093434967
+22
+-584.829110641297
+32
+23.3578380063606
+13
+792.574093434967
+23
+-584.829110641297
+33
+23.3578380063606
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007217306199
+20
+-592.860317128213
+30
+27.8714369630177
+11
+792.935095112731
+21
+-577.829952364284
+31
+23.3578380080173
+12
+792.007218281129
+22
+-589.846284379929
+32
+32.4682094668199
+13
+792.007218281129
+23
+-589.846284379929
+33
+32.4682094668199
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.0314182014
+20
+-561.470422367227
+30
+44.2609516834995
+11
+764.995900047839
+21
+-545.937132023437
+31
+23.3578380793295
+12
+764.975642457445
+22
+-559.332124908489
+32
+23.3578380033138
+13
+764.975642457445
+23
+-559.332124908489
+33
+23.3578380033138
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.995900047839
+20
+-545.937132023437
+30
+23.3578380793295
+11
+764.0314182014
+21
+-561.470422367227
+31
+44.2609516834995
+12
+764.031409168954
+22
+-546.296855411639
+32
+44.7709041931231
+13
+764.031409168954
+23
+-546.296855411639
+33
+44.7709041931231
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024140682123
+20
+-186.86272
+30
+97.713066817443
+11
+767.829301759449
+21
+-547.569288532173
+31
+120.514493197419
+12
+779.024140682123
+22
+-547.186238711366
+32
+97.7130668174428
+13
+779.024140682123
+23
+-547.186238711366
+33
+97.7130668174428
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829301759449
+20
+-547.569288532173
+30
+120.514493197419
+11
+779.024140682123
+21
+-186.86272
+31
+97.713066817443
+12
+767.829301759449
+22
+-186.86272
+32
+120.51449319742
+13
+767.829301759449
+23
+-186.86272
+33
+120.51449319742
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247013852634
+20
+-710.823016652003
+30
+124.188674487802
+11
+453.575572828439
+21
+-691.225448319662
+31
+141.602860928812
+12
+453.575571294939
+22
+-708.165176005556
+32
+122.173590554812
+13
+453.575571294939
+23
+-708.165176005556
+33
+122.173590554812
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575572828439
+20
+-691.225448319662
+30
+141.602860928812
+11
+452.247013852634
+21
+-710.823016652003
+31
+124.188674487802
+12
+452.247015413237
+22
+-693.583909707096
+32
+143.961322316008
+13
+452.247015413237
+23
+-693.583909707096
+33
+143.961322316008
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575571294939
+20
+-708.165176005556
+30
+122.173590554812
+11
+454.431276722139
+21
+-688.759443912117
+31
+139.136856521515
+12
+454.431275216977
+22
+-705.386140960936
+32
+120.066621251022
+13
+454.431275216977
+23
+-705.386140960936
+33
+120.066621251022
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431276722139
+20
+-688.759443912117
+30
+139.136856521515
+11
+453.575571294939
+21
+-708.165176005556
+31
+122.173590554812
+12
+453.575572828439
+22
+-691.225448319662
+32
+141.602860928812
+13
+453.575572828439
+23
+-691.225448319662
+33
+141.602860928812
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335601310833
+20
+-757.591910929275
+30
+56.7629871862785
+11
+439.690582495428
+21
+-761.097663471809
+31
+28.9532865498045
+12
+436.335587191701
+22
+-762.351784924648
+32
+29.0815795342117
+13
+436.335587191701
+23
+-762.351784924648
+33
+29.0815795342117
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690582495428
+20
+-761.097663471809
+30
+28.9532865498045
+11
+436.335601310833
+21
+-757.591910929275
+31
+56.7629871862785
+12
+439.690596528004
+22
+-756.366969281262
+32
+56.4649968373303
+13
+439.690596528004
+23
+-756.366969281262
+33
+56.4649968373303
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006112926336
+20
+-699.207898179883
+30
+194.697902416163
+11
+458.222260471925
+21
+-722.603322716877
+31
+172.980735322867
+12
+458.222258577851
+22
+-698.605625061081
+32
+193.903521183332
+13
+458.222258577851
+23
+-698.605625061081
+33
+193.903521183332
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222260471925
+20
+-722.603322716877
+30
+172.980735322867
+11
+455.006112926336
+21
+-699.207898179883
+31
+194.697902416163
+12
+455.006114828511
+22
+-723.308225016813
+32
+173.685637622731
+13
+455.006114828511
+23
+-723.308225016813
+33
+173.685637622731
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222258577851
+20
+-698.605625061081
+30
+193.903521183332
+11
+461.270001665299
+21
+-721.590015329221
+31
+171.967427935313
+12
+461.269999782869
+22
+-697.7398487668
+32
+192.761586394987
+13
+461.269999782869
+23
+-697.7398487668
+33
+192.761586394987
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.270001665299
+20
+-721.590015329221
+30
+171.967427935313
+11
+458.222258577851
+21
+-698.605625061081
+31
+193.903521183332
+12
+458.222260471925
+22
+-722.603322716877
+32
+172.980735322867
+13
+458.222260471925
+23
+-722.603322716877
+33
+172.980735322867
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471087696265
+20
+-751.942885609203
+30
+28.0167869283821
+11
+452.24697525056
+21
+-748.985781777358
+31
+23.3578378632311
+12
+450.471084922909
+22
+-752.099463345238
+32
+23.3578378619863
+13
+450.471084922909
+23
+-752.099463345238
+33
+23.3578378619863
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.24697525056
+20
+-748.985781777358
+30
+23.3578378632311
+11
+450.471087696265
+21
+-751.942885609203
+31
+28.0167869283821
+12
+452.246977834961
+22
+-748.839872068014
+32
+27.6993612581553
+13
+452.246977834961
+23
+-748.839872068014
+33
+27.6993612581553
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332877982946
+20
+-710.625470617764
+30
+45.3374518452758
+11
+696.283090443709
+21
+-706.400240289655
+31
+23.3578379492919
+12
+684.332867182503
+22
+-714.266540775895
+32
+24.1625326278822
+13
+684.332867182503
+23
+-714.266540775895
+33
+24.1625326278822
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.283090443709
+20
+-706.400240289655
+30
+23.3578379492919
+11
+684.332877982946
+21
+-710.625470617764
+31
+45.3374518452758
+12
+702.221343105619
+22
+-699.12426393804
+32
+42.5395709625037
+13
+702.221343105619
+23
+-699.12426393804
+33
+42.5395709625037
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.283090443709
+20
+-706.400240289655
+30
+23.3578379492919
+11
+702.221343105619
+21
+-699.12426393804
+31
+42.5395709625037
+12
+702.221333321817
+22
+-702.422601699266
+32
+23.3578379520354
+13
+702.221333321817
+23
+-702.422601699266
+33
+23.3578379520354
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466062914084
+20
+-614.194966001222
+30
+108.540988733599
+11
+744.275052115393
+21
+-593.416610482006
+31
+98.6103038030606
+12
+744.27505599199
+22
+-605.41026540619
+32
+92.9100649699753
+13
+744.27505599199
+23
+-605.41026540619
+33
+92.9100649699753
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275052115393
+20
+-593.416610482006
+30
+98.6103038030606
+11
+732.466062914084
+21
+-614.194966001222
+31
+108.540988733599
+12
+732.466058322552
+22
+-599.989404866694
+32
+115.292482897529
+13
+732.466058322552
+23
+-599.989404866694
+33
+115.292482897529
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.27505599199
+20
+-605.41026540619
+30
+92.9100649699753
+11
+753.576407084801
+21
+-586.320946175488
+31
+80.6010436173693
+12
+753.576410189591
+22
+-595.926735646398
+32
+76.0356884766169
+13
+753.576410189591
+23
+-595.926735646398
+33
+76.0356884766169
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576407084801
+20
+-586.320946175488
+30
+80.6010436173693
+11
+744.27505599199
+21
+-605.41026540619
+31
+92.9100649699753
+12
+744.275052115393
+22
+-593.416610482006
+32
+98.6103038030606
+13
+744.275052115393
+23
+-593.416610482006
+33
+98.6103038030606
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576410189591
+20
+-595.926735646398
+30
+76.0356884766169
+11
+760.201824130007
+21
+-578.830801190005
+31
+61.5905626376661
+12
+760.201826420081
+22
+-585.915972100795
+32
+58.2231849183613
+13
+760.201826420081
+23
+-585.915972100795
+33
+58.2231849183613
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201824130007
+20
+-578.830801190005
+30
+61.5905626376661
+11
+753.576410189591
+21
+-595.926735646398
+31
+76.0356884766169
+12
+753.576407084801
+22
+-586.320946175488
+32
+80.6010436173693
+13
+753.576407084801
+23
+-586.320946175488
+33
+80.6010436173693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201826420081
+20
+-585.915972100795
+30
+58.2231849183613
+11
+764.031422681501
+21
+-571.081702518113
+31
+41.9228372915384
+12
+764.031424128692
+22
+-575.559109938211
+32
+39.7948544698768
+13
+764.031424128692
+23
+-575.559109938211
+33
+39.7948544698768
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031422681501
+20
+-571.081702518113
+30
+41.9228372915384
+11
+760.201826420081
+21
+-585.915972100795
+31
+58.2231849183613
+12
+760.201824130007
+22
+-578.830801190005
+32
+61.5905626376661
+13
+760.201824130007
+23
+-578.830801190005
+33
+61.5905626376661
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031424128692
+20
+-575.559109938211
+30
+39.7948544698768
+11
+764.92809314571
+21
+-563.7670797619
+31
+23.357838002321
+12
+764.878707491771
+22
+-566.32138210224
+32
+23.3578380017417
+13
+764.878707491771
+23
+-566.32138210224
+33
+23.3578380017417
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.92809314571
+20
+-563.7670797619
+30
+23.357838002321
+11
+764.031424128692
+21
+-575.559109938211
+31
+39.7948544698768
+12
+764.031422681501
+22
+-571.081702518113
+32
+41.9228372915384
+13
+764.031422681501
+23
+-571.081702518113
+33
+41.9228372915384
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007217306199
+20
+-577.494024343961
+30
+43.2377297488181
+11
+787.130190684252
+21
+-597.186922321698
+31
+60.1350749996264
+12
+792.007218281129
+22
+-582.09079684746
+32
+40.22369700007
+13
+792.007218281129
+23
+-582.09079684746
+33
+40.22369700007
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130190684252
+20
+-597.186922321698
+30
+60.1350749996264
+11
+792.007217306199
+21
+-577.494024343961
+31
+43.2377297488181
+12
+787.130189104003
+22
+-589.736090634929
+32
+65.0204702834338
+13
+787.130189104003
+23
+-589.736090634929
+33
+65.0204702834338
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130189104003
+20
+-589.736090634929
+30
+65.0204702834338
+11
+779.024169157982
+21
+-611.764971197169
+31
+79.3631234201936
+12
+787.130190684252
+22
+-597.186922321698
+32
+60.1350749996264
+13
+787.130190684252
+23
+-597.186922321698
+33
+60.1350749996264
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024169157982
+20
+-611.764971197169
+30
+79.3631234201936
+11
+787.130189104003
+21
+-589.736090634929
+31
+65.0204702834338
+12
+779.024166993188
+22
+-601.558027793705
+32
+86.0556585976989
+13
+779.024166993188
+23
+-601.558027793705
+33
+86.0556585976989
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024166993188
+20
+-601.558027793705
+30
+86.0556585976989
+11
+767.829335677824
+21
+-625.572837100386
+31
+97.5753208387769
+12
+779.024169157982
+22
+-611.764971197169
+32
+79.3631234201936
+13
+779.024169157982
+23
+-611.764971197169
+33
+79.3631234201936
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829335677824
+20
+-625.572837100386
+30
+97.5753208387769
+11
+779.024166993188
+21
+-601.558027793705
+31
+86.0556585976989
+12
+767.829332959368
+22
+-612.755392432138
+32
+105.979521385129
+13
+767.829332959368
+23
+-612.755392432138
+33
+105.979521385129
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829332959368
+20
+-612.755392432138
+30
+105.979521385129
+11
+753.73928877638
+21
+-638.371732863863
+31
+114.456713513376
+12
+767.829335677824
+22
+-625.572837100386
+32
+97.5753208387769
+13
+767.829335677824
+23
+-625.572837100386
+33
+97.5753208387769
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928877638
+20
+-638.371732863863
+30
+114.456713513376
+11
+767.829332959368
+21
+-612.755392432138
+31
+105.979521385129
+12
+753.73928554472
+22
+-623.13454224489
+32
+124.447504114724
+13
+753.73928554472
+23
+-623.13454224489
+33
+124.447504114724
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636231054623
+20
+-575.409716284687
+30
+180.525125445771
+11
+623.546317277054
+21
+-548.656939099171
+31
+185.255996085023
+12
+644.636215091063
+22
+-548.592598441069
+32
+181.426393854527
+13
+644.636215091063
+23
+-548.592598441069
+33
+181.426393854527
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546317277054
+20
+-548.656939099171
+30
+185.255996085023
+11
+644.636231054623
+21
+-575.409716284687
+31
+180.525125445771
+12
+623.546333434853
+22
+-575.80035767001
+32
+184.343761377095
+13
+623.546333434853
+23
+-575.80035767001
+33
+184.343761377095
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021358751182
+20
+-574.733894284646
+30
+173.91867700208
+11
+644.636215091063
+21
+-548.592598441069
+31
+181.426393854527
+12
+665.021343123663
+22
+-548.481290386566
+32
+174.800973253262
+13
+665.021343123663
+23
+-548.481290386566
+33
+174.800973253262
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636215091063
+20
+-548.592598441069
+30
+181.426393854527
+11
+665.021358751182
+21
+-574.733894284646
+31
+173.91867700208
+12
+644.636231054623
+22
+-575.409716284687
+32
+180.525125445771
+13
+644.636231054623
+23
+-575.409716284687
+33
+180.525125445771
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107164131826
+20
+-776.05993979789
+30
+23.3578378634987
+11
+470.677481847252
+21
+-778.860284147472
+31
+30.7703076765303
+12
+470.677477434794
+22
+-779.109402076299
+32
+23.3578378623763
+13
+470.677477434794
+23
+-779.109402076299
+33
+23.3578378623763
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677481847252
+20
+-778.860284147472
+30
+30.7703076765303
+11
+472.107164131826
+21
+-776.05993979789
+31
+23.3578378634987
+12
+472.107168359226
+22
+-775.821269863314
+32
+30.4594290412997
+13
+472.107168359226
+23
+-775.821269863314
+33
+30.4594290412997
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267737950976
+20
+-763.421251234373
+30
+29.1909851596944
+11
+432.838912025282
+21
+-763.326348925263
+31
+23.3578378539704
+12
+429.267734478649
+22
+-763.617291372796
+32
+23.3578378527852
+13
+429.267734478649
+23
+-763.617291372796
+33
+23.3578378527852
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838912025282
+20
+-763.326348925263
+30
+23.3578378539704
+11
+429.267737950976
+21
+-763.421251234373
+31
+29.1909851596944
+12
+432.838915479952
+22
+-763.131305674907
+32
+29.1613230247316
+13
+432.838915479952
+23
+-763.131305674907
+33
+29.1613230247316
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575535902759
+20
+-745.521819843274
+30
+27.3599383202345
+11
+454.431238307724
+21
+-742.175043209088
+31
+23.3578378654204
+12
+453.575533520408
+22
+-745.656322242814
+32
+23.3578378643829
+13
+453.575533520408
+23
+-745.656322242814
+33
+23.3578378643829
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431238307724
+20
+-742.175043209088
+30
+23.3578378654204
+11
+453.575535902759
+21
+-745.521819843274
+31
+27.3599383202345
+12
+454.431240478811
+22
+-742.052468269584
+32
+27.0050383833634
+13
+454.431240478811
+23
+-742.052468269584
+33
+27.0050383833634
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.160541596036
+20
+-572.980425388099
+30
+23.3578380091579
+11
+792.007218281129
+21
+-589.846284379929
+31
+32.4682094668199
+12
+792.935095112731
+22
+-577.829952364284
+32
+23.3578380080173
+13
+792.935095112731
+23
+-577.829952364284
+33
+23.3578380080173
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007218281129
+20
+-589.846284379929
+30
+32.4682094668199
+11
+793.160541596036
+21
+-572.980425388099
+31
+23.3578380091579
+12
+792.00721860814
+22
+-586.233981212786
+32
+36.6113938325108
+13
+792.00721860814
+23
+-586.233981212786
+33
+36.6113938325108
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630394345883
+20
+-784.472871509203
+30
+23.3578378599218
+11
+464.090746745054
+21
+-786.408777774662
+31
+31.5424891402109
+12
+464.090741872935
+22
+-786.683847141088
+32
+23.3578378586363
+13
+464.090741872935
+23
+-786.683847141088
+33
+23.3578378586363
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090746745054
+20
+-786.408777774662
+30
+31.5424891402109
+11
+466.630394345883
+21
+-784.472871509203
+31
+23.3578378599218
+12
+466.630399083827
+22
+-784.205377362117
+32
+31.3170895287116
+13
+466.630399083827
+23
+-784.205377362117
+33
+31.3170895287116
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.283090443709
+20
+-706.400240289655
+30
+23.3578379492919
+11
+684.332866703488
+21
+-714.293584916115
+31
+23.3578379437967
+12
+684.332867182503
+22
+-714.266540775895
+32
+24.1625326278822
+13
+684.332867182503
+23
+-714.266540775895
+33
+24.1625326278822
+70
+0
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431240478811
+20
+-742.052468269584
+30
+27.0050383833634
+11
+454.797651639243
+21
+-738.608819575715
+31
+23.3578378663214
+12
+454.431238307724
+22
+-742.175043209088
+32
+23.3578378654204
+13
+454.431238307724
+23
+-742.175043209088
+33
+23.3578378654204
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797651639243
+20
+-738.608819575715
+30
+23.3578378663214
+11
+454.431240478811
+21
+-742.052468269584
+31
+27.0050383833634
+12
+454.797653593913
+22
+-738.498463121584
+32
+26.6414790273437
+13
+454.797653593913
+23
+-738.498463121584
+33
+26.6414790273437
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677477434794
+20
+-779.109402076299
+30
+23.3578378623763
+11
+468.840126975903
+21
+-781.672997259934
+31
+31.0580369189494
+12
+468.840122392167
+22
+-781.931785179335
+32
+23.3578378611765
+13
+468.840122392167
+23
+-781.931785179335
+33
+23.3578378611765
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840126975903
+20
+-781.672997259934
+30
+31.0580369189494
+11
+470.677477434794
+21
+-779.109402076299
+31
+23.3578378623763
+12
+470.677481847252
+22
+-778.860284147472
+32
+30.7703076765303
+13
+470.677481847252
+23
+-778.860284147472
+33
+30.7703076765303
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031425302868
+20
+-583.441376980459
+30
+33.8187896004645
+11
+764.805052044838
+21
+-569.303684335783
+31
+23.3578380010606
+12
+764.696220629469
+22
+-572.980425379156
+32
+23.3578380002154
+13
+764.696220629469
+23
+-572.980425379156
+33
+23.3578380002154
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.805052044838
+20
+-569.303684335783
+30
+23.3578380010606
+11
+764.031425302868
+21
+-583.441376980459
+31
+33.8187896004645
+12
+764.031425007948
+22
+-579.704781244013
+32
+37.0766018107078
+13
+764.031425007948
+23
+-579.704781244013
+33
+37.0766018107078
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602113045565
+20
+-766.149870997149
+30
+23.3578379057383
+11
+473.717738079349
+21
+-765.945155901366
+31
+29.449144968378
+12
+473.717734453346
+22
+-766.149872257343
+32
+23.3578378661905
+13
+473.717734453346
+23
+-766.149872257343
+33
+23.3578378661905
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717738079349
+20
+-765.945155901366
+30
+29.449144968378
+11
+599.602113045565
+21
+-766.149870997149
+31
+23.3578379057383
+12
+599.602116671527
+22
+-765.945156978237
+32
+29.4490754688794
+13
+599.602116671527
+23
+-765.945156978237
+33
+29.4490754688794
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.425692248039
+20
+-280.29408
+30
+1698.17280957558
+11
+100.141825844156
+21
+-186.862719999999
+31
+1720.56410006505
+12
+127.425692248039
+22
+-186.862719999999
+32
+1698.17280957558
+13
+127.425692248039
+23
+-186.862719999999
+33
+1698.17280957558
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844156
+20
+-186.862719999999
+30
+1720.56410006505
+11
+127.425692248039
+21
+-280.29408
+31
+1698.17280957558
+12
+100.141825844156
+22
+-280.29408
+32
+1720.56410006505
+13
+100.141825844156
+23
+-280.29408
+33
+1720.56410006505
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471124298894
+20
+-713.308606140826
+30
+126.073163560098
+11
+452.247015413237
+21
+-693.583909707096
+31
+143.961322316008
+12
+452.247013852634
+22
+-710.823016652003
+32
+124.188674487802
+13
+452.247013852634
+23
+-710.823016652003
+33
+124.188674487802
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.247015413237
+20
+-693.583909707096
+30
+143.961322316008
+11
+450.471124298894
+21
+-713.308606140826
+31
+126.073163560098
+12
+450.471125884842
+22
+-695.789522350054
+32
+146.166934958744
+13
+450.471125884842
+23
+-695.789522350054
+33
+146.166934958744
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721745102502
+20
+-678.931345516719
+30
+167.953679054935
+11
+448.282012434797
+21
+-654.795098868987
+31
+180.78210913444
+12
+448.282017231929
+22
+-677.413444384727
+32
+165.951609244563
+13
+448.282017231929
+23
+-677.413444384727
+33
+165.951609244563
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282012434797
+20
+-654.795098868987
+30
+180.78210913444
+11
+445.721745102502
+21
+-678.931345516719
+31
+167.953679054935
+12
+445.721740244506
+22
+-656.026027291755
+32
+182.972342518915
+13
+445.721740244506
+23
+-656.026027291755
+33
+182.972342518915
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021343123663
+20
+-548.481290386566
+30
+174.800973253262
+11
+644.636215091063
+21
+-186.86272
+31
+181.426393854527
+12
+665.021343123663
+22
+-186.86272
+32
+174.800973253263
+13
+665.021343123663
+23
+-186.86272
+33
+174.800973253263
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636215091063
+20
+-186.86272
+30
+181.426393854527
+11
+665.021343123663
+21
+-548.481290386566
+31
+174.800973253262
+12
+644.636215091063
+22
+-548.592598441069
+32
+181.426393854527
+13
+644.636215091063
+23
+-548.592598441069
+33
+181.426393854527
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840108391474
+20
+-549.460721801574
+30
+233.09964686487
+11
+466.630399083827
+21
+-580.939676928926
+31
+234.582789982374
+12
+468.840126975903
+22
+-580.680624318909
+32
+232.050409880217
+13
+468.840126975903
+23
+-580.680624318909
+33
+232.050409880217
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630399083827
+20
+-580.939676928926
+30
+234.582789982374
+11
+468.840108391474
+21
+-549.460721801574
+31
+233.09964686487
+12
+466.630380370588
+22
+-549.503386674047
+32
+235.63929931572
+13
+466.630380370588
+23
+-549.503386674047
+33
+235.63929931572
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758754005207
+20
+-548.76324041817
+30
+191.585040951661
+11
+717.894045959123
+21
+-575.008661956696
+31
+176.604978855282
+12
+717.894030194972
+22
+-548.526532054241
+32
+177.494989005398
+13
+717.894030194972
+23
+-548.526532054241
+33
+177.494989005398
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894045959123
+20
+-575.008661956696
+30
+176.604978855282
+11
+696.758754005207
+21
+-548.76324041817
+31
+191.585040951661
+12
+696.758770484001
+22
+-576.445896872616
+32
+190.654683562835
+13
+696.758770484001
+23
+-576.445896872616
+33
+190.654683562835
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758770484001
+20
+-576.445896872616
+30
+190.654683562835
+11
+717.894057585081
+21
+-597.802053886837
+31
+172.685609040578
+12
+717.894045959123
+22
+-575.008661956696
+32
+176.604978855282
+13
+717.894045959123
+23
+-575.008661956696
+33
+176.604978855282
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894057585081
+20
+-597.802053886837
+30
+172.685609040578
+11
+696.758770484001
+21
+-576.445896872616
+31
+190.654683562835
+12
+696.758783079627
+22
+-601.140380260496
+32
+186.408417229293
+13
+696.758783079627
+23
+-601.140380260496
+33
+186.408417229293
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957344671825
+20
+-577.587813182298
+30
+201.817465714933
+11
+696.758783079627
+21
+-601.140380260496
+31
+186.408417229293
+12
+696.758770484001
+22
+-576.445896872616
+32
+190.654683562835
+13
+696.758770484001
+23
+-576.445896872616
+33
+190.654683562835
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758783079627
+20
+-601.140380260496
+30
+186.408417229293
+11
+673.957344671825
+21
+-577.587813182298
+31
+201.817465714933
+12
+673.957358037872
+22
+-603.792752711355
+32
+197.311473394829
+13
+673.957358037872
+23
+-603.792752711355
+33
+197.311473394829
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884086364505
+20
+-578.414663086699
+30
+209.900281060566
+11
+673.957358037872
+21
+-603.792752711355
+31
+197.311473394829
+12
+673.957344671825
+22
+-577.587813182298
+32
+201.817465714933
+13
+673.957344671825
+23
+-577.587813182298
+33
+201.817465714933
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957358037872
+20
+-603.792752711355
+30
+197.311473394829
+11
+649.884086364505
+21
+-578.414663086699
+31
+209.900281060566
+12
+649.884100288402
+22
+-605.713302275367
+32
+205.206224873295
+13
+649.884100288402
+23
+-605.713302275367
+33
+205.206224873295
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955307916438
+20
+-578.912147406784
+30
+214.763348941721
+11
+649.884100288402
+21
+-605.713302275367
+31
+205.206224873295
+12
+649.884086364505
+22
+-578.414663086699
+32
+209.900281060566
+13
+649.884086364505
+23
+-578.414663086699
+33
+209.900281060566
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884100288402
+20
+-605.713302275367
+30
+205.206224873295
+11
+624.955307916438
+21
+-578.912147406784
+31
+214.763348941721
+12
+624.955322175969
+22
+-606.868815812022
+32
+209.956143300585
+13
+624.955322175969
+23
+-606.868815812022
+33
+209.956143300585
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031422681501
+20
+-571.081702518113
+30
+41.9228372915384
+11
+764.959283764737
+21
+-561.475402706277
+31
+23.3578380028359
+12
+764.92809314571
+22
+-563.7670797619
+32
+23.357838002321
+13
+764.92809314571
+23
+-563.7670797619
+33
+23.357838002321
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.959283764737
+20
+-561.475402706277
+30
+23.3578380028359
+11
+764.031422681501
+21
+-571.081702518113
+31
+41.9228372915384
+12
+764.031420693374
+22
+-566.35608713258
+32
+43.4208517516957
+13
+764.031420693374
+23
+-566.35608713258
+33
+43.4208517516957
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332897960916
+20
+-669.009252539392
+30
+119.38666515078
+11
+665.021389999784
+21
+-658.447133448378
+31
+140.935603497775
+12
+684.332896682708
+22
+-652.814503888805
+32
+133.506322083721
+13
+684.332896682708
+23
+-652.814503888805
+33
+133.506322083721
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021389999784
+20
+-658.447133448378
+30
+140.935603497775
+11
+684.332897960916
+21
+-669.009252539392
+31
+119.38666515078
+12
+665.021391353748
+22
+-675.601700530057
+32
+125.979113140781
+13
+665.021391353748
+23
+-675.601700530057
+33
+125.979113140781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758754005207
+20
+-548.76324041817
+30
+191.585040951661
+11
+717.894030194972
+21
+-186.86272
+31
+177.494989005399
+12
+696.758754005207
+22
+-186.86272
+32
+191.585040951661
+13
+696.758754005207
+23
+-186.86272
+33
+191.585040951661
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894030194972
+20
+-186.86272
+30
+177.494989005399
+11
+696.758754005207
+21
+-548.76324041817
+31
+191.585040951661
+12
+717.894030194972
+22
+-548.526532054241
+32
+177.494989005398
+13
+717.894030194972
+23
+-548.526532054241
+33
+177.494989005398
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576407084801
+20
+-586.320946175488
+30
+80.6010436173693
+11
+760.20182098394
+21
+-571.352859264312
+31
+63.961061339529
+12
+760.201824130007
+22
+-578.830801190005
+32
+61.5905626376661
+13
+760.201824130007
+23
+-578.830801190005
+33
+61.5905626376661
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.20182098394
+20
+-571.352859264312
+30
+63.961061339529
+11
+753.576407084801
+21
+-586.320946175488
+31
+80.6010436173693
+12
+753.576402819491
+22
+-576.182653575586
+32
+83.8148703207571
+13
+753.576402819491
+23
+-576.182653575586
+33
+83.8148703207571
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332886599671
+20
+-615.441289762884
+30
+154.510351165083
+11
+665.021370191738
+21
+-597.163793012617
+31
+170.061810578218
+12
+684.332877982946
+22
+-594.96003923808
+32
+161.00288323661
+13
+684.332877982946
+23
+-594.96003923808
+33
+161.00288323661
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021370191738
+20
+-597.163793012617
+30
+170.061810578218
+11
+684.332886599671
+21
+-615.441289762884
+31
+154.510351165083
+12
+665.021379319153
+22
+-618.858911203396
+32
+163.184483899429
+13
+665.021379319153
+23
+-618.858911203396
+33
+163.184483899429
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955322175969
+20
+-606.868815812022
+30
+209.956143300585
+11
+649.884111397057
+21
+-632.11766596993
+31
+196.836072967405
+12
+649.884100288402
+22
+-605.713302275367
+32
+205.206224873295
+13
+649.884100288402
+23
+-605.713302275367
+33
+205.206224873295
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884111397057
+20
+-632.11766596993
+30
+196.836072967405
+11
+624.955322175969
+21
+-606.868815812022
+31
+209.956143300585
+12
+624.955333552396
+22
+-633.909652359165
+32
+201.384230256964
+13
+624.955333552396
+23
+-633.909652359165
+33
+201.384230256964
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335587191701
+20
+-762.351784924648
+30
+29.0815795342117
+11
+439.690579164597
+21
+-761.285715042239
+31
+23.357837856573
+12
+436.335583784501
+22
+-762.544148159569
+32
+23.3578378552417
+13
+436.335583784501
+23
+-762.544148159569
+33
+23.3578378552417
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690579164597
+20
+-761.285715042239
+30
+23.357837856573
+11
+436.335587191701
+21
+-762.351784924648
+31
+29.0815795342117
+12
+439.690582495428
+22
+-761.097663471809
+32
+28.9532865498045
+13
+439.690582495428
+23
+-761.097663471809
+33
+28.9532865498045
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717734453346
+20
+-766.149872257343
+30
+23.3578378661905
+11
+473.642038802113
+21
+-769.301079755069
+31
+29.7924413152051
+12
+473.642034971754
+22
+-769.517333598178
+32
+23.3578378654237
+13
+473.642034971754
+23
+-769.517333598178
+33
+23.3578378654237
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642038802113
+20
+-769.301079755069
+30
+29.7924413152051
+11
+473.717734453346
+21
+-766.149872257343
+31
+23.3578378661905
+12
+473.717738079349
+22
+-765.945155901366
+32
+29.449144968378
+13
+473.717738079349
+23
+-765.945155901366
+33
+29.449144968378
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021358751182
+20
+-723.541264381198
+30
+25.1113068905408
+11
+684.332866703488
+21
+-714.293584916115
+31
+23.3578379437967
+12
+665.021357707386
+22
+-723.600194881456
+32
+23.3578379356765
+13
+665.021357707386
+23
+-723.600194881456
+33
+23.3578379356765
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332866703488
+20
+-714.293584916115
+30
+23.3578379437967
+11
+665.021358751182
+21
+-723.541264381198
+31
+25.1113068905408
+12
+684.332867182503
+22
+-714.266540775895
+32
+24.1625326278822
+13
+684.332867182503
+23
+-714.266540775895
+33
+24.1625326278822
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636231054623
+20
+-730.147712824956
+30
+25.7871288899166
+11
+665.021357707386
+21
+-723.600194881456
+31
+23.3578379356765
+12
+644.636229608527
+22
+-730.229356318714
+32
+23.35783792781
+13
+644.636229608527
+23
+-730.229356318714
+33
+23.35783792781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021357707386
+20
+-723.600194881456
+30
+23.3578379356765
+11
+644.636231054623
+21
+-730.147712824956
+31
+25.7871288899166
+12
+665.021358751182
+22
+-723.541264381198
+32
+25.1113068905408
+13
+665.021358751182
+23
+-723.541264381198
+33
+25.1113068905408
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133267369982
+20
+-734.928077619115
+30
+26.2761627640122
+11
+623.546331756218
+21
+-734.061120907196
+31
+23.3578379203391
+12
+602.133265632776
+22
+-735.026156540265
+32
+23.357837913399
+13
+602.133265632776
+23
+-735.026156540265
+33
+23.357837913399
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546331756218
+20
+-734.061120907196
+30
+23.3578379203391
+11
+602.133267369982
+21
+-734.928077619115
+31
+26.2761627640122
+12
+623.546333434853
+22
+-733.96634875632
+32
+26.1777702748551
+13
+623.546333434853
+23
+-733.96634875632
+33
+26.1777702748551
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997666736503
+20
+-709.544681018119
+30
+23.3578379613892
+11
+717.894045959123
+21
+-726.227566234427
+31
+25.3860745623198
+12
+717.894044751764
+22
+-726.295731112839
+32
+23.3578379516926
+13
+717.894044751764
+23
+-726.295731112839
+33
+23.3578379516926
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894045959123
+20
+-726.227566234427
+30
+25.3860745623198
+11
+736.997666736503
+21
+-709.544681018119
+31
+23.3578379613892
+12
+736.997666927312
+22
+-709.533908392784
+32
+23.6783759511398
+13
+736.997666927312
+23
+-709.533908392784
+33
+23.6783759511398
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576402819491
+20
+-633.437457700021
+30
+26.5600661905556
+11
+757.969157364208
+21
+-620.27407578666
+31
+23.3578379876696
+12
+753.576401186168
+22
+-633.988087312601
+32
+23.3578379832645
+13
+753.576401186168
+23
+-633.988087312601
+33
+23.3578379832645
+70
+0
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101718395121
+20
+-772.841978102158
+30
+23.3578378645206
+11
+472.107168359226
+21
+-775.821269863314
+31
+30.4594290412997
+12
+472.107164131826
+22
+-776.05993979789
+32
+23.3578378634987
+13
+472.107164131826
+23
+-776.05993979789
+33
+23.3578378634987
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107168359226
+20
+-775.821269863314
+30
+30.4594290412997
+11
+473.101718395121
+21
+-772.841978102158
+31
+23.3578378645206
+12
+473.101722427237
+22
+-772.614333460954
+32
+30.1313729498036
+13
+473.101722427237
+23
+-772.614333460954
+33
+30.1313729498036
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957341929162
+20
+-751.594897963598
+30
+23.3578379323091
+11
+649.884086364505
+21
+-759.522868440055
+31
+28.7920756889693
+12
+649.884083129639
+22
+-759.7055020414
+32
+23.3578379229566
+13
+649.884083129639
+23
+-759.7055020414
+33
+23.3578379229566
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884086364505
+20
+-759.522868440055
+30
+28.7920756889693
+11
+673.957341929162
+21
+-751.594897963598
+31
+23.3578379323091
+12
+673.957344671825
+22
+-751.440053094339
+32
+27.9652257853831
+13
+673.957344671825
+23
+-751.440053094339
+33
+27.9652257853831
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683295385243
+20
+-791.4884708222
+30
+23.3578378536789
+11
+448.317739367628
+21
+-791.272422434329
+31
+32.0400273988949
+12
+448.317734199337
+22
+-791.564213042815
+32
+23.3578378526045
+13
+448.317734199337
+23
+-791.564213042815
+33
+23.3578378526045
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317739367628
+20
+-791.272422434329
+30
+32.0400273988949
+11
+451.683295385243
+21
+-791.4884708222
+31
+23.3578378536789
+12
+451.683300548936
+22
+-791.196939781596
+32
+32.0323039932388
+13
+451.683300548936
+23
+-791.196939781596
+33
+32.0323039932388
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997666927312
+20
+-709.533908392784
+30
+23.6783759511398
+11
+736.997666736503
+21
+-709.544681018119
+31
+23.3578379613892
+12
+739.751559375878
+22
+-706.400475394532
+32
+23.357837962948
+13
+739.751559375878
+23
+-706.400475394532
+33
+23.357837962948
+70
+0
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546333434853
+20
+-733.96634875632
+30
+26.1777702748551
+11
+644.636229608527
+21
+-730.229356318714
+31
+23.35783792781
+12
+623.546331756218
+22
+-734.061120907196
+32
+23.3578379203391
+13
+623.546331756218
+23
+-734.061120907196
+33
+23.3578379203391
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636229608527
+20
+-730.229356318714
+30
+23.35783792781
+11
+623.546333434853
+21
+-733.96634875632
+31
+26.1777702748551
+12
+644.636231054623
+22
+-730.147712824956
+32
+25.7871288899166
+13
+644.636231054623
+23
+-730.147712824956
+33
+25.7871288899166
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717752446486
+20
+-607.239369239249
+30
+211.479086426299
+11
+473.642065047928
+21
+-635.720877069339
+31
+205.981095949127
+12
+473.717763908762
+22
+-634.484263142475
+32
+202.842487443351
+13
+473.717763908762
+23
+-634.484263142475
+33
+202.842487443351
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642065047928
+20
+-635.720877069339
+30
+205.981095949127
+11
+473.717752446486
+21
+-607.239369239249
+31
+211.479086426299
+12
+473.642053400866
+22
+-608.036762247305
+32
+214.756927441262
+13
+473.642053400866
+23
+-608.036762247305
+33
+214.756927441262
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683338867278
+20
+-672.734452813075
+30
+212.702239692806
+11
+455.006112926336
+21
+-699.207898179883
+31
+194.697902416163
+12
+455.006107255299
+22
+-672.469112270075
+32
+212.230111445991
+13
+455.006107255299
+23
+-672.469112270075
+33
+212.230111445991
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006112926336
+20
+-699.207898179883
+30
+194.697902416163
+11
+451.683338867278
+21
+-672.734452813075
+31
+212.702239692806
+12
+451.683344551435
+22
+-699.535098538027
+32
+195.129470137406
+13
+451.683344551435
+23
+-699.535098538027
+33
+195.129470137406
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.31777769836
+20
+-672.771628457813
+30
+212.76838602076
+11
+451.683344551435
+21
+-699.535098538027
+31
+195.129470137406
+12
+451.683338867278
+22
+-672.734452813075
+32
+212.702239692806
+13
+451.683338867278
+23
+-672.734452813075
+33
+212.702239692806
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683344551435
+20
+-699.535098538027
+30
+195.129470137406
+11
+448.31777769836
+21
+-672.771628457813
+31
+212.76838602076
+12
+448.317783384355
+22
+-699.580940660874
+32
+195.189933989489
+13
+448.317783384355
+23
+-699.580940660874
+33
+195.189933989489
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690622484567
+20
+-702.296711761968
+30
+152.674124370004
+11
+442.839490392048
+21
+-719.276356082042
+31
+130.597708279963
+12
+439.690620823844
+22
+-720.64180705444
+32
+131.632946903436
+13
+439.690620823844
+23
+-720.64180705444
+33
+131.632946903436
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839490392048
+20
+-719.276356082042
+30
+130.597708279963
+11
+439.690622484567
+21
+-702.296711761968
+31
+152.674124370004
+12
+442.839492038848
+22
+-701.085065061495
+32
+151.462477669651
+13
+442.839492038848
+23
+-701.085065061495
+33
+151.462477669651
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839492038848
+20
+-701.085065061495
+30
+151.462477669651
+11
+445.721745102502
+21
+-717.576266444547
+31
+129.308758123214
+12
+442.839490392048
+22
+-719.276356082042
+32
+130.597708279963
+13
+442.839490392048
+23
+-719.276356082042
+33
+130.597708279963
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721745102502
+20
+-717.576266444547
+30
+129.308758123214
+11
+442.839492038848
+21
+-701.085065061495
+31
+151.462477669651
+12
+445.721746731967
+22
+-699.576473436421
+32
+149.95388604473
+13
+445.721746731967
+23
+-699.576473436421
+33
+149.95388604473
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838955869068
+20
+-703.742219504346
+30
+154.119632112235
+11
+436.335625756533
+21
+-721.646389233184
+31
+132.394587199654
+12
+432.838954191733
+22
+-722.270804730449
+32
+132.867998161508
+13
+432.838954191733
+23
+-722.270804730449
+33
+132.867998161508
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335625756533
+20
+-721.646389233184
+30
+132.394587199654
+11
+432.838955869068
+21
+-703.742219504346
+31
+154.119632112235
+12
+436.335627427501
+22
+-703.188137968552
+32
+153.565550576497
+13
+436.335627427501
+23
+-703.188137968552
+33
+153.565550576497
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546368087822
+20
+-683.011825308716
+30
+133.389237918693
+11
+644.636263548619
+21
+-695.850119169612
+31
+112.836707846937
+12
+623.546366648706
+22
+-698.908941954744
+32
+115.155805645761
+13
+623.546366648706
+23
+-698.908941954744
+33
+115.155805645761
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636263548619
+20
+-695.850119169612
+30
+112.836707846937
+11
+623.546368087822
+21
+-683.011825308716
+31
+133.389237918693
+12
+644.636264956545
+22
+-680.297547066858
+32
+130.674959677109
+13
+644.636264956545
+23
+-680.297547066858
+33
+130.674959677109
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222195872847
+20
+-549.595394709904
+30
+241.116069017578
+11
+461.269956337624
+21
+-581.352493258009
+31
+238.618284093782
+12
+461.269937419119
+22
+-549.571376162653
+32
+239.686382351024
+13
+461.269937419119
+23
+-549.571376162653
+33
+239.686382351024
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269956337624
+20
+-581.352493258009
+30
+238.618284093782
+11
+458.222195872847
+21
+-549.595394709904
+31
+241.116069017578
+12
+458.222214863865
+22
+-581.498326831209
+32
+240.043876806793
+13
+458.222214863865
+23
+-581.498326831209
+33
+240.043876806793
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.243015227678
+20
+-186.862719999999
+30
+2079.8653122236
+11
+0.112465277083137
+21
+-280.294079999999
+31
+2083.32536938894
+12
+0.112465277083556
+22
+-186.862719999999
+32
+2083.32536938894
+13
+0.112465277083556
+23
+-186.862719999999
+33
+2083.32536938894
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.112465277083137
+20
+-280.294079999999
+30
+2083.32536938894
+11
+35.243015227678
+21
+-186.862719999999
+31
+2079.8653122236
+12
+35.2430152276776
+22
+-280.294079999999
+32
+2079.8653122236
+13
+35.2430152276776
+23
+-280.294079999999
+33
+2079.8653122236
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.0235178451101
+20
+-280.294079999999
+30
+2069.61810878401
+11
+35.243015227678
+21
+-186.862719999999
+31
+2079.8653122236
+12
+69.0235178451106
+22
+-186.862719999999
+32
+2069.61810878401
+13
+69.0235178451106
+23
+-186.862719999999
+33
+2069.61810878401
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.243015227678
+20
+-186.862719999999
+30
+2079.8653122236
+11
+69.0235178451101
+21
+-280.294079999999
+31
+2069.61810878401
+12
+35.2430152276776
+22
+-280.294079999999
+32
+2079.8653122236
+13
+35.2430152276776
+23
+-280.294079999999
+33
+2079.8653122236
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+93.5308854426706
+21
+-280.294079999998
+31
+1315.22236639941
+12
+93.530885442671
+22
+-186.862719999998
+32
+1315.22236639941
+13
+93.530885442671
+23
+-186.862719999998
+33
+1315.22236639941
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.5308854426706
+20
+-280.294079999998
+30
+1315.22236639941
+11
+221.739809665471
+21
+-186.86272
+31
+1435.59863370269
+12
+221.73980966547
+22
+-280.29408
+32
+1435.59863370269
+13
+221.73980966547
+23
+-280.29408
+33
+1435.59863370269
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332867182503
+20
+-573.785120021053
+30
+164.643953396873
+11
+665.021343123663
+21
+-548.481290386566
+31
+174.800973253262
+12
+684.332852026746
+22
+-548.325028948197
+32
+165.499614915081
+13
+684.332852026746
+23
+-548.325028948197
+33
+165.499614915081
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021343123663
+20
+-548.481290386566
+30
+174.800973253262
+11
+684.332867182503
+21
+-573.785120021053
+31
+164.643953396873
+12
+665.021358751182
+22
+-574.733894284646
+32
+173.91867700208
+13
+665.021358751182
+23
+-574.733894284646
+33
+173.91867700208
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431275216977
+20
+-705.386140960936
+30
+120.066621251022
+11
+454.797689138238
+21
+-686.233268095701
+31
+136.610680705353
+12
+454.797687662105
+22
+-702.539296405596
+32
+117.908241171874
+13
+454.797687662105
+23
+-702.539296405596
+33
+117.908241171874
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797689138238
+20
+-686.233268095701
+30
+136.610680705353
+11
+454.431275216977
+21
+-705.386140960936
+31
+120.066621251022
+12
+454.431276722139
+22
+-688.759443912117
+32
+139.136856521515
+13
+454.431276722139
+23
+-688.759443912117
+33
+139.136856521515
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133302212101
+20
+-683.695422993079
+30
+134.072835602987
+11
+623.546366648706
+21
+-698.908941954744
+31
+115.155805645761
+12
+602.13330076513
+22
+-699.679312774979
+32
+115.739877602763
+13
+602.13330076513
+23
+-699.679312774979
+33
+115.739877602763
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546366648706
+20
+-698.908941954744
+30
+115.155805645761
+11
+602.133302212101
+21
+-683.695422993079
+31
+134.072835602987
+12
+623.546368087822
+22
+-683.011825308716
+32
+133.389237918693
+13
+623.546368087822
+23
+-683.011825308716
+33
+133.389237918693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281993692064
+20
+-604.584376828467
+30
+200.565167970899
+11
+445.721707495526
+21
+-578.184382747044
+31
+207.648051313885
+12
+448.281980096118
+22
+-577.92870502396
+32
+205.148664616833
+13
+448.281980096118
+23
+-577.92870502396
+33
+205.148664616833
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721707495526
+20
+-578.184382747044
+30
+207.648051313885
+11
+448.281993692064
+21
+-604.584376828467
+31
+200.565167970899
+12
+445.721721263973
+22
+-605.178251275471
+32
+203.006401057676
+13
+445.721721263973
+23
+-605.178251275471
+33
+203.006401057676
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602131038669
+20
+-607.239310377804
+30
+211.479085673936
+11
+624.955333552396
+21
+-633.909652359165
+31
+201.384230256964
+12
+624.955322175969
+22
+-606.868815812022
+32
+209.956143300585
+13
+624.955322175969
+23
+-606.868815812022
+33
+209.956143300585
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955333552396
+20
+-633.909652359165
+30
+201.384230256964
+11
+599.602131038669
+21
+-607.239310377804
+31
+211.479085673936
+12
+599.60214250095
+22
+-634.484214570593
+32
+202.842483429208
+13
+599.60214250095
+23
+-634.484214570593
+33
+202.842483429208
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007215701535
+20
+-572.529418663124
+30
+45.597263875134
+11
+787.130189104003
+21
+-589.736090634929
+31
+65.0204702834338
+12
+792.007217306199
+22
+-577.494024343961
+32
+43.2377297488181
+13
+792.007217306199
+23
+-577.494024343961
+33
+43.2377297488181
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130189104003
+20
+-589.736090634929
+30
+65.0204702834338
+11
+792.007215701535
+21
+-572.529418663124
+31
+45.597263875134
+12
+787.130186503031
+22
+-581.689044301674
+32
+68.844999694228
+13
+787.130186503031
+23
+-581.689044301674
+33
+68.844999694228
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130186503031
+20
+-581.689044301674
+30
+68.844999694228
+11
+779.024166993188
+21
+-601.558027793705
+31
+86.0556585976989
+12
+787.130189104003
+22
+-589.736090634929
+32
+65.0204702834338
+13
+787.130189104003
+23
+-589.736090634929
+33
+65.0204702834338
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024166993188
+20
+-601.558027793705
+30
+86.0556585976989
+11
+787.130186503031
+21
+-581.689044301674
+31
+68.844999694228
+12
+779.024163430099
+22
+-590.534326018981
+32
+91.2949066282494
+13
+779.024163430099
+23
+-590.534326018981
+33
+91.2949066282494
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363081916203
+20
+-571.142011532184
+30
+138.806193017976
+11
+732.466031085639
+21
+-547.618544534505
+31
+123.445905477124
+12
+732.466044108445
+22
+-569.495501821011
+32
+122.710665747149
+13
+732.466044108445
+23
+-569.495501821011
+33
+122.710665747149
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466031085639
+20
+-547.618544534505
+30
+123.445905477124
+11
+718.363081916203
+21
+-571.142011532184
+31
+138.806193017976
+12
+718.363068074693
+22
+-547.889717752797
+32
+139.587654990762
+13
+718.363068074693
+23
+-547.889717752797
+33
+139.587654990762
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466044108445
+20
+-569.495501821011
+30
+122.710665747149
+11
+744.275027999012
+21
+-547.318028491407
+31
+105.557438942816
+12
+744.275040114523
+22
+-567.670823535761
+32
+104.873423184286
+13
+744.275040114523
+23
+-567.670823535761
+33
+104.873423184286
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275027999012
+20
+-547.318028491407
+30
+105.557438942816
+11
+732.466044108445
+21
+-569.495501821011
+31
+122.710665747149
+12
+732.466031085639
+22
+-547.618544534505
+32
+123.445905477124
+13
+732.466031085639
+23
+-547.618544534505
+33
+123.445905477124
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275040114523
+20
+-567.670823535761
+30
+104.873423184286
+11
+753.576386337194
+21
+-546.993607173192
+31
+86.2459300397311
+12
+753.576397473233
+22
+-565.700992480648
+32
+85.6172131326287
+13
+753.576397473233
+23
+-565.700992480648
+33
+85.6172131326287
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576386337194
+20
+-546.993607173192
+30
+86.2459300397311
+11
+744.275040114523
+21
+-567.670823535761
+31
+104.873423184286
+12
+744.275027999012
+22
+-547.318028491407
+32
+105.557438942816
+13
+744.275027999012
+23
+-547.318028491407
+33
+105.557438942816
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576397473233
+20
+-565.700992480648
+30
+85.6172131326287
+11
+760.201806938459
+21
+-546.651150672583
+31
+65.8608020071314
+12
+760.201817040574
+22
+-563.621650860098
+32
+65.2904582517363
+13
+760.201817040574
+23
+-563.621650860098
+33
+65.2904582517363
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201806938459
+20
+-546.651150672583
+30
+65.8608020071314
+11
+753.576397473233
+21
+-565.700992480648
+31
+85.6172131326287
+12
+753.576386337194
+22
+-546.993607173192
+32
+86.2459300397311
+13
+753.576386337194
+23
+-546.993607173192
+33
+86.2459300397311
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007218281129
+20
+-582.09079684746
+30
+40.22369700007
+11
+787.130191214298
+21
+-603.902540579901
+31
+54.279953197846
+12
+792.00721860814
+22
+-586.233981212786
+32
+36.6113938325108
+13
+792.00721860814
+23
+-586.233981212786
+33
+36.6113938325108
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130191214298
+20
+-603.902540579901
+30
+54.279953197846
+11
+792.007218281129
+21
+-582.09079684746
+31
+40.22369700007
+12
+787.130190684252
+22
+-597.186922321698
+32
+60.1350749996264
+13
+787.130190684252
+23
+-597.186922321698
+33
+60.1350749996264
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267778397118
+20
+-703.948312537967
+30
+154.325725145835
+11
+0.016303397997907
+21
+-682.666774623337
+31
+172.880520888553
+12
+429.267776717416
+22
+-682.666673022429
+32
+172.880471218973
+13
+429.267776717416
+23
+-682.666673022429
+33
+172.880471218973
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.016303397997907
+20
+-682.666774623337
+30
+172.880520888553
+11
+429.267778397118
+21
+-703.948312537967
+31
+154.325725145835
+12
+0.0163050776986444
+22
+-703.948386395801
+32
+154.325799003669
+13
+0.0163050776986444
+23
+-703.948386395801
+33
+154.325799003669
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838955869068
+20
+-703.742219504346
+30
+154.119632112235
+11
+429.267776717416
+21
+-682.666673022429
+31
+172.880471218973
+12
+432.838954191733
+22
+-682.490585555484
+32
+172.648217340479
+13
+432.838954191733
+23
+-682.490585555484
+33
+172.648217340479
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267776717416
+20
+-682.666673022429
+30
+172.880471218973
+11
+432.838955869068
+21
+-703.742219504346
+31
+154.119632112235
+12
+429.267778397118
+22
+-703.948312537967
+32
+154.325725145835
+13
+429.267778397118
+23
+-703.948312537967
+33
+154.325725145835
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335627427501
+20
+-703.188137968552
+30
+153.565550576497
+11
+432.838954191733
+21
+-682.490585555484
+31
+172.648217340479
+12
+436.335625756533
+22
+-682.017174593568
+32
+172.023801843262
+13
+436.335625756533
+23
+-682.017174593568
+33
+172.023801843262
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838954191733
+20
+-682.490585555484
+30
+172.648217340479
+11
+436.335627427501
+21
+-703.188137968552
+31
+153.565550576497
+12
+432.838955869068
+22
+-703.742219504346
+32
+154.119632112235
+13
+432.838955869068
+23
+-703.742219504346
+33
+154.119632112235
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090727919739
+20
+-549.540509167097
+30
+237.849027336606
+11
+466.630399083827
+21
+-580.939676928926
+31
+234.582789982374
+12
+466.630380370588
+22
+-549.503386674047
+32
+235.63929931572
+13
+466.630380370588
+23
+-549.503386674047
+33
+235.63929931572
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630399083827
+20
+-580.939676928926
+30
+234.582789982374
+11
+464.090727919739
+21
+-549.540509167097
+31
+237.849027336606
+12
+464.090746745054
+22
+-581.165076540648
+32
+236.786190394896
+13
+464.090746745054
+23
+-581.165076540648
+33
+236.786190394896
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281980096118
+20
+-577.92870502396
+30
+205.148664616833
+11
+445.721690152324
+21
+-549.049610517709
+31
+208.627211339945
+12
+448.281962880048
+22
+-549.007501396503
+32
+206.120647039576
+13
+448.281962880048
+23
+-549.007501396503
+33
+206.120647039576
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721690152324
+20
+-549.049610517709
+30
+208.627211339945
+11
+448.281980096118
+21
+-577.92870502396
+31
+205.148664616833
+12
+445.721707495526
+22
+-578.184382747044
+32
+207.648051313885
+13
+445.721707495526
+23
+-578.184382747044
+33
+207.648051313885
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281980096118
+20
+-577.92870502396
+30
+205.148664616833
+11
+450.471070624061
+21
+-548.959849908146
+31
+203.284158309243
+12
+450.471087696265
+22
+-577.639374325348
+32
+202.320298229792
+13
+450.471087696265
+23
+-577.639374325348
+33
+202.320298229792
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471070624061
+20
+-548.959849908146
+30
+203.284158309243
+11
+448.281980096118
+21
+-577.92870502396
+31
+205.148664616833
+12
+448.281962880048
+22
+-549.007501396503
+32
+206.120647039576
+13
+448.281962880048
+23
+-549.007501396503
+33
+206.120647039576
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471087696265
+20
+-577.639374325348
+30
+202.320298229792
+11
+452.246960920592
+21
+-548.907571431286
+31
+200.172233713933
+12
+452.246977834961
+22
+-577.321948654809
+32
+199.217284688636
+13
+452.246977834961
+23
+-577.321948654809
+33
+199.217284688636
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246960920592
+20
+-548.907571431286
+30
+200.172233713933
+11
+450.471087696265
+21
+-577.639374325348
+31
+202.320298229792
+12
+450.471070624061
+22
+-548.959849908146
+32
+203.284158309243
+13
+450.471070624061
+23
+-548.959849908146
+33
+203.284158309243
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246977834961
+20
+-577.321948654809
+30
+199.217284688636
+11
+453.575519157163
+21
+-548.851670228397
+31
+196.84465290436
+12
+453.575535902759
+22
+-576.982525716554
+32
+195.89923246393
+13
+453.575535902759
+23
+-576.982525716554
+33
+195.89923246393
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575519157163
+20
+-548.851670228397
+30
+196.84465290436
+11
+452.246977834961
+21
+-577.321948654809
+31
+199.217284688636
+12
+452.246960920592
+22
+-548.907571431286
+32
+200.172233713933
+13
+452.246960920592
+23
+-548.907571431286
+33
+200.172233713933
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575535902759
+20
+-576.982525716554
+30
+195.89923246393
+11
+454.431223909685
+21
+-548.793220154026
+31
+193.36533825795
+12
+454.431240478811
+22
+-576.627625779333
+32
+192.429880890276
+13
+454.431240478811
+23
+-576.627625779333
+33
+192.429880890276
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431223909685
+20
+-548.793220154026
+30
+193.36533825795
+11
+453.575535902759
+21
+-576.982525716554
+31
+195.89923246393
+12
+453.575519157163
+22
+-548.851670228397
+32
+196.84465290436
+13
+453.575519157163
+23
+-548.851670228397
+33
+196.84465290436
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.73928877638
+20
+-638.371732863863
+30
+114.456713513376
+11
+736.997696774917
+21
+-665.645302851503
+31
+116.022715463229
+12
+753.739289860341
+22
+-652.105388357143
+32
+102.482800970232
+13
+753.739289860341
+23
+-652.105388357143
+33
+102.482800970232
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997696774917
+20
+-665.645302851503
+30
+116.022715463229
+11
+753.73928877638
+21
+-638.371732863863
+31
+114.456713513376
+12
+736.997695535365
+22
+-649.940320006495
+32
+129.715362054641
+13
+736.997695535365
+23
+-649.940320006495
+33
+129.715362054641
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.10170430358
+20
+-186.86272
+30
+224.014968929072
+11
+472.107150072447
+21
+-549.362133988305
+31
+227.231114817978
+12
+473.10170430358
+22
+-549.308104906071
+32
+224.014968929071
+13
+473.10170430358
+23
+-549.308104906071
+33
+224.014968929071
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107150072447
+20
+-549.362133988305
+30
+227.231114817978
+11
+473.10170430358
+21
+-186.86272
+31
+224.014968929072
+12
+472.107150072447
+22
+-186.86272
+32
+227.231114817978
+13
+472.107150072447
+23
+-186.86272
+33
+227.231114817978
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246991021541
+20
+-603.175034087969
+30
+194.771794391524
+11
+453.575535902759
+21
+-576.982525716554
+31
+195.89923246393
+12
+453.575548860337
+22
+-602.386639077964
+32
+191.530943822063
+13
+453.575548860337
+23
+-602.386639077964
+33
+191.530943822063
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575535902759
+20
+-576.982525716554
+30
+195.89923246393
+11
+452.246991021541
+21
+-603.175034087969
+31
+194.771794391524
+12
+452.246977834961
+22
+-577.321948654809
+32
+199.217284688636
+13
+452.246977834961
+23
+-577.321948654809
+33
+199.217284688636
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335569590044
+20
+-549.135217804424
+30
+213.722949367545
+11
+432.838897838644
+21
+-186.86272
+31
+214.504708726405
+12
+436.335569590044
+22
+-186.86272
+32
+213.722949367545
+13
+436.335569590044
+23
+-186.86272
+33
+213.722949367545
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838897838644
+20
+-186.86272
+30
+214.504708726405
+11
+436.335569590044
+21
+-549.135217804424
+31
+213.722949367545
+12
+432.838897838644
+22
+-549.148351803013
+32
+214.504708726405
+13
+432.838897838644
+23
+-549.148351803013
+33
+214.504708726405
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.543158239603
+20
+-559.33210911257
+30
+23.3578380122893
+11
+792.007213497075
+21
+-567.289596867332
+31
+47.2582811561368
+12
+793.520757722035
+22
+-561.475389395115
+32
+23.3578380118087
+13
+793.520757722035
+23
+-561.475389395115
+33
+23.3578380118087
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007213497075
+20
+-567.289596867332
+30
+47.2582811561368
+11
+793.543158239603
+21
+-559.33210911257
+31
+23.3578380122893
+12
+792.007210733943
+22
+-561.872310305502
+32
+48.1897945304127
+13
+792.007210733943
+23
+-561.872310305502
+33
+48.1897945304127
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007210733943
+20
+-561.872310305502
+30
+48.1897945304127
+11
+787.130182929858
+21
+-573.195904769668
+31
+71.5373148305873
+12
+792.007213497075
+22
+-567.289596867332
+32
+47.2582811561368
+13
+792.007213497075
+23
+-567.289596867332
+33
+47.2582811561368
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130182929858
+20
+-573.195904769668
+30
+71.5373148305873
+11
+792.007210733943
+21
+-561.872310305502
+31
+48.1897945304127
+12
+787.130178451143
+22
+-564.415115565838
+32
+73.0471892828083
+13
+787.130178451143
+23
+-564.415115565838
+33
+73.0471892828083
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130178451143
+20
+-564.415115565838
+30
+73.0471892828083
+11
+779.024158535186
+21
+-578.899518233046
+31
+94.9831268667919
+12
+787.130182929858
+22
+-573.195904769668
+32
+71.5373148305873
+13
+787.130182929858
+23
+-573.195904769668
+33
+71.5373148305873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024158535186
+20
+-578.899518233046
+30
+94.9831268667919
+11
+787.130178451143
+21
+-564.415115565838
+31
+73.0471892828083
+12
+779.024152399766
+22
+-566.87065726704
+32
+97.0515138238504
+13
+779.024152399766
+23
+-566.87065726704
+33
+97.0515138238504
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+779.024152399766
+20
+-566.87065726704
+30
+97.0515138238504
+11
+767.82932233817
+21
+-584.301801471681
+31
+117.190255690543
+12
+779.024158535186
+22
+-578.899518233046
+32
+94.9831268667919
+13
+779.024158535186
+23
+-578.899518233046
+33
+94.9831268667919
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.82932233817
+20
+-584.301801471681
+30
+117.190255690543
+11
+779.024152399766
+21
+-566.87065726704
+31
+97.0515138238504
+12
+767.82931463357
+22
+-569.196470349584
+32
+119.787647909415
+13
+767.82931463357
+23
+-569.196470349584
+33
+119.787647909415
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884068906774
+20
+-549.087494127121
+30
+210.885907146698
+11
+673.957344671825
+21
+-577.587813182298
+31
+201.817465714933
+12
+673.957327625231
+22
+-548.951311917762
+32
+202.779879874335
+13
+673.957327625231
+23
+-548.951311917762
+33
+202.779879874335
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957344671825
+20
+-577.587813182298
+30
+201.817465714933
+11
+649.884068906774
+21
+-549.087494127121
+31
+210.885907146698
+12
+649.884086364505
+22
+-578.414663086699
+32
+209.900281060566
+13
+649.884086364505
+23
+-578.414663086699
+33
+209.900281060566
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955290211342
+20
+-549.169431970937
+30
+215.762940693873
+11
+649.884086364505
+21
+-578.414663086699
+31
+209.900281060566
+12
+649.884068906774
+22
+-549.087494127121
+32
+210.885907146698
+13
+649.884068906774
+23
+-549.087494127121
+33
+210.885907146698
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884086364505
+20
+-578.414663086699
+30
+209.900281060566
+11
+624.955290211342
+21
+-549.169431970937
+31
+215.762940693873
+12
+624.955307916438
+22
+-578.912147406784
+32
+214.763348941721
+13
+624.955307916438
+23
+-578.912147406784
+33
+214.763348941721
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+767.829335677824
+20
+-625.572837100386
+30
+97.5753208387769
+11
+753.739289860341
+21
+-652.105388357143
+31
+102.482800970232
+12
+767.829336589646
+22
+-637.125515922866
+32
+87.5029285374647
+13
+767.829336589646
+23
+-637.125515922866
+33
+87.5029285374647
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.739289860341
+20
+-652.105388357143
+30
+102.482800970232
+11
+767.829335677824
+21
+-625.572837100386
+31
+97.5753208387769
+12
+753.73928877638
+22
+-638.371732863863
+32
+114.456713513376
+13
+753.73928877638
+23
+-638.371732863863
+33
+114.456713513376
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690564957562
+20
+-549.114088023756
+30
+212.46522637891
+11
+436.335569590044
+21
+-186.86272
+31
+213.722949367545
+12
+439.690564957562
+22
+-186.86272
+32
+212.46522637891
+13
+439.690564957562
+23
+-186.86272
+33
+212.46522637891
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335569590044
+20
+-186.86272
+30
+213.722949367545
+11
+439.690564957562
+21
+-549.114088023756
+31
+212.46522637891
+12
+436.335569590044
+22
+-549.135217804424
+32
+213.722949367545
+13
+436.335569590044
+23
+-549.135217804424
+33
+213.722949367545
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.520757722035
+20
+-561.475389395115
+30
+23.3578380118087
+11
+792.007215701535
+21
+-572.529418663124
+31
+45.597263875134
+12
+793.478047748674
+22
+-563.767069108265
+32
+23.3578380112902
+13
+793.478047748674
+23
+-563.767069108265
+33
+23.3578380112902
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007215701535
+20
+-572.529418663124
+30
+45.597263875134
+11
+793.520757722035
+21
+-561.475389395115
+31
+23.3578380118087
+12
+792.007213497075
+22
+-567.289596867332
+32
+47.2582811561368
+13
+792.007213497075
+23
+-567.289596867332
+33
+47.2582811561368
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.2381055728787
+20
+-186.86272
+30
+1394.27106395937
+11
+18.7226850109544
+21
+-186.862719999999
+31
+1315.22236639941
+12
+0.112465277083555
+22
+-186.86272
+32
+1390.81149035281
+13
+0.112465277083555
+23
+-186.86272
+33
+1390.81149035281
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109544
+20
+-186.862719999999
+30
+1315.22236639941
+11
+35.2381055728787
+21
+-186.86272
+31
+1394.27106395937
+12
+56.1267852268127
+22
+-186.862719999999
+32
+1315.22236639941
+13
+56.1267852268127
+23
+-186.862719999999
+33
+1315.22236639941
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+56.1267852268127
+20
+-186.862719999999
+30
+1315.22236639941
+11
+35.2381055728787
+21
+-186.86272
+31
+1394.27106395937
+12
+69.0138872107926
+22
+-186.86272
+32
+1404.51683530547
+13
+69.0138872107926
+23
+-186.86272
+33
+1404.51683530547
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+56.1267852268127
+20
+-186.862719999999
+30
+1315.22236639941
+11
+69.0138872107926
+21
+-186.86272
+31
+1404.51683530547
+12
+56.1267852268127
+22
+-186.862719999999
+32
+268.426375476513
+13
+56.1267852268127
+23
+-186.862719999999
+33
+268.426375476513
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-186.86272
+30
+1753.52666880208
+11
+100.141825844156
+21
+-186.862719999999
+31
+1720.56410006505
+12
+69.3272894690774
+22
+-186.86272
+32
+1737.04848268553
+13
+69.3272894690774
+23
+-186.86272
+33
+1737.04848268553
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844156
+20
+-186.862719999999
+30
+1720.56410006505
+11
+100.155807358117
+21
+-186.86272
+31
+1753.52666880208
+12
+127.425692248039
+22
+-186.862719999999
+32
+1698.17280957558
+13
+127.425692248039
+23
+-186.862719999999
+33
+1698.17280957558
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.425692248039
+20
+-186.862719999999
+30
+1698.17280957558
+11
+100.155807358117
+21
+-186.86272
+31
+1753.52666880208
+12
+127.443487339903
+22
+-186.86272
+32
+1775.92108901406
+13
+127.443487339903
+23
+-186.86272
+33
+1775.92108901406
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.425692248039
+20
+-186.862719999999
+30
+1698.17280957558
+11
+127.443487339903
+21
+-186.86272
+31
+1775.92108901406
+12
+149.816982737509
+22
+-186.86272
+32
+1670.8889431717
+13
+149.816982737509
+23
+-186.86272
+33
+1670.8889431717
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.816982737509
+20
+-186.86272
+30
+1670.8889431717
+11
+127.443487339903
+21
+-186.86272
+31
+1775.92108901406
+12
+149.837907551873
+22
+-186.86272
+32
+1803.20876899584
+13
+149.837907551873
+23
+-186.86272
+33
+1803.20876899584
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.816982737509
+20
+-186.86272
+30
+1670.8889431717
+11
+149.837907551873
+21
+-186.86272
+31
+1803.20876899584
+12
+166.455212576235
+22
+-186.86272
+32
+1639.76100453833
+13
+166.455212576235
+23
+-186.86272
+33
+1639.76100453833
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.455212576235
+20
+-186.86272
+30
+1639.76100453833
+11
+149.837907551873
+21
+-186.86272
+31
+1803.20876899584
+12
+166.47846298422
+22
+-186.86272
+32
+1834.34105850885
+13
+166.47846298422
+23
+-186.86272
+33
+1834.34105850885
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.455212576235
+20
+-186.86272
+30
+1639.76100453833
+11
+166.47846298422
+21
+-186.86272
+31
+1834.34105850885
+12
+176.700983922342
+22
+-186.86272
+32
+1605.98522290042
+13
+176.700983922342
+23
+-186.86272
+33
+1605.98522290042
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.700983922342
+20
+-186.86272
+30
+1605.98522290042
+11
+166.47846298422
+21
+-186.86272
+31
+1834.34105850885
+12
+176.725666423807
+22
+-186.86272
+32
+1868.12156112628
+13
+176.725666423807
+23
+-186.86272
+33
+1868.12156112628
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.700983922342
+20
+-186.86272
+30
+1605.98522290042
+11
+176.725666423807
+21
+-186.86272
+31
+1868.12156112628
+12
+180.160557528894
+22
+-186.86272
+32
+1570.85958260462
+13
+180.160557528894
+23
+-186.86272
+33
+1570.85958260462
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+180.160557528894
+20
+-186.86272
+30
+1570.85958260462
+11
+176.725666423807
+21
+-186.86272
+31
+1868.12156112628
+12
+180.18572358915
+22
+-186.86272
+32
+1903.25211107687
+13
+180.18572358915
+23
+-186.86272
+33
+1903.25211107687
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.652471048303
+20
+-186.862719999999
+30
+2499.20806403607
+11
+46.8683973137003
+21
+-186.862719999999
+31
+2125.50255258978
+12
+46.8683973137003
+22
+-186.862719999999
+32
+2499.20806403607
+13
+46.8683973137003
+23
+-186.862719999999
+33
+2499.20806403607
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973137003
+20
+-186.862719999999
+30
+2125.50255258978
+11
+93.652471048303
+21
+-186.862719999999
+31
+2499.20806403607
+12
+69.0235178451106
+22
+-186.862719999999
+32
+2069.61810878401
+13
+69.0235178451106
+23
+-186.862719999999
+33
+2069.61810878401
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.0235178451106
+20
+-186.862719999999
+30
+2069.61810878401
+11
+93.652471048303
+21
+-186.862719999999
+31
+2499.20806403607
+12
+100.155807358117
+22
+-186.862719999999
+32
+2052.97755335166
+13
+100.155807358117
+23
+-186.862719999999
+33
+2052.97755335166
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-186.862719999999
+30
+2052.97755335166
+11
+93.652471048303
+21
+-186.862719999999
+31
+2499.20806403607
+12
+123.089851596878
+22
+-186.862719999999
+32
+2224.76609686633
+13
+123.089851596878
+23
+-186.862719999999
+33
+2224.76609686633
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-186.862719999999
+30
+2052.97755335166
+11
+123.089851596878
+21
+-186.862719999999
+31
+2224.76609686633
+12
+127.443487339903
+22
+-186.86272
+32
+2030.58313313969
+13
+127.443487339903
+23
+-186.86272
+33
+2030.58313313969
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339903
+20
+-186.86272
+30
+2030.58313313969
+11
+123.089851596878
+21
+-186.862719999999
+31
+2224.76609686633
+12
+221.739809665471
+22
+-186.86272
+32
+2013.4439613934
+13
+221.739809665471
+23
+-186.86272
+33
+2013.4439613934
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+127.443487339903
+20
+-186.86272
+30
+2030.58313313969
+11
+221.739809665471
+21
+-186.86272
+31
+2013.4439613934
+12
+149.837907551873
+22
+-186.86272
+32
+2003.29545315791
+13
+149.837907551873
+23
+-186.86272
+33
+2003.29545315791
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.837907551873
+20
+-186.86272
+30
+2003.29545315791
+11
+221.739809665471
+21
+-186.86272
+31
+2013.4439613934
+12
+166.47846298422
+22
+-186.86272
+32
+1972.1631636449
+13
+166.47846298422
+23
+-186.86272
+33
+1972.1631636449
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.47846298422
+20
+-186.86272
+30
+1972.1631636449
+11
+221.739809665471
+21
+-186.86272
+31
+2013.4439613934
+12
+176.725666423807
+22
+-186.86272
+32
+1938.38266102747
+13
+176.725666423807
+23
+-186.86272
+33
+1938.38266102747
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.725666423807
+20
+-186.86272
+30
+1938.38266102747
+11
+221.739809665471
+21
+-186.86272
+31
+2013.4439613934
+12
+180.18572358915
+22
+-186.86272
+32
+1903.25211107687
+13
+180.18572358915
+23
+-186.86272
+33
+1903.25211107687
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844157
+20
+-186.86272
+30
+1421.1550651442
+11
+93.530885442671
+21
+-186.862719999998
+31
+1315.22236639941
+12
+69.0138872107926
+22
+-186.86272
+32
+1404.51683530547
+13
+69.0138872107926
+23
+-186.86272
+33
+1404.51683530547
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.530885442671
+20
+-186.862719999998
+30
+1315.22236639941
+11
+100.141825844157
+21
+-186.86272
+31
+1421.1550651442
+12
+221.739809665471
+22
+-186.86272
+32
+1435.59863370269
+13
+221.739809665471
+23
+-186.86272
+33
+1435.59863370269
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+100.141825844157
+21
+-186.86272
+31
+1421.1550651442
+12
+127.42569224804
+22
+-186.86272
+32
+1443.54635563367
+13
+127.42569224804
+23
+-186.86272
+33
+1443.54635563367
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+127.42569224804
+21
+-186.86272
+31
+1443.54635563367
+12
+149.816982737509
+22
+-186.86272
+32
+1470.83022203755
+13
+149.816982737509
+23
+-186.86272
+33
+1470.83022203755
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+149.816982737509
+21
+-186.86272
+31
+1470.83022203755
+12
+166.455212576235
+22
+-186.86272
+32
+1501.95816067091
+13
+166.455212576235
+23
+-186.86272
+33
+1501.95816067091
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+166.455212576235
+21
+-186.86272
+31
+1501.95816067091
+12
+176.700983922342
+22
+-186.86272
+32
+1535.73394230883
+13
+176.700983922342
+23
+-186.86272
+33
+1535.73394230883
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+176.700983922342
+21
+-186.86272
+31
+1535.73394230883
+12
+180.160557528894
+22
+-186.86272
+32
+1570.85958260462
+13
+180.160557528894
+23
+-186.86272
+33
+1570.85958260462
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+180.160557528894
+21
+-186.86272
+31
+1570.85958260462
+12
+180.18572358915
+22
+-186.86272
+32
+1903.25211107687
+13
+180.18572358915
+23
+-186.86272
+33
+1903.25211107687
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+221.739809665471
+20
+-186.86272
+30
+1435.59863370269
+11
+180.18572358915
+21
+-186.86272
+31
+1903.25211107687
+12
+221.739809665471
+22
+-186.86272
+32
+2013.4439613934
+13
+221.739809665471
+23
+-186.86272
+33
+2013.4439613934
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162469754877819
+20
+-186.86272
+30
+214.795486963908
+11
+93.530885442671
+21
+-186.862719999999
+31
+242.726639240051
+12
+429.26772029492
+22
+-186.86272
+32
+214.795486963908
+13
+429.26772029492
+23
+-186.86272
+33
+214.795486963908
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.530885442671
+20
+-186.862719999999
+30
+242.726639240051
+11
+0.0162469754877819
+21
+-186.86272
+31
+214.795486963908
+12
+18.7226850109544
+22
+-186.862719999999
+32
+268.426375476513
+13
+18.7226850109544
+23
+-186.862719999999
+33
+268.426375476513
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109544
+20
+-186.862719999999
+30
+268.426375476513
+11
+0.0162469754877819
+21
+-186.86272
+31
+214.795486963908
+12
+0.112465277083555
+22
+-186.86272
+32
+1390.81149035281
+13
+0.112465277083555
+23
+-186.86272
+33
+1390.81149035281
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109544
+20
+-186.862719999999
+30
+268.426375476513
+11
+0.112465277083555
+21
+-186.86272
+31
+1390.81149035281
+12
+18.7226850109544
+22
+-186.862719999999
+32
+1315.22236639941
+13
+18.7226850109544
+23
+-186.862719999999
+33
+1315.22236639941
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.530885442671
+20
+-186.862719999999
+30
+242.726639240051
+11
+18.7226850109544
+21
+-186.862719999999
+31
+268.426375476513
+12
+56.1267852268127
+22
+-186.862719999999
+32
+268.426375476513
+13
+56.1267852268127
+23
+-186.862719999999
+33
+268.426375476513
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.530885442671
+20
+-186.862719999999
+30
+242.726639240051
+11
+56.1267852268127
+21
+-186.862719999999
+31
+268.426375476513
+12
+69.0138872107926
+22
+-186.86272
+32
+1404.51683530547
+13
+69.0138872107926
+23
+-186.86272
+33
+1404.51683530547
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+93.530885442671
+20
+-186.862719999999
+30
+242.726639240051
+11
+69.0138872107926
+21
+-186.86272
+31
+1404.51683530547
+12
+93.530885442671
+22
+-186.862719999998
+32
+1315.22236639941
+13
+93.530885442671
+23
+-186.862719999998
+33
+1315.22236639941
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.26772029492
+20
+-186.86272
+30
+214.795486963908
+11
+93.530885442671
+21
+-186.862719999999
+31
+242.726639240051
+12
+448.31772029492
+22
+-186.86272
+32
+242.726639240051
+13
+448.31772029492
+23
+-186.86272
+33
+242.726639240051
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.26772029492
+20
+-186.86272
+30
+214.795486963908
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+432.838897838644
+22
+-186.86272
+32
+214.504708726405
+13
+432.838897838644
+23
+-186.86272
+33
+214.504708726405
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838897838644
+20
+-186.86272
+30
+214.504708726405
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+436.335569590044
+22
+-186.86272
+32
+213.722949367545
+13
+436.335569590044
+23
+-186.86272
+33
+213.722949367545
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335569590044
+20
+-186.86272
+30
+213.722949367545
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+439.690564957562
+22
+-186.86272
+32
+212.46522637891
+13
+439.690564957562
+23
+-186.86272
+33
+212.46522637891
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690564957562
+20
+-186.86272
+30
+212.46522637891
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+442.839434933817
+22
+-186.86272
+32
+210.755700449054
+13
+442.839434933817
+23
+-186.86272
+33
+210.755700449054
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839434933817
+20
+-186.86272
+30
+210.755700449054
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+445.721690152324
+22
+-186.86272
+32
+208.627211339945
+13
+445.721690152324
+23
+-186.86272
+33
+208.627211339945
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721690152324
+20
+-186.86272
+30
+208.627211339945
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+448.281962880048
+22
+-186.86272
+32
+206.120647039576
+13
+448.281962880048
+23
+-186.86272
+33
+206.120647039576
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281962880048
+20
+-186.86272
+30
+206.120647039576
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+450.471070624061
+22
+-186.86272
+32
+203.284158309244
+13
+450.471070624061
+23
+-186.86272
+33
+203.284158309244
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471070624061
+20
+-186.86272
+30
+203.284158309244
+11
+448.31772029492
+21
+-186.86272
+31
+242.726639240051
+12
+451.683281480069
+22
+-186.86272
+32
+242.650939792116
+13
+451.683281480069
+23
+-186.86272
+33
+242.650939792116
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471070624061
+20
+-186.86272
+30
+203.284158309244
+11
+451.683281480069
+21
+-186.86272
+31
+242.650939792116
+12
+452.246960920592
+22
+-186.86272
+32
+200.172233713933
+13
+452.246960920592
+23
+-186.86272
+33
+200.172233713933
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246960920592
+20
+-186.86272
+30
+200.172233713933
+11
+451.683281480069
+21
+-186.86272
+31
+242.650939792116
+12
+455.00604998394
+22
+-186.86272
+32
+242.110623248711
+13
+455.00604998394
+23
+-186.86272
+33
+242.110623248711
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246960920592
+20
+-186.86272
+30
+200.172233713933
+11
+455.00604998394
+21
+-186.86272
+31
+242.110623248711
+12
+453.575519157163
+22
+-186.86272
+32
+196.84465290436
+13
+453.575519157163
+23
+-186.86272
+33
+196.84465290436
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575519157163
+20
+-186.86272
+30
+196.84465290436
+11
+455.00604998394
+21
+-186.86272
+31
+242.110623248711
+12
+454.431223909685
+22
+-186.86272
+32
+193.36533825795
+13
+454.431223909685
+23
+-186.86272
+33
+193.36533825795
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431223909685
+20
+-186.86272
+30
+193.36533825795
+11
+455.00604998394
+21
+-186.86272
+31
+242.110623248711
+12
+454.797637205561
+22
+-186.86272
+32
+189.801126938625
+13
+454.797637205561
+23
+-186.86272
+33
+189.801126938625
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797637205561
+20
+-186.86272
+30
+189.801126938625
+11
+602.133251163261
+21
+-186.86272
+31
+186.220486963908
+12
+454.66772029492
+22
+-186.86272
+32
+186.220486963908
+13
+454.66772029492
+23
+-186.86272
+33
+186.220486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133251163261
+20
+-186.86272
+30
+186.220486963908
+11
+454.797637205561
+21
+-186.86272
+31
+189.801126938625
+12
+473.71772029492
+22
+-186.86272
+32
+217.326639240051
+13
+473.71772029492
+23
+-186.86272
+33
+217.326639240051
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+454.797637205561
+21
+-186.86272
+31
+189.801126938625
+12
+455.00604998394
+22
+-186.86272
+32
+242.110623248711
+13
+455.00604998394
+23
+-186.86272
+33
+242.110623248711
+70
+15
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+455.00604998394
+21
+-186.86272
+31
+242.110623248711
+12
+458.222195872847
+22
+-186.86272
+32
+241.116069017578
+13
+458.222195872847
+23
+-186.86272
+33
+241.116069017578
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+458.222195872847
+21
+-186.86272
+31
+241.116069017578
+12
+461.269937419119
+22
+-186.86272
+32
+239.686382351025
+13
+461.269937419119
+23
+-186.86272
+33
+239.686382351025
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+461.269937419119
+21
+-186.86272
+31
+239.686382351025
+12
+464.090727919739
+22
+-186.86272
+32
+237.849027336606
+13
+464.090727919739
+23
+-186.86272
+33
+237.849027336606
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+464.090727919739
+21
+-186.86272
+31
+237.849027336606
+12
+466.630380370588
+22
+-186.86272
+32
+235.63929931572
+13
+466.630380370588
+23
+-186.86272
+33
+235.63929931572
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+466.630380370588
+21
+-186.86272
+31
+235.63929931572
+12
+468.840108391474
+22
+-186.86272
+32
+233.09964686487
+13
+468.840108391474
+23
+-186.86272
+33
+233.09964686487
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+468.840108391474
+21
+-186.86272
+31
+233.09964686487
+12
+470.677463405893
+22
+-186.86272
+32
+230.27885636425
+13
+470.677463405893
+23
+-186.86272
+33
+230.27885636425
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+470.677463405893
+21
+-186.86272
+31
+230.27885636425
+12
+472.107150072447
+22
+-186.86272
+32
+227.231114817978
+13
+472.107150072447
+23
+-186.86272
+33
+227.231114817978
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+472.107150072447
+21
+-186.86272
+31
+227.231114817978
+12
+473.10170430358
+22
+-186.86272
+32
+224.014968929072
+13
+473.10170430358
+23
+-186.86272
+33
+224.014968929072
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.71772029492
+20
+-186.86272
+30
+217.326639240051
+11
+473.10170430358
+21
+-186.86272
+31
+224.014968929072
+12
+473.642020846985
+22
+-186.86272
+32
+220.692200425201
+13
+473.642020846985
+23
+-186.86272
+33
+220.692200425201
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133251163261
+20
+-186.86272
+30
+186.220486963908
+11
+473.71772029492
+21
+-186.86272
+31
+217.326639240051
+12
+599.602098887118
+22
+-186.86272
+32
+217.326639240051
+13
+599.602098887118
+23
+-186.86272
+33
+217.326639240051
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133251163261
+20
+-186.86272
+30
+186.220486963908
+11
+599.602098887118
+21
+-186.86272
+31
+217.326639240051
+12
+624.955290211342
+22
+-186.86272
+32
+215.762940693873
+13
+624.955290211342
+23
+-186.86272
+33
+215.762940693873
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133251163261
+20
+-186.86272
+30
+186.220486963908
+11
+624.955290211342
+21
+-186.86272
+31
+215.762940693873
+12
+623.546317277054
+22
+-186.86272
+32
+185.255996085023
+13
+623.546317277054
+23
+-186.86272
+33
+185.255996085023
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546317277054
+20
+-186.86272
+30
+185.255996085023
+11
+624.955290211342
+21
+-186.86272
+31
+215.762940693873
+12
+644.636215091063
+22
+-186.86272
+32
+181.426393854527
+13
+644.636215091063
+23
+-186.86272
+33
+181.426393854527
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636215091063
+20
+-186.86272
+30
+181.426393854527
+11
+624.955290211342
+21
+-186.86272
+31
+215.762940693873
+12
+649.884068906774
+22
+-186.86272
+32
+210.885907146698
+13
+649.884068906774
+23
+-186.86272
+33
+210.885907146698
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636215091063
+20
+-186.86272
+30
+181.426393854527
+11
+649.884068906774
+21
+-186.86272
+31
+210.885907146698
+12
+665.021343123663
+22
+-186.86272
+32
+174.800973253263
+13
+665.021343123663
+23
+-186.86272
+33
+174.800973253263
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021343123663
+20
+-186.86272
+30
+174.800973253263
+11
+649.884068906774
+21
+-186.86272
+31
+210.885907146698
+12
+673.957327625231
+22
+-186.86272
+32
+202.779879874335
+13
+673.957327625231
+23
+-186.86272
+33
+202.779879874335
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021343123663
+20
+-186.86272
+30
+174.800973253263
+11
+673.957327625231
+21
+-186.86272
+31
+202.779879874335
+12
+684.332852026746
+22
+-186.86272
+32
+165.499614915081
+13
+684.332852026746
+23
+-186.86272
+33
+165.499614915081
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332852026746
+20
+-186.86272
+30
+165.499614915081
+11
+673.957327625231
+21
+-186.86272
+31
+202.779879874335
+12
+696.758754005207
+22
+-186.86272
+32
+191.585040951661
+13
+696.758754005207
+23
+-186.86272
+33
+191.585040951661
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332852026746
+20
+-186.86272
+30
+165.499614915081
+11
+696.758754005207
+21
+-186.86272
+31
+191.585040951661
+12
+702.221318561055
+22
+-186.86272
+32
+153.690618001708
+13
+702.221318561055
+23
+-186.86272
+33
+153.690618001708
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221318561055
+20
+-186.86272
+30
+153.690618001708
+11
+696.758754005207
+21
+-186.86272
+31
+191.585040951661
+12
+717.894030194972
+22
+-186.86272
+32
+177.494989005399
+13
+717.894030194972
+23
+-186.86272
+33
+177.494989005399
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221318561055
+20
+-186.86272
+30
+153.690618001708
+11
+717.894030194972
+21
+-186.86272
+31
+177.494989005399
+12
+718.363068074693
+22
+-186.86272
+32
+139.587654990762
+13
+718.363068074693
+23
+-186.86272
+33
+139.587654990762
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363068074693
+20
+-186.86272
+30
+139.587654990762
+11
+717.894030194972
+21
+-186.86272
+31
+177.494989005399
+12
+736.99765201229
+22
+-186.86272
+32
+160.753391204502
+13
+736.99765201229
+23
+-186.86272
+33
+160.753391204502
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363068074693
+20
+-186.86272
+30
+139.587654990762
+11
+736.99765201229
+21
+-186.86272
+31
+160.753391204502
+12
+732.466031085639
+22
+-186.86272
+32
+123.445905477124
+13
+732.466031085639
+23
+-186.86272
+33
+123.445905477124
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466031085639
+20
+-186.86272
+30
+123.445905477124
+11
+736.99765201229
+21
+-186.86272
+31
+160.753391204502
+12
+744.275027999012
+22
+-186.86272
+32
+105.557438942816
+13
+744.275027999012
+23
+-186.86272
+33
+105.557438942816
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275027999012
+20
+-186.86272
+30
+105.557438942816
+11
+736.99765201229
+21
+-186.86272
+31
+160.753391204502
+12
+753.739249813186
+22
+-186.86272
+32
+141.649769387185
+13
+753.739249813186
+23
+-186.86272
+33
+141.649769387185
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275027999012
+20
+-186.86272
+30
+105.557438942816
+11
+753.739249813186
+21
+-186.86272
+31
+141.649769387185
+12
+753.576386337194
+22
+-186.86272
+32
+86.2459300397311
+13
+753.576386337194
+23
+-186.86272
+33
+86.2459300397311
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576386337194
+20
+-186.86272
+30
+86.2459300397311
+11
+753.739249813186
+21
+-186.86272
+31
+141.649769387185
+12
+760.201806938459
+22
+-186.86272
+32
+65.8608020071314
+13
+760.201806938459
+23
+-186.86272
+33
+65.8608020071314
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201806938459
+20
+-186.86272
+30
+65.8608020071314
+11
+753.739249813186
+21
+-186.86272
+31
+141.649769387185
+12
+767.829301759449
+22
+-186.86272
+32
+120.51449319742
+13
+767.829301759449
+23
+-186.86272
+33
+120.51449319742
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.201806938459
+20
+-186.86272
+30
+65.8608020071314
+11
+767.829301759449
+21
+-186.86272
+31
+120.51449319742
+12
+764.031409168954
+22
+-186.86272
+32
+44.7709041931231
+13
+764.031409168954
+23
+-186.86272
+33
+44.7709041931231
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031409168954
+20
+-186.86272
+30
+44.7709041931231
+11
+767.829301759449
+21
+-186.86272
+31
+120.51449319742
+12
+764.995900047839
+22
+-186.86272
+32
+23.3578380793295
+13
+764.995900047839
+23
+-186.86272
+33
+23.3578380793295
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.995900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+767.829301759449
+21
+-186.86272
+31
+120.51449319742
+12
+793.570900047839
+22
+-186.86272
+32
+23.3578380793295
+13
+793.570900047839
+23
+-186.86272
+33
+23.3578380793295
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.570900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+767.829301759449
+21
+-186.86272
+31
+120.51449319742
+12
+779.024140682123
+22
+-186.86272
+32
+97.713066817443
+13
+779.024140682123
+23
+-186.86272
+33
+97.713066817443
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.570900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+779.024140682123
+21
+-186.86272
+31
+97.713066817443
+12
+787.130167954486
+22
+-186.86272
+32
+73.639808098986
+13
+787.130167954486
+23
+-186.86272
+33
+73.639808098986
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.570900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+787.130167954486
+21
+-186.86272
+31
+73.639808098986
+12
+792.00720150166
+22
+-186.86272
+32
+48.7110294035543
+13
+792.00720150166
+23
+-186.86272
+33
+48.7110294035543
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.179983602711646
+20
+-186.862719999999
+30
+2125.50255258978
+11
+35.243015227678
+21
+-186.862719999999
+31
+2079.8653122236
+12
+0.112465277083556
+22
+-186.862719999999
+32
+2083.32536938894
+13
+0.112465277083556
+23
+-186.862719999999
+33
+2083.32536938894
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.243015227678
+20
+-186.862719999999
+30
+2079.8653122236
+11
+0.179983602711646
+21
+-186.862719999999
+31
+2125.50255258978
+12
+46.8683973137003
+22
+-186.862719999999
+32
+2125.50255258978
+13
+46.8683973137003
+23
+-186.862719999999
+33
+2125.50255258978
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.243015227678
+20
+-186.862719999999
+30
+2079.8653122236
+11
+46.8683973137003
+21
+-186.862719999999
+31
+2125.50255258978
+12
+69.0235178451106
+22
+-186.862719999999
+32
+2069.61810878401
+13
+69.0235178451106
+23
+-186.862719999999
+33
+2069.61810878401
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.478462984219
+20
+-280.29408
+30
+1972.1631636449
+11
+176.725666423807
+21
+-186.86272
+31
+1938.38266102747
+12
+176.725666423806
+22
+-280.29408
+32
+1938.38266102747
+13
+176.725666423806
+23
+-280.29408
+33
+1938.38266102747
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.725666423807
+20
+-186.86272
+30
+1938.38266102747
+11
+166.478462984219
+21
+-280.29408
+31
+1972.1631636449
+12
+166.47846298422
+22
+-186.86272
+32
+1972.1631636449
+13
+166.47846298422
+23
+-186.86272
+33
+1972.1631636449
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.112465277083136
+20
+-280.29408
+30
+1390.81149035281
+11
+35.2381055728787
+21
+-186.86272
+31
+1394.27106395937
+12
+0.112465277083555
+22
+-186.86272
+32
+1390.81149035281
+13
+0.112465277083555
+23
+-186.86272
+33
+1390.81149035281
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+35.2381055728787
+20
+-186.86272
+30
+1394.27106395937
+11
+0.112465277083136
+21
+-280.29408
+31
+1390.81149035281
+12
+35.2381055728783
+22
+-280.29408
+32
+1394.27106395937
+13
+35.2381055728783
+23
+-280.29408
+33
+1394.27106395937
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.3272894690769
+20
+-280.29408
+30
+1737.04848268553
+11
+100.155807358117
+21
+-186.86272
+31
+1753.52666880208
+12
+69.3272894690774
+22
+-186.86272
+32
+1737.04848268553
+13
+69.3272894690774
+23
+-186.86272
+33
+1737.04848268553
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.155807358117
+20
+-186.86272
+30
+1753.52666880208
+11
+69.3272894690769
+21
+-280.29408
+31
+1737.04848268553
+12
+100.155807358117
+22
+-280.29408
+32
+1753.52666880208
+13
+100.155807358117
+23
+-280.29408
+33
+1753.52666880208
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+100.141825844156
+20
+-280.29408
+30
+1720.56410006505
+11
+69.3272894690774
+21
+-186.86272
+31
+1737.04848268553
+12
+100.141825844156
+22
+-186.862719999999
+32
+1720.56410006505
+13
+100.141825844156
+23
+-186.862719999999
+33
+1720.56410006505
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+69.3272894690774
+20
+-186.86272
+30
+1737.04848268553
+11
+100.141825844156
+21
+-280.29408
+31
+1720.56410006505
+12
+69.3272894690769
+22
+-280.29408
+32
+1737.04848268553
+13
+69.3272894690769
+23
+-280.29408
+33
+1737.04848268553
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+180.185723589149
+20
+-280.29408
+30
+1903.25211107687
+11
+176.725666423807
+21
+-186.86272
+31
+1868.12156112628
+12
+176.725666423806
+22
+-280.29408
+32
+1868.12156112628
+13
+176.725666423806
+23
+-280.29408
+33
+1868.12156112628
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.725666423807
+20
+-186.86272
+30
+1868.12156112628
+11
+180.185723589149
+21
+-280.29408
+31
+1903.25211107687
+12
+180.18572358915
+22
+-186.86272
+32
+1903.25211107687
+13
+180.18572358915
+23
+-186.86272
+33
+1903.25211107687
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+176.725666423806
+20
+-280.29408
+30
+1868.12156112628
+11
+166.47846298422
+21
+-186.86272
+31
+1834.34105850885
+12
+166.478462984219
+22
+-280.29408
+32
+1834.34105850885
+13
+166.478462984219
+23
+-280.29408
+33
+1834.34105850885
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.47846298422
+20
+-186.86272
+30
+1834.34105850885
+11
+176.725666423806
+21
+-280.29408
+31
+1868.12156112628
+12
+176.725666423807
+22
+-186.86272
+32
+1868.12156112628
+13
+176.725666423807
+23
+-186.86272
+33
+1868.12156112628
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+166.478462984219
+20
+-280.29408
+30
+1834.34105850885
+11
+149.837907551873
+21
+-186.86272
+31
+1803.20876899584
+12
+149.837907551873
+22
+-280.29408
+32
+1803.20876899584
+13
+149.837907551873
+23
+-280.29408
+33
+1803.20876899584
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+149.837907551873
+20
+-186.86272
+30
+1803.20876899584
+11
+166.478462984219
+21
+-280.29408
+31
+1834.34105850885
+12
+166.47846298422
+22
+-186.86272
+32
+1834.34105850885
+13
+166.47846298422
+23
+-186.86272
+33
+1834.34105850885
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282012434797
+20
+-654.795098868987
+30
+180.78210913444
+11
+450.471111788281
+21
+-629.324619346527
+31
+189.746945529741
+12
+450.471119570638
+22
+-653.402150740311
+32
+178.303588160926
+13
+450.471119570638
+23
+-653.402150740311
+33
+178.303588160926
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471111788281
+20
+-629.324619346527
+30
+189.746945529741
+11
+448.282012434797
+21
+-654.795098868987
+31
+180.78210913444
+12
+448.282004539076
+22
+-630.366836092636
+32
+192.392159030223
+13
+448.282004539076
+23
+-630.366836092636
+33
+192.392159030223
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+649.884086364505
+20
+-759.522868440055
+30
+28.7920756889693
+11
+624.955322175969
+21
+-759.578730682939
+31
+57.2462284142879
+12
+624.955307916438
+22
+-764.38593632126
+32
+29.2895600085649
+13
+624.955307916438
+23
+-764.38593632126
+33
+29.2895600085649
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+624.955322175969
+20
+-759.578730682939
+30
+57.2462284142879
+11
+649.884086364505
+21
+-759.522868440055
+31
+28.7920756889693
+12
+649.884100288402
+22
+-754.828812255533
+32
+56.0907148781112
+13
+649.884100288402
+23
+-754.828812255533
+33
+56.0907148781112
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281962880048
+20
+-549.007501396503
+30
+206.120647039576
+11
+450.471070624061
+21
+-186.86272
+31
+203.284158309244
+12
+450.471070624061
+22
+-548.959849908146
+32
+203.284158309243
+13
+450.471070624061
+23
+-548.959849908146
+33
+203.284158309243
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471070624061
+20
+-186.86272
+30
+203.284158309244
+11
+448.281962880048
+21
+-549.007501396503
+31
+206.120647039576
+12
+448.281962880048
+22
+-186.86272
+32
+206.120647039576
+13
+448.281962880048
+23
+-186.86272
+33
+206.120647039576
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332852026746
+20
+-548.325028948197
+30
+165.499614915081
+11
+665.021343123663
+21
+-186.86272
+31
+174.800973253263
+12
+684.332852026746
+22
+-186.86272
+32
+165.499614915081
+13
+684.332852026746
+23
+-186.86272
+33
+165.499614915081
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021343123663
+20
+-186.86272
+30
+174.800973253263
+11
+684.332852026746
+21
+-548.325028948197
+31
+165.499614915081
+12
+665.021343123663
+22
+-548.481290386566
+32
+174.800973253262
+13
+665.021343123663
+23
+-548.481290386566
+33
+174.800973253262
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+599.602116671527
+20
+-765.945156978237
+30
+29.4490754688794
+11
+473.717752446486
+21
+-761.101673808691
+31
+57.6167818413605
+12
+473.717738079349
+22
+-765.945155901366
+32
+29.449144968378
+13
+473.717738079349
+23
+-765.945155901366
+33
+29.449144968378
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.717752446486
+20
+-761.101673808691
+30
+57.6167818413605
+11
+599.602116671527
+21
+-765.945156978237
+31
+29.4490754688794
+12
+599.602131038669
+22
+-761.101673056328
+32
+57.616722979916
+13
+599.602131038669
+23
+-761.101673056328
+33
+57.616722979916
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363098127435
+20
+-605.920400916633
+30
+130.345732863609
+11
+732.466052014781
+21
+-584.996349297051
+31
+120.045263691758
+12
+732.466058322552
+22
+-599.989404866694
+32
+115.292482897529
+13
+732.466058322552
+23
+-599.989404866694
+33
+115.292482897529
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466052014781
+20
+-584.996349297051
+30
+120.045263691758
+11
+718.363098127435
+21
+-605.920400916633
+31
+130.345732863609
+12
+718.363090933403
+22
+-588.820775333035
+32
+135.766293848309
+13
+718.363090933403
+23
+-588.820775333035
+33
+135.766293848309
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973136999
+20
+-280.294079999999
+30
+2499.20806403607
+11
+46.8683973137003
+21
+-186.862719999999
+31
+2125.50255258978
+12
+46.8683973136999
+22
+-280.294079999999
+32
+2125.50255258978
+13
+46.8683973136999
+23
+-280.294079999999
+33
+2125.50255258978
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+46.8683973137003
+20
+-186.862719999999
+30
+2125.50255258978
+11
+46.8683973136999
+21
+-280.294079999999
+31
+2499.20806403607
+12
+46.8683973137003
+22
+-186.862719999999
+32
+2499.20806403607
+13
+46.8683973137003
+23
+-186.862719999999
+33
+2499.20806403607
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+673.957327625231
+20
+-548.951311917762
+30
+202.779879874335
+11
+696.758770484001
+21
+-576.445896872616
+31
+190.654683562835
+12
+696.758754005207
+22
+-548.76324041817
+32
+191.585040951661
+13
+696.758754005207
+23
+-548.76324041817
+33
+191.585040951661
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+696.758770484001
+20
+-576.445896872616
+30
+190.654683562835
+11
+673.957327625231
+21
+-548.951311917762
+31
+202.779879874335
+12
+673.957344671825
+22
+-577.587813182298
+32
+201.817465714933
+13
+673.957344671825
+23
+-577.587813182298
+33
+201.817465714933
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335625756533
+20
+-682.017174593568
+30
+172.023801843262
+11
+432.838949191021
+21
+-658.912362146436
+31
+188.108094342889
+12
+436.335620774804
+22
+-658.528453423172
+32
+187.424993609851
+13
+436.335620774804
+23
+-658.528453423172
+33
+187.424993609851
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838949191021
+20
+-658.912362146436
+30
+188.108094342889
+11
+436.335625756533
+21
+-682.017174593568
+31
+172.023801843262
+12
+432.838954191733
+22
+-682.490585555484
+32
+172.648217340479
+13
+432.838954191733
+23
+-682.490585555484
+33
+172.648217340479
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222209793371
+20
+-789.952733412824
+30
+23.3578378560715
+11
+455.006069025402
+21
+-790.658170470477
+31
+31.9771884161607
+12
+455.006063894518
+22
+-790.94784918938
+32
+23.3578378548415
+13
+455.006063894518
+23
+-790.94784918938
+33
+23.3578378548415
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006069025402
+20
+-790.658170470477
+30
+31.9771884161607
+11
+458.222209793371
+21
+-789.952733412824
+31
+23.3578378560715
+12
+458.222214863865
+22
+-789.666464186592
+32
+31.8757394304439
+13
+458.222214863865
+23
+-789.666464186592
+33
+31.8757394304439
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.995900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+847.545902396365
+21
+56.1856515497976
+31
+23.3578380793863
+12
+806.270901222105
+22
+56.1856515497994
+32
+23.3578380793657
+13
+806.270901222105
+23
+56.1856515497994
+33
+23.3578380793657
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.545902396365
+20
+56.1856515497976
+30
+23.3578380793863
+11
+764.995900047839
+21
+-186.86272
+31
+23.3578380793295
+12
+793.570900047839
+22
+-186.86272
+32
+23.3578380793295
+13
+793.570900047839
+23
+-186.86272
+33
+23.3578380793295
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+793.570900047839
+20
+-186.86272
+30
+23.3578380793295
+11
+847.54590239636
+21
+-563.749226612819
+31
+23.3578380793719
+12
+847.545902396365
+22
+56.1856515497976
+32
+23.3578380793863
+13
+847.545902396365
+23
+56.1856515497976
+33
+23.3578380793863
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.54590239636
+20
+-563.749226612819
+30
+23.3578380793719
+11
+793.570900047839
+21
+-186.86272
+31
+23.3578380793295
+12
+793.570900047839
+22
+-545.937123520845
+32
+23.3578380793295
+13
+793.570900047839
+23
+-545.937123520845
+33
+23.3578380793295
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.54590239636
+20
+-563.749226612819
+30
+23.3578380793719
+11
+793.570900047839
+21
+-545.937123520845
+31
+23.3578380793295
+12
+793.543158239603
+22
+-559.33210911257
+32
+23.3578380122893
+13
+793.543158239603
+23
+-559.33210911257
+33
+23.3578380122893
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.54590239636
+20
+-563.749226612819
+30
+23.3578380793719
+11
+793.543158239603
+21
+-559.33210911257
+31
+23.3578380122893
+12
+793.520757722035
+22
+-561.475389395115
+32
+23.3578380118087
+13
+793.520757722035
+23
+-561.475389395115
+33
+23.3578380118087
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.54590239636
+20
+-563.749226612819
+30
+23.3578380793719
+11
+793.520757722035
+21
+-561.475389395115
+31
+23.3578380118087
+12
+793.478047748674
+22
+-563.767069108265
+32
+23.3578380112902
+13
+793.478047748674
+23
+-563.767069108265
+33
+23.3578380112902
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+847.54590239636
+20
+-563.749226612819
+30
+23.3578380793719
+11
+793.478047748674
+21
+-563.767069108265
+31
+23.3578380112902
+12
+843.130722681617
+22
+-608.452917091224
+32
+23.3578380793307
+13
+843.130722681617
+23
+-608.452917091224
+33
+23.3578380793307
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+793.478047748674
+21
+-563.767069108265
+31
+23.3578380112902
+12
+793.410423174187
+22
+-566.321374409616
+32
+23.357838010706
+13
+793.410423174187
+23
+-566.321374409616
+33
+23.357838010706
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+793.410423174187
+21
+-566.321374409616
+31
+23.357838010706
+12
+793.309565768095
+22
+-569.303680096418
+32
+23.3578380100164
+13
+793.309565768095
+23
+-569.303680096418
+33
+23.3578380100164
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+793.309565768095
+21
+-569.303680096418
+31
+23.3578380100164
+12
+793.160541596036
+22
+-572.980425388099
+32
+23.3578380091579
+13
+793.160541596036
+23
+-572.980425388099
+33
+23.3578380091579
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+793.160541596036
+21
+-572.980425388099
+31
+23.3578380091579
+12
+792.935095112731
+22
+-577.829952364284
+32
+23.3578380080173
+13
+792.935095112731
+23
+-577.829952364284
+33
+23.3578380080173
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+792.935095112731
+21
+-577.829952364284
+31
+23.3578380080173
+12
+792.574093434967
+22
+-584.829110641297
+32
+23.3578380063606
+13
+792.574093434967
+23
+-584.829110641297
+33
+23.3578380063606
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+792.574093434967
+21
+-584.829110641297
+31
+23.3578380063606
+12
+792.00721584731
+22
+-595.005500745675
+32
+23.3578380039372
+13
+792.00721584731
+23
+-595.005500745675
+33
+23.3578380039372
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+792.00721584731
+21
+-595.005500745675
+31
+23.3578380039372
+12
+791.767077835926
+22
+-596.364536149864
+32
+23.3578380035618
+13
+791.767077835926
+23
+-596.364536149864
+33
+23.3578380035618
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+791.767077835926
+21
+-596.364536149864
+31
+23.3578380035618
+12
+787.308111270966
+22
+-620.27413204142
+32
+23.3578379968868
+13
+787.308111270966
+23
+-620.27413204142
+33
+23.3578379968868
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+843.130722681617
+20
+-608.452917091224
+30
+23.3578380793307
+11
+787.308111270966
+21
+-620.27413204142
+31
+23.3578379968868
+12
+838.782876772251
+22
+-630.31101453706
+32
+23.3578380792528
+13
+838.782876772251
+23
+-630.31101453706
+33
+23.3578380792528
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+838.782876772251
+20
+-630.31101453706
+30
+23.3578380792528
+11
+787.308111270966
+21
+-620.27413204142
+31
+23.3578379968868
+12
+787.130182819951
+22
+-621.196954326058
+32
+23.3578379966277
+13
+787.130182819951
+23
+-621.196954326058
+33
+23.3578379966277
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+838.782876772251
+20
+-630.31101453706
+30
+23.3578380792528
+11
+787.130182819951
+21
+-621.196954326058
+31
+23.3578379966277
+12
+779.024155516104
+22
+-645.623514226953
+32
+23.3578379886926
+13
+779.024155516104
+23
+-645.623514226953
+33
+23.3578379886926
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+838.782876772251
+20
+-630.31101453706
+30
+23.3578380792528
+11
+779.024155516104
+21
+-645.623514226953
+31
+23.3578379886926
+12
+827.96962116995
+22
+-662.165838331311
+32
+23.3578380792096
+13
+827.96962116995
+23
+-662.165838331311
+33
+23.3578380792096
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+827.96962116995
+20
+-662.165838331311
+30
+23.3578380792096
+11
+779.024155516104
+21
+-645.623514226953
+31
+23.3578379886926
+12
+767.829316563608
+22
+-668.759576574313
+32
+23.3578379800722
+13
+767.829316563608
+23
+-668.759576574313
+33
+23.3578379800722
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+827.96962116995
+20
+-662.165838331311
+30
+23.3578380792096
+11
+767.829316563608
+21
+-668.759576574313
+31
+23.3578379800722
+12
+813.090985614623
+22
+-692.336726612819
+32
+23.3578380791782
+13
+813.090985614623
+23
+-692.336726612819
+33
+23.3578380791782
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+813.090985614623
+20
+-692.336726612819
+30
+23.3578380791782
+11
+767.829316563608
+21
+-668.759576574313
+31
+23.3578379800722
+12
+753.739264589701
+22
+-690.205036468984
+32
+23.3578379709152
+13
+753.739264589701
+23
+-690.205036468984
+33
+23.3578379709152
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+813.090985614623
+20
+-692.336726612819
+30
+23.3578380791782
+11
+753.739264589701
+21
+-690.205036468984
+31
+23.3578379709152
+12
+739.751559375878
+22
+-706.400475394532
+32
+23.357837962948
+13
+739.751559375878
+23
+-706.400475394532
+33
+23.357837962948
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+813.090985614623
+20
+-692.336726612819
+30
+23.3578380791782
+11
+739.751559375878
+21
+-706.400475394532
+31
+23.357837962948
+12
+794.401547685759
+22
+-720.307447118137
+32
+23.3578380791593
+13
+794.401547685759
+23
+-720.307447118137
+33
+23.3578380791593
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+794.401547685759
+20
+-720.307447118137
+30
+23.3578380791593
+11
+739.751559375878
+21
+-706.400475394532
+31
+23.357837962948
+12
+736.997666736503
+22
+-709.544681018119
+32
+23.3578379613892
+13
+736.997666736503
+23
+-709.544681018119
+33
+23.3578379613892
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+794.401547685759
+20
+-720.307447118137
+30
+23.3578380791593
+11
+736.997666736503
+21
+-709.544681018119
+31
+23.3578379613892
+12
+717.894044751764
+22
+-726.295731112839
+32
+23.3578379516926
+13
+717.894044751764
+23
+-726.295731112839
+33
+23.3578379516926
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+794.401547685759
+20
+-720.307447118137
+30
+23.3578380791593
+11
+717.894044751764
+21
+-726.295731112839
+31
+23.3578379516926
+12
+772.221088848011
+22
+-745.599413064469
+32
+23.3578380791531
+13
+772.221088848011
+23
+-745.599413064469
+33
+23.3578380791531
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+772.221088848011
+20
+-745.599413064469
+30
+23.3578380791531
+11
+717.894044751764
+21
+-726.295731112839
+31
+23.3578379516926
+12
+696.758768421093
+22
+-740.393738342711
+32
+23.357837941943
+13
+696.758768421093
+23
+-740.393738342711
+33
+23.357837941943
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+772.221088848011
+20
+-745.599413064469
+30
+23.3578380791531
+11
+696.758768421093
+21
+-740.393738342711
+31
+23.357837941943
+12
+673.957341929162
+22
+-751.594897963598
+32
+23.3578379323091
+13
+673.957341929162
+23
+-751.594897963598
+33
+23.3578379323091
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+772.221088848011
+20
+-745.599413064469
+30
+23.3578380791531
+11
+673.957341929162
+21
+-751.594897963598
+31
+23.3578379323091
+12
+746.929122901678
+22
+-767.779871902217
+32
+23.3578380791593
+13
+746.929122901678
+23
+-767.779871902217
+33
+23.3578380791593
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901678
+20
+-767.779871902217
+30
+23.3578380791593
+11
+673.957341929162
+21
+-751.594897963598
+31
+23.3578379323091
+12
+649.884083129639
+22
+-759.7055020414
+32
+23.3578379229566
+13
+649.884083129639
+23
+-759.7055020414
+33
+23.3578379229566
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901678
+20
+-767.779871902217
+30
+23.3578380791593
+11
+649.884083129639
+21
+-759.7055020414
+31
+23.3578379229566
+12
+624.955304385432
+22
+-764.585289351978
+32
+23.3578379140486
+13
+624.955304385432
+23
+-764.585289351978
+33
+23.3578379140486
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901678
+20
+-767.779871902217
+30
+23.3578380791593
+11
+624.955304385432
+21
+-764.585289351978
+31
+23.3578379140486
+12
+599.602113045565
+22
+-766.149870997149
+32
+23.3578379057383
+13
+599.602113045565
+23
+-766.149870997149
+33
+23.3578379057383
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901678
+20
+-767.779871902217
+30
+23.3578380791593
+11
+599.602113045565
+21
+-766.149870997149
+31
+23.3578379057383
+12
+473.717734453346
+22
+-766.149872257343
+32
+23.3578378661905
+13
+473.717734453346
+23
+-766.149872257343
+33
+23.3578378661905
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901678
+20
+-767.779871902217
+30
+23.3578380791593
+11
+473.717734453346
+21
+-766.149872257343
+31
+23.3578378661905
+12
+473.642034971754
+22
+-769.517333598178
+32
+23.3578378654237
+13
+473.642034971754
+23
+-769.517333598178
+33
+23.3578378654237
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+746.929122901678
+20
+-767.779871902217
+30
+23.3578380791593
+11
+473.642034971754
+21
+-769.517333598178
+31
+23.3578378654237
+12
+718.95840239636
+22
+-786.469309831082
+32
+23.3578380791782
+13
+718.95840239636
+23
+-786.469309831082
+33
+23.3578380791782
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+473.642034971754
+21
+-769.517333598178
+31
+23.3578378654237
+12
+473.101718395121
+22
+-772.841978102158
+32
+23.3578378645206
+13
+473.101718395121
+23
+-772.841978102158
+33
+23.3578378645206
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+473.101718395121
+21
+-772.841978102158
+31
+23.3578378645206
+12
+472.107164131826
+22
+-776.05993979789
+32
+23.3578378634987
+13
+472.107164131826
+23
+-776.05993979789
+33
+23.3578378634987
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+472.107164131826
+21
+-776.05993979789
+31
+23.3578378634987
+12
+470.677477434794
+22
+-779.109402076299
+32
+23.3578378623763
+13
+470.677477434794
+23
+-779.109402076299
+33
+23.3578378623763
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+470.677477434794
+21
+-779.109402076299
+31
+23.3578378623763
+12
+468.840122392167
+22
+-781.931785179335
+32
+23.3578378611765
+13
+468.840122392167
+23
+-781.931785179335
+33
+23.3578378611765
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+468.840122392167
+21
+-781.931785179335
+31
+23.3578378611765
+12
+466.630394345883
+22
+-784.472871509203
+32
+23.3578378599218
+13
+466.630394345883
+23
+-784.472871509203
+33
+23.3578378599218
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+466.630394345883
+21
+-784.472871509203
+31
+23.3578378599218
+12
+464.090741872935
+22
+-786.683847141088
+32
+23.3578378586363
+13
+464.090741872935
+23
+-786.683847141088
+33
+23.3578378586363
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.95840239636
+20
+-786.469309831082
+30
+23.3578380791782
+11
+464.090741872935
+21
+-786.683847141088
+31
+23.3578378586363
+12
+688.787514114852
+22
+-801.347945386409
+32
+23.3578380792096
+13
+688.787514114852
+23
+-801.347945386409
+33
+23.3578380792096
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+464.090741872935
+21
+-786.683847141088
+31
+23.3578378586363
+12
+461.269951353941
+22
+-788.522239532049
+32
+23.3578378573451
+13
+461.269951353941
+23
+-788.522239532049
+33
+23.3578378573451
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+461.269951353941
+21
+-788.522239532049
+31
+23.3578378573451
+12
+458.222209793371
+22
+-789.952733412824
+32
+23.3578378560715
+13
+458.222209793371
+23
+-789.952733412824
+33
+23.3578378560715
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+458.222209793371
+21
+-789.952733412824
+31
+23.3578378560715
+12
+455.006063894518
+22
+-790.94784918938
+32
+23.3578378548415
+13
+455.006063894518
+23
+-790.94784918938
+33
+23.3578378548415
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+455.006063894518
+21
+-790.94784918938
+31
+23.3578378548415
+12
+451.683295385243
+22
+-791.4884708222
+32
+23.3578378536789
+13
+451.683295385243
+23
+-791.4884708222
+33
+23.3578378536789
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+451.683295385243
+21
+-791.4884708222
+31
+23.3578378536789
+12
+448.317734199337
+22
+-791.564213042815
+32
+23.3578378526045
+13
+448.317734199337
+23
+-791.564213042815
+33
+23.3578378526045
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+448.317734199337
+21
+-791.564213042815
+31
+23.3578378526045
+12
+0.000889626013624645
+22
+-791.564217518411
+32
+23.3578380798509
+13
+0.000889626013624645
+23
+-791.564217518411
+33
+23.3578380798509
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+0.000889626013624645
+21
+-791.564217518411
+31
+23.3578380798509
+12
+0.000467548734387557
+22
+-820.924226612819
+32
+23.3578380793719
+13
+0.000467548734387557
+23
+-820.924226612819
+33
+23.3578380793719
+70
+13
+ 0
+3DFACE
+ 8
+leg_half
+10
+688.787514114852
+20
+-801.347945386409
+30
+23.3578380792096
+11
+0.000467548734387557
+21
+-820.924226612819
+31
+23.3578380793719
+12
+656.932690320601
+22
+-812.16120098871
+32
+23.3578380792528
+13
+656.932690320601
+23
+-812.16120098871
+33
+23.3578380792528
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+656.932690320601
+20
+-812.16120098871
+30
+23.3578380792528
+11
+0.000467548734387557
+21
+-820.924226612819
+31
+23.3578380793719
+12
+623.938975880552
+22
+-818.724058836629
+32
+23.3578380793071
+13
+623.938975880552
+23
+-818.724058836629
+33
+23.3578380793071
+70
+3
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.938975880552
+20
+-818.724058836629
+30
+23.3578380793071
+11
+0.000467548734387557
+21
+-820.924226612819
+31
+23.3578380793719
+12
+590.37090239636
+22
+-820.924226612819
+32
+23.3578380793719
+13
+590.37090239636
+23
+-820.924226612819
+33
+23.3578380793719
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+5.74034615733243e-05
+20
+-672.771766719091
+30
+212.768416817903
+11
+448.317783384355
+21
+-699.580940660874
+31
+195.189933989489
+12
+448.31777769836
+22
+-672.771628457813
+32
+212.76838602076
+13
+448.31777769836
+23
+-672.771628457813
+33
+212.76838602076
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317783384355
+20
+-699.580940660874
+30
+195.189933989489
+11
+5.74034615733243e-05
+21
+-672.771766719091
+31
+212.768416817903
+12
+6.30894498883872e-05
+22
+-699.581046774633
+32
+195.189985865263
+13
+6.30894498883872e-05
+23
+-699.581046774633
+33
+195.189985865263
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721732248607
+20
+-631.28782828485
+30
+194.729696180594
+11
+448.281993692064
+21
+-604.584376828467
+31
+200.565167970899
+12
+448.282004539076
+22
+-630.366836092636
+32
+192.392159030223
+13
+448.282004539076
+23
+-630.366836092636
+33
+192.392159030223
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.281993692064
+20
+-604.584376828467
+30
+200.565167970899
+11
+445.721732248607
+21
+-631.28782828485
+31
+194.729696180594
+12
+445.721721263973
+22
+-605.178251275471
+32
+203.006401057676
+13
+445.721721263973
+23
+-605.178251275471
+33
+203.006401057676
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690620823844
+20
+-681.255534297249
+30
+171.019219664594
+11
+436.335620774804
+21
+-658.528453423172
+31
+187.424993609851
+12
+439.690615872653
+22
+-657.910807757804
+32
+186.325996375185
+13
+439.690615872653
+23
+-657.910807757804
+33
+186.325996375185
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335620774804
+20
+-658.528453423172
+30
+187.424993609851
+11
+439.690620823844
+21
+-681.255534297249
+31
+171.019219664594
+12
+436.335625756533
+22
+-682.017174593568
+32
+172.023801843262
+13
+436.335625756533
+23
+-682.017174593568
+33
+172.023801843262
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101749084159
+20
+-758.702384848233
+30
+87.3191803898169
+11
+472.107183407982
+21
+-770.747998603796
+31
+59.9634222143927
+12
+473.10173725466
+22
+-767.61567851106
+32
+59.2014293241045
+13
+473.10173725466
+23
+-767.61567851106
+33
+59.2014293241045
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107183407982
+20
+-770.747998603796
+30
+59.9634222143927
+11
+473.101749084159
+21
+-758.702384848233
+31
+87.3191803898169
+12
+472.107195414063
+22
+-761.701653732916
+32
+88.5008947532808
+13
+472.107195414063
+23
+-761.701653732916
+33
+88.5008947532808
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721746731967
+20
+-699.576473436421
+30
+149.95388604473
+11
+448.282017231929
+21
+-677.413444384727
+31
+165.951609244563
+12
+448.282018840978
+22
+-697.799916727886
+32
+148.177329336375
+13
+448.282018840978
+23
+-697.799916727886
+33
+148.177329336375
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.282017231929
+20
+-677.413444384727
+30
+165.951609244563
+11
+445.721746731967
+21
+-699.576473436421
+31
+149.95388604473
+12
+445.721745102502
+22
+-678.931345516719
+32
+167.953679054935
+13
+445.721745102502
+23
+-678.931345516719
+33
+167.953679054935
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642080404707
+20
+-708.127668368109
+30
+158.505080975556
+11
+473.101762926689
+21
+-729.866935555387
+31
+138.627118353444
+12
+473.642078676977
+22
+-727.212938735792
+32
+136.614948795724
+13
+473.642078676977
+23
+-727.212938735792
+33
+136.614948795724
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101762926689
+20
+-729.866935555387
+30
+138.627118353444
+11
+473.642080404707
+21
+-708.127668368109
+31
+158.505080975556
+12
+473.101764681482
+22
+-710.482718842918
+32
+160.860131450129
+13
+473.101764681482
+23
+-710.482718842918
+33
+160.860131450129
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+760.20182781144
+20
+-592.476194788978
+30
+53.921748202446
+11
+764.031424128692
+21
+-575.559109938211
+31
+39.7948544698768
+12
+764.031425007948
+22
+-579.704781244013
+32
+37.0766018107078
+13
+764.031425007948
+23
+-579.704781244013
+33
+37.0766018107078
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031424128692
+20
+-575.559109938211
+30
+39.7948544698768
+11
+760.20182781144
+21
+-592.476194788978
+31
+53.921748202446
+12
+760.201826420081
+22
+-585.915972100795
+32
+58.2231849183613
+13
+760.201826420081
+23
+-585.915972100795
+33
+58.2231849183613
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275059137262
+20
+-626.524535798612
+30
+76.9019484142785
+11
+753.576412075941
+21
+-604.820821451585
+31
+70.2039737536023
+12
+753.576412708658
+22
+-612.837280222141
+32
+63.214692839186
+13
+753.576412708658
+23
+-612.837280222141
+33
+63.214692839186
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576412075941
+20
+-604.820821451585
+30
+70.2039737536023
+11
+744.275059137262
+21
+-626.524535798612
+31
+76.9019484142785
+12
+744.27505834726
+22
+-616.515297047424
+32
+85.6286672029373
+13
+744.27505834726
+23
+-616.515297047424
+33
+85.6286672029373
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275027999012
+20
+-547.318028491407
+30
+105.557438942816
+11
+753.576386337194
+21
+-186.86272
+31
+86.2459300397311
+12
+753.576386337194
+22
+-546.993607173192
+32
+86.2459300397311
+13
+753.576386337194
+23
+-546.993607173192
+33
+86.2459300397311
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+753.576386337194
+20
+-186.86272
+30
+86.2459300397311
+11
+744.275027999012
+21
+-547.318028491407
+31
+105.557438942816
+12
+744.275027999012
+22
+-186.86272
+32
+105.557438942816
+13
+744.275027999012
+23
+-186.86272
+33
+105.557438942816
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021370191738
+20
+-597.163793012617
+30
+170.061810578218
+11
+644.636231054623
+21
+-575.409716284687
+31
+180.525125445771
+12
+665.021358751182
+22
+-574.733894284646
+32
+173.91867700208
+13
+665.021358751182
+23
+-574.733894284646
+33
+173.91867700208
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636231054623
+20
+-575.409716284687
+30
+180.525125445771
+11
+665.021370191738
+21
+-597.163793012617
+31
+170.061810578218
+12
+644.636242951136
+22
+-598.733544865996
+32
+176.514545976725
+13
+644.636242951136
+23
+-598.733544865996
+33
+176.514545976725
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007213497075
+20
+-567.289596867332
+30
+47.2582811561368
+11
+787.130186503031
+21
+-581.689044301674
+31
+68.844999694228
+12
+792.007215701535
+22
+-572.529418663124
+32
+45.597263875134
+13
+792.007215701535
+23
+-572.529418663124
+33
+45.597263875134
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+787.130186503031
+20
+-581.689044301674
+30
+68.844999694228
+11
+792.007213497075
+21
+-567.289596867332
+31
+47.2582811561368
+12
+787.130182929858
+22
+-573.195904769668
+32
+71.5373148305873
+13
+787.130182929858
+23
+-573.195904769668
+33
+71.5373148305873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683300548936
+20
+-581.654891394158
+30
+241.574352401781
+11
+455.006085098156
+21
+-613.111377811381
+31
+235.617099433291
+12
+455.006069025402
+22
+-581.599775817026
+32
+241.035583090668
+13
+455.006069025402
+23
+-581.599775817026
+33
+241.035583090668
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006085098156
+20
+-613.111377811381
+30
+235.617099433291
+11
+451.683300548936
+21
+-581.654891394158
+31
+241.574352401781
+12
+451.683316658874
+22
+-613.239395048328
+32
+236.143333156642
+13
+451.683316658874
+23
+-613.239395048328
+33
+236.143333156642
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317739367628
+20
+-581.662614799822
+30
+241.649835054513
+11
+451.683316658874
+21
+-613.239395048328
+31
+236.143333156642
+12
+451.683300548936
+22
+-581.654891394158
+32
+241.574352401781
+13
+451.683300548936
+23
+-581.654891394158
+33
+241.574352401781
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683316658874
+20
+-613.239395048328
+30
+236.143333156642
+11
+448.317739367628
+21
+-581.662614799822
+31
+241.649835054513
+12
+448.317755482775
+22
+-613.257331879904
+32
+236.217059590145
+13
+448.317755482775
+23
+-613.257331879904
+33
+236.217059590145
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332877982946
+20
+-594.96003923808
+30
+161.00288323661
+11
+665.021358751182
+21
+-574.733894284646
+31
+173.91867700208
+12
+684.332867182503
+22
+-573.785120021053
+32
+164.643953396873
+13
+684.332867182503
+23
+-573.785120021053
+33
+164.643953396873
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+665.021358751182
+20
+-574.733894284646
+30
+173.91867700208
+11
+684.332877982946
+21
+-594.96003923808
+31
+161.00288323661
+12
+665.021370191738
+22
+-597.163793012617
+32
+170.061810578218
+13
+665.021370191738
+23
+-597.163793012617
+33
+170.061810578218
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+1.90727753096809e-05
+20
+-581.662862311522
+30
+241.649831219402
+11
+448.317755482775
+21
+-613.257331879904
+31
+236.217059590145
+12
+448.317739367628
+22
+-581.662614799822
+32
+241.649835054513
+13
+448.317739367628
+23
+-581.662614799822
+33
+241.649835054513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317755482775
+20
+-613.257331879904
+30
+236.217059590145
+11
+1.90727753096809e-05
+21
+-581.662862311522
+31
+241.649831219402
+12
+3.51879034228841e-05
+22
+-613.257541505822
+32
+236.217062269571
+13
+3.51879034228841e-05
+23
+-613.257541505822
+33
+236.217062269571
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642053400866
+20
+-608.036762247305
+30
+214.756927441262
+11
+473.101749084159
+21
+-636.941767787464
+31
+209.079797462849
+12
+473.642065047928
+22
+-635.720877069339
+32
+205.981095949127
+13
+473.642065047928
+23
+-635.720877069339
+33
+205.981095949127
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101749084159
+20
+-636.941767787464
+30
+209.079797462849
+11
+473.642053400866
+21
+-608.036762247305
+31
+214.756927441262
+12
+473.10173725466
+22
+-608.824016722648
+32
+217.993091128508
+13
+473.10173725466
+23
+-608.824016722648
+33
+217.993091128508
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.101762926689
+20
+-688.249705748186
+30
+180.244348164837
+11
+472.107211244211
+21
+-712.762199391597
+31
+163.139611998578
+12
+473.101764681482
+22
+-710.482718842918
+32
+160.860131450129
+13
+473.101764681482
+23
+-710.482718842918
+33
+160.860131450129
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107211244211
+20
+-712.762199391597
+30
+163.139611998578
+11
+473.101762926689
+21
+-688.249705748186
+31
+180.244348164837
+12
+472.107209463225
+22
+-690.197307940468
+32
+182.813182295542
+13
+472.107209463225
+23
+-690.197307940468
+33
+182.813182295542
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107209463225
+20
+-690.197307940468
+30
+182.813182295542
+11
+470.677525329952
+21
+-714.922321501014
+31
+165.299734107777
+12
+472.107211244211
+22
+-712.762199391597
+32
+163.139611998578
+13
+472.107211244211
+23
+-712.762199391597
+33
+163.139611998578
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677525329952
+20
+-714.922321501014
+30
+165.299734107777
+11
+472.107209463225
+21
+-690.197307940468
+31
+182.813182295542
+12
+470.677523524142
+22
+-692.042929592268
+32
+185.247506781241
+13
+470.677523524142
+23
+-692.042929592268
+33
+185.247506781241
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575559198051
+20
+-626.958539673324
+30
+183.741680540481
+11
+454.431253196946
+21
+-601.562294416642
+31
+188.142314217608
+12
+454.431263343628
+22
+-625.680128816835
+32
+180.496989380173
+13
+454.431263343628
+23
+-625.680128816835
+33
+180.496989380173
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431253196946
+20
+-601.562294416642
+30
+188.142314217608
+11
+453.575559198051
+21
+-626.958539673324
+31
+183.741680540481
+12
+453.575548860337
+22
+-602.386639077964
+32
+191.530943822063
+13
+453.575548860337
+23
+-602.386639077964
+33
+191.530943822063
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317755482775
+20
+-613.257331879904
+30
+236.217059590145
+11
+451.683329511579
+21
+-643.789222672817
+31
+226.45907411243
+12
+451.683316658874
+22
+-613.239395048328
+32
+236.143333156642
+13
+451.683316658874
+23
+-613.239395048328
+33
+236.143333156642
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683329511579
+20
+-643.789222672817
+30
+226.45907411243
+11
+448.317755482775
+21
+-613.257331879904
+31
+236.217059590145
+12
+448.317768339636
+22
+-643.81703834892
+32
+226.52966896396
+13
+448.317768339636
+23
+-643.81703834892
+33
+226.52966896396
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+717.894057585081
+20
+-597.802053886837
+30
+172.685609040578
+11
+736.997685757261
+21
+-613.69735635364
+31
+150.084181819366
+12
+736.997677401125
+22
+-593.835505140242
+32
+156.380365045419
+13
+736.997677401125
+23
+-593.835505140242
+33
+156.380365045419
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+736.997685757261
+20
+-613.69735635364
+30
+150.084181819366
+11
+717.894057585081
+21
+-597.802053886837
+31
+172.685609040578
+12
+717.894066860413
+22
+-619.848757614325
+32
+165.696830164561
+13
+717.894066860413
+23
+-619.848757614325
+33
+165.696830164561
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267752143919
+20
+-606.639691213326
+30
+209.013906507055
+11
+0.0162646316092562
+21
+-578.813809543233
+31
+213.798660182835
+12
+429.267737950976
+22
+-578.813572557816
+32
+213.798663854844
+13
+429.267737950976
+23
+-578.813572557816
+33
+213.798663854844
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+0.0162646316092562
+20
+-578.813809543233
+30
+213.798660182835
+11
+429.267752143919
+21
+-606.639691213326
+31
+209.013906507055
+12
+0.0162788245333154
+22
+-606.639891924184
+32
+209.013909072529
+13
+0.0162788245333154
+23
+-606.639891924184
+33
+209.013909072529
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221343105619
+20
+-592.16215835415
+30
+149.501676557166
+11
+684.332867182503
+21
+-573.785120021053
+31
+164.643953396873
+12
+702.221333117862
+22
+-572.580560654599
+32
+152.868771861916
+13
+702.221333117862
+23
+-572.580560654599
+33
+152.868771861916
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+684.332867182503
+20
+-573.785120021053
+30
+164.643953396873
+11
+702.221343105619
+21
+-592.16215835415
+31
+149.501676557166
+12
+684.332877982946
+22
+-594.96003923808
+32
+161.00288323661
+13
+684.332877982946
+23
+-594.96003923808
+33
+161.00288323661
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838929652884
+20
+-606.570796271198
+30
+208.73070710808
+11
+429.267737950976
+21
+-578.813572557816
+31
+213.798663854844
+12
+432.838915479952
+22
+-578.783910422824
+32
+213.508718295381
+13
+432.838915479952
+23
+-578.783910422824
+33
+213.508718295381
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+429.267737950976
+20
+-578.813572557816
+30
+213.798663854844
+11
+432.838929652884
+21
+-606.570796271198
+31
+208.73070710808
+12
+429.267752143919
+22
+-606.639691213326
+32
+209.013906507055
+13
+429.267752143919
+23
+-606.639691213326
+33
+209.013906507055
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335601310833
+20
+-606.385574583813
+30
+207.969323546969
+11
+432.838915479952
+21
+-578.783910422824
+31
+213.508718295381
+12
+436.335587191701
+22
+-578.704166932226
+32
+212.72919754513
+13
+436.335587191701
+23
+-578.704166932226
+33
+212.72919754513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838915479952
+20
+-578.783910422824
+30
+213.508718295381
+11
+436.335601310833
+21
+-606.385574583813
+31
+207.969323546969
+12
+432.838929652884
+22
+-606.570796271198
+32
+208.73070710808
+13
+432.838929652884
+23
+-606.570796271198
+33
+208.73070710808
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+718.363090933403
+20
+-588.820775333035
+30
+135.766293848309
+11
+702.221333117862
+21
+-572.580560654599
+31
+152.868771861916
+12
+718.363081916203
+22
+-571.142011532184
+32
+138.806193017976
+13
+718.363081916203
+23
+-571.142011532184
+33
+138.806193017976
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+702.221333117862
+20
+-572.580560654599
+30
+152.868771861916
+11
+718.363090933403
+21
+-588.820775333035
+31
+135.766293848309
+12
+702.221343105619
+22
+-592.16215835415
+32
+149.501676557166
+13
+702.221343105619
+23
+-592.16215835415
+33
+149.501676557166
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.031424128692
+20
+-589.417441849078
+30
+25.9365225576139
+11
+764.531578361879
+21
+-577.829946771796
+31
+23.3578379990944
+12
+764.267940787943
+22
+-584.829097037034
+32
+23.3578379974678
+13
+764.267940787943
+23
+-584.829097037034
+33
+23.3578379974678
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+764.531578361879
+20
+-577.829946771796
+30
+23.3578379990944
+11
+764.031424128692
+21
+-589.417441849078
+31
+25.9365225576139
+12
+764.031425007948
+22
+-586.699189190326
+32
+30.0821938636906
+13
+764.031425007948
+23
+-586.699189190326
+33
+30.0821938636906
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+792.007217306199
+20
+-592.860317128213
+30
+27.8714369630177
+11
+792.00721584731
+21
+-595.005500745675
+31
+23.3578380039372
+12
+792.574093434967
+22
+-584.829110641297
+32
+23.3578380063606
+13
+792.574093434967
+23
+-584.829110641297
+33
+23.3578380063606
+70
+0
+ 0
+3DFACE
+ 8
+leg_half
+10
+458.222252930963
+20
+-760.983658189012
+30
+122.358116586891
+11
+455.006112926336
+21
+-744.320489807817
+31
+149.585310783685
+12
+455.006107255299
+22
+-761.852698834952
+32
+122.846524872111
+13
+455.006107255299
+23
+-761.852698834952
+33
+122.846524872111
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006112926336
+20
+-744.320489807817
+30
+149.585310783685
+11
+458.222252930963
+21
+-760.983658189012
+31
+122.358116586891
+12
+458.222258577851
+22
+-743.526108574926
+32
+148.983037664963
+13
+458.222258577851
+23
+-743.526108574926
+33
+148.983037664963
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+455.006107255299
+20
+-761.852698834952
+30
+122.846524872111
+11
+451.683344551435
+21
+-744.752057529093
+31
+149.912511141786
+12
+451.683338867278
+22
+-762.324827081794
+32
+123.111865415064
+13
+451.683338867278
+23
+-762.324827081794
+33
+123.111865415064
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683344551435
+20
+-744.752057529093
+30
+149.912511141786
+11
+455.006107255299
+21
+-761.852698834952
+31
+122.846524872111
+12
+455.006112926336
+22
+-744.320489807817
+32
+149.585310783685
+13
+455.006112926336
+23
+-744.320489807817
+33
+149.585310783685
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+451.683338867278
+20
+-762.324827081794
+30
+123.111865415064
+11
+448.317783384355
+21
+-744.812521381181
+31
+149.958353264626
+12
+448.31777769836
+22
+-762.390973409752
+32
+123.149041059795
+13
+448.31777769836
+23
+-762.390973409752
+33
+123.149041059795
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.317783384355
+20
+-744.812521381181
+30
+149.958353264626
+11
+451.683338867278
+21
+-762.324827081794
+31
+123.111865415064
+12
+451.683344551435
+22
+-744.752057529093
+32
+149.912511141786
+13
+451.683344551435
+23
+-744.752057529093
+33
+149.912511141786
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.31777769836
+20
+-762.390973409752
+30
+123.149041059795
+11
+6.30894498883872e-05
+21
+-744.812573256956
+31
+149.958459378386
+12
+5.74034615733243e-05
+22
+-762.391004206896
+32
+123.149179321074
+13
+5.74034615733243e-05
+23
+-762.391004206896
+33
+123.149179321074
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+6.30894498883872e-05
+20
+-744.812573256956
+30
+149.958459378386
+11
+448.31777769836
+21
+-762.390973409752
+31
+123.149041059795
+12
+448.317783384355
+22
+-744.812521381181
+32
+149.958353264626
+13
+448.317783384355
+23
+-744.812521381181
+33
+149.958353264626
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+461.269937419119
+20
+-549.571376162653
+30
+239.686382351024
+11
+464.090746745054
+21
+-581.165076540648
+31
+236.786190394896
+12
+464.090727919739
+22
+-549.540509167097
+32
+237.849027336606
+13
+464.090727919739
+23
+-549.540509167097
+33
+237.849027336606
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+464.090746745054
+20
+-581.165076540648
+30
+236.786190394896
+11
+461.269937419119
+21
+-549.571376162653
+31
+239.686382351024
+12
+461.269956337624
+22
+-581.352493258009
+32
+238.618284093782
+13
+461.269956337624
+23
+-581.352493258009
+33
+238.618284093782
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.133302212101
+20
+-683.695422993079
+30
+134.072835602987
+11
+454.667769896794
+21
+-665.362499898554
+31
+150.056742450276
+12
+602.13330076513
+22
+-665.362464994464
+32
+150.056725386733
+13
+602.13330076513
+23
+-665.362464994464
+33
+150.056725386733
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.667769896794
+20
+-665.362499898554
+30
+150.056742450276
+11
+602.133302212101
+21
+-683.695422993079
+31
+134.072835602987
+12
+454.667771343765
+22
+-683.695448366281
+32
+134.072860976189
+13
+454.667771343765
+23
+-683.695448366281
+33
+134.072860976189
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546368087822
+20
+-683.011825308716
+30
+133.389237918693
+11
+602.13330076513
+21
+-665.362464994464
+31
+150.056725386733
+12
+623.546366648706
+22
+-664.778393037384
+32
+149.286354566558
+13
+623.546366648706
+23
+-664.778393037384
+33
+149.286354566558
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+602.13330076513
+20
+-665.362464994464
+30
+150.056725386733
+11
+623.546368087822
+21
+-683.011825308716
+31
+133.389237918693
+12
+602.133302212101
+22
+-683.695422993079
+32
+134.072835602987
+13
+602.133302212101
+23
+-683.695422993079
+33
+134.072835602987
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+644.636264956545
+20
+-680.297547066858
+30
+130.674959677109
+11
+623.546366648706
+21
+-664.778393037384
+31
+149.286354566558
+12
+644.636263548619
+22
+-662.459295238253
+32
+146.227531781659
+13
+644.636263548619
+23
+-662.459295238253
+33
+146.227531781659
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+623.546366648706
+20
+-664.778393037384
+30
+149.286354566558
+11
+644.636264956545
+21
+-680.297547066858
+31
+130.674959677109
+12
+623.546368087822
+22
+-683.011825308716
+32
+133.389237918693
+13
+623.546368087822
+23
+-683.011825308716
+33
+133.389237918693
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+450.471101097006
+20
+-603.912334485117
+30
+197.802609624747
+11
+452.246977834961
+21
+-577.321948654809
+31
+199.217284688636
+12
+452.246991021541
+22
+-603.175034087969
+32
+194.771794391524
+13
+452.246991021541
+23
+-603.175034087969
+33
+194.771794391524
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246977834961
+20
+-577.321948654809
+30
+199.217284688636
+11
+450.471101097006
+21
+-603.912334485117
+31
+197.802609624747
+12
+450.471087696265
+22
+-577.639374325348
+32
+202.320298229792
+13
+450.471087696265
+23
+-577.639374325348
+33
+202.320298229792
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.642020846985
+20
+-186.86272
+30
+220.692200425201
+11
+473.10170430358
+21
+-549.308104906071
+31
+224.014968929071
+12
+473.642020846985
+22
+-549.252284780773
+32
+220.6922004252
+13
+473.642020846985
+23
+-549.252284780773
+33
+220.6922004252
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+473.10170430358
+20
+-549.308104906071
+30
+224.014968929071
+11
+473.642020846985
+21
+-186.86272
+31
+220.692200425201
+12
+473.10170430358
+22
+-186.86272
+32
+224.014968929072
+13
+473.10170430358
+23
+-186.86272
+33
+224.014968929072
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677463405893
+20
+-186.86272
+30
+230.27885636425
+11
+472.107150072447
+21
+-549.362133988305
+31
+227.231114817978
+12
+472.107150072447
+22
+-186.86272
+32
+227.231114817978
+13
+472.107150072447
+23
+-186.86272
+33
+227.231114817978
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107150072447
+20
+-549.362133988305
+30
+227.231114817978
+11
+470.677463405893
+21
+-186.86272
+31
+230.27885636425
+12
+470.677463405893
+22
+-549.413334136112
+32
+230.27885636425
+13
+470.677463405893
+23
+-549.413334136112
+33
+230.27885636425
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677463405893
+20
+-186.86272
+30
+230.27885636425
+11
+468.840108391474
+21
+-549.460721801574
+31
+233.09964686487
+12
+470.677463405893
+22
+-549.413334136112
+32
+230.27885636425
+13
+470.677463405893
+23
+-549.413334136112
+33
+230.27885636425
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840108391474
+20
+-549.460721801574
+30
+233.09964686487
+11
+470.677463405893
+21
+-186.86272
+31
+230.27885636425
+12
+468.840108391474
+22
+-186.86272
+32
+233.09964686487
+13
+468.840108391474
+23
+-186.86272
+33
+233.09964686487
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+466.630380370588
+20
+-186.86272
+30
+235.63929931572
+11
+468.840108391474
+21
+-549.460721801574
+31
+233.09964686487
+12
+468.840108391474
+22
+-186.86272
+32
+233.09964686487
+13
+468.840108391474
+23
+-186.86272
+33
+233.09964686487
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+468.840108391474
+20
+-549.460721801574
+30
+233.09964686487
+11
+466.630380370588
+21
+-186.86272
+31
+235.63929931572
+12
+466.630380370588
+22
+-549.503386674047
+32
+235.63929931572
+13
+466.630380370588
+23
+-549.503386674047
+33
+235.63929931572
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690607723364
+20
+-632.698039036468
+30
+198.308899357094
+11
+436.335601310833
+21
+-606.385574583813
+31
+207.969323546969
+12
+439.690596528004
+22
+-606.087584234742
+32
+206.744381898986
+13
+439.690596528004
+23
+-606.087584234742
+33
+206.744381898986
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335601310833
+20
+-606.385574583813
+30
+207.969323546969
+11
+439.690607723364
+21
+-632.698039036468
+31
+198.308899357094
+12
+436.335612575248
+22
+-633.16016763801
+32
+199.481809374145
+13
+436.335612575248
+23
+-633.16016763801
+33
+199.481809374145
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+732.466058322552
+20
+-599.989404866694
+30
+115.292482897529
+11
+744.275046789786
+21
+-580.758079568763
+31
+102.623043056121
+12
+744.275052115393
+22
+-593.416610482006
+32
+98.6103038030606
+13
+744.275052115393
+23
+-593.416610482006
+33
+98.6103038030606
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+744.275046789786
+20
+-580.758079568763
+30
+102.623043056121
+11
+732.466058322552
+21
+-599.989404866694
+31
+115.292482897529
+12
+732.466052014781
+22
+-584.996349297051
+32
+120.045263691758
+13
+732.466052014781
+23
+-584.996349297051
+33
+120.045263691758
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+472.107195414063
+20
+-638.12348215123
+30
+212.079066347413
+11
+470.677518140403
+21
+-666.658744301589
+31
+201.891525102388
+12
+472.10720415349
+22
+-665.162054034067
+32
+199.228411696097
+13
+472.10720415349
+23
+-665.162054034067
+33
+199.228411696097
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+470.677518140403
+20
+-666.658744301589
+30
+201.891525102388
+11
+472.107195414063
+21
+-638.12348215123
+31
+212.079066347413
+12
+470.677509279169
+22
+-639.24331958749
+32
+214.92128705308
+13
+470.677509279169
+23
+-639.24331958749
+33
+214.92128705308
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+4.80447490185498e-05
+20
+-643.817211330157
+30
+226.529683259707
+11
+448.31777769836
+21
+-672.771628457813
+31
+212.76838602076
+12
+448.317768339636
+22
+-643.81703834892
+32
+226.52966896396
+13
+448.317768339636
+23
+-643.81703834892
+33
+226.52966896396
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+448.31777769836
+20
+-672.771628457813
+30
+212.76838602076
+11
+4.80447490185498e-05
+21
+-643.817211330157
+31
+226.529683259707
+12
+5.74034615733243e-05
+22
+-672.771766719091
+32
+212.768416817903
+13
+5.74034615733243e-05
+23
+-672.771766719091
+33
+212.768416817903
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335620774804
+20
+-658.528453423172
+30
+187.424993609851
+11
+432.838940960221
+21
+-633.447412164356
+31
+200.210851816573
+12
+436.335612575248
+22
+-633.16016763801
+32
+199.481809374145
+13
+436.335612575248
+23
+-633.16016763801
+33
+199.481809374145
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+432.838940960221
+20
+-633.447412164356
+30
+200.210851816573
+11
+436.335620774804
+21
+-658.528453423172
+31
+187.424993609851
+12
+432.838949191021
+22
+-658.912362146436
+32
+188.108094342889
+13
+432.838949191021
+23
+-658.912362146436
+33
+188.108094342889
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690615872653
+20
+-657.910807757804
+30
+186.325996375185
+11
+436.335612575248
+21
+-633.16016763801
+31
+199.481809374145
+12
+439.690607723364
+22
+-632.698039036468
+32
+198.308899357094
+13
+439.690607723364
+23
+-632.698039036468
+33
+198.308899357094
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+436.335612575248
+20
+-633.16016763801
+30
+199.481809374145
+11
+439.690615872653
+21
+-657.910807757804
+31
+186.325996375185
+12
+436.335620774804
+22
+-658.528453423172
+32
+187.424993609851
+13
+436.335620774804
+23
+-658.528453423172
+33
+187.424993609851
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839485482368
+20
+-657.071290040049
+30
+184.832214227177
+11
+439.690607723364
+21
+-632.698039036468
+31
+198.308899357094
+12
+442.839477401402
+22
+-632.069903787681
+32
+196.714653208256
+13
+442.839477401402
+23
+-632.069903787681
+33
+196.714653208256
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+439.690607723364
+20
+-632.698039036468
+30
+198.308899357094
+11
+442.839485482368
+21
+-657.071290040049
+31
+184.832214227177
+12
+439.690615872653
+22
+-657.910807757804
+32
+186.325996375185
+13
+439.690615872653
+23
+-657.910807757804
+33
+186.325996375185
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+445.721740244506
+20
+-656.026027291755
+30
+182.972342518915
+11
+442.839477401402
+21
+-632.069903787681
+31
+196.714653208256
+12
+445.721732248607
+22
+-631.28782828485
+32
+194.729696180594
+13
+445.721732248607
+23
+-631.28782828485
+33
+194.729696180594
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+442.839477401402
+20
+-632.069903787681
+30
+196.714653208256
+11
+445.721740244506
+21
+-656.026027291755
+31
+182.972342518915
+12
+442.839485482368
+22
+-657.071290040049
+32
+184.832214227177
+13
+442.839485482368
+23
+-657.071290040049
+33
+184.832214227177
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575566723046
+20
+-650.239827098532
+30
+172.676755002411
+11
+454.431263343628
+21
+-625.680128816835
+31
+180.496989380173
+12
+454.431270729568
+22
+-648.531199395009
+32
+169.63653352158
+13
+454.431270729568
+23
+-648.531199395009
+33
+169.63653352158
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431263343628
+20
+-625.680128816835
+30
+180.496989380173
+11
+453.575566723046
+21
+-650.239827098532
+31
+172.676755002411
+12
+453.575559198051
+22
+-626.958539673324
+32
+183.741680540481
+13
+453.575559198051
+23
+-626.958539673324
+33
+183.741680540481
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+452.246960920592
+20
+-548.907571431286
+30
+200.172233713933
+11
+453.575519157163
+21
+-186.86272
+31
+196.84465290436
+12
+453.575519157163
+22
+-548.851670228397
+32
+196.84465290436
+13
+453.575519157163
+23
+-548.851670228397
+33
+196.84465290436
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575519157163
+20
+-186.86272
+30
+196.84465290436
+11
+452.246960920592
+21
+-548.907571431286
+31
+200.172233713933
+12
+452.246960920592
+22
+-186.86272
+32
+200.172233713933
+13
+452.246960920592
+23
+-186.86272
+33
+200.172233713933
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+453.575519157163
+20
+-548.851670228397
+30
+196.84465290436
+11
+454.431223909685
+21
+-186.86272
+31
+193.36533825795
+12
+454.431223909685
+22
+-548.793220154026
+32
+193.36533825795
+13
+454.431223909685
+23
+-548.793220154026
+33
+193.36533825795
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431223909685
+20
+-186.86272
+30
+193.36533825795
+11
+453.575519157163
+21
+-548.851670228397
+31
+196.84465290436
+12
+453.575519157163
+22
+-186.86272
+32
+196.84465290436
+13
+453.575519157163
+23
+-186.86272
+33
+196.84465290436
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.431223909685
+20
+-548.793220154026
+30
+193.36533825795
+11
+454.797637205561
+21
+-186.86272
+31
+189.801126938625
+12
+454.797637205561
+22
+-548.733344026199
+32
+189.801126938624
+13
+454.797637205561
+23
+-548.733344026199
+33
+189.801126938624
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797637205561
+20
+-186.86272
+30
+189.801126938625
+11
+454.431223909685
+21
+-548.793220154026
+31
+193.36533825795
+12
+454.431223909685
+22
+-186.86272
+32
+193.36533825795
+13
+454.431223909685
+23
+-186.86272
+33
+193.36533825795
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.797637205561
+20
+-548.733344026199
+30
+189.801126938624
+11
+454.66772029492
+21
+-186.86272
+31
+186.220486963908
+12
+454.66772029492
+22
+-548.673192057237
+32
+186.220486963908
+13
+454.66772029492
+23
+-548.673192057237
+33
+186.220486963908
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+454.66772029492
+20
+-186.86272
+30
+186.220486963908
+11
+454.797637205561
+21
+-548.733344026199
+31
+189.801126938624
+12
+454.797637205561
+22
+-186.86272
+32
+189.801126938625
+13
+454.797637205561
+23
+-186.86272
+33
+189.801126938625
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+56.126785226813
+20
+-233.578399999998
+30
+1315.22236639941
+11
+18.7226850109546
+21
+-233.578399999999
+31
+268.426375476513
+12
+18.7226850109546
+22
+-233.578399999998
+32
+1315.22236639941
+13
+18.7226850109546
+23
+-233.578399999998
+33
+1315.22236639941
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109546
+20
+-233.578399999999
+30
+268.426375476513
+11
+56.126785226813
+21
+-233.578399999998
+31
+1315.22236639941
+12
+56.126785226813
+22
+-233.578399999998
+32
+268.426375476513
+13
+56.126785226813
+23
+-233.578399999998
+33
+268.426375476513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109544
+20
+-186.862719999999
+30
+268.426375476513
+11
+56.126785226813
+21
+-233.578399999998
+31
+268.426375476513
+12
+56.1267852268127
+22
+-186.862719999999
+32
+268.426375476513
+13
+56.1267852268127
+23
+-186.862719999999
+33
+268.426375476513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+56.126785226813
+20
+-233.578399999998
+30
+268.426375476513
+11
+18.7226850109544
+21
+-186.862719999999
+31
+268.426375476513
+12
+18.7226850109546
+22
+-233.578399999999
+32
+268.426375476513
+13
+18.7226850109546
+23
+-233.578399999999
+33
+268.426375476513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109544
+20
+-186.862719999999
+30
+1315.22236639941
+11
+18.7226850109546
+21
+-233.578399999999
+31
+268.426375476513
+12
+18.7226850109544
+22
+-186.862719999999
+32
+268.426375476513
+13
+18.7226850109544
+23
+-186.862719999999
+33
+268.426375476513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109546
+20
+-233.578399999999
+30
+268.426375476513
+11
+18.7226850109544
+21
+-186.862719999999
+31
+1315.22236639941
+12
+18.7226850109546
+22
+-233.578399999998
+32
+1315.22236639941
+13
+18.7226850109546
+23
+-233.578399999998
+33
+1315.22236639941
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+56.126785226813
+20
+-233.578399999998
+30
+1315.22236639941
+11
+18.7226850109544
+21
+-186.862719999999
+31
+1315.22236639941
+12
+56.1267852268127
+22
+-186.862719999999
+32
+1315.22236639941
+13
+56.1267852268127
+23
+-186.862719999999
+33
+1315.22236639941
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+18.7226850109544
+20
+-186.862719999999
+30
+1315.22236639941
+11
+56.126785226813
+21
+-233.578399999998
+31
+1315.22236639941
+12
+18.7226850109546
+22
+-233.578399999998
+32
+1315.22236639941
+13
+18.7226850109546
+23
+-233.578399999998
+33
+1315.22236639941
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+56.126785226813
+20
+-233.578399999998
+30
+1315.22236639941
+11
+56.1267852268127
+21
+-186.862719999999
+31
+268.426375476513
+12
+56.126785226813
+22
+-233.578399999998
+32
+268.426375476513
+13
+56.126785226813
+23
+-233.578399999998
+33
+268.426375476513
+70
+1
+ 0
+3DFACE
+ 8
+leg_half
+10
+56.1267852268127
+20
+-186.862719999999
+30
+268.426375476513
+11
+56.126785226813
+21
+-233.578399999998
+31
+1315.22236639941
+12
+56.1267852268127
+22
+-186.862719999999
+32
+1315.22236639941
+13
+56.1267852268127
+23
+-186.862719999999
+33
+1315.22236639941
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-794.16656
+30
+2070.08261515828
+11
+1071.44060782234
+21
+-804.053109826237
+31
+2084.86773745469
+12
+1080.07459980683
+22
+-800.976532807249
+32
+2069.41239686438
+13
+1080.07459980683
+23
+-800.976532807249
+33
+2069.41239686438
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-804.053109826237
+30
+2084.86773745469
+11
+1080.07459980683
+21
+-794.16656
+31
+2070.08261515828
+12
+1071.44060782234
+22
+-794.16656
+32
+2085.84074377127
+13
+1071.44060782234
+23
+-794.16656
+33
+2085.84074377127
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-794.16656
+30
+2085.84074377127
+11
+1059.82120360007
+21
+-806.749751362303
+31
+2098.41445288964
+12
+1071.44060782234
+22
+-804.053109826237
+32
+2084.86773745469
+13
+1071.44060782234
+23
+-804.053109826237
+33
+2084.86773745469
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-806.749751362303
+30
+2098.41445288964
+11
+1071.44060782234
+21
+-794.16656
+31
+2085.84074377127
+12
+1059.82120360007
+22
+-794.16656
+32
+2099.6528550515
+13
+1059.82120360007
+23
+-794.16656
+33
+2099.6528550515
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-808.96283299496
+30
+2109.5319806407
+11
+1059.82120360007
+21
+-794.16656
+31
+2099.6528550515
+12
+1045.6629890274
+22
+-794.16656
+32
+2110.98818804762
+13
+1045.6629890274
+23
+-794.16656
+33
+2110.98818804762
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-794.16656
+30
+2099.6528550515
+11
+1045.6629890274
+21
+-808.96283299496
+31
+2109.5319806407
+12
+1059.82120360007
+22
+-806.749751362303
+32
+2098.41445288964
+13
+1059.82120360007
+23
+-806.749751362303
+33
+2098.41445288964
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-810.607297088473
+30
+2117.79302936366
+11
+1045.6629890274
+21
+-794.16656
+31
+2110.98818804762
+12
+1029.5099682249
+22
+-794.16656
+32
+2119.41108028308
+13
+1029.5099682249
+23
+-794.16656
+33
+2119.41108028308
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-794.16656
+30
+2110.98818804762
+11
+1029.5099682249
+21
+-810.607297088473
+31
+2117.79302936366
+12
+1045.6629890274
+22
+-808.96283299496
+32
+2109.5319806407
+13
+1045.6629890274
+23
+-808.96283299496
+33
+2109.5319806407
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-811.619948505454
+30
+2122.88013508281
+11
+1029.5099682249
+21
+-794.16656
+31
+2119.41108028308
+12
+1011.98285238754
+22
+-794.16656
+32
+2124.59784829519
+13
+1011.98285238754
+23
+-794.16656
+33
+2124.59784829519
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-794.16656
+30
+2119.41108028308
+11
+1011.98285238754
+21
+-811.619948505454
+31
+2122.88013508281
+12
+1029.5099682249
+22
+-810.607297088473
+32
+2117.79302936366
+13
+1029.5099682249
+23
+-810.607297088473
+33
+2117.79302936366
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-811.961287013471
+30
+2124.59486637848
+11
+1011.98285238754
+21
+-794.16656
+31
+2124.59784829519
+12
+993.755281646067
+22
+-794.16656
+32
+2126.34617316296
+13
+993.755281646067
+23
+-794.16656
+33
+2126.34617316296
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-794.16656
+30
+2124.59784829519
+11
+993.755281646067
+21
+-811.961287013471
+31
+2124.59486637848
+12
+1011.98285238754
+22
+-811.619948505454
+32
+2122.88013508281
+13
+1011.98285238754
+23
+-811.619948505454
+33
+2122.88013508281
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+993.755281646067
+21
+-794.16656
+31
+2245.84761107459
+12
+947.039601646067
+22
+-794.16656
+32
+2245.84761107459
+13
+947.039601646067
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-794.16656
+30
+2245.84761107459
+11
+947.039601646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+993.755281646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+993.755281646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+900.323921646066
+21
+-794.16656
+31
+2200.28420494853
+12
+900.323921646066
+22
+-826.396760603478
+32
+2197.11219961575
+13
+900.323921646066
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-794.16656
+30
+2200.28420494853
+11
+947.039601646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+947.039601646067
+22
+-794.16656
+32
+2245.84761107459
+13
+947.039601646067
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-794.16656
+30
+2200.28420494853
+11
+853.608241646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+900.323921646066
+22
+-826.396760603478
+32
+2197.11219961575
+13
+900.323921646066
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+900.323921646066
+21
+-794.16656
+31
+2200.28420494853
+12
+853.608241646067
+22
+-794.16656
+32
+2245.84761107459
+13
+853.608241646067
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+806.892561646067
+21
+-794.16656
+31
+2200.28420494853
+12
+806.892561646067
+22
+-826.396760603478
+32
+2197.11219961575
+13
+806.892561646067
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-794.16656
+30
+2200.28420494853
+11
+853.608241646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+853.608241646067
+22
+-794.16656
+32
+2245.84761107459
+13
+853.608241646067
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-794.16656
+30
+2200.28420494853
+11
+760.176881646066
+21
+-835.292444325637
+31
+2241.80011766922
+12
+806.892561646067
+22
+-826.396760603478
+32
+2197.11219961575
+13
+806.892561646067
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-835.292444325637
+30
+2241.80011766922
+11
+806.892561646067
+21
+-794.16656
+31
+2200.28420494853
+12
+760.176881646066
+22
+-794.16656
+32
+2245.84761107459
+13
+760.176881646066
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-835.292444325637
+30
+2241.80011766922
+11
+713.461201646067
+21
+-794.16656
+31
+2200.28420494853
+12
+713.461201646067
+22
+-826.396760603478
+32
+2197.11219961575
+13
+713.461201646067
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-794.16656
+30
+2200.28420494853
+11
+760.176881646066
+21
+-835.292444325637
+31
+2241.80011766922
+12
+760.176881646066
+22
+-794.16656
+32
+2245.84761107459
+13
+760.176881646066
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-794.16656
+30
+2200.28420494853
+11
+666.745521646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+713.461201646067
+22
+-826.396760603478
+32
+2197.11219961575
+13
+713.461201646067
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+713.461201646067
+21
+-794.16656
+31
+2200.28420494853
+12
+666.745521646067
+22
+-794.16656
+32
+2245.84761107459
+13
+666.745521646067
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-835.292444325637
+30
+2241.80011766922
+11
+666.745521646067
+21
+-794.16656
+31
+2245.84761107459
+12
+635.537064906387
+22
+-794.16656
+32
+2245.84761107459
+13
+635.537064906387
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-794.16656
+30
+2245.84761107459
+11
+635.537064906387
+21
+-835.292444325637
+31
+2241.80011766922
+12
+666.745521646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+666.745521646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-826.396760603478
+30
+2197.11219961575
+11
+635.537064906387
+21
+-794.16656
+31
+2200.28420494853
+12
+200.646177778547
+22
+-794.16656
+32
+2200.28420494853
+13
+200.646177778547
+23
+-794.16656
+33
+2200.28420494853
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-794.16656
+30
+2200.28420494853
+11
+200.646177778547
+21
+-826.396760603478
+31
+2197.11219961575
+12
+635.537064906387
+22
+-826.396760603478
+32
+2197.11219961575
+13
+635.537064906387
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-810.693774595514
+30
+2118.22745350336
+11
+200.646177778547
+21
+-794.16656
+31
+2119.85401529483
+12
+97.3015169041444
+22
+-794.16656
+32
+2119.85401529483
+13
+97.3015169041444
+23
+-794.16656
+33
+2119.85401529483
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-794.16656
+30
+2119.85401529483
+11
+97.3015169041444
+21
+-810.693774595514
+31
+2118.22745350336
+12
+200.646177778547
+22
+-810.693774595514
+32
+2118.22745350336
+13
+200.646177778547
+23
+-810.693774595514
+33
+2118.22745350336
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-820.853629053581
+30
+2169.2659973228
+11
+97.3015169041444
+21
+-794.16656
+31
+2171.89246330095
+12
+45.3075256523042
+22
+-794.16656
+32
+2171.89246330095
+13
+45.3075256523042
+23
+-794.16656
+33
+2171.89246330095
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-794.16656
+30
+2171.89246330095
+11
+45.3075256523042
+21
+-820.853629053581
+31
+2169.2659973228
+12
+97.3015169041444
+22
+-820.853629053581
+32
+2169.2659973228
+13
+97.3015169041444
+23
+-820.853629053581
+33
+2169.2659973228
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-794.16656
+30
+2052.98408188445
+11
+1080.07459980683
+21
+-800.976532807249
+31
+2069.41239686438
+12
+1085.39140477935
+22
+-797.638258585694
+32
+2052.64240711292
+13
+1085.39140477935
+23
+-797.638258585694
+33
+2052.64240711292
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-800.976532807249
+30
+2069.41239686438
+11
+1085.39140477935
+21
+-794.16656
+31
+2052.98408188445
+12
+1080.07459980683
+22
+-794.16656
+32
+2070.08261515828
+13
+1080.07459980683
+23
+-794.16656
+33
+2070.08261515828
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-800.976532807249
+30
+2069.41239686438
+11
+1071.44060782234
+21
+-813.559725087093
+31
+2081.98611059205
+12
+1080.07459980683
+22
+-807.524802178593
+32
+2067.42749809583
+13
+1080.07459980683
+23
+-807.524802178593
+33
+2067.42749809583
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-813.559725087093
+30
+2081.98611059205
+11
+1080.07459980683
+21
+-800.976532807249
+31
+2069.41239686438
+12
+1071.44060782234
+22
+-804.053109826237
+32
+2084.86773745469
+13
+1071.44060782234
+23
+-804.053109826237
+33
+2084.86773745469
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-804.053109826237
+30
+2084.86773745469
+11
+1059.82120360007
+21
+-818.84937773729
+31
+2094.74683750463
+12
+1071.44060782234
+22
+-813.559725087093
+32
+2081.98611059205
+13
+1071.44060782234
+23
+-813.559725087093
+33
+2081.98611059205
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-818.84937773729
+30
+2094.74683750463
+11
+1071.44060782234
+21
+-804.053109826237
+31
+2084.86773745469
+12
+1059.82120360007
+22
+-806.749751362303
+32
+2098.41445288964
+13
+1059.82120360007
+23
+-806.749751362303
+33
+2098.41445288964
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-808.96283299496
+30
+2109.5319806407
+11
+1059.82120360007
+21
+-818.84937773729
+31
+2094.74683750463
+12
+1059.82120360007
+22
+-806.749751362303
+32
+2098.41445288964
+13
+1059.82120360007
+23
+-806.749751362303
+33
+2098.41445288964
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-818.84937773729
+30
+2094.74683750463
+11
+1045.6629890274
+21
+-808.96283299496
+31
+2109.5319806407
+12
+1045.6629890274
+22
+-823.19049351657
+32
+2105.21931965394
+13
+1045.6629890274
+23
+-823.19049351657
+33
+2105.21931965394
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-810.607297088473
+30
+2117.79302936366
+11
+1045.6629890274
+21
+-823.19049351657
+31
+2105.21931965394
+12
+1045.6629890274
+22
+-808.96283299496
+32
+2109.5319806407
+13
+1045.6629890274
+23
+-808.96283299496
+33
+2109.5319806407
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-823.19049351657
+30
+2105.21931965394
+11
+1029.5099682249
+21
+-810.607297088473
+31
+2117.79302936366
+12
+1029.5099682249
+22
+-826.416225870708
+32
+2113.00105739483
+13
+1029.5099682249
+23
+-826.416225870708
+33
+2113.00105739483
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-811.619948505454
+30
+2122.88013508281
+11
+1029.5099682249
+21
+-826.416225870708
+31
+2113.00105739483
+12
+1029.5099682249
+22
+-810.607297088473
+32
+2117.79302936366
+13
+1029.5099682249
+23
+-810.607297088473
+33
+2117.79302936366
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-826.416225870708
+30
+2113.00105739483
+11
+1011.98285238754
+21
+-811.619948505454
+31
+2122.88013508281
+12
+1011.98285238754
+22
+-828.402613078617
+32
+2117.79300620111
+13
+1011.98285238754
+23
+-828.402613078617
+33
+2117.79300620111
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-811.961287013471
+30
+2124.59486637848
+11
+1011.98285238754
+21
+-828.402613078617
+31
+2117.79300620111
+12
+1011.98285238754
+22
+-811.619948505454
+32
+2122.88013508281
+13
+1011.98285238754
+23
+-811.619948505454
+33
+2122.88013508281
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-828.402613078617
+30
+2117.79300620111
+11
+993.755281646067
+21
+-811.961287013471
+31
+2124.59486637848
+12
+993.755281646067
+22
+-829.072172647213
+32
+2119.40824776262
+13
+993.755281646067
+23
+-829.072172647213
+33
+2119.40824776262
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+993.755281646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+947.039601646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+947.039601646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+947.039601646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+993.755281646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+993.755281646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+900.323921646066
+21
+-826.396760603478
+31
+2197.11219961575
+12
+900.323921646066
+22
+-857.388372672667
+32
+2187.71808200347
+13
+900.323921646066
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-826.396760603478
+30
+2197.11219961575
+11
+947.039601646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+947.039601646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+947.039601646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-826.396760603478
+30
+2197.11219961575
+11
+853.608241646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+900.323921646066
+22
+-857.388372672667
+32
+2187.71808200347
+13
+900.323921646066
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+900.323921646066
+21
+-826.396760603478
+31
+2197.11219961575
+12
+853.608241646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+853.608241646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+806.892561646067
+21
+-826.396760603478
+31
+2197.11219961575
+12
+806.892561646067
+22
+-857.388372672667
+32
+2187.71808200347
+13
+806.892561646067
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-826.396760603478
+30
+2197.11219961575
+11
+853.608241646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+853.608241646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+853.608241646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-826.396760603478
+30
+2197.11219961575
+11
+760.176881646066
+21
+-874.837883980304
+31
+2229.81318035484
+12
+806.892561646067
+22
+-857.388372672667
+32
+2187.71808200347
+13
+806.892561646067
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-874.837883980304
+30
+2229.81318035484
+11
+806.892561646067
+21
+-826.396760603478
+31
+2197.11219961575
+12
+760.176881646066
+22
+-835.292444325637
+32
+2241.80011766922
+13
+760.176881646066
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-874.837883980304
+30
+2229.81318035484
+11
+713.461201646067
+21
+-826.396760603478
+31
+2197.11219961575
+12
+713.461201646067
+22
+-857.388372672667
+32
+2187.71808200347
+13
+713.461201646067
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-826.396760603478
+30
+2197.11219961575
+11
+760.176881646066
+21
+-874.837883980304
+31
+2229.81318035484
+12
+760.176881646066
+22
+-835.292444325637
+32
+2241.80011766922
+13
+760.176881646066
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-826.396760603478
+30
+2197.11219961575
+11
+666.745521646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+713.461201646067
+22
+-857.388372672667
+32
+2187.71808200347
+13
+713.461201646067
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+713.461201646067
+21
+-826.396760603478
+31
+2197.11219961575
+12
+666.745521646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+666.745521646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-874.837883980304
+30
+2229.81318035484
+11
+666.745521646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+635.537064906387
+22
+-835.292444325637
+32
+2241.80011766922
+13
+635.537064906387
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+635.537064906387
+21
+-874.837883980304
+31
+2229.81318035484
+12
+666.745521646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+666.745521646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-857.388372672667
+30
+2187.71808200347
+11
+635.537064906387
+21
+-826.396760603478
+31
+2197.11219961575
+12
+200.646177778547
+22
+-826.396760603478
+32
+2197.11219961575
+13
+200.646177778547
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-826.396760603478
+30
+2197.11219961575
+11
+200.646177778547
+21
+-857.388372672667
+31
+2187.71808200347
+12
+635.537064906387
+22
+-857.388372672667
+32
+2187.71808200347
+13
+635.537064906387
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-826.585857602691
+30
+2113.41027598642
+11
+200.646177778547
+21
+-810.693774595514
+31
+2118.22745350336
+12
+97.3015169041444
+22
+-810.693774595514
+32
+2118.22745350336
+13
+97.3015169041444
+23
+-810.693774595514
+33
+2118.22745350336
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-810.693774595514
+30
+2118.22745350336
+11
+97.3015169041444
+21
+-826.585857602691
+31
+2113.41027598642
+12
+200.646177778547
+22
+-826.585857602691
+32
+2113.41027598642
+13
+200.646177778547
+23
+-826.585857602691
+33
+2113.41027598642
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-846.515129009712
+30
+2161.48753300293
+11
+97.3015169041444
+21
+-820.853629053581
+31
+2169.2659973228
+12
+45.3075256523042
+22
+-820.853629053581
+32
+2169.2659973228
+13
+45.3075256523042
+23
+-820.853629053581
+33
+2169.2659973228
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-820.853629053581
+30
+2169.2659973228
+11
+45.3075256523042
+21
+-846.515129009712
+31
+2161.48753300293
+12
+97.3015169041444
+22
+-846.515129009712
+32
+2161.48753300293
+13
+97.3015169041444
+23
+-846.515129009712
+33
+2161.48753300293
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-797.638258585694
+30
+2052.64240711292
+11
+1080.07459980683
+21
+-807.524802178593
+31
+2067.42749809583
+12
+1085.39140477935
+22
+-800.976541741692
+32
+2051.63051316818
+13
+1085.39140477935
+23
+-800.976541741692
+33
+2051.63051316818
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-807.524802178593
+30
+2067.42749809583
+11
+1085.39140477935
+21
+-797.638258585694
+31
+2052.64240711292
+12
+1080.07459980683
+22
+-800.976532807249
+32
+2069.41239686438
+13
+1080.07459980683
+23
+-800.976532807249
+33
+2069.41239686438
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-807.524802178593
+30
+2067.42749809583
+11
+1071.44060782234
+21
+-822.321071889464
+31
+2077.30660248764
+12
+1080.07459980683
+22
+-813.559721794402
+32
+2064.20419739918
+13
+1080.07459980683
+23
+-813.559721794402
+33
+2064.20419739918
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-822.321071889464
+30
+2077.30660248764
+11
+1080.07459980683
+21
+-807.524802178593
+31
+2067.42749809583
+12
+1071.44060782234
+22
+-813.559725087093
+32
+2081.98611059205
+13
+1071.44060782234
+23
+-813.559725087093
+33
+2081.98611059205
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-813.559725087093
+30
+2081.98611059205
+11
+1059.82120360007
+21
+-830.000457268917
+31
+2088.79095329889
+12
+1071.44060782234
+22
+-822.321071889464
+32
+2077.30660248764
+13
+1071.44060782234
+23
+-822.321071889464
+33
+2077.30660248764
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-830.000457268917
+30
+2088.79095329889
+11
+1071.44060782234
+21
+-813.559725087093
+31
+2081.98611059205
+12
+1059.82120360007
+22
+-818.84937773729
+32
+2094.74683750463
+13
+1059.82120360007
+23
+-818.84937773729
+33
+2094.74683750463
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-823.19049351657
+30
+2105.21931965394
+11
+1059.82120360007
+21
+-830.000457268917
+31
+2088.79095329889
+12
+1059.82120360007
+22
+-818.84937773729
+32
+2094.74683750463
+13
+1059.82120360007
+23
+-818.84937773729
+33
+2094.74683750463
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-830.000457268917
+30
+2088.79095329889
+11
+1045.6629890274
+21
+-823.19049351657
+31
+2105.21931965394
+12
+1045.6629890274
+22
+-836.302780549948
+32
+2098.2159382305
+13
+1045.6629890274
+23
+-836.302780549948
+33
+2098.2159382305
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-826.416225870708
+30
+2113.00105739483
+11
+1045.6629890274
+21
+-836.302780549948
+31
+2098.2159382305
+12
+1045.6629890274
+22
+-823.19049351657
+32
+2105.21931965394
+13
+1045.6629890274
+23
+-823.19049351657
+33
+2105.21931965394
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-836.302780549948
+30
+2098.2159382305
+11
+1029.5099682249
+21
+-826.416225870708
+31
+2113.00105739483
+12
+1029.5099682249
+22
+-840.985818079353
+32
+2105.21931717198
+13
+1029.5099682249
+23
+-840.985818079353
+33
+2105.21931717198
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-828.402613078617
+30
+2117.79300620111
+11
+1029.5099682249
+21
+-840.985818079353
+31
+2105.21931717198
+12
+1029.5099682249
+22
+-826.416225870708
+32
+2113.00105739483
+13
+1029.5099682249
+23
+-826.416225870708
+33
+2113.00105739483
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-840.985818079353
+30
+2105.21931717198
+11
+1011.98285238754
+21
+-828.402613078617
+31
+2117.79300620111
+12
+1011.98285238754
+22
+-843.869605331769
+32
+2109.53195716012
+13
+1011.98285238754
+23
+-843.869605331769
+33
+2109.53195716012
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-829.072172647213
+30
+2119.40824776262
+11
+1011.98285238754
+21
+-843.869605331769
+31
+2109.53195716012
+12
+1011.98285238754
+22
+-828.402613078617
+32
+2117.79300620111
+13
+1011.98285238754
+23
+-828.402613078617
+33
+2117.79300620111
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-843.869605331769
+30
+2109.53195716012
+11
+993.755281646067
+21
+-829.072172647213
+31
+2119.40824776262
+12
+993.755281646067
+22
+-844.841655162215
+32
+2110.9856361601
+13
+993.755281646067
+23
+-844.841655162215
+33
+2110.9856361601
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+993.755281646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+947.039601646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+947.039601646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+947.039601646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+993.755281646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+993.755281646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+900.323921646066
+21
+-857.388372672667
+31
+2187.71808200347
+12
+900.323921646066
+22
+-885.950405936049
+32
+2172.46286278326
+13
+900.323921646066
+23
+-885.950405936049
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-857.388372672667
+30
+2187.71808200347
+11
+947.039601646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+947.039601646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+947.039601646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-857.388372672667
+30
+2187.71808200347
+11
+853.608241646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+900.323921646066
+22
+-885.950405936049
+32
+2172.46286278326
+13
+900.323921646066
+23
+-885.950405936049
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+900.323921646066
+21
+-857.388372672667
+31
+2187.71808200347
+12
+853.608241646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+853.608241646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+806.892561646067
+21
+-857.388372672667
+31
+2187.71808200347
+12
+806.892561646067
+22
+-885.950405936049
+32
+2172.46286278326
+13
+806.892561646067
+23
+-885.950405936049
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-857.388372672667
+30
+2187.71808200347
+11
+853.608241646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+853.608241646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+853.608241646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-857.388372672667
+30
+2187.71808200347
+11
+760.176881646066
+21
+-911.283169895404
+31
+2210.34745041008
+12
+806.892561646067
+22
+-885.950405936049
+32
+2172.46286278326
+13
+806.892561646067
+23
+-885.950405936049
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-911.283169895404
+30
+2210.34745041008
+11
+806.892561646067
+21
+-857.388372672667
+31
+2187.71808200347
+12
+760.176881646066
+22
+-874.837883980304
+32
+2229.81318035484
+13
+760.176881646066
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-911.283169895404
+30
+2210.34745041008
+11
+713.461201646067
+21
+-857.388372672667
+31
+2187.71808200347
+12
+713.461201646067
+22
+-885.950405936049
+32
+2172.46286278326
+13
+713.461201646067
+23
+-885.950405936049
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-857.388372672667
+30
+2187.71808200347
+11
+760.176881646066
+21
+-911.283169895404
+31
+2210.34745041008
+12
+760.176881646066
+22
+-874.837883980304
+32
+2229.81318035484
+13
+760.176881646066
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-857.388372672667
+30
+2187.71808200347
+11
+666.745521646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+713.461201646067
+22
+-885.950405936049
+32
+2172.46286278326
+13
+713.461201646067
+23
+-885.950405936049
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+713.461201646067
+21
+-857.388372672667
+31
+2187.71808200347
+12
+666.745521646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+666.745521646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-911.283169895404
+30
+2210.34745041008
+11
+666.745521646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+635.537064906387
+22
+-874.837883980304
+32
+2229.81318035484
+13
+635.537064906387
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+635.537064906387
+21
+-911.283169895404
+31
+2210.34745041008
+12
+666.745521646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+666.745521646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-885.950405936048
+30
+2172.46286278326
+11
+635.537064906387
+21
+-857.388372672667
+31
+2187.71808200347
+12
+200.646177778547
+22
+-857.388372672667
+32
+2187.71808200347
+13
+200.646177778547
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-857.388372672667
+30
+2187.71808200347
+11
+200.646177778547
+21
+-885.950405936048
+31
+2172.46286278326
+12
+635.537064906387
+22
+-885.950405936048
+32
+2172.46286278326
+13
+635.537064906387
+23
+-885.950405936048
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-841.232085183949
+30
+2105.58760417448
+11
+200.646177778547
+21
+-826.585857602691
+31
+2113.41027598642
+12
+97.3015169041444
+22
+-826.585857602691
+32
+2113.41027598642
+13
+97.3015169041444
+23
+-826.585857602691
+33
+2113.41027598642
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-826.585857602691
+30
+2113.41027598642
+11
+97.3015169041444
+21
+-841.232085183949
+31
+2105.58760417448
+12
+200.646177778547
+22
+-841.232085183949
+32
+2105.58760417448
+13
+200.646177778547
+23
+-841.232085183949
+33
+2105.58760417448
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-870.164902816216
+30
+2148.85599236295
+11
+97.3015169041444
+21
+-846.515129009712
+31
+2161.48753300293
+12
+45.3075256523042
+22
+-846.515129009712
+32
+2161.48753300293
+13
+45.3075256523042
+23
+-846.515129009712
+33
+2161.48753300293
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-846.515129009712
+30
+2161.48753300293
+11
+45.3075256523042
+21
+-870.164902816216
+31
+2148.85599236295
+12
+97.3015169041444
+22
+-870.164902816216
+32
+2148.85599236295
+13
+97.3015169041444
+23
+-870.164902816216
+33
+2148.85599236295
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-800.976541741692
+30
+2051.63051316818
+11
+1080.07459980683
+21
+-813.559721794402
+31
+2064.20419739918
+12
+1085.39140477935
+22
+-804.053121118439
+32
+2049.98728656705
+13
+1085.39140477935
+23
+-804.053121118439
+33
+2049.98728656705
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-813.559721794402
+30
+2064.20419739918
+11
+1085.39140477935
+21
+-800.976541741692
+31
+2051.63051316818
+12
+1080.07459980683
+22
+-807.524802178593
+32
+2067.42749809583
+13
+1080.07459980683
+23
+-807.524802178593
+33
+2067.42749809583
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-813.559721794402
+30
+2064.20419739918
+11
+1071.44060782234
+21
+-830.000456589156
+31
+2071.00904401361
+12
+1080.07459980683
+22
+-818.849373078262
+32
+2059.86636441255
+13
+1080.07459980683
+23
+-818.849373078262
+33
+2059.86636441255
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-830.000456589156
+30
+2071.00904401361
+11
+1080.07459980683
+21
+-813.559721794402
+31
+2064.20419739918
+12
+1071.44060782234
+22
+-822.321071889464
+32
+2077.30660248764
+13
+1071.44060782234
+23
+-822.321071889464
+33
+2077.30660248764
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-822.321071889464
+30
+2077.30660248764
+11
+1059.82120360007
+21
+-839.774460224379
+31
+2080.77568156236
+12
+1071.44060782234
+22
+-830.000456589156
+32
+2071.00904401361
+13
+1071.44060782234
+23
+-830.000456589156
+33
+2071.00904401361
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-839.774460224379
+30
+2080.77568156236
+11
+1071.44060782234
+21
+-822.321071889464
+31
+2077.30660248764
+12
+1059.82120360007
+22
+-830.000457268917
+32
+2088.79095329889
+13
+1059.82120360007
+23
+-830.000457268917
+33
+2088.79095329889
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-830.000457268917
+30
+2088.79095329889
+11
+1045.6629890274
+21
+-847.795796257855
+31
+2088.79097239093
+12
+1059.82120360007
+22
+-839.774460224379
+32
+2080.77568156236
+13
+1059.82120360007
+23
+-839.774460224379
+33
+2080.77568156236
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-847.795796257855
+30
+2088.79097239093
+11
+1059.82120360007
+21
+-830.000457268917
+31
+2088.79095329889
+12
+1045.6629890274
+22
+-836.302780549948
+32
+2098.2159382305
+13
+1045.6629890274
+23
+-836.302780549948
+33
+2098.2159382305
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-840.985818079353
+30
+2105.21931717198
+11
+1045.6629890274
+21
+-847.795796257855
+31
+2088.79097239093
+12
+1045.6629890274
+22
+-836.302780549948
+32
+2098.2159382305
+13
+1045.6629890274
+23
+-836.302780549948
+33
+2098.2159382305
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-847.795796257855
+30
+2088.79097239093
+11
+1029.5099682249
+21
+-840.985818079353
+31
+2105.21931717198
+12
+1029.5099682249
+22
+-853.75617245655
+32
+2094.74685660782
+13
+1029.5099682249
+23
+-853.75617245655
+33
+2094.74685660782
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-843.869605331769
+30
+2109.53195716012
+11
+1029.5099682249
+21
+-853.75617245655
+31
+2094.74685660782
+12
+1029.5099682249
+22
+-840.985818079353
+32
+2105.21931717198
+13
+1029.5099682249
+23
+-840.985818079353
+33
+2105.21931717198
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-853.75617245655
+30
+2094.74685660782
+11
+1011.98285238754
+21
+-843.869605331769
+31
+2109.53195716012
+12
+1011.98285238754
+22
+-857.426537426609
+32
+2098.41445544163
+13
+1011.98285238754
+23
+-857.426537426609
+33
+2098.41445544163
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-844.841655162215
+30
+2110.9856361601
+11
+1011.98285238754
+21
+-857.426537426609
+31
+2098.41445544163
+12
+1011.98285238754
+22
+-843.869605331769
+32
+2109.53195716012
+13
+1011.98285238754
+23
+-843.869605331769
+33
+2109.53195716012
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-857.426537426609
+30
+2098.41445544163
+11
+993.755281646067
+21
+-844.841655162215
+31
+2110.9856361601
+12
+993.755281646067
+22
+-858.663722189056
+32
+2099.65070781135
+13
+993.755281646067
+23
+-858.663722189056
+33
+2099.65070781135
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-943.227730171979
+30
+2184.1509849202
+11
+993.755281646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+947.039601646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+947.039601646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+947.039601646067
+21
+-943.227730171979
+31
+2184.1509849202
+12
+993.755281646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+993.755281646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-943.227730171979
+30
+2184.1509849202
+11
+900.323921646066
+21
+-885.950405936049
+31
+2172.46286278326
+12
+900.323921646066
+22
+-910.985237473082
+32
+2151.93279147451
+13
+900.323921646066
+23
+-910.985237473082
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-885.950405936049
+30
+2172.46286278326
+11
+947.039601646067
+21
+-943.227730171979
+31
+2184.1509849202
+12
+947.039601646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+947.039601646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-885.950405936049
+30
+2172.46286278326
+11
+853.608241646067
+21
+-943.227730171979
+31
+2184.1509849202
+12
+900.323921646066
+22
+-910.985237473082
+32
+2151.93279147451
+13
+900.323921646066
+23
+-910.985237473082
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-943.227730171979
+30
+2184.1509849202
+11
+900.323921646066
+21
+-885.950405936049
+31
+2172.46286278326
+12
+853.608241646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+853.608241646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-943.227730171979
+30
+2184.1509849202
+11
+806.892561646067
+21
+-885.950405936049
+31
+2172.46286278326
+12
+806.892561646067
+22
+-910.985237473082
+32
+2151.93279147451
+13
+806.892561646067
+23
+-910.985237473082
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-885.950405936049
+30
+2172.46286278326
+11
+853.608241646067
+21
+-943.227730171979
+31
+2184.1509849202
+12
+853.608241646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+853.608241646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-885.950405936049
+30
+2172.46286278326
+11
+760.176881646066
+21
+-943.227730171979
+31
+2184.1509849202
+12
+806.892561646067
+22
+-910.985237473082
+32
+2151.93279147451
+13
+806.892561646067
+23
+-910.985237473082
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-943.227730171979
+30
+2184.1509849202
+11
+806.892561646067
+21
+-885.950405936049
+31
+2172.46286278326
+12
+760.176881646066
+22
+-911.283169895404
+32
+2210.34745041008
+13
+760.176881646066
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-943.227730171979
+30
+2184.1509849202
+11
+713.461201646067
+21
+-885.950405936049
+31
+2172.46286278326
+12
+713.461201646067
+22
+-910.985237473082
+32
+2151.93279147451
+13
+713.461201646067
+23
+-910.985237473082
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-885.950405936049
+30
+2172.46286278326
+11
+760.176881646066
+21
+-943.227730171979
+31
+2184.1509849202
+12
+760.176881646066
+22
+-911.283169895404
+32
+2210.34745041008
+13
+760.176881646066
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-885.950405936049
+30
+2172.46286278326
+11
+666.745521646067
+21
+-943.227730171979
+31
+2184.1509849202
+12
+713.461201646067
+22
+-910.985237473082
+32
+2151.93279147451
+13
+713.461201646067
+23
+-910.985237473082
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-943.227730171979
+30
+2184.1509849202
+11
+713.461201646067
+21
+-885.950405936049
+31
+2172.46286278326
+12
+666.745521646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+666.745521646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-943.227730171979
+30
+2184.1509849202
+11
+666.745521646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+635.537064906387
+22
+-911.283169895404
+32
+2210.34745041008
+13
+635.537064906387
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+635.537064906387
+21
+-943.227730171979
+31
+2184.1509849202
+12
+666.745521646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+666.745521646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-910.985237473081
+30
+2151.93279147451
+11
+635.537064906387
+21
+-885.950405936048
+31
+2172.46286278326
+12
+200.646177778547
+22
+-885.950405936048
+32
+2172.46286278326
+13
+200.646177778547
+23
+-885.950405936048
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-885.950405936048
+30
+2172.46286278326
+11
+200.646177778547
+21
+-910.985237473081
+31
+2151.93279147451
+12
+635.537064906387
+22
+-910.985237473081
+32
+2151.93279147451
+13
+635.537064906387
+23
+-910.985237473081
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-854.069611027039
+30
+2095.06005895826
+11
+200.646177778547
+21
+-841.232085183949
+31
+2105.58760417448
+12
+97.3015169041444
+22
+-841.232085183949
+32
+2105.58760417448
+13
+97.3015169041444
+23
+-841.232085183949
+33
+2105.58760417448
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-841.232085183949
+30
+2105.58760417448
+11
+97.3015169041444
+21
+-854.069611027039
+31
+2095.06005895826
+12
+200.646177778547
+22
+-854.069611027035
+32
+2095.06005895826
+13
+200.646177778547
+23
+-854.069611027035
+33
+2095.06005895826
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-890.894102928655
+30
+2131.85679842581
+11
+97.3015169041444
+21
+-870.164902816216
+31
+2148.85599236295
+12
+45.3075256523042
+22
+-870.164902816216
+32
+2148.85599236295
+13
+45.3075256523042
+23
+-870.164902816216
+33
+2148.85599236295
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-870.164902816216
+30
+2148.85599236295
+11
+45.3075256523042
+21
+-890.894102928655
+31
+2131.85679842581
+12
+97.3015169041444
+22
+-890.894102928655
+32
+2131.85679842581
+13
+97.3015169041444
+23
+-890.894102928655
+33
+2131.85679842581
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-804.053121118439
+30
+2049.98728656705
+11
+1080.07459980683
+21
+-818.849373078262
+31
+2059.86636441255
+12
+1085.39140477935
+22
+-806.74976549585
+32
+2047.77587558629
+13
+1085.39140477935
+23
+-806.74976549585
+33
+2047.77587558629
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-818.849373078262
+30
+2059.86636441255
+11
+1085.39140477935
+21
+-804.053121118439
+31
+2049.98728656705
+12
+1080.07459980683
+22
+-813.559721794402
+32
+2064.20419739918
+13
+1080.07459980683
+23
+-813.559721794402
+33
+2064.20419739918
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-818.849373078262
+30
+2059.86636441255
+11
+1071.44060782234
+21
+-836.302764738808
+31
+2063.3354468104
+12
+1080.07459980683
+22
+-823.190477697806
+32
+2054.58069962494
+13
+1080.07459980683
+23
+-823.190477697806
+33
+2054.58069962494
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-836.302764738808
+30
+2063.3354468104
+11
+1080.07459980683
+21
+-818.849373078262
+31
+2059.86636441255
+12
+1071.44060782234
+22
+-830.000456589156
+32
+2071.00904401361
+13
+1071.44060782234
+23
+-830.000456589156
+33
+2071.00904401361
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-830.000456589156
+30
+2071.00904401361
+11
+1059.82120360007
+21
+-847.795777151423
+31
+2071.00904469286
+12
+1071.44060782234
+22
+-836.302764738808
+32
+2063.3354468104
+13
+1071.44060782234
+23
+-836.302764738808
+33
+2063.3354468104
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-847.795777151423
+30
+2071.00904469286
+11
+1071.44060782234
+21
+-830.000456589156
+31
+2071.00904401361
+12
+1059.82120360007
+22
+-839.774460224379
+32
+2080.77568156236
+13
+1059.82120360007
+23
+-839.774460224379
+33
+2080.77568156236
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-839.774460224379
+30
+2080.77568156236
+11
+1045.6629890274
+21
+-857.227870491995
+31
+2077.30661828686
+12
+1059.82120360007
+22
+-847.795777151423
+32
+2071.00904469286
+13
+1059.82120360007
+23
+-847.795777151423
+33
+2071.00904469286
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-857.227870491995
+30
+2077.30661828686
+11
+1059.82120360007
+21
+-839.774460224379
+31
+2080.77568156236
+12
+1045.6629890274
+22
+-847.795796257855
+32
+2088.79097239093
+13
+1045.6629890274
+23
+-847.795796257855
+33
+2088.79097239093
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-857.227870491995
+30
+2077.30661828686
+11
+1029.5099682249
+21
+-853.75617245655
+31
+2094.74685660782
+12
+1029.5099682249
+22
+-864.236531445284
+32
+2081.98612648882
+13
+1029.5099682249
+23
+-864.236531445284
+33
+2081.98612648882
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-853.75617245655
+30
+2094.74685660782
+11
+1045.6629890274
+21
+-857.227870491995
+31
+2077.30661828686
+12
+1045.6629890274
+22
+-847.795796257855
+32
+2088.79097239093
+13
+1045.6629890274
+23
+-847.795796257855
+33
+2088.79097239093
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-864.236531445284
+30
+2081.98612648882
+11
+1011.98285238754
+21
+-857.426537426609
+31
+2098.41445544163
+12
+1011.98285238754
+22
+-868.552424065547
+32
+2084.86774040193
+13
+1011.98285238754
+23
+-868.552424065547
+33
+2084.86774040193
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-857.426537426609
+30
+2098.41445544163
+11
+1029.5099682249
+21
+-864.236531445284
+31
+2081.98612648882
+12
+1029.5099682249
+22
+-853.75617245655
+32
+2094.74685660782
+13
+1029.5099682249
+23
+-853.75617245655
+33
+2094.74685660782
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-868.552424065547
+30
+2084.86774040193
+11
+993.755281646067
+21
+-858.663722189056
+31
+2099.65070781135
+12
+993.755281646067
+22
+-870.007199443395
+32
+2085.83905765611
+13
+993.755281646067
+23
+-870.007199443395
+33
+2085.83905765611
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-858.663722189056
+30
+2099.65070781135
+11
+1011.98285238754
+21
+-868.552424065547
+31
+2084.86774040193
+12
+1011.98285238754
+22
+-857.426537426609
+32
+2098.41445544163
+13
+1011.98285238754
+23
+-857.426537426609
+33
+2098.41445544163
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+947.039601646067
+21
+-943.227730171979
+31
+2184.1509849202
+12
+947.039601646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+947.039601646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-943.227730171979
+30
+2184.1509849202
+11
+993.755281646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+993.755281646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+993.755281646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+900.323921646066
+21
+-910.985237473082
+31
+2151.93279147451
+12
+900.323921646066
+22
+-931.530792747493
+32
+2126.91682720423
+13
+900.323921646066
+23
+-931.530792747493
+33
+2126.91682720423
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-910.985237473082
+30
+2151.93279147451
+11
+947.039601646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+947.039601646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+947.039601646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-910.985237473082
+30
+2151.93279147451
+11
+853.608241646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+900.323921646066
+22
+-931.530792747493
+32
+2126.91682720423
+13
+900.323921646066
+23
+-931.530792747493
+33
+2126.91682720423
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+900.323921646066
+21
+-910.985237473082
+31
+2151.93279147451
+12
+853.608241646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+853.608241646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+806.892561646067
+21
+-910.985237473082
+31
+2151.93279147451
+12
+806.892561646067
+22
+-931.530792747493
+32
+2126.91682720423
+13
+806.892561646067
+23
+-931.530792747493
+33
+2126.91682720423
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-910.985237473082
+30
+2151.93279147451
+11
+853.608241646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+853.608241646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+853.608241646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-910.985237473082
+30
+2151.93279147451
+11
+760.176881646066
+21
+-969.443953273309
+31
+2152.23049936285
+12
+806.892561646067
+22
+-931.530792747493
+32
+2126.91682720423
+13
+806.892561646067
+23
+-931.530792747493
+33
+2126.91682720423
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-969.443953273309
+30
+2152.23049936285
+11
+806.892561646067
+21
+-910.985237473082
+31
+2151.93279147451
+12
+760.176881646066
+22
+-943.227730171979
+32
+2184.1509849202
+13
+760.176881646066
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-969.443953273309
+30
+2152.23049936285
+11
+713.461201646067
+21
+-910.985237473082
+31
+2151.93279147451
+12
+713.461201646067
+22
+-931.530792747493
+32
+2126.91682720423
+13
+713.461201646067
+23
+-931.530792747493
+33
+2126.91682720423
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-910.985237473082
+30
+2151.93279147451
+11
+760.176881646066
+21
+-969.443953273309
+31
+2152.23049936285
+12
+760.176881646066
+22
+-943.227730171979
+32
+2184.1509849202
+13
+760.176881646066
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-910.985237473082
+30
+2151.93279147451
+11
+666.745521646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+713.461201646067
+22
+-931.530792747493
+32
+2126.91682720423
+13
+713.461201646067
+23
+-931.530792747493
+33
+2126.91682720423
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+713.461201646067
+21
+-910.985237473082
+31
+2151.93279147451
+12
+666.745521646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+666.745521646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+635.537064906387
+21
+-943.227730171979
+31
+2184.1509849202
+12
+635.537064906387
+22
+-969.443953273309
+32
+2152.23049936285
+13
+635.537064906387
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-943.227730171979
+30
+2184.1509849202
+11
+666.745521646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+666.745521646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+666.745521646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-931.530792747491
+30
+2126.91682720422
+11
+200.646177778547
+21
+-910.985237473081
+31
+2151.93279147451
+12
+200.646177778547
+22
+-931.530792747491
+32
+2126.91682720422
+13
+200.646177778547
+23
+-931.530792747491
+33
+2126.91682720422
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-910.985237473081
+30
+2151.93279147451
+11
+635.537064906387
+21
+-931.530792747491
+31
+2126.91682720422
+12
+635.537064906387
+22
+-910.985237473081
+32
+2151.93279147451
+13
+635.537064906387
+23
+-910.985237473081
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-864.605096213174
+30
+2082.23220799651
+11
+97.3015169041444
+21
+-854.069611027039
+31
+2095.06005895826
+12
+97.3015169041444
+22
+-864.605096213174
+32
+2082.23220799651
+13
+97.3015169041444
+23
+-864.605096213174
+33
+2082.23220799651
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-854.069611027039
+30
+2095.06005895826
+11
+200.646177778547
+21
+-864.605096213174
+31
+2082.23220799651
+12
+200.646177778547
+22
+-854.069611027035
+32
+2095.06005895826
+13
+200.646177778547
+23
+-854.069611027035
+33
+2095.06005895826
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-907.906117811778
+30
+2111.14322068125
+11
+45.3075256523042
+21
+-890.894102928655
+31
+2131.85679842581
+12
+45.3075256523042
+22
+-907.906117811778
+32
+2111.14322068125
+13
+45.3075256523042
+23
+-907.906117811778
+33
+2111.14322068125
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-890.894102928655
+30
+2131.85679842581
+11
+97.3015169041444
+21
+-907.906117811778
+31
+2111.14322068125
+12
+97.3015169041444
+22
+-890.894102928655
+32
+2131.85679842581
+13
+97.3015169041444
+23
+-890.894102928655
+33
+2131.85679842581
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-806.74976549585
+30
+2047.77587558629
+11
+1080.07459980683
+21
+-823.190477697806
+31
+2054.58069962494
+12
+1085.39140477935
+22
+-808.9628443428
+32
+2045.0812635097
+13
+1085.39140477935
+23
+-808.9628443428
+33
+2045.0812635097
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-823.190477697806
+30
+2054.58069962494
+11
+1085.39140477935
+21
+-806.74976549585
+31
+2047.77587558629
+12
+1080.07459980683
+22
+-818.849373078262
+32
+2059.86636441255
+13
+1080.07459980683
+23
+-818.849373078262
+33
+2059.86636441255
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-823.190477697806
+30
+2054.58069962494
+11
+1071.44060782234
+21
+-840.985802170601
+31
+2054.58070291515
+12
+1080.07459980683
+22
+-826.416209437024
+32
+2048.55032816988
+13
+1080.07459980683
+23
+-826.416209437024
+33
+2048.55032816988
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-840.985802170601
+30
+2054.58070291515
+11
+1080.07459980683
+21
+-823.190477697806
+31
+2054.58069962494
+12
+1071.44060782234
+22
+-836.302764738808
+32
+2063.3354468104
+13
+1071.44060782234
+23
+-836.302764738808
+33
+2063.3354468104
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-836.302764738808
+30
+2063.3354468104
+11
+1059.82120360007
+21
+-853.75615333895
+31
+2059.86636906807
+12
+1071.44060782234
+22
+-840.985802170601
+32
+2054.58070291515
+13
+1071.44060782234
+23
+-840.985802170601
+33
+2054.58070291515
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-853.75615333895
+30
+2059.86636906807
+11
+1071.44060782234
+21
+-836.302764738808
+31
+2063.3354468104
+12
+1059.82120360007
+22
+-847.795777151423
+32
+2071.00904469286
+13
+1059.82120360007
+23
+-847.795777151423
+33
+2071.00904469286
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-853.75615333895
+30
+2059.86636906807
+11
+1045.6629890274
+21
+-857.227870491995
+31
+2077.30661828686
+12
+1045.6629890274
+22
+-864.23653392912
+32
+2064.20421320603
+13
+1045.6629890274
+23
+-864.23653392912
+33
+2064.20421320603
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-857.227870491995
+30
+2077.30661828686
+11
+1059.82120360007
+21
+-853.75615333895
+31
+2059.86636906807
+12
+1059.82120360007
+22
+-847.795777151423
+32
+2071.00904469286
+13
+1059.82120360007
+23
+-847.795777151423
+33
+2071.00904469286
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-864.23653392912
+30
+2064.20421320603
+11
+1029.5099682249
+21
+-864.236531445284
+31
+2081.98612648882
+12
+1029.5099682249
+22
+-872.024140727066
+32
+2067.42751451714
+13
+1029.5099682249
+23
+-872.024140727066
+33
+2067.42751451714
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-864.236531445284
+30
+2081.98612648882
+11
+1045.6629890274
+21
+-864.23653392912
+31
+2064.20421320603
+12
+1045.6629890274
+22
+-857.227870491995
+32
+2077.30661828686
+13
+1045.6629890274
+23
+-857.227870491995
+33
+2077.30661828686
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-872.024140727066
+30
+2067.42751451714
+11
+1011.98285238754
+21
+-868.552424065547
+31
+2084.86774040193
+12
+1011.98285238754
+22
+-876.819703664523
+32
+2069.41240470289
+13
+1011.98285238754
+23
+-876.819703664523
+33
+2069.41240470289
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-868.552424065547
+30
+2084.86774040193
+11
+1029.5099682249
+21
+-872.024140727066
+31
+2067.42751451714
+12
+1029.5099682249
+22
+-864.236531445284
+32
+2081.98612648882
+13
+1029.5099682249
+23
+-864.236531445284
+33
+2081.98612648882
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-876.819703664523
+30
+2069.41240470289
+11
+993.755281646067
+21
+-870.007199443395
+31
+2085.83905765611
+12
+993.755281646067
+22
+-878.436163455843
+32
+2070.08145966418
+13
+993.755281646067
+23
+-878.436163455843
+33
+2070.08145966418
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-870.007199443395
+30
+2085.83905765611
+11
+1011.98285238754
+21
+-876.819703664523
+31
+2069.41240470289
+12
+1011.98285238754
+22
+-868.552424065547
+32
+2084.86774040193
+13
+1011.98285238754
+23
+-868.552424065547
+33
+2084.86774040193
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+947.039601646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+947.039601646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+947.039601646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+993.755281646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+993.755281646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+993.755281646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+900.323921646066
+21
+-931.530792747493
+31
+2126.91682720423
+12
+900.323921646066
+22
+-946.797517592165
+32
+2098.3763194502
+13
+900.323921646066
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-931.530792747493
+30
+2126.91682720423
+11
+947.039601646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+947.039601646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+947.039601646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-931.530792747493
+30
+2126.91682720423
+11
+853.608241646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+900.323921646066
+22
+-946.797517592165
+32
+2098.3763194502
+13
+900.323921646066
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+900.323921646066
+21
+-931.530792747493
+31
+2126.91682720423
+12
+853.608241646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+853.608241646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+806.892561646067
+21
+-931.530792747493
+31
+2126.91682720423
+12
+806.892561646067
+22
+-946.797517592165
+32
+2098.3763194502
+13
+806.892561646067
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-931.530792747493
+30
+2126.91682720423
+11
+853.608241646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+853.608241646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+853.608241646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-931.530792747493
+30
+2126.91682720423
+11
+760.176881646066
+21
+-988.924364447842
+31
+2115.81268009677
+12
+806.892561646067
+22
+-946.797517592165
+32
+2098.3763194502
+13
+806.892561646067
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-988.924364447842
+30
+2115.81268009677
+11
+806.892561646067
+21
+-931.530792747493
+31
+2126.91682720423
+12
+760.176881646066
+22
+-969.443953273309
+32
+2152.23049936285
+13
+760.176881646066
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-988.924364447842
+30
+2115.81268009677
+11
+713.461201646067
+21
+-931.530792747493
+31
+2126.91682720423
+12
+713.461201646067
+22
+-946.797517592165
+32
+2098.3763194502
+13
+713.461201646067
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-931.530792747493
+30
+2126.91682720423
+11
+760.176881646066
+21
+-988.924364447842
+31
+2115.81268009677
+12
+760.176881646066
+22
+-969.443953273309
+32
+2152.23049936285
+13
+760.176881646066
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-931.530792747493
+30
+2126.91682720423
+11
+666.745521646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+713.461201646067
+22
+-946.797517592165
+32
+2098.3763194502
+13
+713.461201646067
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+713.461201646067
+21
+-931.530792747493
+31
+2126.91682720423
+12
+666.745521646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+666.745521646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+635.537064906387
+21
+-969.443953273309
+31
+2152.23049936285
+12
+635.537064906387
+22
+-988.924364447842
+32
+2115.81268009677
+13
+635.537064906387
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-969.443953273309
+30
+2152.23049936285
+11
+666.745521646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+666.745521646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+666.745521646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-946.797517592165
+30
+2098.3763194502
+11
+200.646177778547
+21
+-931.530792747491
+31
+2126.91682720422
+12
+200.646177778547
+22
+-946.797517592165
+32
+2098.3763194502
+13
+200.646177778547
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-931.530792747491
+30
+2126.91682720422
+11
+635.537064906387
+21
+-946.797517592165
+31
+2098.3763194502
+12
+635.537064906387
+22
+-931.530792747491
+32
+2126.91682720422
+13
+635.537064906387
+23
+-931.530792747491
+33
+2126.91682720422
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-872.433667955026
+30
+2067.59701840775
+11
+97.3015169041444
+21
+-864.605096213174
+31
+2082.23220799651
+12
+97.3015169041444
+22
+-872.433667955028
+32
+2067.59701840775
+13
+97.3015169041444
+23
+-872.433667955028
+33
+2067.59701840775
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-864.605096213174
+30
+2082.23220799651
+11
+200.646177778547
+21
+-872.433667955026
+31
+2067.59701840775
+12
+200.646177778547
+22
+-864.605096213174
+32
+2082.23220799651
+13
+200.646177778547
+23
+-864.605096213174
+33
+2082.23220799651
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-920.547185274073
+30
+2087.51127030568
+11
+45.3075256523042
+21
+-907.906117811778
+31
+2111.14322068125
+12
+45.3075256523042
+22
+-920.547185274073
+32
+2087.51127030568
+13
+45.3075256523042
+23
+-920.547185274073
+33
+2087.51127030568
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-907.906117811778
+30
+2111.14322068125
+11
+97.3015169041444
+21
+-920.547185274073
+31
+2087.51127030568
+12
+97.3015169041444
+22
+-907.906117811778
+32
+2111.14322068125
+13
+97.3015169041444
+23
+-907.906117811778
+33
+2111.14322068125
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-808.9628443428
+30
+2045.0812635097
+11
+1080.07459980683
+21
+-826.416209437024
+31
+2048.55032816988
+12
+1085.39140477935
+22
+-810.607310280307
+32
+2042.00700276824
+13
+1085.39140477935
+23
+-810.607310280307
+33
+2042.00700276824
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-826.416209437024
+30
+2048.55032816988
+11
+1085.39140477935
+21
+-808.9628443428
+31
+2045.0812635097
+12
+1080.07459980683
+22
+-823.190477697806
+32
+2054.58069962494
+13
+1080.07459980683
+23
+-823.190477697806
+33
+2054.58069962494
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-826.416209437024
+30
+2048.55032816988
+11
+1071.44060782234
+21
+-843.869602382313
+31
+2045.08125222601
+12
+1080.07459980683
+22
+-828.402605234187
+32
+2042.00699384053
+13
+1080.07459980683
+23
+-828.402605234187
+33
+2042.00699384053
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-843.869602382313
+30
+2045.08125222601
+11
+1080.07459980683
+21
+-826.416209437024
+31
+2048.55032816988
+12
+1071.44060782234
+22
+-840.985802170601
+32
+2054.58070291515
+13
+1071.44060782234
+23
+-840.985802170601
+33
+2054.58070291515
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-840.985802170601
+30
+2054.58070291515
+11
+1059.82120360007
+21
+-857.426534872689
+31
+2047.77586146339
+12
+1071.44060782234
+22
+-843.869602382313
+32
+2045.08125222601
+13
+1071.44060782234
+23
+-843.869602382313
+33
+2045.08125222601
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-857.426534872689
+30
+2047.77586146339
+11
+1071.44060782234
+21
+-840.985802170601
+31
+2054.58070291515
+12
+1059.82120360007
+22
+-853.75615333895
+32
+2059.86636906807
+13
+1059.82120360007
+23
+-853.75615333895
+33
+2059.86636906807
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-857.426534872689
+30
+2047.77586146339
+11
+1045.6629890274
+21
+-864.23653392912
+31
+2064.20421320603
+12
+1045.6629890274
+22
+-868.552447563839
+32
+2049.98727522776
+13
+1045.6629890274
+23
+-868.552447563839
+33
+2049.98727522776
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-864.23653392912
+30
+2064.20421320603
+11
+1059.82120360007
+21
+-857.426534872689
+31
+2047.77586146339
+12
+1059.82120360007
+22
+-853.75615333895
+32
+2059.86636906807
+13
+1059.82120360007
+23
+-853.75615333895
+33
+2059.86636906807
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-868.552447563839
+30
+2049.98727522776
+11
+1029.5099682249
+21
+-872.024140727066
+31
+2067.42751451714
+12
+1029.5099682249
+22
+-876.819726844542
+32
+2051.63049998629
+13
+1029.5099682249
+23
+-876.819726844542
+33
+2051.63049998629
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-872.024140727066
+30
+2067.42751451714
+11
+1045.6629890274
+21
+-868.552447563839
+31
+2049.98727522776
+12
+1045.6629890274
+22
+-864.23653392912
+32
+2064.20421320603
+13
+1045.6629890274
+23
+-864.23653392912
+33
+2064.20421320603
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-876.819726844542
+30
+2051.63049998629
+11
+1011.98285238754
+21
+-876.819703664523
+31
+2069.41240470289
+12
+1011.98285238754
+22
+-881.910669304885
+32
+2052.64238822799
+13
+1011.98285238754
+23
+-881.910669304885
+33
+2052.64238822799
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-876.819703664523
+30
+2069.41240470289
+11
+1029.5099682249
+21
+-876.819726844542
+31
+2051.63049998629
+12
+1029.5099682249
+22
+-872.024140727066
+32
+2067.42751451714
+13
+1029.5099682249
+23
+-872.024140727066
+33
+2067.42751451714
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-881.910669304885
+30
+2052.64238822799
+11
+993.755281646067
+21
+-878.436163455843
+31
+2070.08145966418
+12
+993.755281646067
+22
+-883.626693866424
+32
+2052.98346948944
+13
+993.755281646067
+23
+-883.626693866424
+33
+2052.98346948944
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-878.436163455843
+30
+2070.08145966418
+11
+1011.98285238754
+21
+-881.910669304885
+31
+2052.64238822799
+12
+1011.98285238754
+22
+-876.819703664523
+32
+2069.41240470289
+13
+1011.98285238754
+23
+-876.819703664523
+33
+2069.41240470289
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+947.039601646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+947.039601646067
+22
+-1000.92034241888
+32
+2076.297043493
+13
+947.039601646067
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+993.755281646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+993.755281646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+993.755281646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+900.323921646066
+21
+-946.797517592165
+31
+2098.3763194502
+12
+900.323921646066
+22
+-956.198720333
+32
+2067.40806391972
+13
+900.323921646066
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-946.797517592165
+30
+2098.3763194502
+11
+947.039601646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+947.039601646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+947.039601646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-946.797517592165
+30
+2098.3763194502
+11
+853.608241646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+900.323921646066
+22
+-956.198720333
+32
+2067.40806391972
+13
+900.323921646066
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+900.323921646066
+21
+-946.797517592165
+31
+2098.3763194502
+12
+853.608241646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+853.608241646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+806.892561646067
+21
+-946.797517592165
+31
+2098.3763194502
+12
+806.892561646067
+22
+-956.198720333
+32
+2067.40806391972
+13
+806.892561646067
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-946.797517592165
+30
+2098.3763194502
+11
+853.608241646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+853.608241646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+853.608241646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-946.797517592165
+30
+2098.3763194502
+11
+760.176881646066
+21
+-1000.92034241888
+31
+2076.297043493
+12
+806.892561646067
+22
+-956.198720333
+32
+2067.40806391972
+13
+806.892561646067
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-1000.92034241888
+30
+2076.297043493
+11
+806.892561646067
+21
+-946.797517592165
+31
+2098.3763194502
+12
+760.176881646066
+22
+-988.924364447842
+32
+2115.81268009677
+13
+760.176881646066
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-1000.92034241888
+30
+2076.297043493
+11
+713.461201646067
+21
+-946.797517592165
+31
+2098.3763194502
+12
+713.461201646067
+22
+-956.198720333
+32
+2067.40806391972
+13
+713.461201646067
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-946.797517592165
+30
+2098.3763194502
+11
+760.176881646066
+21
+-1000.92034241888
+31
+2076.297043493
+12
+760.176881646066
+22
+-988.924364447842
+32
+2115.81268009677
+13
+760.176881646066
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-946.797517592165
+30
+2098.3763194502
+11
+666.745521646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+713.461201646067
+22
+-956.198720333
+32
+2067.40806391972
+13
+713.461201646067
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+713.461201646067
+21
+-946.797517592165
+31
+2098.3763194502
+12
+666.745521646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+666.745521646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+635.537064906387
+21
+-988.924364447842
+31
+2115.81268009677
+12
+635.537064906387
+22
+-1000.92034241888
+32
+2076.297043493
+13
+635.537064906387
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-988.924364447842
+30
+2115.81268009677
+11
+666.745521646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+666.745521646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+666.745521646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-956.198720333
+30
+2067.40806391972
+11
+200.646177778547
+21
+-946.797517592165
+31
+2098.3763194502
+12
+200.646177778547
+22
+-956.198720333
+32
+2067.40806391972
+13
+200.646177778547
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-946.797517592165
+30
+2098.3763194502
+11
+635.537064906387
+21
+-956.198720333
+31
+2067.40806391972
+12
+635.537064906387
+22
+-946.797517592165
+32
+2098.3763194502
+13
+635.537064906387
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-877.254478630867
+30
+2051.71691232036
+11
+97.3015169041444
+21
+-872.433667955028
+31
+2067.59701840775
+12
+97.3015169041444
+22
+-877.254478630867
+32
+2051.71691232036
+13
+97.3015169041444
+23
+-877.254478630867
+33
+2051.71691232036
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-872.433667955028
+30
+2067.59701840775
+11
+200.646177778547
+21
+-877.254478630867
+31
+2051.71691232036
+12
+200.646177778547
+22
+-872.433667955026
+32
+2067.59701840775
+13
+200.646177778547
+23
+-872.433667955026
+33
+2067.59701840775
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-928.331516182155
+30
+2061.8691098991
+11
+45.3075256523042
+21
+-920.547185274073
+31
+2087.51127030568
+12
+45.3075256523042
+22
+-928.331516182155
+32
+2061.8691098991
+13
+45.3075256523042
+23
+-928.331516182155
+33
+2061.8691098991
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-920.547185274073
+30
+2087.51127030568
+11
+97.3015169041444
+21
+-928.331516182155
+31
+2061.8691098991
+12
+97.3015169041444
+22
+-920.547185274073
+32
+2087.51127030568
+13
+97.3015169041444
+23
+-920.547185274073
+33
+2087.51127030568
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-810.607310280307
+30
+2042.00700276824
+11
+1080.07459980683
+21
+-828.402605234187
+31
+2042.00699384053
+12
+1085.39140477935
+22
+-811.619967404623
+32
+2038.67123547813
+13
+1085.39140477935
+23
+-811.619967404623
+33
+2038.67123547813
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-828.402605234187
+30
+2042.00699384053
+11
+1085.39140477935
+21
+-810.607310280307
+31
+2042.00700276824
+12
+1080.07459980683
+22
+-826.416209437024
+32
+2048.55032816988
+13
+1080.07459980683
+23
+-826.416209437024
+33
+2048.55032816988
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-828.402605234187
+30
+2042.00699384053
+11
+1071.44060782234
+21
+-844.843342549059
+31
+2035.20215330562
+12
+1080.07459980683
+22
+-829.073329012799
+32
+2035.20215330562
+13
+1080.07459980683
+23
+-829.073329012799
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-844.843342549059
+30
+2035.20215330562
+11
+1080.07459980683
+21
+-828.402605234187
+31
+2042.00699384053
+12
+1071.44060782234
+22
+-843.869602382313
+32
+2045.08125222601
+13
+1071.44060782234
+23
+-843.869602382313
+33
+2045.08125222601
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1071.44060782234
+20
+-843.869602382313
+30
+2045.08125222601
+11
+1059.82120360007
+21
+-858.665871048675
+31
+2035.20215330562
+12
+1071.44060782234
+22
+-844.843342549059
+32
+2035.20215330562
+13
+1071.44060782234
+23
+-844.843342549059
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-858.665871048675
+30
+2035.20215330562
+11
+1071.44060782234
+21
+-843.869602382313
+31
+2045.08125222601
+12
+1059.82120360007
+22
+-857.426534872689
+32
+2047.77586146339
+13
+1059.82120360007
+23
+-857.426534872689
+33
+2047.77586146339
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1059.82120360007
+20
+-858.665871048675
+30
+2035.20215330562
+11
+1045.6629890274
+21
+-868.552447563839
+31
+2049.98727522776
+12
+1045.6629890274
+22
+-870.009753255569
+32
+2035.20215330562
+13
+1045.6629890274
+23
+-870.009753255569
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-868.552447563839
+30
+2049.98727522776
+11
+1059.82120360007
+21
+-858.665871048675
+31
+2035.20215330562
+12
+1059.82120360007
+22
+-857.426534872689
+32
+2047.77586146339
+13
+1059.82120360007
+23
+-857.426534872689
+33
+2047.77586146339
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1045.6629890274
+20
+-870.009753255569
+30
+2035.20215330562
+11
+1029.5099682249
+21
+-876.819726844542
+31
+2051.63049998629
+12
+1029.5099682249
+22
+-878.438998112613
+32
+2035.20215330562
+13
+1029.5099682249
+23
+-878.438998112613
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-876.819726844542
+30
+2051.63049998629
+11
+1045.6629890274
+21
+-870.009753255569
+31
+2035.20215330562
+12
+1045.6629890274
+22
+-868.552447563839
+32
+2049.98727522776
+13
+1045.6629890274
+23
+-868.552447563839
+33
+2049.98727522776
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1029.5099682249
+20
+-878.438998112613
+30
+2035.20215330562
+11
+1011.98285238754
+21
+-881.910669304885
+31
+2052.64238822799
+12
+1011.98285238754
+22
+-883.629678032126
+32
+2035.20215330562
+13
+1011.98285238754
+23
+-883.629678032126
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-881.910669304885
+30
+2052.64238822799
+11
+1029.5099682249
+21
+-878.438998112613
+31
+2035.20215330562
+12
+1029.5099682249
+22
+-876.819726844542
+32
+2051.63049998629
+13
+1029.5099682249
+23
+-876.819726844542
+33
+2051.63049998629
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1011.98285238754
+20
+-883.629678032126
+30
+2035.20215330562
+11
+993.755281646067
+21
+-883.626693866424
+31
+2052.98346948944
+12
+993.755281646067
+22
+-885.379321502337
+32
+2035.20215330562
+13
+993.755281646067
+23
+-885.379321502337
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-883.626693866424
+30
+2052.98346948944
+11
+1011.98285238754
+21
+-883.629678032126
+31
+2035.20215330562
+12
+1011.98285238754
+22
+-881.910669304885
+32
+2052.64238822799
+13
+1011.98285238754
+23
+-881.910669304885
+33
+2052.64238822799
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-1004.97088848041
+30
+2035.20215330562
+11
+947.039601646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+947.039601646067
+22
+-1004.97088848041
+32
+2035.20215330562
+13
+947.039601646067
+23
+-1004.97088848041
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+993.755281646067
+21
+-1004.97088848041
+31
+2035.20215330562
+12
+993.755281646067
+22
+-1000.92034241888
+32
+2076.297043493
+13
+993.755281646067
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+947.039601646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+900.323921646066
+21
+-959.37311802092
+31
+2035.20215330562
+12
+947.039601646067
+22
+-1004.97088848041
+32
+2035.20215330562
+13
+947.039601646067
+23
+-1004.97088848041
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-959.37311802092
+30
+2035.20215330562
+11
+947.039601646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+900.323921646066
+22
+-956.198720333
+32
+2067.40806391972
+13
+900.323921646066
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+900.323921646066
+20
+-956.198720333
+30
+2067.40806391972
+11
+853.608241646067
+21
+-1004.97088848041
+31
+2035.20215330562
+12
+900.323921646066
+22
+-959.37311802092
+32
+2035.20215330562
+13
+900.323921646066
+23
+-959.37311802092
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-1004.97088848041
+30
+2035.20215330562
+11
+900.323921646066
+21
+-956.198720333
+31
+2067.40806391972
+12
+853.608241646067
+22
+-1000.92034241888
+32
+2076.297043493
+13
+853.608241646067
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+853.608241646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+806.892561646067
+21
+-959.37311802092
+31
+2035.20215330562
+12
+853.608241646067
+22
+-1004.97088848041
+32
+2035.20215330562
+13
+853.608241646067
+23
+-1004.97088848041
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-959.37311802092
+30
+2035.20215330562
+11
+853.608241646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+806.892561646067
+22
+-956.198720333
+32
+2067.40806391972
+13
+806.892561646067
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+806.892561646067
+20
+-956.198720333
+30
+2067.40806391972
+11
+760.176881646066
+21
+-1004.97088848041
+31
+2035.20215330562
+12
+806.892561646067
+22
+-959.37311802092
+32
+2035.20215330562
+13
+806.892561646067
+23
+-959.37311802092
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-1004.97088848041
+30
+2035.20215330562
+11
+806.892561646067
+21
+-956.198720333
+31
+2067.40806391972
+12
+760.176881646066
+22
+-1000.92034241888
+32
+2076.297043493
+13
+760.176881646066
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+760.176881646066
+20
+-1000.92034241888
+30
+2076.297043493
+11
+713.461201646067
+21
+-959.37311802092
+31
+2035.20215330562
+12
+760.176881646066
+22
+-1004.97088848041
+32
+2035.20215330562
+13
+760.176881646066
+23
+-1004.97088848041
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-959.37311802092
+30
+2035.20215330562
+11
+760.176881646066
+21
+-1000.92034241888
+31
+2076.297043493
+12
+713.461201646067
+22
+-956.198720333
+32
+2067.40806391972
+13
+713.461201646067
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+713.461201646067
+20
+-956.198720333
+30
+2067.40806391972
+11
+666.745521646067
+21
+-1004.97088848041
+31
+2035.20215330562
+12
+713.461201646067
+22
+-959.37311802092
+32
+2035.20215330562
+13
+713.461201646067
+23
+-959.37311802092
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-1004.97088848041
+30
+2035.20215330562
+11
+713.461201646067
+21
+-956.198720333
+31
+2067.40806391972
+12
+666.745521646067
+22
+-1000.92034241888
+32
+2076.297043493
+13
+666.745521646067
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+666.745521646067
+20
+-1004.97088848041
+30
+2035.20215330562
+11
+635.537064906387
+21
+-1000.92034241888
+31
+2076.297043493
+12
+635.537064906387
+22
+-1004.97088848041
+32
+2035.20215330562
+13
+635.537064906387
+23
+-1004.97088848041
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-1000.92034241888
+30
+2076.297043493
+11
+666.745521646067
+21
+-1004.97088848041
+31
+2035.20215330562
+12
+666.745521646067
+22
+-1000.92034241888
+32
+2076.297043493
+13
+666.745521646067
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-959.37311802092
+30
+2035.20215330562
+11
+200.646177778547
+21
+-956.198720333
+31
+2067.40806391972
+12
+200.646177778547
+22
+-959.37311802092
+32
+2035.20215330562
+13
+200.646177778547
+23
+-959.37311802092
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-956.198720333
+30
+2067.40806391972
+11
+635.537064906387
+21
+-959.37311802092
+31
+2035.20215330562
+12
+635.537064906387
+22
+-956.198720333
+32
+2067.40806391972
+13
+635.537064906387
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-878.882267189965
+30
+2035.20215330562
+11
+97.3015169041444
+21
+-877.254478630867
+31
+2051.71691232036
+12
+97.3015169041444
+22
+-878.882267189966
+32
+2035.20215330562
+13
+97.3015169041444
+23
+-878.882267189966
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-877.254478630867
+30
+2051.71691232036
+11
+200.646177778547
+21
+-878.882267189965
+31
+2035.20215330562
+12
+200.646177778547
+22
+-877.254478630867
+32
+2051.71691232036
+13
+200.646177778547
+23
+-877.254478630867
+33
+2051.71691232036
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-930.959963064732
+30
+2035.20215330562
+11
+45.3075256523042
+21
+-928.331516182155
+31
+2061.8691098991
+12
+45.3075256523042
+22
+-930.959963064732
+32
+2035.20215330562
+13
+45.3075256523042
+23
+-930.959963064732
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-928.331516182155
+30
+2061.8691098991
+11
+97.3015169041444
+21
+-930.959963064732
+31
+2035.20215330562
+12
+97.3015169041444
+22
+-928.331516182155
+32
+2061.8691098991
+13
+97.3015169041444
+23
+-928.331516182155
+33
+2061.8691098991
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-811.619967404623
+30
+2038.67123547813
+11
+1080.07459980683
+21
+-829.073329012799
+31
+2035.20215330562
+12
+1085.39140477935
+22
+-811.96189987036
+32
+2035.20215330562
+13
+1085.39140477935
+23
+-811.96189987036
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1080.07459980683
+20
+-829.073329012799
+30
+2035.20215330562
+11
+1085.39140477935
+21
+-811.619967404623
+31
+2038.67123547813
+12
+1080.07459980683
+22
+-828.402605234187
+32
+2042.00699384053
+13
+1080.07459980683
+23
+-828.402605234187
+33
+2042.00699384053
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-835.292444325637
+30
+2241.80011766922
+11
+635.537064906387
+21
+-794.16656
+31
+2200.28420494853
+12
+635.537064906387
+22
+-826.396760603478
+32
+2197.11219961575
+13
+635.537064906387
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-794.16656
+30
+2200.28420494853
+11
+635.537064906387
+21
+-835.292444325637
+31
+2241.80011766922
+12
+635.537064906387
+22
+-794.16656
+32
+2245.84761107459
+13
+635.537064906387
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-794.16656
+30
+2052.98408188445
+11
+1085.39140477935
+21
+-797.638258585694
+31
+2052.64240711292
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-797.638258585694
+30
+2052.64240711292
+11
+1085.39140477935
+21
+-800.976541741692
+31
+2051.63051316818
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-800.976541741692
+30
+2051.63051316818
+11
+1085.39140477935
+21
+-804.053121118439
+31
+2049.98728656705
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-804.053121118439
+30
+2049.98728656705
+11
+1085.39140477935
+21
+-806.74976549585
+31
+2047.77587558629
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-806.74976549585
+30
+2047.77587558629
+11
+1085.39140477935
+21
+-808.9628443428
+31
+2045.0812635097
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-808.9628443428
+30
+2045.0812635097
+11
+1085.39140477935
+21
+-810.607310280307
+31
+2042.00700276824
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-810.607310280307
+30
+2042.00700276824
+11
+1085.39140477935
+21
+-811.619967404623
+31
+2038.67123547813
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+1085.39140477935
+20
+-811.619967404623
+30
+2038.67123547813
+11
+1085.39140477935
+21
+-811.96189987036
+31
+2035.20215330562
+12
+1087.18664164607
+22
+-794.16656
+32
+2035.20215330562
+13
+1087.18664164607
+23
+-794.16656
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-883.626693866424
+30
+2052.98346948944
+11
+993.755281646067
+21
+-1004.97088848041
+31
+2035.20215330562
+12
+993.755281646067
+22
+-885.379321502337
+32
+2035.20215330562
+13
+993.755281646067
+23
+-885.379321502337
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-1004.97088848041
+30
+2035.20215330562
+11
+993.755281646067
+21
+-883.626693866424
+31
+2052.98346948944
+12
+993.755281646067
+22
+-1000.92034241888
+32
+2076.297043493
+13
+993.755281646067
+23
+-1000.92034241888
+33
+2076.297043493
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-872.433667955028
+30
+2067.59701840775
+11
+97.3015169041444
+21
+-928.331516182155
+31
+2061.8691098991
+12
+97.3015169041444
+22
+-877.254478630867
+32
+2051.71691232036
+13
+97.3015169041444
+23
+-877.254478630867
+33
+2051.71691232036
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-928.331516182155
+30
+2061.8691098991
+11
+97.3015169041444
+21
+-872.433667955028
+31
+2067.59701840775
+12
+97.3015169041444
+22
+-920.547185274073
+32
+2087.51127030568
+13
+97.3015169041444
+23
+-920.547185274073
+33
+2087.51127030568
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-920.547185274073
+30
+2087.51127030568
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-928.331516182155
+32
+2061.8691098991
+13
+45.3075256523042
+23
+-928.331516182155
+33
+2061.8691098991
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-826.396760603478
+30
+2197.11219961575
+11
+200.646177778547
+21
+-794.16656
+31
+2119.85401529483
+12
+200.646177778547
+22
+-810.693774595514
+32
+2118.22745350336
+13
+200.646177778547
+23
+-810.693774595514
+33
+2118.22745350336
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-794.16656
+30
+2119.85401529483
+11
+200.646177778547
+21
+-826.396760603478
+31
+2197.11219961575
+12
+200.646177778547
+22
+-794.16656
+32
+2200.28420494853
+13
+200.646177778547
+23
+-794.16656
+33
+2200.28420494853
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-928.331516182155
+30
+2061.8691098991
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-930.959963064732
+32
+2035.20215330562
+13
+45.3075256523042
+23
+-930.959963064732
+33
+2035.20215330562
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-794.16656
+30
+2171.89246330095
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-820.853629053581
+32
+2169.2659973228
+13
+45.3075256523042
+23
+-820.853629053581
+33
+2169.2659973228
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-907.906117811778
+30
+2111.14322068125
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-920.547185274073
+32
+2087.51127030568
+13
+45.3075256523042
+23
+-920.547185274073
+33
+2087.51127030568
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-890.894102928655
+30
+2131.85679842581
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-907.906117811778
+32
+2111.14322068125
+13
+45.3075256523042
+23
+-907.906117811778
+33
+2111.14322068125
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-870.164902816216
+30
+2148.85599236295
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-890.894102928655
+32
+2131.85679842581
+13
+45.3075256523042
+23
+-890.894102928655
+33
+2131.85679842581
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-846.515129009712
+30
+2161.48753300293
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-870.164902816216
+32
+2148.85599236295
+13
+45.3075256523042
+23
+-870.164902816216
+33
+2148.85599236295
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+45.3075256523042
+20
+-820.853629053581
+30
+2169.2659973228
+11
+45.3075256523042
+21
+-794.16656
+31
+2035.20215330562
+12
+45.3075256523042
+22
+-846.515129009712
+32
+2161.48753300293
+13
+45.3075256523042
+23
+-846.515129009712
+33
+2161.48753300293
+70
+0
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-956.198720333
+30
+2067.40806391972
+11
+200.646177778547
+21
+-878.882267189965
+31
+2035.20215330562
+12
+200.646177778547
+22
+-959.37311802092
+32
+2035.20215330562
+13
+200.646177778547
+23
+-959.37311802092
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-878.882267189965
+30
+2035.20215330562
+11
+200.646177778547
+21
+-956.198720333
+31
+2067.40806391972
+12
+200.646177778547
+22
+-877.254478630867
+32
+2051.71691232036
+13
+200.646177778547
+23
+-877.254478630867
+33
+2051.71691232036
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-956.198720333
+30
+2067.40806391972
+11
+200.646177778547
+21
+-872.433667955026
+31
+2067.59701840775
+12
+200.646177778547
+22
+-877.254478630867
+32
+2051.71691232036
+13
+200.646177778547
+23
+-877.254478630867
+33
+2051.71691232036
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-872.433667955026
+30
+2067.59701840775
+11
+200.646177778547
+21
+-956.198720333
+31
+2067.40806391972
+12
+200.646177778547
+22
+-946.797517592165
+32
+2098.3763194502
+13
+200.646177778547
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-946.797517592165
+30
+2098.3763194502
+11
+200.646177778547
+21
+-864.605096213174
+31
+2082.23220799651
+12
+200.646177778547
+22
+-872.433667955026
+32
+2067.59701840775
+13
+200.646177778547
+23
+-872.433667955026
+33
+2067.59701840775
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-864.605096213174
+30
+2082.23220799651
+11
+200.646177778547
+21
+-946.797517592165
+31
+2098.3763194502
+12
+200.646177778547
+22
+-931.530792747491
+32
+2126.91682720422
+13
+200.646177778547
+23
+-931.530792747491
+33
+2126.91682720422
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-931.530792747491
+30
+2126.91682720422
+11
+200.646177778547
+21
+-854.069611027035
+31
+2095.06005895826
+12
+200.646177778547
+22
+-864.605096213174
+32
+2082.23220799651
+13
+200.646177778547
+23
+-864.605096213174
+33
+2082.23220799651
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-854.069611027035
+30
+2095.06005895826
+11
+200.646177778547
+21
+-931.530792747491
+31
+2126.91682720422
+12
+200.646177778547
+22
+-910.985237473081
+32
+2151.93279147451
+13
+200.646177778547
+23
+-910.985237473081
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-910.985237473081
+30
+2151.93279147451
+11
+200.646177778547
+21
+-841.232085183949
+31
+2105.58760417448
+12
+200.646177778547
+22
+-854.069611027035
+32
+2095.06005895826
+13
+200.646177778547
+23
+-854.069611027035
+33
+2095.06005895826
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-841.232085183949
+30
+2105.58760417448
+11
+200.646177778547
+21
+-910.985237473081
+31
+2151.93279147451
+12
+200.646177778547
+22
+-885.950405936048
+32
+2172.46286278326
+13
+200.646177778547
+23
+-885.950405936048
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-885.950405936048
+30
+2172.46286278326
+11
+200.646177778547
+21
+-826.585857602691
+31
+2113.41027598642
+12
+200.646177778547
+22
+-841.232085183949
+32
+2105.58760417448
+13
+200.646177778547
+23
+-841.232085183949
+33
+2105.58760417448
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-826.585857602691
+30
+2113.41027598642
+11
+200.646177778547
+21
+-885.950405936048
+31
+2172.46286278326
+12
+200.646177778547
+22
+-857.388372672667
+32
+2187.71808200347
+13
+200.646177778547
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-857.388372672667
+30
+2187.71808200347
+11
+200.646177778547
+21
+-810.693774595514
+31
+2118.22745350336
+12
+200.646177778547
+22
+-826.585857602691
+32
+2113.41027598642
+13
+200.646177778547
+23
+-826.585857602691
+33
+2113.41027598642
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+200.646177778547
+20
+-810.693774595514
+30
+2118.22745350336
+11
+200.646177778547
+21
+-857.388372672667
+31
+2187.71808200347
+12
+200.646177778547
+22
+-826.396760603478
+32
+2197.11219961575
+13
+200.646177778547
+23
+-826.396760603478
+33
+2197.11219961575
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-1000.92034241888
+30
+2076.297043493
+11
+635.537064906387
+21
+-959.37311802092
+31
+2035.20215330562
+12
+635.537064906387
+22
+-1004.97088848041
+32
+2035.20215330562
+13
+635.537064906387
+23
+-1004.97088848041
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-959.37311802092
+30
+2035.20215330562
+11
+635.537064906387
+21
+-1000.92034241888
+31
+2076.297043493
+12
+635.537064906387
+22
+-956.198720333
+32
+2067.40806391972
+13
+635.537064906387
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-1000.92034241888
+30
+2076.297043493
+11
+635.537064906387
+21
+-946.797517592165
+31
+2098.3763194502
+12
+635.537064906387
+22
+-956.198720333
+32
+2067.40806391972
+13
+635.537064906387
+23
+-956.198720333
+33
+2067.40806391972
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-946.797517592165
+30
+2098.3763194502
+11
+635.537064906387
+21
+-1000.92034241888
+31
+2076.297043493
+12
+635.537064906387
+22
+-988.924364447842
+32
+2115.81268009677
+13
+635.537064906387
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-988.924364447842
+30
+2115.81268009677
+11
+635.537064906387
+21
+-931.530792747491
+31
+2126.91682720422
+12
+635.537064906387
+22
+-946.797517592165
+32
+2098.3763194502
+13
+635.537064906387
+23
+-946.797517592165
+33
+2098.3763194502
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-931.530792747491
+30
+2126.91682720422
+11
+635.537064906387
+21
+-988.924364447842
+31
+2115.81268009677
+12
+635.537064906387
+22
+-969.443953273309
+32
+2152.23049936285
+13
+635.537064906387
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-969.443953273309
+30
+2152.23049936285
+11
+635.537064906387
+21
+-910.985237473081
+31
+2151.93279147451
+12
+635.537064906387
+22
+-931.530792747491
+32
+2126.91682720422
+13
+635.537064906387
+23
+-931.530792747491
+33
+2126.91682720422
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-910.985237473081
+30
+2151.93279147451
+11
+635.537064906387
+21
+-969.443953273309
+31
+2152.23049936285
+12
+635.537064906387
+22
+-943.227730171979
+32
+2184.1509849202
+13
+635.537064906387
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-943.227730171979
+30
+2184.1509849202
+11
+635.537064906387
+21
+-885.950405936048
+31
+2172.46286278326
+12
+635.537064906387
+22
+-910.985237473081
+32
+2151.93279147451
+13
+635.537064906387
+23
+-910.985237473081
+33
+2151.93279147451
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-885.950405936048
+30
+2172.46286278326
+11
+635.537064906387
+21
+-943.227730171979
+31
+2184.1509849202
+12
+635.537064906387
+22
+-911.283169895404
+32
+2210.34745041008
+13
+635.537064906387
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-911.283169895404
+30
+2210.34745041008
+11
+635.537064906387
+21
+-857.388372672667
+31
+2187.71808200347
+12
+635.537064906387
+22
+-885.950405936048
+32
+2172.46286278326
+13
+635.537064906387
+23
+-885.950405936048
+33
+2172.46286278326
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-857.388372672667
+30
+2187.71808200347
+11
+635.537064906387
+21
+-911.283169895404
+31
+2210.34745041008
+12
+635.537064906387
+22
+-874.837883980304
+32
+2229.81318035484
+13
+635.537064906387
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-874.837883980304
+30
+2229.81318035484
+11
+635.537064906387
+21
+-826.396760603478
+31
+2197.11219961575
+12
+635.537064906387
+22
+-857.388372672667
+32
+2187.71808200347
+13
+635.537064906387
+23
+-857.388372672667
+33
+2187.71808200347
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+635.537064906387
+20
+-826.396760603478
+30
+2197.11219961575
+11
+635.537064906387
+21
+-874.837883980304
+31
+2229.81318035484
+12
+635.537064906387
+22
+-835.292444325637
+32
+2241.80011766922
+13
+635.537064906387
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-794.16656
+30
+2126.34617316296
+11
+993.755281646067
+21
+-835.292444325637
+31
+2241.80011766922
+12
+993.755281646067
+22
+-811.961287013471
+32
+2124.59486637848
+13
+993.755281646067
+23
+-811.961287013471
+33
+2124.59486637848
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-835.292444325637
+30
+2241.80011766922
+11
+993.755281646067
+21
+-794.16656
+31
+2126.34617316296
+12
+993.755281646067
+22
+-794.16656
+32
+2245.84761107459
+13
+993.755281646067
+23
+-794.16656
+33
+2245.84761107459
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-878.436163455843
+30
+2070.08145966418
+11
+993.755281646067
+21
+-1000.92034241888
+31
+2076.297043493
+12
+993.755281646067
+22
+-883.626693866424
+32
+2052.98346948944
+13
+993.755281646067
+23
+-883.626693866424
+33
+2052.98346948944
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-1000.92034241888
+30
+2076.297043493
+11
+993.755281646067
+21
+-878.436163455843
+31
+2070.08145966418
+12
+993.755281646067
+22
+-988.924364447842
+32
+2115.81268009677
+13
+993.755281646067
+23
+-988.924364447842
+33
+2115.81268009677
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-870.007199443395
+30
+2085.83905765611
+11
+993.755281646067
+21
+-988.924364447842
+31
+2115.81268009677
+12
+993.755281646067
+22
+-878.436163455843
+32
+2070.08145966418
+13
+993.755281646067
+23
+-878.436163455843
+33
+2070.08145966418
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-988.924364447842
+30
+2115.81268009677
+11
+993.755281646067
+21
+-870.007199443395
+31
+2085.83905765611
+12
+993.755281646067
+22
+-969.443953273309
+32
+2152.23049936285
+13
+993.755281646067
+23
+-969.443953273309
+33
+2152.23049936285
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-858.663722189056
+30
+2099.65070781135
+11
+993.755281646067
+21
+-969.443953273309
+31
+2152.23049936285
+12
+993.755281646067
+22
+-870.007199443395
+32
+2085.83905765611
+13
+993.755281646067
+23
+-870.007199443395
+33
+2085.83905765611
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-969.443953273309
+30
+2152.23049936285
+11
+993.755281646067
+21
+-858.663722189056
+31
+2099.65070781135
+12
+993.755281646067
+22
+-943.227730171979
+32
+2184.1509849202
+13
+993.755281646067
+23
+-943.227730171979
+33
+2184.1509849202
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-844.841655162215
+30
+2110.9856361601
+11
+993.755281646067
+21
+-943.227730171979
+31
+2184.1509849202
+12
+993.755281646067
+22
+-858.663722189056
+32
+2099.65070781135
+13
+993.755281646067
+23
+-858.663722189056
+33
+2099.65070781135
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-943.227730171979
+30
+2184.1509849202
+11
+993.755281646067
+21
+-844.841655162215
+31
+2110.9856361601
+12
+993.755281646067
+22
+-911.283169895404
+32
+2210.34745041008
+13
+993.755281646067
+23
+-911.283169895404
+33
+2210.34745041008
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-829.072172647213
+30
+2119.40824776262
+11
+993.755281646067
+21
+-911.283169895404
+31
+2210.34745041008
+12
+993.755281646067
+22
+-844.841655162215
+32
+2110.9856361601
+13
+993.755281646067
+23
+-844.841655162215
+33
+2110.9856361601
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-911.283169895404
+30
+2210.34745041008
+11
+993.755281646067
+21
+-829.072172647213
+31
+2119.40824776262
+12
+993.755281646067
+22
+-874.837883980304
+32
+2229.81318035484
+13
+993.755281646067
+23
+-874.837883980304
+33
+2229.81318035484
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-811.961287013471
+30
+2124.59486637848
+11
+993.755281646067
+21
+-874.837883980304
+31
+2229.81318035484
+12
+993.755281646067
+22
+-829.072172647213
+32
+2119.40824776262
+13
+993.755281646067
+23
+-829.072172647213
+33
+2119.40824776262
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+993.755281646067
+20
+-874.837883980304
+30
+2229.81318035484
+11
+993.755281646067
+21
+-811.961287013471
+31
+2124.59486637848
+12
+993.755281646067
+22
+-835.292444325637
+32
+2241.80011766922
+13
+993.755281646067
+23
+-835.292444325637
+33
+2241.80011766922
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-877.254478630867
+30
+2051.71691232036
+11
+97.3015169041444
+21
+-930.959963064732
+31
+2035.20215330562
+12
+97.3015169041444
+22
+-878.882267189966
+32
+2035.20215330562
+13
+97.3015169041444
+23
+-878.882267189966
+33
+2035.20215330562
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-930.959963064732
+30
+2035.20215330562
+11
+97.3015169041444
+21
+-877.254478630867
+31
+2051.71691232036
+12
+97.3015169041444
+22
+-928.331516182155
+32
+2061.8691098991
+13
+97.3015169041444
+23
+-928.331516182155
+33
+2061.8691098991
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-854.069611027039
+30
+2095.06005895826
+11
+97.3015169041444
+21
+-907.906117811778
+31
+2111.14322068125
+12
+97.3015169041444
+22
+-864.605096213174
+32
+2082.23220799651
+13
+97.3015169041444
+23
+-864.605096213174
+33
+2082.23220799651
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-907.906117811778
+30
+2111.14322068125
+11
+97.3015169041444
+21
+-854.069611027039
+31
+2095.06005895826
+12
+97.3015169041444
+22
+-890.894102928655
+32
+2131.85679842581
+13
+97.3015169041444
+23
+-890.894102928655
+33
+2131.85679842581
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-864.605096213174
+30
+2082.23220799651
+11
+97.3015169041444
+21
+-920.547185274073
+31
+2087.51127030568
+12
+97.3015169041444
+22
+-872.433667955028
+32
+2067.59701840775
+13
+97.3015169041444
+23
+-872.433667955028
+33
+2067.59701840775
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-920.547185274073
+30
+2087.51127030568
+11
+97.3015169041444
+21
+-864.605096213174
+31
+2082.23220799651
+12
+97.3015169041444
+22
+-907.906117811778
+32
+2111.14322068125
+13
+97.3015169041444
+23
+-907.906117811778
+33
+2111.14322068125
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-826.585857602691
+30
+2113.41027598642
+11
+97.3015169041444
+21
+-870.164902816216
+31
+2148.85599236295
+12
+97.3015169041444
+22
+-841.232085183949
+32
+2105.58760417448
+13
+97.3015169041444
+23
+-841.232085183949
+33
+2105.58760417448
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-870.164902816216
+30
+2148.85599236295
+11
+97.3015169041444
+21
+-826.585857602691
+31
+2113.41027598642
+12
+97.3015169041444
+22
+-846.515129009712
+32
+2161.48753300293
+13
+97.3015169041444
+23
+-846.515129009712
+33
+2161.48753300293
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-841.232085183949
+30
+2105.58760417448
+11
+97.3015169041444
+21
+-890.894102928655
+31
+2131.85679842581
+12
+97.3015169041444
+22
+-854.069611027039
+32
+2095.06005895826
+13
+97.3015169041444
+23
+-854.069611027039
+33
+2095.06005895826
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-890.894102928655
+30
+2131.85679842581
+11
+97.3015169041444
+21
+-841.232085183949
+31
+2105.58760417448
+12
+97.3015169041444
+22
+-870.164902816216
+32
+2148.85599236295
+13
+97.3015169041444
+23
+-870.164902816216
+33
+2148.85599236295
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-794.16656
+30
+2119.85401529483
+11
+97.3015169041444
+21
+-820.853629053581
+31
+2169.2659973228
+12
+97.3015169041444
+22
+-810.693774595514
+32
+2118.22745350336
+13
+97.3015169041444
+23
+-810.693774595514
+33
+2118.22745350336
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-820.853629053581
+30
+2169.2659973228
+11
+97.3015169041444
+21
+-794.16656
+31
+2119.85401529483
+12
+97.3015169041444
+22
+-794.16656
+32
+2171.89246330095
+13
+97.3015169041444
+23
+-794.16656
+33
+2171.89246330095
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-810.693774595514
+30
+2118.22745350336
+11
+97.3015169041444
+21
+-846.515129009712
+31
+2161.48753300293
+12
+97.3015169041444
+22
+-826.585857602691
+32
+2113.41027598642
+13
+97.3015169041444
+23
+-826.585857602691
+33
+2113.41027598642
+70
+1
+ 0
+3DFACE
+ 8
+arm_half
+10
+97.3015169041444
+20
+-846.515129009712
+30
+2161.48753300293
+11
+97.3015169041444
+21
+-810.693774595514
+31
+2118.22745350336
+12
+97.3015169041444
+22
+-820.853629053581
+32
+2169.2659973228
+13
+97.3015169041444
+23
+-820.853629053581
+33
+2169.2659973228
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+21.0791386559896
+20
+-1635.02461467787
+30
+2001.52587998687
+11
+7.98221268585839
+21
+-1575.77551414673
+31
+1996.02904198905
+12
+22.365520181431
+22
+-1575.77540103232
+32
+2002.06558825272
+13
+22.365520181431
+23
+-1575.77540103232
+33
+2002.06558825272
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98221268585839
+20
+-1575.77551414673
+30
+1996.02904198905
+11
+21.0791386559896
+21
+-1635.02461467787
+31
+2001.52587998687
+12
+7.98254654484851
+22
+-1635.02471767319
+32
+1996.02935672895
+13
+7.98254654484851
+23
+-1635.02471767319
+33
+1996.02935672895
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-67.6768495427695
+20
+-1260.03677189865
+30
+1941.04407925614
+11
+-7.61761898721182
+21
+-1175.36447372759
+31
+1995.95502646913
+12
+-26.4930734323873
+22
+-1260.03663933705
+32
+1922.31304179217
+13
+-26.4930734323873
+23
+-1260.03663933705
+33
+1922.31304179217
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+18.7238320955074
+20
+-1260.0363927542
+30
+1920.768168456
+11
+7.98091066173456
+21
+-1175.36456200926
+31
+1996.02781452793
+12
+61.0900030665619
+22
+-1260.03606969012
+32
+1936.64465220875
+13
+61.0900030665619
+23
+-1260.03606969012
+33
+1936.64465220875
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.1734746098794
+20
+-1635.02429142183
+30
+2043.18474472703
+11
+33.1369283457947
+21
+-1635.02424903062
+31
+2057.56805222281
+12
+0.000316577896367365
+22
+-1635.02455455848
+32
+2035.20251476124
+13
+0.000316577896367365
+23
+-1635.02455455848
+33
+2035.20251476124
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+98.5563030683821
+20
+-1491.10230115877
+30
+2096.29352239028
+11
+33.1365944868046
+21
+-1575.77504550416
+31
+2057.56773748292
+12
+114.432786822367
+22
+-1491.10243675244
+32
+2053.92735141868
+13
+114.432786822367
+23
+-1491.10243675244
+33
+2053.92735141868
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.1249957769614
+20
+-1479.42362718516
+30
+2131.05362422024
+11
+26.4904348219512
+21
+-1260.03514143184
+31
+2148.08890332828
+12
+22.1236937528375
+22
+-1271.71644897083
+32
+2131.05239675912
+13
+22.1236937528375
+23
+-1271.71644897083
+33
+2131.05239675912
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+26.4904348219512
+20
+-1260.03514143184
+30
+2148.08890332828
+11
+22.1249957769614
+21
+-1479.42362718516
+31
+2131.05362422024
+12
+26.491736846075
+22
+-1491.10243207942
+32
+2148.0901307894
+13
+26.491736846075
+23
+-1491.10243207942
+33
+2148.0901307894
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2459633723545
+20
+-1575.77553171729
+30
+2042.81849970453
+11
+-112.887948049741
+21
+-1491.10367640812
+31
+2061.69395415194
+12
+-95.851569329198
+22
+-1479.42468360743
+32
+2057.32721685097
+13
+-95.851569329198
+23
+-1479.42468360743
+33
+2057.32721685097
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-83.4234143215687
+20
+-1271.71506812026
+30
+1983.06846791687
+11
+-98.5563376305701
+21
+-1491.10406090528
+31
+1974.11087765241
+12
+-98.5576396546941
+22
+-1260.0367702577
+32
+1974.10965019129
+13
+-98.5576396546941
+23
+-1260.0367702577
+33
+1974.10965019129
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-98.5563376305701
+20
+-1491.10406090528
+30
+1974.11087765241
+11
+-83.4234143215687
+21
+-1271.71506812026
+31
+1983.06846791687
+12
+-83.4221122974449
+22
+-1479.42500803573
+32
+1983.06969537799
+13
+-83.4221122974449
+23
+-1479.42500803573
+33
+1983.06969537799
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1366290489928
+20
+-1575.77565655989
+30
+2012.83666255977
+11
+-98.5563376305701
+21
+-1491.10406090528
+31
+1974.11087765241
+12
+-83.4221122974449
+22
+-1479.42500803573
+32
+1983.06969537799
+13
+-83.4221122974449
+23
+-1479.42500803573
+33
+1983.06969537799
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98254654484851
+20
+-1635.02471767319
+30
+1996.02935672895
+11
+-7.61631696308793
+21
+-1575.7756024284
+31
+1995.95625393024
+12
+7.98221268585839
+22
+-1575.77551414673
+32
+1996.02904198905
+13
+7.98221268585839
+23
+-1575.77551414673
+33
+1996.02904198905
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61631696308793
+20
+-1575.7756024284
+30
+1995.95625393024
+11
+7.98254654484851
+21
+-1635.02471767319
+31
+1996.02935672895
+12
+-7.61598310409778
+22
+-1635.02480595485
+32
+1995.95656867013
+13
+-7.61598310409778
+23
+-1635.02480595485
+33
+1995.95656867013
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61631696308793
+20
+-1575.7756024284
+30
+1995.95625393024
+11
+-26.4917714082634
+21
+-1491.10392998463
+31
+1922.31426925329
+12
+-22.1251619565284
+22
+-1479.42489487959
+32
+1939.3506517424
+13
+-22.1251619565284
+23
+-1479.42489487959
+33
+1939.3506517424
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98221268585839
+20
+-1575.77551414673
+30
+1996.02904198905
+11
+16.2397851414271
+21
+-1479.42468491837
+31
+1938.18001056121
+12
+18.7251341196313
+22
+-1491.10368340178
+32
+1920.76939591712
+13
+18.7251341196313
+23
+-1491.10368340178
+33
+1920.76939591712
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.365520181431
+20
+-1575.77540103232
+30
+2002.06558825272
+11
+61.0913050906858
+21
+-1491.1033603377
+31
+1936.64587966987
+12
+52.132359515953
+22
+-1479.42441042435
+32
+1951.78010877195
+13
+52.132359515953
+23
+-1479.42441042435
+33
+1951.78010877195
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+94.1568760248532
+20
+-1491.10300997595
+30
+1967.52666978086
+11
+80.0869400614005
+21
+-1271.71596296923
+31
+1978.07922724613
+12
+94.1555740007292
+22
+-1260.03571932837
+32
+1967.52544231974
+13
+94.1555740007292
+23
+-1260.03571932837
+33
+1967.52544231974
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+80.0869400614005
+20
+-1271.71596296923
+30
+1978.07922724613
+11
+94.1568760248532
+21
+-1491.10300997595
+31
+1967.52666978086
+12
+80.0882420855246
+22
+-1479.42411318676
+32
+1978.08045470725
+13
+80.0882420855246
+23
+-1479.42411318676
+33
+1978.08045470725
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3438773424362
+20
+-1575.77528030582
+30
+2013.14688327402
+11
+80.0882420855246
+21
+-1479.42411318676
+31
+1978.08045470725
+12
+94.1568760248532
+22
+-1491.10300997595
+32
+1967.52666978086
+13
+94.1568760248532
+23
+-1491.10300997595
+33
+1967.52666978086
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+16.2384831173033
+20
+-1271.71539123762
+30
+1938.17878310009
+11
+-7.61761898721182
+21
+-1175.36447372759
+31
+1995.95502646913
+12
+7.98091066173456
+22
+-1175.36456200926
+32
+1996.02781452793
+13
+7.98091066173456
+23
+-1175.36456200926
+33
+1996.02781452793
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.1264639806523
+20
+-1271.7151812764
+30
+1939.34942428128
+11
+-7.61761898721182
+21
+-1175.36447372759
+31
+1995.95502646913
+12
+16.2384831173033
+22
+-1271.71539123762
+32
+1938.17878310009
+13
+16.2384831173033
+23
+-1271.71539123762
+33
+1938.17878310009
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3425753183123
+20
+-1175.36479585016
+30
+2013.1456558129
+11
+80.0869400614005
+21
+-1271.71596296923
+31
+1978.07922724613
+12
+22.3642181573071
+22
+-1175.36467512367
+32
+2002.0643607916
+13
+22.3642181573071
+23
+-1175.36467512367
+33
+2002.0643607916
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+52.1310574918292
+20
+-1271.71566573164
+30
+1951.77888131083
+11
+22.3642181573071
+21
+-1175.36467512367
+31
+2002.0643607916
+12
+80.0869400614005
+22
+-1271.71596296923
+32
+1978.07922724613
+13
+80.0869400614005
+23
+-1271.71596296923
+33
+1978.07922724613
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.1236937528375
+20
+-1271.71644897083
+30
+2131.05239675912
+11
+7.61498037677585
+21
+-1175.36497652034
+31
+2074.44691865133
+12
+-7.9835492721704
+22
+-1175.36488823867
+32
+2074.37413059252
+13
+-7.9835492721704
+23
+-1175.36488823867
+33
+2074.37413059252
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-16.241253345118
+20
+-1271.71623900961
+30
+2132.22303794032
+11
+22.1236937528375
+21
+-1271.71644897083
+31
+2131.05239675912
+12
+-7.9835492721704
+22
+-1175.36488823867
+32
+2074.37413059252
+13
+-7.9835492721704
+23
+-1175.36488823867
+33
+2074.37413059252
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-52.1338277196439
+20
+-1271.71596451559
+30
+2118.62293972957
+11
+-22.366856767743
+21
+-1175.36477512426
+31
+2068.33758432885
+12
+-33.3452139287482
+22
+-1175.36465439776
+32
+2057.25628930755
+13
+-33.3452139287482
+23
+-1175.36465439776
+33
+2057.25628930755
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-80.0897102892153
+20
+-1271.715667278
+30
+2092.32259379428
+11
+-52.1338277196439
+21
+-1271.71596451559
+31
+2118.62293972957
+12
+-33.3452139287482
+22
+-1175.36465439776
+32
+2057.25628930755
+13
+-33.3452139287482
+23
+-1175.36465439776
+33
+2057.25628930755
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-95.8528713533217
+20
+-1271.71539254856
+30
+2057.32598938986
+11
+-39.1744773372013
+21
+-1175.36446198731
+31
+2027.21874259443
+12
+-97.0235125333639
+22
+-1271.71518215234
+32
+2018.96104229187
+13
+-97.0235125333639
+23
+-1271.71518215234
+33
+2018.96104229187
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-95.8528713533217
+20
+-1271.71539254856
+30
+2057.32598938986
+11
+-39.2472653964783
+21
+-1175.36454443869
+31
+2042.81727224341
+12
+-39.1744773372013
+22
+-1175.36446198731
+32
+2027.21874259443
+13
+-39.1744773372013
+23
+-1175.36446198731
+33
+2027.21874259443
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.1845368645104
+20
+1078.14493048035
+30
+2043.19517347961
+11
+33.1352924626808
+21
+-1175.36503065183
+31
+2057.5665100218
+12
+39.1718387267654
+22
+-1175.36498826062
+32
+2043.18320252602
+13
+39.1718387267654
+23
+-1175.36498826062
+33
+2043.18320252602
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1352924626808
+20
+-1175.36503065183
+30
+2057.5665100218
+11
+39.1845368645104
+21
+1078.14493048035
+31
+2043.19517347961
+12
+33.1479906004257
+22
+1078.14488808915
+32
+2057.57848097538
+13
+33.1479906004257
+23
+1078.14488808915
+33
+2057.57848097538
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+60.4504242229264
+20
+1076.22873878012
+30
+1995.97422483951
+11
+39.2573249237874
+21
+1078.14501293173
+31
+2027.59664383063
+12
+33.3552734560573
+22
+1078.14512289081
+32
+2013.15762676649
+13
+33.3552734560573
+23
+1078.14512289081
+33
+2013.15762676649
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2573249237874
+20
+1078.14501293173
+30
+2027.59664383063
+11
+60.4504242229264
+21
+1076.22873878012
+31
+1995.97422483951
+12
+70.8657786588185
+22
+1076.22854136019
+32
+2022.0901191445
+13
+70.8657786588185
+23
+1076.22854136019
+33
+2022.0901191445
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2462626691564
+20
+-1635.02437387321
+30
+2027.58621507805
+11
+0.000316577896367365
+21
+-1635.02455455848
+31
+2035.20251476124
+12
+33.3442112014263
+22
+-1635.02448383228
+32
+2013.14719801391
+13
+33.3442112014263
+23
+-1635.02448383228
+33
+2013.14719801391
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-80.0897102892153
+20
+-1271.715667278
+30
+2092.32259379428
+11
+-33.3452139287482
+21
+-1175.36465439776
+31
+2057.25628930755
+12
+-94.1582126111653
+22
+-1260.03606144053
+32
+2102.87650280072
+13
+-94.1582126111653
+23
+-1260.03606144053
+33
+2102.87650280072
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+67.6742109323337
+20
+-1260.03500887024
+30
+2129.35786586431
+11
+57.1202981576705
+21
+-1271.71656243456
+31
+2115.28923569394
+12
+22.0539974410672
+22
+-1175.36502652919
+32
+2068.54486718316
+13
+22.0539974410672
+23
+-1175.36502652919
+33
+2068.54486718316
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+97.0220443296732
+20
+-1479.4236280611
+30
+2051.44200620966
+11
+97.0207423055492
+21
+-1271.71644809489
+31
+2051.44077874854
+12
+114.431484798243
+22
+-1260.03514610487
+32
+2053.92612395756
+13
+114.431484798243
+23
+-1260.03514610487
+33
+2053.92612395756
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+97.0207423055492
+20
+-1271.71644809489
+30
+2051.44077874854
+11
+80.5104813608606
+21
+-1244.21642404447
+31
+2049.07971498233
+12
+114.431484798243
+22
+-1260.03514610487
+32
+2053.92612395756
+13
+114.431484798243
+23
+-1260.03514610487
+33
+2053.92612395756
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+114.431484798243
+20
+-1260.03514610487
+30
+2053.92612395756
+11
+80.5104813608606
+21
+-1244.21642404447
+31
+2049.07971498233
+12
+39.1718387267654
+22
+-1175.36498826062
+32
+2043.18320252602
+13
+39.1718387267654
+23
+-1175.36498826062
+33
+2043.18320252602
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.61628240089973
+20
+-1575.77509963565
+30
+2074.44814611245
+11
+67.6755129564576
+21
+-1491.10229951782
+31
+2129.35909332543
+12
+26.491736846075
+22
+-1491.10243207942
+32
+2148.0901307894
+13
+26.491736846075
+23
+-1491.10243207942
+33
+2148.0901307894
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+6.62400451714528
+20
+1105.46121754713
+30
+2070.64019948415
+11
+0.0625974234421623
+21
+1105.4614427137
+31
+2035.21299417206
+12
+-7.43285738619353
+22
+1105.46129774208
+32
+2070.45440584214
+13
+-7.43285738619353
+23
+1105.46129774208
+33
+2070.45440584214
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.0625974234421623
+20
+1105.4614427137
+30
+2035.21299417206
+11
+-30.1569306708265
+21
+1105.4615087748
+31
+2054.83234841933
+12
+-20.3486042412317
+22
+1105.46140000763
+32
+2064.90342673756
+13
+-20.3486042412317
+23
+1105.46140000763
+33
+2064.90342673756
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.0625974234421623
+20
+1105.4614427137
+30
+2035.21299417206
+11
+-35.3646078887726
+21
+1105.46160748476
+31
+2041.77440126683
+12
+-30.1569306708265
+22
+1105.4615087748
+32
+2054.83234841933
+13
+-30.1569306708265
+23
+1105.4615087748
+33
+2054.83234841933
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.0625974234421623
+20
+1105.4614427137
+30
+2035.21299417206
+11
+-35.1788142463492
+21
+1105.46168110983
+31
+2027.71753936346
+12
+-35.3646078887726
+22
+1105.46160748476
+32
+2041.77440126683
+13
+-35.3646078887726
+23
+1105.46160748476
+33
+2041.77440126683
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.0625974234421623
+20
+1105.4614427137
+30
+2035.21299417206
+11
+-29.6278351413918
+21
+1105.46171844124
+31
+2014.80179250824
+12
+-35.1788142463492
+22
+1105.46168110983
+32
+2027.71753936346
+13
+-35.1788142463492
+23
+1105.46168110983
+33
+2027.71753936346
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.0625974234421623
+20
+1105.4614427137
+30
+2035.21299417206
+11
+-6.49880967025258
+21
+1105.46166788026
+31
+1999.78578885998
+12
+-19.5567568228792
+22
+1105.46171379563
+32
+2004.99346607832
+13
+-19.5567568228792
+23
+1105.46171379563
+33
+2004.99346607832
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.55805223308622
+20
+1105.46158768532
+30
+1999.97158250198
+11
+-6.49880967025258
+21
+1105.46166788026
+31
+1999.78578885998
+12
+0.0625974234421623
+22
+1105.4614427137
+32
+2035.21299417206
+13
+0.0625974234421623
+23
+1105.4614427137
+33
+2035.21299417206
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+20.4737990881245
+20
+1105.46148541976
+30
+2005.52256160656
+11
+7.55805223308622
+21
+1105.46158768532
+31
+1999.97158250198
+12
+0.0625974234421623
+22
+1105.4614427137
+32
+2035.21299417206
+13
+0.0625974234421623
+23
+1105.4614427137
+33
+2035.21299417206
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+30.2821255177192
+20
+1105.46137665259
+30
+2015.5936399248
+11
+20.4737990881245
+21
+1105.46148541976
+31
+2005.52256160656
+12
+0.0625974234421623
+22
+1105.4614427137
+32
+2035.21299417206
+13
+0.0625974234421623
+23
+1105.4614427137
+33
+2035.21299417206
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+35.4898027356652
+20
+1105.46127794263
+30
+2028.65158707729
+11
+30.2821255177192
+21
+1105.46137665259
+31
+2015.5936399248
+12
+0.0625974234421623
+22
+1105.4614427137
+32
+2035.21299417206
+13
+0.0625974234421623
+23
+1105.4614427137
+33
+2035.21299417206
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+35.4898027356652
+20
+1105.46127794263
+30
+2028.65158707729
+11
+0.0625974234421623
+21
+1105.4614427137
+31
+2035.21299417206
+12
+35.3040090932419
+22
+1105.46120431757
+32
+2042.70844898066
+13
+35.3040090932419
+23
+1105.46120431757
+33
+2042.70844898066
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+35.3040090932419
+20
+1105.46120431757
+30
+2042.70844898066
+11
+0.0625974234421623
+21
+1105.4614427137
+31
+2035.21299417206
+12
+29.7530299882844
+22
+1105.46116698616
+32
+2055.62419583589
+13
+29.7530299882844
+23
+1105.46116698616
+33
+2055.62419583589
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+29.7530299882844
+20
+1105.46116698616
+30
+2055.62419583589
+11
+0.0625974234421623
+21
+1105.4614427137
+31
+2035.21299417206
+12
+19.6819516697718
+22
+1105.46117163176
+32
+2065.4325222658
+13
+19.6819516697718
+23
+1105.46117163176
+33
+2065.4325222658
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+19.6819516697718
+20
+1105.46117163176
+30
+2065.4325222658
+11
+0.0625974234421623
+21
+1105.4614427137
+31
+2035.21299417206
+12
+6.62400451714528
+22
+1105.46121754713
+32
+2070.64019948415
+13
+6.62400451714528
+23
+1105.46121754713
+33
+2070.64019948415
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-35.1788142463492
+20
+1105.46168110983
+30
+2027.71753936346
+11
+-59.3694325616239
+21
+1087.68206778655
+31
+1994.39059084441
+12
+-70.4713907715387
+22
+1087.68199312372
+32
+2020.22208455487
+13
+-70.4713907715387
+23
+1087.68199312372
+33
+2020.22208455487
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-59.3694325616239
+20
+1087.68206778655
+30
+1994.39059084441
+11
+-35.1788142463492
+21
+1105.46168110983
+31
+2027.71753936346
+12
+-29.6278351413918
+22
+1105.46171844124
+32
+2014.80179250824
+13
+-29.6278351413918
+23
+1105.46171844124
+33
+2014.80179250824
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+59.3922976977286
+20
+1087.68096487638
+30
+2076.03539749972
+11
+35.3040090932419
+21
+1105.46120431757
+31
+2042.70844898066
+12
+29.7530299882844
+22
+1105.46116698616
+32
+2055.62419583589
+13
+29.7530299882844
+23
+1105.46116698616
+33
+2055.62419583589
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+35.3040090932419
+20
+1105.46120431757
+30
+2042.70844898066
+11
+59.3922976977286
+21
+1087.68096487638
+31
+2076.03539749972
+12
+70.4942559076435
+22
+1087.68103953921
+32
+2050.20390378926
+13
+70.4942559076435
+23
+1087.68103953921
+33
+2050.20390378926
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+13.1342467554502
+20
+1087.68106599834
+30
+2106.06740479624
+11
+19.6819516697718
+21
+1105.46117163176
+31
+2065.4325222658
+12
+6.62400451714528
+22
+1105.46121754713
+32
+2070.64019948415
+13
+6.62400451714528
+23
+1105.46121754713
+33
+2070.64019948415
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+19.6819516697718
+20
+1105.46117163176
+30
+2065.4325222658
+11
+13.1342467554502
+21
+1087.68106599834
+31
+2106.06740479624
+12
+39.2501410607034
+22
+1087.68097416759
+32
+2095.65205035954
+13
+39.2501410607034
+23
+1087.68097416759
+33
+2095.65205035954
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+70.4942559076435
+20
+1087.68103953921
+30
+2050.20390378926
+11
+35.4898027356652
+21
+1105.46127794263
+31
+2028.65158707729
+12
+35.3040090932419
+22
+1105.46120431757
+32
+2042.70844898066
+13
+35.3040090932419
+23
+1105.46120431757
+33
+2042.70844898066
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+35.4898027356652
+20
+1105.46127794263
+30
+2028.65158707729
+11
+70.4942559076435
+21
+1087.68103953921
+31
+2050.20390378926
+12
+70.8658431924901
+22
+1087.68118678933
+32
+2022.09017998252
+13
+70.8658431924901
+23
+1087.68118678933
+33
+2022.09017998252
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-60.4276236204933
+20
+1087.68164845367
+30
+2074.45170266659
+11
+-35.3646078887726
+21
+1105.46160748476
+31
+2041.77440126683
+12
+-70.8429780563856
+22
+1087.6818458736
+32
+2048.3358083616
+13
+-70.8429780563856
+23
+1087.6818458736
+33
+2048.3358083616
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-35.3646078887726
+20
+1105.46160748476
+30
+2041.77440126683
+11
+-60.4276236204933
+21
+1087.68164845367
+31
+2074.45170266659
+12
+-30.1569306708265
+22
+1105.4615087748
+32
+2054.83234841933
+13
+-30.1569306708265
+23
+1105.4615087748
+33
+2054.83234841933
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-29.6278351413918
+20
+1105.46171844124
+30
+2014.80179250824
+11
+-39.2272759245986
+21
+1087.68205849534
+31
+1974.77393798458
+12
+-59.3694325616239
+22
+1087.68206778655
+32
+1994.39059084441
+13
+-59.3694325616239
+23
+1087.68206778655
+33
+1994.39059084441
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2272759245986
+20
+1087.68205849534
+30
+1974.77393798458
+11
+-29.6278351413918
+21
+1105.46171844124
+31
+2014.80179250824
+12
+-19.5567568228792
+22
+1105.46171379563
+32
+2004.99346607832
+13
+-19.5567568228792
+23
+1105.46171379563
+33
+2004.99346607832
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+20.4737990881245
+20
+1105.46148541976
+30
+2005.52256160656
+11
+15.0023421873321
+21
+1087.68180627471
+31
+1964.7301708319
+12
+7.55805223308622
+22
+1105.46158768532
+32
+1999.97158250198
+13
+7.55805223308622
+23
+1105.46158768532
+33
+1999.97158250198
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+15.0023421873321
+20
+1087.68180627471
+30
+1964.7301708319
+11
+20.4737990881245
+21
+1105.46148541976
+31
+2005.52256160656
+12
+40.8338358974086
+22
+1087.68160174359
+32
+1975.83212904106
+13
+40.8338358974086
+23
+1087.68160174359
+33
+1975.83212904106
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-35.3646078887726
+20
+1105.46160748476
+30
+2041.77440126683
+11
+-70.4713907715387
+21
+1087.68199312372
+31
+2020.22208455487
+12
+-70.8429780563856
+22
+1087.6818458736
+32
+2048.3358083616
+13
+-70.8429780563856
+23
+1087.6818458736
+33
+2048.3358083616
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-70.4713907715387
+20
+1087.68199312372
+30
+2020.22208455487
+11
+-35.3646078887726
+21
+1105.46160748476
+31
+2041.77440126683
+12
+-35.1788142463492
+22
+1105.46168110983
+32
+2027.71753936346
+13
+-35.1788142463492
+23
+1105.46168110983
+33
+2027.71753936346
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+35.4898027356652
+20
+1105.46127794263
+30
+2028.65158707729
+11
+60.4504887565981
+21
+1087.68138420926
+31
+1995.97428567753
+12
+30.2821255177192
+22
+1105.46137665259
+32
+2015.5936399248
+13
+30.2821255177192
+23
+1105.46137665259
+33
+2015.5936399248
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+60.4504887565981
+20
+1087.68138420926
+30
+1995.97428567753
+11
+35.4898027356652
+21
+1105.46127794263
+31
+2028.65158707729
+12
+70.8658431924901
+22
+1087.68118678933
+32
+2022.09017998252
+13
+70.8658431924901
+23
+1087.68118678933
+33
+2022.09017998252
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-14.9794770512274
+20
+1087.68122638822
+30
+2105.69581751223
+11
+-20.3486042412317
+21
+1105.46140000763
+31
+2064.90342673756
+12
+-40.8109707613038
+22
+1087.68143091934
+32
+2094.59385930307
+13
+-40.8109707613038
+23
+1087.68143091934
+33
+2094.59385930307
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-20.3486042412317
+20
+1105.46140000763
+30
+2064.90342673756
+11
+-14.9794770512274
+21
+1087.68122638822
+31
+2105.69581751223
+12
+-7.43285738619353
+22
+1105.46129774208
+32
+2070.45440584214
+13
+-7.43285738619353
+23
+1105.46129774208
+33
+2070.45440584214
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-40.8109707613038
+20
+1087.68143091934
+30
+2094.59385930307
+11
+-30.1569306708265
+21
+1105.4615087748
+31
+2054.83234841933
+12
+-60.4276236204933
+22
+1087.68164845367
+32
+2074.45170266659
+13
+-60.4276236204933
+23
+1087.68164845367
+33
+2074.45170266659
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-30.1569306708265
+20
+1105.4615087748
+30
+2054.83234841933
+11
+-40.8109707613038
+21
+1087.68143091934
+31
+2094.59385930307
+12
+-20.3486042412317
+22
+1105.46140000763
+32
+2064.90342673756
+13
+-20.3486042412317
+23
+1105.46140000763
+33
+2064.90342673756
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-19.5567568228792
+20
+1105.46171379563
+30
+2004.99346607832
+11
+-13.1113816193455
+21
+1087.68196666459
+31
+1964.35858354789
+12
+-39.2272759245986
+22
+1087.68205849534
+32
+1974.77393798458
+13
+-39.2272759245986
+23
+1087.68205849534
+33
+1974.77393798458
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-13.1113816193455
+20
+1087.68196666459
+30
+1964.35858354789
+11
+-19.5567568228792
+21
+1105.46171379563
+31
+2004.99346607832
+12
+-6.49880967025258
+22
+1105.46166788026
+32
+1999.78578885998
+13
+-6.49880967025258
+23
+1105.46166788026
+33
+1999.78578885998
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+30.2821255177192
+20
+1105.46137665259
+30
+2015.5936399248
+11
+40.8338358974086
+21
+1087.68160174359
+31
+1975.83212904106
+12
+20.4737990881245
+22
+1105.46148541976
+32
+2005.52256160656
+13
+20.4737990881245
+23
+1105.46148541976
+33
+2005.52256160656
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+40.8338358974086
+20
+1087.68160174359
+30
+1975.83212904106
+11
+30.2821255177192
+21
+1105.46137665259
+31
+2015.5936399248
+12
+60.4504887565981
+22
+1087.68138420926
+32
+1995.97428567753
+13
+60.4504887565981
+23
+1087.68138420926
+33
+1995.97428567753
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+13.1342467554502
+20
+1087.68106599834
+30
+2106.06740479624
+11
+-7.43285738619353
+21
+1105.46129774208
+31
+2070.45440584214
+12
+-14.9794770512274
+22
+1087.68122638822
+32
+2105.69581751223
+13
+-14.9794770512274
+23
+1087.68122638822
+33
+2105.69581751223
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.43285738619353
+20
+1105.46129774208
+30
+2070.45440584214
+11
+13.1342467554502
+21
+1087.68106599834
+31
+2106.06740479624
+12
+6.62400451714528
+22
+1105.46121754713
+32
+2070.64019948415
+13
+6.62400451714528
+23
+1105.46121754713
+33
+2070.64019948415
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-6.49880967025258
+20
+1105.46166788026
+30
+1999.78578885998
+11
+15.0023421873321
+21
+1087.68180627471
+31
+1964.7301708319
+12
+-13.1113816193455
+22
+1087.68196666459
+32
+1964.35858354789
+13
+-13.1113816193455
+23
+1087.68196666459
+33
+1964.35858354789
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+15.0023421873321
+20
+1087.68180627471
+30
+1964.7301708319
+11
+-6.49880967025258
+21
+1105.46166788026
+31
+1999.78578885998
+12
+7.55805223308622
+22
+1105.46158768532
+32
+1999.97158250198
+13
+7.55805223308622
+23
+1105.46158768532
+33
+1999.97158250198
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2501410607034
+20
+1087.68097416759
+30
+2095.65205035954
+11
+29.7530299882844
+21
+1105.46116698616
+31
+2055.62419583589
+12
+19.6819516697718
+22
+1105.46117163176
+32
+2065.4325222658
+13
+19.6819516697718
+23
+1105.46117163176
+33
+2065.4325222658
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+29.7530299882844
+20
+1105.46116698616
+30
+2055.62419583589
+11
+39.2501410607034
+21
+1087.68097416759
+31
+2095.65205035954
+12
+59.3922976977286
+22
+1087.68096487638
+32
+2076.03539749972
+13
+59.3922976977286
+23
+1087.68096487638
+33
+2076.03539749972
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1379310731166
+20
+-1175.3644195961
+30
+2012.83543509865
+11
+-33.1295365918798
+21
+314.385267310674
+31
+2012.8433488532
+12
+-22.056636051503
+22
+-1175.36442371874
+32
+2001.8570779373
+13
+-22.056636051503
+23
+-1175.36442371874
+33
+2001.8570779373
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3452139287482
+20
+-1175.36465439776
+30
+2057.25628930755
+11
+-39.1744773372013
+21
+-1175.36446198731
+31
+2027.21874259443
+12
+-39.2472653964783
+22
+-1175.36454443869
+32
+2042.81727224341
+13
+-39.2472653964783
+23
+-1175.36454443869
+33
+2042.81727224341
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1744773372013
+20
+-1175.36446198731
+30
+2027.21874259443
+11
+-33.3452139287482
+21
+-1175.36465439776
+31
+2057.25628930755
+12
+-33.1379310731166
+22
+-1175.3644195961
+32
+2012.83543509865
+13
+-33.1379310731166
+23
+-1175.3644195961
+33
+2012.83543509865
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1379310731166
+20
+-1175.3644195961
+30
+2012.83543509865
+11
+-33.3452139287482
+21
+-1175.36465439776
+31
+2057.25628930755
+12
+-22.366856767743
+22
+-1175.36477512426
+32
+2068.33758432885
+13
+-22.366856767743
+23
+-1175.36477512426
+33
+2068.33758432885
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1379310731166
+20
+-1175.3644195961
+30
+2012.83543509865
+11
+-22.366856767743
+21
+-1175.36477512426
+31
+2068.33758432885
+12
+-22.056636051503
+22
+-1175.36442371874
+32
+2001.8570779373
+13
+-22.056636051503
+23
+-1175.36442371874
+33
+2001.8570779373
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.056636051503
+20
+-1175.36442371874
+30
+2001.8570779373
+11
+-22.366856767743
+21
+-1175.36477512426
+31
+2068.33758432885
+12
+-7.9835492721704
+22
+-1175.36488823867
+32
+2074.37413059252
+13
+-7.9835492721704
+23
+-1175.36488823867
+33
+2074.37413059252
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.056636051503
+20
+-1175.36442371874
+30
+2001.8570779373
+11
+-7.9835492721704
+21
+-1175.36488823867
+31
+2074.37413059252
+12
+-7.61761898721182
+22
+-1175.36447372759
+32
+1995.95502646913
+13
+-7.61761898721182
+23
+-1175.36447372759
+33
+1995.95502646913
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61761898721182
+20
+-1175.36447372759
+30
+1995.95502646913
+11
+-7.9835492721704
+21
+-1175.36488823867
+31
+2074.37413059252
+12
+7.61498037677585
+22
+-1175.36497652034
+32
+2074.44691865133
+13
+7.61498037677585
+23
+-1175.36497652034
+33
+2074.44691865133
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61761898721182
+20
+-1175.36447372759
+30
+1995.95502646913
+11
+7.61498037677585
+21
+-1175.36497652034
+31
+2074.44691865133
+12
+7.98091066173456
+22
+-1175.36456200926
+32
+1996.02781452793
+13
+7.98091066173456
+23
+-1175.36456200926
+33
+1996.02781452793
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98091066173456
+20
+-1175.36456200926
+30
+1996.02781452793
+11
+7.61498037677585
+21
+-1175.36497652034
+31
+2074.44691865133
+12
+22.0539974410672
+22
+-1175.36502652919
+32
+2068.54486718316
+13
+22.0539974410672
+23
+-1175.36502652919
+33
+2068.54486718316
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98091066173456
+20
+-1175.36456200926
+30
+1996.02781452793
+11
+22.0539974410672
+21
+-1175.36502652919
+31
+2068.54486718316
+12
+22.3642181573071
+22
+-1175.36467512367
+32
+2002.0643607916
+13
+22.3642181573071
+23
+-1175.36467512367
+33
+2002.0643607916
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.3642181573071
+20
+-1175.36467512367
+30
+2002.0643607916
+11
+22.0539974410672
+21
+-1175.36502652919
+31
+2068.54486718316
+12
+33.1352924626808
+22
+-1175.36503065183
+32
+2057.5665100218
+13
+33.1352924626808
+23
+-1175.36503065183
+33
+2057.5665100218
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.3642181573071
+20
+-1175.36467512367
+30
+2002.0643607916
+11
+33.1352924626808
+21
+-1175.36503065183
+31
+2057.5665100218
+12
+33.3425753183123
+22
+-1175.36479585016
+32
+2013.1456558129
+13
+33.3425753183123
+23
+-1175.36479585016
+33
+2013.1456558129
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3425753183123
+20
+-1175.36479585016
+30
+2013.1456558129
+11
+33.1352924626808
+21
+-1175.36503065183
+31
+2057.5665100218
+12
+39.1718387267654
+22
+-1175.36498826062
+32
+2043.18320252602
+13
+39.1718387267654
+23
+-1175.36498826062
+33
+2043.18320252602
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3425753183123
+20
+-1175.36479585016
+30
+2013.1456558129
+11
+39.1718387267654
+21
+-1175.36498826062
+31
+2043.18320252602
+12
+39.2446267860425
+22
+-1175.36490580924
+32
+2027.58467287705
+13
+39.2446267860425
+23
+-1175.36490580924
+33
+2027.58467287705
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+26.4904348219512
+20
+-1260.03514143184
+30
+2148.08890332828
+11
+7.61498037677585
+21
+-1175.36497652034
+31
+2074.44691865133
+12
+22.1236937528375
+22
+-1271.71644897083
+32
+2131.05239675912
+13
+22.1236937528375
+23
+-1271.71644897083
+33
+2131.05239675912
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+83.4206440937541
+20
+-1271.71656212697
+30
+2087.33335312354
+11
+33.1352924626808
+21
+-1175.36503065183
+31
+2057.5665100218
+12
+22.0539974410672
+22
+-1175.36502652919
+32
+2068.54486718316
+13
+22.0539974410672
+23
+-1175.36502652919
+33
+2068.54486718316
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+57.1202981576705
+20
+-1271.71656243456
+30
+2115.28923569394
+11
+83.4206440937541
+21
+-1271.71656212697
+31
+2087.33335312354
+12
+22.0539974410672
+22
+-1175.36502652919
+32
+2068.54486718316
+13
+22.0539974410672
+23
+-1175.36502652919
+33
+2068.54486718316
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+97.0207423055492
+20
+-1271.71644809489
+30
+2051.44077874854
+11
+95.8501011255072
+21
+-1271.71623769867
+31
+2013.07583165055
+12
+39.2446267860425
+22
+-1175.36490580924
+32
+2027.58467287705
+13
+39.2446267860425
+23
+-1175.36490580924
+33
+2027.58467287705
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+97.0207423055492
+20
+-1271.71644809489
+30
+2051.44077874854
+11
+39.2446267860425
+21
+-1175.36490580924
+31
+2027.58467287705
+12
+80.5104813608606
+22
+-1244.21642404447
+32
+2049.07971498233
+13
+80.5104813608606
+23
+-1244.21642404447
+33
+2049.07971498233
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+80.5104813608606
+20
+-1244.21642404447
+30
+2049.07971498233
+11
+39.2446267860425
+21
+-1175.36490580924
+31
+2027.58467287705
+12
+39.1718387267654
+22
+-1175.36498826062
+32
+2043.18320252602
+13
+39.1718387267654
+23
+-1175.36498826062
+33
+2043.18320252602
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1365944868046
+20
+-1575.77504550416
+30
+2057.56773748292
+11
+39.1731407508892
+21
+-1575.77508789537
+31
+2043.18442998714
+12
+114.432786822367
+22
+-1491.10243675244
+32
+2053.92735141868
+13
+114.432786822367
+23
+-1491.10243675244
+33
+2053.92735141868
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-40.8109707613038
+20
+1087.68143091934
+30
+2094.59385930307
+11
+-14.9795415848991
+21
+1076.22858095908
+31
+2105.69575667421
+12
+-14.9794770512274
+22
+1087.68122638822
+32
+2105.69581751223
+13
+-14.9794770512274
+23
+1087.68122638822
+33
+2105.69581751223
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-14.9795415848991
+20
+1076.22858095908
+30
+2105.69575667421
+11
+-40.8109707613038
+21
+1087.68143091934
+31
+2094.59385930307
+12
+-40.8110352949755
+22
+1076.22878549019
+32
+2094.59379846504
+13
+-40.8110352949755
+23
+1076.22878549019
+33
+2094.59379846504
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+13.1342467554502
+20
+1087.68106599834
+30
+2106.06740479624
+11
+39.2500765270318
+21
+1076.22832873845
+31
+2095.65198952152
+12
+39.2501410607034
+22
+1087.68097416759
+32
+2095.65205035954
+13
+39.2501410607034
+23
+1087.68097416759
+33
+2095.65205035954
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2500765270318
+20
+1076.22832873845
+30
+2095.65198952152
+11
+13.1342467554502
+21
+1087.68106599834
+31
+2106.06740479624
+12
+13.1341822217786
+22
+1076.2284205692
+32
+2106.06734395821
+13
+13.1341822217786
+23
+1076.2284205692
+33
+2106.06734395821
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-13.1114461530171
+20
+1076.22932123545
+30
+1964.35852270987
+11
+-39.2272759245986
+21
+1087.68205849534
+31
+1974.77393798458
+12
+-13.1113816193455
+22
+1087.68196666459
+32
+1964.35858354789
+13
+-13.1113816193455
+23
+1087.68196666459
+33
+1964.35858354789
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2272759245986
+20
+1087.68205849534
+30
+1974.77393798458
+11
+-13.1114461530171
+21
+1076.22932123545
+31
+1964.35852270987
+12
+-39.2273404582702
+22
+1076.22941306619
+32
+1974.77387714657
+13
+-39.2273404582702
+23
+1076.22941306619
+33
+1974.77387714657
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+60.4504887565981
+20
+1087.68138420926
+30
+1995.97428567753
+11
+70.8657786588185
+21
+1076.22854136019
+31
+2022.0901191445
+12
+60.4504242229264
+22
+1076.22873878012
+32
+1995.97422483951
+13
+60.4504242229264
+23
+1076.22873878012
+33
+1995.97422483951
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+70.8657786588185
+20
+1076.22854136019
+30
+2022.0901191445
+11
+60.4504887565981
+21
+1087.68138420926
+31
+1995.97428567753
+12
+70.8658431924901
+22
+1087.68118678933
+32
+2022.09017998252
+13
+70.8658431924901
+23
+1087.68118678933
+33
+2022.09017998252
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.056636051503
+20
+-1175.36442371874
+30
+2001.8570779373
+11
+-33.1252329353715
+21
+1078.14549914487
+31
+2012.84740605224
+12
+-22.0439379137581
+22
+1078.14549502223
+32
+2001.86904889088
+13
+-22.0439379137581
+23
+1078.14549502223
+33
+2001.86904889088
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1252329353715
+20
+1078.14549914487
+30
+2012.84740605224
+11
+-22.056636051503
+21
+-1175.36442371874
+31
+2001.8570779373
+12
+-33.1295365918798
+22
+314.385267310674
+32
+2012.8433488532
+13
+-33.1295365918798
+23
+314.385267310674
+33
+2012.8433488532
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.3769162950522
+20
+1078.1452436173
+30
+2002.07633174518
+11
+33.3425753183123
+21
+-1175.36479585016
+31
+2013.1456558129
+12
+22.3642181573071
+22
+-1175.36467512367
+32
+2002.0643607916
+13
+22.3642181573071
+23
+-1175.36467512367
+33
+2002.0643607916
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3425753183123
+20
+-1175.36479585016
+30
+2013.1456558129
+11
+22.3769162950522
+21
+1078.1452436173
+31
+2002.07633174518
+12
+33.3552734560573
+22
+1078.14512289081
+32
+2013.15762676649
+13
+33.3552734560573
+23
+1078.14512289081
+33
+2013.15762676649
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.0666955788121
+20
+1078.14489221178
+30
+2068.55683813674
+11
+13.1341822217786
+21
+1076.2284205692
+31
+2106.06734395821
+12
+7.62767851452085
+22
+1078.14494222063
+32
+2074.45888960491
+13
+7.62767851452085
+23
+1078.14494222063
+33
+2074.45888960491
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+13.1341822217786
+20
+1076.2284205692
+30
+2106.06734395821
+11
+22.0666955788121
+21
+1078.14489221178
+31
+2068.55683813674
+12
+39.2500765270318
+22
+1076.22832873845
+32
+2095.65198952152
+13
+39.2500765270318
+23
+1076.22832873845
+33
+2095.65198952152
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.354158629998
+20
+1078.14514361671
+30
+2068.34955528244
+11
+-14.9795415848991
+21
+1076.22858095908
+31
+2105.69575667421
+12
+-40.8110352949755
+22
+1076.22878549019
+32
+2094.59379846504
+13
+-40.8110352949755
+23
+1076.22878549019
+33
+2094.59379846504
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-14.9795415848991
+20
+1076.22858095908
+30
+2105.69575667421
+11
+-22.354158629998
+21
+1078.14514361671
+31
+2068.34955528244
+12
+-7.97085113442526
+22
+1078.14503050231
+32
+2074.3861015461
+13
+-7.97085113442526
+23
+1078.14503050231
+33
+2074.3861015461
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+15.0022776536605
+20
+1076.22916084557
+30
+1964.73010999387
+11
+22.3769162950522
+21
+1078.1452436173
+31
+2002.07633174518
+12
+7.99360879947956
+22
+1078.14535673171
+32
+1996.03978548152
+13
+7.99360879947956
+23
+1078.14535673171
+33
+1996.03978548152
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.3769162950522
+20
+1078.1452436173
+30
+2002.07633174518
+11
+15.0022776536605
+21
+1076.22916084557
+31
+1964.73010999387
+12
+40.8337713637369
+22
+1076.22895631445
+32
+1975.83206820304
+13
+40.8337713637369
+23
+1076.22895631445
+33
+1975.83206820304
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+15.0022776536605
+20
+1076.22916084557
+30
+1964.73010999387
+11
+-7.60492084946682
+21
+1078.14544501338
+31
+1995.96699742271
+12
+-13.1114461530171
+22
+1076.22932123545
+32
+1964.35852270987
+13
+-13.1114461530171
+23
+1076.22932123545
+33
+1964.35852270987
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.60492084946682
+20
+1078.14544501338
+30
+1995.96699742271
+11
+15.0022776536605
+21
+1076.22916084557
+31
+1964.73010999387
+12
+7.99360879947956
+22
+1078.14535673171
+32
+1996.03978548152
+13
+7.99360879947956
+23
+1078.14535673171
+33
+1996.03978548152
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61761898721182
+20
+-1175.36447372759
+30
+1995.95502646913
+11
+-22.1264639806523
+21
+-1271.7151812764
+31
+1939.34942428128
+12
+-26.4930734323873
+22
+-1260.03663933705
+32
+1922.31304179217
+13
+-26.4930734323873
+23
+-1260.03663933705
+33
+1922.31304179217
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98091066173456
+20
+-1175.36456200926
+30
+1996.02781452793
+11
+18.7238320955074
+21
+-1260.0363927542
+31
+1920.768168456
+12
+16.2384831173033
+22
+-1271.71539123762
+32
+1938.17878310009
+13
+16.2384831173033
+23
+-1271.71539123762
+33
+1938.17878310009
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.000316577896367365
+20
+-1635.02455455848
+30
+2035.20251476124
+11
+-22.055000168389
+21
+-1635.02485596371
+31
+2001.85862013831
+12
+-7.61598310409778
+22
+-1635.02480595485
+32
+1995.95656867013
+13
+-7.61598310409778
+23
+-1635.02480595485
+33
+1995.95656867013
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1369283457947
+20
+-1635.02424903062
+30
+2057.56805222281
+11
+22.0556333241812
+21
+-1635.02425315326
+31
+2068.54640938416
+12
+0.000316577896367365
+22
+-1635.02455455848
+32
+2035.20251476124
+13
+0.000316577896367365
+23
+-1635.02455455848
+33
+2035.20251476124
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.000316577896367365
+20
+-1635.02455455848
+30
+2035.20251476124
+11
+-39.1728414540873
+21
+-1635.02481769514
+31
+2027.22028479544
+12
+-33.1362951900026
+22
+-1635.02486008634
+32
+2012.83697729966
+13
+-33.1362951900026
+23
+-1635.02486008634
+33
+2012.83697729966
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.61661625988982
+20
+-1635.02430316211
+30
+2074.44846085234
+11
+-7.98191338905644
+21
+-1635.02439144378
+31
+2074.37567279353
+12
+0.000316577896367365
+22
+-1635.02455455848
+32
+2035.20251476124
+13
+0.000316577896367365
+23
+-1635.02455455848
+33
+2035.20251476124
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+83.4206440937541
+20
+-1271.71656212697
+30
+2087.33335312354
+11
+98.5563030683821
+21
+-1491.10230115877
+31
+2096.29352239028
+12
+98.5550010442582
+22
+-1260.03501051119
+32
+2096.29229492916
+13
+98.5550010442582
+23
+-1260.03501051119
+33
+2096.29229492916
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+98.5563030683821
+20
+-1491.10230115877
+30
+2096.29352239028
+11
+83.4206440937541
+21
+-1271.71656212697
+31
+2087.33335312354
+12
+83.421946117878
+22
+-1479.42351402902
+32
+2087.33458058465
+13
+83.421946117878
+23
+-1479.42351402902
+33
+2087.33458058465
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+114.432786822367
+20
+-1491.10243675244
+30
+2053.92735141868
+11
+97.0220443296732
+21
+-1479.4236280611
+31
+2051.44200620966
+12
+114.431484798243
+22
+-1260.03514610487
+32
+2053.92612395756
+13
+114.431484798243
+23
+-1260.03514610487
+33
+2053.92612395756
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.97085113442526
+20
+1078.14503050231
+30
+2074.3861015461
+11
+7.61498037677585
+21
+-1175.36497652034
+31
+2074.44691865133
+12
+7.62767851452085
+22
+1078.14494222063
+32
+2074.45888960491
+13
+7.62767851452085
+23
+1078.14494222063
+33
+2074.45888960491
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.61498037677585
+20
+-1175.36497652034
+30
+2074.44691865133
+11
+-7.97085113442526
+21
+1078.14503050231
+31
+2074.3861015461
+12
+-7.9835492721704
+22
+-1175.36488823867
+32
+2074.37413059252
+13
+-7.9835492721704
+23
+-1175.36488823867
+33
+2074.37413059252
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-98.5563376305701
+20
+-1491.10406090528
+30
+1974.11087765241
+11
+-114.43412340868
+21
+-1260.03663466403
+31
+2016.47582116289
+12
+-98.5576396546941
+22
+-1260.0367702577
+32
+1974.10965019129
+13
+-98.5576396546941
+23
+-1260.0367702577
+33
+1974.10965019129
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-114.43412340868
+20
+-1260.03663466403
+30
+2016.47582116289
+11
+-98.5563376305701
+21
+-1491.10406090528
+31
+1974.11087765241
+12
+-114.432821384555
+22
+-1491.10392531161
+32
+2016.47704862401
+13
+-114.432821384555
+23
+-1491.10392531161
+33
+2016.47704862401
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.98224724804656
+20
+-1575.77518791732
+30
+2074.37535805364
+11
+-18.7251686818196
+21
+-1491.10267866227
+31
+2149.63500412557
+12
+-61.0913396528737
+22
+-1491.10300172636
+32
+2133.75852037282
+13
+-61.0913396528737
+23
+-1491.10300172636
+33
+2133.75852037282
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.0556333241812
+20
+-1635.02425315326
+30
+2068.54640938416
+11
+7.61661625988982
+21
+-1635.02430316211
+31
+2074.44846085234
+12
+0.000316577896367365
+22
+-1635.02455455848
+32
+2035.20251476124
+13
+0.000316577896367365
+23
+-1635.02455455848
+33
+2035.20251476124
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+21.0791386559896
+20
+-1635.02461467787
+30
+2001.52587998687
+11
+0.000316577896367365
+21
+-1635.02455455848
+31
+2035.20251476124
+12
+7.98254654484851
+22
+-1635.02471767319
+32
+1996.02935672895
+13
+7.98254654484851
+23
+-1635.02471767319
+33
+1996.02935672895
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+67.6755129564576
+20
+-1491.10229951782
+30
+2129.35909332543
+11
+22.055299465191
+21
+-1575.7750496268
+31
+2068.54609464427
+12
+57.1216001817944
+22
+-1479.42351372144
+32
+2115.29046315506
+13
+57.1216001817944
+23
+-1479.42351372144
+33
+2115.29046315506
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-61.0926416769977
+20
+-1260.03571107878
+30
+2133.75729291171
+11
+-7.9835492721704
+21
+-1175.36488823867
+31
+2074.37413059252
+12
+-22.366856767743
+22
+-1175.36477512426
+32
+2068.33758432885
+13
+-22.366856767743
+23
+-1175.36477512426
+33
+2068.33758432885
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-61.0926416769977
+20
+-1260.03571107878
+30
+2133.75729291171
+11
+-18.7264707059435
+21
+-1260.03538801469
+31
+2149.63377666445
+12
+-7.9835492721704
+22
+-1175.36488823867
+32
+2074.37413059252
+13
+-7.9835492721704
+23
+-1175.36488823867
+33
+2074.37413059252
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+67.6742109323337
+20
+-1260.03500887024
+30
+2129.35786586431
+11
+22.0539974410672
+21
+-1175.36502652919
+31
+2068.54486718316
+12
+7.61498037677585
+22
+-1175.36497652034
+32
+2074.44691865133
+13
+7.61498037677585
+23
+-1175.36497652034
+33
+2074.44691865133
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-114.432821384555
+20
+-1491.10392531161
+30
+2016.47704862401
+11
+-97.0222105092401
+21
+-1479.42489400365
+31
+2018.96226975299
+12
+-97.0235125333639
+22
+-1271.71518215234
+32
+2018.96104229187
+13
+-97.0235125333639
+23
+-1271.71518215234
+33
+2018.96104229187
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1731753130775
+20
+-1575.77561416868
+30
+2027.21997005555
+11
+-97.0222105092401
+21
+-1479.42489400365
+31
+2018.96226975299
+12
+-114.432821384555
+22
+-1491.10392531161
+32
+2016.47704862401
+13
+-114.432821384555
+23
+-1491.10392531161
+33
+2016.47704862401
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-97.0235125333639
+20
+-1271.71518215234
+30
+2018.96104229187
+11
+-39.1744773372013
+21
+-1175.36446198731
+31
+2027.21874259443
+12
+-114.43412340868
+22
+-1260.03663466403
+32
+2016.47582116289
+13
+-114.43412340868
+23
+-1260.03663466403
+33
+2016.47582116289
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-114.432821384555
+20
+-1491.10392531161
+30
+2016.47704862401
+11
+-97.0235125333639
+21
+-1271.71518215234
+31
+2018.96104229187
+12
+-114.43412340868
+22
+-1260.03663466403
+32
+2016.47582116289
+13
+-114.43412340868
+23
+-1260.03663466403
+33
+2016.47582116289
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.3655547436192
+20
+-1575.77530103172
+30
+2068.33881178997
+11
+-33.3439119046243
+21
+-1575.77542175822
+31
+2057.25751676867
+12
+-33.3435780456342
+22
+-1635.02462528468
+32
+2057.25783150856
+13
+-33.3435780456342
+23
+-1635.02462528468
+33
+2057.25783150856
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3435780456342
+20
+-1635.02462528468
+30
+2057.25783150856
+11
+-21.0785055001976
+21
+-1635.02449443909
+31
+2068.87914953561
+12
+-22.3655547436192
+22
+-1575.77530103172
+32
+2068.33881178997
+13
+-22.3655547436192
+23
+-1575.77530103172
+33
+2068.33881178997
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+21.0791386559896
+20
+-1635.02461467787
+30
+2001.52587998687
+11
+22.365520181431
+21
+-1575.77540103232
+31
+2002.06558825272
+12
+33.3442112014263
+22
+-1635.02448383228
+32
+2013.14719801391
+13
+33.3442112014263
+23
+-1635.02448383228
+33
+2013.14719801391
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3442112014263
+20
+-1635.02448383228
+30
+2013.14719801391
+11
+22.365520181431
+21
+-1575.77540103232
+31
+2002.06558825272
+12
+33.3438773424362
+22
+-1575.77528030582
+32
+2013.14688327402
+13
+33.3438773424362
+23
+-1575.77528030582
+33
+2013.14688327402
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+70.4942559076435
+20
+1087.68103953921
+30
+2050.20390378926
+11
+59.3922331640569
+21
+1076.22831944724
+31
+2076.0353366617
+12
+70.4941913739718
+22
+1076.22839411006
+32
+2050.20384295124
+13
+70.4941913739718
+23
+1076.22839411006
+33
+2050.20384295124
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+59.3922331640569
+20
+1076.22831944724
+30
+2076.0353366617
+11
+70.4942559076435
+21
+1087.68103953921
+31
+2050.20390378926
+12
+59.3922976977286
+22
+1087.68096487638
+32
+2076.03539749972
+13
+59.3922976977286
+23
+1087.68096487638
+33
+2076.03539749972
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+40.8337713637369
+20
+1076.22895631445
+30
+1975.83206820304
+11
+15.0023421873321
+21
+1087.68180627471
+31
+1964.7301708319
+12
+40.8338358974086
+22
+1087.68160174359
+32
+1975.83212904106
+13
+40.8338358974086
+23
+1087.68160174359
+33
+1975.83212904106
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+15.0023421873321
+20
+1087.68180627471
+30
+1964.7301708319
+11
+40.8337713637369
+21
+1076.22895631445
+31
+1975.83206820304
+12
+15.0022776536605
+22
+1076.22916084557
+32
+1964.73010999387
+13
+15.0022776536605
+23
+1076.22916084557
+33
+1964.73010999387
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-70.4714553052104
+20
+1076.22934769458
+30
+2020.22202371684
+11
+-59.3694325616239
+21
+1087.68206778655
+31
+1994.39059084441
+12
+-59.3694970952955
+22
+1076.22942235741
+32
+1994.39053000639
+13
+-59.3694970952955
+23
+1076.22942235741
+33
+1994.39053000639
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-59.3694325616239
+20
+1087.68206778655
+30
+1994.39059084441
+11
+-70.4714553052104
+21
+1076.22934769458
+31
+2020.22202371684
+12
+-70.4713907715387
+22
+1087.68199312372
+32
+2020.22208455487
+13
+-70.4713907715387
+23
+1087.68199312372
+33
+2020.22208455487
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-60.4276881541649
+20
+1076.22900302453
+30
+2074.45164182857
+11
+-70.8429780563856
+21
+1087.6818458736
+31
+2048.3358083616
+12
+-70.8430425900572
+22
+1076.22920044446
+32
+2048.33574752358
+13
+-70.8430425900572
+23
+1076.22920044446
+33
+2048.33574752358
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-70.8429780563856
+20
+1087.6818458736
+30
+2048.3358083616
+11
+-60.4276881541649
+21
+1076.22900302453
+31
+2074.45164182857
+12
+-60.4276236204933
+22
+1087.68164845367
+32
+2074.45170266659
+13
+-60.4276236204933
+23
+1087.68164845367
+33
+2074.45170266659
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+112.886611463429
+20
+-1260.03539500836
+30
+2008.70921842963
+11
+94.1568760248532
+21
+-1491.10300997595
+31
+1967.52666978086
+12
+94.1555740007292
+22
+-1260.03571932837
+32
+1967.52544231974
+13
+94.1555740007292
+23
+-1260.03571932837
+33
+1967.52544231974
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+94.1568760248532
+20
+-1491.10300997595
+30
+1967.52666978086
+11
+112.886611463429
+21
+-1260.03539500836
+31
+2008.70921842963
+12
+112.887913487553
+22
+-1491.10268565594
+32
+2008.71044589075
+13
+112.887913487553
+23
+-1491.10268565594
+33
+2008.71044589075
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-112.887948049741
+20
+-1491.10367640812
+30
+2061.69395415194
+11
+-39.2459633723545
+21
+-1575.77553171729
+31
+2042.81849970453
+12
+-33.3439119046243
+22
+-1575.77542175822
+32
+2057.25751676867
+13
+-33.3439119046243
+23
+-1575.77542175822
+33
+2057.25751676867
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.3655547436192
+20
+-1575.77530103172
+30
+2068.33881178997
+11
+-7.98191338905644
+21
+-1635.02439144378
+31
+2074.37567279353
+12
+-7.98224724804656
+22
+-1575.77518791732
+32
+2074.37535805364
+13
+-7.98224724804656
+23
+-1575.77518791732
+33
+2074.37535805364
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.98191338905644
+20
+-1635.02439144378
+30
+2074.37567279353
+11
+-22.3655547436192
+21
+-1575.77530103172
+31
+2068.33881178997
+12
+-21.0785055001976
+22
+-1635.02449443909
+32
+2068.87914953561
+13
+-21.0785055001976
+23
+-1635.02449443909
+33
+2068.87914953561
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.0539974410672
+20
+-1175.36502652919
+30
+2068.54486718316
+11
+33.1352924626808
+21
+-1175.36503065183
+31
+2057.5665100218
+12
+22.062391922304
+22
+314.384660377585
+32
+2068.5527809377
+13
+22.062391922304
+23
+314.384660377585
+33
+2068.5527809377
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98221268585839
+20
+-1575.77551414673
+30
+1996.02904198905
+11
+61.0913050906858
+21
+-1491.1033603377
+31
+1936.64587966987
+12
+22.365520181431
+22
+-1575.77540103232
+32
+2002.06558825272
+13
+22.365520181431
+23
+-1575.77540103232
+33
+2002.06558825272
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-67.6768495427695
+20
+-1260.03677189865
+30
+1941.04407925614
+11
+-22.056636051503
+21
+-1175.36442371874
+31
+2001.8570779373
+12
+-7.61761898721182
+22
+-1175.36447372759
+32
+1995.95502646913
+13
+-7.61761898721182
+23
+-1175.36447372759
+33
+1995.95502646913
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3438773424362
+20
+-1575.77528030582
+30
+2013.14688327402
+11
+52.132359515953
+21
+-1479.42441042435
+31
+1951.78010877195
+12
+80.0882420855246
+22
+-1479.42411318676
+32
+1978.08045470725
+13
+80.0882420855246
+23
+-1479.42411318676
+33
+1978.08045470725
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3325157910026
+20
+1078.14526434321
+30
+2057.26826026113
+11
+-40.8110352949755
+21
+1076.22878549019
+31
+2094.59379846504
+12
+-60.4276881541649
+22
+1076.22900302453
+32
+2074.45164182857
+13
+-60.4276881541649
+23
+1076.22900302453
+33
+2074.45164182857
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-40.8110352949755
+20
+1076.22878549019
+30
+2094.59379846504
+11
+-33.3325157910026
+21
+1078.14526434321
+31
+2057.26826026113
+12
+-22.354158629998
+22
+1078.14514361671
+32
+2068.34955528244
+13
+-22.354158629998
+23
+1078.14514361671
+33
+2068.34955528244
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-95.8528713533217
+20
+-1271.71539254856
+30
+2057.32598938986
+11
+-112.887948049741
+21
+-1491.10367640812
+31
+2061.69395415194
+12
+-112.889250073865
+22
+-1260.03638576054
+32
+2061.69272669082
+13
+-112.889250073865
+23
+-1260.03638576054
+33
+2061.69272669082
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-112.887948049741
+20
+-1491.10367640812
+30
+2061.69395415194
+11
+-95.8528713533217
+21
+-1271.71539254856
+31
+2057.32598938986
+12
+-95.851569329198
+22
+-1479.42468360743
+32
+2057.32721685097
+13
+-95.851569329198
+23
+-1479.42468360743
+33
+2057.32721685097
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.3655547436192
+20
+-1575.77530103172
+30
+2068.33881178997
+11
+-7.98224724804656
+21
+-1575.77518791732
+31
+2074.37535805364
+12
+-61.0913396528737
+22
+-1491.10300172636
+32
+2133.75852037282
+13
+-61.0913396528737
+23
+-1491.10300172636
+33
+2133.75852037282
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2573249237874
+20
+1078.14501293173
+30
+2027.59664383063
+11
+39.1718387267654
+21
+-1175.36498826062
+31
+2043.18320252602
+12
+39.2446267860425
+22
+-1175.36490580924
+32
+2027.58467287705
+13
+39.2446267860425
+23
+-1175.36490580924
+33
+2027.58467287705
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.1718387267654
+20
+-1175.36498826062
+30
+2043.18320252602
+11
+39.2573249237874
+21
+1078.14501293173
+31
+2027.59664383063
+12
+39.1845368645104
+22
+1078.14493048035
+32
+2043.19517347961
+13
+39.1845368645104
+23
+1078.14493048035
+33
+2043.19517347961
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98091066173456
+20
+-1175.36456200926
+30
+1996.02781452793
+11
+-7.60492084946682
+21
+1078.14544501338
+31
+1995.96699742271
+12
+7.99360879947956
+22
+1078.14535673171
+32
+1996.03978548152
+13
+7.99360879947956
+23
+1078.14535673171
+33
+1996.03978548152
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.60492084946682
+20
+1078.14544501338
+30
+1995.96699742271
+11
+7.98091066173456
+21
+-1175.36456200926
+31
+1996.02781452793
+12
+-7.60922450597496
+22
+314.385213179183
+32
+1995.96294022367
+13
+-7.60922450597496
+23
+314.385213179183
+33
+1995.96294022367
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2573249237874
+20
+1078.14501293173
+30
+2027.59664383063
+11
+70.4941913739718
+21
+1076.22839411006
+31
+2050.20384295124
+12
+39.1845368645104
+22
+1078.14493048035
+32
+2043.19517347961
+13
+39.1845368645104
+23
+1078.14493048035
+33
+2043.19517347961
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+70.4941913739718
+20
+1076.22839411006
+30
+2050.20384295124
+11
+39.2573249237874
+21
+1078.14501293173
+31
+2027.59664383063
+12
+70.8657786588185
+22
+1076.22854136019
+32
+2022.0901191445
+13
+70.8657786588185
+23
+1076.22854136019
+33
+2022.0901191445
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-26.4917714082634
+20
+-1491.10392998463
+30
+1922.31426925329
+11
+-67.6768495427695
+21
+-1260.03677189865
+31
+1941.04407925614
+12
+-26.4930734323873
+22
+-1260.03663933705
+32
+1922.31304179217
+13
+-26.4930734323873
+23
+-1260.03663933705
+33
+1922.31304179217
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-67.6768495427695
+20
+-1260.03677189865
+30
+1941.04407925614
+11
+-26.4917714082634
+21
+-1491.10392998463
+31
+1922.31426925329
+12
+-67.6755475186457
+22
+-1491.10406254623
+32
+1941.04530671726
+13
+-67.6755475186457
+23
+-1491.10406254623
+33
+1941.04530671726
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1479906004257
+20
+1078.14488808915
+30
+2057.57848097538
+11
+39.2500765270318
+21
+1076.22832873845
+31
+2095.65198952152
+12
+22.0666955788121
+22
+1078.14489221178
+32
+2068.55683813674
+13
+22.0666955788121
+23
+1078.14489221178
+33
+2068.55683813674
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2500765270318
+20
+1076.22832873845
+30
+2095.65198952152
+11
+33.1479906004257
+21
+1078.14488808915
+31
+2057.57848097538
+12
+59.3922331640569
+22
+1076.22831944724
+32
+2076.0353366617
+13
+59.3922331640569
+23
+1076.22831944724
+33
+2076.0353366617
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-61.0926416769977
+20
+-1260.03571107878
+30
+2133.75729291171
+11
+-18.7251686818196
+21
+-1491.10267866227
+31
+2149.63500412557
+12
+-18.7264707059435
+22
+-1260.03538801469
+32
+2149.63377666445
+13
+-18.7264707059435
+23
+-1260.03538801469
+33
+2149.63377666445
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-18.7251686818196
+20
+-1491.10267866227
+30
+2149.63500412557
+11
+-61.0926416769977
+21
+-1260.03571107878
+31
+2133.75729291171
+12
+-61.0913396528737
+22
+-1491.10300172636
+32
+2133.75852037282
+13
+-61.0913396528737
+23
+-1491.10300172636
+33
+2133.75852037282
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0553340273792
+20
+-1575.77565243725
+30
+2001.85830539842
+11
+-57.1217663613614
+21
+-1479.42500834332
+31
+1955.11381280758
+12
+-67.6755475186457
+22
+-1491.10406254623
+32
+1941.04530671726
+13
+-67.6755475186457
+23
+-1491.10406254623
+33
+1941.04530671726
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-52.13252569552
+20
+-1479.4241116404
+30
+2118.62416719069
+11
+-61.0926416769977
+21
+-1260.03571107878
+31
+2133.75729291171
+12
+-52.1338277196439
+22
+-1271.71596451559
+32
+2118.62293972957
+13
+-52.1338277196439
+23
+-1271.71596451559
+33
+2118.62293972957
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-61.0926416769977
+20
+-1260.03571107878
+30
+2133.75729291171
+11
+-52.13252569552
+21
+-1479.4241116404
+31
+2118.62416719069
+12
+-61.0913396528737
+22
+-1491.10300172636
+32
+2133.75852037282
+13
+-61.0913396528737
+23
+-1491.10300172636
+33
+2133.75852037282
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2345672587327
+20
+1078.14537430228
+30
+2042.82924319699
+11
+-60.4276881541649
+21
+1076.22900302453
+31
+2074.45164182857
+12
+-70.8430425900572
+22
+1076.22920044446
+32
+2048.33574752358
+13
+-70.8430425900572
+23
+1076.22920044446
+33
+2048.33574752358
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-60.4276881541649
+20
+1076.22900302453
+30
+2074.45164182857
+11
+-39.2345672587327
+21
+1078.14537430228
+31
+2042.82924319699
+12
+-33.3325157910026
+22
+1078.14526434321
+32
+2057.26826026113
+13
+-33.3325157910026
+23
+1078.14526434321
+33
+2057.26826026113
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+26.491736846075
+20
+-1491.10243207942
+30
+2148.0901307894
+11
+22.1249957769614
+21
+-1479.42362718516
+31
+2131.05362422024
+12
+7.61628240089973
+22
+-1575.77509963565
+32
+2074.44814611245
+13
+7.61628240089973
+23
+-1575.77509963565
+33
+2074.44814611245
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.98224724804656
+20
+-1575.77518791732
+30
+2074.37535805364
+11
+7.61661625988982
+21
+-1635.02430316211
+31
+2074.44846085234
+12
+7.61628240089973
+22
+-1575.77509963565
+32
+2074.44814611245
+13
+7.61628240089973
+23
+-1575.77509963565
+33
+2074.44814611245
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.61661625988982
+20
+-1635.02430316211
+30
+2074.44846085234
+11
+-7.98224724804656
+21
+-1575.77518791732
+31
+2074.37535805364
+12
+-7.98191338905644
+22
+-1635.02439144378
+32
+2074.37567279353
+13
+-7.98191338905644
+23
+-1635.02439144378
+33
+2074.37567279353
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+80.0869400614005
+20
+-1271.71596296923
+30
+1978.07922724613
+11
+33.3425753183123
+21
+-1175.36479585016
+31
+2013.1456558129
+12
+94.1555740007292
+22
+-1260.03571932837
+32
+1967.52544231974
+13
+94.1555740007292
+23
+-1260.03571932837
+33
+1967.52544231974
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.000316577896367365
+20
+-1635.02455455848
+30
+2035.20251476124
+11
+-7.98191338905644
+21
+-1635.02439144378
+31
+2074.37567279353
+12
+-21.0785055001976
+22
+-1635.02449443909
+32
+2068.87914953561
+13
+-21.0785055001976
+23
+-1635.02449443909
+33
+2068.87914953561
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.000316577896367365
+20
+-1635.02455455848
+30
+2035.20251476124
+11
+-39.2456295133644
+21
+-1635.02473524376
+31
+2042.81881444442
+12
+-39.1728414540873
+22
+-1635.02481769514
+32
+2027.22028479544
+13
+-39.1728414540873
+23
+-1635.02481769514
+33
+2027.22028479544
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3442112014263
+20
+-1635.02448383228
+30
+2013.14719801391
+11
+0.000316577896367365
+21
+-1635.02455455848
+31
+2035.20251476124
+12
+21.0791386559896
+22
+-1635.02461467787
+32
+2001.52587998687
+13
+21.0791386559896
+23
+-1635.02461467787
+33
+2001.52587998687
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2462626691564
+20
+-1635.02437387321
+30
+2027.58621507805
+11
+39.1734746098794
+21
+-1635.02429142183
+31
+2043.18474472703
+12
+0.000316577896367365
+22
+-1635.02455455848
+32
+2035.20251476124
+13
+0.000316577896367365
+23
+-1635.02455455848
+33
+2035.20251476124
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.000316577896367365
+20
+-1635.02455455848
+30
+2035.20251476124
+11
+-33.3435780456342
+21
+-1635.02462528468
+31
+2057.25783150856
+12
+-39.2456295133644
+22
+-1635.02473524376
+32
+2042.81881444442
+13
+-39.2456295133644
+23
+-1635.02473524376
+33
+2042.81881444442
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-18.7264707059435
+20
+-1260.03538801469
+30
+2149.63377666445
+11
+-16.241253345118
+21
+-1271.71623900961
+31
+2132.22303794032
+12
+-7.9835492721704
+22
+-1175.36488823867
+32
+2074.37413059252
+13
+-7.9835492721704
+23
+-1175.36488823867
+33
+2074.37413059252
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-61.0926416769977
+20
+-1260.03571107878
+30
+2133.75729291171
+11
+-22.366856767743
+21
+-1175.36477512426
+31
+2068.33758432885
+12
+-52.1338277196439
+22
+-1271.71596451559
+32
+2118.62293972957
+13
+-52.1338277196439
+23
+-1271.71596451559
+33
+2118.62293972957
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-13.1114461530171
+20
+1076.22932123545
+30
+1964.35852270987
+11
+-22.0439379137581
+21
+1078.14549502223
+31
+2001.86904889088
+12
+-39.2273404582702
+22
+1076.22941306619
+32
+1974.77387714657
+13
+-39.2273404582702
+23
+1076.22941306619
+33
+1974.77387714657
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0439379137581
+20
+1078.14549502223
+30
+2001.86904889088
+11
+-13.1114461530171
+21
+1076.22932123545
+31
+1964.35852270987
+12
+-7.60492084946682
+22
+1078.14544501338
+32
+1995.96699742271
+13
+-7.60492084946682
+23
+1078.14544501338
+33
+1995.96699742271
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.354158629998
+20
+1078.14514361671
+30
+2068.34955528244
+11
+-7.9835492721704
+21
+-1175.36488823867
+31
+2074.37413059252
+12
+-7.97085113442526
+22
+1078.14503050231
+32
+2074.3861015461
+13
+-7.97085113442526
+23
+1078.14503050231
+33
+2074.3861015461
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.9835492721704
+20
+-1175.36488823867
+30
+2074.37413059252
+11
+-22.354158629998
+21
+1078.14514361671
+31
+2068.34955528244
+12
+-22.366856767743
+22
+-1175.36477512426
+32
+2068.33758432885
+13
+-22.366856767743
+23
+-1175.36477512426
+33
+2068.33758432885
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.000316577896367365
+20
+-1635.02455455848
+30
+2035.20251476124
+11
+-33.1362951900026
+21
+-1635.02486008634
+31
+2012.83697729966
+12
+-22.055000168389
+22
+-1635.02485596371
+32
+2001.85862013831
+13
+-22.055000168389
+23
+-1635.02485596371
+33
+2001.85862013831
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-95.8528713533217
+20
+-1271.71539254856
+30
+2057.32598938986
+11
+-112.889250073865
+21
+-1260.03638576054
+31
+2061.69272669082
+12
+-39.2472653964783
+22
+-1175.36454443869
+32
+2042.81727224341
+13
+-39.2472653964783
+23
+-1175.36454443869
+33
+2042.81727224341
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1365944868046
+20
+-1575.77504550416
+30
+2057.56773748292
+11
+39.1734746098794
+21
+-1635.02429142183
+31
+2043.18474472703
+12
+39.1731407508892
+22
+-1575.77508789537
+32
+2043.18442998714
+13
+39.1731407508892
+23
+-1575.77508789537
+33
+2043.18442998714
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.1734746098794
+20
+-1635.02429142183
+30
+2043.18474472703
+11
+33.1365944868046
+21
+-1575.77504550416
+31
+2057.56773748292
+12
+33.1369283457947
+22
+-1635.02424903062
+32
+2057.56805222281
+13
+33.1369283457947
+23
+-1635.02424903062
+33
+2057.56805222281
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.1731407508892
+20
+-1575.77508789537
+30
+2043.18442998714
+11
+97.0220443296732
+21
+-1479.4236280611
+31
+2051.44200620966
+12
+114.432786822367
+22
+-1491.10243675244
+32
+2053.92735141868
+13
+114.432786822367
+23
+-1491.10243675244
+33
+2053.92735141868
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2273404582702
+20
+1076.22941306619
+30
+1974.77387714657
+11
+-59.3694325616239
+21
+1087.68206778655
+31
+1994.39059084441
+12
+-39.2272759245986
+22
+1087.68205849534
+32
+1974.77393798458
+13
+-39.2272759245986
+23
+1087.68205849534
+33
+1974.77393798458
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-59.3694325616239
+20
+1087.68206778655
+30
+1994.39059084441
+11
+-39.2273404582702
+21
+1076.22941306619
+31
+1974.77387714657
+12
+-59.3694970952955
+22
+1076.22942235741
+32
+1994.39053000639
+13
+-59.3694970952955
+23
+1076.22942235741
+33
+1994.39053000639
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2273404582702
+20
+1076.22941306619
+30
+1974.77387714657
+11
+-33.1252329353715
+21
+1078.14549914487
+31
+2012.84740605224
+12
+-59.3694970952955
+22
+1076.22942235741
+32
+1994.39053000639
+13
+-59.3694970952955
+23
+1076.22942235741
+33
+1994.39053000639
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1252329353715
+20
+1078.14549914487
+30
+2012.84740605224
+11
+-39.2273404582702
+21
+1076.22941306619
+31
+1974.77387714657
+12
+-22.0439379137581
+22
+1078.14549502223
+32
+2001.86904889088
+13
+-22.0439379137581
+23
+1078.14549502223
+33
+2001.86904889088
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-59.3694970952955
+20
+1076.22942235741
+30
+1994.39053000639
+11
+-39.1617791994563
+21
+1078.14545675366
+31
+2027.23071354802
+12
+-70.4714553052104
+22
+1076.22934769458
+32
+2020.22202371684
+13
+-70.4714553052104
+23
+1076.22934769458
+33
+2020.22202371684
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1617791994563
+20
+1078.14545675366
+30
+2027.23071354802
+11
+-59.3694970952955
+21
+1076.22942235741
+31
+1994.39053000639
+12
+-33.1252329353715
+22
+1078.14549914487
+32
+2012.84740605224
+13
+-33.1252329353715
+23
+1078.14549914487
+33
+2012.84740605224
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-18.7251686818196
+20
+-1491.10267866227
+30
+2149.63500412557
+11
+-7.98224724804656
+21
+-1575.77518791732
+31
+2074.37535805364
+12
+-16.2399513209942
+22
+-1479.42383714638
+32
+2132.22426540144
+13
+-16.2399513209942
+23
+-1479.42383714638
+33
+2132.22426540144
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3439119046243
+20
+-1575.77542175822
+30
+2057.25751676867
+11
+-80.0884082650914
+21
+-1479.42440887799
+31
+2092.3238212554
+12
+-94.1569105870414
+22
+-1491.10335208811
+32
+2102.87773026184
+13
+-94.1569105870414
+23
+-1491.10335208811
+33
+2102.87773026184
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1362951900026
+20
+-1635.02486008634
+30
+2012.83697729966
+11
+-39.1731753130775
+21
+-1575.77561416868
+31
+2027.21997005555
+12
+-33.1366290489928
+22
+-1575.77565655989
+32
+2012.83666255977
+13
+-33.1366290489928
+23
+-1575.77565655989
+33
+2012.83666255977
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1731753130775
+20
+-1575.77561416868
+30
+2027.21997005555
+11
+-33.1362951900026
+21
+-1635.02486008634
+31
+2012.83697729966
+12
+-39.1728414540873
+22
+-1635.02481769514
+32
+2027.22028479544
+13
+-39.1728414540873
+23
+-1635.02481769514
+33
+2027.22028479544
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.97085113442526
+20
+1078.14503050231
+30
+2074.3861015461
+11
+13.1341822217786
+21
+1076.2284205692
+31
+2106.06734395821
+12
+-14.9795415848991
+22
+1076.22858095908
+32
+2105.69575667421
+13
+-14.9795415848991
+23
+1076.22858095908
+33
+2105.69575667421
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+13.1341822217786
+20
+1076.2284205692
+30
+2106.06734395821
+11
+-7.97085113442526
+21
+1078.14503050231
+31
+2074.3861015461
+12
+7.62767851452085
+22
+1078.14494222063
+32
+2074.45888960491
+13
+7.62767851452085
+23
+1078.14494222063
+33
+2074.45888960491
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.1845368645104
+20
+1078.14493048035
+30
+2043.19517347961
+11
+59.3922331640569
+21
+1076.22831944724
+31
+2076.0353366617
+12
+33.1479906004257
+22
+1078.14488808915
+32
+2057.57848097538
+13
+33.1479906004257
+23
+1078.14488808915
+33
+2057.57848097538
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+59.3922331640569
+20
+1076.22831944724
+30
+2076.0353366617
+11
+39.1845368645104
+21
+1078.14493048035
+31
+2043.19517347961
+12
+70.4941913739718
+22
+1076.22839411006
+32
+2050.20384295124
+13
+70.4941913739718
+23
+1076.22839411006
+33
+2050.20384295124
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.0625974234421623
+20
+1105.4614427137
+30
+2035.21299417206
+11
+-20.3486042412317
+21
+1105.46140000763
+31
+2064.90342673756
+12
+-7.43285738619353
+22
+1105.46129774208
+32
+2070.45440584214
+13
+-7.43285738619353
+23
+1105.46129774208
+33
+2070.45440584214
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-40.8110352949755
+20
+1076.22878549019
+30
+2094.59379846504
+11
+-60.4276236204933
+21
+1087.68164845367
+31
+2074.45170266659
+12
+-60.4276881541649
+22
+1076.22900302453
+32
+2074.45164182857
+13
+-60.4276881541649
+23
+1076.22900302453
+33
+2074.45164182857
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-60.4276236204933
+20
+1087.68164845367
+30
+2074.45170266659
+11
+-40.8110352949755
+21
+1076.22878549019
+31
+2094.59379846504
+12
+-40.8109707613038
+22
+1087.68143091934
+32
+2094.59385930307
+13
+-40.8109707613038
+23
+1087.68143091934
+33
+2094.59385930307
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-61.0913396528737
+20
+-1491.10300172636
+30
+2133.75852037282
+11
+-52.13252569552
+21
+-1479.4241116404
+31
+2118.62416719069
+12
+-22.3655547436192
+22
+-1575.77530103172
+32
+2068.33881178997
+13
+-22.3655547436192
+23
+-1575.77530103172
+33
+2068.33881178997
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-95.851569329198
+20
+-1479.42468360743
+30
+2057.32721685097
+11
+-39.1731753130775
+21
+-1575.77561416868
+31
+2027.21997005555
+12
+-39.2459633723545
+22
+-1575.77553171729
+32
+2042.81849970453
+13
+-39.2459633723545
+23
+-1575.77553171729
+33
+2042.81849970453
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-114.43412340868
+20
+-1260.03663466403
+30
+2016.47582116289
+11
+-33.1379310731166
+21
+-1175.3644195961
+31
+2012.83543509865
+12
+-98.5576396546941
+22
+-1260.0367702577
+32
+1974.10965019129
+13
+-98.5576396546941
+23
+-1260.0367702577
+33
+1974.10965019129
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.1264639806523
+20
+-1271.7151812764
+30
+1939.34942428128
+11
+-26.4917714082634
+21
+-1491.10392998463
+31
+1922.31426925329
+12
+-26.4930734323873
+22
+-1260.03663933705
+32
+1922.31304179217
+13
+-26.4930734323873
+23
+-1260.03663933705
+33
+1922.31304179217
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-26.4917714082634
+20
+-1491.10392998463
+30
+1922.31426925329
+11
+-22.1264639806523
+21
+-1271.7151812764
+31
+1939.34942428128
+12
+-22.1251619565284
+22
+-1479.42489487959
+32
+1939.3506517424
+13
+-22.1251619565284
+23
+-1479.42489487959
+33
+1939.3506517424
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.3642181573071
+20
+-1175.36467512367
+30
+2002.0643607916
+11
+52.1310574918292
+21
+-1271.71566573164
+31
+1951.77888131083
+12
+61.0900030665619
+22
+-1260.03606969012
+32
+1936.64465220875
+13
+61.0900030665619
+23
+-1260.03606969012
+33
+1936.64465220875
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-80.0884082650914
+20
+-1479.42440887799
+30
+2092.3238212554
+11
+-33.3439119046243
+21
+-1575.77542175822
+31
+2057.25751676867
+12
+-22.3655547436192
+22
+-1575.77530103172
+32
+2068.33881178997
+13
+-22.3655547436192
+23
+-1575.77530103172
+33
+2068.33881178997
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+26.4904348219512
+20
+-1260.03514143184
+30
+2148.08890332828
+11
+67.6755129564576
+21
+-1491.10229951782
+31
+2129.35909332543
+12
+67.6742109323337
+22
+-1260.03500887024
+32
+2129.35786586431
+13
+67.6742109323337
+23
+-1260.03500887024
+33
+2129.35786586431
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+67.6755129564576
+20
+-1491.10229951782
+30
+2129.35909332543
+11
+26.4904348219512
+21
+-1260.03514143184
+31
+2148.08890332828
+12
+26.491736846075
+22
+-1491.10243207942
+32
+2148.0901307894
+13
+26.491736846075
+23
+-1491.10243207942
+33
+2148.0901307894
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.1731407508892
+20
+-1575.77508789537
+30
+2043.18442998714
+11
+39.2462626691564
+21
+-1635.02437387321
+31
+2027.58621507805
+12
+39.2459288101664
+22
+-1575.77517034675
+32
+2027.58590033816
+13
+39.2459288101664
+23
+-1575.77517034675
+33
+2027.58590033816
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2462626691564
+20
+-1635.02437387321
+30
+2027.58621507805
+11
+39.1731407508892
+21
+-1575.77508789537
+31
+2043.18442998714
+12
+39.1734746098794
+22
+-1635.02429142183
+32
+2043.18474472703
+13
+39.1734746098794
+23
+-1635.02429142183
+33
+2043.18474472703
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1728414540873
+20
+-1635.02481769514
+30
+2027.22028479544
+11
+-39.2459633723545
+21
+-1575.77553171729
+31
+2042.81849970453
+12
+-39.1731753130775
+22
+-1575.77561416868
+32
+2027.21997005555
+13
+-39.1731753130775
+23
+-1575.77561416868
+33
+2027.21997005555
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2459633723545
+20
+-1575.77553171729
+30
+2042.81849970453
+11
+-39.1728414540873
+21
+-1635.02481769514
+31
+2027.22028479544
+12
+-39.2456295133644
+22
+-1635.02473524376
+32
+2042.81881444442
+13
+-39.2456295133644
+23
+-1635.02473524376
+33
+2042.81881444442
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61761898721182
+20
+-1175.36447372759
+30
+1995.95502646913
+11
+-7.60922450597496
+21
+314.385213179183
+31
+1995.96294022367
+12
+7.98091066173456
+22
+-1175.36456200926
+32
+1996.02781452793
+13
+7.98091066173456
+23
+-1175.36456200926
+33
+1996.02781452793
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+80.0882420855246
+20
+-1479.42411318676
+30
+1978.08045470725
+11
+52.1310574918292
+21
+-1271.71566573164
+31
+1951.77888131083
+12
+80.0869400614005
+22
+-1271.71596296923
+32
+1978.07922724613
+13
+80.0869400614005
+23
+-1271.71596296923
+33
+1978.07922724613
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+52.1310574918292
+20
+-1271.71566573164
+30
+1951.77888131083
+11
+80.0882420855246
+21
+-1479.42411318676
+31
+1978.08045470725
+12
+52.132359515953
+22
+-1479.42441042435
+32
+1951.78010877195
+13
+52.132359515953
+23
+-1479.42441042435
+33
+1951.78010877195
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.61628240089973
+20
+-1575.77509963565
+30
+2074.44814611245
+11
+22.1249957769614
+21
+-1479.42362718516
+31
+2131.05362422024
+12
+-16.2399513209942
+22
+-1479.42383714638
+32
+2132.22426540144
+13
+-16.2399513209942
+23
+-1479.42383714638
+33
+2132.22426540144
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.60922450597496
+20
+314.385213179183
+30
+1995.96294022367
+11
+-22.0439379137581
+21
+1078.14549502223
+31
+2001.86904889088
+12
+-7.60492084946682
+22
+1078.14544501338
+32
+1995.96699742271
+13
+-7.60492084946682
+23
+1078.14544501338
+33
+1995.96699742271
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0439379137581
+20
+1078.14549502223
+30
+2001.86904889088
+11
+-7.60922450597496
+21
+314.385213179183
+31
+1995.96294022367
+12
+-22.056636051503
+22
+-1175.36442371874
+32
+2001.8570779373
+13
+-22.056636051503
+23
+-1175.36442371874
+33
+2001.8570779373
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.056636051503
+20
+-1175.36442371874
+30
+2001.8570779373
+11
+-7.60922450597496
+21
+314.385213179183
+31
+1995.96294022367
+12
+-7.61761898721182
+22
+-1175.36447372759
+32
+1995.95502646913
+13
+-7.61761898721182
+23
+-1175.36447372759
+33
+1995.95502646913
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-70.8430425900572
+20
+1076.22920044446
+30
+2048.33574752358
+11
+-70.4713907715387
+21
+1087.68199312372
+31
+2020.22208455487
+12
+-70.4714553052104
+22
+1076.22934769458
+32
+2020.22202371684
+13
+-70.4714553052104
+23
+1076.22934769458
+33
+2020.22202371684
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-70.4713907715387
+20
+1087.68199312372
+30
+2020.22208455487
+11
+-70.8430425900572
+21
+1076.22920044446
+31
+2048.33574752358
+12
+-70.8429780563856
+22
+1087.6818458736
+32
+2048.3358083616
+13
+-70.8429780563856
+23
+1087.6818458736
+33
+2048.3358083616
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.61628240089973
+20
+-1575.77509963565
+30
+2074.44814611245
+11
+22.055299465191
+21
+-1575.7750496268
+31
+2068.54609464427
+12
+67.6755129564576
+22
+-1491.10229951782
+32
+2129.35909332543
+13
+67.6755129564576
+23
+-1491.10229951782
+33
+2129.35909332543
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+57.1202981576705
+20
+-1271.71656243456
+30
+2115.28923569394
+11
+83.421946117878
+21
+-1479.42351402902
+31
+2087.33458058465
+12
+83.4206440937541
+22
+-1271.71656212697
+32
+2087.33335312354
+13
+83.4206440937541
+23
+-1271.71656212697
+33
+2087.33335312354
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+83.421946117878
+20
+-1479.42351402902
+30
+2087.33458058465
+11
+57.1202981576705
+21
+-1271.71656243456
+31
+2115.28923569394
+12
+57.1216001817944
+22
+-1479.42351372144
+32
+2115.29046315506
+13
+57.1216001817944
+23
+-1479.42351372144
+33
+2115.29046315506
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+18.7251341196313
+20
+-1491.10368340178
+30
+1920.76939591712
+11
+16.2384831173033
+21
+-1271.71539123762
+31
+1938.17878310009
+12
+18.7238320955074
+22
+-1260.0363927542
+32
+1920.768168456
+13
+18.7238320955074
+23
+-1260.0363927542
+33
+1920.768168456
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+16.2384831173033
+20
+-1271.71539123762
+30
+1938.17878310009
+11
+18.7251341196313
+21
+-1491.10368340178
+31
+1920.76939591712
+12
+16.2397851414271
+22
+-1479.42468491837
+32
+1938.18001056121
+13
+16.2397851414271
+23
+-1479.42468491837
+33
+1938.18001056121
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+26.4904348219512
+20
+-1260.03514143184
+30
+2148.08890332828
+11
+67.6742109323337
+21
+-1260.03500887024
+31
+2129.35786586431
+12
+7.61498037677585
+22
+-1175.36497652034
+32
+2074.44691865133
+13
+7.61498037677585
+23
+-1175.36497652034
+33
+2074.44691865133
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+98.5550010442582
+20
+-1260.03501051119
+30
+2096.29229492916
+11
+114.431484798243
+21
+-1260.03514610487
+31
+2053.92612395756
+12
+33.1352924626808
+22
+-1175.36503065183
+32
+2057.5665100218
+13
+33.1352924626808
+23
+-1175.36503065183
+33
+2057.5665100218
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3425753183123
+20
+-1175.36479585016
+30
+2013.1456558129
+11
+112.886611463429
+21
+-1260.03539500836
+31
+2008.70921842963
+12
+94.1555740007292
+22
+-1260.03571932837
+32
+1967.52544231974
+13
+94.1555740007292
+23
+-1260.03571932837
+33
+1967.52544231974
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1352924626808
+20
+-1175.36503065183
+30
+2057.5665100218
+11
+114.431484798243
+21
+-1260.03514610487
+31
+2053.92612395756
+12
+39.1718387267654
+22
+-1175.36498826062
+32
+2043.18320252602
+13
+39.1718387267654
+23
+-1175.36498826062
+33
+2043.18320252602
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-18.7264707059435
+20
+-1260.03538801469
+30
+2149.63377666445
+11
+-16.2399513209942
+21
+-1479.42383714638
+31
+2132.22426540144
+12
+-16.241253345118
+22
+-1271.71623900961
+32
+2132.22303794032
+13
+-16.241253345118
+23
+-1271.71623900961
+33
+2132.22303794032
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-16.2399513209942
+20
+-1479.42383714638
+30
+2132.22426540144
+11
+-18.7264707059435
+21
+-1260.03538801469
+31
+2149.63377666445
+12
+-18.7251686818196
+22
+-1491.10267866227
+32
+2149.63500412557
+13
+-18.7251686818196
+23
+-1491.10267866227
+33
+2149.63500412557
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3439119046243
+20
+-1575.77542175822
+30
+2057.25751676867
+11
+-39.1731753130775
+21
+-1575.77561416868
+31
+2027.21997005555
+12
+-39.2459633723545
+22
+-1575.77553171729
+32
+2042.81849970453
+13
+-39.2459633723545
+23
+-1575.77553171729
+33
+2042.81849970453
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1731753130775
+20
+-1575.77561416868
+30
+2027.21997005555
+11
+-33.3439119046243
+21
+-1575.77542175822
+31
+2057.25751676867
+12
+-33.1366290489928
+22
+-1575.77565655989
+32
+2012.83666255977
+13
+-33.1366290489928
+23
+-1575.77565655989
+33
+2012.83666255977
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1366290489928
+20
+-1575.77565655989
+30
+2012.83666255977
+11
+-33.3439119046243
+21
+-1575.77542175822
+31
+2057.25751676867
+12
+-22.3655547436192
+22
+-1575.77530103172
+32
+2068.33881178997
+13
+-22.3655547436192
+23
+-1575.77530103172
+33
+2068.33881178997
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1366290489928
+20
+-1575.77565655989
+30
+2012.83666255977
+11
+-22.3655547436192
+21
+-1575.77530103172
+31
+2068.33881178997
+12
+-22.0553340273792
+22
+-1575.77565243725
+32
+2001.85830539842
+13
+-22.0553340273792
+23
+-1575.77565243725
+33
+2001.85830539842
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0553340273792
+20
+-1575.77565243725
+30
+2001.85830539842
+11
+-22.3655547436192
+21
+-1575.77530103172
+31
+2068.33881178997
+12
+-7.98224724804656
+22
+-1575.77518791732
+32
+2074.37535805364
+13
+-7.98224724804656
+23
+-1575.77518791732
+33
+2074.37535805364
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0553340273792
+20
+-1575.77565243725
+30
+2001.85830539842
+11
+-7.98224724804656
+21
+-1575.77518791732
+31
+2074.37535805364
+12
+-7.61631696308793
+22
+-1575.7756024284
+32
+1995.95625393024
+13
+-7.61631696308793
+23
+-1575.7756024284
+33
+1995.95625393024
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61631696308793
+20
+-1575.7756024284
+30
+1995.95625393024
+11
+-7.98224724804656
+21
+-1575.77518791732
+31
+2074.37535805364
+12
+7.61628240089973
+22
+-1575.77509963565
+32
+2074.44814611245
+13
+7.61628240089973
+23
+-1575.77509963565
+33
+2074.44814611245
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61631696308793
+20
+-1575.7756024284
+30
+1995.95625393024
+11
+7.61628240089973
+21
+-1575.77509963565
+31
+2074.44814611245
+12
+7.98221268585839
+22
+-1575.77551414673
+32
+1996.02904198905
+13
+7.98221268585839
+23
+-1575.77551414673
+33
+1996.02904198905
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98221268585839
+20
+-1575.77551414673
+30
+1996.02904198905
+11
+7.61628240089973
+21
+-1575.77509963565
+31
+2074.44814611245
+12
+22.055299465191
+22
+-1575.7750496268
+32
+2068.54609464427
+13
+22.055299465191
+23
+-1575.7750496268
+33
+2068.54609464427
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98221268585839
+20
+-1575.77551414673
+30
+1996.02904198905
+11
+22.055299465191
+21
+-1575.7750496268
+31
+2068.54609464427
+12
+22.365520181431
+22
+-1575.77540103232
+32
+2002.06558825272
+13
+22.365520181431
+23
+-1575.77540103232
+33
+2002.06558825272
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.365520181431
+20
+-1575.77540103232
+30
+2002.06558825272
+11
+22.055299465191
+21
+-1575.7750496268
+31
+2068.54609464427
+12
+33.1365944868046
+22
+-1575.77504550416
+32
+2057.56773748292
+13
+33.1365944868046
+23
+-1575.77504550416
+33
+2057.56773748292
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.365520181431
+20
+-1575.77540103232
+30
+2002.06558825272
+11
+33.1365944868046
+21
+-1575.77504550416
+31
+2057.56773748292
+12
+33.3438773424362
+22
+-1575.77528030582
+32
+2013.14688327402
+13
+33.3438773424362
+23
+-1575.77528030582
+33
+2013.14688327402
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3438773424362
+20
+-1575.77528030582
+30
+2013.14688327402
+11
+33.1365944868046
+21
+-1575.77504550416
+31
+2057.56773748292
+12
+39.1731407508892
+22
+-1575.77508789537
+32
+2043.18442998714
+13
+39.1731407508892
+23
+-1575.77508789537
+33
+2043.18442998714
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3438773424362
+20
+-1575.77528030582
+30
+2013.14688327402
+11
+39.1731407508892
+21
+-1575.77508789537
+31
+2043.18442998714
+12
+39.2459288101664
+22
+-1575.77517034675
+32
+2027.58590033816
+13
+39.2459288101664
+23
+-1575.77517034675
+33
+2027.58590033816
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.055299465191
+20
+-1575.7750496268
+30
+2068.54609464427
+11
+33.1369283457947
+21
+-1635.02424903062
+31
+2057.56805222281
+12
+33.1365944868046
+22
+-1575.77504550416
+32
+2057.56773748292
+13
+33.1365944868046
+23
+-1575.77504550416
+33
+2057.56773748292
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1369283457947
+20
+-1635.02424903062
+30
+2057.56805222281
+11
+22.055299465191
+21
+-1575.7750496268
+31
+2068.54609464427
+12
+22.0556333241812
+22
+-1635.02425315326
+32
+2068.54640938416
+13
+22.0556333241812
+23
+-1635.02425315326
+33
+2068.54640938416
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3452139287482
+20
+-1175.36465439776
+30
+2057.25628930755
+11
+-39.2345672587327
+21
+1078.14537430228
+31
+2042.82924319699
+12
+-39.2472653964783
+22
+-1175.36454443869
+32
+2042.81727224341
+13
+-39.2472653964783
+23
+-1175.36454443869
+33
+2042.81727224341
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2345672587327
+20
+1078.14537430228
+30
+2042.82924319699
+11
+-33.3452139287482
+21
+-1175.36465439776
+31
+2057.25628930755
+12
+-33.3325157910026
+22
+1078.14526434321
+32
+2057.26826026113
+13
+-33.3325157910026
+23
+1078.14526434321
+33
+2057.26826026113
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.3642181573071
+20
+-1175.36467512367
+30
+2002.0643607916
+11
+7.99360879947956
+21
+1078.14535673171
+31
+1996.03978548152
+12
+22.3769162950522
+22
+1078.1452436173
+32
+2002.07633174518
+13
+22.3769162950522
+23
+1078.1452436173
+33
+2002.07633174518
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.99360879947956
+20
+1078.14535673171
+30
+1996.03978548152
+11
+22.3642181573071
+21
+-1175.36467512367
+31
+2002.0643607916
+12
+7.98091066173456
+22
+-1175.36456200926
+32
+1996.02781452793
+13
+7.98091066173456
+23
+-1175.36456200926
+33
+1996.02781452793
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3552734560573
+20
+1078.14512289081
+30
+2013.15762676649
+11
+39.2446267860425
+21
+-1175.36490580924
+31
+2027.58467287705
+12
+33.3425753183123
+22
+-1175.36479585016
+32
+2013.1456558129
+13
+33.3425753183123
+23
+-1175.36479585016
+33
+2013.1456558129
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2446267860425
+20
+-1175.36490580924
+30
+2027.58467287705
+11
+33.3552734560573
+21
+1078.14512289081
+31
+2013.15762676649
+12
+39.2573249237874
+22
+1078.14501293173
+32
+2027.59664383063
+13
+39.2573249237874
+23
+1078.14501293173
+33
+2027.59664383063
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-94.1569105870414
+20
+-1491.10335208811
+30
+2102.87773026184
+11
+-112.887948049741
+21
+-1491.10367640812
+31
+2061.69395415194
+12
+-33.3439119046243
+22
+-1575.77542175822
+32
+2057.25751676867
+13
+-33.3439119046243
+23
+-1575.77542175822
+33
+2057.25751676867
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-14.9794770512274
+20
+1087.68122638822
+30
+2105.69581751223
+11
+13.1341822217786
+21
+1076.2284205692
+31
+2106.06734395821
+12
+13.1342467554502
+22
+1087.68106599834
+32
+2106.06740479624
+13
+13.1342467554502
+23
+1087.68106599834
+33
+2106.06740479624
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+13.1341822217786
+20
+1076.2284205692
+30
+2106.06734395821
+11
+-14.9794770512274
+21
+1087.68122638822
+31
+2105.69581751223
+12
+-14.9795415848991
+22
+1076.22858095908
+32
+2105.69575667421
+13
+-14.9795415848991
+23
+1076.22858095908
+33
+2105.69575667421
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.62767851452085
+20
+1078.14494222063
+30
+2074.45888960491
+11
+22.062391922304
+21
+314.384660377585
+31
+2068.5527809377
+12
+22.0666955788121
+22
+1078.14489221178
+32
+2068.55683813674
+13
+22.0666955788121
+23
+1078.14489221178
+33
+2068.55683813674
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.062391922304
+20
+314.384660377585
+30
+2068.5527809377
+11
+7.62767851452085
+21
+1078.14494222063
+31
+2074.45888960491
+12
+7.61498037677585
+22
+-1175.36497652034
+32
+2074.44691865133
+13
+7.61498037677585
+23
+-1175.36497652034
+33
+2074.44691865133
+70
+13
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.062391922304
+20
+314.384660377585
+30
+2068.5527809377
+11
+7.61498037677585
+21
+-1175.36497652034
+31
+2074.44691865133
+12
+22.0539974410672
+22
+-1175.36502652919
+32
+2068.54486718316
+13
+22.0539974410672
+23
+-1175.36502652919
+33
+2068.54486718316
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.98224724804656
+20
+-1575.77518791732
+30
+2074.37535805364
+11
+7.61628240089973
+21
+-1575.77509963565
+31
+2074.44814611245
+12
+-16.2399513209942
+22
+-1479.42383714638
+32
+2132.22426540144
+13
+-16.2399513209942
+23
+-1479.42383714638
+33
+2132.22426540144
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.055299465191
+20
+-1575.7750496268
+30
+2068.54609464427
+11
+33.1365944868046
+21
+-1575.77504550416
+31
+2057.56773748292
+12
+83.421946117878
+22
+-1479.42351402902
+32
+2087.33458058465
+13
+83.421946117878
+23
+-1479.42351402902
+33
+2087.33458058465
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-80.0897102892153
+20
+-1271.715667278
+30
+2092.32259379428
+11
+-52.13252569552
+21
+-1479.4241116404
+31
+2118.62416719069
+12
+-52.1338277196439
+22
+-1271.71596451559
+32
+2118.62293972957
+13
+-52.1338277196439
+23
+-1271.71596451559
+33
+2118.62293972957
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-52.13252569552
+20
+-1479.4241116404
+30
+2118.62416719069
+11
+-80.0897102892153
+21
+-1271.715667278
+31
+2092.32259379428
+12
+-80.0884082650914
+22
+-1479.42440887799
+32
+2092.3238212554
+13
+-80.0884082650914
+23
+-1479.42440887799
+33
+2092.3238212554
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-67.6755475186457
+20
+-1491.10406254623
+30
+1941.04530671726
+11
+-57.1230683854853
+21
+-1271.71506781267
+31
+1955.11258534646
+12
+-67.6768495427695
+22
+-1260.03677189865
+32
+1941.04407925614
+13
+-67.6768495427695
+23
+-1260.03677189865
+33
+1941.04407925614
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-57.1230683854853
+20
+-1271.71506781267
+30
+1955.11258534646
+11
+-67.6755475186457
+21
+-1491.10406254623
+31
+1941.04530671726
+12
+-57.1217663613614
+22
+-1479.42500834332
+32
+1955.11381280758
+13
+-57.1217663613614
+23
+-1479.42500834332
+33
+1955.11381280758
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.366856767743
+20
+-1175.36477512426
+30
+2068.33758432885
+11
+-33.3325157910026
+21
+1078.14526434321
+31
+2057.26826026113
+12
+-33.3452139287482
+22
+-1175.36465439776
+32
+2057.25628930755
+13
+-33.3452139287482
+23
+-1175.36465439776
+33
+2057.25628930755
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3325157910026
+20
+1078.14526434321
+30
+2057.26826026113
+11
+-22.366856767743
+21
+-1175.36477512426
+31
+2068.33758432885
+12
+-22.354158629998
+22
+1078.14514361671
+32
+2068.34955528244
+13
+-22.354158629998
+23
+1078.14514361671
+33
+2068.34955528244
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.0666955788121
+20
+1078.14489221178
+30
+2068.55683813674
+11
+33.1352924626808
+21
+-1175.36503065183
+31
+2057.5665100218
+12
+33.1479906004257
+22
+1078.14488808915
+32
+2057.57848097538
+13
+33.1479906004257
+23
+1078.14488808915
+33
+2057.57848097538
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1352924626808
+20
+-1175.36503065183
+30
+2057.5665100218
+11
+22.0666955788121
+21
+1078.14489221178
+31
+2068.55683813674
+12
+22.062391922304
+22
+314.384660377585
+32
+2068.5527809377
+13
+22.062391922304
+23
+314.384660377585
+33
+2068.5527809377
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-70.4714553052104
+20
+1076.22934769458
+30
+2020.22202371684
+11
+-39.2345672587327
+21
+1078.14537430228
+31
+2042.82924319699
+12
+-70.8430425900572
+22
+1076.22920044446
+32
+2048.33574752358
+13
+-70.8430425900572
+23
+1076.22920044446
+33
+2048.33574752358
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2345672587327
+20
+1078.14537430228
+30
+2042.82924319699
+11
+-70.4714553052104
+21
+1076.22934769458
+31
+2020.22202371684
+12
+-39.1617791994563
+22
+1078.14545675366
+32
+2027.23071354802
+13
+-39.1617791994563
+23
+1078.14545675366
+33
+2027.23071354802
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+40.8337713637369
+20
+1076.22895631445
+30
+1975.83206820304
+11
+33.3552734560573
+21
+1078.14512289081
+31
+2013.15762676649
+12
+22.3769162950522
+22
+1078.1452436173
+32
+2002.07633174518
+13
+22.3769162950522
+23
+1078.1452436173
+33
+2002.07633174518
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3552734560573
+20
+1078.14512289081
+30
+2013.15762676649
+11
+40.8337713637369
+21
+1076.22895631445
+31
+1975.83206820304
+12
+60.4504242229264
+22
+1076.22873878012
+32
+1995.97422483951
+13
+60.4504242229264
+23
+1076.22873878012
+33
+1995.97422483951
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3438773424362
+20
+-1575.77528030582
+30
+2013.14688327402
+11
+22.365520181431
+21
+-1575.77540103232
+31
+2002.06558825272
+12
+52.132359515953
+22
+-1479.42441042435
+32
+1951.78010877195
+13
+52.132359515953
+23
+-1479.42441042435
+33
+1951.78010877195
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1731753130775
+20
+-1575.77561416868
+30
+2027.21997005555
+11
+-114.432821384555
+21
+-1491.10392531161
+31
+2016.47704862401
+12
+-33.1366290489928
+22
+-1575.77565655989
+32
+2012.83666255977
+13
+-33.1366290489928
+23
+-1575.77565655989
+33
+2012.83666255977
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2501410607034
+20
+1087.68097416759
+30
+2095.65205035954
+11
+59.3922331640569
+21
+1076.22831944724
+31
+2076.0353366617
+12
+59.3922976977286
+22
+1087.68096487638
+32
+2076.03539749972
+13
+59.3922976977286
+23
+1087.68096487638
+33
+2076.03539749972
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+59.3922331640569
+20
+1076.22831944724
+30
+2076.0353366617
+11
+39.2501410607034
+21
+1087.68097416759
+31
+2095.65205035954
+12
+39.2500765270318
+22
+1076.22832873845
+32
+2095.65198952152
+13
+39.2500765270318
+23
+1076.22832873845
+33
+2095.65198952152
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0553340273792
+20
+-1575.77565243725
+30
+2001.85830539842
+11
+-83.4221122974449
+21
+-1479.42500803573
+31
+1983.06969537799
+12
+-57.1217663613614
+22
+-1479.42500834332
+32
+1955.11381280758
+13
+-57.1217663613614
+23
+-1479.42500834332
+33
+1955.11381280758
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+97.0220443296732
+20
+-1479.4236280611
+30
+2051.44200620966
+11
+39.1731407508892
+21
+-1575.77508789537
+31
+2043.18442998714
+12
+39.2459288101664
+22
+-1575.77517034675
+32
+2027.58590033816
+13
+39.2459288101664
+23
+-1575.77517034675
+33
+2027.58590033816
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.000316577896367365
+20
+-1635.02455455848
+30
+2035.20251476124
+11
+-21.0785055001976
+21
+-1635.02449443909
+31
+2068.87914953561
+12
+-33.3435780456342
+22
+-1635.02462528468
+32
+2057.25783150856
+13
+-33.3435780456342
+23
+-1635.02462528468
+33
+2057.25783150856
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98254654484851
+20
+-1635.02471767319
+30
+1996.02935672895
+11
+0.000316577896367365
+21
+-1635.02455455848
+31
+2035.20251476124
+12
+-7.61598310409778
+22
+-1635.02480595485
+32
+1995.95656867013
+13
+-7.61598310409778
+23
+-1635.02480595485
+33
+1995.95656867013
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.056636051503
+20
+-1175.36442371874
+30
+2001.8570779373
+11
+-57.1230683854853
+21
+-1271.71506781267
+31
+1955.11258534646
+12
+-83.4234143215687
+22
+-1271.71506812026
+32
+1983.06846791687
+13
+-83.4234143215687
+23
+-1271.71506812026
+33
+1983.06846791687
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-97.0222105092401
+20
+-1479.42489400365
+30
+2018.96226975299
+11
+-95.8528713533217
+21
+-1271.71539254856
+31
+2057.32598938986
+12
+-97.0235125333639
+22
+-1271.71518215234
+32
+2018.96104229187
+13
+-97.0235125333639
+23
+-1271.71518215234
+33
+2018.96104229187
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-95.8528713533217
+20
+-1271.71539254856
+30
+2057.32598938986
+11
+-97.0222105092401
+21
+-1479.42489400365
+31
+2018.96226975299
+12
+-95.851569329198
+22
+-1479.42468360743
+32
+2057.32721685097
+13
+-95.851569329198
+23
+-1479.42468360743
+33
+2057.32721685097
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+0.0625974234421623
+20
+1105.4614427137
+30
+2035.21299417206
+11
+-19.5567568228792
+21
+1105.46171379563
+31
+2004.99346607832
+12
+-29.6278351413918
+22
+1105.46171844124
+32
+2014.80179250824
+13
+-29.6278351413918
+23
+1105.46171844124
+33
+2014.80179250824
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61598310409778
+20
+-1635.02480595485
+30
+1995.95656867013
+11
+-22.0553340273792
+21
+-1575.77565243725
+31
+2001.85830539842
+12
+-7.61631696308793
+22
+-1575.7756024284
+32
+1995.95625393024
+13
+-7.61631696308793
+23
+-1575.7756024284
+33
+1995.95625393024
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0553340273792
+20
+-1575.77565243725
+30
+2001.85830539842
+11
+-7.61598310409778
+21
+-1635.02480595485
+31
+1995.95656867013
+12
+-22.055000168389
+22
+-1635.02485596371
+32
+2001.85862013831
+13
+-22.055000168389
+23
+-1635.02485596371
+33
+2001.85862013831
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-112.889250073865
+20
+-1260.03638576054
+30
+2061.69272669082
+11
+-33.3452139287482
+21
+-1175.36465439776
+31
+2057.25628930755
+12
+-39.2472653964783
+22
+-1175.36454443869
+32
+2042.81727224341
+13
+-39.2472653964783
+23
+-1175.36454443869
+33
+2042.81727224341
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+67.6742109323337
+20
+-1260.03500887024
+30
+2129.35786586431
+11
+57.1216001817944
+21
+-1479.42351372144
+31
+2115.29046315506
+12
+57.1202981576705
+22
+-1271.71656243456
+32
+2115.28923569394
+13
+57.1202981576705
+23
+-1271.71656243456
+33
+2115.28923569394
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+57.1216001817944
+20
+-1479.42351372144
+30
+2115.29046315506
+11
+67.6742109323337
+21
+-1260.03500887024
+31
+2129.35786586431
+12
+67.6755129564576
+22
+-1491.10229951782
+32
+2129.35909332543
+13
+67.6755129564576
+23
+-1491.10229951782
+33
+2129.35909332543
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98221268585839
+20
+-1575.77551414673
+30
+1996.02904198905
+11
+18.7251341196313
+21
+-1491.10368340178
+31
+1920.76939591712
+12
+61.0913050906858
+22
+-1491.1033603377
+32
+1936.64587966987
+13
+61.0913050906858
+23
+-1491.1033603377
+33
+1936.64587966987
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+57.1216001817944
+20
+-1479.42351372144
+30
+2115.29046315506
+11
+22.055299465191
+21
+-1575.7750496268
+31
+2068.54609464427
+12
+83.421946117878
+22
+-1479.42351402902
+32
+2087.33458058465
+13
+83.421946117878
+23
+-1479.42351402902
+33
+2087.33458058465
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+95.8501011255072
+20
+-1271.71623769867
+30
+2013.07583165055
+11
+112.886611463429
+21
+-1260.03539500836
+31
+2008.70921842963
+12
+39.2446267860425
+22
+-1175.36490580924
+32
+2027.58467287705
+13
+39.2446267860425
+23
+-1175.36490580924
+33
+2027.58467287705
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+83.4206440937541
+20
+-1271.71656212697
+30
+2087.33335312354
+11
+98.5550010442582
+21
+-1260.03501051119
+31
+2096.29229492916
+12
+33.1352924626808
+22
+-1175.36503065183
+32
+2057.5665100218
+13
+33.1352924626808
+23
+-1175.36503065183
+33
+2057.5665100218
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2459288101664
+20
+-1575.77517034675
+30
+2027.58590033816
+11
+112.887913487553
+21
+-1491.10268565594
+31
+2008.71044589075
+12
+95.8514031496311
+22
+-1479.42383845732
+32
+2013.07705911167
+13
+95.8514031496311
+23
+-1479.42383845732
+33
+2013.07705911167
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.1365944868046
+20
+-1575.77504550416
+30
+2057.56773748292
+11
+98.5563030683821
+21
+-1491.10230115877
+31
+2096.29352239028
+12
+83.421946117878
+22
+-1479.42351402902
+32
+2087.33458058465
+13
+83.421946117878
+23
+-1479.42351402902
+33
+2087.33458058465
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+70.8658431924901
+20
+1087.68118678933
+30
+2022.09017998252
+11
+70.4941913739718
+21
+1076.22839411006
+31
+2050.20384295124
+12
+70.8657786588185
+22
+1076.22854136019
+32
+2022.0901191445
+13
+70.8657786588185
+23
+1076.22854136019
+33
+2022.0901191445
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+70.4941913739718
+20
+1076.22839411006
+30
+2050.20384295124
+11
+70.8658431924901
+21
+1087.68118678933
+31
+2022.09017998252
+12
+70.4942559076435
+22
+1087.68103953921
+32
+2050.20390378926
+13
+70.4942559076435
+23
+1087.68103953921
+33
+2050.20390378926
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.0553340273792
+20
+-1575.77565243725
+30
+2001.85830539842
+11
+-67.6755475186457
+21
+-1491.10406254623
+31
+1941.04530671726
+12
+-7.61631696308793
+22
+-1575.7756024284
+32
+1995.95625393024
+13
+-7.61631696308793
+23
+-1575.7756024284
+33
+1995.95625393024
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3438773424362
+20
+-1575.77528030582
+30
+2013.14688327402
+11
+94.1568760248532
+21
+-1491.10300997595
+31
+1967.52666978086
+12
+112.887913487553
+22
+-1491.10268565594
+32
+2008.71044589075
+13
+112.887913487553
+23
+-1491.10268565594
+33
+2008.71044589075
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1744773372013
+20
+-1175.36446198731
+30
+2027.21874259443
+11
+-33.1295365918798
+21
+314.385267310674
+31
+2012.8433488532
+12
+-33.1379310731166
+22
+-1175.3644195961
+32
+2012.83543509865
+13
+-33.1379310731166
+23
+-1175.3644195961
+33
+2012.83543509865
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1295365918798
+20
+314.385267310674
+30
+2012.8433488532
+11
+-39.1744773372013
+21
+-1175.36446198731
+31
+2027.21874259443
+12
+-33.1252329353715
+22
+1078.14549914487
+32
+2012.84740605224
+13
+-33.1252329353715
+23
+1078.14549914487
+33
+2012.84740605224
+70
+3
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1252329353715
+20
+1078.14549914487
+30
+2012.84740605224
+11
+-39.1744773372013
+21
+-1175.36446198731
+31
+2027.21874259443
+12
+-39.1617791994563
+22
+1078.14545675366
+32
+2027.23071354802
+13
+-39.1617791994563
+23
+1078.14545675366
+33
+2027.23071354802
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61631696308793
+20
+-1575.7756024284
+30
+1995.95625393024
+11
+-67.6755475186457
+21
+-1491.10406254623
+31
+1941.04530671726
+12
+-26.4917714082634
+22
+-1491.10392998463
+32
+1922.31426925329
+13
+-26.4917714082634
+23
+-1491.10392998463
+33
+1922.31426925329
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.61628240089973
+20
+-1575.77509963565
+30
+2074.44814611245
+11
+22.0556333241812
+21
+-1635.02425315326
+31
+2068.54640938416
+12
+22.055299465191
+22
+-1575.7750496268
+32
+2068.54609464427
+13
+22.055299465191
+23
+-1575.7750496268
+33
+2068.54609464427
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.0556333241812
+20
+-1635.02425315326
+30
+2068.54640938416
+11
+7.61628240089973
+21
+-1575.77509963565
+31
+2074.44814611245
+12
+7.61661625988982
+22
+-1635.02430316211
+32
+2074.44846085234
+13
+7.61661625988982
+23
+-1635.02430316211
+33
+2074.44846085234
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2456295133644
+20
+-1635.02473524376
+30
+2042.81881444442
+11
+-33.3439119046243
+21
+-1575.77542175822
+31
+2057.25751676867
+12
+-39.2459633723545
+22
+-1575.77553171729
+32
+2042.81849970453
+13
+-39.2459633723545
+23
+-1575.77553171729
+33
+2042.81849970453
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.3439119046243
+20
+-1575.77542175822
+30
+2057.25751676867
+11
+-39.2456295133644
+21
+-1635.02473524376
+31
+2042.81881444442
+12
+-33.3435780456342
+22
+-1635.02462528468
+32
+2057.25783150856
+13
+-33.3435780456342
+23
+-1635.02462528468
+33
+2057.25783150856
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1744773372013
+20
+-1175.36446198731
+30
+2027.21874259443
+11
+-33.1379310731166
+21
+-1175.3644195961
+31
+2012.83543509865
+12
+-114.43412340868
+22
+-1260.03663466403
+32
+2016.47582116289
+13
+-114.43412340868
+23
+-1260.03663466403
+33
+2016.47582116289
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-94.1582126111653
+20
+-1260.03606144053
+30
+2102.87650280072
+11
+-33.3452139287482
+21
+-1175.36465439776
+31
+2057.25628930755
+12
+-112.889250073865
+22
+-1260.03638576054
+32
+2061.69272669082
+13
+-112.889250073865
+23
+-1260.03638576054
+33
+2061.69272669082
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-16.241253345118
+20
+-1271.71623900961
+30
+2132.22303794032
+11
+22.1249957769614
+21
+-1479.42362718516
+31
+2131.05362422024
+12
+22.1236937528375
+22
+-1271.71644897083
+32
+2131.05239675912
+13
+22.1236937528375
+23
+-1271.71644897083
+33
+2131.05239675912
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+22.1249957769614
+20
+-1479.42362718516
+30
+2131.05362422024
+11
+-16.241253345118
+21
+-1271.71623900961
+31
+2132.22303794032
+12
+-16.2399513209942
+22
+-1479.42383714638
+32
+2132.22426540144
+13
+-16.2399513209942
+23
+-1479.42383714638
+33
+2132.22426540144
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.055000168389
+20
+-1635.02485596371
+30
+2001.85862013831
+11
+-33.1366290489928
+21
+-1575.77565655989
+31
+2012.83666255977
+12
+-22.0553340273792
+22
+-1575.77565243725
+32
+2001.85830539842
+13
+-22.0553340273792
+23
+-1575.77565243725
+33
+2001.85830539842
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1366290489928
+20
+-1575.77565655989
+30
+2012.83666255977
+11
+-22.055000168389
+21
+-1635.02485596371
+31
+2001.85862013831
+12
+-33.1362951900026
+22
+-1635.02486008634
+32
+2012.83697729966
+13
+-33.1362951900026
+23
+-1635.02486008634
+33
+2012.83697729966
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+97.0207423055492
+20
+-1271.71644809489
+30
+2051.44077874854
+11
+95.8514031496311
+21
+-1479.42383845732
+31
+2013.07705911167
+12
+95.8501011255072
+22
+-1271.71623769867
+32
+2013.07583165055
+13
+95.8501011255072
+23
+-1271.71623769867
+33
+2013.07583165055
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+95.8514031496311
+20
+-1479.42383845732
+30
+2013.07705911167
+11
+97.0207423055492
+21
+-1271.71644809489
+31
+2051.44077874854
+12
+97.0220443296732
+22
+-1479.4236280611
+32
+2051.44200620966
+13
+97.0220443296732
+23
+-1479.4236280611
+33
+2051.44200620966
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-114.432821384555
+20
+-1491.10392531161
+30
+2016.47704862401
+11
+-98.5563376305701
+21
+-1491.10406090528
+31
+1974.11087765241
+12
+-33.1366290489928
+22
+-1575.77565655989
+32
+2012.83666255977
+13
+-33.1366290489928
+23
+-1575.77565655989
+33
+2012.83666255977
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2446267860425
+20
+-1175.36490580924
+30
+2027.58467287705
+11
+112.886611463429
+21
+-1260.03539500836
+31
+2008.70921842963
+12
+33.3425753183123
+22
+-1175.36479585016
+32
+2013.1456558129
+13
+33.3425753183123
+23
+-1175.36479585016
+33
+2013.1456558129
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-83.4234143215687
+20
+-1271.71506812026
+30
+1983.06846791687
+11
+-98.5576396546941
+21
+-1260.0367702577
+31
+1974.10965019129
+12
+-33.1379310731166
+22
+-1175.3644195961
+32
+2012.83543509865
+13
+-33.1379310731166
+23
+-1175.3644195961
+33
+2012.83543509865
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.056636051503
+20
+-1175.36442371874
+30
+2001.8570779373
+11
+-67.6768495427695
+21
+-1260.03677189865
+31
+1941.04407925614
+12
+-57.1230683854853
+22
+-1271.71506781267
+32
+1955.11258534646
+13
+-57.1230683854853
+23
+-1271.71506781267
+33
+1955.11258534646
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+15.0022776536605
+20
+1076.22916084557
+30
+1964.73010999387
+11
+-13.1113816193455
+21
+1087.68196666459
+31
+1964.35858354789
+12
+15.0023421873321
+22
+1087.68180627471
+32
+1964.7301708319
+13
+15.0023421873321
+23
+1087.68180627471
+33
+1964.7301708319
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-13.1113816193455
+20
+1087.68196666459
+30
+1964.35858354789
+11
+15.0022776536605
+21
+1076.22916084557
+31
+1964.73010999387
+12
+-13.1114461530171
+22
+1076.22932123545
+32
+1964.35852270987
+13
+-13.1114461530171
+23
+1076.22932123545
+33
+1964.35852270987
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.2472653964783
+20
+-1175.36454443869
+30
+2042.81727224341
+11
+-39.1617791994563
+21
+1078.14545675366
+31
+2027.23071354802
+12
+-39.1744773372013
+22
+-1175.36446198731
+32
+2027.21874259443
+13
+-39.1744773372013
+23
+-1175.36446198731
+33
+2027.21874259443
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-39.1617791994563
+20
+1078.14545675366
+30
+2027.23071354802
+11
+-39.2472653964783
+21
+-1175.36454443869
+31
+2042.81727224341
+12
+-39.2345672587327
+22
+1078.14537430228
+32
+2042.82924319699
+13
+-39.2345672587327
+23
+1078.14537430228
+33
+2042.82924319699
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-83.4234143215687
+20
+-1271.71506812026
+30
+1983.06846791687
+11
+-33.1379310731166
+21
+-1175.3644195961
+31
+2012.83543509865
+12
+-22.056636051503
+22
+-1175.36442371874
+32
+2001.8570779373
+13
+-22.056636051503
+23
+-1175.36442371874
+33
+2001.8570779373
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+7.98221268585839
+20
+-1575.77551414673
+30
+1996.02904198905
+11
+-22.1251619565284
+21
+-1479.42489487959
+31
+1939.3506517424
+12
+16.2397851414271
+22
+-1479.42468491837
+32
+1938.18001056121
+13
+16.2397851414271
+23
+-1479.42468491837
+33
+1938.18001056121
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-7.61631696308793
+20
+-1575.7756024284
+30
+1995.95625393024
+11
+-22.1251619565284
+21
+-1479.42489487959
+31
+1939.3506517424
+12
+7.98221268585839
+22
+-1575.77551414673
+32
+1996.02904198905
+13
+7.98221268585839
+23
+-1575.77551414673
+33
+1996.02904198905
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+98.5550010442582
+20
+-1260.03501051119
+30
+2096.29229492916
+11
+114.432786822367
+21
+-1491.10243675244
+31
+2053.92735141868
+12
+114.431484798243
+22
+-1260.03514610487
+32
+2053.92612395756
+13
+114.431484798243
+23
+-1260.03514610487
+33
+2053.92612395756
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+114.432786822367
+20
+-1491.10243675244
+30
+2053.92735141868
+11
+98.5550010442582
+21
+-1260.03501051119
+31
+2096.29229492916
+12
+98.5563030683821
+22
+-1491.10230115877
+32
+2096.29352239028
+13
+98.5563030683821
+23
+-1491.10230115877
+33
+2096.29352239028
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-57.1217663613614
+20
+-1479.42500834332
+30
+1955.11381280758
+11
+-83.4234143215687
+21
+-1271.71506812026
+31
+1983.06846791687
+12
+-57.1230683854853
+22
+-1271.71506781267
+32
+1955.11258534646
+13
+-57.1230683854853
+23
+-1271.71506781267
+33
+1955.11258534646
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-83.4234143215687
+20
+-1271.71506812026
+30
+1983.06846791687
+11
+-57.1217663613614
+21
+-1479.42500834332
+31
+1955.11381280758
+12
+-83.4221122974449
+22
+-1479.42500803573
+32
+1983.06969537799
+13
+-83.4221122974449
+23
+-1479.42500803573
+33
+1983.06969537799
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+16.2397851414271
+20
+-1479.42468491837
+30
+1938.18001056121
+11
+-22.1264639806523
+21
+-1271.7151812764
+31
+1939.34942428128
+12
+16.2384831173033
+22
+-1271.71539123762
+32
+1938.17878310009
+13
+16.2384831173033
+23
+-1271.71539123762
+33
+1938.17878310009
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.1264639806523
+20
+-1271.7151812764
+30
+1939.34942428128
+11
+16.2397851414271
+21
+-1479.42468491837
+31
+1938.18001056121
+12
+-22.1251619565284
+22
+-1479.42489487959
+32
+1939.3506517424
+13
+-22.1251619565284
+23
+-1479.42489487959
+33
+1939.3506517424
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-22.3655547436192
+20
+-1575.77530103172
+30
+2068.33881178997
+11
+-52.13252569552
+21
+-1479.4241116404
+31
+2118.62416719069
+12
+-80.0884082650914
+22
+-1479.42440887799
+32
+2092.3238212554
+13
+-80.0884082650914
+23
+-1479.42440887799
+33
+2092.3238212554
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+97.0220443296732
+20
+-1479.4236280611
+30
+2051.44200620966
+11
+39.2459288101664
+21
+-1575.77517034675
+31
+2027.58590033816
+12
+95.8514031496311
+22
+-1479.42383845732
+32
+2013.07705911167
+13
+95.8514031496311
+23
+-1479.42383845732
+33
+2013.07705911167
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+61.0900030665619
+20
+-1260.03606969012
+30
+1936.64465220875
+11
+7.98091066173456
+21
+-1175.36456200926
+31
+1996.02781452793
+12
+22.3642181573071
+22
+-1175.36467512367
+32
+2002.0643607916
+13
+22.3642181573071
+23
+-1175.36467512367
+33
+2002.0643607916
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2459288101664
+20
+-1575.77517034675
+30
+2027.58590033816
+11
+33.3438773424362
+21
+-1575.77528030582
+31
+2013.14688327402
+12
+112.887913487553
+22
+-1491.10268565594
+32
+2008.71044589075
+13
+112.887913487553
+23
+-1491.10268565594
+33
+2008.71044589075
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+-33.1366290489928
+20
+-1575.77565655989
+30
+2012.83666255977
+11
+-83.4221122974449
+21
+-1479.42500803573
+31
+1983.06969537799
+12
+-22.0553340273792
+22
+-1575.77565243725
+32
+2001.85830539842
+13
+-22.0553340273792
+23
+-1575.77565243725
+33
+2001.85830539842
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+52.1310574918292
+20
+-1271.71566573164
+30
+1951.77888131083
+11
+61.0913050906858
+21
+-1491.1033603377
+31
+1936.64587966987
+12
+61.0900030665619
+22
+-1260.03606969012
+32
+1936.64465220875
+13
+61.0900030665619
+23
+-1260.03606969012
+33
+1936.64465220875
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+61.0913050906858
+20
+-1491.1033603377
+30
+1936.64587966987
+11
+52.1310574918292
+21
+-1271.71566573164
+31
+1951.77888131083
+12
+52.132359515953
+22
+-1479.42441042435
+32
+1951.78010877195
+13
+52.132359515953
+23
+-1479.42441042435
+33
+1951.78010877195
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+61.0913050906858
+20
+-1491.1033603377
+30
+1936.64587966987
+11
+18.7238320955074
+21
+-1260.0363927542
+31
+1920.768168456
+12
+61.0900030665619
+22
+-1260.03606969012
+32
+1936.64465220875
+13
+61.0900030665619
+23
+-1260.03606969012
+33
+1936.64465220875
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+18.7238320955074
+20
+-1260.0363927542
+30
+1920.768168456
+11
+61.0913050906858
+21
+-1491.1033603377
+31
+1936.64587966987
+12
+18.7251341196313
+22
+-1491.10368340178
+32
+1920.76939591712
+13
+18.7251341196313
+23
+-1491.10368340178
+33
+1920.76939591712
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-94.1569105870414
+20
+-1491.10335208811
+30
+2102.87773026184
+11
+-80.0897102892153
+21
+-1271.715667278
+31
+2092.32259379428
+12
+-94.1582126111653
+22
+-1260.03606144053
+32
+2102.87650280072
+13
+-94.1582126111653
+23
+-1260.03606144053
+33
+2102.87650280072
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-80.0897102892153
+20
+-1271.715667278
+30
+2092.32259379428
+11
+-94.1569105870414
+21
+-1491.10335208811
+31
+2102.87773026184
+12
+-80.0884082650914
+22
+-1479.42440887799
+32
+2092.3238212554
+13
+-80.0884082650914
+23
+-1479.42440887799
+33
+2092.3238212554
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+95.8501011255072
+20
+-1271.71623769867
+30
+2013.07583165055
+11
+112.887913487553
+21
+-1491.10268565594
+31
+2008.71044589075
+12
+112.886611463429
+22
+-1260.03539500836
+32
+2008.70921842963
+13
+112.886611463429
+23
+-1260.03539500836
+33
+2008.70921842963
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+112.887913487553
+20
+-1491.10268565594
+30
+2008.71044589075
+11
+95.8501011255072
+21
+-1271.71623769867
+31
+2013.07583165055
+12
+95.8514031496311
+22
+-1479.42383845732
+32
+2013.07705911167
+13
+95.8514031496311
+23
+-1479.42383845732
+33
+2013.07705911167
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-95.851569329198
+20
+-1479.42468360743
+30
+2057.32721685097
+11
+-97.0222105092401
+21
+-1479.42489400365
+31
+2018.96226975299
+12
+-39.1731753130775
+22
+-1575.77561416868
+32
+2027.21997005555
+13
+-39.1731753130775
+23
+-1575.77561416868
+33
+2027.21997005555
+70
+0
+ 0
+3DFACE
+ 8
+crank_full
+10
+39.2459288101664
+20
+-1575.77517034675
+30
+2027.58590033816
+11
+33.3442112014263
+21
+-1635.02448383228
+31
+2013.14719801391
+12
+33.3438773424362
+22
+-1575.77528030582
+32
+2013.14688327402
+13
+33.3438773424362
+23
+-1575.77528030582
+33
+2013.14688327402
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+33.3442112014263
+20
+-1635.02448383228
+30
+2013.14719801391
+11
+39.2459288101664
+21
+-1575.77517034675
+31
+2027.58590033816
+12
+39.2462626691564
+22
+-1635.02437387321
+32
+2027.58621507805
+13
+39.2462626691564
+23
+-1635.02437387321
+33
+2027.58621507805
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+40.8338358974086
+20
+1087.68160174359
+30
+1975.83212904106
+11
+60.4504242229264
+21
+1076.22873878012
+31
+1995.97422483951
+12
+40.8337713637369
+22
+1076.22895631445
+32
+1975.83206820304
+13
+40.8337713637369
+23
+1076.22895631445
+33
+1975.83206820304
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+60.4504242229264
+20
+1076.22873878012
+30
+1995.97422483951
+11
+40.8338358974086
+21
+1087.68160174359
+31
+1975.83212904106
+12
+60.4504887565981
+22
+1087.68138420926
+32
+1995.97428567753
+13
+60.4504887565981
+23
+1087.68138420926
+33
+1995.97428567753
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-112.887948049741
+20
+-1491.10367640812
+30
+2061.69395415194
+11
+-94.1582126111653
+21
+-1260.03606144053
+31
+2102.87650280072
+12
+-112.889250073865
+22
+-1260.03638576054
+32
+2061.69272669082
+13
+-112.889250073865
+23
+-1260.03638576054
+33
+2061.69272669082
+70
+1
+ 0
+3DFACE
+ 8
+crank_full
+10
+-94.1582126111653
+20
+-1260.03606144053
+30
+2102.87650280072
+11
+-112.887948049741
+21
+-1491.10367640812
+31
+2061.69395415194
+12
+-94.1569105870414
+22
+-1491.10335208811
+32
+2102.87773026184
+13
+-94.1569105870414
+23
+-1491.10335208811
+33
+2102.87773026184
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1034.12663189037
+20
+-1016.89523242239
+30
+2093.59675330562
+11
+993.755281646064
+21
+-994.988599868068
+31
+1976.80755330562
+12
+1034.12663189037
+22
+-1016.89523242239
+32
+1976.80755330562
+13
+1034.12663189037
+23
+-1016.89523242239
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+993.755281646064
+20
+-994.988599868068
+30
+1976.80755330562
+11
+1034.12663189037
+21
+-1016.89523242239
+31
+2093.59675330562
+12
+993.755281646064
+22
+-994.988599868068
+32
+2093.59675330562
+13
+993.755281646064
+23
+-994.988599868068
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+1976.80755330562
+11
+1329.08826166069
+21
+-929.442444481353
+31
+2093.59675330562
+12
+1329.08826166069
+22
+-929.442444481353
+32
+1976.80755330562
+13
+1329.08826166069
+23
+-929.442444481353
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1329.08826166069
+20
+-929.442444481353
+30
+2093.59675330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1351.75896842588
+22
+-887.662995228551
+32
+2093.59675330562
+13
+1351.75896842588
+23
+-887.662995228551
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1298.70239996067
+20
+-965.996277848705
+30
+2093.59675330562
+11
+1261.76909495036
+21
+-995.919752013918
+31
+1976.80755330562
+12
+1298.70239996067
+22
+-965.996277848705
+32
+1976.80755330562
+13
+1298.70239996067
+23
+-965.996277848705
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1261.76909495036
+20
+-995.919752013918
+30
+1976.80755330562
+11
+1298.70239996067
+21
+-965.996277848705
+31
+2093.59675330562
+12
+1261.76909495036
+22
+-995.919752013918
+32
+2093.59675330562
+13
+1261.76909495036
+23
+-995.919752013918
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+993.755281646067
+20
+-887.662995228552
+30
+1976.80755330562
+11
+1034.12663189037
+21
+-1016.89523242239
+31
+1976.80755330562
+12
+993.755281646064
+22
+-994.988599868068
+32
+1976.80755330562
+13
+993.755281646064
+23
+-994.988599868068
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1034.12663189037
+20
+-1016.89523242239
+30
+1976.80755330562
+11
+993.755281646067
+21
+-887.662995228552
+31
+1976.80755330562
+12
+1351.75896842588
+22
+-887.662995228551
+32
+1976.80755330562
+13
+1351.75896842588
+23
+-887.662995228551
+33
+1976.80755330562
+70
+13
+ 0
+3DFACE
+ 8
+hand_half
+10
+1034.12663189037
+20
+-1016.89523242239
+30
+1976.80755330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1079.52613622403
+22
+-1030.97956170564
+32
+1976.80755330562
+13
+1079.52613622403
+23
+-1030.97956170564
+33
+1976.80755330562
+70
+3
+ 0
+3DFACE
+ 8
+hand_half
+10
+1079.52613622403
+20
+-1030.97956170564
+30
+1976.80755330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1126.80101814733
+22
+-1035.93626063118
+32
+1976.80755330562
+13
+1126.80101814733
+23
+-1035.93626063118
+33
+1976.80755330562
+70
+3
+ 0
+3DFACE
+ 8
+hand_half
+10
+1126.80101814733
+20
+-1035.93626063118
+30
+1976.80755330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1174.13453046003
+22
+-1031.57484603905
+32
+1976.80755330562
+13
+1174.13453046003
+23
+-1031.57484603905
+33
+1976.80755330562
+70
+3
+ 0
+3DFACE
+ 8
+hand_half
+10
+1174.13453046003
+20
+-1031.57484603905
+30
+1976.80755330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1219.70767282888
+22
+-1018.0629246461
+32
+1976.80755330562
+13
+1219.70767282888
+23
+-1018.0629246461
+33
+1976.80755330562
+70
+3
+ 0
+3DFACE
+ 8
+hand_half
+10
+1219.70767282888
+20
+-1018.0629246461
+30
+1976.80755330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1261.76909495036
+22
+-995.919752013918
+32
+1976.80755330562
+13
+1261.76909495036
+23
+-995.919752013918
+33
+1976.80755330562
+70
+3
+ 0
+3DFACE
+ 8
+hand_half
+10
+1261.76909495036
+20
+-995.919752013918
+30
+1976.80755330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1298.70239996067
+22
+-965.996277848705
+32
+1976.80755330562
+13
+1298.70239996067
+23
+-965.996277848705
+33
+1976.80755330562
+70
+3
+ 0
+3DFACE
+ 8
+hand_half
+10
+1298.70239996067
+20
+-965.996277848705
+30
+1976.80755330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+1329.08826166069
+22
+-929.442444481353
+32
+1976.80755330562
+13
+1329.08826166069
+23
+-929.442444481353
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1034.12663189037
+20
+-1016.89523242239
+30
+2093.59675330562
+11
+993.755281646067
+21
+-887.662995228552
+31
+2093.59675330562
+12
+993.755281646064
+22
+-994.988599868068
+32
+2093.59675330562
+13
+993.755281646064
+23
+-994.988599868068
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+993.755281646067
+20
+-887.662995228552
+30
+2093.59675330562
+11
+1034.12663189037
+21
+-1016.89523242239
+31
+2093.59675330562
+12
+1351.75896842588
+22
+-887.662995228551
+32
+2093.59675330562
+13
+1351.75896842588
+23
+-887.662995228551
+33
+2093.59675330562
+70
+3
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+2093.59675330562
+11
+1034.12663189037
+21
+-1016.89523242239
+31
+2093.59675330562
+12
+1079.52613622403
+22
+-1030.97956170564
+32
+2093.59675330562
+13
+1079.52613622403
+23
+-1030.97956170564
+33
+2093.59675330562
+70
+13
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+2093.59675330562
+11
+1079.52613622403
+21
+-1030.97956170564
+31
+2093.59675330562
+12
+1126.80101814733
+22
+-1035.93626063118
+32
+2093.59675330562
+13
+1126.80101814733
+23
+-1035.93626063118
+33
+2093.59675330562
+70
+13
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+2093.59675330562
+11
+1126.80101814733
+21
+-1035.93626063118
+31
+2093.59675330562
+12
+1174.13453046003
+22
+-1031.57484603905
+32
+2093.59675330562
+13
+1174.13453046003
+23
+-1031.57484603905
+33
+2093.59675330562
+70
+13
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+2093.59675330562
+11
+1174.13453046003
+21
+-1031.57484603905
+31
+2093.59675330562
+12
+1219.70767282888
+22
+-1018.0629246461
+32
+2093.59675330562
+13
+1219.70767282888
+23
+-1018.0629246461
+33
+2093.59675330562
+70
+13
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+2093.59675330562
+11
+1219.70767282888
+21
+-1018.0629246461
+31
+2093.59675330562
+12
+1261.76909495036
+22
+-995.919752013918
+32
+2093.59675330562
+13
+1261.76909495036
+23
+-995.919752013918
+33
+2093.59675330562
+70
+13
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+2093.59675330562
+11
+1261.76909495036
+21
+-995.919752013918
+31
+2093.59675330562
+12
+1298.70239996067
+22
+-965.996277848705
+32
+2093.59675330562
+13
+1298.70239996067
+23
+-965.996277848705
+33
+2093.59675330562
+70
+13
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+2093.59675330562
+11
+1298.70239996067
+21
+-965.996277848705
+31
+2093.59675330562
+12
+1329.08826166069
+22
+-929.442444481353
+32
+2093.59675330562
+13
+1329.08826166069
+23
+-929.442444481353
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+993.755281646067
+20
+-887.662995228552
+30
+2093.59675330562
+11
+1351.75896842588
+21
+-887.662995228551
+31
+1976.80755330562
+12
+993.755281646067
+22
+-887.662995228552
+32
+1976.80755330562
+13
+993.755281646067
+23
+-887.662995228552
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1351.75896842588
+20
+-887.662995228551
+30
+1976.80755330562
+11
+993.755281646067
+21
+-887.662995228552
+31
+2093.59675330562
+12
+1351.75896842588
+22
+-887.662995228551
+32
+2093.59675330562
+13
+1351.75896842588
+23
+-887.662995228551
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1329.08826166069
+20
+-929.442444481353
+30
+1976.80755330562
+11
+1298.70239996067
+21
+-965.996277848705
+31
+2093.59675330562
+12
+1298.70239996067
+22
+-965.996277848705
+32
+1976.80755330562
+13
+1298.70239996067
+23
+-965.996277848705
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1298.70239996067
+20
+-965.996277848705
+30
+2093.59675330562
+11
+1329.08826166069
+21
+-929.442444481353
+31
+1976.80755330562
+12
+1329.08826166069
+22
+-929.442444481353
+32
+2093.59675330562
+13
+1329.08826166069
+23
+-929.442444481353
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1126.80101814733
+20
+-1035.93626063118
+30
+2093.59675330562
+11
+1079.52613622403
+21
+-1030.97956170564
+31
+1976.80755330562
+12
+1126.80101814733
+22
+-1035.93626063118
+32
+1976.80755330562
+13
+1126.80101814733
+23
+-1035.93626063118
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1079.52613622403
+20
+-1030.97956170564
+30
+1976.80755330562
+11
+1126.80101814733
+21
+-1035.93626063118
+31
+2093.59675330562
+12
+1079.52613622403
+22
+-1030.97956170564
+32
+2093.59675330562
+13
+1079.52613622403
+23
+-1030.97956170564
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1174.13453046003
+20
+-1031.57484603905
+30
+2093.59675330562
+11
+1126.80101814733
+21
+-1035.93626063118
+31
+1976.80755330562
+12
+1174.13453046003
+22
+-1031.57484603905
+32
+1976.80755330562
+13
+1174.13453046003
+23
+-1031.57484603905
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1126.80101814733
+20
+-1035.93626063118
+30
+1976.80755330562
+11
+1174.13453046003
+21
+-1031.57484603905
+31
+2093.59675330562
+12
+1126.80101814733
+22
+-1035.93626063118
+32
+2093.59675330562
+13
+1126.80101814733
+23
+-1035.93626063118
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1079.52613622403
+20
+-1030.97956170564
+30
+2093.59675330562
+11
+1034.12663189037
+21
+-1016.89523242239
+31
+1976.80755330562
+12
+1079.52613622403
+22
+-1030.97956170564
+32
+1976.80755330562
+13
+1079.52613622403
+23
+-1030.97956170564
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1034.12663189037
+20
+-1016.89523242239
+30
+1976.80755330562
+11
+1079.52613622403
+21
+-1030.97956170564
+31
+2093.59675330562
+12
+1034.12663189037
+22
+-1016.89523242239
+32
+2093.59675330562
+13
+1034.12663189037
+23
+-1016.89523242239
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1219.70767282888
+20
+-1018.0629246461
+30
+2093.59675330562
+11
+1174.13453046003
+21
+-1031.57484603905
+31
+1976.80755330562
+12
+1219.70767282888
+22
+-1018.0629246461
+32
+1976.80755330562
+13
+1219.70767282888
+23
+-1018.0629246461
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1174.13453046003
+20
+-1031.57484603905
+30
+1976.80755330562
+11
+1219.70767282888
+21
+-1018.0629246461
+31
+2093.59675330562
+12
+1174.13453046003
+22
+-1031.57484603905
+32
+2093.59675330562
+13
+1174.13453046003
+23
+-1031.57484603905
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1261.76909495036
+20
+-995.919752013918
+30
+2093.59675330562
+11
+1219.70767282888
+21
+-1018.0629246461
+31
+1976.80755330562
+12
+1261.76909495036
+22
+-995.919752013918
+32
+1976.80755330562
+13
+1261.76909495036
+23
+-995.919752013918
+33
+1976.80755330562
+70
+1
+ 0
+3DFACE
+ 8
+hand_half
+10
+1219.70767282888
+20
+-1018.0629246461
+30
+1976.80755330562
+11
+1261.76909495036
+21
+-995.919752013918
+31
+2093.59675330562
+12
+1219.70767282888
+22
+-1018.0629246461
+32
+2093.59675330562
+13
+1219.70767282888
+23
+-1018.0629246461
+33
+2093.59675330562
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957534796371
+20
+-140.147039999996
+30
+1438.61018379565
+11
+145.758594958837
+21
+-327.009759999997
+31
+1465.17488447662
+12
+123.957534796373
+22
+-327.009759999997
+32
+1438.61018379565
+13
+123.957534796373
+23
+-327.009759999997
+33
+1438.61018379565
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758594958837
+20
+-327.009759999997
+30
+1465.17488447662
+11
+123.957534796371
+21
+-140.147039999996
+31
+1438.61018379565
+12
+145.758594958835
+22
+-140.147039999996
+32
+1465.17488447662
+13
+145.758594958835
+23
+-140.147039999996
+33
+1465.17488447662
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758282406557
+20
+-327.009759999999
+30
+1465.17471220716
+11
+-123.957190847735
+21
+-140.147039999998
+31
+1438.61003729252
+12
+-123.957190847734
+22
+-327.009759999999
+32
+1438.61003729252
+13
+-123.957190847734
+23
+-327.009759999999
+33
+1438.61003729252
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957190847735
+20
+-140.147039999998
+30
+1438.61003729252
+11
+-145.758282406557
+21
+-327.009759999999
+31
+1465.17471220716
+12
+-145.758282406558
+22
+-140.147039999998
+32
+1465.17471220716
+13
+-145.758282406558
+23
+-140.147039999998
+33
+1465.17471220716
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.1997565800718
+20
+-140.14704
+30
+1734.50129493144
+11
+67.0852443586779
+21
+-327.009760000001
+31
+1724.52561249664
+12
+67.0852443586765
+22
+-140.14704
+32
+1724.52561249664
+13
+67.0852443586765
+23
+-140.14704
+33
+1724.52561249664
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.0852443586779
+20
+-327.009760000001
+30
+1724.52561249664
+11
+34.1997565800718
+21
+-140.14704
+31
+1734.50129493144
+12
+34.1997565800732
+22
+-327.009760000001
+32
+1734.50129493144
+13
+34.1997565800732
+23
+-327.009760000001
+33
+1734.50129493144
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.1995591345617
+20
+-327.009759999998
+30
+1390.63365180083
+11
+-67.0850469131678
+21
+-140.147039999997
+31
+1400.60933423564
+12
+-34.1995591345631
+22
+-140.147039999997
+32
+1390.63365180084
+13
+-34.1995591345631
+23
+-140.147039999997
+33
+1390.63365180084
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.0850469131678
+20
+-140.147039999997
+30
+1400.60933423564
+11
+-34.1995591345617
+21
+-327.009759999998
+31
+1390.63365180083
+12
+-67.0850469131664
+22
+-327.009759999998
+32
+1400.60933423564
+13
+-67.0850469131664
+23
+-327.009759999998
+33
+1400.60933423564
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758594958835
+20
+-140.147039999996
+30
+1465.17488447662
+11
+161.958237853255
+21
+-327.009759999997
+31
+1495.48232773022
+12
+145.758594958837
+22
+-327.009759999997
+32
+1465.17488447662
+13
+145.758594958837
+23
+-327.009759999997
+33
+1465.17488447662
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958237853255
+20
+-327.009759999997
+30
+1495.48232773022
+11
+145.758594958835
+21
+-140.147039999996
+31
+1465.17488447662
+12
+161.958237853253
+22
+-140.147039999996
+32
+1495.48232773022
+13
+161.958237853253
+23
+-140.147039999996
+33
+1495.48232773022
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-4.87060060567757e-06
+20
+-140.14704
+30
+1737.86965702509
+11
+34.1997565800732
+21
+-327.009760000001
+31
+1734.50129493144
+12
+34.1997565800718
+22
+-140.14704
+32
+1734.50129493144
+13
+34.1997565800718
+23
+-140.14704
+33
+1734.50129493144
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.1997565800732
+20
+-327.009760000001
+30
+1734.50129493144
+11
+-4.87060060567757e-06
+21
+-140.14704
+31
+1737.86965702509
+12
+-4.87059913788501e-06
+22
+-327.009760000001
+32
+1737.86965702509
+13
+-4.87059913788501e-06
+23
+-327.009760000001
+33
+1737.86965702509
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+171.933879867935
+20
+-140.147039999998
+30
+1596.76733442913
+11
+161.958158566334
+21
+-327.009759999999
+31
+1629.65281041762
+12
+171.933879867937
+22
+-327.009759999998
+32
+1596.76733442913
+13
+171.933879867937
+23
+-327.009759999998
+33
+1596.76733442913
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958158566334
+20
+-327.009759999999
+30
+1629.65281041762
+11
+171.933879867935
+21
+-140.147039999998
+31
+1596.76733442913
+12
+161.958158566332
+22
+-140.147039999998
+32
+1629.65281041762
+13
+161.958158566332
+23
+-140.147039999998
+33
+1629.65281041762
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.0850469131664
+20
+-327.009759999998
+30
+1400.60933423564
+11
+-97.3924901667671
+21
+-140.147039999998
+31
+1416.80897713006
+12
+-67.0850469131678
+22
+-140.147039999997
+32
+1400.60933423564
+13
+-67.0850469131678
+23
+-140.147039999997
+33
+1400.60933423564
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3924901667671
+20
+-140.147039999998
+30
+1416.80897713006
+11
+-67.0850469131664
+21
+-327.009759999998
+31
+1400.60933423564
+12
+-97.3924901667657
+22
+-327.009759999998
+32
+1416.80897713006
+13
+-97.3924901667657
+23
+-327.009759999998
+33
+1416.80897713006
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+175.302282381704
+20
+-140.147039999997
+30
+1562.56757695949
+11
+171.933879867937
+21
+-327.009759999998
+31
+1596.76733442913
+12
+175.302282381706
+22
+-327.009759999998
+32
+1562.56757695949
+13
+175.302282381706
+23
+-327.009759999998
+33
+1562.56757695949
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+171.933879867937
+20
+-327.009759999998
+30
+1596.76733442913
+11
+175.302282381704
+21
+-140.147039999997
+31
+1562.56757695949
+12
+171.933879867935
+22
+-140.147039999998
+32
+1596.76733442913
+13
+171.933879867935
+23
+-140.147039999998
+33
+1596.76733442913
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957337350861
+20
+-327.009760000002
+30
+1686.52476293663
+11
+-145.758397513327
+21
+-140.147040000001
+31
+1659.96006225566
+12
+-145.758397513325
+22
+-327.009760000002
+32
+1659.96006225566
+13
+-145.758397513325
+23
+-327.009760000002
+33
+1659.96006225566
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758397513327
+20
+-140.147040000001
+30
+1659.96006225566
+11
+-123.957337350861
+21
+-327.009760000002
+31
+1686.52476293663
+12
+-123.957337350863
+22
+-140.147040000001
+32
+1686.52476293663
+13
+-123.957337350863
+23
+-140.147040000001
+33
+1686.52476293663
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958158566332
+20
+-140.147039999998
+30
+1629.65281041762
+11
+145.758479852068
+21
+-327.009759999999
+31
+1659.96023452511
+12
+161.958158566334
+22
+-327.009759999999
+32
+1629.65281041762
+13
+161.958158566334
+23
+-327.009759999999
+33
+1629.65281041762
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758479852068
+20
+-327.009759999999
+30
+1659.96023452511
+11
+161.958158566332
+21
+-140.147039999998
+31
+1629.65281041762
+12
+145.758479852067
+22
+-140.147039999998
+32
+1659.96023452511
+13
+145.758479852067
+23
+-140.147039999998
+33
+1659.96023452511
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3924901667657
+20
+-327.009759999998
+30
+1416.80897713006
+11
+-123.957190847735
+21
+-140.147039999998
+31
+1438.61003729252
+12
+-97.3924901667671
+22
+-140.147039999998
+32
+1416.80897713006
+13
+-97.3924901667671
+23
+-140.147039999998
+33
+1416.80897713006
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957190847735
+20
+-140.147039999998
+30
+1438.61003729252
+11
+-97.3924901667657
+21
+-327.009759999998
+31
+1416.80897713006
+12
+-123.957190847734
+22
+-327.009759999999
+32
+1438.61003729252
+13
+-123.957190847734
+23
+-327.009759999999
+33
+1438.61003729252
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.958040407743
+20
+-327.009760000001
+30
+1629.65261900206
+11
+-171.933722842549
+21
+-140.14704
+31
+1596.76713122346
+12
+-171.933722842547
+22
+-327.009760000001
+32
+1596.76713122345
+13
+-171.933722842547
+23
+-327.009760000001
+33
+1596.76713122345
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933722842549
+20
+-140.14704
+30
+1596.76713122346
+11
+-161.958040407743
+21
+-327.009760000001
+31
+1629.65261900206
+12
+-161.958040407745
+22
+-140.14704
+32
+1629.65261900206
+13
+-161.958040407745
+23
+-140.14704
+33
+1629.65261900206
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.0852443586765
+20
+-140.14704
+30
+1724.52561249664
+11
+97.3926876122771
+21
+-327.00976
+31
+1708.32596960222
+12
+97.3926876122757
+22
+-140.147039999999
+32
+1708.32596960222
+13
+97.3926876122757
+23
+-140.147039999999
+33
+1708.32596960222
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3926876122771
+20
+-327.00976
+30
+1708.32596960222
+11
+67.0852443586765
+21
+-140.14704
+31
+1724.52561249664
+12
+67.0852443586779
+22
+-327.009760000001
+32
+1724.52561249664
+13
+67.0852443586779
+23
+-327.009760000001
+33
+1724.52561249664
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.0852383287284
+20
+-140.147040000001
+30
+1724.52553320972
+11
+-34.199762340237
+21
+-327.009760000002
+31
+1734.50125451132
+12
+-34.1997623402384
+22
+-140.147040000001
+32
+1734.50125451132
+13
+-34.1997623402384
+23
+-140.147040000001
+33
+1734.50125451132
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.199762340237
+20
+-327.009760000002
+30
+1734.50125451132
+11
+-67.0852383287284
+21
+-140.147040000001
+31
+1724.52553320972
+12
+-67.085238328727
+22
+-327.009760000002
+32
+1724.52553320972
+13
+-67.085238328727
+23
+-327.009760000002
+33
+1724.52553320972
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.1999597857484
+20
+-327.009759999997
+30
+1390.63369222096
+11
+0.00020231610917012
+21
+-140.147039999996
+31
+1387.26528970719
+12
+34.199959785747
+22
+-140.147039999996
+32
+1390.63369222096
+13
+34.199959785747
+23
+-140.147039999996
+33
+1390.63369222096
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.00020231610917012
+20
+-140.147039999996
+30
+1387.26528970719
+11
+34.1999597857484
+21
+-327.009759999997
+31
+1390.63369222096
+12
+0.000202316110637912
+22
+-327.009759999997
+32
+1387.26528970719
+13
+0.000202316110637912
+23
+-327.009759999997
+33
+1387.26528970719
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000202316110637912
+20
+-327.009759999997
+30
+1387.26528970719
+11
+-34.1995591345631
+21
+-140.147039999997
+31
+1390.63365180084
+12
+0.00020231610917012
+22
+-140.147039999996
+32
+1387.26528970719
+13
+0.00020231610917012
+23
+-140.147039999996
+33
+1387.26528970719
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.1995591345631
+20
+-140.147039999997
+30
+1390.63365180084
+11
+0.000202316110637912
+21
+-327.009759999997
+31
+1387.26528970719
+12
+-34.1995591345617
+22
+-327.009759999998
+32
+1390.63365180083
+13
+-34.1995591345617
+23
+-327.009759999998
+33
+1390.63365180083
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+21.0097297891043
+20
+-2.03037586743449e-12
+30
+1702.4261702469
+11
+27.4505428589692
+21
+-140.14704
+31
+1692.78683069265
+12
+27.4505428589688
+22
+-2.03037586743449e-12
+32
+1692.78683069265
+13
+27.4505428589688
+23
+-2.03037586743449e-12
+33
+1692.78683069265
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+27.4505428589692
+20
+-140.14704
+30
+1692.78683069265
+11
+21.0097297891043
+21
+-2.03037586743449e-12
+31
+1702.4261702469
+12
+21.0097297891047
+22
+-140.14704
+32
+1702.4261702469
+13
+21.0097297891047
+23
+-140.14704
+33
+1702.4261702469
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.0854357742384
+20
+-327.009759999997
+30
+1400.60941352256
+11
+34.199959785747
+21
+-140.147039999996
+31
+1390.63369222096
+12
+67.085435774237
+22
+-140.147039999996
+32
+1400.60941352256
+13
+67.085435774237
+23
+-140.147039999996
+33
+1400.60941352256
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.199959785747
+20
+-140.147039999996
+30
+1390.63369222096
+11
+67.0854357742384
+21
+-327.009759999997
+31
+1400.60941352256
+12
+34.1999597857484
+22
+-327.009759999997
+32
+1390.63369222096
+13
+34.1999597857484
+23
+-327.009759999997
+33
+1390.63369222096
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3926876122757
+20
+-140.147039999999
+30
+1708.32596960222
+11
+123.957388293245
+21
+-327.00976
+31
+1686.52490943975
+12
+123.957388293244
+22
+-140.147039999999
+32
+1686.52490943976
+13
+123.957388293244
+23
+-140.147039999999
+33
+1686.52490943976
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957388293245
+20
+-327.00976
+30
+1686.52490943975
+11
+97.3926876122757
+21
+-140.147039999999
+31
+1708.32596960222
+12
+97.3926876122771
+22
+-327.00976
+32
+1708.32596960222
+13
+97.3926876122771
+23
+-327.00976
+33
+1708.32596960222
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958237853253
+20
+-140.147039999996
+30
+1495.48232773022
+11
+171.933920288059
+21
+-327.009759999998
+31
+1528.36781550882
+12
+161.958237853255
+22
+-327.009759999997
+32
+1495.48232773022
+13
+161.958237853255
+23
+-327.009759999997
+33
+1495.48232773022
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+171.933920288059
+20
+-327.009759999998
+30
+1528.36781550882
+11
+161.958237853253
+21
+-140.147039999996
+31
+1495.48232773022
+12
+171.933920288057
+22
+-140.147039999997
+32
+1528.36781550882
+13
+171.933920288057
+23
+-140.147039999997
+33
+1528.36781550882
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+171.933920288057
+20
+-140.147039999997
+30
+1528.36781550882
+11
+175.302282381706
+21
+-327.009759999998
+31
+1562.56757695949
+12
+171.933920288059
+22
+-327.009759999998
+32
+1528.36781550882
+13
+171.933920288059
+23
+-327.009759999998
+33
+1528.36781550882
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+175.302282381706
+20
+-327.009759999998
+30
+1562.56757695949
+11
+171.933920288057
+21
+-140.147039999997
+31
+1528.36781550882
+12
+175.302282381704
+22
+-140.147039999997
+32
+1562.56757695949
+13
+175.302282381704
+23
+-140.147039999997
+33
+1562.56757695949
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817304
+20
+-327.009759999997
+30
+1416.80909223683
+11
+67.085435774237
+21
+-140.147039999996
+31
+1400.60941352256
+12
+97.3928598817289
+22
+-140.147039999996
+32
+1416.80909223683
+13
+97.3928598817289
+23
+-140.147039999996
+33
+1416.80909223683
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.085435774237
+20
+-140.147039999996
+30
+1400.60941352256
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+67.0854357742384
+22
+-327.009759999997
+32
+1400.60941352256
+13
+67.0854357742384
+23
+-327.009759999997
+33
+1400.60941352256
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758397513325
+20
+-327.009760000002
+30
+1659.96006225566
+11
+-161.958040407745
+21
+-140.14704
+31
+1629.65261900206
+12
+-161.958040407743
+22
+-327.009760000001
+32
+1629.65261900206
+13
+-161.958040407743
+23
+-327.009760000001
+33
+1629.65261900206
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.958040407745
+20
+-140.14704
+30
+1629.65261900206
+11
+-145.758397513325
+21
+-327.009760000002
+31
+1659.96006225566
+12
+-145.758397513327
+22
+-140.147040000001
+32
+1659.96006225566
+13
+-145.758397513327
+23
+-140.147040000001
+33
+1659.96006225566
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957534796371
+20
+-140.147039999996
+30
+1438.61018379565
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+97.3928598817289
+22
+-140.147039999996
+32
+1416.80909223683
+13
+97.3928598817289
+23
+-140.147039999996
+33
+1416.80909223683
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817304
+20
+-327.009759999997
+30
+1416.80909223683
+11
+123.957534796371
+21
+-140.147039999996
+31
+1438.61018379565
+12
+123.957534796373
+22
+-327.009759999997
+32
+1438.61018379565
+13
+123.957534796373
+23
+-327.009759999997
+33
+1438.61018379565
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933722842547
+20
+-327.009760000001
+30
+1596.76713122345
+11
+-175.302084936196
+21
+-140.14704
+31
+1562.56736977278
+12
+-175.302084936194
+22
+-327.009760000001
+32
+1562.56736977278
+13
+-175.302084936194
+23
+-327.009760000001
+33
+1562.56736977278
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-175.302084936196
+20
+-140.14704
+30
+1562.56736977278
+11
+-171.933722842547
+21
+-327.009760000001
+31
+1596.76713122345
+12
+-171.933722842549
+22
+-140.14704
+32
+1596.76713122346
+13
+-171.933722842549
+23
+-140.14704
+33
+1596.76713122346
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-175.302084936194
+20
+-327.009760000001
+30
+1562.56736977278
+11
+-171.933682422427
+21
+-140.147039999999
+31
+1528.36761230315
+12
+-171.933682422425
+22
+-327.00976
+32
+1528.36761230315
+13
+-171.933682422425
+23
+-327.00976
+33
+1528.36761230315
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933682422427
+20
+-140.147039999999
+30
+1528.36761230315
+11
+-175.302084936194
+21
+-327.009760000001
+31
+1562.56736977278
+12
+-175.302084936196
+22
+-140.14704
+32
+1562.56736977278
+13
+-175.302084936196
+23
+-140.14704
+33
+1562.56736977278
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933682422425
+20
+-327.00976
+30
+1528.36761230315
+11
+-161.957961120824
+21
+-140.147039999999
+31
+1495.48213631466
+12
+-161.957961120822
+22
+-327.00976
+32
+1495.48213631465
+13
+-161.957961120822
+23
+-327.00976
+33
+1495.48213631465
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.957961120824
+20
+-140.147039999999
+30
+1495.48213631466
+11
+-171.933682422425
+21
+-327.00976
+31
+1528.36761230315
+12
+-171.933682422427
+22
+-140.147039999999
+32
+1528.36761230315
+13
+-171.933682422427
+23
+-140.147039999999
+33
+1528.36761230315
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.957961120822
+20
+-327.00976
+30
+1495.48213631465
+11
+-145.758282406558
+21
+-140.147039999998
+31
+1465.17471220716
+12
+-145.758282406557
+22
+-327.009759999999
+32
+1465.17471220716
+13
+-145.758282406557
+23
+-327.009759999999
+33
+1465.17471220716
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758282406558
+20
+-140.147039999998
+30
+1465.17471220716
+11
+-161.957961120822
+21
+-327.00976
+31
+1495.48213631465
+12
+-161.957961120824
+22
+-140.147039999999
+32
+1495.48213631466
+13
+-161.957961120824
+23
+-140.147039999999
+33
+1495.48213631466
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758479852067
+20
+-140.147039999998
+30
+1659.96023452511
+11
+123.957388293245
+21
+-327.00976
+31
+1686.52490943975
+12
+145.758479852068
+22
+-327.009759999999
+32
+1659.96023452511
+13
+145.758479852068
+23
+-327.009759999999
+33
+1659.96023452511
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957388293245
+20
+-327.00976
+30
+1686.52490943975
+11
+145.758479852067
+21
+-140.147039999998
+31
+1659.96023452511
+12
+123.957388293244
+22
+-140.147039999999
+32
+1686.52490943976
+13
+123.957388293244
+23
+-140.147039999999
+33
+1686.52490943976
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3926624362203
+20
+-140.147040000001
+30
+1708.32585449545
+11
+-67.085238328727
+21
+-327.009760000002
+31
+1724.52553320972
+12
+-67.0852383287284
+22
+-140.147040000001
+32
+1724.52553320972
+13
+-67.0852383287284
+23
+-140.147040000001
+33
+1724.52553320972
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.085238328727
+20
+-327.009760000002
+30
+1724.52553320972
+11
+-97.3926624362203
+21
+-140.147040000001
+31
+1708.32585449545
+12
+-97.3926624362189
+22
+-327.009760000002
+32
+1708.32585449545
+13
+-97.3926624362189
+23
+-327.009760000002
+33
+1708.32585449545
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957337350861
+20
+-327.009760000002
+30
+1686.52476293663
+11
+-97.3926624362203
+21
+-140.147040000001
+31
+1708.32585449545
+12
+-123.957337350863
+22
+-140.147040000001
+32
+1686.52476293663
+13
+-123.957337350863
+23
+-140.147040000001
+33
+1686.52476293663
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3926624362203
+20
+-140.147040000001
+30
+1708.32585449545
+11
+-123.957337350861
+21
+-327.009760000002
+31
+1686.52476293663
+12
+-97.3926624362189
+22
+-327.009760000002
+32
+1708.32585449545
+13
+-97.3926624362189
+23
+-327.009760000002
+33
+1708.32585449545
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+21.0097668453905
+20
+-140.14704
+30
+1660.40671384141
+11
+11.3704272911448
+21
+-2.03037586743449e-12
+31
+1653.96590077154
+12
+21.0097668453901
+22
+-1.98525640371372e-12
+32
+1660.40671384141
+13
+21.0097668453901
+23
+-1.98525640371372e-12
+33
+1660.40671384141
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+11.3704272911448
+20
+-2.03037586743449e-12
+30
+1653.96590077154
+11
+21.0097668453905
+21
+-140.14704
+31
+1660.40671384141
+12
+11.3704272911452
+22
+-140.14704
+32
+1653.96590077155
+13
+11.3704272911452
+23
+-140.14704
+33
+1653.96590077155
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-11.370338645769
+20
+-140.14704
+30
+1653.96588071683
+11
+-21.0096895600995
+21
+-2.12061479487602e-12
+31
+1660.40667678512
+12
+-11.3703386457694
+22
+-2.07549533115525e-12
+32
+1653.96588071683
+13
+-11.3703386457694
+23
+-2.07549533115525e-12
+33
+1653.96588071683
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-21.0096895600995
+20
+-2.12061479487602e-12
+30
+1660.40667678512
+11
+-11.370338645769
+21
+-140.14704
+31
+1653.96588071683
+12
+-21.0096895600991
+22
+-140.14704
+32
+1660.40667678512
+13
+-21.0096895600991
+23
+-140.14704
+33
+1660.40667678512
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-6.0882486421221e-06
+20
+-2.12061479487602e-12
+30
+1711.12866608211
+11
+11.3703788747745
+21
+-140.14704
+31
+1708.8669663152
+12
+11.3703788747741
+22
+-2.07549533115525e-12
+32
+1708.8669663152
+13
+11.3703788747741
+23
+-2.07549533115525e-12
+33
+1708.8669663152
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+11.3703788747745
+20
+-140.14704
+30
+1708.8669663152
+11
+-6.0882486421221e-06
+21
+-2.12061479487602e-12
+31
+1711.12866608211
+12
+-6.08824821207721e-06
+22
+-140.14704
+32
+1711.12866608211
+13
+-6.08824821207721e-06
+23
+-140.14704
+33
+1711.12866608211
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-27.4505026299636
+20
+-140.14704
+30
+1670.04601633937
+11
+-21.0096895600995
+21
+-2.12061479487602e-12
+31
+1660.40667678512
+12
+-21.0096895600991
+22
+-140.14704
+32
+1660.40667678512
+13
+-21.0096895600991
+23
+-140.14704
+33
+1660.40667678512
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-21.0096895600995
+20
+-2.12061479487602e-12
+30
+1660.40667678512
+11
+-27.4505026299636
+21
+-140.14704
+31
+1670.04601633937
+12
+-27.4505026299641
+22
+-2.12061479487602e-12
+32
+1670.04601633937
+13
+-27.4505026299641
+23
+-2.12061479487602e-12
+33
+1670.04601633937
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+11.3703788747741
+20
+-2.07549533115525e-12
+30
+1708.8669663152
+11
+21.0097297891047
+21
+-140.14704
+31
+1702.4261702469
+12
+21.0097297891043
+22
+-2.03037586743449e-12
+32
+1702.4261702469
+13
+21.0097297891043
+23
+-2.03037586743449e-12
+33
+1702.4261702469
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+21.0097297891047
+20
+-140.14704
+30
+1702.4261702469
+11
+11.3703788747741
+21
+-2.07549533115525e-12
+31
+1708.8669663152
+12
+11.3703788747745
+22
+-140.14704
+32
+1708.8669663152
+13
+11.3703788747745
+23
+-140.14704
+33
+1708.8669663152
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+27.4505428589688
+20
+-2.03037586743449e-12
+30
+1692.78683069265
+11
+29.712262680597
+21
+-140.14704
+31
+1681.41644971876
+12
+29.7122626805966
+22
+-1.98525640371372e-12
+32
+1681.41644971876
+13
+29.7122626805966
+23
+-1.98525640371372e-12
+33
+1681.41644971876
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+29.712262680597
+20
+-140.14704
+30
+1681.41644971876
+11
+27.4505428589688
+21
+-2.03037586743449e-12
+31
+1692.78683069265
+12
+27.4505428589692
+22
+-140.14704
+32
+1692.78683069265
+13
+27.4505428589692
+23
+-140.14704
+33
+1692.78683069265
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+29.7122626805966
+20
+-1.98525640371372e-12
+30
+1681.41644971876
+11
+27.4505629136866
+21
+-140.14704
+31
+1670.04606475574
+12
+27.4505629136862
+22
+-1.98525640371372e-12
+32
+1670.04606475574
+13
+27.4505629136862
+23
+-1.98525640371372e-12
+33
+1670.04606475574
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+27.4505629136866
+20
+-140.14704
+30
+1670.04606475574
+11
+29.7122626805966
+21
+-1.98525640371372e-12
+31
+1681.41644971876
+12
+29.712262680597
+22
+-140.14704
+32
+1681.41644971876
+13
+29.712262680597
+23
+-140.14704
+33
+1681.41644971876
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-21.0097266163854
+20
+-2.16573425859679e-12
+30
+1702.42613319061
+11
+-11.3703870621396
+21
+-140.14704
+31
+1708.86694626048
+12
+-11.37038706214
+22
+-2.12061479487602e-12
+32
+1708.86694626048
+13
+-11.37038706214
+23
+-2.12061479487602e-12
+33
+1708.86694626048
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-11.3703870621396
+20
+-140.14704
+30
+1708.86694626048
+11
+-21.0097266163854
+21
+-2.16573425859679e-12
+31
+1702.42613319061
+12
+-21.009726616385
+22
+-140.14704
+32
+1702.42613319061
+13
+-21.009726616385
+23
+-140.14704
+33
+1702.42613319061
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933722842549
+20
+-140.14704
+30
+1596.76713122346
+11
+-171.933682422427
+21
+-140.147039999999
+31
+1528.36761230315
+12
+-175.302084936196
+22
+-140.14704
+32
+1562.56736977278
+13
+-175.302084936196
+23
+-140.14704
+33
+1562.56736977278
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933682422427
+20
+-140.147039999999
+30
+1528.36761230315
+11
+-171.933722842549
+21
+-140.14704
+31
+1596.76713122346
+12
+-161.958040407745
+22
+-140.14704
+32
+1629.65261900206
+13
+-161.958040407745
+23
+-140.14704
+33
+1629.65261900206
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933682422427
+20
+-140.147039999999
+30
+1528.36761230315
+11
+-161.958040407745
+21
+-140.14704
+31
+1629.65261900206
+12
+-161.957961120824
+22
+-140.147039999999
+32
+1495.48213631466
+13
+-161.957961120824
+23
+-140.147039999999
+33
+1495.48213631466
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.957961120824
+20
+-140.147039999999
+30
+1495.48213631466
+11
+-161.958040407745
+21
+-140.14704
+31
+1629.65261900206
+12
+-145.758397513327
+22
+-140.147040000001
+32
+1659.96006225566
+13
+-145.758397513327
+23
+-140.147040000001
+33
+1659.96006225566
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.957961120824
+20
+-140.147039999999
+30
+1495.48213631466
+11
+-145.758397513327
+21
+-140.147040000001
+31
+1659.96006225566
+12
+-145.758282406558
+22
+-140.147039999998
+32
+1465.17471220716
+13
+-145.758282406558
+23
+-140.147039999998
+33
+1465.17471220716
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758282406558
+20
+-140.147039999998
+30
+1465.17471220716
+11
+-145.758397513327
+21
+-140.147040000001
+31
+1659.96006225566
+12
+-123.957337350863
+22
+-140.147040000001
+32
+1686.52476293663
+13
+-123.957337350863
+23
+-140.147040000001
+33
+1686.52476293663
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758282406558
+20
+-140.147039999998
+30
+1465.17471220716
+11
+-123.957337350863
+21
+-140.147040000001
+31
+1686.52476293663
+12
+-123.957190847735
+22
+-140.147039999998
+32
+1438.61003729252
+13
+-123.957190847735
+23
+-140.147039999998
+33
+1438.61003729252
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957190847735
+20
+-140.147039999998
+30
+1438.61003729252
+11
+-123.957337350863
+21
+-140.147040000001
+31
+1686.52476293663
+12
+-97.3926624362203
+22
+-140.147040000001
+32
+1708.32585449545
+13
+-97.3926624362203
+23
+-140.147040000001
+33
+1708.32585449545
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957190847735
+20
+-140.147039999998
+30
+1438.61003729252
+11
+-97.3926624362203
+21
+-140.147040000001
+31
+1708.32585449545
+12
+-97.3924901667671
+22
+-140.147039999998
+32
+1416.80897713006
+13
+-97.3924901667671
+23
+-140.147039999998
+33
+1416.80897713006
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3924901667671
+20
+-140.147039999998
+30
+1416.80897713006
+11
+-97.3926624362203
+21
+-140.147040000001
+31
+1708.32585449545
+12
+-85.0224388771927
+22
+-140.147039999999
+32
+1562.56737879036
+13
+-85.0224388771927
+23
+-140.147039999999
+33
+1562.56737879036
+70
+15
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-85.0224388771927
+20
+-140.147039999999
+30
+1562.56737879036
+11
+-97.3926624362203
+21
+-140.147040000001
+31
+1708.32585449545
+12
+-83.3887731086227
+22
+-140.147039999999
+32
+1579.15445484661
+13
+-83.3887731086227
+23
+-140.147039999999
+33
+1579.15445484661
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086227
+20
+-140.147039999999
+30
+1579.15445484661
+11
+-97.3926624362203
+21
+-140.147040000001
+31
+1708.32585449545
+12
+-67.0852383287284
+22
+-140.147040000001
+32
+1724.52553320972
+13
+-67.0852383287284
+23
+-140.147040000001
+33
+1724.52553320972
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086227
+20
+-140.147039999999
+30
+1579.15445484661
+11
+-67.0852383287284
+21
+-140.147040000001
+31
+1724.52553320972
+12
+-78.5505197605909
+22
+-140.147039999999
+32
+1595.10410250665
+13
+-78.5505197605909
+23
+-140.147039999999
+33
+1595.10410250665
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5505197605909
+20
+-140.147039999999
+30
+1595.10410250665
+11
+-67.0852383287284
+21
+-140.147040000001
+31
+1724.52553320972
+12
+-70.6936101959386
+22
+-140.14704
+32
+1609.80338575557
+13
+-70.6936101959386
+23
+-140.14704
+33
+1609.80338575557
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6936101959386
+20
+-140.14704
+30
+1609.80338575557
+11
+-67.0852383287284
+21
+-140.147040000001
+31
+1724.52553320972
+12
+-60.1199810430296
+22
+-140.14704
+32
+1622.68741938158
+13
+-60.1199810430296
+23
+-140.14704
+33
+1622.68741938158
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430296
+20
+-140.14704
+30
+1622.68741938158
+11
+-67.0852383287284
+21
+-140.147040000001
+31
+1724.52553320972
+12
+-34.1997623402384
+22
+-140.147040000001
+32
+1734.50125451132
+13
+-34.1997623402384
+23
+-140.147040000001
+33
+1734.50125451132
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430296
+20
+-140.14704
+30
+1622.68741938158
+11
+-34.1997623402384
+21
+-140.147040000001
+31
+1734.50125451132
+12
+-47.2359709404507
+22
+-140.14704
+32
+1633.26107719786
+13
+-47.2359709404507
+23
+-140.14704
+33
+1633.26107719786
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2359709404507
+20
+-140.14704
+30
+1633.26107719786
+11
+-34.1997623402384
+21
+-140.147040000001
+31
+1734.50125451132
+12
+-32.5367051710078
+22
+-140.14704
+32
+1641.11801946432
+13
+-32.5367051710078
+23
+-140.14704
+33
+1641.11801946432
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710078
+20
+-140.14704
+30
+1641.11801946432
+11
+-34.1997623402384
+21
+-140.147040000001
+31
+1734.50125451132
+12
+-29.7122224515915
+22
+-140.14704
+32
+1681.41639731326
+13
+-29.7122224515915
+23
+-140.14704
+33
+1681.41639731326
+70
+15
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-29.7122224515915
+20
+-140.14704
+30
+1681.41639731326
+11
+-34.1997623402384
+21
+-140.147040000001
+31
+1734.50125451132
+12
+-27.450522684681
+22
+-140.14704
+32
+1692.78678227628
+13
+-27.450522684681
+23
+-140.14704
+33
+1692.78678227628
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-27.450522684681
+20
+-140.14704
+30
+1692.78678227628
+11
+-34.1997623402384
+21
+-140.147040000001
+31
+1734.50125451132
+12
+-4.87060060567757e-06
+22
+-140.14704
+32
+1737.86965702509
+13
+-4.87060060567757e-06
+23
+-140.14704
+33
+1737.86965702509
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-27.450522684681
+20
+-140.14704
+30
+1692.78678227628
+11
+-4.87060060567757e-06
+21
+-140.14704
+31
+1737.86965702509
+12
+-21.009726616385
+22
+-140.14704
+32
+1702.42613319061
+13
+-21.009726616385
+23
+-140.14704
+33
+1702.42613319061
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-21.009726616385
+20
+-140.14704
+30
+1702.42613319061
+11
+-4.87060060567757e-06
+21
+-140.14704
+31
+1737.86965702509
+12
+-11.3703870621396
+22
+-140.14704
+32
+1708.86694626048
+13
+-11.3703870621396
+23
+-140.14704
+33
+1708.86694626048
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-11.3703870621396
+20
+-140.14704
+30
+1708.86694626048
+11
+-4.87060060567757e-06
+21
+-140.14704
+31
+1737.86965702509
+12
+-6.08824821207721e-06
+22
+-140.14704
+32
+1711.12866608211
+13
+-6.08824821207721e-06
+23
+-140.14704
+33
+1711.12866608211
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-6.08824821207721e-06
+20
+-140.14704
+30
+1711.12866608211
+11
+-4.87060060567757e-06
+21
+-140.14704
+31
+1737.86965702509
+12
+11.3703788747745
+22
+-140.14704
+32
+1708.8669663152
+13
+11.3703788747745
+23
+-140.14704
+33
+1708.8669663152
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+11.3703788747745
+20
+-140.14704
+30
+1708.8669663152
+11
+-4.87060060567757e-06
+21
+-140.14704
+31
+1737.86965702509
+12
+34.1997565800718
+22
+-140.14704
+32
+1734.50129493144
+13
+34.1997565800718
+23
+-140.14704
+33
+1734.50129493144
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+11.3703788747745
+20
+-140.14704
+30
+1708.8669663152
+11
+34.1997565800718
+21
+-140.14704
+31
+1734.50129493144
+12
+21.0097297891047
+22
+-140.14704
+32
+1702.4261702469
+13
+21.0097297891047
+23
+-140.14704
+33
+1702.4261702469
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+21.0097297891047
+20
+-140.14704
+30
+1702.4261702469
+11
+34.1997565800718
+21
+-140.14704
+31
+1734.50129493144
+12
+27.4505428589692
+22
+-140.14704
+32
+1692.78683069265
+13
+27.4505428589692
+23
+-140.14704
+33
+1692.78683069265
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+27.4505428589692
+20
+-140.14704
+30
+1692.78683069265
+11
+34.1997565800718
+21
+-140.14704
+31
+1734.50129493144
+12
+29.712262680597
+22
+-140.14704
+32
+1681.41644971876
+13
+29.712262680597
+23
+-140.14704
+33
+1681.41644971876
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+29.712262680597
+20
+-140.14704
+30
+1681.41644971876
+11
+34.1997565800718
+21
+-140.14704
+31
+1734.50129493144
+12
+32.5367278632675
+22
+-140.147039999999
+32
+1641.11809184948
+13
+32.5367278632675
+23
+-140.147039999999
+33
+1641.11809184948
+70
+15
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632675
+20
+-140.147039999999
+30
+1641.11809184948
+11
+34.1997565800718
+21
+-140.14704
+31
+1734.50129493144
+12
+47.2360111121902
+22
+-140.147039999999
+32
+1633.26118228483
+13
+47.2360111121902
+23
+-140.147039999999
+33
+1633.26118228483
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121902
+20
+-140.147039999999
+30
+1633.26118228483
+11
+34.1997565800718
+21
+-140.14704
+31
+1734.50129493144
+12
+67.0852443586765
+22
+-140.14704
+32
+1724.52561249664
+13
+67.0852443586765
+23
+-140.14704
+33
+1724.52561249664
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121902
+20
+-140.147039999999
+30
+1633.26118228483
+11
+67.0852443586765
+21
+-140.14704
+31
+1724.52561249664
+12
+60.1200447381919
+22
+-140.147039999999
+32
+1622.68755313192
+13
+60.1200447381919
+23
+-140.147039999999
+33
+1622.68755313192
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1200447381919
+20
+-140.147039999999
+30
+1622.68755313192
+11
+67.0852443586765
+21
+-140.14704
+31
+1724.52561249664
+12
+70.6937025544744
+22
+-140.147039999998
+32
+1609.80354302934
+13
+70.6937025544744
+23
+-140.147039999998
+33
+1609.80354302934
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544744
+20
+-140.147039999998
+30
+1609.80354302934
+11
+67.0852443586765
+21
+-140.14704
+31
+1724.52561249664
+12
+97.3926876122757
+22
+-140.147039999999
+32
+1708.32596960222
+13
+97.3926876122757
+23
+-140.147039999999
+33
+1708.32596960222
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544744
+20
+-140.147039999998
+30
+1609.80354302934
+11
+97.3926876122757
+21
+-140.147039999999
+31
+1708.32596960222
+12
+78.5506448209338
+22
+-140.147039999998
+32
+1595.1042772599
+13
+78.5506448209338
+23
+-140.147039999998
+33
+1595.1042772599
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5506448209338
+20
+-140.147039999998
+30
+1595.1042772599
+11
+97.3926876122757
+21
+-140.147039999999
+31
+1708.32596960222
+12
+83.3889336524938
+22
+-140.147039999998
+32
+1579.15464036367
+13
+83.3889336524938
+23
+-140.147039999998
+33
+1579.15464036367
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889336524938
+20
+-140.147039999998
+30
+1579.15464036367
+11
+97.3926876122757
+21
+-140.147039999999
+31
+1708.32596960222
+12
+85.0226363227013
+22
+-140.147039999998
+32
+1562.56756794192
+13
+85.0226363227013
+23
+-140.147039999998
+33
+1562.56756794192
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3924901667671
+20
+-140.147039999998
+30
+1416.80897713006
+11
+-83.3887362069852
+21
+-140.147039999999
+31
+1545.98030636861
+12
+-67.0850469131678
+22
+-140.147039999997
+32
+1400.60933423564
+13
+-67.0850469131678
+23
+-140.147039999997
+33
+1400.60933423564
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887362069852
+20
+-140.147039999999
+30
+1545.98030636861
+11
+-97.3924901667671
+21
+-140.147039999998
+31
+1416.80897713006
+12
+-85.0224388771927
+22
+-140.147039999999
+32
+1562.56737879036
+13
+-85.0224388771927
+23
+-140.147039999999
+33
+1562.56737879036
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.0850469131678
+20
+-140.147039999997
+30
+1400.60933423564
+11
+-83.3887362069852
+21
+-140.147039999999
+31
+1545.98030636861
+12
+-78.5504473754252
+22
+-140.147039999999
+32
+1530.03066947238
+13
+-78.5504473754252
+23
+-140.147039999999
+33
+1530.03066947238
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.0850469131678
+20
+-140.147039999997
+30
+1400.60933423564
+11
+-78.5504473754252
+21
+-140.147039999999
+31
+1530.03066947238
+12
+-70.6935051089658
+22
+-140.147039999998
+32
+1515.33140370293
+13
+-70.6935051089658
+23
+-140.147039999998
+33
+1515.33140370293
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.0850469131678
+20
+-140.147039999997
+30
+1400.60933423564
+11
+-70.6935051089658
+21
+-140.147039999998
+31
+1515.33140370293
+12
+-60.1198472926833
+22
+-140.147039999998
+32
+1502.44739360036
+13
+-60.1198472926833
+23
+-140.147039999998
+33
+1502.44739360036
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.0850469131678
+20
+-140.147039999997
+30
+1400.60933423564
+11
+-60.1198472926833
+21
+-140.147039999998
+31
+1502.44739360036
+12
+-34.1995591345631
+22
+-140.147039999997
+32
+1390.63365180084
+13
+-34.1995591345631
+23
+-140.147039999997
+33
+1390.63365180084
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.1995591345631
+20
+-140.147039999997
+30
+1390.63365180084
+11
+-60.1198472926833
+21
+-140.147039999998
+31
+1502.44739360036
+12
+-47.2358136666817
+22
+-140.147039999998
+32
+1491.87376444745
+13
+-47.2358136666817
+23
+-140.147039999998
+33
+1491.87376444745
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.1995591345631
+20
+-140.147039999997
+30
+1390.63365180084
+11
+-47.2358136666817
+21
+-140.147039999998
+31
+1491.87376444745
+12
+-32.5365304177589
+22
+-140.147039999998
+32
+1484.01685488279
+13
+-32.5365304177589
+23
+-140.147039999998
+33
+1484.01685488279
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.1995591345631
+20
+-140.147039999997
+30
+1390.63365180084
+11
+-32.5365304177589
+21
+-140.147039999998
+31
+1484.01685488279
+12
+0.00020231610917012
+22
+-140.147039999996
+32
+1387.26528970719
+13
+0.00020231610917012
+23
+-140.147039999996
+33
+1387.26528970719
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.00020231610917012
+20
+-140.147039999996
+30
+1387.26528970719
+11
+-32.5365304177589
+21
+-140.147039999998
+31
+1484.01685488279
+12
+-16.586882757718
+22
+-140.147039999997
+32
+1479.17860153476
+13
+-16.586882757718
+23
+-140.147039999997
+33
+1479.17860153476
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.00020231610917012
+20
+-140.147039999996
+30
+1387.26528970719
+11
+-16.586882757718
+21
+-140.147039999997
+31
+1479.17860153476
+12
+0.000193298531099362
+22
+-140.147039999997
+32
+1477.54493576619
+13
+0.000193298531099362
+23
+-140.147039999997
+33
+1477.54493576619
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.00020231610917012
+20
+-140.147039999996
+30
+1387.26528970719
+11
+0.000193298531099362
+21
+-140.147039999997
+31
+1477.54493576619
+12
+16.5872657202861
+22
+-140.147039999997
+32
+1479.1786384364
+13
+16.5872657202861
+23
+-140.147039999997
+33
+1479.1786384364
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.00020231610917012
+20
+-140.147039999996
+30
+1387.26528970719
+11
+16.5872657202861
+21
+-140.147039999997
+31
+1479.1786384364
+12
+34.199959785747
+22
+-140.147039999996
+32
+1390.63369222096
+13
+34.199959785747
+23
+-140.147039999996
+33
+1390.63369222096
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.199959785747
+20
+-140.147039999996
+30
+1390.63369222096
+11
+16.5872657202861
+21
+-140.147039999997
+31
+1479.1786384364
+12
+32.5369026165164
+22
+-140.147039999997
+32
+1484.01692726796
+13
+32.5369026165164
+23
+-140.147039999997
+33
+1484.01692726796
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.199959785747
+20
+-140.147039999996
+30
+1390.63369222096
+11
+32.5369026165164
+21
+-140.147039999997
+31
+1484.01692726796
+12
+47.2361683859592
+22
+-140.147039999997
+32
+1491.87386953442
+13
+47.2361683859592
+23
+-140.147039999997
+33
+1491.87386953442
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.199959785747
+20
+-140.147039999996
+30
+1390.63369222096
+11
+47.2361683859592
+21
+-140.147039999997
+31
+1491.87386953442
+12
+67.085435774237
+22
+-140.147039999996
+32
+1400.60941352256
+13
+67.085435774237
+23
+-140.147039999996
+33
+1400.60941352256
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.085435774237
+20
+-140.147039999996
+30
+1400.60941352256
+11
+47.2361683859592
+21
+-140.147039999997
+31
+1491.87386953442
+12
+60.1201784885382
+22
+-140.147039999997
+32
+1502.4475273507
+13
+60.1201784885382
+23
+-140.147039999997
+33
+1502.4475273507
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.085435774237
+20
+-140.147039999996
+30
+1400.60941352256
+11
+60.1201784885382
+21
+-140.147039999997
+31
+1502.4475273507
+12
+70.6938076414472
+22
+-140.147039999997
+32
+1515.3315609767
+13
+70.6938076414472
+23
+-140.147039999997
+33
+1515.3315609767
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.085435774237
+20
+-140.147039999996
+30
+1400.60941352256
+11
+70.6938076414472
+21
+-140.147039999997
+31
+1515.3315609767
+12
+97.3928598817289
+22
+-140.147039999996
+32
+1416.80909223683
+13
+97.3928598817289
+23
+-140.147039999996
+33
+1416.80909223683
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817289
+20
+-140.147039999996
+30
+1416.80909223683
+11
+70.6938076414472
+21
+-140.147039999997
+31
+1515.3315609767
+12
+78.5507172060996
+22
+-140.147039999997
+32
+1530.03084422563
+13
+78.5507172060996
+23
+-140.147039999997
+33
+1530.03084422563
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817289
+20
+-140.147039999996
+30
+1416.80909223683
+11
+78.5507172060996
+21
+-140.147039999997
+31
+1530.03084422563
+12
+83.3889705541313
+22
+-140.147039999997
+32
+1545.98049188567
+13
+83.3889705541313
+23
+-140.147039999997
+33
+1545.98049188567
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817289
+20
+-140.147039999996
+30
+1416.80909223683
+11
+83.3889705541313
+21
+-140.147039999997
+31
+1545.98049188567
+12
+85.0226363227013
+22
+-140.147039999998
+32
+1562.56756794192
+13
+85.0226363227013
+23
+-140.147039999998
+33
+1562.56756794192
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817289
+20
+-140.147039999996
+30
+1416.80909223683
+11
+85.0226363227013
+21
+-140.147039999998
+31
+1562.56756794192
+12
+97.3926876122757
+22
+-140.147039999999
+32
+1708.32596960222
+13
+97.3926876122757
+23
+-140.147039999999
+33
+1708.32596960222
+70
+15
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817289
+20
+-140.147039999996
+30
+1416.80909223683
+11
+97.3926876122757
+21
+-140.147039999999
+31
+1708.32596960222
+12
+123.957388293244
+22
+-140.147039999999
+32
+1686.52490943976
+13
+123.957388293244
+23
+-140.147039999999
+33
+1686.52490943976
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3928598817289
+20
+-140.147039999996
+30
+1416.80909223683
+11
+123.957388293244
+21
+-140.147039999999
+31
+1686.52490943976
+12
+123.957534796371
+22
+-140.147039999996
+32
+1438.61018379565
+13
+123.957534796371
+23
+-140.147039999996
+33
+1438.61018379565
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957534796371
+20
+-140.147039999996
+30
+1438.61018379565
+11
+123.957388293244
+21
+-140.147039999999
+31
+1686.52490943976
+12
+145.758479852067
+22
+-140.147039999998
+32
+1659.96023452511
+13
+145.758479852067
+23
+-140.147039999998
+33
+1659.96023452511
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957534796371
+20
+-140.147039999996
+30
+1438.61018379565
+11
+145.758479852067
+21
+-140.147039999998
+31
+1659.96023452511
+12
+145.758594958835
+22
+-140.147039999996
+32
+1465.17488447662
+13
+145.758594958835
+23
+-140.147039999996
+33
+1465.17488447662
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758594958835
+20
+-140.147039999996
+30
+1465.17488447662
+11
+145.758479852067
+21
+-140.147039999998
+31
+1659.96023452511
+12
+161.958158566332
+22
+-140.147039999998
+32
+1629.65281041762
+13
+161.958158566332
+23
+-140.147039999998
+33
+1629.65281041762
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758594958835
+20
+-140.147039999996
+30
+1465.17488447662
+11
+161.958158566332
+21
+-140.147039999998
+31
+1629.65281041762
+12
+161.958237853253
+22
+-140.147039999996
+32
+1495.48232773022
+13
+161.958237853253
+23
+-140.147039999996
+33
+1495.48232773022
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958237853253
+20
+-140.147039999996
+30
+1495.48232773022
+11
+161.958158566332
+21
+-140.147039999998
+31
+1629.65281041762
+12
+171.933879867935
+22
+-140.147039999998
+32
+1596.76733442913
+13
+171.933879867935
+23
+-140.147039999998
+33
+1596.76733442913
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958237853253
+20
+-140.147039999996
+30
+1495.48232773022
+11
+171.933879867935
+21
+-140.147039999998
+31
+1596.76733442913
+12
+171.933920288057
+22
+-140.147039999997
+32
+1528.36781550882
+13
+171.933920288057
+23
+-140.147039999997
+33
+1528.36781550882
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+171.933920288057
+20
+-140.147039999997
+30
+1528.36781550882
+11
+171.933879867935
+21
+-140.147039999998
+31
+1596.76733442913
+12
+175.302282381704
+22
+-140.147039999997
+32
+1562.56757695949
+13
+175.302282381704
+23
+-140.147039999997
+33
+1562.56757695949
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710078
+20
+-140.14704
+30
+1641.11801946432
+11
+-27.4505026299636
+21
+-140.14704
+31
+1670.04601633937
+12
+-16.5870682747775
+22
+-140.14704
+32
+1645.95630829588
+13
+-16.5870682747775
+23
+-140.14704
+33
+1645.95630829588
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-27.4505026299636
+20
+-140.14704
+30
+1670.04601633937
+11
+-32.5367051710078
+21
+-140.14704
+31
+1641.11801946432
+12
+-29.7122224515915
+22
+-140.14704
+32
+1681.41639731326
+13
+-29.7122224515915
+23
+-140.14704
+33
+1681.41639731326
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747775
+20
+-140.14704
+30
+1645.95630829588
+11
+-27.4505026299636
+21
+-140.14704
+31
+1670.04601633937
+12
+-21.0096895600991
+22
+-140.14704
+32
+1660.40667678512
+13
+-21.0096895600991
+23
+-140.14704
+33
+1660.40667678512
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747775
+20
+-140.14704
+30
+1645.95630829588
+11
+-21.0096895600991
+21
+-140.14704
+31
+1660.40667678512
+12
+-11.370338645769
+22
+-140.14704
+32
+1653.96588071683
+13
+-11.370338645769
+23
+-140.14704
+33
+1653.96588071683
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747775
+20
+-140.14704
+30
+1645.95630829588
+11
+-11.370338645769
+21
+-140.14704
+31
+1653.96588071683
+12
+4.14697744393067e-06
+22
+-140.147039999999
+32
+1647.59001096608
+13
+4.14697744393067e-06
+23
+-140.147039999999
+33
+1647.59001096608
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697744393067e-06
+20
+-140.147039999999
+30
+1647.59001096608
+11
+-11.370338645769
+21
+-140.14704
+31
+1653.96588071683
+12
+4.63172537816581e-05
+22
+-140.14704
+32
+1651.70418094992
+13
+4.63172537816581e-05
+23
+-140.14704
+33
+1651.70418094992
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697744393067e-06
+20
+-140.147039999999
+30
+1647.59001096608
+11
+4.63172537816581e-05
+21
+-140.14704
+31
+1651.70418094992
+12
+16.5870802032265
+22
+-140.147039999999
+32
+1645.95634519751
+13
+16.5870802032265
+23
+-140.147039999999
+33
+1645.95634519751
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032265
+20
+-140.147039999999
+30
+1645.95634519751
+11
+4.63172537816581e-05
+21
+-140.14704
+31
+1651.70418094992
+12
+11.3704272911452
+22
+-140.14704
+32
+1653.96590077155
+13
+11.3704272911452
+23
+-140.14704
+33
+1653.96590077155
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032265
+20
+-140.147039999999
+30
+1645.95634519751
+11
+11.3704272911452
+21
+-140.14704
+31
+1653.96590077155
+12
+21.0097668453905
+22
+-140.14704
+32
+1660.40671384141
+13
+21.0097668453905
+23
+-140.14704
+33
+1660.40671384141
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032265
+20
+-140.147039999999
+30
+1645.95634519751
+11
+21.0097668453905
+21
+-140.14704
+31
+1660.40671384141
+12
+32.5367278632675
+22
+-140.147039999999
+32
+1641.11809184948
+13
+32.5367278632675
+23
+-140.147039999999
+33
+1641.11809184948
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632675
+20
+-140.147039999999
+30
+1641.11809184948
+11
+21.0097668453905
+21
+-140.14704
+31
+1660.40671384141
+12
+27.4505629136866
+22
+-140.14704
+32
+1670.04606475574
+13
+27.4505629136866
+23
+-140.14704
+33
+1670.04606475574
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632675
+20
+-140.147039999999
+30
+1641.11809184948
+11
+27.4505629136866
+21
+-140.14704
+31
+1670.04606475574
+12
+29.712262680597
+22
+-140.14704
+32
+1681.41644971876
+13
+29.712262680597
+23
+-140.14704
+33
+1681.41644971876
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.1997623402384
+20
+-140.147040000001
+30
+1734.50125451132
+11
+-4.87059913788501e-06
+21
+-327.009760000001
+31
+1737.86965702509
+12
+-4.87060060567757e-06
+22
+-140.14704
+32
+1737.86965702509
+13
+-4.87060060567757e-06
+23
+-140.14704
+33
+1737.86965702509
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-4.87059913788501e-06
+20
+-327.009760000001
+30
+1737.86965702509
+11
+-34.1997623402384
+21
+-140.147040000001
+31
+1734.50125451132
+12
+-34.199762340237
+22
+-327.009760000002
+32
+1734.50125451132
+13
+-34.199762340237
+23
+-327.009760000002
+33
+1734.50125451132
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6935051089646
+20
+-301.609759999999
+30
+1515.33140370293
+11
+-60.1198472926819
+21
+-327.009759999999
+31
+1502.44739360035
+12
+-60.1198472926821
+22
+-301.609759999999
+32
+1502.44739360035
+13
+-60.1198472926821
+23
+-301.609759999999
+33
+1502.44739360035
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926819
+20
+-327.009759999999
+30
+1502.44739360035
+11
+-70.6935051089646
+21
+-301.609759999999
+31
+1515.33140370293
+12
+-70.6935051089644
+22
+-327.009759999999
+32
+1515.33140370293
+13
+-70.6935051089644
+23
+-327.009759999999
+33
+1515.33140370293
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887362069839
+20
+-301.60976
+30
+1545.98030636861
+11
+-83.3887731086215
+21
+-301.60976
+31
+1579.15445484661
+12
+-85.0224388771915
+22
+-301.60976
+32
+1562.56737879036
+13
+-85.0224388771915
+23
+-301.60976
+33
+1562.56737879036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086215
+20
+-301.60976
+30
+1579.15445484661
+11
+-83.3887362069839
+21
+-301.60976
+31
+1545.98030636861
+12
+-78.5505197605897
+22
+-301.60976
+32
+1595.10410250665
+13
+-78.5505197605897
+23
+-301.60976
+33
+1595.10410250665
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5505197605897
+20
+-301.60976
+30
+1595.10410250665
+11
+-83.3887362069839
+21
+-301.60976
+31
+1545.98030636861
+12
+-78.5504473754239
+22
+-301.60976
+32
+1530.03066947238
+13
+-78.5504473754239
+23
+-301.60976
+33
+1530.03066947238
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5505197605897
+20
+-301.60976
+30
+1595.10410250665
+11
+-78.5504473754239
+21
+-301.60976
+31
+1530.03066947238
+12
+-70.6936101959373
+22
+-301.60976
+32
+1609.80338575557
+13
+-70.6936101959373
+23
+-301.60976
+33
+1609.80338575557
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6936101959373
+20
+-301.60976
+30
+1609.80338575557
+11
+-78.5504473754239
+21
+-301.60976
+31
+1530.03066947238
+12
+-70.6935051089646
+22
+-301.609759999999
+32
+1515.33140370293
+13
+-70.6935051089646
+23
+-301.609759999999
+33
+1515.33140370293
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6936101959373
+20
+-301.60976
+30
+1609.80338575557
+11
+-70.6935051089646
+21
+-301.609759999999
+31
+1515.33140370293
+12
+-60.1199810430283
+22
+-301.609760000001
+32
+1622.68741938157
+13
+-60.1199810430283
+23
+-301.609760000001
+33
+1622.68741938157
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430283
+20
+-301.609760000001
+30
+1622.68741938157
+11
+-70.6935051089646
+21
+-301.609759999999
+31
+1515.33140370293
+12
+-60.1198472926821
+22
+-301.609759999999
+32
+1502.44739360035
+13
+-60.1198472926821
+23
+-301.609759999999
+33
+1502.44739360035
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430283
+20
+-301.609760000001
+30
+1622.68741938157
+11
+-60.1198472926821
+21
+-301.609759999999
+31
+1502.44739360035
+12
+-47.2359709404494
+22
+-301.609760000001
+32
+1633.26107719786
+13
+-47.2359709404494
+23
+-301.609760000001
+33
+1633.26107719786
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2359709404494
+20
+-301.609760000001
+30
+1633.26107719786
+11
+-60.1198472926821
+21
+-301.609759999999
+31
+1502.44739360035
+12
+-47.2358136666804
+22
+-301.609759999999
+32
+1491.87376444745
+13
+-47.2358136666804
+23
+-301.609759999999
+33
+1491.87376444745
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2359709404494
+20
+-301.609760000001
+30
+1633.26107719786
+11
+-47.2358136666804
+21
+-301.609759999999
+31
+1491.87376444745
+12
+-32.5367051710066
+22
+-301.609760000001
+32
+1641.11801946432
+13
+-32.5367051710066
+23
+-301.609760000001
+33
+1641.11801946432
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710066
+20
+-301.609760000001
+30
+1641.11801946432
+11
+-47.2358136666804
+21
+-301.609759999999
+31
+1491.87376444745
+12
+-32.5365304177576
+22
+-301.609759999999
+32
+1484.01685488279
+13
+-32.5365304177576
+23
+-301.609759999999
+33
+1484.01685488279
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710066
+20
+-301.609760000001
+30
+1641.11801946432
+11
+-32.5365304177576
+21
+-301.609759999999
+31
+1484.01685488279
+12
+-16.5870682747763
+22
+-301.60976
+32
+1645.95630829588
+13
+-16.5870682747763
+23
+-301.60976
+33
+1645.95630829588
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747763
+20
+-301.60976
+30
+1645.95630829588
+11
+-32.5365304177576
+21
+-301.609759999999
+31
+1484.01685488279
+12
+-16.5868827577167
+22
+-301.609759999998
+32
+1479.17860153476
+13
+-16.5868827577167
+23
+-301.609759999998
+33
+1479.17860153476
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747763
+20
+-301.60976
+30
+1645.95630829588
+11
+-16.5868827577167
+21
+-301.609759999998
+31
+1479.17860153476
+12
+4.14697870727565e-06
+22
+-301.60976
+32
+1647.59001096608
+13
+4.14697870727565e-06
+23
+-301.60976
+33
+1647.59001096608
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697870727565e-06
+20
+-301.60976
+30
+1647.59001096608
+11
+-16.5868827577167
+21
+-301.609759999998
+31
+1479.17860153476
+12
+0.000193298532362707
+22
+-301.609759999998
+32
+1477.54493576619
+13
+0.000193298532362707
+23
+-301.609759999998
+33
+1477.54493576619
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697870727565e-06
+20
+-301.60976
+30
+1647.59001096608
+11
+0.000193298532362707
+21
+-301.609759999998
+31
+1477.54493576619
+12
+16.5870802032278
+22
+-301.60976
+32
+1645.95634519751
+13
+16.5870802032278
+23
+-301.60976
+33
+1645.95634519751
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032278
+20
+-301.60976
+30
+1645.95634519751
+11
+0.000193298532362707
+21
+-301.609759999998
+31
+1477.54493576619
+12
+16.5872657202874
+22
+-301.609759999998
+32
+1479.1786384364
+13
+16.5872657202874
+23
+-301.609759999998
+33
+1479.1786384364
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032278
+20
+-301.60976
+30
+1645.95634519751
+11
+16.5872657202874
+21
+-301.609759999998
+31
+1479.1786384364
+12
+32.5367278632687
+22
+-301.60976
+32
+1641.11809184948
+13
+32.5367278632687
+23
+-301.60976
+33
+1641.11809184948
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632687
+20
+-301.60976
+30
+1641.11809184948
+11
+16.5872657202874
+21
+-301.609759999998
+31
+1479.1786384364
+12
+32.5369026165177
+22
+-301.609759999998
+32
+1484.01692726796
+13
+32.5369026165177
+23
+-301.609759999998
+33
+1484.01692726796
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632687
+20
+-301.60976
+30
+1641.11809184948
+11
+32.5369026165177
+21
+-301.609759999998
+31
+1484.01692726796
+12
+47.2360111121915
+22
+-301.60976
+32
+1633.26118228483
+13
+47.2360111121915
+23
+-301.60976
+33
+1633.26118228483
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121915
+20
+-301.60976
+30
+1633.26118228483
+11
+32.5369026165177
+21
+-301.609759999998
+31
+1484.01692726796
+12
+47.2361683859605
+22
+-301.609759999998
+32
+1491.87386953442
+13
+47.2361683859605
+23
+-301.609759999998
+33
+1491.87386953442
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121915
+20
+-301.60976
+30
+1633.26118228483
+11
+47.2361683859605
+21
+-301.609759999998
+31
+1491.87386953442
+12
+60.1200447381932
+22
+-301.60976
+32
+1622.68755313192
+13
+60.1200447381932
+23
+-301.60976
+33
+1622.68755313192
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1200447381932
+20
+-301.60976
+30
+1622.68755313192
+11
+47.2361683859605
+21
+-301.609759999998
+31
+1491.87386953442
+12
+60.1201784885394
+22
+-301.609759999998
+32
+1502.4475273507
+13
+60.1201784885394
+23
+-301.609759999998
+33
+1502.4475273507
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1200447381932
+20
+-301.60976
+30
+1622.68755313192
+11
+60.1201784885394
+21
+-301.609759999998
+31
+1502.4475273507
+12
+70.6937025544757
+22
+-301.609759999999
+32
+1609.80354302934
+13
+70.6937025544757
+23
+-301.609759999999
+33
+1609.80354302934
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544757
+20
+-301.609759999999
+30
+1609.80354302934
+11
+60.1201784885394
+21
+-301.609759999998
+31
+1502.4475273507
+12
+70.6938076414485
+22
+-301.609759999998
+32
+1515.3315609767
+13
+70.6938076414485
+23
+-301.609759999998
+33
+1515.3315609767
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544757
+20
+-301.609759999999
+30
+1609.80354302934
+11
+70.6938076414485
+21
+-301.609759999998
+31
+1515.3315609767
+12
+78.550644820935
+22
+-301.609759999999
+32
+1595.1042772599
+13
+78.550644820935
+23
+-301.609759999999
+33
+1595.1042772599
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.550644820935
+20
+-301.609759999999
+30
+1595.1042772599
+11
+70.6938076414485
+21
+-301.609759999998
+31
+1515.3315609767
+12
+78.5507172061008
+22
+-301.609759999998
+32
+1530.03084422562
+13
+78.5507172061008
+23
+-301.609759999998
+33
+1530.03084422562
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.550644820935
+20
+-301.609759999999
+30
+1595.1042772599
+11
+78.5507172061008
+21
+-301.609759999998
+31
+1530.03084422562
+12
+83.388933652495
+22
+-301.609759999999
+32
+1579.15464036367
+13
+83.388933652495
+23
+-301.609759999999
+33
+1579.15464036367
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.388933652495
+20
+-301.609759999999
+30
+1579.15464036367
+11
+78.5507172061008
+21
+-301.609759999998
+31
+1530.03084422562
+12
+83.3889705541326
+22
+-301.609759999998
+32
+1545.98049188567
+13
+83.3889705541326
+23
+-301.609759999998
+33
+1545.98049188567
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.388933652495
+20
+-301.609759999999
+30
+1579.15464036367
+11
+83.3889705541326
+21
+-301.609759999998
+31
+1545.98049188567
+12
+85.0226363227026
+22
+-301.609759999999
+32
+1562.56756794191
+13
+85.0226363227026
+23
+-301.609759999999
+33
+1562.56756794191
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887362069839
+20
+-301.60976
+30
+1545.98030636861
+11
+-78.5504473754237
+21
+-327.00976
+31
+1530.03066947238
+12
+-78.5504473754239
+22
+-301.60976
+32
+1530.03066947238
+13
+-78.5504473754239
+23
+-301.60976
+33
+1530.03066947238
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5504473754237
+20
+-327.00976
+30
+1530.03066947238
+11
+-83.3887362069839
+21
+-301.60976
+31
+1545.98030636861
+12
+-83.3887362069838
+22
+-327.00976
+32
+1545.98030636861
+13
+-83.3887362069838
+23
+-327.00976
+33
+1545.98030636861
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2359709404492
+20
+-327.009760000001
+30
+1633.26107719786
+11
+-60.1199810430283
+21
+-301.609760000001
+31
+1622.68741938157
+12
+-47.2359709404494
+22
+-301.609760000001
+32
+1633.26107719786
+13
+-47.2359709404494
+23
+-301.609760000001
+33
+1633.26107719786
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430283
+20
+-301.609760000001
+30
+1622.68741938157
+11
+-47.2359709404492
+21
+-327.009760000001
+31
+1633.26107719786
+12
+-60.1199810430281
+22
+-327.009760000001
+32
+1622.68741938157
+13
+-60.1199810430281
+23
+-327.009760000001
+33
+1622.68741938157
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-85.0224388771915
+20
+-301.60976
+30
+1562.56737879036
+11
+-83.3887362069838
+21
+-327.00976
+31
+1545.98030636861
+12
+-83.3887362069839
+22
+-301.60976
+32
+1545.98030636861
+13
+-83.3887362069839
+23
+-301.60976
+33
+1545.98030636861
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887362069838
+20
+-327.00976
+30
+1545.98030636861
+11
+-85.0224388771915
+21
+-301.60976
+31
+1562.56737879036
+12
+-85.0224388771913
+22
+-327.00976
+32
+1562.56737879036
+13
+-85.0224388771913
+23
+-327.00976
+33
+1562.56737879036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710064
+20
+-327.009760000001
+30
+1641.11801946432
+11
+-47.2359709404494
+21
+-301.609760000001
+31
+1633.26107719786
+12
+-32.5367051710066
+22
+-301.609760000001
+32
+1641.11801946432
+13
+-32.5367051710066
+23
+-301.609760000001
+33
+1641.11801946432
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2359709404494
+20
+-301.609760000001
+30
+1633.26107719786
+11
+-32.5367051710064
+21
+-327.009760000001
+31
+1641.11801946432
+12
+-47.2359709404492
+22
+-327.009760000001
+32
+1633.26107719786
+13
+-47.2359709404492
+23
+-327.009760000001
+33
+1633.26107719786
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5505197605897
+20
+-301.60976
+30
+1595.10410250665
+11
+-83.3887731086213
+21
+-327.00976
+31
+1579.15445484661
+12
+-83.3887731086215
+22
+-301.60976
+32
+1579.15445484661
+13
+-83.3887731086215
+23
+-301.60976
+33
+1579.15445484661
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086213
+20
+-327.00976
+30
+1579.15445484661
+11
+-78.5505197605897
+21
+-301.60976
+31
+1595.10410250665
+12
+-78.5505197605895
+22
+-327.00976
+32
+1595.10410250665
+13
+-78.5505197605895
+23
+-327.00976
+33
+1595.10410250665
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859594
+20
+-165.547039999997
+30
+1491.87386953442
+11
+60.1201784885382
+21
+-140.147039999997
+31
+1502.4475273507
+12
+47.2361683859592
+22
+-140.147039999997
+32
+1491.87386953442
+13
+47.2361683859592
+23
+-140.147039999997
+33
+1491.87386953442
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1201784885382
+20
+-140.147039999997
+30
+1502.4475273507
+11
+47.2361683859594
+21
+-165.547039999997
+31
+1491.87386953442
+12
+60.1201784885383
+22
+-165.547039999997
+32
+1502.4475273507
+13
+60.1201784885383
+23
+-165.547039999997
+33
+1502.4475273507
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1201784885383
+20
+-165.547039999997
+30
+1502.4475273507
+11
+70.6938076414472
+21
+-140.147039999997
+31
+1515.3315609767
+12
+60.1201784885382
+22
+-140.147039999997
+32
+1502.4475273507
+13
+60.1201784885382
+23
+-140.147039999997
+33
+1502.4475273507
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414472
+20
+-140.147039999997
+30
+1515.3315609767
+11
+60.1201784885383
+21
+-165.547039999997
+31
+1502.4475273507
+12
+70.6938076414473
+22
+-165.547039999997
+32
+1515.3315609767
+13
+70.6938076414473
+23
+-165.547039999997
+33
+1515.3315609767
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414473
+20
+-165.547039999997
+30
+1515.3315609767
+11
+78.5507172060996
+21
+-140.147039999997
+31
+1530.03084422563
+12
+70.6938076414472
+22
+-140.147039999997
+32
+1515.3315609767
+13
+70.6938076414472
+23
+-140.147039999997
+33
+1515.3315609767
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5507172060996
+20
+-140.147039999997
+30
+1530.03084422563
+11
+70.6938076414473
+21
+-165.547039999997
+31
+1515.3315609767
+12
+78.5507172060997
+22
+-165.547039999997
+32
+1530.03084422563
+13
+78.5507172060997
+23
+-165.547039999997
+33
+1530.03084422563
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3924901667657
+20
+-327.009759999998
+30
+1416.80897713006
+11
+-83.3887362069838
+21
+-327.00976
+31
+1545.98030636861
+12
+-85.0224388771913
+22
+-327.00976
+32
+1562.56737879036
+13
+-85.0224388771913
+23
+-327.00976
+33
+1562.56737879036
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887362069838
+20
+-327.00976
+30
+1545.98030636861
+11
+-97.3924901667657
+21
+-327.009759999998
+31
+1416.80897713006
+12
+-67.0850469131664
+22
+-327.009759999998
+32
+1400.60933423564
+13
+-67.0850469131664
+23
+-327.009759999998
+33
+1400.60933423564
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887362069838
+20
+-327.00976
+30
+1545.98030636861
+11
+-67.0850469131664
+21
+-327.009759999998
+31
+1400.60933423564
+12
+-78.5504473754237
+22
+-327.00976
+32
+1530.03066947238
+13
+-78.5504473754237
+23
+-327.00976
+33
+1530.03066947238
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5504473754237
+20
+-327.00976
+30
+1530.03066947238
+11
+-67.0850469131664
+21
+-327.009759999998
+31
+1400.60933423564
+12
+-70.6935051089644
+22
+-327.009759999999
+32
+1515.33140370293
+13
+-70.6935051089644
+23
+-327.009759999999
+33
+1515.33140370293
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6935051089644
+20
+-327.009759999999
+30
+1515.33140370293
+11
+-67.0850469131664
+21
+-327.009759999998
+31
+1400.60933423564
+12
+-60.1198472926819
+22
+-327.009759999999
+32
+1502.44739360035
+13
+-60.1198472926819
+23
+-327.009759999999
+33
+1502.44739360035
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926819
+20
+-327.009759999999
+30
+1502.44739360035
+11
+-67.0850469131664
+21
+-327.009759999998
+31
+1400.60933423564
+12
+-34.1995591345617
+22
+-327.009759999998
+32
+1390.63365180083
+13
+-34.1995591345617
+23
+-327.009759999998
+33
+1390.63365180083
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926819
+20
+-327.009759999999
+30
+1502.44739360035
+11
+-34.1995591345617
+21
+-327.009759999998
+31
+1390.63365180083
+12
+-47.2358136666802
+22
+-327.009759999999
+32
+1491.87376444745
+13
+-47.2358136666802
+23
+-327.009759999999
+33
+1491.87376444745
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2358136666802
+20
+-327.009759999999
+30
+1491.87376444745
+11
+-34.1995591345617
+21
+-327.009759999998
+31
+1390.63365180083
+12
+-32.5365304177574
+22
+-327.009759999999
+32
+1484.01685488279
+13
+-32.5365304177574
+23
+-327.009759999999
+33
+1484.01685488279
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177574
+20
+-327.009759999999
+30
+1484.01685488279
+11
+-34.1995591345617
+21
+-327.009759999998
+31
+1390.63365180083
+12
+0.000202316110637912
+22
+-327.009759999997
+32
+1387.26528970719
+13
+0.000202316110637912
+23
+-327.009759999997
+33
+1387.26528970719
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177574
+20
+-327.009759999999
+30
+1484.01685488279
+11
+0.000202316110637912
+21
+-327.009759999997
+31
+1387.26528970719
+12
+-16.5868827577165
+22
+-327.009759999998
+32
+1479.17860153476
+13
+-16.5868827577165
+23
+-327.009759999998
+33
+1479.17860153476
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5868827577165
+20
+-327.009759999998
+30
+1479.17860153476
+11
+0.000202316110637912
+21
+-327.009759999997
+31
+1387.26528970719
+12
+0.000193298532564334
+22
+-327.009759999998
+32
+1477.54493576619
+13
+0.000193298532564334
+23
+-327.009759999998
+33
+1477.54493576619
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000193298532564334
+20
+-327.009759999998
+30
+1477.54493576619
+11
+0.000202316110637912
+21
+-327.009759999997
+31
+1387.26528970719
+12
+16.5872657202876
+22
+-327.009759999998
+32
+1479.1786384364
+13
+16.5872657202876
+23
+-327.009759999998
+33
+1479.1786384364
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202876
+20
+-327.009759999998
+30
+1479.1786384364
+11
+0.000202316110637912
+21
+-327.009759999997
+31
+1387.26528970719
+12
+34.1999597857484
+22
+-327.009759999997
+32
+1390.63369222096
+13
+34.1999597857484
+23
+-327.009759999997
+33
+1390.63369222096
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202876
+20
+-327.009759999998
+30
+1479.1786384364
+11
+34.1999597857484
+21
+-327.009759999997
+31
+1390.63369222096
+12
+32.5369026165179
+22
+-327.009759999998
+32
+1484.01692726796
+13
+32.5369026165179
+23
+-327.009759999998
+33
+1484.01692726796
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5369026165179
+20
+-327.009759999998
+30
+1484.01692726796
+11
+34.1999597857484
+21
+-327.009759999997
+31
+1390.63369222096
+12
+47.2361683859607
+22
+-327.009759999998
+32
+1491.87386953442
+13
+47.2361683859607
+23
+-327.009759999998
+33
+1491.87386953442
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859607
+20
+-327.009759999998
+30
+1491.87386953442
+11
+34.1999597857484
+21
+-327.009759999997
+31
+1390.63369222096
+12
+67.0854357742384
+22
+-327.009759999997
+32
+1400.60941352256
+13
+67.0854357742384
+23
+-327.009759999997
+33
+1400.60941352256
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859607
+20
+-327.009759999998
+30
+1491.87386953442
+11
+67.0854357742384
+21
+-327.009759999997
+31
+1400.60941352256
+12
+60.1201784885396
+22
+-327.009759999998
+32
+1502.4475273507
+13
+60.1201784885396
+23
+-327.009759999998
+33
+1502.4475273507
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1201784885396
+20
+-327.009759999998
+30
+1502.4475273507
+11
+67.0854357742384
+21
+-327.009759999997
+31
+1400.60941352256
+12
+70.6938076414486
+22
+-327.009759999998
+32
+1515.3315609767
+13
+70.6938076414486
+23
+-327.009759999998
+33
+1515.3315609767
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414486
+20
+-327.009759999998
+30
+1515.3315609767
+11
+67.0854357742384
+21
+-327.009759999997
+31
+1400.60941352256
+12
+97.3928598817304
+22
+-327.009759999997
+32
+1416.80909223683
+13
+97.3928598817304
+23
+-327.009759999997
+33
+1416.80909223683
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414486
+20
+-327.009759999998
+30
+1515.3315609767
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+78.550717206101
+22
+-327.009759999998
+32
+1530.03084422562
+13
+78.550717206101
+23
+-327.009759999998
+33
+1530.03084422562
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.550717206101
+20
+-327.009759999998
+30
+1530.03084422562
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+83.3889705541327
+22
+-327.009759999998
+32
+1545.98049188567
+13
+83.3889705541327
+23
+-327.009759999998
+33
+1545.98049188567
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889705541327
+20
+-327.009759999998
+30
+1545.98049188567
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+85.0226363227028
+22
+-327.009759999999
+32
+1562.56756794191
+13
+85.0226363227028
+23
+-327.009759999999
+33
+1562.56756794191
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+85.0226363227028
+20
+-327.009759999999
+30
+1562.56756794191
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+97.3926876122771
+22
+-327.00976
+32
+1708.32596960222
+13
+97.3926876122771
+23
+-327.00976
+33
+1708.32596960222
+70
+15
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3926876122771
+20
+-327.00976
+30
+1708.32596960222
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+123.957388293245
+22
+-327.00976
+32
+1686.52490943975
+13
+123.957388293245
+23
+-327.00976
+33
+1686.52490943975
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957388293245
+20
+-327.00976
+30
+1686.52490943975
+11
+97.3928598817304
+21
+-327.009759999997
+31
+1416.80909223683
+12
+123.957534796373
+22
+-327.009759999997
+32
+1438.61018379565
+13
+123.957534796373
+23
+-327.009759999997
+33
+1438.61018379565
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+123.957388293245
+20
+-327.00976
+30
+1686.52490943975
+11
+123.957534796373
+21
+-327.009759999997
+31
+1438.61018379565
+12
+145.758479852068
+22
+-327.009759999999
+32
+1659.96023452511
+13
+145.758479852068
+23
+-327.009759999999
+33
+1659.96023452511
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758479852068
+20
+-327.009759999999
+30
+1659.96023452511
+11
+123.957534796373
+21
+-327.009759999997
+31
+1438.61018379565
+12
+145.758594958837
+22
+-327.009759999997
+32
+1465.17488447662
+13
+145.758594958837
+23
+-327.009759999997
+33
+1465.17488447662
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+145.758479852068
+20
+-327.009759999999
+30
+1659.96023452511
+11
+145.758594958837
+21
+-327.009759999997
+31
+1465.17488447662
+12
+161.958158566334
+22
+-327.009759999999
+32
+1629.65281041762
+13
+161.958158566334
+23
+-327.009759999999
+33
+1629.65281041762
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958158566334
+20
+-327.009759999999
+30
+1629.65281041762
+11
+145.758594958837
+21
+-327.009759999997
+31
+1465.17488447662
+12
+161.958237853255
+22
+-327.009759999997
+32
+1495.48232773022
+13
+161.958237853255
+23
+-327.009759999997
+33
+1495.48232773022
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+161.958158566334
+20
+-327.009759999999
+30
+1629.65281041762
+11
+161.958237853255
+21
+-327.009759999997
+31
+1495.48232773022
+12
+171.933879867937
+22
+-327.009759999998
+32
+1596.76733442913
+13
+171.933879867937
+23
+-327.009759999998
+33
+1596.76733442913
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+171.933879867937
+20
+-327.009759999998
+30
+1596.76733442913
+11
+161.958237853255
+21
+-327.009759999997
+31
+1495.48232773022
+12
+171.933920288059
+22
+-327.009759999998
+32
+1528.36781550882
+13
+171.933920288059
+23
+-327.009759999998
+33
+1528.36781550882
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+171.933879867937
+20
+-327.009759999998
+30
+1596.76733442913
+11
+171.933920288059
+21
+-327.009759999998
+31
+1528.36781550882
+12
+175.302282381706
+22
+-327.009759999998
+32
+1562.56757695949
+13
+175.302282381706
+23
+-327.009759999998
+33
+1562.56757695949
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933682422425
+20
+-327.00976
+30
+1528.36761230315
+11
+-171.933722842547
+21
+-327.009760000001
+31
+1596.76713122345
+12
+-175.302084936194
+22
+-327.009760000001
+32
+1562.56736977278
+13
+-175.302084936194
+23
+-327.009760000001
+33
+1562.56736977278
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-171.933722842547
+20
+-327.009760000001
+30
+1596.76713122345
+11
+-171.933682422425
+21
+-327.00976
+31
+1528.36761230315
+12
+-161.958040407743
+22
+-327.009760000001
+32
+1629.65261900206
+13
+-161.958040407743
+23
+-327.009760000001
+33
+1629.65261900206
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.958040407743
+20
+-327.009760000001
+30
+1629.65261900206
+11
+-171.933682422425
+21
+-327.00976
+31
+1528.36761230315
+12
+-161.957961120822
+22
+-327.00976
+32
+1495.48213631465
+13
+-161.957961120822
+23
+-327.00976
+33
+1495.48213631465
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-161.958040407743
+20
+-327.009760000001
+30
+1629.65261900206
+11
+-161.957961120822
+21
+-327.00976
+31
+1495.48213631465
+12
+-145.758397513325
+22
+-327.009760000002
+32
+1659.96006225566
+13
+-145.758397513325
+23
+-327.009760000002
+33
+1659.96006225566
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758397513325
+20
+-327.009760000002
+30
+1659.96006225566
+11
+-161.957961120822
+21
+-327.00976
+31
+1495.48213631465
+12
+-145.758282406557
+22
+-327.009759999999
+32
+1465.17471220716
+13
+-145.758282406557
+23
+-327.009759999999
+33
+1465.17471220716
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-145.758397513325
+20
+-327.009760000002
+30
+1659.96006225566
+11
+-145.758282406557
+21
+-327.009759999999
+31
+1465.17471220716
+12
+-123.957337350861
+22
+-327.009760000002
+32
+1686.52476293663
+13
+-123.957337350861
+23
+-327.009760000002
+33
+1686.52476293663
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957337350861
+20
+-327.009760000002
+30
+1686.52476293663
+11
+-145.758282406557
+21
+-327.009759999999
+31
+1465.17471220716
+12
+-123.957190847734
+22
+-327.009759999999
+32
+1438.61003729252
+13
+-123.957190847734
+23
+-327.009759999999
+33
+1438.61003729252
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-123.957337350861
+20
+-327.009760000002
+30
+1686.52476293663
+11
+-123.957190847734
+21
+-327.009759999999
+31
+1438.61003729252
+12
+-97.3926624362189
+22
+-327.009760000002
+32
+1708.32585449545
+13
+-97.3926624362189
+23
+-327.009760000002
+33
+1708.32585449545
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3926624362189
+20
+-327.009760000002
+30
+1708.32585449545
+11
+-123.957190847734
+21
+-327.009759999999
+31
+1438.61003729252
+12
+-97.3924901667657
+22
+-327.009759999998
+32
+1416.80897713006
+13
+-97.3924901667657
+23
+-327.009759999998
+33
+1416.80897713006
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3926624362189
+20
+-327.009760000002
+30
+1708.32585449545
+11
+-97.3924901667657
+21
+-327.009759999998
+31
+1416.80897713006
+12
+-85.0224388771913
+22
+-327.00976
+32
+1562.56737879036
+13
+-85.0224388771913
+23
+-327.00976
+33
+1562.56737879036
+70
+15
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3926624362189
+20
+-327.009760000002
+30
+1708.32585449545
+11
+-85.0224388771913
+21
+-327.00976
+31
+1562.56737879036
+12
+-83.3887731086213
+22
+-327.00976
+32
+1579.15445484661
+13
+-83.3887731086213
+23
+-327.00976
+33
+1579.15445484661
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-97.3926624362189
+20
+-327.009760000002
+30
+1708.32585449545
+11
+-83.3887731086213
+21
+-327.00976
+31
+1579.15445484661
+12
+-67.085238328727
+22
+-327.009760000002
+32
+1724.52553320972
+13
+-67.085238328727
+23
+-327.009760000002
+33
+1724.52553320972
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.085238328727
+20
+-327.009760000002
+30
+1724.52553320972
+11
+-83.3887731086213
+21
+-327.00976
+31
+1579.15445484661
+12
+-78.5505197605895
+22
+-327.00976
+32
+1595.10410250665
+13
+-78.5505197605895
+23
+-327.00976
+33
+1595.10410250665
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.085238328727
+20
+-327.009760000002
+30
+1724.52553320972
+11
+-78.5505197605895
+21
+-327.00976
+31
+1595.10410250665
+12
+-70.6936101959371
+22
+-327.00976
+32
+1609.80338575557
+13
+-70.6936101959371
+23
+-327.00976
+33
+1609.80338575557
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.085238328727
+20
+-327.009760000002
+30
+1724.52553320972
+11
+-70.6936101959371
+21
+-327.00976
+31
+1609.80338575557
+12
+-60.1199810430281
+22
+-327.009760000001
+32
+1622.68741938157
+13
+-60.1199810430281
+23
+-327.009760000001
+33
+1622.68741938157
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-67.085238328727
+20
+-327.009760000002
+30
+1724.52553320972
+11
+-60.1199810430281
+21
+-327.009760000001
+31
+1622.68741938157
+12
+-34.199762340237
+22
+-327.009760000002
+32
+1734.50125451132
+13
+-34.199762340237
+23
+-327.009760000002
+33
+1734.50125451132
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.199762340237
+20
+-327.009760000002
+30
+1734.50125451132
+11
+-60.1199810430281
+21
+-327.009760000001
+31
+1622.68741938157
+12
+-47.2359709404492
+22
+-327.009760000001
+32
+1633.26107719786
+13
+-47.2359709404492
+23
+-327.009760000001
+33
+1633.26107719786
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.199762340237
+20
+-327.009760000002
+30
+1734.50125451132
+11
+-47.2359709404492
+21
+-327.009760000001
+31
+1633.26107719786
+12
+-32.5367051710064
+22
+-327.009760000001
+32
+1641.11801946432
+13
+-32.5367051710064
+23
+-327.009760000001
+33
+1641.11801946432
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-34.199762340237
+20
+-327.009760000002
+30
+1734.50125451132
+11
+-32.5367051710064
+21
+-327.009760000001
+31
+1641.11801946432
+12
+-4.87059913788501e-06
+22
+-327.009760000001
+32
+1737.86965702509
+13
+-4.87059913788501e-06
+23
+-327.009760000001
+33
+1737.86965702509
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-4.87059913788501e-06
+20
+-327.009760000001
+30
+1737.86965702509
+11
+-32.5367051710064
+21
+-327.009760000001
+31
+1641.11801946432
+12
+-16.5870682747761
+22
+-327.00976
+32
+1645.95630829588
+13
+-16.5870682747761
+23
+-327.00976
+33
+1645.95630829588
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-4.87059913788501e-06
+20
+-327.009760000001
+30
+1737.86965702509
+11
+-16.5870682747761
+21
+-327.00976
+31
+1645.95630829588
+12
+4.14697891172322e-06
+22
+-327.00976
+32
+1647.59001096608
+13
+4.14697891172322e-06
+23
+-327.00976
+33
+1647.59001096608
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-4.87059913788501e-06
+20
+-327.009760000001
+30
+1737.86965702509
+11
+4.14697891172322e-06
+21
+-327.00976
+31
+1647.59001096608
+12
+34.1997565800732
+22
+-327.009760000001
+32
+1734.50129493144
+13
+34.1997565800732
+23
+-327.009760000001
+33
+1734.50129493144
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.1997565800732
+20
+-327.009760000001
+30
+1734.50129493144
+11
+4.14697891172322e-06
+21
+-327.00976
+31
+1647.59001096608
+12
+16.587080203228
+22
+-327.00976
+32
+1645.95634519751
+13
+16.587080203228
+23
+-327.00976
+33
+1645.95634519751
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.1997565800732
+20
+-327.009760000001
+30
+1734.50129493144
+11
+16.587080203228
+21
+-327.00976
+31
+1645.95634519751
+12
+32.5367278632689
+22
+-327.00976
+32
+1641.11809184948
+13
+32.5367278632689
+23
+-327.00976
+33
+1641.11809184948
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.1997565800732
+20
+-327.009760000001
+30
+1734.50129493144
+11
+32.5367278632689
+21
+-327.00976
+31
+1641.11809184948
+12
+47.2360111121917
+22
+-327.00976
+32
+1633.26118228483
+13
+47.2360111121917
+23
+-327.00976
+33
+1633.26118228483
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+34.1997565800732
+20
+-327.009760000001
+30
+1734.50129493144
+11
+47.2360111121917
+21
+-327.00976
+31
+1633.26118228483
+12
+67.0852443586779
+22
+-327.009760000001
+32
+1724.52561249664
+13
+67.0852443586779
+23
+-327.009760000001
+33
+1724.52561249664
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.0852443586779
+20
+-327.009760000001
+30
+1724.52561249664
+11
+47.2360111121917
+21
+-327.00976
+31
+1633.26118228483
+12
+60.1200447381933
+22
+-327.00976
+32
+1622.68755313192
+13
+60.1200447381933
+23
+-327.00976
+33
+1622.68755313192
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.0852443586779
+20
+-327.009760000001
+30
+1724.52561249664
+11
+60.1200447381933
+21
+-327.00976
+31
+1622.68755313192
+12
+70.6937025544759
+22
+-327.009759999999
+32
+1609.80354302934
+13
+70.6937025544759
+23
+-327.009759999999
+33
+1609.80354302934
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+67.0852443586779
+20
+-327.009760000001
+30
+1724.52561249664
+11
+70.6937025544759
+21
+-327.009759999999
+31
+1609.80354302934
+12
+97.3926876122771
+22
+-327.00976
+32
+1708.32596960222
+13
+97.3926876122771
+23
+-327.00976
+33
+1708.32596960222
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3926876122771
+20
+-327.00976
+30
+1708.32596960222
+11
+70.6937025544759
+21
+-327.009759999999
+31
+1609.80354302934
+12
+78.5506448209352
+22
+-327.009759999999
+32
+1595.1042772599
+13
+78.5506448209352
+23
+-327.009759999999
+33
+1595.1042772599
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3926876122771
+20
+-327.00976
+30
+1708.32596960222
+11
+78.5506448209352
+21
+-327.009759999999
+31
+1595.1042772599
+12
+83.3889336524952
+22
+-327.009759999999
+32
+1579.15464036367
+13
+83.3889336524952
+23
+-327.009759999999
+33
+1579.15464036367
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+97.3926876122771
+20
+-327.00976
+30
+1708.32596960222
+11
+83.3889336524952
+21
+-327.009759999999
+31
+1579.15464036367
+12
+85.0226363227028
+22
+-327.009759999999
+32
+1562.56756794191
+13
+85.0226363227028
+23
+-327.009759999999
+33
+1562.56756794191
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086226
+20
+-165.547039999999
+30
+1579.15445484661
+11
+-83.388736206985
+21
+-165.547039999999
+31
+1545.98030636861
+12
+-85.0224388771926
+22
+-165.547039999999
+32
+1562.56737879036
+13
+-85.0224388771926
+23
+-165.547039999999
+33
+1562.56737879036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.388736206985
+20
+-165.547039999999
+30
+1545.98030636861
+11
+-83.3887731086226
+21
+-165.547039999999
+31
+1579.15445484661
+12
+-78.5505197605908
+22
+-165.547039999999
+32
+1595.10410250665
+13
+-78.5505197605908
+23
+-165.547039999999
+33
+1595.10410250665
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.388736206985
+20
+-165.547039999999
+30
+1545.98030636861
+11
+-78.5505197605908
+21
+-165.547039999999
+31
+1595.10410250665
+12
+-78.550447375425
+22
+-165.547039999999
+32
+1530.03066947238
+13
+-78.550447375425
+23
+-165.547039999999
+33
+1530.03066947238
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.550447375425
+20
+-165.547039999999
+30
+1530.03066947238
+11
+-78.5505197605908
+21
+-165.547039999999
+31
+1595.10410250665
+12
+-70.6936101959384
+22
+-165.54704
+32
+1609.80338575558
+13
+-70.6936101959384
+23
+-165.54704
+33
+1609.80338575558
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.550447375425
+20
+-165.547039999999
+30
+1530.03066947238
+11
+-70.6936101959384
+21
+-165.54704
+31
+1609.80338575558
+12
+-70.6935051089657
+22
+-165.547039999998
+32
+1515.33140370293
+13
+-70.6935051089657
+23
+-165.547039999998
+33
+1515.33140370293
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6935051089657
+20
+-165.547039999998
+30
+1515.33140370293
+11
+-70.6936101959384
+21
+-165.54704
+31
+1609.80338575558
+12
+-60.1199810430294
+22
+-165.54704
+32
+1622.68741938158
+13
+-60.1199810430294
+23
+-165.54704
+33
+1622.68741938158
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6935051089657
+20
+-165.547039999998
+30
+1515.33140370293
+11
+-60.1199810430294
+21
+-165.54704
+31
+1622.68741938158
+12
+-60.1198472926832
+22
+-165.547039999998
+32
+1502.44739360036
+13
+-60.1198472926832
+23
+-165.547039999998
+33
+1502.44739360036
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926832
+20
+-165.547039999998
+30
+1502.44739360036
+11
+-60.1199810430294
+21
+-165.54704
+31
+1622.68741938158
+12
+-47.2359709404505
+22
+-165.54704
+32
+1633.26107719786
+13
+-47.2359709404505
+23
+-165.54704
+33
+1633.26107719786
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926832
+20
+-165.547039999998
+30
+1502.44739360036
+11
+-47.2359709404505
+21
+-165.54704
+31
+1633.26107719786
+12
+-47.2358136666815
+22
+-165.547039999998
+32
+1491.87376444745
+13
+-47.2358136666815
+23
+-165.547039999998
+33
+1491.87376444745
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2358136666815
+20
+-165.547039999998
+30
+1491.87376444745
+11
+-47.2359709404505
+21
+-165.54704
+31
+1633.26107719786
+12
+-32.5367051710077
+22
+-165.54704
+32
+1641.11801946432
+13
+-32.5367051710077
+23
+-165.54704
+33
+1641.11801946432
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2358136666815
+20
+-165.547039999998
+30
+1491.87376444745
+11
+-32.5367051710077
+21
+-165.54704
+31
+1641.11801946432
+12
+-32.5365304177587
+22
+-165.547039999998
+32
+1484.01685488279
+13
+-32.5365304177587
+23
+-165.547039999998
+33
+1484.01685488279
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177587
+20
+-165.547039999998
+30
+1484.01685488279
+11
+-32.5367051710077
+21
+-165.54704
+31
+1641.11801946432
+12
+-16.5870682747773
+22
+-165.54704
+32
+1645.95630829588
+13
+-16.5870682747773
+23
+-165.54704
+33
+1645.95630829588
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177587
+20
+-165.547039999998
+30
+1484.01685488279
+11
+-16.5870682747773
+21
+-165.54704
+31
+1645.95630829588
+12
+-16.5868827577177
+22
+-165.547039999997
+32
+1479.17860153476
+13
+-16.5868827577177
+23
+-165.547039999997
+33
+1479.17860153476
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5868827577177
+20
+-165.547039999997
+30
+1479.17860153476
+11
+-16.5870682747773
+21
+-165.54704
+31
+1645.95630829588
+12
+4.14697766952798e-06
+22
+-165.547039999999
+32
+1647.59001096608
+13
+4.14697766952798e-06
+23
+-165.547039999999
+33
+1647.59001096608
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5868827577177
+20
+-165.547039999997
+30
+1479.17860153476
+11
+4.14697766952798e-06
+21
+-165.547039999999
+31
+1647.59001096608
+12
+0.000193298531324959
+22
+-165.547039999997
+32
+1477.54493576619
+13
+0.000193298531324959
+23
+-165.547039999997
+33
+1477.54493576619
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000193298531324959
+20
+-165.547039999997
+30
+1477.54493576619
+11
+4.14697766952798e-06
+21
+-165.547039999999
+31
+1647.59001096608
+12
+16.5870802032267
+22
+-165.547039999999
+32
+1645.95634519751
+13
+16.5870802032267
+23
+-165.547039999999
+33
+1645.95634519751
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000193298531324959
+20
+-165.547039999997
+30
+1477.54493576619
+11
+16.5870802032267
+21
+-165.547039999999
+31
+1645.95634519751
+12
+16.5872657202864
+22
+-165.547039999997
+32
+1479.1786384364
+13
+16.5872657202864
+23
+-165.547039999997
+33
+1479.1786384364
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202864
+20
+-165.547039999997
+30
+1479.1786384364
+11
+16.5870802032267
+21
+-165.547039999999
+31
+1645.95634519751
+12
+32.5367278632676
+22
+-165.547039999999
+32
+1641.11809184948
+13
+32.5367278632676
+23
+-165.547039999999
+33
+1641.11809184948
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202864
+20
+-165.547039999997
+30
+1479.1786384364
+11
+32.5367278632676
+21
+-165.547039999999
+31
+1641.11809184948
+12
+32.5369026165166
+22
+-165.547039999997
+32
+1484.01692726796
+13
+32.5369026165166
+23
+-165.547039999997
+33
+1484.01692726796
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5369026165166
+20
+-165.547039999997
+30
+1484.01692726796
+11
+32.5367278632676
+21
+-165.547039999999
+31
+1641.11809184948
+12
+47.2360111121904
+22
+-165.547039999999
+32
+1633.26118228483
+13
+47.2360111121904
+23
+-165.547039999999
+33
+1633.26118228483
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5369026165166
+20
+-165.547039999997
+30
+1484.01692726796
+11
+47.2360111121904
+21
+-165.547039999999
+31
+1633.26118228483
+12
+47.2361683859594
+22
+-165.547039999997
+32
+1491.87386953442
+13
+47.2361683859594
+23
+-165.547039999997
+33
+1491.87386953442
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859594
+20
+-165.547039999997
+30
+1491.87386953442
+11
+47.2360111121904
+21
+-165.547039999999
+31
+1633.26118228483
+12
+60.1200447381921
+22
+-165.547039999999
+32
+1622.68755313192
+13
+60.1200447381921
+23
+-165.547039999999
+33
+1622.68755313192
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859594
+20
+-165.547039999997
+30
+1491.87386953442
+11
+60.1200447381921
+21
+-165.547039999999
+31
+1622.68755313192
+12
+60.1201784885383
+22
+-165.547039999997
+32
+1502.4475273507
+13
+60.1201784885383
+23
+-165.547039999997
+33
+1502.4475273507
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1201784885383
+20
+-165.547039999997
+30
+1502.4475273507
+11
+60.1200447381921
+21
+-165.547039999999
+31
+1622.68755313192
+12
+70.6937025544746
+22
+-165.547039999998
+32
+1609.80354302934
+13
+70.6937025544746
+23
+-165.547039999998
+33
+1609.80354302934
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1201784885383
+20
+-165.547039999997
+30
+1502.4475273507
+11
+70.6937025544746
+21
+-165.547039999998
+31
+1609.80354302934
+12
+70.6938076414473
+22
+-165.547039999997
+32
+1515.3315609767
+13
+70.6938076414473
+23
+-165.547039999997
+33
+1515.3315609767
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414473
+20
+-165.547039999997
+30
+1515.3315609767
+11
+70.6937025544746
+21
+-165.547039999998
+31
+1609.80354302934
+12
+78.5506448209339
+22
+-165.547039999998
+32
+1595.1042772599
+13
+78.5506448209339
+23
+-165.547039999998
+33
+1595.1042772599
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414473
+20
+-165.547039999997
+30
+1515.3315609767
+11
+78.5506448209339
+21
+-165.547039999998
+31
+1595.1042772599
+12
+78.5507172060997
+22
+-165.547039999997
+32
+1530.03084422563
+13
+78.5507172060997
+23
+-165.547039999997
+33
+1530.03084422563
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5507172060997
+20
+-165.547039999997
+30
+1530.03084422563
+11
+78.5506448209339
+21
+-165.547039999998
+31
+1595.1042772599
+12
+83.3889336524939
+22
+-165.547039999998
+32
+1579.15464036367
+13
+83.3889336524939
+23
+-165.547039999998
+33
+1579.15464036367
+70
+13
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5507172060997
+20
+-165.547039999997
+30
+1530.03084422563
+11
+83.3889336524939
+21
+-165.547039999998
+31
+1579.15464036367
+12
+83.3889705541315
+22
+-165.547039999997
+32
+1545.98049188567
+13
+83.3889705541315
+23
+-165.547039999997
+33
+1545.98049188567
+70
+3
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889705541315
+20
+-165.547039999997
+30
+1545.98049188567
+11
+83.3889336524939
+21
+-165.547039999998
+31
+1579.15464036367
+12
+85.0226363227015
+22
+-165.547039999998
+32
+1562.56756794192
+13
+85.0226363227015
+23
+-165.547039999998
+33
+1562.56756794192
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000193298531099362
+20
+-140.147039999997
+30
+1477.54493576619
+11
+16.5872657202864
+21
+-165.547039999997
+31
+1479.1786384364
+12
+16.5872657202861
+22
+-140.147039999997
+32
+1479.1786384364
+13
+16.5872657202861
+23
+-140.147039999997
+33
+1479.1786384364
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202864
+20
+-165.547039999997
+30
+1479.1786384364
+11
+0.000193298531099362
+21
+-140.147039999997
+31
+1477.54493576619
+12
+0.000193298531324959
+22
+-165.547039999997
+32
+1477.54493576619
+13
+0.000193298531324959
+23
+-165.547039999997
+33
+1477.54493576619
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202861
+20
+-140.147039999997
+30
+1479.1786384364
+11
+32.5369026165166
+21
+-165.547039999997
+31
+1484.01692726796
+12
+32.5369026165164
+22
+-140.147039999997
+32
+1484.01692726796
+13
+32.5369026165164
+23
+-140.147039999997
+33
+1484.01692726796
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5369026165166
+20
+-165.547039999997
+30
+1484.01692726796
+11
+16.5872657202861
+21
+-140.147039999997
+31
+1479.1786384364
+12
+16.5872657202864
+22
+-165.547039999997
+32
+1479.1786384364
+13
+16.5872657202864
+23
+-165.547039999997
+33
+1479.1786384364
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5369026165166
+20
+-165.547039999997
+30
+1484.01692726796
+11
+47.2361683859592
+21
+-140.147039999997
+31
+1491.87386953442
+12
+32.5369026165164
+22
+-140.147039999997
+32
+1484.01692726796
+13
+32.5369026165164
+23
+-140.147039999997
+33
+1484.01692726796
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859592
+20
+-140.147039999997
+30
+1491.87386953442
+11
+32.5369026165166
+21
+-165.547039999997
+31
+1484.01692726796
+12
+47.2361683859594
+22
+-165.547039999997
+32
+1491.87386953442
+13
+47.2361683859594
+23
+-165.547039999997
+33
+1491.87386953442
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5507172060997
+20
+-165.547039999997
+30
+1530.03084422563
+11
+83.3889705541313
+21
+-140.147039999997
+31
+1545.98049188567
+12
+78.5507172060996
+22
+-140.147039999997
+32
+1530.03084422563
+13
+78.5507172060996
+23
+-140.147039999997
+33
+1530.03084422563
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889705541313
+20
+-140.147039999997
+30
+1545.98049188567
+11
+78.5507172060997
+21
+-165.547039999997
+31
+1530.03084422563
+12
+83.3889705541315
+22
+-165.547039999997
+32
+1545.98049188567
+13
+83.3889705541315
+23
+-165.547039999997
+33
+1545.98049188567
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889705541315
+20
+-165.547039999997
+30
+1545.98049188567
+11
+85.0226363227013
+21
+-140.147039999998
+31
+1562.56756794192
+12
+83.3889705541313
+22
+-140.147039999997
+32
+1545.98049188567
+13
+83.3889705541313
+23
+-140.147039999997
+33
+1545.98049188567
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+85.0226363227013
+20
+-140.147039999998
+30
+1562.56756794192
+11
+83.3889705541315
+21
+-165.547039999997
+31
+1545.98049188567
+12
+85.0226363227015
+22
+-165.547039999998
+32
+1562.56756794192
+13
+85.0226363227015
+23
+-165.547039999998
+33
+1562.56756794192
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+85.0226363227015
+20
+-165.547039999998
+30
+1562.56756794192
+11
+83.3889336524938
+21
+-140.147039999998
+31
+1579.15464036367
+12
+85.0226363227013
+22
+-140.147039999998
+32
+1562.56756794192
+13
+85.0226363227013
+23
+-140.147039999998
+33
+1562.56756794192
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889336524938
+20
+-140.147039999998
+30
+1579.15464036367
+11
+85.0226363227015
+21
+-165.547039999998
+31
+1562.56756794192
+12
+83.3889336524939
+22
+-165.547039999998
+32
+1579.15464036367
+13
+83.3889336524939
+23
+-165.547039999998
+33
+1579.15464036367
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889336524939
+20
+-165.547039999998
+30
+1579.15464036367
+11
+78.5506448209338
+21
+-140.147039999998
+31
+1595.1042772599
+12
+83.3889336524938
+22
+-140.147039999998
+32
+1579.15464036367
+13
+83.3889336524938
+23
+-140.147039999998
+33
+1579.15464036367
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5506448209338
+20
+-140.147039999998
+30
+1595.1042772599
+11
+83.3889336524939
+21
+-165.547039999998
+31
+1579.15464036367
+12
+78.5506448209339
+22
+-165.547039999998
+32
+1595.1042772599
+13
+78.5506448209339
+23
+-165.547039999998
+33
+1595.1042772599
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5506448209339
+20
+-165.547039999998
+30
+1595.1042772599
+11
+70.6937025544744
+21
+-140.147039999998
+31
+1609.80354302934
+12
+78.5506448209338
+22
+-140.147039999998
+32
+1595.1042772599
+13
+78.5506448209338
+23
+-140.147039999998
+33
+1595.1042772599
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544744
+20
+-140.147039999998
+30
+1609.80354302934
+11
+78.5506448209339
+21
+-165.547039999998
+31
+1595.1042772599
+12
+70.6937025544746
+22
+-165.547039999998
+32
+1609.80354302934
+13
+70.6937025544746
+23
+-165.547039999998
+33
+1609.80354302934
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544746
+20
+-165.547039999998
+30
+1609.80354302934
+11
+60.1200447381919
+21
+-140.147039999999
+31
+1622.68755313192
+12
+70.6937025544744
+22
+-140.147039999998
+32
+1609.80354302934
+13
+70.6937025544744
+23
+-140.147039999998
+33
+1609.80354302934
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1200447381919
+20
+-140.147039999999
+30
+1622.68755313192
+11
+70.6937025544746
+21
+-165.547039999998
+31
+1609.80354302934
+12
+60.1200447381921
+22
+-165.547039999999
+32
+1622.68755313192
+13
+60.1200447381921
+23
+-165.547039999999
+33
+1622.68755313192
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1200447381921
+20
+-165.547039999999
+30
+1622.68755313192
+11
+47.2360111121902
+21
+-140.147039999999
+31
+1633.26118228483
+12
+60.1200447381919
+22
+-140.147039999999
+32
+1622.68755313192
+13
+60.1200447381919
+23
+-140.147039999999
+33
+1622.68755313192
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121902
+20
+-140.147039999999
+30
+1633.26118228483
+11
+60.1200447381921
+21
+-165.547039999999
+31
+1622.68755313192
+12
+47.2360111121904
+22
+-165.547039999999
+32
+1633.26118228483
+13
+47.2360111121904
+23
+-165.547039999999
+33
+1633.26118228483
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121904
+20
+-165.547039999999
+30
+1633.26118228483
+11
+32.5367278632675
+21
+-140.147039999999
+31
+1641.11809184948
+12
+47.2360111121902
+22
+-140.147039999999
+32
+1633.26118228483
+13
+47.2360111121902
+23
+-140.147039999999
+33
+1633.26118228483
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632675
+20
+-140.147039999999
+30
+1641.11809184948
+11
+47.2360111121904
+21
+-165.547039999999
+31
+1633.26118228483
+12
+32.5367278632676
+22
+-165.547039999999
+32
+1641.11809184948
+13
+32.5367278632676
+23
+-165.547039999999
+33
+1641.11809184948
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632676
+20
+-165.547039999999
+30
+1641.11809184948
+11
+16.5870802032265
+21
+-140.147039999999
+31
+1645.95634519751
+12
+32.5367278632675
+22
+-140.147039999999
+32
+1641.11809184948
+13
+32.5367278632675
+23
+-140.147039999999
+33
+1641.11809184948
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032265
+20
+-140.147039999999
+30
+1645.95634519751
+11
+32.5367278632676
+21
+-165.547039999999
+31
+1641.11809184948
+12
+16.5870802032267
+22
+-165.547039999999
+32
+1645.95634519751
+13
+16.5870802032267
+23
+-165.547039999999
+33
+1645.95634519751
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032267
+20
+-165.547039999999
+30
+1645.95634519751
+11
+4.14697744393067e-06
+21
+-140.147039999999
+31
+1647.59001096608
+12
+16.5870802032265
+22
+-140.147039999999
+32
+1645.95634519751
+13
+16.5870802032265
+23
+-140.147039999999
+33
+1645.95634519751
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697744393067e-06
+20
+-140.147039999999
+30
+1647.59001096608
+11
+16.5870802032267
+21
+-165.547039999999
+31
+1645.95634519751
+12
+4.14697766952798e-06
+22
+-165.547039999999
+32
+1647.59001096608
+13
+4.14697766952798e-06
+23
+-165.547039999999
+33
+1647.59001096608
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697766952798e-06
+20
+-165.547039999999
+30
+1647.59001096608
+11
+-16.5870682747775
+21
+-140.14704
+31
+1645.95630829588
+12
+4.14697744393067e-06
+22
+-140.147039999999
+32
+1647.59001096608
+13
+4.14697744393067e-06
+23
+-140.147039999999
+33
+1647.59001096608
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747775
+20
+-140.14704
+30
+1645.95630829588
+11
+4.14697766952798e-06
+21
+-165.547039999999
+31
+1647.59001096608
+12
+-16.5870682747773
+22
+-165.54704
+32
+1645.95630829588
+13
+-16.5870682747773
+23
+-165.54704
+33
+1645.95630829588
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747773
+20
+-165.54704
+30
+1645.95630829588
+11
+-32.5367051710078
+21
+-140.14704
+31
+1641.11801946432
+12
+-16.5870682747775
+22
+-140.14704
+32
+1645.95630829588
+13
+-16.5870682747775
+23
+-140.14704
+33
+1645.95630829588
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710078
+20
+-140.14704
+30
+1641.11801946432
+11
+-16.5870682747773
+21
+-165.54704
+31
+1645.95630829588
+12
+-32.5367051710077
+22
+-165.54704
+32
+1641.11801946432
+13
+-32.5367051710077
+23
+-165.54704
+33
+1641.11801946432
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710077
+20
+-165.54704
+30
+1641.11801946432
+11
+-47.2359709404507
+21
+-140.14704
+31
+1633.26107719786
+12
+-32.5367051710078
+22
+-140.14704
+32
+1641.11801946432
+13
+-32.5367051710078
+23
+-140.14704
+33
+1641.11801946432
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2359709404507
+20
+-140.14704
+30
+1633.26107719786
+11
+-32.5367051710077
+21
+-165.54704
+31
+1641.11801946432
+12
+-47.2359709404505
+22
+-165.54704
+32
+1633.26107719786
+13
+-47.2359709404505
+23
+-165.54704
+33
+1633.26107719786
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2359709404505
+20
+-165.54704
+30
+1633.26107719786
+11
+-60.1199810430296
+21
+-140.14704
+31
+1622.68741938158
+12
+-47.2359709404507
+22
+-140.14704
+32
+1633.26107719786
+13
+-47.2359709404507
+23
+-140.14704
+33
+1633.26107719786
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430296
+20
+-140.14704
+30
+1622.68741938158
+11
+-47.2359709404505
+21
+-165.54704
+31
+1633.26107719786
+12
+-60.1199810430294
+22
+-165.54704
+32
+1622.68741938158
+13
+-60.1199810430294
+23
+-165.54704
+33
+1622.68741938158
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430296
+20
+-140.14704
+30
+1622.68741938158
+11
+-70.6936101959384
+21
+-165.54704
+31
+1609.80338575558
+12
+-70.6936101959386
+22
+-140.14704
+32
+1609.80338575557
+13
+-70.6936101959386
+23
+-140.14704
+33
+1609.80338575557
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6936101959384
+20
+-165.54704
+30
+1609.80338575558
+11
+-60.1199810430296
+21
+-140.14704
+31
+1622.68741938158
+12
+-60.1199810430294
+22
+-165.54704
+32
+1622.68741938158
+13
+-60.1199810430294
+23
+-165.54704
+33
+1622.68741938158
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6936101959386
+20
+-140.14704
+30
+1609.80338575557
+11
+-78.5505197605908
+21
+-165.547039999999
+31
+1595.10410250665
+12
+-78.5505197605909
+22
+-140.147039999999
+32
+1595.10410250665
+13
+-78.5505197605909
+23
+-140.147039999999
+33
+1595.10410250665
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5505197605908
+20
+-165.547039999999
+30
+1595.10410250665
+11
+-70.6936101959386
+21
+-140.14704
+31
+1609.80338575557
+12
+-70.6936101959384
+22
+-165.54704
+32
+1609.80338575558
+13
+-70.6936101959384
+23
+-165.54704
+33
+1609.80338575558
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5505197605909
+20
+-140.147039999999
+30
+1595.10410250665
+11
+-83.3887731086226
+21
+-165.547039999999
+31
+1579.15445484661
+12
+-83.3887731086227
+22
+-140.147039999999
+32
+1579.15445484661
+13
+-83.3887731086227
+23
+-140.147039999999
+33
+1579.15445484661
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086226
+20
+-165.547039999999
+30
+1579.15445484661
+11
+-78.5505197605909
+21
+-140.147039999999
+31
+1595.10410250665
+12
+-78.5505197605908
+22
+-165.547039999999
+32
+1595.10410250665
+13
+-78.5505197605908
+23
+-165.547039999999
+33
+1595.10410250665
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086227
+20
+-140.147039999999
+30
+1579.15445484661
+11
+-85.0224388771926
+21
+-165.547039999999
+31
+1562.56737879036
+12
+-85.0224388771927
+22
+-140.147039999999
+32
+1562.56737879036
+13
+-85.0224388771927
+23
+-140.147039999999
+33
+1562.56737879036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-85.0224388771926
+20
+-165.547039999999
+30
+1562.56737879036
+11
+-83.3887731086227
+21
+-140.147039999999
+31
+1579.15445484661
+12
+-83.3887731086226
+22
+-165.547039999999
+32
+1579.15445484661
+13
+-83.3887731086226
+23
+-165.547039999999
+33
+1579.15445484661
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-85.0224388771927
+20
+-140.147039999999
+30
+1562.56737879036
+11
+-83.388736206985
+21
+-165.547039999999
+31
+1545.98030636861
+12
+-83.3887362069852
+22
+-140.147039999999
+32
+1545.98030636861
+13
+-83.3887362069852
+23
+-140.147039999999
+33
+1545.98030636861
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.388736206985
+20
+-165.547039999999
+30
+1545.98030636861
+11
+-85.0224388771927
+21
+-140.147039999999
+31
+1562.56737879036
+12
+-85.0224388771926
+22
+-165.547039999999
+32
+1562.56737879036
+13
+-85.0224388771926
+23
+-165.547039999999
+33
+1562.56737879036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887362069852
+20
+-140.147039999999
+30
+1545.98030636861
+11
+-78.550447375425
+21
+-165.547039999999
+31
+1530.03066947238
+12
+-78.5504473754252
+22
+-140.147039999999
+32
+1530.03066947238
+13
+-78.5504473754252
+23
+-140.147039999999
+33
+1530.03066947238
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.550447375425
+20
+-165.547039999999
+30
+1530.03066947238
+11
+-83.3887362069852
+21
+-140.147039999999
+31
+1545.98030636861
+12
+-83.388736206985
+22
+-165.547039999999
+32
+1545.98030636861
+13
+-83.388736206985
+23
+-165.547039999999
+33
+1545.98030636861
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5504473754252
+20
+-140.147039999999
+30
+1530.03066947238
+11
+-70.6935051089657
+21
+-165.547039999998
+31
+1515.33140370293
+12
+-70.6935051089658
+22
+-140.147039999998
+32
+1515.33140370293
+13
+-70.6935051089658
+23
+-140.147039999998
+33
+1515.33140370293
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6935051089657
+20
+-165.547039999998
+30
+1515.33140370293
+11
+-78.5504473754252
+21
+-140.147039999999
+31
+1530.03066947238
+12
+-78.550447375425
+22
+-165.547039999999
+32
+1530.03066947238
+13
+-78.550447375425
+23
+-165.547039999999
+33
+1530.03066947238
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6935051089658
+20
+-140.147039999998
+30
+1515.33140370293
+11
+-60.1198472926832
+21
+-165.547039999998
+31
+1502.44739360036
+12
+-60.1198472926833
+22
+-140.147039999998
+32
+1502.44739360036
+13
+-60.1198472926833
+23
+-140.147039999998
+33
+1502.44739360036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926832
+20
+-165.547039999998
+30
+1502.44739360036
+11
+-70.6935051089658
+21
+-140.147039999998
+31
+1515.33140370293
+12
+-70.6935051089657
+22
+-165.547039999998
+32
+1515.33140370293
+13
+-70.6935051089657
+23
+-165.547039999998
+33
+1515.33140370293
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926833
+20
+-140.147039999998
+30
+1502.44739360036
+11
+-47.2358136666815
+21
+-165.547039999998
+31
+1491.87376444745
+12
+-47.2358136666817
+22
+-140.147039999998
+32
+1491.87376444745
+13
+-47.2358136666817
+23
+-140.147039999998
+33
+1491.87376444745
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2358136666815
+20
+-165.547039999998
+30
+1491.87376444745
+11
+-60.1198472926833
+21
+-140.147039999998
+31
+1502.44739360036
+12
+-60.1198472926832
+22
+-165.547039999998
+32
+1502.44739360036
+13
+-60.1198472926832
+23
+-165.547039999998
+33
+1502.44739360036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2358136666817
+20
+-140.147039999998
+30
+1491.87376444745
+11
+-32.5365304177587
+21
+-165.547039999998
+31
+1484.01685488279
+12
+-32.5365304177589
+22
+-140.147039999998
+32
+1484.01685488279
+13
+-32.5365304177589
+23
+-140.147039999998
+33
+1484.01685488279
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177587
+20
+-165.547039999998
+30
+1484.01685488279
+11
+-47.2358136666817
+21
+-140.147039999998
+31
+1491.87376444745
+12
+-47.2358136666815
+22
+-165.547039999998
+32
+1491.87376444745
+13
+-47.2358136666815
+23
+-165.547039999998
+33
+1491.87376444745
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177589
+20
+-140.147039999998
+30
+1484.01685488279
+11
+-16.5868827577177
+21
+-165.547039999997
+31
+1479.17860153476
+12
+-16.586882757718
+22
+-140.147039999997
+32
+1479.17860153476
+13
+-16.586882757718
+23
+-140.147039999997
+33
+1479.17860153476
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5868827577177
+20
+-165.547039999997
+30
+1479.17860153476
+11
+-32.5365304177589
+21
+-140.147039999998
+31
+1484.01685488279
+12
+-32.5365304177587
+22
+-165.547039999998
+32
+1484.01685488279
+13
+-32.5365304177587
+23
+-165.547039999998
+33
+1484.01685488279
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.586882757718
+20
+-140.147039999997
+30
+1479.17860153476
+11
+0.000193298531324959
+21
+-165.547039999997
+31
+1477.54493576619
+12
+0.000193298531099362
+22
+-140.147039999997
+32
+1477.54493576619
+13
+0.000193298531099362
+23
+-140.147039999997
+33
+1477.54493576619
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000193298531324959
+20
+-165.547039999997
+30
+1477.54493576619
+11
+-16.586882757718
+21
+-140.147039999997
+31
+1479.17860153476
+12
+-16.5868827577177
+22
+-165.547039999997
+32
+1479.17860153476
+13
+-16.5868827577177
+23
+-165.547039999997
+33
+1479.17860153476
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6936101959373
+20
+-301.60976
+30
+1609.80338575557
+11
+-78.5505197605895
+21
+-327.00976
+31
+1595.10410250665
+12
+-78.5505197605897
+22
+-301.60976
+32
+1595.10410250665
+13
+-78.5505197605897
+23
+-301.60976
+33
+1595.10410250665
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5505197605895
+20
+-327.00976
+30
+1595.10410250665
+11
+-70.6936101959373
+21
+-301.60976
+31
+1609.80338575557
+12
+-70.6936101959371
+22
+-327.00976
+32
+1609.80338575557
+13
+-70.6936101959371
+23
+-327.00976
+33
+1609.80338575557
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.587080203228
+20
+-327.00976
+30
+1645.95634519751
+11
+4.14697870727565e-06
+21
+-301.60976
+31
+1647.59001096608
+12
+16.5870802032278
+22
+-301.60976
+32
+1645.95634519751
+13
+16.5870802032278
+23
+-301.60976
+33
+1645.95634519751
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697870727565e-06
+20
+-301.60976
+30
+1647.59001096608
+11
+16.587080203228
+21
+-327.00976
+31
+1645.95634519751
+12
+4.14697891172322e-06
+22
+-327.00976
+32
+1647.59001096608
+13
+4.14697891172322e-06
+23
+-327.00976
+33
+1647.59001096608
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747761
+20
+-327.00976
+30
+1645.95630829588
+11
+-32.5367051710066
+21
+-301.609760000001
+31
+1641.11801946432
+12
+-16.5870682747763
+22
+-301.60976
+32
+1645.95630829588
+13
+-16.5870682747763
+23
+-301.60976
+33
+1645.95630829588
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5367051710066
+20
+-301.609760000001
+30
+1641.11801946432
+11
+-16.5870682747761
+21
+-327.00976
+31
+1645.95630829588
+12
+-32.5367051710064
+22
+-327.009760000001
+32
+1641.11801946432
+13
+-32.5367051710064
+23
+-327.009760000001
+33
+1641.11801946432
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.14697891172322e-06
+20
+-327.00976
+30
+1647.59001096608
+11
+-16.5870682747763
+21
+-301.60976
+31
+1645.95630829588
+12
+4.14697870727565e-06
+22
+-301.60976
+32
+1647.59001096608
+13
+4.14697870727565e-06
+23
+-301.60976
+33
+1647.59001096608
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5870682747763
+20
+-301.60976
+30
+1645.95630829588
+11
+4.14697891172322e-06
+21
+-327.00976
+31
+1647.59001096608
+12
+-16.5870682747761
+22
+-327.00976
+32
+1645.95630829588
+13
+-16.5870682747761
+23
+-327.00976
+33
+1645.95630829588
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2358136666804
+20
+-301.609759999999
+30
+1491.87376444745
+11
+-32.5365304177574
+21
+-327.009759999999
+31
+1484.01685488279
+12
+-32.5365304177576
+22
+-301.609759999999
+32
+1484.01685488279
+13
+-32.5365304177576
+23
+-301.609759999999
+33
+1484.01685488279
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177574
+20
+-327.009759999999
+30
+1484.01685488279
+11
+-47.2358136666804
+21
+-301.609759999999
+31
+1491.87376444745
+12
+-47.2358136666802
+22
+-327.009759999999
+32
+1491.87376444745
+13
+-47.2358136666802
+23
+-327.009759999999
+33
+1491.87376444745
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-78.5504473754239
+20
+-301.60976
+30
+1530.03066947238
+11
+-70.6935051089644
+21
+-327.009759999999
+31
+1515.33140370293
+12
+-70.6935051089646
+22
+-301.609759999999
+32
+1515.33140370293
+13
+-70.6935051089646
+23
+-301.609759999999
+33
+1515.33140370293
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6935051089644
+20
+-327.009759999999
+30
+1515.33140370293
+11
+-78.5504473754239
+21
+-301.60976
+31
+1530.03066947238
+12
+-78.5504473754237
+22
+-327.00976
+32
+1530.03066947238
+13
+-78.5504473754237
+23
+-327.00976
+33
+1530.03066947238
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1199810430283
+20
+-301.609760000001
+30
+1622.68741938157
+11
+-70.6936101959371
+21
+-327.00976
+31
+1609.80338575557
+12
+-70.6936101959373
+22
+-301.60976
+32
+1609.80338575557
+13
+-70.6936101959373
+23
+-301.60976
+33
+1609.80338575557
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-70.6936101959371
+20
+-327.00976
+30
+1609.80338575557
+11
+-60.1199810430283
+21
+-301.609760000001
+31
+1622.68741938157
+12
+-60.1199810430281
+22
+-327.009760000001
+32
+1622.68741938157
+13
+-60.1199810430281
+23
+-327.009760000001
+33
+1622.68741938157
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-32.5365304177576
+20
+-301.609759999999
+30
+1484.01685488279
+11
+-16.5868827577165
+21
+-327.009759999998
+31
+1479.17860153476
+12
+-16.5868827577167
+22
+-301.609759999998
+32
+1479.17860153476
+13
+-16.5868827577167
+23
+-301.609759999998
+33
+1479.17860153476
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5868827577165
+20
+-327.009759999998
+30
+1479.17860153476
+11
+-32.5365304177576
+21
+-301.609759999999
+31
+1484.01685488279
+12
+-32.5365304177574
+22
+-327.009759999999
+32
+1484.01685488279
+13
+-32.5365304177574
+23
+-327.009759999999
+33
+1484.01685488279
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-60.1198472926821
+20
+-301.609759999999
+30
+1502.44739360035
+11
+-47.2358136666802
+21
+-327.009759999999
+31
+1491.87376444745
+12
+-47.2358136666804
+22
+-301.609759999999
+32
+1491.87376444745
+13
+-47.2358136666804
+23
+-301.609759999999
+33
+1491.87376444745
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-47.2358136666802
+20
+-327.009759999999
+30
+1491.87376444745
+11
+-60.1198472926821
+21
+-301.609759999999
+31
+1502.44739360035
+12
+-60.1198472926819
+22
+-327.009759999999
+32
+1502.44739360035
+13
+-60.1198472926819
+23
+-327.009759999999
+33
+1502.44739360035
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-83.3887731086215
+20
+-301.60976
+30
+1579.15445484661
+11
+-85.0224388771913
+21
+-327.00976
+31
+1562.56737879036
+12
+-85.0224388771915
+22
+-301.60976
+32
+1562.56737879036
+13
+-85.0224388771915
+23
+-301.60976
+33
+1562.56737879036
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-85.0224388771913
+20
+-327.00976
+30
+1562.56737879036
+11
+-83.3887731086215
+21
+-301.60976
+31
+1579.15445484661
+12
+-83.3887731086213
+22
+-327.00976
+32
+1579.15445484661
+13
+-83.3887731086213
+23
+-327.00976
+33
+1579.15445484661
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-16.5868827577167
+20
+-301.609759999998
+30
+1479.17860153476
+11
+0.000193298532564334
+21
+-327.009759999998
+31
+1477.54493576619
+12
+0.000193298532362707
+22
+-301.609759999998
+32
+1477.54493576619
+13
+0.000193298532362707
+23
+-301.609759999998
+33
+1477.54493576619
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000193298532564334
+20
+-327.009759999998
+30
+1477.54493576619
+11
+-16.5868827577167
+21
+-301.609759999998
+31
+1479.17860153476
+12
+-16.5868827577165
+22
+-327.009759999998
+32
+1479.17860153476
+13
+-16.5868827577165
+23
+-327.009759999998
+33
+1479.17860153476
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+0.000193298532362707
+20
+-301.609759999998
+30
+1477.54493576619
+11
+16.5872657202876
+21
+-327.009759999998
+31
+1479.1786384364
+12
+16.5872657202874
+22
+-301.609759999998
+32
+1479.1786384364
+13
+16.5872657202874
+23
+-301.609759999998
+33
+1479.1786384364
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202876
+20
+-327.009759999998
+30
+1479.1786384364
+11
+0.000193298532362707
+21
+-301.609759999998
+31
+1477.54493576619
+12
+0.000193298532564334
+22
+-327.009759999998
+32
+1477.54493576619
+13
+0.000193298532564334
+23
+-327.009759999998
+33
+1477.54493576619
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5872657202874
+20
+-301.609759999998
+30
+1479.1786384364
+11
+32.5369026165179
+21
+-327.009759999998
+31
+1484.01692726796
+12
+32.5369026165177
+22
+-301.609759999998
+32
+1484.01692726796
+13
+32.5369026165177
+23
+-301.609759999998
+33
+1484.01692726796
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5369026165179
+20
+-327.009759999998
+30
+1484.01692726796
+11
+16.5872657202874
+21
+-301.609759999998
+31
+1479.1786384364
+12
+16.5872657202876
+22
+-327.009759999998
+32
+1479.1786384364
+13
+16.5872657202876
+23
+-327.009759999998
+33
+1479.1786384364
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5369026165179
+20
+-327.009759999998
+30
+1484.01692726796
+11
+47.2361683859605
+21
+-301.609759999998
+31
+1491.87386953442
+12
+32.5369026165177
+22
+-301.609759999998
+32
+1484.01692726796
+13
+32.5369026165177
+23
+-301.609759999998
+33
+1484.01692726796
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859605
+20
+-301.609759999998
+30
+1491.87386953442
+11
+32.5369026165179
+21
+-327.009759999998
+31
+1484.01692726796
+12
+47.2361683859607
+22
+-327.009759999998
+32
+1491.87386953442
+13
+47.2361683859607
+23
+-327.009759999998
+33
+1491.87386953442
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2361683859607
+20
+-327.009759999998
+30
+1491.87386953442
+11
+60.1201784885394
+21
+-301.609759999998
+31
+1502.4475273507
+12
+47.2361683859605
+22
+-301.609759999998
+32
+1491.87386953442
+13
+47.2361683859605
+23
+-301.609759999998
+33
+1491.87386953442
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1201784885394
+20
+-301.609759999998
+30
+1502.4475273507
+11
+47.2361683859607
+21
+-327.009759999998
+31
+1491.87386953442
+12
+60.1201784885396
+22
+-327.009759999998
+32
+1502.4475273507
+13
+60.1201784885396
+23
+-327.009759999998
+33
+1502.4475273507
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414486
+20
+-327.009759999998
+30
+1515.3315609767
+11
+60.1201784885394
+21
+-301.609759999998
+31
+1502.4475273507
+12
+60.1201784885396
+22
+-327.009759999998
+32
+1502.4475273507
+13
+60.1201784885396
+23
+-327.009759999998
+33
+1502.4475273507
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1201784885394
+20
+-301.609759999998
+30
+1502.4475273507
+11
+70.6938076414486
+21
+-327.009759999998
+31
+1515.3315609767
+12
+70.6938076414485
+22
+-301.609759999998
+32
+1515.3315609767
+13
+70.6938076414485
+23
+-301.609759999998
+33
+1515.3315609767
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.550717206101
+20
+-327.009759999998
+30
+1530.03084422562
+11
+70.6938076414485
+21
+-301.609759999998
+31
+1515.3315609767
+12
+70.6938076414486
+22
+-327.009759999998
+32
+1515.3315609767
+13
+70.6938076414486
+23
+-327.009759999998
+33
+1515.3315609767
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6938076414485
+20
+-301.609759999998
+30
+1515.3315609767
+11
+78.550717206101
+21
+-327.009759999998
+31
+1530.03084422562
+12
+78.5507172061008
+22
+-301.609759999998
+32
+1530.03084422562
+13
+78.5507172061008
+23
+-301.609759999998
+33
+1530.03084422562
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889705541327
+20
+-327.009759999998
+30
+1545.98049188567
+11
+78.5507172061008
+21
+-301.609759999998
+31
+1530.03084422562
+12
+78.550717206101
+22
+-327.009759999998
+32
+1530.03084422562
+13
+78.550717206101
+23
+-327.009759999998
+33
+1530.03084422562
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5507172061008
+20
+-301.609759999998
+30
+1530.03084422562
+11
+83.3889705541327
+21
+-327.009759999998
+31
+1545.98049188567
+12
+83.3889705541326
+22
+-301.609759999998
+32
+1545.98049188567
+13
+83.3889705541326
+23
+-301.609759999998
+33
+1545.98049188567
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+85.0226363227028
+20
+-327.009759999999
+30
+1562.56756794191
+11
+83.3889705541326
+21
+-301.609759999998
+31
+1545.98049188567
+12
+83.3889705541327
+22
+-327.009759999998
+32
+1545.98049188567
+13
+83.3889705541327
+23
+-327.009759999998
+33
+1545.98049188567
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889705541326
+20
+-301.609759999998
+30
+1545.98049188567
+11
+85.0226363227028
+21
+-327.009759999999
+31
+1562.56756794191
+12
+85.0226363227026
+22
+-301.609759999999
+32
+1562.56756794191
+13
+85.0226363227026
+23
+-301.609759999999
+33
+1562.56756794191
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.3889336524952
+20
+-327.009759999999
+30
+1579.15464036367
+11
+85.0226363227026
+21
+-301.609759999999
+31
+1562.56756794191
+12
+85.0226363227028
+22
+-327.009759999999
+32
+1562.56756794191
+13
+85.0226363227028
+23
+-327.009759999999
+33
+1562.56756794191
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+85.0226363227026
+20
+-301.609759999999
+30
+1562.56756794191
+11
+83.3889336524952
+21
+-327.009759999999
+31
+1579.15464036367
+12
+83.388933652495
+22
+-301.609759999999
+32
+1579.15464036367
+13
+83.388933652495
+23
+-301.609759999999
+33
+1579.15464036367
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.5506448209352
+20
+-327.009759999999
+30
+1595.1042772599
+11
+83.388933652495
+21
+-301.609759999999
+31
+1579.15464036367
+12
+83.3889336524952
+22
+-327.009759999999
+32
+1579.15464036367
+13
+83.3889336524952
+23
+-327.009759999999
+33
+1579.15464036367
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+83.388933652495
+20
+-301.609759999999
+30
+1579.15464036367
+11
+78.5506448209352
+21
+-327.009759999999
+31
+1595.1042772599
+12
+78.550644820935
+22
+-301.609759999999
+32
+1595.1042772599
+13
+78.550644820935
+23
+-301.609759999999
+33
+1595.1042772599
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544759
+20
+-327.009759999999
+30
+1609.80354302934
+11
+78.550644820935
+21
+-301.609759999999
+31
+1595.1042772599
+12
+78.5506448209352
+22
+-327.009759999999
+32
+1595.1042772599
+13
+78.5506448209352
+23
+-327.009759999999
+33
+1595.1042772599
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+78.550644820935
+20
+-301.609759999999
+30
+1595.1042772599
+11
+70.6937025544759
+21
+-327.009759999999
+31
+1609.80354302934
+12
+70.6937025544757
+22
+-301.609759999999
+32
+1609.80354302934
+13
+70.6937025544757
+23
+-301.609759999999
+33
+1609.80354302934
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1200447381933
+20
+-327.00976
+30
+1622.68755313192
+11
+70.6937025544757
+21
+-301.609759999999
+31
+1609.80354302934
+12
+70.6937025544759
+22
+-327.009759999999
+32
+1609.80354302934
+13
+70.6937025544759
+23
+-327.009759999999
+33
+1609.80354302934
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+70.6937025544757
+20
+-301.609759999999
+30
+1609.80354302934
+11
+60.1200447381933
+21
+-327.00976
+31
+1622.68755313192
+12
+60.1200447381932
+22
+-301.60976
+32
+1622.68755313192
+13
+60.1200447381932
+23
+-301.60976
+33
+1622.68755313192
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+60.1200447381933
+20
+-327.00976
+30
+1622.68755313192
+11
+47.2360111121915
+21
+-301.60976
+31
+1633.26118228483
+12
+60.1200447381932
+22
+-301.60976
+32
+1622.68755313192
+13
+60.1200447381932
+23
+-301.60976
+33
+1622.68755313192
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121915
+20
+-301.60976
+30
+1633.26118228483
+11
+60.1200447381933
+21
+-327.00976
+31
+1622.68755313192
+12
+47.2360111121917
+22
+-327.00976
+32
+1633.26118228483
+13
+47.2360111121917
+23
+-327.00976
+33
+1633.26118228483
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+47.2360111121917
+20
+-327.00976
+30
+1633.26118228483
+11
+32.5367278632687
+21
+-301.60976
+31
+1641.11809184948
+12
+47.2360111121915
+22
+-301.60976
+32
+1633.26118228483
+13
+47.2360111121915
+23
+-301.60976
+33
+1633.26118228483
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632687
+20
+-301.60976
+30
+1641.11809184948
+11
+47.2360111121917
+21
+-327.00976
+31
+1633.26118228483
+12
+32.5367278632689
+22
+-327.00976
+32
+1641.11809184948
+13
+32.5367278632689
+23
+-327.00976
+33
+1641.11809184948
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+32.5367278632689
+20
+-327.00976
+30
+1641.11809184948
+11
+16.5870802032278
+21
+-301.60976
+31
+1645.95634519751
+12
+32.5367278632687
+22
+-301.60976
+32
+1641.11809184948
+13
+32.5367278632687
+23
+-301.60976
+33
+1641.11809184948
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+16.5870802032278
+20
+-301.60976
+30
+1645.95634519751
+11
+32.5367278632689
+21
+-327.00976
+31
+1641.11809184948
+12
+16.587080203228
+22
+-327.00976
+32
+1645.95634519751
+13
+16.587080203228
+23
+-327.00976
+33
+1645.95634519751
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-29.7122224515915
+20
+-140.14704
+30
+1681.41639731326
+11
+-27.4505026299641
+21
+-2.12061479487602e-12
+31
+1670.04601633937
+12
+-27.4505026299636
+22
+-140.14704
+32
+1670.04601633937
+13
+-27.4505026299636
+23
+-140.14704
+33
+1670.04601633937
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-27.4505026299641
+20
+-2.12061479487602e-12
+30
+1670.04601633937
+11
+-29.7122224515915
+21
+-140.14704
+31
+1681.41639731326
+12
+-29.7122224515919
+22
+-2.16573425859679e-12
+32
+1681.41639731326
+13
+-29.7122224515919
+23
+-2.16573425859679e-12
+33
+1681.41639731326
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+11.3704272911448
+20
+-2.03037586743449e-12
+30
+1653.96590077154
+11
+4.63172537816581e-05
+21
+-140.14704
+31
+1651.70418094992
+12
+4.63172533769929e-05
+22
+-2.03037586743449e-12
+32
+1651.70418094992
+13
+4.63172533769929e-05
+23
+-2.03037586743449e-12
+33
+1651.70418094992
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.63172537816581e-05
+20
+-140.14704
+30
+1651.70418094992
+11
+11.3704272911448
+21
+-2.03037586743449e-12
+31
+1653.96590077154
+12
+11.3704272911452
+22
+-140.14704
+32
+1653.96590077155
+13
+11.3704272911452
+23
+-140.14704
+33
+1653.96590077155
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-27.450522684681
+20
+-140.14704
+30
+1692.78678227628
+11
+-21.0097266163854
+21
+-2.16573425859679e-12
+31
+1702.42613319061
+12
+-27.4505226846814
+22
+-2.16573425859679e-12
+32
+1692.78678227628
+13
+-27.4505226846814
+23
+-2.16573425859679e-12
+33
+1692.78678227628
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-21.0097266163854
+20
+-2.16573425859679e-12
+30
+1702.42613319061
+11
+-27.450522684681
+21
+-140.14704
+31
+1692.78678227628
+12
+-21.009726616385
+22
+-140.14704
+32
+1702.42613319061
+13
+-21.009726616385
+23
+-140.14704
+33
+1702.42613319061
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+27.4505629136862
+20
+-1.98525640371372e-12
+30
+1670.04606475574
+11
+21.0097668453905
+21
+-140.14704
+31
+1660.40671384141
+12
+21.0097668453901
+22
+-1.98525640371372e-12
+32
+1660.40671384141
+13
+21.0097668453901
+23
+-1.98525640371372e-12
+33
+1660.40671384141
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+21.0097668453905
+20
+-140.14704
+30
+1660.40671384141
+11
+27.4505629136862
+21
+-1.98525640371372e-12
+31
+1670.04606475574
+12
+27.4505629136866
+22
+-140.14704
+32
+1670.04606475574
+13
+27.4505629136866
+23
+-140.14704
+33
+1670.04606475574
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-29.7122224515915
+20
+-140.14704
+30
+1681.41639731326
+11
+-27.4505226846814
+21
+-2.16573425859679e-12
+31
+1692.78678227628
+12
+-29.7122224515919
+22
+-2.16573425859679e-12
+32
+1681.41639731326
+13
+-29.7122224515919
+23
+-2.16573425859679e-12
+33
+1681.41639731326
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-27.4505226846814
+20
+-2.16573425859679e-12
+30
+1692.78678227628
+11
+-29.7122224515915
+21
+-140.14704
+31
+1681.41639731326
+12
+-27.450522684681
+22
+-140.14704
+32
+1692.78678227628
+13
+-27.450522684681
+23
+-140.14704
+33
+1692.78678227628
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+4.63172537816581e-05
+20
+-140.14704
+30
+1651.70418094992
+11
+-11.3703386457694
+21
+-2.07549533115525e-12
+31
+1653.96588071683
+12
+4.63172533769929e-05
+22
+-2.03037586743449e-12
+32
+1651.70418094992
+13
+4.63172533769929e-05
+23
+-2.03037586743449e-12
+33
+1651.70418094992
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-11.3703386457694
+20
+-2.07549533115525e-12
+30
+1653.96588071683
+11
+4.63172537816581e-05
+21
+-140.14704
+31
+1651.70418094992
+12
+-11.370338645769
+22
+-140.14704
+32
+1653.96588071683
+13
+-11.370338645769
+23
+-140.14704
+33
+1653.96588071683
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-11.3703870621396
+20
+-140.14704
+30
+1708.86694626048
+11
+-6.0882486421221e-06
+21
+-2.12061479487602e-12
+31
+1711.12866608211
+12
+-11.37038706214
+22
+-2.12061479487602e-12
+32
+1708.86694626048
+13
+-11.37038706214
+23
+-2.12061479487602e-12
+33
+1708.86694626048
+70
+1
+ 0
+3DFACE
+ 8
+rotator_half
+10
+-6.0882486421221e-06
+20
+-2.12061479487602e-12
+30
+1711.12866608211
+11
+-11.3703870621396
+21
+-140.14704
+31
+1708.86694626048
+12
+-6.08824821207721e-06
+22
+-140.14704
+32
+1711.12866608211
+13
+-6.08824821207721e-06
+23
+-140.14704
+33
+1711.12866608211
+70
+1
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/hacks/glx/romanboy.c b/hacks/glx/romanboy.c
new file mode 100644
index 0000000..9ad12f0
--- /dev/null
+++ b/hacks/glx/romanboy.c
@@ -0,0 +1,1552 @@
+/* romanboy --- Shows a 3d immersion of the real projective plane
+ that rotates in 3d or on which you can walk and that can deform
+ smoothly between the Roman surface and the Boy surface. */
+
+#if 0
+static const char sccsid[] = "@(#)romanboy.c 1.1 14/10/03 xlockmore";
+#endif
+
+/* Copyright (c) 2013-2014 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 14/10/03: Initial version
+ */
+
+/*
+ * This program shows a 3d immersion of the real projective plane
+ * that smoothly deforms between the Roman surface and the Boy
+ * surface. You can walk on the projective plane or turn in 3d. The
+ * smooth deformation (homotopy) between these two famous immersions
+ * of the real projective plane was constructed by François Apéry.
+ *
+ * The real projective plane is a non-orientable surface. To make
+ * this apparent, the two-sided color mode can be used.
+ * Alternatively, orientation markers (curling arrows) can be drawn as
+ * a texture map on the surface of the projective plane. While
+ * walking on the projective plane, you will notice that the
+ * orientation of the curling arrows changes (which it must because
+ * the projective plane is non-orientable).
+ *
+ * The real projective plane is a model for the projective geometry in
+ * 2d space. One point can be singled out as the origin. A line can
+ * be singled out as the line at infinity, i.e., a line that lies at
+ * an infinite distance to the origin. The line at infinity is
+ * topologically a circle. Points on the line at infinity are also
+ * used to model directions in projective geometry. The origin can be
+ * visualized in different manners. When using distance colors, the
+ * origin is the point that is displayed as fully saturated red, which
+ * is easier to see as the center of the reddish area on the
+ * projective plane. Alternatively, when using distance bands, the
+ * origin is the center of the only band that projects to a disk.
+ * When using direction bands, the origin is the point where all
+ * direction bands collapse to a point. Finally, when orientation
+ * markers are being displayed, the origin the the point where all
+ * orientation markers are compressed to a point. The line at
+ * infinity can also be visualized in different ways. When using
+ * distance colors, the line at infinity is the line that is displayed
+ * as fully saturated magenta. When two-sided colors are used, the
+ * line at infinity lies at the points where the red and green "sides"
+ * of the projective plane meet (of course, the real projective plane
+ * only has one side, so this is a design choice of the
+ * visualization). Alternatively, when orientation markers are being
+ * displayed, the line at infinity is the place where the orientation
+ * markers change their orientation.
+ *
+ * Note that when the projective plane is displayed with bands, the
+ * orientation markers are placed in the middle of the bands. For
+ * distance bands, the bands are chosen in such a way that the band at
+ * the origin is only half as wide as the remaining bands, which
+ * results in a disk being displayed at the origin that has the same
+ * diameter as the remaining bands. This choice, however, also
+ * implies that the band at infinity is half as wide as the other
+ * bands. Since the projective plane is attached to itself (in a
+ * complicated fashion) at the line at infinity, effectively the band
+ * at infinity is again as wide as the remaining bands. However,
+ * since the orientation markers are displayed in the middle of the
+ * bands, this means that only one half of the orientation markers
+ * will be displayed twice at the line at infinity if distance bands
+ * are used. If direction bands are used or if the projective plane
+ * is displayed as a solid surface, the orientation markers are
+ * displayed fully at the respective sides of the line at infinity.
+ *
+ * The immersed projective plane can be projected to the screen either
+ * perspectively or orthographically. When using the walking modes,
+ * perspective projection to the screen will be used.
+ *
+ * There are three display modes for the projective plane: mesh
+ * (wireframe), solid, or transparent. Furthermore, the appearance of
+ * the projective plane can be as a solid object or as a set of
+ * see-through bands. The bands can be distance bands, i.e., bands
+ * that lie at increasing distances from the origin, or direction
+ * bands, i.e., bands that lie at increasing angles with respect to
+ * the origin.
+ *
+ * When the projective plane is displayed with direction bands, you
+ * will be able to see that each direction band (modulo the "pinching"
+ * at the origin) is a Moebius strip, which also shows that the
+ * projective plane is non-orientable.
+ *
+ * Finally, the colors with with the projective plane is drawn can be
+ * set to two-sided, distance, or direction. In two-sided mode, the
+ * projective plane is drawn with red on one "side" and green on the
+ * "other side". As described above, the projective plane only has
+ * one side, so the color jumps from red to green along the line at
+ * infinity. This mode enables you to see that the projective plane
+ * is non-orientable. In distance mode, the projective plane is
+ * displayed with fully saturated colors that depend on the distance
+ * of the points on the projective plane to the origin. The origin is
+ * displayed in red, the line at infinity is displayed in magenta. If
+ * the projective plane is displayed as distance bands, each band will
+ * be displayed with a different color. In direction mode, the
+ * projective plane is displayed with fully saturated colors that
+ * depend on the angle of the points on the projective plane with
+ * respect to the origin. Angles in opposite directions to the origin
+ * (e.g., 15 and 205 degrees) are displayed in the same color since
+ * they are projectively equivalent. If the projective plane is
+ * displayed as direction bands, each band will be displayed with a
+ * different color.
+ *
+ * The rotation speed for each of the three coordinate axes around
+ * which the projective plane rotates can be chosen.
+ *
+ * Furthermore, in the walking mode the walking direction in the 2d
+ * base square of the projective plane and the walking speed can be
+ * chosen. The walking direction is measured as an angle in degrees
+ * in the 2d square that forms the coordinate system of the surface of
+ * the projective plane. A value of 0 or 180 means that the walk is
+ * along a circle at a randomly chosen distance from the origin
+ * (parallel to a distance band). A value of 90 or 270 means that the
+ * walk is directly from the origin to the line at infinity and back
+ * (analogous to a direction band). Any other value results in a
+ * curved path from the origin to the line at infinity and back.
+ *
+ * By default, the immersion of the real projective plane smoothly
+ * deforms between the Roman and Boy surfaces. It is possible to
+ * choose the speed of the deformation. Furthermore, it is possible
+ * to switch the deformation off. It is also possible to determine
+ * the initial deformation of the immersion. This is mostly useful if
+ * the deformation is switched off, in which case it will determine
+ * the appearance of the surface.
+ *
+ * As a final option, it is possible to display generalized versions
+ * of the immersion discussed above by specifying the order of the
+ * surface. The default surface order of 3 results in the immersion
+ * of the real projective described above. The surface order can be
+ * chosen between 2 and 9. Odd surface orders result in generalized
+ * immersions of the real projective plane, while even numbers result
+ * in a immersion of a topological sphere (which is orientable). The
+ * most interesting even case is a surface order of 2, which results
+ * in an immersion of the halfway model of Morin's sphere eversion (if
+ * the deformation is switched off).
+ *
+ * This program is inspired by François Apéry's book "Models of the
+ * Real Projective Plane", Vieweg, 1987.
+ */
+
+#include "curlicue.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define DISP_WIREFRAME 0
+#define DISP_SURFACE 1
+#define DISP_TRANSPARENT 2
+#define NUM_DISPLAY_MODES 3
+
+#define APPEARANCE_SOLID 0
+#define APPEARANCE_DISTANCE_BANDS 1
+#define APPEARANCE_DIRECTION_BANDS 2
+#define NUM_APPEARANCES 3
+
+#define COLORS_TWOSIDED 0
+#define COLORS_DISTANCE 1
+#define COLORS_DIRECTION 2
+#define NUM_COLORS 3
+
+#define VIEW_WALK 0
+#define VIEW_TURN 1
+#define NUM_VIEW_MODES 2
+
+#define DISP_PERSPECTIVE 0
+#define DISP_ORTHOGRAPHIC 1
+#define NUM_DISP_MODES 2
+
+#define DEF_DISPLAY_MODE "random"
+#define DEF_APPEARANCE "random"
+#define DEF_COLORS "random"
+#define DEF_VIEW_MODE "random"
+#define DEF_MARKS "False"
+#define DEF_DEFORM "True"
+#define DEF_PROJECTION "random"
+#define DEF_SPEEDX "1.1"
+#define DEF_SPEEDY "1.3"
+#define DEF_SPEEDZ "1.5"
+#define DEF_WALK_DIRECTION "83.0"
+#define DEF_WALK_SPEED "20.0"
+#define DEF_DEFORM_SPEED "10.0"
+#define DEF_INIT_DEFORM "1000.0"
+#define DEF_SURFACE_ORDER "3"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+
+# define release_romanboy 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#ifndef HAVE_JWXYZ
+# include <X11/keysym.h>
+#endif
+
+#include "gltrackball.h"
+
+#include <float.h>
+
+
+#ifdef USE_MODULES
+ModStruct romanboy_description =
+{"romanboy", "init_romanboy", "draw_romanboy",
+ NULL, "draw_romanboy", "change_romanboy",
+ "free_romanboy", &romanboy_opts, 25000, 1, 1, 1, 1.0, 4, "",
+ "Rotate a 3d immersion of the real projective plane in 3d or walk on it",
+ 0, NULL};
+
+#endif
+
+
+static char *mode;
+static char *appear;
+static char *color_mode;
+static char *view_mode;
+static Bool marks;
+static Bool deform;
+static char *proj;
+static float speed_x;
+static float speed_y;
+static float speed_z;
+static float walk_direction;
+static float walk_speed;
+static float deform_speed;
+static float init_deform;
+static int surface_order;
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-appearance", ".appearance", XrmoptionSepArg, 0 },
+ {"-solid", ".appearance", XrmoptionNoArg, "solid" },
+ {"-distance-bands", ".appearance", XrmoptionNoArg, "distance-bands" },
+ {"-direction-bands", ".appearance", XrmoptionNoArg, "direction-bands" },
+ {"-colors", ".colors", XrmoptionSepArg, 0 },
+ {"-twosided-colors", ".colors", XrmoptionNoArg, "two-sided" },
+ {"-distance-colors", ".colors", XrmoptionNoArg, "distance" },
+ {"-direction-colors", ".colors", XrmoptionNoArg, "direction" },
+ {"-view-mode", ".viewMode", XrmoptionSepArg, 0 },
+ {"-walk", ".viewMode", XrmoptionNoArg, "walk" },
+ {"-turn", ".viewMode", XrmoptionNoArg, "turn" },
+ {"-deform", ".deform", XrmoptionNoArg, "on"},
+ {"+deform", ".deform", XrmoptionNoArg, "off"},
+ {"-orientation-marks", ".marks", XrmoptionNoArg, "on"},
+ {"+orientation-marks", ".marks", XrmoptionNoArg, "off"},
+ {"-projection", ".projection", XrmoptionSepArg, 0 },
+ {"-perspective", ".projection", XrmoptionNoArg, "perspective" },
+ {"-orthographic", ".projection", XrmoptionNoArg, "orthographic" },
+ {"-speed-x", ".speedx", XrmoptionSepArg, 0 },
+ {"-speed-y", ".speedy", XrmoptionSepArg, 0 },
+ {"-speed-z", ".speedz", XrmoptionSepArg, 0 },
+ {"-walk-direction", ".walkDirection", XrmoptionSepArg, 0 },
+ {"-walk-speed", ".walkSpeed", XrmoptionSepArg, 0 },
+ {"-deformation-speed", ".deformSpeed", XrmoptionSepArg, 0 },
+ {"-initial-deformation", ".initDeform", XrmoptionSepArg, 0 },
+ {"-roman", ".initDeform", XrmoptionNoArg, "0.0" },
+ {"-boy", ".initDeform", XrmoptionNoArg, "1000.0" },
+ {"-surface-order", ".surfaceOrder", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] =
+{
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
+ { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
+ { &view_mode, "viewMode", "ViewMode", DEF_VIEW_MODE, t_String },
+ { &deform, "deform", "Deform", DEF_DEFORM, t_Bool },
+ { &marks, "marks", "Marks", DEF_MARKS, t_Bool },
+ { &proj, "projection", "Projection", DEF_PROJECTION, t_String },
+ { &speed_x, "speedx", "Speedx", DEF_SPEEDX, t_Float},
+ { &speed_y, "speedy", "Speedy", DEF_SPEEDY, t_Float},
+ { &speed_z, "speedz", "Speedz", DEF_SPEEDZ, t_Float},
+ { &walk_direction, "walkDirection", "WalkDirection", DEF_WALK_DIRECTION, t_Float},
+ { &walk_speed, "walkSpeed", "WalkSpeed", DEF_WALK_SPEED, t_Float},
+ { &deform_speed, "deformSpeed", "DeformSpeed", DEF_DEFORM_SPEED, t_Float},
+ { &init_deform, "initDeform", "InitDeform", DEF_INIT_DEFORM, t_Float },
+ { &surface_order, "surfaceOrder", "SurfaceOrder", DEF_SURFACE_ORDER, t_Int }
+};
+
+ENTRYPOINT ModeSpecOpt romanboy_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, NULL};
+
+
+/* Offset by which we walk above the projective plane */
+#define DELTAY 0.01
+
+/* Number of subdivisions of the projective plane */
+#define NUMU 64
+#define NUMV 128
+
+/* Number of subdivisions per band */
+#define NUMB 8
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* Options */
+ int display_mode;
+ int appearance;
+ int colors;
+ int view;
+ int projection;
+ Bool marks;
+ /* 3D rotation angles */
+ float alpha, beta, delta;
+ /* Movement parameters */
+ float umove, vmove, dumove, dvmove;
+ int side, dir;
+ /* Deformation parameters */
+ float dd;
+ int defdir;
+ /* The type of the generalized Roman-Boy surface */
+ int g;
+ /* The viewing offset in 3d */
+ float offset3d[3];
+ /* The 3d coordinates of the projective plane and their derivatives */
+ float *pp;
+ float *pn;
+ /* The precomputed colors of the projective plane */
+ float *col;
+ /* The precomputed texture coordinates of the projective plane */
+ float *tex;
+ /* The "curlicue" texture */
+ GLuint tex_name;
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Trackball states */
+ trackball_state *trackball;
+ Bool button_pressed;
+ /* A random factor to modify the rotation speeds */
+ float speed_scale;
+} romanboystruct;
+
+static romanboystruct *romanboy = (romanboystruct *) NULL;
+
+
+/* Add a rotation around the x-axis to the matrix m. */
+static void rotatex(float m[3][3], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<3; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the y-axis to the matrix m. */
+static void rotatey(float m[3][3], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<3; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the z-axis to the matrix m. */
+static void rotatez(float m[3][3], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<3; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float m[3][3])
+{
+ int i, j;
+
+ for (i=0; i<3; i++)
+ for (j=0; j<3; j++)
+ m[i][j] = (i==j);
+ rotatex(m,al);
+ rotatey(m,be);
+ rotatez(m,de);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[3][3], float n[3][3], float o[3][3])
+{
+ int i, j, k;
+
+ for (i=0; i<3; i++)
+ {
+ for (j=0; j<3; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<3; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute a 3D rotation matrix from a unit quaternion. */
+static void quat_to_rotmat(float p[4], float m[3][3])
+{
+ double al, be, de;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+
+ rotateall(al,be,de,m);
+}
+
+
+/* Compute a fully saturated and bright color based on an angle. */
+static void color(romanboystruct *pp, double angle, float col[4])
+{
+ int s;
+ double t;
+
+ if (pp->colors == COLORS_TWOSIDED)
+ return;
+
+ if (angle >= 0.0)
+ angle = fmod(angle,2.0*M_PI);
+ else
+ angle = fmod(angle,-2.0*M_PI);
+ s = floor(angle/(M_PI/3));
+ t = angle/(M_PI/3)-s;
+ if (s >= 6)
+ s = 0;
+ switch (s)
+ {
+ case 0:
+ col[0] = 1.0;
+ col[1] = t;
+ col[2] = 0.0;
+ break;
+ case 1:
+ col[0] = 1.0-t;
+ col[1] = 1.0;
+ col[2] = 0.0;
+ break;
+ case 2:
+ col[0] = 0.0;
+ col[1] = 1.0;
+ col[2] = t;
+ break;
+ case 3:
+ col[0] = 0.0;
+ col[1] = 1.0-t;
+ col[2] = 1.0;
+ break;
+ case 4:
+ col[0] = t;
+ col[1] = 0.0;
+ col[2] = 1.0;
+ break;
+ case 5:
+ col[0] = 1.0;
+ col[1] = 0.0;
+ col[2] = 1.0-t;
+ break;
+ }
+ if (pp->display_mode == DISP_TRANSPARENT)
+ col[3] = 0.7;
+ else
+ col[3] = 1.0;
+}
+
+
+/* Set up the projective plane colors and texture. */
+static void setup_roman_boy_color_texture(ModeInfo *mi, double umin,
+ double umax, double vmin,
+ double vmax, int numu, int numv)
+{
+ int i, j, k, g;
+ double u, v, ur, vr;
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ g = pp->g;
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=numv; i++)
+ {
+ for (j=0; j<=numu; j++)
+ {
+ k = i*(numu+1)+j;
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ u = -ur*j/numu+umin;
+ else
+ u = ur*j/numu+umin;
+ v = vr*i/numv+vmin;
+ if (pp->colors == COLORS_DIRECTION)
+ color(pp,2.0*M_PI-fmod(2.0*u,2.0*M_PI),&pp->col[4*k]);
+ else /* pp->colors == COLORS_DISTANCE */
+ color(pp,v*(5.0/6.0),&pp->col[4*k]);
+ pp->tex[2*k+0] = -16*g*u/(2.0*M_PI);
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS)
+ pp->tex[2*k+1] = 32*v/(2.0*M_PI)-0.5;
+ else
+ pp->tex[2*k+1] = 32*v/(2.0*M_PI);
+ }
+ }
+}
+
+
+/* Draw a 3d immersion of the projective plane. */
+static int roman_boy(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax, int numu, int numv)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[3][3];
+ int i, j, k, l, m, o, g;
+ double u, v, ur, vr, oz;
+ double xx[3], xxu[3], xxv[3];
+ double r, s, t;
+ double d, dd, radius;
+ double cu, su, cgu, sgu, cgm1u, sgm1u, cv, c2v, s2v, cv2;
+ double sqrt2og, h1m1og, gm1, nomx, nomy, nomux, nomuy, nomvx, nomvy;
+ double den, den2, denu, denv;
+ float qu[4], r1[3][3], r2[3][3];
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ g = pp->g;
+ dd = pp->dd;
+ d = ((6.0*dd-15.0)*dd+10.0)*dd*dd*dd;
+ r = 1.0+d*d*(1.0/2.0+d*d*(1.0/6.0+d*d*(1.0/3.0)));
+ radius = 1.0/r;
+ oz = 0.5*r;
+ if (pp->view == VIEW_WALK)
+ {
+ u = pp->umove;
+ v = pp->vmove;
+ if (g & 1)
+ v = 0.5*M_PI-0.25*v;
+ else
+ v = 0.5*M_PI-0.5*v;
+ sqrt2og = M_SQRT2/g;
+ h1m1og = 0.5*(1.0-1.0/g);
+ gm1 = g-1.0;
+ cu = cos(u);
+ su = sin(u);
+ cgu = cos(g*u);
+ sgu = sin(g*u);
+ cgm1u = cos(gm1*u);
+ sgm1u = sin(gm1*u);
+ cv = cos(v);
+ c2v = cos(2.0*v);
+ s2v = sin(2.0*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
+ den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5*M_SQRT2*d*g*cgu*s2v;
+ denv = M_SQRT2*d*sgu*c2v;
+ xx[0] = nomx*den;
+ xx[1] = nomy*den;
+ xx[2] = cv2*den-oz;
+ /* Avoid degenerate tangential plane basis vectors. */
+ if (0.5*M_PI-fabs(v) < FLT_EPSILON)
+ {
+ if (0.5*M_PI-v < FLT_EPSILON)
+ v = 0.5*M_PI-FLT_EPSILON;
+ else
+ v = -0.5*M_PI+FLT_EPSILON;
+ cv = cos(v);
+ c2v = cos(2.0*v);
+ s2v = sin(2.0*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
+ den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5*M_SQRT2*d*g*cgu*s2v;
+ denv = M_SQRT2*d*sgu*c2v;
+ }
+ xxu[0] = nomux*den+nomx*denu*den2;
+ xxu[1] = nomuy*den+nomy*denu*den2;
+ xxu[2] = cv2*denu*den2;
+ xxv[0] = nomvx*den+nomx*denv*den2;
+ xxv[1] = nomvy*den+nomy*denv*den2;
+ xxv[2] = -s2v*den+cv2*denv*den2;
+ for (l=0; l<3; l++)
+ {
+ p[l] = xx[l]*radius;
+ pu[l] = xxu[l]*radius;
+ pv[l] = xxv[l]*radius;
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(pp->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*pp->dumove-pv[0]*0.25*pp->dvmove;
+ pm[1] = pu[1]*pp->dumove-pv[1]*0.25*pp->dvmove;
+ pm[2] = pu[2]*pp->dumove-pv[2]*0.25*pp->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, gamma from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ pp->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ pp->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ pp->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the projective plane in 3D. */
+ rotateall(pp->alpha,pp->beta,pp->delta,mat);
+
+ u = pp->umove;
+ v = pp->vmove;
+ if (g & 1)
+ v = 0.5*M_PI-0.25*v;
+ else
+ v = 0.5*M_PI-0.5*v;
+ sqrt2og = M_SQRT2/g;
+ h1m1og = 0.5*(1.0-1.0/g);
+ gm1 = g-1.0;
+ cu = cos(u);
+ su = sin(u);
+ sgu = sin(g*u);
+ cgm1u = cos(gm1*u);
+ sgm1u = sin(gm1*u);
+ cv = cos(v);
+ s2v = sin(2.0*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ xx[0] = nomx*den;
+ xx[1] = nomy*den;
+ xx[2] = cv2*den-oz;
+ for (l=0; l<3; l++)
+ {
+ r = 0.0;
+ for (m=0; m<3; m++)
+ r += mat[l][m]*xx[m];
+ p[l] = r*radius;
+ }
+
+ pp->offset3d[0] = -p[0];
+ pp->offset3d[1] = -p[1]-DELTAY;
+ pp->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the projective plane in 3D,
+ including the trackball rotations. */
+ rotateall(pp->alpha,pp->beta,pp->delta,r1);
+
+ gltrackball_get_quaternion(pp->trackball,qu);
+ quat_to_rotmat(qu,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ if (pp->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,pp->tex_name);
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+
+ /* Set up the projective plane coordinates and normals. */
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ for (i=0; i<=numv; i++)
+ {
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) >= NUMB/4+1) && ((i & (NUMB-1)) < 3*NUMB/4))
+ continue;
+ for (j=0; j<=numu; j++)
+ {
+ o = i*(numu+1)+j;
+ u = ur*j/numu+umin;
+ v = vr*i/numv+vmin;
+ if (g & 1)
+ v = 0.5*M_PI-0.25*v;
+ else
+ v = 0.5*M_PI-0.5*v;
+ sqrt2og = M_SQRT2/g;
+ h1m1og = 0.5*(1.0-1.0/g);
+ gm1 = g-1.0;
+ cu = cos(u);
+ su = sin(u);
+ cgu = cos(g*u);
+ sgu = sin(g*u);
+ cgm1u = cos(gm1*u);
+ sgm1u = sin(gm1*u);
+ cv = cos(v);
+ c2v = cos(2.0*v);
+ s2v = sin(2.0*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
+ den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5*M_SQRT2*d*g*cgu*s2v;
+ denv = M_SQRT2*d*sgu*c2v;
+ xx[0] = nomx*den;
+ xx[1] = nomy*den;
+ xx[2] = cv2*den-oz;
+ /* Avoid degenerate tangential plane basis vectors. */
+ if (0.5*M_PI-fabs(v) < FLT_EPSILON)
+ {
+ if (0.5*M_PI-v < FLT_EPSILON)
+ v = 0.5*M_PI-FLT_EPSILON;
+ else
+ v = -0.5*M_PI+FLT_EPSILON;
+ cv = cos(v);
+ c2v = cos(2.0*v);
+ s2v = sin(2.0*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
+ den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5*M_SQRT2*d*g*cgu*s2v;
+ denv = M_SQRT2*d*sgu*c2v;
+ }
+ xxu[0] = nomux*den+nomx*denu*den2;
+ xxu[1] = nomuy*den+nomy*denu*den2;
+ xxu[2] = cv2*denu*den2;
+ xxv[0] = nomvx*den+nomx*denv*den2;
+ xxv[1] = nomvy*den+nomy*denv*den2;
+ xxv[2] = -s2v*den+cv2*denv*den2;
+ for (l=0; l<3; l++)
+ {
+ r = 0.0;
+ s = 0.0;
+ t = 0.0;
+ for (m=0; m<3; m++)
+ {
+ r += mat[l][m]*xx[m];
+ s += mat[l][m]*xxu[m];
+ t += mat[l][m]*xxv[m];
+ }
+ p[l] = r*radius+pp->offset3d[l];
+ pu[l] = s*radius;
+ pv[l] = t*radius;
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pp->pp[3*o+0] = p[0];
+ pp->pp[3*o+1] = p[1];
+ pp->pp[3*o+2] = p[2];
+ pp->pn[3*o+0] = n[0];
+ pp->pn[3*o+1] = n[1];
+ pp->pn[3*o+2] = n[2];
+ }
+ }
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ for (j=0; j<=numu; j++)
+ {
+ if ((j & (NUMB-1)) >= NUMB/2+1)
+ continue;
+ for (i=0; i<=numv; i++)
+ {
+ o = i*(numu+1)+j;
+ u = -ur*j/numu+umin;
+ v = vr*i/numv+vmin;
+ if (g & 1)
+ v = 0.5*M_PI-0.25*v;
+ else
+ v = 0.5*M_PI-0.5*v;
+ sqrt2og = M_SQRT2/g;
+ h1m1og = 0.5*(1.0-1.0/g);
+ gm1 = g-1.0;
+ cu = cos(u);
+ su = sin(u);
+ cgu = cos(g*u);
+ sgu = sin(g*u);
+ cgm1u = cos(gm1*u);
+ sgm1u = sin(gm1*u);
+ cv = cos(v);
+ c2v = cos(2.0*v);
+ s2v = sin(2.0*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
+ den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5*M_SQRT2*d*g*cgu*s2v;
+ denv = M_SQRT2*d*sgu*c2v;
+ xx[0] = nomx*den;
+ xx[1] = nomy*den;
+ xx[2] = cv2*den-oz;
+ /* Avoid degenerate tangential plane basis vectors. */
+ if (0.5*M_PI-fabs(v) < FLT_EPSILON)
+ {
+ if (0.5*M_PI-v < FLT_EPSILON)
+ v = 0.5*M_PI-FLT_EPSILON;
+ else
+ v = -0.5*M_PI+FLT_EPSILON;
+ cv = cos(v);
+ c2v = cos(2.0*v);
+ s2v = sin(2.0*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
+ den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5*M_SQRT2*d*g*cgu*s2v;
+ denv = M_SQRT2*d*sgu*c2v;
+ }
+ xxu[0] = nomux*den+nomx*denu*den2;
+ xxu[1] = nomuy*den+nomy*denu*den2;
+ xxu[2] = cv2*denu*den2;
+ xxv[0] = nomvx*den+nomx*denv*den2;
+ xxv[1] = nomvy*den+nomy*denv*den2;
+ xxv[2] = -s2v*den+cv2*denv*den2;
+ for (l=0; l<3; l++)
+ {
+ r = 0.0;
+ s = 0.0;
+ t = 0.0;
+ for (m=0; m<3; m++)
+ {
+ r += mat[l][m]*xx[m];
+ s += mat[l][m]*xxu[m];
+ t += mat[l][m]*xxv[m];
+ }
+ p[l] = r*radius+pp->offset3d[l];
+ pu[l] = s*radius;
+ pv[l] = t*radius;
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pp->pp[3*o+0] = p[0];
+ pp->pp[3*o+1] = p[1];
+ pp->pp[3*o+2] = p[2];
+ pp->pn[3*o+0] = n[0];
+ pp->pn[3*o+1] = n[1];
+ pp->pn[3*o+2] = n[2];
+ }
+ }
+ }
+
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ for (i=0; i<numv; i++)
+ {
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) >= NUMB/4) && ((i & (NUMB-1)) < 3*NUMB/4))
+ continue;
+ if (pp->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=numu; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(numu+1)+m;
+ glTexCoord2fv(&pp->tex[2*o]);
+ if (pp->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(&pp->col[4*o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+ &pp->col[4*o]);
+ }
+ glNormal3fv(&pp->pn[3*o]);
+ glVertex3fv(&pp->pp[3*o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ for (j=0; j<numu; j++)
+ {
+ if ((j & (NUMB-1)) >= NUMB/2)
+ continue;
+ if (pp->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (i=0; i<=numv; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = (j+k);
+ o = l*(numu+1)+m;
+ glTexCoord2fv(&pp->tex[2*o]);
+ if (pp->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(&pp->col[4*o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+ &pp->col[4*o]);
+ }
+ glNormal3fv(&pp->pn[3*o]);
+ glVertex3fv(&pp->pp[3*o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ }
+
+ polys /= 2;
+ return polys;
+}
+
+
+/* Generate a texture image that shows the orientation reversal. */
+static void gen_texture(ModeInfo *mi)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ glGenTextures(1,&pp->tex_name);
+ glBindTexture(GL_TEXTURE_2D,pp->tex_name);
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+ glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TEX_DIMENSION,TEX_DIMENSION,0,
+ GL_LUMINANCE,GL_UNSIGNED_BYTE,texture);
+}
+
+
+static void init(ModeInfo *mi)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ if (deform_speed == 0.0)
+ deform_speed = 10.0;
+
+ if (init_deform < 0.0)
+ init_deform = 0.0;
+ if (init_deform > 1000.0)
+ init_deform = 1000.0;
+
+ if (walk_speed == 0.0)
+ walk_speed = 20.0;
+
+ if (pp->view == VIEW_TURN)
+ {
+ pp->alpha = frand(360.0);
+ pp->beta = frand(360.0);
+ pp->delta = frand(360.0);
+ }
+ else
+ {
+ pp->alpha = 0.0;
+ pp->beta = 0.0;
+ pp->delta = 0.0;
+ }
+ pp->umove = frand(2.0*M_PI);
+ pp->vmove = frand(2.0*M_PI);
+ pp->dumove = 0.0;
+ pp->dvmove = 0.0;
+ pp->side = 1;
+ if (sin(walk_direction*M_PI/180.0) >= 0.0)
+ pp->dir = 1;
+ else
+ pp->dir = -1;
+
+ pp->dd = init_deform*0.001;
+ pp->defdir = -1;
+
+ pp->offset3d[0] = 0.0;
+ pp->offset3d[1] = 0.0;
+ pp->offset3d[2] = -1.8;
+
+ gen_texture(mi);
+ setup_roman_boy_color_texture(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,pp->g*NUMU,NUMV);
+
+ if (pp->marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (pp->projection == DISP_PERSPECTIVE || pp->view == VIEW_WALK)
+ {
+ if (pp->view == VIEW_WALK)
+ gluPerspective(60.0,1.0,0.01,10.0);
+ else
+ gluPerspective(60.0,1.0,0.1,10.0);
+ }
+ else
+ {
+ glOrtho(-1.0,1.0,-1.0,1.0,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (pp->display_mode == DISP_WIREFRAME)
+ pp->display_mode = DISP_SURFACE;
+# endif
+
+ if (pp->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+}
+
+
+/* Redisplay the Klein bottle. */
+static void display_romanboy(ModeInfo *mi)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ if (!pp->button_pressed)
+ {
+ if (deform)
+ {
+ pp->dd += pp->defdir*deform_speed*0.001;
+ if (pp->dd < 0.0)
+ {
+ pp->dd = -pp->dd;
+ pp->defdir = -pp->defdir;
+ }
+ if (pp->dd > 1.0)
+ {
+ pp->dd = 2.0-pp->dd;
+ pp->defdir = -pp->defdir;
+ }
+ }
+ if (pp->view == VIEW_TURN)
+ {
+ pp->alpha += speed_x * pp->speed_scale;
+ if (pp->alpha >= 360.0)
+ pp->alpha -= 360.0;
+ pp->beta += speed_y * pp->speed_scale;
+ if (pp->beta >= 360.0)
+ pp->beta -= 360.0;
+ pp->delta += speed_z * pp->speed_scale;
+ if (pp->delta >= 360.0)
+ pp->delta -= 360.0;
+ }
+ if (pp->view == VIEW_WALK)
+ {
+ pp->dvmove = (pp->dir*sin(walk_direction*M_PI/180.0)*
+ walk_speed*M_PI/4096.0);
+ pp->vmove += pp->dvmove;
+ if (pp->vmove > 2.0*M_PI)
+ {
+ pp->vmove = 4.0*M_PI-pp->vmove;
+ pp->umove = pp->umove-M_PI;
+ if (pp->umove < 0.0)
+ pp->umove += 2.0*M_PI;
+ pp->side = -pp->side;
+ pp->dir = -pp->dir;
+ pp->dvmove = -pp->dvmove;
+ }
+ if (pp->vmove < 0.0)
+ {
+ pp->vmove = -pp->vmove;
+ pp->umove = pp->umove-M_PI;
+ if (pp->umove < 0.0)
+ pp->umove += 2.0*M_PI;
+ pp->dir = -pp->dir;
+ pp->dvmove = -pp->dvmove;
+ }
+ pp->dumove = cos(walk_direction*M_PI/180.0)*walk_speed*M_PI/4096.0;
+ pp->umove += pp->dumove;
+ if (pp->umove >= 2.0*M_PI)
+ pp->umove -= 2.0*M_PI;
+ if (pp->umove < 0.0)
+ pp->umove += 2.0*M_PI;
+ }
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (pp->projection == DISP_PERSPECTIVE || pp->view == VIEW_WALK)
+ {
+ if (pp->view == VIEW_WALK)
+ gluPerspective(60.0,pp->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,pp->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (pp->aspect >= 1.0)
+ glOrtho(-pp->aspect,pp->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/pp->aspect,1.0/pp->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ mi->polygon_count = roman_boy(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,pp->g*NUMU,NUMV);
+}
+
+
+ENTRYPOINT void reshape_romanboy(ModeInfo *mi, int width, int height)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+
+ pp->WindW = (GLint)width;
+ pp->WindH = (GLint)height;
+ glViewport(0,y,width,height);
+ pp->aspect = (GLfloat)width/(GLfloat)height;
+}
+
+
+ENTRYPOINT Bool romanboy_handle_event(ModeInfo *mi, XEvent *event)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress && event->xbutton.button == Button1)
+ {
+ pp->button_pressed = True;
+ gltrackball_start(pp->trackball, event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ pp->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && pp->button_pressed)
+ {
+ gltrackball_track(pp->trackball, event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize romanboy. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_romanboy(ModeInfo *mi)
+{
+ romanboystruct *pp;
+
+ MI_INIT (mi, romanboy);
+ pp = &romanboy[MI_SCREEN(mi)];
+
+ if (surface_order < 2)
+ pp->g = 2;
+ else if (surface_order > 9)
+ pp->g = 9;
+ else
+ pp->g = surface_order;
+
+ pp->pp = calloc(3*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+ pp->pn = calloc(3*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+ pp->col = calloc(4*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+ pp->tex = calloc(2*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+
+ pp->trackball = gltrackball_init(True);
+ pp->button_pressed = False;
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"random"))
+ {
+ pp->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+ else if (!strcasecmp(mode,"wireframe"))
+ {
+ pp->display_mode = DISP_WIREFRAME;
+ }
+ else if (!strcasecmp(mode,"surface"))
+ {
+ pp->display_mode = DISP_SURFACE;
+ }
+ else if (!strcasecmp(mode,"transparent"))
+ {
+ pp->display_mode = DISP_TRANSPARENT;
+ }
+ else
+ {
+ pp->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+
+ pp->marks = marks;
+
+ /* Orientation marks don't make sense in wireframe mode. */
+ if (pp->display_mode == DISP_WIREFRAME)
+ pp->marks = False;
+
+ /* Set the appearance. */
+ if (!strcasecmp(appear,"random"))
+ {
+ pp->appearance = random() % NUM_APPEARANCES;
+ }
+ else if (!strcasecmp(appear,"solid"))
+ {
+ pp->appearance = APPEARANCE_SOLID;
+ }
+ else if (!strcasecmp(appear,"distance-bands"))
+ {
+ pp->appearance = APPEARANCE_DISTANCE_BANDS;
+ }
+ else if (!strcasecmp(appear,"direction-bands"))
+ {
+ pp->appearance = APPEARANCE_DIRECTION_BANDS;
+ }
+ else
+ {
+ pp->appearance = random() % NUM_APPEARANCES;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_mode,"random"))
+ {
+ pp->colors = random() % NUM_COLORS;
+ }
+ else if (!strcasecmp(color_mode,"two-sided"))
+ {
+ pp->colors = COLORS_TWOSIDED;
+ }
+ else if (!strcasecmp(color_mode,"distance"))
+ {
+ pp->colors = COLORS_DISTANCE;
+ }
+ else if (!strcasecmp(color_mode,"direction"))
+ {
+ pp->colors = COLORS_DIRECTION;
+ }
+ else
+ {
+ pp->colors = random() % NUM_COLORS;
+ }
+
+ /* Set the view mode. */
+ if (!strcasecmp(view_mode,"random"))
+ {
+ pp->view = random() % NUM_VIEW_MODES;
+ }
+ else if (!strcasecmp(view_mode,"walk"))
+ {
+ pp->view = VIEW_WALK;
+ }
+ else if (!strcasecmp(view_mode,"turn"))
+ {
+ pp->view = VIEW_TURN;
+ }
+ else
+ {
+ pp->view = random() % NUM_VIEW_MODES;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj,"random"))
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (pp->view == VIEW_TURN)
+ pp->projection = random() % NUM_DISP_MODES;
+ else
+ pp->projection = DISP_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj,"perspective"))
+ {
+ pp->projection = DISP_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj,"orthographic"))
+ {
+ pp->projection = DISP_ORTHOGRAPHIC;
+ }
+ else
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (pp->view == VIEW_TURN)
+ pp->projection = random() % NUM_DISP_MODES;
+ else
+ pp->projection = DISP_PERSPECTIVE;
+ }
+
+ /* make multiple screens rotate at slightly different rates. */
+ pp->speed_scale = 0.9 + frand(0.3);
+
+ if ((pp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_romanboy(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_romanboy(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ romanboystruct *pp;
+
+ if (romanboy == NULL)
+ return;
+ pp = &romanboy[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(display,window,*(pp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ display_romanboy(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * The display is being taken away from us. Free up malloc'ed
+ * memory and X resources that we've alloc'ed.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void free_romanboy(ModeInfo *mi)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ if (pp->pp)
+ (void) free((void *)pp->pp);
+ if (pp->pn)
+ (void) free((void *)pp->pn);
+ if (pp->col)
+ (void) free((void *)pp->col);
+ if (pp->tex)
+ (void) free((void *)pp->tex);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_romanboy(ModeInfo *mi)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(pp->glx_context));
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("RomanBoy", romanboy)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/romanboy.man b/hacks/glx/romanboy.man
new file mode 100644
index 0000000..2957a0e
--- /dev/null
+++ b/hacks/glx/romanboy.man
@@ -0,0 +1,390 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+romanboy - Draws a 3d immersion of the real projective plane that
+smoothly deforms between the Roman surface and the Boy surface.
+.SH SYNOPSIS
+.B romanboy
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-mode \fIdisplay-mode\fP]
+[\-wireframe]
+[\-surface]
+[\-transparent]
+[\-appearance \fIappearance\fP]
+[\-solid]
+[\-distance-bands]
+[\-direction-bands]
+[\-colors \fIcolor-scheme\fP]
+[\-twosided-colors]
+[\-distance-colors]
+[\-direction-colors]
+[\-view-mode \fIview-mode\fP]
+[\-walk]
+[\-turn]
+[\-no-deform]
+[\-deformation-speed \fIfloat\fP]
+[\-initial-deformation \fIfloat\fP]
+[\-roman]
+[\-boy]
+[\-surface-order \fInumber\fP]
+[\-orientation-marks]
+[\-projection \fImode\fP]
+[\-perspective]
+[\-orthographic]
+[\-speed-x \fIfloat\fP]
+[\-speed-y \fIfloat\fP]
+[\-speed-z \fIfloat\fP]
+[\-walk-direction \fIfloat\fP]
+[\-walk-speed \fIfloat\fP]
+.SH DESCRIPTION
+The \fIromanboy\fP program shows a 3d immersion of the real projective
+plane that smoothly deforms between the Roman surface and the Boy
+surface. You can walk on the projective plane or turn in 3d. The
+smooth deformation (homotopy) between these two famous immersions of
+the real projective plane was constructed by François Apéry.
+.PP
+The real projective plane is a non-orientable surface. To make this
+apparent, the two-sided color mode can be used. Alternatively,
+orientation markers (curling arrows) can be drawn as a texture map on
+the surface of the projective plane. While walking on the projective
+plane, you will notice that the orientation of the curling arrows
+changes (which it must because the projective plane is
+non-orientable).
+.PP
+The real projective plane is a model for the projective geometry in 2d
+space. One point can be singled out as the origin. A line can be
+singled out as the line at infinity, i.e., a line that lies at an
+infinite distance to the origin. The line at infinity is
+topologically a circle. Points on the line at infinity are also used
+to model directions in projective geometry. The origin can be
+visualized in different manners. When using distance colors, the
+origin is the point that is displayed as fully saturated red, which is
+easier to see as the center of the reddish area on the projective
+plane. Alternatively, when using distance bands, the origin is the
+center of the only band that projects to a disk. When using direction
+bands, the origin is the point where all direction bands collapse to a
+point. Finally, when orientation markers are being displayed, the
+origin the the point where all orientation markers are compressed to a
+point. The line at infinity can also be visualized in different ways.
+When using distance colors, the line at infinity is the line that is
+displayed as fully saturated magenta. When two-sided colors are used,
+the line at infinity lies at the points where the red and green
+"sides" of the projective plane meet (of course, the real projective
+plane only has one side, so this is a design choice of the
+visualization). Alternatively, when orientation markers are being
+displayed, the line at infinity is the place where the orientation
+markers change their orientation.
+.PP
+Note that when the projective plane is displayed with bands, the
+orientation markers are placed in the middle of the bands. For
+distance bands, the bands are chosen in such a way that the band at
+the origin is only half as wide as the remaining bands, which results
+in a disk being displayed at the origin that has the same diameter as
+the remaining bands. This choice, however, also implies that the band
+at infinity is half as wide as the other bands. Since the projective
+plane is attached to itself (in a complicated fashion) at the line at
+infinity, effectively the band at infinity is again as wide as the
+remaining bands. However, since the orientation markers are displayed
+in the middle of the bands, this means that only one half of the
+orientation markers will be displayed twice at the line at infinity if
+distance bands are used. If direction bands are used or if the
+projective plane is displayed as a solid surface, the orientation
+markers are displayed fully at the respective sides of the line at
+infinity.
+.PP
+The immersed projective plane can be projected to the screen either
+perspectively or orthographically. When using the walking modes,
+perspective projection to the screen will be used.
+.PP
+There are three display modes for the projective plane: mesh
+(wireframe), solid, or transparent. Furthermore, the appearance of
+the projective plane can be as a solid object or as a set of
+see-through bands. The bands can be distance bands, i.e., bands that
+lie at increasing distances from the origin, or direction bands, i.e.,
+bands that lie at increasing angles with respect to the origin.
+.PP
+When the projective plane is displayed with direction bands, you will
+be able to see that each direction band (modulo the "pinching" at the
+origin) is a Moebius strip, which also shows that the projective plane
+is non-orientable.
+.PP
+Finally, the colors with with the projective plane is drawn can be set
+to two-sided, distance, or direction. In two-sided mode, the
+projective plane is drawn with red on one "side" and green on the
+"other side". As described above, the projective plane only has one
+side, so the color jumps from red to green along the line at infinity.
+This mode enables you to see that the projective plane is
+non-orientable. In distance mode, the projective plane is displayed
+with fully saturated colors that depend on the distance of the points
+on the projective plane to the origin. The origin is displayed in
+red, the line at infinity is displayed in magenta. If the projective
+plane is displayed as distance bands, each band will be displayed with
+a different color. In direction mode, the projective plane is
+displayed with fully saturated colors that depend on the angle of the
+points on the projective plane with respect to the origin. Angles in
+opposite directions to the origin (e.g., 15 and 205 degrees) are
+displayed in the same color since they are projectively equivalent.
+If the projective plane is displayed as direction bands, each band
+will be displayed with a different color.
+.PP
+The rotation speed for each of the three coordinate axes around which
+the projective plane rotates can be chosen.
+.PP
+Furthermore, in the walking mode the walking direction in the 2d base
+square of the projective plane and the walking speed can be chosen.
+The walking direction is measured as an angle in degrees in the 2d
+square that forms the coordinate system of the surface of the
+projective plane. A value of 0 or 180 means that the walk is along a
+circle at a randomly chosen distance from the origin (parallel to a
+distance band). A value of 90 or 270 means that the walk is directly
+from the origin to the line at infinity and back (analogous to a
+direction band). Any other value results in a curved path from the
+origin to the line at infinity and back.
+.PP
+By default, the immersion of the real projective plane smoothly
+deforms between the Roman and Boy surfaces. It is possible to choose
+the speed of the deformation. Furthermore, it is possible to switch
+the deformation off. It is also possible to determine the initial
+deformation of the immersion. This is mostly useful if the
+deformation is switched off, in which case it will determine the
+appearance of the surface.
+.PP
+As a final option, it is possible to display generalized versions of
+the immersion discussed above by specifying the order of the surface.
+The default surface order of 3 results in the immersion of the real
+projective described above. The surface order can be chosen between 2
+and 9. Odd surface orders result in generalized immersions of the
+real projective plane, while even numbers result in a immersion of a
+topological sphere (which is orientable). The most interesting even
+case is a surface order of 2, which results in an immersion of the
+halfway model of Morin's sphere eversion (if the deformation is
+switched off).
+.PP
+This program is inspired by François Apéry's book "Models of the Real
+Projective Plane", Vieweg, 1987.
+.SH OPTIONS
+.I romanboy
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 10000, or 1/100th second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.PP
+The following four options are mutually exclusive. They determine how
+the projective plane is displayed.
+.TP 8
+.B \-mode random
+Display the projective plane in a random display mode (default).
+.TP 8
+.B \-mode wireframe \fP(Shortcut: \fB\-wireframe\fP)
+Display the projective plane as a wireframe mesh.
+.TP 8
+.B \-mode surface \fP(Shortcut: \fB\-surface\fP)
+Display the projective plane as a solid surface.
+.TP 8
+.B \-mode transparent \fP(Shortcut: \fB\-transparent\fP)
+Display the projective plane as a transparent surface.
+.PP
+The following four options are mutually exclusive. They determine the
+appearance of the projective plane.
+.TP 8
+.B \-appearance random
+Display the projective plane with a random appearance (default).
+.TP 8
+.B \-appearance solid \fP(Shortcut: \fB\-solid\fP)
+Display the projective plane as a solid object.
+.TP 8
+.B \-appearance distance-bands \fP(Shortcut: \fB\-distance-bands\fP)
+Display the projective plane as see-through bands that lie at
+increasing distances from the origin.
+.PP
+.TP 8
+.B \-appearance direction-bands \fP(Shortcut: \fB\-direction-bands\fP)
+Display the projective plane as see-through bands that lie at
+increasing angles with respect to the origin.
+.PP
+The following four options are mutually exclusive. They determine how
+to color the projective plane.
+.TP 8
+.B \-colors random
+Display the projective plane with a random color scheme (default).
+.TP 8
+.B \-colors twosided \fP(Shortcut: \fB\-twosided-colors\fP)
+Display the projective plane with two colors: red on one "side" and
+green on the "other side." Note that the line at infinity lies at the
+points where the red and green "sides" of the projective plane meet,
+i.e., where the orientation of the projective plane reverses.
+.TP 8
+.B \-colors distance \fP(Shortcut: \fB\-distance-colors\fP)
+Display the projective plane with fully saturated colors that depend
+on the distance of the points on the projective plane to the origin.
+The origin is displayed in red, the line at infinity is displayed in
+magenta. If the projective plane is displayed as distance bands, each
+band will be displayed with a different color.
+.TP 8
+.B \-colors direction \fP(Shortcut: \fB\-direction-colors\fP)
+Display the projective plane with fully saturated colors that depend
+on the angle of the points on the projective plane with respect to the
+origin. Angles in opposite directions to the origin (e.g., 15 and 205
+degrees) are displayed in the same color since they are projectively
+equivalent. If the projective plane is displayed as direction bands,
+each band will be displayed with a different color.
+.PP
+The following three options are mutually exclusive. They determine
+how to view the projective plane.
+.TP 8
+.B \-view-mode random
+View the projective plane in a random view mode (default).
+.TP 8
+.B \-view-mode turn \fP(Shortcut: \fB\-turn\fP)
+View the projective plane while it turns in 3d.
+.TP 8
+.B \-view-mode walk \fP(Shortcut: \fB\-walk\fP)
+View the projective plane as if walking on its surface.
+.PP
+The following options determine whether the surface is being deformed.
+.TP 8
+.B \-deform
+Deform the surface smoothly between the Roman and Boy surfaces
+(default).
+.TP 8
+.B \-no-deform
+Don't deform the surface.
+.PP
+The following option determines the deformation speed.
+.TP 8
+.B \-deformation-speed \fIfloat\fP
+The deformation speed is measured in percent of some sensible maximum
+speed (default: 10.0).
+.PP
+The following options determine the initial deformation of the
+surface. As described above, this is mostly useful if
+\fB\-no-deform\fP is specified.
+.TP 8
+.B \-initial-deformation \fIfloat\fP
+The initial deformation is specified as a number between 0 and 1000.
+A value of 0 corresponds to the Roman surface, while a value of 1000
+corresponds to the Boy surface. The default value is 1000.
+.TP 8
+.B \-roman
+This is a shortcut for \fB\-initial-deformation 0\fP.
+.TP 8
+.B \-boy
+This is a shortcut for \fB\-initial-deformation 1000\fP.
+.PP
+The following option determines the order of the surface to be
+displayed.
+.TP 8
+.B \-surface-order \fInumber\fP
+The surface order can be set to values between 2 and 9 (default: 3).
+As described above, odd surface orders result in generalized
+immersions of the real projective plane, while even numbers result in
+a immersion of a topological sphere.
+.PP
+The following options determine whether orientation marks are shown on
+the projective plane.
+.TP 8
+.B \-orientation-marks
+Display orientation marks on the projective plane.
+.TP 8
+.B \-no-orientation-marks
+Don't display orientation marks on the projective plane (default).
+.PP
+The following three options are mutually exclusive. They determine
+how the projective plane is projected from 3d to 2d (i.e., to the
+screen).
+.TP 8
+.B \-projection random
+Project the projective plane from 3d to 2d using a random projection
+mode (default).
+.TP 8
+.B \-projection perspective \fP(Shortcut: \fB\-perspective\fP)
+Project the projective plane from 3d to 2d using a perspective
+projection.
+.TP 8
+.B \-projection orthographic \fP(Shortcut: \fB\-orthographic\fP)
+Project the projective plane from 3d to 2d using an orthographic
+projection.
+.PP
+The following three options determine the rotation speed of the
+projective plane around the three possible axes. The rotation speed
+is measured in degrees per frame. The speeds should be set to
+relatively small values, e.g., less than 4 in magnitude. In walk
+mode, all speeds are ignored.
+.TP 8
+.B \-speed-x \fIfloat\fP
+Rotation speed around the x axis (default: 1.1).
+.TP 8
+.B \-speed-y \fIfloat\fP
+Rotation speed around the y axis (default: 1.3).
+.TP 8
+.B \-speed-z \fIfloat\fP
+Rotation speed around the z axis (default: 1.5).
+.PP
+The following two options determine the walking speed and direction.
+.TP 8
+.B \-walk-direction \fIfloat\fP
+The walking direction is measured as an angle in degrees in the 2d
+square that forms the coordinate system of the surface of the
+projective plane (default: 83.0). A value of 0 or 180 means that the
+walk is along a circle at a randomly chosen distance from the origin
+(parallel to a distance band). A value of 90 or 270 means that the
+walk is directly from the origin to the line at infinity and back
+(analogous to a direction band). Any other value results in a curved
+path from the origin to the line at infinity and back.
+.TP 8
+.B \-walk-speed \fIfloat\fP
+The walking speed is measured in percent of some sensible maximum
+speed (default: 20.0).
+.SH INTERACTION
+If you run this program in standalone mode in its turn mode, you can
+rotate the projective plane by dragging the mouse while pressing the
+left mouse button. This rotates the projective plane in 3d. To
+examine the projective plane at your leisure, it is best to set all
+speeds to 0. Otherwise, the projective plane will rotate while the
+left mouse button is not pressed. This kind of interaction is not
+available in the walk mode.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013-2014 by Carsten Steger. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 03-oct-2014.
diff --git a/hacks/glx/rotator.c b/hacks/glx/rotator.c
new file mode 100644
index 0000000..ab05130
--- /dev/null
+++ b/hacks/glx/rotator.c
@@ -0,0 +1,274 @@
+/* xscreensaver, Copyright (c) 1998-2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "rotator.h"
+#include "yarandom.h"
+
+struct rotator {
+
+ double spin_x_speed, spin_y_speed, spin_z_speed; /* scaling factors >= 0. */
+ double wander_speed;
+
+ double rotx, roty, rotz; /* current object rotation, -1 to +1.
+ Sign indicates direction of motion.
+ 0.25 means +90 deg, positive velocity.
+ -0.25 means +90 deg, negative velocity
+ (not +270 deg or -90 deg!)
+ Yes, this is stupid.
+ */
+ double dx, dy, dz; /* current rotational velocity, >= 0. */
+ double ddx, ddy, ddz; /* current rotational acceleration, +/-. */
+ double d_max; /* max rotational velocity, > 0. */
+
+ int wander_frame; /* position in the wander cycle, >= 0. */
+};
+
+
+#undef ABS
+#define ABS(x) ((x)<0?-(x):(x))
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+/* Stay in the range [0-1).
+ 1.01 => 0.01.
+ -0.01 => 0.99
+ */
+#define CLAMP(i) do { \
+ while ((i) < 0) (i)++; \
+ while ((i) >= 1) (i)--; \
+ } while (0)
+
+#undef EPSILON
+#define EPSILON 0.000001
+
+
+static void
+rotate_1 (double *pos, double *v, double *dv, double speed, double max_v)
+{
+ /* Sign of *pos is direction of motion.
+ Sign of *v is always positive.
+ It would make way more sense for *v to indicate direction of motion.
+ What was I thinking?
+ */
+
+ double ppos = *pos;
+
+ if (speed == 0) return;
+
+ /* tick position */
+ if (ppos < 0)
+ /* Ignore but preserve the sign on ppos. It's kind of like:
+ ppos = old_sign * (abs(ppos) + (v * old_sign))
+ This is why it would make more sense for that sign bit to be on v.
+ */
+ ppos = -(ppos + *v);
+ else
+ ppos += *v;
+
+ CLAMP (ppos);
+ *pos = (*pos > 0 ? ppos : -ppos); /* preserve old sign bit on pos. */
+
+ /* accelerate */
+ *v += *dv;
+
+ /* clamp velocity */
+ if (*v > max_v || *v < -max_v)
+ {
+ *dv = -*dv;
+ }
+ /* If it stops, start it going in the other direction. */
+ /* Since *v is always positive, <= 0 means stopped. */
+ else if (*v < 0)
+ {
+ if (random() % 4)
+ {
+ *v = 0; /* don't let velocity be negative */
+
+ if (random() % 2) /* stay stopped, and kill acceleration */
+ *dv = 0;
+ else if (*dv < 0) /* was decelerating, accelerate instead */
+ *dv = -*dv;
+ }
+ else
+ {
+ *v = -*v; /* switch to tiny positive velocity, or zero */
+ *dv = -*dv; /* toggle acceleration */
+ *pos = -*pos; /* reverse direction of motion */
+ }
+ }
+
+ /* Alter direction of rotational acceleration randomly. */
+ if (! (random() % 120))
+ *dv = -*dv;
+
+ /* Change acceleration very occasionally. */
+ if (! (random() % 200))
+ {
+#if 0 /* this might make more sense: */
+ if (*dv > -EPSILON && *dv < EPSILON)
+ *dv += 10 * (*dv < 0 ? -EPSILON : EPSILON);
+#else
+ if (*dv == 0)
+ *dv = 0.00001;
+#endif
+ else if (random() & 1)
+ *dv *= 1.2;
+ else
+ *dv *= 0.8;
+ }
+}
+
+
+/* Returns a rotator object, which encapsulates rotation and motion state.
+
+ spin_[xyz]_speed indicates the relative speed of rotation.
+ Specify 0 if you don't want any rotation around that axis.
+
+ spin_accel specifies a scaling factor for the acceleration that is
+ randomly applied to spin: if you want the speed to change faster,
+ make this > 1.
+
+ wander_speed indicates the relative speed through space.
+
+ If randomize_initial_state_p is true, then the initial position and
+ rotation will be randomized (even if the spin speeds are 0.) If it
+ is false, then all values will be initially zeroed.
+ */
+rotator *
+make_rotator (double spin_x_speed,
+ double spin_y_speed,
+ double spin_z_speed,
+ double spin_accel,
+ double wander_speed,
+ int randomize_initial_state_p)
+{
+ rotator *r = (rotator *) calloc (1, sizeof(*r));
+ double d, dd;
+
+ if (!r) return 0;
+
+ if (spin_x_speed < 0 || spin_y_speed < 0 || spin_z_speed < 0 ||
+ wander_speed < 0)
+ abort();
+
+ r->spin_x_speed = spin_x_speed;
+ r->spin_y_speed = spin_y_speed;
+ r->spin_z_speed = spin_z_speed;
+ r->wander_speed = wander_speed;
+
+ if (randomize_initial_state_p)
+ {
+ /* Sign on position is direction of travel. Stripped before returned. */
+ r->rotx = frand(1.0) * RANDSIGN();
+ r->roty = frand(1.0) * RANDSIGN();
+ r->rotz = frand(1.0) * RANDSIGN();
+
+ r->wander_frame = random() % 0xFFFF;
+ }
+ else
+ {
+ r->rotx = r->roty = r->rotz = 0;
+ r->wander_frame = 0;
+ }
+
+ d = 0.006;
+ dd = 0.00006;
+
+ r->dx = BELLRAND(d * r->spin_x_speed);
+ r->dy = BELLRAND(d * r->spin_y_speed);
+ r->dz = BELLRAND(d * r->spin_z_speed);
+
+ r->d_max = r->dx * 2;
+
+ r->ddx = (dd + frand(dd+dd)) * r->spin_x_speed * spin_accel;
+ r->ddy = (dd + frand(dd+dd)) * r->spin_y_speed * spin_accel;
+ r->ddz = (dd + frand(dd+dd)) * r->spin_z_speed * spin_accel;
+
+# if 0
+ fprintf (stderr, "rotator:\n");
+ fprintf (stderr, " wander: %3d %6.2f\n", r->wander_frame, r->wander_speed);
+ fprintf (stderr, " speed: %6.2f %6.2f %6.2f\n",
+ r->spin_x_speed, r->spin_y_speed, r->spin_z_speed);
+ fprintf (stderr, " rot: %6.2f %6.2f %6.2f\n",
+ r->rotx, r->roty, r->rotz);
+ fprintf (stderr, " d: %6.2f %6.2f %6.2f, %6.2f\n",
+ r->dx, r->dy, r->dz,
+ r->d_max);
+ fprintf (stderr, " dd: %6.2f %6.2f %6.2f\n",
+ r->ddx, r->ddy, r->ddz);
+# endif
+
+ return r;
+}
+
+
+void
+free_rotator (rotator *r)
+{
+ free (r);
+}
+
+void
+get_rotation (rotator *rot, double *x_ret, double *y_ret, double *z_ret,
+ int update_p)
+{
+ double x, y, z;
+
+ if (update_p) {
+ rotate_1 (&rot->rotx, &rot->dx, &rot->ddx, rot->spin_x_speed, rot->d_max);
+ rotate_1 (&rot->roty, &rot->dy, &rot->ddy, rot->spin_y_speed, rot->d_max);
+ rotate_1 (&rot->rotz, &rot->dz, &rot->ddz, rot->spin_z_speed, rot->d_max);
+ }
+
+ x = rot->rotx;
+ y = rot->roty;
+ z = rot->rotz;
+ if (x < 0) x = -x;
+ if (y < 0) y = -y;
+ if (z < 0) z = -z;
+
+ if (x_ret) *x_ret = x;
+ if (y_ret) *y_ret = y;
+ if (z_ret) *z_ret = z;
+}
+
+
+void
+get_position (rotator *rot, double *x_ret, double *y_ret, double *z_ret,
+ int update_p)
+{
+ double x = 0.5, y = 0.5, z = 0.5;
+
+ if (rot->wander_speed != 0)
+ {
+ if (update_p)
+ rot->wander_frame++;
+
+# define SINOID(F) ((1 + sin((rot->wander_frame * (F)) / 2 * M_PI)) / 2.0)
+ x = SINOID (0.71 * rot->wander_speed);
+ y = SINOID (0.53 * rot->wander_speed);
+ z = SINOID (0.37 * rot->wander_speed);
+# undef SINOID
+ }
+
+ if (x_ret) *x_ret = x;
+ if (y_ret) *y_ret = y;
+ if (z_ret) *z_ret = z;
+}
diff --git a/hacks/glx/rotator.h b/hacks/glx/rotator.h
new file mode 100644
index 0000000..b3f36f6
--- /dev/null
+++ b/hacks/glx/rotator.h
@@ -0,0 +1,60 @@
+/* xscreensaver, Copyright (c) 1998-2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __ROTATOR_H__
+#define __ROTATOR_H__
+
+typedef struct rotator rotator;
+
+/* Returns a rotator object, which encapsulates rotation and motion state.
+
+ spin_[xyz]_speed indicates the relative speed of rotation.
+ Specify 0 if you don't want any rotation around that axis.
+
+ spin_accel specifies a scaling factor for the acceleration that is
+ randomly applied to spin: if you want the speed to change faster,
+ make this > 1.
+
+ wander_speed indicates the relative speed through space.
+
+ If randomize_initial_state_p is true, then the initial position and
+ rotation will be randomized (even if the spin speeds are 0.) If it
+ is false, then all values will be initially zeroed.
+ */
+extern rotator *make_rotator (double spin_x_speed,
+ double spin_y_speed,
+ double spin_z_speed,
+ double spin_accel,
+ double wander_speed,
+ int randomize_initial_state_p);
+
+/* Rotates one step, and returns the new rotation values.
+ x, y, and z range from 0.0-1.0, the fraction through the circle
+ (*not* radians or degrees!)
+ If `update_p' is non-zero, then (maybe) rotate first.
+ */
+extern void get_rotation (rotator *rot,
+ double *x_ret, double *y_ret, double *z_ret,
+ int update_p);
+
+/* Moves one step, and returns the new position values.
+ x, y, and z range from 0.0-1.0, the fraction through space:
+ scale those values as needed.
+ If `update_p' is non-zero, then (maybe) move first.
+ */
+extern void get_position (rotator *rot,
+ double *x_ret, double *y_ret, double *z_ret,
+ int update_p);
+
+/* Destroys and frees a `rotator' object. */
+extern void free_rotator (rotator *r);
+
+#endif /* __ROTATOR_H__ */
diff --git a/hacks/glx/rubik.c b/hacks/glx/rubik.c
new file mode 100644
index 0000000..ed06645
--- /dev/null
+++ b/hacks/glx/rubik.c
@@ -0,0 +1,2140 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* rubik --- Shows an auto-solving Rubik's cube */
+
+#if 0
+static const char sccsid[] = "@(#)rubik.c 5.01 2001/03/01 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * This mode shows an auto-solving rubik's cube "puzzle". If somebody
+ * intends to make a game or something based on this code, please let me
+ * know first, my e-mail address is provided in this comment. Marcelo.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistakes.
+ *
+ * My e-mail address is
+ * mfvianna@centroin.com.br
+ *
+ * Marcelo F. Vianna (Jul-31-1997)
+ *
+ * Revision History:
+ * 05-Apr-2002: Removed all gllist uses (fix some bug with nvidia driver)
+ * 01-Mar-2001: Added FPS stuff - Eric Lassauge <lassauge@mail.dotcom.fr>
+ * 01-Nov-2000: Allocation checks
+ * 27-Apr-1999: LxMxN stuff added.
+ * 26-Sep-1998: Added some more movement (the cube does not stay in the screen
+ * center anymore. Also fixed the scale problem immediately after
+ * shuffling when the puzzle is solved.
+ * 08-Aug-1997: Now has some internals from xrubik by David Bagley
+ * This should make it easier to add features.
+ * 02-Aug-1997: Now behaves more like puzzle.c: first show the cube being
+ * shuffled and then being solved. A mode specific option was
+ * added:
+ * "+/-hideshuffling" to provide the original behavior (in which
+ * only the solution is shown).
+ * The color labels corners are now rounded.
+ * Optimized the cubit() routine using glLists.
+ * 01-Aug-1997: Shuffling now avoids movements that undoes the previous
+ * movement and three consecutive identical moves (which is
+ * pretty stupid).
+ * improved the "cycles" option in replacement of David's hack,
+ * now rp->anglestep is a GLfloat, so this option selects the
+ * "exact" number of frames that a rotation (movement) takes to
+ * complete.
+ * 30-Jul-1997: Initial release, there is no algorithm to solve the puzzle,
+ * instead, it randomly shuffle the cube and then make the
+ * movements in the reverse order.
+ * The mode was written in 1 day (I got sick and had the day off).
+ * There was not much to do since I could not leave home... :)
+ */
+
+/*-
+ * Color labels mapping:
+ * =====================
+ *
+ * +-----------+
+ * |0--> |
+ * || |
+ * |v TOP(0) |
+ * | |
+ * | 8|
+ * +-----------+-----------+-----------+
+ * |0--> |0--> |0--> |
+ * || || || |
+ * |v LEFT(1) |v FRONT(2) |v RIGHT(3) |
+ * | | | |
+ * | 8| 8| 8|
+ * +-----------+-----------+-----------+
+ * |0--> |
+ * || |
+ * |v BOTTOM(4)|
+ * | |
+ * | 8|
+ * +-----------+ +---+---+---+
+ * |0--> | | 0 | 1 | 2 |
+ * || | |--xxxxx(N)-+
+ * |v BACK(5) | | 3 | 4 | 5 |
+ * | | +---+---+---+
+ * | 8| | 6 | 7 | 8 |
+ * +-----------+ +---+---+---+
+ *
+ * Map to 3d
+ * FRONT => X, Y
+ * BACK => X, Y
+ * LEFT => Z, Y
+ * RIGHT => Z, Y
+ * TOP => X, Z
+ * BOTTOM => X, Z
+ */
+
+#ifdef STANDALONE
+# define MODE_rubik
+# define DEFAULTS "*delay: 20000 \n" \
+ "*count: -30 \n" \
+ "*showFPS: False \n" \
+ "*cycles: 20 \n" \
+ "*size: -6 \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_rubik 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# include "vis.h"
+#endif /* !STANDALONE */
+
+#include "gltrackball.h"
+
+#ifdef MODE_rubik
+
+#define DEF_SIZEX "0"
+#define DEF_SIZEY "0"
+#define DEF_SIZEZ "0"
+#define DEF_HIDESHUFFLING "False"
+
+static int sizex;
+static int sizey;
+static int sizez;
+static Bool hideshuffling;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-sizex", ".rubik.sizex", XrmoptionSepArg, 0},
+ {"-sizey", ".rubik.sizey", XrmoptionSepArg, 0},
+ {"-sizez", ".rubik.sizez", XrmoptionSepArg, 0},
+ {"-hideshuffling", ".rubik.hideshuffling", XrmoptionNoArg, "on"},
+ {"+hideshuffling", ".rubik.hideshuffling", XrmoptionNoArg, "off"}
+};
+
+static argtype vars[] =
+{
+ {&sizex, "sizex", "SizeX", DEF_SIZEX, t_Int},
+ {&sizey, "sizey", "SizeY", DEF_SIZEY, t_Int},
+ {&sizez, "sizez", "SizeZ", DEF_SIZEZ, t_Int},
+ {&hideshuffling, "hideshuffling", "Hideshuffling", DEF_HIDESHUFFLING, t_Bool}
+};
+
+static OptionStruct desc[] =
+{
+ {"-sizex num", "number of cubies along x axis (overrides size)"},
+ {"-sizey num", "number of cubies along y axis (overrides size)"},
+ {"-sizez num", "number of cubies along z axis (overrides size)"},
+ {"-/+hideshuffling", "turn on/off hidden shuffle phase"}
+};
+
+ENTRYPOINT ModeSpecOpt rubik_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct rubik_description =
+{"rubik", "init_rubik", "draw_rubik", (char *) NULL,
+ "draw_rubik", "change_rubik", "free_rubik", &rubik_opts,
+ 10000, -30, 5, -6, 64, 1.0, "",
+ "Shows an auto-solving Rubik's Cube", 0, NULL};
+
+#endif
+
+#define VectMul(X1,Y1,Z1,X2,Y2,Z2) (Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2)
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+
+#define ACTION_SOLVE 1
+#define ACTION_SHUFFLE 0
+
+#define DELAY_AFTER_SHUFFLING 5
+#define DELAY_AFTER_SOLVING 20
+
+/*************************************************************************/
+
+#define MINSIZE 2
+#define MAXSIZEX (rp->sizex)
+#define MAXSIZEY (rp->sizey)
+#define MAXSIZEZ (rp->sizez)
+#define AVSIZE ((rp->sizex+rp->sizey+rp->sizez)/3.0) /* Use of this should be minimized */
+#define MAXMAXSIZE (MAX(MAXSIZEX,MAX(MAXSIZEY,MAXSIZEZ)))
+#define MAXSIZEXY (MAXSIZEX*MAXSIZEY)
+#define MAXSIZEYZ (MAXSIZEY*MAXSIZEZ)
+#define MAXSIZEZX (MAXSIZEZ*MAXSIZEX)
+#define LASTX (MAXSIZEX-1)
+#define LASTY (MAXSIZEY-1)
+#define LASTZ (MAXSIZEZ-1)
+/* These are not likely to change but... */
+#define FIRSTX 0
+#define FIRSTY 0
+#define FIRSTZ 0
+
+#define Scale4Window (0.9/AVSIZE)
+#define Scale4Iconic (2.1/AVSIZE)
+
+#define MAXORIENT 4 /* Number of orientations of a square */
+#define MAXFACES 6 /* Number of faces */
+
+/* Directions relative to the face of a cubie */
+#define TOP 0
+#define RIGHT 1
+#define BOTTOM 2
+#define LEFT 3
+#define CW (MAXORIENT+1)
+#define HALF (MAXORIENT+2)
+#define CCW (2*MAXORIENT-1)
+
+#define TOP_FACE 0
+#define LEFT_FACE 1
+#define FRONT_FACE 2
+#define RIGHT_FACE 3
+#define BOTTOM_FACE 4
+#define BACK_FACE 5
+#define NO_FACE (MAXFACES)
+#define NO_ROTATION (2*MAXORIENT)
+#define NO_DEPTH MAXMAXSIZE
+
+#define REVX(a) (MAXSIZEX - a - 1)
+#define REVY(a) (MAXSIZEY - a - 1)
+#define REVZ(a) (MAXSIZEZ - a - 1)
+
+#define CUBELEN 0.50
+#define CUBEROUND (CUBELEN-0.05)
+#define STICKERLONG (CUBEROUND-0.05)
+#define STICKERSHORT (STICKERLONG-0.05)
+#define STICKERDEPTH (CUBELEN+0.01)
+
+#define ObjCubit 0
+#define MaxObj 1
+typedef struct _RubikLoc {
+ int face;
+ int rotation; /* Not used yet */
+} RubikLoc;
+
+typedef struct _RubikRowNext {
+ int face, direction, sideFace;
+} RubikRowNext;
+
+typedef struct _RubikMove {
+ int face, direction;
+ int position;
+} RubikMove;
+
+typedef struct _RubikSlice {
+ int face, rotation;
+ int depth;
+} RubikSlice;
+
+/*-
+ * Pick a face and a direction on face the next face and orientation
+ * is then known.
+ */
+static const RubikLoc slideNextRow[MAXFACES][MAXORIENT] =
+{
+ {
+ {5, TOP},
+ {3, RIGHT},
+ {2, TOP},
+ {1, LEFT}},
+ {
+ {0, RIGHT},
+ {2, TOP},
+ {4, LEFT},
+ {5, BOTTOM}},
+ {
+ {0, TOP},
+ {3, TOP},
+ {4, TOP},
+ {1, TOP}},
+ {
+ {0, LEFT},
+ {5, BOTTOM},
+ {4, RIGHT},
+ {2, TOP}},
+ {
+ {2, TOP},
+ {3, LEFT},
+ {5, TOP},
+ {1, RIGHT}},
+ {
+ {4, TOP},
+ {3, BOTTOM},
+ {0, TOP},
+ {1, BOTTOM}}
+};
+
+/*-
+ * Examine cubie 0 on each face, its 4 movements (well only 2 since the
+ * other 2 will be opposites) and translate it into slice movements).
+ * CW = DEEP Depth CCW == SHALLOW Depth with reference to faces 0, 1, and 2
+ */
+static const RubikLoc rotateSlice[MAXFACES][MAXORIENT / 2] =
+{
+ {
+ {1, CCW},
+ {2, CW},
+ },
+ {
+ {2, CW},
+ {0, CCW},
+ },
+ {
+ {1, CCW},
+ {0, CCW},
+ },
+ {
+ {2, CCW},
+ {0, CCW},
+ },
+ {
+ {1, CCW},
+ {2, CCW},
+ },
+ {
+ {1, CCW},
+ {0, CW},
+ }
+};
+
+/*-
+ * Rotate face clockwise by a number of orients, then the top of the
+ * face then points to this face
+ */
+static const int rowToRotate[MAXFACES][MAXORIENT] =
+{
+ {3, 2, 1, 5},
+ {2, 4, 5, 0},
+ {3, 4, 1, 0},
+ {5, 4, 2, 0},
+ {3, 5, 1, 2},
+ {3, 0, 1, 4}
+};
+
+/*
+ * This translates a clockwise move to something more manageable
+ */
+static const RubikRowNext rotateToRow[MAXFACES] = /*CW to min face */
+{
+ {1, LEFT, TOP},
+ {0, BOTTOM, RIGHT},
+ {0, RIGHT, BOTTOM},
+ {0, TOP, LEFT},
+ {1, RIGHT, BOTTOM},
+ {0, LEFT, TOP}
+};
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ RubikMove *moves;
+ int storedmoves;
+ int degreeTurn;
+ int shufflingmoves;
+ int sizex, sizey, sizez;
+ float avsize, avsizeSq;
+ int action;
+ int done;
+ GLfloat anglestep;
+ RubikLoc *cubeLoc[MAXFACES];
+ RubikLoc *rowLoc[MAXORIENT];
+ RubikMove movement;
+ GLfloat rotatestep;
+ GLfloat PX, PY, VX, VY;
+ GLXContext *glx_context;
+ Bool button_down_p;
+ trackball_state *trackball;
+} rubikstruct;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const float position0[] = {1.0, 1.0, 1.0, 0.0};
+static const float position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialRed[] = {0.5, 0.0, 0.0, 1.0};
+static const float MaterialGreen[] = {0.0, 0.5, 0.0, 1.0};
+static const float MaterialBlue[] = {0.0, 0.0, 0.5, 1.0};
+static const float MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};
+static const float MaterialOrange[] = {0.9, 0.45, 0.36, 1.0};
+
+#if 0
+static float MaterialMagenta[] = {0.7, 0.0, 0.7, 1.0};
+static float MaterialCyan[] = {0.0, 0.7, 0.7, 1.0};
+
+#endif
+static const float MaterialWhite[] = {0.8, 0.8, 0.8, 1.0};
+static const float MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+static const float MaterialGray3[] = {0.3, 0.3, 0.3, 1.0};
+static const float MaterialGray4[] = {0.4, 0.4, 0.4, 1.0};
+static const float MaterialGray5[] = {0.5, 0.5, 0.5, 1.0};
+static const float MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
+static const float MaterialGray7[] = {0.7, 0.7, 0.7, 1.0};
+
+static rubikstruct *rubik = (rubikstruct *) NULL;
+
+
+static void
+pickcolor(int C, int mono)
+{
+ switch (C) {
+ case TOP_FACE:
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray3);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+ break;
+ case LEFT_FACE:
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow);
+ break;
+ case FRONT_FACE:
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ break;
+ case RIGHT_FACE:
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray4);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGreen);
+ break;
+ case BOTTOM_FACE:
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray7);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialOrange);
+ break;
+ case BACK_FACE:
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlue);
+ break;
+#if 0
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialCyan);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialMagenta);
+#endif
+ }
+}
+
+static void
+faceSizes(rubikstruct * rp, int face, int * sizeOfRow, int * sizeOfColumn)
+{
+ switch (face) {
+ case 0: /* TOP */
+ case 4: /* BOTTOM */
+ *sizeOfRow = MAXSIZEX;
+ *sizeOfColumn = MAXSIZEZ;
+ break;
+ case 1: /* LEFT */
+ case 3: /* RIGHT */
+ *sizeOfRow = MAXSIZEZ;
+ *sizeOfColumn = MAXSIZEY;
+ break;
+ case 2: /* FRONT */
+ case 5: /* BACK */
+ *sizeOfRow = MAXSIZEX;
+ *sizeOfColumn = MAXSIZEY;
+ break;
+ default: abort();
+ }
+}
+
+static Bool
+checkFaceSquare(rubikstruct * rp, int face)
+{
+ int sizeOfRow, sizeOfColumn;
+
+ faceSizes(rp, face, &sizeOfRow, &sizeOfColumn);
+ return (sizeOfRow == sizeOfColumn);
+ /* Cubes can be made square with a 4x2 face where 90 degree turns
+ * should be permitted but that is kind of complicated for me.
+ * This can be done in 2 ways where the side of the cubies are
+ * the same size and one where one side (the side with half the
+ * number of cubies) is twice the size of the other. The first is
+ * complicated because faces of cubies can go under other faces.
+ * The second way is similar to "banded cubes" where scotch tape
+ * restricts the moves of some cubes. Here you have to keep track
+ * of the restrictions and show banded cubies graphically as one
+ * cube.
+ */
+}
+
+static int
+sizeFace(rubikstruct * rp, int face)
+{
+ int sizeOfRow, sizeOfColumn;
+
+ faceSizes(rp, face, &sizeOfRow, &sizeOfColumn);
+ return (sizeOfRow * sizeOfColumn);
+}
+
+static int
+sizeRow(rubikstruct * rp, int face)
+{
+ int sizeOfRow, sizeOfColumn; /* sizeOfColumn not used */
+
+ faceSizes(rp, face, &sizeOfRow, &sizeOfColumn);
+ return sizeOfRow;
+}
+
+static Bool
+draw_stickerless_cubit(rubikstruct *rp, unsigned long *polysP)
+{
+ glBegin(GL_QUADS);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+ /* Put sticker here */
+ glNormal3f(0.00, 0.00, 1.00);
+ glVertex3f(-CUBEROUND, -CUBEROUND, CUBELEN);
+ glVertex3f(CUBEROUND, -CUBEROUND, CUBELEN);
+ glVertex3f(CUBEROUND, CUBEROUND, CUBELEN);
+ glVertex3f(-CUBEROUND, CUBEROUND, CUBELEN);
+ (*polysP)++;
+ glNormal3f(0.00, 0.00, -1.00);
+ glVertex3f(-CUBEROUND, CUBEROUND, -CUBELEN);
+ glVertex3f(CUBEROUND, CUBEROUND, -CUBELEN);
+ glVertex3f(CUBEROUND, -CUBEROUND, -CUBELEN);
+ glVertex3f(-CUBEROUND, -CUBEROUND, -CUBELEN);
+ (*polysP)++;
+ glNormal3f(-1.00, 0.00, 0.00);
+ glVertex3f(-CUBELEN, -CUBEROUND, CUBEROUND);
+ glVertex3f(-CUBELEN, CUBEROUND, CUBEROUND);
+ glVertex3f(-CUBELEN, CUBEROUND, -CUBEROUND);
+ glVertex3f(-CUBELEN, -CUBEROUND, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(1.00, 0.00, 0.00);
+ glVertex3f(CUBELEN, -CUBEROUND, -CUBEROUND);
+ glVertex3f(CUBELEN, CUBEROUND, -CUBEROUND);
+ glVertex3f(CUBELEN, CUBEROUND, CUBEROUND);
+ glVertex3f(CUBELEN, -CUBEROUND, CUBEROUND);
+ (*polysP)++;
+ glNormal3f(0.00, -1.00, 0.00);
+ glVertex3f(CUBEROUND, -CUBELEN, -CUBEROUND);
+ glVertex3f(CUBEROUND, -CUBELEN, CUBEROUND);
+ glVertex3f(-CUBEROUND, -CUBELEN, CUBEROUND);
+ glVertex3f(-CUBEROUND, -CUBELEN, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(0.00, 1.00, 0.00);
+ glVertex3f(-CUBEROUND, CUBELEN, -CUBEROUND);
+ glVertex3f(-CUBEROUND, CUBELEN, CUBEROUND);
+ glVertex3f(CUBEROUND, CUBELEN, CUBEROUND);
+ glVertex3f(CUBEROUND, CUBELEN, -CUBEROUND);
+ (*polysP)++;
+
+ /* Edges of cubit */
+ glNormal3f(-1.00, -1.00, 0.00);
+ glVertex3f(-CUBEROUND, -CUBELEN, -CUBEROUND);
+ glVertex3f(-CUBEROUND, -CUBELEN, CUBEROUND);
+ glVertex3f(-CUBELEN, -CUBEROUND, CUBEROUND);
+ glVertex3f(-CUBELEN, -CUBEROUND, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(1.00, 1.00, 0.00);
+ glVertex3f(CUBEROUND, CUBELEN, -CUBEROUND);
+ glVertex3f(CUBEROUND, CUBELEN, CUBEROUND);
+ glVertex3f(CUBELEN, CUBEROUND, CUBEROUND);
+ glVertex3f(CUBELEN, CUBEROUND, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(-1.00, 1.00, 0.00);
+ glVertex3f(-CUBELEN, CUBEROUND, -CUBEROUND);
+ glVertex3f(-CUBELEN, CUBEROUND, CUBEROUND);
+ glVertex3f(-CUBEROUND, CUBELEN, CUBEROUND);
+ glVertex3f(-CUBEROUND, CUBELEN, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(1.00, -1.00, 0.00);
+ glVertex3f(CUBELEN, -CUBEROUND, -CUBEROUND);
+ glVertex3f(CUBELEN, -CUBEROUND, CUBEROUND);
+ glVertex3f(CUBEROUND, -CUBELEN, CUBEROUND);
+ glVertex3f(CUBEROUND, -CUBELEN, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(0.00, -1.00, -1.00);
+ glVertex3f(-CUBEROUND, -CUBEROUND, -CUBELEN);
+ glVertex3f(CUBEROUND, -CUBEROUND, -CUBELEN);
+ glVertex3f(CUBEROUND, -CUBELEN, -CUBEROUND);
+ glVertex3f(-CUBEROUND, -CUBELEN, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(0.00, 1.00, 1.00);
+ glVertex3f(-CUBEROUND, CUBEROUND, CUBELEN);
+ glVertex3f(CUBEROUND, CUBEROUND, CUBELEN);
+ glVertex3f(CUBEROUND, CUBELEN, CUBEROUND);
+ glVertex3f(-CUBEROUND, CUBELEN, CUBEROUND);
+ (*polysP)++;
+ glNormal3f(0.00, -1.00, 1.00);
+ glVertex3f(-CUBEROUND, -CUBELEN, CUBEROUND);
+ glVertex3f(CUBEROUND, -CUBELEN, CUBEROUND);
+ glVertex3f(CUBEROUND, -CUBEROUND, CUBELEN);
+ glVertex3f(-CUBEROUND, -CUBEROUND, CUBELEN);
+ (*polysP)++;
+ glNormal3f(0.00, 1.00, -1.00);
+ glVertex3f(-CUBEROUND, CUBELEN, -CUBEROUND);
+ glVertex3f(CUBEROUND, CUBELEN, -CUBEROUND);
+ glVertex3f(CUBEROUND, CUBEROUND, -CUBELEN);
+ glVertex3f(-CUBEROUND, CUBEROUND, -CUBELEN);
+ (*polysP)++;
+ glNormal3f(-1.00, 0.00, -1.00);
+ glVertex3f(-CUBELEN, -CUBEROUND, -CUBEROUND);
+ glVertex3f(-CUBELEN, CUBEROUND, -CUBEROUND);
+ glVertex3f(-CUBEROUND, CUBEROUND, -CUBELEN);
+ glVertex3f(-CUBEROUND, -CUBEROUND, -CUBELEN);
+ (*polysP)++;
+ glNormal3f(1.00, 0.00, 1.00);
+ glVertex3f(CUBELEN, -CUBEROUND, CUBEROUND);
+ glVertex3f(CUBELEN, CUBEROUND, CUBEROUND);
+ glVertex3f(CUBEROUND, CUBEROUND, CUBELEN);
+ glVertex3f(CUBEROUND, -CUBEROUND, CUBELEN);
+ (*polysP)++;
+ glNormal3f(1.00, 0.00, -1.00);
+ glVertex3f(CUBEROUND, -CUBEROUND, -CUBELEN);
+ glVertex3f(CUBEROUND, CUBEROUND, -CUBELEN);
+ glVertex3f(CUBELEN, CUBEROUND, -CUBEROUND);
+ glVertex3f(CUBELEN, -CUBEROUND, -CUBEROUND);
+ (*polysP)++;
+ glNormal3f(-1.00, 0.00, 1.00);
+ glVertex3f(-CUBEROUND, -CUBEROUND, CUBELEN);
+ glVertex3f(-CUBEROUND, CUBEROUND, CUBELEN);
+ glVertex3f(-CUBELEN, CUBEROUND, CUBEROUND);
+ glVertex3f(-CUBELEN, -CUBEROUND, CUBEROUND);
+ (*polysP)++;
+ glEnd();
+ glBegin(GL_TRIANGLES);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+ /* Corners of cubit */
+ glNormal3f(1.00, 1.00, 1.00);
+ glVertex3f(CUBEROUND, CUBEROUND, CUBELEN);
+ glVertex3f(CUBELEN, CUBEROUND, CUBEROUND);
+ glVertex3f(CUBEROUND, CUBELEN, CUBEROUND);
+ (*polysP)++;
+ glNormal3f(-1.00, -1.00, -1.00);
+ glVertex3f(-CUBEROUND, -CUBELEN, -CUBEROUND);
+ glVertex3f(-CUBELEN, -CUBEROUND, -CUBEROUND);
+ glVertex3f(-CUBEROUND, -CUBEROUND, -CUBELEN);
+ (*polysP)++;
+ glNormal3f(-1.00, 1.00, 1.00);
+ glVertex3f(-CUBEROUND, CUBEROUND, CUBELEN);
+ glVertex3f(-CUBEROUND, CUBELEN, CUBEROUND);
+ (*polysP)++;
+ glVertex3f(-CUBELEN, CUBEROUND, CUBEROUND);
+ glNormal3f(1.00, -1.00, -1.00);
+ glVertex3f(CUBELEN, -CUBEROUND, -CUBEROUND);
+ glVertex3f(CUBEROUND, -CUBELEN, -CUBEROUND);
+ glVertex3f(CUBEROUND, -CUBEROUND, -CUBELEN);
+ (*polysP)++;
+ glNormal3f(1.00, -1.00, 1.00);
+ glVertex3f(CUBEROUND, -CUBEROUND, CUBELEN);
+ glVertex3f(CUBEROUND, -CUBELEN, CUBEROUND);
+ glVertex3f(CUBELEN, -CUBEROUND, CUBEROUND);
+ (*polysP)++;
+ glNormal3f(-1.00, 1.00, -1.00);
+ glVertex3f(-CUBELEN, CUBEROUND, -CUBEROUND);
+ glVertex3f(-CUBEROUND, CUBELEN, -CUBEROUND);
+ glVertex3f(-CUBEROUND, CUBEROUND, -CUBELEN);
+ (*polysP)++;
+ glNormal3f(-1.00, -1.00, 1.00);
+ glVertex3f(-CUBEROUND, -CUBEROUND, CUBELEN);
+ glVertex3f(-CUBELEN, -CUBEROUND, CUBEROUND);
+ glVertex3f(-CUBEROUND, -CUBELEN, CUBEROUND);
+ (*polysP)++;
+ glNormal3f(1.00, 1.00, -1.00);
+ glVertex3f(CUBELEN, CUBEROUND, -CUBEROUND);
+ glVertex3f(CUBEROUND, CUBEROUND, -CUBELEN);
+ glVertex3f(CUBEROUND, CUBELEN, -CUBEROUND);
+ (*polysP)++;
+ glEnd();
+ return True;
+}
+
+static Bool
+draw_cubit(ModeInfo * mi,
+ int back, int front, int left, int right, int bottom, int top,
+ unsigned long *polysP)
+{
+ rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+ int mono = MI_IS_MONO(mi);
+
+ if (!draw_stickerless_cubit(rp, polysP))
+ return False;
+ if (back != NO_FACE) {
+ glBegin(GL_POLYGON);
+ pickcolor(back, mono);
+ glNormal3f(0.00, 0.00, -1.00);
+ glVertex3f(-STICKERSHORT, STICKERLONG, -STICKERDEPTH);
+ glVertex3f(STICKERSHORT, STICKERLONG, -STICKERDEPTH);
+ glVertex3f(STICKERLONG, STICKERSHORT, -STICKERDEPTH);
+ glVertex3f(STICKERLONG, -STICKERSHORT, -STICKERDEPTH);
+ glVertex3f(STICKERSHORT, -STICKERLONG, -STICKERDEPTH);
+ glVertex3f(-STICKERSHORT, -STICKERLONG, -STICKERDEPTH);
+ glVertex3f(-STICKERLONG, -STICKERSHORT, -STICKERDEPTH);
+ glVertex3f(-STICKERLONG, STICKERSHORT, -STICKERDEPTH);
+ (*polysP)++;
+ glEnd();
+ }
+ if (front != NO_FACE) {
+ glBegin(GL_POLYGON);
+ pickcolor(front, mono);
+ glNormal3f(0.00, 0.00, 1.00);
+ glVertex3f(-STICKERSHORT, -STICKERLONG, STICKERDEPTH);
+ glVertex3f(STICKERSHORT, -STICKERLONG, STICKERDEPTH);
+ glVertex3f(STICKERLONG, -STICKERSHORT, STICKERDEPTH);
+ glVertex3f(STICKERLONG, STICKERSHORT, STICKERDEPTH);
+ glVertex3f(STICKERSHORT, STICKERLONG, STICKERDEPTH);
+ glVertex3f(-STICKERSHORT, STICKERLONG, STICKERDEPTH);
+ glVertex3f(-STICKERLONG, STICKERSHORT, STICKERDEPTH);
+ glVertex3f(-STICKERLONG, -STICKERSHORT, STICKERDEPTH);
+ (*polysP)++;
+ glEnd();
+ }
+ if (left != NO_FACE) {
+ glBegin(GL_POLYGON);
+ pickcolor(left, mono);
+ glNormal3f(-1.00, 0.00, 0.00);
+ glVertex3f(-STICKERDEPTH, -STICKERSHORT, STICKERLONG);
+ glVertex3f(-STICKERDEPTH, STICKERSHORT, STICKERLONG);
+ glVertex3f(-STICKERDEPTH, STICKERLONG, STICKERSHORT);
+ glVertex3f(-STICKERDEPTH, STICKERLONG, -STICKERSHORT);
+ glVertex3f(-STICKERDEPTH, STICKERSHORT, -STICKERLONG);
+ glVertex3f(-STICKERDEPTH, -STICKERSHORT, -STICKERLONG);
+ glVertex3f(-STICKERDEPTH, -STICKERLONG, -STICKERSHORT);
+ glVertex3f(-STICKERDEPTH, -STICKERLONG, STICKERSHORT);
+ (*polysP)++;
+ glEnd();
+ }
+ if (right != NO_FACE) {
+ glBegin(GL_POLYGON);
+ pickcolor(right, mono);
+ glNormal3f(1.00, 0.00, 0.00);
+ glVertex3f(STICKERDEPTH, -STICKERSHORT, -STICKERLONG);
+ glVertex3f(STICKERDEPTH, STICKERSHORT, -STICKERLONG);
+ glVertex3f(STICKERDEPTH, STICKERLONG, -STICKERSHORT);
+ glVertex3f(STICKERDEPTH, STICKERLONG, STICKERSHORT);
+ glVertex3f(STICKERDEPTH, STICKERSHORT, STICKERLONG);
+ glVertex3f(STICKERDEPTH, -STICKERSHORT, STICKERLONG);
+ glVertex3f(STICKERDEPTH, -STICKERLONG, STICKERSHORT);
+ glVertex3f(STICKERDEPTH, -STICKERLONG, -STICKERSHORT);
+ (*polysP)++;
+ glEnd();
+ }
+ if (bottom != NO_FACE) {
+ glBegin(GL_POLYGON);
+ pickcolor(bottom, mono);
+ glNormal3f(0.00, -1.00, 0.00);
+ glVertex3f(STICKERLONG, -STICKERDEPTH, -STICKERSHORT);
+ glVertex3f(STICKERLONG, -STICKERDEPTH, STICKERSHORT);
+ glVertex3f(STICKERSHORT, -STICKERDEPTH, STICKERLONG);
+ glVertex3f(-STICKERSHORT, -STICKERDEPTH, STICKERLONG);
+ glVertex3f(-STICKERLONG, -STICKERDEPTH, STICKERSHORT);
+ glVertex3f(-STICKERLONG, -STICKERDEPTH, -STICKERSHORT);
+ glVertex3f(-STICKERSHORT, -STICKERDEPTH, -STICKERLONG);
+ glVertex3f(STICKERSHORT, -STICKERDEPTH, -STICKERLONG);
+ (*polysP)++;
+ glEnd();
+ }
+ if (top != NO_FACE) {
+ glBegin(GL_POLYGON);
+ pickcolor(top, mono);
+ glNormal3f(0.00, 1.00, 0.00);
+ glVertex3f(-STICKERLONG, STICKERDEPTH, -STICKERSHORT);
+ glVertex3f(-STICKERLONG, STICKERDEPTH, STICKERSHORT);
+ glVertex3f(-STICKERSHORT, STICKERDEPTH, STICKERLONG);
+ glVertex3f(STICKERSHORT, STICKERDEPTH, STICKERLONG);
+ glVertex3f(STICKERLONG, STICKERDEPTH, STICKERSHORT);
+ glVertex3f(STICKERLONG, STICKERDEPTH, -STICKERSHORT);
+ glVertex3f(STICKERSHORT, STICKERDEPTH, -STICKERLONG);
+ glVertex3f(-STICKERSHORT, STICKERDEPTH, -STICKERLONG);
+ (*polysP)++;
+ glEnd();
+ }
+ return True;
+}
+
+/* Convert move to weird general notation */
+static void
+convertMove(rubikstruct * rp, RubikMove move, RubikSlice * slice)
+{
+ RubikLoc plane;
+ int sizeOfRow, sizeOfColumn;
+
+ plane = rotateSlice[(int) move.face][move.direction % 2];
+ (*slice).face = plane.face;
+ (*slice).rotation = plane.rotation;
+
+ faceSizes(rp, move.face, &sizeOfRow, &sizeOfColumn);
+ if (plane.face == 1 || /* VERTICAL */
+ (plane.face == 2 && (move.face == 1 || move.face == 3))) {
+ if ((*slice).rotation == CW)
+ (*slice).depth = sizeOfRow - 1 - move.position %
+ sizeOfRow;
+ else
+ (*slice).depth = move.position % sizeOfRow;
+ } else { /* (plane.face == 0 || *//* HORIZONTAL *//*
+ (plane.face == 2 && (move.face == 0 || move.face == 4))) */
+ if ((*slice).rotation == CW)
+ (*slice).depth = sizeOfColumn - 1 - move.position /
+ sizeOfRow;
+ else
+ (*slice).depth = move.position / sizeOfRow;
+ }
+ /* If (*slice).depth = 0 then face 0, face 1, or face 2 moves */
+ if (move.direction / 2)
+ (*slice).rotation = ((*slice).rotation == CW) ? CCW : CW;
+}
+
+/* Assume the size is at least 2, or its just not challenging... */
+static Bool
+draw_cube(ModeInfo * mi)
+{
+#define S1 1
+#define SX ((GLint)S1*(MAXSIZEX-1))
+#define SY ((GLint)S1*(MAXSIZEY-1))
+#define SZ ((GLint)S1*(MAXSIZEZ-1))
+#define HALFX (((GLfloat)MAXSIZEX-1.0)/2.0)
+#define HALFY (((GLfloat)MAXSIZEY-1.0)/2.0)
+#define HALFZ (((GLfloat)MAXSIZEZ-1.0)/2.0)
+#define MIDX(a) (((GLfloat)(2*a-MAXSIZEX+1))/2.0)
+#define MIDY(a) (((GLfloat)(2*a-MAXSIZEY+1))/2.0)
+#define MIDZ(a) (((GLfloat)(2*a-MAXSIZEZ+1))/2.0)
+#define DRAW_CUBIT(mi,b,f,l,r,bm,t) if (!draw_cubit(mi,b,f,l,r,bm,t,&mi->polygon_count)) return False
+ rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+ RubikSlice slice;
+ GLfloat rotatestep;
+ int i, j, k;
+
+ if (rp->movement.face == NO_FACE) {
+ slice.face = NO_FACE;
+ slice.rotation = NO_ROTATION;
+ slice.depth = NO_DEPTH;
+ } else {
+ convertMove(rp, rp->movement, &slice);
+ }
+ rotatestep = (slice.rotation == CCW) ? rp->rotatestep : -rp->rotatestep;
+
+
+/*-
+ * The glRotatef() routine transforms the coordinate system for every future
+ * vertex specification (this is not so simple, but by now comprehending this
+ * is sufficient). So if you want to rotate the inner slice, you can draw
+ * one slice, rotate the anglestep for the centerslice, draw the inner slice,
+ * rotate reversely and draw the other slice.
+ * There is a sequence for drawing cubies for each axis being moved...
+ */
+ switch (slice.face) {
+ case NO_FACE:
+ case TOP_FACE: /* BOTTOM_FACE too */
+ glPushMatrix();
+ if (slice.depth == MAXSIZEY - 1)
+ glRotatef(rotatestep, 0, HALFY, 0);
+
+ glTranslatef(-HALFX, -HALFY, -HALFZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * LASTY].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, -SZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * FIRSTY].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * LASTY].face,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ }
+ glTranslatef(S1, 0, -SZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * LASTY].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ glPopMatrix();
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glPushMatrix();
+ if (slice.depth == REVY(j))
+ glRotatef(rotatestep, 0, HALFY, 0);
+ glTranslatef(-HALFX, MIDY(j), -HALFZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * j].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * REVY(j)].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(1, 0, -SZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * j].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE);
+ /* Center */
+ glTranslatef(0, 0, SZ);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * REVY(j)].face,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(S1, 0, -SZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * j].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * REVY(j)].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ glPopMatrix();
+ }
+ if (slice.depth == 0)
+ glRotatef(rotatestep, 0, HALFY, 0);
+
+ glTranslatef(-HALFX, HALFY, -HALFZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * LASTY].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * k].face);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * FIRSTY].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * LASTZ].face);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, -SZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * LASTY].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * FIRSTZ].face);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * k].face);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * FIRSTY].face,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * LASTZ].face);
+ }
+ glTranslatef(S1, 0, -SZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * LASTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * FIRSTZ].face);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * k].face);
+ }
+ glTranslatef(0, 0, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * LASTZ].face);
+ break;
+ case LEFT_FACE: /* RIGHT_FACE too */
+ /* rotatestep is negative because the RIGHT face is the default here */
+ glPushMatrix();
+ if (slice.depth == 0)
+ glRotatef(-rotatestep, HALFX, 0, 0);
+
+ glTranslatef(-HALFX, -HALFY, -HALFZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * j].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * LASTY].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, -SY, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * k].face);
+ }
+ glTranslatef(0, -SY, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * LASTY].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * REVY(j)].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * FIRSTY].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * LASTZ].face);
+ glPopMatrix();
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glPushMatrix();
+ if (slice.depth == i)
+ glRotatef(-rotatestep, HALFX, 0, 0);
+ glTranslatef(MIDX(i), -HALFY, -HALFZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * FIRSTY].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * j].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * LASTY].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * FIRSTZ].face);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, -SY, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ /* Center */
+ glTranslatef(0, SY, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * k].face);
+ }
+ glTranslatef(0, -SY, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * LASTY].face,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * REVY(j)].face,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * FIRSTY].face,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * LASTZ].face);
+ glPopMatrix();
+ }
+ if (slice.depth == MAXSIZEX - 1)
+ glRotatef(-rotatestep, HALFX, 0, 0);
+ glTranslatef(HALFX, -HALFY, -HALFZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * j].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * LASTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * FIRSTZ].face);
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glTranslatef(0, -SY, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * k].face);
+ }
+ glTranslatef(0, -SY, S1);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * LASTY].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * REVY(j)].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(0, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * LASTZ].face);
+ break;
+ case FRONT_FACE: /* BACK_FACE too */
+ glPushMatrix();
+ if (slice.depth == MAXSIZEZ - 1)
+ glRotatef(rotatestep, 0, 0, HALFZ);
+
+ glTranslatef(-HALFX, -HALFY, -HALFZ);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * FIRSTY].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * LASTZ].face, NO_FACE);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * LASTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(-SX, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * j].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * j].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * j].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(-SX, S1, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * LASTY].face, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][i + MAXSIZEX * LASTY].face, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * FIRSTZ].face);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * LASTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * FIRSTZ].face);
+ glPopMatrix();
+ for (k = 1; k < MAXSIZEZ - 1; k++) {
+ glPushMatrix();
+ if (slice.depth == REVZ(k))
+ glRotatef(rotatestep, 0, 0, HALFZ);
+ glTranslatef(-HALFX, -HALFY, MIDZ(k));
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(-SX, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ /* Center */
+ glTranslatef(SX, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(-SX, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * k].face);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * k].face);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * k].face);
+ glPopMatrix();
+ }
+ if (slice.depth == 0)
+ glRotatef(rotatestep, 0, 0, HALFZ);
+ glTranslatef(-HALFX, -HALFY, HALFZ);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * LASTY].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * LASTY].face,
+ NO_FACE, NO_FACE,
+ rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * LASTY].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face,
+ rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+ for (j = 1; j < MAXSIZEY - 1; j++) {
+ glTranslatef(-SX, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * REVY(j)].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+ NO_FACE, NO_FACE);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * REVY(j)].face,
+ NO_FACE, NO_FACE,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * REVY(j)].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face,
+ NO_FACE, NO_FACE);
+ }
+ glTranslatef(-SX, S1, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * FIRSTY].face,
+ rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * LASTZ].face);
+ for (i = 1; i < MAXSIZEX - 1; i++) {
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * FIRSTY].face,
+ NO_FACE, NO_FACE,
+ NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * LASTZ].face);
+ }
+ glTranslatef(S1, 0, 0);
+ DRAW_CUBIT(mi,
+ NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face,
+ NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * LASTZ].face);
+ break;
+ }
+ return True;
+#undef S1
+}
+
+/* From David Bagley's xrubik. Used by permission. ;) */
+static void
+readRC(rubikstruct * rp, int face, int dir, int h, int orient, int size)
+{
+ int g, sizeOfRow;
+
+ sizeOfRow = sizeRow(rp, face);
+ if (dir == TOP || dir == BOTTOM)
+ for (g = 0; g < size; g++)
+ rp->rowLoc[orient][g] =
+ rp->cubeLoc[face][g * sizeOfRow + h];
+ else /* dir == RIGHT || dir == LEFT */
+ for (g = 0; g < size; g++)
+ rp->rowLoc[orient][g] =
+ rp->cubeLoc[face][h * sizeOfRow + g];
+}
+
+static void
+rotateRC(rubikstruct * rp, int rotate, int orient, int size)
+{
+ int g;
+
+ for (g = 0; g < size; g++)
+ rp->rowLoc[orient][g].rotation =
+ (rp->rowLoc[orient][g].rotation + rotate) % MAXORIENT;
+}
+
+static void
+reverseRC(rubikstruct * rp, int orient, int size)
+{
+ int g;
+ RubikLoc temp;
+
+ for (g = 0; g < size / 2; g++) {
+ temp = rp->rowLoc[orient][size - 1 - g];
+ rp->rowLoc[orient][size - 1 - g] = rp->rowLoc[orient][g];
+ rp->rowLoc[orient][g] = temp;
+ }
+}
+
+static void
+writeRC(rubikstruct * rp, int face, int dir, int h, int orient, int size)
+{
+ int g, position, sizeOfRow;
+
+ sizeOfRow = sizeRow(rp, face);
+ if (dir == TOP || dir == BOTTOM) {
+ for (g = 0; g < size; g++) {
+ position = g * sizeOfRow + h;
+ rp->cubeLoc[face][position] = rp->rowLoc[orient][g];
+ /* DrawSquare(face, position); */
+ }
+ } else { /* dir == RIGHT || dir == LEFT */
+ for (g = 0; g < size; g++) {
+ position = h * sizeOfRow + g;
+ rp->cubeLoc[face][position] = rp->rowLoc[orient][g];
+ /* DrawSquare(face, position); */
+ }
+ }
+}
+
+static Bool
+rotateFace(rubikstruct * rp, int face, int direction)
+{
+ int position, i, j, sizeOfRow, sizeOfColumn, sizeOnPlane;
+ RubikLoc *faceLoc;
+
+ faceSizes(rp, face, &sizeOfRow, &sizeOfColumn);
+ sizeOnPlane = sizeOfRow * sizeOfColumn;
+ if ((faceLoc = (RubikLoc *) malloc(sizeOnPlane *
+ sizeof (RubikLoc))) == NULL) {
+ return False;
+ }
+ /* Read Face */
+ for (position = 0; position < sizeOnPlane; position++)
+ faceLoc[position] = rp->cubeLoc[face][position];
+ /* Write Face */
+ for (position = 0; position < sizeOnPlane; position++) {
+ i = position % sizeOfRow;
+ j = position / sizeOfRow;
+ if (direction == CW)
+ rp->cubeLoc[face][position] =
+ faceLoc[(sizeOfRow - i - 1) * sizeOfRow + j];
+ else if (direction == CCW)
+ rp->cubeLoc[face][position] =
+ faceLoc[i * sizeOfRow + sizeOfColumn - j - 1];
+ else /* (direction == HALF) */
+ rp->cubeLoc[face][position] =
+ faceLoc[sizeOfRow - i - 1 + (sizeOfColumn - j - 1) * sizeOfRow];
+ rp->cubeLoc[face][position].rotation =
+ (rp->cubeLoc[face][position].rotation +
+ direction - MAXORIENT) % MAXORIENT;
+ /* DrawSquare(face, position); */
+ }
+ if (faceLoc != NULL)
+ (void) free((void *) faceLoc);
+ return True;
+}
+
+/* Yeah this is big and ugly */
+static void
+slideRC(int face, int direction, int h, int sizeOnOppAxis,
+ int *newFace, int *newDirection, int *newH,
+ int *rotate, Bool *reverse)
+{
+ *newFace = slideNextRow[face][direction].face;
+ *rotate = slideNextRow[face][direction].rotation;
+ *newDirection = (*rotate + direction) % MAXORIENT;
+ switch (*rotate) {
+ case TOP:
+ *newH = h;
+ *reverse = False;
+ break;
+ case RIGHT:
+ if (*newDirection == TOP || *newDirection == BOTTOM) {
+ *newH = sizeOnOppAxis - 1 - h;
+ *reverse = False;
+ } else { /* *newDirection == RIGHT || *newDirection == LEFT */
+ *newH = h;
+ *reverse = True;
+ }
+ break;
+ case BOTTOM:
+ *newH = sizeOnOppAxis - 1 - h;
+ *reverse = True;
+ break;
+ case LEFT:
+ if (*newDirection == TOP || *newDirection == BOTTOM) {
+ *newH = h;
+ *reverse = True;
+ } else { /* *newDirection == RIGHT || *newDirection == LEFT */
+ *newH = sizeOnOppAxis - 1 - h;
+ *reverse = False;
+ }
+ break;
+ default:
+ (void) printf("slideRC: rotate %d\n", *rotate);
+ *newH = 0;
+ *reverse = False;
+ }
+}
+
+static Bool
+moveRubik(rubikstruct * rp, int face, int direction, int position)
+{
+ int newFace, newDirection, rotate, reverse;
+ int h, k, newH;
+ int i, j, sizeOfRow, sizeOfColumn, sizeOnAxis, sizeOnOppAxis;
+
+ faceSizes(rp, face, &sizeOfRow, &sizeOfColumn);
+ if (direction == CW || direction == CCW) {
+ direction = (direction == CCW) ?
+ (rotateToRow[face].direction + 2) % MAXORIENT :
+ rotateToRow[face].direction;
+ if (rotateToRow[face].sideFace == RIGHT) {
+ i = j = sizeOfColumn - 1;
+ } else if (rotateToRow[face].sideFace == BOTTOM) {
+ i = j = sizeOfRow - 1;
+ } else {
+ i = j = 0;
+ }
+ face = rotateToRow[face].face;
+ position = j * sizeOfRow + i;
+ }
+ i = position % sizeOfRow;
+ j = position / sizeOfRow;
+ h = (direction == TOP || direction == BOTTOM) ? i : j;
+ if (direction == TOP || direction == BOTTOM) {
+ sizeOnAxis = sizeOfColumn;
+ sizeOnOppAxis = sizeOfRow;
+ } else {
+ sizeOnAxis = sizeOfRow;
+ sizeOnOppAxis = sizeOfColumn;
+ }
+ /* rotate sides CW or CCW or HALF) */
+
+ if (h == sizeOnOppAxis - 1) {
+ newDirection = (direction == TOP || direction == BOTTOM) ?
+ TOP : RIGHT;
+ if (rp->degreeTurn == 180) {
+ if (!rotateFace(rp, rowToRotate[face][newDirection], HALF))
+ return False;
+ } else if (direction == TOP || direction == RIGHT) {
+ if (!rotateFace(rp, rowToRotate[face][newDirection], CW))
+ return False;
+ } else { /* direction == BOTTOM || direction == LEFT */
+ if (!rotateFace(rp, rowToRotate[face][newDirection], CCW))
+ return False;
+ }
+ }
+ if (h == 0) {
+ newDirection = (direction == TOP || direction == BOTTOM) ?
+ BOTTOM : LEFT;
+ if (rp->degreeTurn == 180) {
+ if (!rotateFace(rp, rowToRotate[face][newDirection], HALF))
+ return False;
+ } else if (direction == TOP || direction == RIGHT) {
+ if (!rotateFace(rp, rowToRotate[face][newDirection], CCW))
+ return False;
+ } else { /* direction == BOTTOM || direction == LEFT */
+ if (!rotateFace(rp, rowToRotate[face][newDirection], CW))
+ return False;
+ }
+ }
+ /* Slide rows or columns */
+ readRC(rp, face, direction, h, 0, sizeOnAxis);
+ if (rp->degreeTurn == 180) {
+ int sizeOnDepthAxis;
+
+ slideRC(face, direction, h, sizeOnOppAxis,
+ &newFace, &newDirection, &newH, &rotate, &reverse);
+ sizeOnDepthAxis = sizeFace(rp, newFace) / sizeOnOppAxis;
+ readRC(rp, newFace, newDirection, newH, 1, sizeOnDepthAxis);
+ rotateRC(rp, rotate, 0, sizeOnAxis);
+ if (reverse == True)
+ reverseRC(rp, 0, sizeOnAxis);
+ face = newFace;
+ direction = newDirection;
+ h = newH;
+ for (k = 2; k <= MAXORIENT + 1; k++) {
+ slideRC(face, direction, h, sizeOnOppAxis,
+ &newFace, &newDirection, &newH, &rotate, &reverse);
+ if (k != MAXORIENT && k != MAXORIENT + 1)
+ readRC(rp, newFace, newDirection, newH, k,
+ (k % 2) ? sizeOnDepthAxis : sizeOnAxis);
+ rotateRC(rp, rotate, k - 2,
+ (k % 2) ? sizeOnDepthAxis : sizeOnAxis);
+ if (k != MAXORIENT + 1)
+ rotateRC(rp, rotate, k - 1,
+ (k % 2) ? sizeOnAxis : sizeOnDepthAxis);
+ if (reverse == True) {
+ reverseRC(rp, k - 2,
+ (k % 2) ? sizeOnDepthAxis : sizeOnAxis);
+ if (k != MAXORIENT + 1)
+ reverseRC(rp, k - 1,
+ (k % 2) ? sizeOnAxis : sizeOnDepthAxis);
+ }
+ writeRC(rp, newFace, newDirection, newH, k - 2,
+ (k % 2) ? sizeOnDepthAxis : sizeOnAxis);
+ face = newFace;
+ direction = newDirection;
+ h = newH;
+ }
+ } else {
+ for (k = 1; k <= MAXORIENT; k++) {
+ slideRC(face, direction, h, sizeOnOppAxis,
+ &newFace, &newDirection, &newH, &rotate, &reverse);
+ if (k != MAXORIENT)
+ readRC(rp, newFace, newDirection, newH, k, sizeOnAxis);
+ rotateRC(rp, rotate, k - 1, sizeOnAxis);
+ if (reverse == True)
+ reverseRC(rp, k - 1, sizeOnAxis);
+ writeRC(rp, newFace, newDirection, newH, k - 1, sizeOnAxis);
+ face = newFace;
+ direction = newDirection;
+ h = newH;
+ }
+ }
+ return True;
+}
+
+#ifdef DEBUG
+static void
+printCube(rubikstruct * rp)
+{
+ int face, position, sizeOfRow, sizeOfColumn;
+
+ for (face = 0; face < MAXFACES; face++) {
+ faceSizes(rp, face, &sizeOfRow, &sizeOfColumn);
+ for (position = 0; position < sizeOfRow * sizeOfColumn; position++) {
+ (void) printf("%d %d ", rp->cubeLoc[face][position].face,
+ rp->cubeLoc[face][position].rotation);
+ if (!((position + 1) % sizeOfRow))
+ (void) printf("\n");
+ }
+ (void) printf("\n");
+ }
+ (void) printf("\n");
+}
+
+#endif
+
+static Bool
+evalmovement(ModeInfo * mi, RubikMove movement)
+{
+ rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+
+#ifdef DEBUG
+ printCube(rp);
+#endif
+ if (movement.face < 0 || movement.face >= MAXFACES)
+ return True;
+ if (!moveRubik(rp, movement.face, movement.direction, movement.position))
+ return False;
+ return True;
+}
+
+static Bool
+compare_moves(rubikstruct * rp, RubikMove move1, RubikMove move2, Bool opp)
+{
+ RubikSlice slice1, slice2;
+
+ convertMove(rp, move1, &slice1);
+ convertMove(rp, move2, &slice2);
+ if (slice1.face == slice2.face &&
+ slice1.depth == slice2.depth) {
+ if (slice1.rotation == slice2.rotation) { /* CW or CCW */
+ if (!opp)
+ return True;
+ } else {
+ if (opp)
+ return True;
+ }
+ }
+ return False;
+}
+
+static Bool
+shuffle(ModeInfo * mi)
+{
+ rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+ int i, face, position;
+ RubikMove move;
+
+ if (sizex)
+ i = sizex;
+ else
+ i = MI_SIZE(mi);
+ if (i < -MINSIZE)
+ i = NRAND(-i - MINSIZE + 1) + MINSIZE;
+ else if (i < MINSIZE)
+ i = MINSIZE;
+
+ if (LRAND() % 2 && !sizey && !sizez) { /* Make normal (NxNxN) cubes more likely */
+ MAXSIZEX = MAXSIZEY = MAXSIZEZ = i;
+ } else {
+ MAXSIZEX = i;
+ if (sizey)
+ i = sizey;
+ else
+ i = MI_SIZE(mi);
+ if (i < -MINSIZE)
+ i = NRAND(-i - MINSIZE + 1) + MINSIZE;
+ else if (i < MINSIZE)
+ i = MINSIZE;
+ if (LRAND() % 2 && !sizez) { /* Make more MxNxN more likely than LxMxN */
+ MAXSIZEY = MAXSIZEZ = i;
+ } else {
+ MAXSIZEY = i;
+ if (sizez)
+ i = sizez;
+ else
+ i = MI_SIZE(mi);
+ if (i < -MINSIZE)
+ i = NRAND(-i - MINSIZE + 1) + MINSIZE;
+ else if (i < MINSIZE)
+ i = MINSIZE;
+ MAXSIZEZ = i;
+ }
+ }
+
+ for (face = 0; face < MAXFACES; face++) {
+ if (rp->cubeLoc[face] != NULL)
+ (void) free((void *) rp->cubeLoc[face]);
+ if ((rp->cubeLoc[face] = (RubikLoc *) malloc(sizeFace(rp, face) *
+ sizeof (RubikLoc))) == NULL) {
+ return False;
+ }
+ for (position = 0; position < sizeFace(rp, face); position++) {
+ rp->cubeLoc[face][position].face = face;
+ rp->cubeLoc[face][position].rotation = TOP;
+ }
+ }
+ for (i = 0; i < MAXORIENT; i++) {
+ if (rp->rowLoc[i] != NULL)
+ (void) free((void *) rp->rowLoc[i]);
+ /* The following is reused so make it the biggest size */
+ if ((rp->rowLoc[i] = (RubikLoc *) malloc(MAXMAXSIZE *
+ sizeof (RubikLoc))) == NULL) {
+ return False;
+ }
+ }
+ rp->storedmoves = MI_COUNT(mi);
+ if (rp->storedmoves < 0) {
+ if (rp->moves != NULL)
+ (void) free((void *) rp->moves);
+ rp->moves = (RubikMove *) NULL;
+ rp->storedmoves = NRAND(-rp->storedmoves) + 1;
+ }
+ if ((rp->storedmoves) && (rp->moves == NULL))
+ if ((rp->moves = (RubikMove *) calloc(rp->storedmoves + 1,
+ sizeof (RubikMove))) == NULL) {
+ return False;
+ }
+ if (MI_CYCLES(mi) <= 1) {
+ rp->anglestep = 90.0;
+ } else {
+ rp->anglestep = 90.0 / (GLfloat) (MI_CYCLES(mi));
+ }
+
+ for (i = 0; i < rp->storedmoves; i++) {
+ Bool condition;
+
+ do {
+ move.face = NRAND(MAXFACES);
+ move.direction = NRAND(MAXORIENT); /* Exclude CW and CCW, its ok */
+ move.position = NRAND(sizeFace(rp, move.face));
+ rp->degreeTurn = (checkFaceSquare(rp,
+ rowToRotate[move.face][move.direction])) ? 90 : 180;
+ condition = True;
+ if (i > 0) { /* avoid immediate undoing moves */
+ if (compare_moves(rp, move, rp->moves[i - 1], True))
+ condition = False;
+ if (rp->degreeTurn == 180 &&
+ compare_moves(rp, move, rp->moves[i - 1], False))
+ condition = False;
+ }
+ if (i > 1) /* avoid 3 consecutive identical moves */
+ if (compare_moves(rp, move, rp->moves[i - 1], False) &&
+ compare_moves(rp, move, rp->moves[i - 2], False))
+ condition = False;
+ /*
+ * Still some silly moves being made....
+ */
+ } while (!condition);
+ if (hideshuffling)
+ if (!evalmovement(mi, move))
+ return False;
+ rp->moves[i] = move;
+ }
+ rp->VX = 0.005;
+ if (NRAND(100) < 50)
+ rp->VX *= -1;
+ rp->VY = 0.005;
+ if (NRAND(100) < 50)
+ rp->VY *= -1;
+ rp->movement.face = NO_FACE;
+ rp->rotatestep = 0;
+ rp->action = hideshuffling ? ACTION_SOLVE : ACTION_SHUFFLE;
+ rp->shufflingmoves = 0;
+ rp->done = 0;
+ return True;
+}
+
+ENTRYPOINT void
+reshape_rubik(ModeInfo * mi, int width, int height)
+{
+ rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+
+ glViewport(0, y, rp->WindW = (GLint) width, rp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+ENTRYPOINT Bool
+rubik_handle_event (ModeInfo *mi, XEvent *event)
+{
+ rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, rp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &rp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ rp->done = 1;
+ return True;
+ }
+
+ return False;
+}
+
+
+static Bool
+pinit(ModeInfo * mi)
+{
+ glClearDepth(1.0);
+ glColor3f(1.0, 1.0, 1.0);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glShadeModel(GL_FLAT);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ return (shuffle(mi));
+}
+
+ENTRYPOINT void
+free_rubik(ModeInfo *mi)
+{
+ rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+ int i;
+
+ for (i = 0; i < MAXFACES; i++)
+ if (rp->cubeLoc[i] != NULL) {
+ (void) free((void *) rp->cubeLoc[i]);
+ rp->cubeLoc[i] = (RubikLoc *) NULL;
+ }
+ for (i = 0; i < MAXORIENT; i++)
+ if (rp->rowLoc[i] != NULL) {
+ (void) free((void *) rp->rowLoc[i]);
+ rp->rowLoc[i] = (RubikLoc *) NULL;
+ }
+ if (rp->moves != NULL) {
+ (void) free((void *) rp->moves);
+ rp->moves = (RubikMove *) NULL;
+ }
+}
+
+ENTRYPOINT void
+init_rubik(ModeInfo * mi)
+{
+ rubikstruct *rp;
+
+ MI_INIT (mi, rubik);
+ rp = &rubik[MI_SCREEN(mi)];
+ rp->step = NRAND(90);
+ rp->PX = ((float) LRAND() / (float) MAXRAND) * 2.0 - 1.0;
+ rp->PY = ((float) LRAND() / (float) MAXRAND) * 2.0 - 1.0;
+
+ rp->trackball = gltrackball_init (True);
+
+ if ((rp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_rubik(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ if (!pinit(mi)) {
+ free_rubik(mi);
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr,
+ "Could not allocate memory for rubik\n");
+ }
+ return;
+ }
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_rubik(ModeInfo * mi)
+{
+ Bool bounced = False;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ rubikstruct *rp;
+
+ if (rubik == NULL)
+ return;
+ rp = &rubik[MI_SCREEN(mi)];
+ if (rp->cubeLoc[0] == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ if (!rp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(rp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glTranslatef(0.0, 0.0, -10.0);
+
+ rp->PX += rp->VX;
+ rp->PY += rp->VY;
+
+ if (rp->PY < -1) {
+ rp->PY += (-1) - (rp->PY);
+ rp->VY = -rp->VY;
+ bounced = True;
+ }
+ if (rp->PY > 1) {
+ rp->PY -= (rp->PY) - 1;
+ rp->VY = -rp->VY;
+ bounced = True;
+ }
+ if (rp->PX < -1) {
+ rp->PX += (-1) - (rp->PX);
+ rp->VX = -rp->VX;
+ bounced = True;
+ }
+ if (rp->PX > 1) {
+ rp->PX -= (rp->PX) - 1;
+ rp->VX = -rp->VX;
+ bounced = True;
+ }
+ if (bounced) {
+ rp->VX += ((float) LRAND() / (float) MAXRAND) * 0.002 - 0.001;
+ rp->VY += ((float) LRAND() / (float) MAXRAND) * 0.002 - 0.001;
+ if (rp->VX > 0.006)
+ rp->VX = 0.006;
+ if (rp->VY > 0.006)
+ rp->VY = 0.006;
+ if (rp->VX < -0.006)
+ rp->VX = -0.006;
+ if (rp->VY < -0.006)
+ rp->VY = -0.006;
+ }
+ if (!MI_IS_ICONIC(mi)) {
+ glTranslatef(rp->PX, rp->PY, 0);
+ glScalef(Scale4Window * rp->WindH / rp->WindW, Scale4Window, Scale4Window);
+ } else {
+ glScalef(Scale4Iconic * rp->WindH / rp->WindW, Scale4Iconic, Scale4Iconic);
+ }
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180) {
+ glScalef (1/h, h, 1); /* #### not quite right */
+ h = 1.8;
+ glScalef (h, h, h);
+ }
+ }
+# endif
+
+ gltrackball_rotate (rp->trackball);
+
+ glRotatef(rp->step * 100, 1, 0, 0);
+ glRotatef(rp->step * 95, 0, 1, 0);
+ glRotatef(rp->step * 90, 0, 0, 1);
+
+ if (!draw_cube(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glXSwapBuffers(display, window);
+
+ if (rp->action == ACTION_SHUFFLE) {
+ if (rp->done) {
+ if (++rp->rotatestep > DELAY_AFTER_SHUFFLING) {
+ rp->movement.face = NO_FACE;
+ rp->rotatestep = 0;
+ rp->action = ACTION_SOLVE;
+ rp->done = 0;
+ }
+ } else {
+ if (rp->movement.face == NO_FACE) {
+ if (rp->shufflingmoves < rp->storedmoves) {
+ rp->rotatestep = 0;
+ rp->movement = rp->moves[rp->shufflingmoves];
+ } else {
+ rp->rotatestep = 0;
+ rp->done = 1;
+ }
+ } else {
+ if (rp->rotatestep == 0) {
+ if (rp->movement.direction == CW || rp->movement.direction == CCW)
+ rp->degreeTurn = (checkFaceSquare(rp, rp->movement.face)) ? 90 : 180;
+ else
+ rp->degreeTurn = (checkFaceSquare(rp, rowToRotate[rp->movement.face][rp->movement.direction])) ? 90 : 180;
+ }
+ rp->rotatestep += rp->anglestep;
+ if (rp->rotatestep > rp->degreeTurn) {
+ if (!evalmovement(mi, rp->movement)) {
+ free_rubik(mi);
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr,
+ "Could not allocate memory for rubik\n");
+ }
+ return;
+ }
+ rp->shufflingmoves++;
+ rp->movement.face = NO_FACE;
+ }
+ }
+ }
+ } else {
+ if (rp->done) {
+ if (++rp->rotatestep > DELAY_AFTER_SOLVING)
+ if (!shuffle(mi)) {
+ free_rubik(mi);
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr,
+ "Could not allocate memory for rubik\n");
+ }
+ return;
+ }
+ } else {
+ if (rp->movement.face == NO_FACE) {
+ if (rp->storedmoves > 0) {
+ rp->rotatestep = 0;
+ rp->movement = rp->moves[rp->storedmoves - 1];
+ rp->movement.direction = (rp->movement.direction +
+ (MAXORIENT / 2)) % MAXORIENT;
+ } else {
+ rp->rotatestep = 0;
+ rp->done = 1;
+ }
+ } else {
+ if (rp->rotatestep == 0) {
+ if (rp->movement.direction == CW || rp->movement.direction == CCW)
+ rp->degreeTurn = (checkFaceSquare(rp, rp->movement.face)) ? 90 : 180;
+ else
+ rp->degreeTurn = (checkFaceSquare(rp, rowToRotate[rp->movement.face][rp->movement.direction])) ? 90 : 180;
+ }
+ rp->rotatestep += rp->anglestep;
+ if (rp->rotatestep > rp->degreeTurn) {
+ if (!evalmovement(mi, rp->movement)) {
+ free_rubik(mi);
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr,
+ "Could not allocate memory for rubik\n");
+ }
+ return;
+ }
+ rp->storedmoves--;
+ rp->movement.face = NO_FACE;
+ }
+ }
+ }
+ }
+
+ glPopMatrix();
+
+ glFlush();
+
+ rp->step += 0.002;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_rubik(ModeInfo * mi)
+{
+ rubikstruct *rp;
+
+ if (rubik == NULL)
+ return;
+ rp = &rubik[MI_SCREEN(mi)];
+
+ if (!rp->glx_context)
+ return;
+ if (!pinit(mi)) {
+ free_rubik(mi);
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr,
+ "Could not allocate memory for rubik\n");
+ }
+ return;
+ }
+}
+#endif /* !STANDALONE */
+
+#endif
+
+XSCREENSAVER_MODULE ("Rubik", rubik)
diff --git a/hacks/glx/rubik.man b/hacks/glx/rubik.man
new file mode 100644
index 0000000..08e5b94
--- /dev/null
+++ b/hacks/glx/rubik.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+rubik - screen saver that solves Rubik's Cube.
+.SH SYNOPSIS
+.B rubik
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-size \fInumber\fP]
+[\-hideshuffling]
+[\-fps]
+.SH DESCRIPTION
+Draws a Rubik's Cube that rotates in three dimensions and repeatedly
+shuffles and solves itself.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Count. -100 - 100. Default: -30.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout. 0 - 60. Default: 5.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-size \fInumber\fP
+Size. -20 - 20. Default: -6.
+.TP 8
+.B \-hideshuffling | \-no-hideshuffling
+Show Shuffling. Boolean.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Marcelo Vianna.
diff --git a/hacks/glx/rubikblocks.c b/hacks/glx/rubikblocks.c
new file mode 100644
index 0000000..fadeb0d
--- /dev/null
+++ b/hacks/glx/rubikblocks.c
@@ -0,0 +1,633 @@
+/* rubikblocks, Copyright (c) 2009 Vasek Potocek <vasek.potocek@post.cz>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* RubikBlocks - a Rubik's Mirror Blocks puzzle introduced in 2008.
+ * No mirrors in this version, though, hence the altered name.
+ */
+
+/* TODO:
+ * add reflection to the faces
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_rubikblocks 0
+# define release_rubikblocks 0
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+#ifdef USE_GL
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_TEXTURE "True"
+#define DEF_RANDOMIZE "False"
+#define DEF_SPINSPEED "0.1"
+#define DEF_ROTSPEED "3.0"
+#define DEF_WANDERSPEED "0.005"
+#define DEF_WAIT "40.0"
+#define DEF_CUBESIZE "1.0"
+
+#define SHUFFLE 100
+
+#define TEX_WIDTH 64
+#define TEX_HEIGHT 64
+#define BORDER 5
+#define BORDER2 (BORDER*BORDER)
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define rnd01() ((int)(random()%2))
+
+/*************************************************************************/
+
+static Bool spin, wander, rndstart, tex;
+static float spinspeed, tspeed, wspeed, twait, size;
+
+static argtype vars[] = {
+ { &spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ { &wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ { &rndstart, "randomize", "Randomize", DEF_RANDOMIZE, t_Bool},
+ { &tex, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ { &spinspeed, "spinspeed", "SpinSpeed", DEF_SPINSPEED, t_Float},
+ { &tspeed, "rotspeed", "RotSpeed", DEF_ROTSPEED, t_Float},
+ { &wspeed, "wanderspeed", "WanderSpeed", DEF_WANDERSPEED, t_Float},
+ { &twait, "wait", "Wait", DEF_WAIT, t_Float},
+ { &size, "cubesize", "CubeSize", DEF_CUBESIZE, t_Float},
+};
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-randomize", ".randomize", XrmoptionNoArg, "True" },
+ { "+randomize", ".randomize", XrmoptionNoArg, "False" },
+ { "-texture", ".texture", XrmoptionNoArg, "True" },
+ { "+texture", ".texture", XrmoptionNoArg, "False" },
+ { "-spinspeed", ".spinspeed", XrmoptionSepArg, 0 },
+ { "-wanderspeed", ".wanderspeed", XrmoptionSepArg, 0 },
+ { "-rotspeed", ".rotspeed", XrmoptionSepArg, 0 },
+ { "-wait", ".wait", XrmoptionSepArg, 0 },
+ { "-cubesize", ".cubesize", XrmoptionSepArg, 0 },
+};
+
+ENTRYPOINT ModeSpecOpt rubikblocks_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct rubikblocks_description =
+{ "rubikblocks", "init_rubikblocks", "draw_rubikblocks", NULL,
+ "draw_rubikblocks", "change_rubikblocks", NULL, &rubikblocks_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows randomly shuffling Rubik's Mirror Blocks puzzle", 0, NULL
+};
+#endif
+
+typedef struct {
+ float pos[3]; /* _original_ position */
+ float qr[4]; /* quaternion of rotation */
+ Bool act; /* flag if it is undergoing the current rotation */
+} piece_t;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ GLfloat ratio;
+ Bool button_down;
+
+ Bool pause; /* pause between two rotations */
+ float qfram[4]; /* quaternion describing the rotation in one anim. frame */
+ GLfloat t, tmax; /* rotation clock */
+ piece_t pieces[27]; /* type and tilt of all the pieces */
+
+ unsigned char texture[TEX_HEIGHT][TEX_WIDTH];
+ GLuint list_base;
+ Bool wire;
+} rubikblocks_conf;
+
+static rubikblocks_conf *rubikblocks = NULL;
+
+static const GLfloat shininess = 20.0;
+static const GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
+static const GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
+static const GLfloat material_ambient[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat material_diffuse[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat material_specular[] = {0.2, 0.2, 0.2, 1.0};
+
+/*************************************************************************/
+
+/* Multiplies two quaternions, src*dest, and stores the result in dest. */
+static void
+mult_quat(float src[4], float dest[4])
+{
+ float r, i, j, k;
+ r = src[0]*dest[0] - src[1]*dest[1] - src[2]*dest[2] - src[3]*dest[3];
+ i = src[0]*dest[1] + src[1]*dest[0] + src[2]*dest[3] - src[3]*dest[2];
+ j = src[0]*dest[2] + src[2]*dest[0] + src[3]*dest[1] - src[1]*dest[3];
+ k = src[0]*dest[3] + src[3]*dest[0] + src[1]*dest[2] - src[2]*dest[1];
+ dest[0] = r;
+ dest[1] = i;
+ dest[2] = j;
+ dest[3] = k;
+}
+
+/* Sets the 'act' flag for pieces which will undergo the rotation. */
+static void
+flag_pieces(piece_t pieces[27], int axis, int side)
+{
+ int i, j;
+ float q[4];
+ for(i = 0; i < 27; i++)
+ {
+ q[0] = 0;
+ q[1] = pieces[i].pos[0];
+ q[2] = pieces[i].pos[1];
+ q[3] = pieces[i].pos[2];
+ mult_quat(pieces[i].qr, q);
+ for(j = 1; j < 4; j++)
+ q[j] = -q[j];
+ mult_quat(pieces[i].qr, q);
+ for(j = 1; j < 4; j++)
+ q[j] = -q[j];
+ if(fabs(q[axis] - side) < 0.1)
+ pieces[i].act = True;
+ else
+ pieces[i].act = False;
+ }
+}
+
+/* "Rounds" the value to the nearest from the set {0, +-1/2, +-1/sqrt(2), +-1}.
+ * It is guaranteed to be pretty close to one when this function is called. */
+static float
+settle_value(float v)
+{
+ if(v > 0.9) return 1;
+ else if(v < -0.9) return -1;
+ else if(v > 0.6) return M_SQRT1_2;
+ else if(v < -0.6) return -M_SQRT1_2;
+ else if(v > 0.4) return 0.5;
+ else if(v < -0.4) return -0.5;
+ else return 0;
+}
+
+static void
+randomize(rubikblocks_conf *cp)
+{
+ int axis, side;
+ int i, j;
+ for(i = 0; i < SHUFFLE; i++)
+ {
+ axis = (random()%3)+1;
+ side = rnd01()*2-1;
+ flag_pieces(cp->pieces, axis, side);
+ for(j = 1; j < 4; j++)
+ cp->qfram[j] = 0;
+ cp->qfram[0] = M_SQRT1_2;
+ cp->qfram[axis] = M_SQRT1_2;
+ for(j = 0; j < 27; j++)
+ {
+ if(cp->pieces[j].act)
+ mult_quat(cp->qfram, cp->pieces[j].qr);
+ }
+ }
+}
+
+static void
+finish(rubikblocks_conf *cp)
+{
+ static int axis = 1;
+ int side, angle;
+ int i, j;
+ if(cp->pause)
+ {
+ switch(axis)
+ {
+ case 1:
+ axis = rnd01()+2;
+ break;
+ case 2:
+ axis = 2*rnd01()+1;
+ break;
+ default:
+ axis = rnd01()+1;
+ }
+ side = rnd01()*2-1;
+ angle = rnd01()+1;
+ flag_pieces(cp->pieces, axis, side);
+ cp->pause = False;
+ cp->tmax = 90.0*angle;
+ for(i = 1; i < 4; i++)
+ cp->qfram[i] = 0;
+ cp->qfram[0] = cos(tspeed*M_PI/360);
+ cp->qfram[axis] = sin((rnd01()*2-1)*tspeed*M_PI/360);
+ }
+ else
+ {
+ for(i = 0; i < 27; i++)
+ {
+ for(j = 0; j < 4; j++)
+ {
+ cp->pieces[i].qr[j] = settle_value(cp->pieces[i].qr[j]);
+ }
+ }
+ cp->pause = True;
+ cp->tmax = twait;
+ }
+ cp->t = 0;
+}
+
+static Bool
+draw_main(ModeInfo *mi, rubikblocks_conf *cp)
+{
+ int i;
+ double x, y, z;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ get_position(cp->rot, &x, &y, &z, !cp->button_down);
+ glTranslatef((x-0.5)*6, (y-0.5)*6, -20);
+
+ gltrackball_rotate(cp->trackball);
+
+ get_rotation(cp->rot, &x, &y, &z, !cp->button_down);
+ glRotatef(x*360, 1, 0, 0);
+ glRotatef(y*360, 0, 1, 0);
+ glRotatef(z*360, 0, 0, 1);
+ glScalef(size, size, size);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ if(cp->wire) glColor3f(0.7, 0.7, 0.7);
+ if(!cp->pause)
+ for(i = 0; i < 27; i++)
+ if(cp->pieces[i].act)
+ mult_quat(cp->qfram, cp->pieces[i].qr);
+ for(i = 0; i < 27; i++)
+ {
+ glPushMatrix();
+ if(fabs(cp->pieces[i].qr[0]) < 1)
+ glRotatef(360/M_PI*acos(cp->pieces[i].qr[0]),
+ cp->pieces[i].qr[1], cp->pieces[i].qr[2], cp->pieces[i].qr[3]);
+ glCallList(cp->list_base + i);
+ glPopMatrix();
+ }
+ if((cp->t += tspeed) > cp->tmax) finish(cp);
+ return True;
+}
+
+static void
+draw_horz_line(rubikblocks_conf *cp, int x1, int x2, int y)
+{
+ int x, y0 = y, w;
+ if(y < BORDER) y = -y;
+ else y = -BORDER;
+ for(; y < BORDER; y++) {
+ if(y0+y >= TEX_HEIGHT) break;
+ w = y*y*255/BORDER2;
+ for(x = x1; x <= x2; x++)
+ if(cp->texture[y0+y][x]>w) cp->texture[y0+y][x] = w;
+ }
+}
+
+static void
+draw_vert_line(rubikblocks_conf *cp, int x, int y1, int y2)
+{
+ int x0 = x, y, w;
+ if(x<BORDER) x = -x;
+ else x = -BORDER;
+ for(; x < BORDER; x++) {
+ if(x0+x >= TEX_WIDTH) break;
+ w = x*x*255/BORDER2;
+ for(y = y1; y <= y2; y++)
+ if(cp->texture[y][x0+x]>w) cp->texture[y][x0+x] = w;
+ }
+}
+
+static void
+make_texture(rubikblocks_conf *cp)
+{
+ int x, y;
+ for(y = 0; y < TEX_HEIGHT; y++)
+ for(x = 0; x < TEX_WIDTH; x++)
+ cp->texture[y][x] = 255;
+ draw_horz_line(cp, 0, TEX_WIDTH-1, 0);
+ draw_horz_line(cp, 0, TEX_WIDTH-1, TEX_HEIGHT-1);
+ draw_vert_line(cp, 0, 0, TEX_HEIGHT-1);
+ draw_vert_line(cp, TEX_WIDTH-1, 0, TEX_HEIGHT-1);
+}
+
+/* These simple transforms make the actual shape of the pieces. The parameters
+ * A, B and C affect the excentricity of the pieces in each direction. */
+static float
+fx(float x)
+{
+ const float A = 0.5;
+ if(x > 1.4) return 1.5 - A;
+ else if(x < -1.4) return -1.5 - A;
+ else return x;
+}
+
+static float
+fy(float y)
+{
+ const float B = 0.25;
+ if(y > 1.4) return 1.5 - B;
+ else if(y < -1.4) return -1.5 - B;
+ else return y;
+}
+
+static float
+fz(float z)
+{
+ const float C = 0.0;
+ if(z > 1.4) return 1.5 - C;
+ else if(z < -1.4) return -1.5 - C;
+ else return z;
+}
+
+static void
+init_lists(rubikblocks_conf *cp)
+{
+ GLuint base;
+ int i;
+ float x, y, z;
+ base = cp->list_base = glGenLists(27);
+ for(i = 0; i < 27; i++)
+ {
+ x = cp->pieces[i].pos[0];
+ y = cp->pieces[i].pos[1];
+ z = cp->pieces[i].pos[2];
+ glNewList(base+i, GL_COMPILE);
+ glBegin(GL_QUAD_STRIP);
+ glNormal3f(1, 0, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(fx(x+0.5), fy(y-0.5), fz(z-0.5));
+ glTexCoord2f(0, 1);
+ glVertex3f(fx(x+0.5), fy(y+0.5), fz(z-0.5));
+ glTexCoord2f(1, 0);
+ glVertex3f(fx(x+0.5), fy(y-0.5), fz(z+0.5));
+ glTexCoord2f(1, 1);
+ glVertex3f(fx(x+0.5), fy(y+0.5), fz(z+0.5));
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(0, 0);
+ glVertex3f(fx(x-0.5), fy(y-0.5), fz(z+0.5));
+ glTexCoord2f(0, 1);
+ glVertex3f(fx(x-0.5), fy(y+0.5), fz(z+0.5));
+ glNormal3f(-1, 0, 0);
+ glTexCoord2f(1, 0);
+ glVertex3f(fx(x-0.5), fy(y-0.5), fz(z-0.5));
+ glTexCoord2f(1, 1);
+ glVertex3f(fx(x-0.5), fy(y+0.5), fz(z-0.5));
+ glNormal3f(0, 0, -1);
+ glTexCoord2f(0, 0);
+ glVertex3f(fx(x+0.5), fy(y-0.5), fz(z-0.5));
+ glTexCoord2f(0, 1);
+ glVertex3f(fx(x+0.5), fy(y+0.5), fz(z-0.5));
+ glEnd();
+ glBegin(GL_QUADS);
+ glNormal3f(0, 1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(fx(x+0.5), fy(y+0.5), fz(z+0.5));
+ glTexCoord2f(0, 1);
+ glVertex3f(fx(x+0.5), fy(y+0.5), fz(z-0.5));
+ glTexCoord2f(1, 1);
+ glVertex3f(fx(x-0.5), fy(y+0.5), fz(z-0.5));
+ glTexCoord2f(1, 0);
+ glVertex3f(fx(x-0.5), fy(y+0.5), fz(z+0.5));
+ glNormal3f(0, -1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(fx(x+0.5), fy(y-0.5), fz(z-0.5));
+ glTexCoord2f(0, 1);
+ glVertex3f(fx(x+0.5), fy(y-0.5), fz(z+0.5));
+ glTexCoord2f(1, 1);
+ glVertex3f(fx(x-0.5), fy(y-0.5), fz(z+0.5));
+ glTexCoord2f(1, 0);
+ glVertex3f(fx(x-0.5), fy(y-0.5), fz(z-0.5));
+ glEnd();
+ glEndList();
+ }
+}
+
+/* It looks terrible... FIXME: any other ideas, maybe some anisotropic filtering? */
+/*#define MIPMAP*/
+
+static void
+init_gl(ModeInfo *mi)
+{
+ rubikblocks_conf *cp = &rubikblocks[MI_SCREEN(mi)];
+#ifdef MIPMAP
+ int status;
+#endif
+ cp->wire = MI_IS_WIREFRAME(mi);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ cp->wire = 0;
+# endif
+
+ if(MI_IS_MONO(mi))
+ tex = False;
+ if(cp->wire) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ return;
+ }
+
+ glClearDepth(1.0);
+ glDrawBuffer(GL_BACK);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glShadeModel(GL_FLAT);
+ glDepthFunc(GL_LESS);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_COLOR_MATERIAL);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
+ glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ if (!tex) return;
+ glEnable(GL_TEXTURE_2D);
+#ifdef MIPMAP
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEX_WIDTH, TEX_HEIGHT,
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, cp->texture);
+ if (status) {
+ const char *s = (char *)gluErrorString(status);
+ fprintf (stderr, "%s: error mipmapping texture: %s\n", progname, (s?s:"(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ glTexImage2D(GL_TEXTURE_2D, 0, 1, TEX_WIDTH, TEX_HEIGHT,
+ 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, cp->texture);
+#endif
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+#ifdef MIPMAP
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+#else
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+#endif
+}
+
+static void
+init_cp(rubikblocks_conf *cp)
+{
+ int i, j, k, m;
+
+ cp->pause = True;
+ cp->t = 0.0;
+ cp->tmax = twait;
+
+ for(i = -1, m = 0; i <= 1; i++)
+ for(j = -1; j <= 1; j++)
+ for(k = -1; k <= 1; k++)
+ {
+ cp->pieces[m].pos[0] = k;
+ cp->pieces[m].pos[1] = j;
+ cp->pieces[m].pos[2] = i;
+ cp->pieces[m].qr[0] = 1;
+ cp->pieces[m].qr[1] = 0;
+ cp->pieces[m].qr[2] = 0;
+ cp->pieces[m].qr[3] = 0;
+ m++;
+ }
+
+ cp->rot = make_rotator(spin?spinspeed:0, spin?spinspeed:0, spin?spinspeed:0,
+ 0.1, wander?wspeed:0, True);
+ cp->trackball = gltrackball_init(True);
+
+ if(rndstart) randomize(cp);
+}
+
+/*************************************************************************/
+
+ENTRYPOINT void
+reshape_rubikblocks(ModeInfo *mi, int width, int height)
+{
+ rubikblocks_conf *cp = &rubikblocks[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+ if(!height) height = 1;
+ cp->ratio = (GLfloat)width/(GLfloat)height;
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, cp->ratio, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT void
+init_rubikblocks(ModeInfo *mi)
+{
+ rubikblocks_conf *cp;
+ MI_INIT(mi, rubikblocks);
+ cp = &rubikblocks[MI_SCREEN(mi)];
+
+ if(tex)
+ make_texture(cp);
+
+ if ((cp->glx_context = init_GL(mi)) != NULL)
+ {
+ init_gl(mi);
+ init_cp(cp);
+ init_lists(cp);
+ reshape_rubikblocks(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_rubikblocks(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ rubikblocks_conf *cp;
+ if (!rubikblocks) return;
+ cp = &rubikblocks[MI_SCREEN(mi)];
+ MI_IS_DRAWN(mi) = True;
+ if (!cp->glx_context) return;
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(cp->glx_context));
+ if (!draw_main(mi, cp))
+ {
+ MI_ABORT(mi);
+ return;
+ }
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_rubikblocks(ModeInfo * mi)
+{
+ rubikblocks_conf *cp = &rubikblocks[MI_SCREEN(mi)];
+ if (!cp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+ init_gl(mi);
+}
+#endif /* !STANDALONE */
+
+ENTRYPOINT Bool
+rubikblocks_handle_event (ModeInfo *mi, XEvent *event)
+{
+ rubikblocks_conf *cp = &rubikblocks[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cp->button_down))
+ return True;
+
+ return False;
+}
+
+
+XSCREENSAVER_MODULE ("RubikBlocks", rubikblocks)
+
+#endif
diff --git a/hacks/glx/rubikblocks.man b/hacks/glx/rubikblocks.man
new file mode 100644
index 0000000..c18d18f
--- /dev/null
+++ b/hacks/glx/rubikblocks.man
@@ -0,0 +1,117 @@
+.TH XScreenSaver 1 "04-Feb-09" "X Version 11"
+.SH NAME
+rubikblocks - animates the Rubik's Mirror Blocks puzzle
+.SH SYNOPSIS
+.B rubikblocks
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-delay \fImicroseconds\fP]
+[\-texture] [\-no\-texture]
+[\-mono]
+[\-wireframe]
+[\-spin] [\-no\-spin]
+[\-wander] [\-no\-wander]
+[\-randomize] [\-no\-randomize]
+[\-spinspeed \fInumber\fP]
+[\-rotspeed \fInumber\fP]
+[\-wanderspeed \fInumber\fP]
+[\-wait \fInumber\fP]
+[\-cubesize \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+This program animates a puzzle called Rubik's Mirror Blocks.
+The moves are chosen randomly.
+.SH OPTIONS
+.I rubikblocks
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-texture
+Use texture maps. This is the default.
+.TP 8
+.B \-no\-texture
+Use solid colors. Looks a bit weird.
+.TP 8
+.B \-mono
+Disable both texture maps and colors. Ditto.
+.TP 8
+.B \-wireframe
+Only draw outlines. Outlines of each piece, not only the whole object, are drawn.
+.TP 8
+.B \-spin
+Spin the whole object around X, Y and Z axes. This is the default.
+.TP 8
+.B \-no\-spin
+Do not spin, stay in the same tilt all the time.
+.TP 8
+.B \-wander
+Move the object around the screen. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the object centered on the screen.
+.TP 8
+.B \-randomize
+Shuffle the puzzle randomly at startup. This is the default.
+.TP 8
+.B \-no\-randomize
+Do not shuffle at startup, begin at the shape of cube.
+.TP 8
+.B \-spinspeed \fInumber\fP
+The relative speed of spinning. Default is 1.0.
+.TP 8
+.B \-rotspeed \fInumber\fP
+The relative speed of the moves. Default is 3.0. Setting to \(<= 0.0
+makes the object stay at one configuration.
+.TP 8
+.B \-wanderspeed \fInumber\fP
+The relative speed of wandering around the screen. Default is 0.02.
+.TP 8
+.B \-wait \fInumber\fP
+How long to stay at final position after each move. The meaning of
+the argument is again relative. Default is 40.0.
+.TP 8
+.B \-cubesize \fInumber\fP
+Size of the object. Value of 3.0 fills roughly all the screen.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2009 by Vasek Potocek. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Vasek Potocek <vasek.potocek@post.cz>, 04-Feb-09.
diff --git a/hacks/glx/s1_1.c b/hacks/glx/s1_1.c
new file mode 100644
index 0000000..1f93429
--- /dev/null
+++ b/hacks/glx/s1_1.c
@@ -0,0 +1,1733 @@
+#include "gllist.h"
+static const float data[]={
+ 0.698103,-0.159073,-0.698103,0.667578,0.838781,-0.667578,
+ 0.92844,-0.14479,-0.342105,0.713281,0.838781,-0.591406,
+ 0.918718,-0.113815,-0.378157,0.721812,0.890313,-0.595062,
+ 0.698103,-0.159073,-0.698103,0.667578,0.838781,-0.667578,
+ 0.918718,-0.113815,-0.378157,0.721812,0.890313,-0.595062,
+ 0.705394,-0.069557,-0.705394,0.674281,0.890313,-0.674281,
+ 0.92844,-0.14479,-0.342105,0.713281,0.838781,-0.591406,
+ 0.991208,-0.132313,0,0.728516,0.838781,-0.5,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.918718,-0.113815,-0.378157,0.721812,0.890313,-0.595062,
+ 0.92844,-0.14479,-0.342105,0.713281,0.838781,-0.591406,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.911846,0.410531,0,0.738539,0.926712,-0.5,
+ 0.891913,0.278471,-0.356294,0.722453,0.926408,-0.595141,
+ 0.891913,0.278471,-0.356294,0.722453,0.926408,-0.595141,
+ 0.918718,-0.113815,-0.378157,0.721812,0.890313,-0.595062,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.891913,0.278471,-0.356294,0.722453,0.926408,-0.595141,
+ 0.66233,0.350197,-0.66233,0.674539,0.926104,-0.674539,
+ 0.705394,-0.069557,-0.705394,0.674281,0.890313,-0.674281,
+ 0.705394,-0.069557,-0.705394,0.674281,0.890313,-0.674281,
+ 0.918718,-0.113815,-0.378157,0.721812,0.890313,-0.595062,
+ 0.891913,0.278471,-0.356294,0.722453,0.926408,-0.595141,
+ 0.698103,-0.159073,0.698103,0.667578,0.838781,-0.332422,
+ 0.705394,-0.069557,0.705394,0.674281,0.890313,-0.325719,
+ 0.918719,-0.113815,0.378157,0.721812,0.890313,-0.404938,
+ 0.698103,-0.159073,0.698103,0.667578,0.838781,-0.332422,
+ 0.918719,-0.113815,0.378157,0.721812,0.890313,-0.404938,
+ 0.92844,-0.14479,0.342105,0.713281,0.838781,-0.408594,
+ 0.705394,-0.069557,0.705394,0.674281,0.890313,-0.325719,
+ 0.66233,0.350196,0.66233,0.674539,0.926104,-0.325461,
+ 0.891913,0.278471,0.356294,0.722453,0.926408,-0.404859,
+ 0.891913,0.278471,0.356294,0.722453,0.926408,-0.404859,
+ 0.918719,-0.113815,0.378157,0.721812,0.890313,-0.404938,
+ 0.705394,-0.069557,0.705394,0.674281,0.890313,-0.325719,
+ 0.891913,0.278471,0.356294,0.722453,0.926408,-0.404859,
+ 0.911846,0.410531,0,0.738539,0.926712,-0.5,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.918719,-0.113815,0.378157,0.721812,0.890313,-0.404938,
+ 0.891913,0.278471,0.356294,0.722453,0.926408,-0.404859,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.991208,-0.132313,0,0.728516,0.838781,-0.5,
+ 0.92844,-0.14479,0.342105,0.713281,0.838781,-0.408594,
+ 0.92844,-0.14479,0.342105,0.713281,0.838781,-0.408594,
+ 0.918719,-0.113815,0.378157,0.721812,0.890313,-0.404938,
+ 0.995164,-0.09823,0,0.737656,0.890313,-0.5,
+ 0.199329,0.959446,0.199329,0.638667,0.958463,-0.361333,
+ 0.18835,0.976969,0.100277,0.664625,0.962948,-0.4175,
+ 0.513442,0.838005,0.184732,0.706,0.949319,-0.4125,
+ 0.199329,0.959446,0.199329,0.638667,0.958463,-0.361333,
+ 0.513442,0.838005,0.184732,0.706,0.949319,-0.4125,
+ 0.448747,0.772821,0.448747,0.660875,0.948104,-0.339125,
+ 0.244558,0.969635,0,0.677562,0.965162,-0.5,
+ 0.592505,0.805566,0,0.7215,0.950535,-0.5,
+ 0.513442,0.838005,0.184732,0.706,0.949319,-0.4125,
+ 0.244558,0.969635,0,0.677562,0.965162,-0.5,
+ 0.513442,0.838005,0.184732,0.706,0.949319,-0.4125,
+ 0.18835,0.976969,0.100277,0.664625,0.962948,-0.4175,
+ 0.911846,0.410531,0,0.738539,0.926712,-0.5,
+ 0.891913,0.278471,0.356294,0.722453,0.926408,-0.404859,
+ 0.513442,0.838005,0.184732,0.706,0.949319,-0.4125,
+ 0.911846,0.410531,0,0.738539,0.926712,-0.5,
+ 0.513442,0.838005,0.184732,0.706,0.949319,-0.4125,
+ 0.592505,0.805566,0,0.7215,0.950535,-0.5,
+ 0.891913,0.278471,0.356294,0.722453,0.926408,-0.404859,
+ 0.66233,0.350196,0.66233,0.674539,0.926104,-0.325461,
+ 0.448747,0.772821,0.448747,0.660875,0.948104,-0.339125,
+ 0.448747,0.772821,0.448747,0.660875,0.948104,-0.339125,
+ 0.513442,0.838005,0.184732,0.706,0.949319,-0.4125,
+ 0.891913,0.278471,0.356294,0.722453,0.926408,-0.404859,
+ 0.199329,0.959446,-0.199329,0.638667,0.958463,-0.638667,
+ 0.448747,0.772821,-0.448747,0.660875,0.948104,-0.660875,
+ 0.513442,0.838005,-0.184732,0.706,0.949319,-0.5875,
+ 0.199329,0.959446,-0.199329,0.638667,0.958463,-0.638667,
+ 0.513442,0.838005,-0.184732,0.706,0.949319,-0.5875,
+ 0.18835,0.976969,-0.100277,0.664625,0.962948,-0.5825,
+ 0.448747,0.772821,-0.448747,0.660875,0.948104,-0.660875,
+ 0.66233,0.350197,-0.66233,0.674539,0.926104,-0.674539,
+ 0.891913,0.278471,-0.356294,0.722453,0.926408,-0.595141,
+ 0.891913,0.278471,-0.356294,0.722453,0.926408,-0.595141,
+ 0.513442,0.838005,-0.184732,0.706,0.949319,-0.5875,
+ 0.448747,0.772821,-0.448747,0.660875,0.948104,-0.660875,
+ 0.911846,0.410531,0,0.738539,0.926712,-0.5,
+ 0.592505,0.805566,0,0.7215,0.950535,-0.5,
+ 0.513442,0.838005,-0.184732,0.706,0.949319,-0.5875,
+ 0.911846,0.410531,0,0.738539,0.926712,-0.5,
+ 0.513442,0.838005,-0.184732,0.706,0.949319,-0.5875,
+ 0.891913,0.278471,-0.356294,0.722453,0.926408,-0.595141,
+ 0.244558,0.969635,0,0.677562,0.965162,-0.5,
+ 0.18835,0.976969,-0.100277,0.664625,0.962948,-0.5825,
+ 0.513442,0.838005,-0.184732,0.706,0.949319,-0.5875,
+ 0.244558,0.969635,0,0.677562,0.965162,-0.5,
+ 0.513442,0.838005,-0.184732,0.706,0.949319,-0.5875,
+ 0.592505,0.805566,0,0.7215,0.950535,-0.5,
+ 0.698103,-0.159073,0.698103,0.667578,0.838781,-0.332422,
+ 0.342105,-0.144791,0.92844,0.591406,0.838781,-0.286719,
+ 0.378157,-0.113815,0.918718,0.595062,0.890313,-0.278187,
+ 0.698103,-0.159073,0.698103,0.667578,0.838781,-0.332422,
+ 0.378157,-0.113815,0.918718,0.595062,0.890313,-0.278187,
+ 0.705394,-0.069557,0.705394,0.674281,0.890313,-0.325719,
+ 0.342105,-0.144791,0.92844,0.591406,0.838781,-0.286719,
+ 0,-0.132314,0.991208,0.5,0.838781,-0.271484,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ 0.378157,-0.113815,0.918718,0.595062,0.890313,-0.278187,
+ 0.342105,-0.144791,0.92844,0.591406,0.838781,-0.286719,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ 0,0.410531,0.911846,0.5,0.926712,-0.261461,
+ 0.356294,0.278471,0.891913,0.595141,0.926408,-0.277547,
+ 0.356294,0.278471,0.891913,0.595141,0.926408,-0.277547,
+ 0.378157,-0.113815,0.918718,0.595062,0.890313,-0.278187,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ 0.356294,0.278471,0.891913,0.595141,0.926408,-0.277547,
+ 0.66233,0.350196,0.66233,0.674539,0.926104,-0.325461,
+ 0.705394,-0.069557,0.705394,0.674281,0.890313,-0.325719,
+ 0.705394,-0.069557,0.705394,0.674281,0.890313,-0.325719,
+ 0.378157,-0.113815,0.918718,0.595062,0.890313,-0.278187,
+ 0.356294,0.278471,0.891913,0.595141,0.926408,-0.277547,
+ -0.698103,-0.159073,0.698103,0.332422,0.838781,-0.332422,
+ -0.705394,-0.069557,0.705394,0.325719,0.890313,-0.325719,
+ -0.378157,-0.113815,0.918718,0.404938,0.890313,-0.278187,
+ -0.698103,-0.159073,0.698103,0.332422,0.838781,-0.332422,
+ -0.378157,-0.113815,0.918718,0.404938,0.890313,-0.278187,
+ -0.342105,-0.144791,0.92844,0.408594,0.838781,-0.286719,
+ -0.705394,-0.069557,0.705394,0.325719,0.890313,-0.325719,
+ -0.66233,0.350197,0.66233,0.325461,0.926104,-0.325461,
+ -0.356294,0.278471,0.891913,0.404859,0.926408,-0.277547,
+ -0.356294,0.278471,0.891913,0.404859,0.926408,-0.277547,
+ -0.378157,-0.113815,0.918718,0.404938,0.890313,-0.278187,
+ -0.705394,-0.069557,0.705394,0.325719,0.890313,-0.325719,
+ -0.356294,0.278471,0.891913,0.404859,0.926408,-0.277547,
+ 0,0.410531,0.911846,0.5,0.926712,-0.261461,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ -0.378157,-0.113815,0.918718,0.404938,0.890313,-0.278187,
+ -0.356294,0.278471,0.891913,0.404859,0.926408,-0.277547,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ 0,-0.132314,0.991208,0.5,0.838781,-0.271484,
+ -0.342105,-0.144791,0.92844,0.408594,0.838781,-0.286719,
+ -0.342105,-0.144791,0.92844,0.408594,0.838781,-0.286719,
+ -0.378157,-0.113815,0.918718,0.404938,0.890313,-0.278187,
+ 0,-0.09823,0.995164,0.5,0.890313,-0.262344,
+ -0.199329,0.959446,0.199329,0.361333,0.958463,-0.361333,
+ -0.100277,0.976969,0.18835,0.4175,0.962948,-0.335375,
+ -0.184731,0.838005,0.513442,0.4125,0.949319,-0.294,
+ -0.199329,0.959446,0.199329,0.361333,0.958463,-0.361333,
+ -0.184731,0.838005,0.513442,0.4125,0.949319,-0.294,
+ -0.448747,0.77282,0.448747,0.339125,0.948104,-0.339125,
+ 0,0.969635,0.244558,0.5,0.965162,-0.322437,
+ 0,0.805567,0.592505,0.5,0.950535,-0.2785,
+ -0.184731,0.838005,0.513442,0.4125,0.949319,-0.294,
+ 0,0.969635,0.244558,0.5,0.965162,-0.322437,
+ -0.184731,0.838005,0.513442,0.4125,0.949319,-0.294,
+ -0.100277,0.976969,0.18835,0.4175,0.962948,-0.335375,
+ 0,0.410531,0.911846,0.5,0.926712,-0.261461,
+ -0.356294,0.278471,0.891913,0.404859,0.926408,-0.277547,
+ -0.184731,0.838005,0.513442,0.4125,0.949319,-0.294,
+ 0,0.410531,0.911846,0.5,0.926712,-0.261461,
+ -0.184731,0.838005,0.513442,0.4125,0.949319,-0.294,
+ 0,0.805567,0.592505,0.5,0.950535,-0.2785,
+ -0.356294,0.278471,0.891913,0.404859,0.926408,-0.277547,
+ -0.66233,0.350197,0.66233,0.325461,0.926104,-0.325461,
+ -0.448747,0.77282,0.448747,0.339125,0.948104,-0.339125,
+ -0.448747,0.77282,0.448747,0.339125,0.948104,-0.339125,
+ -0.184731,0.838005,0.513442,0.4125,0.949319,-0.294,
+ -0.356294,0.278471,0.891913,0.404859,0.926408,-0.277547,
+ 0.199329,0.959446,0.199329,0.638667,0.958463,-0.361333,
+ 0.448747,0.772821,0.448747,0.660875,0.948104,-0.339125,
+ 0.184731,0.838005,0.513442,0.5875,0.949319,-0.294,
+ 0.199329,0.959446,0.199329,0.638667,0.958463,-0.361333,
+ 0.184731,0.838005,0.513442,0.5875,0.949319,-0.294,
+ 0.100277,0.976969,0.18835,0.5825,0.962948,-0.335375,
+ 0.448747,0.772821,0.448747,0.660875,0.948104,-0.339125,
+ 0.66233,0.350196,0.66233,0.674539,0.926104,-0.325461,
+ 0.356294,0.278471,0.891913,0.595141,0.926408,-0.277547,
+ 0.356294,0.278471,0.891913,0.595141,0.926408,-0.277547,
+ 0.184731,0.838005,0.513442,0.5875,0.949319,-0.294,
+ 0.448747,0.772821,0.448747,0.660875,0.948104,-0.339125,
+ 0,0.410531,0.911846,0.5,0.926712,-0.261461,
+ 0,0.805567,0.592505,0.5,0.950535,-0.2785,
+ 0.184731,0.838005,0.513442,0.5875,0.949319,-0.294,
+ 0,0.410531,0.911846,0.5,0.926712,-0.261461,
+ 0.184731,0.838005,0.513442,0.5875,0.949319,-0.294,
+ 0.356294,0.278471,0.891913,0.595141,0.926408,-0.277547,
+ 0,0.969635,0.244558,0.5,0.965162,-0.322437,
+ 0.100277,0.976969,0.18835,0.5825,0.962948,-0.335375,
+ 0.184731,0.838005,0.513442,0.5875,0.949319,-0.294,
+ 0,0.969635,0.244558,0.5,0.965162,-0.322437,
+ 0.184731,0.838005,0.513442,0.5875,0.949319,-0.294,
+ 0,0.805567,0.592505,0.5,0.950535,-0.2785,
+ -0.698103,-0.159073,0.698103,0.332422,0.838781,-0.332422,
+ -0.92844,-0.144791,0.342105,0.286719,0.838781,-0.408594,
+ -0.918718,-0.113815,0.378157,0.278187,0.890313,-0.404938,
+ -0.698103,-0.159073,0.698103,0.332422,0.838781,-0.332422,
+ -0.918718,-0.113815,0.378157,0.278187,0.890313,-0.404938,
+ -0.705394,-0.069557,0.705394,0.325719,0.890313,-0.325719,
+ -0.92844,-0.144791,0.342105,0.286719,0.838781,-0.408594,
+ -0.991208,-0.132314,0,0.271484,0.838781,-0.5,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.918718,-0.113815,0.378157,0.278187,0.890313,-0.404938,
+ -0.92844,-0.144791,0.342105,0.286719,0.838781,-0.408594,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.911846,0.410531,0,0.261461,0.926712,-0.5,
+ -0.891913,0.278471,0.356294,0.277547,0.926408,-0.404859,
+ -0.891913,0.278471,0.356294,0.277547,0.926408,-0.404859,
+ -0.918718,-0.113815,0.378157,0.278187,0.890313,-0.404938,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.891913,0.278471,0.356294,0.277547,0.926408,-0.404859,
+ -0.66233,0.350197,0.66233,0.325461,0.926104,-0.325461,
+ -0.705394,-0.069557,0.705394,0.325719,0.890313,-0.325719,
+ -0.705394,-0.069557,0.705394,0.325719,0.890313,-0.325719,
+ -0.918718,-0.113815,0.378157,0.278187,0.890313,-0.404938,
+ -0.891913,0.278471,0.356294,0.277547,0.926408,-0.404859,
+ -0.698103,-0.159073,-0.698103,0.332422,0.838781,-0.667578,
+ -0.705394,-0.069557,-0.705394,0.325719,0.890313,-0.674281,
+ -0.918718,-0.113815,-0.378157,0.278187,0.890313,-0.595062,
+ -0.698103,-0.159073,-0.698103,0.332422,0.838781,-0.667578,
+ -0.918718,-0.113815,-0.378157,0.278187,0.890313,-0.595062,
+ -0.92844,-0.144791,-0.342105,0.286719,0.838781,-0.591406,
+ -0.705394,-0.069557,-0.705394,0.325719,0.890313,-0.674281,
+ -0.66233,0.350196,-0.66233,0.325461,0.926104,-0.674539,
+ -0.891913,0.278471,-0.356294,0.277547,0.926408,-0.595141,
+ -0.891913,0.278471,-0.356294,0.277547,0.926408,-0.595141,
+ -0.918718,-0.113815,-0.378157,0.278187,0.890313,-0.595062,
+ -0.705394,-0.069557,-0.705394,0.325719,0.890313,-0.674281,
+ -0.891913,0.278471,-0.356294,0.277547,0.926408,-0.595141,
+ -0.911846,0.410531,0,0.261461,0.926712,-0.5,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.918718,-0.113815,-0.378157,0.278187,0.890313,-0.595062,
+ -0.891913,0.278471,-0.356294,0.277547,0.926408,-0.595141,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.991208,-0.132314,0,0.271484,0.838781,-0.5,
+ -0.92844,-0.144791,-0.342105,0.286719,0.838781,-0.591406,
+ -0.92844,-0.144791,-0.342105,0.286719,0.838781,-0.591406,
+ -0.918718,-0.113815,-0.378157,0.278187,0.890313,-0.595062,
+ -0.995164,-0.09823,0,0.262344,0.890313,-0.5,
+ -0.199329,0.959446,-0.199329,0.361333,0.958463,-0.638667,
+ -0.18835,0.976969,-0.100277,0.335375,0.962948,-0.5825,
+ -0.513442,0.838005,-0.184731,0.294,0.949319,-0.5875,
+ -0.199329,0.959446,-0.199329,0.361333,0.958463,-0.638667,
+ -0.513442,0.838005,-0.184731,0.294,0.949319,-0.5875,
+ -0.448747,0.772821,-0.448747,0.339125,0.948104,-0.660875,
+ -0.244558,0.969635,0,0.322437,0.965162,-0.5,
+ -0.592505,0.805566,0,0.2785,0.950535,-0.5,
+ -0.513442,0.838005,-0.184731,0.294,0.949319,-0.5875,
+ -0.244558,0.969635,0,0.322437,0.965162,-0.5,
+ -0.513442,0.838005,-0.184731,0.294,0.949319,-0.5875,
+ -0.18835,0.976969,-0.100277,0.335375,0.962948,-0.5825,
+ -0.911846,0.410531,0,0.261461,0.926712,-0.5,
+ -0.891913,0.278471,-0.356294,0.277547,0.926408,-0.595141,
+ -0.513442,0.838005,-0.184731,0.294,0.949319,-0.5875,
+ -0.911846,0.410531,0,0.261461,0.926712,-0.5,
+ -0.513442,0.838005,-0.184731,0.294,0.949319,-0.5875,
+ -0.592505,0.805566,0,0.2785,0.950535,-0.5,
+ -0.891913,0.278471,-0.356294,0.277547,0.926408,-0.595141,
+ -0.66233,0.350196,-0.66233,0.325461,0.926104,-0.674539,
+ -0.448747,0.772821,-0.448747,0.339125,0.948104,-0.660875,
+ -0.448747,0.772821,-0.448747,0.339125,0.948104,-0.660875,
+ -0.513442,0.838005,-0.184731,0.294,0.949319,-0.5875,
+ -0.891913,0.278471,-0.356294,0.277547,0.926408,-0.595141,
+ -0.199329,0.959446,0.199329,0.361333,0.958463,-0.361333,
+ -0.448747,0.77282,0.448747,0.339125,0.948104,-0.339125,
+ -0.513442,0.838005,0.184731,0.294,0.949319,-0.4125,
+ -0.199329,0.959446,0.199329,0.361333,0.958463,-0.361333,
+ -0.513442,0.838005,0.184731,0.294,0.949319,-0.4125,
+ -0.18835,0.976969,0.100277,0.335375,0.962948,-0.4175,
+ -0.448747,0.77282,0.448747,0.339125,0.948104,-0.339125,
+ -0.66233,0.350197,0.66233,0.325461,0.926104,-0.325461,
+ -0.891913,0.278471,0.356294,0.277547,0.926408,-0.404859,
+ -0.891913,0.278471,0.356294,0.277547,0.926408,-0.404859,
+ -0.513442,0.838005,0.184731,0.294,0.949319,-0.4125,
+ -0.448747,0.77282,0.448747,0.339125,0.948104,-0.339125,
+ -0.911846,0.410531,0,0.261461,0.926712,-0.5,
+ -0.592505,0.805566,0,0.2785,0.950535,-0.5,
+ -0.513442,0.838005,0.184731,0.294,0.949319,-0.4125,
+ -0.911846,0.410531,0,0.261461,0.926712,-0.5,
+ -0.513442,0.838005,0.184731,0.294,0.949319,-0.4125,
+ -0.891913,0.278471,0.356294,0.277547,0.926408,-0.404859,
+ -0.244558,0.969635,0,0.322437,0.965162,-0.5,
+ -0.18835,0.976969,0.100277,0.335375,0.962948,-0.4175,
+ -0.513442,0.838005,0.184731,0.294,0.949319,-0.4125,
+ -0.244558,0.969635,0,0.322437,0.965162,-0.5,
+ -0.513442,0.838005,0.184731,0.294,0.949319,-0.4125,
+ -0.592505,0.805566,0,0.2785,0.950535,-0.5,
+ -0.698103,-0.159073,-0.698103,0.332422,0.838781,-0.667578,
+ -0.342105,-0.14479,-0.92844,0.408594,0.838781,-0.713281,
+ -0.378157,-0.113815,-0.918719,0.404938,0.890313,-0.721812,
+ -0.698103,-0.159073,-0.698103,0.332422,0.838781,-0.667578,
+ -0.378157,-0.113815,-0.918719,0.404938,0.890313,-0.721812,
+ -0.705394,-0.069557,-0.705394,0.325719,0.890313,-0.674281,
+ -0.342105,-0.14479,-0.92844,0.408594,0.838781,-0.713281,
+ 0,-0.132313,-0.991208,0.5,0.838781,-0.728516,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ -0.378157,-0.113815,-0.918719,0.404938,0.890313,-0.721812,
+ -0.342105,-0.14479,-0.92844,0.408594,0.838781,-0.713281,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ 0,0.410531,-0.911846,0.5,0.926712,-0.738539,
+ -0.356294,0.278471,-0.891913,0.404859,0.926408,-0.722453,
+ -0.356294,0.278471,-0.891913,0.404859,0.926408,-0.722453,
+ -0.378157,-0.113815,-0.918719,0.404938,0.890313,-0.721812,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ -0.356294,0.278471,-0.891913,0.404859,0.926408,-0.722453,
+ -0.66233,0.350196,-0.66233,0.325461,0.926104,-0.674539,
+ -0.705394,-0.069557,-0.705394,0.325719,0.890313,-0.674281,
+ -0.705394,-0.069557,-0.705394,0.325719,0.890313,-0.674281,
+ -0.378157,-0.113815,-0.918719,0.404938,0.890313,-0.721812,
+ -0.356294,0.278471,-0.891913,0.404859,0.926408,-0.722453,
+ 0.698103,-0.159073,-0.698103,0.667578,0.838781,-0.667578,
+ 0.705394,-0.069557,-0.705394,0.674281,0.890313,-0.674281,
+ 0.378157,-0.113815,-0.918718,0.595062,0.890313,-0.721812,
+ 0.698103,-0.159073,-0.698103,0.667578,0.838781,-0.667578,
+ 0.378157,-0.113815,-0.918718,0.595062,0.890313,-0.721812,
+ 0.342105,-0.14479,-0.92844,0.591406,0.838781,-0.713281,
+ 0.705394,-0.069557,-0.705394,0.674281,0.890313,-0.674281,
+ 0.66233,0.350197,-0.66233,0.674539,0.926104,-0.674539,
+ 0.356294,0.278471,-0.891913,0.595141,0.926408,-0.722453,
+ 0.356294,0.278471,-0.891913,0.595141,0.926408,-0.722453,
+ 0.378157,-0.113815,-0.918718,0.595062,0.890313,-0.721812,
+ 0.705394,-0.069557,-0.705394,0.674281,0.890313,-0.674281,
+ 0.356294,0.278471,-0.891913,0.595141,0.926408,-0.722453,
+ 0,0.410531,-0.911846,0.5,0.926712,-0.738539,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ 0.378157,-0.113815,-0.918718,0.595062,0.890313,-0.721812,
+ 0.356294,0.278471,-0.891913,0.595141,0.926408,-0.722453,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ 0,-0.132313,-0.991208,0.5,0.838781,-0.728516,
+ 0.342105,-0.14479,-0.92844,0.591406,0.838781,-0.713281,
+ 0.342105,-0.14479,-0.92844,0.591406,0.838781,-0.713281,
+ 0.378157,-0.113815,-0.918718,0.595062,0.890313,-0.721812,
+ 0,-0.09823,-0.995164,0.5,0.890313,-0.737656,
+ 0.199329,0.959446,-0.199329,0.638667,0.958463,-0.638667,
+ 0.100277,0.976969,-0.18835,0.5825,0.962948,-0.664625,
+ 0.184732,0.838005,-0.513442,0.5875,0.949319,-0.706,
+ 0.199329,0.959446,-0.199329,0.638667,0.958463,-0.638667,
+ 0.184732,0.838005,-0.513442,0.5875,0.949319,-0.706,
+ 0.448747,0.772821,-0.448747,0.660875,0.948104,-0.660875,
+ 0,0.969635,-0.244558,0.5,0.965162,-0.677562,
+ 0,0.805567,-0.592505,0.5,0.950535,-0.7215,
+ 0.184732,0.838005,-0.513442,0.5875,0.949319,-0.706,
+ 0,0.969635,-0.244558,0.5,0.965162,-0.677562,
+ 0.184732,0.838005,-0.513442,0.5875,0.949319,-0.706,
+ 0.100277,0.976969,-0.18835,0.5825,0.962948,-0.664625,
+ 0,0.410531,-0.911846,0.5,0.926712,-0.738539,
+ 0.356294,0.278471,-0.891913,0.595141,0.926408,-0.722453,
+ 0.184732,0.838005,-0.513442,0.5875,0.949319,-0.706,
+ 0,0.410531,-0.911846,0.5,0.926712,-0.738539,
+ 0.184732,0.838005,-0.513442,0.5875,0.949319,-0.706,
+ 0,0.805567,-0.592505,0.5,0.950535,-0.7215,
+ 0.356294,0.278471,-0.891913,0.595141,0.926408,-0.722453,
+ 0.66233,0.350197,-0.66233,0.674539,0.926104,-0.674539,
+ 0.448747,0.772821,-0.448747,0.660875,0.948104,-0.660875,
+ 0.448747,0.772821,-0.448747,0.660875,0.948104,-0.660875,
+ 0.184732,0.838005,-0.513442,0.5875,0.949319,-0.706,
+ 0.356294,0.278471,-0.891913,0.595141,0.926408,-0.722453,
+ -0.199329,0.959446,-0.199329,0.361333,0.958463,-0.638667,
+ -0.448747,0.772821,-0.448747,0.339125,0.948104,-0.660875,
+ -0.184732,0.838005,-0.513442,0.4125,0.949319,-0.706,
+ -0.199329,0.959446,-0.199329,0.361333,0.958463,-0.638667,
+ -0.184732,0.838005,-0.513442,0.4125,0.949319,-0.706,
+ -0.100277,0.976969,-0.18835,0.4175,0.962948,-0.664625,
+ -0.448747,0.772821,-0.448747,0.339125,0.948104,-0.660875,
+ -0.66233,0.350196,-0.66233,0.325461,0.926104,-0.674539,
+ -0.356294,0.278471,-0.891913,0.404859,0.926408,-0.722453,
+ -0.356294,0.278471,-0.891913,0.404859,0.926408,-0.722453,
+ -0.184732,0.838005,-0.513442,0.4125,0.949319,-0.706,
+ -0.448747,0.772821,-0.448747,0.339125,0.948104,-0.660875,
+ 0,0.410531,-0.911846,0.5,0.926712,-0.738539,
+ 0,0.805567,-0.592505,0.5,0.950535,-0.7215,
+ -0.184732,0.838005,-0.513442,0.4125,0.949319,-0.706,
+ 0,0.410531,-0.911846,0.5,0.926712,-0.738539,
+ -0.184732,0.838005,-0.513442,0.4125,0.949319,-0.706,
+ -0.356294,0.278471,-0.891913,0.404859,0.926408,-0.722453,
+ 0,0.969635,-0.244558,0.5,0.965162,-0.677562,
+ -0.100277,0.976969,-0.18835,0.4175,0.962948,-0.664625,
+ -0.184732,0.838005,-0.513442,0.4125,0.949319,-0.706,
+ 0,0.969635,-0.244558,0.5,0.965162,-0.677562,
+ -0.184732,0.838005,-0.513442,0.4125,0.949319,-0.706,
+ 0,0.805567,-0.592505,0.5,0.950535,-0.7215,
+ 0.199329,0.959446,0.199329,0.638667,0.958463,-0.361333,
+ 0.100277,0.976969,0.18835,0.5825,0.962948,-0.335375,
+ 0.079739,0.993621,0.079739,0.5905,0.971195,-0.4095,
+ 0.199329,0.959446,0.199329,0.638667,0.958463,-0.361333,
+ 0.079739,0.993621,0.079739,0.5905,0.971195,-0.4095,
+ 0.18835,0.976969,0.100277,0.664625,0.962948,-0.4175,
+ 0.100277,0.976969,0.18835,0.5825,0.962948,-0.335375,
+ 0,0.969635,0.244558,0.5,0.965162,-0.322437,
+ 0,0.996384,0.08496,0.5,0.973972,-0.40225,
+ 0,0.996384,0.08496,0.5,0.973972,-0.40225,
+ 0.079739,0.993621,0.079739,0.5905,0.971195,-0.4095,
+ 0.100277,0.976969,0.18835,0.5825,0.962948,-0.335375,
+ 0,1,0,0.5,0.976924,-0.5,
+ 0.08496,0.996384,0,0.59775,0.973972,-0.5,
+ 0.079739,0.993621,0.079739,0.5905,0.971195,-0.4095,
+ 0,1,0,0.5,0.976924,-0.5,
+ 0.079739,0.993621,0.079739,0.5905,0.971195,-0.4095,
+ 0,0.996384,0.08496,0.5,0.973972,-0.40225,
+ 0.08496,0.996384,0,0.59775,0.973972,-0.5,
+ 0.244558,0.969635,0,0.677562,0.965162,-0.5,
+ 0.18835,0.976969,0.100277,0.664625,0.962948,-0.4175,
+ 0.18835,0.976969,0.100277,0.664625,0.962948,-0.4175,
+ 0.079739,0.993621,0.079739,0.5905,0.971195,-0.4095,
+ 0.08496,0.996384,0,0.59775,0.973972,-0.5,
+ -0.199329,0.959446,0.199329,0.361333,0.958463,-0.361333,
+ -0.18835,0.976969,0.100277,0.335375,0.962948,-0.4175,
+ -0.079739,0.993621,0.079739,0.4095,0.971195,-0.4095,
+ -0.199329,0.959446,0.199329,0.361333,0.958463,-0.361333,
+ -0.079739,0.993621,0.079739,0.4095,0.971195,-0.4095,
+ -0.100277,0.976969,0.18835,0.4175,0.962948,-0.335375,
+ -0.18835,0.976969,0.100277,0.335375,0.962948,-0.4175,
+ -0.244558,0.969635,0,0.322437,0.965162,-0.5,
+ -0.08496,0.996384,0,0.40225,0.973972,-0.5,
+ -0.08496,0.996384,0,0.40225,0.973972,-0.5,
+ -0.079739,0.993621,0.079739,0.4095,0.971195,-0.4095,
+ -0.18835,0.976969,0.100277,0.335375,0.962948,-0.4175,
+ 0,1,0,0.5,0.976924,-0.5,
+ 0,0.996384,0.08496,0.5,0.973972,-0.40225,
+ -0.079739,0.993621,0.079739,0.4095,0.971195,-0.4095,
+ 0,1,0,0.5,0.976924,-0.5,
+ -0.079739,0.993621,0.079739,0.4095,0.971195,-0.4095,
+ -0.08496,0.996384,0,0.40225,0.973972,-0.5,
+ 0,0.996384,0.08496,0.5,0.973972,-0.40225,
+ 0,0.969635,0.244558,0.5,0.965162,-0.322437,
+ -0.100277,0.976969,0.18835,0.4175,0.962948,-0.335375,
+ -0.100277,0.976969,0.18835,0.4175,0.962948,-0.335375,
+ -0.079739,0.993621,0.079739,0.4095,0.971195,-0.4095,
+ 0,0.996384,0.08496,0.5,0.973972,-0.40225,
+ -0.199329,0.959446,-0.199329,0.361333,0.958463,-0.638667,
+ -0.100277,0.976969,-0.18835,0.4175,0.962948,-0.664625,
+ -0.079739,0.993621,-0.079739,0.4095,0.971195,-0.5905,
+ -0.199329,0.959446,-0.199329,0.361333,0.958463,-0.638667,
+ -0.079739,0.993621,-0.079739,0.4095,0.971195,-0.5905,
+ -0.18835,0.976969,-0.100277,0.335375,0.962948,-0.5825,
+ -0.100277,0.976969,-0.18835,0.4175,0.962948,-0.664625,
+ 0,0.969635,-0.244558,0.5,0.965162,-0.677562,
+ 0,0.996384,-0.08496,0.5,0.973972,-0.59775,
+ 0,0.996384,-0.08496,0.5,0.973972,-0.59775,
+ -0.079739,0.993621,-0.079739,0.4095,0.971195,-0.5905,
+ -0.100277,0.976969,-0.18835,0.4175,0.962948,-0.664625,
+ 0,1,0,0.5,0.976924,-0.5,
+ -0.08496,0.996384,0,0.40225,0.973972,-0.5,
+ -0.079739,0.993621,-0.079739,0.4095,0.971195,-0.5905,
+ 0,1,0,0.5,0.976924,-0.5,
+ -0.079739,0.993621,-0.079739,0.4095,0.971195,-0.5905,
+ 0,0.996384,-0.08496,0.5,0.973972,-0.59775,
+ -0.08496,0.996384,0,0.40225,0.973972,-0.5,
+ -0.244558,0.969635,0,0.322437,0.965162,-0.5,
+ -0.18835,0.976969,-0.100277,0.335375,0.962948,-0.5825,
+ -0.18835,0.976969,-0.100277,0.335375,0.962948,-0.5825,
+ -0.079739,0.993621,-0.079739,0.4095,0.971195,-0.5905,
+ -0.08496,0.996384,0,0.40225,0.973972,-0.5,
+ 0.199329,0.959446,-0.199329,0.638667,0.958463,-0.638667,
+ 0.18835,0.976969,-0.100277,0.664625,0.962948,-0.5825,
+ 0.079739,0.993621,-0.079739,0.5905,0.971195,-0.5905,
+ 0.199329,0.959446,-0.199329,0.638667,0.958463,-0.638667,
+ 0.079739,0.993621,-0.079739,0.5905,0.971195,-0.5905,
+ 0.100277,0.976969,-0.18835,0.5825,0.962948,-0.664625,
+ 0.18835,0.976969,-0.100277,0.664625,0.962948,-0.5825,
+ 0.244558,0.969635,0,0.677562,0.965162,-0.5,
+ 0.08496,0.996384,0,0.59775,0.973972,-0.5,
+ 0.08496,0.996384,0,0.59775,0.973972,-0.5,
+ 0.079739,0.993621,-0.079739,0.5905,0.971195,-0.5905,
+ 0.18835,0.976969,-0.100277,0.664625,0.962948,-0.5825,
+ 0,1,0,0.5,0.976924,-0.5,
+ 0,0.996384,-0.08496,0.5,0.973972,-0.59775,
+ 0.079739,0.993621,-0.079739,0.5905,0.971195,-0.5905,
+ 0,1,0,0.5,0.976924,-0.5,
+ 0.079739,0.993621,-0.079739,0.5905,0.971195,-0.5905,
+ 0.08496,0.996384,0,0.59775,0.973972,-0.5,
+ 0,0.996384,-0.08496,0.5,0.973972,-0.59775,
+ 0,0.969635,-0.244558,0.5,0.965162,-0.677562,
+ 0.100277,0.976969,-0.18835,0.5825,0.962948,-0.664625,
+ 0.100277,0.976969,-0.18835,0.5825,0.962948,-0.664625,
+ 0.079739,0.993621,-0.079739,0.5905,0.971195,-0.5905,
+ 0,0.996384,-0.08496,0.5,0.973972,-0.59775,
+ 0.92844,-0.14479,-0.342105,0.713281,0.838781,-0.591406,
+ 0.698103,-0.159073,-0.698103,0.667578,0.838781,-0.667578,
+ 0.703449,-0.101581,-0.703449,0.661906,0.769563,-0.661906,
+ 0.703449,-0.101581,-0.703449,0.661906,0.769563,-0.661906,
+ 0.934344,-0.092655,-0.344117,0.706063,0.769563,-0.588313,
+ 0.92844,-0.14479,-0.342105,0.713281,0.838781,-0.591406,
+ 0.705656,-0.064019,-0.705656,0.657523,0.686547,-0.657523,
+ 0.936848,-0.057446,-0.344986,0.700484,0.686547,-0.585922,
+ 0.934344,-0.092655,-0.344117,0.706063,0.769563,-0.588313,
+ 0.705656,-0.064019,-0.705656,0.657523,0.686547,-0.657523,
+ 0.934344,-0.092655,-0.344117,0.706063,0.769563,-0.588313,
+ 0.703449,-0.101581,-0.703449,0.661906,0.769563,-0.661906,
+ 0.936848,-0.057446,-0.344986,0.700484,0.686547,-0.585922,
+ 0.998665,-0.051663,0,0.714805,0.686547,-0.5,
+ 0.996389,-0.084903,0,0.720781,0.769563,-0.5,
+ 0.996389,-0.084903,0,0.720781,0.769563,-0.5,
+ 0.934344,-0.092655,-0.344117,0.706063,0.769563,-0.588313,
+ 0.936848,-0.057446,-0.344986,0.700484,0.686547,-0.585922,
+ 0.991208,-0.132313,0,0.728516,0.838781,-0.5,
+ 0.92844,-0.14479,-0.342105,0.713281,0.838781,-0.591406,
+ 0.934344,-0.092655,-0.344117,0.706063,0.769563,-0.588313,
+ 0.991208,-0.132313,0,0.728516,0.838781,-0.5,
+ 0.934344,-0.092655,-0.344117,0.706063,0.769563,-0.588313,
+ 0.996389,-0.084903,0,0.720781,0.769563,-0.5,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.958364,-0.000151,-0.285548,0.695563,0.494688,-0.583813,
+ 0.938032,-0.028246,-0.345395,0.696875,0.593625,-0.584375,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.938032,-0.028246,-0.345395,0.696875,0.593625,-0.584375,
+ 0.706706,-0.033664,-0.706706,0.654688,0.593625,-0.654688,
+ 0.958364,-0.000151,-0.285548,0.695563,0.494688,-0.583813,
+ 1,-0.00015,0,0.709531,0.494688,-0.5,
+ 0.999728,-0.023338,0,0.710938,0.593625,-0.5,
+ 0.999728,-0.023338,0,0.710938,0.593625,-0.5,
+ 0.938032,-0.028246,-0.345395,0.696875,0.593625,-0.584375,
+ 0.958364,-0.000151,-0.285548,0.695563,0.494688,-0.583813,
+ 0.998665,-0.051663,0,0.714805,0.686547,-0.5,
+ 0.936848,-0.057446,-0.344986,0.700484,0.686547,-0.585922,
+ 0.938032,-0.028246,-0.345395,0.696875,0.593625,-0.584375,
+ 0.998665,-0.051663,0,0.714805,0.686547,-0.5,
+ 0.938032,-0.028246,-0.345395,0.696875,0.593625,-0.584375,
+ 0.999728,-0.023338,0,0.710938,0.593625,-0.5,
+ 0.936848,-0.057446,-0.344986,0.700484,0.686547,-0.585922,
+ 0.705656,-0.064019,-0.705656,0.657523,0.686547,-0.657523,
+ 0.706706,-0.033664,-0.706706,0.654688,0.593625,-0.654688,
+ 0.706706,-0.033664,-0.706706,0.654688,0.593625,-0.654688,
+ 0.938032,-0.028246,-0.345395,0.696875,0.593625,-0.584375,
+ 0.936848,-0.057446,-0.344986,0.700484,0.686547,-0.585922,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.706706,-0.033664,0.706706,0.654688,0.593625,-0.345313,
+ 0.938032,-0.028246,0.345395,0.696875,0.593625,-0.415625,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.938032,-0.028246,0.345395,0.696875,0.593625,-0.415625,
+ 0.958364,-0.000151,0.285548,0.695563,0.494688,-0.416187,
+ 0.706706,-0.033664,0.706706,0.654688,0.593625,-0.345313,
+ 0.705656,-0.064019,0.705656,0.657523,0.686547,-0.342477,
+ 0.936848,-0.057446,0.344986,0.700484,0.686547,-0.414078,
+ 0.936848,-0.057446,0.344986,0.700484,0.686547,-0.414078,
+ 0.938032,-0.028246,0.345395,0.696875,0.593625,-0.415625,
+ 0.706706,-0.033664,0.706706,0.654688,0.593625,-0.345313,
+ 0.998665,-0.051663,0,0.714805,0.686547,-0.5,
+ 0.999728,-0.023338,0,0.710938,0.593625,-0.5,
+ 0.938032,-0.028246,0.345395,0.696875,0.593625,-0.415625,
+ 0.998665,-0.051663,0,0.714805,0.686547,-0.5,
+ 0.938032,-0.028246,0.345395,0.696875,0.593625,-0.415625,
+ 0.936848,-0.057446,0.344986,0.700484,0.686547,-0.414078,
+ 0.999728,-0.023338,0,0.710938,0.593625,-0.5,
+ 1,-0.00015,0,0.709531,0.494688,-0.5,
+ 0.958364,-0.000151,0.285548,0.695563,0.494688,-0.416187,
+ 0.958364,-0.000151,0.285548,0.695563,0.494688,-0.416187,
+ 0.938032,-0.028246,0.345395,0.696875,0.593625,-0.415625,
+ 0.999728,-0.023338,0,0.710938,0.593625,-0.5,
+ 0.703449,-0.101581,0.703449,0.661906,0.769563,-0.338094,
+ 0.698103,-0.159073,0.698103,0.667578,0.838781,-0.332422,
+ 0.92844,-0.14479,0.342105,0.713281,0.838781,-0.408594,
+ 0.92844,-0.14479,0.342105,0.713281,0.838781,-0.408594,
+ 0.934344,-0.092655,0.344117,0.706063,0.769563,-0.411687,
+ 0.703449,-0.101581,0.703449,0.661906,0.769563,-0.338094,
+ 0.991208,-0.132313,0,0.728516,0.838781,-0.5,
+ 0.996389,-0.084903,0,0.720781,0.769563,-0.5,
+ 0.934344,-0.092655,0.344117,0.706063,0.769563,-0.411687,
+ 0.991208,-0.132313,0,0.728516,0.838781,-0.5,
+ 0.934344,-0.092655,0.344117,0.706063,0.769563,-0.411687,
+ 0.92844,-0.14479,0.342105,0.713281,0.838781,-0.408594,
+ 0.996389,-0.084903,0,0.720781,0.769563,-0.5,
+ 0.998665,-0.051663,0,0.714805,0.686547,-0.5,
+ 0.936848,-0.057446,0.344986,0.700484,0.686547,-0.414078,
+ 0.936848,-0.057446,0.344986,0.700484,0.686547,-0.414078,
+ 0.934344,-0.092655,0.344117,0.706063,0.769563,-0.411687,
+ 0.996389,-0.084903,0,0.720781,0.769563,-0.5,
+ 0.705656,-0.064019,0.705656,0.657523,0.686547,-0.342477,
+ 0.703449,-0.101581,0.703449,0.661906,0.769563,-0.338094,
+ 0.934344,-0.092655,0.344117,0.706063,0.769563,-0.411687,
+ 0.705656,-0.064019,0.705656,0.657523,0.686547,-0.342477,
+ 0.934344,-0.092655,0.344117,0.706063,0.769563,-0.411687,
+ 0.936848,-0.057446,0.344986,0.700484,0.686547,-0.414078,
+ -0.342105,-0.14479,-0.92844,0.408594,0.838781,-0.713281,
+ -0.698103,-0.159073,-0.698103,0.332422,0.838781,-0.667578,
+ -0.703449,-0.101581,-0.703449,0.338094,0.769563,-0.661906,
+ -0.703449,-0.101581,-0.703449,0.338094,0.769563,-0.661906,
+ -0.344117,-0.092655,-0.934344,0.411687,0.769563,-0.706063,
+ -0.342105,-0.14479,-0.92844,0.408594,0.838781,-0.713281,
+ -0.705656,-0.064019,-0.705656,0.342477,0.686547,-0.657523,
+ -0.344986,-0.057446,-0.936848,0.414078,0.686547,-0.700484,
+ -0.344117,-0.092655,-0.934344,0.411687,0.769563,-0.706063,
+ -0.705656,-0.064019,-0.705656,0.342477,0.686547,-0.657523,
+ -0.344117,-0.092655,-0.934344,0.411687,0.769563,-0.706063,
+ -0.703449,-0.101581,-0.703449,0.338094,0.769563,-0.661906,
+ -0.344986,-0.057446,-0.936848,0.414078,0.686547,-0.700484,
+ 0,-0.051663,-0.998665,0.5,0.686547,-0.714805,
+ 0,-0.084903,-0.996389,0.5,0.769563,-0.720781,
+ 0,-0.084903,-0.996389,0.5,0.769563,-0.720781,
+ -0.344117,-0.092655,-0.934344,0.411687,0.769563,-0.706063,
+ -0.344986,-0.057446,-0.936848,0.414078,0.686547,-0.700484,
+ 0,-0.132313,-0.991208,0.5,0.838781,-0.728516,
+ -0.342105,-0.14479,-0.92844,0.408594,0.838781,-0.713281,
+ -0.344117,-0.092655,-0.934344,0.411687,0.769563,-0.706063,
+ 0,-0.132313,-0.991208,0.5,0.838781,-0.728516,
+ -0.344117,-0.092655,-0.934344,0.411687,0.769563,-0.706063,
+ 0,-0.084903,-0.996389,0.5,0.769563,-0.720781,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.285548,-0.000151,-0.958364,0.416187,0.494688,-0.695563,
+ -0.345395,-0.028246,-0.938032,0.415625,0.593625,-0.696875,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.345395,-0.028246,-0.938032,0.415625,0.593625,-0.696875,
+ -0.706706,-0.033664,-0.706706,0.345313,0.593625,-0.654688,
+ -0.285548,-0.000151,-0.958364,0.416187,0.494688,-0.695563,
+ 0,-0.00015,-1,0.5,0.494688,-0.709531,
+ 0,-0.023338,-0.999728,0.5,0.593625,-0.710938,
+ 0,-0.023338,-0.999728,0.5,0.593625,-0.710938,
+ -0.345395,-0.028246,-0.938032,0.415625,0.593625,-0.696875,
+ -0.285548,-0.000151,-0.958364,0.416187,0.494688,-0.695563,
+ 0,-0.051663,-0.998665,0.5,0.686547,-0.714805,
+ -0.344986,-0.057446,-0.936848,0.414078,0.686547,-0.700484,
+ -0.345395,-0.028246,-0.938032,0.415625,0.593625,-0.696875,
+ 0,-0.051663,-0.998665,0.5,0.686547,-0.714805,
+ -0.345395,-0.028246,-0.938032,0.415625,0.593625,-0.696875,
+ 0,-0.023338,-0.999728,0.5,0.593625,-0.710938,
+ -0.344986,-0.057446,-0.936848,0.414078,0.686547,-0.700484,
+ -0.705656,-0.064019,-0.705656,0.342477,0.686547,-0.657523,
+ -0.706706,-0.033664,-0.706706,0.345313,0.593625,-0.654688,
+ -0.706706,-0.033664,-0.706706,0.345313,0.593625,-0.654688,
+ -0.345395,-0.028246,-0.938032,0.415625,0.593625,-0.696875,
+ -0.344986,-0.057446,-0.936848,0.414078,0.686547,-0.700484,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.706706,-0.033664,-0.706706,0.654688,0.593625,-0.654688,
+ 0.345395,-0.028246,-0.938032,0.584375,0.593625,-0.696875,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.345395,-0.028246,-0.938032,0.584375,0.593625,-0.696875,
+ 0.285548,-0.000151,-0.958364,0.583813,0.494688,-0.695563,
+ 0.706706,-0.033664,-0.706706,0.654688,0.593625,-0.654688,
+ 0.705656,-0.064019,-0.705656,0.657523,0.686547,-0.657523,
+ 0.344986,-0.057446,-0.936848,0.585922,0.686547,-0.700484,
+ 0.344986,-0.057446,-0.936848,0.585922,0.686547,-0.700484,
+ 0.345395,-0.028246,-0.938032,0.584375,0.593625,-0.696875,
+ 0.706706,-0.033664,-0.706706,0.654688,0.593625,-0.654688,
+ 0,-0.051663,-0.998665,0.5,0.686547,-0.714805,
+ 0,-0.023338,-0.999728,0.5,0.593625,-0.710938,
+ 0.345395,-0.028246,-0.938032,0.584375,0.593625,-0.696875,
+ 0,-0.051663,-0.998665,0.5,0.686547,-0.714805,
+ 0.345395,-0.028246,-0.938032,0.584375,0.593625,-0.696875,
+ 0.344986,-0.057446,-0.936848,0.585922,0.686547,-0.700484,
+ 0,-0.023338,-0.999728,0.5,0.593625,-0.710938,
+ 0,-0.00015,-1,0.5,0.494688,-0.709531,
+ 0.285548,-0.000151,-0.958364,0.583813,0.494688,-0.695563,
+ 0.285548,-0.000151,-0.958364,0.583813,0.494688,-0.695563,
+ 0.345395,-0.028246,-0.938032,0.584375,0.593625,-0.696875,
+ 0,-0.023338,-0.999728,0.5,0.593625,-0.710938,
+ 0.703449,-0.101581,-0.703449,0.661906,0.769563,-0.661906,
+ 0.698103,-0.159073,-0.698103,0.667578,0.838781,-0.667578,
+ 0.342105,-0.14479,-0.92844,0.591406,0.838781,-0.713281,
+ 0.342105,-0.14479,-0.92844,0.591406,0.838781,-0.713281,
+ 0.344117,-0.092655,-0.934344,0.588313,0.769563,-0.706063,
+ 0.703449,-0.101581,-0.703449,0.661906,0.769563,-0.661906,
+ 0,-0.132313,-0.991208,0.5,0.838781,-0.728516,
+ 0,-0.084903,-0.996389,0.5,0.769563,-0.720781,
+ 0.344117,-0.092655,-0.934344,0.588313,0.769563,-0.706063,
+ 0,-0.132313,-0.991208,0.5,0.838781,-0.728516,
+ 0.344117,-0.092655,-0.934344,0.588313,0.769563,-0.706063,
+ 0.342105,-0.14479,-0.92844,0.591406,0.838781,-0.713281,
+ 0,-0.084903,-0.996389,0.5,0.769563,-0.720781,
+ 0,-0.051663,-0.998665,0.5,0.686547,-0.714805,
+ 0.344986,-0.057446,-0.936848,0.585922,0.686547,-0.700484,
+ 0.344986,-0.057446,-0.936848,0.585922,0.686547,-0.700484,
+ 0.344117,-0.092655,-0.934344,0.588313,0.769563,-0.706063,
+ 0,-0.084903,-0.996389,0.5,0.769563,-0.720781,
+ 0.705656,-0.064019,-0.705656,0.657523,0.686547,-0.657523,
+ 0.703449,-0.101581,-0.703449,0.661906,0.769563,-0.661906,
+ 0.344117,-0.092655,-0.934344,0.588313,0.769563,-0.706063,
+ 0.705656,-0.064019,-0.705656,0.657523,0.686547,-0.657523,
+ 0.344117,-0.092655,-0.934344,0.588313,0.769563,-0.706063,
+ 0.344986,-0.057446,-0.936848,0.585922,0.686547,-0.700484,
+ -0.703449,-0.101581,0.703449,0.338094,0.769563,-0.338094,
+ -0.698103,-0.159073,0.698103,0.332422,0.838781,-0.332422,
+ -0.342105,-0.144791,0.92844,0.408594,0.838781,-0.286719,
+ -0.342105,-0.144791,0.92844,0.408594,0.838781,-0.286719,
+ -0.344116,-0.092655,0.934344,0.411687,0.769563,-0.293938,
+ -0.703449,-0.101581,0.703449,0.338094,0.769563,-0.338094,
+ 0,-0.132314,0.991208,0.5,0.838781,-0.271484,
+ 0,-0.084902,0.996389,0.5,0.769563,-0.279219,
+ -0.344116,-0.092655,0.934344,0.411687,0.769563,-0.293938,
+ 0,-0.132314,0.991208,0.5,0.838781,-0.271484,
+ -0.344116,-0.092655,0.934344,0.411687,0.769563,-0.293938,
+ -0.342105,-0.144791,0.92844,0.408594,0.838781,-0.286719,
+ 0,-0.084902,0.996389,0.5,0.769563,-0.279219,
+ 0,-0.051662,0.998665,0.5,0.686547,-0.285195,
+ -0.344986,-0.057445,0.936848,0.414078,0.686547,-0.299516,
+ -0.344986,-0.057445,0.936848,0.414078,0.686547,-0.299516,
+ -0.344116,-0.092655,0.934344,0.411687,0.769563,-0.293938,
+ 0,-0.084902,0.996389,0.5,0.769563,-0.279219,
+ -0.705656,-0.064019,0.705656,0.342477,0.686547,-0.342477,
+ -0.703449,-0.101581,0.703449,0.338094,0.769563,-0.338094,
+ -0.344116,-0.092655,0.934344,0.411687,0.769563,-0.293938,
+ -0.705656,-0.064019,0.705656,0.342477,0.686547,-0.342477,
+ -0.344116,-0.092655,0.934344,0.411687,0.769563,-0.293938,
+ -0.344986,-0.057445,0.936848,0.414078,0.686547,-0.299516,
+ 0.342105,-0.144791,0.92844,0.591406,0.838781,-0.286719,
+ 0.698103,-0.159073,0.698103,0.667578,0.838781,-0.332422,
+ 0.703449,-0.101581,0.703449,0.661906,0.769563,-0.338094,
+ 0.703449,-0.101581,0.703449,0.661906,0.769563,-0.338094,
+ 0.344116,-0.092655,0.934344,0.588313,0.769563,-0.293938,
+ 0.342105,-0.144791,0.92844,0.591406,0.838781,-0.286719,
+ 0.705656,-0.064019,0.705656,0.657523,0.686547,-0.342477,
+ 0.344986,-0.057445,0.936848,0.585922,0.686547,-0.299516,
+ 0.344116,-0.092655,0.934344,0.588313,0.769563,-0.293938,
+ 0.705656,-0.064019,0.705656,0.657523,0.686547,-0.342477,
+ 0.344116,-0.092655,0.934344,0.588313,0.769563,-0.293938,
+ 0.703449,-0.101581,0.703449,0.661906,0.769563,-0.338094,
+ 0.344986,-0.057445,0.936848,0.585922,0.686547,-0.299516,
+ 0,-0.051662,0.998665,0.5,0.686547,-0.285195,
+ 0,-0.084902,0.996389,0.5,0.769563,-0.279219,
+ 0,-0.084902,0.996389,0.5,0.769563,-0.279219,
+ 0.344116,-0.092655,0.934344,0.588313,0.769563,-0.293938,
+ 0.344986,-0.057445,0.936848,0.585922,0.686547,-0.299516,
+ 0,-0.132314,0.991208,0.5,0.838781,-0.271484,
+ 0.342105,-0.144791,0.92844,0.591406,0.838781,-0.286719,
+ 0.344116,-0.092655,0.934344,0.588313,0.769563,-0.293938,
+ 0,-0.132314,0.991208,0.5,0.838781,-0.271484,
+ 0.344116,-0.092655,0.934344,0.588313,0.769563,-0.293938,
+ 0,-0.084902,0.996389,0.5,0.769563,-0.279219,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.285548,-0.000151,0.958364,0.583813,0.494688,-0.304437,
+ 0.345395,-0.028246,0.938032,0.584375,0.593625,-0.303125,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.345395,-0.028246,0.938032,0.584375,0.593625,-0.303125,
+ 0.706706,-0.033664,0.706706,0.654688,0.593625,-0.345313,
+ 0.285548,-0.000151,0.958364,0.583813,0.494688,-0.304437,
+ 0,-0.00015,1,0.5,0.494688,-0.290469,
+ 0,-0.023338,0.999728,0.5,0.593625,-0.289063,
+ 0,-0.023338,0.999728,0.5,0.593625,-0.289063,
+ 0.345395,-0.028246,0.938032,0.584375,0.593625,-0.303125,
+ 0.285548,-0.000151,0.958364,0.583813,0.494688,-0.304437,
+ 0,-0.051662,0.998665,0.5,0.686547,-0.285195,
+ 0.344986,-0.057445,0.936848,0.585922,0.686547,-0.299516,
+ 0.345395,-0.028246,0.938032,0.584375,0.593625,-0.303125,
+ 0,-0.051662,0.998665,0.5,0.686547,-0.285195,
+ 0.345395,-0.028246,0.938032,0.584375,0.593625,-0.303125,
+ 0,-0.023338,0.999728,0.5,0.593625,-0.289063,
+ 0.344986,-0.057445,0.936848,0.585922,0.686547,-0.299516,
+ 0.705656,-0.064019,0.705656,0.657523,0.686547,-0.342477,
+ 0.706706,-0.033664,0.706706,0.654688,0.593625,-0.345313,
+ 0.706706,-0.033664,0.706706,0.654688,0.593625,-0.345313,
+ 0.345395,-0.028246,0.938032,0.584375,0.593625,-0.303125,
+ 0.344986,-0.057445,0.936848,0.585922,0.686547,-0.299516,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.706706,-0.033664,0.706706,0.345313,0.593625,-0.345313,
+ -0.345395,-0.028246,0.938032,0.415625,0.593625,-0.303125,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.345395,-0.028246,0.938032,0.415625,0.593625,-0.303125,
+ -0.285548,-0.000151,0.958364,0.416187,0.494688,-0.304437,
+ -0.706706,-0.033664,0.706706,0.345313,0.593625,-0.345313,
+ -0.705656,-0.064019,0.705656,0.342477,0.686547,-0.342477,
+ -0.344986,-0.057445,0.936848,0.414078,0.686547,-0.299516,
+ -0.344986,-0.057445,0.936848,0.414078,0.686547,-0.299516,
+ -0.345395,-0.028246,0.938032,0.415625,0.593625,-0.303125,
+ -0.706706,-0.033664,0.706706,0.345313,0.593625,-0.345313,
+ 0,-0.051662,0.998665,0.5,0.686547,-0.285195,
+ 0,-0.023338,0.999728,0.5,0.593625,-0.289063,
+ -0.345395,-0.028246,0.938032,0.415625,0.593625,-0.303125,
+ 0,-0.051662,0.998665,0.5,0.686547,-0.285195,
+ -0.345395,-0.028246,0.938032,0.415625,0.593625,-0.303125,
+ -0.344986,-0.057445,0.936848,0.414078,0.686547,-0.299516,
+ 0,-0.023338,0.999728,0.5,0.593625,-0.289063,
+ 0,-0.00015,1,0.5,0.494688,-0.290469,
+ -0.285548,-0.000151,0.958364,0.416187,0.494688,-0.304437,
+ -0.285548,-0.000151,0.958364,0.416187,0.494688,-0.304437,
+ -0.345395,-0.028246,0.938032,0.415625,0.593625,-0.303125,
+ 0,-0.023338,0.999728,0.5,0.593625,-0.289063,
+ -0.703449,-0.101581,-0.703449,0.338094,0.769563,-0.661906,
+ -0.698103,-0.159073,-0.698103,0.332422,0.838781,-0.667578,
+ -0.92844,-0.144791,-0.342105,0.286719,0.838781,-0.591406,
+ -0.92844,-0.144791,-0.342105,0.286719,0.838781,-0.591406,
+ -0.934344,-0.092655,-0.344116,0.293938,0.769563,-0.588313,
+ -0.703449,-0.101581,-0.703449,0.338094,0.769563,-0.661906,
+ -0.991208,-0.132314,0,0.271484,0.838781,-0.5,
+ -0.996389,-0.084902,0,0.279219,0.769563,-0.5,
+ -0.934344,-0.092655,-0.344116,0.293938,0.769563,-0.588313,
+ -0.991208,-0.132314,0,0.271484,0.838781,-0.5,
+ -0.934344,-0.092655,-0.344116,0.293938,0.769563,-0.588313,
+ -0.92844,-0.144791,-0.342105,0.286719,0.838781,-0.591406,
+ -0.996389,-0.084902,0,0.279219,0.769563,-0.5,
+ -0.998665,-0.051662,0,0.285195,0.686547,-0.5,
+ -0.936848,-0.057445,-0.344986,0.299516,0.686547,-0.585922,
+ -0.936848,-0.057445,-0.344986,0.299516,0.686547,-0.585922,
+ -0.934344,-0.092655,-0.344116,0.293938,0.769563,-0.588313,
+ -0.996389,-0.084902,0,0.279219,0.769563,-0.5,
+ -0.705656,-0.064019,-0.705656,0.342477,0.686547,-0.657523,
+ -0.703449,-0.101581,-0.703449,0.338094,0.769563,-0.661906,
+ -0.934344,-0.092655,-0.344116,0.293938,0.769563,-0.588313,
+ -0.705656,-0.064019,-0.705656,0.342477,0.686547,-0.657523,
+ -0.934344,-0.092655,-0.344116,0.293938,0.769563,-0.588313,
+ -0.936848,-0.057445,-0.344986,0.299516,0.686547,-0.585922,
+ -0.92844,-0.144791,0.342105,0.286719,0.838781,-0.408594,
+ -0.698103,-0.159073,0.698103,0.332422,0.838781,-0.332422,
+ -0.703449,-0.101581,0.703449,0.338094,0.769563,-0.338094,
+ -0.703449,-0.101581,0.703449,0.338094,0.769563,-0.338094,
+ -0.934344,-0.092655,0.344116,0.293938,0.769563,-0.411687,
+ -0.92844,-0.144791,0.342105,0.286719,0.838781,-0.408594,
+ -0.705656,-0.064019,0.705656,0.342477,0.686547,-0.342477,
+ -0.936848,-0.057445,0.344986,0.299516,0.686547,-0.414078,
+ -0.934344,-0.092655,0.344116,0.293938,0.769563,-0.411687,
+ -0.705656,-0.064019,0.705656,0.342477,0.686547,-0.342477,
+ -0.934344,-0.092655,0.344116,0.293938,0.769563,-0.411687,
+ -0.703449,-0.101581,0.703449,0.338094,0.769563,-0.338094,
+ -0.936848,-0.057445,0.344986,0.299516,0.686547,-0.414078,
+ -0.998665,-0.051662,0,0.285195,0.686547,-0.5,
+ -0.996389,-0.084902,0,0.279219,0.769563,-0.5,
+ -0.996389,-0.084902,0,0.279219,0.769563,-0.5,
+ -0.934344,-0.092655,0.344116,0.293938,0.769563,-0.411687,
+ -0.936848,-0.057445,0.344986,0.299516,0.686547,-0.414078,
+ -0.991208,-0.132314,0,0.271484,0.838781,-0.5,
+ -0.92844,-0.144791,0.342105,0.286719,0.838781,-0.408594,
+ -0.934344,-0.092655,0.344116,0.293938,0.769563,-0.411687,
+ -0.991208,-0.132314,0,0.271484,0.838781,-0.5,
+ -0.934344,-0.092655,0.344116,0.293938,0.769563,-0.411687,
+ -0.996389,-0.084902,0,0.279219,0.769563,-0.5,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.958364,-0.000151,0.285548,0.304437,0.494688,-0.416187,
+ -0.938032,-0.028246,0.345395,0.303125,0.593625,-0.415625,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.938032,-0.028246,0.345395,0.303125,0.593625,-0.415625,
+ -0.706706,-0.033664,0.706706,0.345313,0.593625,-0.345313,
+ -0.958364,-0.000151,0.285548,0.304437,0.494688,-0.416187,
+ -1,-0.00015,0,0.290469,0.494688,-0.5,
+ -0.999728,-0.023338,0,0.289063,0.593625,-0.5,
+ -0.999728,-0.023338,0,0.289063,0.593625,-0.5,
+ -0.938032,-0.028246,0.345395,0.303125,0.593625,-0.415625,
+ -0.958364,-0.000151,0.285548,0.304437,0.494688,-0.416187,
+ -0.998665,-0.051662,0,0.285195,0.686547,-0.5,
+ -0.936848,-0.057445,0.344986,0.299516,0.686547,-0.414078,
+ -0.938032,-0.028246,0.345395,0.303125,0.593625,-0.415625,
+ -0.998665,-0.051662,0,0.285195,0.686547,-0.5,
+ -0.938032,-0.028246,0.345395,0.303125,0.593625,-0.415625,
+ -0.999728,-0.023338,0,0.289063,0.593625,-0.5,
+ -0.936848,-0.057445,0.344986,0.299516,0.686547,-0.414078,
+ -0.705656,-0.064019,0.705656,0.342477,0.686547,-0.342477,
+ -0.706706,-0.033664,0.706706,0.345313,0.593625,-0.345313,
+ -0.706706,-0.033664,0.706706,0.345313,0.593625,-0.345313,
+ -0.938032,-0.028246,0.345395,0.303125,0.593625,-0.415625,
+ -0.936848,-0.057445,0.344986,0.299516,0.686547,-0.414078,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.706706,-0.033664,-0.706706,0.345313,0.593625,-0.654688,
+ -0.938032,-0.028246,-0.345395,0.303125,0.593625,-0.584375,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.938032,-0.028246,-0.345395,0.303125,0.593625,-0.584375,
+ -0.958364,-0.000151,-0.285548,0.304437,0.494688,-0.583813,
+ -0.706706,-0.033664,-0.706706,0.345313,0.593625,-0.654688,
+ -0.705656,-0.064019,-0.705656,0.342477,0.686547,-0.657523,
+ -0.936848,-0.057445,-0.344986,0.299516,0.686547,-0.585922,
+ -0.936848,-0.057445,-0.344986,0.299516,0.686547,-0.585922,
+ -0.938032,-0.028246,-0.345395,0.303125,0.593625,-0.584375,
+ -0.706706,-0.033664,-0.706706,0.345313,0.593625,-0.654688,
+ -0.998665,-0.051662,0,0.285195,0.686547,-0.5,
+ -0.999728,-0.023338,0,0.289063,0.593625,-0.5,
+ -0.938032,-0.028246,-0.345395,0.303125,0.593625,-0.584375,
+ -0.998665,-0.051662,0,0.285195,0.686547,-0.5,
+ -0.938032,-0.028246,-0.345395,0.303125,0.593625,-0.584375,
+ -0.936848,-0.057445,-0.344986,0.299516,0.686547,-0.585922,
+ -0.999728,-0.023338,0,0.289063,0.593625,-0.5,
+ -1,-0.00015,0,0.290469,0.494688,-0.5,
+ -0.958364,-0.000151,-0.285548,0.304437,0.494688,-0.583813,
+ -0.958364,-0.000151,-0.285548,0.304437,0.494688,-0.583813,
+ -0.938032,-0.028246,-0.345395,0.303125,0.593625,-0.584375,
+ -0.999728,-0.023338,0,0.289063,0.593625,-0.5,
+ -0.703939,0.094548,-0.703939,0.338094,0.207062,-0.661906,
+ -0.699155,0.149544,-0.699156,0.332422,0.132531,-0.667578,
+ -0.342523,0.135808,-0.929642,0.408594,0.132531,-0.713281,
+ -0.342523,0.135808,-0.929642,0.408594,0.132531,-0.713281,
+ -0.344301,0.086306,-0.934884,0.411687,0.207062,-0.706063,
+ -0.703939,0.094548,-0.703939,0.338094,0.207062,-0.661906,
+ 0,0.12379,-0.992308,0.5,0.132531,-0.728516,
+ 0,0.079157,-0.996862,0.5,0.207062,-0.720781,
+ -0.344301,0.086306,-0.934884,0.411687,0.207062,-0.706063,
+ 0,0.12379,-0.992308,0.5,0.132531,-0.728516,
+ -0.344301,0.086306,-0.934884,0.411687,0.207062,-0.706063,
+ -0.342523,0.135808,-0.929642,0.408594,0.132531,-0.713281,
+ 0,0.079157,-0.996862,0.5,0.207062,-0.720781,
+ 0,0.048741,-0.998811,0.5,0.295922,-0.714805,
+ -0.345045,0.054036,-0.937029,0.414078,0.295922,-0.700484,
+ -0.345045,0.054036,-0.937029,0.414078,0.295922,-0.700484,
+ -0.344301,0.086306,-0.934884,0.411687,0.207062,-0.706063,
+ 0,0.079157,-0.996862,0.5,0.207062,-0.720781,
+ -0.70583,0.060067,-0.70583,0.342477,0.295922,-0.657523,
+ -0.703939,0.094548,-0.703939,0.338094,0.207062,-0.661906,
+ -0.344301,0.086306,-0.934884,0.411687,0.207062,-0.706063,
+ -0.70583,0.060067,-0.70583,0.342477,0.295922,-0.657523,
+ -0.344301,0.086306,-0.934884,0.411687,0.207062,-0.706063,
+ -0.345045,0.054036,-0.937029,0.414078,0.295922,-0.700484,
+ 0.342523,0.135808,-0.929642,0.591406,0.132531,-0.713281,
+ 0.699155,0.149544,-0.699155,0.667578,0.132531,-0.667578,
+ 0.703939,0.094547,-0.703939,0.661906,0.207062,-0.661906,
+ 0.703939,0.094547,-0.703939,0.661906,0.207062,-0.661906,
+ 0.344301,0.086306,-0.934884,0.588313,0.207062,-0.706063,
+ 0.342523,0.135808,-0.929642,0.591406,0.132531,-0.713281,
+ 0.70583,0.060067,-0.70583,0.657523,0.295922,-0.657523,
+ 0.345045,0.054036,-0.937029,0.585922,0.295922,-0.700484,
+ 0.344301,0.086306,-0.934884,0.588313,0.207062,-0.706063,
+ 0.70583,0.060067,-0.70583,0.657523,0.295922,-0.657523,
+ 0.344301,0.086306,-0.934884,0.588313,0.207062,-0.706063,
+ 0.703939,0.094547,-0.703939,0.661906,0.207062,-0.661906,
+ 0.345045,0.054036,-0.937029,0.585922,0.295922,-0.700484,
+ 0,0.048741,-0.998811,0.5,0.295922,-0.714805,
+ 0,0.079157,-0.996862,0.5,0.207062,-0.720781,
+ 0,0.079157,-0.996862,0.5,0.207062,-0.720781,
+ 0.344301,0.086306,-0.934884,0.588313,0.207062,-0.706063,
+ 0.345045,0.054036,-0.937029,0.585922,0.295922,-0.700484,
+ 0,0.12379,-0.992308,0.5,0.132531,-0.728516,
+ 0.342523,0.135808,-0.929642,0.591406,0.132531,-0.713281,
+ 0.344301,0.086306,-0.934884,0.588313,0.207062,-0.706063,
+ 0,0.12379,-0.992308,0.5,0.132531,-0.728516,
+ 0.344301,0.086306,-0.934884,0.588313,0.207062,-0.706063,
+ 0,0.079157,-0.996862,0.5,0.207062,-0.720781,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.285548,-0.000151,-0.958364,0.583813,0.494688,-0.695563,
+ 0.345404,0.027067,-0.938064,0.584375,0.393625,-0.696875,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.345404,0.027067,-0.938064,0.584375,0.393625,-0.696875,
+ 0.706741,0.032156,-0.706741,0.654688,0.393625,-0.654688,
+ 0.285548,-0.000151,-0.958364,0.583813,0.494688,-0.695563,
+ 0,-0.00015,-1,0.5,0.494688,-0.709531,
+ 0,0.022461,-0.999748,0.5,0.393625,-0.710938,
+ 0,0.022461,-0.999748,0.5,0.393625,-0.710938,
+ 0.345404,0.027067,-0.938064,0.584375,0.393625,-0.696875,
+ 0.285548,-0.000151,-0.958364,0.583813,0.494688,-0.695563,
+ 0,0.048741,-0.998811,0.5,0.295922,-0.714805,
+ 0.345045,0.054036,-0.937029,0.585922,0.295922,-0.700484,
+ 0.345404,0.027067,-0.938064,0.584375,0.393625,-0.696875,
+ 0,0.048741,-0.998811,0.5,0.295922,-0.714805,
+ 0.345404,0.027067,-0.938064,0.584375,0.393625,-0.696875,
+ 0,0.022461,-0.999748,0.5,0.393625,-0.710938,
+ 0.345045,0.054036,-0.937029,0.585922,0.295922,-0.700484,
+ 0.70583,0.060067,-0.70583,0.657523,0.295922,-0.657523,
+ 0.706741,0.032156,-0.706741,0.654688,0.393625,-0.654688,
+ 0.706741,0.032156,-0.706741,0.654688,0.393625,-0.654688,
+ 0.345404,0.027067,-0.938064,0.584375,0.393625,-0.696875,
+ 0.345045,0.054036,-0.937029,0.585922,0.295922,-0.700484,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.706741,0.032156,-0.706741,0.345313,0.393625,-0.654688,
+ -0.345404,0.027067,-0.938064,0.415625,0.393625,-0.696875,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.345404,0.027067,-0.938064,0.415625,0.393625,-0.696875,
+ -0.285548,-0.000151,-0.958364,0.416187,0.494688,-0.695563,
+ -0.706741,0.032156,-0.706741,0.345313,0.393625,-0.654688,
+ -0.70583,0.060067,-0.70583,0.342477,0.295922,-0.657523,
+ -0.345045,0.054036,-0.937029,0.414078,0.295922,-0.700484,
+ -0.345045,0.054036,-0.937029,0.414078,0.295922,-0.700484,
+ -0.345404,0.027067,-0.938064,0.415625,0.393625,-0.696875,
+ -0.706741,0.032156,-0.706741,0.345313,0.393625,-0.654688,
+ 0,0.048741,-0.998811,0.5,0.295922,-0.714805,
+ 0,0.022461,-0.999748,0.5,0.393625,-0.710938,
+ -0.345404,0.027067,-0.938064,0.415625,0.393625,-0.696875,
+ 0,0.048741,-0.998811,0.5,0.295922,-0.714805,
+ -0.345404,0.027067,-0.938064,0.415625,0.393625,-0.696875,
+ -0.345045,0.054036,-0.937029,0.414078,0.295922,-0.700484,
+ 0,0.022461,-0.999748,0.5,0.393625,-0.710938,
+ 0,-0.00015,-1,0.5,0.494688,-0.709531,
+ -0.285548,-0.000151,-0.958364,0.416187,0.494688,-0.695563,
+ -0.285548,-0.000151,-0.958364,0.416187,0.494688,-0.695563,
+ -0.345404,0.027067,-0.938064,0.415625,0.393625,-0.696875,
+ 0,0.022461,-0.999748,0.5,0.393625,-0.710938,
+ -0.929642,0.135808,-0.342523,0.286719,0.132531,-0.591406,
+ -0.699155,0.149544,-0.699156,0.332422,0.132531,-0.667578,
+ -0.703939,0.094548,-0.703939,0.338094,0.207062,-0.661906,
+ -0.703939,0.094548,-0.703939,0.338094,0.207062,-0.661906,
+ -0.934884,0.086306,-0.344301,0.293938,0.207062,-0.588313,
+ -0.929642,0.135808,-0.342523,0.286719,0.132531,-0.591406,
+ -0.70583,0.060067,-0.70583,0.342477,0.295922,-0.657523,
+ -0.937029,0.054035,-0.345045,0.299516,0.295922,-0.585922,
+ -0.934884,0.086306,-0.344301,0.293938,0.207062,-0.588313,
+ -0.70583,0.060067,-0.70583,0.342477,0.295922,-0.657523,
+ -0.934884,0.086306,-0.344301,0.293938,0.207062,-0.588313,
+ -0.703939,0.094548,-0.703939,0.338094,0.207062,-0.661906,
+ -0.937029,0.054035,-0.345045,0.299516,0.295922,-0.585922,
+ -0.998811,0.04874,0,0.285195,0.295922,-0.5,
+ -0.996862,0.079157,0,0.279219,0.207062,-0.5,
+ -0.996862,0.079157,0,0.279219,0.207062,-0.5,
+ -0.934884,0.086306,-0.344301,0.293938,0.207062,-0.588313,
+ -0.937029,0.054035,-0.345045,0.299516,0.295922,-0.585922,
+ -0.992308,0.12379,0,0.271484,0.132531,-0.5,
+ -0.929642,0.135808,-0.342523,0.286719,0.132531,-0.591406,
+ -0.934884,0.086306,-0.344301,0.293938,0.207062,-0.588313,
+ -0.992308,0.12379,0,0.271484,0.132531,-0.5,
+ -0.934884,0.086306,-0.344301,0.293938,0.207062,-0.588313,
+ -0.996862,0.079157,0,0.279219,0.207062,-0.5,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.958364,-0.000151,-0.285548,0.304437,0.494688,-0.583813,
+ -0.938064,0.027067,-0.345404,0.303125,0.393625,-0.584375,
+ -0.707107,-0.000155,-0.707107,0.346344,0.494688,-0.653656,
+ -0.938064,0.027067,-0.345404,0.303125,0.393625,-0.584375,
+ -0.706741,0.032156,-0.706741,0.345313,0.393625,-0.654688,
+ -0.958364,-0.000151,-0.285548,0.304437,0.494688,-0.583813,
+ -1,-0.00015,0,0.290469,0.494688,-0.5,
+ -0.999748,0.022461,0,0.289063,0.393625,-0.5,
+ -0.999748,0.022461,0,0.289063,0.393625,-0.5,
+ -0.938064,0.027067,-0.345404,0.303125,0.393625,-0.584375,
+ -0.958364,-0.000151,-0.285548,0.304437,0.494688,-0.583813,
+ -0.998811,0.04874,0,0.285195,0.295922,-0.5,
+ -0.937029,0.054035,-0.345045,0.299516,0.295922,-0.585922,
+ -0.938064,0.027067,-0.345404,0.303125,0.393625,-0.584375,
+ -0.998811,0.04874,0,0.285195,0.295922,-0.5,
+ -0.938064,0.027067,-0.345404,0.303125,0.393625,-0.584375,
+ -0.999748,0.022461,0,0.289063,0.393625,-0.5,
+ -0.937029,0.054035,-0.345045,0.299516,0.295922,-0.585922,
+ -0.70583,0.060067,-0.70583,0.342477,0.295922,-0.657523,
+ -0.706741,0.032156,-0.706741,0.345313,0.393625,-0.654688,
+ -0.706741,0.032156,-0.706741,0.345313,0.393625,-0.654688,
+ -0.938064,0.027067,-0.345404,0.303125,0.393625,-0.584375,
+ -0.937029,0.054035,-0.345045,0.299516,0.295922,-0.585922,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.706741,0.032156,0.706741,0.345313,0.393625,-0.345313,
+ -0.938064,0.027067,0.345404,0.303125,0.393625,-0.415625,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.938064,0.027067,0.345404,0.303125,0.393625,-0.415625,
+ -0.958364,-0.000151,0.285548,0.304437,0.494688,-0.416187,
+ -0.706741,0.032156,0.706741,0.345313,0.393625,-0.345313,
+ -0.70583,0.060067,0.70583,0.342477,0.295922,-0.342477,
+ -0.937029,0.054035,0.345045,0.299516,0.295922,-0.414078,
+ -0.937029,0.054035,0.345045,0.299516,0.295922,-0.414078,
+ -0.938064,0.027067,0.345404,0.303125,0.393625,-0.415625,
+ -0.706741,0.032156,0.706741,0.345313,0.393625,-0.345313,
+ -0.998811,0.04874,0,0.285195,0.295922,-0.5,
+ -0.999748,0.022461,0,0.289063,0.393625,-0.5,
+ -0.938064,0.027067,0.345404,0.303125,0.393625,-0.415625,
+ -0.998811,0.04874,0,0.285195,0.295922,-0.5,
+ -0.938064,0.027067,0.345404,0.303125,0.393625,-0.415625,
+ -0.937029,0.054035,0.345045,0.299516,0.295922,-0.414078,
+ -0.999748,0.022461,0,0.289063,0.393625,-0.5,
+ -1,-0.00015,0,0.290469,0.494688,-0.5,
+ -0.958364,-0.000151,0.285548,0.304437,0.494688,-0.416187,
+ -0.958364,-0.000151,0.285548,0.304437,0.494688,-0.416187,
+ -0.938064,0.027067,0.345404,0.303125,0.393625,-0.415625,
+ -0.999748,0.022461,0,0.289063,0.393625,-0.5,
+ -0.703939,0.094548,0.703939,0.338094,0.207062,-0.338094,
+ -0.699155,0.149545,0.699155,0.332422,0.132531,-0.332422,
+ -0.929642,0.135808,0.342523,0.286719,0.132531,-0.408594,
+ -0.929642,0.135808,0.342523,0.286719,0.132531,-0.408594,
+ -0.934884,0.086306,0.344301,0.293938,0.207062,-0.411687,
+ -0.703939,0.094548,0.703939,0.338094,0.207062,-0.338094,
+ -0.992308,0.12379,0,0.271484,0.132531,-0.5,
+ -0.996862,0.079157,0,0.279219,0.207062,-0.5,
+ -0.934884,0.086306,0.344301,0.293938,0.207062,-0.411687,
+ -0.992308,0.12379,0,0.271484,0.132531,-0.5,
+ -0.934884,0.086306,0.344301,0.293938,0.207062,-0.411687,
+ -0.929642,0.135808,0.342523,0.286719,0.132531,-0.408594,
+ -0.996862,0.079157,0,0.279219,0.207062,-0.5,
+ -0.998811,0.04874,0,0.285195,0.295922,-0.5,
+ -0.937029,0.054035,0.345045,0.299516,0.295922,-0.414078,
+ -0.937029,0.054035,0.345045,0.299516,0.295922,-0.414078,
+ -0.934884,0.086306,0.344301,0.293938,0.207062,-0.411687,
+ -0.996862,0.079157,0,0.279219,0.207062,-0.5,
+ -0.70583,0.060067,0.70583,0.342477,0.295922,-0.342477,
+ -0.703939,0.094548,0.703939,0.338094,0.207062,-0.338094,
+ -0.934884,0.086306,0.344301,0.293938,0.207062,-0.411687,
+ -0.70583,0.060067,0.70583,0.342477,0.295922,-0.342477,
+ -0.934884,0.086306,0.344301,0.293938,0.207062,-0.411687,
+ -0.937029,0.054035,0.345045,0.299516,0.295922,-0.414078,
+ -0.342523,0.135808,0.929642,0.408594,0.132531,-0.286719,
+ -0.699155,0.149545,0.699155,0.332422,0.132531,-0.332422,
+ -0.703939,0.094548,0.703939,0.338094,0.207062,-0.338094,
+ -0.703939,0.094548,0.703939,0.338094,0.207062,-0.338094,
+ -0.344301,0.086306,0.934884,0.411687,0.207062,-0.293938,
+ -0.342523,0.135808,0.929642,0.408594,0.132531,-0.286719,
+ -0.70583,0.060067,0.70583,0.342477,0.295922,-0.342477,
+ -0.345045,0.054035,0.937029,0.414078,0.295922,-0.299516,
+ -0.344301,0.086306,0.934884,0.411687,0.207062,-0.293938,
+ -0.70583,0.060067,0.70583,0.342477,0.295922,-0.342477,
+ -0.344301,0.086306,0.934884,0.411687,0.207062,-0.293938,
+ -0.703939,0.094548,0.703939,0.338094,0.207062,-0.338094,
+ -0.345045,0.054035,0.937029,0.414078,0.295922,-0.299516,
+ 0,0.04874,0.998811,0.5,0.295922,-0.285195,
+ 0,0.079157,0.996862,0.5,0.207062,-0.279219,
+ 0,0.079157,0.996862,0.5,0.207062,-0.279219,
+ -0.344301,0.086306,0.934884,0.411687,0.207062,-0.293938,
+ -0.345045,0.054035,0.937029,0.414078,0.295922,-0.299516,
+ 0,0.12379,0.992308,0.5,0.132531,-0.271484,
+ -0.342523,0.135808,0.929642,0.408594,0.132531,-0.286719,
+ -0.344301,0.086306,0.934884,0.411687,0.207062,-0.293938,
+ 0,0.12379,0.992308,0.5,0.132531,-0.271484,
+ -0.344301,0.086306,0.934884,0.411687,0.207062,-0.293938,
+ 0,0.079157,0.996862,0.5,0.207062,-0.279219,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.285548,-0.000151,0.958364,0.416187,0.494688,-0.304437,
+ -0.345404,0.027067,0.938064,0.415625,0.393625,-0.303125,
+ -0.707107,-0.000155,0.707107,0.346344,0.494688,-0.346344,
+ -0.345404,0.027067,0.938064,0.415625,0.393625,-0.303125,
+ -0.706741,0.032156,0.706741,0.345313,0.393625,-0.345313,
+ -0.285548,-0.000151,0.958364,0.416187,0.494688,-0.304437,
+ 0,-0.00015,1,0.5,0.494688,-0.290469,
+ 0,0.022461,0.999748,0.5,0.393625,-0.289063,
+ 0,0.022461,0.999748,0.5,0.393625,-0.289063,
+ -0.345404,0.027067,0.938064,0.415625,0.393625,-0.303125,
+ -0.285548,-0.000151,0.958364,0.416187,0.494688,-0.304437,
+ 0,0.04874,0.998811,0.5,0.295922,-0.285195,
+ -0.345045,0.054035,0.937029,0.414078,0.295922,-0.299516,
+ -0.345404,0.027067,0.938064,0.415625,0.393625,-0.303125,
+ 0,0.04874,0.998811,0.5,0.295922,-0.285195,
+ -0.345404,0.027067,0.938064,0.415625,0.393625,-0.303125,
+ 0,0.022461,0.999748,0.5,0.393625,-0.289063,
+ -0.345045,0.054035,0.937029,0.414078,0.295922,-0.299516,
+ -0.70583,0.060067,0.70583,0.342477,0.295922,-0.342477,
+ -0.706741,0.032156,0.706741,0.345313,0.393625,-0.345313,
+ -0.706741,0.032156,0.706741,0.345313,0.393625,-0.345313,
+ -0.345404,0.027067,0.938064,0.415625,0.393625,-0.303125,
+ -0.345045,0.054035,0.937029,0.414078,0.295922,-0.299516,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.706741,0.032156,0.706741,0.654688,0.393625,-0.345313,
+ 0.345404,0.027067,0.938064,0.584375,0.393625,-0.303125,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.345404,0.027067,0.938064,0.584375,0.393625,-0.303125,
+ 0.285548,-0.000151,0.958364,0.583813,0.494688,-0.304437,
+ 0.706741,0.032156,0.706741,0.654688,0.393625,-0.345313,
+ 0.70583,0.060067,0.70583,0.657523,0.295922,-0.342477,
+ 0.345045,0.054035,0.937029,0.585922,0.295922,-0.299516,
+ 0.345045,0.054035,0.937029,0.585922,0.295922,-0.299516,
+ 0.345404,0.027067,0.938064,0.584375,0.393625,-0.303125,
+ 0.706741,0.032156,0.706741,0.654688,0.393625,-0.345313,
+ 0,0.04874,0.998811,0.5,0.295922,-0.285195,
+ 0,0.022461,0.999748,0.5,0.393625,-0.289063,
+ 0.345404,0.027067,0.938064,0.584375,0.393625,-0.303125,
+ 0,0.04874,0.998811,0.5,0.295922,-0.285195,
+ 0.345404,0.027067,0.938064,0.584375,0.393625,-0.303125,
+ 0.345045,0.054035,0.937029,0.585922,0.295922,-0.299516,
+ 0,0.022461,0.999748,0.5,0.393625,-0.289063,
+ 0,-0.00015,1,0.5,0.494688,-0.290469,
+ 0.285548,-0.000151,0.958364,0.583813,0.494688,-0.304437,
+ 0.285548,-0.000151,0.958364,0.583813,0.494688,-0.304437,
+ 0.345404,0.027067,0.938064,0.584375,0.393625,-0.303125,
+ 0,0.022461,0.999748,0.5,0.393625,-0.289063,
+ 0.703939,0.094548,0.703939,0.661906,0.207062,-0.338094,
+ 0.699156,0.149544,0.699155,0.667578,0.132531,-0.332422,
+ 0.342523,0.135808,0.929642,0.591406,0.132531,-0.286719,
+ 0.342523,0.135808,0.929642,0.591406,0.132531,-0.286719,
+ 0.344301,0.086306,0.934884,0.588313,0.207062,-0.293938,
+ 0.703939,0.094548,0.703939,0.661906,0.207062,-0.338094,
+ 0,0.12379,0.992308,0.5,0.132531,-0.271484,
+ 0,0.079157,0.996862,0.5,0.207062,-0.279219,
+ 0.344301,0.086306,0.934884,0.588313,0.207062,-0.293938,
+ 0,0.12379,0.992308,0.5,0.132531,-0.271484,
+ 0.344301,0.086306,0.934884,0.588313,0.207062,-0.293938,
+ 0.342523,0.135808,0.929642,0.591406,0.132531,-0.286719,
+ 0,0.079157,0.996862,0.5,0.207062,-0.279219,
+ 0,0.04874,0.998811,0.5,0.295922,-0.285195,
+ 0.345045,0.054035,0.937029,0.585922,0.295922,-0.299516,
+ 0.345045,0.054035,0.937029,0.585922,0.295922,-0.299516,
+ 0.344301,0.086306,0.934884,0.588313,0.207062,-0.293938,
+ 0,0.079157,0.996862,0.5,0.207062,-0.279219,
+ 0.70583,0.060067,0.70583,0.657523,0.295922,-0.342477,
+ 0.703939,0.094548,0.703939,0.661906,0.207062,-0.338094,
+ 0.344301,0.086306,0.934884,0.588313,0.207062,-0.293938,
+ 0.70583,0.060067,0.70583,0.657523,0.295922,-0.342477,
+ 0.344301,0.086306,0.934884,0.588313,0.207062,-0.293938,
+ 0.345045,0.054035,0.937029,0.585922,0.295922,-0.299516,
+ 0.929642,0.135808,0.342523,0.713281,0.132531,-0.408594,
+ 0.699156,0.149544,0.699155,0.667578,0.132531,-0.332422,
+ 0.703939,0.094548,0.703939,0.661906,0.207062,-0.338094,
+ 0.703939,0.094548,0.703939,0.661906,0.207062,-0.338094,
+ 0.934884,0.086306,0.344301,0.706063,0.207062,-0.411687,
+ 0.929642,0.135808,0.342523,0.713281,0.132531,-0.408594,
+ 0.70583,0.060067,0.70583,0.657523,0.295922,-0.342477,
+ 0.937029,0.054036,0.345045,0.700484,0.295922,-0.414078,
+ 0.934884,0.086306,0.344301,0.706063,0.207062,-0.411687,
+ 0.70583,0.060067,0.70583,0.657523,0.295922,-0.342477,
+ 0.934884,0.086306,0.344301,0.706063,0.207062,-0.411687,
+ 0.703939,0.094548,0.703939,0.661906,0.207062,-0.338094,
+ 0.937029,0.054036,0.345045,0.700484,0.295922,-0.414078,
+ 0.998811,0.048741,0,0.714805,0.295922,-0.5,
+ 0.996862,0.079157,0,0.720781,0.207062,-0.5,
+ 0.996862,0.079157,0,0.720781,0.207062,-0.5,
+ 0.934884,0.086306,0.344301,0.706063,0.207062,-0.411687,
+ 0.937029,0.054036,0.345045,0.700484,0.295922,-0.414078,
+ 0.992308,0.12379,0,0.728516,0.132531,-0.5,
+ 0.929642,0.135808,0.342523,0.713281,0.132531,-0.408594,
+ 0.934884,0.086306,0.344301,0.706063,0.207062,-0.411687,
+ 0.992308,0.12379,0,0.728516,0.132531,-0.5,
+ 0.934884,0.086306,0.344301,0.706063,0.207062,-0.411687,
+ 0.996862,0.079157,0,0.720781,0.207062,-0.5,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.958364,-0.000151,0.285548,0.695563,0.494688,-0.416187,
+ 0.938064,0.027067,0.345404,0.696875,0.393625,-0.415625,
+ 0.707107,-0.000155,0.707107,0.653656,0.494688,-0.346344,
+ 0.938064,0.027067,0.345404,0.696875,0.393625,-0.415625,
+ 0.706741,0.032156,0.706741,0.654688,0.393625,-0.345313,
+ 0.958364,-0.000151,0.285548,0.695563,0.494688,-0.416187,
+ 1,-0.00015,0,0.709531,0.494688,-0.5,
+ 0.999748,0.022461,0,0.710938,0.393625,-0.5,
+ 0.999748,0.022461,0,0.710938,0.393625,-0.5,
+ 0.938064,0.027067,0.345404,0.696875,0.393625,-0.415625,
+ 0.958364,-0.000151,0.285548,0.695563,0.494688,-0.416187,
+ 0.998811,0.048741,0,0.714805,0.295922,-0.5,
+ 0.937029,0.054036,0.345045,0.700484,0.295922,-0.414078,
+ 0.938064,0.027067,0.345404,0.696875,0.393625,-0.415625,
+ 0.998811,0.048741,0,0.714805,0.295922,-0.5,
+ 0.938064,0.027067,0.345404,0.696875,0.393625,-0.415625,
+ 0.999748,0.022461,0,0.710938,0.393625,-0.5,
+ 0.937029,0.054036,0.345045,0.700484,0.295922,-0.414078,
+ 0.70583,0.060067,0.70583,0.657523,0.295922,-0.342477,
+ 0.706741,0.032156,0.706741,0.654688,0.393625,-0.345313,
+ 0.706741,0.032156,0.706741,0.654688,0.393625,-0.345313,
+ 0.938064,0.027067,0.345404,0.696875,0.393625,-0.415625,
+ 0.937029,0.054036,0.345045,0.700484,0.295922,-0.414078,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.706741,0.032156,-0.706741,0.654688,0.393625,-0.654688,
+ 0.938064,0.027067,-0.345404,0.696875,0.393625,-0.584375,
+ 0.707107,-0.000155,-0.707107,0.653656,0.494688,-0.653656,
+ 0.938064,0.027067,-0.345404,0.696875,0.393625,-0.584375,
+ 0.958364,-0.000151,-0.285548,0.695563,0.494688,-0.583813,
+ 0.706741,0.032156,-0.706741,0.654688,0.393625,-0.654688,
+ 0.70583,0.060067,-0.70583,0.657523,0.295922,-0.657523,
+ 0.937029,0.054036,-0.345045,0.700484,0.295922,-0.585922,
+ 0.937029,0.054036,-0.345045,0.700484,0.295922,-0.585922,
+ 0.938064,0.027067,-0.345404,0.696875,0.393625,-0.584375,
+ 0.706741,0.032156,-0.706741,0.654688,0.393625,-0.654688,
+ 0.998811,0.048741,0,0.714805,0.295922,-0.5,
+ 0.999748,0.022461,0,0.710938,0.393625,-0.5,
+ 0.938064,0.027067,-0.345404,0.696875,0.393625,-0.584375,
+ 0.998811,0.048741,0,0.714805,0.295922,-0.5,
+ 0.938064,0.027067,-0.345404,0.696875,0.393625,-0.584375,
+ 0.937029,0.054036,-0.345045,0.700484,0.295922,-0.585922,
+ 0.999748,0.022461,0,0.710938,0.393625,-0.5,
+ 1,-0.00015,0,0.709531,0.494688,-0.5,
+ 0.958364,-0.000151,-0.285548,0.695563,0.494688,-0.583813,
+ 0.958364,-0.000151,-0.285548,0.695563,0.494688,-0.583813,
+ 0.938064,0.027067,-0.345404,0.696875,0.393625,-0.584375,
+ 0.999748,0.022461,0,0.710938,0.393625,-0.5,
+ 0.703939,0.094547,-0.703939,0.661906,0.207062,-0.661906,
+ 0.699155,0.149544,-0.699155,0.667578,0.132531,-0.667578,
+ 0.929642,0.135808,-0.342523,0.713281,0.132531,-0.591406,
+ 0.929642,0.135808,-0.342523,0.713281,0.132531,-0.591406,
+ 0.934884,0.086306,-0.344301,0.706063,0.207062,-0.588313,
+ 0.703939,0.094547,-0.703939,0.661906,0.207062,-0.661906,
+ 0.992308,0.12379,0,0.728516,0.132531,-0.5,
+ 0.996862,0.079157,0,0.720781,0.207062,-0.5,
+ 0.934884,0.086306,-0.344301,0.706063,0.207062,-0.588313,
+ 0.992308,0.12379,0,0.728516,0.132531,-0.5,
+ 0.934884,0.086306,-0.344301,0.706063,0.207062,-0.588313,
+ 0.929642,0.135808,-0.342523,0.713281,0.132531,-0.591406,
+ 0.996862,0.079157,0,0.720781,0.207062,-0.5,
+ 0.998811,0.048741,0,0.714805,0.295922,-0.5,
+ 0.937029,0.054036,-0.345045,0.700484,0.295922,-0.585922,
+ 0.937029,0.054036,-0.345045,0.700484,0.295922,-0.585922,
+ 0.934884,0.086306,-0.344301,0.706063,0.207062,-0.588313,
+ 0.996862,0.079157,0,0.720781,0.207062,-0.5,
+ 0.70583,0.060067,-0.70583,0.657523,0.295922,-0.657523,
+ 0.703939,0.094547,-0.703939,0.661906,0.207062,-0.661906,
+ 0.934884,0.086306,-0.344301,0.706063,0.207062,-0.588313,
+ 0.70583,0.060067,-0.70583,0.657523,0.295922,-0.657523,
+ 0.934884,0.086306,-0.344301,0.706063,0.207062,-0.588313,
+ 0.937029,0.054036,-0.345045,0.700484,0.295922,-0.585922,
+ 0.699156,0.149544,0.699155,0.667578,0.132531,-0.332422,
+ 0.929642,0.135808,0.342523,0.713281,0.132531,-0.408594,
+ 0.919364,0.107435,0.378454,0.721812,0.077813,-0.404938,
+ 0.699156,0.149544,0.699155,0.667578,0.132531,-0.332422,
+ 0.919364,0.107435,0.378454,0.721812,0.077813,-0.404938,
+ 0.705578,0.065727,0.705578,0.674281,0.077813,-0.325719,
+ 0.929642,0.135808,0.342523,0.713281,0.132531,-0.408594,
+ 0.992308,0.12379,0,0.728516,0.132531,-0.5,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.919364,0.107435,0.378454,0.721812,0.077813,-0.404938,
+ 0.929642,0.135808,0.342523,0.713281,0.132531,-0.408594,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.914719,-0.404091,0,0.738539,0.039819,-0.5,
+ 0.892993,-0.274252,0.35686,0.722453,0.040123,-0.404859,
+ 0.892993,-0.274252,0.35686,0.722453,0.040123,-0.404859,
+ 0.919364,0.107435,0.378454,0.721812,0.077813,-0.404938,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.892993,-0.274252,0.35686,0.722453,0.040123,-0.404859,
+ 0.663755,-0.344758,0.663755,0.674539,0.040427,-0.325461,
+ 0.705578,0.065727,0.705578,0.674281,0.077813,-0.325719,
+ 0.705578,0.065727,0.705578,0.674281,0.077813,-0.325719,
+ 0.919364,0.107435,0.378454,0.721812,0.077813,-0.404938,
+ 0.892993,-0.274252,0.35686,0.722453,0.040123,-0.404859,
+ 0.699155,0.149544,-0.699155,0.667578,0.132531,-0.667578,
+ 0.705578,0.065727,-0.705578,0.674281,0.077813,-0.674281,
+ 0.919364,0.107435,-0.378454,0.721812,0.077813,-0.595062,
+ 0.699155,0.149544,-0.699155,0.667578,0.132531,-0.667578,
+ 0.919364,0.107435,-0.378454,0.721812,0.077813,-0.595062,
+ 0.929642,0.135808,-0.342523,0.713281,0.132531,-0.591406,
+ 0.705578,0.065727,-0.705578,0.674281,0.077813,-0.674281,
+ 0.663755,-0.344758,-0.663755,0.674539,0.040427,-0.674539,
+ 0.892994,-0.274252,-0.356859,0.722453,0.040123,-0.595141,
+ 0.892994,-0.274252,-0.356859,0.722453,0.040123,-0.595141,
+ 0.919364,0.107435,-0.378454,0.721812,0.077813,-0.595062,
+ 0.705578,0.065727,-0.705578,0.674281,0.077813,-0.674281,
+ 0.892994,-0.274252,-0.356859,0.722453,0.040123,-0.595141,
+ 0.914719,-0.404091,0,0.738539,0.039819,-0.5,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.919364,0.107435,-0.378454,0.721812,0.077813,-0.595062,
+ 0.892994,-0.274252,-0.356859,0.722453,0.040123,-0.595141,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.992308,0.12379,0,0.728516,0.132531,-0.5,
+ 0.929642,0.135808,-0.342523,0.713281,0.132531,-0.591406,
+ 0.929642,0.135808,-0.342523,0.713281,0.132531,-0.591406,
+ 0.919364,0.107435,-0.378454,0.721812,0.077813,-0.595062,
+ 0.995686,0.092789,0,0.737656,0.077813,-0.5,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.517064,-0.835523,-0.185868,0.706,0.016681,-0.5875,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.517064,-0.835523,-0.185868,0.706,0.016681,-0.5875,
+ 0.452944,-0.767908,-0.452945,0.660875,0.017896,-0.660875,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.596646,-0.802505,0,0.7215,0.015465,-0.5,
+ 0.517064,-0.835523,-0.185868,0.706,0.016681,-0.5875,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.517064,-0.835523,-0.185868,0.706,0.016681,-0.5875,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.914719,-0.404091,0,0.738539,0.039819,-0.5,
+ 0.892994,-0.274252,-0.356859,0.722453,0.040123,-0.595141,
+ 0.517064,-0.835523,-0.185868,0.706,0.016681,-0.5875,
+ 0.914719,-0.404091,0,0.738539,0.039819,-0.5,
+ 0.517064,-0.835523,-0.185868,0.706,0.016681,-0.5875,
+ 0.596646,-0.802505,0,0.7215,0.015465,-0.5,
+ 0.892994,-0.274252,-0.356859,0.722453,0.040123,-0.595141,
+ 0.663755,-0.344758,-0.663755,0.674539,0.040427,-0.674539,
+ 0.452944,-0.767908,-0.452945,0.660875,0.017896,-0.660875,
+ 0.452944,-0.767908,-0.452945,0.660875,0.017896,-0.660875,
+ 0.517064,-0.835523,-0.185868,0.706,0.016681,-0.5875,
+ 0.892994,-0.274252,-0.356859,0.722453,0.040123,-0.595141,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.452945,-0.767908,0.452945,0.660875,0.017896,-0.339125,
+ 0.517064,-0.835523,0.185868,0.706,0.016681,-0.4125,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.517064,-0.835523,0.185868,0.706,0.016681,-0.4125,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.452945,-0.767908,0.452945,0.660875,0.017896,-0.339125,
+ 0.663755,-0.344758,0.663755,0.674539,0.040427,-0.325461,
+ 0.892993,-0.274252,0.35686,0.722453,0.040123,-0.404859,
+ 0.892993,-0.274252,0.35686,0.722453,0.040123,-0.404859,
+ 0.517064,-0.835523,0.185868,0.706,0.016681,-0.4125,
+ 0.452945,-0.767908,0.452945,0.660875,0.017896,-0.339125,
+ 0.914719,-0.404091,0,0.738539,0.039819,-0.5,
+ 0.596646,-0.802505,0,0.7215,0.015465,-0.5,
+ 0.517064,-0.835523,0.185868,0.706,0.016681,-0.4125,
+ 0.914719,-0.404091,0,0.738539,0.039819,-0.5,
+ 0.517064,-0.835523,0.185868,0.706,0.016681,-0.4125,
+ 0.892993,-0.274252,0.35686,0.722453,0.040123,-0.404859,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.517064,-0.835523,0.185868,0.706,0.016681,-0.4125,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.517064,-0.835523,0.185868,0.706,0.016681,-0.4125,
+ 0.596646,-0.802505,0,0.7215,0.015465,-0.5,
+ 0.699155,0.149544,-0.699155,0.667578,0.132531,-0.667578,
+ 0.342523,0.135808,-0.929642,0.591406,0.132531,-0.713281,
+ 0.378454,0.107435,-0.919364,0.595062,0.077813,-0.721812,
+ 0.699155,0.149544,-0.699155,0.667578,0.132531,-0.667578,
+ 0.378454,0.107435,-0.919364,0.595062,0.077813,-0.721812,
+ 0.705578,0.065727,-0.705578,0.674281,0.077813,-0.674281,
+ 0.342523,0.135808,-0.929642,0.591406,0.132531,-0.713281,
+ 0,0.12379,-0.992308,0.5,0.132531,-0.728516,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ 0.378454,0.107435,-0.919364,0.595062,0.077813,-0.721812,
+ 0.342523,0.135808,-0.929642,0.591406,0.132531,-0.713281,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ 0,-0.404091,-0.914719,0.5,0.039819,-0.738539,
+ 0.356859,-0.274252,-0.892994,0.595141,0.040123,-0.722453,
+ 0.356859,-0.274252,-0.892994,0.595141,0.040123,-0.722453,
+ 0.378454,0.107435,-0.919364,0.595062,0.077813,-0.721812,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ 0.356859,-0.274252,-0.892994,0.595141,0.040123,-0.722453,
+ 0.663755,-0.344758,-0.663755,0.674539,0.040427,-0.674539,
+ 0.705578,0.065727,-0.705578,0.674281,0.077813,-0.674281,
+ 0.705578,0.065727,-0.705578,0.674281,0.077813,-0.674281,
+ 0.378454,0.107435,-0.919364,0.595062,0.077813,-0.721812,
+ 0.356859,-0.274252,-0.892994,0.595141,0.040123,-0.722453,
+ -0.699155,0.149544,-0.699156,0.332422,0.132531,-0.667578,
+ -0.705578,0.065727,-0.705578,0.325719,0.077813,-0.674281,
+ -0.378454,0.107435,-0.919364,0.404938,0.077813,-0.721812,
+ -0.699155,0.149544,-0.699156,0.332422,0.132531,-0.667578,
+ -0.378454,0.107435,-0.919364,0.404938,0.077813,-0.721812,
+ -0.342523,0.135808,-0.929642,0.408594,0.132531,-0.713281,
+ -0.705578,0.065727,-0.705578,0.325719,0.077813,-0.674281,
+ -0.663755,-0.344758,-0.663755,0.325461,0.040427,-0.674539,
+ -0.35686,-0.274252,-0.892993,0.404859,0.040123,-0.722453,
+ -0.35686,-0.274252,-0.892993,0.404859,0.040123,-0.722453,
+ -0.378454,0.107435,-0.919364,0.404938,0.077813,-0.721812,
+ -0.705578,0.065727,-0.705578,0.325719,0.077813,-0.674281,
+ -0.35686,-0.274252,-0.892993,0.404859,0.040123,-0.722453,
+ 0,-0.404091,-0.914719,0.5,0.039819,-0.738539,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ -0.378454,0.107435,-0.919364,0.404938,0.077813,-0.721812,
+ -0.35686,-0.274252,-0.892993,0.404859,0.040123,-0.722453,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ 0,0.12379,-0.992308,0.5,0.132531,-0.728516,
+ -0.342523,0.135808,-0.929642,0.408594,0.132531,-0.713281,
+ -0.342523,0.135808,-0.929642,0.408594,0.132531,-0.713281,
+ -0.378454,0.107435,-0.919364,0.404938,0.077813,-0.721812,
+ 0,0.092789,-0.995686,0.5,0.077813,-0.737656,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.185868,-0.835523,-0.517064,0.4125,0.016681,-0.706,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.185868,-0.835523,-0.517064,0.4125,0.016681,-0.706,
+ -0.452945,-0.767908,-0.452945,0.339125,0.017896,-0.660875,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ 0,-0.802505,-0.596646,0.5,0.015465,-0.7215,
+ -0.185868,-0.835523,-0.517064,0.4125,0.016681,-0.706,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ -0.185868,-0.835523,-0.517064,0.4125,0.016681,-0.706,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ 0,-0.404091,-0.914719,0.5,0.039819,-0.738539,
+ -0.35686,-0.274252,-0.892993,0.404859,0.040123,-0.722453,
+ -0.185868,-0.835523,-0.517064,0.4125,0.016681,-0.706,
+ 0,-0.404091,-0.914719,0.5,0.039819,-0.738539,
+ -0.185868,-0.835523,-0.517064,0.4125,0.016681,-0.706,
+ 0,-0.802505,-0.596646,0.5,0.015465,-0.7215,
+ -0.35686,-0.274252,-0.892993,0.404859,0.040123,-0.722453,
+ -0.663755,-0.344758,-0.663755,0.325461,0.040427,-0.674539,
+ -0.452945,-0.767908,-0.452945,0.339125,0.017896,-0.660875,
+ -0.452945,-0.767908,-0.452945,0.339125,0.017896,-0.660875,
+ -0.185868,-0.835523,-0.517064,0.4125,0.016681,-0.706,
+ -0.35686,-0.274252,-0.892993,0.404859,0.040123,-0.722453,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.452944,-0.767908,-0.452945,0.660875,0.017896,-0.660875,
+ 0.185868,-0.835523,-0.517064,0.5875,0.016681,-0.706,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.185868,-0.835523,-0.517064,0.5875,0.016681,-0.706,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0.452944,-0.767908,-0.452945,0.660875,0.017896,-0.660875,
+ 0.663755,-0.344758,-0.663755,0.674539,0.040427,-0.674539,
+ 0.356859,-0.274252,-0.892994,0.595141,0.040123,-0.722453,
+ 0.356859,-0.274252,-0.892994,0.595141,0.040123,-0.722453,
+ 0.185868,-0.835523,-0.517064,0.5875,0.016681,-0.706,
+ 0.452944,-0.767908,-0.452945,0.660875,0.017896,-0.660875,
+ 0,-0.404091,-0.914719,0.5,0.039819,-0.738539,
+ 0,-0.802505,-0.596646,0.5,0.015465,-0.7215,
+ 0.185868,-0.835523,-0.517064,0.5875,0.016681,-0.706,
+ 0,-0.404091,-0.914719,0.5,0.039819,-0.738539,
+ 0.185868,-0.835523,-0.517064,0.5875,0.016681,-0.706,
+ 0.356859,-0.274252,-0.892994,0.595141,0.040123,-0.722453,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0.185868,-0.835523,-0.517064,0.5875,0.016681,-0.706,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ 0.185868,-0.835523,-0.517064,0.5875,0.016681,-0.706,
+ 0,-0.802505,-0.596646,0.5,0.015465,-0.7215,
+ -0.699155,0.149544,-0.699156,0.332422,0.132531,-0.667578,
+ -0.929642,0.135808,-0.342523,0.286719,0.132531,-0.591406,
+ -0.919364,0.107436,-0.378454,0.278187,0.077813,-0.595062,
+ -0.699155,0.149544,-0.699156,0.332422,0.132531,-0.667578,
+ -0.919364,0.107436,-0.378454,0.278187,0.077813,-0.595062,
+ -0.705578,0.065727,-0.705578,0.325719,0.077813,-0.674281,
+ -0.929642,0.135808,-0.342523,0.286719,0.132531,-0.591406,
+ -0.992308,0.12379,0,0.271484,0.132531,-0.5,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.919364,0.107436,-0.378454,0.278187,0.077813,-0.595062,
+ -0.929642,0.135808,-0.342523,0.286719,0.132531,-0.591406,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.914719,-0.404091,0,0.261461,0.039819,-0.5,
+ -0.892993,-0.274251,-0.35686,0.277547,0.040123,-0.595141,
+ -0.892993,-0.274251,-0.35686,0.277547,0.040123,-0.595141,
+ -0.919364,0.107436,-0.378454,0.278187,0.077813,-0.595062,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.892993,-0.274251,-0.35686,0.277547,0.040123,-0.595141,
+ -0.663755,-0.344758,-0.663755,0.325461,0.040427,-0.674539,
+ -0.705578,0.065727,-0.705578,0.325719,0.077813,-0.674281,
+ -0.705578,0.065727,-0.705578,0.325719,0.077813,-0.674281,
+ -0.919364,0.107436,-0.378454,0.278187,0.077813,-0.595062,
+ -0.892993,-0.274251,-0.35686,0.277547,0.040123,-0.595141,
+ -0.699155,0.149545,0.699155,0.332422,0.132531,-0.332422,
+ -0.705578,0.065726,0.705578,0.325719,0.077813,-0.325719,
+ -0.919364,0.107436,0.378454,0.278187,0.077813,-0.404938,
+ -0.699155,0.149545,0.699155,0.332422,0.132531,-0.332422,
+ -0.919364,0.107436,0.378454,0.278187,0.077813,-0.404938,
+ -0.929642,0.135808,0.342523,0.286719,0.132531,-0.408594,
+ -0.705578,0.065726,0.705578,0.325719,0.077813,-0.325719,
+ -0.663755,-0.344758,0.663755,0.325461,0.040427,-0.325461,
+ -0.892993,-0.274251,0.35686,0.277547,0.040123,-0.404859,
+ -0.892993,-0.274251,0.35686,0.277547,0.040123,-0.404859,
+ -0.919364,0.107436,0.378454,0.278187,0.077813,-0.404938,
+ -0.705578,0.065726,0.705578,0.325719,0.077813,-0.325719,
+ -0.892993,-0.274251,0.35686,0.277547,0.040123,-0.404859,
+ -0.914719,-0.404091,0,0.261461,0.039819,-0.5,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.919364,0.107436,0.378454,0.278187,0.077813,-0.404938,
+ -0.892993,-0.274251,0.35686,0.277547,0.040123,-0.404859,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.992308,0.12379,0,0.271484,0.132531,-0.5,
+ -0.929642,0.135808,0.342523,0.286719,0.132531,-0.408594,
+ -0.929642,0.135808,0.342523,0.286719,0.132531,-0.408594,
+ -0.919364,0.107436,0.378454,0.278187,0.077813,-0.404938,
+ -0.995686,0.092789,0,0.262344,0.077813,-0.5,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.517064,-0.835523,0.185867,0.294,0.016681,-0.4125,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.517064,-0.835523,0.185867,0.294,0.016681,-0.4125,
+ -0.452945,-0.767908,0.452945,0.339125,0.017896,-0.339125,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.596646,-0.802505,0,0.2785,0.015465,-0.5,
+ -0.517064,-0.835523,0.185867,0.294,0.016681,-0.4125,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.517064,-0.835523,0.185867,0.294,0.016681,-0.4125,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.914719,-0.404091,0,0.261461,0.039819,-0.5,
+ -0.892993,-0.274251,0.35686,0.277547,0.040123,-0.404859,
+ -0.517064,-0.835523,0.185867,0.294,0.016681,-0.4125,
+ -0.914719,-0.404091,0,0.261461,0.039819,-0.5,
+ -0.517064,-0.835523,0.185867,0.294,0.016681,-0.4125,
+ -0.596646,-0.802505,0,0.2785,0.015465,-0.5,
+ -0.892993,-0.274251,0.35686,0.277547,0.040123,-0.404859,
+ -0.663755,-0.344758,0.663755,0.325461,0.040427,-0.325461,
+ -0.452945,-0.767908,0.452945,0.339125,0.017896,-0.339125,
+ -0.452945,-0.767908,0.452945,0.339125,0.017896,-0.339125,
+ -0.517064,-0.835523,0.185867,0.294,0.016681,-0.4125,
+ -0.892993,-0.274251,0.35686,0.277547,0.040123,-0.404859,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.452945,-0.767908,-0.452945,0.339125,0.017896,-0.660875,
+ -0.517064,-0.835523,-0.185868,0.294,0.016681,-0.5875,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.517064,-0.835523,-0.185868,0.294,0.016681,-0.5875,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.452945,-0.767908,-0.452945,0.339125,0.017896,-0.660875,
+ -0.663755,-0.344758,-0.663755,0.325461,0.040427,-0.674539,
+ -0.892993,-0.274251,-0.35686,0.277547,0.040123,-0.595141,
+ -0.892993,-0.274251,-0.35686,0.277547,0.040123,-0.595141,
+ -0.517064,-0.835523,-0.185868,0.294,0.016681,-0.5875,
+ -0.452945,-0.767908,-0.452945,0.339125,0.017896,-0.660875,
+ -0.914719,-0.404091,0,0.261461,0.039819,-0.5,
+ -0.596646,-0.802505,0,0.2785,0.015465,-0.5,
+ -0.517064,-0.835523,-0.185868,0.294,0.016681,-0.5875,
+ -0.914719,-0.404091,0,0.261461,0.039819,-0.5,
+ -0.517064,-0.835523,-0.185868,0.294,0.016681,-0.5875,
+ -0.892993,-0.274251,-0.35686,0.277547,0.040123,-0.595141,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.517064,-0.835523,-0.185868,0.294,0.016681,-0.5875,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.517064,-0.835523,-0.185868,0.294,0.016681,-0.5875,
+ -0.596646,-0.802505,0,0.2785,0.015465,-0.5,
+ -0.699155,0.149545,0.699155,0.332422,0.132531,-0.332422,
+ -0.342523,0.135808,0.929642,0.408594,0.132531,-0.286719,
+ -0.378454,0.107436,0.919364,0.404938,0.077813,-0.278187,
+ -0.699155,0.149545,0.699155,0.332422,0.132531,-0.332422,
+ -0.378454,0.107436,0.919364,0.404938,0.077813,-0.278187,
+ -0.705578,0.065726,0.705578,0.325719,0.077813,-0.325719,
+ -0.342523,0.135808,0.929642,0.408594,0.132531,-0.286719,
+ 0,0.12379,0.992308,0.5,0.132531,-0.271484,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ -0.378454,0.107436,0.919364,0.404938,0.077813,-0.278187,
+ -0.342523,0.135808,0.929642,0.408594,0.132531,-0.286719,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ 0,-0.404091,0.914719,0.5,0.039819,-0.261461,
+ -0.35686,-0.274251,0.892993,0.404859,0.040123,-0.277547,
+ -0.35686,-0.274251,0.892993,0.404859,0.040123,-0.277547,
+ -0.378454,0.107436,0.919364,0.404938,0.077813,-0.278187,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ -0.35686,-0.274251,0.892993,0.404859,0.040123,-0.277547,
+ -0.663755,-0.344758,0.663755,0.325461,0.040427,-0.325461,
+ -0.705578,0.065726,0.705578,0.325719,0.077813,-0.325719,
+ -0.705578,0.065726,0.705578,0.325719,0.077813,-0.325719,
+ -0.378454,0.107436,0.919364,0.404938,0.077813,-0.278187,
+ -0.35686,-0.274251,0.892993,0.404859,0.040123,-0.277547,
+ 0.699156,0.149544,0.699155,0.667578,0.132531,-0.332422,
+ 0.705578,0.065727,0.705578,0.674281,0.077813,-0.325719,
+ 0.378454,0.107436,0.919364,0.595062,0.077813,-0.278187,
+ 0.699156,0.149544,0.699155,0.667578,0.132531,-0.332422,
+ 0.378454,0.107436,0.919364,0.595062,0.077813,-0.278187,
+ 0.342523,0.135808,0.929642,0.591406,0.132531,-0.286719,
+ 0.705578,0.065727,0.705578,0.674281,0.077813,-0.325719,
+ 0.663755,-0.344758,0.663755,0.674539,0.040427,-0.325461,
+ 0.35686,-0.274251,0.892993,0.595141,0.040123,-0.277547,
+ 0.35686,-0.274251,0.892993,0.595141,0.040123,-0.277547,
+ 0.378454,0.107436,0.919364,0.595062,0.077813,-0.278187,
+ 0.705578,0.065727,0.705578,0.674281,0.077813,-0.325719,
+ 0.35686,-0.274251,0.892993,0.595141,0.040123,-0.277547,
+ 0,-0.404091,0.914719,0.5,0.039819,-0.261461,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ 0.378454,0.107436,0.919364,0.595062,0.077813,-0.278187,
+ 0.35686,-0.274251,0.892993,0.595141,0.040123,-0.277547,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ 0,0.12379,0.992308,0.5,0.132531,-0.271484,
+ 0.342523,0.135808,0.929642,0.591406,0.132531,-0.286719,
+ 0.342523,0.135808,0.929642,0.591406,0.132531,-0.286719,
+ 0.378454,0.107436,0.919364,0.595062,0.077813,-0.278187,
+ 0,0.092789,0.995686,0.5,0.077813,-0.262344,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.185868,-0.835523,0.517064,0.5875,0.016681,-0.294,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.185868,-0.835523,0.517064,0.5875,0.016681,-0.294,
+ 0.452945,-0.767908,0.452945,0.660875,0.017896,-0.339125,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ 0,-0.802505,0.596646,0.5,0.015465,-0.2785,
+ 0.185868,-0.835523,0.517064,0.5875,0.016681,-0.294,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ 0.185868,-0.835523,0.517064,0.5875,0.016681,-0.294,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0,-0.404091,0.914719,0.5,0.039819,-0.261461,
+ 0.35686,-0.274251,0.892993,0.595141,0.040123,-0.277547,
+ 0.185868,-0.835523,0.517064,0.5875,0.016681,-0.294,
+ 0,-0.404091,0.914719,0.5,0.039819,-0.261461,
+ 0.185868,-0.835523,0.517064,0.5875,0.016681,-0.294,
+ 0,-0.802505,0.596646,0.5,0.015465,-0.2785,
+ 0.35686,-0.274251,0.892993,0.595141,0.040123,-0.277547,
+ 0.663755,-0.344758,0.663755,0.674539,0.040427,-0.325461,
+ 0.452945,-0.767908,0.452945,0.660875,0.017896,-0.339125,
+ 0.452945,-0.767908,0.452945,0.660875,0.017896,-0.339125,
+ 0.185868,-0.835523,0.517064,0.5875,0.016681,-0.294,
+ 0.35686,-0.274251,0.892993,0.595141,0.040123,-0.277547,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.452945,-0.767908,0.452945,0.339125,0.017896,-0.339125,
+ -0.185867,-0.835523,0.517064,0.4125,0.016681,-0.294,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.185867,-0.835523,0.517064,0.4125,0.016681,-0.294,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ -0.452945,-0.767908,0.452945,0.339125,0.017896,-0.339125,
+ -0.663755,-0.344758,0.663755,0.325461,0.040427,-0.325461,
+ -0.35686,-0.274251,0.892993,0.404859,0.040123,-0.277547,
+ -0.35686,-0.274251,0.892993,0.404859,0.040123,-0.277547,
+ -0.185867,-0.835523,0.517064,0.4125,0.016681,-0.294,
+ -0.452945,-0.767908,0.452945,0.339125,0.017896,-0.339125,
+ 0,-0.404091,0.914719,0.5,0.039819,-0.261461,
+ 0,-0.802505,0.596646,0.5,0.015465,-0.2785,
+ -0.185867,-0.835523,0.517064,0.4125,0.016681,-0.294,
+ 0,-0.404091,0.914719,0.5,0.039819,-0.261461,
+ -0.185867,-0.835523,0.517064,0.4125,0.016681,-0.294,
+ -0.35686,-0.274251,0.892993,0.404859,0.040123,-0.277547,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ -0.185867,-0.835523,0.517064,0.4125,0.016681,-0.294,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ -0.185867,-0.835523,0.517064,0.4125,0.016681,-0.294,
+ 0,-0.802505,0.596646,0.5,0.015465,-0.2785,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1728,data,NULL};
+const struct gllist *s1_1=&frame;
diff --git a/hacks/glx/s1_2.c b/hacks/glx/s1_2.c
new file mode 100644
index 0000000..5f494de
--- /dev/null
+++ b/hacks/glx/s1_2.c
@@ -0,0 +1,1733 @@
+#include "gllist.h"
+static const float data[]={
+ 0.744225,-0.02143,-0.667585,0.865458,0.513412,-0.690781,
+ 0.945978,-0.110612,-0.304781,0.91525,0.49905,-0.604062,
+ 0.919806,-0.190639,-0.342948,0.925,0.532253,-0.600125,
+ 0.744225,-0.02143,-0.667585,0.865458,0.513412,-0.690781,
+ 0.919806,-0.190639,-0.342948,0.925,0.532253,-0.600125,
+ 0.749601,-0.05627,-0.659493,0.877427,0.54752,-0.683563,
+ 0.980435,-0.196846,0,0.931847,0.494263,-0.5,
+ 0.981457,-0.191681,0,0.940858,0.527164,-0.5,
+ 0.919806,-0.190639,-0.342948,0.925,0.532253,-0.600125,
+ 0.980435,-0.196846,0,0.931847,0.494263,-0.5,
+ 0.919806,-0.190639,-0.342948,0.925,0.532253,-0.600125,
+ 0.945978,-0.110612,-0.304781,0.91525,0.49905,-0.604062,
+ 0.981457,-0.191681,0,0.940858,0.527164,-0.5,
+ 0.973132,0.23025,0,0.945338,0.554869,-0.5,
+ 0.932108,0.142863,-0.332815,0.92981,0.559801,-0.596406,
+ 0.932108,0.142863,-0.332815,0.92981,0.559801,-0.596406,
+ 0.919806,-0.190639,-0.342948,0.925,0.532253,-0.600125,
+ 0.981457,-0.191681,0,0.940858,0.527164,-0.5,
+ 0.932108,0.142863,-0.332815,0.92981,0.559801,-0.596406,
+ 0.692376,0.299844,-0.656284,0.88375,0.575062,-0.676859,
+ 0.749601,-0.05627,-0.659493,0.877427,0.54752,-0.683563,
+ 0.749601,-0.05627,-0.659493,0.877427,0.54752,-0.683563,
+ 0.919806,-0.190639,-0.342948,0.925,0.532253,-0.600125,
+ 0.932108,0.142863,-0.332815,0.92981,0.559801,-0.596406,
+ 0.744225,-0.02143,0.667585,0.865458,0.513412,-0.309219,
+ 0.749602,-0.05627,0.659493,0.877427,0.54752,-0.316437,
+ 0.919806,-0.190639,0.342948,0.925,0.532253,-0.399875,
+ 0.744225,-0.02143,0.667585,0.865458,0.513412,-0.309219,
+ 0.919806,-0.190639,0.342948,0.925,0.532253,-0.399875,
+ 0.945978,-0.110612,0.304781,0.91525,0.49905,-0.395938,
+ 0.749602,-0.05627,0.659493,0.877427,0.54752,-0.316437,
+ 0.692376,0.299843,0.656284,0.88375,0.575062,-0.323141,
+ 0.932108,0.142863,0.332815,0.92981,0.559801,-0.403594,
+ 0.932108,0.142863,0.332815,0.92981,0.559801,-0.403594,
+ 0.919806,-0.190639,0.342948,0.925,0.532253,-0.399875,
+ 0.749602,-0.05627,0.659493,0.877427,0.54752,-0.316437,
+ 0.932108,0.142863,0.332815,0.92981,0.559801,-0.403594,
+ 0.973132,0.23025,0,0.945338,0.554869,-0.5,
+ 0.981457,-0.191681,0,0.940858,0.527164,-0.5,
+ 0.981457,-0.191681,0,0.940858,0.527164,-0.5,
+ 0.919806,-0.190639,0.342948,0.925,0.532253,-0.399875,
+ 0.932108,0.142863,0.332815,0.92981,0.559801,-0.403594,
+ 0.980435,-0.196846,0,0.931847,0.494263,-0.5,
+ 0.945978,-0.110612,0.304781,0.91525,0.49905,-0.395938,
+ 0.919806,-0.190639,0.342948,0.925,0.532253,-0.399875,
+ 0.980435,-0.196846,0,0.931847,0.494263,-0.5,
+ 0.919806,-0.190639,0.342948,0.925,0.532253,-0.399875,
+ 0.981457,-0.191681,0,0.940858,0.527164,-0.5,
+ 0.503147,0.845347,0.179535,0.858509,0.615264,-0.361333,
+ 0.496158,0.862422,0.100278,0.884513,0.611054,-0.4175,
+ 0.729041,0.662418,0.172342,0.919197,0.584697,-0.4125,
+ 0.503147,0.845347,0.179535,0.858509,0.615264,-0.361333,
+ 0.729041,0.662418,0.172342,0.919197,0.584697,-0.4125,
+ 0.634483,0.691277,0.345786,0.876135,0.59824,-0.339125,
+ 0.546916,0.837188,0,0.897467,0.608935,-0.5,
+ 0.788799,0.614652,0,0.934249,0.5808,-0.5,
+ 0.729041,0.662418,0.172342,0.919197,0.584697,-0.4125,
+ 0.546916,0.837188,0,0.897467,0.608935,-0.5,
+ 0.729041,0.662418,0.172342,0.919197,0.584697,-0.4125,
+ 0.496158,0.862422,0.100278,0.884513,0.611054,-0.4175,
+ 0.973132,0.23025,0,0.945338,0.554869,-0.5,
+ 0.932108,0.142863,0.332815,0.92981,0.559801,-0.403594,
+ 0.729041,0.662418,0.172342,0.919197,0.584697,-0.4125,
+ 0.973132,0.23025,0,0.945338,0.554869,-0.5,
+ 0.729041,0.662418,0.172342,0.919197,0.584697,-0.4125,
+ 0.788799,0.614652,0,0.934249,0.5808,-0.5,
+ 0.932108,0.142863,0.332815,0.92981,0.559801,-0.403594,
+ 0.692376,0.299843,0.656284,0.88375,0.575062,-0.323141,
+ 0.634483,0.691277,0.345786,0.876135,0.59824,-0.339125,
+ 0.634483,0.691277,0.345786,0.876135,0.59824,-0.339125,
+ 0.729041,0.662418,0.172342,0.919197,0.584697,-0.4125,
+ 0.932108,0.142863,0.332815,0.92981,0.559801,-0.403594,
+ 0.503147,0.845347,-0.179534,0.858509,0.615264,-0.638667,
+ 0.634482,0.691277,-0.345786,0.876135,0.59824,-0.660875,
+ 0.729041,0.662418,-0.172342,0.919197,0.584697,-0.5875,
+ 0.503147,0.845347,-0.179534,0.858509,0.615264,-0.638667,
+ 0.729041,0.662418,-0.172342,0.919197,0.584697,-0.5875,
+ 0.496158,0.862422,-0.100277,0.884513,0.611054,-0.5825,
+ 0.634482,0.691277,-0.345786,0.876135,0.59824,-0.660875,
+ 0.692376,0.299844,-0.656284,0.88375,0.575062,-0.676859,
+ 0.932108,0.142863,-0.332815,0.92981,0.559801,-0.596406,
+ 0.932108,0.142863,-0.332815,0.92981,0.559801,-0.596406,
+ 0.729041,0.662418,-0.172342,0.919197,0.584697,-0.5875,
+ 0.634482,0.691277,-0.345786,0.876135,0.59824,-0.660875,
+ 0.973132,0.23025,0,0.945338,0.554869,-0.5,
+ 0.788799,0.614652,0,0.934249,0.5808,-0.5,
+ 0.729041,0.662418,-0.172342,0.919197,0.584697,-0.5875,
+ 0.973132,0.23025,0,0.945338,0.554869,-0.5,
+ 0.729041,0.662418,-0.172342,0.919197,0.584697,-0.5875,
+ 0.932108,0.142863,-0.332815,0.92981,0.559801,-0.596406,
+ 0.546916,0.837188,0,0.897467,0.608935,-0.5,
+ 0.496158,0.862422,-0.100277,0.884513,0.611054,-0.5825,
+ 0.729041,0.662418,-0.172342,0.919197,0.584697,-0.5875,
+ 0.546916,0.837188,0,0.897467,0.608935,-0.5,
+ 0.729041,0.662418,-0.172342,0.919197,0.584697,-0.5875,
+ 0.788799,0.614652,0,0.934249,0.5808,-0.5,
+ 0.744225,-0.02143,0.667585,0.865458,0.513412,-0.309219,
+ 0.395884,0.173928,0.901679,0.782472,0.537348,-0.257187,
+ 0.413121,0.093331,0.905881,0.798138,0.572966,-0.266375,
+ 0.744225,-0.02143,0.667585,0.865458,0.513412,-0.309219,
+ 0.413121,0.093331,0.905881,0.798138,0.572966,-0.266375,
+ 0.749602,-0.05627,0.659493,0.877427,0.54752,-0.316437,
+ 0.395884,0.173928,0.901679,0.782472,0.537348,-0.257187,
+ 0.088734,0.313595,0.945402,0.682889,0.566071,-0.239844,
+ 0.075758,0.234707,0.96911,0.702992,0.603501,-0.249687,
+ 0.075758,0.234707,0.96911,0.702992,0.603501,-0.249687,
+ 0.413121,0.093331,0.905881,0.798138,0.572966,-0.266375,
+ 0.395884,0.173928,0.901679,0.782472,0.537348,-0.257187,
+ 0.190084,0.486023,0.853024,0.716506,0.632271,-0.258297,
+ 0.446948,0.373871,0.812686,0.80768,0.601112,-0.274594,
+ 0.413121,0.093331,0.905881,0.798138,0.572966,-0.266375,
+ 0.190084,0.486023,0.853024,0.716506,0.632271,-0.258297,
+ 0.413121,0.093331,0.905881,0.798138,0.572966,-0.266375,
+ 0.075758,0.234707,0.96911,0.702992,0.603501,-0.249687,
+ 0.692376,0.299843,0.656284,0.88375,0.575062,-0.323141,
+ 0.749602,-0.05627,0.659493,0.877427,0.54752,-0.316437,
+ 0.413121,0.093331,0.905881,0.798138,0.572966,-0.266375,
+ 0.692376,0.299843,0.656284,0.88375,0.575062,-0.323141,
+ 0.413121,0.093331,0.905881,0.798138,0.572966,-0.266375,
+ 0.446948,0.373871,0.812686,0.80768,0.601112,-0.274594,
+ -0.208655,0.445101,0.870832,0.583305,0.594795,-0.257187,
+ -0.468298,0.578298,0.668033,0.500319,0.618731,-0.309219,
+ -0.541739,0.509206,0.668752,0.528557,0.659482,-0.316437,
+ -0.541739,0.509206,0.668752,0.528557,0.659482,-0.316437,
+ -0.227561,0.374378,0.89892,0.607846,0.634036,-0.266375,
+ -0.208655,0.445101,0.870832,0.583305,0.594795,-0.257187,
+ -0.424048,0.688165,0.588737,0.548866,0.688331,-0.323141,
+ -0.109115,0.586342,0.802681,0.625134,0.662855,-0.274594,
+ -0.227561,0.374378,0.89892,0.607846,0.634036,-0.266375,
+ -0.424048,0.688165,0.588737,0.548866,0.688331,-0.323141,
+ -0.227561,0.374378,0.89892,0.607846,0.634036,-0.266375,
+ -0.541739,0.509206,0.668752,0.528557,0.659482,-0.316437,
+ -0.109115,0.586342,0.802681,0.625134,0.662855,-0.274594,
+ 0.190084,0.486023,0.853024,0.716506,0.632271,-0.258297,
+ 0.075758,0.234707,0.96911,0.702992,0.603501,-0.249687,
+ 0.075758,0.234707,0.96911,0.702992,0.603501,-0.249687,
+ -0.227561,0.374378,0.89892,0.607846,0.634036,-0.266375,
+ -0.109115,0.586342,0.802681,0.625134,0.662855,-0.274594,
+ 0.088734,0.313595,0.945402,0.682889,0.566071,-0.239844,
+ -0.208655,0.445101,0.870832,0.583305,0.594795,-0.257187,
+ -0.227561,0.374378,0.89892,0.607846,0.634036,-0.266375,
+ 0.088734,0.313595,0.945402,0.682889,0.566071,-0.239844,
+ -0.227561,0.374378,0.89892,0.607846,0.634036,-0.266375,
+ 0.075758,0.234707,0.96911,0.702992,0.603501,-0.249687,
+ 0.123897,0.972069,0.199329,0.596285,0.705555,-0.361333,
+ 0.226858,0.951027,0.209959,0.650852,0.69151,-0.335375,
+ 0.096538,0.86115,0.4991,0.641688,0.680252,-0.294,
+ 0.123897,0.972069,0.199329,0.596285,0.705555,-0.361333,
+ 0.096538,0.86115,0.4991,0.641688,0.680252,-0.294,
+ -0.070158,0.909054,0.410729,0.571915,0.702991,-0.339125,
+ 0.226858,0.951027,0.209959,0.650852,0.69151,-0.335375,
+ 0.329457,0.915147,0.232303,0.729578,0.666743,-0.322437,
+ 0.2681,0.82446,0.498385,0.724816,0.652913,-0.2785,
+ 0.2681,0.82446,0.498385,0.724816,0.652913,-0.2785,
+ 0.096538,0.86115,0.4991,0.641688,0.680252,-0.294,
+ 0.226858,0.951027,0.209959,0.650852,0.69151,-0.335375,
+ 0.190084,0.486023,0.853024,0.716506,0.632271,-0.258297,
+ -0.109115,0.586342,0.802681,0.625134,0.662855,-0.274594,
+ 0.096538,0.86115,0.4991,0.641688,0.680252,-0.294,
+ 0.190084,0.486023,0.853024,0.716506,0.632271,-0.258297,
+ 0.096538,0.86115,0.4991,0.641688,0.680252,-0.294,
+ 0.2681,0.82446,0.498385,0.724816,0.652913,-0.2785,
+ -0.109115,0.586342,0.802681,0.625134,0.662855,-0.274594,
+ -0.424048,0.688165,0.588737,0.548866,0.688331,-0.323141,
+ -0.070158,0.909054,0.410729,0.571915,0.702991,-0.339125,
+ -0.070158,0.909054,0.410729,0.571915,0.702991,-0.339125,
+ 0.096538,0.86115,0.4991,0.641688,0.680252,-0.294,
+ -0.109115,0.586342,0.802681,0.625134,0.662855,-0.274594,
+ 0.423992,0.883446,0.199385,0.806863,0.637791,-0.335375,
+ 0.503147,0.845347,0.179535,0.858509,0.615264,-0.361333,
+ 0.634483,0.691277,0.345786,0.876135,0.59824,-0.339125,
+ 0.634483,0.691277,0.345786,0.876135,0.59824,-0.339125,
+ 0.454725,0.723574,0.519294,0.807153,0.623277,-0.294,
+ 0.423992,0.883446,0.199385,0.806863,0.637791,-0.335375,
+ 0.692376,0.299843,0.656284,0.88375,0.575062,-0.323141,
+ 0.446948,0.373871,0.812686,0.80768,0.601112,-0.274594,
+ 0.454725,0.723574,0.519294,0.807153,0.623277,-0.294,
+ 0.692376,0.299843,0.656284,0.88375,0.575062,-0.323141,
+ 0.454725,0.723574,0.519294,0.807153,0.623277,-0.294,
+ 0.634483,0.691277,0.345786,0.876135,0.59824,-0.339125,
+ 0.190084,0.486023,0.853024,0.716506,0.632271,-0.258297,
+ 0.2681,0.82446,0.498385,0.724816,0.652913,-0.2785,
+ 0.454725,0.723574,0.519294,0.807153,0.623277,-0.294,
+ 0.190084,0.486023,0.853024,0.716506,0.632271,-0.258297,
+ 0.454725,0.723574,0.519294,0.807153,0.623277,-0.294,
+ 0.446948,0.373871,0.812686,0.80768,0.601112,-0.274594,
+ 0.329457,0.915147,0.232303,0.729578,0.666743,-0.322437,
+ 0.423992,0.883446,0.199385,0.806863,0.637791,-0.335375,
+ 0.454725,0.723574,0.519294,0.807153,0.623277,-0.294,
+ 0.329457,0.915147,0.232303,0.729578,0.666743,-0.322437,
+ 0.454725,0.723574,0.519294,0.807153,0.623277,-0.294,
+ 0.2681,0.82446,0.498385,0.724816,0.652913,-0.2785,
+ -0.541739,0.509206,0.668752,0.528557,0.659482,-0.316437,
+ -0.468298,0.578298,0.668033,0.500319,0.618731,-0.309219,
+ -0.677265,0.639604,0.363619,0.450527,0.633092,-0.395938,
+ -0.677265,0.639604,0.363619,0.450527,0.633092,-0.395938,
+ -0.740712,0.587497,0.325872,0.480984,0.67475,-0.399875,
+ -0.541739,0.509206,0.668752,0.528557,0.659482,-0.316437,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.797112,0.603831,0,0.465127,0.679839,-0.5,
+ -0.740712,0.587497,0.325872,0.480984,0.67475,-0.399875,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.740712,0.587497,0.325872,0.480984,0.67475,-0.399875,
+ -0.677265,0.639604,0.363619,0.450527,0.633092,-0.395938,
+ -0.797112,0.603831,0,0.465127,0.679839,-0.5,
+ -0.655082,0.755558,0,0.487673,0.709673,-0.5,
+ -0.606207,0.755737,0.247737,0.503003,0.704166,-0.403594,
+ -0.606207,0.755737,0.247737,0.503003,0.704166,-0.403594,
+ -0.740712,0.587497,0.325872,0.480984,0.67475,-0.399875,
+ -0.797112,0.603831,0,0.465127,0.679839,-0.5,
+ -0.424048,0.688165,0.588737,0.548866,0.688331,-0.323141,
+ -0.541739,0.509206,0.668752,0.528557,0.659482,-0.316437,
+ -0.740712,0.587497,0.325872,0.480984,0.67475,-0.399875,
+ -0.424048,0.688165,0.588737,0.548866,0.688331,-0.323141,
+ -0.740712,0.587497,0.325872,0.480984,0.67475,-0.399875,
+ -0.606207,0.755737,0.247737,0.503003,0.704166,-0.403594,
+ -0.677265,0.639604,-0.363619,0.450527,0.633092,-0.604062,
+ -0.468298,0.578298,-0.668033,0.500319,0.618731,-0.690781,
+ -0.541738,0.509206,-0.668752,0.528557,0.659482,-0.683563,
+ -0.541738,0.509206,-0.668752,0.528557,0.659482,-0.683563,
+ -0.740713,0.587497,-0.325872,0.480984,0.67475,-0.600125,
+ -0.677265,0.639604,-0.363619,0.450527,0.633092,-0.604062,
+ -0.424048,0.688166,-0.588737,0.548866,0.688331,-0.676859,
+ -0.606207,0.755737,-0.247737,0.503003,0.704166,-0.596406,
+ -0.740713,0.587497,-0.325872,0.480984,0.67475,-0.600125,
+ -0.424048,0.688166,-0.588737,0.548866,0.688331,-0.676859,
+ -0.740713,0.587497,-0.325872,0.480984,0.67475,-0.600125,
+ -0.541738,0.509206,-0.668752,0.528557,0.659482,-0.683563,
+ -0.606207,0.755737,-0.247737,0.503003,0.704166,-0.596406,
+ -0.655082,0.755558,0,0.487673,0.709673,-0.5,
+ -0.797112,0.603831,0,0.465127,0.679839,-0.5,
+ -0.797112,0.603831,0,0.465127,0.679839,-0.5,
+ -0.740713,0.587497,-0.325872,0.480984,0.67475,-0.600125,
+ -0.606207,0.755737,-0.247737,0.503003,0.704166,-0.596406,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.677265,0.639604,-0.363619,0.450527,0.633092,-0.604062,
+ -0.740713,0.587497,-0.325872,0.480984,0.67475,-0.600125,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.740713,0.587497,-0.325872,0.480984,0.67475,-0.600125,
+ -0.797112,0.603831,0,0.465127,0.679839,-0.5,
+ 0.123896,0.972069,-0.199329,0.596285,0.705555,-0.638667,
+ 0.139983,0.985063,-0.100277,0.573201,0.718247,-0.5825,
+ -0.142867,0.968199,-0.205377,0.529644,0.718831,-0.5875,
+ 0.123896,0.972069,-0.199329,0.596285,0.705555,-0.638667,
+ -0.142867,0.968199,-0.205377,0.529644,0.718831,-0.5875,
+ -0.070159,0.909054,-0.410729,0.571915,0.702991,-0.660875,
+ 0.084449,0.996428,0,0.561689,0.724552,-0.5,
+ -0.31505,0.949075,0,0.515384,0.725027,-0.5,
+ -0.142867,0.968199,-0.205377,0.529644,0.718831,-0.5875,
+ 0.084449,0.996428,0,0.561689,0.724552,-0.5,
+ -0.142867,0.968199,-0.205377,0.529644,0.718831,-0.5875,
+ 0.139983,0.985063,-0.100277,0.573201,0.718247,-0.5825,
+ -0.31505,0.949075,0,0.515384,0.725027,-0.5,
+ -0.655082,0.755558,0,0.487673,0.709673,-0.5,
+ -0.606207,0.755737,-0.247737,0.503003,0.704166,-0.596406,
+ -0.606207,0.755737,-0.247737,0.503003,0.704166,-0.596406,
+ -0.142867,0.968199,-0.205377,0.529644,0.718831,-0.5875,
+ -0.31505,0.949075,0,0.515384,0.725027,-0.5,
+ -0.424048,0.688166,-0.588737,0.548866,0.688331,-0.676859,
+ -0.070159,0.909054,-0.410729,0.571915,0.702991,-0.660875,
+ -0.142867,0.968199,-0.205377,0.529644,0.718831,-0.5875,
+ -0.424048,0.688166,-0.588737,0.548866,0.688331,-0.676859,
+ -0.142867,0.968199,-0.205377,0.529644,0.718831,-0.5875,
+ -0.606207,0.755737,-0.247737,0.503003,0.704166,-0.596406,
+ 0.123897,0.972069,0.199329,0.596285,0.705555,-0.361333,
+ -0.070158,0.909054,0.410729,0.571915,0.702991,-0.339125,
+ -0.142867,0.968199,0.205377,0.529644,0.718831,-0.4125,
+ 0.123897,0.972069,0.199329,0.596285,0.705555,-0.361333,
+ -0.142867,0.968199,0.205377,0.529644,0.718831,-0.4125,
+ 0.139983,0.985063,0.100277,0.573201,0.718247,-0.4175,
+ -0.424048,0.688165,0.588737,0.548866,0.688331,-0.323141,
+ -0.606207,0.755737,0.247737,0.503003,0.704166,-0.403594,
+ -0.142867,0.968199,0.205377,0.529644,0.718831,-0.4125,
+ -0.424048,0.688165,0.588737,0.548866,0.688331,-0.323141,
+ -0.142867,0.968199,0.205377,0.529644,0.718831,-0.4125,
+ -0.070158,0.909054,0.410729,0.571915,0.702991,-0.339125,
+ -0.606207,0.755737,0.247737,0.503003,0.704166,-0.403594,
+ -0.655082,0.755558,0,0.487673,0.709673,-0.5,
+ -0.31505,0.949075,0,0.515384,0.725027,-0.5,
+ -0.31505,0.949075,0,0.515384,0.725027,-0.5,
+ -0.142867,0.968199,0.205377,0.529644,0.718831,-0.4125,
+ -0.606207,0.755737,0.247737,0.503003,0.704166,-0.403594,
+ 0.084449,0.996428,0,0.561689,0.724552,-0.5,
+ 0.139983,0.985063,0.100277,0.573201,0.718247,-0.4175,
+ -0.142867,0.968199,0.205377,0.529644,0.718831,-0.4125,
+ 0.084449,0.996428,0,0.561689,0.724552,-0.5,
+ -0.142867,0.968199,0.205377,0.529644,0.718831,-0.4125,
+ -0.31505,0.949075,0,0.515384,0.725027,-0.5,
+ -0.541738,0.509206,-0.668752,0.528557,0.659482,-0.683563,
+ -0.468298,0.578298,-0.668033,0.500319,0.618731,-0.690781,
+ -0.208655,0.445101,-0.870832,0.583305,0.594795,-0.742813,
+ -0.208655,0.445101,-0.870832,0.583305,0.594795,-0.742813,
+ -0.227561,0.374378,-0.89892,0.607846,0.634036,-0.733625,
+ -0.541738,0.509206,-0.668752,0.528557,0.659482,-0.683563,
+ 0.088733,0.313595,-0.945402,0.682889,0.566071,-0.760156,
+ 0.075758,0.234708,-0.969109,0.702992,0.603501,-0.750313,
+ -0.227561,0.374378,-0.89892,0.607846,0.634036,-0.733625,
+ 0.088733,0.313595,-0.945402,0.682889,0.566071,-0.760156,
+ -0.227561,0.374378,-0.89892,0.607846,0.634036,-0.733625,
+ -0.208655,0.445101,-0.870832,0.583305,0.594795,-0.742813,
+ 0.075758,0.234708,-0.969109,0.702992,0.603501,-0.750313,
+ 0.190084,0.486023,-0.853024,0.716506,0.632271,-0.741703,
+ -0.109115,0.586342,-0.802681,0.625134,0.662855,-0.725406,
+ -0.109115,0.586342,-0.802681,0.625134,0.662855,-0.725406,
+ -0.227561,0.374378,-0.89892,0.607846,0.634036,-0.733625,
+ 0.075758,0.234708,-0.969109,0.702992,0.603501,-0.750313,
+ -0.424048,0.688166,-0.588737,0.548866,0.688331,-0.676859,
+ -0.541738,0.509206,-0.668752,0.528557,0.659482,-0.683563,
+ -0.227561,0.374378,-0.89892,0.607846,0.634036,-0.733625,
+ -0.424048,0.688166,-0.588737,0.548866,0.688331,-0.676859,
+ -0.227561,0.374378,-0.89892,0.607846,0.634036,-0.733625,
+ -0.109115,0.586342,-0.802681,0.625134,0.662855,-0.725406,
+ 0.744225,-0.02143,-0.667585,0.865458,0.513412,-0.690781,
+ 0.749601,-0.05627,-0.659493,0.877427,0.54752,-0.683563,
+ 0.41312,0.093332,-0.905881,0.798138,0.572966,-0.733625,
+ 0.744225,-0.02143,-0.667585,0.865458,0.513412,-0.690781,
+ 0.41312,0.093332,-0.905881,0.798138,0.572966,-0.733625,
+ 0.395884,0.173928,-0.901679,0.782472,0.537348,-0.742813,
+ 0.692376,0.299844,-0.656284,0.88375,0.575062,-0.676859,
+ 0.446948,0.373871,-0.812686,0.80768,0.601112,-0.725406,
+ 0.41312,0.093332,-0.905881,0.798138,0.572966,-0.733625,
+ 0.692376,0.299844,-0.656284,0.88375,0.575062,-0.676859,
+ 0.41312,0.093332,-0.905881,0.798138,0.572966,-0.733625,
+ 0.749601,-0.05627,-0.659493,0.877427,0.54752,-0.683563,
+ 0.190084,0.486023,-0.853024,0.716506,0.632271,-0.741703,
+ 0.075758,0.234708,-0.969109,0.702992,0.603501,-0.750313,
+ 0.41312,0.093332,-0.905881,0.798138,0.572966,-0.733625,
+ 0.190084,0.486023,-0.853024,0.716506,0.632271,-0.741703,
+ 0.41312,0.093332,-0.905881,0.798138,0.572966,-0.733625,
+ 0.446948,0.373871,-0.812686,0.80768,0.601112,-0.725406,
+ 0.075758,0.234708,-0.969109,0.702992,0.603501,-0.750313,
+ 0.088733,0.313595,-0.945402,0.682889,0.566071,-0.760156,
+ 0.395884,0.173928,-0.901679,0.782472,0.537348,-0.742813,
+ 0.395884,0.173928,-0.901679,0.782472,0.537348,-0.742813,
+ 0.41312,0.093332,-0.905881,0.798138,0.572966,-0.733625,
+ 0.075758,0.234708,-0.969109,0.702992,0.603501,-0.750313,
+ 0.634482,0.691277,-0.345786,0.876135,0.59824,-0.660875,
+ 0.503147,0.845347,-0.179534,0.858509,0.615264,-0.638667,
+ 0.423992,0.883446,-0.199386,0.806863,0.637791,-0.664625,
+ 0.423992,0.883446,-0.199386,0.806863,0.637791,-0.664625,
+ 0.454725,0.723574,-0.519294,0.807153,0.623277,-0.706,
+ 0.634482,0.691277,-0.345786,0.876135,0.59824,-0.660875,
+ 0.329457,0.915147,-0.232303,0.729578,0.666743,-0.677562,
+ 0.2681,0.82446,-0.498385,0.724816,0.652913,-0.7215,
+ 0.454725,0.723574,-0.519294,0.807153,0.623277,-0.706,
+ 0.329457,0.915147,-0.232303,0.729578,0.666743,-0.677562,
+ 0.454725,0.723574,-0.519294,0.807153,0.623277,-0.706,
+ 0.423992,0.883446,-0.199386,0.806863,0.637791,-0.664625,
+ 0.190084,0.486023,-0.853024,0.716506,0.632271,-0.741703,
+ 0.446948,0.373871,-0.812686,0.80768,0.601112,-0.725406,
+ 0.454725,0.723574,-0.519294,0.807153,0.623277,-0.706,
+ 0.190084,0.486023,-0.853024,0.716506,0.632271,-0.741703,
+ 0.454725,0.723574,-0.519294,0.807153,0.623277,-0.706,
+ 0.2681,0.82446,-0.498385,0.724816,0.652913,-0.7215,
+ 0.692376,0.299844,-0.656284,0.88375,0.575062,-0.676859,
+ 0.634482,0.691277,-0.345786,0.876135,0.59824,-0.660875,
+ 0.454725,0.723574,-0.519294,0.807153,0.623277,-0.706,
+ 0.692376,0.299844,-0.656284,0.88375,0.575062,-0.676859,
+ 0.454725,0.723574,-0.519294,0.807153,0.623277,-0.706,
+ 0.446948,0.373871,-0.812686,0.80768,0.601112,-0.725406,
+ 0.123896,0.972069,-0.199329,0.596285,0.705555,-0.638667,
+ -0.070159,0.909054,-0.410729,0.571915,0.702991,-0.660875,
+ 0.096538,0.86115,-0.4991,0.641688,0.680252,-0.706,
+ 0.123896,0.972069,-0.199329,0.596285,0.705555,-0.638667,
+ 0.096538,0.86115,-0.4991,0.641688,0.680252,-0.706,
+ 0.226858,0.951027,-0.209959,0.650852,0.69151,-0.664625,
+ -0.070159,0.909054,-0.410729,0.571915,0.702991,-0.660875,
+ -0.424048,0.688166,-0.588737,0.548866,0.688331,-0.676859,
+ -0.109115,0.586342,-0.802681,0.625134,0.662855,-0.725406,
+ -0.109115,0.586342,-0.802681,0.625134,0.662855,-0.725406,
+ 0.096538,0.86115,-0.4991,0.641688,0.680252,-0.706,
+ -0.070159,0.909054,-0.410729,0.571915,0.702991,-0.660875,
+ 0.190084,0.486023,-0.853024,0.716506,0.632271,-0.741703,
+ 0.2681,0.82446,-0.498385,0.724816,0.652913,-0.7215,
+ 0.096538,0.86115,-0.4991,0.641688,0.680252,-0.706,
+ 0.190084,0.486023,-0.853024,0.716506,0.632271,-0.741703,
+ 0.096538,0.86115,-0.4991,0.641688,0.680252,-0.706,
+ -0.109115,0.586342,-0.802681,0.625134,0.662855,-0.725406,
+ 0.2681,0.82446,-0.498385,0.724816,0.652913,-0.7215,
+ 0.329457,0.915147,-0.232303,0.729578,0.666743,-0.677562,
+ 0.226858,0.951027,-0.209959,0.650852,0.69151,-0.664625,
+ 0.226858,0.951027,-0.209959,0.650852,0.69151,-0.664625,
+ 0.096538,0.86115,-0.4991,0.641688,0.680252,-0.706,
+ 0.2681,0.82446,-0.498385,0.724816,0.652913,-0.7215,
+ 0.503147,0.845347,0.179535,0.858509,0.615264,-0.361333,
+ 0.423992,0.883446,0.199385,0.806863,0.637791,-0.335375,
+ 0.398886,0.913527,0.079739,0.817112,0.642984,-0.4095,
+ 0.503147,0.845347,0.179535,0.858509,0.615264,-0.361333,
+ 0.398886,0.913527,0.079739,0.817112,0.642984,-0.4095,
+ 0.496158,0.862422,0.100278,0.884513,0.611054,-0.4175,
+ 0.423992,0.883446,0.199385,0.806863,0.637791,-0.335375,
+ 0.329457,0.915147,0.232303,0.729578,0.666743,-0.322437,
+ 0.324391,0.9421,0.08496,0.732447,0.675074,-0.40225,
+ 0.324391,0.9421,0.08496,0.732447,0.675074,-0.40225,
+ 0.398886,0.913527,0.079739,0.817112,0.642984,-0.4095,
+ 0.423992,0.883446,0.199385,0.806863,0.637791,-0.335375,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.404722,0.91444,0,0.824871,0.64325,-0.5,
+ 0.398886,0.913527,0.079739,0.817112,0.642984,-0.4095,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.398886,0.913527,0.079739,0.817112,0.642984,-0.4095,
+ 0.324391,0.9421,0.08496,0.732447,0.675074,-0.40225,
+ 0.404722,0.91444,0,0.824871,0.64325,-0.5,
+ 0.546916,0.837188,0,0.897467,0.608935,-0.5,
+ 0.496158,0.862422,0.100278,0.884513,0.611054,-0.4175,
+ 0.496158,0.862422,0.100278,0.884513,0.611054,-0.4175,
+ 0.398886,0.913527,0.079739,0.817112,0.642984,-0.4095,
+ 0.404722,0.91444,0,0.824871,0.64325,-0.5,
+ 0.123897,0.972069,0.199329,0.596285,0.705555,-0.361333,
+ 0.139983,0.985063,0.100277,0.573201,0.718247,-0.4175,
+ 0.248097,0.965448,0.079739,0.645973,0.701912,-0.4095,
+ 0.123897,0.972069,0.199329,0.596285,0.705555,-0.361333,
+ 0.248097,0.965448,0.079739,0.645973,0.701912,-0.4095,
+ 0.226858,0.951027,0.209959,0.650852,0.69151,-0.335375,
+ 0.139983,0.985063,0.100277,0.573201,0.718247,-0.4175,
+ 0.084449,0.996428,0,0.561689,0.724552,-0.5,
+ 0.24406,0.96976,0,0.640022,0.706898,-0.5,
+ 0.24406,0.96976,0,0.640022,0.706898,-0.5,
+ 0.248097,0.965448,0.079739,0.645973,0.701912,-0.4095,
+ 0.139983,0.985063,0.100277,0.573201,0.718247,-0.4175,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.324391,0.9421,0.08496,0.732447,0.675074,-0.40225,
+ 0.248097,0.965448,0.079739,0.645973,0.701912,-0.4095,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.248097,0.965448,0.079739,0.645973,0.701912,-0.4095,
+ 0.24406,0.96976,0,0.640022,0.706898,-0.5,
+ 0.324391,0.9421,0.08496,0.732447,0.675074,-0.40225,
+ 0.329457,0.915147,0.232303,0.729578,0.666743,-0.322437,
+ 0.226858,0.951027,0.209959,0.650852,0.69151,-0.335375,
+ 0.226858,0.951027,0.209959,0.650852,0.69151,-0.335375,
+ 0.248097,0.965448,0.079739,0.645973,0.701912,-0.4095,
+ 0.324391,0.9421,0.08496,0.732447,0.675074,-0.40225,
+ 0.123896,0.972069,-0.199329,0.596285,0.705555,-0.638667,
+ 0.226858,0.951027,-0.209959,0.650852,0.69151,-0.664625,
+ 0.248097,0.965448,-0.079739,0.645973,0.701912,-0.5905,
+ 0.123896,0.972069,-0.199329,0.596285,0.705555,-0.638667,
+ 0.248097,0.965448,-0.079739,0.645973,0.701912,-0.5905,
+ 0.139983,0.985063,-0.100277,0.573201,0.718247,-0.5825,
+ 0.226858,0.951027,-0.209959,0.650852,0.69151,-0.664625,
+ 0.329457,0.915147,-0.232303,0.729578,0.666743,-0.677562,
+ 0.324391,0.9421,-0.08496,0.732447,0.675074,-0.59775,
+ 0.324391,0.9421,-0.08496,0.732447,0.675074,-0.59775,
+ 0.248097,0.965448,-0.079739,0.645973,0.701912,-0.5905,
+ 0.226858,0.951027,-0.209959,0.650852,0.69151,-0.664625,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.24406,0.96976,0,0.640022,0.706898,-0.5,
+ 0.248097,0.965448,-0.079739,0.645973,0.701912,-0.5905,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.248097,0.965448,-0.079739,0.645973,0.701912,-0.5905,
+ 0.324391,0.9421,-0.08496,0.732447,0.675074,-0.59775,
+ 0.24406,0.96976,0,0.640022,0.706898,-0.5,
+ 0.084449,0.996428,0,0.561689,0.724552,-0.5,
+ 0.139983,0.985063,-0.100277,0.573201,0.718247,-0.5825,
+ 0.139983,0.985063,-0.100277,0.573201,0.718247,-0.5825,
+ 0.248097,0.965448,-0.079739,0.645973,0.701912,-0.5905,
+ 0.24406,0.96976,0,0.640022,0.706898,-0.5,
+ 0.503147,0.845347,-0.179534,0.858509,0.615264,-0.638667,
+ 0.496158,0.862422,-0.100277,0.884513,0.611054,-0.5825,
+ 0.398886,0.913527,-0.079739,0.817112,0.642984,-0.5905,
+ 0.503147,0.845347,-0.179534,0.858509,0.615264,-0.638667,
+ 0.398886,0.913527,-0.079739,0.817112,0.642984,-0.5905,
+ 0.423992,0.883446,-0.199386,0.806863,0.637791,-0.664625,
+ 0.496158,0.862422,-0.100277,0.884513,0.611054,-0.5825,
+ 0.546916,0.837188,0,0.897467,0.608935,-0.5,
+ 0.404722,0.91444,0,0.824871,0.64325,-0.5,
+ 0.404722,0.91444,0,0.824871,0.64325,-0.5,
+ 0.398886,0.913527,-0.079739,0.817112,0.642984,-0.5905,
+ 0.496158,0.862422,-0.100277,0.884513,0.611054,-0.5825,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.324391,0.9421,-0.08496,0.732447,0.675074,-0.59775,
+ 0.398886,0.913527,-0.079739,0.817112,0.642984,-0.5905,
+ 0.325568,0.945519,0,0.733407,0.677865,-0.5,
+ 0.398886,0.913527,-0.079739,0.817112,0.642984,-0.5905,
+ 0.404722,0.91444,0,0.824871,0.64325,-0.5,
+ 0.324391,0.9421,-0.08496,0.732447,0.675074,-0.59775,
+ 0.329457,0.915147,-0.232303,0.729578,0.666743,-0.677562,
+ 0.423992,0.883446,-0.199386,0.806863,0.637791,-0.664625,
+ 0.423992,0.883446,-0.199386,0.806863,0.637791,-0.664625,
+ 0.398886,0.913527,-0.079739,0.817112,0.642984,-0.5905,
+ 0.324391,0.9421,-0.08496,0.732447,0.675074,-0.59775,
+ 0.744225,-0.02143,-0.667585,0.865458,0.513412,-0.690781,
+ 0.730929,0.12699,-0.670535,0.856137,0.470533,-0.708313,
+ 0.942442,-0.005211,-0.334328,0.911045,0.457192,-0.613625,
+ 0.744225,-0.02143,-0.667585,0.865458,0.513412,-0.690781,
+ 0.942442,-0.005211,-0.334328,0.911045,0.457192,-0.613625,
+ 0.945978,-0.110612,-0.304781,0.91525,0.49905,-0.604062,
+ 0.730929,0.12699,-0.670535,0.856137,0.470533,-0.708313,
+ 0.725615,0.097758,-0.681122,0.846442,0.421012,-0.729453,
+ 0.940489,-0.03309,-0.338208,0.907494,0.408859,-0.625156,
+ 0.940489,-0.03309,-0.338208,0.907494,0.408859,-0.625156,
+ 0.942442,-0.005211,-0.334328,0.911045,0.457192,-0.613625,
+ 0.730929,0.12699,-0.670535,0.856137,0.470533,-0.708313,
+ 0.998189,-0.060158,0,0.927845,0.404808,-0.5,
+ 0.998674,-0.051473,0,0.929348,0.452746,-0.5,
+ 0.942442,-0.005211,-0.334328,0.911045,0.457192,-0.613625,
+ 0.998189,-0.060158,0,0.927845,0.404808,-0.5,
+ 0.942442,-0.005211,-0.334328,0.911045,0.457192,-0.613625,
+ 0.940489,-0.03309,-0.338208,0.907494,0.408859,-0.625156,
+ 0.998674,-0.051473,0,0.929348,0.452746,-0.5,
+ 0.980435,-0.196846,0,0.931847,0.494263,-0.5,
+ 0.945978,-0.110612,-0.304781,0.91525,0.49905,-0.604062,
+ 0.945978,-0.110612,-0.304781,0.91525,0.49905,-0.604062,
+ 0.942442,-0.005211,-0.334328,0.911045,0.457192,-0.613625,
+ 0.998674,-0.051473,0,0.929348,0.452746,-0.5,
+ 0.711272,-0.0413,-0.701703,0.83335,0.366979,-0.7475,
+ 0.63763,-0.234074,-0.733919,0.81384,0.310563,-0.75575,
+ 0.846641,-0.361408,-0.390619,0.882792,0.301487,-0.6395,
+ 0.846641,-0.361408,-0.390619,0.882792,0.301487,-0.6395,
+ 0.924673,-0.163459,-0.343891,0.899707,0.356231,-0.635,
+ 0.711272,-0.0413,-0.701703,0.83335,0.366979,-0.7475,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.985079,-0.172104,0,0.921826,0.352648,-0.5,
+ 0.924673,-0.163459,-0.343891,0.899707,0.356231,-0.635,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.924673,-0.163459,-0.343891,0.899707,0.356231,-0.635,
+ 0.846641,-0.361408,-0.390619,0.882792,0.301487,-0.6395,
+ 0.985079,-0.172104,0,0.921826,0.352648,-0.5,
+ 0.998189,-0.060158,0,0.927845,0.404808,-0.5,
+ 0.940489,-0.03309,-0.338208,0.907494,0.408859,-0.625156,
+ 0.940489,-0.03309,-0.338208,0.907494,0.408859,-0.625156,
+ 0.924673,-0.163459,-0.343891,0.899707,0.356231,-0.635,
+ 0.985079,-0.172104,0,0.921826,0.352648,-0.5,
+ 0.725615,0.097758,-0.681122,0.846442,0.421012,-0.729453,
+ 0.711272,-0.0413,-0.701703,0.83335,0.366979,-0.7475,
+ 0.924673,-0.163459,-0.343891,0.899707,0.356231,-0.635,
+ 0.725615,0.097758,-0.681122,0.846442,0.421012,-0.729453,
+ 0.924673,-0.163459,-0.343891,0.899707,0.356231,-0.635,
+ 0.940489,-0.03309,-0.338208,0.907494,0.408859,-0.625156,
+ 0.846641,-0.361408,0.39062,0.882792,0.301487,-0.3605,
+ 0.63763,-0.234074,0.733919,0.81384,0.310563,-0.24425,
+ 0.711272,-0.0413,0.701703,0.83335,0.366979,-0.2525,
+ 0.711272,-0.0413,0.701703,0.83335,0.366979,-0.2525,
+ 0.924673,-0.16346,0.343891,0.899707,0.356231,-0.365,
+ 0.846641,-0.361408,0.39062,0.882792,0.301487,-0.3605,
+ 0.725614,0.097758,0.681122,0.846442,0.421012,-0.270547,
+ 0.940489,-0.03309,0.338208,0.907494,0.408859,-0.374844,
+ 0.924673,-0.16346,0.343891,0.899707,0.356231,-0.365,
+ 0.725614,0.097758,0.681122,0.846442,0.421012,-0.270547,
+ 0.924673,-0.16346,0.343891,0.899707,0.356231,-0.365,
+ 0.711272,-0.0413,0.701703,0.83335,0.366979,-0.2525,
+ 0.940489,-0.03309,0.338208,0.907494,0.408859,-0.374844,
+ 0.998189,-0.060158,0,0.927845,0.404808,-0.5,
+ 0.985079,-0.172104,0,0.921826,0.352648,-0.5,
+ 0.985079,-0.172104,0,0.921826,0.352648,-0.5,
+ 0.924673,-0.16346,0.343891,0.899707,0.356231,-0.365,
+ 0.940489,-0.03309,0.338208,0.907494,0.408859,-0.374844,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.846641,-0.361408,0.39062,0.882792,0.301487,-0.3605,
+ 0.924673,-0.16346,0.343891,0.899707,0.356231,-0.365,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.924673,-0.16346,0.343891,0.899707,0.356231,-0.365,
+ 0.985079,-0.172104,0,0.921826,0.352648,-0.5,
+ 0.744225,-0.02143,0.667585,0.865458,0.513412,-0.309219,
+ 0.945978,-0.110612,0.304781,0.91525,0.49905,-0.395938,
+ 0.942442,-0.005211,0.334328,0.911045,0.457192,-0.386375,
+ 0.744225,-0.02143,0.667585,0.865458,0.513412,-0.309219,
+ 0.942442,-0.005211,0.334328,0.911045,0.457192,-0.386375,
+ 0.730929,0.126989,0.670535,0.856137,0.470533,-0.291687,
+ 0.945978,-0.110612,0.304781,0.91525,0.49905,-0.395938,
+ 0.980435,-0.196846,0,0.931847,0.494263,-0.5,
+ 0.998674,-0.051473,0,0.929348,0.452746,-0.5,
+ 0.998674,-0.051473,0,0.929348,0.452746,-0.5,
+ 0.942442,-0.005211,0.334328,0.911045,0.457192,-0.386375,
+ 0.945978,-0.110612,0.304781,0.91525,0.49905,-0.395938,
+ 0.998189,-0.060158,0,0.927845,0.404808,-0.5,
+ 0.940489,-0.03309,0.338208,0.907494,0.408859,-0.374844,
+ 0.942442,-0.005211,0.334328,0.911045,0.457192,-0.386375,
+ 0.998189,-0.060158,0,0.927845,0.404808,-0.5,
+ 0.942442,-0.005211,0.334328,0.911045,0.457192,-0.386375,
+ 0.998674,-0.051473,0,0.929348,0.452746,-0.5,
+ 0.940489,-0.03309,0.338208,0.907494,0.408859,-0.374844,
+ 0.725614,0.097758,0.681122,0.846442,0.421012,-0.270547,
+ 0.730929,0.126989,0.670535,0.856137,0.470533,-0.291687,
+ 0.730929,0.126989,0.670535,0.856137,0.470533,-0.291687,
+ 0.942442,-0.005211,0.334328,0.911045,0.457192,-0.386375,
+ 0.940489,-0.03309,0.338208,0.907494,0.408859,-0.374844,
+ -0.468298,0.578298,-0.668033,0.500319,0.618731,-0.690781,
+ -0.46274,0.649831,-0.602985,0.453481,0.568361,-0.708313,
+ -0.1826,0.53251,-0.826493,0.544994,0.546127,-0.765125,
+ -0.468298,0.578298,-0.668033,0.500319,0.618731,-0.690781,
+ -0.1826,0.53251,-0.826493,0.544994,0.546127,-0.765125,
+ -0.208655,0.445101,-0.870832,0.583305,0.594795,-0.742813,
+ -0.46274,0.649831,-0.602985,0.453481,0.568361,-0.708313,
+ -0.490654,0.624331,-0.60784,0.398726,0.51013,-0.729453,
+ -0.208343,0.508292,-0.835603,0.500479,0.489876,-0.792031,
+ -0.208343,0.508292,-0.835603,0.500479,0.489876,-0.792031,
+ -0.1826,0.53251,-0.826493,0.544994,0.546127,-0.765125,
+ -0.46274,0.649831,-0.602985,0.453481,0.568361,-0.708313,
+ 0.081884,0.387365,-0.918283,0.622584,0.465571,-0.812891,
+ 0.102672,0.412673,-0.905074,0.654809,0.519447,-0.784063,
+ -0.1826,0.53251,-0.826493,0.544994,0.546127,-0.765125,
+ 0.081884,0.387365,-0.918283,0.622584,0.465571,-0.812891,
+ -0.1826,0.53251,-0.826493,0.544994,0.546127,-0.765125,
+ -0.208343,0.508292,-0.835603,0.500479,0.489876,-0.792031,
+ 0.102672,0.412673,-0.905074,0.654809,0.519447,-0.784063,
+ 0.088733,0.313595,-0.945402,0.682889,0.566071,-0.760156,
+ -0.208655,0.445101,-0.870832,0.583305,0.594795,-0.742813,
+ -0.208655,0.445101,-0.870832,0.583305,0.594795,-0.742813,
+ -0.1826,0.53251,-0.826493,0.544994,0.546127,-0.765125,
+ 0.102672,0.412673,-0.905074,0.654809,0.519447,-0.784063,
+ -0.59415,0.505848,-0.625383,0.346736,0.445797,-0.7475,
+ -0.645198,0.198269,-0.737841,0.308193,0.377118,-0.75575,
+ -0.328501,0.124794,-0.936223,0.423113,0.361992,-0.8255,
+ -0.328501,0.124794,-0.936223,0.423113,0.361992,-0.8255,
+ -0.261623,0.387306,-0.884052,0.45733,0.427884,-0.815,
+ -0.59415,0.505848,-0.625383,0.346736,0.445797,-0.7475,
+ 0.001894,-0.000876,-0.999998,0.561017,0.343841,-0.84875,
+ 0.046906,0.258379,-0.964904,0.590043,0.406388,-0.8375,
+ -0.261623,0.387306,-0.884052,0.45733,0.427884,-0.815,
+ 0.001894,-0.000876,-0.999998,0.561017,0.343841,-0.84875,
+ -0.261623,0.387306,-0.884052,0.45733,0.427884,-0.815,
+ -0.328501,0.124794,-0.936223,0.423113,0.361992,-0.8255,
+ 0.046906,0.258379,-0.964904,0.590043,0.406388,-0.8375,
+ 0.081884,0.387365,-0.918283,0.622584,0.465571,-0.812891,
+ -0.208343,0.508292,-0.835603,0.500479,0.489876,-0.792031,
+ -0.208343,0.508292,-0.835603,0.500479,0.489876,-0.792031,
+ -0.261623,0.387306,-0.884052,0.45733,0.427884,-0.815,
+ 0.046906,0.258379,-0.964904,0.590043,0.406388,-0.8375,
+ -0.490654,0.624331,-0.60784,0.398726,0.51013,-0.729453,
+ -0.59415,0.505848,-0.625383,0.346736,0.445797,-0.7475,
+ -0.261623,0.387306,-0.884052,0.45733,0.427884,-0.815,
+ -0.490654,0.624331,-0.60784,0.398726,0.51013,-0.729453,
+ -0.261623,0.387306,-0.884052,0.45733,0.427884,-0.815,
+ -0.208343,0.508292,-0.835603,0.500479,0.489876,-0.792031,
+ 0.63763,-0.234074,-0.733919,0.81384,0.310563,-0.75575,
+ 0.711272,-0.0413,-0.701703,0.83335,0.366979,-0.7475,
+ 0.369337,0.119431,-0.921589,0.722756,0.384892,-0.815,
+ 0.63763,-0.234074,-0.733919,0.81384,0.310563,-0.75575,
+ 0.369337,0.119431,-0.921589,0.722756,0.384892,-0.815,
+ 0.330471,-0.133893,-0.93427,0.69892,0.325689,-0.8255,
+ 0.711272,-0.0413,-0.701703,0.83335,0.366979,-0.7475,
+ 0.725615,0.097758,-0.681122,0.846442,0.421012,-0.729453,
+ 0.390355,0.256716,-0.884149,0.744688,0.441266,-0.792031,
+ 0.390355,0.256716,-0.884149,0.744688,0.441266,-0.792031,
+ 0.369337,0.119431,-0.921589,0.722756,0.384892,-0.815,
+ 0.711272,-0.0413,-0.701703,0.83335,0.366979,-0.7475,
+ 0.081884,0.387365,-0.918283,0.622584,0.465571,-0.812891,
+ 0.046906,0.258379,-0.964904,0.590043,0.406388,-0.8375,
+ 0.369337,0.119431,-0.921589,0.722756,0.384892,-0.815,
+ 0.081884,0.387365,-0.918283,0.622584,0.465571,-0.812891,
+ 0.369337,0.119431,-0.921589,0.722756,0.384892,-0.815,
+ 0.390355,0.256716,-0.884149,0.744688,0.441266,-0.792031,
+ 0.046906,0.258379,-0.964904,0.590043,0.406388,-0.8375,
+ 0.001894,-0.000876,-0.999998,0.561017,0.343841,-0.84875,
+ 0.330471,-0.133893,-0.93427,0.69892,0.325689,-0.8255,
+ 0.330471,-0.133893,-0.93427,0.69892,0.325689,-0.8255,
+ 0.369337,0.119431,-0.921589,0.722756,0.384892,-0.815,
+ 0.046906,0.258379,-0.964904,0.590043,0.406388,-0.8375,
+ 0.730929,0.12699,-0.670535,0.856137,0.470533,-0.708313,
+ 0.744225,-0.02143,-0.667585,0.865458,0.513412,-0.690781,
+ 0.395884,0.173928,-0.901679,0.782472,0.537348,-0.742813,
+ 0.395884,0.173928,-0.901679,0.782472,0.537348,-0.742813,
+ 0.403724,0.284631,-0.869478,0.764624,0.492766,-0.765125,
+ 0.730929,0.12699,-0.670535,0.856137,0.470533,-0.708313,
+ 0.088733,0.313595,-0.945402,0.682889,0.566071,-0.760156,
+ 0.102672,0.412673,-0.905074,0.654809,0.519447,-0.784063,
+ 0.403724,0.284631,-0.869478,0.764624,0.492766,-0.765125,
+ 0.088733,0.313595,-0.945402,0.682889,0.566071,-0.760156,
+ 0.403724,0.284631,-0.869478,0.764624,0.492766,-0.765125,
+ 0.395884,0.173928,-0.901679,0.782472,0.537348,-0.742813,
+ 0.102672,0.412673,-0.905074,0.654809,0.519447,-0.784063,
+ 0.081884,0.387365,-0.918283,0.622584,0.465571,-0.812891,
+ 0.390355,0.256716,-0.884149,0.744688,0.441266,-0.792031,
+ 0.390355,0.256716,-0.884149,0.744688,0.441266,-0.792031,
+ 0.403724,0.284631,-0.869478,0.764624,0.492766,-0.765125,
+ 0.102672,0.412673,-0.905074,0.654809,0.519447,-0.784063,
+ 0.725615,0.097758,-0.681122,0.846442,0.421012,-0.729453,
+ 0.730929,0.12699,-0.670535,0.856137,0.470533,-0.708313,
+ 0.403724,0.284631,-0.869478,0.764624,0.492766,-0.765125,
+ 0.725615,0.097758,-0.681122,0.846442,0.421012,-0.729453,
+ 0.403724,0.284631,-0.869478,0.764624,0.492766,-0.765125,
+ 0.390355,0.256716,-0.884149,0.744688,0.441266,-0.792031,
+ -0.468298,0.578298,0.668033,0.500319,0.618731,-0.309219,
+ -0.208655,0.445101,0.870832,0.583305,0.594795,-0.257187,
+ -0.1826,0.532509,0.826493,0.544994,0.546127,-0.234875,
+ -0.468298,0.578298,0.668033,0.500319,0.618731,-0.309219,
+ -0.1826,0.532509,0.826493,0.544994,0.546127,-0.234875,
+ -0.46274,0.649831,0.602985,0.453481,0.568361,-0.291687,
+ -0.208655,0.445101,0.870832,0.583305,0.594795,-0.257187,
+ 0.088734,0.313595,0.945402,0.682889,0.566071,-0.239844,
+ 0.102672,0.412673,0.905074,0.654809,0.519447,-0.215937,
+ 0.102672,0.412673,0.905074,0.654809,0.519447,-0.215937,
+ -0.1826,0.532509,0.826493,0.544994,0.546127,-0.234875,
+ -0.208655,0.445101,0.870832,0.583305,0.594795,-0.257187,
+ 0.081884,0.387365,0.918283,0.622584,0.465571,-0.187109,
+ -0.208343,0.508292,0.835603,0.500479,0.489876,-0.207969,
+ -0.1826,0.532509,0.826493,0.544994,0.546127,-0.234875,
+ 0.081884,0.387365,0.918283,0.622584,0.465571,-0.187109,
+ -0.1826,0.532509,0.826493,0.544994,0.546127,-0.234875,
+ 0.102672,0.412673,0.905074,0.654809,0.519447,-0.215937,
+ -0.208343,0.508292,0.835603,0.500479,0.489876,-0.207969,
+ -0.490654,0.624331,0.60784,0.398726,0.51013,-0.270547,
+ -0.46274,0.649831,0.602985,0.453481,0.568361,-0.291687,
+ -0.46274,0.649831,0.602985,0.453481,0.568361,-0.291687,
+ -0.1826,0.532509,0.826493,0.544994,0.546127,-0.234875,
+ -0.208343,0.508292,0.835603,0.500479,0.489876,-0.207969,
+ 0.395884,0.173928,0.901679,0.782472,0.537348,-0.257187,
+ 0.744225,-0.02143,0.667585,0.865458,0.513412,-0.309219,
+ 0.730929,0.126989,0.670535,0.856137,0.470533,-0.291687,
+ 0.730929,0.126989,0.670535,0.856137,0.470533,-0.291687,
+ 0.403724,0.284631,0.869478,0.764624,0.492766,-0.234875,
+ 0.395884,0.173928,0.901679,0.782472,0.537348,-0.257187,
+ 0.725614,0.097758,0.681122,0.846442,0.421012,-0.270547,
+ 0.390355,0.256716,0.884149,0.744688,0.441266,-0.207969,
+ 0.403724,0.284631,0.869478,0.764624,0.492766,-0.234875,
+ 0.725614,0.097758,0.681122,0.846442,0.421012,-0.270547,
+ 0.403724,0.284631,0.869478,0.764624,0.492766,-0.234875,
+ 0.730929,0.126989,0.670535,0.856137,0.470533,-0.291687,
+ 0.390355,0.256716,0.884149,0.744688,0.441266,-0.207969,
+ 0.081884,0.387365,0.918283,0.622584,0.465571,-0.187109,
+ 0.102672,0.412673,0.905074,0.654809,0.519447,-0.215937,
+ 0.102672,0.412673,0.905074,0.654809,0.519447,-0.215937,
+ 0.403724,0.284631,0.869478,0.764624,0.492766,-0.234875,
+ 0.390355,0.256716,0.884149,0.744688,0.441266,-0.207969,
+ 0.088734,0.313595,0.945402,0.682889,0.566071,-0.239844,
+ 0.395884,0.173928,0.901679,0.782472,0.537348,-0.257187,
+ 0.403724,0.284631,0.869478,0.764624,0.492766,-0.234875,
+ 0.088734,0.313595,0.945402,0.682889,0.566071,-0.239844,
+ 0.403724,0.284631,0.869478,0.764624,0.492766,-0.234875,
+ 0.102672,0.412673,0.905074,0.654809,0.519447,-0.215937,
+ 0.63763,-0.234074,0.733919,0.81384,0.310563,-0.24425,
+ 0.330471,-0.133893,0.93427,0.69892,0.325689,-0.1745,
+ 0.369337,0.119431,0.921589,0.722756,0.384892,-0.185,
+ 0.63763,-0.234074,0.733919,0.81384,0.310563,-0.24425,
+ 0.369337,0.119431,0.921589,0.722756,0.384892,-0.185,
+ 0.711272,-0.0413,0.701703,0.83335,0.366979,-0.2525,
+ 0.330471,-0.133893,0.93427,0.69892,0.325689,-0.1745,
+ 0.001894,-0.000875,0.999998,0.561017,0.343841,-0.15125,
+ 0.046906,0.258379,0.964904,0.590043,0.406388,-0.1625,
+ 0.046906,0.258379,0.964904,0.590043,0.406388,-0.1625,
+ 0.369337,0.119431,0.921589,0.722756,0.384892,-0.185,
+ 0.330471,-0.133893,0.93427,0.69892,0.325689,-0.1745,
+ 0.081884,0.387365,0.918283,0.622584,0.465571,-0.187109,
+ 0.390355,0.256716,0.884149,0.744688,0.441266,-0.207969,
+ 0.369337,0.119431,0.921589,0.722756,0.384892,-0.185,
+ 0.081884,0.387365,0.918283,0.622584,0.465571,-0.187109,
+ 0.369337,0.119431,0.921589,0.722756,0.384892,-0.185,
+ 0.046906,0.258379,0.964904,0.590043,0.406388,-0.1625,
+ 0.390355,0.256716,0.884149,0.744688,0.441266,-0.207969,
+ 0.725614,0.097758,0.681122,0.846442,0.421012,-0.270547,
+ 0.711272,-0.0413,0.701703,0.83335,0.366979,-0.2525,
+ 0.711272,-0.0413,0.701703,0.83335,0.366979,-0.2525,
+ 0.369337,0.119431,0.921589,0.722756,0.384892,-0.185,
+ 0.390355,0.256716,0.884149,0.744688,0.441266,-0.207969,
+ -0.328501,0.124794,0.936223,0.423113,0.361992,-0.1745,
+ -0.645198,0.198269,0.737841,0.308193,0.377118,-0.24425,
+ -0.59415,0.505848,0.625383,0.346736,0.445797,-0.2525,
+ -0.59415,0.505848,0.625383,0.346736,0.445797,-0.2525,
+ -0.261623,0.387306,0.884052,0.45733,0.427884,-0.185,
+ -0.328501,0.124794,0.936223,0.423113,0.361992,-0.1745,
+ -0.490654,0.624331,0.60784,0.398726,0.51013,-0.270547,
+ -0.208343,0.508292,0.835603,0.500479,0.489876,-0.207969,
+ -0.261623,0.387306,0.884052,0.45733,0.427884,-0.185,
+ -0.490654,0.624331,0.60784,0.398726,0.51013,-0.270547,
+ -0.261623,0.387306,0.884052,0.45733,0.427884,-0.185,
+ -0.59415,0.505848,0.625383,0.346736,0.445797,-0.2525,
+ -0.208343,0.508292,0.835603,0.500479,0.489876,-0.207969,
+ 0.081884,0.387365,0.918283,0.622584,0.465571,-0.187109,
+ 0.046906,0.258379,0.964904,0.590043,0.406388,-0.1625,
+ 0.046906,0.258379,0.964904,0.590043,0.406388,-0.1625,
+ -0.261623,0.387306,0.884052,0.45733,0.427884,-0.185,
+ -0.208343,0.508292,0.835603,0.500479,0.489876,-0.207969,
+ 0.001894,-0.000875,0.999998,0.561017,0.343841,-0.15125,
+ -0.328501,0.124794,0.936223,0.423113,0.361992,-0.1745,
+ -0.261623,0.387306,0.884052,0.45733,0.427884,-0.185,
+ 0.001894,-0.000875,0.999998,0.561017,0.343841,-0.15125,
+ -0.261623,0.387306,0.884052,0.45733,0.427884,-0.185,
+ 0.046906,0.258379,0.964904,0.590043,0.406388,-0.1625,
+ -0.46274,0.649831,-0.602985,0.453481,0.568361,-0.708313,
+ -0.468298,0.578298,-0.668033,0.500319,0.618731,-0.690781,
+ -0.677265,0.639604,-0.363619,0.450527,0.633092,-0.604062,
+ -0.677265,0.639604,-0.363619,0.450527,0.633092,-0.604062,
+ -0.641469,0.710708,-0.288812,0.398573,0.581701,-0.613625,
+ -0.46274,0.649831,-0.602985,0.453481,0.568361,-0.708313,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.689225,0.724547,0,0.380271,0.586148,-0.5,
+ -0.641469,0.710708,-0.288812,0.398573,0.581701,-0.613625,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.641469,0.710708,-0.288812,0.398573,0.581701,-0.613625,
+ -0.677265,0.639604,-0.363619,0.450527,0.633092,-0.604062,
+ -0.689225,0.724547,0,0.380271,0.586148,-0.5,
+ -0.718122,0.695917,0,0.317323,0.526334,-0.5,
+ -0.680327,0.681689,-0.269175,0.337674,0.522283,-0.625156,
+ -0.680327,0.681689,-0.269175,0.337674,0.522283,-0.625156,
+ -0.641469,0.710708,-0.288812,0.398573,0.581701,-0.613625,
+ -0.689225,0.724547,0,0.380271,0.586148,-0.5,
+ -0.490654,0.624331,-0.60784,0.398726,0.51013,-0.729453,
+ -0.46274,0.649831,-0.602985,0.453481,0.568361,-0.708313,
+ -0.641469,0.710708,-0.288812,0.398573,0.581701,-0.613625,
+ -0.490654,0.624331,-0.60784,0.398726,0.51013,-0.729453,
+ -0.641469,0.710708,-0.288812,0.398573,0.581701,-0.613625,
+ -0.680327,0.681689,-0.269175,0.337674,0.522283,-0.625156,
+ -0.677265,0.639604,0.363619,0.450527,0.633092,-0.395938,
+ -0.468298,0.578298,0.668033,0.500319,0.618731,-0.309219,
+ -0.46274,0.649831,0.602985,0.453481,0.568361,-0.291687,
+ -0.46274,0.649831,0.602985,0.453481,0.568361,-0.291687,
+ -0.641469,0.710708,0.288812,0.398573,0.581701,-0.386375,
+ -0.677265,0.639604,0.363619,0.450527,0.633092,-0.395938,
+ -0.490654,0.624331,0.60784,0.398726,0.51013,-0.270547,
+ -0.680327,0.681689,0.269175,0.337674,0.522283,-0.374844,
+ -0.641469,0.710708,0.288812,0.398573,0.581701,-0.386375,
+ -0.490654,0.624331,0.60784,0.398726,0.51013,-0.270547,
+ -0.641469,0.710708,0.288812,0.398573,0.581701,-0.386375,
+ -0.46274,0.649831,0.602985,0.453481,0.568361,-0.291687,
+ -0.680327,0.681689,0.269175,0.337674,0.522283,-0.374844,
+ -0.718122,0.695917,0,0.317323,0.526334,-0.5,
+ -0.689225,0.724547,0,0.380271,0.586148,-0.5,
+ -0.689225,0.724547,0,0.380271,0.586148,-0.5,
+ -0.641469,0.710708,0.288812,0.398573,0.581701,-0.386375,
+ -0.680327,0.681689,0.269175,0.337674,0.522283,-0.374844,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.677265,0.639604,0.363619,0.450527,0.633092,-0.395938,
+ -0.641469,0.710708,0.288812,0.398573,0.581701,-0.386375,
+ -0.749144,0.662408,0,0.43393,0.63788,-0.5,
+ -0.641469,0.710708,0.288812,0.398573,0.581701,-0.386375,
+ -0.689225,0.724547,0,0.380271,0.586148,-0.5,
+ -0.59415,0.505848,0.625383,0.346736,0.445797,-0.2525,
+ -0.645198,0.198269,0.737841,0.308193,0.377118,-0.24425,
+ -0.862657,0.31434,0.396249,0.239242,0.386194,-0.3605,
+ -0.862657,0.31434,0.396249,0.239242,0.386194,-0.3605,
+ -0.778413,0.562971,0.277735,0.280379,0.456545,-0.365,
+ -0.59415,0.505848,0.625383,0.346736,0.445797,-0.2525,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.786635,0.617419,0,0.25826,0.460127,-0.5,
+ -0.778413,0.562971,0.277735,0.280379,0.456545,-0.365,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.778413,0.562971,0.277735,0.280379,0.456545,-0.365,
+ -0.862657,0.31434,0.396249,0.239242,0.386194,-0.3605,
+ -0.786635,0.617419,0,0.25826,0.460127,-0.5,
+ -0.718122,0.695917,0,0.317323,0.526334,-0.5,
+ -0.680327,0.681689,0.269175,0.337674,0.522283,-0.374844,
+ -0.680327,0.681689,0.269175,0.337674,0.522283,-0.374844,
+ -0.778413,0.562971,0.277735,0.280379,0.456545,-0.365,
+ -0.786635,0.617419,0,0.25826,0.460127,-0.5,
+ -0.680327,0.681689,0.269175,0.337674,0.522283,-0.374844,
+ -0.490654,0.624331,0.60784,0.398726,0.51013,-0.270547,
+ -0.59415,0.505848,0.625383,0.346736,0.445797,-0.2525,
+ -0.59415,0.505848,0.625383,0.346736,0.445797,-0.2525,
+ -0.778413,0.562971,0.277735,0.280379,0.456545,-0.365,
+ -0.680327,0.681689,0.269175,0.337674,0.522283,-0.374844,
+ -0.862657,0.31434,-0.396249,0.239242,0.386194,-0.6395,
+ -0.645198,0.198269,-0.737841,0.308193,0.377118,-0.75575,
+ -0.59415,0.505848,-0.625383,0.346736,0.445797,-0.7475,
+ -0.59415,0.505848,-0.625383,0.346736,0.445797,-0.7475,
+ -0.778414,0.562971,-0.277735,0.280379,0.456545,-0.635,
+ -0.862657,0.31434,-0.396249,0.239242,0.386194,-0.6395,
+ -0.59415,0.505848,-0.625383,0.346736,0.445797,-0.7475,
+ -0.490654,0.624331,-0.60784,0.398726,0.51013,-0.729453,
+ -0.680327,0.681689,-0.269175,0.337674,0.522283,-0.625156,
+ -0.680327,0.681689,-0.269175,0.337674,0.522283,-0.625156,
+ -0.778414,0.562971,-0.277735,0.280379,0.456545,-0.635,
+ -0.59415,0.505848,-0.625383,0.346736,0.445797,-0.7475,
+ -0.680327,0.681689,-0.269175,0.337674,0.522283,-0.625156,
+ -0.718122,0.695917,0,0.317323,0.526334,-0.5,
+ -0.786635,0.617419,0,0.25826,0.460127,-0.5,
+ -0.786635,0.617419,0,0.25826,0.460127,-0.5,
+ -0.778414,0.562971,-0.277735,0.280379,0.456545,-0.635,
+ -0.680327,0.681689,-0.269175,0.337674,0.522283,-0.625156,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.862657,0.31434,-0.396249,0.239242,0.386194,-0.6395,
+ -0.778414,0.562971,-0.277735,0.280379,0.456545,-0.635,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.778414,0.562971,-0.277735,0.280379,0.456545,-0.635,
+ -0.786635,0.617419,0,0.25826,0.460127,-0.5,
+ -0.68646,-0.277096,-0.672303,0.316229,0.114342,-0.690781,
+ -0.340489,-0.258832,-0.903921,0.402791,0.111771,-0.742813,
+ -0.337162,-0.377107,-0.86262,0.400082,0.165542,-0.765125,
+ -0.68646,-0.277096,-0.672303,0.316229,0.114342,-0.690781,
+ -0.337162,-0.377107,-0.86262,0.400082,0.165542,-0.765125,
+ -0.681322,-0.324401,-0.656174,0.305709,0.170683,-0.708313,
+ -0.009985,-0.330184,-0.943864,0.506665,0.108686,-0.760156,
+ -0.024814,-0.431442,-0.901799,0.513329,0.159372,-0.784063,
+ -0.337162,-0.377107,-0.86262,0.400082,0.165542,-0.765125,
+ -0.009985,-0.330184,-0.943864,0.506665,0.108686,-0.760156,
+ -0.337162,-0.377107,-0.86262,0.400082,0.165542,-0.765125,
+ -0.340489,-0.258832,-0.903921,0.402791,0.111771,-0.742813,
+ -0.024814,-0.431442,-0.901799,0.513329,0.159372,-0.784063,
+ -0.034163,-0.398975,-0.916325,0.52383,0.217409,-0.812891,
+ -0.348349,-0.345034,-0.871553,0.399335,0.22743,-0.792031,
+ -0.348349,-0.345034,-0.871553,0.399335,0.22743,-0.792031,
+ -0.337162,-0.377107,-0.86262,0.400082,0.165542,-0.765125,
+ -0.024814,-0.431442,-0.901799,0.513329,0.159372,-0.784063,
+ -0.348349,-0.345034,-0.871553,0.399335,0.22743,-0.792031,
+ -0.700275,-0.236966,-0.673395,0.295589,0.235781,-0.729453,
+ -0.681322,-0.324401,-0.656174,0.305709,0.170683,-0.708313,
+ -0.681322,-0.324401,-0.656174,0.305709,0.170683,-0.708313,
+ -0.337162,-0.377107,-0.86262,0.400082,0.165542,-0.765125,
+ -0.348349,-0.345034,-0.871553,0.399335,0.22743,-0.792031,
+ 0.612462,-0.474039,-0.632596,0.6971,0.103031,-0.690781,
+ 0.562161,-0.569598,-0.59961,0.72095,0.148061,-0.708313,
+ 0.274839,-0.496479,-0.823391,0.626577,0.153203,-0.765125,
+ 0.612462,-0.474039,-0.632596,0.6971,0.103031,-0.690781,
+ 0.274839,-0.496479,-0.823391,0.626577,0.153203,-0.765125,
+ 0.309535,-0.382382,-0.870616,0.610539,0.105601,-0.742813,
+ 0.562161,-0.569598,-0.59961,0.72095,0.148061,-0.708313,
+ 0.562307,-0.55594,-0.612162,0.75207,0.199038,-0.729453,
+ 0.267074,-0.480259,-0.835478,0.648325,0.207388,-0.792031,
+ 0.267074,-0.480259,-0.835478,0.648325,0.207388,-0.792031,
+ 0.274839,-0.496479,-0.823391,0.626577,0.153203,-0.765125,
+ 0.562161,-0.569598,-0.59961,0.72095,0.148061,-0.708313,
+ -0.034163,-0.398975,-0.916325,0.52383,0.217409,-0.812891,
+ -0.024814,-0.431442,-0.901799,0.513329,0.159372,-0.784063,
+ 0.274839,-0.496479,-0.823391,0.626577,0.153203,-0.765125,
+ -0.034163,-0.398975,-0.916325,0.52383,0.217409,-0.812891,
+ 0.274839,-0.496479,-0.823391,0.626577,0.153203,-0.765125,
+ 0.267074,-0.480259,-0.835478,0.648325,0.207388,-0.792031,
+ -0.024814,-0.431442,-0.901799,0.513329,0.159372,-0.784063,
+ -0.009985,-0.330184,-0.943864,0.506665,0.108686,-0.760156,
+ 0.309535,-0.382382,-0.870616,0.610539,0.105601,-0.742813,
+ 0.309535,-0.382382,-0.870616,0.610539,0.105601,-0.742813,
+ 0.274839,-0.496479,-0.823391,0.626577,0.153203,-0.765125,
+ -0.024814,-0.431442,-0.901799,0.513329,0.159372,-0.784063,
+ 0.603048,-0.457417,-0.653531,0.78489,0.253894,-0.7475,
+ 0.63763,-0.234074,-0.733919,0.81384,0.310563,-0.75575,
+ 0.330471,-0.133893,-0.93427,0.69892,0.325689,-0.8255,
+ 0.330471,-0.133893,-0.93427,0.69892,0.325689,-0.8255,
+ 0.285459,-0.369325,-0.884371,0.673275,0.265703,-0.815,
+ 0.603048,-0.457417,-0.653531,0.78489,0.253894,-0.7475,
+ 0.001894,-0.000876,-0.999998,0.561017,0.343841,-0.84875,
+ -0.029604,-0.263,-0.964342,0.539336,0.279873,-0.8375,
+ 0.285459,-0.369325,-0.884371,0.673275,0.265703,-0.815,
+ 0.001894,-0.000876,-0.999998,0.561017,0.343841,-0.84875,
+ 0.285459,-0.369325,-0.884371,0.673275,0.265703,-0.815,
+ 0.330471,-0.133893,-0.93427,0.69892,0.325689,-0.8255,
+ -0.029604,-0.263,-0.964342,0.539336,0.279873,-0.8375,
+ -0.034163,-0.398975,-0.916325,0.52383,0.217409,-0.812891,
+ 0.267074,-0.480259,-0.835478,0.648325,0.207388,-0.792031,
+ 0.267074,-0.480259,-0.835478,0.648325,0.207388,-0.792031,
+ 0.285459,-0.369325,-0.884371,0.673275,0.265703,-0.815,
+ -0.029604,-0.263,-0.964342,0.539336,0.279873,-0.8375,
+ 0.562307,-0.55594,-0.612162,0.75207,0.199038,-0.729453,
+ 0.603048,-0.457417,-0.653531,0.78489,0.253894,-0.7475,
+ 0.285459,-0.369325,-0.884371,0.673275,0.265703,-0.815,
+ 0.562307,-0.55594,-0.612162,0.75207,0.199038,-0.729453,
+ 0.285459,-0.369325,-0.884371,0.673275,0.265703,-0.815,
+ 0.267074,-0.480259,-0.835478,0.648325,0.207388,-0.792031,
+ -0.645198,0.198269,-0.737841,0.308193,0.377118,-0.75575,
+ -0.746027,-0.030098,-0.665235,0.293781,0.305853,-0.7475,
+ -0.383319,-0.173246,-0.907222,0.405397,0.294044,-0.815,
+ -0.645198,0.198269,-0.737841,0.308193,0.377118,-0.75575,
+ -0.383319,-0.173246,-0.907222,0.405397,0.294044,-0.815,
+ -0.328501,0.124794,-0.936223,0.423113,0.361992,-0.8255,
+ -0.700275,-0.236966,-0.673395,0.295589,0.235781,-0.729453,
+ -0.348349,-0.345034,-0.871553,0.399335,0.22743,-0.792031,
+ -0.383319,-0.173246,-0.907222,0.405397,0.294044,-0.815,
+ -0.700275,-0.236966,-0.673395,0.295589,0.235781,-0.729453,
+ -0.383319,-0.173246,-0.907222,0.405397,0.294044,-0.815,
+ -0.746027,-0.030098,-0.665235,0.293781,0.305853,-0.7475,
+ -0.034163,-0.398975,-0.916325,0.52383,0.217409,-0.812891,
+ -0.029604,-0.263,-0.964342,0.539336,0.279873,-0.8375,
+ -0.383319,-0.173246,-0.907222,0.405397,0.294044,-0.815,
+ -0.034163,-0.398975,-0.916325,0.52383,0.217409,-0.812891,
+ -0.383319,-0.173246,-0.907222,0.405397,0.294044,-0.815,
+ -0.348349,-0.345034,-0.871553,0.399335,0.22743,-0.792031,
+ -0.029604,-0.263,-0.964342,0.539336,0.279873,-0.8375,
+ 0.001894,-0.000876,-0.999998,0.561017,0.343841,-0.84875,
+ -0.328501,0.124794,-0.936223,0.423113,0.361992,-0.8255,
+ -0.328501,0.124794,-0.936223,0.423113,0.361992,-0.8255,
+ -0.383319,-0.173246,-0.907222,0.405397,0.294044,-0.815,
+ -0.029604,-0.263,-0.964342,0.539336,0.279873,-0.8375,
+ -0.68646,-0.277096,-0.672303,0.316229,0.114342,-0.690781,
+ -0.681322,-0.324401,-0.656174,0.305709,0.170683,-0.708313,
+ -0.90316,-0.279949,-0.32547,0.249085,0.173768,-0.613625,
+ -0.68646,-0.277096,-0.672303,0.316229,0.114342,-0.690781,
+ -0.90316,-0.279949,-0.32547,0.249085,0.173768,-0.613625,
+ -0.917766,-0.211835,-0.335904,0.264292,0.115884,-0.604062,
+ -0.681322,-0.324401,-0.656174,0.305709,0.170683,-0.708313,
+ -0.700275,-0.236966,-0.673395,0.295589,0.235781,-0.729453,
+ -0.92222,-0.200491,-0.330626,0.233342,0.240791,-0.625156,
+ -0.92222,-0.200491,-0.330626,0.233342,0.240791,-0.625156,
+ -0.90316,-0.279949,-0.32547,0.249085,0.173768,-0.613625,
+ -0.681322,-0.324401,-0.656174,0.305709,0.170683,-0.708313,
+ -0.978535,-0.206083,0,0.212593,0.242461,-0.5,
+ -0.963203,-0.268774,0,0.23021,0.174796,-0.5,
+ -0.90316,-0.279949,-0.32547,0.249085,0.173768,-0.613625,
+ -0.978535,-0.206083,0,0.212593,0.242461,-0.5,
+ -0.90316,-0.279949,-0.32547,0.249085,0.173768,-0.613625,
+ -0.92222,-0.200491,-0.330626,0.233342,0.240791,-0.625156,
+ -0.963203,-0.268774,0,0.23021,0.174796,-0.5,
+ -0.984639,-0.174604,0,0.24698,0.116398,-0.5,
+ -0.917766,-0.211835,-0.335904,0.264292,0.115884,-0.604062,
+ -0.917766,-0.211835,-0.335904,0.264292,0.115884,-0.604062,
+ -0.90316,-0.279949,-0.32547,0.249085,0.173768,-0.613625,
+ -0.963203,-0.268774,0,0.23021,0.174796,-0.5,
+ -0.746027,-0.030098,-0.665235,0.293781,0.305853,-0.7475,
+ -0.645198,0.198269,-0.737841,0.308193,0.377118,-0.75575,
+ -0.862657,0.31434,-0.396249,0.239242,0.386194,-0.6395,
+ -0.862657,0.31434,-0.396249,0.239242,0.386194,-0.6395,
+ -0.939405,0.002804,-0.342799,0.226812,0.312938,-0.635,
+ -0.746027,-0.030098,-0.665235,0.293781,0.305853,-0.7475,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.999757,-0.022023,0,0.204489,0.3153,-0.5,
+ -0.939405,0.002804,-0.342799,0.226812,0.312938,-0.635,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.939405,0.002804,-0.342799,0.226812,0.312938,-0.635,
+ -0.862657,0.31434,-0.396249,0.239242,0.386194,-0.6395,
+ -0.999757,-0.022023,0,0.204489,0.3153,-0.5,
+ -0.978535,-0.206083,0,0.212593,0.242461,-0.5,
+ -0.92222,-0.200491,-0.330626,0.233342,0.240791,-0.625156,
+ -0.92222,-0.200491,-0.330626,0.233342,0.240791,-0.625156,
+ -0.939405,0.002804,-0.342799,0.226812,0.312938,-0.635,
+ -0.999757,-0.022023,0,0.204489,0.3153,-0.5,
+ -0.700275,-0.236966,-0.673395,0.295589,0.235781,-0.729453,
+ -0.746027,-0.030098,-0.665235,0.293781,0.305853,-0.7475,
+ -0.939405,0.002804,-0.342799,0.226812,0.312938,-0.635,
+ -0.700275,-0.236966,-0.673395,0.295589,0.235781,-0.729453,
+ -0.939405,0.002804,-0.342799,0.226812,0.312938,-0.635,
+ -0.92222,-0.200491,-0.330626,0.233342,0.240791,-0.625156,
+ -0.862657,0.31434,0.396249,0.239242,0.386194,-0.3605,
+ -0.645198,0.198269,0.737841,0.308193,0.377118,-0.24425,
+ -0.746027,-0.030098,0.665236,0.293781,0.305853,-0.2525,
+ -0.746027,-0.030098,0.665236,0.293781,0.305853,-0.2525,
+ -0.939405,0.002804,0.342799,0.226812,0.312938,-0.365,
+ -0.862657,0.31434,0.396249,0.239242,0.386194,-0.3605,
+ -0.700275,-0.236966,0.673395,0.295589,0.235781,-0.270547,
+ -0.92222,-0.200492,0.330626,0.233342,0.240791,-0.374844,
+ -0.939405,0.002804,0.342799,0.226812,0.312938,-0.365,
+ -0.700275,-0.236966,0.673395,0.295589,0.235781,-0.270547,
+ -0.939405,0.002804,0.342799,0.226812,0.312938,-0.365,
+ -0.746027,-0.030098,0.665236,0.293781,0.305853,-0.2525,
+ -0.92222,-0.200492,0.330626,0.233342,0.240791,-0.374844,
+ -0.978535,-0.206083,0,0.212593,0.242461,-0.5,
+ -0.999757,-0.022023,0,0.204489,0.3153,-0.5,
+ -0.999757,-0.022023,0,0.204489,0.3153,-0.5,
+ -0.939405,0.002804,0.342799,0.226812,0.312938,-0.365,
+ -0.92222,-0.200492,0.330626,0.233342,0.240791,-0.374844,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.862657,0.31434,0.396249,0.239242,0.386194,-0.3605,
+ -0.939405,0.002804,0.342799,0.226812,0.312938,-0.365,
+ -0.940313,0.340311,0,0.216258,0.389219,-0.5,
+ -0.939405,0.002804,0.342799,0.226812,0.312938,-0.365,
+ -0.999757,-0.022023,0,0.204489,0.3153,-0.5,
+ -0.68646,-0.277096,0.672303,0.316229,0.114342,-0.309219,
+ -0.917766,-0.211835,0.335904,0.264292,0.115884,-0.395938,
+ -0.90316,-0.279949,0.32547,0.249085,0.173768,-0.386375,
+ -0.68646,-0.277096,0.672303,0.316229,0.114342,-0.309219,
+ -0.90316,-0.279949,0.32547,0.249085,0.173768,-0.386375,
+ -0.681322,-0.324401,0.656174,0.305709,0.170683,-0.291687,
+ -0.917766,-0.211835,0.335904,0.264292,0.115884,-0.395938,
+ -0.984639,-0.174604,0,0.24698,0.116398,-0.5,
+ -0.963203,-0.268774,0,0.23021,0.174796,-0.5,
+ -0.963203,-0.268774,0,0.23021,0.174796,-0.5,
+ -0.90316,-0.279949,0.32547,0.249085,0.173768,-0.386375,
+ -0.917766,-0.211835,0.335904,0.264292,0.115884,-0.395938,
+ -0.978535,-0.206083,0,0.212593,0.242461,-0.5,
+ -0.92222,-0.200492,0.330626,0.233342,0.240791,-0.374844,
+ -0.90316,-0.279949,0.32547,0.249085,0.173768,-0.386375,
+ -0.978535,-0.206083,0,0.212593,0.242461,-0.5,
+ -0.90316,-0.279949,0.32547,0.249085,0.173768,-0.386375,
+ -0.963203,-0.268774,0,0.23021,0.174796,-0.5,
+ -0.92222,-0.200492,0.330626,0.233342,0.240791,-0.374844,
+ -0.700275,-0.236966,0.673395,0.295589,0.235781,-0.270547,
+ -0.681322,-0.324401,0.656174,0.305709,0.170683,-0.291687,
+ -0.681322,-0.324401,0.656174,0.305709,0.170683,-0.291687,
+ -0.90316,-0.279949,0.32547,0.249085,0.173768,-0.386375,
+ -0.92222,-0.200492,0.330626,0.233342,0.240791,-0.374844,
+ -0.68646,-0.277096,0.672303,0.316229,0.114342,-0.309219,
+ -0.681322,-0.324401,0.656174,0.305709,0.170683,-0.291687,
+ -0.337162,-0.377107,0.862619,0.400082,0.165542,-0.234875,
+ -0.68646,-0.277096,0.672303,0.316229,0.114342,-0.309219,
+ -0.337162,-0.377107,0.862619,0.400082,0.165542,-0.234875,
+ -0.340489,-0.258832,0.903921,0.402791,0.111771,-0.257187,
+ -0.681322,-0.324401,0.656174,0.305709,0.170683,-0.291687,
+ -0.700275,-0.236966,0.673395,0.295589,0.235781,-0.270547,
+ -0.34835,-0.345034,0.871553,0.399335,0.22743,-0.207969,
+ -0.34835,-0.345034,0.871553,0.399335,0.22743,-0.207969,
+ -0.337162,-0.377107,0.862619,0.400082,0.165542,-0.234875,
+ -0.681322,-0.324401,0.656174,0.305709,0.170683,-0.291687,
+ -0.34835,-0.345034,0.871553,0.399335,0.22743,-0.207969,
+ -0.034164,-0.398975,0.916325,0.52383,0.217409,-0.187109,
+ -0.024814,-0.431443,0.901799,0.513329,0.159372,-0.215937,
+ -0.024814,-0.431443,0.901799,0.513329,0.159372,-0.215937,
+ -0.337162,-0.377107,0.862619,0.400082,0.165542,-0.234875,
+ -0.34835,-0.345034,0.871553,0.399335,0.22743,-0.207969,
+ -0.009985,-0.330184,0.943864,0.506665,0.108686,-0.239844,
+ -0.340489,-0.258832,0.903921,0.402791,0.111771,-0.257187,
+ -0.337162,-0.377107,0.862619,0.400082,0.165542,-0.234875,
+ -0.009985,-0.330184,0.943864,0.506665,0.108686,-0.239844,
+ -0.337162,-0.377107,0.862619,0.400082,0.165542,-0.234875,
+ -0.024814,-0.431443,0.901799,0.513329,0.159372,-0.215937,
+ -0.645198,0.198269,0.737841,0.308193,0.377118,-0.24425,
+ -0.328501,0.124794,0.936223,0.423113,0.361992,-0.1745,
+ -0.383319,-0.173246,0.907222,0.405397,0.294044,-0.185,
+ -0.645198,0.198269,0.737841,0.308193,0.377118,-0.24425,
+ -0.383319,-0.173246,0.907222,0.405397,0.294044,-0.185,
+ -0.746027,-0.030098,0.665236,0.293781,0.305853,-0.2525,
+ -0.328501,0.124794,0.936223,0.423113,0.361992,-0.1745,
+ 0.001894,-0.000875,0.999998,0.561017,0.343841,-0.15125,
+ -0.029604,-0.263,0.964342,0.539336,0.279873,-0.1625,
+ -0.029604,-0.263,0.964342,0.539336,0.279873,-0.1625,
+ -0.383319,-0.173246,0.907222,0.405397,0.294044,-0.185,
+ -0.328501,0.124794,0.936223,0.423113,0.361992,-0.1745,
+ -0.034164,-0.398975,0.916325,0.52383,0.217409,-0.187109,
+ -0.34835,-0.345034,0.871553,0.399335,0.22743,-0.207969,
+ -0.383319,-0.173246,0.907222,0.405397,0.294044,-0.185,
+ -0.034164,-0.398975,0.916325,0.52383,0.217409,-0.187109,
+ -0.383319,-0.173246,0.907222,0.405397,0.294044,-0.185,
+ -0.029604,-0.263,0.964342,0.539336,0.279873,-0.1625,
+ -0.700275,-0.236966,0.673395,0.295589,0.235781,-0.270547,
+ -0.746027,-0.030098,0.665236,0.293781,0.305853,-0.2525,
+ -0.383319,-0.173246,0.907222,0.405397,0.294044,-0.185,
+ -0.700275,-0.236966,0.673395,0.295589,0.235781,-0.270547,
+ -0.383319,-0.173246,0.907222,0.405397,0.294044,-0.185,
+ -0.34835,-0.345034,0.871553,0.399335,0.22743,-0.207969,
+ 0.330471,-0.133893,0.93427,0.69892,0.325689,-0.1745,
+ 0.63763,-0.234074,0.733919,0.81384,0.310563,-0.24425,
+ 0.603048,-0.457417,0.653531,0.78489,0.253894,-0.2525,
+ 0.603048,-0.457417,0.653531,0.78489,0.253894,-0.2525,
+ 0.285459,-0.369325,0.884371,0.673275,0.265703,-0.185,
+ 0.330471,-0.133893,0.93427,0.69892,0.325689,-0.1745,
+ 0.562306,-0.55594,0.612162,0.75207,0.199038,-0.270547,
+ 0.267074,-0.480259,0.835478,0.648325,0.207388,-0.207969,
+ 0.285459,-0.369325,0.884371,0.673275,0.265703,-0.185,
+ 0.562306,-0.55594,0.612162,0.75207,0.199038,-0.270547,
+ 0.285459,-0.369325,0.884371,0.673275,0.265703,-0.185,
+ 0.603048,-0.457417,0.653531,0.78489,0.253894,-0.2525,
+ 0.267074,-0.480259,0.835478,0.648325,0.207388,-0.207969,
+ -0.034164,-0.398975,0.916325,0.52383,0.217409,-0.187109,
+ -0.029604,-0.263,0.964342,0.539336,0.279873,-0.1625,
+ -0.029604,-0.263,0.964342,0.539336,0.279873,-0.1625,
+ 0.285459,-0.369325,0.884371,0.673275,0.265703,-0.185,
+ 0.267074,-0.480259,0.835478,0.648325,0.207388,-0.207969,
+ 0.001894,-0.000875,0.999998,0.561017,0.343841,-0.15125,
+ 0.330471,-0.133893,0.93427,0.69892,0.325689,-0.1745,
+ 0.285459,-0.369325,0.884371,0.673275,0.265703,-0.185,
+ 0.001894,-0.000875,0.999998,0.561017,0.343841,-0.15125,
+ 0.285459,-0.369325,0.884371,0.673275,0.265703,-0.185,
+ -0.029604,-0.263,0.964342,0.539336,0.279873,-0.1625,
+ 0.612462,-0.474038,0.632596,0.6971,0.103031,-0.309219,
+ 0.309535,-0.382382,0.870616,0.610539,0.105601,-0.257187,
+ 0.274839,-0.496479,0.823391,0.626577,0.153203,-0.234875,
+ 0.612462,-0.474038,0.632596,0.6971,0.103031,-0.309219,
+ 0.274839,-0.496479,0.823391,0.626577,0.153203,-0.234875,
+ 0.562162,-0.569598,0.59961,0.72095,0.148061,-0.291687,
+ 0.309535,-0.382382,0.870616,0.610539,0.105601,-0.257187,
+ -0.009985,-0.330184,0.943864,0.506665,0.108686,-0.239844,
+ -0.024814,-0.431443,0.901799,0.513329,0.159372,-0.215937,
+ -0.024814,-0.431443,0.901799,0.513329,0.159372,-0.215937,
+ 0.274839,-0.496479,0.823391,0.626577,0.153203,-0.234875,
+ 0.309535,-0.382382,0.870616,0.610539,0.105601,-0.257187,
+ -0.034164,-0.398975,0.916325,0.52383,0.217409,-0.187109,
+ 0.267074,-0.480259,0.835478,0.648325,0.207388,-0.207969,
+ 0.274839,-0.496479,0.823391,0.626577,0.153203,-0.234875,
+ -0.034164,-0.398975,0.916325,0.52383,0.217409,-0.187109,
+ 0.274839,-0.496479,0.823391,0.626577,0.153203,-0.234875,
+ -0.024814,-0.431443,0.901799,0.513329,0.159372,-0.215937,
+ 0.267074,-0.480259,0.835478,0.648325,0.207388,-0.207969,
+ 0.562306,-0.55594,0.612162,0.75207,0.199038,-0.270547,
+ 0.562162,-0.569598,0.59961,0.72095,0.148061,-0.291687,
+ 0.562162,-0.569598,0.59961,0.72095,0.148061,-0.291687,
+ 0.274839,-0.496479,0.823391,0.626577,0.153203,-0.234875,
+ 0.267074,-0.480259,0.835478,0.648325,0.207388,-0.207969,
+ 0.612462,-0.474038,0.632596,0.6971,0.103031,-0.309219,
+ 0.562162,-0.569598,0.59961,0.72095,0.148061,-0.291687,
+ 0.752224,-0.592299,0.288689,0.777574,0.144976,-0.386375,
+ 0.612462,-0.474038,0.632596,0.6971,0.103031,-0.309219,
+ 0.752224,-0.592299,0.288689,0.777574,0.144976,-0.386375,
+ 0.829185,-0.462729,0.313581,0.749037,0.101488,-0.395938,
+ 0.562162,-0.569598,0.59961,0.72095,0.148061,-0.291687,
+ 0.562306,-0.55594,0.612162,0.75207,0.199038,-0.270547,
+ 0.743616,-0.602792,0.28927,0.814318,0.194027,-0.374844,
+ 0.743616,-0.602792,0.28927,0.814318,0.194027,-0.374844,
+ 0.752224,-0.592299,0.288689,0.777574,0.144976,-0.386375,
+ 0.562162,-0.569598,0.59961,0.72095,0.148061,-0.291687,
+ 0.788677,-0.614808,0,0.835067,0.192357,-0.5,
+ 0.807803,-0.589452,0,0.796449,0.143948,-0.5,
+ 0.752224,-0.592299,0.288689,0.777574,0.144976,-0.386375,
+ 0.788677,-0.614808,0,0.835067,0.192357,-0.5,
+ 0.752224,-0.592299,0.288689,0.777574,0.144976,-0.386375,
+ 0.743616,-0.602792,0.28927,0.814318,0.194027,-0.374844,
+ 0.807803,-0.589452,0,0.796449,0.143948,-0.5,
+ 0.902893,-0.429866,0,0.766349,0.100974,-0.5,
+ 0.829185,-0.462729,0.313581,0.749037,0.101488,-0.395938,
+ 0.829185,-0.462729,0.313581,0.749037,0.101488,-0.395938,
+ 0.752224,-0.592299,0.288689,0.777574,0.144976,-0.386375,
+ 0.807803,-0.589452,0,0.796449,0.143948,-0.5,
+ 0.603048,-0.457417,0.653531,0.78489,0.253894,-0.2525,
+ 0.63763,-0.234074,0.733919,0.81384,0.310563,-0.24425,
+ 0.846641,-0.361408,0.39062,0.882792,0.301487,-0.3605,
+ 0.846641,-0.361408,0.39062,0.882792,0.301487,-0.3605,
+ 0.784719,-0.539182,0.305775,0.85186,0.246808,-0.365,
+ 0.603048,-0.457417,0.653531,0.78489,0.253894,-0.2525,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.822786,-0.568352,0,0.874183,0.244447,-0.5,
+ 0.784719,-0.539182,0.305775,0.85186,0.246808,-0.365,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.784719,-0.539182,0.305775,0.85186,0.246808,-0.365,
+ 0.846641,-0.361408,0.39062,0.882792,0.301487,-0.3605,
+ 0.822786,-0.568352,0,0.874183,0.244447,-0.5,
+ 0.788677,-0.614808,0,0.835067,0.192357,-0.5,
+ 0.743616,-0.602792,0.28927,0.814318,0.194027,-0.374844,
+ 0.743616,-0.602792,0.28927,0.814318,0.194027,-0.374844,
+ 0.784719,-0.539182,0.305775,0.85186,0.246808,-0.365,
+ 0.822786,-0.568352,0,0.874183,0.244447,-0.5,
+ 0.562306,-0.55594,0.612162,0.75207,0.199038,-0.270547,
+ 0.603048,-0.457417,0.653531,0.78489,0.253894,-0.2525,
+ 0.784719,-0.539182,0.305775,0.85186,0.246808,-0.365,
+ 0.562306,-0.55594,0.612162,0.75207,0.199038,-0.270547,
+ 0.784719,-0.539182,0.305775,0.85186,0.246808,-0.365,
+ 0.743616,-0.602792,0.28927,0.814318,0.194027,-0.374844,
+ 0.846641,-0.361408,-0.390619,0.882792,0.301487,-0.6395,
+ 0.63763,-0.234074,-0.733919,0.81384,0.310563,-0.75575,
+ 0.603048,-0.457417,-0.653531,0.78489,0.253894,-0.7475,
+ 0.603048,-0.457417,-0.653531,0.78489,0.253894,-0.7475,
+ 0.784719,-0.539182,-0.305775,0.85186,0.246808,-0.635,
+ 0.846641,-0.361408,-0.390619,0.882792,0.301487,-0.6395,
+ 0.562307,-0.55594,-0.612162,0.75207,0.199038,-0.729453,
+ 0.743616,-0.602791,-0.28927,0.814318,0.194027,-0.625156,
+ 0.784719,-0.539182,-0.305775,0.85186,0.246808,-0.635,
+ 0.562307,-0.55594,-0.612162,0.75207,0.199038,-0.729453,
+ 0.784719,-0.539182,-0.305775,0.85186,0.246808,-0.635,
+ 0.603048,-0.457417,-0.653531,0.78489,0.253894,-0.7475,
+ 0.743616,-0.602791,-0.28927,0.814318,0.194027,-0.625156,
+ 0.788677,-0.614808,0,0.835067,0.192357,-0.5,
+ 0.822786,-0.568352,0,0.874183,0.244447,-0.5,
+ 0.822786,-0.568352,0,0.874183,0.244447,-0.5,
+ 0.784719,-0.539182,-0.305775,0.85186,0.246808,-0.635,
+ 0.743616,-0.602791,-0.28927,0.814318,0.194027,-0.625156,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.846641,-0.361408,-0.390619,0.882792,0.301487,-0.6395,
+ 0.784719,-0.539182,-0.305775,0.85186,0.246808,-0.635,
+ 0.918091,-0.39637,0,0.905776,0.298462,-0.5,
+ 0.784719,-0.539182,-0.305775,0.85186,0.246808,-0.635,
+ 0.822786,-0.568352,0,0.874183,0.244447,-0.5,
+ 0.612462,-0.474039,-0.632596,0.6971,0.103031,-0.690781,
+ 0.829185,-0.462729,-0.313581,0.749037,0.101488,-0.604062,
+ 0.752224,-0.592299,-0.288689,0.777574,0.144976,-0.613625,
+ 0.612462,-0.474039,-0.632596,0.6971,0.103031,-0.690781,
+ 0.752224,-0.592299,-0.288689,0.777574,0.144976,-0.613625,
+ 0.562161,-0.569598,-0.59961,0.72095,0.148061,-0.708313,
+ 0.829185,-0.462729,-0.313581,0.749037,0.101488,-0.604062,
+ 0.902893,-0.429866,0,0.766349,0.100974,-0.5,
+ 0.807803,-0.589452,0,0.796449,0.143948,-0.5,
+ 0.807803,-0.589452,0,0.796449,0.143948,-0.5,
+ 0.752224,-0.592299,-0.288689,0.777574,0.144976,-0.613625,
+ 0.829185,-0.462729,-0.313581,0.749037,0.101488,-0.604062,
+ 0.788677,-0.614808,0,0.835067,0.192357,-0.5,
+ 0.743616,-0.602791,-0.28927,0.814318,0.194027,-0.625156,
+ 0.752224,-0.592299,-0.288689,0.777574,0.144976,-0.613625,
+ 0.788677,-0.614808,0,0.835067,0.192357,-0.5,
+ 0.752224,-0.592299,-0.288689,0.777574,0.144976,-0.613625,
+ 0.807803,-0.589452,0,0.796449,0.143948,-0.5,
+ 0.743616,-0.602791,-0.28927,0.814318,0.194027,-0.625156,
+ 0.562307,-0.55594,-0.612162,0.75207,0.199038,-0.729453,
+ 0.562161,-0.569598,-0.59961,0.72095,0.148061,-0.708313,
+ 0.562161,-0.569598,-0.59961,0.72095,0.148061,-0.708313,
+ 0.752224,-0.592299,-0.288689,0.777574,0.144976,-0.613625,
+ 0.743616,-0.602791,-0.28927,0.814318,0.194027,-0.625156,
+ 0.662382,-0.336592,0.669295,0.68609,0.066012,-0.316437,
+ 0.612462,-0.474038,0.632596,0.6971,0.103031,-0.309219,
+ 0.829185,-0.462729,0.313581,0.749037,0.101488,-0.395938,
+ 0.829185,-0.462729,0.313581,0.749037,0.101488,-0.395938,
+ 0.877019,-0.354062,0.324773,0.736115,0.065395,-0.399875,
+ 0.662382,-0.336592,0.669295,0.68609,0.066012,-0.316437,
+ 0.902893,-0.429866,0,0.766349,0.100974,-0.5,
+ 0.936513,-0.350633,0,0.75279,0.06519,-0.5,
+ 0.877019,-0.354062,0.324773,0.736115,0.065395,-0.399875,
+ 0.902893,-0.429866,0,0.766349,0.100974,-0.5,
+ 0.877019,-0.354062,0.324773,0.736115,0.065395,-0.399875,
+ 0.829185,-0.462729,0.313581,0.749037,0.101488,-0.395938,
+ 0.936513,-0.350633,0,0.75279,0.06519,-0.5,
+ 0.796583,-0.60453,0,0.742322,0.036664,-0.5,
+ 0.776532,-0.563325,0.282246,0.726029,0.037019,-0.403594,
+ 0.776532,-0.563325,0.282246,0.726029,0.037019,-0.403594,
+ 0.877019,-0.354062,0.324773,0.736115,0.065395,-0.399875,
+ 0.936513,-0.350633,0,0.75279,0.06519,-0.5,
+ 0.609651,-0.5022,0.613287,0.677491,0.037477,-0.323141,
+ 0.662382,-0.336592,0.669295,0.68609,0.066012,-0.316437,
+ 0.877019,-0.354062,0.324773,0.736115,0.065395,-0.399875,
+ 0.609651,-0.5022,0.613287,0.677491,0.037477,-0.323141,
+ 0.877019,-0.354062,0.324773,0.736115,0.065395,-0.399875,
+ 0.776532,-0.563325,0.282246,0.726029,0.037019,-0.403594,
+ 0.829185,-0.462729,-0.313581,0.749037,0.101488,-0.604062,
+ 0.612462,-0.474039,-0.632596,0.6971,0.103031,-0.690781,
+ 0.662382,-0.336592,-0.669295,0.68609,0.066012,-0.683563,
+ 0.662382,-0.336592,-0.669295,0.68609,0.066012,-0.683563,
+ 0.877019,-0.354062,-0.324773,0.736115,0.065395,-0.600125,
+ 0.829185,-0.462729,-0.313581,0.749037,0.101488,-0.604062,
+ 0.609651,-0.5022,-0.613287,0.677491,0.037477,-0.676859,
+ 0.776532,-0.563325,-0.282246,0.726029,0.037019,-0.596406,
+ 0.877019,-0.354062,-0.324773,0.736115,0.065395,-0.600125,
+ 0.609651,-0.5022,-0.613287,0.677491,0.037477,-0.676859,
+ 0.877019,-0.354062,-0.324773,0.736115,0.065395,-0.600125,
+ 0.662382,-0.336592,-0.669295,0.68609,0.066012,-0.683563,
+ 0.776532,-0.563325,-0.282246,0.726029,0.037019,-0.596406,
+ 0.796583,-0.60453,0,0.742322,0.036664,-0.5,
+ 0.936513,-0.350633,0,0.75279,0.06519,-0.5,
+ 0.936513,-0.350633,0,0.75279,0.06519,-0.5,
+ 0.877019,-0.354062,-0.324773,0.736115,0.065395,-0.600125,
+ 0.776532,-0.563325,-0.282246,0.726029,0.037019,-0.596406,
+ 0.902893,-0.429866,0,0.766349,0.100974,-0.5,
+ 0.829185,-0.462729,-0.313581,0.749037,0.101488,-0.604062,
+ 0.877019,-0.354062,-0.324773,0.736115,0.065395,-0.600125,
+ 0.902893,-0.429866,0,0.766349,0.100974,-0.5,
+ 0.877019,-0.354062,-0.324773,0.736115,0.065395,-0.600125,
+ 0.936513,-0.350633,0,0.75279,0.06519,-0.5,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.460562,-0.87149,-0.168487,0.706,0.016681,-0.5875,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.460562,-0.87149,-0.168487,0.706,0.016681,-0.5875,
+ 0.392801,-0.830761,-0.394389,0.660875,0.017896,-0.660875,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.528671,-0.848827,0,0.7215,0.015465,-0.5,
+ 0.460562,-0.87149,-0.168487,0.706,0.016681,-0.5875,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.460562,-0.87149,-0.168487,0.706,0.016681,-0.5875,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.796583,-0.60453,0,0.742322,0.036664,-0.5,
+ 0.776532,-0.563325,-0.282246,0.726029,0.037019,-0.596406,
+ 0.460562,-0.87149,-0.168487,0.706,0.016681,-0.5875,
+ 0.796583,-0.60453,0,0.742322,0.036664,-0.5,
+ 0.460562,-0.87149,-0.168487,0.706,0.016681,-0.5875,
+ 0.528671,-0.848827,0,0.7215,0.015465,-0.5,
+ 0.776532,-0.563325,-0.282246,0.726029,0.037019,-0.596406,
+ 0.609651,-0.5022,-0.613287,0.677491,0.037477,-0.676859,
+ 0.392801,-0.830761,-0.394389,0.660875,0.017896,-0.660875,
+ 0.392801,-0.830761,-0.394389,0.660875,0.017896,-0.660875,
+ 0.460562,-0.87149,-0.168487,0.706,0.016681,-0.5875,
+ 0.776532,-0.563325,-0.282246,0.726029,0.037019,-0.596406,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.392801,-0.830761,0.394389,0.660875,0.017896,-0.339125,
+ 0.460562,-0.87149,0.168487,0.706,0.016681,-0.4125,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.460562,-0.87149,0.168487,0.706,0.016681,-0.4125,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.392801,-0.830761,0.394389,0.660875,0.017896,-0.339125,
+ 0.609651,-0.5022,0.613287,0.677491,0.037477,-0.323141,
+ 0.776532,-0.563325,0.282246,0.726029,0.037019,-0.403594,
+ 0.776532,-0.563325,0.282246,0.726029,0.037019,-0.403594,
+ 0.460562,-0.87149,0.168487,0.706,0.016681,-0.4125,
+ 0.392801,-0.830761,0.394389,0.660875,0.017896,-0.339125,
+ 0.796583,-0.60453,0,0.742322,0.036664,-0.5,
+ 0.528671,-0.848827,0,0.7215,0.015465,-0.5,
+ 0.460562,-0.87149,0.168487,0.706,0.016681,-0.4125,
+ 0.796583,-0.60453,0,0.742322,0.036664,-0.5,
+ 0.460562,-0.87149,0.168487,0.706,0.016681,-0.4125,
+ 0.776532,-0.563325,0.282246,0.726029,0.037019,-0.403594,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.460562,-0.87149,0.168487,0.706,0.016681,-0.4125,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.460562,-0.87149,0.168487,0.706,0.016681,-0.4125,
+ 0.528671,-0.848827,0,0.7215,0.015465,-0.5,
+ 0.662382,-0.336592,-0.669295,0.68609,0.066012,-0.683563,
+ 0.612462,-0.474039,-0.632596,0.6971,0.103031,-0.690781,
+ 0.309535,-0.382382,-0.870616,0.610539,0.105601,-0.742813,
+ 0.309535,-0.382382,-0.870616,0.610539,0.105601,-0.742813,
+ 0.325986,-0.296158,-0.897788,0.602715,0.067041,-0.733625,
+ 0.662382,-0.336592,-0.669295,0.68609,0.066012,-0.683563,
+ -0.009985,-0.330184,-0.943864,0.506665,0.108686,-0.760156,
+ -0.003719,-0.252904,-0.967484,0.502666,0.068274,-0.750313,
+ 0.325986,-0.296158,-0.897788,0.602715,0.067041,-0.733625,
+ -0.009985,-0.330184,-0.943864,0.506665,0.108686,-0.760156,
+ 0.325986,-0.296158,-0.897788,0.602715,0.067041,-0.733625,
+ 0.309535,-0.382382,-0.870616,0.610539,0.105601,-0.742813,
+ -0.003719,-0.252904,-0.967484,0.502666,0.068274,-0.750313,
+ -0.025551,-0.524875,-0.850796,0.500666,0.037435,-0.741703,
+ 0.28571,-0.534951,-0.795108,0.597054,0.03743,-0.725406,
+ 0.28571,-0.534951,-0.795108,0.597054,0.03743,-0.725406,
+ 0.325986,-0.296158,-0.897788,0.602715,0.067041,-0.733625,
+ -0.003719,-0.252904,-0.967484,0.502666,0.068274,-0.750313,
+ 0.609651,-0.5022,-0.613287,0.677491,0.037477,-0.676859,
+ 0.662382,-0.336592,-0.669295,0.68609,0.066012,-0.683563,
+ 0.325986,-0.296158,-0.897788,0.602715,0.067041,-0.733625,
+ 0.609651,-0.5022,-0.613287,0.677491,0.037477,-0.676859,
+ 0.325986,-0.296158,-0.897788,0.602715,0.067041,-0.733625,
+ 0.28571,-0.534951,-0.795108,0.597054,0.03743,-0.725406,
+ -0.340489,-0.258832,-0.903921,0.402791,0.111771,-0.742813,
+ -0.68646,-0.277096,-0.672303,0.316229,0.114342,-0.690781,
+ -0.696634,-0.190085,-0.691787,0.319242,0.070537,-0.683563,
+ -0.696634,-0.190085,-0.691787,0.319242,0.070537,-0.683563,
+ -0.33904,-0.236102,-0.910663,0.402616,0.069508,-0.733625,
+ -0.340489,-0.258832,-0.903921,0.402791,0.111771,-0.742813,
+ -0.643521,-0.419436,-0.640277,0.323842,0.038608,-0.676859,
+ -0.321508,-0.547444,-0.772617,0.404279,0.038047,-0.725406,
+ -0.33904,-0.236102,-0.910663,0.402616,0.069508,-0.733625,
+ -0.643521,-0.419436,-0.640277,0.323842,0.038608,-0.676859,
+ -0.33904,-0.236102,-0.910663,0.402616,0.069508,-0.733625,
+ -0.696634,-0.190085,-0.691787,0.319242,0.070537,-0.683563,
+ -0.025551,-0.524875,-0.850796,0.500666,0.037435,-0.741703,
+ -0.003719,-0.252904,-0.967484,0.502666,0.068274,-0.750313,
+ -0.33904,-0.236102,-0.910663,0.402616,0.069508,-0.733625,
+ -0.025551,-0.524875,-0.850796,0.500666,0.037435,-0.741703,
+ -0.33904,-0.236102,-0.910663,0.402616,0.069508,-0.733625,
+ -0.321508,-0.547444,-0.772617,0.404279,0.038047,-0.725406,
+ -0.003719,-0.252904,-0.967484,0.502666,0.068274,-0.750313,
+ -0.009985,-0.330184,-0.943864,0.506665,0.108686,-0.760156,
+ -0.340489,-0.258832,-0.903921,0.402791,0.111771,-0.742813,
+ -0.340489,-0.258832,-0.903921,0.402791,0.111771,-0.742813,
+ -0.33904,-0.236102,-0.910663,0.402616,0.069508,-0.733625,
+ -0.003719,-0.252904,-0.967484,0.502666,0.068274,-0.750313,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.173348,-0.862844,-0.474818,0.4125,0.016681,-0.706,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.173348,-0.862844,-0.474818,0.4125,0.016681,-0.706,
+ -0.412793,-0.812756,-0.411133,0.339125,0.017896,-0.660875,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ -0.000173,-0.840077,-0.542467,0.5,0.015465,-0.7215,
+ -0.173348,-0.862844,-0.474818,0.4125,0.016681,-0.706,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ -0.173348,-0.862844,-0.474818,0.4125,0.016681,-0.706,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.025551,-0.524875,-0.850796,0.500666,0.037435,-0.741703,
+ -0.321508,-0.547444,-0.772617,0.404279,0.038047,-0.725406,
+ -0.173348,-0.862844,-0.474818,0.4125,0.016681,-0.706,
+ -0.025551,-0.524875,-0.850796,0.500666,0.037435,-0.741703,
+ -0.173348,-0.862844,-0.474818,0.4125,0.016681,-0.706,
+ -0.000173,-0.840077,-0.542467,0.5,0.015465,-0.7215,
+ -0.321508,-0.547444,-0.772617,0.404279,0.038047,-0.725406,
+ -0.643521,-0.419436,-0.640277,0.323842,0.038608,-0.676859,
+ -0.412793,-0.812756,-0.411133,0.339125,0.017896,-0.660875,
+ -0.412793,-0.812756,-0.411133,0.339125,0.017896,-0.660875,
+ -0.173348,-0.862844,-0.474818,0.4125,0.016681,-0.706,
+ -0.321508,-0.547444,-0.772617,0.404279,0.038047,-0.725406,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.392801,-0.830761,-0.394389,0.660875,0.017896,-0.660875,
+ 0.170214,-0.866923,-0.468478,0.5875,0.016681,-0.706,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.170214,-0.866923,-0.468478,0.5875,0.016681,-0.706,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0.392801,-0.830761,-0.394389,0.660875,0.017896,-0.660875,
+ 0.609651,-0.5022,-0.613287,0.677491,0.037477,-0.676859,
+ 0.28571,-0.534951,-0.795108,0.597054,0.03743,-0.725406,
+ 0.28571,-0.534951,-0.795108,0.597054,0.03743,-0.725406,
+ 0.170214,-0.866923,-0.468478,0.5875,0.016681,-0.706,
+ 0.392801,-0.830761,-0.394389,0.660875,0.017896,-0.660875,
+ -0.025551,-0.524875,-0.850796,0.500666,0.037435,-0.741703,
+ -0.000173,-0.840077,-0.542467,0.5,0.015465,-0.7215,
+ 0.170214,-0.866923,-0.468478,0.5875,0.016681,-0.706,
+ -0.025551,-0.524875,-0.850796,0.500666,0.037435,-0.741703,
+ 0.170214,-0.866923,-0.468478,0.5875,0.016681,-0.706,
+ 0.28571,-0.534951,-0.795108,0.597054,0.03743,-0.725406,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0.170214,-0.866923,-0.468478,0.5875,0.016681,-0.706,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ 0.170214,-0.866923,-0.468478,0.5875,0.016681,-0.706,
+ -0.000173,-0.840077,-0.542467,0.5,0.015465,-0.7215,
+ -0.696634,-0.190085,-0.691787,0.319242,0.070537,-0.683563,
+ -0.68646,-0.277096,-0.672303,0.316229,0.114342,-0.690781,
+ -0.917766,-0.211835,-0.335904,0.264292,0.115884,-0.604062,
+ -0.917766,-0.211835,-0.335904,0.264292,0.115884,-0.604062,
+ -0.92467,-0.172819,-0.339293,0.269217,0.071154,-0.600125,
+ -0.696634,-0.190085,-0.691787,0.319242,0.070537,-0.683563,
+ -0.984639,-0.174604,0,0.24698,0.116398,-0.5,
+ -0.985139,-0.171761,0,0.252542,0.071359,-0.5,
+ -0.92467,-0.172819,-0.339293,0.269217,0.071154,-0.600125,
+ -0.984639,-0.174604,0,0.24698,0.116398,-0.5,
+ -0.92467,-0.172819,-0.339293,0.269217,0.071154,-0.600125,
+ -0.917766,-0.211835,-0.335904,0.264292,0.115884,-0.604062,
+ -0.985139,-0.171761,0,0.252542,0.071359,-0.5,
+ -0.851281,-0.524711,0,0.25901,0.038206,-0.5,
+ -0.829046,-0.471849,-0.300069,0.275304,0.038459,-0.596406,
+ -0.829046,-0.471849,-0.300069,0.275304,0.038459,-0.596406,
+ -0.92467,-0.172819,-0.339293,0.269217,0.071154,-0.600125,
+ -0.985139,-0.171761,0,0.252542,0.071359,-0.5,
+ -0.643521,-0.419436,-0.640277,0.323842,0.038608,-0.676859,
+ -0.696634,-0.190085,-0.691787,0.319242,0.070537,-0.683563,
+ -0.92467,-0.172819,-0.339293,0.269217,0.071154,-0.600125,
+ -0.643521,-0.419436,-0.640277,0.323842,0.038608,-0.676859,
+ -0.92467,-0.172819,-0.339293,0.269217,0.071154,-0.600125,
+ -0.829046,-0.471849,-0.300069,0.275304,0.038459,-0.596406,
+ -0.917766,-0.211835,0.335904,0.264292,0.115884,-0.395938,
+ -0.68646,-0.277096,0.672303,0.316229,0.114342,-0.309219,
+ -0.696634,-0.190085,0.691786,0.319242,0.070537,-0.316437,
+ -0.696634,-0.190085,0.691786,0.319242,0.070537,-0.316437,
+ -0.92467,-0.172819,0.339293,0.269217,0.071154,-0.399875,
+ -0.917766,-0.211835,0.335904,0.264292,0.115884,-0.395938,
+ -0.643521,-0.419436,0.640277,0.323842,0.038608,-0.323141,
+ -0.829046,-0.471848,0.300069,0.275304,0.038459,-0.403594,
+ -0.92467,-0.172819,0.339293,0.269217,0.071154,-0.399875,
+ -0.643521,-0.419436,0.640277,0.323842,0.038608,-0.323141,
+ -0.92467,-0.172819,0.339293,0.269217,0.071154,-0.399875,
+ -0.696634,-0.190085,0.691786,0.319242,0.070537,-0.316437,
+ -0.829046,-0.471848,0.300069,0.275304,0.038459,-0.403594,
+ -0.851281,-0.524711,0,0.25901,0.038206,-0.5,
+ -0.985139,-0.171761,0,0.252542,0.071359,-0.5,
+ -0.985139,-0.171761,0,0.252542,0.071359,-0.5,
+ -0.92467,-0.172819,0.339293,0.269217,0.071154,-0.399875,
+ -0.829046,-0.471848,0.300069,0.275304,0.038459,-0.403594,
+ -0.984639,-0.174604,0,0.24698,0.116398,-0.5,
+ -0.917766,-0.211835,0.335904,0.264292,0.115884,-0.395938,
+ -0.92467,-0.172819,0.339293,0.269217,0.071154,-0.399875,
+ -0.984639,-0.174604,0,0.24698,0.116398,-0.5,
+ -0.92467,-0.172819,0.339293,0.269217,0.071154,-0.399875,
+ -0.985139,-0.171761,0,0.252542,0.071359,-0.5,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.483213,-0.857792,0.175209,0.294,0.016681,-0.4125,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.483213,-0.857792,0.175209,0.294,0.016681,-0.4125,
+ -0.412793,-0.812756,0.411133,0.339125,0.017896,-0.339125,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.556955,-0.830542,0,0.2785,0.015465,-0.5,
+ -0.483213,-0.857792,0.175209,0.294,0.016681,-0.4125,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.483213,-0.857792,0.175209,0.294,0.016681,-0.4125,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.851281,-0.524711,0,0.25901,0.038206,-0.5,
+ -0.829046,-0.471848,0.300069,0.275304,0.038459,-0.403594,
+ -0.483213,-0.857792,0.175209,0.294,0.016681,-0.4125,
+ -0.851281,-0.524711,0,0.25901,0.038206,-0.5,
+ -0.483213,-0.857792,0.175209,0.294,0.016681,-0.4125,
+ -0.556955,-0.830542,0,0.2785,0.015465,-0.5,
+ -0.829046,-0.471848,0.300069,0.275304,0.038459,-0.403594,
+ -0.643521,-0.419436,0.640277,0.323842,0.038608,-0.323141,
+ -0.412793,-0.812756,0.411133,0.339125,0.017896,-0.339125,
+ -0.412793,-0.812756,0.411133,0.339125,0.017896,-0.339125,
+ -0.483213,-0.857792,0.175209,0.294,0.016681,-0.4125,
+ -0.829046,-0.471848,0.300069,0.275304,0.038459,-0.403594,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.412793,-0.812756,-0.411133,0.339125,0.017896,-0.660875,
+ -0.483213,-0.857792,-0.17521,0.294,0.016681,-0.5875,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.483213,-0.857792,-0.17521,0.294,0.016681,-0.5875,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.412793,-0.812756,-0.411133,0.339125,0.017896,-0.660875,
+ -0.643521,-0.419436,-0.640277,0.323842,0.038608,-0.676859,
+ -0.829046,-0.471849,-0.300069,0.275304,0.038459,-0.596406,
+ -0.829046,-0.471849,-0.300069,0.275304,0.038459,-0.596406,
+ -0.483213,-0.857792,-0.17521,0.294,0.016681,-0.5875,
+ -0.412793,-0.812756,-0.411133,0.339125,0.017896,-0.660875,
+ -0.851281,-0.524711,0,0.25901,0.038206,-0.5,
+ -0.556955,-0.830542,0,0.2785,0.015465,-0.5,
+ -0.483213,-0.857792,-0.17521,0.294,0.016681,-0.5875,
+ -0.851281,-0.524711,0,0.25901,0.038206,-0.5,
+ -0.483213,-0.857792,-0.17521,0.294,0.016681,-0.5875,
+ -0.829046,-0.471849,-0.300069,0.275304,0.038459,-0.596406,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.483213,-0.857792,-0.17521,0.294,0.016681,-0.5875,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.483213,-0.857792,-0.17521,0.294,0.016681,-0.5875,
+ -0.556955,-0.830542,0,0.2785,0.015465,-0.5,
+ -0.696634,-0.190085,0.691786,0.319242,0.070537,-0.316437,
+ -0.68646,-0.277096,0.672303,0.316229,0.114342,-0.309219,
+ -0.340489,-0.258832,0.903921,0.402791,0.111771,-0.257187,
+ -0.340489,-0.258832,0.903921,0.402791,0.111771,-0.257187,
+ -0.339041,-0.236102,0.910663,0.402616,0.069508,-0.266375,
+ -0.696634,-0.190085,0.691786,0.319242,0.070537,-0.316437,
+ -0.340489,-0.258832,0.903921,0.402791,0.111771,-0.257187,
+ -0.009985,-0.330184,0.943864,0.506665,0.108686,-0.239844,
+ -0.003719,-0.252904,0.967484,0.502666,0.068274,-0.249687,
+ -0.003719,-0.252904,0.967484,0.502666,0.068274,-0.249687,
+ -0.339041,-0.236102,0.910663,0.402616,0.069508,-0.266375,
+ -0.340489,-0.258832,0.903921,0.402791,0.111771,-0.257187,
+ -0.025551,-0.524875,0.850796,0.500666,0.037435,-0.258297,
+ -0.321508,-0.547444,0.772617,0.404279,0.038047,-0.274594,
+ -0.339041,-0.236102,0.910663,0.402616,0.069508,-0.266375,
+ -0.025551,-0.524875,0.850796,0.500666,0.037435,-0.258297,
+ -0.339041,-0.236102,0.910663,0.402616,0.069508,-0.266375,
+ -0.003719,-0.252904,0.967484,0.502666,0.068274,-0.249687,
+ -0.643521,-0.419436,0.640277,0.323842,0.038608,-0.323141,
+ -0.696634,-0.190085,0.691786,0.319242,0.070537,-0.316437,
+ -0.339041,-0.236102,0.910663,0.402616,0.069508,-0.266375,
+ -0.643521,-0.419436,0.640277,0.323842,0.038608,-0.323141,
+ -0.339041,-0.236102,0.910663,0.402616,0.069508,-0.266375,
+ -0.321508,-0.547444,0.772617,0.404279,0.038047,-0.274594,
+ 0.309535,-0.382382,0.870616,0.610539,0.105601,-0.257187,
+ 0.612462,-0.474038,0.632596,0.6971,0.103031,-0.309219,
+ 0.662382,-0.336592,0.669295,0.68609,0.066012,-0.316437,
+ 0.662382,-0.336592,0.669295,0.68609,0.066012,-0.316437,
+ 0.325986,-0.296157,0.897788,0.602715,0.067041,-0.266375,
+ 0.309535,-0.382382,0.870616,0.610539,0.105601,-0.257187,
+ 0.609651,-0.5022,0.613287,0.677491,0.037477,-0.323141,
+ 0.28571,-0.534951,0.795108,0.597054,0.03743,-0.274594,
+ 0.325986,-0.296157,0.897788,0.602715,0.067041,-0.266375,
+ 0.609651,-0.5022,0.613287,0.677491,0.037477,-0.323141,
+ 0.325986,-0.296157,0.897788,0.602715,0.067041,-0.266375,
+ 0.662382,-0.336592,0.669295,0.68609,0.066012,-0.316437,
+ 0.28571,-0.534951,0.795108,0.597054,0.03743,-0.274594,
+ -0.025551,-0.524875,0.850796,0.500666,0.037435,-0.258297,
+ -0.003719,-0.252904,0.967484,0.502666,0.068274,-0.249687,
+ -0.003719,-0.252904,0.967484,0.502666,0.068274,-0.249687,
+ 0.325986,-0.296157,0.897788,0.602715,0.067041,-0.266375,
+ 0.28571,-0.534951,0.795108,0.597054,0.03743,-0.274594,
+ -0.009985,-0.330184,0.943864,0.506665,0.108686,-0.239844,
+ 0.309535,-0.382382,0.870616,0.610539,0.105601,-0.257187,
+ 0.325986,-0.296157,0.897788,0.602715,0.067041,-0.266375,
+ -0.009985,-0.330184,0.943864,0.506665,0.108686,-0.239844,
+ 0.325986,-0.296157,0.897788,0.602715,0.067041,-0.266375,
+ -0.003719,-0.252904,0.967484,0.502666,0.068274,-0.249687,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.170214,-0.866923,0.468477,0.5875,0.016681,-0.294,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.170214,-0.866923,0.468477,0.5875,0.016681,-0.294,
+ 0.392801,-0.830761,0.394389,0.660875,0.017896,-0.339125,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ -0.000173,-0.840077,0.542467,0.5,0.015465,-0.2785,
+ 0.170214,-0.866923,0.468477,0.5875,0.016681,-0.294,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ 0.170214,-0.866923,0.468477,0.5875,0.016681,-0.294,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ -0.025551,-0.524875,0.850796,0.500666,0.037435,-0.258297,
+ 0.28571,-0.534951,0.795108,0.597054,0.03743,-0.274594,
+ 0.170214,-0.866923,0.468477,0.5875,0.016681,-0.294,
+ -0.025551,-0.524875,0.850796,0.500666,0.037435,-0.258297,
+ 0.170214,-0.866923,0.468477,0.5875,0.016681,-0.294,
+ -0.000173,-0.840077,0.542467,0.5,0.015465,-0.2785,
+ 0.28571,-0.534951,0.795108,0.597054,0.03743,-0.274594,
+ 0.609651,-0.5022,0.613287,0.677491,0.037477,-0.323141,
+ 0.392801,-0.830761,0.394389,0.660875,0.017896,-0.339125,
+ 0.392801,-0.830761,0.394389,0.660875,0.017896,-0.339125,
+ 0.170214,-0.866923,0.468477,0.5875,0.016681,-0.294,
+ 0.28571,-0.534951,0.795108,0.597054,0.03743,-0.274594,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.412793,-0.812756,0.411133,0.339125,0.017896,-0.339125,
+ -0.173348,-0.862844,0.474817,0.4125,0.016681,-0.294,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.173348,-0.862844,0.474817,0.4125,0.016681,-0.294,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ -0.412793,-0.812756,0.411133,0.339125,0.017896,-0.339125,
+ -0.643521,-0.419436,0.640277,0.323842,0.038608,-0.323141,
+ -0.321508,-0.547444,0.772617,0.404279,0.038047,-0.274594,
+ -0.321508,-0.547444,0.772617,0.404279,0.038047,-0.274594,
+ -0.173348,-0.862844,0.474817,0.4125,0.016681,-0.294,
+ -0.412793,-0.812756,0.411133,0.339125,0.017896,-0.339125,
+ -0.025551,-0.524875,0.850796,0.500666,0.037435,-0.258297,
+ -0.000173,-0.840077,0.542467,0.5,0.015465,-0.2785,
+ -0.173348,-0.862844,0.474817,0.4125,0.016681,-0.294,
+ -0.025551,-0.524875,0.850796,0.500666,0.037435,-0.258297,
+ -0.173348,-0.862844,0.474817,0.4125,0.016681,-0.294,
+ -0.321508,-0.547444,0.772617,0.404279,0.038047,-0.274594,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ -0.173348,-0.862844,0.474817,0.4125,0.016681,-0.294,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ -0.173348,-0.862844,0.474817,0.4125,0.016681,-0.294,
+ -0.000173,-0.840077,0.542467,0.5,0.015465,-0.2785,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.199329,-0.959446,-0.199329,0.638667,0.007537,-0.638667,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.100277,-0.976969,-0.18835,0.5825,0.003052,-0.664625,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.18835,-0.976969,-0.100277,0.664625,0.003052,-0.5825,
+ 0.079739,-0.993621,-0.079739,0.5905,-0.005194,-0.5905,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.199329,-0.959446,-0.199329,0.361333,0.007537,-0.638667,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.188349,-0.976969,-0.100277,0.335375,0.003052,-0.5825,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ 0,-0.969635,-0.244558,0.5,0.000839,-0.677562,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.100277,-0.976969,-0.18835,0.4175,0.003052,-0.664625,
+ -0.079739,-0.993621,-0.079739,0.4095,-0.005194,-0.5905,
+ 0,-0.996384,-0.08496,0.5,-0.007972,-0.59775,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.199328,-0.959446,0.199328,0.361333,0.007537,-0.361333,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.100277,-0.976969,0.188349,0.4175,0.003052,-0.335375,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ -0.244558,-0.969635,0,0.322437,0.000839,-0.5,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.188349,-0.976969,0.100277,0.335375,0.003052,-0.4175,
+ -0.079739,-0.993621,0.079739,0.4095,-0.005194,-0.4095,
+ -0.08496,-0.996384,0,0.40225,-0.007972,-0.5,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.199329,-0.959446,0.199329,0.638667,0.007537,-0.361333,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0.244558,-0.969635,0,0.677562,0.000839,-0.5,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.18835,-0.976969,0.100277,0.664625,0.003052,-0.4175,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0,-1,0,0.5,-0.010924,-0.5,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0.08496,-0.996384,0,0.59775,-0.007972,-0.5,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+ 0,-0.969635,0.244558,0.5,0.000839,-0.322437,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.100277,-0.976969,0.188349,0.5825,0.003052,-0.335375,
+ 0.079739,-0.993621,0.079739,0.5905,-0.005194,-0.4095,
+ 0,-0.996384,0.08496,0.5,-0.007972,-0.40225,
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1728,data,NULL};
+const struct gllist *s1_2=&frame;
diff --git a/hacks/glx/s1_3.c b/hacks/glx/s1_3.c
new file mode 100644
index 0000000..eea1304
--- /dev/null
+++ b/hacks/glx/s1_3.c
@@ -0,0 +1,1733 @@
+#include "gllist.h"
+static const float data[]={
+ 0.202525,-0.691948,-0.692959,1.163707,0.362839,-0.676509,
+ 0.133481,-0.728232,-0.672207,1.115671,0.352342,-0.673147,
+ 0.164983,-0.93415,-0.316457,1.139957,0.313586,-0.594444,
+ 0.164983,-0.93415,-0.316457,1.139957,0.313586,-0.594444,
+ 0.257435,-0.906571,-0.334448,1.188046,0.322006,-0.596277,
+ 0.202525,-0.691948,-0.692959,1.163707,0.362839,-0.676509,
+ 0.166954,-0.985965,0,1.148052,0.300668,-0.5,
+ 0.301979,-0.953315,0,1.196159,0.308395,-0.5,
+ 0.257435,-0.906571,-0.334448,1.188046,0.322006,-0.596277,
+ 0.166954,-0.985965,0,1.148052,0.300668,-0.5,
+ 0.257435,-0.906571,-0.334448,1.188046,0.322006,-0.596277,
+ 0.164983,-0.93415,-0.316457,1.139957,0.313586,-0.594444,
+ 0.301979,-0.953315,0,1.196159,0.308395,-0.5,
+ 0.780431,-0.625241,0,1.227578,0.320768,-0.5,
+ 0.622801,-0.721415,-0.302786,1.219224,0.33452,-0.595444,
+ 0.622801,-0.721415,-0.302786,1.219224,0.33452,-0.595444,
+ 0.257435,-0.906571,-0.334448,1.188046,0.322006,-0.596277,
+ 0.301979,-0.953315,0,1.196159,0.308395,-0.5,
+ 0.631576,-0.472875,-0.614411,1.194861,0.37578,-0.675096,
+ 0.202525,-0.691948,-0.692959,1.163707,0.362839,-0.676509,
+ 0.257435,-0.906571,-0.334448,1.188046,0.322006,-0.596277,
+ 0.631576,-0.472875,-0.614411,1.194861,0.37578,-0.675096,
+ 0.257435,-0.906571,-0.334448,1.188046,0.322006,-0.596277,
+ 0.622801,-0.721415,-0.302786,1.219224,0.33452,-0.595444,
+ 0.164983,-0.93415,0.316457,1.139957,0.313586,-0.405556,
+ 0.133481,-0.728232,0.672206,1.115671,0.352342,-0.326853,
+ 0.202524,-0.691948,0.692959,1.163707,0.362839,-0.323491,
+ 0.202524,-0.691948,0.692959,1.163707,0.362839,-0.323491,
+ 0.257435,-0.906571,0.334448,1.188046,0.322006,-0.403722,
+ 0.164983,-0.93415,0.316457,1.139957,0.313586,-0.405556,
+ 0.631575,-0.472875,0.614412,1.194861,0.37578,-0.324904,
+ 0.622801,-0.721415,0.302786,1.219224,0.33452,-0.404556,
+ 0.257435,-0.906571,0.334448,1.188046,0.322006,-0.403722,
+ 0.631575,-0.472875,0.614412,1.194861,0.37578,-0.324904,
+ 0.257435,-0.906571,0.334448,1.188046,0.322006,-0.403722,
+ 0.202524,-0.691948,0.692959,1.163707,0.362839,-0.323491,
+ 0.622801,-0.721415,0.302786,1.219224,0.33452,-0.404556,
+ 0.780431,-0.625241,0,1.227578,0.320768,-0.5,
+ 0.301979,-0.953315,0,1.196159,0.308395,-0.5,
+ 0.301979,-0.953315,0,1.196159,0.308395,-0.5,
+ 0.257435,-0.906571,0.334448,1.188046,0.322006,-0.403722,
+ 0.622801,-0.721415,0.302786,1.219224,0.33452,-0.404556,
+ 0.166954,-0.985965,0,1.148052,0.300668,-0.5,
+ 0.164983,-0.93415,0.316457,1.139957,0.313586,-0.405556,
+ 0.257435,-0.906571,0.334448,1.188046,0.322006,-0.403722,
+ 0.166954,-0.985965,0,1.148052,0.300668,-0.5,
+ 0.257435,-0.906571,0.334448,1.188046,0.322006,-0.403722,
+ 0.301979,-0.953315,0,1.196159,0.308395,-0.5,
+ 0.930569,0.3071,0.199327,1.204957,0.421449,-0.361333,
+ 0.940255,0.325371,0.100277,1.221821,0.401211,-0.4175,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.930569,0.3071,0.199327,1.204957,0.421449,-0.361333,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.890812,0.056731,0.450816,1.207091,0.397037,-0.339125,
+ 0.962007,0.273026,0,1.230206,0.391113,-0.5,
+ 0.992798,-0.119797,0,1.239508,0.345749,-0.5,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.962007,0.273026,0,1.230206,0.391113,-0.5,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.940255,0.325371,0.100277,1.221821,0.401211,-0.4175,
+ 0.780431,-0.625241,0,1.227578,0.320768,-0.5,
+ 0.622801,-0.721415,0.302786,1.219224,0.33452,-0.404556,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.780431,-0.625241,0,1.227578,0.320768,-0.5,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.992798,-0.119797,0,1.239508,0.345749,-0.5,
+ 0.631575,-0.472875,0.614412,1.194861,0.37578,-0.324904,
+ 0.890812,0.056731,0.450816,1.207091,0.397037,-0.339125,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.631575,-0.472875,0.614412,1.194861,0.37578,-0.324904,
+ 0.974899,-0.059226,0.214627,1.230706,0.358565,-0.4125,
+ 0.622801,-0.721415,0.302786,1.219224,0.33452,-0.404556,
+ 0.930569,0.3071,-0.199328,1.204957,0.421449,-0.638667,
+ 0.890812,0.056731,-0.450816,1.207091,0.397037,-0.660875,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.930569,0.3071,-0.199328,1.204957,0.421449,-0.638667,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.940255,0.325371,-0.100277,1.221821,0.401211,-0.5825,
+ 0.631576,-0.472875,-0.614411,1.194861,0.37578,-0.675096,
+ 0.622801,-0.721415,-0.302786,1.219224,0.33452,-0.595444,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.631576,-0.472875,-0.614411,1.194861,0.37578,-0.675096,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.890812,0.056731,-0.450816,1.207091,0.397037,-0.660875,
+ 0.780431,-0.625241,0,1.227578,0.320768,-0.5,
+ 0.992798,-0.119797,0,1.239508,0.345749,-0.5,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.780431,-0.625241,0,1.227578,0.320768,-0.5,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.622801,-0.721415,-0.302786,1.219224,0.33452,-0.595444,
+ 0.962007,0.273026,0,1.230206,0.391113,-0.5,
+ 0.940255,0.325371,-0.100277,1.221821,0.401211,-0.5825,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.962007,0.273026,0,1.230206,0.391113,-0.5,
+ 0.974899,-0.059226,-0.214627,1.230706,0.358565,-0.5875,
+ 0.992798,-0.119797,0,1.239508,0.345749,-0.5,
+ 0.133481,-0.728232,0.672206,1.115671,0.352342,-0.326853,
+ 0.060251,-0.377234,0.924156,1.075195,0.416935,-0.279631,
+ 0.095842,-0.348455,0.932413,1.123141,0.430895,-0.275352,
+ 0.133481,-0.728232,0.672206,1.115671,0.352342,-0.326853,
+ 0.095842,-0.348455,0.932413,1.123141,0.430895,-0.275352,
+ 0.202524,-0.691948,0.692959,1.163707,0.362839,-0.323491,
+ 0.060251,-0.377234,0.924156,1.075195,0.416935,-0.279631,
+ -0.042028,-0.027931,0.998726,1.026623,0.494446,-0.263891,
+ -0.024646,-0.015417,0.999577,1.074463,0.512562,-0.259306,
+ -0.024646,-0.015417,0.999577,1.074463,0.512562,-0.259306,
+ 0.095842,-0.348455,0.932413,1.123141,0.430895,-0.275352,
+ 0.060251,-0.377234,0.924156,1.075195,0.416935,-0.279631,
+ 0.346195,0.171304,0.92239,1.107591,0.526937,-0.260702,
+ 0.484632,-0.165545,0.858911,1.155185,0.444556,-0.276838,
+ 0.095842,-0.348455,0.932413,1.123141,0.430895,-0.275352,
+ 0.346195,0.171304,0.92239,1.107591,0.526937,-0.260702,
+ 0.095842,-0.348455,0.932413,1.123141,0.430895,-0.275352,
+ -0.024646,-0.015417,0.999577,1.074463,0.512562,-0.259306,
+ 0.484632,-0.165545,0.858911,1.155185,0.444556,-0.276838,
+ 0.631575,-0.472875,0.614412,1.194861,0.37578,-0.324904,
+ 0.202524,-0.691948,0.692959,1.163707,0.362839,-0.323491,
+ 0.202524,-0.691948,0.692959,1.163707,0.362839,-0.323491,
+ 0.095842,-0.348455,0.932413,1.123141,0.430895,-0.275352,
+ 0.484632,-0.165545,0.858911,1.155185,0.444556,-0.276838,
+ -0.176226,0.307645,0.935039,0.978052,0.571957,-0.279631,
+ -0.334947,0.636181,0.695043,0.937575,0.63655,-0.326853,
+ -0.323336,0.633934,0.702554,0.985218,0.662285,-0.323491,
+ -0.323336,0.633934,0.702554,0.985218,0.662285,-0.323491,
+ -0.162184,0.309455,0.936981,1.025784,0.594229,-0.275352,
+ -0.176226,0.307645,0.935039,0.978052,0.571957,-0.279631,
+ -0.011301,0.717458,0.69651,1.01927,0.677486,-0.324904,
+ 0.171113,0.465842,0.868165,1.059471,0.609015,-0.276838,
+ -0.162184,0.309455,0.936981,1.025784,0.594229,-0.275352,
+ -0.011301,0.717458,0.69651,1.01927,0.677486,-0.324904,
+ -0.162184,0.309455,0.936981,1.025784,0.594229,-0.275352,
+ -0.323336,0.633934,0.702554,0.985218,0.662285,-0.323491,
+ 0.171113,0.465842,0.868165,1.059471,0.609015,-0.276838,
+ 0.346195,0.171304,0.92239,1.107591,0.526937,-0.260702,
+ -0.024646,-0.015417,0.999577,1.074463,0.512562,-0.259306,
+ -0.024646,-0.015417,0.999577,1.074463,0.512562,-0.259306,
+ -0.162184,0.309455,0.936981,1.025784,0.594229,-0.275352,
+ 0.171113,0.465842,0.868165,1.059471,0.609015,-0.276838,
+ -0.042028,-0.027931,0.998726,1.026623,0.494446,-0.263891,
+ -0.176226,0.307645,0.935039,0.978052,0.571957,-0.279631,
+ -0.162184,0.309455,0.936981,1.025784,0.594229,-0.275352,
+ -0.042028,-0.027931,0.998726,1.026623,0.494446,-0.263891,
+ -0.162184,0.309455,0.936981,1.025784,0.594229,-0.275352,
+ -0.024646,-0.015417,0.999577,1.074463,0.512562,-0.259306,
+ 0.499427,0.759449,0.416905,1.046216,0.67568,-0.339125,
+ 0.73381,0.655202,0.179534,1.066291,0.661627,-0.361333,
+ 0.786313,0.584772,0.199385,1.098258,0.615227,-0.335375,
+ 0.786313,0.584772,0.199385,1.098258,0.615227,-0.335375,
+ 0.621316,0.565314,0.542574,1.083956,0.612743,-0.294,
+ 0.499427,0.759449,0.416905,1.046216,0.67568,-0.339125,
+ 0.83547,0.498022,0.232303,1.141425,0.544887,-0.322437,
+ 0.742505,0.410638,0.529209,1.128758,0.537574,-0.2785,
+ 0.621316,0.565314,0.542574,1.083956,0.612743,-0.294,
+ 0.83547,0.498022,0.232303,1.141425,0.544887,-0.322437,
+ 0.621316,0.565314,0.542574,1.083956,0.612743,-0.294,
+ 0.786313,0.584772,0.199385,1.098258,0.615227,-0.335375,
+ 0.346195,0.171304,0.92239,1.107591,0.526937,-0.260702,
+ 0.171113,0.465842,0.868165,1.059471,0.609015,-0.276838,
+ 0.621316,0.565314,0.542574,1.083956,0.612743,-0.294,
+ 0.346195,0.171304,0.92239,1.107591,0.526937,-0.260702,
+ 0.621316,0.565314,0.542574,1.083956,0.612743,-0.294,
+ 0.742505,0.410638,0.529209,1.128758,0.537574,-0.2785,
+ 0.171113,0.465842,0.868165,1.059471,0.609015,-0.276838,
+ -0.011301,0.717458,0.69651,1.01927,0.677486,-0.324904,
+ 0.499427,0.759449,0.416905,1.046216,0.67568,-0.339125,
+ 0.499427,0.759449,0.416905,1.046216,0.67568,-0.339125,
+ 0.621316,0.565314,0.542574,1.083956,0.612743,-0.294,
+ 0.171113,0.465842,0.868165,1.059471,0.609015,-0.276838,
+ 0.930569,0.3071,0.199327,1.204957,0.421449,-0.361333,
+ 0.890812,0.056731,0.450816,1.207091,0.397037,-0.339125,
+ 0.808962,0.235076,0.538813,1.171456,0.461189,-0.294,
+ 0.930569,0.3071,0.199327,1.204957,0.421449,-0.361333,
+ 0.808962,0.235076,0.538813,1.171456,0.461189,-0.294,
+ 0.890268,0.404155,0.209958,1.180758,0.472333,-0.335375,
+ 0.890812,0.056731,0.450816,1.207091,0.397037,-0.339125,
+ 0.631575,-0.472875,0.614412,1.194861,0.37578,-0.324904,
+ 0.484632,-0.165545,0.858911,1.155185,0.444556,-0.276838,
+ 0.484632,-0.165545,0.858911,1.155185,0.444556,-0.276838,
+ 0.808962,0.235076,0.538813,1.171456,0.461189,-0.294,
+ 0.890812,0.056731,0.450816,1.207091,0.397037,-0.339125,
+ 0.346195,0.171304,0.92239,1.107591,0.526937,-0.260702,
+ 0.742505,0.410638,0.529209,1.128758,0.537574,-0.2785,
+ 0.808962,0.235076,0.538813,1.171456,0.461189,-0.294,
+ 0.346195,0.171304,0.92239,1.107591,0.526937,-0.260702,
+ 0.808962,0.235076,0.538813,1.171456,0.461189,-0.294,
+ 0.484632,-0.165545,0.858911,1.155185,0.444556,-0.276838,
+ 0.742505,0.410638,0.529209,1.128758,0.537574,-0.2785,
+ 0.83547,0.498022,0.232303,1.141425,0.544887,-0.322437,
+ 0.890268,0.404155,0.209958,1.180758,0.472333,-0.335375,
+ 0.890268,0.404155,0.209958,1.180758,0.472333,-0.335375,
+ 0.808962,0.235076,0.538813,1.171456,0.461189,-0.294,
+ 0.742505,0.410638,0.529209,1.128758,0.537574,-0.2785,
+ -0.334947,0.636181,0.695043,0.937575,0.63655,-0.326853,
+ -0.440797,0.833329,0.333557,0.913289,0.675305,-0.405556,
+ -0.436203,0.832732,0.341005,0.960879,0.703118,-0.403722,
+ -0.334947,0.636181,0.695043,0.937575,0.63655,-0.326853,
+ -0.436203,0.832732,0.341005,0.960879,0.703118,-0.403722,
+ -0.323336,0.633934,0.702554,0.985218,0.662285,-0.323491,
+ -0.440797,0.833329,0.333557,0.913289,0.675305,-0.405556,
+ -0.456348,0.889801,0,0.905194,0.688224,-0.5,
+ -0.483417,0.87539,0,0.952766,0.71673,-0.5,
+ -0.483417,0.87539,0,0.952766,0.71673,-0.5,
+ -0.436203,0.832732,0.341005,0.960879,0.703118,-0.403722,
+ -0.440797,0.833329,0.333557,0.913289,0.675305,-0.405556,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ -0.079433,0.924124,0.373745,0.995432,0.719051,-0.404556,
+ -0.436203,0.832732,0.341005,0.960879,0.703118,-0.403722,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ -0.436203,0.832732,0.341005,0.960879,0.703118,-0.403722,
+ -0.483417,0.87539,0,0.952766,0.71673,-0.5,
+ -0.079433,0.924124,0.373745,0.995432,0.719051,-0.404556,
+ -0.011301,0.717458,0.69651,1.01927,0.677486,-0.324904,
+ -0.323336,0.633934,0.702554,0.985218,0.662285,-0.323491,
+ -0.323336,0.633934,0.702554,0.985218,0.662285,-0.323491,
+ -0.436203,0.832732,0.341005,0.960879,0.703118,-0.403722,
+ -0.079433,0.924124,0.373745,0.995432,0.719051,-0.404556,
+ -0.334948,0.636181,-0.695043,0.937575,0.63655,-0.673147,
+ -0.323336,0.633934,-0.702554,0.985218,0.662285,-0.676509,
+ -0.436203,0.832732,-0.341005,0.960879,0.703118,-0.596277,
+ -0.334948,0.636181,-0.695043,0.937575,0.63655,-0.673147,
+ -0.436203,0.832732,-0.341005,0.960879,0.703118,-0.596277,
+ -0.440797,0.833329,-0.333557,0.913289,0.675305,-0.594444,
+ -0.323336,0.633934,-0.702554,0.985218,0.662285,-0.676509,
+ -0.0113,0.717458,-0.69651,1.01927,0.677486,-0.675096,
+ -0.079433,0.924124,-0.373745,0.995432,0.719051,-0.595444,
+ -0.079433,0.924124,-0.373745,0.995432,0.719051,-0.595444,
+ -0.436203,0.832732,-0.341005,0.960879,0.703118,-0.596277,
+ -0.323336,0.633934,-0.702554,0.985218,0.662285,-0.676509,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ -0.483417,0.87539,0,0.952766,0.71673,-0.5,
+ -0.436203,0.832732,-0.341005,0.960879,0.703118,-0.596277,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ -0.436203,0.832732,-0.341005,0.960879,0.703118,-0.596277,
+ -0.079433,0.924124,-0.373745,0.995432,0.719051,-0.595444,
+ -0.483417,0.87539,0,0.952766,0.71673,-0.5,
+ -0.456348,0.889801,0,0.905194,0.688224,-0.5,
+ -0.440797,0.833329,-0.333557,0.913289,0.675305,-0.594444,
+ -0.440797,0.833329,-0.333557,0.913289,0.675305,-0.594444,
+ -0.436203,0.832732,-0.341005,0.960879,0.703118,-0.596277,
+ -0.483417,0.87539,0,0.952766,0.71673,-0.5,
+ 0.73381,0.655202,-0.179535,1.066291,0.661627,-0.638667,
+ 0.737725,0.668365,-0.095126,1.057196,0.68635,-0.5825,
+ 0.442446,0.874241,-0.199863,1.024706,0.715367,-0.5875,
+ 0.73381,0.655202,-0.179535,1.066291,0.661627,-0.638667,
+ 0.442446,0.874241,-0.199863,1.024706,0.715367,-0.5875,
+ 0.499427,0.759449,-0.416905,1.046216,0.67568,-0.660875,
+ 0.737725,0.668365,-0.095126,1.057196,0.68635,-0.5825,
+ 0.739038,0.673664,0,1.052644,0.698661,-0.5,
+ 0.507297,0.861771,0,1.018008,0.729398,-0.5,
+ 0.507297,0.861771,0,1.018008,0.729398,-0.5,
+ 0.442446,0.874241,-0.199863,1.024706,0.715367,-0.5875,
+ 0.737725,0.668365,-0.095126,1.057196,0.68635,-0.5825,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ -0.079433,0.924124,-0.373745,0.995432,0.719051,-0.595444,
+ 0.442446,0.874241,-0.199863,1.024706,0.715367,-0.5875,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ 0.442446,0.874241,-0.199863,1.024706,0.715367,-0.5875,
+ 0.507297,0.861771,0,1.018008,0.729398,-0.5,
+ -0.079433,0.924124,-0.373745,0.995432,0.719051,-0.595444,
+ -0.0113,0.717458,-0.69651,1.01927,0.677486,-0.675096,
+ 0.499427,0.759449,-0.416905,1.046216,0.67568,-0.660875,
+ 0.499427,0.759449,-0.416905,1.046216,0.67568,-0.660875,
+ 0.442446,0.874241,-0.199863,1.024706,0.715367,-0.5875,
+ -0.079433,0.924124,-0.373745,0.995432,0.719051,-0.595444,
+ 0.73381,0.655202,0.179534,1.066291,0.661627,-0.361333,
+ 0.499427,0.759449,0.416905,1.046216,0.67568,-0.339125,
+ 0.442446,0.874241,0.199863,1.024706,0.715367,-0.4125,
+ 0.73381,0.655202,0.179534,1.066291,0.661627,-0.361333,
+ 0.442446,0.874241,0.199863,1.024706,0.715367,-0.4125,
+ 0.737725,0.668365,0.095126,1.057196,0.68635,-0.4175,
+ 0.499427,0.759449,0.416905,1.046216,0.67568,-0.339125,
+ -0.011301,0.717458,0.69651,1.01927,0.677486,-0.324904,
+ -0.079433,0.924124,0.373745,0.995432,0.719051,-0.404556,
+ -0.079433,0.924124,0.373745,0.995432,0.719051,-0.404556,
+ 0.442446,0.874241,0.199863,1.024706,0.715367,-0.4125,
+ 0.499427,0.759449,0.416905,1.046216,0.67568,-0.339125,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ 0.507297,0.861771,0,1.018008,0.729398,-0.5,
+ 0.442446,0.874241,0.199863,1.024706,0.715367,-0.4125,
+ -0.145364,0.989378,0,0.987605,0.733106,-0.5,
+ 0.442446,0.874241,0.199863,1.024706,0.715367,-0.4125,
+ -0.079433,0.924124,0.373745,0.995432,0.719051,-0.404556,
+ 0.507297,0.861771,0,1.018008,0.729398,-0.5,
+ 0.739038,0.673664,0,1.052644,0.698661,-0.5,
+ 0.737725,0.668365,0.095126,1.057196,0.68635,-0.4175,
+ 0.737725,0.668365,0.095126,1.057196,0.68635,-0.4175,
+ 0.442446,0.874241,0.199863,1.024706,0.715367,-0.4125,
+ 0.507297,0.861771,0,1.018008,0.729398,-0.5,
+ -0.323336,0.633934,-0.702554,0.985218,0.662285,-0.676509,
+ -0.334948,0.636181,-0.695043,0.937575,0.63655,-0.673147,
+ -0.176226,0.307645,-0.935039,0.978052,0.571957,-0.720369,
+ -0.176226,0.307645,-0.935039,0.978052,0.571957,-0.720369,
+ -0.162184,0.309456,-0.936981,1.025784,0.594229,-0.724648,
+ -0.323336,0.633934,-0.702554,0.985218,0.662285,-0.676509,
+ -0.042028,-0.027931,-0.998726,1.026623,0.494446,-0.736109,
+ -0.024646,-0.015417,-0.999577,1.074463,0.512562,-0.740694,
+ -0.162184,0.309456,-0.936981,1.025784,0.594229,-0.724648,
+ -0.042028,-0.027931,-0.998726,1.026623,0.494446,-0.736109,
+ -0.162184,0.309456,-0.936981,1.025784,0.594229,-0.724648,
+ -0.176226,0.307645,-0.935039,0.978052,0.571957,-0.720369,
+ -0.024646,-0.015417,-0.999577,1.074463,0.512562,-0.740694,
+ 0.346195,0.171304,-0.92239,1.107591,0.526937,-0.739298,
+ 0.171114,0.465842,-0.868165,1.059471,0.609015,-0.723162,
+ 0.171114,0.465842,-0.868165,1.059471,0.609015,-0.723162,
+ -0.162184,0.309456,-0.936981,1.025784,0.594229,-0.724648,
+ -0.024646,-0.015417,-0.999577,1.074463,0.512562,-0.740694,
+ -0.0113,0.717458,-0.69651,1.01927,0.677486,-0.675096,
+ -0.323336,0.633934,-0.702554,0.985218,0.662285,-0.676509,
+ -0.162184,0.309456,-0.936981,1.025784,0.594229,-0.724648,
+ -0.0113,0.717458,-0.69651,1.01927,0.677486,-0.675096,
+ -0.162184,0.309456,-0.936981,1.025784,0.594229,-0.724648,
+ 0.171114,0.465842,-0.868165,1.059471,0.609015,-0.723162,
+ 0.133481,-0.728232,-0.672207,1.115671,0.352342,-0.673147,
+ 0.202525,-0.691948,-0.692959,1.163707,0.362839,-0.676509,
+ 0.095842,-0.348454,-0.932413,1.123141,0.430895,-0.724648,
+ 0.133481,-0.728232,-0.672207,1.115671,0.352342,-0.673147,
+ 0.095842,-0.348454,-0.932413,1.123141,0.430895,-0.724648,
+ 0.060251,-0.377234,-0.924156,1.075195,0.416935,-0.720369,
+ 0.202525,-0.691948,-0.692959,1.163707,0.362839,-0.676509,
+ 0.631576,-0.472875,-0.614411,1.194861,0.37578,-0.675096,
+ 0.484632,-0.165544,-0.85891,1.155185,0.444556,-0.723162,
+ 0.484632,-0.165544,-0.85891,1.155185,0.444556,-0.723162,
+ 0.095842,-0.348454,-0.932413,1.123141,0.430895,-0.724648,
+ 0.202525,-0.691948,-0.692959,1.163707,0.362839,-0.676509,
+ 0.346195,0.171304,-0.92239,1.107591,0.526937,-0.739298,
+ -0.024646,-0.015417,-0.999577,1.074463,0.512562,-0.740694,
+ 0.095842,-0.348454,-0.932413,1.123141,0.430895,-0.724648,
+ 0.346195,0.171304,-0.92239,1.107591,0.526937,-0.739298,
+ 0.095842,-0.348454,-0.932413,1.123141,0.430895,-0.724648,
+ 0.484632,-0.165544,-0.85891,1.155185,0.444556,-0.723162,
+ -0.024646,-0.015417,-0.999577,1.074463,0.512562,-0.740694,
+ -0.042028,-0.027931,-0.998726,1.026623,0.494446,-0.736109,
+ 0.060251,-0.377234,-0.924156,1.075195,0.416935,-0.720369,
+ 0.060251,-0.377234,-0.924156,1.075195,0.416935,-0.720369,
+ 0.095842,-0.348454,-0.932413,1.123141,0.430895,-0.724648,
+ -0.024646,-0.015417,-0.999577,1.074463,0.512562,-0.740694,
+ 0.930569,0.3071,-0.199328,1.204957,0.421449,-0.638667,
+ 0.890268,0.404155,-0.209958,1.180758,0.472333,-0.664625,
+ 0.808963,0.235076,-0.538812,1.171456,0.461189,-0.706,
+ 0.930569,0.3071,-0.199328,1.204957,0.421449,-0.638667,
+ 0.808963,0.235076,-0.538812,1.171456,0.461189,-0.706,
+ 0.890812,0.056731,-0.450816,1.207091,0.397037,-0.660875,
+ 0.890268,0.404155,-0.209958,1.180758,0.472333,-0.664625,
+ 0.83547,0.498022,-0.232303,1.141425,0.544887,-0.677562,
+ 0.742506,0.410638,-0.529208,1.128758,0.537574,-0.7215,
+ 0.742506,0.410638,-0.529208,1.128758,0.537574,-0.7215,
+ 0.808963,0.235076,-0.538812,1.171456,0.461189,-0.706,
+ 0.890268,0.404155,-0.209958,1.180758,0.472333,-0.664625,
+ 0.346195,0.171304,-0.92239,1.107591,0.526937,-0.739298,
+ 0.484632,-0.165544,-0.85891,1.155185,0.444556,-0.723162,
+ 0.808963,0.235076,-0.538812,1.171456,0.461189,-0.706,
+ 0.346195,0.171304,-0.92239,1.107591,0.526937,-0.739298,
+ 0.808963,0.235076,-0.538812,1.171456,0.461189,-0.706,
+ 0.742506,0.410638,-0.529208,1.128758,0.537574,-0.7215,
+ 0.484632,-0.165544,-0.85891,1.155185,0.444556,-0.723162,
+ 0.631576,-0.472875,-0.614411,1.194861,0.37578,-0.675096,
+ 0.890812,0.056731,-0.450816,1.207091,0.397037,-0.660875,
+ 0.890812,0.056731,-0.450816,1.207091,0.397037,-0.660875,
+ 0.808963,0.235076,-0.538812,1.171456,0.461189,-0.706,
+ 0.484632,-0.165544,-0.85891,1.155185,0.444556,-0.723162,
+ 0.786313,0.584772,-0.199385,1.098258,0.615227,-0.664625,
+ 0.73381,0.655202,-0.179535,1.066291,0.661627,-0.638667,
+ 0.499427,0.759449,-0.416905,1.046216,0.67568,-0.660875,
+ 0.499427,0.759449,-0.416905,1.046216,0.67568,-0.660875,
+ 0.621316,0.565314,-0.542574,1.083956,0.612743,-0.706,
+ 0.786313,0.584772,-0.199385,1.098258,0.615227,-0.664625,
+ 0.499427,0.759449,-0.416905,1.046216,0.67568,-0.660875,
+ -0.0113,0.717458,-0.69651,1.01927,0.677486,-0.675096,
+ 0.171114,0.465842,-0.868165,1.059471,0.609015,-0.723162,
+ 0.171114,0.465842,-0.868165,1.059471,0.609015,-0.723162,
+ 0.621316,0.565314,-0.542574,1.083956,0.612743,-0.706,
+ 0.499427,0.759449,-0.416905,1.046216,0.67568,-0.660875,
+ 0.346195,0.171304,-0.92239,1.107591,0.526937,-0.739298,
+ 0.742506,0.410638,-0.529208,1.128758,0.537574,-0.7215,
+ 0.621316,0.565314,-0.542574,1.083956,0.612743,-0.706,
+ 0.346195,0.171304,-0.92239,1.107591,0.526937,-0.739298,
+ 0.621316,0.565314,-0.542574,1.083956,0.612743,-0.706,
+ 0.171114,0.465842,-0.868165,1.059471,0.609015,-0.723162,
+ 0.83547,0.498022,-0.232303,1.141425,0.544887,-0.677562,
+ 0.786313,0.584772,-0.199385,1.098258,0.615227,-0.664625,
+ 0.621316,0.565314,-0.542574,1.083956,0.612743,-0.706,
+ 0.83547,0.498022,-0.232303,1.141425,0.544887,-0.677562,
+ 0.621316,0.565314,-0.542574,1.083956,0.612743,-0.706,
+ 0.742506,0.410638,-0.529208,1.128758,0.537574,-0.7215,
+ 0.930569,0.3071,0.199327,1.204957,0.421449,-0.361333,
+ 0.890268,0.404155,0.209958,1.180758,0.472333,-0.335375,
+ 0.900371,0.427755,0.079739,1.1919,0.469528,-0.4095,
+ 0.930569,0.3071,0.199327,1.204957,0.421449,-0.361333,
+ 0.900371,0.427755,0.079739,1.1919,0.469528,-0.4095,
+ 0.940255,0.325371,0.100277,1.221821,0.401211,-0.4175,
+ 0.890268,0.404155,0.209958,1.180758,0.472333,-0.335375,
+ 0.83547,0.498022,0.232303,1.141425,0.544887,-0.322437,
+ 0.862894,0.498192,0.08496,1.149055,0.549292,-0.40225,
+ 0.862894,0.498192,0.08496,1.149055,0.549292,-0.40225,
+ 0.900371,0.427755,0.079739,1.1919,0.469528,-0.4095,
+ 0.890268,0.404155,0.209958,1.180758,0.472333,-0.335375,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.905374,0.424615,0,1.19793,0.464638,-0.5,
+ 0.900371,0.427755,0.079739,1.1919,0.469528,-0.4095,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.900371,0.427755,0.079739,1.1919,0.469528,-0.4095,
+ 0.862894,0.498192,0.08496,1.149055,0.549292,-0.40225,
+ 0.905374,0.424615,0,1.19793,0.464638,-0.5,
+ 0.962007,0.273026,0,1.230206,0.391113,-0.5,
+ 0.940255,0.325371,0.100277,1.221821,0.401211,-0.4175,
+ 0.940255,0.325371,0.100277,1.221821,0.401211,-0.4175,
+ 0.900371,0.427755,0.079739,1.1919,0.469528,-0.4095,
+ 0.905374,0.424615,0,1.19793,0.464638,-0.5,
+ 0.73381,0.655202,0.179534,1.066291,0.661627,-0.361333,
+ 0.737725,0.668365,0.095126,1.057196,0.68635,-0.4175,
+ 0.820632,0.565867,0.079739,1.1014,0.626279,-0.4095,
+ 0.73381,0.655202,0.179534,1.066291,0.661627,-0.361333,
+ 0.820632,0.565867,0.079739,1.1014,0.626279,-0.4095,
+ 0.786313,0.584772,0.199385,1.098258,0.615227,-0.335375,
+ 0.737725,0.668365,0.095126,1.057196,0.68635,-0.4175,
+ 0.739038,0.673664,0,1.052644,0.698661,-0.5,
+ 0.820414,0.57177,0,1.10018,0.633946,-0.5,
+ 0.820414,0.57177,0,1.10018,0.633946,-0.5,
+ 0.820632,0.565867,0.079739,1.1014,0.626279,-0.4095,
+ 0.737725,0.668365,0.095126,1.057196,0.68635,-0.4175,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.862894,0.498192,0.08496,1.149055,0.549292,-0.40225,
+ 0.820632,0.565867,0.079739,1.1014,0.626279,-0.4095,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.820632,0.565867,0.079739,1.1014,0.626279,-0.4095,
+ 0.820414,0.57177,0,1.10018,0.633946,-0.5,
+ 0.862894,0.498192,0.08496,1.149055,0.549292,-0.40225,
+ 0.83547,0.498022,0.232303,1.141425,0.544887,-0.322437,
+ 0.786313,0.584772,0.199385,1.098258,0.615227,-0.335375,
+ 0.786313,0.584772,0.199385,1.098258,0.615227,-0.335375,
+ 0.820632,0.565867,0.079739,1.1014,0.626279,-0.4095,
+ 0.862894,0.498192,0.08496,1.149055,0.549292,-0.40225,
+ 0.73381,0.655202,-0.179535,1.066291,0.661627,-0.638667,
+ 0.786313,0.584772,-0.199385,1.098258,0.615227,-0.664625,
+ 0.820632,0.565867,-0.079739,1.1014,0.626279,-0.5905,
+ 0.73381,0.655202,-0.179535,1.066291,0.661627,-0.638667,
+ 0.820632,0.565867,-0.079739,1.1014,0.626279,-0.5905,
+ 0.737725,0.668365,-0.095126,1.057196,0.68635,-0.5825,
+ 0.786313,0.584772,-0.199385,1.098258,0.615227,-0.664625,
+ 0.83547,0.498022,-0.232303,1.141425,0.544887,-0.677562,
+ 0.862894,0.498192,-0.08496,1.149055,0.549292,-0.59775,
+ 0.862894,0.498192,-0.08496,1.149055,0.549292,-0.59775,
+ 0.820632,0.565867,-0.079739,1.1014,0.626279,-0.5905,
+ 0.786313,0.584772,-0.199385,1.098258,0.615227,-0.664625,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.820414,0.57177,0,1.10018,0.633946,-0.5,
+ 0.820632,0.565867,-0.079739,1.1014,0.626279,-0.5905,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.820632,0.565867,-0.079739,1.1014,0.626279,-0.5905,
+ 0.862894,0.498192,-0.08496,1.149055,0.549292,-0.59775,
+ 0.820414,0.57177,0,1.10018,0.633946,-0.5,
+ 0.739038,0.673664,0,1.052644,0.698661,-0.5,
+ 0.737725,0.668365,-0.095126,1.057196,0.68635,-0.5825,
+ 0.737725,0.668365,-0.095126,1.057196,0.68635,-0.5825,
+ 0.820632,0.565867,-0.079739,1.1014,0.626279,-0.5905,
+ 0.820414,0.57177,0,1.10018,0.633946,-0.5,
+ 0.930569,0.3071,-0.199328,1.204957,0.421449,-0.638667,
+ 0.940255,0.325371,-0.100277,1.221821,0.401211,-0.5825,
+ 0.900371,0.427755,-0.079739,1.1919,0.469528,-0.5905,
+ 0.930569,0.3071,-0.199328,1.204957,0.421449,-0.638667,
+ 0.900371,0.427755,-0.079739,1.1919,0.469528,-0.5905,
+ 0.890268,0.404155,-0.209958,1.180758,0.472333,-0.664625,
+ 0.940255,0.325371,-0.100277,1.221821,0.401211,-0.5825,
+ 0.962007,0.273026,0,1.230206,0.391113,-0.5,
+ 0.905374,0.424615,0,1.19793,0.464638,-0.5,
+ 0.905374,0.424615,0,1.19793,0.464638,-0.5,
+ 0.900371,0.427755,-0.079739,1.1919,0.469528,-0.5905,
+ 0.940255,0.325371,-0.100277,1.221821,0.401211,-0.5825,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.862894,0.498192,-0.08496,1.149055,0.549292,-0.59775,
+ 0.900371,0.427755,-0.079739,1.1919,0.469528,-0.5905,
+ 0.866025,0.5,0,1.151611,0.550768,-0.5,
+ 0.900371,0.427755,-0.079739,1.1919,0.469528,-0.5905,
+ 0.905374,0.424615,0,1.19793,0.464638,-0.5,
+ 0.862894,0.498192,-0.08496,1.149055,0.549292,-0.59775,
+ 0.83547,0.498022,-0.232303,1.141425,0.544887,-0.677562,
+ 0.890268,0.404155,-0.209958,1.180758,0.472333,-0.664625,
+ 0.890268,0.404155,-0.209958,1.180758,0.472333,-0.664625,
+ 0.900371,0.427755,-0.079739,1.1919,0.469528,-0.5905,
+ 0.862894,0.498192,-0.08496,1.149055,0.549292,-0.59775,
+ 0.133481,-0.728232,-0.672207,1.115671,0.352342,-0.673147,
+ 0.180025,-0.723743,-0.666173,1.052796,0.338416,-0.673044,
+ 0.197559,-0.930384,-0.308798,1.077742,0.301825,-0.594388,
+ 0.133481,-0.728232,-0.672207,1.115671,0.352342,-0.673147,
+ 0.197559,-0.930384,-0.308798,1.077742,0.301825,-0.594388,
+ 0.164983,-0.93415,-0.316457,1.139957,0.313586,-0.594444,
+ 0.180025,-0.723743,-0.666173,1.052796,0.338416,-0.673044,
+ 0.227251,-0.720523,-0.655136,0.982068,0.320307,-0.674787,
+ 0.245574,-0.922075,-0.299117,1.008335,0.286145,-0.595338,
+ 0.245574,-0.922075,-0.299117,1.008335,0.286145,-0.595338,
+ 0.197559,-0.930384,-0.308798,1.077742,0.301825,-0.594388,
+ 0.180025,-0.723743,-0.666173,1.052796,0.338416,-0.673044,
+ 0.233794,-0.972286,0,1.017091,0.274757,-0.5,
+ 0.1906,-0.981668,0,1.086058,0.289628,-0.5,
+ 0.197559,-0.930384,-0.308798,1.077742,0.301825,-0.594388,
+ 0.233794,-0.972286,0,1.017091,0.274757,-0.5,
+ 0.197559,-0.930384,-0.308798,1.077742,0.301825,-0.594388,
+ 0.245574,-0.922075,-0.299117,1.008335,0.286145,-0.595338,
+ 0.1906,-0.981668,0,1.086058,0.289628,-0.5,
+ 0.166954,-0.985965,0,1.148052,0.300668,-0.5,
+ 0.164983,-0.93415,-0.316457,1.139957,0.313586,-0.594444,
+ 0.164983,-0.93415,-0.316457,1.139957,0.313586,-0.594444,
+ 0.197559,-0.930384,-0.308798,1.077742,0.301825,-0.594388,
+ 0.1906,-0.981668,0,1.086058,0.289628,-0.5,
+ 0.287838,-0.708745,-0.644073,0.910476,0.29726,-0.676962,
+ 0.37574,-0.67126,-0.638928,0.845007,0.268518,-0.678159,
+ 0.438584,-0.8515,-0.287389,0.875679,0.240722,-0.597178,
+ 0.438584,-0.8515,-0.287389,0.875679,0.240722,-0.597178,
+ 0.319032,-0.902133,-0.290473,0.93867,0.26597,-0.596525,
+ 0.287838,-0.708745,-0.644073,0.910476,0.29726,-0.676962,
+ 0.419512,-0.90775,0,0.885904,0.231457,-0.5,
+ 0.303521,-0.952825,0,0.948068,0.255539,-0.5,
+ 0.319032,-0.902133,-0.290473,0.93867,0.26597,-0.596525,
+ 0.419512,-0.90775,0,0.885904,0.231457,-0.5,
+ 0.319032,-0.902133,-0.290473,0.93867,0.26597,-0.596525,
+ 0.438584,-0.8515,-0.287389,0.875679,0.240722,-0.597178,
+ 0.303521,-0.952825,0,0.948068,0.255539,-0.5,
+ 0.233794,-0.972286,0,1.017091,0.274757,-0.5,
+ 0.245574,-0.922075,-0.299117,1.008335,0.286145,-0.595338,
+ 0.245574,-0.922075,-0.299117,1.008335,0.286145,-0.595338,
+ 0.319032,-0.902133,-0.290473,0.93867,0.26597,-0.596525,
+ 0.303521,-0.952825,0,0.948068,0.255539,-0.5,
+ 0.227251,-0.720523,-0.655136,0.982068,0.320307,-0.674787,
+ 0.287838,-0.708745,-0.644073,0.910476,0.29726,-0.676962,
+ 0.319032,-0.902133,-0.290473,0.93867,0.26597,-0.596525,
+ 0.227251,-0.720523,-0.655136,0.982068,0.320307,-0.674787,
+ 0.319032,-0.902133,-0.290473,0.93867,0.26597,-0.596525,
+ 0.245574,-0.922075,-0.299117,1.008335,0.286145,-0.595338,
+ 0.438584,-0.8515,0.287389,0.875679,0.240722,-0.402822,
+ 0.37574,-0.67126,0.638928,0.845007,0.268518,-0.321841,
+ 0.287838,-0.708745,0.644073,0.910476,0.29726,-0.323037,
+ 0.287838,-0.708745,0.644073,0.910476,0.29726,-0.323037,
+ 0.319032,-0.902133,0.290473,0.93867,0.26597,-0.403475,
+ 0.438584,-0.8515,0.287389,0.875679,0.240722,-0.402822,
+ 0.227251,-0.720523,0.655136,0.982068,0.320307,-0.325213,
+ 0.245574,-0.922075,0.299116,1.008335,0.286145,-0.404662,
+ 0.319032,-0.902133,0.290473,0.93867,0.26597,-0.403475,
+ 0.227251,-0.720523,0.655136,0.982068,0.320307,-0.325213,
+ 0.319032,-0.902133,0.290473,0.93867,0.26597,-0.403475,
+ 0.287838,-0.708745,0.644073,0.910476,0.29726,-0.323037,
+ 0.245574,-0.922075,0.299116,1.008335,0.286145,-0.404662,
+ 0.233794,-0.972286,0,1.017091,0.274757,-0.5,
+ 0.303521,-0.952825,0,0.948068,0.255539,-0.5,
+ 0.303521,-0.952825,0,0.948068,0.255539,-0.5,
+ 0.319032,-0.902133,0.290473,0.93867,0.26597,-0.403475,
+ 0.245574,-0.922075,0.299116,1.008335,0.286145,-0.404662,
+ 0.419512,-0.90775,0,0.885904,0.231457,-0.5,
+ 0.438584,-0.8515,0.287389,0.875679,0.240722,-0.402822,
+ 0.319032,-0.902133,0.290473,0.93867,0.26597,-0.403475,
+ 0.419512,-0.90775,0,0.885904,0.231457,-0.5,
+ 0.319032,-0.902133,0.290473,0.93867,0.26597,-0.403475,
+ 0.303521,-0.952825,0,0.948068,0.255539,-0.5,
+ 0.133481,-0.728232,0.672206,1.115671,0.352342,-0.326853,
+ 0.164983,-0.93415,0.316457,1.139957,0.313586,-0.405556,
+ 0.19756,-0.930384,0.308798,1.077742,0.301825,-0.405612,
+ 0.133481,-0.728232,0.672206,1.115671,0.352342,-0.326853,
+ 0.19756,-0.930384,0.308798,1.077742,0.301825,-0.405612,
+ 0.180025,-0.723743,0.666173,1.052796,0.338416,-0.326956,
+ 0.164983,-0.93415,0.316457,1.139957,0.313586,-0.405556,
+ 0.166954,-0.985965,0,1.148052,0.300668,-0.5,
+ 0.1906,-0.981668,0,1.086058,0.289628,-0.5,
+ 0.1906,-0.981668,0,1.086058,0.289628,-0.5,
+ 0.19756,-0.930384,0.308798,1.077742,0.301825,-0.405612,
+ 0.164983,-0.93415,0.316457,1.139957,0.313586,-0.405556,
+ 0.233794,-0.972286,0,1.017091,0.274757,-0.5,
+ 0.245574,-0.922075,0.299116,1.008335,0.286145,-0.404662,
+ 0.19756,-0.930384,0.308798,1.077742,0.301825,-0.405612,
+ 0.233794,-0.972286,0,1.017091,0.274757,-0.5,
+ 0.19756,-0.930384,0.308798,1.077742,0.301825,-0.405612,
+ 0.1906,-0.981668,0,1.086058,0.289628,-0.5,
+ 0.245574,-0.922075,0.299116,1.008335,0.286145,-0.404662,
+ 0.227251,-0.720523,0.655136,0.982068,0.320307,-0.325213,
+ 0.180025,-0.723743,0.666173,1.052796,0.338416,-0.326956,
+ 0.180025,-0.723743,0.666173,1.052796,0.338416,-0.326956,
+ 0.19756,-0.930384,0.308798,1.077742,0.301825,-0.405612,
+ 0.245574,-0.922075,0.299116,1.008335,0.286145,-0.404662,
+ -0.334948,0.636181,-0.695043,0.937575,0.63655,-0.673147,
+ -0.290177,0.673481,-0.679868,0.869854,0.606754,-0.673044,
+ -0.128571,0.348912,-0.928294,0.911431,0.545768,-0.720237,
+ -0.334948,0.636181,-0.695043,0.937575,0.63655,-0.673147,
+ -0.128571,0.348912,-0.928294,0.911431,0.545768,-0.720237,
+ -0.176226,0.307645,-0.935039,0.978052,0.571957,-0.720369,
+ -0.290177,0.673481,-0.679868,0.869854,0.606754,-0.673044,
+ -0.308574,0.679683,-0.665442,0.789439,0.570833,-0.674787,
+ -0.132599,0.364183,-0.92184,0.833218,0.513896,-0.722456,
+ -0.132599,0.364183,-0.92184,0.833218,0.513896,-0.722456,
+ -0.128571,0.348912,-0.928294,0.911431,0.545768,-0.720237,
+ -0.290177,0.673481,-0.679868,0.869854,0.606754,-0.673044,
+ 0.026562,0.016059,-0.999518,0.885754,0.44557,-0.738345,
+ 0.010552,0.00411,-0.999936,0.961325,0.472585,-0.735969,
+ -0.128571,0.348912,-0.928294,0.911431,0.545768,-0.720237,
+ 0.026562,0.016059,-0.999518,0.885754,0.44557,-0.738345,
+ -0.128571,0.348912,-0.928294,0.911431,0.545768,-0.720237,
+ -0.132599,0.364183,-0.92184,0.833218,0.513896,-0.722456,
+ 0.010552,0.00411,-0.999936,0.961325,0.472585,-0.735969,
+ -0.042028,-0.027931,-0.998726,1.026623,0.494446,-0.736109,
+ -0.176226,0.307645,-0.935039,0.978052,0.571957,-0.720369,
+ -0.176226,0.307645,-0.935039,0.978052,0.571957,-0.720369,
+ -0.128571,0.348912,-0.928294,0.911431,0.545768,-0.720237,
+ 0.010552,0.00411,-0.999936,0.961325,0.472585,-0.735969,
+ -0.36742,0.660294,-0.654992,0.703717,0.526722,-0.676962,
+ -0.459897,0.603331,-0.651526,0.620074,0.472355,-0.678159,
+ -0.231331,0.321253,-0.918304,0.671195,0.426029,-0.726748,
+ -0.231331,0.321253,-0.918304,0.671195,0.426029,-0.726748,
+ -0.168868,0.358367,-0.918181,0.750708,0.474572,-0.725225,
+ -0.36742,0.660294,-0.654992,0.703717,0.526722,-0.676962,
+ 0.003382,-0.001295,-0.999993,0.73254,0.370437,-0.742944,
+ 0.02248,0.015117,-0.999633,0.807096,0.411991,-0.741313,
+ -0.168868,0.358367,-0.918181,0.750708,0.474572,-0.725225,
+ 0.003382,-0.001295,-0.999993,0.73254,0.370437,-0.742944,
+ -0.168868,0.358367,-0.918181,0.750708,0.474572,-0.725225,
+ -0.231331,0.321253,-0.918304,0.671195,0.426029,-0.726748,
+ 0.02248,0.015117,-0.999633,0.807096,0.411991,-0.741313,
+ 0.026562,0.016059,-0.999518,0.885754,0.44557,-0.738345,
+ -0.132599,0.364183,-0.92184,0.833218,0.513896,-0.722456,
+ -0.132599,0.364183,-0.92184,0.833218,0.513896,-0.722456,
+ -0.168868,0.358367,-0.918181,0.750708,0.474572,-0.725225,
+ 0.02248,0.015117,-0.999633,0.807096,0.411991,-0.741313,
+ -0.308574,0.679683,-0.665442,0.789439,0.570833,-0.674787,
+ -0.36742,0.660294,-0.654992,0.703717,0.526722,-0.676962,
+ -0.168868,0.358367,-0.918181,0.750708,0.474572,-0.725225,
+ -0.308574,0.679683,-0.665442,0.789439,0.570833,-0.674787,
+ -0.168868,0.358367,-0.918181,0.750708,0.474572,-0.725225,
+ -0.132599,0.364183,-0.92184,0.833218,0.513896,-0.722456,
+ 0.37574,-0.67126,-0.638928,0.845007,0.268518,-0.678159,
+ 0.287838,-0.708745,-0.644073,0.910476,0.29726,-0.676962,
+ 0.181001,-0.354486,-0.917376,0.863485,0.34941,-0.725225,
+ 0.37574,-0.67126,-0.638928,0.845007,0.268518,-0.678159,
+ 0.181001,-0.354486,-0.917376,0.863485,0.34941,-0.725225,
+ 0.214466,-0.344671,-0.913896,0.793886,0.314845,-0.726748,
+ 0.287838,-0.708745,-0.644073,0.910476,0.29726,-0.676962,
+ 0.227251,-0.720523,-0.655136,0.982068,0.320307,-0.674787,
+ 0.149984,-0.357133,-0.921933,0.938289,0.377245,-0.722456,
+ 0.149984,-0.357133,-0.921933,0.938289,0.377245,-0.722456,
+ 0.181001,-0.354486,-0.917376,0.863485,0.34941,-0.725225,
+ 0.287838,-0.708745,-0.644073,0.910476,0.29726,-0.676962,
+ 0.026562,0.016059,-0.999518,0.885754,0.44557,-0.738345,
+ 0.02248,0.015117,-0.999633,0.807096,0.411991,-0.741313,
+ 0.181001,-0.354486,-0.917376,0.863485,0.34941,-0.725225,
+ 0.026562,0.016059,-0.999518,0.885754,0.44557,-0.738345,
+ 0.181001,-0.354486,-0.917376,0.863485,0.34941,-0.725225,
+ 0.149984,-0.357133,-0.921933,0.938289,0.377245,-0.722456,
+ 0.02248,0.015117,-0.999633,0.807096,0.411991,-0.741313,
+ 0.003382,-0.001295,-0.999993,0.73254,0.370437,-0.742944,
+ 0.214466,-0.344671,-0.913896,0.793886,0.314845,-0.726748,
+ 0.214466,-0.344671,-0.913896,0.793886,0.314845,-0.726748,
+ 0.181001,-0.354486,-0.917376,0.863485,0.34941,-0.725225,
+ 0.02248,0.015117,-0.999633,0.807096,0.411991,-0.741313,
+ 0.180025,-0.723743,-0.666173,1.052796,0.338416,-0.673044,
+ 0.133481,-0.728232,-0.672207,1.115671,0.352342,-0.673147,
+ 0.060251,-0.377234,-0.924156,1.075195,0.416935,-0.720369,
+ 0.060251,-0.377234,-0.924156,1.075195,0.416935,-0.720369,
+ 0.114557,-0.361315,-0.92538,1.011218,0.399402,-0.720237,
+ 0.180025,-0.723743,-0.666173,1.052796,0.338416,-0.673044,
+ -0.042028,-0.027931,-0.998726,1.026623,0.494446,-0.736109,
+ 0.010552,0.00411,-0.999936,0.961325,0.472585,-0.735969,
+ 0.114557,-0.361315,-0.92538,1.011218,0.399402,-0.720237,
+ -0.042028,-0.027931,-0.998726,1.026623,0.494446,-0.736109,
+ 0.114557,-0.361315,-0.92538,1.011218,0.399402,-0.720237,
+ 0.060251,-0.377234,-0.924156,1.075195,0.416935,-0.720369,
+ 0.010552,0.00411,-0.999936,0.961325,0.472585,-0.735969,
+ 0.026562,0.016059,-0.999518,0.885754,0.44557,-0.738345,
+ 0.149984,-0.357133,-0.921933,0.938289,0.377245,-0.722456,
+ 0.149984,-0.357133,-0.921933,0.938289,0.377245,-0.722456,
+ 0.114557,-0.361315,-0.92538,1.011218,0.399402,-0.720237,
+ 0.010552,0.00411,-0.999936,0.961325,0.472585,-0.735969,
+ 0.227251,-0.720523,-0.655136,0.982068,0.320307,-0.674787,
+ 0.180025,-0.723743,-0.666173,1.052796,0.338416,-0.673044,
+ 0.114557,-0.361315,-0.92538,1.011218,0.399402,-0.720237,
+ 0.227251,-0.720523,-0.655136,0.982068,0.320307,-0.674787,
+ 0.114557,-0.361315,-0.92538,1.011218,0.399402,-0.720237,
+ 0.149984,-0.357133,-0.921933,0.938289,0.377245,-0.722456,
+ -0.334947,0.636181,0.695043,0.937575,0.63655,-0.326853,
+ -0.176226,0.307645,0.935039,0.978052,0.571957,-0.279631,
+ -0.128571,0.348912,0.928294,0.911431,0.545768,-0.279763,
+ -0.334947,0.636181,0.695043,0.937575,0.63655,-0.326853,
+ -0.128571,0.348912,0.928294,0.911431,0.545768,-0.279763,
+ -0.290177,0.673481,0.679868,0.869854,0.606754,-0.326956,
+ -0.176226,0.307645,0.935039,0.978052,0.571957,-0.279631,
+ -0.042028,-0.027931,0.998726,1.026623,0.494446,-0.263891,
+ 0.010552,0.00411,0.999936,0.961325,0.472585,-0.264031,
+ 0.010552,0.00411,0.999936,0.961325,0.472585,-0.264031,
+ -0.128571,0.348912,0.928294,0.911431,0.545768,-0.279763,
+ -0.176226,0.307645,0.935039,0.978052,0.571957,-0.279631,
+ 0.026562,0.01606,0.999518,0.885754,0.44557,-0.261655,
+ -0.132599,0.364183,0.921839,0.833218,0.513896,-0.277544,
+ -0.128571,0.348912,0.928294,0.911431,0.545768,-0.279763,
+ 0.026562,0.01606,0.999518,0.885754,0.44557,-0.261655,
+ -0.128571,0.348912,0.928294,0.911431,0.545768,-0.279763,
+ 0.010552,0.00411,0.999936,0.961325,0.472585,-0.264031,
+ -0.132599,0.364183,0.921839,0.833218,0.513896,-0.277544,
+ -0.308574,0.679683,0.665442,0.789439,0.570833,-0.325213,
+ -0.290177,0.673481,0.679868,0.869854,0.606754,-0.326956,
+ -0.290177,0.673481,0.679868,0.869854,0.606754,-0.326956,
+ -0.128571,0.348912,0.928294,0.911431,0.545768,-0.279763,
+ -0.132599,0.364183,0.921839,0.833218,0.513896,-0.277544,
+ 0.060251,-0.377234,0.924156,1.075195,0.416935,-0.279631,
+ 0.133481,-0.728232,0.672206,1.115671,0.352342,-0.326853,
+ 0.180025,-0.723743,0.666173,1.052796,0.338416,-0.326956,
+ 0.180025,-0.723743,0.666173,1.052796,0.338416,-0.326956,
+ 0.114557,-0.361314,0.92538,1.011218,0.399402,-0.279763,
+ 0.060251,-0.377234,0.924156,1.075195,0.416935,-0.279631,
+ 0.227251,-0.720523,0.655136,0.982068,0.320307,-0.325213,
+ 0.149984,-0.357133,0.921933,0.938289,0.377245,-0.277544,
+ 0.114557,-0.361314,0.92538,1.011218,0.399402,-0.279763,
+ 0.227251,-0.720523,0.655136,0.982068,0.320307,-0.325213,
+ 0.114557,-0.361314,0.92538,1.011218,0.399402,-0.279763,
+ 0.180025,-0.723743,0.666173,1.052796,0.338416,-0.326956,
+ 0.149984,-0.357133,0.921933,0.938289,0.377245,-0.277544,
+ 0.026562,0.01606,0.999518,0.885754,0.44557,-0.261655,
+ 0.010552,0.00411,0.999936,0.961325,0.472585,-0.264031,
+ 0.010552,0.00411,0.999936,0.961325,0.472585,-0.264031,
+ 0.114557,-0.361314,0.92538,1.011218,0.399402,-0.279763,
+ 0.149984,-0.357133,0.921933,0.938289,0.377245,-0.277544,
+ -0.042028,-0.027931,0.998726,1.026623,0.494446,-0.263891,
+ 0.060251,-0.377234,0.924156,1.075195,0.416935,-0.279631,
+ 0.114557,-0.361314,0.92538,1.011218,0.399402,-0.279763,
+ -0.042028,-0.027931,0.998726,1.026623,0.494446,-0.263891,
+ 0.114557,-0.361314,0.92538,1.011218,0.399402,-0.279763,
+ 0.010552,0.00411,0.999936,0.961325,0.472585,-0.264031,
+ 0.37574,-0.67126,0.638928,0.845007,0.268518,-0.321841,
+ 0.214466,-0.34467,0.913896,0.793886,0.314845,-0.273252,
+ 0.181001,-0.354486,0.917376,0.863485,0.34941,-0.274775,
+ 0.37574,-0.67126,0.638928,0.845007,0.268518,-0.321841,
+ 0.181001,-0.354486,0.917376,0.863485,0.34941,-0.274775,
+ 0.287838,-0.708745,0.644073,0.910476,0.29726,-0.323037,
+ 0.214466,-0.34467,0.913896,0.793886,0.314845,-0.273252,
+ 0.003382,-0.001295,0.999993,0.73254,0.370437,-0.257056,
+ 0.02248,0.015118,0.999633,0.807096,0.411991,-0.258687,
+ 0.02248,0.015118,0.999633,0.807096,0.411991,-0.258687,
+ 0.181001,-0.354486,0.917376,0.863485,0.34941,-0.274775,
+ 0.214466,-0.34467,0.913896,0.793886,0.314845,-0.273252,
+ 0.026562,0.01606,0.999518,0.885754,0.44557,-0.261655,
+ 0.149984,-0.357133,0.921933,0.938289,0.377245,-0.277544,
+ 0.181001,-0.354486,0.917376,0.863485,0.34941,-0.274775,
+ 0.026562,0.01606,0.999518,0.885754,0.44557,-0.261655,
+ 0.181001,-0.354486,0.917376,0.863485,0.34941,-0.274775,
+ 0.02248,0.015118,0.999633,0.807096,0.411991,-0.258687,
+ 0.149984,-0.357133,0.921933,0.938289,0.377245,-0.277544,
+ 0.227251,-0.720523,0.655136,0.982068,0.320307,-0.325213,
+ 0.287838,-0.708745,0.644073,0.910476,0.29726,-0.323037,
+ 0.287838,-0.708745,0.644073,0.910476,0.29726,-0.323037,
+ 0.181001,-0.354486,0.917376,0.863485,0.34941,-0.274775,
+ 0.149984,-0.357133,0.921933,0.938289,0.377245,-0.277544,
+ -0.231331,0.321253,0.918304,0.671195,0.426029,-0.273252,
+ -0.459898,0.603331,0.651526,0.620074,0.472355,-0.321841,
+ -0.36742,0.660294,0.654992,0.703717,0.526722,-0.323037,
+ -0.36742,0.660294,0.654992,0.703717,0.526722,-0.323037,
+ -0.168868,0.358366,0.918181,0.750708,0.474572,-0.274775,
+ -0.231331,0.321253,0.918304,0.671195,0.426029,-0.273252,
+ -0.308574,0.679683,0.665442,0.789439,0.570833,-0.325213,
+ -0.132599,0.364183,0.921839,0.833218,0.513896,-0.277544,
+ -0.168868,0.358366,0.918181,0.750708,0.474572,-0.274775,
+ -0.308574,0.679683,0.665442,0.789439,0.570833,-0.325213,
+ -0.168868,0.358366,0.918181,0.750708,0.474572,-0.274775,
+ -0.36742,0.660294,0.654992,0.703717,0.526722,-0.323037,
+ -0.132599,0.364183,0.921839,0.833218,0.513896,-0.277544,
+ 0.026562,0.01606,0.999518,0.885754,0.44557,-0.261655,
+ 0.02248,0.015118,0.999633,0.807096,0.411991,-0.258687,
+ 0.02248,0.015118,0.999633,0.807096,0.411991,-0.258687,
+ -0.168868,0.358366,0.918181,0.750708,0.474572,-0.274775,
+ -0.132599,0.364183,0.921839,0.833218,0.513896,-0.277544,
+ 0.003382,-0.001295,0.999993,0.73254,0.370437,-0.257056,
+ -0.231331,0.321253,0.918304,0.671195,0.426029,-0.273252,
+ -0.168868,0.358366,0.918181,0.750708,0.474572,-0.274775,
+ 0.003382,-0.001295,0.999993,0.73254,0.370437,-0.257056,
+ -0.168868,0.358366,0.918181,0.750708,0.474572,-0.274775,
+ 0.02248,0.015118,0.999633,0.807096,0.411991,-0.258687,
+ -0.290177,0.673481,-0.679868,0.869854,0.606754,-0.673044,
+ -0.334948,0.636181,-0.695043,0.937575,0.63655,-0.673147,
+ -0.440797,0.833329,-0.333557,0.913289,0.675305,-0.594444,
+ -0.440797,0.833329,-0.333557,0.913289,0.675305,-0.594444,
+ -0.397769,0.859277,-0.321594,0.844907,0.643346,-0.594388,
+ -0.290177,0.673481,-0.679868,0.869854,0.606754,-0.673044,
+ -0.456348,0.889801,0,0.905194,0.688224,-0.5,
+ -0.427853,0.903848,0,0.836591,0.655543,-0.5,
+ -0.397769,0.859277,-0.321594,0.844907,0.643346,-0.594388,
+ -0.456348,0.889801,0,0.905194,0.688224,-0.5,
+ -0.397769,0.859277,-0.321594,0.844907,0.643346,-0.594388,
+ -0.440797,0.833329,-0.333557,0.913289,0.675305,-0.594444,
+ -0.427853,0.903848,0,0.836591,0.655543,-0.5,
+ -0.459546,0.888154,0,0.754416,0.616383,-0.5,
+ -0.421194,0.852237,-0.310301,0.763171,0.604996,-0.595338,
+ -0.421194,0.852237,-0.310301,0.763171,0.604996,-0.595338,
+ -0.397769,0.859277,-0.321594,0.844907,0.643346,-0.594388,
+ -0.427853,0.903848,0,0.836591,0.655543,-0.5,
+ -0.308574,0.679683,-0.665442,0.789439,0.570833,-0.674787,
+ -0.290177,0.673481,-0.679868,0.869854,0.606754,-0.673044,
+ -0.397769,0.859277,-0.321594,0.844907,0.643346,-0.594388,
+ -0.308574,0.679683,-0.665442,0.789439,0.570833,-0.674787,
+ -0.397769,0.859277,-0.321594,0.844907,0.643346,-0.594388,
+ -0.421194,0.852237,-0.310301,0.763171,0.604996,-0.595338,
+ -0.440797,0.833329,0.333557,0.913289,0.675305,-0.405556,
+ -0.334947,0.636181,0.695043,0.937575,0.63655,-0.326853,
+ -0.290177,0.673481,0.679868,0.869854,0.606754,-0.326956,
+ -0.290177,0.673481,0.679868,0.869854,0.606754,-0.326956,
+ -0.397769,0.859277,0.321594,0.844907,0.643346,-0.405612,
+ -0.440797,0.833329,0.333557,0.913289,0.675305,-0.405556,
+ -0.308574,0.679683,0.665442,0.789439,0.570833,-0.325213,
+ -0.421194,0.852237,0.310301,0.763171,0.604996,-0.404662,
+ -0.397769,0.859277,0.321594,0.844907,0.643346,-0.405612,
+ -0.308574,0.679683,0.665442,0.789439,0.570833,-0.325213,
+ -0.397769,0.859277,0.321594,0.844907,0.643346,-0.405612,
+ -0.290177,0.673481,0.679868,0.869854,0.606754,-0.326956,
+ -0.421194,0.852237,0.310301,0.763171,0.604996,-0.404662,
+ -0.459546,0.888154,0,0.754416,0.616383,-0.5,
+ -0.427853,0.903848,0,0.836591,0.655543,-0.5,
+ -0.427853,0.903848,0,0.836591,0.655543,-0.5,
+ -0.397769,0.859277,0.321594,0.844907,0.643346,-0.405612,
+ -0.421194,0.852237,0.310301,0.763171,0.604996,-0.404662,
+ -0.456348,0.889801,0,0.905194,0.688224,-0.5,
+ -0.440797,0.833329,0.333557,0.913289,0.675305,-0.405556,
+ -0.397769,0.859277,0.321594,0.844907,0.643346,-0.405612,
+ -0.456348,0.889801,0,0.905194,0.688224,-0.5,
+ -0.397769,0.859277,0.321594,0.844907,0.643346,-0.405612,
+ -0.427853,0.903848,0,0.836591,0.655543,-0.5,
+ -0.459898,0.603331,0.651526,0.620074,0.472355,-0.321841,
+ -0.5899,0.750266,0.298526,0.589401,0.500151,-0.402822,
+ -0.487389,0.819353,0.301848,0.675523,0.558012,-0.403475,
+ -0.459898,0.603331,0.651526,0.620074,0.472355,-0.321841,
+ -0.487389,0.819353,0.301848,0.675523,0.558012,-0.403475,
+ -0.36742,0.660294,0.654992,0.703717,0.526722,-0.323037,
+ -0.5899,0.750266,0.298526,0.589401,0.500151,-0.402822,
+ -0.64127,0.767315,0,0.579177,0.509417,-0.5,
+ -0.532473,0.846447,0,0.666125,0.568442,-0.5,
+ -0.532473,0.846447,0,0.666125,0.568442,-0.5,
+ -0.487389,0.819353,0.301848,0.675523,0.558012,-0.403475,
+ -0.5899,0.750266,0.298526,0.589401,0.500151,-0.402822,
+ -0.459546,0.888154,0,0.754416,0.616383,-0.5,
+ -0.421194,0.852237,0.310301,0.763171,0.604996,-0.404662,
+ -0.487389,0.819353,0.301848,0.675523,0.558012,-0.403475,
+ -0.459546,0.888154,0,0.754416,0.616383,-0.5,
+ -0.487389,0.819353,0.301848,0.675523,0.558012,-0.403475,
+ -0.532473,0.846447,0,0.666125,0.568442,-0.5,
+ -0.421194,0.852237,0.310301,0.763171,0.604996,-0.404662,
+ -0.308574,0.679683,0.665442,0.789439,0.570833,-0.325213,
+ -0.36742,0.660294,0.654992,0.703717,0.526722,-0.323037,
+ -0.36742,0.660294,0.654992,0.703717,0.526722,-0.323037,
+ -0.487389,0.819353,0.301848,0.675523,0.558012,-0.403475,
+ -0.421194,0.852237,0.310301,0.763171,0.604996,-0.404662,
+ -0.459897,0.603331,-0.651526,0.620074,0.472355,-0.678159,
+ -0.36742,0.660294,-0.654992,0.703717,0.526722,-0.676962,
+ -0.487389,0.819353,-0.301848,0.675523,0.558012,-0.596525,
+ -0.459897,0.603331,-0.651526,0.620074,0.472355,-0.678159,
+ -0.487389,0.819353,-0.301848,0.675523,0.558012,-0.596525,
+ -0.5899,0.750266,-0.298526,0.589401,0.500151,-0.597178,
+ -0.36742,0.660294,-0.654992,0.703717,0.526722,-0.676962,
+ -0.308574,0.679683,-0.665442,0.789439,0.570833,-0.674787,
+ -0.421194,0.852237,-0.310301,0.763171,0.604996,-0.595338,
+ -0.421194,0.852237,-0.310301,0.763171,0.604996,-0.595338,
+ -0.487389,0.819353,-0.301848,0.675523,0.558012,-0.596525,
+ -0.36742,0.660294,-0.654992,0.703717,0.526722,-0.676962,
+ -0.459546,0.888154,0,0.754416,0.616383,-0.5,
+ -0.532473,0.846447,0,0.666125,0.568442,-0.5,
+ -0.487389,0.819353,-0.301848,0.675523,0.558012,-0.596525,
+ -0.459546,0.888154,0,0.754416,0.616383,-0.5,
+ -0.487389,0.819353,-0.301848,0.675523,0.558012,-0.596525,
+ -0.421194,0.852237,-0.310301,0.763171,0.604996,-0.595338,
+ -0.532473,0.846447,0,0.666125,0.568442,-0.5,
+ -0.64127,0.767315,0,0.579177,0.509417,-0.5,
+ -0.5899,0.750266,-0.298526,0.589401,0.500151,-0.597178,
+ -0.5899,0.750266,-0.298526,0.589401,0.500151,-0.597178,
+ -0.487389,0.819353,-0.301848,0.675523,0.558012,-0.596525,
+ -0.532473,0.846447,0,0.666125,0.568442,-0.5,
+ -0.610536,0.426181,-0.667544,0.428341,0.263148,-0.673044,
+ -0.603758,0.432599,-0.669577,0.386176,0.201223,-0.673147,
+ -0.304433,0.241938,-0.921296,0.458468,0.182068,-0.720369,
+ -0.304433,0.241938,-0.921296,0.458468,0.182068,-0.720369,
+ -0.317966,0.212815,-0.923909,0.495371,0.238512,-0.720237,
+ -0.610536,0.426181,-0.667544,0.428341,0.263148,-0.673044,
+ 0.013842,0.059444,-0.998136,0.545218,0.159081,-0.736109,
+ -0.005469,-0.009402,-0.999941,0.575807,0.208949,-0.735969,
+ -0.317966,0.212815,-0.923909,0.495371,0.238512,-0.720237,
+ 0.013842,0.059444,-0.998136,0.545218,0.159081,-0.736109,
+ -0.317966,0.212815,-0.923909,0.495371,0.238512,-0.720237,
+ -0.304433,0.241938,-0.921296,0.458468,0.182068,-0.720369,
+ -0.005469,-0.009402,-0.999941,0.575807,0.208949,-0.735969,
+ -0.015914,-0.029529,-0.999437,0.617093,0.264045,-0.738345,
+ -0.31459,0.228088,-0.921417,0.543287,0.301992,-0.722456,
+ -0.31459,0.228088,-0.921417,0.543287,0.301992,-0.722456,
+ -0.317966,0.212815,-0.923909,0.495371,0.238512,-0.720237,
+ -0.005469,-0.009402,-0.999941,0.575807,0.208949,-0.735969,
+ -0.595775,0.458968,-0.659091,0.481782,0.333615,-0.674787,
+ -0.610536,0.426181,-0.667544,0.428341,0.263148,-0.673044,
+ -0.317966,0.212815,-0.923909,0.495371,0.238512,-0.720237,
+ -0.595775,0.458968,-0.659091,0.481782,0.333615,-0.674787,
+ -0.317966,0.212815,-0.923909,0.495371,0.238512,-0.720237,
+ -0.31459,0.228088,-0.921417,0.543287,0.301992,-0.722456,
+ 0.677454,-0.2664,-0.685629,0.704261,0.116939,-0.673147,
+ 0.617578,-0.419692,-0.665174,0.723274,0.15475,-0.673044,
+ 0.314626,-0.214176,-0.924737,0.656244,0.179386,-0.720237,
+ 0.677454,-0.2664,-0.685629,0.704261,0.116939,-0.673147,
+ 0.314626,-0.214176,-0.924737,0.656244,0.179386,-0.720237,
+ 0.344586,-0.098997,-0.93352,0.631969,0.136095,-0.720369,
+ 0.617578,-0.419692,-0.665174,0.723274,0.15475,-0.673044,
+ 0.525124,-0.503608,-0.68602,0.752404,0.194475,-0.674787,
+ 0.282948,-0.282367,-0.916629,0.690899,0.226098,-0.722456,
+ 0.282948,-0.282367,-0.916629,0.690899,0.226098,-0.722456,
+ 0.314626,-0.214176,-0.924737,0.656244,0.179386,-0.720237,
+ 0.617578,-0.419692,-0.665174,0.723274,0.15475,-0.673044,
+ -0.015914,-0.029529,-0.999437,0.617093,0.264045,-0.738345,
+ -0.005469,-0.009402,-0.999941,0.575807,0.208949,-0.735969,
+ 0.314626,-0.214176,-0.924737,0.656244,0.179386,-0.720237,
+ -0.015914,-0.029529,-0.999437,0.617093,0.264045,-0.738345,
+ 0.314626,-0.214176,-0.924737,0.656244,0.179386,-0.720237,
+ 0.282948,-0.282367,-0.916629,0.690899,0.226098,-0.722456,
+ -0.005469,-0.009402,-0.999941,0.575807,0.208949,-0.735969,
+ 0.013842,0.059444,-0.998136,0.545218,0.159081,-0.736109,
+ 0.344586,-0.098997,-0.93352,0.631969,0.136095,-0.720369,
+ 0.344586,-0.098997,-0.93352,0.631969,0.136095,-0.720369,
+ 0.314626,-0.214176,-0.924737,0.656244,0.179386,-0.720237,
+ -0.005469,-0.009402,-0.999941,0.575807,0.208949,-0.735969,
+ 0.473586,-0.60369,-0.641307,0.792649,0.233327,-0.676962,
+ 0.37574,-0.67126,-0.638928,0.845007,0.268518,-0.678159,
+ 0.214466,-0.344671,-0.913896,0.793886,0.314845,-0.726748,
+ 0.214466,-0.344671,-0.913896,0.793886,0.314845,-0.726748,
+ 0.248581,-0.323271,-0.913074,0.736568,0.272496,-0.725225,
+ 0.473586,-0.60369,-0.641307,0.792649,0.233327,-0.676962,
+ 0.003382,-0.001295,-0.999993,0.73254,0.370437,-0.742944,
+ -0.014673,-0.023374,-0.999619,0.669271,0.319498,-0.741313,
+ 0.248581,-0.323271,-0.913074,0.736568,0.272496,-0.725225,
+ 0.003382,-0.001295,-0.999993,0.73254,0.370437,-0.742944,
+ 0.248581,-0.323271,-0.913074,0.736568,0.272496,-0.725225,
+ 0.214466,-0.344671,-0.913896,0.793886,0.314845,-0.726748,
+ -0.014673,-0.023374,-0.999619,0.669271,0.319498,-0.741313,
+ -0.015914,-0.029529,-0.999437,0.617093,0.264045,-0.738345,
+ 0.282948,-0.282367,-0.916629,0.690899,0.226098,-0.722456,
+ 0.282948,-0.282367,-0.916629,0.690899,0.226098,-0.722456,
+ 0.248581,-0.323271,-0.913074,0.736568,0.272496,-0.725225,
+ -0.014673,-0.023374,-0.999619,0.669271,0.319498,-0.741313,
+ 0.525124,-0.503608,-0.68602,0.752404,0.194475,-0.674787,
+ 0.473586,-0.60369,-0.641307,0.792649,0.233327,-0.676962,
+ 0.248581,-0.323271,-0.913074,0.736568,0.272496,-0.725225,
+ 0.525124,-0.503608,-0.68602,0.752404,0.194475,-0.674787,
+ 0.248581,-0.323271,-0.913074,0.736568,0.272496,-0.725225,
+ 0.282948,-0.282367,-0.916629,0.690899,0.226098,-0.722456,
+ -0.459897,0.603331,-0.651526,0.620074,0.472355,-0.678159,
+ -0.565284,0.537872,-0.625418,0.545894,0.405668,-0.676962,
+ -0.288623,0.26748,-0.919321,0.601974,0.3665,-0.725225,
+ -0.459897,0.603331,-0.651526,0.620074,0.472355,-0.678159,
+ -0.288623,0.26748,-0.919321,0.601974,0.3665,-0.725225,
+ -0.231331,0.321253,-0.918304,0.671195,0.426029,-0.726748,
+ -0.565284,0.537872,-0.625418,0.545894,0.405668,-0.676962,
+ -0.595775,0.458968,-0.659091,0.481782,0.333615,-0.674787,
+ -0.31459,0.228088,-0.921417,0.543287,0.301992,-0.722456,
+ -0.31459,0.228088,-0.921417,0.543287,0.301992,-0.722456,
+ -0.288623,0.26748,-0.919321,0.601974,0.3665,-0.725225,
+ -0.565284,0.537872,-0.625418,0.545894,0.405668,-0.676962,
+ -0.015914,-0.029529,-0.999437,0.617093,0.264045,-0.738345,
+ -0.014673,-0.023374,-0.999619,0.669271,0.319498,-0.741313,
+ -0.288623,0.26748,-0.919321,0.601974,0.3665,-0.725225,
+ -0.015914,-0.029529,-0.999437,0.617093,0.264045,-0.738345,
+ -0.288623,0.26748,-0.919321,0.601974,0.3665,-0.725225,
+ -0.31459,0.228088,-0.921417,0.543287,0.301992,-0.722456,
+ -0.014673,-0.023374,-0.999619,0.669271,0.319498,-0.741313,
+ 0.003382,-0.001295,-0.999993,0.73254,0.370437,-0.742944,
+ -0.231331,0.321253,-0.918304,0.671195,0.426029,-0.726748,
+ -0.231331,0.321253,-0.918304,0.671195,0.426029,-0.726748,
+ -0.288623,0.26748,-0.919321,0.601974,0.3665,-0.725225,
+ -0.014673,-0.023374,-0.999619,0.669271,0.319498,-0.741313,
+ -0.77971,0.541974,-0.313555,0.342801,0.212716,-0.594444,
+ -0.603758,0.432599,-0.669577,0.386176,0.201223,-0.673147,
+ -0.610536,0.426181,-0.667544,0.428341,0.263148,-0.673044,
+ -0.610536,0.426181,-0.667544,0.428341,0.263148,-0.673044,
+ -0.770954,0.557417,-0.308084,0.388123,0.27793,-0.594388,
+ -0.77971,0.541974,-0.313555,0.342801,0.212716,-0.594444,
+ -0.595775,0.458968,-0.659091,0.481782,0.333615,-0.674787,
+ -0.740072,0.600901,-0.302014,0.444878,0.352588,-0.595338,
+ -0.770954,0.557417,-0.308084,0.388123,0.27793,-0.594388,
+ -0.595775,0.458968,-0.659091,0.481782,0.333615,-0.674787,
+ -0.770954,0.557417,-0.308084,0.388123,0.27793,-0.594388,
+ -0.610536,0.426181,-0.667544,0.428341,0.263148,-0.673044,
+ -0.740072,0.600901,-0.302014,0.444878,0.352588,-0.595338,
+ -0.766999,0.641648,0,0.432577,0.358913,-0.5,
+ -0.804241,0.594303,0,0.374717,0.282857,-0.5,
+ -0.804241,0.594303,0,0.374717,0.282857,-0.5,
+ -0.770954,0.557417,-0.308084,0.388123,0.27793,-0.594388,
+ -0.740072,0.600901,-0.302014,0.444878,0.352588,-0.595338,
+ -0.820475,0.571682,0,0.328343,0.216547,-0.5,
+ -0.77971,0.541974,-0.313555,0.342801,0.212716,-0.594444,
+ -0.770954,0.557417,-0.308084,0.388123,0.27793,-0.594388,
+ -0.820475,0.571682,0,0.328343,0.216547,-0.5,
+ -0.770954,0.557417,-0.308084,0.388123,0.27793,-0.594388,
+ -0.804241,0.594303,0,0.374717,0.282857,-0.5,
+ -0.565284,0.537872,-0.625418,0.545894,0.405668,-0.676962,
+ -0.459897,0.603331,-0.651526,0.620074,0.472355,-0.678159,
+ -0.5899,0.750266,-0.298526,0.589401,0.500151,-0.597178,
+ -0.5899,0.750266,-0.298526,0.589401,0.500151,-0.597178,
+ -0.694867,0.675869,-0.245685,0.512245,0.429169,-0.596525,
+ -0.565284,0.537872,-0.625418,0.545894,0.405668,-0.676962,
+ -0.64127,0.767315,0,0.579177,0.509417,-0.5,
+ -0.716797,0.697282,0,0.501029,0.437003,-0.5,
+ -0.694867,0.675869,-0.245685,0.512245,0.429169,-0.596525,
+ -0.64127,0.767315,0,0.579177,0.509417,-0.5,
+ -0.694867,0.675869,-0.245685,0.512245,0.429169,-0.596525,
+ -0.5899,0.750266,-0.298526,0.589401,0.500151,-0.597178,
+ -0.766999,0.641648,0,0.432577,0.358913,-0.5,
+ -0.740072,0.600901,-0.302014,0.444878,0.352588,-0.595338,
+ -0.694867,0.675869,-0.245685,0.512245,0.429169,-0.596525,
+ -0.766999,0.641648,0,0.432577,0.358913,-0.5,
+ -0.694867,0.675869,-0.245685,0.512245,0.429169,-0.596525,
+ -0.716797,0.697282,0,0.501029,0.437003,-0.5,
+ -0.740072,0.600901,-0.302014,0.444878,0.352588,-0.595338,
+ -0.595775,0.458968,-0.659091,0.481782,0.333615,-0.674787,
+ -0.565284,0.537872,-0.625418,0.545894,0.405668,-0.676962,
+ -0.565284,0.537872,-0.625418,0.545894,0.405668,-0.676962,
+ -0.694867,0.675869,-0.245685,0.512245,0.429169,-0.596525,
+ -0.740072,0.600901,-0.302014,0.444878,0.352588,-0.595338,
+ -0.5899,0.750266,0.298526,0.589401,0.500151,-0.402822,
+ -0.459898,0.603331,0.651526,0.620074,0.472355,-0.321841,
+ -0.565284,0.537872,0.625418,0.545894,0.405668,-0.323037,
+ -0.565284,0.537872,0.625418,0.545894,0.405668,-0.323037,
+ -0.694867,0.675869,0.245685,0.512245,0.429169,-0.403475,
+ -0.5899,0.750266,0.298526,0.589401,0.500151,-0.402822,
+ -0.565284,0.537872,0.625418,0.545894,0.405668,-0.323037,
+ -0.595775,0.458968,0.659091,0.481782,0.333615,-0.325213,
+ -0.740072,0.600901,0.302014,0.444878,0.352588,-0.404662,
+ -0.740072,0.600901,0.302014,0.444878,0.352588,-0.404662,
+ -0.694867,0.675869,0.245685,0.512245,0.429169,-0.403475,
+ -0.565284,0.537872,0.625418,0.545894,0.405668,-0.323037,
+ -0.766999,0.641648,0,0.432577,0.358913,-0.5,
+ -0.716797,0.697282,0,0.501029,0.437003,-0.5,
+ -0.694867,0.675869,0.245685,0.512245,0.429169,-0.403475,
+ -0.766999,0.641648,0,0.432577,0.358913,-0.5,
+ -0.694867,0.675869,0.245685,0.512245,0.429169,-0.403475,
+ -0.740072,0.600901,0.302014,0.444878,0.352588,-0.404662,
+ -0.64127,0.767315,0,0.579177,0.509417,-0.5,
+ -0.5899,0.750266,0.298526,0.589401,0.500151,-0.402822,
+ -0.694867,0.675869,0.245685,0.512245,0.429169,-0.403475,
+ -0.64127,0.767315,0,0.579177,0.509417,-0.5,
+ -0.694867,0.675869,0.245685,0.512245,0.429169,-0.403475,
+ -0.716797,0.697282,0,0.501029,0.437003,-0.5,
+ -0.610536,0.426181,0.667544,0.428341,0.263148,-0.326956,
+ -0.603758,0.432599,0.669577,0.386176,0.201223,-0.326853,
+ -0.77971,0.541974,0.313555,0.342801,0.212716,-0.405556,
+ -0.77971,0.541974,0.313555,0.342801,0.212716,-0.405556,
+ -0.770954,0.557417,0.308084,0.388123,0.27793,-0.405612,
+ -0.610536,0.426181,0.667544,0.428341,0.263148,-0.326956,
+ -0.820475,0.571682,0,0.328343,0.216547,-0.5,
+ -0.804241,0.594303,0,0.374717,0.282857,-0.5,
+ -0.770954,0.557417,0.308084,0.388123,0.27793,-0.405612,
+ -0.820475,0.571682,0,0.328343,0.216547,-0.5,
+ -0.770954,0.557417,0.308084,0.388123,0.27793,-0.405612,
+ -0.77971,0.541974,0.313555,0.342801,0.212716,-0.405556,
+ -0.804241,0.594303,0,0.374717,0.282857,-0.5,
+ -0.766999,0.641648,0,0.432577,0.358913,-0.5,
+ -0.740072,0.600901,0.302014,0.444878,0.352588,-0.404662,
+ -0.740072,0.600901,0.302014,0.444878,0.352588,-0.404662,
+ -0.770954,0.557417,0.308084,0.388123,0.27793,-0.405612,
+ -0.804241,0.594303,0,0.374717,0.282857,-0.5,
+ -0.595775,0.458968,0.659091,0.481782,0.333615,-0.325213,
+ -0.610536,0.426181,0.667544,0.428341,0.263148,-0.326956,
+ -0.770954,0.557417,0.308084,0.388123,0.27793,-0.405612,
+ -0.595775,0.458968,0.659091,0.481782,0.333615,-0.325213,
+ -0.770954,0.557417,0.308084,0.388123,0.27793,-0.405612,
+ -0.740072,0.600901,0.302014,0.444878,0.352588,-0.404662,
+ -0.304433,0.241938,0.921296,0.458468,0.182068,-0.279631,
+ -0.603758,0.432599,0.669577,0.386176,0.201223,-0.326853,
+ -0.610536,0.426181,0.667544,0.428341,0.263148,-0.326956,
+ -0.610536,0.426181,0.667544,0.428341,0.263148,-0.326956,
+ -0.317966,0.212815,0.923909,0.495371,0.238512,-0.279763,
+ -0.304433,0.241938,0.921296,0.458468,0.182068,-0.279631,
+ -0.595775,0.458968,0.659091,0.481782,0.333615,-0.325213,
+ -0.31459,0.228088,0.921417,0.543287,0.301992,-0.277544,
+ -0.317966,0.212815,0.923909,0.495371,0.238512,-0.279763,
+ -0.595775,0.458968,0.659091,0.481782,0.333615,-0.325213,
+ -0.317966,0.212815,0.923909,0.495371,0.238512,-0.279763,
+ -0.610536,0.426181,0.667544,0.428341,0.263148,-0.326956,
+ -0.31459,0.228088,0.921417,0.543287,0.301992,-0.277544,
+ -0.015914,-0.029529,0.999437,0.617093,0.264045,-0.261655,
+ -0.005469,-0.009402,0.999941,0.575807,0.208949,-0.264031,
+ -0.005469,-0.009402,0.999941,0.575807,0.208949,-0.264031,
+ -0.317966,0.212815,0.923909,0.495371,0.238512,-0.279763,
+ -0.31459,0.228088,0.921417,0.543287,0.301992,-0.277544,
+ 0.013842,0.059444,0.998136,0.545218,0.159081,-0.263891,
+ -0.304433,0.241938,0.921296,0.458468,0.182068,-0.279631,
+ -0.317966,0.212815,0.923909,0.495371,0.238512,-0.279763,
+ 0.013842,0.059444,0.998136,0.545218,0.159081,-0.263891,
+ -0.317966,0.212815,0.923909,0.495371,0.238512,-0.279763,
+ -0.005469,-0.009402,0.999941,0.575807,0.208949,-0.264031,
+ -0.459898,0.603331,0.651526,0.620074,0.472355,-0.321841,
+ -0.231331,0.321253,0.918304,0.671195,0.426029,-0.273252,
+ -0.288623,0.267481,0.919321,0.601974,0.3665,-0.274775,
+ -0.459898,0.603331,0.651526,0.620074,0.472355,-0.321841,
+ -0.288623,0.267481,0.919321,0.601974,0.3665,-0.274775,
+ -0.565284,0.537872,0.625418,0.545894,0.405668,-0.323037,
+ -0.231331,0.321253,0.918304,0.671195,0.426029,-0.273252,
+ 0.003382,-0.001295,0.999993,0.73254,0.370437,-0.257056,
+ -0.014673,-0.023374,0.999619,0.669271,0.319498,-0.258687,
+ -0.014673,-0.023374,0.999619,0.669271,0.319498,-0.258687,
+ -0.288623,0.267481,0.919321,0.601974,0.3665,-0.274775,
+ -0.231331,0.321253,0.918304,0.671195,0.426029,-0.273252,
+ -0.015914,-0.029529,0.999437,0.617093,0.264045,-0.261655,
+ -0.31459,0.228088,0.921417,0.543287,0.301992,-0.277544,
+ -0.288623,0.267481,0.919321,0.601974,0.3665,-0.274775,
+ -0.015914,-0.029529,0.999437,0.617093,0.264045,-0.261655,
+ -0.288623,0.267481,0.919321,0.601974,0.3665,-0.274775,
+ -0.014673,-0.023374,0.999619,0.669271,0.319498,-0.258687,
+ -0.31459,0.228088,0.921417,0.543287,0.301992,-0.277544,
+ -0.595775,0.458968,0.659091,0.481782,0.333615,-0.325213,
+ -0.565284,0.537872,0.625418,0.545894,0.405668,-0.323037,
+ -0.565284,0.537872,0.625418,0.545894,0.405668,-0.323037,
+ -0.288623,0.267481,0.919321,0.601974,0.3665,-0.274775,
+ -0.31459,0.228088,0.921417,0.543287,0.301992,-0.277544,
+ 0.214466,-0.34467,0.913896,0.793886,0.314845,-0.273252,
+ 0.37574,-0.67126,0.638928,0.845007,0.268518,-0.321841,
+ 0.473587,-0.60369,0.641306,0.792649,0.233327,-0.323037,
+ 0.473587,-0.60369,0.641306,0.792649,0.233327,-0.323037,
+ 0.248581,-0.323271,0.913073,0.736568,0.272496,-0.274775,
+ 0.214466,-0.34467,0.913896,0.793886,0.314845,-0.273252,
+ 0.525124,-0.503609,0.68602,0.752404,0.194475,-0.325213,
+ 0.282948,-0.282367,0.916629,0.690899,0.226098,-0.277544,
+ 0.248581,-0.323271,0.913073,0.736568,0.272496,-0.274775,
+ 0.525124,-0.503609,0.68602,0.752404,0.194475,-0.325213,
+ 0.248581,-0.323271,0.913073,0.736568,0.272496,-0.274775,
+ 0.473587,-0.60369,0.641306,0.792649,0.233327,-0.323037,
+ 0.282948,-0.282367,0.916629,0.690899,0.226098,-0.277544,
+ -0.015914,-0.029529,0.999437,0.617093,0.264045,-0.261655,
+ -0.014673,-0.023374,0.999619,0.669271,0.319498,-0.258687,
+ -0.014673,-0.023374,0.999619,0.669271,0.319498,-0.258687,
+ 0.248581,-0.323271,0.913073,0.736568,0.272496,-0.274775,
+ 0.282948,-0.282367,0.916629,0.690899,0.226098,-0.277544,
+ 0.003382,-0.001295,0.999993,0.73254,0.370437,-0.257056,
+ 0.214466,-0.34467,0.913896,0.793886,0.314845,-0.273252,
+ 0.248581,-0.323271,0.913073,0.736568,0.272496,-0.274775,
+ 0.003382,-0.001295,0.999993,0.73254,0.370437,-0.257056,
+ 0.248581,-0.323271,0.913073,0.736568,0.272496,-0.274775,
+ -0.014673,-0.023374,0.999619,0.669271,0.319498,-0.258687,
+ 0.677454,-0.2664,0.685629,0.704261,0.116939,-0.326853,
+ 0.344586,-0.098997,0.93352,0.631969,0.136095,-0.279631,
+ 0.314626,-0.214176,0.924737,0.656244,0.179386,-0.279763,
+ 0.677454,-0.2664,0.685629,0.704261,0.116939,-0.326853,
+ 0.314626,-0.214176,0.924737,0.656244,0.179386,-0.279763,
+ 0.617578,-0.419693,0.665173,0.723274,0.15475,-0.326956,
+ 0.344586,-0.098997,0.93352,0.631969,0.136095,-0.279631,
+ 0.013842,0.059444,0.998136,0.545218,0.159081,-0.263891,
+ -0.005469,-0.009402,0.999941,0.575807,0.208949,-0.264031,
+ -0.005469,-0.009402,0.999941,0.575807,0.208949,-0.264031,
+ 0.314626,-0.214176,0.924737,0.656244,0.179386,-0.279763,
+ 0.344586,-0.098997,0.93352,0.631969,0.136095,-0.279631,
+ -0.015914,-0.029529,0.999437,0.617093,0.264045,-0.261655,
+ 0.282948,-0.282367,0.916629,0.690899,0.226098,-0.277544,
+ 0.314626,-0.214176,0.924737,0.656244,0.179386,-0.279763,
+ -0.015914,-0.029529,0.999437,0.617093,0.264045,-0.261655,
+ 0.314626,-0.214176,0.924737,0.656244,0.179386,-0.279763,
+ -0.005469,-0.009402,0.999941,0.575807,0.208949,-0.264031,
+ 0.282948,-0.282367,0.916629,0.690899,0.226098,-0.277544,
+ 0.525124,-0.503609,0.68602,0.752404,0.194475,-0.325213,
+ 0.617578,-0.419693,0.665173,0.723274,0.15475,-0.326956,
+ 0.617578,-0.419693,0.665173,0.723274,0.15475,-0.326956,
+ 0.314626,-0.214176,0.924737,0.656244,0.179386,-0.279763,
+ 0.282948,-0.282367,0.916629,0.690899,0.226098,-0.277544,
+ 0.677454,-0.2664,0.685629,0.704261,0.116939,-0.326853,
+ 0.617578,-0.419693,0.665173,0.723274,0.15475,-0.326956,
+ 0.814068,-0.486717,0.316859,0.763492,0.139968,-0.405612,
+ 0.677454,-0.2664,0.685629,0.704261,0.116939,-0.326853,
+ 0.814068,-0.486717,0.316859,0.763492,0.139968,-0.405612,
+ 0.894665,-0.298343,0.332514,0.747636,0.105446,-0.405556,
+ 0.617578,-0.419693,0.665173,0.723274,0.15475,-0.326956,
+ 0.525124,-0.503609,0.68602,0.752404,0.194475,-0.325213,
+ 0.694632,-0.626894,0.352832,0.789307,0.175501,-0.404662,
+ 0.694632,-0.626894,0.352832,0.789307,0.175501,-0.404662,
+ 0.814068,-0.486717,0.316859,0.763492,0.139968,-0.405612,
+ 0.617578,-0.419693,0.665173,0.723274,0.15475,-0.326956,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.881754,-0.47171,0,0.776898,0.135041,-0.5,
+ 0.814068,-0.486717,0.316859,0.763492,0.139968,-0.405612,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.814068,-0.486717,0.316859,0.763492,0.139968,-0.405612,
+ 0.694632,-0.626894,0.352832,0.789307,0.175501,-0.404662,
+ 0.881754,-0.47171,0,0.776898,0.135041,-0.5,
+ 0.961956,-0.273203,0,0.762094,0.101615,-0.5,
+ 0.894665,-0.298343,0.332514,0.747636,0.105446,-0.405556,
+ 0.894665,-0.298343,0.332514,0.747636,0.105446,-0.405556,
+ 0.814068,-0.486717,0.316859,0.763492,0.139968,-0.405612,
+ 0.881754,-0.47171,0,0.776898,0.135041,-0.5,
+ 0.37574,-0.67126,0.638928,0.845007,0.268518,-0.321841,
+ 0.438584,-0.8515,0.287389,0.875679,0.240722,-0.402822,
+ 0.582001,-0.759448,0.290711,0.826297,0.209826,-0.403475,
+ 0.37574,-0.67126,0.638928,0.845007,0.268518,-0.321841,
+ 0.582001,-0.759448,0.290711,0.826297,0.209826,-0.403475,
+ 0.473587,-0.60369,0.641306,0.792649,0.233327,-0.323037,
+ 0.438584,-0.8515,0.287389,0.875679,0.240722,-0.402822,
+ 0.419512,-0.90775,0,0.885904,0.231457,-0.5,
+ 0.576871,-0.816835,0,0.837513,0.201992,-0.5,
+ 0.576871,-0.816835,0,0.837513,0.201992,-0.5,
+ 0.582001,-0.759448,0.290711,0.826297,0.209826,-0.403475,
+ 0.438584,-0.8515,0.287389,0.875679,0.240722,-0.402822,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.694632,-0.626894,0.352832,0.789307,0.175501,-0.404662,
+ 0.582001,-0.759448,0.290711,0.826297,0.209826,-0.403475,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.582001,-0.759448,0.290711,0.826297,0.209826,-0.403475,
+ 0.576871,-0.816835,0,0.837513,0.201992,-0.5,
+ 0.694632,-0.626894,0.352832,0.789307,0.175501,-0.404662,
+ 0.525124,-0.503609,0.68602,0.752404,0.194475,-0.325213,
+ 0.473587,-0.60369,0.641306,0.792649,0.233327,-0.323037,
+ 0.473587,-0.60369,0.641306,0.792649,0.233327,-0.323037,
+ 0.582001,-0.759448,0.290711,0.826297,0.209826,-0.403475,
+ 0.694632,-0.626894,0.352832,0.789307,0.175501,-0.404662,
+ 0.37574,-0.67126,-0.638928,0.845007,0.268518,-0.678159,
+ 0.473586,-0.60369,-0.641307,0.792649,0.233327,-0.676962,
+ 0.582001,-0.759448,-0.290711,0.826297,0.209826,-0.596525,
+ 0.37574,-0.67126,-0.638928,0.845007,0.268518,-0.678159,
+ 0.582001,-0.759448,-0.290711,0.826297,0.209826,-0.596525,
+ 0.438584,-0.8515,-0.287389,0.875679,0.240722,-0.597178,
+ 0.473586,-0.60369,-0.641307,0.792649,0.233327,-0.676962,
+ 0.525124,-0.503608,-0.68602,0.752404,0.194475,-0.674787,
+ 0.694632,-0.626893,-0.352832,0.789307,0.175501,-0.595338,
+ 0.694632,-0.626893,-0.352832,0.789307,0.175501,-0.595338,
+ 0.582001,-0.759448,-0.290711,0.826297,0.209826,-0.596525,
+ 0.473586,-0.60369,-0.641307,0.792649,0.233327,-0.676962,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.576871,-0.816835,0,0.837513,0.201992,-0.5,
+ 0.582001,-0.759448,-0.290711,0.826297,0.209826,-0.596525,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.582001,-0.759448,-0.290711,0.826297,0.209826,-0.596525,
+ 0.694632,-0.626893,-0.352832,0.789307,0.175501,-0.595338,
+ 0.576871,-0.816835,0,0.837513,0.201992,-0.5,
+ 0.419512,-0.90775,0,0.885904,0.231457,-0.5,
+ 0.438584,-0.8515,-0.287389,0.875679,0.240722,-0.597178,
+ 0.438584,-0.8515,-0.287389,0.875679,0.240722,-0.597178,
+ 0.582001,-0.759448,-0.290711,0.826297,0.209826,-0.596525,
+ 0.576871,-0.816835,0,0.837513,0.201992,-0.5,
+ 0.677454,-0.2664,-0.685629,0.704261,0.116939,-0.673147,
+ 0.894665,-0.298343,-0.332514,0.747636,0.105446,-0.594444,
+ 0.814068,-0.486716,-0.31686,0.763492,0.139968,-0.594388,
+ 0.677454,-0.2664,-0.685629,0.704261,0.116939,-0.673147,
+ 0.814068,-0.486716,-0.31686,0.763492,0.139968,-0.594388,
+ 0.617578,-0.419692,-0.665174,0.723274,0.15475,-0.673044,
+ 0.894665,-0.298343,-0.332514,0.747636,0.105446,-0.594444,
+ 0.961956,-0.273203,0,0.762094,0.101615,-0.5,
+ 0.881754,-0.47171,0,0.776898,0.135041,-0.5,
+ 0.881754,-0.47171,0,0.776898,0.135041,-0.5,
+ 0.814068,-0.486716,-0.31686,0.763492,0.139968,-0.594388,
+ 0.894665,-0.298343,-0.332514,0.747636,0.105446,-0.594444,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.694632,-0.626893,-0.352832,0.789307,0.175501,-0.595338,
+ 0.814068,-0.486716,-0.31686,0.763492,0.139968,-0.594388,
+ 0.746099,-0.665835,0,0.801608,0.169177,-0.5,
+ 0.814068,-0.486716,-0.31686,0.763492,0.139968,-0.594388,
+ 0.881754,-0.47171,0,0.776898,0.135041,-0.5,
+ 0.694632,-0.626893,-0.352832,0.789307,0.175501,-0.595338,
+ 0.525124,-0.503608,-0.68602,0.752404,0.194475,-0.674787,
+ 0.617578,-0.419692,-0.665174,0.723274,0.15475,-0.673044,
+ 0.617578,-0.419692,-0.665174,0.723274,0.15475,-0.673044,
+ 0.814068,-0.486716,-0.31686,0.763492,0.139968,-0.594388,
+ 0.694632,-0.626893,-0.352832,0.789307,0.175501,-0.595338,
+ 0.691984,-0.189259,0.696663,0.694366,0.083832,-0.323491,
+ 0.677454,-0.2664,0.685629,0.704261,0.116939,-0.326853,
+ 0.894665,-0.298343,0.332514,0.747636,0.105446,-0.405556,
+ 0.894665,-0.298343,0.332514,0.747636,0.105446,-0.405556,
+ 0.903923,-0.26074,0.339026,0.740522,0.074155,-0.403722,
+ 0.691984,-0.189259,0.696663,0.694366,0.083832,-0.323491,
+ 0.961956,-0.273203,0,0.762094,0.101615,-0.5,
+ 0.957991,-0.286797,0,0.755907,0.07093,-0.5,
+ 0.903923,-0.26074,0.339026,0.740522,0.074155,-0.403722,
+ 0.961956,-0.273203,0,0.762094,0.101615,-0.5,
+ 0.903923,-0.26074,0.339026,0.740522,0.074155,-0.403722,
+ 0.894665,-0.298343,0.332514,0.747636,0.105446,-0.405556,
+ 0.957991,-0.286797,0,0.755907,0.07093,-0.5,
+ 0.740764,-0.671765,0,0.747335,0.045755,-0.5,
+ 0.78946,-0.545462,0.281469,0.731601,0.048967,-0.404556,
+ 0.78946,-0.545462,0.281469,0.731601,0.048967,-0.404556,
+ 0.903923,-0.26074,0.339026,0.740522,0.074155,-0.403722,
+ 0.957991,-0.286797,0,0.755907,0.07093,-0.5,
+ 0.570752,-0.537595,0.620673,0.684631,0.057942,-0.324904,
+ 0.691984,-0.189259,0.696663,0.694366,0.083832,-0.323491,
+ 0.903923,-0.26074,0.339026,0.740522,0.074155,-0.403722,
+ 0.570752,-0.537595,0.620673,0.684631,0.057942,-0.324904,
+ 0.903923,-0.26074,0.339026,0.740522,0.074155,-0.403722,
+ 0.78946,-0.545462,0.281469,0.731601,0.048967,-0.404556,
+ 0.894665,-0.298343,-0.332514,0.747636,0.105446,-0.594444,
+ 0.677454,-0.2664,-0.685629,0.704261,0.116939,-0.673147,
+ 0.691984,-0.189259,-0.696663,0.694366,0.083832,-0.676509,
+ 0.691984,-0.189259,-0.696663,0.694366,0.083832,-0.676509,
+ 0.903923,-0.26074,-0.339025,0.740522,0.074155,-0.596277,
+ 0.894665,-0.298343,-0.332514,0.747636,0.105446,-0.594444,
+ 0.570751,-0.537595,-0.620672,0.684631,0.057942,-0.675096,
+ 0.789459,-0.545462,-0.281469,0.731601,0.048967,-0.595444,
+ 0.903923,-0.26074,-0.339025,0.740522,0.074155,-0.596277,
+ 0.570751,-0.537595,-0.620672,0.684631,0.057942,-0.675096,
+ 0.903923,-0.26074,-0.339025,0.740522,0.074155,-0.596277,
+ 0.691984,-0.189259,-0.696663,0.694366,0.083832,-0.676509,
+ 0.789459,-0.545462,-0.281469,0.731601,0.048967,-0.595444,
+ 0.740764,-0.671765,0,0.747335,0.045755,-0.5,
+ 0.957991,-0.286797,0,0.755907,0.07093,-0.5,
+ 0.957991,-0.286797,0,0.755907,0.07093,-0.5,
+ 0.903923,-0.26074,-0.339025,0.740522,0.074155,-0.596277,
+ 0.789459,-0.545462,-0.281469,0.731601,0.048967,-0.595444,
+ 0.961956,-0.273203,0,0.762094,0.101615,-0.5,
+ 0.894665,-0.298343,-0.332514,0.747636,0.105446,-0.594444,
+ 0.903923,-0.26074,-0.339025,0.740522,0.074155,-0.596277,
+ 0.961956,-0.273203,0,0.762094,0.101615,-0.5,
+ 0.903923,-0.26074,-0.339025,0.740522,0.074155,-0.596277,
+ 0.957991,-0.286797,0,0.755907,0.07093,-0.5,
+ 0.029695,-0.979483,-0.199329,0.642426,0.035438,-0.638667,
+ 0.015839,-0.994833,-0.100277,0.667212,0.026513,-0.5825,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.029695,-0.979483,-0.199329,0.642426,0.035438,-0.638667,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.21248,-0.884802,-0.414701,0.666096,0.041783,-0.660875,
+ 0.072467,-0.997371,0,0.679568,0.022087,-0.5,
+ 0.389749,-0.920921,0,0.725378,0.028862,-0.5,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.072467,-0.997371,0,0.679568,0.022087,-0.5,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.015839,-0.994833,-0.100277,0.667212,0.026513,-0.5825,
+ 0.740764,-0.671765,0,0.747335,0.045755,-0.5,
+ 0.789459,-0.545462,-0.281469,0.731601,0.048967,-0.595444,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.740764,-0.671765,0,0.747335,0.045755,-0.5,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.389749,-0.920921,0,0.725378,0.028862,-0.5,
+ 0.570751,-0.537595,-0.620672,0.684631,0.057942,-0.675096,
+ 0.21248,-0.884802,-0.414701,0.666096,0.041783,-0.660875,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.570751,-0.537595,-0.620672,0.684631,0.057942,-0.675096,
+ 0.33287,-0.922331,-0.196223,0.710325,0.03275,-0.5875,
+ 0.789459,-0.545462,-0.281469,0.731601,0.048967,-0.595444,
+ 0.029695,-0.979483,0.199329,0.642426,0.035438,-0.361333,
+ 0.21248,-0.884802,0.414702,0.666096,0.041783,-0.339125,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.029695,-0.979483,0.199329,0.642426,0.035438,-0.361333,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.015839,-0.994833,0.100277,0.667212,0.026513,-0.4175,
+ 0.570752,-0.537595,0.620673,0.684631,0.057942,-0.324904,
+ 0.78946,-0.545462,0.281469,0.731601,0.048967,-0.404556,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.570752,-0.537595,0.620673,0.684631,0.057942,-0.324904,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.21248,-0.884802,0.414702,0.666096,0.041783,-0.339125,
+ 0.740764,-0.671765,0,0.747335,0.045755,-0.5,
+ 0.389749,-0.920921,0,0.725378,0.028862,-0.5,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.740764,-0.671765,0,0.747335,0.045755,-0.5,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.78946,-0.545462,0.281469,0.731601,0.048967,-0.404556,
+ 0.072467,-0.997371,0,0.679568,0.022087,-0.5,
+ 0.015839,-0.994833,0.100277,0.667212,0.026513,-0.4175,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.072467,-0.997371,0,0.679568,0.022087,-0.5,
+ 0.33287,-0.922331,0.196223,0.710325,0.03275,-0.4125,
+ 0.389749,-0.920921,0,0.725378,0.028862,-0.5,
+ 0.691984,-0.189259,-0.696663,0.694366,0.083832,-0.676509,
+ 0.677454,-0.2664,-0.685629,0.704261,0.116939,-0.673147,
+ 0.344586,-0.098997,-0.93352,0.631969,0.136095,-0.720369,
+ 0.344586,-0.098997,-0.93352,0.631969,0.136095,-0.720369,
+ 0.338241,-0.103362,-0.935366,0.61744,0.099959,-0.724648,
+ 0.691984,-0.189259,-0.696663,0.694366,0.083832,-0.676509,
+ 0.013842,0.059444,-0.998136,0.545218,0.159081,-0.736109,
+ 0.007661,0.031192,-0.999484,0.525128,0.119312,-0.740694,
+ 0.338241,-0.103362,-0.935366,0.61744,0.099959,-0.724648,
+ 0.013842,0.059444,-0.998136,0.545218,0.159081,-0.736109,
+ 0.338241,-0.103362,-0.935366,0.61744,0.099959,-0.724648,
+ 0.344586,-0.098997,-0.93352,0.631969,0.136095,-0.720369,
+ 0.007661,0.031192,-0.999484,0.525128,0.119312,-0.740694,
+ -0.09747,-0.388654,-0.916214,0.513237,0.088956,-0.739298,
+ 0.227406,-0.473471,-0.850947,0.606658,0.072023,-0.723162,
+ 0.227406,-0.473471,-0.850947,0.606658,0.072023,-0.723162,
+ 0.338241,-0.103362,-0.935366,0.61744,0.099959,-0.724648,
+ 0.007661,0.031192,-0.999484,0.525128,0.119312,-0.740694,
+ 0.570751,-0.537595,-0.620672,0.684631,0.057942,-0.675096,
+ 0.691984,-0.189259,-0.696663,0.694366,0.083832,-0.676509,
+ 0.338241,-0.103362,-0.935366,0.61744,0.099959,-0.724648,
+ 0.570751,-0.537595,-0.620672,0.684631,0.057942,-0.675096,
+ 0.338241,-0.103362,-0.935366,0.61744,0.099959,-0.724648,
+ 0.227406,-0.473471,-0.850947,0.606658,0.072023,-0.723162,
+ -0.603758,0.432599,-0.669577,0.386176,0.201223,-0.673147,
+ -0.649491,0.313781,-0.692606,0.355891,0.154793,-0.676509,
+ -0.317034,0.182994,-0.930593,0.432817,0.138665,-0.724648,
+ -0.603758,0.432599,-0.669577,0.386176,0.201223,-0.673147,
+ -0.317034,0.182994,-0.930593,0.432817,0.138665,-0.724648,
+ -0.304433,0.241938,-0.921296,0.458468,0.182068,-0.720369,
+ -0.649491,0.313781,-0.692606,0.355891,0.154793,-0.676509,
+ -0.720224,-0.15594,-0.675988,0.342054,0.121167,-0.675096,
+ -0.440529,-0.24065,-0.864882,0.419921,0.106487,-0.723162,
+ -0.440529,-0.24065,-0.864882,0.419921,0.106487,-0.723162,
+ -0.317034,0.182994,-0.930593,0.432817,0.138665,-0.724648,
+ -0.649491,0.313781,-0.692606,0.355891,0.154793,-0.676509,
+ -0.09747,-0.388654,-0.916214,0.513237,0.088956,-0.739298,
+ 0.007661,0.031192,-0.999484,0.525128,0.119312,-0.740694,
+ -0.317034,0.182994,-0.930593,0.432817,0.138665,-0.724648,
+ -0.09747,-0.388654,-0.916214,0.513237,0.088956,-0.739298,
+ -0.317034,0.182994,-0.930593,0.432817,0.138665,-0.724648,
+ -0.440529,-0.24065,-0.864882,0.419921,0.106487,-0.723162,
+ 0.007661,0.031192,-0.999484,0.525128,0.119312,-0.740694,
+ 0.013842,0.059444,-0.998136,0.545218,0.159081,-0.736109,
+ -0.304433,0.241938,-0.921296,0.458468,0.182068,-0.720369,
+ -0.304433,0.241938,-0.921296,0.458468,0.182068,-0.720369,
+ -0.317034,0.182994,-0.930593,0.432817,0.138665,-0.724648,
+ 0.007661,0.031192,-0.999484,0.525128,0.119312,-0.740694,
+ -0.560128,-0.705465,-0.434253,0.349234,0.097654,-0.660875,
+ -0.364711,-0.913648,-0.179534,0.369306,0.083596,-0.638667,
+ -0.280571,-0.938896,-0.199385,0.423841,0.069426,-0.664625,
+ -0.280571,-0.938896,-0.199385,0.423841,0.069426,-0.664625,
+ -0.32072,-0.774629,-0.545059,0.421284,0.083716,-0.706,
+ -0.560128,-0.705465,-0.434253,0.349234,0.097654,-0.660875,
+ -0.168375,-0.954904,-0.244557,0.504703,0.05292,-0.677562,
+ -0.143026,-0.80792,-0.571672,0.507243,0.067325,-0.7215,
+ -0.32072,-0.774629,-0.545059,0.421284,0.083716,-0.706,
+ -0.168375,-0.954904,-0.244557,0.504703,0.05292,-0.677562,
+ -0.32072,-0.774629,-0.545059,0.421284,0.083716,-0.706,
+ -0.280571,-0.938896,-0.199385,0.423841,0.069426,-0.664625,
+ -0.09747,-0.388654,-0.916214,0.513237,0.088956,-0.739298,
+ -0.440529,-0.24065,-0.864882,0.419921,0.106487,-0.723162,
+ -0.32072,-0.774629,-0.545059,0.421284,0.083716,-0.706,
+ -0.09747,-0.388654,-0.916214,0.513237,0.088956,-0.739298,
+ -0.32072,-0.774629,-0.545059,0.421284,0.083716,-0.706,
+ -0.143026,-0.80792,-0.571672,0.507243,0.067325,-0.7215,
+ -0.440529,-0.24065,-0.864882,0.419921,0.106487,-0.723162,
+ -0.720224,-0.15594,-0.675988,0.342054,0.121167,-0.675096,
+ -0.560128,-0.705465,-0.434253,0.349234,0.097654,-0.660875,
+ -0.560128,-0.705465,-0.434253,0.349234,0.097654,-0.660875,
+ -0.32072,-0.774629,-0.545059,0.421284,0.083716,-0.706,
+ -0.440529,-0.24065,-0.864882,0.419921,0.106487,-0.723162,
+ 0.029695,-0.979483,-0.199329,0.642426,0.035438,-0.638667,
+ 0.21248,-0.884802,-0.414701,0.666096,0.041783,-0.660875,
+ 0.024087,-0.872904,-0.487296,0.593625,0.053327,-0.706,
+ 0.029695,-0.979483,-0.199329,0.642426,0.035438,-0.638667,
+ 0.024087,-0.872904,-0.487296,0.593625,0.053327,-0.706,
+ -0.070895,-0.97954,-0.18835,0.586334,0.040774,-0.664625,
+ 0.21248,-0.884802,-0.414701,0.666096,0.041783,-0.660875,
+ 0.570751,-0.537595,-0.620672,0.684631,0.057942,-0.675096,
+ 0.227406,-0.473471,-0.850947,0.606658,0.072023,-0.723162,
+ 0.227406,-0.473471,-0.850947,0.606658,0.072023,-0.723162,
+ 0.024087,-0.872904,-0.487296,0.593625,0.053327,-0.706,
+ 0.21248,-0.884802,-0.414701,0.666096,0.041783,-0.660875,
+ -0.09747,-0.388654,-0.916214,0.513237,0.088956,-0.739298,
+ -0.143026,-0.80792,-0.571672,0.507243,0.067325,-0.7215,
+ 0.024087,-0.872904,-0.487296,0.593625,0.053327,-0.706,
+ -0.09747,-0.388654,-0.916214,0.513237,0.088956,-0.739298,
+ 0.024087,-0.872904,-0.487296,0.593625,0.053327,-0.706,
+ 0.227406,-0.473471,-0.850947,0.606658,0.072023,-0.723162,
+ -0.168375,-0.954904,-0.244557,0.504703,0.05292,-0.677562,
+ -0.070895,-0.97954,-0.18835,0.586334,0.040774,-0.664625,
+ 0.024087,-0.872904,-0.487296,0.593625,0.053327,-0.706,
+ -0.168375,-0.954904,-0.244557,0.504703,0.05292,-0.677562,
+ 0.024087,-0.872904,-0.487296,0.593625,0.053327,-0.706,
+ -0.143026,-0.80792,-0.571672,0.507243,0.067325,-0.7215,
+ -0.603758,0.432599,-0.669577,0.386176,0.201223,-0.673147,
+ -0.77971,0.541974,-0.313555,0.342801,0.212716,-0.594444,
+ -0.828821,0.45488,-0.325791,0.309735,0.164469,-0.596277,
+ -0.603758,0.432599,-0.669577,0.386176,0.201223,-0.673147,
+ -0.828821,0.45488,-0.325791,0.309735,0.164469,-0.596277,
+ -0.649491,0.313781,-0.692606,0.355891,0.154793,-0.676509,
+ -0.77971,0.541974,-0.313555,0.342801,0.212716,-0.594444,
+ -0.820475,0.571682,0,0.328343,0.216547,-0.5,
+ -0.857982,0.51368,0,0.29435,0.167695,-0.5,
+ -0.857982,0.51368,0,0.29435,0.167695,-0.5,
+ -0.828821,0.45488,-0.325791,0.309735,0.164469,-0.596277,
+ -0.77971,0.541974,-0.313555,0.342801,0.212716,-0.594444,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.916555,-0.053852,-0.396267,0.294978,0.129544,-0.595444,
+ -0.828821,0.45488,-0.325791,0.309735,0.164469,-0.596277,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.828821,0.45488,-0.325791,0.309735,0.164469,-0.596277,
+ -0.857982,0.51368,0,0.29435,0.167695,-0.5,
+ -0.916555,-0.053852,-0.396267,0.294978,0.129544,-0.595444,
+ -0.720224,-0.15594,-0.675988,0.342054,0.121167,-0.675096,
+ -0.649491,0.313781,-0.692606,0.355891,0.154793,-0.676509,
+ -0.649491,0.313781,-0.692606,0.355891,0.154793,-0.676509,
+ -0.828821,0.45488,-0.325791,0.309735,0.164469,-0.596277,
+ -0.916555,-0.053852,-0.396267,0.294978,0.129544,-0.595444,
+ -0.603758,0.432599,0.669577,0.386176,0.201223,-0.326853,
+ -0.649491,0.313782,0.692606,0.355891,0.154793,-0.323491,
+ -0.828821,0.454881,0.325791,0.309735,0.164469,-0.403722,
+ -0.603758,0.432599,0.669577,0.386176,0.201223,-0.326853,
+ -0.828821,0.454881,0.325791,0.309735,0.164469,-0.403722,
+ -0.77971,0.541974,0.313555,0.342801,0.212716,-0.405556,
+ -0.649491,0.313782,0.692606,0.355891,0.154793,-0.323491,
+ -0.720224,-0.155939,0.675988,0.342054,0.121167,-0.324904,
+ -0.916555,-0.053852,0.396267,0.294978,0.129544,-0.404556,
+ -0.916555,-0.053852,0.396267,0.294978,0.129544,-0.404556,
+ -0.828821,0.454881,0.325791,0.309735,0.164469,-0.403722,
+ -0.649491,0.313782,0.692606,0.355891,0.154793,-0.323491,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.857982,0.51368,0,0.29435,0.167695,-0.5,
+ -0.828821,0.454881,0.325791,0.309735,0.164469,-0.403722,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.828821,0.454881,0.325791,0.309735,0.164469,-0.403722,
+ -0.916555,-0.053852,0.396267,0.294978,0.129544,-0.404556,
+ -0.857982,0.51368,0,0.29435,0.167695,-0.5,
+ -0.820475,0.571682,0,0.328343,0.216547,-0.5,
+ -0.77971,0.541974,0.313555,0.342801,0.212716,-0.405556,
+ -0.77971,0.541974,0.313555,0.342801,0.212716,-0.405556,
+ -0.828821,0.454881,0.325791,0.309735,0.164469,-0.403722,
+ -0.857982,0.51368,0,0.29435,0.167695,-0.5,
+ -0.364711,-0.913648,0.179534,0.369306,0.083596,-0.361333,
+ -0.355137,-0.92942,0.100277,0.342964,0.083687,-0.4175,
+ -0.672934,-0.714357,0.191973,0.304584,0.104293,-0.4125,
+ -0.364711,-0.913648,0.179534,0.369306,0.083596,-0.361333,
+ -0.672934,-0.714357,0.191973,0.304584,0.104293,-0.4125,
+ -0.560128,-0.705466,0.434252,0.349234,0.097654,-0.339125,
+ -0.409218,-0.912437,0,0.329838,0.083754,-0.5,
+ -0.75175,-0.659448,0,0.289108,0.105788,-0.5,
+ -0.672934,-0.714357,0.191973,0.304584,0.104293,-0.4125,
+ -0.409218,-0.912437,0,0.329838,0.083754,-0.5,
+ -0.672934,-0.714357,0.191973,0.304584,0.104293,-0.4125,
+ -0.355137,-0.92942,0.100277,0.342964,0.083687,-0.4175,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.916555,-0.053852,0.396267,0.294978,0.129544,-0.404556,
+ -0.672934,-0.714357,0.191973,0.304584,0.104293,-0.4125,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.672934,-0.714357,0.191973,0.304584,0.104293,-0.4125,
+ -0.75175,-0.659448,0,0.289108,0.105788,-0.5,
+ -0.916555,-0.053852,0.396267,0.294978,0.129544,-0.404556,
+ -0.720224,-0.155939,0.675988,0.342054,0.121167,-0.324904,
+ -0.560128,-0.705466,0.434252,0.349234,0.097654,-0.339125,
+ -0.560128,-0.705466,0.434252,0.349234,0.097654,-0.339125,
+ -0.672934,-0.714357,0.191973,0.304584,0.104293,-0.4125,
+ -0.916555,-0.053852,0.396267,0.294978,0.129544,-0.404556,
+ -0.364711,-0.913648,-0.179534,0.369306,0.083596,-0.638667,
+ -0.560128,-0.705465,-0.434253,0.349234,0.097654,-0.660875,
+ -0.672934,-0.714357,-0.191973,0.304584,0.104293,-0.5875,
+ -0.364711,-0.913648,-0.179534,0.369306,0.083596,-0.638667,
+ -0.672934,-0.714357,-0.191973,0.304584,0.104293,-0.5875,
+ -0.355137,-0.92942,-0.100277,0.342964,0.083687,-0.5825,
+ -0.560128,-0.705465,-0.434253,0.349234,0.097654,-0.660875,
+ -0.720224,-0.15594,-0.675988,0.342054,0.121167,-0.675096,
+ -0.916555,-0.053852,-0.396267,0.294978,0.129544,-0.595444,
+ -0.916555,-0.053852,-0.396267,0.294978,0.129544,-0.595444,
+ -0.672934,-0.714357,-0.191973,0.304584,0.104293,-0.5875,
+ -0.560128,-0.705465,-0.434253,0.349234,0.097654,-0.660875,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.75175,-0.659448,0,0.289108,0.105788,-0.5,
+ -0.672934,-0.714357,-0.191973,0.304584,0.104293,-0.5875,
+ -0.999967,0.008167,0,0.279139,0.132156,-0.5,
+ -0.672934,-0.714357,-0.191973,0.304584,0.104293,-0.5875,
+ -0.916555,-0.053852,-0.396267,0.294978,0.129544,-0.595444,
+ -0.409218,-0.912437,0,0.329838,0.083754,-0.5,
+ -0.355137,-0.92942,-0.100277,0.342964,0.083687,-0.5825,
+ -0.672934,-0.714357,-0.191973,0.304584,0.104293,-0.5875,
+ -0.409218,-0.912437,0,0.329838,0.083754,-0.5,
+ -0.672934,-0.714357,-0.191973,0.304584,0.104293,-0.5875,
+ -0.75175,-0.659448,0,0.289108,0.105788,-0.5,
+ -0.603758,0.432599,0.669577,0.386176,0.201223,-0.326853,
+ -0.304433,0.241938,0.921296,0.458468,0.182068,-0.279631,
+ -0.317035,0.182994,0.930592,0.432817,0.138665,-0.275352,
+ -0.603758,0.432599,0.669577,0.386176,0.201223,-0.326853,
+ -0.317035,0.182994,0.930592,0.432817,0.138665,-0.275352,
+ -0.649491,0.313782,0.692606,0.355891,0.154793,-0.323491,
+ -0.304433,0.241938,0.921296,0.458468,0.182068,-0.279631,
+ 0.013842,0.059444,0.998136,0.545218,0.159081,-0.263891,
+ 0.007661,0.031192,0.999484,0.525128,0.119312,-0.259306,
+ 0.007661,0.031192,0.999484,0.525128,0.119312,-0.259306,
+ -0.317035,0.182994,0.930592,0.432817,0.138665,-0.275352,
+ -0.304433,0.241938,0.921296,0.458468,0.182068,-0.279631,
+ -0.09747,-0.388653,0.916214,0.513237,0.088956,-0.260702,
+ -0.44053,-0.240649,0.864882,0.419921,0.106487,-0.276838,
+ -0.317035,0.182994,0.930592,0.432817,0.138665,-0.275352,
+ -0.09747,-0.388653,0.916214,0.513237,0.088956,-0.260702,
+ -0.317035,0.182994,0.930592,0.432817,0.138665,-0.275352,
+ 0.007661,0.031192,0.999484,0.525128,0.119312,-0.259306,
+ -0.44053,-0.240649,0.864882,0.419921,0.106487,-0.276838,
+ -0.720224,-0.155939,0.675988,0.342054,0.121167,-0.324904,
+ -0.649491,0.313782,0.692606,0.355891,0.154793,-0.323491,
+ -0.649491,0.313782,0.692606,0.355891,0.154793,-0.323491,
+ -0.317035,0.182994,0.930592,0.432817,0.138665,-0.275352,
+ -0.44053,-0.240649,0.864882,0.419921,0.106487,-0.276838,
+ 0.344586,-0.098997,0.93352,0.631969,0.136095,-0.279631,
+ 0.677454,-0.2664,0.685629,0.704261,0.116939,-0.326853,
+ 0.691984,-0.189259,0.696663,0.694366,0.083832,-0.323491,
+ 0.691984,-0.189259,0.696663,0.694366,0.083832,-0.323491,
+ 0.338242,-0.103362,0.935366,0.61744,0.099959,-0.275352,
+ 0.344586,-0.098997,0.93352,0.631969,0.136095,-0.279631,
+ 0.570752,-0.537595,0.620673,0.684631,0.057942,-0.324904,
+ 0.227406,-0.473471,0.850948,0.606658,0.072023,-0.276838,
+ 0.338242,-0.103362,0.935366,0.61744,0.099959,-0.275352,
+ 0.570752,-0.537595,0.620673,0.684631,0.057942,-0.324904,
+ 0.338242,-0.103362,0.935366,0.61744,0.099959,-0.275352,
+ 0.691984,-0.189259,0.696663,0.694366,0.083832,-0.323491,
+ 0.227406,-0.473471,0.850948,0.606658,0.072023,-0.276838,
+ -0.09747,-0.388653,0.916214,0.513237,0.088956,-0.260702,
+ 0.007661,0.031192,0.999484,0.525128,0.119312,-0.259306,
+ 0.007661,0.031192,0.999484,0.525128,0.119312,-0.259306,
+ 0.338242,-0.103362,0.935366,0.61744,0.099959,-0.275352,
+ 0.227406,-0.473471,0.850948,0.606658,0.072023,-0.276838,
+ 0.013842,0.059444,0.998136,0.545218,0.159081,-0.263891,
+ 0.344586,-0.098997,0.93352,0.631969,0.136095,-0.279631,
+ 0.338242,-0.103362,0.935366,0.61744,0.099959,-0.275352,
+ 0.013842,0.059444,0.998136,0.545218,0.159081,-0.263891,
+ 0.338242,-0.103362,0.935366,0.61744,0.099959,-0.275352,
+ 0.007661,0.031192,0.999484,0.525128,0.119312,-0.259306,
+ 0.029695,-0.979483,0.199329,0.642426,0.035438,-0.361333,
+ -0.070895,-0.97954,0.188349,0.586334,0.040774,-0.335375,
+ 0.024087,-0.872904,0.487296,0.593625,0.053327,-0.294,
+ 0.029695,-0.979483,0.199329,0.642426,0.035438,-0.361333,
+ 0.024087,-0.872904,0.487296,0.593625,0.053327,-0.294,
+ 0.21248,-0.884802,0.414702,0.666096,0.041783,-0.339125,
+ -0.168376,-0.954904,0.244557,0.504703,0.05292,-0.322437,
+ -0.143026,-0.80792,0.571672,0.507243,0.067325,-0.2785,
+ 0.024087,-0.872904,0.487296,0.593625,0.053327,-0.294,
+ -0.168376,-0.954904,0.244557,0.504703,0.05292,-0.322437,
+ 0.024087,-0.872904,0.487296,0.593625,0.053327,-0.294,
+ -0.070895,-0.97954,0.188349,0.586334,0.040774,-0.335375,
+ -0.09747,-0.388653,0.916214,0.513237,0.088956,-0.260702,
+ 0.227406,-0.473471,0.850948,0.606658,0.072023,-0.276838,
+ 0.024087,-0.872904,0.487296,0.593625,0.053327,-0.294,
+ -0.09747,-0.388653,0.916214,0.513237,0.088956,-0.260702,
+ 0.024087,-0.872904,0.487296,0.593625,0.053327,-0.294,
+ -0.143026,-0.80792,0.571672,0.507243,0.067325,-0.2785,
+ 0.227406,-0.473471,0.850948,0.606658,0.072023,-0.276838,
+ 0.570752,-0.537595,0.620673,0.684631,0.057942,-0.324904,
+ 0.21248,-0.884802,0.414702,0.666096,0.041783,-0.339125,
+ 0.21248,-0.884802,0.414702,0.666096,0.041783,-0.339125,
+ 0.024087,-0.872904,0.487296,0.593625,0.053327,-0.294,
+ 0.227406,-0.473471,0.850948,0.606658,0.072023,-0.276838,
+ -0.280571,-0.938896,0.199385,0.423841,0.069426,-0.335375,
+ -0.364711,-0.913648,0.179534,0.369306,0.083596,-0.361333,
+ -0.560128,-0.705466,0.434252,0.349234,0.097654,-0.339125,
+ -0.560128,-0.705466,0.434252,0.349234,0.097654,-0.339125,
+ -0.32072,-0.774629,0.545059,0.421284,0.083716,-0.294,
+ -0.280571,-0.938896,0.199385,0.423841,0.069426,-0.335375,
+ -0.560128,-0.705466,0.434252,0.349234,0.097654,-0.339125,
+ -0.720224,-0.155939,0.675988,0.342054,0.121167,-0.324904,
+ -0.44053,-0.240649,0.864882,0.419921,0.106487,-0.276838,
+ -0.44053,-0.240649,0.864882,0.419921,0.106487,-0.276838,
+ -0.32072,-0.774629,0.545059,0.421284,0.083716,-0.294,
+ -0.560128,-0.705466,0.434252,0.349234,0.097654,-0.339125,
+ -0.09747,-0.388653,0.916214,0.513237,0.088956,-0.260702,
+ -0.143026,-0.80792,0.571672,0.507243,0.067325,-0.2785,
+ -0.32072,-0.774629,0.545059,0.421284,0.083716,-0.294,
+ -0.09747,-0.388653,0.916214,0.513237,0.088956,-0.260702,
+ -0.32072,-0.774629,0.545059,0.421284,0.083716,-0.294,
+ -0.44053,-0.240649,0.864882,0.419921,0.106487,-0.276838,
+ -0.168376,-0.954904,0.244557,0.504703,0.05292,-0.322437,
+ -0.280571,-0.938896,0.199385,0.423841,0.069426,-0.335375,
+ -0.32072,-0.774629,0.545059,0.421284,0.083716,-0.294,
+ -0.168376,-0.954904,0.244557,0.504703,0.05292,-0.322437,
+ -0.32072,-0.774629,0.545059,0.421284,0.083716,-0.294,
+ -0.143026,-0.80792,0.571672,0.507243,0.067325,-0.2785,
+ 0.029695,-0.979483,-0.199329,0.642426,0.035438,-0.638667,
+ -0.070895,-0.97954,-0.18835,0.586334,0.040774,-0.664625,
+ -0.094013,-0.992373,-0.079739,0.592781,0.031264,-0.5905,
+ 0.029695,-0.979483,-0.199329,0.642426,0.035438,-0.638667,
+ -0.094013,-0.992373,-0.079739,0.592781,0.031264,-0.5905,
+ 0.015839,-0.994833,-0.100277,0.667212,0.026513,-0.5825,
+ -0.070895,-0.97954,-0.18835,0.586334,0.040774,-0.664625,
+ -0.168375,-0.954904,-0.244557,0.504703,0.05292,-0.677562,
+ -0.17302,-0.981247,-0.08496,0.503173,0.044243,-0.59775,
+ -0.17302,-0.981247,-0.08496,0.503173,0.044243,-0.59775,
+ -0.094013,-0.992373,-0.079739,0.592781,0.031264,-0.5905,
+ -0.070895,-0.97954,-0.18835,0.586334,0.040774,-0.664625,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.089351,-0.996,0,0.599438,0.027269,-0.5,
+ -0.094013,-0.992373,-0.079739,0.592781,0.031264,-0.5905,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.094013,-0.992373,-0.079739,0.592781,0.031264,-0.5905,
+ -0.17302,-0.981247,-0.08496,0.503173,0.044243,-0.59775,
+ -0.089351,-0.996,0,0.599438,0.027269,-0.5,
+ 0.072467,-0.997371,0,0.679568,0.022087,-0.5,
+ 0.015839,-0.994833,-0.100277,0.667212,0.026513,-0.5825,
+ 0.015839,-0.994833,-0.100277,0.667212,0.026513,-0.5825,
+ -0.094013,-0.992373,-0.079739,0.592781,0.031264,-0.5905,
+ -0.089351,-0.996,0,0.599438,0.027269,-0.5,
+ -0.364711,-0.913648,-0.179534,0.369306,0.083596,-0.638667,
+ -0.355137,-0.92942,-0.100277,0.342964,0.083687,-0.5825,
+ -0.251068,-0.964679,-0.079739,0.414531,0.062694,-0.5905,
+ -0.364711,-0.913648,-0.179534,0.369306,0.083596,-0.638667,
+ -0.251068,-0.964679,-0.079739,0.414531,0.062694,-0.5905,
+ -0.280571,-0.938896,-0.199385,0.423841,0.069426,-0.664625,
+ -0.355137,-0.92942,-0.100277,0.342964,0.083687,-0.5825,
+ -0.409218,-0.912437,0,0.329838,0.083754,-0.5,
+ -0.25669,-0.966494,0,0.406908,0.061217,-0.5,
+ -0.25669,-0.966494,0,0.406908,0.061217,-0.5,
+ -0.251068,-0.964679,-0.079739,0.414531,0.062694,-0.5905,
+ -0.355137,-0.92942,-0.100277,0.342964,0.083687,-0.5825,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.17302,-0.981247,-0.08496,0.503173,0.044243,-0.59775,
+ -0.251068,-0.964679,-0.079739,0.414531,0.062694,-0.5905,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.251068,-0.964679,-0.079739,0.414531,0.062694,-0.5905,
+ -0.25669,-0.966494,0,0.406908,0.061217,-0.5,
+ -0.17302,-0.981247,-0.08496,0.503173,0.044243,-0.59775,
+ -0.168375,-0.954904,-0.244557,0.504703,0.05292,-0.677562,
+ -0.280571,-0.938896,-0.199385,0.423841,0.069426,-0.664625,
+ -0.280571,-0.938896,-0.199385,0.423841,0.069426,-0.664625,
+ -0.251068,-0.964679,-0.079739,0.414531,0.062694,-0.5905,
+ -0.17302,-0.981247,-0.08496,0.503173,0.044243,-0.59775,
+ -0.364711,-0.913648,0.179534,0.369306,0.083596,-0.361333,
+ -0.280571,-0.938896,0.199385,0.423841,0.069426,-0.335375,
+ -0.251068,-0.964679,0.079739,0.414531,0.062694,-0.4095,
+ -0.364711,-0.913648,0.179534,0.369306,0.083596,-0.361333,
+ -0.251068,-0.964679,0.079739,0.414531,0.062694,-0.4095,
+ -0.355137,-0.92942,0.100277,0.342964,0.083687,-0.4175,
+ -0.280571,-0.938896,0.199385,0.423841,0.069426,-0.335375,
+ -0.168376,-0.954904,0.244557,0.504703,0.05292,-0.322437,
+ -0.17302,-0.981247,0.08496,0.503173,0.044243,-0.40225,
+ -0.17302,-0.981247,0.08496,0.503173,0.044243,-0.40225,
+ -0.251068,-0.964679,0.079739,0.414531,0.062694,-0.4095,
+ -0.280571,-0.938896,0.199385,0.423841,0.069426,-0.335375,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.25669,-0.966494,0,0.406908,0.061217,-0.5,
+ -0.251068,-0.964679,0.079739,0.414531,0.062694,-0.4095,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.251068,-0.964679,0.079739,0.414531,0.062694,-0.4095,
+ -0.17302,-0.981247,0.08496,0.503173,0.044243,-0.40225,
+ -0.25669,-0.966494,0,0.406908,0.061217,-0.5,
+ -0.409218,-0.912437,0,0.329838,0.083754,-0.5,
+ -0.355137,-0.92942,0.100277,0.342964,0.083687,-0.4175,
+ -0.355137,-0.92942,0.100277,0.342964,0.083687,-0.4175,
+ -0.251068,-0.964679,0.079739,0.414531,0.062694,-0.4095,
+ -0.25669,-0.966494,0,0.406908,0.061217,-0.5,
+ 0.029695,-0.979483,0.199329,0.642426,0.035438,-0.361333,
+ 0.015839,-0.994833,0.100277,0.667212,0.026513,-0.4175,
+ -0.094013,-0.992373,0.079739,0.592781,0.031264,-0.4095,
+ 0.029695,-0.979483,0.199329,0.642426,0.035438,-0.361333,
+ -0.094013,-0.992373,0.079739,0.592781,0.031264,-0.4095,
+ -0.070895,-0.97954,0.188349,0.586334,0.040774,-0.335375,
+ 0.015839,-0.994833,0.100277,0.667212,0.026513,-0.4175,
+ 0.072467,-0.997371,0,0.679568,0.022087,-0.5,
+ -0.089351,-0.996,0,0.599438,0.027269,-0.5,
+ -0.089351,-0.996,0,0.599438,0.027269,-0.5,
+ -0.094013,-0.992373,0.079739,0.592781,0.031264,-0.4095,
+ 0.015839,-0.994833,0.100277,0.667212,0.026513,-0.4175,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.17302,-0.981247,0.08496,0.503173,0.044243,-0.40225,
+ -0.094013,-0.992373,0.079739,0.592781,0.031264,-0.4095,
+ -0.173648,-0.984808,0,0.502661,0.041337,-0.5,
+ -0.094013,-0.992373,0.079739,0.592781,0.031264,-0.4095,
+ -0.089351,-0.996,0,0.599438,0.027269,-0.5,
+ -0.17302,-0.981247,0.08496,0.503173,0.044243,-0.40225,
+ -0.168376,-0.954904,0.244557,0.504703,0.05292,-0.322437,
+ -0.070895,-0.97954,0.188349,0.586334,0.040774,-0.335375,
+ -0.070895,-0.97954,0.188349,0.586334,0.040774,-0.335375,
+ -0.094013,-0.992373,0.079739,0.592781,0.031264,-0.4095,
+ -0.17302,-0.981247,0.08496,0.503173,0.044243,-0.40225,
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1728,data,NULL};
+const struct gllist *s1_3=&frame;
diff --git a/hacks/glx/s1_4.c b/hacks/glx/s1_4.c
new file mode 100644
index 0000000..397412d
--- /dev/null
+++ b/hacks/glx/s1_4.c
@@ -0,0 +1,1733 @@
+#include "gllist.h"
+static const float data[]={
+ -0.632405,-0.365743,-0.682858,1.262105,0.039911,-0.672877,
+ -0.695773,-0.304145,-0.650689,1.235562,0.083949,-0.664066,
+ -0.858311,-0.411605,-0.306404,1.208797,0.050229,-0.589491,
+ -0.858311,-0.411605,-0.306404,1.208797,0.050229,-0.589491,
+ -0.802735,-0.496752,-0.329932,1.231827,0.004686,-0.594296,
+ -0.632405,-0.365743,-0.682858,1.262105,0.039911,-0.672877,
+ -0.900624,-0.4346,0,1.199875,0.038989,-0.5,
+ -0.829744,-0.558144,0,1.221734,-0.007055,-0.5,
+ -0.802735,-0.496752,-0.329932,1.231827,0.004686,-0.594296,
+ -0.900624,-0.4346,0,1.199875,0.038989,-0.5,
+ -0.802735,-0.496752,-0.329932,1.231827,0.004686,-0.594296,
+ -0.858311,-0.411605,-0.306404,1.208797,0.050229,-0.589491,
+ -0.829744,-0.558144,0,1.221734,-0.007055,-0.5,
+ -0.372431,-0.92806,0,1.243033,-0.034453,-0.5,
+ -0.429143,-0.839931,-0.332192,1.253444,-0.022303,-0.594949,
+ -0.429143,-0.839931,-0.332192,1.253444,-0.022303,-0.594949,
+ -0.802735,-0.496752,-0.329932,1.231827,0.004686,-0.594296,
+ -0.829744,-0.558144,0,1.221734,-0.007055,-0.5,
+ -0.342337,-0.675989,-0.652567,1.284897,0.013483,-0.674188,
+ -0.632405,-0.365743,-0.682858,1.262105,0.039911,-0.672877,
+ -0.802735,-0.496752,-0.329932,1.231827,0.004686,-0.594296,
+ -0.342337,-0.675989,-0.652567,1.284897,0.013483,-0.674188,
+ -0.802735,-0.496752,-0.329932,1.231827,0.004686,-0.594296,
+ -0.429143,-0.839931,-0.332192,1.253444,-0.022303,-0.594949,
+ -0.858311,-0.411604,0.306404,1.208797,0.050229,-0.410509,
+ -0.695773,-0.304144,0.650689,1.235562,0.083949,-0.335934,
+ -0.632405,-0.365743,0.682858,1.262105,0.039911,-0.327123,
+ -0.632405,-0.365743,0.682858,1.262105,0.039911,-0.327123,
+ -0.802735,-0.496752,0.329932,1.231827,0.004686,-0.405704,
+ -0.858311,-0.411604,0.306404,1.208797,0.050229,-0.410509,
+ -0.342337,-0.675989,0.652567,1.284897,0.013483,-0.325812,
+ -0.429143,-0.839932,0.332191,1.253444,-0.022303,-0.405051,
+ -0.802735,-0.496752,0.329932,1.231827,0.004686,-0.405704,
+ -0.342337,-0.675989,0.652567,1.284897,0.013483,-0.325812,
+ -0.802735,-0.496752,0.329932,1.231827,0.004686,-0.405704,
+ -0.632405,-0.365743,0.682858,1.262105,0.039911,-0.327123,
+ -0.429143,-0.839932,0.332191,1.253444,-0.022303,-0.405051,
+ -0.372431,-0.92806,0,1.243033,-0.034453,-0.5,
+ -0.829744,-0.558144,0,1.221734,-0.007055,-0.5,
+ -0.829744,-0.558144,0,1.221734,-0.007055,-0.5,
+ -0.802735,-0.496752,0.329932,1.231827,0.004686,-0.405704,
+ -0.429143,-0.839932,0.332191,1.253444,-0.022303,-0.405051,
+ -0.900624,-0.4346,0,1.199875,0.038989,-0.5,
+ -0.858311,-0.411604,0.306404,1.208797,0.050229,-0.410509,
+ -0.802735,-0.496752,0.329932,1.231827,0.004686,-0.405704,
+ -0.900624,-0.4346,0,1.199875,0.038989,-0.5,
+ -0.802735,-0.496752,0.329932,1.231827,0.004686,-0.405704,
+ -0.829744,-0.558144,0,1.221734,-0.007055,-0.5,
+ 0.581551,-0.793452,0.179534,1.331736,0.017726,-0.361333,
+ 0.6,-0.793691,0.100277,1.3177,-0.004566,-0.4175,
+ 0.266434,-0.94535,0.187955,1.279887,-0.026194,-0.4125,
+ 0.581551,-0.793452,0.179534,1.331736,0.017726,-0.361333,
+ 0.266434,-0.94535,0.187955,1.279887,-0.026194,-0.4125,
+ 0.307416,-0.846879,0.433925,1.309178,0.008154,-0.339125,
+ 0.556938,-0.830554,0,1.310688,-0.015661,-0.5,
+ 0.184945,-0.982749,0,1.270418,-0.038526,-0.5,
+ 0.266434,-0.94535,0.187955,1.279887,-0.026194,-0.4125,
+ 0.556938,-0.830554,0,1.310688,-0.015661,-0.5,
+ 0.266434,-0.94535,0.187955,1.279887,-0.026194,-0.4125,
+ 0.6,-0.793691,0.100277,1.3177,-0.004566,-0.4175,
+ -0.372431,-0.92806,0,1.243033,-0.034453,-0.5,
+ -0.429143,-0.839932,0.332191,1.253444,-0.022303,-0.405051,
+ 0.266434,-0.94535,0.187955,1.279887,-0.026194,-0.4125,
+ -0.372431,-0.92806,0,1.243033,-0.034453,-0.5,
+ 0.266434,-0.94535,0.187955,1.279887,-0.026194,-0.4125,
+ 0.184945,-0.982749,0,1.270418,-0.038526,-0.5,
+ -0.429143,-0.839932,0.332191,1.253444,-0.022303,-0.405051,
+ -0.342337,-0.675989,0.652567,1.284897,0.013483,-0.325812,
+ 0.307416,-0.846879,0.433925,1.309178,0.008154,-0.339125,
+ 0.307416,-0.846879,0.433925,1.309178,0.008154,-0.339125,
+ 0.266434,-0.94535,0.187955,1.279887,-0.026194,-0.4125,
+ -0.429143,-0.839932,0.332191,1.253444,-0.022303,-0.405051,
+ 0.581551,-0.793452,-0.179534,1.331736,0.017726,-0.638667,
+ 0.307416,-0.846879,-0.433925,1.309178,0.008154,-0.660875,
+ 0.266434,-0.94535,-0.187955,1.279887,-0.026194,-0.5875,
+ 0.581551,-0.793452,-0.179534,1.331736,0.017726,-0.638667,
+ 0.266434,-0.94535,-0.187955,1.279887,-0.026194,-0.5875,
+ 0.6,-0.793691,-0.100277,1.3177,-0.004566,-0.5825,
+ 0.307416,-0.846879,-0.433925,1.309178,0.008154,-0.660875,
+ -0.342337,-0.675989,-0.652567,1.284897,0.013483,-0.674188,
+ -0.429143,-0.839931,-0.332192,1.253444,-0.022303,-0.594949,
+ -0.429143,-0.839931,-0.332192,1.253444,-0.022303,-0.594949,
+ 0.266434,-0.94535,-0.187955,1.279887,-0.026194,-0.5875,
+ 0.307416,-0.846879,-0.433925,1.309178,0.008154,-0.660875,
+ -0.372431,-0.92806,0,1.243033,-0.034453,-0.5,
+ 0.184945,-0.982749,0,1.270418,-0.038526,-0.5,
+ 0.266434,-0.94535,-0.187955,1.279887,-0.026194,-0.5875,
+ -0.372431,-0.92806,0,1.243033,-0.034453,-0.5,
+ 0.266434,-0.94535,-0.187955,1.279887,-0.026194,-0.5875,
+ -0.429143,-0.839931,-0.332192,1.253444,-0.022303,-0.594949,
+ 0.556938,-0.830554,0,1.310688,-0.015661,-0.5,
+ 0.6,-0.793691,-0.100277,1.3177,-0.004566,-0.5825,
+ 0.266434,-0.94535,-0.187955,1.279887,-0.026194,-0.5875,
+ 0.556938,-0.830554,0,1.310688,-0.015661,-0.5,
+ 0.266434,-0.94535,-0.187955,1.279887,-0.026194,-0.5875,
+ 0.184945,-0.982749,0,1.270418,-0.038526,-0.5,
+ -0.695773,-0.304144,0.650689,1.235562,0.083949,-0.335934,
+ -0.420703,-0.10775,0.900777,1.28017,0.14015,-0.291188,
+ -0.363086,-0.142915,0.92073,1.312568,0.09862,-0.279975,
+ -0.695773,-0.304144,0.650689,1.235562,0.083949,-0.335934,
+ -0.363086,-0.142915,0.92073,1.312568,0.09862,-0.279975,
+ -0.632405,-0.365743,0.682858,1.262105,0.039911,-0.327123,
+ -0.420703,-0.10775,0.900777,1.28017,0.14015,-0.291188,
+ -0.152737,0.118235,0.981169,1.3337,0.207591,-0.276273,
+ -0.10731,0.091019,0.990051,1.373124,0.16907,-0.264259,
+ -0.10731,0.091019,0.990051,1.373124,0.16907,-0.264259,
+ -0.363086,-0.142915,0.92073,1.312568,0.09862,-0.279975,
+ -0.420703,-0.10775,0.900777,1.28017,0.14015,-0.291188,
+ 0.221822,-0.232839,0.94688,1.400739,0.142695,-0.26194,
+ -0.050406,-0.482634,0.874371,1.337615,0.072243,-0.277994,
+ -0.363086,-0.142915,0.92073,1.312568,0.09862,-0.279975,
+ 0.221822,-0.232839,0.94688,1.400739,0.142695,-0.26194,
+ -0.363086,-0.142915,0.92073,1.312568,0.09862,-0.279975,
+ -0.10731,0.091019,0.990051,1.373124,0.16907,-0.264259,
+ -0.050406,-0.482634,0.874371,1.337615,0.072243,-0.277994,
+ -0.342337,-0.675989,0.652567,1.284897,0.013483,-0.325812,
+ -0.632405,-0.365743,0.682858,1.262105,0.039911,-0.327123,
+ -0.632405,-0.365743,0.682858,1.262105,0.039911,-0.327123,
+ -0.363086,-0.142915,0.92073,1.312568,0.09862,-0.279975,
+ -0.050406,-0.482634,0.874371,1.337615,0.072243,-0.277994,
+ 0.311074,0.63183,0.709947,1.431839,0.331232,-0.335934,
+ 0.365915,0.616651,0.697028,1.484144,0.298229,-0.327123,
+ 0.113526,0.358822,0.926476,1.433681,0.239521,-0.279975,
+ 0.311074,0.63183,0.709947,1.431839,0.331232,-0.335934,
+ 0.113526,0.358822,0.926476,1.433681,0.239521,-0.279975,
+ 0.074097,0.34389,0.936082,1.38723,0.275032,-0.291188,
+ 0.365915,0.616651,0.697028,1.484144,0.298229,-0.327123,
+ 0.704743,0.348932,0.617724,1.515677,0.27272,-0.325812,
+ 0.422175,0.108161,0.900039,1.463411,0.213552,-0.277994,
+ 0.422175,0.108161,0.900039,1.463411,0.213552,-0.277994,
+ 0.113526,0.358822,0.926476,1.433681,0.239521,-0.279975,
+ 0.365915,0.616651,0.697028,1.484144,0.298229,-0.327123,
+ 0.422175,0.108161,0.900039,1.463411,0.213552,-0.277994,
+ 0.221822,-0.232839,0.94688,1.400739,0.142695,-0.26194,
+ -0.10731,0.091019,0.990051,1.373124,0.16907,-0.264259,
+ -0.10731,0.091019,0.990051,1.373124,0.16907,-0.264259,
+ 0.113526,0.358822,0.926476,1.433681,0.239521,-0.279975,
+ 0.422175,0.108161,0.900039,1.463411,0.213552,-0.277994,
+ -0.152737,0.118235,0.981169,1.3337,0.207591,-0.276273,
+ 0.074097,0.34389,0.936082,1.38723,0.275032,-0.291188,
+ 0.113526,0.358822,0.926476,1.433681,0.239521,-0.279975,
+ -0.152737,0.118235,0.981169,1.3337,0.207591,-0.276273,
+ 0.113526,0.358822,0.926476,1.433681,0.239521,-0.279975,
+ -0.10731,0.091019,0.990051,1.373124,0.16907,-0.264259,
+ 0.846384,-0.493864,0.199328,1.517309,0.223825,-0.361333,
+ 0.786785,-0.580419,0.209959,1.483059,0.179084,-0.335375,
+ 0.736468,-0.384081,0.556864,1.476277,0.191919,-0.294,
+ 0.846384,-0.493864,0.199328,1.517309,0.223825,-0.361333,
+ 0.736468,-0.384081,0.556864,1.476277,0.191919,-0.294,
+ 0.85656,-0.215911,0.468709,1.524471,0.247261,-0.339125,
+ 0.786785,-0.580419,0.209959,1.483059,0.179084,-0.335375,
+ 0.725947,-0.653645,0.21389,1.4295,0.116294,-0.322437,
+ 0.64097,-0.57721,0.50595,1.418631,0.126081,-0.2785,
+ 0.64097,-0.57721,0.50595,1.418631,0.126081,-0.2785,
+ 0.736468,-0.384081,0.556864,1.476277,0.191919,-0.294,
+ 0.786785,-0.580419,0.209959,1.483059,0.179084,-0.335375,
+ 0.221822,-0.232839,0.94688,1.400739,0.142695,-0.26194,
+ 0.422175,0.108161,0.900039,1.463411,0.213552,-0.277994,
+ 0.736468,-0.384081,0.556864,1.476277,0.191919,-0.294,
+ 0.221822,-0.232839,0.94688,1.400739,0.142695,-0.26194,
+ 0.736468,-0.384081,0.556864,1.476277,0.191919,-0.294,
+ 0.64097,-0.57721,0.50595,1.418631,0.126081,-0.2785,
+ 0.422175,0.108161,0.900039,1.463411,0.213552,-0.277994,
+ 0.704743,0.348932,0.617724,1.515677,0.27272,-0.325812,
+ 0.85656,-0.215911,0.468709,1.524471,0.247261,-0.339125,
+ 0.85656,-0.215911,0.468709,1.524471,0.247261,-0.339125,
+ 0.736468,-0.384081,0.556864,1.476277,0.191919,-0.294,
+ 0.422175,0.108161,0.900039,1.463411,0.213552,-0.277994,
+ 0.649588,-0.728866,0.216309,1.372652,0.056465,-0.335375,
+ 0.581551,-0.793452,0.179534,1.331736,0.017726,-0.361333,
+ 0.307416,-0.846879,0.433925,1.309178,0.008154,-0.339125,
+ 0.307416,-0.846879,0.433925,1.309178,0.008154,-0.339125,
+ 0.432476,-0.665439,0.608404,1.359179,0.061869,-0.294,
+ 0.649588,-0.728866,0.216309,1.372652,0.056465,-0.335375,
+ 0.307416,-0.846879,0.433925,1.309178,0.008154,-0.339125,
+ -0.342337,-0.675989,0.652567,1.284897,0.013483,-0.325812,
+ -0.050406,-0.482634,0.874371,1.337615,0.072243,-0.277994,
+ -0.050406,-0.482634,0.874371,1.337615,0.072243,-0.277994,
+ 0.432476,-0.665439,0.608404,1.359179,0.061869,-0.294,
+ 0.307416,-0.846879,0.433925,1.309178,0.008154,-0.339125,
+ 0.221822,-0.232839,0.94688,1.400739,0.142695,-0.26194,
+ 0.64097,-0.57721,0.50595,1.418631,0.126081,-0.2785,
+ 0.432476,-0.665439,0.608404,1.359179,0.061869,-0.294,
+ 0.221822,-0.232839,0.94688,1.400739,0.142695,-0.26194,
+ 0.432476,-0.665439,0.608404,1.359179,0.061869,-0.294,
+ -0.050406,-0.482634,0.874371,1.337615,0.072243,-0.277994,
+ 0.64097,-0.57721,0.50595,1.418631,0.126081,-0.2785,
+ 0.725947,-0.653645,0.21389,1.4295,0.116294,-0.322437,
+ 0.649588,-0.728866,0.216309,1.372652,0.056465,-0.335375,
+ 0.649588,-0.728866,0.216309,1.372652,0.056465,-0.335375,
+ 0.432476,-0.665439,0.608404,1.359179,0.061869,-0.294,
+ 0.64097,-0.57721,0.50595,1.418631,0.126081,-0.2785,
+ 0.365915,0.616651,0.697028,1.484144,0.298229,-0.327123,
+ 0.311074,0.63183,0.709947,1.431839,0.331232,-0.335934,
+ 0.460195,0.823869,0.330849,1.458604,0.364953,-0.410509,
+ 0.460195,0.823869,0.330849,1.458604,0.364953,-0.410509,
+ 0.507038,0.792213,0.339576,1.514422,0.333454,-0.405704,
+ 0.365915,0.616651,0.697028,1.484144,0.298229,-0.327123,
+ 0.489941,0.871755,0,1.467526,0.376193,-0.5,
+ 0.561935,0.827181,0,1.524515,0.345196,-0.5,
+ 0.507038,0.792213,0.339576,1.514422,0.333454,-0.405704,
+ 0.489941,0.871755,0,1.467526,0.376193,-0.5,
+ 0.507038,0.792213,0.339576,1.514422,0.333454,-0.405704,
+ 0.460195,0.823869,0.330849,1.458604,0.364953,-0.410509,
+ 0.561935,0.827181,0,1.524515,0.345196,-0.5,
+ 0.887347,0.461103,0,1.558444,0.319842,-0.5,
+ 0.765648,0.567983,0.301958,1.547582,0.308099,-0.405051,
+ 0.765648,0.567983,0.301958,1.547582,0.308099,-0.405051,
+ 0.507038,0.792213,0.339576,1.514422,0.333454,-0.405704,
+ 0.561935,0.827181,0,1.524515,0.345196,-0.5,
+ 0.704743,0.348932,0.617724,1.515677,0.27272,-0.325812,
+ 0.365915,0.616651,0.697028,1.484144,0.298229,-0.327123,
+ 0.507038,0.792213,0.339576,1.514422,0.333454,-0.405704,
+ 0.704743,0.348932,0.617724,1.515677,0.27272,-0.325812,
+ 0.507038,0.792213,0.339576,1.514422,0.333454,-0.405704,
+ 0.765648,0.567983,0.301958,1.547582,0.308099,-0.405051,
+ 0.460195,0.823869,-0.330849,1.458604,0.364953,-0.589491,
+ 0.311074,0.63183,-0.709947,1.431839,0.331232,-0.664066,
+ 0.365915,0.616651,-0.697028,1.484144,0.298229,-0.672877,
+ 0.365915,0.616651,-0.697028,1.484144,0.298229,-0.672877,
+ 0.507038,0.792213,-0.339576,1.514422,0.333454,-0.594296,
+ 0.460195,0.823869,-0.330849,1.458604,0.364953,-0.589491,
+ 0.704744,0.348932,-0.617724,1.515677,0.27272,-0.674188,
+ 0.765648,0.567983,-0.301958,1.547582,0.308099,-0.594949,
+ 0.507038,0.792213,-0.339576,1.514422,0.333454,-0.594296,
+ 0.704744,0.348932,-0.617724,1.515677,0.27272,-0.674188,
+ 0.507038,0.792213,-0.339576,1.514422,0.333454,-0.594296,
+ 0.365915,0.616651,-0.697028,1.484144,0.298229,-0.672877,
+ 0.765648,0.567983,-0.301958,1.547582,0.308099,-0.594949,
+ 0.887347,0.461103,0,1.558444,0.319842,-0.5,
+ 0.561935,0.827181,0,1.524515,0.345196,-0.5,
+ 0.561935,0.827181,0,1.524515,0.345196,-0.5,
+ 0.507038,0.792213,-0.339576,1.514422,0.333454,-0.594296,
+ 0.765648,0.567983,-0.301958,1.547582,0.308099,-0.594949,
+ 0.489941,0.871755,0,1.467526,0.376193,-0.5,
+ 0.460195,0.823869,-0.330849,1.458604,0.364953,-0.589491,
+ 0.507038,0.792213,-0.339576,1.514422,0.333454,-0.594296,
+ 0.489941,0.871755,0,1.467526,0.376193,-0.5,
+ 0.507038,0.792213,-0.339576,1.514422,0.333454,-0.594296,
+ 0.561935,0.827181,0,1.524515,0.345196,-0.5,
+ 0.846384,-0.493864,-0.199329,1.517309,0.223825,-0.638667,
+ 0.85206,-0.513749,-0.100278,1.538011,0.240115,-0.5825,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.846384,-0.493864,-0.199329,1.517309,0.223825,-0.638667,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.85656,-0.215911,-0.468708,1.524471,0.247261,-0.660875,
+ 0.88422,-0.467071,0,1.548313,0.248248,-0.5,
+ 0.997731,-0.067332,0,1.566843,0.290687,-0.5,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.88422,-0.467071,0,1.548313,0.248248,-0.5,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.85206,-0.513749,-0.100278,1.538011,0.240115,-0.5825,
+ 0.887347,0.461103,0,1.558444,0.319842,-0.5,
+ 0.765648,0.567983,-0.301958,1.547582,0.308099,-0.594949,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.887347,0.461103,0,1.558444,0.319842,-0.5,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.997731,-0.067332,0,1.566843,0.290687,-0.5,
+ 0.704744,0.348932,-0.617724,1.515677,0.27272,-0.674188,
+ 0.85656,-0.215911,-0.468708,1.524471,0.247261,-0.660875,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.704744,0.348932,-0.617724,1.515677,0.27272,-0.674188,
+ 0.967592,-0.122072,-0.221053,1.555568,0.279982,-0.5875,
+ 0.765648,0.567983,-0.301958,1.547582,0.308099,-0.594949,
+ 0.846384,-0.493864,0.199328,1.517309,0.223825,-0.361333,
+ 0.85656,-0.215911,0.468709,1.524471,0.247261,-0.339125,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.846384,-0.493864,0.199328,1.517309,0.223825,-0.361333,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.85206,-0.513749,0.100278,1.538011,0.240115,-0.4175,
+ 0.704743,0.348932,0.617724,1.515677,0.27272,-0.325812,
+ 0.765648,0.567983,0.301958,1.547582,0.308099,-0.405051,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.704743,0.348932,0.617724,1.515677,0.27272,-0.325812,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.85656,-0.215911,0.468709,1.524471,0.247261,-0.339125,
+ 0.887347,0.461103,0,1.558444,0.319842,-0.5,
+ 0.997731,-0.067332,0,1.566843,0.290687,-0.5,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.887347,0.461103,0,1.558444,0.319842,-0.5,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.765648,0.567983,0.301958,1.547582,0.308099,-0.405051,
+ 0.88422,-0.467071,0,1.548313,0.248248,-0.5,
+ 0.85206,-0.513749,0.100278,1.538011,0.240115,-0.4175,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.88422,-0.467071,0,1.548313,0.248248,-0.5,
+ 0.967592,-0.122072,0.221053,1.555568,0.279982,-0.4125,
+ 0.997731,-0.067332,0,1.566843,0.290687,-0.5,
+ 0.311074,0.63183,-0.709947,1.431839,0.331232,-0.664066,
+ 0.074097,0.34389,-0.936082,1.38723,0.275032,-0.708812,
+ 0.113526,0.358822,-0.926476,1.433681,0.239521,-0.720025,
+ 0.311074,0.63183,-0.709947,1.431839,0.331232,-0.664066,
+ 0.113526,0.358822,-0.926476,1.433681,0.239521,-0.720025,
+ 0.365915,0.616651,-0.697028,1.484144,0.298229,-0.672877,
+ -0.152737,0.118235,-0.981169,1.3337,0.207591,-0.723727,
+ -0.10731,0.091019,-0.990051,1.373124,0.16907,-0.735741,
+ 0.113526,0.358822,-0.926476,1.433681,0.239521,-0.720025,
+ -0.152737,0.118235,-0.981169,1.3337,0.207591,-0.723727,
+ 0.113526,0.358822,-0.926476,1.433681,0.239521,-0.720025,
+ 0.074097,0.34389,-0.936082,1.38723,0.275032,-0.708812,
+ -0.10731,0.091019,-0.990051,1.373124,0.16907,-0.735741,
+ 0.221822,-0.232839,-0.94688,1.400739,0.142695,-0.73806,
+ 0.422175,0.108161,-0.900039,1.463411,0.213552,-0.722006,
+ 0.422175,0.108161,-0.900039,1.463411,0.213552,-0.722006,
+ 0.113526,0.358822,-0.926476,1.433681,0.239521,-0.720025,
+ -0.10731,0.091019,-0.990051,1.373124,0.16907,-0.735741,
+ 0.422175,0.108161,-0.900039,1.463411,0.213552,-0.722006,
+ 0.704744,0.348932,-0.617724,1.515677,0.27272,-0.674188,
+ 0.365915,0.616651,-0.697028,1.484144,0.298229,-0.672877,
+ 0.365915,0.616651,-0.697028,1.484144,0.298229,-0.672877,
+ 0.113526,0.358822,-0.926476,1.433681,0.239521,-0.720025,
+ 0.422175,0.108161,-0.900039,1.463411,0.213552,-0.722006,
+ -0.695773,-0.304145,-0.650689,1.235562,0.083949,-0.664066,
+ -0.632405,-0.365743,-0.682858,1.262105,0.039911,-0.672877,
+ -0.363086,-0.142915,-0.92073,1.312568,0.09862,-0.720025,
+ -0.695773,-0.304145,-0.650689,1.235562,0.083949,-0.664066,
+ -0.363086,-0.142915,-0.92073,1.312568,0.09862,-0.720025,
+ -0.420703,-0.10775,-0.900777,1.28017,0.14015,-0.708812,
+ -0.632405,-0.365743,-0.682858,1.262105,0.039911,-0.672877,
+ -0.342337,-0.675989,-0.652567,1.284897,0.013483,-0.674188,
+ -0.050406,-0.482634,-0.87437,1.337615,0.072243,-0.722006,
+ -0.050406,-0.482634,-0.87437,1.337615,0.072243,-0.722006,
+ -0.363086,-0.142915,-0.92073,1.312568,0.09862,-0.720025,
+ -0.632405,-0.365743,-0.682858,1.262105,0.039911,-0.672877,
+ 0.221822,-0.232839,-0.94688,1.400739,0.142695,-0.73806,
+ -0.10731,0.091019,-0.990051,1.373124,0.16907,-0.735741,
+ -0.363086,-0.142915,-0.92073,1.312568,0.09862,-0.720025,
+ 0.221822,-0.232839,-0.94688,1.400739,0.142695,-0.73806,
+ -0.363086,-0.142915,-0.92073,1.312568,0.09862,-0.720025,
+ -0.050406,-0.482634,-0.87437,1.337615,0.072243,-0.722006,
+ -0.10731,0.091019,-0.990051,1.373124,0.16907,-0.735741,
+ -0.152737,0.118235,-0.981169,1.3337,0.207591,-0.723727,
+ -0.420703,-0.10775,-0.900777,1.28017,0.14015,-0.708812,
+ -0.420703,-0.10775,-0.900777,1.28017,0.14015,-0.708812,
+ -0.363086,-0.142915,-0.92073,1.312568,0.09862,-0.720025,
+ -0.10731,0.091019,-0.990051,1.373124,0.16907,-0.735741,
+ 0.307416,-0.846879,-0.433925,1.309178,0.008154,-0.660875,
+ 0.581551,-0.793452,-0.179534,1.331736,0.017726,-0.638667,
+ 0.649588,-0.728866,-0.216309,1.372652,0.056465,-0.664625,
+ 0.649588,-0.728866,-0.216309,1.372652,0.056465,-0.664625,
+ 0.432476,-0.665439,-0.608404,1.359179,0.061869,-0.706,
+ 0.307416,-0.846879,-0.433925,1.309178,0.008154,-0.660875,
+ 0.649588,-0.728866,-0.216309,1.372652,0.056465,-0.664625,
+ 0.725947,-0.653645,-0.21389,1.4295,0.116294,-0.677562,
+ 0.64097,-0.577211,-0.50595,1.418631,0.126081,-0.7215,
+ 0.64097,-0.577211,-0.50595,1.418631,0.126081,-0.7215,
+ 0.432476,-0.665439,-0.608404,1.359179,0.061869,-0.706,
+ 0.649588,-0.728866,-0.216309,1.372652,0.056465,-0.664625,
+ 0.221822,-0.232839,-0.94688,1.400739,0.142695,-0.73806,
+ -0.050406,-0.482634,-0.87437,1.337615,0.072243,-0.722006,
+ 0.432476,-0.665439,-0.608404,1.359179,0.061869,-0.706,
+ 0.221822,-0.232839,-0.94688,1.400739,0.142695,-0.73806,
+ 0.432476,-0.665439,-0.608404,1.359179,0.061869,-0.706,
+ 0.64097,-0.577211,-0.50595,1.418631,0.126081,-0.7215,
+ -0.050406,-0.482634,-0.87437,1.337615,0.072243,-0.722006,
+ -0.342337,-0.675989,-0.652567,1.284897,0.013483,-0.674188,
+ 0.307416,-0.846879,-0.433925,1.309178,0.008154,-0.660875,
+ 0.307416,-0.846879,-0.433925,1.309178,0.008154,-0.660875,
+ 0.432476,-0.665439,-0.608404,1.359179,0.061869,-0.706,
+ -0.050406,-0.482634,-0.87437,1.337615,0.072243,-0.722006,
+ 0.846384,-0.493864,-0.199329,1.517309,0.223825,-0.638667,
+ 0.85656,-0.215911,-0.468708,1.524471,0.247261,-0.660875,
+ 0.736467,-0.384081,-0.556864,1.476277,0.191919,-0.706,
+ 0.846384,-0.493864,-0.199329,1.517309,0.223825,-0.638667,
+ 0.736467,-0.384081,-0.556864,1.476277,0.191919,-0.706,
+ 0.786785,-0.580419,-0.209959,1.483059,0.179084,-0.664625,
+ 0.85656,-0.215911,-0.468708,1.524471,0.247261,-0.660875,
+ 0.704744,0.348932,-0.617724,1.515677,0.27272,-0.674188,
+ 0.422175,0.108161,-0.900039,1.463411,0.213552,-0.722006,
+ 0.422175,0.108161,-0.900039,1.463411,0.213552,-0.722006,
+ 0.736467,-0.384081,-0.556864,1.476277,0.191919,-0.706,
+ 0.85656,-0.215911,-0.468708,1.524471,0.247261,-0.660875,
+ 0.221822,-0.232839,-0.94688,1.400739,0.142695,-0.73806,
+ 0.64097,-0.577211,-0.50595,1.418631,0.126081,-0.7215,
+ 0.736467,-0.384081,-0.556864,1.476277,0.191919,-0.706,
+ 0.221822,-0.232839,-0.94688,1.400739,0.142695,-0.73806,
+ 0.736467,-0.384081,-0.556864,1.476277,0.191919,-0.706,
+ 0.422175,0.108161,-0.900039,1.463411,0.213552,-0.722006,
+ 0.64097,-0.577211,-0.50595,1.418631,0.126081,-0.7215,
+ 0.725947,-0.653645,-0.21389,1.4295,0.116294,-0.677562,
+ 0.786785,-0.580419,-0.209959,1.483059,0.179084,-0.664625,
+ 0.786785,-0.580419,-0.209959,1.483059,0.179084,-0.664625,
+ 0.736467,-0.384081,-0.556864,1.476277,0.191919,-0.706,
+ 0.64097,-0.577211,-0.50595,1.418631,0.126081,-0.7215,
+ 0.581551,-0.793452,0.179534,1.331736,0.017726,-0.361333,
+ 0.649588,-0.728866,0.216309,1.372652,0.056465,-0.335375,
+ 0.685049,-0.72412,0.079739,1.373428,0.045002,-0.4095,
+ 0.581551,-0.793452,0.179534,1.331736,0.017726,-0.361333,
+ 0.685049,-0.72412,0.079739,1.373428,0.045002,-0.4095,
+ 0.6,-0.793691,0.100277,1.3177,-0.004566,-0.4175,
+ 0.649588,-0.728866,0.216309,1.372652,0.056465,-0.335375,
+ 0.725947,-0.653645,0.21389,1.4295,0.116294,-0.322437,
+ 0.740458,-0.666711,0.08496,1.436048,0.110398,-0.40225,
+ 0.740458,-0.666711,0.08496,1.436048,0.110398,-0.40225,
+ 0.685049,-0.72412,0.079739,1.373428,0.045002,-0.4095,
+ 0.649588,-0.728866,0.216309,1.372652,0.056465,-0.335375,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.683609,-0.729849,0,1.370641,0.037756,-0.5,
+ 0.685049,-0.72412,0.079739,1.373428,0.045002,-0.4095,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.685049,-0.72412,0.079739,1.373428,0.045002,-0.4095,
+ 0.740458,-0.666711,0.08496,1.436048,0.110398,-0.40225,
+ 0.683609,-0.729849,0,1.370641,0.037756,-0.5,
+ 0.556938,-0.830554,0,1.310688,-0.015661,-0.5,
+ 0.6,-0.793691,0.100277,1.3177,-0.004566,-0.4175,
+ 0.6,-0.793691,0.100277,1.3177,-0.004566,-0.4175,
+ 0.685049,-0.72412,0.079739,1.373428,0.045002,-0.4095,
+ 0.683609,-0.729849,0,1.370641,0.037756,-0.5,
+ 0.846384,-0.493864,0.199328,1.517309,0.223825,-0.361333,
+ 0.85206,-0.513749,0.100278,1.538011,0.240115,-0.4175,
+ 0.791761,-0.605604,0.079739,1.49454,0.179511,-0.4095,
+ 0.846384,-0.493864,0.199328,1.517309,0.223825,-0.361333,
+ 0.791761,-0.605604,0.079739,1.49454,0.179511,-0.4095,
+ 0.786785,-0.580419,0.209959,1.483059,0.179084,-0.335375,
+ 0.85206,-0.513749,0.100278,1.538011,0.240115,-0.4175,
+ 0.88422,-0.467071,0,1.548313,0.248248,-0.5,
+ 0.797307,-0.603573,0,1.501456,0.18304,-0.5,
+ 0.797307,-0.603573,0,1.501456,0.18304,-0.5,
+ 0.791761,-0.605604,0.079739,1.49454,0.179511,-0.4095,
+ 0.85206,-0.513749,0.100278,1.538011,0.240115,-0.4175,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.740458,-0.666711,0.08496,1.436048,0.110398,-0.40225,
+ 0.791761,-0.605604,0.079739,1.49454,0.179511,-0.4095,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.791761,-0.605604,0.079739,1.49454,0.179511,-0.4095,
+ 0.797307,-0.603573,0,1.501456,0.18304,-0.5,
+ 0.740458,-0.666711,0.08496,1.436048,0.110398,-0.40225,
+ 0.725947,-0.653645,0.21389,1.4295,0.116294,-0.322437,
+ 0.786785,-0.580419,0.209959,1.483059,0.179084,-0.335375,
+ 0.786785,-0.580419,0.209959,1.483059,0.179084,-0.335375,
+ 0.791761,-0.605604,0.079739,1.49454,0.179511,-0.4095,
+ 0.740458,-0.666711,0.08496,1.436048,0.110398,-0.40225,
+ 0.846384,-0.493864,-0.199329,1.517309,0.223825,-0.638667,
+ 0.786785,-0.580419,-0.209959,1.483059,0.179084,-0.664625,
+ 0.791761,-0.605604,-0.079739,1.49454,0.179511,-0.5905,
+ 0.846384,-0.493864,-0.199329,1.517309,0.223825,-0.638667,
+ 0.791761,-0.605604,-0.079739,1.49454,0.179511,-0.5905,
+ 0.85206,-0.513749,-0.100278,1.538011,0.240115,-0.5825,
+ 0.786785,-0.580419,-0.209959,1.483059,0.179084,-0.664625,
+ 0.725947,-0.653645,-0.21389,1.4295,0.116294,-0.677562,
+ 0.740458,-0.666711,-0.08496,1.436048,0.110398,-0.59775,
+ 0.740458,-0.666711,-0.08496,1.436048,0.110398,-0.59775,
+ 0.791761,-0.605604,-0.079739,1.49454,0.179511,-0.5905,
+ 0.786785,-0.580419,-0.209959,1.483059,0.179084,-0.664625,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.797307,-0.603573,0,1.501456,0.18304,-0.5,
+ 0.791761,-0.605604,-0.079739,1.49454,0.179511,-0.5905,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.791761,-0.605604,-0.079739,1.49454,0.179511,-0.5905,
+ 0.740458,-0.666711,-0.08496,1.436048,0.110398,-0.59775,
+ 0.797307,-0.603573,0,1.501456,0.18304,-0.5,
+ 0.88422,-0.467071,0,1.548313,0.248248,-0.5,
+ 0.85206,-0.513749,-0.100278,1.538011,0.240115,-0.5825,
+ 0.85206,-0.513749,-0.100278,1.538011,0.240115,-0.5825,
+ 0.791761,-0.605604,-0.079739,1.49454,0.179511,-0.5905,
+ 0.797307,-0.603573,0,1.501456,0.18304,-0.5,
+ 0.581551,-0.793452,-0.179534,1.331736,0.017726,-0.638667,
+ 0.6,-0.793691,-0.100277,1.3177,-0.004566,-0.5825,
+ 0.685049,-0.72412,-0.079739,1.373428,0.045002,-0.5905,
+ 0.581551,-0.793452,-0.179534,1.331736,0.017726,-0.638667,
+ 0.685049,-0.72412,-0.079739,1.373428,0.045002,-0.5905,
+ 0.649588,-0.728866,-0.216309,1.372652,0.056465,-0.664625,
+ 0.6,-0.793691,-0.100277,1.3177,-0.004566,-0.5825,
+ 0.556938,-0.830554,0,1.310688,-0.015661,-0.5,
+ 0.683609,-0.729849,0,1.370641,0.037756,-0.5,
+ 0.683609,-0.729849,0,1.370641,0.037756,-0.5,
+ 0.685049,-0.72412,-0.079739,1.373428,0.045002,-0.5905,
+ 0.6,-0.793691,-0.100277,1.3177,-0.004566,-0.5825,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.740458,-0.666711,-0.08496,1.436048,0.110398,-0.59775,
+ 0.685049,-0.72412,-0.079739,1.373428,0.045002,-0.5905,
+ 0.743145,-0.669131,0,1.438241,0.108423,-0.5,
+ 0.685049,-0.72412,-0.079739,1.373428,0.045002,-0.5905,
+ 0.683609,-0.729849,0,1.370641,0.037756,-0.5,
+ 0.740458,-0.666711,-0.08496,1.436048,0.110398,-0.59775,
+ 0.725947,-0.653645,-0.21389,1.4295,0.116294,-0.677562,
+ 0.649588,-0.728866,-0.216309,1.372652,0.056465,-0.664625,
+ 0.649588,-0.728866,-0.216309,1.372652,0.056465,-0.664625,
+ 0.685049,-0.72412,-0.079739,1.373428,0.045002,-0.5905,
+ 0.740458,-0.666711,-0.08496,1.436048,0.110398,-0.59775,
+ -0.695773,-0.304145,-0.650689,1.235562,0.083949,-0.664066,
+ -0.687216,-0.351805,-0.635584,1.200029,0.142107,-0.654883,
+ -0.84747,-0.443196,-0.292185,1.178115,0.10978,-0.584482,
+ -0.695773,-0.304145,-0.650689,1.235562,0.083949,-0.664066,
+ -0.84747,-0.443196,-0.292185,1.178115,0.10978,-0.584482,
+ -0.858311,-0.411605,-0.306404,1.208797,0.050229,-0.589491,
+ -0.687216,-0.351805,-0.635584,1.200029,0.142107,-0.654883,
+ -0.659424,-0.432639,-0.614804,1.158118,0.203222,-0.646637,
+ -0.813982,-0.512235,-0.273951,1.142211,0.172121,-0.579984,
+ -0.813982,-0.512235,-0.273951,1.142211,0.172121,-0.579984,
+ -0.84747,-0.443196,-0.292185,1.178115,0.10978,-0.584482,
+ -0.687216,-0.351805,-0.635584,1.200029,0.142107,-0.654883,
+ -0.860968,-0.508659,0,1.136909,0.161755,-0.5,
+ -0.891261,-0.453491,0,1.170811,0.099004,-0.5,
+ -0.84747,-0.443196,-0.292185,1.178115,0.10978,-0.584482,
+ -0.860968,-0.508659,0,1.136909,0.161755,-0.5,
+ -0.84747,-0.443196,-0.292185,1.178115,0.10978,-0.584482,
+ -0.813982,-0.512235,-0.273951,1.142211,0.172121,-0.579984,
+ -0.891261,-0.453491,0,1.170811,0.099004,-0.5,
+ -0.900624,-0.4346,0,1.199875,0.038989,-0.5,
+ -0.858311,-0.411605,-0.306404,1.208797,0.050229,-0.589491,
+ -0.858311,-0.411605,-0.306404,1.208797,0.050229,-0.589491,
+ -0.84747,-0.443196,-0.292185,1.178115,0.10978,-0.584482,
+ -0.891261,-0.453491,0,1.170811,0.099004,-0.5,
+ -0.30458,-0.744204,-0.594467,1.065609,0.289676,-0.638205,
+ -0.39374,-0.892943,-0.218225,1.064451,0.260311,-0.575384,
+ -0.696441,-0.651142,-0.301635,1.103513,0.226037,-0.576713,
+ -0.30458,-0.744204,-0.594467,1.065609,0.289676,-0.638205,
+ -0.696441,-0.651142,-0.301635,1.103513,0.226037,-0.576713,
+ -0.547648,-0.532516,-0.645374,1.112441,0.256132,-0.640641,
+ -0.39374,-0.892943,-0.218225,1.064451,0.260311,-0.575384,
+ -0.417976,-0.908458,0,1.064065,0.250523,-0.5,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.696441,-0.651142,-0.301635,1.103513,0.226037,-0.576713,
+ -0.39374,-0.892943,-0.218225,1.064451,0.260311,-0.575384,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.860968,-0.508659,0,1.136909,0.161755,-0.5,
+ -0.813982,-0.512235,-0.273951,1.142211,0.172121,-0.579984,
+ -0.813982,-0.512235,-0.273951,1.142211,0.172121,-0.579984,
+ -0.696441,-0.651142,-0.301635,1.103513,0.226037,-0.576713,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.659424,-0.432639,-0.614804,1.158118,0.203222,-0.646637,
+ -0.547648,-0.532516,-0.645374,1.112441,0.256132,-0.640641,
+ -0.696441,-0.651142,-0.301635,1.103513,0.226037,-0.576713,
+ -0.659424,-0.432639,-0.614804,1.158118,0.203222,-0.646637,
+ -0.696441,-0.651142,-0.301635,1.103513,0.226037,-0.576713,
+ -0.813982,-0.512235,-0.273951,1.142211,0.172121,-0.579984,
+ -0.30458,-0.744204,0.594467,1.065609,0.289676,-0.361795,
+ -0.547648,-0.532516,0.645374,1.112441,0.256132,-0.359359,
+ -0.696441,-0.651142,0.301635,1.103513,0.226037,-0.423287,
+ -0.30458,-0.744204,0.594467,1.065609,0.289676,-0.361795,
+ -0.696441,-0.651142,0.301635,1.103513,0.226037,-0.423287,
+ -0.393741,-0.892942,0.218225,1.064451,0.260311,-0.424615,
+ -0.659424,-0.432639,0.614804,1.158118,0.203222,-0.353363,
+ -0.813982,-0.512235,0.273951,1.142211,0.172121,-0.420016,
+ -0.696441,-0.651142,0.301635,1.103513,0.226037,-0.423287,
+ -0.659424,-0.432639,0.614804,1.158118,0.203222,-0.353363,
+ -0.696441,-0.651142,0.301635,1.103513,0.226037,-0.423287,
+ -0.547648,-0.532516,0.645374,1.112441,0.256132,-0.359359,
+ -0.813982,-0.512235,0.273951,1.142211,0.172121,-0.420016,
+ -0.860968,-0.508659,0,1.136909,0.161755,-0.5,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.696441,-0.651142,0.301635,1.103513,0.226037,-0.423287,
+ -0.813982,-0.512235,0.273951,1.142211,0.172121,-0.420016,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.417976,-0.908458,0,1.064065,0.250523,-0.5,
+ -0.393741,-0.892942,0.218225,1.064451,0.260311,-0.424615,
+ -0.393741,-0.892942,0.218225,1.064451,0.260311,-0.424615,
+ -0.696441,-0.651142,0.301635,1.103513,0.226037,-0.423287,
+ -0.753723,-0.657192,0,1.100538,0.216006,-0.5,
+ -0.695773,-0.304144,0.650689,1.235562,0.083949,-0.335934,
+ -0.858311,-0.411604,0.306404,1.208797,0.050229,-0.410509,
+ -0.84747,-0.443196,0.292185,1.178115,0.10978,-0.415518,
+ -0.695773,-0.304144,0.650689,1.235562,0.083949,-0.335934,
+ -0.84747,-0.443196,0.292185,1.178115,0.10978,-0.415518,
+ -0.687216,-0.351805,0.635584,1.200029,0.142107,-0.345117,
+ -0.858311,-0.411604,0.306404,1.208797,0.050229,-0.410509,
+ -0.900624,-0.4346,0,1.199875,0.038989,-0.5,
+ -0.891261,-0.453491,0,1.170811,0.099004,-0.5,
+ -0.891261,-0.453491,0,1.170811,0.099004,-0.5,
+ -0.84747,-0.443196,0.292185,1.178115,0.10978,-0.415518,
+ -0.858311,-0.411604,0.306404,1.208797,0.050229,-0.410509,
+ -0.860968,-0.508659,0,1.136909,0.161755,-0.5,
+ -0.813982,-0.512235,0.273951,1.142211,0.172121,-0.420016,
+ -0.84747,-0.443196,0.292185,1.178115,0.10978,-0.415518,
+ -0.860968,-0.508659,0,1.136909,0.161755,-0.5,
+ -0.84747,-0.443196,0.292185,1.178115,0.10978,-0.415518,
+ -0.891261,-0.453491,0,1.170811,0.099004,-0.5,
+ -0.813982,-0.512235,0.273951,1.142211,0.172121,-0.420016,
+ -0.659424,-0.432639,0.614804,1.158118,0.203222,-0.353363,
+ -0.687216,-0.351805,0.635584,1.200029,0.142107,-0.345117,
+ -0.687216,-0.351805,0.635584,1.200029,0.142107,-0.345117,
+ -0.84747,-0.443196,0.292185,1.178115,0.10978,-0.415518,
+ -0.813982,-0.512235,0.273951,1.142211,0.172121,-0.420016,
+ 0.311074,0.63183,-0.709947,1.431839,0.331232,-0.664066,
+ 0.339667,0.655519,-0.674478,1.36073,0.379173,-0.654883,
+ 0.12092,0.358415,-0.925698,1.324207,0.325294,-0.697124,
+ 0.311074,0.63183,-0.709947,1.431839,0.331232,-0.664066,
+ 0.12092,0.358415,-0.925698,1.324207,0.325294,-0.697124,
+ 0.074097,0.34389,-0.936082,1.38723,0.275032,-0.708812,
+ 0.339667,0.655519,-0.674478,1.36073,0.379173,-0.654883,
+ 0.306584,0.689695,-0.655994,1.274769,0.43129,-0.646637,
+ 0.126992,0.363932,-0.922728,1.248257,0.379456,-0.686629,
+ 0.126992,0.363932,-0.922728,1.248257,0.379456,-0.686629,
+ 0.12092,0.358415,-0.925698,1.324207,0.325294,-0.697124,
+ 0.339667,0.655519,-0.674478,1.36073,0.379173,-0.654883,
+ -0.106175,0.048409,-0.993168,1.216443,0.317256,-0.69996,
+ -0.127933,0.082246,-0.988367,1.280379,0.26064,-0.711204,
+ 0.12092,0.358415,-0.925698,1.324207,0.325294,-0.697124,
+ -0.106175,0.048409,-0.993168,1.216443,0.317256,-0.69996,
+ 0.12092,0.358415,-0.925698,1.324207,0.325294,-0.697124,
+ 0.126992,0.363932,-0.922728,1.248257,0.379456,-0.686629,
+ -0.127933,0.082246,-0.988367,1.280379,0.26064,-0.711204,
+ -0.152737,0.118235,-0.981169,1.3337,0.207591,-0.723727,
+ 0.074097,0.34389,-0.936082,1.38723,0.275032,-0.708812,
+ 0.074097,0.34389,-0.936082,1.38723,0.275032,-0.708812,
+ 0.12092,0.358415,-0.925698,1.324207,0.325294,-0.697124,
+ -0.127933,0.082246,-0.988367,1.280379,0.26064,-0.711204,
+ 0.225321,0.739198,-0.634679,1.177908,0.476825,-0.640641,
+ 0.08947,0.74633,-0.659535,1.074101,0.505017,-0.638205,
+ 0.076521,0.412911,-0.907551,1.072171,0.456076,-0.675897,
+ 0.076521,0.412911,-0.907551,1.072171,0.456076,-0.675897,
+ 0.115814,0.384301,-0.915915,1.163029,0.426667,-0.678998,
+ 0.225321,0.739198,-0.634679,1.177908,0.476825,-0.640641,
+ 0.012548,-0.001301,-0.99992,1.069855,0.397346,-0.688461,
+ -0.066606,0.01431,-0.997677,1.145175,0.366478,-0.691783,
+ 0.115814,0.384301,-0.915915,1.163029,0.426667,-0.678998,
+ 0.012548,-0.001301,-0.99992,1.069855,0.397346,-0.688461,
+ 0.115814,0.384301,-0.915915,1.163029,0.426667,-0.678998,
+ 0.076521,0.412911,-0.907551,1.072171,0.456076,-0.675897,
+ -0.066606,0.01431,-0.997677,1.145175,0.366478,-0.691783,
+ -0.106175,0.048409,-0.993168,1.216443,0.317256,-0.69996,
+ 0.126992,0.363932,-0.922728,1.248257,0.379456,-0.686629,
+ 0.126992,0.363932,-0.922728,1.248257,0.379456,-0.686629,
+ 0.115814,0.384301,-0.915915,1.163029,0.426667,-0.678998,
+ -0.066606,0.01431,-0.997677,1.145175,0.366478,-0.691783,
+ 0.306584,0.689695,-0.655994,1.274769,0.43129,-0.646637,
+ 0.225321,0.739198,-0.634679,1.177908,0.476825,-0.640641,
+ 0.115814,0.384301,-0.915915,1.163029,0.426667,-0.678998,
+ 0.306584,0.689695,-0.655994,1.274769,0.43129,-0.646637,
+ 0.115814,0.384301,-0.915915,1.163029,0.426667,-0.678998,
+ 0.126992,0.363932,-0.922728,1.248257,0.379456,-0.686629,
+ -0.30458,-0.744204,-0.594467,1.065609,0.289676,-0.638205,
+ -0.547648,-0.532516,-0.645374,1.112441,0.256132,-0.640641,
+ -0.30711,-0.324628,-0.894595,1.12732,0.306289,-0.678998,
+ -0.30458,-0.744204,-0.594467,1.065609,0.289676,-0.638205,
+ -0.30711,-0.324628,-0.894595,1.12732,0.306289,-0.678998,
+ -0.094868,-0.409964,-0.907155,1.067539,0.338617,-0.675897,
+ -0.547648,-0.532516,-0.645374,1.112441,0.256132,-0.640641,
+ -0.659424,-0.432639,-0.614804,1.158118,0.203222,-0.646637,
+ -0.382336,-0.228691,-0.895276,1.18463,0.255055,-0.686629,
+ -0.382336,-0.228691,-0.895276,1.18463,0.255055,-0.686629,
+ -0.30711,-0.324628,-0.894595,1.12732,0.306289,-0.678998,
+ -0.547648,-0.532516,-0.645374,1.112441,0.256132,-0.640641,
+ -0.106175,0.048409,-0.993168,1.216443,0.317256,-0.69996,
+ -0.066606,0.01431,-0.997677,1.145175,0.366478,-0.691783,
+ -0.30711,-0.324628,-0.894595,1.12732,0.306289,-0.678998,
+ -0.106175,0.048409,-0.993168,1.216443,0.317256,-0.69996,
+ -0.30711,-0.324628,-0.894595,1.12732,0.306289,-0.678998,
+ -0.382336,-0.228691,-0.895276,1.18463,0.255055,-0.686629,
+ -0.066606,0.01431,-0.997677,1.145175,0.366478,-0.691783,
+ 0.012548,-0.001301,-0.99992,1.069855,0.397346,-0.688461,
+ -0.094868,-0.409964,-0.907155,1.067539,0.338617,-0.675897,
+ -0.094868,-0.409964,-0.907155,1.067539,0.338617,-0.675897,
+ -0.30711,-0.324628,-0.894595,1.12732,0.306289,-0.678998,
+ -0.066606,0.01431,-0.997677,1.145175,0.366478,-0.691783,
+ -0.687216,-0.351805,-0.635584,1.200029,0.142107,-0.654883,
+ -0.695773,-0.304145,-0.650689,1.235562,0.083949,-0.664066,
+ -0.420703,-0.10775,-0.900777,1.28017,0.14015,-0.708812,
+ -0.420703,-0.10775,-0.900777,1.28017,0.14015,-0.708812,
+ -0.406685,-0.158703,-0.899678,1.236552,0.195985,-0.697124,
+ -0.687216,-0.351805,-0.635584,1.200029,0.142107,-0.654883,
+ -0.152737,0.118235,-0.981169,1.3337,0.207591,-0.723727,
+ -0.127933,0.082246,-0.988367,1.280379,0.26064,-0.711204,
+ -0.406685,-0.158703,-0.899678,1.236552,0.195985,-0.697124,
+ -0.152737,0.118235,-0.981169,1.3337,0.207591,-0.723727,
+ -0.406685,-0.158703,-0.899678,1.236552,0.195985,-0.697124,
+ -0.420703,-0.10775,-0.900777,1.28017,0.14015,-0.708812,
+ -0.127933,0.082246,-0.988367,1.280379,0.26064,-0.711204,
+ -0.106175,0.048409,-0.993168,1.216443,0.317256,-0.69996,
+ -0.382336,-0.228691,-0.895276,1.18463,0.255055,-0.686629,
+ -0.382336,-0.228691,-0.895276,1.18463,0.255055,-0.686629,
+ -0.406685,-0.158703,-0.899678,1.236552,0.195985,-0.697124,
+ -0.127933,0.082246,-0.988367,1.280379,0.26064,-0.711204,
+ -0.659424,-0.432639,-0.614804,1.158118,0.203222,-0.646637,
+ -0.687216,-0.351805,-0.635584,1.200029,0.142107,-0.654883,
+ -0.406685,-0.158703,-0.899678,1.236552,0.195985,-0.697124,
+ -0.659424,-0.432639,-0.614804,1.158118,0.203222,-0.646637,
+ -0.406685,-0.158703,-0.899678,1.236552,0.195985,-0.697124,
+ -0.382336,-0.228691,-0.895276,1.18463,0.255055,-0.686629,
+ 0.311074,0.63183,0.709947,1.431839,0.331232,-0.335934,
+ 0.074097,0.34389,0.936082,1.38723,0.275032,-0.291188,
+ 0.12092,0.358415,0.925698,1.324207,0.325294,-0.302876,
+ 0.311074,0.63183,0.709947,1.431839,0.331232,-0.335934,
+ 0.12092,0.358415,0.925698,1.324207,0.325294,-0.302876,
+ 0.339667,0.655519,0.674478,1.36073,0.379173,-0.345117,
+ 0.074097,0.34389,0.936082,1.38723,0.275032,-0.291188,
+ -0.152737,0.118235,0.981169,1.3337,0.207591,-0.276273,
+ -0.127934,0.082246,0.988367,1.280379,0.26064,-0.288796,
+ -0.127934,0.082246,0.988367,1.280379,0.26064,-0.288796,
+ 0.12092,0.358415,0.925698,1.324207,0.325294,-0.302876,
+ 0.074097,0.34389,0.936082,1.38723,0.275032,-0.291188,
+ -0.106175,0.048409,0.993168,1.216443,0.317256,-0.30004,
+ 0.126992,0.363931,0.922728,1.248257,0.379456,-0.313371,
+ 0.12092,0.358415,0.925698,1.324207,0.325294,-0.302876,
+ -0.106175,0.048409,0.993168,1.216443,0.317256,-0.30004,
+ 0.12092,0.358415,0.925698,1.324207,0.325294,-0.302876,
+ -0.127934,0.082246,0.988367,1.280379,0.26064,-0.288796,
+ 0.126992,0.363931,0.922728,1.248257,0.379456,-0.313371,
+ 0.306584,0.689695,0.655994,1.274769,0.43129,-0.353363,
+ 0.339667,0.655519,0.674478,1.36073,0.379173,-0.345117,
+ 0.339667,0.655519,0.674478,1.36073,0.379173,-0.345117,
+ 0.12092,0.358415,0.925698,1.324207,0.325294,-0.302876,
+ 0.126992,0.363931,0.922728,1.248257,0.379456,-0.313371,
+ -0.420703,-0.10775,0.900777,1.28017,0.14015,-0.291188,
+ -0.695773,-0.304144,0.650689,1.235562,0.083949,-0.335934,
+ -0.687216,-0.351805,0.635584,1.200029,0.142107,-0.345117,
+ -0.687216,-0.351805,0.635584,1.200029,0.142107,-0.345117,
+ -0.406685,-0.158702,0.899678,1.236552,0.195985,-0.302876,
+ -0.420703,-0.10775,0.900777,1.28017,0.14015,-0.291188,
+ -0.659424,-0.432639,0.614804,1.158118,0.203222,-0.353363,
+ -0.382336,-0.228691,0.895276,1.18463,0.255055,-0.313371,
+ -0.406685,-0.158702,0.899678,1.236552,0.195985,-0.302876,
+ -0.659424,-0.432639,0.614804,1.158118,0.203222,-0.353363,
+ -0.406685,-0.158702,0.899678,1.236552,0.195985,-0.302876,
+ -0.687216,-0.351805,0.635584,1.200029,0.142107,-0.345117,
+ -0.382336,-0.228691,0.895276,1.18463,0.255055,-0.313371,
+ -0.106175,0.048409,0.993168,1.216443,0.317256,-0.30004,
+ -0.127934,0.082246,0.988367,1.280379,0.26064,-0.288796,
+ -0.127934,0.082246,0.988367,1.280379,0.26064,-0.288796,
+ -0.406685,-0.158702,0.899678,1.236552,0.195985,-0.302876,
+ -0.382336,-0.228691,0.895276,1.18463,0.255055,-0.313371,
+ -0.152737,0.118235,0.981169,1.3337,0.207591,-0.276273,
+ -0.420703,-0.10775,0.900777,1.28017,0.14015,-0.291188,
+ -0.406685,-0.158702,0.899678,1.236552,0.195985,-0.302876,
+ -0.152737,0.118235,0.981169,1.3337,0.207591,-0.276273,
+ -0.406685,-0.158702,0.899678,1.236552,0.195985,-0.302876,
+ -0.127934,0.082246,0.988367,1.280379,0.26064,-0.288796,
+ -0.30458,-0.744204,0.594467,1.065609,0.289676,-0.361795,
+ -0.094868,-0.409964,0.907155,1.067539,0.338617,-0.324103,
+ -0.30711,-0.324628,0.894595,1.12732,0.306289,-0.321002,
+ -0.30458,-0.744204,0.594467,1.065609,0.289676,-0.361795,
+ -0.30711,-0.324628,0.894595,1.12732,0.306289,-0.321002,
+ -0.547648,-0.532516,0.645374,1.112441,0.256132,-0.359359,
+ -0.094868,-0.409964,0.907155,1.067539,0.338617,-0.324103,
+ 0.012549,-0.001301,0.99992,1.069855,0.397346,-0.311539,
+ -0.066605,0.01431,0.997677,1.145175,0.366478,-0.308217,
+ -0.066605,0.01431,0.997677,1.145175,0.366478,-0.308217,
+ -0.30711,-0.324628,0.894595,1.12732,0.306289,-0.321002,
+ -0.094868,-0.409964,0.907155,1.067539,0.338617,-0.324103,
+ -0.106175,0.048409,0.993168,1.216443,0.317256,-0.30004,
+ -0.382336,-0.228691,0.895276,1.18463,0.255055,-0.313371,
+ -0.30711,-0.324628,0.894595,1.12732,0.306289,-0.321002,
+ -0.106175,0.048409,0.993168,1.216443,0.317256,-0.30004,
+ -0.30711,-0.324628,0.894595,1.12732,0.306289,-0.321002,
+ -0.066605,0.01431,0.997677,1.145175,0.366478,-0.308217,
+ -0.382336,-0.228691,0.895276,1.18463,0.255055,-0.313371,
+ -0.659424,-0.432639,0.614804,1.158118,0.203222,-0.353363,
+ -0.547648,-0.532516,0.645374,1.112441,0.256132,-0.359359,
+ -0.547648,-0.532516,0.645374,1.112441,0.256132,-0.359359,
+ -0.30711,-0.324628,0.894595,1.12732,0.306289,-0.321002,
+ -0.382336,-0.228691,0.895276,1.18463,0.255055,-0.313371,
+ 0.076521,0.412911,0.907551,1.072171,0.456076,-0.324103,
+ 0.08947,0.74633,0.659535,1.074101,0.505017,-0.361795,
+ 0.225321,0.739198,0.634679,1.177908,0.476825,-0.359359,
+ 0.225321,0.739198,0.634679,1.177908,0.476825,-0.359359,
+ 0.115814,0.384301,0.915915,1.163029,0.426667,-0.321002,
+ 0.076521,0.412911,0.907551,1.072171,0.456076,-0.324103,
+ 0.306584,0.689695,0.655994,1.274769,0.43129,-0.353363,
+ 0.126992,0.363931,0.922728,1.248257,0.379456,-0.313371,
+ 0.115814,0.384301,0.915915,1.163029,0.426667,-0.321002,
+ 0.306584,0.689695,0.655994,1.274769,0.43129,-0.353363,
+ 0.115814,0.384301,0.915915,1.163029,0.426667,-0.321002,
+ 0.225321,0.739198,0.634679,1.177908,0.476825,-0.359359,
+ 0.126992,0.363931,0.922728,1.248257,0.379456,-0.313371,
+ -0.106175,0.048409,0.993168,1.216443,0.317256,-0.30004,
+ -0.066605,0.01431,0.997677,1.145175,0.366478,-0.308217,
+ -0.066605,0.01431,0.997677,1.145175,0.366478,-0.308217,
+ 0.115814,0.384301,0.915915,1.163029,0.426667,-0.321002,
+ 0.126992,0.363931,0.922728,1.248257,0.379456,-0.313371,
+ 0.012549,-0.001301,0.99992,1.069855,0.397346,-0.311539,
+ 0.076521,0.412911,0.907551,1.072171,0.456076,-0.324103,
+ 0.115814,0.384301,0.915915,1.163029,0.426667,-0.321002,
+ 0.012549,-0.001301,0.99992,1.069855,0.397346,-0.311539,
+ 0.115814,0.384301,0.915915,1.163029,0.426667,-0.321002,
+ -0.066605,0.01431,0.997677,1.145175,0.366478,-0.308217,
+ 0.311074,0.63183,-0.709947,1.431839,0.331232,-0.664066,
+ 0.460195,0.823869,-0.330849,1.458604,0.364953,-0.589491,
+ 0.4628,0.825265,-0.323657,1.382643,0.4115,-0.584482,
+ 0.311074,0.63183,-0.709947,1.431839,0.331232,-0.664066,
+ 0.4628,0.825265,-0.323657,1.382643,0.4115,-0.584482,
+ 0.339667,0.655519,-0.674478,1.36073,0.379173,-0.654883,
+ 0.460195,0.823869,-0.330849,1.458604,0.364953,-0.589491,
+ 0.489941,0.871755,0,1.467526,0.376193,-0.5,
+ 0.499794,0.866144,0,1.389948,0.422275,-0.5,
+ 0.499794,0.866144,0,1.389948,0.422275,-0.5,
+ 0.4628,0.825265,-0.323657,1.382643,0.4115,-0.584482,
+ 0.460195,0.823869,-0.330849,1.458604,0.364953,-0.589491,
+ 0.445921,0.895072,0,1.295978,0.472757,-0.5,
+ 0.408321,0.858475,-0.310315,1.290676,0.46239,-0.579984,
+ 0.4628,0.825265,-0.323657,1.382643,0.4115,-0.584482,
+ 0.445921,0.895072,0,1.295978,0.472757,-0.5,
+ 0.4628,0.825265,-0.323657,1.382643,0.4115,-0.584482,
+ 0.499794,0.866144,0,1.389948,0.422275,-0.5,
+ 0.408321,0.858475,-0.310315,1.290676,0.46239,-0.579984,
+ 0.306584,0.689695,-0.655994,1.274769,0.43129,-0.646637,
+ 0.339667,0.655519,-0.674478,1.36073,0.379173,-0.654883,
+ 0.339667,0.655519,-0.674478,1.36073,0.379173,-0.654883,
+ 0.4628,0.825265,-0.323657,1.382643,0.4115,-0.584482,
+ 0.408321,0.858475,-0.310315,1.290676,0.46239,-0.579984,
+ 0.311074,0.63183,0.709947,1.431839,0.331232,-0.335934,
+ 0.339667,0.655519,0.674478,1.36073,0.379173,-0.345117,
+ 0.4628,0.825265,0.323657,1.382643,0.4115,-0.415518,
+ 0.311074,0.63183,0.709947,1.431839,0.331232,-0.335934,
+ 0.4628,0.825265,0.323657,1.382643,0.4115,-0.415518,
+ 0.460195,0.823869,0.330849,1.458604,0.364953,-0.410509,
+ 0.339667,0.655519,0.674478,1.36073,0.379173,-0.345117,
+ 0.306584,0.689695,0.655994,1.274769,0.43129,-0.353363,
+ 0.40832,0.858475,0.310315,1.290676,0.46239,-0.420016,
+ 0.40832,0.858475,0.310315,1.290676,0.46239,-0.420016,
+ 0.4628,0.825265,0.323657,1.382643,0.4115,-0.415518,
+ 0.339667,0.655519,0.674478,1.36073,0.379173,-0.345117,
+ 0.445921,0.895072,0,1.295978,0.472757,-0.5,
+ 0.499794,0.866144,0,1.389948,0.422275,-0.5,
+ 0.4628,0.825265,0.323657,1.382643,0.4115,-0.415518,
+ 0.445921,0.895072,0,1.295978,0.472757,-0.5,
+ 0.4628,0.825265,0.323657,1.382643,0.4115,-0.415518,
+ 0.40832,0.858475,0.310315,1.290676,0.46239,-0.420016,
+ 0.499794,0.866144,0,1.389948,0.422275,-0.5,
+ 0.489941,0.871755,0,1.467526,0.376193,-0.5,
+ 0.460195,0.823869,0.330849,1.458604,0.364953,-0.410509,
+ 0.460195,0.823869,0.330849,1.458604,0.364953,-0.410509,
+ 0.4628,0.825265,0.323657,1.382643,0.4115,-0.415518,
+ 0.499794,0.866144,0,1.389948,0.422275,-0.5,
+ 0.225321,0.739198,0.634679,1.177908,0.476825,-0.359359,
+ 0.08947,0.74633,0.659535,1.074101,0.505017,-0.361795,
+ 0.099282,0.948291,0.301476,1.075259,0.534381,-0.424615,
+ 0.099282,0.948291,0.301476,1.075259,0.534381,-0.424615,
+ 0.298199,0.907962,0.294419,1.186836,0.506919,-0.423287,
+ 0.225321,0.739198,0.634679,1.177908,0.476825,-0.359359,
+ 0.156232,0.98772,0,1.075645,0.544169,-0.5,
+ 0.336559,0.941662,0,1.189812,0.516951,-0.5,
+ 0.298199,0.907962,0.294419,1.186836,0.506919,-0.423287,
+ 0.156232,0.98772,0,1.075645,0.544169,-0.5,
+ 0.298199,0.907962,0.294419,1.186836,0.506919,-0.423287,
+ 0.099282,0.948291,0.301476,1.075259,0.534381,-0.424615,
+ 0.336559,0.941662,0,1.189812,0.516951,-0.5,
+ 0.445921,0.895072,0,1.295978,0.472757,-0.5,
+ 0.40832,0.858475,0.310315,1.290676,0.46239,-0.420016,
+ 0.40832,0.858475,0.310315,1.290676,0.46239,-0.420016,
+ 0.298199,0.907962,0.294419,1.186836,0.506919,-0.423287,
+ 0.336559,0.941662,0,1.189812,0.516951,-0.5,
+ 0.306584,0.689695,0.655994,1.274769,0.43129,-0.353363,
+ 0.225321,0.739198,0.634679,1.177908,0.476825,-0.359359,
+ 0.298199,0.907962,0.294419,1.186836,0.506919,-0.423287,
+ 0.306584,0.689695,0.655994,1.274769,0.43129,-0.353363,
+ 0.298199,0.907962,0.294419,1.186836,0.506919,-0.423287,
+ 0.40832,0.858475,0.310315,1.290676,0.46239,-0.420016,
+ 0.099282,0.948291,-0.301476,1.075259,0.534381,-0.575384,
+ 0.08947,0.74633,-0.659535,1.074101,0.505017,-0.638205,
+ 0.225321,0.739198,-0.634679,1.177908,0.476825,-0.640641,
+ 0.225321,0.739198,-0.634679,1.177908,0.476825,-0.640641,
+ 0.298199,0.907962,-0.294419,1.186836,0.506919,-0.576713,
+ 0.099282,0.948291,-0.301476,1.075259,0.534381,-0.575384,
+ 0.306584,0.689695,-0.655994,1.274769,0.43129,-0.646637,
+ 0.408321,0.858475,-0.310315,1.290676,0.46239,-0.579984,
+ 0.298199,0.907962,-0.294419,1.186836,0.506919,-0.576713,
+ 0.306584,0.689695,-0.655994,1.274769,0.43129,-0.646637,
+ 0.298199,0.907962,-0.294419,1.186836,0.506919,-0.576713,
+ 0.225321,0.739198,-0.634679,1.177908,0.476825,-0.640641,
+ 0.408321,0.858475,-0.310315,1.290676,0.46239,-0.579984,
+ 0.445921,0.895072,0,1.295978,0.472757,-0.5,
+ 0.336559,0.941662,0,1.189812,0.516951,-0.5,
+ 0.336559,0.941662,0,1.189812,0.516951,-0.5,
+ 0.298199,0.907962,-0.294419,1.186836,0.506919,-0.576713,
+ 0.408321,0.858475,-0.310315,1.290676,0.46239,-0.579984,
+ 0.156232,0.98772,0,1.075645,0.544169,-0.5,
+ 0.099282,0.948291,-0.301476,1.075259,0.534381,-0.575384,
+ 0.298199,0.907962,-0.294419,1.186836,0.506919,-0.576713,
+ 0.156232,0.98772,0,1.075645,0.544169,-0.5,
+ 0.298199,0.907962,-0.294419,1.186836,0.506919,-0.576713,
+ 0.336559,0.941662,0,1.189812,0.516951,-0.5,
+ -0.199176,0.745044,-0.636583,0.769932,0.456132,-0.654883,
+ -0.218035,0.735069,-0.641977,0.691977,0.424648,-0.664066,
+ -0.042916,0.448451,-0.892776,0.741552,0.375033,-0.708812,
+ -0.042916,0.448451,-0.892776,0.741552,0.375033,-0.708812,
+ -0.044996,0.438512,-0.897598,0.808756,0.407522,-0.697124,
+ -0.199176,0.745044,-0.636583,0.769932,0.456132,-0.654883,
+ 0.160738,0.160922,-0.97379,0.801042,0.315496,-0.723727,
+ 0.142808,0.115868,-0.982945,0.855345,0.34919,-0.711204,
+ -0.044996,0.438512,-0.897598,0.808756,0.407522,-0.697124,
+ 0.160738,0.160922,-0.97379,0.801042,0.315496,-0.723727,
+ -0.044996,0.438512,-0.897598,0.808756,0.407522,-0.697124,
+ -0.042916,0.448451,-0.892776,0.741552,0.375033,-0.708812,
+ 0.142808,0.115868,-0.982945,0.855345,0.34919,-0.711204,
+ 0.124797,0.069981,-0.989711,0.920924,0.379919,-0.69996,
+ -0.024081,0.437847,-0.898727,0.88977,0.437716,-0.686629,
+ -0.024081,0.437847,-0.898727,0.88977,0.437716,-0.686629,
+ -0.044996,0.438512,-0.897598,0.808756,0.407522,-0.697124,
+ 0.142808,0.115868,-0.982945,0.855345,0.34919,-0.711204,
+ -0.142137,0.766468,-0.626358,0.863808,0.485881,-0.646637,
+ -0.199176,0.745044,-0.636583,0.769932,0.456132,-0.654883,
+ -0.044996,0.438512,-0.897598,0.808756,0.407522,-0.697124,
+ -0.142137,0.766468,-0.626358,0.863808,0.485881,-0.646637,
+ -0.044996,0.438512,-0.897598,0.808756,0.407522,-0.697124,
+ -0.024081,0.437847,-0.898727,0.88977,0.437716,-0.686629,
+ 0.398283,-0.122544,-0.90904,0.860532,0.255958,-0.708812,
+ 0.66282,-0.338306,-0.667996,0.910107,0.206343,-0.664066,
+ 0.585878,-0.414463,-0.696396,0.940757,0.242249,-0.654883,
+ 0.585878,-0.414463,-0.696396,0.940757,0.242249,-0.654883,
+ 0.362669,-0.212082,-0.907465,0.901933,0.290859,-0.697124,
+ 0.398283,-0.122544,-0.90904,0.860532,0.255958,-0.708812,
+ 0.514373,-0.562786,-0.647064,0.978041,0.273957,-0.646637,
+ 0.281388,-0.318777,-0.905098,0.952079,0.322122,-0.686629,
+ 0.362669,-0.212082,-0.907465,0.901933,0.290859,-0.697124,
+ 0.514373,-0.562786,-0.647064,0.978041,0.273957,-0.646637,
+ 0.362669,-0.212082,-0.907465,0.901933,0.290859,-0.697124,
+ 0.585878,-0.414463,-0.696396,0.940757,0.242249,-0.654883,
+ 0.124797,0.069981,-0.989711,0.920924,0.379919,-0.69996,
+ 0.142808,0.115868,-0.982945,0.855345,0.34919,-0.711204,
+ 0.362669,-0.212082,-0.907465,0.901933,0.290859,-0.697124,
+ 0.124797,0.069981,-0.989711,0.920924,0.379919,-0.69996,
+ 0.362669,-0.212082,-0.907465,0.901933,0.290859,-0.697124,
+ 0.281388,-0.318777,-0.905098,0.952079,0.322122,-0.686629,
+ 0.142808,0.115868,-0.982945,0.855345,0.34919,-0.711204,
+ 0.160738,0.160922,-0.97379,0.801042,0.315496,-0.723727,
+ 0.398283,-0.122544,-0.90904,0.860532,0.255958,-0.708812,
+ 0.398283,-0.122544,-0.90904,0.860532,0.255958,-0.708812,
+ 0.362669,-0.212082,-0.907465,0.901933,0.290859,-0.697124,
+ 0.142808,0.115868,-0.982945,0.855345,0.34919,-0.711204,
+ 0.223486,-0.713834,-0.663698,1.020234,0.292692,-0.640641,
+ -0.30458,-0.744204,-0.594467,1.065609,0.289676,-0.638205,
+ -0.094868,-0.409964,-0.907155,1.067539,0.338617,-0.675897,
+ -0.094868,-0.409964,-0.907155,1.067539,0.338617,-0.675897,
+ 0.118719,-0.361063,-0.924954,1.008203,0.340968,-0.678998,
+ 0.223486,-0.713834,-0.663698,1.020234,0.292692,-0.640641,
+ 0.012548,-0.001301,-0.99992,1.069855,0.397346,-0.688461,
+ 0.086047,0.023651,-0.99601,0.993766,0.398899,-0.691783,
+ 0.118719,-0.361063,-0.924954,1.008203,0.340968,-0.678998,
+ 0.012548,-0.001301,-0.99992,1.069855,0.397346,-0.688461,
+ 0.118719,-0.361063,-0.924954,1.008203,0.340968,-0.678998,
+ -0.094868,-0.409964,-0.907155,1.067539,0.338617,-0.675897,
+ 0.086047,0.023651,-0.99601,0.993766,0.398899,-0.691783,
+ 0.124797,0.069981,-0.989711,0.920924,0.379919,-0.69996,
+ 0.281388,-0.318777,-0.905098,0.952079,0.322122,-0.686629,
+ 0.281388,-0.318777,-0.905098,0.952079,0.322122,-0.686629,
+ 0.118719,-0.361063,-0.924954,1.008203,0.340968,-0.678998,
+ 0.086047,0.023651,-0.99601,0.993766,0.398899,-0.691783,
+ 0.281388,-0.318777,-0.905098,0.952079,0.322122,-0.686629,
+ 0.514373,-0.562786,-0.647064,0.978041,0.273957,-0.646637,
+ 0.223486,-0.713834,-0.663698,1.020234,0.292692,-0.640641,
+ 0.223486,-0.713834,-0.663698,1.020234,0.292692,-0.640641,
+ 0.118719,-0.361063,-0.924954,1.008203,0.340968,-0.678998,
+ 0.281388,-0.318777,-0.905098,0.952079,0.322122,-0.686629,
+ 0.08947,0.74633,-0.659535,1.074101,0.505017,-0.638205,
+ -0.041682,0.78334,-0.620195,0.967299,0.505105,-0.640641,
+ 0.017449,0.433004,-0.901223,0.97933,0.45683,-0.678998,
+ 0.08947,0.74633,-0.659535,1.074101,0.505017,-0.638205,
+ 0.017449,0.433004,-0.901223,0.97933,0.45683,-0.678998,
+ 0.076521,0.412911,-0.907551,1.072171,0.456076,-0.675897,
+ -0.041682,0.78334,-0.620195,0.967299,0.505105,-0.640641,
+ -0.142137,0.766468,-0.626358,0.863808,0.485881,-0.646637,
+ -0.024081,0.437847,-0.898727,0.88977,0.437716,-0.686629,
+ -0.024081,0.437847,-0.898727,0.88977,0.437716,-0.686629,
+ 0.017449,0.433004,-0.901223,0.97933,0.45683,-0.678998,
+ -0.041682,0.78334,-0.620195,0.967299,0.505105,-0.640641,
+ 0.124797,0.069981,-0.989711,0.920924,0.379919,-0.69996,
+ 0.086047,0.023651,-0.99601,0.993766,0.398899,-0.691783,
+ 0.017449,0.433004,-0.901223,0.97933,0.45683,-0.678998,
+ 0.124797,0.069981,-0.989711,0.920924,0.379919,-0.69996,
+ 0.017449,0.433004,-0.901223,0.97933,0.45683,-0.678998,
+ -0.024081,0.437847,-0.898727,0.88977,0.437716,-0.686629,
+ 0.086047,0.023651,-0.99601,0.993766,0.398899,-0.691783,
+ 0.012548,-0.001301,-0.99992,1.069855,0.397346,-0.688461,
+ 0.076521,0.412911,-0.907551,1.072171,0.456076,-0.675897,
+ 0.076521,0.412911,-0.907551,1.072171,0.456076,-0.675897,
+ 0.017449,0.433004,-0.901223,0.97933,0.45683,-0.678998,
+ 0.086047,0.023651,-0.99601,0.993766,0.398899,-0.691783,
+ -0.218035,0.735069,-0.641977,0.691977,0.424648,-0.664066,
+ -0.199176,0.745044,-0.636583,0.769932,0.456132,-0.654883,
+ -0.283565,0.912815,-0.293871,0.746638,0.485298,-0.584482,
+ -0.218035,0.735069,-0.641977,0.691977,0.424648,-0.664066,
+ -0.283565,0.912815,-0.293871,0.746638,0.485298,-0.584482,
+ -0.31842,0.898971,-0.300764,0.662233,0.454417,-0.589491,
+ -0.199176,0.745044,-0.636583,0.769932,0.456132,-0.654883,
+ -0.142137,0.766468,-0.626358,0.863808,0.485881,-0.646637,
+ -0.20497,0.936687,-0.283911,0.848231,0.51478,-0.579984,
+ -0.20497,0.936687,-0.283911,0.848231,0.51478,-0.579984,
+ -0.283565,0.912815,-0.293871,0.746638,0.485298,-0.584482,
+ -0.199176,0.745044,-0.636583,0.769932,0.456132,-0.654883,
+ -0.237278,0.971442,0,0.843038,0.524412,-0.5,
+ -0.314129,0.94938,0,0.738873,0.49502,-0.5,
+ -0.283565,0.912815,-0.293871,0.746638,0.485298,-0.584482,
+ -0.237278,0.971442,0,0.843038,0.524412,-0.5,
+ -0.283565,0.912815,-0.293871,0.746638,0.485298,-0.584482,
+ -0.20497,0.936687,-0.283911,0.848231,0.51478,-0.579984,
+ -0.314129,0.94938,0,0.738873,0.49502,-0.5,
+ -0.346116,0.938192,0,0.652318,0.46434,-0.5,
+ -0.31842,0.898971,-0.300764,0.662233,0.454417,-0.589491,
+ -0.31842,0.898971,-0.300764,0.662233,0.454417,-0.589491,
+ -0.283565,0.912815,-0.293871,0.746638,0.485298,-0.584482,
+ -0.314129,0.94938,0,0.738873,0.49502,-0.5,
+ -0.041682,0.78334,-0.620195,0.967299,0.505105,-0.640641,
+ 0.08947,0.74633,-0.659535,1.074101,0.505017,-0.638205,
+ 0.099282,0.948291,-0.301476,1.075259,0.534381,-0.575384,
+ 0.099282,0.948291,-0.301476,1.075259,0.534381,-0.575384,
+ -0.090849,0.947666,-0.306066,0.960081,0.534071,-0.576713,
+ -0.041682,0.78334,-0.620195,0.967299,0.505105,-0.640641,
+ 0.099282,0.948291,-0.301476,1.075259,0.534381,-0.575384,
+ 0.156232,0.98772,0,1.075645,0.544169,-0.5,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ -0.090849,0.947666,-0.306066,0.960081,0.534071,-0.576713,
+ 0.099282,0.948291,-0.301476,1.075259,0.534381,-0.575384,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ -0.237278,0.971442,0,0.843038,0.524412,-0.5,
+ -0.20497,0.936687,-0.283911,0.848231,0.51478,-0.579984,
+ -0.20497,0.936687,-0.283911,0.848231,0.51478,-0.579984,
+ -0.090849,0.947666,-0.306066,0.960081,0.534071,-0.576713,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ -0.142137,0.766468,-0.626358,0.863808,0.485881,-0.646637,
+ -0.041682,0.78334,-0.620195,0.967299,0.505105,-0.640641,
+ -0.090849,0.947666,-0.306066,0.960081,0.534071,-0.576713,
+ -0.142137,0.766468,-0.626358,0.863808,0.485881,-0.646637,
+ -0.090849,0.947666,-0.306066,0.960081,0.534071,-0.576713,
+ -0.20497,0.936687,-0.283911,0.848231,0.51478,-0.579984,
+ 0.099282,0.948291,0.301476,1.075259,0.534381,-0.424615,
+ 0.08947,0.74633,0.659535,1.074101,0.505017,-0.361795,
+ -0.041682,0.78334,0.620195,0.967299,0.505105,-0.359359,
+ -0.041682,0.78334,0.620195,0.967299,0.505105,-0.359359,
+ -0.090849,0.947666,0.306066,0.960081,0.534071,-0.423287,
+ 0.099282,0.948291,0.301476,1.075259,0.534381,-0.424615,
+ -0.142137,0.766468,0.626358,0.863808,0.485881,-0.353363,
+ -0.20497,0.936687,0.283911,0.848231,0.51478,-0.420016,
+ -0.090849,0.947666,0.306066,0.960081,0.534071,-0.423287,
+ -0.142137,0.766468,0.626358,0.863808,0.485881,-0.353363,
+ -0.090849,0.947666,0.306066,0.960081,0.534071,-0.423287,
+ -0.041682,0.78334,0.620195,0.967299,0.505105,-0.359359,
+ -0.20497,0.936687,0.283911,0.848231,0.51478,-0.420016,
+ -0.237278,0.971442,0,0.843038,0.524412,-0.5,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ -0.090849,0.947666,0.306066,0.960081,0.534071,-0.423287,
+ -0.20497,0.936687,0.283911,0.848231,0.51478,-0.420016,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ 0.156232,0.98772,0,1.075645,0.544169,-0.5,
+ 0.099282,0.948291,0.301476,1.075259,0.534381,-0.424615,
+ 0.099282,0.948291,0.301476,1.075259,0.534381,-0.424615,
+ -0.090849,0.947666,0.306066,0.960081,0.534071,-0.423287,
+ -0.084634,0.996412,0,0.957675,0.543726,-0.5,
+ -0.218035,0.735069,0.641977,0.691977,0.424648,-0.335934,
+ -0.318419,0.898972,0.300764,0.662233,0.454417,-0.410509,
+ -0.283565,0.912815,0.293871,0.746638,0.485298,-0.415518,
+ -0.218035,0.735069,0.641977,0.691977,0.424648,-0.335934,
+ -0.283565,0.912815,0.293871,0.746638,0.485298,-0.415518,
+ -0.199176,0.745044,0.636583,0.769932,0.456132,-0.345117,
+ -0.318419,0.898972,0.300764,0.662233,0.454417,-0.410509,
+ -0.346116,0.938192,0,0.652318,0.46434,-0.5,
+ -0.314129,0.94938,0,0.738873,0.49502,-0.5,
+ -0.314129,0.94938,0,0.738873,0.49502,-0.5,
+ -0.283565,0.912815,0.293871,0.746638,0.485298,-0.415518,
+ -0.318419,0.898972,0.300764,0.662233,0.454417,-0.410509,
+ -0.237278,0.971442,0,0.843038,0.524412,-0.5,
+ -0.20497,0.936687,0.283911,0.848231,0.51478,-0.420016,
+ -0.283565,0.912815,0.293871,0.746638,0.485298,-0.415518,
+ -0.237278,0.971442,0,0.843038,0.524412,-0.5,
+ -0.283565,0.912815,0.293871,0.746638,0.485298,-0.415518,
+ -0.314129,0.94938,0,0.738873,0.49502,-0.5,
+ -0.20497,0.936687,0.283911,0.848231,0.51478,-0.420016,
+ -0.142137,0.766468,0.626358,0.863808,0.485881,-0.353363,
+ -0.199176,0.745044,0.636583,0.769932,0.456132,-0.345117,
+ -0.199176,0.745044,0.636583,0.769932,0.456132,-0.345117,
+ -0.283565,0.912815,0.293871,0.746638,0.485298,-0.415518,
+ -0.20497,0.936687,0.283911,0.848231,0.51478,-0.420016,
+ -0.042916,0.448451,0.892776,0.741552,0.375033,-0.291188,
+ -0.218035,0.735069,0.641977,0.691977,0.424648,-0.335934,
+ -0.199176,0.745044,0.636583,0.769932,0.456132,-0.345117,
+ -0.199176,0.745044,0.636583,0.769932,0.456132,-0.345117,
+ -0.044996,0.438512,0.897598,0.808756,0.407522,-0.302876,
+ -0.042916,0.448451,0.892776,0.741552,0.375033,-0.291188,
+ -0.142137,0.766468,0.626358,0.863808,0.485881,-0.353363,
+ -0.024081,0.437847,0.898727,0.88977,0.437716,-0.313371,
+ -0.044996,0.438512,0.897598,0.808756,0.407522,-0.302876,
+ -0.142137,0.766468,0.626358,0.863808,0.485881,-0.353363,
+ -0.044996,0.438512,0.897598,0.808756,0.407522,-0.302876,
+ -0.199176,0.745044,0.636583,0.769932,0.456132,-0.345117,
+ -0.024081,0.437847,0.898727,0.88977,0.437716,-0.313371,
+ 0.124797,0.069981,0.989711,0.920924,0.379919,-0.30004,
+ 0.142808,0.115868,0.982945,0.855345,0.34919,-0.288796,
+ 0.142808,0.115868,0.982945,0.855345,0.34919,-0.288796,
+ -0.044996,0.438512,0.897598,0.808756,0.407522,-0.302876,
+ -0.024081,0.437847,0.898727,0.88977,0.437716,-0.313371,
+ 0.160738,0.160922,0.97379,0.801042,0.315496,-0.276273,
+ -0.042916,0.448451,0.892776,0.741552,0.375033,-0.291188,
+ -0.044996,0.438512,0.897598,0.808756,0.407522,-0.302876,
+ 0.160738,0.160922,0.97379,0.801042,0.315496,-0.276273,
+ -0.044996,0.438512,0.897598,0.808756,0.407522,-0.302876,
+ 0.142808,0.115868,0.982945,0.855345,0.34919,-0.288796,
+ 0.08947,0.74633,0.659535,1.074101,0.505017,-0.361795,
+ 0.076521,0.412911,0.907551,1.072171,0.456076,-0.324103,
+ 0.017449,0.433004,0.901223,0.97933,0.45683,-0.321002,
+ 0.08947,0.74633,0.659535,1.074101,0.505017,-0.361795,
+ 0.017449,0.433004,0.901223,0.97933,0.45683,-0.321002,
+ -0.041682,0.78334,0.620195,0.967299,0.505105,-0.359359,
+ 0.076521,0.412911,0.907551,1.072171,0.456076,-0.324103,
+ 0.012549,-0.001301,0.99992,1.069855,0.397346,-0.311539,
+ 0.086047,0.023651,0.99601,0.993766,0.398899,-0.308217,
+ 0.086047,0.023651,0.99601,0.993766,0.398899,-0.308217,
+ 0.017449,0.433004,0.901223,0.97933,0.45683,-0.321002,
+ 0.076521,0.412911,0.907551,1.072171,0.456076,-0.324103,
+ 0.124797,0.069981,0.989711,0.920924,0.379919,-0.30004,
+ -0.024081,0.437847,0.898727,0.88977,0.437716,-0.313371,
+ 0.017449,0.433004,0.901223,0.97933,0.45683,-0.321002,
+ 0.124797,0.069981,0.989711,0.920924,0.379919,-0.30004,
+ 0.017449,0.433004,0.901223,0.97933,0.45683,-0.321002,
+ 0.086047,0.023651,0.99601,0.993766,0.398899,-0.308217,
+ -0.024081,0.437847,0.898727,0.88977,0.437716,-0.313371,
+ -0.142137,0.766468,0.626358,0.863808,0.485881,-0.353363,
+ -0.041682,0.78334,0.620195,0.967299,0.505105,-0.359359,
+ -0.041682,0.78334,0.620195,0.967299,0.505105,-0.359359,
+ 0.017449,0.433004,0.901223,0.97933,0.45683,-0.321002,
+ -0.024081,0.437847,0.898727,0.88977,0.437716,-0.313371,
+ -0.094868,-0.409964,0.907155,1.067539,0.338617,-0.324103,
+ -0.30458,-0.744204,0.594467,1.065609,0.289676,-0.361795,
+ 0.223486,-0.713834,0.663698,1.020234,0.292692,-0.359359,
+ 0.223486,-0.713834,0.663698,1.020234,0.292692,-0.359359,
+ 0.118719,-0.361063,0.924954,1.008203,0.340968,-0.321002,
+ -0.094868,-0.409964,0.907155,1.067539,0.338617,-0.324103,
+ 0.223486,-0.713834,0.663698,1.020234,0.292692,-0.359359,
+ 0.514373,-0.562786,0.647064,0.978041,0.273957,-0.353363,
+ 0.281389,-0.318776,0.905098,0.952079,0.322122,-0.313371,
+ 0.281389,-0.318776,0.905098,0.952079,0.322122,-0.313371,
+ 0.118719,-0.361063,0.924954,1.008203,0.340968,-0.321002,
+ 0.223486,-0.713834,0.663698,1.020234,0.292692,-0.359359,
+ 0.281389,-0.318776,0.905098,0.952079,0.322122,-0.313371,
+ 0.124797,0.069981,0.989711,0.920924,0.379919,-0.30004,
+ 0.086047,0.023651,0.99601,0.993766,0.398899,-0.308217,
+ 0.086047,0.023651,0.99601,0.993766,0.398899,-0.308217,
+ 0.118719,-0.361063,0.924954,1.008203,0.340968,-0.321002,
+ 0.281389,-0.318776,0.905098,0.952079,0.322122,-0.313371,
+ 0.012549,-0.001301,0.99992,1.069855,0.397346,-0.311539,
+ -0.094868,-0.409964,0.907155,1.067539,0.338617,-0.324103,
+ 0.118719,-0.361063,0.924954,1.008203,0.340968,-0.321002,
+ 0.012549,-0.001301,0.99992,1.069855,0.397346,-0.311539,
+ 0.118719,-0.361063,0.924954,1.008203,0.340968,-0.321002,
+ 0.086047,0.023651,0.99601,0.993766,0.398899,-0.308217,
+ 0.585878,-0.414463,0.696396,0.940757,0.242249,-0.345117,
+ 0.66282,-0.338306,0.667996,0.910107,0.206343,-0.335934,
+ 0.398283,-0.122544,0.90904,0.860532,0.255958,-0.291188,
+ 0.398283,-0.122544,0.90904,0.860532,0.255958,-0.291188,
+ 0.362669,-0.212082,0.907465,0.901933,0.290859,-0.302876,
+ 0.585878,-0.414463,0.696396,0.940757,0.242249,-0.345117,
+ 0.398283,-0.122544,0.90904,0.860532,0.255958,-0.291188,
+ 0.160738,0.160922,0.97379,0.801042,0.315496,-0.276273,
+ 0.142808,0.115868,0.982945,0.855345,0.34919,-0.288796,
+ 0.142808,0.115868,0.982945,0.855345,0.34919,-0.288796,
+ 0.362669,-0.212082,0.907465,0.901933,0.290859,-0.302876,
+ 0.398283,-0.122544,0.90904,0.860532,0.255958,-0.291188,
+ 0.124797,0.069981,0.989711,0.920924,0.379919,-0.30004,
+ 0.281389,-0.318776,0.905098,0.952079,0.322122,-0.313371,
+ 0.362669,-0.212082,0.907465,0.901933,0.290859,-0.302876,
+ 0.124797,0.069981,0.989711,0.920924,0.379919,-0.30004,
+ 0.362669,-0.212082,0.907465,0.901933,0.290859,-0.302876,
+ 0.142808,0.115868,0.982945,0.855345,0.34919,-0.288796,
+ 0.514373,-0.562786,0.647064,0.978041,0.273957,-0.353363,
+ 0.585878,-0.414463,0.696396,0.940757,0.242249,-0.345117,
+ 0.362669,-0.212082,0.907465,0.901933,0.290859,-0.302876,
+ 0.514373,-0.562786,0.647064,0.978041,0.273957,-0.353363,
+ 0.362669,-0.212082,0.907465,0.901933,0.290859,-0.302876,
+ 0.281389,-0.318776,0.905098,0.952079,0.322122,-0.313371,
+ 0.66282,-0.338306,0.667996,0.910107,0.206343,-0.335934,
+ 0.585878,-0.414463,0.696396,0.940757,0.242249,-0.345117,
+ 0.748153,-0.579603,0.322997,0.964051,0.213083,-0.415518,
+ 0.66282,-0.338306,0.667996,0.910107,0.206343,-0.335934,
+ 0.748153,-0.579603,0.322997,0.964051,0.213083,-0.415518,
+ 0.828154,-0.461264,0.318428,0.939852,0.176575,-0.410509,
+ 0.514373,-0.562786,0.647064,0.978041,0.273957,-0.353363,
+ 0.575394,-0.755507,0.31326,0.993618,0.245059,-0.420016,
+ 0.748153,-0.579603,0.322997,0.964051,0.213083,-0.415518,
+ 0.514373,-0.562786,0.647064,0.978041,0.273957,-0.353363,
+ 0.748153,-0.579603,0.322997,0.964051,0.213083,-0.415518,
+ 0.585878,-0.414463,0.696396,0.940757,0.242249,-0.345117,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.82345,-0.567389,0,0.971816,0.203361,-0.5,
+ 0.748153,-0.579603,0.322997,0.964051,0.213083,-0.415518,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.748153,-0.579603,0.322997,0.964051,0.213083,-0.415518,
+ 0.575394,-0.755507,0.31326,0.993618,0.245059,-0.420016,
+ 0.82345,-0.567389,0,0.971816,0.203361,-0.5,
+ 0.879883,-0.475191,0,0.949767,0.166652,-0.5,
+ 0.828154,-0.461264,0.318428,0.939852,0.176575,-0.410509,
+ 0.828154,-0.461264,0.318428,0.939852,0.176575,-0.410509,
+ 0.748153,-0.579603,0.322997,0.964051,0.213083,-0.415518,
+ 0.82345,-0.567389,0,0.971816,0.203361,-0.5,
+ -0.30458,-0.744204,0.594467,1.065609,0.289676,-0.361795,
+ -0.393741,-0.892942,0.218225,1.064451,0.260311,-0.424615,
+ 0.224558,-0.931869,0.284944,1.027452,0.263727,-0.423287,
+ -0.30458,-0.744204,0.594467,1.065609,0.289676,-0.361795,
+ 0.224558,-0.931869,0.284944,1.027452,0.263727,-0.423287,
+ 0.223486,-0.713834,0.663698,1.020234,0.292692,-0.359359,
+ -0.393741,-0.892942,0.218225,1.064451,0.260311,-0.424615,
+ -0.417976,-0.908458,0,1.064065,0.250523,-0.5,
+ 0.113113,-0.993582,0,1.029858,0.254072,-0.5,
+ 0.113113,-0.993582,0,1.029858,0.254072,-0.5,
+ 0.224558,-0.931869,0.284944,1.027452,0.263727,-0.423287,
+ -0.393741,-0.892942,0.218225,1.064451,0.260311,-0.424615,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.575394,-0.755507,0.31326,0.993618,0.245059,-0.420016,
+ 0.224558,-0.931869,0.284944,1.027452,0.263727,-0.423287,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.224558,-0.931869,0.284944,1.027452,0.263727,-0.423287,
+ 0.113113,-0.993582,0,1.029858,0.254072,-0.5,
+ 0.575394,-0.755507,0.31326,0.993618,0.245059,-0.420016,
+ 0.514373,-0.562786,0.647064,0.978041,0.273957,-0.353363,
+ 0.223486,-0.713834,0.663698,1.020234,0.292692,-0.359359,
+ 0.223486,-0.713834,0.663698,1.020234,0.292692,-0.359359,
+ 0.224558,-0.931869,0.284944,1.027452,0.263727,-0.423287,
+ 0.575394,-0.755507,0.31326,0.993618,0.245059,-0.420016,
+ -0.30458,-0.744204,-0.594467,1.065609,0.289676,-0.638205,
+ 0.223486,-0.713834,-0.663698,1.020234,0.292692,-0.640641,
+ 0.224558,-0.931869,-0.284944,1.027452,0.263727,-0.576713,
+ -0.30458,-0.744204,-0.594467,1.065609,0.289676,-0.638205,
+ 0.224558,-0.931869,-0.284944,1.027452,0.263727,-0.576713,
+ -0.39374,-0.892943,-0.218225,1.064451,0.260311,-0.575384,
+ 0.223486,-0.713834,-0.663698,1.020234,0.292692,-0.640641,
+ 0.514373,-0.562786,-0.647064,0.978041,0.273957,-0.646637,
+ 0.575393,-0.755507,-0.31326,0.993618,0.245059,-0.579984,
+ 0.575393,-0.755507,-0.31326,0.993618,0.245059,-0.579984,
+ 0.224558,-0.931869,-0.284944,1.027452,0.263727,-0.576713,
+ 0.223486,-0.713834,-0.663698,1.020234,0.292692,-0.640641,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.113113,-0.993582,0,1.029858,0.254072,-0.5,
+ 0.224558,-0.931869,-0.284944,1.027452,0.263727,-0.576713,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.224558,-0.931869,-0.284944,1.027452,0.263727,-0.576713,
+ 0.575393,-0.755507,-0.31326,0.993618,0.245059,-0.579984,
+ 0.113113,-0.993582,0,1.029858,0.254072,-0.5,
+ -0.417976,-0.908458,0,1.064065,0.250523,-0.5,
+ -0.39374,-0.892943,-0.218225,1.064451,0.260311,-0.575384,
+ -0.39374,-0.892943,-0.218225,1.064451,0.260311,-0.575384,
+ 0.224558,-0.931869,-0.284944,1.027452,0.263727,-0.576713,
+ 0.113113,-0.993582,0,1.029858,0.254072,-0.5,
+ 0.66282,-0.338306,-0.667996,0.910107,0.206343,-0.664066,
+ 0.828154,-0.461264,-0.318429,0.939852,0.176575,-0.589491,
+ 0.748153,-0.579603,-0.322997,0.964051,0.213083,-0.584482,
+ 0.66282,-0.338306,-0.667996,0.910107,0.206343,-0.664066,
+ 0.748153,-0.579603,-0.322997,0.964051,0.213083,-0.584482,
+ 0.585878,-0.414463,-0.696396,0.940757,0.242249,-0.654883,
+ 0.828154,-0.461264,-0.318429,0.939852,0.176575,-0.589491,
+ 0.879883,-0.475191,0,0.949767,0.166652,-0.5,
+ 0.82345,-0.567389,0,0.971816,0.203361,-0.5,
+ 0.82345,-0.567389,0,0.971816,0.203361,-0.5,
+ 0.748153,-0.579603,-0.322997,0.964051,0.213083,-0.584482,
+ 0.828154,-0.461264,-0.318429,0.939852,0.176575,-0.589491,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.575393,-0.755507,-0.31326,0.993618,0.245059,-0.579984,
+ 0.748153,-0.579603,-0.322997,0.964051,0.213083,-0.584482,
+ 0.637531,-0.770425,0,0.998811,0.235426,-0.5,
+ 0.748153,-0.579603,-0.322997,0.964051,0.213083,-0.584482,
+ 0.82345,-0.567389,0,0.971816,0.203361,-0.5,
+ 0.514373,-0.562786,-0.647064,0.978041,0.273957,-0.646637,
+ 0.585878,-0.414463,-0.696396,0.940757,0.242249,-0.654883,
+ 0.748153,-0.579603,-0.322997,0.964051,0.213083,-0.584482,
+ 0.514373,-0.562786,-0.647064,0.978041,0.273957,-0.646637,
+ 0.748153,-0.579603,-0.322997,0.964051,0.213083,-0.584482,
+ 0.575393,-0.755507,-0.31326,0.993618,0.245059,-0.579984,
+ 0.65574,-0.380493,0.652097,0.887817,0.175019,-0.327123,
+ 0.66282,-0.338306,0.667996,0.910107,0.206343,-0.335934,
+ 0.828154,-0.461264,0.318428,0.939852,0.176575,-0.410509,
+ 0.828154,-0.461264,0.318428,0.939852,0.176575,-0.410509,
+ 0.788892,-0.514111,0.336659,0.922122,0.14431,-0.405704,
+ 0.65574,-0.380493,0.652097,0.887817,0.175019,-0.327123,
+ 0.879883,-0.475191,0,0.949767,0.166652,-0.5,
+ 0.818537,-0.574454,0,0.933557,0.134073,-0.5,
+ 0.788892,-0.514111,0.336659,0.922122,0.14431,-0.405704,
+ 0.879883,-0.475191,0,0.949767,0.166652,-0.5,
+ 0.788892,-0.514111,0.336659,0.922122,0.14431,-0.405704,
+ 0.828154,-0.461264,0.318428,0.939852,0.176575,-0.410509,
+ 0.818537,-0.574454,0,0.933557,0.134073,-0.5,
+ 0.394485,-0.918903,0,0.915792,0.112008,-0.5,
+ 0.520237,-0.801686,0.294369,0.90384,0.122594,-0.405051,
+ 0.520237,-0.801686,0.294369,0.90384,0.122594,-0.405051,
+ 0.788892,-0.514111,0.336659,0.922122,0.14431,-0.405704,
+ 0.818537,-0.574454,0,0.933557,0.134073,-0.5,
+ 0.31991,-0.691022,0.648187,0.867858,0.153664,-0.325812,
+ 0.65574,-0.380493,0.652097,0.887817,0.175019,-0.327123,
+ 0.788892,-0.514111,0.336659,0.922122,0.14431,-0.405704,
+ 0.31991,-0.691022,0.648187,0.867858,0.153664,-0.325812,
+ 0.788892,-0.514111,0.336659,0.922122,0.14431,-0.405704,
+ 0.520237,-0.801686,0.294369,0.90384,0.122594,-0.405051,
+ 0.828154,-0.461264,-0.318429,0.939852,0.176575,-0.589491,
+ 0.66282,-0.338306,-0.667996,0.910107,0.206343,-0.664066,
+ 0.65574,-0.380493,-0.652097,0.887817,0.175019,-0.672877,
+ 0.65574,-0.380493,-0.652097,0.887817,0.175019,-0.672877,
+ 0.788892,-0.514111,-0.336659,0.922122,0.14431,-0.594296,
+ 0.828154,-0.461264,-0.318429,0.939852,0.176575,-0.589491,
+ 0.31991,-0.691022,-0.648187,0.867858,0.153664,-0.674188,
+ 0.520237,-0.801686,-0.29437,0.90384,0.122594,-0.594949,
+ 0.788892,-0.514111,-0.336659,0.922122,0.14431,-0.594296,
+ 0.31991,-0.691022,-0.648187,0.867858,0.153664,-0.674188,
+ 0.788892,-0.514111,-0.336659,0.922122,0.14431,-0.594296,
+ 0.65574,-0.380493,-0.652097,0.887817,0.175019,-0.672877,
+ 0.520237,-0.801686,-0.29437,0.90384,0.122594,-0.594949,
+ 0.394485,-0.918903,0,0.915792,0.112008,-0.5,
+ 0.818537,-0.574454,0,0.933557,0.134073,-0.5,
+ 0.818537,-0.574454,0,0.933557,0.134073,-0.5,
+ 0.788892,-0.514111,-0.336659,0.922122,0.14431,-0.594296,
+ 0.520237,-0.801686,-0.29437,0.90384,0.122594,-0.594949,
+ 0.879883,-0.475191,0,0.949767,0.166652,-0.5,
+ 0.828154,-0.461264,-0.318429,0.939852,0.176575,-0.589491,
+ 0.788892,-0.514111,-0.336659,0.922122,0.14431,-0.594296,
+ 0.879883,-0.475191,0,0.949767,0.166652,-0.5,
+ 0.788892,-0.514111,-0.336659,0.922122,0.14431,-0.594296,
+ 0.818537,-0.574454,0,0.933557,0.134073,-0.5,
+ -0.464025,-0.863104,-0.199329,0.820528,0.154011,-0.638667,
+ -0.4837,-0.869471,-0.100277,0.83753,0.13389,-0.5825,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ -0.464025,-0.863104,-0.199329,0.820528,0.154011,-0.638667,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ -0.23383,-0.86988,-0.434318,0.844199,0.147671,-0.660875,
+ -0.435927,-0.899982,0,0.846018,0.123878,-0.5,
+ -0.093893,-0.995582,0,0.889078,0.10684,-0.5,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ -0.435927,-0.899982,0,0.846018,0.123878,-0.5,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ -0.4837,-0.869471,-0.100277,0.83753,0.13389,-0.5825,
+ 0.394485,-0.918903,0,0.915792,0.112008,-0.5,
+ 0.520237,-0.801686,-0.29437,0.90384,0.122594,-0.594949,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ 0.394485,-0.918903,0,0.915792,0.112008,-0.5,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ -0.093893,-0.995582,0,0.889078,0.10684,-0.5,
+ 0.31991,-0.691022,-0.648187,0.867858,0.153664,-0.674188,
+ -0.23383,-0.86988,-0.434318,0.844199,0.147671,-0.660875,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ 0.31991,-0.691022,-0.648187,0.867858,0.153664,-0.674188,
+ -0.146037,-0.967926,-0.204432,0.877985,0.117734,-0.5875,
+ 0.520237,-0.801686,-0.29437,0.90384,0.122594,-0.594949,
+ -0.464025,-0.863104,0.199329,0.820528,0.154011,-0.361333,
+ -0.23383,-0.86988,0.434318,0.844199,0.147671,-0.339125,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ -0.464025,-0.863104,0.199329,0.820528,0.154011,-0.361333,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ -0.4837,-0.869471,0.100277,0.83753,0.13389,-0.4175,
+ 0.31991,-0.691022,0.648187,0.867858,0.153664,-0.325812,
+ 0.520237,-0.801686,0.294369,0.90384,0.122594,-0.405051,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ 0.31991,-0.691022,0.648187,0.867858,0.153664,-0.325812,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ -0.23383,-0.86988,0.434318,0.844199,0.147671,-0.339125,
+ 0.394485,-0.918903,0,0.915792,0.112008,-0.5,
+ -0.093893,-0.995582,0,0.889078,0.10684,-0.5,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ 0.394485,-0.918903,0,0.915792,0.112008,-0.5,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ 0.520237,-0.801686,0.294369,0.90384,0.122594,-0.405051,
+ -0.435927,-0.899982,0,0.846018,0.123878,-0.5,
+ -0.4837,-0.869471,0.100277,0.83753,0.13389,-0.4175,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ -0.435927,-0.899982,0,0.846018,0.123878,-0.5,
+ -0.146037,-0.967926,0.204432,0.877985,0.117734,-0.4125,
+ -0.093893,-0.995582,0,0.889078,0.10684,-0.5,
+ 0.66282,-0.338306,-0.667996,0.910107,0.206343,-0.664066,
+ 0.398283,-0.122544,-0.90904,0.860532,0.255958,-0.708812,
+ 0.378094,-0.147323,-0.91397,0.830643,0.2262,-0.720025,
+ 0.66282,-0.338306,-0.667996,0.910107,0.206343,-0.664066,
+ 0.378094,-0.147323,-0.91397,0.830643,0.2262,-0.720025,
+ 0.65574,-0.380493,-0.652097,0.887817,0.175019,-0.672877,
+ 0.160738,0.160922,-0.97379,0.801042,0.315496,-0.723727,
+ 0.108083,0.116579,-0.987283,0.762033,0.287619,-0.735741,
+ 0.378094,-0.147323,-0.91397,0.830643,0.2262,-0.720025,
+ 0.160738,0.160922,-0.97379,0.801042,0.315496,-0.723727,
+ 0.378094,-0.147323,-0.91397,0.830643,0.2262,-0.720025,
+ 0.398283,-0.122544,-0.90904,0.860532,0.255958,-0.708812,
+ 0.108083,0.116579,-0.987283,0.762033,0.287619,-0.735741,
+ -0.233968,-0.2359,-0.943191,0.735693,0.265534,-0.73806,
+ 0.024413,-0.469703,-0.882487,0.807717,0.204533,-0.722006,
+ 0.024413,-0.469703,-0.882487,0.807717,0.204533,-0.722006,
+ 0.378094,-0.147323,-0.91397,0.830643,0.2262,-0.720025,
+ 0.108083,0.116579,-0.987283,0.762033,0.287619,-0.735741,
+ 0.31991,-0.691022,-0.648187,0.867858,0.153664,-0.674188,
+ 0.65574,-0.380493,-0.652097,0.887817,0.175019,-0.672877,
+ 0.378094,-0.147323,-0.91397,0.830643,0.2262,-0.720025,
+ 0.31991,-0.691022,-0.648187,0.867858,0.153664,-0.674188,
+ 0.378094,-0.147323,-0.91397,0.830643,0.2262,-0.720025,
+ 0.024413,-0.469703,-0.882487,0.807717,0.204533,-0.722006,
+ -0.218035,0.735069,-0.641977,0.691977,0.424648,-0.664066,
+ -0.304611,0.675798,-0.6712,0.636249,0.400218,-0.672877,
+ -0.106617,0.392034,-0.913752,0.693423,0.349037,-0.720025,
+ -0.218035,0.735069,-0.641977,0.691977,0.424648,-0.664066,
+ -0.106617,0.392034,-0.913752,0.693423,0.349037,-0.720025,
+ -0.042916,0.448451,-0.892776,0.741552,0.375033,-0.708812,
+ -0.304611,0.675798,-0.6712,0.636249,0.400218,-0.672877,
+ -0.638487,0.393678,-0.661326,0.60431,0.378335,-0.674188,
+ -0.462569,0.070189,-0.8838,0.66406,0.327,-0.722006,
+ -0.462569,0.070189,-0.8838,0.66406,0.327,-0.722006,
+ -0.106617,0.392034,-0.913752,0.693423,0.349037,-0.720025,
+ -0.304611,0.675798,-0.6712,0.636249,0.400218,-0.672877,
+ -0.233968,-0.2359,-0.943191,0.735693,0.265534,-0.73806,
+ 0.108083,0.116579,-0.987283,0.762033,0.287619,-0.735741,
+ -0.106617,0.392034,-0.913752,0.693423,0.349037,-0.720025,
+ -0.233968,-0.2359,-0.943191,0.735693,0.265534,-0.73806,
+ -0.106617,0.392034,-0.913752,0.693423,0.349037,-0.720025,
+ -0.462569,0.070189,-0.8838,0.66406,0.327,-0.722006,
+ 0.108083,0.116579,-0.987283,0.762033,0.287619,-0.735741,
+ 0.160738,0.160922,-0.97379,0.801042,0.315496,-0.723727,
+ -0.042916,0.448451,-0.892776,0.741552,0.375033,-0.708812,
+ -0.042916,0.448451,-0.892776,0.741552,0.375033,-0.708812,
+ -0.106617,0.392034,-0.913752,0.693423,0.349037,-0.720025,
+ 0.108083,0.116579,-0.987283,0.762033,0.287619,-0.735741,
+ -0.838454,-0.308168,-0.449475,0.597724,0.354488,-0.660875,
+ -0.772673,-0.608887,-0.179534,0.608078,0.332278,-0.638667,
+ -0.712429,-0.672822,-0.199386,0.648221,0.292739,-0.664625,
+ -0.712429,-0.672822,-0.199386,0.648221,0.292739,-0.664625,
+ -0.660431,-0.496512,-0.563299,0.653151,0.306393,-0.706,
+ -0.838454,-0.308168,-0.449475,0.597724,0.354488,-0.660875,
+ -0.635534,-0.736296,-0.232302,0.709997,0.238013,-0.677562,
+ -0.531095,-0.656282,-0.53594,0.719399,0.249218,-0.7215,
+ -0.660431,-0.496512,-0.563299,0.653151,0.306393,-0.706,
+ -0.635534,-0.736296,-0.232302,0.709997,0.238013,-0.677562,
+ -0.660431,-0.496512,-0.563299,0.653151,0.306393,-0.706,
+ -0.712429,-0.672822,-0.199386,0.648221,0.292739,-0.664625,
+ -0.233968,-0.2359,-0.943191,0.735693,0.265534,-0.73806,
+ -0.462569,0.070189,-0.8838,0.66406,0.327,-0.722006,
+ -0.660431,-0.496512,-0.563299,0.653151,0.306393,-0.706,
+ -0.233968,-0.2359,-0.943191,0.735693,0.265534,-0.73806,
+ -0.660431,-0.496512,-0.563299,0.653151,0.306393,-0.706,
+ -0.531095,-0.656282,-0.53594,0.719399,0.249218,-0.7215,
+ -0.462569,0.070189,-0.8838,0.66406,0.327,-0.722006,
+ -0.638487,0.393678,-0.661326,0.60431,0.378335,-0.674188,
+ -0.838454,-0.308168,-0.449475,0.597724,0.354488,-0.660875,
+ -0.838454,-0.308168,-0.449475,0.597724,0.354488,-0.660875,
+ -0.660431,-0.496512,-0.563299,0.653151,0.306393,-0.706,
+ -0.462569,0.070189,-0.8838,0.66406,0.327,-0.722006,
+ -0.464025,-0.863104,-0.199329,0.820528,0.154011,-0.638667,
+ -0.23383,-0.86988,-0.434318,0.844199,0.147671,-0.660875,
+ -0.376394,-0.756788,-0.534415,0.787209,0.193905,-0.706,
+ -0.464025,-0.863104,-0.199329,0.820528,0.154011,-0.638667,
+ -0.376394,-0.756788,-0.534415,0.787209,0.193905,-0.706,
+ -0.552608,-0.806562,-0.209959,0.774619,0.186679,-0.664625,
+ -0.23383,-0.86988,-0.434318,0.844199,0.147671,-0.660875,
+ 0.31991,-0.691022,-0.648187,0.867858,0.153664,-0.674188,
+ 0.024413,-0.469703,-0.882487,0.807717,0.204533,-0.722006,
+ 0.024413,-0.469703,-0.882487,0.807717,0.204533,-0.722006,
+ -0.376394,-0.756788,-0.534415,0.787209,0.193905,-0.706,
+ -0.23383,-0.86988,-0.434318,0.844199,0.147671,-0.660875,
+ -0.233968,-0.2359,-0.943191,0.735693,0.265534,-0.73806,
+ -0.531095,-0.656282,-0.53594,0.719399,0.249218,-0.7215,
+ -0.376394,-0.756788,-0.534415,0.787209,0.193905,-0.706,
+ -0.233968,-0.2359,-0.943191,0.735693,0.265534,-0.73806,
+ -0.376394,-0.756788,-0.534415,0.787209,0.193905,-0.706,
+ 0.024413,-0.469703,-0.882487,0.807717,0.204533,-0.722006,
+ -0.531095,-0.656282,-0.53594,0.719399,0.249218,-0.7215,
+ -0.635534,-0.736296,-0.232302,0.709997,0.238013,-0.677562,
+ -0.552608,-0.806562,-0.209959,0.774619,0.186679,-0.664625,
+ -0.552608,-0.806562,-0.209959,0.774619,0.186679,-0.664625,
+ -0.376394,-0.756788,-0.534415,0.787209,0.193905,-0.706,
+ -0.531095,-0.656282,-0.53594,0.719399,0.249218,-0.7215,
+ -0.304611,0.675798,-0.6712,0.636249,0.400218,-0.672877,
+ -0.218035,0.735069,-0.641977,0.691977,0.424648,-0.664066,
+ -0.31842,0.898971,-0.300764,0.662233,0.454417,-0.589491,
+ -0.31842,0.898971,-0.300764,0.662233,0.454417,-0.589491,
+ -0.419827,0.848984,-0.320893,0.601944,0.430927,-0.594296,
+ -0.304611,0.675798,-0.6712,0.636249,0.400218,-0.672877,
+ -0.346116,0.938192,0,0.652318,0.46434,-0.5,
+ -0.477849,0.878442,0,0.590509,0.441164,-0.5,
+ -0.419827,0.848984,-0.320893,0.601944,0.430927,-0.594296,
+ -0.346116,0.938192,0,0.652318,0.46434,-0.5,
+ -0.419827,0.848984,-0.320893,0.601944,0.430927,-0.594296,
+ -0.31842,0.898971,-0.300764,0.662233,0.454417,-0.589491,
+ -0.477849,0.878442,0,0.590509,0.441164,-0.5,
+ -0.89858,0.43881,0,0.555594,0.41906,-0.5,
+ -0.801359,0.491779,-0.340556,0.567937,0.40894,-0.594949,
+ -0.801359,0.491779,-0.340556,0.567937,0.40894,-0.594949,
+ -0.419827,0.848984,-0.320893,0.601944,0.430927,-0.594296,
+ -0.477849,0.878442,0,0.590509,0.441164,-0.5,
+ -0.638487,0.393678,-0.661326,0.60431,0.378335,-0.674188,
+ -0.304611,0.675798,-0.6712,0.636249,0.400218,-0.672877,
+ -0.419827,0.848984,-0.320893,0.601944,0.430927,-0.594296,
+ -0.638487,0.393678,-0.661326,0.60431,0.378335,-0.674188,
+ -0.419827,0.848984,-0.320893,0.601944,0.430927,-0.594296,
+ -0.801359,0.491779,-0.340556,0.567937,0.40894,-0.594949,
+ -0.318419,0.898972,0.300764,0.662233,0.454417,-0.410509,
+ -0.218035,0.735069,0.641977,0.691977,0.424648,-0.335934,
+ -0.304611,0.675798,0.6712,0.636249,0.400218,-0.327123,
+ -0.304611,0.675798,0.6712,0.636249,0.400218,-0.327123,
+ -0.419827,0.848984,0.320893,0.601944,0.430927,-0.405704,
+ -0.318419,0.898972,0.300764,0.662233,0.454417,-0.410509,
+ -0.638487,0.393678,0.661326,0.60431,0.378335,-0.325812,
+ -0.801358,0.491779,0.340556,0.567937,0.40894,-0.405051,
+ -0.419827,0.848984,0.320893,0.601944,0.430927,-0.405704,
+ -0.638487,0.393678,0.661326,0.60431,0.378335,-0.325812,
+ -0.419827,0.848984,0.320893,0.601944,0.430927,-0.405704,
+ -0.304611,0.675798,0.6712,0.636249,0.400218,-0.327123,
+ -0.801358,0.491779,0.340556,0.567937,0.40894,-0.405051,
+ -0.89858,0.43881,0,0.555594,0.41906,-0.5,
+ -0.477849,0.878442,0,0.590509,0.441164,-0.5,
+ -0.477849,0.878442,0,0.590509,0.441164,-0.5,
+ -0.419827,0.848984,0.320893,0.601944,0.430927,-0.405704,
+ -0.801358,0.491779,0.340556,0.567937,0.40894,-0.405051,
+ -0.346116,0.938192,0,0.652318,0.46434,-0.5,
+ -0.318419,0.898972,0.300764,0.662233,0.454417,-0.410509,
+ -0.419827,0.848984,0.320893,0.601944,0.430927,-0.405704,
+ -0.346116,0.938192,0,0.652318,0.46434,-0.5,
+ -0.419827,0.848984,0.320893,0.601944,0.430927,-0.405704,
+ -0.477849,0.878442,0,0.590509,0.441164,-0.5,
+ -0.772673,-0.608887,0.179534,0.608078,0.332278,-0.361333,
+ -0.772268,-0.627334,0.100277,0.58531,0.345528,-0.4175,
+ -0.944453,-0.263136,0.196897,0.562375,0.382563,-0.4125,
+ -0.772673,-0.608887,0.179534,0.608078,0.332278,-0.361333,
+ -0.944453,-0.263136,0.196897,0.562375,0.382563,-0.4125,
+ -0.838454,-0.308168,0.449475,0.597724,0.354488,-0.339125,
+ -0.810611,-0.585585,0,0.573976,0.352148,-0.5,
+ -0.985168,-0.171594,0,0.54972,0.391595,-0.5,
+ -0.944453,-0.263136,0.196897,0.562375,0.382563,-0.4125,
+ -0.810611,-0.585585,0,0.573976,0.352148,-0.5,
+ -0.944453,-0.263136,0.196897,0.562375,0.382563,-0.4125,
+ -0.772268,-0.627334,0.100277,0.58531,0.345528,-0.4175,
+ -0.89858,0.43881,0,0.555594,0.41906,-0.5,
+ -0.801358,0.491779,0.340556,0.567937,0.40894,-0.405051,
+ -0.944453,-0.263136,0.196897,0.562375,0.382563,-0.4125,
+ -0.89858,0.43881,0,0.555594,0.41906,-0.5,
+ -0.944453,-0.263136,0.196897,0.562375,0.382563,-0.4125,
+ -0.985168,-0.171594,0,0.54972,0.391595,-0.5,
+ -0.801358,0.491779,0.340556,0.567937,0.40894,-0.405051,
+ -0.638487,0.393678,0.661326,0.60431,0.378335,-0.325812,
+ -0.838454,-0.308168,0.449475,0.597724,0.354488,-0.339125,
+ -0.838454,-0.308168,0.449475,0.597724,0.354488,-0.339125,
+ -0.944453,-0.263136,0.196897,0.562375,0.382563,-0.4125,
+ -0.801358,0.491779,0.340556,0.567937,0.40894,-0.405051,
+ -0.772673,-0.608887,-0.179534,0.608078,0.332278,-0.638667,
+ -0.838454,-0.308168,-0.449475,0.597724,0.354488,-0.660875,
+ -0.944453,-0.263136,-0.196896,0.562375,0.382563,-0.5875,
+ -0.772673,-0.608887,-0.179534,0.608078,0.332278,-0.638667,
+ -0.944453,-0.263136,-0.196896,0.562375,0.382563,-0.5875,
+ -0.772268,-0.627334,-0.100277,0.58531,0.345528,-0.5825,
+ -0.838454,-0.308168,-0.449475,0.597724,0.354488,-0.660875,
+ -0.638487,0.393678,-0.661326,0.60431,0.378335,-0.674188,
+ -0.801359,0.491779,-0.340556,0.567937,0.40894,-0.594949,
+ -0.801359,0.491779,-0.340556,0.567937,0.40894,-0.594949,
+ -0.944453,-0.263136,-0.196896,0.562375,0.382563,-0.5875,
+ -0.838454,-0.308168,-0.449475,0.597724,0.354488,-0.660875,
+ -0.89858,0.43881,0,0.555594,0.41906,-0.5,
+ -0.985168,-0.171594,0,0.54972,0.391595,-0.5,
+ -0.944453,-0.263136,-0.196896,0.562375,0.382563,-0.5875,
+ -0.89858,0.43881,0,0.555594,0.41906,-0.5,
+ -0.944453,-0.263136,-0.196896,0.562375,0.382563,-0.5875,
+ -0.801359,0.491779,-0.340556,0.567937,0.40894,-0.594949,
+ -0.810611,-0.585585,0,0.573976,0.352148,-0.5,
+ -0.772268,-0.627334,-0.100277,0.58531,0.345528,-0.5825,
+ -0.944453,-0.263136,-0.196896,0.562375,0.382563,-0.5875,
+ -0.810611,-0.585585,0,0.573976,0.352148,-0.5,
+ -0.944453,-0.263136,-0.196896,0.562375,0.382563,-0.5875,
+ -0.985168,-0.171594,0,0.54972,0.391595,-0.5,
+ -0.218035,0.735069,0.641977,0.691977,0.424648,-0.335934,
+ -0.042916,0.448451,0.892776,0.741552,0.375033,-0.291188,
+ -0.106617,0.392034,0.913752,0.693423,0.349037,-0.279975,
+ -0.218035,0.735069,0.641977,0.691977,0.424648,-0.335934,
+ -0.106617,0.392034,0.913752,0.693423,0.349037,-0.279975,
+ -0.304611,0.675798,0.6712,0.636249,0.400218,-0.327123,
+ -0.042916,0.448451,0.892776,0.741552,0.375033,-0.291188,
+ 0.160738,0.160922,0.97379,0.801042,0.315496,-0.276273,
+ 0.108083,0.116579,0.987283,0.762033,0.287619,-0.264259,
+ 0.108083,0.116579,0.987283,0.762033,0.287619,-0.264259,
+ -0.106617,0.392034,0.913752,0.693423,0.349037,-0.279975,
+ -0.042916,0.448451,0.892776,0.741552,0.375033,-0.291188,
+ -0.233968,-0.2359,0.943191,0.735693,0.265534,-0.26194,
+ -0.462569,0.07019,0.883801,0.66406,0.327,-0.277994,
+ -0.106617,0.392034,0.913752,0.693423,0.349037,-0.279975,
+ -0.233968,-0.2359,0.943191,0.735693,0.265534,-0.26194,
+ -0.106617,0.392034,0.913752,0.693423,0.349037,-0.279975,
+ 0.108083,0.116579,0.987283,0.762033,0.287619,-0.264259,
+ -0.462569,0.07019,0.883801,0.66406,0.327,-0.277994,
+ -0.638487,0.393678,0.661326,0.60431,0.378335,-0.325812,
+ -0.304611,0.675798,0.6712,0.636249,0.400218,-0.327123,
+ -0.304611,0.675798,0.6712,0.636249,0.400218,-0.327123,
+ -0.106617,0.392034,0.913752,0.693423,0.349037,-0.279975,
+ -0.462569,0.07019,0.883801,0.66406,0.327,-0.277994,
+ 0.66282,-0.338306,0.667996,0.910107,0.206343,-0.335934,
+ 0.65574,-0.380493,0.652097,0.887817,0.175019,-0.327123,
+ 0.378094,-0.147323,0.91397,0.830643,0.2262,-0.279975,
+ 0.66282,-0.338306,0.667996,0.910107,0.206343,-0.335934,
+ 0.378094,-0.147323,0.91397,0.830643,0.2262,-0.279975,
+ 0.398283,-0.122544,0.90904,0.860532,0.255958,-0.291188,
+ 0.31991,-0.691022,0.648187,0.867858,0.153664,-0.325812,
+ 0.024414,-0.469703,0.882487,0.807717,0.204533,-0.277994,
+ 0.378094,-0.147323,0.91397,0.830643,0.2262,-0.279975,
+ 0.31991,-0.691022,0.648187,0.867858,0.153664,-0.325812,
+ 0.378094,-0.147323,0.91397,0.830643,0.2262,-0.279975,
+ 0.65574,-0.380493,0.652097,0.887817,0.175019,-0.327123,
+ 0.024414,-0.469703,0.882487,0.807717,0.204533,-0.277994,
+ -0.233968,-0.2359,0.943191,0.735693,0.265534,-0.26194,
+ 0.108083,0.116579,0.987283,0.762033,0.287619,-0.264259,
+ 0.108083,0.116579,0.987283,0.762033,0.287619,-0.264259,
+ 0.378094,-0.147323,0.91397,0.830643,0.2262,-0.279975,
+ 0.024414,-0.469703,0.882487,0.807717,0.204533,-0.277994,
+ 0.160738,0.160922,0.97379,0.801042,0.315496,-0.276273,
+ 0.398283,-0.122544,0.90904,0.860532,0.255958,-0.291188,
+ 0.378094,-0.147323,0.91397,0.830643,0.2262,-0.279975,
+ 0.160738,0.160922,0.97379,0.801042,0.315496,-0.276273,
+ 0.378094,-0.147323,0.91397,0.830643,0.2262,-0.279975,
+ 0.108083,0.116579,0.987283,0.762033,0.287619,-0.264259,
+ -0.464025,-0.863104,0.199329,0.820528,0.154011,-0.361333,
+ -0.552608,-0.806562,0.209959,0.774619,0.186679,-0.335375,
+ -0.376394,-0.756788,0.534415,0.787209,0.193905,-0.294,
+ -0.464025,-0.863104,0.199329,0.820528,0.154011,-0.361333,
+ -0.376394,-0.756788,0.534415,0.787209,0.193905,-0.294,
+ -0.23383,-0.86988,0.434318,0.844199,0.147671,-0.339125,
+ -0.552608,-0.806562,0.209959,0.774619,0.186679,-0.335375,
+ -0.635534,-0.736296,0.232302,0.709997,0.238013,-0.322437,
+ -0.531095,-0.656282,0.53594,0.719399,0.249218,-0.2785,
+ -0.531095,-0.656282,0.53594,0.719399,0.249218,-0.2785,
+ -0.376394,-0.756788,0.534415,0.787209,0.193905,-0.294,
+ -0.552608,-0.806562,0.209959,0.774619,0.186679,-0.335375,
+ -0.233968,-0.2359,0.943191,0.735693,0.265534,-0.26194,
+ 0.024414,-0.469703,0.882487,0.807717,0.204533,-0.277994,
+ -0.376394,-0.756788,0.534415,0.787209,0.193905,-0.294,
+ -0.233968,-0.2359,0.943191,0.735693,0.265534,-0.26194,
+ -0.376394,-0.756788,0.534415,0.787209,0.193905,-0.294,
+ -0.531095,-0.656282,0.53594,0.719399,0.249218,-0.2785,
+ 0.024414,-0.469703,0.882487,0.807717,0.204533,-0.277994,
+ 0.31991,-0.691022,0.648187,0.867858,0.153664,-0.325812,
+ -0.23383,-0.86988,0.434318,0.844199,0.147671,-0.339125,
+ -0.23383,-0.86988,0.434318,0.844199,0.147671,-0.339125,
+ -0.376394,-0.756788,0.534415,0.787209,0.193905,-0.294,
+ 0.024414,-0.469703,0.882487,0.807717,0.204533,-0.277994,
+ -0.712429,-0.672822,0.199385,0.648221,0.292739,-0.335375,
+ -0.772673,-0.608887,0.179534,0.608078,0.332278,-0.361333,
+ -0.838454,-0.308168,0.449475,0.597724,0.354488,-0.339125,
+ -0.838454,-0.308168,0.449475,0.597724,0.354488,-0.339125,
+ -0.660431,-0.496512,0.5633,0.653151,0.306393,-0.294,
+ -0.712429,-0.672822,0.199385,0.648221,0.292739,-0.335375,
+ -0.838454,-0.308168,0.449475,0.597724,0.354488,-0.339125,
+ -0.638487,0.393678,0.661326,0.60431,0.378335,-0.325812,
+ -0.462569,0.07019,0.883801,0.66406,0.327,-0.277994,
+ -0.462569,0.07019,0.883801,0.66406,0.327,-0.277994,
+ -0.660431,-0.496512,0.5633,0.653151,0.306393,-0.294,
+ -0.838454,-0.308168,0.449475,0.597724,0.354488,-0.339125,
+ -0.233968,-0.2359,0.943191,0.735693,0.265534,-0.26194,
+ -0.531095,-0.656282,0.53594,0.719399,0.249218,-0.2785,
+ -0.660431,-0.496512,0.5633,0.653151,0.306393,-0.294,
+ -0.233968,-0.2359,0.943191,0.735693,0.265534,-0.26194,
+ -0.660431,-0.496512,0.5633,0.653151,0.306393,-0.294,
+ -0.462569,0.07019,0.883801,0.66406,0.327,-0.277994,
+ -0.635534,-0.736296,0.232302,0.709997,0.238013,-0.322437,
+ -0.712429,-0.672822,0.199385,0.648221,0.292739,-0.335375,
+ -0.660431,-0.496512,0.5633,0.653151,0.306393,-0.294,
+ -0.635534,-0.736296,0.232302,0.709997,0.238013,-0.322437,
+ -0.660431,-0.496512,0.5633,0.653151,0.306393,-0.294,
+ -0.531095,-0.656282,0.53594,0.719399,0.249218,-0.2785,
+ -0.464025,-0.863104,-0.199329,0.820528,0.154011,-0.638667,
+ -0.552608,-0.806562,-0.209959,0.774619,0.186679,-0.664625,
+ -0.577604,-0.812413,-0.079739,0.775446,0.175219,-0.5905,
+ -0.464025,-0.863104,-0.199329,0.820528,0.154011,-0.638667,
+ -0.577604,-0.812413,-0.079739,0.775446,0.175219,-0.5905,
+ -0.4837,-0.869471,-0.100277,0.83753,0.13389,-0.5825,
+ -0.552608,-0.806562,-0.209959,0.774619,0.186679,-0.664625,
+ -0.635534,-0.736296,-0.232302,0.709997,0.238013,-0.677562,
+ -0.640463,-0.763275,-0.08496,0.704334,0.231264,-0.59775,
+ -0.640463,-0.763275,-0.08496,0.704334,0.231264,-0.59775,
+ -0.577604,-0.812413,-0.079739,0.775446,0.175219,-0.5905,
+ -0.552608,-0.806562,-0.209959,0.774619,0.186679,-0.664625,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.57538,-0.817886,0,0.779215,0.168431,-0.5,
+ -0.577604,-0.812413,-0.079739,0.775446,0.175219,-0.5905,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.577604,-0.812413,-0.079739,0.775446,0.175219,-0.5905,
+ -0.640463,-0.763275,-0.08496,0.704334,0.231264,-0.59775,
+ -0.57538,-0.817886,0,0.779215,0.168431,-0.5,
+ -0.435927,-0.899982,0,0.846018,0.123878,-0.5,
+ -0.4837,-0.869471,-0.100277,0.83753,0.13389,-0.5825,
+ -0.4837,-0.869471,-0.100277,0.83753,0.13389,-0.5825,
+ -0.577604,-0.812413,-0.079739,0.775446,0.175219,-0.5905,
+ -0.57538,-0.817886,0,0.779215,0.168431,-0.5,
+ -0.772673,-0.608887,-0.179534,0.608078,0.332278,-0.638667,
+ -0.772268,-0.627334,-0.100277,0.58531,0.345528,-0.5825,
+ -0.699771,-0.709903,-0.079739,0.636792,0.291564,-0.5905,
+ -0.772673,-0.608887,-0.179534,0.608078,0.332278,-0.638667,
+ -0.699771,-0.709903,-0.079739,0.636792,0.291564,-0.5905,
+ -0.712429,-0.672822,-0.199386,0.648221,0.292739,-0.664625,
+ -0.772268,-0.627334,-0.100277,0.58531,0.345528,-0.5825,
+ -0.810611,-0.585585,0,0.573976,0.352148,-0.5,
+ -0.705547,-0.708663,0,0.629453,0.294096,-0.5,
+ -0.705547,-0.708663,0,0.629453,0.294096,-0.5,
+ -0.699771,-0.709903,-0.079739,0.636792,0.291564,-0.5905,
+ -0.772268,-0.627334,-0.100277,0.58531,0.345528,-0.5825,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.640463,-0.763275,-0.08496,0.704334,0.231264,-0.59775,
+ -0.699771,-0.709903,-0.079739,0.636792,0.291564,-0.5905,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.699771,-0.709903,-0.079739,0.636792,0.291564,-0.5905,
+ -0.705547,-0.708663,0,0.629453,0.294096,-0.5,
+ -0.640463,-0.763275,-0.08496,0.704334,0.231264,-0.59775,
+ -0.635534,-0.736296,-0.232302,0.709997,0.238013,-0.677562,
+ -0.712429,-0.672822,-0.199386,0.648221,0.292739,-0.664625,
+ -0.712429,-0.672822,-0.199386,0.648221,0.292739,-0.664625,
+ -0.699771,-0.709903,-0.079739,0.636792,0.291564,-0.5905,
+ -0.640463,-0.763275,-0.08496,0.704334,0.231264,-0.59775,
+ -0.772673,-0.608887,0.179534,0.608078,0.332278,-0.361333,
+ -0.712429,-0.672822,0.199385,0.648221,0.292739,-0.335375,
+ -0.699771,-0.709903,0.079739,0.636792,0.291564,-0.4095,
+ -0.772673,-0.608887,0.179534,0.608078,0.332278,-0.361333,
+ -0.699771,-0.709903,0.079739,0.636792,0.291564,-0.4095,
+ -0.772268,-0.627334,0.100277,0.58531,0.345528,-0.4175,
+ -0.712429,-0.672822,0.199385,0.648221,0.292739,-0.335375,
+ -0.635534,-0.736296,0.232302,0.709997,0.238013,-0.322437,
+ -0.640463,-0.763275,0.08496,0.704334,0.231264,-0.40225,
+ -0.640463,-0.763275,0.08496,0.704334,0.231264,-0.40225,
+ -0.699771,-0.709903,0.079739,0.636792,0.291564,-0.4095,
+ -0.712429,-0.672822,0.199385,0.648221,0.292739,-0.335375,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.705547,-0.708663,0,0.629453,0.294096,-0.5,
+ -0.699771,-0.709903,0.079739,0.636792,0.291564,-0.4095,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.699771,-0.709903,0.079739,0.636792,0.291564,-0.4095,
+ -0.640463,-0.763275,0.08496,0.704334,0.231264,-0.40225,
+ -0.705547,-0.708663,0,0.629453,0.294096,-0.5,
+ -0.810611,-0.585585,0,0.573976,0.352148,-0.5,
+ -0.772268,-0.627334,0.100277,0.58531,0.345528,-0.4175,
+ -0.772268,-0.627334,0.100277,0.58531,0.345528,-0.4175,
+ -0.699771,-0.709903,0.079739,0.636792,0.291564,-0.4095,
+ -0.705547,-0.708663,0,0.629453,0.294096,-0.5,
+ -0.464025,-0.863104,0.199329,0.820528,0.154011,-0.361333,
+ -0.4837,-0.869471,0.100277,0.83753,0.13389,-0.4175,
+ -0.577604,-0.812413,0.079739,0.775446,0.175219,-0.4095,
+ -0.464025,-0.863104,0.199329,0.820528,0.154011,-0.361333,
+ -0.577604,-0.812413,0.079739,0.775446,0.175219,-0.4095,
+ -0.552608,-0.806562,0.209959,0.774619,0.186679,-0.335375,
+ -0.4837,-0.869471,0.100277,0.83753,0.13389,-0.4175,
+ -0.435927,-0.899982,0,0.846018,0.123878,-0.5,
+ -0.57538,-0.817886,0,0.779215,0.168431,-0.5,
+ -0.57538,-0.817886,0,0.779215,0.168431,-0.5,
+ -0.577604,-0.812413,0.079739,0.775446,0.175219,-0.4095,
+ -0.4837,-0.869471,0.100277,0.83753,0.13389,-0.4175,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.640463,-0.763275,0.08496,0.704334,0.231264,-0.40225,
+ -0.577604,-0.812413,0.079739,0.775446,0.175219,-0.4095,
+ -0.642787,-0.766045,0,0.702437,0.229003,-0.5,
+ -0.577604,-0.812413,0.079739,0.775446,0.175219,-0.4095,
+ -0.57538,-0.817886,0,0.779215,0.168431,-0.5,
+ -0.640463,-0.763275,0.08496,0.704334,0.231264,-0.40225,
+ -0.635534,-0.736296,0.232302,0.709997,0.238013,-0.322437,
+ -0.552608,-0.806562,0.209959,0.774619,0.186679,-0.335375,
+ -0.552608,-0.806562,0.209959,0.774619,0.186679,-0.335375,
+ -0.577604,-0.812413,0.079739,0.775446,0.175219,-0.4095,
+ -0.640463,-0.763275,0.08496,0.704334,0.231264,-0.40225,
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1728,data,NULL};
+const struct gllist *s1_4=&frame;
diff --git a/hacks/glx/s1_5.c b/hacks/glx/s1_5.c
new file mode 100644
index 0000000..dc4510a
--- /dev/null
+++ b/hacks/glx/s1_5.c
@@ -0,0 +1,1733 @@
+#include "gllist.h"
+static const float data[]={
+ 0.575185,0.562873,-0.59358,0.995497,0.593044,-0.659921,
+ 0.642358,0.715039,-0.275852,0.998334,0.63557,-0.58723,
+ 0.5309,0.794781,-0.294055,0.944384,0.679375,-0.593392,
+ 0.575185,0.562873,-0.59358,0.995497,0.593044,-0.659921,
+ 0.5309,0.794781,-0.294055,0.944384,0.679375,-0.593392,
+ 0.429706,0.63213,-0.644798,0.943249,0.633115,-0.671218,
+ 0.642358,0.715039,-0.275852,0.998334,0.63557,-0.58723,
+ 0.662437,0.749118,0,0.99928,0.649745,-0.5,
+ 0.577305,0.816529,0,0.944762,0.694795,-0.5,
+ 0.577305,0.816529,0,0.944762,0.694795,-0.5,
+ 0.5309,0.794781,-0.294055,0.944384,0.679375,-0.593392,
+ 0.642358,0.715039,-0.275852,0.998334,0.63557,-0.58723,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ -0.039712,0.912418,-0.407328,0.907078,0.697653,-0.594723,
+ 0.5309,0.794781,-0.294055,0.944384,0.679375,-0.593392,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ 0.5309,0.794781,-0.294055,0.944384,0.679375,-0.593392,
+ 0.577305,0.816529,0,0.944762,0.694795,-0.5,
+ -0.039712,0.912418,-0.407328,0.907078,0.697653,-0.594723,
+ -0.115437,0.702917,-0.701842,0.907098,0.650057,-0.673773,
+ 0.429706,0.63213,-0.644798,0.943249,0.633115,-0.671218,
+ 0.429706,0.63213,-0.644798,0.943249,0.633115,-0.671218,
+ 0.5309,0.794781,-0.294055,0.944384,0.679375,-0.593392,
+ -0.039712,0.912418,-0.407328,0.907078,0.697653,-0.594723,
+ 0.575185,0.562873,0.59358,0.995497,0.593044,-0.340079,
+ 0.429706,0.63213,0.644797,0.943249,0.633115,-0.328782,
+ 0.530901,0.79478,0.294055,0.944384,0.679375,-0.406608,
+ 0.575185,0.562873,0.59358,0.995497,0.593044,-0.340079,
+ 0.530901,0.79478,0.294055,0.944384,0.679375,-0.406608,
+ 0.642358,0.715039,0.275852,0.998334,0.63557,-0.41277,
+ 0.429706,0.63213,0.644797,0.943249,0.633115,-0.328782,
+ -0.115435,0.702917,0.701842,0.907098,0.650057,-0.326227,
+ -0.039712,0.912418,0.407328,0.907078,0.697653,-0.405277,
+ -0.039712,0.912418,0.407328,0.907078,0.697653,-0.405277,
+ 0.530901,0.79478,0.294055,0.944384,0.679375,-0.406608,
+ 0.429706,0.63213,0.644797,0.943249,0.633115,-0.328782,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ 0.577305,0.816529,0,0.944762,0.694795,-0.5,
+ 0.530901,0.79478,0.294055,0.944384,0.679375,-0.406608,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ 0.530901,0.79478,0.294055,0.944384,0.679375,-0.406608,
+ -0.039712,0.912418,0.407328,0.907078,0.697653,-0.405277,
+ 0.577305,0.816529,0,0.944762,0.694795,-0.5,
+ 0.662437,0.749118,0,0.99928,0.649745,-0.5,
+ 0.642358,0.715039,0.275852,0.998334,0.63557,-0.41277,
+ 0.642358,0.715039,0.275852,0.998334,0.63557,-0.41277,
+ 0.530901,0.79478,0.294055,0.944384,0.679375,-0.406608,
+ 0.577305,0.816529,0,0.944762,0.694795,-0.5,
+ -0.959446,0.199329,0.199329,0.87462,0.619745,-0.361333,
+ -0.976969,0.188349,0.100277,0.870135,0.645704,-0.4175,
+ -0.794244,0.572801,0.20267,0.883764,0.687079,-0.4125,
+ -0.959446,0.199329,0.199329,0.87462,0.619745,-0.361333,
+ -0.794244,0.572801,0.20267,0.883764,0.687079,-0.4125,
+ -0.714284,0.497638,0.492092,0.884979,0.641954,-0.339125,
+ -0.969635,0.244558,0,0.867922,0.658641,-0.5,
+ -0.744977,0.66709,0,0.882548,0.702579,-0.5,
+ -0.794244,0.572801,0.20267,0.883764,0.687079,-0.4125,
+ -0.969635,0.244558,0,0.867922,0.658641,-0.5,
+ -0.794244,0.572801,0.20267,0.883764,0.687079,-0.4125,
+ -0.976969,0.188349,0.100277,0.870135,0.645704,-0.4175,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ -0.039712,0.912418,0.407328,0.907078,0.697653,-0.405277,
+ -0.794244,0.572801,0.20267,0.883764,0.687079,-0.4125,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ -0.794244,0.572801,0.20267,0.883764,0.687079,-0.4125,
+ -0.744977,0.66709,0,0.882548,0.702579,-0.5,
+ -0.039712,0.912418,0.407328,0.907078,0.697653,-0.405277,
+ -0.115435,0.702917,0.701842,0.907098,0.650057,-0.326227,
+ -0.714284,0.497638,0.492092,0.884979,0.641954,-0.339125,
+ -0.714284,0.497638,0.492092,0.884979,0.641954,-0.339125,
+ -0.794244,0.572801,0.20267,0.883764,0.687079,-0.4125,
+ -0.039712,0.912418,0.407328,0.907078,0.697653,-0.405277,
+ -0.959446,0.199329,-0.199329,0.87462,0.619745,-0.638667,
+ -0.714284,0.497638,-0.492092,0.884979,0.641954,-0.660875,
+ -0.794244,0.572801,-0.202671,0.883764,0.687079,-0.5875,
+ -0.959446,0.199329,-0.199329,0.87462,0.619745,-0.638667,
+ -0.794244,0.572801,-0.202671,0.883764,0.687079,-0.5875,
+ -0.976969,0.188349,-0.100277,0.870135,0.645704,-0.5825,
+ -0.714284,0.497638,-0.492092,0.884979,0.641954,-0.660875,
+ -0.115437,0.702917,-0.701842,0.907098,0.650057,-0.673773,
+ -0.039712,0.912418,-0.407328,0.907078,0.697653,-0.594723,
+ -0.039712,0.912418,-0.407328,0.907078,0.697653,-0.594723,
+ -0.794244,0.572801,-0.202671,0.883764,0.687079,-0.5875,
+ -0.714284,0.497638,-0.492092,0.884979,0.641954,-0.660875,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ -0.744977,0.66709,0,0.882548,0.702579,-0.5,
+ -0.794244,0.572801,-0.202671,0.883764,0.687079,-0.5875,
+ 0.007037,0.999975,0,0.906869,0.713633,-0.5,
+ -0.794244,0.572801,-0.202671,0.883764,0.687079,-0.5875,
+ -0.039712,0.912418,-0.407328,0.907078,0.697653,-0.594723,
+ -0.969635,0.244558,0,0.867922,0.658641,-0.5,
+ -0.976969,0.188349,-0.100277,0.870135,0.645704,-0.5825,
+ -0.794244,0.572801,-0.202671,0.883764,0.687079,-0.5875,
+ -0.969635,0.244558,0,0.867922,0.658641,-0.5,
+ -0.794244,0.572801,-0.202671,0.883764,0.687079,-0.5875,
+ -0.744977,0.66709,0,0.882548,0.702579,-0.5,
+ 0.575185,0.562873,0.59358,0.995497,0.593044,-0.340079,
+ 0.447221,0.281892,0.848841,0.990769,0.522168,-0.296464,
+ 0.345209,0.311815,0.885213,0.941357,0.556014,-0.282086,
+ 0.575185,0.562873,0.59358,0.995497,0.593044,-0.340079,
+ 0.345209,0.311815,0.885213,0.941357,0.556014,-0.282086,
+ 0.429706,0.63213,0.644797,0.943249,0.633115,-0.328782,
+ 0.447221,0.281892,0.848841,0.990769,0.522168,-0.296464,
+ 0.291601,-0.024985,0.956214,0.985095,0.437116,-0.281926,
+ 0.214014,-0.011143,0.976767,0.939088,0.463494,-0.26652,
+ 0.214014,-0.011143,0.976767,0.939088,0.463494,-0.26652,
+ 0.345209,0.311815,0.885213,0.941357,0.556014,-0.282086,
+ 0.447221,0.281892,0.848841,0.990769,0.522168,-0.296464,
+ -0.247399,0.003968,0.968906,0.905451,0.476683,-0.262505,
+ -0.23409,0.368714,0.899584,0.906322,0.571188,-0.278521,
+ 0.345209,0.311815,0.885213,0.941357,0.556014,-0.282086,
+ -0.247399,0.003968,0.968906,0.905451,0.476683,-0.262505,
+ 0.345209,0.311815,0.885213,0.941357,0.556014,-0.282086,
+ 0.214014,-0.011143,0.976767,0.939088,0.463494,-0.26652,
+ -0.23409,0.368714,0.899584,0.906322,0.571188,-0.278521,
+ -0.115435,0.702917,0.701842,0.907098,0.650057,-0.326227,
+ 0.429706,0.63213,0.644797,0.943249,0.633115,-0.328782,
+ 0.429706,0.63213,0.644797,0.943249,0.633115,-0.328782,
+ 0.345209,0.311815,0.885213,0.941357,0.556014,-0.282086,
+ -0.23409,0.368714,0.899584,0.906322,0.571188,-0.278521,
+ 0.110573,-0.360361,0.926236,0.979421,0.352064,-0.296464,
+ -0.103837,-0.707557,0.698986,0.974692,0.281188,-0.340079,
+ -0.088988,-0.705766,0.702834,0.934927,0.293873,-0.328782,
+ -0.088988,-0.705766,0.702834,0.934927,0.293873,-0.328782,
+ 0.06872,-0.352527,0.933275,0.936818,0.370973,-0.282086,
+ 0.110573,-0.360361,0.926236,0.979421,0.352064,-0.296464,
+ -0.455383,-0.61687,0.641949,0.905018,0.303308,-0.326227,
+ -0.359172,-0.316853,0.877838,0.905187,0.382177,-0.278521,
+ 0.06872,-0.352527,0.933275,0.936818,0.370973,-0.282086,
+ -0.455383,-0.61687,0.641949,0.905018,0.303308,-0.326227,
+ 0.06872,-0.352527,0.933275,0.936818,0.370973,-0.282086,
+ -0.088988,-0.705766,0.702834,0.934927,0.293873,-0.328782,
+ -0.359172,-0.316853,0.877838,0.905187,0.382177,-0.278521,
+ -0.247399,0.003968,0.968906,0.905451,0.476683,-0.262505,
+ 0.214014,-0.011143,0.976767,0.939088,0.463494,-0.26652,
+ 0.214014,-0.011143,0.976767,0.939088,0.463494,-0.26652,
+ 0.06872,-0.352527,0.933275,0.936818,0.370973,-0.282086,
+ -0.359172,-0.316853,0.877838,0.905187,0.382177,-0.278521,
+ 0.291601,-0.024985,0.956214,0.985095,0.437116,-0.281926,
+ 0.110573,-0.360361,0.926236,0.979421,0.352064,-0.296464,
+ 0.06872,-0.352527,0.933275,0.936818,0.370973,-0.282086,
+ 0.291601,-0.024985,0.956214,0.985095,0.437116,-0.281926,
+ 0.06872,-0.352527,0.933275,0.936818,0.370973,-0.282086,
+ 0.214014,-0.011143,0.976767,0.939088,0.463494,-0.26652,
+ -0.959446,-0.199329,0.199329,0.87462,0.342412,-0.361333,
+ -0.976969,-0.100277,0.18835,0.870135,0.398579,-0.335375,
+ -0.845588,-0.179708,0.502679,0.883764,0.393579,-0.294,
+ -0.959446,-0.199329,0.199329,0.87462,0.342412,-0.361333,
+ -0.845588,-0.179708,0.502679,0.883764,0.393579,-0.294,
+ -0.826326,-0.370128,0.424489,0.884979,0.320204,-0.339125,
+ -0.969635,0,0.244558,0.867922,0.481079,-0.322437,
+ -0.761522,0.030964,0.647398,0.882548,0.481079,-0.2785,
+ -0.845588,-0.179708,0.502679,0.883764,0.393579,-0.294,
+ -0.969635,0,0.244558,0.867922,0.481079,-0.322437,
+ -0.845588,-0.179708,0.502679,0.883764,0.393579,-0.294,
+ -0.976969,-0.100277,0.18835,0.870135,0.398579,-0.335375,
+ -0.247399,0.003968,0.968906,0.905451,0.476683,-0.262505,
+ -0.359172,-0.316853,0.877838,0.905187,0.382177,-0.278521,
+ -0.845588,-0.179708,0.502679,0.883764,0.393579,-0.294,
+ -0.247399,0.003968,0.968906,0.905451,0.476683,-0.262505,
+ -0.845588,-0.179708,0.502679,0.883764,0.393579,-0.294,
+ -0.761522,0.030964,0.647398,0.882548,0.481079,-0.2785,
+ -0.359172,-0.316853,0.877838,0.905187,0.382177,-0.278521,
+ -0.455383,-0.61687,0.641949,0.905018,0.303308,-0.326227,
+ -0.826326,-0.370128,0.424489,0.884979,0.320204,-0.339125,
+ -0.826326,-0.370128,0.424489,0.884979,0.320204,-0.339125,
+ -0.845588,-0.179708,0.502679,0.883764,0.393579,-0.294,
+ -0.359172,-0.316853,0.877838,0.905187,0.382177,-0.278521,
+ -0.959446,0.199329,0.199329,0.87462,0.619745,-0.361333,
+ -0.714284,0.497638,0.492092,0.884979,0.641954,-0.339125,
+ -0.859317,0.197434,0.471799,0.883764,0.568579,-0.294,
+ -0.959446,0.199329,0.199329,0.87462,0.619745,-0.361333,
+ -0.859317,0.197434,0.471799,0.883764,0.568579,-0.294,
+ -0.976969,0.100277,0.18835,0.870135,0.563579,-0.335375,
+ -0.714284,0.497638,0.492092,0.884979,0.641954,-0.339125,
+ -0.115435,0.702917,0.701842,0.907098,0.650057,-0.326227,
+ -0.23409,0.368714,0.899584,0.906322,0.571188,-0.278521,
+ -0.23409,0.368714,0.899584,0.906322,0.571188,-0.278521,
+ -0.859317,0.197434,0.471799,0.883764,0.568579,-0.294,
+ -0.714284,0.497638,0.492092,0.884979,0.641954,-0.339125,
+ -0.23409,0.368714,0.899584,0.906322,0.571188,-0.278521,
+ -0.247399,0.003968,0.968906,0.905451,0.476683,-0.262505,
+ -0.761522,0.030964,0.647398,0.882548,0.481079,-0.2785,
+ -0.761522,0.030964,0.647398,0.882548,0.481079,-0.2785,
+ -0.859317,0.197434,0.471799,0.883764,0.568579,-0.294,
+ -0.23409,0.368714,0.899584,0.906322,0.571188,-0.278521,
+ -0.969635,0,0.244558,0.867922,0.481079,-0.322437,
+ -0.976969,0.100277,0.18835,0.870135,0.563579,-0.335375,
+ -0.859317,0.197434,0.471799,0.883764,0.568579,-0.294,
+ -0.969635,0,0.244558,0.867922,0.481079,-0.322437,
+ -0.859317,0.197434,0.471799,0.883764,0.568579,-0.294,
+ -0.761522,0.030964,0.647398,0.882548,0.481079,-0.2785,
+ -0.103837,-0.707557,0.698986,0.974692,0.281188,-0.340079,
+ -0.260846,-0.906261,0.332641,0.971855,0.238662,-0.41277,
+ -0.196471,-0.920135,0.338748,0.933792,0.247612,-0.406608,
+ -0.103837,-0.707557,0.698986,0.974692,0.281188,-0.340079,
+ -0.196471,-0.920135,0.338748,0.933792,0.247612,-0.406608,
+ -0.088988,-0.705766,0.702834,0.934927,0.293873,-0.328782,
+ -0.260846,-0.906261,0.332641,0.971855,0.238662,-0.41277,
+ -0.339022,-0.940778,0,0.97091,0.224487,-0.5,
+ -0.217971,-0.975955,0,0.933414,0.232192,-0.5,
+ -0.217971,-0.975955,0,0.933414,0.232192,-0.5,
+ -0.196471,-0.920135,0.338748,0.933792,0.247612,-0.406608,
+ -0.260846,-0.906261,0.332641,0.971855,0.238662,-0.41277,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.438574,-0.828046,0.349274,0.90443,0.255712,-0.405277,
+ -0.196471,-0.920135,0.338748,0.933792,0.247612,-0.406608,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.196471,-0.920135,0.338748,0.933792,0.247612,-0.406608,
+ -0.217971,-0.975955,0,0.933414,0.232192,-0.5,
+ -0.438574,-0.828046,0.349274,0.90443,0.255712,-0.405277,
+ -0.455383,-0.61687,0.641949,0.905018,0.303308,-0.326227,
+ -0.088988,-0.705766,0.702834,0.934927,0.293873,-0.328782,
+ -0.088988,-0.705766,0.702834,0.934927,0.293873,-0.328782,
+ -0.196471,-0.920135,0.338748,0.933792,0.247612,-0.406608,
+ -0.438574,-0.828046,0.349274,0.90443,0.255712,-0.405277,
+ -0.103837,-0.707557,-0.698986,0.974692,0.281188,-0.659921,
+ -0.088988,-0.705766,-0.702834,0.934927,0.293873,-0.671218,
+ -0.196471,-0.920135,-0.338748,0.933792,0.247612,-0.593392,
+ -0.103837,-0.707557,-0.698986,0.974692,0.281188,-0.659921,
+ -0.196471,-0.920135,-0.338748,0.933792,0.247612,-0.593392,
+ -0.260846,-0.906261,-0.332641,0.971855,0.238662,-0.58723,
+ -0.088988,-0.705766,-0.702834,0.934927,0.293873,-0.671218,
+ -0.455383,-0.61687,-0.641949,0.905018,0.303308,-0.673773,
+ -0.438575,-0.828046,-0.349274,0.90443,0.255712,-0.594723,
+ -0.438575,-0.828046,-0.349274,0.90443,0.255712,-0.594723,
+ -0.196471,-0.920135,-0.338748,0.933792,0.247612,-0.593392,
+ -0.088988,-0.705766,-0.702834,0.934927,0.293873,-0.671218,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.217971,-0.975955,0,0.933414,0.232192,-0.5,
+ -0.196471,-0.920135,-0.338748,0.933792,0.247612,-0.593392,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.196471,-0.920135,-0.338748,0.933792,0.247612,-0.593392,
+ -0.438575,-0.828046,-0.349274,0.90443,0.255712,-0.594723,
+ -0.217971,-0.975955,0,0.933414,0.232192,-0.5,
+ -0.339022,-0.940778,0,0.97091,0.224487,-0.5,
+ -0.260846,-0.906261,-0.332641,0.971855,0.238662,-0.58723,
+ -0.260846,-0.906261,-0.332641,0.971855,0.238662,-0.58723,
+ -0.196471,-0.920135,-0.338748,0.933792,0.247612,-0.593392,
+ -0.217971,-0.975955,0,0.933414,0.232192,-0.5,
+ -0.959446,-0.199329,-0.199329,0.87462,0.342412,-0.638667,
+ -0.976969,-0.18835,-0.100277,0.870135,0.316454,-0.5825,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.959446,-0.199329,-0.199329,0.87462,0.342412,-0.638667,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.826325,-0.370128,-0.424489,0.884979,0.320204,-0.660875,
+ -0.969635,-0.244558,0,0.867922,0.303516,-0.5,
+ -0.84069,-0.541516,0,0.882548,0.259579,-0.5,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.969635,-0.244558,0,0.867922,0.303516,-0.5,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.976969,-0.18835,-0.100277,0.870135,0.316454,-0.5825,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.438575,-0.828046,-0.349274,0.90443,0.255712,-0.594723,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.84069,-0.541516,0,0.882548,0.259579,-0.5,
+ -0.455383,-0.61687,-0.641949,0.905018,0.303308,-0.673773,
+ -0.826325,-0.370128,-0.424489,0.884979,0.320204,-0.660875,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.455383,-0.61687,-0.641949,0.905018,0.303308,-0.673773,
+ -0.849789,-0.488885,-0.197102,0.883764,0.275079,-0.5875,
+ -0.438575,-0.828046,-0.349274,0.90443,0.255712,-0.594723,
+ -0.959446,-0.199329,0.199329,0.87462,0.342412,-0.361333,
+ -0.826326,-0.370128,0.424489,0.884979,0.320204,-0.339125,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.959446,-0.199329,0.199329,0.87462,0.342412,-0.361333,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.976969,-0.18835,0.100277,0.870135,0.316454,-0.4175,
+ -0.455383,-0.61687,0.641949,0.905018,0.303308,-0.326227,
+ -0.438574,-0.828046,0.349274,0.90443,0.255712,-0.405277,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.455383,-0.61687,0.641949,0.905018,0.303308,-0.326227,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.826326,-0.370128,0.424489,0.884979,0.320204,-0.339125,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.84069,-0.541516,0,0.882548,0.259579,-0.5,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.489368,-0.872077,0,0.904032,0.239732,-0.5,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.438574,-0.828046,0.349274,0.90443,0.255712,-0.405277,
+ -0.969635,-0.244558,0,0.867922,0.303516,-0.5,
+ -0.976969,-0.18835,0.100277,0.870135,0.316454,-0.4175,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.969635,-0.244558,0,0.867922,0.303516,-0.5,
+ -0.849789,-0.488886,0.197102,0.883764,0.275079,-0.4125,
+ -0.84069,-0.541516,0,0.882548,0.259579,-0.5,
+ -0.088988,-0.705766,-0.702834,0.934927,0.293873,-0.671218,
+ -0.103837,-0.707557,-0.698986,0.974692,0.281188,-0.659921,
+ 0.110573,-0.360362,-0.926236,0.979421,0.352064,-0.703536,
+ 0.110573,-0.360362,-0.926236,0.979421,0.352064,-0.703536,
+ 0.06872,-0.352527,-0.933275,0.936818,0.370973,-0.717914,
+ -0.088988,-0.705766,-0.702834,0.934927,0.293873,-0.671218,
+ 0.291602,-0.024985,-0.956213,0.985095,0.437116,-0.718074,
+ 0.214013,-0.011144,-0.976767,0.939088,0.463494,-0.73348,
+ 0.06872,-0.352527,-0.933275,0.936818,0.370973,-0.717914,
+ 0.291602,-0.024985,-0.956213,0.985095,0.437116,-0.718074,
+ 0.06872,-0.352527,-0.933275,0.936818,0.370973,-0.717914,
+ 0.110573,-0.360362,-0.926236,0.979421,0.352064,-0.703536,
+ 0.214013,-0.011144,-0.976767,0.939088,0.463494,-0.73348,
+ -0.2474,0.003968,-0.968905,0.905451,0.476683,-0.737495,
+ -0.359172,-0.316853,-0.877838,0.905187,0.382177,-0.721479,
+ -0.359172,-0.316853,-0.877838,0.905187,0.382177,-0.721479,
+ 0.06872,-0.352527,-0.933275,0.936818,0.370973,-0.717914,
+ 0.214013,-0.011144,-0.976767,0.939088,0.463494,-0.73348,
+ -0.455383,-0.61687,-0.641949,0.905018,0.303308,-0.673773,
+ -0.088988,-0.705766,-0.702834,0.934927,0.293873,-0.671218,
+ 0.06872,-0.352527,-0.933275,0.936818,0.370973,-0.717914,
+ -0.455383,-0.61687,-0.641949,0.905018,0.303308,-0.673773,
+ 0.06872,-0.352527,-0.933275,0.936818,0.370973,-0.717914,
+ -0.359172,-0.316853,-0.877838,0.905187,0.382177,-0.721479,
+ 0.575185,0.562873,-0.59358,0.995497,0.593044,-0.659921,
+ 0.429706,0.63213,-0.644798,0.943249,0.633115,-0.671218,
+ 0.345208,0.311816,-0.885213,0.941357,0.556014,-0.717914,
+ 0.575185,0.562873,-0.59358,0.995497,0.593044,-0.659921,
+ 0.345208,0.311816,-0.885213,0.941357,0.556014,-0.717914,
+ 0.447221,0.281892,-0.84884,0.990769,0.522168,-0.703536,
+ 0.429706,0.63213,-0.644798,0.943249,0.633115,-0.671218,
+ -0.115437,0.702917,-0.701842,0.907098,0.650057,-0.673773,
+ -0.23409,0.368714,-0.899584,0.906322,0.571188,-0.721479,
+ -0.23409,0.368714,-0.899584,0.906322,0.571188,-0.721479,
+ 0.345208,0.311816,-0.885213,0.941357,0.556014,-0.717914,
+ 0.429706,0.63213,-0.644798,0.943249,0.633115,-0.671218,
+ -0.2474,0.003968,-0.968905,0.905451,0.476683,-0.737495,
+ 0.214013,-0.011144,-0.976767,0.939088,0.463494,-0.73348,
+ 0.345208,0.311816,-0.885213,0.941357,0.556014,-0.717914,
+ -0.2474,0.003968,-0.968905,0.905451,0.476683,-0.737495,
+ 0.345208,0.311816,-0.885213,0.941357,0.556014,-0.717914,
+ -0.23409,0.368714,-0.899584,0.906322,0.571188,-0.721479,
+ 0.214013,-0.011144,-0.976767,0.939088,0.463494,-0.73348,
+ 0.291602,-0.024985,-0.956213,0.985095,0.437116,-0.718074,
+ 0.447221,0.281892,-0.84884,0.990769,0.522168,-0.703536,
+ 0.447221,0.281892,-0.84884,0.990769,0.522168,-0.703536,
+ 0.345208,0.311816,-0.885213,0.941357,0.556014,-0.717914,
+ 0.214013,-0.011144,-0.976767,0.939088,0.463494,-0.73348,
+ -0.959446,0.199329,-0.199329,0.87462,0.619745,-0.638667,
+ -0.976969,0.100277,-0.18835,0.870135,0.563579,-0.664625,
+ -0.859317,0.197434,-0.471799,0.883764,0.568579,-0.706,
+ -0.959446,0.199329,-0.199329,0.87462,0.619745,-0.638667,
+ -0.859317,0.197434,-0.471799,0.883764,0.568579,-0.706,
+ -0.714284,0.497638,-0.492092,0.884979,0.641954,-0.660875,
+ -0.969635,0,-0.244558,0.867922,0.481079,-0.677562,
+ -0.761523,0.030964,-0.647398,0.882548,0.481079,-0.7215,
+ -0.859317,0.197434,-0.471799,0.883764,0.568579,-0.706,
+ -0.969635,0,-0.244558,0.867922,0.481079,-0.677562,
+ -0.859317,0.197434,-0.471799,0.883764,0.568579,-0.706,
+ -0.976969,0.100277,-0.18835,0.870135,0.563579,-0.664625,
+ -0.761523,0.030964,-0.647398,0.882548,0.481079,-0.7215,
+ -0.2474,0.003968,-0.968905,0.905451,0.476683,-0.737495,
+ -0.23409,0.368714,-0.899584,0.906322,0.571188,-0.721479,
+ -0.23409,0.368714,-0.899584,0.906322,0.571188,-0.721479,
+ -0.859317,0.197434,-0.471799,0.883764,0.568579,-0.706,
+ -0.761523,0.030964,-0.647398,0.882548,0.481079,-0.7215,
+ -0.23409,0.368714,-0.899584,0.906322,0.571188,-0.721479,
+ -0.115437,0.702917,-0.701842,0.907098,0.650057,-0.673773,
+ -0.714284,0.497638,-0.492092,0.884979,0.641954,-0.660875,
+ -0.714284,0.497638,-0.492092,0.884979,0.641954,-0.660875,
+ -0.859317,0.197434,-0.471799,0.883764,0.568579,-0.706,
+ -0.23409,0.368714,-0.899584,0.906322,0.571188,-0.721479,
+ -0.959446,-0.199329,-0.199329,0.87462,0.342412,-0.638667,
+ -0.826325,-0.370128,-0.424489,0.884979,0.320204,-0.660875,
+ -0.845588,-0.179708,-0.502678,0.883764,0.393579,-0.706,
+ -0.959446,-0.199329,-0.199329,0.87462,0.342412,-0.638667,
+ -0.845588,-0.179708,-0.502678,0.883764,0.393579,-0.706,
+ -0.976969,-0.100277,-0.18835,0.870135,0.398579,-0.664625,
+ -0.826325,-0.370128,-0.424489,0.884979,0.320204,-0.660875,
+ -0.455383,-0.61687,-0.641949,0.905018,0.303308,-0.673773,
+ -0.359172,-0.316853,-0.877838,0.905187,0.382177,-0.721479,
+ -0.359172,-0.316853,-0.877838,0.905187,0.382177,-0.721479,
+ -0.845588,-0.179708,-0.502678,0.883764,0.393579,-0.706,
+ -0.826325,-0.370128,-0.424489,0.884979,0.320204,-0.660875,
+ -0.2474,0.003968,-0.968905,0.905451,0.476683,-0.737495,
+ -0.761523,0.030964,-0.647398,0.882548,0.481079,-0.7215,
+ -0.845588,-0.179708,-0.502678,0.883764,0.393579,-0.706,
+ -0.2474,0.003968,-0.968905,0.905451,0.476683,-0.737495,
+ -0.845588,-0.179708,-0.502678,0.883764,0.393579,-0.706,
+ -0.359172,-0.316853,-0.877838,0.905187,0.382177,-0.721479,
+ -0.969635,0,-0.244558,0.867922,0.481079,-0.677562,
+ -0.976969,-0.100277,-0.18835,0.870135,0.398579,-0.664625,
+ -0.845588,-0.179708,-0.502678,0.883764,0.393579,-0.706,
+ -0.969635,0,-0.244558,0.867922,0.481079,-0.677562,
+ -0.845588,-0.179708,-0.502678,0.883764,0.393579,-0.706,
+ -0.761523,0.030964,-0.647398,0.882548,0.481079,-0.7215,
+ -0.959446,0.199329,0.199329,0.87462,0.619745,-0.361333,
+ -0.976969,0.100277,0.18835,0.870135,0.563579,-0.335375,
+ -0.993621,0.079739,0.079739,0.861889,0.571579,-0.4095,
+ -0.959446,0.199329,0.199329,0.87462,0.619745,-0.361333,
+ -0.993621,0.079739,0.079739,0.861889,0.571579,-0.4095,
+ -0.976969,0.188349,0.100277,0.870135,0.645704,-0.4175,
+ -0.976969,0.100277,0.18835,0.870135,0.563579,-0.335375,
+ -0.969635,0,0.244558,0.867922,0.481079,-0.322437,
+ -0.996384,0,0.08496,0.859111,0.481079,-0.40225,
+ -0.996384,0,0.08496,0.859111,0.481079,-0.40225,
+ -0.993621,0.079739,0.079739,0.861889,0.571579,-0.4095,
+ -0.976969,0.100277,0.18835,0.870135,0.563579,-0.335375,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.996384,0.08496,0,0.859111,0.578829,-0.5,
+ -0.993621,0.079739,0.079739,0.861889,0.571579,-0.4095,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.993621,0.079739,0.079739,0.861889,0.571579,-0.4095,
+ -0.996384,0,0.08496,0.859111,0.481079,-0.40225,
+ -0.996384,0.08496,0,0.859111,0.578829,-0.5,
+ -0.969635,0.244558,0,0.867922,0.658641,-0.5,
+ -0.976969,0.188349,0.100277,0.870135,0.645704,-0.4175,
+ -0.976969,0.188349,0.100277,0.870135,0.645704,-0.4175,
+ -0.993621,0.079739,0.079739,0.861889,0.571579,-0.4095,
+ -0.996384,0.08496,0,0.859111,0.578829,-0.5,
+ -0.959446,-0.199329,0.199329,0.87462,0.342412,-0.361333,
+ -0.976969,-0.18835,0.100277,0.870135,0.316454,-0.4175,
+ -0.993621,-0.079739,0.079739,0.861889,0.390579,-0.4095,
+ -0.959446,-0.199329,0.199329,0.87462,0.342412,-0.361333,
+ -0.993621,-0.079739,0.079739,0.861889,0.390579,-0.4095,
+ -0.976969,-0.100277,0.18835,0.870135,0.398579,-0.335375,
+ -0.976969,-0.18835,0.100277,0.870135,0.316454,-0.4175,
+ -0.969635,-0.244558,0,0.867922,0.303516,-0.5,
+ -0.996384,-0.08496,0,0.859111,0.383329,-0.5,
+ -0.996384,-0.08496,0,0.859111,0.383329,-0.5,
+ -0.993621,-0.079739,0.079739,0.861889,0.390579,-0.4095,
+ -0.976969,-0.18835,0.100277,0.870135,0.316454,-0.4175,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.996384,0,0.08496,0.859111,0.481079,-0.40225,
+ -0.993621,-0.079739,0.079739,0.861889,0.390579,-0.4095,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.993621,-0.079739,0.079739,0.861889,0.390579,-0.4095,
+ -0.996384,-0.08496,0,0.859111,0.383329,-0.5,
+ -0.996384,0,0.08496,0.859111,0.481079,-0.40225,
+ -0.969635,0,0.244558,0.867922,0.481079,-0.322437,
+ -0.976969,-0.100277,0.18835,0.870135,0.398579,-0.335375,
+ -0.976969,-0.100277,0.18835,0.870135,0.398579,-0.335375,
+ -0.993621,-0.079739,0.079739,0.861889,0.390579,-0.4095,
+ -0.996384,0,0.08496,0.859111,0.481079,-0.40225,
+ -0.959446,-0.199329,-0.199329,0.87462,0.342412,-0.638667,
+ -0.976969,-0.100277,-0.18835,0.870135,0.398579,-0.664625,
+ -0.993621,-0.079739,-0.079739,0.861889,0.390579,-0.5905,
+ -0.959446,-0.199329,-0.199329,0.87462,0.342412,-0.638667,
+ -0.993621,-0.079739,-0.079739,0.861889,0.390579,-0.5905,
+ -0.976969,-0.18835,-0.100277,0.870135,0.316454,-0.5825,
+ -0.976969,-0.100277,-0.18835,0.870135,0.398579,-0.664625,
+ -0.969635,0,-0.244558,0.867922,0.481079,-0.677562,
+ -0.996384,0,-0.08496,0.859111,0.481079,-0.59775,
+ -0.996384,0,-0.08496,0.859111,0.481079,-0.59775,
+ -0.993621,-0.079739,-0.079739,0.861889,0.390579,-0.5905,
+ -0.976969,-0.100277,-0.18835,0.870135,0.398579,-0.664625,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.996384,-0.08496,0,0.859111,0.383329,-0.5,
+ -0.993621,-0.079739,-0.079739,0.861889,0.390579,-0.5905,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.993621,-0.079739,-0.079739,0.861889,0.390579,-0.5905,
+ -0.996384,0,-0.08496,0.859111,0.481079,-0.59775,
+ -0.996384,-0.08496,0,0.859111,0.383329,-0.5,
+ -0.969635,-0.244558,0,0.867922,0.303516,-0.5,
+ -0.976969,-0.18835,-0.100277,0.870135,0.316454,-0.5825,
+ -0.976969,-0.18835,-0.100277,0.870135,0.316454,-0.5825,
+ -0.993621,-0.079739,-0.079739,0.861889,0.390579,-0.5905,
+ -0.996384,-0.08496,0,0.859111,0.383329,-0.5,
+ -0.959446,0.199329,-0.199329,0.87462,0.619745,-0.638667,
+ -0.976969,0.188349,-0.100277,0.870135,0.645704,-0.5825,
+ -0.993621,0.079739,-0.079739,0.861889,0.571579,-0.5905,
+ -0.959446,0.199329,-0.199329,0.87462,0.619745,-0.638667,
+ -0.993621,0.079739,-0.079739,0.861889,0.571579,-0.5905,
+ -0.976969,0.100277,-0.18835,0.870135,0.563579,-0.664625,
+ -0.976969,0.188349,-0.100277,0.870135,0.645704,-0.5825,
+ -0.969635,0.244558,0,0.867922,0.658641,-0.5,
+ -0.996384,0.08496,0,0.859111,0.578829,-0.5,
+ -0.996384,0.08496,0,0.859111,0.578829,-0.5,
+ -0.993621,0.079739,-0.079739,0.861889,0.571579,-0.5905,
+ -0.976969,0.188349,-0.100277,0.870135,0.645704,-0.5825,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.996384,0,-0.08496,0.859111,0.481079,-0.59775,
+ -0.993621,0.079739,-0.079739,0.861889,0.571579,-0.5905,
+ -1,0,0,0.856159,0.481079,-0.5,
+ -0.993621,0.079739,-0.079739,0.861889,0.571579,-0.5905,
+ -0.996384,0.08496,0,0.859111,0.578829,-0.5,
+ -0.996384,0,-0.08496,0.859111,0.481079,-0.59775,
+ -0.969635,0,-0.244558,0.867922,0.481079,-0.677562,
+ -0.976969,0.100277,-0.18835,0.870135,0.563579,-0.664625,
+ -0.976969,0.100277,-0.18835,0.870135,0.563579,-0.664625,
+ -0.993621,0.079739,-0.079739,0.861889,0.571579,-0.5905,
+ -0.996384,0,-0.08496,0.859111,0.481079,-0.59775,
+ 0.642358,0.715039,-0.275852,0.998334,0.63557,-0.58723,
+ 0.575185,0.562873,-0.59358,0.995497,0.593044,-0.659921,
+ 0.599141,0.555368,-0.576712,1.065911,0.531759,-0.646592,
+ 0.599141,0.555368,-0.576712,1.065911,0.531759,-0.646592,
+ 0.668157,0.701389,-0.248233,1.071585,0.569561,-0.579959,
+ 0.642358,0.715039,-0.275852,0.998334,0.63557,-0.58723,
+ 0.599141,0.555368,-0.576712,1.065911,0.531759,-0.646592,
+ 0.585003,0.517563,-0.62442,1.149095,0.453892,-0.633787,
+ 0.682874,0.680924,-0.264625,1.158568,0.486483,-0.572975,
+ 0.682874,0.680924,-0.264625,1.158568,0.486483,-0.572975,
+ 0.668157,0.701389,-0.248233,1.071585,0.569561,-0.579959,
+ 0.599141,0.555368,-0.576712,1.065911,0.531759,-0.646592,
+ 0.682874,0.680924,-0.264625,1.158568,0.486483,-0.572975,
+ 0.700187,0.71396,0,1.161726,0.497346,-0.5,
+ 0.687547,0.72614,0,1.073477,0.582162,-0.5,
+ 0.687547,0.72614,0,1.073477,0.582162,-0.5,
+ 0.668157,0.701389,-0.248233,1.071585,0.569561,-0.579959,
+ 0.682874,0.680924,-0.264625,1.158568,0.486483,-0.572975,
+ 0.662437,0.749118,0,0.99928,0.649745,-0.5,
+ 0.642358,0.715039,-0.275852,0.998334,0.63557,-0.58723,
+ 0.668157,0.701389,-0.248233,1.071585,0.569561,-0.579959,
+ 0.662437,0.749118,0,0.99928,0.649745,-0.5,
+ 0.668157,0.701389,-0.248233,1.071585,0.569561,-0.579959,
+ 0.687547,0.72614,0,1.073477,0.582162,-0.5,
+ 0.568513,0.503436,-0.65065,1.23965,0.364075,-0.624059,
+ 0.547232,0.498931,-0.672015,1.332183,0.266938,-0.619965,
+ 0.694102,0.647395,-0.314805,1.351457,0.289652,-0.565436,
+ 0.694102,0.647395,-0.314805,1.351457,0.289652,-0.565436,
+ 0.688382,0.659806,-0.301308,1.253715,0.391468,-0.567669,
+ 0.568513,0.503436,-0.65065,1.23965,0.364075,-0.624059,
+ 0.726158,0.687528,0,1.357882,0.297224,-0.5,
+ 0.71287,0.701296,0,1.258403,0.4006,-0.5,
+ 0.688382,0.659806,-0.301308,1.253715,0.391468,-0.567669,
+ 0.726158,0.687528,0,1.357882,0.297224,-0.5,
+ 0.688382,0.659806,-0.301308,1.253715,0.391468,-0.567669,
+ 0.694102,0.647395,-0.314805,1.351457,0.289652,-0.565436,
+ 0.71287,0.701296,0,1.258403,0.4006,-0.5,
+ 0.700187,0.71396,0,1.161726,0.497346,-0.5,
+ 0.682874,0.680924,-0.264625,1.158568,0.486483,-0.572975,
+ 0.682874,0.680924,-0.264625,1.158568,0.486483,-0.572975,
+ 0.688382,0.659806,-0.301308,1.253715,0.391468,-0.567669,
+ 0.71287,0.701296,0,1.258403,0.4006,-0.5,
+ 0.585003,0.517563,-0.62442,1.149095,0.453892,-0.633787,
+ 0.568513,0.503436,-0.65065,1.23965,0.364075,-0.624059,
+ 0.688382,0.659806,-0.301308,1.253715,0.391468,-0.567669,
+ 0.585003,0.517563,-0.62442,1.149095,0.453892,-0.633787,
+ 0.688382,0.659806,-0.301308,1.253715,0.391468,-0.567669,
+ 0.682874,0.680924,-0.264625,1.158568,0.486483,-0.572975,
+ 0.694102,0.647395,0.314805,1.351457,0.289652,-0.434564,
+ 0.547232,0.498931,0.672016,1.332183,0.266938,-0.380035,
+ 0.568513,0.503436,0.65065,1.23965,0.364075,-0.375941,
+ 0.568513,0.503436,0.65065,1.23965,0.364075,-0.375941,
+ 0.688382,0.659806,0.301308,1.253715,0.391468,-0.432331,
+ 0.694102,0.647395,0.314805,1.351457,0.289652,-0.434564,
+ 0.585003,0.517563,0.62442,1.149095,0.453892,-0.366213,
+ 0.682874,0.680923,0.264625,1.158568,0.486483,-0.427025,
+ 0.688382,0.659806,0.301308,1.253715,0.391468,-0.432331,
+ 0.585003,0.517563,0.62442,1.149095,0.453892,-0.366213,
+ 0.688382,0.659806,0.301308,1.253715,0.391468,-0.432331,
+ 0.568513,0.503436,0.65065,1.23965,0.364075,-0.375941,
+ 0.682874,0.680923,0.264625,1.158568,0.486483,-0.427025,
+ 0.700187,0.71396,0,1.161726,0.497346,-0.5,
+ 0.71287,0.701296,0,1.258403,0.4006,-0.5,
+ 0.71287,0.701296,0,1.258403,0.4006,-0.5,
+ 0.688382,0.659806,0.301308,1.253715,0.391468,-0.432331,
+ 0.682874,0.680923,0.264625,1.158568,0.486483,-0.427025,
+ 0.726158,0.687528,0,1.357882,0.297224,-0.5,
+ 0.694102,0.647395,0.314805,1.351457,0.289652,-0.434564,
+ 0.688382,0.659806,0.301308,1.253715,0.391468,-0.432331,
+ 0.726158,0.687528,0,1.357882,0.297224,-0.5,
+ 0.688382,0.659806,0.301308,1.253715,0.391468,-0.432331,
+ 0.71287,0.701296,0,1.258403,0.4006,-0.5,
+ 0.599141,0.555368,0.576712,1.065911,0.531759,-0.353408,
+ 0.575185,0.562873,0.59358,0.995497,0.593044,-0.340079,
+ 0.642358,0.715039,0.275852,0.998334,0.63557,-0.41277,
+ 0.642358,0.715039,0.275852,0.998334,0.63557,-0.41277,
+ 0.668157,0.701389,0.248233,1.071585,0.569561,-0.420041,
+ 0.599141,0.555368,0.576712,1.065911,0.531759,-0.353408,
+ 0.662437,0.749118,0,0.99928,0.649745,-0.5,
+ 0.687547,0.72614,0,1.073477,0.582162,-0.5,
+ 0.668157,0.701389,0.248233,1.071585,0.569561,-0.420041,
+ 0.662437,0.749118,0,0.99928,0.649745,-0.5,
+ 0.668157,0.701389,0.248233,1.071585,0.569561,-0.420041,
+ 0.642358,0.715039,0.275852,0.998334,0.63557,-0.41277,
+ 0.687547,0.72614,0,1.073477,0.582162,-0.5,
+ 0.700187,0.71396,0,1.161726,0.497346,-0.5,
+ 0.682874,0.680923,0.264625,1.158568,0.486483,-0.427025,
+ 0.682874,0.680923,0.264625,1.158568,0.486483,-0.427025,
+ 0.668157,0.701389,0.248233,1.071585,0.569561,-0.420041,
+ 0.687547,0.72614,0,1.073477,0.582162,-0.5,
+ 0.682874,0.680923,0.264625,1.158568,0.486483,-0.427025,
+ 0.585003,0.517563,0.62442,1.149095,0.453892,-0.366213,
+ 0.599141,0.555368,0.576712,1.065911,0.531759,-0.353408,
+ 0.599141,0.555368,0.576712,1.065911,0.531759,-0.353408,
+ 0.668157,0.701389,0.248233,1.071585,0.569561,-0.420041,
+ 0.682874,0.680923,0.264625,1.158568,0.486483,-0.427025,
+ -0.103837,-0.707557,-0.698986,0.974692,0.281188,-0.659921,
+ -0.251782,-0.681632,-0.687011,1.024302,0.254547,-0.646592,
+ 0.010629,-0.366255,-0.930454,1.033759,0.31755,-0.686572,
+ -0.103837,-0.707557,-0.698986,0.974692,0.281188,-0.659921,
+ 0.010629,-0.366255,-0.930454,1.033759,0.31755,-0.686572,
+ 0.110573,-0.360362,-0.926236,0.979421,0.352064,-0.703536,
+ -0.251782,-0.681632,-0.687011,1.024302,0.254547,-0.646592,
+ -0.405056,-0.645141,-0.64786,1.079619,0.214898,-0.633787,
+ -0.092335,-0.356775,-0.929616,1.095409,0.269215,-0.670274,
+ -0.092335,-0.356775,-0.929616,1.095409,0.269215,-0.670274,
+ 0.010629,-0.366255,-0.930454,1.033759,0.31755,-0.686572,
+ -0.251782,-0.681632,-0.687011,1.024302,0.254547,-0.646592,
+ 0.167416,-0.052778,-0.984473,1.114357,0.334395,-0.682436,
+ 0.238763,-0.041303,-0.970199,1.045107,0.393153,-0.699898,
+ 0.010629,-0.366255,-0.930454,1.033759,0.31755,-0.686572,
+ 0.167416,-0.052778,-0.984473,1.114357,0.334395,-0.682436,
+ 0.010629,-0.366255,-0.930454,1.033759,0.31755,-0.686572,
+ -0.092335,-0.356775,-0.929616,1.095409,0.269215,-0.670274,
+ 0.238763,-0.041303,-0.970199,1.045107,0.393153,-0.699898,
+ 0.291602,-0.024985,-0.956213,0.985095,0.437116,-0.718074,
+ 0.110573,-0.360362,-0.926236,0.979421,0.352064,-0.703536,
+ 0.110573,-0.360362,-0.926236,0.979421,0.352064,-0.703536,
+ 0.010629,-0.366255,-0.930454,1.033759,0.31755,-0.686572,
+ 0.238763,-0.041303,-0.970199,1.045107,0.393153,-0.699898,
+ -0.469451,-0.529408,-0.706642,1.136509,0.163187,-0.624059,
+ -0.591819,-0.448047,-0.670078,1.190836,0.100363,-0.619965,
+ -0.293198,-0.238286,-0.925881,1.22296,0.138221,-0.652683,
+ -0.293198,-0.238286,-0.925881,1.22296,0.138221,-0.652683,
+ -0.19623,-0.318838,-0.927274,1.15995,0.208844,-0.657894,
+ -0.469451,-0.529408,-0.706642,1.136509,0.163187,-0.624059,
+ 0.003001,-0.001255,-0.999995,1.261509,0.18365,-0.663589,
+ 0.084953,-0.04518,-0.99536,1.18808,0.263631,-0.669172,
+ -0.19623,-0.318838,-0.927274,1.15995,0.208844,-0.657894,
+ 0.003001,-0.001255,-0.999995,1.261509,0.18365,-0.663589,
+ -0.19623,-0.318838,-0.927274,1.15995,0.208844,-0.657894,
+ -0.293198,-0.238286,-0.925881,1.22296,0.138221,-0.652683,
+ 0.084953,-0.04518,-0.99536,1.18808,0.263631,-0.669172,
+ 0.167416,-0.052778,-0.984473,1.114357,0.334395,-0.682436,
+ -0.092335,-0.356775,-0.929616,1.095409,0.269215,-0.670274,
+ -0.092335,-0.356775,-0.929616,1.095409,0.269215,-0.670274,
+ -0.19623,-0.318838,-0.927274,1.15995,0.208844,-0.657894,
+ 0.084953,-0.04518,-0.99536,1.18808,0.263631,-0.669172,
+ -0.405056,-0.645141,-0.64786,1.079619,0.214898,-0.633787,
+ -0.469451,-0.529408,-0.706642,1.136509,0.163187,-0.624059,
+ -0.19623,-0.318838,-0.927274,1.15995,0.208844,-0.657894,
+ -0.405056,-0.645141,-0.64786,1.079619,0.214898,-0.633787,
+ -0.19623,-0.318838,-0.927274,1.15995,0.208844,-0.657894,
+ -0.092335,-0.356775,-0.929616,1.095409,0.269215,-0.670274,
+ 0.547232,0.498931,-0.672015,1.332183,0.266938,-0.619965,
+ 0.568513,0.503436,-0.65065,1.23965,0.364075,-0.624059,
+ 0.340631,0.234777,-0.910412,1.216209,0.318418,-0.657894,
+ 0.547232,0.498931,-0.672015,1.332183,0.266938,-0.619965,
+ 0.340631,0.234777,-0.910412,1.216209,0.318418,-0.657894,
+ 0.284277,0.249094,-0.925818,1.300058,0.22908,-0.652683,
+ 0.568513,0.503436,-0.65065,1.23965,0.364075,-0.624059,
+ 0.585003,0.517563,-0.62442,1.149095,0.453892,-0.633787,
+ 0.392854,0.244042,-0.886628,1.133305,0.399575,-0.670274,
+ 0.392854,0.244042,-0.886628,1.133305,0.399575,-0.670274,
+ 0.340631,0.234777,-0.910412,1.216209,0.318418,-0.657894,
+ 0.568513,0.503436,-0.65065,1.23965,0.364075,-0.624059,
+ 0.167416,-0.052778,-0.984473,1.114357,0.334395,-0.682436,
+ 0.084953,-0.04518,-0.99536,1.18808,0.263631,-0.669172,
+ 0.340631,0.234777,-0.910412,1.216209,0.318418,-0.657894,
+ 0.167416,-0.052778,-0.984473,1.114357,0.334395,-0.682436,
+ 0.340631,0.234777,-0.910412,1.216209,0.318418,-0.657894,
+ 0.392854,0.244042,-0.886628,1.133305,0.399575,-0.670274,
+ 0.084953,-0.04518,-0.99536,1.18808,0.263631,-0.669172,
+ 0.003001,-0.001255,-0.999995,1.261509,0.18365,-0.663589,
+ 0.284277,0.249094,-0.925818,1.300058,0.22908,-0.652683,
+ 0.284277,0.249094,-0.925818,1.300058,0.22908,-0.652683,
+ 0.340631,0.234777,-0.910412,1.216209,0.318418,-0.657894,
+ 0.084953,-0.04518,-0.99536,1.18808,0.263631,-0.669172,
+ 0.599141,0.555368,-0.576712,1.065911,0.531759,-0.646592,
+ 0.575185,0.562873,-0.59358,0.995497,0.593044,-0.659921,
+ 0.447221,0.281892,-0.84884,0.990769,0.522168,-0.703536,
+ 0.447221,0.281892,-0.84884,0.990769,0.522168,-0.703536,
+ 0.431005,0.262774,-0.86324,1.056455,0.468757,-0.686572,
+ 0.599141,0.555368,-0.576712,1.065911,0.531759,-0.646592,
+ 0.291602,-0.024985,-0.956213,0.985095,0.437116,-0.718074,
+ 0.238763,-0.041303,-0.970199,1.045107,0.393153,-0.699898,
+ 0.431005,0.262774,-0.86324,1.056455,0.468757,-0.686572,
+ 0.291602,-0.024985,-0.956213,0.985095,0.437116,-0.718074,
+ 0.431005,0.262774,-0.86324,1.056455,0.468757,-0.686572,
+ 0.447221,0.281892,-0.84884,0.990769,0.522168,-0.703536,
+ 0.238763,-0.041303,-0.970199,1.045107,0.393153,-0.699898,
+ 0.167416,-0.052778,-0.984473,1.114357,0.334395,-0.682436,
+ 0.392854,0.244042,-0.886628,1.133305,0.399575,-0.670274,
+ 0.392854,0.244042,-0.886628,1.133305,0.399575,-0.670274,
+ 0.431005,0.262774,-0.86324,1.056455,0.468757,-0.686572,
+ 0.238763,-0.041303,-0.970199,1.045107,0.393153,-0.699898,
+ 0.585003,0.517563,-0.62442,1.149095,0.453892,-0.633787,
+ 0.599141,0.555368,-0.576712,1.065911,0.531759,-0.646592,
+ 0.431005,0.262774,-0.86324,1.056455,0.468757,-0.686572,
+ 0.585003,0.517563,-0.62442,1.149095,0.453892,-0.633787,
+ 0.431005,0.262774,-0.86324,1.056455,0.468757,-0.686572,
+ 0.392854,0.244042,-0.886628,1.133305,0.399575,-0.670274,
+ -0.103837,-0.707557,0.698986,0.974692,0.281188,-0.340079,
+ 0.110573,-0.360361,0.926236,0.979421,0.352064,-0.296464,
+ 0.010629,-0.366254,0.930454,1.033759,0.31755,-0.313428,
+ -0.103837,-0.707557,0.698986,0.974692,0.281188,-0.340079,
+ 0.010629,-0.366254,0.930454,1.033759,0.31755,-0.313428,
+ -0.251782,-0.681632,0.68701,1.024302,0.254547,-0.353408,
+ 0.110573,-0.360361,0.926236,0.979421,0.352064,-0.296464,
+ 0.291601,-0.024985,0.956214,0.985095,0.437116,-0.281926,
+ 0.238762,-0.041303,0.970199,1.045107,0.393153,-0.300102,
+ 0.238762,-0.041303,0.970199,1.045107,0.393153,-0.300102,
+ 0.010629,-0.366254,0.930454,1.033759,0.31755,-0.313428,
+ 0.110573,-0.360361,0.926236,0.979421,0.352064,-0.296464,
+ 0.167415,-0.052778,0.984473,1.114357,0.334395,-0.317564,
+ -0.092335,-0.356776,0.929616,1.095409,0.269215,-0.329726,
+ 0.010629,-0.366254,0.930454,1.033759,0.31755,-0.313428,
+ 0.167415,-0.052778,0.984473,1.114357,0.334395,-0.317564,
+ 0.010629,-0.366254,0.930454,1.033759,0.31755,-0.313428,
+ 0.238762,-0.041303,0.970199,1.045107,0.393153,-0.300102,
+ -0.092335,-0.356776,0.929616,1.095409,0.269215,-0.329726,
+ -0.405056,-0.645141,0.64786,1.079619,0.214898,-0.366213,
+ -0.251782,-0.681632,0.68701,1.024302,0.254547,-0.353408,
+ -0.251782,-0.681632,0.68701,1.024302,0.254547,-0.353408,
+ 0.010629,-0.366254,0.930454,1.033759,0.31755,-0.313428,
+ -0.092335,-0.356776,0.929616,1.095409,0.269215,-0.329726,
+ 0.447221,0.281892,0.848841,0.990769,0.522168,-0.296464,
+ 0.575185,0.562873,0.59358,0.995497,0.593044,-0.340079,
+ 0.599141,0.555368,0.576712,1.065911,0.531759,-0.353408,
+ 0.599141,0.555368,0.576712,1.065911,0.531759,-0.353408,
+ 0.431005,0.262774,0.863241,1.056455,0.468757,-0.313428,
+ 0.447221,0.281892,0.848841,0.990769,0.522168,-0.296464,
+ 0.585003,0.517563,0.62442,1.149095,0.453892,-0.366213,
+ 0.392854,0.244041,0.886628,1.133305,0.399575,-0.329726,
+ 0.431005,0.262774,0.863241,1.056455,0.468757,-0.313428,
+ 0.585003,0.517563,0.62442,1.149095,0.453892,-0.366213,
+ 0.431005,0.262774,0.863241,1.056455,0.468757,-0.313428,
+ 0.599141,0.555368,0.576712,1.065911,0.531759,-0.353408,
+ 0.392854,0.244041,0.886628,1.133305,0.399575,-0.329726,
+ 0.167415,-0.052778,0.984473,1.114357,0.334395,-0.317564,
+ 0.238762,-0.041303,0.970199,1.045107,0.393153,-0.300102,
+ 0.238762,-0.041303,0.970199,1.045107,0.393153,-0.300102,
+ 0.431005,0.262774,0.863241,1.056455,0.468757,-0.313428,
+ 0.392854,0.244041,0.886628,1.133305,0.399575,-0.329726,
+ 0.291601,-0.024985,0.956214,0.985095,0.437116,-0.281926,
+ 0.447221,0.281892,0.848841,0.990769,0.522168,-0.296464,
+ 0.431005,0.262774,0.863241,1.056455,0.468757,-0.313428,
+ 0.291601,-0.024985,0.956214,0.985095,0.437116,-0.281926,
+ 0.431005,0.262774,0.863241,1.056455,0.468757,-0.313428,
+ 0.238762,-0.041303,0.970199,1.045107,0.393153,-0.300102,
+ 0.547232,0.498931,0.672016,1.332183,0.266938,-0.380035,
+ 0.284277,0.249093,0.925818,1.300058,0.22908,-0.347317,
+ 0.34063,0.234777,0.910412,1.216209,0.318418,-0.342106,
+ 0.547232,0.498931,0.672016,1.332183,0.266938,-0.380035,
+ 0.34063,0.234777,0.910412,1.216209,0.318418,-0.342106,
+ 0.568513,0.503436,0.65065,1.23965,0.364075,-0.375941,
+ 0.284277,0.249093,0.925818,1.300058,0.22908,-0.347317,
+ 0.003001,-0.001255,0.999995,1.261509,0.18365,-0.336411,
+ 0.084953,-0.04518,0.99536,1.18808,0.263631,-0.330828,
+ 0.084953,-0.04518,0.99536,1.18808,0.263631,-0.330828,
+ 0.34063,0.234777,0.910412,1.216209,0.318418,-0.342106,
+ 0.284277,0.249093,0.925818,1.300058,0.22908,-0.347317,
+ 0.167415,-0.052778,0.984473,1.114357,0.334395,-0.317564,
+ 0.392854,0.244041,0.886628,1.133305,0.399575,-0.329726,
+ 0.34063,0.234777,0.910412,1.216209,0.318418,-0.342106,
+ 0.167415,-0.052778,0.984473,1.114357,0.334395,-0.317564,
+ 0.34063,0.234777,0.910412,1.216209,0.318418,-0.342106,
+ 0.084953,-0.04518,0.99536,1.18808,0.263631,-0.330828,
+ 0.392854,0.244041,0.886628,1.133305,0.399575,-0.329726,
+ 0.585003,0.517563,0.62442,1.149095,0.453892,-0.366213,
+ 0.568513,0.503436,0.65065,1.23965,0.364075,-0.375941,
+ 0.568513,0.503436,0.65065,1.23965,0.364075,-0.375941,
+ 0.34063,0.234777,0.910412,1.216209,0.318418,-0.342106,
+ 0.392854,0.244041,0.886628,1.133305,0.399575,-0.329726,
+ -0.293197,-0.238286,0.925881,1.22296,0.138221,-0.347317,
+ -0.591819,-0.448047,0.670078,1.190836,0.100363,-0.380035,
+ -0.469451,-0.529408,0.706642,1.136509,0.163187,-0.375941,
+ -0.469451,-0.529408,0.706642,1.136509,0.163187,-0.375941,
+ -0.19623,-0.318838,0.927274,1.15995,0.208844,-0.342106,
+ -0.293197,-0.238286,0.925881,1.22296,0.138221,-0.347317,
+ -0.405056,-0.645141,0.64786,1.079619,0.214898,-0.366213,
+ -0.092335,-0.356776,0.929616,1.095409,0.269215,-0.329726,
+ -0.19623,-0.318838,0.927274,1.15995,0.208844,-0.342106,
+ -0.405056,-0.645141,0.64786,1.079619,0.214898,-0.366213,
+ -0.19623,-0.318838,0.927274,1.15995,0.208844,-0.342106,
+ -0.469451,-0.529408,0.706642,1.136509,0.163187,-0.375941,
+ -0.092335,-0.356776,0.929616,1.095409,0.269215,-0.329726,
+ 0.167415,-0.052778,0.984473,1.114357,0.334395,-0.317564,
+ 0.084953,-0.04518,0.99536,1.18808,0.263631,-0.330828,
+ 0.084953,-0.04518,0.99536,1.18808,0.263631,-0.330828,
+ -0.19623,-0.318838,0.927274,1.15995,0.208844,-0.342106,
+ -0.092335,-0.356776,0.929616,1.095409,0.269215,-0.329726,
+ 0.003001,-0.001255,0.999995,1.261509,0.18365,-0.336411,
+ -0.293197,-0.238286,0.925881,1.22296,0.138221,-0.347317,
+ -0.19623,-0.318838,0.927274,1.15995,0.208844,-0.342106,
+ 0.003001,-0.001255,0.999995,1.261509,0.18365,-0.336411,
+ -0.19623,-0.318838,0.927274,1.15995,0.208844,-0.342106,
+ 0.084953,-0.04518,0.99536,1.18808,0.263631,-0.330828,
+ -0.251782,-0.681632,-0.687011,1.024302,0.254547,-0.646592,
+ -0.103837,-0.707557,-0.698986,0.974692,0.281188,-0.659921,
+ -0.260846,-0.906261,-0.332641,0.971855,0.238662,-0.58723,
+ -0.260846,-0.906261,-0.332641,0.971855,0.238662,-0.58723,
+ -0.42869,-0.845027,-0.319616,1.018628,0.216746,-0.579959,
+ -0.251782,-0.681632,-0.687011,1.024302,0.254547,-0.646592,
+ -0.339022,-0.940778,0,0.97091,0.224487,-0.5,
+ -0.49913,-0.866527,0,1.016736,0.204145,-0.5,
+ -0.42869,-0.845027,-0.319616,1.018628,0.216746,-0.579959,
+ -0.339022,-0.940778,0,0.97091,0.224487,-0.5,
+ -0.42869,-0.845027,-0.319616,1.018628,0.216746,-0.579959,
+ -0.260846,-0.906261,-0.332641,0.971855,0.238662,-0.58723,
+ -0.49913,-0.866527,0,1.016736,0.204145,-0.5,
+ -0.60511,-0.796142,0,1.066987,0.171444,-0.5,
+ -0.573691,-0.778283,-0.255254,1.070145,0.182308,-0.572975,
+ -0.573691,-0.778283,-0.255254,1.070145,0.182308,-0.572975,
+ -0.42869,-0.845027,-0.319616,1.018628,0.216746,-0.579959,
+ -0.49913,-0.866527,0,1.016736,0.204145,-0.5,
+ -0.405056,-0.645141,-0.64786,1.079619,0.214898,-0.633787,
+ -0.251782,-0.681632,-0.687011,1.024302,0.254547,-0.646592,
+ -0.42869,-0.845027,-0.319616,1.018628,0.216746,-0.579959,
+ -0.405056,-0.645141,-0.64786,1.079619,0.214898,-0.633787,
+ -0.42869,-0.845027,-0.319616,1.018628,0.216746,-0.579959,
+ -0.573691,-0.778283,-0.255254,1.070145,0.182308,-0.572975,
+ -0.260846,-0.906261,0.332641,0.971855,0.238662,-0.41277,
+ -0.103837,-0.707557,0.698986,0.974692,0.281188,-0.340079,
+ -0.251782,-0.681632,0.68701,1.024302,0.254547,-0.353408,
+ -0.251782,-0.681632,0.68701,1.024302,0.254547,-0.353408,
+ -0.42869,-0.845027,0.319616,1.018628,0.216746,-0.420041,
+ -0.260846,-0.906261,0.332641,0.971855,0.238662,-0.41277,
+ -0.405056,-0.645141,0.64786,1.079619,0.214898,-0.366213,
+ -0.573691,-0.778283,0.255254,1.070145,0.182308,-0.427025,
+ -0.42869,-0.845027,0.319616,1.018628,0.216746,-0.420041,
+ -0.405056,-0.645141,0.64786,1.079619,0.214898,-0.366213,
+ -0.42869,-0.845027,0.319616,1.018628,0.216746,-0.420041,
+ -0.251782,-0.681632,0.68701,1.024302,0.254547,-0.353408,
+ -0.573691,-0.778283,0.255254,1.070145,0.182308,-0.427025,
+ -0.60511,-0.796142,0,1.066987,0.171444,-0.5,
+ -0.49913,-0.866527,0,1.016736,0.204145,-0.5,
+ -0.49913,-0.866527,0,1.016736,0.204145,-0.5,
+ -0.42869,-0.845027,0.319616,1.018628,0.216746,-0.420041,
+ -0.573691,-0.778283,0.255254,1.070145,0.182308,-0.427025,
+ -0.339022,-0.940778,0,0.97091,0.224487,-0.5,
+ -0.260846,-0.906261,0.332641,0.971855,0.238662,-0.41277,
+ -0.42869,-0.845027,0.319616,1.018628,0.216746,-0.420041,
+ -0.339022,-0.940778,0,0.97091,0.224487,-0.5,
+ -0.42869,-0.845027,0.319616,1.018628,0.216746,-0.420041,
+ -0.49913,-0.866527,0,1.016736,0.204145,-0.5,
+ -0.591819,-0.448047,0.670078,1.190836,0.100363,-0.380035,
+ -0.769835,-0.555714,0.313903,1.171562,0.077649,-0.434564,
+ -0.649709,-0.667916,0.362996,1.122445,0.135794,-0.432331,
+ -0.591819,-0.448047,0.670078,1.190836,0.100363,-0.380035,
+ -0.649709,-0.667916,0.362996,1.122445,0.135794,-0.432331,
+ -0.469451,-0.529408,0.706642,1.136509,0.163187,-0.375941,
+ -0.769835,-0.555714,0.313903,1.171562,0.077649,-0.434564,
+ -0.831075,-0.55616,0,1.165137,0.070077,-0.5,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.649709,-0.667916,0.362996,1.122445,0.135794,-0.432331,
+ -0.769835,-0.555714,0.313903,1.171562,0.077649,-0.434564,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.60511,-0.796142,0,1.066987,0.171444,-0.5,
+ -0.573691,-0.778283,0.255254,1.070145,0.182308,-0.427025,
+ -0.573691,-0.778283,0.255254,1.070145,0.182308,-0.427025,
+ -0.649709,-0.667916,0.362996,1.122445,0.135794,-0.432331,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.405056,-0.645141,0.64786,1.079619,0.214898,-0.366213,
+ -0.469451,-0.529408,0.706642,1.136509,0.163187,-0.375941,
+ -0.649709,-0.667916,0.362996,1.122445,0.135794,-0.432331,
+ -0.405056,-0.645141,0.64786,1.079619,0.214898,-0.366213,
+ -0.649709,-0.667916,0.362996,1.122445,0.135794,-0.432331,
+ -0.573691,-0.778283,0.255254,1.070145,0.182308,-0.427025,
+ -0.591819,-0.448047,-0.670078,1.190836,0.100363,-0.619965,
+ -0.469451,-0.529408,-0.706642,1.136509,0.163187,-0.624059,
+ -0.649709,-0.667916,-0.362996,1.122445,0.135794,-0.567669,
+ -0.591819,-0.448047,-0.670078,1.190836,0.100363,-0.619965,
+ -0.649709,-0.667916,-0.362996,1.122445,0.135794,-0.567669,
+ -0.769835,-0.555714,-0.313903,1.171562,0.077649,-0.565436,
+ -0.405056,-0.645141,-0.64786,1.079619,0.214898,-0.633787,
+ -0.573691,-0.778283,-0.255254,1.070145,0.182308,-0.572975,
+ -0.649709,-0.667916,-0.362996,1.122445,0.135794,-0.567669,
+ -0.405056,-0.645141,-0.64786,1.079619,0.214898,-0.633787,
+ -0.649709,-0.667916,-0.362996,1.122445,0.135794,-0.567669,
+ -0.469451,-0.529408,-0.706642,1.136509,0.163187,-0.624059,
+ -0.573691,-0.778283,-0.255254,1.070145,0.182308,-0.572975,
+ -0.60511,-0.796142,0,1.066987,0.171444,-0.5,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.649709,-0.667916,-0.362996,1.122445,0.135794,-0.567669,
+ -0.573691,-0.778283,-0.255254,1.070145,0.182308,-0.572975,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.831075,-0.55616,0,1.165137,0.070077,-0.5,
+ -0.769835,-0.555714,-0.313903,1.171562,0.077649,-0.565436,
+ -0.769835,-0.555714,-0.313903,1.171562,0.077649,-0.565436,
+ -0.649709,-0.667916,-0.362996,1.122445,0.135794,-0.567669,
+ -0.713427,-0.700729,0,1.117756,0.126662,-0.5,
+ -0.693597,-0.068529,-0.717096,1.333479,-0.188456,-0.659921,
+ -0.356933,0.09138,-0.92965,1.401596,-0.166219,-0.703536,
+ -0.410606,0.007113,-0.911785,1.370721,-0.099359,-0.686572,
+ -0.693597,-0.068529,-0.717096,1.333479,-0.188456,-0.659921,
+ -0.410606,0.007113,-0.911785,1.370721,-0.099359,-0.686572,
+ -0.736772,-0.170063,-0.654405,1.310553,-0.12345,-0.646592,
+ -0.356933,0.09138,-0.92965,1.401596,-0.166219,-0.703536,
+ -0.07755,0.232519,-0.969495,1.483337,-0.139536,-0.718074,
+ -0.076935,0.189453,-0.978871,1.442923,-0.07045,-0.699898,
+ -0.076935,0.189453,-0.978871,1.442923,-0.07045,-0.699898,
+ -0.410606,0.007113,-0.911785,1.370721,-0.099359,-0.686572,
+ -0.356933,0.09138,-0.92965,1.401596,-0.166219,-0.703536,
+ -0.094492,0.118807,-0.988411,1.39106,0.010509,-0.682436,
+ -0.411811,-0.074302,-0.908235,1.329732,-0.022152,-0.670274,
+ -0.410606,0.007113,-0.911785,1.370721,-0.099359,-0.686572,
+ -0.094492,0.118807,-0.988411,1.39106,0.010509,-0.682436,
+ -0.410606,0.007113,-0.911785,1.370721,-0.099359,-0.686572,
+ -0.076935,0.189453,-0.978871,1.442923,-0.07045,-0.699898,
+ -0.691037,-0.22774,-0.686005,1.278626,-0.049369,-0.633787,
+ -0.736772,-0.170063,-0.654405,1.310553,-0.12345,-0.646592,
+ -0.410606,0.007113,-0.911785,1.370721,-0.099359,-0.686572,
+ -0.691037,-0.22774,-0.686005,1.278626,-0.049369,-0.633787,
+ -0.410606,0.007113,-0.911785,1.370721,-0.099359,-0.686572,
+ -0.411811,-0.074302,-0.908235,1.329732,-0.022152,-0.670274,
+ 0.223762,0.38464,-0.895535,1.565078,-0.112852,-0.703536,
+ 0.523401,0.54123,-0.65812,1.633195,-0.090616,-0.659921,
+ 0.523007,0.53259,-0.665441,1.575292,-0.017451,-0.646592,
+ 0.523007,0.53259,-0.665441,1.575292,-0.017451,-0.646592,
+ 0.22394,0.359068,-0.906047,1.515124,-0.041541,-0.686572,
+ 0.223762,0.38464,-0.895535,1.565078,-0.112852,-0.703536,
+ 0.522827,0.522069,-0.673866,1.503495,0.070388,-0.633787,
+ 0.227361,0.327503,-0.917087,1.452388,0.04317,-0.670274,
+ 0.22394,0.359068,-0.906047,1.515124,-0.041541,-0.686572,
+ 0.522827,0.522069,-0.673866,1.503495,0.070388,-0.633787,
+ 0.22394,0.359068,-0.906047,1.515124,-0.041541,-0.686572,
+ 0.523007,0.53259,-0.665441,1.575292,-0.017451,-0.646592,
+ 0.227361,0.327503,-0.917087,1.452388,0.04317,-0.670274,
+ -0.094492,0.118807,-0.988411,1.39106,0.010509,-0.682436,
+ -0.076935,0.189453,-0.978871,1.442923,-0.07045,-0.699898,
+ -0.076935,0.189453,-0.978871,1.442923,-0.07045,-0.699898,
+ 0.22394,0.359068,-0.906047,1.515124,-0.041541,-0.686572,
+ 0.227361,0.327503,-0.917087,1.452388,0.04317,-0.670274,
+ -0.07755,0.232519,-0.969495,1.483337,-0.139536,-0.718074,
+ 0.223762,0.38464,-0.895535,1.565078,-0.112852,-0.703536,
+ 0.22394,0.359068,-0.906047,1.515124,-0.041541,-0.686572,
+ -0.07755,0.232519,-0.969495,1.483337,-0.139536,-0.718074,
+ 0.22394,0.359068,-0.906047,1.515124,-0.041541,-0.686572,
+ -0.076935,0.189453,-0.978871,1.442923,-0.07045,-0.699898,
+ 0.509286,0.493808,-0.704828,1.421294,0.167113,-0.624059,
+ 0.547232,0.498931,-0.672015,1.332183,0.266938,-0.619965,
+ 0.284277,0.249094,-0.925818,1.300058,0.22908,-0.652683,
+ 0.284277,0.249094,-0.925818,1.300058,0.22908,-0.652683,
+ 0.192479,0.2506,-0.948763,1.379742,0.135354,-0.657894,
+ 0.509286,0.493808,-0.704828,1.421294,0.167113,-0.624059,
+ 0.003001,-0.001255,-0.999995,1.261509,0.18365,-0.663589,
+ -0.080719,0.04088,-0.995898,1.329879,0.097243,-0.669172,
+ 0.192479,0.2506,-0.948763,1.379742,0.135354,-0.657894,
+ 0.003001,-0.001255,-0.999995,1.261509,0.18365,-0.663589,
+ 0.192479,0.2506,-0.948763,1.379742,0.135354,-0.657894,
+ 0.284277,0.249094,-0.925818,1.300058,0.22908,-0.652683,
+ -0.094492,0.118807,-0.988411,1.39106,0.010509,-0.682436,
+ 0.227361,0.327503,-0.917087,1.452388,0.04317,-0.670274,
+ 0.192479,0.2506,-0.948763,1.379742,0.135354,-0.657894,
+ -0.094492,0.118807,-0.988411,1.39106,0.010509,-0.682436,
+ 0.192479,0.2506,-0.948763,1.379742,0.135354,-0.657894,
+ -0.080719,0.04088,-0.995898,1.329879,0.097243,-0.669172,
+ 0.227361,0.327503,-0.917087,1.452388,0.04317,-0.670274,
+ 0.522827,0.522069,-0.673866,1.503495,0.070388,-0.633787,
+ 0.509286,0.493808,-0.704828,1.421294,0.167113,-0.624059,
+ 0.509286,0.493808,-0.704828,1.421294,0.167113,-0.624059,
+ 0.192479,0.2506,-0.948763,1.379742,0.135354,-0.657894,
+ 0.227361,0.327503,-0.917087,1.452388,0.04317,-0.670274,
+ -0.591819,-0.448047,-0.670078,1.190836,0.100363,-0.619965,
+ -0.660133,-0.325846,-0.676793,1.238464,0.027373,-0.624059,
+ -0.356146,-0.13643,-0.924417,1.280017,0.059132,-0.657894,
+ -0.591819,-0.448047,-0.670078,1.190836,0.100363,-0.619965,
+ -0.356146,-0.13643,-0.924417,1.280017,0.059132,-0.657894,
+ -0.293198,-0.238286,-0.925881,1.22296,0.138221,-0.652683,
+ -0.660133,-0.325846,-0.676793,1.238464,0.027373,-0.624059,
+ -0.691037,-0.22774,-0.686005,1.278626,-0.049369,-0.633787,
+ -0.411811,-0.074302,-0.908235,1.329732,-0.022152,-0.670274,
+ -0.411811,-0.074302,-0.908235,1.329732,-0.022152,-0.670274,
+ -0.356146,-0.13643,-0.924417,1.280017,0.059132,-0.657894,
+ -0.660133,-0.325846,-0.676793,1.238464,0.027373,-0.624059,
+ -0.094492,0.118807,-0.988411,1.39106,0.010509,-0.682436,
+ -0.080719,0.04088,-0.995898,1.329879,0.097243,-0.669172,
+ -0.356146,-0.13643,-0.924417,1.280017,0.059132,-0.657894,
+ -0.094492,0.118807,-0.988411,1.39106,0.010509,-0.682436,
+ -0.356146,-0.13643,-0.924417,1.280017,0.059132,-0.657894,
+ -0.411811,-0.074302,-0.908235,1.329732,-0.022152,-0.670274,
+ -0.080719,0.04088,-0.995898,1.329879,0.097243,-0.669172,
+ 0.003001,-0.001255,-0.999995,1.261509,0.18365,-0.663589,
+ -0.293198,-0.238286,-0.925881,1.22296,0.138221,-0.652683,
+ -0.293198,-0.238286,-0.925881,1.22296,0.138221,-0.652683,
+ -0.356146,-0.13643,-0.924417,1.280017,0.059132,-0.657894,
+ -0.080719,0.04088,-0.995898,1.329879,0.097243,-0.669172,
+ -0.693597,-0.068529,-0.717096,1.333479,-0.188456,-0.659921,
+ -0.736772,-0.170063,-0.654405,1.310553,-0.12345,-0.646592,
+ -0.904992,-0.260217,-0.336566,1.274453,-0.137904,-0.579959,
+ -0.693597,-0.068529,-0.717096,1.333479,-0.188456,-0.659921,
+ -0.904992,-0.260217,-0.336566,1.274453,-0.137904,-0.579959,
+ -0.932432,-0.178414,-0.314228,1.292609,-0.201797,-0.58723,
+ -0.736772,-0.170063,-0.654405,1.310553,-0.12345,-0.646592,
+ -0.691037,-0.22774,-0.686005,1.278626,-0.049369,-0.633787,
+ -0.880661,-0.339398,-0.330522,1.247962,-0.0657,-0.572975,
+ -0.880661,-0.339398,-0.330522,1.247962,-0.0657,-0.572975,
+ -0.904992,-0.260217,-0.336566,1.274453,-0.137904,-0.579959,
+ -0.736772,-0.170063,-0.654405,1.310553,-0.12345,-0.646592,
+ -0.934966,-0.354738,0,1.237741,-0.071143,-0.5,
+ -0.960468,-0.278392,0,1.262419,-0.142723,-0.5,
+ -0.904992,-0.260217,-0.336566,1.274453,-0.137904,-0.579959,
+ -0.934966,-0.354738,0,1.237741,-0.071143,-0.5,
+ -0.904992,-0.260217,-0.336566,1.274453,-0.137904,-0.579959,
+ -0.880661,-0.339398,-0.330522,1.247962,-0.0657,-0.572975,
+ -0.960468,-0.278392,0,1.262419,-0.142723,-0.5,
+ -0.977953,-0.208824,0,1.278985,-0.206245,-0.5,
+ -0.932432,-0.178414,-0.314228,1.292609,-0.201797,-0.58723,
+ -0.932432,-0.178414,-0.314228,1.292609,-0.201797,-0.58723,
+ -0.904992,-0.260217,-0.336566,1.274453,-0.137904,-0.579959,
+ -0.960468,-0.278392,0,1.262419,-0.142723,-0.5,
+ -0.660133,-0.325846,-0.676793,1.238464,0.027373,-0.624059,
+ -0.591819,-0.448047,-0.670078,1.190836,0.100363,-0.619965,
+ -0.769835,-0.555714,-0.313903,1.171562,0.077649,-0.565436,
+ -0.769835,-0.555714,-0.313903,1.171562,0.077649,-0.565436,
+ -0.841533,-0.433873,-0.321832,1.213533,0.008318,-0.567669,
+ -0.660133,-0.325846,-0.676793,1.238464,0.027373,-0.624059,
+ -0.831075,-0.55616,0,1.165137,0.070077,-0.5,
+ -0.896641,-0.442758,0,1.205222,0.001966,-0.5,
+ -0.841533,-0.433873,-0.321832,1.213533,0.008318,-0.567669,
+ -0.831075,-0.55616,0,1.165137,0.070077,-0.5,
+ -0.841533,-0.433873,-0.321832,1.213533,0.008318,-0.567669,
+ -0.769835,-0.555714,-0.313903,1.171562,0.077649,-0.565436,
+ -0.896641,-0.442758,0,1.205222,0.001966,-0.5,
+ -0.934966,-0.354738,0,1.237741,-0.071143,-0.5,
+ -0.880661,-0.339398,-0.330522,1.247962,-0.0657,-0.572975,
+ -0.880661,-0.339398,-0.330522,1.247962,-0.0657,-0.572975,
+ -0.841533,-0.433873,-0.321832,1.213533,0.008318,-0.567669,
+ -0.896641,-0.442758,0,1.205222,0.001966,-0.5,
+ -0.841533,-0.433873,-0.321832,1.213533,0.008318,-0.567669,
+ -0.880661,-0.339398,-0.330522,1.247962,-0.0657,-0.572975,
+ -0.691037,-0.22774,-0.686005,1.278626,-0.049369,-0.633787,
+ -0.691037,-0.22774,-0.686005,1.278626,-0.049369,-0.633787,
+ -0.660133,-0.325846,-0.676793,1.238464,0.027373,-0.624059,
+ -0.841533,-0.433873,-0.321832,1.213533,0.008318,-0.567669,
+ -0.769835,-0.555714,0.313903,1.171562,0.077649,-0.434564,
+ -0.591819,-0.448047,0.670078,1.190836,0.100363,-0.380035,
+ -0.660133,-0.325846,0.676793,1.238464,0.027373,-0.375941,
+ -0.660133,-0.325846,0.676793,1.238464,0.027373,-0.375941,
+ -0.841533,-0.433873,0.321832,1.213533,0.008318,-0.432331,
+ -0.769835,-0.555714,0.313903,1.171562,0.077649,-0.434564,
+ -0.841533,-0.433873,0.321832,1.213533,0.008318,-0.432331,
+ -0.660133,-0.325846,0.676793,1.238464,0.027373,-0.375941,
+ -0.691037,-0.22774,0.686005,1.278626,-0.049369,-0.366213,
+ -0.691037,-0.22774,0.686005,1.278626,-0.049369,-0.366213,
+ -0.880661,-0.339398,0.330522,1.247962,-0.0657,-0.427025,
+ -0.841533,-0.433873,0.321832,1.213533,0.008318,-0.432331,
+ -0.880661,-0.339398,0.330522,1.247962,-0.0657,-0.427025,
+ -0.934966,-0.354738,0,1.237741,-0.071143,-0.5,
+ -0.896641,-0.442758,0,1.205222,0.001966,-0.5,
+ -0.896641,-0.442758,0,1.205222,0.001966,-0.5,
+ -0.841533,-0.433873,0.321832,1.213533,0.008318,-0.432331,
+ -0.880661,-0.339398,0.330522,1.247962,-0.0657,-0.427025,
+ -0.831075,-0.55616,0,1.165137,0.070077,-0.5,
+ -0.769835,-0.555714,0.313903,1.171562,0.077649,-0.434564,
+ -0.841533,-0.433873,0.321832,1.213533,0.008318,-0.432331,
+ -0.831075,-0.55616,0,1.165137,0.070077,-0.5,
+ -0.841533,-0.433873,0.321832,1.213533,0.008318,-0.432331,
+ -0.896641,-0.442758,0,1.205222,0.001966,-0.5,
+ -0.693597,-0.068529,0.717096,1.333479,-0.188456,-0.340079,
+ -0.932432,-0.178414,0.314228,1.292609,-0.201797,-0.41277,
+ -0.904992,-0.260217,0.336566,1.274453,-0.137904,-0.420041,
+ -0.693597,-0.068529,0.717096,1.333479,-0.188456,-0.340079,
+ -0.904992,-0.260217,0.336566,1.274453,-0.137904,-0.420041,
+ -0.736772,-0.170063,0.654405,1.310553,-0.12345,-0.353408,
+ -0.932432,-0.178414,0.314228,1.292609,-0.201797,-0.41277,
+ -0.977953,-0.208824,0,1.278985,-0.206245,-0.5,
+ -0.960468,-0.278392,0,1.262419,-0.142723,-0.5,
+ -0.960468,-0.278392,0,1.262419,-0.142723,-0.5,
+ -0.904992,-0.260217,0.336566,1.274453,-0.137904,-0.420041,
+ -0.932432,-0.178414,0.314228,1.292609,-0.201797,-0.41277,
+ -0.934966,-0.354738,0,1.237741,-0.071143,-0.5,
+ -0.880661,-0.339398,0.330522,1.247962,-0.0657,-0.427025,
+ -0.904992,-0.260217,0.336566,1.274453,-0.137904,-0.420041,
+ -0.934966,-0.354738,0,1.237741,-0.071143,-0.5,
+ -0.904992,-0.260217,0.336566,1.274453,-0.137904,-0.420041,
+ -0.960468,-0.278392,0,1.262419,-0.142723,-0.5,
+ -0.880661,-0.339398,0.330522,1.247962,-0.0657,-0.427025,
+ -0.691037,-0.22774,0.686005,1.278626,-0.049369,-0.366213,
+ -0.736772,-0.170063,0.654405,1.310553,-0.12345,-0.353408,
+ -0.736772,-0.170063,0.654405,1.310553,-0.12345,-0.353408,
+ -0.904992,-0.260217,0.336566,1.274453,-0.137904,-0.420041,
+ -0.880661,-0.339398,0.330522,1.247962,-0.0657,-0.427025,
+ -0.693597,-0.068529,0.717096,1.333479,-0.188456,-0.340079,
+ -0.736772,-0.170063,0.654405,1.310553,-0.12345,-0.353408,
+ -0.410607,0.007113,0.911785,1.370721,-0.099359,-0.313428,
+ -0.693597,-0.068529,0.717096,1.333479,-0.188456,-0.340079,
+ -0.410607,0.007113,0.911785,1.370721,-0.099359,-0.313428,
+ -0.356933,0.09138,0.92965,1.401596,-0.166219,-0.296464,
+ -0.691037,-0.22774,0.686005,1.278626,-0.049369,-0.366213,
+ -0.411811,-0.074302,0.908235,1.329732,-0.022152,-0.329726,
+ -0.410607,0.007113,0.911785,1.370721,-0.099359,-0.313428,
+ -0.691037,-0.22774,0.686005,1.278626,-0.049369,-0.366213,
+ -0.410607,0.007113,0.911785,1.370721,-0.099359,-0.313428,
+ -0.736772,-0.170063,0.654405,1.310553,-0.12345,-0.353408,
+ -0.094492,0.118807,0.988411,1.39106,0.010509,-0.317564,
+ -0.076935,0.189453,0.978871,1.442923,-0.07045,-0.300102,
+ -0.410607,0.007113,0.911785,1.370721,-0.099359,-0.313428,
+ -0.094492,0.118807,0.988411,1.39106,0.010509,-0.317564,
+ -0.410607,0.007113,0.911785,1.370721,-0.099359,-0.313428,
+ -0.411811,-0.074302,0.908235,1.329732,-0.022152,-0.329726,
+ -0.076935,0.189453,0.978871,1.442923,-0.07045,-0.300102,
+ -0.07755,0.232519,0.969495,1.483337,-0.139536,-0.281926,
+ -0.356933,0.09138,0.92965,1.401596,-0.166219,-0.296464,
+ -0.356933,0.09138,0.92965,1.401596,-0.166219,-0.296464,
+ -0.410607,0.007113,0.911785,1.370721,-0.099359,-0.313428,
+ -0.076935,0.189453,0.978871,1.442923,-0.07045,-0.300102,
+ -0.591819,-0.448047,0.670078,1.190836,0.100363,-0.380035,
+ -0.293197,-0.238286,0.925881,1.22296,0.138221,-0.347317,
+ -0.356146,-0.13643,0.924417,1.280017,0.059132,-0.342106,
+ -0.591819,-0.448047,0.670078,1.190836,0.100363,-0.380035,
+ -0.356146,-0.13643,0.924417,1.280017,0.059132,-0.342106,
+ -0.660133,-0.325846,0.676793,1.238464,0.027373,-0.375941,
+ -0.293197,-0.238286,0.925881,1.22296,0.138221,-0.347317,
+ 0.003001,-0.001255,0.999995,1.261509,0.18365,-0.336411,
+ -0.080719,0.04088,0.995898,1.329879,0.097243,-0.330828,
+ -0.080719,0.04088,0.995898,1.329879,0.097243,-0.330828,
+ -0.356146,-0.13643,0.924417,1.280017,0.059132,-0.342106,
+ -0.293197,-0.238286,0.925881,1.22296,0.138221,-0.347317,
+ -0.094492,0.118807,0.988411,1.39106,0.010509,-0.317564,
+ -0.411811,-0.074302,0.908235,1.329732,-0.022152,-0.329726,
+ -0.356146,-0.13643,0.924417,1.280017,0.059132,-0.342106,
+ -0.094492,0.118807,0.988411,1.39106,0.010509,-0.317564,
+ -0.356146,-0.13643,0.924417,1.280017,0.059132,-0.342106,
+ -0.080719,0.04088,0.995898,1.329879,0.097243,-0.330828,
+ -0.411811,-0.074302,0.908235,1.329732,-0.022152,-0.329726,
+ -0.691037,-0.22774,0.686005,1.278626,-0.049369,-0.366213,
+ -0.660133,-0.325846,0.676793,1.238464,0.027373,-0.375941,
+ -0.660133,-0.325846,0.676793,1.238464,0.027373,-0.375941,
+ -0.356146,-0.13643,0.924417,1.280017,0.059132,-0.342106,
+ -0.411811,-0.074302,0.908235,1.329732,-0.022152,-0.329726,
+ 0.284277,0.249093,0.925818,1.300058,0.22908,-0.347317,
+ 0.547232,0.498931,0.672016,1.332183,0.266938,-0.380035,
+ 0.509286,0.493808,0.704828,1.421294,0.167113,-0.375941,
+ 0.509286,0.493808,0.704828,1.421294,0.167113,-0.375941,
+ 0.192478,0.250599,0.948763,1.379742,0.135354,-0.342106,
+ 0.284277,0.249093,0.925818,1.300058,0.22908,-0.347317,
+ 0.509286,0.493808,0.704828,1.421294,0.167113,-0.375941,
+ 0.522827,0.522069,0.673866,1.503495,0.070388,-0.366213,
+ 0.227361,0.327503,0.917087,1.452388,0.04317,-0.329726,
+ 0.227361,0.327503,0.917087,1.452388,0.04317,-0.329726,
+ 0.192478,0.250599,0.948763,1.379742,0.135354,-0.342106,
+ 0.509286,0.493808,0.704828,1.421294,0.167113,-0.375941,
+ -0.094492,0.118807,0.988411,1.39106,0.010509,-0.317564,
+ -0.080719,0.04088,0.995898,1.329879,0.097243,-0.330828,
+ 0.192478,0.250599,0.948763,1.379742,0.135354,-0.342106,
+ -0.094492,0.118807,0.988411,1.39106,0.010509,-0.317564,
+ 0.192478,0.250599,0.948763,1.379742,0.135354,-0.342106,
+ 0.227361,0.327503,0.917087,1.452388,0.04317,-0.329726,
+ 0.003001,-0.001255,0.999995,1.261509,0.18365,-0.336411,
+ 0.284277,0.249093,0.925818,1.300058,0.22908,-0.347317,
+ 0.192478,0.250599,0.948763,1.379742,0.135354,-0.342106,
+ 0.003001,-0.001255,0.999995,1.261509,0.18365,-0.336411,
+ 0.192478,0.250599,0.948763,1.379742,0.135354,-0.342106,
+ -0.080719,0.04088,0.995898,1.329879,0.097243,-0.330828,
+ 0.523007,0.53259,0.665441,1.575292,-0.017451,-0.353408,
+ 0.523401,0.54123,0.65812,1.633195,-0.090616,-0.340079,
+ 0.223762,0.384639,0.895535,1.565078,-0.112852,-0.296464,
+ 0.223762,0.384639,0.895535,1.565078,-0.112852,-0.296464,
+ 0.22394,0.359067,0.906047,1.515124,-0.041541,-0.313428,
+ 0.523007,0.53259,0.665441,1.575292,-0.017451,-0.353408,
+ -0.07755,0.232519,0.969495,1.483337,-0.139536,-0.281926,
+ -0.076935,0.189453,0.978871,1.442923,-0.07045,-0.300102,
+ 0.22394,0.359067,0.906047,1.515124,-0.041541,-0.313428,
+ -0.07755,0.232519,0.969495,1.483337,-0.139536,-0.281926,
+ 0.22394,0.359067,0.906047,1.515124,-0.041541,-0.313428,
+ 0.223762,0.384639,0.895535,1.565078,-0.112852,-0.296464,
+ -0.076935,0.189453,0.978871,1.442923,-0.07045,-0.300102,
+ -0.094492,0.118807,0.988411,1.39106,0.010509,-0.317564,
+ 0.227361,0.327503,0.917087,1.452388,0.04317,-0.329726,
+ 0.227361,0.327503,0.917087,1.452388,0.04317,-0.329726,
+ 0.22394,0.359067,0.906047,1.515124,-0.041541,-0.313428,
+ -0.076935,0.189453,0.978871,1.442923,-0.07045,-0.300102,
+ 0.522827,0.522069,0.673866,1.503495,0.070388,-0.366213,
+ 0.523007,0.53259,0.665441,1.575292,-0.017451,-0.353408,
+ 0.22394,0.359067,0.906047,1.515124,-0.041541,-0.313428,
+ 0.522827,0.522069,0.673866,1.503495,0.070388,-0.366213,
+ 0.22394,0.359067,0.906047,1.515124,-0.041541,-0.313428,
+ 0.227361,0.327503,0.917087,1.452388,0.04317,-0.329726,
+ 0.709684,0.62897,0.317403,1.674065,-0.077274,-0.41277,
+ 0.523401,0.54123,0.65812,1.633195,-0.090616,-0.340079,
+ 0.523007,0.53259,0.665441,1.575292,-0.017451,-0.353408,
+ 0.523007,0.53259,0.665441,1.575292,-0.017451,-0.353408,
+ 0.706952,0.630412,0.320624,1.611392,-0.002996,-0.420041,
+ 0.709684,0.62897,0.317403,1.674065,-0.077274,-0.41277,
+ 0.522827,0.522069,0.673866,1.503495,0.070388,-0.366213,
+ 0.703,0.633573,0.323073,1.534158,0.086718,-0.427025,
+ 0.706952,0.630412,0.320624,1.611392,-0.002996,-0.420041,
+ 0.522827,0.522069,0.673866,1.503495,0.070388,-0.366213,
+ 0.706952,0.630412,0.320624,1.611392,-0.002996,-0.420041,
+ 0.523007,0.53259,0.665441,1.575292,-0.017451,-0.353408,
+ 0.703,0.633573,0.323073,1.534158,0.086718,-0.427025,
+ 0.747578,0.664174,0,1.54438,0.092162,-0.5,
+ 0.754132,0.656723,0,1.623426,0.001822,-0.5,
+ 0.754132,0.656723,0,1.623426,0.001822,-0.5,
+ 0.706952,0.630412,0.320624,1.611392,-0.002996,-0.420041,
+ 0.703,0.633573,0.323073,1.534158,0.086718,-0.427025,
+ 0.758437,0.651747,0,1.687689,-0.072827,-0.5,
+ 0.709684,0.62897,0.317403,1.674065,-0.077274,-0.41277,
+ 0.706952,0.630412,0.320624,1.611392,-0.002996,-0.420041,
+ 0.758437,0.651747,0,1.687689,-0.072827,-0.5,
+ 0.706952,0.630412,0.320624,1.611392,-0.002996,-0.420041,
+ 0.754132,0.656723,0,1.623426,0.001822,-0.5,
+ 0.547232,0.498931,0.672016,1.332183,0.266938,-0.380035,
+ 0.694102,0.647395,0.314805,1.351457,0.289652,-0.434564,
+ 0.698693,0.638817,0.32209,1.446226,0.186168,-0.432331,
+ 0.547232,0.498931,0.672016,1.332183,0.266938,-0.380035,
+ 0.698693,0.638817,0.32209,1.446226,0.186168,-0.432331,
+ 0.509286,0.493808,0.704828,1.421294,0.167113,-0.375941,
+ 0.694102,0.647395,0.314805,1.351457,0.289652,-0.434564,
+ 0.726158,0.687528,0,1.357882,0.297224,-0.5,
+ 0.738573,0.674173,0,1.454536,0.19252,-0.5,
+ 0.738573,0.674173,0,1.454536,0.19252,-0.5,
+ 0.698693,0.638817,0.32209,1.446226,0.186168,-0.432331,
+ 0.694102,0.647395,0.314805,1.351457,0.289652,-0.434564,
+ 0.747578,0.664174,0,1.54438,0.092162,-0.5,
+ 0.703,0.633573,0.323073,1.534158,0.086718,-0.427025,
+ 0.698693,0.638817,0.32209,1.446226,0.186168,-0.432331,
+ 0.747578,0.664174,0,1.54438,0.092162,-0.5,
+ 0.698693,0.638817,0.32209,1.446226,0.186168,-0.432331,
+ 0.738573,0.674173,0,1.454536,0.19252,-0.5,
+ 0.703,0.633573,0.323073,1.534158,0.086718,-0.427025,
+ 0.522827,0.522069,0.673866,1.503495,0.070388,-0.366213,
+ 0.509286,0.493808,0.704828,1.421294,0.167113,-0.375941,
+ 0.509286,0.493808,0.704828,1.421294,0.167113,-0.375941,
+ 0.698693,0.638817,0.32209,1.446226,0.186168,-0.432331,
+ 0.703,0.633573,0.323073,1.534158,0.086718,-0.427025,
+ 0.547232,0.498931,-0.672015,1.332183,0.266938,-0.619965,
+ 0.509286,0.493808,-0.704828,1.421294,0.167113,-0.624059,
+ 0.698693,0.638817,-0.32209,1.446226,0.186168,-0.567669,
+ 0.547232,0.498931,-0.672015,1.332183,0.266938,-0.619965,
+ 0.698693,0.638817,-0.32209,1.446226,0.186168,-0.567669,
+ 0.694102,0.647395,-0.314805,1.351457,0.289652,-0.565436,
+ 0.509286,0.493808,-0.704828,1.421294,0.167113,-0.624059,
+ 0.522827,0.522069,-0.673866,1.503495,0.070388,-0.633787,
+ 0.703,0.633573,-0.323073,1.534158,0.086718,-0.572975,
+ 0.703,0.633573,-0.323073,1.534158,0.086718,-0.572975,
+ 0.698693,0.638817,-0.32209,1.446226,0.186168,-0.567669,
+ 0.509286,0.493808,-0.704828,1.421294,0.167113,-0.624059,
+ 0.747578,0.664174,0,1.54438,0.092162,-0.5,
+ 0.738573,0.674173,0,1.454536,0.19252,-0.5,
+ 0.698693,0.638817,-0.32209,1.446226,0.186168,-0.567669,
+ 0.747578,0.664174,0,1.54438,0.092162,-0.5,
+ 0.698693,0.638817,-0.32209,1.446226,0.186168,-0.567669,
+ 0.703,0.633573,-0.323073,1.534158,0.086718,-0.572975,
+ 0.738573,0.674173,0,1.454536,0.19252,-0.5,
+ 0.726158,0.687528,0,1.357882,0.297224,-0.5,
+ 0.694102,0.647395,-0.314805,1.351457,0.289652,-0.565436,
+ 0.694102,0.647395,-0.314805,1.351457,0.289652,-0.565436,
+ 0.698693,0.638817,-0.32209,1.446226,0.186168,-0.567669,
+ 0.738573,0.674173,0,1.454536,0.19252,-0.5,
+ 0.523007,0.53259,-0.665441,1.575292,-0.017451,-0.646592,
+ 0.523401,0.54123,-0.65812,1.633195,-0.090616,-0.659921,
+ 0.709684,0.62897,-0.317403,1.674065,-0.077274,-0.58723,
+ 0.709684,0.62897,-0.317403,1.674065,-0.077274,-0.58723,
+ 0.706952,0.630412,-0.320624,1.611392,-0.002996,-0.579959,
+ 0.523007,0.53259,-0.665441,1.575292,-0.017451,-0.646592,
+ 0.758437,0.651747,0,1.687689,-0.072827,-0.5,
+ 0.754132,0.656723,0,1.623426,0.001822,-0.5,
+ 0.706952,0.630412,-0.320624,1.611392,-0.002996,-0.579959,
+ 0.758437,0.651747,0,1.687689,-0.072827,-0.5,
+ 0.706952,0.630412,-0.320624,1.611392,-0.002996,-0.579959,
+ 0.709684,0.62897,-0.317403,1.674065,-0.077274,-0.58723,
+ 0.754132,0.656723,0,1.623426,0.001822,-0.5,
+ 0.747578,0.664174,0,1.54438,0.092162,-0.5,
+ 0.703,0.633573,-0.323073,1.534158,0.086718,-0.572975,
+ 0.703,0.633573,-0.323073,1.534158,0.086718,-0.572975,
+ 0.706952,0.630412,-0.320624,1.611392,-0.002996,-0.579959,
+ 0.754132,0.656723,0,1.623426,0.001822,-0.5,
+ 0.522827,0.522069,-0.673866,1.503495,0.070388,-0.633787,
+ 0.523007,0.53259,-0.665441,1.575292,-0.017451,-0.646592,
+ 0.706952,0.630412,-0.320624,1.611392,-0.002996,-0.579959,
+ 0.522827,0.522069,-0.673866,1.503495,0.070388,-0.633787,
+ 0.706952,0.630412,-0.320624,1.611392,-0.002996,-0.579959,
+ 0.703,0.633573,-0.323073,1.534158,0.086718,-0.572975,
+ 0.523401,0.54123,0.65812,1.633195,-0.090616,-0.340079,
+ 0.709684,0.62897,0.317403,1.674065,-0.077274,-0.41277,
+ 0.765571,0.555064,0.325277,1.718314,-0.130413,-0.406608,
+ 0.523401,0.54123,0.65812,1.633195,-0.090616,-0.340079,
+ 0.765571,0.555064,0.325277,1.718314,-0.130413,-0.406608,
+ 0.58545,0.437052,0.682813,1.673712,-0.14332,-0.328782,
+ 0.709684,0.62897,0.317403,1.674065,-0.077274,-0.41277,
+ 0.758437,0.651747,0,1.687689,-0.072827,-0.5,
+ 0.798106,0.602517,0,1.733181,-0.12611,-0.5,
+ 0.798106,0.602517,0,1.733181,-0.12611,-0.5,
+ 0.765571,0.555064,0.325277,1.718314,-0.130413,-0.406608,
+ 0.709684,0.62897,0.317403,1.674065,-0.077274,-0.41277,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.911574,0.083749,0.402517,1.73961,-0.167898,-0.405277,
+ 0.765571,0.555064,0.325277,1.718314,-0.130413,-0.406608,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.765571,0.555064,0.325277,1.718314,-0.130413,-0.406608,
+ 0.798106,0.602517,0,1.733181,-0.12611,-0.5,
+ 0.911574,0.083749,0.402517,1.73961,-0.167898,-0.405277,
+ 0.722198,-0.015351,0.691516,1.693578,-0.180157,-0.326227,
+ 0.58545,0.437052,0.682813,1.673712,-0.14332,-0.328782,
+ 0.58545,0.437052,0.682813,1.673712,-0.14332,-0.328782,
+ 0.765571,0.555064,0.325277,1.718314,-0.130413,-0.406608,
+ 0.911574,0.083749,0.402517,1.73961,-0.167898,-0.405277,
+ 0.523401,0.54123,-0.65812,1.633195,-0.090616,-0.659921,
+ 0.58545,0.437052,-0.682813,1.673712,-0.14332,-0.671218,
+ 0.765571,0.555064,-0.325277,1.718314,-0.130413,-0.593392,
+ 0.523401,0.54123,-0.65812,1.633195,-0.090616,-0.659921,
+ 0.765571,0.555064,-0.325277,1.718314,-0.130413,-0.593392,
+ 0.709684,0.62897,-0.317403,1.674065,-0.077274,-0.58723,
+ 0.58545,0.437052,-0.682813,1.673712,-0.14332,-0.671218,
+ 0.722198,-0.015351,-0.691516,1.693578,-0.180157,-0.673773,
+ 0.911574,0.083749,-0.402516,1.73961,-0.167898,-0.594723,
+ 0.911574,0.083749,-0.402516,1.73961,-0.167898,-0.594723,
+ 0.765571,0.555064,-0.325277,1.718314,-0.130413,-0.593392,
+ 0.58545,0.437052,-0.682813,1.673712,-0.14332,-0.671218,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.798106,0.602517,0,1.733181,-0.12611,-0.5,
+ 0.765571,0.555064,-0.325277,1.718314,-0.130413,-0.593392,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.765571,0.555064,-0.325277,1.718314,-0.130413,-0.593392,
+ 0.911574,0.083749,-0.402516,1.73961,-0.167898,-0.594723,
+ 0.798106,0.602517,0,1.733181,-0.12611,-0.5,
+ 0.758437,0.651747,0,1.687689,-0.072827,-0.5,
+ 0.709684,0.62897,-0.317403,1.674065,-0.077274,-0.58723,
+ 0.709684,0.62897,-0.317403,1.674065,-0.077274,-0.58723,
+ 0.765571,0.555064,-0.325277,1.718314,-0.130413,-0.593392,
+ 0.798106,0.602517,0,1.733181,-0.12611,-0.5,
+ 0.442953,-0.878385,-0.179534,1.670754,-0.221475,-0.638667,
+ 0.43479,-0.894931,-0.100277,1.696988,-0.219088,-0.5825,
+ 0.746757,-0.63494,-0.198004,1.733426,-0.195216,-0.5875,
+ 0.442953,-0.878385,-0.179534,1.670754,-0.221475,-0.638667,
+ 0.746757,-0.63494,-0.198004,1.733426,-0.195216,-0.5875,
+ 0.633983,-0.622541,-0.458813,1.689524,-0.205721,-0.660875,
+ 0.487185,-0.873299,0,1.710058,-0.217878,-0.5,
+ 0.821423,-0.57032,0,1.748713,-0.192378,-0.5,
+ 0.746757,-0.63494,-0.198004,1.733426,-0.195216,-0.5875,
+ 0.487185,-0.873299,0,1.710058,-0.217878,-0.5,
+ 0.746757,-0.63494,-0.198004,1.733426,-0.195216,-0.5875,
+ 0.43479,-0.894931,-0.100277,1.696988,-0.219088,-0.5825,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.911574,0.083749,-0.402516,1.73961,-0.167898,-0.594723,
+ 0.746757,-0.63494,-0.198004,1.733426,-0.195216,-0.5875,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.746757,-0.63494,-0.198004,1.733426,-0.195216,-0.5875,
+ 0.821423,-0.57032,0,1.748713,-0.192378,-0.5,
+ 0.911574,0.083749,-0.402516,1.73961,-0.167898,-0.594723,
+ 0.722198,-0.015351,-0.691516,1.693578,-0.180157,-0.673773,
+ 0.633983,-0.622541,-0.458813,1.689524,-0.205721,-0.660875,
+ 0.633983,-0.622541,-0.458813,1.689524,-0.205721,-0.660875,
+ 0.746757,-0.63494,-0.198004,1.733426,-0.195216,-0.5875,
+ 0.911574,0.083749,-0.402516,1.73961,-0.167898,-0.594723,
+ 0.442953,-0.878385,0.179534,1.670754,-0.221475,-0.361333,
+ 0.633983,-0.62254,0.458813,1.689524,-0.205721,-0.339125,
+ 0.746757,-0.63494,0.198005,1.733426,-0.195216,-0.4125,
+ 0.442953,-0.878385,0.179534,1.670754,-0.221475,-0.361333,
+ 0.746757,-0.63494,0.198005,1.733426,-0.195216,-0.4125,
+ 0.43479,-0.894931,0.100278,1.696988,-0.219088,-0.4175,
+ 0.633983,-0.62254,0.458813,1.689524,-0.205721,-0.339125,
+ 0.722198,-0.015351,0.691516,1.693578,-0.180157,-0.326227,
+ 0.911574,0.083749,0.402517,1.73961,-0.167898,-0.405277,
+ 0.911574,0.083749,0.402517,1.73961,-0.167898,-0.405277,
+ 0.746757,-0.63494,0.198005,1.733426,-0.195216,-0.4125,
+ 0.633983,-0.62254,0.458813,1.689524,-0.205721,-0.339125,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.821423,-0.57032,0,1.748713,-0.192378,-0.5,
+ 0.746757,-0.63494,0.198005,1.733426,-0.195216,-0.4125,
+ 0.990091,0.14043,0,1.755118,-0.163978,-0.5,
+ 0.746757,-0.63494,0.198005,1.733426,-0.195216,-0.4125,
+ 0.911574,0.083749,0.402517,1.73961,-0.167898,-0.405277,
+ 0.487185,-0.873299,0,1.710058,-0.217878,-0.5,
+ 0.43479,-0.894931,0.100278,1.696988,-0.219088,-0.4175,
+ 0.746757,-0.63494,0.198005,1.733426,-0.195216,-0.4125,
+ 0.487185,-0.873299,0,1.710058,-0.217878,-0.5,
+ 0.746757,-0.63494,0.198005,1.733426,-0.195216,-0.4125,
+ 0.821423,-0.57032,0,1.748713,-0.192378,-0.5,
+ 0.523401,0.54123,-0.65812,1.633195,-0.090616,-0.659921,
+ 0.223762,0.38464,-0.895535,1.565078,-0.112852,-0.703536,
+ 0.256589,0.31723,-0.912977,1.599377,-0.164832,-0.717914,
+ 0.523401,0.54123,-0.65812,1.633195,-0.090616,-0.659921,
+ 0.256589,0.31723,-0.912977,1.599377,-0.164832,-0.717914,
+ 0.58545,0.437052,-0.682813,1.673712,-0.14332,-0.671218,
+ 0.223762,0.38464,-0.895535,1.565078,-0.112852,-0.703536,
+ -0.07755,0.232519,-0.969495,1.483337,-0.139536,-0.718074,
+ -0.053569,0.174234,-0.983246,1.510174,-0.190646,-0.73348,
+ -0.053569,0.174234,-0.983246,1.510174,-0.190646,-0.73348,
+ 0.256589,0.31723,-0.912977,1.599377,-0.164832,-0.717914,
+ 0.223762,0.38464,-0.895535,1.565078,-0.112852,-0.703536,
+ 0.100693,-0.274502,-0.9563,1.526344,-0.226473,-0.737495,
+ 0.442231,-0.107524,-0.890433,1.617509,-0.201252,-0.721479,
+ 0.256589,0.31723,-0.912977,1.599377,-0.164832,-0.717914,
+ 0.100693,-0.274502,-0.9563,1.526344,-0.226473,-0.737495,
+ 0.256589,0.31723,-0.912977,1.599377,-0.164832,-0.717914,
+ -0.053569,0.174234,-0.983246,1.510174,-0.190646,-0.73348,
+ 0.442231,-0.107524,-0.890433,1.617509,-0.201252,-0.721479,
+ 0.722198,-0.015351,-0.691516,1.693578,-0.180157,-0.673773,
+ 0.58545,0.437052,-0.682813,1.673712,-0.14332,-0.671218,
+ 0.58545,0.437052,-0.682813,1.673712,-0.14332,-0.671218,
+ 0.256589,0.31723,-0.912977,1.599377,-0.164832,-0.717914,
+ 0.442231,-0.107524,-0.890433,1.617509,-0.201252,-0.721479,
+ -0.693597,-0.068529,-0.717096,1.333479,-0.188456,-0.659921,
+ -0.738864,-0.111606,-0.664548,1.346635,-0.237972,-0.671218,
+ -0.39719,0.033721,-0.917117,1.420971,-0.21646,-0.717914,
+ -0.693597,-0.068529,-0.717096,1.333479,-0.188456,-0.659921,
+ -0.39719,0.033721,-0.917117,1.420971,-0.21646,-0.717914,
+ -0.356933,0.09138,-0.92965,1.401596,-0.166219,-0.703536,
+ -0.588534,-0.475384,-0.653941,1.358796,-0.271614,-0.673773,
+ -0.236076,-0.378114,-0.895152,1.435022,-0.251106,-0.721479,
+ -0.39719,0.033721,-0.917117,1.420971,-0.21646,-0.717914,
+ -0.588534,-0.475384,-0.653941,1.358796,-0.271614,-0.673773,
+ -0.39719,0.033721,-0.917117,1.420971,-0.21646,-0.717914,
+ -0.738864,-0.111606,-0.664548,1.346635,-0.237972,-0.671218,
+ -0.236076,-0.378114,-0.895152,1.435022,-0.251106,-0.721479,
+ 0.100693,-0.274502,-0.9563,1.526344,-0.226473,-0.737495,
+ -0.053569,0.174234,-0.983246,1.510174,-0.190646,-0.73348,
+ -0.053569,0.174234,-0.983246,1.510174,-0.190646,-0.73348,
+ -0.39719,0.033721,-0.917117,1.420971,-0.21646,-0.717914,
+ -0.236076,-0.378114,-0.895152,1.435022,-0.251106,-0.721479,
+ -0.07755,0.232519,-0.969495,1.483337,-0.139536,-0.718074,
+ -0.356933,0.09138,-0.92965,1.401596,-0.166219,-0.703536,
+ -0.39719,0.033721,-0.917117,1.420971,-0.21646,-0.717914,
+ -0.07755,0.232519,-0.969495,1.483337,-0.139536,-0.718074,
+ -0.39719,0.033721,-0.917117,1.420971,-0.21646,-0.717914,
+ -0.053569,0.174234,-0.983246,1.510174,-0.190646,-0.73348,
+ 0.055786,-0.978343,-0.199329,1.40287,-0.293254,-0.638667,
+ 0.155998,-0.969633,-0.18835,1.458284,-0.283049,-0.664625,
+ 0.03573,-0.852716,-0.521152,1.449927,-0.271179,-0.706,
+ 0.055786,-0.978343,-0.199329,1.40287,-0.293254,-0.638667,
+ 0.03573,-0.852716,-0.521152,1.449927,-0.271179,-0.706,
+ -0.175453,-0.874143,-0.452869,1.378738,-0.288996,-0.660875,
+ 0.25096,-0.936595,-0.244557,1.538546,-0.263835,-0.677562,
+ 0.205519,-0.76511,-0.61022,1.53476,-0.249706,-0.7215,
+ 0.03573,-0.852716,-0.521152,1.449927,-0.271179,-0.706,
+ 0.25096,-0.936595,-0.244557,1.538546,-0.263835,-0.677562,
+ 0.03573,-0.852716,-0.521152,1.449927,-0.271179,-0.706,
+ 0.155998,-0.969633,-0.18835,1.458284,-0.283049,-0.664625,
+ 0.100693,-0.274502,-0.9563,1.526344,-0.226473,-0.737495,
+ -0.236076,-0.378114,-0.895152,1.435022,-0.251106,-0.721479,
+ 0.03573,-0.852716,-0.521152,1.449927,-0.271179,-0.706,
+ 0.100693,-0.274502,-0.9563,1.526344,-0.226473,-0.737495,
+ 0.03573,-0.852716,-0.521152,1.449927,-0.271179,-0.706,
+ 0.205519,-0.76511,-0.61022,1.53476,-0.249706,-0.7215,
+ -0.236076,-0.378114,-0.895152,1.435022,-0.251106,-0.721479,
+ -0.588534,-0.475384,-0.653941,1.358796,-0.271614,-0.673773,
+ -0.175453,-0.874143,-0.452869,1.378738,-0.288996,-0.660875,
+ -0.175453,-0.874143,-0.452869,1.378738,-0.288996,-0.660875,
+ 0.03573,-0.852716,-0.521152,1.449927,-0.271179,-0.706,
+ -0.236076,-0.378114,-0.895152,1.435022,-0.251106,-0.721479,
+ 0.361333,-0.91087,-0.199385,1.617662,-0.240344,-0.664625,
+ 0.442953,-0.878385,-0.179534,1.670754,-0.221475,-0.638667,
+ 0.633983,-0.622541,-0.458813,1.689524,-0.205721,-0.660875,
+ 0.633983,-0.622541,-0.458813,1.689524,-0.205721,-0.660875,
+ 0.389599,-0.715498,-0.579893,1.618964,-0.225886,-0.706,
+ 0.361333,-0.91087,-0.199385,1.617662,-0.240344,-0.664625,
+ 0.633983,-0.622541,-0.458813,1.689524,-0.205721,-0.660875,
+ 0.722198,-0.015351,-0.691516,1.693578,-0.180157,-0.673773,
+ 0.442231,-0.107524,-0.890433,1.617509,-0.201252,-0.721479,
+ 0.442231,-0.107524,-0.890433,1.617509,-0.201252,-0.721479,
+ 0.389599,-0.715498,-0.579893,1.618964,-0.225886,-0.706,
+ 0.633983,-0.622541,-0.458813,1.689524,-0.205721,-0.660875,
+ 0.100693,-0.274502,-0.9563,1.526344,-0.226473,-0.737495,
+ 0.205519,-0.76511,-0.61022,1.53476,-0.249706,-0.7215,
+ 0.389599,-0.715498,-0.579893,1.618964,-0.225886,-0.706,
+ 0.100693,-0.274502,-0.9563,1.526344,-0.226473,-0.737495,
+ 0.389599,-0.715498,-0.579893,1.618964,-0.225886,-0.706,
+ 0.442231,-0.107524,-0.890433,1.617509,-0.201252,-0.721479,
+ 0.25096,-0.936595,-0.244557,1.538546,-0.263835,-0.677562,
+ 0.361333,-0.91087,-0.199385,1.617662,-0.240344,-0.664625,
+ 0.389599,-0.715498,-0.579893,1.618964,-0.225886,-0.706,
+ 0.25096,-0.936595,-0.244557,1.538546,-0.263835,-0.677562,
+ 0.389599,-0.715498,-0.579893,1.618964,-0.225886,-0.706,
+ 0.205519,-0.76511,-0.61022,1.53476,-0.249706,-0.7215,
+ -0.738864,-0.111606,-0.664548,1.346635,-0.237972,-0.671218,
+ -0.693597,-0.068529,-0.717096,1.333479,-0.188456,-0.659921,
+ -0.932432,-0.178414,-0.314228,1.292609,-0.201797,-0.58723,
+ -0.932432,-0.178414,-0.314228,1.292609,-0.201797,-0.58723,
+ -0.899118,-0.21787,-0.37963,1.302034,-0.25088,-0.593392,
+ -0.738864,-0.111606,-0.664548,1.346635,-0.237972,-0.671218,
+ -0.932432,-0.178414,-0.314228,1.292609,-0.201797,-0.58723,
+ -0.977953,-0.208824,0,1.278985,-0.206245,-0.5,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ -0.899118,-0.21787,-0.37963,1.302034,-0.25088,-0.593392,
+ -0.932432,-0.178414,-0.314228,1.292609,-0.201797,-0.58723,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ -0.822459,-0.568824,0,1.297571,-0.288968,-0.5,
+ -0.77552,-0.569812,-0.271814,1.312921,-0.28446,-0.594723,
+ -0.77552,-0.569812,-0.271814,1.312921,-0.28446,-0.594723,
+ -0.899118,-0.21787,-0.37963,1.302034,-0.25088,-0.593392,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ -0.588534,-0.475384,-0.653941,1.358796,-0.271614,-0.673773,
+ -0.738864,-0.111606,-0.664548,1.346635,-0.237972,-0.671218,
+ -0.899118,-0.21787,-0.37963,1.302034,-0.25088,-0.593392,
+ -0.588534,-0.475384,-0.653941,1.358796,-0.271614,-0.673773,
+ -0.899118,-0.21787,-0.37963,1.302034,-0.25088,-0.593392,
+ -0.77552,-0.569812,-0.271814,1.312921,-0.28446,-0.594723,
+ -0.932432,-0.178414,0.314228,1.292609,-0.201797,-0.41277,
+ -0.693597,-0.068529,0.717096,1.333479,-0.188456,-0.340079,
+ -0.738864,-0.111606,0.664548,1.346635,-0.237972,-0.328782,
+ -0.738864,-0.111606,0.664548,1.346635,-0.237972,-0.328782,
+ -0.899119,-0.217869,0.37963,1.302034,-0.25088,-0.406608,
+ -0.932432,-0.178414,0.314228,1.292609,-0.201797,-0.41277,
+ -0.588534,-0.475383,0.653941,1.358796,-0.271614,-0.326227,
+ -0.775521,-0.569812,0.271814,1.312921,-0.28446,-0.405277,
+ -0.899119,-0.217869,0.37963,1.302034,-0.25088,-0.406608,
+ -0.588534,-0.475383,0.653941,1.358796,-0.271614,-0.326227,
+ -0.899119,-0.217869,0.37963,1.302034,-0.25088,-0.406608,
+ -0.738864,-0.111606,0.664548,1.346635,-0.237972,-0.328782,
+ -0.775521,-0.569812,0.271814,1.312921,-0.28446,-0.405277,
+ -0.822459,-0.568824,0,1.297571,-0.288968,-0.5,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ -0.899119,-0.217869,0.37963,1.302034,-0.25088,-0.406608,
+ -0.775521,-0.569812,0.271814,1.312921,-0.28446,-0.405277,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ -0.977953,-0.208824,0,1.278985,-0.206245,-0.5,
+ -0.932432,-0.178414,0.314228,1.292609,-0.201797,-0.41277,
+ -0.932432,-0.178414,0.314228,1.292609,-0.201797,-0.41277,
+ -0.899119,-0.217869,0.37963,1.302034,-0.25088,-0.406608,
+ -0.972456,-0.233085,0,1.287166,-0.255182,-0.5,
+ 0.055786,-0.978344,0.199328,1.40287,-0.293254,-0.361333,
+ 0.070927,-0.992428,0.100277,1.378957,-0.304305,-0.4175,
+ -0.244016,-0.944635,0.219364,1.335465,-0.301849,-0.4125,
+ 0.055786,-0.978344,0.199328,1.40287,-0.293254,-0.361333,
+ -0.244016,-0.944635,0.219364,1.335465,-0.301849,-0.4125,
+ -0.175453,-0.874143,0.452869,1.378738,-0.288996,-0.339125,
+ 0.014735,-0.999891,0,1.367033,-0.309791,-0.5,
+ -0.433457,-0.901174,0,1.320807,-0.307035,-0.5,
+ -0.244016,-0.944635,0.219364,1.335465,-0.301849,-0.4125,
+ 0.014735,-0.999891,0,1.367033,-0.309791,-0.5,
+ -0.244016,-0.944635,0.219364,1.335465,-0.301849,-0.4125,
+ 0.070927,-0.992428,0.100277,1.378957,-0.304305,-0.4175,
+ -0.433457,-0.901174,0,1.320807,-0.307035,-0.5,
+ -0.822459,-0.568824,0,1.297571,-0.288968,-0.5,
+ -0.775521,-0.569812,0.271814,1.312921,-0.28446,-0.405277,
+ -0.775521,-0.569812,0.271814,1.312921,-0.28446,-0.405277,
+ -0.244016,-0.944635,0.219364,1.335465,-0.301849,-0.4125,
+ -0.433457,-0.901174,0,1.320807,-0.307035,-0.5,
+ -0.588534,-0.475383,0.653941,1.358796,-0.271614,-0.326227,
+ -0.175453,-0.874143,0.452869,1.378738,-0.288996,-0.339125,
+ -0.244016,-0.944635,0.219364,1.335465,-0.301849,-0.4125,
+ -0.588534,-0.475383,0.653941,1.358796,-0.271614,-0.326227,
+ -0.244016,-0.944635,0.219364,1.335465,-0.301849,-0.4125,
+ -0.775521,-0.569812,0.271814,1.312921,-0.28446,-0.405277,
+ 0.055786,-0.978343,-0.199329,1.40287,-0.293254,-0.638667,
+ -0.175453,-0.874143,-0.452869,1.378738,-0.288996,-0.660875,
+ -0.244016,-0.944635,-0.219364,1.335465,-0.301849,-0.5875,
+ 0.055786,-0.978343,-0.199329,1.40287,-0.293254,-0.638667,
+ -0.244016,-0.944635,-0.219364,1.335465,-0.301849,-0.5875,
+ 0.070927,-0.992428,-0.100277,1.378957,-0.304305,-0.5825,
+ -0.588534,-0.475384,-0.653941,1.358796,-0.271614,-0.673773,
+ -0.77552,-0.569812,-0.271814,1.312921,-0.28446,-0.594723,
+ -0.244016,-0.944635,-0.219364,1.335465,-0.301849,-0.5875,
+ -0.588534,-0.475384,-0.653941,1.358796,-0.271614,-0.673773,
+ -0.244016,-0.944635,-0.219364,1.335465,-0.301849,-0.5875,
+ -0.175453,-0.874143,-0.452869,1.378738,-0.288996,-0.660875,
+ -0.77552,-0.569812,-0.271814,1.312921,-0.28446,-0.594723,
+ -0.822459,-0.568824,0,1.297571,-0.288968,-0.5,
+ -0.433457,-0.901174,0,1.320807,-0.307035,-0.5,
+ -0.433457,-0.901174,0,1.320807,-0.307035,-0.5,
+ -0.244016,-0.944635,-0.219364,1.335465,-0.301849,-0.5875,
+ -0.77552,-0.569812,-0.271814,1.312921,-0.28446,-0.594723,
+ 0.014735,-0.999891,0,1.367033,-0.309791,-0.5,
+ 0.070927,-0.992428,-0.100277,1.378957,-0.304305,-0.5825,
+ -0.244016,-0.944635,-0.219364,1.335465,-0.301849,-0.5875,
+ 0.014735,-0.999891,0,1.367033,-0.309791,-0.5,
+ -0.244016,-0.944635,-0.219364,1.335465,-0.301849,-0.5875,
+ -0.433457,-0.901174,0,1.320807,-0.307035,-0.5,
+ -0.693597,-0.068529,0.717096,1.333479,-0.188456,-0.340079,
+ -0.356933,0.09138,0.92965,1.401596,-0.166219,-0.296464,
+ -0.39719,0.033722,0.917117,1.420971,-0.21646,-0.282086,
+ -0.693597,-0.068529,0.717096,1.333479,-0.188456,-0.340079,
+ -0.39719,0.033722,0.917117,1.420971,-0.21646,-0.282086,
+ -0.738864,-0.111606,0.664548,1.346635,-0.237972,-0.328782,
+ -0.07755,0.232519,0.969495,1.483337,-0.139536,-0.281926,
+ -0.053569,0.174235,0.983246,1.510174,-0.190646,-0.26652,
+ -0.39719,0.033722,0.917117,1.420971,-0.21646,-0.282086,
+ -0.07755,0.232519,0.969495,1.483337,-0.139536,-0.281926,
+ -0.39719,0.033722,0.917117,1.420971,-0.21646,-0.282086,
+ -0.356933,0.09138,0.92965,1.401596,-0.166219,-0.296464,
+ -0.053569,0.174235,0.983246,1.510174,-0.190646,-0.26652,
+ 0.100693,-0.274502,0.9563,1.526344,-0.226473,-0.262505,
+ -0.236076,-0.378113,0.895153,1.435022,-0.251106,-0.278521,
+ -0.236076,-0.378113,0.895153,1.435022,-0.251106,-0.278521,
+ -0.39719,0.033722,0.917117,1.420971,-0.21646,-0.282086,
+ -0.053569,0.174235,0.983246,1.510174,-0.190646,-0.26652,
+ -0.588534,-0.475383,0.653941,1.358796,-0.271614,-0.326227,
+ -0.738864,-0.111606,0.664548,1.346635,-0.237972,-0.328782,
+ -0.39719,0.033722,0.917117,1.420971,-0.21646,-0.282086,
+ -0.588534,-0.475383,0.653941,1.358796,-0.271614,-0.326227,
+ -0.39719,0.033722,0.917117,1.420971,-0.21646,-0.282086,
+ -0.236076,-0.378113,0.895153,1.435022,-0.251106,-0.278521,
+ 0.523401,0.54123,0.65812,1.633195,-0.090616,-0.340079,
+ 0.58545,0.437052,0.682813,1.673712,-0.14332,-0.328782,
+ 0.256589,0.31723,0.912977,1.599377,-0.164832,-0.282086,
+ 0.523401,0.54123,0.65812,1.633195,-0.090616,-0.340079,
+ 0.256589,0.31723,0.912977,1.599377,-0.164832,-0.282086,
+ 0.223762,0.384639,0.895535,1.565078,-0.112852,-0.296464,
+ 0.58545,0.437052,0.682813,1.673712,-0.14332,-0.328782,
+ 0.722198,-0.015351,0.691516,1.693578,-0.180157,-0.326227,
+ 0.442231,-0.107524,0.890433,1.617509,-0.201252,-0.278521,
+ 0.442231,-0.107524,0.890433,1.617509,-0.201252,-0.278521,
+ 0.256589,0.31723,0.912977,1.599377,-0.164832,-0.282086,
+ 0.58545,0.437052,0.682813,1.673712,-0.14332,-0.328782,
+ 0.100693,-0.274502,0.9563,1.526344,-0.226473,-0.262505,
+ -0.053569,0.174235,0.983246,1.510174,-0.190646,-0.26652,
+ 0.256589,0.31723,0.912977,1.599377,-0.164832,-0.282086,
+ 0.100693,-0.274502,0.9563,1.526344,-0.226473,-0.262505,
+ 0.256589,0.31723,0.912977,1.599377,-0.164832,-0.282086,
+ 0.442231,-0.107524,0.890433,1.617509,-0.201252,-0.278521,
+ -0.053569,0.174235,0.983246,1.510174,-0.190646,-0.26652,
+ -0.07755,0.232519,0.969495,1.483337,-0.139536,-0.281926,
+ 0.223762,0.384639,0.895535,1.565078,-0.112852,-0.296464,
+ 0.223762,0.384639,0.895535,1.565078,-0.112852,-0.296464,
+ 0.256589,0.31723,0.912977,1.599377,-0.164832,-0.282086,
+ -0.053569,0.174235,0.983246,1.510174,-0.190646,-0.26652,
+ 0.633983,-0.62254,0.458813,1.689524,-0.205721,-0.339125,
+ 0.442953,-0.878385,0.179534,1.670754,-0.221475,-0.361333,
+ 0.361333,-0.91087,0.199385,1.617662,-0.240344,-0.335375,
+ 0.361333,-0.91087,0.199385,1.617662,-0.240344,-0.335375,
+ 0.389599,-0.715497,0.579893,1.618964,-0.225886,-0.294,
+ 0.633983,-0.62254,0.458813,1.689524,-0.205721,-0.339125,
+ 0.25096,-0.936595,0.244557,1.538546,-0.263835,-0.322437,
+ 0.205519,-0.76511,0.610221,1.53476,-0.249706,-0.2785,
+ 0.389599,-0.715497,0.579893,1.618964,-0.225886,-0.294,
+ 0.25096,-0.936595,0.244557,1.538546,-0.263835,-0.322437,
+ 0.389599,-0.715497,0.579893,1.618964,-0.225886,-0.294,
+ 0.361333,-0.91087,0.199385,1.617662,-0.240344,-0.335375,
+ 0.100693,-0.274502,0.9563,1.526344,-0.226473,-0.262505,
+ 0.442231,-0.107524,0.890433,1.617509,-0.201252,-0.278521,
+ 0.389599,-0.715497,0.579893,1.618964,-0.225886,-0.294,
+ 0.100693,-0.274502,0.9563,1.526344,-0.226473,-0.262505,
+ 0.389599,-0.715497,0.579893,1.618964,-0.225886,-0.294,
+ 0.205519,-0.76511,0.610221,1.53476,-0.249706,-0.2785,
+ 0.442231,-0.107524,0.890433,1.617509,-0.201252,-0.278521,
+ 0.722198,-0.015351,0.691516,1.693578,-0.180157,-0.326227,
+ 0.633983,-0.62254,0.458813,1.689524,-0.205721,-0.339125,
+ 0.633983,-0.62254,0.458813,1.689524,-0.205721,-0.339125,
+ 0.389599,-0.715497,0.579893,1.618964,-0.225886,-0.294,
+ 0.442231,-0.107524,0.890433,1.617509,-0.201252,-0.278521,
+ 0.055786,-0.978344,0.199328,1.40287,-0.293254,-0.361333,
+ -0.175453,-0.874143,0.452869,1.378738,-0.288996,-0.339125,
+ 0.03573,-0.852716,0.521152,1.449927,-0.271179,-0.294,
+ 0.055786,-0.978344,0.199328,1.40287,-0.293254,-0.361333,
+ 0.03573,-0.852716,0.521152,1.449927,-0.271179,-0.294,
+ 0.155998,-0.969634,0.188349,1.458284,-0.283049,-0.335375,
+ -0.175453,-0.874143,0.452869,1.378738,-0.288996,-0.339125,
+ -0.588534,-0.475383,0.653941,1.358796,-0.271614,-0.326227,
+ -0.236076,-0.378113,0.895153,1.435022,-0.251106,-0.278521,
+ -0.236076,-0.378113,0.895153,1.435022,-0.251106,-0.278521,
+ 0.03573,-0.852716,0.521152,1.449927,-0.271179,-0.294,
+ -0.175453,-0.874143,0.452869,1.378738,-0.288996,-0.339125,
+ 0.100693,-0.274502,0.9563,1.526344,-0.226473,-0.262505,
+ 0.205519,-0.76511,0.610221,1.53476,-0.249706,-0.2785,
+ 0.03573,-0.852716,0.521152,1.449927,-0.271179,-0.294,
+ 0.100693,-0.274502,0.9563,1.526344,-0.226473,-0.262505,
+ 0.03573,-0.852716,0.521152,1.449927,-0.271179,-0.294,
+ -0.236076,-0.378113,0.895153,1.435022,-0.251106,-0.278521,
+ 0.25096,-0.936595,0.244557,1.538546,-0.263835,-0.322437,
+ 0.155998,-0.969634,0.188349,1.458284,-0.283049,-0.335375,
+ 0.03573,-0.852716,0.521152,1.449927,-0.271179,-0.294,
+ 0.25096,-0.936595,0.244557,1.538546,-0.263835,-0.322437,
+ 0.03573,-0.852716,0.521152,1.449927,-0.271179,-0.294,
+ 0.205519,-0.76511,0.610221,1.53476,-0.249706,-0.2785,
+ 0.442953,-0.878385,-0.179534,1.670754,-0.221475,-0.638667,
+ 0.361333,-0.91087,-0.199385,1.617662,-0.240344,-0.664625,
+ 0.33419,-0.939127,-0.079739,1.627523,-0.246239,-0.5905,
+ 0.442953,-0.878385,-0.179534,1.670754,-0.221475,-0.638667,
+ 0.33419,-0.939127,-0.079739,1.627523,-0.246239,-0.5905,
+ 0.43479,-0.894931,-0.100277,1.696988,-0.219088,-0.5825,
+ 0.361333,-0.91087,-0.199385,1.617662,-0.240344,-0.664625,
+ 0.25096,-0.936595,-0.244557,1.538546,-0.263835,-0.677562,
+ 0.257883,-0.962433,-0.08496,1.540826,-0.272345,-0.59775,
+ 0.257883,-0.962433,-0.08496,1.540826,-0.272345,-0.59775,
+ 0.33419,-0.939127,-0.079739,1.627523,-0.246239,-0.5905,
+ 0.361333,-0.91087,-0.199385,1.617662,-0.240344,-0.664625,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.339948,-0.940444,0,1.635245,-0.247046,-0.5,
+ 0.33419,-0.939127,-0.079739,1.627523,-0.246239,-0.5905,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.33419,-0.939127,-0.079739,1.627523,-0.246239,-0.5905,
+ 0.257883,-0.962433,-0.08496,1.540826,-0.272345,-0.59775,
+ 0.339948,-0.940444,0,1.635245,-0.247046,-0.5,
+ 0.487185,-0.873299,0,1.710058,-0.217878,-0.5,
+ 0.43479,-0.894931,-0.100277,1.696988,-0.219088,-0.5825,
+ 0.43479,-0.894931,-0.100277,1.696988,-0.219088,-0.5825,
+ 0.33419,-0.939127,-0.079739,1.627523,-0.246239,-0.5905,
+ 0.339948,-0.940444,0,1.635245,-0.247046,-0.5,
+ 0.055786,-0.978343,-0.199329,1.40287,-0.293254,-0.638667,
+ 0.070927,-0.992428,-0.100277,1.378957,-0.304305,-0.5825,
+ 0.180146,-0.980403,-0.079739,1.452691,-0.293085,-0.5905,
+ 0.055786,-0.978343,-0.199329,1.40287,-0.293254,-0.638667,
+ 0.180146,-0.980403,-0.079739,1.452691,-0.293085,-0.5905,
+ 0.155998,-0.969633,-0.18835,1.458284,-0.283049,-0.664625,
+ 0.070927,-0.992428,-0.100277,1.378957,-0.304305,-0.5825,
+ 0.014735,-0.999891,0,1.367033,-0.309791,-0.5,
+ 0.175818,-0.984423,0,1.446407,-0.297645,-0.5,
+ 0.175818,-0.984423,0,1.446407,-0.297645,-0.5,
+ 0.180146,-0.980403,-0.079739,1.452691,-0.293085,-0.5905,
+ 0.070927,-0.992428,-0.100277,1.378957,-0.304305,-0.5825,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.257883,-0.962433,-0.08496,1.540826,-0.272345,-0.59775,
+ 0.180146,-0.980403,-0.079739,1.452691,-0.293085,-0.5905,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.180146,-0.980403,-0.079739,1.452691,-0.293085,-0.5905,
+ 0.175818,-0.984423,0,1.446407,-0.297645,-0.5,
+ 0.257883,-0.962433,-0.08496,1.540826,-0.272345,-0.59775,
+ 0.25096,-0.936595,-0.244557,1.538546,-0.263835,-0.677562,
+ 0.155998,-0.969633,-0.18835,1.458284,-0.283049,-0.664625,
+ 0.155998,-0.969633,-0.18835,1.458284,-0.283049,-0.664625,
+ 0.180146,-0.980403,-0.079739,1.452691,-0.293085,-0.5905,
+ 0.257883,-0.962433,-0.08496,1.540826,-0.272345,-0.59775,
+ 0.055786,-0.978344,0.199328,1.40287,-0.293254,-0.361333,
+ 0.155998,-0.969634,0.188349,1.458284,-0.283049,-0.335375,
+ 0.180146,-0.980403,0.079739,1.452691,-0.293085,-0.4095,
+ 0.055786,-0.978344,0.199328,1.40287,-0.293254,-0.361333,
+ 0.180146,-0.980403,0.079739,1.452691,-0.293085,-0.4095,
+ 0.070927,-0.992428,0.100277,1.378957,-0.304305,-0.4175,
+ 0.155998,-0.969634,0.188349,1.458284,-0.283049,-0.335375,
+ 0.25096,-0.936595,0.244557,1.538546,-0.263835,-0.322437,
+ 0.257883,-0.962433,0.08496,1.540826,-0.272345,-0.40225,
+ 0.257883,-0.962433,0.08496,1.540826,-0.272345,-0.40225,
+ 0.180146,-0.980403,0.079739,1.452691,-0.293085,-0.4095,
+ 0.155998,-0.969634,0.188349,1.458284,-0.283049,-0.335375,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.175818,-0.984423,0,1.446407,-0.297645,-0.5,
+ 0.180146,-0.980403,0.079739,1.452691,-0.293085,-0.4095,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.180146,-0.980403,0.079739,1.452691,-0.293085,-0.4095,
+ 0.257883,-0.962433,0.08496,1.540826,-0.272345,-0.40225,
+ 0.175818,-0.984423,0,1.446407,-0.297645,-0.5,
+ 0.014735,-0.999891,0,1.367033,-0.309791,-0.5,
+ 0.070927,-0.992428,0.100277,1.378957,-0.304305,-0.4175,
+ 0.070927,-0.992428,0.100277,1.378957,-0.304305,-0.4175,
+ 0.180146,-0.980403,0.079739,1.452691,-0.293085,-0.4095,
+ 0.175818,-0.984423,0,1.446407,-0.297645,-0.5,
+ 0.442953,-0.878385,0.179534,1.670754,-0.221475,-0.361333,
+ 0.43479,-0.894931,0.100278,1.696988,-0.219088,-0.4175,
+ 0.33419,-0.939126,0.079739,1.627523,-0.246239,-0.4095,
+ 0.442953,-0.878385,0.179534,1.670754,-0.221475,-0.361333,
+ 0.33419,-0.939126,0.079739,1.627523,-0.246239,-0.4095,
+ 0.361333,-0.91087,0.199385,1.617662,-0.240344,-0.335375,
+ 0.43479,-0.894931,0.100278,1.696988,-0.219088,-0.4175,
+ 0.487185,-0.873299,0,1.710058,-0.217878,-0.5,
+ 0.339948,-0.940444,0,1.635245,-0.247046,-0.5,
+ 0.339948,-0.940444,0,1.635245,-0.247046,-0.5,
+ 0.33419,-0.939126,0.079739,1.627523,-0.246239,-0.4095,
+ 0.43479,-0.894931,0.100278,1.696988,-0.219088,-0.4175,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.257883,-0.962433,0.08496,1.540826,-0.272345,-0.40225,
+ 0.33419,-0.939126,0.079739,1.627523,-0.246239,-0.4095,
+ 0.258819,-0.965926,0,1.54159,-0.275196,-0.5,
+ 0.33419,-0.939126,0.079739,1.627523,-0.246239,-0.4095,
+ 0.339948,-0.940444,0,1.635245,-0.247046,-0.5,
+ 0.257883,-0.962433,0.08496,1.540826,-0.272345,-0.40225,
+ 0.25096,-0.936595,0.244557,1.538546,-0.263835,-0.322437,
+ 0.361333,-0.91087,0.199385,1.617662,-0.240344,-0.335375,
+ 0.361333,-0.91087,0.199385,1.617662,-0.240344,-0.335375,
+ 0.33419,-0.939126,0.079739,1.627523,-0.246239,-0.4095,
+ 0.257883,-0.962433,0.08496,1.540826,-0.272345,-0.40225,
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1728,data,NULL};
+const struct gllist *s1_5=&frame;
diff --git a/hacks/glx/s1_6.c b/hacks/glx/s1_6.c
new file mode 100644
index 0000000..bf2490e
--- /dev/null
+++ b/hacks/glx/s1_6.c
@@ -0,0 +1,1733 @@
+#include "gllist.h"
+static const float data[]={
+ 0.710152,0.225044,-0.667113,1.437472,0.482703,-0.67159,
+ 0.751095,0.142007,-0.644741,1.460394,0.412133,-0.660849,
+ 0.922813,0.236109,-0.304415,1.492239,0.440457,-0.587736,
+ 0.922813,0.236109,-0.304415,1.492239,0.440457,-0.587736,
+ 0.888327,0.330007,-0.319329,1.470529,0.515074,-0.593594,
+ 0.710152,0.225044,-0.667113,1.437472,0.482703,-0.67159,
+ 0.964484,0.264141,0,1.502855,0.449898,-0.5,
+ 0.923004,0.384789,0,1.481548,0.525864,-0.5,
+ 0.888327,0.330007,-0.319329,1.470529,0.515074,-0.593594,
+ 0.964484,0.264141,0,1.502855,0.449898,-0.5,
+ 0.888327,0.330007,-0.319329,1.470529,0.515074,-0.593594,
+ 0.922813,0.236109,-0.304415,1.492239,0.440457,-0.587736,
+ 0.923004,0.384789,0,1.481548,0.525864,-0.5,
+ 0.551211,0.834366,0,1.460683,0.568581,-0.5,
+ 0.590668,0.729279,-0.345345,1.449724,0.55695,-0.594774,
+ 0.590668,0.729279,-0.345345,1.449724,0.55695,-0.594774,
+ 0.888327,0.330007,-0.319329,1.470529,0.515074,-0.593594,
+ 0.923004,0.384789,0,1.481548,0.525864,-0.5,
+ 0.478093,0.57114,-0.667253,1.416649,0.522728,-0.673866,
+ 0.710152,0.225044,-0.667113,1.437472,0.482703,-0.67159,
+ 0.888327,0.330007,-0.319329,1.470529,0.515074,-0.593594,
+ 0.478093,0.57114,-0.667253,1.416649,0.522728,-0.673866,
+ 0.888327,0.330007,-0.319329,1.470529,0.515074,-0.593594,
+ 0.590668,0.729279,-0.345345,1.449724,0.55695,-0.594774,
+ 0.922813,0.236109,0.304415,1.492239,0.440457,-0.412264,
+ 0.751095,0.142007,0.644741,1.460394,0.412133,-0.339151,
+ 0.710152,0.225044,0.667112,1.437472,0.482703,-0.32841,
+ 0.710152,0.225044,0.667112,1.437472,0.482703,-0.32841,
+ 0.888327,0.330007,0.319329,1.470529,0.515074,-0.406406,
+ 0.922813,0.236109,0.304415,1.492239,0.440457,-0.412264,
+ 0.478094,0.57114,0.667253,1.416649,0.522728,-0.326134,
+ 0.590668,0.729279,0.345345,1.449724,0.55695,-0.405226,
+ 0.888327,0.330007,0.319329,1.470529,0.515074,-0.406406,
+ 0.478094,0.57114,0.667253,1.416649,0.522728,-0.326134,
+ 0.888327,0.330007,0.319329,1.470529,0.515074,-0.406406,
+ 0.710152,0.225044,0.667112,1.437472,0.482703,-0.32841,
+ 0.590668,0.729279,0.345345,1.449724,0.55695,-0.405226,
+ 0.551211,0.834366,0,1.460683,0.568581,-0.5,
+ 0.923004,0.384789,0,1.481548,0.525864,-0.5,
+ 0.923004,0.384789,0,1.481548,0.525864,-0.5,
+ 0.888327,0.330007,0.319329,1.470529,0.515074,-0.406406,
+ 0.590668,0.729279,0.345345,1.449724,0.55695,-0.405226,
+ 0.964484,0.264141,0,1.502855,0.449898,-0.5,
+ 0.922813,0.236109,0.304415,1.492239,0.440457,-0.412264,
+ 0.888327,0.330007,0.319329,1.470529,0.515074,-0.406406,
+ 0.964484,0.264141,0,1.502855,0.449898,-0.5,
+ 0.888327,0.330007,0.319329,1.470529,0.515074,-0.406406,
+ 0.923004,0.384789,0,1.481548,0.525864,-0.5,
+ -0.553505,0.813265,0.179534,1.370035,0.524394,-0.361333,
+ -0.571934,0.814147,0.100277,1.384841,0.546182,-0.4175,
+ -0.169784,0.964201,0.20369,1.423386,0.566478,-0.4125,
+ -0.553505,0.813265,0.179534,1.370035,0.524394,-0.361333,
+ -0.169784,0.964201,0.20369,1.423386,0.566478,-0.4125,
+ -0.216141,0.855174,0.471127,1.392914,0.533174,-0.339125,
+ -0.527613,0.849485,0,1.392236,0.557026,-0.5,
+ -0.070011,0.997546,0,1.433279,0.578472,-0.5,
+ -0.169784,0.964201,0.20369,1.423386,0.566478,-0.4125,
+ -0.527613,0.849485,0,1.392236,0.557026,-0.5,
+ -0.169784,0.964201,0.20369,1.423386,0.566478,-0.4125,
+ -0.571934,0.814147,0.100277,1.384841,0.546182,-0.4175,
+ 0.551211,0.834366,0,1.460683,0.568581,-0.5,
+ 0.590668,0.729279,0.345345,1.449724,0.55695,-0.405226,
+ -0.169784,0.964201,0.20369,1.423386,0.566478,-0.4125,
+ 0.551211,0.834366,0,1.460683,0.568581,-0.5,
+ -0.169784,0.964201,0.20369,1.423386,0.566478,-0.4125,
+ -0.070011,0.997546,0,1.433279,0.578472,-0.5,
+ 0.590668,0.729279,0.345345,1.449724,0.55695,-0.405226,
+ 0.478094,0.57114,0.667253,1.416649,0.522728,-0.326134,
+ -0.216141,0.855174,0.471127,1.392914,0.533174,-0.339125,
+ -0.216141,0.855174,0.471127,1.392914,0.533174,-0.339125,
+ -0.169784,0.964201,0.20369,1.423386,0.566478,-0.4125,
+ 0.590668,0.729279,0.345345,1.449724,0.55695,-0.405226,
+ -0.553505,0.813265,-0.179534,1.370035,0.524394,-0.638667,
+ -0.216141,0.855174,-0.471127,1.392914,0.533174,-0.660875,
+ -0.169784,0.964201,-0.203689,1.423386,0.566478,-0.5875,
+ -0.553505,0.813265,-0.179534,1.370035,0.524394,-0.638667,
+ -0.169784,0.964201,-0.203689,1.423386,0.566478,-0.5875,
+ -0.571934,0.814147,-0.100277,1.384841,0.546182,-0.5825,
+ -0.216141,0.855174,-0.471127,1.392914,0.533174,-0.660875,
+ 0.478093,0.57114,-0.667253,1.416649,0.522728,-0.673866,
+ 0.590668,0.729279,-0.345345,1.449724,0.55695,-0.594774,
+ 0.590668,0.729279,-0.345345,1.449724,0.55695,-0.594774,
+ -0.169784,0.964201,-0.203689,1.423386,0.566478,-0.5875,
+ -0.216141,0.855174,-0.471127,1.392914,0.533174,-0.660875,
+ 0.551211,0.834366,0,1.460683,0.568581,-0.5,
+ -0.070011,0.997546,0,1.433279,0.578472,-0.5,
+ -0.169784,0.964201,-0.203689,1.423386,0.566478,-0.5875,
+ 0.551211,0.834366,0,1.460683,0.568581,-0.5,
+ -0.169784,0.964201,-0.203689,1.423386,0.566478,-0.5875,
+ 0.590668,0.729279,-0.345345,1.449724,0.55695,-0.594774,
+ -0.527613,0.849485,0,1.392236,0.557026,-0.5,
+ -0.571934,0.814147,-0.100277,1.384841,0.546182,-0.5825,
+ -0.169784,0.964201,-0.203689,1.423386,0.566478,-0.5875,
+ -0.527613,0.849485,0,1.392236,0.557026,-0.5,
+ -0.169784,0.964201,-0.203689,1.423386,0.566478,-0.5875,
+ -0.070011,0.997546,0,1.433279,0.578472,-0.5,
+ 0.751095,0.142007,0.644741,1.460394,0.412133,-0.339151,
+ 0.45328,-0.00761,0.891335,1.407319,0.364926,-0.295283,
+ 0.413326,0.054801,0.908933,1.382377,0.428753,-0.281613,
+ 0.751095,0.142007,0.644741,1.460394,0.412133,-0.339151,
+ 0.413326,0.054801,0.908933,1.382377,0.428753,-0.281613,
+ 0.710152,0.225044,0.667112,1.437472,0.482703,-0.32841,
+ 0.45328,-0.00761,0.891335,1.407319,0.364926,-0.295283,
+ 0.144715,-0.16618,0.975419,1.343629,0.308278,-0.28066,
+ 0.112951,-0.120534,0.986262,1.316263,0.364012,-0.266014,
+ 0.112951,-0.120534,0.986262,1.316263,0.364012,-0.266014,
+ 0.413326,0.054801,0.908933,1.382377,0.428753,-0.281613,
+ 0.45328,-0.00761,0.891335,1.407319,0.364926,-0.295283,
+ -0.191431,0.222135,0.956039,1.294932,0.399266,-0.262379,
+ 0.141626,0.422273,0.895336,1.36126,0.466583,-0.278403,
+ 0.413326,0.054801,0.908933,1.382377,0.428753,-0.281613,
+ -0.191431,0.222135,0.956039,1.294932,0.399266,-0.262379,
+ 0.413326,0.054801,0.908933,1.382377,0.428753,-0.281613,
+ 0.112951,-0.120534,0.986262,1.316263,0.364012,-0.266014,
+ 0.141626,0.422273,0.895336,1.36126,0.466583,-0.278403,
+ 0.478094,0.57114,0.667253,1.416649,0.522728,-0.326134,
+ 0.710152,0.225044,0.667112,1.437472,0.482703,-0.32841,
+ 0.710152,0.225044,0.667112,1.437472,0.482703,-0.32841,
+ 0.413326,0.054801,0.908933,1.382377,0.428753,-0.281613,
+ 0.141626,0.422273,0.895336,1.36126,0.466583,-0.278403,
+ -0.17234,-0.336344,0.925836,1.279939,0.25163,-0.295283,
+ -0.503423,-0.512227,0.695837,1.226863,0.204423,-0.339151,
+ -0.508694,-0.497612,0.702576,1.195055,0.245321,-0.32841,
+ -0.508694,-0.497612,0.702576,1.195055,0.245321,-0.32841,
+ -0.19339,-0.303475,0.933008,1.25015,0.299272,-0.281613,
+ -0.17234,-0.336344,0.925836,1.279939,0.25163,-0.295283,
+ -0.73056,-0.181076,0.658402,1.174088,0.27496,-0.326134,
+ -0.461199,-0.002494,0.887293,1.22904,0.331527,-0.278403,
+ -0.19339,-0.303475,0.933008,1.25015,0.299272,-0.281613,
+ -0.73056,-0.181076,0.658402,1.174088,0.27496,-0.326134,
+ -0.19339,-0.303475,0.933008,1.25015,0.299272,-0.281613,
+ -0.508694,-0.497612,0.702576,1.195055,0.245321,-0.32841,
+ -0.461199,-0.002494,0.887293,1.22904,0.331527,-0.278403,
+ -0.191431,0.222135,0.956039,1.294932,0.399266,-0.262379,
+ 0.112951,-0.120534,0.986262,1.316263,0.364012,-0.266014,
+ 0.112951,-0.120534,0.986262,1.316263,0.364012,-0.266014,
+ -0.19339,-0.303475,0.933008,1.25015,0.299272,-0.281613,
+ -0.461199,-0.002494,0.887293,1.22904,0.331527,-0.278403,
+ 0.144715,-0.16618,0.975419,1.343629,0.308278,-0.28066,
+ -0.17234,-0.336344,0.925836,1.279939,0.25163,-0.295283,
+ -0.19339,-0.303475,0.933008,1.25015,0.299272,-0.281613,
+ 0.144715,-0.16618,0.975419,1.343629,0.308278,-0.28066,
+ -0.19339,-0.303475,0.933008,1.25015,0.299272,-0.281613,
+ 0.112951,-0.120534,0.986262,1.316263,0.364012,-0.266014,
+ -0.828633,0.523102,0.199328,1.177383,0.324897,-0.361333,
+ -0.766049,0.607525,0.209958,1.213173,0.368416,-0.335375,
+ -0.723455,0.416599,0.550508,1.219504,0.355352,-0.294,
+ -0.828633,0.523102,0.199328,1.177383,0.324897,-0.361333,
+ -0.723455,0.416599,0.550508,1.219504,0.355352,-0.294,
+ -0.850149,0.280677,0.445496,1.169407,0.301726,-0.339125,
+ -0.766049,0.607525,0.209958,1.213173,0.368416,-0.335375,
+ -0.702693,0.678582,0.21389,1.26889,0.429299,-0.322437,
+ -0.617508,0.597059,0.512059,1.279412,0.419138,-0.2785,
+ -0.617508,0.597059,0.512059,1.279412,0.419138,-0.2785,
+ -0.723455,0.416599,0.550508,1.219504,0.355352,-0.294,
+ -0.766049,0.607525,0.209958,1.213173,0.368416,-0.335375,
+ -0.191431,0.222135,0.956039,1.294932,0.399266,-0.262379,
+ -0.461199,-0.002494,0.887293,1.22904,0.331527,-0.278403,
+ -0.723455,0.416599,0.550508,1.219504,0.355352,-0.294,
+ -0.191431,0.222135,0.956039,1.294932,0.399266,-0.262379,
+ -0.723455,0.416599,0.550508,1.219504,0.355352,-0.294,
+ -0.617508,0.597059,0.512059,1.279412,0.419138,-0.2785,
+ -0.461199,-0.002494,0.887293,1.22904,0.331527,-0.278403,
+ -0.73056,-0.181076,0.658402,1.174088,0.27496,-0.326134,
+ -0.850149,0.280677,0.445496,1.169407,0.301726,-0.339125,
+ -0.850149,0.280677,0.445496,1.169407,0.301726,-0.339125,
+ -0.723455,0.416599,0.550508,1.219504,0.355352,-0.294,
+ -0.461199,-0.002494,0.887293,1.22904,0.331527,-0.278403,
+ -0.623755,0.751092,0.216309,1.327792,0.487107,-0.335375,
+ -0.553505,0.813265,0.179534,1.370035,0.524394,-0.361333,
+ -0.216141,0.855174,0.471127,1.392914,0.533174,-0.339125,
+ -0.216141,0.855174,0.471127,1.392914,0.533174,-0.339125,
+ -0.382645,0.670188,0.635949,1.341069,0.481236,-0.294,
+ -0.623755,0.751092,0.216309,1.327792,0.487107,-0.335375,
+ -0.216141,0.855174,0.471127,1.392914,0.533174,-0.339125,
+ 0.478094,0.57114,0.667253,1.416649,0.522728,-0.326134,
+ 0.141626,0.422273,0.895336,1.36126,0.466583,-0.278403,
+ 0.141626,0.422273,0.895336,1.36126,0.466583,-0.278403,
+ -0.382645,0.670188,0.635949,1.341069,0.481236,-0.294,
+ -0.216141,0.855174,0.471127,1.392914,0.533174,-0.339125,
+ -0.191431,0.222135,0.956039,1.294932,0.399266,-0.262379,
+ -0.617508,0.597059,0.512059,1.279412,0.419138,-0.2785,
+ -0.382645,0.670188,0.635949,1.341069,0.481236,-0.294,
+ -0.191431,0.222135,0.956039,1.294932,0.399266,-0.262379,
+ -0.382645,0.670188,0.635949,1.341069,0.481236,-0.294,
+ 0.141626,0.422273,0.895336,1.36126,0.466583,-0.278403,
+ -0.617508,0.597059,0.512059,1.279412,0.419138,-0.2785,
+ -0.702693,0.678582,0.21389,1.26889,0.429299,-0.322437,
+ -0.623755,0.751092,0.216309,1.327792,0.487107,-0.335375,
+ -0.623755,0.751092,0.216309,1.327792,0.487107,-0.335375,
+ -0.382645,0.670188,0.635949,1.341069,0.481236,-0.294,
+ -0.617508,0.597059,0.512059,1.279412,0.419138,-0.2785,
+ -0.503423,-0.512227,0.695837,1.226863,0.204423,-0.339151,
+ -0.715537,-0.612433,0.336055,1.195018,0.176099,-0.412264,
+ -0.707587,-0.61874,0.341293,1.161998,0.212951,-0.406406,
+ -0.503423,-0.512227,0.695837,1.226863,0.204423,-0.339151,
+ -0.707587,-0.61874,0.341293,1.161998,0.212951,-0.406406,
+ -0.508694,-0.497612,0.702576,1.195055,0.245321,-0.32841,
+ -0.715537,-0.612433,0.336055,1.195018,0.176099,-0.412264,
+ -0.784292,-0.620391,0,1.184403,0.166658,-0.5,
+ -0.749482,-0.662025,0,1.150979,0.202161,-0.5,
+ -0.749482,-0.662025,0,1.150979,0.202161,-0.5,
+ -0.707587,-0.61874,0.341293,1.161998,0.212951,-0.406406,
+ -0.715537,-0.612433,0.336055,1.195018,0.176099,-0.412264,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.856012,-0.369954,0.361078,1.140576,0.24116,-0.405226,
+ -0.707587,-0.61874,0.341293,1.161998,0.212951,-0.406406,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.707587,-0.61874,0.341293,1.161998,0.212951,-0.406406,
+ -0.749482,-0.662025,0,1.150979,0.202161,-0.5,
+ -0.856012,-0.369954,0.361078,1.140576,0.24116,-0.405226,
+ -0.73056,-0.181076,0.658402,1.174088,0.27496,-0.326134,
+ -0.508694,-0.497612,0.702576,1.195055,0.245321,-0.32841,
+ -0.508694,-0.497612,0.702576,1.195055,0.245321,-0.32841,
+ -0.707587,-0.61874,0.341293,1.161998,0.212951,-0.406406,
+ -0.856012,-0.369954,0.361078,1.140576,0.24116,-0.405226,
+ -0.503423,-0.512227,-0.695836,1.226863,0.204423,-0.660849,
+ -0.508694,-0.497611,-0.702576,1.195055,0.245321,-0.67159,
+ -0.707587,-0.61874,-0.341293,1.161998,0.212951,-0.593594,
+ -0.503423,-0.512227,-0.695836,1.226863,0.204423,-0.660849,
+ -0.707587,-0.61874,-0.341293,1.161998,0.212951,-0.593594,
+ -0.715537,-0.612433,-0.336055,1.195018,0.176099,-0.587736,
+ -0.508694,-0.497611,-0.702576,1.195055,0.245321,-0.67159,
+ -0.73056,-0.181076,-0.658402,1.174088,0.27496,-0.673866,
+ -0.856012,-0.369954,-0.361078,1.140576,0.24116,-0.594774,
+ -0.856012,-0.369954,-0.361078,1.140576,0.24116,-0.594774,
+ -0.707587,-0.61874,-0.341293,1.161998,0.212951,-0.593594,
+ -0.508694,-0.497611,-0.702576,1.195055,0.245321,-0.67159,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.749482,-0.662025,0,1.150979,0.202161,-0.5,
+ -0.707587,-0.61874,-0.341293,1.161998,0.212951,-0.593594,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.707587,-0.61874,-0.341293,1.161998,0.212951,-0.593594,
+ -0.856012,-0.369954,-0.361078,1.140576,0.24116,-0.594774,
+ -0.749482,-0.662025,0,1.150979,0.202161,-0.5,
+ -0.784292,-0.620391,0,1.184403,0.166658,-0.5,
+ -0.715537,-0.612433,-0.336055,1.195018,0.176099,-0.587736,
+ -0.715537,-0.612433,-0.336055,1.195018,0.176099,-0.587736,
+ -0.707587,-0.61874,-0.341293,1.161998,0.212951,-0.593594,
+ -0.749482,-0.662025,0,1.150979,0.202161,-0.5,
+ -0.828633,0.523102,-0.199328,1.177383,0.324897,-0.638667,
+ -0.833612,0.543172,-0.100277,1.156124,0.30934,-0.5825,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.828633,0.523102,-0.199328,1.177383,0.324897,-0.638667,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.850149,0.280677,-0.445496,1.169407,0.301726,-0.660875,
+ -0.867381,0.497645,0,1.145545,0.301571,-0.5,
+ -0.986597,0.163178,0,1.125545,0.259804,-0.5,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.867381,0.497645,0,1.145545,0.301571,-0.5,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.833612,0.543172,-0.100277,1.156124,0.30934,-0.5825,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.856012,-0.369954,-0.361078,1.140576,0.24116,-0.594774,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.986597,0.163178,0,1.125545,0.259804,-0.5,
+ -0.73056,-0.181076,-0.658402,1.174088,0.27496,-0.673866,
+ -0.850149,0.280677,-0.445496,1.169407,0.301726,-0.660875,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.73056,-0.181076,-0.658402,1.174088,0.27496,-0.673866,
+ -0.955913,0.208955,-0.20632,1.137187,0.27011,-0.5875,
+ -0.856012,-0.369954,-0.361078,1.140576,0.24116,-0.594774,
+ -0.828633,0.523102,0.199328,1.177383,0.324897,-0.361333,
+ -0.850149,0.280677,0.445496,1.169407,0.301726,-0.339125,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.828633,0.523102,0.199328,1.177383,0.324897,-0.361333,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.833612,0.543172,0.100277,1.156124,0.30934,-0.4175,
+ -0.73056,-0.181076,0.658402,1.174088,0.27496,-0.326134,
+ -0.856012,-0.369954,0.361078,1.140576,0.24116,-0.405226,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.73056,-0.181076,0.658402,1.174088,0.27496,-0.326134,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.850149,0.280677,0.445496,1.169407,0.301726,-0.339125,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.986597,0.163178,0,1.125545,0.259804,-0.5,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.92836,-0.371683,0,1.12918,0.229952,-0.5,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.856012,-0.369954,0.361078,1.140576,0.24116,-0.405226,
+ -0.867381,0.497645,0,1.145545,0.301571,-0.5,
+ -0.833612,0.543172,0.100277,1.156124,0.30934,-0.4175,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.867381,0.497645,0,1.145545,0.301571,-0.5,
+ -0.955913,0.208955,0.20632,1.137187,0.27011,-0.4125,
+ -0.986597,0.163178,0,1.125545,0.259804,-0.5,
+ -0.508694,-0.497611,-0.702576,1.195055,0.245321,-0.67159,
+ -0.503423,-0.512227,-0.695836,1.226863,0.204423,-0.660849,
+ -0.17234,-0.336344,-0.925836,1.279939,0.25163,-0.704717,
+ -0.17234,-0.336344,-0.925836,1.279939,0.25163,-0.704717,
+ -0.193391,-0.303475,-0.933008,1.25015,0.299272,-0.718387,
+ -0.508694,-0.497611,-0.702576,1.195055,0.245321,-0.67159,
+ 0.144715,-0.16618,-0.975419,1.343629,0.308278,-0.71934,
+ 0.112951,-0.120534,-0.986262,1.316263,0.364012,-0.733986,
+ -0.193391,-0.303475,-0.933008,1.25015,0.299272,-0.718387,
+ 0.144715,-0.16618,-0.975419,1.343629,0.308278,-0.71934,
+ -0.193391,-0.303475,-0.933008,1.25015,0.299272,-0.718387,
+ -0.17234,-0.336344,-0.925836,1.279939,0.25163,-0.704717,
+ 0.112951,-0.120534,-0.986262,1.316263,0.364012,-0.733986,
+ -0.191432,0.222135,-0.956039,1.294932,0.399266,-0.737621,
+ -0.461199,-0.002494,-0.887293,1.22904,0.331527,-0.721597,
+ -0.461199,-0.002494,-0.887293,1.22904,0.331527,-0.721597,
+ -0.193391,-0.303475,-0.933008,1.25015,0.299272,-0.718387,
+ 0.112951,-0.120534,-0.986262,1.316263,0.364012,-0.733986,
+ -0.73056,-0.181076,-0.658402,1.174088,0.27496,-0.673866,
+ -0.508694,-0.497611,-0.702576,1.195055,0.245321,-0.67159,
+ -0.193391,-0.303475,-0.933008,1.25015,0.299272,-0.718387,
+ -0.73056,-0.181076,-0.658402,1.174088,0.27496,-0.673866,
+ -0.193391,-0.303475,-0.933008,1.25015,0.299272,-0.718387,
+ -0.461199,-0.002494,-0.887293,1.22904,0.331527,-0.721597,
+ 0.751095,0.142007,-0.644741,1.460394,0.412133,-0.660849,
+ 0.710152,0.225044,-0.667113,1.437472,0.482703,-0.67159,
+ 0.413326,0.054801,-0.908933,1.382377,0.428753,-0.718387,
+ 0.751095,0.142007,-0.644741,1.460394,0.412133,-0.660849,
+ 0.413326,0.054801,-0.908933,1.382377,0.428753,-0.718387,
+ 0.45328,-0.007609,-0.891335,1.407319,0.364926,-0.704717,
+ 0.710152,0.225044,-0.667113,1.437472,0.482703,-0.67159,
+ 0.478093,0.57114,-0.667253,1.416649,0.522728,-0.673866,
+ 0.141625,0.422274,-0.895336,1.36126,0.466583,-0.721597,
+ 0.141625,0.422274,-0.895336,1.36126,0.466583,-0.721597,
+ 0.413326,0.054801,-0.908933,1.382377,0.428753,-0.718387,
+ 0.710152,0.225044,-0.667113,1.437472,0.482703,-0.67159,
+ -0.191432,0.222135,-0.956039,1.294932,0.399266,-0.737621,
+ 0.112951,-0.120534,-0.986262,1.316263,0.364012,-0.733986,
+ 0.413326,0.054801,-0.908933,1.382377,0.428753,-0.718387,
+ -0.191432,0.222135,-0.956039,1.294932,0.399266,-0.737621,
+ 0.413326,0.054801,-0.908933,1.382377,0.428753,-0.718387,
+ 0.141625,0.422274,-0.895336,1.36126,0.466583,-0.721597,
+ 0.112951,-0.120534,-0.986262,1.316263,0.364012,-0.733986,
+ 0.144715,-0.16618,-0.975419,1.343629,0.308278,-0.71934,
+ 0.45328,-0.007609,-0.891335,1.407319,0.364926,-0.704717,
+ 0.45328,-0.007609,-0.891335,1.407319,0.364926,-0.704717,
+ 0.413326,0.054801,-0.908933,1.382377,0.428753,-0.718387,
+ 0.112951,-0.120534,-0.986262,1.316263,0.364012,-0.733986,
+ -0.216141,0.855174,-0.471127,1.392914,0.533174,-0.660875,
+ -0.553505,0.813265,-0.179534,1.370035,0.524394,-0.638667,
+ -0.623755,0.751092,-0.216309,1.327792,0.487107,-0.664625,
+ -0.623755,0.751092,-0.216309,1.327792,0.487107,-0.664625,
+ -0.382645,0.670188,-0.635948,1.341069,0.481236,-0.706,
+ -0.216141,0.855174,-0.471127,1.392914,0.533174,-0.660875,
+ -0.623755,0.751092,-0.216309,1.327792,0.487107,-0.664625,
+ -0.702693,0.678582,-0.21389,1.26889,0.429299,-0.677562,
+ -0.617508,0.597059,-0.512058,1.279412,0.419138,-0.7215,
+ -0.617508,0.597059,-0.512058,1.279412,0.419138,-0.7215,
+ -0.382645,0.670188,-0.635948,1.341069,0.481236,-0.706,
+ -0.623755,0.751092,-0.216309,1.327792,0.487107,-0.664625,
+ -0.191432,0.222135,-0.956039,1.294932,0.399266,-0.737621,
+ 0.141625,0.422274,-0.895336,1.36126,0.466583,-0.721597,
+ -0.382645,0.670188,-0.635948,1.341069,0.481236,-0.706,
+ -0.191432,0.222135,-0.956039,1.294932,0.399266,-0.737621,
+ -0.382645,0.670188,-0.635948,1.341069,0.481236,-0.706,
+ -0.617508,0.597059,-0.512058,1.279412,0.419138,-0.7215,
+ 0.141625,0.422274,-0.895336,1.36126,0.466583,-0.721597,
+ 0.478093,0.57114,-0.667253,1.416649,0.522728,-0.673866,
+ -0.216141,0.855174,-0.471127,1.392914,0.533174,-0.660875,
+ -0.216141,0.855174,-0.471127,1.392914,0.533174,-0.660875,
+ -0.382645,0.670188,-0.635948,1.341069,0.481236,-0.706,
+ 0.141625,0.422274,-0.895336,1.36126,0.466583,-0.721597,
+ -0.828633,0.523102,-0.199328,1.177383,0.324897,-0.638667,
+ -0.850149,0.280677,-0.445496,1.169407,0.301726,-0.660875,
+ -0.723455,0.416599,-0.550508,1.219504,0.355352,-0.706,
+ -0.828633,0.523102,-0.199328,1.177383,0.324897,-0.638667,
+ -0.723455,0.416599,-0.550508,1.219504,0.355352,-0.706,
+ -0.766049,0.607525,-0.209958,1.213173,0.368416,-0.664625,
+ -0.850149,0.280677,-0.445496,1.169407,0.301726,-0.660875,
+ -0.73056,-0.181076,-0.658402,1.174088,0.27496,-0.673866,
+ -0.461199,-0.002494,-0.887293,1.22904,0.331527,-0.721597,
+ -0.461199,-0.002494,-0.887293,1.22904,0.331527,-0.721597,
+ -0.723455,0.416599,-0.550508,1.219504,0.355352,-0.706,
+ -0.850149,0.280677,-0.445496,1.169407,0.301726,-0.660875,
+ -0.191432,0.222135,-0.956039,1.294932,0.399266,-0.737621,
+ -0.617508,0.597059,-0.512058,1.279412,0.419138,-0.7215,
+ -0.723455,0.416599,-0.550508,1.219504,0.355352,-0.706,
+ -0.191432,0.222135,-0.956039,1.294932,0.399266,-0.737621,
+ -0.723455,0.416599,-0.550508,1.219504,0.355352,-0.706,
+ -0.461199,-0.002494,-0.887293,1.22904,0.331527,-0.721597,
+ -0.617508,0.597059,-0.512058,1.279412,0.419138,-0.7215,
+ -0.702693,0.678582,-0.21389,1.26889,0.429299,-0.677562,
+ -0.766049,0.607525,-0.209958,1.213173,0.368416,-0.664625,
+ -0.766049,0.607525,-0.209958,1.213173,0.368416,-0.664625,
+ -0.723455,0.416599,-0.550508,1.219504,0.355352,-0.706,
+ -0.617508,0.597059,-0.512058,1.279412,0.419138,-0.7215,
+ -0.553505,0.813265,0.179534,1.370035,0.524394,-0.361333,
+ -0.623755,0.751092,0.216309,1.327792,0.487107,-0.335375,
+ -0.65936,0.747587,0.079739,1.327417,0.49859,-0.4095,
+ -0.553505,0.813265,0.179534,1.370035,0.524394,-0.361333,
+ -0.65936,0.747587,0.079739,1.327417,0.49859,-0.4095,
+ -0.571934,0.814147,0.100277,1.384841,0.546182,-0.4175,
+ -0.623755,0.751092,0.216309,1.327792,0.487107,-0.335375,
+ -0.702693,0.678582,0.21389,1.26889,0.429299,-0.322437,
+ -0.716739,0.692147,0.08496,1.262552,0.435419,-0.40225,
+ -0.716739,0.692147,0.08496,1.262552,0.435419,-0.40225,
+ -0.65936,0.747587,0.079739,1.327417,0.49859,-0.4095,
+ -0.623755,0.751092,0.216309,1.327792,0.487107,-0.335375,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.65772,0.753262,0,1.330455,0.505735,-0.5,
+ -0.65936,0.747587,0.079739,1.327417,0.49859,-0.4095,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.65936,0.747587,0.079739,1.327417,0.49859,-0.4095,
+ -0.716739,0.692147,0.08496,1.262552,0.435419,-0.40225,
+ -0.65772,0.753262,0,1.330455,0.505735,-0.5,
+ -0.527613,0.849485,0,1.392236,0.557026,-0.5,
+ -0.571934,0.814147,0.100277,1.384841,0.546182,-0.4175,
+ -0.571934,0.814147,0.100277,1.384841,0.546182,-0.4175,
+ -0.65936,0.747587,0.079739,1.327417,0.49859,-0.4095,
+ -0.65772,0.753262,0,1.330455,0.505735,-0.5,
+ -0.828633,0.523102,0.199328,1.177383,0.324897,-0.361333,
+ -0.833612,0.543172,0.100277,1.156124,0.30934,-0.4175,
+ -0.770142,0.632868,0.079739,1.201684,0.368389,-0.4095,
+ -0.828633,0.523102,0.199328,1.177383,0.324897,-0.361333,
+ -0.770142,0.632868,0.079739,1.201684,0.368389,-0.4095,
+ -0.766049,0.607525,0.209958,1.213173,0.368416,-0.335375,
+ -0.833612,0.543172,0.100277,1.156124,0.30934,-0.4175,
+ -0.867381,0.497645,0,1.145545,0.301571,-0.5,
+ -0.775757,0.631031,0,1.19465,0.365104,-0.5,
+ -0.775757,0.631031,0,1.19465,0.365104,-0.5,
+ -0.770142,0.632868,0.079739,1.201684,0.368389,-0.4095,
+ -0.833612,0.543172,0.100277,1.156124,0.30934,-0.4175,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.716739,0.692147,0.08496,1.262552,0.435419,-0.40225,
+ -0.770142,0.632868,0.079739,1.201684,0.368389,-0.4095,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.770142,0.632868,0.079739,1.201684,0.368389,-0.4095,
+ -0.775757,0.631031,0,1.19465,0.365104,-0.5,
+ -0.716739,0.692147,0.08496,1.262552,0.435419,-0.40225,
+ -0.702693,0.678582,0.21389,1.26889,0.429299,-0.322437,
+ -0.766049,0.607525,0.209958,1.213173,0.368416,-0.335375,
+ -0.766049,0.607525,0.209958,1.213173,0.368416,-0.335375,
+ -0.770142,0.632868,0.079739,1.201684,0.368389,-0.4095,
+ -0.716739,0.692147,0.08496,1.262552,0.435419,-0.40225,
+ -0.828633,0.523102,-0.199328,1.177383,0.324897,-0.638667,
+ -0.766049,0.607525,-0.209958,1.213173,0.368416,-0.664625,
+ -0.770142,0.632868,-0.079739,1.201684,0.368389,-0.5905,
+ -0.828633,0.523102,-0.199328,1.177383,0.324897,-0.638667,
+ -0.770142,0.632868,-0.079739,1.201684,0.368389,-0.5905,
+ -0.833612,0.543172,-0.100277,1.156124,0.30934,-0.5825,
+ -0.766049,0.607525,-0.209958,1.213173,0.368416,-0.664625,
+ -0.702693,0.678582,-0.21389,1.26889,0.429299,-0.677562,
+ -0.716739,0.692147,-0.08496,1.262552,0.435419,-0.59775,
+ -0.716739,0.692147,-0.08496,1.262552,0.435419,-0.59775,
+ -0.770142,0.632868,-0.079739,1.201684,0.368389,-0.5905,
+ -0.766049,0.607525,-0.209958,1.213173,0.368416,-0.664625,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.775757,0.631031,0,1.19465,0.365104,-0.5,
+ -0.770142,0.632868,-0.079739,1.201684,0.368389,-0.5905,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.770142,0.632868,-0.079739,1.201684,0.368389,-0.5905,
+ -0.716739,0.692147,-0.08496,1.262552,0.435419,-0.59775,
+ -0.775757,0.631031,0,1.19465,0.365104,-0.5,
+ -0.867381,0.497645,0,1.145545,0.301571,-0.5,
+ -0.833612,0.543172,-0.100277,1.156124,0.30934,-0.5825,
+ -0.833612,0.543172,-0.100277,1.156124,0.30934,-0.5825,
+ -0.770142,0.632868,-0.079739,1.201684,0.368389,-0.5905,
+ -0.775757,0.631031,0,1.19465,0.365104,-0.5,
+ -0.553505,0.813265,-0.179534,1.370035,0.524394,-0.638667,
+ -0.571934,0.814147,-0.100277,1.384841,0.546182,-0.5825,
+ -0.65936,0.747587,-0.079739,1.327417,0.49859,-0.5905,
+ -0.553505,0.813265,-0.179534,1.370035,0.524394,-0.638667,
+ -0.65936,0.747587,-0.079739,1.327417,0.49859,-0.5905,
+ -0.623755,0.751092,-0.216309,1.327792,0.487107,-0.664625,
+ -0.571934,0.814147,-0.100277,1.384841,0.546182,-0.5825,
+ -0.527613,0.849485,0,1.392236,0.557026,-0.5,
+ -0.65772,0.753262,0,1.330455,0.505735,-0.5,
+ -0.65772,0.753262,0,1.330455,0.505735,-0.5,
+ -0.65936,0.747587,-0.079739,1.327417,0.49859,-0.5905,
+ -0.571934,0.814147,-0.100277,1.384841,0.546182,-0.5825,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.716739,0.692147,-0.08496,1.262552,0.435419,-0.59775,
+ -0.65936,0.747587,-0.079739,1.327417,0.49859,-0.5905,
+ -0.71934,0.694658,0,1.260429,0.437469,-0.5,
+ -0.65936,0.747587,-0.079739,1.327417,0.49859,-0.5905,
+ -0.65772,0.753262,0,1.330455,0.505735,-0.5,
+ -0.716739,0.692147,-0.08496,1.262552,0.435419,-0.59775,
+ -0.702693,0.678582,-0.21389,1.26889,0.429299,-0.677562,
+ -0.623755,0.751092,-0.216309,1.327792,0.487107,-0.664625,
+ -0.623755,0.751092,-0.216309,1.327792,0.487107,-0.664625,
+ -0.65936,0.747587,-0.079739,1.327417,0.49859,-0.5905,
+ -0.716739,0.692147,-0.08496,1.262552,0.435419,-0.59775,
+ 0.751095,0.142007,-0.644741,1.460394,0.412133,-0.660849,
+ 0.74475,0.138417,-0.652831,1.49043,0.310049,-0.648448,
+ 0.924767,0.224636,-0.307154,1.521298,0.332708,-0.580972,
+ 0.751095,0.142007,-0.644741,1.460394,0.412133,-0.660849,
+ 0.924767,0.224636,-0.307154,1.521298,0.332708,-0.580972,
+ 0.922813,0.236109,-0.304415,1.492239,0.440457,-0.587736,
+ 0.74475,0.138417,-0.652831,1.49043,0.310049,-0.648448,
+ 0.734405,0.137212,-0.664697,1.524188,0.186469,-0.636664,
+ 0.924854,0.216174,-0.312912,1.554547,0.202755,-0.574544,
+ 0.924854,0.216174,-0.312912,1.554547,0.202755,-0.574544,
+ 0.924767,0.224636,-0.307154,1.521298,0.332708,-0.580972,
+ 0.74475,0.138417,-0.652831,1.49043,0.310049,-0.648448,
+ 0.97102,0.238998,0,1.564666,0.208184,-0.5,
+ 0.968395,0.249424,0,1.531587,0.340261,-0.5,
+ 0.924767,0.224636,-0.307154,1.521298,0.332708,-0.580972,
+ 0.97102,0.238998,0,1.564666,0.208184,-0.5,
+ 0.924767,0.224636,-0.307154,1.521298,0.332708,-0.580972,
+ 0.924854,0.216174,-0.312912,1.554547,0.202755,-0.574544,
+ 0.968395,0.249424,0,1.531587,0.340261,-0.5,
+ 0.964484,0.264141,0,1.502855,0.449898,-0.5,
+ 0.922813,0.236109,-0.304415,1.492239,0.440457,-0.587736,
+ 0.922813,0.236109,-0.304415,1.492239,0.440457,-0.587736,
+ 0.924767,0.224636,-0.307154,1.521298,0.332708,-0.580972,
+ 0.968395,0.249424,0,1.531587,0.340261,-0.5,
+ 0.721766,0.139046,-0.678027,1.558275,0.051411,-0.627772,
+ 0.68395,0.1429,-0.715397,1.589301,-0.085107,-0.624049,
+ 0.923419,0.19798,-0.328787,1.620986,-0.080049,-0.567663,
+ 0.923419,0.19798,-0.328787,1.620986,-0.080049,-0.567663,
+ 0.924112,0.20782,-0.320669,1.588828,0.061527,-0.569694,
+ 0.721766,0.139046,-0.678027,1.558275,0.051411,-0.627772,
+ 0.976556,0.215262,0,1.631547,-0.078363,-0.5,
+ 0.973545,0.228495,0,1.599013,0.064899,-0.5,
+ 0.924112,0.20782,-0.320669,1.588828,0.061527,-0.569694,
+ 0.976556,0.215262,0,1.631547,-0.078363,-0.5,
+ 0.924112,0.20782,-0.320669,1.588828,0.061527,-0.569694,
+ 0.923419,0.19798,-0.328787,1.620986,-0.080049,-0.567663,
+ 0.973545,0.228495,0,1.599013,0.064899,-0.5,
+ 0.97102,0.238998,0,1.564666,0.208184,-0.5,
+ 0.924854,0.216174,-0.312912,1.554547,0.202755,-0.574544,
+ 0.924854,0.216174,-0.312912,1.554547,0.202755,-0.574544,
+ 0.924112,0.20782,-0.320669,1.588828,0.061527,-0.569694,
+ 0.973545,0.228495,0,1.599013,0.064899,-0.5,
+ 0.734405,0.137212,-0.664697,1.524188,0.186469,-0.636664,
+ 0.721766,0.139046,-0.678027,1.558275,0.051411,-0.627772,
+ 0.924112,0.20782,-0.320669,1.588828,0.061527,-0.569694,
+ 0.734405,0.137212,-0.664697,1.524188,0.186469,-0.636664,
+ 0.924112,0.20782,-0.320669,1.588828,0.061527,-0.569694,
+ 0.924854,0.216174,-0.312912,1.554547,0.202755,-0.574544,
+ 0.923419,0.19798,0.328787,1.620986,-0.080049,-0.432337,
+ 0.68395,0.1429,0.715397,1.589301,-0.085107,-0.375951,
+ 0.721766,0.139046,0.678027,1.558275,0.051411,-0.372228,
+ 0.721766,0.139046,0.678027,1.558275,0.051411,-0.372228,
+ 0.924112,0.20782,0.320669,1.588828,0.061527,-0.430306,
+ 0.923419,0.19798,0.328787,1.620986,-0.080049,-0.432337,
+ 0.734405,0.137212,0.664697,1.524188,0.186469,-0.363336,
+ 0.924854,0.216174,0.312912,1.554547,0.202755,-0.425456,
+ 0.924112,0.20782,0.320669,1.588828,0.061527,-0.430306,
+ 0.734405,0.137212,0.664697,1.524188,0.186469,-0.363336,
+ 0.924112,0.20782,0.320669,1.588828,0.061527,-0.430306,
+ 0.721766,0.139046,0.678027,1.558275,0.051411,-0.372228,
+ 0.924854,0.216174,0.312912,1.554547,0.202755,-0.425456,
+ 0.97102,0.238998,0,1.564666,0.208184,-0.5,
+ 0.973545,0.228495,0,1.599013,0.064899,-0.5,
+ 0.973545,0.228495,0,1.599013,0.064899,-0.5,
+ 0.924112,0.20782,0.320669,1.588828,0.061527,-0.430306,
+ 0.924854,0.216174,0.312912,1.554547,0.202755,-0.425456,
+ 0.976556,0.215262,0,1.631547,-0.078363,-0.5,
+ 0.923419,0.19798,0.328787,1.620986,-0.080049,-0.432337,
+ 0.924112,0.20782,0.320669,1.588828,0.061527,-0.430306,
+ 0.976556,0.215262,0,1.631547,-0.078363,-0.5,
+ 0.924112,0.20782,0.320669,1.588828,0.061527,-0.430306,
+ 0.973545,0.228495,0,1.599013,0.064899,-0.5,
+ 0.751095,0.142007,0.644741,1.460394,0.412133,-0.339151,
+ 0.922813,0.236109,0.304415,1.492239,0.440457,-0.412264,
+ 0.924767,0.224636,0.307154,1.521298,0.332708,-0.419028,
+ 0.751095,0.142007,0.644741,1.460394,0.412133,-0.339151,
+ 0.924767,0.224636,0.307154,1.521298,0.332708,-0.419028,
+ 0.74475,0.138417,0.652831,1.49043,0.310049,-0.351552,
+ 0.922813,0.236109,0.304415,1.492239,0.440457,-0.412264,
+ 0.964484,0.264141,0,1.502855,0.449898,-0.5,
+ 0.968395,0.249424,0,1.531587,0.340261,-0.5,
+ 0.968395,0.249424,0,1.531587,0.340261,-0.5,
+ 0.924767,0.224636,0.307154,1.521298,0.332708,-0.419028,
+ 0.922813,0.236109,0.304415,1.492239,0.440457,-0.412264,
+ 0.97102,0.238998,0,1.564666,0.208184,-0.5,
+ 0.924854,0.216174,0.312912,1.554547,0.202755,-0.425456,
+ 0.924767,0.224636,0.307154,1.521298,0.332708,-0.419028,
+ 0.97102,0.238998,0,1.564666,0.208184,-0.5,
+ 0.924767,0.224636,0.307154,1.521298,0.332708,-0.419028,
+ 0.968395,0.249424,0,1.531587,0.340261,-0.5,
+ 0.924854,0.216174,0.312912,1.554547,0.202755,-0.425456,
+ 0.734405,0.137212,0.664697,1.524188,0.186469,-0.363336,
+ 0.74475,0.138417,0.652831,1.49043,0.310049,-0.351552,
+ 0.74475,0.138417,0.652831,1.49043,0.310049,-0.351552,
+ 0.924767,0.224636,0.307154,1.521298,0.332708,-0.419028,
+ 0.924854,0.216174,0.312912,1.554547,0.202755,-0.425456,
+ -0.503423,-0.512227,-0.695836,1.226863,0.204423,-0.660849,
+ -0.575759,-0.440808,-0.688615,1.264067,0.143881,-0.648448,
+ -0.232261,-0.293469,-0.927325,1.315513,0.181646,-0.688934,
+ -0.503423,-0.512227,-0.695836,1.226863,0.204423,-0.660849,
+ -0.232261,-0.293469,-0.927325,1.315513,0.181646,-0.688934,
+ -0.17234,-0.336344,-0.925836,1.279939,0.25163,-0.704717,
+ -0.575759,-0.440808,-0.688615,1.264067,0.143881,-0.648448,
+ -0.637408,-0.358226,-0.682191,1.301556,0.067036,-0.636664,
+ -0.287334,-0.241218,-0.926959,1.352154,0.09418,-0.673936,
+ -0.287334,-0.241218,-0.926959,1.352154,0.09418,-0.673936,
+ -0.232261,-0.293469,-0.927325,1.315513,0.181646,-0.688934,
+ -0.575759,-0.440808,-0.688615,1.264067,0.143881,-0.648448,
+ 0.061121,-0.115002,-0.991483,1.412872,0.126752,-0.68636,
+ 0.103365,-0.143519,-0.984235,1.377249,0.226965,-0.70243,
+ -0.232261,-0.293469,-0.927325,1.315513,0.181646,-0.688934,
+ 0.061121,-0.115002,-0.991483,1.412872,0.126752,-0.68636,
+ -0.232261,-0.293469,-0.927325,1.315513,0.181646,-0.688934,
+ -0.287334,-0.241218,-0.926959,1.352154,0.09418,-0.673936,
+ 0.103365,-0.143519,-0.984235,1.377249,0.226965,-0.70243,
+ 0.144715,-0.16618,-0.975419,1.343629,0.308278,-0.71934,
+ -0.17234,-0.336344,-0.925836,1.279939,0.25163,-0.704717,
+ -0.17234,-0.336344,-0.925836,1.279939,0.25163,-0.704717,
+ -0.232261,-0.293469,-0.927325,1.315513,0.181646,-0.688934,
+ 0.103365,-0.143519,-0.984235,1.377249,0.226965,-0.70243,
+ -0.686016,-0.251158,-0.682863,1.33422,-0.022771,-0.627772,
+ -0.71415,-0.110296,-0.691249,1.356947,-0.122198,-0.624049,
+ -0.355153,-0.061801,-0.932763,1.409755,-0.113768,-0.657881,
+ -0.355153,-0.061801,-0.932763,1.409755,-0.113768,-0.657881,
+ -0.331282,-0.167258,-0.928589,1.385142,-0.005911,-0.662619,
+ -0.686016,-0.251158,-0.682863,1.33422,-0.022771,-0.627772,
+ -0.032665,-0.015822,-0.999341,1.473124,-0.103652,-0.669158,
+ 0.024003,-0.070986,-0.997189,1.446248,0.01432,-0.674234,
+ -0.331282,-0.167258,-0.928589,1.385142,-0.005911,-0.662619,
+ -0.032665,-0.015822,-0.999341,1.473124,-0.103652,-0.669158,
+ -0.331282,-0.167258,-0.928589,1.385142,-0.005911,-0.662619,
+ -0.355153,-0.061801,-0.932763,1.409755,-0.113768,-0.657881,
+ 0.024003,-0.070986,-0.997189,1.446248,0.01432,-0.674234,
+ 0.061121,-0.115002,-0.991483,1.412872,0.126752,-0.68636,
+ -0.287334,-0.241218,-0.926959,1.352154,0.09418,-0.673936,
+ -0.287334,-0.241218,-0.926959,1.352154,0.09418,-0.673936,
+ -0.331282,-0.167258,-0.928589,1.385142,-0.005911,-0.662619,
+ 0.024003,-0.070986,-0.997189,1.446248,0.01432,-0.674234,
+ -0.637408,-0.358226,-0.682191,1.301556,0.067036,-0.636664,
+ -0.686016,-0.251158,-0.682863,1.33422,-0.022771,-0.627772,
+ -0.331282,-0.167258,-0.928589,1.385142,-0.005911,-0.662619,
+ -0.637408,-0.358226,-0.682191,1.301556,0.067036,-0.636664,
+ -0.331282,-0.167258,-0.928589,1.385142,-0.005911,-0.662619,
+ -0.287334,-0.241218,-0.926959,1.352154,0.09418,-0.673936,
+ 0.68395,0.1429,-0.715397,1.589301,-0.085107,-0.624049,
+ 0.721766,0.139046,-0.678027,1.558275,0.051411,-0.627772,
+ 0.376201,0.032359,-0.925973,1.507354,0.034552,-0.662619,
+ 0.68395,0.1429,-0.715397,1.589301,-0.085107,-0.624049,
+ 0.376201,0.032359,-0.925973,1.507354,0.034552,-0.662619,
+ 0.294772,0.058288,-0.953788,1.536493,-0.093537,-0.657881,
+ 0.721766,0.139046,-0.678027,1.558275,0.051411,-0.627772,
+ 0.734405,0.137212,-0.664697,1.524188,0.186469,-0.636664,
+ 0.403594,0.012135,-0.914858,1.47359,0.159325,-0.673936,
+ 0.403594,0.012135,-0.914858,1.47359,0.159325,-0.673936,
+ 0.376201,0.032359,-0.925973,1.507354,0.034552,-0.662619,
+ 0.721766,0.139046,-0.678027,1.558275,0.051411,-0.627772,
+ 0.061121,-0.115002,-0.991483,1.412872,0.126752,-0.68636,
+ 0.024003,-0.070986,-0.997189,1.446248,0.01432,-0.674234,
+ 0.376201,0.032359,-0.925973,1.507354,0.034552,-0.662619,
+ 0.061121,-0.115002,-0.991483,1.412872,0.126752,-0.68636,
+ 0.376201,0.032359,-0.925973,1.507354,0.034552,-0.662619,
+ 0.403594,0.012135,-0.914858,1.47359,0.159325,-0.673936,
+ 0.024003,-0.070986,-0.997189,1.446248,0.01432,-0.674234,
+ -0.032665,-0.015822,-0.999341,1.473124,-0.103652,-0.669158,
+ 0.294772,0.058288,-0.953788,1.536493,-0.093537,-0.657881,
+ 0.294772,0.058288,-0.953788,1.536493,-0.093537,-0.657881,
+ 0.376201,0.032359,-0.925973,1.507354,0.034552,-0.662619,
+ 0.024003,-0.070986,-0.997189,1.446248,0.01432,-0.674234,
+ 0.74475,0.138417,-0.652831,1.49043,0.310049,-0.648448,
+ 0.751095,0.142007,-0.644741,1.460394,0.412133,-0.660849,
+ 0.45328,-0.007609,-0.891335,1.407319,0.364926,-0.704717,
+ 0.45328,-0.007609,-0.891335,1.407319,0.364926,-0.704717,
+ 0.430582,0.000669,-0.902551,1.438984,0.272283,-0.688934,
+ 0.74475,0.138417,-0.652831,1.49043,0.310049,-0.648448,
+ 0.144715,-0.16618,-0.975419,1.343629,0.308278,-0.71934,
+ 0.103365,-0.143519,-0.984235,1.377249,0.226965,-0.70243,
+ 0.430582,0.000669,-0.902551,1.438984,0.272283,-0.688934,
+ 0.144715,-0.16618,-0.975419,1.343629,0.308278,-0.71934,
+ 0.430582,0.000669,-0.902551,1.438984,0.272283,-0.688934,
+ 0.45328,-0.007609,-0.891335,1.407319,0.364926,-0.704717,
+ 0.103365,-0.143519,-0.984235,1.377249,0.226965,-0.70243,
+ 0.061121,-0.115002,-0.991483,1.412872,0.126752,-0.68636,
+ 0.403594,0.012135,-0.914858,1.47359,0.159325,-0.673936,
+ 0.403594,0.012135,-0.914858,1.47359,0.159325,-0.673936,
+ 0.430582,0.000669,-0.902551,1.438984,0.272283,-0.688934,
+ 0.103365,-0.143519,-0.984235,1.377249,0.226965,-0.70243,
+ 0.734405,0.137212,-0.664697,1.524188,0.186469,-0.636664,
+ 0.74475,0.138417,-0.652831,1.49043,0.310049,-0.648448,
+ 0.430582,0.000669,-0.902551,1.438984,0.272283,-0.688934,
+ 0.734405,0.137212,-0.664697,1.524188,0.186469,-0.636664,
+ 0.430582,0.000669,-0.902551,1.438984,0.272283,-0.688934,
+ 0.403594,0.012135,-0.914858,1.47359,0.159325,-0.673936,
+ -0.503423,-0.512227,0.695837,1.226863,0.204423,-0.339151,
+ -0.17234,-0.336344,0.925836,1.279939,0.25163,-0.295283,
+ -0.232261,-0.293468,0.927325,1.315513,0.181646,-0.311066,
+ -0.503423,-0.512227,0.695837,1.226863,0.204423,-0.339151,
+ -0.232261,-0.293468,0.927325,1.315513,0.181646,-0.311066,
+ -0.575759,-0.440808,0.688615,1.264067,0.143881,-0.351552,
+ -0.17234,-0.336344,0.925836,1.279939,0.25163,-0.295283,
+ 0.144715,-0.16618,0.975419,1.343629,0.308278,-0.28066,
+ 0.103365,-0.143519,0.984235,1.377249,0.226965,-0.29757,
+ 0.103365,-0.143519,0.984235,1.377249,0.226965,-0.29757,
+ -0.232261,-0.293468,0.927325,1.315513,0.181646,-0.311066,
+ -0.17234,-0.336344,0.925836,1.279939,0.25163,-0.295283,
+ 0.061121,-0.115002,0.991483,1.412872,0.126752,-0.31364,
+ -0.287334,-0.241218,0.926959,1.352154,0.09418,-0.326064,
+ -0.232261,-0.293468,0.927325,1.315513,0.181646,-0.311066,
+ 0.061121,-0.115002,0.991483,1.412872,0.126752,-0.31364,
+ -0.232261,-0.293468,0.927325,1.315513,0.181646,-0.311066,
+ 0.103365,-0.143519,0.984235,1.377249,0.226965,-0.29757,
+ -0.287334,-0.241218,0.926959,1.352154,0.09418,-0.326064,
+ -0.637408,-0.358226,0.682191,1.301556,0.067036,-0.363336,
+ -0.575759,-0.440808,0.688615,1.264067,0.143881,-0.351552,
+ -0.575759,-0.440808,0.688615,1.264067,0.143881,-0.351552,
+ -0.232261,-0.293468,0.927325,1.315513,0.181646,-0.311066,
+ -0.287334,-0.241218,0.926959,1.352154,0.09418,-0.326064,
+ 0.45328,-0.00761,0.891335,1.407319,0.364926,-0.295283,
+ 0.751095,0.142007,0.644741,1.460394,0.412133,-0.339151,
+ 0.74475,0.138417,0.652831,1.49043,0.310049,-0.351552,
+ 0.74475,0.138417,0.652831,1.49043,0.310049,-0.351552,
+ 0.430582,0.000669,0.902551,1.438984,0.272283,-0.311066,
+ 0.45328,-0.00761,0.891335,1.407319,0.364926,-0.295283,
+ 0.734405,0.137212,0.664697,1.524188,0.186469,-0.363336,
+ 0.403594,0.012135,0.914858,1.47359,0.159325,-0.326064,
+ 0.430582,0.000669,0.902551,1.438984,0.272283,-0.311066,
+ 0.734405,0.137212,0.664697,1.524188,0.186469,-0.363336,
+ 0.430582,0.000669,0.902551,1.438984,0.272283,-0.311066,
+ 0.74475,0.138417,0.652831,1.49043,0.310049,-0.351552,
+ 0.403594,0.012135,0.914858,1.47359,0.159325,-0.326064,
+ 0.061121,-0.115002,0.991483,1.412872,0.126752,-0.31364,
+ 0.103365,-0.143519,0.984235,1.377249,0.226965,-0.29757,
+ 0.103365,-0.143519,0.984235,1.377249,0.226965,-0.29757,
+ 0.430582,0.000669,0.902551,1.438984,0.272283,-0.311066,
+ 0.403594,0.012135,0.914858,1.47359,0.159325,-0.326064,
+ 0.144715,-0.16618,0.975419,1.343629,0.308278,-0.28066,
+ 0.45328,-0.00761,0.891335,1.407319,0.364926,-0.295283,
+ 0.430582,0.000669,0.902551,1.438984,0.272283,-0.311066,
+ 0.144715,-0.16618,0.975419,1.343629,0.308278,-0.28066,
+ 0.430582,0.000669,0.902551,1.438984,0.272283,-0.311066,
+ 0.103365,-0.143519,0.984235,1.377249,0.226965,-0.29757,
+ 0.68395,0.1429,0.715397,1.589301,-0.085107,-0.375951,
+ 0.294772,0.058287,0.953788,1.536493,-0.093537,-0.342119,
+ 0.376201,0.032359,0.925973,1.507354,0.034552,-0.337381,
+ 0.68395,0.1429,0.715397,1.589301,-0.085107,-0.375951,
+ 0.376201,0.032359,0.925973,1.507354,0.034552,-0.337381,
+ 0.721766,0.139046,0.678027,1.558275,0.051411,-0.372228,
+ 0.294772,0.058287,0.953788,1.536493,-0.093537,-0.342119,
+ -0.032665,-0.015822,0.999341,1.473124,-0.103652,-0.330842,
+ 0.024003,-0.070986,0.997189,1.446248,0.01432,-0.325766,
+ 0.024003,-0.070986,0.997189,1.446248,0.01432,-0.325766,
+ 0.376201,0.032359,0.925973,1.507354,0.034552,-0.337381,
+ 0.294772,0.058287,0.953788,1.536493,-0.093537,-0.342119,
+ 0.061121,-0.115002,0.991483,1.412872,0.126752,-0.31364,
+ 0.403594,0.012135,0.914858,1.47359,0.159325,-0.326064,
+ 0.376201,0.032359,0.925973,1.507354,0.034552,-0.337381,
+ 0.061121,-0.115002,0.991483,1.412872,0.126752,-0.31364,
+ 0.376201,0.032359,0.925973,1.507354,0.034552,-0.337381,
+ 0.024003,-0.070986,0.997189,1.446248,0.01432,-0.325766,
+ 0.403594,0.012135,0.914858,1.47359,0.159325,-0.326064,
+ 0.734405,0.137212,0.664697,1.524188,0.186469,-0.363336,
+ 0.721766,0.139046,0.678027,1.558275,0.051411,-0.372228,
+ 0.721766,0.139046,0.678027,1.558275,0.051411,-0.372228,
+ 0.376201,0.032359,0.925973,1.507354,0.034552,-0.337381,
+ 0.403594,0.012135,0.914858,1.47359,0.159325,-0.326064,
+ -0.355153,-0.061801,0.932763,1.409755,-0.113768,-0.342119,
+ -0.714149,-0.110296,0.691249,1.356947,-0.122198,-0.375951,
+ -0.686016,-0.251158,0.682863,1.33422,-0.022771,-0.372228,
+ -0.686016,-0.251158,0.682863,1.33422,-0.022771,-0.372228,
+ -0.331282,-0.167257,0.928589,1.385142,-0.005911,-0.337381,
+ -0.355153,-0.061801,0.932763,1.409755,-0.113768,-0.342119,
+ -0.637408,-0.358226,0.682191,1.301556,0.067036,-0.363336,
+ -0.287334,-0.241218,0.926959,1.352154,0.09418,-0.326064,
+ -0.331282,-0.167257,0.928589,1.385142,-0.005911,-0.337381,
+ -0.637408,-0.358226,0.682191,1.301556,0.067036,-0.363336,
+ -0.331282,-0.167257,0.928589,1.385142,-0.005911,-0.337381,
+ -0.686016,-0.251158,0.682863,1.33422,-0.022771,-0.372228,
+ -0.287334,-0.241218,0.926959,1.352154,0.09418,-0.326064,
+ 0.061121,-0.115002,0.991483,1.412872,0.126752,-0.31364,
+ 0.024003,-0.070986,0.997189,1.446248,0.01432,-0.325766,
+ 0.024003,-0.070986,0.997189,1.446248,0.01432,-0.325766,
+ -0.331282,-0.167257,0.928589,1.385142,-0.005911,-0.337381,
+ -0.287334,-0.241218,0.926959,1.352154,0.09418,-0.326064,
+ -0.032665,-0.015822,0.999341,1.473124,-0.103652,-0.330842,
+ -0.355153,-0.061801,0.932763,1.409755,-0.113768,-0.342119,
+ -0.331282,-0.167257,0.928589,1.385142,-0.005911,-0.337381,
+ -0.032665,-0.015822,0.999341,1.473124,-0.103652,-0.330842,
+ -0.331282,-0.167257,0.928589,1.385142,-0.005911,-0.337381,
+ 0.024003,-0.070986,0.997189,1.446248,0.01432,-0.325766,
+ -0.575759,-0.440808,-0.688615,1.264067,0.143881,-0.648448,
+ -0.503423,-0.512227,-0.695836,1.226863,0.204423,-0.660849,
+ -0.715537,-0.612433,-0.336055,1.195018,0.176099,-0.587736,
+ -0.715537,-0.612433,-0.336055,1.195018,0.176099,-0.587736,
+ -0.788495,-0.519776,-0.328798,1.2332,0.121222,-0.580972,
+ -0.575759,-0.440808,-0.688615,1.264067,0.143881,-0.648448,
+ -0.784292,-0.620391,0,1.184403,0.166658,-0.5,
+ -0.853449,-0.521176,0,1.222911,0.113669,-0.5,
+ -0.788495,-0.519776,-0.328798,1.2332,0.121222,-0.580972,
+ -0.784292,-0.620391,0,1.184403,0.166658,-0.5,
+ -0.788495,-0.519776,-0.328798,1.2332,0.121222,-0.580972,
+ -0.715537,-0.612433,-0.336055,1.195018,0.176099,-0.587736,
+ -0.853449,-0.521176,0,1.222911,0.113669,-0.5,
+ -0.912287,-0.409552,0,1.261078,0.045321,-0.5,
+ -0.849326,-0.416862,-0.323838,1.271198,0.05075,-0.574544,
+ -0.849326,-0.416862,-0.323838,1.271198,0.05075,-0.574544,
+ -0.788495,-0.519776,-0.328798,1.2332,0.121222,-0.580972,
+ -0.853449,-0.521176,0,1.222911,0.113669,-0.5,
+ -0.637408,-0.358226,-0.682191,1.301556,0.067036,-0.636664,
+ -0.575759,-0.440808,-0.688615,1.264067,0.143881,-0.648448,
+ -0.788495,-0.519776,-0.328798,1.2332,0.121222,-0.580972,
+ -0.637408,-0.358226,-0.682191,1.301556,0.067036,-0.636664,
+ -0.788495,-0.519776,-0.328798,1.2332,0.121222,-0.580972,
+ -0.849326,-0.416862,-0.323838,1.271198,0.05075,-0.574544,
+ -0.715537,-0.612433,0.336055,1.195018,0.176099,-0.412264,
+ -0.503423,-0.512227,0.695837,1.226863,0.204423,-0.339151,
+ -0.575759,-0.440808,0.688615,1.264067,0.143881,-0.351552,
+ -0.575759,-0.440808,0.688615,1.264067,0.143881,-0.351552,
+ -0.788495,-0.519776,0.328798,1.2332,0.121222,-0.419028,
+ -0.715537,-0.612433,0.336055,1.195018,0.176099,-0.412264,
+ -0.637408,-0.358226,0.682191,1.301556,0.067036,-0.363336,
+ -0.849326,-0.416862,0.323838,1.271198,0.05075,-0.425456,
+ -0.788495,-0.519776,0.328798,1.2332,0.121222,-0.419028,
+ -0.637408,-0.358226,0.682191,1.301556,0.067036,-0.363336,
+ -0.788495,-0.519776,0.328798,1.2332,0.121222,-0.419028,
+ -0.575759,-0.440808,0.688615,1.264067,0.143881,-0.351552,
+ -0.849326,-0.416862,0.323838,1.271198,0.05075,-0.425456,
+ -0.912287,-0.409552,0,1.261078,0.045321,-0.5,
+ -0.853449,-0.521176,0,1.222911,0.113669,-0.5,
+ -0.853449,-0.521176,0,1.222911,0.113669,-0.5,
+ -0.788495,-0.519776,0.328798,1.2332,0.121222,-0.419028,
+ -0.849326,-0.416862,0.323838,1.271198,0.05075,-0.425456,
+ -0.784292,-0.620391,0,1.184403,0.166658,-0.5,
+ -0.715537,-0.612433,0.336055,1.195018,0.176099,-0.412264,
+ -0.788495,-0.519776,0.328798,1.2332,0.121222,-0.419028,
+ -0.784292,-0.620391,0,1.184403,0.166658,-0.5,
+ -0.788495,-0.519776,0.328798,1.2332,0.121222,-0.419028,
+ -0.853449,-0.521176,0,1.222911,0.113669,-0.5,
+ -0.714149,-0.110296,0.691249,1.356947,-0.122198,-0.375951,
+ -0.933801,-0.132296,0.332437,1.325262,-0.127256,-0.432337,
+ -0.899929,-0.290508,0.325166,1.303667,-0.032887,-0.430306,
+ -0.714149,-0.110296,0.691249,1.356947,-0.122198,-0.375951,
+ -0.899929,-0.290508,0.325166,1.303667,-0.032887,-0.430306,
+ -0.686016,-0.251158,0.682863,1.33422,-0.022771,-0.372228,
+ -0.933801,-0.132296,0.332437,1.325262,-0.127256,-0.432337,
+ -0.994338,-0.106266,0,1.314701,-0.128942,-0.5,
+ -0.961859,-0.273547,0,1.293483,-0.036258,-0.5,
+ -0.961859,-0.273547,0,1.293483,-0.036258,-0.5,
+ -0.899929,-0.290508,0.325166,1.303667,-0.032887,-0.430306,
+ -0.933801,-0.132296,0.332437,1.325262,-0.127256,-0.432337,
+ -0.912287,-0.409552,0,1.261078,0.045321,-0.5,
+ -0.849326,-0.416862,0.323838,1.271198,0.05075,-0.425456,
+ -0.899929,-0.290508,0.325166,1.303667,-0.032887,-0.430306,
+ -0.912287,-0.409552,0,1.261078,0.045321,-0.5,
+ -0.899929,-0.290508,0.325166,1.303667,-0.032887,-0.430306,
+ -0.961859,-0.273547,0,1.293483,-0.036258,-0.5,
+ -0.849326,-0.416862,0.323838,1.271198,0.05075,-0.425456,
+ -0.637408,-0.358226,0.682191,1.301556,0.067036,-0.363336,
+ -0.686016,-0.251158,0.682863,1.33422,-0.022771,-0.372228,
+ -0.686016,-0.251158,0.682863,1.33422,-0.022771,-0.372228,
+ -0.899929,-0.290508,0.325166,1.303667,-0.032887,-0.430306,
+ -0.849326,-0.416862,0.323838,1.271198,0.05075,-0.425456,
+ -0.71415,-0.110296,-0.691249,1.356947,-0.122198,-0.624049,
+ -0.686016,-0.251158,-0.682863,1.33422,-0.022771,-0.627772,
+ -0.899929,-0.290508,-0.325166,1.303667,-0.032887,-0.569694,
+ -0.71415,-0.110296,-0.691249,1.356947,-0.122198,-0.624049,
+ -0.899929,-0.290508,-0.325166,1.303667,-0.032887,-0.569694,
+ -0.933801,-0.132296,-0.332437,1.325262,-0.127256,-0.567663,
+ -0.686016,-0.251158,-0.682863,1.33422,-0.022771,-0.627772,
+ -0.637408,-0.358226,-0.682191,1.301556,0.067036,-0.636664,
+ -0.849326,-0.416862,-0.323838,1.271198,0.05075,-0.574544,
+ -0.849326,-0.416862,-0.323838,1.271198,0.05075,-0.574544,
+ -0.899929,-0.290508,-0.325166,1.303667,-0.032887,-0.569694,
+ -0.686016,-0.251158,-0.682863,1.33422,-0.022771,-0.627772,
+ -0.912287,-0.409552,0,1.261078,0.045321,-0.5,
+ -0.961859,-0.273547,0,1.293483,-0.036258,-0.5,
+ -0.899929,-0.290508,-0.325166,1.303667,-0.032887,-0.569694,
+ -0.912287,-0.409552,0,1.261078,0.045321,-0.5,
+ -0.899929,-0.290508,-0.325166,1.303667,-0.032887,-0.569694,
+ -0.849326,-0.416862,-0.323838,1.271198,0.05075,-0.574544,
+ -0.961859,-0.273547,0,1.293483,-0.036258,-0.5,
+ -0.994338,-0.106266,0,1.314701,-0.128942,-0.5,
+ -0.933801,-0.132296,-0.332437,1.325262,-0.127256,-0.567663,
+ -0.933801,-0.132296,-0.332437,1.325262,-0.127256,-0.567663,
+ -0.899929,-0.290508,-0.325166,1.303667,-0.032887,-0.569694,
+ -0.961859,-0.273547,0,1.293483,-0.036258,-0.5,
+ -0.693871,0.192788,-0.693812,1.351552,-0.429344,-0.648448,
+ -0.686951,0.237061,-0.686951,1.339151,-0.510672,-0.660849,
+ -0.336776,0.225597,-0.91416,1.412264,-0.510672,-0.704717,
+ -0.336776,0.225597,-0.91416,1.412264,-0.510672,-0.704717,
+ -0.340683,0.181594,-0.922474,1.419028,-0.429344,-0.688934,
+ -0.693871,0.192788,-0.693812,1.351552,-0.429344,-0.648448,
+ 0,0.216323,-0.976322,1.5,-0.510672,-0.71934,
+ -0.000776,0.175432,-0.984491,1.5,-0.429344,-0.70243,
+ -0.340683,0.181594,-0.922474,1.419028,-0.429344,-0.688934,
+ 0,0.216323,-0.976322,1.5,-0.510672,-0.71934,
+ -0.340683,0.181594,-0.922474,1.419028,-0.429344,-0.688934,
+ -0.336776,0.225597,-0.91416,1.412264,-0.510672,-0.704717,
+ -0.000776,0.175432,-0.984491,1.5,-0.429344,-0.70243,
+ -0.003469,0.126882,-0.991912,1.497312,-0.330832,-0.68636,
+ -0.347569,0.124206,-0.929392,1.423198,-0.331844,-0.673936,
+ -0.347569,0.124206,-0.929392,1.423198,-0.331844,-0.673936,
+ -0.340683,0.181594,-0.922474,1.419028,-0.429344,-0.688934,
+ -0.000776,0.175432,-0.984491,1.5,-0.429344,-0.70243,
+ -0.702754,0.131399,-0.699193,1.361436,-0.332687,-0.636664,
+ -0.693871,0.192788,-0.693812,1.351552,-0.429344,-0.648448,
+ -0.340683,0.181594,-0.922474,1.419028,-0.429344,-0.688934,
+ -0.702754,0.131399,-0.699193,1.361436,-0.332687,-0.636664,
+ -0.340683,0.181594,-0.922474,1.419028,-0.429344,-0.688934,
+ -0.347569,0.124206,-0.929392,1.423198,-0.331844,-0.673936,
+ 0.336776,0.225597,-0.91416,1.587736,-0.510672,-0.704717,
+ 0.686951,0.237061,-0.686951,1.660849,-0.510672,-0.660849,
+ 0.692333,0.202928,-0.692456,1.648448,-0.429344,-0.648448,
+ 0.692333,0.202928,-0.692456,1.648448,-0.429344,-0.648448,
+ 0.339336,0.190036,-0.92127,1.580972,-0.429344,-0.688934,
+ 0.336776,0.225597,-0.91416,1.587736,-0.510672,-0.704717,
+ 0.695529,0.18142,-0.695217,1.633189,-0.328978,-0.636664,
+ 0.341595,0.155693,-0.926862,1.571427,-0.329821,-0.673936,
+ 0.339336,0.190036,-0.92127,1.580972,-0.429344,-0.688934,
+ 0.695529,0.18142,-0.695217,1.633189,-0.328978,-0.636664,
+ 0.339336,0.190036,-0.92127,1.580972,-0.429344,-0.688934,
+ 0.692333,0.202928,-0.692456,1.648448,-0.429344,-0.648448,
+ 0.341595,0.155693,-0.926862,1.571427,-0.329821,-0.673936,
+ -0.003469,0.126882,-0.991912,1.497312,-0.330832,-0.68636,
+ -0.000776,0.175432,-0.984491,1.5,-0.429344,-0.70243,
+ -0.000776,0.175432,-0.984491,1.5,-0.429344,-0.70243,
+ 0.339336,0.190036,-0.92127,1.580972,-0.429344,-0.688934,
+ 0.341595,0.155693,-0.926862,1.571427,-0.329821,-0.673936,
+ 0,0.216323,-0.976322,1.5,-0.510672,-0.71934,
+ 0.336776,0.225597,-0.91416,1.587736,-0.510672,-0.704717,
+ 0.339336,0.190036,-0.92127,1.580972,-0.429344,-0.688934,
+ 0,0.216323,-0.976322,1.5,-0.510672,-0.71934,
+ 0.339336,0.190036,-0.92127,1.580972,-0.429344,-0.688934,
+ -0.000776,0.175432,-0.984491,1.5,-0.429344,-0.70243,
+ 0.68395,0.1429,-0.715397,1.589301,-0.085107,-0.624049,
+ 0.294772,0.058288,-0.953788,1.536493,-0.093537,-0.657881,
+ 0.345572,0.118142,-0.930926,1.557226,-0.21644,-0.662619,
+ 0.68395,0.1429,-0.715397,1.589301,-0.085107,-0.624049,
+ 0.345572,0.118142,-0.930926,1.557226,-0.21644,-0.662619,
+ 0.699329,0.164944,-0.695509,1.613873,-0.213068,-0.627772,
+ 0.294772,0.058288,-0.953788,1.536493,-0.093537,-0.657881,
+ -0.032665,-0.015822,-0.999341,1.473124,-0.103652,-0.669158,
+ -0.00536,0.065692,-0.997826,1.489249,-0.220486,-0.674234,
+ -0.00536,0.065692,-0.997826,1.489249,-0.220486,-0.674234,
+ 0.345572,0.118142,-0.930926,1.557226,-0.21644,-0.662619,
+ 0.294772,0.058288,-0.953788,1.536493,-0.093537,-0.657881,
+ -0.003469,0.126882,-0.991912,1.497312,-0.330832,-0.68636,
+ 0.341595,0.155693,-0.926862,1.571427,-0.329821,-0.673936,
+ 0.345572,0.118142,-0.930926,1.557226,-0.21644,-0.662619,
+ -0.003469,0.126882,-0.991912,1.497312,-0.330832,-0.68636,
+ 0.345572,0.118142,-0.930926,1.557226,-0.21644,-0.662619,
+ -0.00536,0.065692,-0.997826,1.489249,-0.220486,-0.674234,
+ 0.341595,0.155693,-0.926862,1.571427,-0.329821,-0.673936,
+ 0.695529,0.18142,-0.695217,1.633189,-0.328978,-0.636664,
+ 0.699329,0.164944,-0.695509,1.613873,-0.213068,-0.627772,
+ 0.699329,0.164944,-0.695509,1.613873,-0.213068,-0.627772,
+ 0.345572,0.118142,-0.930926,1.557226,-0.21644,-0.662619,
+ 0.341595,0.155693,-0.926862,1.571427,-0.329821,-0.673936,
+ -0.71415,-0.110296,-0.691249,1.356947,-0.122198,-0.624049,
+ -0.739331,0.03305,-0.672531,1.364627,-0.227904,-0.627772,
+ -0.356256,0.046266,-0.933242,1.421273,-0.224532,-0.662619,
+ -0.71415,-0.110296,-0.691249,1.356947,-0.122198,-0.624049,
+ -0.356256,0.046266,-0.933242,1.421273,-0.224532,-0.662619,
+ -0.355153,-0.061801,-0.932763,1.409755,-0.113768,-0.657881,
+ -0.739331,0.03305,-0.672531,1.364627,-0.227904,-0.627772,
+ -0.702754,0.131399,-0.699193,1.361436,-0.332687,-0.636664,
+ -0.347569,0.124206,-0.929392,1.423198,-0.331844,-0.673936,
+ -0.347569,0.124206,-0.929392,1.423198,-0.331844,-0.673936,
+ -0.356256,0.046266,-0.933242,1.421273,-0.224532,-0.662619,
+ -0.739331,0.03305,-0.672531,1.364627,-0.227904,-0.627772,
+ -0.003469,0.126882,-0.991912,1.497312,-0.330832,-0.68636,
+ -0.00536,0.065692,-0.997826,1.489249,-0.220486,-0.674234,
+ -0.356256,0.046266,-0.933242,1.421273,-0.224532,-0.662619,
+ -0.003469,0.126882,-0.991912,1.497312,-0.330832,-0.68636,
+ -0.356256,0.046266,-0.933242,1.421273,-0.224532,-0.662619,
+ -0.347569,0.124206,-0.929392,1.423198,-0.331844,-0.673936,
+ -0.00536,0.065692,-0.997826,1.489249,-0.220486,-0.674234,
+ -0.032665,-0.015822,-0.999341,1.473124,-0.103652,-0.669158,
+ -0.355153,-0.061801,-0.932763,1.409755,-0.113768,-0.657881,
+ -0.355153,-0.061801,-0.932763,1.409755,-0.113768,-0.657881,
+ -0.356256,0.046266,-0.933242,1.421273,-0.224532,-0.662619,
+ -0.00536,0.065692,-0.997826,1.489249,-0.220486,-0.674234,
+ -0.914159,0.225597,-0.336777,1.295283,-0.510672,-0.587736,
+ -0.686951,0.237061,-0.686951,1.339151,-0.510672,-0.660849,
+ -0.693871,0.192788,-0.693812,1.351552,-0.429344,-0.648448,
+ -0.693871,0.192788,-0.693812,1.351552,-0.429344,-0.648448,
+ -0.923459,0.178536,-0.339629,1.311066,-0.429344,-0.580972,
+ -0.914159,0.225597,-0.336777,1.295283,-0.510672,-0.587736,
+ -0.702754,0.131399,-0.699193,1.361436,-0.332687,-0.636664,
+ -0.933761,0.111444,-0.340103,1.324378,-0.333193,-0.574544,
+ -0.923459,0.178536,-0.339629,1.311066,-0.429344,-0.580972,
+ -0.702754,0.131399,-0.699193,1.361436,-0.332687,-0.636664,
+ -0.923459,0.178536,-0.339629,1.311066,-0.429344,-0.580972,
+ -0.693871,0.192788,-0.693812,1.351552,-0.429344,-0.648448,
+ -0.933761,0.111444,-0.340103,1.324378,-0.333193,-0.574544,
+ -0.995379,0.096022,0,1.312026,-0.333361,-0.5,
+ -0.985978,0.166878,0,1.29757,-0.429344,-0.5,
+ -0.985978,0.166878,0,1.29757,-0.429344,-0.5,
+ -0.923459,0.178536,-0.339629,1.311066,-0.429344,-0.580972,
+ -0.933761,0.111444,-0.340103,1.324378,-0.333193,-0.574544,
+ -0.976322,0.216322,0,1.28066,-0.510672,-0.5,
+ -0.914159,0.225597,-0.336777,1.295283,-0.510672,-0.587736,
+ -0.923459,0.178536,-0.339629,1.311066,-0.429344,-0.580972,
+ -0.976322,0.216322,0,1.28066,-0.510672,-0.5,
+ -0.923459,0.178536,-0.339629,1.311066,-0.429344,-0.580972,
+ -0.985978,0.166878,0,1.29757,-0.429344,-0.5,
+ -0.739331,0.03305,-0.672531,1.364627,-0.227904,-0.627772,
+ -0.71415,-0.110296,-0.691249,1.356947,-0.122198,-0.624049,
+ -0.933801,-0.132296,-0.332437,1.325262,-0.127256,-0.567663,
+ -0.933801,-0.132296,-0.332437,1.325262,-0.127256,-0.567663,
+ -0.960211,0.01432,-0.27891,1.330638,-0.229927,-0.569694,
+ -0.739331,0.03305,-0.672531,1.364627,-0.227904,-0.627772,
+ -0.994338,-0.106266,0,1.314701,-0.128942,-0.5,
+ -0.999919,0.012734,0,1.319309,-0.230602,-0.5,
+ -0.960211,0.01432,-0.27891,1.330638,-0.229927,-0.569694,
+ -0.994338,-0.106266,0,1.314701,-0.128942,-0.5,
+ -0.960211,0.01432,-0.27891,1.330638,-0.229927,-0.569694,
+ -0.933801,-0.132296,-0.332437,1.325262,-0.127256,-0.567663,
+ -0.995379,0.096022,0,1.312026,-0.333361,-0.5,
+ -0.933761,0.111444,-0.340103,1.324378,-0.333193,-0.574544,
+ -0.960211,0.01432,-0.27891,1.330638,-0.229927,-0.569694,
+ -0.995379,0.096022,0,1.312026,-0.333361,-0.5,
+ -0.960211,0.01432,-0.27891,1.330638,-0.229927,-0.569694,
+ -0.999919,0.012734,0,1.319309,-0.230602,-0.5,
+ -0.933761,0.111444,-0.340103,1.324378,-0.333193,-0.574544,
+ -0.702754,0.131399,-0.699193,1.361436,-0.332687,-0.636664,
+ -0.739331,0.03305,-0.672531,1.364627,-0.227904,-0.627772,
+ -0.739331,0.03305,-0.672531,1.364627,-0.227904,-0.627772,
+ -0.960211,0.01432,-0.27891,1.330638,-0.229927,-0.569694,
+ -0.933761,0.111444,-0.340103,1.324378,-0.333193,-0.574544,
+ -0.933801,-0.132296,0.332437,1.325262,-0.127256,-0.432337,
+ -0.714149,-0.110296,0.691249,1.356947,-0.122198,-0.375951,
+ -0.739331,0.03305,0.672531,1.364627,-0.227904,-0.372228,
+ -0.739331,0.03305,0.672531,1.364627,-0.227904,-0.372228,
+ -0.960211,0.01432,0.27891,1.330638,-0.229927,-0.430306,
+ -0.933801,-0.132296,0.332437,1.325262,-0.127256,-0.432337,
+ -0.739331,0.03305,0.672531,1.364627,-0.227904,-0.372228,
+ -0.702754,0.131399,0.699193,1.361436,-0.332687,-0.363336,
+ -0.933761,0.111444,0.340103,1.324378,-0.333193,-0.425456,
+ -0.933761,0.111444,0.340103,1.324378,-0.333193,-0.425456,
+ -0.960211,0.01432,0.27891,1.330638,-0.229927,-0.430306,
+ -0.739331,0.03305,0.672531,1.364627,-0.227904,-0.372228,
+ -0.995379,0.096022,0,1.312026,-0.333361,-0.5,
+ -0.999919,0.012734,0,1.319309,-0.230602,-0.5,
+ -0.960211,0.01432,0.27891,1.330638,-0.229927,-0.430306,
+ -0.995379,0.096022,0,1.312026,-0.333361,-0.5,
+ -0.960211,0.01432,0.27891,1.330638,-0.229927,-0.430306,
+ -0.933761,0.111444,0.340103,1.324378,-0.333193,-0.425456,
+ -0.994338,-0.106266,0,1.314701,-0.128942,-0.5,
+ -0.933801,-0.132296,0.332437,1.325262,-0.127256,-0.432337,
+ -0.960211,0.01432,0.27891,1.330638,-0.229927,-0.430306,
+ -0.994338,-0.106266,0,1.314701,-0.128942,-0.5,
+ -0.960211,0.01432,0.27891,1.330638,-0.229927,-0.430306,
+ -0.999919,0.012734,0,1.319309,-0.230602,-0.5,
+ -0.693871,0.192788,0.693812,1.351552,-0.429344,-0.351552,
+ -0.68695,0.237061,0.686951,1.339151,-0.510672,-0.339151,
+ -0.914159,0.225597,0.336777,1.295283,-0.510672,-0.412264,
+ -0.914159,0.225597,0.336777,1.295283,-0.510672,-0.412264,
+ -0.923459,0.178536,0.339629,1.311066,-0.429344,-0.419028,
+ -0.693871,0.192788,0.693812,1.351552,-0.429344,-0.351552,
+ -0.976322,0.216322,0,1.28066,-0.510672,-0.5,
+ -0.985978,0.166878,0,1.29757,-0.429344,-0.5,
+ -0.923459,0.178536,0.339629,1.311066,-0.429344,-0.419028,
+ -0.976322,0.216322,0,1.28066,-0.510672,-0.5,
+ -0.923459,0.178536,0.339629,1.311066,-0.429344,-0.419028,
+ -0.914159,0.225597,0.336777,1.295283,-0.510672,-0.412264,
+ -0.985978,0.166878,0,1.29757,-0.429344,-0.5,
+ -0.995379,0.096022,0,1.312026,-0.333361,-0.5,
+ -0.933761,0.111444,0.340103,1.324378,-0.333193,-0.425456,
+ -0.933761,0.111444,0.340103,1.324378,-0.333193,-0.425456,
+ -0.923459,0.178536,0.339629,1.311066,-0.429344,-0.419028,
+ -0.985978,0.166878,0,1.29757,-0.429344,-0.5,
+ -0.702754,0.131399,0.699193,1.361436,-0.332687,-0.363336,
+ -0.693871,0.192788,0.693812,1.351552,-0.429344,-0.351552,
+ -0.923459,0.178536,0.339629,1.311066,-0.429344,-0.419028,
+ -0.702754,0.131399,0.699193,1.361436,-0.332687,-0.363336,
+ -0.923459,0.178536,0.339629,1.311066,-0.429344,-0.419028,
+ -0.933761,0.111444,0.340103,1.324378,-0.333193,-0.425456,
+ -0.336776,0.225598,0.914159,1.412264,-0.510672,-0.295283,
+ -0.68695,0.237061,0.686951,1.339151,-0.510672,-0.339151,
+ -0.693871,0.192788,0.693812,1.351552,-0.429344,-0.351552,
+ -0.693871,0.192788,0.693812,1.351552,-0.429344,-0.351552,
+ -0.340683,0.181594,0.922474,1.419028,-0.429344,-0.311066,
+ -0.336776,0.225598,0.914159,1.412264,-0.510672,-0.295283,
+ -0.702754,0.131399,0.699193,1.361436,-0.332687,-0.363336,
+ -0.347569,0.124206,0.929392,1.423198,-0.331844,-0.326064,
+ -0.340683,0.181594,0.922474,1.419028,-0.429344,-0.311066,
+ -0.702754,0.131399,0.699193,1.361436,-0.332687,-0.363336,
+ -0.340683,0.181594,0.922474,1.419028,-0.429344,-0.311066,
+ -0.693871,0.192788,0.693812,1.351552,-0.429344,-0.351552,
+ -0.347569,0.124206,0.929392,1.423198,-0.331844,-0.326064,
+ -0.003469,0.126882,0.991912,1.497312,-0.330832,-0.31364,
+ -0.000776,0.175432,0.984491,1.5,-0.429344,-0.29757,
+ -0.000776,0.175432,0.984491,1.5,-0.429344,-0.29757,
+ -0.340683,0.181594,0.922474,1.419028,-0.429344,-0.311066,
+ -0.347569,0.124206,0.929392,1.423198,-0.331844,-0.326064,
+ 0,0.216323,0.976322,1.5,-0.510672,-0.28066,
+ -0.336776,0.225598,0.914159,1.412264,-0.510672,-0.295283,
+ -0.340683,0.181594,0.922474,1.419028,-0.429344,-0.311066,
+ 0,0.216323,0.976322,1.5,-0.510672,-0.28066,
+ -0.340683,0.181594,0.922474,1.419028,-0.429344,-0.311066,
+ -0.000776,0.175432,0.984491,1.5,-0.429344,-0.29757,
+ -0.714149,-0.110296,0.691249,1.356947,-0.122198,-0.375951,
+ -0.355153,-0.061801,0.932763,1.409755,-0.113768,-0.342119,
+ -0.356256,0.046266,0.933242,1.421273,-0.224532,-0.337381,
+ -0.714149,-0.110296,0.691249,1.356947,-0.122198,-0.375951,
+ -0.356256,0.046266,0.933242,1.421273,-0.224532,-0.337381,
+ -0.739331,0.03305,0.672531,1.364627,-0.227904,-0.372228,
+ -0.355153,-0.061801,0.932763,1.409755,-0.113768,-0.342119,
+ -0.032665,-0.015822,0.999341,1.473124,-0.103652,-0.330842,
+ -0.005359,0.065692,0.997826,1.489249,-0.220486,-0.325766,
+ -0.005359,0.065692,0.997826,1.489249,-0.220486,-0.325766,
+ -0.356256,0.046266,0.933242,1.421273,-0.224532,-0.337381,
+ -0.355153,-0.061801,0.932763,1.409755,-0.113768,-0.342119,
+ -0.003469,0.126882,0.991912,1.497312,-0.330832,-0.31364,
+ -0.347569,0.124206,0.929392,1.423198,-0.331844,-0.326064,
+ -0.356256,0.046266,0.933242,1.421273,-0.224532,-0.337381,
+ -0.003469,0.126882,0.991912,1.497312,-0.330832,-0.31364,
+ -0.356256,0.046266,0.933242,1.421273,-0.224532,-0.337381,
+ -0.005359,0.065692,0.997826,1.489249,-0.220486,-0.325766,
+ -0.347569,0.124206,0.929392,1.423198,-0.331844,-0.326064,
+ -0.702754,0.131399,0.699193,1.361436,-0.332687,-0.363336,
+ -0.739331,0.03305,0.672531,1.364627,-0.227904,-0.372228,
+ -0.739331,0.03305,0.672531,1.364627,-0.227904,-0.372228,
+ -0.356256,0.046266,0.933242,1.421273,-0.224532,-0.337381,
+ -0.347569,0.124206,0.929392,1.423198,-0.331844,-0.326064,
+ 0.68395,0.1429,0.715397,1.589301,-0.085107,-0.375951,
+ 0.699329,0.164944,0.695509,1.613873,-0.213068,-0.372228,
+ 0.345572,0.118142,0.930926,1.557226,-0.21644,-0.337381,
+ 0.68395,0.1429,0.715397,1.589301,-0.085107,-0.375951,
+ 0.345572,0.118142,0.930926,1.557226,-0.21644,-0.337381,
+ 0.294772,0.058287,0.953788,1.536493,-0.093537,-0.342119,
+ 0.699329,0.164944,0.695509,1.613873,-0.213068,-0.372228,
+ 0.695529,0.18142,0.695217,1.633189,-0.328978,-0.363336,
+ 0.341595,0.155693,0.926862,1.571427,-0.329821,-0.326064,
+ 0.341595,0.155693,0.926862,1.571427,-0.329821,-0.326064,
+ 0.345572,0.118142,0.930926,1.557226,-0.21644,-0.337381,
+ 0.699329,0.164944,0.695509,1.613873,-0.213068,-0.372228,
+ -0.003469,0.126882,0.991912,1.497312,-0.330832,-0.31364,
+ -0.005359,0.065692,0.997826,1.489249,-0.220486,-0.325766,
+ 0.345572,0.118142,0.930926,1.557226,-0.21644,-0.337381,
+ -0.003469,0.126882,0.991912,1.497312,-0.330832,-0.31364,
+ 0.345572,0.118142,0.930926,1.557226,-0.21644,-0.337381,
+ 0.341595,0.155693,0.926862,1.571427,-0.329821,-0.326064,
+ -0.005359,0.065692,0.997826,1.489249,-0.220486,-0.325766,
+ -0.032665,-0.015822,0.999341,1.473124,-0.103652,-0.330842,
+ 0.294772,0.058287,0.953788,1.536493,-0.093537,-0.342119,
+ 0.294772,0.058287,0.953788,1.536493,-0.093537,-0.342119,
+ 0.345572,0.118142,0.930926,1.557226,-0.21644,-0.337381,
+ -0.005359,0.065692,0.997826,1.489249,-0.220486,-0.325766,
+ 0.692333,0.202929,0.692456,1.648448,-0.429344,-0.351552,
+ 0.68695,0.237061,0.686951,1.660849,-0.510672,-0.339151,
+ 0.336776,0.225598,0.914159,1.587736,-0.510672,-0.295283,
+ 0.336776,0.225598,0.914159,1.587736,-0.510672,-0.295283,
+ 0.339336,0.190036,0.921269,1.580972,-0.429344,-0.311066,
+ 0.692333,0.202929,0.692456,1.648448,-0.429344,-0.351552,
+ 0,0.216323,0.976322,1.5,-0.510672,-0.28066,
+ -0.000776,0.175432,0.984491,1.5,-0.429344,-0.29757,
+ 0.339336,0.190036,0.921269,1.580972,-0.429344,-0.311066,
+ 0,0.216323,0.976322,1.5,-0.510672,-0.28066,
+ 0.339336,0.190036,0.921269,1.580972,-0.429344,-0.311066,
+ 0.336776,0.225598,0.914159,1.587736,-0.510672,-0.295283,
+ -0.000776,0.175432,0.984491,1.5,-0.429344,-0.29757,
+ -0.003469,0.126882,0.991912,1.497312,-0.330832,-0.31364,
+ 0.341595,0.155693,0.926862,1.571427,-0.329821,-0.326064,
+ 0.341595,0.155693,0.926862,1.571427,-0.329821,-0.326064,
+ 0.339336,0.190036,0.921269,1.580972,-0.429344,-0.311066,
+ -0.000776,0.175432,0.984491,1.5,-0.429344,-0.29757,
+ 0.695529,0.18142,0.695217,1.633189,-0.328978,-0.363336,
+ 0.692333,0.202929,0.692456,1.648448,-0.429344,-0.351552,
+ 0.339336,0.190036,0.921269,1.580972,-0.429344,-0.311066,
+ 0.695529,0.18142,0.695217,1.633189,-0.328978,-0.363336,
+ 0.339336,0.190036,0.921269,1.580972,-0.429344,-0.311066,
+ 0.341595,0.155693,0.926862,1.571427,-0.329821,-0.326064,
+ 0.914159,0.225597,0.336777,1.704717,-0.510672,-0.412264,
+ 0.68695,0.237061,0.686951,1.660849,-0.510672,-0.339151,
+ 0.692333,0.202929,0.692456,1.648448,-0.429344,-0.351552,
+ 0.692333,0.202929,0.692456,1.648448,-0.429344,-0.351552,
+ 0.919751,0.19868,0.338503,1.688934,-0.429344,-0.419028,
+ 0.914159,0.225597,0.336777,1.704717,-0.510672,-0.412264,
+ 0.695529,0.18142,0.695217,1.633189,-0.328978,-0.363336,
+ 0.921783,0.189963,0.337979,1.670246,-0.328472,-0.425456,
+ 0.919751,0.19868,0.338503,1.688934,-0.429344,-0.419028,
+ 0.695529,0.18142,0.695217,1.633189,-0.328978,-0.363336,
+ 0.919751,0.19868,0.338503,1.688934,-0.429344,-0.419028,
+ 0.692333,0.202929,0.692456,1.648448,-0.429344,-0.351552,
+ 0.921783,0.189963,0.337979,1.670246,-0.328472,-0.425456,
+ 0.981065,0.19368,0,1.682599,-0.328303,-0.5,
+ 0.980577,0.196136,0,1.70243,-0.429344,-0.5,
+ 0.980577,0.196136,0,1.70243,-0.429344,-0.5,
+ 0.919751,0.19868,0.338503,1.688934,-0.429344,-0.419028,
+ 0.921783,0.189963,0.337979,1.670246,-0.328472,-0.425456,
+ 0.976322,0.216322,0,1.71934,-0.510672,-0.5,
+ 0.914159,0.225597,0.336777,1.704717,-0.510672,-0.412264,
+ 0.919751,0.19868,0.338503,1.688934,-0.429344,-0.419028,
+ 0.976322,0.216322,0,1.71934,-0.510672,-0.5,
+ 0.919751,0.19868,0.338503,1.688934,-0.429344,-0.419028,
+ 0.980577,0.196136,0,1.70243,-0.429344,-0.5,
+ 0.68395,0.1429,0.715397,1.589301,-0.085107,-0.375951,
+ 0.923419,0.19798,0.328787,1.620986,-0.080049,-0.432337,
+ 0.922767,0.190694,0.334869,1.647861,-0.211045,-0.430306,
+ 0.68395,0.1429,0.715397,1.589301,-0.085107,-0.375951,
+ 0.922767,0.190694,0.334869,1.647861,-0.211045,-0.430306,
+ 0.699329,0.164944,0.695509,1.613873,-0.213068,-0.372228,
+ 0.923419,0.19798,0.328787,1.620986,-0.080049,-0.432337,
+ 0.976556,0.215262,0,1.631547,-0.078363,-0.5,
+ 0.979589,0.201011,0,1.65919,-0.21037,-0.5,
+ 0.979589,0.201011,0,1.65919,-0.21037,-0.5,
+ 0.922767,0.190694,0.334869,1.647861,-0.211045,-0.430306,
+ 0.923419,0.19798,0.328787,1.620986,-0.080049,-0.432337,
+ 0.981065,0.19368,0,1.682599,-0.328303,-0.5,
+ 0.921783,0.189963,0.337979,1.670246,-0.328472,-0.425456,
+ 0.922767,0.190694,0.334869,1.647861,-0.211045,-0.430306,
+ 0.981065,0.19368,0,1.682599,-0.328303,-0.5,
+ 0.922767,0.190694,0.334869,1.647861,-0.211045,-0.430306,
+ 0.979589,0.201011,0,1.65919,-0.21037,-0.5,
+ 0.921783,0.189963,0.337979,1.670246,-0.328472,-0.425456,
+ 0.695529,0.18142,0.695217,1.633189,-0.328978,-0.363336,
+ 0.699329,0.164944,0.695509,1.613873,-0.213068,-0.372228,
+ 0.699329,0.164944,0.695509,1.613873,-0.213068,-0.372228,
+ 0.922767,0.190694,0.334869,1.647861,-0.211045,-0.430306,
+ 0.921783,0.189963,0.337979,1.670246,-0.328472,-0.425456,
+ 0.68395,0.1429,-0.715397,1.589301,-0.085107,-0.624049,
+ 0.699329,0.164944,-0.695509,1.613873,-0.213068,-0.627772,
+ 0.922767,0.190694,-0.334869,1.647861,-0.211045,-0.569694,
+ 0.68395,0.1429,-0.715397,1.589301,-0.085107,-0.624049,
+ 0.922767,0.190694,-0.334869,1.647861,-0.211045,-0.569694,
+ 0.923419,0.19798,-0.328787,1.620986,-0.080049,-0.567663,
+ 0.699329,0.164944,-0.695509,1.613873,-0.213068,-0.627772,
+ 0.695529,0.18142,-0.695217,1.633189,-0.328978,-0.636664,
+ 0.921783,0.189963,-0.337979,1.670246,-0.328472,-0.574544,
+ 0.921783,0.189963,-0.337979,1.670246,-0.328472,-0.574544,
+ 0.922767,0.190694,-0.334869,1.647861,-0.211045,-0.569694,
+ 0.699329,0.164944,-0.695509,1.613873,-0.213068,-0.627772,
+ 0.981065,0.19368,0,1.682599,-0.328303,-0.5,
+ 0.979589,0.201011,0,1.65919,-0.21037,-0.5,
+ 0.922767,0.190694,-0.334869,1.647861,-0.211045,-0.569694,
+ 0.981065,0.19368,0,1.682599,-0.328303,-0.5,
+ 0.922767,0.190694,-0.334869,1.647861,-0.211045,-0.569694,
+ 0.921783,0.189963,-0.337979,1.670246,-0.328472,-0.574544,
+ 0.979589,0.201011,0,1.65919,-0.21037,-0.5,
+ 0.976556,0.215262,0,1.631547,-0.078363,-0.5,
+ 0.923419,0.19798,-0.328787,1.620986,-0.080049,-0.567663,
+ 0.923419,0.19798,-0.328787,1.620986,-0.080049,-0.567663,
+ 0.922767,0.190694,-0.334869,1.647861,-0.211045,-0.569694,
+ 0.979589,0.201011,0,1.65919,-0.21037,-0.5,
+ 0.692333,0.202928,-0.692456,1.648448,-0.429344,-0.648448,
+ 0.686951,0.237061,-0.686951,1.660849,-0.510672,-0.660849,
+ 0.914159,0.225597,-0.336777,1.704717,-0.510672,-0.587736,
+ 0.914159,0.225597,-0.336777,1.704717,-0.510672,-0.587736,
+ 0.919751,0.19868,-0.338503,1.688934,-0.429344,-0.580972,
+ 0.692333,0.202928,-0.692456,1.648448,-0.429344,-0.648448,
+ 0.976322,0.216322,0,1.71934,-0.510672,-0.5,
+ 0.980577,0.196136,0,1.70243,-0.429344,-0.5,
+ 0.919751,0.19868,-0.338503,1.688934,-0.429344,-0.580972,
+ 0.976322,0.216322,0,1.71934,-0.510672,-0.5,
+ 0.919751,0.19868,-0.338503,1.688934,-0.429344,-0.580972,
+ 0.914159,0.225597,-0.336777,1.704717,-0.510672,-0.587736,
+ 0.980577,0.196136,0,1.70243,-0.429344,-0.5,
+ 0.981065,0.19368,0,1.682599,-0.328303,-0.5,
+ 0.921783,0.189963,-0.337979,1.670246,-0.328472,-0.574544,
+ 0.921783,0.189963,-0.337979,1.670246,-0.328472,-0.574544,
+ 0.919751,0.19868,-0.338503,1.688934,-0.429344,-0.580972,
+ 0.980577,0.196136,0,1.70243,-0.429344,-0.5,
+ 0.695529,0.18142,-0.695217,1.633189,-0.328978,-0.636664,
+ 0.692333,0.202928,-0.692456,1.648448,-0.429344,-0.648448,
+ 0.919751,0.19868,-0.338503,1.688934,-0.429344,-0.580972,
+ 0.695529,0.18142,-0.695217,1.633189,-0.328978,-0.636664,
+ 0.919751,0.19868,-0.338503,1.688934,-0.429344,-0.580972,
+ 0.921783,0.189963,-0.337979,1.670246,-0.328472,-0.574544,
+ 0.68695,0.237061,0.686951,1.660849,-0.510672,-0.339151,
+ 0.914159,0.225597,0.336777,1.704717,-0.510672,-0.412264,
+ 0.925394,0.167122,0.340171,1.718387,-0.569469,-0.406406,
+ 0.68695,0.237061,0.686951,1.660849,-0.510672,-0.339151,
+ 0.925394,0.167122,0.340171,1.718387,-0.569469,-0.406406,
+ 0.700149,0.139938,0.700149,1.67159,-0.569469,-0.32841,
+ 0.914159,0.225597,0.336777,1.704717,-0.510672,-0.412264,
+ 0.976322,0.216322,0,1.71934,-0.510672,-0.5,
+ 0.981432,0.191813,0,1.733986,-0.569469,-0.5,
+ 0.981432,0.191813,0,1.733986,-0.569469,-0.5,
+ 0.925394,0.167122,0.340171,1.718387,-0.569469,-0.406406,
+ 0.914159,0.225597,0.336777,1.704717,-0.510672,-0.412264,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.878536,-0.271725,0.392861,1.721597,-0.609197,-0.405226,
+ 0.925394,0.167122,0.340171,1.718387,-0.569469,-0.406406,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.925394,0.167122,0.340171,1.718387,-0.569469,-0.406406,
+ 0.981432,0.191813,0,1.733986,-0.569469,-0.5,
+ 0.878536,-0.271725,0.392861,1.721597,-0.609197,-0.405226,
+ 0.676292,-0.291987,0.676293,1.673866,-0.608893,-0.326134,
+ 0.700149,0.139938,0.700149,1.67159,-0.569469,-0.32841,
+ 0.700149,0.139938,0.700149,1.67159,-0.569469,-0.32841,
+ 0.925394,0.167122,0.340171,1.718387,-0.569469,-0.406406,
+ 0.878536,-0.271725,0.392861,1.721597,-0.609197,-0.405226,
+ 0.686951,0.237061,-0.686951,1.660849,-0.510672,-0.660849,
+ 0.700149,0.139938,-0.700149,1.67159,-0.569469,-0.67159,
+ 0.925394,0.167122,-0.340171,1.718387,-0.569469,-0.593594,
+ 0.686951,0.237061,-0.686951,1.660849,-0.510672,-0.660849,
+ 0.925394,0.167122,-0.340171,1.718387,-0.569469,-0.593594,
+ 0.914159,0.225597,-0.336777,1.704717,-0.510672,-0.587736,
+ 0.700149,0.139938,-0.700149,1.67159,-0.569469,-0.67159,
+ 0.676292,-0.291988,-0.676293,1.673866,-0.608893,-0.673866,
+ 0.878536,-0.271725,-0.392861,1.721597,-0.609197,-0.594774,
+ 0.878536,-0.271725,-0.392861,1.721597,-0.609197,-0.594774,
+ 0.925394,0.167122,-0.340171,1.718387,-0.569469,-0.593594,
+ 0.700149,0.139938,-0.700149,1.67159,-0.569469,-0.67159,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.981432,0.191813,0,1.733986,-0.569469,-0.5,
+ 0.925394,0.167122,-0.340171,1.718387,-0.569469,-0.593594,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.925394,0.167122,-0.340171,1.718387,-0.569469,-0.593594,
+ 0.878536,-0.271725,-0.392861,1.721597,-0.609197,-0.594774,
+ 0.981432,0.191813,0,1.733986,-0.569469,-0.5,
+ 0.976322,0.216322,0,1.71934,-0.510672,-0.5,
+ 0.914159,0.225597,-0.336777,1.704717,-0.510672,-0.587736,
+ 0.914159,0.225597,-0.336777,1.704717,-0.510672,-0.587736,
+ 0.925394,0.167122,-0.340171,1.718387,-0.569469,-0.593594,
+ 0.981432,0.191813,0,1.733986,-0.569469,-0.5,
+ 0.199329,-0.959446,-0.199329,1.638667,-0.642463,-0.638667,
+ 0.188349,-0.976969,-0.100277,1.664625,-0.646948,-0.5825,
+ 0.529853,-0.826565,-0.189859,1.706,-0.633319,-0.5875,
+ 0.199329,-0.959446,-0.199329,1.638667,-0.642463,-0.638667,
+ 0.529853,-0.826565,-0.189859,1.706,-0.633319,-0.5875,
+ 0.467068,-0.750796,-0.467068,1.660875,-0.632104,-0.660875,
+ 0.244558,-0.969635,0,1.677562,-0.649161,-0.5,
+ 0.611773,-0.791034,0,1.7215,-0.634535,-0.5,
+ 0.529853,-0.826565,-0.189859,1.706,-0.633319,-0.5875,
+ 0.244558,-0.969635,0,1.677562,-0.649161,-0.5,
+ 0.529853,-0.826565,-0.189859,1.706,-0.633319,-0.5875,
+ 0.188349,-0.976969,-0.100277,1.664625,-0.646948,-0.5825,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.878536,-0.271725,-0.392861,1.721597,-0.609197,-0.594774,
+ 0.529853,-0.826565,-0.189859,1.706,-0.633319,-0.5875,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.529853,-0.826565,-0.189859,1.706,-0.633319,-0.5875,
+ 0.611773,-0.791034,0,1.7215,-0.634535,-0.5,
+ 0.878536,-0.271725,-0.392861,1.721597,-0.609197,-0.594774,
+ 0.676292,-0.291988,-0.676293,1.673866,-0.608893,-0.673866,
+ 0.467068,-0.750796,-0.467068,1.660875,-0.632104,-0.660875,
+ 0.467068,-0.750796,-0.467068,1.660875,-0.632104,-0.660875,
+ 0.529853,-0.826565,-0.189859,1.706,-0.633319,-0.5875,
+ 0.878536,-0.271725,-0.392861,1.721597,-0.609197,-0.594774,
+ 0.199329,-0.959446,0.199329,1.638667,-0.642463,-0.361333,
+ 0.467068,-0.750796,0.467068,1.660875,-0.632104,-0.339125,
+ 0.529853,-0.826565,0.189859,1.706,-0.633319,-0.4125,
+ 0.199329,-0.959446,0.199329,1.638667,-0.642463,-0.361333,
+ 0.529853,-0.826565,0.189859,1.706,-0.633319,-0.4125,
+ 0.188349,-0.976969,0.100277,1.664625,-0.646948,-0.4175,
+ 0.467068,-0.750796,0.467068,1.660875,-0.632104,-0.339125,
+ 0.676292,-0.291987,0.676293,1.673866,-0.608893,-0.326134,
+ 0.878536,-0.271725,0.392861,1.721597,-0.609197,-0.405226,
+ 0.878536,-0.271725,0.392861,1.721597,-0.609197,-0.405226,
+ 0.529853,-0.826565,0.189859,1.706,-0.633319,-0.4125,
+ 0.467068,-0.750796,0.467068,1.660875,-0.632104,-0.339125,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.611773,-0.791034,0,1.7215,-0.634535,-0.5,
+ 0.529853,-0.826565,0.189859,1.706,-0.633319,-0.4125,
+ 0.968451,-0.249205,0,1.737621,-0.609501,-0.5,
+ 0.529853,-0.826565,0.189859,1.706,-0.633319,-0.4125,
+ 0.878536,-0.271725,0.392861,1.721597,-0.609197,-0.405226,
+ 0.244558,-0.969635,0,1.677562,-0.649161,-0.5,
+ 0.188349,-0.976969,0.100277,1.664625,-0.646948,-0.4175,
+ 0.529853,-0.826565,0.189859,1.706,-0.633319,-0.4125,
+ 0.244558,-0.969635,0,1.677562,-0.649161,-0.5,
+ 0.529853,-0.826565,0.189859,1.706,-0.633319,-0.4125,
+ 0.611773,-0.791034,0,1.7215,-0.634535,-0.5,
+ 0.686951,0.237061,-0.686951,1.660849,-0.510672,-0.660849,
+ 0.336776,0.225597,-0.91416,1.587736,-0.510672,-0.704717,
+ 0.340171,0.167122,-0.925394,1.593594,-0.569469,-0.718387,
+ 0.686951,0.237061,-0.686951,1.660849,-0.510672,-0.660849,
+ 0.340171,0.167122,-0.925394,1.593594,-0.569469,-0.718387,
+ 0.700149,0.139938,-0.700149,1.67159,-0.569469,-0.67159,
+ 0.336776,0.225597,-0.91416,1.587736,-0.510672,-0.704717,
+ 0,0.216323,-0.976322,1.5,-0.510672,-0.71934,
+ 0,0.191813,-0.981432,1.5,-0.569469,-0.733986,
+ 0,0.191813,-0.981432,1.5,-0.569469,-0.733986,
+ 0.340171,0.167122,-0.925394,1.593594,-0.569469,-0.718387,
+ 0.336776,0.225597,-0.91416,1.587736,-0.510672,-0.704717,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ 0.392861,-0.271725,-0.878536,1.594774,-0.609197,-0.721597,
+ 0.340171,0.167122,-0.925394,1.593594,-0.569469,-0.718387,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ 0.340171,0.167122,-0.925394,1.593594,-0.569469,-0.718387,
+ 0,0.191813,-0.981432,1.5,-0.569469,-0.733986,
+ 0.392861,-0.271725,-0.878536,1.594774,-0.609197,-0.721597,
+ 0.676292,-0.291988,-0.676293,1.673866,-0.608893,-0.673866,
+ 0.700149,0.139938,-0.700149,1.67159,-0.569469,-0.67159,
+ 0.700149,0.139938,-0.700149,1.67159,-0.569469,-0.67159,
+ 0.340171,0.167122,-0.925394,1.593594,-0.569469,-0.718387,
+ 0.392861,-0.271725,-0.878536,1.594774,-0.609197,-0.721597,
+ -0.686951,0.237061,-0.686951,1.339151,-0.510672,-0.660849,
+ -0.700149,0.139938,-0.700149,1.32841,-0.569469,-0.67159,
+ -0.340171,0.167122,-0.925394,1.406406,-0.569469,-0.718387,
+ -0.686951,0.237061,-0.686951,1.339151,-0.510672,-0.660849,
+ -0.340171,0.167122,-0.925394,1.406406,-0.569469,-0.718387,
+ -0.336776,0.225597,-0.91416,1.412264,-0.510672,-0.704717,
+ -0.700149,0.139938,-0.700149,1.32841,-0.569469,-0.67159,
+ -0.676292,-0.291988,-0.676293,1.326134,-0.608893,-0.673866,
+ -0.392861,-0.271725,-0.878536,1.405226,-0.609197,-0.721597,
+ -0.392861,-0.271725,-0.878536,1.405226,-0.609197,-0.721597,
+ -0.340171,0.167122,-0.925394,1.406406,-0.569469,-0.718387,
+ -0.700149,0.139938,-0.700149,1.32841,-0.569469,-0.67159,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ 0,0.191813,-0.981432,1.5,-0.569469,-0.733986,
+ -0.340171,0.167122,-0.925394,1.406406,-0.569469,-0.718387,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ -0.340171,0.167122,-0.925394,1.406406,-0.569469,-0.718387,
+ -0.392861,-0.271725,-0.878536,1.405226,-0.609197,-0.721597,
+ 0,0.191813,-0.981432,1.5,-0.569469,-0.733986,
+ 0,0.216323,-0.976322,1.5,-0.510672,-0.71934,
+ -0.336776,0.225597,-0.91416,1.412264,-0.510672,-0.704717,
+ -0.336776,0.225597,-0.91416,1.412264,-0.510672,-0.704717,
+ -0.340171,0.167122,-0.925394,1.406406,-0.569469,-0.718387,
+ 0,0.191813,-0.981432,1.5,-0.569469,-0.733986,
+ -0.199329,-0.959446,-0.199329,1.361333,-0.642463,-0.638667,
+ -0.100277,-0.976969,-0.18835,1.4175,-0.646948,-0.664625,
+ -0.189859,-0.826565,-0.529853,1.4125,-0.633319,-0.706,
+ -0.199329,-0.959446,-0.199329,1.361333,-0.642463,-0.638667,
+ -0.189859,-0.826565,-0.529853,1.4125,-0.633319,-0.706,
+ -0.467068,-0.750796,-0.467068,1.339125,-0.632104,-0.660875,
+ 0,-0.969635,-0.244558,1.5,-0.649161,-0.677562,
+ 0,-0.791034,-0.611773,1.5,-0.634535,-0.7215,
+ -0.189859,-0.826565,-0.529853,1.4125,-0.633319,-0.706,
+ 0,-0.969635,-0.244558,1.5,-0.649161,-0.677562,
+ -0.189859,-0.826565,-0.529853,1.4125,-0.633319,-0.706,
+ -0.100277,-0.976969,-0.18835,1.4175,-0.646948,-0.664625,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ -0.392861,-0.271725,-0.878536,1.405226,-0.609197,-0.721597,
+ -0.189859,-0.826565,-0.529853,1.4125,-0.633319,-0.706,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ -0.189859,-0.826565,-0.529853,1.4125,-0.633319,-0.706,
+ 0,-0.791034,-0.611773,1.5,-0.634535,-0.7215,
+ -0.392861,-0.271725,-0.878536,1.405226,-0.609197,-0.721597,
+ -0.676292,-0.291988,-0.676293,1.326134,-0.608893,-0.673866,
+ -0.467068,-0.750796,-0.467068,1.339125,-0.632104,-0.660875,
+ -0.467068,-0.750796,-0.467068,1.339125,-0.632104,-0.660875,
+ -0.189859,-0.826565,-0.529853,1.4125,-0.633319,-0.706,
+ -0.392861,-0.271725,-0.878536,1.405226,-0.609197,-0.721597,
+ 0.199329,-0.959446,-0.199329,1.638667,-0.642463,-0.638667,
+ 0.467068,-0.750796,-0.467068,1.660875,-0.632104,-0.660875,
+ 0.189859,-0.826565,-0.529853,1.5875,-0.633319,-0.706,
+ 0.199329,-0.959446,-0.199329,1.638667,-0.642463,-0.638667,
+ 0.189859,-0.826565,-0.529853,1.5875,-0.633319,-0.706,
+ 0.100277,-0.976969,-0.18835,1.5825,-0.646948,-0.664625,
+ 0.467068,-0.750796,-0.467068,1.660875,-0.632104,-0.660875,
+ 0.676292,-0.291988,-0.676293,1.673866,-0.608893,-0.673866,
+ 0.392861,-0.271725,-0.878536,1.594774,-0.609197,-0.721597,
+ 0.392861,-0.271725,-0.878536,1.594774,-0.609197,-0.721597,
+ 0.189859,-0.826565,-0.529853,1.5875,-0.633319,-0.706,
+ 0.467068,-0.750796,-0.467068,1.660875,-0.632104,-0.660875,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ 0,-0.791034,-0.611773,1.5,-0.634535,-0.7215,
+ 0.189859,-0.826565,-0.529853,1.5875,-0.633319,-0.706,
+ 0,-0.249205,-0.968451,1.5,-0.609501,-0.737621,
+ 0.189859,-0.826565,-0.529853,1.5875,-0.633319,-0.706,
+ 0.392861,-0.271725,-0.878536,1.594774,-0.609197,-0.721597,
+ 0,-0.969635,-0.244558,1.5,-0.649161,-0.677562,
+ 0.100277,-0.976969,-0.18835,1.5825,-0.646948,-0.664625,
+ 0.189859,-0.826565,-0.529853,1.5875,-0.633319,-0.706,
+ 0,-0.969635,-0.244558,1.5,-0.649161,-0.677562,
+ 0.189859,-0.826565,-0.529853,1.5875,-0.633319,-0.706,
+ 0,-0.791034,-0.611773,1.5,-0.634535,-0.7215,
+ -0.686951,0.237061,-0.686951,1.339151,-0.510672,-0.660849,
+ -0.914159,0.225597,-0.336777,1.295283,-0.510672,-0.587736,
+ -0.925394,0.167122,-0.340171,1.281613,-0.569469,-0.593594,
+ -0.686951,0.237061,-0.686951,1.339151,-0.510672,-0.660849,
+ -0.925394,0.167122,-0.340171,1.281613,-0.569469,-0.593594,
+ -0.700149,0.139938,-0.700149,1.32841,-0.569469,-0.67159,
+ -0.914159,0.225597,-0.336777,1.295283,-0.510672,-0.587736,
+ -0.976322,0.216322,0,1.28066,-0.510672,-0.5,
+ -0.981432,0.191813,0,1.266014,-0.569469,-0.5,
+ -0.981432,0.191813,0,1.266014,-0.569469,-0.5,
+ -0.925394,0.167122,-0.340171,1.281613,-0.569469,-0.593594,
+ -0.914159,0.225597,-0.336777,1.295283,-0.510672,-0.587736,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.878536,-0.271725,-0.392861,1.278403,-0.609197,-0.594774,
+ -0.925394,0.167122,-0.340171,1.281613,-0.569469,-0.593594,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.925394,0.167122,-0.340171,1.281613,-0.569469,-0.593594,
+ -0.981432,0.191813,0,1.266014,-0.569469,-0.5,
+ -0.878536,-0.271725,-0.392861,1.278403,-0.609197,-0.594774,
+ -0.676292,-0.291988,-0.676293,1.326134,-0.608893,-0.673866,
+ -0.700149,0.139938,-0.700149,1.32841,-0.569469,-0.67159,
+ -0.700149,0.139938,-0.700149,1.32841,-0.569469,-0.67159,
+ -0.925394,0.167122,-0.340171,1.281613,-0.569469,-0.593594,
+ -0.878536,-0.271725,-0.392861,1.278403,-0.609197,-0.594774,
+ -0.68695,0.237061,0.686951,1.339151,-0.510672,-0.339151,
+ -0.700149,0.139938,0.700149,1.32841,-0.569469,-0.32841,
+ -0.925394,0.167122,0.340171,1.281613,-0.569469,-0.406406,
+ -0.68695,0.237061,0.686951,1.339151,-0.510672,-0.339151,
+ -0.925394,0.167122,0.340171,1.281613,-0.569469,-0.406406,
+ -0.914159,0.225597,0.336777,1.295283,-0.510672,-0.412264,
+ -0.700149,0.139938,0.700149,1.32841,-0.569469,-0.32841,
+ -0.676292,-0.291987,0.676293,1.326134,-0.608893,-0.326134,
+ -0.878536,-0.271725,0.392861,1.278403,-0.609197,-0.405226,
+ -0.878536,-0.271725,0.392861,1.278403,-0.609197,-0.405226,
+ -0.925394,0.167122,0.340171,1.281613,-0.569469,-0.406406,
+ -0.700149,0.139938,0.700149,1.32841,-0.569469,-0.32841,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.981432,0.191813,0,1.266014,-0.569469,-0.5,
+ -0.925394,0.167122,0.340171,1.281613,-0.569469,-0.406406,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.925394,0.167122,0.340171,1.281613,-0.569469,-0.406406,
+ -0.878536,-0.271725,0.392861,1.278403,-0.609197,-0.405226,
+ -0.981432,0.191813,0,1.266014,-0.569469,-0.5,
+ -0.976322,0.216322,0,1.28066,-0.510672,-0.5,
+ -0.914159,0.225597,0.336777,1.295283,-0.510672,-0.412264,
+ -0.914159,0.225597,0.336777,1.295283,-0.510672,-0.412264,
+ -0.925394,0.167122,0.340171,1.281613,-0.569469,-0.406406,
+ -0.981432,0.191813,0,1.266014,-0.569469,-0.5,
+ -0.199329,-0.959446,0.199329,1.361333,-0.642463,-0.361333,
+ -0.188349,-0.976969,0.100277,1.335375,-0.646948,-0.4175,
+ -0.529853,-0.826565,0.189859,1.294,-0.633319,-0.4125,
+ -0.199329,-0.959446,0.199329,1.361333,-0.642463,-0.361333,
+ -0.529853,-0.826565,0.189859,1.294,-0.633319,-0.4125,
+ -0.467068,-0.750796,0.467068,1.339125,-0.632104,-0.339125,
+ -0.244558,-0.969635,0,1.322438,-0.649161,-0.5,
+ -0.611773,-0.791034,0,1.2785,-0.634535,-0.5,
+ -0.529853,-0.826565,0.189859,1.294,-0.633319,-0.4125,
+ -0.244558,-0.969635,0,1.322438,-0.649161,-0.5,
+ -0.529853,-0.826565,0.189859,1.294,-0.633319,-0.4125,
+ -0.188349,-0.976969,0.100277,1.335375,-0.646948,-0.4175,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.878536,-0.271725,0.392861,1.278403,-0.609197,-0.405226,
+ -0.529853,-0.826565,0.189859,1.294,-0.633319,-0.4125,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.529853,-0.826565,0.189859,1.294,-0.633319,-0.4125,
+ -0.611773,-0.791034,0,1.2785,-0.634535,-0.5,
+ -0.878536,-0.271725,0.392861,1.278403,-0.609197,-0.405226,
+ -0.676292,-0.291987,0.676293,1.326134,-0.608893,-0.326134,
+ -0.467068,-0.750796,0.467068,1.339125,-0.632104,-0.339125,
+ -0.467068,-0.750796,0.467068,1.339125,-0.632104,-0.339125,
+ -0.529853,-0.826565,0.189859,1.294,-0.633319,-0.4125,
+ -0.878536,-0.271725,0.392861,1.278403,-0.609197,-0.405226,
+ -0.199329,-0.959446,-0.199329,1.361333,-0.642463,-0.638667,
+ -0.467068,-0.750796,-0.467068,1.339125,-0.632104,-0.660875,
+ -0.529853,-0.826565,-0.189859,1.294,-0.633319,-0.5875,
+ -0.199329,-0.959446,-0.199329,1.361333,-0.642463,-0.638667,
+ -0.529853,-0.826565,-0.189859,1.294,-0.633319,-0.5875,
+ -0.188349,-0.976969,-0.100277,1.335375,-0.646948,-0.5825,
+ -0.467068,-0.750796,-0.467068,1.339125,-0.632104,-0.660875,
+ -0.676292,-0.291988,-0.676293,1.326134,-0.608893,-0.673866,
+ -0.878536,-0.271725,-0.392861,1.278403,-0.609197,-0.594774,
+ -0.878536,-0.271725,-0.392861,1.278403,-0.609197,-0.594774,
+ -0.529853,-0.826565,-0.189859,1.294,-0.633319,-0.5875,
+ -0.467068,-0.750796,-0.467068,1.339125,-0.632104,-0.660875,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.611773,-0.791034,0,1.2785,-0.634535,-0.5,
+ -0.529853,-0.826565,-0.189859,1.294,-0.633319,-0.5875,
+ -0.968451,-0.249205,0,1.262379,-0.609501,-0.5,
+ -0.529853,-0.826565,-0.189859,1.294,-0.633319,-0.5875,
+ -0.878536,-0.271725,-0.392861,1.278403,-0.609197,-0.594774,
+ -0.244558,-0.969635,0,1.322438,-0.649161,-0.5,
+ -0.188349,-0.976969,-0.100277,1.335375,-0.646948,-0.5825,
+ -0.529853,-0.826565,-0.189859,1.294,-0.633319,-0.5875,
+ -0.244558,-0.969635,0,1.322438,-0.649161,-0.5,
+ -0.529853,-0.826565,-0.189859,1.294,-0.633319,-0.5875,
+ -0.611773,-0.791034,0,1.2785,-0.634535,-0.5,
+ -0.68695,0.237061,0.686951,1.339151,-0.510672,-0.339151,
+ -0.336776,0.225598,0.914159,1.412264,-0.510672,-0.295283,
+ -0.340171,0.167122,0.925394,1.406406,-0.569469,-0.281613,
+ -0.68695,0.237061,0.686951,1.339151,-0.510672,-0.339151,
+ -0.340171,0.167122,0.925394,1.406406,-0.569469,-0.281613,
+ -0.700149,0.139938,0.700149,1.32841,-0.569469,-0.32841,
+ -0.336776,0.225598,0.914159,1.412264,-0.510672,-0.295283,
+ 0,0.216323,0.976322,1.5,-0.510672,-0.28066,
+ 0,0.191813,0.981432,1.5,-0.569469,-0.266014,
+ 0,0.191813,0.981432,1.5,-0.569469,-0.266014,
+ -0.340171,0.167122,0.925394,1.406406,-0.569469,-0.281613,
+ -0.336776,0.225598,0.914159,1.412264,-0.510672,-0.295283,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ -0.392861,-0.271724,0.878536,1.405226,-0.609197,-0.278403,
+ -0.340171,0.167122,0.925394,1.406406,-0.569469,-0.281613,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ -0.340171,0.167122,0.925394,1.406406,-0.569469,-0.281613,
+ 0,0.191813,0.981432,1.5,-0.569469,-0.266014,
+ -0.392861,-0.271724,0.878536,1.405226,-0.609197,-0.278403,
+ -0.676292,-0.291987,0.676293,1.326134,-0.608893,-0.326134,
+ -0.700149,0.139938,0.700149,1.32841,-0.569469,-0.32841,
+ -0.700149,0.139938,0.700149,1.32841,-0.569469,-0.32841,
+ -0.340171,0.167122,0.925394,1.406406,-0.569469,-0.281613,
+ -0.392861,-0.271724,0.878536,1.405226,-0.609197,-0.278403,
+ 0.68695,0.237061,0.686951,1.660849,-0.510672,-0.339151,
+ 0.700149,0.139938,0.700149,1.67159,-0.569469,-0.32841,
+ 0.340171,0.167122,0.925394,1.593594,-0.569469,-0.281613,
+ 0.68695,0.237061,0.686951,1.660849,-0.510672,-0.339151,
+ 0.340171,0.167122,0.925394,1.593594,-0.569469,-0.281613,
+ 0.336776,0.225598,0.914159,1.587736,-0.510672,-0.295283,
+ 0.700149,0.139938,0.700149,1.67159,-0.569469,-0.32841,
+ 0.676292,-0.291987,0.676293,1.673866,-0.608893,-0.326134,
+ 0.392861,-0.271724,0.878536,1.594774,-0.609197,-0.278403,
+ 0.392861,-0.271724,0.878536,1.594774,-0.609197,-0.278403,
+ 0.340171,0.167122,0.925394,1.593594,-0.569469,-0.281613,
+ 0.700149,0.139938,0.700149,1.67159,-0.569469,-0.32841,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ 0,0.191813,0.981432,1.5,-0.569469,-0.266014,
+ 0.340171,0.167122,0.925394,1.593594,-0.569469,-0.281613,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ 0.340171,0.167122,0.925394,1.593594,-0.569469,-0.281613,
+ 0.392861,-0.271724,0.878536,1.594774,-0.609197,-0.278403,
+ 0,0.191813,0.981432,1.5,-0.569469,-0.266014,
+ 0,0.216323,0.976322,1.5,-0.510672,-0.28066,
+ 0.336776,0.225598,0.914159,1.587736,-0.510672,-0.295283,
+ 0.336776,0.225598,0.914159,1.587736,-0.510672,-0.295283,
+ 0.340171,0.167122,0.925394,1.593594,-0.569469,-0.281613,
+ 0,0.191813,0.981432,1.5,-0.569469,-0.266014,
+ 0.199329,-0.959446,0.199329,1.638667,-0.642463,-0.361333,
+ 0.100277,-0.976969,0.18835,1.5825,-0.646948,-0.335375,
+ 0.189859,-0.826565,0.529853,1.5875,-0.633319,-0.294,
+ 0.199329,-0.959446,0.199329,1.638667,-0.642463,-0.361333,
+ 0.189859,-0.826565,0.529853,1.5875,-0.633319,-0.294,
+ 0.467068,-0.750796,0.467068,1.660875,-0.632104,-0.339125,
+ 0,-0.969635,0.244558,1.5,-0.649161,-0.322437,
+ 0,-0.791034,0.611773,1.5,-0.634535,-0.2785,
+ 0.189859,-0.826565,0.529853,1.5875,-0.633319,-0.294,
+ 0,-0.969635,0.244558,1.5,-0.649161,-0.322437,
+ 0.189859,-0.826565,0.529853,1.5875,-0.633319,-0.294,
+ 0.100277,-0.976969,0.18835,1.5825,-0.646948,-0.335375,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ 0.392861,-0.271724,0.878536,1.594774,-0.609197,-0.278403,
+ 0.189859,-0.826565,0.529853,1.5875,-0.633319,-0.294,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ 0.189859,-0.826565,0.529853,1.5875,-0.633319,-0.294,
+ 0,-0.791034,0.611773,1.5,-0.634535,-0.2785,
+ 0.392861,-0.271724,0.878536,1.594774,-0.609197,-0.278403,
+ 0.676292,-0.291987,0.676293,1.673866,-0.608893,-0.326134,
+ 0.467068,-0.750796,0.467068,1.660875,-0.632104,-0.339125,
+ 0.467068,-0.750796,0.467068,1.660875,-0.632104,-0.339125,
+ 0.189859,-0.826565,0.529853,1.5875,-0.633319,-0.294,
+ 0.392861,-0.271724,0.878536,1.594774,-0.609197,-0.278403,
+ -0.199329,-0.959446,0.199329,1.361333,-0.642463,-0.361333,
+ -0.467068,-0.750796,0.467068,1.339125,-0.632104,-0.339125,
+ -0.189859,-0.826565,0.529853,1.4125,-0.633319,-0.294,
+ -0.199329,-0.959446,0.199329,1.361333,-0.642463,-0.361333,
+ -0.189859,-0.826565,0.529853,1.4125,-0.633319,-0.294,
+ -0.100277,-0.976969,0.18835,1.4175,-0.646948,-0.335375,
+ -0.467068,-0.750796,0.467068,1.339125,-0.632104,-0.339125,
+ -0.676292,-0.291987,0.676293,1.326134,-0.608893,-0.326134,
+ -0.392861,-0.271724,0.878536,1.405226,-0.609197,-0.278403,
+ -0.392861,-0.271724,0.878536,1.405226,-0.609197,-0.278403,
+ -0.189859,-0.826565,0.529853,1.4125,-0.633319,-0.294,
+ -0.467068,-0.750796,0.467068,1.339125,-0.632104,-0.339125,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ 0,-0.791034,0.611773,1.5,-0.634535,-0.2785,
+ -0.189859,-0.826565,0.529853,1.4125,-0.633319,-0.294,
+ 0,-0.249205,0.968451,1.5,-0.609501,-0.262379,
+ -0.189859,-0.826565,0.529853,1.4125,-0.633319,-0.294,
+ -0.392861,-0.271724,0.878536,1.405226,-0.609197,-0.278403,
+ 0,-0.969635,0.244558,1.5,-0.649161,-0.322437,
+ -0.100277,-0.976969,0.18835,1.4175,-0.646948,-0.335375,
+ -0.189859,-0.826565,0.529853,1.4125,-0.633319,-0.294,
+ 0,-0.969635,0.244558,1.5,-0.649161,-0.322437,
+ -0.189859,-0.826565,0.529853,1.4125,-0.633319,-0.294,
+ 0,-0.791034,0.611773,1.5,-0.634535,-0.2785,
+ 0.199329,-0.959446,-0.199329,1.638667,-0.642463,-0.638667,
+ 0.100277,-0.976969,-0.18835,1.5825,-0.646948,-0.664625,
+ 0.079739,-0.993621,-0.079739,1.5905,-0.655194,-0.5905,
+ 0.199329,-0.959446,-0.199329,1.638667,-0.642463,-0.638667,
+ 0.079739,-0.993621,-0.079739,1.5905,-0.655194,-0.5905,
+ 0.188349,-0.976969,-0.100277,1.664625,-0.646948,-0.5825,
+ 0.100277,-0.976969,-0.18835,1.5825,-0.646948,-0.664625,
+ 0,-0.969635,-0.244558,1.5,-0.649161,-0.677562,
+ 0,-0.996384,-0.08496,1.5,-0.657972,-0.59775,
+ 0,-0.996384,-0.08496,1.5,-0.657972,-0.59775,
+ 0.079739,-0.993621,-0.079739,1.5905,-0.655194,-0.5905,
+ 0.100277,-0.976969,-0.18835,1.5825,-0.646948,-0.664625,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ 0.08496,-0.996384,0,1.59775,-0.657972,-0.5,
+ 0.079739,-0.993621,-0.079739,1.5905,-0.655194,-0.5905,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ 0.079739,-0.993621,-0.079739,1.5905,-0.655194,-0.5905,
+ 0,-0.996384,-0.08496,1.5,-0.657972,-0.59775,
+ 0.08496,-0.996384,0,1.59775,-0.657972,-0.5,
+ 0.244558,-0.969635,0,1.677562,-0.649161,-0.5,
+ 0.188349,-0.976969,-0.100277,1.664625,-0.646948,-0.5825,
+ 0.188349,-0.976969,-0.100277,1.664625,-0.646948,-0.5825,
+ 0.079739,-0.993621,-0.079739,1.5905,-0.655194,-0.5905,
+ 0.08496,-0.996384,0,1.59775,-0.657972,-0.5,
+ -0.199329,-0.959446,-0.199329,1.361333,-0.642463,-0.638667,
+ -0.188349,-0.976969,-0.100277,1.335375,-0.646948,-0.5825,
+ -0.079739,-0.993621,-0.079739,1.4095,-0.655194,-0.5905,
+ -0.199329,-0.959446,-0.199329,1.361333,-0.642463,-0.638667,
+ -0.079739,-0.993621,-0.079739,1.4095,-0.655194,-0.5905,
+ -0.100277,-0.976969,-0.18835,1.4175,-0.646948,-0.664625,
+ -0.188349,-0.976969,-0.100277,1.335375,-0.646948,-0.5825,
+ -0.244558,-0.969635,0,1.322438,-0.649161,-0.5,
+ -0.08496,-0.996384,0,1.40225,-0.657972,-0.5,
+ -0.08496,-0.996384,0,1.40225,-0.657972,-0.5,
+ -0.079739,-0.993621,-0.079739,1.4095,-0.655194,-0.5905,
+ -0.188349,-0.976969,-0.100277,1.335375,-0.646948,-0.5825,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ 0,-0.996384,-0.08496,1.5,-0.657972,-0.59775,
+ -0.079739,-0.993621,-0.079739,1.4095,-0.655194,-0.5905,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ -0.079739,-0.993621,-0.079739,1.4095,-0.655194,-0.5905,
+ -0.08496,-0.996384,0,1.40225,-0.657972,-0.5,
+ 0,-0.996384,-0.08496,1.5,-0.657972,-0.59775,
+ 0,-0.969635,-0.244558,1.5,-0.649161,-0.677562,
+ -0.100277,-0.976969,-0.18835,1.4175,-0.646948,-0.664625,
+ -0.100277,-0.976969,-0.18835,1.4175,-0.646948,-0.664625,
+ -0.079739,-0.993621,-0.079739,1.4095,-0.655194,-0.5905,
+ 0,-0.996384,-0.08496,1.5,-0.657972,-0.59775,
+ -0.199329,-0.959446,0.199329,1.361333,-0.642463,-0.361333,
+ -0.100277,-0.976969,0.18835,1.4175,-0.646948,-0.335375,
+ -0.079739,-0.993621,0.079739,1.4095,-0.655194,-0.4095,
+ -0.199329,-0.959446,0.199329,1.361333,-0.642463,-0.361333,
+ -0.079739,-0.993621,0.079739,1.4095,-0.655194,-0.4095,
+ -0.188349,-0.976969,0.100277,1.335375,-0.646948,-0.4175,
+ -0.100277,-0.976969,0.18835,1.4175,-0.646948,-0.335375,
+ 0,-0.969635,0.244558,1.5,-0.649161,-0.322437,
+ 0,-0.996384,0.08496,1.5,-0.657972,-0.40225,
+ 0,-0.996384,0.08496,1.5,-0.657972,-0.40225,
+ -0.079739,-0.993621,0.079739,1.4095,-0.655194,-0.4095,
+ -0.100277,-0.976969,0.18835,1.4175,-0.646948,-0.335375,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ -0.08496,-0.996384,0,1.40225,-0.657972,-0.5,
+ -0.079739,-0.993621,0.079739,1.4095,-0.655194,-0.4095,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ -0.079739,-0.993621,0.079739,1.4095,-0.655194,-0.4095,
+ 0,-0.996384,0.08496,1.5,-0.657972,-0.40225,
+ -0.08496,-0.996384,0,1.40225,-0.657972,-0.5,
+ -0.244558,-0.969635,0,1.322438,-0.649161,-0.5,
+ -0.188349,-0.976969,0.100277,1.335375,-0.646948,-0.4175,
+ -0.188349,-0.976969,0.100277,1.335375,-0.646948,-0.4175,
+ -0.079739,-0.993621,0.079739,1.4095,-0.655194,-0.4095,
+ -0.08496,-0.996384,0,1.40225,-0.657972,-0.5,
+ 0.199329,-0.959446,0.199329,1.638667,-0.642463,-0.361333,
+ 0.188349,-0.976969,0.100277,1.664625,-0.646948,-0.4175,
+ 0.079739,-0.993621,0.079739,1.5905,-0.655194,-0.4095,
+ 0.199329,-0.959446,0.199329,1.638667,-0.642463,-0.361333,
+ 0.079739,-0.993621,0.079739,1.5905,-0.655194,-0.4095,
+ 0.100277,-0.976969,0.18835,1.5825,-0.646948,-0.335375,
+ 0.188349,-0.976969,0.100277,1.664625,-0.646948,-0.4175,
+ 0.244558,-0.969635,0,1.677562,-0.649161,-0.5,
+ 0.08496,-0.996384,0,1.59775,-0.657972,-0.5,
+ 0.08496,-0.996384,0,1.59775,-0.657972,-0.5,
+ 0.079739,-0.993621,0.079739,1.5905,-0.655194,-0.4095,
+ 0.188349,-0.976969,0.100277,1.664625,-0.646948,-0.4175,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ 0,-0.996384,0.08496,1.5,-0.657972,-0.40225,
+ 0.079739,-0.993621,0.079739,1.5905,-0.655194,-0.4095,
+ 0,-1,0,1.5,-0.660924,-0.5,
+ 0.079739,-0.993621,0.079739,1.5905,-0.655194,-0.4095,
+ 0.08496,-0.996384,0,1.59775,-0.657972,-0.5,
+ 0,-0.996384,0.08496,1.5,-0.657972,-0.40225,
+ 0,-0.969635,0.244558,1.5,-0.649161,-0.322437,
+ 0.100277,-0.976969,0.18835,1.5825,-0.646948,-0.335375,
+ 0.100277,-0.976969,0.18835,1.5825,-0.646948,-0.335375,
+ 0.079739,-0.993621,0.079739,1.5905,-0.655194,-0.4095,
+ 0,-0.996384,0.08496,1.5,-0.657972,-0.40225,
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1728,data,NULL};
+const struct gllist *s1_6=&frame;
diff --git a/hacks/glx/s1_b.c b/hacks/glx/s1_b.c
new file mode 100644
index 0000000..efdecf3
--- /dev/null
+++ b/hacks/glx/s1_b.c
@@ -0,0 +1,505 @@
+#include "gllist.h"
+static const float data[]={
+ -0.137893,0.043508,-0.125711,
+ -0.095845,-0.165656,0.072892,
+ -0.093165,0.152051,0.327744,
+ -0.003795,0.001470,-0.102225,
+ 0.152845,-0.430757,-0.031907,
+ -0.118828,0.399389,0.091047,
+ -0.169137,-0.181241,-0.288763,
+ 0.048660,0.018262,-0.035049,
+ 0.008859,0.208004,-0.059048,
+ -0.009212,-0.042229,-0.000692,
+ -0.040025,0.115695,0.178962,
+ -0.198525,0.018630,0.257202,
+ 0.205081,-0.244569,0.136314,
+ -0.214336,-0.149946,-0.006872,
+ 0.245675,-0.227316,-0.184201,
+ -0.001494,0.259139,-0.260652,
+ 0.070243,0.038750,0.069425,
+ -0.033229,-0.259151,0.298856,
+ 0.088773,-0.065324,0.260294,
+ 0.009195,0.078651,0.055543,
+ -0.090795,0.025672,0.056988,
+ -0.163707,-0.011627,-0.096395,
+ 0.068886,0.257031,-0.264175,
+ -0.018086,-0.285526,0.152989,
+ -0.017489,0.031671,0.000107,
+ -0.075583,-0.097617,0.030074,
+ 0.129221,-0.087628,0.171748,
+ -0.007530,-0.084194,0.186045,
+ 0.474638,0.004818,0.200460,
+ 0.016796,0.096614,-0.221351,
+ 0.187032,0.031017,0.039986,
+ -0.142119,-0.105297,-0.100849,
+ 0.142768,-0.313960,-0.349716,
+ -0.146805,0.140482,0.035653,
+ 0.039939,-0.051822,-0.017672,
+ 0.057111,-0.075686,-0.103478,
+ 0.049696,-0.135070,0.055097,
+ 0.030271,0.075412,-0.103571,
+ 0.100158,-0.022917,0.073895,
+ 0.085544,-0.273613,0.092456,
+ 0.077489,-0.309836,-0.003664,
+ -0.017590,-0.127869,0.153118,
+ -0.157014,-0.242184,0.070478,
+ -0.018167,-0.133639,-0.174937,
+ -0.106973,-0.189783,0.038622,
+ -0.000096,0.104429,-0.032589,
+ -0.032036,-0.021493,0.279829,
+ -0.093181,-0.058024,0.182239,
+ 0.012941,-0.010409,0.088080,
+ 0.256718,-0.118137,-0.078847,
+ -0.113382,0.135060,0.269946,
+ 0.175810,-0.026321,0.013860,
+ -0.110606,-0.023553,-0.255525,
+ 0.007163,0.068674,0.010214,
+ 0.031631,-0.170381,-0.174604,
+ 0.117242,0.014353,-0.021215,
+ 0.090315,0.161755,0.074427,
+ 0.285616,0.335824,-0.083891,
+ -0.145763,0.109292,0.121340,
+ -0.147459,-0.041936,0.010427,
+ -0.082626,0.151300,-0.030875,
+ 0.217154,-0.288504,-0.202483,
+ 0.026532,-0.106796,0.121041,
+ 0.046695,-0.033673,-0.043721,
+ 0.135596,0.217426,-0.219631,
+ 0.137627,0.026335,-0.082390,
+ -0.031665,-0.115897,0.077834,
+ -0.214922,-0.162169,0.073035,
+ -0.076108,0.200481,0.036119,
+ 0.012715,-0.161921,0.179804,
+ 0.140409,-0.165899,-0.005149,
+ -0.054606,0.011149,0.045768,
+ 0.116640,-0.180314,0.045320,
+ 0.342166,0.295895,-0.049250,
+ -0.133242,0.129064,0.136969,
+ 0.137520,-0.387145,0.132137,
+ 0.023302,0.194298,-0.066187,
+ 0.089302,0.128683,-0.072530,
+ -0.141374,0.035924,-0.079354,
+ -0.209233,0.018987,-0.004193,
+ 0.156295,-0.034087,0.344315,
+ -0.005946,0.039791,0.071862,
+ 0.076043,-0.094430,0.090122,
+ 0.127394,0.031466,-0.028015,
+ -0.061000,0.169741,-0.127635,
+ -0.015117,-0.160883,-0.095443,
+ -0.185998,-0.182942,0.056857,
+ 0.016499,-0.308118,-0.075513,
+ 0.024971,-0.301226,-0.027251,
+ -0.035944,0.061566,0.013883,
+ 0.007215,0.046198,-0.227891,
+ 0.189165,0.079471,-0.067849,
+ 0.026963,0.027982,-0.050419,
+ -0.050896,0.069604,-0.196938,
+ 0.064274,-0.205263,0.297868,
+ -0.047543,0.147822,0.166593,
+ 0.010318,-0.002148,0.029434,
+ 0.036107,-0.523568,-0.118442,
+ -0.199410,0.233526,-0.161289,
+ -0.047441,-0.013973,0.112998,
+ -0.043494,-0.181796,0.065864,
+ -0.074984,0.177758,-0.156470,
+ 0.225216,0.081058,-0.169876,
+ -0.041510,0.025763,-0.231350,
+ 0.259015,0.274641,0.018290,
+ 0.039196,0.010028,0.072771,
+ 0.031646,0.075290,0.039258,
+ 0.052930,-0.034809,0.165429,
+ -0.072511,0.095786,-0.222144,
+ 0.038706,0.032296,-0.002495,
+ 0.011675,-0.061944,0.082555,
+ -0.168400,0.074113,0.049321,
+ 0.001263,-0.207436,0.013949,
+ -0.027045,0.015697,-0.047831,
+ 0.121989,-0.043014,-0.004426,
+ 0.238374,-0.320060,-0.111754,
+ 0.095077,0.014640,0.070665,
+ -0.084367,0.016444,0.000788,
+ -0.117804,0.113550,0.087029,
+ -0.109080,-0.155795,0.040085,
+ -0.020370,0.118787,0.101787,
+ 0.140877,-0.144829,0.107720,
+ -0.247002,-0.454632,0.070535,
+ -0.016278,-0.111440,0.270110,
+ -0.017624,-0.146232,0.154626,
+ 0.214030,0.041025,-0.170250,
+ 0.010009,-0.159290,-0.076895,
+ 0.116168,0.156775,-0.077935,
+ 0.199355,0.081120,0.003352,
+ 0.054178,-0.036863,-0.004573,
+ -0.015149,0.057005,-0.008878,
+ 0.374758,-0.007823,-0.078051,
+ -0.034977,0.026837,0.035441,
+ 0.101867,0.121954,0.040450,
+ -0.136911,0.010061,0.082698,
+ 0.121665,-0.589852,0.106401,
+ -0.064574,0.098679,0.059336,
+ 0.103037,-0.075263,0.172586,
+ -0.217492,-0.170584,-0.025846,
+ 0.260366,0.002117,0.041535,
+ -0.024112,-0.023437,-0.088146,
+ -0.007767,0.061738,0.116208,
+ 0.253471,0.113278,0.231012,
+ -0.011399,0.116962,-0.037465,
+ 0.233898,0.226108,0.077176,
+ -0.004640,0.209191,-0.091738,
+ 0.093995,0.328937,0.245098,
+ 0.155739,-0.327971,-0.115265,
+ 0.125306,0.174931,0.130030,
+ 0.005005,-0.022310,0.120651,
+ 0.046982,-0.058839,-0.097958,
+ -0.059618,-0.068114,0.070137,
+ 0.053184,-0.081163,0.000020,
+ 0.188066,-0.082942,-0.013689,
+ -0.161390,-0.335891,-0.060737,
+ 0.131189,0.036733,-0.093511,
+ -0.002496,-0.059035,-0.084055,
+ 0.109820,-0.235531,0.130865,
+ 0.018909,0.062351,0.111532,
+ 0.123548,0.094008,0.056761,
+ 0.106710,-0.049834,-0.147748,
+ 0.102940,-0.113169,0.191710,
+ -0.028647,0.128038,-0.104189,
+ 0.107226,-0.220633,-0.147310,
+ -0.205747,0.063433,-0.026135,
+ -0.064614,0.096963,-0.080108,
+ -0.083255,0.113008,-0.089852,
+ 0.180961,-0.269100,0.115523,
+ 0.044722,-0.023285,0.024813,
+ 0.078986,0.037242,0.005124,
+ 0.115141,0.124478,-0.034603,
+ 0.022454,0.155937,-0.096183,
+ 0.175318,0.007233,-0.138507,
+ 0.019182,-0.037869,0.074242,
+ 0.058218,0.212269,-0.003886,
+ -0.188525,-0.075703,0.075643,
+ -0.029085,-0.076746,-0.273473,
+ -0.105590,-0.238524,-0.087465,
+ 0.086122,-0.340807,-0.192851,
+ -0.247936,-0.003160,0.082106,
+ 0.137988,-0.041876,-0.012086,
+ -0.140714,-0.138827,-0.064179,
+ -0.059380,0.015642,0.113841,
+ -0.031501,0.007130,-0.125767,
+ 0.021294,-0.021957,-0.069365,
+ -0.012419,0.019780,-0.077459,
+ 0.085524,0.087513,-0.107484,
+ -0.303263,0.263672,-0.220649,
+ -0.090267,-0.376337,-0.127634,
+ 0.087681,0.015985,-0.029860,
+ 0.119257,0.140347,0.194003,
+ 0.066270,0.127178,-0.003765,
+ 0.037563,-0.110829,0.000382,
+ 0.034295,-0.045737,0.045204,
+ 0.017365,-0.072708,0.056698,
+ 0.045238,0.187956,-0.055878,
+ -0.132755,0.017969,-0.041205,
+ 0.189702,-0.020780,-0.077422,
+ 0.210419,0.178041,-0.005855,
+ 0.104527,-0.304323,0.002581,
+ 0.043359,-0.060695,-0.011878,
+ -0.000267,0.020510,-0.046383,
+ 0.252891,0.074246,-0.047689,
+ -0.069874,0.118962,-0.052781,
+ 0.086188,0.068354,-0.213621,
+ 0.086637,-0.171519,0.006447,
+ 0.196785,-0.086044,-0.068059,
+ 0.100401,0.243886,-0.142258,
+ 0.173010,0.303375,-0.060085,
+ -0.041181,-0.097467,0.073776,
+ -0.013471,-0.133299,-0.143570,
+ -0.302092,-0.158342,0.230719,
+ 0.074434,-0.143530,0.294895,
+ -0.165626,0.200869,-0.130737,
+ 0.102444,0.277067,0.078210,
+ -0.183696,-0.010502,-0.150481,
+ -0.070029,-0.019635,-0.059141,
+ -0.005930,0.069199,-0.013126,
+ -0.119333,-0.007972,0.119489,
+ 0.033072,0.081756,-0.034481,
+ -0.108282,-0.065310,0.146009,
+ 0.080950,0.111320,0.004291,
+ 0.071208,-0.112941,0.028135,
+ -0.024632,0.190525,-0.285626,
+ -0.105040,0.044008,0.020236,
+ -0.017815,-0.076684,-0.065840,
+ 0.083563,0.100873,-0.141154,
+ -0.062066,-0.010894,0.066110,
+ -0.056763,0.024777,-0.176209,
+ -0.014442,0.052861,0.013010,
+ -0.157546,-0.118279,-0.237648,
+ -0.234497,-0.158049,0.102635,
+ 0.061685,-0.052695,-0.042243,
+ 0.093961,-0.025060,0.046602,
+ 0.004395,0.150912,0.191784,
+ 0.067299,-0.059575,0.161018,
+ -0.233155,-0.109721,0.194653,
+ 0.217444,0.221231,-0.201241,
+ -0.033689,-0.341937,-0.099231,
+ 0.042771,-0.028862,0.067736,
+ 0.110240,0.274029,-0.157689,
+ -0.055994,0.144729,0.090901,
+ 0.211192,0.058165,-0.149872,
+ 0.102735,-0.044061,-0.044795,
+ -0.042153,-0.010955,0.014341,
+ -0.011649,0.099072,-0.086419,
+ -0.018920,0.000640,-0.031729,
+ -0.216886,-0.057512,0.071195,
+ -0.188150,0.049292,0.258489,
+ -0.023494,0.021489,0.199785,
+ -0.045818,0.066753,-0.035593,
+ 0.010986,0.166767,0.275085,
+ -0.177039,0.010372,0.167936,
+ -0.423239,0.027466,-0.126114,
+ -0.102035,0.282640,0.022622,
+ -0.023997,0.176943,0.093272,
+ -0.090009,0.015338,0.250857,
+ 0.011095,0.006703,0.057076,
+ 0.133423,0.234639,-0.070260,
+ -0.295994,0.185615,0.117148,
+ 0.235480,0.066195,0.078641,
+ -0.026545,0.093931,0.008019,
+ 0.181656,-0.088719,0.045959,
+ -0.076308,-0.164584,0.018271,
+ 0.092026,0.201866,-0.106051,
+ 0.019876,0.050967,0.176081,
+ -0.018546,0.138749,-0.008255,
+ -0.026049,-0.068465,-0.055467,
+ -0.260245,0.221833,-0.048541,
+ -0.169783,0.354992,-0.017943,
+ -0.306063,0.074787,0.101971,
+ 0.215973,0.107558,-0.008808,
+ 0.390235,-0.275652,-0.117085,
+ 0.033898,0.046047,-0.108977,
+ -0.263507,-0.091765,-0.250234,
+ -0.044613,0.149563,0.027937,
+ -0.015397,-0.040254,0.065692,
+ -0.017531,-0.013504,0.004021,
+ 0.054665,-0.018996,-0.006954,
+ 0.033068,0.219349,-0.194079,
+ -0.057780,0.011881,0.084904,
+ 0.139243,-0.109890,0.039145,
+ 0.223272,0.208110,0.165882,
+ -0.008046,0.103847,0.278718,
+ -0.035499,0.112662,-0.088418,
+ -0.053118,0.053871,-0.054706,
+ 0.118632,0.086431,-0.022494,
+ 0.014943,0.039622,0.047307,
+ 0.006570,0.093461,0.058982,
+ 0.031448,0.325716,-0.047305,
+ -0.193710,0.087226,0.051790,
+ 0.116154,-0.080023,-0.106643,
+ 0.156514,-0.222710,0.275425,
+ -0.084294,-0.101851,0.425222,
+ 0.030344,-0.141370,-0.282460,
+ 0.003022,0.108996,-0.229152,
+ -0.133040,0.061025,-0.128942,
+ -0.077348,0.013363,-0.072511,
+ -0.050317,0.452190,0.094114,
+ 0.053309,-0.143722,0.249884,
+ -0.257016,0.100544,0.012236,
+ -0.022056,-0.212133,0.023533,
+ 0.153299,0.031763,0.034577,
+ 0.161729,0.084914,0.050770,
+ 0.320438,0.112175,0.135015,
+ -0.040717,0.073400,0.080543,
+ -0.226004,0.143154,0.170139,
+ 0.009756,0.068337,0.132111,
+ 0.380191,0.233715,0.026664,
+ -0.018016,0.265426,-0.110691,
+ 0.041281,0.056674,-0.119834,
+ 0.170794,-0.112611,0.094839,
+ 0.216318,0.002081,0.154653,
+ -0.036815,0.024332,0.172587,
+ -0.064554,0.160699,0.101229,
+ 0.114451,0.016039,0.293489,
+ 0.023010,-0.028932,0.014800,
+ -0.290527,0.172553,0.129526,
+ -0.048159,-0.181222,0.305871,
+ 0.065351,-0.399962,-0.030479,
+ 0.334123,-0.120149,0.241310,
+ -0.203728,-0.155627,0.140805,
+ 0.061022,-0.016097,0.131688,
+ 0.045050,-0.313782,-0.279077,
+ 0.034252,-0.135512,-0.087765,
+ 0.276236,0.036449,0.418332,
+ -0.122146,0.050998,0.131453,
+ -0.087629,0.330142,0.061353,
+ 0.228676,0.093309,-0.009307,
+ 0.435264,0.186185,-0.127484,
+ 0.156565,0.013842,-0.103874,
+ -0.274053,-0.084119,0.096687,
+ -0.027947,-0.051152,-0.078997,
+ 0.013399,0.194440,0.072030,
+ 0.000082,0.130666,0.052218,
+ 0.064984,-0.136859,0.092204,
+ 0.109060,0.424779,-0.111867,
+ 0.061748,0.160827,-0.068538,
+ 0.062960,0.059638,-0.181514,
+ 0.018961,0.072298,0.003517,
+ -0.099508,-0.225455,-0.021791,
+ 0.001955,-0.320555,0.159506,
+ -0.057735,-0.054327,-0.095525,
+ 0.319748,-0.146158,-0.198384,
+ -0.158741,-0.265443,0.036635,
+ -0.093089,-0.358379,-0.110549,
+ -0.049805,0.022246,-0.036724,
+ 0.223000,0.247522,-0.232652,
+ -0.249441,-0.248325,-0.071169,
+ 0.000369,0.094598,-0.162153,
+ -0.133873,-0.188473,0.272734,
+ 0.046594,0.069766,0.015561,
+ 0.111582,-0.239786,0.034658,
+ 0.093232,0.183507,-0.011298,
+ -0.226805,0.514871,-0.064144,
+ 0.085949,0.031412,0.042790,
+ -0.043755,-0.290797,-0.159142,
+ 0.056671,0.167837,0.016536,
+ -0.034538,0.072185,0.066973,
+ -0.021211,0.064120,-0.174756,
+ 0.090627,-0.055253,0.109457,
+ 0.019686,0.004469,-0.096316,
+ -0.038864,-0.135083,0.244529,
+ 0.034613,-0.069587,0.144533,
+ -0.100009,-0.057516,-0.079338,
+ -0.178026,0.085994,0.061804,
+ -0.189256,0.342739,0.043372,
+ -0.046206,0.168946,-0.133904,
+ 0.015314,-0.090127,-0.058530,
+ 0.169657,-0.097086,0.013746,
+ 0.185131,-0.089445,0.347806,
+ -0.264432,-0.170170,-0.335858,
+ -0.086511,0.248252,-0.169698,
+ 0.002287,-0.028338,-0.266432,
+ -0.085060,0.001974,-0.032789,
+ 0.192750,-0.007081,0.098197,
+ 0.012577,0.034983,-0.003058,
+ -0.039249,0.038498,0.067306,
+ 0.021988,0.379705,-0.054619,
+ -0.151707,0.051034,-0.016003,
+ -0.057048,0.075729,-0.213397,
+ -0.137847,0.130600,0.046198,
+ 0.024786,0.049556,-0.045772,
+ -0.082533,0.155397,-0.096145,
+ 0.049152,0.270979,-0.147022,
+ 0.061153,-0.104531,-0.103623,
+ -0.142997,-0.232885,0.040538,
+ 0.048806,-0.013095,-0.003505,
+ -0.095063,0.241414,-0.202255,
+ 0.108558,-0.147584,0.162682,
+ 0.217105,0.252340,-0.114830,
+ -0.188028,0.417252,-0.077456,
+ -0.112855,0.105192,0.073968,
+ -0.186972,0.164022,-0.073415,
+ -0.074349,-0.324874,-0.056645,
+ 0.327855,-0.271424,-0.141142,
+ 0.151049,0.155239,-0.083116,
+ 0.035395,-0.133176,-0.095112,
+ 0.127283,-0.011837,0.199750,
+ -0.120775,0.103698,0.063302,
+ 0.014222,0.198468,0.137537,
+ -0.269656,0.120644,-0.153958,
+ -0.136743,-0.119817,-0.073747,
+ -0.068156,-0.138484,0.033507,
+ -0.106835,0.114964,0.023924,
+ -0.222525,0.330321,-0.007431,
+ -0.011739,0.095156,0.139086,
+ 0.146766,0.037685,0.136122,
+ -0.086532,-0.081295,0.009434,
+ 0.189439,0.290592,-0.048317,
+ 0.139152,0.224931,0.355509,
+ 0.017162,-0.016825,0.094198,
+ -0.237595,0.205475,-0.041412,
+ 0.050511,0.094900,0.252891,
+ -0.012538,-0.014082,0.064629,
+ -0.059810,0.020665,-0.260979,
+ 0.073490,-0.242270,0.085847,
+ 0.049499,-0.045617,-0.015894,
+ -0.121040,0.004350,0.381603,
+ -0.062798,0.055006,0.077472,
+ -0.156846,-0.033342,0.035284,
+ 0.105383,0.002776,-0.046394,
+ 0.247612,0.310528,0.046188,
+ -0.144567,-0.197996,0.083309,
+ -0.317845,-0.014793,-0.041608,
+ -0.169858,0.102631,0.283962,
+ -0.168757,0.093105,0.050325,
+ -0.013639,0.285100,0.047089,
+ 0.216644,0.102018,0.031983,
+ 0.046988,0.081482,0.021865,
+ 0.124995,-0.193086,0.127870,
+ 0.009153,0.178713,-0.077949,
+ -0.235371,-0.046817,-0.125764,
+ -0.089381,0.289172,-0.129356,
+ 0.312993,0.120426,0.296957,
+ -0.106431,0.117096,0.156971,
+ 0.030001,0.244577,0.085119,
+ 0.002958,-0.035469,-0.084615,
+ -0.052248,-0.004298,-0.129170,
+ -0.158458,0.059061,-0.041780,
+ -0.007117,-0.174211,0.098819,
+ -0.158387,0.060840,-0.064818,
+ 0.117241,-0.050754,-0.027945,
+ -0.014301,0.146402,-0.118414,
+ 0.186611,-0.162182,-0.150909,
+ -0.106992,0.286109,-0.055512,
+ 0.109689,-0.346409,0.072611,
+ -0.009694,-0.038102,0.098565,
+ -0.034598,0.323300,0.020962,
+ -0.149219,0.040596,-0.114206,
+ 0.164744,0.048081,0.105464,
+ 0.036214,0.099523,0.038595,
+ 0.056537,0.036271,0.003042,
+ -0.157110,0.001614,-0.133994,
+ -0.104357,-0.032004,0.262334,
+ 0.041215,-0.010418,-0.037968,
+ 0.223491,-0.387946,0.117291,
+ -0.344434,0.110318,-0.031448,
+ 0.123562,-0.315729,0.164533,
+ 0.008207,0.042004,0.050014,
+ -0.191339,-0.069291,-0.220065,
+ 0.023845,0.009474,0.035598,
+ -0.173295,-0.036604,-0.193323,
+ -0.040347,-0.106063,-0.055559,
+ -0.071543,0.136487,0.105697,
+ -0.179027,-0.071852,0.117512,
+ 0.064769,-0.345895,0.012833,
+ 0.044800,-0.032357,-0.042161,
+ 0.243586,0.392499,-0.180641,
+ -0.148924,-0.181446,0.146644,
+ -0.042773,0.045843,-0.176893,
+ 0.025938,0.058109,0.242063,
+ -0.028489,-0.024828,0.161289,
+ 0.073899,-0.081205,-0.023751,
+ 0.026149,0.051399,-0.072348,
+ 0.024308,-0.041819,-0.030578,
+ -0.077778,0.010272,0.066967,
+ -0.139184,-0.018983,0.035150,
+ -0.061359,-0.152358,-0.072849,
+ 0.043101,0.028278,0.077387,
+ 0.065599,-0.049676,0.043708,
+ -0.255767,0.023510,-0.076982,
+ 0.020468,-0.040630,0.208424,
+ 0.044922,0.025184,0.004764,
+ 0.107432,-0.009356,0.239863,
+ -0.005475,0.158400,0.089743,
+ 0.018352,0.134559,0.221650,
+ 0.094423,0.129390,-0.031274,
+ 0.048541,0.100595,-0.155938,
+ -0.016298,-0.036518,-0.149178,
+ -0.329953,-0.327602,-0.150086,
+ 0.148403,-0.363334,0.028237,
+ -0.305790,-0.009844,-0.075571,
+ -0.045131,0.152595,0.228720,
+ 0.039725,-0.127469,0.066522,
+ -0.078576,-0.349749,-0.146881,
+ 0.013160,-0.040312,0.129980,
+ 0.221142,-0.106068,0.254967,
+ 0.180912,-0.207357,-0.196999,
+ 0.098219,0.085231,0.121963,
+};
+static const struct gllist frame={GL_V3F,GL_POINTS,500,data,NULL};
+const struct gllist *s1_b=&frame;
diff --git a/hacks/glx/sballs.c b/hacks/glx/sballs.c
new file mode 100644
index 0000000..6cd95f5
--- /dev/null
+++ b/hacks/glx/sballs.c
@@ -0,0 +1,823 @@
+/* sballs --- balls spinning like crazy in GL */
+
+#if 0
+static const char sccsid[] = "@(#)sballs.c 5.02 2001/03/10 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2001. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by
+ * Mustata Bogdan (LoneRunner) <lonerunner@planetquake.com>
+ * and can be found at http://www.cfxweb.net/lonerunner/
+ *
+ * Eric Lassauge (November-07-2000) <lassauge@users.sourceforge.net>
+ * http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ * E.Lassauge - 03-Oct-2001:
+ * - minor bugfixes - get ready for xscreensaver
+ * E.Lassauge - 09-Mar-2001:
+ * - get rid of my framerate options to use showfps
+ * E.Lassauge - 28-Nov-2000:
+ * - add handling of polyhedrons (like in ico)
+ * - modified release part to add freeing of GL objects
+ * E.Lassauge - 14-Nov-2000:
+ * - use new common xpm_to_ximage function
+ *
+ */
+
+#ifdef STANDALONE /* xscreensaver mode */
+#define DEFAULTS "*delay: 30000 \n" \
+ "*size: 0 \n" \
+ "*cycles: 4 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_sballs 0
+#define MODE_sballs
+#include "xlockmore.h" /* from the xscreensaver distribution */
+#include "gltrackball.h"
+#else /* !STANDALONE */
+#include "xlock.h" /* from the xlockmore distribution */
+#include "visgl.h"
+#endif /* !STANDALONE */
+
+#define MINSIZE 32 /* minimal viewport size */
+#define FRAME 50 /* frame count interval */
+#define MAX_OBJ 8 /* number of 3D objects */
+
+#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined( STANDALONE )
+/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
+# include "ximage-loader.h"
+# define I_HAVE_XPM
+
+# include "images/gen/sball_png.h"
+# include "images/gen/sball-bg_png.h"
+
+/* Manage option vars */
+#define DEF_TEXTURE "True"
+#define DEF_OBJECT "0"
+static Bool do_texture;
+static int object, object_arg;
+static int spheres;
+
+static XrmOptionDescRec opts[] = {
+ {"-texture", ".sballs.texture", XrmoptionNoArg, "on"},
+ {"+texture", ".sballs.texture", XrmoptionNoArg, "off"},
+ {"-object", ".sballs.object", XrmoptionSepArg, 0},
+
+};
+
+static argtype vars[] = {
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&object_arg, "object", "Object", DEF_OBJECT, t_Int},
+
+};
+
+static OptionStruct desc[] = {
+ /*{"-count spheres", "set number of spheres"},*/
+ /*{"-cycles speed", "set ball speed value"},*/
+ {"-/+texture", "turn on/off texturing"},
+ {"-object num", "number of the 3D object (0 means random)"},
+};
+
+ENTRYPOINT ModeSpecOpt sballs_opts =
+ { sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc };
+
+#ifdef USE_MODULES
+ModStruct sballs_description =
+ { "sballs", "init_sballs", "draw_sballs", NULL,
+ "draw_sballs", "change_sballs", "free_sballs", &sballs_opts,
+ /*
+ delay,count,cycles,size,ncolors,sat
+ */
+ 10000, 0, 10, 400, 64, 1.0, "",
+ "balls spinning like crazy in GL", 0, NULL
+};
+#endif /* USE_MODULES */
+
+/* misc types and defines */
+#define vinit(a,i,j,k) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+}
+typedef float vec_t;
+typedef vec_t vec3_t[3];
+
+#define MAX_BALLS 20
+
+/* the mode struct, contains all per screen variables */
+typedef struct {
+ GLint WIDTH, HEIGHT; /* display dimensions */
+ GLXContext *glx_context;
+
+
+ XImage *btexture; /* back texture image bits */
+ XImage *ftexture; /* face texture image bits */
+ GLuint backid; /* back texture id: GL world */
+ GLuint faceid; /* face texture id: GL world */
+
+ vec3_t eye;
+ vec3_t rotm;
+ int speed;
+ float radius[MAX_BALLS];
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+} sballsstruct;
+
+/* array of sballsstruct indexed by screen number */
+static sballsstruct *sballs = (sballsstruct *) NULL;
+
+/* lights */
+static const float LightAmbient[]= { 1.0f, 1.0f, 1.0f, 1.0f };
+static const float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
+static const float LightPosition[]= { 0.0f, 0.0f, 4.0f, 1.0f };
+
+/* structure of the polyhedras */
+typedef struct {
+ const char *longname; /* long name of object */
+ const char *shortname; /* short name of object */
+ int numverts; /* number of vertices */
+ float radius; /* radius */
+ vec3_t v[MAX_BALLS];/* the vertices */
+} Polyinfo;
+
+static const Polyinfo polygons[] =
+{
+
+/* 0: objtetra - structure values for tetrahedron */
+ {
+ "tetrahedron", "tetra", /* long and short names */
+ 4, /* number of vertices */
+ 0.8,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 2 of the origin */
+#define T 1.0
+ {T, T, T},
+ {T, -T, -T},
+ {-T, T, -T},
+ {-T, -T, T},
+#undef T
+ }
+ },
+
+/* 1: objcube - structure values for cube */
+
+ {
+ "hexahedron", "cube", /* long and short names */
+ 8, /* number of vertices, edges, and faces */
+ 0.6,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 2 of the origin */
+#define T 1.0
+ {T, T, T},
+ {T, T, -T},
+ {T, -T, -T},
+ {T, -T, T},
+ {-T, T, T},
+ {-T, T, -T},
+ {-T, -T, -T},
+ {-T, -T, T},
+#undef T
+ }
+ },
+
+/* 2: objocta - structure values for octahedron */
+
+ {
+ "octahedron", "octa", /* long and short names */
+ 6, /* number of vertices */
+ 0.6,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 2 of the origin */
+#define T 1.5
+ {T, 0, 0},
+ {-T, 0, 0},
+ {0, T, 0},
+ {0, -T, 0},
+ {0, 0, T},
+ {0, 0, -T},
+#undef T
+ }
+ },
+/* 3: objdodec - structure values for dodecahedron */
+
+ {
+ "dodecahedron", "dodeca", /* long and short names */
+ 20, /* number of vertices */
+ 0.35,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 2 of the origin */
+ {0.000000, 0.500000, 1.000000},
+ {0.000000, -0.500000, 1.000000},
+ {0.000000, -0.500000, -1.000000},
+ {0.000000, 0.500000, -1.000000},
+ {1.000000, 0.000000, 0.500000},
+ {-1.000000, 0.000000, 0.500000},
+ {-1.000000, 0.000000, -0.500000},
+ {1.000000, 0.000000, -0.500000},
+ {0.500000, 1.000000, 0.000000},
+ {-0.500000, 1.000000, 0.000000},
+ {-0.500000, -1.000000, 0.000000},
+ {0.500000, -1.000000, 0.000000},
+ {0.750000, 0.750000, 0.750000},
+ {-0.750000, 0.750000, 0.750000},
+ {-0.750000, -0.750000, 0.750000},
+ {0.750000, -0.750000, 0.750000},
+ {0.750000, -0.750000, -0.750000},
+ {0.750000, 0.750000, -0.750000},
+ {-0.750000, 0.750000, -0.750000},
+ {-0.750000, -0.750000, -0.750000},
+ }
+ },
+
+/* 4: objicosa - structure values for icosahedron */
+
+ {
+ "icosahedron", "icosa", /* long and short names */
+ 12, /* number of vertices */
+ 0.4,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 2 of the origin */
+ {0.00000000, 0.00000000, -0.95105650},
+ {0.00000000, 0.85065080, -0.42532537},
+ {0.80901698, 0.26286556, -0.42532537},
+ {0.50000000, -0.68819095, -0.42532537},
+ {-0.50000000, -0.68819095, -0.42532537},
+ {-0.80901698, 0.26286556, -0.42532537},
+ {0.50000000, 0.68819095, 0.42532537},
+ {0.80901698, -0.26286556, 0.42532537},
+ {0.00000000, -0.85065080, 0.42532537},
+ {-0.80901698, -0.26286556, 0.42532537},
+ {-0.50000000, 0.68819095, 0.42532537},
+ {0.00000000, 0.00000000, 0.95105650}
+ }
+ },
+
+/* 5: objplane - structure values for plane */
+
+ {
+ "plane", "plane", /* long and short names */
+ 4, /* number of vertices */
+ 0.7,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 2 of the origin */
+#define T 1.1
+ {T, 0, 0},
+ {-T, 0, 0},
+ {0, T, 0},
+ {0, -T, 0},
+#undef T
+ }
+ },
+
+/* 6: objpyr - structure values for pyramid */
+
+ {
+ "pyramid", "pyramid", /* long and short names */
+ 5, /* number of vertices */
+ 0.5,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 1 of the origin */
+#define T 1.0
+ {T, 0, 0},
+ {-T, 0, 0},
+ {0, T, 0},
+ {0, -T, 0},
+ {0, 0, T},
+#undef T
+ }
+ },
+
+/* 7: objstar - structure values for octahedron star (stellated octahedron?) */
+ {
+ "star", "star", /* long and short names */
+ 8, /* number of vertices */
+ 0.7,
+ { /* vertices (x,y,z) */
+ /* all points must be within radius 1 of the origin */
+#define T 0.9
+ {T, T, T},
+ {T, -T, -T},
+ {-T, T, -T},
+ {-T, -T, T},
+ {-T, -T, -T},
+ {-T, T, T},
+ {T, -T, T},
+ {T, T, -T},
+#undef T
+ }
+ },
+
+};
+
+
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Misc funcs.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+
+/* initialise textures */
+static void inittextures(ModeInfo * mi)
+{
+ sballsstruct *sb = &sballs[MI_SCREEN(mi)];
+
+#if defined( I_HAVE_XPM )
+ if (do_texture) {
+
+ glGenTextures(1, &sb->backid);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, sb->backid);
+#endif /* HAVE_GLBINDTEXTURE */
+
+ sb->btexture = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ sball_bg_png,
+ sizeof(sball_bg_png));
+ if (!(sb->btexture)) {
+ (void) fprintf(stderr, "Error reading the background texture.\n");
+ glDeleteTextures(1, &sb->backid);
+ do_texture = False;
+ sb->faceid = 0; /* default textures */
+ sb->backid = 0;
+ return;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ sb->btexture->width, sb->btexture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, sb->btexture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+/*
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ Let's pixellate it instead:
+*/
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glGenTextures(1, &sb->faceid);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, sb->faceid);
+#endif /* HAVE_GLBINDTEXTURE */
+
+ sb->ftexture = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ sball_png, sizeof(sball_png));
+ if (!(sb->ftexture)) {
+ (void) fprintf(stderr, "Error reading the face texture.\n");
+ glDeleteTextures(1, &sb->faceid);
+ sb->faceid = 0;
+ return;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ sb->ftexture->width, sb->ftexture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, sb->ftexture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+/*
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ Let's pixellate it instead:
+*/
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ }
+ else
+ {
+ sb->faceid = 0; /* default textures */
+ sb->backid = 0;
+ }
+#else /* !I_HAVE_XPM */
+ do_texture = False;
+ sb->faceid = 0; /* default textures */
+ sb->backid = 0;
+#endif /* !I_HAVE_XPM */
+}
+
+static void drawSphere(ModeInfo * mi,int sphere_num)
+{
+ sballsstruct *sb = &sballs[MI_SCREEN(mi)];
+ float x = polygons[object].v[sphere_num][0];
+ float y = polygons[object].v[sphere_num][1];
+ float z = polygons[object].v[sphere_num][2];
+ int numMajor = 15;
+ int numMinor = 30;
+ float radius = sb->radius[sphere_num];
+ double majorStep = (M_PI / numMajor);
+ double minorStep = (2.0 * M_PI / numMinor);
+ int i, j;
+
+ glPushMatrix();
+ glTranslatef(x, y, z);
+
+ glColor4f(1, 1, 1, 1);
+ for (i = 0; i < numMajor; ++i)
+ {
+ double a = i * majorStep;
+ double b = a + majorStep;
+ double r0 = radius * sin(a);
+ double r1 = radius * sin(b);
+ GLfloat z0 = radius * cos(a);
+ GLfloat z1 = radius * cos(b);
+
+ glBegin(MI_IS_WIREFRAME(mi) ? GL_LINE_STRIP: GL_TRIANGLE_STRIP);
+ for (j = 0; j <= numMinor; ++j)
+ {
+ double c = j * minorStep;
+ GLfloat x = cos(c);
+ GLfloat y = sin(c);
+
+ glNormal3f((x * r0) / radius, (y * r0) / radius, z0 / radius);
+ glTexCoord2f(j / (GLfloat) numMinor, i / (GLfloat) numMajor);
+ glVertex3f(x * r0, y * r0, z0);
+
+ glNormal3f((x * r1) / radius, (y * r1) / radius, z1 / radius);
+ glTexCoord2f(j / (GLfloat) numMinor, (i + 1) / (GLfloat) numMajor);
+ glVertex3f(x * r1, y * r1, z1);
+
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+
+ glPopMatrix();
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * GL funcs.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+#ifndef STANDALONE
+static void Reshape(ModeInfo * mi)
+#else
+ENTRYPOINT void reshape_sballs(ModeInfo * mi, int width, int height)
+#endif
+{
+
+ sballsstruct *sb = &sballs[MI_SCREEN(mi)];
+ int size = MI_SIZE(mi);
+
+ /* Viewport is specified size if size >= MINSIZE && size < screensize */
+ if (size <= 1) {
+ sb->WIDTH = MI_WIDTH(mi);
+ sb->HEIGHT = MI_HEIGHT(mi);
+ } else if (size < MINSIZE) {
+ sb->WIDTH = MINSIZE;
+ sb->HEIGHT = MINSIZE;
+ } else {
+ sb->WIDTH = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size;
+ sb->HEIGHT = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size;
+ }
+
+ if (width > height * 5) { /* tiny window: show middle */
+ sb->WIDTH = width;
+ sb->HEIGHT = sb->WIDTH*0.75;
+ }
+
+ glViewport((MI_WIDTH(mi) - sb->WIDTH) / 2, (MI_HEIGHT(mi) - sb->HEIGHT) / 2, sb->WIDTH, sb->HEIGHT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(55.0, (float)sb->WIDTH / (float) sb->HEIGHT, 1.0, 300.0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+}
+
+static void Draw(ModeInfo * mi)
+{
+ sballsstruct *sb = &sballs[MI_SCREEN(mi)];
+ int sphere;
+
+ mi->polygon_count = 0;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glEnable(GL_DEPTH_TEST);
+
+ /* move eyes */
+ glTranslatef (-sb->eye[0], -sb->eye[1], -sb->eye[2]);
+
+ /* draw background */
+ if (do_texture)
+ {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_TEXTURE_2D);
+ glColor3f(1, 1, 1);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, sb->backid);
+#endif /* HAVE_GLBINDTEXTURE */
+ }
+ else
+ {
+ glColor3f(0, 0, 0);
+ }
+ glBegin(GL_QUAD_STRIP);
+#ifndef HAVE_MOBILE
+ /* Letterbox the background image */
+ glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(8, 4.1, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(8, -4.1, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-8, 4.1, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-8, -4.1, -4);
+#else
+ /* Fill the iPhone screen. Letterboxing looks dumb there. */
+ glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(4, 5.2, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(4, -5.2, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-4, 5.2, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-4, -5.2, -4);
+#endif
+ glEnd();
+ mi->polygon_count++;
+
+ gltrackball_rotate (sb->trackball);
+
+ /* rotate the balls */
+ glRotatef(sb->rotm[0], 1.0f, 0.0f, 0.0f);
+ glRotatef(sb->rotm[1], 0.0f, 1.0f, 0.0f);
+ glRotatef(sb->rotm[2], 0.0f, 0.0f, 1.0f);
+
+ if (! sb->button_down_p) {
+ sb->rotm[0] += sb->speed;
+ sb->rotm[1] += -(sb->speed);
+ sb->rotm[2] += 0;
+ }
+
+ /* draw the balls */
+ if (do_texture)
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, sb->faceid);
+ else
+#endif /* HAVE_GLBINDTEXTURE */
+ glEnable(GL_LIGHTING);
+ for (sphere=0;sphere<spheres;sphere++)
+ {
+ drawSphere(mi,sphere);
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_LIGHTING);
+
+ /* manage framerate display */
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glPopMatrix();
+}
+
+
+static void Init(ModeInfo * mi)
+{
+ sballsstruct *sb = &sballs[MI_SCREEN(mi)];
+ int i;
+
+ /* Default settings */
+ if (MI_IS_WIREFRAME(mi))
+ do_texture = False;
+ if (do_texture)
+ inittextures(mi);
+ else
+ {
+ sb->btexture = (XImage*) NULL;
+ sb->ftexture = (XImage*) NULL;
+ }
+
+ vinit(sb->eye ,0.0f, 0.0f, 6.0f);
+ vinit(sb->rotm ,0.0f, 0.0f, 0.0f);
+ sb->speed = MI_CYCLES(mi);
+
+ /* initialise object number */
+ object = object_arg-1;
+ if (object < 0 || object >= MAX_OBJ)
+ object = NRAND(MAX_OBJ);
+
+ /* initialise sphere number */
+ spheres = MI_COUNT(mi);
+ if (MI_COUNT(mi) > polygons[object].numverts)
+ spheres = polygons[object].numverts;
+ if (MI_COUNT(mi) < 1)
+ spheres = polygons[object].numverts;
+ /* initialise sphere radius */
+ for(i=0; i < spheres;i++)
+ {
+#if RANDOM_RADIUS
+ sb->radius[i] = ((float) LRAND() / (float) MAXRAND);
+ if (sb->radius[i] < 0.3)
+ sb->radius[i] = 0.3;
+ if (sb->radius[i] > 0.7)
+ sb->radius[i] = 0.7;
+#else
+ sb->radius[i] = polygons[object].radius;
+#endif
+ }
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tobject=%s\n\tspheres=%d\n\tspeed=%d\n\ttexture=%s\n",
+ MI_NAME(mi),
+ polygons[object].shortname,
+ spheres,
+ (int) MI_CYCLES(mi),
+ do_texture ? "on" : "off"
+ );
+ }
+
+ glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
+ glEnable(GL_LIGHT1);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize sballs. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_sballs(ModeInfo * mi)
+{
+ sballsstruct *sb;
+
+ MI_INIT(mi, sballs);
+ sb = &sballs[MI_SCREEN(mi)];
+
+ sb->trackball = gltrackball_init (True);
+
+ if ((sb->glx_context = init_GL(mi)) != NULL) {
+
+#ifndef STANDALONE
+ Reshape(mi); /* xlock mode */
+#else
+ reshape_sballs(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
+#endif
+ glDrawBuffer(GL_BACK);
+ Init(mi);
+
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_sballs(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ sballsstruct *sb;
+
+ if (sballs == NULL)
+ return;
+ sb = &sballs[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!sb->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(sb->glx_context));
+ Draw(mi);
+#ifndef STANDALONE
+ Reshape(mi); /* xlock mode */
+#else
+ reshape_sballs(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
+#endif
+
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * The display is being taken away from us. Free up malloc'ed
+ * memory and X resources that we've alloc'ed.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void free_sballs(ModeInfo * mi)
+{
+ sballsstruct *sb = &sballs[MI_SCREEN(mi)];
+ if (sb->glx_context)
+ {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sb->glx_context));
+ if (sb->btexture)
+ {
+ glDeleteTextures(1,&sb->backid);
+ XDestroyImage(sb->btexture);
+ sb->btexture = 0;
+ }
+ if (sb->ftexture)
+ {
+ glDeleteTextures(1,&sb->faceid);
+ XDestroyImage(sb->ftexture);
+ sb->ftexture = 0;
+ }
+ }
+}
+
+ENTRYPOINT Bool
+sballs_handle_event (ModeInfo *mi, XEvent *event)
+{
+ sballsstruct *sb = &sballs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, sb->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sb->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_sballs(ModeInfo * mi)
+{
+ sballsstruct *sb;
+
+ if (sballs == NULL)
+ return;
+ sb = &sballs[MI_SCREEN(mi)];
+
+ if (!sb->glx_context)
+ return;
+
+ /* initialise object number */
+ if ((object == 0) || (object > MAX_OBJ))
+ object = NRAND(MAX_OBJ-1)+1;
+ object--;
+
+ /* correct sphere number */
+ spheres = MI_COUNT(mi);
+ if (MI_COUNT(mi) > polygons[object].numverts)
+ spheres = polygons[object].numverts;
+ if (MI_COUNT(mi) < 1)
+ spheres = polygons[object].numverts;
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tobject=%s\n\tspheres=%d\n\tspeed=%d\n\ttexture=%s\n",
+ MI_NAME(mi),
+ polygons[object].shortname,
+ spheres,
+ (int) MI_CYCLES(mi),
+ do_texture ? "on" : "off"
+ );
+ }
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sb->glx_context));
+
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("SBalls", sballs)
+
+#endif /* MODE_sballs */
diff --git a/hacks/glx/sballs.man b/hacks/glx/sballs.man
new file mode 100644
index 0000000..33cb942
--- /dev/null
+++ b/hacks/glx/sballs.man
@@ -0,0 +1,125 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "03-Oct-01" "X Version 11"
+.SH NAME
+sballs - draws balls spinning like crazy in GL
+.SH SYNOPSIS
+.B sballs
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-object \fIobject_number\fP]
+[\-cycles \fIsphere_speed\fP]
+[\-size \fIviewport_size\fP]
+[\-texture] [\-no-texture]
+[\-wireframe] [\-no-wireframe]
+[\-trackmouse] [\-no-trackmouse]
+[\-fps]
+.SH DESCRIPTION
+The \fIsballs\fP program draws an animation of balls spinning like crazy in GL.
+.SH OPTIONS
+.I sballs
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-object \fIobject_number\fP\fP
+Specify how the spheres are grouped (forming an object).
+Objects are:
+.TP 10
+.B 1
+tetrahedron
+.TP 10
+.B 2
+cube. This is the default.
+.TP 10
+.B 3
+octahedron
+.TP 10
+.B 4
+dodecahedron
+.TP 10
+.B 5
+icosahedron
+.TP 10
+.B 6
+plane
+.TP 10
+.B 7
+pyramid
+.TP 10
+.B 8
+star
+.TP 8
+.B \-size \fIviewport_size\fP\fP
+Viewport of GL scene is specified size if greater than 32 and less than screensize. Default value is 0, meaning full screensize.
+.TP 8
+.B \-texture
+Show a textured background and spheres. This is the default.
+.TP 8
+.B \-no\-texture
+Disables texturing the animation.
+.TP 8
+.B \-trackmouse
+Let the mouse be a joystick to change the view of the animation.
+This implies
+.I \-no\-wander.
+.TP 8
+.B \-no\-trackmouse
+Disables mouse tracking. This is the default.
+.TP 8
+.B \-wire
+Draw a wireframe rendition of the spheres.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Eric Lassauge.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+
+The original code for this mode was written by
+Mustata Bogdan (LoneRunner) <lonerunner@planetquake.com>
+and can be found at http://www.cfxweb.net/lonerunner/
+
+.SH AUTHOR
+Mustata Bogdan (LoneRunner) <lonerunner@planetquake.com>
+Eric Lassauge <lassauge@users.sourceforge.net>
diff --git a/hacks/glx/seccam.c b/hacks/glx/seccam.c
new file mode 100644
index 0000000..a72dd1a
--- /dev/null
+++ b/hacks/glx/seccam.c
@@ -0,0 +1,1388 @@
+/* Generated from "seccam.dxf" on 31-May-2017.
+ Smoothed vertex normals.
+ Components: body, cap, hinge, lens, pipe.
+ */
+
+#include "gllist.h"
+
+static const float seccam_body_data[] = {
+ 0,0.894427,0.447214,-5,2.25,5,
+ 0,0.952226,0.305393,7.75,3,3.5,
+ 0,0.988273,0.152697,-5,3,3.5,
+ 0,0.952226,0.305393,7.75,3,3.5,
+ 0,0.894427,0.447214,-5,2.25,5,
+ 0,0.894427,0.447214,7.75,2.25,5,
+ 0,0.172669,-0.98498,7.75,2.450912,1.010298,
+ 0,0.083016,-0.996548,-5,2.36871,1,
+ 0,0.22073,-0.975335,-5,2.450912,1.010298,
+ 0,0.083016,-0.996548,-5,2.36871,1,
+ 0,0.172669,-0.98498,7.75,2.450912,1.010298,
+ 0,0.041508,-0.999138,7.75,2.36871,1,
+ 0,0.996548,-0.083016,-5,3,1.63129,
+ 0,0.98498,-0.172669,7.75,2.989702,1.549088,
+ 0,0.975335,-0.22073,-5,2.989702,1.549088,
+ 0,0.98498,-0.172669,7.75,2.989702,1.549088,
+ 0,0.996548,-0.083016,-5,3,1.63129,
+ 0,0.999138,-0.041508,7.75,3,1.63129,
+ 0,0.041508,-0.999138,7.75,2.36871,1,
+ 0,0,-1,-5,2.25,1,
+ 0,0.083016,-0.996548,-5,2.36871,1,
+ 0,0,-1,-5,2.25,1,
+ 0,0.041508,-0.999138,7.75,2.36871,1,
+ 0,0,-1,7.75,2.25,1,
+ 0,0.450399,-0.892827,7.75,2.640242,1.078314,
+ 0,0.361055,-0.932544,-5,2.548078,1.037344,
+ 0,0.49361,-0.869683,-5,2.640242,1.078314,
+ 0,0.361055,-0.932544,-5,2.548078,1.037344,
+ 0,0.450399,-0.892827,7.75,2.640242,1.078314,
+ 0,0.314923,-0.949117,7.75,2.548078,1.037344,
+ 0,0.869683,-0.49361,-5,2.921686,1.359758,
+ 0,0.817322,-0.576182,7.75,2.867672,1.274581,
+ 0,0.788104,-0.615542,-5,2.867672,1.274581,
+ 0,0.817322,-0.576182,7.75,2.867672,1.274581,
+ 0,0.869683,-0.49361,-5,2.921686,1.359758,
+ 0,0.892827,-0.450399,7.75,2.921686,1.359758,
+ 0,0,-1,7.75,2.25,1,
+ 0,0,-1,-5,0,1,
+ 0,0,-1,-5,2.25,1,
+ 0,0,-1,-5,0,1,
+ 0,0,-1,7.75,2.25,1,
+ 0,0,-1,7.75,0,1,
+ 0,0,1,7.75,0,5,
+ 0,0,1,-5,2.25,5,
+ 0,0,1,-5,0,5,
+ 0,0,1,-5,2.25,5,
+ 0,0,1,7.75,0,5,
+ 0,0,1,7.75,2.25,5,
+ 0,0.576182,-0.817322,7.75,2.725419,1.132328,
+ 0,0.49361,-0.869683,-5,2.640242,1.078314,
+ 0,0.615542,-0.788104,-5,2.725419,1.132328,
+ 0,0.49361,-0.869683,-5,2.640242,1.078314,
+ 0,0.576182,-0.817322,7.75,2.725419,1.132328,
+ 0,0.450399,-0.892827,7.75,2.640242,1.078314,
+ 0,1,0,-5,3,1.75,
+ 0,0.999138,-0.041508,7.75,3,1.63129,
+ 0,0.996548,-0.083016,-5,3,1.63129,
+ 0,0.999138,-0.041508,7.75,3,1.63129,
+ 0,1,0,-5,3,1.75,
+ 0,1,0,7.75,3,1.75,
+ 0,0.932544,-0.361055,-5,2.962656,1.451922,
+ 0,0.892827,-0.450399,7.75,2.921686,1.359758,
+ 0,0.869683,-0.49361,-5,2.921686,1.359758,
+ 0,0.892827,-0.450399,7.75,2.921686,1.359758,
+ 0,0.932544,-0.361055,-5,2.962656,1.451922,
+ 0,0.949117,-0.314923,7.75,2.962656,1.451922,
+ 0,0.788104,-0.615542,-5,2.867672,1.274581,
+ 0,0.707107,-0.707107,7.75,2.801777,1.198223,
+ 0,0.707107,-0.707107,-5,2.801777,1.198223,
+ 0,0.707107,-0.707107,7.75,2.801777,1.198223,
+ 0,0.788104,-0.615542,-5,2.867672,1.274581,
+ 0,0.817322,-0.576182,7.75,2.867672,1.274581,
+ 0,0.988273,0.152697,-5,3,3.5,
+ 0,1,0,7.75,3,1.75,
+ 0,1,0,-5,3,1.75,
+ 0,1,0,7.75,3,1.75,
+ 0,0.988273,0.152697,-5,3,3.5,
+ 0,0.952226,0.305393,7.75,3,3.5,
+ 0,0.975335,-0.22073,-5,2.989702,1.549088,
+ 0,0.949117,-0.314923,7.75,2.962656,1.451922,
+ 0,0.932544,-0.361055,-5,2.962656,1.451922,
+ 0,0.949117,-0.314923,7.75,2.962656,1.451922,
+ 0,0.975335,-0.22073,-5,2.989702,1.549088,
+ 0,0.98498,-0.172669,7.75,2.989702,1.549088,
+ 0,0.707107,-0.707107,7.75,2.801777,1.198223,
+ 0,0.615542,-0.788104,-5,2.725419,1.132328,
+ 0,0.707107,-0.707107,-5,2.801777,1.198223,
+ 0,0.615542,-0.788104,-5,2.725419,1.132328,
+ 0,0.707107,-0.707107,7.75,2.801777,1.198223,
+ 0,0.576182,-0.817322,7.75,2.725419,1.132328,
+ 0,0.314923,-0.949117,7.75,2.548078,1.037344,
+ 0,0.22073,-0.975335,-5,2.450912,1.010298,
+ 0,0.361055,-0.932544,-5,2.548078,1.037344,
+ 0,0.22073,-0.975335,-5,2.450912,1.010298,
+ 0,0.314923,-0.949117,7.75,2.548078,1.037344,
+ 0,0.172669,-0.98498,7.75,2.450912,1.010298,
+ 1,0,0,7.75,3.002239,1.649165,
+ 1,0,0,7.75,3,1.75,
+ 1,0,0,7.75,3,1.63129,
+ 1,0,0,7.75,2.36871,1,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,2.350835,0.997761,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,0,1.875,
+ 1,0,0,7.75,0,1,
+ 1,0,0,7.75,0,1.875,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,1.174754,1.875947,
+ 1,0,0,7.75,1.174754,1.875947,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,1.245773,1.89962,
+ 1,0,0,7.75,1.245773,1.89962,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,1.306225,1.943775,
+ 1,0,0,7.75,1.306225,1.943775,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,1.35038,2.004227,
+ 1,0,0,7.75,1.35038,2.004227,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,1.374053,2.075246,
+ 1,0,0,7.75,1.374053,2.075246,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,1.374053,3.924754,
+ 1,0,0,7.75,1.174754,4.124053,
+ 1,0,0,7.75,0,5,
+ 1,0,0,7.75,0,4.125,
+ 1,0,0,7.75,0,5,
+ 1,0,0,7.75,1.174754,4.124053,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,1.174754,4.124053,
+ 1,0,0,7.75,1.245773,4.10038,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,1.245773,4.10038,
+ 1,0,0,7.75,1.306225,4.056225,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,1.306225,4.056225,
+ 1,0,0,7.75,1.35038,3.995773,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,1.35038,3.995773,
+ 1,0,0,7.75,1.374053,3.924754,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,1.374053,3.924754,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,2.25,1,
+ 1,0,0,7.75,2.36871,1,
+ 1,0,0,7.75,2.25,5,
+ 1,0,0,7.75,2.36871,1,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.36871,1,
+ 1,0,0,7.75,2.450912,1.010298,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.450912,1.010298,
+ 1,0,0,7.75,2.548078,1.037344,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.548078,1.037344,
+ 1,0,0,7.75,2.640242,1.078314,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.640242,1.078314,
+ 1,0,0,7.75,2.725419,1.132328,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.725419,1.132328,
+ 1,0,0,7.75,2.801777,1.198223,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.801777,1.198223,
+ 1,0,0,7.75,2.867672,1.274581,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.867672,1.274581,
+ 1,0,0,7.75,2.921686,1.359758,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.921686,1.359758,
+ 1,0,0,7.75,2.962656,1.451922,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.962656,1.451922,
+ 1,0,0,7.75,2.989702,1.549088,
+ 1,0,0,7.75,3,3.5,
+ 1,0,0,7.75,2.989702,1.549088,
+ 1,0,0,7.75,3,1.63129,
+ 0.966335,0.244997,0.078574,7.75,3,3.5,
+ 0.555363,0.830891,-0.034519,7.75,3,1.63129,
+ 0.316228,0.948683,0,7.75,3,1.75,
+ 0,-0.976994,0.213265,7.75,1.374053,2.075246,
+ 0,-0.888698,0.458494,7.55,1.35038,2.004227,
+ 0,-0.888698,0.458494,7.75,1.35038,2.004227,
+ 0,-0.888698,0.458494,7.55,1.35038,2.004227,
+ 0,-0.976994,0.213265,7.75,1.374053,2.075246,
+ 0,-0.994299,0.106632,7.55,1.374053,2.075246,
+ 0,-0.000806,1,7.75,0,1.875,
+ 0,-0.10717,0.994241,7.55,1.174754,1.875947,
+ 0,-0.000806,1,7.55,0,1.875,
+ 0,-0.10717,0.994241,7.55,1.174754,1.875947,
+ 0,-0.000806,1,7.75,0,1.875,
+ 0,-0.213524,0.976938,7.75,1.174754,1.875947,
+ 0,-0.10717,-0.994241,7.75,1.174754,4.124053,
+ 0,-0.000806,-1,7.55,0,4.125,
+ 0,-0.213524,-0.976938,7.55,1.174754,4.124053,
+ 0,-0.000806,-1,7.55,0,4.125,
+ 0,-0.10717,-0.994241,7.75,1.174754,4.124053,
+ 0,-0.000806,-1,7.75,0,4.125,
+ 0,-0.411789,-0.911279,7.75,1.245773,4.10038,
+ 0,-0.213524,-0.976938,7.55,1.174754,4.124053,
+ 0,-0.503965,-0.863724,7.55,1.245773,4.10038,
+ 0,-0.213524,-0.976938,7.55,1.174754,4.124053,
+ 0,-0.411789,-0.911279,7.75,1.245773,4.10038,
+ 0,-0.10717,-0.994241,7.75,1.174754,4.124053,
+ 0,-0.911279,-0.411789,7.75,1.35038,3.995773,
+ 0,-0.976994,-0.213265,7.55,1.374053,3.924754,
+ 0,-0.994299,-0.106632,7.75,1.374053,3.924754,
+ 0,-0.976994,-0.213265,7.55,1.374053,3.924754,
+ 0,-0.911279,-0.411789,7.75,1.35038,3.995773,
+ 0,-0.863724,-0.503965,7.55,1.35038,3.995773,
+ 0,-0.742826,0.669484,7.75,1.306225,1.943775,
+ 0,-0.888698,0.458494,7.55,1.35038,2.004227,
+ 0,-0.669484,0.742826,7.55,1.306225,1.943775,
+ 0,-0.888698,0.458494,7.55,1.35038,2.004227,
+ 0,-0.742826,0.669484,7.75,1.306225,1.943775,
+ 0,-0.888698,0.458494,7.75,1.35038,2.004227,
+ 0,-0.707107,-0.707107,7.75,1.306225,4.056225,
+ 0,-0.503965,-0.863724,7.55,1.245773,4.10038,
+ 0,-0.707107,-0.707107,7.55,1.306225,4.056225,
+ 0,-0.503965,-0.863724,7.55,1.245773,4.10038,
+ 0,-0.707107,-0.707107,7.75,1.306225,4.056225,
+ 0,-0.411789,-0.911279,7.75,1.245773,4.10038,
+ 0,-0.213524,0.976938,7.75,1.174754,1.875947,
+ 0,-0.411789,0.911279,7.55,1.245773,1.89962,
+ 0,-0.10717,0.994241,7.55,1.174754,1.875947,
+ 0,-0.411789,0.911279,7.55,1.245773,1.89962,
+ 0,-0.213524,0.976938,7.75,1.174754,1.875947,
+ 0,-0.503965,0.863724,7.75,1.245773,1.89962,
+ 0,-0.994299,-0.106632,7.75,1.374053,3.924754,
+ 0,-0.994299,0.106632,7.55,1.374053,2.075246,
+ 0,-0.976994,0.213265,7.75,1.374053,2.075246,
+ 0,-0.994299,0.106632,7.55,1.374053,2.075246,
+ 0,-0.994299,-0.106632,7.75,1.374053,3.924754,
+ 0,-0.976994,-0.213265,7.55,1.374053,3.924754,
+ 0,-0.503965,0.863724,7.75,1.245773,1.89962,
+ 0,-0.669484,0.742826,7.55,1.306225,1.943775,
+ 0,-0.411789,0.911279,7.55,1.245773,1.89962,
+ 0,-0.669484,0.742826,7.55,1.306225,1.943775,
+ 0,-0.503965,0.863724,7.75,1.245773,1.89962,
+ 0,-0.742826,0.669484,7.75,1.306225,1.943775,
+ 0,-0.707107,-0.707107,7.75,1.306225,4.056225,
+ 0,-0.863724,-0.503965,7.55,1.35038,3.995773,
+ 0,-0.911279,-0.411789,7.75,1.35038,3.995773,
+ 0,-0.863724,-0.503965,7.55,1.35038,3.995773,
+ 0,-0.707107,-0.707107,7.75,1.306225,4.056225,
+ 0,-0.707107,-0.707107,7.55,1.306225,4.056225,
+ -1,0,0,-5,2.25,5,
+ -1,0,0,-5,0,1,
+ -1,0,0,-5,0,5,
+ -1,0,0,-5,0,1,
+ -1,0,0,-5,2.25,5,
+ -1,0,0,-5,2.25,1,
+ -1,0,0,-5,2.25,1,
+ -1,0,0,-5,2.25,5,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.25,1,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.36871,1,
+ -1,0,0,-5,2.36871,1,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.450912,1.010298,
+ -1,0,0,-5,2.450912,1.010298,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.548078,1.037344,
+ -1,0,0,-5,2.548078,1.037344,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.640242,1.078314,
+ -1,0,0,-5,2.640242,1.078314,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.725419,1.132328,
+ -1,0,0,-5,2.725419,1.132328,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.801777,1.198223,
+ -1,0,0,-5,2.801777,1.198223,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.867672,1.274581,
+ -1,0,0,-5,2.867672,1.274581,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.921686,1.359758,
+ -1,0,0,-5,2.921686,1.359758,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.962656,1.451922,
+ -1,0,0,-5,2.962656,1.451922,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,2.989702,1.549088,
+ -1,0,0,-5,2.989702,1.549088,
+ -1,0,0,-5,3,3.5,
+ -1,0,0,-5,3,1.63129,
+ -0.316719,0.945245,-0.078743,-5,3,1.63129,
+ -0.971484,0.234324,0.036205,-5,3,3.5,
+ 0,1,0,-5,3,1.75
+};
+static const struct gllist seccam_body_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 294, seccam_body_data, 0
+};
+const struct gllist *seccam_body = &seccam_body_frame;
+
+static const float seccam_cap_data[] = {
+ 0,-0.499258,-0.866453,9.5,2.292275,5.079185,
+ 0,-0.389309,-0.921107,-5.5,2.247183,5.1016,
+ 0,-0.551704,-0.83404,-5.5,2.292275,5.079185,
+ 0,-0.389309,-0.921107,-5.5,2.247183,5.1016,
+ 0,-0.499258,-0.866453,9.5,2.292275,5.079185,
+ 0,-0.331806,-0.943348,9.5,2.247183,5.1016,
+ 0,-0.672883,-0.739749,9.5,2.332489,5.048877,
+ 0,-0.551704,-0.83404,-5.5,2.292275,5.079185,
+ 0,-0.672883,-0.739749,-5.5,2.332489,5.048877,
+ 0,-0.551704,-0.83404,-5.5,2.292275,5.079185,
+ 0,-0.672883,-0.739749,9.5,2.332489,5.048877,
+ 0,-0.499258,-0.866453,9.5,2.292275,5.079185,
+ 0,-0.331806,-0.943348,9.5,2.247183,5.1016,
+ 0,-0.213696,-0.9769,-5.5,2.198743,5.115361,
+ 0,-0.389309,-0.921107,-5.5,2.247183,5.1016,
+ 0,-0.213696,-0.9769,-5.5,2.198743,5.115361,
+ 0,-0.331806,-0.943348,9.5,2.247183,5.1016,
+ 0,-0.153089,-0.988212,9.5,2.198743,5.115361,
+ 0,-0.153089,-0.988212,9.5,2.198743,5.115361,
+ 0,-0.061479,-0.998108,-5.5,2.148601,5.12,
+ 0,-0.213696,-0.9769,-5.5,2.198743,5.115361,
+ 0,-0.061479,-0.998108,-5.5,2.148601,5.12,
+ 0,-0.153089,-0.988212,9.5,2.198743,5.115361,
+ 0,-0.03074,-0.999527,9.5,2.148601,5.12,
+ 0,-0.815421,-0.578869,9.5,2.36646,5.011706,
+ 0,-0.877321,-0.479905,-5.5,2.393034,4.968932,
+ 0,-0.872852,-0.487984,9.5,2.393034,4.968932,
+ 0,-0.877321,-0.479905,-5.5,2.393034,4.968932,
+ 0,-0.815421,-0.578869,9.5,2.36646,5.011706,
+ 0,-0.778198,-0.628018,-5.5,2.36646,5.011706,
+ 0,-0.03074,-0.999527,9.5,2.148601,5.12,
+ 0,0,-1,-5.5,0,5.12,
+ 0,-0.061479,-0.998108,-5.5,2.148601,5.12,
+ 0,0,-1,-5.5,0,5.12,
+ 0,-0.03074,-0.999527,9.5,2.148601,5.12,
+ 0,0,-1,9.5,0,5.12,
+ 0,-0.672883,-0.739749,9.5,2.332489,5.048877,
+ 0,-0.778198,-0.628018,-5.5,2.36646,5.011706,
+ 0,-0.815421,-0.578869,9.5,2.36646,5.011706,
+ 0,-0.778198,-0.628018,-5.5,2.36646,5.011706,
+ 0,-0.672883,-0.739749,9.5,2.332489,5.048877,
+ 0,-0.672883,-0.739749,-5.5,2.332489,5.048877,
+ 0,0.213696,0.9769,9.5,2.242938,5.153304,
+ 0,0.331806,0.943348,-5.5,2.292351,5.139267,
+ 0,0.153089,0.988212,-5.5,2.242938,5.153304,
+ 0,0.331806,0.943348,-5.5,2.292351,5.139267,
+ 0,0.213696,0.9769,9.5,2.242938,5.153304,
+ 0,0.389309,0.921107,9.5,2.292351,5.139267,
+ 0,0.389309,0.921107,9.5,2.292351,5.139267,
+ 0,0.499258,0.866453,-5.5,2.33835,5.116402,
+ 0,0.331806,0.943348,-5.5,2.292351,5.139267,
+ 0,0.499258,0.866453,-5.5,2.33835,5.116402,
+ 0,0.389309,0.921107,9.5,2.292351,5.139267,
+ 0,0.551704,0.83404,9.5,2.33835,5.116402,
+ 0,0.672883,0.739749,-5.5,2.379372,5.085485,
+ 0,0.778198,0.628018,9.5,2.414026,5.047566,
+ 0,0.815421,0.578869,-5.5,2.414026,5.047566,
+ 0,0.778198,0.628018,9.5,2.414026,5.047566,
+ 0,0.672883,0.739749,-5.5,2.379372,5.085485,
+ 0,0.672883,0.739749,9.5,2.379372,5.085485,
+ 0,0.815421,0.578869,-5.5,2.414026,5.047566,
+ 0,0.865241,0.501356,9.5,2.441134,5.003932,
+ 0,0.883881,0.467712,-5.5,2.441134,5.003932,
+ 0,0.865241,0.501356,9.5,2.441134,5.003932,
+ 0,0.815421,0.578869,-5.5,2.414026,5.047566,
+ 0,0.778198,0.628018,9.5,2.414026,5.047566,
+ 0,0,1,9.5,0,5.158037,
+ 0,0.03074,0.999527,-5.5,2.191788,5.158037,
+ 0,0,1,-5.5,0,5.158037,
+ 0,0.03074,0.999527,-5.5,2.191788,5.158037,
+ 0,0,1,9.5,0,5.158037,
+ 0,0.061479,0.998108,9.5,2.191788,5.158037,
+ 0,0.061479,0.998108,9.5,2.191788,5.158037,
+ 0,0.153089,0.988212,-5.5,2.242938,5.153304,
+ 0,0.03074,0.999527,-5.5,2.191788,5.158037,
+ 0,0.153089,0.988212,-5.5,2.242938,5.153304,
+ 0,0.061479,0.998108,9.5,2.191788,5.158037,
+ 0,0.213696,0.9769,9.5,2.242938,5.153304,
+ 0,0.551704,0.83404,9.5,2.33835,5.116402,
+ 0,0.672883,0.739749,-5.5,2.379372,5.085485,
+ 0,0.499258,0.866453,-5.5,2.33835,5.116402,
+ 0,0.672883,0.739749,-5.5,2.379372,5.085485,
+ 0,0.551704,0.83404,9.5,2.33835,5.116402,
+ 0,0.672883,0.739749,9.5,2.379372,5.085485,
+ 0,0,-1,-5,3.152109,3.22762,
+ -0.004217,0,-0.999991,-5.066635,3.09,3.22762,
+ -0.008435,0,-0.999964,-5.066635,3.152109,3.22762,
+ -0.004217,0,-0.999991,-5.066635,3.09,3.22762,
+ 0,0,-1,-5,3.152109,3.22762,
+ 0,0,-1,-5,3.09,3.22762,
+ -1,0,0,-5.5,2.191788,5.158037,
+ -1,0,0,-5.5,0,5.12,
+ -1,0,0,-5.5,0,5.158037,
+ -1,0,0,-5.5,0,5.12,
+ -1,0,0,-5.5,2.191788,5.158037,
+ -1,0,0,-5.5,2.148601,5.12,
+ -1,0,0,-5.5,2.148601,5.12,
+ -1,0,0,-5.5,2.191788,5.158037,
+ -1,0,0,-5.5,2.198743,5.115361,
+ -1,0,0,-5.5,2.198743,5.115361,
+ -1,0,0,-5.5,2.191788,5.158037,
+ -1,0,0,-5.5,2.242938,5.153304,
+ -1,0,0,-5.5,2.198743,5.115361,
+ -1,0,0,-5.5,2.242938,5.153304,
+ -1,0,0,-5.5,2.247183,5.1016,
+ -1,0,0,-5.5,2.247183,5.1016,
+ -1,0,0,-5.5,2.242938,5.153304,
+ -1,0,0,-5.5,2.292351,5.139267,
+ -1,0,0,-5.5,2.247183,5.1016,
+ -1,0,0,-5.5,2.292351,5.139267,
+ -1,0,0,-5.5,2.292275,5.079185,
+ -1,0,0,-5.5,2.292275,5.079185,
+ -1,0,0,-5.5,2.292351,5.139267,
+ -1,0,0,-5.5,2.332489,5.048877,
+ -1,0,0,-5.5,2.332489,5.048877,
+ -1,0,0,-5.5,2.292351,5.139267,
+ -1,0,0,-5.5,2.33835,5.116402,
+ -1,0,0,-5.5,2.332489,5.048877,
+ -1,0,0,-5.5,2.33835,5.116402,
+ -1,0,0,-5.5,2.36646,5.011706,
+ -1,0,0,-5.5,2.36646,5.011706,
+ -1,0,0,-5.5,2.33835,5.116402,
+ -1,0,0,-5.5,2.379372,5.085485,
+ -1,0,0,-5.5,2.36646,5.011706,
+ -1,0,0,-5.5,2.379372,5.085485,
+ -1,0,0,-5.5,2.393034,4.968932,
+ -1,0,0,-5.5,2.393034,4.968932,
+ -1,0,0,-5.5,2.379372,5.085485,
+ -1,0,0,-5.5,2.414026,5.047566,
+ -1,0,0,-5.5,2.393034,4.968932,
+ -1,0,0,-5.5,2.414026,5.047566,
+ -1,0,0,-5.5,3.012323,3.730353,
+ -1,0,0,-5.5,3.012323,3.730353,
+ -1,0,0,-5.5,2.414026,5.047566,
+ -1,0,0,-5.5,2.441134,5.003932,
+ -1,0,0,-5.5,3.012323,3.730353,
+ -1,0,0,-5.5,2.441134,5.003932,
+ -1,0,0,-5.5,3.072871,3.740458,
+ -1,0,0,-5.5,3.012323,3.730353,
+ -1,0,0,-5.5,3.072871,3.740458,
+ -0.999991,0,-0.004217,-5.5,3.013942,3.726777,
+ -0.999991,0,-0.004217,-5.5,3.013942,3.726777,
+ -1,0,0,-5.5,3.072871,3.740458,
+ -0.999979,-0.003174,-0.005654,-5.5,3.079063,3.726777,
+ -0.008435,0,-0.999964,-5.066635,3.152109,3.22762,
+ -0.115062,0,-0.993358,-5.136049,3.09,3.228498,
+ -0.217337,0,-0.976097,-5.136049,3.152109,3.228498,
+ -0.115062,0,-0.993358,-5.136049,3.09,3.228498,
+ -0.008435,0,-0.999964,-5.066635,3.152109,3.22762,
+ -0.004217,0,-0.999991,-5.066635,3.09,3.22762,
+ -0.217337,0,-0.976097,-5.136049,3.152109,3.228498,
+ -0.411789,0,-0.911279,-5.265128,3.09,3.271524,
+ -0.503965,0,-0.863724,-5.265128,3.152109,3.271524,
+ -0.411789,0,-0.911279,-5.265128,3.09,3.271524,
+ -0.217337,0,-0.976097,-5.136049,3.152109,3.228498,
+ -0.115062,0,-0.993358,-5.136049,3.09,3.228498,
+ -0.503965,0,-0.863724,-5.265128,3.152109,3.271524,
+ -0.707107,0,-0.707107,-5.375,3.09,3.351777,
+ -0.742826,0,-0.669484,-5.375,3.152109,3.351777,
+ -0.707107,0,-0.707107,-5.375,3.09,3.351777,
+ -0.503965,0,-0.863724,-5.265128,3.152109,3.271524,
+ -0.411789,0,-0.911279,-5.265128,3.09,3.271524,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.807527,0,-0.589831,-5.452667,3.087804,3.458109,
+ -0.911279,0,-0.411789,-5.455253,3.087392,3.461649,
+ -0.807527,0,-0.589831,-5.452667,3.087804,3.458109,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.807527,0,-0.589831,-5.41118,3.09,3.40131,
+ -0.807527,0,-0.589831,-5.41118,3.09,3.40131,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.707107,0,-0.707107,-5.375,3.09,3.351777,
+ -0.707107,0,-0.707107,-5.375,3.09,3.351777,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.742826,0,-0.669484,-5.375,3.152109,3.351777,
+ -0.742826,0,-0.669484,-5.375,3.152109,3.351777,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.807527,0,-0.589831,-5.41373,3.152109,3.404801,
+ -0.973406,0.015316,-0.228574,-5.498279,3.128292,3.590727,
+ -0.948683,0,-0.316228,-5.491487,3.070318,3.570354,
+ -0.993064,-0.002828,-0.117538,-5.498279,3.064669,3.590727,
+ -0.948683,0,-0.316228,-5.491487,3.070318,3.570354,
+ -0.973406,0.015316,-0.228574,-5.498279,3.128292,3.590727,
+ -0.948683,0,-0.316228,-5.472893,3.08123,3.514569,
+ -0.948683,0,-0.316228,-5.472893,3.08123,3.514569,
+ -0.973406,0.015316,-0.228574,-5.498279,3.128292,3.590727,
+ -0.911279,0,-0.411789,-5.455253,3.087392,3.461649,
+ -0.911279,0,-0.411789,-5.455253,3.087392,3.461649,
+ -0.973406,0.015316,-0.228574,-5.498279,3.128292,3.590727,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.973406,0.015316,-0.228574,-5.498279,3.128292,3.590727,
+ -0.948683,0,-0.316228,-5.493784,3.132031,3.577243,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.948683,0,-0.316228,-5.493784,3.132031,3.577243,
+ -0.948683,0,-0.316228,-5.474815,3.143163,3.520337,
+ -0.880629,0,-0.473806,-5.455253,3.149911,3.461649,
+ -0.948683,0,-0.316228,-5.474815,3.143163,3.520337,
+ -0.948683,0,-0.316228,-5.455617,3.149869,3.462742,
+ 0.002121,-0.92655,-0.376167,-5,3.035761,3.678568,
+ 0.004239,-0.926812,-0.375501,-5.499357,3.034537,3.675953,
+ 0.001061,-0.94351,-0.331343,-5.498714,3.055131,3.625129,
+ 0.004239,-0.926812,-0.375501,-5.499357,3.034537,3.675953,
+ 0.002121,-0.92655,-0.376167,-5,3.035761,3.678568,
+ 0.00106,-0.915118,-0.403184,-5.5,3.013942,3.726777,
+ -0.999844,0.016157,-0.007185,-5.5,3.09678,3.687633,
+ -0.999852,-0.007895,-0.015313,-5.498714,3.055131,3.625129,
+ -0.999925,-0.005639,-0.01087,-5.499357,3.034537,3.675953,
+ -0.999852,-0.007895,-0.015313,-5.498714,3.055131,3.625129,
+ -0.999844,0.016157,-0.007185,-5.5,3.09678,3.687633,
+ -0.993064,-0.002828,-0.117538,-5.498279,3.064669,3.590727,
+ -0.993064,-0.002828,-0.117538,-5.498279,3.064669,3.590727,
+ -0.999844,0.016157,-0.007185,-5.5,3.09678,3.687633,
+ -0.973406,0.015316,-0.228574,-5.498279,3.128292,3.590727,
+ -0.973406,0.015316,-0.228574,-5.498279,3.128292,3.590727,
+ -0.999844,0.016157,-0.007185,-5.5,3.09678,3.687633,
+ -0.994223,0.106009,0.016812,-5.498815,3.116539,3.633119,
+ -0.999979,-0.003174,-0.005654,-5.5,3.079063,3.726777,
+ -0.999925,-0.005639,-0.01087,-5.499357,3.034537,3.675953,
+ -0.999991,0,-0.004217,-5.5,3.013942,3.726777,
+ -0.999925,-0.005639,-0.01087,-5.499357,3.034537,3.675953,
+ -0.999979,-0.003174,-0.005654,-5.5,3.079063,3.726777,
+ -0.999844,0.016157,-0.007185,-5.5,3.09678,3.687633,
+ 0,0.963648,0.267176,-5.498279,3.128292,3.590727,
+ 0,0.970208,0.242274,8.7276,3.132031,3.577243,
+ 0,0.976128,0.217194,-5.493784,3.132031,3.577243,
+ 0,0.970208,0.242274,8.7276,3.132031,3.577243,
+ 0,0.963648,0.267176,-5.498279,3.128292,3.590727,
+ 0,0.956449,0.291901,8.783476,3.116539,3.633119,
+ 0,0.956449,0.291901,8.783476,3.116539,3.633119,
+ 0,0.963648,0.267176,-5.498279,3.128292,3.590727,
+ 0,0.94861,0.316448,-5.498815,3.116539,3.633119,
+ 0,0,-1,8.377977,3.152109,3.22762,
+ 0,0,-1,-5,3.09,3.22762,
+ 0,0,-1,-5,3.152109,3.22762,
+ 0,0,-1,-5,3.09,3.22762,
+ 0,0,-1,8.377977,3.152109,3.22762,
+ 0,0,-1,8.377977,3.09,3.22762,
+ 0,-0.997016,-0.077198,8.608467,3.087804,3.458109,
+ 0,-0.999668,-0.025756,-5.41118,3.09,3.40131,
+ 0,-0.999985,-0.005519,8.551667,3.09,3.40131,
+ 0,-0.999668,-0.025756,-5.41118,3.09,3.40131,
+ 0,-0.997016,-0.077198,8.608467,3.087804,3.458109,
+ 0,-0.997016,-0.077198,-5.452667,3.087804,3.458109,
+ 0,0.883881,0.467712,-5.5,2.441134,5.003932,
+ 0,0.904554,0.42636,8.890816,3.072871,3.740458,
+ 0,0.902899,0.429852,-5.5,3.072871,3.740458,
+ 0,0.904554,0.42636,8.890816,3.072871,3.740458,
+ 0,0.883881,0.467712,-5.5,2.441134,5.003932,
+ 0,0.894427,0.447214,9.5,2.768279,4.349643,
+ 0,0.894427,0.447214,9.5,2.768279,4.349643,
+ 0,0.883881,0.467712,-5.5,2.441134,5.003932,
+ 0,0.865241,0.501356,9.5,2.441134,5.003932,
+ 0,0.976128,0.217194,-5.493784,3.132031,3.577243,
+ 0,0.986016,0.166653,8.670694,3.143163,3.520337,
+ 0,0.989982,0.141191,-5.474815,3.143163,3.520337,
+ 0,0.986016,0.166653,8.670694,3.143163,3.520337,
+ 0,0.976128,0.217194,-5.493784,3.132031,3.577243,
+ 0,0.970208,0.242274,8.7276,3.132031,3.577243,
+ 0,-0.958309,-0.285734,8.775486,3.055131,3.625129,
+ 0,-0.973249,-0.229753,-5.491487,3.070318,3.570354,
+ 0,-0.973249,-0.229753,8.720711,3.070318,3.570354,
+ 0,-0.973249,-0.229753,-5.491487,3.070318,3.570354,
+ 0,-0.958309,-0.285734,8.775486,3.055131,3.625129,
+ 0,-0.963648,-0.267176,-5.498279,3.064669,3.590727,
+ 0,-0.963648,-0.267176,-5.498279,3.064669,3.590727,
+ 0,-0.958309,-0.285734,8.775486,3.055131,3.625129,
+ 0.001061,-0.94351,-0.331343,-5.498714,3.055131,3.625129,
+ 0,-0.902899,-0.429852,8.880711,3.012323,3.730353,
+ 0,-0.877321,-0.479905,-5.5,2.393034,4.968932,
+ 0,-0.902899,-0.429852,-5.5,3.012323,3.730353,
+ 0,-0.877321,-0.479905,-5.5,2.393034,4.968932,
+ 0,-0.902899,-0.429852,8.880711,3.012323,3.730353,
+ 0,-0.894427,-0.447214,9.5,2.702679,4.349643,
+ 0,-0.877321,-0.479905,-5.5,2.393034,4.968932,
+ 0,-0.894427,-0.447214,9.5,2.702679,4.349643,
+ 0,-0.872852,-0.487984,9.5,2.393034,4.968932,
+ 0,1,0,-5.136049,3.152109,3.228498,
+ 0,1,0,-5,3.152109,3.22762,
+ 0,1,0,-5.066635,3.152109,3.22762,
+ 0,1,0,-5,3.152109,3.22762,
+ 0,1,0,-5.136049,3.152109,3.228498,
+ 0,1,0,8.377977,3.152109,3.22762,
+ 0,1,0,8.377977,3.152109,3.22762,
+ 0,1,0,-5.136049,3.152109,3.228498,
+ 0,0.999917,0.012878,8.555159,3.152109,3.404801,
+ 0,0.999917,0.012878,8.555159,3.152109,3.404801,
+ 0,1,0,-5.136049,3.152109,3.228498,
+ 0,1,0,-5.265128,3.152109,3.271524,
+ 0,0.999917,0.012878,8.555159,3.152109,3.404801,
+ 0,1,0,-5.265128,3.152109,3.271524,
+ 0,1,0,-5.375,3.152109,3.351777,
+ 0,0.999917,0.012878,8.555159,3.152109,3.404801,
+ 0,1,0,-5.375,3.152109,3.351777,
+ 0,0.999813,0.019317,-5.41373,3.152109,3.404801,
+ 0,-0.926282,-0.376831,8.828926,3.035761,3.678568,
+ 0.00106,-0.915118,-0.403184,-5.5,3.013942,3.726777,
+ 0.002121,-0.92655,-0.376167,-5,3.035761,3.678568,
+ 0.00106,-0.915118,-0.403184,-5.5,3.013942,3.726777,
+ 0,-0.926282,-0.376831,8.828926,3.035761,3.678568,
+ 0,-0.902899,-0.429852,8.880711,3.012323,3.730353,
+ 0.00106,-0.915118,-0.403184,-5.5,3.013942,3.726777,
+ 0,-0.902899,-0.429852,8.880711,3.012323,3.730353,
+ 0,-0.902899,-0.429852,-5.5,3.012323,3.730353,
+ 0,-0.988081,-0.153935,8.664927,3.08123,3.514569,
+ 0,-0.973249,-0.229753,-5.491487,3.070318,3.570354,
+ 0,-0.988081,-0.153935,-5.472893,3.08123,3.514569,
+ 0,-0.973249,-0.229753,-5.491487,3.070318,3.570354,
+ 0,-0.988081,-0.153935,8.664927,3.08123,3.514569,
+ 0,-0.973249,-0.229753,8.720711,3.070318,3.570354,
+ 0,0.999254,0.038628,-5.455253,3.149911,3.461649,
+ 0,0.999917,0.012878,8.555159,3.152109,3.404801,
+ 0,0.999813,0.019317,-5.41373,3.152109,3.404801,
+ 0,0.999917,0.012878,8.555159,3.152109,3.404801,
+ 0,0.999254,0.038628,-5.455253,3.149911,3.461649,
+ 0,0.997016,0.077198,8.613099,3.149869,3.462742,
+ 0,0.997016,0.077198,8.613099,3.149869,3.462742,
+ 0,0.999254,0.038628,-5.455253,3.149911,3.461649,
+ 0,0.997016,0.077198,-5.455617,3.149869,3.462742,
+ 0,0.92135,0.388735,-5.5,3.09678,3.687633,
+ 0,0.904554,0.42636,8.890816,3.072871,3.740458,
+ 0,0.93106,0.364865,8.83799,3.09678,3.687633,
+ 0,0.904554,0.42636,8.890816,3.072871,3.740458,
+ 0,0.92135,0.388735,-5.5,3.09678,3.687633,
+ 0,0.911034,0.41233,-5.5,3.079063,3.726777,
+ 0,0.904554,0.42636,8.890816,3.072871,3.740458,
+ 0,0.911034,0.41233,-5.5,3.079063,3.726777,
+ 0,0.902899,0.429852,-5.5,3.072871,3.740458,
+ 0,-0.997016,-0.077198,8.608467,3.087804,3.458109,
+ 0,-0.99329,-0.115653,-5.455253,3.087392,3.461649,
+ 0,-0.997016,-0.077198,-5.452667,3.087804,3.458109,
+ 0,-0.99329,-0.115653,-5.455253,3.087392,3.461649,
+ 0,-0.997016,-0.077198,8.608467,3.087804,3.458109,
+ 0,-0.988081,-0.153935,8.664927,3.08123,3.514569,
+ 0,-0.99329,-0.115653,-5.455253,3.087392,3.461649,
+ 0,-0.988081,-0.153935,8.664927,3.08123,3.514569,
+ 0,-0.988081,-0.153935,-5.472893,3.08123,3.514569,
+ 0,0.94861,0.316448,-5.498815,3.116539,3.633119,
+ 0,0.93106,0.364865,8.83799,3.09678,3.687633,
+ 0,0.956449,0.291901,8.783476,3.116539,3.633119,
+ 0,0.93106,0.364865,8.83799,3.09678,3.687633,
+ 0,0.94861,0.316448,-5.498815,3.116539,3.633119,
+ 0,0.92135,0.388735,-5.5,3.09678,3.687633,
+ 0,-0.926282,-0.376831,8.828926,3.035761,3.678568,
+ 0.001061,-0.94351,-0.331343,-5.498714,3.055131,3.625129,
+ 0,-0.958309,-0.285734,8.775486,3.055131,3.625129,
+ 0.001061,-0.94351,-0.331343,-5.498714,3.055131,3.625129,
+ 0,-0.926282,-0.376831,8.828926,3.035761,3.678568,
+ 0.002121,-0.92655,-0.376167,-5,3.035761,3.678568,
+ 0,-0.999985,-0.005519,8.551667,3.09,3.40131,
+ 0,-1,0,-5,3.09,3.22762,
+ 0,-1,0,8.377977,3.09,3.22762,
+ 0,-1,0,-5,3.09,3.22762,
+ 0,-0.999985,-0.005519,8.551667,3.09,3.40131,
+ 0,-1,0,-5.066635,3.09,3.22762,
+ 0,-1,0,-5.066635,3.09,3.22762,
+ 0,-0.999985,-0.005519,8.551667,3.09,3.40131,
+ 0,-1,0,-5.136049,3.09,3.228498,
+ 0,-1,0,-5.136049,3.09,3.228498,
+ 0,-0.999985,-0.005519,8.551667,3.09,3.40131,
+ 0,-1,0,-5.265128,3.09,3.271524,
+ 0,-1,0,-5.265128,3.09,3.271524,
+ 0,-0.999985,-0.005519,8.551667,3.09,3.40131,
+ 0,-1,0,-5.375,3.09,3.351777,
+ 0,-1,0,-5.375,3.09,3.351777,
+ 0,-0.999985,-0.005519,8.551667,3.09,3.40131,
+ 0,-0.999668,-0.025756,-5.41118,3.09,3.40131,
+ 0,0.989982,0.141191,-5.474815,3.143163,3.520337,
+ 0,0.997016,0.077198,8.613099,3.149869,3.462742,
+ 0,0.997016,0.077198,-5.455617,3.149869,3.462742,
+ 0,0.997016,0.077198,8.613099,3.149869,3.462742,
+ 0,0.989982,0.141191,-5.474815,3.143163,3.520337,
+ 0,0.986016,0.166653,8.670694,3.143163,3.520337,
+ 1,0,0,9.5,2.148601,5.12,
+ 1,0,0,9.5,0,5.158037,
+ 1,0,0,9.5,0,5.12,
+ 1,0,0,9.5,0,5.158037,
+ 1,0,0,9.5,2.148601,5.12,
+ 1,0,0,9.5,2.191788,5.158037,
+ 1,0,0,9.5,2.191788,5.158037,
+ 1,0,0,9.5,2.148601,5.12,
+ 1,0,0,9.5,2.198743,5.115361,
+ 1,0,0,9.5,2.191788,5.158037,
+ 1,0,0,9.5,2.198743,5.115361,
+ 1,0,0,9.5,2.242938,5.153304,
+ 1,0,0,9.5,2.242938,5.153304,
+ 1,0,0,9.5,2.198743,5.115361,
+ 1,0,0,9.5,2.247183,5.1016,
+ 1,0,0,9.5,2.242938,5.153304,
+ 1,0,0,9.5,2.247183,5.1016,
+ 1,0,0,9.5,2.292351,5.139267,
+ 1,0,0,9.5,2.292351,5.139267,
+ 1,0,0,9.5,2.247183,5.1016,
+ 1,0,0,9.5,2.292275,5.079185,
+ 1,0,0,9.5,2.292351,5.139267,
+ 1,0,0,9.5,2.292275,5.079185,
+ 1,0,0,9.5,2.332489,5.048877,
+ 1,0,0,9.5,2.292351,5.139267,
+ 1,0,0,9.5,2.332489,5.048877,
+ 1,0,0,9.5,2.33835,5.116402,
+ 1,0,0,9.5,2.33835,5.116402,
+ 1,0,0,9.5,2.332489,5.048877,
+ 1,0,0,9.5,2.36646,5.011706,
+ 1,0,0,9.5,2.33835,5.116402,
+ 1,0,0,9.5,2.36646,5.011706,
+ 1,0,0,9.5,2.379372,5.085485,
+ 1,0,0,9.5,2.379372,5.085485,
+ 1,0,0,9.5,2.36646,5.011706,
+ 1,0,0,9.5,2.393034,4.968932,
+ 1,0,0,9.5,2.379372,5.085485,
+ 1,0,0,9.5,2.393034,4.968932,
+ 1,0,0,9.5,2.414026,5.047566,
+ 1,0,0,9.5,2.414026,5.047566,
+ 1,0,0,9.5,2.393034,4.968932,
+ 1,0,0,9.5,2.702679,4.349643,
+ 1,0,0,9.5,2.414026,5.047566,
+ 1,0,0,9.5,2.702679,4.349643,
+ 1,0,0,9.5,2.441134,5.003932,
+ 1,0,0,9.5,2.441134,5.003932,
+ 1,0,0,9.5,2.702679,4.349643,
+ 1,0,0,9.5,2.768279,4.349643,
+ 0.707107,0,-0.707107,8.377977,3.152109,3.22762,
+ 0.707107,0,-0.707107,8.551667,3.09,3.40131,
+ 0.707107,0,-0.707107,8.377977,3.09,3.22762,
+ 0.707107,0,-0.707107,8.551667,3.09,3.40131,
+ 0.707107,0,-0.707107,8.377977,3.152109,3.22762,
+ 0.707107,0,-0.707107,8.555159,3.152109,3.404801,
+ 0.707107,0,-0.707107,8.551667,3.09,3.40131,
+ 0.707107,0,-0.707107,8.555159,3.152109,3.404801,
+ 0.707107,0,-0.707107,8.608467,3.087804,3.458109,
+ 0.707107,0,-0.707107,8.608467,3.087804,3.458109,
+ 0.707107,0,-0.707107,8.555159,3.152109,3.404801,
+ 0.707107,0,-0.707107,8.613099,3.149869,3.462742,
+ 0.707107,0,-0.707107,8.608467,3.087804,3.458109,
+ 0.707107,0,-0.707107,8.613099,3.149869,3.462742,
+ 0.707107,0,-0.707107,8.664927,3.08123,3.514569,
+ 0.707107,0,-0.707107,8.664927,3.08123,3.514569,
+ 0.707107,0,-0.707107,8.613099,3.149869,3.462742,
+ 0.707107,0,-0.707107,8.670694,3.143163,3.520337,
+ 0.707107,0,-0.707107,8.664927,3.08123,3.514569,
+ 0.707107,0,-0.707107,8.670694,3.143163,3.520337,
+ 0.707107,0,-0.707107,8.720711,3.070318,3.570354,
+ 0.707107,0,-0.707107,8.720711,3.070318,3.570354,
+ 0.707107,0,-0.707107,8.670694,3.143163,3.520337,
+ 0.707107,0,-0.707107,8.7276,3.132031,3.577243,
+ 0.707107,0,-0.707107,8.720711,3.070318,3.570354,
+ 0.707107,0,-0.707107,8.7276,3.132031,3.577243,
+ 0.707107,0,-0.707107,8.775486,3.055131,3.625129,
+ 0.707107,0,-0.707107,8.775486,3.055131,3.625129,
+ 0.707107,0,-0.707107,8.7276,3.132031,3.577243,
+ 0.707107,0,-0.707107,8.783476,3.116539,3.633119,
+ 0.707107,0,-0.707107,8.775486,3.055131,3.625129,
+ 0.707107,0,-0.707107,8.783476,3.116539,3.633119,
+ 0.707107,0,-0.707107,8.828926,3.035761,3.678568,
+ 0.707107,0,-0.707107,8.828926,3.035761,3.678568,
+ 0.707107,0,-0.707107,8.783476,3.116539,3.633119,
+ 0.707107,0,-0.707107,8.83799,3.09678,3.687633,
+ 0.707107,0,-0.707107,8.828926,3.035761,3.678568,
+ 0.707107,0,-0.707107,8.83799,3.09678,3.687633,
+ 0.707107,0,-0.707107,8.880711,3.012323,3.730353,
+ 0.707107,0,-0.707107,8.880711,3.012323,3.730353,
+ 0.707107,0,-0.707107,8.83799,3.09678,3.687633,
+ 0.707107,0,-0.707107,8.890816,3.072871,3.740458,
+ 0.707107,0,-0.707107,8.880711,3.012323,3.730353,
+ 0.707107,0,-0.707107,8.890816,3.072871,3.740458,
+ 0.707107,0,-0.707107,9.5,2.702679,4.349643,
+ 0.707107,0,-0.707107,9.5,2.702679,4.349643,
+ 0.707107,0,-0.707107,8.890816,3.072871,3.740458,
+ 0.707107,0,-0.707107,9.5,2.768279,4.349643
+};
+static const struct gllist seccam_cap_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 468, seccam_cap_data, 0
+};
+const struct gllist *seccam_cap = &seccam_cap_frame;
+
+static const float seccam_hinge_data[] = {
+ 0.843272,0,-0.537487,0.649519,0.375,-0.375,
+ 0.707107,0,-0.707107,0.53033,0.625,-0.53033,
+ 0.887114,0,-0.461551,0.649519,0.625,-0.375,
+ 0.707107,0,-0.707107,0.53033,0.625,-0.53033,
+ 0.843272,0,-0.537487,0.649519,0.375,-0.375,
+ 0.707107,0,-0.707107,0.53033,0.375,-0.53033,
+ 0.991445,0,-0.130526,0.75,0.375,0,
+ 0.976344,0,-0.216222,0.724444,0.625,-0.194114,
+ 0.991445,0,-0.130526,0.75,0.625,0,
+ 0.976344,0,-0.216222,0.724444,0.625,-0.194114,
+ 0.991445,0,-0.130526,0.75,0.375,0,
+ 0.95365,0,-0.300918,0.724444,0.375,-0.194114,
+ 0.537487,0,-0.843272,0.375,0.375,-0.649519,
+ 0.707107,0,-0.707107,0.53033,0.625,-0.53033,
+ 0.707107,0,-0.707107,0.53033,0.375,-0.53033,
+ 0.707107,0,-0.707107,0.53033,0.625,-0.53033,
+ 0.537487,0,-0.843272,0.375,0.375,-0.649519,
+ 0.461551,0,-0.887114,0.375,0.625,-0.649519,
+ -0.976344,0,-0.216222,-0.724444,0.375,-0.194114,
+ -0.991445,0,-0.130526,-0.75,0.625,0,
+ -0.95365,0,-0.300918,-0.724444,0.625,-0.194114,
+ -0.991445,0,-0.130526,-0.75,0.625,0,
+ -0.976344,0,-0.216222,-0.724444,0.375,-0.194114,
+ -0.991445,0,-0.130526,-0.75,0.375,0,
+ 0.300918,0,-0.95365,0.194114,0.375,-0.724444,
+ 0.461551,0,-0.887114,0.375,0.625,-0.649519,
+ 0.537487,0,-0.843272,0.375,0.375,-0.649519,
+ 0.461551,0,-0.887114,0.375,0.625,-0.649519,
+ 0.300918,0,-0.95365,0.194114,0.375,-0.724444,
+ 0.216222,0,-0.976344,0.194114,0.625,-0.724444,
+ 0,1,0,-0.194114,0.625,-0.724444,
+ 0,1,0,0.194114,0.625,-0.724444,
+ 0,1,0,0,0.625,-0.75,
+ 0,1,0,0.194114,0.625,-0.724444,
+ 0,1,0,-0.194114,0.625,-0.724444,
+ 0,1,0,-0.375,0.625,-0.649519,
+ 0,1,0,0.194114,0.625,-0.724444,
+ 0,1,0,-0.375,0.625,-0.649519,
+ 0,1,0,0.375,0.625,-0.649519,
+ 0,1,0,0.375,0.625,-0.649519,
+ 0,1,0,-0.375,0.625,-0.649519,
+ 0,1,0,-0.53033,0.625,-0.53033,
+ 0,1,0,0.375,0.625,-0.649519,
+ 0,1,0,-0.53033,0.625,-0.53033,
+ 0,1,0,0.53033,0.625,-0.53033,
+ 0,1,0,0.53033,0.625,-0.53033,
+ 0,1,0,-0.53033,0.625,-0.53033,
+ 0,1,0,-0.649519,0.625,-0.375,
+ 0,1,0,0.53033,0.625,-0.53033,
+ 0,1,0,-0.649519,0.625,-0.375,
+ 0,1,0,0.649519,0.625,-0.375,
+ 0,1,0,0.649519,0.625,-0.375,
+ 0,1,0,-0.649519,0.625,-0.375,
+ 0,1,0,-0.724444,0.625,-0.194114,
+ 0,1,0,0.649519,0.625,-0.375,
+ 0,1,0,-0.724444,0.625,-0.194114,
+ 0,1,0,0.724444,0.625,-0.194114,
+ 0,1,0,0.724444,0.625,-0.194114,
+ 0,1,0,-0.724444,0.625,-0.194114,
+ 0,1,0,0.75,0.625,0,
+ 0,1,0,0.75,0.625,0,
+ 0,1,0,-0.724444,0.625,-0.194114,
+ 0,1,0,-0.75,0.625,0,
+ -0.707107,0,-0.707107,-0.53033,0.375,-0.53033,
+ -0.537487,0,-0.843272,-0.375,0.625,-0.649519,
+ -0.461551,0,-0.887114,-0.375,0.375,-0.649519,
+ -0.537487,0,-0.843272,-0.375,0.625,-0.649519,
+ -0.707107,0,-0.707107,-0.53033,0.375,-0.53033,
+ -0.707107,0,-0.707107,-0.53033,0.625,-0.53033,
+ -0.707107,0,-0.707107,-0.53033,0.375,-0.53033,
+ -0.843272,0,-0.537487,-0.649519,0.625,-0.375,
+ -0.707107,0,-0.707107,-0.53033,0.625,-0.53033,
+ -0.843272,0,-0.537487,-0.649519,0.625,-0.375,
+ -0.707107,0,-0.707107,-0.53033,0.375,-0.53033,
+ -0.887114,0,-0.461551,-0.649519,0.375,-0.375,
+ -0.461551,0,-0.887114,-0.375,0.375,-0.649519,
+ -0.300918,0,-0.95365,-0.194114,0.625,-0.724444,
+ -0.216222,0,-0.976344,-0.194114,0.375,-0.724444,
+ -0.300918,0,-0.95365,-0.194114,0.625,-0.724444,
+ -0.461551,0,-0.887114,-0.375,0.375,-0.649519,
+ -0.537487,0,-0.843272,-0.375,0.625,-0.649519,
+ -0.216222,0,-0.976344,-0.194114,0.375,-0.724444,
+ -0.043842,0,-0.999038,0,0.625,-0.75,
+ 0.043842,0,-0.999038,0,0.375,-0.75,
+ -0.043842,0,-0.999038,0,0.625,-0.75,
+ -0.216222,0,-0.976344,-0.194114,0.375,-0.724444,
+ -0.300918,0,-0.95365,-0.194114,0.625,-0.724444,
+ 0.95365,0,-0.300918,0.724444,0.375,-0.194114,
+ 0.887114,0,-0.461551,0.649519,0.625,-0.375,
+ 0.976344,0,-0.216222,0.724444,0.625,-0.194114,
+ 0.887114,0,-0.461551,0.649519,0.625,-0.375,
+ 0.95365,0,-0.300918,0.724444,0.375,-0.194114,
+ 0.843272,0,-0.537487,0.649519,0.375,-0.375,
+ 0.043842,0,-0.999038,0,0.375,-0.75,
+ 0.216222,0,-0.976344,0.194114,0.625,-0.724444,
+ 0.300918,0,-0.95365,0.194114,0.375,-0.724444,
+ 0.216222,0,-0.976344,0.194114,0.625,-0.724444,
+ 0.043842,0,-0.999038,0,0.375,-0.75,
+ -0.043842,0,-0.999038,0,0.625,-0.75,
+ -0.887114,0,-0.461551,-0.649519,0.375,-0.375,
+ -0.95365,0,-0.300918,-0.724444,0.625,-0.194114,
+ -0.843272,0,-0.537487,-0.649519,0.625,-0.375,
+ -0.95365,0,-0.300918,-0.724444,0.625,-0.194114,
+ -0.887114,0,-0.461551,-0.649519,0.375,-0.375,
+ -0.976344,0,-0.216222,-0.724444,0.375,-0.194114,
+ 0,-1,0,0.194114,0.375,-0.724444,
+ 0,-1,0,-0.194114,0.375,-0.724444,
+ 0,-1,0,0,0.375,-0.75,
+ 0,-1,0,-0.194114,0.375,-0.724444,
+ 0,-1,0,0.194114,0.375,-0.724444,
+ 0,-1,0,0.375,0.375,-0.649519,
+ 0,-1,0,-0.194114,0.375,-0.724444,
+ 0,-1,0,0.375,0.375,-0.649519,
+ 0,-1,0,-0.375,0.375,-0.649519,
+ 0,-1,0,-0.375,0.375,-0.649519,
+ 0,-1,0,0.375,0.375,-0.649519,
+ 0,-1,0,0.53033,0.375,-0.53033,
+ 0,-1,0,-0.375,0.375,-0.649519,
+ 0,-1,0,0.53033,0.375,-0.53033,
+ 0,-1,0,-0.53033,0.375,-0.53033,
+ 0,-1,0,-0.53033,0.375,-0.53033,
+ 0,-1,0,0.53033,0.375,-0.53033,
+ 0,-1,0,0.649519,0.375,-0.375,
+ 0,-1,0,-0.53033,0.375,-0.53033,
+ 0,-1,0,0.649519,0.375,-0.375,
+ 0,-1,0,-0.649519,0.375,-0.375,
+ 0,-1,0,-0.649519,0.375,-0.375,
+ 0,-1,0,0.649519,0.375,-0.375,
+ 0,-1,0,0.724444,0.375,-0.194114,
+ 0,-1,0,-0.649519,0.375,-0.375,
+ 0,-1,0,0.724444,0.375,-0.194114,
+ 0,-1,0,-0.724444,0.375,-0.194114,
+ 0,-1,0,-0.724444,0.375,-0.194114,
+ 0,-1,0,0.724444,0.375,-0.194114,
+ 0,-1,0,0.75,0.375,0,
+ 0,-1,0,-0.724444,0.375,-0.194114,
+ 0,-1,0,0.75,0.375,0,
+ 0,-1,0,-0.75,0.375,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,0.965926,0.258819,0,
+ 0,0,-1,1,0,0,
+ 0,0,-1,0.965926,0.258819,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,0.866025,0.5,0,
+ 0,0,-1,0.866025,0.5,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,0.707107,0.707107,0,
+ 0,0,-1,0.707107,0.707107,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,0.5,0.866025,0,
+ 0,0,-1,0.5,0.866025,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,0.258819,0.965926,0,
+ 0,0,-1,0.258819,0.965926,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,0,1,0,
+ 0,0,-1,0,1,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,-0.258819,0.965926,0,
+ 0,0,-1,-0.258819,0.965926,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,-0.5,0.866025,0,
+ 0,0,-1,-0.5,0.866025,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,-0.707107,0.707107,0,
+ 0,0,-1,-0.707107,0.707107,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,-0.866025,0.5,0,
+ 0,0,-1,-0.866025,0.5,0,
+ 0,0,-1,-1,0,0,
+ 0,0,-1,-0.965926,0.258819,0,
+ 0.043842,0.999038,0,0,1,1,
+ 0.216222,0.976344,0,0.258819,0.965926,0,
+ -0.043842,0.999038,0,0,1,0,
+ 0.216222,0.976344,0,0.258819,0.965926,0,
+ 0.043842,0.999038,0,0,1,1,
+ 0.300918,0.95365,0,0.258819,0.965926,1,
+ -0.707107,0.707107,0,-0.707107,0.707107,1,
+ -0.537487,0.843272,0,-0.5,0.866025,0,
+ -0.707107,0.707107,0,-0.707107,0.707107,0,
+ -0.537487,0.843272,0,-0.5,0.866025,0,
+ -0.707107,0.707107,0,-0.707107,0.707107,1,
+ -0.461551,0.887114,0,-0.5,0.866025,1,
+ -0.461551,0.887114,0,-0.5,0.866025,1,
+ -0.300918,0.95365,0,-0.258819,0.965926,0,
+ -0.537487,0.843272,0,-0.5,0.866025,0,
+ -0.300918,0.95365,0,-0.258819,0.965926,0,
+ -0.461551,0.887114,0,-0.5,0.866025,1,
+ -0.216222,0.976344,0,-0.258819,0.965926,1,
+ 0.300918,0.95365,0,0.258819,0.965926,1,
+ 0.461551,0.887114,0,0.5,0.866025,0,
+ 0.216222,0.976344,0,0.258819,0.965926,0,
+ 0.461551,0.887114,0,0.5,0.866025,0,
+ 0.300918,0.95365,0,0.258819,0.965926,1,
+ 0.537487,0.843272,0,0.5,0.866025,1,
+ 0.991445,0.130526,0,1,0,1,
+ 0.976344,0.216222,0,0.965926,0.258819,0,
+ 0.95365,0.300918,0,0.965926,0.258819,1,
+ 0.976344,0.216222,0,0.965926,0.258819,0,
+ 0.991445,0.130526,0,1,0,1,
+ 0.991445,0.130526,0,1,0,0,
+ 0.843272,0.537487,0,0.866025,0.5,1,
+ 0.707107,0.707107,0,0.707107,0.707107,0,
+ 0.707107,0.707107,0,0.707107,0.707107,1,
+ 0.707107,0.707107,0,0.707107,0.707107,0,
+ 0.843272,0.537487,0,0.866025,0.5,1,
+ 0.887114,0.461551,0,0.866025,0.5,0,
+ -0.216222,0.976344,0,-0.258819,0.965926,1,
+ -0.043842,0.999038,0,0,1,0,
+ -0.300918,0.95365,0,-0.258819,0.965926,0,
+ -0.043842,0.999038,0,0,1,0,
+ -0.216222,0.976344,0,-0.258819,0.965926,1,
+ 0.043842,0.999038,0,0,1,1,
+ -0.95365,0.300918,0,-0.965926,0.258819,0,
+ -0.887114,0.461551,0,-0.866025,0.5,1,
+ -0.843272,0.537487,0,-0.866025,0.5,0,
+ -0.887114,0.461551,0,-0.866025,0.5,1,
+ -0.95365,0.300918,0,-0.965926,0.258819,0,
+ -0.976344,0.216222,0,-0.965926,0.258819,1,
+ -0.843272,0.537487,0,-0.866025,0.5,0,
+ -0.707107,0.707107,0,-0.707107,0.707107,1,
+ -0.707107,0.707107,0,-0.707107,0.707107,0,
+ -0.707107,0.707107,0,-0.707107,0.707107,1,
+ -0.843272,0.537487,0,-0.866025,0.5,0,
+ -0.887114,0.461551,0,-0.866025,0.5,1,
+ 0.537487,0.843272,0,0.5,0.866025,1,
+ 0.707107,0.707107,0,0.707107,0.707107,0,
+ 0.461551,0.887114,0,0.5,0.866025,0,
+ 0.707107,0.707107,0,0.707107,0.707107,0,
+ 0.537487,0.843272,0,0.5,0.866025,1,
+ 0.707107,0.707107,0,0.707107,0.707107,1,
+ 0.95365,0.300918,0,0.965926,0.258819,1,
+ 0.887114,0.461551,0,0.866025,0.5,0,
+ 0.843272,0.537487,0,0.866025,0.5,1,
+ 0.887114,0.461551,0,0.866025,0.5,0,
+ 0.95365,0.300918,0,0.965926,0.258819,1,
+ 0.976344,0.216222,0,0.965926,0.258819,0,
+ -0.991445,0.130526,0,-1,0,0,
+ -0.976344,0.216222,0,-0.965926,0.258819,1,
+ -0.95365,0.300918,0,-0.965926,0.258819,0,
+ -0.976344,0.216222,0,-0.965926,0.258819,1,
+ -0.991445,0.130526,0,-1,0,0,
+ -0.991445,0.130526,0,-1,0,1
+};
+static const struct gllist seccam_hinge_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 243, seccam_hinge_data, 0
+};
+const struct gllist *seccam_hinge = &seccam_hinge_frame;
+
+static const float seccam_lens_data[] = {
+ 1,0,0,7.55,-1.923472,1.31269,
+ 1,0,0,7.55,2.033558,4.687325,
+ 1,0,0,7.55,-1.923714,4.687325,
+ 1,0,0,7.55,2.033558,4.687325,
+ 1,0,0,7.55,-1.923472,1.31269,
+ 1,0,0,7.55,2.0338,1.31269
+};
+static const struct gllist seccam_lens_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 6, seccam_lens_data, 0
+};
+const struct gllist *seccam_lens = &seccam_lens_frame;
+
+static const float seccam_pipe_data[] = {
+ -0.752339,0.658776,0,-0.265165,0.265165,0.4375,
+ -0.921725,0.383318,0.05908,-0.346455,0.143506,-1.759639,
+ -0.947173,0.320722,0,-0.346455,0.143506,0.4375,
+ -0.921725,0.383318,0.05908,-0.346455,0.143506,-1.759639,
+ -0.752339,0.658776,0,-0.265165,0.265165,0.4375,
+ -0.704865,0.70779,0.046895,-0.265165,0.265165,-1.76471,
+ -0.704865,0.70779,0.046895,-0.265165,0.265165,-1.76471,
+ -0.442968,0.896538,0,-0.143506,0.346455,0.4375,
+ -0.381068,0.924135,0.027592,-0.143506,0.346455,-1.772299,
+ -0.442968,0.896538,0,-0.143506,0.346455,0.4375,
+ -0.704865,0.70779,0.046895,-0.265165,0.265165,-1.76471,
+ -0.752339,0.658776,0,-0.265165,0.265165,0.4375,
+ -0.381068,0.924135,0.027592,-0.143506,0.346455,-1.772299,
+ -0.066159,0.997809,0,0,0.375,0.4375,
+ 0.000257,0.999991,0.00412,0,0.375,-1.78125,
+ -0.066159,0.997809,0,0,0.375,0.4375,
+ -0.381068,0.924135,0.027592,-0.143506,0.346455,-1.772299,
+ -0.442968,0.896538,0,-0.143506,0.346455,0.4375,
+ 0.000257,0.999991,0.00412,0,0.375,-1.78125,
+ 0.320722,0.947173,0,0.143506,0.346455,0.4375,
+ 0.381543,0.924135,-0.019977,0.143506,0.346455,-1.790201,
+ 0.320722,0.947173,0,0.143506,0.346455,0.4375,
+ 0.000257,0.999991,0.00412,0,0.375,-1.78125,
+ -0.066159,0.997809,0,0,0.375,0.4375,
+ 0.381543,0.924135,-0.019977,0.143506,0.346455,-1.790201,
+ 0.707107,0.707107,0,0.265165,0.265165,0.4375,
+ 0.704059,0.707717,-0.058632,0.265165,0.265165,-1.79779,
+ 0.707107,0.707107,0,0.265165,0.265165,0.4375,
+ 0.381543,0.924135,-0.019977,0.143506,0.346455,-1.790201,
+ 0.320722,0.947173,0,0.143506,0.346455,0.4375,
+ 0.921725,0.383318,-0.05908,0.346455,0.143506,-1.802861,
+ 0.707107,0.707107,0,0.265165,0.265165,0.4375,
+ 0.947173,0.320722,0,0.346455,0.143506,0.4375,
+ 0.707107,0.707107,0,0.265165,0.265165,0.4375,
+ 0.921725,0.383318,-0.05908,0.346455,0.143506,-1.802861,
+ 0.704059,0.707717,-0.058632,0.265165,0.265165,-1.79779,
+ 0.979876,0.195414,-0.040695,0.375,0,-1.804641,
+ 0.947173,0.320722,0,0.346455,0.143506,0.4375,
+ 0.980785,0.19509,0,0.375,0,0.4375,
+ 0.947173,0.320722,0,0.346455,0.143506,0.4375,
+ 0.979876,0.195414,-0.040695,0.375,0,-1.804641,
+ 0.921725,0.383318,-0.05908,0.346455,0.143506,-1.802861,
+ -0.947173,0.320722,0,-0.346455,0.143506,0.4375,
+ -0.979876,0.195414,0.040695,-0.375,0,-1.757859,
+ -0.980785,0.19509,0,-0.375,0,0.4375,
+ -0.979876,0.195414,0.040695,-0.375,0,-1.757859,
+ -0.947173,0.320722,0,-0.346455,0.143506,0.4375,
+ -0.921725,0.383318,0.05908,-0.346455,0.143506,-1.759639,
+ -0.704865,0.70779,0.046895,-0.265165,0.265165,-1.76471,
+ -0.882346,0.387175,0.26751,-0.423809,0.143506,-2.377279,
+ -0.921725,0.383318,0.05908,-0.346455,0.143506,-1.759639,
+ -0.882346,0.387175,0.26751,-0.423809,0.143506,-2.377279,
+ -0.704865,0.70779,0.046895,-0.265165,0.265165,-1.76471,
+ -0.670724,0.711915,0.208102,-0.344833,0.265165,-2.400829,
+ -0.670724,0.711915,0.208102,-0.344833,0.265165,-2.400829,
+ -0.381068,0.924135,0.027592,-0.143506,0.346455,-1.772299,
+ -0.35955,0.925667,0.117746,-0.226638,0.346455,-2.436073,
+ -0.381068,0.924135,0.027592,-0.143506,0.346455,-1.772299,
+ -0.670724,0.711915,0.208102,-0.344833,0.265165,-2.400829,
+ -0.704865,0.70779,0.046895,-0.265165,0.265165,-1.76471,
+ -0.35955,0.925667,0.117746,-0.226638,0.346455,-2.436073,
+ 0.000257,0.999991,0.00412,0,0.375,-1.78125,
+ 0.003116,0.999941,0.010449,-0.087217,0.375,-2.477647,
+ 0.000257,0.999991,0.00412,0,0.375,-1.78125,
+ -0.35955,0.925667,0.117746,-0.226638,0.346455,-2.436073,
+ -0.381068,0.924135,0.027592,-0.143506,0.346455,-1.772299,
+ 0.003116,0.999941,0.010449,-0.087217,0.375,-2.477647,
+ 0.381543,0.924135,-0.019977,0.143506,0.346455,-1.790201,
+ 0.365318,0.925667,-0.098401,0.052203,0.346455,-2.51922,
+ 0.381543,0.924135,-0.019977,0.143506,0.346455,-1.790201,
+ 0.003116,0.999941,0.010449,-0.087217,0.375,-2.477647,
+ 0.000257,0.999991,0.00412,0,0.375,-1.78125,
+ 0.365318,0.925667,-0.098401,0.052203,0.346455,-2.51922,
+ 0.704059,0.707717,-0.058632,0.265165,0.265165,-1.79779,
+ 0.661307,0.711395,-0.237887,0.170398,0.265165,-2.554465,
+ 0.704059,0.707717,-0.058632,0.265165,0.265165,-1.79779,
+ 0.365318,0.925667,-0.098401,0.052203,0.346455,-2.51922,
+ 0.381543,0.924135,-0.019977,0.143506,0.346455,-1.790201,
+ 0.882346,0.387175,-0.26751,0.249374,0.143506,-2.578014,
+ 0.704059,0.707717,-0.058632,0.265165,0.265165,-1.79779,
+ 0.921725,0.383318,-0.05908,0.346455,0.143506,-1.802861,
+ 0.704059,0.707717,-0.058632,0.265165,0.265165,-1.79779,
+ 0.882346,0.387175,-0.26751,0.249374,0.143506,-2.578014,
+ 0.661307,0.711395,-0.237887,0.170398,0.265165,-2.554465,
+ 0.953546,0.197386,-0.227573,0.277106,0,-2.586284,
+ 0.921725,0.383318,-0.05908,0.346455,0.143506,-1.802861,
+ 0.979876,0.195414,-0.040695,0.375,0,-1.804641,
+ 0.921725,0.383318,-0.05908,0.346455,0.143506,-1.802861,
+ 0.953546,0.197386,-0.227573,0.277106,0,-2.586284,
+ 0.882346,0.387175,-0.26751,0.249374,0.143506,-2.578014,
+ -0.921725,0.383318,0.05908,-0.346455,0.143506,-1.759639,
+ -0.953546,0.197386,0.227573,-0.451541,0,-2.36901,
+ -0.979876,0.195414,0.040695,-0.375,0,-1.757859,
+ -0.953546,0.197386,0.227573,-0.451541,0,-2.36901,
+ -0.921725,0.383318,0.05908,-0.346455,0.143506,-1.759639,
+ -0.882346,0.387175,0.26751,-0.423809,0.143506,-2.377279,
+ -0.670724,0.711915,0.208102,-0.344833,0.265165,-2.400829,
+ -0.727589,0.447862,0.519648,-0.681469,0.143506,-2.903944,
+ -0.882346,0.387175,0.26751,-0.423809,0.143506,-2.377279,
+ -0.727589,0.447862,0.519648,-0.681469,0.143506,-2.903944,
+ -0.670724,0.711915,0.208102,-0.344833,0.265165,-2.400829,
+ -0.558784,0.739142,0.376071,-0.614405,0.265165,-2.951841,
+ -0.558784,0.739142,0.376071,-0.614405,0.265165,-2.951841,
+ -0.35955,0.925667,0.117746,-0.226638,0.346455,-2.436073,
+ -0.301902,0.925667,0.228024,-0.514037,0.346455,-3.023525,
+ -0.35955,0.925667,0.117746,-0.226638,0.346455,-2.436073,
+ -0.558784,0.739142,0.376071,-0.614405,0.265165,-2.951841,
+ -0.670724,0.711915,0.208102,-0.344833,0.265165,-2.400829,
+ -0.301902,0.925667,0.228024,-0.514037,0.346455,-3.023525,
+ 0.003116,0.999941,0.010449,-0.087217,0.375,-2.477647,
+ 0.006337,0.999941,0.008873,-0.395645,0.375,-3.108081,
+ 0.003116,0.999941,0.010449,-0.087217,0.375,-2.477647,
+ -0.301902,0.925667,0.228024,-0.514037,0.346455,-3.023525,
+ -0.35955,0.925667,0.117746,-0.226638,0.346455,-2.436073,
+ 0.006337,0.999941,0.008873,-0.395645,0.375,-3.108081,
+ 0.365318,0.925667,-0.098401,0.052203,0.346455,-2.51922,
+ 0.313635,0.925667,-0.211597,-0.277253,0.346455,-3.192637,
+ 0.365318,0.925667,-0.098401,0.052203,0.346455,-2.51922,
+ 0.006337,0.999941,0.008873,-0.395645,0.375,-3.108081,
+ 0.003116,0.999941,0.010449,-0.087217,0.375,-2.477647,
+ 0.313635,0.925667,-0.211597,-0.277253,0.346455,-3.192637,
+ 0.661307,0.711395,-0.237887,0.170398,0.265165,-2.554465,
+ 0.548361,0.711395,-0.439564,-0.176885,0.265165,-3.264321,
+ 0.661307,0.711395,-0.237887,0.170398,0.265165,-2.554465,
+ 0.313635,0.925667,-0.211597,-0.277253,0.346455,-3.192637,
+ 0.365318,0.925667,-0.098401,0.052203,0.346455,-2.51922,
+ 0.747834,0.387175,-0.539295,-0.109821,0.143506,-3.312218,
+ 0.661307,0.711395,-0.237887,0.170398,0.265165,-2.554465,
+ 0.882346,0.387175,-0.26751,0.249374,0.143506,-2.578014,
+ 0.661307,0.711395,-0.237887,0.170398,0.265165,-2.554465,
+ 0.747834,0.387175,-0.539295,-0.109821,0.143506,-3.312218,
+ 0.548361,0.711395,-0.439564,-0.176885,0.265165,-3.264321,
+ 0.82814,0.197386,-0.524617,-0.086272,0,-3.329037,
+ 0.882346,0.387175,-0.26751,0.249374,0.143506,-2.578014,
+ 0.953546,0.197386,-0.227573,0.277106,0,-2.586284,
+ 0.882346,0.387175,-0.26751,0.249374,0.143506,-2.578014,
+ 0.82814,0.197386,-0.524617,-0.086272,0,-3.329037,
+ 0.747834,0.387175,-0.539295,-0.109821,0.143506,-3.312218,
+ -0.882346,0.387175,0.26751,-0.423809,0.143506,-2.377279,
+ -0.797706,0.197679,0.569726,-0.705019,0,-2.887125,
+ -0.953546,0.197386,0.227573,-0.451541,0,-2.36901,
+ -0.797706,0.197679,0.569726,-0.705019,0,-2.887125,
+ -0.882346,0.387175,0.26751,-0.423809,0.143506,-2.377279,
+ -0.727589,0.447862,0.519648,-0.681469,0.143506,-2.903944,
+ -0.727589,0.447862,0.519648,-0.681469,0.143506,-2.903944,
+ -0.439564,0.711395,0.548361,-1.048159,0.265165,-3.385595,
+ -0.539295,0.387175,0.747834,-1.096056,0.143506,-3.318531,
+ -0.439564,0.711395,0.548361,-1.048159,0.265165,-3.385595,
+ -0.727589,0.447862,0.519648,-0.681469,0.143506,-2.903944,
+ -0.558784,0.739142,0.376071,-0.614405,0.265165,-2.951841,
+ -0.439564,0.711395,0.548361,-1.048159,0.265165,-3.385595,
+ -0.301902,0.925667,0.228024,-0.514037,0.346455,-3.023525,
+ -0.211597,0.925667,0.313635,-0.976475,0.346455,-3.485963,
+ -0.301902,0.925667,0.228024,-0.514037,0.346455,-3.023525,
+ -0.439564,0.711395,0.548361,-1.048159,0.265165,-3.385595,
+ -0.558784,0.739142,0.376071,-0.614405,0.265165,-2.951841,
+ -0.211597,0.925667,0.313635,-0.976475,0.346455,-3.485963,
+ 0.006337,0.999941,0.008873,-0.395645,0.375,-3.108081,
+ 0.008873,0.999941,0.006337,-0.891919,0.375,-3.604355,
+ 0.006337,0.999941,0.008873,-0.395645,0.375,-3.108081,
+ -0.211597,0.925667,0.313635,-0.976475,0.346455,-3.485963,
+ -0.301902,0.925667,0.228024,-0.514037,0.346455,-3.023525,
+ 0.008873,0.999941,0.006337,-0.891919,0.375,-3.604355,
+ 0.313635,0.925667,-0.211597,-0.277253,0.346455,-3.192637,
+ 0.228024,0.925667,-0.301902,-0.807363,0.346455,-3.722747,
+ 0.313635,0.925667,-0.211597,-0.277253,0.346455,-3.192637,
+ 0.008873,0.999941,0.006337,-0.891919,0.375,-3.604355,
+ 0.006337,0.999941,0.008873,-0.395645,0.375,-3.108081,
+ 0.228024,0.925667,-0.301902,-0.807363,0.346455,-3.722747,
+ 0.548361,0.711395,-0.439564,-0.176885,0.265165,-3.264321,
+ 0.376096,0.711395,-0.593691,-0.735679,0.265165,-3.823115,
+ 0.548361,0.711395,-0.439564,-0.176885,0.265165,-3.264321,
+ 0.228024,0.925667,-0.301902,-0.807363,0.346455,-3.722747,
+ 0.313635,0.925667,-0.211597,-0.277253,0.346455,-3.192637,
+ 0.532425,0.387175,-0.752741,-0.687782,0.143506,-3.890179,
+ 0.548361,0.711395,-0.439564,-0.176885,0.265165,-3.264321,
+ 0.747834,0.387175,-0.539295,-0.109821,0.143506,-3.312218,
+ 0.548361,0.711395,-0.439564,-0.176885,0.265165,-3.264321,
+ 0.532425,0.387175,-0.752741,-0.687782,0.143506,-3.890179,
+ 0.376096,0.711395,-0.593691,-0.735679,0.265165,-3.823115,
+ 0.747834,0.387175,-0.539295,-0.109821,0.143506,-3.312218,
+ 0.613149,0.197386,-0.76491,-0.670963,0,-3.913728,
+ 0.532425,0.387175,-0.752741,-0.687782,0.143506,-3.890179,
+ 0.613149,0.197386,-0.76491,-0.670963,0,-3.913728,
+ 0.747834,0.387175,-0.539295,-0.109821,0.143506,-3.312218,
+ 0.82814,0.197386,-0.524617,-0.086272,0,-3.329037,
+ -0.797706,0.197679,0.569726,-0.705019,0,-2.887125,
+ -0.539295,0.387175,0.747834,-1.096056,0.143506,-3.318531,
+ -0.524617,0.197386,0.82814,-1.112875,0,-3.294981,
+ -0.539295,0.387175,0.747834,-1.096056,0.143506,-3.318531,
+ -0.797706,0.197679,0.569726,-0.705019,0,-2.887125,
+ -0.727589,0.447862,0.519648,-0.681469,0.143506,-2.903944,
+ -0.539295,0.387175,0.747834,-1.096056,0.143506,-3.318531,
+ -0.237887,0.711395,0.661307,-1.599171,0.265165,-3.655167,
+ -0.26751,0.387175,0.882346,-1.622721,0.143506,-3.576191,
+ -0.237887,0.711395,0.661307,-1.599171,0.265165,-3.655167,
+ -0.539295,0.387175,0.747834,-1.096056,0.143506,-3.318531,
+ -0.439564,0.711395,0.548361,-1.048159,0.265165,-3.385595,
+ -0.237887,0.711395,0.661307,-1.599171,0.265165,-3.655167,
+ -0.211597,0.925667,0.313635,-0.976475,0.346455,-3.485963,
+ -0.098401,0.925667,0.365318,-1.563927,0.346455,-3.773362,
+ -0.211597,0.925667,0.313635,-0.976475,0.346455,-3.485963,
+ -0.237887,0.711395,0.661307,-1.599171,0.265165,-3.655167,
+ -0.439564,0.711395,0.548361,-1.048159,0.265165,-3.385595,
+ -0.098401,0.925667,0.365318,-1.563927,0.346455,-3.773362,
+ 0.008873,0.999941,0.006337,-0.891919,0.375,-3.604355,
+ 0.010449,0.999941,0.003116,-1.522353,0.375,-3.912783,
+ 0.008873,0.999941,0.006337,-0.891919,0.375,-3.604355,
+ -0.098401,0.925667,0.365318,-1.563927,0.346455,-3.773362,
+ -0.211597,0.925667,0.313635,-0.976475,0.346455,-3.485963,
+ 0.010449,0.999941,0.003116,-1.522353,0.375,-3.912783,
+ 0.228024,0.925667,-0.301902,-0.807363,0.346455,-3.722747,
+ 0.117746,0.925667,-0.35955,-1.48078,0.346455,-4.052203,
+ 0.228024,0.925667,-0.301902,-0.807363,0.346455,-3.722747,
+ 0.010449,0.999941,0.003116,-1.522353,0.375,-3.912783,
+ 0.008873,0.999941,0.006337,-0.891919,0.375,-3.604355,
+ 0.117746,0.925667,-0.35955,-1.48078,0.346455,-4.052203,
+ 0.376096,0.711395,-0.593691,-0.735679,0.265165,-3.823115,
+ 0.163146,0.711395,-0.683594,-1.445535,0.265165,-4.170398,
+ 0.376096,0.711395,-0.593691,-0.735679,0.265165,-3.823115,
+ 0.117746,0.925667,-0.35955,-1.48078,0.346455,-4.052203,
+ 0.228024,0.925667,-0.301902,-0.807363,0.346455,-3.722747,
+ 0.376096,0.711395,-0.593691,-0.735679,0.265165,-3.823115,
+ 0.259419,0.387175,-0.884758,-1.421986,0.143506,-4.249374,
+ 0.163146,0.711395,-0.683594,-1.445535,0.265165,-4.170398,
+ 0.259419,0.387175,-0.884758,-1.421986,0.143506,-4.249374,
+ 0.376096,0.711395,-0.593691,-0.735679,0.265165,-3.823115,
+ 0.532425,0.387175,-0.752741,-0.687782,0.143506,-3.890179,
+ 0.532425,0.387175,-0.752741,-0.687782,0.143506,-3.890179,
+ 0.331829,0.197386,-0.922458,-1.413716,0,-4.277106,
+ 0.259419,0.387175,-0.884758,-1.421986,0.143506,-4.249374,
+ 0.331829,0.197386,-0.922458,-1.413716,0,-4.277106,
+ 0.532425,0.387175,-0.752741,-0.687782,0.143506,-3.890179,
+ 0.613149,0.197386,-0.76491,-0.670963,0,-3.913728,
+ -0.524617,0.197386,0.82814,-1.112875,0,-3.294981,
+ -0.26751,0.387175,0.882346,-1.622721,0.143506,-3.576191,
+ -0.227573,0.197386,0.953546,-1.63099,0,-3.548459,
+ -0.26751,0.387175,0.882346,-1.622721,0.143506,-3.576191,
+ -0.524617,0.197386,0.82814,-1.112875,0,-3.294981,
+ -0.539295,0.387175,0.747834,-1.096056,0.143506,-3.318531,
+ -0.26751,0.387175,0.882346,-1.622721,0.143506,-3.576191,
+ -0.058632,0.707717,0.704059,-2.23529,0.265165,-3.734835,
+ -0.05908,0.383318,0.921725,-2.240361,0.143506,-3.653545,
+ -0.058632,0.707717,0.704059,-2.23529,0.265165,-3.734835,
+ -0.26751,0.387175,0.882346,-1.622721,0.143506,-3.576191,
+ -0.237887,0.711395,0.661307,-1.599171,0.265165,-3.655167,
+ -0.058632,0.707717,0.704059,-2.23529,0.265165,-3.734835,
+ -0.098401,0.925667,0.365318,-1.563927,0.346455,-3.773362,
+ -0.019977,0.924135,0.381543,-2.227701,0.346455,-3.856494,
+ -0.098401,0.925667,0.365318,-1.563927,0.346455,-3.773362,
+ -0.058632,0.707717,0.704059,-2.23529,0.265165,-3.734835,
+ -0.237887,0.711395,0.661307,-1.599171,0.265165,-3.655167,
+ -0.019977,0.924135,0.381543,-2.227701,0.346455,-3.856494,
+ 0.010449,0.999941,0.003116,-1.522353,0.375,-3.912783,
+ 0.00412,0.999991,0.000257,-2.21875,0.375,-4,
+ 0.010449,0.999941,0.003116,-1.522353,0.375,-3.912783,
+ -0.019977,0.924135,0.381543,-2.227701,0.346455,-3.856494,
+ -0.098401,0.925667,0.365318,-1.563927,0.346455,-3.773362,
+ 0.00412,0.999991,0.000257,-2.21875,0.375,-4,
+ 0.117746,0.925667,-0.35955,-1.48078,0.346455,-4.052203,
+ 0.027592,0.924135,-0.381068,-2.209799,0.346455,-4.143506,
+ 0.117746,0.925667,-0.35955,-1.48078,0.346455,-4.052203,
+ 0.00412,0.999991,0.000257,-2.21875,0.375,-4,
+ 0.010449,0.999941,0.003116,-1.522353,0.375,-3.912783,
+ 0.027592,0.924135,-0.381068,-2.209799,0.346455,-4.143506,
+ 0.163146,0.711395,-0.683594,-1.445535,0.265165,-4.170398,
+ 0.029316,0.707717,-0.705888,-2.20221,0.265165,-4.265165,
+ 0.163146,0.711395,-0.683594,-1.445535,0.265165,-4.170398,
+ 0.027592,0.924135,-0.381068,-2.209799,0.346455,-4.143506,
+ 0.117746,0.925667,-0.35955,-1.48078,0.346455,-4.052203,
+ 0.163146,0.711395,-0.683594,-1.445535,0.265165,-4.170398,
+ 0.055921,0.383318,-0.921922,-2.197139,0.143506,-4.346455,
+ 0.029316,0.707717,-0.705888,-2.20221,0.265165,-4.265165,
+ 0.055921,0.383318,-0.921922,-2.197139,0.143506,-4.346455,
+ 0.163146,0.711395,-0.683594,-1.445535,0.265165,-4.170398,
+ 0.259419,0.387175,-0.884758,-1.421986,0.143506,-4.249374,
+ 0.259419,0.387175,-0.884758,-1.421986,0.143506,-4.249374,
+ 0.08139,0.195414,-0.977338,-2.195359,0,-4.375,
+ 0.055921,0.383318,-0.921922,-2.197139,0.143506,-4.346455,
+ 0.08139,0.195414,-0.977338,-2.195359,0,-4.375,
+ 0.259419,0.387175,-0.884758,-1.421986,0.143506,-4.249374,
+ 0.331829,0.197386,-0.922458,-1.413716,0,-4.277106,
+ -0.227573,0.197386,0.953546,-1.63099,0,-3.548459,
+ -0.05908,0.383318,0.921725,-2.240361,0.143506,-3.653545,
+ -0.040695,0.195414,0.979876,-2.242141,0,-3.625,
+ -0.05908,0.383318,0.921725,-2.240361,0.143506,-3.653545,
+ -0.227573,0.197386,0.953546,-1.63099,0,-3.548459,
+ -0.26751,0.387175,0.882346,-1.622721,0.143506,-3.576191,
+ -0.05908,0.383318,0.921725,-2.240361,0.143506,-3.653545,
+ 0,0.707107,0.707107,-7.983022,0.265165,-3.734835,
+ 0,0.320722,0.947173,-7.983022,0.143506,-3.653545,
+ 0,0.707107,0.707107,-7.983022,0.265165,-3.734835,
+ -0.05908,0.383318,0.921725,-2.240361,0.143506,-3.653545,
+ -0.058632,0.707717,0.704059,-2.23529,0.265165,-3.734835,
+ 0,0.707107,0.707107,-7.983022,0.265165,-3.734835,
+ -0.019977,0.924135,0.381543,-2.227701,0.346455,-3.856494,
+ 0,0.947173,0.320722,-7.983022,0.346455,-3.856494,
+ -0.019977,0.924135,0.381543,-2.227701,0.346455,-3.856494,
+ 0,0.707107,0.707107,-7.983022,0.265165,-3.734835,
+ -0.058632,0.707717,0.704059,-2.23529,0.265165,-3.734835,
+ 0,0.947173,0.320722,-7.983022,0.346455,-3.856494,
+ 0.00412,0.999991,0.000257,-2.21875,0.375,-4,
+ 0,0.997809,-0.066159,-7.983022,0.375,-4,
+ 0.00412,0.999991,0.000257,-2.21875,0.375,-4,
+ 0,0.947173,0.320722,-7.983022,0.346455,-3.856494,
+ -0.019977,0.924135,0.381543,-2.227701,0.346455,-3.856494,
+ 0,0.997809,-0.066159,-7.983022,0.375,-4,
+ 0.027592,0.924135,-0.381068,-2.209799,0.346455,-4.143506,
+ 0,0.896538,-0.442968,-7.983022,0.346455,-4.143506,
+ 0.027592,0.924135,-0.381068,-2.209799,0.346455,-4.143506,
+ 0,0.997809,-0.066159,-7.983022,0.375,-4,
+ 0.00412,0.999991,0.000257,-2.21875,0.375,-4,
+ 0,0.896538,-0.442968,-7.983022,0.346455,-4.143506,
+ 0.029316,0.707717,-0.705888,-2.20221,0.265165,-4.265165,
+ 0,0.707107,-0.707107,-7.983022,0.265165,-4.265165,
+ 0.029316,0.707717,-0.705888,-2.20221,0.265165,-4.265165,
+ 0,0.896538,-0.442968,-7.983022,0.346455,-4.143506,
+ 0.027592,0.924135,-0.381068,-2.209799,0.346455,-4.143506,
+ 0.029316,0.707717,-0.705888,-2.20221,0.265165,-4.265165,
+ 0,0.442968,-0.896538,-7.983022,0.143506,-4.346455,
+ 0,0.707107,-0.707107,-7.983022,0.265165,-4.265165,
+ 0,0.442968,-0.896538,-7.983022,0.143506,-4.346455,
+ 0.029316,0.707717,-0.705888,-2.20221,0.265165,-4.265165,
+ 0.055921,0.383318,-0.921922,-2.197139,0.143506,-4.346455,
+ 0.055921,0.383318,-0.921922,-2.197139,0.143506,-4.346455,
+ 0,0.19509,-0.980785,-7.983022,0,-4.375,
+ 0,0.442968,-0.896538,-7.983022,0.143506,-4.346455,
+ 0,0.19509,-0.980785,-7.983022,0,-4.375,
+ 0.055921,0.383318,-0.921922,-2.197139,0.143506,-4.346455,
+ 0.08139,0.195414,-0.977338,-2.195359,0,-4.375,
+ -0.040695,0.195414,0.979876,-2.242141,0,-3.625,
+ 0,0.320722,0.947173,-7.983022,0.143506,-3.653545,
+ 0,0.19509,0.980785,-7.983022,0,-3.625,
+ 0,0.320722,0.947173,-7.983022,0.143506,-3.653545,
+ -0.040695,0.195414,0.979876,-2.242141,0,-3.625,
+ -0.05908,0.383318,0.921725,-2.240361,0.143506,-3.653545
+};
+static const struct gllist seccam_pipe_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 336, seccam_pipe_data, 0
+};
+const struct gllist *seccam_pipe = &seccam_pipe_frame;
diff --git a/hacks/glx/seccam.dxf b/hacks/glx/seccam.dxf
new file mode 100644
index 0000000..1afb828
--- /dev/null
+++ b/hacks/glx/seccam.dxf
@@ -0,0 +1,13606 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.25
+30
+5.0
+11
+7.750000000000005
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+3.0
+32
+3.5
+13
+-4.999999999999995
+23
+3.0
+33
+3.5
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+-4.999999999999995
+21
+2.25
+31
+5.0
+12
+7.750000000000005
+22
+2.25
+32
+5.0
+13
+7.750000000000005
+23
+2.25
+33
+5.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.4509122005603654
+30
+1.0102984675382511
+11
+-4.999999999999995
+21
+2.3687095903662865
+31
+1.0
+12
+-4.999999999999995
+22
+2.4509122005603654
+32
+1.0102984675382511
+13
+-4.999999999999995
+23
+2.4509122005603654
+33
+1.0102984675382511
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.3687095903662865
+30
+1.0
+11
+7.750000000000005
+21
+2.4509122005603654
+31
+1.0102984675382511
+12
+7.750000000000005
+22
+2.3687095903662865
+32
+1.0
+13
+7.750000000000005
+23
+2.3687095903662865
+33
+1.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+3.0
+30
+1.6312904096337157
+11
+7.750000000000005
+21
+2.9897015324617477
+31
+1.5490877994396335
+12
+-4.999999999999995
+22
+2.9897015324617477
+32
+1.5490877994396335
+13
+-4.999999999999995
+23
+2.9897015324617477
+33
+1.5490877994396335
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.9897015324617477
+30
+1.5490877994396335
+11
+-4.999999999999995
+21
+3.0
+31
+1.6312904096337157
+12
+7.750000000000005
+22
+3.0
+32
+1.6312904096337157
+13
+7.750000000000005
+23
+3.0
+33
+1.6312904096337157
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.3687095903662865
+30
+1.0
+11
+-4.999999999999995
+21
+2.25
+31
+1.0
+12
+-4.999999999999995
+22
+2.3687095903662865
+32
+1.0
+13
+-4.999999999999995
+23
+2.3687095903662865
+33
+1.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.25
+30
+1.0
+11
+7.750000000000005
+21
+2.3687095903662865
+31
+1.0
+12
+7.750000000000005
+22
+2.25
+32
+1.0
+13
+7.750000000000005
+23
+2.25
+33
+1.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.6402416202020973
+30
+1.078314212963632
+11
+-4.999999999999995
+21
+2.5480782113171188
+31
+1.0373436898884558
+12
+-4.999999999999995
+22
+2.6402416202020973
+32
+1.078314212963632
+13
+-4.999999999999995
+23
+2.6402416202020973
+33
+1.078314212963632
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.5480782113171188
+30
+1.0373436898884558
+11
+7.750000000000005
+21
+2.6402416202020973
+31
+1.078314212963632
+12
+7.750000000000005
+22
+2.5480782113171188
+32
+1.0373436898884558
+13
+7.750000000000005
+23
+2.5480782113171188
+33
+1.0373436898884558
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.921685787036367
+30
+1.3597583797979014
+11
+7.750000000000005
+21
+2.867671745559793
+31
+1.2745811467968204
+12
+-4.999999999999995
+22
+2.867671745559793
+32
+1.2745811467968204
+13
+-4.999999999999995
+23
+2.867671745559793
+33
+1.2745811467968204
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.867671745559793
+30
+1.2745811467968204
+11
+-4.999999999999995
+21
+2.921685787036367
+31
+1.3597583797979014
+12
+7.750000000000005
+22
+2.921685787036367
+32
+1.3597583797979014
+13
+7.750000000000005
+23
+2.921685787036367
+33
+1.3597583797979014
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+1.0
+11
+-4.999999999999995
+21
+0.0
+31
+1.0
+12
+-4.999999999999995
+22
+2.25
+32
+1.0
+13
+-4.999999999999995
+23
+2.25
+33
+1.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+0.0
+30
+1.0
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000005
+22
+0.0
+32
+1.0
+13
+7.750000000000005
+23
+0.0
+33
+1.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+0.0
+30
+5.0
+11
+-4.999999999999995
+21
+2.25
+31
+5.0
+12
+-4.999999999999995
+22
+0.0
+32
+5.0
+13
+-4.999999999999995
+23
+0.0
+33
+5.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.25
+30
+5.0
+11
+7.750000000000005
+21
+0.0
+31
+5.0
+12
+7.750000000000005
+22
+2.25
+32
+5.0
+13
+7.750000000000005
+23
+2.25
+33
+5.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.7254188532031787
+30
+1.1323282544402056
+11
+-4.999999999999995
+21
+2.6402416202020973
+31
+1.078314212963632
+12
+-4.999999999999995
+22
+2.7254188532031787
+32
+1.1323282544402056
+13
+-4.999999999999995
+23
+2.7254188532031787
+33
+1.1323282544402056
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.6402416202020973
+30
+1.078314212963632
+11
+7.750000000000005
+21
+2.7254188532031787
+31
+1.1323282544402056
+12
+7.750000000000005
+22
+2.6402416202020973
+32
+1.078314212963632
+13
+7.750000000000005
+23
+2.6402416202020973
+33
+1.078314212963632
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+3.0
+30
+1.75
+11
+7.750000000000005
+21
+3.0
+31
+1.6312904096337157
+12
+-4.999999999999995
+22
+3.0
+32
+1.6312904096337157
+13
+-4.999999999999995
+23
+3.0
+33
+1.6312904096337157
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+1.6312904096337157
+11
+-4.999999999999995
+21
+3.0
+31
+1.75
+12
+7.750000000000005
+22
+3.0
+32
+1.75
+13
+7.750000000000005
+23
+3.0
+33
+1.75
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.9626563101115444
+30
+1.4519217886828808
+11
+7.750000000000005
+21
+2.921685787036367
+31
+1.3597583797979014
+12
+-4.999999999999995
+22
+2.921685787036367
+32
+1.3597583797979014
+13
+-4.999999999999995
+23
+2.921685787036367
+33
+1.3597583797979014
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.921685787036367
+30
+1.3597583797979014
+11
+-4.999999999999995
+21
+2.9626563101115444
+31
+1.4519217886828808
+12
+7.750000000000005
+22
+2.9626563101115444
+32
+1.4519217886828808
+13
+7.750000000000005
+23
+2.9626563101115444
+33
+1.4519217886828808
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.867671745559793
+30
+1.2745811467968204
+11
+7.750000000000005
+21
+2.8017766952966365
+31
+1.1982233047033635
+12
+-4.999999999999995
+22
+2.8017766952966365
+32
+1.1982233047033635
+13
+-4.999999999999995
+23
+2.8017766952966365
+33
+1.1982233047033635
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.8017766952966365
+30
+1.1982233047033635
+11
+-4.999999999999995
+21
+2.867671745559793
+31
+1.2745811467968204
+12
+7.750000000000005
+22
+2.867671745559793
+32
+1.2745811467968204
+13
+7.750000000000005
+23
+2.867671745559793
+33
+1.2745811467968204
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+3.0
+31
+1.75
+12
+-4.999999999999995
+22
+3.0
+32
+1.75
+13
+-4.999999999999995
+23
+3.0
+33
+1.75
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+1.75
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+7.750000000000005
+22
+3.0
+32
+3.5
+13
+7.750000000000005
+23
+3.0
+33
+3.5
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.9897015324617477
+30
+1.5490877994396335
+11
+7.750000000000005
+21
+2.9626563101115444
+31
+1.4519217886828808
+12
+-4.999999999999995
+22
+2.9626563101115444
+32
+1.4519217886828808
+13
+-4.999999999999995
+23
+2.9626563101115444
+33
+1.4519217886828808
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.9626563101115444
+30
+1.4519217886828808
+11
+-4.999999999999995
+21
+2.9897015324617477
+31
+1.5490877994396335
+12
+7.750000000000005
+22
+2.9897015324617477
+32
+1.5490877994396335
+13
+7.750000000000005
+23
+2.9897015324617477
+33
+1.5490877994396335
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.8017766952966365
+30
+1.1982233047033635
+11
+-4.999999999999995
+21
+2.7254188532031787
+31
+1.1323282544402056
+12
+-4.999999999999995
+22
+2.8017766952966365
+32
+1.1982233047033635
+13
+-4.999999999999995
+23
+2.8017766952966365
+33
+1.1982233047033635
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.7254188532031787
+30
+1.1323282544402056
+11
+7.750000000000005
+21
+2.8017766952966365
+31
+1.1982233047033635
+12
+7.750000000000005
+22
+2.7254188532031787
+32
+1.1323282544402056
+13
+7.750000000000005
+23
+2.7254188532031787
+33
+1.1323282544402056
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.5480782113171188
+30
+1.0373436898884558
+11
+-4.999999999999995
+21
+2.4509122005603654
+31
+1.0102984675382511
+12
+-4.999999999999995
+22
+2.5480782113171188
+32
+1.0373436898884558
+13
+-4.999999999999995
+23
+2.5480782113171188
+33
+1.0373436898884558
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.4509122005603654
+30
+1.0102984675382511
+11
+7.750000000000005
+21
+2.5480782113171188
+31
+1.0373436898884558
+12
+7.750000000000005
+22
+2.4509122005603654
+32
+1.0102984675382511
+13
+7.750000000000005
+23
+2.4509122005603654
+33
+1.0102984675382511
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0022393770907527
+30
+1.649165170260476
+11
+7.750000000000005
+21
+3.0
+31
+1.75
+12
+7.750000000000005
+22
+3.0
+32
+1.6312904096337157
+13
+7.750000000000005
+23
+3.0
+33
+1.6312904096337157
+70
+0
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.3687095903662865
+30
+1.0
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000005
+22
+2.350834829739524
+32
+0.9977606229092469
+13
+7.750000000000005
+23
+2.350834829739524
+33
+0.9977606229092469
+70
+0
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+1.0
+11
+7.750000000000005
+21
+0.0
+31
+1.875
+12
+7.750000000000005
+22
+0.0
+32
+1.0
+13
+7.750000000000005
+23
+0.0
+33
+1.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+0.0
+30
+1.875
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000005
+22
+1.1747544018386193
+32
+1.8759471195380106
+13
+7.750000000000005
+23
+1.1747544018386193
+33
+1.8759471195380106
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+1.1747544018386193
+30
+1.8759471195380106
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000005
+22
+1.2457732068062848
+32
+1.8996200545272304
+13
+7.750000000000005
+23
+1.2457732068062848
+33
+1.8996200545272304
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+1.2457732068062848
+30
+1.8996200545272304
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000007
+22
+1.3062249999999933
+32
+1.9437749999999956
+13
+7.750000000000007
+23
+1.3062249999999933
+33
+1.9437749999999956
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000007
+20
+1.3062249999999933
+30
+1.9437749999999956
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000007
+22
+1.350379945472767
+32
+2.0042267931937126
+13
+7.750000000000007
+23
+1.350379945472767
+33
+2.0042267931937126
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000007
+20
+1.350379945472767
+30
+2.0042267931937126
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000005
+22
+1.3740528804619876
+32
+2.075245598161383
+13
+7.750000000000005
+23
+1.3740528804619876
+33
+2.075245598161383
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+1.3740528804619876
+30
+2.075245598161383
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.7500000000000036
+22
+1.3740528804619905
+32
+3.9247544018386162
+13
+7.7500000000000036
+23
+1.3740528804619905
+33
+3.9247544018386162
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.7500000000000036
+20
+1.1747544018386225
+30
+4.124052880461991
+11
+7.750000000000005
+21
+0.0
+31
+5.0
+12
+7.750000000000005
+22
+0.0
+32
+4.125
+13
+7.750000000000005
+23
+0.0
+33
+4.125
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+0.0
+30
+5.0
+11
+7.7500000000000036
+21
+1.1747544018386225
+31
+4.124052880461991
+12
+7.750000000000005
+22
+2.25
+32
+5.0
+13
+7.750000000000005
+23
+2.25
+33
+5.0
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+5.0
+11
+7.7500000000000036
+21
+1.1747544018386225
+31
+4.124052880461991
+12
+7.7500000000000036
+22
+1.2457732068062874
+32
+4.100379945472771
+13
+7.7500000000000036
+23
+1.2457732068062874
+33
+4.100379945472771
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+5.0
+11
+7.7500000000000036
+21
+1.2457732068062874
+31
+4.100379945472771
+12
+7.7500000000000036
+22
+1.3062249999999964
+32
+4.056225000000004
+13
+7.7500000000000036
+23
+1.3062249999999964
+33
+4.056225000000004
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+5.0
+11
+7.7500000000000036
+21
+1.3062249999999964
+31
+4.056225000000004
+12
+7.7500000000000036
+22
+1.3503799454727698
+32
+3.9957732068062874
+13
+7.7500000000000036
+23
+1.3503799454727698
+33
+3.9957732068062874
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+5.0
+11
+7.7500000000000036
+21
+1.3503799454727698
+31
+3.9957732068062874
+12
+7.7500000000000036
+22
+1.3740528804619905
+32
+3.9247544018386162
+13
+7.7500000000000036
+23
+1.3740528804619905
+33
+3.9247544018386162
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+5.0
+11
+7.7500000000000036
+21
+1.3740528804619905
+31
+3.9247544018386162
+12
+7.750000000000005
+22
+2.25
+32
+1.0
+13
+7.750000000000005
+23
+2.25
+33
+1.0
+70
+15
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+5.0
+11
+7.750000000000005
+21
+2.25
+31
+1.0
+12
+7.750000000000005
+22
+2.3687095903662865
+32
+1.0
+13
+7.750000000000005
+23
+2.3687095903662865
+33
+1.0
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+2.25
+30
+5.0
+11
+7.750000000000005
+21
+2.3687095903662865
+31
+1.0
+12
+7.750000000000005
+22
+3.0
+32
+3.5
+13
+7.750000000000005
+23
+3.0
+33
+3.5
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.3687095903662865
+31
+1.0
+12
+7.750000000000005
+22
+2.4509122005603654
+32
+1.0102984675382511
+13
+7.750000000000005
+23
+2.4509122005603654
+33
+1.0102984675382511
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.4509122005603654
+31
+1.0102984675382511
+12
+7.750000000000005
+22
+2.5480782113171188
+32
+1.0373436898884558
+13
+7.750000000000005
+23
+2.5480782113171188
+33
+1.0373436898884558
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.5480782113171188
+31
+1.0373436898884558
+12
+7.750000000000005
+22
+2.6402416202020973
+32
+1.078314212963632
+13
+7.750000000000005
+23
+2.6402416202020973
+33
+1.078314212963632
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.6402416202020973
+31
+1.078314212963632
+12
+7.750000000000005
+22
+2.7254188532031787
+32
+1.1323282544402056
+13
+7.750000000000005
+23
+2.7254188532031787
+33
+1.1323282544402056
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.7254188532031787
+31
+1.1323282544402056
+12
+7.750000000000005
+22
+2.8017766952966365
+32
+1.1982233047033635
+13
+7.750000000000005
+23
+2.8017766952966365
+33
+1.1982233047033635
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.8017766952966365
+31
+1.1982233047033635
+12
+7.750000000000005
+22
+2.867671745559793
+32
+1.2745811467968204
+13
+7.750000000000005
+23
+2.867671745559793
+33
+1.2745811467968204
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.867671745559793
+31
+1.2745811467968204
+12
+7.750000000000005
+22
+2.921685787036367
+32
+1.3597583797979014
+13
+7.750000000000005
+23
+2.921685787036367
+33
+1.3597583797979014
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.921685787036367
+31
+1.3597583797979014
+12
+7.750000000000005
+22
+2.9626563101115444
+32
+1.4519217886828808
+13
+7.750000000000005
+23
+2.9626563101115444
+33
+1.4519217886828808
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.9626563101115444
+31
+1.4519217886828808
+12
+7.750000000000005
+22
+2.9897015324617477
+32
+1.5490877994396335
+13
+7.750000000000005
+23
+2.9897015324617477
+33
+1.5490877994396335
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+2.9897015324617477
+31
+1.5490877994396335
+12
+7.750000000000005
+22
+3.0
+32
+1.6312904096337157
+13
+7.750000000000005
+23
+3.0
+33
+1.6312904096337157
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+3.0
+30
+3.5
+11
+7.750000000000005
+21
+3.0
+31
+1.6312904096337157
+12
+7.750000000000005
+22
+3.0
+32
+1.75
+13
+7.750000000000005
+23
+3.0
+33
+1.75
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+1.3740528804619876
+30
+2.075245598161383
+11
+7.550000000000008
+21
+1.350379945472767
+31
+2.0042267931937126
+12
+7.750000000000007
+22
+1.350379945472767
+32
+2.0042267931937126
+13
+7.750000000000007
+23
+1.350379945472767
+33
+2.0042267931937126
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000008
+20
+1.350379945472767
+30
+2.0042267931937126
+11
+7.750000000000005
+21
+1.3740528804619876
+31
+2.075245598161383
+12
+7.550000000000006
+22
+1.3740528804619876
+32
+2.075245598161383
+13
+7.550000000000006
+23
+1.3740528804619876
+33
+2.075245598161383
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+0.0
+30
+1.875
+11
+7.550000000000006
+21
+1.1747544018386193
+31
+1.8759471195380104
+12
+7.550000000000006
+22
+-2.222303025906979e-17
+32
+1.8749999999999998
+13
+7.550000000000006
+23
+-2.222303025906979e-17
+33
+1.8749999999999998
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000006
+20
+1.1747544018386193
+30
+1.8759471195380104
+11
+7.750000000000005
+21
+0.0
+31
+1.875
+12
+7.750000000000005
+22
+1.1747544018386193
+32
+1.8759471195380106
+13
+7.750000000000005
+23
+1.1747544018386193
+33
+1.8759471195380106
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.7500000000000036
+20
+1.1747544018386225
+30
+4.124052880461991
+11
+7.550000000000006
+21
+-2.222303025906979e-17
+31
+4.125
+12
+7.550000000000004
+22
+1.1747544018386225
+32
+4.124052880461991
+13
+7.550000000000004
+23
+1.1747544018386225
+33
+4.124052880461991
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000006
+20
+-2.222303025906979e-17
+30
+4.125
+11
+7.7500000000000036
+21
+1.1747544018386225
+31
+4.124052880461991
+12
+7.750000000000005
+22
+0.0
+32
+4.125
+13
+7.750000000000005
+23
+0.0
+33
+4.125
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.7500000000000036
+20
+1.2457732068062874
+30
+4.100379945472771
+11
+7.550000000000004
+21
+1.1747544018386225
+31
+4.124052880461991
+12
+7.550000000000004
+22
+1.2457732068062874
+32
+4.100379945472771
+13
+7.550000000000004
+23
+1.2457732068062874
+33
+4.100379945472771
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000004
+20
+1.1747544018386225
+30
+4.124052880461991
+11
+7.7500000000000036
+21
+1.2457732068062874
+31
+4.100379945472771
+12
+7.7500000000000036
+22
+1.1747544018386225
+32
+4.124052880461991
+13
+7.7500000000000036
+23
+1.1747544018386225
+33
+4.124052880461991
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.7500000000000036
+20
+1.3503799454727698
+30
+3.9957732068062874
+11
+7.550000000000004
+21
+1.3740528804619905
+31
+3.9247544018386162
+12
+7.7500000000000036
+22
+1.3740528804619905
+32
+3.9247544018386162
+13
+7.7500000000000036
+23
+1.3740528804619905
+33
+3.9247544018386162
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000004
+20
+1.3740528804619905
+30
+3.9247544018386162
+11
+7.7500000000000036
+21
+1.3503799454727698
+31
+3.9957732068062874
+12
+7.550000000000004
+22
+1.3503799454727698
+32
+3.9957732068062874
+13
+7.550000000000004
+23
+1.3503799454727698
+33
+3.9957732068062874
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000007
+20
+1.3062249999999933
+30
+1.9437749999999956
+11
+7.550000000000008
+21
+1.350379945472767
+31
+2.0042267931937126
+12
+7.550000000000008
+22
+1.3062249999999933
+32
+1.9437749999999956
+13
+7.550000000000008
+23
+1.3062249999999933
+33
+1.9437749999999956
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000008
+20
+1.350379945472767
+30
+2.0042267931937126
+11
+7.750000000000007
+21
+1.3062249999999933
+31
+1.9437749999999956
+12
+7.750000000000007
+22
+1.350379945472767
+32
+2.0042267931937126
+13
+7.750000000000007
+23
+1.350379945472767
+33
+2.0042267931937126
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.7500000000000036
+20
+1.3062249999999964
+30
+4.056225000000004
+11
+7.550000000000004
+21
+1.2457732068062874
+31
+4.100379945472771
+12
+7.550000000000004
+22
+1.3062249999999964
+32
+4.056225000000004
+13
+7.550000000000004
+23
+1.3062249999999964
+33
+4.056225000000004
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000004
+20
+1.2457732068062874
+30
+4.100379945472771
+11
+7.7500000000000036
+21
+1.3062249999999964
+31
+4.056225000000004
+12
+7.7500000000000036
+22
+1.2457732068062874
+32
+4.100379945472771
+13
+7.7500000000000036
+23
+1.2457732068062874
+33
+4.100379945472771
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+1.1747544018386193
+30
+1.8759471195380106
+11
+7.550000000000006
+21
+1.2457732068062848
+31
+1.8996200545272304
+12
+7.550000000000006
+22
+1.1747544018386193
+32
+1.8759471195380104
+13
+7.550000000000006
+23
+1.1747544018386193
+33
+1.8759471195380104
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000006
+20
+1.2457732068062848
+30
+1.8996200545272304
+11
+7.750000000000005
+21
+1.1747544018386193
+31
+1.8759471195380106
+12
+7.750000000000005
+22
+1.2457732068062848
+32
+1.8996200545272304
+13
+7.750000000000005
+23
+1.2457732068062848
+33
+1.8996200545272304
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.7500000000000036
+20
+1.3740528804619905
+30
+3.9247544018386162
+11
+7.550000000000006
+21
+1.3740528804619876
+31
+2.075245598161383
+12
+7.750000000000005
+22
+1.3740528804619876
+32
+2.075245598161383
+13
+7.750000000000005
+23
+1.3740528804619876
+33
+2.075245598161383
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000006
+20
+1.3740528804619876
+30
+2.075245598161383
+11
+7.7500000000000036
+21
+1.3740528804619905
+31
+3.9247544018386162
+12
+7.550000000000004
+22
+1.3740528804619905
+32
+3.9247544018386162
+13
+7.550000000000004
+23
+1.3740528804619905
+33
+3.9247544018386162
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.750000000000005
+20
+1.2457732068062848
+30
+1.8996200545272304
+11
+7.550000000000008
+21
+1.3062249999999933
+31
+1.9437749999999956
+12
+7.550000000000006
+22
+1.2457732068062848
+32
+1.8996200545272304
+13
+7.550000000000006
+23
+1.2457732068062848
+33
+1.8996200545272304
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000008
+20
+1.3062249999999933
+30
+1.9437749999999956
+11
+7.750000000000005
+21
+1.2457732068062848
+31
+1.8996200545272304
+12
+7.750000000000007
+22
+1.3062249999999933
+32
+1.9437749999999956
+13
+7.750000000000007
+23
+1.3062249999999933
+33
+1.9437749999999956
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.7500000000000036
+20
+1.3062249999999964
+30
+4.056225000000004
+11
+7.550000000000004
+21
+1.3503799454727698
+31
+3.9957732068062874
+12
+7.7500000000000036
+22
+1.3503799454727698
+32
+3.9957732068062874
+13
+7.7500000000000036
+23
+1.3503799454727698
+33
+3.9957732068062874
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+7.550000000000004
+20
+1.3503799454727698
+30
+3.9957732068062874
+11
+7.7500000000000036
+21
+1.3062249999999964
+31
+4.056225000000004
+12
+7.550000000000004
+22
+1.3062249999999964
+32
+4.056225000000004
+13
+7.550000000000004
+23
+1.3062249999999964
+33
+4.056225000000004
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.25
+30
+5.0
+11
+-4.999999999999995
+21
+0.0
+31
+1.0
+12
+-4.999999999999995
+22
+0.0
+32
+5.0
+13
+-4.999999999999995
+23
+0.0
+33
+5.0
+70
+1
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+0.0
+30
+1.0
+11
+-4.999999999999995
+21
+2.25
+31
+5.0
+12
+-4.999999999999995
+22
+2.25
+32
+1.0
+13
+-4.999999999999995
+23
+2.25
+33
+1.0
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.25
+30
+1.0
+11
+-4.999999999999995
+21
+2.25
+31
+5.0
+12
+-4.999999999999995
+22
+3.0
+32
+3.5
+13
+-4.999999999999995
+23
+3.0
+33
+3.5
+70
+13
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.25
+30
+1.0
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.3687095903662865
+32
+1.0
+13
+-4.999999999999995
+23
+2.3687095903662865
+33
+1.0
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.3687095903662865
+30
+1.0
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.4509122005603654
+32
+1.0102984675382511
+13
+-4.999999999999995
+23
+2.4509122005603654
+33
+1.0102984675382511
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.4509122005603654
+30
+1.0102984675382511
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.5480782113171188
+32
+1.0373436898884558
+13
+-4.999999999999995
+23
+2.5480782113171188
+33
+1.0373436898884558
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.5480782113171188
+30
+1.0373436898884558
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.6402416202020973
+32
+1.078314212963632
+13
+-4.999999999999995
+23
+2.6402416202020973
+33
+1.078314212963632
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.6402416202020973
+30
+1.078314212963632
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.7254188532031787
+32
+1.1323282544402056
+13
+-4.999999999999995
+23
+2.7254188532031787
+33
+1.1323282544402056
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.7254188532031787
+30
+1.1323282544402056
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.8017766952966365
+32
+1.1982233047033635
+13
+-4.999999999999995
+23
+2.8017766952966365
+33
+1.1982233047033635
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.8017766952966365
+30
+1.1982233047033635
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.867671745559793
+32
+1.2745811467968204
+13
+-4.999999999999995
+23
+2.867671745559793
+33
+1.2745811467968204
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.867671745559793
+30
+1.2745811467968204
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.921685787036367
+32
+1.3597583797979014
+13
+-4.999999999999995
+23
+2.921685787036367
+33
+1.3597583797979014
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.921685787036367
+30
+1.3597583797979014
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.9626563101115444
+32
+1.4519217886828808
+13
+-4.999999999999995
+23
+2.9626563101115444
+33
+1.4519217886828808
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.9626563101115444
+30
+1.4519217886828808
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+2.9897015324617477
+32
+1.5490877994396335
+13
+-4.999999999999995
+23
+2.9897015324617477
+33
+1.5490877994396335
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+2.9897015324617477
+30
+1.5490877994396335
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+3.0
+32
+1.6312904096337157
+13
+-4.999999999999995
+23
+3.0
+33
+1.6312904096337157
+70
+3
+ 0
+3DFACE
+ 8
+body
+10
+-4.999999999999995
+20
+3.0
+30
+1.6312904096337157
+11
+-4.999999999999995
+21
+3.0
+31
+3.5
+12
+-4.999999999999995
+22
+3.0
+32
+1.75
+13
+-4.999999999999995
+23
+3.0
+33
+1.75
+70
+1
+ 0
+LINE
+ 8
+pipe
+10
+-0.08721736878314612
+20
+8.494352845371596e-15
+30
+-2.4776466855968224
+11
+-0.3956452587067991
+21
+1.0422940645021578e-14
+31
+-3.1080810198814763
+ 0
+LINE
+ 8
+pipe
+10
+-1.5223533144031824
+20
+1.2493526601693497e-14
+30
+-3.9127826312168583
+11
+-2.2187500000000036
+21
+1.2411535748317739e-14
+31
+-4.000000000000002
+ 0
+LINE
+ 8
+pipe
+10
+-2.6645352591003757e-15
+20
+6.228730001642882e-15
+30
+-1.7812500000000018
+11
+-2.6645352591003757e-15
+21
+4.592425496802568e-17
+31
+0.4374999999999982
+ 0
+LINE
+ 8
+pipe
+10
+-8.000000000000002
+20
+1.2411535748317739e-14
+30
+-4.000000000000002
+11
+-2.2187500000000036
+21
+1.2411535748317739e-14
+31
+-4.000000000000002
+ 0
+LINE
+ 8
+pipe
+10
+-2.6645352591003757e-15
+20
+6.228730001642882e-15
+30
+-1.7812500000000018
+11
+-0.08721736878314612
+21
+8.494352845371596e-15
+31
+-2.4776466855968224
+ 0
+LINE
+ 8
+pipe
+10
+-0.8919189801185281
+20
+1.1805865272252293e-14
+30
+-3.604354741293205
+11
+-1.5223533144031824
+21
+1.2493526601693497e-14
+31
+-3.9127826312168583
+ 0
+LINE
+ 8
+pipe
+10
+-0.3956452587067991
+20
+1.0422940645021578e-14
+30
+-3.1080810198814763
+11
+-0.8919189801185281
+21
+1.1805865272252293e-14
+31
+-3.604354741293205
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.2651650429449557
+20
+0.2651650429449638
+30
+0.4374999999999982
+11
+-0.3464548246917367
+21
+0.14350628713692343
+31
+-1.7596392507172038
+12
+-0.3464548246917367
+22
+0.1435062871369173
+32
+0.4374999999999982
+13
+-0.3464548246917367
+23
+0.1435062871369173
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.3464548246917367
+20
+0.14350628713692343
+30
+-1.7596392507172038
+11
+-0.2651650429449557
+21
+0.2651650429449638
+31
+0.4374999999999982
+12
+-0.2651650429449557
+22
+0.26516504294496995
+32
+-1.764709848576957
+13
+-0.2651650429449557
+23
+0.26516504294496995
+33
+-1.764709848576957
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.2651650429449557
+20
+0.26516504294496995
+30
+-1.764709848576957
+11
+-0.1435062871369066
+21
+0.34645482469173966
+31
+0.4374999999999982
+12
+-0.1435062871369066
+22
+0.3464548246917458
+32
+-1.7722985345540216
+13
+-0.1435062871369066
+23
+0.3464548246917458
+33
+-1.7722985345540216
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.1435062871369066
+20
+0.34645482469173966
+30
+0.4374999999999982
+11
+-0.2651650429449557
+21
+0.26516504294496995
+31
+-1.764709848576957
+12
+-0.2651650429449557
+22
+0.2651650429449638
+32
+0.4374999999999982
+13
+-0.2651650429449557
+23
+0.2651650429449638
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.1435062871369066
+20
+0.3464548246917458
+30
+-1.7722985345540216
+11
+5.329070518200751e-15
+21
+0.37500000000000466
+31
+0.4374999999999982
+12
+5.329070518200751e-15
+22
+0.3750000000000108
+32
+-1.7812500000000009
+13
+5.329070518200751e-15
+23
+0.3750000000000108
+33
+-1.7812500000000009
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+5.329070518200751e-15
+20
+0.37500000000000466
+30
+0.4374999999999982
+11
+-0.1435062871369066
+21
+0.3464548246917458
+31
+-1.7722985345540216
+12
+-0.1435062871369066
+22
+0.34645482469173966
+32
+0.4374999999999982
+13
+-0.1435062871369066
+23
+0.34645482469173966
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+5.329070518200751e-15
+20
+0.3750000000000108
+30
+-1.7812500000000009
+11
+0.1435062871369155
+21
+0.34645482469173394
+31
+0.4374999999999982
+12
+0.1435062871369155
+22
+0.34645482469174016
+32
+-1.7902014654459806
+13
+0.1435062871369155
+23
+0.34645482469174016
+33
+-1.7902014654459806
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.1435062871369155
+20
+0.34645482469173394
+30
+0.4374999999999982
+11
+5.329070518200751e-15
+21
+0.3750000000000108
+31
+-1.7812500000000009
+12
+5.329070518200751e-15
+22
+0.37500000000000466
+32
+0.4374999999999982
+13
+5.329070518200751e-15
+23
+0.37500000000000466
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.1435062871369155
+20
+0.34645482469174016
+30
+-1.7902014654459806
+11
+0.265165042944961
+21
+0.26516504294495347
+31
+0.4374999999999982
+12
+0.265165042944961
+22
+0.2651650429449597
+32
+-1.7977901514230457
+13
+0.265165042944961
+23
+0.2651650429449597
+33
+-1.7977901514230457
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.265165042944961
+20
+0.26516504294495347
+30
+0.4374999999999982
+11
+0.1435062871369155
+21
+0.34645482469174016
+31
+-1.7902014654459806
+12
+0.1435062871369155
+22
+0.34645482469173394
+32
+0.4374999999999982
+13
+0.1435062871369155
+23
+0.34645482469173394
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.3464548246917367
+20
+0.14350628713691005
+30
+-1.8028607492827988
+11
+0.265165042944961
+21
+0.26516504294495347
+31
+0.4374999999999982
+12
+0.3464548246917367
+22
+0.1435062871369038
+32
+0.4374999999999982
+13
+0.3464548246917367
+23
+0.1435062871369038
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.265165042944961
+20
+0.26516504294495347
+30
+0.4374999999999982
+11
+0.3464548246917367
+21
+0.14350628713691005
+31
+-1.8028607492827988
+12
+0.265165042944961
+22
+0.2651650429449597
+32
+-1.7977901514230457
+13
+0.265165042944961
+23
+0.2651650429449597
+33
+-1.7977901514230457
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.3750000000000018
+20
+-1.1024457386968605e-15
+30
+-1.8046413064661762
+11
+0.3464548246917367
+21
+0.1435062871369038
+31
+0.4374999999999982
+12
+0.3750000000000018
+22
+-7.350434090010048e-15
+32
+0.4374999999999982
+13
+0.3750000000000018
+23
+-7.350434090010048e-15
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.3464548246917367
+20
+0.1435062871369038
+30
+0.4374999999999982
+11
+0.3750000000000018
+21
+-1.1024457386968605e-15
+31
+-1.8046413064661762
+12
+0.3464548246917367
+22
+0.14350628713691005
+32
+-1.8028607492827988
+13
+0.3464548246917367
+23
+0.14350628713691005
+33
+-1.8028607492827988
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.3464548246917367
+20
+0.1435062871369173
+30
+0.4374999999999982
+11
+-0.3750000000000071
+21
+1.3513981487014599e-14
+31
+-1.7578586935338274
+12
+-0.3750000000000071
+22
+7.396358344978072e-15
+32
+0.4374999999999982
+13
+-0.3750000000000071
+23
+7.396358344978072e-15
+33
+0.4374999999999982
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.3750000000000071
+20
+1.3513981487014599e-14
+30
+-1.7578586935338274
+11
+-0.3464548246917367
+21
+0.1435062871369173
+31
+0.4374999999999982
+12
+-0.3464548246917367
+22
+0.14350628713692343
+32
+-1.7596392507172038
+13
+-0.3464548246917367
+23
+0.14350628713692343
+33
+-1.7596392507172038
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.2651650429449557
+20
+0.26516504294496995
+30
+-1.764709848576957
+11
+-0.4238086227292559
+21
+0.14350628713692543
+31
+-2.3772791694998214
+12
+-0.3464548246917367
+22
+0.14350628713692343
+32
+-1.7596392507172038
+13
+-0.3464548246917367
+23
+0.14350628713692343
+33
+-1.7596392507172038
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.4238086227292559
+20
+0.14350628713692543
+30
+-2.3772791694998214
+11
+-0.2651650429449557
+21
+0.26516504294496995
+31
+-1.764709848576957
+12
+-0.3448331615114766
+22
+0.265165042944972
+32
+-2.4008287144809053
+13
+-0.3448331615114766
+23
+0.265165042944972
+33
+-2.4008287144809053
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.3448331615114766
+20
+0.265165042944972
+30
+-2.4008287144809053
+11
+-0.1435062871369066
+21
+0.3464548246917458
+31
+-1.7722985345540216
+12
+-0.22663803114378656
+22
+0.34645482469174793
+32
+-2.4360730992077455
+13
+-0.22663803114378656
+23
+0.34645482469174793
+33
+-2.4360730992077455
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.1435062871369066
+20
+0.3464548246917458
+30
+-1.7722985345540216
+11
+-0.3448331615114766
+21
+0.265165042944972
+31
+-2.4008287144809053
+12
+-0.2651650429449557
+22
+0.26516504294496995
+32
+-1.764709848576957
+13
+-0.2651650429449557
+23
+0.26516504294496995
+33
+-1.764709848576957
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.22663803114378656
+20
+0.34645482469174793
+30
+-2.4360730992077455
+11
+5.329070518200751e-15
+21
+0.3750000000000108
+31
+-1.7812500000000009
+12
+-0.08721736878313813
+22
+0.3750000000000131
+32
+-2.4776466855968238
+13
+-0.08721736878313813
+23
+0.3750000000000131
+33
+-2.4776466855968238
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+5.329070518200751e-15
+20
+0.3750000000000108
+30
+-1.7812500000000009
+11
+-0.22663803114378656
+21
+0.34645482469174793
+31
+-2.4360730992077455
+12
+-0.1435062871369066
+22
+0.3464548246917458
+32
+-1.7722985345540216
+13
+-0.1435062871369066
+23
+0.3464548246917458
+33
+-1.7722985345540216
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.08721736878313813
+20
+0.3750000000000131
+30
+-2.4776466855968238
+11
+0.1435062871369155
+21
+0.34645482469174016
+31
+-1.7902014654459806
+12
+0.05220329357750764
+22
+0.34645482469174255
+32
+-2.519220271985901
+13
+0.05220329357750764
+23
+0.34645482469174255
+33
+-2.519220271985901
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.1435062871369155
+20
+0.34645482469174016
+30
+-1.7902014654459806
+11
+-0.08721736878313813
+21
+0.3750000000000131
+31
+-2.4776466855968238
+12
+5.329070518200751e-15
+22
+0.3750000000000108
+32
+-1.7812500000000009
+13
+5.329070518200751e-15
+23
+0.3750000000000108
+33
+-1.7812500000000009
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.05220329357750764
+20
+0.34645482469174255
+30
+-2.519220271985901
+11
+0.265165042944961
+21
+0.2651650429449597
+31
+-1.7977901514230457
+12
+0.1703984239451941
+22
+0.2651650429449621
+32
+-2.554464656712741
+13
+0.1703984239451941
+23
+0.2651650429449621
+33
+-2.554464656712741
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.265165042944961
+20
+0.2651650429449597
+30
+-1.7977901514230457
+11
+0.05220329357750764
+21
+0.34645482469174255
+31
+-2.519220271985901
+12
+0.1435062871369155
+22
+0.34645482469174016
+32
+-1.7902014654459806
+13
+0.1435062871369155
+23
+0.34645482469174016
+33
+-1.7902014654459806
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.249373885162969
+20
+0.14350628713691257
+30
+-2.578014201693824
+11
+0.265165042944961
+21
+0.2651650429449597
+31
+-1.7977901514230457
+12
+0.3464548246917367
+22
+0.14350628713691005
+32
+-1.8028607492827988
+13
+0.3464548246917367
+23
+0.14350628713691005
+33
+-1.8028607492827988
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.265165042944961
+20
+0.2651650429449597
+30
+-1.7977901514230457
+11
+0.249373885162969
+21
+0.14350628713691257
+31
+-2.578014201693824
+12
+0.1703984239451941
+22
+0.2651650429449621
+32
+-2.554464656712741
+13
+0.1703984239451941
+23
+0.2651650429449621
+33
+-2.554464656712741
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.27710637917476255
+20
+1.4405113201022419e-15
+30
+-2.586283702182938
+11
+0.3464548246917367
+21
+0.14350628713691005
+31
+-1.8028607492827988
+12
+0.3750000000000018
+22
+-1.1024457386968605e-15
+32
+-1.8046413064661762
+13
+0.3750000000000018
+23
+-1.1024457386968605e-15
+33
+-1.8046413064661762
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.3464548246917367
+20
+0.14350628713691005
+30
+-1.8028607492827988
+11
+0.27710637917476255
+21
+1.4405113201022419e-15
+31
+-2.586283702182938
+12
+0.249373885162969
+22
+0.14350628713691257
+32
+-2.578014201693824
+13
+0.249373885162969
+23
+0.14350628713691257
+33
+-2.578014201693824
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.3464548246917367
+20
+0.14350628713692343
+30
+-1.7596392507172038
+11
+-0.4515411167410548
+21
+1.5502270115672923e-14
+31
+-2.3690096690107065
+12
+-0.3750000000000071
+22
+1.3513981487014599e-14
+32
+-1.7578586935338274
+13
+-0.3750000000000071
+23
+1.3513981487014599e-14
+33
+-1.7578586935338274
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.4515411167410548
+20
+1.5502270115672923e-14
+30
+-2.3690096690107065
+11
+-0.3464548246917367
+21
+0.14350628713692343
+31
+-1.7596392507172038
+12
+-0.4238086227292559
+22
+0.14350628713692543
+32
+-2.3772791694998214
+13
+-0.4238086227292559
+23
+0.14350628713692543
+33
+-2.3772791694998214
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.3448331615114766
+20
+0.265165042944972
+30
+-2.4008287144809053
+11
+-0.6814692043452624
+21
+0.14350628713692704
+31
+-2.9039438536912954
+12
+-0.4238086227292559
+22
+0.14350628713692543
+32
+-2.3772791694998214
+13
+-0.4238086227292559
+23
+0.14350628713692543
+33
+-2.3772791694998214
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.6814692043452624
+20
+0.14350628713692704
+30
+-2.9039438536912954
+11
+-0.3448331615114766
+21
+0.265165042944972
+31
+-2.4008287144809053
+12
+-0.6144054358449154
+22
+0.26516504294497373
+32
+-2.9518411970195952
+13
+-0.6144054358449154
+23
+0.26516504294497373
+33
+-2.9518411970195952
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.6144054358449154
+20
+0.26516504294497373
+30
+-2.9518411970195952
+11
+-0.22663803114378656
+21
+0.34645482469174793
+31
+-2.4360730992077455
+12
+-0.514037413441236
+22
+0.34645482469174976
+32
+-3.0235246370610946
+13
+-0.514037413441236
+23
+0.34645482469174976
+33
+-3.0235246370610946
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.22663803114378656
+20
+0.34645482469174793
+30
+-2.4360730992077455
+11
+-0.6144054358449154
+21
+0.26516504294497373
+31
+-2.9518411970195952
+12
+-0.3448331615114766
+22
+0.265165042944972
+32
+-2.4008287144809053
+13
+-0.3448331615114766
+23
+0.265165042944972
+33
+-2.4008287144809053
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.514037413441236
+20
+0.34645482469174976
+30
+-3.0235246370610946
+11
+-0.08721736878313813
+21
+0.3750000000000131
+31
+-2.4776466855968238
+12
+-0.395645258706792
+22
+0.37500000000001504
+32
+-3.10808101988148
+13
+-0.395645258706792
+23
+0.37500000000001504
+33
+-3.10808101988148
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.08721736878313813
+20
+0.3750000000000131
+30
+-2.4776466855968238
+11
+-0.514037413441236
+21
+0.34645482469174976
+31
+-3.0235246370610946
+12
+-0.22663803114378656
+22
+0.34645482469174793
+32
+-2.4360730992077455
+13
+-0.22663803114378656
+23
+0.34645482469174793
+33
+-2.4360730992077455
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.395645258706792
+20
+0.37500000000001504
+30
+-3.10808101988148
+11
+0.05220329357750764
+21
+0.34645482469174255
+31
+-2.519220271985901
+12
+-0.2772531039723507
+22
+0.3464548246917446
+32
+-3.1926374027018634
+13
+-0.2772531039723507
+23
+0.3464548246917446
+33
+-3.1926374027018634
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.05220329357750764
+20
+0.34645482469174255
+30
+-2.519220271985901
+11
+-0.395645258706792
+21
+0.37500000000001504
+31
+-3.10808101988148
+12
+-0.08721736878313813
+22
+0.3750000000000131
+32
+-2.4776466855968238
+13
+-0.08721736878313813
+23
+0.3750000000000131
+33
+-2.4776466855968238
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.2772531039723507
+20
+0.3464548246917446
+30
+-3.1926374027018634
+11
+0.1703984239451941
+21
+0.2651650429449621
+31
+-2.554464656712741
+12
+-0.1768850815686731
+22
+0.2651650429449643
+32
+-3.264320842743362
+13
+-0.1768850815686731
+23
+0.2651650429449643
+33
+-3.264320842743362
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.1703984239451941
+20
+0.2651650429449621
+30
+-2.554464656712741
+11
+-0.2772531039723507
+21
+0.3464548246917446
+31
+-3.1926374027018634
+12
+0.05220329357750764
+22
+0.34645482469174255
+32
+-2.519220271985901
+13
+0.05220329357750764
+23
+0.34645482469174255
+33
+-2.519220271985901
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.10982131306833232
+20
+0.14350628713691482
+30
+-3.3122181860716595
+11
+0.1703984239451941
+21
+0.2651650429449621
+31
+-2.554464656712741
+12
+0.249373885162969
+22
+0.14350628713691257
+32
+-2.578014201693824
+13
+0.249373885162969
+23
+0.14350628713691257
+33
+-2.578014201693824
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.1703984239451941
+20
+0.2651650429449621
+30
+-2.554464656712741
+11
+-0.10982131306833232
+21
+0.14350628713691482
+31
+-3.3122181860716595
+12
+-0.1768850815686731
+22
+0.2651650429449643
+32
+-3.264320842743362
+13
+-0.1768850815686731
+23
+0.2651650429449643
+33
+-3.264320842743362
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.08627164929092768
+20
+3.712700234448697e-15
+30
+-3.329037496355521
+11
+0.249373885162969
+21
+0.14350628713691257
+31
+-2.578014201693824
+12
+0.27710637917476255
+22
+1.4405113201022419e-15
+32
+-2.586283702182938
+13
+0.27710637917476255
+23
+1.4405113201022419e-15
+33
+-2.586283702182938
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+0.249373885162969
+20
+0.14350628713691257
+30
+-2.578014201693824
+11
+-0.08627164929092768
+21
+3.712700234448697e-15
+31
+-3.329037496355521
+12
+-0.10982131306833232
+22
+0.14350628713691482
+32
+-3.3122181860716595
+13
+-0.10982131306833232
+23
+0.14350628713691482
+33
+-3.3122181860716595
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.4238086227292559
+20
+0.14350628713692543
+30
+-2.3772791694998214
+11
+-0.7050188681226714
+21
+1.7087256800626433e-14
+31
+-2.887124543407431
+12
+-0.4515411167410548
+22
+1.5502270115672923e-14
+32
+-2.3690096690107065
+13
+-0.4515411167410548
+23
+1.5502270115672923e-14
+33
+-2.3690096690107065
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.7050188681226714
+20
+1.7087256800626433e-14
+30
+-2.887124543407431
+11
+-0.4238086227292559
+21
+0.14350628713692543
+31
+-2.3772791694998214
+12
+-0.6814692043452624
+22
+0.14350628713692704
+32
+-2.9039438536912954
+13
+-0.6814692043452624
+23
+0.14350628713692704
+33
+-2.9039438536912954
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.6814692043452624
+20
+0.14350628713692704
+30
+-2.9039438536912954
+11
+-1.0481588029804083
+21
+0.2651650429449749
+31
+-3.3855945641550873
+12
+-1.0960561463087082
+22
+0.1435062871369282
+32
+-3.318530795654741
+13
+-1.0960561463087082
+23
+0.1435062871369282
+33
+-3.318530795654741
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.0481588029804083
+20
+0.2651650429449749
+30
+-3.3855945641550873
+11
+-0.6814692043452624
+21
+0.14350628713692704
+31
+-2.9039438536912954
+12
+-0.6144054358449154
+22
+0.26516504294497373
+32
+-2.9518411970195952
+13
+-0.6144054358449154
+23
+0.26516504294497373
+33
+-2.9518411970195952
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.0481588029804083
+20
+0.2651650429449749
+30
+-3.3855945641550873
+11
+-0.514037413441236
+21
+0.34645482469174976
+31
+-3.0235246370610946
+12
+-0.976475362938908
+22
+0.34645482469175104
+32
+-3.4859625865587667
+13
+-0.976475362938908
+23
+0.34645482469175104
+33
+-3.4859625865587667
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.514037413441236
+20
+0.34645482469174976
+30
+-3.0235246370610946
+11
+-1.0481588029804083
+21
+0.2651650429449749
+31
+-3.3855945641550873
+12
+-0.6144054358449154
+22
+0.26516504294497373
+32
+-2.9518411970195952
+13
+-0.6144054358449154
+23
+0.26516504294497373
+33
+-2.9518411970195952
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.976475362938908
+20
+0.34645482469175104
+30
+-3.4859625865587667
+11
+-0.395645258706792
+21
+0.37500000000001504
+31
+-3.10808101988148
+12
+-0.8919189801185237
+22
+0.37500000000001643
+32
+-3.60435474129321
+13
+-0.8919189801185237
+23
+0.37500000000001643
+33
+-3.60435474129321
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.395645258706792
+20
+0.37500000000001504
+30
+-3.10808101988148
+11
+-0.976475362938908
+21
+0.34645482469175104
+31
+-3.4859625865587667
+12
+-0.514037413441236
+22
+0.34645482469174976
+32
+-3.0235246370610946
+13
+-0.514037413441236
+23
+0.34645482469174976
+33
+-3.0235246370610946
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.8919189801185237
+20
+0.37500000000001643
+30
+-3.60435474129321
+11
+-0.2772531039723507
+21
+0.3464548246917446
+31
+-3.1926374027018634
+12
+-0.8073625972981393
+22
+0.3464548246917461
+32
+-3.7227468960276524
+13
+-0.8073625972981393
+23
+0.3464548246917461
+33
+-3.7227468960276524
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.2772531039723507
+20
+0.3464548246917446
+30
+-3.1926374027018634
+11
+-0.8919189801185237
+21
+0.37500000000001643
+31
+-3.60435474129321
+12
+-0.395645258706792
+22
+0.37500000000001504
+32
+-3.10808101988148
+13
+-0.395645258706792
+23
+0.37500000000001504
+33
+-3.10808101988148
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.8073625972981393
+20
+0.3464548246917461
+30
+-3.7227468960276524
+11
+-0.1768850815686731
+21
+0.2651650429449643
+31
+-3.264320842743362
+12
+-0.7356791572566417
+22
+0.26516504294496585
+32
+-3.8231149184313296
+13
+-0.7356791572566417
+23
+0.26516504294496585
+33
+-3.8231149184313296
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.1768850815686731
+20
+0.2651650429449643
+30
+-3.264320842743362
+11
+-0.8073625972981393
+21
+0.3464548246917461
+31
+-3.7227468960276524
+12
+-0.2772531039723507
+22
+0.3464548246917446
+32
+-3.1926374027018634
+13
+-0.2772531039723507
+23
+0.3464548246917446
+33
+-3.1926374027018634
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.6877818139283445
+20
+0.14350628713691643
+30
+-3.8901786869316712
+11
+-0.1768850815686731
+21
+0.2651650429449643
+31
+-3.264320842743362
+12
+-0.10982131306833232
+22
+0.14350628713691482
+32
+-3.3122181860716595
+13
+-0.10982131306833232
+23
+0.14350628713691482
+33
+-3.3122181860716595
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.1768850815686731
+20
+0.2651650429449643
+30
+-3.264320842743362
+11
+-0.6877818139283445
+21
+0.14350628713691643
+31
+-3.8901786869316712
+12
+-0.7356791572566417
+22
+0.26516504294496585
+32
+-3.8231149184313296
+13
+-0.7356791572566417
+23
+0.26516504294496585
+33
+-3.8231149184313296
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.10982131306833232
+20
+0.14350628713691482
+30
+-3.3122181860716595
+11
+-0.6709625036444828
+21
+5.342009518651689e-15
+31
+-3.9137283507090763
+12
+-0.6877818139283445
+22
+0.14350628713691643
+32
+-3.8901786869316712
+13
+-0.6877818139283445
+23
+0.14350628713691643
+33
+-3.8901786869316712
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.6709625036444828
+20
+5.342009518651689e-15
+30
+-3.9137283507090763
+11
+-0.10982131306833232
+21
+0.14350628713691482
+31
+-3.3122181860716595
+12
+-0.08627164929092768
+22
+3.712700234448697e-15
+32
+-3.329037496355521
+13
+-0.08627164929092768
+23
+3.712700234448697e-15
+33
+-3.329037496355521
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.7050188681226714
+20
+1.7087256800626433e-14
+30
+-2.887124543407431
+11
+-1.0960561463087082
+21
+0.1435062871369282
+31
+-3.318530795654741
+12
+-1.1128754565925734
+22
+1.822379677088487e-14
+32
+-3.294981131877333
+13
+-1.1128754565925734
+23
+1.822379677088487e-14
+33
+-3.294981131877333
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.0960561463087082
+20
+0.1435062871369282
+30
+-3.318530795654741
+11
+-0.7050188681226714
+21
+1.7087256800626433e-14
+31
+-2.887124543407431
+12
+-0.6814692043452624
+22
+0.14350628713692704
+32
+-2.9039438536912954
+13
+-0.6814692043452624
+23
+0.14350628713692704
+33
+-2.9039438536912954
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.0960561463087082
+20
+0.1435062871369282
+30
+-3.318530795654741
+11
+-1.5991712855190992
+21
+0.2651650429449755
+31
+-3.655166838488527
+12
+-1.6227208305001835
+22
+0.14350628713692878
+32
+-3.5761913772707477
+13
+-1.6227208305001835
+23
+0.14350628713692878
+33
+-3.5761913772707477
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.5991712855190992
+20
+0.2651650429449755
+30
+-3.655166838488527
+11
+-1.0960561463087082
+21
+0.1435062871369282
+31
+-3.318530795654741
+12
+-1.0481588029804083
+22
+0.2651650429449749
+32
+-3.3855945641550873
+13
+-1.0481588029804083
+23
+0.2651650429449749
+33
+-3.3855945641550873
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.5991712855190992
+20
+0.2651650429449755
+30
+-3.655166838488527
+11
+-0.976475362938908
+21
+0.34645482469175104
+31
+-3.4859625865587667
+12
+-1.563926900792259
+22
+0.3464548246917517
+32
+-3.773361968856217
+13
+-1.563926900792259
+23
+0.3464548246917517
+33
+-3.773361968856217
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.976475362938908
+20
+0.34645482469175104
+30
+-3.4859625865587667
+11
+-1.5991712855190992
+21
+0.2651650429449755
+31
+-3.655166838488527
+12
+-1.0481588029804083
+22
+0.2651650429449749
+32
+-3.3855945641550873
+13
+-1.0481588029804083
+23
+0.2651650429449749
+33
+-3.3855945641550873
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.563926900792259
+20
+0.3464548246917517
+30
+-3.773361968856217
+11
+-0.8919189801185237
+21
+0.37500000000001643
+31
+-3.60435474129321
+12
+-1.5223533144031798
+22
+0.3750000000000171
+32
+-3.9127826312168645
+13
+-1.5223533144031798
+23
+0.3750000000000171
+33
+-3.9127826312168645
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.8919189801185237
+20
+0.37500000000001643
+30
+-3.60435474129321
+11
+-1.563926900792259
+21
+0.3464548246917517
+31
+-3.773361968856217
+12
+-0.976475362938908
+22
+0.34645482469175104
+32
+-3.4859625865587667
+13
+-0.976475362938908
+23
+0.34645482469175104
+33
+-3.4859625865587667
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.5223533144031798
+20
+0.3750000000000171
+30
+-3.9127826312168645
+11
+-0.8073625972981393
+21
+0.3464548246917461
+31
+-3.7227468960276524
+12
+-1.4807797280141024
+22
+0.3464548246917468
+32
+-4.052203293577511
+13
+-1.4807797280141024
+23
+0.3464548246917468
+33
+-4.052203293577511
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.8073625972981393
+20
+0.3464548246917461
+30
+-3.7227468960276524
+11
+-1.5223533144031798
+21
+0.3750000000000171
+31
+-3.9127826312168645
+12
+-0.8919189801185237
+22
+0.37500000000001643
+32
+-3.60435474129321
+13
+-0.8919189801185237
+23
+0.37500000000001643
+33
+-3.60435474129321
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.4807797280141024
+20
+0.3464548246917468
+30
+-4.052203293577511
+11
+-0.7356791572566417
+21
+0.26516504294496585
+31
+-3.8231149184313296
+12
+-1.445535343287263
+22
+0.2651650429449666
+32
+-4.1703984239451986
+13
+-1.445535343287263
+23
+0.2651650429449666
+33
+-4.1703984239451986
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.7356791572566417
+20
+0.26516504294496585
+30
+-3.8231149184313296
+11
+-1.4807797280141024
+21
+0.3464548246917468
+31
+-4.052203293577511
+12
+-0.8073625972981393
+22
+0.3464548246917461
+32
+-3.7227468960276524
+13
+-0.8073625972981393
+23
+0.3464548246917461
+33
+-3.7227468960276524
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.7356791572566417
+20
+0.26516504294496585
+30
+-3.8231149184313296
+11
+-1.4219857983061805
+21
+0.14350628713691724
+31
+-4.2493738851629725
+12
+-1.445535343287263
+22
+0.2651650429449666
+32
+-4.1703984239451986
+13
+-1.445535343287263
+23
+0.2651650429449666
+33
+-4.1703984239451986
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.4219857983061805
+20
+0.14350628713691724
+30
+-4.2493738851629725
+11
+-0.7356791572566417
+21
+0.26516504294496585
+31
+-3.8231149184313296
+12
+-0.6877818139283445
+22
+0.14350628713691643
+32
+-3.8901786869316712
+13
+-0.6877818139283445
+23
+0.14350628713691643
+33
+-3.8901786869316712
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-0.6877818139283445
+20
+0.14350628713691643
+30
+-3.8901786869316712
+11
+-1.413716297817066
+21
+6.15218598552793e-15
+31
+-4.277106379174766
+12
+-1.4219857983061805
+22
+0.14350628713691724
+32
+-4.2493738851629725
+13
+-1.4219857983061805
+23
+0.14350628713691724
+33
+-4.2493738851629725
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.413716297817066
+20
+6.15218598552793e-15
+30
+-4.277106379174766
+11
+-0.6877818139283445
+21
+0.14350628713691643
+31
+-3.8901786869316712
+12
+-0.6709625036444828
+22
+5.342009518651689e-15
+32
+-3.9137283507090763
+13
+-0.6709625036444828
+23
+5.342009518651689e-15
+33
+-3.9137283507090763
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.1128754565925734
+20
+1.822379677088487e-14
+30
+-3.294981131877333
+11
+-1.6227208305001835
+21
+0.14350628713692878
+31
+-3.5761913772707477
+12
+-1.6309903309892988
+22
+1.878894296289104e-14
+32
+-3.5484588832589496
+13
+-1.6309903309892988
+23
+1.878894296289104e-14
+33
+-3.5484588832589496
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.6227208305001835
+20
+0.14350628713692878
+30
+-3.5761913772707477
+11
+-1.1128754565925734
+21
+1.822379677088487e-14
+31
+-3.294981131877333
+12
+-1.0960561463087082
+22
+0.1435062871369282
+32
+-3.318530795654741
+13
+-1.0960561463087082
+23
+0.1435062871369282
+33
+-3.318530795654741
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.6227208305001835
+20
+0.14350628713692878
+30
+-3.5761913772707477
+11
+-2.2352901514230483
+21
+0.26516504294497545
+31
+-3.734834957055048
+12
+-2.240360749282801
+22
+0.1435062871369287
+32
+-3.653545175308267
+13
+-2.240360749282801
+23
+0.1435062871369287
+33
+-3.653545175308267
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.2352901514230483
+20
+0.26516504294497545
+30
+-3.734834957055048
+11
+-1.6227208305001835
+21
+0.14350628713692878
+31
+-3.5761913772707477
+12
+-1.5991712855190992
+22
+0.2651650429449755
+32
+-3.655166838488527
+13
+-1.5991712855190992
+23
+0.2651650429449755
+33
+-3.655166838488527
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.2352901514230483
+20
+0.26516504294497545
+30
+-3.734834957055048
+11
+-1.563926900792259
+21
+0.3464548246917517
+31
+-3.773361968856217
+12
+-2.227701465445983
+22
+0.34645482469175165
+32
+-3.8564937128630965
+13
+-2.227701465445983
+23
+0.34645482469175165
+33
+-3.8564937128630965
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.563926900792259
+20
+0.3464548246917517
+30
+-3.773361968856217
+11
+-2.2352901514230483
+21
+0.26516504294497545
+31
+-3.734834957055048
+12
+-1.5991712855190992
+22
+0.2651650429449755
+32
+-3.655166838488527
+13
+-1.5991712855190992
+23
+0.2651650429449755
+33
+-3.655166838488527
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.227701465445983
+20
+0.34645482469175165
+30
+-3.8564937128630965
+11
+-1.5223533144031798
+21
+0.3750000000000171
+31
+-3.9127826312168645
+12
+-2.2187500000000036
+22
+0.37500000000001704
+32
+-4.000000000000008
+13
+-2.2187500000000036
+23
+0.37500000000001704
+33
+-4.000000000000008
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.5223533144031798
+20
+0.3750000000000171
+30
+-3.9127826312168645
+11
+-2.227701465445983
+21
+0.34645482469175165
+31
+-3.8564937128630965
+12
+-1.563926900792259
+22
+0.3464548246917517
+32
+-3.773361968856217
+13
+-1.563926900792259
+23
+0.3464548246917517
+33
+-3.773361968856217
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.2187500000000036
+20
+0.37500000000001704
+30
+-4.000000000000008
+11
+-1.4807797280141024
+21
+0.3464548246917468
+31
+-4.052203293577511
+12
+-2.2097985345540234
+22
+0.34645482469174677
+32
+-4.143506287136919
+13
+-2.2097985345540234
+23
+0.34645482469174677
+33
+-4.143506287136919
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.4807797280141024
+20
+0.3464548246917468
+30
+-4.052203293577511
+11
+-2.2187500000000036
+21
+0.37500000000001704
+31
+-4.000000000000008
+12
+-1.5223533144031798
+22
+0.3750000000000171
+32
+-3.9127826312168645
+13
+-1.5223533144031798
+23
+0.3750000000000171
+33
+-3.9127826312168645
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.2097985345540234
+20
+0.34645482469174677
+30
+-4.143506287136919
+11
+-1.445535343287263
+21
+0.2651650429449666
+31
+-4.1703984239451986
+12
+-2.202209848576959
+22
+0.2651650429449665
+32
+-4.265165042944965
+13
+-2.202209848576959
+23
+0.2651650429449665
+33
+-4.265165042944965
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.445535343287263
+20
+0.2651650429449666
+30
+-4.1703984239451986
+11
+-2.2097985345540234
+21
+0.34645482469174677
+31
+-4.143506287136919
+12
+-1.4807797280141024
+22
+0.3464548246917468
+32
+-4.052203293577511
+13
+-1.4807797280141024
+23
+0.3464548246917468
+33
+-4.052203293577511
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.445535343287263
+20
+0.2651650429449666
+30
+-4.1703984239451986
+11
+-2.197139250717206
+21
+0.14350628713691715
+31
+-4.34645482469174
+12
+-2.202209848576959
+22
+0.2651650429449665
+32
+-4.265165042944965
+13
+-2.202209848576959
+23
+0.2651650429449665
+33
+-4.265165042944965
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.197139250717206
+20
+0.14350628713691715
+30
+-4.34645482469174
+11
+-1.445535343287263
+21
+0.2651650429449666
+31
+-4.1703984239451986
+12
+-1.4219857983061805
+22
+0.14350628713691724
+32
+-4.2493738851629725
+13
+-1.4219857983061805
+23
+0.14350628713691724
+33
+-4.2493738851629725
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.4219857983061805
+20
+0.14350628713691724
+30
+-4.2493738851629725
+11
+-2.195358693533829
+21
+6.060158656298807e-15
+31
+-4.375000000000006
+12
+-2.197139250717206
+22
+0.14350628713691715
+32
+-4.34645482469174
+13
+-2.197139250717206
+23
+0.14350628713691715
+33
+-4.34645482469174
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.195358693533829
+20
+6.060158656298807e-15
+30
+-4.375000000000006
+11
+-1.4219857983061805
+21
+0.14350628713691724
+31
+-4.2493738851629725
+12
+-1.413716297817066
+22
+6.15218598552793e-15
+32
+-4.277106379174766
+13
+-1.413716297817066
+23
+6.15218598552793e-15
+33
+-4.277106379174766
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-1.6309903309892988
+20
+1.878894296289104e-14
+30
+-3.5484588832589496
+11
+-2.240360749282801
+21
+0.1435062871369287
+31
+-3.653545175308267
+12
+-2.242141306466179
+22
+1.8716988585368647e-14
+32
+-3.6249999999999973
+13
+-2.242141306466179
+23
+1.8716988585368647e-14
+33
+-3.6249999999999973
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.240360749282801
+20
+0.1435062871369287
+30
+-3.653545175308267
+11
+-1.6309903309892988
+21
+1.878894296289104e-14
+31
+-3.5484588832589496
+12
+-1.6227208305001835
+22
+0.14350628713692878
+32
+-3.5761913772707477
+13
+-1.6227208305001835
+23
+0.14350628713692878
+33
+-3.5761913772707477
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.240360749282801
+20
+0.1435062871369287
+30
+-3.653545175308267
+11
+-7.983021822074795
+21
+0.26516504294497545
+31
+-3.734834957055048
+12
+-7.983021822074795
+22
+0.1435062871369287
+32
+-3.653545175308267
+13
+-7.983021822074795
+23
+0.1435062871369287
+33
+-3.653545175308267
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+0.26516504294497545
+30
+-3.734834957055048
+11
+-2.240360749282801
+21
+0.1435062871369287
+31
+-3.653545175308267
+12
+-2.2352901514230483
+22
+0.26516504294497545
+32
+-3.734834957055048
+13
+-2.2352901514230483
+23
+0.26516504294497545
+33
+-3.734834957055048
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+0.26516504294497545
+30
+-3.734834957055048
+11
+-2.227701465445983
+21
+0.34645482469175165
+31
+-3.8564937128630965
+12
+-7.983021822074795
+22
+0.34645482469175165
+32
+-3.8564937128630965
+13
+-7.983021822074795
+23
+0.34645482469175165
+33
+-3.8564937128630965
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.227701465445983
+20
+0.34645482469175165
+30
+-3.8564937128630965
+11
+-7.983021822074795
+21
+0.26516504294497545
+31
+-3.734834957055048
+12
+-2.2352901514230483
+22
+0.26516504294497545
+32
+-3.734834957055048
+13
+-2.2352901514230483
+23
+0.26516504294497545
+33
+-3.734834957055048
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+0.34645482469175165
+30
+-3.8564937128630965
+11
+-2.2187500000000036
+21
+0.37500000000001704
+31
+-4.000000000000008
+12
+-7.983021822074795
+22
+0.37500000000001704
+32
+-4.000000000000008
+13
+-7.983021822074795
+23
+0.37500000000001704
+33
+-4.000000000000008
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.2187500000000036
+20
+0.37500000000001704
+30
+-4.000000000000008
+11
+-7.983021822074795
+21
+0.34645482469175165
+31
+-3.8564937128630965
+12
+-2.227701465445983
+22
+0.34645482469175165
+32
+-3.8564937128630965
+13
+-2.227701465445983
+23
+0.34645482469175165
+33
+-3.8564937128630965
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+0.37500000000001704
+30
+-4.000000000000008
+11
+-2.2097985345540234
+21
+0.34645482469174677
+31
+-4.143506287136919
+12
+-7.983021822074795
+22
+0.34645482469174677
+32
+-4.143506287136919
+13
+-7.983021822074795
+23
+0.34645482469174677
+33
+-4.143506287136919
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.2097985345540234
+20
+0.34645482469174677
+30
+-4.143506287136919
+11
+-7.983021822074795
+21
+0.37500000000001704
+31
+-4.000000000000008
+12
+-2.2187500000000036
+22
+0.37500000000001704
+32
+-4.000000000000008
+13
+-2.2187500000000036
+23
+0.37500000000001704
+33
+-4.000000000000008
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+0.34645482469174677
+30
+-4.143506287136919
+11
+-2.202209848576959
+21
+0.2651650429449665
+31
+-4.265165042944965
+12
+-7.983021822074795
+22
+0.2651650429449665
+32
+-4.265165042944965
+13
+-7.983021822074795
+23
+0.2651650429449665
+33
+-4.265165042944965
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.202209848576959
+20
+0.2651650429449665
+30
+-4.265165042944965
+11
+-7.983021822074795
+21
+0.34645482469174677
+31
+-4.143506287136919
+12
+-2.2097985345540234
+22
+0.34645482469174677
+32
+-4.143506287136919
+13
+-2.2097985345540234
+23
+0.34645482469174677
+33
+-4.143506287136919
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.202209848576959
+20
+0.2651650429449665
+30
+-4.265165042944965
+11
+-7.983021822074795
+21
+0.14350628713691715
+31
+-4.34645482469174
+12
+-7.983021822074795
+22
+0.2651650429449665
+32
+-4.265165042944965
+13
+-7.983021822074795
+23
+0.2651650429449665
+33
+-4.265165042944965
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+0.14350628713691715
+30
+-4.34645482469174
+11
+-2.202209848576959
+21
+0.2651650429449665
+31
+-4.265165042944965
+12
+-2.197139250717206
+22
+0.14350628713691715
+32
+-4.34645482469174
+13
+-2.197139250717206
+23
+0.14350628713691715
+33
+-4.34645482469174
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.197139250717206
+20
+0.14350628713691715
+30
+-4.34645482469174
+11
+-7.983021822074795
+21
+6.060158656298807e-15
+31
+-4.375000000000006
+12
+-7.983021822074795
+22
+0.14350628713691715
+32
+-4.34645482469174
+13
+-7.983021822074795
+23
+0.14350628713691715
+33
+-4.34645482469174
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+6.060158656298807e-15
+30
+-4.375000000000006
+11
+-2.197139250717206
+21
+0.14350628713691715
+31
+-4.34645482469174
+12
+-2.195358693533829
+22
+6.060158656298807e-15
+32
+-4.375000000000006
+13
+-2.195358693533829
+23
+6.060158656298807e-15
+33
+-4.375000000000006
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-2.242141306466179
+20
+1.8716988585368647e-14
+30
+-3.6249999999999973
+11
+-7.983021822074795
+21
+0.1435062871369287
+31
+-3.653545175308267
+12
+-7.983021822074795
+22
+1.8716988585368647e-14
+32
+-3.6249999999999973
+13
+-7.983021822074795
+23
+1.8716988585368647e-14
+33
+-3.6249999999999973
+70
+1
+ 0
+3DFACE
+ 8
+pipe
+10
+-7.983021822074795
+20
+0.1435062871369287
+30
+-3.653545175308267
+11
+-2.242141306466179
+21
+1.8716988585368647e-14
+31
+-3.6249999999999973
+12
+-2.240360749282801
+22
+0.1435062871369287
+32
+-3.653545175308267
+13
+-2.240360749282801
+23
+0.1435062871369287
+33
+-3.653545175308267
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2922750396074334
+30
+5.079185156719955
+11
+-5.499999999999995
+21
+2.2471825367939746
+31
+5.101599911452267
+12
+-5.499999999999995
+22
+2.2922750396074334
+32
+5.079185156719955
+13
+-5.499999999999995
+23
+2.2922750396074334
+33
+5.079185156719955
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.2471825367939746
+30
+5.101599911452267
+11
+9.500000000000005
+21
+2.2922750396074334
+31
+5.079185156719955
+12
+9.500000000000005
+22
+2.2471825367939746
+32
+5.101599911452267
+13
+9.500000000000005
+23
+2.2471825367939746
+33
+5.101599911452267
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.3324893860329072
+30
+5.0488773791494435
+11
+-5.499999999999995
+21
+2.2922750396074334
+31
+5.079185156719955
+12
+-5.499999999999995
+22
+2.3324893860329072
+32
+5.0488773791494435
+13
+-5.499999999999995
+23
+2.3324893860329072
+33
+5.0488773791494435
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.2922750396074334
+30
+5.079185156719955
+11
+9.500000000000005
+21
+2.3324893860329072
+31
+5.0488773791494435
+12
+9.500000000000005
+22
+2.2922750396074334
+32
+5.079185156719955
+13
+9.500000000000005
+23
+2.2922750396074334
+33
+5.079185156719955
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2471825367939746
+30
+5.101599911452267
+11
+-5.499999999999995
+21
+2.198742898510912
+31
+5.115360597579695
+12
+-5.499999999999995
+22
+2.2471825367939746
+32
+5.101599911452267
+13
+-5.499999999999995
+23
+2.2471825367939746
+33
+5.101599911452267
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.198742898510912
+30
+5.115360597579695
+11
+9.500000000000005
+21
+2.2471825367939746
+31
+5.101599911452267
+12
+9.500000000000005
+22
+2.198742898510912
+32
+5.115360597579695
+13
+9.500000000000005
+23
+2.198742898510912
+33
+5.115360597579695
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.198742898510912
+30
+5.115360597579695
+11
+-5.499999999999995
+21
+2.14860079060873
+31
+5.119999999999996
+12
+-5.499999999999995
+22
+2.198742898510912
+32
+5.115360597579695
+13
+-5.499999999999995
+23
+2.198742898510912
+33
+5.115360597579695
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.14860079060873
+30
+5.119999999999996
+11
+9.500000000000005
+21
+2.198742898510912
+31
+5.115360597579695
+12
+9.500000000000005
+22
+2.14860079060873
+32
+5.119999999999996
+13
+9.500000000000005
+23
+2.14860079060873
+33
+5.119999999999996
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.36646018267338
+30
+5.011705615466466
+11
+-5.499999999999995
+21
+2.3930340227089686
+31
+4.968931954582056
+12
+9.500000000000005
+22
+2.3930340227089686
+32
+4.968931954582056
+13
+9.500000000000005
+23
+2.3930340227089686
+33
+4.968931954582056
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3930340227089686
+30
+4.968931954582056
+11
+9.500000000000005
+21
+2.36646018267338
+31
+5.011705615466466
+12
+-5.499999999999995
+22
+2.36646018267338
+32
+5.011705615466466
+13
+-5.499999999999995
+23
+2.36646018267338
+33
+5.011705615466466
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.14860079060873
+30
+5.119999999999996
+11
+-5.499999999999995
+21
+0.0
+31
+5.119999999999996
+12
+-5.499999999999995
+22
+2.14860079060873
+32
+5.119999999999996
+13
+-5.499999999999995
+23
+2.14860079060873
+33
+5.119999999999996
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+0.0
+30
+5.119999999999996
+11
+9.500000000000005
+21
+2.14860079060873
+31
+5.119999999999996
+12
+9.500000000000005
+22
+0.0
+32
+5.119999999999996
+13
+9.500000000000005
+23
+0.0
+33
+5.119999999999996
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.3324893860329072
+30
+5.0488773791494435
+11
+-5.499999999999995
+21
+2.36646018267338
+31
+5.011705615466466
+12
+9.500000000000005
+22
+2.36646018267338
+32
+5.011705615466466
+13
+9.500000000000005
+23
+2.36646018267338
+33
+5.011705615466466
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.36646018267338
+30
+5.011705615466466
+11
+9.500000000000005
+21
+2.3324893860329072
+31
+5.0488773791494435
+12
+-5.499999999999995
+22
+2.3324893860329072
+32
+5.0488773791494435
+13
+-5.499999999999995
+23
+2.3324893860329072
+33
+5.0488773791494435
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2429376307709816
+30
+5.153304187744393
+11
+-5.499999999999995
+21
+2.2923509057835325
+31
+5.139266911825803
+12
+-5.499999999999995
+22
+2.2429376307709816
+32
+5.153304187744393
+13
+-5.499999999999995
+23
+2.2429376307709816
+33
+5.153304187744393
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.2923509057835325
+30
+5.139266911825803
+11
+9.500000000000005
+21
+2.2429376307709816
+31
+5.153304187744393
+12
+9.500000000000005
+22
+2.2923509057835325
+32
+5.139266911825803
+13
+9.500000000000005
+23
+2.2923509057835325
+33
+5.139266911825803
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2923509057835325
+30
+5.139266911825803
+11
+-5.499999999999995
+21
+2.3383497679035443
+31
+5.116401620523369
+12
+-5.499999999999995
+22
+2.2923509057835325
+32
+5.139266911825803
+13
+-5.499999999999995
+23
+2.2923509057835325
+33
+5.139266911825803
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3383497679035443
+30
+5.116401620523369
+11
+9.500000000000005
+21
+2.2923509057835325
+31
+5.139266911825803
+12
+9.500000000000005
+22
+2.3383497679035443
+32
+5.116401620523369
+13
+9.500000000000005
+23
+2.3383497679035443
+33
+5.116401620523369
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3793724226921675
+30
+5.085484656623693
+11
+9.500000000000005
+21
+2.4140260323451184
+31
+5.047565740490686
+12
+-5.499999999999995
+22
+2.4140260323451184
+32
+5.047565740490686
+13
+-5.499999999999995
+23
+2.4140260323451184
+33
+5.047565740490686
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.4140260323451184
+30
+5.047565740490686
+11
+-5.499999999999995
+21
+2.3793724226921675
+31
+5.085484656623693
+12
+9.500000000000005
+22
+2.3793724226921675
+32
+5.085484656623693
+13
+9.500000000000005
+23
+2.3793724226921675
+33
+5.085484656623693
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.4140260323451184
+30
+5.047565740490686
+11
+9.500000000000005
+21
+2.4411340065654183
+31
+5.003932329022501
+12
+-5.499999999999995
+22
+2.4411340065654183
+32
+5.003932329022501
+13
+-5.499999999999995
+23
+2.4411340065654183
+33
+5.003932329022501
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.4411340065654183
+30
+5.003932329022501
+11
+-5.499999999999995
+21
+2.4140260323451184
+31
+5.047565740490686
+12
+9.500000000000005
+22
+2.4140260323451184
+32
+5.047565740490686
+13
+9.500000000000005
+23
+2.4140260323451184
+33
+5.047565740490686
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+0.0
+30
+5.15803684215334
+11
+-5.499999999999995
+21
+2.1917876664999696
+31
+5.15803684215334
+12
+-5.499999999999995
+22
+0.0
+32
+5.15803684215334
+13
+-5.499999999999995
+23
+0.0
+33
+5.15803684215334
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.1917876664999696
+30
+5.15803684215334
+11
+9.500000000000005
+21
+0.0
+31
+5.15803684215334
+12
+9.500000000000005
+22
+2.1917876664999696
+32
+5.15803684215334
+13
+9.500000000000005
+23
+2.1917876664999696
+33
+5.15803684215334
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.1917876664999696
+30
+5.15803684215334
+11
+-5.499999999999995
+21
+2.2429376307709816
+31
+5.153304187744393
+12
+-5.499999999999995
+22
+2.1917876664999696
+32
+5.15803684215334
+13
+-5.499999999999995
+23
+2.1917876664999696
+33
+5.15803684215334
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.2429376307709816
+30
+5.153304187744393
+11
+9.500000000000005
+21
+2.1917876664999696
+31
+5.15803684215334
+12
+9.500000000000005
+22
+2.2429376307709816
+32
+5.153304187744393
+13
+9.500000000000005
+23
+2.2429376307709816
+33
+5.153304187744393
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.3383497679035443
+30
+5.116401620523369
+11
+-5.499999999999995
+21
+2.3793724226921675
+31
+5.085484656623693
+12
+-5.499999999999995
+22
+2.3383497679035443
+32
+5.116401620523369
+13
+-5.499999999999995
+23
+2.3383497679035443
+33
+5.116401620523369
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3793724226921675
+30
+5.085484656623693
+11
+9.500000000000005
+21
+2.3383497679035443
+31
+5.116401620523369
+12
+9.500000000000005
+22
+2.3793724226921675
+32
+5.085484656623693
+13
+9.500000000000005
+23
+2.3793724226921675
+33
+5.085484656623693
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-4.999999999999995
+20
+3.152109
+30
+3.227619793365834
+11
+-5.06663474057502
+21
+3.089999999999999
+31
+3.227619793365834
+12
+-5.06663474057502
+22
+3.1521089999999985
+32
+3.227619793365834
+13
+-5.06663474057502
+23
+3.1521089999999985
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.06663474057502
+20
+3.089999999999999
+30
+3.227619793365834
+11
+-4.999999999999995
+21
+3.152109
+31
+3.227619793365834
+12
+-4.999999999999995
+22
+3.09
+32
+3.227619793365834
+13
+-4.999999999999995
+23
+3.09
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.1917876664999696
+30
+5.15803684215334
+11
+-5.499999999999995
+21
+0.0
+31
+5.119999999999996
+12
+-5.499999999999995
+22
+0.0
+32
+5.15803684215334
+13
+-5.499999999999995
+23
+0.0
+33
+5.15803684215334
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+0.0
+30
+5.119999999999996
+11
+-5.499999999999995
+21
+2.1917876664999696
+31
+5.15803684215334
+12
+-5.499999999999995
+22
+2.14860079060873
+32
+5.119999999999996
+13
+-5.499999999999995
+23
+2.14860079060873
+33
+5.119999999999996
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.14860079060873
+30
+5.119999999999996
+11
+-5.499999999999995
+21
+2.1917876664999696
+31
+5.15803684215334
+12
+-5.499999999999995
+22
+2.198742898510912
+32
+5.115360597579695
+13
+-5.499999999999995
+23
+2.198742898510912
+33
+5.115360597579695
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.198742898510912
+30
+5.115360597579695
+11
+-5.499999999999995
+21
+2.1917876664999696
+31
+5.15803684215334
+12
+-5.499999999999995
+22
+2.2429376307709816
+32
+5.153304187744393
+13
+-5.499999999999995
+23
+2.2429376307709816
+33
+5.153304187744393
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.198742898510912
+30
+5.115360597579695
+11
+-5.499999999999995
+21
+2.2429376307709816
+31
+5.153304187744393
+12
+-5.499999999999995
+22
+2.2471825367939746
+32
+5.101599911452267
+13
+-5.499999999999995
+23
+2.2471825367939746
+33
+5.101599911452267
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.2471825367939746
+30
+5.101599911452267
+11
+-5.499999999999995
+21
+2.2429376307709816
+31
+5.153304187744393
+12
+-5.499999999999995
+22
+2.2923509057835325
+32
+5.139266911825803
+13
+-5.499999999999995
+23
+2.2923509057835325
+33
+5.139266911825803
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.2471825367939746
+30
+5.101599911452267
+11
+-5.499999999999995
+21
+2.2923509057835325
+31
+5.139266911825803
+12
+-5.499999999999995
+22
+2.2922750396074334
+32
+5.079185156719955
+13
+-5.499999999999995
+23
+2.2922750396074334
+33
+5.079185156719955
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.2922750396074334
+30
+5.079185156719955
+11
+-5.499999999999995
+21
+2.2923509057835325
+31
+5.139266911825803
+12
+-5.499999999999995
+22
+2.3324893860329072
+32
+5.0488773791494435
+13
+-5.499999999999995
+23
+2.3324893860329072
+33
+5.0488773791494435
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3324893860329072
+30
+5.0488773791494435
+11
+-5.499999999999995
+21
+2.2923509057835325
+31
+5.139266911825803
+12
+-5.499999999999995
+22
+2.3383497679035443
+32
+5.116401620523369
+13
+-5.499999999999995
+23
+2.3383497679035443
+33
+5.116401620523369
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3324893860329072
+30
+5.0488773791494435
+11
+-5.499999999999995
+21
+2.3383497679035443
+31
+5.116401620523369
+12
+-5.499999999999995
+22
+2.36646018267338
+32
+5.011705615466466
+13
+-5.499999999999995
+23
+2.36646018267338
+33
+5.011705615466466
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.36646018267338
+30
+5.011705615466466
+11
+-5.499999999999995
+21
+2.3383497679035443
+31
+5.116401620523369
+12
+-5.499999999999995
+22
+2.3793724226921675
+32
+5.085484656623693
+13
+-5.499999999999995
+23
+2.3793724226921675
+33
+5.085484656623693
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.36646018267338
+30
+5.011705615466466
+11
+-5.499999999999995
+21
+2.3793724226921675
+31
+5.085484656623693
+12
+-5.499999999999995
+22
+2.3930340227089686
+32
+4.968931954582056
+13
+-5.499999999999995
+23
+2.3930340227089686
+33
+4.968931954582056
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3930340227089686
+30
+4.968931954582056
+11
+-5.499999999999995
+21
+2.3793724226921675
+31
+5.085484656623693
+12
+-5.499999999999995
+22
+2.4140260323451184
+32
+5.047565740490686
+13
+-5.499999999999995
+23
+2.4140260323451184
+33
+5.047565740490686
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3930340227089686
+30
+4.968931954582056
+11
+-5.499999999999995
+21
+2.4140260323451184
+31
+5.047565740490686
+12
+-5.499999999999995
+22
+3.0123234243928083
+32
+3.7303531512143784
+13
+-5.499999999999995
+23
+3.0123234243928083
+33
+3.7303531512143784
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.0123234243928083
+30
+3.7303531512143784
+11
+-5.499999999999995
+21
+2.4140260323451184
+31
+5.047565740490686
+12
+-5.499999999999995
+22
+2.4411340065654183
+32
+5.003932329022501
+13
+-5.499999999999995
+23
+2.4411340065654183
+33
+5.003932329022501
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.0123234243928083
+30
+3.7303531512143784
+11
+-5.499999999999995
+21
+2.4411340065654183
+31
+5.003932329022501
+12
+-5.499999999999995
+22
+3.072871125223104
+32
+3.7404580917071333
+13
+-5.499999999999995
+23
+3.072871125223104
+33
+3.7404580917071333
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.0123234243928083
+30
+3.7303531512143784
+11
+-5.499999999999995
+21
+3.072871125223104
+31
+3.7404580917071333
+12
+-5.499999999999995
+22
+3.0139421213514037
+32
+3.7267766757513905
+13
+-5.499999999999995
+23
+3.0139421213514037
+33
+3.7267766757513905
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.0139421213514037
+30
+3.7267766757513905
+11
+-5.499999999999995
+21
+3.072871125223104
+31
+3.7404580917071333
+12
+-5.499999999999995
+22
+3.0790632735059664
+32
+3.72677667575139
+13
+-5.499999999999995
+23
+3.0790632735059664
+33
+3.72677667575139
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.06663474057502
+20
+3.1521089999999985
+30
+3.227619793365834
+11
+-5.136049439910264
+21
+3.09
+31
+3.2284980853079333
+12
+-5.136049439910264
+22
+3.152109
+32
+3.2284980853079333
+13
+-5.136049439910264
+23
+3.152109
+33
+3.2284980853079333
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.136049439910264
+20
+3.09
+30
+3.2284980853079333
+11
+-5.06663474057502
+21
+3.1521089999999985
+31
+3.227619793365834
+12
+-5.06663474057502
+22
+3.089999999999999
+32
+3.227619793365834
+13
+-5.06663474057502
+23
+3.089999999999999
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.136049439910264
+20
+3.152109
+30
+3.2284980853079333
+11
+-5.265127602337854
+21
+3.0900000000000003
+31
+3.2715241394504626
+12
+-5.265127602337854
+22
+3.152109
+32
+3.2715241394504626
+13
+-5.265127602337854
+23
+3.152109
+33
+3.2715241394504626
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.265127602337854
+20
+3.0900000000000003
+30
+3.2715241394504626
+11
+-5.136049439910264
+21
+3.152109
+31
+3.2284980853079333
+12
+-5.136049439910264
+22
+3.09
+32
+3.2284980853079333
+13
+-5.136049439910264
+23
+3.09
+33
+3.2284980853079333
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.265127602337854
+20
+3.152109
+30
+3.2715241394504626
+11
+-5.374999999999995
+21
+3.0900000000000003
+31
+3.3517766757513896
+12
+-5.374999999999995
+22
+3.152109
+32
+3.3517766757513896
+13
+-5.374999999999995
+23
+3.152109
+33
+3.3517766757513896
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.374999999999995
+20
+3.0900000000000003
+30
+3.3517766757513896
+11
+-5.265127602337854
+21
+3.152109
+31
+3.2715241394504626
+12
+-5.265127602337854
+22
+3.0900000000000003
+32
+3.2715241394504626
+13
+-5.265127602337854
+23
+3.0900000000000003
+33
+3.2715241394504626
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.1499114528701706
+30
+3.4616490734135317
+11
+-5.452666904421266
+21
+3.0878043383057854
+31
+3.4581091282954834
+12
+-5.455252536300922
+22
+3.087392168967912
+32
+3.461649073413532
+13
+-5.455252536300922
+23
+3.087392168967912
+33
+3.461649073413532
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.452666904421266
+20
+3.0878043383057854
+30
+3.4581091282954834
+11
+-5.455252536300922
+21
+3.1499114528701706
+31
+3.4616490734135317
+12
+-5.4111798476732265
+22
+3.089999999999999
+32
+3.401309896682915
+13
+-5.4111798476732265
+23
+3.089999999999999
+33
+3.401309896682915
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4111798476732265
+20
+3.089999999999999
+30
+3.401309896682915
+11
+-5.455252536300922
+21
+3.1499114528701706
+31
+3.4616490734135317
+12
+-5.374999999999995
+22
+3.0900000000000003
+32
+3.3517766757513896
+13
+-5.374999999999995
+23
+3.0900000000000003
+33
+3.3517766757513896
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.374999999999995
+20
+3.0900000000000003
+30
+3.3517766757513896
+11
+-5.455252536300922
+21
+3.1499114528701706
+31
+3.4616490734135317
+12
+-5.374999999999995
+22
+3.152109
+32
+3.3517766757513896
+13
+-5.374999999999995
+23
+3.152109
+33
+3.3517766757513896
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.374999999999995
+20
+3.152109
+30
+3.3517766757513896
+11
+-5.455252536300922
+21
+3.1499114528701706
+31
+3.4616490734135317
+12
+-5.41372985422196
+22
+3.152109
+32
+3.4048010677595886
+13
+-5.41372985422196
+23
+3.152109
+33
+3.4048010677595886
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4982785904434515
+20
+3.128292290009669
+30
+3.590727235841121
+11
+-5.491487383235348
+21
+3.0703175939727343
+31
+3.5703536142168106
+12
+-5.4982785904434515
+22
+3.0646689131920426
+32
+3.590727235841121
+13
+-5.4982785904434515
+23
+3.0646689131920426
+33
+3.590727235841121
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.491487383235348
+20
+3.0703175939727343
+30
+3.5703536142168106
+11
+-5.4982785904434515
+21
+3.128292290009669
+31
+3.590727235841121
+12
+-5.47289263174993
+22
+3.081230457795461
+32
+3.5145693597605545
+13
+-5.47289263174993
+23
+3.081230457795461
+33
+3.5145693597605545
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.47289263174993
+20
+3.081230457795461
+30
+3.5145693597605545
+11
+-5.4982785904434515
+21
+3.128292290009669
+31
+3.590727235841121
+12
+-5.455252536300922
+22
+3.087392168967912
+32
+3.461649073413532
+13
+-5.455252536300922
+23
+3.087392168967912
+33
+3.461649073413532
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.087392168967912
+30
+3.461649073413532
+11
+-5.4982785904434515
+21
+3.128292290009669
+31
+3.590727235841121
+12
+-5.455252536300922
+22
+3.1499114528701706
+32
+3.4616490734135317
+13
+-5.455252536300922
+23
+3.1499114528701706
+33
+3.4616490734135317
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.1499114528701706
+30
+3.4616490734135317
+11
+-5.4982785904434515
+21
+3.128292290009669
+31
+3.590727235841121
+12
+-5.493783699835049
+22
+3.132030977611587
+32
+3.5772425640159144
+13
+-5.493783699835049
+23
+3.132030977611587
+33
+3.5772425640159144
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.1499114528701706
+30
+3.4616490734135317
+11
+-5.493783699835049
+21
+3.132030977611587
+31
+3.5772425640159144
+12
+-5.4748151938447736
+22
+3.143163189997152
+32
+3.5203370460450882
+13
+-5.4748151938447736
+23
+3.143163189997152
+33
+3.5203370460450882
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.1499114528701706
+30
+3.4616490734135317
+11
+-5.4748151938447736
+21
+3.143163189997152
+31
+3.5203370460450882
+12
+-5.455616833138935
+22
+3.149869205505734
+32
+3.4627419639275696
+13
+-5.455616833138935
+23
+3.149869205505734
+33
+3.4627419639275696
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-4.999999999999995
+20
+3.0357609534623577
+30
+3.6785684442714244
+11
+-5.499356934626736
+21
+3.034536500225599
+31
+3.675952812525448
+12
+-5.498713869253477
+22
+3.055130879099794
+32
+3.6251289492995054
+13
+-5.498713869253477
+23
+3.055130879099794
+33
+3.6251289492995054
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499356934626736
+20
+3.034536500225599
+30
+3.675952812525448
+11
+-4.999999999999995
+21
+3.0357609534623577
+31
+3.6785684442714244
+12
+-5.499999999999995
+22
+3.0139421213514037
+32
+3.7267766757513905
+13
+-5.499999999999995
+23
+3.0139421213514037
+33
+3.7267766757513905
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.096779748626952
+30
+3.6876325121546265
+11
+-5.498713869253477
+21
+3.055130879099794
+31
+3.6251289492995054
+12
+-5.499356934626736
+22
+3.034536500225599
+32
+3.675952812525448
+13
+-5.499356934626736
+23
+3.034536500225599
+33
+3.675952812525448
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.498713869253477
+20
+3.055130879099794
+30
+3.6251289492995054
+11
+-5.499999999999995
+21
+3.096779748626952
+31
+3.6876325121546265
+12
+-5.4982785904434515
+22
+3.0646689131920426
+32
+3.590727235841121
+13
+-5.4982785904434515
+23
+3.0646689131920426
+33
+3.590727235841121
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4982785904434515
+20
+3.0646689131920426
+30
+3.590727235841121
+11
+-5.499999999999995
+21
+3.096779748626952
+31
+3.6876325121546265
+12
+-5.4982785904434515
+22
+3.128292290009669
+32
+3.590727235841121
+13
+-5.4982785904434515
+23
+3.128292290009669
+33
+3.590727235841121
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4982785904434515
+20
+3.128292290009669
+30
+3.590727235841121
+11
+-5.499999999999995
+21
+3.096779748626952
+31
+3.6876325121546265
+12
+-5.498814964478946
+22
+3.116539009769701
+32
+3.6331188833337724
+13
+-5.498814964478946
+23
+3.116539009769701
+33
+3.6331188833337724
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.0790632735059664
+30
+3.72677667575139
+11
+-5.499356934626736
+21
+3.034536500225599
+31
+3.675952812525448
+12
+-5.499999999999995
+22
+3.0139421213514037
+32
+3.7267766757513905
+13
+-5.499999999999995
+23
+3.0139421213514037
+33
+3.7267766757513905
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499356934626736
+20
+3.034536500225599
+30
+3.675952812525448
+11
+-5.499999999999995
+21
+3.0790632735059664
+31
+3.72677667575139
+12
+-5.499999999999995
+22
+3.096779748626952
+32
+3.6876325121546265
+13
+-5.499999999999995
+23
+3.096779748626952
+33
+3.6876325121546265
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4982785904434515
+20
+3.128292290009669
+30
+3.590727235841121
+11
+8.7276000111177
+21
+3.132030977611586
+31
+3.577242564015919
+12
+-5.493783699835049
+22
+3.132030977611587
+32
+3.5772425640159144
+13
+-5.493783699835049
+23
+3.132030977611587
+33
+3.5772425640159144
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.7276000111177
+20
+3.132030977611586
+30
+3.577242564015919
+11
+-5.4982785904434515
+21
+3.128292290009669
+31
+3.590727235841121
+12
+8.783476330435551
+22
+3.1165390097697028
+32
+3.6331188833337706
+13
+8.783476330435551
+23
+3.1165390097697028
+33
+3.6331188833337706
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.783476330435551
+20
+3.1165390097697028
+30
+3.6331188833337706
+11
+-5.4982785904434515
+21
+3.128292290009669
+31
+3.590727235841121
+12
+-5.498814964478946
+22
+3.116539009769701
+32
+3.6331188833337724
+13
+-5.498814964478946
+23
+3.116539009769701
+33
+3.6331188833337724
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.377977240467615
+20
+3.1521089999999994
+30
+3.227619793365838
+11
+-4.999999999999995
+21
+3.09
+31
+3.227619793365834
+12
+-4.999999999999995
+22
+3.152109
+32
+3.227619793365834
+13
+-4.999999999999995
+23
+3.152109
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-4.999999999999995
+20
+3.09
+30
+3.227619793365834
+11
+8.377977240467615
+21
+3.1521089999999994
+31
+3.227619793365838
+12
+8.377977240467612
+22
+3.09
+32
+3.227619793365834
+13
+8.377977240467612
+23
+3.09
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.608466575397262
+20
+3.087804338305786
+30
+3.4581091282954852
+11
+-5.4111798476732265
+21
+3.089999999999999
+31
+3.401309896682915
+12
+8.55166734378469
+22
+3.09
+32
+3.401309896682911
+13
+8.55166734378469
+23
+3.09
+33
+3.401309896682911
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4111798476732265
+20
+3.089999999999999
+30
+3.401309896682915
+11
+8.608466575397262
+21
+3.087804338305786
+31
+3.4581091282954852
+12
+-5.452666904421266
+22
+3.0878043383057854
+32
+3.4581091282954834
+13
+-5.452666904421266
+23
+3.0878043383057854
+33
+3.4581091282954834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.4411340065654183
+30
+5.003932329022501
+11
+8.890815538808916
+21
+3.072871125223103
+31
+3.740458091707135
+12
+-5.499999999999995
+22
+3.072871125223104
+32
+3.7404580917071333
+13
+-5.499999999999995
+23
+3.072871125223104
+33
+3.7404580917071333
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.890815538808916
+20
+3.072871125223103
+30
+3.740458091707135
+11
+-5.499999999999995
+21
+2.4411340065654183
+31
+5.003932329022501
+12
+9.500000000000005
+22
+2.768278894627561
+32
+4.349642552898219
+13
+9.500000000000005
+23
+2.768278894627561
+33
+4.349642552898219
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.768278894627561
+30
+4.349642552898219
+11
+-5.499999999999995
+21
+2.4411340065654183
+31
+5.003932329022501
+12
+9.500000000000005
+22
+2.4411340065654183
+32
+5.003932329022501
+13
+9.500000000000005
+23
+2.4411340065654183
+33
+5.003932329022501
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.493783699835049
+20
+3.132030977611587
+30
+3.5772425640159144
+11
+8.670694493146872
+21
+3.1431631899971517
+31
+3.5203370460450913
+12
+-5.4748151938447736
+22
+3.143163189997152
+32
+3.5203370460450882
+13
+-5.4748151938447736
+23
+3.143163189997152
+33
+3.5203370460450882
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.670694493146872
+20
+3.1431631899971517
+30
+3.5203370460450913
+11
+-5.493783699835049
+21
+3.132030977611587
+31
+3.5772425640159144
+12
+8.7276000111177
+22
+3.132030977611586
+32
+3.577242564015919
+13
+8.7276000111177
+23
+3.132030977611586
+33
+3.577242564015919
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.775486396401288
+20
+3.055130879099793
+30
+3.6251289492995054
+11
+-5.491487383235348
+21
+3.0703175939727343
+31
+3.5703536142168106
+12
+8.720711061318589
+22
+3.070317593972734
+32
+3.57035361421681
+13
+8.720711061318589
+23
+3.070317593972734
+33
+3.57035361421681
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.491487383235348
+20
+3.0703175939727343
+30
+3.5703536142168106
+11
+8.775486396401288
+21
+3.055130879099793
+31
+3.6251289492995054
+12
+-5.4982785904434515
+22
+3.0646689131920426
+32
+3.590727235841121
+13
+-5.4982785904434515
+23
+3.0646689131920426
+33
+3.590727235841121
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4982785904434515
+20
+3.0646689131920426
+30
+3.590727235841121
+11
+8.775486396401288
+21
+3.055130879099793
+31
+3.6251289492995054
+12
+-5.498713869253477
+22
+3.055130879099794
+32
+3.6251289492995054
+13
+-5.498713869253477
+23
+3.055130879099794
+33
+3.6251289492995054
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.880710598316162
+20
+3.0123234243928074
+30
+3.7303531512143793
+11
+-5.499999999999995
+21
+2.3930340227089686
+31
+4.968931954582056
+12
+-5.499999999999995
+22
+3.0123234243928083
+32
+3.7303531512143784
+13
+-5.499999999999995
+23
+3.0123234243928083
+33
+3.7303531512143784
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3930340227089686
+30
+4.968931954582056
+11
+8.880710598316162
+21
+3.0123234243928074
+31
+3.7303531512143793
+12
+9.500000000000002
+22
+2.70267872355089
+32
+4.349642552898214
+13
+9.500000000000002
+23
+2.70267872355089
+33
+4.349642552898214
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+2.3930340227089686
+30
+4.968931954582056
+11
+9.500000000000002
+21
+2.70267872355089
+31
+4.349642552898214
+12
+9.500000000000005
+22
+2.3930340227089686
+32
+4.968931954582056
+13
+9.500000000000005
+23
+2.3930340227089686
+33
+4.968931954582056
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.136049439910264
+20
+3.152109
+30
+3.2284980853079333
+11
+-4.999999999999995
+21
+3.152109
+31
+3.227619793365834
+12
+-5.06663474057502
+22
+3.1521089999999985
+32
+3.227619793365834
+13
+-5.06663474057502
+23
+3.1521089999999985
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-4.999999999999995
+20
+3.152109
+30
+3.227619793365834
+11
+-5.136049439910264
+21
+3.152109
+31
+3.2284980853079333
+12
+8.377977240467615
+22
+3.1521089999999994
+32
+3.227619793365838
+13
+8.377977240467615
+23
+3.1521089999999994
+33
+3.227619793365838
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.377977240467615
+20
+3.1521089999999994
+30
+3.227619793365838
+11
+-5.136049439910264
+21
+3.152109
+31
+3.2284980853079333
+12
+8.55515851486137
+22
+3.152109
+32
+3.4048010677595912
+13
+8.55515851486137
+23
+3.152109
+33
+3.4048010677595912
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.55515851486137
+20
+3.152109
+30
+3.4048010677595912
+11
+-5.136049439910264
+21
+3.152109
+31
+3.2284980853079333
+12
+-5.265127602337854
+22
+3.152109
+32
+3.2715241394504626
+13
+-5.265127602337854
+23
+3.152109
+33
+3.2715241394504626
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.55515851486137
+20
+3.152109
+30
+3.4048010677595912
+11
+-5.265127602337854
+21
+3.152109
+31
+3.2715241394504626
+12
+-5.374999999999995
+22
+3.152109
+32
+3.3517766757513896
+13
+-5.374999999999995
+23
+3.152109
+33
+3.3517766757513896
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.55515851486137
+20
+3.152109
+30
+3.4048010677595912
+11
+-5.374999999999995
+21
+3.152109
+31
+3.3517766757513896
+12
+-5.41372985422196
+22
+3.152109
+32
+3.4048010677595886
+13
+-5.41372985422196
+23
+3.152109
+33
+3.4048010677595886
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.828925891373206
+20
+3.035760953462357
+30
+3.6785684442714257
+11
+-5.499999999999995
+21
+3.0139421213514037
+31
+3.7267766757513905
+12
+-4.999999999999995
+22
+3.0357609534623577
+32
+3.6785684442714244
+13
+-4.999999999999995
+23
+3.0357609534623577
+33
+3.6785684442714244
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.0139421213514037
+30
+3.7267766757513905
+11
+8.828925891373206
+21
+3.035760953462357
+31
+3.6785684442714257
+12
+8.880710598316162
+22
+3.0123234243928074
+32
+3.7303531512143793
+13
+8.880710598316162
+23
+3.0123234243928074
+33
+3.7303531512143793
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.0139421213514037
+30
+3.7267766757513905
+11
+8.880710598316162
+21
+3.0123234243928074
+31
+3.7303531512143793
+12
+-5.499999999999995
+22
+3.0123234243928083
+32
+3.7303531512143784
+13
+-5.499999999999995
+23
+3.0123234243928083
+33
+3.7303531512143784
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.664926806862336
+20
+3.081230457795461
+30
+3.5145693597605576
+11
+-5.491487383235348
+21
+3.0703175939727343
+31
+3.5703536142168106
+12
+-5.47289263174993
+22
+3.081230457795461
+32
+3.5145693597605545
+13
+-5.47289263174993
+23
+3.081230457795461
+33
+3.5145693597605545
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.491487383235348
+20
+3.0703175939727343
+30
+3.5703536142168106
+11
+8.664926806862336
+21
+3.081230457795461
+31
+3.5145693597605576
+12
+8.720711061318589
+22
+3.070317593972734
+32
+3.57035361421681
+13
+8.720711061318589
+23
+3.070317593972734
+33
+3.57035361421681
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.1499114528701706
+30
+3.4616490734135317
+11
+8.55515851486137
+21
+3.152109
+31
+3.4048010677595912
+12
+-5.41372985422196
+22
+3.152109
+32
+3.4048010677595886
+13
+-5.41372985422196
+23
+3.152109
+33
+3.4048010677595886
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.55515851486137
+20
+3.152109
+30
+3.4048010677595912
+11
+-5.455252536300922
+21
+3.1499114528701706
+31
+3.4616490734135317
+12
+8.613099411029346
+22
+3.149869205505735
+32
+3.4627419639275705
+13
+8.613099411029346
+23
+3.149869205505735
+33
+3.4627419639275705
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.613099411029346
+20
+3.149869205505735
+30
+3.4627419639275705
+11
+-5.455252536300922
+21
+3.1499114528701706
+31
+3.4616490734135317
+12
+-5.455616833138935
+22
+3.149869205505734
+32
+3.4627419639275696
+13
+-5.455616833138935
+23
+3.149869205505734
+33
+3.4627419639275696
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.499999999999995
+20
+3.096779748626952
+30
+3.6876325121546265
+11
+8.890815538808916
+21
+3.072871125223103
+31
+3.740458091707135
+12
+8.837989959256406
+22
+3.096779748626954
+32
+3.687632512154624
+13
+8.837989959256406
+23
+3.096779748626954
+33
+3.687632512154624
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.890815538808916
+20
+3.072871125223103
+30
+3.740458091707135
+11
+-5.499999999999995
+21
+3.096779748626952
+31
+3.6876325121546265
+12
+-5.499999999999995
+22
+3.0790632735059664
+32
+3.72677667575139
+13
+-5.499999999999995
+23
+3.0790632735059664
+33
+3.72677667575139
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.890815538808916
+20
+3.072871125223103
+30
+3.740458091707135
+11
+-5.499999999999995
+21
+3.0790632735059664
+31
+3.72677667575139
+12
+-5.499999999999995
+22
+3.072871125223104
+32
+3.7404580917071333
+13
+-5.499999999999995
+23
+3.072871125223104
+33
+3.7404580917071333
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.608466575397262
+20
+3.087804338305786
+30
+3.4581091282954852
+11
+-5.455252536300922
+21
+3.087392168967912
+31
+3.461649073413532
+12
+-5.452666904421266
+22
+3.0878043383057854
+32
+3.4581091282954834
+13
+-5.452666904421266
+23
+3.0878043383057854
+33
+3.4581091282954834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.087392168967912
+30
+3.461649073413532
+11
+8.608466575397262
+21
+3.087804338305786
+31
+3.4581091282954852
+12
+8.664926806862336
+22
+3.081230457795461
+32
+3.5145693597605576
+13
+8.664926806862336
+23
+3.081230457795461
+33
+3.5145693597605576
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+-5.455252536300922
+20
+3.087392168967912
+30
+3.461649073413532
+11
+8.664926806862336
+21
+3.081230457795461
+31
+3.5145693597605576
+12
+-5.47289263174993
+22
+3.081230457795461
+32
+3.5145693597605545
+13
+-5.47289263174993
+23
+3.081230457795461
+33
+3.5145693597605545
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.498814964478946
+20
+3.116539009769701
+30
+3.6331188833337724
+11
+8.837989959256406
+21
+3.096779748626954
+31
+3.687632512154624
+12
+8.783476330435551
+22
+3.1165390097697028
+32
+3.6331188833337706
+13
+8.783476330435551
+23
+3.1165390097697028
+33
+3.6331188833337706
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.837989959256406
+20
+3.096779748626954
+30
+3.687632512154624
+11
+-5.498814964478946
+21
+3.116539009769701
+31
+3.6331188833337724
+12
+-5.499999999999995
+22
+3.096779748626952
+32
+3.6876325121546265
+13
+-5.499999999999995
+23
+3.096779748626952
+33
+3.6876325121546265
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.828925891373206
+20
+3.035760953462357
+30
+3.6785684442714257
+11
+-5.498713869253477
+21
+3.055130879099794
+31
+3.6251289492995054
+12
+8.775486396401288
+22
+3.055130879099793
+32
+3.6251289492995054
+13
+8.775486396401288
+23
+3.055130879099793
+33
+3.6251289492995054
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.498713869253477
+20
+3.055130879099794
+30
+3.6251289492995054
+11
+8.828925891373206
+21
+3.035760953462357
+31
+3.6785684442714257
+12
+-4.999999999999995
+22
+3.0357609534623577
+32
+3.6785684442714244
+13
+-4.999999999999995
+23
+3.0357609534623577
+33
+3.6785684442714244
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.55166734378469
+20
+3.09
+30
+3.401309896682911
+11
+-4.999999999999995
+21
+3.09
+31
+3.227619793365834
+12
+8.377977240467612
+22
+3.09
+32
+3.227619793365834
+13
+8.377977240467612
+23
+3.09
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-4.999999999999995
+20
+3.09
+30
+3.227619793365834
+11
+8.55166734378469
+21
+3.09
+31
+3.401309896682911
+12
+-5.06663474057502
+22
+3.089999999999999
+32
+3.227619793365834
+13
+-5.06663474057502
+23
+3.089999999999999
+33
+3.227619793365834
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.06663474057502
+20
+3.089999999999999
+30
+3.227619793365834
+11
+8.55166734378469
+21
+3.09
+31
+3.401309896682911
+12
+-5.136049439910264
+22
+3.09
+32
+3.2284980853079333
+13
+-5.136049439910264
+23
+3.09
+33
+3.2284980853079333
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.136049439910264
+20
+3.09
+30
+3.2284980853079333
+11
+8.55166734378469
+21
+3.09
+31
+3.401309896682911
+12
+-5.265127602337854
+22
+3.0900000000000003
+32
+3.2715241394504626
+13
+-5.265127602337854
+23
+3.0900000000000003
+33
+3.2715241394504626
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.265127602337854
+20
+3.0900000000000003
+30
+3.2715241394504626
+11
+8.55166734378469
+21
+3.09
+31
+3.401309896682911
+12
+-5.374999999999995
+22
+3.0900000000000003
+32
+3.3517766757513896
+13
+-5.374999999999995
+23
+3.0900000000000003
+33
+3.3517766757513896
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+-5.374999999999995
+20
+3.0900000000000003
+30
+3.3517766757513896
+11
+8.55166734378469
+21
+3.09
+31
+3.401309896682911
+12
+-5.4111798476732265
+22
+3.089999999999999
+32
+3.401309896682915
+13
+-5.4111798476732265
+23
+3.089999999999999
+33
+3.401309896682915
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+-5.4748151938447736
+20
+3.143163189997152
+30
+3.5203370460450882
+11
+8.613099411029346
+21
+3.149869205505735
+31
+3.4627419639275705
+12
+-5.455616833138935
+22
+3.149869205505734
+32
+3.4627419639275696
+13
+-5.455616833138935
+23
+3.149869205505734
+33
+3.4627419639275696
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.613099411029346
+20
+3.149869205505735
+30
+3.4627419639275705
+11
+-5.4748151938447736
+21
+3.143163189997152
+31
+3.5203370460450882
+12
+8.670694493146872
+22
+3.1431631899971517
+32
+3.5203370460450913
+13
+8.670694493146872
+23
+3.1431631899971517
+33
+3.5203370460450913
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.14860079060873
+30
+5.119999999999996
+11
+9.500000000000005
+21
+0.0
+31
+5.15803684215334
+12
+9.500000000000005
+22
+0.0
+32
+5.119999999999996
+13
+9.500000000000005
+23
+0.0
+33
+5.119999999999996
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+0.0
+30
+5.15803684215334
+11
+9.500000000000005
+21
+2.14860079060873
+31
+5.119999999999996
+12
+9.500000000000005
+22
+2.1917876664999696
+32
+5.15803684215334
+13
+9.500000000000005
+23
+2.1917876664999696
+33
+5.15803684215334
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.1917876664999696
+30
+5.15803684215334
+11
+9.500000000000005
+21
+2.14860079060873
+31
+5.119999999999996
+12
+9.500000000000005
+22
+2.198742898510912
+32
+5.115360597579695
+13
+9.500000000000005
+23
+2.198742898510912
+33
+5.115360597579695
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.1917876664999696
+30
+5.15803684215334
+11
+9.500000000000005
+21
+2.198742898510912
+31
+5.115360597579695
+12
+9.500000000000005
+22
+2.2429376307709816
+32
+5.153304187744393
+13
+9.500000000000005
+23
+2.2429376307709816
+33
+5.153304187744393
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2429376307709816
+30
+5.153304187744393
+11
+9.500000000000005
+21
+2.198742898510912
+31
+5.115360597579695
+12
+9.500000000000005
+22
+2.2471825367939746
+32
+5.101599911452267
+13
+9.500000000000005
+23
+2.2471825367939746
+33
+5.101599911452267
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2429376307709816
+30
+5.153304187744393
+11
+9.500000000000005
+21
+2.2471825367939746
+31
+5.101599911452267
+12
+9.500000000000005
+22
+2.2923509057835325
+32
+5.139266911825803
+13
+9.500000000000005
+23
+2.2923509057835325
+33
+5.139266911825803
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2923509057835325
+30
+5.139266911825803
+11
+9.500000000000005
+21
+2.2471825367939746
+31
+5.101599911452267
+12
+9.500000000000005
+22
+2.2922750396074334
+32
+5.079185156719955
+13
+9.500000000000005
+23
+2.2922750396074334
+33
+5.079185156719955
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2923509057835325
+30
+5.139266911825803
+11
+9.500000000000005
+21
+2.2922750396074334
+31
+5.079185156719955
+12
+9.500000000000005
+22
+2.3324893860329072
+32
+5.0488773791494435
+13
+9.500000000000005
+23
+2.3324893860329072
+33
+5.0488773791494435
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.2923509057835325
+30
+5.139266911825803
+11
+9.500000000000005
+21
+2.3324893860329072
+31
+5.0488773791494435
+12
+9.500000000000005
+22
+2.3383497679035443
+32
+5.116401620523369
+13
+9.500000000000005
+23
+2.3383497679035443
+33
+5.116401620523369
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.3383497679035443
+30
+5.116401620523369
+11
+9.500000000000005
+21
+2.3324893860329072
+31
+5.0488773791494435
+12
+9.500000000000005
+22
+2.36646018267338
+32
+5.011705615466466
+13
+9.500000000000005
+23
+2.36646018267338
+33
+5.011705615466466
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.3383497679035443
+30
+5.116401620523369
+11
+9.500000000000005
+21
+2.36646018267338
+31
+5.011705615466466
+12
+9.500000000000005
+22
+2.3793724226921675
+32
+5.085484656623693
+13
+9.500000000000005
+23
+2.3793724226921675
+33
+5.085484656623693
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.3793724226921675
+30
+5.085484656623693
+11
+9.500000000000005
+21
+2.36646018267338
+31
+5.011705615466466
+12
+9.500000000000005
+22
+2.3930340227089686
+32
+4.968931954582056
+13
+9.500000000000005
+23
+2.3930340227089686
+33
+4.968931954582056
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.3793724226921675
+30
+5.085484656623693
+11
+9.500000000000005
+21
+2.3930340227089686
+31
+4.968931954582056
+12
+9.500000000000005
+22
+2.4140260323451184
+32
+5.047565740490686
+13
+9.500000000000005
+23
+2.4140260323451184
+33
+5.047565740490686
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.4140260323451184
+30
+5.047565740490686
+11
+9.500000000000005
+21
+2.3930340227089686
+31
+4.968931954582056
+12
+9.500000000000002
+22
+2.70267872355089
+32
+4.349642552898214
+13
+9.500000000000002
+23
+2.70267872355089
+33
+4.349642552898214
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.4140260323451184
+30
+5.047565740490686
+11
+9.500000000000002
+21
+2.70267872355089
+31
+4.349642552898214
+12
+9.500000000000005
+22
+2.4411340065654183
+32
+5.003932329022501
+13
+9.500000000000005
+23
+2.4411340065654183
+33
+5.003932329022501
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000005
+20
+2.4411340065654183
+30
+5.003932329022501
+11
+9.500000000000002
+21
+2.70267872355089
+31
+4.349642552898214
+12
+9.500000000000005
+22
+2.768278894627561
+32
+4.349642552898219
+13
+9.500000000000005
+23
+2.768278894627561
+33
+4.349642552898219
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.377977240467615
+20
+3.1521089999999994
+30
+3.227619793365838
+11
+8.55166734378469
+21
+3.09
+31
+3.401309896682911
+12
+8.377977240467612
+22
+3.09
+32
+3.227619793365834
+13
+8.377977240467612
+23
+3.09
+33
+3.227619793365834
+70
+1
+ 0
+3DFACE
+ 8
+cap
+10
+8.55166734378469
+20
+3.09
+30
+3.401309896682911
+11
+8.377977240467615
+21
+3.1521089999999994
+31
+3.227619793365838
+12
+8.55515851486137
+22
+3.152109
+32
+3.4048010677595912
+13
+8.55515851486137
+23
+3.152109
+33
+3.4048010677595912
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.55166734378469
+20
+3.09
+30
+3.401309896682911
+11
+8.55515851486137
+21
+3.152109
+31
+3.4048010677595912
+12
+8.608466575397262
+22
+3.087804338305786
+32
+3.4581091282954852
+13
+8.608466575397262
+23
+3.087804338305786
+33
+3.4581091282954852
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.608466575397262
+20
+3.087804338305786
+30
+3.4581091282954852
+11
+8.55515851486137
+21
+3.152109
+31
+3.4048010677595912
+12
+8.613099411029346
+22
+3.149869205505735
+32
+3.4627419639275705
+13
+8.613099411029346
+23
+3.149869205505735
+33
+3.4627419639275705
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.608466575397262
+20
+3.087804338305786
+30
+3.4581091282954852
+11
+8.613099411029346
+21
+3.149869205505735
+31
+3.4627419639275705
+12
+8.664926806862336
+22
+3.081230457795461
+32
+3.5145693597605576
+13
+8.664926806862336
+23
+3.081230457795461
+33
+3.5145693597605576
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.664926806862336
+20
+3.081230457795461
+30
+3.5145693597605576
+11
+8.613099411029346
+21
+3.149869205505735
+31
+3.4627419639275705
+12
+8.670694493146872
+22
+3.1431631899971517
+32
+3.5203370460450913
+13
+8.670694493146872
+23
+3.1431631899971517
+33
+3.5203370460450913
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.664926806862336
+20
+3.081230457795461
+30
+3.5145693597605576
+11
+8.670694493146872
+21
+3.1431631899971517
+31
+3.5203370460450913
+12
+8.720711061318589
+22
+3.070317593972734
+32
+3.57035361421681
+13
+8.720711061318589
+23
+3.070317593972734
+33
+3.57035361421681
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.720711061318589
+20
+3.070317593972734
+30
+3.57035361421681
+11
+8.670694493146872
+21
+3.1431631899971517
+31
+3.5203370460450913
+12
+8.7276000111177
+22
+3.132030977611586
+32
+3.577242564015919
+13
+8.7276000111177
+23
+3.132030977611586
+33
+3.577242564015919
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.720711061318589
+20
+3.070317593972734
+30
+3.57035361421681
+11
+8.7276000111177
+21
+3.132030977611586
+31
+3.577242564015919
+12
+8.775486396401288
+22
+3.055130879099793
+32
+3.6251289492995054
+13
+8.775486396401288
+23
+3.055130879099793
+33
+3.6251289492995054
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.775486396401288
+20
+3.055130879099793
+30
+3.6251289492995054
+11
+8.7276000111177
+21
+3.132030977611586
+31
+3.577242564015919
+12
+8.783476330435551
+22
+3.1165390097697028
+32
+3.6331188833337706
+13
+8.783476330435551
+23
+3.1165390097697028
+33
+3.6331188833337706
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.775486396401288
+20
+3.055130879099793
+30
+3.6251289492995054
+11
+8.783476330435551
+21
+3.1165390097697028
+31
+3.6331188833337706
+12
+8.828925891373206
+22
+3.035760953462357
+32
+3.6785684442714257
+13
+8.828925891373206
+23
+3.035760953462357
+33
+3.6785684442714257
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.828925891373206
+20
+3.035760953462357
+30
+3.6785684442714257
+11
+8.783476330435551
+21
+3.1165390097697028
+31
+3.6331188833337706
+12
+8.837989959256406
+22
+3.096779748626954
+32
+3.687632512154624
+13
+8.837989959256406
+23
+3.096779748626954
+33
+3.687632512154624
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.828925891373206
+20
+3.035760953462357
+30
+3.6785684442714257
+11
+8.837989959256406
+21
+3.096779748626954
+31
+3.687632512154624
+12
+8.880710598316162
+22
+3.0123234243928074
+32
+3.7303531512143793
+13
+8.880710598316162
+23
+3.0123234243928074
+33
+3.7303531512143793
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+8.880710598316162
+20
+3.0123234243928074
+30
+3.7303531512143793
+11
+8.837989959256406
+21
+3.096779748626954
+31
+3.687632512154624
+12
+8.890815538808916
+22
+3.072871125223103
+32
+3.740458091707135
+13
+8.890815538808916
+23
+3.072871125223103
+33
+3.740458091707135
+70
+13
+ 0
+3DFACE
+ 8
+cap
+10
+8.880710598316162
+20
+3.0123234243928074
+30
+3.7303531512143793
+11
+8.890815538808916
+21
+3.072871125223103
+31
+3.740458091707135
+12
+9.500000000000002
+22
+2.70267872355089
+32
+4.349642552898214
+13
+9.500000000000002
+23
+2.70267872355089
+33
+4.349642552898214
+70
+3
+ 0
+3DFACE
+ 8
+cap
+10
+9.500000000000002
+20
+2.70267872355089
+30
+4.349642552898214
+11
+8.890815538808916
+21
+3.072871125223103
+31
+3.740458091707135
+12
+9.500000000000005
+22
+2.768278894627561
+32
+4.349642552898219
+13
+9.500000000000005
+23
+2.768278894627561
+33
+4.349642552898219
+70
+1
+ 0
+3DFACE
+ 8
+lens
+10
+7.549999999999994
+20
+-1.9234723584537645
+30
+1.312690181611032
+11
+7.549999999999996
+21
+2.033557928245138
+31
+4.6873245059755515
+12
+7.549999999999996
+22
+-1.9237143674853878
+32
+4.6873245059755515
+13
+7.549999999999996
+23
+-1.9237143674853878
+33
+4.6873245059755515
+70
+1
+ 0
+3DFACE
+ 8
+lens
+10
+7.549999999999996
+20
+2.033557928245138
+30
+4.6873245059755515
+11
+7.549999999999994
+21
+-1.9234723584537645
+31
+1.312690181611032
+12
+7.549999999999995
+22
+2.033799937276761
+32
+1.312690181611032
+13
+7.549999999999995
+23
+2.033799937276761
+33
+1.312690181611032
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.6495190528383337
+20
+0.374999999999997
+30
+-0.37499999999999933
+11
+0.5303300858899189
+21
+0.625000000000002
+31
+-0.5303300858899107
+12
+0.6495190528383366
+22
+0.6250000000000006
+32
+-0.37499999999999933
+13
+0.6495190528383366
+23
+0.6250000000000006
+33
+-0.37499999999999933
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.5303300858899189
+20
+0.625000000000002
+30
+-0.5303300858899107
+11
+0.6495190528383337
+21
+0.374999999999997
+31
+-0.37499999999999933
+12
+0.530330085889916
+22
+0.37499999999999845
+32
+-0.5303300858899107
+13
+0.530330085889916
+23
+0.37499999999999845
+33
+-0.5303300858899107
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7500000000000047
+20
+0.3749999999999958
+30
+-2.220446049250313e-16
+11
+0.7244443697168106
+21
+0.6249999999999997
+31
+-0.19411428382689278
+12
+0.7500000000000075
+22
+0.6249999999999993
+32
+-2.220446049250313e-16
+13
+0.7500000000000075
+23
+0.6249999999999993
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7244443697168106
+20
+0.6249999999999997
+30
+-0.19411428382689278
+11
+0.7500000000000047
+21
+0.3749999999999958
+31
+-2.220446049250313e-16
+12
+0.7244443697168077
+22
+0.3749999999999961
+32
+-0.19411428382689278
+13
+0.7244443697168077
+23
+0.3749999999999961
+33
+-0.19411428382689278
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.37500000000000466
+20
+0.3750000000000002
+30
+-0.6495190528383283
+11
+0.5303300858899189
+21
+0.625000000000002
+31
+-0.5303300858899107
+12
+0.530330085889916
+22
+0.37499999999999845
+32
+-0.5303300858899107
+13
+0.530330085889916
+23
+0.37499999999999845
+33
+-0.5303300858899107
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.5303300858899189
+20
+0.625000000000002
+30
+-0.5303300858899107
+11
+0.37500000000000466
+21
+0.3750000000000002
+31
+-0.6495190528383283
+12
+0.37500000000000755
+22
+0.6250000000000038
+32
+-0.6495190528383283
+13
+0.37500000000000755
+23
+0.6250000000000038
+33
+-0.6495190528383283
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7244443697167984
+20
+0.3750000000000132
+30
+-0.194114283826891
+11
+-0.7499999999999925
+21
+0.6250000000000171
+31
+-2.220446049250313e-16
+12
+-0.7244443697167955
+22
+0.6250000000000168
+32
+-0.194114283826891
+13
+-0.7244443697167955
+23
+0.6250000000000168
+33
+-0.194114283826891
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7499999999999925
+20
+0.6250000000000171
+30
+-2.220446049250313e-16
+11
+-0.7244443697167984
+21
+0.3750000000000132
+31
+-0.194114283826891
+12
+-0.7499999999999953
+22
+0.37500000000001354
+32
+-2.220446049250313e-16
+13
+-0.7499999999999953
+23
+0.37500000000001354
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.19411428382689633
+20
+0.37500000000000233
+30
+-0.7244443697168006
+11
+0.37500000000000755
+21
+0.6250000000000038
+31
+-0.6495190528383283
+12
+0.37500000000000466
+22
+0.3750000000000002
+32
+-0.6495190528383283
+13
+0.37500000000000466
+23
+0.3750000000000002
+33
+-0.6495190528383283
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.37500000000000755
+20
+0.6250000000000038
+30
+-0.6495190528383283
+11
+0.19411428382689633
+21
+0.37500000000000233
+31
+-0.7244443697168006
+12
+0.19411428382689921
+22
+0.625000000000006
+32
+-0.7244443697168006
+13
+0.19411428382689921
+23
+0.625000000000006
+33
+-0.7244443697168006
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.19411428382688056
+20
+0.6250000000000104
+30
+-0.7244443697168006
+11
+0.19411428382689921
+21
+0.625000000000006
+31
+-0.7244443697168006
+12
+7.549516567451064e-15
+22
+0.6250000000000082
+32
+-0.7499999999999993
+13
+7.549516567451064e-15
+23
+0.6250000000000082
+33
+-0.7499999999999993
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.19411428382689921
+20
+0.625000000000006
+30
+-0.7244443697168006
+11
+-0.19411428382688056
+21
+0.6250000000000104
+31
+-0.7244443697168006
+12
+-0.37499999999999245
+22
+0.6250000000000127
+32
+-0.6495190528383283
+13
+-0.37499999999999245
+23
+0.6250000000000127
+33
+-0.6495190528383283
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+0.19411428382689921
+20
+0.625000000000006
+30
+-0.7244443697168006
+11
+-0.37499999999999245
+21
+0.6250000000000127
+31
+-0.6495190528383283
+12
+0.37500000000000755
+22
+0.6250000000000038
+32
+-0.6495190528383283
+13
+0.37500000000000755
+23
+0.6250000000000038
+33
+-0.6495190528383283
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.37500000000000755
+20
+0.6250000000000038
+30
+-0.6495190528383283
+11
+-0.37499999999999245
+21
+0.6250000000000127
+31
+-0.6495190528383283
+12
+-0.5303300858899038
+22
+0.6250000000000144
+32
+-0.5303300858899107
+13
+-0.5303300858899038
+23
+0.6250000000000144
+33
+-0.5303300858899107
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+0.37500000000000755
+20
+0.6250000000000038
+30
+-0.6495190528383283
+11
+-0.5303300858899038
+21
+0.6250000000000144
+31
+-0.5303300858899107
+12
+0.5303300858899189
+22
+0.625000000000002
+32
+-0.5303300858899107
+13
+0.5303300858899189
+23
+0.625000000000002
+33
+-0.5303300858899107
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.5303300858899189
+20
+0.625000000000002
+30
+-0.5303300858899107
+11
+-0.5303300858899038
+21
+0.6250000000000144
+31
+-0.5303300858899107
+12
+-0.6495190528383215
+22
+0.6250000000000159
+32
+-0.37499999999999933
+13
+-0.6495190528383215
+23
+0.6250000000000159
+33
+-0.37499999999999933
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+0.5303300858899189
+20
+0.625000000000002
+30
+-0.5303300858899107
+11
+-0.6495190528383215
+21
+0.6250000000000159
+31
+-0.37499999999999933
+12
+0.6495190528383366
+22
+0.6250000000000006
+32
+-0.37499999999999933
+13
+0.6495190528383366
+23
+0.6250000000000006
+33
+-0.37499999999999933
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.6495190528383366
+20
+0.6250000000000006
+30
+-0.37499999999999933
+11
+-0.6495190528383215
+21
+0.6250000000000159
+31
+-0.37499999999999933
+12
+-0.7244443697167955
+22
+0.6250000000000168
+32
+-0.194114283826891
+13
+-0.7244443697167955
+23
+0.6250000000000168
+33
+-0.194114283826891
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+0.6495190528383366
+20
+0.6250000000000006
+30
+-0.37499999999999933
+11
+-0.7244443697167955
+21
+0.6250000000000168
+31
+-0.194114283826891
+12
+0.7244443697168106
+22
+0.6249999999999997
+32
+-0.19411428382689278
+13
+0.7244443697168106
+23
+0.6249999999999997
+33
+-0.19411428382689278
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7244443697168106
+20
+0.6249999999999997
+30
+-0.19411428382689278
+11
+-0.7244443697167955
+21
+0.6250000000000168
+31
+-0.194114283826891
+12
+0.7500000000000075
+22
+0.6249999999999993
+32
+-2.220446049250313e-16
+13
+0.7500000000000075
+23
+0.6249999999999993
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7500000000000075
+20
+0.6249999999999993
+30
+-2.220446049250313e-16
+11
+-0.7244443697167955
+21
+0.6250000000000168
+31
+-0.194114283826891
+12
+-0.7499999999999925
+22
+0.6250000000000171
+32
+-2.220446049250313e-16
+13
+-0.7499999999999925
+23
+0.6250000000000171
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.5303300858899067
+20
+0.3750000000000109
+30
+-0.5303300858899107
+11
+-0.37499999999999245
+21
+0.6250000000000127
+31
+-0.6495190528383283
+12
+-0.37499999999999534
+22
+0.3750000000000091
+32
+-0.6495190528383283
+13
+-0.37499999999999534
+23
+0.3750000000000091
+33
+-0.6495190528383283
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.37499999999999245
+20
+0.6250000000000127
+30
+-0.6495190528383283
+11
+-0.5303300858899067
+21
+0.3750000000000109
+31
+-0.5303300858899107
+12
+-0.5303300858899038
+22
+0.6250000000000144
+32
+-0.5303300858899107
+13
+-0.5303300858899038
+23
+0.6250000000000144
+33
+-0.5303300858899107
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.5303300858899067
+20
+0.3750000000000109
+30
+-0.5303300858899107
+11
+-0.6495190528383215
+21
+0.6250000000000159
+31
+-0.37499999999999933
+12
+-0.5303300858899038
+22
+0.6250000000000144
+32
+-0.5303300858899107
+13
+-0.5303300858899038
+23
+0.6250000000000144
+33
+-0.5303300858899107
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.6495190528383215
+20
+0.6250000000000159
+30
+-0.37499999999999933
+11
+-0.5303300858899067
+21
+0.3750000000000109
+31
+-0.5303300858899107
+12
+-0.6495190528383243
+22
+0.3750000000000123
+32
+-0.37499999999999933
+13
+-0.6495190528383243
+23
+0.3750000000000123
+33
+-0.37499999999999933
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.37499999999999534
+20
+0.3750000000000091
+30
+-0.6495190528383283
+11
+-0.19411428382688056
+21
+0.6250000000000104
+31
+-0.7244443697168006
+12
+-0.19411428382688345
+22
+0.375000000000007
+32
+-0.7244443697168006
+13
+-0.19411428382688345
+23
+0.375000000000007
+33
+-0.7244443697168006
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.19411428382688056
+20
+0.6250000000000104
+30
+-0.7244443697168006
+11
+-0.37499999999999534
+21
+0.3750000000000091
+31
+-0.6495190528383283
+12
+-0.37499999999999245
+22
+0.6250000000000127
+32
+-0.6495190528383283
+13
+-0.37499999999999245
+23
+0.6250000000000127
+33
+-0.6495190528383283
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.19411428382688345
+20
+0.375000000000007
+30
+-0.7244443697168006
+11
+7.549516567451064e-15
+21
+0.6250000000000082
+31
+-0.7499999999999993
+12
+4.6629367034256575e-15
+22
+0.37500000000000466
+32
+-0.7499999999999993
+13
+4.6629367034256575e-15
+23
+0.37500000000000466
+33
+-0.7499999999999993
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+7.549516567451064e-15
+20
+0.6250000000000082
+30
+-0.7499999999999993
+11
+-0.19411428382688345
+21
+0.375000000000007
+31
+-0.7244443697168006
+12
+-0.19411428382688056
+22
+0.6250000000000104
+32
+-0.7244443697168006
+13
+-0.19411428382688056
+23
+0.6250000000000104
+33
+-0.7244443697168006
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7244443697168077
+20
+0.3749999999999961
+30
+-0.19411428382689278
+11
+0.6495190528383366
+21
+0.6250000000000006
+31
+-0.37499999999999933
+12
+0.7244443697168106
+22
+0.6249999999999997
+32
+-0.19411428382689278
+13
+0.7244443697168106
+23
+0.6249999999999997
+33
+-0.19411428382689278
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.6495190528383366
+20
+0.6250000000000006
+30
+-0.37499999999999933
+11
+0.7244443697168077
+21
+0.3749999999999961
+31
+-0.19411428382689278
+12
+0.6495190528383337
+22
+0.374999999999997
+32
+-0.37499999999999933
+13
+0.6495190528383337
+23
+0.374999999999997
+33
+-0.37499999999999933
+70
+1
+ 0
+LINE
+ 8
+hinge
+10
+-0.9999999999999996
+20
+1.6431300764452317e-14
+30
+0.9999999999999996
+11
+1.0000000000000002
+21
+-7.105427357601002e-15
+31
+0.9999999999999996
+ 0
+3DFACE
+ 8
+hinge
+10
+4.6629367034256575e-15
+20
+0.37500000000000466
+30
+-0.7499999999999993
+11
+0.19411428382689921
+21
+0.625000000000006
+31
+-0.7244443697168006
+12
+0.19411428382689633
+22
+0.37500000000000233
+32
+-0.7244443697168006
+13
+0.19411428382689633
+23
+0.37500000000000233
+33
+-0.7244443697168006
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.19411428382689921
+20
+0.625000000000006
+30
+-0.7244443697168006
+11
+4.6629367034256575e-15
+21
+0.37500000000000466
+31
+-0.7499999999999993
+12
+7.549516567451064e-15
+22
+0.6250000000000082
+32
+-0.7499999999999993
+13
+7.549516567451064e-15
+23
+0.6250000000000082
+33
+-0.7499999999999993
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.6495190528383243
+20
+0.3750000000000123
+30
+-0.37499999999999933
+11
+-0.7244443697167955
+21
+0.6250000000000168
+31
+-0.194114283826891
+12
+-0.6495190528383215
+22
+0.6250000000000159
+32
+-0.37499999999999933
+13
+-0.6495190528383215
+23
+0.6250000000000159
+33
+-0.37499999999999933
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7244443697167955
+20
+0.6250000000000168
+30
+-0.194114283826891
+11
+-0.6495190528383243
+21
+0.3750000000000123
+31
+-0.37499999999999933
+12
+-0.7244443697167984
+22
+0.3750000000000132
+32
+-0.194114283826891
+13
+-0.7244443697167984
+23
+0.3750000000000132
+33
+-0.194114283826891
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.19411428382689633
+20
+0.37500000000000233
+30
+-0.7244443697168006
+11
+-0.19411428382688345
+21
+0.375000000000007
+31
+-0.7244443697168006
+12
+4.6629367034256575e-15
+22
+0.37500000000000466
+32
+-0.7499999999999993
+13
+4.6629367034256575e-15
+23
+0.37500000000000466
+33
+-0.7499999999999993
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.19411428382688345
+20
+0.375000000000007
+30
+-0.7244443697168006
+11
+0.19411428382689633
+21
+0.37500000000000233
+31
+-0.7244443697168006
+12
+0.37500000000000466
+22
+0.3750000000000002
+32
+-0.6495190528383283
+13
+0.37500000000000466
+23
+0.3750000000000002
+33
+-0.6495190528383283
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.19411428382688345
+20
+0.375000000000007
+30
+-0.7244443697168006
+11
+0.37500000000000466
+21
+0.3750000000000002
+31
+-0.6495190528383283
+12
+-0.37499999999999534
+22
+0.3750000000000091
+32
+-0.6495190528383283
+13
+-0.37499999999999534
+23
+0.3750000000000091
+33
+-0.6495190528383283
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.37499999999999534
+20
+0.3750000000000091
+30
+-0.6495190528383283
+11
+0.37500000000000466
+21
+0.3750000000000002
+31
+-0.6495190528383283
+12
+0.530330085889916
+22
+0.37499999999999845
+32
+-0.5303300858899107
+13
+0.530330085889916
+23
+0.37499999999999845
+33
+-0.5303300858899107
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.37499999999999534
+20
+0.3750000000000091
+30
+-0.6495190528383283
+11
+0.530330085889916
+21
+0.37499999999999845
+31
+-0.5303300858899107
+12
+-0.5303300858899067
+22
+0.3750000000000109
+32
+-0.5303300858899107
+13
+-0.5303300858899067
+23
+0.3750000000000109
+33
+-0.5303300858899107
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.5303300858899067
+20
+0.3750000000000109
+30
+-0.5303300858899107
+11
+0.530330085889916
+21
+0.37499999999999845
+31
+-0.5303300858899107
+12
+0.6495190528383337
+22
+0.374999999999997
+32
+-0.37499999999999933
+13
+0.6495190528383337
+23
+0.374999999999997
+33
+-0.37499999999999933
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.5303300858899067
+20
+0.3750000000000109
+30
+-0.5303300858899107
+11
+0.6495190528383337
+21
+0.374999999999997
+31
+-0.37499999999999933
+12
+-0.6495190528383243
+22
+0.3750000000000123
+32
+-0.37499999999999933
+13
+-0.6495190528383243
+23
+0.3750000000000123
+33
+-0.37499999999999933
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.6495190528383243
+20
+0.3750000000000123
+30
+-0.37499999999999933
+11
+0.6495190528383337
+21
+0.374999999999997
+31
+-0.37499999999999933
+12
+0.7244443697168077
+22
+0.3749999999999961
+32
+-0.19411428382689278
+13
+0.7244443697168077
+23
+0.3749999999999961
+33
+-0.19411428382689278
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.6495190528383243
+20
+0.3750000000000123
+30
+-0.37499999999999933
+11
+0.7244443697168077
+21
+0.3749999999999961
+31
+-0.19411428382689278
+12
+-0.7244443697167984
+22
+0.3750000000000132
+32
+-0.194114283826891
+13
+-0.7244443697167984
+23
+0.3750000000000132
+33
+-0.194114283826891
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7244443697167984
+20
+0.3750000000000132
+30
+-0.194114283826891
+11
+0.7244443697168077
+21
+0.3749999999999961
+31
+-0.19411428382689278
+12
+0.7500000000000047
+22
+0.3749999999999958
+32
+-2.220446049250313e-16
+13
+0.7500000000000047
+23
+0.3749999999999958
+33
+-2.220446049250313e-16
+70
+13
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7244443697167984
+20
+0.3750000000000132
+30
+-0.194114283826891
+11
+0.7500000000000047
+21
+0.3749999999999958
+31
+-2.220446049250313e-16
+12
+-0.7499999999999953
+22
+0.37500000000001354
+32
+-2.220446049250313e-16
+13
+-0.7499999999999953
+23
+0.37500000000001354
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.9999999999999996
+20
+1.6431300764452317e-14
+30
+-2.220446049250313e-16
+11
+0.9659258262890719
+21
+0.2588190451025134
+31
+-2.220446049250313e-16
+12
+1.0000000000000002
+22
+-7.105427357601002e-15
+32
+-2.220446049250313e-16
+13
+1.0000000000000002
+23
+-7.105427357601002e-15
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.9659258262890719
+20
+0.2588190451025134
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+0.8660254037844454
+22
+0.4999999999999938
+32
+-2.220446049250313e-16
+13
+0.8660254037844454
+23
+0.4999999999999938
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.8660254037844454
+20
+0.4999999999999938
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+0.7071067811865565
+22
+0.7071067811865436
+32
+-2.220446049250313e-16
+13
+0.7071067811865565
+23
+0.7071067811865436
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7071067811865565
+20
+0.7071067811865436
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+0.5000000000000104
+22
+0.8660254037844374
+32
+-2.220446049250313e-16
+13
+0.5000000000000104
+23
+0.8660254037844374
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.5000000000000104
+20
+0.8660254037844374
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+0.2588190451025332
+22
+0.9659258262890692
+32
+-2.220446049250313e-16
+13
+0.2588190451025332
+23
+0.9659258262890692
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+0.2588190451025332
+20
+0.9659258262890692
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+1.199040866595169e-14
+22
+1.0000000000000047
+32
+-2.220446049250313e-16
+13
+1.199040866595169e-14
+23
+1.0000000000000047
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+1.199040866595169e-14
+20
+1.0000000000000047
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+-0.2588190451025092
+22
+0.965925826289077
+32
+-2.220446049250313e-16
+13
+-0.2588190451025092
+23
+0.965925826289077
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.2588190451025092
+20
+0.965925826289077
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+-0.49999999999998956
+22
+0.8660254037844491
+32
+-2.220446049250313e-16
+13
+-0.49999999999998956
+23
+0.8660254037844491
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.49999999999998956
+20
+0.8660254037844491
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+-0.7071067811865395
+22
+0.7071067811865602
+32
+-2.220446049250313e-16
+13
+-0.7071067811865395
+23
+0.7071067811865602
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7071067811865395
+20
+0.7071067811865602
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+-0.8660254037844322
+22
+0.5000000000000151
+32
+-2.220446049250313e-16
+13
+-0.8660254037844322
+23
+0.5000000000000151
+33
+-2.220446049250313e-16
+70
+3
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.8660254037844322
+20
+0.5000000000000151
+30
+-2.220446049250313e-16
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+-0.9659258262890644
+22
+0.25881904510253695
+32
+-2.220446049250313e-16
+13
+-0.9659258262890644
+23
+0.25881904510253695
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+1.199040866595169e-14
+20
+1.0000000000000047
+30
+0.9999999999999996
+11
+0.2588190451025332
+21
+0.9659258262890692
+31
+-2.220446049250313e-16
+12
+1.199040866595169e-14
+22
+1.0000000000000047
+32
+-2.220446049250313e-16
+13
+1.199040866595169e-14
+23
+1.0000000000000047
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.2588190451025332
+20
+0.9659258262890692
+30
+-2.220446049250313e-16
+11
+1.199040866595169e-14
+21
+1.0000000000000047
+31
+0.9999999999999996
+12
+0.2588190451025332
+22
+0.9659258262890692
+32
+0.9999999999999996
+13
+0.2588190451025332
+23
+0.9659258262890692
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7071067811865395
+20
+0.7071067811865602
+30
+0.9999999999999996
+11
+-0.49999999999998956
+21
+0.8660254037844491
+31
+-2.220446049250313e-16
+12
+-0.7071067811865395
+22
+0.7071067811865602
+32
+-2.220446049250313e-16
+13
+-0.7071067811865395
+23
+0.7071067811865602
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.49999999999998956
+20
+0.8660254037844491
+30
+-2.220446049250313e-16
+11
+-0.7071067811865395
+21
+0.7071067811865602
+31
+0.9999999999999996
+12
+-0.49999999999998956
+22
+0.8660254037844491
+32
+0.9999999999999996
+13
+-0.49999999999998956
+23
+0.8660254037844491
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.49999999999998956
+20
+0.8660254037844491
+30
+0.9999999999999996
+11
+-0.2588190451025092
+21
+0.965925826289077
+31
+-2.220446049250313e-16
+12
+-0.49999999999998956
+22
+0.8660254037844491
+32
+-2.220446049250313e-16
+13
+-0.49999999999998956
+23
+0.8660254037844491
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.2588190451025092
+20
+0.965925826289077
+30
+-2.220446049250313e-16
+11
+-0.49999999999998956
+21
+0.8660254037844491
+31
+0.9999999999999996
+12
+-0.2588190451025092
+22
+0.965925826289077
+32
+0.9999999999999996
+13
+-0.2588190451025092
+23
+0.965925826289077
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.2588190451025332
+20
+0.9659258262890692
+30
+0.9999999999999996
+11
+0.5000000000000104
+21
+0.8660254037844374
+31
+-2.220446049250313e-16
+12
+0.2588190451025332
+22
+0.9659258262890692
+32
+-2.220446049250313e-16
+13
+0.2588190451025332
+23
+0.9659258262890692
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.5000000000000104
+20
+0.8660254037844374
+30
+-2.220446049250313e-16
+11
+0.2588190451025332
+21
+0.9659258262890692
+31
+0.9999999999999996
+12
+0.5000000000000104
+22
+0.8660254037844374
+32
+0.9999999999999996
+13
+0.5000000000000104
+23
+0.8660254037844374
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+1.0000000000000002
+20
+-7.105427357601002e-15
+30
+0.9999999999999996
+11
+0.9659258262890719
+21
+0.2588190451025134
+31
+-2.220446049250313e-16
+12
+0.9659258262890719
+22
+0.2588190451025134
+32
+0.9999999999999996
+13
+0.9659258262890719
+23
+0.2588190451025134
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.9659258262890719
+20
+0.2588190451025134
+30
+-2.220446049250313e-16
+11
+1.0000000000000002
+21
+-7.105427357601002e-15
+31
+0.9999999999999996
+12
+1.0000000000000002
+22
+-7.105427357601002e-15
+32
+-2.220446049250313e-16
+13
+1.0000000000000002
+23
+-7.105427357601002e-15
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.8660254037844454
+20
+0.4999999999999938
+30
+0.9999999999999996
+11
+0.7071067811865565
+21
+0.7071067811865436
+31
+-2.220446049250313e-16
+12
+0.7071067811865565
+22
+0.7071067811865436
+32
+0.9999999999999996
+13
+0.7071067811865565
+23
+0.7071067811865436
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7071067811865565
+20
+0.7071067811865436
+30
+-2.220446049250313e-16
+11
+0.8660254037844454
+21
+0.4999999999999938
+31
+0.9999999999999996
+12
+0.8660254037844454
+22
+0.4999999999999938
+32
+-2.220446049250313e-16
+13
+0.8660254037844454
+23
+0.4999999999999938
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.2588190451025092
+20
+0.965925826289077
+30
+0.9999999999999996
+11
+1.199040866595169e-14
+21
+1.0000000000000047
+31
+-2.220446049250313e-16
+12
+-0.2588190451025092
+22
+0.965925826289077
+32
+-2.220446049250313e-16
+13
+-0.2588190451025092
+23
+0.965925826289077
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+1.199040866595169e-14
+20
+1.0000000000000047
+30
+-2.220446049250313e-16
+11
+-0.2588190451025092
+21
+0.965925826289077
+31
+0.9999999999999996
+12
+1.199040866595169e-14
+22
+1.0000000000000047
+32
+0.9999999999999996
+13
+1.199040866595169e-14
+23
+1.0000000000000047
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.9659258262890644
+20
+0.25881904510253695
+30
+-2.220446049250313e-16
+11
+-0.8660254037844322
+21
+0.5000000000000151
+31
+0.9999999999999996
+12
+-0.8660254037844322
+22
+0.5000000000000151
+32
+-2.220446049250313e-16
+13
+-0.8660254037844322
+23
+0.5000000000000151
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.8660254037844322
+20
+0.5000000000000151
+30
+0.9999999999999996
+11
+-0.9659258262890644
+21
+0.25881904510253695
+31
+-2.220446049250313e-16
+12
+-0.9659258262890644
+22
+0.25881904510253695
+32
+0.9999999999999996
+13
+-0.9659258262890644
+23
+0.25881904510253695
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.8660254037844322
+20
+0.5000000000000151
+30
+-2.220446049250313e-16
+11
+-0.7071067811865395
+21
+0.7071067811865602
+31
+0.9999999999999996
+12
+-0.7071067811865395
+22
+0.7071067811865602
+32
+-2.220446049250313e-16
+13
+-0.7071067811865395
+23
+0.7071067811865602
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.7071067811865395
+20
+0.7071067811865602
+30
+0.9999999999999996
+11
+-0.8660254037844322
+21
+0.5000000000000151
+31
+-2.220446049250313e-16
+12
+-0.8660254037844322
+22
+0.5000000000000151
+32
+0.9999999999999996
+13
+-0.8660254037844322
+23
+0.5000000000000151
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.5000000000000104
+20
+0.8660254037844374
+30
+0.9999999999999996
+11
+0.7071067811865565
+21
+0.7071067811865436
+31
+-2.220446049250313e-16
+12
+0.5000000000000104
+22
+0.8660254037844374
+32
+-2.220446049250313e-16
+13
+0.5000000000000104
+23
+0.8660254037844374
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.7071067811865565
+20
+0.7071067811865436
+30
+-2.220446049250313e-16
+11
+0.5000000000000104
+21
+0.8660254037844374
+31
+0.9999999999999996
+12
+0.7071067811865565
+22
+0.7071067811865436
+32
+0.9999999999999996
+13
+0.7071067811865565
+23
+0.7071067811865436
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.9659258262890719
+20
+0.2588190451025134
+30
+0.9999999999999996
+11
+0.8660254037844454
+21
+0.4999999999999938
+31
+-2.220446049250313e-16
+12
+0.8660254037844454
+22
+0.4999999999999938
+32
+0.9999999999999996
+13
+0.8660254037844454
+23
+0.4999999999999938
+33
+0.9999999999999996
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+0.8660254037844454
+20
+0.4999999999999938
+30
+-2.220446049250313e-16
+11
+0.9659258262890719
+21
+0.2588190451025134
+31
+0.9999999999999996
+12
+0.9659258262890719
+22
+0.2588190451025134
+32
+-2.220446049250313e-16
+13
+0.9659258262890719
+23
+0.2588190451025134
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.9999999999999996
+20
+1.6431300764452317e-14
+30
+-2.220446049250313e-16
+11
+-0.9659258262890644
+21
+0.25881904510253695
+31
+0.9999999999999996
+12
+-0.9659258262890644
+22
+0.25881904510253695
+32
+-2.220446049250313e-16
+13
+-0.9659258262890644
+23
+0.25881904510253695
+33
+-2.220446049250313e-16
+70
+1
+ 0
+3DFACE
+ 8
+hinge
+10
+-0.9659258262890644
+20
+0.25881904510253695
+30
+0.9999999999999996
+11
+-0.9999999999999996
+21
+1.6431300764452317e-14
+31
+-2.220446049250313e-16
+12
+-0.9999999999999996
+22
+1.6431300764452317e-14
+32
+0.9999999999999996
+13
+-0.9999999999999996
+23
+1.6431300764452317e-14
+33
+0.9999999999999996
+70
+1
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/hacks/glx/shark.c b/hacks/glx/shark.c
new file mode 100644
index 0000000..682ed6e
--- /dev/null
+++ b/hacks/glx/shark.c
@@ -0,0 +1,1395 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if 0
+static const char sccsid[] = "@(#)shark.c 1.2 98/06/16 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@users.sourceforge.net
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+/* *INDENT-OFF* */
+#if 0
+static const float N001[3] = {0, 1, 0};
+#endif
+static const float N002[3] = {0.000077, -0.020611, 0.999788};
+static const float N003[3] = {0.961425, 0.258729, -0.09339};
+static const float N004[3] = {0.510811, -0.769633, -0.383063};
+static const float N005[3] = {0.400123, 0.855734, -0.328055};
+static const float N006[3] = {-0.770715, 0.610204, -0.18344};
+static const float N007[3] = {-0.915597, -0.373345, -0.149316};
+static const float N008[3] = {-0.972788, 0.208921, -0.100179};
+static const float N009[3] = {-0.939713, -0.312268, -0.139383};
+static const float N010[3] = {-0.624138, -0.741047, -0.247589};
+static const float N011[3] = {0.591434, -0.768401, -0.244471};
+static const float N012[3] = {0.935152, -0.328495, -0.132598};
+static const float N013[3] = {0.997102, 0.074243, -0.016593};
+static const float N014[3] = {0.969995, 0.241712, -0.026186};
+static const float N015[3] = {0.844539, 0.502628, -0.184714};
+static const float N016[3] = {-0.906608, 0.386308, -0.169787};
+static const float N017[3] = {-0.970016, 0.241698, -0.025516};
+static const float N018[3] = {-0.998652, 0.050493, -0.012045};
+static const float N019[3] = {-0.942685, -0.333051, -0.020556};
+static const float N020[3] = {-0.660944, -0.750276, 0.01548};
+static const float N021[3] = {0.503549, -0.862908, -0.042749};
+static const float N022[3] = {0.953202, -0.302092, -0.012089};
+static const float N023[3] = {0.998738, 0.023574, 0.044344};
+static const float N024[3] = {0.979297, 0.193272, 0.060202};
+static const float N025[3] = {0.7983, 0.464885, 0.382883};
+static const float N026[3] = {-0.75659, 0.452403, 0.472126};
+static const float N027[3] = {-0.953855, 0.293003, 0.065651};
+static const float N028[3] = {-0.998033, 0.040292, 0.048028};
+static const float N029[3] = {-0.977079, -0.204288, 0.059858};
+static const float N030[3] = {-0.729117, -0.675304, 0.11114};
+static const float N031[3] = {0.598361, -0.792753, 0.116221};
+static const float N032[3] = {0.965192, -0.252991, 0.066332};
+static const float N033[3] = {0.998201, -0.00279, 0.059892};
+static const float N034[3] = {0.978657, 0.193135, 0.070207};
+static const float N035[3] = {0.718815, 0.680392, 0.142733};
+static const float N036[3] = {-0.383096, 0.906212, 0.178936};
+static const float N037[3] = {-0.952831, 0.29259, 0.080647};
+static const float N038[3] = {-0.99768, 0.032417, 0.059861};
+static const float N039[3] = {-0.982629, -0.169881, 0.0747};
+static const float N040[3] = {-0.695424, -0.703466, 0.1467};
+static const float N041[3] = {0.359323, -0.915531, 0.180805};
+static const float N042[3] = {0.943356, -0.319387, 0.089842};
+static const float N043[3] = {0.998272, -0.032435, 0.048993};
+static const float N044[3] = {0.978997, 0.193205, 0.065084};
+static const float N045[3] = {0.872144, 0.470094, -0.135565};
+static const float N046[3] = {-0.664282, 0.737945, -0.119027};
+static const float N047[3] = {-0.954508, 0.28857, 0.075107};
+static const float N048[3] = {-0.998273, 0.032406, 0.048993};
+static const float N049[3] = {-0.979908, -0.193579, 0.048038};
+static const float N050[3] = {-0.858736, -0.507202, -0.072938};
+static const float N051[3] = {0.643545, -0.763887, -0.048237};
+static const float N052[3] = {0.95558, -0.288954, 0.058068};
+#if 0
+static const float N053[3] = {0, 1, 0};
+static const float N054[3] = {0, 1, 0};
+static const float N055[3] = {0, 1, 0};
+static const float N056[3] = {0, 1, 0};
+static const float N057[3] = {0, 1, 0};
+#endif
+static const float N058[3] = {0.00005, 0.793007, -0.609213};
+static const float N059[3] = {0.91351, 0.235418, -0.331779};
+static const float N060[3] = {-0.80797, 0.495, -0.319625};
+static const float N061[3] = {0, 0.784687, -0.619892};
+static const float N062[3] = {0, -1, 0};
+static const float N063[3] = {0, 1, 0};
+static const float N064[3] = {0, 1, 0};
+static const float N065[3] = {0, 1, 0};
+static const float N066[3] = {-0.055784, 0.257059, 0.964784};
+#if 0
+static const float N067[3] = {0, 1, 0};
+static const float N068[3] = {0, 1, 0};
+#endif
+static const float N069[3] = {-0.000505, -0.929775, -0.368127};
+static const float N070[3] = {0, 1, 0};
+#if 0
+static const float N071[3] = {-0.987102, 0.131723, -0.090984};
+static const float N072[3] = {-0.987102, 0.131723, -0.090984};
+static const float N073[3] = {-0.987102, 0.131723, -0.090984};
+static const float N074[3] = {0, 1, 0};
+static const float N075[3] = {0, 1, 0};
+static const float N076[3] = {0, 1, 0};
+static const float N077[3] = {0.99521, 0.071962, -0.066168};
+static const float N078[3] = {0.99521, 0.071962, -0.066168};
+static const float N079[3] = {0.99521, 0.071962, -0.066168};
+static const float N080[3] = {0, 1, 0};
+static const float N081[3] = {0, 1, 0};
+static const float N082[3] = {0, 1, 0};
+static const float P001[3] = {0, 0, 0};
+#endif
+static float P002[3] = {0, -36.59, 5687.72};
+static const float P003[3] = {90, 114.73, 724.38};
+static float P004[3] = {58.24, -146.84, 262.35};
+static const float P005[3] = {27.81, 231.52, 510.43};
+static const float P006[3] = {-27.81, 230.43, 509.76};
+static float P007[3] = {-46.09, -146.83, 265.84};
+static const float P008[3] = {-90, 103.84, 718.53};
+static const float P009[3] = {-131.1, -165.92, 834.85};
+static float P010[3] = {-27.81, -285.31, 500};
+static float P011[3] = {27.81, -285.32, 500};
+static const float P012[3] = {147.96, -170.89, 845.5};
+static const float P013[3] = {180, 0, 2000};
+static const float P014[3] = {145.62, 352.67, 2000};
+static const float P015[3] = {55.62, 570.63, 2000};
+static const float P016[3] = {-55.62, 570.64, 2000};
+static const float P017[3] = {-145.62, 352.68, 2000};
+static const float P018[3] = {-180, 0.01, 2000};
+static const float P019[3] = {-178.2, -352.66, 2001.61};
+static const float P020[3] = {-55.63, -570.63, 2000};
+static const float P021[3] = {55.62, -570.64, 2000};
+static const float P022[3] = {179.91, -352.69, 1998.39};
+static float P023[3] = {150, 0, 3000};
+static float P024[3] = {121.35, 293.89, 3000};
+static float P025[3] = {46.35, 502.93, 2883.09};
+static float P026[3] = {-46.35, 497.45, 2877.24};
+static float P027[3] = {-121.35, 293.9, 3000};
+static float P028[3] = {-150, 0, 3000};
+static float P029[3] = {-152.21, -304.84, 2858.68};
+static float P030[3] = {-46.36, -475.52, 3000};
+static float P031[3] = {46.35, -475.53, 3000};
+static float P032[3] = {155.64, -304.87, 2863.5};
+static float P033[3] = {90, 0, 4000};
+static float P034[3] = {72.81, 176.33, 4000};
+static float P035[3] = {27.81, 285.32, 4000};
+static float P036[3] = {-27.81, 285.32, 4000};
+static float P037[3] = {-72.81, 176.34, 4000};
+static float P038[3] = {-90, 0, 4000};
+static float P039[3] = {-72.81, -176.33, 4000};
+static float P040[3] = {-27.81, -285.31, 4000};
+static float P041[3] = {27.81, -285.32, 4000};
+static float P042[3] = {72.81, -176.34, 4000};
+static float P043[3] = {30, 0, 5000};
+static float P044[3] = {24.27, 58.78, 5000};
+static float P045[3] = {9.27, 95.11, 5000};
+static float P046[3] = {-9.27, 95.11, 5000};
+static float P047[3] = {-24.27, 58.78, 5000};
+static float P048[3] = {-30, 0, 5000};
+static float P049[3] = {-24.27, -58.78, 5000};
+static float P050[3] = {-9.27, -95.1, 5000};
+static float P051[3] = {9.27, -95.11, 5000};
+static float P052[3] = {24.27, -58.78, 5000};
+#if 0
+static const float P053[3] = {0, 0, 0};
+static const float P054[3] = {0, 0, 0};
+static const float P055[3] = {0, 0, 0};
+static const float P056[3] = {0, 0, 0};
+static const float P057[3] = {0, 0, 0};
+#endif
+static const float P058[3] = {0, 1212.72, 2703.08};
+static const float P059[3] = {50.36, 0, 108.14};
+static const float P060[3] = {-22.18, 0, 108.14};
+static float P061[3] = {0, 1181.61, 6344.65};
+static const float P062[3] = {516.45, -887.08, 2535.45};
+static const float P063[3] = {-545.69, -879.31, 2555.63};
+static const float P064[3] = {618.89, -1005.64, 2988.32};
+static const float P065[3] = {-635.37, -1014.79, 2938.68};
+static const float P066[3] = {0, 1374.43, 3064.18};
+#if 0
+static const float P067[3] = {158.49, -11.89, 1401.56};
+static const float P068[3] = {-132.08, -17.9, 1394.31};
+#endif
+static float P069[3] = {0, -418.25, 5765.04};
+static float P070[3] = {0, 1266.91, 6629.6};
+static const float P071[3] = {-139.12, -124.96, 997.98};
+static const float P072[3] = {-139.24, -110.18, 1020.68};
+static const float P073[3] = {-137.33, -94.52, 1022.63};
+static const float P074[3] = {-137.03, -79.91, 996.89};
+static const float P075[3] = {-135.21, -91.48, 969.14};
+static const float P076[3] = {-135.39, -110.87, 968.76};
+static const float P077[3] = {150.23, -78.44, 995.53};
+static const float P078[3] = {152.79, -92.76, 1018.46};
+static const float P079[3] = {154.19, -110.2, 1020.55};
+static const float P080[3] = {151.33, -124.15, 993.77};
+static const float P081[3] = {150.49, -111.19, 969.86};
+static const float P082[3] = {150.79, -92.41, 969.7};
+static const float iP002[3] = {0, -36.59, 5687.72};
+static const float iP004[3] = {58.24, -146.84, 262.35};
+static const float iP007[3] = {-46.09, -146.83, 265.84};
+static const float iP010[3] = {-27.81, -285.31, 500};
+static const float iP011[3] = {27.81, -285.32, 500};
+static const float iP023[3] = {150, 0, 3000};
+static const float iP024[3] = {121.35, 293.89, 3000};
+static const float iP025[3] = {46.35, 502.93, 2883.09};
+static const float iP026[3] = {-46.35, 497.45, 2877.24};
+static const float iP027[3] = {-121.35, 293.9, 3000};
+static const float iP028[3] = {-150, 0, 3000};
+static const float iP029[3] = {-121.35, -304.84, 2853.86};
+static const float iP030[3] = {-46.36, -475.52, 3000};
+static const float iP031[3] = {46.35, -475.53, 3000};
+static const float iP032[3] = {121.35, -304.87, 2853.86};
+static const float iP033[3] = {90, 0, 4000};
+static const float iP034[3] = {72.81, 176.33, 4000};
+static const float iP035[3] = {27.81, 285.32, 4000};
+static const float iP036[3] = {-27.81, 285.32, 4000};
+static const float iP037[3] = {-72.81, 176.34, 4000};
+static const float iP038[3] = {-90, 0, 4000};
+static const float iP039[3] = {-72.81, -176.33, 4000};
+static const float iP040[3] = {-27.81, -285.31, 4000};
+static const float iP041[3] = {27.81, -285.32, 4000};
+static const float iP042[3] = {72.81, -176.34, 4000};
+static const float iP043[3] = {30, 0, 5000};
+static const float iP044[3] = {24.27, 58.78, 5000};
+static const float iP045[3] = {9.27, 95.11, 5000};
+static const float iP046[3] = {-9.27, 95.11, 5000};
+static const float iP047[3] = {-24.27, 58.78, 5000};
+static const float iP048[3] = {-30, 0, 5000};
+static const float iP049[3] = {-24.27, -58.78, 5000};
+static const float iP050[3] = {-9.27, -95.1, 5000};
+static const float iP051[3] = {9.27, -95.11, 5000};
+static const float iP052[3] = {24.27, -58.78, 5000};
+#if 0
+static const float iP053[3] = {0, 0, 0};
+#endif
+static const float iP061[3] = {0, 1181.61, 6344.65};
+static const float iP069[3] = {0, -418.25, 5765.04};
+static const float iP070[3] = {0, 1266.91, 6629.6};
+/* *INDENT-ON* */
+
+
+
+static void
+Fish001(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N007);
+ glVertex3fv(P007);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N004);
+ glVertex3fv(P004);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glNormal3fv(N007);
+ glVertex3fv(P007);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N004);
+ glVertex3fv(P004);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P071);
+ glVertex3fv(P072);
+ glVertex3fv(P073);
+ glVertex3fv(P074);
+ glVertex3fv(P075);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P077);
+ glVertex3fv(P078);
+ glVertex3fv(P079);
+ glVertex3fv(P080);
+ glVertex3fv(P081);
+ glVertex3fv(P082);
+ glEnd();
+}
+
+static void
+Fish002(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+}
+
+static void
+Fish003(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glEnd();
+}
+
+static void
+Fish004(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glNormal3fv(N061);
+ glVertex3fv(P061);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N061);
+ glVertex3fv(P061);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N061);
+ glVertex3fv(P061);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N061);
+ glVertex3fv(P061);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N061);
+ glVertex3fv(P061);
+ glEnd();
+}
+
+static void
+Fish005(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+}
+
+static void
+Fish006(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glEnd();
+}
+
+static void
+Fish007(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+}
+
+static void
+Fish008(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+}
+
+static void
+Fish009(GLenum cap)
+{
+ glBegin(cap);
+ glVertex3fv(P059);
+ glVertex3fv(P012);
+ glVertex3fv(P009);
+ glVertex3fv(P060);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P012);
+ glVertex3fv(P004);
+ glVertex3fv(P007);
+ glVertex3fv(P009);
+ glEnd();
+}
+
+static void
+Fish_1(GLenum cap)
+{
+ Fish004(cap);
+ Fish005(cap);
+ Fish003(cap);
+ Fish007(cap);
+ Fish006(cap);
+ Fish002(cap);
+ Fish008(cap);
+ Fish009(cap);
+ Fish001(cap);
+}
+
+static void
+Fish_2(GLenum cap)
+{
+ Fish005(cap);
+ Fish004(cap);
+ Fish003(cap);
+ Fish008(cap);
+ Fish006(cap);
+ Fish002(cap);
+ Fish007(cap);
+ Fish009(cap);
+ Fish001(cap);
+}
+
+static void
+Fish_3(GLenum cap)
+{
+ Fish005(cap);
+ Fish004(cap);
+ Fish007(cap);
+ Fish003(cap);
+ Fish002(cap);
+ Fish008(cap);
+ Fish009(cap);
+ Fish001(cap);
+ Fish006(cap);
+}
+
+static void
+Fish_4(GLenum cap)
+{
+ Fish005(cap);
+ Fish004(cap);
+ Fish008(cap);
+ Fish003(cap);
+ Fish002(cap);
+ Fish007(cap);
+ Fish009(cap);
+ Fish001(cap);
+ Fish006(cap);
+}
+
+static void
+Fish_5(GLenum cap)
+{
+ Fish009(cap);
+ Fish006(cap);
+ Fish007(cap);
+ Fish001(cap);
+ Fish002(cap);
+ Fish003(cap);
+ Fish008(cap);
+ Fish004(cap);
+ Fish005(cap);
+}
+
+static void
+Fish_6(GLenum cap)
+{
+ Fish009(cap);
+ Fish006(cap);
+ Fish008(cap);
+ Fish001(cap);
+ Fish002(cap);
+ Fish007(cap);
+ Fish003(cap);
+ Fish004(cap);
+ Fish005(cap);
+}
+
+static void
+Fish_7(GLenum cap)
+{
+ Fish009(cap);
+ Fish001(cap);
+ Fish007(cap);
+ Fish005(cap);
+ Fish002(cap);
+ Fish008(cap);
+ Fish003(cap);
+ Fish004(cap);
+ Fish006(cap);
+}
+
+static void
+Fish_8(GLenum cap)
+{
+ Fish009(cap);
+ Fish008(cap);
+ Fish001(cap);
+ Fish002(cap);
+ Fish007(cap);
+ Fish003(cap);
+ Fish005(cap);
+ Fish004(cap);
+ Fish006(cap);
+}
+
+void
+DrawShark(fishRec * fish, int wire)
+{
+ float mat[4][4];
+ int n;
+ float seg1, seg2, seg3, seg4, segup;
+ float thrash, chomp;
+ GLenum cap;
+
+ fish->htail = (int) (fish->htail - (int) (5 * fish->v)) % 360;
+
+ thrash = 50 * fish->v;
+
+ seg1 = 0.6 * thrash * sin(fish->htail * RRAD);
+ seg2 = 1.8 * thrash * sin((fish->htail + 45) * RRAD);
+ seg3 = 3 * thrash * sin((fish->htail + 90) * RRAD);
+ seg4 = 4 * thrash * sin((fish->htail + 110) * RRAD);
+
+ chomp = 0;
+ if (fish->v > 2) {
+ chomp = -(fish->v - 2) * 200;
+ }
+ P004[1] = iP004[1] + chomp;
+ P007[1] = iP007[1] + chomp;
+ P010[1] = iP010[1] + chomp;
+ P011[1] = iP011[1] + chomp;
+
+ P023[0] = iP023[0] + seg1;
+ P024[0] = iP024[0] + seg1;
+ P025[0] = iP025[0] + seg1;
+ P026[0] = iP026[0] + seg1;
+ P027[0] = iP027[0] + seg1;
+ P028[0] = iP028[0] + seg1;
+ P029[0] = iP029[0] + seg1;
+ P030[0] = iP030[0] + seg1;
+ P031[0] = iP031[0] + seg1;
+ P032[0] = iP032[0] + seg1;
+ P033[0] = iP033[0] + seg2;
+ P034[0] = iP034[0] + seg2;
+ P035[0] = iP035[0] + seg2;
+ P036[0] = iP036[0] + seg2;
+ P037[0] = iP037[0] + seg2;
+ P038[0] = iP038[0] + seg2;
+ P039[0] = iP039[0] + seg2;
+ P040[0] = iP040[0] + seg2;
+ P041[0] = iP041[0] + seg2;
+ P042[0] = iP042[0] + seg2;
+ P043[0] = iP043[0] + seg3;
+ P044[0] = iP044[0] + seg3;
+ P045[0] = iP045[0] + seg3;
+ P046[0] = iP046[0] + seg3;
+ P047[0] = iP047[0] + seg3;
+ P048[0] = iP048[0] + seg3;
+ P049[0] = iP049[0] + seg3;
+ P050[0] = iP050[0] + seg3;
+ P051[0] = iP051[0] + seg3;
+ P052[0] = iP052[0] + seg3;
+ P002[0] = iP002[0] + seg4;
+ P061[0] = iP061[0] + seg4;
+ P069[0] = iP069[0] + seg4;
+ P070[0] = iP070[0] + seg4;
+
+ fish->vtail += ((fish->dtheta - fish->vtail) * 0.1);
+
+ if (fish->vtail > 0.5) {
+ fish->vtail = 0.5;
+ } else if (fish->vtail < -0.5) {
+ fish->vtail = -0.5;
+ }
+ segup = thrash * fish->vtail;
+
+ P023[1] = iP023[1] + segup;
+ P024[1] = iP024[1] + segup;
+ P025[1] = iP025[1] + segup;
+ P026[1] = iP026[1] + segup;
+ P027[1] = iP027[1] + segup;
+ P028[1] = iP028[1] + segup;
+ P029[1] = iP029[1] + segup;
+ P030[1] = iP030[1] + segup;
+ P031[1] = iP031[1] + segup;
+ P032[1] = iP032[1] + segup;
+ P033[1] = iP033[1] + segup * 5;
+ P034[1] = iP034[1] + segup * 5;
+ P035[1] = iP035[1] + segup * 5;
+ P036[1] = iP036[1] + segup * 5;
+ P037[1] = iP037[1] + segup * 5;
+ P038[1] = iP038[1] + segup * 5;
+ P039[1] = iP039[1] + segup * 5;
+ P040[1] = iP040[1] + segup * 5;
+ P041[1] = iP041[1] + segup * 5;
+ P042[1] = iP042[1] + segup * 5;
+ P043[1] = iP043[1] + segup * 12;
+ P044[1] = iP044[1] + segup * 12;
+ P045[1] = iP045[1] + segup * 12;
+ P046[1] = iP046[1] + segup * 12;
+ P047[1] = iP047[1] + segup * 12;
+ P048[1] = iP048[1] + segup * 12;
+ P049[1] = iP049[1] + segup * 12;
+ P050[1] = iP050[1] + segup * 12;
+ P051[1] = iP051[1] + segup * 12;
+ P052[1] = iP052[1] + segup * 12;
+ P002[1] = iP002[1] + segup * 17;
+ P061[1] = iP061[1] + segup * 17;
+ P069[1] = iP069[1] + segup * 17;
+ P070[1] = iP070[1] + segup * 17;
+
+ glPushMatrix();
+
+ glTranslatef(0, 0, -3000);
+
+ glGetFloatv(GL_MODELVIEW_MATRIX, &mat[0][0]);
+ n = 0;
+ if (mat[0][2] >= 0) {
+ n += 1;
+ }
+ if (mat[1][2] >= 0) {
+ n += 2;
+ }
+ if (mat[2][2] >= 0) {
+ n += 4;
+ }
+ glScalef(2, 1, 1);
+
+ glEnable(GL_CULL_FACE);
+ cap = wire ? GL_LINE_LOOP : GL_POLYGON;
+ switch (n) {
+ case 0:
+ Fish_1(cap);
+ break;
+ case 1:
+ Fish_2(cap);
+ break;
+ case 2:
+ Fish_3(cap);
+ break;
+ case 3:
+ Fish_4(cap);
+ break;
+ case 4:
+ Fish_5(cap);
+ break;
+ case 5:
+ Fish_6(cap);
+ break;
+ case 6:
+ Fish_7(cap);
+ break;
+ case 7:
+ Fish_8(cap);
+ break;
+ }
+ glDisable(GL_CULL_FACE);
+
+ glPopMatrix();
+}
+#endif
diff --git a/hacks/glx/ships.c b/hacks/glx/ships.c
new file mode 100644
index 0000000..a2fb36c
--- /dev/null
+++ b/hacks/glx/ships.c
@@ -0,0 +1,4976 @@
+/* Generated from "ships.dxf" on 28-Jan-2018.
+ Faceted face normals. Normalized to unit bounding box.
+ Components: ship1, ship2, ship3, ship4, ship5, ship6, ship7, ship8.
+ */
+
+#include "gllist.h"
+
+static const float ships_ship1_data[] = {
+ 0,1,0,0.116962,0,0.06683,
+ 0,1,0,0.155077,0,0.058558,
+ 0,1,0,0.116882,0,0.064477,
+ 0,1,0,0.155077,0,0.058558,
+ 0,1,0,0.116962,0,0.06683,
+ 0,1,0,0.183794,0,0.06683,
+ 0,1,0,0.155077,0,0.058558,
+ 0,1,0,0.183794,0,0.06683,
+ 0,1,0,0.165867,0,0.042832,
+ 0,1,0,0.165867,0,0.042832,
+ 0,1,0,0.183794,0,0.06683,
+ 0,1,0,0.182076,0,-0.033078,
+ 0,1,0,0.182076,0,-0.033078,
+ 0,1,0,0.183794,0,0.06683,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.183794,0,0.06683,
+ 0,1,0,0.206431,0,0.085132,
+ 0,1,0,0.144982,0,0.047158,
+ 0,1,0,0.144464,0,-0.025545,
+ 0,1,0,0.142517,0,-0.008241,
+ 0,1,0,0.144464,0,-0.025545,
+ 0,1,0,0.144982,0,0.047158,
+ 0,1,0,0.150519,0,0.014247,
+ 0,1,0,0.144464,0,-0.025545,
+ 0,1,0,0.150519,0,0.014247,
+ 0,1,0,0.182076,0,-0.033078,
+ 0,1,0,0.150519,0,0.014247,
+ 0,1,0,0.144982,0,0.047158,
+ 0,1,0,0.145659,0,0.055321,
+ 0,1,0,0.150519,0,0.014247,
+ 0,1,0,0.145659,0,0.055321,
+ 0,1,0,0.148882,0,0.056932,
+ 0,1,0,0.182076,0,-0.033078,
+ 0,1,0,0.150519,0,0.014247,
+ 0,1,0,0.165867,0,0.042832,
+ 0,1,0,0.563884,0,0.184308,
+ 0,1,0,0.588726,0,-0.050731,
+ 0,1,0,0.505825,0,0.177803,
+ 0,1,0,0.588726,0,-0.050731,
+ 0,1,0,0.563884,0,0.184308,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.588726,0,-0.050731,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.651336,0,-0.055351,
+ 0,1,0,0.651336,0,-0.055351,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.654279,0,-0.056707,
+ 0,1,0,0.175726,0,0.171966,
+ 0,1,0,0.206431,0,0.085132,
+ 0,1,0,0.171797,0,0.170156,
+ 0,1,0,0.206431,0,0.085132,
+ 0,1,0,0.175726,0,0.171966,
+ 0,1,0,0.194183,0,0.133925,
+ 0,1,0,0.206431,0,0.085132,
+ 0,1,0,0.194183,0,0.133925,
+ 0,1,0,0.214272,0,0.096042,
+ 0,1,0,0.206431,0,0.085132,
+ 0,1,0,0.214272,0,0.096042,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.214272,0,0.096042,
+ 0,1,0,0.215488,0,0.116749,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.215488,0,0.116749,
+ 0,1,0,0.239742,0,0.126581,
+ 0,1,0,0.360276,0,-0.04832,
+ 0,1,0,0.182076,0,-0.033078,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.360276,0,-0.04832,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.360276,0,-0.04832,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.373485,0,-0.04699,
+ 0,1,0,0.373485,0,-0.04699,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.406711,0,-0.042205,
+ 0,1,0,0.322926,0,0.320583,
+ 0,1,0,0.32449,0,0.313371,
+ 0,1,0,0.301859,0,0.3108,
+ 0,1,0,0.32449,0,0.313371,
+ 0,1,0,0.322926,0,0.320583,
+ 0,1,0,0.324435,0,0.321321,
+ 0,1,0,0.32449,0,0.313371,
+ 0,1,0,0.324435,0,0.321321,
+ 0,1,0,0.334072,0,0.331602,
+ 0,1,0,0.32449,0,0.313371,
+ 0,1,0,0.334072,0,0.331602,
+ 0,1,0,0.332829,0,0.298122,
+ 0,1,0,0.336773,0,0.355518,
+ 0,1,0,0.334072,0,0.331602,
+ 0,1,0,0.332052,0,0.33913,
+ 0,1,0,0.334072,0,0.331602,
+ 0,1,0,0.336773,0,0.355518,
+ 0,1,0,0.334395,0,0.258292,
+ 0,1,0,0.342277,0,0.362383,
+ 0,1,0,0.336773,0,0.355518,
+ 0,1,0,0.305543,0,0.360518,
+ 0,1,0,0.34814,0,0.369892,
+ 0,1,0,0.347981,0,0.350547,
+ 0,1,0,0.344815,0,0.375591,
+ 0,1,0,0.347981,0,0.350547,
+ 0,1,0,0.34814,0,0.369892,
+ 0,1,0,0.353013,0,0.361538,
+ 0,1,0,0.347981,0,0.350547,
+ 0,1,0,0.353013,0,0.361538,
+ 0,1,0,0.362663,0,0.354466,
+ 0,1,0,0.362663,0,0.354466,
+ 0,1,0,0.353013,0,0.361538,
+ 0,1,0,0.393197,0,0.356483,
+ 0,1,0,0.362663,0,0.354466,
+ 0,1,0,0.393197,0,0.356483,
+ 0,1,0,0.378025,0,0.353893,
+ 0,1,0,0.378679,0,0.229386,
+ 0,1,0,0.368952,0,0.22393,
+ 0,1,0,0.361091,0,0.236693,
+ 0,1,0,0.374536,0,0.329731,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.347981,0,0.350547,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.374536,0,0.329731,
+ 0,1,0,0.369252,0,0.304088,
+ 0,1,0,0.369252,0,0.304088,
+ 0,1,0,0.374536,0,0.329731,
+ 0,1,0,0.375498,0,0.311907,
+ 0,1,0,0.378815,0,0.30157,
+ 0,1,0,0.371067,0,0.2787,
+ 0,1,0,0.369252,0,0.304088,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.371067,0,0.2787,
+ 0,1,0,0.409606,0,0.272745,
+ 0,1,0,0.371067,0,0.2787,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.369252,0,0.304088,
+ 0,1,0,0.329387,0,0.234545,
+ 0,1,0,0.368952,0,0.214645,
+ 0,1,0,0.311459,0,0.21872,
+ 0,1,0,0.368952,0,0.214645,
+ 0,1,0,0.329387,0,0.234545,
+ 0,1,0,0.334395,0,0.258292,
+ 0,1,0,0.368952,0,0.214645,
+ 0,1,0,0.334395,0,0.258292,
+ 0,1,0,0.361091,0,0.236693,
+ 0,1,0,0.361091,0,0.236693,
+ 0,1,0,0.334395,0,0.258292,
+ 0,1,0,0.336773,0,0.355518,
+ 0,1,0,0.361091,0,0.236693,
+ 0,1,0,0.336773,0,0.355518,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.336773,0,0.355518,
+ 0,1,0,0.342277,0,0.362383,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.342277,0,0.362383,
+ 0,1,0,0.343893,0,0.36804,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.343893,0,0.36804,
+ 0,1,0,0.344815,0,0.375591,
+ 0,1,0,0.355027,0,0.271558,
+ 0,1,0,0.344815,0,0.375591,
+ 0,1,0,0.347981,0,0.350547,
+ 0,1,0,0.368952,0,0.214645,
+ 0,1,0,0.361091,0,0.236693,
+ 0,1,0,0.368952,0,0.22393,
+ 0,1,0,0.25875,0,0.2828,
+ 0,1,0,0.267311,0,0.276092,
+ 0,1,0,0.25728,0,0.280552,
+ 0,1,0,0.267311,0,0.276092,
+ 0,1,0,0.25875,0,0.2828,
+ 0,1,0,0.273094,0,0.278099,
+ 0,1,0,0.273094,0,0.278099,
+ 0,1,0,0.25875,0,0.2828,
+ 0,1,0,0.303096,0,0.283554,
+ 0,1,0,0.267311,0,0.276092,
+ 0,1,0,0.273094,0,0.278099,
+ 0,1,0,0.267457,0,0.244485,
+ 0,1,0,0.273094,0,0.278099,
+ 0,1,0,0.303096,0,0.283554,
+ 0,1,0,0.325469,0,0.275657,
+ 0,1,0,0.325469,0,0.275657,
+ 0,1,0,0.303096,0,0.283554,
+ 0,1,0,0.320429,0,0.283567,
+ 0,1,0,0.325469,0,0.275657,
+ 0,1,0,0.320429,0,0.283567,
+ 0,1,0,0.332829,0,0.298122,
+ 0,1,0,0.325469,0,0.275657,
+ 0,1,0,0.332829,0,0.298122,
+ 0,1,0,0.334395,0,0.258292,
+ 0,1,0,0.334395,0,0.258292,
+ 0,1,0,0.332829,0,0.298122,
+ 0,1,0,0.334072,0,0.331602,
+ 0,1,0,0.273094,0,0.214646,
+ 0,1,0,0.267457,0,0.244485,
+ 0,1,0,0.273094,0,0.278099,
+ 0,1,0,0.418177,0,0.231171,
+ 0,1,0,0.409996,0,0.219049,
+ 0,1,0,0.409996,0,0.259494,
+ 0,1,0,0.409996,0,0.219049,
+ 0,1,0,0.418177,0,0.231171,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.418177,0,0.231171,
+ 0,1,0,0.418324,0,0.202436,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.395625,0,0.207154,
+ 0,1,0,0.409996,0,0.219049,
+ 0,1,0,0.505825,0,0.177803,
+ 0,1,0,0.495108,0,0.177713,
+ 0,1,0,0.495108,0,0.212769,
+ 0,1,0,0.406711,0,-0.042205,
+ 0,1,0,0.460766,0,0.175176,
+ 0,1,0,0.495108,0,0.177713,
+ 0,1,0,0.460766,0,0.175176,
+ 0,1,0,0.406711,0,-0.042205,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.460766,0,0.175176,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.42226,0,0.181691,
+ 0,1,0,0.495108,0,0.177713,
+ 0,1,0,0.44763,0,-0.044825,
+ 0,1,0,0.406711,0,-0.042205,
+ 0,1,0,0.44763,0,-0.044825,
+ 0,1,0,0.495108,0,0.177713,
+ 0,1,0,0.480357,0,-0.052799,
+ 0,1,0,0.480357,0,-0.052799,
+ 0,1,0,0.495108,0,0.177713,
+ 0,1,0,0.496626,0,-0.056372,
+ 0,1,0,0.496626,0,-0.056372,
+ 0,1,0,0.495108,0,0.177713,
+ 0,1,0,0.505825,0,0.177803,
+ 0,1,0,0.85052,0,0.207976,
+ 0,1,0,0.85018,0,-0.03742,
+ 0,1,0,0.786183,0,0.207755,
+ 0,1,0,0.85018,0,-0.03742,
+ 0,1,0,0.85052,0,0.207976,
+ 0,1,0,0.850681,0,0.089096,
+ 0,1,0,0.850681,0,0.089096,
+ 0,1,0,0.85052,0,0.207976,
+ 0,1,0,0.855957,0,0.183257,
+ 0,1,0,0.850681,0,0.089096,
+ 0,1,0,0.855957,0,0.183257,
+ 0,1,0,0.853091,0,0.109288,
+ 0,1,0,0.853091,0,0.109288,
+ 0,1,0,0.855957,0,0.183257,
+ 0,1,0,0.862404,0,0.162275,
+ 0,1,0,0.853091,0,0.109288,
+ 0,1,0,0.862404,0,0.162275,
+ 0,1,0,0.865092,0,0.162319,
+ 0,1,0,0.725123,0,0.201897,
+ 0,1,0,0.858149,0,-0.077347,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.858149,0,-0.077347,
+ 0,1,0,0.725123,0,0.201897,
+ 0,1,0,0.786183,0,0.207755,
+ 0,1,0,0.858149,0,-0.077347,
+ 0,1,0,0.786183,0,0.207755,
+ 0,1,0,0.85018,0,-0.03742,
+ 0,1,0,0.858149,0,-0.077347,
+ 0,1,0,0.85018,0,-0.03742,
+ 0,1,0,0.85643,0,-0.06679,
+ 0,1,0,0.856701,0,0.198121,
+ 0,1,0,0.855957,0,0.183257,
+ 0,1,0,0.85052,0,0.207976,
+ 0,1,0,0.855957,0,0.183257,
+ 0,1,0,0.856701,0,0.198121,
+ 0,1,0,0.871968,0,0.193412,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.66245,0,-0.066583,
+ 0,1,0,0.654279,0,-0.056707,
+ 0,1,0,0.66245,0,-0.066583,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.77276,0,-0.075247,
+ 0,1,0,0.77276,0,-0.075247,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.7813,0,-0.067188,
+ 0,1,0,0.7813,0,-0.067188,
+ 0,1,0,0.691269,0,0.197453,
+ 0,1,0,0.858149,0,-0.077347,
+ 0,1,0,0.282027,0,0.139433,
+ 0,1,0,0.281231,0,0.130089,
+ 0,1,0,0.202972,0,0.139577,
+ 0,1,0,0.292538,0,0.191458,
+ 0,1,0,0.28622,0,0.16455,
+ 0,1,0,0.283073,0,0.18298,
+ 0,1,0,0.281231,0,0.130089,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.268468,0,0.112678,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.281231,0,0.130089,
+ 0,1,0,0.282027,0,0.139433,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.282027,0,0.139433,
+ 0,1,0,0.28622,0,0.16455,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.28622,0,0.16455,
+ 0,1,0,0.292538,0,0.191458,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.292538,0,0.191458,
+ 0,1,0,0.294058,0,0.21557,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.294058,0,0.21557,
+ 0,1,0,0.311459,0,0.21872,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.311459,0,0.21872,
+ 0,1,0,0.368952,0,0.214645,
+ 0,1,0,0.41681,0,0.172841,
+ 0,1,0,0.368952,0,0.214645,
+ 0,1,0,0.395625,0,0.207154,
+ 0,1,0,0.588726,0,-0.050731,
+ 0,1,0,0.496626,0,-0.056372,
+ 0,1,0,0.505825,0,0.177803,
+ 0,1,0,0.34814,0,0.466117,
+ 0,1,0,0.344815,0,0.375591,
+ 0,1,0,0.344815,0,0.466117,
+ 0,1,0,0.344815,0,0.375591,
+ 0,1,0,0.34814,0,0.466117,
+ 0,1,0,0.34814,0,0.369892
+};
+static const struct gllist ships_ship1_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 318, ships_ship1_data, 0
+};
+const struct gllist *ships_ship1 = &ships_ship1_frame;
+
+static const float ships_ship2_data[] = {
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.082078,0,-0.023373,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.007746,0,0.002005,
+ 0,1,0,0.000601,0,-0.005265,
+ 0,1,0,-0.000907,0,-0.004103,
+ 0,1,0,0.000601,0,-0.005265,
+ 0,1,0,0.007746,0,0.002005,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.007746,0,0.002005,
+ 0,1,0,0.011124,0,0.003295,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.011124,0,0.003295,
+ 0,1,0,0.034381,0,0.008035,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.034381,0,0.008035,
+ 0,1,0,0.036326,0,0.008049,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.036326,0,0.008049,
+ 0,1,0,0.04544,0,0.006283,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.04544,0,0.006283,
+ 0,1,0,0.046047,0,0.005835,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.046047,0,0.005835,
+ 0,1,0,0.082078,0,-0.023373,
+ 0,1,0,0.05233,0,-0.01634,
+ 0,1,0,0.082078,0,-0.023373,
+ 0,1,0,0.056496,0,-0.017817,
+ 0,1,0,0.05539,0,0.015178,
+ 0,1,0,0.082078,0,-0.023373,
+ 0,1,0,0.046047,0,0.005835,
+ 0,1,0,0.082078,0,-0.023373,
+ 0,1,0,0.05539,0,0.015178,
+ 0,1,0,0.114262,0,0.021494,
+ 0,1,0,0.082078,0,-0.023373,
+ 0,1,0,0.114262,0,0.021494,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.114262,0,0.021494,
+ 0,1,0,0.115443,0,0.022381,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.115443,0,0.022381,
+ 0,1,0,0.135675,0,0.029186,
+ 0,1,0,0.135675,0,0.029186,
+ 0,1,0,0.115443,0,0.022381,
+ 0,1,0,0.123036,0,0.035357,
+ 0,1,0,0.135675,0,0.029186,
+ 0,1,0,0.123036,0,0.035357,
+ 0,1,0,0.125791,0,0.037178,
+ 0,1,0,0.135675,0,0.029186,
+ 0,1,0,0.125791,0,0.037178,
+ 0,1,0,0.128954,0,0.038029,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.135675,0,0.029186,
+ 0,1,0,0.149603,0,0.030315,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.149603,0,0.030315,
+ 0,1,0,0.155902,0,0.031606,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.155902,0,0.031606,
+ 0,1,0,0.19146,0,0.034085,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.19146,0,0.034085,
+ 0,1,0,0.215206,0,0.033981,
+ 0,1,0,0.215206,0,0.033981,
+ 0,1,0,0.19146,0,0.034085,
+ 0,1,0,0.198656,0,0.03732,
+ 0,1,0,0.215206,0,0.033981,
+ 0,1,0,0.198656,0,0.03732,
+ 0,1,0,0.204208,0,0.039424,
+ 0,1,0,0.215206,0,0.033981,
+ 0,1,0,0.204208,0,0.039424,
+ 0,1,0,0.205257,0,0.039407,
+ 0,1,0,0.148814,0,0.110426,
+ 0,1,0,0.15748,0,0.109506,
+ 0,1,0,0.149603,0,0.030315,
+ 0,1,0,0.15748,0,0.109506,
+ 0,1,0,0.148814,0,0.110426,
+ 0,1,0,0.159954,0,0.112868,
+ 0,1,0,0.159954,0,0.112868,
+ 0,1,0,0.148814,0,0.110426,
+ 0,1,0,0.166818,0,0.122163,
+ 0,1,0,0.149603,0,0.030315,
+ 0,1,0,0.15748,0,0.109506,
+ 0,1,0,0.155902,0,0.031606,
+ 0,1,0,0.159954,0,0.112868,
+ 0,1,0,0.166818,0,0.122163,
+ 0,1,0,0.166936,0,0.115979,
+ 0,1,0,0.166936,0,0.115979,
+ 0,1,0,0.166818,0,0.122163,
+ 0,1,0,0.167792,0,0.118769,
+ 0,1,0,0.19581,0,0.059166,
+ 0,1,0,0.19146,0,0.034085,
+ 0,1,0,0.189765,0,0.059166,
+ 0,1,0,0.19146,0,0.034085,
+ 0,1,0,0.19581,0,0.059166,
+ 0,1,0,0.198656,0,0.03732,
+ 0,1,0,0.239422,0,0.050277,
+ 0,1,0,0.241019,0,0.031691,
+ 0,1,0,0.229393,0,0.036323,
+ 0,1,0,0.241019,0,0.031691,
+ 0,1,0,0.239422,0,0.050277,
+ 0,1,0,0.243607,0,0.051238,
+ 0,1,0,0.241019,0,0.031691,
+ 0,1,0,0.243607,0,0.051238,
+ 0,1,0,0.247913,0,0.050436,
+ 0,1,0,0.256691,0,0.038188,
+ 0,1,0,0.275723,0,0.033421,
+ 0,1,0,0.252993,0,0.034769,
+ 0,1,0,0.275723,0,0.033421,
+ 0,1,0,0.256691,0,0.038188,
+ 0,1,0,0.256714,0,0.038965,
+ 0,1,0,0.275723,0,0.033421,
+ 0,1,0,0.256714,0,0.038965,
+ 0,1,0,0.262006,0,0.043711,
+ 0,1,0,0.275723,0,0.033421,
+ 0,1,0,0.262006,0,0.043711,
+ 0,1,0,0.273095,0,0.046817,
+ 0,1,0,0.289924,0,0.059902,
+ 0,1,0,0.295792,0,0.032171,
+ 0,1,0,0.285549,0,0.033421,
+ 0,1,0,0.295792,0,0.032171,
+ 0,1,0,0.289924,0,0.059902,
+ 0,1,0,0.295191,0,0.059902,
+ 0,1,0,0.309389,0,0.113628,
+ 0,1,0,0.30392,0,0.107488,
+ 0,1,0,0.302842,0,0.109306,
+ 0,1,0,0.30392,0,0.107488,
+ 0,1,0,0.309389,0,0.113628,
+ 0,1,0,0.30413,0,0.105206,
+ 0,1,0,0.30413,0,0.105206,
+ 0,1,0,0.309389,0,0.113628,
+ 0,1,0,0.311562,0,0.078755,
+ 0,1,0,0.311562,0,0.078755,
+ 0,1,0,0.309389,0,0.113628,
+ 0,1,0,0.31579,0,0.077563,
+ 0,1,0,0.311562,0,0.078755,
+ 0,1,0,0.31579,0,0.077563,
+ 0,1,0,0.311665,0,0.071318,
+ 0,1,0,0.315386,0,0.144383,
+ 0,1,0,0.312981,0,0.131794,
+ 0,1,0,0.312651,0,0.133195,
+ 0,1,0,0.312981,0,0.131794,
+ 0,1,0,0.315386,0,0.144383,
+ 0,1,0,0.321788,0,0.1221,
+ 0,1,0,0.321788,0,0.1221,
+ 0,1,0,0.315386,0,0.144383,
+ 0,1,0,0.32648,0,0.141993,
+ 0,1,0,0.321788,0,0.1221,
+ 0,1,0,0.32648,0,0.141993,
+ 0,1,0,0.322054,0,0.120653,
+ 0,1,0,0.322054,0,0.120653,
+ 0,1,0,0.32648,0,0.141993,
+ 0,1,0,0.322874,0,0.096569,
+ 0,1,0,0.322874,0,0.096569,
+ 0,1,0,0.32648,0,0.141993,
+ 0,1,0,0.323482,0,0.093677,
+ 0,1,0,0.323449,0,0.083168,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.321915,0,0.077563,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.323449,0,0.083168,
+ 0,1,0,0.323482,0,0.093677,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.323482,0,0.093677,
+ 0,1,0,0.32648,0,0.141993,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.32648,0,0.141993,
+ 0,1,0,0.327612,0,0.134409,
+ 0,1,0,0.327612,0,0.134409,
+ 0,1,0,0.32648,0,0.141993,
+ 0,1,0,0.327459,0,0.138248,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.327612,0,0.134409,
+ 0,1,0,0.331449,0,0.108836,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.331449,0,0.108836,
+ 0,1,0,0.332251,0,0.082544,
+ 0,1,0,0.332251,0,0.082544,
+ 0,1,0,0.331449,0,0.108836,
+ 0,1,0,0.333204,0,0.102871,
+ 0,1,0,0.332251,0,0.082544,
+ 0,1,0,0.333204,0,0.102871,
+ 0,1,0,0.333121,0,0.093642,
+ 0,1,0,0.333121,0,0.093642,
+ 0,1,0,0.333204,0,0.102871,
+ 0,1,0,0.333462,0,0.095451,
+ 0,1,0,0.348516,0,0.105101,
+ 0,1,0,0.397365,0,0.086139,
+ 0,1,0,0.345482,0,0.078911,
+ 0,1,0,0.397365,0,0.086139,
+ 0,1,0,0.348516,0,0.105101,
+ 0,1,0,0.350483,0,0.11097,
+ 0,1,0,0.397365,0,0.086139,
+ 0,1,0,0.350483,0,0.11097,
+ 0,1,0,0.394512,0,0.087776,
+ 0,1,0,0.394512,0,0.087776,
+ 0,1,0,0.350483,0,0.11097,
+ 0,1,0,0.351201,0,0.1154,
+ 0,1,0,0.394512,0,0.087776,
+ 0,1,0,0.351201,0,0.1154,
+ 0,1,0,0.352062,0,0.133162,
+ 0,1,0,0.394512,0,0.087776,
+ 0,1,0,0.352062,0,0.133162,
+ 0,1,0,0.362231,0,0.135702,
+ 0,1,0,0.394512,0,0.087776,
+ 0,1,0,0.362231,0,0.135702,
+ 0,1,0,0.38958,0,0.099906,
+ 0,1,0,0.38958,0,0.099906,
+ 0,1,0,0.362231,0,0.135702,
+ 0,1,0,0.387409,0,0.108858,
+ 0,1,0,0.387409,0,0.108858,
+ 0,1,0,0.362231,0,0.135702,
+ 0,1,0,0.38428,0,0.198644,
+ 0,1,0,0.406915,0,0.152377,
+ 0,1,0,0.403253,0,0.135128,
+ 0,1,0,0.401572,0,0.147035,
+ 0,1,0,0.403253,0,0.135128,
+ 0,1,0,0.406915,0,0.152377,
+ 0,1,0,0.407934,0,0.130498,
+ 0,1,0,0.407934,0,0.130498,
+ 0,1,0,0.406915,0,0.152377,
+ 0,1,0,0.41953,0,0.148153,
+ 0,1,0,0.407934,0,0.130498,
+ 0,1,0,0.41953,0,0.148153,
+ 0,1,0,0.410269,0,0.08858,
+ 0,1,0,0.410269,0,0.08858,
+ 0,1,0,0.41953,0,0.148153,
+ 0,1,0,0.425347,0,0.083593,
+ 0,1,0,0.425347,0,0.083593,
+ 0,1,0,0.451234,0,0.037834,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.451234,0,0.037834,
+ 0,1,0,0.425347,0,0.083593,
+ 0,1,0,0.444133,0,0.07151,
+ 0,1,0,0.444133,0,0.07151,
+ 0,1,0,0.425347,0,0.083593,
+ 0,1,0,0.444133,0,0.084461,
+ 0,1,0,0.451234,0,0.037834,
+ 0,1,0,0.444133,0,0.07151,
+ 0,1,0,0.445707,0,0.066652,
+ 0,1,0,0.295792,0,0.032171,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.295792,0,0.032171,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.226528,0,0.034709,
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.218433,0,0.033347,
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.226528,0,0.034709,
+ 0,1,0,0.229393,0,0.036323,
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.229393,0,0.036323,
+ 0,1,0,0.241019,0,0.031691,
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.241019,0,0.031691,
+ 0,1,0,0.252993,0,0.034769,
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.252993,0,0.034769,
+ 0,1,0,0.275723,0,0.033421,
+ 0,1,0,0.27313,0,-0.03143,
+ 0,1,0,0.275723,0,0.033421,
+ 0,1,0,0.295792,0,0.032171,
+ 0,1,0,0.295792,0,0.032171,
+ 0,1,0,0.275723,0,0.033421,
+ 0,1,0,0.285549,0,0.033421,
+ 0,1,0,0.298627,0,0.033229,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.295792,0,0.032171,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.298627,0,0.033229,
+ 0,1,0,0.302246,0,0.036983,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.302246,0,0.036983,
+ 0,1,0,0.308875,0,0.065389,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.308875,0,0.065389,
+ 0,1,0,0.311665,0,0.071318,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.311665,0,0.071318,
+ 0,1,0,0.31579,0,0.077563,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.31579,0,0.077563,
+ 0,1,0,0.321915,0,0.077563,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.321915,0,0.077563,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.331265,0,0.078444,
+ 0,1,0,0.345482,0,0.078911,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.345482,0,0.078911,
+ 0,1,0,0.397365,0,0.086139,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.397365,0,0.086139,
+ 0,1,0,0.399049,0,0.086793,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.399049,0,0.086793,
+ 0,1,0,0.410269,0,0.08858,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.410269,0,0.08858,
+ 0,1,0,0.425347,0,0.083593,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.350411,0,0.198046,
+ 0,1,0,0.348022,0,0.202613,
+ 0,1,0,0.350411,0,0.198046,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.360613,0,0.196837,
+ 0,1,0,0.360613,0,0.196837,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.362231,0,0.157776,
+ 0,1,0,0.362231,0,0.157776,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.362244,0,0.144871,
+ 0,1,0,0.358945,0,0.220663,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.357496,0,0.219463,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.358945,0,0.220663,
+ 0,1,0,0.366627,0,0.223011,
+ 0,1,0,0.380369,0,0.324825,
+ 0,1,0,0.373861,0,0.224955,
+ 0,1,0,0.369225,0,0.227836,
+ 0,1,0,0.373861,0,0.224955,
+ 0,1,0,0.380369,0,0.324825,
+ 0,1,0,0.38352,0,0.322964,
+ 0,1,0,0.38352,0,0.322964,
+ 0,1,0,0.380369,0,0.324825,
+ 0,1,0,0.381407,0,0.329175,
+ 0,1,0,0.38352,0,0.322964,
+ 0,1,0,0.381407,0,0.329175,
+ 0,1,0,0.381858,0,0.329038,
+ 0,1,0,0.38352,0,0.322964,
+ 0,1,0,0.381858,0,0.329038,
+ 0,1,0,0.383958,0,0.323947,
+ 0,1,0,0.362244,0,0.144871,
+ 0,1,0,0.38428,0,0.198644,
+ 0,1,0,0.362231,0,0.135702,
+ 0,1,0,0.38428,0,0.198644,
+ 0,1,0,0.362244,0,0.144871,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.38428,0,0.198644,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.380949,0,0.201539,
+ 0,1,0,0.380949,0,0.201539,
+ 0,1,0,0.363156,0,0.202613,
+ 0,1,0,0.366627,0,0.223011,
+ 0,1,0,0.380949,0,0.201539,
+ 0,1,0,0.366627,0,0.223011,
+ 0,1,0,0.36848,0,0.224601,
+ 0,1,0,0.380949,0,0.201539,
+ 0,1,0,0.36848,0,0.224601,
+ 0,1,0,0.369225,0,0.227836,
+ 0,1,0,0.380949,0,0.201539,
+ 0,1,0,0.369225,0,0.227836,
+ 0,1,0,0.373861,0,0.224955,
+ 0,1,0,0.380949,0,0.201539,
+ 0,1,0,0.373861,0,0.224955,
+ 0,1,0,0.380949,0,0.223681,
+ 0,1,0,0.358191,0,0.154835,
+ 0,1,0,0.35916,0,0.147807,
+ 0,1,0,0.356002,0,0.149867,
+ 0,1,0,0.35916,0,0.147807,
+ 0,1,0,0.358191,0,0.154835,
+ 0,1,0,0.362231,0,0.157776,
+ 0,1,0,0.35916,0,0.147807,
+ 0,1,0,0.362231,0,0.157776,
+ 0,1,0,0.36019,0,0.147475,
+ 0,1,0,0.36019,0,0.147475,
+ 0,1,0,0.362231,0,0.157776,
+ 0,1,0,0.362244,0,0.144871,
+ 0,1,0,0.478811,0,0.092274,
+ 0,1,0,0.473165,0,0.036584,
+ 0,1,0,0.463625,0,0.042121,
+ 0,1,0,0.473165,0,0.036584,
+ 0,1,0,0.478811,0,0.092274,
+ 0,1,0,0.490493,0,0.092799,
+ 0,1,0,0.490493,0,0.092799,
+ 0,1,0,0.478811,0,0.092274,
+ 0,1,0,0.481892,0,0.096319,
+ 0,1,0,0.490493,0,0.092799,
+ 0,1,0,0.481892,0,0.096319,
+ 0,1,0,0.498402,0,0.106856,
+ 0,1,0,0.490493,0,0.092799,
+ 0,1,0,0.498402,0,0.106856,
+ 0,1,0,0.491729,0,0.094592,
+ 0,1,0,0.491729,0,0.094592,
+ 0,1,0,0.498402,0,0.106856,
+ 0,1,0,0.500624,0,0.09968,
+ 0,1,0,0.500624,0,0.09968,
+ 0,1,0,0.498402,0,0.106856,
+ 0,1,0,0.499526,0,0.10796,
+ 0,1,0,0.500624,0,0.09968,
+ 0,1,0,0.499526,0,0.10796,
+ 0,1,0,0.50155,0,0.101548,
+ 0,1,0,0.545711,0,0.050757,
+ 0,1,0,0.551148,0,0.030911,
+ 0,1,0,0.530999,0,0.030908,
+ 0,1,0,0.551148,0,0.030911,
+ 0,1,0,0.545711,0,0.050757,
+ 0,1,0,0.556558,0,0.03991,
+ 0,1,0,0.551148,0,0.030911,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.530999,0,0.030908,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.551148,0,0.030911,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.551148,0,0.030911,
+ 0,1,0,0.569784,0,0.030911,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.569784,0,0.030911,
+ 0,1,0,0.57627,0,0.03241,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.57627,0,0.03241,
+ 0,1,0,0.578786,0,0.032037,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.578786,0,0.032037,
+ 0,1,0,0.584034,0,0.028571,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.584034,0,0.028571,
+ 0,1,0,0.593555,0,0.027764,
+ 0,1,0,0.454472,0,0.039998,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.452392,0,0.034041,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.454472,0,0.039998,
+ 0,1,0,0.4559,0,0.041105,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.4559,0,0.041105,
+ 0,1,0,0.463625,0,0.042121,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.463625,0,0.042121,
+ 0,1,0,0.473165,0,0.036584,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.473165,0,0.036584,
+ 0,1,0,0.521992,0,0.026308,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.521992,0,0.026308,
+ 0,1,0,0.526188,0,0.027401,
+ 0,1,0,0.53283,0,-0.042382,
+ 0,1,0,0.526188,0,0.027401,
+ 0,1,0,0.530999,0,0.030908,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.593555,0,0.027764,
+ 0,1,0,0.61703,0,-0.045932,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.686573,0,0.025396,
+ 0,1,0,0.64097,0,0.065405,
+ 0,1,0,0.636461,0,0.040099,
+ 0,1,0,0.634712,0,0.065405,
+ 0,1,0,0.667649,0,0.066339,
+ 0,1,0,0.66702,0,0.042964,
+ 0,1,0,0.66702,0,0.066177,
+ 0,1,0,0.595342,0,0.029428,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.593555,0,0.027764,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.595342,0,0.029428,
+ 0,1,0,0.600274,0,0.047426,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.600274,0,0.047426,
+ 0,1,0,0.621236,0,0.041148,
+ 0,1,0,0.621236,0,0.041148,
+ 0,1,0,0.600274,0,0.047426,
+ 0,1,0,0.612783,0,0.047426,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.621236,0,0.041148,
+ 0,1,0,0.636461,0,0.040099,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.636461,0,0.040099,
+ 0,1,0,0.646435,0,0.040846,
+ 0,1,0,0.646435,0,0.040846,
+ 0,1,0,0.636461,0,0.040099,
+ 0,1,0,0.644949,0,0.043771,
+ 0,1,0,0.644949,0,0.043771,
+ 0,1,0,0.636461,0,0.040099,
+ 0,1,0,0.64097,0,0.065405,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.646435,0,0.040846,
+ 0,1,0,0.658856,0,0.033146,
+ 0,1,0,0.658856,0,0.033146,
+ 0,1,0,0.646435,0,0.040846,
+ 0,1,0,0.658114,0,0.033868,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.658856,0,0.033146,
+ 0,1,0,0.660833,0,0.041706,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.660833,0,0.041706,
+ 0,1,0,0.66702,0,0.042964,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.66702,0,0.042964,
+ 0,1,0,0.667649,0,0.066339,
+ 0,1,0,0.67251,0,0.024493,
+ 0,1,0,0.667649,0,0.066339,
+ 0,1,0,0.671724,0,0.060605,
+ 0,1,0,0.733263,0,0.068956,
+ 0,1,0,0.724391,0,0.035637,
+ 0,1,0,0.724391,0,0.067731,
+ 0,1,0,0.724391,0,0.035637,
+ 0,1,0,0.733263,0,0.068956,
+ 0,1,0,0.731575,0,0.035178,
+ 0,1,0,0.751012,0,0.070143,
+ 0,1,0,0.745822,0,0.032981,
+ 0,1,0,0.744276,0,0.067174,
+ 0,1,0,0.686573,0,0.025396,
+ 0,1,0,0.702004,0,0.036422,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.702004,0,0.036422,
+ 0,1,0,0.686573,0,0.025396,
+ 0,1,0,0.693908,0,0.039314,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.702004,0,0.036422,
+ 0,1,0,0.705222,0,0.035648,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.705222,0,0.035648,
+ 0,1,0,0.724391,0,0.035637,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.724391,0,0.035637,
+ 0,1,0,0.731575,0,0.035178,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.731575,0,0.035178,
+ 0,1,0,0.745822,0,0.032981,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.745822,0,0.032981,
+ 0,1,0,0.751012,0,0.070143,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.751012,0,0.070143,
+ 0,1,0,0.751251,0,0.069879,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.686573,0,0.025396,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.758328,0,0.022225,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.752838,0,0.022247,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.758328,0,0.022225,
+ 0,1,0,0.760717,0,0.023705,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.760717,0,0.023705,
+ 0,1,0,0.763686,0,0.029793,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.763686,0,0.029793,
+ 0,1,0,0.775494,0,0.029431,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.775494,0,0.029431,
+ 0,1,0,0.815305,0,0.030123,
+ 0,1,0,0.815305,0,0.030123,
+ 0,1,0,0.775494,0,0.029431,
+ 0,1,0,0.793924,0,0.030164,
+ 0,1,0,0.793924,0,0.030164,
+ 0,1,0,0.775494,0,0.029431,
+ 0,1,0,0.777172,0,0.032133,
+ 0,1,0,0.793924,0,0.030164,
+ 0,1,0,0.777172,0,0.032133,
+ 0,1,0,0.792169,0,0.030598,
+ 0,1,0,0.792169,0,0.030598,
+ 0,1,0,0.777172,0,0.032133,
+ 0,1,0,0.780437,0,0.034775,
+ 0,1,0,0.792169,0,0.030598,
+ 0,1,0,0.780437,0,0.034775,
+ 0,1,0,0.783285,0,0.035582,
+ 0,1,0,0.792169,0,0.030598,
+ 0,1,0,0.783285,0,0.035582,
+ 0,1,0,0.785043,0,0.03528,
+ 0,1,0,0.815305,0,0.030123,
+ 0,1,0,0.793924,0,0.030164,
+ 0,1,0,0.804859,0,0.033487,
+ 0,1,0,0.800558,0,0.159259,
+ 0,1,0,0.787813,0,0.145168,
+ 0,1,0,0.784219,0,0.148766,
+ 0,1,0,0.787813,0,0.145168,
+ 0,1,0,0.800558,0,0.159259,
+ 0,1,0,0.796022,0,0.149859,
+ 0,1,0,0.796022,0,0.149859,
+ 0,1,0,0.800558,0,0.159259,
+ 0,1,0,0.799435,0,0.133145,
+ 0,1,0,0.799435,0,0.133145,
+ 0,1,0,0.792353,0,0.128543,
+ 0,1,0,0.790974,0,0.134211,
+ 0,1,0,0.792353,0,0.128543,
+ 0,1,0,0.799435,0,0.133145,
+ 0,1,0,0.797658,0,0.124415,
+ 0,1,0,0.797658,0,0.124415,
+ 0,1,0,0.799435,0,0.133145,
+ 0,1,0,0.804859,0,0.033487,
+ 0,1,0,0.804859,0,0.033487,
+ 0,1,0,0.799435,0,0.133145,
+ 0,1,0,0.800558,0,0.159259,
+ 0,1,0,0.804859,0,0.033487,
+ 0,1,0,0.800558,0,0.159259,
+ 0,1,0,0.815305,0,0.030123,
+ 0,1,0,0.815305,0,0.030123,
+ 0,1,0,0.777658,0,-0.051804,
+ 0,1,0,0.773649,0,-0.052537,
+ 0,1,0,0.777658,0,-0.051804,
+ 0,1,0,0.815305,0,0.030123,
+ 0,1,0,0.845392,0,-0.047089,
+ 0,1,0,0.86606,0,0.023103,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.845392,0,-0.047089,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.86606,0,0.023103,
+ 0,1,0,0.886731,0,0.026124,
+ 0,1,0,0.841367,0,0.029285,
+ 0,1,0,0.845392,0,-0.047089,
+ 0,1,0,0.815305,0,0.030123,
+ 0,1,0,0.845392,0,-0.047089,
+ 0,1,0,0.841367,0,0.029285,
+ 0,1,0,0.851862,0,0.025179,
+ 0,1,0,0.845392,0,-0.047089,
+ 0,1,0,0.851862,0,0.025179,
+ 0,1,0,0.853977,0,0.024647,
+ 0,1,0,0.845392,0,-0.047089,
+ 0,1,0,0.853977,0,0.024647,
+ 0,1,0,0.86606,0,0.023103,
+ 0,1,0,0.886731,0,0.026124,
+ 0,1,0,0.86606,0,0.023103,
+ 0,1,0,0.879107,0,0.033745,
+ 0,1,0,0.93232,0,0.028568,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.886731,0,0.026124,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.93232,0,0.028568,
+ 0,1,0,0.936722,0,0.029307,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.936722,0,0.029307,
+ 0,1,0,0.941445,0,0.029359,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.941445,0,0.029359,
+ 0,1,0,0.942786,0,0.0299,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.942786,0,0.0299,
+ 0,1,0,0.955336,0,0.037642,
+ 0,1,0,0.957862,0,0.037913,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.955336,0,0.037642,
+ 0,1,0,0.964659,0,-0.059776,
+ 0,1,0,0.957862,0,0.037913,
+ 0,1,0,0.967828,0,0.035511
+};
+static const struct gllist ships_ship2_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 648, ships_ship2_data, 0
+};
+const struct gllist *ships_ship2 = &ships_ship2_frame;
+
+static const float ships_ship3_data[] = {
+ 0,1,0,0.015851,0,0.046394,
+ 0,1,0,0.015929,0,0.038282,
+ 0,1,0,0.014266,0,0.040885,
+ 0,1,0,0.015929,0,0.038282,
+ 0,1,0,0.015851,0,0.046394,
+ 0,1,0,0.018182,0,0.047508,
+ 0,1,0,0.015929,0,0.038282,
+ 0,1,0,0.018182,0,0.047508,
+ 0,1,0,0.019779,0,0.038229,
+ 0,1,0,0.019779,0,0.038229,
+ 0,1,0,0.018182,0,0.047508,
+ 0,1,0,0.035945,0,0.047566,
+ 0,1,0,0.019779,0,0.038229,
+ 0,1,0,0.035945,0,0.047566,
+ 0,1,0,0.02188,0,0.036875,
+ 0,1,0,0.02188,0,0.036875,
+ 0,1,0,0.035945,0,0.047566,
+ 0,1,0,0.029478,0,0.024544,
+ 0,1,0,0.029478,0,0.024544,
+ 0,1,0,0.035945,0,0.047566,
+ 0,1,0,0.037645,0,0.003234,
+ 0,1,0,0.037645,0,0.003234,
+ 0,1,0,0.035945,0,0.047566,
+ 0,1,0,0.042065,0,0.052086,
+ 0,1,0,0.037645,0,0.003234,
+ 0,1,0,0.042065,0,0.052086,
+ 0,1,0,0.040264,0,-0.011908,
+ 0,1,0,0.040264,0,-0.011908,
+ 0,1,0,0.042065,0,0.052086,
+ 0,1,0,0.040536,0,-0.021064,
+ 0,1,0,0.040536,0,-0.021064,
+ 0,1,0,0.042065,0,0.052086,
+ 0,1,0,0.041948,0,-0.030472,
+ 0,1,0,0.041948,0,-0.030472,
+ 0,1,0,0.042065,0,0.052086,
+ 0,1,0,0.053729,0,0.047541,
+ 0,1,0,0.053729,0,0.047541,
+ 0,1,0,0.042065,0,0.052086,
+ 0,1,0,0.044194,0,0.054994,
+ 0,1,0,0.053729,0,0.047541,
+ 0,1,0,0.044194,0,0.054994,
+ 0,1,0,0.049793,0,0.051119,
+ 0,1,0,0.049793,0,0.051119,
+ 0,1,0,0.044194,0,0.054994,
+ 0,1,0,0.048873,0,0.056721,
+ 0,1,0,0.049793,0,0.051119,
+ 0,1,0,0.048873,0,0.056721,
+ 0,1,0,0.049708,0,0.055744,
+ 0,1,0,0.295437,0,0.189535,
+ 0,1,0,0.295348,0,0.125306,
+ 0,1,0,0.292194,0,0.125174,
+ 0,1,0,0.295348,0,0.125306,
+ 0,1,0,0.295437,0,0.189535,
+ 0,1,0,0.298384,0,0.189681,
+ 0,1,0,0.298384,0,0.189681,
+ 0,1,0,0.295437,0,0.189535,
+ 0,1,0,0.29722,0,0.191215,
+ 0,1,0,0.290227,0,0.117533,
+ 0,1,0,0.295356,0,0.120633,
+ 0,1,0,0.289122,0,0.111447,
+ 0,1,0,0.295356,0,0.120633,
+ 0,1,0,0.290227,0,0.117533,
+ 0,1,0,0.292194,0,0.125174,
+ 0,1,0,0.295356,0,0.120633,
+ 0,1,0,0.292194,0,0.125174,
+ 0,1,0,0.295348,0,0.125306,
+ 0,1,0,0.053729,0,0.047541,
+ 0,1,0,0.045608,0,-0.036047,
+ 0,1,0,0.041948,0,-0.030472,
+ 0,1,0,0.045608,0,-0.036047,
+ 0,1,0,0.053729,0,0.047541,
+ 0,1,0,0.063489,0,-0.048855,
+ 0,1,0,0.063489,0,-0.048855,
+ 0,1,0,0.053729,0,0.047541,
+ 0,1,0,0.073036,0,0.047538,
+ 0,1,0,0.063489,0,-0.048855,
+ 0,1,0,0.073036,0,0.047538,
+ 0,1,0,0.07063,0,-0.057463,
+ 0,1,0,0.07063,0,-0.057463,
+ 0,1,0,0.073036,0,0.047538,
+ 0,1,0,0.071931,0,-0.074179,
+ 0,1,0,0.071931,0,-0.074179,
+ 0,1,0,0.073036,0,0.047538,
+ 0,1,0,0.073929,0,-0.07413,
+ 0,1,0,0.073929,0,-0.07413,
+ 0,1,0,0.073036,0,0.047538,
+ 0,1,0,0.080232,0,0.046154,
+ 0,1,0,0.073929,0,-0.07413,
+ 0,1,0,0.080232,0,0.046154,
+ 0,1,0,0.079608,0,-0.072847,
+ 0,1,0,0.079608,0,-0.072847,
+ 0,1,0,0.080232,0,0.046154,
+ 0,1,0,0.095979,0,0.048639,
+ 0,1,0,0.095979,0,0.048639,
+ 0,1,0,0.080232,0,0.046154,
+ 0,1,0,0.093136,0,0.048192,
+ 0,1,0,0.093136,0,0.048192,
+ 0,1,0,0.080232,0,0.046154,
+ 0,1,0,0.08401,0,0.04815,
+ 0,1,0,0.066853,0,-0.066771,
+ 0,1,0,0.071931,0,-0.074179,
+ 0,1,0,0.066006,0,-0.069836,
+ 0,1,0,0.071931,0,-0.074179,
+ 0,1,0,0.066853,0,-0.066771,
+ 0,1,0,0.068385,0,-0.066732,
+ 0,1,0,0.071931,0,-0.074179,
+ 0,1,0,0.068385,0,-0.066732,
+ 0,1,0,0.07063,0,-0.057463,
+ 0,1,0,0.095979,0,0.048639,
+ 0,1,0,0.095594,0,-0.07618,
+ 0,1,0,0.079608,0,-0.072847,
+ 0,1,0,0.095594,0,-0.07618,
+ 0,1,0,0.095979,0,0.048639,
+ 0,1,0,0.107623,0,-0.080766,
+ 0,1,0,0.107623,0,-0.080766,
+ 0,1,0,0.095979,0,0.048639,
+ 0,1,0,0.099578,0,0.054939,
+ 0,1,0,0.107623,0,-0.080766,
+ 0,1,0,0.099578,0,0.054939,
+ 0,1,0,0.104217,0,0.056863,
+ 0,1,0,0.107623,0,-0.080766,
+ 0,1,0,0.104217,0,0.056863,
+ 0,1,0,0.112866,0,0.056826,
+ 0,1,0,0.107623,0,-0.080766,
+ 0,1,0,0.112866,0,0.056826,
+ 0,1,0,0.112866,0,0.049101,
+ 0,1,0,0.107623,0,-0.080766,
+ 0,1,0,0.112866,0,0.049101,
+ 0,1,0,0.117782,0,-0.082199,
+ 0,1,0,0.117782,0,-0.082199,
+ 0,1,0,0.112866,0,0.049101,
+ 0,1,0,0.120566,0,0.049101,
+ 0,1,0,0.117782,0,-0.082199,
+ 0,1,0,0.120566,0,0.049101,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.120566,0,0.049101,
+ 0,1,0,0.122811,0,0.049147,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.122811,0,0.049147,
+ 0,1,0,0.132573,0,0.050735,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.132573,0,0.050735,
+ 0,1,0,0.143604,0,0.049297,
+ 0,1,0,0.151725,0,0.053824,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.143604,0,0.049297,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.151725,0,0.053824,
+ 0,1,0,0.153019,0,0.055208,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.153019,0,0.055208,
+ 0,1,0,0.160992,0,0.05183,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.160992,0,0.05183,
+ 0,1,0,0.161772,0,0.050677,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.161772,0,0.050677,
+ 0,1,0,0.163342,0,0.052327,
+ 0,1,0,0.162074,0,-0.085334,
+ 0,1,0,0.163342,0,0.052327,
+ 0,1,0,0.164064,0,-0.086036,
+ 0,1,0,0.164064,0,-0.086036,
+ 0,1,0,0.163342,0,0.052327,
+ 0,1,0,0.179323,0,-0.085322,
+ 0,1,0,0.179323,0,-0.085322,
+ 0,1,0,0.163342,0,0.052327,
+ 0,1,0,0.210986,0,-0.085355,
+ 0,1,0,0.210986,0,-0.085355,
+ 0,1,0,0.163342,0,0.052327,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.164064,0,-0.086036,
+ 0,1,0,0.179323,0,-0.085322,
+ 0,1,0,0.174355,0,-0.086232,
+ 0,1,0,0.164004,0,0.058998,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.163342,0,0.052327,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.164004,0,0.058998,
+ 0,1,0,0.166036,0,0.0644,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.166036,0,0.0644,
+ 0,1,0,0.176335,0,0.078644,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.176335,0,0.078644,
+ 0,1,0,0.181777,0,0.081599,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.181777,0,0.081599,
+ 0,1,0,0.201083,0,0.081563,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.201083,0,0.081563,
+ 0,1,0,0.205442,0,0.082139,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.205442,0,0.082139,
+ 0,1,0,0.222419,0,0.080429,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.222419,0,0.080429,
+ 0,1,0,0.22596,0,0.081582,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.22596,0,0.081582,
+ 0,1,0,0.235552,0,0.080432,
+ 0,1,0,0.226909,0,-0.085975,
+ 0,1,0,0.235552,0,0.080432,
+ 0,1,0,0.242832,0,-0.086596,
+ 0,1,0,0.242832,0,-0.086596,
+ 0,1,0,0.235552,0,0.080432,
+ 0,1,0,0.262862,0,-0.08689,
+ 0,1,0,0.262862,0,-0.08689,
+ 0,1,0,0.235552,0,0.080432,
+ 0,1,0,0.283076,0,-0.088384,
+ 0,1,0,0.237151,0,0.081245,
+ 0,1,0,0.283076,0,-0.088384,
+ 0,1,0,0.235552,0,0.080432,
+ 0,1,0,0.283076,0,-0.088384,
+ 0,1,0,0.237151,0,0.081245,
+ 0,1,0,0.25104,0,0.090562,
+ 0,1,0,0.283076,0,-0.088384,
+ 0,1,0,0.25104,0,0.090562,
+ 0,1,0,0.262936,0,0.095569,
+ 0,1,0,0.283076,0,-0.088384,
+ 0,1,0,0.262936,0,0.095569,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.283076,0,-0.088384,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.336118,0,-0.084098,
+ 0,1,0,0.283076,0,-0.088384,
+ 0,1,0,0.336118,0,-0.084098,
+ 0,1,0,0.321823,0,-0.086865,
+ 0,1,0,0.278458,0,0.097208,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.262936,0,0.095569,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.278458,0,0.097208,
+ 0,1,0,0.284215,0,0.102654,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.284215,0,0.102654,
+ 0,1,0,0.288497,0,0.109486,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.288497,0,0.109486,
+ 0,1,0,0.289122,0,0.111447,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.289122,0,0.111447,
+ 0,1,0,0.295356,0,0.120633,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.295356,0,0.120633,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.350542,0,-0.081588,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.364966,0,-0.079077,
+ 0,1,0,0.298197,0,0.122344,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.295356,0,0.120633,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.298197,0,0.122344,
+ 0,1,0,0.305665,0,0.124623,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.305665,0,0.124623,
+ 0,1,0,0.322084,0,0.123258,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.322084,0,0.123258,
+ 0,1,0,0.325168,0,0.12322,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.325168,0,0.12322,
+ 0,1,0,0.33646,0,0.127836,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.33646,0,0.127836,
+ 0,1,0,0.357946,0,0.146587,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.357946,0,0.146587,
+ 0,1,0,0.362818,0,0.147952,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.362818,0,0.147952,
+ 0,1,0,0.385985,0,0.148029,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.385985,0,0.148029,
+ 0,1,0,0.396055,0,0.148029,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.396055,0,0.148029,
+ 0,1,0,0.397327,0,0.147452,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.397327,0,0.147452,
+ 0,1,0,0.39755,0,0.147372,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.39755,0,0.147372,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.402829,0,-0.069765,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.448393,0,-0.069842,
+ 0,1,0,0.448393,0,-0.069842,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.452983,0,-0.069752,
+ 0,1,0,0.387946,0,0.149451,
+ 0,1,0,0.396055,0,0.148029,
+ 0,1,0,0.385985,0,0.148029,
+ 0,1,0,0.396055,0,0.148029,
+ 0,1,0,0.387946,0,0.149451,
+ 0,1,0,0.392417,0,0.149679,
+ 0,1,0,0.392417,0,0.149679,
+ 0,1,0,0.387946,0,0.149451,
+ 0,1,0,0.389737,0,0.16196,
+ 0,1,0,0.392417,0,0.149679,
+ 0,1,0,0.389737,0,0.16196,
+ 0,1,0,0.391512,0,0.158236,
+ 0,1,0,0.391512,0,0.158236,
+ 0,1,0,0.389737,0,0.16196,
+ 0,1,0,0.391138,0,0.169794,
+ 0,1,0,0.39265,0,0.179964,
+ 0,1,0,0.391512,0,0.158236,
+ 0,1,0,0.391138,0,0.169794,
+ 0,1,0,0.391512,0,0.158236,
+ 0,1,0,0.39265,0,0.179964,
+ 0,1,0,0.394239,0,0.174853,
+ 0,1,0,0.394239,0,0.174853,
+ 0,1,0,0.39265,0,0.179964,
+ 0,1,0,0.397569,0,0.204221,
+ 0,1,0,0.394239,0,0.174853,
+ 0,1,0,0.397569,0,0.204221,
+ 0,1,0,0.40666,0,0.219098,
+ 0,1,0,0.40666,0,0.219098,
+ 0,1,0,0.397569,0,0.204221,
+ 0,1,0,0.404345,0,0.223788,
+ 0,1,0,0.40666,0,0.219098,
+ 0,1,0,0.404345,0,0.223788,
+ 0,1,0,0.408002,0,0.244733,
+ 0,1,0,0.40666,0,0.219098,
+ 0,1,0,0.408002,0,0.244733,
+ 0,1,0,0.408099,0,0.224636,
+ 0,1,0,0.408099,0,0.224636,
+ 0,1,0,0.408002,0,0.244733,
+ 0,1,0,0.408103,0,0.249253,
+ 0,1,0,0.408099,0,0.224636,
+ 0,1,0,0.408103,0,0.249253,
+ 0,1,0,0.409262,0,0.230389,
+ 0,1,0,0.409262,0,0.230389,
+ 0,1,0,0.408103,0,0.249253,
+ 0,1,0,0.409766,0,0.262537,
+ 0,1,0,0.409262,0,0.230389,
+ 0,1,0,0.409766,0,0.262537,
+ 0,1,0,0.409683,0,0.234017,
+ 0,1,0,0.409683,0,0.234017,
+ 0,1,0,0.409766,0,0.262537,
+ 0,1,0,0.410439,0,0.237557,
+ 0,1,0,0.410439,0,0.237557,
+ 0,1,0,0.409766,0,0.262537,
+ 0,1,0,0.411514,0,0.264809,
+ 0,1,0,0.410439,0,0.237557,
+ 0,1,0,0.411514,0,0.264809,
+ 0,1,0,0.410716,0,0.23952,
+ 0,1,0,0.410716,0,0.23952,
+ 0,1,0,0.411514,0,0.264809,
+ 0,1,0,0.411294,0,0.23952,
+ 0,1,0,0.411294,0,0.23952,
+ 0,1,0,0.411514,0,0.264809,
+ 0,1,0,0.412466,0,0.250129,
+ 0,1,0,0.412466,0,0.250129,
+ 0,1,0,0.411514,0,0.264809,
+ 0,1,0,0.413564,0,0.265255,
+ 0,1,0,0.412466,0,0.250129,
+ 0,1,0,0.413564,0,0.265255,
+ 0,1,0,0.414263,0,0.261778,
+ 0,1,0,0.414263,0,0.261778,
+ 0,1,0,0.413564,0,0.265255,
+ 0,1,0,0.414269,0,0.264074,
+ 0,1,0,0.410716,0,0.237056,
+ 0,1,0,0.410439,0,0.237557,
+ 0,1,0,0.410716,0,0.23952,
+ 0,1,0,0.449951,0,0.131491,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.449885,0,0.112195,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.449951,0,0.131491,
+ 0,1,0,0.456562,0,0.143466,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.456562,0,0.143466,
+ 0,1,0,0.461568,0,0.148136,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.461568,0,0.148136,
+ 0,1,0,0.488701,0,0.15421,
+ 0,1,0,0.488701,0,0.15421,
+ 0,1,0,0.461568,0,0.148136,
+ 0,1,0,0.470528,0,0.152711,
+ 0,1,0,0.488701,0,0.15421,
+ 0,1,0,0.470528,0,0.152711,
+ 0,1,0,0.478978,0,0.154784,
+ 0,1,0,0.397327,0,0.148029,
+ 0,1,0,0.397327,0,0.147452,
+ 0,1,0,0.396055,0,0.148029,
+ 0,1,0,0.397327,0,0.147452,
+ 0,1,0,0.397327,0,0.148029,
+ 0,1,0,0.39755,0,0.147372,
+ 0,1,0,0.414121,0,0.239961,
+ 0,1,0,0.412797,0,0.232563,
+ 0,1,0,0.412797,0,0.23952,
+ 0,1,0,0.412797,0,0.232563,
+ 0,1,0,0.412705,0,0.228176,
+ 0,1,0,0.412671,0,0.232563,
+ 0,1,0,0.412705,0,0.228176,
+ 0,1,0,0.412797,0,0.232563,
+ 0,1,0,0.414375,0,0.214159,
+ 0,1,0,0.414375,0,0.214159,
+ 0,1,0,0.412797,0,0.232563,
+ 0,1,0,0.414121,0,0.239961,
+ 0,1,0,0.414375,0,0.214159,
+ 0,1,0,0.414121,0,0.239961,
+ 0,1,0,0.415751,0,0.237628,
+ 0,1,0,0.414375,0,0.214159,
+ 0,1,0,0.415751,0,0.237628,
+ 0,1,0,0.41744,0,0.195384,
+ 0,1,0,0.41744,0,0.195384,
+ 0,1,0,0.415751,0,0.237628,
+ 0,1,0,0.417574,0,0.222045,
+ 0,1,0,0.41744,0,0.195384,
+ 0,1,0,0.417574,0,0.222045,
+ 0,1,0,0.418892,0,0.189839,
+ 0,1,0,0.418892,0,0.189839,
+ 0,1,0,0.417574,0,0.222045,
+ 0,1,0,0.420163,0,0.207736,
+ 0,1,0,0.418892,0,0.189839,
+ 0,1,0,0.420163,0,0.207736,
+ 0,1,0,0.422448,0,0.176471,
+ 0,1,0,0.422448,0,0.176471,
+ 0,1,0,0.420163,0,0.207736,
+ 0,1,0,0.420471,0,0.206322,
+ 0,1,0,0.422448,0,0.176471,
+ 0,1,0,0.420471,0,0.206322,
+ 0,1,0,0.422094,0,0.189984,
+ 0,1,0,0.422448,0,0.176471,
+ 0,1,0,0.422094,0,0.189984,
+ 0,1,0,0.422204,0,0.18577,
+ 0,1,0,0.422448,0,0.176471,
+ 0,1,0,0.422204,0,0.18577,
+ 0,1,0,0.422281,0,0.185797,
+ 0,1,0,0.422448,0,0.176471,
+ 0,1,0,0.422281,0,0.185797,
+ 0,1,0,0.445986,0,0.117057,
+ 0,1,0,0.422448,0,0.176471,
+ 0,1,0,0.445986,0,0.117057,
+ 0,1,0,0.440637,0,0.123725,
+ 0,1,0,0.440637,0,0.123725,
+ 0,1,0,0.445986,0,0.117057,
+ 0,1,0,0.446342,0,0.105798,
+ 0,1,0,0.446342,0,0.105798,
+ 0,1,0,0.445986,0,0.117057,
+ 0,1,0,0.449885,0,0.112195,
+ 0,1,0,0.404666,0,0.144819,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.39755,0,0.147372,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.404666,0,0.144819,
+ 0,1,0,0.417249,0,0.137992,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.417249,0,0.137992,
+ 0,1,0,0.417828,0,0.135939,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.417828,0,0.135939,
+ 0,1,0,0.418963,0,0.137857,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.418963,0,0.137857,
+ 0,1,0,0.420489,0,0.14266,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.420489,0,0.14266,
+ 0,1,0,0.423494,0,0.136547,
+ 0,1,0,0.423494,0,0.136547,
+ 0,1,0,0.420489,0,0.14266,
+ 0,1,0,0.423393,0,0.140375,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.423494,0,0.136547,
+ 0,1,0,0.426619,0,0.128495,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.426619,0,0.128495,
+ 0,1,0,0.446342,0,0.105798,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.446342,0,0.105798,
+ 0,1,0,0.449885,0,0.112195,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.449885,0,0.112195,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.47088,0,-0.068458,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.472985,0,-0.079165,
+ 0,1,0,0.472985,0,-0.079165,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.477482,0,-0.083803,
+ 0,1,0,0.477482,0,-0.083803,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.493522,0,-0.08792,
+ 0,1,0,0.493522,0,-0.08792,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.503354,0,-0.089342,
+ 0,1,0,0.503354,0,-0.089342,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.50828,0,-0.088395,
+ 0,1,0,0.50828,0,-0.088395,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.534723,0,-0.08711,
+ 0,1,0,0.534723,0,-0.08711,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.523233,0,0.184872,
+ 0,1,0,0.522566,0,0.172052,
+ 0,1,0,0.522412,0,0.19779,
+ 0,1,0,0.503876,0,0.164781,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.495993,0,0.155045,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.503876,0,0.164781,
+ 0,1,0,0.507138,0,0.175776,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.507138,0,0.175776,
+ 0,1,0,0.511315,0,0.197987,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.511315,0,0.197987,
+ 0,1,0,0.511757,0,0.204784,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.511757,0,0.204784,
+ 0,1,0,0.515058,0,0.208096,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.515058,0,0.208096,
+ 0,1,0,0.517911,0,0.206731,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.517911,0,0.206731,
+ 0,1,0,0.522566,0,0.172052,
+ 0,1,0,0.522566,0,0.172052,
+ 0,1,0,0.517911,0,0.206731,
+ 0,1,0,0.522412,0,0.19779,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.522566,0,0.172052,
+ 0,1,0,0.525238,0,0.168112,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.525238,0,0.168112,
+ 0,1,0,0.541531,0,0.157186,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.541531,0,0.157186,
+ 0,1,0,0.550193,0,0.142374,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.550193,0,0.142374,
+ 0,1,0,0.550431,0,0.139425,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.550431,0,0.139425,
+ 0,1,0,0.555635,0,0.135535,
+ 0,1,0,0.557055,0,-0.086961,
+ 0,1,0,0.555635,0,0.135535,
+ 0,1,0,0.579593,0,-0.085334,
+ 0,1,0,0.579593,0,-0.085334,
+ 0,1,0,0.555635,0,0.135535,
+ 0,1,0,0.598969,0,-0.084539,
+ 0,1,0,0.569712,0,0.137066,
+ 0,1,0,0.570459,0,0.127076,
+ 0,1,0,0.570371,0,0.122531,
+ 0,1,0,0.570459,0,0.127076,
+ 0,1,0,0.569712,0,0.137066,
+ 0,1,0,0.571755,0,0.13583,
+ 0,1,0,0.590147,0,0.136555,
+ 0,1,0,0.589106,0,0.113213,
+ 0,1,0,0.588142,0,0.137089,
+ 0,1,0,0.589106,0,0.113213,
+ 0,1,0,0.590147,0,0.136555,
+ 0,1,0,0.591503,0,0.117398,
+ 0,1,0,0.591503,0,0.117398,
+ 0,1,0,0.590147,0,0.136555,
+ 0,1,0,0.596161,0,0.12439,
+ 0,1,0,0.591503,0,0.117398,
+ 0,1,0,0.596161,0,0.12439,
+ 0,1,0,0.595853,0,0.123322,
+ 0,1,0,0.555635,0,0.135535,
+ 0,1,0,0.570371,0,0.122531,
+ 0,1,0,0.598969,0,-0.084539,
+ 0,1,0,0.570371,0,0.122531,
+ 0,1,0,0.555635,0,0.135535,
+ 0,1,0,0.569712,0,0.137066,
+ 0,1,0,0.598969,0,-0.084539,
+ 0,1,0,0.570371,0,0.122531,
+ 0,1,0,0.577399,0,0.12947,
+ 0,1,0,0.598969,0,-0.084539,
+ 0,1,0,0.577399,0,0.12947,
+ 0,1,0,0.589106,0,0.113213,
+ 0,1,0,0.589106,0,0.113213,
+ 0,1,0,0.577399,0,0.12947,
+ 0,1,0,0.588142,0,0.137089,
+ 0,1,0,0.598969,0,-0.084539,
+ 0,1,0,0.589106,0,0.113213,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.598969,0,-0.084539,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.618344,0,-0.083744,
+ 0,1,0,0.618344,0,-0.083744,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.620558,0,-0.083594,
+ 0,1,0,0.638795,0,0.138343,
+ 0,1,0,0.630773,0,0.109371,
+ 0,1,0,0.628868,0,0.134444,
+ 0,1,0,0.630773,0,0.109371,
+ 0,1,0,0.638795,0,0.138343,
+ 0,1,0,0.635865,0,0.11419,
+ 0,1,0,0.635865,0,0.11419,
+ 0,1,0,0.638795,0,0.138343,
+ 0,1,0,0.641805,0,0.120056,
+ 0,1,0,0.641805,0,0.120056,
+ 0,1,0,0.638795,0,0.138343,
+ 0,1,0,0.640371,0,0.13732,
+ 0,1,0,0.641805,0,0.120056,
+ 0,1,0,0.640371,0,0.13732,
+ 0,1,0,0.644216,0,0.129739,
+ 0,1,0,0.593283,0,0.112433,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.589106,0,0.113213,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.593283,0,0.112433,
+ 0,1,0,0.608183,0,0.115627,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.608183,0,0.115627,
+ 0,1,0,0.620228,0,0.125744,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.620228,0,0.125744,
+ 0,1,0,0.628868,0,0.134444,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.628868,0,0.134444,
+ 0,1,0,0.630773,0,0.109371,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.630773,0,0.109371,
+ 0,1,0,0.632083,0,0.099196,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.632083,0,0.099196,
+ 0,1,0,0.633435,0,0.097076,
+ 0,1,0,0.636807,0,-0.079832,
+ 0,1,0,0.633435,0,0.097076,
+ 0,1,0,0.659098,0,-0.082422,
+ 0,1,0,0.659098,0,-0.082422,
+ 0,1,0,0.633435,0,0.097076,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.683151,0,0.104598,
+ 0,1,0,0.676838,0,0.095602,
+ 0,1,0,0.67674,0,0.096198,
+ 0,1,0,0.676838,0,0.095602,
+ 0,1,0,0.683151,0,0.104598,
+ 0,1,0,0.681594,0,0.095206,
+ 0,1,0,0.645913,0,0.095497,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.633435,0,0.097076,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.645913,0,0.095497,
+ 0,1,0,0.658364,0,0.095442,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.658364,0,0.095442,
+ 0,1,0,0.665007,0,0.092662,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.665007,0,0.092662,
+ 0,1,0,0.668193,0,0.093641,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.668193,0,0.093641,
+ 0,1,0,0.675042,0,0.093973,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.675042,0,0.093973,
+ 0,1,0,0.676838,0,0.095602,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.676838,0,0.095602,
+ 0,1,0,0.681594,0,0.095206,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.681594,0,0.095206,
+ 0,1,0,0.682756,0,0.094429,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.682756,0,0.094429,
+ 0,1,0,0.69471,0,0.095379,
+ 0,1,0,0.688136,0,-0.086747,
+ 0,1,0,0.69471,0,0.095379,
+ 0,1,0,0.697541,0,-0.085334,
+ 0,1,0,0.697541,0,-0.085334,
+ 0,1,0,0.69471,0,0.095379,
+ 0,1,0,0.714606,0,0.090823,
+ 0,1,0,0.697541,0,-0.085334,
+ 0,1,0,0.714606,0,0.090823,
+ 0,1,0,0.721669,0,-0.084006,
+ 0,1,0,0.721669,0,-0.084006,
+ 0,1,0,0.714606,0,0.090823,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.721669,0,-0.084006,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.740914,0,-0.08382,
+ 0,1,0,0.666293,0,0.147331,
+ 0,1,0,0.664464,0,0.129539,
+ 0,1,0,0.659941,0,0.133769,
+ 0,1,0,0.664464,0,0.129539,
+ 0,1,0,0.666293,0,0.147331,
+ 0,1,0,0.670008,0,0.146624,
+ 0,1,0,0.670008,0,0.146624,
+ 0,1,0,0.666293,0,0.147331,
+ 0,1,0,0.672392,0,0.152118,
+ 0,1,0,0.658491,0,0.105804,
+ 0,1,0,0.665007,0,0.092662,
+ 0,1,0,0.658364,0,0.095442,
+ 0,1,0,0.665007,0,0.092662,
+ 0,1,0,0.658491,0,0.105804,
+ 0,1,0,0.659941,0,0.133769,
+ 0,1,0,0.665007,0,0.092662,
+ 0,1,0,0.659941,0,0.133769,
+ 0,1,0,0.664565,0,0.096331,
+ 0,1,0,0.664565,0,0.096331,
+ 0,1,0,0.659941,0,0.133769,
+ 0,1,0,0.664464,0,0.129539,
+ 0,1,0,0.683316,0,0.128023,
+ 0,1,0,0.67432,0,0.110964,
+ 0,1,0,0.673619,0,0.119635,
+ 0,1,0,0.67432,0,0.110964,
+ 0,1,0,0.683316,0,0.128023,
+ 0,1,0,0.67674,0,0.096198,
+ 0,1,0,0.67674,0,0.096198,
+ 0,1,0,0.683316,0,0.128023,
+ 0,1,0,0.683151,0,0.104598,
+ 0,1,0,0.683151,0,0.104598,
+ 0,1,0,0.683316,0,0.128023,
+ 0,1,0,0.68523,0,0.10755,
+ 0,1,0,0.68523,0,0.10755,
+ 0,1,0,0.683316,0,0.128023,
+ 0,1,0,0.686054,0,0.131038,
+ 0,1,0,0.68523,0,0.10755,
+ 0,1,0,0.686054,0,0.131038,
+ 0,1,0,0.689344,0,0.118277,
+ 0,1,0,0.689344,0,0.118277,
+ 0,1,0,0.686054,0,0.131038,
+ 0,1,0,0.690758,0,0.15228,
+ 0,1,0,0.689344,0,0.118277,
+ 0,1,0,0.690758,0,0.15228,
+ 0,1,0,0.690744,0,0.135418,
+ 0,1,0,0.690744,0,0.135418,
+ 0,1,0,0.690758,0,0.15228,
+ 0,1,0,0.695374,0,0.151256,
+ 0,1,0,0.695374,0,0.151256,
+ 0,1,0,0.690758,0,0.15228,
+ 0,1,0,0.694023,0,0.154102,
+ 0,1,0,0.676838,0,0.095602,
+ 0,1,0,0.675042,0,0.093973,
+ 0,1,0,0.67674,0,0.096198,
+ 0,1,0,0.700699,0,0.113833,
+ 0,1,0,0.698637,0,0.107129,
+ 0,1,0,0.698607,0,0.110847,
+ 0,1,0,0.698637,0,0.107129,
+ 0,1,0,0.700699,0,0.113833,
+ 0,1,0,0.700027,0,0.1007,
+ 0,1,0,0.71142,0,0.121852,
+ 0,1,0,0.710934,0,0.096154,
+ 0,1,0,0.706288,0,0.114609,
+ 0,1,0,0.710934,0,0.096154,
+ 0,1,0,0.71142,0,0.121852,
+ 0,1,0,0.712349,0,0.097834,
+ 0,1,0,0.712349,0,0.097834,
+ 0,1,0,0.71142,0,0.121852,
+ 0,1,0,0.718607,0,0.119625,
+ 0,1,0,0.712349,0,0.097834,
+ 0,1,0,0.718607,0,0.119625,
+ 0,1,0,0.716207,0,0.10467,
+ 0,1,0,0.716207,0,0.10467,
+ 0,1,0,0.718607,0,0.119625,
+ 0,1,0,0.720963,0,0.115796,
+ 0,1,0,0.700027,0,0.1007,
+ 0,1,0,0.714606,0,0.090823,
+ 0,1,0,0.69471,0,0.095379,
+ 0,1,0,0.714606,0,0.090823,
+ 0,1,0,0.700027,0,0.1007,
+ 0,1,0,0.710934,0,0.096154,
+ 0,1,0,0.710934,0,0.096154,
+ 0,1,0,0.700027,0,0.1007,
+ 0,1,0,0.700699,0,0.113833,
+ 0,1,0,0.710934,0,0.096154,
+ 0,1,0,0.700699,0,0.113833,
+ 0,1,0,0.70433,0,0.107742,
+ 0,1,0,0.70433,0,0.107742,
+ 0,1,0,0.700699,0,0.113833,
+ 0,1,0,0.703083,0,0.111247,
+ 0,1,0,0.710934,0,0.096154,
+ 0,1,0,0.70433,0,0.107742,
+ 0,1,0,0.706288,0,0.114609,
+ 0,1,0,0.72999,0,0.121899,
+ 0,1,0,0.726299,0,0.121245,
+ 0,1,0,0.724778,0,0.123159,
+ 0,1,0,0.726299,0,0.121245,
+ 0,1,0,0.72999,0,0.121899,
+ 0,1,0,0.727211,0,0.118538,
+ 0,1,0,0.727211,0,0.118538,
+ 0,1,0,0.72999,0,0.121899,
+ 0,1,0,0.728191,0,0.109149,
+ 0,1,0,0.717693,0,0.090808,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.714606,0,0.090823,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.717693,0,0.090808,
+ 0,1,0,0.724838,0,0.096644,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.724838,0,0.096644,
+ 0,1,0,0.728191,0,0.109149,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.728191,0,0.109149,
+ 0,1,0,0.72999,0,0.121899,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.72999,0,0.121899,
+ 0,1,0,0.735872,0,0.120998,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.735872,0,0.120998,
+ 0,1,0,0.746533,0,0.123297,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.746533,0,0.123297,
+ 0,1,0,0.75824,0,0.125027,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.75824,0,0.125027,
+ 0,1,0,0.769164,0,0.128267,
+ 0,1,0,0.760371,0,-0.082103,
+ 0,1,0,0.769164,0,0.128267,
+ 0,1,0,0.773434,0,-0.081962,
+ 0,1,0,0.773434,0,-0.081962,
+ 0,1,0,0.769164,0,0.128267,
+ 0,1,0,0.770977,0,0.129352,
+ 0,1,0,0.773434,0,-0.081962,
+ 0,1,0,0.770977,0,0.129352,
+ 0,1,0,0.780388,0,0.131047,
+ 0,1,0,0.773434,0,-0.081962,
+ 0,1,0,0.780388,0,0.131047,
+ 0,1,0,0.781407,0,-0.077168,
+ 0,1,0,0.781407,0,-0.077168,
+ 0,1,0,0.780388,0,0.131047,
+ 0,1,0,0.785378,0,0.128196,
+ 0,1,0,0.781407,0,-0.077168,
+ 0,1,0,0.785378,0,0.128196,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.785378,0,0.128196,
+ 0,1,0,0.798004,0,0.111252,
+ 0,1,0,0.798004,0,0.111252,
+ 0,1,0,0.785378,0,0.128196,
+ 0,1,0,0.795684,0,0.117865,
+ 0,1,0,0.798004,0,0.111252,
+ 0,1,0,0.795684,0,0.117865,
+ 0,1,0,0.797348,0,0.11477,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.798004,0,0.111252,
+ 0,1,0,0.802588,0,0.109414,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.802588,0,0.109414,
+ 0,1,0,0.807957,0,0.109245,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.807957,0,0.109245,
+ 0,1,0,0.810112,0,0.105565,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.810112,0,0.105565,
+ 0,1,0,0.809692,0,0.098815,
+ 0,1,0,0.698986,0,0.159118,
+ 0,1,0,0.697733,0,0.157344,
+ 0,1,0,0.697047,0,0.159257,
+ 0,1,0,0.697733,0,0.157344,
+ 0,1,0,0.698986,0,0.159118,
+ 0,1,0,0.704953,0,0.147311,
+ 0,1,0,0.704953,0,0.147311,
+ 0,1,0,0.698986,0,0.159118,
+ 0,1,0,0.700381,0,0.158805,
+ 0,1,0,0.704953,0,0.147311,
+ 0,1,0,0.700381,0,0.158805,
+ 0,1,0,0.707131,0,0.15673,
+ 0,1,0,0.704953,0,0.147311,
+ 0,1,0,0.707131,0,0.15673,
+ 0,1,0,0.70634,0,0.142556,
+ 0,1,0,0.70634,0,0.142556,
+ 0,1,0,0.707131,0,0.15673,
+ 0,1,0,0.713988,0,0.128847,
+ 0,1,0,0.713988,0,0.128847,
+ 0,1,0,0.707131,0,0.15673,
+ 0,1,0,0.709295,0,0.14924,
+ 0,1,0,0.713988,0,0.128847,
+ 0,1,0,0.709295,0,0.14924,
+ 0,1,0,0.712793,0,0.136003,
+ 0,1,0,0.713988,0,0.128847,
+ 0,1,0,0.712793,0,0.136003,
+ 0,1,0,0.720359,0,0.128477,
+ 0,1,0,0.713988,0,0.128847,
+ 0,1,0,0.720359,0,0.128477,
+ 0,1,0,0.724778,0,0.123159,
+ 0,1,0,0.724778,0,0.123159,
+ 0,1,0,0.720359,0,0.128477,
+ 0,1,0,0.72999,0,0.121899,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.785814,0,-0.077411,
+ 0,1,0,0.781407,0,-0.077168,
+ 0,1,0,0.785814,0,-0.077411,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.800677,0,-0.080722,
+ 0,1,0,0.800677,0,-0.080722,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.822454,0,-0.079411,
+ 0,1,0,0.822454,0,-0.079411,
+ 0,1,0,0.808261,0,0.092493,
+ 0,1,0,0.817664,0,0.087083,
+ 0,1,0,0.822454,0,-0.079411,
+ 0,1,0,0.817664,0,0.087083,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.822454,0,-0.079411,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.876622,0,-0.077509,
+ 0,1,0,0.876622,0,-0.077509,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.891471,0,-0.072365,
+ 0,1,0,0.876622,0,-0.077509,
+ 0,1,0,0.891471,0,-0.072365,
+ 0,1,0,0.886758,0,-0.075894,
+ 0,1,0,0.879236,0,0.103329,
+ 0,1,0,0.880494,0,0.087719,
+ 0,1,0,0.876092,0,0.089178,
+ 0,1,0,0.880494,0,0.087719,
+ 0,1,0,0.879236,0,0.103329,
+ 0,1,0,0.880933,0,0.112746,
+ 0,1,0,0.880494,0,0.087719,
+ 0,1,0,0.880933,0,0.112746,
+ 0,1,0,0.882485,0,0.101668,
+ 0,1,0,0.882485,0,0.101668,
+ 0,1,0,0.880933,0,0.112746,
+ 0,1,0,0.883682,0,0.116359,
+ 0,1,0,0.935113,0,0.086174,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.935113,0,0.086174,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.983297,0,-0.043914,
+ 0,1,0,0.983297,0,-0.043914,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.988108,0,-0.009716,
+ 0,1,0,0.983297,0,-0.043914,
+ 0,1,0,0.988108,0,-0.009716,
+ 0,1,0,0.987389,0,-0.028605,
+ 0,1,0,0.988108,0,-0.009716,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.990187,0,0.00336,
+ 0,1,0,0.988108,0,-0.009716,
+ 0,1,0,0.98919,0,-0.02392,
+ 0,1,0,0.987389,0,-0.028605,
+ 0,1,0,0.98919,0,-0.02392,
+ 0,1,0,0.988108,0,-0.009716,
+ 0,1,0,0.988446,0,-0.01112,
+ 0,1,0,0.832307,0,0.092813,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.817664,0,0.087083,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.832307,0,0.092813,
+ 0,1,0,0.837239,0,0.093877,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.837239,0,0.093877,
+ 0,1,0,0.852684,0,0.093915,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.852684,0,0.093915,
+ 0,1,0,0.868186,0,0.090299,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.868186,0,0.090299,
+ 0,1,0,0.874095,0,0.087813,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.874095,0,0.087813,
+ 0,1,0,0.876092,0,0.089178,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.876092,0,0.089178,
+ 0,1,0,0.880494,0,0.087719,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.880494,0,0.087719,
+ 0,1,0,0.889776,0,0.087627,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.889776,0,0.087627,
+ 0,1,0,0.930862,0,0.086184,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.930862,0,0.086184,
+ 0,1,0,0.935113,0,0.086174,
+ 0,1,0,0.990594,0,0.044208,
+ 0,1,0,0.988787,0,0.009887,
+ 0,1,0,0.979628,0,0.056886,
+ 0,1,0,0.988787,0,0.009887,
+ 0,1,0,0.990594,0,0.044208,
+ 0,1,0,0.992143,0,0.01847,
+ 0,1,0,0.992143,0,0.01847,
+ 0,1,0,0.990594,0,0.044208,
+ 0,1,0,0.996902,0,0.039876,
+ 0,1,0,0.992143,0,0.01847,
+ 0,1,0,0.996902,0,0.039876,
+ 0,1,0,0.998585,0,0.029074,
+ 0,1,0,0.998585,0,0.029074,
+ 0,1,0,0.996902,0,0.039876,
+ 0,1,0,0.999093,0,0.039624,
+ 0,1,0,0.916362,0,0.10467,
+ 0,1,0,0.914865,0,0.097326,
+ 0,1,0,0.914857,0,0.102711,
+ 0,1,0,0.914865,0,0.097326,
+ 0,1,0,0.916362,0,0.10467,
+ 0,1,0,0.91648,0,0.095495,
+ 0,1,0,0.91648,0,0.095495,
+ 0,1,0,0.916362,0,0.10467,
+ 0,1,0,0.927423,0,0.107904,
+ 0,1,0,0.91648,0,0.095495,
+ 0,1,0,0.927423,0,0.107904,
+ 0,1,0,0.921214,0,0.093992,
+ 0,1,0,0.921214,0,0.093992,
+ 0,1,0,0.927423,0,0.107904,
+ 0,1,0,0.935113,0,0.086174,
+ 0,1,0,0.935113,0,0.086174,
+ 0,1,0,0.927423,0,0.107904,
+ 0,1,0,0.945177,0,0.107786,
+ 0,1,0,0.935113,0,0.086174,
+ 0,1,0,0.945177,0,0.107786,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.945177,0,0.107786,
+ 0,1,0,0.956964,0,0.106578,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.956964,0,0.106578,
+ 0,1,0,0.962517,0,0.102149,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.962517,0,0.102149,
+ 0,1,0,0.973408,0,0.069285,
+ 0,1,0,0.973408,0,0.069285,
+ 0,1,0,0.962517,0,0.102149,
+ 0,1,0,0.972771,0,0.079921,
+ 0,1,0,0.972771,0,0.079921,
+ 0,1,0,0.962517,0,0.102149,
+ 0,1,0,0.972658,0,0.08315,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.973408,0,0.069285,
+ 0,1,0,0.976736,0,0.059775,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.976736,0,0.059775,
+ 0,1,0,0.979628,0,0.056886,
+ 0,1,0,0.989048,0,0.004923,
+ 0,1,0,0.979628,0,0.056886,
+ 0,1,0,0.988787,0,0.009887,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.915167,0,-0.070111,
+ 0,1,0,0.894145,0,-0.071426,
+ 0,1,0,0.915167,0,-0.070111,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.939839,0,-0.069902,
+ 0,1,0,0.939839,0,-0.069902,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.964695,0,-0.068243,
+ 0,1,0,0.964695,0,-0.068243,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.973177,0,-0.068253,
+ 0,1,0,0.973177,0,-0.068253,
+ 0,1,0,0.980026,0,-0.051806,
+ 0,1,0,0.980817,0,-0.058157,
+ 0,1,0,0.973177,0,-0.068253,
+ 0,1,0,0.980817,0,-0.058157,
+ 0,1,0,0.982753,0,-0.067376
+};
+static const struct gllist ships_ship3_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 1044, ships_ship3_data, 0
+};
+const struct gllist *ships_ship3 = &ships_ship3_frame;
+
+static const float ships_ship4_data[] = {
+ 0,1,0,0.304943,0,0.190323,
+ 0,1,0,0.326396,0,0.170348,
+ 0,1,0,0.299248,0,0.187399,
+ 0,1,0,0.326396,0,0.170348,
+ 0,1,0,0.304943,0,0.190323,
+ 0,1,0,0.345944,0,0.166544,
+ 0,1,0,0.246234,0,0.135536,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.245025,0,0.128414,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.246234,0,0.135536,
+ 0,1,0,0.257787,0,0.135536,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.257787,0,0.135536,
+ 0,1,0,0.262284,0,0.12738,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.262284,0,0.12738,
+ 0,1,0,0.273445,0,0.128616,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.273445,0,0.128616,
+ 0,1,0,0.273481,0,0.138748,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.273481,0,0.138748,
+ 0,1,0,0.275634,0,0.164606,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.275634,0,0.164606,
+ 0,1,0,0.28583,0,0.172039,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.28583,0,0.172039,
+ 0,1,0,0.297928,0,0.175909,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.297928,0,0.175909,
+ 0,1,0,0.326396,0,0.170348,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.326396,0,0.170348,
+ 0,1,0,0.358476,0,-0.020344,
+ 0,1,0,0.358476,0,-0.020344,
+ 0,1,0,0.326396,0,0.170348,
+ 0,1,0,0.345944,0,0.166544,
+ 0,1,0,0.14381,0,0.103841,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.14156,0,0.094759,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.14381,0,0.103841,
+ 0,1,0,0.158432,0,0.103903,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.158432,0,0.103903,
+ 0,1,0,0.168776,0,0.095234,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.168776,0,0.095234,
+ 0,1,0,0.175846,0,0.104926,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.175846,0,0.104926,
+ 0,1,0,0.194066,0,0.087656,
+ 0,1,0,0.194066,0,0.087656,
+ 0,1,0,0.175846,0,0.104926,
+ 0,1,0,0.190935,0,0.102262,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.194066,0,0.087656,
+ 0,1,0,0.202579,0,0.103094,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.202579,0,0.103094,
+ 0,1,0,0.210571,0,0.087724,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.210571,0,0.087724,
+ 0,1,0,0.223665,0,0.105104,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.223665,0,0.105104,
+ 0,1,0,0.223681,0,0.123024,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.223681,0,0.123024,
+ 0,1,0,0.245025,0,0.128414,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.245025,0,0.128414,
+ 0,1,0,0.297968,0,-0.027452,
+ 0,1,0,0.036626,0,0.113962,
+ 0,1,0,0.03682,0,0.09696,
+ 0,1,0,0.031803,0,0.10418,
+ 0,1,0,0.03682,0,0.09696,
+ 0,1,0,0.036626,0,0.113962,
+ 0,1,0,0.05721,0,0.099867,
+ 0,1,0,0.03682,0,0.09696,
+ 0,1,0,0.05721,0,0.099867,
+ 0,1,0,0.039559,0,0.002209,
+ 0,1,0,0.039559,0,0.002209,
+ 0,1,0,0.05721,0,0.099867,
+ 0,1,0,0.051559,0,-0.037322,
+ 0,1,0,0.051559,0,-0.037322,
+ 0,1,0,0.05721,0,0.099867,
+ 0,1,0,0.061101,0,0.092082,
+ 0,1,0,0.03061,0,-0.010889,
+ 0,1,0,0.03271,0,-0.026229,
+ 0,1,0,0.025668,0,-0.013396,
+ 0,1,0,0.03271,0,-0.026229,
+ 0,1,0,0.03061,0,-0.010889,
+ 0,1,0,0.039559,0,0.002209,
+ 0,1,0,0.03271,0,-0.026229,
+ 0,1,0,0.039559,0,0.002209,
+ 0,1,0,0.051559,0,-0.037322,
+ 0,1,0,0.009609,0,0.103487,
+ 0,1,0,0.015049,0,0.084688,
+ 0,1,0,0.006732,0,0.089029,
+ 0,1,0,0.015049,0,0.084688,
+ 0,1,0,0.009609,0,0.103487,
+ 0,1,0,0.022363,0,0.103487,
+ 0,1,0,0.015049,0,0.084688,
+ 0,1,0,0.022363,0,0.103487,
+ 0,1,0,0.017935,0,0.071363,
+ 0,1,0,0.017935,0,0.071363,
+ 0,1,0,0.022363,0,0.103487,
+ 0,1,0,0.03285,0,0.034328,
+ 0,1,0,0.03285,0,0.034328,
+ 0,1,0,0.022363,0,0.103487,
+ 0,1,0,0.031087,0,0.094974,
+ 0,1,0,0.03285,0,0.034328,
+ 0,1,0,0.031087,0,0.094974,
+ 0,1,0,0.03682,0,0.09696,
+ 0,1,0,0.03285,0,0.034328,
+ 0,1,0,0.03682,0,0.09696,
+ 0,1,0,0.039559,0,0.002209,
+ 0,1,0,0.106151,0,0.104429,
+ 0,1,0,0.104181,0,0.088847,
+ 0,1,0,0.096575,0,0.104429,
+ 0,1,0,0.061101,0,0.092082,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.051559,0,-0.037322,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.061101,0,0.092082,
+ 0,1,0,0.091936,0,0.089043,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.091936,0,0.089043,
+ 0,1,0,0.104181,0,0.088847,
+ 0,1,0,0.104181,0,0.088847,
+ 0,1,0,0.091936,0,0.089043,
+ 0,1,0,0.096575,0,0.104429,
+ 0,1,0,0.23746,0,-0.034559,
+ 0,1,0,0.104181,0,0.088847,
+ 0,1,0,0.14156,0,0.094759,
+ 0,1,0,0.329906,0,0.185972,
+ 0,1,0,0.342762,0,0.172869,
+ 0,1,0,0.324891,0,0.186066,
+ 0,1,0,0.342762,0,0.172869,
+ 0,1,0,0.329906,0,0.185972,
+ 0,1,0,0.339844,0,0.181324,
+ 0,1,0,0.342762,0,0.172869,
+ 0,1,0,0.339844,0,0.181324,
+ 0,1,0,0.360305,0,0.183469,
+ 0,1,0,0.342762,0,0.172869,
+ 0,1,0,0.360305,0,0.183469,
+ 0,1,0,0.345944,0,0.166544,
+ 0,1,0,0.345944,0,0.166544,
+ 0,1,0,0.360305,0,0.183469,
+ 0,1,0,0.358476,0,-0.020344,
+ 0,1,0,0.358476,0,-0.020344,
+ 0,1,0,0.360305,0,0.183469,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.360305,0,0.183469,
+ 0,1,0,0.369467,0,0.182719,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.369467,0,0.182719,
+ 0,1,0,0.38488,0,0.188501,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.38488,0,0.188501,
+ 0,1,0,0.397781,0,0.183285,
+ 0,1,0,0.408713,0,0.203571,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.397781,0,0.183285,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.408713,0,0.203571,
+ 0,1,0,0.410142,0,0.215072,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.410142,0,0.215072,
+ 0,1,0,0.425881,0,0.215072,
+ 0,1,0,0.415493,0,-0.021069,
+ 0,1,0,0.425881,0,0.215072,
+ 0,1,0,0.479404,0,-0.030146,
+ 0,1,0,0.479404,0,-0.030146,
+ 0,1,0,0.425881,0,0.215072,
+ 0,1,0,0.489913,0,0.219775,
+ 0,1,0,0.418248,0,0.35148,
+ 0,1,0,0.418356,0,0.341484,
+ 0,1,0,0.405514,0,0.352143,
+ 0,1,0,0.418356,0,0.341484,
+ 0,1,0,0.418248,0,0.35148,
+ 0,1,0,0.428617,0,0.369988,
+ 0,1,0,0.418356,0,0.341484,
+ 0,1,0,0.428617,0,0.369988,
+ 0,1,0,0.42234,0,0.318448,
+ 0,1,0,0.42234,0,0.318448,
+ 0,1,0,0.428617,0,0.369988,
+ 0,1,0,0.427764,0,0.276224,
+ 0,1,0,0.427764,0,0.276224,
+ 0,1,0,0.428617,0,0.369988,
+ 0,1,0,0.452839,0,0.343883,
+ 0,1,0,0.452839,0,0.343883,
+ 0,1,0,0.428617,0,0.369988,
+ 0,1,0,0.445208,0,0.355164,
+ 0,1,0,0.410902,0,0.298372,
+ 0,1,0,0.390397,0,0.283464,
+ 0,1,0,0.383552,0,0.29897,
+ 0,1,0,0.390397,0,0.283464,
+ 0,1,0,0.410902,0,0.298372,
+ 0,1,0,0.399968,0,0.282169,
+ 0,1,0,0.399968,0,0.282169,
+ 0,1,0,0.410902,0,0.298372,
+ 0,1,0,0.404167,0,0.283968,
+ 0,1,0,0.404167,0,0.283968,
+ 0,1,0,0.410902,0,0.298372,
+ 0,1,0,0.420169,0,0.284013,
+ 0,1,0,0.420169,0,0.284013,
+ 0,1,0,0.410902,0,0.298372,
+ 0,1,0,0.414131,0,0.314687,
+ 0,1,0,0.420169,0,0.284013,
+ 0,1,0,0.414131,0,0.314687,
+ 0,1,0,0.42234,0,0.318448,
+ 0,1,0,0.420169,0,0.284013,
+ 0,1,0,0.42234,0,0.318448,
+ 0,1,0,0.427764,0,0.276224,
+ 0,1,0,0.520644,0,0.224976,
+ 0,1,0,0.516866,0,0.207753,
+ 0,1,0,0.503959,0,0.226903,
+ 0,1,0,0.530608,0,0.199574,
+ 0,1,0,0.52136,0,0.179767,
+ 0,1,0,0.516866,0,0.207753,
+ 0,1,0,0.489913,0,0.219775,
+ 0,1,0,0.537226,0,-0.025853,
+ 0,1,0,0.479404,0,-0.030146,
+ 0,1,0,0.537226,0,-0.025853,
+ 0,1,0,0.489913,0,0.219775,
+ 0,1,0,0.503959,0,0.226903,
+ 0,1,0,0.537226,0,-0.025853,
+ 0,1,0,0.503959,0,0.226903,
+ 0,1,0,0.516866,0,0.207753,
+ 0,1,0,0.537226,0,-0.025853,
+ 0,1,0,0.516866,0,0.207753,
+ 0,1,0,0.52136,0,0.179767,
+ 0,1,0,0.537226,0,-0.025853,
+ 0,1,0,0.52136,0,0.179767,
+ 0,1,0,0.523769,0,0.167802,
+ 0,1,0,0.537226,0,-0.025853,
+ 0,1,0,0.523769,0,0.167802,
+ 0,1,0,0.548236,0,0.136243,
+ 0,1,0,0.537226,0,-0.025853,
+ 0,1,0,0.548236,0,0.136243,
+ 0,1,0,0.566645,0,-0.018616,
+ 0,1,0,0.566645,0,-0.018616,
+ 0,1,0,0.548236,0,0.136243,
+ 0,1,0,0.549719,0,0.12887,
+ 0,1,0,0.566645,0,-0.018616,
+ 0,1,0,0.549719,0,0.12887,
+ 0,1,0,0.554575,0,0.12323,
+ 0,1,0,0.552753,0,0.178346,
+ 0,1,0,0.523769,0,0.167802,
+ 0,1,0,0.52136,0,0.179767,
+ 0,1,0,0.523769,0,0.167802,
+ 0,1,0,0.552753,0,0.178346,
+ 0,1,0,0.560238,0,0.169988,
+ 0,1,0,0.541347,0,0.163708,
+ 0,1,0,0.548236,0,0.136243,
+ 0,1,0,0.523769,0,0.167802,
+ 0,1,0,0.548236,0,0.136243,
+ 0,1,0,0.541347,0,0.163708,
+ 0,1,0,0.555944,0,0.155783,
+ 0,1,0,0.555944,0,0.155783,
+ 0,1,0,0.541347,0,0.163708,
+ 0,1,0,0.559142,0,0.163585,
+ 0,1,0,0.560035,0,0.144169,
+ 0,1,0,0.548236,0,0.136243,
+ 0,1,0,0.555944,0,0.155783,
+ 0,1,0,0.564799,0,0.119242,
+ 0,1,0,0.566645,0,-0.018616,
+ 0,1,0,0.554575,0,0.12323,
+ 0,1,0,0.566645,0,-0.018616,
+ 0,1,0,0.564799,0,0.119242,
+ 0,1,0,0.58033,0,0.115393,
+ 0,1,0,0.566645,0,-0.018616,
+ 0,1,0,0.58033,0,0.115393,
+ 0,1,0,0.62089,0,-0.018575,
+ 0,1,0,0.62089,0,-0.018575,
+ 0,1,0,0.58033,0,0.115393,
+ 0,1,0,0.585431,0,0.121481,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.583856,0,0.153968,
+ 0,1,0,0.581753,0,0.158505,
+ 0,1,0,0.583856,0,0.153968,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.585431,0,0.121481,
+ 0,1,0,0.585431,0,0.121481,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.637038,0,0.134243,
+ 0,1,0,0.583856,0,0.153968,
+ 0,1,0,0.574491,0,0.147231,
+ 0,1,0,0.570974,0,0.157277,
+ 0,1,0,0.574491,0,0.147231,
+ 0,1,0,0.583856,0,0.153968,
+ 0,1,0,0.585431,0,0.121481,
+ 0,1,0,0.637038,0,0.134243,
+ 0,1,0,0.62089,0,-0.018575,
+ 0,1,0,0.585431,0,0.121481,
+ 0,1,0,0.62089,0,-0.018575,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.61878,0,-0.025619,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.62089,0,-0.018575,
+ 0,1,0,0.637038,0,0.134243,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.637038,0,0.134243,
+ 0,1,0,0.661318,0,0.122183,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.661318,0,0.122183,
+ 0,1,0,0.670206,0,0.110851,
+ 0,1,0,0.573562,0,0.172873,
+ 0,1,0,0.581753,0,0.158505,
+ 0,1,0,0.572534,0,0.161272,
+ 0,1,0,0.581753,0,0.158505,
+ 0,1,0,0.573562,0,0.172873,
+ 0,1,0,0.583793,0,0.171573,
+ 0,1,0,0.581753,0,0.158505,
+ 0,1,0,0.583793,0,0.171573,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.583793,0,0.171573,
+ 0,1,0,0.584888,0,0.181456,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.584888,0,0.181456,
+ 0,1,0,0.624872,0,0.174338,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.624872,0,0.174338,
+ 0,1,0,0.633124,0,0.175123,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.633124,0,0.175123,
+ 0,1,0,0.634269,0,0.164334,
+ 0,1,0,0.633973,0,0.156872,
+ 0,1,0,0.634269,0,0.164334,
+ 0,1,0,0.668778,0,0.167913,
+ 0,1,0,0.668778,0,0.167913,
+ 0,1,0,0.634269,0,0.164334,
+ 0,1,0,0.665861,0,0.175198,
+ 0,1,0,0.6544,0,0.149992,
+ 0,1,0,0.637038,0,0.134243,
+ 0,1,0,0.635778,0,0.146679,
+ 0,1,0,0.637038,0,0.134243,
+ 0,1,0,0.6544,0,0.149992,
+ 0,1,0,0.661318,0,0.122183,
+ 0,1,0,0.661318,0,0.122183,
+ 0,1,0,0.6544,0,0.149992,
+ 0,1,0,0.662997,0,0.135334,
+ 0,1,0,0.665945,0,0.129564,
+ 0,1,0,0.670206,0,0.110851,
+ 0,1,0,0.661318,0,0.122183,
+ 0,1,0,0.670206,0,0.110851,
+ 0,1,0,0.665945,0,0.129564,
+ 0,1,0,0.672333,0,0.136286,
+ 0,1,0,0.735491,0,0.103255,
+ 0,1,0,0.75396,0,0.088343,
+ 0,1,0,0.734536,0,0.096627,
+ 0,1,0,0.75396,0,0.088343,
+ 0,1,0,0.735491,0,0.103255,
+ 0,1,0,0.756588,0,0.09584,
+ 0,1,0,0.75396,0,0.088343,
+ 0,1,0,0.756588,0,0.09584,
+ 0,1,0,0.787724,0,0.092968,
+ 0,1,0,0.787724,0,0.092968,
+ 0,1,0,0.756588,0,0.09584,
+ 0,1,0,0.779594,0,0.095468,
+ 0,1,0,0.692539,0,0.110851,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.670206,0,0.110851,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.692539,0,0.110851,
+ 0,1,0,0.700333,0,0.101232,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.700333,0,0.101232,
+ 0,1,0,0.702466,0,0.086725,
+ 0,1,0,0.702152,0,-0.018998,
+ 0,1,0,0.702466,0,0.086725,
+ 0,1,0,0.73176,0,-0.018818,
+ 0,1,0,0.73176,0,-0.018818,
+ 0,1,0,0.702466,0,0.086725,
+ 0,1,0,0.720485,0,0.08966,
+ 0,1,0,0.73176,0,-0.018818,
+ 0,1,0,0.720485,0,0.08966,
+ 0,1,0,0.734536,0,0.096627,
+ 0,1,0,0.73176,0,-0.018818,
+ 0,1,0,0.734536,0,0.096627,
+ 0,1,0,0.761369,0,-0.022527,
+ 0,1,0,0.761369,0,-0.022527,
+ 0,1,0,0.734536,0,0.096627,
+ 0,1,0,0.75396,0,0.088343,
+ 0,1,0,0.761369,0,-0.022527,
+ 0,1,0,0.75396,0,0.088343,
+ 0,1,0,0.793365,0,-0.023345,
+ 0,1,0,0.762469,0,0.0869,
+ 0,1,0,0.793365,0,-0.023345,
+ 0,1,0,0.75396,0,0.088343,
+ 0,1,0,0.793365,0,-0.023345,
+ 0,1,0,0.762469,0,0.0869,
+ 0,1,0,0.792877,0,0.074633,
+ 0,1,0,0.793365,0,-0.023345,
+ 0,1,0,0.792877,0,0.074633,
+ 0,1,0,0.803272,0,0.067506,
+ 0,1,0,0.793365,0,-0.023345,
+ 0,1,0,0.803272,0,0.067506,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.803272,0,0.067506,
+ 0,1,0,0.821617,0,0.065833,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.821617,0,0.065833,
+ 0,1,0,0.84053,0,0.064639,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.84053,0,0.064639,
+ 0,1,0,0.852984,0,0.059455,
+ 0,1,0,0.88081,0,0.08527,
+ 0,1,0,0.84053,0,0.064639,
+ 0,1,0,0.821617,0,0.065833,
+ 0,1,0,0.84053,0,0.064639,
+ 0,1,0,0.88081,0,0.08527,
+ 0,1,0,0.847707,0,0.067725,
+ 0,1,0,0.847707,0,0.067725,
+ 0,1,0,0.88081,0,0.08527,
+ 0,1,0,0.882139,0,0.078045,
+ 0,1,0,0.882139,0,0.078045,
+ 0,1,0,0.88081,0,0.08527,
+ 0,1,0,0.883984,0,0.079929,
+ 0,1,0,0.929535,0,0.061348,
+ 0,1,0,0.920327,0,0.053894,
+ 0,1,0,0.897836,0,0.057214,
+ 0,1,0,0.920327,0,0.053894,
+ 0,1,0,0.929535,0,0.061348,
+ 0,1,0,0.938087,0,0.057211,
+ 0,1,0,0.864701,0,0.066306,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.852984,0,0.059455,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.864701,0,0.066306,
+ 0,1,0,0.880233,0,0.058765,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.880233,0,0.058765,
+ 0,1,0,0.897836,0,0.057214,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.897836,0,0.057214,
+ 0,1,0,0.920327,0,0.053894,
+ 0,1,0,0.904408,0,-0.014934,
+ 0,1,0,0.920327,0,0.053894,
+ 0,1,0,0.96438,0,-0.016439,
+ 0,1,0,0.96438,0,-0.016439,
+ 0,1,0,0.920327,0,0.053894,
+ 0,1,0,0.935168,0,0.046694,
+ 0,1,0,0.958106,0,0.048214,
+ 0,1,0,0.96438,0,-0.016439,
+ 0,1,0,0.935168,0,0.046694,
+ 0,1,0,0.96438,0,-0.016439,
+ 0,1,0,0.958106,0,0.048214,
+ 0,1,0,0.966364,0,0.035069,
+ 0,1,0,0.966364,0,0.035069,
+ 0,1,0,0.958106,0,0.048214,
+ 0,1,0,0.966595,0,0.039642,
+ 0,1,0,0.973143,0,0.031323,
+ 0,1,0,0.967674,0,-0.002108,
+ 0,1,0,0.966364,0,0.035069,
+ 0,1,0,0.96438,0,-0.016439,
+ 0,1,0,0.967674,0,-0.002108,
+ 0,1,0,0.981188,0,-0.014459,
+ 0,1,0,0.967674,0,-0.002108,
+ 0,1,0,0.96438,0,-0.016439,
+ 0,1,0,0.966364,0,0.035069,
+ 0,1,0,0.981188,0,-0.014459,
+ 0,1,0,0.967674,0,-0.002108,
+ 0,1,0,0.984607,0,-0.00735,
+ 0,1,0,0.476049,0,0.277053,
+ 0,1,0,0.427764,0,0.276224,
+ 0,1,0,0.452839,0,0.343883,
+ 0,1,0,0.427524,0,0.227217,
+ 0,1,0,0.489913,0,0.219775,
+ 0,1,0,0.425881,0,0.215072,
+ 0,1,0,0.489913,0,0.219775,
+ 0,1,0,0.427524,0,0.227217,
+ 0,1,0,0.427764,0,0.276224,
+ 0,1,0,0.489913,0,0.219775,
+ 0,1,0,0.427764,0,0.276224,
+ 0,1,0,0.47774,0,0.264282,
+ 0,1,0,0.47774,0,0.264282,
+ 0,1,0,0.427764,0,0.276224,
+ 0,1,0,0.476049,0,0.277053,
+ 0,1,0,0.489913,0,0.219775,
+ 0,1,0,0.47774,0,0.264282,
+ 0,1,0,0.489232,0,0.230519,
+ 0,1,0,0.473055,0,0.390849,
+ 0,1,0,0.458901,0,0.371717,
+ 0,1,0,0.439417,0,0.380594,
+ 0,1,0,0.458901,0,0.371717,
+ 0,1,0,0.474537,0,0.318785,
+ 0,1,0,0.452839,0,0.343883,
+ 0,1,0,0.474537,0,0.318785,
+ 0,1,0,0.458901,0,0.371717,
+ 0,1,0,0.473055,0,0.390849,
+ 0,1,0,0.474537,0,0.318785,
+ 0,1,0,0.473055,0,0.390849,
+ 0,1,0,0.483181,0,0.363554,
+ 0,1,0,0.474537,0,0.318785,
+ 0,1,0,0.483181,0,0.363554,
+ 0,1,0,0.484033,0,0.350585,
+ 0,1,0,0.476049,0,0.277053,
+ 0,1,0,0.452839,0,0.343883,
+ 0,1,0,0.474537,0,0.318785,
+ 0,1,0,0.503726,0,0.315268,
+ 0,1,0,0.476049,0,0.277053,
+ 0,1,0,0.474537,0,0.318785,
+ 0,1,0,0.476049,0,0.277053,
+ 0,1,0,0.503726,0,0.315268,
+ 0,1,0,0.492139,0,0.292934,
+ 0,1,0,0.492139,0,0.292934,
+ 0,1,0,0.503726,0,0.315268,
+ 0,1,0,0.506622,0,0.300411,
+ 0,1,0,0.492139,0,0.292934,
+ 0,1,0,0.506622,0,0.300411,
+ 0,1,0,0.574724,0,0.29066,
+ 0,1,0,0.574724,0,0.29066,
+ 0,1,0,0.506622,0,0.300411,
+ 0,1,0,0.571048,0,0.29579
+};
+static const struct gllist ships_ship4_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 522, ships_ship4_data, 0
+};
+const struct gllist *ships_ship4 = &ships_ship4_frame;
+
+static const float ships_ship5_data[] = {
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.001715,0,-0.045957,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.181433,0,0.064832,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.181433,0,0.064832,
+ 0,1,0,0.181484,0,0.064736,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.181484,0,0.064736,
+ 0,1,0,0.181506,0,0.064743,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.052158,0,0.02414,
+ 0,1,0,0.048308,0,0.034479,
+ 0,1,0,0.136388,0,0.141637,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.125094,0,0.067408,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.136388,0,0.141637,
+ 0,1,0,0.171394,0,0.137342,
+ 0,1,0,0.095935,0,0.057113,
+ 0,1,0,0.111465,0,0.057453,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.111465,0,0.057453,
+ 0,1,0,0.095935,0,0.057113,
+ 0,1,0,0.100355,0,0.06043,
+ 0,1,0,0.016847,0,0.048638,
+ 0,1,0,0.014814,0,0.024288,
+ 0,1,0,0.012424,0,0.046373,
+ 0,1,0,0.014814,0,0.024288,
+ 0,1,0,0.016847,0,0.048638,
+ 0,1,0,0.021172,0,0.02702,
+ 0,1,0,0.014814,0,0.024288,
+ 0,1,0,0.021172,0,0.02702,
+ 0,1,0,0.026929,0,0.024129,
+ 0,1,0,0.021172,0,0.02702,
+ 0,1,0,0.016847,0,0.048638,
+ 0,1,0,0.017702,0,0.047032,
+ 0,1,0,0.008355,0,0.00998,
+ 0,1,0,0.052158,0,0.02414,
+ 0,1,0,0.008266,0,-0.029831,
+ 0,1,0,0.052158,0,0.02414,
+ 0,1,0,0.008355,0,0.00998,
+ 0,1,0,0.044731,0,0.024115,
+ 0,1,0,0.044731,0,0.024115,
+ 0,1,0,0.008355,0,0.00998,
+ 0,1,0,0.01012,0,0.024024,
+ 0,1,0,0.044731,0,0.024115,
+ 0,1,0,0.01012,0,0.024024,
+ 0,1,0,0.026929,0,0.024129,
+ 0,1,0,0.026929,0,0.024129,
+ 0,1,0,0.01012,0,0.024024,
+ 0,1,0,0.014814,0,0.024288,
+ 0,1,0,0.044731,0,0.024115,
+ 0,1,0,0.026929,0,0.024129,
+ 0,1,0,0.032846,0,0.025595,
+ 0,1,0,0.044731,0,0.024115,
+ 0,1,0,0.032846,0,0.025595,
+ 0,1,0,0.039222,0,0.025488,
+ 0,1,0,0.034322,0,0.058994,
+ 0,1,0,0.026929,0,0.024129,
+ 0,1,0,0.021172,0,0.02702,
+ 0,1,0,0.026929,0,0.024129,
+ 0,1,0,0.034322,0,0.058994,
+ 0,1,0,0.037972,0,0.057261,
+ 0,1,0,0.042779,0,0.077034,
+ 0,1,0,0.061377,0,0.061235,
+ 0,1,0,0.040701,0,0.072796,
+ 0,1,0,0.061377,0,0.061235,
+ 0,1,0,0.042779,0,0.077034,
+ 0,1,0,0.063459,0,0.06709,
+ 0,1,0,0.070295,0,0.075306,
+ 0,1,0,0.063459,0,0.06709,
+ 0,1,0,0.063459,0,0.075306,
+ 0,1,0,0.053526,0,0.041817,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.048308,0,0.034479,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.053526,0,0.041817,
+ 0,1,0,0.058269,0,0.056058,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.058269,0,0.056058,
+ 0,1,0,0.061377,0,0.061235,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.061377,0,0.061235,
+ 0,1,0,0.087644,0,0.050772,
+ 0,1,0,0.087644,0,0.050772,
+ 0,1,0,0.061377,0,0.061235,
+ 0,1,0,0.063459,0,0.06709,
+ 0,1,0,0.087644,0,0.050772,
+ 0,1,0,0.063459,0,0.06709,
+ 0,1,0,0.076667,0,0.063045,
+ 0,1,0,0.076667,0,0.063045,
+ 0,1,0,0.063459,0,0.06709,
+ 0,1,0,0.070295,0,0.075306,
+ 0,1,0,0.070295,0,0.075306,
+ 0,1,0,0.076728,0,0.082213,
+ 0,1,0,0.076667,0,0.063045,
+ 0,1,0,0.076728,0,0.082213,
+ 0,1,0,0.070295,0,0.075306,
+ 0,1,0,0.079137,0,0.246431,
+ 0,1,0,0.076728,0,0.082213,
+ 0,1,0,0.079137,0,0.246431,
+ 0,1,0,0.080977,0,0.237572,
+ 0,1,0,0.076728,0,0.082213,
+ 0,1,0,0.080616,0,0.066126,
+ 0,1,0,0.076667,0,0.063045,
+ 0,1,0,0.080616,0,0.066126,
+ 0,1,0,0.076728,0,0.082213,
+ 0,1,0,0.082403,0,0.082213,
+ 0,1,0,0.125094,0,0.067408,
+ 0,1,0,0.111465,0,0.057453,
+ 0,1,0,0.113351,0,0.069023,
+ 0,1,0,0.003246,0,-0.031262,
+ 0,1,0,0.001715,0,-0.045957,
+ 0,1,0,0.001618,0,-0.038157,
+ 0,1,0,0.001715,0,-0.045957,
+ 0,1,0,0.003246,0,-0.031262,
+ 0,1,0,0.00775,0,-0.031028,
+ 0,1,0,0.001715,0,-0.045957,
+ 0,1,0,0.00775,0,-0.031028,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.00775,0,-0.031028,
+ 0,1,0,0.008266,0,-0.029831,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.008266,0,-0.029831,
+ 0,1,0,0.052158,0,0.02414,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.052158,0,0.02414,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.095908,0,0.047446,
+ 0,1,0,0.111465,0,0.057453,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.111465,0,0.057453,
+ 0,1,0,0.125094,0,0.067408,
+ 0,1,0,0.171507,0,0.07103,
+ 0,1,0,0.181433,0,0.064832,
+ 0,1,0,0.166125,0,0.064832,
+ 0,1,0,0.181433,0,0.064832,
+ 0,1,0,0.171507,0,0.07103,
+ 0,1,0,0.178121,0,0.07103,
+ 0,1,0,0.207789,0,0.072818,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.194012,0,0.069031,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.207789,0,0.072818,
+ 0,1,0,0.214555,0,0.072818,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.214555,0,0.072818,
+ 0,1,0,0.256317,0,0.072881,
+ 0,1,0,0.181484,0,0.064832,
+ 0,1,0,0.181484,0,0.064736,
+ 0,1,0,0.181433,0,0.064832,
+ 0,1,0,0.181484,0,0.064736,
+ 0,1,0,0.181484,0,0.064832,
+ 0,1,0,0.181506,0,0.064743,
+ 0,1,0,0.191757,0,0.068026,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.181506,0,0.064743,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.191757,0,0.068026,
+ 0,1,0,0.194012,0,0.069031,
+ 0,1,0,0.207789,0,0.072818,
+ 0,1,0,0.194012,0,0.069031,
+ 0,1,0,0.207789,0,0.086154,
+ 0,1,0,0.224037,0,0.154308,
+ 0,1,0,0.256317,0,0.072881,
+ 0,1,0,0.214555,0,0.072818,
+ 0,1,0,0.256317,0,0.072881,
+ 0,1,0,0.224037,0,0.154308,
+ 0,1,0,0.225964,0,0.161564,
+ 0,1,0,0.256317,0,0.072881,
+ 0,1,0,0.225964,0,0.161564,
+ 0,1,0,0.234166,0,0.160331,
+ 0,1,0,0.256317,0,0.072881,
+ 0,1,0,0.234166,0,0.160331,
+ 0,1,0,0.261724,0,0.159312,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.261557,0,0.072881,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.261557,0,0.072881,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.256317,0,0.072881,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.261557,0,0.072881,
+ 0,1,0,0.277221,0,0.075279,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.277221,0,0.075279,
+ 0,1,0,0.317776,0,0.082282,
+ 0,1,0,0.269452,0,0.084624,
+ 0,1,0,0.261557,0,0.072881,
+ 0,1,0,0.261557,0,0.084624,
+ 0,1,0,0.261557,0,0.072881,
+ 0,1,0,0.269452,0,0.084624,
+ 0,1,0,0.277221,0,0.075279,
+ 0,1,0,0.289785,0,0.088598,
+ 0,1,0,0.287961,0,0.07869,
+ 0,1,0,0.281601,0,0.088598,
+ 0,1,0,0.277221,0,0.075279,
+ 0,1,0,0.287961,0,0.07869,
+ 0,1,0,0.317776,0,0.082282,
+ 0,1,0,0.287961,0,0.07869,
+ 0,1,0,0.277221,0,0.075279,
+ 0,1,0,0.281601,0,0.088598,
+ 0,1,0,0.317776,0,0.082282,
+ 0,1,0,0.287961,0,0.07869,
+ 0,1,0,0.299525,0,0.081697,
+ 0,1,0,0.317776,0,0.082282,
+ 0,1,0,0.299525,0,0.081697,
+ 0,1,0,0.310606,0,0.087359,
+ 0,1,0,0.333544,0,0.184582,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.317776,0,0.082282,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.333544,0,0.184582,
+ 0,1,0,0.37772,0,0.181407,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.37772,0,0.181407,
+ 0,1,0,0.370959,0,0.119141,
+ 0,1,0,0.370959,0,0.119141,
+ 0,1,0,0.372074,0,0.108315,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.372074,0,0.108315,
+ 0,1,0,0.370959,0,0.119141,
+ 0,1,0,0.372137,0,0.112193,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.376455,0,-0.041627,
+ 0,1,0,0.207789,0,-0.043575,
+ 0,1,0,0.376455,0,-0.041627,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.420461,0,0.087749,
+ 0,1,0,0.376455,0,-0.041627,
+ 0,1,0,0.420461,0,0.087749,
+ 0,1,0,0.454473,0,0.095982,
+ 0,1,0,0.394231,0,0.112852,
+ 0,1,0,0.38823,0,0.091739,
+ 0,1,0,0.38823,0,0.106849,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.403191,0,0.089718,
+ 0,1,0,0.420461,0,0.087749,
+ 0,1,0,0.403191,0,0.089718,
+ 0,1,0,0.366697,0,0.082669,
+ 0,1,0,0.38823,0,0.091739,
+ 0,1,0,0.403191,0,0.089718,
+ 0,1,0,0.38823,0,0.091739,
+ 0,1,0,0.397302,0,0.093667,
+ 0,1,0,0.397302,0,0.093667,
+ 0,1,0,0.38823,0,0.091739,
+ 0,1,0,0.394231,0,0.112852,
+ 0,1,0,0.397302,0,0.093667,
+ 0,1,0,0.394231,0,0.112852,
+ 0,1,0,0.396581,0,0.105608,
+ 0,1,0,0.420461,0,0.087749,
+ 0,1,0,0.446113,0,0.095183,
+ 0,1,0,0.454473,0,0.095982,
+ 0,1,0,0.446113,0,0.095183,
+ 0,1,0,0.420461,0,0.087749,
+ 0,1,0,0.436002,0,0.094225,
+ 0,1,0,0.436002,0,0.094225,
+ 0,1,0,0.420461,0,0.087749,
+ 0,1,0,0.431829,0,0.094236,
+ 0,1,0,0.431829,0,0.094236,
+ 0,1,0,0.420461,0,0.087749,
+ 0,1,0,0.422378,0,0.108735,
+ 0,1,0,0.431829,0,0.094236,
+ 0,1,0,0.422378,0,0.108735,
+ 0,1,0,0.428035,0,0.110773,
+ 0,1,0,0.431829,0,0.094236,
+ 0,1,0,0.428035,0,0.110773,
+ 0,1,0,0.430142,0,0.106462,
+ 0,1,0,0.446113,0,0.095183,
+ 0,1,0,0.436002,0,0.094225,
+ 0,1,0,0.43972,0,0.097141,
+ 0,1,0,0.446113,0,0.095183,
+ 0,1,0,0.43972,0,0.097141,
+ 0,1,0,0.442315,0,0.106176,
+ 0,1,0,0.446113,0,0.095183,
+ 0,1,0,0.442315,0,0.106176,
+ 0,1,0,0.446113,0,0.10759,
+ 0,1,0,0.463906,0,0.207466,
+ 0,1,0,0.497607,0,0.091808,
+ 0,1,0,0.454473,0,0.095982,
+ 0,1,0,0.497607,0,0.091808,
+ 0,1,0,0.463906,0,0.207466,
+ 0,1,0,0.497655,0,0.099429,
+ 0,1,0,0.497655,0,0.099429,
+ 0,1,0,0.463906,0,0.207466,
+ 0,1,0,0.509623,0,0.205684,
+ 0,1,0,0.50481,0,0.10516,
+ 0,1,0,0.511486,0,0.090215,
+ 0,1,0,0.501456,0,0.091808,
+ 0,1,0,0.511486,0,0.090215,
+ 0,1,0,0.50481,0,0.10516,
+ 0,1,0,0.509337,0,0.103405,
+ 0,1,0,0.52893,0,0.10095,
+ 0,1,0,0.553107,0,0.091478,
+ 0,1,0,0.511486,0,0.090215,
+ 0,1,0,0.553107,0,0.091478,
+ 0,1,0,0.52893,0,0.10095,
+ 0,1,0,0.54413,0,0.10095,
+ 0,1,0,0.644949,0,0.236471,
+ 0,1,0,0.572047,0,0.105355,
+ 0,1,0,0.569738,0,0.111048,
+ 0,1,0,0.572047,0,0.105355,
+ 0,1,0,0.644949,0,0.236471,
+ 0,1,0,0.644873,0,0.222943,
+ 0,1,0,0.644873,0,0.222943,
+ 0,1,0,0.644949,0,0.236471,
+ 0,1,0,0.64714,0,0.231454,
+ 0,1,0,0.550144,0,0.127813,
+ 0,1,0,0.547445,0,0.124606,
+ 0,1,0,0.545142,0,0.125558,
+ 0,1,0,0.547445,0,0.124606,
+ 0,1,0,0.550144,0,0.127813,
+ 0,1,0,0.552892,0,0.116183,
+ 0,1,0,0.552892,0,0.116183,
+ 0,1,0,0.550144,0,0.127813,
+ 0,1,0,0.566351,0,0.123158,
+ 0,1,0,0.552892,0,0.116183,
+ 0,1,0,0.566351,0,0.123158,
+ 0,1,0,0.552912,0,0.114184,
+ 0,1,0,0.552912,0,0.114184,
+ 0,1,0,0.566351,0,0.123158,
+ 0,1,0,0.556858,0,0.098286,
+ 0,1,0,0.556422,0,0.095834,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.553107,0,0.091478,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.556422,0,0.095834,
+ 0,1,0,0.556858,0,0.098286,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.556858,0,0.098286,
+ 0,1,0,0.572047,0,0.105355,
+ 0,1,0,0.572047,0,0.105355,
+ 0,1,0,0.556858,0,0.098286,
+ 0,1,0,0.569738,0,0.111048,
+ 0,1,0,0.569738,0,0.111048,
+ 0,1,0,0.556858,0,0.098286,
+ 0,1,0,0.566351,0,0.123158,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.572047,0,0.105355,
+ 0,1,0,0.579834,0,0.105355,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.579834,0,0.105355,
+ 0,1,0,0.579933,0,0.109136,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.579933,0,0.109136,
+ 0,1,0,0.582443,0,0.111613,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.582443,0,0.111613,
+ 0,1,0,0.591814,0,0.112965,
+ 0,1,0,0.634432,0,0.166831,
+ 0,1,0,0.620851,0,0.091797,
+ 0,1,0,0.614411,0,0.098278,
+ 0,1,0,0.620851,0,0.091797,
+ 0,1,0,0.634432,0,0.166831,
+ 0,1,0,0.641824,0,0.166831,
+ 0,1,0,0.636952,0,0.101194,
+ 0,1,0,0.631438,0,0.091797,
+ 0,1,0,0.629595,0,0.098001,
+ 0,1,0,0.631438,0,0.091797,
+ 0,1,0,0.636952,0,0.101194,
+ 0,1,0,0.643871,0,0.087598,
+ 0,1,0,0.667128,0,0.360389,
+ 0,1,0,0.663409,0,0.259363,
+ 0,1,0,0.660866,0,0.358077,
+ 0,1,0,0.660866,0,0.358077,
+ 0,1,0,0.652329,0,0.09576,
+ 0,1,0,0.643871,0,0.087598,
+ 0,1,0,0.652329,0,0.09576,
+ 0,1,0,0.660866,0,0.358077,
+ 0,1,0,0.663409,0,0.249927,
+ 0,1,0,0.663409,0,0.249927,
+ 0,1,0,0.660866,0,0.358077,
+ 0,1,0,0.663409,0,0.259363,
+ 0,1,0,0.652329,0,0.09576,
+ 0,1,0,0.657966,0,0.089941,
+ 0,1,0,0.643871,0,0.087598,
+ 0,1,0,0.657966,0,0.089941,
+ 0,1,0,0.652329,0,0.09576,
+ 0,1,0,0.657966,0,0.095447,
+ 0,1,0,0.669946,0,0.10117,
+ 0,1,0,0.663424,0,0.094392,
+ 0,1,0,0.663409,0,0.099025,
+ 0,1,0,0.663424,0,0.094392,
+ 0,1,0,0.698505,0,0.081469,
+ 0,1,0,0.662071,0,0.090935,
+ 0,1,0,0.698505,0,0.081469,
+ 0,1,0,0.663424,0,0.094392,
+ 0,1,0,0.669946,0,0.092138,
+ 0,1,0,0.669946,0,0.092138,
+ 0,1,0,0.663424,0,0.094392,
+ 0,1,0,0.669946,0,0.10117,
+ 0,1,0,0.698505,0,0.081469,
+ 0,1,0,0.669946,0,0.092138,
+ 0,1,0,0.682405,0,0.093684,
+ 0,1,0,0.698505,0,0.081469,
+ 0,1,0,0.682405,0,0.093684,
+ 0,1,0,0.687829,0,0.097372,
+ 0,1,0,0.759943,0,0.121689,
+ 0,1,0,0.761196,0,0.112841,
+ 0,1,0,0.757564,0,0.116773,
+ 0,1,0,0.761196,0,0.112841,
+ 0,1,0,0.759943,0,0.121689,
+ 0,1,0,0.763846,0,0.119808,
+ 0,1,0,0.739593,0,0.106753,
+ 0,1,0,0.730899,0,0.094722,
+ 0,1,0,0.727889,0,0.103317,
+ 0,1,0,0.730899,0,0.094722,
+ 0,1,0,0.739593,0,0.106753,
+ 0,1,0,0.739289,0,0.082921,
+ 0,1,0,0.739289,0,0.082921,
+ 0,1,0,0.739593,0,0.106753,
+ 0,1,0,0.741908,0,0.084462,
+ 0,1,0,0.741908,0,0.084462,
+ 0,1,0,0.739593,0,0.106753,
+ 0,1,0,0.742166,0,0.093571,
+ 0,1,0,0.741908,0,0.084462,
+ 0,1,0,0.742166,0,0.093571,
+ 0,1,0,0.783334,0,0.120508,
+ 0,1,0,0.783334,0,0.120508,
+ 0,1,0,0.742166,0,0.093571,
+ 0,1,0,0.761196,0,0.112841,
+ 0,1,0,0.783334,0,0.120508,
+ 0,1,0,0.761196,0,0.112841,
+ 0,1,0,0.767964,0,0.117251,
+ 0,1,0,0.767964,0,0.117251,
+ 0,1,0,0.761196,0,0.112841,
+ 0,1,0,0.763846,0,0.119808,
+ 0,1,0,0.783334,0,0.120508,
+ 0,1,0,0.767964,0,0.117251,
+ 0,1,0,0.777789,0,0.128777,
+ 0,1,0,0.721492,0,0.088515,
+ 0,1,0,0.741942,0,0.07987,
+ 0,1,0,0.72121,0,0.082325,
+ 0,1,0,0.741942,0,0.07987,
+ 0,1,0,0.721492,0,0.088515,
+ 0,1,0,0.739289,0,0.082921,
+ 0,1,0,0.739289,0,0.082921,
+ 0,1,0,0.721492,0,0.088515,
+ 0,1,0,0.730899,0,0.094722,
+ 0,1,0,0.745551,0,0.080024,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.741942,0,0.07987,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.745551,0,0.080024,
+ 0,1,0,0.747943,0,0.080733,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.747943,0,0.080733,
+ 0,1,0,0.764433,0,0.083265,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.764433,0,0.083265,
+ 0,1,0,0.772205,0,0.083449,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.787201,0,0.073019,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.892328,0,0.094571,
+ 0,1,0,0.787201,0,0.073019,
+ 0,1,0,0.93599,0,-0.034208,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.93599,0,-0.034208,
+ 0,1,0,0.787201,0,0.073019,
+ 0,1,0,0.916393,0,0.003488,
+ 0,1,0,0.916393,0,0.003488,
+ 0,1,0,0.787201,0,0.073019,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.93599,0,-0.034208,
+ 0,1,0,0.916393,0,0.003488,
+ 0,1,0,0.936516,0,-0.027225,
+ 0,1,0,0.777327,0,0.11054,
+ 0,1,0,0.793083,0,0.086486,
+ 0,1,0,0.774096,0,0.103935,
+ 0,1,0,0.793083,0,0.086486,
+ 0,1,0,0.777327,0,0.11054,
+ 0,1,0,0.781652,0,0.108678,
+ 0,1,0,0.793083,0,0.086486,
+ 0,1,0,0.781652,0,0.108678,
+ 0,1,0,0.805114,0,0.089496,
+ 0,1,0,0.793083,0,0.086486,
+ 0,1,0,0.805114,0,0.089496,
+ 0,1,0,0.794464,0,0.083624,
+ 0,1,0,0.8128,0,0.105465,
+ 0,1,0,0.805114,0,0.089496,
+ 0,1,0,0.800691,0,0.103287,
+ 0,1,0,0.794464,0,0.083624,
+ 0,1,0,0.787201,0,0.073019,
+ 0,1,0,0.787201,0,0.083237,
+ 0,1,0,0.787201,0,0.073019,
+ 0,1,0,0.794464,0,0.083624,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.794464,0,0.083624,
+ 0,1,0,0.805114,0,0.089496,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.805114,0,0.089496,
+ 0,1,0,0.817616,0,0.086439,
+ 0,1,0,0.817616,0,0.086439,
+ 0,1,0,0.805114,0,0.089496,
+ 0,1,0,0.815769,0,0.089603,
+ 0,1,0,0.815769,0,0.089603,
+ 0,1,0,0.805114,0,0.089496,
+ 0,1,0,0.8128,0,0.105465,
+ 0,1,0,0.846707,0,0.099473,
+ 0,1,0,0.841234,0,0.094315,
+ 0,1,0,0.841234,0,0.099473,
+ 0,1,0,0.8516,0,0.100934,
+ 0,1,0,0.852472,0,0.096213,
+ 0,1,0,0.850639,0,0.099893,
+ 0,1,0,0.852472,0,0.096213,
+ 0,1,0,0.8516,0,0.100934,
+ 0,1,0,0.857423,0,0.100975,
+ 0,1,0,0.892328,0,0.101988,
+ 0,1,0,0.862558,0,0.094381,
+ 0,1,0,0.861866,0,0.107563,
+ 0,1,0,0.825162,0,0.09278,
+ 0,1,0,0.831943,0,0.090034,
+ 0,1,0,0.82127,0,0.090034,
+ 0,1,0,0.831943,0,0.090034,
+ 0,1,0,0.825162,0,0.09278,
+ 0,1,0,0.841234,0,0.094315,
+ 0,1,0,0.831943,0,0.090034,
+ 0,1,0,0.841234,0,0.094315,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.841234,0,0.094315,
+ 0,1,0,0.846707,0,0.093071,
+ 0,1,0,0.832532,0,0.080587,
+ 0,1,0,0.846707,0,0.093071,
+ 0,1,0,0.892328,0,0.094571,
+ 0,1,0,0.846707,0,0.093071,
+ 0,1,0,0.841234,0,0.094315,
+ 0,1,0,0.846707,0,0.099473,
+ 0,1,0,0.892328,0,0.094571,
+ 0,1,0,0.846707,0,0.093071,
+ 0,1,0,0.862558,0,0.094381,
+ 0,1,0,0.862558,0,0.094381,
+ 0,1,0,0.846707,0,0.093071,
+ 0,1,0,0.857423,0,0.094381,
+ 0,1,0,0.857423,0,0.094381,
+ 0,1,0,0.846707,0,0.093071,
+ 0,1,0,0.852472,0,0.096213,
+ 0,1,0,0.857423,0,0.094381,
+ 0,1,0,0.852472,0,0.096213,
+ 0,1,0,0.857423,0,0.100975,
+ 0,1,0,0.892328,0,0.094571,
+ 0,1,0,0.862558,0,0.094381,
+ 0,1,0,0.892328,0,0.101988,
+ 0,1,0,0.899199,0,0.094571,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.892328,0,0.094571,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.899199,0,0.094571,
+ 0,1,0,0.899404,0,0.097981,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.899404,0,0.097981,
+ 0,1,0,0.909473,0,0.097981,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.909473,0,0.097981,
+ 0,1,0,0.916301,0,0.092997,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.916301,0,0.092997,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.916301,0,0.092997,
+ 0,1,0,0.918851,0,0.098476,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.918851,0,0.098476,
+ 0,1,0,0.925888,0,0.095161,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.925888,0,0.095161,
+ 0,1,0,0.926485,0,0.100656,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.926485,0,0.100656,
+ 0,1,0,0.92745,0,0.10042,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.92745,0,0.10042,
+ 0,1,0,0.929789,0,0.096688,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.929789,0,0.096688,
+ 0,1,0,0.935651,0,0.092805,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.915137,0,0.028034,
+ 0,1,0,0.909874,0,0.024996,
+ 0,1,0,0.915137,0,0.028034,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.966042,0,0.048493,
+ 0,1,0,0.966042,0,0.048493,
+ 0,1,0,0.935651,0,0.083822,
+ 0,1,0,0.946131,0,0.086203,
+ 0,1,0,0.966042,0,0.048493,
+ 0,1,0,0.946131,0,0.086203,
+ 0,1,0,0.947032,0,0.091237,
+ 0,1,0,0.966042,0,0.048493,
+ 0,1,0,0.947032,0,0.091237,
+ 0,1,0,0.952058,0,0.086382,
+ 0,1,0,0.952058,0,0.086382,
+ 0,1,0,0.947032,0,0.091237,
+ 0,1,0,0.951521,0,0.095301,
+ 0,1,0,0.966042,0,0.048493,
+ 0,1,0,0.952058,0,0.086382,
+ 0,1,0,0.959508,0,0.086382,
+ 0,1,0,0.966042,0,0.048493,
+ 0,1,0,0.959508,0,0.086382,
+ 0,1,0,0.96675,0,0.087777,
+ 0,1,0,0.966042,0,0.048493,
+ 0,1,0,0.96675,0,0.087777,
+ 0,1,0,0.967897,0,0.050346,
+ 0,1,0,0.967897,0,0.050346,
+ 0,1,0,0.96675,0,0.087777,
+ 0,1,0,0.98216,0,0.092901,
+ 0,1,0,0.967897,0,0.050346,
+ 0,1,0,0.98216,0,0.092901,
+ 0,1,0,0.976559,0,0.061589,
+ 0,1,0,0.976559,0,0.061589,
+ 0,1,0,0.98216,0,0.092901,
+ 0,1,0,0.989246,0,0.074312,
+ 0,1,0,0.98144,0,0.13698,
+ 0,1,0,0.96675,0,0.087777,
+ 0,1,0,0.959508,0,0.086382,
+ 0,1,0,0.96675,0,0.087777,
+ 0,1,0,0.98144,0,0.13698,
+ 0,1,0,0.985565,0,0.138938,
+ 0,1,0,0.985565,0,0.138938,
+ 0,1,0,0.98144,0,0.13698,
+ 0,1,0,0.984862,0,0.140108,
+ 0,1,0,0.985565,0,0.138938,
+ 0,1,0,0.984862,0,0.140108,
+ 0,1,0,0.985414,0,0.139537,
+ 0,1,0,0.60316,0,0.098248,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.60316,0,0.098248,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.60316,0,0.098248,
+ 0,1,0,0.620851,0,0.091797,
+ 0,1,0,0.620851,0,0.091797,
+ 0,1,0,0.60316,0,0.098248,
+ 0,1,0,0.614411,0,0.098278,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.620851,0,0.091797,
+ 0,1,0,0.631438,0,0.091797,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.631438,0,0.091797,
+ 0,1,0,0.643871,0,0.087598,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.643871,0,0.087598,
+ 0,1,0,0.657966,0,0.089941,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.657966,0,0.089941,
+ 0,1,0,0.662071,0,0.090935,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.662071,0,0.090935,
+ 0,1,0,0.698505,0,0.081469,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.698505,0,0.081469,
+ 0,1,0,0.704247,0,0.079546,
+ 0,1,0,0.454473,0,0.095982,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.376455,0,-0.041627,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.454473,0,0.095982,
+ 0,1,0,0.497607,0,0.091808,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.497607,0,0.091808,
+ 0,1,0,0.501456,0,0.091808,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.501456,0,0.091808,
+ 0,1,0,0.511486,0,0.090215,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.511486,0,0.090215,
+ 0,1,0,0.553107,0,0.091478,
+ 0,1,0,0.591814,0,-0.039138,
+ 0,1,0,0.553107,0,0.091478,
+ 0,1,0,0.591814,0,0.095491,
+ 0,1,0,0.72121,0,0.082325,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.704247,0,0.079546,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.72121,0,0.082325,
+ 0,1,0,0.741942,0,0.07987,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.741942,0,0.07987,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.755534,0,-0.037246,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.935029,0,-0.035172,
+ 0,1,0,0.935029,0,-0.035172,
+ 0,1,0,0.775495,0,0.071129,
+ 0,1,0,0.93599,0,-0.034208,
+ 0,1,0,0.693133,0,0.290579,
+ 0,1,0,0.663409,0,0.249927,
+ 0,1,0,0.663409,0,0.259363,
+ 0,1,0,0.663409,0,0.249927,
+ 0,1,0,0.693133,0,0.290579,
+ 0,1,0,0.69697,0,0.283488
+};
+static const struct gllist ships_ship5_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 702, ships_ship5_data, 0
+};
+const struct gllist *ships_ship5 = &ships_ship5_frame;
+
+static const float ships_ship6_data[] = {
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.00761,0,0.035711,
+ 0,1,0,0.005168,0,0.049856,
+ 0,1,0,0.00761,0,0.035711,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.012035,0,-0.003074,
+ 0,1,0,0.012035,0,-0.003074,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.012056,0,-0.009788,
+ 0,1,0,0.012056,0,-0.009788,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.020554,0,-0.019586,
+ 0,1,0,0.020554,0,-0.019586,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.069502,0,-0.027048,
+ 0,1,0,0.069502,0,-0.027048,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.100116,0,-0.032121,
+ 0,1,0,0.100116,0,-0.032121,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.119522,0,-0.037428,
+ 0,1,0,0.317531,0,0.099131,
+ 0,1,0,0.301761,0,-0.052847,
+ 0,1,0,0.301761,0,0.101015,
+ 0,1,0,0.301761,0,-0.052847,
+ 0,1,0,0.317531,0,0.099131,
+ 0,1,0,0.327571,0,0.095154,
+ 0,1,0,0.301761,0,-0.052847,
+ 0,1,0,0.327571,0,0.095154,
+ 0,1,0,0.337878,0,0.093814,
+ 0,1,0,0.114815,0,0.086584,
+ 0,1,0,0.119522,0,-0.037428,
+ 0,1,0,0.113471,0,0.075648,
+ 0,1,0,0.119522,0,-0.037428,
+ 0,1,0,0.114815,0,0.086584,
+ 0,1,0,0.149053,0,0.088333,
+ 0,1,0,0.044223,0,0.078999,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.037078,0,0.07165,
+ 0,1,0,0.037189,0,0.049856,
+ 0,1,0,0.044223,0,0.078999,
+ 0,1,0,0.119522,0,-0.037428,
+ 0,1,0,0.119522,0,-0.037428,
+ 0,1,0,0.044223,0,0.078999,
+ 0,1,0,0.055073,0,0.07854,
+ 0,1,0,0.119522,0,-0.037428,
+ 0,1,0,0.055073,0,0.07854,
+ 0,1,0,0.113471,0,0.075648,
+ 0,1,0,0.149053,0,0.088333,
+ 0,1,0,0.179741,0,-0.042731,
+ 0,1,0,0.119522,0,-0.037428,
+ 0,1,0,0.179741,0,-0.042731,
+ 0,1,0,0.149053,0,0.088333,
+ 0,1,0,0.301761,0,0.101015,
+ 0,1,0,0.179741,0,-0.042731,
+ 0,1,0,0.301761,0,0.101015,
+ 0,1,0,0.301761,0,-0.052847,
+ 0,1,0,0.172143,0,0.125958,
+ 0,1,0,0.149053,0,0.088333,
+ 0,1,0,0.149053,0,0.125958,
+ 0,1,0,0.149053,0,0.088333,
+ 0,1,0,0.172143,0,0.125958,
+ 0,1,0,0.301761,0,0.101015,
+ 0,1,0,0.172143,0,0.125958,
+ 0,1,0,0.264064,0,0.128088,
+ 0,1,0,0.301761,0,0.101015,
+ 0,1,0,0.264064,0,0.128088,
+ 0,1,0,0.172143,0,0.125958,
+ 0,1,0,0.257925,0,0.133426,
+ 0,1,0,0.307142,0,0.1844,
+ 0,1,0,0.265691,0,0.157236,
+ 0,1,0,0.262648,0,0.186124,
+ 0,1,0,0.265691,0,0.157236,
+ 0,1,0,0.307142,0,0.1844,
+ 0,1,0,0.304541,0,0.176581,
+ 0,1,0,0.265691,0,0.157236,
+ 0,1,0,0.304541,0,0.176581,
+ 0,1,0,0.301761,0,0.101015,
+ 0,1,0,0.301761,0,0.101015,
+ 0,1,0,0.264064,0,0.128088,
+ 0,1,0,0.265691,0,0.157236,
+ 0,1,0,0.257941,0,0.155385,
+ 0,1,0,0.172143,0,0.125958,
+ 0,1,0,0.170246,0,0.156415,
+ 0,1,0,0.172143,0,0.125958,
+ 0,1,0,0.257941,0,0.155385,
+ 0,1,0,0.257925,0,0.133426,
+ 0,1,0,0.337878,0,0.093814,
+ 0,1,0,0.314473,0,-0.053901,
+ 0,1,0,0.301761,0,-0.052847,
+ 0,1,0,0.314473,0,-0.053901,
+ 0,1,0,0.337878,0,0.093814,
+ 0,1,0,0.439288,0,-0.062858,
+ 0,1,0,0.439288,0,-0.062858,
+ 0,1,0,0.337878,0,0.093814,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.684966,0,0.102797,
+ 0,1,0,0.692751,0,0.029614,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.692751,0,0.029614,
+ 0,1,0,0.684966,0,0.102797,
+ 0,1,0,0.692758,0,0.037014,
+ 0,1,0,0.692758,0,0.037014,
+ 0,1,0,0.684966,0,0.102797,
+ 0,1,0,0.693759,0,0.091606,
+ 0,1,0,0.410007,0,0.09773,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.337878,0,0.093814,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.410007,0,0.09773,
+ 0,1,0,0.46531,0,0.0988,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.46531,0,0.0988,
+ 0,1,0,0.554952,0,0.103058,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.554952,0,0.103058,
+ 0,1,0,0.642868,0,0.109787,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.642868,0,0.109787,
+ 0,1,0,0.684966,0,0.102797,
+ 0,1,0,0.684966,0,0.102797,
+ 0,1,0,0.642868,0,0.109787,
+ 0,1,0,0.662723,0,0.107084,
+ 0,1,0,0.692751,0,0.029614,
+ 0,1,0,0.698436,0,-0.076424,
+ 0,1,0,0.596878,0,-0.07232,
+ 0,1,0,0.698436,0,-0.076424,
+ 0,1,0,0.692751,0,0.029614,
+ 0,1,0,0.834403,0,-0.08059,
+ 0,1,0,0.904352,0,0.036065,
+ 0,1,0,0.925985,0,-0.018014,
+ 0,1,0,0.801927,0,0.033143,
+ 0,1,0,0.925985,0,-0.018014,
+ 0,1,0,0.904352,0,0.036065,
+ 0,1,0,0.980572,0,0.03958,
+ 0,1,0,0.925985,0,-0.018014,
+ 0,1,0,0.980572,0,0.03958,
+ 0,1,0,0.976029,0,0.029161,
+ 0,1,0,0.757179,0,0.029859,
+ 0,1,0,0.834403,0,-0.08059,
+ 0,1,0,0.692751,0,0.029614,
+ 0,1,0,0.834403,0,-0.08059,
+ 0,1,0,0.757179,0,0.029859,
+ 0,1,0,0.801927,0,0.033143,
+ 0,1,0,0.868277,0,-0.047334,
+ 0,1,0,0.834403,0,-0.08059,
+ 0,1,0,0.801927,0,0.033143,
+ 0,1,0,0.834403,0,-0.08059,
+ 0,1,0,0.868277,0,-0.047334,
+ 0,1,0,0.851539,0,-0.083355,
+ 0,1,0,0.851539,0,-0.083355,
+ 0,1,0,0.868277,0,-0.047334,
+ 0,1,0,0.891466,0,-0.085733,
+ 0,1,0,0.925985,0,-0.018014,
+ 0,1,0,0.868277,0,-0.047334,
+ 0,1,0,0.801927,0,0.033143,
+ 0,1,0,0.868277,0,-0.047334,
+ 0,1,0,0.925985,0,-0.018014,
+ 0,1,0,0.879096,0,-0.042237,
+ 0,1,0,0.763854,0,0.035269,
+ 0,1,0,0.801927,0,0.033143,
+ 0,1,0,0.757179,0,0.029859,
+ 0,1,0,0.801927,0,0.033143,
+ 0,1,0,0.763854,0,0.035269,
+ 0,1,0,0.773021,0,0.039488,
+ 0,1,0,0.801927,0,0.033143,
+ 0,1,0,0.773021,0,0.039488,
+ 0,1,0,0.796625,0,0.034321,
+ 0,1,0,0.796625,0,0.034321,
+ 0,1,0,0.773021,0,0.039488,
+ 0,1,0,0.786431,0,0.038696
+};
+static const struct gllist ships_ship6_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 171, ships_ship6_data, 0
+};
+const struct gllist *ships_ship6 = &ships_ship6_frame;
+
+static const float ships_ship7_data[] = {
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.014324,0,-0.091298,
+ 0,1,0,0.008486,0,0.067418,
+ 0,1,0,0.622021,0,0.158469,
+ 0,1,0,0.618682,0,0.141172,
+ 0,1,0,0.616974,0,0.153637,
+ 0,1,0,0.668086,0,0.19311,
+ 0,1,0,0.622021,0,0.185792,
+ 0,1,0,0.618171,0,0.193377,
+ 0,1,0,0.622021,0,0.185792,
+ 0,1,0,0.668086,0,0.19311,
+ 0,1,0,0.622021,0,0.158469,
+ 0,1,0,0.622021,0,0.158469,
+ 0,1,0,0.668086,0,0.19311,
+ 0,1,0,0.656931,0,0.083623,
+ 0,1,0,0.656931,0,0.083623,
+ 0,1,0,0.668086,0,0.19311,
+ 0,1,0,0.668588,0,0.191766,
+ 0,1,0,0.609389,0,0.079131,
+ 0,1,0,0.656931,0,0.083623,
+ 0,1,0,0.597457,0,0.051725,
+ 0,1,0,0.656931,0,0.083623,
+ 0,1,0,0.609389,0,0.079131,
+ 0,1,0,0.618682,0,0.141172,
+ 0,1,0,0.656931,0,0.083623,
+ 0,1,0,0.618682,0,0.141172,
+ 0,1,0,0.622021,0,0.158469,
+ 0,1,0,0.120954,0,0.083755,
+ 0,1,0,0.13173,0,0.077601,
+ 0,1,0,0.116971,0,0.077939,
+ 0,1,0,0.13173,0,0.077601,
+ 0,1,0,0.120954,0,0.083755,
+ 0,1,0,0.132081,0,0.085502,
+ 0,1,0,0.284714,0,0.077601,
+ 0,1,0,0.327336,0,-0.097558,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.327336,0,-0.097558,
+ 0,1,0,0.284714,0,0.077601,
+ 0,1,0,0.315366,0,0.092546,
+ 0,1,0,0.327336,0,-0.097558,
+ 0,1,0,0.315366,0,0.092546,
+ 0,1,0,0.317931,0,0.120779,
+ 0,1,0,0.327336,0,-0.097558,
+ 0,1,0,0.317931,0,0.120779,
+ 0,1,0,0.330962,0,0.131536,
+ 0,1,0,0.327336,0,-0.097558,
+ 0,1,0,0.330962,0,0.131536,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.330962,0,0.131536,
+ 0,1,0,0.34539,0,0.136116,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.34539,0,0.136116,
+ 0,1,0,0.348844,0,0.131725,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.348844,0,0.131725,
+ 0,1,0,0.355564,0,0.134282,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.355564,0,0.134282,
+ 0,1,0,0.362675,0,0.139519,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.362675,0,0.139519,
+ 0,1,0,0.367321,0,0.138882,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.367321,0,0.138882,
+ 0,1,0,0.37021,0,0.158014,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.37021,0,0.158014,
+ 0,1,0,0.377344,0,0.138085,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.377344,0,0.138085,
+ 0,1,0,0.428914,0,0.138503,
+ 0,1,0,0.428914,0,0.138503,
+ 0,1,0,0.377344,0,0.138085,
+ 0,1,0,0.418305,0,0.141517,
+ 0,1,0,0.009607,0,0.075536,
+ 0,1,0,0.000711,0,0.067906,
+ 0,1,0,0,0,0.069294,
+ 0,1,0,0.000711,0,0.067906,
+ 0,1,0,0.009607,0,0.075536,
+ 0,1,0,0.008486,0,0.067418,
+ 0,1,0,0.008486,0,0.067418,
+ 0,1,0,0.009607,0,0.075536,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.009607,0,0.075536,
+ 0,1,0,0.041213,0,0.073473,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.041213,0,0.073473,
+ 0,1,0,0.086238,0,0.074943,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.086238,0,0.074943,
+ 0,1,0,0.096676,0,0.077939,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.096676,0,0.077939,
+ 0,1,0,0.116971,0,0.077939,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.116971,0,0.077939,
+ 0,1,0,0.13173,0,0.077601,
+ 0,1,0,0.17083,0,-0.094428,
+ 0,1,0,0.13173,0,0.077601,
+ 0,1,0,0.284714,0,0.077601,
+ 0,1,0,0.287798,0,0.099437,
+ 0,1,0,0.284714,0,0.077601,
+ 0,1,0,0.281269,0,0.098363,
+ 0,1,0,0.284714,0,0.077601,
+ 0,1,0,0.287798,0,0.099437,
+ 0,1,0,0.290717,0,0.092546,
+ 0,1,0,0.284714,0,0.077601,
+ 0,1,0,0.290717,0,0.092546,
+ 0,1,0,0.315366,0,0.092546,
+ 0,1,0,0.245353,0,0.230555,
+ 0,1,0,0.311617,0,0.103912,
+ 0,1,0,0.245351,0,0.225658,
+ 0,1,0,0.311617,0,0.103912,
+ 0,1,0,0.245353,0,0.230555,
+ 0,1,0,0.315583,0,0.110485,
+ 0,1,0,0.311617,0,0.103912,
+ 0,1,0,0.315583,0,0.110485,
+ 0,1,0,0.315366,0,0.092546,
+ 0,1,0,0.315366,0,0.092546,
+ 0,1,0,0.315583,0,0.110485,
+ 0,1,0,0.317931,0,0.120779,
+ 0,1,0,0.317931,0,0.120779,
+ 0,1,0,0.315583,0,0.110485,
+ 0,1,0,0.316521,0,0.120995,
+ 0,1,0,0.332508,0,0.260412,
+ 0,1,0,0.331132,0,0.250756,
+ 0,1,0,0.327441,0,0.260681,
+ 0,1,0,0.330962,0,0.131536,
+ 0,1,0,0.317931,0,0.120779,
+ 0,1,0,0.328331,0,0.211178,
+ 0,1,0,0.340791,0,0.338854,
+ 0,1,0,0.338533,0,0.299547,
+ 0,1,0,0.329553,0,0.330834,
+ 0,1,0,0.345635,0,0.395783,
+ 0,1,0,0.314718,0,0.384075,
+ 0,1,0,0.313951,0,0.386601,
+ 0,1,0,0.314718,0,0.384075,
+ 0,1,0,0.345635,0,0.395783,
+ 0,1,0,0.345113,0,0.39162,
+ 0,1,0,0.327947,0,0.216964,
+ 0,1,0,0.267365,0,0.206311,
+ 0,1,0,0.26709,0,0.20931,
+ 0,1,0,0.267365,0,0.206311,
+ 0,1,0,0.327947,0,0.216964,
+ 0,1,0,0.328331,0,0.211178,
+ 0,1,0,0.328331,0,0.211178,
+ 0,1,0,0.327947,0,0.216964,
+ 0,1,0,0.331132,0,0.250756,
+ 0,1,0,0.328331,0,0.211178,
+ 0,1,0,0.331132,0,0.250756,
+ 0,1,0,0.330962,0,0.131536,
+ 0,1,0,0.330962,0,0.131536,
+ 0,1,0,0.331132,0,0.250756,
+ 0,1,0,0.33706,0,0.213894,
+ 0,1,0,0.33706,0,0.213894,
+ 0,1,0,0.331132,0,0.250756,
+ 0,1,0,0.332508,0,0.260412,
+ 0,1,0,0.33706,0,0.213894,
+ 0,1,0,0.332508,0,0.260412,
+ 0,1,0,0.338533,0,0.299547,
+ 0,1,0,0.33706,0,0.213894,
+ 0,1,0,0.338533,0,0.299547,
+ 0,1,0,0.337814,0,0.218526,
+ 0,1,0,0.337814,0,0.218526,
+ 0,1,0,0.338533,0,0.299547,
+ 0,1,0,0.342221,0,0.274447,
+ 0,1,0,0.342221,0,0.274447,
+ 0,1,0,0.338533,0,0.299547,
+ 0,1,0,0.341927,0,0.280776,
+ 0,1,0,0.341927,0,0.280776,
+ 0,1,0,0.338533,0,0.299547,
+ 0,1,0,0.340791,0,0.338854,
+ 0,1,0,0.342221,0,0.274447,
+ 0,1,0,0.341927,0,0.280776,
+ 0,1,0,0.39956,0,0.285924,
+ 0,1,0,0.342221,0,0.274447,
+ 0,1,0,0.39956,0,0.285924,
+ 0,1,0,0.453565,0,0.289694,
+ 0,1,0,0.453565,0,0.289694,
+ 0,1,0,0.39956,0,0.285924,
+ 0,1,0,0.407973,0,0.28984,
+ 0,1,0,0.407973,0,0.28984,
+ 0,1,0,0.39956,0,0.285924,
+ 0,1,0,0.401022,0,0.293318,
+ 0,1,0,0.407973,0,0.28984,
+ 0,1,0,0.401022,0,0.293318,
+ 0,1,0,0.407039,0,0.296757,
+ 0,1,0,0.453565,0,0.289694,
+ 0,1,0,0.407973,0,0.28984,
+ 0,1,0,0.459932,0,0.294641,
+ 0,1,0,0.453565,0,0.289694,
+ 0,1,0,0.459932,0,0.294641,
+ 0,1,0,0.460649,0,0.292436,
+ 0,1,0,0.345113,0,0.39162,
+ 0,1,0,0.341927,0,0.280776,
+ 0,1,0,0.340791,0,0.338854,
+ 0,1,0,0.341927,0,0.280776,
+ 0,1,0,0.345113,0,0.39162,
+ 0,1,0,0.346201,0,0.35631,
+ 0,1,0,0.346201,0,0.35631,
+ 0,1,0,0.345113,0,0.39162,
+ 0,1,0,0.345635,0,0.395783,
+ 0,1,0,0.346201,0,0.35631,
+ 0,1,0,0.345635,0,0.395783,
+ 0,1,0,0.347948,0,0.411892,
+ 0,1,0,0.346201,0,0.35631,
+ 0,1,0,0.347948,0,0.411892,
+ 0,1,0,0.347402,0,0.391374,
+ 0,1,0,0.347402,0,0.391374,
+ 0,1,0,0.347948,0,0.411892,
+ 0,1,0,0.350552,0,0.396948,
+ 0,1,0,0.347402,0,0.391374,
+ 0,1,0,0.350552,0,0.396948,
+ 0,1,0,0.382114,0,0.401417,
+ 0,1,0,0.382114,0,0.401417,
+ 0,1,0,0.350552,0,0.396948,
+ 0,1,0,0.381306,0,0.404196,
+ 0,1,0,0.349356,0,0.370527,
+ 0,1,0,0.346201,0,0.35631,
+ 0,1,0,0.347402,0,0.391374,
+ 0,1,0,0.385815,0,0.249062,
+ 0,1,0,0.390794,0,0.225064,
+ 0,1,0,0.380095,0,0.243782,
+ 0,1,0,0.390794,0,0.225064,
+ 0,1,0,0.385815,0,0.249062,
+ 0,1,0,0.43745,0,0.149593,
+ 0,1,0,0.390794,0,0.225064,
+ 0,1,0,0.43745,0,0.149593,
+ 0,1,0,0.393313,0,0.220564,
+ 0,1,0,0.393313,0,0.220564,
+ 0,1,0,0.43745,0,0.149593,
+ 0,1,0,0.430713,0,0.148117,
+ 0,1,0,0.337814,0,0.218526,
+ 0,1,0,0.393313,0,0.220564,
+ 0,1,0,0.33706,0,0.213894,
+ 0,1,0,0.393313,0,0.220564,
+ 0,1,0,0.337814,0,0.218526,
+ 0,1,0,0.390794,0,0.225064,
+ 0,1,0,0.36139,0,0.170056,
+ 0,1,0,0.362675,0,0.139519,
+ 0,1,0,0.355564,0,0.134282,
+ 0,1,0,0.362675,0,0.139519,
+ 0,1,0,0.36139,0,0.170056,
+ 0,1,0,0.364485,0,0.169719,
+ 0,1,0,0.46663,0,0.27632,
+ 0,1,0,0.46013,0,0.257261,
+ 0,1,0,0.458352,0,0.27632,
+ 0,1,0,0.467463,0,0.329531,
+ 0,1,0,0.47107,0,0.29969,
+ 0,1,0,0.465354,0,0.329827,
+ 0,1,0,0.47107,0,0.29969,
+ 0,1,0,0.467463,0,0.329531,
+ 0,1,0,0.473423,0,0.35107,
+ 0,1,0,0.485465,0,0.322943,
+ 0,1,0,0.477384,0,0.305137,
+ 0,1,0,0.476383,0,0.327431,
+ 0,1,0,0.477384,0,0.305137,
+ 0,1,0,0.485465,0,0.322943,
+ 0,1,0,0.528435,0,0.306428,
+ 0,1,0,0.528435,0,0.306428,
+ 0,1,0,0.485465,0,0.322943,
+ 0,1,0,0.520583,0,0.315234,
+ 0,1,0,0.475946,0,0.372381,
+ 0,1,0,0.473423,0,0.35107,
+ 0,1,0,0.468659,0,0.37335,
+ 0,1,0,0.473423,0,0.35107,
+ 0,1,0,0.475946,0,0.372381,
+ 0,1,0,0.475869,0,0.279193,
+ 0,1,0,0.475869,0,0.279193,
+ 0,1,0,0.475946,0,0.372381,
+ 0,1,0,0.476383,0,0.327431,
+ 0,1,0,0.475869,0,0.279193,
+ 0,1,0,0.476383,0,0.327431,
+ 0,1,0,0.477384,0,0.305137,
+ 0,1,0,0.475869,0,0.279193,
+ 0,1,0,0.477384,0,0.305137,
+ 0,1,0,0.486025,0,0.280547,
+ 0,1,0,0.486025,0,0.280547,
+ 0,1,0,0.477384,0,0.305137,
+ 0,1,0,0.483949,0,0.293936,
+ 0,1,0,0.47107,0,0.29969,
+ 0,1,0,0.46663,0,0.27632,
+ 0,1,0,0.463702,0,0.296102,
+ 0,1,0,0.46663,0,0.27632,
+ 0,1,0,0.47107,0,0.29969,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.47107,0,0.29969,
+ 0,1,0,0.475869,0,0.279193,
+ 0,1,0,0.475869,0,0.279193,
+ 0,1,0,0.47107,0,0.29969,
+ 0,1,0,0.473423,0,0.35107,
+ 0,1,0,0.46013,0,0.257261,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.456111,0,0.138352,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.46013,0,0.257261,
+ 0,1,0,0.46663,0,0.27632,
+ 0,1,0,0.477848,0,0.418978,
+ 0,1,0,0.442748,0,0.408702,
+ 0,1,0,0.44226,0,0.411925,
+ 0,1,0,0.442748,0,0.408702,
+ 0,1,0,0.477848,0,0.418978,
+ 0,1,0,0.475946,0,0.413137,
+ 0,1,0,0.475946,0,0.413137,
+ 0,1,0,0.477848,0,0.418978,
+ 0,1,0,0.475946,0,0.372381,
+ 0,1,0,0.475946,0,0.372381,
+ 0,1,0,0.477848,0,0.418978,
+ 0,1,0,0.476383,0,0.327431,
+ 0,1,0,0.476383,0,0.327431,
+ 0,1,0,0.477848,0,0.418978,
+ 0,1,0,0.478415,0,0.336819,
+ 0,1,0,0.478415,0,0.336819,
+ 0,1,0,0.477848,0,0.418978,
+ 0,1,0,0.480807,0,0.438935,
+ 0,1,0,0.478415,0,0.336819,
+ 0,1,0,0.480807,0,0.438935,
+ 0,1,0,0.480645,0,0.413861,
+ 0,1,0,0.480645,0,0.413861,
+ 0,1,0,0.480807,0,0.438935,
+ 0,1,0,0.482457,0,0.419142,
+ 0,1,0,0.480645,0,0.413861,
+ 0,1,0,0.482457,0,0.419142,
+ 0,1,0,0.518255,0,0.421079,
+ 0,1,0,0.482457,0,0.419142,
+ 0,1,0,0.480807,0,0.438935,
+ 0,1,0,0.482457,0,0.438748,
+ 0,1,0,0.518255,0,0.421079,
+ 0,1,0,0.482457,0,0.419142,
+ 0,1,0,0.517782,0,0.423624,
+ 0,1,0,0.478415,0,0.336819,
+ 0,1,0,0.480966,0,0.371794,
+ 0,1,0,0.488375,0,0.340838,
+ 0,1,0,0.480966,0,0.371794,
+ 0,1,0,0.478415,0,0.336819,
+ 0,1,0,0.480645,0,0.413861,
+ 0,1,0,0.488375,0,0.340838,
+ 0,1,0,0.480966,0,0.371794,
+ 0,1,0,0.487638,0,0.351236,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.478574,0,0.146831,
+ 0,1,0,0.500967,0,0.138201,
+ 0,1,0,0.478574,0,0.146831,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.474716,0,0.16388,
+ 0,1,0,0.478574,0,0.146831,
+ 0,1,0,0.474716,0,0.16388,
+ 0,1,0,0.477013,0,0.163688,
+ 0,1,0,0.500967,0,0.138201,
+ 0,1,0,0.478574,0,0.146831,
+ 0,1,0,0.486654,0,0.154293,
+ 0,1,0,0.500967,0,0.138201,
+ 0,1,0,0.486654,0,0.154293,
+ 0,1,0,0.496634,0,0.150891,
+ 0,1,0,0.524782,0,0.213734,
+ 0,1,0,0.523887,0,0.186165,
+ 0,1,0,0.519853,0,0.206749,
+ 0,1,0,0.523887,0,0.186165,
+ 0,1,0,0.520443,0,0.136372,
+ 0,1,0,0.520309,0,0.15512,
+ 0,1,0,0.520443,0,0.136372,
+ 0,1,0,0.523887,0,0.186165,
+ 0,1,0,0.572047,0,0.202588,
+ 0,1,0,0.572047,0,0.202588,
+ 0,1,0,0.523887,0,0.186165,
+ 0,1,0,0.524782,0,0.213734,
+ 0,1,0,0.572047,0,0.202588,
+ 0,1,0,0.524782,0,0.213734,
+ 0,1,0,0.574691,0,0.213144,
+ 0,1,0,0.572047,0,0.202588,
+ 0,1,0,0.574691,0,0.213144,
+ 0,1,0,0.57819,0,0.2068,
+ 0,1,0,0.520443,0,0.136372,
+ 0,1,0,0.569256,0,0.178476,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.569256,0,0.178476,
+ 0,1,0,0.520443,0,0.136372,
+ 0,1,0,0.572047,0,0.202588,
+ 0,1,0,0.5725,0,0.174129,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.569256,0,0.178476,
+ 0,1,0,0.428914,0,0.138503,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.428914,0,0.138503,
+ 0,1,0,0.456111,0,0.138352,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.456111,0,0.138352,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.468552,0,0.139316,
+ 0,1,0,0.500967,0,0.138201,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.500967,0,0.138201,
+ 0,1,0,0.520443,0,0.136372,
+ 0,1,0,0.597457,0,0.051725,
+ 0,1,0,0.694309,0,-0.093781,
+ 0,1,0,0.596177,0,0.051864,
+ 0,1,0,0.694309,0,-0.093781,
+ 0,1,0,0.597457,0,0.051725,
+ 0,1,0,0.656931,0,0.083623,
+ 0,1,0,0.694309,0,-0.093781,
+ 0,1,0,0.656931,0,0.083623,
+ 0,1,0,0.666578,0,0.083623,
+ 0,1,0,0.694309,0,-0.093781,
+ 0,1,0,0.666578,0,0.083623,
+ 0,1,0,0.683404,0,0.087819,
+ 0,1,0,0.694309,0,-0.093781,
+ 0,1,0,0.683404,0,0.087819,
+ 0,1,0,0.695292,0,0.090379,
+ 0,1,0,0.694309,0,-0.093781,
+ 0,1,0,0.695292,0,0.090379,
+ 0,1,0,0.798565,0,-0.08952,
+ 0,1,0,0.798565,0,-0.08952,
+ 0,1,0,0.695292,0,0.090379,
+ 0,1,0,0.770867,0,0.070277,
+ 0,1,0,0.798565,0,-0.08952,
+ 0,1,0,0.770867,0,0.070277,
+ 0,1,0,0.790788,0,0.064708,
+ 0,1,0,0.798565,0,-0.08952,
+ 0,1,0,0.790788,0,0.064708,
+ 0,1,0,0.811472,0,0.062538,
+ 0,1,0,0.674737,0,0.116819,
+ 0,1,0,0.669179,0,0.104053,
+ 0,1,0,0.66632,0,0.109728,
+ 0,1,0,0.669179,0,0.104053,
+ 0,1,0,0.666578,0,0.083623,
+ 0,1,0,0.663318,0,0.09943,
+ 0,1,0,0.666578,0,0.083623,
+ 0,1,0,0.669179,0,0.104053,
+ 0,1,0,0.683404,0,0.087819,
+ 0,1,0,0.683404,0,0.087819,
+ 0,1,0,0.669179,0,0.104053,
+ 0,1,0,0.674737,0,0.116819,
+ 0,1,0,0.683404,0,0.087819,
+ 0,1,0,0.674737,0,0.116819,
+ 0,1,0,0.682157,0,0.113373,
+ 0,1,0,0.740263,0,0.3376,
+ 0,1,0,0.717651,0,0.327031,
+ 0,1,0,0.698159,0,0.328757,
+ 0,1,0,0.717651,0,0.327031,
+ 0,1,0,0.740263,0,0.3376,
+ 0,1,0,0.739514,0,0.330799,
+ 0,1,0,0.746733,0,0.349037,
+ 0,1,0,0.742502,0,0.228901,
+ 0,1,0,0.740263,0,0.3376,
+ 0,1,0,0.742502,0,0.228901,
+ 0,1,0,0.746733,0,0.349037,
+ 0,1,0,0.747104,0,0.331665,
+ 0,1,0,0.747104,0,0.331665,
+ 0,1,0,0.746733,0,0.349037,
+ 0,1,0,0.747255,0,0.337924,
+ 0,1,0,0.747104,0,0.331665,
+ 0,1,0,0.747255,0,0.337924,
+ 0,1,0,0.788766,0,0.335619,
+ 0,1,0,0.788766,0,0.335619,
+ 0,1,0,0.747255,0,0.337924,
+ 0,1,0,0.786613,0,0.341369,
+ 0,1,0,0.734225,0,0.221566,
+ 0,1,0,0.717701,0,0.212449,
+ 0,1,0,0.716987,0,0.217392,
+ 0,1,0,0.717701,0,0.212449,
+ 0,1,0,0.734225,0,0.221566,
+ 0,1,0,0.727255,0,0.210387,
+ 0,1,0,0.727255,0,0.210387,
+ 0,1,0,0.734225,0,0.221566,
+ 0,1,0,0.729666,0,0.180357,
+ 0,1,0,0.729666,0,0.180357,
+ 0,1,0,0.734225,0,0.221566,
+ 0,1,0,0.733489,0,0.097134,
+ 0,1,0,0.733489,0,0.097134,
+ 0,1,0,0.734225,0,0.221566,
+ 0,1,0,0.738759,0,0.212174,
+ 0,1,0,0.738759,0,0.212174,
+ 0,1,0,0.734225,0,0.221566,
+ 0,1,0,0.739514,0,0.330799,
+ 0,1,0,0.738759,0,0.212174,
+ 0,1,0,0.739514,0,0.330799,
+ 0,1,0,0.742502,0,0.228901,
+ 0,1,0,0.738759,0,0.212174,
+ 0,1,0,0.742502,0,0.228901,
+ 0,1,0,0.750578,0,0.219996,
+ 0,1,0,0.742502,0,0.228901,
+ 0,1,0,0.739514,0,0.330799,
+ 0,1,0,0.740263,0,0.3376,
+ 0,1,0,0.750578,0,0.219996,
+ 0,1,0,0.742502,0,0.228901,
+ 0,1,0,0.748683,0,0.227909,
+ 0,1,0,0.703808,0,0.097401,
+ 0,1,0,0.695292,0,0.090379,
+ 0,1,0,0.694034,0,0.097401,
+ 0,1,0,0.695292,0,0.090379,
+ 0,1,0,0.703808,0,0.097401,
+ 0,1,0,0.719793,0,0.090445,
+ 0,1,0,0.695292,0,0.090379,
+ 0,1,0,0.719793,0,0.090445,
+ 0,1,0,0.770867,0,0.070277,
+ 0,1,0,0.719793,0,0.090445,
+ 0,1,0,0.703808,0,0.097401,
+ 0,1,0,0.707051,0,0.10343,
+ 0,1,0,0.719793,0,0.090445,
+ 0,1,0,0.707051,0,0.10343,
+ 0,1,0,0.71883,0,0.101826,
+ 0,1,0,0.770867,0,0.070277,
+ 0,1,0,0.719793,0,0.090445,
+ 0,1,0,0.725651,0,0.097121,
+ 0,1,0,0.770867,0,0.070277,
+ 0,1,0,0.725651,0,0.097121,
+ 0,1,0,0.733489,0,0.097134,
+ 0,1,0,0.733489,0,0.097134,
+ 0,1,0,0.725651,0,0.097121,
+ 0,1,0,0.729666,0,0.180357,
+ 0,1,0,0.770867,0,0.070277,
+ 0,1,0,0.733489,0,0.097134,
+ 0,1,0,0.745404,0,0.097732,
+ 0,1,0,0.770867,0,0.070277,
+ 0,1,0,0.745404,0,0.097732,
+ 0,1,0,0.770867,0,0.090136,
+ 0,1,0,0.795116,0,0.092,
+ 0,1,0,0.790788,0,0.064708,
+ 0,1,0,0.780926,0,0.089234,
+ 0,1,0,0.790788,0,0.064708,
+ 0,1,0,0.795116,0,0.092,
+ 0,1,0,0.811472,0,0.062538,
+ 0,1,0,0.811472,0,0.062538,
+ 0,1,0,0.839683,0,-0.0832,
+ 0,1,0,0.798565,0,-0.08952,
+ 0,1,0,0.839683,0,-0.0832,
+ 0,1,0,0.811472,0,0.062538,
+ 0,1,0,0.821874,0,0.066961,
+ 0,1,0,0.839683,0,-0.0832,
+ 0,1,0,0.821874,0,0.066961,
+ 0,1,0,0.824648,0,0.054798,
+ 0,1,0,0.839683,0,-0.0832,
+ 0,1,0,0.824648,0,0.054798,
+ 0,1,0,0.841015,0,0.05224,
+ 0,1,0,0.839683,0,-0.0832,
+ 0,1,0,0.841015,0,0.05224,
+ 0,1,0,0.873228,0,-0.082377,
+ 0,1,0,0.860183,0,0.056987,
+ 0,1,0,0.873228,0,-0.082377,
+ 0,1,0,0.841015,0,0.05224,
+ 0,1,0,0.873228,0,-0.082377,
+ 0,1,0,0.860183,0,0.056987,
+ 0,1,0,0.866568,0,0.058768,
+ 0,1,0,0.873228,0,-0.082377,
+ 0,1,0,0.866568,0,0.058768,
+ 0,1,0,0.914203,0,-0.088048,
+ 0,1,0,0.860315,0,0.058264,
+ 0,1,0,0.860183,0,0.056987,
+ 0,1,0,0.841015,0,0.05224,
+ 0,1,0,0.844083,0,0.132103,
+ 0,1,0,0.841015,0,0.05224,
+ 0,1,0,0.841015,0,0.131717,
+ 0,1,0,0.841015,0,0.05224,
+ 0,1,0,0.844083,0,0.132103,
+ 0,1,0,0.847015,0,0.061852,
+ 0,1,0,0.841015,0,0.05224,
+ 0,1,0,0.847015,0,0.061852,
+ 0,1,0,0.860315,0,0.058264,
+ 0,1,0,0.847015,0,0.061852,
+ 0,1,0,0.844083,0,0.132103,
+ 0,1,0,0.845568,0,0.125387,
+ 0,1,0,0.936557,0,0.052887,
+ 0,1,0,0.936486,0,0.00536,
+ 0,1,0,0.921574,0,0.072794,
+ 0,1,0,0.936486,0,0.00536,
+ 0,1,0,0.936557,0,0.052887,
+ 0,1,0,0.936557,0,0.027166,
+ 0,1,0,0.936486,0,0.00536,
+ 0,1,0,0.936557,0,0.027166,
+ 0,1,0,0.940124,0,0.021527,
+ 0,1,0,0.891583,0,0.060764,
+ 0,1,0,0.866568,0,0.058768,
+ 0,1,0,0.865717,0,0.063887,
+ 0,1,0,0.866568,0,0.058768,
+ 0,1,0,0.891583,0,0.060764,
+ 0,1,0,0.914203,0,-0.088048,
+ 0,1,0,0.914203,0,-0.088048,
+ 0,1,0,0.891583,0,0.060764,
+ 0,1,0,0.904169,0,0.074437,
+ 0,1,0,0.914203,0,-0.088048,
+ 0,1,0,0.904169,0,0.074437,
+ 0,1,0,0.911647,0,0.068036,
+ 0,1,0,0.914203,0,-0.088048,
+ 0,1,0,0.911647,0,0.068036,
+ 0,1,0,0.914909,0,0.074511,
+ 0,1,0,0.914203,0,-0.088048,
+ 0,1,0,0.914909,0,0.074511,
+ 0,1,0,0.941242,0,-0.028276,
+ 0,1,0,0.914203,0,-0.088048,
+ 0,1,0,0.941242,0,-0.028276,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.941242,0,-0.028276,
+ 0,1,0,0.914909,0,0.074511,
+ 0,1,0,0.921574,0,0.072794,
+ 0,1,0,0.941242,0,-0.028276,
+ 0,1,0,0.921574,0,0.072794,
+ 0,1,0,0.936486,0,0.00536,
+ 0,1,0,0.988265,0,0.034438,
+ 0,1,0,0.940124,0,0.021527,
+ 0,1,0,0.936557,0,0.027166,
+ 0,1,0,0.940124,0,0.021527,
+ 0,1,0,0.988265,0,0.034438,
+ 0,1,0,0.988726,0,0.030608,
+ 0,1,0,0.936486,0,0.00536,
+ 0,1,0,0.944142,0,-0.00253,
+ 0,1,0,0.941242,0,-0.028276,
+ 0,1,0,0.944142,0,-0.00253,
+ 0,1,0,0.936486,0,0.00536,
+ 0,1,0,0.960369,0,0.001815,
+ 0,1,0,0.944142,0,-0.00253,
+ 0,1,0,0.960369,0,0.001815,
+ 0,1,0,0.960221,0,-0.000654,
+ 0,1,0,0.980908,0,-0.045793,
+ 0,1,0,0.975212,0,-0.050942,
+ 0,1,0,0.974361,0,-0.040383,
+ 0,1,0,0.941242,0,-0.028276,
+ 0,1,0,0.950727,0,-0.029415,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.950727,0,-0.029415,
+ 0,1,0,0.941242,0,-0.028276,
+ 0,1,0,0.94791,0,-0.017538,
+ 0,1,0,0.950727,0,-0.029415,
+ 0,1,0,0.94791,0,-0.017538,
+ 0,1,0,0.949423,0,-0.017734,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.950727,0,-0.029415,
+ 0,1,0,0.958398,0,-0.035904,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.958398,0,-0.035904,
+ 0,1,0,0.963588,0,-0.026807,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.963588,0,-0.026807,
+ 0,1,0,0.9736,0,-0.02933,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.9736,0,-0.02933,
+ 0,1,0,0.974361,0,-0.040383,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.974361,0,-0.040383,
+ 0,1,0,0.975212,0,-0.050942,
+ 0,1,0,0.969736,0,-0.083885,
+ 0,1,0,0.975212,0,-0.050942,
+ 0,1,0,0.978121,0,-0.065859,
+ 0,1,0,0.58558,0,0.077834,
+ 0,1,0,0.583383,0,0.057688,
+ 0,1,0,0.578541,0,0.071411,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.643211,0,-0.08754,
+ 0,1,0,0.37477,0,-0.091097,
+ 0,1,0,0.643211,0,-0.08754,
+ 0,1,0,0.560158,0,0.070785,
+ 0,1,0,0.581853,0,0.056878,
+ 0,1,0,0.643211,0,-0.08754,
+ 0,1,0,0.581853,0,0.056878,
+ 0,1,0,0.583383,0,0.057688,
+ 0,1,0,0.643211,0,-0.08754,
+ 0,1,0,0.583383,0,0.057688,
+ 0,1,0,0.58558,0,0.077834,
+ 0,1,0,0.643211,0,-0.08754,
+ 0,1,0,0.58558,0,0.077834,
+ 0,1,0,0.596177,0,0.051864,
+ 0,1,0,0.596177,0,0.051864,
+ 0,1,0,0.58558,0,0.077834,
+ 0,1,0,0.593621,0,0.073449,
+ 0,1,0,0.643211,0,-0.08754,
+ 0,1,0,0.596177,0,0.051864,
+ 0,1,0,0.694309,0,-0.093781
+};
+static const struct gllist ships_ship7_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 672, ships_ship7_data, 0
+};
+const struct gllist *ships_ship7 = &ships_ship7_frame;
+
+static const float ships_ship8_data[] = {
+ 0,1,0,0.005832,0,0.055975,
+ 0,1,0,0.003363,0,0.050178,
+ 0,1,0,0.002964,0,0.052735,
+ 0,1,0,0.02253,0,0.059668,
+ 0,1,0,0.010321,0,0.057502,
+ 0,1,0,0.010321,0,0.059668,
+ 0,1,0,0.010321,0,0.057502,
+ 0,1,0,0.02253,0,0.059668,
+ 0,1,0,0.011938,0,0.035003,
+ 0,1,0,0.011938,0,0.035003,
+ 0,1,0,0.02253,0,0.059668,
+ 0,1,0,0.02045,0,0.031007,
+ 0,1,0,0.02045,0,0.031007,
+ 0,1,0,0.02253,0,0.059668,
+ 0,1,0,0.022233,0,0.029468,
+ 0,1,0,0.022233,0,0.029468,
+ 0,1,0,0.02253,0,0.059668,
+ 0,1,0,0.023945,0,0.02295,
+ 0,1,0,0.023945,0,0.02295,
+ 0,1,0,0.02253,0,0.059668,
+ 0,1,0,0.024481,0,0.057055,
+ 0,1,0,0.023945,0,0.02295,
+ 0,1,0,0.024481,0,0.057055,
+ 0,1,0,0.0251,0,0.012782,
+ 0,1,0,0.0251,0,0.012782,
+ 0,1,0,0.024481,0,0.057055,
+ 0,1,0,0.026015,0,0.053784,
+ 0,1,0,0.0251,0,0.012782,
+ 0,1,0,0.026015,0,0.053784,
+ 0,1,0,0.028168,0,0.004866,
+ 0,1,0,0.028168,0,0.004866,
+ 0,1,0,0.026015,0,0.053784,
+ 0,1,0,0.028936,0,0.051351,
+ 0,1,0,0.028168,0,0.004866,
+ 0,1,0,0.028936,0,0.051351,
+ 0,1,0,0.044663,0,-0.019137,
+ 0,1,0,0.044663,0,-0.019137,
+ 0,1,0,0.028936,0,0.051351,
+ 0,1,0,0.033428,0,0.050917,
+ 0,1,0,0.044663,0,-0.019137,
+ 0,1,0,0.033428,0,0.050917,
+ 0,1,0,0.03541,0,0.049777,
+ 0,1,0,0.044663,0,-0.019137,
+ 0,1,0,0.03541,0,0.049777,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.044663,0,-0.019137,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.045996,0,-0.025663,
+ 0,1,0,0.045996,0,-0.025663,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.047669,0,-0.023914,
+ 0,1,0,0.047669,0,-0.023914,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.062945,0,-0.046148,
+ 0,1,0,0.062945,0,-0.046148,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.057326,0,0.049434,
+ 0,1,0,0.062945,0,-0.046148,
+ 0,1,0,0.057326,0,0.049434,
+ 0,1,0,0.073875,0,0.047148,
+ 0,1,0,0.047669,0,-0.023914,
+ 0,1,0,0.045011,0,-0.027703,
+ 0,1,0,0.045996,0,-0.025663,
+ 0,1,0,0.002434,0,0.045554,
+ 0,1,0,0.011938,0,0.035003,
+ 0,1,0,0.002202,0,0.042612,
+ 0,1,0,0.011938,0,0.035003,
+ 0,1,0,0.002434,0,0.045554,
+ 0,1,0,0.003363,0,0.050178,
+ 0,1,0,0.011938,0,0.035003,
+ 0,1,0,0.003363,0,0.050178,
+ 0,1,0,0.005832,0,0.055975,
+ 0,1,0,0.011938,0,0.035003,
+ 0,1,0,0.005832,0,0.055975,
+ 0,1,0,0.010321,0,0.057502,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.438902,0,-0.078115,
+ 0,1,0,0.438902,0,-0.078115,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.42304,0,0.142145,
+ 0,1,0,0.438902,0,-0.078115,
+ 0,1,0,0.42304,0,0.142145,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.438902,0,-0.078115,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.452409,0,-0.078112,
+ 0,1,0,0.452409,0,-0.078112,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.45572,0,-0.076151,
+ 0,1,0,0.036206,0,0.061696,
+ 0,1,0,0.03541,0,0.049777,
+ 0,1,0,0.033904,0,0.057269,
+ 0,1,0,0.03541,0,0.049777,
+ 0,1,0,0.036206,0,0.061696,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.036206,0,0.061696,
+ 0,1,0,0.043939,0,0.060872,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.043939,0,0.060872,
+ 0,1,0,0.049068,0,0.059312,
+ 0,1,0,0.052082,0,0.050568,
+ 0,1,0,0.049068,0,0.059312,
+ 0,1,0,0.051072,0,0.054396,
+ 0,1,0,0.072814,0,0.059976,
+ 0,1,0,0.072474,0,0.049213,
+ 0,1,0,0.070112,0,0.057303,
+ 0,1,0,0.072474,0,0.049213,
+ 0,1,0,0.072814,0,0.059976,
+ 0,1,0,0.07525,0,0.052979,
+ 0,1,0,0.07525,0,0.052979,
+ 0,1,0,0.072814,0,0.059976,
+ 0,1,0,0.075906,0,0.056689,
+ 0,1,0,0.058722,0,0.052729,
+ 0,1,0,0.073875,0,0.047148,
+ 0,1,0,0.057326,0,0.049434,
+ 0,1,0,0.073875,0,0.047148,
+ 0,1,0,0.058722,0,0.052729,
+ 0,1,0,0.059767,0,0.057637,
+ 0,1,0,0.073875,0,0.047148,
+ 0,1,0,0.059767,0,0.057637,
+ 0,1,0,0.062576,0,0.059836,
+ 0,1,0,0.073875,0,0.047148,
+ 0,1,0,0.062576,0,0.059836,
+ 0,1,0,0.072474,0,0.049213,
+ 0,1,0,0.072474,0,0.049213,
+ 0,1,0,0.062576,0,0.059836,
+ 0,1,0,0.070112,0,0.057303,
+ 0,1,0,0.073875,0,0.047148,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.062945,0,-0.046148,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.073875,0,0.047148,
+ 0,1,0,0.077211,0,0.046012,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.077211,0,0.046012,
+ 0,1,0,0.08503,0,0.046156,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.08503,0,0.046156,
+ 0,1,0,0.092167,0,0.045258,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.092167,0,0.045258,
+ 0,1,0,0.096503,0,0.046612,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.096503,0,0.046612,
+ 0,1,0,0.098793,0,0.043324,
+ 0,1,0,0.119348,0,0.043466,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.098793,0,0.043324,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.119348,0,0.043466,
+ 0,1,0,0.12502,0,0.040413,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.12502,0,0.040413,
+ 0,1,0,0.131056,0,0.037851,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.131056,0,0.037851,
+ 0,1,0,0.137656,0,0.037851,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.137656,0,0.037851,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.137656,0,0.037851,
+ 0,1,0,0.139518,0,0.038519,
+ 0,1,0,0.139518,0,0.038519,
+ 0,1,0,0.137656,0,0.037851,
+ 0,1,0,0.138069,0,0.040466,
+ 0,1,0,0.139518,0,0.038519,
+ 0,1,0,0.138069,0,0.040466,
+ 0,1,0,0.138791,0,0.04013,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.139518,0,0.038519,
+ 0,1,0,0.142802,0,0.039252,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.142802,0,0.039252,
+ 0,1,0,0.14614,0,0.039719,
+ 0,1,0,0.14614,0,0.039719,
+ 0,1,0,0.142802,0,0.039252,
+ 0,1,0,0.14388,0,0.04044,
+ 0,1,0,0.125341,0,0.043539,
+ 0,1,0,0.131056,0,0.037851,
+ 0,1,0,0.12502,0,0.040413,
+ 0,1,0,0.131056,0,0.037851,
+ 0,1,0,0.125341,0,0.043539,
+ 0,1,0,0.128161,0,0.043825,
+ 0,1,0,0.145652,0,0.052722,
+ 0,1,0,0.146904,0,0.041826,
+ 0,1,0,0.144617,0,0.046237,
+ 0,1,0,0.146904,0,0.041826,
+ 0,1,0,0.145652,0,0.052722,
+ 0,1,0,0.1479,0,0.055176,
+ 0,1,0,0.146904,0,0.041826,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.14614,0,0.039719,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.146904,0,0.041826,
+ 0,1,0,0.158948,0,0.040799,
+ 0,1,0,0.158948,0,0.040799,
+ 0,1,0,0.146904,0,0.041826,
+ 0,1,0,0.1479,0,0.055176,
+ 0,1,0,0.158948,0,0.040799,
+ 0,1,0,0.1479,0,0.055176,
+ 0,1,0,0.150072,0,0.053004,
+ 0,1,0,0.158948,0,0.040799,
+ 0,1,0,0.150072,0,0.053004,
+ 0,1,0,0.151217,0,0.055047,
+ 0,1,0,0.158948,0,0.040799,
+ 0,1,0,0.151217,0,0.055047,
+ 0,1,0,0.15571,0,0.055047,
+ 0,1,0,0.158948,0,0.040799,
+ 0,1,0,0.15571,0,0.055047,
+ 0,1,0,0.158149,0,0.046535,
+ 0,1,0,0.158149,0,0.046535,
+ 0,1,0,0.15571,0,0.055047,
+ 0,1,0,0.158105,0,0.050391,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.158948,0,0.040799,
+ 0,1,0,0.164424,0,0.045919,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.21016,0,0.039644,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.21016,0,0.039644,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.203635,0,0.039688,
+ 0,1,0,0.203635,0,0.039688,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.201135,0,0.040599,
+ 0,1,0,0.201135,0,0.040599,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.170685,0,0.041151,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.16306,0,0.038153,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.170685,0,0.041151,
+ 0,1,0,0.174519,0,0.043527,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.174519,0,0.043527,
+ 0,1,0,0.181947,0,0.046578,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.181947,0,0.046578,
+ 0,1,0,0.19086,0,0.046478,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.19086,0,0.046478,
+ 0,1,0,0.192825,0,0.048165,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.192825,0,0.048165,
+ 0,1,0,0.203826,0,0.070368,
+ 0,1,0,0.198876,0,0.044189,
+ 0,1,0,0.203826,0,0.070368,
+ 0,1,0,0.208131,0,0.070368,
+ 0,1,0,0.21016,0,0.039644,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.108166,0,-0.049511,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.21016,0,0.039644,
+ 0,1,0,0.211879,0,0.043758,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.211879,0,0.043758,
+ 0,1,0,0.214133,0,0.046343,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.214133,0,0.046343,
+ 0,1,0,0.217067,0,0.047303,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.217067,0,0.047303,
+ 0,1,0,0.220717,0,0.051314,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.220717,0,0.051314,
+ 0,1,0,0.22281,0,0.064939,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.22281,0,0.064939,
+ 0,1,0,0.22375,0,0.067435,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.22375,0,0.067435,
+ 0,1,0,0.223758,0,0.071907,
+ 0,1,0,0.27304,0,0.092137,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.223758,0,0.071907,
+ 0,1,0,0.414461,0,-0.072292,
+ 0,1,0,0.27304,0,0.092137,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.280165,0,0.133184,
+ 0,1,0,0.296022,0,0.116631,
+ 0,1,0,0.277564,0,0.132002,
+ 0,1,0,0.296022,0,0.116631,
+ 0,1,0,0.280165,0,0.133184,
+ 0,1,0,0.333437,0,0.135428,
+ 0,1,0,0.296022,0,0.116631,
+ 0,1,0,0.333437,0,0.135428,
+ 0,1,0,0.296022,0,0.111411,
+ 0,1,0,0.296022,0,0.111411,
+ 0,1,0,0.272364,0,0.103443,
+ 0,1,0,0.271875,0,0.104698,
+ 0,1,0,0.272364,0,0.103443,
+ 0,1,0,0.296022,0,0.111411,
+ 0,1,0,0.27304,0,0.092137,
+ 0,1,0,0.27304,0,0.092137,
+ 0,1,0,0.296022,0,0.111411,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.296022,0,0.111411,
+ 0,1,0,0.333437,0,0.135428,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.333437,0,0.135428,
+ 0,1,0,0.339306,0,0.140563,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.339306,0,0.140563,
+ 0,1,0,0.346191,0,0.144191,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.346191,0,0.144191,
+ 0,1,0,0.361782,0,0.130795,
+ 0,1,0,0.361782,0,0.130795,
+ 0,1,0,0.346191,0,0.144191,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.27304,0,0.092137,
+ 0,1,0,0.272185,0,0.097253,
+ 0,1,0,0.272364,0,0.103443,
+ 0,1,0,0.396131,0,0.201591,
+ 0,1,0,0.394287,0,0.192194,
+ 0,1,0,0.393804,0,0.200441,
+ 0,1,0,0.36561,0,0.142342,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.364378,0,0.128268,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.36561,0,0.142342,
+ 0,1,0,0.367505,0,0.14929,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.367505,0,0.14929,
+ 0,1,0,0.367521,0,0.190175,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.367521,0,0.190175,
+ 0,1,0,0.394287,0,0.192194,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.394287,0,0.192194,
+ 0,1,0,0.39762,0,0.192106,
+ 0,1,0,0.39762,0,0.192106,
+ 0,1,0,0.394287,0,0.192194,
+ 0,1,0,0.396131,0,0.201591,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.39762,0,0.192106,
+ 0,1,0,0.411441,0,0.192103,
+ 0,1,0,0.417031,0,0.142145,
+ 0,1,0,0.411441,0,0.192103,
+ 0,1,0,0.41751,0,0.189939,
+ 0,1,0,0.46729,0,0.156326,
+ 0,1,0,0.46455,0,0.14786,
+ 0,1,0,0.46391,0,0.154195,
+ 0,1,0,0.46455,0,0.14786,
+ 0,1,0,0.46729,0,0.156326,
+ 0,1,0,0.467188,0,0.151932,
+ 0,1,0,0.467188,0,0.151932,
+ 0,1,0,0.46729,0,0.156326,
+ 0,1,0,0.468792,0,0.153724,
+ 0,1,0,0.494957,0,0.142883,
+ 0,1,0,0.492192,0,0.138739,
+ 0,1,0,0.473771,0,0.142883,
+ 0,1,0,0.430244,0,0.148851,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.42304,0,0.142145,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.430244,0,0.148851,
+ 0,1,0,0.436776,0,0.145631,
+ 0,1,0,0.436776,0,0.145631,
+ 0,1,0,0.430244,0,0.148851,
+ 0,1,0,0.4303,0,0.152047,
+ 0,1,0,0.436776,0,0.145631,
+ 0,1,0,0.4303,0,0.152047,
+ 0,1,0,0.431657,0,0.154623,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.436776,0,0.145631,
+ 0,1,0,0.46087,0,0.143294,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.46087,0,0.143294,
+ 0,1,0,0.462544,0,0.148898,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.462544,0,0.148898,
+ 0,1,0,0.46455,0,0.14786,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.46455,0,0.14786,
+ 0,1,0,0.468291,0,0.149647,
+ 0,1,0,0.468291,0,0.149647,
+ 0,1,0,0.46455,0,0.14786,
+ 0,1,0,0.467188,0,0.151932,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.468291,0,0.149647,
+ 0,1,0,0.470539,0,0.149639,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.470539,0,0.149639,
+ 0,1,0,0.473771,0,0.142883,
+ 0,1,0,0.473771,0,0.142883,
+ 0,1,0,0.470539,0,0.149639,
+ 0,1,0,0.472711,0,0.147588,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.473771,0,0.142883,
+ 0,1,0,0.492192,0,0.138739,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.554376,0,-0.083574,
+ 0,1,0,0.45572,0,-0.076151,
+ 0,1,0,0.554376,0,-0.083574,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.554376,0,-0.083574,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.654247,0,0.015187,
+ 0,1,0,0.502776,0,0.108696,
+ 0,1,0,0.501788,0,0.10362,
+ 0,1,0,0.495229,0,0.109265,
+ 0,1,0,0.520624,0,0.103177,
+ 0,1,0,0.512293,0,0.098887,
+ 0,1,0,0.511027,0,0.103177,
+ 0,1,0,0.525775,0,0.103226,
+ 0,1,0,0.525756,0,0.097929,
+ 0,1,0,0.523115,0,0.103226,
+ 0,1,0,0.573637,0,0.088855,
+ 0,1,0,0.558207,0,0.086926,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.558207,0,0.086926,
+ 0,1,0,0.573637,0,0.088855,
+ 0,1,0,0.571308,0,0.086919,
+ 0,1,0,0.604955,0,0.07973,
+ 0,1,0,0.603117,0,0.073276,
+ 0,1,0,0.601069,0,0.081537,
+ 0,1,0,0.603117,0,0.073276,
+ 0,1,0,0.604955,0,0.07973,
+ 0,1,0,0.60802,0,0.073309,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.509626,0,0.097197,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.509626,0,0.097197,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.501788,0,0.10362,
+ 0,1,0,0.501788,0,0.10362,
+ 0,1,0,0.492192,0,0.102364,
+ 0,1,0,0.495229,0,0.109265,
+ 0,1,0,0.509626,0,0.097197,
+ 0,1,0,0.501788,0,0.10362,
+ 0,1,0,0.506596,0,0.10335,
+ 0,1,0,0.509626,0,0.097197,
+ 0,1,0,0.506596,0,0.10335,
+ 0,1,0,0.509379,0,0.098989,
+ 0,1,0,0.509379,0,0.098989,
+ 0,1,0,0.506596,0,0.10335,
+ 0,1,0,0.509367,0,0.100434,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.509626,0,0.097197,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.509626,0,0.097197,
+ 0,1,0,0.512293,0,0.098887,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.512293,0,0.098887,
+ 0,1,0,0.522474,0,0.099087,
+ 0,1,0,0.522474,0,0.099087,
+ 0,1,0,0.512293,0,0.098887,
+ 0,1,0,0.520624,0,0.103177,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.522474,0,0.099087,
+ 0,1,0,0.523115,0,0.103226,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.523115,0,0.103226,
+ 0,1,0,0.525756,0,0.097929,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.559466,0,0.085046,
+ 0,1,0,0.559466,0,0.085046,
+ 0,1,0,0.528723,0,0.087979,
+ 0,1,0,0.558207,0,0.086926,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.559466,0,0.085046,
+ 0,1,0,0.569292,0,0.083154,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.569292,0,0.083154,
+ 0,1,0,0.577201,0,0.080132,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.577201,0,0.080132,
+ 0,1,0,0.579331,0,0.083338,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.579331,0,0.083338,
+ 0,1,0,0.580957,0,0.082369,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.580957,0,0.082369,
+ 0,1,0,0.587377,0,0.083066,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.587377,0,0.083066,
+ 0,1,0,0.603117,0,0.068976,
+ 0,1,0,0.603117,0,0.068976,
+ 0,1,0,0.587377,0,0.083066,
+ 0,1,0,0.59551,0,0.082918,
+ 0,1,0,0.603117,0,0.068976,
+ 0,1,0,0.59551,0,0.082918,
+ 0,1,0,0.601069,0,0.081537,
+ 0,1,0,0.603117,0,0.068976,
+ 0,1,0,0.601069,0,0.081537,
+ 0,1,0,0.603117,0,0.073276,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.603117,0,0.068976,
+ 0,1,0,0.618127,0,0.067729,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.618127,0,0.067729,
+ 0,1,0,0.63036,0,0.064661,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.63036,0,0.064661,
+ 0,1,0,0.644519,0,0.053387,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.644519,0,0.053387,
+ 0,1,0,0.647455,0,0.043469,
+ 0,1,0,0.647455,0,0.043469,
+ 0,1,0,0.644519,0,0.053387,
+ 0,1,0,0.646258,0,0.049809,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.647455,0,0.043469,
+ 0,1,0,0.650701,0,0.037636,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.650701,0,0.037636,
+ 0,1,0,0.653033,0,0.035305,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.653033,0,0.035305,
+ 0,1,0,0.654069,0,0.029472,
+ 0,1,0,0.655501,0,0.016428,
+ 0,1,0,0.654247,0,0.015187,
+ 0,1,0,0.654112,0,0.015207,
+ 0,1,0,0.945366,0,-0.037253,
+ 0,1,0,0.943627,0,-0.044241,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.860413,0,-0.101142,
+ 0,1,0,0.814871,0,-0.103174,
+ 0,1,0,0.860413,0,-0.101142,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.94546,0,-0.104852,
+ 0,1,0,0.94546,0,-0.104852,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.943627,0,-0.044241,
+ 0,1,0,0.675281,0,0.011748,
+ 0,1,0,0.814871,0,-0.103174,
+ 0,1,0,0.669576,0,0.012951,
+ 0,1,0,0.814871,0,-0.103174,
+ 0,1,0,0.675281,0,0.011748,
+ 0,1,0,0.827887,0,0.032351,
+ 0,1,0,0.814871,0,-0.103174,
+ 0,1,0,0.827887,0,0.032351,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.827887,0,0.032351,
+ 0,1,0,0.881549,0,0.0425,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.881549,0,0.0425,
+ 0,1,0,0.884461,0,0.043681,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.884461,0,0.043681,
+ 0,1,0,0.892484,0,0.045416,
+ 0,1,0,0.892484,0,0.045416,
+ 0,1,0,0.884461,0,0.043681,
+ 0,1,0,0.88951,0,0.046355,
+ 0,1,0,0.932523,0,0.067243,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.929184,0,0.060147,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.932523,0,0.067243,
+ 0,1,0,0.931834,0,0.058098,
+ 0,1,0,0.931834,0,0.058098,
+ 0,1,0,0.932523,0,0.067243,
+ 0,1,0,0.932515,0,0.061838,
+ 0,1,0,0.932515,0,0.061838,
+ 0,1,0,0.932523,0,0.067243,
+ 0,1,0,0.933892,0,0.064053,
+ 0,1,0,0.935665,0,0.058098,
+ 0,1,0,0.932778,0,0.053821,
+ 0,1,0,0.931834,0,0.058098,
+ 0,1,0,0.932778,0,0.053821,
+ 0,1,0,0.935665,0,0.058098,
+ 0,1,0,0.935665,0,0.054317,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.932778,0,0.053821,
+ 0,1,0,0.93821,0,0.052186,
+ 0,1,0,0.932778,0,0.053821,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.931834,0,0.058098,
+ 0,1,0,0.95718,0,0.097525,
+ 0,1,0,0.956297,0,0.088372,
+ 0,1,0,0.956137,0,0.091159,
+ 0,1,0,0.956297,0,0.088372,
+ 0,1,0,0.95718,0,0.097525,
+ 0,1,0,0.957079,0,0.084323,
+ 0,1,0,0.957079,0,0.084323,
+ 0,1,0,0.95718,0,0.097525,
+ 0,1,0,0.957195,0,0.055454,
+ 0,1,0,0.957195,0,0.055454,
+ 0,1,0,0.95718,0,0.097525,
+ 0,1,0,0.957651,0,0.104195,
+ 0,1,0,0.957195,0,0.055454,
+ 0,1,0,0.957651,0,0.104195,
+ 0,1,0,0.960891,0,0.055267,
+ 0,1,0,0.960891,0,0.055267,
+ 0,1,0,0.957651,0,0.104195,
+ 0,1,0,0.959009,0,0.097879,
+ 0,1,0,0.93821,0,0.052186,
+ 0,1,0,0.945366,0,-0.037253,
+ 0,1,0,0.931238,0,0.050966,
+ 0,1,0,0.945366,0,-0.037253,
+ 0,1,0,0.93821,0,0.052186,
+ 0,1,0,0.957195,0,0.055454,
+ 0,1,0,0.945366,0,-0.037253,
+ 0,1,0,0.957195,0,0.055454,
+ 0,1,0,0.972642,0,0.02864,
+ 0,1,0,0.972642,0,0.02864,
+ 0,1,0,0.957195,0,0.055454,
+ 0,1,0,0.960891,0,0.055267,
+ 0,1,0,0.972642,0,0.02864,
+ 0,1,0,0.960891,0,0.055267,
+ 0,1,0,0.985604,0,0.059894,
+ 0,1,0,0.972642,0,0.02864,
+ 0,1,0,0.985604,0,0.059894,
+ 0,1,0,0.988456,0,0.057791,
+ 0,1,0,0.988456,0,0.057791,
+ 0,1,0,0.985604,0,0.059894,
+ 0,1,0,0.987834,0,0.059485,
+ 0,1,0,0.654247,0,0.015187,
+ 0,1,0,0.814871,0,-0.103174,
+ 0,1,0,0.554376,0,-0.083574,
+ 0,1,0,0.814871,0,-0.103174,
+ 0,1,0,0.654247,0,0.015187,
+ 0,1,0,0.669576,0,0.012951,
+ 0,1,0,0.655501,0,0.016428,
+ 0,1,0,0.669576,0,0.012951,
+ 0,1,0,0.654247,0,0.015187,
+ 0,1,0,0.669576,0,0.012951,
+ 0,1,0,0.655501,0,0.016428,
+ 0,1,0,0.657185,0,0.02107,
+ 0,1,0,0.669576,0,0.012951,
+ 0,1,0,0.657185,0,0.02107,
+ 0,1,0,0.659916,0,0.02521,
+ 0,1,0,0.669576,0,0.012951,
+ 0,1,0,0.659916,0,0.02521,
+ 0,1,0,0.664177,0,0.020241,
+ 0,1,0,0.664177,0,0.020241,
+ 0,1,0,0.659916,0,0.02521,
+ 0,1,0,0.66073,0,0.026097,
+ 0,1,0,0.664177,0,0.020241,
+ 0,1,0,0.66073,0,0.026097,
+ 0,1,0,0.66237,0,0.026134,
+ 0,1,0,0.669576,0,0.012951,
+ 0,1,0,0.664177,0,0.020241,
+ 0,1,0,0.668157,0,0.021264,
+ 0,1,0,0.347066,0,0.549424,
+ 0,1,0,0.3464,0,0.534556,
+ 0,1,0,0.345213,0,0.547729,
+ 0,1,0,0.348058,0,0.418216,
+ 0,1,0,0.346981,0,0.41173,
+ 0,1,0,0.344483,0,0.413246,
+ 0,1,0,0.346981,0,0.41173,
+ 0,1,0,0.348058,0,0.418216,
+ 0,1,0,0.347565,0,0.40265,
+ 0,1,0,0.327308,0,0.536788,
+ 0,1,0,0.32919,0,0.535075,
+ 0,1,0,0.321335,0,0.537318,
+ 0,1,0,0.32919,0,0.535075,
+ 0,1,0,0.327308,0,0.536788,
+ 0,1,0,0.328188,0,0.5366,
+ 0,1,0,0.32919,0,0.535075,
+ 0,1,0,0.328188,0,0.5366,
+ 0,1,0,0.3464,0,0.534556,
+ 0,1,0,0.32919,0,0.535075,
+ 0,1,0,0.3464,0,0.534556,
+ 0,1,0,0.346293,0,0.532502,
+ 0,1,0,0.346293,0,0.532502,
+ 0,1,0,0.3464,0,0.534556,
+ 0,1,0,0.346334,0,0.471726,
+ 0,1,0,0.346334,0,0.471726,
+ 0,1,0,0.3464,0,0.534556,
+ 0,1,0,0.347276,0,0.465686,
+ 0,1,0,0.347276,0,0.465686,
+ 0,1,0,0.3464,0,0.534556,
+ 0,1,0,0.347066,0,0.549424,
+ 0,1,0,0.347276,0,0.465686,
+ 0,1,0,0.347066,0,0.549424,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.347066,0,0.549424,
+ 0,1,0,0.349227,0,0.547746,
+ 0,1,0,0.347276,0,0.465686,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.347278,0,0.458759,
+ 0,1,0,0.347278,0,0.458759,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.347293,0,0.42338,
+ 0,1,0,0.347293,0,0.42338,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.348058,0,0.418216,
+ 0,1,0,0.345815,0,0.388,
+ 0,1,0,0.347024,0,0.386769,
+ 0,1,0,0.345487,0,0.387331,
+ 0,1,0,0.347024,0,0.386769,
+ 0,1,0,0.345815,0,0.388,
+ 0,1,0,0.347565,0,0.40265,
+ 0,1,0,0.347024,0,0.386769,
+ 0,1,0,0.347565,0,0.40265,
+ 0,1,0,0.348186,0,0.347995,
+ 0,1,0,0.348186,0,0.347995,
+ 0,1,0,0.347565,0,0.40265,
+ 0,1,0,0.348058,0,0.418216,
+ 0,1,0,0.348186,0,0.347995,
+ 0,1,0,0.348058,0,0.418216,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.348186,0,0.347995,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.348219,0,0.515458,
+ 0,1,0,0.348219,0,0.515458,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.349188,0,0.531671,
+ 0,1,0,0.349188,0,0.531671,
+ 0,1,0,0.34814,0,0.533961,
+ 0,1,0,0.38184,0,0.527549,
+ 0,1,0,0.349188,0,0.531671,
+ 0,1,0,0.38184,0,0.527549,
+ 0,1,0,0.380546,0,0.52602,
+ 0,1,0,0.347221,0,0.339233,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.346151,0,0.335537,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.347221,0,0.339233,
+ 0,1,0,0.347364,0,0.342998,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.347364,0,0.342998,
+ 0,1,0,0.348186,0,0.347995,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.348186,0,0.347995,
+ 0,1,0,0.348219,0,0.515458,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.348219,0,0.515458,
+ 0,1,0,0.349153,0,0.508619,
+ 0,1,0,0.349278,0,0.501883,
+ 0,1,0,0.349188,0,0.496373,
+ 0,1,0,0.349153,0,0.508619,
+ 0,1,0,0.349188,0,0.496373,
+ 0,1,0,0.349278,0,0.501883,
+ 0,1,0,0.351564,0,0.493203,
+ 0,1,0,0.351564,0,0.493203,
+ 0,1,0,0.349278,0,0.501883,
+ 0,1,0,0.351549,0,0.496092,
+ 0,1,0,0.349237,0,0.470978,
+ 0,1,0,0.349203,0,0.461645,
+ 0,1,0,0.349188,0,0.496373,
+ 0,1,0,0.349203,0,0.461645,
+ 0,1,0,0.349237,0,0.470978,
+ 0,1,0,0.349729,0,0.465878,
+ 0,1,0,0.352189,0,0.414687,
+ 0,1,0,0.351043,0,0.412516,
+ 0,1,0,0.350152,0,0.418304,
+ 0,1,0,0.351043,0,0.412516,
+ 0,1,0,0.352189,0,0.414687,
+ 0,1,0,0.354741,0,0.41097,
+ 0,1,0,0.352609,0,0.387986,
+ 0,1,0,0.352082,0,0.381934,
+ 0,1,0,0.351117,0,0.39323,
+ 0,1,0,0.355774,0,0.331472,
+ 0,1,0,0.355466,0,0.329124,
+ 0,1,0,0.352095,0,0.363754,
+ 0,1,0,0.341708,0,0.323397,
+ 0,1,0,0.311235,0,0.324384,
+ 0,1,0,0.3097,0,0.326063,
+ 0,1,0,0.311235,0,0.324384,
+ 0,1,0,0.341708,0,0.323397,
+ 0,1,0,0.346191,0,0.320472,
+ 0,1,0,0.346191,0,0.320472,
+ 0,1,0,0.341708,0,0.323397,
+ 0,1,0,0.345765,0,0.324132,
+ 0,1,0,0.346191,0,0.320472,
+ 0,1,0,0.345765,0,0.324132,
+ 0,1,0,0.347876,0,0.322954,
+ 0,1,0,0.346191,0,0.320472,
+ 0,1,0,0.347876,0,0.322954,
+ 0,1,0,0.346191,0,0.144191,
+ 0,1,0,0.346191,0,0.144191,
+ 0,1,0,0.347876,0,0.322954,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.347876,0,0.322954,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.350152,0,0.418304,
+ 0,1,0,0.350152,0,0.418304,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.349203,0,0.461645,
+ 0,1,0,0.349203,0,0.461645,
+ 0,1,0,0.348223,0,0.336993,
+ 0,1,0,0.349153,0,0.508619,
+ 0,1,0,0.349203,0,0.461645,
+ 0,1,0,0.349153,0,0.508619,
+ 0,1,0,0.349188,0,0.496373,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.350152,0,0.418304,
+ 0,1,0,0.351117,0,0.39323,
+ 0,1,0,0.351117,0,0.39323,
+ 0,1,0,0.350152,0,0.418304,
+ 0,1,0,0.351043,0,0.412516,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.351117,0,0.39323,
+ 0,1,0,0.352095,0,0.363754,
+ 0,1,0,0.352095,0,0.363754,
+ 0,1,0,0.351117,0,0.39323,
+ 0,1,0,0.352082,0,0.381934,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.352095,0,0.363754,
+ 0,1,0,0.355481,0,0.327095,
+ 0,1,0,0.355481,0,0.327095,
+ 0,1,0,0.352095,0,0.363754,
+ 0,1,0,0.355466,0,0.329124,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.355481,0,0.327095,
+ 0,1,0,0.35597,0,0.324825,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.35597,0,0.324825,
+ 0,1,0,0.357392,0,0.322493,
+ 0,1,0,0.358829,0,0.141179,
+ 0,1,0,0.357392,0,0.322493,
+ 0,1,0,0.358837,0,0.319339,
+ 0,1,0,0.358837,0,0.319339,
+ 0,1,0,0.357392,0,0.322493,
+ 0,1,0,0.393191,0,0.319422,
+ 0,1,0,0.358837,0,0.319339,
+ 0,1,0,0.393191,0,0.319422,
+ 0,1,0,0.396476,0,0.31792,
+ 0,1,0,0.347293,0,0.42338,
+ 0,1,0,0.346836,0,0.454548,
+ 0,1,0,0.347278,0,0.458759,
+ 0,1,0,0.346981,0,0.41173,
+ 0,1,0,0.34676,0,0.408074,
+ 0,1,0,0.343807,0,0.406572,
+ 0,1,0,0.34676,0,0.408074,
+ 0,1,0,0.346981,0,0.41173,
+ 0,1,0,0.347565,0,0.40265
+};
+static const struct gllist ships_ship8_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 837, ships_ship8_data, 0
+};
+const struct gllist *ships_ship8 = &ships_ship8_frame;
diff --git a/hacks/glx/ships.dxf b/hacks/glx/ships.dxf
new file mode 100644
index 0000000..e7da383
--- /dev/null
+++ b/hacks/glx/ships.dxf
@@ -0,0 +1,49148 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+3DFACE
+ 8
+ship8
+10
+49.775390625
+20
+3.2784742802494105e-12
+30
+477.7269729070317
+11
+28.705078125
+21
+3.275041154070235e-12
+31
+428.2504104070317
+12
+25.30078125
+22
+3.276555242404111e-12
+32
+450.0707229070317
+13
+25.30078125
+23
+3.276555242404111e-12
+33
+450.0707229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+192.28125
+20
+3.2806608449807706e-12
+30
+509.2386916570317
+11
+88.08984375
+21
+3.2793785048612634e-12
+31
+490.7582229070317
+12
+88.08984375
+22
+3.2806608449807706e-12
+32
+509.2386916570317
+13
+88.08984375
+23
+3.2806608449807706e-12
+33
+509.2386916570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+88.08984375
+20
+3.2793785048612634e-12
+30
+490.7582229070317
+11
+192.28125
+21
+3.2806608449807706e-12
+31
+509.2386916570317
+12
+101.888671875
+22
+3.2660542022625028e-12
+32
+298.7347854070317
+13
+101.888671875
+23
+3.2660542022625028e-12
+33
+298.7347854070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+101.888671875
+20
+3.2660542022625028e-12
+30
+298.7347854070317
+11
+192.28125
+21
+3.2806608449807706e-12
+31
+509.2386916570317
+12
+174.533203125
+22
+3.263687931021053e-12
+32
+264.6332229070317
+13
+174.533203125
+23
+3.263687931021053e-12
+33
+264.6332229070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+174.533203125
+20
+3.263687931021053e-12
+30
+264.6332229070317
+11
+192.28125
+21
+3.2806608449807706e-12
+31
+509.2386916570317
+12
+189.75
+22
+3.262776388044536e-12
+32
+251.49650415703172
+13
+189.75
+23
+3.262776388044536e-12
+33
+251.49650415703172
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+189.75
+20
+3.262776388044536e-12
+30
+251.49650415703172
+11
+192.28125
+21
+3.2806608449807706e-12
+31
+509.2386916570317
+12
+204.357421875
+22
+3.2589163572599444e-12
+32
+195.86759790703172
+13
+204.357421875
+23
+3.2589163572599444e-12
+33
+195.86759790703172
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+204.357421875
+20
+3.2589163572599444e-12
+30
+195.86759790703172
+11
+192.28125
+21
+3.2806608449807706e-12
+31
+509.2386916570317
+12
+208.93359375
+22
+3.2791134174300907e-12
+32
+486.9379104070317
+13
+208.93359375
+23
+3.2791134174300907e-12
+33
+486.9379104070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+204.357421875
+20
+3.2589163572599444e-12
+30
+195.86759790703172
+11
+208.93359375
+21
+3.2791134174300907e-12
+31
+486.9379104070317
+12
+214.21875
+22
+3.252894969444503e-12
+32
+109.09025415703172
+13
+214.21875
+23
+3.252894969444503e-12
+33
+109.09025415703172
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+214.21875
+20
+3.252894969444503e-12
+30
+109.09025415703172
+11
+208.93359375
+21
+3.2791134174300907e-12
+31
+486.9379104070317
+12
+222.0234375
+22
+3.2771764902489453e-12
+32
+459.0238479070317
+13
+222.0234375
+23
+3.2771764902489453e-12
+33
+459.0238479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+214.21875
+20
+3.252894969444503e-12
+30
+109.09025415703172
+11
+222.0234375
+21
+3.2771764902489453e-12
+31
+459.0238479070317
+12
+240.3984375
+22
+3.248207150301219e-12
+32
+41.53166040703172
+13
+240.3984375
+23
+3.248207150301219e-12
+33
+41.53166040703172
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+240.3984375
+20
+3.248207150301219e-12
+30
+41.53166040703172
+11
+222.0234375
+21
+3.2771764902489453e-12
+31
+459.0238479070317
+12
+246.9609375
+22
+3.275735585561712e-12
+32
+438.2582229070317
+13
+246.9609375
+23
+3.275735585561712e-12
+33
+438.2582229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+240.3984375
+20
+3.248207150301219e-12
+30
+41.53166040703172
+11
+246.9609375
+21
+3.275735585561712e-12
+31
+438.2582229070317
+12
+381.181640625
+22
+3.2339924466683045e-12
+32
+-163.32380834296828
+13
+381.181640625
+23
+3.2339924466683045e-12
+33
+-163.32380834296828
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+381.181640625
+20
+3.2339924466683045e-12
+30
+-163.32380834296828
+11
+246.9609375
+21
+3.275735585561712e-12
+31
+438.2582229070317
+12
+285.298828125
+22
+3.275478629646833e-12
+32
+434.5550979070317
+13
+285.298828125
+23
+3.275478629646833e-12
+33
+434.5550979070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+381.181640625
+20
+3.2339924466683045e-12
+30
+-163.32380834296828
+11
+285.298828125
+21
+3.275478629646833e-12
+31
+434.5550979070317
+12
+302.208984375
+22
+3.2748037137944608e-12
+32
+424.8285354070317
+13
+302.208984375
+23
+3.2748037137944608e-12
+33
+424.8285354070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+381.181640625
+20
+3.2339924466683045e-12
+30
+-163.32380834296828
+11
+302.208984375
+21
+3.2748037137944608e-12
+31
+424.8285354070317
+12
+444.498046875
+22
+3.2752720891329745e-12
+32
+431.5785354070317
+13
+444.498046875
+23
+3.2752720891329745e-12
+33
+431.5785354070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+381.181640625
+20
+3.2339924466683045e-12
+30
+-163.32380834296828
+11
+444.498046875
+21
+3.2752720891329745e-12
+31
+431.5785354070317
+12
+392.560546875
+22
+3.230127536973937e-12
+32
+-219.02302709296828
+13
+392.560546875
+23
+3.230127536973937e-12
+33
+-219.02302709296828
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+392.560546875
+20
+3.230127536973937e-12
+30
+-219.02302709296828
+11
+444.498046875
+21
+3.2752720891329745e-12
+31
+431.5785354070317
+12
+406.83984375
+22
+3.2311634921497467e-12
+32
+-204.09333959296828
+13
+406.83984375
+23
+3.2311634921497467e-12
+33
+-204.09333959296828
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+406.83984375
+20
+3.2311634921497467e-12
+30
+-204.09333959296828
+11
+444.498046875
+21
+3.2752720891329745e-12
+31
+431.5785354070317
+12
+537.2109375
+22
+3.2179961278154534e-12
+32
+-393.8550583429683
+13
+537.2109375
+23
+3.2179961278154534e-12
+33
+-393.8550583429683
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+537.2109375
+20
+3.2179961278154534e-12
+30
+-393.8550583429683
+11
+444.498046875
+21
+3.2752720891329745e-12
+31
+431.5785354070317
+12
+489.2578125
+22
+3.2746004258871197e-12
+32
+421.8988479070317
+13
+489.2578125
+23
+3.2746004258871197e-12
+33
+421.8988479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+537.2109375
+20
+3.2179961278154534e-12
+30
+-393.8550583429683
+11
+489.2578125
+21
+3.2746004258871197e-12
+31
+421.8988479070317
+12
+630.4921875
+22
+3.2732465284242285e-12
+32
+402.3871291570317
+13
+630.4921875
+23
+3.2732465284242285e-12
+33
+402.3871291570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+406.83984375
+20
+3.2311634921497467e-12
+30
+-204.09333959296828
+11
+384.15234375
+21
+3.2289191936527017e-12
+31
+-236.43708959296828
+12
+392.560546875
+22
+3.230127536973937e-12
+32
+-219.02302709296828
+13
+392.560546875
+23
+3.230127536973937e-12
+33
+-219.02302709296828
+70
+12
+ 0
+3DFACE
+ 8
+ship8
+10
+20.77734375
+20
+3.2723024593825367e-12
+30
+388.7816604070317
+11
+101.888671875
+21
+3.2660542022625028e-12
+31
+298.7347854070317
+12
+18.791015625
+22
+3.2705606885924388e-12
+32
+363.6800979070317
+13
+18.791015625
+23
+3.2705606885924388e-12
+33
+363.6800979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+101.888671875
+20
+3.2660542022625028e-12
+30
+298.7347854070317
+11
+20.77734375
+21
+3.2723024593825367e-12
+31
+388.7816604070317
+12
+28.705078125
+22
+3.275041154070235e-12
+32
+428.2504104070317
+13
+28.705078125
+23
+3.275041154070235e-12
+33
+428.2504104070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+101.888671875
+20
+3.2660542022625028e-12
+30
+298.7347854070317
+11
+28.705078125
+21
+3.275041154070235e-12
+31
+428.2504104070317
+12
+49.775390625
+22
+3.2784742802494105e-12
+32
+477.7269729070317
+13
+49.775390625
+23
+3.2784742802494105e-12
+33
+477.7269729070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+101.888671875
+20
+3.2660542022625028e-12
+30
+298.7347854070317
+11
+49.775390625
+21
+3.2784742802494105e-12
+31
+477.7269729070317
+12
+88.08984375
+22
+3.2793785048612634e-12
+32
+490.7582229070317
+13
+88.08984375
+23
+3.2793785048612634e-12
+33
+490.7582229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3559.189453125
+20
+3.3295044239017857e-12
+30
+1213.1488479070317
+11
+3537.2578125
+21
+3.2025137207923604e-12
+31
+-616.9800583429683
+12
+3109.822265625
+22
+3.321286713535432e-12
+32
+1094.7191604070317
+13
+3109.822265625
+23
+3.321286713535432e-12
+33
+1094.7191604070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+3559.189453125
+21
+3.3295044239017857e-12
+31
+1213.1488479070317
+12
+3745.8515625
+22
+3.199065144732227e-12
+32
+-666.6792770929683
+13
+3745.8515625
+23
+3.199065144732227e-12
+33
+-666.6792770929683
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3745.8515625
+20
+3.199065144732227e-12
+30
+-666.6792770929683
+11
+3559.189453125
+21
+3.3295044239017857e-12
+31
+1213.1488479070317
+12
+3610.4765625
+22
+3.3295044239017857e-12
+32
+1213.1488479070317
+13
+3610.4765625
+23
+3.3295044239017857e-12
+33
+1213.1488479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3745.8515625
+20
+3.199065144732227e-12
+30
+-666.6792770929683
+11
+3610.4765625
+21
+3.3295044239017857e-12
+31
+1213.1488479070317
+12
+4200.662109375
+22
+3.305945794895848e-12
+32
+873.6332229070317
+13
+4200.662109375
+23
+3.305945794895848e-12
+33
+873.6332229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3745.8515625
+20
+3.199065144732227e-12
+30
+-666.6792770929683
+11
+4200.662109375
+21
+3.305945794895848e-12
+31
+873.6332229070317
+12
+3861.134765625
+22
+3.199066771035486e-12
+32
+-666.6558395929683
+13
+3861.134765625
+23
+3.199066771035486e-12
+33
+-666.6558395929683
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3861.134765625
+20
+3.199066771035486e-12
+30
+-666.6558395929683
+11
+4200.662109375
+21
+3.305945794895848e-12
+31
+873.6332229070317
+12
+3889.388671875
+22
+3.200227951562218e-12
+32
+-649.9214645929683
+13
+3889.388671875
+23
+3.200227951562218e-12
+33
+-649.9214645929683
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+309.005859375
+20
+3.2818618699373414e-12
+30
+526.5472854070317
+11
+302.208984375
+21
+3.2748037137944608e-12
+31
+424.8285354070317
+12
+289.359375
+22
+3.2792402690842715e-12
+32
+488.7660354070317
+13
+289.359375
+23
+3.2792402690842715e-12
+33
+488.7660354070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+302.208984375
+20
+3.2748037137944608e-12
+30
+424.8285354070317
+11
+309.005859375
+21
+3.2818618699373414e-12
+31
+526.5472854070317
+12
+444.498046875
+22
+3.2752720891329745e-12
+32
+431.5785354070317
+13
+444.498046875
+23
+3.2752720891329745e-12
+33
+431.5785354070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+444.498046875
+20
+3.2752720891329745e-12
+30
+431.5785354070317
+11
+309.005859375
+21
+3.2818618699373414e-12
+31
+526.5472854070317
+12
+375.0
+22
+3.281373978959723e-12
+32
+519.5160354070317
+13
+375.0
+23
+3.281373978959723e-12
+33
+519.5160354070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+444.498046875
+20
+3.2752720891329745e-12
+30
+431.5785354070317
+11
+375.0
+21
+3.281373978959723e-12
+31
+519.5160354070317
+12
+418.775390625
+22
+3.2804502387087653e-12
+32
+506.2035354070317
+13
+418.775390625
+23
+3.2804502387087653e-12
+33
+506.2035354070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+444.498046875
+20
+3.2752720891329745e-12
+30
+431.5785354070317
+11
+418.775390625
+21
+3.2804502387087653e-12
+31
+506.2035354070317
+12
+435.87890625
+22
+3.2775391558756417e-12
+32
+464.2504104070317
+13
+435.87890625
+23
+3.2775391558756417e-12
+33
+464.2504104070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+621.439453125
+20
+3.2808438040973775e-12
+30
+511.8754104070317
+11
+618.533203125
+21
+3.274469508474792e-12
+31
+420.0121291570317
+12
+598.376953125
+22
+3.2792605978750056e-12
+32
+489.0590041570317
+13
+598.376953125
+23
+3.2792605978750056e-12
+33
+489.0590041570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+618.533203125
+20
+3.274469508474792e-12
+30
+420.0121291570317
+11
+621.439453125
+21
+3.2808438040973775e-12
+31
+511.8754104070317
+12
+642.228515625
+22
+3.276699983394138e-12
+32
+452.1566604070317
+13
+642.228515625
+23
+3.276699983394138e-12
+33
+452.1566604070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+642.228515625
+20
+3.276699983394138e-12
+30
+452.1566604070317
+11
+621.439453125
+21
+3.2808438040973775e-12
+31
+511.8754104070317
+12
+647.830078125
+22
+3.27889711909668e-12
+32
+483.8207229070317
+13
+647.830078125
+23
+3.27889711909668e-12
+33
+483.8207229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+501.169921875
+20
+3.2765519897975937e-12
+30
+450.0238479070317
+11
+630.4921875
+21
+3.2732465284242285e-12
+31
+402.3871291570317
+12
+489.2578125
+22
+3.2746004258871197e-12
+32
+421.8988479070317
+13
+489.2578125
+23
+3.2746004258871197e-12
+33
+421.8988479070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+630.4921875
+20
+3.2732465284242285e-12
+30
+402.3871291570317
+11
+501.169921875
+21
+3.2765519897975937e-12
+31
+450.0238479070317
+12
+510.087890625
+22
+3.279458193720941e-12
+32
+491.9066604070317
+13
+510.087890625
+23
+3.279458193720941e-12
+33
+491.9066604070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+630.4921875
+20
+3.2732465284242285e-12
+30
+402.3871291570317
+11
+510.087890625
+21
+3.279458193720941e-12
+31
+491.9066604070317
+12
+534.05859375
+22
+3.2807608626311824e-12
+32
+510.6800979070317
+13
+534.05859375
+23
+3.2807608626311824e-12
+33
+510.6800979070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+630.4921875
+20
+3.2732465284242285e-12
+30
+402.3871291570317
+11
+534.05859375
+21
+3.2807608626311824e-12
+31
+510.6800979070317
+12
+618.533203125
+22
+3.274469508474792e-12
+32
+420.0121291570317
+13
+618.533203125
+23
+3.274469508474792e-12
+33
+420.0121291570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+618.533203125
+20
+3.274469508474792e-12
+30
+420.0121291570317
+11
+534.05859375
+21
+3.2807608626311824e-12
+31
+510.6800979070317
+12
+598.376953125
+22
+3.2792605978750056e-12
+32
+489.0590041570317
+13
+598.376953125
+23
+3.2792605978750056e-12
+33
+489.0590041570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+630.4921875
+20
+3.2732465284242285e-12
+30
+402.3871291570317
+11
+923.1499643265097
+21
+3.2160044039029977e-12
+31
+-422.5588249668367
+12
+537.2109375
+22
+3.2179961278154534e-12
+32
+-393.8550583429683
+13
+537.2109375
+23
+3.2179961278154534e-12
+33
+-393.8550583429683
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+630.4921875
+21
+3.2732465284242285e-12
+31
+402.3871291570317
+12
+658.96875
+22
+3.2725740520267443e-12
+32
+392.6957229070317
+13
+658.96875
+23
+3.2725740520267443e-12
+33
+392.6957229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+658.96875
+21
+3.2725740520267443e-12
+31
+392.6957229070317
+12
+725.701171875
+22
+3.2726594329478276e-12
+32
+393.9261916570317
+13
+725.701171875
+23
+3.2726594329478276e-12
+33
+393.9261916570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+725.701171875
+21
+3.2726594329478276e-12
+31
+393.9261916570317
+12
+786.609375
+22
+3.2721276317822234e-12
+32
+386.2621291570317
+13
+786.609375
+23
+3.2721276317822234e-12
+33
+386.2621291570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+786.609375
+21
+3.2721276317822234e-12
+31
+386.2621291570317
+12
+823.611328125
+22
+3.2729293992887765e-12
+32
+397.8168166570317
+13
+823.611328125
+23
+3.2729293992887765e-12
+33
+397.8168166570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+823.611328125
+21
+3.2729293992887765e-12
+31
+397.8168166570317
+12
+843.158203125
+22
+3.2709819011364494e-12
+32
+369.7504104070317
+13
+843.158203125
+23
+3.2709819011364494e-12
+33
+369.7504104070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1018.587890625
+20
+3.2710664689059032e-12
+30
+370.9691604070317
+11
+923.1499643265097
+21
+3.2160044039029977e-12
+31
+-422.5588249668367
+12
+843.158203125
+22
+3.2709819011364494e-12
+32
+369.7504104070317
+13
+843.158203125
+23
+3.2709819011364494e-12
+33
+369.7504104070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+1018.587890625
+21
+3.2710664689059032e-12
+31
+370.9691604070317
+12
+1066.9921875
+22
+3.2692580196821974e-12
+32
+344.9066604070317
+13
+1066.9921875
+23
+3.2692580196821974e-12
+33
+344.9066604070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+1066.9921875
+21
+3.2692580196821974e-12
+31
+344.9066604070317
+12
+1118.5078125
+22
+3.267740678741804e-12
+32
+323.0394729070317
+13
+1118.5078125
+23
+3.267740678741804e-12
+33
+323.0394729070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+1118.5078125
+21
+3.267740678741804e-12
+31
+323.0394729070317
+12
+1174.83984375
+22
+3.267740678741804e-12
+32
+323.0394729070317
+13
+1174.83984375
+23
+3.267740678741804e-12
+33
+323.0394729070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+923.1499643265097
+20
+3.2160044039029977e-12
+30
+-422.5588249668367
+11
+1174.83984375
+21
+3.267740678741804e-12
+31
+323.0394729070317
+12
+1391.6484375
+22
+3.267919572100264e-12
+32
+325.6175979070317
+13
+1391.6484375
+23
+3.267919572100264e-12
+33
+325.6175979070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+1391.6484375
+20
+3.267919572100264e-12
+30
+325.6175979070317
+11
+1174.83984375
+21
+3.267740678741804e-12
+31
+323.0394729070317
+12
+1190.73046875
+22
+3.2681366835853043e-12
+32
+328.7465041570317
+13
+1190.73046875
+23
+3.2681366835853043e-12
+33
+328.7465041570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+1190.73046875
+20
+3.2681366835853043e-12
+30
+328.7465041570317
+11
+1174.83984375
+21
+3.267740678741804e-12
+31
+323.0394729070317
+12
+1178.361328125
+22
+3.2692897325957426e-12
+32
+345.3636916570317
+13
+1178.361328125
+23
+3.2692897325957426e-12
+33
+345.3636916570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1190.73046875
+20
+3.2681366835853043e-12
+30
+328.7465041570317
+11
+1178.361328125
+21
+3.2692897325957426e-12
+31
+345.3636916570317
+12
+1184.525390625
+22
+3.2690905104465484e-12
+32
+342.4925979070317
+13
+1184.525390625
+23
+3.2690905104465484e-12
+33
+342.4925979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1391.6484375
+20
+3.267919572100264e-12
+30
+325.6175979070317
+11
+1190.73046875
+21
+3.2681366835853043e-12
+31
+328.7465041570317
+12
+1218.755859375
+22
+3.2685709065553847e-12
+32
+335.0043166570317
+13
+1218.755859375
+23
+3.2685709065553847e-12
+33
+335.0043166570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1391.6484375
+20
+3.267919572100264e-12
+30
+325.6175979070317
+11
+1218.755859375
+21
+3.2685709065553847e-12
+31
+335.0043166570317
+12
+1247.25
+22
+3.2688473781093685e-12
+32
+338.9886916570317
+13
+1247.25
+23
+3.2688473781093685e-12
+33
+338.9886916570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+1247.25
+20
+3.2688473781093685e-12
+30
+338.9886916570317
+11
+1218.755859375
+21
+3.2685709065553847e-12
+31
+335.0043166570317
+12
+1227.9609375
+22
+3.2692742827147847e-12
+32
+345.1410354070317
+13
+1227.9609375
+23
+3.2692742827147847e-12
+33
+345.1410354070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1069.734375
+20
+3.2711095659422595e-12
+30
+371.5902541570317
+11
+1118.5078125
+21
+3.267740678741804e-12
+31
+323.0394729070317
+12
+1066.9921875
+22
+3.2692580196821974e-12
+32
+344.9066604070317
+13
+1066.9921875
+23
+3.2692580196821974e-12
+33
+344.9066604070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1118.5078125
+20
+3.267740678741804e-12
+30
+323.0394729070317
+11
+1069.734375
+21
+3.2711095659422595e-12
+31
+371.5902541570317
+12
+1093.798828125
+22
+3.2712787014811673e-12
+32
+374.0277541570317
+13
+1093.798828125
+23
+3.2712787014811673e-12
+33
+374.0277541570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1243.078125
+20
+3.276547924039447e-12
+30
+449.9652541570317
+11
+1253.765625
+21
+3.270094752708813e-12
+31
+356.9652541570317
+12
+1234.248046875
+22
+3.27270740889396e-12
+32
+394.6175979070317
+13
+1234.248046875
+23
+3.27270740889396e-12
+33
+394.6175979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1253.765625
+20
+3.270094752708813e-12
+30
+356.9652541570317
+11
+1243.078125
+21
+3.276547924039447e-12
+31
+449.9652541570317
+12
+1262.267578125
+22
+3.2780010260011205e-12
+32
+470.9066604070317
+13
+1262.267578125
+23
+3.2780010260011205e-12
+33
+470.9066604070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1253.765625
+20
+3.270094752708813e-12
+30
+356.9652541570317
+11
+1391.6484375
+21
+3.267919572100264e-12
+31
+325.6175979070317
+12
+1247.25
+22
+3.2688473781093685e-12
+32
+338.9886916570317
+13
+1247.25
+23
+3.2688473781093685e-12
+33
+338.9886916570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1391.6484375
+20
+3.267919572100264e-12
+30
+325.6175979070317
+11
+1253.765625
+21
+3.270094752708813e-12
+31
+356.9652541570317
+12
+1356.556640625
+22
+3.2694865152900487e-12
+32
+348.1996291570317
+13
+1356.556640625
+23
+3.2694865152900487e-12
+33
+348.1996291570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+1356.556640625
+20
+3.2694865152900487e-12
+30
+348.1996291570317
+11
+1253.765625
+21
+3.270094752708813e-12
+31
+356.9652541570317
+12
+1262.267578125
+22
+3.2780010260011205e-12
+32
+470.9066604070317
+13
+1262.267578125
+23
+3.2780010260011205e-12
+33
+470.9066604070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+1356.556640625
+20
+3.2694865152900487e-12
+30
+348.1996291570317
+11
+1262.267578125
+21
+3.2780010260011205e-12
+31
+470.9066604070317
+12
+1280.806640625
+22
+3.2767146201234665e-12
+32
+452.3675979070317
+13
+1280.806640625
+23
+3.2767146201234665e-12
+33
+452.3675979070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1356.556640625
+20
+3.2694865152900487e-12
+30
+348.1996291570317
+11
+1280.806640625
+21
+3.2767146201234665e-12
+31
+452.3675979070317
+12
+1290.57421875
+22
+3.2779245897479603e-12
+32
+469.8050979070317
+13
+1290.57421875
+23
+3.2779245897479603e-12
+33
+469.8050979070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1356.556640625
+20
+3.2694865152900487e-12
+30
+348.1996291570317
+11
+1290.57421875
+21
+3.2779245897479603e-12
+31
+469.8050979070317
+12
+1328.923828125
+22
+3.2779245897479603e-12
+32
+469.8050979070317
+13
+1328.923828125
+23
+3.2779245897479603e-12
+33
+469.8050979070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1356.556640625
+20
+3.2694865152900487e-12
+30
+348.1996291570317
+11
+1328.923828125
+21
+3.2779245897479603e-12
+31
+469.8050979070317
+12
+1349.7421875
+22
+3.272883862797532e-12
+32
+397.1605666570317
+13
+1349.7421875
+23
+3.272883862797532e-12
+33
+397.1605666570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+1349.7421875
+20
+3.272883862797532e-12
+30
+397.1605666570317
+11
+1328.923828125
+21
+3.2779245897479603e-12
+31
+469.8050979070317
+12
+1349.3671875
+22
+3.2751671925727865e-12
+32
+430.0668166570317
+13
+1349.3671875
+23
+3.2751671925727865e-12
+33
+430.0668166570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1391.6484375
+20
+3.267919572100264e-12
+30
+325.6175979070317
+11
+1356.556640625
+21
+3.2694865152900487e-12
+31
+348.1996291570317
+12
+1403.296875
+22
+3.2725187577159476e-12
+32
+391.8988479070317
+13
+1403.296875
+23
+3.2725187577159476e-12
+33
+391.8988479070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1391.6484375
+20
+3.267919572100264e-12
+30
+325.6175979070317
+11
+1793.630859375
+21
+3.2688026547697535e-12
+31
+338.3441604070317
+12
+923.1499643265097
+22
+3.2160044039029977e-12
+32
+-422.5588249668367
+13
+923.1499643265097
+23
+3.2160044039029977e-12
+33
+-422.5588249668367
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1793.630859375
+20
+3.2688026547697535e-12
+30
+338.3441604070317
+11
+1391.6484375
+21
+3.267919572100264e-12
+31
+325.6175979070317
+12
+1737.943359375
+22
+3.268828675621893e-12
+32
+338.7191604070317
+13
+1737.943359375
+23
+3.268828675621893e-12
+33
+338.7191604070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+1737.943359375
+20
+3.268828675621893e-12
+30
+338.7191604070317
+11
+1391.6484375
+21
+3.267919572100264e-12
+31
+325.6175979070317
+12
+1716.603515625
+22
+3.269368608303791e-12
+32
+346.5004104070317
+13
+1716.603515625
+23
+3.269368608303791e-12
+33
+346.5004104070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+1716.603515625
+20
+3.269368608303791e-12
+30
+346.5004104070317
+11
+1391.6484375
+21
+3.267919572100264e-12
+31
+325.6175979070317
+12
+1697.326171875
+22
+3.2714941866629488e-12
+32
+377.1332229070317
+13
+1697.326171875
+23
+3.2714941866629488e-12
+33
+377.1332229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1456.728515625
+20
+3.2696954952587953e-12
+30
+351.2113479070317
+11
+1697.326171875
+21
+3.2714941866629488e-12
+31
+377.1332229070317
+12
+1391.6484375
+22
+3.267919572100264e-12
+32
+325.6175979070317
+13
+1391.6484375
+23
+3.267919572100264e-12
+33
+325.6175979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1697.326171875
+20
+3.2714941866629488e-12
+30
+377.1332229070317
+11
+1456.728515625
+21
+3.2696954952587953e-12
+31
+351.2113479070317
+12
+1489.453125
+22
+3.2711022475775953e-12
+32
+371.4847854070317
+13
+1489.453125
+23
+3.2711022475775953e-12
+33
+371.4847854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1697.326171875
+20
+3.2714941866629488e-12
+30
+377.1332229070317
+11
+1489.453125
+21
+3.2711022475775953e-12
+31
+371.4847854070317
+12
+1552.845703125
+22
+3.2729090704980424e-12
+32
+397.5238479070317
+13
+1552.845703125
+23
+3.2729090704980424e-12
+33
+397.5238479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1697.326171875
+20
+3.2714941866629488e-12
+30
+377.1332229070317
+11
+1552.845703125
+21
+3.2729090704980424e-12
+31
+397.5238479070317
+12
+1628.91796875
+22
+3.2728497104290988e-12
+32
+396.6683791570317
+13
+1628.91796875
+23
+3.2728497104290988e-12
+33
+396.6683791570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1697.326171875
+20
+3.2714941866629488e-12
+30
+377.1332229070317
+11
+1628.91796875
+21
+3.2728497104290988e-12
+31
+396.6683791570317
+12
+1645.6875
+22
+3.2738490737815873e-12
+32
+411.0707229070317
+13
+1645.6875
+23
+3.2738490737815873e-12
+33
+411.0707229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1697.326171875
+20
+3.2714941866629488e-12
+30
+377.1332229070317
+11
+1645.6875
+21
+3.2738490737815873e-12
+31
+411.0707229070317
+12
+1739.572265625
+22
+3.2869977356284052e-12
+32
+600.5629104070317
+13
+1739.572265625
+23
+3.2869977356284052e-12
+33
+600.5629104070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+1697.326171875
+20
+3.2714941866629488e-12
+30
+377.1332229070317
+11
+1739.572265625
+21
+3.2869977356284052e-12
+31
+600.5629104070317
+12
+1776.31640625
+22
+3.2869977356284052e-12
+32
+600.5629104070317
+13
+1776.31640625
+23
+3.2869977356284052e-12
+33
+600.5629104070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+1793.630859375
+20
+3.2688026547697535e-12
+30
+338.3441604070317
+11
+3537.2578125
+21
+3.2025137207923604e-12
+31
+-616.9800583429683
+12
+923.1499643265097
+22
+3.2160044039029977e-12
+32
+-422.5588249668367
+13
+923.1499643265097
+23
+3.2160044039029977e-12
+33
+-422.5588249668367
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+1793.630859375
+21
+3.2688026547697535e-12
+31
+338.3441604070317
+12
+1808.302734375
+22
+3.2712388570513284e-12
+32
+373.4535354070317
+13
+1808.302734375
+23
+3.2712388570513284e-12
+33
+373.4535354070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+1808.302734375
+21
+3.2712388570513284e-12
+31
+373.4535354070317
+12
+1827.5390625
+22
+3.272770021569421e-12
+32
+395.5199416570317
+13
+1827.5390625
+23
+3.272770021569421e-12
+33
+395.5199416570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+1827.5390625
+21
+3.272770021569421e-12
+31
+395.5199416570317
+12
+1852.58203125
+22
+3.2733384145583466e-12
+32
+403.7113479070317
+13
+1852.58203125
+23
+3.2733384145583466e-12
+33
+403.7113479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+1852.58203125
+21
+3.2733384145583466e-12
+31
+403.7113479070317
+12
+1883.73046875
+22
+3.2757136304677192e-12
+32
+437.9418166570317
+13
+1883.73046875
+23
+3.2757136304677192e-12
+33
+437.9418166570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+1883.73046875
+21
+3.2757136304677192e-12
+31
+437.9418166570317
+12
+1901.595703125
+22
+3.2837825340858995e-12
+32
+554.2269729070317
+13
+1901.595703125
+23
+3.2837825340858995e-12
+33
+554.2269729070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+1901.595703125
+21
+3.2837825340858995e-12
+31
+554.2269729070317
+12
+1909.6171875
+22
+3.2852608437480835e-12
+32
+575.5316604070317
+13
+1909.6171875
+23
+3.2852608437480835e-12
+33
+575.5316604070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+1909.6171875
+21
+3.2852608437480835e-12
+31
+575.5316604070317
+12
+1909.681640625
+22
+3.2879092786049224e-12
+32
+613.6996291570317
+13
+1909.681640625
+23
+3.2879092786049224e-12
+33
+613.6996291570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2330.291015625
+20
+3.299889441560344e-12
+30
+786.3519729070317
+11
+3537.2578125
+21
+3.2025137207923604e-12
+31
+-616.9800583429683
+12
+1909.681640625
+22
+3.2879092786049224e-12
+32
+613.6996291570317
+13
+1909.681640625
+23
+3.2879092786049224e-12
+33
+613.6996291570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3537.2578125
+20
+3.2025137207923604e-12
+30
+-616.9800583429683
+11
+2330.291015625
+21
+3.299889441560344e-12
+31
+786.3519729070317
+12
+3109.822265625
+22
+3.321286713535432e-12
+32
+1094.7191604070317
+13
+3109.822265625
+23
+3.321286713535432e-12
+33
+1094.7191604070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2391.09375
+20
+3.3241977963685554e-12
+30
+1136.6722854070317
+11
+2526.427734375
+21
+3.314395253476571e-12
+31
+995.4027541570317
+12
+2368.8984375
+22
+3.323497672815673e-12
+32
+1126.5824416570317
+13
+2368.8984375
+23
+3.323497672815673e-12
+33
+1126.5824416570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2526.427734375
+20
+3.314395253476571e-12
+30
+995.4027541570317
+11
+2391.09375
+21
+3.3241977963685554e-12
+31
+1136.6722854070317
+12
+2845.751953125
+22
+3.3255264861309364e-12
+32
+1155.8207229070317
+13
+2845.751953125
+23
+3.3255264861309364e-12
+33
+1155.8207229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2526.427734375
+20
+3.314395253476571e-12
+30
+995.4027541570317
+11
+2845.751953125
+21
+3.3255264861309364e-12
+31
+1155.8207229070317
+12
+2526.427734375
+22
+3.3113036509817284e-12
+32
+950.8480666570317
+13
+2526.427734375
+23
+3.3113036509817284e-12
+33
+950.8480666570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2526.427734375
+20
+3.3113036509817284e-12
+30
+950.8480666570317
+11
+2324.51953125
+21
+3.3065849320765284e-12
+31
+882.8441604070317
+12
+2320.34765625
+22
+3.307328152665767e-12
+32
+893.5550979070317
+13
+2320.34765625
+23
+3.307328152665767e-12
+33
+893.5550979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2324.51953125
+20
+3.3065849320765284e-12
+30
+882.8441604070317
+11
+2526.427734375
+21
+3.3113036509817284e-12
+31
+950.8480666570317
+12
+2330.291015625
+22
+3.299889441560344e-12
+32
+786.3519729070317
+13
+2330.291015625
+23
+3.299889441560344e-12
+33
+786.3519729070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2330.291015625
+20
+3.299889441560344e-12
+30
+786.3519729070317
+11
+2526.427734375
+21
+3.3113036509817284e-12
+31
+950.8480666570317
+12
+3109.822265625
+22
+3.321286713535432e-12
+32
+1094.7191604070317
+13
+3109.822265625
+23
+3.321286713535432e-12
+33
+1094.7191604070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3109.822265625
+20
+3.321286713535432e-12
+30
+1094.7191604070317
+11
+2526.427734375
+21
+3.3113036509817284e-12
+31
+950.8480666570317
+12
+2845.751953125
+22
+3.3255264861309364e-12
+32
+1155.8207229070317
+13
+2845.751953125
+23
+3.3255264861309364e-12
+33
+1155.8207229070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3109.822265625
+20
+3.321286713535432e-12
+30
+1094.7191604070317
+11
+2845.751953125
+21
+3.3255264861309364e-12
+31
+1155.8207229070317
+12
+2895.837890625
+22
+3.3285676732247582e-12
+32
+1199.6488479070317
+13
+2895.837890625
+23
+3.3285676732247582e-12
+33
+1199.6488479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3109.822265625
+20
+3.321286713535432e-12
+30
+1094.7191604070317
+11
+2895.837890625
+21
+3.3285676732247582e-12
+31
+1199.6488479070317
+12
+2954.6015625
+22
+3.3307160198295382e-12
+32
+1230.6097854070317
+13
+2954.6015625
+23
+3.3307160198295382e-12
+33
+1230.6097854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3109.822265625
+20
+3.321286713535432e-12
+30
+1094.7191604070317
+11
+2954.6015625
+21
+3.3307160198295382e-12
+31
+1230.6097854070317
+12
+3087.662109375
+22
+3.322782912533462e-12
+32
+1116.2816604070317
+13
+3087.662109375
+23
+3.322782912533462e-12
+33
+1116.2816604070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3087.662109375
+20
+3.322782912533462e-12
+30
+1116.2816604070317
+11
+2954.6015625
+21
+3.3307160198295382e-12
+31
+1230.6097854070317
+12
+3062.466796875
+22
+3.3289327783063427e-12
+32
+1204.9105666570317
+13
+3062.466796875
+23
+3.3289327783063427e-12
+33
+1204.9105666570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2330.291015625
+20
+3.299889441560344e-12
+30
+786.3519729070317
+11
+2322.990234375
+21
+3.302919244531355e-12
+31
+830.0160354070317
+12
+2324.51953125
+22
+3.3065849320765284e-12
+32
+882.8441604070317
+13
+2324.51953125
+23
+3.3065849320765284e-12
+33
+882.8441604070317
+70
+12
+ 0
+3DFACE
+ 8
+ship8
+10
+3380.818359375
+20
+3.3647090105434763e-12
+30
+1720.5004104070317
+11
+3365.0859375
+21
+3.359143800792108e-12
+31
+1640.2972854070317
+12
+3360.9609375
+22
+3.364027589478069e-12
+32
+1710.6800979070317
+13
+3360.9609375
+23
+3.364027589478069e-12
+33
+1710.6800979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3120.33984375
+20
+3.329621517736414e-12
+30
+1214.8363479070317
+11
+3559.189453125
+21
+3.3295044239017857e-12
+31
+1213.1488479070317
+12
+3109.822265625
+22
+3.321286713535432e-12
+32
+1094.7191604070317
+13
+3109.822265625
+23
+3.321286713535432e-12
+33
+1094.7191604070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3559.189453125
+20
+3.3295044239017857e-12
+30
+1213.1488479070317
+11
+3120.33984375
+21
+3.329621517736414e-12
+31
+1214.8363479070317
+12
+3136.505859375
+22
+3.3337360649809966e-12
+32
+1274.1332229070317
+13
+3136.505859375
+23
+3.3337360649809966e-12
+33
+1274.1332229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3559.189453125
+20
+3.3295044239017857e-12
+30
+1213.1488479070317
+11
+3136.505859375
+21
+3.3337360649809966e-12
+31
+1274.1332229070317
+12
+3136.646484375
+22
+3.357948467896943e-12
+32
+1623.0707229070317
+13
+3136.646484375
+23
+3.357948467896943e-12
+33
+1623.0707229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3559.189453125
+20
+3.3295044239017857e-12
+30
+1213.1488479070317
+11
+3136.646484375
+21
+3.357948467896943e-12
+31
+1623.0707229070317
+12
+3365.0859375
+22
+3.359143800792108e-12
+32
+1640.2972854070317
+13
+3365.0859375
+23
+3.359143800792108e-12
+33
+1640.2972854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3559.189453125
+20
+3.3295044239017857e-12
+30
+1213.1488479070317
+11
+3365.0859375
+21
+3.359143800792108e-12
+31
+1640.2972854070317
+12
+3393.52734375
+22
+3.359091759087829e-12
+32
+1639.5472854070317
+13
+3393.52734375
+23
+3.359091759087829e-12
+33
+1639.5472854070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3393.52734375
+20
+3.359091759087829e-12
+30
+1639.5472854070317
+11
+3365.0859375
+21
+3.359143800792108e-12
+31
+1640.2972854070317
+12
+3380.818359375
+22
+3.3647090105434763e-12
+32
+1720.5004104070317
+13
+3380.818359375
+23
+3.3647090105434763e-12
+33
+1720.5004104070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3559.189453125
+20
+3.3295044239017857e-12
+30
+1213.1488479070317
+11
+3393.52734375
+21
+3.359091759087829e-12
+31
+1639.5472854070317
+12
+3511.482421875
+22
+3.35909013278457e-12
+32
+1639.5238479070317
+13
+3511.482421875
+23
+3.35909013278457e-12
+33
+1639.5238479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3559.189453125
+20
+3.3295044239017857e-12
+30
+1213.1488479070317
+11
+3511.482421875
+21
+3.35909013278457e-12
+31
+1639.5238479070317
+12
+3563.28515625
+22
+3.3578086058166923e-12
+32
+1621.0550979070317
+13
+3563.28515625
+23
+3.3578086058166923e-12
+33
+1621.0550979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3988.13671875
+20
+3.3379026539298584e-12
+30
+1334.1800979070317
+11
+3964.751953125
+21
+3.332888760983199e-12
+31
+1261.9222854070317
+12
+3959.28515625
+22
+3.3366406426010853e-12
+32
+1315.9925979070317
+13
+3959.28515625
+23
+3.3366406426010853e-12
+33
+1315.9925979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3964.751953125
+20
+3.332888760983199e-12
+30
+1261.9222854070317
+11
+3988.13671875
+21
+3.3379026539298584e-12
+31
+1334.1800979070317
+12
+3987.263671875
+22
+3.335300568715893e-12
+32
+1296.6800979070317
+13
+3987.263671875
+23
+3.335300568715893e-12
+33
+1296.6800979070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3987.263671875
+20
+3.335300568715893e-12
+30
+1296.6800979070317
+11
+3988.13671875
+21
+3.3379026539298584e-12
+31
+1334.1800979070317
+12
+4000.951171875
+22
+3.3363617315922134e-12
+32
+1311.9730666570317
+13
+4000.951171875
+23
+3.3363617315922134e-12
+33
+1311.9730666570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4224.263671875
+20
+3.3299418994783836e-12
+30
+1219.4535354070317
+11
+4200.662109375
+21
+3.3274878078609627e-12
+31
+1184.0863479070317
+12
+4043.443359375
+22
+3.3299418994783836e-12
+32
+1219.4535354070317
+13
+4043.443359375
+23
+3.3299418994783836e-12
+33
+1219.4535354070317
+70
+2
+ 0
+3DFACE
+ 8
+ship8
+10
+3671.96484375
+20
+3.3334758564596e-12
+30
+1270.3832229070317
+11
+4200.662109375
+21
+3.305945794895848e-12
+31
+873.6332229070317
+12
+3610.4765625
+22
+3.3295044239017857e-12
+32
+1213.1488479070317
+13
+3610.4765625
+23
+3.3295044239017857e-12
+33
+1213.1488479070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+3671.96484375
+21
+3.3334758564596e-12
+31
+1270.3832229070317
+12
+3727.7109375
+22
+3.3315690158887412e-12
+32
+1242.9027541570317
+13
+3727.7109375
+23
+3.3315690158887412e-12
+33
+1242.9027541570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3727.7109375
+20
+3.3315690158887412e-12
+30
+1242.9027541570317
+11
+3671.96484375
+21
+3.3334758564596e-12
+31
+1270.3832229070317
+12
+3672.439453125
+22
+3.3353688734527598e-12
+32
+1297.6644729070317
+13
+3672.439453125
+23
+3.3353688734527598e-12
+33
+1297.6644729070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3727.7109375
+20
+3.3315690158887412e-12
+30
+1242.9027541570317
+11
+3672.439453125
+21
+3.3353688734527598e-12
+31
+1297.6644729070317
+12
+3684.0234375
+22
+3.336894345909447e-12
+32
+1319.6488479070317
+13
+3684.0234375
+23
+3.336894345909447e-12
+33
+1319.6488479070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+3727.7109375
+21
+3.3315690158887412e-12
+31
+1242.9027541570317
+12
+3933.345703125
+22
+3.3301850318155635e-12
+32
+1222.9574416570317
+13
+3933.345703125
+23
+3.3301850318155635e-12
+33
+1222.9574416570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+3933.345703125
+21
+3.3301850318155635e-12
+31
+1222.9574416570317
+12
+3947.630859375
+22
+3.3335035036149985e-12
+32
+1270.7816604070317
+13
+3947.630859375
+23
+3.3335035036149985e-12
+33
+1270.7816604070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+3947.630859375
+21
+3.3335035036149985e-12
+31
+1270.7816604070317
+12
+3964.751953125
+22
+3.332888760983199e-12
+32
+1261.9222854070317
+13
+3964.751953125
+23
+3.332888760983199e-12
+33
+1261.9222854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+3964.751953125
+21
+3.332888760983199e-12
+31
+1261.9222854070317
+12
+3996.6796875
+22
+3.3339474844046313e-12
+32
+1277.1800979070317
+13
+3996.6796875
+23
+3.3339474844046313e-12
+33
+1277.1800979070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3996.6796875
+20
+3.3339474844046313e-12
+30
+1277.1800979070317
+11
+3964.751953125
+21
+3.332888760983199e-12
+31
+1261.9222854070317
+12
+3987.263671875
+22
+3.335300568715893e-12
+32
+1296.6800979070317
+13
+3987.263671875
+23
+3.335300568715893e-12
+33
+1296.6800979070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+3996.6796875
+21
+3.3339474844046313e-12
+31
+1277.1800979070317
+12
+4015.86328125
+22
+3.333942605494855e-12
+32
+1277.1097854070317
+13
+4015.86328125
+23
+3.333942605494855e-12
+33
+1277.1097854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+4015.86328125
+21
+3.333942605494855e-12
+31
+1277.1097854070317
+12
+4043.443359375
+22
+3.3299418994783836e-12
+32
+1219.4535354070317
+13
+4043.443359375
+23
+3.3299418994783836e-12
+33
+1219.4535354070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+4043.443359375
+20
+3.3299418994783836e-12
+30
+1219.4535354070317
+11
+4015.86328125
+21
+3.333942605494855e-12
+31
+1277.1097854070317
+12
+4034.396484375
+22
+3.332727756960585e-12
+32
+1259.6019729070317
+13
+4034.396484375
+23
+3.332727756960585e-12
+33
+1259.6019729070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+4043.443359375
+21
+3.3299418994783836e-12
+31
+1219.4535354070317
+12
+4200.662109375
+22
+3.3274878078609627e-12
+32
+1184.0863479070317
+13
+4200.662109375
+23
+3.3274878078609627e-12
+33
+1184.0863479070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+4731.378671360422
+21
+3.195832103794981e-12
+31
+-713.2723073657894
+12
+3889.388671875
+22
+3.200227951562218e-12
+32
+-649.9214645929683
+13
+3889.388671875
+23
+3.200227951562218e-12
+33
+-649.9214645929683
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4731.378671360422
+20
+3.195832103794981e-12
+30
+-713.2723073657894
+11
+4200.662109375
+21
+3.305945794895848e-12
+31
+873.6332229070317
+12
+5582.583984375
+22
+3.25433099522196e-12
+32
+129.78556665703172
+13
+5582.583984375
+23
+3.25433099522196e-12
+33
+129.78556665703172
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4731.378671360422
+20
+3.195832103794981e-12
+30
+-713.2723073657894
+11
+5582.583984375
+21
+3.25433099522196e-12
+31
+129.78556665703172
+12
+5583.738082531767
+22
+3.254319312204251e-12
+32
+129.61719662759015
+13
+5583.738082531767
+23
+3.254319312204251e-12
+33
+129.61719662759015
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4290.990234375
+20
+3.3096960502104755e-12
+30
+927.6800979070317
+11
+4282.564453125
+21
+3.3066898286367163e-12
+31
+884.3558791570317
+12
+4226.583984375
+22
+3.3100326949850323e-12
+32
+932.5316604070317
+13
+4226.583984375
+23
+3.3100326949850323e-12
+33
+932.5316604070317
+70
+2
+ 0
+3DFACE
+ 8
+ship8
+10
+4443.322265625
+20
+3.3064271806604317e-12
+30
+880.5707229070317
+11
+4372.212890625
+21
+3.303886894970298e-12
+31
+843.9613479070317
+12
+4361.408203125
+22
+3.3064271806604317e-12
+32
+880.5707229070317
+13
+4361.408203125
+23
+3.3064271806604317e-12
+33
+880.5707229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4487.279296875
+20
+3.306456454119089e-12
+30
+880.9925979070317
+11
+4487.115234375
+21
+3.303319315133002e-12
+31
+835.7816604070317
+12
+4464.580078125
+22
+3.306456454119089e-12
+32
+880.9925979070317
+13
+4464.580078125
+23
+3.306456454119089e-12
+33
+880.9925979070317
+70
+2
+ 0
+3DFACE
+ 8
+ship8
+10
+4895.759765625
+20
+3.297946009166164e-12
+30
+758.3441604070317
+11
+4764.076171875
+21
+3.2968035311269073e-12
+31
+741.8793166570317
+12
+4512.439453125
+22
+3.2974272184266296e-12
+32
+750.8675979070317
+13
+4512.439453125
+23
+3.2974272184266296e-12
+33
+750.8675979070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+4764.076171875
+20
+3.2968035311269073e-12
+30
+741.8793166570317
+11
+4895.759765625
+21
+3.297946009166164e-12
+31
+758.3441604070317
+12
+4875.884765625
+22
+3.2967994653687605e-12
+32
+741.8207229070317
+13
+4875.884765625
+23
+3.2967994653687605e-12
+33
+741.8207229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5163.052734375
+20
+3.29254180343741e-12
+30
+680.4613479070317
+11
+5147.361328125
+21
+3.2887199907793985e-12
+31
+625.3832229070317
+12
+5129.888671875
+22
+3.293611910981653e-12
+32
+695.8832229070317
+13
+5129.888671875
+23
+3.293611910981653e-12
+33
+695.8832229070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+5147.361328125
+20
+3.2887199907793985e-12
+30
+625.3832229070317
+11
+5163.052734375
+21
+3.29254180343741e-12
+31
+680.4613479070317
+12
+5189.208984375
+22
+3.2887395064185032e-12
+32
+625.6644729070317
+13
+5189.208984375
+23
+3.2887395064185032e-12
+33
+625.6644729070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+4200.662109375
+20
+3.305945794895848e-12
+30
+873.6332229070317
+11
+4349.455078125
+21
+3.302885905314551e-12
+31
+829.5355666570317
+12
+5582.583984375
+22
+3.25433099522196e-12
+32
+129.78556665703172
+13
+5582.583984375
+23
+3.25433099522196e-12
+33
+129.78556665703172
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+4349.455078125
+20
+3.302885905314551e-12
+30
+829.5355666570317
+11
+4200.662109375
+21
+3.305945794895848e-12
+31
+873.6332229070317
+12
+4282.564453125
+22
+3.3066898286367163e-12
+32
+884.3558791570317
+13
+4282.564453125
+23
+3.3066898286367163e-12
+33
+884.3558791570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+4282.564453125
+20
+3.3066898286367163e-12
+30
+884.3558791570317
+11
+4200.662109375
+21
+3.305945794895848e-12
+31
+873.6332229070317
+12
+4226.583984375
+22
+3.3100326949850323e-12
+32
+932.5316604070317
+13
+4226.583984375
+23
+3.3100326949850323e-12
+33
+932.5316604070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4349.455078125
+20
+3.302885905314551e-12
+30
+829.5355666570317
+11
+4282.564453125
+21
+3.3066898286367163e-12
+31
+884.3558791570317
+12
+4323.591796875
+22
+3.3065296377657316e-12
+32
+882.0472854070317
+13
+4323.591796875
+23
+3.3065296377657316e-12
+33
+882.0472854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4349.455078125
+20
+3.302885905314551e-12
+30
+829.5355666570317
+11
+4323.591796875
+21
+3.3065296377657316e-12
+31
+882.0472854070317
+12
+4347.345703125
+22
+3.303947068190871e-12
+32
+844.8285354070317
+13
+4347.345703125
+23
+3.303947068190871e-12
+33
+844.8285354070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+4347.345703125
+20
+3.303947068190871e-12
+30
+844.8285354070317
+11
+4323.591796875
+21
+3.3065296377657316e-12
+31
+882.0472854070317
+12
+4347.240234375
+22
+3.3048033168565916e-12
+32
+857.1683791570317
+13
+4347.240234375
+23
+3.3048033168565916e-12
+33
+857.1683791570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+4349.455078125
+21
+3.302885905314551e-12
+31
+829.5355666570317
+12
+4512.439453125
+22
+3.2974272184266296e-12
+32
+750.8675979070317
+13
+4512.439453125
+23
+3.2974272184266296e-12
+33
+750.8675979070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+4512.439453125
+20
+3.2974272184266296e-12
+30
+750.8675979070317
+11
+4349.455078125
+21
+3.302885905314551e-12
+31
+829.5355666570317
+12
+4372.212890625
+22
+3.303886894970298e-12
+32
+843.9613479070317
+13
+4372.212890625
+23
+3.303886894970298e-12
+33
+843.9613479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4512.439453125
+20
+3.2974272184266296e-12
+30
+750.8675979070317
+11
+4372.212890625
+21
+3.303886894970298e-12
+31
+843.9613479070317
+12
+4459.107421875
+22
+3.3040056151081854e-12
+32
+845.6722854070317
+13
+4459.107421875
+23
+3.3040056151081854e-12
+33
+845.6722854070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+4459.107421875
+20
+3.3040056151081854e-12
+30
+845.6722854070317
+11
+4372.212890625
+21
+3.303886894970298e-12
+31
+843.9613479070317
+12
+4443.322265625
+22
+3.3064271806604317e-12
+32
+880.5707229070317
+13
+4443.322265625
+23
+3.3064271806604317e-12
+33
+880.5707229070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+4512.439453125
+20
+3.2974272184266296e-12
+30
+750.8675979070317
+11
+4459.107421875
+21
+3.3040056151081854e-12
+31
+845.6722854070317
+12
+4464.580078125
+22
+3.306456454119089e-12
+32
+880.9925979070317
+13
+4464.580078125
+23
+3.306456454119089e-12
+33
+880.9925979070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+4512.439453125
+20
+3.2974272184266296e-12
+30
+750.8675979070317
+11
+4464.580078125
+21
+3.306456454119089e-12
+31
+880.9925979070317
+12
+4487.115234375
+22
+3.303319315133002e-12
+32
+835.7816604070317
+13
+4487.115234375
+23
+3.303319315133002e-12
+33
+835.7816604070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+4512.439453125
+21
+3.2974272184266296e-12
+31
+750.8675979070317
+12
+4774.822265625
+22
+3.2956903265463078e-12
+32
+725.8363479070317
+13
+4774.822265625
+23
+3.2956903265463078e-12
+33
+725.8363479070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+4774.822265625
+20
+3.2956903265463078e-12
+30
+725.8363479070317
+11
+4512.439453125
+21
+3.2974272184266296e-12
+31
+750.8675979070317
+12
+4764.076171875
+22
+3.2968035311269073e-12
+32
+741.8793166570317
+13
+4764.076171875
+23
+3.2968035311269073e-12
+33
+741.8793166570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+4774.822265625
+21
+3.2956903265463078e-12
+31
+725.8363479070317
+12
+4858.681640625
+22
+3.294569803601044e-12
+32
+709.6879104070317
+13
+4858.681640625
+23
+3.294569803601044e-12
+33
+709.6879104070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+4858.681640625
+21
+3.294569803601044e-12
+31
+709.6879104070317
+12
+4926.181640625
+22
+3.2927800568648136e-12
+32
+683.8949416570317
+13
+4926.181640625
+23
+3.2927800568648136e-12
+33
+683.8949416570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+4926.181640625
+21
+3.2927800568648136e-12
+31
+683.8949416570317
+12
+4944.357421875
+22
+3.294678765919379e-12
+32
+711.2582229070317
+13
+4944.357421875
+23
+3.294678765919379e-12
+33
+711.2582229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+4944.357421875
+21
+3.294678765919379e-12
+31
+711.2582229070317
+12
+4958.232421875
+22
+3.2941046808690477e-12
+32
+702.9847854070317
+13
+4958.232421875
+23
+3.2941046808690477e-12
+33
+702.9847854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+4958.232421875
+21
+3.2941046808690477e-12
+31
+702.9847854070317
+12
+5013.029296875
+22
+3.2945177618967647e-12
+32
+708.9379104070317
+13
+5013.029296875
+23
+3.2945177618967647e-12
+33
+708.9379104070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5013.029296875
+21
+3.2945177618967647e-12
+31
+708.9379104070317
+12
+5147.361328125
+22
+3.28617319987623e-12
+32
+588.6800979070317
+13
+5147.361328125
+23
+3.28617319987623e-12
+33
+588.6800979070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+5147.361328125
+20
+3.28617319987623e-12
+30
+588.6800979070317
+11
+5013.029296875
+21
+3.2945177618967647e-12
+31
+708.9379104070317
+12
+5082.439453125
+22
+3.2944299415207934e-12
+32
+707.6722854070317
+13
+5082.439453125
+23
+3.2944299415207934e-12
+33
+707.6722854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5147.361328125
+20
+3.28617319987623e-12
+30
+588.6800979070317
+11
+5082.439453125
+21
+3.2944299415207934e-12
+31
+707.6722854070317
+12
+5129.888671875
+22
+3.293611910981653e-12
+32
+695.8832229070317
+13
+5129.888671875
+23
+3.293611910981653e-12
+33
+695.8832229070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5147.361328125
+20
+3.28617319987623e-12
+30
+588.6800979070317
+11
+5129.888671875
+21
+3.293611910981653e-12
+31
+695.8832229070317
+12
+5147.361328125
+22
+3.2887199907793985e-12
+32
+625.3832229070317
+13
+5147.361328125
+23
+3.2887199907793985e-12
+33
+625.3832229070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5147.361328125
+21
+3.28617319987623e-12
+31
+588.6800979070317
+12
+5275.470703125
+22
+3.2854348581967674e-12
+32
+578.0394729070317
+13
+5275.470703125
+23
+3.2854348581967674e-12
+33
+578.0394729070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5275.470703125
+21
+3.2854348581967674e-12
+31
+578.0394729070317
+12
+5379.873046875
+22
+3.283618277456768e-12
+32
+551.8597854070317
+13
+5379.873046875
+23
+3.283618277456768e-12
+33
+551.8597854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5379.873046875
+21
+3.283618277456768e-12
+31
+551.8597854070317
+12
+5500.716796875
+22
+3.276941489428059e-12
+32
+455.6371291570317
+13
+5500.716796875
+23
+3.276941489428059e-12
+33
+455.6371291570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5500.716796875
+21
+3.276941489428059e-12
+31
+455.6371291570317
+12
+5525.771484375
+22
+3.271068095209162e-12
+32
+370.9925979070317
+13
+5525.771484375
+23
+3.271068095209162e-12
+33
+370.9925979070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+5525.771484375
+20
+3.271068095209162e-12
+30
+370.9925979070317
+11
+5500.716796875
+21
+3.276941489428059e-12
+31
+455.6371291570317
+12
+5515.552734375
+22
+3.274822416281936e-12
+32
+425.0980666570317
+13
+5515.552734375
+23
+3.274822416281936e-12
+33
+425.0980666570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5525.771484375
+21
+3.271068095209162e-12
+31
+370.9925979070317
+12
+5553.474609375
+22
+3.267613827087623e-12
+32
+321.2113479070317
+13
+5553.474609375
+23
+3.267613827087623e-12
+33
+321.2113479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5553.474609375
+21
+3.267613827087623e-12
+31
+321.2113479070317
+12
+5573.373046875
+22
+3.266233095620963e-12
+32
+301.3129104070317
+13
+5573.373046875
+23
+3.266233095620963e-12
+33
+301.3129104070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5582.583984375
+20
+3.25433099522196e-12
+30
+129.78556665703172
+11
+5573.373046875
+21
+3.266233095620963e-12
+31
+301.3129104070317
+12
+5582.220703125
+22
+3.262778827499424e-12
+32
+251.53166040703172
+13
+5582.220703125
+23
+3.262778827499424e-12
+33
+251.53166040703172
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5594.443359375
+20
+3.255053887020465e-12
+30
+140.20353540703172
+11
+5583.738082531767
+21
+3.254319312204251e-12
+31
+129.61719662759015
+12
+5582.583984375
+22
+3.25433099522196e-12
+32
+129.78556665703172
+13
+5582.583984375
+23
+3.25433099522196e-12
+33
+129.78556665703172
+70
+0
+ 0
+3DFACE
+ 8
+ship8
+10
+8068.318359375
+20
+3.2232637240704742e-12
+30
+-317.9409958429683
+11
+8053.482421875
+21
+3.21912559542864e-12
+31
+-377.5777145929683
+12
+7947.744140625
+22
+3.27550790310549e-12
+32
+434.9769729070317
+13
+7947.744140625
+23
+3.27550790310549e-12
+33
+434.9769729070317
+70
+2
+ 0
+3DFACE
+ 8
+ship8
+10
+7947.744140625
+20
+3.27550790310549e-12
+30
+434.9769729070317
+11
+7343.279296875
+21
+3.1854285919077907e-12
+31
+-863.2027145929683
+12
+6954.603515625
+22
+3.1842251274963318e-12
+32
+-880.5464645929683
+13
+6954.603515625
+23
+3.1842251274963318e-12
+33
+-880.5464645929683
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+7343.279296875
+20
+3.1854285919077907e-12
+30
+-863.2027145929683
+11
+7947.744140625
+21
+3.27550790310549e-12
+31
+434.9769729070317
+12
+8069.126953125
+22
+3.183231456205249e-12
+32
+-894.8667770929683
+13
+8069.126953125
+23
+3.183231456205249e-12
+33
+-894.8667770929683
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+8069.126953125
+20
+3.183231456205249e-12
+30
+-894.8667770929683
+11
+7947.744140625
+21
+3.27550790310549e-12
+31
+434.9769729070317
+12
+8053.482421875
+22
+3.21912559542864e-12
+32
+-377.5777145929683
+13
+8053.482421875
+23
+3.21912559542864e-12
+33
+-377.5777145929683
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+5763.251953125
+20
+3.252282666267592e-12
+30
+100.26603540703172
+11
+6954.603515625
+21
+3.1842251274963318e-12
+31
+-880.5464645929683
+12
+5714.560546875
+22
+3.252994987094915e-12
+32
+110.53166040703172
+13
+5714.560546875
+23
+3.252994987094915e-12
+33
+110.53166040703172
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+6954.603515625
+20
+3.1842251274963318e-12
+30
+-880.5464645929683
+11
+5763.251953125
+21
+3.252282666267592e-12
+31
+100.26603540703172
+12
+7065.685546875
+22
+3.2644840064662006e-12
+32
+276.1058791570317
+13
+7065.685546875
+23
+3.2644840064662006e-12
+33
+276.1058791570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+6954.603515625
+20
+3.1842251274963318e-12
+30
+-880.5464645929683
+11
+7065.685546875
+21
+3.2644840064662006e-12
+31
+276.1058791570317
+12
+7947.744140625
+22
+3.27550790310549e-12
+32
+434.9769729070317
+13
+7947.744140625
+23
+3.27550790310549e-12
+33
+434.9769729070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+7947.744140625
+20
+3.27550790310549e-12
+30
+434.9769729070317
+11
+7065.685546875
+21
+3.2644840064662006e-12
+31
+276.1058791570317
+12
+7523.666015625
+22
+3.270494010158831e-12
+32
+362.7191604070317
+13
+7523.666015625
+23
+3.270494010158831e-12
+33
+362.7191604070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+7947.744140625
+20
+3.27550790310549e-12
+30
+434.9769729070317
+11
+7523.666015625
+21
+3.270494010158831e-12
+31
+362.7191604070317
+12
+7548.521484375
+22
+3.271193320560084e-12
+32
+372.7972854070317
+13
+7548.521484375
+23
+3.271193320560084e-12
+33
+372.7972854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+7947.744140625
+20
+3.27550790310549e-12
+30
+434.9769729070317
+11
+7548.521484375
+21
+3.271193320560084e-12
+31
+372.7972854070317
+12
+7616.994140625
+22
+3.2722211442196003e-12
+32
+387.6097854070317
+13
+7616.994140625
+23
+3.2722211442196003e-12
+33
+387.6097854070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+7616.994140625
+20
+3.2722211442196003e-12
+30
+387.6097854070317
+11
+7548.521484375
+21
+3.271193320560084e-12
+31
+372.7972854070317
+12
+7591.611328125
+22
+3.2727773399340854e-12
+32
+395.6254104070317
+13
+7591.611328125
+23
+3.2727773399340854e-12
+33
+395.6254104070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+7958.712890625
+20
+3.2851470025199725e-12
+30
+573.8910354070317
+11
+7947.744140625
+21
+3.27550790310549e-12
+31
+434.9769729070317
+12
+7930.212890625
+22
+3.2809446348994187e-12
+32
+513.3285354070317
+13
+7930.212890625
+23
+3.2809446348994187e-12
+33
+513.3285354070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+7947.744140625
+20
+3.27550790310549e-12
+30
+434.9769729070317
+11
+7958.712890625
+21
+3.2851470025199725e-12
+31
+573.8910354070317
+12
+7952.830078125
+22
+3.2797314126684074e-12
+32
+495.8441604070317
+13
+7952.830078125
+23
+3.2797314126684074e-12
+33
+495.8441604070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+7952.830078125
+20
+3.2797314126684074e-12
+30
+495.8441604070317
+11
+7958.712890625
+21
+3.2851470025199725e-12
+31
+573.8910354070317
+12
+7958.642578125
+22
+3.2819464377067953e-12
+32
+527.7660354070317
+13
+7958.642578125
+23
+3.2819464377067953e-12
+33
+527.7660354070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+7958.642578125
+20
+3.2819464377067953e-12
+30
+527.7660354070317
+11
+7958.712890625
+21
+3.2851470025199725e-12
+31
+573.8910354070317
+12
+7970.396484375
+22
+3.2832580512849596e-12
+32
+546.6683791570317
+13
+7970.396484375
+23
+3.2832580512849596e-12
+33
+546.6683791570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+7985.525390625
+20
+3.2797314126684074e-12
+30
+495.8441604070317
+11
+7960.892578125
+21
+3.277198445342938e-12
+31
+459.3402541570317
+12
+7952.830078125
+22
+3.2797314126684074e-12
+32
+495.8441604070317
+13
+7952.830078125
+23
+3.2797314126684074e-12
+33
+495.8441604070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+7960.892578125
+20
+3.277198445342938e-12
+30
+459.3402541570317
+11
+7985.525390625
+21
+3.2797314126684074e-12
+31
+495.8441604070317
+12
+7985.525390625
+22
+3.2774919930811386e-12
+32
+463.5707229070317
+13
+7985.525390625
+23
+3.2774919930811386e-12
+33
+463.5707229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+7947.744140625
+20
+3.27550790310549e-12
+30
+434.9769729070317
+11
+7960.892578125
+21
+3.277198445342938e-12
+31
+459.3402541570317
+12
+8007.251953125
+22
+3.2762299817523655e-12
+32
+445.3832229070317
+13
+8007.251953125
+23
+3.2762299817523655e-12
+33
+445.3832229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+7960.892578125
+20
+3.277198445342938e-12
+30
+459.3402541570317
+11
+7947.744140625
+21
+3.27550790310549e-12
+31
+434.9769729070317
+12
+7952.830078125
+22
+3.2797314126684074e-12
+32
+495.8441604070317
+13
+7952.830078125
+23
+3.2797314126684074e-12
+33
+495.8441604070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+8169.146484375
+20
+3.303080248553969e-12
+30
+832.3363479070317
+11
+8161.611328125
+21
+3.2976597797926277e-12
+31
+754.2191604070317
+12
+8160.251953125
+22
+3.299310477600237e-12
+32
+778.0082229070317
+13
+8160.251953125
+23
+3.299310477600237e-12
+33
+778.0082229070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+8161.611328125
+20
+3.2976597797926277e-12
+30
+754.2191604070317
+11
+8169.146484375
+21
+3.303080248553969e-12
+31
+832.3363479070317
+12
+8168.291015625
+22
+3.295261795637633e-12
+32
+719.6605666570317
+13
+8168.291015625
+23
+3.295261795637633e-12
+33
+719.6605666570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+8168.291015625
+20
+3.295261795637633e-12
+30
+719.6605666570317
+11
+8169.146484375
+21
+3.303080248553969e-12
+31
+832.3363479070317
+12
+8169.275390625
+22
+3.278165282630252e-12
+32
+473.2738479070317
+13
+8169.275390625
+23
+3.278165282630252e-12
+33
+473.2738479070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+8169.275390625
+20
+3.278165282630252e-12
+30
+473.2738479070317
+11
+8169.146484375
+21
+3.303080248553969e-12
+31
+832.3363479070317
+12
+8173.166015625
+22
+3.30703053916942e-12
+32
+889.2660354070317
+13
+8173.166015625
+23
+3.30703053916942e-12
+33
+889.2660354070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+8169.275390625
+20
+3.278165282630252e-12
+30
+473.2738479070317
+11
+8173.166015625
+21
+3.30703053916942e-12
+31
+889.2660354070317
+12
+8200.822265625
+22
+3.2780546940086586e-12
+32
+471.6800979070317
+13
+8200.822265625
+23
+3.2780546940086586e-12
+33
+471.6800979070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+8200.822265625
+20
+3.2780546940086586e-12
+30
+471.6800979070317
+11
+8173.166015625
+21
+3.30703053916942e-12
+31
+889.2660354070317
+12
+8184.755859375
+22
+3.303290041674345e-12
+32
+835.3597854070317
+13
+8184.755859375
+23
+3.303290041674345e-12
+33
+835.3597854070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+8007.251953125
+20
+3.2762299817523655e-12
+30
+445.3832229070317
+11
+8068.318359375
+21
+3.2232637240704742e-12
+31
+-317.9409958429683
+12
+7947.744140625
+22
+3.27550790310549e-12
+32
+434.9769729070317
+13
+7947.744140625
+23
+3.27550790310549e-12
+33
+434.9769729070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+8068.318359375
+20
+3.2232637240704742e-12
+30
+-317.9409958429683
+11
+8007.251953125
+21
+3.2762299817523655e-12
+31
+445.3832229070317
+12
+8169.275390625
+22
+3.278165282630252e-12
+32
+473.2738479070317
+13
+8169.275390625
+23
+3.278165282630252e-12
+33
+473.2738479070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+8068.318359375
+20
+3.2232637240704742e-12
+30
+-317.9409958429683
+11
+8169.275390625
+21
+3.278165282630252e-12
+31
+473.2738479070317
+12
+8301.111328125
+22
+3.2622860576120294e-12
+32
+244.43009790703172
+13
+8301.111328125
+23
+3.2622860576120294e-12
+33
+244.43009790703172
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+8301.111328125
+20
+3.2622860576120294e-12
+30
+244.43009790703172
+11
+8169.275390625
+21
+3.278165282630252e-12
+31
+473.2738479070317
+12
+8200.822265625
+22
+3.2780546940086586e-12
+32
+471.6800979070317
+13
+8200.822265625
+23
+3.2780546940086586e-12
+33
+471.6800979070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+8301.111328125
+20
+3.2622860576120294e-12
+30
+244.43009790703172
+11
+8200.822265625
+21
+3.2780546940086586e-12
+31
+471.6800979070317
+12
+8411.736328125
+22
+3.2807950149996157e-12
+32
+511.1722854070317
+13
+8411.736328125
+23
+3.2807950149996157e-12
+33
+511.1722854070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+8301.111328125
+20
+3.2622860576120294e-12
+30
+244.43009790703172
+11
+8411.736328125
+21
+3.2807950149996157e-12
+31
+511.1722854070317
+12
+8436.076171875
+22
+3.27954926670343e-12
+32
+493.2191604070317
+13
+8436.076171875
+23
+3.27954926670343e-12
+33
+493.2191604070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+8436.076171875
+20
+3.27954926670343e-12
+30
+493.2191604070317
+11
+8411.736328125
+21
+3.2807950149996157e-12
+31
+511.1722854070317
+12
+8430.767578125
+22
+3.280552695814065e-12
+32
+507.6800979070317
+13
+8430.767578125
+23
+3.280552695814065e-12
+33
+507.6800979070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5583.738082531767
+20
+3.254319312204251e-12
+30
+129.61719662759015
+11
+6954.603515625
+21
+3.1842251274963318e-12
+31
+-880.5464645929683
+12
+4731.378671360422
+22
+3.195832103794981e-12
+32
+-713.2723073657894
+13
+4731.378671360422
+23
+3.195832103794981e-12
+33
+-713.2723073657894
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+6954.603515625
+20
+3.1842251274963318e-12
+30
+-880.5464645929683
+11
+5583.738082531767
+21
+3.254319312204251e-12
+31
+129.61719662759015
+12
+5714.560546875
+22
+3.252994987094915e-12
+32
+110.53166040703172
+13
+5714.560546875
+23
+3.252994987094915e-12
+33
+110.53166040703172
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5594.443359375
+20
+3.255053887020465e-12
+30
+140.20353540703172
+11
+5714.560546875
+21
+3.252994987094915e-12
+31
+110.53166040703172
+12
+5583.738082531767
+22
+3.254319312204251e-12
+32
+129.61719662759015
+13
+5583.738082531767
+23
+3.254319312204251e-12
+33
+129.61719662759015
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5714.560546875
+20
+3.252994987094915e-12
+30
+110.53166040703172
+11
+5594.443359375
+21
+3.255053887020465e-12
+31
+140.20353540703172
+12
+5608.810546875
+22
+3.257803152679345e-12
+32
+179.82462915703172
+13
+5608.810546875
+23
+3.257803152679345e-12
+33
+179.82462915703172
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5714.560546875
+20
+3.252994987094915e-12
+30
+110.53166040703172
+11
+5608.810546875
+21
+3.257803152679345e-12
+31
+179.82462915703172
+12
+5632.119140625
+22
+3.2602548048418778e-12
+32
+215.15666040703172
+13
+5632.119140625
+23
+3.2602548048418778e-12
+33
+215.15666040703172
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5714.560546875
+20
+3.252994987094915e-12
+30
+110.53166040703172
+11
+5632.119140625
+21
+3.2602548048418778e-12
+31
+215.15666040703172
+12
+5668.482421875
+22
+3.257312009095209e-12
+32
+172.74650415703172
+13
+5668.482421875
+23
+3.257312009095209e-12
+33
+172.74650415703172
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+5668.482421875
+20
+3.257312009095209e-12
+30
+172.74650415703172
+11
+5632.119140625
+21
+3.2602548048418778e-12
+31
+215.15666040703172
+12
+5639.068359375
+22
+3.260780100794447e-12
+32
+222.72697290703172
+13
+5639.068359375
+23
+3.260780100794447e-12
+33
+222.72697290703172
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+5668.482421875
+20
+3.257312009095209e-12
+30
+172.74650415703172
+11
+5639.068359375
+21
+3.260780100794447e-12
+31
+222.72697290703172
+12
+5653.060546875
+22
+3.26080205588844e-12
+32
+223.04337915703172
+13
+5653.060546875
+23
+3.26080205588844e-12
+33
+223.04337915703172
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+5714.560546875
+20
+3.252994987094915e-12
+30
+110.53166040703172
+11
+5668.482421875
+21
+3.257312009095209e-12
+31
+172.74650415703172
+12
+5702.455078125
+22
+3.2579178070590853e-12
+32
+181.47697290703172
+13
+5702.455078125
+23
+3.2579178070590853e-12
+33
+181.47697290703172
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2962.06640625
+20
+3.570698207597256e-12
+30
+4689.117597907032
+11
+2956.388671875
+21
+3.5618929951786865e-12
+31
+4562.221113532032
+12
+2946.251953125
+22
+3.569694371910806e-12
+32
+4674.650801032032
+13
+2946.251953125
+23
+3.569694371910806e-12
+33
+4674.650801032032
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2970.5390625
+20
+3.492995877350108e-12
+30
+3569.3090041570317
+11
+2961.345703125
+21
+3.4891549556288065e-12
+31
+3513.9554885320317
+12
+2940.029296875
+22
+3.4900526750276245e-12
+32
+3526.8929885320317
+13
+2940.029296875
+23
+3.4900526750276245e-12
+33
+3526.8929885320317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2961.345703125
+20
+3.4891549556288065e-12
+30
+3513.9554885320317
+11
+2970.5390625
+21
+3.492995877350108e-12
+31
+3569.3090041570317
+12
+2966.33203125
+22
+3.4837775839038215e-12
+32
+3436.4593947820317
+13
+2966.33203125
+23
+3.4837775839038215e-12
+33
+3436.4593947820317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2793.4453125
+20
+3.5632151797280326e-12
+30
+4581.275801032032
+11
+2809.505859375
+21
+3.562200366494586e-12
+31
+4566.650801032032
+12
+2742.462890625
+22
+3.563529056256967e-12
+32
+4585.799238532032
+13
+2742.462890625
+23
+3.563529056256967e-12
+33
+4585.799238532032
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2809.505859375
+20
+3.562200366494586e-12
+30
+4566.650801032032
+11
+2793.4453125
+21
+3.5632151797280326e-12
+31
+4581.275801032032
+12
+2800.95703125
+22
+3.5631037779548097e-12
+32
+4579.670332282032
+13
+2800.95703125
+23
+3.5631037779548097e-12
+33
+4579.670332282032
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2809.505859375
+20
+3.562200366494586e-12
+30
+4566.650801032032
+11
+2800.95703125
+21
+3.5631037779548097e-12
+31
+4579.670332282032
+12
+2956.388671875
+22
+3.5618929951786865e-12
+32
+4562.221113532032
+13
+2956.388671875
+23
+3.5618929951786865e-12
+33
+4562.221113532032
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2809.505859375
+20
+3.562200366494586e-12
+30
+4566.650801032032
+11
+2956.388671875
+21
+3.5618929951786865e-12
+31
+4562.221113532032
+12
+2955.46875
+22
+3.5606765203411578e-12
+32
+4544.689863532032
+13
+2955.46875
+23
+3.5606765203411578e-12
+33
+4544.689863532032
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2955.46875
+20
+3.5606765203411578e-12
+30
+4544.689863532032
+11
+2956.388671875
+21
+3.5618929951786865e-12
+31
+4562.221113532032
+12
+2955.826171875
+22
+3.5246848029222427e-12
+32
+4025.9945510320317
+13
+2955.826171875
+23
+3.5246848029222427e-12
+33
+4025.9945510320317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2955.826171875
+20
+3.5246848029222427e-12
+30
+4025.9945510320317
+11
+2956.388671875
+21
+3.5618929951786865e-12
+31
+4562.221113532032
+12
+2963.859375
+22
+3.52110774890467e-12
+32
+3974.4437697820317
+13
+2963.859375
+23
+3.52110774890467e-12
+33
+3974.4437697820317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2963.859375
+20
+3.52110774890467e-12
+30
+3974.4437697820317
+11
+2956.388671875
+21
+3.5618929951786865e-12
+31
+4562.221113532032
+12
+2962.06640625
+22
+3.570698207597256e-12
+32
+4689.117597907032
+13
+2962.06640625
+23
+3.570698207597256e-12
+33
+4689.117597907032
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2963.859375
+20
+3.52110774890467e-12
+30
+3974.4437697820317
+11
+2962.06640625
+21
+3.570698207597256e-12
+31
+4689.117597907032
+12
+2971.236328125
+22
+3.561540493947357e-12
+32
+4557.141035407032
+13
+2971.236328125
+23
+3.561540493947357e-12
+33
+4557.141035407032
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.236328125
+20
+3.561540493947357e-12
+30
+4557.141035407032
+11
+2962.06640625
+21
+3.570698207597256e-12
+31
+4689.117597907032
+12
+2980.51171875
+22
+3.569704536306173e-12
+32
+4674.797285407032
+13
+2980.51171875
+23
+3.569704536306173e-12
+33
+4674.797285407032
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2963.859375
+20
+3.52110774890467e-12
+30
+3974.4437697820317
+11
+2971.236328125
+21
+3.561540493947357e-12
+31
+4557.141035407032
+12
+2963.876953125
+22
+3.517005398934528e-12
+32
+3915.3226760320317
+13
+2963.876953125
+23
+3.517005398934528e-12
+33
+3915.3226760320317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2963.876953125
+20
+3.517005398934528e-12
+30
+3915.3226760320317
+11
+2971.236328125
+21
+3.561540493947357e-12
+31
+4557.141035407032
+12
+2964.005859375
+22
+3.4960537340523318e-12
+32
+3613.3773635320317
+13
+2964.005859375
+23
+3.4960537340523318e-12
+33
+3613.3773635320317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2964.005859375
+20
+3.4960537340523318e-12
+30
+3613.3773635320317
+11
+2971.236328125
+21
+3.561540493947357e-12
+31
+4557.141035407032
+12
+2970.5390625
+22
+3.492995877350108e-12
+32
+3569.3090041570317
+13
+2970.5390625
+23
+3.492995877350108e-12
+33
+3569.3090041570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2951.396484375
+20
+3.475101662594321e-12
+30
+3311.4261916570317
+11
+2961.708984375
+21
+3.474372672158596e-12
+31
+3300.9203322820317
+12
+2948.58984375
+22
+3.4747056577508206e-12
+32
+3305.7191604070317
+13
+2948.58984375
+23
+3.4747056577508206e-12
+33
+3305.7191604070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2961.708984375
+20
+3.474372672158596e-12
+30
+3300.9203322820317
+11
+2951.396484375
+21
+3.475101662594321e-12
+31
+3311.4261916570317
+12
+2966.33203125
+22
+3.4837775839038215e-12
+32
+3436.4593947820317
+13
+2966.33203125
+23
+3.4837775839038215e-12
+33
+3436.4593947820317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2961.708984375
+20
+3.474372672158596e-12
+30
+3300.9203322820317
+11
+2966.33203125
+21
+3.4837775839038215e-12
+31
+3436.4593947820317
+12
+2971.62890625
+22
+3.451410489872797e-12
+32
+2970.0004104070317
+13
+2971.62890625
+23
+3.451410489872797e-12
+33
+2970.0004104070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.62890625
+20
+3.451410489872797e-12
+30
+2970.0004104070317
+11
+2966.33203125
+21
+3.4837775839038215e-12
+31
+3436.4593947820317
+12
+2970.5390625
+22
+3.492995877350108e-12
+32
+3569.3090041570317
+13
+2970.5390625
+23
+3.492995877350108e-12
+33
+3569.3090041570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.62890625
+20
+3.451410489872797e-12
+30
+2970.0004104070317
+11
+2970.5390625
+21
+3.492995877350108e-12
+31
+3569.3090041570317
+12
+2971.236328125
+22
+3.561540493947357e-12
+32
+4557.141035407032
+13
+2971.236328125
+23
+3.561540493947357e-12
+33
+4557.141035407032
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.62890625
+20
+3.451410489872797e-12
+30
+2970.0004104070317
+11
+2971.236328125
+21
+3.561540493947357e-12
+31
+4557.141035407032
+12
+2971.91015625
+22
+3.550582869165861e-12
+32
+4399.225019782032
+13
+2971.91015625
+23
+3.550582869165861e-12
+33
+4399.225019782032
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.91015625
+20
+3.550582869165861e-12
+30
+4399.225019782032
+11
+2971.236328125
+21
+3.561540493947357e-12
+31
+4557.141035407032
+12
+2980.177734375
+22
+3.5601845636053925e-12
+32
+4537.600019782032
+13
+2980.177734375
+23
+3.5601845636053925e-12
+33
+4537.600019782032
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.177734375
+20
+3.5601845636053925e-12
+30
+4537.600019782032
+11
+2971.236328125
+21
+3.561540493947357e-12
+31
+4557.141035407032
+12
+3258.85546875
+22
+3.5577434824140414e-12
+32
+4502.420332282032
+13
+3258.85546875
+23
+3.5577434824140414e-12
+33
+4502.420332282032
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.177734375
+20
+3.5601845636053925e-12
+30
+4537.600019782032
+11
+3258.85546875
+21
+3.5577434824140414e-12
+31
+4502.420332282032
+12
+3247.8046875
+22
+3.5568380380747444e-12
+32
+4489.371504157032
+13
+3247.8046875
+23
+3.5568380380747444e-12
+33
+4489.371504157032
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2963.390625
+20
+3.44622136275001e-12
+30
+2895.2172072820317
+11
+2971.9453125
+21
+3.4448947058667023e-12
+31
+2876.0980666570317
+12
+2954.26171875
+22
+3.4440327651395763e-12
+32
+2863.6761916570317
+13
+2954.26171875
+23
+3.4440327651395763e-12
+33
+2863.6761916570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.9453125
+20
+3.4448947058667023e-12
+30
+2876.0980666570317
+11
+2963.390625
+21
+3.44622136275001e-12
+31
+2895.2172072820317
+12
+2964.615234375
+22
+3.4484510245177263e-12
+32
+2927.3500197820317
+13
+2964.615234375
+23
+3.4484510245177263e-12
+33
+2927.3500197820317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.9453125
+20
+3.4448947058667023e-12
+30
+2876.0980666570317
+11
+2964.615234375
+21
+3.4484510245177263e-12
+31
+2927.3500197820317
+12
+2971.62890625
+22
+3.451410489872797e-12
+32
+2970.0004104070317
+13
+2971.62890625
+23
+3.451410489872797e-12
+33
+2970.0004104070317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.9453125
+20
+3.4448947058667023e-12
+30
+2876.0980666570317
+11
+2971.62890625
+21
+3.451410489872797e-12
+31
+2970.0004104070317
+12
+2971.91015625
+22
+3.550582869165861e-12
+32
+4399.225019782032
+13
+2971.91015625
+23
+3.550582869165861e-12
+33
+4399.225019782032
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2971.9453125
+20
+3.4448947058667023e-12
+30
+2876.0980666570317
+11
+2971.91015625
+21
+3.550582869165861e-12
+31
+4399.225019782032
+12
+2979.87890625
+22
+3.546532967475813e-12
+32
+4340.859785407032
+13
+2979.87890625
+23
+3.546532967475813e-12
+33
+4340.859785407032
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.951171875
+20
+3.542544052157967e-12
+30
+4283.373457282032
+11
+2980.177734375
+21
+3.539280874669329e-12
+31
+4236.346113532032
+12
+2979.87890625
+22
+3.546532967475813e-12
+32
+4340.859785407032
+13
+2979.87890625
+23
+3.546532967475813e-12
+33
+4340.859785407032
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.177734375
+20
+3.539280874669329e-12
+30
+4236.346113532032
+11
+2980.951171875
+21
+3.542544052157967e-12
+31
+4283.373457282032
+12
+3000.462890625
+22
+3.537403307557127e-12
+32
+4209.287519782032
+13
+3000.462890625
+23
+3.537403307557127e-12
+33
+4209.287519782032
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3000.462890625
+20
+3.537403307557127e-12
+30
+4209.287519782032
+11
+2980.951171875
+21
+3.542544052157967e-12
+31
+4283.373457282032
+12
+3000.333984375
+22
+3.539114178585309e-12
+32
+4233.943769782032
+13
+3000.333984375
+23
+3.539114178585309e-12
+33
+4233.943769782032
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.599609375
+20
+3.524242041860054e-12
+30
+4019.6136916570317
+11
+2980.3125
+21
+3.5187146436594513e-12
+31
+3939.9554885320317
+12
+2980.177734375
+22
+3.539280874669329e-12
+32
+4236.346113532032
+13
+2980.177734375
+23
+3.539280874669329e-12
+33
+4236.346113532032
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.3125
+20
+3.5187146436594513e-12
+30
+3939.9554885320317
+11
+2980.599609375
+21
+3.524242041860054e-12
+31
+4019.6136916570317
+12
+2984.80078125
+22
+3.521221590132781e-12
+32
+3976.0843947820317
+13
+2984.80078125
+23
+3.521221590132781e-12
+33
+3976.0843947820317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3005.794921875
+20
+3.4909056710868275e-12
+30
+3539.1859572820317
+11
+2996.009765625
+21
+3.4896200783608028e-12
+31
+3520.6586135320317
+12
+2988.41015625
+22
+3.4930479190543873e-12
+32
+3570.0590041570317
+13
+2988.41015625
+23
+3.4930479190543873e-12
+33
+3570.0590041570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2996.009765625
+20
+3.4896200783608028e-12
+30
+3520.6586135320317
+11
+3005.794921875
+21
+3.4909056710868275e-12
+31
+3539.1859572820317
+12
+3027.57421875
+22
+3.4887048762019535e-12
+32
+3507.4691604070317
+13
+3027.57421875
+23
+3.4887048762019535e-12
+33
+3507.4691604070317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+3009.375
+20
+3.4750935310780273e-12
+30
+3311.3090041570317
+11
+3004.880859375
+21
+3.471509565271605e-12
+31
+3259.6586135320317
+12
+2996.642578125
+22
+3.478198957150569e-12
+32
+3356.0629104070317
+13
+2996.642578125
+23
+3.478198957150569e-12
+33
+3356.0629104070317
+70
+2
+ 0
+3DFACE
+ 8
+ship8
+10
+3036.392578125
+20
+3.441625429740844e-12
+30
+2828.9828322820317
+11
+3033.76171875
+21
+3.440234940454631e-12
+31
+2808.9437697820317
+12
+3004.9921875
+22
+3.460743031123009e-12
+32
+3104.4965041570317
+13
+3004.9921875
+23
+3.460743031123009e-12
+33
+3104.4965041570317
+70
+2
+ 0
+3DFACE
+ 8
+ship8
+10
+2916.33984375
+20
+3.4368432850085534e-12
+30
+2760.0648635320317
+11
+2656.265625
+21
+3.4374279410300662e-12
+31
+2768.4906447820317
+12
+2643.169921875
+22
+3.438422018896964e-12
+32
+2782.8168166570317
+13
+2643.169921875
+23
+3.438422018896964e-12
+33
+2782.8168166570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2656.265625
+20
+3.4374279410300662e-12
+30
+2768.4906447820317
+11
+2916.33984375
+21
+3.4368432850085534e-12
+31
+2760.0648635320317
+12
+2954.6015625
+22
+3.435111272038008e-12
+32
+2735.1039260320317
+13
+2954.6015625
+23
+3.435111272038008e-12
+33
+2735.1039260320317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2954.6015625
+20
+3.435111272038008e-12
+30
+2735.1039260320317
+11
+2916.33984375
+21
+3.4368432850085534e-12
+31
+2760.0648635320317
+12
+2950.96875
+22
+3.4372783211302632e-12
+32
+2766.3343947820317
+13
+2950.96875
+23
+3.4372783211302632e-12
+33
+2766.3343947820317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2954.6015625
+20
+3.435111272038008e-12
+30
+2735.1039260320317
+11
+2950.96875
+21
+3.4372783211302632e-12
+31
+2766.3343947820317
+12
+2968.986328125
+22
+3.4365810436080835e-12
+32
+2756.2855666570317
+13
+2968.986328125
+23
+3.4365810436080835e-12
+33
+2756.2855666570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+2954.6015625
+20
+3.435111272038008e-12
+30
+2735.1039260320317
+11
+2968.986328125
+21
+3.4365810436080835e-12
+31
+2756.2855666570317
+12
+2954.6015625
+22
+3.3307160198295382e-12
+32
+1230.6097854070317
+13
+2954.6015625
+23
+3.3307160198295382e-12
+33
+1230.6097854070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2954.6015625
+20
+3.3307160198295382e-12
+30
+1230.6097854070317
+11
+2968.986328125
+21
+3.4365810436080835e-12
+31
+2756.2855666570317
+12
+3062.466796875
+22
+3.3289327783063427e-12
+32
+1204.9105666570317
+13
+3062.466796875
+23
+3.3289327783063427e-12
+33
+1204.9105666570317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+2968.986328125
+21
+3.4365810436080835e-12
+31
+2756.2855666570317
+12
+2971.9453125
+22
+3.4448947058667023e-12
+32
+2876.0980666570317
+13
+2971.9453125
+23
+3.4448947058667023e-12
+33
+2876.0980666570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+2971.9453125
+21
+3.4448947058667023e-12
+31
+2876.0980666570317
+12
+2988.41015625
+22
+3.4930479190543873e-12
+32
+3570.0590041570317
+13
+2988.41015625
+23
+3.4930479190543873e-12
+33
+3570.0590041570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2988.41015625
+20
+3.4930479190543873e-12
+30
+3570.0590041570317
+11
+2971.9453125
+21
+3.4448947058667023e-12
+31
+2876.0980666570317
+12
+2980.3125
+22
+3.5187146436594513e-12
+32
+3939.9554885320317
+13
+2980.3125
+23
+3.5187146436594513e-12
+33
+3939.9554885320317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.3125
+20
+3.5187146436594513e-12
+30
+3939.9554885320317
+11
+2971.9453125
+21
+3.4448947058667023e-12
+31
+2876.0980666570317
+12
+2979.87890625
+22
+3.546532967475813e-12
+32
+4340.859785407032
+13
+2979.87890625
+23
+3.546532967475813e-12
+33
+4340.859785407032
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2980.3125
+20
+3.5187146436594513e-12
+30
+3939.9554885320317
+11
+2979.87890625
+21
+3.546532967475813e-12
+31
+4340.859785407032
+12
+2980.177734375
+22
+3.539280874669329e-12
+32
+4236.346113532032
+13
+2980.177734375
+23
+3.539280874669329e-12
+33
+4236.346113532032
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+2988.41015625
+21
+3.4930479190543873e-12
+31
+3570.0590041570317
+12
+2996.642578125
+22
+3.478198957150569e-12
+32
+3356.0629104070317
+13
+2996.642578125
+23
+3.478198957150569e-12
+33
+3356.0629104070317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+2996.642578125
+20
+3.478198957150569e-12
+30
+3356.0629104070317
+11
+2988.41015625
+21
+3.4930479190543873e-12
+31
+3570.0590041570317
+12
+2996.009765625
+22
+3.4896200783608028e-12
+32
+3520.6586135320317
+13
+2996.009765625
+23
+3.4896200783608028e-12
+33
+3520.6586135320317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+2996.642578125
+21
+3.478198957150569e-12
+31
+3356.0629104070317
+12
+3004.9921875
+22
+3.460743031123009e-12
+32
+3104.4965041570317
+13
+3004.9921875
+23
+3.460743031123009e-12
+33
+3104.4965041570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3004.9921875
+20
+3.460743031123009e-12
+30
+3104.4965041570317
+11
+2996.642578125
+21
+3.478198957150569e-12
+31
+3356.0629104070317
+12
+3004.880859375
+22
+3.471509565271605e-12
+32
+3259.6586135320317
+13
+3004.880859375
+23
+3.471509565271605e-12
+33
+3259.6586135320317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+3004.9921875
+21
+3.460743031123009e-12
+31
+3104.4965041570317
+12
+3033.890625
+22
+3.4390335089222457e-12
+32
+2791.6293166570317
+13
+3033.890625
+23
+3.4390335089222457e-12
+33
+2791.6293166570317
+70
+15
+ 0
+3DFACE
+ 8
+ship8
+10
+3033.890625
+20
+3.4390335089222457e-12
+30
+2791.6293166570317
+11
+3004.9921875
+21
+3.460743031123009e-12
+31
+3104.4965041570317
+12
+3033.76171875
+22
+3.440234940454631e-12
+32
+2808.9437697820317
+13
+3033.76171875
+23
+3.440234940454631e-12
+33
+2808.9437697820317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+3033.890625
+21
+3.4390335089222457e-12
+31
+2791.6293166570317
+12
+3038.0625
+22
+3.437688962703092e-12
+32
+2772.2523635320317
+13
+3038.0625
+23
+3.437688962703092e-12
+33
+2772.2523635320317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+3038.0625
+21
+3.437688962703092e-12
+31
+2772.2523635320317
+12
+3050.197265625
+22
+3.436307824660617e-12
+32
+2752.3480666570317
+13
+3050.197265625
+23
+3.436307824660617e-12
+33
+2752.3480666570317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.466796875
+20
+3.3289327783063427e-12
+30
+1204.9105666570317
+11
+3050.197265625
+21
+3.436307824660617e-12
+31
+2752.3480666570317
+12
+3062.53125
+22
+3.4344400153679677e-12
+32
+2725.4300979070317
+13
+3062.53125
+23
+3.4344400153679677e-12
+33
+2725.4300979070317
+70
+3
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.53125
+20
+3.4344400153679677e-12
+30
+2725.4300979070317
+11
+3050.197265625
+21
+3.436307824660617e-12
+31
+2752.3480666570317
+12
+3355.728515625
+22
+3.4344892110415443e-12
+32
+2726.1390822820317
+13
+3355.728515625
+23
+3.4344892110415443e-12
+33
+2726.1390822820317
+70
+13
+ 0
+3DFACE
+ 8
+ship8
+10
+3062.53125
+20
+3.4344400153679677e-12
+30
+2725.4300979070317
+11
+3355.728515625
+21
+3.4344892110415443e-12
+31
+2726.1390822820317
+12
+3383.765625
+22
+3.4336000297348346e-12
+32
+2713.3246291570317
+13
+3383.765625
+23
+3.4336000297348346e-12
+33
+2713.3246291570317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2964.005859375
+20
+3.4960537340523318e-12
+30
+3613.3773635320317
+11
+2960.103515625
+21
+3.514511869463083e-12
+31
+3879.3871291570317
+12
+2963.876953125
+22
+3.517005398934528e-12
+32
+3915.3226760320317
+13
+2963.876953125
+23
+3.517005398934528e-12
+33
+3915.3226760320317
+70
+12
+ 0
+3DFACE
+ 8
+ship8
+10
+2961.345703125
+20
+3.4891549556288065e-12
+30
+3513.9554885320317
+11
+2959.458984375
+21
+3.48698953283981e-12
+31
+3482.7484572820317
+12
+2934.2578125
+22
+3.4860999449572855e-12
+32
+3469.9281447820317
+13
+2934.2578125
+23
+3.4860999449572855e-12
+33
+3469.9281447820317
+70
+1
+ 0
+3DFACE
+ 8
+ship8
+10
+2959.458984375
+20
+3.48698953283981e-12
+30
+3482.7484572820317
+11
+2961.345703125
+21
+3.4891549556288065e-12
+31
+3513.9554885320317
+12
+2966.33203125
+22
+3.4837775839038215e-12
+32
+3436.4593947820317
+13
+2966.33203125
+23
+3.4837775839038215e-12
+33
+3436.4593947820317
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+998.227187499999
+20
+-4.830517875888812e-13
+30
+570.3682710197586
+11
+1323.522109374999
+21
+-4.87950603316953e-13
+31
+499.7688960197586
+12
+997.541406249999
+22
+-4.844455457446439e-13
+32
+550.2820991447584
+13
+997.541406249999
+23
+-4.844455457446439e-13
+33
+550.2820991447584
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+1323.522109374999
+20
+-4.87950603316953e-13
+30
+499.7688960197586
+11
+998.227187499999
+21
+-4.830517875888812e-13
+31
+570.3682710197586
+12
+1568.607695312499
+22
+-4.830517875888812e-13
+32
+570.3682710197586
+13
+1568.607695312499
+23
+-4.830517875888812e-13
+33
+570.3682710197586
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+1323.522109374999
+20
+-4.87950603316953e-13
+30
+499.7688960197586
+11
+1568.607695312499
+21
+-4.830517875888812e-13
+31
+570.3682710197586
+12
+1415.606289062499
+22
+-4.972636126650276e-13
+32
+365.55428664475835
+13
+1415.606289062499
+23
+-4.972636126650276e-13
+33
+365.55428664475835
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+1415.606289062499
+20
+-4.972636126650276e-13
+30
+365.55428664475835
+11
+1568.607695312499
+21
+-4.830517875888812e-13
+31
+570.3682710197586
+12
+1553.944609374999
+22
+-5.422182613925436e-13
+32
+-282.3104789802417
+13
+1553.944609374999
+23
+-5.422182613925436e-13
+33
+-282.3104789802417
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+1553.944609374999
+20
+-5.422182613925436e-13
+30
+-282.3104789802417
+11
+1568.607695312499
+21
+-4.830517875888812e-13
+31
+570.3682710197586
+12
+2291.2677343749992
+22
+-4.559004270019568e-13
+32
+961.6606147697582
+13
+2291.2677343749992
+23
+-4.559004270019568e-13
+33
+961.6606147697582
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2291.2677343749992
+20
+-4.559004270019568e-13
+30
+961.6606147697582
+11
+1568.607695312499
+21
+-4.830517875888812e-13
+31
+570.3682710197586
+12
+1761.808515624999
+22
+-4.722135334665755e-13
+32
+726.5639741447583
+13
+1761.808515624999
+23
+-4.722135334665755e-13
+33
+726.5639741447583
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+1237.366328124999
+20
+-4.947015019851619e-13
+30
+402.4781928947584
+11
+1232.944843749999
+21
+-5.377571082659446e-13
+31
+-218.01848679274173
+12
+1216.3236718749993
+22
+-5.275092916732367e-13
+32
+-70.33188523024171
+13
+1216.3236718749993
+23
+-5.275092916732367e-13
+33
+-70.33188523024171
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+1232.944843749999
+20
+-5.377571082659446e-13
+30
+-218.01848679274173
+11
+1237.366328124999
+21
+-4.947015019851619e-13
+31
+402.4781928947584
+12
+1284.622070312499
+22
+-5.141915756026739e-13
+32
+121.59663039475834
+13
+1284.622070312499
+23
+-5.141915756026739e-13
+33
+121.59663039475834
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+1232.944843749999
+20
+-5.377571082659446e-13
+30
+-218.01848679274173
+11
+1284.622070312499
+21
+-5.141915756026739e-13
+31
+121.59663039475834
+12
+1553.944609374999
+22
+-5.422182613925436e-13
+32
+-282.3104789802417
+13
+1553.944609374999
+23
+-5.422182613925436e-13
+33
+-282.3104789802417
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+1284.622070312499
+20
+-5.141915756026739e-13
+30
+121.59663039475834
+11
+1237.366328124999
+21
+-4.947015019851619e-13
+31
+402.4781928947584
+12
+1243.1413281249993
+22
+-4.898678034395698e-13
+32
+472.13913039475824
+13
+1243.1413281249993
+23
+-4.898678034395698e-13
+33
+472.13913039475824
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+1284.622070312499
+20
+-5.141915756026739e-13
+30
+121.59663039475834
+11
+1243.1413281249993
+21
+-4.898678034395698e-13
+31
+472.13913039475824
+12
+1270.6447656249993
+22
+-4.889135862655437e-13
+32
+485.89084914475825
+13
+1270.6447656249993
+23
+-4.889135862655437e-13
+33
+485.89084914475825
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+1553.944609374999
+20
+-5.422182613925436e-13
+30
+-282.3104789802417
+11
+1284.622070312499
+21
+-5.141915756026739e-13
+31
+121.59663039475834
+12
+1415.606289062499
+22
+-4.972636126650276e-13
+32
+365.55428664475835
+13
+1415.606289062499
+23
+-4.972636126650276e-13
+33
+365.55428664475835
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+4812.524453124999
+20
+-4.134803393771037e-13
+30
+1572.9985053947585
+11
+5024.539140624999
+21
+-5.526720736875186e-13
+31
+-432.9657914802417
+12
+4317.01140625
+22
+-4.173328972982214e-13
+32
+1517.4772944572583
+13
+4317.01140625
+23
+-4.173328972982214e-13
+33
+1517.4772944572583
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+5024.539140624999
+20
+-5.526720736875186e-13
+30
+-432.9657914802417
+11
+4812.524453124999
+21
+-4.134803393771037e-13
+31
+1572.9985053947585
+12
+5899.704296874999
+22
+-4.0569570543703274e-13
+32
+1685.1869038322584
+13
+5899.704296874999
+23
+-4.0569570543703274e-13
+33
+1685.1869038322584
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+5024.539140624999
+20
+-5.526720736875186e-13
+30
+-432.9657914802417
+11
+5899.704296874999
+21
+-4.0569570543703274e-13
+31
+1685.1869038322584
+12
+5558.8890624999985
+22
+-5.55408247605166e-13
+32
+-472.39821335524175
+13
+5558.8890624999985
+23
+-5.55408247605166e-13
+33
+-472.39821335524175
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+5558.8890624999985
+20
+-5.55408247605166e-13
+30
+-472.39821335524175
+11
+5899.704296874999
+21
+-4.0569570543703274e-13
+31
+1685.1869038322584
+12
+5584.010312499999
+22
+-5.562115682313309e-13
+32
+-483.9752836677417
+13
+5584.010312499999
+23
+-5.562115682313309e-13
+33
+-483.9752836677417
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+1499.749843749999
+20
+-4.2078974311042517e-13
+30
+1467.6588960197578
+11
+1761.808515624999
+21
+-4.722135334665755e-13
+31
+726.5639741447583
+12
+1466.218749999999
+22
+-4.218616721143181e-13
+32
+1452.2107710197583
+13
+1466.218749999999
+23
+-4.218616721143181e-13
+33
+1452.2107710197583
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+1761.808515624999
+20
+-4.722135334665755e-13
+30
+726.5639741447583
+11
+1499.749843749999
+21
+-4.2078974311042517e-13
+31
+1467.6588960197578
+12
+1657.271992187499
+22
+-4.4331778374130655e-13
+32
+1142.9956147697583
+13
+1657.271992187499
+23
+-4.4331778374130655e-13
+33
+1142.9956147697583
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+1761.808515624999
+20
+-4.722135334665755e-13
+30
+726.5639741447583
+11
+1657.271992187499
+21
+-4.4331778374130655e-13
+31
+1142.9956147697583
+12
+1828.7263281249989
+22
+-4.657525314857511e-13
+32
+819.6768257072583
+13
+1828.7263281249989
+23
+-4.657525314857511e-13
+33
+819.6768257072583
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+1761.808515624999
+20
+-4.722135334665755e-13
+30
+726.5639741447583
+11
+1828.7263281249989
+21
+-4.657525314857511e-13
+31
+819.6768257072583
+12
+2291.2677343749992
+22
+-4.559004270019568e-13
+32
+961.6606147697582
+13
+2291.2677343749992
+23
+-4.559004270019568e-13
+33
+961.6606147697582
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2291.2677343749992
+20
+-4.559004270019568e-13
+30
+961.6606147697582
+11
+1828.7263281249989
+21
+-4.657525314857511e-13
+31
+819.6768257072583
+12
+1839.1032812499989
+22
+-4.5348921286995216e-13
+32
+996.4098725822582
+13
+1839.1032812499989
+23
+-4.5348921286995216e-13
+33
+996.4098725822582
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+2291.2677343749992
+20
+-4.559004270019568e-13
+30
+961.6606147697582
+11
+1839.1032812499989
+21
+-4.5348921286995216e-13
+31
+996.4098725822582
+12
+2046.100937499999
+22
+-4.476668601788303e-13
+32
+1080.3188178947582
+13
+2046.100937499999
+23
+-4.476668601788303e-13
+33
+1080.3188178947582
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3074.808906249999
+20
+-5.51244504687007e-13
+30
+-412.39235398024175
+11
+1553.944609374999
+21
+-5.422182613925436e-13
+31
+-282.3104789802417
+12
+2291.2677343749992
+22
+-4.559004270019568e-13
+32
+961.6606147697582
+13
+2291.2677343749992
+23
+-4.559004270019568e-13
+33
+961.6606147697582
+70
+0
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+3074.808906249999
+21
+-5.51244504687007e-13
+31
+-412.39235398024175
+12
+2291.2677343749992
+22
+-4.559004270019568e-13
+32
+961.6606147697582
+13
+2291.2677343749992
+23
+-4.559004270019568e-13
+33
+961.6606147697582
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3074.808906249999
+20
+-5.51244504687007e-13
+30
+-412.39235398024175
+11
+3557.310156249999
+21
+-4.2027131015760776e-13
+31
+1475.1303022697584
+12
+3187.547734374999
+22
+-5.504568372297071e-13
+32
+-401.0408696052417
+13
+3187.547734374999
+23
+-5.504568372297071e-13
+33
+-401.0408696052417
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+3187.547734374999
+20
+-5.504568372297071e-13
+30
+-401.0408696052417
+11
+3557.310156249999
+21
+-4.2027131015760776e-13
+31
+1475.1303022697584
+12
+3471.118281249999
+22
+-5.476229875383404e-13
+32
+-360.2007914802417
+13
+3471.118281249999
+23
+-5.476229875383404e-13
+33
+-360.2007914802417
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2756.046953124999
+20
+-3.327776097218626e-13
+30
+2736.0474116447585
+11
+2769.392617187499
+21
+-3.3704842031506016e-13
+31
+2674.4985444572585
+12
+2576.245937499999
+22
+-3.385711605822725e-13
+32
+2652.5535444572583
+13
+2576.245937499999
+23
+-3.385711605822725e-13
+33
+2652.5535444572583
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2769.392617187499
+20
+-3.3704842031506016e-13
+30
+2674.4985444572585
+11
+2756.046953124999
+21
+-3.327776097218626e-13
+31
+2736.0474116447585
+12
+2768.9233984374996
+22
+-3.323405732471447e-13
+32
+2742.3457710197586
+13
+2768.9233984374996
+23
+-3.323405732471447e-13
+33
+2742.3457710197586
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+2769.392617187499
+20
+-3.3704842031506016e-13
+30
+2674.4985444572585
+11
+2768.9233984374996
+21
+-3.323405732471447e-13
+31
+2742.3457710197586
+12
+2851.1720312499992
+22
+-3.2625180362193595e-13
+32
+2830.0941889885084
+13
+2851.1720312499992
+23
+-3.2625180362193595e-13
+33
+2830.0941889885084
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+2769.392617187499
+20
+-3.3704842031506016e-13
+30
+2674.4985444572585
+11
+2851.1720312499992
+21
+-3.2625180362193595e-13
+31
+2830.0941889885084
+12
+2840.560468749999
+22
+-3.460790464968055e-13
+32
+2544.3535053947585
+13
+2840.560468749999
+23
+-3.460790464968055e-13
+33
+2544.3535053947585
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2874.226914062499
+20
+-3.120888164326492e-13
+30
+3034.2043452385083
+11
+2851.1720312499992
+21
+-3.2625180362193595e-13
+31
+2830.0941889885084
+12
+2833.928242187499
+22
+-3.217940941924874e-13
+32
+2894.336552269758
+13
+2833.928242187499
+23
+-3.217940941924874e-13
+33
+2894.336552269758
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2851.1720312499992
+20
+-3.2625180362193595e-13
+30
+2830.0941889885084
+11
+2874.226914062499
+21
+-3.120888164326492e-13
+31
+3034.2043452385083
+12
+2853.924179687499
+22
+-3.69666806659865e-13
+32
+2204.4180561760086
+13
+2853.924179687499
+23
+-3.69666806659865e-13
+33
+2204.4180561760086
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+2921.1939062499996
+20
+-3.080233754149641e-13
+30
+3092.7935249260086
+11
+2874.226914062499
+21
+-3.120888164326492e-13
+31
+3034.2043452385083
+12
+2607.683593749999
+22
+-3.0912786301009684e-13
+32
+3076.8761811760082
+13
+2607.683593749999
+23
+-3.0912786301009684e-13
+33
+3076.8761811760082
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2971.234179687499
+20
+-3.035764911226861e-13
+30
+3156.8798815393284
+11
+2969.875351562499
+21
+-3.150328644328273e-13
+31
+2991.7761421135083
+12
+2942.859179687499
+22
+-3.0020148693299397e-13
+32
+3205.5188178947583
+13
+2942.859179687499
+23
+-3.0020148693299397e-13
+33
+3205.5188178947583
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2969.875351562499
+20
+-3.150328644328273e-13
+30
+2991.7761421135083
+11
+2971.234179687499
+21
+-3.035764911226861e-13
+31
+3156.8798815393284
+12
+3012.826914062499
+22
+-3.0852365069189783e-13
+32
+3085.5837983635083
+13
+3012.826914062499
+23
+-3.0852365069189783e-13
+33
+3085.5837983635083
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+2969.875351562499
+20
+-3.150328644328273e-13
+30
+2991.7761421135083
+11
+3012.826914062499
+21
+-3.0852365069189783e-13
+31
+3085.5837983635083
+12
+3095.183828124999
+22
+-3.127118125534865e-13
+32
+3025.2260249260084
+13
+3095.183828124999
+23
+-3.127118125534865e-13
+33
+3025.2260249260084
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+3095.183828124999
+20
+-3.127118125534865e-13
+30
+3025.2260249260084
+11
+3012.826914062499
+21
+-3.0852365069189783e-13
+31
+3085.5837983635083
+12
+3355.780703124999
+22
+-3.115174757690672e-13
+32
+3042.4382319572583
+13
+3355.780703124999
+23
+-3.115174757690672e-13
+33
+3042.4382319572583
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3095.183828124999
+20
+-3.127118125534865e-13
+30
+3025.2260249260084
+11
+3355.780703124999
+21
+-3.115174757690672e-13
+31
+3042.4382319572583
+12
+3226.294374999999
+22
+-3.1305117325448547e-13
+32
+3020.3353218010084
+13
+3226.294374999999
+23
+-3.1305117325448547e-13
+33
+3020.3353218010084
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3231.870859374999
+20
+-3.867847990675355e-13
+30
+1957.7217866447581
+11
+3148.855234374999
+21
+-3.9001623924807976e-13
+31
+1911.1518257072585
+12
+3081.765976562499
+22
+-3.824579501298005e-13
+32
+2020.0782514885082
+13
+3081.765976562499
+23
+-3.824579501298005e-13
+33
+2020.0782514885082
+70
+2
+ 0
+3DFACE
+ 8
+ship1
+10
+3196.517031249999
+20
+-3.273600479775963e-13
+30
+2814.122704613508
+11
+3030.016562499999
+21
+-3.618107942697687e-13
+31
+2317.6351264885084
+12
+2969.875351562499
+22
+-3.150328644328273e-13
+32
+2991.7761421135083
+13
+2969.875351562499
+23
+-3.150328644328273e-13
+33
+2991.7761421135083
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+3030.016562499999
+20
+-3.618107942697687e-13
+30
+2317.6351264885084
+11
+3196.517031249999
+21
+-3.273600479775963e-13
+31
+2814.122704613508
+12
+3151.417890624999
+22
+-3.4254612628391646e-13
+32
+2595.268251488508
+13
+3151.417890624999
+23
+-3.4254612628391646e-13
+33
+2595.268251488508
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3151.417890624999
+20
+-3.4254612628391646e-13
+30
+2595.268251488508
+11
+3196.517031249999
+21
+-3.273600479775963e-13
+31
+2814.122704613508
+12
+3204.728359374999
+22
+-3.3791560587019543e-13
+32
+2662.001083519758
+13
+3204.728359374999
+23
+-3.3791560587019543e-13
+33
+2662.001083519758
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3233.034882812499
+20
+-3.440369340866439e-13
+30
+2573.7834468010083
+11
+3166.911132812499
+21
+-3.5758068191562086e-13
+31
+2378.5974702385083
+12
+3151.417890624999
+22
+-3.4254612628391646e-13
+32
+2595.268251488508
+13
+3151.417890624999
+23
+-3.4254612628391646e-13
+33
+2595.268251488508
+70
+2
+ 0
+3DFACE
+ 8
+ship1
+10
+3030.016562499999
+20
+-3.618107942697687e-13
+30
+2317.6351264885084
+11
+3166.911132812499
+21
+-3.5758068191562086e-13
+31
+2378.5974702385083
+12
+3495.824453124999
+22
+-3.6110765392434114e-13
+32
+2327.7684468010084
+13
+3495.824453124999
+23
+-3.6110765392434114e-13
+33
+2327.7684468010084
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3166.911132812499
+20
+-3.5758068191562086e-13
+30
+2378.5974702385083
+11
+3030.016562499999
+21
+-3.618107942697687e-13
+31
+2317.6351264885084
+12
+3151.417890624999
+22
+-3.4254612628391646e-13
+32
+2595.268251488508
+13
+3151.417890624999
+23
+-3.4254612628391646e-13
+33
+2595.268251488508
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+2811.189179687499
+20
+-3.837296135684142e-13
+30
+2001.7516499260082
+11
+3148.855234374999
+21
+-3.95514884407068e-13
+31
+1831.9079975822583
+12
+2658.178749999999
+22
+-3.931017918947997e-13
+32
+1866.6843257072583
+13
+2658.178749999999
+23
+-3.931017918947997e-13
+33
+1866.6843257072583
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3148.855234374999
+20
+-3.95514884407068e-13
+30
+1831.9079975822583
+11
+2811.189179687499
+21
+-3.837296135684142e-13
+31
+2001.7516499260082
+12
+2853.924179687499
+22
+-3.69666806659865e-13
+32
+2204.4180561760086
+13
+2853.924179687499
+23
+-3.69666806659865e-13
+33
+2204.4180561760086
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3148.855234374999
+20
+-3.95514884407068e-13
+30
+1831.9079975822583
+11
+2853.924179687499
+21
+-3.69666806659865e-13
+31
+2204.4180561760086
+12
+3081.765976562499
+22
+-3.824579501298005e-13
+32
+2020.0782514885082
+13
+3081.765976562499
+23
+-3.824579501298005e-13
+33
+2020.0782514885082
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3081.765976562499
+20
+-3.824579501298005e-13
+30
+2020.0782514885082
+11
+2853.924179687499
+21
+-3.69666806659865e-13
+31
+2204.4180561760086
+12
+2874.226914062499
+22
+-3.120888164326492e-13
+32
+3034.2043452385083
+13
+2874.226914062499
+23
+-3.120888164326492e-13
+33
+3034.2043452385083
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3081.765976562499
+20
+-3.824579501298005e-13
+30
+2020.0782514885082
+11
+2874.226914062499
+21
+-3.120888164326492e-13
+31
+3034.2043452385083
+12
+3030.016562499999
+22
+-3.618107942697687e-13
+32
+2317.6351264885084
+13
+3030.016562499999
+23
+-3.618107942697687e-13
+33
+2317.6351264885084
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+3030.016562499999
+20
+-3.618107942697687e-13
+30
+2317.6351264885084
+11
+2874.226914062499
+21
+-3.120888164326492e-13
+31
+3034.2043452385083
+12
+2921.1939062499996
+22
+-3.080233754149641e-13
+32
+3092.7935249260086
+13
+2921.1939062499996
+23
+-3.080233754149641e-13
+33
+3092.7935249260086
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3030.016562499999
+20
+-3.618107942697687e-13
+30
+2317.6351264885084
+11
+2921.1939062499996
+21
+-3.080233754149641e-13
+31
+3092.7935249260086
+12
+2934.990742187499
+22
+-3.0467328421442117e-13
+32
+3141.073427269758
+13
+2934.990742187499
+23
+-3.0467328421442117e-13
+33
+3141.073427269758
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3030.016562499999
+20
+-3.618107942697687e-13
+30
+2317.6351264885084
+11
+2934.990742187499
+21
+-3.0467328421442117e-13
+31
+3141.073427269758
+12
+2942.859179687499
+22
+-3.0020148693299397e-13
+32
+3205.5188178947583
+13
+2942.859179687499
+23
+-3.0020148693299397e-13
+33
+3205.5188178947583
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3030.016562499999
+20
+-3.618107942697687e-13
+30
+2317.6351264885084
+11
+2942.859179687499
+21
+-3.0020148693299397e-13
+31
+3205.5188178947583
+12
+2969.875351562499
+22
+-3.150328644328273e-13
+32
+2991.7761421135083
+13
+2969.875351562499
+23
+-3.150328644328273e-13
+33
+2991.7761421135083
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3148.855234374999
+20
+-3.95514884407068e-13
+30
+1831.9079975822583
+11
+3081.765976562499
+21
+-3.824579501298005e-13
+31
+2020.0782514885082
+12
+3148.855234374999
+22
+-3.9001623924807976e-13
+32
+1911.1518257072585
+13
+3148.855234374999
+23
+-3.9001623924807976e-13
+33
+1911.1518257072585
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2208.324296874999
+20
+-3.5515318848799644e-13
+30
+2413.5813374260083
+11
+2281.3960937499987
+21
+-3.5912533661924474e-13
+31
+2356.336649926008
+12
+2195.781718749999
+22
+-3.5648433396829824e-13
+32
+2394.3975093010085
+13
+2195.781718749999
+23
+-3.5648433396829824e-13
+33
+2394.3975093010085
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2281.3960937499987
+20
+-3.5912533661924474e-13
+30
+2356.336649926008
+11
+2208.324296874999
+21
+-3.5515318848799644e-13
+31
+2413.5813374260083
+12
+2330.7452734374992
+22
+-3.57936634975617e-13
+32
+2373.4676460197584
+13
+2330.7452734374992
+23
+-3.57936634975617e-13
+33
+2373.4676460197584
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+2330.7452734374992
+20
+-3.57936634975617e-13
+30
+2373.4676460197584
+11
+2208.324296874999
+21
+-3.5515318848799644e-13
+31
+2413.5813374260083
+12
+2586.8033593749988
+22
+-3.5470644704858204e-13
+32
+2420.0195600822585
+13
+2586.8033593749988
+23
+-3.5470644704858204e-13
+33
+2420.0195600822585
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+2281.3960937499987
+20
+-3.5912533661924474e-13
+30
+2356.336649926008
+11
+2330.7452734374992
+21
+-3.57936634975617e-13
+31
+2373.4676460197584
+12
+2282.641328124999
+22
+-3.778430828849448e-13
+32
+2086.5854975822585
+13
+2282.641328124999
+23
+-3.778430828849448e-13
+33
+2086.5854975822585
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2330.7452734374992
+20
+-3.57936634975617e-13
+30
+2373.4676460197584
+11
+2586.8033593749988
+21
+-3.5470644704858204e-13
+31
+2420.0195600822585
+12
+2777.7483203124993
+22
+-3.593833008421443e-13
+32
+2352.6189936760084
+13
+2777.7483203124993
+23
+-3.593833008421443e-13
+33
+2352.6189936760084
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2777.7483203124993
+20
+-3.593833008421443e-13
+30
+2352.6189936760084
+11
+2586.8033593749988
+21
+-3.5470644704858204e-13
+31
+2420.0195600822585
+12
+2734.7335937499993
+22
+-3.546986204641494e-13
+32
+2420.1323530510085
+13
+2734.7335937499993
+23
+-3.546986204641494e-13
+33
+2420.1323530510085
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+2777.7483203124993
+20
+-3.593833008421443e-13
+30
+2352.6189936760084
+11
+2734.7335937499993
+21
+-3.546986204641494e-13
+31
+2420.1323530510085
+12
+2840.560468749999
+22
+-3.460790464968055e-13
+32
+2544.3535053947585
+13
+2840.560468749999
+23
+-3.460790464968055e-13
+33
+2544.3535053947585
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+2777.7483203124993
+20
+-3.593833008421443e-13
+30
+2352.6189936760084
+11
+2840.560468749999
+21
+-3.460790464968055e-13
+31
+2544.3535053947585
+12
+2853.924179687499
+22
+-3.69666806659865e-13
+32
+2204.4180561760086
+13
+2853.924179687499
+23
+-3.69666806659865e-13
+33
+2204.4180561760086
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+2853.924179687499
+20
+-3.69666806659865e-13
+30
+2204.4180561760086
+11
+2840.560468749999
+21
+-3.460790464968055e-13
+31
+2544.3535053947585
+12
+2851.1720312499992
+22
+-3.2625180362193595e-13
+32
+2830.0941889885084
+13
+2851.1720312499992
+23
+-3.2625180362193595e-13
+33
+2830.0941889885084
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+2330.7452734374992
+20
+-3.955142582803135e-13
+30
+1831.9170210197585
+11
+2282.641328124999
+21
+-3.778430828849448e-13
+31
+2086.5854975822585
+12
+2330.7452734374992
+22
+-3.57936634975617e-13
+32
+2373.4676460197584
+13
+2330.7452734374992
+23
+-3.57936634975617e-13
+33
+2373.4676460197584
+70
+2
+ 0
+3DFACE
+ 8
+ship1
+10
+3568.977460937499
+20
+-3.857278971057532e-13
+30
+1972.9533491447578
+11
+3499.154101562499
+21
+-3.929064403473612e-13
+31
+1869.4996382072582
+12
+3499.154101562499
+22
+-3.6895490053987314e-13
+32
+2214.6777046135085
+13
+3499.154101562499
+23
+-3.6895490053987314e-13
+33
+2214.6777046135085
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3499.154101562499
+20
+-3.929064403473612e-13
+30
+1869.4996382072582
+11
+3568.977460937499
+21
+-3.857278971057532e-13
+31
+1972.9533491447578
+12
+3557.310156249999
+22
+-4.2027131015760776e-13
+32
+1475.1303022697584
+13
+3557.310156249999
+23
+-4.2027131015760776e-13
+33
+1475.1303022697584
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+3568.977460937499
+21
+-3.857278971057532e-13
+31
+1972.9533491447578
+12
+3570.231718749999
+22
+-4.02744770042554e-13
+32
+1727.7143647697585
+13
+3570.231718749999
+23
+-4.02744770042554e-13
+33
+1727.7143647697585
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+3376.498515624999
+21
+-3.999509924634825e-13
+31
+1767.9769428947584
+12
+3499.154101562499
+22
+-3.929064403473612e-13
+32
+1869.4996382072582
+13
+3499.154101562499
+23
+-3.929064403473612e-13
+33
+1869.4996382072582
+70
+12
+ 0
+3DFACE
+ 8
+ship1
+10
+4317.01140625
+20
+-4.173328972982214e-13
+30
+1517.4772944572583
+11
+4225.549843749999
+21
+-4.1738611807236326e-13
+31
+1516.7103022697584
+12
+4225.549843749999
+22
+-3.966256332697469e-13
+32
+1815.9004194572585
+13
+4225.549843749999
+23
+-3.966256332697469e-13
+33
+1815.9004194572585
+70
+0
+ 0
+3DFACE
+ 8
+ship1
+10
+3471.118281249999
+20
+-5.476229875383404e-13
+30
+-360.2007914802417
+11
+3932.450546874999
+21
+-4.1888882228342817e-13
+31
+1495.0540522697584
+12
+4225.549843749999
+22
+-4.1738611807236326e-13
+32
+1516.7103022697584
+13
+4225.549843749999
+23
+-4.1738611807236326e-13
+33
+1516.7103022697584
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3932.450546874999
+20
+-4.1888882228342817e-13
+30
+1495.0540522697584
+11
+3471.118281249999
+21
+-5.476229875383404e-13
+31
+-360.2007914802417
+12
+3557.310156249999
+22
+-4.2027131015760776e-13
+32
+1475.1303022697584
+13
+3557.310156249999
+23
+-4.2027131015760776e-13
+33
+1475.1303022697584
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3932.450546874999
+20
+-4.1888882228342817e-13
+30
+1495.0540522697584
+11
+3557.310156249999
+21
+-4.2027131015760776e-13
+31
+1475.1303022697584
+12
+3603.816953124999
+22
+-4.1503062922151894e-13
+32
+1550.6564741447578
+13
+3603.816953124999
+23
+-4.1503062922151894e-13
+33
+1550.6564741447578
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+4225.549843749999
+20
+-4.1738611807236326e-13
+30
+1516.7103022697584
+11
+3820.343359374999
+21
+-5.491745296362649e-13
+31
+-382.5608696052417
+12
+3471.118281249999
+22
+-5.476229875383404e-13
+32
+-360.2007914802417
+13
+3471.118281249999
+23
+-5.476229875383404e-13
+33
+-360.2007914802417
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3820.343359374999
+20
+-5.491745296362649e-13
+30
+-382.5608696052417
+11
+4225.549843749999
+21
+-4.1738611807236326e-13
+31
+1516.7103022697584
+12
+4099.654843749999
+22
+-5.538967776195364e-13
+32
+-450.6156352302417
+13
+4099.654843749999
+23
+-5.538967776195364e-13
+33
+-450.6156352302417
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+4099.654843749999
+20
+-5.538967776195364e-13
+30
+-450.6156352302417
+11
+4225.549843749999
+21
+-4.1738611807236326e-13
+31
+1516.7103022697584
+12
+4238.5075
+22
+-5.560130860501194e-13
+32
+-481.1148539802417
+13
+4238.5075
+23
+-5.560130860501194e-13
+33
+-481.1148539802417
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+4238.5075
+20
+-5.560130860501194e-13
+30
+-481.1148539802417
+11
+4225.549843749999
+21
+-4.1738611807236326e-13
+31
+1516.7103022697584
+12
+4317.01140625
+22
+-4.173328972982214e-13
+32
+1517.4772944572583
+13
+4317.01140625
+23
+-4.173328972982214e-13
+33
+1517.4772944572583
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+7258.850546874999
+20
+-3.9946449197515037e-13
+30
+1774.9881538322584
+11
+7255.945
+21
+-5.447891378469739e-13
+31
+-319.3607133552417
+12
+6709.756328124999
+22
+-3.9959535246686385e-13
+32
+1773.1022553947578
+13
+6709.756328124999
+23
+-3.9959535246686385e-13
+33
+1773.1022553947578
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+7255.945
+20
+-5.447891378469739e-13
+30
+-319.3607133552417
+11
+7258.850546874999
+21
+-3.9946449197515037e-13
+31
+1774.9881538322584
+12
+7260.2221093749995
+22
+-4.698655581367866e-13
+32
+760.4018647697583
+13
+7260.2221093749995
+23
+-4.698655581367866e-13
+33
+760.4018647697583
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+7260.2221093749995
+20
+-4.698655581367866e-13
+30
+760.4018647697583
+11
+7258.850546874999
+21
+-3.9946449197515037e-13
+31
+1774.9881538322584
+12
+7305.249062499999
+22
+-4.141027093711863e-13
+32
+1564.0292085197584
+13
+7305.249062499999
+23
+-4.141027093711863e-13
+33
+1564.0292085197584
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+7260.2221093749995
+20
+-4.698655581367866e-13
+30
+760.4018647697583
+11
+7305.249062499999
+21
+-4.141027093711863e-13
+31
+1564.0292085197584
+12
+7280.795546874999
+22
+-4.579077893772378e-13
+32
+932.7314741447583
+13
+7280.795546874999
+23
+-4.579077893772378e-13
+33
+932.7314741447583
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+7280.795546874999
+20
+-4.579077893772378e-13
+30
+932.7314741447583
+11
+7305.249062499999
+21
+-4.141027093711863e-13
+31
+1564.0292085197584
+12
+7360.273984374999
+22
+-4.26528820943184e-13
+32
+1384.9500678947584
+13
+7360.273984374999
+23
+-4.26528820943184e-13
+33
+1384.9500678947584
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+7280.795546874999
+20
+-4.579077893772378e-13
+30
+932.7314741447583
+11
+7360.273984374999
+21
+-4.26528820943184e-13
+31
+1384.9500678947584
+12
+7383.211562499999
+22
+-4.265025236194904e-13
+32
+1385.329052269758
+13
+7383.211562499999
+23
+-4.265025236194904e-13
+33
+1385.329052269758
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+6188.634765625
+20
+-4.0306409468740535e-13
+30
+1723.1124116447581
+11
+7323.963671874999
+21
+-5.684341886080801e-13
+31
+-660.1218071052417
+12
+5899.704296874999
+22
+-4.0569570543703274e-13
+32
+1685.1869038322584
+13
+5899.704296874999
+23
+-4.0569570543703274e-13
+33
+1685.1869038322584
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+7323.963671874999
+20
+-5.684341886080801e-13
+30
+-660.1218071052417
+11
+6188.634765625
+21
+-4.0306409468740535e-13
+31
+1723.1124116447581
+12
+6709.756328124999
+22
+-3.9959535246686385e-13
+32
+1773.1022553947578
+13
+6709.756328124999
+23
+-3.9959535246686385e-13
+33
+1773.1022553947578
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+7323.963671874999
+20
+-5.684341886080801e-13
+30
+-660.1218071052417
+11
+6709.756328124999
+21
+-3.9959535246686385e-13
+31
+1773.1022553947578
+12
+7255.945
+22
+-5.447891378469739e-13
+32
+-319.3607133552417
+13
+7255.945
+23
+-5.447891378469739e-13
+33
+-319.3607133552417
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+7323.963671874999
+20
+-5.684341886080801e-13
+30
+-660.1218071052417
+11
+7255.945
+21
+-5.447891378469739e-13
+31
+-319.3607133552417
+12
+7309.291562499999
+22
+-5.621823129632955e-13
+32
+-570.0227836677417
+13
+7309.291562499999
+23
+-5.621823129632955e-13
+33
+-570.0227836677417
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+7311.6015625
+20
+-4.053006194548736e-13
+30
+1690.8806928947583
+11
+7305.249062499999
+21
+-4.141027093711863e-13
+31
+1564.0292085197584
+12
+7258.850546874999
+22
+-3.9946449197515037e-13
+32
+1774.9881538322584
+13
+7258.850546874999
+23
+-3.9946449197515037e-13
+33
+1774.9881538322584
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+7305.249062499999
+20
+-4.141027093711863e-13
+30
+1564.0292085197584
+11
+7311.6015625
+21
+-4.053006194548736e-13
+31
+1690.8806928947583
+12
+7441.9
+22
+-4.0808938801990834e-13
+32
+1650.6903022697584
+13
+7441.9
+23
+-4.0808938801990834e-13
+33
+1650.6903022697584
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+5899.704296874999
+20
+-4.0569570543703274e-13
+30
+1685.1869038322584
+11
+5653.743437499999
+21
+-5.620602182461465e-13
+31
+-568.2632133552418
+12
+5584.010312499999
+22
+-5.562115682313309e-13
+32
+-483.9752836677417
+13
+5584.010312499999
+23
+-5.562115682313309e-13
+33
+-483.9752836677417
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+5653.743437499999
+20
+-5.620602182461465e-13
+30
+-568.2632133552418
+11
+5899.704296874999
+21
+-4.0569570543703274e-13
+31
+1685.1869038322584
+12
+6595.1947656249995
+22
+-5.671907008734239e-13
+32
+-642.2012602302417
+13
+6595.1947656249995
+23
+-5.671907008734239e-13
+33
+-642.2012602302417
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+6595.1947656249995
+20
+-5.671907008734239e-13
+30
+-642.2012602302417
+11
+5899.704296874999
+21
+-4.0569570543703274e-13
+31
+1685.1869038322584
+12
+6668.086093749998
+22
+-5.624183627497836e-13
+32
+-573.4246196052417
+13
+6668.086093749998
+23
+-5.624183627497836e-13
+33
+-573.4246196052417
+70
+3
+ 0
+3DFACE
+ 8
+ship1
+10
+6668.086093749998
+20
+-5.624183627497836e-13
+30
+-573.4246196052417
+11
+5899.704296874999
+21
+-4.0569570543703274e-13
+31
+1685.1869038322584
+12
+7323.963671874999
+22
+-5.684341886080801e-13
+32
+-660.1218071052417
+13
+7323.963671874999
+23
+-5.684341886080801e-13
+33
+-660.1218071052417
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2406.984296874999
+20
+-4.400556633497865e-13
+30
+1190.0077241447584
+11
+2400.198671874999
+21
+-4.4558937160703303e-13
+31
+1110.2585835197583
+12
+1732.283828124999
+22
+-4.3997051011115963e-13
+32
+1191.2349116447583
+13
+1732.283828124999
+23
+-4.3997051011115963e-13
+33
+1191.2349116447583
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2496.695312499999
+20
+-4.0924647026242834e-13
+30
+1634.0149897697584
+11
+2442.771249999999
+21
+-4.251813961672625e-13
+31
+1404.3685053947584
+12
+2415.917499999999
+22
+-4.1426675458089433e-13
+32
+1561.6650678947585
+13
+2415.917499999999
+23
+-4.1426675458089433e-13
+33
+1561.6650678947585
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2400.198671874999
+20
+-4.4558937160703303e-13
+30
+1110.2585835197583
+11
+3557.310156249999
+21
+-4.2027131015760776e-13
+31
+1475.1303022697584
+12
+2291.2677343749992
+22
+-4.559004270019568e-13
+32
+961.6606147697582
+13
+2291.2677343749992
+23
+-4.559004270019568e-13
+33
+961.6606147697582
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+2400.198671874999
+21
+-4.4558937160703303e-13
+31
+1110.2585835197583
+12
+2406.984296874999
+22
+-4.400556633497865e-13
+32
+1190.0077241447584
+13
+2406.984296874999
+23
+-4.400556633497865e-13
+33
+1190.0077241447584
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+2406.984296874999
+21
+-4.400556633497865e-13
+31
+1190.0077241447584
+12
+2442.771249999999
+22
+-4.251813961672625e-13
+32
+1404.3685053947584
+13
+2442.771249999999
+23
+-4.251813961672625e-13
+33
+1404.3685053947584
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+2442.771249999999
+21
+-4.251813961672625e-13
+31
+1404.3685053947584
+12
+2496.695312499999
+22
+-4.0924647026242834e-13
+32
+1634.0149897697584
+13
+2496.695312499999
+23
+-4.0924647026242834e-13
+33
+1634.0149897697584
+70
+15
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+2496.695312499999
+21
+-4.0924647026242834e-13
+31
+1634.0149897697584
+12
+2509.671015624999
+22
+-3.949670234967839e-13
+32
+1839.8035053947583
+13
+2509.671015624999
+23
+-3.949670234967839e-13
+33
+1839.8035053947583
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+2509.671015624999
+21
+-3.949670234967839e-13
+31
+1839.8035053947583
+12
+2658.178749999999
+22
+-3.931017918947997e-13
+32
+1866.6843257072583
+13
+2658.178749999999
+23
+-3.931017918947997e-13
+33
+1866.6843257072583
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+2658.178749999999
+21
+-3.931017918947997e-13
+31
+1866.6843257072583
+12
+3148.855234374999
+22
+-3.95514884407068e-13
+32
+1831.9079975822583
+13
+3148.855234374999
+23
+-3.95514884407068e-13
+33
+1831.9079975822583
+70
+13
+ 0
+3DFACE
+ 8
+ship1
+10
+3557.310156249999
+20
+-4.2027131015760776e-13
+30
+1475.1303022697584
+11
+3148.855234374999
+21
+-3.95514884407068e-13
+31
+1831.9079975822583
+12
+3376.498515624999
+22
+-3.999509924634825e-13
+32
+1767.9769428947584
+13
+3376.498515624999
+23
+-3.999509924634825e-13
+33
+1767.9769428947584
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+5024.539140624999
+20
+-5.526720736875186e-13
+30
+-432.9657914802417
+11
+4238.5075
+21
+-5.560130860501194e-13
+31
+-481.1148539802417
+12
+4317.01140625
+22
+-4.173328972982214e-13
+32
+1517.4772944572583
+13
+4317.01140625
+23
+-4.173328972982214e-13
+33
+1517.4772944572583
+70
+0
+ 0
+3DFACE
+ 8
+ship1
+10
+2971.234179687499
+20
+-2.465915231422641e-13
+30
+3978.1198193388427
+11
+2942.859179687499
+21
+-3.0020148693299397e-13
+31
+3205.5188178947583
+12
+2942.859179687499
+22
+-2.465915231422641e-13
+32
+3978.1198193388427
+13
+2942.859179687499
+23
+-2.465915231422641e-13
+33
+3978.1198193388427
+70
+1
+ 0
+3DFACE
+ 8
+ship1
+10
+2942.859179687499
+20
+-3.0020148693299397e-13
+30
+3205.5188178947583
+11
+2971.234179687499
+21
+-2.465915231422641e-13
+31
+3978.1198193388427
+12
+2971.234179687499
+22
+-3.035764911226861e-13
+32
+3156.8798815393284
+13
+2971.234179687499
+23
+-3.035764911226861e-13
+33
+3156.8798815393284
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+1457.96484375
+20
+9.113482809120638e-13
+30
+-805.9081714760168
+11
+122.25
+21
+9.132018600511993e-13
+31
+-779.1952808510168
+12
+72.421875
+22
+1.0071948700410283e-12
+32
+575.3867503989832
+13
+72.421875
+23
+1.0071948700410283e-12
+33
+575.3867503989832
+70
+0
+ 0
+3DFACE
+ 8
+ship7
+10
+5308.705078125
+20
+1.061115767735793e-12
+30
+1352.4687816489832
+11
+5280.205078125
+21
+1.050872496660693e-12
+31
+1204.8476878989832
+12
+5265.626953125
+22
+1.0582542871520606e-12
+32
+1311.2305003989832
+13
+5265.626953125
+23
+1.0582542871520606e-12
+33
+1311.2305003989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5701.845703125
+20
+1.0816307701930206e-12
+30
+1648.1211253989832
+11
+5308.705078125
+21
+1.0772966720085098e-12
+31
+1585.6601878989832
+12
+5275.845703125
+22
+1.0817885216091172e-12
+32
+1650.3945628989832
+13
+5275.845703125
+23
+1.0817885216091172e-12
+33
+1650.3945628989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5308.705078125
+20
+1.0772966720085098e-12
+30
+1585.6601878989832
+11
+5701.845703125
+21
+1.0816307701930206e-12
+31
+1648.1211253989832
+12
+5308.705078125
+22
+1.061115767735793e-12
+32
+1352.4687816489832
+13
+5308.705078125
+23
+1.061115767735793e-12
+33
+1352.4687816489832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+5308.705078125
+20
+1.061115767735793e-12
+30
+1352.4687816489832
+11
+5701.845703125
+21
+1.0816307701930206e-12
+31
+1648.1211253989832
+12
+5606.642578125
+22
+1.0167916855707837e-12
+32
+713.6914378989832
+13
+5606.642578125
+23
+1.0167916855707837e-12
+33
+713.6914378989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+5606.642578125
+20
+1.0167916855707837e-12
+30
+713.6914378989832
+11
+5701.845703125
+21
+1.0816307701930206e-12
+31
+1648.1211253989832
+12
+5706.134765625
+22
+1.080834694747873e-12
+32
+1636.6484691489832
+13
+5706.134765625
+23
+1.080834694747873e-12
+33
+1636.6484691489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5200.892578125
+20
+1.0141310534395043e-12
+30
+675.3476878989832
+11
+5606.642578125
+21
+1.0167916855707837e-12
+31
+713.6914378989832
+12
+5099.056640625
+22
+9.979013600690256e-13
+32
+441.45315664898317
+13
+5099.056640625
+23
+9.979013600690256e-13
+33
+441.45315664898317
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5606.642578125
+20
+1.0167916855707837e-12
+30
+713.6914378989832
+11
+5200.892578125
+21
+1.0141310534395043e-12
+31
+675.3476878989832
+12
+5280.205078125
+22
+1.050872496660693e-12
+32
+1204.8476878989832
+13
+5280.205078125
+23
+1.050872496660693e-12
+33
+1204.8476878989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+5606.642578125
+20
+1.0167916855707837e-12
+30
+713.6914378989832
+11
+5280.205078125
+21
+1.050872496660693e-12
+31
+1204.8476878989832
+12
+5308.705078125
+22
+1.061115767735793e-12
+32
+1352.4687816489832
+13
+5308.705078125
+23
+1.061115767735793e-12
+33
+1352.4687816489832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+1032.29296875
+20
+1.0168697481272027e-12
+30
+714.8164378989832
+11
+1124.26171875
+21
+1.0132252025243926e-12
+31
+662.2930003989832
+12
+998.296875
+22
+1.0134252378252162e-12
+32
+665.1758128989832
+13
+998.296875
+23
+1.0134252378252162e-12
+33
+665.1758128989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+1124.26171875
+20
+1.0132252025243926e-12
+30
+662.2930003989832
+11
+1032.29296875
+21
+1.0168697481272027e-12
+31
+714.8164378989832
+12
+1127.26171875
+22
+1.0179040769997538e-12
+32
+729.7226878989832
+13
+1127.26171875
+23
+1.0179040769997538e-12
+33
+729.7226878989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2429.91796875
+20
+1.0132252025243926e-12
+30
+662.2930003989832
+11
+2793.6796875
+21
+9.094947017729282e-13
+31
+-832.6210621010168
+12
+1457.96484375
+22
+9.113482809120638e-13
+32
+-805.9081714760168
+13
+1457.96484375
+23
+9.113482809120638e-13
+33
+-805.9081714760168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2793.6796875
+20
+9.094947017729282e-13
+30
+-832.6210621010168
+11
+2429.91796875
+21
+1.0132252025243926e-12
+31
+662.2930003989832
+12
+2691.52734375
+22
+1.0220755448583918e-12
+32
+789.8398753989832
+13
+2691.52734375
+23
+1.0220755448583918e-12
+33
+789.8398753989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2793.6796875
+20
+9.094947017729282e-13
+30
+-832.6210621010168
+11
+2691.52734375
+21
+1.0220755448583918e-12
+31
+789.8398753989832
+12
+2713.41796875
+22
+1.038795568661377e-12
+32
+1030.8008128989832
+13
+2713.41796875
+23
+1.038795568661377e-12
+33
+1030.8008128989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2793.6796875
+20
+9.094947017729282e-13
+30
+-832.6210621010168
+11
+2713.41796875
+21
+1.038795568661377e-12
+31
+1030.8008128989832
+12
+2824.62890625
+22
+1.0451657985258156e-12
+32
+1122.6055003989832
+13
+2824.62890625
+23
+1.0451657985258156e-12
+33
+1122.6055003989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2793.6796875
+20
+9.094947017729282e-13
+30
+-832.6210621010168
+11
+2824.62890625
+21
+1.0451657985258156e-12
+31
+1122.6055003989832
+12
+3198.515625
+22
+9.133213933407158e-13
+32
+-777.4726246010168
+13
+3198.515625
+23
+9.133213933407158e-13
+33
+-777.4726246010168
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+2824.62890625
+21
+1.0451657985258156e-12
+31
+1122.6055003989832
+12
+2947.76953125
+22
+1.0478784723613743e-12
+32
+1161.6992503989832
+13
+2947.76953125
+23
+1.0478784723613743e-12
+33
+1161.6992503989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+2947.76953125
+21
+1.0478784723613743e-12
+31
+1161.6992503989832
+12
+2977.2421875
+22
+1.0452780134506678e-12
+32
+1124.2226878989832
+13
+2977.2421875
+23
+1.0452780134506678e-12
+33
+1124.2226878989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+2977.2421875
+21
+1.0452780134506678e-12
+31
+1124.2226878989832
+12
+3034.59375
+22
+1.0467921017845438e-12
+32
+1146.0430003989832
+13
+3034.59375
+23
+1.0467921017845438e-12
+33
+1146.0430003989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+3034.59375
+21
+1.0467921017845438e-12
+31
+1146.0430003989832
+12
+3095.28515625
+22
+1.0498934620989386e-12
+32
+1190.7383128989832
+13
+3095.28515625
+23
+1.0498934620989386e-12
+33
+1190.7383128989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+3095.28515625
+21
+1.0498934620989386e-12
+31
+1190.7383128989832
+12
+3134.94140625
+22
+1.0495161597429137e-12
+32
+1185.3008128989832
+13
+3134.94140625
+23
+1.0495161597429137e-12
+33
+1185.3008128989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+3134.94140625
+21
+1.0495161597429137e-12
+31
+1185.3008128989832
+12
+3159.59765625
+22
+1.0608466145464734e-12
+32
+1348.5898753989832
+13
+3159.59765625
+23
+1.0608466145464734e-12
+33
+1348.5898753989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+3159.59765625
+21
+1.0608466145464734e-12
+31
+1348.5898753989832
+12
+3220.4765625
+22
+1.0490445317978825e-12
+32
+1178.5039378989832
+13
+3220.4765625
+23
+1.0490445317978825e-12
+33
+1178.5039378989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3198.515625
+20
+9.133213933407158e-13
+30
+-777.4726246010168
+11
+3220.4765625
+21
+1.0490445317978825e-12
+31
+1178.5039378989832
+12
+3660.609375
+22
+1.0492917298932092e-12
+32
+1182.0664378989832
+13
+3660.609375
+23
+1.0492917298932092e-12
+33
+1182.0664378989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+3660.609375
+20
+1.0492917298932092e-12
+30
+1182.0664378989832
+11
+3220.4765625
+21
+1.0490445317978825e-12
+31
+1178.5039378989832
+12
+3570.0703125
+22
+1.0510765977196634e-12
+32
+1207.7890941489832
+13
+3570.0703125
+23
+1.0510765977196634e-12
+33
+1207.7890941489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+81.99609375
+20
+1.012002222473829e-12
+30
+644.6680003989832
+11
+6.0703125
+21
+1.0074835388694525e-12
+31
+579.5469066489832
+12
+0.0
+22
+1.0083056351667397e-12
+32
+591.3945628989832
+13
+0.0
+23
+1.0083056351667397e-12
+33
+591.3945628989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6.0703125
+20
+1.0074835388694525e-12
+30
+579.5469066489832
+11
+81.99609375
+21
+1.012002222473829e-12
+31
+644.6680003989832
+12
+72.421875
+22
+1.0071948700410283e-12
+32
+575.3867503989832
+13
+72.421875
+23
+1.0071948700410283e-12
+33
+575.3867503989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+72.421875
+20
+1.0071948700410283e-12
+30
+575.3867503989832
+11
+81.99609375
+21
+1.012002222473829e-12
+31
+644.6680003989832
+12
+1457.96484375
+22
+9.113482809120638e-13
+32
+-805.9081714760168
+13
+1457.96484375
+23
+9.113482809120638e-13
+33
+-805.9081714760168
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+1457.96484375
+20
+9.113482809120638e-13
+30
+-805.9081714760168
+11
+81.99609375
+21
+1.012002222473829e-12
+31
+644.6680003989832
+12
+351.73828125
+22
+1.010780868726524e-12
+32
+627.0664378989832
+13
+351.73828125
+23
+1.010780868726524e-12
+33
+627.0664378989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+1457.96484375
+20
+9.113482809120638e-13
+30
+-805.9081714760168
+11
+351.73828125
+21
+1.010780868726524e-12
+31
+627.0664378989832
+12
+736.0078125
+22
+1.0116509409699437e-12
+32
+639.6055003989832
+13
+736.0078125
+23
+1.0116509409699437e-12
+33
+639.6055003989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+1457.96484375
+20
+9.113482809120638e-13
+30
+-805.9081714760168
+11
+736.0078125
+21
+1.0116509409699437e-12
+31
+639.6055003989832
+12
+825.09375
+22
+1.0134252378252162e-12
+32
+665.1758128989832
+13
+825.09375
+23
+1.0134252378252162e-12
+33
+665.1758128989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+1457.96484375
+20
+9.113482809120638e-13
+30
+-805.9081714760168
+11
+825.09375
+21
+1.0134252378252162e-12
+31
+665.1758128989832
+12
+998.296875
+22
+1.0134252378252162e-12
+32
+665.1758128989832
+13
+998.296875
+23
+1.0134252378252162e-12
+33
+665.1758128989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+1457.96484375
+20
+9.113482809120638e-13
+30
+-805.9081714760168
+11
+998.296875
+21
+1.0134252378252162e-12
+31
+665.1758128989832
+12
+1124.26171875
+22
+1.0132252025243926e-12
+32
+662.2930003989832
+13
+1124.26171875
+23
+1.0132252025243926e-12
+33
+662.2930003989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+1457.96484375
+20
+9.113482809120638e-13
+30
+-805.9081714760168
+11
+1124.26171875
+21
+1.0132252025243926e-12
+31
+662.2930003989832
+12
+2429.91796875
+22
+1.0132252025243926e-12
+32
+662.2930003989832
+13
+2429.91796875
+23
+1.0132252025243926e-12
+33
+662.2930003989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2456.23828125
+20
+1.0261567528861704e-12
+30
+848.6562816489832
+11
+2429.91796875
+21
+1.0132252025243926e-12
+31
+662.2930003989832
+12
+2400.515625
+22
+1.0255208683120076e-12
+32
+839.4922191489832
+13
+2400.515625
+23
+1.0255208683120076e-12
+33
+839.4922191489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2429.91796875
+20
+1.0132252025243926e-12
+30
+662.2930003989832
+11
+2456.23828125
+21
+1.0261567528861704e-12
+31
+848.6562816489832
+12
+2481.15234375
+22
+1.0220755448583918e-12
+32
+789.8398753989832
+13
+2481.15234375
+23
+1.0220755448583918e-12
+33
+789.8398753989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2429.91796875
+20
+1.0132252025243926e-12
+30
+662.2930003989832
+11
+2481.15234375
+21
+1.0220755448583918e-12
+31
+789.8398753989832
+12
+2691.52734375
+22
+1.0220755448583918e-12
+32
+789.8398753989832
+13
+2691.52734375
+23
+1.0220755448583918e-12
+33
+789.8398753989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2093.98828125
+20
+1.1038054151257803e-12
+30
+1967.6914378989832
+11
+2659.5234375
+21
+1.028806814046268e-12
+31
+886.8476878989832
+12
+2093.9765625
+22
+1.1009057164154679e-12
+32
+1925.9023753989832
+13
+2093.9765625
+23
+1.1009057164154679e-12
+33
+1925.9023753989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2659.5234375
+20
+1.028806814046268e-12
+30
+886.8476878989832
+11
+2093.98828125
+21
+1.1038054151257803e-12
+31
+1967.6914378989832
+12
+2693.37890625
+22
+1.0326993708960341e-12
+32
+942.9453441489832
+13
+2693.37890625
+23
+1.0326993708960341e-12
+33
+942.9453441489832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2659.5234375
+20
+1.028806814046268e-12
+30
+886.8476878989832
+11
+2693.37890625
+21
+1.0326993708960341e-12
+31
+942.9453441489832
+12
+2691.52734375
+22
+1.0220755448583918e-12
+32
+789.8398753989832
+13
+2691.52734375
+23
+1.0220755448583918e-12
+33
+789.8398753989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2691.52734375
+20
+1.0220755448583918e-12
+30
+789.8398753989832
+11
+2693.37890625
+21
+1.0326993708960341e-12
+31
+942.9453441489832
+12
+2713.41796875
+22
+1.038795568661377e-12
+32
+1030.8008128989832
+13
+2713.41796875
+23
+1.038795568661377e-12
+33
+1030.8008128989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2713.41796875
+20
+1.038795568661377e-12
+30
+1030.8008128989832
+11
+2693.37890625
+21
+1.0326993708960341e-12
+31
+942.9453441489832
+12
+2701.3828125
+22
+1.0389232334671872e-12
+32
+1032.6406566489832
+13
+2701.3828125
+23
+1.0389232334671872e-12
+33
+1032.6406566489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2837.82421875
+20
+1.1214869907304886e-12
+30
+2222.509797273983
+11
+2826.08203125
+21
+1.1157689084728e-12
+31
+2140.103547273983
+12
+2794.58203125
+22
+1.121646368449844e-12
+32
+2224.806672273983
+13
+2794.58203125
+23
+1.121646368449844e-12
+33
+2224.806672273983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2824.62890625
+20
+1.0451657985258156e-12
+30
+1122.6055003989832
+11
+2713.41796875
+21
+1.038795568661377e-12
+31
+1030.8008128989832
+12
+2802.17578125
+22
+1.0923302193321938e-12
+32
+1802.3164378989832
+13
+2802.17578125
+23
+1.0923302193321938e-12
+33
+1802.3164378989832
+70
+12
+ 0
+3DFACE
+ 8
+ship7
+10
+2908.51171875
+20
+1.1679411235886172e-12
+30
+2891.984406648983
+11
+2889.24609375
+21
+1.1446630318948103e-12
+31
+2556.511750398983
+12
+2812.60546875
+22
+1.1631915049215014e-12
+32
+2823.535187898983
+13
+2812.60546875
+23
+1.1631915049215014e-12
+33
+2823.535187898983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2949.85546875
+20
+1.2016547967178687e-12
+30
+3377.849641023983
+11
+2685.99609375
+21
+1.1947210527742808e-12
+31
+3277.923859773983
+12
+2679.4453125
+22
+1.1962172517723108e-12
+32
+3299.486359773983
+13
+2679.4453125
+23
+1.1962172517723108e-12
+33
+3299.486359773983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2685.99609375
+20
+1.1947210527742808e-12
+30
+3277.923859773983
+11
+2949.85546875
+21
+1.2016547967178687e-12
+31
+3377.849641023983
+12
+2945.40234375
+22
+1.1991897275534513e-12
+32
+3342.324250398983
+13
+2945.40234375
+23
+1.1991897275534513e-12
+33
+3342.324250398983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2798.89453125
+20
+1.0957568402983342e-12
+30
+1851.6992503989832
+11
+2281.8515625
+21
+1.0894484099577273e-12
+31
+1760.7851878989832
+12
+2279.5078125
+22
+1.0912243331162585e-12
+32
+1786.3789378989832
+13
+2279.5078125
+23
+1.0912243331162585e-12
+33
+1786.3789378989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2281.8515625
+20
+1.0894484099577273e-12
+30
+1760.7851878989832
+11
+2798.89453125
+21
+1.0957568402983342e-12
+31
+1851.6992503989832
+12
+2802.17578125
+22
+1.0923302193321938e-12
+32
+1802.3164378989832
+13
+2802.17578125
+23
+1.0923302193321938e-12
+33
+1802.3164378989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2802.17578125
+20
+1.0923302193321938e-12
+30
+1802.3164378989832
+11
+2798.89453125
+21
+1.0957568402983342e-12
+31
+1851.6992503989832
+12
+2826.08203125
+22
+1.1157689084728e-12
+32
+2140.103547273983
+13
+2826.08203125
+23
+1.1157689084728e-12
+33
+2140.103547273983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2802.17578125
+20
+1.0923302193321938e-12
+30
+1802.3164378989832
+11
+2826.08203125
+21
+1.1157689084728e-12
+31
+2140.103547273983
+12
+2824.62890625
+22
+1.0451657985258156e-12
+32
+1122.6055003989832
+13
+2824.62890625
+23
+1.0451657985258156e-12
+33
+1122.6055003989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+2824.62890625
+20
+1.0451657985258156e-12
+30
+1122.6055003989832
+11
+2826.08203125
+21
+1.1157689084728e-12
+31
+2140.103547273983
+12
+2876.671875
+22
+1.093938633255076e-12
+32
+1825.4961253989832
+13
+2876.671875
+23
+1.093938633255076e-12
+33
+1825.4961253989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2876.671875
+20
+1.093938633255076e-12
+30
+1825.4961253989832
+11
+2826.08203125
+21
+1.1157689084728e-12
+31
+2140.103547273983
+12
+2837.82421875
+22
+1.1214869907304886e-12
+32
+2222.509797273983
+13
+2837.82421875
+23
+1.1214869907304886e-12
+33
+2222.509797273983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+2876.671875
+20
+1.093938633255076e-12
+30
+1825.4961253989832
+11
+2837.82421875
+21
+1.1214869907304886e-12
+31
+2222.509797273983
+12
+2889.24609375
+22
+1.1446630318948103e-12
+32
+2556.511750398983
+13
+2889.24609375
+23
+1.1446630318948103e-12
+33
+2556.511750398983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2876.671875
+20
+1.093938633255076e-12
+30
+1825.4961253989832
+11
+2889.24609375
+21
+1.1446630318948103e-12
+31
+2556.511750398983
+12
+2883.10546875
+22
+1.0966822068525506e-12
+32
+1865.0351878989832
+13
+2883.10546875
+23
+1.0966822068525506e-12
+33
+1865.0351878989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+2883.10546875
+20
+1.0966822068525506e-12
+30
+1865.0351878989832
+11
+2889.24609375
+21
+1.1446630318948103e-12
+31
+2556.511750398983
+12
+2920.72265625
+22
+1.1297990266858488e-12
+32
+2342.298859773983
+13
+2920.72265625
+23
+1.1297990266858488e-12
+33
+2342.298859773983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2920.72265625
+20
+1.1297990266858488e-12
+30
+2342.298859773983
+11
+2889.24609375
+21
+1.1446630318948103e-12
+31
+2556.511750398983
+12
+2918.21484375
+22
+1.133546842545588e-12
+32
+2396.310578523983
+13
+2918.21484375
+23
+1.133546842545588e-12
+33
+2396.310578523983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+2918.21484375
+20
+1.133546842545588e-12
+30
+2396.310578523983
+11
+2889.24609375
+21
+1.1446630318948103e-12
+31
+2556.511750398983
+12
+2908.51171875
+22
+1.1679411235886172e-12
+32
+2891.984406648983
+13
+2908.51171875
+23
+1.1679411235886172e-12
+33
+2891.984406648983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+2920.72265625
+20
+1.1297990266858488e-12
+30
+2342.298859773983
+11
+2918.21484375
+21
+1.133546842545588e-12
+31
+2396.310578523983
+12
+3410.0859375
+22
+1.1365957545798888e-12
+32
+2440.250031648983
+13
+3410.0859375
+23
+1.1365957545798888e-12
+33
+2440.250031648983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2920.72265625
+20
+1.1297990266858488e-12
+30
+2342.298859773983
+11
+3410.0859375
+21
+1.1365957545798888e-12
+31
+2440.250031648983
+12
+3870.99609375
+22
+1.138828262378308e-12
+32
+2472.423859773983
+13
+3870.99609375
+23
+1.138828262378308e-12
+33
+2472.423859773983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+3870.99609375
+20
+1.138828262378308e-12
+30
+2472.423859773983
+11
+3410.0859375
+21
+1.1365957545798888e-12
+31
+2440.250031648983
+12
+3481.88671875
+22
+1.1389148630268353e-12
+32
+2473.671906648983
+13
+3481.88671875
+23
+1.1389148630268353e-12
+33
+2473.671906648983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+3481.88671875
+20
+1.1389148630268353e-12
+30
+2473.671906648983
+11
+3410.0859375
+21
+1.1365957545798888e-12
+31
+2440.250031648983
+12
+3422.56640625
+22
+1.1409745761040146e-12
+32
+2503.355500398983
+13
+3422.56640625
+23
+1.1409745761040146e-12
+33
+2503.355500398983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3481.88671875
+20
+1.1389148630268353e-12
+30
+2473.671906648983
+11
+3422.56640625
+21
+1.1409745761040146e-12
+31
+2503.355500398983
+12
+3473.91796875
+22
+1.1430107077839424e-12
+32
+2532.699250398983
+13
+3473.91796875
+23
+1.1430107077839424e-12
+33
+2532.699250398983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3870.99609375
+20
+1.138828262378308e-12
+30
+2472.423859773983
+11
+3481.88671875
+21
+1.1389148630268353e-12
+31
+2473.671906648983
+12
+3925.3359375
+22
+1.1417576411230923e-12
+32
+2514.640656648983
+13
+3925.3359375
+23
+1.1417576411230923e-12
+33
+2514.640656648983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3870.99609375
+20
+1.138828262378308e-12
+30
+2472.423859773983
+11
+3925.3359375
+21
+1.1417576411230923e-12
+31
+2514.640656648983
+12
+3931.453125
+22
+1.1404521261821482e-12
+32
+2495.826203523983
+13
+3931.453125
+23
+1.1404521261821482e-12
+33
+2495.826203523983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2945.40234375
+20
+1.1991897275534513e-12
+30
+3342.324250398983
+11
+2918.21484375
+21
+1.133546842545588e-12
+31
+2396.310578523983
+12
+2908.51171875
+22
+1.1679411235886172e-12
+32
+2891.984406648983
+13
+2908.51171875
+23
+1.1679411235886172e-12
+33
+2891.984406648983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2918.21484375
+20
+1.133546842545588e-12
+30
+2396.310578523983
+11
+2945.40234375
+21
+1.1991897275534513e-12
+31
+3342.324250398983
+12
+2954.68359375
+22
+1.1782787202527234e-12
+32
+3040.964875398983
+13
+2954.68359375
+23
+1.1782787202527234e-12
+33
+3040.964875398983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+2954.68359375
+20
+1.1782787202527234e-12
+30
+3040.964875398983
+11
+2945.40234375
+21
+1.1991897275534513e-12
+31
+3342.324250398983
+12
+2949.85546875
+22
+1.2016547967178687e-12
+32
+3377.849641023983
+13
+2949.85546875
+23
+1.2016547967178687e-12
+33
+3377.849641023983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+2954.68359375
+20
+1.1782787202527234e-12
+30
+3040.964875398983
+11
+2949.85546875
+21
+1.2016547967178687e-12
+31
+3377.849641023983
+12
+2969.6015625
+22
+1.2111946916335686e-12
+32
+3515.334016023983
+13
+2969.6015625
+23
+1.2111946916335686e-12
+33
+3515.334016023983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2954.68359375
+20
+1.1782787202527234e-12
+30
+3040.964875398983
+11
+2969.6015625
+21
+1.2111946916335686e-12
+31
+3515.334016023983
+12
+2964.9375
+22
+1.1990437668359805e-12
+32
+3340.220734773983
+13
+2964.9375
+23
+1.1990437668359805e-12
+33
+3340.220734773983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+2964.9375
+20
+1.1990437668359805e-12
+30
+3340.220734773983
+11
+2969.6015625
+21
+1.2111946916335686e-12
+31
+3515.334016023983
+12
+2991.8203125
+22
+1.2023447558753841e-12
+32
+3387.793000398983
+13
+2991.8203125
+23
+1.2023447558753841e-12
+33
+3387.793000398983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+2964.9375
+20
+1.1990437668359805e-12
+30
+3340.220734773983
+11
+2991.8203125
+21
+1.2023447558753841e-12
+31
+3387.793000398983
+12
+3261.1875
+22
+1.2049911578531497e-12
+32
+3425.931672273983
+13
+3261.1875
+23
+1.2049911578531497e-12
+33
+3425.931672273983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+3261.1875
+20
+1.2049911578531497e-12
+30
+3425.931672273983
+11
+2991.8203125
+21
+1.2023447558753841e-12
+31
+3387.793000398983
+12
+3254.296875
+22
+1.2066369767509827e-12
+32
+3449.650422273983
+13
+3254.296875
+23
+1.2066369767509827e-12
+33
+3449.650422273983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2981.61328125
+20
+1.1866980922231596e-12
+30
+3162.300812898983
+11
+2954.68359375
+21
+1.1782787202527234e-12
+31
+3040.964875398983
+12
+2964.9375
+22
+1.1990437668359805e-12
+32
+3340.220734773983
+13
+2964.9375
+23
+1.1990437668359805e-12
+33
+3340.220734773983
+70
+2
+ 0
+3DFACE
+ 8
+ship7
+10
+3292.78125
+20
+1.1147658859379794e-12
+30
+2125.648469148983
+11
+3335.2734375
+21
+1.1005536217599532e-12
+31
+1920.8281566489832
+12
+3243.9609375
+22
+1.1116389113472597e-12
+32
+2080.584016023983
+13
+3243.9609375
+23
+1.1116389113472597e-12
+33
+2080.584016023983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3335.2734375
+20
+1.1005536217599532e-12
+30
+1920.8281566489832
+11
+3292.78125
+21
+1.1147658859379794e-12
+31
+2125.648469148983
+12
+3733.46484375
+22
+1.0558595556035832e-12
+32
+1276.7187816489832
+13
+3733.46484375
+23
+1.0558595556035832e-12
+33
+1276.7187816489832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3335.2734375
+20
+1.1005536217599532e-12
+30
+1920.8281566489832
+11
+3733.46484375
+21
+1.0558595556035832e-12
+31
+1276.7187816489832
+12
+3356.765625
+22
+1.097888923870527e-12
+32
+1882.4258128989832
+13
+3356.765625
+23
+1.097888923870527e-12
+33
+1882.4258128989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+3356.765625
+20
+1.097888923870527e-12
+30
+1882.4258128989832
+11
+3733.46484375
+21
+1.0558595556035832e-12
+31
+1276.7187816489832
+12
+3675.9609375
+22
+1.0549854176020168e-12
+32
+1264.1211253989832
+13
+3675.9609375
+23
+1.0549854176020168e-12
+33
+1264.1211253989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+2883.10546875
+20
+1.0966822068525506e-12
+30
+1865.0351878989832
+11
+3356.765625
+21
+1.097888923870527e-12
+31
+1882.4258128989832
+12
+2876.671875
+22
+1.093938633255076e-12
+32
+1825.4961253989832
+13
+2876.671875
+23
+1.093938633255076e-12
+33
+1825.4961253989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3356.765625
+20
+1.097888923870527e-12
+30
+1882.4258128989832
+11
+2883.10546875
+21
+1.0966822068525506e-12
+31
+1865.0351878989832
+12
+3335.2734375
+22
+1.1005536217599532e-12
+32
+1920.8281566489832
+13
+3335.2734375
+23
+1.1005536217599532e-12
+33
+1920.8281566489832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+3084.31640625
+20
+1.0679779543359968e-12
+30
+1451.3633128989832
+11
+3095.28515625
+21
+1.0498934620989386e-12
+31
+1190.7383128989832
+12
+3034.59375
+22
+1.0467921017845438e-12
+32
+1146.0430003989832
+13
+3034.59375
+23
+1.0467921017845438e-12
+33
+1146.0430003989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3095.28515625
+20
+1.0498934620989386e-12
+30
+1190.7383128989832
+11
+3084.31640625
+21
+1.0679779543359968e-12
+31
+1451.3633128989832
+12
+3110.73046875
+22
+1.0677779190351733e-12
+32
+1448.4805003989832
+13
+3110.73046875
+23
+1.0677779190351733e-12
+33
+1448.4805003989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3982.5
+20
+1.1309077589324867e-12
+30
+2358.277375398983
+11
+3927.0234375
+21
+1.1196212143169126e-12
+31
+2195.621125398983
+12
+3911.84765625
+22
+1.1309077589324867e-12
+32
+2358.277375398983
+13
+3911.84765625
+23
+1.1309077589324867e-12
+33
+2358.277375398983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3989.61328125
+20
+1.1624198240252348e-12
+30
+2812.414094148983
+11
+4020.3984375
+21
+1.1447475996642642e-12
+31
+2557.730500398983
+12
+3971.61328125
+22
+1.1625954647771775e-12
+32
+2814.945344148983
+13
+3971.61328125
+23
+1.1625954647771775e-12
+33
+2814.945344148983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4020.3984375
+20
+1.1447475996642642e-12
+30
+2557.730500398983
+11
+3989.61328125
+21
+1.1624198240252348e-12
+31
+2812.414094148983
+12
+4040.47265625
+22
+1.1751757336350699e-12
+32
+2996.246125398983
+13
+4040.47265625
+23
+1.1751757336350699e-12
+33
+2996.246125398983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4143.24609375
+20
+1.1585187290833604e-12
+30
+2756.193391023983
+11
+4074.28125
+21
+1.1479737787537664e-12
+31
+2604.224641023983
+12
+4065.73828125
+22
+1.161176515183937e-12
+32
+2794.496125398983
+13
+4065.73828125
+23
+1.161176515183937e-12
+33
+2794.496125398983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4074.28125
+20
+1.1479737787537664e-12
+30
+2604.224641023983
+11
+4143.24609375
+21
+1.1585187290833604e-12
+31
+2756.193391023983
+12
+4509.978515625
+22
+1.1487381412853687e-12
+32
+2615.240266023983
+13
+4509.978515625
+23
+1.1487381412853687e-12
+33
+2615.240266023983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4509.978515625
+20
+1.1487381412853687e-12
+30
+2615.240266023983
+11
+4143.24609375
+21
+1.1585187290833604e-12
+31
+2756.193391023983
+12
+4442.970703125
+22
+1.1539532892602955e-12
+32
+2690.398469148983
+13
+4442.970703125
+23
+1.1539532892602955e-12
+33
+2690.398469148983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4062.01171875
+20
+1.1877958469228012e-12
+30
+3178.121125398983
+11
+4040.47265625
+21
+1.1751757336350699e-12
+31
+2996.246125398983
+12
+3999.8203125
+22
+1.1883699319731322e-12
+32
+3186.394562898983
+13
+3999.8203125
+23
+1.1883699319731322e-12
+33
+3186.394562898983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4040.47265625
+20
+1.1751757336350699e-12
+30
+2996.246125398983
+11
+4062.01171875
+21
+1.1877958469228012e-12
+31
+3178.121125398983
+12
+4061.35546875
+22
+1.1326096852927459e-12
+32
+2382.804719148983
+13
+4061.35546875
+23
+1.1326096852927459e-12
+33
+2382.804719148983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4061.35546875
+20
+1.1326096852927459e-12
+30
+2382.804719148983
+11
+4062.01171875
+21
+1.1877958469228012e-12
+31
+3178.121125398983
+12
+4065.73828125
+22
+1.161176515183937e-12
+32
+2794.496125398983
+13
+4065.73828125
+23
+1.161176515183937e-12
+33
+2794.496125398983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4061.35546875
+20
+1.1326096852927459e-12
+30
+2382.804719148983
+11
+4065.73828125
+21
+1.161176515183937e-12
+31
+2794.496125398983
+12
+4074.28125
+22
+1.1479737787537664e-12
+32
+2604.224641023983
+13
+4074.28125
+23
+1.1479737787537664e-12
+33
+2604.224641023983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4061.35546875
+20
+1.1326096852927459e-12
+30
+2382.804719148983
+11
+4074.28125
+21
+1.1479737787537664e-12
+31
+2604.224641023983
+12
+4148.02734375
+22
+1.1334110462234842e-12
+32
+2394.353547273983
+13
+4148.02734375
+23
+1.1334110462234842e-12
+33
+2394.353547273983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4148.02734375
+20
+1.1334110462234842e-12
+30
+2394.353547273983
+11
+4074.28125
+21
+1.1479737787537664e-12
+31
+2604.224641023983
+12
+4130.30859375
+22
+1.1413400877614138e-12
+32
+2508.623078523983
+13
+4130.30859375
+23
+1.1413400877614138e-12
+33
+2508.623078523983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4020.3984375
+20
+1.1447475996642642e-12
+30
+2557.730500398983
+11
+3982.5
+21
+1.1309077589324867e-12
+31
+2358.277375398983
+12
+3957.515625
+22
+1.1426228344567357e-12
+32
+2527.109406648983
+13
+3957.515625
+23
+1.1426228344567357e-12
+33
+2527.109406648983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3982.5
+20
+1.1309077589324867e-12
+30
+2358.277375398983
+11
+4020.3984375
+21
+1.1447475996642642e-12
+31
+2557.730500398983
+12
+3998.90625
+22
+1.0497731156577927e-12
+32
+1189.0039378989832
+13
+3998.90625
+23
+1.0497731156577927e-12
+33
+1189.0039378989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+3998.90625
+20
+1.0497731156577927e-12
+30
+1189.0039378989832
+11
+4020.3984375
+21
+1.1447475996642642e-12
+31
+2557.730500398983
+12
+4061.35546875
+22
+1.1326096852927459e-12
+32
+2382.804719148983
+13
+4061.35546875
+23
+1.1326096852927459e-12
+33
+2382.804719148983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4061.35546875
+20
+1.1326096852927459e-12
+30
+2382.804719148983
+11
+4020.3984375
+21
+1.1447475996642642e-12
+31
+2557.730500398983
+12
+4040.47265625
+22
+1.1751757336350699e-12
+32
+2996.246125398983
+13
+4040.47265625
+23
+1.1751757336350699e-12
+33
+2996.246125398983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+3927.0234375
+20
+1.1196212143169126e-12
+30
+2195.621125398983
+11
+3998.90625
+21
+1.0497731156577927e-12
+31
+1189.0039378989832
+12
+3892.72265625
+22
+1.0492022832139791e-12
+32
+1180.7773753989832
+13
+3892.72265625
+23
+1.0492022832139791e-12
+33
+1180.7773753989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3998.90625
+20
+1.0497731156577927e-12
+30
+1189.0039378989832
+11
+3927.0234375
+21
+1.1196212143169126e-12
+31
+2195.621125398983
+12
+3982.5
+22
+1.1309077589324867e-12
+32
+2358.277375398983
+13
+3982.5
+23
+1.1309077589324867e-12
+33
+2358.277375398983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4078.2421875
+20
+1.2153909606169022e-12
+30
+3575.808625398983
+11
+3778.67578125
+21
+1.2093057403985558e-12
+31
+3488.111359773983
+12
+3774.515625
+22
+1.2112142072726734e-12
+32
+3515.615266023983
+13
+3774.515625
+23
+1.2112142072726734e-12
+33
+3515.615266023983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3778.67578125
+20
+1.2093057403985558e-12
+30
+3488.111359773983
+11
+4078.2421875
+21
+1.2153909606169022e-12
+31
+3575.808625398983
+12
+4062.01171875
+22
+1.2119322201614019e-12
+32
+3525.962922273983
+13
+4062.01171875
+23
+1.2119322201614019e-12
+33
+3525.962922273983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4062.01171875
+20
+1.2119322201614019e-12
+30
+3525.962922273983
+11
+4078.2421875
+21
+1.2153909606169022e-12
+31
+3575.808625398983
+12
+4062.01171875
+22
+1.1877958469228012e-12
+32
+3178.121125398983
+13
+4062.01171875
+23
+1.1877958469228012e-12
+33
+3178.121125398983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4062.01171875
+20
+1.1877958469228012e-12
+30
+3178.121125398983
+11
+4078.2421875
+21
+1.2153909606169022e-12
+31
+3575.808625398983
+12
+4065.73828125
+22
+1.161176515183937e-12
+32
+2794.496125398983
+13
+4065.73828125
+23
+1.161176515183937e-12
+33
+2794.496125398983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4065.73828125
+20
+1.161176515183937e-12
+30
+2794.496125398983
+11
+4078.2421875
+21
+1.2153909606169022e-12
+31
+3575.808625398983
+12
+4083.08203125
+22
+1.1667360328738996e-12
+32
+2874.617219148983
+13
+4083.08203125
+23
+1.1667360328738996e-12
+33
+2874.617219148983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4083.08203125
+20
+1.1667360328738996e-12
+30
+2874.617219148983
+11
+4078.2421875
+21
+1.2153909606169022e-12
+31
+3575.808625398983
+12
+4103.49609375
+22
+1.2272097129738951e-12
+32
+3746.134797273983
+13
+4103.49609375
+23
+1.2272097129738951e-12
+33
+3746.134797273983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4083.08203125
+20
+1.1667360328738996e-12
+30
+2874.617219148983
+11
+4103.49609375
+21
+1.2272097129738951e-12
+31
+3746.134797273983
+12
+4102.11328125
+22
+1.2123607510700768e-12
+32
+3532.138703523983
+13
+4102.11328125
+23
+1.2123607510700768e-12
+33
+3532.138703523983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4102.11328125
+20
+1.2123607510700768e-12
+30
+3532.138703523983
+11
+4103.49609375
+21
+1.2272097129738951e-12
+31
+3746.134797273983
+12
+4117.58203125
+22
+1.2154881322366112e-12
+32
+3577.209016023983
+13
+4117.58203125
+23
+1.2154881322366112e-12
+33
+3577.209016023983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4102.11328125
+20
+1.2123607510700768e-12
+30
+3532.138703523983
+11
+4117.58203125
+21
+1.2154881322366112e-12
+31
+3577.209016023983
+12
+4423.095703125
+22
+1.216635489185644e-12
+32
+3593.744172273983
+13
+4423.095703125
+23
+1.216635489185644e-12
+33
+3593.744172273983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4117.58203125
+20
+1.2154881322366112e-12
+30
+3577.209016023983
+11
+4103.49609375
+21
+1.2272097129738951e-12
+31
+3746.134797273983
+12
+4117.58203125
+22
+1.2270991243523016e-12
+32
+3744.541047273983
+13
+4117.58203125
+23
+1.2270991243523016e-12
+33
+3744.541047273983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4423.095703125
+20
+1.216635489185644e-12
+30
+3593.744172273983
+11
+4117.58203125
+21
+1.2154881322366112e-12
+31
+3577.209016023983
+12
+4419.064453125
+22
+1.2181422591548557e-12
+32
+3615.459016023983
+13
+4419.064453125
+23
+1.2181422591548557e-12
+33
+3615.459016023983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4083.08203125
+20
+1.1667360328738996e-12
+30
+2874.617219148983
+11
+4104.85546875
+21
+1.1874486311770627e-12
+31
+3173.117219148983
+12
+4168.08984375
+22
+1.1691161276930484e-12
+32
+2908.918000398983
+13
+4168.08984375
+23
+1.1691161276930484e-12
+33
+2908.918000398983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4104.85546875
+20
+1.1874486311770627e-12
+30
+3173.117219148983
+11
+4083.08203125
+21
+1.1667360328738996e-12
+31
+2874.617219148983
+12
+4102.11328125
+22
+1.2123607510700768e-12
+32
+3532.138703523983
+13
+4102.11328125
+23
+1.2123607510700768e-12
+33
+3532.138703523983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4168.08984375
+20
+1.1691161276930484e-12
+30
+2908.918000398983
+11
+4104.85546875
+21
+1.1874486311770627e-12
+31
+3173.117219148983
+12
+4161.796875
+22
+1.1752737184064083e-12
+32
+2997.658234773983
+13
+4161.796875
+23
+1.1752737184064083e-12
+33
+2997.658234773983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+3998.90625
+20
+1.0497731156577927e-12
+30
+1189.0039378989832
+11
+4084.44140625
+21
+1.0542234945253026e-12
+31
+1253.1406566489832
+12
+4275.556640625
+22
+1.049112836534749e-12
+32
+1179.4883128989832
+13
+4275.556640625
+23
+1.049112836534749e-12
+33
+1179.4883128989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4084.44140625
+20
+1.0542234945253026e-12
+30
+1253.1406566489832
+11
+3998.90625
+21
+1.0497731156577927e-12
+31
+1189.0039378989832
+12
+4051.51171875
+22
+1.064320398307117e-12
+32
+1398.6523753989832
+13
+4051.51171875
+23
+1.064320398307117e-12
+33
+1398.6523753989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4084.44140625
+20
+1.0542234945253026e-12
+30
+1253.1406566489832
+11
+4051.51171875
+21
+1.064320398307117e-12
+31
+1398.6523753989832
+12
+4071.1171875
+22
+1.064206557079006e-12
+32
+1397.0117503989832
+13
+4071.1171875
+23
+1.064206557079006e-12
+33
+1397.0117503989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4275.556640625
+20
+1.049112836534749e-12
+30
+1179.4883128989832
+11
+4084.44140625
+21
+1.0542234945253026e-12
+31
+1253.1406566489832
+12
+4153.39453125
+22
+1.0586429736308967e-12
+32
+1316.8320628989832
+13
+4153.39453125
+23
+1.0586429736308967e-12
+33
+1316.8320628989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4275.556640625
+20
+1.049112836534749e-12
+30
+1179.4883128989832
+11
+4153.39453125
+21
+1.0586429736308967e-12
+31
+1316.8320628989832
+12
+4238.572265625
+22
+1.0566279838933323e-12
+32
+1287.7930003989832
+13
+4238.572265625
+23
+1.0566279838933323e-12
+33
+1287.7930003989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4478.806640625
+20
+1.0938443076660698e-12
+30
+1824.1367503989832
+11
+4471.166015625
+21
+1.0775178492516968e-12
+31
+1588.8476878989832
+12
+4436.736328125
+22
+1.0897078053274944e-12
+32
+1764.5234691489832
+13
+4436.736328125
+23
+1.0897078053274944e-12
+33
+1764.5234691489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4471.166015625
+20
+1.0775178492516968e-12
+30
+1588.8476878989832
+11
+4441.775390625
+21
+1.048029718564436e-12
+31
+1163.8789378989832
+12
+4440.626953125
+22
+1.0591324909117739e-12
+32
+1323.8867503989832
+13
+4440.626953125
+23
+1.0591324909117739e-12
+33
+1323.8867503989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4441.775390625
+20
+1.048029718564436e-12
+30
+1163.8789378989832
+11
+4471.166015625
+21
+1.0775178492516968e-12
+31
+1588.8476878989832
+12
+4882.189453125
+22
+1.0872431427388918e-12
+32
+1729.0039378989832
+13
+4882.189453125
+23
+1.0872431427388918e-12
+33
+1729.0039378989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4882.189453125
+20
+1.0872431427388918e-12
+30
+1729.0039378989832
+11
+4471.166015625
+21
+1.0775178492516968e-12
+31
+1588.8476878989832
+12
+4478.806640625
+22
+1.0938443076660698e-12
+32
+1824.1367503989832
+13
+4478.806640625
+23
+1.0938443076660698e-12
+33
+1824.1367503989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+4882.189453125
+20
+1.0872431427388918e-12
+30
+1729.0039378989832
+11
+4478.806640625
+21
+1.0938443076660698e-12
+31
+1824.1367503989832
+12
+4904.759765625
+22
+1.0934946524654432e-12
+32
+1819.0976878989832
+13
+4904.759765625
+23
+1.0934946524654432e-12
+33
+1819.0976878989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4882.189453125
+20
+1.0872431427388918e-12
+30
+1729.0039378989832
+11
+4904.759765625
+21
+1.0934946524654432e-12
+31
+1819.0976878989832
+12
+4934.619140625
+22
+1.089737891937781e-12
+32
+1764.9570628989832
+13
+4934.619140625
+23
+1.089737891937781e-12
+33
+1764.9570628989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4441.775390625
+20
+1.048029718564436e-12
+30
+1163.8789378989832
+11
+4858.376953125
+21
+1.0729642001272577e-12
+31
+1523.2226878989832
+12
+4780.728515625
+22
+1.009188717836229e-12
+32
+604.1211253989832
+13
+4780.728515625
+23
+1.009188717836229e-12
+33
+604.1211253989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+4858.376953125
+20
+1.0729642001272577e-12
+30
+1523.2226878989832
+11
+4441.775390625
+21
+1.048029718564436e-12
+31
+1163.8789378989832
+12
+4882.189453125
+22
+1.0872431427388918e-12
+32
+1729.0039378989832
+13
+4882.189453125
+23
+1.0872431427388918e-12
+33
+1729.0039378989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4886.056640625
+20
+1.0703897620686909e-12
+30
+1486.1211253989832
+11
+4780.728515625
+21
+1.009188717836229e-12
+31
+604.1211253989832
+12
+4858.376953125
+22
+1.0729642001272577e-12
+32
+1523.2226878989832
+13
+4858.376953125
+23
+1.0729642001272577e-12
+33
+1523.2226878989832
+70
+2
+ 0
+3DFACE
+ 8
+ship7
+10
+3660.609375
+20
+1.0492917298932092e-12
+30
+1182.0664378989832
+11
+4780.728515625
+21
+1.009188717836229e-12
+31
+604.1211253989832
+12
+3198.515625
+22
+9.133213933407158e-13
+32
+-777.4726246010168
+13
+3198.515625
+23
+9.133213933407158e-13
+33
+-777.4726246010168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4780.728515625
+20
+1.009188717836229e-12
+30
+604.1211253989832
+11
+3660.609375
+21
+1.0492917298932092e-12
+31
+1182.0664378989832
+12
+3892.72265625
+22
+1.0492022832139791e-12
+32
+1180.7773753989832
+13
+3892.72265625
+23
+1.0492022832139791e-12
+33
+1180.7773753989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4780.728515625
+20
+1.009188717836229e-12
+30
+604.1211253989832
+11
+3892.72265625
+21
+1.0492022832139791e-12
+31
+1180.7773753989832
+12
+3998.90625
+22
+1.0497731156577927e-12
+32
+1189.0039378989832
+13
+3998.90625
+23
+1.0497731156577927e-12
+33
+1189.0039378989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4780.728515625
+20
+1.009188717836229e-12
+30
+604.1211253989832
+11
+3998.90625
+21
+1.0497731156577927e-12
+31
+1189.0039378989832
+12
+4275.556640625
+22
+1.049112836534749e-12
+32
+1179.4883128989832
+13
+4275.556640625
+23
+1.049112836534749e-12
+33
+1179.4883128989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+4780.728515625
+20
+1.009188717836229e-12
+30
+604.1211253989832
+11
+4275.556640625
+21
+1.049112836534749e-12
+31
+1179.4883128989832
+12
+4441.775390625
+22
+1.048029718564436e-12
+32
+1163.8789378989832
+13
+4441.775390625
+23
+1.048029718564436e-12
+33
+1163.8789378989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5099.056640625
+20
+9.979013600690256e-13
+30
+441.45315664898317
+11
+5925.650390625
+21
+9.11731681905309e-13
+31
+-800.3827808510168
+12
+5088.134765625
+22
+9.979834883835914e-13
+32
+442.63675039898317
+13
+5088.134765625
+23
+9.979834883835914e-13
+33
+442.63675039898317
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5925.650390625
+20
+9.11731681905309e-13
+30
+-800.3827808510168
+11
+5099.056640625
+21
+9.979013600690256e-13
+31
+441.45315664898317
+12
+5606.642578125
+22
+1.0167916855707837e-12
+32
+713.6914378989832
+13
+5606.642578125
+23
+1.0167916855707837e-12
+33
+713.6914378989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+5925.650390625
+20
+9.11731681905309e-13
+30
+-800.3827808510168
+11
+5606.642578125
+21
+1.0167916855707837e-12
+31
+713.6914378989832
+12
+5688.978515625
+22
+1.0167916855707837e-12
+32
+713.6914378989832
+13
+5688.978515625
+23
+1.0167916855707837e-12
+33
+713.6914378989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+5925.650390625
+20
+9.11731681905309e-13
+30
+-800.3827808510168
+11
+5688.978515625
+21
+1.0167916855707837e-12
+31
+713.6914378989832
+12
+5832.580078125
+22
+1.0192766769501205e-12
+32
+749.5039378989832
+13
+5832.580078125
+23
+1.0192766769501205e-12
+33
+749.5039378989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+5925.650390625
+20
+9.11731681905309e-13
+30
+-800.3827808510168
+11
+5832.580078125
+21
+1.0192766769501205e-12
+31
+749.5039378989832
+12
+5934.041015625
+22
+1.0207923915872552e-12
+32
+771.3476878989832
+13
+5934.041015625
+23
+1.0207923915872552e-12
+33
+771.3476878989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+5925.650390625
+20
+9.11731681905309e-13
+30
+-800.3827808510168
+11
+5934.041015625
+21
+1.0207923915872552e-12
+31
+771.3476878989832
+12
+6815.431640625
+22
+9.142548914112258e-13
+32
+-764.0194996010168
+13
+6815.431640625
+23
+9.142548914112258e-13
+33
+-764.0194996010168
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6815.431640625
+20
+9.142548914112258e-13
+30
+-764.0194996010168
+11
+5934.041015625
+21
+1.0207923915872552e-12
+31
+771.3476878989832
+12
+6579.041015625
+22
+1.0088878517333644e-12
+32
+599.7851878989832
+13
+6579.041015625
+23
+1.0088878517333644e-12
+33
+599.7851878989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6815.431640625
+20
+9.142548914112258e-13
+30
+-764.0194996010168
+11
+6579.041015625
+21
+1.0088878517333644e-12
+31
+599.7851878989832
+12
+6749.056640625
+22
+1.0055897087246635e-12
+32
+552.2539378989832
+13
+6749.056640625
+23
+1.0055897087246635e-12
+33
+552.2539378989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6815.431640625
+20
+9.142548914112258e-13
+30
+-764.0194996010168
+11
+6749.056640625
+21
+1.0055897087246635e-12
+31
+552.2539378989832
+12
+6925.587890625
+22
+1.0043049291502681e-12
+32
+533.7383128989832
+13
+6925.587890625
+23
+1.0043049291502681e-12
+33
+533.7383128989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5758.611328125
+20
+1.0364504393622909e-12
+30
+997.0039378989832
+11
+5711.173828125
+21
+1.0288905686640926e-12
+31
+888.0547191489832
+12
+5686.775390625
+22
+1.0322513243482545e-12
+32
+936.4883128989832
+13
+5686.775390625
+23
+1.0322513243482545e-12
+33
+936.4883128989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5711.173828125
+20
+1.0288905686640926e-12
+30
+888.0547191489832
+11
+5688.978515625
+21
+1.0167916855707837e-12
+31
+713.6914378989832
+12
+5661.158203125
+22
+1.0261526871280235e-12
+32
+848.5976878989832
+13
+5661.158203125
+23
+1.0261526871280235e-12
+33
+848.5976878989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5688.978515625
+20
+1.0167916855707837e-12
+30
+713.6914378989832
+11
+5711.173828125
+21
+1.0288905686640926e-12
+31
+888.0547191489832
+12
+5832.580078125
+22
+1.0192766769501205e-12
+32
+749.5039378989832
+13
+5832.580078125
+23
+1.0192766769501205e-12
+33
+749.5039378989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+5832.580078125
+20
+1.0192766769501205e-12
+30
+749.5039378989832
+11
+5711.173828125
+21
+1.0288905686640926e-12
+31
+888.0547191489832
+12
+5758.611328125
+22
+1.0364504393622909e-12
+32
+997.0039378989832
+13
+5758.611328125
+23
+1.0364504393622909e-12
+33
+997.0039378989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+5832.580078125
+20
+1.0192766769501205e-12
+30
+749.5039378989832
+11
+5758.611328125
+21
+1.0364504393622909e-12
+31
+997.0039378989832
+12
+5821.939453125
+22
+1.034409428772587e-12
+32
+967.5898753989832
+13
+5821.939453125
+23
+1.034409428772587e-12
+33
+967.5898753989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6317.853515625
+20
+1.1671987161510078e-12
+30
+2881.285187898983
+11
+6124.869140625
+21
+1.1609394814839774e-12
+31
+2791.080109773983
+12
+5958.509765625
+22
+1.1619616130820881e-12
+32
+2805.810578523983
+13
+5958.509765625
+23
+1.1619616130820881e-12
+33
+2805.810578523983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6124.869140625
+20
+1.1609394814839774e-12
+30
+2791.080109773983
+11
+6317.853515625
+21
+1.1671987161510078e-12
+31
+2881.285187898983
+12
+6311.455078125
+22
+1.1631707695549526e-12
+32
+2823.236359773983
+13
+6311.455078125
+23
+1.1631707695549526e-12
+33
+2823.236359773983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6373.072265625
+20
+1.1739714560719816e-12
+30
+2978.890656648983
+11
+6336.955078125
+21
+1.102826380564026e-12
+31
+1953.5820628989832
+12
+6317.853515625
+22
+1.1671987161510078e-12
+32
+2881.285187898983
+13
+6317.853515625
+23
+1.1671987161510078e-12
+33
+2881.285187898983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6336.955078125
+20
+1.102826380564026e-12
+30
+1953.5820628989832
+11
+6373.072265625
+21
+1.1739714560719816e-12
+31
+2978.890656648983
+12
+6376.236328125
+22
+1.1636838682330813e-12
+32
+2830.630891023983
+13
+6376.236328125
+23
+1.1636838682330813e-12
+33
+2830.630891023983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6376.236328125
+20
+1.1636838682330813e-12
+30
+2830.630891023983
+11
+6373.072265625
+21
+1.1739714560719816e-12
+31
+2978.890656648983
+12
+6377.525390625
+22
+1.1673906199355377e-12
+32
+2884.050812898983
+13
+6377.525390625
+23
+1.1673906199355377e-12
+33
+2884.050812898983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6376.236328125
+20
+1.1636838682330813e-12
+30
+2830.630891023983
+11
+6377.525390625
+21
+1.1673906199355377e-12
+31
+2884.050812898983
+12
+6731.806640625
+22
+1.1660253383498353e-12
+32
+2864.375031648983
+13
+6731.806640625
+23
+1.1660253383498353e-12
+33
+2864.375031648983
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6731.806640625
+20
+1.1660253383498353e-12
+30
+2864.375031648983
+11
+6377.525390625
+21
+1.1673906199355377e-12
+31
+2884.050812898983
+12
+6713.431640625
+22
+1.1694304107977976e-12
+32
+2913.447297273983
+13
+6713.431640625
+23
+1.1694304107977976e-12
+33
+2913.447297273983
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6266.314453125
+20
+1.0984825245599628e-12
+30
+1890.9805003989832
+11
+6125.291015625
+21
+1.093083197740985e-12
+31
+1813.1680003989832
+12
+6119.197265625
+22
+1.0960105436066958e-12
+32
+1855.3555003989832
+13
+6119.197265625
+23
+1.0960105436066958e-12
+33
+1855.3555003989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6125.291015625
+20
+1.093083197740985e-12
+30
+1813.1680003989832
+11
+6266.314453125
+21
+1.0984825245599628e-12
+31
+1890.9805003989832
+12
+6206.830078125
+22
+1.09186184399368e-12
+32
+1795.5664378989832
+13
+6206.830078125
+23
+1.09186184399368e-12
+33
+1795.5664378989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6206.830078125
+20
+1.09186184399368e-12
+30
+1795.5664378989832
+11
+6266.314453125
+21
+1.0984825245599628e-12
+31
+1890.9805003989832
+12
+6227.408203125
+22
+1.0740782178594865e-12
+32
+1539.2773753989832
+13
+6227.408203125
+23
+1.0740782178594865e-12
+33
+1539.2773753989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6227.408203125
+20
+1.0740782178594865e-12
+30
+1539.2773753989832
+11
+6266.314453125
+21
+1.0984825245599628e-12
+31
+1890.9805003989832
+12
+6260.033203125
+22
+1.0247930976037267e-12
+32
+829.0039378989832
+13
+6260.033203125
+23
+1.0247930976037267e-12
+33
+829.0039378989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+6260.033203125
+20
+1.0247930976037267e-12
+30
+829.0039378989832
+11
+6266.314453125
+21
+1.0984825245599628e-12
+31
+1890.9805003989832
+12
+6305.009765625
+22
+1.0929205674151121e-12
+32
+1810.8242503989832
+13
+6305.009765625
+23
+1.0929205674151121e-12
+33
+1810.8242503989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6305.009765625
+20
+1.0929205674151121e-12
+30
+1810.8242503989832
+11
+6266.314453125
+21
+1.0984825245599628e-12
+31
+1890.9805003989832
+12
+6311.455078125
+22
+1.1631707695549526e-12
+32
+2823.236359773983
+13
+6311.455078125
+23
+1.1631707695549526e-12
+33
+2823.236359773983
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6305.009765625
+20
+1.0929205674151121e-12
+30
+1810.8242503989832
+11
+6311.455078125
+21
+1.1631707695549526e-12
+31
+2823.236359773983
+12
+6336.955078125
+22
+1.102826380564026e-12
+32
+1953.5820628989832
+13
+6336.955078125
+23
+1.102826380564026e-12
+33
+1953.5820628989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+6305.009765625
+20
+1.0929205674151121e-12
+30
+1810.8242503989832
+11
+6336.955078125
+21
+1.102826380564026e-12
+31
+1953.5820628989832
+12
+6405.884765625
+22
+1.0975522790959702e-12
+32
+1877.5742503989832
+13
+6405.884765625
+23
+1.0975522790959702e-12
+33
+1877.5742503989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6336.955078125
+20
+1.102826380564026e-12
+30
+1953.5820628989832
+11
+6311.455078125
+21
+1.1631707695549526e-12
+31
+2823.236359773983
+12
+6317.853515625
+22
+1.1671987161510078e-12
+32
+2881.285187898983
+13
+6317.853515625
+23
+1.1671987161510078e-12
+33
+2881.285187898983
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+6405.884765625
+20
+1.0975522790959702e-12
+30
+1877.5742503989832
+11
+6336.955078125
+21
+1.102826380564026e-12
+31
+1953.5820628989832
+12
+6389.712890625
+22
+1.1022384719359957e-12
+32
+1945.1094066489832
+13
+6389.712890625
+23
+1.1022384719359957e-12
+33
+1945.1094066489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6006.720703125
+20
+1.0249508490198234e-12
+30
+831.2773753989832
+11
+5934.041015625
+21
+1.0207923915872552e-12
+31
+771.3476878989832
+12
+5923.306640625
+22
+1.0249508490198234e-12
+32
+831.2773753989832
+13
+5923.306640625
+23
+1.0249508490198234e-12
+33
+831.2773753989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5934.041015625
+20
+1.0207923915872552e-12
+30
+771.3476878989832
+11
+6006.720703125
+21
+1.0249508490198234e-12
+31
+831.2773753989832
+12
+6143.150390625
+22
+1.0208314228654647e-12
+32
+771.9101878989832
+13
+6143.150390625
+23
+1.0208314228654647e-12
+33
+771.9101878989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+5934.041015625
+20
+1.0207923915872552e-12
+30
+771.3476878989832
+11
+6143.150390625
+21
+1.0208314228654647e-12
+31
+771.9101878989832
+12
+6579.041015625
+22
+1.0088878517333644e-12
+32
+599.7851878989832
+13
+6579.041015625
+23
+1.0088878517333644e-12
+33
+599.7851878989832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+6143.150390625
+20
+1.0208314228654647e-12
+30
+771.9101878989832
+11
+6006.720703125
+21
+1.0249508490198234e-12
+31
+831.2773753989832
+12
+6034.400390625
+22
+1.0285213978243612e-12
+32
+882.7344066489832
+13
+6034.400390625
+23
+1.0285213978243612e-12
+33
+882.7344066489832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6143.150390625
+20
+1.0208314228654647e-12
+30
+771.9101878989832
+11
+6034.400390625
+21
+1.0285213978243612e-12
+31
+882.7344066489832
+12
+6134.923828125
+22
+1.027571636721264e-12
+32
+869.0469066489832
+13
+6134.923828125
+23
+1.027571636721264e-12
+33
+869.0469066489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6579.041015625
+20
+1.0088878517333644e-12
+30
+599.7851878989832
+11
+6143.150390625
+21
+1.0208314228654647e-12
+31
+771.9101878989832
+12
+6193.142578125
+22
+1.024784966087433e-12
+32
+828.8867503989832
+13
+6193.142578125
+23
+1.024784966087433e-12
+33
+828.8867503989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6579.041015625
+20
+1.0088878517333644e-12
+30
+599.7851878989832
+11
+6193.142578125
+21
+1.024784966087433e-12
+31
+828.8867503989832
+12
+6260.033203125
+22
+1.0247930976037267e-12
+32
+829.0039378989832
+13
+6260.033203125
+23
+1.0247930976037267e-12
+33
+829.0039378989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+6260.033203125
+20
+1.0247930976037267e-12
+30
+829.0039378989832
+11
+6193.142578125
+21
+1.024784966087433e-12
+31
+828.8867503989832
+12
+6227.408203125
+22
+1.0740782178594865e-12
+32
+1539.2773753989832
+13
+6227.408203125
+23
+1.0740782178594865e-12
+33
+1539.2773753989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6579.041015625
+20
+1.0088878517333644e-12
+30
+599.7851878989832
+11
+6260.033203125
+21
+1.0247930976037267e-12
+31
+829.0039378989832
+12
+6361.728515625
+22
+1.0251468185625001e-12
+32
+834.1015941489832
+13
+6361.728515625
+23
+1.0251468185625001e-12
+33
+834.1015941489832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+6579.041015625
+20
+1.0088878517333644e-12
+30
+599.7851878989832
+11
+6361.728515625
+21
+1.0251468185625001e-12
+31
+834.1015941489832
+12
+6579.041015625
+22
+1.0206484637488578e-12
+32
+769.2734691489832
+13
+6579.041015625
+23
+1.0206484637488578e-12
+33
+769.2734691489832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6785.994140625
+20
+1.0217527236615342e-12
+30
+785.1875316489832
+11
+6749.056640625
+21
+1.0055897087246635e-12
+31
+552.2539378989832
+12
+6664.892578125
+22
+1.0201142231283655e-12
+32
+761.5742503989832
+13
+6664.892578125
+23
+1.0201142231283655e-12
+33
+761.5742503989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6749.056640625
+20
+1.0055897087246635e-12
+30
+552.2539378989832
+11
+6785.994140625
+21
+1.0217527236615342e-12
+31
+785.1875316489832
+12
+6925.587890625
+22
+1.0043049291502681e-12
+32
+533.7383128989832
+13
+6925.587890625
+23
+1.0043049291502681e-12
+33
+533.7383128989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+6925.587890625
+20
+1.0043049291502681e-12
+30
+533.7383128989832
+11
+7166.361328125
+21
+9.17997828361189e-13
+31
+-710.0780933510168
+12
+6815.431640625
+22
+9.142548914112258e-13
+32
+-764.0194996010168
+13
+6815.431640625
+23
+9.142548914112258e-13
+33
+-764.0194996010168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7166.361328125
+20
+9.17997828361189e-13
+30
+-710.0780933510168
+11
+6925.587890625
+21
+1.0043049291502681e-12
+31
+533.7383128989832
+12
+7014.369140625
+22
+1.00692409054845e-12
+32
+571.4844066489832
+13
+7014.369140625
+23
+1.00692409054845e-12
+33
+571.4844066489832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7166.361328125
+20
+9.17997828361189e-13
+30
+-710.0780933510168
+11
+7014.369140625
+21
+1.00692409054845e-12
+31
+571.4844066489832
+12
+7038.041015625
+22
+9.997211934155426e-13
+32
+467.67971914898317
+13
+7038.041015625
+23
+9.997211934155426e-13
+33
+467.67971914898317
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7166.361328125
+20
+9.17997828361189e-13
+30
+-710.0780933510168
+11
+7038.041015625
+21
+9.997211934155426e-13
+31
+467.67971914898317
+12
+7177.728515625
+22
+9.982062919300372e-13
+32
+445.84768789898317
+13
+7177.728515625
+23
+9.982062919300372e-13
+33
+445.84768789898317
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7166.361328125
+20
+9.17997828361189e-13
+30
+-710.0780933510168
+11
+7177.728515625
+21
+9.982062919300372e-13
+31
+445.84768789898317
+12
+7452.650390625
+22
+9.18484906187178e-13
+32
+-703.0585621010168
+13
+7452.650390625
+23
+9.18484906187178e-13
+33
+-703.0585621010168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7341.322265625
+20
+1.001017357112749e-12
+30
+486.35940664898317
+11
+7452.650390625
+21
+9.18484906187178e-13
+31
+-703.0585621010168
+12
+7177.728515625
+22
+9.982062919300372e-13
+32
+445.84768789898317
+13
+7177.728515625
+23
+9.982062919300372e-13
+33
+445.84768789898317
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7452.650390625
+20
+9.18484906187178e-13
+30
+-703.0585621010168
+11
+7341.322265625
+21
+1.001017357112749e-12
+31
+486.35940664898317
+12
+7395.814453125
+22
+1.0020720147760342e-12
+32
+501.55862539898317
+13
+7395.814453125
+23
+1.0020720147760342e-12
+33
+501.55862539898317
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7452.650390625
+20
+9.18484906187178e-13
+30
+-703.0585621010168
+11
+7395.814453125
+21
+1.0020720147760342e-12
+31
+501.55862539898317
+12
+7802.361328125
+22
+9.151265899579042e-13
+32
+-751.4569996010168
+13
+7802.361328125
+23
+9.151265899579042e-13
+33
+-751.4569996010168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7342.447265625
+20
+1.0017735881280576e-12
+30
+497.25784414898317
+11
+7341.322265625
+21
+1.001017357112749e-12
+31
+486.35940664898317
+12
+7177.728515625
+22
+9.982062919300372e-13
+32
+445.84768789898317
+13
+7177.728515625
+23
+9.982062919300372e-13
+33
+445.84768789898317
+70
+2
+ 0
+3DFACE
+ 8
+ship7
+10
+7203.908203125
+20
+1.045501630148743e-12
+30
+1127.4453441489832
+11
+7177.728515625
+21
+9.982062919300372e-13
+31
+445.84768789898317
+12
+7177.728515625
+22
+1.0452731345408917e-12
+32
+1124.1523753989832
+13
+7177.728515625
+23
+1.0452731345408917e-12
+33
+1124.1523753989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7177.728515625
+20
+9.982062919300372e-13
+30
+445.84768789898317
+11
+7203.908203125
+21
+1.045501630148743e-12
+31
+1127.4453441489832
+12
+7228.939453125
+22
+1.003898353335586e-12
+32
+527.8789378989832
+13
+7228.939453125
+23
+1.003898353335586e-12
+33
+527.8789378989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+7177.728515625
+20
+9.982062919300372e-13
+30
+445.84768789898317
+11
+7228.939453125
+21
+1.003898353335586e-12
+31
+527.8789378989832
+12
+7342.447265625
+22
+1.0017735881280576e-12
+32
+497.25784414898317
+13
+7342.447265625
+23
+1.0017735881280576e-12
+33
+497.25784414898317
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7228.939453125
+20
+1.003898353335586e-12
+30
+527.8789378989832
+11
+7203.908203125
+21
+1.045501630148743e-12
+31
+1127.4453441489832
+12
+7216.587890625
+22
+1.041524505529523e-12
+32
+1070.1289378989832
+13
+7216.587890625
+23
+1.041524505529523e-12
+33
+1070.1289378989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7993.142578125
+20
+9.985892863474677e-13
+30
+451.36721914898317
+11
+7992.533203125
+21
+9.704436690002871e-13
+31
+45.74612539898317
+12
+7865.267578125
+22
+1.0103783586699888e-12
+32
+621.2656566489832
+13
+7865.267578125
+23
+1.0103783586699888e-12
+33
+621.2656566489832
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+7992.533203125
+20
+9.704436690002871e-13
+30
+45.74612539898317
+11
+7993.142578125
+21
+9.985892863474677e-13
+31
+451.36721914898317
+12
+7993.142578125
+22
+9.833573300262188e-13
+32
+231.85159414898317
+13
+7993.142578125
+23
+9.833573300262188e-13
+33
+231.85159414898317
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7992.533203125
+20
+9.704436690002871e-13
+30
+45.74612539898317
+11
+7993.142578125
+21
+9.833573300262188e-13
+31
+231.85159414898317
+12
+8023.587890625
+22
+9.800177162844204e-13
+32
+183.72268789898317
+13
+8023.587890625
+23
+9.800177162844204e-13
+33
+183.72268789898317
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7609.306640625
+20
+1.0032543372451297e-12
+30
+518.5976878989832
+11
+7395.814453125
+21
+1.0020720147760342e-12
+31
+501.55862539898317
+12
+7388.548828125
+22
+1.0051034440503037e-12
+32
+545.2461253989832
+13
+7388.548828125
+23
+1.0051034440503037e-12
+33
+545.2461253989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7395.814453125
+20
+1.0020720147760342e-12
+30
+501.55862539898317
+11
+7609.306640625
+21
+1.0032543372451297e-12
+31
+518.5976878989832
+12
+7802.361328125
+22
+9.151265899579042e-13
+32
+-751.4569996010168
+13
+7802.361328125
+23
+9.151265899579042e-13
+33
+-751.4569996010168
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+7802.361328125
+20
+9.151265899579042e-13
+30
+-751.4569996010168
+11
+7609.306640625
+21
+1.0032543372451297e-12
+31
+518.5976878989832
+12
+7716.720703125
+22
+1.0113517011703377e-12
+32
+635.2930003989832
+13
+7716.720703125
+23
+1.0113517011703377e-12
+33
+635.2930003989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7802.361328125
+20
+9.151265899579042e-13
+30
+-751.4569996010168
+11
+7716.720703125
+21
+1.0113517011703377e-12
+31
+635.2930003989832
+12
+7780.541015625
+22
+1.0075607882742421e-12
+32
+580.6601878989832
+13
+7780.541015625
+23
+1.0075607882742421e-12
+33
+580.6601878989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7802.361328125
+20
+9.151265899579042e-13
+30
+-751.4569996010168
+11
+7780.541015625
+21
+1.0075607882742421e-12
+31
+580.6601878989832
+12
+7808.384765625
+22
+1.0113956113583233e-12
+32
+635.9258128989832
+13
+7808.384765625
+23
+1.0113956113583233e-12
+33
+635.9258128989832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+7802.361328125
+20
+9.151265899579042e-13
+30
+-751.4569996010168
+11
+7808.384765625
+21
+1.0113956113583233e-12
+31
+635.9258128989832
+12
+8033.126953125
+22
+9.50523893535754e-13
+32
+-241.32809335101683
+13
+8033.126953125
+23
+9.50523893535754e-13
+33
+-241.32809335101683
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+7802.361328125
+20
+9.151265899579042e-13
+30
+-751.4569996010168
+11
+8033.126953125
+21
+9.50523893535754e-13
+31
+-241.32809335101683
+12
+8276.314453125
+22
+9.175920656981362e-13
+32
+-715.9257496010168
+13
+8276.314453125
+23
+9.175920656981362e-13
+33
+-715.9257496010168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+8033.126953125
+20
+9.50523893535754e-13
+30
+-241.32809335101683
+11
+7808.384765625
+21
+1.0113956113583233e-12
+31
+635.9258128989832
+12
+7865.267578125
+22
+1.0103783586699888e-12
+32
+621.2656566489832
+13
+7865.267578125
+23
+1.0103783586699888e-12
+33
+621.2656566489832
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+8033.126953125
+20
+9.50523893535754e-13
+30
+-241.32809335101683
+11
+7865.267578125
+21
+1.0103783586699888e-12
+31
+621.2656566489832
+12
+7992.533203125
+22
+9.704436690002871e-13
+32
+45.74612539898317
+13
+7992.533203125
+23
+9.704436690002871e-13
+33
+45.74612539898317
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+8434.447265625
+20
+9.876637810553313e-13
+30
+293.91409414898317
+11
+8023.587890625
+21
+9.800177162844204e-13
+31
+183.72268789898317
+12
+7993.142578125
+22
+9.833573300262188e-13
+32
+231.85159414898317
+13
+7993.142578125
+23
+9.833573300262188e-13
+33
+231.85159414898317
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+8023.587890625
+20
+9.800177162844204e-13
+30
+183.72268789898317
+11
+8434.447265625
+21
+9.876637810553313e-13
+31
+293.91409414898317
+12
+8438.384765625
+22
+9.853959011610347e-13
+32
+261.23050039898317
+13
+8438.384765625
+23
+9.853959011610347e-13
+33
+261.23050039898317
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+7992.533203125
+20
+9.704436690002871e-13
+30
+45.74612539898317
+11
+8057.876953125
+21
+9.657712997379608e-13
+31
+-21.589812101016832
+12
+8033.126953125
+22
+9.50523893535754e-13
+32
+-241.32809335101683
+13
+8033.126953125
+23
+9.50523893535754e-13
+33
+-241.32809335101683
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+8057.876953125
+20
+9.657712997379608e-13
+30
+-21.589812101016832
+11
+7992.533203125
+21
+9.704436690002871e-13
+31
+45.74612539898317
+12
+8196.369140625
+22
+9.68344111493269e-13
+32
+15.488312898983168
+13
+8196.369140625
+23
+9.68344111493269e-13
+33
+15.488312898983168
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+8057.876953125
+20
+9.657712997379608e-13
+30
+-21.589812101016832
+11
+8196.369140625
+21
+9.68344111493269e-13
+31
+15.488312898983168
+12
+8195.103515625
+22
+9.668820648636722e-13
+32
+-5.5819996010168325
+13
+8195.103515625
+23
+9.668820648636722e-13
+33
+-5.5819996010168325
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+8371.658203125
+20
+9.401505181999559e-13
+30
+-390.82418710101683
+11
+8323.048828125
+21
+9.371011995898404e-13
+31
+-434.76949960101683
+12
+8315.783203125
+22
+9.433543356196505e-13
+32
+-344.65231210101683
+13
+8315.783203125
+23
+9.433543356196505e-13
+33
+-344.65231210101683
+70
+2
+ 0
+3DFACE
+ 8
+ship7
+10
+8033.126953125
+20
+9.50523893535754e-13
+30
+-241.32809335101683
+11
+8114.080078125
+21
+9.498497908350112e-13
+31
+-251.04293710101683
+12
+8276.314453125
+22
+9.175920656981362e-13
+32
+-715.9257496010168
+13
+8276.314453125
+23
+9.175920656981362e-13
+33
+-715.9257496010168
+70
+3
+ 0
+3DFACE
+ 8
+ship7
+10
+8114.080078125
+20
+9.498497908350112e-13
+30
+-251.04293710101683
+11
+8033.126953125
+21
+9.50523893535754e-13
+31
+-241.32809335101683
+12
+8090.033203125
+22
+9.56883552429011e-13
+32
+-149.67574960101683
+13
+8090.033203125
+23
+9.56883552429011e-13
+33
+-149.67574960101683
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+8114.080078125
+20
+9.498497908350112e-13
+30
+-251.04293710101683
+11
+8090.033203125
+21
+9.56883552429011e-13
+31
+-149.67574960101683
+12
+8102.947265625
+22
+9.567672717460118e-13
+32
+-151.35153085101683
+13
+8102.947265625
+23
+9.567672717460118e-13
+33
+-151.35153085101683
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+8276.314453125
+20
+9.175920656981362e-13
+30
+-715.9257496010168
+11
+8114.080078125
+21
+9.498497908350112e-13
+31
+-251.04293710101683
+12
+8179.541015625
+22
+9.460068362346363e-13
+32
+-306.42574960101683
+13
+8179.541015625
+23
+9.460068362346363e-13
+33
+-306.42574960101683
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+8276.314453125
+20
+9.175920656981362e-13
+30
+-715.9257496010168
+11
+8179.541015625
+21
+9.460068362346363e-13
+31
+-306.42574960101683
+12
+8223.837890625
+22
+9.513939657791737e-13
+32
+-228.78903085101683
+13
+8223.837890625
+23
+9.513939657791737e-13
+33
+-228.78903085101683
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+8276.314453125
+20
+9.175920656981362e-13
+30
+-715.9257496010168
+11
+8223.837890625
+21
+9.513939657791737e-13
+31
+-228.78903085101683
+12
+8309.291015625
+22
+9.499002062360318e-13
+32
+-250.31637460101683
+13
+8309.291015625
+23
+9.499002062360318e-13
+33
+-250.31637460101683
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+8276.314453125
+20
+9.175920656981362e-13
+30
+-715.9257496010168
+11
+8309.291015625
+21
+9.499002062360318e-13
+31
+-250.31637460101683
+12
+8315.783203125
+22
+9.433543356196505e-13
+32
+-344.65231210101683
+13
+8315.783203125
+23
+9.433543356196505e-13
+33
+-344.65231210101683
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+8276.314453125
+20
+9.175920656981362e-13
+30
+-715.9257496010168
+11
+8315.783203125
+21
+9.433543356196505e-13
+31
+-344.65231210101683
+12
+8323.048828125
+22
+9.371011995898404e-13
+32
+-434.76949960101683
+13
+8323.048828125
+23
+9.371011995898404e-13
+33
+-434.76949960101683
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+8276.314453125
+20
+9.175920656981362e-13
+30
+-715.9257496010168
+11
+8323.048828125
+21
+9.371011995898404e-13
+31
+-434.76949960101683
+12
+8347.869140625
+22
+9.282671202884285e-13
+32
+-562.0819996010168
+13
+8347.869140625
+23
+9.282671202884285e-13
+33
+-562.0819996010168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4997.689453125
+20
+1.0133634383013845e-12
+30
+664.2851878989832
+11
+4978.939453125
+21
+1.001432877595354e-12
+31
+492.34768789898317
+12
+4937.619140625
+22
+1.0095595149792191e-12
+32
+609.4648753989832
+13
+4937.619140625
+23
+1.0095595149792191e-12
+33
+609.4648753989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+4780.728515625
+20
+1.009188717836229e-12
+30
+604.1211253989832
+11
+5489.548828125
+21
+9.15427456060769e-13
+31
+-747.1210621010168
+12
+3198.515625
+22
+9.133213933407158e-13
+32
+-777.4726246010168
+13
+3198.515625
+23
+9.133213933407158e-13
+33
+-777.4726246010168
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5489.548828125
+20
+9.15427456060769e-13
+30
+-747.1210621010168
+11
+4780.728515625
+21
+1.009188717836229e-12
+31
+604.1211253989832
+12
+4965.884765625
+22
+1.0009531181340292e-12
+32
+485.43362539898317
+13
+4965.884765625
+23
+1.0009531181340292e-12
+33
+485.43362539898317
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+5489.548828125
+20
+9.15427456060769e-13
+30
+-747.1210621010168
+11
+4965.884765625
+21
+1.0009531181340292e-12
+31
+485.43362539898317
+12
+4978.939453125
+22
+1.001432877595354e-12
+32
+492.34768789898317
+13
+4978.939453125
+23
+1.001432877595354e-12
+33
+492.34768789898317
+70
+13
+ 0
+3DFACE
+ 8
+ship7
+10
+5489.548828125
+20
+9.15427456060769e-13
+30
+-747.1210621010168
+11
+4978.939453125
+21
+1.001432877595354e-12
+31
+492.34768789898317
+12
+4997.689453125
+22
+1.0133634383013845e-12
+32
+664.2851878989832
+13
+4997.689453125
+23
+1.0133634383013845e-12
+33
+664.2851878989832
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+5489.548828125
+20
+9.15427456060769e-13
+30
+-747.1210621010168
+11
+4997.689453125
+21
+1.0133634383013845e-12
+31
+664.2851878989832
+12
+5088.134765625
+22
+9.979834883835914e-13
+32
+442.63675039898317
+13
+5088.134765625
+23
+9.979834883835914e-13
+33
+442.63675039898317
+70
+15
+ 0
+3DFACE
+ 8
+ship7
+10
+5088.134765625
+20
+9.979834883835914e-13
+30
+442.63675039898317
+11
+4997.689453125
+21
+1.0133634383013845e-12
+31
+664.2851878989832
+12
+5066.314453125
+22
+1.0107662319971955e-12
+32
+626.8555003989832
+13
+5066.314453125
+23
+1.0107662319971955e-12
+33
+626.8555003989832
+70
+1
+ 0
+3DFACE
+ 8
+ship7
+10
+5489.548828125
+20
+9.15427456060769e-13
+30
+-747.1210621010168
+11
+5088.134765625
+21
+9.979834883835914e-13
+31
+442.63675039898317
+12
+5925.650390625
+22
+9.11731681905309e-13
+32
+-800.3827808510168
+13
+5925.650390625
+23
+9.11731681905309e-13
+33
+-800.3827808510168
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+317.39093237733323
+20
+-1.1134146989805194e-12
+30
+425.50307997950904
+11
+64.94561987733323
+21
+-1.1217917870662286e-12
+31
+304.77651747950904
+12
+44.10968237733323
+22
+-1.1134146989805194e-12
+32
+425.50307997950904
+13
+44.10968237733323
+23
+-1.1134146989805194e-12
+33
+425.50307997950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+64.94561987733323
+20
+-1.1217917870662286e-12
+30
+304.77651747950904
+11
+317.39093237733323
+21
+-1.1134146989805194e-12
+31
+425.50307997950904
+12
+102.71515112733323
+22
+-1.1447600679892478e-12
+32
+-26.23129502049096
+13
+102.71515112733323
+23
+-1.1447600679892478e-12
+33
+-26.23129502049096
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+102.71515112733323
+20
+-1.1447600679892478e-12
+30
+-26.23129502049096
+11
+317.39093237733323
+21
+-1.1134146989805194e-12
+31
+425.50307997950904
+12
+102.89093237733323
+22
+-1.1487363794568384e-12
+32
+-83.53598252049096
+13
+102.89093237733323
+23
+-1.1487363794568384e-12
+33
+-83.53598252049096
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+102.89093237733323
+20
+-1.1487363794568384e-12
+30
+-83.53598252049096
+11
+317.39093237733323
+21
+-1.1134146989805194e-12
+31
+425.50307997950904
+12
+175.41827612733323
+22
+-1.1545390294839808e-12
+32
+-167.16098252049096
+13
+175.41827612733323
+23
+-1.1545390294839808e-12
+33
+-167.16098252049096
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+175.41827612733323
+20
+-1.1545390294839808e-12
+30
+-167.16098252049096
+11
+317.39093237733323
+21
+-1.1134146989805194e-12
+31
+425.50307997950904
+12
+593.1682761273332
+22
+-1.1589576954379455e-12
+32
+-230.84067002049096
+13
+593.1682761273332
+23
+-1.1589576954379455e-12
+33
+-230.84067002049096
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+593.1682761273332
+20
+-1.1589576954379455e-12
+30
+-230.84067002049096
+11
+317.39093237733323
+21
+-1.1134146989805194e-12
+31
+425.50307997950904
+12
+854.4495261273332
+22
+-1.161962290708446e-12
+32
+-274.14145127049096
+13
+854.4495261273332
+23
+-1.161962290708446e-12
+33
+-274.14145127049096
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+854.4495261273332
+20
+-1.161962290708446e-12
+30
+-274.14145127049096
+11
+317.39093237733323
+21
+-1.1134146989805194e-12
+31
+425.50307997950904
+12
+1020.0706198773332
+22
+-1.1651051217559383e-12
+32
+-319.43442002049096
+13
+1020.0706198773332
+23
+-1.1651051217559383e-12
+33
+-319.43442002049096
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+2709.9964011273332
+20
+-1.0842339396091583e-12
+30
+846.042142479509
+11
+2575.4065573773332
+21
+-1.1742363712869048e-12
+31
+-451.02959437277104
+12
+2575.4065573773332
+22
+-1.0831182955736707e-12
+32
+862.120267479509
+13
+2575.4065573773332
+23
+-1.0831182955736707e-12
+33
+862.120267479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+2575.4065573773332
+20
+-1.1742363712869048e-12
+30
+-451.02959437277104
+11
+2709.9964011273332
+21
+-1.0842339396091583e-12
+31
+846.042142479509
+12
+2795.6839011273332
+22
+-1.0865888267277968e-12
+32
+812.104642479509
+13
+2795.6839011273332
+23
+-1.0865888267277968e-12
+33
+812.104642479509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+2575.4065573773332
+20
+-1.1742363712869048e-12
+30
+-451.02959437277104
+11
+2795.6839011273332
+21
+-1.0865888267277968e-12
+31
+812.104642479509
+12
+2883.6565573773332
+22
+-1.0873824627180562e-12
+32
+800.667142479509
+13
+2883.6565573773332
+23
+-1.0873824627180562e-12
+33
+800.667142479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+979.8987448773332
+20
+-1.0916645191982877e-12
+30
+738.956204979509
+11
+1020.0706198773332
+21
+-1.1651051217559383e-12
+31
+-319.43442002049096
+12
+968.4260886273332
+22
+-1.0981404587745436e-12
+32
+645.628079979509
+13
+968.4260886273332
+23
+-1.0981404587745436e-12
+33
+645.628079979509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+1020.0706198773332
+20
+-1.1651051217559383e-12
+30
+-319.43442002049096
+11
+979.8987448773332
+21
+-1.0916645191982877e-12
+31
+738.956204979509
+12
+1272.1057761273332
+22
+-1.0906285640224778e-12
+32
+753.885892479509
+13
+1272.1057761273332
+23
+-1.0906285640224778e-12
+33
+753.885892479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+377.42608862733323
+20
+-1.0961563687988951e-12
+30
+674.221829979509
+11
+317.39093237733323
+21
+-1.1134146989805194e-12
+31
+425.50307997950904
+12
+316.44171362733323
+22
+-1.100508356319252e-12
+32
+611.503079979509
+13
+316.44171362733323
+23
+-1.100508356319252e-12
+33
+611.503079979509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+317.39093237733323
+20
+-1.1134146989805194e-12
+30
+425.50307997950904
+11
+377.42608862733323
+21
+-1.0961563687988951e-12
+31
+674.221829979509
+12
+1020.0706198773332
+22
+-1.1651051217559383e-12
+32
+-319.43442002049096
+13
+1020.0706198773332
+23
+-1.1651051217559383e-12
+33
+-319.43442002049096
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+1020.0706198773332
+20
+-1.1651051217559383e-12
+30
+-319.43442002049096
+11
+377.42608862733323
+21
+-1.0961563687988951e-12
+31
+674.221829979509
+12
+470.02765112733323
+22
+-1.0964279614431027e-12
+32
+670.307767479509
+13
+470.02765112733323
+23
+-1.0964279614431027e-12
+33
+670.307767479509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+1020.0706198773332
+20
+-1.1651051217559383e-12
+30
+-319.43442002049096
+11
+470.02765112733323
+21
+-1.0964279614431027e-12
+31
+670.307767479509
+12
+968.4260886273332
+22
+-1.0981404587745436e-12
+32
+645.628079979509
+13
+968.4260886273332
+23
+-1.0981404587745436e-12
+33
+645.628079979509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+1272.1057761273332
+20
+-1.0906285640224778e-12
+30
+753.885892479509
+11
+1534.0198386273332
+21
+-1.1682455133485425e-12
+31
+-364.69223252049096
+12
+1020.0706198773332
+22
+-1.1651051217559383e-12
+32
+-319.43442002049096
+13
+1020.0706198773332
+23
+-1.1651051217559383e-12
+33
+-319.43442002049096
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+1534.0198386273332
+20
+-1.1682455133485425e-12
+30
+-364.69223252049096
+11
+1272.1057761273332
+21
+-1.0906285640224778e-12
+31
+753.885892479509
+12
+2575.4065573773332
+22
+-1.0831182955736707e-12
+32
+862.120267479509
+13
+2575.4065573773332
+23
+-1.0831182955736707e-12
+33
+862.120267479509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+1534.0198386273332
+20
+-1.1682455133485425e-12
+30
+-364.69223252049096
+11
+2575.4065573773332
+21
+-1.0831182955736707e-12
+31
+862.120267479509
+12
+2575.4065573773332
+22
+-1.1742363712869048e-12
+32
+-451.02959437277104
+13
+2575.4065573773332
+23
+-1.1742363712869048e-12
+33
+-451.02959437277104
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+1469.1682761273332
+20
+-1.068346583074642e-12
+30
+1075.003079979509
+11
+1272.1057761273332
+21
+-1.0906285640224778e-12
+31
+753.885892479509
+12
+1272.1057761273332
+22
+-1.068346583074642e-12
+32
+1075.003079979509
+13
+1272.1057761273332
+23
+-1.068346583074642e-12
+33
+1075.003079979509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+1272.1057761273332
+20
+-1.0906285640224778e-12
+30
+753.885892479509
+11
+1469.1682761273332
+21
+-1.068346583074642e-12
+31
+1075.003079979509
+12
+2575.4065573773332
+22
+-1.0831182955736707e-12
+32
+862.120267479509
+13
+2575.4065573773332
+23
+-1.0831182955736707e-12
+33
+862.120267479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+1469.1682761273332
+20
+-1.068346583074642e-12
+30
+1075.003079979509
+11
+2253.6799948773332
+21
+-1.0670853848974982e-12
+31
+1093.178861229509
+12
+2575.4065573773332
+22
+-1.0831182955736707e-12
+32
+862.120267479509
+13
+2575.4065573773332
+23
+-1.0831182955736707e-12
+33
+862.120267479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+2253.6799948773332
+20
+-1.0670853848974982e-12
+30
+1093.178861229509
+11
+1469.1682761273332
+21
+-1.068346583074642e-12
+31
+1075.003079979509
+12
+2201.2854636273332
+22
+-1.0639238513625304e-12
+32
+1138.741361229509
+13
+2201.2854636273332
+23
+-1.0639238513625304e-12
+33
+1138.741361229509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+2621.3323386273332
+20
+-1.0337372234256459e-12
+30
+1573.776517479509
+11
+2267.5667136273332
+21
+-1.0498238021093564e-12
+31
+1341.944486229509
+12
+2241.5979636273332
+22
+-1.0327159049791645e-12
+32
+1588.495267479509
+13
+2241.5979636273332
+23
+-1.0327159049791645e-12
+33
+1588.495267479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+2267.5667136273332
+20
+-1.0498238021093564e-12
+30
+1341.944486229509
+11
+2621.3323386273332
+21
+-1.0337372234256459e-12
+31
+1573.776517479509
+12
+2599.1370261273332
+22
+-1.0383673088032452e-12
+32
+1507.049954979509
+13
+2599.1370261273332
+23
+-1.0383673088032452e-12
+33
+1507.049954979509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+2267.5667136273332
+20
+-1.0498238021093564e-12
+30
+1341.944486229509
+11
+2599.1370261273332
+21
+-1.0383673088032452e-12
+31
+1507.049954979509
+12
+2575.4065573773332
+22
+-1.0831182955736707e-12
+32
+862.120267479509
+13
+2575.4065573773332
+23
+-1.0831182955736707e-12
+33
+862.120267479509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+2575.4065573773332
+20
+-1.0831182955736707e-12
+30
+862.120267479509
+11
+2253.6799948773332
+21
+-1.0670853848974982e-12
+31
+1093.178861229509
+12
+2267.5667136273332
+22
+-1.0498238021093564e-12
+32
+1341.944486229509
+13
+2267.5667136273332
+23
+-1.0498238021093564e-12
+33
+1341.944486229509
+70
+12
+ 0
+3DFACE
+ 8
+ship6
+10
+2201.4260886273332
+20
+-1.0509199305057393e-12
+30
+1326.147611229509
+11
+1469.1682761273332
+21
+-1.068346583074642e-12
+31
+1075.003079979509
+12
+1452.9846823773332
+22
+-1.0503100667837162e-12
+32
+1334.936673729509
+13
+1452.9846823773332
+23
+-1.0503100667837162e-12
+33
+1334.936673729509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+1469.1682761273332
+20
+-1.068346583074642e-12
+30
+1075.003079979509
+11
+2201.4260886273332
+21
+-1.0509199305057393e-12
+31
+1326.147611229509
+12
+2201.2854636273332
+22
+-1.0639238513625304e-12
+32
+1138.741361229509
+13
+2201.2854636273332
+23
+-1.0639238513625304e-12
+33
+1138.741361229509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+2883.6565573773332
+20
+-1.0873824627180562e-12
+30
+800.667142479509
+11
+2683.8987448773332
+21
+-1.1748605018534197e-12
+31
+-460.02426377049096
+12
+2575.4065573773332
+22
+-1.1742363712869048e-12
+32
+-451.02959437277104
+13
+2575.4065573773332
+23
+-1.1742363712869048e-12
+33
+-451.02959437277104
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+2683.8987448773332
+20
+-1.1748605018534197e-12
+30
+-460.02426377049096
+11
+2883.6565573773332
+21
+-1.0873824627180562e-12
+31
+800.667142479509
+12
+3749.1448386273332
+22
+-1.180164689931762e-12
+32
+-536.465670020491
+13
+3749.1448386273332
+23
+-1.180164689931762e-12
+33
+-536.465670020491
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+3749.1448386273332
+20
+-1.180164689931762e-12
+30
+-536.465670020491
+11
+2883.6565573773332
+21
+-1.0873824627180562e-12
+31
+800.667142479509
+12
+5094.117494877333
+22
+-1.1857681178097101e-12
+32
+-617.219576270491
+13
+5094.117494877333
+23
+-1.1857681178097101e-12
+33
+-617.219576270491
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+5845.910463627333
+20
+-1.082062824758756e-12
+30
+877.331204979509
+11
+5912.355776127333
+21
+-1.1254021803006053e-12
+31
+252.74526747950904
+12
+5094.117494877333
+22
+-1.1857681178097101e-12
+32
+-617.219576270491
+13
+5094.117494877333
+23
+-1.1857681178097101e-12
+33
+-617.219576270491
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+5912.355776127333
+20
+-1.1254021803006053e-12
+30
+252.74526747950904
+11
+5845.910463627333
+21
+-1.082062824758756e-12
+31
+877.331204979509
+12
+5912.414369877333
+22
+-1.121020106169962e-12
+32
+315.89761122950904
+13
+5912.414369877333
+23
+-1.121020106169962e-12
+33
+315.89761122950904
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+5912.414369877333
+20
+-1.121020106169962e-12
+30
+315.89761122950904
+11
+5845.910463627333
+21
+-1.082062824758756e-12
+31
+877.331204979509
+12
+5920.957338627333
+22
+-1.0886900105380737e-12
+32
+781.823392479509
+13
+5920.957338627333
+23
+-1.0886900105380737e-12
+33
+781.823392479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+3499.2424948773332
+20
+-1.0850633542711097e-12
+30
+834.089017479509
+11
+5094.117494877333
+21
+-1.1857681178097101e-12
+31
+-617.219576270491
+12
+2883.6565573773332
+22
+-1.0873824627180562e-12
+32
+800.667142479509
+13
+2883.6565573773332
+23
+-1.0873824627180562e-12
+33
+800.667142479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+5094.117494877333
+20
+-1.1857681178097101e-12
+30
+-617.219576270491
+11
+3499.2424948773332
+21
+-1.0850633542711097e-12
+31
+834.089017479509
+12
+3971.2385886273332
+22
+-1.084429909151835e-12
+32
+843.217923729509
+13
+3971.2385886273332
+23
+-1.084429909151835e-12
+33
+843.217923729509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+5094.117494877333
+20
+-1.1857681178097101e-12
+30
+-617.219576270491
+11
+3971.2385886273332
+21
+-1.084429909151835e-12
+31
+843.217923729509
+12
+4736.297182377333
+22
+-1.0819083259491769e-12
+32
+879.557767479509
+13
+4736.297182377333
+23
+-1.0819083259491769e-12
+33
+879.557767479509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+5094.117494877333
+20
+-1.1857681178097101e-12
+30
+-617.219576270491
+11
+4736.297182377333
+21
+-1.0819083259491769e-12
+31
+879.557767479509
+12
+5486.625307377333
+22
+-1.0779230698136633e-12
+32
+936.991361229509
+13
+5486.625307377333
+23
+-1.0779230698136633e-12
+33
+936.991361229509
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+5094.117494877333
+20
+-1.1857681178097101e-12
+30
+-617.219576270491
+11
+5486.625307377333
+21
+-1.0779230698136633e-12
+31
+936.991361229509
+12
+5845.910463627333
+22
+-1.082062824758756e-12
+32
+877.331204979509
+13
+5845.910463627333
+23
+-1.082062824758756e-12
+33
+877.331204979509
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+5845.910463627333
+20
+-1.082062824758756e-12
+30
+877.331204979509
+11
+5486.625307377333
+21
+-1.0779230698136633e-12
+31
+936.991361229509
+12
+5656.078432377333
+22
+-1.0795241653718812e-12
+32
+913.917142479509
+13
+5656.078432377333
+23
+-1.0795241653718812e-12
+33
+913.917142479509
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+5912.355776127333
+20
+-1.1254021803006053e-12
+30
+252.74526747950904
+11
+5960.871401127333
+21
+-1.1881986280298795e-12
+31
+-652.246920020491
+12
+5094.117494877333
+22
+-1.1857681178097101e-12
+32
+-617.219576270491
+13
+5094.117494877333
+23
+-1.1857681178097101e-12
+33
+-617.219576270491
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+5960.871401127333
+20
+-1.1881986280298795e-12
+30
+-652.246920020491
+11
+5912.355776127333
+21
+-1.1254021803006053e-12
+31
+252.74526747950904
+12
+7121.297182377333
+22
+-1.1906657300733703e-12
+32
+-687.801607520491
+13
+7121.297182377333
+23
+-1.1906657300733703e-12
+33
+-687.801607520491
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+7718.285463627333
+20
+-1.1215819939458527e-12
+30
+307.79995497950904
+11
+7902.914369877333
+21
+-1.1536079708683589e-12
+31
+-153.74301377049096
+12
+6844.125307377333
+22
+-1.1233123806131395e-12
+32
+282.86245497950904
+13
+6844.125307377333
+23
+-1.1233123806131395e-12
+33
+282.86245497950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+7902.914369877333
+20
+-1.1536079708683589e-12
+30
+-153.74301377049096
+11
+7718.285463627333
+21
+-1.1215819939458527e-12
+31
+307.79995497950904
+12
+8368.793276127333
+22
+-1.1195003257746805e-12
+32
+337.79995497950904
+13
+8368.793276127333
+23
+-1.1195003257746805e-12
+33
+337.79995497950904
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+7902.914369877333
+20
+-1.1536079708683589e-12
+30
+-153.74301377049096
+11
+8368.793276127333
+21
+-1.1195003257746805e-12
+31
+337.79995497950904
+12
+8330.015932377333
+22
+-1.1256705203382955e-12
+32
+248.87807997950904
+13
+8330.015932377333
+23
+-1.1256705203382955e-12
+33
+248.87807997950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+6462.222963627333
+20
+-1.1252574393105785e-12
+30
+254.83120497950904
+11
+7121.297182377333
+21
+-1.1906657300733703e-12
+31
+-687.801607520491
+12
+5912.355776127333
+22
+-1.1254021803006053e-12
+32
+252.74526747950904
+13
+5912.355776127333
+23
+-1.1254021803006053e-12
+33
+252.74526747950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+7121.297182377333
+20
+-1.1906657300733703e-12
+30
+-687.801607520491
+11
+6462.222963627333
+21
+-1.1252574393105785e-12
+31
+254.83120497950904
+12
+6844.125307377333
+22
+-1.1233123806131395e-12
+32
+282.86245497950904
+13
+6844.125307377333
+23
+-1.1233123806131395e-12
+33
+282.86245497950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+7410.398744877333
+20
+-1.170971197610171e-12
+30
+-403.97348252049096
+11
+7121.297182377333
+21
+-1.1906657300733703e-12
+31
+-687.801607520491
+12
+6844.125307377333
+22
+-1.1233123806131395e-12
+32
+282.86245497950904
+13
+6844.125307377333
+23
+-1.1233123806131395e-12
+33
+282.86245497950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+7121.297182377333
+20
+-1.1906657300733703e-12
+30
+-687.801607520491
+11
+7410.398744877333
+21
+-1.170971197610171e-12
+31
+-403.97348252049096
+12
+7267.547182377333
+22
+-1.1923034174549096e-12
+32
+-711.403170020491
+13
+7267.547182377333
+23
+-1.1923034174549096e-12
+33
+-711.403170020491
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+7267.547182377333
+20
+-1.1923034174549096e-12
+30
+-711.403170020491
+11
+7410.398744877333
+21
+-1.170971197610171e-12
+31
+-403.97348252049096
+12
+7608.304994877333
+22
+-1.1937117960769683e-12
+32
+-731.700045020491
+13
+7608.304994877333
+23
+-1.1937117960769683e-12
+33
+-731.700045020491
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+7902.914369877333
+20
+-1.1536079708683589e-12
+30
+-153.74301377049096
+11
+7410.398744877333
+21
+-1.170971197610171e-12
+31
+-403.97348252049096
+12
+6844.125307377333
+22
+-1.1233123806131395e-12
+32
+282.86245497950904
+13
+6844.125307377333
+23
+-1.1233123806131395e-12
+33
+282.86245497950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+7410.398744877333
+20
+-1.170971197610171e-12
+30
+-403.97348252049096
+11
+7902.914369877333
+21
+-1.1536079708683589e-12
+31
+-153.74301377049096
+12
+7502.730776127333
+22
+-1.1679527787619715e-12
+32
+-360.47348252049096
+13
+7502.730776127333
+23
+-1.1679527787619715e-12
+33
+-360.47348252049096
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+6519.187807377333
+20
+-1.1220536218908839e-12
+30
+301.00307997950904
+11
+6844.125307377333
+21
+-1.1233123806131395e-12
+31
+282.86245497950904
+12
+6462.222963627333
+22
+-1.1252574393105785e-12
+32
+254.83120497950904
+13
+6462.222963627333
+23
+-1.1252574393105785e-12
+33
+254.83120497950904
+70
+1
+ 0
+3DFACE
+ 8
+ship6
+10
+6844.125307377333
+20
+-1.1233123806131395e-12
+30
+282.86245497950904
+11
+6519.187807377333
+21
+-1.1220536218908839e-12
+31
+301.00307997950904
+12
+6597.422182377333
+22
+-1.119554806933848e-12
+32
+337.01479872950904
+13
+6597.422182377333
+23
+-1.119554806933848e-12
+33
+337.01479872950904
+70
+13
+ 0
+3DFACE
+ 8
+ship6
+10
+6844.125307377333
+20
+-1.1233123806131395e-12
+30
+282.86245497950904
+11
+6597.422182377333
+21
+-1.119554806933848e-12
+31
+337.01479872950904
+12
+6798.879213627333
+22
+-1.1226146965151451e-12
+32
+292.91714247950904
+13
+6798.879213627333
+23
+-1.1226146965151451e-12
+33
+292.91714247950904
+70
+3
+ 0
+3DFACE
+ 8
+ship6
+10
+6798.879213627333
+20
+-1.1226146965151451e-12
+30
+292.91714247950904
+11
+6597.422182377333
+21
+-1.119554806933848e-12
+31
+337.01479872950904
+12
+6711.879213627333
+22
+-1.120023995423991e-12
+32
+330.25307997950904
+13
+6711.879213627333
+23
+-1.120023995423991e-12
+33
+330.25307997950904
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1417.806640625
+20
+1.2593217484438424e-12
+30
+553.3181820138116
+11
+1773.400390625
+21
+1.1951219247337787e-12
+31
+-371.89878482744916
+12
+14.638671875
+22
+1.1937117960769683e-12
+32
+-392.22088048618843
+13
+14.638671875
+23
+1.1937117960769683e-12
+33
+-392.22088048618843
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.1951219247337787e-12
+30
+-371.89878482744916
+11
+1417.806640625
+21
+1.2593217484438424e-12
+31
+553.3181820138116
+12
+1548.4543265297798
+22
+8.875013776411845e-13
+32
+553.3181820138088
+13
+1548.4543265297798
+23
+8.875013776411845e-13
+33
+553.3181820138088
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.1951219247337787e-12
+30
+-371.89878482744916
+11
+1548.4543265297798
+21
+8.875013776411845e-13
+31
+553.3181820138088
+12
+1548.892578125
+22
+1.2592648278297869e-12
+32
+552.4978695138116
+13
+1548.892578125
+23
+1.2592648278297869e-12
+33
+552.4978695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.1951219247337787e-12
+30
+-371.89878482744916
+11
+1548.892578125
+21
+1.2592648278297869e-12
+31
+552.4978695138116
+12
+1549.0772780519674
+22
+8.865082253681158e-13
+32
+552.5570169376306
+13
+1549.0772780519674
+23
+8.865082253681158e-13
+33
+552.5570169376306
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+818.533203125
+20
+1.2490256225128338e-12
+30
+404.93536951381157
+11
+445.150390625
+21
+1.235223186756007e-12
+31
+206.02130701381157
+12
+412.291015625
+22
+1.241346218525119e-12
+32
+294.26349451381157
+13
+412.291015625
+23
+1.241346218525119e-12
+33
+294.26349451381157
+70
+0
+ 0
+3DFACE
+ 8
+ship5
+10
+1164.013671875
+20
+1.3048061979839543e-12
+30
+1208.8181820138116
+11
+1417.806640625
+21
+1.2593217484438424e-12
+31
+553.3181820138116
+12
+1067.626953125
+22
+1.2608472209005295e-12
+32
+575.3025570138116
+13
+1067.626953125
+23
+1.2608472209005295e-12
+33
+575.3025570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1417.806640625
+20
+1.2593217484438424e-12
+30
+553.3181820138116
+11
+1164.013671875
+21
+1.3048061979839543e-12
+31
+1208.8181820138116
+12
+1462.783203125
+22
+1.3022626596873033e-12
+32
+1172.1619320138116
+13
+1462.783203125
+23
+1.3022626596873033e-12
+33
+1172.1619320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+818.767578125
+20
+1.2547502099835572e-12
+30
+487.43536951381157
+11
+951.306640625
+21
+1.2549518715876395e-12
+31
+490.34161951381157
+12
+818.533203125
+22
+1.2490256225128338e-12
+32
+404.93536951381157
+13
+818.533203125
+23
+1.2490256225128338e-12
+33
+404.93536951381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+951.306640625
+20
+1.2549518715876395e-12
+30
+490.34161951381157
+11
+818.767578125
+21
+1.2547502099835572e-12
+31
+487.43536951381157
+12
+856.490234375
+22
+1.256714784320101e-12
+32
+515.7478695138116
+13
+856.490234375
+23
+1.256714784320101e-12
+33
+515.7478695138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+143.779296875
+20
+1.2497314381271218e-12
+30
+415.10724451381157
+11
+126.435546875
+21
+1.2353110071319784e-12
+31
+207.28693201381157
+12
+106.033203125
+22
+1.248389737938671e-12
+32
+395.77130701381157
+13
+106.033203125
+23
+1.248389737938671e-12
+33
+395.77130701381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+126.435546875
+20
+1.2353110071319784e-12
+30
+207.28693201381157
+11
+143.779296875
+21
+1.2497314381271218e-12
+31
+415.10724451381157
+12
+180.693359375
+22
+1.236929178874413e-12
+32
+230.60724451381157
+13
+180.693359375
+23
+1.236929178874413e-12
+33
+230.60724451381157
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+126.435546875
+20
+1.2353110071319784e-12
+30
+207.28693201381157
+11
+180.693359375
+21
+1.236929178874413e-12
+31
+230.60724451381157
+12
+229.830078125
+22
+1.2352166815429722e-12
+32
+205.92755701381157
+13
+229.830078125
+23
+1.2352166815429722e-12
+33
+205.92755701381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+180.693359375
+20
+1.236929178874413e-12
+30
+230.60724451381157
+11
+143.779296875
+21
+1.2497314381271218e-12
+31
+415.10724451381157
+12
+151.080078125
+22
+1.2487800507207658e-12
+32
+401.39630701381157
+13
+151.080078125
+23
+1.2487800507207658e-12
+33
+401.39630701381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+71.310546875
+20
+1.2268379671540042e-12
+30
+85.17755701381157
+11
+445.150390625
+21
+1.235223186756007e-12
+31
+206.02130701381157
+12
+70.548828125
+22
+1.2032614488122206e-12
+32
+-254.59588048618843
+13
+70.548828125
+23
+1.2032614488122206e-12
+33
+-254.59588048618843
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+445.150390625
+20
+1.235223186756007e-12
+30
+206.02130701381157
+11
+71.310546875
+21
+1.2268379671540042e-12
+31
+85.17755701381157
+12
+381.763671875
+22
+1.2352085500266785e-12
+32
+205.81036951381157
+13
+381.763671875
+23
+1.2352085500266785e-12
+33
+205.81036951381157
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+381.763671875
+20
+1.2352085500266785e-12
+30
+205.81036951381157
+11
+71.310546875
+21
+1.2268379671540042e-12
+31
+85.17755701381157
+12
+86.369140625
+22
+1.2351548820191405e-12
+32
+205.03693201381157
+13
+86.369140625
+23
+1.2351548820191405e-12
+33
+205.03693201381157
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+381.763671875
+20
+1.2352085500266785e-12
+30
+205.81036951381157
+11
+86.369140625
+21
+1.2351548820191405e-12
+31
+205.03693201381157
+12
+229.830078125
+22
+1.2352166815429722e-12
+32
+205.92755701381157
+13
+229.830078125
+23
+1.2352166815429722e-12
+33
+205.92755701381157
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+229.830078125
+20
+1.2352166815429722e-12
+30
+205.92755701381157
+11
+86.369140625
+21
+1.2351548820191405e-12
+31
+205.03693201381157
+12
+126.435546875
+22
+1.2353110071319784e-12
+32
+207.28693201381157
+13
+126.435546875
+23
+1.2353110071319784e-12
+33
+207.28693201381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+381.763671875
+20
+1.2352085500266785e-12
+30
+205.81036951381157
+11
+229.830078125
+21
+1.2352166815429722e-12
+31
+205.92755701381157
+12
+280.326171875
+22
+1.236085127483133e-12
+32
+218.44318201381157
+13
+280.326171875
+23
+1.236085127483133e-12
+33
+218.44318201381157
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+381.763671875
+20
+1.2352085500266785e-12
+30
+205.81036951381157
+11
+280.326171875
+21
+1.236085127483133e-12
+31
+218.44318201381157
+12
+334.748046875
+22
+1.2360217016560426e-12
+32
+217.52911951381157
+13
+334.748046875
+23
+1.2360217016560426e-12
+33
+217.52911951381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+292.923828125
+20
+1.255864227715786e-12
+30
+503.49005701381157
+11
+229.830078125
+21
+1.2352166815429722e-12
+31
+205.92755701381157
+12
+180.693359375
+22
+1.236929178874413e-12
+32
+230.60724451381157
+13
+180.693359375
+23
+1.236929178874413e-12
+33
+230.60724451381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+229.830078125
+20
+1.2352166815429722e-12
+30
+205.92755701381157
+11
+292.923828125
+21
+1.255864227715786e-12
+31
+503.49005701381157
+12
+324.072265625
+22
+1.2548380303595286e-12
+32
+488.70099451381157
+13
+324.072265625
+23
+1.2548380303595286e-12
+33
+488.70099451381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+365.099609375
+20
+1.266547413822372e-12
+30
+657.4509945138116
+11
+523.830078125
+21
+1.2571912911749084e-12
+31
+522.6150570138116
+12
+347.369140625
+22
+1.2640380278941543e-12
+32
+621.2869320138116
+13
+347.369140625
+23
+1.2640380278941543e-12
+33
+621.2869320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+523.830078125
+20
+1.2571912911749084e-12
+30
+522.6150570138116
+11
+365.099609375
+21
+1.266547413822372e-12
+31
+657.4509945138116
+12
+541.595703125
+22
+1.260658569722517e-12
+32
+572.5838070138116
+13
+541.595703125
+23
+1.260658569722517e-12
+33
+572.5838070138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+599.943359375
+20
+1.265524469072632e-12
+30
+642.7088070138116
+11
+541.595703125
+21
+1.260658569722517e-12
+31
+572.5838070138116
+12
+541.595703125
+22
+1.265524469072632e-12
+32
+642.7088070138116
+13
+541.595703125
+23
+1.265524469072632e-12
+33
+642.7088070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+456.822265625
+20
+1.2456917008324409e-12
+30
+356.88849451381157
+11
+818.533203125
+21
+1.2490256225128338e-12
+31
+404.93536951381157
+12
+412.291015625
+22
+1.241346218525119e-12
+32
+294.26349451381157
+13
+412.291015625
+23
+1.241346218525119e-12
+33
+294.26349451381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+818.533203125
+20
+1.2490256225128338e-12
+30
+404.93536951381157
+11
+456.822265625
+21
+1.2456917008324409e-12
+31
+356.88849451381157
+12
+497.298828125
+22
+1.2541257095322056e-12
+32
+478.43536951381157
+13
+497.298828125
+23
+1.2541257095322056e-12
+33
+478.43536951381157
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+818.533203125
+20
+1.2490256225128338e-12
+30
+404.93536951381157
+11
+497.298828125
+21
+1.2541257095322056e-12
+31
+478.43536951381157
+12
+523.830078125
+22
+1.2571912911749084e-12
+32
+522.6150570138116
+13
+523.830078125
+23
+1.2571912911749084e-12
+33
+522.6150570138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+818.533203125
+20
+1.2490256225128338e-12
+30
+404.93536951381157
+11
+523.830078125
+21
+1.2571912911749084e-12
+31
+522.6150570138116
+12
+748.009765625
+22
+1.2509950757591537e-12
+32
+433.31818201381157
+13
+748.009765625
+23
+1.2509950757591537e-12
+33
+433.31818201381157
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+748.009765625
+20
+1.2509950757591537e-12
+30
+433.31818201381157
+11
+523.830078125
+21
+1.2571912911749084e-12
+31
+522.6150570138116
+12
+541.595703125
+22
+1.260658569722517e-12
+32
+572.5838070138116
+13
+541.595703125
+23
+1.260658569722517e-12
+33
+572.5838070138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+748.009765625
+20
+1.2509950757591537e-12
+30
+433.31818201381157
+11
+541.595703125
+21
+1.260658569722517e-12
+31
+572.5838070138116
+12
+654.318359375
+22
+1.2582630250224103e-12
+32
+538.0603695138116
+13
+654.318359375
+23
+1.2582630250224103e-12
+33
+538.0603695138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+654.318359375
+20
+1.2582630250224103e-12
+30
+538.0603695138116
+11
+541.595703125
+21
+1.260658569722517e-12
+31
+572.5838070138116
+12
+599.943359375
+22
+1.265524469072632e-12
+32
+642.7088070138116
+13
+599.943359375
+23
+1.265524469072632e-12
+33
+642.7088070138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+599.943359375
+20
+1.265524469072632e-12
+30
+642.7088070138116
+11
+654.845703125
+21
+1.2696146217683335e-12
+31
+701.6541195138116
+12
+654.318359375
+22
+1.2582630250224103e-12
+32
+538.0603695138116
+13
+654.318359375
+23
+1.2582630250224103e-12
+33
+538.0603695138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+654.845703125
+20
+1.2696146217683335e-12
+30
+701.6541195138116
+11
+599.943359375
+21
+1.265524469072632e-12
+31
+642.7088070138116
+12
+675.400390625
+22
+1.3668659303370245e-12
+32
+2103.1931820138125
+13
+675.400390625
+23
+1.3668659303370245e-12
+33
+2103.1931820138125
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+654.845703125
+20
+1.2696146217683335e-12
+30
+701.6541195138116
+11
+675.400390625
+21
+1.3668659303370245e-12
+31
+2103.1931820138125
+12
+691.103515625
+22
+1.3616194760243672e-12
+32
+2027.5838070138125
+13
+691.103515625
+23
+1.3616194760243672e-12
+33
+2027.5838070138125
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+654.845703125
+20
+1.2696146217683335e-12
+30
+701.6541195138116
+11
+688.021484375
+21
+1.2600877372787034e-12
+31
+564.3572445138116
+12
+654.318359375
+22
+1.2582630250224103e-12
+32
+538.0603695138116
+13
+654.318359375
+23
+1.2582630250224103e-12
+33
+538.0603695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+688.021484375
+20
+1.2600877372787034e-12
+30
+564.3572445138116
+11
+654.845703125
+21
+1.2696146217683335e-12
+31
+701.6541195138116
+12
+703.279296875
+22
+1.2696146217683335e-12
+32
+701.6541195138116
+13
+703.279296875
+23
+1.2696146217683335e-12
+33
+701.6541195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1067.626953125
+20
+1.2608472209005295e-12
+30
+575.3025570138116
+11
+951.306640625
+21
+1.2549518715876395e-12
+31
+490.34161951381157
+12
+967.408203125
+22
+1.2618034872166617e-12
+32
+589.0838070138116
+13
+967.408203125
+23
+1.2618034872166617e-12
+33
+589.0838070138116
+70
+0
+ 0
+3DFACE
+ 8
+ship5
+10
+27.705078125
+20
+1.2024141448144232e-12
+30
+-266.80681798618843
+11
+14.638671875
+21
+1.1937117960769683e-12
+31
+-392.22088048618843
+12
+13.806640625
+22
+1.1983304973317566e-12
+32
+-325.65838048618843
+13
+13.806640625
+23
+1.1983304973317566e-12
+33
+-325.65838048618843
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+14.638671875
+20
+1.1937117960769683e-12
+30
+-392.22088048618843
+11
+27.705078125
+21
+1.2024141448144232e-12
+31
+-266.80681798618843
+12
+66.142578125
+22
+1.2025523805914151e-12
+32
+-264.81463048618843
+13
+66.142578125
+23
+1.2025523805914151e-12
+33
+-264.81463048618843
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+14.638671875
+20
+1.1937117960769683e-12
+30
+-392.22088048618843
+11
+66.142578125
+21
+1.2025523805914151e-12
+31
+-264.81463048618843
+12
+1417.806640625
+22
+1.2593217484438424e-12
+32
+553.3181820138116
+13
+1417.806640625
+23
+1.2593217484438424e-12
+33
+553.3181820138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+1417.806640625
+20
+1.2593217484438424e-12
+30
+553.3181820138116
+11
+66.142578125
+21
+1.2025523805914151e-12
+31
+-264.81463048618843
+12
+70.548828125
+22
+1.2032614488122206e-12
+32
+-254.59588048618843
+13
+70.548828125
+23
+1.2032614488122206e-12
+33
+-254.59588048618843
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+1417.806640625
+20
+1.2593217484438424e-12
+30
+553.3181820138116
+11
+70.548828125
+21
+1.2032614488122206e-12
+31
+-254.59588048618843
+12
+445.150390625
+22
+1.235223186756007e-12
+32
+206.02130701381157
+13
+445.150390625
+23
+1.235223186756007e-12
+33
+206.02130701381157
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+1417.806640625
+20
+1.2593217484438424e-12
+30
+553.3181820138116
+11
+445.150390625
+21
+1.235223186756007e-12
+31
+206.02130701381157
+12
+818.533203125
+22
+1.2490256225128338e-12
+32
+404.93536951381157
+13
+818.533203125
+23
+1.2490256225128338e-12
+33
+404.93536951381157
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+1417.806640625
+20
+1.2593217484438424e-12
+30
+553.3181820138116
+11
+818.533203125
+21
+1.2490256225128338e-12
+31
+404.93536951381157
+12
+951.306640625
+22
+1.2549518715876395e-12
+32
+490.34161951381157
+13
+951.306640625
+23
+1.2549518715876395e-12
+33
+490.34161951381157
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+1417.806640625
+20
+1.2593217484438424e-12
+30
+553.3181820138116
+11
+951.306640625
+21
+1.2549518715876395e-12
+31
+490.34161951381157
+12
+1067.626953125
+22
+1.2608472209005295e-12
+32
+575.3025570138116
+13
+1067.626953125
+23
+1.2608472209005295e-12
+33
+575.3025570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1463.744140625
+20
+1.262992314898792e-12
+30
+606.2166195138116
+11
+1548.4543265297798
+21
+8.875013776411845e-13
+31
+553.3181820138088
+12
+1417.806640625
+22
+1.2593217484438424e-12
+32
+553.3181820138116
+13
+1417.806640625
+23
+1.2593217484438424e-12
+33
+553.3181820138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1548.4543265297798
+20
+8.875013776411845e-13
+30
+553.3181820138088
+11
+1463.744140625
+21
+1.262992314898792e-12
+31
+606.2166195138116
+12
+1520.193359375
+22
+1.262992314898792e-12
+32
+606.2166195138116
+13
+1520.193359375
+23
+1.262992314898792e-12
+33
+606.2166195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.2640510383202241e-12
+30
+621.4744320138116
+11
+1773.400390625
+21
+1.1951219247337787e-12
+31
+-371.89878482744916
+12
+1655.814453125
+22
+1.2618083661264379e-12
+32
+589.1541195138116
+13
+1655.814453125
+23
+1.2618083661264379e-12
+33
+589.1541195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.1951219247337787e-12
+30
+-371.89878482744916
+11
+1773.400390625
+21
+1.2640510383202241e-12
+31
+621.4744320138116
+12
+1831.138671875
+22
+1.2640510383202241e-12
+32
+621.4744320138116
+13
+1831.138671875
+23
+1.2640510383202241e-12
+33
+621.4744320138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.1951219247337787e-12
+30
+-371.89878482744916
+11
+1831.138671875
+21
+1.2640510383202241e-12
+31
+621.4744320138116
+12
+2187.564453125
+22
+1.2640884432951749e-12
+32
+622.0134945138116
+13
+2187.564453125
+23
+1.2640884432951749e-12
+33
+622.0134945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1548.892578125
+20
+5.131864985047363e-13
+30
+553.3181820138088
+11
+1548.892578125
+21
+1.2592648278297869e-12
+31
+552.4978695138116
+12
+1548.4543265297798
+22
+8.875013776411845e-13
+32
+553.3181820138088
+13
+1548.4543265297798
+23
+8.875013776411845e-13
+33
+553.3181820138088
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1548.892578125
+20
+1.2592648278297869e-12
+30
+552.4978695138116
+11
+1548.892578125
+21
+5.131864985047363e-13
+31
+553.3181820138088
+12
+1549.0772780519674
+22
+8.865082253681158e-13
+32
+552.5570169376306
+13
+1549.0772780519674
+23
+8.865082253681158e-13
+33
+552.5570169376306
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1636.572265625
+20
+1.2612131391337433e-12
+30
+580.5759945138116
+11
+1773.400390625
+21
+1.1951219247337787e-12
+31
+-371.89878482744916
+12
+1549.0772780519674
+22
+8.865082253681158e-13
+32
+552.5570169376306
+13
+1549.0772780519674
+23
+8.865082253681158e-13
+33
+552.5570169376306
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.1951219247337787e-12
+30
+-371.89878482744916
+11
+1636.572265625
+21
+1.2612131391337433e-12
+31
+580.5759945138116
+12
+1655.814453125
+22
+1.2618083661264379e-12
+32
+589.1541195138116
+13
+1655.814453125
+23
+1.2618083661264379e-12
+33
+589.1541195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.2640510383202241e-12
+30
+621.4744320138116
+11
+1655.814453125
+21
+1.2618083661264379e-12
+31
+589.1541195138116
+12
+1773.400390625
+22
+1.2719483669446086e-12
+32
+735.2869320138116
+13
+1773.400390625
+23
+1.2719483669446086e-12
+33
+735.2869320138116
+70
+0
+ 0
+3DFACE
+ 8
+ship5
+10
+1912.068359375
+20
+1.3123099612197264e-12
+30
+1316.9588070138116
+11
+2187.564453125
+21
+1.2640884432951749e-12
+31
+622.0134945138116
+12
+1831.138671875
+22
+1.2640510383202241e-12
+32
+621.4744320138116
+13
+1831.138671875
+23
+1.2640510383202241e-12
+33
+621.4744320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+2187.564453125
+20
+1.2640884432951749e-12
+30
+622.0134945138116
+11
+1912.068359375
+21
+1.3123099612197264e-12
+31
+1316.9588070138116
+12
+1928.509765625
+22
+1.3166066544292865e-12
+32
+1378.8806820138125
+13
+1928.509765625
+23
+1.3166066544292865e-12
+33
+1378.8806820138125
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+2187.564453125
+20
+1.2640884432951749e-12
+30
+622.0134945138116
+11
+1928.509765625
+21
+1.3166066544292865e-12
+31
+1378.8806820138125
+12
+1998.517578125
+22
+1.3158764442661175e-12
+32
+1368.3572445138125
+13
+1998.517578125
+23
+1.3158764442661175e-12
+33
+1368.3572445138125
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+2187.564453125
+20
+1.2640884432951749e-12
+30
+622.0134945138116
+11
+1998.517578125
+21
+1.3158764442661175e-12
+31
+1368.3572445138125
+12
+2233.712890625
+22
+1.3152730857571293e-12
+32
+1359.6619320138125
+13
+2233.712890625
+23
+1.3152730857571293e-12
+33
+1359.6619320138125
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+1773.400390625
+20
+1.1951219247337787e-12
+30
+-371.89878482744916
+11
+2232.283203125
+21
+1.2640884432951749e-12
+31
+622.0134945138116
+12
+3129.611328125
+22
+1.2698845881092824e-12
+32
+705.5447445138116
+13
+3129.611328125
+23
+1.2698845881092824e-12
+33
+705.5447445138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+2232.283203125
+20
+1.2640884432951749e-12
+30
+622.0134945138116
+11
+1773.400390625
+21
+1.1951219247337787e-12
+31
+-371.89878482744916
+12
+2187.564453125
+22
+1.2640884432951749e-12
+32
+622.0134945138116
+13
+2187.564453125
+23
+1.2640884432951749e-12
+33
+622.0134945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3129.611328125
+20
+1.2698845881092824e-12
+30
+705.5447445138116
+11
+2232.283203125
+21
+1.2640884432951749e-12
+31
+622.0134945138116
+12
+2365.970703125
+22
+1.2655082060400447e-12
+32
+642.4744320138116
+13
+2365.970703125
+23
+1.2655082060400447e-12
+33
+642.4744320138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3129.611328125
+20
+1.2698845881092824e-12
+30
+705.5447445138116
+11
+2365.970703125
+21
+1.2655082060400447e-12
+31
+642.4744320138116
+12
+2712.095703125
+22
+1.2696552793498017e-12
+32
+702.2400570138116
+13
+2712.095703125
+23
+1.2696552793498017e-12
+33
+702.2400570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+2299.666015625
+20
+1.271042516029497e-12
+30
+722.2322445138116
+11
+2232.283203125
+21
+1.2640884432951749e-12
+31
+622.0134945138116
+12
+2232.283203125
+22
+1.271042516029497e-12
+32
+722.2322445138116
+13
+2232.283203125
+23
+1.271042516029497e-12
+33
+722.2322445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+2232.283203125
+20
+1.2640884432951749e-12
+30
+622.0134945138116
+11
+2299.666015625
+21
+1.271042516029497e-12
+31
+722.2322445138116
+12
+2365.970703125
+22
+1.2655082060400447e-12
+32
+642.4744320138116
+13
+2365.970703125
+23
+1.2655082060400447e-12
+33
+642.4744320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+2473.197265625
+20
+1.2733957768448767e-12
+30
+756.1463070138116
+11
+2457.634765625
+21
+1.2675280746873852e-12
+31
+671.5838070138116
+12
+2403.353515625
+22
+1.2733957768448767e-12
+32
+756.1463070138116
+13
+2403.353515625
+23
+1.2733957768448767e-12
+33
+756.1463070138116
+70
+2
+ 0
+3DFACE
+ 8
+ship5
+10
+2365.970703125
+20
+1.2655082060400447e-12
+30
+642.4744320138116
+11
+2457.634765625
+21
+1.2675280746873852e-12
+31
+671.5838070138116
+12
+2712.095703125
+22
+1.2696552793498017e-12
+32
+702.2400570138116
+13
+2712.095703125
+23
+1.2696552793498017e-12
+33
+702.2400570138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+2457.634765625
+20
+1.2675280746873852e-12
+30
+671.5838070138116
+11
+2365.970703125
+21
+1.2655082060400447e-12
+31
+642.4744320138116
+12
+2403.353515625
+22
+1.2733957768448767e-12
+32
+756.1463070138116
+13
+2403.353515625
+23
+1.2733957768448767e-12
+33
+756.1463070138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+2712.095703125
+20
+1.2696552793498017e-12
+30
+702.2400570138116
+11
+2457.634765625
+21
+1.2675280746873852e-12
+31
+671.5838070138116
+12
+2556.330078125
+22
+1.2693088767556926e-12
+32
+697.2478695138116
+13
+2556.330078125
+23
+1.2693088767556926e-12
+33
+697.2478695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+2712.095703125
+20
+1.2696552793498017e-12
+30
+702.2400570138116
+11
+2556.330078125
+21
+1.2693088767556926e-12
+31
+697.2478695138116
+12
+2650.900390625
+22
+1.2726623140751903e-12
+32
+745.5759945138116
+13
+2650.900390625
+23
+1.2726623140751903e-12
+33
+745.5759945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+2846.662109375
+20
+1.3302383283439467e-12
+30
+1575.3338070138125
+11
+3129.611328125
+21
+1.2698845881092824e-12
+31
+705.5447445138116
+12
+2712.095703125
+22
+1.2696552793498017e-12
+32
+702.2400570138116
+13
+2712.095703125
+23
+1.2696552793498017e-12
+33
+702.2400570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3129.611328125
+20
+1.2698845881092824e-12
+30
+705.5447445138116
+11
+2846.662109375
+21
+1.3302383283439467e-12
+31
+1575.3338070138125
+12
+3223.689453125
+22
+1.3283583217768569e-12
+32
+1548.2400570138125
+13
+3223.689453125
+23
+1.3283583217768569e-12
+33
+1548.2400570138125
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3129.611328125
+20
+1.2698845881092824e-12
+30
+705.5447445138116
+11
+3223.689453125
+21
+1.3283583217768569e-12
+31
+1548.2400570138125
+12
+3165.986328125
+22
+1.2914835216884524e-12
+32
+1016.8181820138116
+13
+3165.986328125
+23
+1.2914835216884524e-12
+33
+1016.8181820138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3165.986328125
+20
+1.2914835216884524e-12
+30
+1016.8181820138116
+11
+3175.501953125
+21
+1.2850726342425456e-12
+31
+924.4275570138116
+12
+3129.611328125
+22
+1.2698845881092824e-12
+32
+705.5447445138116
+13
+3129.611328125
+23
+1.2698845881092824e-12
+33
+705.5447445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3175.501953125
+20
+1.2850726342425456e-12
+30
+924.4275570138116
+11
+3165.986328125
+21
+1.2914835216884524e-12
+31
+1016.8181820138116
+12
+3176.041015625
+22
+1.2873689744438699e-12
+32
+957.5213070138116
+13
+3176.041015625
+23
+1.2873689744438699e-12
+33
+957.5213070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3129.611328125
+20
+1.2698845881092824e-12
+30
+705.5447445138116
+11
+3212.896745144124
+21
+8.685692946118428e-13
+31
+-355.26572856685834
+12
+1773.400390625
+22
+1.1951219247337787e-12
+32
+-371.89878482744916
+13
+1773.400390625
+23
+1.1951219247337787e-12
+33
+-371.89878482744916
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3212.896745144124
+20
+8.685692946118428e-13
+30
+-355.26572856685834
+11
+3129.611328125
+21
+1.2698845881092824e-12
+31
+705.5447445138116
+12
+3588.470703125
+22
+1.2728932491379297e-12
+32
+748.9041195138116
+13
+3588.470703125
+23
+1.2728932491379297e-12
+33
+748.9041195138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3212.896745144124
+20
+8.685692946118428e-13
+30
+-355.26572856685834
+11
+3588.470703125
+21
+1.2728932491379297e-12
+31
+748.9041195138116
+12
+3878.744140625
+22
+1.277768906307597e-12
+32
+819.1697445138116
+13
+3878.744140625
+23
+1.277768906307597e-12
+33
+819.1697445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3364.607421875
+20
+1.2877592872259647e-12
+30
+963.1463070138116
+11
+3313.384765625
+21
+1.2752562677728618e-12
+31
+782.9588070138116
+12
+3313.384765625
+22
+1.2842041883023847e-12
+32
+911.9119320138116
+13
+3313.384765625
+23
+1.2842041883023847e-12
+33
+911.9119320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3129.611328125
+20
+1.2698845881092824e-12
+30
+705.5447445138116
+11
+3441.072265625
+21
+1.2740593085744378e-12
+31
+765.7088070138116
+12
+3588.470703125
+22
+1.2728932491379297e-12
+32
+748.9041195138116
+13
+3588.470703125
+23
+1.2728932491379297e-12
+33
+748.9041195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3441.072265625
+20
+1.2740593085744378e-12
+30
+765.7088070138116
+11
+3129.611328125
+21
+1.2698845881092824e-12
+31
+705.5447445138116
+12
+3313.384765625
+22
+1.2752562677728618e-12
+32
+782.9588070138116
+13
+3313.384765625
+23
+1.2752562677728618e-12
+33
+782.9588070138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3441.072265625
+20
+1.2740593085744378e-12
+30
+765.7088070138116
+11
+3313.384765625
+21
+1.2752562677728618e-12
+31
+782.9588070138116
+12
+3390.810546875
+22
+1.276397932660489e-12
+32
+799.4119320138116
+13
+3390.810546875
+23
+1.276397932660489e-12
+33
+799.4119320138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+3390.810546875
+20
+1.276397932660489e-12
+30
+799.4119320138116
+11
+3313.384765625
+21
+1.2752562677728618e-12
+31
+782.9588070138116
+12
+3364.607421875
+22
+1.2877592872259647e-12
+32
+963.1463070138116
+13
+3364.607421875
+23
+1.2877592872259647e-12
+33
+963.1463070138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+3390.810546875
+20
+1.276397932660489e-12
+30
+799.4119320138116
+11
+3364.607421875
+21
+1.2877592872259647e-12
+31
+963.1463070138116
+12
+3384.658203125
+22
+1.2834690992294395e-12
+32
+901.3181820138116
+13
+3384.658203125
+23
+1.2834690992294395e-12
+33
+901.3181820138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3588.470703125
+20
+1.2728932491379297e-12
+30
+748.9041195138116
+11
+3807.400390625
+21
+1.277295652059307e-12
+31
+812.3494320138116
+12
+3878.744140625
+22
+1.277768906307597e-12
+32
+819.1697445138116
+13
+3878.744140625
+23
+1.277768906307597e-12
+33
+819.1697445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3807.400390625
+20
+1.277295652059307e-12
+30
+812.3494320138116
+11
+3588.470703125
+21
+1.2728932491379297e-12
+31
+748.9041195138116
+12
+3721.103515625
+22
+1.276728072222011e-12
+32
+804.1697445138116
+13
+3721.103515625
+23
+1.276728072222011e-12
+33
+804.1697445138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+3721.103515625
+20
+1.276728072222011e-12
+30
+804.1697445138116
+11
+3588.470703125
+21
+1.2728932491379297e-12
+31
+748.9041195138116
+12
+3685.490234375
+22
+1.2767345774350458e-12
+32
+804.2634945138116
+13
+3685.490234375
+23
+1.2767345774350458e-12
+33
+804.2634945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+3685.490234375
+20
+1.2767345774350458e-12
+30
+804.2634945138116
+11
+3588.470703125
+21
+1.2728932491379297e-12
+31
+748.9041195138116
+12
+3604.830078125
+22
+1.285321458641131e-12
+32
+928.0134945138116
+13
+3604.830078125
+23
+1.285321458641131e-12
+33
+928.0134945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3685.490234375
+20
+1.2767345774350458e-12
+30
+804.2634945138116
+11
+3604.830078125
+21
+1.285321458641131e-12
+31
+928.0134945138116
+12
+3653.111328125
+22
+1.2865281756591074e-12
+32
+945.4041195138116
+13
+3653.111328125
+23
+1.2865281756591074e-12
+33
+945.4041195138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3685.490234375
+20
+1.2767345774350458e-12
+30
+804.2634945138116
+11
+3653.111328125
+21
+1.2865281756591074e-12
+31
+945.4041195138116
+12
+3671.087890625
+22
+1.283974879542904e-12
+32
+908.6072445138116
+13
+3671.087890625
+23
+1.283974879542904e-12
+33
+908.6072445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3807.400390625
+20
+1.277295652059307e-12
+30
+812.3494320138116
+11
+3721.103515625
+21
+1.276728072222011e-12
+31
+804.1697445138116
+12
+3752.837890625
+22
+1.2784552062827803e-12
+32
+829.0603695138116
+13
+3752.837890625
+23
+1.2784552062827803e-12
+33
+829.0603695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3807.400390625
+20
+1.277295652059307e-12
+30
+812.3494320138116
+11
+3752.837890625
+21
+1.2784552062827803e-12
+31
+829.0603695138116
+12
+3774.986328125
+22
+1.2838057440039963e-12
+32
+906.1697445138116
+13
+3774.986328125
+23
+1.2838057440039963e-12
+33
+906.1697445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+3807.400390625
+20
+1.277295652059307e-12
+30
+812.3494320138116
+11
+3774.986328125
+21
+1.2838057440039963e-12
+31
+906.1697445138116
+12
+3807.400390625
+22
+1.2846432901822413e-12
+32
+918.2400570138116
+13
+3807.400390625
+23
+1.2846432901822413e-12
+33
+918.2400570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3959.251953125
+20
+1.3437903133989293e-12
+30
+1770.6384945138125
+11
+4246.876953125
+21
+1.27529692535433e-12
+31
+783.5447445138116
+12
+3878.744140625
+22
+1.277768906307597e-12
+32
+819.1697445138116
+13
+3878.744140625
+23
+1.277768906307597e-12
+33
+819.1697445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4246.876953125
+20
+1.27529692535433e-12
+30
+783.5447445138116
+11
+3959.251953125
+21
+1.3437903133989293e-12
+31
+1770.6384945138125
+12
+4247.287109375
+22
+1.279809916897301e-12
+32
+848.5838070138116
+13
+4247.287109375
+23
+1.279809916897301e-12
+33
+848.5838070138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+4247.287109375
+20
+1.279809916897301e-12
+30
+848.5838070138116
+11
+3959.251953125
+21
+1.3437903133989293e-12
+31
+1770.6384945138125
+12
+4349.427734375
+22
+1.3427348425840147e-12
+32
+1755.4275570138125
+13
+4349.427734375
+23
+1.3427348425840147e-12
+33
+1755.4275570138125
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4308.353515625
+20
+1.2832040117982668e-12
+30
+897.4978695138116
+11
+4365.330078125
+21
+1.2743536694642676e-12
+31
+769.9509945138116
+12
+4279.724609375
+22
+1.27529692535433e-12
+32
+783.5447445138116
+13
+4279.724609375
+23
+1.27529692535433e-12
+33
+783.5447445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4365.330078125
+20
+1.2743536694642676e-12
+30
+769.9509945138116
+11
+4308.353515625
+21
+1.2832040117982668e-12
+31
+897.4978695138116
+12
+4346.990234375
+22
+1.2821648040159395e-12
+32
+882.5213070138116
+13
+4346.990234375
+23
+1.2821648040159395e-12
+33
+882.5213070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4514.205078125
+20
+1.2807108889026364e-12
+30
+861.5681820138116
+11
+4720.548828125
+21
+1.2751017689632826e-12
+31
+780.7322445138116
+12
+4365.330078125
+22
+1.2743536694642676e-12
+32
+769.9509945138116
+13
+4365.330078125
+23
+1.2743536694642676e-12
+33
+769.9509945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4720.548828125
+20
+1.2751017689632826e-12
+30
+780.7322445138116
+11
+4514.205078125
+21
+1.2807108889026364e-12
+31
+861.5681820138116
+12
+4643.931640625
+22
+1.2807108889026364e-12
+32
+861.5681820138116
+13
+4643.931640625
+23
+1.2807108889026364e-12
+33
+861.5681820138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5504.380859375
+20
+1.3609673284176171e-12
+30
+2018.1853695138125
+11
+4882.197265625
+21
+1.2833194793296365e-12
+31
+899.1619320138116
+12
+4862.486328125
+22
+1.2866908059849802e-12
+32
+947.7478695138116
+13
+4862.486328125
+23
+1.2866908059849802e-12
+33
+947.7478695138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4882.197265625
+20
+1.2833194793296365e-12
+30
+899.1619320138116
+11
+5504.380859375
+21
+1.3609673284176171e-12
+31
+2018.1853695138125
+12
+5503.736328125
+22
+1.3529561585651217e-12
+32
+1902.7322445138125
+13
+5503.736328125
+23
+1.3529561585651217e-12
+33
+1902.7322445138125
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+5503.736328125
+20
+1.3529561585651217e-12
+30
+1902.7322445138125
+11
+5504.380859375
+21
+1.3609673284176171e-12
+31
+2018.1853695138125
+12
+5523.083984375
+22
+1.3579960723639206e-12
+32
+1975.3650570138125
+13
+5523.083984375
+23
+1.3579960723639206e-12
+33
+1975.3650570138125
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4695.259765625
+20
+1.2966193873795162e-12
+30
+1090.8338070138116
+11
+4672.220703125
+21
+1.2947198651733216e-12
+31
+1063.4588070138116
+12
+4652.568359375
+22
+1.2952841924041003e-12
+32
+1071.5916195138116
+13
+4652.568359375
+23
+1.2952841924041003e-12
+33
+1071.5916195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+4672.220703125
+20
+1.2947198651733216e-12
+30
+1063.4588070138116
+11
+4695.259765625
+21
+1.2966193873795162e-12
+31
+1090.8338070138116
+12
+4718.708984375
+22
+1.289731993078802e-12
+32
+991.5759945138116
+13
+4718.708984375
+23
+1.289731993078802e-12
+33
+991.5759945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+4718.708984375
+20
+1.289731993078802e-12
+30
+991.5759945138116
+11
+4695.259765625
+21
+1.2966193873795162e-12
+31
+1090.8338070138116
+12
+4833.576171875
+22
+1.2938628033559718e-12
+32
+1051.1072445138116
+13
+4833.576171875
+23
+1.2938628033559718e-12
+33
+1051.1072445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+4718.708984375
+20
+1.289731993078802e-12
+30
+991.5759945138116
+11
+4833.576171875
+21
+1.2938628033559718e-12
+31
+1051.1072445138116
+12
+4718.884765625
+22
+1.2885480443064479e-12
+32
+974.5134945138116
+13
+4718.884765625
+23
+1.2885480443064479e-12
+33
+974.5134945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+4718.884765625
+20
+1.2885480443064479e-12
+30
+974.5134945138116
+11
+4833.576171875
+21
+1.2938628033559718e-12
+31
+1051.1072445138116
+12
+4752.564453125
+22
+1.27913337474167e-12
+32
+838.8338070138116
+13
+4752.564453125
+23
+1.27913337474167e-12
+33
+838.8338070138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+4748.837890625
+20
+1.2776810859316257e-12
+30
+817.9041195138116
+11
+5050.900390625
+21
+1.2774777980242846e-12
+31
+814.9744320138116
+12
+4720.548828125
+22
+1.2751017689632826e-12
+32
+780.7322445138116
+13
+4720.548828125
+23
+1.2751017689632826e-12
+33
+780.7322445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+1.2774777980242846e-12
+30
+814.9744320138116
+11
+4748.837890625
+21
+1.2776810859316257e-12
+31
+817.9041195138116
+12
+4752.564453125
+22
+1.27913337474167e-12
+32
+838.8338070138116
+13
+4752.564453125
+23
+1.27913337474167e-12
+33
+838.8338070138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+1.2774777980242846e-12
+30
+814.9744320138116
+11
+4752.564453125
+21
+1.27913337474167e-12
+31
+838.8338070138116
+12
+4882.197265625
+22
+1.2833194793296365e-12
+32
+899.1619320138116
+13
+4882.197265625
+23
+1.2833194793296365e-12
+33
+899.1619320138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+4882.197265625
+20
+1.2833194793296365e-12
+30
+899.1619320138116
+11
+4752.564453125
+21
+1.27913337474167e-12
+31
+838.8338070138116
+12
+4862.486328125
+22
+1.2866908059849802e-12
+32
+947.7478695138116
+13
+4862.486328125
+23
+1.2866908059849802e-12
+33
+947.7478695138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+4862.486328125
+20
+1.2866908059849802e-12
+30
+947.7478695138116
+11
+4752.564453125
+21
+1.27913337474167e-12
+31
+838.8338070138116
+12
+4833.576171875
+22
+1.2938628033559718e-12
+32
+1051.1072445138116
+13
+4833.576171875
+23
+1.2938628033559718e-12
+33
+1051.1072445138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+1.2774777980242846e-12
+30
+814.9744320138116
+11
+4882.197265625
+21
+1.2833194793296365e-12
+31
+899.1619320138116
+12
+4948.654296875
+22
+1.2833194793296365e-12
+32
+899.1619320138116
+13
+4948.654296875
+23
+1.2833194793296365e-12
+33
+899.1619320138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+1.2774777980242846e-12
+30
+814.9744320138116
+11
+4948.654296875
+21
+1.2833194793296365e-12
+31
+899.1619320138116
+12
+4949.498046875
+22
+1.2855588989169053e-12
+32
+931.4353695138116
+13
+4949.498046875
+23
+1.2855588989169053e-12
+33
+931.4353695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+1.2774777980242846e-12
+30
+814.9744320138116
+11
+4949.498046875
+21
+1.2855588989169053e-12
+31
+931.4353695138116
+12
+4970.919921875
+22
+1.2870258244562782e-12
+32
+952.5759945138116
+13
+4970.919921875
+23
+1.2870258244562782e-12
+33
+952.5759945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+1.2774777980242846e-12
+30
+814.9744320138116
+11
+4970.919921875
+21
+1.2870258244562782e-12
+31
+952.5759945138116
+12
+5050.900390625
+22
+1.2878259656595725e-12
+32
+964.1072445138116
+13
+5050.900390625
+23
+1.2878259656595725e-12
+33
+964.1072445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5414.626953125
+20
+1.3197259040795273e-12
+30
+1423.8338070138125
+11
+5298.716796875
+21
+1.2752904201412951e-12
+31
+783.4509945138116
+12
+5243.755859375
+22
+1.2791284958318938e-12
+32
+838.7634945138116
+13
+5243.755859375
+23
+1.2791284958318938e-12
+33
+838.7634945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5298.716796875
+20
+1.2752904201412951e-12
+30
+783.4509945138116
+11
+5414.626953125
+21
+1.3197259040795273e-12
+31
+1423.8338070138125
+12
+5477.708984375
+22
+1.3197259040795273e-12
+32
+1423.8338070138125
+13
+5477.708984375
+23
+1.3197259040795273e-12
+33
+1423.8338070138125
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5436.130859375
+20
+1.2808556298926632e-12
+30
+863.6541195138116
+11
+5389.068359375
+21
+1.2752904201412951e-12
+31
+783.4509945138116
+12
+5373.341796875
+22
+1.2789642392027623e-12
+32
+836.3963070138116
+13
+5373.341796875
+23
+1.2789642392027623e-12
+33
+836.3963070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5389.068359375
+20
+1.2752904201412951e-12
+30
+783.4509945138116
+11
+5436.130859375
+21
+1.2808556298926632e-12
+31
+863.6541195138116
+12
+5495.181640625
+22
+1.2728038024586996e-12
+32
+747.6150570138116
+13
+5495.181640625
+23
+1.2728038024586996e-12
+33
+747.6150570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5693.673828125
+20
+1.434352636664471e-12
+30
+3075.7791195138125
+11
+5661.927734375
+21
+1.3745241923823759e-12
+31
+2213.5603695138125
+12
+5640.224609375
+22
+1.4329832893206218e-12
+32
+3056.0447445138125
+13
+5640.224609375
+23
+1.4329832893206218e-12
+33
+3056.0447445138125
+70
+2
+ 0
+3DFACE
+ 8
+ship5
+10
+5640.224609375
+20
+1.4329832893206218e-12
+30
+3056.0447445138125
+11
+5567.369140625
+21
+1.27763717574364e-12
+31
+817.2713070138116
+12
+5495.181640625
+22
+1.2728038024586996e-12
+32
+747.6150570138116
+13
+5495.181640625
+23
+1.2728038024586996e-12
+33
+747.6150570138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+5567.369140625
+20
+1.27763717574364e-12
+30
+817.2713070138116
+11
+5640.224609375
+21
+1.4329832893206218e-12
+31
+3056.0447445138125
+12
+5661.927734375
+22
+1.3689362143853856e-12
+32
+2133.0291195138125
+13
+5661.927734375
+23
+1.3689362143853856e-12
+33
+2133.0291195138125
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+5661.927734375
+20
+1.3689362143853856e-12
+30
+2133.0291195138125
+11
+5640.224609375
+21
+1.4329832893206218e-12
+31
+3056.0447445138125
+12
+5661.927734375
+22
+1.3745241923823759e-12
+32
+2213.5603695138125
+13
+5661.927734375
+23
+1.3745241923823759e-12
+33
+2213.5603695138125
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+5567.369140625
+20
+1.27763717574364e-12
+30
+817.2713070138116
+11
+5615.474609375
+21
+1.2741910391383948e-12
+31
+767.6072445138116
+12
+5495.181640625
+22
+1.2728038024586996e-12
+32
+747.6150570138116
+13
+5495.181640625
+23
+1.2728038024586996e-12
+33
+747.6150570138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5615.474609375
+20
+1.2741910391383948e-12
+30
+767.6072445138116
+11
+5567.369140625
+21
+1.27763717574364e-12
+31
+817.2713070138116
+12
+5615.474609375
+22
+1.277451777172145e-12
+32
+814.5994320138116
+13
+5615.474609375
+23
+1.277451777172145e-12
+33
+814.5994320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5717.720703125
+20
+1.2808409931633347e-12
+30
+863.4431820138116
+11
+5662.056640625
+21
+1.2768272767207933e-12
+31
+805.5994320138116
+12
+5661.927734375
+22
+1.2795708503182679e-12
+32
+845.1384945138116
+13
+5661.927734375
+23
+1.2795708503182679e-12
+33
+845.1384945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5662.056640625
+20
+1.2768272767207933e-12
+30
+805.5994320138116
+11
+5961.458984375
+21
+1.2691738935852181e-12
+31
+695.3025570138116
+12
+5650.513671875
+22
+1.2747797609180544e-12
+32
+776.0916195138116
+13
+5650.513671875
+23
+1.2747797609180544e-12
+33
+776.0916195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5961.458984375
+20
+1.2691738935852181e-12
+30
+695.3025570138116
+11
+5662.056640625
+21
+1.2768272767207933e-12
+31
+805.5994320138116
+12
+5717.720703125
+22
+1.2754920817453774e-12
+32
+786.3572445138116
+13
+5717.720703125
+23
+1.2754920817453774e-12
+33
+786.3572445138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+5717.720703125
+20
+1.2754920817453774e-12
+30
+786.3572445138116
+11
+5662.056640625
+21
+1.2768272767207933e-12
+31
+805.5994320138116
+12
+5717.720703125
+22
+1.2808409931633347e-12
+32
+863.4431820138116
+13
+5717.720703125
+23
+1.2808409931633347e-12
+33
+863.4431820138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+5961.458984375
+20
+1.2691738935852181e-12
+30
+695.3025570138116
+11
+5717.720703125
+21
+1.2754920817453774e-12
+31
+786.3572445138116
+12
+5824.056640625
+22
+1.2764076904800414e-12
+32
+799.5525570138116
+13
+5824.056640625
+23
+1.2764076904800414e-12
+33
+799.5525570138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5961.458984375
+20
+1.2691738935852181e-12
+30
+695.3025570138116
+11
+5824.056640625
+21
+1.2764076904800414e-12
+31
+799.5525570138116
+12
+5870.345703125
+22
+1.2785918157565135e-12
+32
+831.0291195138116
+13
+5870.345703125
+23
+1.2785918157565135e-12
+33
+831.0291195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6485.814453125
+20
+1.2929927311125522e-12
+30
+1038.5681820138116
+11
+6496.501953125
+21
+1.2877527820129298e-12
+31
+963.0525570138116
+12
+6465.505859375
+22
+1.2900816482794286e-12
+32
+996.6150570138116
+13
+6465.505859375
+23
+1.2900816482794286e-12
+33
+996.6150570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6496.501953125
+20
+1.2877527820129298e-12
+30
+963.0525570138116
+11
+6485.814453125
+21
+1.2929927311125522e-12
+31
+1038.5681820138116
+12
+6519.119140625
+22
+1.2918787133803233e-12
+32
+1022.5134945138116
+13
+6519.119140625
+23
+1.2918787133803233e-12
+33
+1022.5134945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6312.130859375
+20
+1.2841472676883292e-12
+30
+911.0916195138116
+11
+6237.927734375
+21
+1.2770224331118407e-12
+31
+808.4119320138116
+12
+6212.240234375
+22
+1.2821127623116602e-12
+32
+881.7713070138116
+13
+6212.240234375
+23
+1.2821127623116602e-12
+33
+881.7713070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6237.927734375
+20
+1.2770224331118407e-12
+30
+808.4119320138116
+11
+6312.130859375
+21
+1.2841472676883292e-12
+31
+911.0916195138116
+12
+6309.541015625
+22
+1.2700342080090854e-12
+32
+707.7009945138116
+13
+6309.541015625
+23
+1.2700342080090854e-12
+33
+707.7009945138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+6309.541015625
+20
+1.2700342080090854e-12
+30
+707.7009945138116
+11
+6312.130859375
+21
+1.2841472676883292e-12
+31
+911.0916195138116
+12
+6331.888671875
+22
+1.270946564137232e-12
+32
+720.8494320138116
+13
+6331.888671875
+23
+1.270946564137232e-12
+33
+720.8494320138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6331.888671875
+20
+1.270946564137232e-12
+30
+720.8494320138116
+11
+6312.130859375
+21
+1.2841472676883292e-12
+31
+911.0916195138116
+12
+6334.091796875
+22
+1.2763410120464336e-12
+32
+798.5916195138116
+13
+6334.091796875
+23
+1.2763410120464336e-12
+33
+798.5916195138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6331.888671875
+20
+1.270946564137232e-12
+30
+720.8494320138116
+11
+6334.091796875
+21
+1.2763410120464336e-12
+31
+798.5916195138116
+12
+6685.443359375
+22
+1.292293420711299e-12
+32
+1028.4900570138116
+13
+6685.443359375
+23
+1.292293420711299e-12
+33
+1028.4900570138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6685.443359375
+20
+1.292293420711299e-12
+30
+1028.4900570138116
+11
+6334.091796875
+21
+1.2763410120464336e-12
+31
+798.5916195138116
+12
+6496.501953125
+22
+1.2877527820129298e-12
+32
+963.0525570138116
+13
+6496.501953125
+23
+1.2877527820129298e-12
+33
+963.0525570138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6685.443359375
+20
+1.292293420711299e-12
+30
+1028.4900570138116
+11
+6496.501953125
+21
+1.2877527820129298e-12
+31
+963.0525570138116
+12
+6554.263671875
+22
+1.2903646250464473e-12
+32
+1000.6931820138116
+13
+6554.263671875
+23
+1.2903646250464473e-12
+33
+1000.6931820138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+6554.263671875
+20
+1.2903646250464473e-12
+30
+1000.6931820138116
+11
+6496.501953125
+21
+1.2877527820129298e-12
+31
+963.0525570138116
+12
+6519.119140625
+22
+1.2918787133803233e-12
+32
+1022.5134945138116
+13
+6519.119140625
+23
+1.2918787133803233e-12
+33
+1022.5134945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6685.443359375
+20
+1.292293420711299e-12
+30
+1028.4900570138116
+11
+6554.263671875
+21
+1.2903646250464473e-12
+31
+1000.6931820138116
+12
+6638.123046875
+22
+1.2971902198233298e-12
+32
+1099.0603695138116
+13
+6638.123046875
+23
+1.2971902198233298e-12
+33
+1099.0603695138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6157.642578125
+20
+1.2733469877471149e-12
+30
+755.4431820138116
+11
+6332.181640625
+21
+1.2682273850886383e-12
+31
+681.6619320138116
+12
+6155.240234375
+22
+1.2696813002019414e-12
+32
+702.6150570138116
+13
+6155.240234375
+23
+1.2696813002019414e-12
+33
+702.6150570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6332.181640625
+20
+1.2682273850886383e-12
+30
+681.6619320138116
+11
+6157.642578125
+21
+1.2733469877471149e-12
+31
+755.4431820138116
+12
+6309.541015625
+22
+1.2700342080090854e-12
+32
+707.7009945138116
+13
+6309.541015625
+23
+1.2700342080090854e-12
+33
+707.7009945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6309.541015625
+20
+1.2700342080090854e-12
+30
+707.7009945138116
+11
+6157.642578125
+21
+1.2733469877471149e-12
+31
+755.4431820138116
+12
+6237.927734375
+22
+1.2770224331118407e-12
+32
+808.4119320138116
+13
+6237.927734375
+23
+1.2770224331118407e-12
+33
+808.4119320138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6362.978515625
+20
+1.268318458071127e-12
+30
+682.9744320138116
+11
+6618.541015625
+21
+1.2630508618161063e-12
+31
+607.0603695138116
+12
+6332.181640625
+22
+1.2682273850886383e-12
+32
+681.6619320138116
+13
+6332.181640625
+23
+1.2682273850886383e-12
+33
+681.6619320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6618.541015625
+20
+1.2630508618161063e-12
+30
+607.0603695138116
+11
+6362.978515625
+21
+1.268318458071127e-12
+31
+682.9744320138116
+12
+6383.392578125
+22
+1.268738044311879e-12
+32
+689.0213070138116
+13
+6383.392578125
+23
+1.268738044311879e-12
+33
+689.0213070138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6618.541015625
+20
+1.2630508618161063e-12
+30
+607.0603695138116
+11
+6383.392578125
+21
+1.268738044311879e-12
+31
+689.0213070138116
+12
+6524.134765625
+22
+1.2702374959164264e-12
+32
+710.6306820138116
+13
+6524.134765625
+23
+1.2702374959164264e-12
+33
+710.6306820138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6618.541015625
+20
+1.2630508618161063e-12
+30
+607.0603695138116
+11
+6524.134765625
+21
+1.2702374959164264e-12
+31
+710.6306820138116
+12
+6590.462890625
+22
+1.2703464582347612e-12
+32
+712.2009945138116
+13
+6590.462890625
+23
+1.2703464582347612e-12
+33
+712.2009945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7105.326171875
+20
+1.2686518502391664e-12
+30
+687.7791195138116
+11
+7765.408203125
+21
+1.2357305933727303e-12
+31
+213.33380701381157
+12
+6718.443359375
+22
+1.2641697584581113e-12
+32
+623.1853695138116
+13
+6718.443359375
+23
+1.2641697584581113e-12
+33
+623.1853695138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7765.408203125
+20
+1.2357305933727303e-12
+30
+213.33380701381157
+11
+7105.326171875
+21
+1.2686518502391664e-12
+31
+687.7791195138116
+12
+7615.666015625
+22
+1.2769329864326107e-12
+32
+807.1228695138116
+13
+7615.666015625
+23
+1.2769329864326107e-12
+33
+807.1228695138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6718.443359375
+20
+1.2641697584581113e-12
+30
+623.1853695138116
+11
+7988.298828125
+21
+1.2006691214178078e-12
+31
+-291.95525548618843
+12
+6618.541015625
+22
+1.2630508618161063e-12
+32
+607.0603695138116
+13
+6618.541015625
+23
+1.2630508618161063e-12
+33
+607.0603695138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7988.298828125
+20
+1.2006691214178078e-12
+30
+-291.95525548618843
+11
+6718.443359375
+21
+1.2641697584581113e-12
+31
+623.1853695138116
+12
+7821.048828125
+22
+1.2229933862503706e-12
+32
+29.771307013811565
+13
+7821.048828125
+23
+1.2229933862503706e-12
+33
+29.771307013811565
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+7821.048828125
+20
+1.2229933862503706e-12
+30
+29.771307013811565
+11
+6718.443359375
+21
+1.2641697584581113e-12
+31
+623.1853695138116
+12
+7765.408203125
+22
+1.2357305933727303e-12
+32
+213.33380701381157
+13
+7765.408203125
+23
+1.2357305933727303e-12
+33
+213.33380701381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7988.298828125
+20
+1.2006691214178078e-12
+30
+-291.95525548618843
+11
+7821.048828125
+21
+1.2229933862503706e-12
+31
+29.771307013811565
+12
+7992.787109375
+22
+1.2048048106047538e-12
+32
+-232.35369298618843
+13
+7992.787109375
+23
+1.2048048106047538e-12
+33
+-232.35369298618843
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6634.173828125
+20
+1.2863899398821155e-12
+30
+943.4119320138116
+11
+6768.646484375
+21
+1.2721451496389147e-12
+31
+738.1228695138116
+12
+6606.599609375
+22
+1.282478680544874e-12
+32
+887.0447445138116
+13
+6606.599609375
+23
+1.282478680544874e-12
+33
+887.0447445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6768.646484375
+20
+1.2721451496389147e-12
+30
+738.1228695138116
+11
+6634.173828125
+21
+1.2863899398821155e-12
+31
+943.4119320138116
+12
+6671.087890625
+22
+1.2852873062726977e-12
+32
+927.5213070138116
+13
+6671.087890625
+23
+1.2852873062726977e-12
+33
+927.5213070138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6768.646484375
+20
+1.2721451496389147e-12
+30
+738.1228695138116
+11
+6671.087890625
+21
+1.2852873062726977e-12
+31
+927.5213070138116
+12
+6871.326171875
+22
+1.2739275780104808e-12
+32
+763.8103695138116
+13
+6871.326171875
+23
+1.2739275780104808e-12
+33
+763.8103695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6768.646484375
+20
+1.2721451496389147e-12
+30
+738.1228695138116
+11
+6871.326171875
+21
+1.2739275780104808e-12
+31
+763.8103695138116
+12
+6780.435546875
+22
+1.2704505416433198e-12
+32
+713.7009945138116
+13
+6780.435546875
+23
+1.2704505416433198e-12
+33
+713.7009945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6936.927734375
+20
+1.2833845314599857e-12
+30
+900.0994320138116
+11
+6871.326171875
+21
+1.2739275780104808e-12
+31
+763.8103695138116
+12
+6833.580078125
+22
+1.2820948729758141e-12
+32
+881.5134945138116
+13
+6833.580078125
+23
+1.2820948729758141e-12
+33
+881.5134945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6780.435546875
+20
+1.2704505416433198e-12
+30
+713.7009945138116
+11
+6718.443359375
+21
+1.2641697584581113e-12
+31
+623.1853695138116
+12
+6718.443359375
+22
+1.2702212328838391e-12
+32
+710.3963070138116
+13
+6718.443359375
+23
+1.2702212328838391e-12
+33
+710.3963070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6718.443359375
+20
+1.2641697584581113e-12
+30
+623.1853695138116
+11
+6780.435546875
+21
+1.2704505416433198e-12
+31
+713.7009945138116
+12
+7105.326171875
+22
+1.2686518502391664e-12
+32
+687.7791195138116
+13
+7105.326171875
+23
+1.2686518502391664e-12
+33
+687.7791195138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7105.326171875
+20
+1.2686518502391664e-12
+30
+687.7791195138116
+11
+6780.435546875
+21
+1.2704505416433198e-12
+31
+713.7009945138116
+12
+6871.326171875
+22
+1.2739275780104808e-12
+32
+763.8103695138116
+13
+6871.326171875
+23
+1.2739275780104808e-12
+33
+763.8103695138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+7105.326171875
+20
+1.2686518502391664e-12
+30
+687.7791195138116
+11
+6871.326171875
+21
+1.2739275780104808e-12
+31
+763.8103695138116
+12
+6978.025390625
+22
+1.2721175024835163e-12
+32
+737.7244320138116
+13
+6978.025390625
+23
+1.2721175024835163e-12
+33
+737.7244320138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6978.025390625
+20
+1.2721175024835163e-12
+30
+737.7244320138116
+11
+6871.326171875
+21
+1.2739275780104808e-12
+31
+763.8103695138116
+12
+6962.263671875
+22
+1.2739910038375712e-12
+32
+764.7244320138116
+13
+6962.263671875
+23
+1.2739910038375712e-12
+33
+764.7244320138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6962.263671875
+20
+1.2739910038375712e-12
+30
+764.7244320138116
+11
+6871.326171875
+21
+1.2739275780104808e-12
+31
+763.8103695138116
+12
+6936.927734375
+22
+1.2833845314599857e-12
+32
+900.0994320138116
+13
+6936.927734375
+23
+1.2833845314599857e-12
+33
+900.0994320138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7226.310546875
+20
+1.2798359377494406e-12
+30
+848.9588070138116
+11
+7179.599609375
+21
+1.276781740229549e-12
+31
+804.9431820138116
+12
+7179.599609375
+22
+1.2798359377494406e-12
+32
+848.9588070138116
+13
+7179.599609375
+23
+1.2798359377494406e-12
+33
+848.9588070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7268.064453125
+20
+1.280701131083084e-12
+30
+861.4275570138116
+11
+7275.505859375
+21
+1.2779055157813302e-12
+31
+821.1384945138116
+12
+7259.861328125
+22
+1.280084762148026e-12
+32
+852.5447445138116
+13
+7259.861328125
+23
+1.280084762148026e-12
+33
+852.5447445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7275.505859375
+20
+1.2779055157813302e-12
+30
+821.1384945138116
+11
+7268.064453125
+21
+1.280701131083084e-12
+31
+861.4275570138116
+12
+7317.763671875
+22
+1.280725525631965e-12
+32
+861.7791195138116
+13
+7317.763671875
+23
+1.280725525631965e-12
+33
+861.7791195138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7615.666015625
+20
+1.2813256315344357e-12
+30
+870.4275570138116
+11
+7361.591796875
+21
+1.2768207715077584e-12
+31
+805.5056820138116
+12
+7355.685546875
+22
+1.284627027149654e-12
+32
+918.0056820138116
+13
+7355.685546875
+23
+1.284627027149654e-12
+33
+918.0056820138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7042.431640625
+20
+1.2758726367079198e-12
+30
+791.8416195138116
+11
+7100.298828125
+21
+1.2742463334491916e-12
+31
+768.4041195138116
+12
+7009.208984375
+22
+1.2742463334491916e-12
+32
+768.4041195138116
+13
+7009.208984375
+23
+1.2742463334491916e-12
+33
+768.4041195138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7100.298828125
+20
+1.2742463334491916e-12
+30
+768.4041195138116
+11
+7042.431640625
+21
+1.2758726367079198e-12
+31
+791.8416195138116
+12
+7179.599609375
+22
+1.276781740229549e-12
+32
+804.9431820138116
+13
+7179.599609375
+23
+1.276781740229549e-12
+33
+804.9431820138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7100.298828125
+20
+1.2742463334491916e-12
+30
+768.4041195138116
+11
+7179.599609375
+21
+1.276781740229549e-12
+31
+804.9431820138116
+12
+7105.326171875
+22
+1.2686518502391664e-12
+32
+687.7791195138116
+13
+7105.326171875
+23
+1.2686518502391664e-12
+33
+687.7791195138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7105.326171875
+20
+1.2686518502391664e-12
+30
+687.7791195138116
+11
+7179.599609375
+21
+1.276781740229549e-12
+31
+804.9431820138116
+12
+7226.310546875
+22
+1.276045024853345e-12
+32
+794.3259945138116
+13
+7226.310546875
+23
+1.276045024853345e-12
+33
+794.3259945138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+7105.326171875
+20
+1.2686518502391664e-12
+30
+687.7791195138116
+11
+7226.310546875
+21
+1.276045024853345e-12
+31
+794.3259945138116
+12
+7615.666015625
+22
+1.2769329864326107e-12
+32
+807.1228695138116
+13
+7615.666015625
+23
+1.2769329864326107e-12
+33
+807.1228695138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7226.310546875
+20
+1.276045024853345e-12
+30
+794.3259945138116
+11
+7179.599609375
+21
+1.276781740229549e-12
+31
+804.9431820138116
+12
+7226.310546875
+22
+1.2798359377494406e-12
+32
+848.9588070138116
+13
+7226.310546875
+23
+1.2798359377494406e-12
+33
+848.9588070138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7615.666015625
+20
+1.2769329864326107e-12
+30
+807.1228695138116
+11
+7226.310546875
+21
+1.276045024853345e-12
+31
+794.3259945138116
+12
+7361.591796875
+22
+1.2768207715077584e-12
+32
+805.5056820138116
+13
+7361.591796875
+23
+1.2768207715077584e-12
+33
+805.5056820138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+7361.591796875
+20
+1.2768207715077584e-12
+30
+805.5056820138116
+11
+7226.310546875
+21
+1.276045024853345e-12
+31
+794.3259945138116
+12
+7317.763671875
+22
+1.2768207715077584e-12
+32
+805.5056820138116
+13
+7317.763671875
+23
+1.2768207715077584e-12
+33
+805.5056820138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7317.763671875
+20
+1.2768207715077584e-12
+30
+805.5056820138116
+11
+7226.310546875
+21
+1.276045024853345e-12
+31
+794.3259945138116
+12
+7275.505859375
+22
+1.2779055157813302e-12
+32
+821.1384945138116
+13
+7275.505859375
+23
+1.2779055157813302e-12
+33
+821.1384945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7317.763671875
+20
+1.2768207715077584e-12
+30
+805.5056820138116
+11
+7275.505859375
+21
+1.2779055157813302e-12
+31
+821.1384945138116
+12
+7317.763671875
+22
+1.280725525631965e-12
+32
+861.7791195138116
+13
+7317.763671875
+23
+1.280725525631965e-12
+33
+861.7791195138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7615.666015625
+20
+1.2769329864326107e-12
+30
+807.1228695138116
+11
+7361.591796875
+21
+1.2768207715077584e-12
+31
+805.5056820138116
+12
+7615.666015625
+22
+1.2813256315344357e-12
+32
+870.4275570138116
+13
+7615.666015625
+23
+1.2813256315344357e-12
+33
+870.4275570138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7674.306640625
+20
+1.2769329864326107e-12
+30
+807.1228695138116
+11
+7765.408203125
+21
+1.2357305933727303e-12
+31
+213.33380701381157
+12
+7615.666015625
+22
+1.2769329864326107e-12
+32
+807.1228695138116
+13
+7615.666015625
+23
+1.2769329864326107e-12
+33
+807.1228695138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7765.408203125
+20
+1.2357305933727303e-12
+30
+213.33380701381157
+11
+7674.306640625
+21
+1.2769329864326107e-12
+31
+807.1228695138116
+12
+7676.052734375
+22
+1.2789528550799512e-12
+32
+836.2322445138116
+13
+7676.052734375
+23
+1.2789528550799512e-12
+33
+836.2322445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7765.408203125
+20
+1.2357305933727303e-12
+30
+213.33380701381157
+11
+7676.052734375
+21
+1.2789528550799512e-12
+31
+836.2322445138116
+12
+7761.986328125
+22
+1.2789528550799512e-12
+32
+836.2322445138116
+13
+7761.986328125
+23
+1.2789528550799512e-12
+33
+836.2322445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7765.408203125
+20
+1.2357305933727303e-12
+30
+213.33380701381157
+11
+7761.986328125
+21
+1.2789528550799512e-12
+31
+836.2322445138116
+12
+7820.263671875
+22
+1.2760011146653594e-12
+32
+793.6931820138116
+13
+7820.263671875
+23
+1.2760011146653594e-12
+33
+793.6931820138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7765.408203125
+20
+1.2357305933727303e-12
+30
+213.33380701381157
+11
+7820.263671875
+21
+1.2760011146653594e-12
+31
+793.6931820138116
+12
+7985.404296875
+22
+1.2705676354779483e-12
+32
+715.3884945138116
+13
+7985.404296875
+23
+1.2705676354779483e-12
+33
+715.3884945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7985.404296875
+20
+1.2705676354779483e-12
+30
+715.3884945138116
+11
+7820.263671875
+21
+1.2760011146653594e-12
+31
+793.6931820138116
+12
+7842.025390625
+22
+1.2792455896665222e-12
+32
+840.4509945138116
+13
+7842.025390625
+23
+1.2792455896665222e-12
+33
+840.4509945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7985.404296875
+20
+1.2705676354779483e-12
+30
+715.3884945138116
+11
+7842.025390625
+21
+1.2792455896665222e-12
+31
+840.4509945138116
+12
+7902.083984375
+22
+1.2772826416332372e-12
+32
+812.1619320138116
+13
+7902.083984375
+23
+1.2772826416332372e-12
+33
+812.1619320138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7985.404296875
+20
+1.2705676354779483e-12
+30
+715.3884945138116
+11
+7902.083984375
+21
+1.2772826416332372e-12
+31
+812.1619320138116
+12
+7907.181640625
+22
+1.2805368744539525e-12
+32
+859.0603695138116
+13
+7907.181640625
+23
+1.2805368744539525e-12
+33
+859.0603695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7985.404296875
+20
+1.2705676354779483e-12
+30
+715.3884945138116
+11
+7907.181640625
+21
+1.2805368744539525e-12
+31
+859.0603695138116
+12
+7915.419921875
+22
+1.2803970123737018e-12
+32
+857.0447445138116
+13
+7915.419921875
+23
+1.2803970123737018e-12
+33
+857.0447445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7985.404296875
+20
+1.2705676354779483e-12
+30
+715.3884945138116
+11
+7915.419921875
+21
+1.2803970123737018e-12
+31
+857.0447445138116
+12
+7935.376953125
+22
+1.2781868662450901e-12
+32
+825.1931820138116
+13
+7935.376953125
+23
+1.2781868662450901e-12
+33
+825.1931820138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+7985.404296875
+20
+1.2705676354779483e-12
+30
+715.3884945138116
+11
+7935.376953125
+21
+1.2781868662450901e-12
+31
+825.1931820138116
+12
+7985.404296875
+22
+1.2758872734372484e-12
+32
+792.0525570138116
+13
+7985.404296875
+23
+1.2758872734372484e-12
+33
+792.0525570138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7985.404296875
+20
+1.2705676354779483e-12
+30
+715.3884945138116
+11
+7810.326171875
+21
+1.2375292847768837e-12
+31
+239.25568201381157
+12
+7765.408203125
+22
+1.2357305933727303e-12
+32
+213.33380701381157
+13
+7765.408203125
+23
+1.2357305933727303e-12
+33
+213.33380701381157
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+7810.326171875
+20
+1.2375292847768837e-12
+30
+239.25568201381157
+11
+7985.404296875
+21
+1.2705676354779483e-12
+31
+715.3884945138116
+12
+8244.787109375
+22
+1.2496452440544092e-12
+32
+413.86505701381157
+13
+8244.787109375
+23
+1.2496452440544092e-12
+33
+413.86505701381157
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+8244.787109375
+20
+1.2496452440544092e-12
+30
+413.86505701381157
+11
+7985.404296875
+21
+1.2705676354779483e-12
+31
+715.3884945138116
+12
+8074.853515625
+22
+1.2719776404032657e-12
+32
+735.7088070138116
+13
+8074.853515625
+23
+1.2719776404032657e-12
+33
+735.7088070138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+8244.787109375
+20
+1.2496452440544092e-12
+30
+413.86505701381157
+11
+8074.853515625
+21
+1.2719776404032657e-12
+31
+735.7088070138116
+12
+8082.541015625
+22
+1.2749586542765146e-12
+32
+778.6697445138116
+13
+8082.541015625
+23
+1.2749586542765146e-12
+33
+778.6697445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+8244.787109375
+20
+1.2496452440544092e-12
+30
+413.86505701381157
+11
+8082.541015625
+21
+1.2749586542765146e-12
+31
+778.6697445138116
+12
+8125.431640625
+22
+1.272083350115083e-12
+32
+737.2322445138116
+13
+8125.431640625
+23
+1.272083350115083e-12
+33
+737.2322445138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+8125.431640625
+20
+1.272083350115083e-12
+30
+737.2322445138116
+11
+8082.541015625
+21
+1.2749586542765146e-12
+31
+778.6697445138116
+12
+8120.849609375
+22
+1.2773655830994324e-12
+32
+813.3572445138116
+13
+8120.849609375
+23
+1.2773655830994324e-12
+33
+813.3572445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+8244.787109375
+20
+1.2496452440544092e-12
+30
+413.86505701381157
+11
+8125.431640625
+21
+1.272083350115083e-12
+31
+737.2322445138116
+12
+8189.017578125
+22
+1.272083350115083e-12
+32
+737.2322445138116
+13
+8189.017578125
+23
+1.272083350115083e-12
+33
+737.2322445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+8244.787109375
+20
+1.2496452440544092e-12
+30
+413.86505701381157
+11
+8189.017578125
+21
+1.272083350115083e-12
+31
+737.2322445138116
+12
+8250.822265625
+22
+1.272909512170517e-12
+32
+749.1384945138116
+13
+8250.822265625
+23
+1.272909512170517e-12
+33
+749.1384945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+8244.787109375
+20
+1.2496452440544092e-12
+30
+413.86505701381157
+11
+8250.822265625
+21
+1.272909512170517e-12
+31
+749.1384945138116
+12
+8260.619140625
+22
+1.2507429987540508e-12
+32
+429.68536951381157
+13
+8260.619140625
+23
+1.2507429987540508e-12
+33
+429.68536951381157
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+8260.619140625
+20
+1.2507429987540508e-12
+30
+429.68536951381157
+11
+8250.822265625
+21
+1.272909512170517e-12
+31
+749.1384945138116
+12
+8382.341796875
+22
+1.2759441940513039e-12
+32
+792.8728695138116
+13
+8382.341796875
+23
+1.2759441940513039e-12
+33
+792.8728695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+8260.619140625
+20
+1.2507429987540508e-12
+30
+429.68536951381157
+11
+8382.341796875
+21
+1.2759441940513039e-12
+31
+792.8728695138116
+12
+8334.541015625
+22
+1.2574010842952843e-12
+32
+525.6384945138116
+13
+8334.541015625
+23
+1.2574010842952843e-12
+33
+525.6384945138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+8334.541015625
+20
+1.2574010842952843e-12
+30
+525.6384945138116
+11
+8382.341796875
+21
+1.2759441940513039e-12
+31
+792.8728695138116
+12
+8442.822265625
+22
+1.2649357472929723e-12
+32
+634.2244320138116
+13
+8442.822265625
+23
+1.2649357472929723e-12
+33
+634.2244320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+8376.201171875
+20
+1.3020479876571511e-12
+30
+1169.0681820138116
+11
+8250.822265625
+21
+1.272909512170517e-12
+31
+749.1384945138116
+12
+8189.017578125
+22
+1.272083350115083e-12
+32
+737.2322445138116
+13
+8189.017578125
+23
+1.272083350115083e-12
+33
+737.2322445138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+8250.822265625
+20
+1.272909512170517e-12
+30
+749.1384945138116
+11
+8376.201171875
+21
+1.3020479876571511e-12
+31
+1169.0681820138116
+12
+8411.404296875
+22
+1.3032075418806244e-12
+32
+1185.7791195138116
+13
+8411.404296875
+23
+1.3032075418806244e-12
+33
+1185.7791195138116
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+8411.404296875
+20
+1.3032075418806244e-12
+30
+1185.7791195138116
+11
+8376.201171875
+21
+1.3020479876571511e-12
+31
+1169.0681820138116
+12
+8405.404296875
+22
+1.3039003470688426e-12
+32
+1195.7634945138116
+13
+8405.404296875
+23
+1.3039003470688426e-12
+33
+1195.7634945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+8411.404296875
+20
+1.3032075418806244e-12
+30
+1185.7791195138116
+11
+8405.404296875
+21
+1.3039003470688426e-12
+31
+1195.7634945138116
+12
+8410.115234375
+22
+1.3035620759910271e-12
+32
+1190.8884945138116
+13
+8410.115234375
+23
+1.3035620759910271e-12
+33
+1190.8884945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5147.732421875
+20
+1.2791106064960478e-12
+30
+838.5056820138116
+11
+5050.900390625
+21
+4.516144876606367e-13
+31
+-334.0280102867964
+12
+5050.900390625
+22
+1.2774777980242846e-12
+32
+814.9744320138116
+13
+5050.900390625
+23
+1.2774777980242846e-12
+33
+814.9744320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+4.516144876606367e-13
+30
+-334.0280102867964
+11
+5147.732421875
+21
+1.2791106064960478e-12
+31
+838.5056820138116
+12
+6448.18009835036
+22
+8.086549426529305e-13
+32
+-317.88275787443763
+13
+6448.18009835036
+23
+8.086549426529305e-13
+33
+-317.88275787443763
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+5147.732421875
+21
+1.2791106064960478e-12
+31
+838.5056820138116
+12
+5298.716796875
+22
+1.2752904201412951e-12
+32
+783.4509945138116
+13
+5298.716796875
+23
+1.2752904201412951e-12
+33
+783.4509945138116
+70
+15
+ 0
+3DFACE
+ 8
+ship5
+10
+5298.716796875
+20
+1.2752904201412951e-12
+30
+783.4509945138116
+11
+5147.732421875
+21
+1.2791106064960478e-12
+31
+838.5056820138116
+12
+5243.755859375
+22
+1.2791284958318938e-12
+32
+838.7634945138116
+13
+5243.755859375
+23
+1.2791284958318938e-12
+33
+838.7634945138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+5298.716796875
+21
+1.2752904201412951e-12
+31
+783.4509945138116
+12
+5389.068359375
+22
+1.2752904201412951e-12
+32
+783.4509945138116
+13
+5389.068359375
+23
+1.2752904201412951e-12
+33
+783.4509945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+5389.068359375
+21
+1.2752904201412951e-12
+31
+783.4509945138116
+12
+5495.181640625
+22
+1.2728038024586996e-12
+32
+747.6150570138116
+13
+5495.181640625
+23
+1.2728038024586996e-12
+33
+747.6150570138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+5495.181640625
+21
+1.2728038024586996e-12
+31
+747.6150570138116
+12
+5615.474609375
+22
+1.2741910391383948e-12
+32
+767.6072445138116
+13
+5615.474609375
+23
+1.2741910391383948e-12
+33
+767.6072445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+5615.474609375
+21
+1.2741910391383948e-12
+31
+767.6072445138116
+12
+5650.513671875
+22
+1.2747797609180544e-12
+32
+776.0916195138116
+13
+5650.513671875
+23
+1.2747797609180544e-12
+33
+776.0916195138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+5650.513671875
+21
+1.2747797609180544e-12
+31
+776.0916195138116
+12
+5961.458984375
+22
+1.2691738935852181e-12
+32
+695.3025570138116
+13
+5961.458984375
+23
+1.2691738935852181e-12
+33
+695.3025570138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+5961.458984375
+21
+1.2691738935852181e-12
+31
+695.3025570138116
+12
+6010.466796875
+22
+1.2680354813041084e-12
+32
+678.8963070138116
+13
+6010.466796875
+23
+1.2680354813041084e-12
+33
+678.8963070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+3878.744140625
+20
+1.277768906307597e-12
+30
+819.1697445138116
+11
+5050.900390625
+21
+4.516144876606367e-13
+31
+-334.0280102867964
+12
+3212.896745144124
+22
+8.685692946118428e-13
+32
+-355.26572856685834
+13
+3212.896745144124
+23
+8.685692946118428e-13
+33
+-355.26572856685834
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+4.516144876606367e-13
+30
+-334.0280102867964
+11
+3878.744140625
+21
+1.277768906307597e-12
+31
+819.1697445138116
+12
+4246.876953125
+22
+1.27529692535433e-12
+32
+783.5447445138116
+13
+4246.876953125
+23
+1.27529692535433e-12
+33
+783.5447445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+4.516144876606367e-13
+30
+-334.0280102867964
+11
+4246.876953125
+21
+1.27529692535433e-12
+31
+783.5447445138116
+12
+4279.724609375
+22
+1.27529692535433e-12
+32
+783.5447445138116
+13
+4279.724609375
+23
+1.27529692535433e-12
+33
+783.5447445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+4.516144876606367e-13
+30
+-334.0280102867964
+11
+4279.724609375
+21
+1.27529692535433e-12
+31
+783.5447445138116
+12
+4365.330078125
+22
+1.2743536694642676e-12
+32
+769.9509945138116
+13
+4365.330078125
+23
+1.2743536694642676e-12
+33
+769.9509945138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+4.516144876606367e-13
+30
+-334.0280102867964
+11
+4365.330078125
+21
+1.2743536694642676e-12
+31
+769.9509945138116
+12
+4720.548828125
+22
+1.2751017689632826e-12
+32
+780.7322445138116
+13
+4720.548828125
+23
+1.2751017689632826e-12
+33
+780.7322445138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+5050.900390625
+20
+4.516144876606367e-13
+30
+-334.0280102867964
+11
+4720.548828125
+21
+1.2751017689632826e-12
+31
+780.7322445138116
+12
+5050.900390625
+22
+1.2774777980242846e-12
+32
+814.9744320138116
+13
+5050.900390625
+23
+1.2774777980242846e-12
+33
+814.9744320138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6155.240234375
+20
+1.2696813002019414e-12
+30
+702.6150570138116
+11
+6448.18009835036
+21
+8.086549426529305e-13
+31
+-317.88275787443763
+12
+6010.466796875
+22
+1.2680354813041084e-12
+32
+678.8963070138116
+13
+6010.466796875
+23
+1.2680354813041084e-12
+33
+678.8963070138116
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+6155.240234375
+21
+1.2696813002019414e-12
+31
+702.6150570138116
+12
+6332.181640625
+22
+1.2682273850886383e-12
+32
+681.6619320138116
+13
+6332.181640625
+23
+1.2682273850886383e-12
+33
+681.6619320138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+6332.181640625
+21
+1.2682273850886383e-12
+31
+681.6619320138116
+12
+6618.541015625
+22
+1.2630508618161063e-12
+32
+607.0603695138116
+13
+6618.541015625
+23
+1.2630508618161063e-12
+33
+607.0603695138116
+70
+13
+ 0
+3DFACE
+ 8
+ship5
+10
+6448.18009835036
+20
+8.086549426529305e-13
+30
+-317.88275787443763
+11
+6618.541015625
+21
+1.2630508618161063e-12
+31
+607.0603695138116
+12
+7980.095703125
+22
+1.2000982889739942e-12
+32
+-300.18181798618843
+13
+7980.095703125
+23
+1.2000982889739942e-12
+33
+-300.18181798618843
+70
+3
+ 0
+3DFACE
+ 8
+ship5
+10
+7980.095703125
+20
+1.2000982889739942e-12
+30
+-300.18181798618843
+11
+6618.541015625
+21
+1.2630508618161063e-12
+31
+607.0603695138116
+12
+7988.298828125
+22
+1.2006691214178078e-12
+32
+-291.95525548618843
+13
+7988.298828125
+23
+1.2006691214178078e-12
+33
+-291.95525548618843
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5915.615234375
+20
+1.39301038152434e-12
+30
+2479.9744320138125
+11
+5661.927734375
+21
+1.3689362143853856e-12
+31
+2133.0291195138125
+12
+5661.927734375
+22
+1.3745241923823759e-12
+32
+2213.5603695138125
+13
+5661.927734375
+23
+1.3745241923823759e-12
+33
+2213.5603695138125
+70
+1
+ 0
+3DFACE
+ 8
+ship5
+10
+5661.927734375
+20
+1.3689362143853856e-12
+30
+2133.0291195138125
+11
+5915.615234375
+21
+1.39301038152434e-12
+31
+2479.9744320138125
+12
+5948.357421875
+22
+1.3888112665103036e-12
+32
+2419.4588070138125
+13
+5948.357421875
+23
+1.3888112665103036e-12
+33
+2419.4588070138125
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2602.564453125
+20
+2.2007835007512032e-13
+30
+1624.3351834406803
+11
+2785.658203125
+21
+2.0824862017113098e-13
+31
+1453.8508084406803
+12
+2553.9609375
+22
+2.1834633710457473e-13
+32
+1599.3742459406803
+13
+2553.9609375
+23
+2.1834633710457473e-13
+33
+1599.3742459406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2785.658203125
+20
+2.0824862017113098e-13
+30
+1453.8508084406803
+11
+2602.564453125
+21
+2.2007835007512032e-13
+31
+1624.3351834406803
+12
+2952.498046875
+22
+2.0599619015779235e-13
+32
+1421.3898709406803
+13
+2952.498046875
+23
+2.0599619015779235e-13
+33
+1421.3898709406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2101.505859375
+20
+1.8763278691186224e-13
+30
+1156.7453396906803
+11
+2543.0390625
+21
+9.111046877889606e-14
+31
+-234.2878634343192
+12
+2091.193359375
+22
+1.834149694103505e-13
+32
+1095.9601834406803
+13
+2091.193359375
+23
+1.834149694103505e-13
+33
+1095.9601834406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2101.505859375
+21
+1.8763278691186224e-13
+31
+1156.7453396906803
+12
+2200.107421875
+22
+1.8763278691186224e-13
+32
+1156.7453396906803
+13
+2200.107421875
+23
+1.8763278691186224e-13
+33
+1156.7453396906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2200.107421875
+21
+1.8763278691186224e-13
+31
+1156.7453396906803
+12
+2238.486328125
+22
+1.8280266623343932e-13
+32
+1087.1359646906803
+13
+2238.486328125
+23
+1.8280266623343932e-13
+33
+1087.1359646906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2238.486328125
+21
+1.8280266623343932e-13
+31
+1087.1359646906803
+12
+2333.748046875
+22
+1.8353450269986703e-13
+32
+1097.6828396906803
+13
+2333.748046875
+23
+1.8353450269986703e-13
+33
+1097.6828396906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2333.748046875
+21
+1.8353450269986703e-13
+31
+1097.6828396906803
+12
+2334.052734375
+22
+1.8953474857294493e-13
+32
+1184.1554959406803
+13
+2334.052734375
+23
+1.8953474857294493e-13
+33
+1184.1554959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2334.052734375
+21
+1.8953474857294493e-13
+31
+1184.1554959406803
+12
+2352.427734375
+22
+2.048480200571302e-13
+32
+1404.8429959406803
+13
+2352.427734375
+23
+2.048480200571302e-13
+33
+1404.8429959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2352.427734375
+21
+2.048480200571302e-13
+31
+1404.8429959406803
+12
+2439.4453125
+22
+2.092504229785076e-13
+32
+1468.2883084406803
+13
+2439.4453125
+23
+2.092504229785076e-13
+33
+1468.2883084406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2439.4453125
+21
+2.092504229785076e-13
+31
+1468.2883084406803
+12
+2542.693359375
+22
+2.115418842700557e-13
+32
+1501.3117459406803
+13
+2542.693359375
+23
+2.115418842700557e-13
+33
+1501.3117459406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2542.693359375
+21
+2.115418842700557e-13
+31
+1501.3117459406803
+12
+2785.658203125
+22
+2.0824862017113098e-13
+32
+1453.8508084406803
+13
+2785.658203125
+23
+2.0824862017113098e-13
+33
+1453.8508084406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2543.0390625
+20
+9.111046877889606e-14
+30
+-234.2878634343192
+11
+2785.658203125
+21
+2.0824862017113098e-13
+31
+1453.8508084406803
+12
+3059.44921875
+22
+9.531974818829947e-14
+32
+-173.6257540593192
+13
+3059.44921875
+23
+9.531974818829947e-14
+33
+-173.6257540593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3059.44921875
+20
+9.531974818829947e-14
+30
+-173.6257540593192
+11
+2785.658203125
+21
+2.0824862017113098e-13
+31
+1453.8508084406803
+12
+2952.498046875
+22
+2.0599619015779235e-13
+32
+1421.3898709406803
+13
+2952.498046875
+23
+2.0599619015779235e-13
+33
+1421.3898709406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+1227.357421875
+20
+1.6886280785125006e-13
+30
+886.2414334406803
+11
+2026.62890625
+21
+8.690118936949265e-14
+31
+-294.9499728093192
+12
+1208.15625
+22
+1.6348462297463572e-13
+32
+808.7336209406803
+13
+1208.15625
+23
+1.6348462297463572e-13
+33
+808.7336209406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1227.357421875
+21
+1.6886280785125006e-13
+31
+886.2414334406803
+12
+1352.15625
+22
+1.6889939967457145e-13
+32
+886.7687771906803
+13
+1352.15625
+23
+1.6889939967457145e-13
+33
+886.7687771906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1352.15625
+21
+1.6889939967457145e-13
+31
+886.7687771906803
+12
+1440.43359375
+22
+1.637659734383957e-13
+32
+812.7883084406803
+13
+1440.43359375
+23
+1.637659734383957e-13
+33
+812.7883084406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1440.43359375
+21
+1.637659734383957e-13
+31
+812.7883084406803
+12
+1500.7734375
+22
+1.6950519763844773e-13
+32
+895.4992459406803
+13
+1500.7734375
+23
+1.6950519763844773e-13
+33
+895.4992459406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1500.7734375
+21
+1.6950519763844773e-13
+31
+895.4992459406803
+12
+1656.275390625
+22
+1.5927818959593508e-13
+32
+748.1125271906803
+13
+1656.275390625
+23
+1.5927818959593508e-13
+33
+748.1125271906803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+1656.275390625
+20
+1.5927818959593508e-13
+30
+748.1125271906803
+11
+1500.7734375
+21
+1.6950519763844773e-13
+31
+895.4992459406803
+12
+1629.55078125
+22
+1.6792768347748132e-13
+32
+872.7648709406803
+13
+1629.55078125
+23
+1.6792768347748132e-13
+33
+872.7648709406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1656.275390625
+21
+1.5927818959593508e-13
+31
+748.1125271906803
+12
+1728.931640625
+22
+1.6842045336487598e-13
+32
+879.8664334406803
+13
+1728.931640625
+23
+1.6842045336487598e-13
+33
+879.8664334406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1728.931640625
+21
+1.6842045336487598e-13
+31
+879.8664334406803
+12
+1797.140625
+22
+1.5931803402577393e-13
+32
+748.6867459406803
+13
+1797.140625
+23
+1.5931803402577393e-13
+33
+748.6867459406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1797.140625
+21
+1.5931803402577393e-13
+31
+748.6867459406803
+12
+1908.890625
+22
+1.6961090735026506e-13
+32
+897.0226834406803
+13
+1908.890625
+23
+1.6961090735026506e-13
+33
+897.0226834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1908.890625
+21
+1.6961090735026506e-13
+31
+897.0226834406803
+12
+1909.03125
+22
+1.802233492650963e-13
+32
+1049.9640896906803
+13
+1909.03125
+23
+1.802233492650963e-13
+33
+1049.9640896906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+1909.03125
+21
+1.802233492650963e-13
+31
+1049.9640896906803
+12
+2091.193359375
+22
+1.834149694103505e-13
+32
+1095.9601834406803
+13
+2091.193359375
+23
+1.834149694103505e-13
+33
+1095.9601834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+2091.193359375
+21
+1.834149694103505e-13
+31
+1095.9601834406803
+12
+2543.0390625
+22
+9.111046877889606e-14
+32
+-234.2878634343192
+13
+2543.0390625
+23
+9.111046877889606e-14
+33
+-234.2878634343192
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+312.5859375
+20
+1.7485654851129305e-13
+30
+972.6203396906803
+11
+314.244140625
+21
+1.6478810503650642e-13
+31
+827.5187771906803
+12
+271.4296875
+22
+1.69063656303703e-13
+32
+889.1359646906803
+13
+271.4296875
+23
+1.69063656303703e-13
+33
+889.1359646906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+314.244140625
+20
+1.6478810503650642e-13
+30
+827.5187771906803
+11
+312.5859375
+21
+1.7485654851129305e-13
+31
+972.6203396906803
+12
+488.26171875
+22
+1.6650954703587028e-13
+32
+852.3273709406803
+13
+488.26171875
+23
+1.6650954703587028e-13
+33
+852.3273709406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+314.244140625
+20
+1.6478810503650642e-13
+30
+827.5187771906803
+11
+488.26171875
+21
+1.6650954703587028e-13
+31
+852.3273709406803
+12
+337.6171875
+22
+1.0867576370060528e-13
+32
+18.854714690680794
+13
+337.6171875
+23
+1.0867576370060528e-13
+33
+18.854714690680794
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+337.6171875
+20
+1.0867576370060528e-13
+30
+18.854714690680794
+11
+488.26171875
+21
+1.6650954703587028e-13
+31
+852.3273709406803
+12
+440.033203125
+22
+8.526512829121202e-14
+32
+-318.5280978093192
+13
+440.033203125
+23
+8.526512829121202e-14
+33
+-318.5280978093192
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+440.033203125
+20
+8.526512829121202e-14
+30
+-318.5280978093192
+11
+488.26171875
+21
+1.6650954703587028e-13
+31
+852.3273709406803
+12
+521.47265625
+22
+1.6189897729737567e-13
+32
+785.8820584406803
+13
+521.47265625
+23
+1.6189897729737567e-13
+33
+785.8820584406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+261.24609375
+20
+1.0091911030810086e-13
+30
+-92.9304415593192
+11
+279.169921875
+21
+9.183458030484482e-14
+31
+-223.8523165593192
+12
+219.064453125
+22
+9.943429543288196e-14
+32
+-114.3288790593192
+13
+219.064453125
+23
+9.943429543288196e-14
+33
+-114.3288790593192
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+279.169921875
+20
+9.183458030484482e-14
+30
+-223.8523165593192
+11
+261.24609375
+21
+1.0091911030810086e-13
+31
+-92.9304415593192
+12
+337.6171875
+22
+1.0867576370060528e-13
+32
+18.854714690680794
+13
+337.6171875
+23
+1.0867576370060528e-13
+33
+18.854714690680794
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+279.169921875
+20
+9.183458030484482e-14
+30
+-223.8523165593192
+11
+337.6171875
+21
+1.0867576370060528e-13
+31
+18.854714690680794
+12
+440.033203125
+22
+8.526512829121202e-14
+32
+-318.5280978093192
+13
+440.033203125
+23
+8.526512829121202e-14
+33
+-318.5280978093192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+82.0078125
+20
+1.6865301473087412e-13
+30
+883.2179959406803
+11
+128.4375
+21
+1.5752015577324984e-13
+31
+722.7765896906803
+12
+57.45703125
+22
+1.600913412252992e-13
+32
+759.8312771906803
+13
+57.45703125
+23
+1.600913412252992e-13
+33
+759.8312771906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+128.4375
+20
+1.5752015577324984e-13
+30
+722.7765896906803
+11
+82.0078125
+21
+1.6865301473087412e-13
+31
+883.2179959406803
+12
+190.86328125
+22
+1.6865301473087412e-13
+32
+883.2179959406803
+13
+190.86328125
+23
+1.6865301473087412e-13
+33
+883.2179959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+128.4375
+20
+1.5752015577324984e-13
+30
+722.7765896906803
+11
+190.86328125
+21
+1.6865301473087412e-13
+31
+883.2179959406803
+12
+153.064453125
+22
+1.4962933236190034e-13
+32
+609.0578396906803
+13
+153.064453125
+23
+1.4962933236190034e-13
+33
+609.0578396906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+153.064453125
+20
+1.4962933236190034e-13
+30
+609.0578396906803
+11
+190.86328125
+21
+1.6865301473087412e-13
+31
+883.2179959406803
+12
+280.359375
+22
+1.2769700661469097e-13
+32
+292.9797146906808
+13
+280.359375
+23
+1.2769700661469097e-13
+33
+292.9797146906808
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+280.359375
+20
+1.2769700661469097e-13
+30
+292.9797146906808
+11
+190.86328125
+21
+1.6865301473087412e-13
+31
+883.2179959406803
+12
+265.3125
+22
+1.6361147462881652e-13
+32
+810.5617459406803
+13
+265.3125
+23
+1.6361147462881652e-13
+33
+810.5617459406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+280.359375
+20
+1.2769700661469097e-13
+30
+292.9797146906808
+11
+265.3125
+21
+1.6361147462881652e-13
+31
+810.5617459406803
+12
+314.244140625
+22
+1.6478810503650642e-13
+32
+827.5187771906803
+13
+314.244140625
+23
+1.6478810503650642e-13
+33
+827.5187771906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+280.359375
+20
+1.2769700661469097e-13
+30
+292.9797146906808
+11
+314.244140625
+21
+1.6478810503650642e-13
+31
+827.5187771906803
+12
+337.6171875
+22
+1.0867576370060528e-13
+32
+18.854714690680794
+13
+337.6171875
+23
+1.0867576370060528e-13
+33
+18.854714690680794
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+905.958984375
+20
+1.692108367486179e-13
+30
+891.2570584406803
+11
+889.142578125
+21
+1.5998319205859378e-13
+31
+758.2726834406803
+12
+824.232421875
+22
+1.692108367486179e-13
+32
+891.2570584406803
+13
+824.232421875
+23
+1.692108367486179e-13
+33
+891.2570584406803
+70
+2
+ 0
+3DFACE
+ 8
+ship4
+10
+521.47265625
+20
+1.6189897729737567e-13
+30
+785.8820584406803
+11
+2026.62890625
+21
+8.690118936949265e-14
+31
+-294.9499728093192
+12
+440.033203125
+22
+8.526512829121202e-14
+32
+-318.5280978093192
+13
+440.033203125
+23
+8.526512829121202e-14
+33
+-318.5280978093192
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+521.47265625
+21
+1.6189897729737567e-13
+31
+785.8820584406803
+12
+784.634765625
+22
+1.6009947274159285e-13
+32
+759.9484646906803
+13
+784.634765625
+23
+1.6009947274159285e-13
+33
+759.9484646906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+784.634765625
+21
+1.6009947274159285e-13
+31
+759.9484646906803
+12
+889.142578125
+22
+1.5998319205859378e-13
+32
+758.2726834406803
+13
+889.142578125
+23
+1.5998319205859378e-13
+33
+758.2726834406803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+889.142578125
+20
+1.5998319205859378e-13
+30
+758.2726834406803
+11
+784.634765625
+21
+1.6009947274159285e-13
+31
+759.9484646906803
+12
+824.232421875
+22
+1.692108367486179e-13
+32
+891.2570584406803
+13
+824.232421875
+23
+1.692108367486179e-13
+33
+891.2570584406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2026.62890625
+20
+8.690118936949265e-14
+30
+-294.9499728093192
+11
+889.142578125
+21
+1.5998319205859378e-13
+31
+758.2726834406803
+12
+1208.15625
+22
+1.6348462297463572e-13
+32
+808.7336209406803
+13
+1208.15625
+23
+1.6348462297463572e-13
+33
+808.7336209406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2815.6171875
+20
+2.175014725616654e-13
+30
+1587.1984646906803
+11
+2925.33984375
+21
+2.0974156656264352e-13
+31
+1475.3664334406803
+12
+2772.814453125
+22
+2.1755676687246216e-13
+32
+1587.9953396906803
+13
+2772.814453125
+23
+2.1755676687246216e-13
+33
+1587.9953396906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+2925.33984375
+20
+2.0974156656264352e-13
+30
+1475.3664334406803
+11
+2815.6171875
+21
+2.175014725616654e-13
+31
+1587.1984646906803
+12
+2900.431640625
+22
+2.1474895429626783e-13
+32
+1547.5304959406803
+13
+2900.431640625
+23
+2.1474895429626783e-13
+33
+1547.5304959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2925.33984375
+20
+2.0974156656264352e-13
+30
+1475.3664334406803
+11
+2900.431640625
+21
+2.1474895429626783e-13
+31
+1547.5304959406803
+12
+3075.05859375
+22
+2.160190971413346e-13
+32
+1565.8351834406803
+13
+3075.05859375
+23
+2.160190971413346e-13
+33
+1565.8351834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+2925.33984375
+20
+2.0974156656264352e-13
+30
+1475.3664334406803
+11
+3075.05859375
+21
+2.160190971413346e-13
+31
+1565.8351834406803
+12
+2952.498046875
+22
+2.0599619015779235e-13
+32
+1421.3898709406803
+13
+2952.498046875
+23
+2.0599619015779235e-13
+33
+1421.3898709406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+2952.498046875
+20
+2.0599619015779235e-13
+30
+1421.3898709406803
+11
+3075.05859375
+21
+2.160190971413346e-13
+31
+1565.8351834406803
+12
+3059.44921875
+22
+9.531974818829947e-14
+32
+-173.6257540593192
+13
+3059.44921875
+23
+9.531974818829947e-14
+33
+-173.6257540593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3059.44921875
+20
+9.531974818829947e-14
+30
+-173.6257540593192
+11
+3075.05859375
+21
+2.160190971413346e-13
+31
+1565.8351834406803
+12
+3546.0703125
+22
+9.489040412799521e-14
+32
+-179.8132540593192
+13
+3546.0703125
+23
+9.489040412799521e-14
+33
+-179.8132540593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3546.0703125
+20
+9.489040412799521e-14
+30
+-179.8132540593192
+11
+3075.05859375
+21
+2.160190971413346e-13
+31
+1565.8351834406803
+12
+3153.251953125
+22
+2.1557511635170178e-13
+32
+1559.4367459406803
+13
+3153.251953125
+23
+2.1557511635170178e-13
+33
+1559.4367459406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+3546.0703125
+20
+9.489040412799521e-14
+30
+-179.8132540593192
+11
+3153.251953125
+21
+2.1557511635170178e-13
+31
+1559.4367459406803
+12
+3284.794921875
+22
+2.1899929786295412e-13
+32
+1608.7844021906803
+13
+3284.794921875
+23
+2.1899929786295412e-13
+33
+1608.7844021906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+3546.0703125
+20
+9.489040412799521e-14
+30
+-179.8132540593192
+11
+3284.794921875
+21
+2.1899929786295412e-13
+31
+1608.7844021906803
+12
+3394.8984375
+22
+2.159101348229998e-13
+32
+1564.2648709406803
+13
+3394.8984375
+23
+2.159101348229998e-13
+33
+1564.2648709406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+3488.203125
+20
+2.2792363699522533e-13
+30
+1737.3976834406803
+11
+3546.0703125
+21
+9.489040412799521e-14
+31
+-179.8132540593192
+12
+3394.8984375
+22
+2.159101348229998e-13
+32
+1564.2648709406803
+13
+3394.8984375
+23
+2.159101348229998e-13
+33
+1564.2648709406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+3546.0703125
+20
+9.489040412799521e-14
+30
+-179.8132540593192
+11
+3488.203125
+21
+2.2792363699522533e-13
+31
+1737.3976834406803
+12
+3500.40234375
+22
+2.3473459504277927e-13
+32
+1835.5539334406803
+13
+3500.40234375
+23
+2.3473459504277927e-13
+33
+1835.5539334406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+3546.0703125
+20
+9.489040412799521e-14
+30
+-179.8132540593192
+11
+3500.40234375
+21
+2.3473459504277927e-13
+31
+1835.5539334406803
+12
+3634.728515625
+22
+2.3473459504277927e-13
+32
+1835.5539334406803
+13
+3634.728515625
+23
+2.3473459504277927e-13
+33
+1835.5539334406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+3546.0703125
+20
+9.489040412799521e-14
+30
+-179.8132540593192
+11
+3634.728515625
+21
+2.3473459504277927e-13
+31
+1835.5539334406803
+12
+4091.525390625
+22
+8.951465870626896e-14
+32
+-257.2859103093192
+13
+4091.525390625
+23
+8.951465870626896e-14
+33
+-257.2859103093192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+4091.525390625
+20
+8.951465870626896e-14
+30
+-257.2859103093192
+11
+3634.728515625
+21
+2.3473459504277927e-13
+31
+1835.5539334406803
+12
+4181.208984375
+22
+2.375196393733514e-13
+32
+1875.6906521906803
+13
+4181.208984375
+23
+2.375196393733514e-13
+33
+1875.6906521906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+3569.578125
+20
+3.1551633051032923e-13
+30
+2999.7414334406803
+11
+3570.498046875
+21
+3.095965866485584e-13
+31
+2914.4289334406803
+12
+3460.8984375
+22
+3.159090827473121e-13
+32
+3005.4015896906803
+13
+3460.8984375
+23
+3.159090827473121e-13
+33
+3005.4015896906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+3570.498046875
+20
+3.095965866485584e-13
+30
+2914.4289334406803
+11
+3569.578125
+21
+3.1551633051032923e-13
+31
+2999.7414334406803
+12
+3658.078125
+22
+3.264768013225283e-13
+32
+3157.6984646906803
+13
+3658.078125
+23
+3.264768013225283e-13
+33
+3157.6984646906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+3570.498046875
+20
+3.095965866485584e-13
+30
+2914.4289334406803
+11
+3658.078125
+21
+3.264768013225283e-13
+31
+3157.6984646906803
+12
+3604.5
+22
+2.959543417627164e-13
+32
+2717.8234646906803
+13
+3604.5
+23
+2.959543417627164e-13
+33
+2717.8234646906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3604.5
+20
+2.959543417627164e-13
+30
+2717.8234646906803
+11
+3658.078125
+21
+3.264768013225283e-13
+31
+3157.6984646906803
+12
+3650.794921875
+22
+2.709491160081401e-13
+32
+2357.4601834406803
+13
+3650.794921875
+23
+2.709491160081401e-13
+33
+2357.4601834406803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+3650.794921875
+20
+2.709491160081401e-13
+30
+2357.4601834406803
+11
+3658.078125
+21
+3.264768013225283e-13
+31
+3157.6984646906803
+12
+3864.796875
+22
+3.110171625450575e-13
+32
+2934.9015896906803
+13
+3864.796875
+23
+3.110171625450575e-13
+33
+2934.9015896906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3864.796875
+20
+3.110171625450575e-13
+30
+2934.9015896906803
+11
+3658.078125
+21
+3.264768013225283e-13
+31
+3157.6984646906803
+12
+3799.669921875
+22
+3.176980163319132e-13
+32
+3031.1828396906803
+13
+3799.669921875
+23
+3.176980163319132e-13
+33
+3031.1828396906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+3506.888671875
+20
+2.840652517897835e-13
+30
+2546.4836209406803
+11
+3331.880859375
+21
+2.7523686454977714e-13
+31
+2419.2531521906803
+12
+3273.462890625
+22
+2.8441978590018624e-13
+32
+2551.5929959406803
+13
+3273.462890625
+23
+2.8441978590018624e-13
+33
+2551.5929959406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+3331.880859375
+20
+2.7523686454977714e-13
+30
+2419.2531521906803
+11
+3506.888671875
+21
+2.840652517897835e-13
+31
+2546.4836209406803
+12
+3413.56640625
+22
+2.7447006256328677e-13
+32
+2408.2023709406803
+13
+3413.56640625
+23
+2.7447006256328677e-13
+33
+2408.2023709406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3413.56640625
+20
+2.7447006256328677e-13
+30
+2408.2023709406803
+11
+3506.888671875
+21
+2.840652517897835e-13
+31
+2546.4836209406803
+12
+3449.40234375
+22
+2.7553529119775377e-13
+32
+2423.5539334406803
+13
+3449.40234375
+23
+2.7553529119775377e-13
+33
+2423.5539334406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3449.40234375
+20
+2.7553529119775377e-13
+30
+2423.5539334406803
+11
+3506.888671875
+21
+2.840652517897835e-13
+31
+2546.4836209406803
+12
+3585.978515625
+22
+2.755621252015228e-13
+32
+2423.9406521906803
+13
+3585.978515625
+23
+2.755621252015228e-13
+33
+2423.9406521906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+3585.978515625
+20
+2.755621252015228e-13
+30
+2423.9406521906803
+11
+3506.888671875
+21
+2.840652517897835e-13
+31
+2546.4836209406803
+12
+3534.439453125
+22
+2.9372711944988805e-13
+32
+2685.7258084406803
+13
+3534.439453125
+23
+2.9372711944988805e-13
+33
+2685.7258084406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+3585.978515625
+20
+2.755621252015228e-13
+30
+2423.9406521906803
+11
+3534.439453125
+21
+2.9372711944988805e-13
+31
+2685.7258084406803
+12
+3604.5
+22
+2.959543417627164e-13
+32
+2717.8234646906803
+13
+3604.5
+23
+2.959543417627164e-13
+33
+2717.8234646906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+3585.978515625
+20
+2.755621252015228e-13
+30
+2423.9406521906803
+11
+3604.5
+21
+2.959543417627164e-13
+31
+2717.8234646906803
+12
+3650.794921875
+22
+2.709491160081401e-13
+32
+2357.4601834406803
+13
+3650.794921875
+23
+2.709491160081401e-13
+33
+2357.4601834406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+4443.486328125
+20
+2.4059985774538273e-13
+30
+1920.0812771906803
+11
+4411.248046875
+21
+2.3040049685826847e-13
+31
+1773.0929959406803
+12
+4301.091796875
+22
+2.417407094813806e-13
+32
+1936.5226834406803
+13
+4301.091796875
+23
+2.417407094813806e-13
+33
+1936.5226834406803
+70
+2
+ 0
+3DFACE
+ 8
+ship4
+10
+4528.529296875
+20
+2.2555655260214646e-13
+30
+1703.2844021906803
+11
+4449.603515625
+21
+2.138268403485689e-13
+31
+1534.2414334406803
+12
+4411.248046875
+22
+2.3040049685826847e-13
+32
+1773.0929959406803
+13
+4411.248046875
+23
+2.3040049685826847e-13
+33
+1773.0929959406803
+70
+2
+ 0
+3DFACE
+ 8
+ship4
+10
+4181.208984375
+20
+2.375196393733514e-13
+30
+1875.6906521906803
+11
+4585.013671875
+21
+9.205738385129059e-14
+31
+-220.6413790593192
+12
+4091.525390625
+22
+8.951465870626896e-14
+32
+-257.2859103093192
+13
+4091.525390625
+23
+8.951465870626896e-14
+33
+-257.2859103093192
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4585.013671875
+20
+9.205738385129059e-14
+30
+-220.6413790593192
+11
+4181.208984375
+21
+2.375196393733514e-13
+31
+1875.6906521906803
+12
+4301.091796875
+22
+2.417407094813806e-13
+32
+1936.5226834406803
+13
+4301.091796875
+23
+2.417407094813806e-13
+33
+1936.5226834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4585.013671875
+20
+9.205738385129059e-14
+30
+-220.6413790593192
+11
+4301.091796875
+21
+2.417407094813806e-13
+31
+1936.5226834406803
+12
+4411.248046875
+22
+2.3040049685826847e-13
+32
+1773.0929959406803
+13
+4411.248046875
+23
+2.3040049685826847e-13
+33
+1773.0929959406803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+4585.013671875
+20
+9.205738385129059e-14
+30
+-220.6413790593192
+11
+4411.248046875
+21
+2.3040049685826847e-13
+31
+1773.0929959406803
+12
+4449.603515625
+22
+2.138268403485689e-13
+32
+1534.2414334406803
+13
+4449.603515625
+23
+2.138268403485689e-13
+33
+1534.2414334406803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+4585.013671875
+20
+9.205738385129059e-14
+30
+-220.6413790593192
+11
+4449.603515625
+21
+2.138268403485689e-13
+31
+1534.2414334406803
+12
+4470.158203125
+22
+2.067410370502899e-13
+32
+1432.1242459406803
+13
+4470.158203125
+23
+2.067410370502899e-13
+33
+1432.1242459406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4585.013671875
+20
+9.205738385129059e-14
+30
+-220.6413790593192
+11
+4470.158203125
+21
+2.067410370502899e-13
+31
+1432.1242459406803
+12
+4678.974609375
+22
+1.8805156000098476e-13
+32
+1162.7804959406803
+13
+4678.974609375
+23
+1.8805156000098476e-13
+33
+1162.7804959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4585.013671875
+20
+9.205738385129059e-14
+30
+-220.6413790593192
+11
+4678.974609375
+21
+1.8805156000098476e-13
+31
+1162.7804959406803
+12
+4836.087890625
+22
+9.634269293803954e-14
+32
+-158.8835665593192
+13
+4836.087890625
+23
+9.634269293803954e-14
+33
+-158.8835665593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+4836.087890625
+20
+9.634269293803954e-14
+30
+-158.8835665593192
+11
+4678.974609375
+21
+1.8805156000098476e-13
+31
+1162.7804959406803
+12
+4691.630859375
+22
+1.836849357512994e-13
+32
+1099.8508084406803
+13
+4691.630859375
+23
+1.836849357512994e-13
+33
+1099.8508084406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4836.087890625
+20
+9.634269293803954e-14
+30
+-158.8835665593192
+11
+4691.630859375
+21
+1.836849357512994e-13
+31
+1099.8508084406803
+12
+4733.080078125
+22
+1.8034532200950092e-13
+32
+1051.7219021906803
+13
+4733.080078125
+23
+1.8034532200950092e-13
+33
+1051.7219021906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4717.529296875
+20
+2.1298522841217703e-13
+30
+1522.1125271906803
+11
+4470.158203125
+21
+2.067410370502899e-13
+31
+1432.1242459406803
+12
+4449.603515625
+22
+2.138268403485689e-13
+32
+1534.2414334406803
+13
+4449.603515625
+23
+2.138268403485689e-13
+33
+1534.2414334406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4470.158203125
+20
+2.067410370502899e-13
+30
+1432.1242459406803
+11
+4717.529296875
+21
+2.1298522841217703e-13
+31
+1522.1125271906803
+12
+4781.408203125
+22
+2.0803557444423758e-13
+32
+1450.7804959406803
+13
+4781.408203125
+23
+2.0803557444423758e-13
+33
+1450.7804959406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4620.181640625
+20
+2.0431621889152606e-13
+30
+1397.1789334406803
+11
+4678.974609375
+21
+1.8805156000098476e-13
+31
+1162.7804959406803
+12
+4470.158203125
+22
+2.067410370502899e-13
+32
+1432.1242459406803
+13
+4470.158203125
+23
+2.067410370502899e-13
+33
+1432.1242459406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4678.974609375
+20
+1.8805156000098476e-13
+30
+1162.7804959406803
+11
+4620.181640625
+21
+2.0431621889152606e-13
+31
+1397.1789334406803
+12
+4744.763671875
+22
+1.9962352083846567e-13
+32
+1329.5500271906803
+13
+4744.763671875
+23
+1.9962352083846567e-13
+33
+1329.5500271906803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+4744.763671875
+20
+1.9962352083846567e-13
+30
+1329.5500271906803
+11
+4620.181640625
+21
+2.0431621889152606e-13
+31
+1397.1789334406803
+12
+4772.056640625
+22
+2.0424384839651265e-13
+32
+1396.1359646906803
+13
+4772.056640625
+23
+2.0424384839651265e-13
+33
+1396.1359646906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4779.673828125
+20
+1.9274507120567451e-13
+30
+1230.4211209406803
+11
+4678.974609375
+21
+1.8805156000098476e-13
+31
+1162.7804959406803
+12
+4744.763671875
+22
+1.9962352083846567e-13
+32
+1329.5500271906803
+13
+4744.763671875
+23
+1.9962352083846567e-13
+33
+1329.5500271906803
+70
+2
+ 0
+3DFACE
+ 8
+ship4
+10
+4820.337890625
+20
+1.7798311652619813e-13
+30
+1017.6789334406803
+11
+4836.087890625
+21
+9.634269293803954e-14
+31
+-158.8835665593192
+12
+4733.080078125
+22
+1.8034532200950092e-13
+32
+1051.7219021906803
+13
+4733.080078125
+23
+1.8034532200950092e-13
+33
+1051.7219021906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4836.087890625
+20
+9.634269293803954e-14
+30
+-158.8835665593192
+11
+4820.337890625
+21
+1.7798311652619813e-13
+31
+1017.6789334406803
+12
+4952.888671875
+22
+1.7570385250909048e-13
+32
+984.8312771906803
+13
+4952.888671875
+23
+1.7570385250909048e-13
+33
+984.8312771906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4836.087890625
+20
+9.634269293803954e-14
+30
+-158.8835665593192
+11
+4952.888671875
+21
+1.7570385250909048e-13
+31
+984.8312771906803
+12
+5299.048828125
+22
+9.636708748692047e-14
+32
+-158.5320040593192
+13
+5299.048828125
+23
+9.636708748692047e-14
+33
+-158.5320040593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+5299.048828125
+20
+9.636708748692047e-14
+30
+-158.5320040593192
+11
+4952.888671875
+21
+1.7570385250909048e-13
+31
+984.8312771906803
+12
+4996.423828125
+22
+1.7930936683369102e-13
+32
+1036.7922146906803
+13
+4996.423828125
+23
+1.7930936683369102e-13
+33
+1036.7922146906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5410.705078125
+20
+2.0026835008055143e-13
+30
+1338.8429959406803
+11
+4982.982421875
+21
+1.985485343844463e-13
+31
+1314.0578396906803
+12
+4965.029296875
+22
+2.0123518736786538e-13
+32
+1352.7765896906803
+13
+4965.029296875
+23
+2.0123518736786538e-13
+33
+1352.7765896906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4982.982421875
+20
+1.985485343844463e-13
+30
+1314.0578396906803
+11
+5410.705078125
+21
+2.0026835008055143e-13
+31
+1338.8429959406803
+12
+4996.423828125
+22
+1.7930936683369102e-13
+32
+1036.7922146906803
+13
+4996.423828125
+23
+1.7930936683369102e-13
+33
+1036.7922146906803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+4996.423828125
+20
+1.7930936683369102e-13
+30
+1036.7922146906803
+11
+5410.705078125
+21
+2.0026835008055143e-13
+31
+1338.8429959406803
+12
+5436.861328125
+22
+1.8686679807700123e-13
+32
+1145.7062771906803
+13
+5436.861328125
+23
+1.8686679807700123e-13
+33
+1145.7062771906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4982.982421875
+20
+1.985485343844463e-13
+30
+1314.0578396906803
+11
+4903.048828125
+21
+1.9455839933915652e-13
+31
+1256.5539334406803
+12
+4873.037109375
+22
+2.0050822981121385e-13
+32
+1342.3000271906803
+13
+4873.037109375
+23
+2.0050822981121385e-13
+33
+1342.3000271906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4903.048828125
+20
+1.9455839933915652e-13
+30
+1256.5539334406803
+11
+4982.982421875
+21
+1.985485343844463e-13
+31
+1314.0578396906803
+12
+4996.423828125
+22
+1.7930936683369102e-13
+32
+1036.7922146906803
+13
+4996.423828125
+23
+1.7930936683369102e-13
+33
+1036.7922146906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+5436.861328125
+20
+1.8686679807700123e-13
+30
+1145.7062771906803
+11
+5299.048828125
+21
+9.636708748692047e-14
+31
+-158.5320040593192
+12
+4996.423828125
+22
+1.7930936683369102e-13
+32
+1036.7922146906803
+13
+4996.423828125
+23
+1.7930936683369102e-13
+33
+1036.7922146906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5299.048828125
+20
+9.636708748692047e-14
+30
+-158.5320040593192
+11
+5992.587890625
+21
+9.611663678507631e-14
+31
+-162.1413790593192
+12
+5281.037109375
+22
+9.219561962828249e-14
+32
+-218.6491915593192
+13
+5281.037109375
+23
+9.219561962828249e-14
+33
+-218.6491915593192
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5992.587890625
+20
+9.611663678507631e-14
+30
+-162.1413790593192
+11
+5299.048828125
+21
+9.636708748692047e-14
+31
+-158.5320040593192
+12
+5436.861328125
+22
+1.8686679807700123e-13
+32
+1145.7062771906803
+13
+5436.861328125
+23
+1.8686679807700123e-13
+33
+1145.7062771906803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+5992.587890625
+20
+9.611663678507631e-14
+30
+-162.1413790593192
+11
+5436.861328125
+21
+1.8686679807700123e-13
+31
+1145.7062771906803
+12
+5644.083984375
+22
+1.797248873162961e-13
+32
+1042.7804959406803
+13
+5644.083984375
+23
+1.797248873162961e-13
+33
+1042.7804959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+5992.587890625
+20
+9.611663678507631e-14
+30
+-162.1413790593192
+11
+5644.083984375
+21
+1.797248873162961e-13
+31
+1042.7804959406803
+12
+5719.939453125
+22
+1.7301394691915394e-13
+32
+946.0656521906803
+13
+5719.939453125
+23
+1.7301394691915394e-13
+33
+946.0656521906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4895.126953125
+20
+2.0974400601753162e-13
+30
+1475.4015896906803
+11
+4965.029296875
+21
+2.0123518736786538e-13
+31
+1352.7765896906803
+12
+4886.349609375
+22
+2.028736879010341e-13
+32
+1376.3898709406803
+13
+4886.349609375
+23
+2.028736879010341e-13
+33
+1376.3898709406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4965.029296875
+20
+2.0123518736786538e-13
+30
+1352.7765896906803
+11
+4895.126953125
+21
+2.0974400601753162e-13
+31
+1475.4015896906803
+12
+4982.443359375
+22
+2.0897395142452379e-13
+32
+1464.3039334406803
+13
+4982.443359375
+23
+2.0897395142452379e-13
+33
+1464.3039334406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4965.029296875
+20
+2.0123518736786538e-13
+30
+1352.7765896906803
+11
+4982.443359375
+21
+2.0897395142452379e-13
+31
+1464.3039334406803
+12
+5410.705078125
+22
+2.0026835008055143e-13
+32
+1338.8429959406803
+13
+5410.705078125
+23
+2.0026835008055143e-13
+33
+1338.8429959406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+5410.705078125
+20
+2.0026835008055143e-13
+30
+1338.8429959406803
+11
+4982.443359375
+21
+2.0897395142452379e-13
+31
+1464.3039334406803
+12
+4991.783203125
+22
+2.1482701685268678e-13
+32
+1548.6554959406803
+13
+4991.783203125
+23
+2.1482701685268678e-13
+33
+1548.6554959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+5410.705078125
+20
+2.0026835008055143e-13
+30
+1338.8429959406803
+11
+4991.783203125
+21
+2.1482701685268678e-13
+31
+1548.6554959406803
+12
+5333.033203125
+22
+2.1061163880606314e-13
+32
+1487.9054959406803
+13
+5333.033203125
+23
+2.1061163880606314e-13
+33
+1487.9054959406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+5410.705078125
+20
+2.0026835008055143e-13
+30
+1338.8429959406803
+11
+5333.033203125
+21
+2.1061163880606314e-13
+31
+1487.9054959406803
+12
+5403.462890625
+22
+2.1107676153805942e-13
+32
+1494.6086209406803
+13
+5403.462890625
+23
+2.1107676153805942e-13
+33
+1494.6086209406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+5410.705078125
+20
+2.0026835008055143e-13
+30
+1338.8429959406803
+11
+5403.462890625
+21
+2.1107676153805942e-13
+31
+1494.6086209406803
+12
+5413.236328125
+22
+2.046870160345161e-13
+32
+1402.5226834406803
+13
+5413.236328125
+23
+2.046870160345161e-13
+33
+1402.5226834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+5410.705078125
+20
+2.0026835008055143e-13
+30
+1338.8429959406803
+11
+5413.236328125
+21
+2.046870160345161e-13
+31
+1402.5226834406803
+12
+5707.751953125
+22
+2.0680690233226838e-13
+32
+1433.0734646906803
+13
+5707.751953125
+23
+2.0680690233226838e-13
+33
+1433.0734646906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+5707.751953125
+20
+2.0680690233226838e-13
+30
+1433.0734646906803
+11
+5413.236328125
+21
+2.046870160345161e-13
+31
+1402.5226834406803
+12
+5682.861328125
+22
+2.1112067172604508e-13
+32
+1495.2414334406803
+13
+5682.861328125
+23
+2.1112067172604508e-13
+33
+1495.2414334406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5585.044921875
+20
+1.9619364726580778e-13
+30
+1280.1203396906803
+11
+5436.861328125
+21
+1.8686679807700123e-13
+31
+1145.7062771906803
+12
+5426.115234375
+22
+1.9423151238415214e-13
+32
+1251.8429959406803
+13
+5426.115234375
+23
+1.9423151238415214e-13
+33
+1251.8429959406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5436.861328125
+20
+1.8686679807700123e-13
+30
+1145.7062771906803
+11
+5585.044921875
+21
+1.9619364726580778e-13
+31
+1280.1203396906803
+12
+5644.083984375
+22
+1.797248873162961e-13
+32
+1042.7804959406803
+13
+5644.083984375
+23
+1.797248873162961e-13
+33
+1042.7804959406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+5644.083984375
+20
+1.797248873162961e-13
+30
+1042.7804959406803
+11
+5585.044921875
+21
+1.9619364726580778e-13
+31
+1280.1203396906803
+12
+5658.416015625
+22
+1.875132536223457e-13
+32
+1155.0226834406803
+13
+5658.416015625
+23
+1.875132536223457e-13
+33
+1155.0226834406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5683.576171875
+20
+1.8409639047575764e-13
+30
+1105.7804959406803
+11
+5719.939453125
+21
+1.7301394691915394e-13
+31
+946.0656521906803
+12
+5644.083984375
+22
+1.797248873162961e-13
+32
+1042.7804959406803
+13
+5644.083984375
+23
+1.797248873162961e-13
+33
+1042.7804959406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5719.939453125
+20
+1.7301394691915394e-13
+30
+946.0656521906803
+11
+5683.576171875
+21
+1.8409639047575764e-13
+31
+1105.7804959406803
+12
+5738.091796875
+22
+1.8807676770149505e-13
+32
+1163.1437771906803
+13
+5738.091796875
+23
+1.8807676770149505e-13
+33
+1163.1437771906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+6277.119140625
+20
+1.6851559210551158e-13
+30
+881.2375271906803
+11
+6434.748046875
+21
+1.5968476541061715e-13
+31
+753.9719021906803
+12
+6268.974609375
+22
+1.6459050919057093e-13
+32
+824.6711209406803
+13
+6268.974609375
+23
+1.6459050919057093e-13
+33
+824.6711209406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+6434.748046875
+20
+1.5968476541061715e-13
+30
+753.9719021906803
+11
+6277.119140625
+21
+1.6851559210551158e-13
+31
+881.2375271906803
+12
+6457.177734375
+22
+1.641245733069453e-13
+32
+817.9562771906803
+13
+6457.177734375
+23
+1.641245733069453e-13
+33
+817.9562771906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+6434.748046875
+20
+1.5968476541061715e-13
+30
+753.9719021906803
+11
+6457.177734375
+21
+1.641245733069453e-13
+31
+817.9562771906803
+12
+6722.912109375
+22
+1.6242346009831553e-13
+32
+793.4406521906803
+13
+6722.912109375
+23
+1.6242346009831553e-13
+33
+793.4406521906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+6722.912109375
+20
+1.6242346009831553e-13
+30
+793.4406521906803
+11
+6457.177734375
+21
+1.641245733069453e-13
+31
+817.9562771906803
+12
+6653.525390625
+22
+1.639042092153876e-13
+32
+814.7804959406803
+13
+6653.525390625
+23
+1.639042092153876e-13
+33
+814.7804959406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5910.544921875
+20
+1.7301394691915394e-13
+30
+946.0656521906803
+11
+5992.587890625
+21
+9.611663678507631e-14
+31
+-162.1413790593192
+12
+5719.939453125
+22
+1.7301394691915394e-13
+32
+946.0656521906803
+13
+5719.939453125
+23
+1.7301394691915394e-13
+33
+946.0656521906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+5992.587890625
+20
+9.611663678507631e-14
+30
+-162.1413790593192
+11
+5910.544921875
+21
+1.7301394691915394e-13
+31
+946.0656521906803
+12
+5977.060546875
+22
+1.6731781975545822e-13
+32
+863.9758084406803
+13
+5977.060546875
+23
+1.6731781975545822e-13
+33
+863.9758084406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+5992.587890625
+20
+9.611663678507631e-14
+30
+-162.1413790593192
+11
+5977.060546875
+21
+1.6731781975545822e-13
+31
+863.9758084406803
+12
+5995.271484375
+22
+1.587268727912262e-13
+32
+740.1672146906803
+13
+5995.271484375
+23
+1.587268727912262e-13
+33
+740.1672146906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+5992.587890625
+20
+9.611663678507631e-14
+30
+-162.1413790593192
+11
+5995.271484375
+21
+1.587268727912262e-13
+31
+740.1672146906803
+12
+6245.279296875
+22
+9.622315964852302e-14
+32
+-160.6062228093192
+13
+6245.279296875
+23
+9.622315964852302e-14
+33
+-160.6062228093192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+6245.279296875
+20
+9.622315964852302e-14
+30
+-160.6062228093192
+11
+5995.271484375
+21
+1.587268727912262e-13
+31
+740.1672146906803
+12
+6149.056640625
+22
+1.6046457782317735e-13
+32
+765.2101834406803
+13
+6149.056640625
+23
+1.6046457782317735e-13
+33
+765.2101834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+6245.279296875
+20
+9.622315964852302e-14
+30
+-160.6062228093192
+11
+6149.056640625
+21
+1.6046457782317735e-13
+31
+765.2101834406803
+12
+6268.974609375
+22
+1.6459050919057093e-13
+32
+824.6711209406803
+13
+6268.974609375
+23
+1.6459050919057093e-13
+33
+824.6711209406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+6245.279296875
+20
+9.622315964852302e-14
+30
+-160.6062228093192
+11
+6268.974609375
+21
+1.6459050919057093e-13
+31
+824.6711209406803
+12
+6497.982421875
+22
+9.40268370976105e-14
+32
+-192.2585665593192
+13
+6497.982421875
+23
+9.40268370976105e-14
+33
+-192.2585665593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+6497.982421875
+20
+9.40268370976105e-14
+30
+-192.2585665593192
+11
+6268.974609375
+21
+1.6459050919057093e-13
+31
+824.6711209406803
+12
+6434.748046875
+22
+1.5968476541061715e-13
+32
+753.9719021906803
+13
+6434.748046875
+23
+1.5968476541061715e-13
+33
+753.9719021906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+6497.982421875
+20
+9.40268370976105e-14
+30
+-192.2585665593192
+11
+6434.748046875
+21
+1.5968476541061715e-13
+31
+753.9719021906803
+12
+6771.052734375
+22
+9.354219872650948e-14
+32
+-199.2429415593192
+13
+6771.052734375
+23
+9.354219872650948e-14
+33
+-199.2429415593192
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+6507.369140625
+20
+1.5883014304815545e-13
+30
+741.6554959406803
+11
+6771.052734375
+21
+9.354219872650948e-14
+31
+-199.2429415593192
+12
+6434.748046875
+22
+1.5968476541061715e-13
+32
+753.9719021906803
+13
+6434.748046875
+23
+1.5968476541061715e-13
+33
+753.9719021906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+6771.052734375
+20
+9.354219872650948e-14
+30
+-199.2429415593192
+11
+6507.369140625
+21
+1.5883014304815545e-13
+31
+741.6554959406803
+12
+6766.892578125
+22
+1.5156544639141633e-13
+32
+636.9601834406803
+13
+6766.892578125
+23
+1.5156544639141633e-13
+33
+636.9601834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+6771.052734375
+20
+9.354219872650948e-14
+30
+-199.2429415593192
+11
+6766.892578125
+21
+1.5156544639141633e-13
+31
+636.9601834406803
+12
+6855.603515625
+22
+1.473451894350165e-13
+32
+576.1398709406803
+13
+6855.603515625
+23
+1.473451894350165e-13
+33
+576.1398709406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+6771.052734375
+20
+9.354219872650948e-14
+30
+-199.2429415593192
+11
+6855.603515625
+21
+1.473451894350165e-13
+31
+576.1398709406803
+12
+7718.759765625
+22
+9.852356560799413e-14
+32
+-127.4538790593192
+13
+7718.759765625
+23
+9.852356560799413e-14
+33
+-127.4538790593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+7718.759765625
+20
+9.852356560799413e-14
+30
+-127.4538790593192
+11
+6855.603515625
+21
+1.473451894350165e-13
+31
+576.1398709406803
+12
+7012.177734375
+22
+1.4635395759882163e-13
+32
+561.8547146906803
+13
+7012.177734375
+23
+1.4635395759882163e-13
+33
+561.8547146906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+7718.759765625
+20
+9.852356560799413e-14
+30
+-127.4538790593192
+11
+7012.177734375
+21
+1.4635395759882163e-13
+31
+561.8547146906803
+12
+7173.591796875
+22
+1.456473288329042e-13
+32
+551.6711209406803
+13
+7173.591796875
+23
+1.456473288329042e-13
+33
+551.6711209406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+7718.759765625
+20
+9.852356560799413e-14
+30
+-127.4538790593192
+11
+7173.591796875
+21
+1.456473288329042e-13
+31
+551.6711209406803
+12
+7279.880859375
+22
+1.4257686828042515e-13
+32
+507.4211209406808
+13
+7279.880859375
+23
+1.4257686828042515e-13
+33
+507.4211209406808
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+7517.361328125
+20
+1.5786493206410023e-13
+30
+727.7453396906803
+11
+7173.591796875
+21
+1.456473288329042e-13
+31
+551.6711209406803
+12
+7012.177734375
+22
+1.4635395759882163e-13
+32
+561.8547146906803
+13
+7012.177734375
+23
+1.4635395759882163e-13
+33
+561.8547146906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+7173.591796875
+20
+1.456473288329042e-13
+30
+551.6711209406803
+11
+7517.361328125
+21
+1.5786493206410023e-13
+31
+727.7453396906803
+12
+7234.845703125
+22
+1.474744805440854e-13
+32
+578.0031521906803
+13
+7234.845703125
+23
+1.474744805440854e-13
+33
+578.0031521906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+7234.845703125
+20
+1.474744805440854e-13
+30
+578.0031521906803
+11
+7517.361328125
+21
+1.5786493206410023e-13
+31
+727.7453396906803
+12
+7528.705078125
+22
+1.5358612819038619e-13
+32
+666.0812771906803
+13
+7528.705078125
+23
+1.5358612819038619e-13
+33
+666.0812771906803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+7528.705078125
+20
+1.5358612819038619e-13
+30
+666.0812771906803
+11
+7517.361328125
+21
+1.5786493206410023e-13
+31
+727.7453396906803
+12
+7544.455078125
+22
+1.5470177222587377e-13
+32
+682.1594021906803
+13
+7544.455078125
+23
+1.5470177222587377e-13
+33
+682.1594021906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+7933.212890625
+20
+1.4369820437731838e-13
+30
+523.5812771906803
+11
+7854.626953125
+21
+1.3928360418150043e-13
+31
+459.9601834406808
+12
+7662.673828125
+22
+1.412498048213029e-13
+32
+488.2961209406808
+13
+7662.673828125
+23
+1.412498048213029e-13
+33
+488.2961209406808
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+7854.626953125
+20
+1.3928360418150043e-13
+30
+459.9601834406808
+11
+7933.212890625
+21
+1.4369820437731838e-13
+31
+523.5812771906803
+12
+8006.197265625
+22
+1.4124817851804417e-13
+32
+488.2726834406808
+13
+8006.197265625
+23
+1.4124817851804417e-13
+33
+488.2726834406808
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+7379.876953125
+20
+1.4663449491095225e-13
+30
+565.8976834406803
+11
+7718.759765625
+21
+9.852356560799413e-14
+31
+-127.4538790593192
+12
+7279.880859375
+22
+1.4257686828042515e-13
+32
+507.4211209406808
+13
+7279.880859375
+23
+1.4257686828042515e-13
+33
+507.4211209406808
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+7718.759765625
+20
+9.852356560799413e-14
+30
+-127.4538790593192
+11
+7379.876953125
+21
+1.4663449491095225e-13
+31
+565.8976834406803
+12
+7512.439453125
+22
+1.4216866616248436e-13
+32
+501.5383084406808
+13
+7512.439453125
+23
+1.4216866616248436e-13
+33
+501.5383084406808
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+7718.759765625
+20
+9.852356560799413e-14
+30
+-127.4538790593192
+11
+7512.439453125
+21
+1.4216866616248436e-13
+31
+501.5383084406808
+12
+7662.673828125
+22
+1.412498048213029e-13
+32
+488.2961209406808
+13
+7662.673828125
+23
+1.412498048213029e-13
+33
+488.2961209406808
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+7718.759765625
+20
+9.852356560799413e-14
+30
+-127.4538790593192
+11
+7662.673828125
+21
+1.412498048213029e-13
+31
+488.2961209406808
+12
+7854.626953125
+22
+1.3928360418150043e-13
+32
+459.9601834406808
+13
+7854.626953125
+23
+1.3928360418150043e-13
+33
+459.9601834406808
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+7718.759765625
+20
+9.852356560799413e-14
+30
+-127.4538790593192
+11
+7854.626953125
+21
+1.3928360418150043e-13
+31
+459.9601834406808
+12
+8230.599609375
+22
+9.763235142221105e-14
+32
+-140.2976290593192
+13
+8230.599609375
+23
+9.763235142221105e-14
+33
+-140.2976290593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+8230.599609375
+20
+9.763235142221105e-14
+30
+-140.2976290593192
+11
+7854.626953125
+21
+1.3928360418150043e-13
+31
+459.9601834406808
+12
+7981.283203125
+22
+1.350202501887443e-13
+32
+398.5187771906808
+13
+7981.283203125
+23
+1.350202501887443e-13
+33
+398.5187771906808
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+8177.056640625
+20
+1.359204090424504e-13
+30
+411.4914334406808
+11
+8230.599609375
+21
+9.763235142221105e-14
+31
+-140.2976290593192
+12
+7981.283203125
+22
+1.350202501887443e-13
+32
+398.5187771906808
+13
+7981.283203125
+23
+1.350202501887443e-13
+33
+398.5187771906808
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+8230.599609375
+20
+9.763235142221105e-14
+30
+-140.2976290593192
+11
+8177.056640625
+21
+1.359204090424504e-13
+31
+411.4914334406808
+12
+8247.533203125
+22
+1.2813529534291823e-13
+32
+299.2961209406808
+13
+8247.533203125
+23
+1.2813529534291823e-13
+33
+299.2961209406808
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+8247.533203125
+20
+1.2813529534291823e-13
+30
+299.2961209406808
+11
+8177.056640625
+21
+1.359204090424504e-13
+31
+411.4914334406808
+12
+8249.501953125
+22
+1.3084390342033014e-13
+32
+338.3312771906808
+13
+8249.501953125
+23
+1.3084390342033014e-13
+33
+338.3312771906808
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+8305.388671875
+20
+1.259170176980129e-13
+30
+267.3273709406808
+11
+8258.712890625
+21
+1.0611921497788446e-13
+31
+-17.989035309319206
+12
+8247.533203125
+22
+1.2813529534291823e-13
+32
+299.2961209406808
+13
+8247.533203125
+23
+1.2813529534291823e-13
+33
+299.2961209406808
+70
+2
+ 0
+3DFACE
+ 8
+ship4
+10
+8230.599609375
+20
+9.763235142221105e-14
+30
+-140.2976290593192
+11
+8258.712890625
+21
+1.0611921497788446e-13
+31
+-17.989035309319206
+12
+8374.048828125
+22
+9.880491607175412e-14
+32
+-123.3991915593192
+13
+8374.048828125
+23
+9.880491607175412e-14
+33
+-123.3991915593192
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+8258.712890625
+20
+1.0611921497788446e-13
+30
+-17.989035309319206
+11
+8230.599609375
+21
+9.763235142221105e-14
+31
+-140.2976290593192
+12
+8247.533203125
+22
+1.2813529534291823e-13
+32
+299.2961209406808
+13
+8247.533203125
+23
+1.2813529534291823e-13
+33
+299.2961209406808
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+8374.048828125
+20
+9.880491607175412e-14
+30
+-123.3991915593192
+11
+8258.712890625
+21
+1.0611921497788446e-13
+31
+-17.989035309319206
+12
+8403.228515625
+22
+1.0301460205697222e-13
+32
+-62.731222809319206
+13
+8403.228515625
+23
+1.0301460205697222e-13
+33
+-62.731222809319206
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4062.884765625
+20
+2.71440259592276e-13
+30
+2364.5383084406803
+11
+3650.794921875
+21
+2.709491160081401e-13
+31
+2357.4601834406803
+12
+3864.796875
+22
+3.110171625450575e-13
+32
+2934.9015896906803
+13
+3864.796875
+23
+3.110171625450575e-13
+33
+2934.9015896906803
+70
+0
+ 0
+3DFACE
+ 8
+ship4
+10
+3648.744140625
+20
+2.41926921204505e-13
+30
+1939.2062771906803
+11
+4181.208984375
+21
+2.375196393733514e-13
+31
+1875.6906521906803
+12
+3634.728515625
+22
+2.3473459504277927e-13
+32
+1835.5539334406803
+13
+3634.728515625
+23
+2.3473459504277927e-13
+33
+1835.5539334406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4181.208984375
+20
+2.375196393733514e-13
+30
+1875.6906521906803
+11
+3648.744140625
+21
+2.41926921204505e-13
+31
+1939.2062771906803
+12
+3650.794921875
+22
+2.709491160081401e-13
+32
+2357.4601834406803
+13
+3650.794921875
+23
+2.709491160081401e-13
+33
+2357.4601834406803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4181.208984375
+20
+2.375196393733514e-13
+30
+1875.6906521906803
+11
+3650.794921875
+21
+2.709491160081401e-13
+31
+2357.4601834406803
+12
+4077.31640625
+22
+2.6387713628756027e-13
+32
+2255.5422146906803
+13
+4077.31640625
+23
+2.6387713628756027e-13
+33
+2255.5422146906803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+4077.31640625
+20
+2.6387713628756027e-13
+30
+2255.5422146906803
+11
+3650.794921875
+21
+2.709491160081401e-13
+31
+2357.4601834406803
+12
+4062.884765625
+22
+2.71440259592276e-13
+32
+2364.5383084406803
+13
+4062.884765625
+23
+2.71440259592276e-13
+33
+2364.5383084406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4181.208984375
+20
+2.375196393733514e-13
+30
+1875.6906521906803
+11
+4077.31640625
+21
+2.6387713628756027e-13
+31
+2255.5422146906803
+12
+4175.40234375
+22
+2.438825508731257e-13
+32
+1967.3898709406803
+13
+4175.40234375
+23
+2.438825508731257e-13
+33
+1967.3898709406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4037.33203125
+20
+3.388310140274575e-13
+30
+3335.7414334406803
+11
+3916.53515625
+21
+3.2750055922389776e-13
+31
+3172.4523709406803
+12
+3750.24609375
+22
+3.3275758450773685e-13
+32
+3248.2140896906803
+13
+3750.24609375
+23
+3.3275758450773685e-13
+33
+3248.2140896906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+3916.53515625
+20
+3.2750055922389776e-13
+30
+3172.4523709406803
+11
+4049.98828125
+21
+2.9615437706354e-13
+31
+2720.7062771906803
+12
+3864.796875
+22
+3.110171625450575e-13
+32
+2934.9015896906803
+13
+3864.796875
+23
+3.110171625450575e-13
+33
+2934.9015896906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4049.98828125
+20
+2.9615437706354e-13
+30
+2720.7062771906803
+11
+3916.53515625
+21
+3.2750055922389776e-13
+31
+3172.4523709406803
+12
+4037.33203125
+22
+3.388310140274575e-13
+32
+3335.7414334406803
+13
+4037.33203125
+23
+3.388310140274575e-13
+33
+3335.7414334406803
+70
+15
+ 0
+3DFACE
+ 8
+ship4
+10
+4049.98828125
+20
+2.9615437706354e-13
+30
+2720.7062771906803
+11
+4037.33203125
+21
+3.388310140274575e-13
+31
+3335.7414334406803
+12
+4123.7578125
+22
+3.22666372787328e-13
+32
+3102.7844021906803
+13
+4123.7578125
+23
+3.22666372787328e-13
+33
+3102.7844021906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4049.98828125
+20
+2.9615437706354e-13
+30
+2720.7062771906803
+11
+4123.7578125
+21
+3.22666372787328e-13
+31
+3102.7844021906803
+12
+4131.029296875
+22
+3.149861556479838e-13
+32
+2992.1008084406803
+13
+4131.029296875
+23
+3.149861556479838e-13
+33
+2992.1008084406803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4062.884765625
+20
+2.71440259592276e-13
+30
+2364.5383084406803
+11
+3864.796875
+21
+3.110171625450575e-13
+31
+2934.9015896906803
+12
+4049.98828125
+22
+2.9615437706354e-13
+32
+2720.7062771906803
+13
+4049.98828125
+23
+2.9615437706354e-13
+33
+2720.7062771906803
+70
+0
+ 0
+3DFACE
+ 8
+ship4
+10
+4299.099609375
+20
+2.940710825891091e-13
+30
+2690.6828396906803
+11
+4062.884765625
+21
+2.71440259592276e-13
+31
+2364.5383084406803
+12
+4049.98828125
+22
+2.9615437706354e-13
+32
+2720.7062771906803
+13
+4049.98828125
+23
+2.9615437706354e-13
+33
+2720.7062771906803
+70
+1
+ 0
+3DFACE
+ 8
+ship4
+10
+4062.884765625
+20
+2.71440259592276e-13
+30
+2364.5383084406803
+11
+4299.099609375
+21
+2.940710825891091e-13
+31
+2690.6828396906803
+12
+4200.2109375
+22
+2.8084517133750153e-13
+32
+2500.0773709406803
+13
+4200.2109375
+23
+2.8084517133750153e-13
+33
+2500.0773709406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+4200.2109375
+20
+2.8084517133750153e-13
+30
+2500.0773709406803
+11
+4299.099609375
+21
+2.940710825891091e-13
+31
+2690.6828396906803
+12
+4323.814453125
+22
+2.852727819593892e-13
+32
+2563.8859646906803
+13
+4323.814453125
+23
+2.852727819593892e-13
+33
+2563.8859646906803
+70
+13
+ 0
+3DFACE
+ 8
+ship4
+10
+4200.2109375
+20
+2.8084517133750153e-13
+30
+2500.0773709406803
+11
+4323.814453125
+21
+2.852727819593892e-13
+31
+2563.8859646906803
+12
+4905.041015625
+22
+2.7949859223927453e-13
+32
+2480.6711209406803
+13
+4905.041015625
+23
+2.7949859223927453e-13
+33
+2480.6711209406803
+70
+3
+ 0
+3DFACE
+ 8
+ship4
+10
+4905.041015625
+20
+2.7949859223927453e-13
+30
+2480.6711209406803
+11
+4323.814453125
+21
+2.852727819593892e-13
+31
+2563.8859646906803
+12
+4873.669921875
+22
+2.825365267265789e-13
+32
+2524.4523709406803
+13
+4873.669921875
+23
+2.825365267265789e-13
+33
+2524.4523709406803
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+135.28125
+20
+8.03841043207909e-14
+30
+395.95703125
+11
+135.94921875
+21
+7.558000449450764e-14
+31
+326.72265625
+12
+121.751953125
+22
+7.712173998378202e-14
+32
+348.94140625
+13
+121.751953125
+23
+7.712173998378202e-14
+33
+348.94140625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+135.94921875
+20
+7.558000449450764e-14
+30
+326.72265625
+11
+135.28125
+21
+8.03841043207909e-14
+31
+395.95703125
+12
+155.1796875
+22
+8.104357029220521e-14
+32
+405.4609375
+13
+155.1796875
+23
+8.104357029220521e-14
+33
+405.4609375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+135.94921875
+20
+7.558000449450764e-14
+30
+326.72265625
+11
+155.1796875
+21
+8.104357029220521e-14
+31
+405.4609375
+12
+168.80859375
+22
+7.554829158096243e-14
+32
+326.265625
+13
+168.80859375
+23
+7.554829158096243e-14
+33
+326.265625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+168.80859375
+20
+7.554829158096243e-14
+30
+326.265625
+11
+155.1796875
+21
+8.104357029220521e-14
+31
+405.4609375
+12
+306.7734375
+22
+8.107772266063851e-14
+32
+405.953125
+13
+306.7734375
+23
+8.107772266063851e-14
+33
+405.953125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+168.80859375
+20
+7.554829158096243e-14
+30
+326.265625
+11
+306.7734375
+21
+8.107772266063851e-14
+31
+405.953125
+12
+186.73828125
+22
+7.47465240744094e-14
+32
+314.7109375
+13
+186.73828125
+23
+7.47465240744094e-14
+33
+314.7109375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+186.73828125
+20
+7.47465240744094e-14
+30
+314.7109375
+11
+306.7734375
+21
+8.107772266063851e-14
+31
+405.953125
+12
+251.583984375
+22
+6.744442244271953e-14
+32
+209.4765625
+13
+251.583984375
+23
+6.744442244271953e-14
+33
+209.4765625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+251.583984375
+20
+6.744442244271953e-14
+30
+209.4765625
+11
+306.7734375
+21
+8.107772266063851e-14
+31
+405.953125
+12
+321.287109375
+22
+5.482430915498826e-14
+32
+27.6015625
+13
+321.287109375
+23
+5.482430915498826e-14
+33
+27.6015625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+321.287109375
+20
+5.482430915498826e-14
+30
+27.6015625
+11
+306.7734375
+21
+8.107772266063851e-14
+31
+405.953125
+12
+359.00390625
+22
+8.375461782450522e-14
+32
+444.53125
+13
+359.00390625
+23
+8.375461782450522e-14
+33
+444.53125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+321.287109375
+20
+5.482430915498826e-14
+30
+27.6015625
+11
+359.00390625
+21
+8.375461782450522e-14
+31
+444.53125
+12
+343.640625
+22
+4.585687298636065e-14
+32
+-101.6328125
+13
+343.640625
+23
+4.585687298636065e-14
+33
+-101.6328125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+343.640625
+20
+4.585687298636065e-14
+30
+-101.6328125
+11
+359.00390625
+21
+8.375461782450522e-14
+31
+444.53125
+12
+345.955078125
+22
+4.0434777921760645e-14
+32
+-179.7734375
+13
+345.955078125
+23
+4.0434777921760645e-14
+33
+-179.7734375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+345.955078125
+20
+4.0434777921760645e-14
+30
+-179.7734375
+11
+359.00390625
+21
+8.375461782450522e-14
+31
+444.53125
+12
+358.0078125
+22
+3.486306295735764e-14
+32
+-260.0703125
+13
+358.0078125
+23
+3.486306295735764e-14
+33
+-260.0703125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+358.0078125
+20
+3.486306295735764e-14
+30
+-260.0703125
+11
+359.00390625
+21
+8.375461782450522e-14
+31
+444.53125
+12
+458.5546875
+22
+8.106308593130995e-14
+32
+405.7421875
+13
+458.5546875
+23
+8.106308593130995e-14
+33
+405.7421875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+458.5546875
+20
+8.106308593130995e-14
+30
+405.7421875
+11
+359.00390625
+21
+8.375461782450522e-14
+31
+444.53125
+12
+377.1796875
+22
+8.547687297549844e-14
+32
+469.3515625
+13
+377.1796875
+23
+8.547687297549844e-14
+33
+469.3515625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+458.5546875
+20
+8.106308593130995e-14
+30
+405.7421875
+11
+377.1796875
+21
+8.547687297549844e-14
+31
+469.3515625
+12
+424.962890625
+22
+8.318215907743287e-14
+32
+436.28125
+13
+424.962890625
+23
+8.318215907743287e-14
+33
+436.28125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+424.962890625
+20
+8.318215907743287e-14
+30
+436.28125
+11
+377.1796875
+21
+8.547687297549844e-14
+31
+469.3515625
+12
+417.111328125
+22
+8.649981772523851e-14
+32
+484.09375
+13
+417.111328125
+23
+8.649981772523851e-14
+33
+484.09375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+424.962890625
+20
+8.318215907743287e-14
+30
+436.28125
+11
+417.111328125
+21
+8.649981772523851e-14
+31
+484.09375
+12
+424.2421875
+22
+8.592085376513126e-14
+32
+475.75
+13
+424.2421875
+23
+8.592085376513126e-14
+33
+475.75
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2521.435546875
+20
+1.651527222271132e-13
+30
+1617.6015625
+11
+2520.6796875
+21
+1.2711592846034736e-13
+31
+1069.43359375
+12
+2493.755859375
+22
+1.270378659039284e-13
+32
+1068.30859375
+13
+2493.755859375
+23
+1.270378659039284e-13
+33
+1068.30859375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+2520.6796875
+20
+1.2711592846034736e-13
+30
+1069.43359375
+11
+2521.435546875
+21
+1.651527222271132e-13
+31
+1617.6015625
+12
+2546.58984375
+22
+1.6523972945145515e-13
+32
+1618.85546875
+13
+2546.58984375
+23
+1.6523972945145515e-13
+33
+1618.85546875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+2546.58984375
+20
+1.6523972945145515e-13
+30
+1618.85546875
+11
+2521.435546875
+21
+1.651527222271132e-13
+31
+1617.6015625
+12
+2536.65234375
+22
+1.6614801982145488e-13
+32
+1631.9453125
+13
+2536.65234375
+23
+1.6614801982145488e-13
+33
+1631.9453125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2476.974609375
+20
+1.2251267708651703e-13
+30
+1003.09375
+11
+2520.75
+21
+1.2434877346562123e-13
+31
+1029.5546875
+12
+2467.541015625
+22
+1.1890878906517521e-13
+32
+951.15625
+13
+2467.541015625
+23
+1.1890878906517521e-13
+33
+951.15625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2520.75
+20
+1.2434877346562123e-13
+30
+1029.5546875
+11
+2476.974609375
+21
+1.2251267708651703e-13
+31
+1003.09375
+12
+2493.755859375
+22
+1.270378659039284e-13
+32
+1068.30859375
+13
+2493.755859375
+23
+1.270378659039284e-13
+33
+1068.30859375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2520.75
+20
+1.2434877346562123e-13
+30
+1029.5546875
+11
+2493.755859375
+21
+1.270378659039284e-13
+31
+1068.30859375
+12
+2520.6796875
+22
+1.2711592846034736e-13
+32
+1069.43359375
+13
+2520.6796875
+23
+1.2711592846034736e-13
+33
+1069.43359375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+458.5546875
+20
+8.106308593130995e-14
+30
+405.7421875
+11
+389.244140625
+21
+3.1561667342139277e-14
+31
+-307.6484375
+12
+358.0078125
+22
+3.486306295735764e-14
+32
+-260.0703125
+13
+358.0078125
+23
+3.486306295735764e-14
+33
+-260.0703125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+389.244140625
+20
+3.1561667342139277e-14
+30
+-307.6484375
+11
+458.5546875
+21
+8.106308593130995e-14
+31
+405.7421875
+12
+541.857421875
+22
+2.3976588943430688e-14
+32
+-416.9609375
+13
+541.857421875
+23
+2.3976588943430688e-14
+33
+-416.9609375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+541.857421875
+20
+2.3976588943430688e-14
+30
+-416.9609375
+11
+458.5546875
+21
+8.106308593130995e-14
+31
+405.7421875
+12
+623.33203125
+22
+8.106145962805122e-14
+32
+405.71875
+13
+623.33203125
+23
+8.106145962805122e-14
+33
+405.71875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+541.857421875
+20
+2.3976588943430688e-14
+30
+-416.9609375
+11
+623.33203125
+21
+8.106145962805122e-14
+31
+405.71875
+12
+602.794921875
+22
+1.8878941378946967e-14
+32
+-490.42578125
+13
+602.794921875
+23
+1.8878941378946967e-14
+33
+-490.42578125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+602.794921875
+20
+1.8878941378946967e-14
+30
+-490.42578125
+11
+623.33203125
+21
+8.106145962805122e-14
+31
+405.71875
+12
+613.8984375
+22
+8.979633443068069e-15
+32
+-633.08984375
+13
+613.8984375
+23
+8.979633443068069e-15
+33
+-633.08984375
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+613.8984375
+20
+8.979633443068069e-15
+30
+-633.08984375
+11
+623.33203125
+21
+8.106145962805122e-14
+31
+405.71875
+12
+630.955078125
+22
+9.008906901725178e-15
+32
+-632.66796875
+13
+630.955078125
+23
+9.008906901725178e-15
+33
+-632.66796875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+630.955078125
+20
+9.008906901725178e-15
+30
+-632.66796875
+11
+623.33203125
+21
+8.106145962805122e-14
+31
+405.71875
+12
+684.75
+22
+8.024180278565218e-14
+32
+393.90625
+13
+684.75
+23
+8.024180278565218e-14
+33
+393.90625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+630.955078125
+20
+9.008906901725178e-15
+30
+-632.66796875
+11
+684.75
+21
+8.024180278565218e-14
+31
+393.90625
+12
+679.423828125
+22
+9.768390523551274e-15
+32
+-621.72265625
+13
+679.423828125
+23
+9.768390523551274e-15
+33
+-621.72265625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+679.423828125
+20
+9.768390523551274e-15
+30
+-621.72265625
+11
+684.75
+21
+8.024180278565218e-14
+31
+393.90625
+12
+819.146484375
+22
+8.171360723480126e-14
+32
+415.1171875
+13
+819.146484375
+23
+8.171360723480126e-14
+33
+415.1171875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+819.146484375
+20
+8.171360723480126e-14
+30
+415.1171875
+11
+684.75
+21
+8.024180278565218e-14
+31
+393.90625
+12
+794.8828125
+22
+8.144851980362855e-14
+32
+411.296875
+13
+794.8828125
+23
+8.144851980362855e-14
+33
+411.296875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+794.8828125
+20
+8.144851980362855e-14
+30
+411.296875
+11
+684.75
+21
+8.024180278565218e-14
+31
+393.90625
+12
+716.994140625
+22
+8.142412525474763e-14
+32
+410.9453125
+13
+716.994140625
+23
+8.142412525474763e-14
+33
+410.9453125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+570.5625
+20
+1.3366586483487541e-14
+30
+-569.8671875
+11
+613.8984375
+21
+8.979633443068069e-15
+31
+-633.08984375
+12
+563.33203125
+22
+1.1551632046746807e-14
+32
+-596.0234375
+13
+563.33203125
+23
+1.1551632046746807e-14
+33
+-596.0234375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+613.8984375
+20
+8.979633443068069e-15
+30
+-633.08984375
+11
+570.5625
+21
+1.3366586483487541e-14
+31
+-569.8671875
+12
+583.634765625
+22
+1.3390167880739101e-14
+32
+-569.52734375
+13
+583.634765625
+23
+1.3390167880739101e-14
+33
+-569.52734375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+613.8984375
+20
+8.979633443068069e-15
+30
+-633.08984375
+11
+583.634765625
+21
+1.3390167880739101e-14
+31
+-569.52734375
+12
+602.794921875
+22
+1.8878941378946967e-14
+32
+-490.42578125
+13
+602.794921875
+23
+1.8878941378946967e-14
+33
+-490.42578125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+819.146484375
+20
+8.171360723480126e-14
+30
+415.1171875
+11
+815.853515625
+21
+7.794871519084534e-15
+31
+-650.1640625
+12
+679.423828125
+22
+9.768390523551274e-15
+32
+-621.72265625
+13
+679.423828125
+23
+9.768390523551274e-15
+33
+-621.72265625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+815.853515625
+20
+7.794871519084534e-15
+30
+-650.1640625
+11
+819.146484375
+21
+8.171360723480126e-14
+31
+415.1171875
+12
+918.521484375
+22
+5.0789450770083455e-15
+32
+-689.3046875
+13
+918.521484375
+23
+5.0789450770083455e-15
+33
+-689.3046875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+918.521484375
+20
+5.0789450770083455e-15
+30
+-689.3046875
+11
+819.146484375
+21
+8.171360723480126e-14
+31
+415.1171875
+12
+849.85546875
+22
+8.544434691032388e-14
+32
+468.8828125
+13
+849.85546875
+23
+8.544434691032388e-14
+33
+468.8828125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+918.521484375
+20
+5.0789450770083455e-15
+30
+-689.3046875
+11
+849.85546875
+21
+8.544434691032388e-14
+31
+468.8828125
+12
+889.447265625
+22
+8.658357234306302e-14
+32
+485.30078125
+13
+889.447265625
+23
+8.658357234306302e-14
+33
+485.30078125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+918.521484375
+20
+5.0789450770083455e-15
+30
+-689.3046875
+11
+889.447265625
+21
+8.658357234306302e-14
+31
+485.30078125
+12
+963.26953125
+22
+8.656161724907019e-14
+32
+484.984375
+13
+963.26953125
+23
+8.656161724907019e-14
+33
+484.984375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+918.521484375
+20
+5.0789450770083455e-15
+30
+-689.3046875
+11
+963.26953125
+21
+8.656161724907019e-14
+31
+484.984375
+12
+963.26953125
+22
+8.19868261822676e-14
+32
+419.0546875
+13
+963.26953125
+23
+8.19868261822676e-14
+33
+419.0546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+918.521484375
+20
+5.0789450770083455e-15
+30
+-689.3046875
+11
+963.26953125
+21
+8.19868261822676e-14
+31
+419.0546875
+12
+1005.22265625
+22
+4.2300147759521955e-15
+32
+-701.5390625
+13
+1005.22265625
+23
+4.2300147759521955e-15
+33
+-701.5390625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+1005.22265625
+20
+4.2300147759521955e-15
+30
+-701.5390625
+11
+963.26953125
+21
+8.19868261822676e-14
+31
+419.0546875
+12
+1028.982421875
+22
+8.19868261822676e-14
+32
+419.0546875
+13
+1028.982421875
+23
+8.19868261822676e-14
+33
+419.0546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1005.22265625
+20
+4.2300147759521955e-15
+30
+-701.5390625
+11
+1028.982421875
+21
+8.19868261822676e-14
+31
+419.0546875
+12
+1383.240234375
+22
+2.3735896061138906e-15
+32
+-728.29296875
+13
+1383.240234375
+23
+2.3735896061138906e-15
+33
+-728.29296875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1028.982421875
+21
+8.19868261822676e-14
+31
+419.0546875
+12
+1048.142578125
+22
+8.201447333766598e-14
+32
+419.453125
+13
+1048.142578125
+23
+8.201447333766598e-14
+33
+419.453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1048.142578125
+21
+8.201447333766598e-14
+31
+419.453125
+12
+1131.45703125
+22
+8.295447662121092e-14
+32
+433.0
+13
+1131.45703125
+23
+8.295447662121092e-14
+33
+433.0
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1131.45703125
+21
+8.295447662121092e-14
+31
+433.0
+12
+1225.60546875
+22
+8.210310686526667e-14
+32
+420.73046875
+13
+1225.60546875
+23
+8.210310686526667e-14
+33
+420.73046875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+1294.91015625
+20
+8.47840677872802e-14
+30
+459.3671875
+11
+1383.240234375
+21
+2.3735896061138906e-15
+31
+-728.29296875
+12
+1225.60546875
+22
+8.210310686526667e-14
+32
+420.73046875
+13
+1225.60546875
+23
+8.210310686526667e-14
+33
+420.73046875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1294.91015625
+21
+8.47840677872802e-14
+31
+459.3671875
+12
+1305.955078125
+22
+8.560372462967925e-14
+32
+471.1796875
+13
+1305.955078125
+23
+8.560372462967925e-14
+33
+471.1796875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1305.955078125
+21
+8.560372462967925e-14
+31
+471.1796875
+12
+1374.0
+22
+8.360337162144349e-14
+32
+442.3515625
+13
+1374.0
+23
+8.360337162144349e-14
+33
+442.3515625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1374.0
+21
+8.360337162144349e-14
+31
+442.3515625
+12
+1380.65625
+22
+8.292032425277762e-14
+32
+432.5078125
+13
+1380.65625
+23
+8.292032425277762e-14
+33
+432.5078125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1380.65625
+21
+8.292032425277762e-14
+31
+432.5078125
+12
+1394.0625
+22
+8.38977325112733e-14
+32
+446.59375
+13
+1394.0625
+23
+8.38977325112733e-14
+33
+446.59375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1383.240234375
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+1394.0625
+21
+8.38977325112733e-14
+31
+446.59375
+12
+1400.220703125
+22
+1.958069123508821e-15
+32
+-734.28125
+13
+1400.220703125
+23
+1.958069123508821e-15
+33
+-734.28125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+1400.220703125
+20
+1.958069123508821e-15
+30
+-734.28125
+11
+1394.0625
+21
+8.38977325112733e-14
+31
+446.59375
+12
+1530.451171875
+22
+2.3809079707781677e-15
+32
+-728.1875
+13
+1530.451171875
+23
+2.3809079707781677e-15
+33
+-728.1875
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+1530.451171875
+20
+2.3809079707781677e-15
+30
+-728.1875
+11
+1394.0625
+21
+8.38977325112733e-14
+31
+446.59375
+12
+1800.6796875
+22
+2.3613923316734287e-15
+32
+-728.46875
+13
+1800.6796875
+23
+2.3613923316734287e-15
+33
+-728.46875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+1800.6796875
+20
+2.3613923316734287e-15
+30
+-728.46875
+11
+1394.0625
+21
+8.38977325112733e-14
+31
+446.59375
+12
+1936.576171875
+22
+1.9938477952008427e-15
+32
+-733.765625
+13
+1936.576171875
+23
+1.9938477952008427e-15
+33
+-733.765625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+1400.220703125
+20
+1.958069123508821e-15
+30
+-734.28125
+11
+1530.451171875
+21
+2.3809079707781677e-15
+31
+-728.1875
+12
+1488.046875
+22
+1.8417884405097507e-15
+32
+-735.95703125
+13
+1488.046875
+23
+1.8417884405097507e-15
+33
+-735.95703125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+1399.7109375
+20
+8.784802312672424e-14
+30
+503.5234375
+11
+1936.576171875
+21
+1.9938477952008427e-15
+31
+-733.765625
+12
+1394.0625
+22
+8.38977325112733e-14
+32
+446.59375
+13
+1394.0625
+23
+8.38977325112733e-14
+33
+446.59375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1399.7109375
+21
+8.784802312672424e-14
+31
+503.5234375
+12
+1417.0546875
+22
+9.104696163664272e-14
+32
+549.625
+13
+1417.0546875
+23
+9.104696163664272e-14
+33
+549.625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1417.0546875
+21
+9.104696163664272e-14
+31
+549.625
+12
+1504.9453125
+22
+9.948259663966619e-14
+32
+671.1953125
+13
+1504.9453125
+23
+9.948259663966619e-14
+33
+671.1953125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1504.9453125
+21
+9.948259663966619e-14
+31
+671.1953125
+12
+1551.392578125
+22
+1.0123249894605779e-13
+32
+696.4140625
+13
+1551.392578125
+23
+1.0123249894605779e-13
+33
+696.4140625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1551.392578125
+21
+1.0123249894605779e-13
+31
+696.4140625
+12
+1716.1640625
+22
+1.0121135700369432e-13
+32
+696.109375
+13
+1716.1640625
+23
+1.0121135700369432e-13
+33
+696.109375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1716.1640625
+21
+1.0121135700369432e-13
+31
+696.109375
+12
+1753.365234375
+22
+1.015520675363979e-13
+32
+701.01953125
+13
+1753.365234375
+23
+1.015520675363979e-13
+33
+701.01953125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1753.365234375
+21
+1.015520675363979e-13
+31
+701.01953125
+12
+1898.255859375
+22
+1.0053969375783955e-13
+32
+686.4296875
+13
+1898.255859375
+23
+1.0053969375783955e-13
+33
+686.4296875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1898.255859375
+21
+1.0053969375783955e-13
+31
+686.4296875
+12
+1928.478515625
+22
+1.0122274112650542e-13
+32
+696.2734375
+13
+1928.478515625
+23
+1.0122274112650542e-13
+33
+696.2734375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+1928.478515625
+21
+1.0122274112650542e-13
+31
+696.2734375
+12
+2010.345703125
+22
+1.0054132006109828e-13
+32
+686.453125
+13
+2010.345703125
+23
+1.0054132006109828e-13
+33
+686.453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+1936.576171875
+20
+1.9938477952008427e-15
+30
+-733.765625
+11
+2010.345703125
+21
+1.0054132006109828e-13
+31
+686.453125
+12
+2072.47265625
+22
+1.6263032587282567e-15
+32
+-739.0625
+13
+2072.47265625
+23
+1.6263032587282567e-15
+33
+-739.0625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+2072.47265625
+20
+1.6263032587282567e-15
+30
+-739.0625
+11
+2010.345703125
+21
+1.0054132006109828e-13
+31
+686.453125
+12
+2243.419921875
+22
+1.4522888100443332e-15
+32
+-741.5703125
+13
+2243.419921875
+23
+1.4522888100443332e-15
+33
+-741.5703125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+2243.419921875
+20
+1.4522888100443332e-15
+30
+-741.5703125
+11
+2010.345703125
+21
+1.0054132006109828e-13
+31
+686.453125
+12
+2415.9375
+22
+5.675798372961616e-16
+32
+-754.3203125
+13
+2415.9375
+23
+5.675798372961616e-16
+33
+-754.3203125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2023.986328125
+20
+1.0102270582568185e-13
+30
+693.390625
+11
+2415.9375
+21
+5.675798372961616e-16
+31
+-754.3203125
+12
+2010.345703125
+22
+1.0054132006109828e-13
+32
+686.453125
+13
+2010.345703125
+23
+1.0054132006109828e-13
+33
+686.453125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2415.9375
+20
+5.675798372961616e-16
+30
+-754.3203125
+11
+2023.986328125
+21
+1.0102270582568185e-13
+31
+693.390625
+12
+2142.52734375
+22
+1.0654075278254682e-13
+32
+772.9140625
+13
+2142.52734375
+23
+1.0654075278254682e-13
+33
+772.9140625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2415.9375
+20
+5.675798372961616e-16
+30
+-754.3203125
+11
+2142.52734375
+21
+1.0654075278254682e-13
+31
+772.9140625
+12
+2244.052734375
+22
+1.0950550362320843e-13
+32
+815.640625
+13
+2244.052734375
+23
+1.0950550362320843e-13
+33
+815.640625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2415.9375
+20
+5.675798372961616e-16
+30
+-754.3203125
+11
+2244.052734375
+21
+1.0950550362320843e-13
+31
+815.640625
+12
+2991.7353515625
+22
+4.592273826833915e-15
+32
+-696.318359375
+13
+2991.7353515625
+23
+4.592273826833915e-15
+33
+-696.318359375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2415.9375
+20
+5.675798372961616e-16
+30
+-754.3203125
+11
+2991.7353515625
+21
+4.592273826833915e-15
+31
+-696.318359375
+12
+2868.6328125
+22
+3.105426072541606e-15
+32
+-717.74609375
+13
+2868.6328125
+23
+3.105426072541606e-15
+33
+-717.74609375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2415.9375
+20
+5.675798372961616e-16
+30
+-754.3203125
+11
+2868.6328125
+21
+3.105426072541606e-15
+31
+-717.74609375
+12
+2746.62890625
+22
+1.4669255393728875e-15
+32
+-741.359375
+13
+2746.62890625
+23
+1.4669255393728875e-15
+33
+-741.359375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2376.52734375
+20
+1.104764066686692e-13
+30
+829.6328125
+11
+2991.7353515625
+21
+4.592273826833915e-15
+31
+-696.318359375
+12
+2244.052734375
+22
+1.0950550362320843e-13
+32
+815.640625
+13
+2244.052734375
+23
+1.0950550362320843e-13
+33
+815.640625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2991.7353515625
+20
+4.592273826833915e-15
+30
+-696.318359375
+11
+2376.52734375
+21
+1.104764066686692e-13
+31
+829.6328125
+12
+2425.658203125
+22
+1.1370136603072734e-13
+32
+876.109375
+13
+2425.658203125
+23
+1.1370136603072734e-13
+33
+876.109375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2991.7353515625
+20
+4.592273826833915e-15
+30
+-696.318359375
+11
+2425.658203125
+21
+1.1370136603072734e-13
+31
+876.109375
+12
+2462.208984375
+22
+1.1774760853844324e-13
+32
+934.421875
+13
+2462.208984375
+23
+1.1774760853844324e-13
+33
+934.421875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2991.7353515625
+20
+4.592273826833915e-15
+30
+-696.318359375
+11
+2462.208984375
+21
+1.1774760853844324e-13
+31
+934.421875
+12
+2467.541015625
+22
+1.1890878906517521e-13
+32
+951.15625
+13
+2467.541015625
+23
+1.1890878906517521e-13
+33
+951.15625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2991.7353515625
+20
+4.592273826833915e-15
+30
+-696.318359375
+11
+2467.541015625
+21
+1.1890878906517521e-13
+31
+951.15625
+12
+2520.75
+22
+1.2434877346562123e-13
+32
+1029.5546875
+13
+2520.75
+23
+1.2434877346562123e-13
+33
+1029.5546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2991.7353515625
+20
+4.592273826833915e-15
+30
+-696.318359375
+11
+2520.75
+21
+1.2434877346562123e-13
+31
+1029.5546875
+12
+3437.982421875
+22
+1.1593915931473742e-14
+32
+-595.4140625
+13
+3437.982421875
+23
+1.1593915931473742e-14
+33
+-595.4140625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+2991.7353515625
+20
+4.592273826833915e-15
+30
+-696.318359375
+11
+3437.982421875
+21
+1.1593915931473742e-14
+31
+-595.4140625
+12
+3114.837890625
+22
+6.079121581126223e-15
+32
+-674.890625
+13
+3114.837890625
+23
+6.079121581126223e-15
+33
+-674.890625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+2544.99609375
+20
+1.2536196039580894e-13
+30
+1044.15625
+11
+3437.982421875
+21
+1.1593915931473742e-14
+31
+-595.4140625
+12
+2520.75
+22
+1.2434877346562123e-13
+32
+1029.5546875
+13
+2520.75
+23
+1.2434877346562123e-13
+33
+1029.5546875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+2544.99609375
+21
+1.2536196039580894e-13
+31
+1044.15625
+12
+2608.728515625
+22
+1.267117921005534e-13
+32
+1063.609375
+13
+2608.728515625
+23
+1.267117921005534e-13
+33
+1063.609375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+2608.728515625
+21
+1.267117921005534e-13
+31
+1063.609375
+12
+2748.861328125
+22
+1.2590351938096545e-13
+32
+1051.9609375
+13
+2748.861328125
+23
+1.2590351938096545e-13
+33
+1051.9609375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+2748.861328125
+21
+1.2590351938096545e-13
+31
+1051.9609375
+12
+2775.17578125
+22
+1.2588075113534325e-13
+32
+1051.6328125
+13
+2775.17578125
+23
+1.2588075113534325e-13
+33
+1051.6328125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+2775.17578125
+21
+1.2588075113534325e-13
+31
+1051.6328125
+12
+2871.55078125
+22
+1.2861456691326545e-13
+32
+1091.03125
+13
+2871.55078125
+23
+1.2861456691326545e-13
+33
+1091.03125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+2871.55078125
+21
+1.2861456691326545e-13
+31
+1091.03125
+12
+3054.92578125
+22
+1.3971896556386199e-13
+32
+1251.0625
+13
+3054.92578125
+23
+1.3971896556386199e-13
+33
+1251.0625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+3054.92578125
+21
+1.3971896556386199e-13
+31
+1251.0625
+12
+3096.50390625
+22
+1.4052723828344993e-13
+32
+1262.7109375
+13
+3096.50390625
+23
+1.4052723828344993e-13
+33
+1262.7109375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+3096.50390625
+21
+1.4052723828344993e-13
+31
+1262.7109375
+12
+3294.228515625
+22
+1.4057277477469432e-13
+32
+1263.3671875
+13
+3294.228515625
+23
+1.4057277477469432e-13
+33
+1263.3671875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+3294.228515625
+21
+1.4057277477469432e-13
+31
+1263.3671875
+12
+3380.175721042694
+22
+1.4057277477469432e-13
+32
+1263.3671875
+13
+3380.175721042694
+23
+1.4057277477469432e-13
+33
+1263.3671875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+3380.175721042694
+21
+1.4057277477469432e-13
+31
+1263.3671875
+12
+3391.025390625
+22
+1.4023125109036139e-13
+32
+1258.4453125
+13
+3391.025390625
+23
+1.4023125109036139e-13
+33
+1258.4453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+3391.025390625
+21
+1.4023125109036139e-13
+31
+1258.4453125
+12
+3392.9298188391676
+22
+1.401838317238979e-13
+32
+1257.761927408368
+13
+3392.9298188391676
+23
+1.401838317238979e-13
+33
+1257.761927408368
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+3392.9298188391676
+21
+1.401838317238979e-13
+31
+1257.761927408368
+12
+4018.76953125
+22
+1.2368036282628392e-14
+32
+-584.2578125
+13
+4018.76953125
+23
+1.2368036282628392e-14
+33
+-584.2578125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3437.982421875
+20
+1.1593915931473742e-14
+30
+-595.4140625
+11
+4018.76953125
+21
+1.2368036282628392e-14
+31
+-584.2578125
+12
+3826.8515625
+22
+1.154837944022935e-14
+32
+-596.0703125
+13
+3826.8515625
+23
+1.154837944022935e-14
+33
+-596.0703125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3826.8515625
+20
+1.154837944022935e-14
+30
+-596.0703125
+11
+4018.76953125
+21
+1.2368036282628392e-14
+31
+-584.2578125
+12
+3866.033203125
+22
+1.1601234296138019e-14
+32
+-595.30859375
+13
+3866.033203125
+23
+1.1601234296138019e-14
+33
+-595.30859375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3310.96875
+20
+1.4141519986271556e-13
+30
+1275.5078125
+11
+3380.175721042694
+21
+1.4057277477469432e-13
+31
+1263.3671875
+12
+3294.228515625
+22
+1.4057277477469432e-13
+32
+1263.3671875
+13
+3294.228515625
+23
+1.4057277477469432e-13
+33
+1263.3671875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3380.175721042694
+20
+1.4057277477469432e-13
+30
+1263.3671875
+11
+3310.96875
+21
+1.4141519986271556e-13
+31
+1275.5078125
+12
+3349.125
+22
+1.4155018303319e-13
+32
+1277.453125
+13
+3349.125
+23
+1.4155018303319e-13
+33
+1277.453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3349.125
+20
+1.4155018303319e-13
+30
+1277.453125
+11
+3310.96875
+21
+1.4141519986271556e-13
+31
+1275.5078125
+12
+3326.25
+22
+1.4882301120622277e-13
+32
+1382.265625
+13
+3326.25
+23
+1.4882301120622277e-13
+33
+1382.265625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3349.125
+20
+1.4155018303319e-13
+30
+1277.453125
+11
+3326.25
+21
+1.4882301120622277e-13
+31
+1382.265625
+12
+3341.40234375
+22
+1.4661774398738725e-13
+32
+1350.484375
+13
+3341.40234375
+23
+1.4661774398738725e-13
+33
+1350.484375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3341.40234375
+20
+1.4661774398738725e-13
+30
+1350.484375
+11
+3326.25
+21
+1.4882301120622277e-13
+31
+1382.265625
+12
+3338.203125
+22
+1.5346204125174512e-13
+32
+1449.12109375
+13
+3338.203125
+23
+1.5346204125174512e-13
+33
+1449.12109375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3351.111328125
+20
+1.5948505537044522e-13
+30
+1535.921875
+11
+3341.40234375
+21
+1.4661774398738725e-13
+31
+1350.484375
+12
+3338.203125
+22
+1.5346204125174512e-13
+32
+1449.12109375
+13
+3338.203125
+23
+1.5346204125174512e-13
+33
+1449.12109375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3341.40234375
+20
+1.4661774398738725e-13
+30
+1350.484375
+11
+3351.111328125
+21
+1.5948505537044522e-13
+31
+1535.921875
+12
+3364.67578125
+22
+1.5645850500595193e-13
+32
+1492.3046875
+13
+3364.67578125
+23
+1.5645850500595193e-13
+33
+1492.3046875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3364.67578125
+20
+1.5645850500595193e-13
+30
+1492.3046875
+11
+3351.111328125
+21
+1.5948505537044522e-13
+31
+1535.921875
+12
+3393.09375
+22
+1.738501920547919e-13
+32
+1742.9453125
+13
+3393.09375
+23
+1.738501920547919e-13
+33
+1742.9453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3364.67578125
+20
+1.5645850500595193e-13
+30
+1492.3046875
+11
+3393.09375
+21
+1.738501920547919e-13
+31
+1742.9453125
+12
+3470.677734375
+22
+1.8266068995895224e-13
+32
+1869.91796875
+13
+3470.677734375
+23
+1.8266068995895224e-13
+33
+1869.91796875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3470.677734375
+20
+1.8266068995895224e-13
+30
+1869.91796875
+11
+3393.09375
+21
+1.738501920547919e-13
+31
+1742.9453125
+12
+3450.919921875
+22
+1.8543760277323074e-13
+32
+1909.9375
+13
+3450.919921875
+23
+1.8543760277323074e-13
+33
+1909.9375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3470.677734375
+20
+1.8266068995895224e-13
+30
+1869.91796875
+11
+3450.919921875
+21
+1.8543760277323074e-13
+31
+1909.9375
+12
+3482.1328125
+22
+1.9784141772755115e-13
+32
+2088.6953125
+13
+3482.1328125
+23
+1.9784141772755115e-13
+33
+2088.6953125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3470.677734375
+20
+1.8266068995895224e-13
+30
+1869.91796875
+11
+3482.1328125
+21
+1.9784141772755115e-13
+31
+2088.6953125
+12
+3482.958984375
+22
+1.8594013048017777e-13
+32
+1917.1796875
+13
+3482.958984375
+23
+1.8594013048017777e-13
+33
+1917.1796875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3482.958984375
+20
+1.8594013048017777e-13
+30
+1917.1796875
+11
+3482.1328125
+21
+1.9784141772755115e-13
+31
+2088.6953125
+12
+3482.994140625
+22
+2.0051831289141786e-13
+32
+2127.2734375
+13
+3482.994140625
+23
+2.0051831289141786e-13
+33
+2127.2734375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3482.958984375
+20
+1.8594013048017777e-13
+30
+1917.1796875
+11
+3482.994140625
+21
+2.0051831289141786e-13
+31
+2127.2734375
+12
+3492.884765625
+22
+1.8934723580721347e-13
+32
+1966.28125
+13
+3492.884765625
+23
+1.8934723580721347e-13
+33
+1966.28125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3492.884765625
+20
+1.8934723580721347e-13
+30
+1966.28125
+11
+3482.994140625
+21
+2.0051831289141786e-13
+31
+2127.2734375
+12
+3497.19140625
+22
+2.083855549055158e-13
+32
+2240.65234375
+13
+3497.19140625
+23
+2.083855549055158e-13
+33
+2240.65234375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3492.884765625
+20
+1.8934723580721347e-13
+30
+1966.28125
+11
+3497.19140625
+21
+2.083855549055158e-13
+31
+2240.65234375
+12
+3496.482421875
+22
+1.914955824119935e-13
+32
+1997.2421875
+13
+3496.482421875
+23
+1.914955824119935e-13
+33
+1997.2421875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3496.482421875
+20
+1.914955824119935e-13
+30
+1997.2421875
+11
+3497.19140625
+21
+2.083855549055158e-13
+31
+2240.65234375
+12
+3502.93359375
+22
+1.9359188731249422e-13
+32
+2027.453125
+13
+3502.93359375
+23
+1.9359188731249422e-13
+33
+2027.453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3502.93359375
+20
+1.9359188731249422e-13
+30
+2027.453125
+11
+3497.19140625
+21
+2.083855549055158e-13
+31
+2240.65234375
+12
+3512.109375
+22
+2.0973050770048407e-13
+32
+2260.03515625
+13
+3512.109375
+23
+2.0973050770048407e-13
+33
+2260.03515625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3502.93359375
+20
+1.9359188731249422e-13
+30
+2027.453125
+11
+3512.109375
+21
+2.0973050770048407e-13
+31
+2260.03515625
+12
+3505.30078125
+22
+1.9475469414248492e-13
+32
+2044.2109375
+13
+3505.30078125
+23
+1.9475469414248492e-13
+33
+2044.2109375
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+3505.30078125
+20
+1.9475469414248492e-13
+30
+2044.2109375
+11
+3512.109375
+21
+2.0973050770048407e-13
+31
+2260.03515625
+12
+3510.234375
+22
+1.9475469414248492e-13
+32
+2044.2109375
+13
+3510.234375
+23
+1.9475469414248492e-13
+33
+2044.2109375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3510.234375
+20
+1.9475469414248492e-13
+30
+2044.2109375
+11
+3512.109375
+21
+2.0973050770048407e-13
+31
+2260.03515625
+12
+3520.23046875
+22
+2.0103710363095217e-13
+32
+2134.75
+13
+3520.23046875
+23
+2.0103710363095217e-13
+33
+2134.75
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3520.23046875
+20
+2.0103710363095217e-13
+30
+2134.75
+11
+3512.109375
+21
+2.0973050770048407e-13
+31
+2260.03515625
+12
+3529.60546875
+22
+2.099947819800274e-13
+32
+2263.84375
+13
+3529.60546875
+23
+2.099947819800274e-13
+33
+2263.84375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3520.23046875
+20
+2.0103710363095217e-13
+30
+2134.75
+11
+3529.60546875
+21
+2.099947819800274e-13
+31
+2263.84375
+12
+3535.5703125
+22
+2.0793588205447744e-13
+32
+2234.171875
+13
+3535.5703125
+23
+2.0793588205447744e-13
+33
+2234.171875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3535.5703125
+20
+2.0793588205447744e-13
+30
+2234.171875
+11
+3529.60546875
+21
+2.099947819800274e-13
+31
+2263.84375
+12
+3535.6171875
+22
+2.0929547157877426e-13
+32
+2253.765625
+13
+3535.6171875
+23
+2.0929547157877426e-13
+33
+2253.765625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3505.30078125
+20
+1.932950869677763e-13
+30
+2023.17578125
+11
+3502.93359375
+21
+1.9359188731249422e-13
+31
+2027.453125
+12
+3505.30078125
+22
+1.9475469414248492e-13
+32
+2044.2109375
+13
+3505.30078125
+23
+1.9475469414248492e-13
+33
+2044.2109375
+70
+2
+ 0
+3DFACE
+ 8
+ship3
+10
+3840.15234375
+20
+1.3077917655063276e-13
+30
+1122.2265625
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+3839.58984375
+22
+1.1935195670317866e-13
+32
+957.54296875
+13
+3839.58984375
+23
+1.1935195670317866e-13
+33
+957.54296875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+4233.10546875
+20
+1.4472797960074502e-13
+30
+1323.25
+11
+3840.15234375
+21
+1.3077917655063276e-13
+31
+1122.2265625
+12
+3896.578125
+22
+1.3787067191031732e-13
+32
+1224.42578125
+13
+3896.578125
+23
+1.3787067191031732e-13
+33
+1224.42578125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4233.10546875
+20
+1.4472797960074502e-13
+30
+1323.25
+11
+3896.578125
+21
+1.3787067191031732e-13
+31
+1224.42578125
+12
+3939.298828125
+22
+1.4063620060178472e-13
+32
+1264.28125
+13
+3939.298828125
+23
+1.4063620060178472e-13
+33
+1264.28125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4233.10546875
+20
+1.4472797960074502e-13
+30
+1323.25
+11
+3939.298828125
+21
+1.4063620060178472e-13
+31
+1264.28125
+12
+4170.8671875
+22
+1.4423358341009163e-13
+32
+1316.125
+13
+4170.8671875
+23
+1.4423358341009163e-13
+33
+1316.125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4170.8671875
+20
+1.4423358341009163e-13
+30
+1316.125
+11
+3939.298828125
+21
+1.4063620060178472e-13
+31
+1264.28125
+12
+4015.76953125
+22
+1.43345621830826e-13
+32
+1303.328125
+13
+4015.76953125
+23
+1.43345621830826e-13
+33
+1303.328125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4170.8671875
+20
+1.4423358341009163e-13
+30
+1316.125
+11
+4015.76953125
+21
+1.43345621830826e-13
+31
+1303.328125
+12
+4087.88671875
+22
+1.4457348079116583e-13
+32
+1321.0234375
+13
+4087.88671875
+23
+1.4457348079116583e-13
+33
+1321.0234375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3391.025390625
+20
+1.4057277477469432e-13
+30
+1263.3671875
+11
+3391.025390625
+21
+1.4023125109036139e-13
+31
+1258.4453125
+12
+3380.175721042694
+22
+1.4057277477469432e-13
+32
+1263.3671875
+13
+3380.175721042694
+23
+1.4057277477469432e-13
+33
+1263.3671875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3391.025390625
+20
+1.4023125109036139e-13
+30
+1258.4453125
+11
+3391.025390625
+21
+1.4057277477469432e-13
+31
+1263.3671875
+12
+3392.9298188391676
+22
+1.401838317238979e-13
+32
+1257.761927408368
+13
+3392.9298188391676
+23
+1.401838317238979e-13
+33
+1257.761927408368
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3534.357421875
+20
+1.950157158155108e-13
+30
+2047.97265625
+11
+3523.060546875
+21
+1.9063445483649688e-13
+31
+1984.83203125
+12
+3523.060546875
+22
+1.9475469414248492e-13
+32
+2044.2109375
+13
+3523.060546875
+23
+1.9475469414248492e-13
+33
+2044.2109375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3523.060546875
+20
+1.9063445483649688e-13
+30
+1984.83203125
+11
+3522.275390625
+21
+1.880364353806785e-13
+31
+1947.390625
+12
+3521.982421875
+22
+1.9063445483649688e-13
+32
+1984.83203125
+13
+3521.982421875
+23
+1.9063445483649688e-13
+33
+1984.83203125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+3522.275390625
+20
+1.880364353806785e-13
+30
+1947.390625
+11
+3523.060546875
+21
+1.9063445483649688e-13
+31
+1984.83203125
+12
+3536.525390625
+22
+1.7973578354812947e-13
+32
+1827.765625
+13
+3536.525390625
+23
+1.7973578354812947e-13
+33
+1827.765625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3536.525390625
+20
+1.7973578354812947e-13
+30
+1827.765625
+11
+3523.060546875
+21
+1.9063445483649688e-13
+31
+1984.83203125
+12
+3534.357421875
+22
+1.950157158155108e-13
+32
+2047.97265625
+13
+3534.357421875
+23
+1.950157158155108e-13
+33
+2047.97265625
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+3536.525390625
+20
+1.7973578354812947e-13
+30
+1827.765625
+11
+3534.357421875
+21
+1.950157158155108e-13
+31
+2047.97265625
+12
+3548.267578125
+22
+1.9363417119722115e-13
+32
+2028.0625
+13
+3548.267578125
+23
+1.9363417119722115e-13
+33
+2028.0625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3536.525390625
+20
+1.7973578354812947e-13
+30
+1827.765625
+11
+3548.267578125
+21
+1.9363417119722115e-13
+31
+2028.0625
+12
+3562.6875
+22
+1.6861674816820438e-13
+32
+1667.5234375
+13
+3562.6875
+23
+1.6861674816820438e-13
+33
+1667.5234375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3562.6875
+20
+1.6861674816820438e-13
+30
+1667.5234375
+11
+3548.267578125
+21
+1.9363417119722115e-13
+31
+2028.0625
+12
+3563.82421875
+22
+1.8440571335556766e-13
+32
+1895.06640625
+13
+3563.82421875
+23
+1.8440571335556766e-13
+33
+1895.06640625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3562.6875
+20
+1.6861674816820438e-13
+30
+1667.5234375
+11
+3563.82421875
+21
+1.8440571335556766e-13
+31
+1895.06640625
+12
+3575.07421875
+22
+1.6533324188883203e-13
+32
+1620.203125
+13
+3575.07421875
+23
+1.6533324188883203e-13
+33
+1620.203125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3575.07421875
+20
+1.6533324188883203e-13
+30
+1620.203125
+11
+3563.82421875
+21
+1.8440571335556766e-13
+31
+1895.06640625
+12
+3585.92578125
+22
+1.7593186022596408e-13
+32
+1772.9453125
+13
+3585.92578125
+23
+1.7593186022596408e-13
+33
+1772.9453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3575.07421875
+20
+1.6533324188883203e-13
+30
+1620.203125
+11
+3585.92578125
+21
+1.7593186022596408e-13
+31
+1772.9453125
+12
+3605.42578125
+22
+1.5741639762534287e-13
+32
+1506.109375
+13
+3605.42578125
+23
+1.5741639762534287e-13
+33
+1506.109375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3605.42578125
+20
+1.5741639762534287e-13
+30
+1506.109375
+11
+3585.92578125
+21
+1.7593186022596408e-13
+31
+1772.9453125
+12
+3588.556640625
+22
+1.7509431404771902e-13
+32
+1760.875
+13
+3588.556640625
+23
+1.7509431404771902e-13
+33
+1760.875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3605.42578125
+20
+1.5741639762534287e-13
+30
+1506.109375
+11
+3588.556640625
+21
+1.7509431404771902e-13
+31
+1760.875
+12
+3602.40234375
+22
+1.6541862280991526e-13
+32
+1621.43359375
+13
+3602.40234375
+23
+1.6541862280991526e-13
+33
+1621.43359375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3605.42578125
+20
+1.5741639762534287e-13
+30
+1506.109375
+11
+3602.40234375
+21
+1.6541862280991526e-13
+31
+1621.43359375
+12
+3603.345703125
+22
+1.6292306045939675e-13
+32
+1585.46875
+13
+3603.345703125
+23
+1.6292306045939675e-13
+33
+1585.46875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3605.42578125
+20
+1.5741639762534287e-13
+30
+1506.109375
+11
+3603.345703125
+21
+1.6292306045939675e-13
+31
+1585.46875
+12
+3604.001953125
+22
+1.6293932349198403e-13
+32
+1585.703125
+13
+3604.001953125
+23
+1.6293932349198403e-13
+33
+1585.703125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3605.42578125
+20
+1.5741639762534287e-13
+30
+1506.109375
+11
+3604.001953125
+21
+1.6293932349198403e-13
+31
+1585.703125
+12
+3806.30859375
+22
+1.2223132662275704e-13
+32
+999.0390625
+13
+3806.30859375
+23
+1.2223132662275704e-13
+33
+999.0390625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3605.42578125
+20
+1.5741639762534287e-13
+30
+1506.109375
+11
+3806.30859375
+21
+1.2223132662275704e-13
+31
+999.0390625
+12
+3760.6640625
+22
+1.2617999093494925e-13
+32
+1055.9453125
+13
+3760.6640625
+23
+1.2617999093494925e-13
+33
+1055.9453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3760.6640625
+20
+1.2617999093494925e-13
+30
+1055.9453125
+11
+3806.30859375
+21
+1.2223132662275704e-13
+31
+999.0390625
+12
+3809.349609375
+22
+1.155634832619712e-13
+32
+902.9453125
+13
+3809.349609375
+23
+1.155634832619712e-13
+33
+902.9453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+3809.349609375
+20
+1.155634832619712e-13
+30
+902.9453125
+11
+3806.30859375
+21
+1.2223132662275704e-13
+31
+999.0390625
+12
+3839.58984375
+22
+1.1935195670317866e-13
+32
+957.54296875
+13
+3839.58984375
+23
+1.1935195670317866e-13
+33
+957.54296875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+3453.662109375
+20
+1.38671626265241e-13
+30
+1235.96875
+11
+4018.76953125
+21
+1.2368036282628392e-14
+31
+-584.2578125
+12
+3392.9298188391676
+22
+1.401838317238979e-13
+32
+1257.761927408368
+13
+3392.9298188391676
+23
+1.401838317238979e-13
+33
+1257.761927408368
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3453.662109375
+21
+1.38671626265241e-13
+31
+1235.96875
+12
+3561.052734375
+22
+1.3462863636404254e-13
+32
+1177.703125
+13
+3561.052734375
+23
+1.3462863636404254e-13
+33
+1177.703125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3561.052734375
+21
+1.3462863636404254e-13
+31
+1177.703125
+12
+3565.998046875
+22
+1.3341297467814317e-13
+32
+1160.18359375
+13
+3565.998046875
+23
+1.3341297467814317e-13
+33
+1160.18359375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3565.998046875
+21
+1.3341297467814317e-13
+31
+1160.18359375
+12
+3575.68359375
+22
+1.3454894750436486e-13
+32
+1176.5546875
+13
+3575.68359375
+23
+1.3454894750436486e-13
+33
+1176.5546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3575.68359375
+21
+1.3454894750436486e-13
+31
+1176.5546875
+12
+3588.708984375
+22
+1.3739335190388058e-13
+32
+1217.546875
+13
+3588.708984375
+23
+1.3739335190388058e-13
+33
+1217.546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3588.708984375
+21
+1.3739335190388058e-13
+31
+1217.546875
+12
+3614.349609375
+22
+1.3377320084995148e-13
+32
+1165.375
+13
+3614.349609375
+23
+1.3377320084995148e-13
+33
+1165.375
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+3614.349609375
+20
+1.3377320084995148e-13
+30
+1165.375
+11
+3588.708984375
+21
+1.3739335190388058e-13
+31
+1217.546875
+12
+3613.494140625
+22
+1.3604026759261867e-13
+32
+1198.046875
+13
+3613.494140625
+23
+1.3604026759261867e-13
+33
+1198.046875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3614.349609375
+21
+1.3377320084995148e-13
+31
+1165.375
+12
+3641.02734375
+22
+1.2900487969536023e-13
+32
+1096.65625
+13
+3641.02734375
+23
+1.2900487969536023e-13
+33
+1096.65625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3641.02734375
+21
+1.2900487969536023e-13
+31
+1096.65625
+12
+3809.349609375
+22
+1.155634832619712e-13
+32
+902.9453125
+13
+3809.349609375
+23
+1.155634832619712e-13
+33
+902.9453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3809.349609375
+21
+1.155634832619712e-13
+31
+902.9453125
+12
+3839.58984375
+22
+1.1935195670317866e-13
+32
+957.54296875
+13
+3839.58984375
+23
+1.1935195670317866e-13
+33
+957.54296875
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+3839.58984375
+21
+1.1935195670317866e-13
+31
+957.54296875
+12
+4233.10546875
+22
+1.4472797960074502e-13
+32
+1323.25
+13
+4233.10546875
+23
+1.4472797960074502e-13
+33
+1323.25
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4018.76953125
+20
+1.2368036282628392e-14
+30
+-584.2578125
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+4036.734375
+22
+6.027079876846919e-15
+32
+-675.640625
+13
+4036.734375
+23
+6.027079876846919e-15
+33
+-675.640625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4036.734375
+20
+6.027079876846919e-15
+30
+-675.640625
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+4075.119140625
+22
+3.2802536728548937e-15
+32
+-715.2265625
+13
+4075.119140625
+23
+3.2802536728548937e-15
+33
+-715.2265625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4075.119140625
+20
+3.2802536728548937e-15
+30
+-715.2265625
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+4212.01171875
+22
+8.424250880212369e-16
+32
+-750.359375
+13
+4212.01171875
+23
+8.424250880212369e-16
+33
+-750.359375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4212.01171875
+20
+8.424250880212369e-16
+30
+-750.359375
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+4295.923828125
+22
+0.0
+32
+-762.5
+13
+4295.923828125
+23
+0.0
+33
+-762.5
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4295.923828125
+20
+0.0
+30
+-762.5
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+4337.970703125
+22
+5.610746242612485e-16
+32
+-754.4140625
+13
+4337.970703125
+23
+5.610746242612485e-16
+33
+-754.4140625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4337.970703125
+20
+5.610746242612485e-16
+30
+-754.4140625
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+4563.650390625
+22
+1.3221845493460727e-15
+32
+-743.4453125
+13
+4563.650390625
+23
+1.3221845493460727e-15
+33
+-743.4453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4563.650390625
+20
+1.3221845493460727e-15
+30
+-743.4453125
+11
+4233.10546875
+21
+1.4472797960074502e-13
+31
+1323.25
+12
+4754.244140625
+22
+1.4100049253173985e-15
+32
+-742.1796875
+13
+4754.244140625
+23
+1.4100049253173985e-15
+33
+-742.1796875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+4465.587890625
+20
+1.623912592937926e-13
+30
+1577.8046875
+11
+4459.892578125
+21
+1.547996756820491e-13
+31
+1468.3984375
+12
+4458.580078125
+22
+1.7004138982285033e-13
+32
+1688.0546875
+13
+4458.580078125
+23
+1.7004138982285033e-13
+33
+1688.0546875
+70
+2
+ 0
+3DFACE
+ 8
+ship3
+10
+4300.376953125
+20
+1.5049322465293669e-13
+30
+1406.3359375
+11
+4754.244140625
+21
+1.4100049253173985e-15
+31
+-742.1796875
+12
+4233.10546875
+22
+1.4472797960074502e-13
+32
+1323.25
+13
+4233.10546875
+23
+1.4472797960074502e-13
+33
+1323.25
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4300.376953125
+21
+1.5049322465293669e-13
+31
+1406.3359375
+12
+4328.220703125
+22
+1.5700494290088463e-13
+32
+1500.1796875
+13
+4328.220703125
+23
+1.5700494290088463e-13
+33
+1500.1796875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4328.220703125
+21
+1.5700494290088463e-13
+31
+1500.1796875
+12
+4363.869140625
+22
+1.7015848365747877e-13
+32
+1689.7421875
+13
+4363.869140625
+23
+1.7015848365747877e-13
+33
+1689.7421875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4363.869140625
+21
+1.7015848365747877e-13
+31
+1689.7421875
+12
+4367.642578125
+22
+1.741835842228312e-13
+32
+1747.75
+13
+4367.642578125
+23
+1.741835842228312e-13
+33
+1747.75
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4367.642578125
+21
+1.741835842228312e-13
+31
+1747.75
+12
+4395.814453125
+22
+1.7614490595285748e-13
+32
+1776.015625
+13
+4395.814453125
+23
+1.7614490595285748e-13
+33
+1776.015625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4395.814453125
+21
+1.7614490595285748e-13
+31
+1776.015625
+12
+4420.166015625
+22
+1.7533663323326953e-13
+32
+1764.3671875
+13
+4420.166015625
+23
+1.7533663323326953e-13
+33
+1764.3671875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4420.166015625
+21
+1.7533663323326953e-13
+31
+1764.3671875
+12
+4459.892578125
+22
+1.547996756820491e-13
+32
+1468.3984375
+13
+4459.892578125
+23
+1.547996756820491e-13
+33
+1468.3984375
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+4459.892578125
+20
+1.547996756820491e-13
+30
+1468.3984375
+11
+4420.166015625
+21
+1.7533663323326953e-13
+31
+1764.3671875
+12
+4458.580078125
+22
+1.7004138982285033e-13
+32
+1688.0546875
+13
+4458.580078125
+23
+1.7004138982285033e-13
+33
+1688.0546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4459.892578125
+21
+1.547996756820491e-13
+31
+1468.3984375
+12
+4482.697265625
+22
+1.5246593050577406e-13
+32
+1434.765625
+13
+4482.697265625
+23
+1.5246593050577406e-13
+33
+1434.765625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4482.697265625
+21
+1.5246593050577406e-13
+31
+1434.765625
+12
+4621.751953125
+22
+1.459956829909237e-13
+32
+1341.51953125
+13
+4621.751953125
+23
+1.459956829909237e-13
+33
+1341.51953125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4621.751953125
+21
+1.459956829909237e-13
+31
+1341.51953125
+12
+4695.673828125
+22
+1.3722421636497284e-13
+32
+1215.109375
+13
+4695.673828125
+23
+1.3722421636497284e-13
+33
+1215.109375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4695.673828125
+21
+1.3722421636497284e-13
+31
+1215.109375
+12
+4697.712890625
+22
+1.354775666650987e-13
+32
+1189.9375
+13
+4697.712890625
+23
+1.354775666650987e-13
+33
+1189.9375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4697.712890625
+21
+1.354775666650987e-13
+31
+1189.9375
+12
+4742.126953125
+22
+1.3317390809911012e-13
+32
+1156.73828125
+13
+4742.126953125
+23
+1.3317390809911012e-13
+33
+1156.73828125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4754.244140625
+20
+1.4100049253173985e-15
+30
+-742.1796875
+11
+4742.126953125
+21
+1.3317390809911012e-13
+31
+1156.73828125
+12
+4946.595703125
+22
+2.3735896061138906e-15
+32
+-728.29296875
+13
+4946.595703125
+23
+2.3735896061138906e-15
+33
+-728.29296875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4946.595703125
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+4742.126953125
+21
+1.3317390809911012e-13
+31
+1156.73828125
+12
+5111.958984375
+22
+2.844404399515721e-15
+32
+-721.5078125
+13
+5111.958984375
+23
+2.844404399515721e-15
+33
+-721.5078125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+4862.267578125
+20
+1.3408057216585112e-13
+30
+1169.8046875
+11
+4868.642578125
+21
+1.2816408091059772e-13
+31
+1084.5390625
+12
+4867.892578125
+22
+1.2547254901740246e-13
+32
+1045.75
+13
+4867.892578125
+23
+1.2547254901740246e-13
+33
+1045.75
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+4868.642578125
+20
+1.2816408091059772e-13
+30
+1084.5390625
+11
+4862.267578125
+21
+1.3408057216585112e-13
+31
+1169.8046875
+12
+4879.705078125
+22
+1.333487356994234e-13
+32
+1159.2578125
+13
+4879.705078125
+23
+1.333487356994234e-13
+33
+1159.2578125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5036.666015625
+20
+1.3377807975972766e-13
+30
+1165.4453125
+11
+5027.783203125
+21
+1.1995450206053748e-13
+31
+966.2265625
+12
+5019.556640625
+22
+1.340943957435503e-13
+32
+1170.00390625
+13
+5019.556640625
+23
+1.340943957435503e-13
+33
+1170.00390625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5027.783203125
+20
+1.1995450206053748e-13
+30
+966.2265625
+11
+5036.666015625
+21
+1.3377807975972766e-13
+31
+1165.4453125
+12
+5048.244140625
+22
+1.2243298822683935e-13
+32
+1001.9453125
+13
+5048.244140625
+23
+1.2243298822683935e-13
+33
+1001.9453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5048.244140625
+20
+1.2243298822683935e-13
+30
+1001.9453125
+11
+5036.666015625
+21
+1.3377807975972766e-13
+31
+1165.4453125
+12
+5087.994140625
+22
+1.2657355632356149e-13
+32
+1061.6171875
+13
+5087.994140625
+23
+1.2657355632356149e-13
+33
+1061.6171875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5048.244140625
+20
+1.2243298822683935e-13
+30
+1001.9453125
+11
+5087.994140625
+21
+1.2657355632356149e-13
+31
+1061.6171875
+12
+5085.369140625
+22
+1.259409243559162e-13
+32
+1052.5
+13
+5085.369140625
+23
+1.259409243559162e-13
+33
+1052.5
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+4742.126953125
+20
+1.3317390809911012e-13
+30
+1156.73828125
+11
+4867.892578125
+21
+1.2547254901740246e-13
+31
+1045.75
+12
+5111.958984375
+22
+2.844404399515721e-15
+32
+-721.5078125
+13
+5111.958984375
+23
+2.844404399515721e-15
+33
+-721.5078125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+4867.892578125
+20
+1.2547254901740246e-13
+30
+1045.75
+11
+4742.126953125
+21
+1.3317390809911012e-13
+31
+1156.73828125
+12
+4862.267578125
+22
+1.3408057216585112e-13
+32
+1169.8046875
+13
+4862.267578125
+23
+1.3408057216585112e-13
+33
+1169.8046875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5111.958984375
+20
+2.844404399515721e-15
+30
+-721.5078125
+11
+4867.892578125
+21
+1.2547254901740246e-13
+31
+1045.75
+12
+4927.869140625
+22
+1.2958221735220876e-13
+32
+1104.9765625
+13
+4927.869140625
+23
+1.2958221735220876e-13
+33
+1104.9765625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5111.958984375
+20
+2.844404399515721e-15
+30
+-721.5078125
+11
+4927.869140625
+21
+1.2958221735220876e-13
+31
+1104.9765625
+12
+5027.783203125
+22
+1.1995450206053748e-13
+32
+966.2265625
+13
+5027.783203125
+23
+1.1995450206053748e-13
+33
+966.2265625
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+5027.783203125
+20
+1.1995450206053748e-13
+30
+966.2265625
+11
+4927.869140625
+21
+1.2958221735220876e-13
+31
+1104.9765625
+12
+5019.556640625
+22
+1.340943957435503e-13
+32
+1170.00390625
+13
+5019.556640625
+23
+1.340943957435503e-13
+33
+1170.00390625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5111.958984375
+20
+2.844404399515721e-15
+30
+-721.5078125
+11
+5027.783203125
+21
+1.1995450206053748e-13
+31
+966.2265625
+12
+5434.892578125
+22
+5.631888184975953e-15
+32
+-681.3359375
+13
+5434.892578125
+23
+5.631888184975953e-15
+33
+-681.3359375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5111.958984375
+20
+2.844404399515721e-15
+30
+-721.5078125
+11
+5434.892578125
+21
+5.631888184975953e-15
+31
+-681.3359375
+12
+5277.322265625
+22
+3.315219192917551e-15
+32
+-714.72265625
+13
+5277.322265625
+23
+3.315219192917551e-15
+33
+-714.72265625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5277.322265625
+20
+3.315219192917551e-15
+30
+-714.72265625
+11
+5434.892578125
+21
+5.631888184975953e-15
+31
+-681.3359375
+12
+5296.212890625
+22
+3.403852720518241e-15
+32
+-713.4453125
+13
+5296.212890625
+23
+3.403852720518241e-15
+33
+-713.4453125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5451.861328125
+20
+1.3483680318115976e-13
+30
+1180.703125
+11
+5383.400390625
+21
+1.1767930380157665e-13
+31
+933.4375
+12
+5367.134765625
+22
+1.3252745255376563e-13
+32
+1147.421875
+13
+5367.134765625
+23
+1.3252745255376563e-13
+33
+1147.421875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5383.400390625
+20
+1.1767930380157665e-13
+30
+933.4375
+11
+5451.861328125
+21
+1.3483680318115976e-13
+31
+1180.703125
+12
+5426.853515625
+22
+1.2053346602064474e-13
+32
+974.5703125
+13
+5426.853515625
+23
+1.2053346602064474e-13
+33
+974.5703125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5426.853515625
+20
+1.2053346602064474e-13
+30
+974.5703125
+11
+5451.861328125
+21
+1.3483680318115976e-13
+31
+1180.703125
+12
+5477.548828125
+22
+1.240072497812883e-13
+32
+1024.6328125
+13
+5477.548828125
+23
+1.240072497812883e-13
+33
+1024.6328125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5477.548828125
+20
+1.240072497812883e-13
+30
+1024.6328125
+11
+5451.861328125
+21
+1.3483680318115976e-13
+31
+1180.703125
+12
+5465.314453125
+22
+1.3423100521728348e-13
+32
+1171.97265625
+13
+5465.314453125
+23
+1.3423100521728348e-13
+33
+1171.97265625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5477.548828125
+20
+1.240072497812883e-13
+30
+1024.6328125
+11
+5465.314453125
+21
+1.3423100521728348e-13
+31
+1171.97265625
+12
+5498.126953125
+22
+1.2974159507156413e-13
+32
+1107.2734375
+13
+5498.126953125
+23
+1.2974159507156413e-13
+33
+1107.2734375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5063.431640625
+20
+1.1949263193505866e-13
+30
+959.5703125
+11
+5434.892578125
+21
+5.631888184975953e-15
+31
+-681.3359375
+12
+5027.783203125
+22
+1.1995450206053748e-13
+32
+966.2265625
+13
+5027.783203125
+23
+1.1995450206053748e-13
+33
+966.2265625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5434.892578125
+20
+5.631888184975953e-15
+30
+-681.3359375
+11
+5063.431640625
+21
+1.1949263193505866e-13
+31
+959.5703125
+12
+5190.603515625
+22
+1.2138402262495962e-13
+32
+986.828125
+13
+5190.603515625
+23
+1.2138402262495962e-13
+33
+986.828125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5434.892578125
+20
+5.631888184975953e-15
+30
+-681.3359375
+11
+5190.603515625
+21
+1.2138402262495962e-13
+31
+986.828125
+12
+5293.400390625
+22
+1.2737532383011452e-13
+32
+1073.171875
+13
+5293.400390625
+23
+1.2737532383011452e-13
+33
+1073.171875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5434.892578125
+20
+5.631888184975953e-15
+30
+-681.3359375
+11
+5293.400390625
+21
+1.2737532383011452e-13
+31
+1073.171875
+12
+5367.134765625
+22
+1.3252745255376563e-13
+32
+1147.421875
+13
+5367.134765625
+23
+1.3252745255376563e-13
+33
+1147.421875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5434.892578125
+20
+5.631888184975953e-15
+30
+-681.3359375
+11
+5367.134765625
+21
+1.3252745255376563e-13
+31
+1147.421875
+12
+5383.400390625
+22
+1.1767930380157665e-13
+32
+933.4375
+13
+5383.400390625
+23
+1.1767930380157665e-13
+33
+933.4375
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+5434.892578125
+20
+5.631888184975953e-15
+30
+-681.3359375
+11
+5383.400390625
+21
+1.1767930380157665e-13
+31
+933.4375
+12
+5394.580078125
+22
+1.1165385022798846e-13
+32
+846.6015625
+13
+5394.580078125
+23
+1.1165385022798846e-13
+33
+846.6015625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5434.892578125
+20
+5.631888184975953e-15
+30
+-681.3359375
+11
+5394.580078125
+21
+1.1165385022798846e-13
+31
+846.6015625
+12
+5406.111328125
+22
+1.1039834411225025e-13
+32
+828.5078125
+13
+5406.111328125
+23
+1.1039834411225025e-13
+33
+828.5078125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5434.892578125
+20
+5.631888184975953e-15
+30
+-681.3359375
+11
+5406.111328125
+21
+1.1039834411225025e-13
+31
+828.5078125
+12
+5625.134765625
+22
+4.098284211995207e-15
+32
+-703.4375
+13
+5625.134765625
+23
+4.098284211995207e-15
+33
+-703.4375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5625.134765625
+20
+4.098284211995207e-15
+30
+-703.4375
+11
+5406.111328125
+21
+1.1039834411225025e-13
+31
+828.5078125
+12
+5872.962890625
+22
+1.5368565794982025e-15
+32
+-740.3515625
+13
+5872.962890625
+23
+1.5368565794982025e-15
+33
+-740.3515625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5830.423828125
+20
+1.1485278873790694e-13
+30
+892.703125
+11
+5776.541015625
+21
+1.0952501926231317e-13
+31
+815.921875
+12
+5775.706477050341
+22
+1.0987827545937493e-13
+32
+821.0128333278517
+13
+5775.706477050341
+23
+1.0987827545937493e-13
+33
+821.0128333278517
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5776.541015625
+20
+1.0952501926231317e-13
+30
+815.921875
+11
+5830.423828125
+21
+1.1485278873790694e-13
+31
+892.703125
+12
+5817.134765625
+22
+1.092908315930563e-13
+32
+812.546875
+13
+5817.134765625
+23
+1.092908315930563e-13
+33
+812.546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5512.611328125
+20
+1.094632197384815e-13
+30
+815.03125
+11
+5872.962890625
+21
+1.5368565794982025e-15
+31
+-740.3515625
+12
+5406.111328125
+22
+1.1039834411225025e-13
+32
+828.5078125
+13
+5406.111328125
+23
+1.1039834411225025e-13
+33
+828.5078125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5512.611328125
+21
+1.094632197384815e-13
+31
+815.03125
+12
+5618.876953125
+22
+1.0943069367330693e-13
+32
+814.5625
+13
+5618.876953125
+23
+1.0943069367330693e-13
+33
+814.5625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5618.876953125
+21
+1.0943069367330693e-13
+31
+814.5625
+12
+5675.572265625
+22
+1.0778406162384457e-13
+32
+790.83203125
+13
+5675.572265625
+23
+1.0778406162384457e-13
+33
+790.83203125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5675.572265625
+21
+1.0778406162384457e-13
+31
+790.83203125
+12
+5702.759765625
+22
+1.083638387355812e-13
+32
+799.1875
+13
+5702.759765625
+23
+1.083638387355812e-13
+33
+799.1875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5702.759765625
+21
+1.083638387355812e-13
+31
+799.1875
+12
+5761.212890625
+22
+1.0856062142988732e-13
+32
+802.0234375
+13
+5761.212890625
+23
+1.0856062142988732e-13
+33
+802.0234375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5761.212890625
+21
+1.0856062142988732e-13
+31
+802.0234375
+12
+5776.541015625
+22
+1.0952501926231317e-13
+32
+815.921875
+13
+5776.541015625
+23
+1.0952501926231317e-13
+33
+815.921875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5776.541015625
+21
+1.0952501926231317e-13
+31
+815.921875
+12
+5817.134765625
+22
+1.092908315930563e-13
+32
+812.546875
+13
+5817.134765625
+23
+1.092908315930563e-13
+33
+812.546875
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5817.134765625
+21
+1.092908315930563e-13
+31
+812.546875
+12
+5827.048828125
+22
+1.0883058777083621e-13
+32
+805.9140625
+13
+5827.048828125
+23
+1.0883058777083621e-13
+33
+805.9140625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5827.048828125
+21
+1.0883058777083621e-13
+31
+805.9140625
+12
+5929.072265625
+22
+1.0939328869835618e-13
+32
+814.0234375
+13
+5929.072265625
+23
+1.0939328869835618e-13
+33
+814.0234375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5872.962890625
+20
+1.5368565794982025e-15
+30
+-740.3515625
+11
+5929.072265625
+21
+1.0939328869835618e-13
+31
+814.0234375
+12
+5953.236328125
+22
+2.3735896061138906e-15
+32
+-728.29296875
+13
+5953.236328125
+23
+2.3735896061138906e-15
+33
+-728.29296875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5953.236328125
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+5929.072265625
+21
+1.0939328869835618e-13
+31
+814.0234375
+12
+6098.876953125
+22
+1.06695251592126e-13
+32
+775.140625
+13
+6098.876953125
+23
+1.06695251592126e-13
+33
+775.140625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5953.236328125
+20
+2.3735896061138906e-15
+30
+-728.29296875
+11
+6098.876953125
+21
+1.06695251592126e-13
+31
+775.140625
+12
+6159.158203125
+22
+3.1599072317090027e-15
+32
+-716.9609375
+13
+6159.158203125
+23
+3.1599072317090027e-15
+33
+-716.9609375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6159.158203125
+20
+3.1599072317090027e-15
+30
+-716.9609375
+11
+6098.876953125
+21
+1.06695251592126e-13
+31
+775.140625
+12
+6489.462890625
+22
+4.2869353900076845e-15
+32
+-700.71875
+13
+6489.462890625
+23
+4.2869353900076845e-15
+33
+-700.71875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6159.158203125
+20
+3.1599072317090027e-15
+30
+-716.9609375
+11
+6489.462890625
+21
+4.2869353900076845e-15
+31
+-700.71875
+12
+6323.408203125
+22
+3.270495853302524e-15
+32
+-715.3671875
+13
+6323.408203125
+23
+3.270495853302524e-15
+33
+-715.3671875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5686.541015625
+20
+1.4015969374697734e-13
+30
+1257.4140625
+11
+5670.931640625
+21
+1.2962287493367697e-13
+31
+1105.5625
+12
+5632.330078125
+22
+1.3212819510374785e-13
+32
+1141.66796875
+13
+5632.330078125
+23
+1.3212819510374785e-13
+33
+1141.66796875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5670.931640625
+20
+1.2962287493367697e-13
+30
+1105.5625
+11
+5686.541015625
+21
+1.4015969374697734e-13
+31
+1257.4140625
+12
+5718.251953125
+22
+1.3974092065785482e-13
+32
+1251.37890625
+13
+5718.251953125
+23
+1.3974092065785482e-13
+33
+1251.37890625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5718.251953125
+20
+1.3974092065785482e-13
+30
+1251.37890625
+11
+5686.541015625
+21
+1.4015969374697734e-13
+31
+1257.4140625
+12
+5738.595703125
+22
+1.429943403269407e-13
+32
+1298.265625
+13
+5738.595703125
+23
+1.429943403269407e-13
+33
+1298.265625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5619.955078125
+20
+1.1556673586848865e-13
+30
+902.9921875
+11
+5675.572265625
+21
+1.0778406162384457e-13
+31
+790.83203125
+12
+5618.876953125
+22
+1.0943069367330693e-13
+32
+814.5625
+13
+5618.876953125
+23
+1.0943069367330693e-13
+33
+814.5625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5675.572265625
+20
+1.0778406162384457e-13
+30
+790.83203125
+11
+5619.955078125
+21
+1.1556673586848865e-13
+31
+902.9921875
+12
+5632.330078125
+22
+1.3212819510374785e-13
+32
+1141.66796875
+13
+5632.330078125
+23
+1.3212819510374785e-13
+33
+1141.66796875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5675.572265625
+20
+1.0778406162384457e-13
+30
+790.83203125
+11
+5632.330078125
+21
+1.3212819510374785e-13
+31
+1141.66796875
+12
+5671.798828125
+22
+1.0995680277750552e-13
+32
+822.14453125
+13
+5671.798828125
+23
+1.0995680277750552e-13
+33
+822.14453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5671.798828125
+20
+1.0995680277750552e-13
+30
+822.14453125
+11
+5632.330078125
+21
+1.3212819510374785e-13
+31
+1141.66796875
+12
+5670.931640625
+22
+1.2962287493367697e-13
+32
+1105.5625
+13
+5670.931640625
+23
+1.2962287493367697e-13
+33
+1105.5625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5831.830078125
+20
+1.2872515553485897e-13
+30
+1092.625
+11
+5755.048828125
+21
+1.1862255969163904e-13
+31
+947.03125
+12
+5749.072265625
+22
+1.237576122310735e-13
+32
+1021.03515625
+13
+5749.072265625
+23
+1.237576122310735e-13
+33
+1021.03515625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5755.048828125
+20
+1.1862255969163904e-13
+30
+947.03125
+11
+5831.830078125
+21
+1.2872515553485897e-13
+31
+1092.625
+12
+5775.706477050341
+22
+1.0987827545937493e-13
+32
+821.0128333278517
+13
+5775.706477050341
+23
+1.0987827545937493e-13
+33
+821.0128333278517
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5775.706477050341
+20
+1.0987827545937493e-13
+30
+821.0128333278517
+11
+5831.830078125
+21
+1.2872515553485897e-13
+31
+1092.625
+12
+5830.423828125
+22
+1.1485278873790694e-13
+32
+892.703125
+13
+5830.423828125
+23
+1.1485278873790694e-13
+33
+892.703125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5830.423828125
+20
+1.1485278873790694e-13
+30
+892.703125
+11
+5831.830078125
+21
+1.2872515553485897e-13
+31
+1092.625
+12
+5848.166015625
+22
+1.1660106474103982e-13
+32
+917.8984375
+13
+5848.166015625
+23
+1.1660106474103982e-13
+33
+917.8984375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5848.166015625
+20
+1.1660106474103982e-13
+30
+917.8984375
+11
+5831.830078125
+21
+1.2872515553485897e-13
+31
+1092.625
+12
+5855.197265625
+22
+1.305108365129426e-13
+32
+1118.359375
+13
+5855.197265625
+23
+1.305108365129426e-13
+33
+1118.359375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5848.166015625
+20
+1.1660106474103982e-13
+30
+917.8984375
+11
+5855.197265625
+21
+1.305108365129426e-13
+31
+1118.359375
+12
+5883.275390625
+22
+1.229534052696324e-13
+32
+1009.4453125
+13
+5883.275390625
+23
+1.229534052696324e-13
+33
+1009.4453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5883.275390625
+20
+1.229534052696324e-13
+30
+1009.4453125
+11
+5855.197265625
+21
+1.305108365129426e-13
+31
+1118.359375
+12
+5895.345703125
+22
+1.4309029221920566e-13
+32
+1299.6484375
+13
+5895.345703125
+23
+1.4309029221920566e-13
+33
+1299.6484375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+5883.275390625
+20
+1.229534052696324e-13
+30
+1009.4453125
+11
+5895.345703125
+21
+1.4309029221920566e-13
+31
+1299.6484375
+12
+5895.228515625
+22
+1.3310479021061417e-13
+32
+1155.7421875
+13
+5895.228515625
+23
+1.3310479021061417e-13
+33
+1155.7421875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5895.228515625
+20
+1.3310479021061417e-13
+30
+1155.7421875
+11
+5895.345703125
+21
+1.4309029221920566e-13
+31
+1299.6484375
+12
+5934.744140625
+22
+1.4248368110370002e-13
+32
+1290.90625
+13
+5934.744140625
+23
+1.4248368110370002e-13
+33
+1290.90625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+5934.744140625
+20
+1.4248368110370002e-13
+30
+1290.90625
+11
+5895.345703125
+21
+1.4309029221920566e-13
+31
+1299.6484375
+12
+5923.212890625
+22
+1.4416934443137186e-13
+32
+1315.19921875
+13
+5923.212890625
+23
+1.4416934443137186e-13
+33
+1315.19921875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5776.541015625
+20
+1.0952501926231317e-13
+30
+815.921875
+11
+5761.212890625
+21
+1.0856062142988732e-13
+31
+802.0234375
+12
+5775.706477050341
+22
+1.0987827545937493e-13
+32
+821.0128333278517
+13
+5775.706477050341
+23
+1.0987827545937493e-13
+33
+821.0128333278517
+70
+0
+ 0
+3DFACE
+ 8
+ship3
+10
+5980.189453125
+20
+1.2032204659701007e-13
+30
+971.5234375
+11
+5962.587890625
+21
+1.1635142719082503e-13
+31
+914.30078125
+12
+5962.330078125
+22
+1.185534418031431e-13
+32
+946.03515625
+13
+5962.330078125
+23
+1.185534418031431e-13
+33
+946.03515625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5962.587890625
+20
+1.1635142719082503e-13
+30
+914.30078125
+11
+5980.189453125
+21
+1.2032204659701007e-13
+31
+971.5234375
+12
+5974.447265625
+22
+1.1254425126214218e-13
+32
+859.43359375
+13
+5974.447265625
+23
+1.1254425126214218e-13
+33
+859.43359375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6071.689453125
+20
+1.2507085211249658e-13
+30
+1039.9609375
+11
+6067.541015625
+21
+1.0985190621731755e-13
+31
+820.6328125
+12
+6027.884765625
+22
+1.207814772676008e-13
+32
+978.14453125
+13
+6027.884765625
+23
+1.207814772676008e-13
+33
+978.14453125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6067.541015625
+20
+1.0985190621731755e-13
+30
+820.6328125
+11
+6071.689453125
+21
+1.2507085211249658e-13
+31
+1039.9609375
+12
+6079.611328125
+22
+1.1084720381165925e-13
+32
+834.9765625
+13
+6079.611328125
+23
+1.1084720381165925e-13
+33
+834.9765625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6079.611328125
+20
+1.1084720381165925e-13
+30
+834.9765625
+11
+6071.689453125
+21
+1.2507085211249658e-13
+31
+1039.9609375
+12
+6133.025390625
+22
+1.2375192016966796e-13
+32
+1020.953125
+13
+6133.025390625
+23
+1.2375192016966796e-13
+33
+1020.953125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6079.611328125
+20
+1.1084720381165925e-13
+30
+834.9765625
+11
+6133.025390625
+21
+1.2375192016966796e-13
+31
+1020.953125
+12
+6112.541015625
+22
+1.1489507262263388e-13
+32
+893.3125
+13
+6112.541015625
+23
+1.1489507262263388e-13
+33
+893.3125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6112.541015625
+20
+1.1489507262263388e-13
+30
+893.3125
+11
+6133.025390625
+21
+1.2375192016966796e-13
+31
+1020.953125
+12
+6153.134765625
+22
+1.214840402753714e-13
+32
+988.26953125
+13
+6153.134765625
+23
+1.214840402753714e-13
+33
+988.26953125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5974.447265625
+20
+1.1254425126214218e-13
+30
+859.43359375
+11
+6098.876953125
+21
+1.06695251592126e-13
+31
+775.140625
+12
+5929.072265625
+22
+1.0939328869835618e-13
+32
+814.0234375
+13
+5929.072265625
+23
+1.0939328869835618e-13
+33
+814.0234375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+6098.876953125
+20
+1.06695251592126e-13
+30
+775.140625
+11
+5974.447265625
+21
+1.1254425126214218e-13
+31
+859.43359375
+12
+6067.541015625
+22
+1.0985190621731755e-13
+32
+820.6328125
+13
+6067.541015625
+23
+1.0985190621731755e-13
+33
+820.6328125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6067.541015625
+20
+1.0985190621731755e-13
+30
+820.6328125
+11
+5974.447265625
+21
+1.1254425126214218e-13
+31
+859.43359375
+12
+5980.189453125
+22
+1.2032204659701007e-13
+32
+971.5234375
+13
+5980.189453125
+23
+1.2032204659701007e-13
+33
+971.5234375
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+6067.541015625
+20
+1.0985190621731755e-13
+30
+820.6328125
+11
+5980.189453125
+21
+1.2032204659701007e-13
+31
+971.5234375
+12
+6011.173828125
+22
+1.167149059691508e-13
+32
+919.5390625
+13
+6011.173828125
+23
+1.167149059691508e-13
+33
+919.5390625
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+6011.173828125
+20
+1.167149059691508e-13
+30
+919.5390625
+11
+5980.189453125
+21
+1.2032204659701007e-13
+31
+971.5234375
+12
+6000.533203125
+22
+1.1879006892728805e-13
+32
+949.4453125
+13
+6000.533203125
+23
+1.1879006892728805e-13
+33
+949.4453125
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+6067.541015625
+20
+1.0985190621731755e-13
+30
+820.6328125
+11
+6011.173828125
+21
+1.167149059691508e-13
+31
+919.5390625
+12
+6027.884765625
+22
+1.207814772676008e-13
+32
+978.14453125
+13
+6027.884765625
+23
+1.207814772676008e-13
+33
+978.14453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6230.173828125
+20
+1.2509849926789496e-13
+30
+1040.359375
+11
+6198.673828125
+21
+1.2471143909231763e-13
+31
+1034.78125
+12
+6185.689453125
+22
+1.2584497246365123e-13
+32
+1051.1171875
+13
+6185.689453125
+23
+1.2584497246365123e-13
+33
+1051.1171875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+6198.673828125
+20
+1.2471143909231763e-13
+30
+1034.78125
+11
+6230.173828125
+21
+1.2509849926789496e-13
+31
+1040.359375
+12
+6206.455078125
+22
+1.2310790407921157e-13
+32
+1011.671875
+13
+6206.455078125
+23
+1.2310790407921157e-13
+33
+1011.671875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6206.455078125
+20
+1.2310790407921157e-13
+30
+1011.671875
+11
+6230.173828125
+21
+1.2509849926789496e-13
+31
+1040.359375
+12
+6214.822265625
+22
+1.1754757323761966e-13
+32
+931.5390625
+13
+6214.822265625
+23
+1.1754757323761966e-13
+33
+931.5390625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6125.220703125
+20
+1.06686306924203e-13
+30
+775.01171875
+11
+6489.462890625
+21
+4.2869353900076845e-15
+31
+-700.71875
+12
+6098.876953125
+22
+1.06695251592126e-13
+32
+775.140625
+13
+6098.876953125
+23
+1.06695251592126e-13
+33
+775.140625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6125.220703125
+21
+1.06686306924203e-13
+31
+775.01171875
+12
+6186.205078125
+22
+1.1014220134900055e-13
+32
+824.81640625
+13
+6186.205078125
+23
+1.1014220134900055e-13
+33
+824.81640625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6186.205078125
+21
+1.1014220134900055e-13
+31
+824.81640625
+12
+6214.822265625
+22
+1.1754757323761966e-13
+32
+931.5390625
+13
+6214.822265625
+23
+1.1754757323761966e-13
+33
+931.5390625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6214.822265625
+21
+1.1754757323761966e-13
+31
+931.5390625
+12
+6230.173828125
+22
+1.2509849926789496e-13
+32
+1040.359375
+13
+6230.173828125
+23
+1.2509849926789496e-13
+33
+1040.359375
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6230.173828125
+21
+1.2509849926789496e-13
+31
+1040.359375
+12
+6280.376953125
+22
+1.245650717990321e-13
+32
+1032.671875
+13
+6280.376953125
+23
+1.245650717990321e-13
+33
+1032.671875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6280.376953125
+21
+1.245650717990321e-13
+31
+1032.671875
+12
+6371.361328125
+22
+1.2592628762658764e-13
+32
+1052.2890625
+13
+6371.361328125
+23
+1.2592628762658764e-13
+33
+1052.2890625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6371.361328125
+21
+1.2592628762658764e-13
+31
+1052.2890625
+12
+6471.275390625
+22
+1.2695085867958644e-13
+32
+1067.0546875
+13
+6471.275390625
+23
+1.2695085867958644e-13
+33
+1067.0546875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6471.275390625
+21
+1.2695085867958644e-13
+31
+1067.0546875
+12
+6564.509765625
+22
+1.2886989652488579e-13
+32
+1094.7109375
+13
+6564.509765625
+23
+1.2886989652488579e-13
+33
+1094.7109375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6489.462890625
+20
+4.2869353900076845e-15
+30
+-700.71875
+11
+6564.509765625
+21
+1.2886989652488579e-13
+31
+1094.7109375
+12
+6600.955078125
+22
+4.37069000783219e-15
+32
+-699.51171875
+13
+6600.955078125
+23
+4.37069000783219e-15
+33
+-699.51171875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6600.955078125
+20
+4.37069000783219e-15
+30
+-699.51171875
+11
+6564.509765625
+21
+1.2886989652488579e-13
+31
+1094.7109375
+12
+6579.978515625
+22
+1.2951228631208345e-13
+32
+1103.96875
+13
+6579.978515625
+23
+1.2951228631208345e-13
+33
+1103.96875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6600.955078125
+20
+4.37069000783219e-15
+30
+-699.51171875
+11
+6579.978515625
+21
+1.2951228631208345e-13
+31
+1103.96875
+12
+6660.298828125
+22
+1.3051571542271878e-13
+32
+1118.4296875
+13
+6660.298828125
+23
+1.3051571542271878e-13
+33
+1118.4296875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6600.955078125
+20
+4.37069000783219e-15
+30
+-699.51171875
+11
+6660.298828125
+21
+1.3051571542271878e-13
+31
+1118.4296875
+12
+6668.994140625
+22
+7.209402345942362e-15
+32
+-658.6015625
+13
+6668.994140625
+23
+7.209402345942362e-15
+33
+-658.6015625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6668.994140625
+20
+7.209402345942362e-15
+30
+-658.6015625
+11
+6660.298828125
+21
+1.3051571542271878e-13
+31
+1118.4296875
+12
+6702.884765625
+22
+1.2882761264015885e-13
+32
+1094.1015625
+13
+6702.884765625
+23
+1.2882761264015885e-13
+33
+1094.1015625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6668.994140625
+20
+7.209402345942362e-15
+30
+-658.6015625
+11
+6702.884765625
+21
+1.2882761264015885e-13
+31
+1094.1015625
+12
+6898.189453125
+22
+1.0768404397343279e-13
+32
+789.390625
+13
+6898.189453125
+23
+1.0768404397343279e-13
+33
+789.390625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6898.189453125
+20
+1.0768404397343279e-13
+30
+789.390625
+11
+6702.884765625
+21
+1.2882761264015885e-13
+31
+1094.1015625
+12
+6810.650390625
+22
+1.187933215338055e-13
+32
+949.4921875
+13
+6810.650390625
+23
+1.187933215338055e-13
+33
+949.4921875
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+6810.650390625
+20
+1.187933215338055e-13
+30
+949.4921875
+11
+6702.884765625
+21
+1.2882761264015885e-13
+31
+1094.1015625
+12
+6790.845703125
+22
+1.2270945978082315e-13
+32
+1005.9296875
+13
+6790.845703125
+23
+1.2270945978082315e-13
+33
+1005.9296875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6810.650390625
+20
+1.187933215338055e-13
+30
+949.4921875
+11
+6790.845703125
+21
+1.2270945978082315e-13
+31
+1005.9296875
+12
+6805.048828125
+22
+1.208766160082364e-13
+32
+979.515625
+13
+6805.048828125
+23
+1.208766160082364e-13
+33
+979.515625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+6898.189453125
+20
+1.0768404397343279e-13
+30
+789.390625
+11
+6810.650390625
+21
+1.187933215338055e-13
+31
+949.4921875
+12
+6849.767578125
+22
+1.1770451150208694e-13
+32
+933.80078125
+13
+6849.767578125
+23
+1.1770451150208694e-13
+33
+933.80078125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6898.189453125
+20
+1.0768404397343279e-13
+30
+789.390625
+11
+6849.767578125
+21
+1.1770451150208694e-13
+31
+933.80078125
+12
+6895.587890625
+22
+1.1760449385167515e-13
+32
+932.359375
+13
+6895.587890625
+23
+1.1760449385167515e-13
+33
+932.359375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6898.189453125
+20
+1.0768404397343279e-13
+30
+789.390625
+11
+6895.587890625
+21
+1.1760449385167515e-13
+31
+932.359375
+12
+6913.986328125
+22
+1.154252474849793e-13
+32
+900.953125
+13
+6913.986328125
+23
+1.154252474849793e-13
+33
+900.953125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6898.189453125
+20
+1.0768404397343279e-13
+30
+789.390625
+11
+6913.986328125
+21
+1.154252474849793e-13
+31
+900.953125
+12
+6910.400390625
+22
+1.1142779407502523e-13
+32
+843.34375
+13
+6910.400390625
+23
+1.1142779407502523e-13
+33
+843.34375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5965.564453125
+20
+1.4713978733343902e-13
+30
+1358.0078125
+11
+5954.876953125
+21
+1.4608919542830057e-13
+31
+1342.8671875
+12
+5949.017578125
+22
+1.472219156480048e-13
+32
+1359.19140625
+13
+5949.017578125
+23
+1.472219156480048e-13
+33
+1359.19140625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+5954.876953125
+20
+1.4608919542830057e-13
+30
+1342.8671875
+11
+5965.564453125
+21
+1.4713978733343902e-13
+31
+1358.0078125
+12
+6016.494140625
+22
+1.4014749647253688e-13
+32
+1257.23828125
+13
+6016.494140625
+23
+1.4014749647253688e-13
+33
+1257.23828125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6016.494140625
+20
+1.4014749647253688e-13
+30
+1257.23828125
+11
+5965.564453125
+21
+1.4713978733343902e-13
+31
+1358.0078125
+12
+5977.470703125
+22
+1.46954388761944e-13
+32
+1355.3359375
+13
+5977.470703125
+23
+1.46954388761944e-13
+33
+1355.3359375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6016.494140625
+20
+1.4014749647253688e-13
+30
+1257.23828125
+11
+5977.470703125
+21
+1.46954388761944e-13
+31
+1355.3359375
+12
+6035.080078125
+22
+1.457257166499748e-13
+32
+1337.62890625
+13
+6035.080078125
+23
+1.457257166499748e-13
+33
+1337.62890625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6016.494140625
+20
+1.4014749647253688e-13
+30
+1257.23828125
+11
+6035.080078125
+21
+1.457257166499748e-13
+31
+1337.62890625
+12
+6028.330078125
+22
+1.373315523800489e-13
+32
+1216.65625
+13
+6028.330078125
+23
+1.373315523800489e-13
+33
+1216.65625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6028.330078125
+20
+1.373315523800489e-13
+30
+1216.65625
+11
+6035.080078125
+21
+1.457257166499748e-13
+31
+1337.62890625
+12
+6093.603515625
+22
+1.2921304651247745e-13
+32
+1099.65625
+13
+6093.603515625
+23
+1.2921304651247745e-13
+33
+1099.65625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6093.603515625
+20
+1.2921304651247745e-13
+30
+1099.65625
+11
+6035.080078125
+21
+1.457257166499748e-13
+31
+1337.62890625
+12
+6053.548828125
+22
+1.4128997451179348e-13
+32
+1273.703125
+13
+6053.548828125
+23
+1.4128997451179348e-13
+33
+1273.703125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6093.603515625
+20
+1.2921304651247745e-13
+30
+1099.65625
+11
+6053.548828125
+21
+1.4128997451179348e-13
+31
+1273.703125
+12
+6083.408203125
+22
+1.3345119280472328e-13
+32
+1160.734375
+13
+6083.408203125
+23
+1.3345119280472328e-13
+33
+1160.734375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6093.603515625
+20
+1.2921304651247745e-13
+30
+1099.65625
+11
+6083.408203125
+21
+1.3345119280472328e-13
+31
+1160.734375
+12
+6147.978515625
+22
+1.289943087241785e-13
+32
+1096.50390625
+13
+6147.978515625
+23
+1.289943087241785e-13
+33
+1096.50390625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+6093.603515625
+20
+1.2921304651247745e-13
+30
+1099.65625
+11
+6147.978515625
+21
+1.289943087241785e-13
+31
+1096.50390625
+12
+6185.689453125
+22
+1.2584497246365123e-13
+32
+1051.1171875
+13
+6185.689453125
+23
+1.2584497246365123e-13
+33
+1051.1171875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6185.689453125
+20
+1.2584497246365123e-13
+30
+1051.1171875
+11
+6147.978515625
+21
+1.289943087241785e-13
+31
+1096.50390625
+12
+6230.173828125
+22
+1.2509849926789496e-13
+32
+1040.359375
+13
+6230.173828125
+23
+1.2509849926789496e-13
+33
+1040.359375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+6898.189453125
+20
+1.0768404397343279e-13
+30
+789.390625
+11
+6706.611328125
+21
+7.065474507544911e-15
+31
+-660.67578125
+12
+6668.994140625
+22
+7.209402345942362e-15
+32
+-658.6015625
+13
+6668.994140625
+23
+7.209402345942362e-15
+33
+-658.6015625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+6706.611328125
+20
+7.065474507544911e-15
+30
+-660.67578125
+11
+6898.189453125
+21
+1.0768404397343279e-13
+31
+789.390625
+12
+6833.455078125
+22
+5.104965929147998e-15
+32
+-688.9296875
+13
+6833.455078125
+23
+5.104965929147998e-15
+33
+-688.9296875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+6833.455078125
+20
+5.104965929147998e-15
+30
+-688.9296875
+11
+6898.189453125
+21
+1.0768404397343279e-13
+31
+789.390625
+12
+7019.314453125
+22
+5.88152573519074e-15
+32
+-677.73828125
+13
+7019.314453125
+23
+5.88152573519074e-15
+33
+-677.73828125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+7019.314453125
+20
+5.88152573519074e-15
+30
+-677.73828125
+11
+6898.189453125
+21
+1.0768404397343279e-13
+31
+789.390625
+12
+6978.439453125
+22
+1.0448022655373812e-13
+32
+743.21875
+13
+6978.439453125
+23
+1.0448022655373812e-13
+33
+743.21875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7019.314453125
+20
+5.88152573519074e-15
+30
+-677.73828125
+11
+6978.439453125
+21
+1.0448022655373812e-13
+31
+743.21875
+12
+7631.173828125
+22
+1.0610002459943146e-14
+32
+-609.59375
+13
+7631.173828125
+23
+1.0610002459943146e-14
+33
+-609.59375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7019.314453125
+20
+5.88152573519074e-15
+30
+-677.73828125
+11
+7631.173828125
+21
+1.0610002459943146e-14
+31
+-609.59375
+12
+7481.619140625
+22
+7.007740741860058e-15
+32
+-661.5078125
+13
+7481.619140625
+23
+7.007740741860058e-15
+33
+-661.5078125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+7481.619140625
+20
+7.007740741860058e-15
+30
+-661.5078125
+11
+7631.173828125
+21
+1.0610002459943146e-14
+31
+-609.59375
+12
+7608.345703125
+22
+1.0053806745458083e-14
+32
+-617.609375
+13
+7608.345703125
+23
+1.0053806745458083e-14
+33
+-617.609375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7481.619140625
+20
+7.007740741860058e-15
+30
+-661.5078125
+11
+7608.345703125
+21
+1.0053806745458083e-14
+31
+-617.609375
+12
+7568.126953125
+22
+7.964007057992273e-15
+32
+-647.7265625
+13
+7568.126953125
+23
+7.964007057992273e-15
+33
+-647.7265625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7503.931640625
+20
+1.1410143663237449e-13
+30
+881.875
+11
+7514.666015625
+21
+1.0485671575813371e-13
+31
+748.64453125
+12
+7477.095703125
+22
+1.0572109594014778e-13
+32
+761.1015625
+13
+7477.095703125
+23
+1.0572109594014778e-13
+33
+761.1015625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7514.666015625
+20
+1.0485671575813371e-13
+30
+748.64453125
+11
+7503.931640625
+21
+1.1410143663237449e-13
+31
+881.875
+12
+7518.416015625
+22
+1.1967803050655368e-13
+32
+962.2421875
+13
+7518.416015625
+23
+1.1967803050655368e-13
+33
+962.2421875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7514.666015625
+20
+1.0485671575813371e-13
+30
+748.64453125
+11
+7518.416015625
+21
+1.1967803050655368e-13
+31
+962.2421875
+12
+7531.658203125
+22
+1.1311752316084389e-13
+32
+867.6953125
+13
+7531.658203125
+23
+1.1311752316084389e-13
+33
+867.6953125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+7531.658203125
+20
+1.1311752316084389e-13
+30
+867.6953125
+11
+7518.416015625
+21
+1.1967803050655368e-13
+31
+962.2421875
+12
+7541.876953125
+22
+1.218174324434107e-13
+32
+993.07421875
+13
+7541.876953125
+23
+1.218174324434107e-13
+33
+993.07421875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7980.814453125
+20
+1.0394192017509907e-13
+30
+735.4609375
+11
+8364.134765625
+21
+2.2229126091927176e-14
+31
+-442.14453125
+12
+7631.173828125
+22
+1.0610002459943146e-14
+32
+-609.59375
+13
+7631.173828125
+23
+1.0610002459943146e-14
+33
+-609.59375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+8364.134765625
+20
+2.2229126091927176e-14
+30
+-442.14453125
+11
+7980.814453125
+21
+1.0394192017509907e-13
+31
+735.4609375
+12
+8441.126953125
+22
+5.582448565910614e-14
+32
+42.015625
+13
+8441.126953125
+23
+5.582448565910614e-14
+33
+42.015625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8364.134765625
+20
+2.2229126091927176e-14
+30
+-442.14453125
+11
+8441.126953125
+21
+5.582448565910614e-14
+31
+42.015625
+12
+8392.048828125
+22
+2.6903121657512186e-14
+32
+-374.78515625
+13
+8392.048828125
+23
+2.6903121657512186e-14
+33
+-374.78515625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8392.048828125
+20
+2.6903121657512186e-14
+30
+-374.78515625
+11
+8441.126953125
+21
+5.582448565910614e-14
+31
+42.015625
+12
+8433.111328125
+22
+4.7155476138455166e-14
+32
+-82.91796875
+13
+8433.111328125
+23
+4.7155476138455166e-14
+33
+-82.91796875
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+8392.048828125
+20
+2.6903121657512186e-14
+30
+-374.78515625
+11
+8433.111328125
+21
+4.7155476138455166e-14
+31
+-82.91796875
+12
+8426.970703125
+22
+3.596894917329285e-14
+32
+-244.1328125
+13
+8426.970703125
+23
+3.596894917329285e-14
+33
+-244.1328125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8433.111328125
+20
+4.7155476138455166e-14
+30
+-82.91796875
+11
+8441.126953125
+21
+5.582448565910614e-14
+31
+42.015625
+12
+8450.853515625
+22
+5.489911910488976e-14
+32
+28.6796875
+13
+8450.853515625
+23
+5.489911910488976e-14
+33
+28.6796875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+8433.111328125
+20
+4.7155476138455166e-14
+30
+-82.91796875
+11
+8442.345703125
+21
+3.874342253268326e-14
+31
+-204.1484375
+12
+8426.970703125
+22
+3.596894917329285e-14
+32
+-244.1328125
+13
+8426.970703125
+23
+3.596894917329285e-14
+33
+-244.1328125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8442.345703125
+20
+3.874342253268326e-14
+30
+-204.1484375
+11
+8433.111328125
+21
+4.7155476138455166e-14
+31
+-82.91796875
+12
+8435.994140625
+22
+4.632362202161566e-14
+32
+-94.90625
+13
+8435.994140625
+23
+4.632362202161566e-14
+33
+-94.90625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7103.408203125
+20
+1.0787350830307463e-13
+30
+792.12109375
+11
+7631.173828125
+21
+1.0610002459943146e-14
+31
+-609.59375
+12
+6978.439453125
+22
+1.0448022655373812e-13
+32
+743.21875
+13
+6978.439453125
+23
+1.0448022655373812e-13
+33
+743.21875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7103.408203125
+21
+1.0787350830307463e-13
+31
+792.12109375
+12
+7145.501953125
+22
+1.0850370081583183e-13
+32
+801.203125
+13
+7145.501953125
+23
+1.0850370081583183e-13
+33
+801.203125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7145.501953125
+21
+1.0850370081583183e-13
+31
+801.203125
+12
+7277.314453125
+22
+1.0852646906145402e-13
+32
+801.53125
+13
+7277.314453125
+23
+1.0852646906145402e-13
+33
+801.53125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7277.314453125
+21
+1.0852646906145402e-13
+31
+801.53125
+12
+7409.619140625
+22
+1.0638462766970891e-13
+32
+770.6640625
+13
+7409.619140625
+23
+1.0638462766970891e-13
+33
+770.6640625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7409.619140625
+21
+1.0638462766970891e-13
+31
+770.6640625
+12
+7460.056640625
+22
+1.0491282322055984e-13
+32
+749.453125
+13
+7460.056640625
+23
+1.0491282322055984e-13
+33
+749.453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7460.056640625
+21
+1.0491282322055984e-13
+31
+749.453125
+12
+7477.095703125
+22
+1.0572109594014778e-13
+32
+761.1015625
+13
+7477.095703125
+23
+1.0572109594014778e-13
+33
+761.1015625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7477.095703125
+21
+1.0572109594014778e-13
+31
+761.1015625
+12
+7514.666015625
+22
+1.0485671575813371e-13
+32
+748.64453125
+13
+7514.666015625
+23
+1.0485671575813371e-13
+33
+748.64453125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7514.666015625
+21
+1.0485671575813371e-13
+31
+748.64453125
+12
+7593.884765625
+22
+1.0480223459896632e-13
+32
+747.859375
+13
+7593.884765625
+23
+1.0480223459896632e-13
+33
+747.859375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7593.884765625
+21
+1.0480223459896632e-13
+31
+747.859375
+12
+7944.533203125
+22
+1.0394761223650462e-13
+32
+735.54296875
+13
+7944.533203125
+23
+1.0394761223650462e-13
+33
+735.54296875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7631.173828125
+20
+1.0610002459943146e-14
+30
+-609.59375
+11
+7944.533203125
+21
+1.0394761223650462e-13
+31
+735.54296875
+12
+7980.814453125
+22
+1.0394192017509907e-13
+32
+735.4609375
+13
+7980.814453125
+23
+1.0394192017509907e-13
+33
+735.4609375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+8454.322265625
+20
+7.908956692684321e-14
+30
+377.30078125
+11
+8438.900390625
+21
+5.876402879925746e-14
+31
+84.37890625
+12
+8360.736328125
+22
+8.659739592076221e-14
+32
+485.5
+13
+8360.736328125
+23
+8.659739592076221e-14
+33
+485.5
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8438.900390625
+20
+5.876402879925746e-14
+30
+84.37890625
+11
+8454.322265625
+21
+7.908956692684321e-14
+31
+377.30078125
+12
+8467.541015625
+22
+6.384703963441263e-14
+32
+157.6328125
+13
+8467.541015625
+23
+6.384703963441263e-14
+33
+157.6328125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8467.541015625
+20
+6.384703963441263e-14
+30
+157.6328125
+11
+8454.322265625
+21
+7.908956692684321e-14
+31
+377.30078125
+12
+8508.158203125
+22
+7.652407353619939e-14
+32
+340.328125
+13
+8508.158203125
+23
+7.652407353619939e-14
+33
+340.328125
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8467.541015625
+20
+6.384703963441263e-14
+30
+157.6328125
+11
+8508.158203125
+21
+7.652407353619939e-14
+31
+340.328125
+12
+8522.525390625
+22
+7.012700966799179e-14
+32
+248.13671875
+13
+8522.525390625
+23
+7.012700966799179e-14
+33
+248.13671875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8522.525390625
+20
+7.012700966799179e-14
+30
+248.13671875
+11
+8508.158203125
+21
+7.652407353619939e-14
+31
+340.328125
+12
+8526.861328125
+22
+7.637445363639639e-14
+32
+338.171875
+13
+8526.861328125
+23
+7.637445363639639e-14
+33
+338.171875
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7820.783203125
+20
+1.1489507262263388e-13
+30
+893.3125
+11
+7808.009765625
+21
+1.1054633770879452e-13
+31
+830.640625
+12
+7807.939453125
+22
+1.1373551839916063e-13
+32
+876.6015625
+13
+7807.939453125
+23
+1.1373551839916063e-13
+33
+876.6015625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7808.009765625
+20
+1.1054633770879452e-13
+30
+830.640625
+11
+7820.783203125
+21
+1.1489507262263388e-13
+31
+893.3125
+12
+7821.791015625
+22
+1.0946159343522277e-13
+32
+815.0078125
+13
+7821.791015625
+23
+1.0946159343522277e-13
+33
+815.0078125
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+7821.791015625
+20
+1.0946159343522277e-13
+30
+815.0078125
+11
+7820.783203125
+21
+1.1489507262263388e-13
+31
+893.3125
+12
+7915.189453125
+22
+1.1681085786141576e-13
+32
+920.921875
+13
+7915.189453125
+23
+1.1681085786141576e-13
+33
+920.921875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7821.791015625
+20
+1.0946159343522277e-13
+30
+815.0078125
+11
+7915.189453125
+21
+1.1681085786141576e-13
+31
+920.921875
+12
+7862.197265625
+22
+1.0857200555269841e-13
+32
+802.1875
+13
+7862.197265625
+23
+1.0857200555269841e-13
+33
+802.1875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+7862.197265625
+20
+1.0857200555269841e-13
+30
+802.1875
+11
+7915.189453125
+21
+1.1681085786141576e-13
+31
+920.921875
+12
+7980.814453125
+22
+1.0394192017509907e-13
+32
+735.4609375
+13
+7980.814453125
+23
+1.0394192017509907e-13
+33
+735.4609375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+7980.814453125
+20
+1.0394192017509907e-13
+30
+735.4609375
+11
+7915.189453125
+21
+1.1681085786141576e-13
+31
+920.921875
+12
+8066.712890625
+22
+1.1674092682129045e-13
+32
+919.9140625
+13
+8066.712890625
+23
+1.1674092682129045e-13
+33
+919.9140625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+7980.814453125
+20
+1.0394192017509907e-13
+30
+735.4609375
+11
+8066.712890625
+21
+1.1674092682129045e-13
+31
+919.9140625
+12
+8441.126953125
+22
+5.582448565910614e-14
+32
+42.015625
+13
+8441.126953125
+23
+5.582448565910614e-14
+33
+42.015625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8441.126953125
+20
+5.582448565910614e-14
+30
+42.015625
+11
+8066.712890625
+21
+1.1674092682129045e-13
+31
+919.9140625
+12
+8167.306640625
+22
+1.1602535338745001e-13
+32
+909.6015625
+13
+8167.306640625
+23
+1.1602535338745001e-13
+33
+909.6015625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8441.126953125
+20
+5.582448565910614e-14
+30
+42.015625
+11
+8167.306640625
+21
+1.1602535338745001e-13
+31
+909.6015625
+12
+8214.697265625
+22
+1.1340212623112134e-13
+32
+871.796875
+13
+8214.697265625
+23
+1.1340212623112134e-13
+33
+871.796875
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8441.126953125
+20
+5.582448565910614e-14
+30
+42.015625
+11
+8214.697265625
+21
+1.1340212623112134e-13
+31
+871.796875
+12
+8307.650390625
+22
+9.394015513392029e-14
+32
+591.3203125
+13
+8307.650390625
+23
+9.394015513392029e-14
+33
+591.3203125
+70
+15
+ 0
+3DFACE
+ 8
+ship3
+10
+8307.650390625
+20
+9.394015513392029e-14
+30
+591.3203125
+11
+8214.697265625
+21
+1.1340212623112134e-13
+31
+871.796875
+12
+8302.212890625
+22
+1.0023882765497483e-13
+32
+682.09375
+13
+8302.212890625
+23
+1.0023882765497483e-13
+33
+682.09375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8302.212890625
+20
+1.0023882765497483e-13
+30
+682.09375
+11
+8214.697265625
+21
+1.1340212623112134e-13
+31
+871.796875
+12
+8301.251953125
+22
+1.0215136028723926e-13
+32
+709.65625
+13
+8301.251953125
+23
+1.0215136028723926e-13
+33
+709.65625
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+8441.126953125
+20
+5.582448565910614e-14
+30
+42.015625
+11
+8307.650390625
+21
+9.394015513392029e-14
+31
+591.3203125
+12
+8336.056640625
+22
+8.830826694894434e-14
+32
+510.15625
+13
+8336.056640625
+23
+8.830826694894434e-14
+33
+510.15625
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8441.126953125
+20
+5.582448565910614e-14
+30
+42.015625
+11
+8336.056640625
+21
+8.830826694894434e-14
+31
+510.15625
+12
+8360.736328125
+22
+8.659739592076221e-14
+32
+485.5
+13
+8360.736328125
+23
+8.659739592076221e-14
+33
+485.5
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8441.126953125
+20
+5.582448565910614e-14
+30
+42.015625
+11
+8360.736328125
+21
+8.659739592076221e-14
+31
+485.5
+12
+8438.900390625
+22
+5.876402879925746e-14
+32
+84.37890625
+13
+8438.900390625
+23
+5.876402879925746e-14
+33
+84.37890625
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8364.134765625
+20
+2.2229126091927176e-14
+30
+-442.14453125
+11
+7810.587890625
+21
+1.1389001720873981e-14
+31
+-598.3671875
+12
+7631.173828125
+22
+1.0610002459943146e-14
+32
+-609.59375
+13
+7631.173828125
+23
+1.0610002459943146e-14
+33
+-609.59375
+70
+1
+ 0
+3DFACE
+ 8
+ship3
+10
+7810.587890625
+20
+1.1389001720873981e-14
+30
+-598.3671875
+11
+8364.134765625
+21
+2.2229126091927176e-14
+31
+-442.14453125
+12
+8021.150390625
+22
+1.1512600768537329e-14
+32
+-596.5859375
+13
+8021.150390625
+23
+1.1512600768537329e-14
+33
+-596.5859375
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8021.150390625
+20
+1.1512600768537329e-14
+30
+-596.5859375
+11
+8364.134765625
+21
+2.2229126091927176e-14
+31
+-442.14453125
+12
+8233.283203125
+22
+1.2494887936809196e-14
+32
+-582.4296875
+13
+8233.283203125
+23
+1.2494887936809196e-14
+33
+-582.4296875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8233.283203125
+20
+1.2494887936809196e-14
+30
+-582.4296875
+11
+8364.134765625
+21
+2.2229126091927176e-14
+31
+-442.14453125
+12
+8305.681640625
+22
+1.2489195875403647e-14
+32
+-582.51171875
+13
+8305.681640625
+23
+1.2489195875403647e-14
+33
+-582.51171875
+70
+3
+ 0
+3DFACE
+ 8
+ship3
+10
+8305.681640625
+20
+1.2489195875403647e-14
+30
+-582.51171875
+11
+8364.134765625
+21
+2.2229126091927176e-14
+31
+-442.14453125
+12
+8370.884765625
+22
+1.8468299806118083e-14
+32
+-496.34375
+13
+8370.884765625
+23
+1.8468299806118083e-14
+33
+-496.34375
+70
+13
+ 0
+3DFACE
+ 8
+ship3
+10
+8305.681640625
+20
+1.2489195875403647e-14
+30
+-582.51171875
+11
+8370.884765625
+21
+1.8468299806118083e-14
+31
+-496.34375
+12
+8387.408203125
+22
+1.3008799766567325e-14
+32
+-575.0234375
+13
+8387.408203125
+23
+1.3008799766567325e-14
+33
+-575.0234375
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2331.0584563925167
+20
+7.363034515030426e-14
+30
+-268.24057302868596
+11
+700.505859375
+21
+7.840169485850979e-14
+31
+-199.47817697131404
+12
+1864.236328125
+22
+1.119913623642832e-13
+32
+284.59994802868596
+13
+1864.236328125
+23
+1.119913623642832e-13
+33
+284.59994802868596
+70
+0
+ 0
+3DFACE
+ 8
+ship2
+10
+66.111328125
+20
+9.34303632724176e-14
+30
+17.107760528685958
+11
+5.126953125
+21
+8.912553854656391e-14
+31
+-44.93130197131404
+12
+-7.740234375
+22
+8.981346482500596e-14
+32
+-35.01723947131404
+13
+-7.740234375
+23
+8.981346482500596e-14
+33
+-35.01723947131404
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5.126953125
+20
+8.912553854656391e-14
+30
+-44.93130197131404
+11
+66.111328125
+21
+9.34303632724176e-14
+31
+17.107760528685958
+12
+446.619140625
+22
+8.256665750411285e-14
+32
+-139.45473947131404
+13
+446.619140625
+23
+8.256665750411285e-14
+33
+-139.45473947131404
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+446.619140625
+20
+8.256665750411285e-14
+30
+-139.45473947131404
+11
+66.111328125
+21
+9.34303632724176e-14
+31
+17.107760528685958
+12
+94.939453125
+22
+9.419472580401989e-14
+32
+28.123385528685958
+13
+94.939453125
+23
+9.419472580401989e-14
+33
+28.123385528685958
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+446.619140625
+20
+8.256665750411285e-14
+30
+-139.45473947131404
+11
+94.939453125
+21
+9.419472580401989e-14
+31
+28.123385528685958
+12
+293.431640625
+22
+9.700172522858486e-14
+32
+68.57651052868596
+13
+293.431640625
+23
+9.700172522858486e-14
+33
+68.57651052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+446.619140625
+20
+8.256665750411285e-14
+30
+-139.45473947131404
+11
+293.431640625
+21
+9.700172522858486e-14
+31
+68.57651052868596
+12
+310.025390625
+22
+9.70098567448785e-14
+32
+68.69369802868596
+13
+310.025390625
+23
+9.70098567448785e-14
+33
+68.69369802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+446.619140625
+20
+8.256665750411285e-14
+30
+-139.45473947131404
+11
+310.025390625
+21
+9.70098567448785e-14
+31
+68.69369802868596
+12
+387.814453125
+22
+9.596414374951623e-14
+32
+53.62338552868596
+13
+387.814453125
+23
+9.596414374951623e-14
+33
+53.62338552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+446.619140625
+20
+8.256665750411285e-14
+30
+-139.45473947131404
+11
+387.814453125
+21
+9.596414374951623e-14
+31
+53.62338552868596
+12
+392.994140625
+22
+9.569905631834352e-14
+32
+49.80307302868596
+13
+392.994140625
+23
+9.569905631834352e-14
+33
+49.80307302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+446.619140625
+20
+8.256665750411285e-14
+30
+-139.45473947131404
+11
+392.994140625
+21
+9.569905631834352e-14
+31
+49.80307302868596
+12
+700.505859375
+22
+7.840169485850979e-14
+32
+-199.47817697131404
+13
+700.505859375
+23
+7.840169485850979e-14
+33
+-199.47817697131404
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+446.619140625
+20
+8.256665750411285e-14
+30
+-139.45473947131404
+11
+700.505859375
+21
+7.840169485850979e-14
+31
+-199.47817697131404
+12
+482.173828125
+22
+8.169170635091705e-14
+32
+-152.06411447131404
+13
+482.173828125
+23
+8.169170635091705e-14
+33
+-152.06411447131404
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+472.728515625
+20
+1.0123174000453705e-13
+30
+129.53744802868596
+11
+700.505859375
+21
+7.840169485850979e-14
+31
+-199.47817697131404
+12
+392.994140625
+22
+9.569905631834352e-14
+32
+49.80307302868596
+13
+392.994140625
+23
+9.569905631834352e-14
+33
+49.80307302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+700.505859375
+20
+7.840169485850979e-14
+30
+-199.47817697131404
+11
+472.728515625
+21
+1.0123174000453705e-13
+31
+129.53744802868596
+12
+975.181640625
+22
+1.0497223749961204e-13
+32
+183.44369802868596
+13
+975.181640625
+23
+1.0497223749961204e-13
+33
+183.44369802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+700.505859375
+20
+7.840169485850979e-14
+30
+-199.47817697131404
+11
+975.181640625
+21
+1.0497223749961204e-13
+31
+183.44369802868596
+12
+1864.236328125
+22
+1.119913623642832e-13
+32
+284.59994802868596
+13
+1864.236328125
+23
+1.119913623642832e-13
+33
+284.59994802868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+1864.236328125
+20
+1.119913623642832e-13
+30
+284.59994802868596
+11
+975.181640625
+21
+1.0497223749961204e-13
+31
+183.44369802868596
+12
+985.259765625
+22
+1.0549753345218127e-13
+32
+191.01401052868596
+13
+985.259765625
+23
+1.0549753345218127e-13
+33
+191.01401052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1864.236328125
+20
+1.119913623642832e-13
+30
+284.59994802868596
+11
+985.259765625
+21
+1.0549753345218127e-13
+31
+191.01401052868596
+12
+1157.935546875
+22
+1.0952751292730989e-13
+32
+249.09213552868596
+13
+1157.935546875
+23
+1.0952751292730989e-13
+33
+249.09213552868596
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+1157.935546875
+20
+1.0952751292730989e-13
+30
+249.09213552868596
+11
+985.259765625
+21
+1.0549753345218127e-13
+31
+191.01401052868596
+12
+1050.064453125
+22
+1.1318181634967228e-13
+32
+301.75619802868596
+13
+1050.064453125
+23
+1.1318181634967228e-13
+33
+301.75619802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1157.935546875
+20
+1.0952751292730989e-13
+30
+249.09213552868596
+11
+1050.064453125
+21
+1.1318181634967228e-13
+31
+301.75619802868596
+12
+1073.572265625
+22
+1.1426005541020912e-13
+32
+317.29526052868596
+13
+1073.572265625
+23
+1.1426005541020912e-13
+33
+317.29526052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1157.935546875
+20
+1.0952751292730989e-13
+30
+249.09213552868596
+11
+1073.572265625
+21
+1.1426005541020912e-13
+31
+317.29526052868596
+12
+1100.572265625
+22
+1.1476420942041488e-13
+32
+324.56088552868596
+13
+1100.572265625
+23
+1.1476420942041488e-13
+33
+324.56088552868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+1864.236328125
+20
+1.119913623642832e-13
+30
+284.59994802868596
+11
+1157.935546875
+21
+1.0952751292730989e-13
+31
+249.09213552868596
+12
+1276.798828125
+22
+1.101959235666472e-13
+32
+258.72494802868596
+13
+1276.798828125
+23
+1.101959235666472e-13
+33
+258.72494802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1864.236328125
+20
+1.119913623642832e-13
+30
+284.59994802868596
+11
+1276.798828125
+21
+1.101959235666472e-13
+31
+258.72494802868596
+12
+1330.564453125
+22
+1.1096028609824948e-13
+32
+269.74057302868596
+13
+1330.564453125
+23
+1.1096028609824948e-13
+33
+269.74057302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1864.236328125
+20
+1.119913623642832e-13
+30
+284.59994802868596
+11
+1330.564453125
+21
+1.1096028609824948e-13
+31
+269.74057302868596
+12
+1634.033203125
+22
+1.124288379408811e-13
+32
+290.90463552868596
+13
+1634.033203125
+23
+1.124288379408811e-13
+33
+290.90463552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1864.236328125
+20
+1.119913623642832e-13
+30
+284.59994802868596
+11
+1634.033203125
+21
+1.124288379408811e-13
+31
+290.90463552868596
+12
+1836.697265625
+22
+1.1236703841704943e-13
+32
+290.01401052868596
+13
+1836.697265625
+23
+1.1236703841704943e-13
+33
+290.01401052868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+1836.697265625
+20
+1.1236703841704943e-13
+30
+290.01401052868596
+11
+1634.033203125
+21
+1.124288379408811e-13
+31
+290.90463552868596
+12
+1695.451171875
+22
+1.1434462317966299e-13
+32
+318.51401052868596
+13
+1695.451171875
+23
+1.1434462317966299e-13
+33
+318.51401052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1836.697265625
+20
+1.1236703841704943e-13
+30
+290.01401052868596
+11
+1695.451171875
+21
+1.1434462317966299e-13
+31
+318.51401052868596
+12
+1742.830078125
+22
+1.1559037147584883e-13
+32
+336.46713552868596
+13
+1742.830078125
+23
+1.1559037147584883e-13
+33
+336.46713552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1836.697265625
+20
+1.1236703841704943e-13
+30
+290.01401052868596
+11
+1742.830078125
+21
+1.1559037147584883e-13
+31
+336.46713552868596
+12
+1751.783203125
+22
+1.1558061365629646e-13
+32
+336.32651052868596
+13
+1751.783203125
+23
+1.1558061365629646e-13
+33
+336.32651052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+1270.072265625
+20
+1.576384422302679e-13
+30
+942.443698028686
+11
+1344.029296875
+21
+1.5709363063859394e-13
+31
+934.592135528686
+12
+1276.798828125
+22
+1.101959235666472e-13
+32
+258.72494802868596
+13
+1276.798828125
+23
+1.101959235666472e-13
+33
+258.72494802868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+1344.029296875
+20
+1.5709363063859394e-13
+30
+934.592135528686
+11
+1270.072265625
+21
+1.576384422302679e-13
+31
+942.443698028686
+12
+1365.146484375
+22
+1.5908422582727733e-13
+32
+963.279635528686
+13
+1365.146484375
+23
+1.5908422582727733e-13
+33
+963.279635528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+1365.146484375
+20
+1.5908422582727733e-13
+30
+963.279635528686
+11
+1270.072265625
+21
+1.576384422302679e-13
+31
+942.443698028686
+12
+1423.728515625
+22
+1.6458926235807247e-13
+32
+1042.615573028686
+13
+1423.728515625
+23
+1.6458926235807247e-13
+33
+1042.615573028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+1276.798828125
+20
+1.101959235666472e-13
+30
+258.72494802868596
+11
+1344.029296875
+21
+1.5709363063859394e-13
+31
+934.592135528686
+12
+1330.564453125
+22
+1.1096028609824948e-13
+32
+269.74057302868596
+13
+1330.564453125
+23
+1.1096028609824948e-13
+33
+269.74057302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+1365.146484375
+20
+1.5908422582727733e-13
+30
+963.279635528686
+11
+1423.728515625
+21
+1.6458926235807247e-13
+31
+1042.615573028686
+12
+1424.736328125
+22
+1.6092682741941644e-13
+32
+989.834323028686
+13
+1424.736328125
+23
+1.6092682741941644e-13
+33
+989.834323028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+1424.736328125
+20
+1.6092682741941644e-13
+30
+989.834323028686
+11
+1423.728515625
+21
+1.6458926235807247e-13
+31
+1042.615573028686
+12
+1432.037109375
+22
+1.6257915153028435e-13
+32
+1013.646823028686
+13
+1432.037109375
+23
+1.6257915153028435e-13
+33
+1013.646823028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+1671.158203125
+20
+1.2728186560284627e-13
+30
+504.95932302868596
+11
+1634.033203125
+21
+1.124288379408811e-13
+31
+290.90463552868596
+12
+1619.572265625
+22
+1.2728186560284627e-13
+32
+504.95932302868596
+13
+1619.572265625
+23
+1.2728186560284627e-13
+33
+504.95932302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+1634.033203125
+20
+1.124288379408811e-13
+30
+290.90463552868596
+11
+1671.158203125
+21
+1.2728186560284627e-13
+31
+504.95932302868596
+12
+1695.451171875
+22
+1.1434462317966299e-13
+32
+318.51401052868596
+13
+1695.451171875
+23
+1.1434462317966299e-13
+33
+318.51401052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2043.369140625
+20
+1.220175219543429e-13
+30
+429.09213552868596
+11
+2056.998046875
+21
+1.1101070149927006e-13
+31
+270.46713552868596
+12
+1957.775390625
+22
+1.1375427509674463e-13
+32
+310.00619802868596
+13
+1957.775390625
+23
+1.1375427509674463e-13
+33
+310.00619802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2056.998046875
+20
+1.1101070149927006e-13
+30
+270.46713552868596
+11
+2043.369140625
+21
+1.220175219543429e-13
+31
+429.09213552868596
+12
+2079.087890625
+22
+1.225867280948978e-13
+32
+437.29526052868596
+13
+2079.087890625
+23
+1.225867280948978e-13
+33
+437.29526052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2056.998046875
+20
+1.1101070149927006e-13
+30
+270.46713552868596
+11
+2079.087890625
+21
+1.225867280948978e-13
+31
+437.29526052868596
+12
+2115.837890625
+22
+1.2211184754334914e-13
+32
+430.45151052868596
+13
+2115.837890625
+23
+1.2211184754334914e-13
+33
+430.45151052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2190.755859375
+20
+1.1485853500942111e-13
+30
+325.92026052868596
+11
+2353.189453125
+21
+1.1203527255226886e-13
+31
+285.23276052868596
+12
+2159.197265625
+22
+1.1283378745230443e-13
+32
+296.74057302868596
+13
+2159.197265625
+23
+1.1283378745230443e-13
+33
+296.74057302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2353.189453125
+20
+1.1203527255226886e-13
+30
+285.23276052868596
+11
+2190.755859375
+21
+1.1485853500942111e-13
+31
+325.92026052868596
+12
+2190.955078125
+22
+1.153187788316412e-13
+32
+332.55307302868596
+13
+2190.955078125
+23
+1.153187788316412e-13
+33
+332.55307302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2353.189453125
+20
+1.1203527255226886e-13
+30
+285.23276052868596
+11
+2190.955078125
+21
+1.153187788316412e-13
+31
+332.55307302868596
+12
+2236.119140625
+22
+1.1812903086272364e-13
+32
+373.05307302868596
+13
+2236.119140625
+23
+1.1812903086272364e-13
+33
+373.05307302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2353.189453125
+20
+1.1203527255226886e-13
+30
+285.23276052868596
+11
+2236.119140625
+21
+1.1812903086272364e-13
+31
+373.05307302868596
+12
+2330.759765625
+22
+1.199683798483453e-13
+32
+399.56088552868596
+13
+2330.759765625
+23
+1.199683798483453e-13
+33
+399.56088552868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2474.384765625
+20
+1.2771771487618544e-13
+30
+511.24057302868596
+11
+2524.470703125
+21
+1.112953045695475e-13
+31
+274.56869802868596
+12
+2437.048828125
+22
+1.1203527255226886e-13
+32
+285.23276052868596
+13
+2437.048828125
+23
+1.1203527255226886e-13
+33
+285.23276052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2524.470703125
+20
+1.112953045695475e-13
+30
+274.56869802868596
+11
+2474.384765625
+21
+1.2771771487618544e-13
+31
+511.24057302868596
+12
+2519.337890625
+22
+1.2771771487618544e-13
+32
+511.24057302868596
+13
+2519.337890625
+23
+1.2771771487618544e-13
+33
+511.24057302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2640.509765625
+20
+1.5953471182994505e-13
+30
+969.771823028686
+11
+2593.833984375
+21
+1.5589829774342867e-13
+31
+917.365573028686
+12
+2584.634765625
+22
+1.5697491050070678e-13
+32
+932.881198028686
+13
+2584.634765625
+23
+1.5697491050070678e-13
+33
+932.881198028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2593.833984375
+20
+1.5589829774342867e-13
+30
+917.365573028686
+11
+2640.509765625
+21
+1.5953471182994505e-13
+31
+969.771823028686
+12
+2595.626953125
+22
+1.545468397354255e-13
+32
+897.889010528686
+13
+2595.626953125
+23
+1.545468397354255e-13
+33
+897.889010528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2595.626953125
+20
+1.545468397354255e-13
+30
+897.889010528686
+11
+2640.509765625
+21
+1.5953471182994505e-13
+31
+969.771823028686
+12
+2659.060546875
+22
+1.3888228674735492e-13
+32
+672.139010528686
+13
+2659.060546875
+23
+1.3888228674735492e-13
+33
+672.139010528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2659.060546875
+20
+1.3888228674735492e-13
+30
+672.139010528686
+11
+2640.509765625
+21
+1.5953471182994505e-13
+31
+969.771823028686
+12
+2695.142578125
+22
+1.3817647113306686e-13
+32
+661.967135528686
+13
+2695.142578125
+23
+1.3817647113306686e-13
+33
+661.967135528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2659.060546875
+20
+1.3888228674735492e-13
+30
+672.139010528686
+11
+2695.142578125
+21
+1.3817647113306686e-13
+31
+661.967135528686
+12
+2659.939453125
+22
+1.344782575227188e-13
+32
+608.670260528686
+13
+2659.939453125
+23
+1.344782575227188e-13
+33
+608.670260528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2691.697265625
+20
+1.777476820244428e-13
+30
+1232.248385528686
+11
+2671.166015625
+21
+1.7029270788643247e-13
+31
+1124.810885528686
+12
+2668.353515625
+22
+1.7112212254838388e-13
+32
+1136.764010528686
+13
+2668.353515625
+23
+1.7112212254838388e-13
+33
+1136.764010528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2671.166015625
+20
+1.7029270788643247e-13
+30
+1124.810885528686
+11
+2691.697265625
+21
+1.777476820244428e-13
+31
+1232.248385528686
+12
+2746.330078125
+22
+1.6455185738312172e-13
+32
+1042.076510528686
+13
+2746.330078125
+23
+1.6455185738312172e-13
+33
+1042.076510528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2746.330078125
+20
+1.6455185738312172e-13
+30
+1042.076510528686
+11
+2691.697265625
+21
+1.777476820244428e-13
+31
+1232.248385528686
+12
+2786.373046875
+22
+1.7633279818934922e-13
+32
+1211.857760528686
+13
+2786.373046875
+23
+1.7633279818934922e-13
+33
+1211.857760528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2746.330078125
+20
+1.6455185738312172e-13
+30
+1042.076510528686
+11
+2786.373046875
+21
+1.7633279818934922e-13
+31
+1211.857760528686
+12
+2748.603515625
+22
+1.6369479556577193e-13
+32
+1029.724948028686
+13
+2748.603515625
+23
+1.6369479556577193e-13
+33
+1029.724948028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2748.603515625
+20
+1.6369479556577193e-13
+30
+1029.724948028686
+11
+2786.373046875
+21
+1.7633279818934922e-13
+31
+1211.857760528686
+12
+2755.599609375
+22
+1.4943211598672512e-13
+32
+824.178073028686
+13
+2755.599609375
+23
+1.4943211598672512e-13
+33
+824.178073028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2755.599609375
+20
+1.4943211598672512e-13
+30
+824.178073028686
+11
+2786.373046875
+21
+1.7633279818934922e-13
+31
+1211.857760528686
+12
+2760.791015625
+22
+1.4771961865528427e-13
+32
+799.498385528686
+13
+2760.791015625
+23
+1.4771961865528427e-13
+33
+799.498385528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2760.509765625
+20
+1.4149575608413123e-13
+30
+709.803073028686
+11
+2827.212890625
+21
+1.3869851447911863e-13
+31
+669.490573028686
+12
+2747.419921875
+22
+1.3817647113306686e-13
+32
+661.967135528686
+13
+2747.419921875
+23
+1.3817647113306686e-13
+33
+661.967135528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2827.212890625
+20
+1.3869851447911863e-13
+30
+669.490573028686
+11
+2760.509765625
+21
+1.4149575608413123e-13
+31
+709.803073028686
+12
+2760.791015625
+22
+1.4771961865528427e-13
+32
+799.498385528686
+13
+2760.791015625
+23
+1.4771961865528427e-13
+33
+799.498385528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2827.212890625
+20
+1.3869851447911863e-13
+30
+669.490573028686
+11
+2760.791015625
+21
+1.4771961865528427e-13
+31
+799.498385528686
+12
+2786.373046875
+22
+1.7633279818934922e-13
+32
+1211.857760528686
+13
+2786.373046875
+23
+1.7633279818934922e-13
+33
+1211.857760528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+2827.212890625
+20
+1.3869851447911863e-13
+30
+669.490573028686
+11
+2786.373046875
+21
+1.7633279818934922e-13
+31
+1211.857760528686
+12
+2796.041015625
+22
+1.7184094858874177e-13
+32
+1147.123385528686
+13
+2796.041015625
+23
+1.7184094858874177e-13
+33
+1147.123385528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+2796.041015625
+20
+1.7184094858874177e-13
+30
+1147.123385528686
+11
+2786.373046875
+21
+1.7633279818934922e-13
+31
+1211.857760528686
+12
+2794.728515625
+22
+1.7411452054444387e-13
+32
+1179.889010528686
+13
+2794.728515625
+23
+1.7411452054444387e-13
+33
+1179.889010528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2827.212890625
+20
+1.3869851447911863e-13
+30
+669.490573028686
+11
+2796.041015625
+21
+1.7184094858874177e-13
+31
+1147.123385528686
+12
+2828.783203125
+22
+1.5669681264346424e-13
+32
+928.873385528686
+13
+2828.783203125
+23
+1.5669681264346424e-13
+33
+928.873385528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2827.212890625
+20
+1.3869851447911863e-13
+30
+669.490573028686
+11
+2828.783203125
+21
+1.5669681264346424e-13
+31
+928.873385528686
+12
+2835.626953125
+22
+1.4112658524439992e-13
+32
+704.482760528686
+13
+2835.626953125
+23
+1.4112658524439992e-13
+33
+704.482760528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2835.626953125
+20
+1.4112658524439992e-13
+30
+704.482760528686
+11
+2828.783203125
+21
+1.5669681264346424e-13
+31
+928.873385528686
+12
+2843.759765625
+22
+1.5316448196550647e-13
+32
+877.967135528686
+13
+2843.759765625
+23
+1.5316448196550647e-13
+33
+877.967135528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2835.626953125
+20
+1.4112658524439992e-13
+30
+704.482760528686
+11
+2843.759765625
+21
+1.5316448196550647e-13
+31
+877.967135528686
+12
+2843.056640625
+22
+1.476984767129208e-13
+32
+799.193698028686
+13
+2843.056640625
+23
+1.476984767129208e-13
+33
+799.193698028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2843.056640625
+20
+1.476984767129208e-13
+30
+799.193698028686
+11
+2843.759765625
+21
+1.5316448196550647e-13
+31
+877.967135528686
+12
+2845.962890625
+22
+1.4877021056042272e-13
+32
+814.639010528686
+13
+2845.962890625
+23
+1.4877021056042272e-13
+33
+814.639010528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2974.447265625
+20
+1.5448504021159382e-13
+30
+896.998385528686
+11
+3391.353515625
+21
+1.432554162100752e-13
+31
+735.162448028686
+12
+2948.548828125
+22
+1.3897498603310243e-13
+32
+673.474948028686
+13
+2948.548828125
+23
+1.3897498603310243e-13
+33
+673.474948028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3391.353515625
+20
+1.432554162100752e-13
+30
+735.162448028686
+11
+2974.447265625
+21
+1.5448504021159382e-13
+31
+896.998385528686
+12
+2991.228515625
+22
+1.579604502754961e-13
+32
+947.084323028686
+13
+2991.228515625
+23
+1.579604502754961e-13
+33
+947.084323028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3391.353515625
+20
+1.432554162100752e-13
+30
+735.162448028686
+11
+2991.228515625
+21
+1.579604502754961e-13
+31
+947.084323028686
+12
+3367.001953125
+22
+1.4422469295227724e-13
+32
+749.131198028686
+13
+3367.001953125
+23
+1.4422469295227724e-13
+33
+749.131198028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3367.001953125
+20
+1.4422469295227724e-13
+30
+749.131198028686
+11
+2991.228515625
+21
+1.579604502754961e-13
+31
+947.084323028686
+12
+2997.357421875
+22
+1.6058367743182478e-13
+32
+984.889010528686
+13
+2997.357421875
+23
+1.6058367743182478e-13
+33
+984.889010528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3367.001953125
+20
+1.4422469295227724e-13
+30
+749.131198028686
+11
+2997.357421875
+21
+1.6058367743182478e-13
+31
+984.889010528686
+12
+3004.705078125
+22
+1.7110260690927914e-13
+32
+1136.482760528686
+13
+3004.705078125
+23
+1.7110260690927914e-13
+33
+1136.482760528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3367.001953125
+20
+1.4422469295227724e-13
+30
+749.131198028686
+11
+3004.705078125
+21
+1.7110260690927914e-13
+31
+1136.482760528686
+12
+3091.494140625
+22
+1.7260693742360278e-13
+32
+1158.162448028686
+13
+3091.494140625
+23
+1.7260693742360278e-13
+33
+1158.162448028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3367.001953125
+20
+1.4422469295227724e-13
+30
+749.131198028686
+11
+3091.494140625
+21
+1.7260693742360278e-13
+31
+1158.162448028686
+12
+3324.908203125
+22
+1.5140807444607995e-13
+32
+852.654635528686
+13
+3324.908203125
+23
+1.5140807444607995e-13
+33
+852.654635528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3324.908203125
+20
+1.5140807444607995e-13
+30
+852.654635528686
+11
+3091.494140625
+21
+1.7260693742360278e-13
+31
+1158.162448028686
+12
+3306.380859375
+22
+1.5670982306953407e-13
+32
+929.060885528686
+13
+3306.380859375
+23
+1.5670982306953407e-13
+33
+929.060885528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3306.380859375
+20
+1.5670982306953407e-13
+30
+929.060885528686
+11
+3091.494140625
+21
+1.7260693742360278e-13
+31
+1158.162448028686
+12
+3279.673828125
+22
+2.0988180811365442e-13
+32
+1695.349948028686
+13
+3279.673828125
+23
+2.0988180811365442e-13
+33
+1695.349948028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3472.857421875
+20
+1.8248185081060075e-13
+30
+1300.474948028686
+11
+3441.603515625
+21
+1.7226704004252857e-13
+31
+1153.264010528686
+12
+3427.259765625
+22
+1.793186909723743e-13
+32
+1254.889010528686
+13
+3427.259765625
+23
+1.793186909723743e-13
+33
+1254.889010528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3441.603515625
+20
+1.7226704004252857e-13
+30
+1153.264010528686
+11
+3472.857421875
+21
+1.8248185081060075e-13
+31
+1300.474948028686
+12
+3481.552734375
+22
+1.6952509274831273e-13
+32
+1113.748385528686
+13
+3481.552734375
+23
+1.6952509274831273e-13
+33
+1113.748385528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3481.552734375
+20
+1.6952509274831273e-13
+30
+1113.748385528686
+11
+3472.857421875
+21
+1.8248185081060075e-13
+31
+1300.474948028686
+12
+3580.517578125
+22
+1.799805963986767e-13
+32
+1264.428073028686
+13
+3580.517578125
+23
+1.799805963986767e-13
+33
+1264.428073028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3481.552734375
+20
+1.6952509274831273e-13
+30
+1113.748385528686
+11
+3580.517578125
+21
+1.799805963986767e-13
+31
+1264.428073028686
+12
+3501.486328125
+22
+1.4470119980708462e-13
+32
+755.998385528686
+13
+3501.486328125
+23
+1.4470119980708462e-13
+33
+755.998385528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3501.486328125
+20
+1.4470119980708462e-13
+30
+755.998385528686
+11
+3580.517578125
+21
+1.799805963986767e-13
+31
+1264.428073028686
+12
+3630.169921875
+22
+1.417478330892341e-13
+32
+713.435885528686
+13
+3630.169921875
+23
+1.417478330892341e-13
+33
+713.435885528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3630.169921875
+20
+1.417478330892341e-13
+30
+713.435885528686
+11
+3851.103515625
+21
+1.1464874188904517e-13
+31
+322.89682302868596
+12
+3860.982421875
+22
+1.1240281708874145e-13
+32
+290.52963552868596
+13
+3860.982421875
+23
+1.1240281708874145e-13
+33
+290.52963552868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3851.103515625
+20
+1.1464874188904517e-13
+30
+322.89682302868596
+11
+3630.169921875
+21
+1.417478330892341e-13
+31
+713.435885528686
+12
+3790.494140625
+22
+1.3459209875082978e-13
+32
+610.310885528686
+13
+3790.494140625
+23
+1.3459209875082978e-13
+33
+610.310885528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+3790.494140625
+20
+1.3459209875082978e-13
+30
+610.310885528686
+11
+3630.169921875
+21
+1.417478330892341e-13
+31
+713.435885528686
+12
+3790.494140625
+22
+1.4226174491899224e-13
+32
+720.842135528686
+13
+3790.494140625
+23
+1.4226174491899224e-13
+33
+720.842135528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3851.103515625
+20
+1.1464874188904517e-13
+30
+322.89682302868596
+11
+3790.494140625
+21
+1.3459209875082978e-13
+31
+610.310885528686
+12
+3803.935546875
+22
+1.317151682861395e-13
+32
+568.849948028686
+13
+3803.935546875
+23
+1.317151682861395e-13
+33
+568.849948028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2524.470703125
+20
+1.112953045695475e-13
+30
+274.56869802868596
+11
+4547.488741033201
+21
+6.714459055936259e-14
+31
+-361.7101472974264
+12
+2331.0584563925167
+22
+7.363034515030426e-14
+32
+-268.24057302868596
+13
+2331.0584563925167
+23
+7.363034515030426e-14
+33
+-268.24057302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+2524.470703125
+21
+1.112953045695475e-13
+31
+274.56869802868596
+12
+3860.982421875
+22
+1.1240281708874145e-13
+32
+290.52963552868596
+13
+3860.982421875
+23
+1.1240281708874145e-13
+33
+290.52963552868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+1933.330078125
+20
+1.1279800878061241e-13
+30
+296.22494802868596
+11
+2331.0584563925167
+21
+7.363034515030426e-14
+31
+-268.24057302868596
+12
+1864.236328125
+22
+1.119913623642832e-13
+32
+284.59994802868596
+13
+1864.236328125
+23
+1.119913623642832e-13
+33
+284.59994802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2331.0584563925167
+20
+7.363034515030426e-14
+30
+-268.24057302868596
+11
+1933.330078125
+21
+1.1279800878061241e-13
+31
+296.22494802868596
+12
+1957.775390625
+22
+1.1375427509674463e-13
+32
+310.00619802868596
+13
+1957.775390625
+23
+1.1375427509674463e-13
+33
+310.00619802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2331.0584563925167
+20
+7.363034515030426e-14
+30
+-268.24057302868596
+11
+1957.775390625
+21
+1.1375427509674463e-13
+31
+310.00619802868596
+12
+2056.998046875
+22
+1.1101070149927006e-13
+32
+270.46713552868596
+13
+2056.998046875
+23
+1.1101070149927006e-13
+33
+270.46713552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2331.0584563925167
+20
+7.363034515030426e-14
+30
+-268.24057302868596
+11
+2056.998046875
+21
+1.1101070149927006e-13
+31
+270.46713552868596
+12
+2159.197265625
+22
+1.1283378745230443e-13
+32
+296.74057302868596
+13
+2159.197265625
+23
+1.1283378745230443e-13
+33
+296.74057302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2331.0584563925167
+20
+7.363034515030426e-14
+30
+-268.24057302868596
+11
+2159.197265625
+21
+1.1283378745230443e-13
+31
+296.74057302868596
+12
+2353.189453125
+22
+1.1203527255226886e-13
+32
+285.23276052868596
+13
+2353.189453125
+23
+1.1203527255226886e-13
+33
+285.23276052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+2331.0584563925167
+20
+7.363034515030426e-14
+30
+-268.24057302868596
+11
+2353.189453125
+21
+1.1203527255226886e-13
+31
+285.23276052868596
+12
+2524.470703125
+22
+1.112953045695475e-13
+32
+274.56869802868596
+13
+2524.470703125
+23
+1.112953045695475e-13
+33
+274.56869802868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+2524.470703125
+20
+1.112953045695475e-13
+30
+274.56869802868596
+11
+2353.189453125
+21
+1.1203527255226886e-13
+31
+285.23276052868596
+12
+2437.048828125
+22
+1.1203527255226886e-13
+32
+285.23276052868596
+13
+2437.048828125
+23
+1.1203527255226886e-13
+33
+285.23276052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2548.658203125
+20
+1.1192143132415788e-13
+30
+283.59213552868596
+11
+3860.982421875
+21
+1.1240281708874145e-13
+31
+290.52963552868596
+12
+2524.470703125
+22
+1.112953045695475e-13
+32
+274.56869802868596
+13
+2524.470703125
+23
+1.112953045695475e-13
+33
+274.56869802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2548.658203125
+21
+1.1192143132415788e-13
+31
+283.59213552868596
+12
+2579.548828125
+22
+1.141445878788394e-13
+32
+315.63119802868596
+13
+2579.548828125
+23
+1.141445878788394e-13
+33
+315.63119802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2579.548828125
+21
+1.141445878788394e-13
+31
+315.63119802868596
+12
+2636.126953125
+22
+1.309670687871245e-13
+32
+558.068698028686
+13
+2636.126953125
+23
+1.309670687871245e-13
+33
+558.068698028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2636.126953125
+21
+1.309670687871245e-13
+31
+558.068698028686
+12
+2659.939453125
+22
+1.344782575227188e-13
+32
+608.670260528686
+13
+2659.939453125
+23
+1.344782575227188e-13
+33
+608.670260528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2659.939453125
+21
+1.344782575227188e-13
+31
+608.670260528686
+12
+2695.142578125
+22
+1.3817647113306686e-13
+32
+661.967135528686
+13
+2695.142578125
+23
+1.3817647113306686e-13
+33
+661.967135528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2695.142578125
+21
+1.3817647113306686e-13
+31
+661.967135528686
+12
+2747.419921875
+22
+1.3817647113306686e-13
+32
+661.967135528686
+13
+2747.419921875
+23
+1.3817647113306686e-13
+33
+661.967135528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2747.419921875
+21
+1.3817647113306686e-13
+31
+661.967135528686
+12
+2827.212890625
+22
+1.3869851447911863e-13
+32
+669.490573028686
+13
+2827.212890625
+23
+1.3869851447911863e-13
+33
+669.490573028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2827.212890625
+21
+1.3869851447911863e-13
+31
+669.490573028686
+12
+2948.548828125
+22
+1.3897498603310243e-13
+32
+673.474948028686
+13
+2948.548828125
+23
+1.3897498603310243e-13
+33
+673.474948028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+2948.548828125
+21
+1.3897498603310243e-13
+31
+673.474948028686
+12
+3391.353515625
+22
+1.432554162100752e-13
+32
+735.162448028686
+13
+3391.353515625
+23
+1.432554162100752e-13
+33
+735.162448028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+3391.353515625
+21
+1.432554162100752e-13
+31
+735.162448028686
+12
+3405.720703125
+22
+1.4364247638565253e-13
+32
+740.740573028686
+13
+3405.720703125
+23
+1.4364247638565253e-13
+33
+740.740573028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+3405.720703125
+21
+1.4364247638565253e-13
+31
+740.740573028686
+12
+3501.486328125
+22
+1.4470119980708462e-13
+32
+755.998385528686
+13
+3501.486328125
+23
+1.4470119980708462e-13
+33
+755.998385528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3860.982421875
+20
+1.1240281708874145e-13
+30
+290.52963552868596
+11
+3501.486328125
+21
+1.4470119980708462e-13
+31
+755.998385528686
+12
+3630.169921875
+22
+1.417478330892341e-13
+32
+713.435885528686
+13
+3630.169921875
+23
+1.417478330892341e-13
+33
+713.435885528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3099.392578125
+20
+2.1223181632251675e-13
+30
+1729.217135528686
+11
+2990.619140625
+21
+2.0952727400325166e-13
+31
+1690.240573028686
+12
+2970.228515625
+22
+2.1223181632251675e-13
+32
+1729.217135528686
+13
+2970.228515625
+23
+2.1223181632251675e-13
+33
+1729.217135528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+2990.619140625
+20
+2.0952727400325166e-13
+30
+1690.240573028686
+11
+3099.392578125
+21
+2.1223181632251675e-13
+31
+1729.217135528686
+12
+3077.689453125
+22
+2.0881170056941123e-13
+32
+1679.928073028686
+13
+3077.689453125
+23
+2.0881170056941123e-13
+33
+1679.928073028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3077.689453125
+20
+2.0881170056941123e-13
+30
+1679.928073028686
+11
+3099.392578125
+21
+2.1223181632251675e-13
+31
+1729.217135528686
+12
+3091.494140625
+22
+1.856791630172605e-13
+32
+1346.553073028686
+13
+3091.494140625
+23
+1.856791630172605e-13
+33
+1346.553073028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3091.494140625
+20
+1.856791630172605e-13
+30
+1346.553073028686
+11
+3099.392578125
+21
+2.1223181632251675e-13
+31
+1729.217135528686
+12
+3091.611328125
+22
+1.7803716400449643e-13
+32
+1236.420260528686
+13
+3091.611328125
+23
+1.7803716400449643e-13
+33
+1236.420260528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+3063.451171875
+20
+2.2292150764213758e-13
+30
+1883.271823028686
+11
+3099.392578125
+21
+2.1223181632251675e-13
+31
+1729.217135528686
+12
+3051.087890625
+22
+2.2221081311807334e-13
+32
+1873.029635528686
+13
+3051.087890625
+23
+2.2221081311807334e-13
+33
+1873.029635528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3099.392578125
+20
+2.1223181632251675e-13
+30
+1729.217135528686
+11
+3063.451171875
+21
+2.2292150764213758e-13
+31
+1883.271823028686
+12
+3129.017578125
+22
+2.2431199692835024e-13
+32
+1903.310885528686
+13
+3129.017578125
+23
+2.2431199692835024e-13
+33
+1903.310885528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3246.298828125
+20
+2.8460719024570036e-13
+30
+2772.256198028686
+11
+3190.751953125
+21
+2.2546341963552985e-13
+31
+1919.904635528686
+12
+3151.189453125
+22
+2.271694117539358e-13
+32
+1944.490573028686
+13
+3151.189453125
+23
+2.271694117539358e-13
+33
+1944.490573028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3190.751953125
+20
+2.2546341963552985e-13
+30
+1919.904635528686
+11
+3246.298828125
+21
+2.8460719024570036e-13
+31
+2772.256198028686
+12
+3273.193359375
+22
+2.835045566362826e-13
+32
+2756.365573028686
+13
+3273.193359375
+23
+2.835045566362826e-13
+33
+2756.365573028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3273.193359375
+20
+2.835045566362826e-13
+30
+2756.365573028686
+11
+3246.298828125
+21
+2.8460719024570036e-13
+31
+2772.256198028686
+12
+3255.158203125
+22
+2.871832546075259e-13
+32
+2809.381198028686
+13
+3255.158203125
+23
+2.871832546075259e-13
+33
+2809.381198028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3273.193359375
+20
+2.835045566362826e-13
+30
+2756.365573028686
+11
+3255.158203125
+21
+2.871832546075259e-13
+31
+2809.381198028686
+12
+3259.001953125
+22
+2.871019394445895e-13
+32
+2808.209323028686
+13
+3259.001953125
+23
+2.871019394445895e-13
+33
+2808.209323028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3273.193359375
+20
+2.835045566362826e-13
+30
+2756.365573028686
+11
+3259.001953125
+21
+2.871019394445895e-13
+31
+2808.209323028686
+12
+3276.931640625
+22
+2.840867732029073e-13
+32
+2764.756198028686
+13
+3276.931640625
+23
+2.840867732029073e-13
+33
+2764.756198028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3091.611328125
+20
+1.7803716400449643e-13
+30
+1236.420260528686
+11
+3279.673828125
+21
+2.0988180811365442e-13
+31
+1695.349948028686
+12
+3091.494140625
+22
+1.7260693742360278e-13
+32
+1158.162448028686
+13
+3091.494140625
+23
+1.7260693742360278e-13
+33
+1158.162448028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3279.673828125
+20
+2.0988180811365442e-13
+30
+1695.349948028686
+11
+3091.611328125
+21
+1.7803716400449643e-13
+31
+1236.420260528686
+12
+3099.392578125
+22
+2.1223181632251675e-13
+32
+1729.217135528686
+13
+3099.392578125
+23
+2.1223181632251675e-13
+33
+1729.217135528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+3279.673828125
+20
+2.0988180811365442e-13
+30
+1695.349948028686
+11
+3099.392578125
+21
+2.1223181632251675e-13
+31
+1729.217135528686
+12
+3251.244140625
+22
+2.11595931748354e-13
+32
+1720.053073028686
+13
+3251.244140625
+23
+2.11595931748354e-13
+33
+1720.053073028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3251.244140625
+20
+2.11595931748354e-13
+30
+1720.053073028686
+11
+3099.392578125
+21
+2.1223181632251675e-13
+31
+1729.217135528686
+12
+3129.017578125
+22
+2.2431199692835024e-13
+32
+1903.310885528686
+13
+3129.017578125
+23
+2.2431199692835024e-13
+33
+1903.310885528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+3251.244140625
+20
+2.11595931748354e-13
+30
+1720.053073028686
+11
+3129.017578125
+21
+2.2431199692835024e-13
+31
+1903.310885528686
+12
+3144.826171875
+22
+2.252536265151539e-13
+32
+1916.881198028686
+13
+3144.826171875
+23
+2.252536265151539e-13
+33
+1916.881198028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3251.244140625
+20
+2.11595931748354e-13
+30
+1720.053073028686
+11
+3144.826171875
+21
+2.252536265151539e-13
+31
+1916.881198028686
+12
+3151.189453125
+22
+2.271694117539358e-13
+32
+1944.490573028686
+13
+3151.189453125
+23
+2.271694117539358e-13
+33
+1944.490573028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3251.244140625
+20
+2.11595931748354e-13
+30
+1720.053073028686
+11
+3151.189453125
+21
+2.271694117539358e-13
+31
+1944.490573028686
+12
+3190.751953125
+22
+2.2546341963552985e-13
+32
+1919.904635528686
+13
+3190.751953125
+23
+2.2546341963552985e-13
+33
+1919.904635528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+3251.244140625
+20
+2.11595931748354e-13
+30
+1720.053073028686
+11
+3190.751953125
+21
+2.2546341963552985e-13
+31
+1919.904635528686
+12
+3251.244140625
+22
+2.2470881492347994e-13
+32
+1909.029635528686
+13
+3251.244140625
+23
+2.2470881492347994e-13
+33
+1909.029635528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3057.017578125
+20
+1.8393739222716254e-13
+30
+1321.451510528686
+11
+3065.291015625
+21
+1.7977568218807694e-13
+31
+1261.474948028686
+12
+3038.337890625
+22
+1.8099540963212313e-13
+32
+1279.053073028686
+13
+3038.337890625
+23
+1.8099540963212313e-13
+33
+1279.053073028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3065.291015625
+20
+1.7977568218807694e-13
+30
+1261.474948028686
+11
+3057.017578125
+21
+1.8393739222716254e-13
+31
+1321.451510528686
+12
+3091.494140625
+22
+1.856791630172605e-13
+32
+1346.553073028686
+13
+3091.494140625
+23
+1.856791630172605e-13
+33
+1346.553073028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+3065.291015625
+20
+1.7977568218807694e-13
+30
+1261.474948028686
+11
+3091.494140625
+21
+1.856791630172605e-13
+31
+1346.553073028686
+12
+3074.080078125
+22
+1.7957889949377082e-13
+32
+1258.639010528686
+13
+3074.080078125
+23
+1.7957889949377082e-13
+33
+1258.639010528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+3074.080078125
+20
+1.7957889949377082e-13
+30
+1258.639010528686
+11
+3091.494140625
+21
+1.856791630172605e-13
+31
+1346.553073028686
+12
+3091.611328125
+22
+1.7803716400449643e-13
+32
+1236.420260528686
+13
+3091.611328125
+23
+1.7803716400449643e-13
+33
+1236.420260528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+4086.462890625
+20
+1.4688857769007413e-13
+30
+787.521823028686
+11
+4038.275390625
+21
+1.139087739063238e-13
+31
+312.23276052868596
+12
+3956.853515625
+22
+1.1718740127591998e-13
+32
+359.48276052868596
+13
+3956.853515625
+23
+1.1718740127591998e-13
+33
+359.48276052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+4038.275390625
+20
+1.139087739063238e-13
+30
+312.23276052868596
+11
+4086.462890625
+21
+1.4688857769007413e-13
+31
+787.521823028686
+12
+4186.166015625
+22
+1.4719920161249123e-13
+32
+791.998385528686
+13
+4186.166015625
+23
+1.4719920161249123e-13
+33
+791.998385528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+4186.166015625
+20
+1.4719920161249123e-13
+30
+791.998385528686
+11
+4086.462890625
+21
+1.4688857769007413e-13
+31
+787.521823028686
+12
+4112.759765625
+22
+1.4928412239018085e-13
+32
+822.045260528686
+13
+4112.759765625
+23
+1.4928412239018085e-13
+33
+822.045260528686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4186.166015625
+20
+1.4719920161249123e-13
+30
+791.998385528686
+11
+4112.759765625
+21
+1.4928412239018085e-13
+31
+822.045260528686
+12
+4253.666015625
+22
+1.5552424799392117e-13
+32
+911.974948028686
+13
+4253.666015625
+23
+1.5552424799392117e-13
+33
+911.974948028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4186.166015625
+20
+1.4719920161249123e-13
+30
+791.998385528686
+11
+4253.666015625
+21
+1.5552424799392117e-13
+31
+911.974948028686
+12
+4196.712890625
+22
+1.4826117764044078e-13
+32
+807.303073028686
+13
+4196.712890625
+23
+1.4826117764044078e-13
+33
+807.303073028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+4196.712890625
+20
+1.4826117764044078e-13
+30
+807.303073028686
+11
+4253.666015625
+21
+1.5552424799392117e-13
+31
+911.974948028686
+12
+4272.626953125
+22
+1.5127471757886424e-13
+32
+850.732760528686
+13
+4272.626953125
+23
+1.5127471757886424e-13
+33
+850.732760528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+4272.626953125
+20
+1.5127471757886424e-13
+30
+850.732760528686
+11
+4253.666015625
+21
+1.5552424799392117e-13
+31
+911.974948028686
+12
+4263.251953125
+22
+1.5617802190392993e-13
+32
+921.396823028686
+13
+4263.251953125
+23
+1.5617802190392993e-13
+33
+921.396823028686
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4272.626953125
+20
+1.5127471757886424e-13
+30
+850.732760528686
+11
+4263.251953125
+21
+1.5617802190392993e-13
+31
+921.396823028686
+12
+4280.525390625
+22
+1.5238060379479945e-13
+32
+866.670260528686
+13
+4280.525390625
+23
+1.5238060379479945e-13
+33
+866.670260528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+4657.423828125
+20
+1.2230212502462035e-13
+30
+433.19369802868596
+11
+4703.830078125
+21
+1.1054883137379123e-13
+31
+263.81088552868596
+12
+4531.869140625
+22
+1.105472050705325e-13
+32
+263.78744802868596
+13
+4531.869140625
+23
+1.105472050705325e-13
+33
+263.78744802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+4703.830078125
+20
+1.1054883137379123e-13
+30
+263.81088552868596
+11
+4657.423828125
+21
+1.2230212502462035e-13
+31
+433.19369802868596
+12
+4750.001953125
+22
+1.1587822715264373e-13
+32
+340.61557302868596
+13
+4750.001953125
+23
+1.1587822715264373e-13
+33
+340.61557302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+4703.830078125
+20
+1.1054883137379123e-13
+30
+263.81088552868596
+11
+4547.488741033201
+21
+6.714459055936259e-14
+31
+-361.7101472974264
+12
+4531.869140625
+22
+1.105472050705325e-13
+32
+263.78744802868596
+13
+4531.869140625
+23
+1.105472050705325e-13
+33
+263.78744802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+4703.830078125
+21
+1.1054883137379123e-13
+31
+263.81088552868596
+12
+5266.105489290916
+22
+6.504176246391654e-14
+32
+-392.0150939440673
+13
+5266.105489290916
+23
+6.504176246391654e-14
+33
+-392.0150939440673
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+5266.105489290916
+20
+6.504176246391654e-14
+30
+-392.0150939440673
+11
+4703.830078125
+21
+1.1054883137379123e-13
+31
+263.81088552868596
+12
+4862.876953125
+22
+1.1054883137379123e-13
+32
+263.81088552868596
+13
+4862.876953125
+23
+1.1054883137379123e-13
+33
+263.81088552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5266.105489290916
+20
+6.504176246391654e-14
+30
+-392.0150939440673
+11
+4862.876953125
+21
+1.1054883137379123e-13
+31
+263.81088552868596
+12
+4918.236328125
+22
+1.1143679295305686e-13
+32
+276.60776052868596
+13
+4918.236328125
+23
+1.1143679295305686e-13
+33
+276.60776052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5266.105489290916
+20
+6.504176246391654e-14
+30
+-392.0150939440673
+11
+4918.236328125
+21
+1.1143679295305686e-13
+31
+276.60776052868596
+12
+4939.705078125
+22
+1.1121561570986982e-13
+32
+273.42026052868596
+13
+4939.705078125
+23
+1.1121561570986982e-13
+33
+273.42026052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5266.105489290916
+20
+6.504176246391654e-14
+30
+-392.0150939440673
+11
+4939.705078125
+21
+1.1121561570986982e-13
+31
+273.42026052868596
+12
+4984.494140625
+22
+1.0916322099735476e-13
+32
+243.84213552868596
+13
+4984.494140625
+23
+1.0916322099735476e-13
+33
+243.84213552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5266.105489290916
+20
+6.504176246391654e-14
+30
+-392.0150939440673
+11
+4984.494140625
+21
+1.0916322099735476e-13
+31
+243.84213552868596
+12
+5065.751953125
+22
+1.0868508783928865e-13
+32
+236.95151052868596
+13
+5065.751953125
+23
+1.0868508783928865e-13
+33
+236.95151052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+3878.736328125
+20
+1.1593026885692304e-13
+30
+341.36557302868596
+11
+4547.488741033201
+21
+6.714459055936259e-14
+31
+-361.7101472974264
+12
+3860.982421875
+22
+1.1240281708874145e-13
+32
+290.52963552868596
+13
+3860.982421875
+23
+1.1240281708874145e-13
+33
+290.52963552868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+3878.736328125
+21
+1.1593026885692304e-13
+31
+341.36557302868596
+12
+3890.923828125
+22
+1.1658566907019052e-13
+32
+350.81088552868596
+13
+3890.923828125
+23
+1.1658566907019052e-13
+33
+350.81088552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+3890.923828125
+21
+1.1658566907019052e-13
+31
+350.81088552868596
+12
+3956.853515625
+22
+1.1718740127591998e-13
+32
+359.48276052868596
+13
+3956.853515625
+23
+1.1718740127591998e-13
+33
+359.48276052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+3956.853515625
+21
+1.1718740127591998e-13
+31
+359.48276052868596
+12
+4038.275390625
+22
+1.139087739063238e-13
+32
+312.23276052868596
+13
+4038.275390625
+23
+1.139087739063238e-13
+33
+312.23276052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+4038.275390625
+21
+1.139087739063238e-13
+31
+312.23276052868596
+12
+4454.994140625
+22
+1.0782314711216268e-13
+32
+224.52963552868596
+13
+4454.994140625
+23
+1.0782314711216268e-13
+33
+224.52963552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+4454.994140625
+21
+1.0782314711216268e-13
+31
+224.52963552868596
+12
+4490.806640625
+22
+1.0847041580913652e-13
+32
+233.85776052868596
+13
+4490.806640625
+23
+1.0847041580913652e-13
+33
+233.85776052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+4547.488741033201
+20
+6.714459055936259e-14
+30
+-361.7101472974264
+11
+4490.806640625
+21
+1.0847041580913652e-13
+31
+233.85776052868596
+12
+4531.869140625
+22
+1.105472050705325e-13
+32
+263.78744802868596
+13
+4531.869140625
+23
+1.105472050705325e-13
+33
+263.78744802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5266.105489290916
+21
+6.504176246391654e-14
+31
+-392.0150939440673
+12
+5065.751953125
+22
+1.0868508783928865e-13
+32
+236.95151052868596
+13
+5065.751953125
+23
+1.0868508783928865e-13
+33
+236.95151052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5266.105489290916
+20
+6.504176246391654e-14
+30
+-392.0150939440673
+11
+5739.603515625
+21
+1.067481606581433e-13
+31
+209.03744802868596
+12
+6602.783203125
+22
+6.11303542508157e-14
+32
+-448.38442697131404
+13
+6602.783203125
+23
+6.11303542508157e-14
+33
+-448.38442697131404
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+6602.783203125
+20
+6.11303542508157e-14
+30
+-448.38442697131404
+11
+5739.603515625
+21
+1.067481606581433e-13
+31
+209.03744802868596
+12
+5859.626953125
+22
+1.072832144302649e-13
+32
+216.74838552868596
+13
+5859.626953125
+23
+1.072832144302649e-13
+33
+216.74838552868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5470.423828125
+20
+1.3097682660667687e-13
+30
+558.209323028686
+11
+5431.939453125
+21
+1.1599044207749598e-13
+31
+342.23276052868596
+12
+5417.009765625
+22
+1.3097682660667687e-13
+32
+558.209323028686
+13
+5417.009765625
+23
+1.3097682660667687e-13
+33
+558.209323028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5698.119140625
+20
+1.3152976971464447e-13
+30
+566.178073028686
+11
+5692.751953125
+21
+1.1768667637634955e-13
+31
+366.67807302868596
+12
+5692.751953125
+22
+1.314338178223795e-13
+32
+564.795260528686
+13
+5692.751953125
+23
+1.314338178223795e-13
+33
+564.795260528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5081.009765625
+20
+1.0967062761407798e-13
+30
+251.15463552868596
+11
+5739.603515625
+21
+1.067481606581433e-13
+31
+209.03744802868596
+12
+5065.751953125
+22
+1.0868508783928865e-13
+32
+236.95151052868596
+13
+5065.751953125
+23
+1.0868508783928865e-13
+33
+236.95151052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5081.009765625
+21
+1.0967062761407798e-13
+31
+251.15463552868596
+12
+5123.103515625
+22
+1.2032941917178297e-13
+32
+404.76401052868596
+13
+5123.103515625
+23
+1.2032941917178297e-13
+33
+404.76401052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5123.103515625
+21
+1.2032941917178297e-13
+31
+404.76401052868596
+12
+5302.001953125
+22
+1.1661168992233018e-13
+32
+351.18588552868596
+13
+5302.001953125
+23
+1.1661168992233018e-13
+33
+351.18588552868596
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+5302.001953125
+20
+1.1661168992233018e-13
+30
+351.18588552868596
+11
+5123.103515625
+21
+1.2032941917178297e-13
+31
+404.76401052868596
+12
+5229.861328125
+22
+1.2032941917178297e-13
+32
+404.76401052868596
+13
+5229.861328125
+23
+1.2032941917178297e-13
+33
+404.76401052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5302.001953125
+21
+1.1661168992233018e-13
+31
+351.18588552868596
+12
+5431.939453125
+22
+1.1599044207749598e-13
+32
+342.23276052868596
+13
+5431.939453125
+23
+1.1599044207749598e-13
+33
+342.23276052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5431.939453125
+21
+1.1599044207749598e-13
+31
+342.23276052868596
+12
+5517.064453125
+22
+1.1643279656387007e-13
+32
+348.60776052868596
+13
+5517.064453125
+23
+1.1643279656387007e-13
+33
+348.60776052868596
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+5517.064453125
+20
+1.1643279656387007e-13
+30
+348.60776052868596
+11
+5431.939453125
+21
+1.1599044207749598e-13
+31
+342.23276052868596
+12
+5504.384765625
+22
+1.1816480953441566e-13
+32
+373.56869802868596
+13
+5504.384765625
+23
+1.1816480953441566e-13
+33
+373.56869802868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+5504.384765625
+20
+1.1816480953441566e-13
+30
+373.56869802868596
+11
+5431.939453125
+21
+1.1599044207749598e-13
+31
+342.23276052868596
+12
+5470.423828125
+22
+1.3097682660667687e-13
+32
+558.209323028686
+13
+5470.423828125
+23
+1.3097682660667687e-13
+33
+558.209323028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5517.064453125
+21
+1.1643279656387007e-13
+31
+348.60776052868596
+12
+5623.072265625
+22
+1.1187264222639604e-13
+32
+282.88901052868596
+13
+5623.072265625
+23
+1.1187264222639604e-13
+33
+282.88901052868596
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+5623.072265625
+20
+1.1187264222639604e-13
+30
+282.88901052868596
+11
+5517.064453125
+21
+1.1643279656387007e-13
+31
+348.60776052868596
+12
+5616.744140625
+22
+1.1230035998344157e-13
+32
+289.05307302868596
+13
+5616.744140625
+23
+1.1230035998344157e-13
+33
+289.05307302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5623.072265625
+21
+1.1187264222639604e-13
+31
+282.88901052868596
+12
+5639.947265625
+22
+1.16941829483852e-13
+32
+355.94369802868596
+13
+5639.947265625
+23
+1.16941829483852e-13
+33
+355.94369802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5639.947265625
+21
+1.16941829483852e-13
+31
+355.94369802868596
+12
+5692.751953125
+22
+1.1768667637634955e-13
+32
+366.67807302868596
+13
+5692.751953125
+23
+1.1768667637634955e-13
+33
+366.67807302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5692.751953125
+21
+1.1768667637634955e-13
+31
+366.67807302868596
+12
+5698.119140625
+22
+1.3152976971464447e-13
+32
+566.178073028686
+13
+5698.119140625
+23
+1.3152976971464447e-13
+33
+566.178073028686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+5739.603515625
+20
+1.067481606581433e-13
+30
+209.03744802868596
+11
+5698.119140625
+21
+1.3152976971464447e-13
+31
+566.178073028686
+12
+5732.900390625
+22
+1.2813404851041987e-13
+32
+517.240573028686
+13
+5732.900390625
+23
+1.2813404851041987e-13
+33
+517.240573028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6258.111328125
+20
+1.330796367202125e-13
+30
+588.514010528686
+11
+6182.384765625
+21
+1.1334769928206256e-13
+31
+304.14682302868596
+12
+6182.384765625
+22
+1.323543054668197e-13
+32
+578.060885528686
+13
+6182.384765625
+23
+1.323543054668197e-13
+33
+578.060885528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6182.384765625
+20
+1.1334769928206256e-13
+30
+304.14682302868596
+11
+6258.111328125
+21
+1.330796367202125e-13
+31
+588.514010528686
+12
+6243.697265625
+22
+1.1307610663785495e-13
+32
+300.23276052868596
+13
+6243.697265625
+23
+1.1307610663785495e-13
+33
+300.23276052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6409.587890625
+20
+1.337821997279831e-13
+30
+598.639010528686
+11
+6365.291015625
+21
+1.1177506403087234e-13
+31
+281.48276052868596
+12
+6352.095703125
+22
+1.3202416590529786e-13
+32
+573.303073028686
+13
+6352.095703125
+23
+1.3202416590529786e-13
+33
+573.303073028686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+5859.626953125
+20
+1.072832144302649e-13
+30
+216.74838552868596
+11
+5991.322265625
+21
+1.1381282201405885e-13
+31
+310.84994802868596
+12
+6425.173828125
+22
+1.0541784459250358e-13
+32
+189.86557302868596
+13
+6425.173828125
+23
+1.0541784459250358e-13
+33
+189.86557302868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+5991.322265625
+20
+1.1381282201405885e-13
+30
+310.84994802868596
+11
+5859.626953125
+21
+1.072832144302649e-13
+31
+216.74838552868596
+12
+5922.228515625
+22
+1.155253193454997e-13
+32
+335.52963552868596
+13
+5922.228515625
+23
+1.155253193454997e-13
+33
+335.52963552868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6425.173828125
+20
+1.0541784459250358e-13
+30
+189.86557302868596
+11
+5991.322265625
+21
+1.1381282201405885e-13
+31
+310.84994802868596
+12
+6018.791015625
+22
+1.1335420449509748e-13
+32
+304.24057302868596
+13
+6018.791015625
+23
+1.1335420449509748e-13
+33
+304.24057302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6425.173828125
+20
+1.0541784459250358e-13
+30
+189.86557302868596
+11
+6018.791015625
+21
+1.1335420449509748e-13
+31
+304.24057302868596
+12
+6182.384765625
+22
+1.1334769928206256e-13
+32
+304.14682302868596
+13
+6182.384765625
+23
+1.1334769928206256e-13
+33
+304.14682302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6425.173828125
+20
+1.0541784459250358e-13
+30
+189.86557302868596
+11
+6182.384765625
+21
+1.1334769928206256e-13
+31
+304.14682302868596
+12
+6243.697265625
+22
+1.1307610663785495e-13
+32
+300.23276052868596
+13
+6243.697265625
+23
+1.1307610663785495e-13
+33
+300.23276052868596
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+6425.173828125
+20
+1.0541784459250358e-13
+30
+189.86557302868596
+11
+6243.697265625
+21
+1.1307610663785495e-13
+31
+300.23276052868596
+12
+6365.291015625
+22
+1.1177506403087234e-13
+32
+281.48276052868596
+13
+6365.291015625
+23
+1.1177506403087234e-13
+33
+281.48276052868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6425.173828125
+20
+1.0541784459250358e-13
+30
+189.86557302868596
+11
+6365.291015625
+21
+1.1177506403087234e-13
+31
+281.48276052868596
+12
+6409.587890625
+22
+1.337821997279831e-13
+32
+598.639010528686
+13
+6409.587890625
+23
+1.337821997279831e-13
+33
+598.639010528686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+6425.173828125
+20
+1.0541784459250358e-13
+30
+189.86557302868596
+11
+6409.587890625
+21
+1.337821997279831e-13
+31
+598.639010528686
+12
+6411.626953125
+22
+1.336260746151452e-13
+32
+596.389010528686
+13
+6411.626953125
+23
+1.336260746151452e-13
+33
+596.389010528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6602.783203125
+20
+6.11303542508157e-14
+30
+-448.38442697131404
+11
+5859.626953125
+21
+1.072832144302649e-13
+31
+216.74838552868596
+12
+6425.173828125
+22
+1.0541784459250358e-13
+32
+189.86557302868596
+13
+6425.173828125
+23
+1.0541784459250358e-13
+33
+189.86557302868596
+70
+0
+ 0
+3DFACE
+ 8
+ship2
+10
+6472.025390625
+20
+1.0540483416643376e-13
+30
+189.67807302868596
+11
+6602.783203125
+21
+6.11303542508157e-14
+31
+-448.38442697131404
+12
+6425.173828125
+22
+1.0541784459250358e-13
+32
+189.86557302868596
+13
+6425.173828125
+23
+1.0541784459250358e-13
+33
+189.86557302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6602.783203125
+20
+6.11303542508157e-14
+30
+-448.38442697131404
+11
+6472.025390625
+21
+1.0540483416643376e-13
+31
+189.67807302868596
+12
+6492.416015625
+22
+1.0628141162288829e-13
+32
+202.31088552868596
+13
+6492.416015625
+23
+1.0628141162288829e-13
+33
+202.31088552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6602.783203125
+20
+6.11303542508157e-14
+30
+-448.38442697131404
+11
+6492.416015625
+21
+1.0628141162288829e-13
+31
+202.31088552868596
+12
+6517.751953125
+22
+1.0988692594748883e-13
+32
+254.27182302868596
+13
+6517.751953125
+23
+1.0988692594748883e-13
+33
+254.27182302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6602.783203125
+20
+6.11303542508157e-14
+30
+-448.38442697131404
+11
+6517.751953125
+21
+1.0988692594748883e-13
+31
+254.27182302868596
+12
+6618.533203125
+22
+1.096722539173367e-13
+32
+251.17807302868596
+13
+6618.533203125
+23
+1.096722539173367e-13
+33
+251.17807302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6602.783203125
+20
+6.11303542508157e-14
+30
+-448.38442697131404
+11
+6618.533203125
+21
+1.096722539173367e-13
+31
+251.17807302868596
+12
+6958.306640625
+22
+1.1008208233853622e-13
+32
+257.08432302868596
+13
+6958.306640625
+23
+1.1008208233853622e-13
+33
+257.08432302868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+6958.306640625
+20
+1.1008208233853622e-13
+30
+257.08432302868596
+11
+6618.533203125
+21
+1.096722539173367e-13
+31
+251.17807302868596
+12
+6775.822265625
+22
+1.1010647688741715e-13
+32
+257.43588552868596
+13
+6775.822265625
+23
+1.1010647688741715e-13
+33
+257.43588552868596
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+6775.822265625
+20
+1.1010647688741715e-13
+30
+257.43588552868596
+11
+6618.533203125
+21
+1.096722539173367e-13
+31
+251.17807302868596
+12
+6632.853515625
+22
+1.1127253632392531e-13
+32
+274.24057302868596
+13
+6632.853515625
+23
+1.1127253632392531e-13
+33
+274.24057302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6775.822265625
+20
+1.1010647688741715e-13
+30
+257.43588552868596
+11
+6632.853515625
+21
+1.1127253632392531e-13
+31
+274.24057302868596
+12
+6760.845703125
+22
+1.1036343280229621e-13
+32
+261.13901052868596
+13
+6760.845703125
+23
+1.1036343280229621e-13
+33
+261.13901052868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+6760.845703125
+20
+1.1036343280229621e-13
+30
+261.13901052868596
+11
+6632.853515625
+21
+1.1127253632392531e-13
+31
+274.24057302868596
+12
+6660.720703125
+22
+1.1283704005882189e-13
+32
+296.78744802868596
+13
+6660.720703125
+23
+1.1283704005882189e-13
+33
+296.78744802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6760.845703125
+20
+1.1036343280229621e-13
+30
+261.13901052868596
+11
+6660.720703125
+21
+1.1283704005882189e-13
+31
+296.78744802868596
+12
+6685.025390625
+22
+1.13315173216888e-13
+32
+303.67807302868596
+13
+6685.025390625
+23
+1.13315173216888e-13
+33
+303.67807302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+6760.845703125
+20
+1.1036343280229621e-13
+30
+261.13901052868596
+11
+6685.025390625
+21
+1.13315173216888e-13
+31
+303.67807302868596
+12
+6700.025390625
+22
+1.1313627985842789e-13
+32
+301.09994802868596
+13
+6700.025390625
+23
+1.1313627985842789e-13
+33
+301.09994802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6958.306640625
+20
+1.1008208233853622e-13
+30
+257.08432302868596
+11
+6775.822265625
+21
+1.1010647688741715e-13
+31
+257.43588552868596
+12
+6869.150390625
+22
+1.1207430383047834e-13
+32
+285.79526052868596
+13
+6869.150390625
+23
+1.1207430383047834e-13
+33
+285.79526052868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6832.447265625
+20
+1.8655736677697377e-13
+30
+1359.209323028686
+11
+6723.673828125
+21
+1.7821280475643908e-13
+31
+1238.951510528686
+12
+6692.994140625
+22
+1.803432620253731e-13
+32
+1269.654635528686
+13
+6692.994140625
+23
+1.803432620253731e-13
+33
+1269.654635528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6723.673828125
+20
+1.7821280475643908e-13
+30
+1238.951510528686
+11
+6832.447265625
+21
+1.8655736677697377e-13
+31
+1359.209323028686
+12
+6793.728515625
+22
+1.8099053072234694e-13
+32
+1278.982760528686
+13
+6793.728515625
+23
+1.8099053072234694e-13
+33
+1278.982760528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+6793.728515625
+20
+1.8099053072234694e-13
+30
+1278.982760528686
+11
+6832.447265625
+21
+1.8655736677697377e-13
+31
+1359.209323028686
+12
+6822.861328125
+22
+1.7109284908972677e-13
+32
+1136.342135528686
+13
+6822.861328125
+23
+1.7109284908972677e-13
+33
+1136.342135528686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+6822.861328125
+20
+1.7109284908972677e-13
+30
+1136.342135528686
+11
+6762.416015625
+21
+1.6836716482809821e-13
+31
+1097.060885528686
+12
+6750.650390625
+22
+1.7172385475411334e-13
+32
+1145.435885528686
+13
+6750.650390625
+23
+1.7172385475411334e-13
+33
+1145.435885528686
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6762.416015625
+20
+1.6836716482809821e-13
+30
+1097.060885528686
+11
+6822.861328125
+21
+1.7109284908972677e-13
+31
+1136.342135528686
+12
+6807.697265625
+22
+1.6592283103022964e-13
+32
+1061.834323028686
+13
+6807.697265625
+23
+1.6592283103022964e-13
+33
+1061.834323028686
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+6807.697265625
+20
+1.6592283103022964e-13
+30
+1061.834323028686
+11
+6822.861328125
+21
+1.7109284908972677e-13
+31
+1136.342135528686
+12
+6869.150390625
+22
+1.1207430383047834e-13
+32
+285.79526052868596
+13
+6869.150390625
+23
+1.1207430383047834e-13
+33
+285.79526052868596
+70
+3
+ 0
+3DFACE
+ 8
+ship2
+10
+6869.150390625
+20
+1.1207430383047834e-13
+30
+285.79526052868596
+11
+6822.861328125
+21
+1.7109284908972677e-13
+31
+1136.342135528686
+12
+6832.447265625
+22
+1.8655736677697377e-13
+32
+1359.209323028686
+13
+6832.447265625
+23
+1.8655736677697377e-13
+33
+1359.209323028686
+70
+15
+ 0
+3DFACE
+ 8
+ship2
+10
+6869.150390625
+20
+1.1207430383047834e-13
+30
+285.79526052868596
+11
+6832.447265625
+21
+1.8655736677697377e-13
+31
+1359.209323028686
+12
+6958.306640625
+22
+1.1008208233853622e-13
+32
+257.08432302868596
+13
+6958.306640625
+23
+1.1008208233853622e-13
+33
+257.08432302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6958.306640625
+20
+1.1008208233853622e-13
+30
+257.08432302868596
+11
+6637.001953125
+21
+6.156457722089614e-14
+31
+-442.12661447131404
+12
+6602.783203125
+22
+6.11303542508157e-14
+32
+-448.38442697131404
+13
+6602.783203125
+23
+6.11303542508157e-14
+33
+-448.38442697131404
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+6637.001953125
+20
+6.156457722089614e-14
+30
+-442.12661447131404
+11
+6958.306640625
+21
+1.1008208233853622e-13
+31
+257.08432302868596
+12
+7215.087890625
+22
+6.435693991613256e-14
+32
+-401.88442697131404
+13
+7215.087890625
+23
+6.435693991613256e-14
+33
+-401.88442697131404
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+7391.478515625
+20
+1.059252512092268e-13
+30
+197.17807302868596
+11
+8232.978515625
+21
+5.684341886080802e-14
+31
+-510.16567697131404
+12
+7215.087890625
+22
+6.435693991613256e-14
+32
+-401.88442697131404
+13
+7215.087890625
+23
+6.435693991613256e-14
+33
+-401.88442697131404
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+8232.978515625
+20
+5.684341886080802e-14
+30
+-510.16567697131404
+11
+7391.478515625
+21
+1.059252512092268e-13
+31
+197.17807302868596
+12
+7567.892578125
+22
+1.0771418479382788e-13
+32
+222.95932302868596
+13
+7567.892578125
+23
+1.0771418479382788e-13
+33
+222.95932302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+7180.728515625
+20
+1.0958605984462411e-13
+30
+249.93588552868596
+11
+7215.087890625
+21
+6.435693991613256e-14
+31
+-401.88442697131404
+12
+6958.306640625
+22
+1.1008208233853622e-13
+32
+257.08432302868596
+13
+6958.306640625
+23
+1.1008208233853622e-13
+33
+257.08432302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+7215.087890625
+20
+6.435693991613256e-14
+30
+-401.88442697131404
+11
+7180.728515625
+21
+1.0958605984462411e-13
+31
+249.93588552868596
+12
+7270.306640625
+22
+1.0715473647282536e-13
+32
+214.89682302868596
+13
+7270.306640625
+23
+1.0715473647282536e-13
+33
+214.89682302868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+7215.087890625
+20
+6.435693991613256e-14
+30
+-401.88442697131404
+11
+7270.306640625
+21
+1.0715473647282536e-13
+31
+214.89682302868596
+12
+7288.353515625
+22
+1.0683923364063208e-13
+32
+210.34994802868596
+13
+7288.353515625
+23
+1.0683923364063208e-13
+33
+210.34994802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+7215.087890625
+20
+6.435693991613256e-14
+30
+-401.88442697131404
+11
+7288.353515625
+21
+1.0683923364063208e-13
+31
+210.34994802868596
+12
+7391.478515625
+22
+1.059252512092268e-13
+32
+197.17807302868596
+13
+7391.478515625
+23
+1.059252512092268e-13
+33
+197.17807302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+7567.892578125
+20
+1.0771418479382788e-13
+30
+222.95932302868596
+11
+7391.478515625
+21
+1.059252512092268e-13
+31
+197.17807302868596
+12
+7502.830078125
+22
+1.122271763367988e-13
+32
+287.99838552868596
+13
+7502.830078125
+23
+1.122271763367988e-13
+33
+287.99838552868596
+70
+0
+ 0
+3DFACE
+ 8
+ship2
+10
+7956.978515625
+20
+1.0916159469409603e-13
+30
+243.81869802868596
+11
+8232.978515625
+21
+5.684341886080802e-14
+31
+-510.16567697131404
+12
+7567.892578125
+22
+1.0771418479382788e-13
+32
+222.95932302868596
+13
+7567.892578125
+23
+1.0771418479382788e-13
+33
+222.95932302868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+8232.978515625
+20
+5.684341886080802e-14
+30
+-510.16567697131404
+11
+7956.978515625
+21
+1.0916159469409603e-13
+31
+243.81869802868596
+12
+7994.548828125
+22
+1.0959907027069393e-13
+32
+250.12338552868596
+13
+7994.548828125
+23
+1.0959907027069393e-13
+33
+250.12338552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+8232.978515625
+20
+5.684341886080802e-14
+30
+-510.16567697131404
+11
+7994.548828125
+21
+1.0959907027069393e-13
+31
+250.12338552868596
+12
+8034.861328125
+22
+1.0962997003260977e-13
+32
+250.56869802868596
+13
+8034.861328125
+23
+1.0962997003260977e-13
+33
+250.56869802868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+8232.978515625
+20
+5.684341886080802e-14
+30
+-510.16567697131404
+11
+8034.861328125
+21
+1.0962997003260977e-13
+31
+250.56869802868596
+12
+8046.298828125
+22
+1.0995035177457924e-13
+32
+255.18588552868596
+13
+8046.298828125
+23
+1.0995035177457924e-13
+33
+255.18588552868596
+70
+13
+ 0
+3DFACE
+ 8
+ship2
+10
+8232.978515625
+20
+5.684341886080802e-14
+30
+-510.16567697131404
+11
+8046.298828125
+21
+1.0995035177457924e-13
+31
+255.18588552868596
+12
+8153.408203125
+22
+1.145349006609342e-13
+32
+321.25619802868596
+13
+8153.408203125
+23
+1.145349006609342e-13
+33
+321.25619802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+8174.970703125
+20
+1.146959046835483e-13
+30
+323.57651052868596
+11
+8232.978515625
+21
+5.684341886080802e-14
+31
+-510.16567697131404
+12
+8153.408203125
+22
+1.145349006609342e-13
+32
+321.25619802868596
+13
+8153.408203125
+23
+1.145349006609342e-13
+33
+321.25619802868596
+70
+1
+ 0
+3DFACE
+ 8
+ship2
+10
+8232.978515625
+20
+5.684341886080802e-14
+30
+-510.16567697131404
+11
+8174.970703125
+21
+1.146959046835483e-13
+31
+323.57651052868596
+12
+8260.025390625
+22
+1.1327288933216106e-13
+32
+303.06869802868596
+13
+8260.025390625
+23
+1.1327288933216106e-13
+33
+303.06869802868596
+70
+1
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/hacks/glx/sierpinski3d.c b/hacks/glx/sierpinski3d.c
new file mode 100644
index 0000000..0317299
--- /dev/null
+++ b/hacks/glx/sierpinski3d.c
@@ -0,0 +1,581 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* Sierpinski3D --- 3D sierpinski gasket */
+
+#if 0
+static const char sccsid[] = "@(#)sierpinski3D.c 00.01 99/11/04 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 1999: written by Tim Robinson <the_luggage@bigfoot.com>
+ * a 3-D representation of the Sierpinski gasket fractal.
+ *
+ * 10-Dec-99 jwz rewrote to draw a set of tetrahedrons instead of a
+ * random scattering of points.
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_gasket 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "150"
+#define DEF_MAX_DEPTH "5"
+
+#include "rotator.h"
+#include "gltrackball.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static int max_depth;
+static int speed;
+static Bool do_spin;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ {"-depth", ".sierpinski3d.maxDepth", XrmoptionSepArg, 0 },
+ {"-speed", ".sierpinski3d.speed", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Int},
+ {&max_depth, "maxDepth", "MaxDepth", DEF_MAX_DEPTH, t_Int},
+};
+
+
+ENTRYPOINT ModeSpecOpt gasket_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct gasket_description =
+{"gasket", "init_gasket", "draw_gasket", NULL,
+ "draw_gasket", "init_gasket", "free_gasket", &gasket_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Shows GL's Sierpinski gasket", 0, NULL};
+
+#endif
+
+typedef struct {
+ double x,y,z;
+} XYZ;
+
+typedef struct {
+ GLuint gasket0, gasket1, gasket2, gasket3;
+ GLXContext *glx_context;
+ Window window;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int current_depth;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor0;
+ int ccolor1;
+ int ccolor2;
+ int ccolor3;
+
+ int tick;
+
+} gasketstruct;
+
+static gasketstruct *gasket = NULL;
+
+
+static void
+triangle (GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat x3, GLfloat y3, GLfloat z3,
+ Bool wireframe_p)
+{
+ if (wireframe_p)
+ glBegin (GL_LINE_LOOP);
+ else
+ glBegin (GL_TRIANGLES);
+ glVertex3f (x1, y1, z1);
+ glVertex3f (x2, y2, z2);
+ glVertex3f (x3, y3, z3);
+ glEnd();
+}
+
+static void
+four_tetras (gasketstruct *gp,
+ XYZ *outer, XYZ *normals,
+ Bool wireframe_p, int countdown, int which,
+ int *countP)
+{
+ if (countdown <= 0)
+ {
+ (*countP)++;
+ if (which == 0)
+ {
+ glNormal3f (normals[0].x, normals[0].y, normals[0].z);
+ triangle (outer[0].x, outer[0].y, outer[0].z,
+ outer[1].x, outer[1].y, outer[1].z,
+ outer[2].x, outer[2].y, outer[2].z,
+ wireframe_p);
+ }
+ else if (which == 1)
+ {
+ glNormal3f (normals[1].x, normals[1].y, normals[1].z);
+ triangle (outer[0].x, outer[0].y, outer[0].z,
+ outer[3].x, outer[3].y, outer[3].z,
+ outer[1].x, outer[1].y, outer[1].z,
+ wireframe_p);
+ }
+ else if (which == 2)
+ {
+ glNormal3f (normals[2].x, normals[2].y, normals[2].z);
+ triangle (outer[0].x, outer[0].y, outer[0].z,
+ outer[2].x, outer[2].y, outer[2].z,
+ outer[3].x, outer[3].y, outer[3].z,
+ wireframe_p);
+ }
+ else
+ {
+ glNormal3f (normals[3].x, normals[3].y, normals[3].z);
+ triangle (outer[1].x, outer[1].y, outer[1].z,
+ outer[3].x, outer[3].y, outer[3].z,
+ outer[2].x, outer[2].y, outer[2].z,
+ wireframe_p);
+ }
+ }
+ else
+ {
+# define M01 0
+# define M02 1
+# define M03 2
+# define M12 3
+# define M13 4
+# define M23 5
+ XYZ inner[M23+1];
+ XYZ corner[4];
+
+ inner[M01].x = (outer[0].x + outer[1].x) / 2.0;
+ inner[M01].y = (outer[0].y + outer[1].y) / 2.0;
+ inner[M01].z = (outer[0].z + outer[1].z) / 2.0;
+
+ inner[M02].x = (outer[0].x + outer[2].x) / 2.0;
+ inner[M02].y = (outer[0].y + outer[2].y) / 2.0;
+ inner[M02].z = (outer[0].z + outer[2].z) / 2.0;
+
+ inner[M03].x = (outer[0].x + outer[3].x) / 2.0;
+ inner[M03].y = (outer[0].y + outer[3].y) / 2.0;
+ inner[M03].z = (outer[0].z + outer[3].z) / 2.0;
+
+ inner[M12].x = (outer[1].x + outer[2].x) / 2.0;
+ inner[M12].y = (outer[1].y + outer[2].y) / 2.0;
+ inner[M12].z = (outer[1].z + outer[2].z) / 2.0;
+
+ inner[M13].x = (outer[1].x + outer[3].x) / 2.0;
+ inner[M13].y = (outer[1].y + outer[3].y) / 2.0;
+ inner[M13].z = (outer[1].z + outer[3].z) / 2.0;
+
+ inner[M23].x = (outer[2].x + outer[3].x) / 2.0;
+ inner[M23].y = (outer[2].y + outer[3].y) / 2.0;
+ inner[M23].z = (outer[2].z + outer[3].z) / 2.0;
+
+ countdown--;
+
+ corner[0] = outer[0];
+ corner[1] = inner[M01];
+ corner[2] = inner[M02];
+ corner[3] = inner[M03];
+ four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP);
+
+ corner[0] = inner[M01];
+ corner[1] = outer[1];
+ corner[2] = inner[M12];
+ corner[3] = inner[M13];
+ four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP);
+
+ corner[0] = inner[M02];
+ corner[1] = inner[M12];
+ corner[2] = outer[2];
+ corner[3] = inner[M23];
+ four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP);
+
+ corner[0] = inner[M03];
+ corner[1] = inner[M13];
+ corner[2] = inner[M23];
+ corner[3] = outer[3];
+ four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP);
+ }
+}
+
+
+static void
+compile_gasket(ModeInfo *mi, int which)
+{
+ Bool wireframe_p = MI_IS_WIREFRAME(mi);
+ gasketstruct *gp = &gasket[MI_SCREEN(mi)];
+ int count = 0;
+ XYZ vertex[5];
+ XYZ normal[4];
+
+ vertex[0].x = -1; vertex[0].y = -1; vertex[0].z = -1;
+ vertex[1].x = 1; vertex[1].y = 1; vertex[1].z = -1;
+ vertex[2].x = 1; vertex[2].y = -1; vertex[2].z = 1;
+ vertex[3].x = -1; vertex[3].y = 1; vertex[3].z = 1;
+ vertex[4].x = 0; vertex[4].y = 0; vertex[4].z = 0; /* center */
+
+ normal[0].x = 1; normal[0].y = -1; normal[0].z = -1;
+ normal[1].x = -1; normal[1].y = 1; normal[1].z = -1;
+ normal[2].x = -1; normal[2].y = -1; normal[2].z = 1;
+ normal[3].x = 1; normal[3].y = 1; normal[3].z = 1;
+
+ four_tetras (gp, vertex, normal, wireframe_p,
+ (gp->current_depth < 0
+ ? -gp->current_depth : gp->current_depth),
+ which,
+ &count);
+ mi->polygon_count += count;
+}
+
+static void
+draw(ModeInfo *mi)
+{
+ Bool wireframe_p = MI_IS_WIREFRAME(mi);
+ gasketstruct *gp = &gasket[MI_SCREEN(mi)];
+
+ static const GLfloat pos[] = {-4.0, 3.0, 10.0, 1.0};
+ static const GLfloat white[] = {1.0, 1.0, 1.0, 1.0};
+
+ GLfloat color0[] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color1[] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color2[] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color3[] = {0.0, 0.0, 0.0, 1.0};
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (!wireframe_p)
+ {
+ glColor4fv (white);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+
+ color0[0] = gp->colors[gp->ccolor0].red / 65536.0;
+ color0[1] = gp->colors[gp->ccolor0].green / 65536.0;
+ color0[2] = gp->colors[gp->ccolor0].blue / 65536.0;
+
+ color1[0] = gp->colors[gp->ccolor1].red / 65536.0;
+ color1[1] = gp->colors[gp->ccolor1].green / 65536.0;
+ color1[2] = gp->colors[gp->ccolor1].blue / 65536.0;
+
+ color2[0] = gp->colors[gp->ccolor2].red / 65536.0;
+ color2[1] = gp->colors[gp->ccolor2].green / 65536.0;
+ color2[2] = gp->colors[gp->ccolor2].blue / 65536.0;
+
+ color3[0] = gp->colors[gp->ccolor3].red / 65536.0;
+ color3[1] = gp->colors[gp->ccolor3].green / 65536.0;
+ color3[2] = gp->colors[gp->ccolor3].blue / 65536.0;
+
+ gp->ccolor0++;
+ gp->ccolor1++;
+ gp->ccolor2++;
+ gp->ccolor3++;
+ if (gp->ccolor0 >= gp->ncolors) gp->ccolor0 = 0;
+ if (gp->ccolor1 >= gp->ncolors) gp->ccolor1 = 0;
+ if (gp->ccolor2 >= gp->ncolors) gp->ccolor2 = 0;
+ if (gp->ccolor3 >= gp->ncolors) gp->ccolor3 = 0;
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glPushMatrix();
+
+ {
+ double x, y, z;
+ get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
+ glTranslatef((x - 0.5) * 10,
+ (y - 0.5) * 10,
+ (z - 0.5) * 20);
+
+ gltrackball_rotate (gp->trackball);
+
+ get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ glScalef (4, 4, 4);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color0);
+ glCallList(gp->gasket0);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1);
+ glCallList(gp->gasket1);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2);
+ glCallList(gp->gasket2);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color3);
+ glCallList(gp->gasket3);
+
+ glPopMatrix();
+
+
+ if (gp->tick++ >= speed)
+ {
+ gp->tick = 0;
+ if (gp->current_depth >= max_depth)
+ gp->current_depth = -max_depth;
+ gp->current_depth++;
+
+ /* We make four different lists so that each face of the tetrahedrons
+ can have a different color (all triangles facing in the same
+ direction have the same color, which is different from all
+ triangles facing in other directions.)
+ */
+ glDeleteLists (gp->gasket0, 1);
+ glDeleteLists (gp->gasket1, 1);
+ glDeleteLists (gp->gasket2, 1);
+ glDeleteLists (gp->gasket3, 1);
+
+ mi->polygon_count = 0;
+ glNewList (gp->gasket0, GL_COMPILE); compile_gasket (mi, 0); glEndList();
+ glNewList (gp->gasket1, GL_COMPILE); compile_gasket (mi, 1); glEndList();
+ glNewList (gp->gasket2, GL_COMPILE); compile_gasket (mi, 2); glEndList();
+ glNewList (gp->gasket3, GL_COMPILE); compile_gasket (mi, 3); glEndList();
+
+ mi->recursion_depth = (gp->current_depth > 0
+ ? gp->current_depth
+ : -gp->current_depth);
+ }
+}
+
+
+/* new window size or exposure */
+ENTRYPOINT void
+reshape_gasket(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+static void
+pinit(ModeInfo *mi)
+{
+ gasketstruct *gp = &gasket[MI_SCREEN(mi)];
+
+ /* draw the gasket */
+ gp->gasket0 = glGenLists(1);
+ gp->gasket1 = glGenLists(1);
+ gp->gasket2 = glGenLists(1);
+ gp->gasket3 = glGenLists(1);
+ gp->current_depth = 1; /* start out at level 1, not 0 */
+}
+
+
+ENTRYPOINT Bool
+gasket_handle_event (ModeInfo *mi, XEvent *event)
+{
+ gasketstruct *gp = &gasket[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '+' || c == '=' ||
+ keysym == XK_Up || keysym == XK_Right || keysym == XK_Next)
+ {
+ gp->tick = speed;
+ gp->current_depth += (gp->current_depth > 0 ? 1 : -1);
+ gp->current_depth--;
+ return True;
+ }
+ else if (c == '-' || c == '_' ||
+ keysym == XK_Down || keysym == XK_Left || keysym == XK_Prior)
+ {
+ gp->tick = speed;
+ gp->current_depth -= (gp->current_depth > 0 ? 1 : -1);
+ gp->current_depth--;
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ gp->tick = speed;
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_gasket(ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ gasketstruct *gp;
+
+ MI_INIT (mi, gasket);
+ gp = &gasket[screen];
+
+ gp->window = MI_WINDOW(mi);
+
+ {
+ double spin_speed = 1.0;
+ double wander_speed = 0.03;
+ gp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ True);
+ gp->trackball = gltrackball_init (True);
+ }
+
+ gp->ncolors = 255;
+ gp->colors = (XColor *) calloc(gp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ gp->colors, &gp->ncolors,
+ False, 0, False);
+ gp->ccolor0 = 0;
+ gp->ccolor1 = gp->ncolors * 0.25;
+ gp->ccolor2 = gp->ncolors * 0.5;
+ gp->ccolor3 = gp->ncolors * 0.75;
+ gp->tick = 999999;
+
+ if ((gp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_gasket(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ pinit(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_gasket(ModeInfo * mi)
+{
+ gasketstruct *gp = &gasket[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!gp->glx_context) return;
+
+ glDrawBuffer(GL_BACK);
+
+ /* 0 = 4 polygons
+ 1 = 16 polygons
+ 2 = 64 polygons
+ 3 = 256 polygons
+ 4 = 1,024 polygons
+ 5 = 4,096 polygons
+ 6 = 16,384 polygons
+ 7 = 65,536 polygons, 30 fps (3GHz Core 2 Duo, GeForce 8800 GS)
+ 8 = 262,144 polygons, 12 fps
+ 9 = 1,048,576 polygons, 4 fps
+ 10 = 4,194,304 polygons, 1 fps
+ 11 = 16,777,216 polygons, 0.3 fps
+ 12 = 67,108,864 polygons, OOM!
+ 13 = 268,435,456 polygons
+ 14 = 1,073,741,824 polygons, 31 bits
+ 15 = 4,294,967,296 polygons, 33 bits
+ 16 = 17,179,869,184 polygons, 35 bits
+ */
+ if (max_depth > 10)
+ max_depth = 10;
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+ draw(mi);
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+ENTRYPOINT void
+free_gasket(ModeInfo * mi)
+{
+ gasketstruct *gp = &gasket[MI_SCREEN(mi)];
+
+ if (gp->glx_context)
+ {
+ /* Display lists MUST be freed while their glXContext is current. */
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ if (glIsList(gp->gasket0)) glDeleteLists(gp->gasket0, 1);
+ if (glIsList(gp->gasket1)) glDeleteLists(gp->gasket1, 1);
+ if (glIsList(gp->gasket2)) glDeleteLists(gp->gasket2, 1);
+ if (glIsList(gp->gasket3)) glDeleteLists(gp->gasket3, 1);
+ }
+}
+
+XSCREENSAVER_MODULE_2 ("Sierpinski3D", sierpinski3d, gasket)
+
+/*********************************************************/
+
+#endif
diff --git a/hacks/glx/sierpinski3d.man b/hacks/glx/sierpinski3d.man
new file mode 100644
index 0000000..ed3b69a
--- /dev/null
+++ b/hacks/glx/sierpinski3d.man
@@ -0,0 +1,67 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+sierpinski3d - 3D Sierpinski triangle fractal.
+.SH SYNOPSIS
+.B sierpinski3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-depth \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws the three-dimensional variant of the recursive Sierpinski
+triangle fractal, using GL.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Number of frames before changing shape. Default: 150.
+.TP 8
+.B \-depth \fInumber\fP
+Max depth to descend. Default: 5. You probably don't have enough
+memory for 6.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tim Robinson and Jamie Zawinski. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Tim Robinson and Jamie Zawinski.
diff --git a/hacks/glx/skytentacles.c b/hacks/glx/skytentacles.c
new file mode 100644
index 0000000..1061482
--- /dev/null
+++ b/hacks/glx/skytentacles.c
@@ -0,0 +1,1103 @@
+/* Sky Tentacles, Copyright (c) 2008-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 9 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_tentacles 0
+# define release_tentacles 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#include "ximage-loader.h"
+#include "images/gen/scales_png.h"
+
+#ifdef USE_GL /* whole file */
+
+# ifndef HAVE_JWZGLES
+# define HAVE_POLYGONMODE
+# endif
+
+#define DEF_SPEED "1.0"
+#define DEF_SMOOTH "True"
+#define DEF_TEXTURE "True"
+#define DEF_CEL "False"
+#define DEF_INTERSECT "False"
+#define DEF_SLICES "16"
+#define DEF_SEGMENTS "24"
+#define DEF_WIGGLINESS "0.35"
+#define DEF_FLEXIBILITY "0.35"
+#define DEF_THICKNESS "1.0"
+#define DEF_LENGTH "9.0"
+#define DEF_COLOR "#305A30"
+#define DEF_STRIPE "#451A30"
+#define DEF_SUCKER "#453E30"
+#define DEF_DEBUG "False"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+typedef struct {
+ GLfloat length; /* length of the segment coming out of this segment */
+ GLfloat th; /* vector tilt (on yz plane) from previous segment */
+ GLfloat phi; /* vector rotation (on xy plane) from previous segment */
+ GLfloat thickness; /* radius of tentacle at the bottom of this segment */
+ rotator *rot; /* motion modeller */
+} segment;
+
+typedef struct {
+ ModeInfo *mi;
+ GLfloat x, y, z; /* position of the base */
+ int nsegments;
+ segment *segments;
+ GLfloat tentacle_color[4], stripe_color[4], sucker_color[4];
+} tentacle;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int ntentacles;
+ int tentacles_size;
+ tentacle **tentacles;
+ GLfloat tentacle_color[4], stripe_color[4], sucker_color[4];
+
+ int torus_polys;
+ int torus_step;
+ XYZ *torus_points;
+ XYZ *torus_normals;
+
+ GLfloat line_thickness;
+ GLfloat outline_color[4];
+ XImage *texture;
+ GLuint texid;
+
+ Bool left_p;
+
+
+} tentacles_configuration;
+
+static tentacles_configuration *tcs = NULL;
+
+static int debug_p;
+static GLfloat arg_speed;
+static int smooth_p;
+static int texture_p;
+static int cel_p;
+static int intersect_p;
+static int arg_slices;
+static int arg_segments;
+static GLfloat arg_thickness;
+static GLfloat arg_length;
+static GLfloat arg_wiggliness;
+static GLfloat arg_flexibility;
+static char *arg_color, *arg_stripe, *arg_sucker;
+
+/* we can only have one light when doing cel shading */
+static GLfloat light_pos[4] = {1.0, 1.0, 1.0, 0.0};
+
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-no-smooth", ".smooth", XrmoptionNoArg, "False" },
+ { "-texture", ".texture", XrmoptionNoArg, "True" },
+ { "-no-texture", ".texture", XrmoptionNoArg, "False" },
+ { "-cel", ".cel", XrmoptionNoArg, "True" },
+ { "-no-cel", ".cel", XrmoptionNoArg, "False" },
+ { "-intersect", ".intersect", XrmoptionNoArg, "True" },
+ { "-no-intersect", ".intersect", XrmoptionNoArg, "False" },
+ { "-slices", ".slices", XrmoptionSepArg, 0 },
+ { "-segments", ".segments", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-length", ".length", XrmoptionSepArg, 0 },
+ { "-wiggliness", ".wiggliness", XrmoptionSepArg, 0 },
+ { "-flexibility", ".flexibility", XrmoptionSepArg, 0 },
+ { "-color", ".tentacleColor", XrmoptionSepArg, 0 },
+ { "-stripe-color", ".stripeColor", XrmoptionSepArg, 0 },
+ { "-sucker-color", ".suckerColor", XrmoptionSepArg, 0 },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ {&arg_speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&smooth_p, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+ {&texture_p, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&cel_p, "cel", "Cel", DEF_CEL, t_Bool},
+ {&intersect_p, "intersect", "Intersect", DEF_INTERSECT, t_Bool},
+ {&arg_slices, "slices", "Slices", DEF_SLICES, t_Int},
+ {&arg_segments, "segments", "Segments", DEF_SEGMENTS, t_Int},
+ {&arg_thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&arg_length, "length", "Length", DEF_LENGTH, t_Float},
+ {&arg_wiggliness, "wiggliness", "Wiggliness", DEF_WIGGLINESS, t_Float},
+ {&arg_flexibility, "flexibility", "Flexibility", DEF_FLEXIBILITY, t_Float},
+ {&arg_color, "tentacleColor", "Color", DEF_COLOR, t_String},
+ {&arg_stripe, "stripeColor", "Color", DEF_STRIPE, t_String},
+ {&arg_sucker, "suckerColor", "Color", DEF_SUCKER, t_String},
+ {&debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt tentacles_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_tentacles (ModeInfo *mi, int width, int height)
+{
+ tentacles_configuration *tc = &tcs[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ tc->line_thickness = (MI_IS_WIREFRAME (mi) ? 1 : MAX (3, width / 200));
+}
+
+
+static void
+normalize (GLfloat *x, GLfloat *y, GLfloat *z)
+{
+ GLfloat d = sqrt((*x)*(*x) + (*y)*(*y) + (*z)*(*z));
+ *x /= d;
+ *y /= d;
+ *z /= d;
+}
+
+static GLfloat
+dot (GLfloat x0, GLfloat y0, GLfloat z0,
+ GLfloat x1, GLfloat y1, GLfloat z1)
+{
+ return x0*x1 + y0*y1 + z0*z1;
+}
+
+
+static void
+compute_unit_torus (ModeInfo *mi, double ratio, int slices1, int slices2)
+{
+ tentacles_configuration *tc = &tcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME (mi);
+ int i, j, k, fp;
+
+ if (wire) slices1 /= 2;
+ if (wire) slices2 /= 4;
+ if (slices1 < 3) slices1 = 3;
+ if (slices2 < 3) slices2 = 3;
+
+ tc->torus_polys = slices1 * (slices2+1) * 2;
+ tc->torus_points = (XYZ *) calloc (tc->torus_polys + 1,
+ sizeof (*tc->torus_points));
+ tc->torus_normals = (XYZ *) calloc (tc->torus_polys + 1,
+ sizeof (*tc->torus_normals));
+ tc->torus_step = 2 * (slices2+1);
+ fp = 0;
+ for (i = 0; i < slices1; i++)
+ for (j = 0; j <= slices2; j++)
+ for (k = 0; k <= 1; k++)
+ {
+ double s = (i + k) % slices1 + 0.5;
+ double t = j % slices2;
+ XYZ p;
+ p.x = cos(t*M_PI*2/slices2) * cos(s*M_PI*2/slices1);
+ p.y = sin(t*M_PI*2/slices2) * cos(s*M_PI*2/slices1);
+ p.z = sin(s*M_PI*2/slices1);
+ tc->torus_normals[fp] = p;
+
+ p.x = (1 + ratio * cos(s*M_PI*2/slices1)) * cos(t*M_PI*2/slices2) / 2;
+ p.y = (1 + ratio * cos(s*M_PI*2/slices1)) * sin(t*M_PI*2/slices2) / 2;
+ p.z = ratio * sin(s*M_PI*2/slices1) / 2;
+ tc->torus_points[fp] = p;
+ fp++;
+ }
+ if (fp != tc->torus_polys) abort();
+ tc->torus_polys = fp;
+}
+
+
+/* Initializes a new tentacle and stores it in the list.
+ */
+static tentacle *
+make_tentacle (ModeInfo *mi, int which, int total)
+{
+ tentacles_configuration *tc = &tcs[MI_SCREEN(mi)];
+ tentacle *t = (tentacle *) calloc (1, sizeof (*t));
+ double brightness;
+ int i;
+
+ t->mi = mi;
+
+ /* position tentacles on a grid */
+ {
+ int cols = (int) (sqrt(total) + 0.5);
+ int rows = (total+cols-1) / cols;
+ int xx = which % cols;
+ int yy = which / cols;
+ double spc = arg_thickness * 0.8;
+ if (!intersect_p) cols = 1, xx = 0;
+ t->x = (cols * spc / 2) - (spc * (xx + 0.5));
+ t->y = (rows * spc / 2) - (spc * (yy + 0.5));
+ t->z = 0;
+ }
+
+ /* Brighten or darken the colors of this tentacle from the default.
+ */
+ brightness = 0.6 + frand(3.0);
+ memcpy (t->tentacle_color, tc->tentacle_color, 4 * sizeof(*t->tentacle_color));
+ memcpy (t->stripe_color, tc->stripe_color, 4 * sizeof(*t->stripe_color));
+ memcpy (t->sucker_color, tc->sucker_color, 4 * sizeof(*t->sucker_color));
+# define FROB(X) \
+ t->X[0] *= brightness; if (t->X[0] > 1) t->X[0] = 1; \
+ t->X[1] *= brightness; if (t->X[1] > 1) t->X[1] = 1; \
+ t->X[2] *= brightness; if (t->X[2] > 1) t->X[2] = 1
+ FROB (tentacle_color);
+ FROB (stripe_color);
+ FROB (sucker_color);
+# undef FROB
+
+ t->nsegments = (arg_segments) + BELLRAND(arg_segments);
+
+ t->segments = (segment *) calloc (t->nsegments+1, sizeof(*t->segments));
+ for (i = 0; i < t->nsegments; i++)
+ {
+ double spin_speed = 0;
+ double spin_accel = 0;
+ double wander_speed = arg_speed * (0.02 + BELLRAND(0.1));
+ t->segments[i].rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel, wander_speed, True);
+ }
+
+ t->segments[0].thickness = (((arg_thickness * 0.5) +
+ BELLRAND(arg_thickness * 0.6))
+ / 1.0);
+
+ if (tc->tentacles_size <= tc->ntentacles)
+ {
+ tc->tentacles_size = (tc->tentacles_size * 1.2) + tc->ntentacles + 2;
+ tc->tentacles = (tentacle **)
+ realloc (tc->tentacles, tc->tentacles_size * sizeof(*tc->tentacles));
+ if (! tc->tentacles)
+ {
+ fprintf (stderr, "%s: out of memory (%d tentacles)\n",
+ progname, tc->tentacles_size);
+ exit (1);
+ }
+ }
+
+ tc->tentacles[tc->ntentacles++] = t;
+ return t;
+}
+
+
+static void
+draw_sucker (tentacle *t, Bool front_p)
+{
+ tentacles_configuration *tc = &tcs[MI_SCREEN(t->mi)];
+ Bool wire = MI_IS_WIREFRAME (t->mi);
+ int i, j;
+ int strips = tc->torus_polys / tc->torus_step;
+ int points = 0;
+
+ glFrontFace (front_p ? GL_CW : GL_CCW);
+ for (i = 0; i < strips; i++)
+ {
+ int ii = i * tc->torus_step;
+
+ /* Leave off the polygons on the underside. This reduces polygon
+ count by about 10% with the default settings. */
+ if (strips > 4 && i >= strips/2 && i < strips-1)
+ continue;
+
+ glBegin (wire ? GL_LINE_STRIP : GL_QUAD_STRIP);
+ for (j = 0; j < tc->torus_step; j++)
+ {
+ XYZ sp = tc->torus_points[ii+j];
+ XYZ sn = tc->torus_normals[ii+j];
+ glNormal3f(sn.x, sn.y, sn.z);
+ glVertex3f(sp.x, sp.y, sp.z);
+ points++;
+ }
+ glEnd();
+ }
+ t->mi->polygon_count += points/2;
+}
+
+static void
+draw_tentacle_1 (tentacle *t, Bool front_p, Bool outline_p)
+{
+ tentacles_configuration *tc = &tcs[MI_SCREEN(t->mi)];
+ int i;
+ Bool wire = MI_IS_WIREFRAME (t->mi);
+ XYZ ctr = { 0,0,0 }; /* current position of base of segment */
+ double cth = 0; /* overall orientation of current segment */
+ double cphi = 0;
+ double cth_cos = 1, cth_sin = 0;
+ double cphi_cos = 1, cphi_sin = 0;
+
+ GLfloat light[3]; /* vector to the light */
+
+ GLfloat t0 = 0.0; /* texture coordinate */
+
+ XYZ *ring, *oring; /* points around the edge (this, and previous) */
+ XYZ *norm, *onorm; /* their normals */
+ XYZ *ucirc; /* unit circle, to save some trig */
+
+ /* Which portion of the radius the indented/colored stripe takes up */
+ int indented_points = arg_slices * 0.2;
+
+ /* We do rotation this way to minimize the number of calls to sin/cos.
+ We have to hack the transformations manually instead of using
+ glRotate/glTranslate because those calls are not allowed *inside*
+ of a glBegin/glEnd block...
+ */
+# define ROT(P) do { \
+ XYZ _p = P; \
+ _p.y = ((P.y * cth_sin - P.x * cth_cos)); \
+ _p.x = ((P.y * cth_cos + P.x * cth_sin) * cphi_sin - (P.z * cphi_cos)); \
+ _p.z = ((P.y * cth_cos + P.x * cth_sin) * cphi_cos + (P.z * cphi_sin)); \
+ P = _p; \
+ } while(0)
+
+ ring = (XYZ *) malloc (arg_slices * sizeof(*ring));
+ norm = (XYZ *) malloc (arg_slices * sizeof(*norm));
+ oring = (XYZ *) malloc (arg_slices * sizeof(*oring));
+ onorm = (XYZ *) malloc (arg_slices * sizeof(*onorm));
+ ucirc = (XYZ *) malloc (arg_slices * sizeof(*ucirc));
+
+ light[0] = light_pos[0];
+ light[1] = light_pos[1];
+ light[2] = light_pos[2];
+ normalize (&light[0], &light[1], &light[2]);
+
+ for (i = 0; i < arg_slices; i++)
+ {
+ double a = M_PI * 2 * i / arg_slices;
+ ucirc[i].x = cos(a);
+ ucirc[i].y = sin(a);
+ ucirc[i].z = 0;
+ }
+
+
+# ifdef HAVE_POLYGONMODE
+ if (cel_p)
+ glPolygonMode (GL_FRONT_AND_BACK, (front_p ? GL_FILL : GL_LINE));
+# endif
+
+ glPushMatrix();
+ glTranslatef (t->x, t->y, t->z);
+
+ if (debug_p)
+ {
+ glPushAttrib (GL_ENABLE_BIT);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_TEXTURE_1D);
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (1, 1, 1);
+ glLineWidth (1);
+ glBegin(GL_LINE_LOOP);
+ for (i = 0; i < arg_slices; i++)
+ glVertex3f (arg_thickness / 2 * cos (M_PI * 2 * i / arg_slices),
+ arg_thickness / 2 * sin (M_PI * 2 * i / arg_slices),
+ 0);
+ glEnd();
+ glPopAttrib();
+ }
+
+ if (!front_p || outline_p)
+ glColor4fv (tc->outline_color);
+ else if (wire)
+ glColor4fv (t->tentacle_color);
+ else
+ {
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ }
+
+ for (i = 0; i < t->nsegments; i++)
+ {
+ int j;
+ GLfloat t1 = t0 + i / (t->nsegments * M_PI * 2);
+
+ for (j = 0; j < arg_slices; j++)
+ {
+ /* Construct a vertical disc at the origin, to use as the
+ base of this segment.
+ */
+ double r = t->segments[i].thickness / 2;
+
+ if (j <= indented_points/2 || j >= arg_slices-indented_points/2)
+ r *= 0.75; /* indent the stripe */
+
+ if (outline_p)
+ r *= 1.1;
+
+ ring[j].x = r * ucirc[j].x;
+ ring[j].y = 0;
+ ring[j].z = r * ucirc[j].y;
+
+ /* Then rotate the points by the angle of the current segment. */
+ ROT(ring[j]);
+
+ /* Then move the ring to the base of this segment. */
+ ring[j].x += ctr.x;
+ ring[j].y += ctr.y;
+ ring[j].z += ctr.z;
+ }
+
+
+ /* Compute the normals of the faces on this segment. We do this
+ first so that the normals of the vertexes can be the average
+ of the normals of the faces.
+ #### Uh, except I didn't actually implement that...
+ but it would be a good idea.
+ */
+ if (i > 0)
+ for (j = 0; j <= arg_slices; j++)
+ {
+ int j0 = j % arg_slices;
+ int j1 = (j+1) % arg_slices;
+ norm[j0] = calc_normal (oring[j0], ring[j0], ring[j1]);
+ }
+
+ /* Draw!
+ */
+ if (i > 0)
+ {
+ int j;
+ glLineWidth (tc->line_thickness);
+ glFrontFace (front_p ? GL_CCW : GL_CW);
+ glBegin (wire ? GL_LINES : smooth_p ? GL_QUAD_STRIP : GL_QUADS);
+ for (j = 0; j <= arg_slices; j++)
+ {
+ int j0 = j % arg_slices;
+ int j1 = (j+1) % arg_slices;
+
+ GLfloat ts = j / (double) arg_slices;
+
+ if (!front_p || outline_p)
+ glColor4fv (tc->outline_color);
+ else if (j <= indented_points/2 ||
+ j >= arg_slices-indented_points/2)
+ {
+ glColor4fv (t->stripe_color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ t->stripe_color);
+ }
+ else
+ {
+ glColor4fv (t->tentacle_color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ t->tentacle_color);
+ }
+
+ /* For cel shading, the 1d texture coordinate (s) is the
+ dot product of the lighting vector and the vertex normal.
+ */
+ if (cel_p)
+ {
+ t0 = dot (light[0], light[1], light[2],
+ onorm[j0].x, onorm[j0].y, onorm[j0].z);
+ t1 = dot (light[0], light[1], light[2],
+ norm[j0].x, norm[j0].y, norm[j0].z);
+ if (t0 < 0) t0 = 0;
+ if (t1 < 0) t1 = 0;
+ }
+
+ glTexCoord2f (t0, ts);
+ glNormal3f (onorm[j0].x, onorm[j0].y, onorm[j0].z);
+ glVertex3f (oring[j0].x, oring[j0].y, oring[j0].z);
+
+ glTexCoord2f (t1, ts);
+ glNormal3f ( norm[j0].x, norm[j0].y, norm[j0].z);
+ glVertex3f ( ring[j0].x, ring[j0].y, ring[j0].z);
+
+ if (!smooth_p)
+ {
+ ts = j1 / (double) arg_slices;
+ glTexCoord2f (t1, ts);
+ glVertex3f ( ring[j1].x, ring[j1].y, ring[j1].z);
+ glTexCoord2f (t0, ts);
+ glVertex3f (oring[j1].x, oring[j1].y, oring[j1].z);
+ }
+ t->mi->polygon_count++;
+ }
+ glEnd ();
+
+ if (wire)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (j = 0; j < arg_slices; j++)
+ glVertex3f (ring[j].x, ring[j].y, ring[j].z);
+ glEnd();
+ }
+
+ /* Now draw the suckers!
+ */
+ {
+ double seg_length = arg_length / t->nsegments;
+ double sucker_size = arg_thickness / 5;
+ double sucker_spacing = sucker_size * 1.3;
+ int nsuckers = seg_length / sucker_spacing;
+ double oth = cth - t->segments[i-1].th;
+ double ophi = cphi - t->segments[i-1].phi;
+ int k;
+
+ if (!wire)
+ glLineWidth (MAX (2, tc->line_thickness / 2.0));
+ glDisable (GL_TEXTURE_2D);
+
+ /* Sometimes we have N suckers on one segment;
+ sometimes we have one sucker every N segments. */
+ if (nsuckers == 0)
+ {
+ int segs_per_sucker =
+ (int) ((sucker_spacing / seg_length) + 0.5);
+ nsuckers = (i % segs_per_sucker) ? 0 : 1;
+ }
+
+ if (outline_p)
+ {
+ glColor4fv (tc->outline_color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ tc->outline_color);
+ }
+ else if (front_p)
+ {
+ glColor4fv (t->sucker_color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ t->sucker_color);
+ }
+
+ for (k = 0; k < nsuckers; k++)
+ {
+ double scale;
+ XYZ p0 = ring[0];
+ XYZ p1 = oring[0];
+ XYZ p;
+ p.x = p0.x + (p1.x - p0.x) * (k + 0.5) / nsuckers;
+ p.y = p0.y + (p1.y - p0.y) * (k + 0.5) / nsuckers;
+ p.z = p0.z + (p1.z - p0.z) * (k + 0.5) / nsuckers;
+
+ glPushMatrix();
+ glTranslatef (p.x, p.y, p.z);
+ glRotatef (ophi * 180 / M_PI, 0, 1, 0);
+ glRotatef (-oth * 180 / M_PI, 1, 0, 0);
+ glRotatef (90, 1, 0, 0);
+
+ { /* Not quite right: this is the slope of the outer edge
+ if the next segment was not tilted at all... If there
+ is any tilt, then the angle of this wall and the
+ opposite wall are very different.
+ */
+ double slope = ((t->segments[i-1].thickness -
+ t->segments[i].thickness) /
+ t->segments[i].length);
+ glRotatef (-45 * slope, 1, 0, 0);
+ }
+
+ scale = t->segments[i].thickness / arg_thickness;
+ scale *= 0.7 * sucker_size;
+
+ glScalef (scale, scale, scale * 4);
+
+ glTranslatef (0, 0, -0.1); /* embed */
+
+ if (outline_p)
+ {
+ scale = 1.1;
+ glScalef (scale, scale, scale);
+ }
+
+ glTranslatef (1, 0, 0); /* left */
+ draw_sucker (t, front_p);
+
+ glTranslatef (-2, 0, 0); /* right */
+ draw_sucker (t, front_p);
+
+ glPopMatrix();
+ }
+
+ if (texture_p) glEnable (GL_TEXTURE_2D);
+ }
+ }
+
+ /* Now draw the end caps.
+ */
+ glLineWidth (tc->line_thickness);
+ if (!outline_p && (i == 0 || i == t->nsegments-1))
+ {
+ int j;
+ GLfloat ctrz = ctr.z + ((i == 0 ? -1 : 1) *
+ t->segments[i].thickness / 4);
+ if (front_p)
+ {
+ glColor4fv (t->tentacle_color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ t->tentacle_color);
+ }
+ glFrontFace ((front_p ? i == 0 : i != 0) ? GL_CCW : GL_CW);
+ glBegin (wire ? GL_LINES : GL_TRIANGLE_FAN);
+ glNormal3f (0, 0, (i == 0 ? -1 : 1));
+ glTexCoord2f (t0 - 0.25, 0.5);
+ glVertex3f (ctr.x, ctr.y, ctrz);
+ for (j = 0; j <= arg_slices; j++)
+ {
+ int jj = j % arg_slices;
+ GLfloat ts = j / (double) arg_slices;
+ glTexCoord2f (t0, ts);
+ glNormal3f (norm[jj].x, norm[jj].y, norm[jj].z);
+ glVertex3f (ring[jj].x, ring[jj].y, ring[jj].z);
+ if (wire) glVertex3f (ctr.x, ctr.y, ctrz);
+ t->mi->polygon_count++;
+ }
+ glEnd();
+ }
+
+ /* Now move to the end of this segment in preparation for the next.
+ */
+ if (i != t->nsegments-1)
+ {
+ XYZ p;
+ p.x = 0;
+ p.y = t->segments[i].length;
+ p.z = 0;
+ ROT (p);
+ ctr.x += p.x;
+ ctr.y += p.y;
+ ctr.z += p.z;
+
+ /* Accumulate the current angle and rotation, to keep track of the
+ rotation of the upcoming segment.
+ */
+ cth += t->segments[i].th;
+ cphi += t->segments[i].phi;
+
+ cth_sin = sin (cth);
+ cth_cos = cos (cth);
+ cphi_sin = sin (cphi);
+ cphi_cos = cos (cphi);
+
+ memcpy (oring, ring, arg_slices * sizeof(*ring));
+ memcpy (onorm, norm, arg_slices * sizeof(*norm));
+ }
+
+ t0 = t1;
+ }
+
+ glPopMatrix();
+
+ free (ring);
+ free (norm);
+ free (oring);
+ free (onorm);
+ free (ucirc);
+}
+
+
+static void
+draw_tentacle (tentacle *t, Bool front_p)
+{
+# ifndef HAVE_POLYGONMODE
+ Bool wire = MI_IS_WIREFRAME (t->mi);
+ if (!wire && cel_p && front_p)
+ {
+ draw_tentacle_1 (t, front_p, True);
+ glClear (GL_DEPTH_BUFFER_BIT);
+ }
+# endif /* HAVE_POLYGONMODE */
+
+ draw_tentacle_1 (t, front_p, False);
+}
+
+
+static void
+move_tentacle (tentacle *t)
+{
+ /* tentacles_configuration *tc = &tcs[MI_SCREEN(t->mi)]; */
+ GLfloat len = 0;
+ double pos = 0;
+ int i, j;
+ int skip = t->nsegments * (1 - (arg_wiggliness + 0.5));
+ int tick = 0;
+ int last = 0;
+
+ for (i = 0; i < t->nsegments; i++)
+ {
+ if (++tick >= skip || i == t->nsegments-1)
+ {
+ /* randomize the motion of this segment... */
+ double x, y, z;
+ double phi_range = M_PI * 0.8 * arg_flexibility;
+ double th_range = M_PI * 0.9 * arg_flexibility;
+ get_position (t->segments[i].rot, &x, &y, &z, True);
+ t->segments[i].phi = phi_range * (0.5 - y);
+ t->segments[i].th = th_range * (0.5 - z);
+ t->segments[i].length = ((0.8 + ((0.5 - x) * 0.4)) *
+ (arg_length / t->nsegments));
+
+ /* ...and make the previous N segments be interpolated
+ between this one and the previous randomized one. */
+ for (j = last+1; j <= i; j++)
+ {
+ t->segments[j].phi = (t->segments[i].phi / (i - last));
+ t->segments[j].th = (t->segments[i].th / (i - last));
+ t->segments[j].length = (t->segments[i].length);
+ }
+
+ tick = 0;
+ last = i;
+ }
+ len += t->segments[i].length;
+ }
+
+ /* thickness of segment is relative to current position on tentacle
+ (not just the index of the segment). */
+ for (i = 0; i < t->nsegments; i++)
+ {
+ if (i > 0)
+ {
+ double tt = (t->segments[0].thickness * (len - pos) / len);
+ if (tt < 0.001) tt = 0.001;
+ t->segments[i].thickness = tt;
+ }
+ pos += t->segments[i].length;
+ }
+}
+
+
+
+ENTRYPOINT Bool
+tentacles_handle_event (ModeInfo *mi, XEvent *event)
+{
+ tentacles_configuration *tc = &tcs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, tc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &tc->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ')
+ {
+ gltrackball_reset (tc->trackball, 0, 0);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+ a[3] = 1.0; /* alpha */
+
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+}
+
+
+ENTRYPOINT void
+init_tentacles (ModeInfo *mi)
+{
+ tentacles_configuration *tc;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, tcs);
+
+ tc = &tcs[MI_SCREEN(mi)];
+
+ tc->glx_context = init_GL(mi);
+
+ reshape_tentacles (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+ glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ if (!wire && !cel_p)
+ {
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ }
+
+ tc->trackball = gltrackball_init (False);
+
+ tc->left_p = !(random() % 5);
+
+ if (arg_segments < 2) arg_segments = 2;
+ if (arg_slices < 3) arg_slices = 3;
+ if (arg_thickness < 0.1) arg_thickness = 0.1;
+ if (arg_wiggliness < 0) arg_wiggliness = 0;
+ if (arg_wiggliness > 1) arg_wiggliness = 1;
+ if (arg_flexibility < 0) arg_flexibility = 0;
+ if (arg_flexibility > 1) arg_flexibility = 1;
+
+ parse_color (mi, "tentacleColor", arg_color, tc->tentacle_color);
+ parse_color (mi, "stripeColor", arg_stripe, tc->stripe_color);
+ parse_color (mi, "suckerColor", arg_sucker, tc->sucker_color);
+
+ /* Black outlines for light colors, white outlines for dark colors. */
+ if (tc->tentacle_color[0] + tc->tentacle_color[1] + tc->tentacle_color[2]
+ < 0.4)
+ tc->outline_color[0] = 1;
+ tc->outline_color[1] = tc->outline_color[0];
+ tc->outline_color[2] = tc->outline_color[0];
+ tc->outline_color[3] = 1;
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ move_tentacle (make_tentacle (mi, i, MI_COUNT(mi)));
+
+ if (wire) texture_p = cel_p = False;
+ if (cel_p) texture_p = False;
+
+ if (texture_p || cel_p) {
+ glGenTextures(1, &tc->texid);
+# ifdef HAVE_GLBINDTEXTURE
+ glBindTexture ((cel_p ? GL_TEXTURE_1D : GL_TEXTURE_2D), tc->texid);
+# endif
+
+ if (cel_p)
+ {
+ /* "16 1 3 1",
+ "X c #808080",
+ "x c #C0C0C0",
+ ". c #FFFFFF",
+ "XXXxxxxx........"
+ */
+ int w = 16;
+ tc->texture = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi),
+ 32, ZPixmap, 0, 0, w, 1, 32, 0);
+ tc->texture->data = (char *) calloc(1, tc->texture->bytes_per_line);
+ /* ABGR */
+ for (i = 0; i < 3; i++) XPutPixel (tc->texture, i, 0, 0xFF808080);
+ for (; i < 8; i++) XPutPixel (tc->texture, i, 0, 0xFFC0C0C0);
+ for (; i < w; i++) XPutPixel (tc->texture, i, 0, 0xFFFFFFFF);
+ }
+ else
+ tc->texture = image_data_to_ximage (MI_DISPLAY(mi), MI_VISUAL(mi),
+ scales_png, sizeof(scales_png));
+
+ if (!tc->texture) texture_p = cel_p = False;
+ }
+
+ if (texture_p) {
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ clear_gl_error();
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ tc->texture->width, tc->texture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tc->texture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glEnable(GL_TEXTURE_2D);
+ } else if (cel_p) {
+ clear_gl_error();
+ glTexImage1D (GL_TEXTURE_1D, 0, GL_RGBA,
+ tc->texture->width, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tc->texture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glEnable(GL_TEXTURE_1D);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glEnable (GL_LINE_SMOOTH);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+
+ /* Dark gray instead of black, so the outlines show up */
+ glClearColor (0.13, 0.13, 0.13, 1.0);
+ }
+
+ compute_unit_torus (mi, 0.5,
+ MAX(5, arg_slices/6),
+ MAX(9, arg_slices/3));
+}
+
+
+ENTRYPOINT void
+draw_tentacles (ModeInfo *mi)
+{
+ tentacles_configuration *tc = &tcs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!tc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(tc->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+# if 1
+ glScalef (3, 3, 3);
+# else
+ glPushAttrib (GL_ENABLE_BIT);
+ glPushMatrix();
+ { GLfloat s = 8.7/1600; glScalef(s,s,s); }
+ glTranslatef(-800,-514,0);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_1D);
+ glDisable(GL_TEXTURE_2D);
+ glColor3f (1, 1, 1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0,0,0);
+ glVertex3f(0,1028,0);
+ glVertex3f(1600,1028,0);
+ glVertex3f(1600,0,0);
+ glEnd();
+ glPopMatrix();
+ glPopAttrib();
+# endif
+
+ gltrackball_rotate (tc->trackball);
+
+ mi->polygon_count = 0;
+
+ if (debug_p)
+ {
+ glPushAttrib (GL_ENABLE_BIT);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_TEXTURE_1D);
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (1, 1, 1);
+ glLineWidth (1);
+ glBegin(GL_LINES);
+ glVertex3f(-0.5, 0, 0); glVertex3f(0.5, 0, 0);
+ glVertex3f(0, -0.5, 0); glVertex3f(0, 0.5, 0);
+ glEnd();
+ glPopAttrib();
+ }
+ else
+ {
+ GLfloat rx = 45;
+ GLfloat ry = -45;
+ GLfloat rz = 70;
+ if (tc->left_p)
+ ry = -ry, rz = -rz;
+ glRotatef (ry, 0, 1, 0);
+ glRotatef (rx, 1, 0, 0);
+ glRotatef (rz, 0, 0, 1);
+ if (intersect_p)
+ glTranslatef (0, -2.0, -4.5);
+ else
+ glTranslatef (0, -2.5, -5.0);
+ }
+
+ if (!tc->button_down_p)
+ for (i = 0; i < tc->ntentacles; i++)
+ move_tentacle (tc->tentacles[i]);
+
+#if 1
+ for (i = 0; i < tc->ntentacles; i++)
+ {
+ if (! intersect_p)
+ glClear(GL_DEPTH_BUFFER_BIT);
+ draw_tentacle (tc->tentacles[i], True);
+ if (cel_p)
+ draw_tentacle (tc->tentacles[i], False);
+ }
+#else
+ glScalef (3, 3, 3);
+ glScalef (1, 1, 4);
+ glColor3f(1,1,1);
+ glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
+ draw_sucker (tc->tentacles[0], True);
+ if (cel_p)
+ {
+ glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
+ glLineWidth (tc->line_thickness);
+ glColor4fv (tc->outline_color);
+ draw_sucker (tc->tentacles[0], False);
+ }
+#endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("SkyTentacles", skytentacles, tentacles)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/skytentacles.man b/hacks/glx/skytentacles.man
new file mode 100644
index 0000000..2e5cd16
--- /dev/null
+++ b/hacks/glx/skytentacles.man
@@ -0,0 +1,102 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+skytentacles - 3D tentacles from the sky!
+.SH SYNOPSIS
+.B skytentacles
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIint\fP]
+[\-speed \fIratio\fP]
+[\-count \fIint\fP]
+[\-slices \fIint\fP]
+[\-length \fIfloat\fP]
+[\-wiggliness \fIratio\fP]
+[\-flexibility \fIratio\fP]
+[\-color \fIcolor\fP]
+[\-stripe\-color \fIcolor\fP]
+[\-sucker\-color \fIcolor\fP]
+[\-segments \fIint\fP]
+[\-thickness \fIratio\fP]
+[\-no\-smooth]
+[\-fps]
+.SH DESCRIPTION
+There is a tentacled abomination in the sky. From above you it devours.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fIint\fP
+Delay between frames, in microseconds. Default 30000.
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-count \fIint\fP
+How many tentacles. Default 8.
+.TP 8
+.B \-thickness \fIratio\fP
+Less than 1 for thinner tentacles, greater than 1 for thicker. Default 1.
+.TP 8
+.B \-length \fIratio\fP
+Length of the tentacles. Default 9.
+.TP 8
+.B \-wiggliness \fIratio\fP
+A measure of how bendy the tentacles are. Smaller numbers result in
+smoother flexing; larger numbers make it "crinkly". Default 0.35.
+.TP 8
+.B \-flexibility \fIratio\fP
+Another measure of how bendy the tentacles are. Smaller numbers
+result in straighter tentacles; larger numbers result in more extreme
+curves. Default 0.35.
+.TP 8
+.B \-color \fIcolor\fP
+.TP 8
+.B \-stripe\-color \fIcolor\fP
+.TP 8
+.B \-sucker\-color \fIcolor\fP
+The colors of the various parts of the tentacle. Default green
+with a redish stripe.
+.TP 8
+.B \-slices \fIint\fP
+.TP 8
+.B \-segments \fIint\fP
+Larger numbers increase number of polygons in the object mesh.
+Default 32.
+.TP 8
+.B \-no\-smooth
+Make the tentacles appear faceted instead of smooth.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2008 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/sonar-icmp.c b/hacks/glx/sonar-icmp.c
new file mode 100644
index 0000000..3464c37
--- /dev/null
+++ b/hacks/glx/sonar-icmp.c
@@ -0,0 +1,1703 @@
+/* sonar, Copyright (c) 1998-2018 Jamie Zawinski and Stephen Martin
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This implements the "ping" sensor for sonar.
+ */
+
+#include "screenhackI.h"
+#include "sonar.h"
+#include "version.h"
+#include "async_netdb.h"
+
+#undef usleep /* conflicts with unistd.h on OSX */
+
+#ifdef USE_IPHONE
+ /* Note: to get this to compile for iPhone, you need to fix Xcode!
+ The icmp headers exist for the simulator build environment, but
+ not for the real-device build environment. This appears to
+ just be an Apple bug, not intentional.
+
+ xc=/Applications/Xcode.app/Contents
+ for path in /Developer/Platforms/iPhone*?/Developer/SDKs/?* \
+ $xc/Developer/Platforms/iPhone*?/Developer/SDKs/?* ; do
+ for file in \
+ /usr/include/netinet/ip.h \
+ /usr/include/netinet/in_systm.h \
+ /usr/include/netinet/ip_icmp.h \
+ /usr/include/netinet/ip_var.h \
+ /usr/include/netinet/udp.h
+ do
+ ln -s "$file" "$path$file"
+ done
+ done
+ */
+#endif
+
+#ifndef HAVE_MOBILE
+# define READ_FILES
+#endif
+
+#if defined(HAVE_ICMP) || defined(HAVE_ICMPHDR)
+# include <unistd.h>
+# include <sys/stat.h>
+# include <limits.h>
+# include <signal.h>
+# include <fcntl.h>
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/ipc.h>
+# ifndef HAVE_ANDROID
+# include <sys/shm.h>
+# endif
+# include <sys/socket.h>
+# include <netinet/in_systm.h>
+# include <netinet/in.h>
+# include <netinet/ip.h>
+# include <netinet/ip_icmp.h>
+# include <netinet/udp.h>
+# include <arpa/inet.h>
+# include <netdb.h>
+# include <errno.h>
+# ifdef HAVE_GETIFADDRS
+# include <ifaddrs.h>
+# endif
+#endif /* HAVE_ICMP || HAVE_ICMPHDR */
+
+#if defined(HAVE_ICMP)
+# define HAVE_PING
+# define ICMP icmp
+# define ICMP_TYPE(p) (p)->icmp_type
+# define ICMP_CODE(p) (p)->icmp_code
+# define ICMP_CHECKSUM(p) (p)->icmp_cksum
+# define ICMP_ID(p) (p)->icmp_id
+# define ICMP_SEQ(p) (p)->icmp_seq
+#elif defined(HAVE_ICMPHDR)
+# define HAVE_PING
+# define ICMP icmphdr
+# define ICMP_TYPE(p) (p)->type
+# define ICMP_CODE(p) (p)->code
+# define ICMP_CHECKSUM(p) (p)->checksum
+# define ICMP_ID(p) (p)->un.echo.id
+# define ICMP_SEQ(p) (p)->un.echo.sequence
+#else
+# undef HAVE_PING
+#endif
+
+#ifndef HAVE_MOBILE
+# define LOAD_FILES
+#endif
+
+#ifndef HAVE_PING
+
+sonar_sensor_data *
+sonar_init_ping (Display *dpy, char **error_ret, char **desc_ret,
+ const char *subnet, int timeout,
+ Bool resolve_p, Bool times_p, Bool debug_p)
+{
+ if (! (!subnet || !*subnet || !strcmp(subnet, "default")))
+ fprintf (stderr, "%s: not compiled with support for pinging hosts.\n",
+ progname);
+ return 0;
+}
+
+#else /* HAVE_PING -- whole file */
+
+
+#if defined(__DECC) || defined(_IP_VHL)
+ /* This is how you do it on DEC C, and possibly some BSD systems. */
+# define IP_HDRLEN(ip) ((ip)->ip_vhl & 0x0F)
+#else
+ /* This is how you do it on everything else. */
+# define IP_HDRLEN(ip) ((ip)->ip_hl)
+#endif
+
+/* yes, there is only one, even when multiple savers are running in the
+ same address space - since we can only open this socket before dropping
+ privs.
+ */
+static int global_icmpsock = 0;
+
+/* Set by a signal handler. */
+static int timer_expired;
+
+
+
+static u_short checksum(u_short *, int);
+static long delta(struct timeval *, struct timeval *);
+
+
+typedef struct {
+ Display *dpy; /* Only used to get *useThreads. */
+
+ char *version; /* short version number of xscreensaver */
+ int icmpsock; /* socket for sending pings */
+ int pid; /* our process ID */
+ int seq; /* packet sequence number */
+ int timeout; /* packet timeout */
+
+ int target_count;
+ sonar_bogie *targets; /* the hosts we will ping;
+ those that pong end up on ssd->pending. */
+ sonar_bogie *last_pinged; /* pointer into 'targets' list */
+ double last_ping_time;
+
+ Bool resolve_p;
+ Bool times_p;
+ Bool debug_p;
+
+} ping_data;
+
+typedef struct {
+ async_name_from_addr_t lookup_name;
+ async_addr_from_name_t lookup_addr;
+ async_netdb_sockaddr_storage_t address; /* ip address */
+ socklen_t addrlen;
+ char *fallback;
+} ping_bogie;
+
+
+
+/* Packs an IP address quad into bigendian network order. */
+static in_addr_t
+pack_addr (unsigned int a, unsigned int b, unsigned int c, unsigned int d)
+{
+ unsigned long i = (((a & 255) << 24) |
+ ((b & 255) << 16) |
+ ((c & 255) << 8) |
+ ((d & 255) ));
+ return htonl (i);
+}
+
+/* Unpacks an IP address quad from bigendian network order. */
+static void
+unpack_addr (unsigned long addr,
+ unsigned int *a, unsigned int *b,
+ unsigned int *c, unsigned int *d)
+{
+ addr = ntohl (addr);
+ *a = (addr >> 24) & 255;
+ *b = (addr >> 16) & 255;
+ *c = (addr >> 8) & 255;
+ *d = (addr ) & 255;
+}
+
+
+
+
+/* Resolves the bogie's name (either a hostname or ip address string)
+ to a hostent. Returns 1 if successful, 0 if something went wrong.
+ */
+static int
+resolve_bogie_hostname (ping_data *pd, sonar_bogie *sb, Bool resolve_p)
+{
+ ping_bogie *pb = (ping_bogie *) sb->closure;
+
+ unsigned int ip[4];
+ char c;
+
+ if (4 == sscanf (sb->name, " %u.%u.%u.%u %c",
+ &ip[0], &ip[1], &ip[2], &ip[3], &c))
+ {
+ /* It's an IP address.
+ */
+ struct sockaddr_in *iaddr = (struct sockaddr_in *) &(pb->address);
+
+ if (ip[3] == 0)
+ {
+ if (pd->debug_p > 1)
+ fprintf (stderr, "%s: ignoring bogus IP %s\n",
+ progname, sb->name);
+ return 0;
+ }
+
+ iaddr->sin_family = AF_INET;
+ iaddr->sin_addr.s_addr = pack_addr (ip[0], ip[1], ip[2], ip[3]);
+ pb->addrlen = sizeof(struct sockaddr_in);
+
+ if (resolve_p)
+ {
+ pb->lookup_name =
+ async_name_from_addr_start (pd->dpy,
+ (const struct sockaddr *)&pb->address,
+ pb->addrlen);
+ if (!pb->lookup_name)
+ {
+ fprintf (stderr, "%s: unable to start host resolution.\n",
+ progname);
+ }
+ }
+ }
+ else
+ {
+ /* It's a host name. */
+
+ /* don't waste time being confused by non-hostname tokens
+ in .ssh/known_hosts */
+ if (!strcmp (sb->name, "ssh-rsa") ||
+ !strcmp (sb->name, "ssh-dsa") ||
+ !strcmp (sb->name, "ssh-dss") ||
+ !strncmp (sb->name, "ecdsa-", 6) ||
+ strlen (sb->name) >= 80)
+ return 0;
+
+ /* .ssh/known_hosts sometimes contains weirdness like "[host]:port".
+ Ignore it. */
+ if (strchr (sb->name, '['))
+ {
+ if (pd->debug_p)
+ fprintf (stderr, "%s: ignoring bogus address \"%s\"\n",
+ progname, sb->name);
+ return 0;
+ }
+
+ /* If the name contains a colon, it's probably IPv6. */
+ if (strchr (sb->name, ':'))
+ {
+ if (pd->debug_p)
+ fprintf (stderr, "%s: ignoring ipv6 address \"%s\"\n",
+ progname, sb->name);
+ return 0;
+ }
+
+ pb->lookup_addr = async_addr_from_name_start(pd->dpy, sb->name);
+ if (!pb->lookup_addr)
+ {
+ if (pd->debug_p)
+ /* Either address space exhaustion or RAM exhaustion. */
+ fprintf (stderr, "%s: unable to start host resolution.\n",
+ progname);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+
+static void
+print_address (FILE *out, int width, const void *sockaddr, socklen_t addrlen)
+{
+#ifdef HAVE_GETADDRINFO
+ char buf[NI_MAXHOST];
+#else
+ char buf[50];
+#endif
+
+ const struct sockaddr *addr = (const struct sockaddr *)sockaddr;
+ const char *ips = buf;
+
+ if (!addr->sa_family)
+ ips = "<no address>";
+ else
+ {
+#ifdef HAVE_GETADDRINFO
+ int gai_error = getnameinfo (sockaddr, addrlen, buf, sizeof(buf),
+ NULL, 0, NI_NUMERICHOST);
+ if (gai_error == EAI_SYSTEM)
+ ips = strerror(errno);
+ else if (gai_error)
+ ips = gai_strerror(gai_error);
+#else
+ switch (addr->sa_family)
+ {
+ case AF_INET:
+ {
+ u_long ip = ((struct sockaddr_in *)sockaddr)->sin_addr.s_addr;
+ unsigned int a, b, c, d;
+ unpack_addr (ip, &a, &b, &c, &d); /* ip is in network order */
+ sprintf (buf, "%u.%u.%u.%u", a, b, c, d);
+ }
+ break;
+ default:
+ ips = "<unknown>";
+ break;
+ }
+#endif
+ }
+
+ fprintf (out, "%-*s", width, ips);
+}
+
+
+static void
+print_host (FILE *out, const sonar_bogie *sb)
+{
+ const ping_bogie *pb = (const ping_bogie *) sb->closure;
+ const char *name = sb->name;
+ if (!name || !*name) name = "<unknown>";
+ print_address (out, 16, &pb->address, pb->addrlen);
+ fprintf (out, " %s\n", name);
+}
+
+
+static Bool
+is_address_ok(Bool debug_p, const sonar_bogie *b)
+{
+ const ping_bogie *pb = (const ping_bogie *) b->closure;
+ const struct sockaddr *addr = (const struct sockaddr *)&pb->address;
+
+ switch (addr->sa_family)
+ {
+ case AF_INET:
+ {
+ struct sockaddr_in *iaddr = (struct sockaddr_in *) addr;
+
+ /* Don't ever use loopback (127.0.0.x) hosts */
+ unsigned long ip = iaddr->sin_addr.s_addr;
+ if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L) /* 127.0.0.x */
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: ignoring loopback host %s\n",
+ progname, b->name);
+ return False;
+ }
+
+ /* Don't ever use broadcast (255.x.x.x) hosts */
+ if ((ntohl (ip) & 0xFF000000L) == 0xFF000000L) /* 255.x.x.x */
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: ignoring broadcast host %s\n",
+ progname, b->name);
+ return False;
+ }
+ }
+
+ break;
+ }
+
+ return True;
+}
+
+
+/* Create a sonar_bogie from a host name or ip address string.
+ Returns NULL if the name could not be resolved.
+ */
+static sonar_bogie *
+bogie_for_host (sonar_sensor_data *ssd, const char *name, const char *fallback)
+{
+ ping_data *pd = (ping_data *) ssd->closure;
+ sonar_bogie *b = (sonar_bogie *) calloc (1, sizeof(*b));
+ ping_bogie *pb = (ping_bogie *) calloc (1, sizeof(*pb));
+ Bool resolve_p = pd->resolve_p;
+
+ b->name = strdup (name);
+ b->closure = pb;
+
+ if (! resolve_bogie_hostname (pd, b, resolve_p))
+ goto FAIL;
+
+ if (! pb->lookup_addr && ! is_address_ok (pd->debug_p, b))
+ goto FAIL;
+
+ if (pd->debug_p > 1)
+ {
+ fprintf (stderr, "%s: added ", progname);
+ print_host (stderr, b);
+ }
+
+ if (fallback)
+ pb->fallback = strdup (fallback);
+ return b;
+
+ FAIL:
+ if (b) sonar_free_bogie (ssd, b);
+
+ if (fallback)
+ return bogie_for_host (ssd, fallback, NULL);
+
+ return 0;
+}
+
+
+#ifdef READ_FILES
+
+/* Return a list of bogies read from a file.
+ The file can be like /etc/hosts or .ssh/known_hosts or probably
+ just about anything that has host names in it.
+ */
+static sonar_bogie *
+read_hosts_file (sonar_sensor_data *ssd, const char *filename)
+{
+ ping_data *pd = (ping_data *) ssd->closure;
+ FILE *fp;
+ char buf[LINE_MAX];
+ char *p;
+ sonar_bogie *list = 0;
+ char *addr, *name;
+ sonar_bogie *new;
+
+ /* Kludge: on OSX, variables have not been expanded in the command
+ line arguments, so as a special case, allow the string to begin
+ with literal "$HOME/" or "~/".
+
+ This is so that the "Known Hosts" menu item in sonar.xml works.
+ */
+ if (!strncmp(filename, "~/", 2) || !strncmp(filename, "$HOME/", 6))
+ {
+ char *s = strchr (filename, '/');
+ strcpy (buf, getenv("HOME"));
+ strcat (buf, s);
+ filename = buf;
+ }
+
+ fp = fopen(filename, "r");
+ if (!fp)
+ {
+ char buf2[1024];
+ sprintf(buf2, "%s: %s", progname, filename);
+#ifdef HAVE_JWXYZ
+ if (pd->debug_p) /* on OSX don't syslog this */
+#endif
+ perror (buf2);
+ return 0;
+ }
+
+ if (pd->debug_p)
+ fprintf (stderr, "%s: reading \"%s\"\n", progname, filename);
+
+ while ((p = fgets(buf, LINE_MAX, fp)))
+ {
+ while ((*p == ' ') || (*p == '\t')) /* skip whitespace */
+ p++;
+ if (*p == '#') /* skip comments */
+ continue;
+
+ /* Get the name and address */
+
+ if ((addr = strtok(buf, " ,;\t\n")))
+ name = strtok(0, " ,;\t\n");
+ else
+ continue;
+
+ /* Check to see if the addr looks like an addr. If not, assume
+ the addr is a name and there is no addr. This way, we can
+ handle files whose lines have "xx.xx.xx.xx hostname" as their
+ first two tokens, and also files that have a hostname as their
+ first token (like .ssh/known_hosts and .rhosts.)
+ */
+ {
+ int i; char c;
+ if (4 != sscanf(addr, "%d.%d.%d.%d%c", &i, &i, &i, &i, &c))
+ {
+ name = addr;
+ addr = 0;
+ }
+ }
+
+ /* If the name is all digits, it's not a name. */
+ if (name)
+ {
+ const char *s;
+ for (s = name; *s; s++)
+ if (*s < '0' || *s > '9')
+ break;
+ if (! *s)
+ {
+ if (pd->debug_p > 1)
+ fprintf (stderr, "%s: skipping bogus name \"%s\" (%s)\n",
+ progname, name, addr);
+ name = 0;
+ }
+ }
+
+ /* Create a new target using first the name then the address */
+
+ if (!name)
+ {
+ name = addr;
+ addr = NULL;
+ }
+
+ new = bogie_for_host (ssd, name, addr);
+
+ if (new)
+ {
+ new->next = list;
+ list = new;
+ }
+ }
+
+ fclose(fp);
+ return list;
+}
+#endif /* READ_FILES */
+
+
+static sonar_bogie **
+found_duplicate_host (const ping_data *pd, sonar_bogie **list,
+ sonar_bogie *bogie)
+{
+ if (pd->debug_p)
+ {
+ fprintf (stderr, "%s: deleted duplicate: ", progname);
+ print_host (stderr, bogie);
+ }
+
+ return list;
+}
+
+
+static sonar_bogie **
+find_duplicate_host (const ping_data *pd, sonar_bogie **list,
+ sonar_bogie *bogie)
+{
+ const ping_bogie *pb = (const ping_bogie *) bogie->closure;
+ const struct sockaddr *addr1 = (const struct sockaddr *) &(pb->address);
+
+ while(*list)
+ {
+ const ping_bogie *pb2 = (const ping_bogie *) (*list)->closure;
+
+ if (!pb2->lookup_addr)
+ {
+ const struct sockaddr *addr2 =
+ (const struct sockaddr *) &(pb2->address);
+
+ if (addr1->sa_family == addr2->sa_family)
+ {
+ switch (addr1->sa_family)
+ {
+ case AF_INET:
+ {
+ unsigned long ip1 =
+ ((const struct sockaddr_in *)addr1)->sin_addr.s_addr;
+ const struct sockaddr_in *i2 =
+ (const struct sockaddr_in *)addr2;
+ unsigned long ip2 = i2->sin_addr.s_addr;
+
+ if (ip1 == ip2)
+ return found_duplicate_host (pd, list, bogie);
+ }
+ break;
+#ifdef AF_INET6
+ case AF_INET6:
+ {
+ if (! memcmp(
+ &((const struct sockaddr_in6 *)addr1)->sin6_addr,
+ &((const struct sockaddr_in6 *)addr2)->sin6_addr,
+ 16))
+ return found_duplicate_host (pd, list, bogie);
+ }
+ break;
+#endif
+ default:
+ {
+ /* Fallback behavior: Just memcmp the two addresses.
+
+ For this to work, unused space in the sockaddr must be
+ set to zero. Which may actually be the case:
+ - async_addr_from_name_finish won't put garbage into
+ sockaddr_in.sin_zero or elsewhere unless getaddrinfo
+ does.
+ - ping_bogie is allocated with calloc(). */
+
+ if (pb->addrlen == pb2->addrlen &&
+ ! memcmp(addr1, addr2, pb->addrlen))
+ return found_duplicate_host (pd, list, bogie);
+ }
+ break;
+ }
+ }
+ }
+
+ list = &(*list)->next;
+ }
+
+ return NULL;
+}
+
+
+static sonar_bogie *
+delete_duplicate_hosts (sonar_sensor_data *ssd, sonar_bogie *list)
+{
+ ping_data *pd = (ping_data *) ssd->closure;
+ sonar_bogie *head = list;
+ sonar_bogie *sb = head;
+
+ while (sb)
+ {
+ ping_bogie *pb = (ping_bogie *) sb->closure;
+
+ if (!pb->lookup_addr)
+ {
+ sonar_bogie **sb2 = find_duplicate_host (pd, &sb->next, sb);
+ if (sb2)
+ *sb2 = (*sb2)->next;
+ /* #### sb leaked */
+ else
+ sb = sb->next;
+ }
+ else
+ sb = sb->next;
+ }
+
+ return head;
+}
+
+
+static unsigned long
+width_mask (unsigned long width)
+{
+ unsigned long m = 0;
+ int i;
+ for (i = 0; i < width; i++)
+ m |= (1L << (31-i));
+ return m;
+}
+
+
+#ifdef HAVE_GETIFADDRS
+static unsigned int
+mask_width (unsigned long mask)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1 << i))
+ break;
+ return 32-i;
+}
+#endif
+
+
+/* Generate a list of bogies consisting of all of the entries on
+ the same subnet. 'base' ip is in network order; 0 means localhost.
+ */
+static sonar_bogie *
+subnet_hosts (sonar_sensor_data *ssd, char **error_ret, char **desc_ret,
+ unsigned long n_base, int subnet_width)
+{
+ ping_data *pd = (ping_data *) ssd->closure;
+ unsigned long h_mask; /* host order */
+ unsigned long h_base; /* host order */
+ char address[BUFSIZ];
+ char *p;
+ int i;
+ sonar_bogie *new;
+ sonar_bogie *list = 0;
+ char buf[1024];
+
+ if (subnet_width < 24)
+ {
+ sprintf (buf,
+ "Pinging %lu hosts is a bad\n"
+ "idea. Please use a subnet\n"
+ "mask of 24 bits or more.",
+ (unsigned long) (1L << (32 - subnet_width)) - 1);
+ *error_ret = strdup(buf);
+ return 0;
+ }
+ else if (subnet_width > 30)
+ {
+ sprintf (buf,
+ "An %d-bit subnet\n"
+ "doesn't make sense.\n"
+ "Try \"subnet/24\"\n"
+ "or \"subnet/29\".\n",
+ subnet_width);
+ *error_ret = strdup(buf);
+ return 0;
+ }
+
+
+ if (pd->debug_p)
+ fprintf (stderr, "%s: adding %d-bit subnet\n", progname, subnet_width);
+
+
+ if (! n_base)
+ {
+# ifdef HAVE_GETIFADDRS
+
+ /* To determine the local subnet, we need to know the local IP address.
+ Do this by looking at the IPs of every network interface.
+ */
+ struct in_addr in = { 0, };
+ struct ifaddrs *all = 0, *ifa;
+
+ if (pd->debug_p)
+ fprintf (stderr, "%s: listing network interfaces\n", progname);
+
+ getifaddrs (&all);
+ for (ifa = all; ifa; ifa = ifa->ifa_next)
+ {
+ struct in_addr in2;
+ unsigned long mask;
+ if (! ifa->ifa_addr)
+ continue;
+ else if (ifa->ifa_addr->sa_family != AF_INET)
+ {
+ if (pd->debug_p)
+ fprintf (stderr, "%s: if: %4s: %s\n", progname,
+ ifa->ifa_name,
+ (
+# ifdef AF_UNIX
+ ifa->ifa_addr->sa_family == AF_UNIX ? "local" :
+# endif
+# ifdef AF_LINK
+ ifa->ifa_addr->sa_family == AF_LINK ? "link" :
+# endif
+# ifdef AF_INET6
+ ifa->ifa_addr->sa_family == AF_INET6 ? "ipv6" :
+# endif
+ "other"));
+ continue;
+ }
+ in2 = ((struct sockaddr_in *) ifa->ifa_addr)->sin_addr;
+ mask = ntohl (((struct sockaddr_in *) ifa->ifa_netmask)
+ ->sin_addr.s_addr);
+ if (pd->debug_p)
+ fprintf (stderr, "%s: if: %4s: inet = %s /%d 0x%08lx\n",
+ progname,
+ ifa->ifa_name,
+ inet_ntoa (in2),
+ mask_width (mask),
+ mask);
+ if (in2.s_addr == 0x0100007f || /* 127.0.0.1 in network order */
+ mask == 0)
+ continue;
+
+ /* At least on the AT&T 3G network, pinging either of the two
+ hosts on a /31 network doesn't work, so don't try.
+ */
+ if (mask_width (mask) == 31)
+ {
+ sprintf (buf,
+ "Can't ping subnet:\n"
+ "local network is\n"
+ "%.100s/%d,\n"
+ "a p2p bridge\n"
+ "on if %.100s.",
+ inet_ntoa (in2), mask_width (mask), ifa->ifa_name);
+ if (*error_ret) free (*error_ret);
+ *error_ret = strdup (buf);
+ continue;
+ }
+
+ in = in2;
+ subnet_width = mask_width (mask);
+ }
+
+ if (in.s_addr)
+ {
+ if (*error_ret) free (*error_ret);
+ *error_ret = 0;
+ n_base = in.s_addr; /* already in network order, I think? */
+ }
+ else if (!*error_ret)
+ *error_ret = strdup ("Unable to determine\nlocal IP address\n");
+
+ if (all)
+ freeifaddrs (all);
+
+ if (*error_ret)
+ return 0;
+
+# else /* !HAVE_GETIFADDRS */
+
+ /* If we can't walk the list of network interfaces to figure out
+ our local IP address, try to do it by finding the local host
+ name, then resolving that.
+ */
+ char hostname[BUFSIZ];
+ struct hostent *hent = 0;
+
+ if (gethostname(hostname, BUFSIZ))
+ {
+ *error_ret = strdup ("Unable to determine\n"
+ "local host name!");
+ return 0;
+ }
+
+ /* Get our IP address and convert it to a string */
+
+ hent = gethostbyname(hostname);
+ if (! hent)
+ {
+ strcat (hostname, ".local"); /* Necessary on iphone */
+ hent = gethostbyname(hostname);
+ }
+
+ if (! hent)
+ {
+ sprintf(buf,
+ "Unable to resolve\n"
+ "local host \"%.100s\"",
+ hostname);
+ *error_ret = strdup(buf);
+ return 0;
+ }
+
+ strcpy (address, inet_ntoa(*((struct in_addr *)hent->h_addr_list[0])));
+ n_base = pack_addr (hent->h_addr_list[0][0],
+ hent->h_addr_list[0][1],
+ hent->h_addr_list[0][2],
+ hent->h_addr_list[0][3]);
+
+ if (n_base == 0x0100007f) /* 127.0.0.1 in network order */
+ {
+ unsigned int a, b, c, d;
+ unpack_addr (n_base, &a, &b, &c, &d);
+ sprintf (buf,
+ "Unable to determine\n"
+ "local subnet address:\n"
+ "\"%.100s\"\n"
+ "resolves to\n"
+ "loopback address\n"
+ "%u.%u.%u.%u.",
+ hostname, a, b, c, d);
+ *error_ret = strdup(buf);
+ return 0;
+ }
+
+# endif /* !HAVE_GETIFADDRS */
+ }
+
+
+ /* Construct targets for all addresses in this subnet */
+
+ h_mask = width_mask (subnet_width);
+ h_base = ntohl (n_base);
+
+ if (desc_ret && !*desc_ret) {
+ char buf2[255];
+ unsigned int a, b, c, d;
+ unsigned long bb = n_base & htonl(h_mask);
+ unpack_addr (bb, &a, &b, &c, &d);
+ if (subnet_width > 24)
+ sprintf (buf2, "%u.%u.%u.%u/%d", a, b, c, d, subnet_width);
+ else
+ sprintf (buf2, "%u.%u.%u/%d", a, b, c, subnet_width);
+ *desc_ret = strdup (buf2);
+ }
+
+ for (i = 255; i >= 0; i--) {
+ unsigned int a, b, c, d;
+ int ip = (h_base & 0xFFFFFF00L) | i; /* host order */
+
+ if ((ip & h_mask) != (h_base & h_mask)) /* skip out-of-subnet host */
+ continue;
+ else if (subnet_width == 31) /* 1-bit bridge: 2 hosts */
+ ;
+ else if ((ip & ~h_mask) == 0) /* skip network address */
+ continue;
+ else if ((ip & ~h_mask) == ~h_mask) /* skip broadcast address */
+ continue;
+
+ unpack_addr (htonl (ip), &a, &b, &c, &d);
+ sprintf (address, "%u.%u.%u.%u", a, b, c, d);
+
+ if (pd->debug_p > 1)
+ {
+ unsigned int aa, ab, ac, ad;
+ unsigned int ma, mb, mc, md;
+ unpack_addr (htonl (h_base & h_mask), &aa, &ab, &ac, &ad);
+ unpack_addr (htonl (h_mask), &ma, &mb, &mc, &md);
+ fprintf (stderr,
+ "%s: subnet: %s (%u.%u.%u.%u & %u.%u.%u.%u / %d)\n",
+ progname, address,
+ aa, ab, ac, ad,
+ ma, mb, mc, md,
+ subnet_width);
+ }
+
+ p = address + strlen(address) + 1;
+ sprintf(p, "%d", i);
+
+ new = bogie_for_host (ssd, address, NULL);
+ if (new)
+ {
+ new->next = list;
+ list = new;
+ }
+ }
+
+ return list;
+}
+
+
+/* Send a ping packet.
+ */
+static void
+send_ping (ping_data *pd, const sonar_bogie *b)
+{
+ ping_bogie *pb = (ping_bogie *) b->closure;
+ u_char *packet;
+ struct ICMP *icmph;
+ const char *token = "org.jwz.xscreensaver.sonar";
+ char *host_id;
+
+ unsigned long pcktsiz = (sizeof(struct ICMP) + sizeof(struct timeval) +
+ sizeof(socklen_t) + pb->addrlen +
+ strlen(token) + 1 +
+ strlen(pd->version) + 1);
+
+ /* Create the ICMP packet */
+
+ if (! (packet = (u_char *) calloc(1, pcktsiz)))
+ return; /* Out of memory */
+
+ icmph = (struct ICMP *) packet;
+ ICMP_TYPE(icmph) = ICMP_ECHO;
+ ICMP_CODE(icmph) = 0;
+ ICMP_CHECKSUM(icmph) = 0;
+ ICMP_ID(icmph) = pd->pid;
+ ICMP_SEQ(icmph) = pd->seq++;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ gettimeofday((struct timeval *) &packet[sizeof(struct ICMP)],
+ (struct timezone *) 0);
+# else
+ gettimeofday((struct timeval *) &packet[sizeof(struct ICMP)]);
+# endif
+
+ /* We store the sockaddr of the host we're pinging in the packet, and parse
+ that out of the return packet later (see get_ping() for why).
+ After that, we also include the name and version of this program,
+ just to give a clue to anyone sniffing and wondering what's up.
+ */
+ host_id = (char *) &packet[sizeof(struct ICMP) + sizeof(struct timeval)];
+ *(socklen_t *)host_id = pb->addrlen;
+ host_id += sizeof(socklen_t);
+ memcpy(host_id, &pb->address, pb->addrlen);
+ host_id += pb->addrlen;
+ sprintf (host_id, "%.20s %.20s", token, pd->version);
+
+ ICMP_CHECKSUM(icmph) = checksum((u_short *)packet, pcktsiz);
+
+ /* Send it */
+
+ if (sendto(pd->icmpsock, packet, pcktsiz, 0,
+ (struct sockaddr *)&pb->address, sizeof(pb->address))
+ != pcktsiz)
+ {
+#if 0
+ char buf[BUFSIZ];
+ sprintf(buf, "%s: pinging %.100s", progname, b->name);
+ perror(buf);
+#endif
+ }
+}
+
+/* signal handler */
+static void
+sigcatcher (int sig)
+{
+ timer_expired = 1;
+}
+
+
+/* Compute the checksum on a ping packet.
+ */
+static u_short
+checksum (u_short *packet, int size)
+{
+ register int nleft = size;
+ register u_short *w = packet;
+ register int sum = 0;
+ u_short answer = 0;
+
+ /* Using a 32 bit accumulator (sum), we add sequential 16 bit words
+ to it, and at the end, fold back all the carry bits from the
+ top 16 bits into the lower 16 bits.
+ */
+ while (nleft > 1)
+ {
+ sum += *w++;
+ nleft -= 2;
+ }
+
+ /* mop up an odd byte, if necessary */
+
+ if (nleft == 1)
+ {
+ *(u_char *)(&answer) = *(u_char *)w ;
+ *(1 + (u_char *)(&answer)) = 0;
+ sum += answer;
+ }
+
+ /* add back carry outs from top 16 bits to low 16 bits */
+
+ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
+ sum += (sum >> 16); /* add carry */
+ answer = ~sum; /* truncate to 16 bits */
+
+ return(answer);
+}
+
+
+/* Copies the sonar_bogie and the underlying ping_bogie.
+ */
+static sonar_bogie *
+copy_ping_bogie (sonar_sensor_data *ssd, const sonar_bogie *b)
+{
+ sonar_bogie *b2 = sonar_copy_bogie (ssd, b);
+ if (b->closure)
+ {
+ ping_bogie *pb = (ping_bogie *) b->closure;
+ ping_bogie *pb2 = (ping_bogie *) calloc (1, sizeof(*pb));
+ pb2->address = pb->address;
+ b2->closure = pb2;
+ }
+ return b2;
+}
+
+
+/* Look for all outstanding ping replies.
+ */
+static sonar_bogie *
+get_ping (sonar_sensor_data *ssd)
+{
+ ping_data *pd = (ping_data *) ssd->closure;
+ struct sockaddr from;
+ socklen_t fromlen;
+ int result;
+ u_char packet[1024];
+ struct timeval now;
+ struct timeval *then;
+ struct ip *ip;
+ int iphdrlen;
+ struct ICMP *icmph;
+ sonar_bogie *bl = 0;
+ sonar_bogie *new = 0;
+ struct sigaction sa;
+ struct itimerval it;
+ fd_set rfds;
+ struct timeval tv;
+
+ /* Set up a signal to interrupt our wait for a packet */
+
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = 0;
+ sa.sa_handler = sigcatcher;
+ if (sigaction(SIGALRM, &sa, 0) == -1)
+ {
+ char msg[1024];
+ sprintf(msg, "%s: unable to trap SIGALRM", progname);
+ perror(msg);
+ exit(1);
+ }
+
+ /* Set up a timer to interupt us if we don't get a packet */
+
+ it.it_interval.tv_sec = 0;
+ it.it_interval.tv_usec = 0;
+ it.it_value.tv_sec = 0;
+ it.it_value.tv_usec = pd->timeout;
+ timer_expired = 0;
+ setitimer(ITIMER_REAL, &it, 0);
+
+ /* Wait for a result packet */
+
+ fromlen = sizeof(from);
+ while (! timer_expired)
+ {
+ tv.tv_usec = pd->timeout;
+ tv.tv_sec = 0;
+#if 0
+ /* This breaks on BSD, which uses bzero() in the definition of FD_ZERO */
+ FD_ZERO(&rfds);
+#else
+ memset (&rfds, 0, sizeof(rfds));
+#endif
+ FD_SET(pd->icmpsock, &rfds);
+ /* only wait a little while, in case we raced with the timer expiration.
+ From Valentijn Sessink <valentyn@openoffice.nl> */
+ if (select(pd->icmpsock + 1, &rfds, 0, 0, &tv) >0)
+ {
+ result = (int)recvfrom (pd->icmpsock, packet, sizeof(packet),
+ 0, &from, &fromlen);
+
+ /* Check the packet */
+
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&now, (struct timezone *) 0);
+# else
+ gettimeofday(&now);
+# endif
+ ip = (struct ip *) packet;
+ iphdrlen = IP_HDRLEN(ip) << 2;
+ icmph = (struct ICMP *) &packet[iphdrlen];
+ then = (struct timeval *) &packet[iphdrlen + sizeof(struct ICMP)];
+
+
+ /* Ignore anything but ICMP Replies */
+ if (ICMP_TYPE(icmph) != ICMP_ECHOREPLY)
+ continue;
+
+ /* Ignore packets not set from us */
+ if (ICMP_ID(icmph) != pd->pid)
+ continue;
+
+ /* Find the bogie in 'targets' that corresponds to this packet
+ and copy it, so that this bogie stays in the same spot (th)
+ on the screen, and so that we don't have to resolve it again.
+
+ We could find the bogie by comparing ip->ip_src.s_addr to
+ pb->address, but it is possible that, in certain weird router
+ or NAT situations, that the reply will come back from a
+ different address than the one we sent it to. So instead,
+ we parse the sockaddr out of the reply packet payload.
+ */
+ {
+ const socklen_t *host_id = (socklen_t *) &packet[
+ iphdrlen + sizeof(struct ICMP) + sizeof(struct timeval)];
+
+ sonar_bogie *b;
+
+ /* Ensure that a maliciously-crafted return packet can't
+ make us overflow in memcmp. */
+ if (result > 0 && (const u_char *)(host_id + 1) <= packet + result)
+ {
+ const u_char *host_end = (const u_char *)(host_id + 1) +
+ *host_id;
+
+ if ((const u_char *)(host_id + 1) <= host_end &&
+ host_end <= packet + result)
+ {
+ for (b = pd->targets; b; b = b->next)
+ {
+ ping_bogie *pb = (ping_bogie *)b->closure;
+ if (*host_id == pb->addrlen &&
+ !memcmp(&pb->address, host_id + 1, pb->addrlen) )
+ {
+ /* Check to see if the name lookup is done. */
+ if (pb->lookup_name &&
+ async_name_from_addr_is_done (pb->lookup_name))
+ {
+ char *host = NULL;
+
+ async_name_from_addr_finish (pb->lookup_name,
+ &host, NULL);
+
+ if (pd->debug_p > 1)
+ fprintf (stderr, "%s: %s => %s\n",
+ progname, b->name,
+ host ? host : "<unknown>");
+
+ if (host)
+ {
+ free(b->name);
+ b->name = host;
+ }
+
+ pb->lookup_name = NULL;
+ }
+
+ new = copy_ping_bogie (ssd, b);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (! new) /* not in targets? */
+ {
+ unsigned int a, b, c, d;
+ unpack_addr (ip->ip_src.s_addr, &a, &b, &c, &d);
+ fprintf (stderr,
+ "%s: UNEXPECTED PING REPLY! "
+ "%4d bytes, icmp_seq=%-4d from %d.%d.%d.%d\n",
+ progname, result, ICMP_SEQ(icmph), a, b, c, d);
+ continue;
+ }
+
+ new->next = bl;
+ bl = new;
+
+ {
+ double msec = delta(then, &now) / 1000.0;
+
+ if (pd->times_p)
+ {
+ if (new->desc) free (new->desc);
+ new->desc = (char *) malloc (30);
+ if (msec > 99) sprintf (new->desc, "%.0f ms", msec);
+ else if (msec > 9) sprintf (new->desc, "%.1f ms", msec);
+ else if (msec > 1) sprintf (new->desc, "%.2f ms", msec);
+ else sprintf (new->desc, "%.3f ms", msec);
+ }
+
+ if (pd->debug_p && pd->times_p) /* ping-like stdout log */
+ {
+ char *s = strdup(new->name);
+ char *s2 = s;
+ if (strlen(s) > 28)
+ {
+ s2 = s + strlen(s) - 28;
+ strncpy (s2, "...", 3);
+ }
+ fprintf (stdout,
+ "%3d bytes from %28s: icmp_seq=%-4d time=%s\n",
+ result, s2, ICMP_SEQ(icmph), new->desc);
+ fflush (stdout);
+ free(s);
+ }
+
+ /* The radius must be between 0.0 and 1.0.
+ We want to display ping times on a logarithmic scale,
+ with the three rings being 2.5, 70 and 2,000 milliseconds.
+ */
+ if (msec <= 0) msec = 0.001;
+ new->r = log (msec * 10) / log (20000);
+
+ /* Don't put anyone *too* close to the center of the screen. */
+ if (new->r < 0) new->r = 0;
+ if (new->r < 0.1) new->r += 0.1;
+ }
+ }
+ }
+
+ return bl;
+}
+
+
+/* difference between the two times in microseconds.
+ */
+static long
+delta (struct timeval *then, struct timeval *now)
+{
+ return (((now->tv_sec - then->tv_sec) * 1000000) +
+ (now->tv_usec - then->tv_usec));
+}
+
+
+static void
+ping_free_data (sonar_sensor_data *ssd, void *closure)
+{
+ ping_data *pd = (ping_data *) closure;
+ sonar_bogie *b = pd->targets;
+ while (b)
+ {
+ sonar_bogie *b2 = b->next;
+ sonar_free_bogie (ssd, b);
+ b = b2;
+ }
+ free (pd);
+}
+
+static void
+ping_free_bogie_data (sonar_sensor_data *sd, void *closure)
+{
+ ping_bogie *pb = (ping_bogie *) closure;
+
+ if (pb->lookup_name)
+ async_name_from_addr_cancel (pb->lookup_name);
+ if (pb->lookup_addr)
+ async_addr_from_name_cancel (pb->lookup_addr);
+ free (pb->fallback);
+
+ free (closure);
+}
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static void
+free_bogie_after_lookup(sonar_sensor_data *ssd, sonar_bogie **sbp,
+ sonar_bogie **sb)
+{
+ ping_bogie *pb = (ping_bogie *)(*sb)->closure;
+
+ *sbp = (*sb)->next;
+ pb->lookup_addr = NULL; /* Prevent double-free in sonar_free_bogie. */
+ sonar_free_bogie (ssd, *sb);
+ *sb = NULL;
+}
+
+
+/* Pings the next bogie, if it's time.
+ Returns all outstanding ping replies.
+ */
+static sonar_bogie *
+ping_scan (sonar_sensor_data *ssd)
+{
+ ping_data *pd = (ping_data *) ssd->closure;
+ double now = double_time();
+ double ping_cycle = 10; /* re-ping a given host every 10 seconds */
+ double ping_interval = ping_cycle / pd->target_count;
+
+ if (now > pd->last_ping_time + ping_interval) /* time to ping someone */
+ {
+ struct sonar_bogie **sbp;
+
+ if (pd->last_pinged)
+ {
+ sbp = &pd->last_pinged->next;
+ if (!*sbp)
+ sbp = &pd->targets;
+ }
+ else
+ sbp = &pd->targets;
+
+ if (!*sbp)
+ /* Aaaaand we're out of bogies. */
+ pd->last_pinged = NULL;
+ else
+ {
+ sonar_bogie *sb = *sbp;
+ ping_bogie *pb = (ping_bogie *)sb->closure;
+ if (pb->lookup_addr &&
+ async_addr_from_name_is_done (pb->lookup_addr))
+ {
+ if (async_addr_from_name_finish (pb->lookup_addr, &pb->address,
+ &pb->addrlen, NULL))
+ {
+ char *fallback = pb->fallback;
+ pb->fallback = NULL;
+
+ if (pd->debug_p)
+ fprintf (stderr, "%s: could not resolve host: %s\n",
+ progname, sb->name);
+
+ free_bogie_after_lookup (ssd, sbp, &sb);
+
+ /* Insert the fallback bogie right where the old one was. */
+ if (fallback)
+ {
+ sonar_bogie *new_bogie = bogie_for_host (ssd, fallback,
+ NULL);
+ if (new_bogie) {
+ new_bogie->next = *sbp;
+
+ if (! ((ping_bogie *)new_bogie->closure)->lookup_addr &&
+ ! find_duplicate_host(pd, &pd->targets, new_bogie))
+ *sbp = new_bogie;
+ else
+ sonar_free_bogie (ssd, new_bogie);
+ }
+
+ free (fallback);
+ }
+ }
+ else
+ {
+ if (pd->debug_p > 1)
+ {
+ fprintf (stderr, "%s: %s => ", progname, sb->name);
+ print_address (stderr, 0, &pb->address, pb->addrlen);
+ putc('\n', stderr);
+ }
+
+ if (! is_address_ok (pd->debug_p, sb))
+ free_bogie_after_lookup (ssd, sbp, &sb);
+ else if (find_duplicate_host (pd, &pd->targets, sb))
+ /* Tricky: find_duplicate_host skips the current bogie when
+ scanning the targets list because pb->lookup_addr hasn't
+ been NULL'd yet.
+
+ Not that it matters much, but behavior here is to
+ keep the existing address.
+ */
+ free_bogie_after_lookup (ssd, sbp, &sb);
+ }
+
+ if (sb)
+ pb->lookup_addr = NULL;
+ }
+
+ if (sb && !pb->lookup_addr)
+ {
+ if (!pb->addrlen) abort();
+ send_ping (pd, sb);
+ pd->last_pinged = sb;
+ }
+ }
+
+ pd->last_ping_time = now;
+ }
+
+ return get_ping (ssd);
+}
+
+
+/* Returns a list of hosts to ping based on the "-ping" argument.
+ */
+static sonar_bogie *
+parse_mode (sonar_sensor_data *ssd, char **error_ret, char **desc_ret,
+ const char *ping_arg, Bool ping_works_p)
+{
+ ping_data *pd = (ping_data *) ssd->closure;
+ char *source, *token, *end, dummy;
+ sonar_bogie *hostlist = 0;
+ const char *fallback = "subnet";
+
+ AGAIN:
+
+ if (fallback && (!ping_arg || !*ping_arg || !strcmp (ping_arg, "default")))
+ source = strdup(fallback);
+ else if (ping_arg)
+ source = strdup(ping_arg);
+ else
+ return 0;
+
+ token = source;
+ end = source + strlen(source);
+ while (token < end)
+ {
+ char *next;
+ sonar_bogie *new = 0;
+# ifdef READ_FILES
+ struct stat st;
+# endif
+ unsigned int n0=0, n1=0, n2=0, n3=0, m=0;
+ char d;
+
+ for (next = token;
+ *next &&
+ *next != ',' && *next != ' ' && *next != '\t' && *next != '\n';
+ next++)
+ ;
+ *next = 0;
+
+
+ if (pd->debug_p)
+ fprintf (stderr, "%s: parsing %s\n", progname, token);
+
+ if (!ping_works_p)
+ {
+ *error_ret = strdup ("Sonar must be setuid to ping!\n"
+ "Running simulation instead.");
+ return 0;
+ }
+
+ if ((4 == sscanf (token, "%u.%u.%u/%u %c", &n0,&n1,&n2, &m,&d)) ||
+ (5 == sscanf (token, "%u.%u.%u.%u/%u %c", &n0,&n1,&n2,&n3,&m,&d)))
+ {
+ /* subnet: A.B.C.D/M
+ subnet: A.B.C/M
+ */
+ unsigned long ip = pack_addr (n0, n1, n2, n3);
+ new = subnet_hosts (ssd, error_ret, desc_ret, ip, m);
+ }
+ else if (4 == sscanf (token, "%u.%u.%u.%u %c", &n0, &n1, &n2, &n3, &d))
+ {
+ /* IP: A.B.C.D
+ */
+ new = bogie_for_host (ssd, token, NULL);
+ }
+ else if (!strcmp (token, "subnet"))
+ {
+ new = subnet_hosts (ssd, error_ret, desc_ret, 0, 24);
+ }
+ else if (1 == sscanf (token, "subnet/%u %c", &m, &dummy))
+ {
+ new = subnet_hosts (ssd, error_ret, desc_ret, 0, m);
+ }
+ else if (*token == '.' || *token == '/' ||
+ *token == '$' || *token == '~')
+ {
+# ifdef READ_FILES
+ new = read_hosts_file (ssd, token);
+# else
+ if (pd->debug_p) fprintf (stderr, "%s: skipping file\n", progname);
+# endif
+ }
+# ifdef READ_FILES
+ else if (!stat (token, &st))
+ {
+ new = read_hosts_file (ssd, token);
+ }
+# endif /* READ_FILES */
+ else
+ {
+ /* not an existant file - must be a host name
+ */
+ new = bogie_for_host (ssd, token, NULL);
+ }
+
+ if (new)
+ {
+ sonar_bogie *nn = new;
+ while (nn->next)
+ nn = nn->next;
+ nn->next = hostlist;
+ hostlist = new;
+ }
+
+ token = next + 1;
+ while (token < end &&
+ (*token == ',' || *token == ' ' ||
+ *token == '\t' || *token == '\n'))
+ token++;
+ }
+
+ free (source);
+
+ /* If the arg was completely unparsable, fall back to the local subnet.
+ This happens if the default is "/etc/hosts" but READ_FILES is off.
+ Or if we're on a /31 network, in which case we try twice then fail.
+ */
+ if (!hostlist && fallback)
+ {
+ if (pd->debug_p)
+ fprintf (stderr, "%s: no hosts parsed! Trying %s\n",
+ progname, fallback);
+ ping_arg = fallback;
+ fallback = 0;
+ goto AGAIN;
+ }
+
+ return hostlist;
+}
+
+
+sonar_sensor_data *
+sonar_init_ping (Display *dpy, char **error_ret, char **desc_ret,
+ const char *subnet, int timeout,
+ Bool resolve_p, Bool times_p, Bool debug_p)
+{
+ /* Important! Do not return from this function without disavowing privileges
+ with setuid(getuid()).
+ */
+ sonar_sensor_data *ssd = (sonar_sensor_data *) calloc (1, sizeof(*ssd));
+ ping_data *pd = (ping_data *) calloc (1, sizeof(*pd));
+ sonar_bogie *b;
+ char *s;
+
+ Bool socket_initted_p = False;
+ Bool socket_raw_p = False;
+
+ pd->dpy = dpy;
+
+ pd->resolve_p = resolve_p;
+ pd->times_p = times_p;
+ pd->debug_p = debug_p;
+
+ ssd->closure = pd;
+ ssd->scan_cb = ping_scan;
+ ssd->free_data_cb = ping_free_data;
+ ssd->free_bogie_cb = ping_free_bogie_data;
+
+ /* Get short version number. */
+ s = strchr (screensaver_id, ' ');
+ pd->version = strdup (s+1);
+ s = strchr (pd->version, ' ');
+ *s = 0;
+
+
+ /* Create the ICMP socket. Do this before dropping privs.
+
+ Raw sockets can only be opened by root (or setuid root), so we
+ only try to do this when the effective uid is 0.
+
+ We used to just always try, and notice the failure. But apparently
+ that causes "SELinux" to log spurious warnings when running with the
+ "strict" policy. So to avoid that, we just don't try unless we
+ know it will work.
+
+ On MacOS X, we can avoid the whole problem by using a
+ non-privileged datagram instead of a raw socket.
+ */
+ if (global_icmpsock)
+ {
+ pd->icmpsock = global_icmpsock;
+ socket_initted_p = True;
+ if (debug_p)
+ fprintf (stderr, "%s: re-using icmp socket\n", progname);
+
+ }
+ else if ((pd->icmpsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)) >= 0)
+ {
+ socket_initted_p = True;
+ }
+ else if (geteuid() == 0 &&
+ (pd->icmpsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) >= 0)
+ {
+ socket_initted_p = True;
+ socket_raw_p = True;
+ }
+
+ if (socket_initted_p)
+ {
+ global_icmpsock = pd->icmpsock;
+ socket_initted_p = True;
+ if (debug_p)
+ fprintf (stderr, "%s: opened %s icmp socket\n", progname,
+ (socket_raw_p ? "raw" : "dgram"));
+ }
+ else if (debug_p)
+ fprintf (stderr, "%s: unable to open icmp socket\n", progname);
+
+ /* Disavow privs */
+ setuid(getuid());
+
+ pd->pid = getpid() & 0xFFFF;
+ pd->seq = 0;
+ pd->timeout = timeout;
+
+ /* Generate a list of targets */
+
+ pd->targets = parse_mode (ssd, error_ret, desc_ret, subnet,
+ socket_initted_p);
+ pd->targets = delete_duplicate_hosts (ssd, pd->targets);
+
+ if (debug_p)
+ {
+ fprintf (stderr, "%s: Target list:\n", progname);
+ for (b = pd->targets; b; b = b->next)
+ {
+ fprintf (stderr, "%s: ", progname);
+ print_host (stderr, b);
+ }
+ }
+
+ /* Make sure there is something to ping */
+
+ pd->target_count = 0;
+ for (b = pd->targets; b; b = b->next)
+ pd->target_count++;
+
+ if (pd->target_count == 0)
+ {
+ if (! *error_ret)
+ *error_ret = strdup ("No hosts to ping!\n"
+ "Simulating instead.");
+ if (pd) ping_free_data (ssd, pd);
+ if (ssd) free (ssd);
+ return 0;
+ }
+
+ /* Distribute them evenly around the display field, clockwise.
+ Even on a /24, allocated IPs tend to cluster together, so
+ don't put any two hosts closer together than N degrees to
+ avoid unnecessary overlap when we have plenty of space due
+ to addresses that probably won't respond. And don't spread
+ them out too far apart, because that looks too symmetrical
+ when there are a small number of hosts.
+ */
+ {
+ double th = frand(M_PI);
+ double sep = 360.0 / pd->target_count;
+ if (sep < 23) sep = 23;
+ if (sep > 43) sep = 43;
+ sep /= 180/M_PI;
+ for (b = pd->targets; b; b = b->next) {
+ b->th = th;
+ th += sep;
+ }
+ }
+
+ return ssd;
+}
+
+#endif /* HAVE_PING -- whole file */
diff --git a/hacks/glx/sonar-sim.c b/hacks/glx/sonar-sim.c
new file mode 100644
index 0000000..ea5452e
--- /dev/null
+++ b/hacks/glx/sonar-sim.c
@@ -0,0 +1,112 @@
+/* sonar, Copyright (c) 1998-2012 Jamie Zawinski and Stephen Martin
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This implements the "simulation" sensor for sonar.
+ */
+
+#include "screenhackI.h"
+#include "sonar.h"
+
+typedef struct {
+ const char *team_a_name;
+ const char *team_b_name;
+ int team_a_count;
+ int team_b_count;
+ sonar_bogie *targets;
+ Bool debug_p;
+} sim_data;
+
+
+static void
+sim_free_data (sonar_sensor_data *ssd, void *closure)
+{
+ sim_data *sd = (sim_data *) closure;
+ free (sd);
+}
+
+static void
+sim_free_bogie_data (sonar_sensor_data *ssd, void *closure)
+{
+ free (closure);
+}
+
+
+/* Return an updated (moved) copy of the bogies.
+ */
+static sonar_bogie *
+sim_scan (sonar_sensor_data *ssd)
+{
+ sim_data *sd = (sim_data *) ssd->closure;
+ sonar_bogie *b, *b2, *list = 0;
+ double scale = 0.01;
+ for (b = sd->targets; b; b = b->next)
+ {
+ b->r += scale * (0.5 - frand(1.0));
+ b->th += scale * (0.5 - frand(1.0));
+ while (b->r < 0.2) b->r += scale * 0.1;
+ while (b->r > 0.9) b->r -= scale * 0.1;
+
+ b2 = sonar_copy_bogie (ssd, b);
+ b2->next = list;
+ list = b2;
+ }
+ return list;
+}
+
+
+static void
+make_bogies (sonar_sensor_data *ssd)
+{
+ sim_data *sd = (sim_data *) ssd->closure;
+ int i, j;
+
+ for (j = 0; j <= 1; j++)
+ for (i = 0; i < (j ? sd->team_a_count : sd->team_b_count); i++)
+ {
+ sonar_bogie *b = (sonar_bogie *) calloc (1, sizeof(*b));
+ const char *name = (j ? sd->team_a_name : sd->team_b_name);
+ b->name = (char *) malloc (strlen(name) + 10);
+ sprintf (b->name, "%s%03d", name, i+1);
+ b->r = 0.3 + frand(0.5);
+ b->th = frand (M_PI*2);
+ b->next = sd->targets;
+ sd->targets = b;
+ if (sd->debug_p)
+ fprintf (stderr, "%s: %s: %5.2f %5.2f\n", progname,
+ b->name, b->r, b->th);
+ }
+}
+
+
+sonar_sensor_data *
+sonar_init_simulation (Display *dpy, char **error_ret, char **desc_ret,
+ const char *team_a_name, const char *team_b_name,
+ int team_a_count, int team_b_count,
+ Bool debug_p)
+{
+ sonar_sensor_data *ssd = (sonar_sensor_data *) calloc (1, sizeof(*ssd));
+ sim_data *sd = (sim_data *) calloc (1, sizeof(*sd));
+
+ sd->team_a_name = team_a_name;
+ sd->team_b_name = team_b_name;
+ sd->team_a_count = team_a_count;
+ sd->team_b_count = team_b_count;
+ sd->debug_p = debug_p;
+
+ ssd->closure = sd;
+ ssd->scan_cb = sim_scan;
+ ssd->free_data_cb = sim_free_data;
+ ssd->free_bogie_cb = sim_free_bogie_data;
+
+ make_bogies (ssd);
+
+ return ssd;
+}
+
diff --git a/hacks/glx/sonar.c b/hacks/glx/sonar.c
new file mode 100644
index 0000000..c4ea949
--- /dev/null
+++ b/hacks/glx/sonar.c
@@ -0,0 +1,1258 @@
+/* sonar, Copyright (c) 1998-2018 Jamie Zawinski and Stephen Martin
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Created in Apr 1998 by Stephen Martin <smartin@vanderfleet-martin.net>
+ * for the RedHat Screensaver Contest
+ * Heavily hacked by jwz ever since.
+ * Rewritten in OpenGL by jwz, Aug 2008.
+ *
+ * This is an implementation of a general purpose reporting tool in the
+ * format of a Sonar display. It is designed such that a sensor is read
+ * on every movement of a sweep arm and the results of that sensor are
+ * displayed on the screen. The location of the display points (targets) on the
+ * screen are determined by the current localtion of the sweep and a distance
+ * value associated with the target.
+ *
+ * Currently the only two sensors that are implemented are the simulator
+ * (the default) and the ping sensor. The simulator randomly creates a set
+ * of bogies that move around on the scope while the ping sensor can be
+ * used to display hosts on your network.
+ *
+ * The ping code is only compiled in if you define HAVE_ICMP or HAVE_ICMPHDR,
+ * because, unfortunately, different systems have different ways of creating
+ * these sorts of packets.
+ *
+ * In order to use the ping sensor on most systems, this program must be
+ * installed as setuid root, so that it can create an ICMP RAW socket. Root
+ * privileges are disavowed shortly after startup (just after connecting to
+ * the X server and reading the resource database) so this is *believed* to
+ * be a safe thing to do, but it is usually recommended that you have as few
+ * setuid programs around as possible, on general principles.
+ *
+ * It is not necessary to make it setuid on MacOS systems, because on those
+ * systems, unprivileged programs can ping by using ICMP DGRAM sockets
+ * instead of ICMP RAW.
+ *
+ * It should be easy to extend this code to support other sorts of sensors.
+ * Some ideas:
+ *
+ * - search the output of "netstat" for the list of hosts to ping;
+ * - plot the contents of /proc/interrupts;
+ * - plot the process table, by process size, cpu usage, or total time;
+ * - plot the logged on users by idle time or cpu usage.
+ * - plot IM contacts or Facebook friends and their last-activity times.
+ */
+
+#define DEF_FONT "-*-courier-bold-r-normal-*-*-480-*-*-*-*-iso8859-1"
+#define DEF_SPEED "1.0"
+#define DEF_SWEEP_SIZE "0.3"
+#define DEF_FONT_SIZE "12"
+#define DEF_TEAM_A_NAME "F18"
+#define DEF_TEAM_B_NAME "MIG"
+#define DEF_TEAM_A_COUNT "4"
+#define DEF_TEAM_B_COUNT "4"
+#define DEF_PING "default"
+#define DEF_PING_TIMEOUT "3000"
+#define DEF_RESOLVE "True"
+#define DEF_TIMES "True"
+#define DEF_WOBBLE "True"
+#define DEF_DEBUG "False"
+
+#include "thread_util.h"
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*font: " DEF_FONT "\n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*texFontCacheSize: 300 \n" \
+ THREAD_DEFAULTS_XLOCK
+
+
+# define release_sonar 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> /* for setuid() */
+#endif
+
+#include "xlockmore.h"
+#include "sonar.h"
+#include "gltrackball.h"
+#include "rotator.h"
+#include "texfont.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+/* #define TEST_ASYNC_NETDB 1 */
+
+# if TEST_ASYNC_NETDB
+# include "async_netdb.h"
+
+# include <assert.h>
+# include <netinet/in.h>
+# include <stdio.h>
+# endif /* TEST_ASYNC_NETDB */
+
+typedef struct {
+ double x,y,z;
+} XYZ;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ rotator *rot;
+ Bool button_down_p;
+
+ double start_time;
+ GLfloat sweep_offset;
+
+ GLuint screen_list, grid_list, sweep_list, table_list;
+ int screen_polys, grid_polys, sweep_polys, table_polys;
+ GLfloat sweep_th;
+ GLfloat line_thickness;
+
+ texture_font_data *texfont;
+
+ enum { MSG, RESOLVE, RUN } state;
+ sonar_sensor_data *ssd;
+ char *error;
+ char *desc;
+
+ sonar_bogie *displayed; /* on screen and fading */
+ sonar_bogie *pending; /* returned by sensor, not yet on screen */
+
+# if TEST_ASYNC_NETDB
+ async_name_from_addr_t query0;
+ async_addr_from_name_t query1;
+# endif
+} sonar_configuration;
+
+static sonar_configuration *sps = NULL;
+
+static GLfloat speed;
+static GLfloat sweep_size;
+static GLfloat font_size;
+static Bool resolve_p;
+static Bool times_p;
+static Bool wobble_p;
+static Bool debug_p;
+
+static char *team_a_name;
+static char *team_b_name;
+static int team_a_count;
+static int team_b_count;
+static int ping_timeout;
+static char *ping_arg;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-sweep-size", ".sweepSize", XrmoptionSepArg, 0 },
+ { "-font-size", ".fontSize", XrmoptionSepArg, 0 },
+ { "-team-a-name", ".teamAName", XrmoptionSepArg, 0 },
+ { "-team-b-name", ".teamBName", XrmoptionSepArg, 0 },
+ { "-team-a-count", ".teamACount", XrmoptionSepArg, 0 },
+ { "-team-b-count", ".teamBCount", XrmoptionSepArg, 0 },
+ { "-ping", ".ping", XrmoptionSepArg, 0 },
+ { "-ping-timeout", ".pingTimeout", XrmoptionSepArg, 0 },
+ { "-dns", ".resolve", XrmoptionNoArg, "True" },
+ { "+dns", ".resolve", XrmoptionNoArg, "False" },
+ { "-times", ".times", XrmoptionNoArg, "True" },
+ { "+times", ".times", XrmoptionNoArg, "False" },
+ { "-wobble", ".wobble", XrmoptionNoArg, "True" },
+ { "+wobble", ".wobble", XrmoptionNoArg, "False" },
+ THREAD_OPTIONS
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&sweep_size, "sweepSize", "SweepSize", DEF_SWEEP_SIZE, t_Float},
+ {&font_size, "fontSize", "FontSize", DEF_FONT_SIZE, t_Float},
+ {&team_a_name, "teamAName", "TeamName", DEF_TEAM_A_NAME, t_String},
+ {&team_b_name, "teamBName", "TeamName", DEF_TEAM_B_NAME, t_String},
+ {&team_a_count, "teamACount", "TeamCount", DEF_TEAM_A_COUNT, t_Int},
+ {&team_b_count, "teamBCount", "TeamCount", DEF_TEAM_A_COUNT, t_Int},
+ {&ping_arg, "ping", "Ping", DEF_PING, t_String},
+ {&ping_timeout, "pingTimeout", "PingTimeout", DEF_PING_TIMEOUT, t_Int},
+ {&resolve_p, "resolve", "Resolve", DEF_RESOLVE, t_Bool},
+ {&times_p, "times", "Times", DEF_TIMES, t_Bool},
+ {&wobble_p, "wobble", "Wobble", DEF_WOBBLE, t_Bool},
+ {&debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt sonar_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static int
+draw_screen (ModeInfo *mi, Bool mesh_p, Bool sweep_p)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ int i;
+ int th_steps, r_steps, r_skip, th_skip, th_skip2, outer_r;
+ GLfloat curvature = M_PI * 0.4;
+ GLfloat r0, r1, z0, z1, zoff;
+ XYZ *ring;
+
+ static const GLfloat glass[4] = {0.0, 0.4, 0.0, 0.5};
+ static const GLfloat lines[4] = {0.0, 0.7, 0.0, 0.5};
+ static const GLfloat sweepc[4] = {0.2, 1.0, 0.2, 0.5};
+ static const GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat shiny = 20.0;
+
+ if (wire && !(mesh_p || sweep_p)) return 0;
+
+ glDisable (GL_TEXTURE_2D);
+
+ glFrontFace (GL_CCW);
+ th_steps = 36 * 4; /* must be a multiple of th_skip2 divisor */
+ r_steps = 40;
+ r_skip = 1;
+ th_skip = 1;
+ th_skip2 = 1;
+ outer_r = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mesh_p ? lines : glass);
+ if (wire) glColor3fv (lines);
+
+ if (mesh_p)
+ {
+ th_skip = th_steps / 12;
+ th_skip2 = th_steps / 36;
+ r_skip = r_steps / 3;
+ outer_r = r_steps * 0.93;
+
+ if (! wire)
+ glLineWidth (sp->line_thickness);
+ }
+
+ ring = (XYZ *) calloc (th_steps, sizeof(*ring));
+
+ for (i = 0; i < th_steps; i++)
+ {
+ double a = M_PI * 2 * i / th_steps;
+ ring[i].x = cos(a);
+ ring[i].y = sin(a);
+ }
+
+ /* place the bottom of the disc on the xy plane. */
+ zoff = cos (curvature/2 * (M_PI/2)) / 2;
+
+ for (i = r_steps; i > 0; i--)
+ {
+ int j0, j1;
+
+ r0 = i / (GLfloat) r_steps;
+ r1 = (i+1) / (GLfloat) r_steps;
+
+ if (r1 > 1) r1 = 1; /* avoid asin lossage */
+
+ z0 = cos (curvature/2 * asin (r0)) / 2 - zoff;
+ z1 = cos (curvature/2 * asin (r1)) / 2 - zoff;
+
+ glBegin(wire || mesh_p ? GL_LINES : GL_QUAD_STRIP);
+ for (j0 = 0; j0 <= th_steps; j0++)
+ {
+ if (mesh_p &&
+ (i < outer_r
+ ? (j0 % th_skip != 0)
+ : (j0 % th_skip2 != 0)))
+ continue;
+
+ if (sweep_p)
+ {
+ GLfloat color[4];
+ GLfloat r = 1 - (j0 / (GLfloat) (th_steps * sweep_size));
+#if 0
+ color[0] = glass[0] + (sweepc[0] - glass[0]) * r;
+ color[1] = glass[1] + (sweepc[1] - glass[1]) * r;
+ color[2] = glass[2] + (sweepc[2] - glass[2]) * r;
+ color[3] = glass[3];
+#else
+ color[0] = sweepc[0];
+ color[1] = sweepc[1];
+ color[2] = sweepc[2];
+ color[3] = r;
+#endif
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ }
+
+ j1 = j0 % th_steps;
+ glNormal3f (r0 * ring[j1].x, r0 * ring[j1].y, z0);
+ glVertex3f (r0 * ring[j1].x, r0 * ring[j1].y, z0);
+ glNormal3f (r1 * ring[j1].x, r1 * ring[j1].y, z1);
+ glVertex3f (r1 * ring[j1].x, r1 * ring[j1].y, z1);
+ polys++;
+
+ if (sweep_p && j0 >= th_steps * sweep_size)
+ break;
+ if (sweep_p && wire)
+ break;
+ }
+ glEnd();
+
+ if (mesh_p &&
+ (i == outer_r ||
+ i == r_steps ||
+ (i % r_skip == 0 &&
+ i < r_steps - r_skip)))
+ {
+ glBegin(GL_LINE_LOOP);
+ for (j0 = 0; j0 < th_steps; j0++)
+ {
+ glNormal3f (r0 * ring[j0].x, r0 * ring[j0].y, z0);
+ glVertex3f (r0 * ring[j0].x, r0 * ring[j0].y, z0);
+ polys++;
+ }
+ glEnd();
+ }
+ }
+
+ /* one more polygon for the middle */
+ if (!wire && !sweep_p)
+ {
+ glBegin(wire || mesh_p ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3f (0, 0, 1);
+ for (i = 0; i < th_steps; i++)
+ {
+ glNormal3f (r0 * ring[i].x, r0 * ring[i].y, z0);
+ glVertex3f (r0 * ring[i].x, r0 * ring[i].y, z0);
+ }
+ polys++;
+ glEnd();
+ }
+
+ free (ring);
+
+ return polys;
+}
+
+
+static int
+draw_text (ModeInfo *mi, const char *string, GLfloat r, GLfloat th,
+ GLfloat ttl, GLfloat size)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ GLfloat font_scale = 0.001 * (size > 0 ? size : font_size) / 14.0;
+ int lines = 0, max_w = 0, lh = 0;
+ char *string2 = strdup (string);
+ char *token = string2;
+ char *line;
+
+ if (MI_WIDTH(mi) > 2560) font_scale /= 2; /* Retina displays */
+
+ if (size <= 0) /* if size not specified, draw in yellow with alpha */
+ {
+ GLfloat color[4];
+ color[0] = 1;
+ color[1] = 1;
+ color[2] = 0;
+ color[3] = (ttl / (M_PI * 2)) * 1.2;
+ if (color[3] > 1) color[3] = 1;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ if (wire)
+ glColor3f (color[0]*color[3], color[1]*color[3], color[2]*color[3]);
+ }
+
+ while ((line = strtok (token, "\r\n")))
+ {
+ XCharStruct e;
+ int w, ascent, descent;
+ texture_string_metrics (sp->texfont, line, &e, &ascent, &descent);
+ w = e.width;
+ lh = ascent + descent;
+ if (w > max_w) max_w = w;
+ lines++;
+ token = 0;
+ }
+
+ glPushMatrix();
+ glTranslatef (r * cos (th), r * sin(th), 0);
+ glScalef (font_scale, font_scale, font_scale);
+
+ if (size <= 0) /* Draw the dot */
+ {
+ GLfloat s = font_size * 1.7;
+ glDisable (GL_TEXTURE_2D);
+ glFrontFace (GL_CW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (0, s, 0);
+ glVertex3f (s, s, 0);
+ glVertex3f (s, 0, 0);
+ glVertex3f (0, 0, 0);
+ glEnd();
+ glTranslatef (-max_w/2, -lh, 0);
+ }
+ else
+ glTranslatef (-max_w/2, -lh/2, 0);
+
+ /* draw each line, centered */
+ if (! wire) glEnable (GL_TEXTURE_2D);
+ free (string2);
+ string2 = strdup (string);
+ token = string2;
+ while ((line = strtok (token, "\r\n")))
+ {
+ XCharStruct e;
+ int w;
+ texture_string_metrics (sp->texfont, line, &e, 0, 0);
+ w = e.width;
+ glPushMatrix();
+ glTranslatef ((max_w-w)/2, 0, polys * 4); /* 'polys' stops Z-fighting. */
+
+ if (wire)
+ {
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, lh, 0);
+ glVertex3f (0, lh, 0);
+ glEnd();
+ }
+ else
+ {
+ glFrontFace (GL_CW);
+ print_texture_string (sp->texfont, line);
+ }
+ glPopMatrix();
+ glTranslatef (0, -lh, 0);
+ polys++;
+ token = 0;
+ }
+ glPopMatrix();
+
+ free (string2);
+
+ if (! wire) glEnable (GL_DEPTH_TEST);
+
+ return polys;
+}
+
+
+/* There's a disc with a hole in it around the screen, to act as a mask
+ preventing slightly off-screen bogies from showing up. This clips 'em.
+ */
+static int
+draw_table (ModeInfo *mi)
+{
+ /*sonar_configuration *sp = &sps[MI_SCREEN(mi)];*/
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ int i;
+ int th_steps = 36 * 4; /* same as in draw_screen */
+
+ static const GLfloat color[4] = {0.0, 0.0, 0.0, 1.0};
+ static const GLfloat spec[4] = {0.0, 0.0, 0.0, 1.0};
+ static const GLfloat shiny = 0.0;
+
+ if (wire) return 0;
+
+ glDisable (GL_TEXTURE_2D);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ glFrontFace (GL_CCW);
+ glBegin(wire ? GL_LINES : GL_QUAD_STRIP);
+ glNormal3f (0, 0, 1);
+ for (i = 0; i <= th_steps; i++)
+ {
+ double a = M_PI * 2 * i / th_steps;
+ double x = cos(a);
+ double y = sin(a);
+ glVertex3f (x, y, 0);
+ glVertex3f (x*10, y*10, 0);
+ polys++;
+ }
+ glEnd();
+
+ return polys;
+}
+
+
+static int
+draw_angles (ModeInfo *mi)
+{
+ int i;
+ int polys = 0;
+
+ static const GLfloat text[4] = {0.15, 0.15, 0.15, 1.0};
+ static const GLfloat spec[4] = {0.0, 0.0, 0.0, 1.0};
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, text);
+ glTranslatef (0, 0, 0.01);
+ for (i = 0; i < 360; i += 10)
+ {
+ char buf[10];
+ GLfloat a = M_PI/2 - (i / 180.0 * M_PI);
+ sprintf (buf, "%d", i);
+ polys += draw_text (mi, buf, 1.07, a, 0, 10.0);
+ }
+
+ return polys;
+}
+
+
+static int
+draw_bogies (ModeInfo *mi)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+ int polys = 0;
+ sonar_bogie *b;
+
+ for (b = sp->displayed; b; b = b->next)
+ {
+ char *s = (char *)
+ malloc (strlen (b->name) + (b->desc ? strlen(b->desc) : 0) + 3);
+ strcpy (s, b->name);
+ if (b->desc)
+ {
+ strcat (s, "\n");
+ strcat (s, b->desc);
+ }
+ polys += draw_text (mi, s, b->r, b->th, b->ttl, -1);
+ free (s);
+
+ /* Move *very slightly* forward so that the text is not all in the
+ same plane: this prevents flickering with overlapping text as
+ the textures fight for priority. */
+ glTranslatef(0, 0, 0.00002);
+ }
+
+ return polys;
+}
+
+
+/* called from sonar-sim.c and sonar-icmp.c */
+sonar_bogie *
+sonar_copy_bogie (sonar_sensor_data *ssd, const sonar_bogie *b)
+{
+ sonar_bogie *b2 = (sonar_bogie *) calloc (1, sizeof(*b2));
+ b2->name = strdup (b->name);
+ b2->desc = b->desc ? strdup (b->desc) : 0;
+ b2->r = b->r;
+ b2->th = b->th;
+ b2->ttl = b->ttl;
+ /* does not copy b->closure */
+
+ /* Take this opportunity to normalize 'th' to the range [0-2pi). */
+ while (b2->th < 0) b2->th += M_PI*2;
+ while (b2->th >= M_PI*2) b2->th -= M_PI*2;
+
+ return b2;
+}
+
+
+/* called from sonar-icmp.c */
+void
+sonar_free_bogie (sonar_sensor_data *ssd, sonar_bogie *b)
+{
+ if (b->closure)
+ ssd->free_bogie_cb (ssd, b->closure);
+ free (b->name);
+ if (b->desc) free (b->desc);
+ free (b);
+}
+
+/* removes it from the list and frees it
+ */
+static void
+delete_bogie (sonar_sensor_data *ssd, sonar_bogie *b,
+ sonar_bogie **from_list)
+{
+ sonar_bogie *ob, *prev;
+ for (prev = 0, ob = *from_list; ob; prev = ob, ob = ob->next)
+ if (ob == b)
+ {
+ if (prev)
+ prev->next = b->next;
+ else
+ (*from_list) = b->next;
+ sonar_free_bogie (ssd, b);
+ break;
+ }
+}
+
+
+/* copies the bogie and adds it to the list.
+ if there's another bogie there with the same name, frees that one.
+ */
+static void
+copy_and_insert_bogie (sonar_sensor_data *ssd, sonar_bogie *b,
+ sonar_bogie **to_list)
+{
+ sonar_bogie *ob, *next;
+ if (!b) abort();
+ for (ob = *to_list, next = ob ? ob->next : 0;
+ ob;
+ ob = next, next = ob ? ob->next : 0)
+ {
+ if (ob == b) abort(); /* this will end badly */
+ if (!strcmp (ob->name, b->name)) /* match! */
+ {
+ delete_bogie (ssd, ob, to_list);
+ break;
+ }
+ }
+
+ b = sonar_copy_bogie (ssd, b);
+ b->next = *to_list;
+ *to_list = b;
+}
+
+
+static void
+update_sensor_data (sonar_configuration *sp)
+{
+ sonar_bogie *new_list = sp->ssd->scan_cb (sp->ssd);
+ sonar_bogie *b2;
+
+ /* If a bogie exists in 'new_list' but not 'pending', add it.
+ If a bogie exists in both, update it in 'pending'.
+ */
+ for (b2 = new_list; b2; b2 = b2->next)
+ {
+ if (debug_p > 2)
+ fprintf (stderr, "%s: updated: %s (%5.2f %5.2f %5.2f)\n",
+ progname, b2->name, b2->r, b2->th, b2->ttl);
+ copy_and_insert_bogie (sp->ssd, b2, &sp->pending);
+ }
+ if (debug_p > 2) fprintf (stderr, "\n");
+}
+
+
+/* Returns whether the given angle lies between two other angles.
+ When those angles cross 0, it assumes the wedge is the smaller one.
+ That is: 5 lies between 10 and 350 degrees (a 20 degree wedge).
+ */
+static Bool
+point_in_wedge (GLfloat th, GLfloat low, GLfloat high)
+{
+ if (low < high)
+ return (th > low && th <= high);
+ else
+ return (th <= high || th > low);
+}
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static void
+sweep (sonar_configuration *sp)
+{
+ sonar_bogie *b;
+
+ /* Move the sweep forward (clockwise).
+ */
+ GLfloat prev_sweep, this_sweep, tick;
+ GLfloat cycle_secs = 30 / speed; /* default to one cycle every N seconds */
+ this_sweep = ((cycle_secs - fmod (double_time() - sp->start_time +
+ sp->sweep_offset,
+ cycle_secs))
+ / cycle_secs
+ * M_PI * 2);
+ prev_sweep = sp->sweep_th;
+ tick = prev_sweep - this_sweep;
+ while (tick < 0) tick += M_PI*2;
+
+ sp->sweep_th = this_sweep;
+
+ if (this_sweep < 0 || this_sweep >= M_PI*2) abort();
+ if (prev_sweep < 0) /* skip first time */
+ return;
+
+ if (tick < 0 || tick >= M_PI*2) abort();
+
+
+ /* Go through the 'pending' sensor data, find those bogies who are
+ just now being swept, and move them from 'pending' to 'displayed'.
+ (Leave bogies that have not yet been swept alone: we'll get to
+ them when the sweep moves forward.)
+ */
+ b = sp->pending;
+ while (b)
+ {
+ sonar_bogie *next = b->next;
+ if (point_in_wedge (b->th, this_sweep, prev_sweep))
+ {
+ if (debug_p > 1) {
+ time_t t = time((time_t *) 0);
+ fprintf (stderr,
+ "%s: sweep hit: %02d:%02d: %s: (%5.2f %5.2f %5.2f;"
+ " th=[%.2f < %.2f <= %.2f])\n",
+ progname,
+ (int) (t / 60) % 60, (int) t % 60,
+ b->name, b->r, b->th, b->ttl,
+ this_sweep, b->th, prev_sweep);
+ }
+ b->ttl = M_PI * 2.1;
+ copy_and_insert_bogie (sp->ssd, b, &sp->displayed);
+ delete_bogie (sp->ssd, b, &sp->pending);
+ }
+ b = next;
+ }
+
+
+ /* Update TTL on all currently-displayed bogies; delete the dead.
+
+ Request sensor updates on the ones just now being swept.
+
+ Any updates go into 'pending' and might not show up until
+ the next time the sweep comes around. This is to prevent
+ already-drawn bogies from jumping to a new position without
+ having faded out first.
+ */
+ b = sp->displayed;
+ while (b)
+ {
+ sonar_bogie *next = b->next;
+ b->ttl -= tick;
+
+ if (b->ttl <= 0)
+ {
+ if (debug_p > 1)
+ fprintf (stderr, "%s: TTL expired: %s (%5.2f %5.2f %5.2f)\n",
+ progname, b->name, b->r, b->th, b->ttl);
+ delete_bogie (sp->ssd, b, &sp->displayed);
+ }
+ b = next;
+ }
+
+ update_sensor_data (sp);
+}
+
+
+static void
+draw_startup_blurb (ModeInfo *mi)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+
+ if (sp->error)
+ {
+ const char *msg = sp->error;
+ static const GLfloat color[4] = {0, 1, 0, 1};
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glTranslatef (0, 0, 0.3);
+ draw_text (mi, msg, 0, 0, 0, 30.0);
+
+ /* only leave error message up for N seconds */
+ if (sp->start_time + 6 < double_time())
+ {
+ free (sp->error);
+ sp->error = 0;
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_sonar (ModeInfo *mi, int width, int height)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ sp->line_thickness = (MI_IS_WIREFRAME (mi) ? 1 : MAX (1, height / 300.0));
+}
+
+
+ENTRYPOINT Bool
+sonar_handle_event (ModeInfo *mi, XEvent *event)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
+ return True;
+
+ return False;
+}
+
+ENTRYPOINT void
+init_sonar (ModeInfo *mi)
+{
+ sonar_configuration *sp;
+
+ MI_INIT (mi, sps);
+ sp = &sps[MI_SCREEN(mi)];
+ sp->glx_context = init_GL(mi);
+
+ reshape_sonar (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ sp->trackball = gltrackball_init (False);
+ sp->rot = make_rotator (0, 0, 0, 0, speed * 0.003, True);
+
+ sp->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+ check_gl_error ("loading font");
+
+ sp->table_list = glGenLists (1);
+ glNewList (sp->table_list, GL_COMPILE);
+ sp->table_polys = draw_table (mi);
+ glEndList ();
+
+ sp->screen_list = glGenLists (1);
+ glNewList (sp->screen_list, GL_COMPILE);
+ sp->screen_polys = draw_screen (mi, False, False);
+ glEndList ();
+
+ sp->grid_list = glGenLists (1);
+ glNewList (sp->grid_list, GL_COMPILE);
+ sp->grid_polys = draw_screen (mi, True, False);
+ glEndList ();
+
+ sp->sweep_list = glGenLists (1);
+ glNewList (sp->sweep_list, GL_COMPILE);
+ sp->sweep_polys = draw_screen (mi, False, True);
+ glEndList ();
+
+ sp->start_time = double_time ();
+ sp->sweep_offset = random() % 60;
+ sp->sweep_th = -1;
+ sp->state = MSG;
+}
+
+
+# ifdef TEST_ASYNC_NETDB
+
+# include <arpa/inet.h>
+
+static void _print_sockaddr (void *addr, socklen_t addrlen, FILE *stream)
+{
+ sa_family_t family = ((struct sockaddr *)addr)->sa_family;
+ char buf[256];
+ switch (family)
+ {
+ case AF_INET:
+ fputs (inet_ntoa(((struct sockaddr_in *)addr)->sin_addr), stream);
+ break;
+ case AF_INET6:
+ inet_ntop(family, &((struct sockaddr_in6 *)addr)->sin6_addr,
+ buf, sizeof (buf));
+ fputs (buf, stream);
+ break;
+ default:
+ abort();
+ break;
+ }
+}
+
+static void _print_error (int gai_error, int errno_error, FILE *stream)
+{
+ fputs (gai_error == EAI_SYSTEM ? strerror(errno_error) : gai_strerror(gai_error), stream);
+}
+
+# if ASYNC_NETDB_USE_GAI
+
+static void _print_thread (pthread_t thread, FILE *stream)
+{
+# ifdef __linux__
+ fprintf (stream, "%#lx", thread);
+# elif defined __APPLE__ && defined __MACH__
+ fprintf (stream, "%p", thread);
+# else
+ putc ('?', stream);
+# endif
+}
+
+# endif /* ASYNC_NETDB_USE_GAI */
+
+# endif /* TEST_ASYNC_NETDB */
+
+
+static void
+init_sensor (ModeInfo *mi)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+
+ if (sp->ssd) abort();
+
+ if (!ping_arg || !*ping_arg ||
+ !strcmp(ping_arg, "default") ||
+ !!strcmp (ping_arg, "simulation"))
+ /* sonar_init_ping() always disavows privs, even on failure. */
+ sp->ssd = sonar_init_ping (MI_DISPLAY (mi), &sp->error, &sp->desc,
+ ping_arg, ping_timeout, resolve_p, times_p,
+ debug_p);
+ else
+ setuid(getuid()); /* Disavow privs if not pinging. */
+
+ sp->start_time = double_time (); /* for error message timing */
+
+ if (!sp->ssd)
+ sp->ssd = sonar_init_simulation (MI_DISPLAY (mi), &sp->error, &sp->desc,
+ team_a_name, team_b_name,
+ team_a_count, team_b_count,
+ debug_p);
+ if (!sp->ssd)
+ abort();
+
+# if TEST_ASYNC_NETDB
+ /*
+ For extremely mysterious reasons, setuid apparently causes
+ pthread_join(3) to deadlock.
+ A rough guess at the sequence of events:
+ 1. Worker thread is created.
+ 2. Worker thread exits.
+ 3. setuid(getuid()) is called.
+ 4. pthread_join is called slightly later.
+
+ This may have something to do with glibc's use of SIGSETXID.
+ */
+
+ putc ('\n', stderr);
+
+# if !ASYNC_NETDB_USE_GAI
+ fputs ("Warning: getaddrinfo() was not available at compile time.\n", stderr);
+# endif
+
+ {
+ static const unsigned long addresses[] =
+ {
+ INADDR_LOOPBACK,
+ 0x00010203,
+ 0x08080808
+ };
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = 0;
+ addr.sin_addr.s_addr = htonl (addresses[random () % 3]);
+
+ sp->query0 = async_name_from_addr_start (MI_DISPLAY (mi), (void *)&addr,
+ sizeof(addr));
+ assert (sp->query0);
+ if (sp->query0)
+ {
+ fputs ("Looking up hostname from address: ", stderr);
+ _print_sockaddr (&addr, sizeof(addr), stderr);
+# if ASYNC_NETDB_USE_GAI
+ fputs (" @ ", stderr);
+ _print_thread (sp->query0->io.thread, stderr);
+# endif
+ putc ('\n', stderr);
+ }
+
+ if (!(random () & 3))
+ {
+ fputs ("Aborted hostname lookup (early)\n", stderr);
+ async_name_from_addr_cancel (sp->query0);
+ sp->query0 = NULL;
+ }
+ }
+
+ {
+ static const char *const hosts[] =
+ {
+ "example.com",
+ "invalid",
+ "ip6-localhost"
+ };
+ const char *host = hosts[random () % 3];
+
+ sp->query1 = async_addr_from_name_start (MI_DISPLAY(mi), host);
+
+ assert (sp->query1);
+
+ fprintf (stderr, "Looking up address from hostname: %s", host);
+# if ASYNC_NETDB_USE_GAI
+ fputs (" @ ", stderr);
+ _print_thread (sp->query1->io.thread, stderr);
+# endif
+ putc ('\n', stderr);
+
+ if (!(random () & 3))
+ {
+ fputs ("Aborted address lookup (early)\n", stderr);
+ async_addr_from_name_cancel (sp->query1);
+ sp->query1 = NULL;
+ }
+ }
+
+ fflush (stderr);
+# endif
+}
+
+
+ENTRYPOINT void
+draw_sonar (ModeInfo *mi)
+{
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!sp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.05, 0.07, 1.00, 0.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glShadeModel(GL_SMOOTH);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ {
+ GLfloat s = 7;
+ if (MI_WIDTH(mi) < MI_HEIGHT(mi))
+ s *= (MI_WIDTH(mi) / (float) MI_HEIGHT(mi));
+ glScalef (s,s,s);
+ }
+
+ gltrackball_rotate (sp->trackball);
+
+ if (wobble_p)
+ {
+ double x, y, z;
+ double max = 40;
+ get_position (sp->rot, &x, &y, &z, !sp->button_down_p);
+ glRotatef (max/2 - x*max, 1, 0, 0);
+ glRotatef (max/2 - z*max, 0, 1, 0);
+ }
+
+ mi->polygon_count = 0;
+
+ glPushMatrix(); /* table */
+ glCallList (sp->table_list);
+ mi->polygon_count += sp->table_polys;
+ glPopMatrix();
+
+ glPushMatrix(); /* text */
+ glTranslatef (0, 0, -0.01);
+ mi->polygon_count += draw_bogies (mi);
+ glPopMatrix();
+
+ glCallList (sp->screen_list); /* glass */
+ mi->polygon_count += sp->screen_polys;
+
+ glTranslatef (0, 0, 0.004); /* sweep */
+ glPushMatrix();
+ glRotatef ((sp->sweep_th * 180 / M_PI), 0, 0, 1);
+ if (sp->sweep_th >= 0)
+ glCallList (sp->sweep_list);
+ mi->polygon_count += sp->sweep_polys;
+ glPopMatrix();
+
+ glTranslatef (0, 0, 0.004); /* grid */
+ glCallList (sp->grid_list);
+ mi->polygon_count += sp->screen_polys;
+
+ glPushMatrix();
+ mi->polygon_count += draw_angles (mi); /* angles */
+ glPopMatrix();
+
+ if (sp->desc) /* local subnet */
+ {
+ glPushMatrix();
+ glTranslatef (0, 0, 0.00002);
+ mi->polygon_count += draw_text (mi, sp->desc, 1.35, M_PI * 0.75, 0, 10);
+ /* glRotatef (45, 0, 0, 1); */
+ /* mi->polygon_count += draw_text (mi, sp->desc, 1.2, M_PI/2, 0, 10); */
+ glPopMatrix();
+ }
+
+ if (sp->error)
+ sp->state = MSG;
+
+ switch (sp->state) {
+ case MSG: /* Frame 1: get "Resolving Hosts" on screen. */
+ draw_startup_blurb(mi);
+ sp->state++;
+ break;
+ case RESOLVE: /* Frame 2: gethostbyaddr may take a while. */
+ if (! sp->ssd)
+ init_sensor (mi);
+ sp->state++;
+ break;
+ case RUN: /* Frame N: ping away */
+ sweep (sp);
+ break;
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+
+# if TEST_ASYNC_NETDB
+ if(sp->query0 && async_name_from_addr_is_done (sp->query0))
+ {
+ if (!(random () & 3))
+ {
+ fputs ("Aborted hostname lookup (late)\n", stderr);
+ async_name_from_addr_cancel (sp->query0);
+ }
+ else
+ {
+ char *hostname = NULL;
+ int errno_error;
+ int gai_error = async_name_from_addr_finish (sp->query0, &hostname,
+ &errno_error);
+
+ if(gai_error)
+ {
+ fputs ("Couldn't get hostname: ", stderr);
+ _print_error (gai_error, errno_error, stderr);
+ putc ('\n', stderr);
+ }
+ else
+ {
+ fprintf (stderr, "Got a hostname: %s\n", hostname);
+ free (hostname);
+ }
+ }
+
+ sp->query0 = NULL;
+ }
+
+ if(sp->query1 && async_addr_from_name_is_done (sp->query1))
+ {
+ if (!(random () & 3))
+ {
+ fputs ("Aborted address lookup (late)\n", stderr);
+ async_addr_from_name_cancel (sp->query1);
+ }
+ else
+ {
+ async_netdb_sockaddr_storage_t addr;
+ socklen_t addrlen;
+ int errno_error;
+ int gai_error = async_addr_from_name_finish (sp->query1, &addr,
+ &addrlen, &errno_error);
+
+ if (gai_error)
+ {
+ fputs ("Couldn't get address: ", stderr);
+ _print_error (gai_error, errno_error, stderr);
+ putc ('\n', stderr);
+ }
+ else
+ {
+ fputs ("Got an address: ", stderr);
+ _print_sockaddr (&addr, addrlen, stderr);
+ putc ('\n', stderr);
+ }
+ }
+
+ sp->query1 = NULL;
+ }
+
+ fflush (stderr);
+# endif /* TEST_ASYNC_NETDB */
+}
+
+ENTRYPOINT void
+free_sonar (ModeInfo *mi)
+{
+#if 0
+ sonar_configuration *sp = &sps[MI_SCREEN(mi)];
+ sonar_bogie *b = sp->displayed;
+ while (b)
+ {
+ sonar_bogie *next = b->next;
+ free_bogie (sp->ssd, b);
+ b = next;
+ }
+ sp->displayed = 0;
+
+ b = sp->pending;
+ while (b)
+ {
+ sonar_bogie *next = b->next;
+ free_bogie (sp->ssd, b);
+ b = next;
+ }
+ sp->pending = 0;
+
+ sp->ssd->free_data_cb (sp->ssd, sp->ssd->closure);
+ free (sp->ssd);
+ sp->ssd = 0;
+#endif
+}
+
+XSCREENSAVER_MODULE ("Sonar", sonar)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/sonar.h b/hacks/glx/sonar.h
new file mode 100644
index 0000000..d6473e0
--- /dev/null
+++ b/hacks/glx/sonar.h
@@ -0,0 +1,71 @@
+/* sonar, Copyright (c) 1998-2012 Jamie Zawinski and Stephen Martin
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __SONAR_XSCREENSAVER_H__
+#define __SONAR_XSCREENSAVER_H__
+
+typedef struct sonar_sensor_data sonar_sensor_data;
+typedef struct sonar_bogie sonar_bogie;
+
+struct sonar_bogie {
+ void *closure;
+ char *name; /* bogie name, e.g., host name */
+ char *desc; /* second line of text, e.g., ping time */
+ double r; /* distance, 0 - 1.0 */
+ double th; /* heading, 0 - 2 pi */
+ double ttl; /* time to live, 0 - 2 pi */
+ sonar_bogie *next; /* next one in the list */
+};
+
+struct sonar_sensor_data {
+ void *closure;
+
+ /* Called frequently (every time the sweep moves).
+ Returns a list of new bogies to be added to the display list
+ once the sweep comes around to their position.
+ */
+ sonar_bogie *(*scan_cb) (sonar_sensor_data *);
+
+ /* Called when a bogie is freed, to free bogie->closure */
+ void (*free_bogie_cb) (sonar_sensor_data *, void *closure);
+
+ /* Called at exit, to free ssd->closure */
+ void (*free_data_cb) (sonar_sensor_data *, void *closure);
+};
+
+/* frees bogie and its contents, including calling the free_bogie_cb. */
+extern void sonar_free_bogie (sonar_sensor_data *ssd, sonar_bogie *b);
+
+/* makes a copy of the bogie, not including the 'closure' data. */
+extern sonar_bogie *sonar_copy_bogie (sonar_sensor_data *,
+ const sonar_bogie *);
+
+
+/* Set up and return sensor state for ICMP pings. */
+extern sonar_sensor_data *sonar_init_ping (Display *dpy,
+ char **error_ret,
+ char **desc_ret,
+ const char *subnets,
+ int ping_timeout,
+ Bool resolve_p, Bool times_p,
+ Bool debug_p);
+
+/* Set up and return sensor state for the simulation. */
+extern sonar_sensor_data *sonar_init_simulation (Display *dpy,
+ char **error_ret,
+ char **desc_ret,
+ const char *team_a_name,
+ const char *team_b_name,
+ int team_a_count,
+ int team_b_count,
+ Bool debug_p);
+
+#endif /* __SONAR_XSCREENSAVER_H__ */
diff --git a/hacks/glx/sonar.man b/hacks/glx/sonar.man
new file mode 100644
index 0000000..9927b3b
--- /dev/null
+++ b/hacks/glx/sonar.man
@@ -0,0 +1,169 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH Sonar 1 "12-Aug-08" "X Version 11"
+.SH NAME
+sonar - display a sonar scope
+.SH SYNOPSIS
+.B sonar
+[\-ping \fIhosts-or-subnets\fP]
+[\-ping\-timeout \fIint\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIratio\fP]
+[\-sweep-size \fIratio\fP]
+[\-font-size \fIpoints\fP]
+[\-team-a-name \fIstring\fP]
+[\-team-b-name \fIstring\fP]
+[\-team-a-count \fIint\fP]
+[\-team-b-count \fIint\fP]
+[\-no\-dns]
+[\-no\-times]
+[\-no\-wobble]
+[\-debug]
+[\-fps]
+.SH DESCRIPTION
+This draws a sonar screen that pings (get it?) the hosts on
+your local network, and plots their distance (response time) from you.
+The three rings represent ping times of approximately 2.5, 70 and 2,000
+milliseconds respectively.
+
+Alternately, it can run a simulation that doesn't involve hosts.
+.SH OPTIONS
+.I sonar
+understands the following options:
+.TP 8
+.B \-ping \fIhosts-or-subnets\fP
+The list of things to ping, separated by commas or spaces.
+Elements of this list may be:
+.RS 8
+.TP 12
+.B simulation
+Run in simulation mode instead of pinging real hosts.
+.TP 12
+.I hostname
+Ping the given host.
+.TP 12
+.I A.B.C.D
+Ping the given IPv4 address.
+.TP 12
+.B subnet
+Ping the local subnet. On systems where we can determine the local
+network mask, we use that; otherwise, we assume Class C (254 hosts).
+.TP 12
+.B subnet/\fINN\fP
+Ping a different-sized local subnet: e.g., \fBsubnet/28\fP would ping
+a 4-bit subnet (the nearest 14 addresses). On systems where we can
+determine the local network mask, we always use that.
+.TP 12
+.I A.B.C.D/NN
+Ping an arbitrary other IPv4 subnet. The address specifies
+the base address, and the part after the slash is how wide the
+subnet is. Typical values are /24 (for 254 addresses) and /28 (for
+14 addresses).
+.TP 12
+.I filename
+Ping the hosts listed in the given file. This file can be in the
+format used by \fI/etc/hosts\fP, or it can be any file that has host
+names as the first or second element on each line. If you use ssh,
+try this:
+
+ sonar -ping $HOME/.ssh/known_hosts
+.RE
+.TP 8
+.B \-ping\-timeout \fIint\fP
+The amount of time in milliseconds the program will wait for an answer
+to a ping.
+.TP 8
+.B \-delay \fIint\fP
+Delay between frames, in microseconds. Default 20000.
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-sweep-size \fIratio\fP
+How big the glowing sweep area should be. Default 0.3.
+.TP 8
+.B \-font-size \fIpoints\fP
+How large the text should be. Default 10 points.
+.TP 8
+.B \-no\-wobble
+Keep the display stationary instead of very slowly wobbling back and forth.
+.TP 8
+.B \-no\-dns
+Do not attempt to resolve IP addresses to hostnames.
+.TP 8
+.B \-no\-times
+Do not display ping times beneath the host names.
+.TP 8
+.B \-team-a-name \fIstring\fP
+In simulation mode, the name of team A.
+.TP 8
+.B \-team-b-name \fIstring\fP
+In simulation mode, the name of team B.
+.TP 8
+.B \-team-a-count \fIint\fP
+In simulation mode, the number of bogies on team A.
+.TP 8
+.B \-team-b-count \fIint\fP
+In simulation mode, the number of bogies on team B.
+.TP 8
+.B \-fps
+Display the current frame rate, polygon count, and CPU load.
+.SH NOTES
+On most Unix systems, this program must be installed as setuid root
+in order to ping hosts. This is because root privileges are needed
+to create an ICMP RAW socket. Privileges are disavowed shortly after
+startup (just after connecting to the X server) so this is believed
+to be safe:
+.EX
+chown root:root sonar
+chmod u+s sonar
+.EE
+It is not necessary to make it setuid on MacOS systems, because on
+MacOS, unprivileged programs can ping by using ICMP DGRAM sockets
+instead of ICMP RAW.
+
+In ping-mode, the display is a logarithmic scale, calibrated so that the
+three rings represent ping times of approximately 2.5, 70 and 2,000
+milliseconds respectively.
+
+This means that if any the hosts you are pinging take longer than 2
+seconds to respond, they won't show up; and if you are pinging several
+hosts with very fast response times, they will all appear close to the
+center of the screen (making their names hard to read.)
+.SH BUGS
+Does not support IPv6.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR ping (8),
+.BR ping6 (8)
+.SH COPYRIGHT
+Copyright \(co 2000-2012 by Jamie Zawinski <jwz@jwz.org>
+.RE
+Copyright \(co 1998 by Stephen Martin. <smartin@canada.com>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of this
+software for any purpose. It is provided "as is" without express or
+implied warranty.
+
+.SH AUTHORS
+Stephen Martin <smartin@canada.com>, 3-nov-1998.
+
+Subnet support, etc. added by Jamie Zawinski, 17-Jul-2000.
+
+Rewritten using OpenGL instead of X11 by Jamie Zawinski, 12-Aug-2008.
diff --git a/hacks/glx/sphere.c b/hacks/glx/sphere.c
new file mode 100644
index 0000000..dee4541
--- /dev/null
+++ b/hacks/glx/sphere.c
@@ -0,0 +1,155 @@
+/* sphere, Copyright (c) 2002 Paul Bourke <pbourke@swin.edu.au>,
+ * Copyright (c) 2010-2014 Jamie Zawinski <jwz@jwz.org>
+ * Utility function to create a unit sphere in GL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * 8-Oct-98: dek Released initial version of "glplanet"
+ * 21-Mar-01: jwz@jwz.org Broke sphere routine out into its own file.
+ * 28-Feb-02: jwz@jwz.org New implementation from Paul Bourke:
+ * http://astronomy.swin.edu.au/~pbourke/opengl/sphere/
+ * 21-Aug-10 jwz@jwz.org Converted to use glDrawArrays, for OpenGL ES.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_COCOA
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real X11 */
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "sphere.h"
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+static int
+unit_sphere_1 (int stacks, int slices, int wire_p, int half_p)
+{
+ int polys = 0;
+ int i,j;
+ double theta1, theta2, theta3;
+ XYZ p, n;
+ XYZ la = { 0, -1, 0 }, lb = { 0, -1, 0 };
+ XYZ c = {0, 0, 0}; /* center */
+ double r = 1.0; /* radius */
+ int stacks2 = stacks * 2;
+ int end = (half_p ? stacks/2 : stacks);
+
+ int mode = (wire_p ? GL_LINE_STRIP : GL_TRIANGLE_STRIP);
+
+ int arraysize, out;
+ struct { XYZ p; XYZ n; GLfloat s, t; } *array;
+
+ if (r < 0)
+ r = -r;
+ if (slices < 0)
+ slices = -slices;
+
+ arraysize = (stacks+1) * (slices+1) * (wire_p ? 4 : 2);
+ array = (void *) calloc (arraysize, sizeof(*array));
+ if (! array) abort();
+ out = 0;
+
+ if (slices < 4 || stacks < 2 || r <= 0)
+ {
+ mode = GL_POINTS;
+ array[out++].p = c;
+ goto END;
+ }
+
+ for (j = 0; j < end; j++)
+ {
+ theta1 = j * (M_PI+M_PI) / stacks2 - M_PI_2;
+ theta2 = (j + 1) * (M_PI+M_PI) / stacks2 - M_PI_2;
+
+ for (i = slices; i >= 0; i--)
+ {
+ theta3 = i * (M_PI+M_PI) / slices;
+
+ if (wire_p)
+ {
+ array[out++].p = lb; /* vertex */
+ array[out++].p = la; /* vertex */
+ }
+
+ n.x = cos (theta2) * cos(theta3);
+ n.y = sin (theta2);
+ n.z = cos (theta2) * sin(theta3);
+ p.x = c.x + r * n.x;
+ p.y = c.y + r * n.y;
+ p.z = c.z + r * n.z;
+
+ array[out].p = p; /* vertex */
+ array[out].n = n; /* normal */
+ array[out].s = i / (GLfloat) slices; /* texture */
+ array[out].t = 2*(j+1) / (GLfloat) stacks2;
+ out++;
+
+ if (wire_p) la = p;
+
+ n.x = cos(theta1) * cos(theta3);
+ n.y = sin(theta1);
+ n.z = cos(theta1) * sin(theta3);
+ p.x = c.x + r * n.x;
+ p.y = c.y + r * n.y;
+ p.z = c.z + r * n.z;
+
+ array[out].p = p; /* vertex */
+ array[out].n = n; /* normal */
+ array[out].s = i / (GLfloat) slices; /* texture */
+ array[out].t = 2*j / (GLfloat) stacks2;
+ out++;
+
+ if (out >= arraysize) abort();
+
+ if (wire_p) lb = p;
+ polys++;
+ }
+ }
+
+ END:
+
+ glEnableClientState (GL_VERTEX_ARRAY);
+ glEnableClientState (GL_NORMAL_ARRAY);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ glVertexPointer (3, GL_FLOAT, sizeof(*array), &array[0].p);
+ glNormalPointer ( GL_FLOAT, sizeof(*array), &array[0].n);
+ glTexCoordPointer (2, GL_FLOAT, sizeof(*array), &array[0].s);
+
+ glDrawArrays (mode, 0, out);
+
+ free (array);
+
+ return polys;
+}
+
+
+int
+unit_sphere (int stacks, int slices, int wire_p)
+{
+ return unit_sphere_1 (stacks, slices, wire_p, 0);
+}
+
+int
+unit_dome (int stacks, int slices, int wire_p)
+{
+ return unit_sphere_1 (stacks, slices, wire_p, 1);
+}
diff --git a/hacks/glx/sphere.h b/hacks/glx/sphere.h
new file mode 100644
index 0000000..9852377
--- /dev/null
+++ b/hacks/glx/sphere.h
@@ -0,0 +1,24 @@
+/* sphere, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
+ * Utility function to create a unit sphere in GL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __SPHERE_H__
+#define __SPHERE_H__
+
+/* Creates a diameter 1 sphere at 0, 0, 0.
+ stacks = number of north/south divisions (latitude)
+ slices = number of clockwise/counterclockwise divisions (longitude)
+ Returns number of polygons used.
+ */
+extern int unit_sphere (int stacks, int slices, int wire_p);
+extern int unit_dome (int stacks, int slices, int wire_p);
+
+#endif /* __SPHERE_H__ */
diff --git a/hacks/glx/spheremonics.c b/hacks/glx/spheremonics.c
new file mode 100644
index 0000000..9cefbf3
--- /dev/null
+++ b/hacks/glx/spheremonics.c
@@ -0,0 +1,882 @@
+/* xscreensaver, Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Algorithm by Paul Bourke <pbourke@swin.edu.au>
+ * http://astronomy.swin.edu.au/~pbourke/geometry/sphericalh/
+ * Screensaver veneer and parameter selection by jwz.
+ *
+ * Paul says:
+ *
+ * These closed objects are commonly called spherical harmonics,
+ * although they are only remotely related to the mathematical
+ * definition found in the solution to certain wave functions, most
+ * notable the eigenfunctions of angular momentum operators.
+ *
+ * The formula is quite simple: the form used here is based upon
+ * spherical (polar) coordinates (radius, theta, phi).
+ *
+ * r = sin(m0 phi) ^ m1 +
+ * cos(m2 phi) ^ m3 +
+ * sin(m4 theta) ^ m5 +
+ * cos(m6 theta) ^ m7
+ *
+ * Where phi ranges from 0 to pi (lines of latitude), and theta ranges
+ * from 0 to 2 pi (lines of longitude), and r is the radius. The
+ * parameters m0, m1, m2, m3, m4, m5, m6, and m7 are all integers
+ * greater than or equal to 0.
+ *
+ * As the degree increases, the objects become increasingly "pointed"
+ * and a large number of polygons are required to represent the surface
+ * faithfully.
+ *
+ * jwz adds:
+ *
+ * The eight parameters live in the `cc->m' array.
+ * Each time we permute the image, we alter *one* of those eight parameters.
+ * Each time we alter a parameter, we move it in the same direction (either
+ * toward larger or smaller values) in the range [0, 3].
+ *
+ * By altering only one parameter at a time, and only by small amounts,
+ * we tend to produce successive objects that are pretty similar to each
+ * other, so you can see a progression.
+ *
+ * It'd be nice if they were even closer together, so that it looked more
+ * like a morph, but, well, that's not how it works.
+ *
+ * There tends to be a dark stripe in the colormaps. I don't know why.
+ * Perhaps utils/colors.c is at fault?
+ *
+ * Note that this equation sometimes generates faces that are inside out:
+ * -parameters 01210111
+ * To make this work, we need to render back-faces with two-sided lighting:
+ * figuring out how to correct the winding and normals on those inside out
+ * surfaces would be too hard.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*labelfont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n"
+
+# define free_spheremonics 0
+# define release_spheremonics 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "texfont.h"
+#include "normals.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_DURATION "100"
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "False"
+#define DEF_RESOLUTION "64"
+#define DEF_BBOX "False"
+#define DEF_GRID "True"
+#define DEF_SMOOTH "True"
+#define DEF_PARMS "(default)"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint dlist, dlist2;
+ GLfloat scale;
+ XYZ bbox[2];
+
+ int resolution;
+ int ncolors;
+ XColor *colors;
+
+ int m[8];
+ int dm[8];
+ int m_max;
+
+ int tracer;
+ int mesher;
+ int polys1, polys2; /* polygon counts */
+
+ texture_font_data *font_data;
+
+ int change_tick;
+ int done_once;
+
+} spheremonics_configuration;
+
+static spheremonics_configuration *ccs = NULL;
+
+static char *do_spin;
+static Bool do_wander;
+static Bool do_bbox;
+static Bool do_grid;
+static int smooth_p;
+static char *static_parms;
+static int res;
+static int duration;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-resolution", ".resolution", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-bbox", ".bbox", XrmoptionNoArg, "True" },
+ { "+bbox", ".bbox", XrmoptionNoArg, "False" },
+ { "-grid", ".grid", XrmoptionNoArg, "True" },
+ { "+grid", ".grid", XrmoptionNoArg, "False" },
+ {"-smooth", ".smooth", XrmoptionNoArg, "True" },
+ {"+smooth", ".smooth", XrmoptionNoArg, "False" },
+ { "-parameters", ".parameters", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&res, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+ {&duration, "duration", "Duration", DEF_DURATION, t_Int},
+ {&do_bbox, "bbox", "BBox", DEF_BBOX, t_Bool},
+ {&do_grid, "grid", "Grid", DEF_GRID, t_Bool},
+ {&smooth_p, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+ {&static_parms, "parameters", "Parameters", DEF_PARMS, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt spheremonics_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_spheremonics (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+
+# endif
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+/* spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)]; */
+ int wire = MI_IS_WIREFRAME(mi);
+
+ static const GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0};
+
+ glEnable(GL_NORMALIZE);
+
+ if (!wire)
+ {
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+
+ /* With objects that have proper winding and normals set up on all
+ their faces, one can cull back-faces; however, these equations
+ generate objects that are sometimes "inside out", and determining
+ whether a facet has been inverted like that is really hard.
+ So we render both front and back faces, at a probable performance
+ penalty on non-accelerated systems.
+
+ When rendering back faces, we also need to do two-sided lighting,
+ or the fact that the normals are flipped gives us too-dark surfaces
+ on the inside-out surfaces.
+
+ This isn't generally something you'd want, because you end up
+ with half the lighting dynamic range (kind of.) So if you had
+ a sphere with correctly pointing normals, and a single light
+ source, it would be illuminated from two sides. In this case,
+ though, it saves us from a difficult and time consuming
+ inside/outside test. And we don't really care about a precise
+ lighting effect.
+ */
+ glDisable(GL_CULL_FACE);
+ glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, True);
+ }
+
+ if (smooth_p)
+ {
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+ }
+}
+
+
+
+/* generate the object */
+
+static XYZ
+sphere_eval (double theta, double phi, int *m)
+{
+ double r = 0;
+ XYZ p;
+
+ r += pow (sin(m[0] * phi), (double)m[1]);
+ r += pow (cos(m[2] * phi), (double)m[3]);
+ r += pow (sin(m[4] * theta),(double)m[5]);
+ r += pow (cos(m[6] * theta),(double)m[7]);
+
+ p.x = r * sin(phi) * cos(theta);
+ p.y = r * cos(phi);
+ p.z = r * sin(phi) * sin(theta);
+
+ return (p);
+}
+
+
+static void
+do_color (int i, XColor *colors)
+{
+ GLfloat c[4];
+ c[0] = colors[i].red / 65535.0;
+ c[1] = colors[i].green / 65535.0;
+ c[2] = colors[i].blue / 65535.0;
+ c[3] = 1.0;
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c);
+ glColor3f (c[0], c[1], c[2]);
+}
+
+
+static void
+draw_circle (ModeInfo *mi, Bool teeth_p)
+{
+ GLfloat th;
+ int tick = 0;
+ GLfloat x, y;
+ GLfloat step = (M_PI / 180);
+
+ glBegin(GL_LINE_LOOP);
+ for (th = 0; th < M_PI*2; th += step*5)
+ {
+ GLfloat r1 = 0.5;
+ x = cos (th);
+ y = sin (th);
+ glVertex3f(x*r1, y*r1, 0);
+ }
+ glEnd();
+
+ if (!teeth_p) return;
+
+ glBegin(GL_LINES);
+ for (th = 0; th < M_PI*2; th += step)
+ {
+ GLfloat r1 = 0.5;
+ GLfloat r2 = r1 - 0.01;
+ if (! (tick % 10))
+ r2 -= 0.02;
+ else if (! (tick % 5))
+ r2 -= 0.01;
+ tick++;
+
+ x = cos (th);
+ y = sin (th);
+ glVertex3f(x*r1, y*r1, 0);
+ glVertex3f(x*r2, y*r2, 0);
+ }
+ glEnd();
+}
+
+
+static void
+draw_bounding_box (ModeInfo *mi)
+{
+ /* spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)]; */
+
+ static const GLfloat c1[4] = { 0.2, 0.2, 0.6, 1.0 };
+ static const GLfloat c2[4] = { 1.0, 0.0, 0.0, 1.0 };
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat x1,y1,z1,x2,y2,z2;
+
+# if 0
+ x1 = cc->bbox[0].x;
+ y1 = cc->bbox[0].y;
+ z1 = cc->bbox[0].z;
+ x2 = cc->bbox[1].x;
+ y2 = cc->bbox[1].y;
+ z2 = cc->bbox[1].z;
+# else
+ x1 = y1 = z1 = -0.5;
+ x2 = y2 = z2 = 0.5;
+# endif
+
+ if (do_bbox && !wire)
+ {
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c1);
+ glFrontFace(GL_CCW);
+ glEnable(GL_CULL_FACE);
+
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 1, 0);
+ glVertex3f(x1, y1, z1); glVertex3f(x1, y1, z2);
+ glVertex3f(x2, y1, z2); glVertex3f(x2, y1, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, -1, 0);
+ glVertex3f(x2, y2, z1); glVertex3f(x2, y2, z2);
+ glVertex3f(x1, y2, z2); glVertex3f(x1, y2, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glVertex3f(x1, y1, z1); glVertex3f(x2, y1, z1);
+ glVertex3f(x2, y2, z1); glVertex3f(x1, y2, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 0, -1);
+ glVertex3f(x1, y2, z2); glVertex3f(x2, y2, z2);
+ glVertex3f(x2, y1, z2); glVertex3f(x1, y1, z2);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(1, 0, 0);
+ glVertex3f(x1, y2, z1); glVertex3f(x1, y2, z2);
+ glVertex3f(x1, y1, z2); glVertex3f(x1, y1, z1);
+ glEnd();
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(-1, 0, 0);
+ glVertex3f(x2, y1, z1); glVertex3f(x2, y1, z2);
+ glVertex3f(x2, y2, z2); glVertex3f(x2, y2, z1);
+ glEnd();
+ glDisable(GL_CULL_FACE);
+ }
+
+ if (do_grid)
+ {
+ glDisable (GL_LIGHTING);
+ glColor3f (c2[0], c2[1], c2[2]);
+ glPushMatrix();
+ glBegin(GL_LINES);
+ glVertex3f(0, -0.66, 0);
+ glVertex3f(0, 0.66, 0);
+ glEnd();
+ draw_circle (mi, True);
+ glRotatef(90, 1, 0, 0);
+ draw_circle (mi, True);
+ glRotatef(90, 0, 1, 0);
+ draw_circle (mi, True);
+ glPopMatrix();
+ }
+ else
+ {
+#if 0
+ glBegin(GL_LINES);
+ if (x1 > 0) x1 = 0; if (x2 < 0) x2 = 0;
+ if (y1 > 0) y1 = 0; if (y2 < 0) y2 = 0;
+ if (z1 > 0) z1 = 0; if (z2 < 0) z2 = 0;
+ glVertex3f(x1, 0, 0); glVertex3f(x2, 0, 0);
+ glVertex3f(0 , y1, 0); glVertex3f(0, y2, 0);
+ glVertex3f(0, 0, z1); glVertex3f(0, 0, z2);
+ glEnd();
+#endif
+ }
+}
+
+
+static void
+do_tracer (ModeInfo *mi)
+{
+ spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+ if (cc->tracer == -1 &&
+ cc->mesher == -1 &&
+ !(random() % (duration * 4)))
+ {
+ if (random() & 1)
+ cc->tracer = ((random() & 1) ? 0 : 180);
+ else
+ cc->mesher = ((random() % ((duration / 3) + 1)) +
+ (random() % ((duration / 3) + 1)));
+ }
+
+ if (cc->tracer >= 0)
+ {
+ int d = (90 - cc->tracer);
+ GLfloat th = d * (M_PI / 180);
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ GLfloat s = 1.5 / cc->scale;
+
+ if (s > 0.001)
+ {
+ static const GLfloat c[4] = { 0.6, 0.5, 1.0, 1.0 };
+
+ glDisable (GL_LIGHTING);
+
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0, 0, y*s/2);
+ s *= x;
+ glScalef(s, s, s);
+ glColor3f (c[0], c[1], c[2]);
+ draw_circle (mi, False);
+ glPopMatrix();
+
+ if (! MI_IS_WIREFRAME(mi)) glEnable (GL_LIGHTING);
+ }
+
+ cc->tracer += 5;
+ if (cc->tracer == 180 || cc->tracer == 360)
+ cc->tracer = -1;
+ }
+}
+
+
+static int
+unit_spheremonics (ModeInfo *mi,
+ int resolution, Bool wire, int *m, XColor *colors)
+{
+ spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int polys = 0;
+ int i, j;
+ double du, dv;
+ XYZ q[4];
+ XYZ n[4];
+ int res = (wire == 2
+ ? resolution / 2
+ : resolution);
+
+ cc->bbox[0].x = cc->bbox[0].y = cc->bbox[0].z = 0;
+ cc->bbox[1].x = cc->bbox[1].y = cc->bbox[1].z = 0;
+
+ du = (M_PI+M_PI) / (double)res; /* Theta */
+ dv = M_PI / (double)res; /* Phi */
+
+ if (wire)
+ glColor3f (1, 1, 1);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ for (i = 0; i < res; i++) {
+ double u = i * du;
+ for (j = 0; j < res; j++) {
+ double v = j * dv;
+ q[0] = sphere_eval (u, v, m);
+ n[0] = calc_normal(q[0],
+ sphere_eval (u+du/10, v, m),
+ sphere_eval (u, v+dv/10, m));
+ glNormal3f(n[0].x,n[0].y,n[0].z);
+ if (!wire) do_color (i, colors);
+ glVertex3f(q[0].x,q[0].y,q[0].z);
+
+ q[1] = sphere_eval (u+du, v, m);
+ n[1] = calc_normal(q[1],
+ sphere_eval (u+du+du/10, v, m),
+ sphere_eval (u+du, v+dv/10, m));
+ glNormal3f(n[1].x,n[1].y,n[1].z);
+ if (!wire) do_color ((i+1)%res, colors);
+ glVertex3f(q[1].x,q[1].y,q[1].z);
+
+ q[2] = sphere_eval (u+du, v+dv, m);
+ n[2] = calc_normal(q[2],
+ sphere_eval (u+du+du/10, v+dv, m),
+ sphere_eval (u+du, v+dv+dv/10, m));
+ glNormal3f(n[2].x,n[2].y,n[2].z);
+ if (!wire) do_color ((i+1)%res, colors);
+ glVertex3f(q[2].x,q[2].y,q[2].z);
+
+ q[3] = sphere_eval (u,v+dv, m);
+ n[3] = calc_normal(q[3],
+ sphere_eval (u+du/10, v+dv, m),
+ sphere_eval (u, v+dv+dv/10, m));
+ glNormal3f(n[3].x,n[3].y,n[3].z);
+ if (!wire) do_color (i, colors);
+ glVertex3f(q[3].x,q[3].y,q[3].z);
+
+ polys++;
+
+# define CHECK_BBOX(N) \
+ if (q[(N)].x < cc->bbox[0].x) cc->bbox[0].x = q[(N)].x; \
+ if (q[(N)].y < cc->bbox[0].y) cc->bbox[0].y = q[(N)].y; \
+ if (q[(N)].z < cc->bbox[0].z) cc->bbox[0].z = q[(N)].z; \
+ if (q[(N)].x > cc->bbox[1].x) cc->bbox[1].x = q[(N)].x; \
+ if (q[(N)].y > cc->bbox[1].y) cc->bbox[1].y = q[(N)].y; \
+ if (q[(N)].z > cc->bbox[1].z) cc->bbox[1].z = q[(N)].z
+
+ CHECK_BBOX(0);
+ CHECK_BBOX(1);
+ CHECK_BBOX(2);
+ CHECK_BBOX(3);
+# undef CHECK_BBOX
+ }
+ }
+ glEnd();
+
+ {
+ GLfloat w = cc->bbox[1].x - cc->bbox[0].x;
+ GLfloat h = cc->bbox[1].y - cc->bbox[0].y;
+ GLfloat d = cc->bbox[1].z - cc->bbox[0].z;
+ GLfloat wh = (w > h ? w : h);
+ GLfloat hd = (h > d ? h : d);
+ GLfloat scale = (wh > hd ? wh : hd);
+
+ cc->scale = 1/scale;
+
+ if (wire < 2 && (do_bbox || do_grid))
+ {
+ GLfloat s = scale * 1.5;
+ glPushMatrix();
+ glScalef(s, s, s);
+ draw_bounding_box (mi);
+ glPopMatrix();
+ }
+ }
+ return polys;
+}
+
+
+static void
+init_colors (ModeInfo *mi)
+{
+ spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+ cc->ncolors = cc->resolution;
+ cc->colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ cc->colors, &cc->ncolors,
+ False, 0, False);
+
+ /* brighter colors, please... */
+ for (i = 0; i < cc->ncolors; i++)
+ {
+ cc->colors[i].red = (cc->colors[i].red / 2) + 32767;
+ cc->colors[i].green = (cc->colors[i].green / 2) + 32767;
+ cc->colors[i].blue = (cc->colors[i].blue / 2) + 32767;
+ }
+}
+
+
+/* Pick one of the parameters to the function and tweak it up or down.
+ */
+static void
+tweak_parameters (ModeInfo *mi)
+{
+ spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+ /* If the -parameters command line option was specified, just use that
+ all the time.
+ */
+ if (static_parms &&
+ *static_parms &&
+ !!strcasecmp (static_parms, "(default)"))
+ {
+ unsigned long n;
+ char dummy;
+ if (8 == sscanf (static_parms, "%d %d %d %d %d %d %d %d %c",
+ &cc->m[0], &cc->m[1], &cc->m[2], &cc->m[3],
+ &cc->m[4], &cc->m[5], &cc->m[6], &cc->m[7],
+ &dummy))
+ return;
+ else if (strlen (static_parms) == 8 &&
+ 1 == sscanf (static_parms, "%lu %c", &n, &dummy))
+ {
+ const char *s = static_parms;
+ int i = 0;
+ while (*s)
+ cc->m[i++] = (*s++)-'0';
+ return;
+ }
+ fprintf (stderr,
+ "%s: -parameters must be a string of 8 ints (not \"%s\")\n",
+ progname, static_parms);
+ exit (1);
+ }
+
+ static_parms = 0;
+
+
+# define SHIFT(N) do { \
+ int n = (N); \
+ cc->m[n] += cc->dm[n]; \
+ if (cc->m[n] <= 0) \
+ cc->m[n] = 0, cc->dm[n] = -cc->dm[n]; \
+ else if (cc->m[n] >= cc->m_max) \
+ cc->m[n] = cc->m_max, cc->dm[n] = -cc->dm[n]; \
+ } while(0)
+
+/* else if (cc->m[n] >= cc->m_max/2 && (! (random() % 3))) \
+ cc->m[n] = cc->m_max/2, cc->dm[n] = -cc->dm[n]; \
+*/
+
+ switch(random() % 8)
+ {
+ case 0: SHIFT(0); break;
+ case 1: SHIFT(1); break;
+ case 2: SHIFT(2); break;
+ case 3: SHIFT(3); break;
+ case 4: SHIFT(4); break;
+ case 5: SHIFT(5); break;
+ case 6: SHIFT(6); break;
+ case 7: SHIFT(7); break;
+ default: abort(); break;
+ }
+# undef SHIFT
+
+#if 0
+ printf ("%s: state: %d %d %d %d %d %d %d %d\n",
+ progname,
+ cc->m[0], cc->m[1], cc->m[2], cc->m[3],
+ cc->m[4], cc->m[5], cc->m[6], cc->m[7]);
+#endif
+
+}
+
+
+static void
+generate_spheremonics (ModeInfo *mi)
+{
+ spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ tweak_parameters (mi);
+
+ if (!cc->done_once || (0 == (random() % 20)))
+ {
+ init_colors (mi);
+ cc->done_once = True;
+ }
+
+ {
+ glNewList(cc->dlist, GL_COMPILE);
+ cc->polys1 = unit_spheremonics (mi, cc->resolution, wire,cc->m,cc->colors);
+ glEndList();
+
+ glNewList(cc->dlist2, GL_COMPILE);
+ glPushMatrix();
+ glScalef (1.05, 1.05, 1.05);
+ cc->polys2 = unit_spheremonics (mi, cc->resolution, 2, cc->m, cc->colors);
+ glPopMatrix();
+ glEndList();
+ }
+}
+
+
+
+
+ENTRYPOINT void
+init_spheremonics (ModeInfo *mi)
+{
+ spheremonics_configuration *cc;
+
+ MI_INIT (mi, ccs);
+
+ cc = &ccs[MI_SCREEN(mi)];
+
+ if ((cc->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ reshape_spheremonics (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 1.0;
+ double wander_speed = 0.03;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ cc->rot = make_rotator (spinx ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ (spinx && spiny && spinz));
+ cc->trackball = gltrackball_init (True);
+ }
+
+ cc->tracer = -1;
+ cc->mesher = -1;
+
+ cc->resolution = res;
+
+ cc->font_data = load_texture_font (mi->dpy, "labelfont");
+
+ cc->dlist = glGenLists(1);
+ cc->dlist2 = glGenLists(1);
+
+ cc->m_max = 4; /* 9? */
+ {
+ unsigned int i;
+ for (i = 0; i < countof(cc->dm); i++)
+ cc->dm[i] = 1; /* going up! */
+
+ /* Generate a few more times so we don't always start off with a sphere */
+ for (i = 0; i < 5; i++)
+ tweak_parameters (mi);
+ }
+
+ generate_spheremonics(mi);
+}
+
+
+ENTRYPOINT Bool
+spheremonics_handle_event (ModeInfo *mi, XEvent *event)
+{
+ spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cc->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ cc->change_tick = duration;
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_spheremonics (ModeInfo *mi)
+{
+ spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!cc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cc->glx_context));
+
+ gl_init(mi);
+
+ glShadeModel(GL_SMOOTH);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (cc->rot, &x, &y, &z, !cc->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 6,
+ (z - 0.5) * 8);
+
+ gltrackball_rotate (cc->trackball);
+
+ get_rotation (cc->rot, &x, &y, &z, !cc->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ glScalef(7,7,7);
+
+ mi->polygon_count = 0;
+
+ glScalef (cc->scale, cc->scale, cc->scale);
+ glCallList (cc->dlist);
+ mi->polygon_count += cc->polys1;
+
+ if (cc->mesher >= 0 /* || cc->button_down_p */)
+ {
+ glDisable (GL_LIGHTING);
+ glCallList (cc->dlist2);
+ mi->polygon_count += cc->polys2;
+ if (cc->mesher >= 0)
+ cc->mesher--;
+ }
+ do_tracer(mi);
+
+
+ if (cc->button_down_p)
+ {
+ char buf[200];
+ sprintf (buf,
+ ((cc->m[0]<10 && cc->m[1]<10 && cc->m[2]<10 && cc->m[3]<10 &&
+ cc->m[4]<10 && cc->m[5]<10 && cc->m[6]<10 && cc->m[7]<10)
+ ? "%d%d%d%d%d%d%d%d"
+ : "%d %d %d %d %d %d %d %d"),
+ cc->m[0], cc->m[1], cc->m[2], cc->m[3],
+ cc->m[4], cc->m[5], cc->m[6], cc->m[7]);
+
+ glColor3f(1.0, 1.0, 0.0);
+ print_texture_label (mi->dpy, cc->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, buf);
+ }
+
+ if (!static_parms)
+ {
+ if (cc->change_tick++ >= duration && !cc->button_down_p)
+ {
+ generate_spheremonics(mi);
+ cc->change_tick = 0;
+ cc->mesher = -1; /* turn off the mesh when switching objects */
+ }
+ }
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Spheremonics", spheremonics)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/spheremonics.man b/hacks/glx/spheremonics.man
new file mode 100644
index 0000000..5e6f437
--- /dev/null
+++ b/hacks/glx/spheremonics.man
@@ -0,0 +1,92 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+spheremonics - 3d spherical harmonic shapes.
+.SH SYNOPSIS
+.B spheremonics
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-duration \fInumber\fP]
+[\-resolution \fInumber\fP]
+[\-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-wireframe]
+[\-no-smooth]
+[\-no-grid]
+[\-bbox]
+[\-fps]
+.SH DESCRIPTION
+These closed objects are commonly called spherical harmonics, although they
+are only remotely related to the mathematical definition found in the
+solution to certain wave functions, most notable the eigenfunctions of
+angular momentum operators.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-duration \fInumber\fP
+Duration. 5 - 1000. Default: 100.
+.TP 8
+.B \-resolution \fInumber\fP
+Resolution. 5 - 100. Default: 64.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin \fI[XYZ]\fP
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+Don't spin.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-smooth | \-no-smooth
+Smoothed Lines. Boolean.
+.TP 8
+.B \-grid | \-no-grid
+Draw Grid. Boolean.
+.TP 8
+.B \-bbox | \-no-bbox
+Draw Bounding Box. Boolean.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Paul Bourke and Jamie Zawinski. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Paul Bourke and Jamie Zawinski.
diff --git a/hacks/glx/splitflap.c b/hacks/glx/splitflap.c
new file mode 100644
index 0000000..b84a359
--- /dev/null
+++ b/hacks/glx/splitflap.c
@@ -0,0 +1,1408 @@
+/* splitflap, Copyright (c) 2015-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws a split-flap text display.
+ */
+
+#define FLAP_FONT "-*-helvetica-bold-r-normal-*-*-1440-*-*-*-*-*-*"
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*flapFont: " FLAP_FONT "\n" \
+ "*frameColor: #444444" "\n" \
+ "*caseColor: #666666" "\n" \
+ "*discColor: #888888" "\n" \
+ "*finColor: #222222" "\n" \
+ "*textColor: #FFFF00" "\n" \
+ "*multiSample: True \n" \
+ "*program: xscreensaver-text\n" \
+ "*usePty: False\n"
+
+# define release_splitflap 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_SPEED "1.0"
+#define DEF_WIDTH "22"
+#define DEF_HEIGHT "8"
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_FACE_FRONT "True"
+#define DEF_MODE "Text"
+
+#include "xlockmore.h"
+
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gltrackball.h"
+#include "rotator.h"
+#include "ximage-loader.h"
+#include "utf8wc.h"
+#include "textclient.h"
+#include "texfont.h"
+#include "gllist.h"
+
+extern const struct gllist
+ *splitflap_obj_box_quarter_frame, *splitflap_obj_disc_quarter,
+ *splitflap_obj_fin_edge_half, *splitflap_obj_fin_face_half;
+static struct gllist *splitflap_obj_outer_frame = 0;
+
+static const struct gllist * const *all_objs[] = {
+ &splitflap_obj_box_quarter_frame, &splitflap_obj_disc_quarter,
+ &splitflap_obj_fin_edge_half, &splitflap_obj_fin_face_half,
+ (const struct gllist * const *) &splitflap_obj_outer_frame
+};
+
+#define SPLITFLAP_QUARTER_FRAME 0
+#define SPLITFLAP_DISC_QUARTER 1
+#define SPLITFLAP_FIN_EDGE_HALF 2
+#define SPLITFLAP_FIN_FACE_HALF 3
+#define SPLITFLAP_OUTER_FRAME 4
+
+#define COLON_WIDTH 0.5
+
+typedef struct {
+ int target_index; /* desired character */
+ double current_index; /* currently displayed, fractional */
+ GLfloat sticky; /* bottom fin doesn't fall all the way */
+ int missing; /* which fin has snapped off, or -1 */
+ const char * const *spool; /* chars available for display */
+ int spool_size; /* how many fins on the spool */
+} flapper;
+
+typedef struct {
+ const char *text;
+ GLuint texid;
+ XCharStruct metrics;
+ int tex_width, tex_height;
+} texinfo;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool spinx, spiny, spinz;
+
+ texinfo *texinfo;
+ int texinfo_size;
+
+ GLuint *dlists;
+ GLfloat component_colors[countof(all_objs)][4];
+ GLfloat text_color[4];
+
+ flapper *flappers; /* grid_width * grid_height */
+
+ texture_font_data *font_data;
+ int ascent, descent;
+
+ text_data *tc;
+ unsigned char text[5];
+ int linger;
+ int clock_p;
+ Bool first_time_p;
+
+} splitflap_configuration;
+
+static const char * const digit_s1_spool[] = { " ", "1" };
+static const char * const digit_01_spool[] = { "0", "1" };
+static const char * const ap_spool[] = { "A", "P" };
+static const char * const m_spool[] = { "M" };
+static const char * const digit_05_spool[] = { "0", "1", "2", "3", "4", "5" };
+static const char * const digit_spool[] = {
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
+};
+
+static const char * const ascii_spool[] = {
+ " ", "!", "\"", "#", "$", "%", "&", "'",
+ "(", ")", "*", "+", ",", "-", ".", "/",
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+ ":", ";", "<", "=", ">", "?", "@",
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+ "[", "\\", "]", "^", "_", "`", "{", "|", "}", "~",
+};
+
+
+/* If we include these, the flappers just take too long. It's boring. */
+static const char * const latin1_spool[] = {
+ " ", "!", "\"", "#", "$", "%", "&", "'",
+ "(", ")", "*", "+", ",", "-", ".", "/",
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+ ":", ";", "<", "=", ">", "?", "@",
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+ "[", "\\", "]", "^", "_", "`", "{", "|", "}", "~",
+
+ "\302\241", "\302\242", "\302\243", "\302\245",
+ "\302\247", "\302\251", "\302\265", "\302\266",
+
+ "\303\200", "\303\201", "\303\202", "\303\203",
+ "\303\204", "\303\205", "\303\206", "\303\207",
+ "\303\210", "\303\211", "\303\212", "\303\213",
+ "\303\214", "\303\215", "\303\216", "\303\217",
+ "\303\220", "\303\221", "\303\222", "\303\223",
+ "\303\224", "\303\225", "\303\226", "\303\230",
+ "\303\231", "\303\232", "\303\233", "\303\234",
+ "\303\235", "\303\236", "\303\237", "\303\267",
+};
+
+
+static splitflap_configuration *bps = NULL;
+
+static GLfloat speed;
+static int grid_width, grid_height;
+static char *do_spin;
+static Bool do_wander;
+static Bool face_front_p;
+static char *mode_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-width", ".width", XrmoptionSepArg, 0 },
+ { "-height", ".height", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-front", ".faceFront", XrmoptionNoArg, "True" },
+ { "+front", ".faceFront", XrmoptionNoArg, "False" },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&grid_width, "width", "Width", DEF_WIDTH, t_Int},
+ {&grid_height, "height", "Height", DEF_HEIGHT, t_Int},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&face_front_p, "faceFront", "FaceFront", DEF_FACE_FRONT, t_Bool},
+ {&mode_str, "mode", "Mode", DEF_MODE, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt splitflap_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_splitflap (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (40.0, 1/h, 0.5, 25);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0, 0, 3, /* 10x lower than traditional, for better depth rez */
+ 0, 0, 0,
+ 0, 1, 0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+splitflap_handle_event (ModeInfo *mi, XEvent *event)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+static void
+init_textures (ModeInfo *mi)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ const char * const *spool = latin1_spool;
+ int max = countof(latin1_spool);
+
+ bp->texinfo = (texinfo *) calloc (max+1, sizeof(*bp->texinfo));
+ texture_string_metrics (bp->font_data, "", 0, &bp->ascent, &bp->descent);
+
+ for (i = 0; i < max; i++)
+ {
+ texinfo *ti = &bp->texinfo[i];
+ glGenTextures (1, &ti->texid);
+ glBindTexture (GL_TEXTURE_2D, ti->texid);
+
+ ti->text = spool[i];
+
+ /* fprintf(stderr, "%d \\%03o\\%03o %s\n", i,
+ (unsigned char) ti->text[0],
+ (unsigned char) ti->text[1],
+ ti->text); */
+
+ string_to_texture (bp->font_data, ti->text, &ti->metrics,
+ &ti->tex_width, &ti->tex_height);
+ }
+ bp->texinfo_size = i;
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+}
+
+
+static void
+parse_color (ModeInfo *mi, char *key, GLfloat color[4])
+{
+ XColor xcolor;
+ char *string = get_string_resource (mi->dpy, key, "Color");
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ key, string);
+ exit (1);
+ }
+
+ color[0] = xcolor.red / 65536.0;
+ color[1] = xcolor.green / 65536.0;
+ color[2] = xcolor.blue / 65536.0;
+ color[3] = 1;
+}
+
+
+static int draw_outer_frame (ModeInfo *mi);
+
+ENTRYPOINT void
+init_splitflap (ModeInfo *mi)
+{
+ splitflap_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+ bp->glx_context = init_GL(mi);
+ reshape_splitflap (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ bp->first_time_p = True;
+
+ if (!mode_str || !*mode_str || !strcasecmp(mode_str, "text"))
+ {
+ bp->clock_p = 0;
+ }
+ else if (!strcasecmp (mode_str, "clock") ||
+ !strcasecmp (mode_str, "clock12"))
+ {
+ bp->clock_p = 12;
+ grid_width = 8;
+ grid_height = 1;
+ }
+ else if (!strcasecmp (mode_str, "clock24"))
+ {
+ bp->clock_p = 24;
+ grid_width = 6;
+ grid_height = 1;
+ }
+ else
+ {
+ fprintf (stderr,
+ "%s: `mode' must be text, clock12 or clock24: not `%s'\n",
+ progname, mode_str);
+ exit (1);
+ }
+
+ if (! bp->clock_p)
+ {
+ bp->tc = textclient_open (MI_DISPLAY (mi));
+ bp->text[0] = 0;
+
+ if (grid_width > 10)
+ textclient_reshape (bp->tc,
+ grid_width, grid_height,
+ grid_width, grid_height,
+ 0);
+ }
+
+ if (bp->clock_p)
+ speed /= 4;
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.005;
+ double tilt_speed = 0.001;
+ double spin_accel = 0.5;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') bp->spinx = True;
+ else if (*s == 'y' || *s == 'Y') bp->spiny = True;
+ else if (*s == 'z' || *s == 'Z') bp->spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (bp->spinx ? spin_speed : 0,
+ bp->spiny ? spin_speed : 0,
+ bp->spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->rot2 = (face_front_p
+ ? make_rotator (0, 0, 0, 0, tilt_speed, True)
+ : 0);
+ bp->trackball = gltrackball_init (False);
+ }
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ parse_color (mi, "textColor", bp->text_color);
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+ char *key = 0;
+ GLfloat spec[4] = {0.4, 0.4, 0.4, 1.0};
+ GLfloat shiny = 80; /* 0-128 */
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (-90, 1, 0, 0);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+
+ switch (i) {
+ case SPLITFLAP_QUARTER_FRAME:
+ key = "frameColor";
+ break;
+ case SPLITFLAP_OUTER_FRAME:
+ key = "caseColor";
+ break;
+ case SPLITFLAP_DISC_QUARTER:
+ key = (wire ? "frameColor" : "discColor");
+ break;
+ case SPLITFLAP_FIN_EDGE_HALF:
+ case SPLITFLAP_FIN_FACE_HALF:
+ key = "finColor";
+ break;
+ default:
+ abort();
+ }
+
+ parse_color (mi, key, bp->component_colors[i]);
+
+ if (wire && i == SPLITFLAP_FIN_EDGE_HALF)
+ bp->component_colors[i][0] =
+ bp->component_colors[i][1] =
+ bp->component_colors[i][2] = 0.7;
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+
+ switch (i) {
+ case SPLITFLAP_OUTER_FRAME:
+ if (! splitflap_obj_outer_frame)
+ splitflap_obj_outer_frame =
+ (struct gllist *) calloc (1, sizeof(*splitflap_obj_outer_frame));
+ splitflap_obj_outer_frame->points = draw_outer_frame(mi);
+ break;
+ default:
+ renderList (gll, wire);
+ break;
+ }
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glEndList ();
+ }
+
+ if (grid_width < 1) grid_width = 1;
+ if (grid_height < 1) grid_height = 1;
+ bp->flappers = (flapper *) calloc (grid_width * grid_height,
+ sizeof (flapper));
+
+ for (i = 0; i < grid_width * grid_height; i++)
+ {
+ flapper *f = &bp->flappers[i];
+
+ if (!bp->clock_p)
+ {
+ f->spool = ascii_spool;
+ f->spool_size = countof (ascii_spool);
+ }
+ else
+ {
+ switch (i) {
+ case 0:
+ if (bp->clock_p == 12)
+ {
+ f->spool = digit_s1_spool;
+ f->spool_size = countof (digit_s1_spool);
+ }
+ else
+ {
+ f->spool = digit_01_spool;
+ f->spool_size = countof (digit_01_spool);
+ }
+ break;
+ case 1: case 3: case 5:
+ f->spool = digit_spool;
+ f->spool_size = countof (digit_spool);
+ break;
+ case 2: case 4:
+ f->spool = digit_05_spool;
+ f->spool_size = countof (digit_05_spool);
+ break;
+ case 6:
+ f->spool = ap_spool;
+ f->spool_size = countof (ap_spool);
+ break;
+ case 7:
+ f->spool = m_spool;
+ f->spool_size = countof (m_spool);
+ break;
+ default:
+ abort();
+ }
+ }
+
+ f->target_index = random() % f->spool_size;
+ /* f->target_index = 0; */
+ f->current_index = f->target_index;
+ f->missing = (((random() % 10) == 0)
+ ? (random() % f->spool_size)
+ : -1);
+ }
+
+ bp->font_data = load_texture_font (mi->dpy, "flapFont");
+ init_textures (mi);
+
+ reshape_splitflap (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+static int
+draw_component (ModeInfo *mi, int i)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
+ bp->component_colors[i]);
+ glCallList (bp->dlists[i]);
+ return (*all_objs[i])->points / 3;
+}
+
+
+static int
+draw_frame_quarter (ModeInfo *mi, flapper *f)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_component (mi, SPLITFLAP_QUARTER_FRAME);
+ glPopMatrix();
+ return count;
+}
+
+static int
+draw_disc_quarter (ModeInfo *mi, flapper *f)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_component (mi, SPLITFLAP_DISC_QUARTER);
+ glPopMatrix();
+ return count;
+}
+
+static int
+draw_fin_edge_half (ModeInfo *mi, flapper *f)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_component (mi, SPLITFLAP_FIN_EDGE_HALF);
+ glPopMatrix();
+ return count;
+}
+
+static int
+draw_fin_face_half (ModeInfo *mi, flapper *f)
+{
+ int count = 0;
+ if (MI_IS_WIREFRAME(mi)) return 0;
+ glPushMatrix();
+ count += draw_component (mi, SPLITFLAP_FIN_FACE_HALF);
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_frame (ModeInfo *mi, flapper *f)
+{
+ int count = 0;
+
+ glPushMatrix();
+
+ glFrontFace (GL_CCW);
+ count += draw_frame_quarter (mi, f);
+ count += draw_disc_quarter (mi, f);
+
+ glScalef (-1, 1, 1);
+ glFrontFace (GL_CW);
+ count += draw_frame_quarter (mi, f);
+ count += draw_disc_quarter (mi, f);
+
+ glScalef ( 1, -1, 1);
+ glFrontFace (GL_CCW);
+ count += draw_frame_quarter (mi, f);
+ count += draw_disc_quarter (mi, f);
+
+ glScalef (-1, 1, 1);
+ glFrontFace (GL_CW);
+ count += draw_frame_quarter (mi, f);
+ count += draw_disc_quarter (mi, f);
+
+ glPopMatrix();
+ return count;
+}
+
+
+static void
+draw_fin_text_quad (ModeInfo *mi, flapper *f, int index, Bool top_p)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ /* 15 / is weird
+ 27 ; descends too far
+ 32 @ is too wide
+ 59 [ descends too far
+ 79 A^ is taller than the font
+ 89 I` is weird
+ */
+
+ GLfloat z = 0.035; /* Lifted off the surface by this distance */
+ GLfloat bot = 0.013; /* Distance away from the mid gutter */
+ GLfloat scale = 1.8; /* Scale to fill the panel */
+
+ int lh = bp->ascent + bp->descent;
+ texinfo *ti;
+ GLfloat qx0, qy0, qx1, qy1;
+ GLfloat tx0, ty0, tx1, ty1;
+ XCharStruct overall;
+ int tex_width, tex_height;
+ int i;
+
+ for (i = 0; i < bp->texinfo_size; i++)
+ {
+ ti = &bp->texinfo[i];
+ if (!strcmp (f->spool[index], ti->text))
+ break;
+ }
+ if (i >= bp->texinfo_size) abort();
+
+ overall = ti->metrics;
+ tex_width = ti->tex_width;
+ tex_height = ti->tex_height;
+
+ if (bp->ascent < overall.ascent)
+ /* WTF! &Aacute; has a higher ascent than the font itself!
+ Scale it down so that it doesn't overlap the fin. */
+ scale *= bp->ascent / (GLfloat) overall.ascent * 0.98;
+
+ glPushMatrix();
+
+ glNormal3f (0, 0, 1);
+ glFrontFace (top_p ? GL_CCW : GL_CW);
+
+ if (! wire)
+ {
+ glBindTexture (GL_TEXTURE_2D, ti->texid);
+ enable_texture_string_parameters();
+ }
+
+ glTranslatef (0, 0, z); /* Move to just above the surface */
+ glScalef (1.0 / lh, 1.0 / lh, 1); /* Scale to font pixel coordinates */
+ glScalef (scale, scale, 1); /* Fill the panel with the font */
+
+ if (!top_p)
+ {
+ glRotatef (180, 0, 0, 1);
+ }
+
+ /* Position the XCharStruct origin at 0,0 in the scene. */
+ qx0 = -overall.lbearing;
+ qy0 = -overall.descent;
+ qx1 = overall.rbearing;
+ qy1 = overall.ascent;
+
+ /* Center horizontally. */
+ qx0 -= (overall.rbearing - overall.lbearing) / 2.0;
+ qx1 -= (overall.rbearing - overall.lbearing) / 2.0;
+
+
+ /* Move origin to below font descenders. */
+ qy0 += bp->descent;
+ qy1 += bp->descent;
+
+ /* Center vertically. */
+ qy0 -= (bp->ascent + bp->descent) / 2.0;
+ qy1 -= (bp->ascent + bp->descent) / 2.0;
+
+ /* Move the descenders down a bit, if there's room.
+ This means that weirdos like [ and $ might not be on the baseline.
+ #### This looks good with X11 fonts but bad with MacOS fonts. WTF?
+ */
+#ifndef HAVE_COCOA
+ {
+ GLfloat off = bp->descent / 3.0;
+ GLfloat max = bp->descent - off;
+ if (overall.descent > max)
+ off = max - overall.descent;
+ if (off < 0)
+ off = 0;
+ qy0 -= off;
+ qy1 -= off;
+ }
+# endif /* !HAVE_COCOA */
+
+ /* Attach the texture to the quad. */
+ tx0 = 0;
+ ty1 = 0;
+ tx1 = (overall.rbearing - overall.lbearing) / (GLfloat) tex_width;
+ ty0 = (overall.ascent + overall.descent) / (GLfloat) tex_height;
+
+ /* Convert from font ascent/descent to character ascent/descent. */
+
+ /* Flip texture horizontally on bottom panel. */
+ if (!top_p)
+ {
+ GLfloat s = tx0;
+ tx0 = tx1;
+ tx1 = s;
+ }
+
+
+ /* Cut the character in half, truncating just above the split line. */
+ {
+ GLfloat oqy0 = qy0;
+ GLfloat oqy1 = qy1;
+ GLfloat r0, r1;
+
+ bot *= lh * scale;
+
+ if (top_p)
+ {
+ if (qy0 < bot)
+ qy0 = bot;
+ }
+ else
+ {
+ if (qy1 > -bot)
+ qy1 = -bot;
+ }
+
+ r0 = (qy0 - oqy0) / (oqy1 - oqy0);
+ r1 = (qy1 - oqy1) / (oqy1 - oqy0);
+ ty0 -= r0 * (ty0 - ty1);
+ ty1 -= r1 * (ty0 - ty1);
+ }
+
+ glColor4fv (bp->text_color);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f (tx0, ty0); glVertex3f (qx0, qy0, 0);
+ glTexCoord2f (tx1, ty0); glVertex3f (qx1, qy0, 0);
+ glTexCoord2f (tx1, ty1); glVertex3f (qx1, qy1, 0);
+ glTexCoord2f (tx0, ty1); glVertex3f (qx0, qy1, 0);
+ glEnd();
+
+ glPopMatrix();
+
+ if (! wire)
+ {
+ glDisable (GL_BLEND);
+ glEnable (GL_LIGHTING);
+ glDisable (GL_TEXTURE_2D);
+ }
+}
+
+
+static int
+draw_fin (ModeInfo *mi, flapper *f, int front_index, int back_index,
+ Bool text_p)
+{
+ int count = 0;
+
+ glPushMatrix();
+
+ glFrontFace (GL_CCW);
+
+ if (! text_p)
+ count += draw_fin_edge_half (mi, f);
+
+ if (front_index >= 0)
+ {
+ if (text_p)
+ {
+ draw_fin_text_quad (mi, f, front_index, True);
+ count++;
+ }
+ else
+ count += draw_fin_face_half (mi, f);
+ }
+
+ glScalef (-1, 1, 1);
+ if (! text_p)
+ {
+ glFrontFace (GL_CW);
+ count += draw_fin_edge_half (mi, f);
+ if (front_index >= 0)
+ count += draw_fin_face_half (mi, f);
+ }
+
+ if (back_index >= 0)
+ {
+ glRotatef (180, 0, 1, 0);
+ if (text_p)
+ {
+ draw_fin_text_quad (mi, f, back_index, False);
+ count++;
+ }
+ else
+ {
+ count += draw_fin_face_half (mi, f);
+ glScalef (-1, 1, 1);
+ glFrontFace (GL_CCW);
+ count += draw_fin_face_half (mi, f);
+ }
+ }
+
+ glPopMatrix();
+ return count;
+}
+
+
+/* The case holding the grid of flappers.
+ */
+static int
+draw_outer_frame (ModeInfo *mi)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ int count = 0;
+ GLfloat w = grid_width;
+ GLfloat h = grid_height;
+ GLfloat d = 1;
+
+ if (bp->clock_p == 12)
+ w += COLON_WIDTH * 3;
+ else if (bp->clock_p == 24)
+ w += COLON_WIDTH * 2;
+
+ w += 0.2;
+ h += 0.2;
+
+ if (bp->clock_p) w += 0.25;
+ if (w > 3) w += 0.5;
+ if (h > 3) h += 0.5;
+
+ if (MI_IS_WIREFRAME(mi))
+ return 0;
+
+ glFrontFace (GL_CCW);
+ glPushMatrix();
+ glTranslatef (0, 1.03, 0);
+
+ glBegin (GL_QUADS);
+
+ glNormal3f ( 0, 1, 0); /* back */
+ glVertex3f (-w, d, h);
+ glVertex3f ( w, d, h);
+ glVertex3f ( w, d, -h);
+ glVertex3f (-w, d, -h);
+ count++;
+
+ glNormal3f ( 0, -1, 0); /* front */
+ glVertex3f (-w, -d, -h);
+ glVertex3f ( w, -d, -h);
+ glVertex3f ( w, -d, h);
+ glVertex3f (-w, -d, h);
+ count++;
+
+ glNormal3f ( 0, 0, 1); /* top */
+ glVertex3f (-w, -d, h);
+ glVertex3f ( w, -d, h);
+ glVertex3f ( w, d, h);
+ glVertex3f (-w, d, h);
+ count++;
+
+ glNormal3f ( 0, 0, -1); /* bottom */
+ glVertex3f (-w, d, -h);
+ glVertex3f ( w, d, -h);
+ glVertex3f ( w, -d, -h);
+ glVertex3f (-w, -d, -h);
+ count++;
+
+ glNormal3f ( 1, 0, 0); /* left */
+ glVertex3f ( w, -d, h);
+ glVertex3f ( w, -d, -h);
+ glVertex3f ( w, d, -h);
+ glVertex3f ( w, d, h);
+ count++;
+
+ glNormal3f (-1, 0, 0); /* right */
+ glVertex3f (-w, -d, -h);
+ glVertex3f (-w, -d, h);
+ glVertex3f (-w, d, h);
+ glVertex3f (-w, d, -h);
+ count++;
+
+ glEnd();
+ glPopMatrix();
+
+ return count;
+}
+
+
+static void
+tick_flapper (ModeInfo *mi, flapper *f)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ double prev = f->current_index;
+ Bool wrapped_p = False;
+
+ if (bp->button_down_p) return;
+ if (f->current_index == f->target_index)
+ return;
+
+ f->current_index += speed * 0.35; /* turn the crank */
+
+ while (f->current_index > f->spool_size)
+ {
+ f->current_index -= f->spool_size;
+ wrapped_p = True;
+ }
+
+ if (f->current_index < 0) abort();
+
+ if ((prev < f->target_index || wrapped_p) &&
+ f->current_index > f->target_index) /* just overshot */
+ f->current_index = f->target_index;
+}
+
+
+#define MOD(M,N) (((M)+(N)) % (N)) /* Works with negatives */
+
+static int
+draw_flapper (ModeInfo *mi, flapper *f, Bool text_p)
+{
+ int prev_index = floor (f->current_index);
+ int next_index = MOD (prev_index+1, f->spool_size);
+ int count = 0;
+ GLfloat epsilon = 0.02;
+ GLfloat r = f->current_index - prev_index;
+ Bool moving_p = (r > 0 && r < 1);
+ GLfloat sticky = f->sticky;
+
+ if (f->missing >= 0)
+ sticky = 0;
+
+ if (f->missing >= 0 &&
+ MOD (prev_index, f->spool_size) == f->missing)
+ {
+ moving_p = False;
+ sticky = 0;
+ }
+
+ if (!moving_p)
+ next_index = prev_index;
+
+ if (! text_p)
+ count += draw_frame (mi, f);
+
+ /* Top flap, flat: top half of target char */
+ if (!moving_p || !text_p || r > epsilon)
+ {
+ int p2 = next_index;
+
+ if (p2 == f->missing)
+ p2 = MOD (p2+1, f->spool_size);
+
+ count += draw_fin (mi, f, p2, -1, text_p);
+ }
+
+ /* Bottom flap, flat: bottom half of prev char */
+ if (!moving_p || !text_p || r < 1 - epsilon)
+ {
+ int p2 = prev_index;
+
+ if (!moving_p && sticky)
+ p2 = MOD (p2-1, f->spool_size);
+
+ if (f->missing >= 0 &&
+ p2 == MOD (f->missing+1, f->spool_size))
+ p2 = MOD (p2-1, f->spool_size);
+
+ glPushMatrix();
+ glRotatef (180, 1, 0, 0);
+ count += draw_fin (mi, f, -1, p2, text_p);
+ glPopMatrix();
+ }
+
+ /* Moving flap, front: top half of prev char */
+ /* Moving flap, back: bottom half of target char */
+ if (moving_p || sticky)
+ {
+ if (!moving_p)
+ r = 1.0;
+ if (sticky && r > 1 - sticky)
+ r = 1 - sticky;
+ glPushMatrix();
+ glRotatef (r * 180, 1, 0, 0);
+ count += draw_fin (mi, f, prev_index, next_index, text_p);
+ glPopMatrix();
+ }
+
+ return count;
+}
+
+
+static int
+draw_colon (ModeInfo *mi)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat s = 1.0 / (bp->ascent + bp->descent);
+ GLfloat z = 0.01;
+ int count = 0;
+ XCharStruct m;
+
+ texture_string_metrics (bp->font_data, ":", &m, 0, 0);
+
+ s *= 2;
+
+ glPushMatrix();
+
+ glTranslatef (-(1 + COLON_WIDTH), 0, 0);
+ glScalef (s, s, 1);
+
+ glTranslatef (-m.lbearing - (m.rbearing - m.lbearing)/2,
+ -(m.ascent + m.descent) / 2,
+ 0);
+
+ glEnable (GL_TEXTURE_2D);
+
+ /* draw the text five times, to give it a border. */
+ {
+ const XPoint offsets[] = {{ -1, -1 },
+ { -1, 1 },
+ { 1, 1 },
+ { 1, -1 },
+ { 0, 0 }};
+ int i;
+ GLfloat n = 1.5;
+
+ glColor3f (0, 0, 0);
+ for (i = 0; i < countof(offsets); i++)
+ {
+ glPushMatrix();
+ if (offsets[i].x == 0)
+ {
+ glColor4fv (bp->text_color);
+ glTranslatef (0, 0, z * 2);
+ }
+ glTranslatef (n * offsets[i].x, n * offsets[i].y, 0);
+ print_texture_string (bp->font_data, ":");
+ count++;
+ glPopMatrix();
+ }
+ }
+
+ glPopMatrix();
+
+ return count;
+}
+
+
+/* Reads and returns a single Unicode character from the text client.
+ */
+static unsigned long
+read_unicode (ModeInfo *mi)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ const unsigned char *end = bp->text + sizeof(bp->text) - 1; /* 4 bytes */
+ unsigned long uc = 0;
+ long L;
+ int i;
+
+ if (bp->clock_p || !bp->tc) abort();
+
+ /* Fill the buffer with available input.
+ */
+ i = strlen ((char *) bp->text);
+ while (i < (end - bp->text))
+ {
+ int c = textclient_getc (bp->tc);
+ if (c <= 0) break;
+ bp->text[i++] = (char) c;
+ bp->text[i] = 0;
+ }
+
+ /* Pop 1-4 bytes from the front of the buffer and extract a UTF8 character.
+ */
+ L = utf8_decode (bp->text, i, &uc);
+ if (L)
+ {
+ int j = end - bp->text - L;
+ memmove (bp->text, bp->text + L, j);
+ bp->text[j] = 0;
+ }
+ else
+ uc = 0;
+
+ return uc;
+}
+
+
+/* Given a Unicode character, finds the corresponding index on the spool,
+ if any. Returns 0 if not found.
+ */
+static int
+find_index (ModeInfo *mi, flapper *f, long uc)
+{
+ char string[5];
+ int L = utf8_encode (uc, string, sizeof(string) - 1);
+ int i;
+ if (L <= 0) return 0;
+ string[L] = 0;
+ for (i = 0; i < f->spool_size; i++)
+ {
+ if (!strcmp (string, f->spool[i]))
+ return i;
+ }
+ return 0;
+}
+
+
+/* Read input from the text client and populate the spool with it.
+ */
+static void
+fill_targets (ModeInfo *mi)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ int x, y;
+ Bool cls_p = False;
+
+ if (bp->clock_p)
+ {
+ char buf[80];
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ const char *fmt = (bp->clock_p == 24
+ ? "%H%M%S"
+ : "%I%M%S%p");
+ int i;
+ strftime (buf, sizeof(buf)-1, fmt, tm);
+ if (bp->clock_p == 12 && buf[0] == '0')
+ buf[0] = ' ';
+
+ for (i = 0; i < strlen(buf); i++)
+ {
+ flapper *f = &bp->flappers[i];
+ f->target_index = find_index (mi, f, buf[i]);
+ }
+ for (; i < grid_width * grid_height; i++)
+ {
+ flapper *f = &bp->flappers[i];
+ f->target_index = find_index (mi, f, ' ');
+ }
+ return;
+ }
+
+ for (y = 0; y < grid_height; y++)
+ {
+ Bool nl_p = False;
+ for (x = 0; x < grid_width; x++)
+ {
+ int i = y * grid_width + x;
+ flapper *f = &bp->flappers[i];
+ unsigned long uc = ((nl_p || cls_p) ? ' ' : read_unicode (mi));
+ if (uc == '\r' || uc == '\n')
+ nl_p = True;
+ else if (uc == 12) /* ^L */
+ cls_p = True;
+
+ /* Convert Unicode to the closest Latin1 equivalent. */
+ if (uc > 127)
+ {
+ Bool ascii_p = (f->spool != latin1_spool);
+ unsigned char s[5], *s2;
+ int L = utf8_encode (uc, (char *) s, sizeof(s));
+ s[L] = 0;
+ s2 = (unsigned char *) utf8_to_latin1 ((char *) s, ascii_p);
+
+ if (s2[0] < 128) /* ASCII */
+ uc = s2[0];
+ else /* Latin1 -> UTF8 -> Unicode */
+ {
+ s[0] = (s2[0] > 0xBF ? 0xC3 : 0xC2);
+ s[1] = s2[0] & (s2[0] > 0xBF ? 0xBF : 0xFF);
+ s[2] = 0;
+ utf8_decode (s, 2, &uc);
+ }
+
+ free (s2);
+ }
+
+ /* Upcase ASCII. Upcasing Unicrud would be rocket surgery. */
+ if (uc >= 'a' && uc <= 'z') uc += ('A'-'a');
+
+ f->target_index = find_index (mi, f, uc);
+
+ f->sticky = (((random() % 20) == 0)
+ ? 0.05 + frand(0.1) + frand(0.1)
+ : 0);
+ }
+ }
+
+# if 0
+ for (y = 0; y < grid_height; y++)
+ {
+ fprintf (stderr, "# ");
+ for (x = 0; x < grid_width; x++)
+ {
+ int i = y * grid_width + x;
+ flapper *f = &bp->flappers[i];
+ fprintf(stderr, "%s", bp->spool[f->target_index]);
+ }
+ fprintf (stderr, " #\n");
+ }
+ fprintf (stderr, "\n");
+# endif
+}
+
+
+static void
+draw_flappers (ModeInfo *mi, Bool text_p)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ int x, y;
+ int running = 0;
+
+ for (y = 0; y < grid_height; y++)
+ for (x = 0; x < grid_width; x++)
+ {
+ int i = (grid_height - y - 1) * grid_width + x;
+ flapper *f = &bp->flappers[i];
+ GLfloat xx = x;
+ GLfloat yy = y;
+
+ if (bp->clock_p)
+ {
+ if (x >= 2) xx += COLON_WIDTH;
+ if (x >= 4) xx += COLON_WIDTH;
+ if (x >= 6) xx += COLON_WIDTH;
+ }
+
+ xx *= 2.01;
+ yy *= 1.98;
+
+ glPushMatrix();
+ glTranslatef (xx, yy, 0);
+ mi->polygon_count += draw_flapper (mi, f, text_p);
+
+ if (text_p && bp->clock_p && (x == 2 || x == 4))
+ mi->polygon_count += draw_colon (mi);
+
+ glPopMatrix();
+
+ if (text_p)
+ {
+ tick_flapper (mi, f);
+ if (f->current_index != f->target_index)
+ running++;
+ }
+ }
+
+ if (text_p && !running)
+ {
+ if (bp->clock_p)
+ fill_targets (mi);
+ else if (bp->linger)
+ {
+ bp->linger--;
+ if (!bp->linger)
+ fill_targets (mi);
+ }
+ else
+ {
+ /* Base of 1 second, plus 1 second for every 25 characters.
+ Also multiply by speed? */
+ bp->linger = 30;
+ if (!bp->first_time_p)
+ bp->linger += (grid_width * grid_height * 1.2);
+ bp->first_time_p = False;
+ }
+ }
+}
+
+
+ENTRYPOINT void
+draw_splitflap (ModeInfo *mi)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ glScalef (0.1, 0.1, 0.1); /* because of gluLookAt */
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 8);
+
+ gltrackball_rotate (bp->trackball);
+
+ if (face_front_p)
+ {
+ double maxx = 120;
+ double maxy = 60;
+ double maxz = 45;
+ get_position (bp->rot2, &x, &y, &z, !bp->button_down_p);
+ if (bp->spinx) glRotatef (maxy/2 - x*maxy, 1, 0, 0);
+ if (bp->spiny) glRotatef (maxx/2 - y*maxx, 0, 1, 0);
+ if (bp->spinz) glRotatef (maxz/2 - z*maxz, 0, 0, 1);
+ }
+ else
+ {
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ }
+ }
+
+ /* Fit the whole grid on the screen */
+ {
+ GLfloat r = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int cells = (grid_width > grid_height
+ ? grid_width * r
+ : grid_height);
+ GLfloat s = 8;
+# ifdef HAVE_MOBILE
+ s *= 2; /* #### What. Why is this necessary? */
+#endif
+ s /= cells;
+ glScalef (s, s, s);
+ }
+
+ mi->polygon_count = 0;
+ mi->polygon_count += draw_component (mi, SPLITFLAP_OUTER_FRAME);
+
+ {
+ GLfloat xoff = (bp->clock_p == 12 ? COLON_WIDTH * 3 :
+ bp->clock_p == 24 ? COLON_WIDTH * 2 :
+ 0);
+ glTranslatef (1 - (grid_width + xoff), 1 - grid_height, 0);
+ }
+
+ /* We must render all text after all polygons, or alpha blending
+ doesn't work right. */
+ draw_flappers (mi, False);
+ draw_flappers (mi, True);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_splitflap (ModeInfo *mi)
+{
+ splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (bp->tc)
+ textclient_close (bp->tc);
+ bp->tc = 0;
+ /* #### bp->texinfo */
+}
+
+XSCREENSAVER_MODULE ("SplitFlap", splitflap)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/splitflap.dxf b/hacks/glx/splitflap.dxf
new file mode 100644
index 0000000..d00149a
--- /dev/null
+++ b/hacks/glx/splitflap.dxf
@@ -0,0 +1,1658 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-33.50000000000001
+20
+-1.2499999999999996
+30
+34.82654508887018
+11
+-33.500000000000014
+21
+-1.2499999999999996
+31
+30.826545088870194
+12
+-5.639932965095795e-15
+22
+-1.2499999999999996
+32
+30.826545088870194
+13
+-5.639932965095795e-15
+23
+-1.2499999999999996
+33
+30.826545088870194
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-33.500000000000014
+20
+-1.2499999999999996
+30
+30.826545088870194
+11
+-37.50000000000001
+21
+-1.2499999999999996
+31
+30.826545088870187
+12
+-33.50000000000001
+22
+-1.2499999999999996
+32
+17.66327254443509
+13
+-33.50000000000001
+23
+-1.2499999999999996
+33
+17.66327254443509
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-33.500000000000014
+20
+-1.2499999999999996
+30
+30.826545088870194
+11
+-33.50000000000001
+21
+-1.2499999999999996
+31
+17.66327254443509
+12
+-5.639932965095795e-15
+22
+-1.2499999999999996
+32
+30.826545088870194
+13
+-5.639932965095795e-15
+23
+-1.2499999999999996
+33
+30.826545088870194
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-5.639932965095795e-15
+20
+-1.2499999999999996
+30
+30.826545088870194
+11
+-33.50000000000001
+21
+-1.2499999999999996
+31
+17.66327254443509
+12
+-5.639932965095795e-15
+22
+-1.2499999999999996
+32
+17.66327254443509
+13
+-5.639932965095795e-15
+23
+-1.2499999999999996
+33
+17.66327254443509
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-33.50000000000001
+20
+-1.2499999999999996
+30
+34.82654508887018
+11
+-5.639932965095795e-15
+21
+-1.2499999999999996
+31
+30.826545088870194
+12
+-5.639932965095795e-15
+22
+-1.2499999999999996
+32
+34.82654508887018
+13
+-5.639932965095795e-15
+23
+-1.2499999999999996
+33
+34.82654508887018
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-37.50000000000001
+20
+-1.2499999999999996
+30
+30.826545088870187
+11
+-37.50000000000001
+21
+-1.2499999999999996
+31
+17.66327254443509
+12
+-33.50000000000001
+22
+-1.2499999999999996
+32
+17.66327254443509
+13
+-33.50000000000001
+23
+-1.2499999999999996
+33
+17.66327254443509
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-33.50000000000001
+20
+-1.2499999999999996
+30
+17.66327254443509
+11
+-5.639932965095795e-15
+21
+-1.2499999999999996
+31
+0.49999999999999906
+12
+-5.639932965095795e-15
+22
+-1.2499999999999996
+32
+17.66327254443509
+13
+-5.639932965095795e-15
+23
+-1.2499999999999996
+33
+17.66327254443509
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-33.50000000000001
+20
+-1.2499999999999996
+30
+17.66327254443509
+11
+-33.50000000000001
+21
+-1.2499999999999996
+31
+0.49999999999999906
+12
+-5.639932965095795e-15
+22
+-1.2499999999999996
+32
+0.49999999999999906
+13
+-5.639932965095795e-15
+23
+-1.2499999999999996
+33
+0.49999999999999906
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-36.96410161513776
+20
+-1.2499999999999996
+30
+32.82654508887019
+11
+-37.50000000000001
+21
+-1.2499999999999996
+31
+30.826545088870187
+12
+-33.500000000000014
+22
+-1.2499999999999996
+32
+30.826545088870194
+13
+-33.500000000000014
+23
+-1.2499999999999996
+33
+30.826545088870194
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-35.50000000000001
+20
+-1.2499999999999996
+30
+34.29064670400795
+11
+-36.96410161513776
+21
+-1.2499999999999996
+31
+32.82654508887019
+12
+-33.500000000000014
+22
+-1.2499999999999996
+32
+30.826545088870194
+13
+-33.500000000000014
+23
+-1.2499999999999996
+33
+30.826545088870194
+70
+0
+ 0
+3DFACE
+ 8
+fin_face_half
+10
+-33.50000000000001
+20
+-1.2499999999999996
+30
+34.82654508887018
+11
+-35.50000000000001
+21
+-1.2499999999999996
+31
+34.29064670400795
+12
+-33.500000000000014
+22
+-1.2499999999999996
+32
+30.826545088870194
+13
+-33.500000000000014
+23
+-1.2499999999999996
+33
+30.826545088870194
+70
+0
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-34.0
+20
+-3.27117099240816
+30
+-1.6097177653715823e-14
+11
+-38.5
+21
+-3.2711709924081642
+31
+3.105896849114554
+12
+-38.50000000000001
+22
+-3.2711709924081416
+32
+-1.6919798895287383e-14
+13
+-38.50000000000001
+23
+-3.2711709924081416
+33
+-1.6919798895287383e-14
+70
+1
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-38.5
+20
+-3.2711709924081642
+30
+3.105896849114554
+11
+-34.0
+21
+-3.27117099240816
+31
+-1.6097177653715823e-14
+12
+-33.999999999999986
+22
+-3.2711709924081824
+32
+3.105896849114554
+13
+-33.999999999999986
+23
+-3.2711709924081824
+33
+3.105896849114554
+70
+1
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-33.999999999999986
+20
+-1.6634404790586517
+30
+9.106028809813777
+11
+-38.5
+21
+-3.2711709924081642
+31
+3.105896849114554
+12
+-33.999999999999986
+22
+-3.2711709924081824
+32
+3.105896849114554
+13
+-33.999999999999986
+23
+-3.2711709924081824
+33
+3.105896849114554
+70
+1
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-38.5
+20
+-3.2711709924081642
+30
+3.105896849114554
+11
+-33.999999999999986
+21
+-1.6634404790586517
+31
+9.106028809813777
+12
+-38.5
+22
+-1.6634404790586328
+32
+9.106028809813777
+13
+-38.5
+23
+-1.6634404790586328
+33
+9.106028809813777
+70
+1
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-33.999999999999986
+20
+1.4999999999999922
+30
+14.585268446263385
+11
+-38.5
+21
+-1.6634404790586328
+31
+9.106028809813777
+12
+-33.999999999999986
+22
+-1.6634404790586517
+32
+9.106028809813777
+13
+-33.999999999999986
+23
+-1.6634404790586517
+33
+9.106028809813777
+70
+1
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-38.5
+20
+-1.6634404790586328
+30
+9.106028809813777
+11
+-33.999999999999986
+21
+1.4999999999999922
+31
+14.585268446263385
+12
+-38.5
+22
+1.4999999999999922
+32
+14.585268446263385
+13
+-38.5
+23
+1.4999999999999922
+33
+14.585268446263385
+70
+1
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-38.5
+20
+1.4999999999999922
+30
+-1.6919798895287383e-14
+11
+-38.50000000000001
+21
+-3.2711709924081416
+31
+-1.6919798895287383e-14
+12
+-38.5
+22
+-3.2711709924081642
+32
+3.105896849114554
+13
+-38.5
+23
+-3.2711709924081642
+33
+3.105896849114554
+70
+0
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-38.5
+20
+1.4999999999999922
+30
+-1.6919798895287383e-14
+11
+-38.5
+21
+-3.2711709924081642
+31
+3.105896849114554
+12
+-38.5
+22
+-1.6634404790586328
+32
+9.106028809813777
+13
+-38.5
+23
+-1.6634404790586328
+33
+9.106028809813777
+70
+0
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-33.999999999999986
+20
+1.4999999999999922
+30
+14.585268446263385
+11
+-33.999999999999986
+21
+-1.6634404790586517
+31
+9.106028809813777
+12
+-33.999999999999986
+22
+1.4999999999999922
+32
+-1.4804824033376462e-14
+13
+-33.999999999999986
+23
+1.4999999999999922
+33
+-1.4804824033376462e-14
+70
+0
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-33.999999999999986
+20
+1.4999999999999922
+30
+-1.4804824033376462e-14
+11
+-33.999999999999986
+21
+-3.2711709924081824
+31
+3.105896849114554
+12
+-34.0
+22
+-3.27117099240816
+32
+-1.6097177653715823e-14
+13
+-34.0
+23
+-3.27117099240816
+33
+-1.6097177653715823e-14
+70
+0
+ 0
+3DFACE
+ 8
+disc_quarter
+10
+-33.999999999999986
+20
+1.4999999999999922
+30
+-1.4804824033376462e-14
+11
+-33.999999999999986
+21
+-1.6634404790586517
+31
+9.106028809813777
+12
+-33.999999999999986
+22
+-3.2711709924081824
+32
+3.105896849114554
+13
+-33.999999999999986
+23
+-3.2711709924081824
+33
+3.105896849114554
+70
+0
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+5.639932965095795e-15
+20
+1.5000000000000084
+30
+35.826545088870176
+11
+-38.49999999999998
+21
+-1.9999999999999913
+31
+35.826545088870176
+12
+-38.499999999999986
+22
+1.5000000000000084
+32
+35.826545088870176
+13
+-38.499999999999986
+23
+1.5000000000000084
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-38.49999999999998
+20
+-1.9999999999999913
+30
+35.826545088870176
+11
+5.639932965095795e-15
+21
+1.5000000000000084
+31
+35.826545088870176
+12
+5.639932965095795e-15
+22
+-1.9999999999999913
+32
+35.826545088870176
+13
+5.639932965095795e-15
+23
+-1.9999999999999913
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-40.49999999999998
+20
+-1.9999999999999913
+30
+39.82654508887017
+11
+5.639932965095795e-15
+21
+2.500000000000008
+31
+39.82654508887017
+12
+-40.49999999999999
+22
+2.500000000000008
+32
+39.82654508887017
+13
+-40.49999999999999
+23
+2.500000000000008
+33
+39.82654508887017
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+5.639932965095795e-15
+20
+2.500000000000008
+30
+39.82654508887017
+11
+-40.49999999999998
+21
+-1.9999999999999913
+31
+39.82654508887017
+12
+5.639932965095795e-15
+22
+-1.9999999999999913
+32
+39.82654508887017
+13
+5.639932965095795e-15
+23
+-1.9999999999999913
+33
+39.82654508887017
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+5.639932965095795e-15
+20
+-1.9999999999999913
+30
+39.82654508887017
+11
+-38.49999999999998
+21
+-1.9999999999999913
+31
+35.826545088870176
+12
+5.639932965095795e-15
+22
+-1.9999999999999913
+32
+35.826545088870176
+13
+5.639932965095795e-15
+23
+-1.9999999999999913
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-38.49999999999998
+20
+-1.9999999999999913
+30
+35.826545088870176
+11
+5.639932965095795e-15
+21
+-1.9999999999999913
+31
+39.82654508887017
+12
+-40.49999999999998
+22
+-1.9999999999999913
+32
+35.826545088870176
+13
+-40.49999999999998
+23
+-1.9999999999999913
+33
+35.826545088870176
+70
+3
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-40.49999999999998
+20
+-1.9999999999999913
+30
+35.826545088870176
+11
+5.639932965095795e-15
+21
+-1.9999999999999913
+31
+39.82654508887017
+12
+-40.49999999999998
+22
+-1.9999999999999913
+32
+39.82654508887017
+13
+-40.49999999999998
+23
+-1.9999999999999913
+33
+39.82654508887017
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-40.49999999999999
+20
+2.500000000000008
+30
+39.82654508887017
+11
+-40.49999999999998
+21
+-1.9999999999999913
+31
+35.826545088870176
+12
+-40.49999999999998
+22
+-1.9999999999999913
+32
+39.82654508887017
+13
+-40.49999999999998
+23
+-1.9999999999999913
+33
+39.82654508887017
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-40.49999999999998
+20
+-1.9999999999999913
+30
+35.826545088870176
+11
+-40.49999999999999
+21
+2.500000000000008
+31
+39.82654508887017
+12
+-40.49999999999999
+22
+2.500000000000008
+32
+35.826545088870176
+13
+-40.49999999999999
+23
+2.500000000000008
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-40.49999999999999
+20
+2.500000000000008
+30
+35.826545088870176
+11
+-40.49999999999998
+21
+-1.9999999999999913
+31
+-0.0017362311270455954
+12
+-40.49999999999998
+22
+-1.9999999999999913
+32
+35.826545088870176
+13
+-40.49999999999998
+23
+-1.9999999999999913
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-40.49999999999998
+20
+-1.9999999999999913
+30
+-0.0017362311270455954
+11
+-40.49999999999999
+21
+2.500000000000008
+31
+35.826545088870176
+12
+-40.49999999999999
+22
+2.500000000000008
+32
+-0.0017362311270455954
+13
+-40.49999999999999
+23
+2.500000000000008
+33
+-0.0017362311270455954
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-38.5
+20
+-2.023352891115778
+30
+-1.6919798895287383e-14
+11
+-40.49999999999998
+21
+-1.9999999999999913
+31
+35.826545088870176
+12
+-40.49999999999998
+22
+-1.9999999999999913
+32
+-0.0017362311270455954
+13
+-40.49999999999998
+23
+-1.9999999999999913
+33
+-0.0017362311270455954
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-40.49999999999998
+20
+-1.9999999999999913
+30
+35.826545088870176
+11
+-38.5
+21
+-2.023352891115778
+31
+-1.6919798895287383e-14
+12
+-38.49999999999998
+22
+-1.9999999999999913
+32
+35.826545088870176
+13
+-38.49999999999998
+23
+-1.9999999999999913
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-38.499999999999986
+20
+1.500000000000011
+30
+-1.6919798895287383e-14
+11
+-38.49999999999998
+21
+-1.9999999999999913
+31
+35.826545088870176
+12
+-38.5
+22
+-2.023352891115778
+32
+-1.6919798895287383e-14
+13
+-38.5
+23
+-2.023352891115778
+33
+-1.6919798895287383e-14
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-38.49999999999998
+20
+-1.9999999999999913
+30
+35.826545088870176
+11
+-38.499999999999986
+21
+1.500000000000011
+31
+-1.6919798895287383e-14
+12
+-38.499999999999986
+22
+1.5000000000000084
+32
+35.826545088870176
+13
+-38.499999999999986
+23
+1.5000000000000084
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+5.639932965095795e-15
+20
+1.5000000000000084
+30
+35.826545088870176
+11
+-38.499999999999986
+21
+1.500000000000011
+31
+-1.6919798895287383e-14
+12
+5.639932965095795e-15
+22
+1.5000000000000084
+32
+-2.255973186038318e-14
+13
+5.639932965095795e-15
+23
+1.5000000000000084
+33
+-2.255973186038318e-14
+70
+1
+ 0
+3DFACE
+ 8
+box_quarter_frame
+10
+-38.499999999999986
+20
+1.500000000000011
+30
+-1.6919798895287383e-14
+11
+5.639932965095795e-15
+21
+1.5000000000000084
+31
+35.826545088870176
+12
+-38.499999999999986
+22
+1.5000000000000084
+32
+35.826545088870176
+13
+-38.499999999999986
+23
+1.5000000000000084
+33
+35.826545088870176
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-33.49999999999999
+20
+0.25000000000000006
+30
+17.66327254443509
+11
+-37.49999999999999
+21
+-1.2499999999999996
+31
+17.66327254443509
+12
+-37.49999999999999
+22
+0.25000000000000006
+32
+17.66327254443509
+13
+-37.49999999999999
+23
+0.25000000000000006
+33
+17.66327254443509
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-37.49999999999999
+20
+-1.2499999999999996
+30
+17.66327254443509
+11
+-33.49999999999999
+21
+0.25000000000000006
+31
+17.66327254443509
+12
+-33.49999999999999
+22
+-1.2499999999999996
+32
+17.66327254443509
+13
+-33.49999999999999
+23
+-1.2499999999999996
+33
+17.66327254443509
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-37.49999999999999
+20
+0.25000000000000006
+30
+30.826545088870187
+11
+-37.49999999999999
+21
+-1.2499999999999996
+31
+17.66327254443509
+12
+-37.49999999999999
+22
+-1.2499999999999996
+32
+30.826545088870187
+13
+-37.49999999999999
+23
+-1.2499999999999996
+33
+30.826545088870187
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-37.49999999999999
+20
+-1.2499999999999996
+30
+17.66327254443509
+11
+-37.49999999999999
+21
+0.25000000000000006
+31
+30.826545088870187
+12
+-37.49999999999999
+22
+0.25000000000000006
+32
+17.66327254443509
+13
+-37.49999999999999
+23
+0.25000000000000006
+33
+17.66327254443509
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+5.639932965095795e-15
+20
+-1.2499999999999996
+30
+34.82654508887018
+11
+-33.49999999999999
+21
+0.25000000000000006
+31
+34.82654508887018
+12
+-33.49999999999999
+22
+-1.2499999999999996
+32
+34.82654508887018
+13
+-33.49999999999999
+23
+-1.2499999999999996
+33
+34.82654508887018
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-33.49999999999999
+20
+0.25000000000000006
+30
+34.82654508887018
+11
+5.639932965095795e-15
+21
+-1.2499999999999996
+31
+34.82654508887018
+12
+5.639932965095795e-15
+22
+0.25000000000000006
+32
+34.82654508887018
+13
+5.639932965095795e-15
+23
+0.25000000000000006
+33
+34.82654508887018
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+5.639932965095795e-15
+20
+0.25000000000000006
+30
+0.49999999999999906
+11
+-33.49999999999999
+21
+-1.2499999999999996
+31
+0.49999999999999906
+12
+-33.49999999999999
+22
+0.25000000000000006
+32
+0.49999999999999906
+13
+-33.49999999999999
+23
+0.25000000000000006
+33
+0.49999999999999906
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-33.49999999999999
+20
+-1.2499999999999996
+30
+0.49999999999999906
+11
+5.639932965095795e-15
+21
+0.25000000000000006
+31
+0.49999999999999906
+12
+5.639932965095795e-15
+22
+-1.2499999999999996
+32
+0.49999999999999906
+13
+5.639932965095795e-15
+23
+-1.2499999999999996
+33
+0.49999999999999906
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-33.49999999999999
+20
+0.25000000000000006
+30
+17.66327254443509
+11
+-33.49999999999999
+21
+-1.2499999999999996
+31
+0.49999999999999906
+12
+-33.49999999999999
+22
+-1.2499999999999996
+32
+17.66327254443509
+13
+-33.49999999999999
+23
+-1.2499999999999996
+33
+17.66327254443509
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-33.49999999999999
+20
+-1.2499999999999996
+30
+0.49999999999999906
+11
+-33.49999999999999
+21
+0.25000000000000006
+31
+17.66327254443509
+12
+-33.49999999999999
+22
+0.25000000000000006
+32
+0.49999999999999906
+13
+-33.49999999999999
+23
+0.25000000000000006
+33
+0.49999999999999906
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-36.96410161513774
+20
+0.25000000000000006
+30
+32.82654508887019
+11
+-37.49999999999999
+21
+-1.2499999999999996
+31
+30.826545088870187
+12
+-36.96410161513774
+22
+-1.2499999999999996
+32
+32.82654508887019
+13
+-36.96410161513774
+23
+-1.2499999999999996
+33
+32.82654508887019
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-37.49999999999999
+20
+-1.2499999999999996
+30
+30.826545088870187
+11
+-36.96410161513774
+21
+0.25000000000000006
+31
+32.82654508887019
+12
+-37.49999999999999
+22
+0.25000000000000006
+32
+30.826545088870187
+13
+-37.49999999999999
+23
+0.25000000000000006
+33
+30.826545088870187
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-35.5
+20
+0.25000000000000006
+30
+34.29064670400795
+11
+-36.96410161513774
+21
+-1.2499999999999996
+31
+32.82654508887019
+12
+-35.5
+22
+-1.2499999999999996
+32
+34.29064670400795
+13
+-35.5
+23
+-1.2499999999999996
+33
+34.29064670400795
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-36.96410161513774
+20
+-1.2499999999999996
+30
+32.82654508887019
+11
+-35.5
+21
+0.25000000000000006
+31
+34.29064670400795
+12
+-36.96410161513774
+22
+0.25000000000000006
+32
+32.82654508887019
+13
+-36.96410161513774
+23
+0.25000000000000006
+33
+32.82654508887019
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-33.49999999999999
+20
+-1.2499999999999996
+30
+34.82654508887018
+11
+-35.5
+21
+0.25000000000000006
+31
+34.29064670400795
+12
+-35.5
+22
+-1.2499999999999996
+32
+34.29064670400795
+13
+-35.5
+23
+-1.2499999999999996
+33
+34.29064670400795
+70
+1
+ 0
+3DFACE
+ 8
+fin_edge_half
+10
+-35.5
+20
+0.25000000000000006
+30
+34.29064670400795
+11
+-33.49999999999999
+21
+-1.2499999999999996
+31
+34.82654508887018
+12
+-33.49999999999999
+22
+0.25000000000000006
+32
+34.82654508887018
+13
+-33.49999999999999
+23
+0.25000000000000006
+33
+34.82654508887018
+70
+1
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/hacks/glx/splitflap.man b/hacks/glx/splitflap.man
new file mode 100644
index 0000000..432f490
--- /dev/null
+++ b/hacks/glx/splitflap.man
@@ -0,0 +1,98 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+splitflap - a simulation of a split-flap electromechanical display.
+.SH SYNOPSIS
+.B splitflap
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fImicroseconds\fP]
+[\-speed \fIfloat\fP]
+[\-width \fIcolumns\fP]
+[\-height \fIrows\fP]
+[\-mode text | clock12 | clock24]
+[\-no-wander]
+[\-spin \fIaxes\fP]
+[\-no\-spin]
+[\-front] [\-no-front]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Simulates a split-flap display, an old style of electromechanical sign as
+seen in airports and train stations, and commonly used in alarm clocks in
+the 1960s and 1970s.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-width \fInumber\fP
+Columns of the display. Default: 22.
+.TP 8
+.B \-height \fInumber\fP
+Rows of the display. Default: 8.
+.TP 8
+.B \-mode clock12
+Display a 12-hour clock.
+.TP 8
+.B \-mode clock24
+Display a 24-hour clock.
+.TP 8
+.B \-front | \-no-front
+When spinning, never spin all the way around or upside down:
+always face mostly forward so that the text is easily readable.
+This is the default.
+.TP 8
+.B \-no\-front
+Allow spins to go all the way around or upside down.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin
+Which axes around which the text should spin. The default is "XYZ",
+meaning rotate it freely in space. "\fB\-spin Z\fP" would rotate the
+text in the plane of the screen while not rotating it into or out
+of the screen; etc.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2015 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/splitflap_obj.c b/hacks/glx/splitflap_obj.c
new file mode 100644
index 0000000..f814bb9
--- /dev/null
+++ b/hacks/glx/splitflap_obj.c
@@ -0,0 +1,200 @@
+/* Generated from "splitflap.dxf" on 04-May-2015.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ Components: box_quarter_frame, disc_quarter, fin_edge_half,
+ fin_face_half.
+ */
+
+#include "gllist.h"
+
+static const float splitflap_obj_box_quarter_frame_data[] = {
+ 0,0,-1,0,0.037037,0.884606,
+ 0,0,-1,-0.950617,-0.049383,0.884606,
+ 0,0,-1,-0.950617,0.037037,0.884606,
+ 0,0,-1,-0.950617,-0.049383,0.884606,
+ 0,0,-1,0,0.037037,0.884606,
+ 0,0,-1,0,-0.049383,0.884606,
+ 0,0,1,-1,-0.049383,0.983371,
+ 0,0,1,0,0.061728,0.983371,
+ 0,0,1,-1,0.061728,0.983371,
+ 0,0,1,0,0.061728,0.983371,
+ 0,0,1,-1,-0.049383,0.983371,
+ 0,0,1,0,-0.049383,0.983371,
+ 0,-1,0,0,-0.049383,0.983371,
+ 0,-1,0.000217,-0.950617,-0.049383,0.884606,
+ 0,-1,0,0,-0.049383,0.884606,
+ 0,-1,0.000217,-0.950617,-0.049383,0.884606,
+ 0,-1,0,0,-0.049383,0.983371,
+ -0.002919,-0.999996,0.000163,-1,-0.049383,0.884606,
+ -0.002919,-0.999996,0.000163,-1,-0.049383,0.884606,
+ 0,-1,0,0,-0.049383,0.983371,
+ 0,-1,0,-1,-0.049383,0.983371,
+ -1,0,0,-1,0.061728,0.983371,
+ -1,0,0,-1,-0.049383,0.884606,
+ -1,0,0,-1,-0.049383,0.983371,
+ -1,0,0,-1,-0.049383,0.884606,
+ -1,0,0,-1,0.061728,0.983371,
+ -1,0,0,-1,0.061728,0.884606,
+ -1,0,0,-1,0.061728,0.884606,
+ -1,0,0,-1,-0.049383,-0.000043,
+ -1,0,0,-1,-0.049383,0.884606,
+ -1,0,0,-1,-0.049383,-0.000043,
+ -1,0,0,-1,0.061728,0.884606,
+ -1,0,0,-1,0.061728,-0.000043,
+ -0.005838,-0.999983,0.000326,-0.950617,-0.049959,0,
+ -0.002919,-0.999996,0.000163,-1,-0.049383,0.884606,
+ -0.011676,-0.999932,0,-1,-0.049383,-0.000043,
+ -0.002919,-0.999996,0.000163,-1,-0.049383,0.884606,
+ -0.005838,-0.999983,0.000326,-0.950617,-0.049959,0,
+ 0,-1,0.000217,-0.950617,-0.049383,0.884606,
+ 1,0,0,-0.950617,0.037037,0,
+ 1,0,0,-0.950617,-0.049383,0.884606,
+ 1,0,0,-0.950617,-0.049959,0,
+ 1,0,0,-0.950617,-0.049383,0.884606,
+ 1,0,0,-0.950617,0.037037,0,
+ 1,0,0,-0.950617,0.037037,0.884606,
+ 0,-1,0,0,0.037037,0.884606,
+ 0,-1,0,-0.950617,0.037037,0,
+ 0,-1,0,0,0.037037,0,
+ 0,-1,0,-0.950617,0.037037,0,
+ 0,-1,0,0,0.037037,0.884606,
+ 0,-1,0,-0.950617,0.037037,0.884606
+};
+static const struct gllist splitflap_obj_box_quarter_frame_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 51, splitflap_obj_box_quarter_frame_data, 0
+};
+const struct gllist *splitflap_obj_box_quarter_frame = &splitflap_obj_box_quarter_frame_frame;
+
+static const float splitflap_obj_disc_quarter_data[] = {
+ 0,-1,0,-0.839506,-0.08077,0,
+ 0,-0.991445,0.130526,-0.950617,-0.08077,0.076689,
+ 0,-1,0,-0.950617,-0.08077,0,
+ 0,-0.991445,0.130526,-0.950617,-0.08077,0.076689,
+ 0,-1,0,-0.839506,-0.08077,0,
+ 0,-0.991445,0.130526,-0.839506,-0.08077,0.076689,
+ 0,-0.939769,0.341811,-0.839506,-0.041073,0.22484,
+ 0,-0.991445,0.130526,-0.950617,-0.08077,0.076689,
+ 0,-0.991445,0.130526,-0.839506,-0.08077,0.076689,
+ 0,-0.991445,0.130526,-0.950617,-0.08077,0.076689,
+ 0,-0.939769,0.341811,-0.839506,-0.041073,0.22484,
+ 0,-0.906214,0.42282,-0.950617,-0.041073,0.22484,
+ 0,-0.866025,0.5,-0.839506,0.037037,0.36013,
+ 0,-0.906214,0.42282,-0.950617,-0.041073,0.22484,
+ 0,-0.939769,0.341811,-0.839506,-0.041073,0.22484,
+ 0,-0.906214,0.42282,-0.950617,-0.041073,0.22484,
+ 0,-0.866025,0.5,-0.839506,0.037037,0.36013,
+ 0,-0.866025,0.5,-0.950617,0.037037,0.36013,
+ -1,0,0,-0.950617,0.037037,0,
+ -1,0,0,-0.950617,-0.08077,0,
+ -1,0,0,-0.950617,-0.08077,0.076689,
+ -1,0,0,-0.950617,0.037037,0,
+ -1,0,0,-0.950617,-0.08077,0.076689,
+ -1,0,0,-0.950617,-0.041073,0.22484,
+ 1,0,0,-0.839506,0.037037,0.36013,
+ 1,0,0,-0.839506,-0.041073,0.22484,
+ 1,0,0,-0.839506,0.037037,0,
+ 1,0,0,-0.839506,0.037037,0,
+ 1,0,0,-0.839506,-0.08077,0.076689,
+ 1,0,0,-0.839506,-0.08077,0,
+ 1,0,0,-0.839506,0.037037,0,
+ 1,0,0,-0.839506,-0.041073,0.22484,
+ 1,0,0,-0.839506,-0.08077,0.076689
+};
+static const struct gllist splitflap_obj_disc_quarter_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 33, splitflap_obj_disc_quarter_data, 0
+};
+const struct gllist *splitflap_obj_disc_quarter = &splitflap_obj_disc_quarter_frame;
+
+static const float splitflap_obj_fin_edge_half_data[] = {
+ 0,0,-1,-0.82716,0.006173,0.43613,
+ 0,0,-1,-0.925926,-0.030864,0.43613,
+ 0,0,-1,-0.925926,0.006173,0.43613,
+ 0,0,-1,-0.925926,-0.030864,0.43613,
+ 0,0,-1,-0.82716,0.006173,0.43613,
+ 0,0,-1,-0.82716,-0.030864,0.43613,
+ -0.996214,0,0.086934,-0.925926,0.006173,0.761149,
+ -1,0,0,-0.925926,-0.030864,0.43613,
+ -0.984769,0,0.173868,-0.925926,-0.030864,0.761149,
+ -1,0,0,-0.925926,-0.030864,0.43613,
+ -0.996214,0,0.086934,-0.925926,0.006173,0.761149,
+ -1,0,0,-0.925926,0.006173,0.43613,
+ 0,0,1,0,-0.030864,0.859915,
+ -0.086934,0,0.996214,-0.82716,0.006173,0.859915,
+ -0.173868,0,0.984769,-0.82716,-0.030864,0.859915,
+ -0.086934,0,0.996214,-0.82716,0.006173,0.859915,
+ 0,0,1,0,-0.030864,0.859915,
+ 0,0,1,0,0.006173,0.859915,
+ 0,0,-1,0,0.006173,0.012346,
+ 0,0,-1,-0.82716,-0.030864,0.012346,
+ 0,0,-1,-0.82716,0.006173,0.012346,
+ 0,0,-1,-0.82716,-0.030864,0.012346,
+ 0,0,-1,0,0.006173,0.012346,
+ 0,0,-1,0,-0.030864,0.012346,
+ -1,0,0,-0.82716,0.006173,0.43613,
+ -1,0,0,-0.82716,-0.030864,0.012346,
+ -1,0,0,-0.82716,-0.030864,0.43613,
+ -1,0,0,-0.82716,-0.030864,0.012346,
+ -1,0,0,-0.82716,0.006173,0.43613,
+ -1,0,0,-0.82716,0.006173,0.012346,
+ -0.907073,0,0.420974,-0.912694,0.006173,0.810532,
+ -0.984769,0,0.173868,-0.925926,-0.030864,0.761149,
+ -0.81811,0,0.575061,-0.912694,-0.030864,0.810532,
+ -0.984769,0,0.173868,-0.925926,-0.030864,0.761149,
+ -0.907073,0,0.420974,-0.912694,0.006173,0.810532,
+ -0.996214,0,0.086934,-0.925926,0.006173,0.761149,
+ -0.707107,0,0.707107,-0.876543,0.006173,0.846683,
+ -0.81811,0,0.575061,-0.912694,-0.030864,0.810532,
+ -0.707107,0,0.707107,-0.876543,-0.030864,0.846683,
+ -0.81811,0,0.575061,-0.912694,-0.030864,0.810532,
+ -0.707107,0,0.707107,-0.876543,0.006173,0.846683,
+ -0.907073,0,0.420974,-0.912694,0.006173,0.810532,
+ -0.173868,0,0.984769,-0.82716,-0.030864,0.859915,
+ -0.258819,0,0.965926,-0.876543,0.006173,0.846683,
+ -0.258819,0,0.965926,-0.876543,-0.030864,0.846683,
+ -0.258819,0,0.965926,-0.876543,0.006173,0.846683,
+ -0.173868,0,0.984769,-0.82716,-0.030864,0.859915,
+ -0.086934,0,0.996214,-0.82716,0.006173,0.859915
+};
+static const struct gllist splitflap_obj_fin_edge_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 48, splitflap_obj_fin_edge_half_data, 0
+};
+const struct gllist *splitflap_obj_fin_edge_half = &splitflap_obj_fin_edge_half_frame;
+
+static const float splitflap_obj_fin_face_half_data[] = {
+ 0,-1,0,-0.82716,-0.030864,0.859915,
+ 0,-1,0,-0.82716,-0.030864,0.761149,
+ 0,-1,0,0,-0.030864,0.761149,
+ 0,-1,0,-0.82716,-0.030864,0.761149,
+ 0,-1,0,-0.925926,-0.030864,0.761149,
+ 0,-1,0,-0.82716,-0.030864,0.43613,
+ 0,-1,0,-0.82716,-0.030864,0.761149,
+ 0,-1,0,-0.82716,-0.030864,0.43613,
+ 0,-1,0,0,-0.030864,0.761149,
+ 0,-1,0,0,-0.030864,0.761149,
+ 0,-1,0,-0.82716,-0.030864,0.43613,
+ 0,-1,0,0,-0.030864,0.43613,
+ 0,-1,0,-0.82716,-0.030864,0.859915,
+ 0,-1,0,0,-0.030864,0.761149,
+ 0,-1,0,0,-0.030864,0.859915,
+ 0,-1,0,-0.925926,-0.030864,0.761149,
+ 0,-1,0,-0.925926,-0.030864,0.43613,
+ 0,-1,0,-0.82716,-0.030864,0.43613,
+ 0,-1,0,-0.82716,-0.030864,0.43613,
+ 0,-1,0,0,-0.030864,0.012346,
+ 0,-1,0,0,-0.030864,0.43613,
+ 0,-1,0,-0.82716,-0.030864,0.43613,
+ 0,-1,0,-0.82716,-0.030864,0.012346,
+ 0,-1,0,0,-0.030864,0.012346,
+ 0,-1,0,-0.912694,-0.030864,0.810532,
+ 0,-1,0,-0.925926,-0.030864,0.761149,
+ 0,-1,0,-0.82716,-0.030864,0.761149,
+ 0,-1,0,-0.876543,-0.030864,0.846683,
+ 0,-1,0,-0.912694,-0.030864,0.810532,
+ 0,-1,0,-0.82716,-0.030864,0.761149,
+ 0,-1,0,-0.82716,-0.030864,0.859915,
+ 0,-1,0,-0.876543,-0.030864,0.846683,
+ 0,-1,0,-0.82716,-0.030864,0.761149
+};
+static const struct gllist splitflap_obj_fin_face_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 33, splitflap_obj_fin_face_half_data, 0
+};
+const struct gllist *splitflap_obj_fin_face_half = &splitflap_obj_fin_face_half_frame;
diff --git a/hacks/glx/splodesic.c b/hacks/glx/splodesic.c
new file mode 100644
index 0000000..2823133
--- /dev/null
+++ b/hacks/glx/splodesic.c
@@ -0,0 +1,640 @@
+/* splodesic, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_splodesic 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_FREQ "4"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+typedef struct triangle triangle;
+struct triangle {
+ XYZ p[3];
+ triangle *next;
+ triangle *neighbors[3];
+ GLfloat altitude;
+ GLfloat velocity;
+ GLfloat thrust;
+ int thrust_duration;
+ int refcount;
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int count;
+ triangle *triangles;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+} splodesic_configuration;
+
+static splodesic_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static int depth_arg;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-depth", ".freq", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&depth_arg, "freq", "Depth", DEF_FREQ, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt splodesic_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Creates a triangle specified by 3 polar endpoints.
+ */
+static void
+make_triangle1 (ModeInfo *mi, LL v1, LL v2, LL v3)
+{
+ splodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ triangle *t = (triangle *) calloc (1, sizeof(*t));
+
+ t->p[0].x = cos (v1.a) * cos (v1.o);
+ t->p[0].y = cos (v1.a) * sin (v1.o);
+ t->p[0].z = sin (v1.a);
+
+ t->p[1].x = cos (v2.a) * cos (v2.o);
+ t->p[1].y = cos (v2.a) * sin (v2.o);
+ t->p[1].z = sin (v2.a);
+
+ t->p[2].x = cos (v3.a) * cos (v3.o);
+ t->p[2].y = cos (v3.a) * sin (v3.o);
+ t->p[2].z = sin (v3.a);
+
+ t->next = bp->triangles;
+ bp->triangles = t;
+ bp->count++;
+}
+
+
+/* Computes the midpoint of a line between two polar coords.
+ */
+static void
+midpoint2 (LL v1, LL v2, LL *vm_ret,
+ XYZ *p1_ret, XYZ *p2_ret, XYZ *pm_ret)
+{
+ XYZ p1, p2, pm;
+ LL vm;
+ GLfloat hyp;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ pm.x = (p1.x + p2.x) / 2;
+ pm.y = (p1.y + p2.y) / 2;
+ pm.z = (p1.z + p2.z) / 2;
+
+ vm.o = atan2 (pm.y, pm.x);
+ hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
+ vm.a = atan2 (pm.z, hyp);
+
+ *p1_ret = p1;
+ *p2_ret = p2;
+ *pm_ret = pm;
+ *vm_ret = vm;
+}
+
+
+/* Creates triangular geodesic facets to the given depth.
+ */
+static void
+make_triangle (ModeInfo *mi, LL v1, LL v2, LL v3, int depth)
+{
+ if (depth <= 0)
+ make_triangle1 (mi, v1, v2, v3);
+ else
+ {
+ LL v12, v23, v13;
+ XYZ p1, p2, p3, p12, p23, p13;
+
+ midpoint2 (v1, v2, &v12, &p1, &p2, &p12);
+ midpoint2 (v2, v3, &v23, &p2, &p3, &p23);
+ midpoint2 (v1, v3, &v13, &p1, &p3, &p13);
+ depth--;
+
+ make_triangle (mi, v1, v12, v13, depth);
+ make_triangle (mi, v12, v2, v23, depth);
+ make_triangle (mi, v13, v23, v3, depth);
+ make_triangle (mi, v12, v23, v13, depth);
+ }
+}
+
+
+/* Creates triangles of a geodesic to the given depth (frequency).
+ */
+static void
+make_geodesic (ModeInfo *mi)
+{
+ int depth = depth_arg;
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (i & 1) /* north */
+ {
+ make_triangle (mi, v1, v2, vc, depth);
+ make_triangle (mi, v2, v1, v3, depth);
+ }
+ else /* south */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ make_triangle (mi, v2, v1, vc, depth);
+ make_triangle (mi, v1, v2, v3, depth);
+ }
+ }
+}
+
+
+/* Add t1 to the neighbor list of t0. */
+static void
+link_neighbor (int i, int j, triangle *t0, triangle *t1)
+{
+ int k;
+ if (t0 == t1)
+ return;
+ for (k = 0; k < countof(t0->neighbors); k++)
+ {
+ if (t0->neighbors[k] == t1 ||
+ t0->neighbors[k] == 0)
+ {
+ t0->neighbors[k] = t1;
+ return;
+ }
+ }
+ fprintf (stderr, "%d %d: too many neighbors\n", i, j);
+ abort();
+}
+
+
+static int
+feq (GLfloat a, GLfloat b) /* Oh for fuck's sake */
+{
+ const GLfloat e = 0.00001;
+ GLfloat d = a - b;
+ return (d > -e && d < e);
+}
+
+
+/* Link each triangle to its three neighbors.
+ */
+static void
+link_neighbors (ModeInfo *mi)
+{
+ splodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ triangle *t0 = bp->triangles;
+ int i;
+
+ /* Triangles are neighbors if they share an edge (exactly 2 points).
+ (There must be a faster than N! way to do this...)
+ */
+ for (i = 0, t0 = bp->triangles; t0; t0 = t0->next, i++)
+ {
+ triangle *t1;
+ int j;
+
+ for (j = i+1, t1 = t0->next; t1; t1 = t1->next, j++)
+ {
+ int count = 0;
+ int ii, jj;
+ for (ii = 0; ii < 3; ii++)
+ for (jj = 0; jj < 3; jj++)
+ if (feq (t0->p[ii].x, t1->p[jj].x) &&
+ feq (t0->p[ii].y, t1->p[jj].y) &&
+ feq (t0->p[ii].z, t1->p[jj].z))
+ count++;
+ if (count >= 3)
+ {
+ fprintf (stderr, "%d %d: too many matches: %d\n", i, j, count);
+ abort();
+ }
+ if (count == 2)
+ {
+ link_neighbor (i, j, t0, t1);
+ link_neighbor (j, i, t1, t0);
+ }
+ }
+
+ if (! (t0->neighbors[0] && t0->neighbors[1] && t0->neighbors[2]))
+ {
+ fprintf (stderr, "%d: missing neighbors\n", i);
+ abort();
+ }
+
+ t0->altitude = 60; /* Fall in from space */
+ }
+}
+
+
+/* Add thrust to the triangle, and propagate some of that to its neighbors.
+ */
+static void
+add_thrust (triangle *t, GLfloat thrust)
+{
+ GLfloat dampen = 0;
+ if (t->refcount)
+ return;
+ t->refcount++;
+ t->velocity += thrust;
+
+ /* Eyeballed this to look roughly the same at various depths. Eh. */
+ switch (depth_arg) {
+ case 0: dampen = 0.5; break;
+ case 1: dampen = 0.7; break;
+ case 2: dampen = 0.9; break;
+ case 3: dampen = 0.98; break;
+ case 4: dampen = 0.985; break;
+ default: dampen = 0.993; break;
+ }
+
+ thrust *= dampen;
+ if (thrust > 0.1)
+ {
+ add_thrust (t->neighbors[0], thrust);
+ add_thrust (t->neighbors[1], thrust);
+ add_thrust (t->neighbors[2], thrust);
+ }
+}
+
+
+static void
+tick_triangles (ModeInfo *mi)
+{
+ splodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat gravity = 0.1;
+ triangle *t;
+ int i;
+
+ /* Compute new velocities. */
+ for (i = 0, t = bp->triangles; t; t = t->next, i++)
+ {
+ if (t->thrust > 0)
+ {
+ add_thrust (t, t->thrust);
+ t->thrust_duration--;
+ if (t->thrust_duration <= 0)
+ {
+ t->thrust_duration = 0;
+ t->thrust = 0;
+ }
+ }
+ }
+
+ /* Apply new velocities. */
+ for (i = 0, t = bp->triangles; t; t = t->next, i++)
+ {
+ t->altitude += t->velocity;
+ t->velocity -= gravity;
+ if (t->altitude < 0)
+ {
+ t->velocity = 0;
+ t->altitude = 0;
+ }
+ t->refcount = 0; /* Clear for next time */
+ }
+
+ /* Add eruptions. */
+ if (frand(1 / speed) < 0.2)
+ {
+ int n = random() % bp->count;
+ for (i = 0, t = bp->triangles; t; t = t->next, i++)
+ if (i == n)
+ break;
+ t->thrust += gravity * 1.5;
+ t->thrust_duration = 1 + BELLRAND(16);
+ }
+
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors)
+ bp->ccolor = 0;
+}
+
+
+static void
+draw_triangles (ModeInfo *mi)
+{
+ splodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ triangle *t;
+ GLfloat c[4];
+ int c0 = bp->ccolor;
+ int c1 = (c0 + bp->ncolors / 2) % bp->ncolors;
+
+ c[0] = bp->colors[c0].red / 65536.0;
+ c[1] = bp->colors[c0].green / 65536.0;
+ c[2] = bp->colors[c0].blue / 65536.0;
+ c[3] = 1;
+
+ if (wire)
+ glColor4fv (c);
+ else
+ {
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c);
+
+ c[0] = bp->colors[c1].red / 65536.0;
+ c[1] = bp->colors[c1].green / 65536.0;
+ c[2] = bp->colors[c1].blue / 65536.0;
+ c[3] = 1;
+ glMaterialfv (GL_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+
+ glFrontFace (GL_CCW);
+ for (t = bp->triangles; t; t = t->next)
+ {
+ GLfloat a = t->altitude * 0.25;
+ XYZ c;
+ glPushMatrix();
+
+ c.x = t->p[0].x + t->p[1].x + t->p[2].x;
+ c.y = t->p[0].y + t->p[1].y + t->p[2].y;
+ c.z = t->p[0].z + t->p[1].z + t->p[2].z;
+ if (a > 0)
+ glTranslatef (a * c.x / 3, a * c.y / 3, a * c.z / 3);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glNormal3f (c.x, c.y, c.z);
+ glVertex3f (t->p[0].x, t->p[0].y, t->p[0].z);
+ glVertex3f (t->p[1].x, t->p[1].y, t->p[1].z);
+ glVertex3f (t->p[2].x, t->p[2].y, t->p[2].z);
+ glEnd();
+ mi->polygon_count++;
+ glPopMatrix();
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_splodesic (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+splodesic_handle_event (ModeInfo *mi, XEvent *event)
+{
+ splodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ bp->ncolors = 1024;
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_splodesic (ModeInfo *mi)
+{
+ splodesic_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_splodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {4.0, 1.4, 1.1, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 0.2, 0.2, 1.0};
+ GLfloat cspec[4] = {1, 1, 1, 1};
+ static const GLfloat shiny = 10;
+ int lightmodel = 1;
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ glLightModeliv (GL_LIGHT_MODEL_TWO_SIDE, &lightmodel);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.005;
+ double spin_accel = 1.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->ncolors = 1024;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+# ifdef HAVE_MOBILE
+ depth_arg--;
+# endif
+
+ if (depth_arg < 0) depth_arg = 0;
+ if (depth_arg > 10) depth_arg = 10;
+
+ make_geodesic (mi);
+ link_neighbors (mi);
+}
+
+
+ENTRYPOINT void
+draw_splodesic (ModeInfo *mi)
+{
+ splodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glDisable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 6,
+ (y - 0.5) * 6,
+ (z - 0.5) * 8);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+# ifdef HAVE_MOBILE
+ glScalef (3, 3, 3);
+#else
+ glScalef (4, 4, 4);
+# endif
+
+ if (! bp->button_down_p)
+ tick_triangles (mi);
+ draw_triangles (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_splodesic (ModeInfo *mi)
+{
+ splodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ while (bp->triangles)
+ {
+ triangle *t = bp->triangles->next;
+ free (bp->triangles);
+ bp->triangles = t;
+ }
+}
+
+XSCREENSAVER_MODULE ("Splodesic", splodesic)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/splodesic.man b/hacks/glx/splodesic.man
new file mode 100644
index 0000000..bf31e1d
--- /dev/null
+++ b/hacks/glx/splodesic.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+splodesic - k
+A geodesic sphere experiences a series of eruptions.
+.SH SYNOPSIS
+.B splodesic
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-wander]
+[\-no-spin]
+[\-fps]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-depth \fInumber\fP]
+.SH DESCRIPTION
+A geodesic sphere experiences a series of eruptions.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Frequency of eruptions. 2.0 means twice as often, 0.5 means half as often.
+.TP 8
+.B \-depth \fInumber\fP
+Depth (frequency) of the geodesic. 0 - 5. Default: 4.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/sproingies.c b/hacks/glx/sproingies.c
new file mode 100644
index 0000000..1860b11
--- /dev/null
+++ b/hacks/glx/sproingies.c
@@ -0,0 +1,906 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* sproingies.c - 3D sproingies */
+
+#if 0
+static const char sccsid[] = "@(#)sproingies.c 4.04 97/07/28 xlockmore";
+#endif
+
+/*-
+ * sproingies.c - Copyright 1996 by Ed Mackey, freely distributable.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * See sproingiewrap.c
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef STANDALONE
+# include "xlockmoreI.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#if !defined(HAVE_JWZGLES) && !defined(HAVE_COCOA)
+# include <GL/glu.h>
+#endif
+
+#include "gllist.h"
+#include "sproingies.h"
+
+#define MAXSPROING 100
+#define TARGET_COUNT 40
+#define BOOM_FRAME 50
+#define NO_FRAME (-10)
+#define RESET_SPROINGIE_LIFE (-30 + myrand(28))
+#define NEW_SPROINGIE_LIFE (40 + myrand(200))
+#define JUMP_LEFT 0
+#define JUMP_RIGHT 1
+
+#define FIRST_FRAME 0
+#define LAST_FRAME 5
+/*-
+ * The sproingies have six "real" frames, (s1_1 to s1_6) that show a
+ * sproingie jumping off a block, headed down and to the right.
+ * The frames are numbered from 0 (FIRST_FRAME) to 5 (LAST_FRAME).
+ *
+ * There are other frame numbers for special cases (e.g. BOOM_FRAME).
+ */
+
+extern const struct gllist *s1_1;
+extern const struct gllist *s1_2;
+extern const struct gllist *s1_3;
+extern const struct gllist *s1_4;
+extern const struct gllist *s1_5;
+extern const struct gllist *s1_6;
+extern const struct gllist *s1_b;
+
+static int
+myrand(int range)
+{
+ return ((int) (((float) range) * LRAND() / (MAXRAND)));
+}
+
+static int smart_sproingies = 0;
+
+static GLuint
+build_TopsSides(int wireframe)
+{
+ GLuint dl_num;
+ GLfloat mat_color[4] =
+ {0.0, 0.0, 0.0, 1.0};
+
+ dl_num = glGenLists(2);
+ if (!dl_num)
+ return (0); /* 0 means out of display lists. */
+
+ /* Surface: Tops */
+ glNewList(dl_num, GL_COMPILE);
+ mat_color[0] = 0.392157;
+ mat_color[1] = 0.784314;
+ mat_color[2] = 0.941176;
+ if (wireframe)
+ glColor3fv(mat_color);
+ else {
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
+ }
+ glEndList();
+
+ /* Surface: Sides */
+ glNewList(dl_num + 1, GL_COMPILE);
+ if (wireframe)
+ glColor3fv(mat_color);
+ else {
+ /* jwz: in wireframe mode, color tops and sides the same. */
+ mat_color[0] = 0.156863;
+ mat_color[1] = 0.156863;
+ mat_color[2] = 0.392157;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
+ }
+ glEndList();
+ return (dl_num);
+}
+
+static void
+LayGround(int sx, int sy, int sz, int width, int height, sp_instance * si)
+{
+ int x, y, z, w, h;
+ GLenum begin_polygon;
+
+ if (si->wireframe)
+ begin_polygon = GL_LINE_LOOP;
+ else
+ begin_polygon = GL_POLYGON;
+
+ if (!si->wireframe) {
+ if (!si->mono)
+ glCallList(si->TopsSides); /* Render the tops */
+ glNormal3f(0.0, 1.0, 0.0);
+
+ for (h = 0; h < height; ++h) {
+ x = sx + h;
+ y = sy - (h << 1);
+ z = sz + h;
+ for (w = 0; w < width; ++w) {
+ glBegin(begin_polygon);
+ glVertex3i(x, y, z);
+ glVertex3i(x, y, z - 1);
+ glVertex3i(x + 1, y, z - 1);
+ glVertex3i(x + 1, y, z);
+ glEnd();
+ glBegin(begin_polygon);
+ glVertex3i(x + 1, y - 1, z);
+ glVertex3i(x + 1, y - 1, z - 1);
+ glVertex3i(x + 2, y - 1, z - 1);
+ glVertex3i(x + 2, y - 1, z);
+ glEnd();
+ ++x;
+ --z;
+ }
+ }
+ }
+ if (!si->mono)
+ glCallList(si->TopsSides + 1); /* Render the sides */
+ if (!si->wireframe)
+ glNormal3f(0.0, 0.0, 1.0);
+
+ for (h = 0; h < height; ++h) {
+ x = sx + h;
+ y = sy - (h << 1);
+ z = sz + h;
+ for (w = 0; w < width; ++w) {
+ glBegin(begin_polygon);
+ glVertex3i(x, y, z);
+ glVertex3i(x + 1, y, z);
+ glVertex3i(x + 1, y - 1, z);
+ glVertex3i(x, y - 1, z);
+ glEnd();
+ glBegin(begin_polygon);
+ glVertex3i(x + 1, y - 1, z);
+ glVertex3i(x + 2, y - 1, z);
+ glVertex3i(x + 2, y - 2, z);
+ glVertex3i(x + 1, y - 2, z);
+/*-
+ * PURIFY 4.0.1 reports an unitialized memory read on the next line when using
+ * MesaGL 2.2 and -mono. This has been fixed in MesaGL 2.3 and later. */
+ glEnd();
+ ++x;
+ --z;
+ }
+ }
+
+ /* Render the other sides */
+ if (!si->wireframe)
+ glNormal3f(1.0, 0.0, 0.0);
+
+ for (h = 0; h < height; ++h) {
+ x = sx + h;
+ y = sy - (h << 1);
+ z = sz + h;
+ for (w = 0; w < width; ++w) {
+ glBegin(begin_polygon);
+ glVertex3i(x + 1, y, z);
+ glVertex3i(x + 1, y, z - 1);
+ glVertex3i(x + 1, y - 1, z - 1);
+ glVertex3i(x + 1, y - 1, z);
+ glEnd();
+ glBegin(begin_polygon);
+ glVertex3i(x + 2, y - 1, z);
+ glVertex3i(x + 2, y - 1, z - 1);
+ glVertex3i(x + 2, y - 2, z - 1);
+ glVertex3i(x + 2, y - 2, z);
+ glEnd();
+ ++x;
+ --z;
+ }
+ }
+
+ if (si->wireframe) {
+ if (!si->mono)
+ glCallList(si->TopsSides); /* Render the tops */
+
+ for (h = 0; h < height; ++h) {
+ x = sx + h;
+ y = sy - (h << 1);
+ z = sz + h;
+ for (w = 0; w < width; ++w) {
+ glBegin(begin_polygon);
+ glVertex3i(x, y, z);
+ glVertex3i(x, y, z - 1);
+ glVertex3i(x + 1, y, z - 1);
+ glVertex3i(x + 1, y, z);
+ glEnd();
+ glBegin(begin_polygon);
+ glVertex3i(x + 1, y - 1, z);
+ glVertex3i(x + 1, y - 1, z - 1);
+ glVertex3i(x + 2, y - 1, z - 1);
+ glVertex3i(x + 2, y - 1, z);
+ glEnd();
+ ++x;
+ --z;
+ }
+ }
+ }
+}
+
+static void
+AdvanceSproingie(int t, sp_instance * si)
+{
+ int g_higher, g_back, t2;
+ struct sPosColor *thisSproingie = &(si->positions[t]);
+ struct sPosColor *S2 = &(si->positions[0]);
+
+ if (thisSproingie->life > 0) {
+ if ((++(thisSproingie->frame)) > LAST_FRAME) {
+ if (thisSproingie->frame >= BOOM_FRAME) {
+ if ((thisSproingie->r -= 0.08) < 0.0)
+ thisSproingie->r = 0.0;
+ if ((thisSproingie->g -= 0.08) < 0.0)
+ thisSproingie->g = 0.0;
+ if ((thisSproingie->b -= 0.08) < 0.0)
+ thisSproingie->b = 0.0;
+ if ((--(thisSproingie->life)) < 1) {
+ thisSproingie->life = RESET_SPROINGIE_LIFE;
+ }
+ return;
+ }
+ thisSproingie->frame = FIRST_FRAME;
+
+ /* Check for collisions */
+ for (t2 = 0; t2 < si->maxsproingies; ++t2) {
+ if ((t2 != t) && (thisSproingie->x == S2->x) &&
+ (thisSproingie->y == S2->y) && (thisSproingie->z == S2->z) &&
+ (S2->life > 10) && (S2->frame < LAST_FRAME + 1)) {
+#if 0
+ if (thisSproingie->life > S2->life) {
+ S2->life = 10;
+ } else {
+#endif
+ if (thisSproingie->life > 10) {
+ thisSproingie->life = 10;
+ thisSproingie->frame = BOOM_FRAME;
+ if ((thisSproingie->r += 0.5) > 1.0)
+ thisSproingie->r = 1.0;
+ if ((thisSproingie->g += 0.5) > 1.0)
+ thisSproingie->g = 1.0;
+ if ((thisSproingie->b += 0.5) > 1.0)
+ thisSproingie->b = 1.0;
+ }
+#if 0
+ }
+#endif
+ }
+ ++S2;
+ }
+ }
+ /* Time to disappear... */
+ if (!((thisSproingie->life == 10) &&
+ (thisSproingie->frame > FIRST_FRAME) &&
+ (thisSproingie->frame < BOOM_FRAME))) {
+ if ((--(thisSproingie->life)) < 1) {
+ thisSproingie->life = RESET_SPROINGIE_LIFE;
+ } else if (thisSproingie->life < 9) {
+ thisSproingie->frame -= 2;
+ }
+ } /* ... else wait here for frame FIRST_FRAME to come about. */
+ } else if (++(thisSproingie->life) >= 0) {
+ if (1 || t > 1) {
+ g_higher = -3 + myrand(5);
+ g_back = -2 + myrand(5);
+ } else if (t == 1) {
+ g_higher = -2 + myrand(3);
+ g_back = -1 + myrand(3);
+ } else {
+ g_higher = -1;
+ g_back = 0;
+ }
+
+ thisSproingie->x = (-g_higher - g_back);
+ thisSproingie->y = (g_higher << 1);
+ thisSproingie->z = (g_back - g_higher);
+ thisSproingie->life = NEW_SPROINGIE_LIFE;
+ thisSproingie->frame = NO_FRAME;
+ thisSproingie->r = (GLfloat) (40 + myrand(200)) / 255.0;
+ thisSproingie->g = (GLfloat) (40 + myrand(200)) / 255.0;
+ thisSproingie->b = (GLfloat) (40 + myrand(200)) / 255.0;
+
+ for (t2 = 0; t2 < si->maxsproingies; ++t2) {
+ if ((t2 != t) && (thisSproingie->x == S2->x) &&
+ (thisSproingie->y == S2->y) && (thisSproingie->z == S2->z) &&
+ (S2->life > 10) && (S2->frame < FIRST_FRAME)) {
+ /* If another is already on this place, wait. */
+ thisSproingie->life = -1;
+ }
+ ++S2;
+ }
+ }
+}
+
+static void
+NextSproingie(sp_instance *si)
+{
+ int ddx, t;
+ struct sPosColor *thisSproingie = &(si->positions[0]);
+
+ /* Although the sproingies cycle has six frames, the blocks cycle */
+ /* has twelve. After a full cycle (12 frames), re-center positions */
+ /* of sproingies */
+ if (++si->sframe > 11) {
+ si->sframe = FIRST_FRAME;
+ for (t = 0; t < si->maxsproingies; ++t) {
+ thisSproingie->x -= 1;
+ thisSproingie->y += 2;
+ thisSproingie->z -= 1;
+ ++thisSproingie;
+ }
+ }
+
+ for (t = 0; t < si->maxsproingies; ++t) {
+ AdvanceSproingie(t, si);
+ }
+
+ if (si->target_count < 0) { /* track to current target */
+ if (si->target_rx < si->rotx)
+ --si->rotx;
+ else if (si->target_rx > si->rotx)
+ ++si->rotx;
+
+ if (si->target_ry < si->roty)
+ --si->roty;
+ else if (si->target_ry > si->roty)
+ ++si->roty;
+
+ ddx = (si->target_dist - si->dist) / 8;
+ if (ddx)
+ si->dist += ddx;
+ else if (si->target_dist < si->dist)
+ --si->dist;
+ else if (si->target_dist > si->dist)
+ ++si->dist;
+
+ if ((si->target_rx == si->rotx) && (si->target_ry == si->roty) &&
+ (si->target_dist == si->dist)) {
+ si->target_count = TARGET_COUNT;
+ if (si->target_dist <= 32)
+ si->target_count >>= 2;
+ }
+ } else if (--si->target_count < 0) { /* make up new target */
+ si->target_rx = myrand(100) - 35;
+ si->target_ry = -myrand(90);
+ si->target_dist = 32 << myrand(2); /* could be 32, 64, or 128, (previously or 256) */
+
+ if (si->target_dist >= si->dist) /* no duplicate distances */
+ si->target_dist <<= 1;
+ }
+ /* Otherwise just hang loose for a while here */
+}
+
+#ifdef __AUXFUNCS__
+void
+PrintEm(void)
+{
+ int t, count = 0;
+
+ for (t = 0; t < maxsproingies; ++t) {
+ if (positions[t].life > 0)
+ ++count;
+ }
+ (void) printf("RotX: %d, RotY: %d, Dist: %d. Targets: X %d, Y %d, D %d. Visible: %d\n",
+ rotx, roty, dist, target_rx, target_ry, target_dist, count);
+}
+
+void
+ResetEm(void)
+{
+ int t;
+
+ for (t = 0; t < maxsproingies; ++t) {
+ positions[t].x = 0;
+ positions[t].y = 0;
+ positions[t].z = 0;
+ positions[t].life = -2;
+ positions[t].frame = FIRST_FRAME;
+ }
+}
+
+void
+distAdd(void)
+{
+ if (dist < (1 << 16 << 4))
+ dist <<= 1;
+}
+
+void
+distSubtract(void)
+{
+ if (dist > 1)
+ dist >>= 1;
+}
+
+void
+rotxAdd(void)
+{
+ rotx = (rotx + 5) % 360;
+}
+
+void
+rotxSubtract(void)
+{
+ rotx = (rotx - 5) % 360;
+}
+
+void
+rotyAdd(void)
+{
+ roty = (roty + 5) % 360;
+}
+
+void
+rotySubtract(void)
+{
+ roty = (roty - 5) % 360;
+}
+
+void
+rotxBAdd(void)
+{
+ rotx = (rotx + 45) % 360;
+}
+
+void
+rotxBSubtract(void)
+{
+ rotx = (rotx - 45) % 360;
+}
+
+void
+rotyBAdd(void)
+{
+ roty = (roty + 45) % 360;
+}
+
+void
+rotyBSubtract(void)
+{
+ roty = (roty - 45) % 360;
+}
+
+#endif /* __AUXFUNCS__ */
+
+static void
+RenderSproingie(int t, sp_instance * si)
+{
+ GLfloat scale, pointsize, mat_color[4] =
+ {0.0, 0.0, 0.0, 1.0};
+#ifndef HAVE_JWZGLES
+ GLdouble clipplane[4] =
+ {0.0, 1.0, 0.0, 0.0};
+#endif
+ struct sPosColor *thisSproingie = &(si->positions[t]);
+
+ if (thisSproingie->life < 1)
+ return;
+
+ glPushMatrix();
+
+ if (!si->mono) {
+ mat_color[0] = thisSproingie->r;
+ mat_color[1] = thisSproingie->g;
+ mat_color[2] = thisSproingie->b;
+ if (si->wireframe)
+ glColor3fv(mat_color);
+ else {
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
+ }
+ }
+
+ if (thisSproingie->frame < FIRST_FRAME) {
+ glEnable(GL_CLIP_PLANE0);
+ glTranslatef((GLfloat) (thisSproingie->x),
+ (GLfloat) (thisSproingie->y) +
+ ((GLfloat) (thisSproingie->frame) / 9.0),
+ (GLfloat) (thisSproingie->z));
+
+#ifndef HAVE_JWZGLES
+ /* OpenGLES doesn't have this but it doesn't seem to matter */
+ clipplane[3] = ((GLdouble) (thisSproingie->frame) / 9.0) +
+ (si->wireframe ? 0.0 : 0.1);
+ glClipPlane(GL_CLIP_PLANE0, clipplane);
+#endif
+
+/** glCallList(si->sproingies[0]);*/
+/**/ renderList(si->sproingies[0], si->wireframe);
+ glDisable(GL_CLIP_PLANE0);
+ } else if (thisSproingie->frame >= BOOM_FRAME) {
+ glTranslatef((GLfloat) (thisSproingie->x) + 0.5,
+ (GLfloat) (thisSproingie->y) + 0.5,
+ (GLfloat) (thisSproingie->z) - 0.5);
+ {
+ int boom_scale = thisSproingie->frame - BOOM_FRAME;
+ if (boom_scale >= 31) boom_scale = 31;
+ scale = (GLfloat) (1 << boom_scale);
+ }
+ glScalef(scale, scale, scale);
+ if (!si->wireframe) {
+ if (!si->mono)
+ glColor3fv(mat_color);
+ glDisable(GL_LIGHTING);
+ }
+ pointsize = (GLfloat) ((BOOM_FRAME + 8) - thisSproingie->frame) -
+ (si->dist / 64.0);
+ glPointSize((pointsize < 1.0) ? 1.0 : pointsize);
+/*-
+ * PURIFY 4.0.1 reports an unitialized memory read on the next line when using
+ * MesaGL 2.2. This has been tracked to MesaGL 2.2 src/points.c line 313. */
+/** glCallList(si->SproingieBoom);*/
+/**/ renderList(si->SproingieBoom, si->wireframe);
+ glPointSize(1.0);
+ if (!si->wireframe) {
+ glEnable(GL_LIGHTING);
+ }
+ } else {
+ if (thisSproingie->direction == JUMP_LEFT) {
+ /* When the sproingie jumps to the left, the frames must be */
+ /* rotated and translated */
+ glTranslatef((GLfloat) (thisSproingie->x ),
+ (GLfloat) (thisSproingie->y ),
+ (GLfloat) (thisSproingie->z - 1));
+ glRotatef((GLfloat) - 90.0, 0.0, 1.0, 0.0);
+ if (thisSproingie->frame == LAST_FRAME) {
+ thisSproingie->x -= 0;
+ thisSproingie->y -= 1;
+ thisSproingie->z += 1;
+ }
+ } else {
+ glTranslatef((GLfloat) (thisSproingie->x),
+ (GLfloat) (thisSproingie->y),
+ (GLfloat) (thisSproingie->z));
+ glRotatef((GLfloat) - 0.0, 0.0, 1.0, 0.0);
+ if (thisSproingie->frame == LAST_FRAME) {
+ thisSproingie->x += 1;
+ thisSproingie->y -= 1;
+ thisSproingie->z -= 0;
+ }
+ }
+/* } */
+/** glCallList(si->sproingies[thisSproingie->frame]);*/
+/**/ renderList(si->sproingies[thisSproingie->frame], si->wireframe);
+
+ /* Every 6 frame cycle... */
+ if (thisSproingie->frame == LAST_FRAME) {
+ /* ...check if the sproingies have gone out of the bricks */
+ if (((thisSproingie->x - thisSproingie->z == 6) &&
+ (2*thisSproingie->x + thisSproingie->y == 6)) ||
+ ((thisSproingie->z - thisSproingie->x == 5) &&
+ (2*thisSproingie->x + thisSproingie->y == -5))) {
+ /* If they have, then they die */
+ if (thisSproingie->life > 0 && thisSproingie->frame < BOOM_FRAME && thisSproingie->frame > FIRST_FRAME) {
+ thisSproingie->frame = BOOM_FRAME;
+ }
+ } else {
+ /* If not, they choose a direction for the next hop */
+ if (smart_sproingies) {
+ if ((thisSproingie->x - thisSproingie->z == 5) &&
+ (2*thisSproingie->x + thisSproingie->y == 5)) {
+ thisSproingie->direction = JUMP_LEFT;
+ } else if ((thisSproingie->z - thisSproingie->x == 4) &&
+ (2*thisSproingie->x + thisSproingie->y == -4)) {
+ thisSproingie->direction = JUMP_RIGHT;
+ } else {
+ thisSproingie->direction = myrand(2);
+ }
+ } else {
+ thisSproingie->direction = myrand(2);
+ }
+ }
+ }
+ }
+
+ glPopMatrix();
+
+}
+
+static void
+ComputeGround(sp_instance * si)
+{
+ int g_higher, g_back, g_width, g_height;
+
+ /* higher: x-1, y+2, z-1 */
+ /* back: x-1, y, z+1 */
+
+ if (si->groundlevel == 0) {
+ g_back = 2;
+ g_width = 5;
+ } else if (si->groundlevel == 1) {
+ g_back = 4;
+ g_width = 8;
+ } else {
+ g_back = 8;
+ g_width = 16;
+ }
+
+ if ((g_higher = si->dist >> 3) < 4)
+ g_higher = 4;
+ if (g_higher > 16)
+ g_higher = 16;
+ g_height = g_higher << 1;
+
+ if (si->rotx < -10)
+ g_higher += (g_higher >> 2);
+ else if (si->rotx > 10)
+ g_higher -= (g_higher >> 2);
+
+#if 0
+ if (si->dist > 128) {
+ ++g_higher;
+ ++g_back;
+ g_back <<= 1;
+ } else if (si->dist > 64) {
+ ++g_higher;
+ ++g_back;
+ } else if (si->dist > 32) {
+ /* nothing special */
+ } else {
+ if (g_higher > 2) {
+ g_higher = g_back = 4;
+ }
+ }
+#endif
+
+ /* startx, starty, startz, width, height */
+ LayGround((-g_higher - g_back), (g_higher << 1), (g_back - g_higher),
+ (g_width), (g_height), si);
+}
+
+void
+DisplaySproingies(sp_instance *si)
+{
+ int t;
+ GLfloat position[] =
+ {8.0, 5.0, -2.0, 0.1};
+
+ if (si->wireframe)
+ glClear(GL_COLOR_BUFFER_BIT);
+ else
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glTranslatef(0.0, 0.0, -(GLfloat) (si->dist) / 16.0); /* viewing transform */
+ glRotatef((GLfloat) si->rotx, 1.0, 0.0, 0.0);
+ glRotatef((GLfloat) si->roty, 0.0, 1.0, 0.0);
+
+ if (!si->wireframe)
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+#if 0 /* Show light pos */
+ glPushMatrix();
+ glTranslatef(position[0], position[1], position[2]);
+ glColor3f(1.0, 1.0, 1.0);
+ if (!si->wireframe) {
+ glDisable(GL_LIGHTING);
+ }
+ glCallList(si->SproingieBoom);
+ if (!si->wireframe) {
+ glEnable(GL_LIGHTING);
+ }
+ glPopMatrix();
+#endif
+
+ glTranslatef((GLfloat) si->sframe * (-1.0 / 12.0) - 0.75,
+ (GLfloat) si->sframe * (2.0 / 12.0) - 0.5,
+ (GLfloat) si->sframe * (-1.0 / 12.0) + 0.75);
+
+ if (si->wireframe)
+ ComputeGround(si);
+
+ for (t = 0; t < si->maxsproingies; ++t) {
+ RenderSproingie(t, si);
+ }
+
+ if (!si->wireframe)
+ ComputeGround(si);
+
+ glPopMatrix();
+ glFlush();
+}
+
+void
+NextSproingieDisplay(sp_instance *si)
+{
+ NextSproingie(si);
+/* if (pause) usleep(pause); don't do this! -jwz */
+ DisplaySproingies(si);
+}
+
+void
+ReshapeSproingies(int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(65.0, 1/h, 0.1, 2000.0); /* was 200000.0 */
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+void
+CleanupSproingies(sp_instance *si)
+{
+ if (! si) return;
+
+/*
+ int t;
+ if (si->SproingieBoom) {
+ for (t = 0; t < 6; ++t)
+ glDeleteLists(si->sproingies[t], 1);
+
+ glDeleteLists(si->TopsSides, 2);
+ glDeleteLists(si->SproingieBoom, 1);
+
+ si->SproingieBoom = 0;
+ }
+*/
+ if (si->TopsSides) {
+ glDeleteLists(si->TopsSides, 2);
+ }
+ if (si->positions) {
+ (void) free((void *) (si->positions));
+ si->positions = NULL;
+ }
+}
+
+void
+InitSproingies(sp_instance *si, int wfmode, int grnd, int mspr, int smrtspr,
+ int mono)
+{
+ GLfloat ambient[] =
+ {0.2, 0.2, 0.2, 1.0};
+ GLfloat position[] =
+ {10.0, 1.0, 1.0, 10.0};
+ GLfloat mat_diffuse[] =
+ {0.6, 0.6, 0.6, 1.0};
+ GLfloat mat_specular[] =
+ {0.8, 0.8, 0.8, 1.0};
+ GLfloat mat_shininess[] =
+ {50.0};
+
+ int t;
+
+ memset (si, 0, sizeof(*si));
+
+ if (mspr < 0)
+ mspr = 0;
+ if (mspr >= MAXSPROING)
+ mspr = MAXSPROING - 1;
+
+ smart_sproingies = smrtspr;
+
+ si->rotx = 0;
+ si->roty = -45;
+ si->dist = (16 << 2);
+ si->sframe = 0;
+ si->target_count = 0;
+ si->mono = mono;
+
+ si->wireframe = si->flatshade = 0;
+
+ if (wfmode == 2)
+ si->flatshade = 1;
+ else if (wfmode)
+ si->wireframe = 1;
+
+ si->groundlevel = grnd;
+ si->maxsproingies = mspr;
+
+ if (si->maxsproingies) {
+ si->positions = (struct sPosColor *) calloc(si->maxsproingies,
+ sizeof (struct sPosColor));
+
+ if (!(si->positions))
+ si->maxsproingies = 0;
+ }
+ for (t = 0; t < si->maxsproingies; ++t) {
+ si->positions[t].x = 0;
+ si->positions[t].y = 0;
+ si->positions[t].z = 0;
+ si->positions[t].life = (-t * ((si->maxsproingies > 19) ? 1 : 4)) - 2;
+ si->positions[t].frame = FIRST_FRAME;
+ si->positions[t].direction = myrand(2);
+ }
+
+#if 0 /* Test boom */
+ si->positions[0].x = 0;
+ si->positions[0].y = 0;
+ si->positions[0].z = 0;
+ si->positions[0].life = 10;
+ si->positions[0].frame = BOOM_FRAME;
+ si->positions[0].r = 0.656863;
+ si->positions[0].g = 1.0;
+ si->positions[0].b = 0.656863;
+#endif
+
+ if (!(si->TopsSides = build_TopsSides(si->wireframe)))
+ (void) fprintf(stderr, "build_TopsSides\n");
+/*
+ if (!(si->sproingies[0] = BuildLWO(si->wireframe, &LWO_s1_1)))
+ (void) fprintf(stderr, "BuildLWO - 1\n");
+ if (!(si->sproingies[1] = BuildLWO(si->wireframe, &LWO_s1_2)))
+ (void) fprintf(stderr, "BuildLWO - 2\n");
+ if (!(si->sproingies[2] = BuildLWO(si->wireframe, &LWO_s1_3)))
+ (void) fprintf(stderr, "BuildLWO - 3\n");
+ if (!(si->sproingies[3] = BuildLWO(si->wireframe, &LWO_s1_4)))
+ (void) fprintf(stderr, "BuildLWO - 4\n");
+ if (!(si->sproingies[4] = BuildLWO(si->wireframe, &LWO_s1_5)))
+ (void) fprintf(stderr, "BuildLWO - 5\n");
+ if (!(si->sproingies[5] = BuildLWO(si->wireframe, &LWO_s1_6)))
+ (void) fprintf(stderr, "BuildLWO - 6\n");
+
+ if (!(si->SproingieBoom = BuildLWO(si->wireframe, &LWO_s1_b)))
+ (void) fprintf(stderr, "BuildLWO - b\n");
+*/
+ si->sproingies[0]=s1_1;
+ si->sproingies[1]=s1_2;
+ si->sproingies[2]=s1_3;
+ si->sproingies[3]=s1_4;
+ si->sproingies[4]=s1_5;
+ si->sproingies[5]=s1_6;
+ si->SproingieBoom=s1_b;
+
+ if (si->wireframe) {
+ glShadeModel(GL_FLAT);
+ glDisable(GL_LIGHTING);
+ } else {
+ if (si->flatshade) {
+ glShadeModel(GL_FLAT);
+ position[0] = 1.0;
+ position[3] = 0.0;
+ }
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+ /* glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); */
+ glCullFace(GL_BACK);
+ glEnable(GL_CULL_FACE);
+
+ glFrontFace(GL_CW);
+ /* glEnable(GL_NORMALIZE); */
+ }
+}
+
+#endif /* USE_GL */
+
+/* End of sproingies.c */
+
diff --git a/hacks/glx/sproingies.h b/hacks/glx/sproingies.h
new file mode 100644
index 0000000..29a79ba
--- /dev/null
+++ b/hacks/glx/sproingies.h
@@ -0,0 +1,43 @@
+/*-
+ * sproingies.c - Copyright 1996 by Ed Mackey, freely distributable.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * See sproingiewrap.c
+ */
+
+struct sPosColor { /* Position and color of the sproingie */
+ int x, y, z; /* Position */
+ int frame; /* Current frame (0-5) */
+ int life; /* Life points */
+ GLfloat r, g, b; /* Color RGB */
+ int direction; /* Direction of next hop (left or right) */
+};
+
+typedef struct {
+ int rotx, roty, dist, wireframe, flatshade, groundlevel,
+ maxsproingies, mono;
+ int sframe, target_rx, target_ry, target_dist, target_count;
+ const struct gllist *sproingies[6];
+ const struct gllist *SproingieBoom;
+ GLuint TopsSides;
+ struct sPosColor *positions;
+} sp_instance;
+
+extern void DisplaySproingies(sp_instance *si);
+extern void NextSproingieDisplay(sp_instance *si);
+extern void ReshapeSproingies(int w, int h);
+extern void CleanupSproingies(sp_instance *si);
+extern void InitSproingies(sp_instance *, int wfmode, int grnd, int mspr,
+ int smrtspr, int mono);
diff --git a/hacks/glx/sproingies.man b/hacks/glx/sproingies.man
new file mode 100644
index 0000000..5150fca
--- /dev/null
+++ b/hacks/glx/sproingies.man
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+sproingies - Q-Bert meets Marble Madness!
+.SH SYNOPSIS
+.B sproingies
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-size \fInumber\fP]
+[\-no\-fall]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Q-Bert meets Marble Madness!
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+How many sproingies to draw at once. Default: 5.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 25000 (0.03 seconds.).
+.TP 8
+.B \-size \fInumber\fP
+How much to scale the image down. Default 0 (full screen.)
+.TP 8
+.B \-no\-fall
+Make sproingies "smart", so they do not fall down the edge.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ed Mackey. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ed Mackey. Some additional code by Sergio Gutiérrez "Sergut".
diff --git a/hacks/glx/sproingiewrap.c b/hacks/glx/sproingiewrap.c
new file mode 100644
index 0000000..7089f9c
--- /dev/null
+++ b/hacks/glx/sproingiewrap.c
@@ -0,0 +1,231 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* sproingiewrap.c - sproingies wrapper */
+
+#if 0
+static const char sccsid[] = "@(#)sproingiewrap.c 4.07 97/11/24 xlockmore";
+#endif
+
+/*-
+ * sproingiewrap.c - Copyright 1996 Sproingie Technologies Incorporated.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Programming: Ed Mackey, http://www.netaxs.com/~emackey/
+ * Gordon Wrigley, gdw33@student.canterbury.ac.nz
+ * Sergio Gutiérrez "Sergut", sergut@gmail.com
+ * Sproingie 3D objects modeled by: Al Mackey, al@iam.com
+ * (using MetaNURBS in NewTek's Lightwave 3D v5).
+ *
+ * Revision History:
+ * 01-Sep-06: Make the sproingies select a new direction after each hop
+ * (6 frames); if they fall towards the edge, they explode.
+ * (TODO: let them fall for a time before they explode or
+ * disappear) [sergut]
+ * 13-Dec-02: Changed triangle normals into vertex normals to give a smooth
+ * apperance and moved the sproingies from Display Lists to
+ * Vertex Arrays, still need to do this for the TopsSides.
+ * [gordon]
+ * 26-Apr-97: Added glPointSize() calls around explosions, plus other fixes.
+ * 28-Mar-97: Added size support.
+ * 22-Mar-97: Updated to use glX interface instead of xmesa one.
+ * Also, support for multiscreens added.
+ * 20-Mar-97: Updated for xlockmore v4.02alpha7 and higher, using
+ * xlockmore's built-in Mesa/OpenGL support instead of
+ * my own. Submitted for inclusion in xlockmore.
+ * 09-Dec-96: Written.
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 30000 \n" \
+ "*count: 8 \n" \
+ "*size: 0 \n" \
+ "*showFPS: False \n" \
+ "*fpsTop: True \n" \
+ "*wireframe: False \n"
+
+# define release_sproingies 0
+# define sproingies_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#define DEF_SMART_SPROINGIES "True" /* Smart sproingies do not fall down the edge */
+
+#include "sproingies.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ {"-fall", ".smartSproingies", XrmoptionNoArg, "False"},
+ {"-no-fall", ".smartSproingies", XrmoptionNoArg, "True"},
+};
+
+static int smrt_spr;
+
+static argtype vars[] = {
+ {&smrt_spr, "smartSproingies", "Boolean", DEF_SMART_SPROINGIES, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt sproingies_opts =
+{countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct sproingies_description =
+{"sproingies", "init_sproingies", "draw_sproingies", NULL,
+ "refresh_sproingies", "init_sproingies", "free_sproingies", &sproingies_opts,
+ 1000, 5, 0, 400, 4, 1.0, "",
+ "Shows Sproingies! Nontoxic. Safe for pets and small children", 0, NULL};
+
+#endif
+
+#define MINSIZE 32
+
+#include <time.h>
+
+typedef struct {
+ GLfloat view_rotx, view_roty, view_rotz;
+ GLint gear1, gear2, gear3;
+ GLfloat angle;
+ GLuint limit;
+ GLuint count;
+ GLXContext *glx_context;
+ int mono;
+ Window window;
+ sp_instance si;
+} sproingiesstruct;
+
+static sproingiesstruct *sproingies = NULL;
+
+
+ENTRYPOINT void
+init_sproingies (ModeInfo * mi)
+{
+ Window window = MI_WINDOW(mi);
+ int screen = MI_SCREEN(mi);
+
+ int count = MI_COUNT(mi);
+ int size = MI_SIZE(mi);
+
+ sproingiesstruct *sp;
+ int wfmode = 0, grnd = 0, mspr, w, h;
+
+ MI_INIT (mi, sproingies);
+ sp = &sproingies[screen];
+
+ sp->mono = (MI_IS_MONO(mi) ? 1 : 0);
+ sp->window = window;
+ if ((sp->glx_context = init_GL(mi)) != NULL) {
+
+ if (MI_IS_WIREFRAME(mi))
+ wfmode = 1;
+
+ if (grnd > 2)
+ grnd = 2;
+
+ mspr = count;
+ if (mspr > 100)
+ mspr = 100;
+
+ /* wireframe, ground, maxsproingies */
+ InitSproingies(&sp->si, wfmode, grnd, mspr, smrt_spr, sp->mono);
+
+ /* Viewport is specified size if size >= MINSIZE && size < screensize */
+ if (size == 0) {
+ w = MI_WIDTH(mi);
+ h = MI_HEIGHT(mi);
+ } else if (size < MINSIZE) {
+ w = MINSIZE;
+ h = MINSIZE;
+ } else {
+ w = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size;
+ h = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size;
+ }
+
+ glViewport((MI_WIDTH(mi) - w) / 2, (MI_HEIGHT(mi) - h) / 2, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 0.1, 2000.0); /* was 200000.0 */
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ DisplaySproingies(&sp->si);
+
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/* ARGSUSED */
+ENTRYPOINT void
+draw_sproingies (ModeInfo * mi)
+{
+ sproingiesstruct *sp = &sproingies[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!sp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+ glXMakeCurrent(display, window, *(sp->glx_context));
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ NextSproingieDisplay(&sp->si); /* It will swap. */
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_sproingies(ModeInfo * mi)
+{
+ /* No need to do anything here... The whole screen is updated
+ * every frame anyway. Otherwise this would be just like
+ * draw_sproingies, above, but replace NextSproingieDisplay(...)
+ * with DisplaySproingies(...).
+ */
+}
+#endif /* !STANDALONE */
+
+ENTRYPOINT void
+reshape_sproingies (ModeInfo *mi, int w, int h)
+{
+ ReshapeSproingies(w, h);
+}
+
+
+ENTRYPOINT void
+free_sproingies (ModeInfo * mi)
+{
+ sproingiesstruct *sp = &sproingies[MI_SCREEN(mi)];
+
+ if (sp->glx_context) {
+
+ glXMakeCurrent(MI_DISPLAY(mi), sp->window, *(sp->glx_context));
+ CleanupSproingies(&sp->si);
+ }
+}
+
+XSCREENSAVER_MODULE ("Sproingies", sproingies)
+
+#endif /* USE_GL */
+
+/* End of sproingiewrap.c */
diff --git a/hacks/glx/stairs.c b/hacks/glx/stairs.c
new file mode 100644
index 0000000..7b6fbe2
--- /dev/null
+++ b/hacks/glx/stairs.c
@@ -0,0 +1,589 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* stairs --- Infinite Stairs, and Escher-like scene. */
+
+#if 0
+static const char sccsid[] = "@(#)stairs.c 4.07 97/11/24 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * This mode shows some interesting scenes that are impossible OR very
+ * weird to build in the real universe. Much of the scenes are inspirated
+ * on Mauritz Cornelis stairs's works which derivated the mode's name.
+ * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
+ * say he was a mathematician.
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ *
+ * Marcelo F. Vianna (Jun-01-1997)
+ *
+ * Revision History:
+ * 07-Jan-98: This would be a scene for the escher mode, but now escher mode
+ * was splitted in different modes for each scene. This is the
+ * initial release and is not working yet.
+ * Marcelo F. Vianna.
+ *
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n"
+
+# define release_stairs 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#if 0
+#include "e_textures.h"
+#else
+#include "ximage-loader.h"
+#include "images/gen/wood_png.h"
+#endif
+
+#include "sphere.h"
+#include "gltrackball.h"
+
+ENTRYPOINT ModeSpecOpt stairs_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct stairs_description =
+{"stairs", "init_stairs", "draw_stairs", NULL,
+ "draw_stairs", "change_stairs", "free_stairs", &stairs_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "Shows Infinite Stairs, an Escher-like scene", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+/*************************************************************************/
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ int rotating;
+ int AreObjectsDefined[1];
+ int sphere_position;
+ int sphere_tick;
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLuint objects;
+} stairsstruct;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const float position0[] = {1.0, 1.0, 1.0, 0.0};
+static const float position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};
+static const float MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
+
+static const float ball_positions[] = {
+ -3.0, 3.0, 1.0,
+ -3.0, 2.8, 2.0,
+ -3.0, 2.6, 3.0,
+
+ -2.0, 2.4, 3.0,
+ -1.0, 2.2, 3.0,
+ 0.0, 2.0, 3.0,
+ 1.0, 1.8, 3.0,
+ 2.0, 1.6, 3.0,
+
+ 2.0, 1.5, 2.0,
+ 2.0, 1.4, 1.0,
+ 2.0, 1.3, 0.0,
+ 2.0, 1.2, -1.0,
+ 2.0, 1.1, -2.0,
+
+ 1.0, 0.9, -2.0,
+ 0.0, 0.7, -2.0,
+ -1.0, 0.5, -2.0,
+};
+
+#define NPOSITIONS ((sizeof ball_positions) / (sizeof ball_positions[0]) / 3)
+#define SPHERE_TICKS 32
+
+static stairsstruct *stairs = NULL;
+
+static int
+draw_block(GLfloat width, GLfloat height, GLfloat thickness)
+{
+ int polys = 0;
+ glFrontFace(GL_CCW);
+ glBegin(GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(0, 0);
+ glVertex3f(-width, -height, thickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(width, -height, thickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(width, height, thickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-width, height, thickness);
+ polys++;
+ glNormal3f(0, 0, -1);
+ glTexCoord2f(0, 0);
+ glVertex3f(-width, height, -thickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(width, height, -thickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(width, -height, -thickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-width, -height, -thickness);
+ polys++;
+ glNormal3f(0, 1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-width, height, thickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(width, height, thickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(width, height, -thickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-width, height, -thickness);
+ polys++;
+ glNormal3f(0, -1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-width, -height, -thickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(width, -height, -thickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(width, -height, thickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-width, -height, thickness);
+ polys++;
+ glNormal3f(1, 0, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(width, -height, thickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(width, -height, -thickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(width, height, -thickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(width, height, thickness);
+ polys++;
+ glNormal3f(-1, 0, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-width, height, thickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(-width, height, -thickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(-width, -height, -thickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-width, -height, thickness);
+ polys++;
+ glEnd();
+ return polys;
+}
+
+static void
+draw_stairs_internal(ModeInfo * mi)
+{
+ GLfloat X;
+
+ mi->polygon_count = 0;
+
+ glPushMatrix();
+ glPushMatrix();
+ glTranslatef(-3.0, 0.1, 2.0);
+ for (X = 0; X < 2; X++) {
+ mi->polygon_count += draw_block(0.5, 2.7 + 0.1 * X, 0.5);
+ glTranslatef(0.0, 0.1, -1.0);
+ }
+ glPopMatrix();
+ glTranslatef(-3.0, 0.0, 3.0);
+ glPushMatrix();
+
+ for (X = 0; X < 6; X++) {
+ mi->polygon_count += draw_block(0.5, 2.6 - 0.1 * X, 0.5);
+ glTranslatef(1.0, -0.1, 0.0);
+ }
+ glTranslatef(-1.0, -0.9, -1.0);
+ for (X = 0; X < 5; X++) {
+ mi->polygon_count += draw_block(0.5, 3.0 - 0.1 * X, 0.5);
+ glTranslatef(0.0, 0.0, -1.0);
+ }
+ glTranslatef(-1.0, -1.1, 1.0);
+ for (X = 0; X < 3; X++) {
+ mi->polygon_count += draw_block(0.5, 3.5 - 0.1 * X, 0.5);
+ glTranslatef(-1.0, -0.1, 0.0);
+ }
+ glPopMatrix();
+ glPopMatrix();
+}
+
+/*#define DEBUG*/
+/*#define DEBUG_PATH*/
+
+static int
+draw_sphere(int pos, int tick)
+{
+ int pos2 = (pos+1) % NPOSITIONS;
+ GLfloat x1 = ball_positions[pos*3];
+ GLfloat y1 = ball_positions[pos*3+1];
+ GLfloat z1 = ball_positions[pos*3+2];
+ GLfloat x2 = ball_positions[pos2*3];
+ GLfloat y2 = ball_positions[pos2*3+1];
+ GLfloat z2 = ball_positions[pos2*3+2];
+ GLfloat frac = tick / (GLfloat) SPHERE_TICKS;
+ GLfloat x = x1 + (x2 - x1) * frac;
+ GLfloat y = y1 + (y2 - y1) * frac + (2 * sin (M_PI * frac));
+ GLfloat z = z1 + (z2 - z1) * frac;
+ int polys = 0;
+
+ glPushMatrix();
+
+# ifdef DEBUG_PATH
+ glVertex3f(x, y, z);
+ if (tick == 0) {
+ glVertex3f(x, y-7.5, z);
+ glVertex3f(x, y, z); glVertex3f(x, y, z-0.6);
+ glVertex3f(x, y, z); glVertex3f(x, y, z+0.6);
+ glVertex3f(x, y, z); glVertex3f(x+0.6, y, z);
+ glVertex3f(x, y, z); glVertex3f(x-0.6, y, z);
+ glVertex3f(x, y, z);
+ }
+
+# else /* !DEBUG_PATH */
+ y += 0.5;
+ glTranslatef(x, y, z);
+
+ glScalef (0.5, 0.5, 0.5);
+
+ /* make ball a little smaller on the gap to obscure distance */
+ if (pos == NPOSITIONS-1)
+ glScalef (0.95, 0.95, 0.95);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow);
+ glDisable (GL_TEXTURE_2D);
+ glShadeModel(GL_SMOOTH);
+ glFrontFace(GL_CCW);
+ polys += unit_sphere (32, 32, False);
+ glShadeModel(GL_FLAT);
+ glEnable (GL_TEXTURE_2D);
+#endif /* !DEBUG_PATH */
+
+ glPopMatrix();
+ return polys;
+}
+
+
+
+ENTRYPOINT void
+reshape_stairs (ModeInfo * mi, int width, int height)
+{
+ stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+
+ glViewport(0, y, sp->WindW = (GLint) width, sp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+ glMatrixMode(GL_MODELVIEW);
+ if (width >= 1024) {
+ glLineWidth(3);
+ glPointSize(3);
+ } else if (width >= 512) {
+ glLineWidth(2);
+ glPointSize(2);
+ } else {
+ glLineWidth(1);
+ glPointSize(1);
+ }
+}
+
+ENTRYPOINT Bool
+stairs_handle_event (ModeInfo *mi, XEvent *event)
+{
+ stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ gltrackball_reset (sp->trackball, 0, 0);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+static void
+pinit(ModeInfo *mi)
+{
+ /* int status; */
+ glClearDepth(1.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glCullFace(GL_BACK);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_CULL_FACE);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+#if 0
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
+ WoodTextureWidth, WoodTextureHeight,
+ GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
+ if (status)
+ {
+ const char *s = (char *) gluErrorString (status);
+ fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
+ progname, WoodTextureWidth, WoodTextureHeight,
+ (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ {
+ XImage *img = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ wood_png, sizeof(wood_png));
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ img->width, img->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, img->data);
+ check_gl_error("texture");
+ XDestroyImage (img);
+ }
+#endif
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+ENTRYPOINT void
+init_stairs (ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ stairsstruct *sp;
+
+ MI_INIT (mi, stairs);
+ sp = &stairs[screen];
+
+ sp->step = 0.0;
+ sp->rotating = 0;
+ sp->sphere_position = NRAND(NPOSITIONS);
+ sp->sphere_tick = 0;
+
+ if ((sp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_stairs(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ if (!glIsList(sp->objects))
+ sp->objects = glGenLists(1);
+ pinit(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ sp->trackball = gltrackball_init (False);
+}
+
+ENTRYPOINT void
+draw_stairs (ModeInfo * mi)
+{
+ stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+ GLfloat rot = current_device_rotation();
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!sp->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(sp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glRotatef(rot, 0, 0, 1);
+
+ glTranslatef(0.0, 0.0, -10.0);
+
+ if (!MI_IS_ICONIC(mi)) {
+ glScalef(Scale4Window * sp->WindH / sp->WindW, Scale4Window, Scale4Window);
+ } else {
+ glScalef(Scale4Iconic * sp->WindH / sp->WindW, Scale4Iconic, Scale4Iconic);
+ }
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ if (rot != 0 && rot != 180 && rot != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ gltrackball_rotate (sp->trackball);
+
+ glTranslatef(0, 0.5, 0);
+ glRotatef(44.5, 1, 0, 0);
+ glRotatef(50, 0, 1, 0);
+
+ if (!sp->rotating) {
+ if ((LRAND() % 500) == 0)
+ sp->rotating = (LRAND() & 1) ? 1 : -1;
+ }
+
+ if (sp->rotating) {
+ glRotatef(sp->rotating * sp->step, 0, 1, 0);
+ if (sp->step >= 360) {
+ sp->rotating = 0;
+ sp->step = 0;
+ }
+
+# ifndef DEBUG
+ if (!sp->button_down_p)
+ sp->step += 2;
+# endif /* DEBUG */
+ }
+
+ draw_stairs_internal(mi);
+
+
+# ifdef DEBUG
+ {
+ int i, j;
+# ifdef DEBUG_PATH
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glBegin (GL_LINE_LOOP);
+# endif /* DEBUG_PATH */
+ for (i = 0; i < NPOSITIONS; i ++)
+ for (j = 0; j < SPHERE_TICKS; j++)
+ mi->polygon_count += draw_sphere(i, j);
+# ifdef DEBUG_PATH
+ glEnd();
+ glEnable(GL_LIGHTING);
+ glEnable(GL_TEXTURE_2D);
+# endif /* DEBUG_PATH */
+ }
+#else /* !DEBUG */
+ mi->polygon_count += draw_sphere(sp->sphere_position, sp->sphere_tick);
+#endif /* !DEBUG */
+
+ if (sp->button_down_p)
+ ;
+ else if (++sp->sphere_tick >= SPHERE_TICKS)
+ {
+ sp->sphere_tick = 0;
+ if (++sp->sphere_position >= NPOSITIONS)
+ sp->sphere_position = 0;
+ }
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_stairs (ModeInfo * mi)
+{
+ stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+
+ if (!sp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+ENTRYPOINT void
+free_stairs (ModeInfo * mi)
+{
+ stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+ if (glIsList(sp->objects)) {
+ glDeleteLists(sp->objects, 1);
+ }
+}
+
+XSCREENSAVER_MODULE ("Stairs", stairs)
+
+#endif
diff --git a/hacks/glx/stairs.man b/hacks/glx/stairs.man
new file mode 100644
index 0000000..898f7ff
--- /dev/null
+++ b/hacks/glx/stairs.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+stairs - Escher's infinite staircase.
+.SH SYNOPSIS
+.B stairs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws an "infinite" staircase.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Marcelo Vianna.
diff --git a/hacks/glx/starwars.c b/hacks/glx/starwars.c
new file mode 100644
index 0000000..1efcd15
--- /dev/null
+++ b/hacks/glx/starwars.c
@@ -0,0 +1,1075 @@
+/* starwars, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org> and
+ * Claudio Matsuoka <claudio@helllabs.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Star Wars -- Phosphor meets a well-known scroller from a galaxy far,
+ * far away.
+ *
+ * Feb 2000 Claudio Matsuoka First version.
+ * Jan 2001 Jamie Zawinski Rewrote large sections to add the ability to
+ * run a subprocess, customization of the font
+ * size and other parameters, etc.
+ * Feb 2001 jepler@inetnebr.com Added anti-aliased lines, and fade-to-black.
+ * Feb 2005 Jamie Zawinski Added texture fonts.
+ *
+ *
+ * For the fanboys:
+ *
+ * starwars -program 'cat starwars.txt' -columns 25 -no-wrap
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <ctype.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "starwars.h"
+#define DEFAULTS "*delay: 40000 \n" \
+ "*showFPS: False \n" \
+ "*fpsTop: True \n" \
+ "*usePty: False \n" \
+ "*texFontCacheSize: 300\n" \
+ "*font: " DEF_FONT "\n" \
+ "*textLiteral: " DEF_TEXT "\n" \
+ "*program: xscreensaver-text --cols 0" /* don't wrap */
+
+# define release_sws 0
+# define sws_handle_event xlockmore_no_events
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "textclient.h"
+#include "utf8wc.h"
+
+#ifdef USE_GL /* whole file */
+
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
+
+
+#define DEF_LINES "125"
+#define DEF_STEPS "35"
+#define DEF_SPIN "0.03"
+#define DEF_SIZE "-1"
+#define DEF_COLUMNS "-1"
+#define DEF_LINE_WRAP "True"
+#define DEF_ALIGNMENT "Center"
+#define DEF_SMOOTH "True"
+#define DEF_THICK "True"
+#define DEF_FADE "True"
+#define DEF_TEXTURES "True"
+#define DEF_DEBUG "False"
+
+#define DEF_FONT "-*-utopia-bold-r-normal-*-*-360-*-*-*-*-*-*"
+
+#define TAB_WIDTH 8
+
+#define MAX_THICK_LINES 25
+#define FONT_WEIGHT 14
+
+#ifndef HAVE_MOBILE
+# define KEEP_ASPECT /* Letterboxing looks dumb on iPhone. */
+#endif
+
+#include "texfont.h"
+#include "glutstroke.h"
+#include "glut_roman.h"
+#define GLUT_FONT (&glutStrokeRoman)
+
+typedef struct {
+ Display *dpy;
+ GLXContext *glx_context;
+
+ GLuint text_list, star_list;
+ texture_font_data *texfont;
+ text_data *tc;
+
+ char *buf;
+ int buf_size;
+ int buf_tail;
+
+ char **lines;
+ int *line_widths;
+ int total_lines;
+
+ double star_theta;
+ double char_width;
+ double line_height;
+ double descent;
+ double font_scale;
+ double intra_line_scroll;
+
+ int line_pixel_width; /* in font units (for wrapping text) */
+ int line_pixel_height; /* in screen units (for computing line thickness) */
+ GLfloat line_thickness;
+
+} sws_configuration;
+
+
+static sws_configuration *scs = NULL;
+
+static int max_lines;
+static int scroll_steps;
+static float star_spin;
+static float font_size;
+static int target_columns;
+static int wrap_p;
+static int smooth_p;
+static int thick_p;
+static int fade_p;
+static int textures_p;
+static int debug_p;
+static char *alignment_str;
+static int alignment;
+
+static XrmOptionDescRec opts[] = {
+ {"-lines", ".lines", XrmoptionSepArg, 0 },
+ {"-steps", ".steps", XrmoptionSepArg, 0 },
+ {"-spin", ".spin", XrmoptionSepArg, 0 },
+ {"-size", ".size", XrmoptionSepArg, 0 },
+ {"-columns", ".columns", XrmoptionSepArg, 0 },
+/*{"-font", ".font", XrmoptionSepArg, 0 },*/
+ {"-fade", ".fade", XrmoptionNoArg, "True" },
+ {"-no-fade", ".fade", XrmoptionNoArg, "False" },
+ {"-textures", ".textures", XrmoptionNoArg, "True" },
+ {"-smooth", ".smooth", XrmoptionNoArg, "True" },
+ {"-no-smooth", ".smooth", XrmoptionNoArg, "False" },
+ {"-thick", ".thick", XrmoptionNoArg, "True" },
+ {"-no-thick", ".thick", XrmoptionNoArg, "False" },
+ {"-no-textures", ".textures", XrmoptionNoArg, "False" },
+ {"-wrap", ".lineWrap", XrmoptionNoArg, "True" },
+ {"-no-wrap", ".lineWrap", XrmoptionNoArg, "False" },
+ {"-nowrap", ".lineWrap", XrmoptionNoArg, "False" },
+ {"-alignment", ".alignment", XrmoptionSepArg, 0 },
+ {"-left", ".alignment", XrmoptionNoArg, "Left" },
+ {"-right", ".alignment", XrmoptionNoArg, "Right" },
+ {"-center", ".alignment", XrmoptionNoArg, "Center" },
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ {&max_lines, "lines", "Integer", DEF_LINES, t_Int},
+ {&scroll_steps, "steps", "Integer", DEF_STEPS, t_Int},
+ {&star_spin, "spin", "Float", DEF_SPIN, t_Float},
+ {&font_size, "size", "Float", DEF_SIZE, t_Float},
+ {&target_columns, "columns", "Integer", DEF_COLUMNS, t_Int},
+ {&wrap_p, "lineWrap", "Boolean", DEF_LINE_WRAP, t_Bool},
+ {&alignment_str, "alignment", "Alignment", DEF_ALIGNMENT, t_String},
+ {&smooth_p, "smooth", "Boolean", DEF_SMOOTH, t_Bool},
+ {&thick_p, "thick", "Boolean", DEF_THICK, t_Bool},
+ {&fade_p, "fade", "Boolean", DEF_FADE, t_Bool},
+ {&textures_p, "textures", "Boolean", DEF_TEXTURES, t_Bool},
+ {&debug_p, "debug", "Boolean", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Tabs are bad, mmmkay? */
+
+static char *
+untabify (const char *string)
+{
+ const char *ostring = string;
+ char *result = (char *) malloc ((strlen(string) * 8) + 1);
+ char *out = result;
+ int col = 0;
+ while (*string)
+ {
+ if (*string == '\t')
+ {
+ do {
+ col++;
+ *out++ = ' ';
+ } while (col % TAB_WIDTH);
+ string++;
+ }
+ else if (*string == '\r' || *string == '\n')
+ {
+ *out++ = *string++;
+ col = 0;
+ }
+ else if (*string == '\010') /* backspace */
+ {
+ if (string > ostring)
+ out--, string++;
+ }
+ else
+ {
+ *out++ = *string++;
+ col++;
+ }
+ }
+ *out = 0;
+
+ return result;
+}
+
+static void
+strip (char *s, Bool leading, Bool trailing)
+{
+ int L = strlen(s);
+ if (trailing)
+ while (L > 0 && (s[L-1] == ' ' || s[L-1] == '\t'))
+ s[L--] = 0;
+ if (leading)
+ {
+ char *s2 = s;
+ while (*s2 == ' ' || *s2 == '\t')
+ s2++;
+ if (s == s2)
+ return;
+ while (*s2)
+ *s++ = *s2++;
+ *s = 0;
+ }
+}
+
+
+static int
+sw_string_width (sws_configuration *sc, const char *s)
+{
+ if (textures_p)
+ {
+ XCharStruct e;
+ texture_string_metrics (sc->texfont, s, &e, 0, 0);
+ return e.width;
+ }
+ else
+ return glutStrokeLength (GLUT_FONT, (unsigned char *) s);
+}
+
+
+static int
+sw_string_width2 (sws_configuration *sc, const char *s, size_t size)
+{
+ char *s2 = (char *) malloc (size + 1);
+ int result;
+
+ strncpy (s2, s, size);
+ s2[size] = 0;
+
+ result = sw_string_width (sc, s2);
+
+ free (s2);
+ return result;
+}
+
+
+/* Populates the sc->lines list with as many lines as possible.
+ */
+static void
+get_more_lines (sws_configuration *sc)
+{
+ /* wrap anyway, if it's absurdly long. */
+ int wrap_pix = (wrap_p ? sc->line_pixel_width : 10000);
+
+ char *s = sc->buf;
+
+ int target = sc->buf_size - sc->buf_tail - 2;
+
+ /* Fill as much as we can into sc->buf.
+ */
+ while (target > 0)
+ {
+ int c = textclient_getc (sc->tc);
+ if (c <= 0)
+ break;
+ sc->buf[sc->buf_tail++] = (char) c;
+ sc->buf[sc->buf_tail] = 0;
+ target--;
+ }
+
+ while (sc->total_lines < max_lines)
+ {
+ char *next_s = s;
+ unsigned counter = 0;
+
+ /* OS X is really slow to calcuate the bounds for a line of text,
+ so skip ahead a bit.
+
+ Really though, the right thing to do is probably to wrap
+ CTLineCreateTruncatedLine, one way or another. */
+ for (;;)
+ {
+ if (next_s >= sc->buf + sc->buf_tail)
+ break;
+
+ if (!counter)
+ {
+ if (s > sc->buf &&
+ sw_string_width2 (sc, sc->buf, next_s - sc->buf) >= wrap_pix)
+ break;
+
+ counter = 12; /* <-- Adjust to taste. */
+ s = next_s;
+ }
+
+ if (*next_s == '\r' || *next_s == '\n')
+ break;
+
+ --counter;
+ ++next_s;
+ }
+
+ for (;;)
+ {
+ if (s >= sc->buf + sc->buf_tail)
+ /* Reached end of buffer before end of line. Bail. */
+ return;
+
+ /* When checking pixel width, always measure the line from the
+ beginning, or else multi-byte UTF-8 characters, particularly
+ combining diacriticals, aren't measured right. */
+
+ if (*s == '\r' || *s == '\n' ||
+ (s > sc->buf && sw_string_width2 (sc, sc->buf, s - sc->buf) >= wrap_pix))
+ {
+ int L = s - sc->buf;
+
+ if (*s == '\r' || *s == '\n')
+ {
+ if (*s == '\r' && s[1] == '\n') /* swallow CRLF too */
+ *s++ = 0;
+
+ *s++ = 0;
+ }
+ else
+ {
+ /* We wrapped -- try to back up to the previous word boundary. */
+ char *s2 = s;
+ int n = 0;
+ while (s2 > sc->buf && *s2 != ' ' && *s2 != '\t')
+ s2--, n++;
+ if (s2 > sc->buf)
+ {
+ s = s2;
+ *s++ = 0;
+ L = s - sc->buf;
+ }
+ }
+
+ sc->lines[sc->total_lines] = (char *) malloc (L+1);
+ memcpy (sc->lines[sc->total_lines], sc->buf, L);
+ sc->lines[sc->total_lines][L] = 0;
+
+ if (!textures_p)
+ {
+ /* The GLUT font only has ASCII characters. */
+ char *s1 = utf8_to_latin1 (sc->lines[sc->total_lines], True);
+ free (sc->lines[sc->total_lines]);
+ sc->lines[sc->total_lines] = s1;
+ }
+
+ {
+ char *t = sc->lines[sc->total_lines];
+ char *ut = untabify (t);
+ strip (ut, (alignment == 0), 1); /* if centering, strip
+ leading whitespace too */
+ sc->lines[sc->total_lines] = ut;
+ free (t);
+ }
+
+ sc->line_widths[sc->total_lines] =
+ sw_string_width(sc, sc->lines[sc->total_lines]);
+
+ sc->total_lines++;
+
+ if (sc->buf_tail > (s - sc->buf))
+ {
+ int i = sc->buf_tail - (s - sc->buf);
+ memmove (sc->buf, s, i);
+ sc->buf_tail = i;
+ sc->buf[sc->buf_tail] = 0;
+ }
+ else
+ {
+ sc->buf_tail = 0;
+ }
+
+ sc->buf[sc->buf_tail] = 0;
+ s = sc->buf;
+
+ break;
+ }
+ else
+ {
+ s++;
+ }
+ }
+ }
+}
+
+
+static void
+draw_string (sws_configuration *sc, GLfloat x, GLfloat y, const char *s)
+{
+ const char *os = s;
+ if (!s || !*s) return;
+ glPushMatrix ();
+ glTranslatef (x, y, 0);
+
+ if (textures_p)
+ print_texture_string (sc->texfont, s);
+ else
+ while (*s)
+ glutStrokeCharacter (GLUT_FONT, *s++);
+ glPopMatrix ();
+
+ if (debug_p)
+ {
+ GLfloat h = sc->line_height / sc->font_scale;
+ char **chars = utf8_split (os, 0);
+ int i, w = 0;
+ char *s2 = (char *) malloc (strlen(s) + 1);
+ *s2 = 0;
+
+ if (textures_p) glDisable (GL_TEXTURE_2D);
+ glLineWidth (1);
+
+ glColor3f (0.2, 0.2, 0.5);
+
+ glBegin (GL_LINES);
+
+ for (i = 0; chars[i]; i++)
+ {
+ glVertex3f (x + w, y - sc->descent, 0); /* char left */
+ glVertex3f (x + w, y - sc->descent + h, 0);
+ strcat (s2, chars[i]);
+ w = sw_string_width (sc, s2);
+ free (chars[i]);
+ }
+
+ glVertex3f (x + w, y - sc->descent, 0); /* char right */
+ glVertex3f (x + w, y - sc->descent + h, 0);
+
+ glVertex3f (x, y - sc->descent + h, 0); /* ascent */
+ glVertex3f (x + w, y - sc->descent + h, 0);
+
+ glVertex3f (x - sc->char_width, y, 0); /* baseline */
+ glVertex3f (x + sc->char_width + w, y, 0);
+
+ glVertex3f (x, y - sc->descent, 0); /* descent */
+ glVertex3f (x + w, y - sc->descent, 0);
+
+ glEnd();
+
+ free (s2);
+ free (chars);
+
+ if (textures_p) glEnable (GL_TEXTURE_2D);
+ }
+}
+
+
+static void
+grid (double width, double height, double xspacing, double yspacing, double z)
+{
+ double x, y;
+ for (y = 0; y <= height/2; y += yspacing)
+ {
+ glBegin(GL_LINES);
+ glVertex3f(-width/2, y, z);
+ glVertex3f( width/2, y, z);
+ glVertex3f(-width/2, -y, z);
+ glVertex3f( width/2, -y, z);
+ glEnd();
+ }
+ for (x = 0; x <= width/2; x += xspacing)
+ {
+ glBegin(GL_LINES);
+ glVertex3f( x, -height/2, z);
+ glVertex3f( x, height/2, z);
+ glVertex3f(-x, -height/2, z);
+ glVertex3f(-x, height/2, z);
+ glEnd();
+ }
+
+ glBegin(GL_LINES);
+ glVertex3f(-width, 0, z);
+ glVertex3f( width, 0, z);
+ glVertex3f(0, -height, z);
+ glVertex3f(0, height, z);
+ glEnd();
+}
+
+static void
+box (double width, double height, double depth)
+{
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-width/2, -height/2, -depth/2);
+ glVertex3f(-width/2, height/2, -depth/2);
+ glVertex3f( width/2, height/2, -depth/2);
+ glVertex3f( width/2, -height/2, -depth/2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-width/2, -height/2, depth/2);
+ glVertex3f(-width/2, height/2, depth/2);
+ glVertex3f( width/2, height/2, depth/2);
+ glVertex3f( width/2, -height/2, depth/2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-width/2, -height/2, -depth/2);
+ glVertex3f(-width/2, -height/2, depth/2);
+ glVertex3f(-width/2, height/2, depth/2);
+ glVertex3f(-width/2, height/2, -depth/2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f( width/2, -height/2, -depth/2);
+ glVertex3f( width/2, -height/2, depth/2);
+ glVertex3f( width/2, height/2, depth/2);
+ glVertex3f( width/2, height/2, -depth/2);
+ glEnd();
+
+ glBegin(GL_LINES);
+ glVertex3f(-width/2, height/2, depth/2);
+ glVertex3f(-width/2, -height/2, -depth/2);
+
+ glVertex3f( width/2, height/2, depth/2);
+ glVertex3f( width/2, -height/2, -depth/2);
+
+ glVertex3f(-width/2, -height/2, depth/2);
+ glVertex3f(-width/2, height/2, -depth/2);
+
+ glVertex3f( width/2, -height/2, depth/2);
+ glVertex3f( width/2, height/2, -depth/2);
+ glEnd();
+}
+
+
+/* Construct stars (number of stars is dependent on size of screen) */
+static void
+init_stars (ModeInfo *mi, int width, int height)
+{
+ sws_configuration *sc = &scs[MI_SCREEN(mi)];
+ int i, j;
+ int size = (width > height ? width : height);
+ int nstars = size * size / 320;
+ int max_size = 3;
+ GLfloat inc = 0.5;
+ int steps = max_size / inc;
+ GLfloat scale = 1;
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ scale *= 2;
+ nstars = (size/scale) * (size/scale) / 320;
+ }
+
+ glDeleteLists (sc->star_list, 1);
+ sc->star_list = glGenLists (1);
+ glNewList (sc->star_list, GL_COMPILE);
+
+ glEnable(GL_POINT_SMOOTH);
+
+ for (j = 1; j <= steps; j++)
+ {
+ glPointSize(inc * j * scale);
+ glBegin (GL_POINTS);
+ for (i = 0; i < nstars / steps; i++)
+ {
+ glColor3f (0.6 + frand(0.3),
+ 0.6 + frand(0.3),
+ 0.6 + frand(0.3));
+ glVertex2f (2 * size * (0.5 - frand(1.0)),
+ 2 * size * (0.5 - frand(1.0)));
+ }
+ glEnd ();
+ }
+ glEndList ();
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_sws (ModeInfo *mi, int width, int height)
+{
+ sws_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ /* Set up matrices for perspective text display
+ */
+ {
+ GLfloat desired_aspect = (GLfloat) 3/4;
+ int w = mi->xgwa.width;
+ int h = mi->xgwa.height;
+ int yoff = 0;
+ GLfloat rot = current_device_rotation();
+
+#ifdef KEEP_ASPECT
+ {
+ int h2 = w * desired_aspect;
+ yoff = (h - h2) / 2; /* Wide window: letterbox at top and bottom. */
+ if (yoff < 0) yoff = 0; /* Tall window: clip off the top. */
+ h = h2;
+ }
+#endif
+
+ glViewport (0, yoff, w, h);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ gluPerspective (80.0, 1/desired_aspect, 1000, 55000);
+ gluLookAt (0.0, 0.0, 4600.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ /* Horrible kludge to prevent the text from materializing already
+ on screen on iPhone in landscape mode.
+ */
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = 1.1;
+ glScalef (s, s, s);
+ }
+
+ glRotatef (-60.0, 1.0, 0.0, 0.0);
+
+#if 0
+ glRotatef (60.0, 1.0, 0.0, 0.0);
+ glTranslatef (260, 3200, 0);
+ glScalef (1.85, 1.85, 1);
+#endif
+
+ /* The above gives us an arena where the bottom edge of the screen is
+ represented by the line (-2100,-3140,0) - ( 2100,-3140,0). */
+
+ /* Now let's move the origin to the front of the screen. */
+ glTranslatef (0.0, -3140, 0.0);
+
+ /* And then let's scale so that the bottom of the screen is 1.0 wide. */
+ glScalef (4200, 4200, 4200);
+ }
+
+
+ /* Compute the height in pixels of the line at the bottom of the screen. */
+ {
+ GLdouble mm[17], pm[17];
+ GLint vp[5];
+ GLdouble x = 0.5, y1 = 0, z = 0;
+ GLdouble y2 = sc->line_height;
+ GLdouble wx=-1, wy1=-1, wy2=-1, wz=-1;
+
+ glGetDoublev (GL_MODELVIEW_MATRIX, mm);
+ glGetDoublev (GL_PROJECTION_MATRIX, pm);
+ glGetIntegerv (GL_VIEWPORT, vp);
+ gluProject (x, y1, z, mm, pm, vp, &wx, &wy1, &wz);
+ gluProject (x, y2, z, mm, pm, vp, &wx, &wy2, &wz);
+ sc->line_pixel_height = (wy2 - wy1);
+ glLineWidth (1);
+ }
+
+ /* Compute the best looking line thickness for the bottom line.
+ */
+ if (!thick_p)
+ sc->line_thickness = 1.0;
+ else
+ sc->line_thickness = (GLfloat) sc->line_pixel_height / FONT_WEIGHT;
+
+ if (sc->line_thickness < 1.2)
+ sc->line_thickness = 1.0;
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+ sws_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+
+ if (smooth_p)
+ {
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+ }
+
+ sc->text_list = glGenLists (1);
+ glNewList (sc->text_list, GL_COMPILE);
+ glEndList ();
+
+ sc->star_list = glGenLists (1);
+ glNewList (sc->star_list, GL_COMPILE);
+ glEndList ();
+
+ sc->line_thickness = 1.0;
+}
+
+
+ENTRYPOINT void
+init_sws (ModeInfo *mi)
+{
+ double font_height;
+
+ sws_configuration *sc = 0;
+
+ MI_INIT (mi, scs);
+
+ sc = &scs[MI_SCREEN(mi)];
+
+ sc->dpy = MI_DISPLAY(mi);
+ sc = &scs[MI_SCREEN(mi)];
+ /* Unchecked malloc. :( */
+ sc->lines = (char **) calloc (max_lines+1, sizeof(char *));
+ sc->line_widths = (int *) calloc (max_lines+1, sizeof(int));
+
+ if ((sc->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ reshape_sws (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ init_stars (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ if (textures_p)
+ {
+ XCharStruct e;
+ int cw, ascent, descent;
+ sc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+ texture_string_metrics (sc->texfont, "n", &e, &ascent, &descent);
+ cw = e.width;
+ sc->char_width = cw;
+ font_height = ascent + descent;
+ sc->descent = descent;
+ glEnable(GL_ALPHA_TEST);
+ glEnable (GL_TEXTURE_2D);
+
+ check_gl_error ("loading font");
+
+ /* "Anistropic filtering helps for quadrilateral-angled textures.
+ A sharper image is accomplished by interpolating and filtering
+ multiple samples from one or more mipmaps to better approximate
+ very distorted textures. This is the next level of filtering
+ after trilinear filtering." */
+ if (smooth_p &&
+ strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ {
+ GLfloat anisotropic = 0.0;
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisotropic);
+ if (anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ anisotropic);
+ }
+ }
+ else
+ {
+ font_height = GLUT_FONT->top - GLUT_FONT->bottom;
+ sc->char_width = glutStrokeWidth (GLUT_FONT, 'z'); /* 'n' seems wide */
+ sc->descent = 0;
+ }
+
+ sc->font_scale = 1.0 / sc->char_width;
+
+
+ /* We consider a font that consumes 80 columns to be "18 points".
+
+ If neither -size nor -columns was specified, default to 60 columns
+ (which is 24 points.)
+
+ If both were specified, -columns has priority.
+ */
+ {
+ int base_col = 80;
+ int base_size = 18;
+
+ if (target_columns <= 0 && font_size <= 0)
+ target_columns = 60;
+
+ if (target_columns > 0)
+ font_size = base_size * (base_col / (double) target_columns);
+ else if (font_size > 0)
+ target_columns = base_col * (base_size / (double) font_size);
+ }
+
+ sc->line_pixel_width = target_columns * sc->char_width;
+
+ sc->font_scale /= target_columns;
+ sc->line_height = font_height * sc->font_scale;
+
+ /* Buffer only a few lines of text.
+ If the buffer is too big, there's a significant delay between
+ when the program launches and when the text appears, which can be
+ irritating for time-sensitive output (clock, current music, etc.)
+
+ I'd like to buffer only 2 lines, but we need to assume that we
+ could get a whole line of N-byte Unicrud, and if we fill the buffer
+ before hitting the end of the line, we stall.
+ */
+ sc->buf_size = target_columns * 2 * 4;
+ if (sc->buf_size < 80) sc->buf_size = 80;
+ sc->buf = (char *) calloc (1, sc->buf_size);
+
+ sc->total_lines = max_lines-1;
+
+ if (random() & 1)
+ star_spin = -star_spin;
+
+ if (!alignment_str || !*alignment_str ||
+ !strcasecmp(alignment_str, "left"))
+ alignment = -1;
+ else if (!strcasecmp(alignment_str, "center") ||
+ !strcasecmp(alignment_str, "middle"))
+ alignment = 0;
+ else if (!strcasecmp(alignment_str, "right"))
+ alignment = 1;
+ else
+ {
+ fprintf (stderr,
+ "%s: alignment must be left, center, or right, not \"%s\"\n",
+ progname, alignment_str);
+ exit (1);
+ }
+
+ sc->tc = textclient_open (sc->dpy);
+
+ /* one more reshape, after line_height has been computed */
+ reshape_sws (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+static void
+draw_stars (ModeInfo *mi)
+{
+ sws_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ glMatrixMode (GL_PROJECTION);
+ glPushMatrix ();
+ {
+ glLoadIdentity ();
+
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ {
+ glLoadIdentity ();
+ glOrtho (-0.5 * MI_WIDTH(mi), 0.5 * MI_WIDTH(mi),
+ -0.5 * MI_HEIGHT(mi), 0.5 * MI_HEIGHT(mi),
+ -100.0, 100.0);
+ glRotatef (sc->star_theta, 0.0, 0.0, 1.0);
+ if (textures_p) glDisable (GL_TEXTURE_2D);
+
+ glCallList (sc->star_list);
+ if (textures_p) glEnable (GL_TEXTURE_2D);
+ }
+ glPopMatrix ();
+ }
+ glMatrixMode (GL_PROJECTION);
+ glPopMatrix ();
+}
+
+ENTRYPOINT void
+draw_sws (ModeInfo *mi)
+{
+ sws_configuration *sc = &scs[MI_SCREEN(mi)];
+/* XtAppContext app = XtDisplayToApplicationContext (sc->dpy);*/
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!sc->glx_context)
+ return;
+
+ glDrawBuffer (GL_BACK);
+ glXMakeCurrent (dpy, window, *(sc->glx_context));
+
+ glClear (GL_COLOR_BUFFER_BIT);
+
+ draw_stars (mi);
+
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+
+# ifdef HAVE_MOBILE
+ /* Need to do this every time to get device rotation right */
+ reshape_sws (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+# endif
+
+ if (debug_p)
+ {
+ int i;
+ glPushMatrix ();
+ if (textures_p) glDisable (GL_TEXTURE_2D);
+ glLineWidth (1);
+ glTranslatef (0,-1, 0);
+
+ glColor3f(1, 0, 0); /* Red line is where text appears */
+ glPushMatrix();
+ glTranslatef(0, -0.028, 0);
+ glLineWidth (4);
+ glBegin(GL_LINES);
+ glVertex3f(-0.5, 1, 0);
+ glVertex3f( 0.5, 1, 0);
+ glVertex3f(-0.5, -1, 0);
+ glVertex3f( 0.5, -1, 0);
+ glEnd();
+ glLineWidth (1);
+ glPopMatrix();
+
+ glColor3f (0.2, 0.2, 0.2);
+ for (i = 0; i < 16; i++)
+ {
+ box (1, 1, 1);
+ grid (1, 1, sc->char_width * sc->font_scale, sc->line_height, 0);
+ glTranslatef(0, 1, 0);
+ }
+ if (textures_p) glEnable (GL_TEXTURE_2D);
+ glPopMatrix ();
+ check_gl_error ("debug render");
+ }
+
+ /* Scroll to current position */
+ glTranslatef (0.0, sc->intra_line_scroll, 0.0);
+
+ glColor3f (1.0, 1.0, 0.4);
+
+ mi->polygon_count = 0;
+
+ glPushMatrix ();
+ glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
+ for (i = 0; i < sc->total_lines; i++)
+ {
+ double fade = (fade_p ? 1.0 * i / sc->total_lines : 1.0);
+ int offscreen_lines = 2;
+
+ double x = -0.5;
+ double y = ((sc->total_lines - (i + offscreen_lines) - 1)
+ * sc->line_height);
+ double xoff = 0;
+ char *line = sc->lines[i];
+
+ if (debug_p)
+ {
+ double xx = x * 1.4; /* a little more to the left */
+ char n[20];
+ sprintf(n, "%d:", i);
+ glColor3f (1.0, 1.0, 1.0);
+ draw_string (sc, xx / sc->font_scale, y / sc->font_scale, n);
+ }
+
+ if (!line || !*line)
+ continue;
+
+ if (sc->line_thickness != 1 && !textures_p)
+ {
+ int max_thick_lines = MAX_THICK_LINES;
+ GLfloat thinnest_line = 1.0;
+ GLfloat thickest_line = sc->line_thickness;
+ GLfloat range = thickest_line - thinnest_line;
+ GLfloat thickness;
+
+ int j = sc->total_lines - i - 1;
+
+ if (j > max_thick_lines)
+ thickness = thinnest_line;
+ else
+ thickness = (thinnest_line +
+ (range * ((max_thick_lines - j) /
+ (GLfloat) max_thick_lines)));
+
+ glLineWidth (thickness);
+ }
+
+ if (alignment >= 0)
+ {
+ int n = sc->line_widths[i];
+ xoff = 1.0 - (n * sc->font_scale);
+ }
+
+ if (alignment == 0)
+ xoff /= 2;
+
+ glColor3f (fade, fade, 0.5 * fade);
+ draw_string (sc, (x + xoff) / sc->font_scale, y / sc->font_scale,
+ line);
+ if (textures_p)
+ mi->polygon_count += strlen (line);
+ }
+ glPopMatrix ();
+
+
+
+ sc->intra_line_scroll += sc->line_height / scroll_steps;
+
+ if (sc->intra_line_scroll >= sc->line_height)
+ {
+ sc->intra_line_scroll = 0;
+
+ /* Drop the oldest line off the end. */
+ if (sc->lines[0])
+ free (sc->lines[0]);
+
+ /* Scroll the contents of the lines array toward 0. */
+ if (sc->total_lines > 0)
+ {
+ for (i = 1; i < sc->total_lines; i++) {
+ sc->lines[i-1] = sc->lines[i];
+ sc->line_widths[i-1] = sc->line_widths[i];
+ }
+ sc->lines[--sc->total_lines] = 0;
+ }
+
+ /* Bring in new lines at the end. */
+ get_more_lines (sc);
+
+ if (sc->total_lines < max_lines)
+ /* Oops, we ran out of text... well, insert some blank lines
+ here so that new text still pulls in from the bottom of
+ the screen, isntead of just appearing. */
+ sc->total_lines = max_lines;
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+
+ sc->star_theta += star_spin;
+}
+
+ENTRYPOINT void
+free_sws (ModeInfo *mi)
+{
+ sws_configuration *sc = &scs[MI_SCREEN(mi)];
+ if (sc->tc)
+ textclient_close (sc->tc);
+
+ /* #### there's more to free here */
+}
+
+
+#ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ "starwars.txt" in the defaults... */
+#endif
+
+XSCREENSAVER_MODULE_2 ("StarWars", starwars, sws)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/starwars.h b/hacks/glx/starwars.h
new file mode 100644
index 0000000..fc0a3f5
--- /dev/null
+++ b/hacks/glx/starwars.h
@@ -0,0 +1,363 @@
+#define DEF_TEXT \
+"Episode IV\\n" \
+"\\n" \
+"STAR WARS: A NEW HOPE\\n" \
+"\\n" \
+"It is a period of Civil War.\\n" \
+"Rebel Spaceships, striking\\n" \
+"from a hidden base, have won\\n" \
+"their first victory against\\n" \
+"the evil Galactic Empire.\\n" \
+"\\n" \
+"During the battle, Rebel\\n" \
+"spies managed to steal secret\\n" \
+"plans to the Empire's\\n" \
+"ultimate weapon, the DEATH\\n" \
+"STAR, an armored space\\n" \
+"station with enough power to\\n" \
+"destroy an entire planet.\\n" \
+"\\n" \
+"Pursued by the Empire's\\n" \
+"sinister agents, Princess\\n" \
+"Leia races home aboard her\\n" \
+"starship, custodian of the\\n" \
+"stolen plans that can save\\n" \
+"her people and restore\\n" \
+"freedom to the galaxy...\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"Episode V\\n" \
+"\\n" \
+"THE EMPIRE STRIKES BACK\\n" \
+"\\n" \
+"It is a dark time for the\\n" \
+"Rebellion. Although the Death\\n" \
+"Star has been destroyed,\\n" \
+"Imperial troops have driven the\\n" \
+"Rebel forces from their hidden\\n" \
+"base and pursued them across\\n" \
+"the galaxy.\\n" \
+"\\n" \
+"Evading the dreaded Imperial\\n" \
+"Starfleet, a group of freedom\\n" \
+"fighters led by Luke Skywalker\\n" \
+"has established a new secret\\n" \
+"base on the remote ice world\\n" \
+"of Hoth.\\n" \
+"\\n" \
+"The evil lord Darth Vader,\\n" \
+"obsessed with finding young\\n" \
+"Skywalker, has dispatched\\n" \
+"thousands of remote probes into\\n" \
+"the far reaches of space....\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"Episode VI\\n" \
+"\\n" \
+"RETURN OF THE JEDI\\n" \
+"\\n" \
+"Luke Skywalker has returned to\\n" \
+"his home planet of Tatooine in\\n" \
+"an attempt to rescue his\\n" \
+"friend Han Solo from the\\n" \
+"clutches of the vile gangster\\n" \
+"Jabba the Hutt.\\n" \
+"\\n" \
+"Little does Luke know that the\\n" \
+"GALACTIC EMPIRE has secretly\\n" \
+"begun construction on a new\\n" \
+"armored space station even\\n" \
+"more powerful than the first\\n" \
+"dreaded Death Star.\\n" \
+"\\n" \
+"When completed, this ultimate\\n" \
+"weapon will spell certain doom\\n" \
+"for the small band of rebels\\n" \
+"struggling to restore freedom\\n" \
+"to the galaxy...\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"Episode I\\n" \
+"\\n" \
+"THE PHANTOM MENACE\\n" \
+"\\n" \
+"Turmoil has engulfed the\\n" \
+"Galactic Republic. The taxation\\n" \
+"of trade routes to outlying star\\n" \
+"systems is in dispute.\\n" \
+"\\n" \
+"Hoping to resolve the matter\\n" \
+"with a blockade of deadly\\n" \
+"battleships, the greedy Trade\\n" \
+"Federation has stopped all\\n" \
+"shipping to the small planet\\n" \
+"of Naboo.\\n" \
+"\\n" \
+"While the Congress of the\\n" \
+"Republic endlessly debates\\n" \
+"this alarming chain of events,\\n" \
+"the Supreme Chancellor has\\n" \
+"secretly dispatched two Jedi\\n" \
+"Knights, the guardians of\\n" \
+"peace and justice in the\\n" \
+"galaxy to settle the conflict...\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"Episode II\\n" \
+"\\n" \
+"ATTACK OF THE CLONES\\n" \
+"\\n" \
+"There is unrest in the Galactic\\n" \
+"Senate. Several thousand solar\\n" \
+"systems have declared their\\n" \
+"intentions to leave the Republic.\\n" \
+"\\n" \
+"This separatist movement,\\n" \
+"under the leadership of the\\n" \
+"mysterious Count Dooku, has\\n" \
+"made it difficult for the limited\\n" \
+"number of Jedi Knights to\\n" \
+"maintain peace and order in the\\n" \
+"galaxy.\\n" \
+"\\n" \
+"Senator Amidala, the former\\n" \
+"Queen of Naboo, is returning\\n" \
+"to the Galactic Senate to vote\\n" \
+"on the critical issue of creating\\n" \
+"an ARMY OF THE REPUBLIC\\n" \
+"to assist the overwhelmed\\n" \
+"Jedi....\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"Episode III\\n" \
+"\\n" \
+"REVENGE OF THE SITH\\n" \
+"\\n" \
+"War! The Republic is crumbling\\n" \
+"under attacks by the ruthless\\n" \
+"Sith Lord, Count Dooku.\\n" \
+"There are heroes on both sides.\\n" \
+"Evil is everywhere.\\n" \
+"\\n" \
+"In a stunning move, the\\n" \
+"fiendish droid leader, General\\n" \
+"Grievous, has swept into the\\n" \
+"Republic capital and kidnapped\\n" \
+"Chancellor Palpatine, leader of\\n" \
+"the Galactic Senate.\\n" \
+"\\n" \
+"As the Separatist Droid Army\\n" \
+"attempts to flee th besieged\\n" \
+"capital with their valuable\\n" \
+"hostage, two Jedi Knights lead a\\n" \
+"desperate mission to rescue the\\n" \
+"captive Chancellor....\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"Episode VII\\n" \
+"THE FORCE AWAKENS\\n" \
+"Luke Skywalker has vanished.\\n" \
+"In his absence, the sinister\\n" \
+"FIRST ORDER has risen from\\n" \
+"the ashes of the Empire\\n" \
+"and will not rest until\\n" \
+"Skywalker, the last Jedi,\\n" \
+"has been destroyed.\\n" \
+"\\n" \
+"With the support of the\\n" \
+"REPUBLIC, General Leia Organa\\n" \
+"leads a brave RESISTANCE.\\n" \
+"She is desperate to find her\\n" \
+"brother Luke and gain his\\n" \
+"help in restoring peace and \\n" \
+"justice to the galaxy.\\n" \
+"\\n" \
+"Leia has sent her most daring\\n" \
+"pilot on a secret mission\\n" \
+"to Jakku, where an old ally\\n" \
+"has discovered a clue to\\n" \
+"Luke's whereabouts...\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n" \
+"\\n"
diff --git a/hacks/glx/starwars.man b/hacks/glx/starwars.man
new file mode 100644
index 0000000..d7dc7f2
--- /dev/null
+++ b/hacks/glx/starwars.man
@@ -0,0 +1,181 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+starwars - draws a perspective text crawl, like at the beginning of the movie
+.SH SYNOPSIS
+.B starwars
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
+[\-program \fIcommand\fP]
+[\-size \fIinteger\fP ]
+[\-columns \fIinteger\fP]
+[\-wrap | \-no\-wrap]
+[\-left | \-center | \-right]
+[\-lines \fIinteger\fP]
+[\-spin \fIfloat\fP]
+[\-steps \fIinteger\fP]
+[\-delay \fIusecs\fP]
+[\-font \fIxlfd\fP]
+[\-no\-textures]
+[\-no\-smooth]
+[\-no\-thick]
+[\-fps]
+.SH DESCRIPTION
+The \fIstarwars\fP program runs another program to generate a stream of
+text, then animates that text receeding into the background at an angle,
+in front of a star field.
+.SH OPTIONS
+.I starwars
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-program \fIsh-command\fP
+The command to run to generate the text to display. This option may be
+any string acceptable to /bin/sh. The program will be run at the end of
+a pipe, and any characters that it prints to \fIstdout\fP will be printed
+on the starwars window. If the program exits, it will be launched again
+after we have processed all the text it produced.
+
+Note that starwars is \fInot\fP a terminal emulator: programs that try to
+directly address the screen will not do what you might expect. This
+program merely draws the characters on the screen left to right, top
+to bottom, in perspective. Lines (may) wrap when they reach the right
+edge.
+
+In other words, programs like
+.BR fortune (1)
+will work, but programs like
+.BR top (1)
+won't.
+
+Some examples:
+.EX
+starwars -program 'cat /usr/src/linux*/README'
+starwars -columns 30 -program 'ping www.starwars.com'
+starwars -left -no-wrap -program 'ps -auxwwf'
+starwars -left -no-wrap -columns 45 -program 'top -bn1'
+starwars -left -columns 40 -program 'od -txC /dev/urandom'
+starwars -font fixed -program 'od -txC /dev/urandom'
+.EE
+.TP 8
+.B \-size \fIinteger\fP
+How large a font to use, in points. (Well, in some arbitrary unit
+we're calling "points" for the sake of argument.) Default: 24.
+.TP 8
+.B \-columns \fIinteger\fP
+How many columns of text should be visible on the bottom line of the
+screen. Default: 60.
+
+Only one of \fI\-columns\fP and \fI\-size\fP may be specified;
+if both are specified, \fI\-columns\fP takes priority.
+.TP 8
+.B \-wrap
+Word-wrap lines when they reach the rightmost column. This is the default.
+.TP 8
+.B \-no\-wrap
+Do not word-wrap: just let the lines go off the right side of the screen.
+.TP 8
+.B \-left | \-center | \-right
+Whether to align the text flush left, centered, or flush right.
+The default is centered.
+.TP 8
+.B \-lines \fIinteger\fP
+How many lines should be allowed to be on the screen before they fall off
+the end. The default is 125.
+.TP 8
+.B \-spin \fIfloat\fP
+The star field on the background slowly rotates. This is how fast.
+The default is 0.03.
+.TP 8
+.B \-steps \fIinteger\fP
+How many steps should be used to scroll a single line. The default is 35.
+If the animation looks jerky to you, increase this number.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation; default is 40000 (1/25th second.)
+.TP 8
+.B \-font \fIfont-name\fP
+The name of the font to use. For best effect, this should be a large
+font (at least 36 points.) The bigger the font, the better looking the
+characters will be. Note that the size of this font affects only the
+clarity of the characters, not their size on the screen: for that, use
+the \fI\-size\fP or \fI\-columns\fP options.
+
+Default: -*-utopia-bold-r-normal-*-*-720-*-*-*-*-iso8859-1
+.TP 8
+.B \-no\-textures
+Instead of texture-mapping a real font to render the text, use a
+built-in font composed of line segments. On graphics cards without
+texture support, the line-segment font will have much better
+performance.
+.TP 8
+.B \-no\-smooth
+When using the line-segment font, turn off anti-aliasing of the lines
+used to draw the font. This will make the text blockier, but may
+improve performance.
+.TP 8
+.B \-no\-thick
+When using the line-segment font, turn off use of thick lines for the
+characters that are close to the foreground. This will make the text
+appear unnaturally skinny, but may improve performance.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR fontglide (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 1998-2005 by Jamie Zawinski and Claudio Matsuoka.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org> and Claudio Matauoka <claudio@helllabs.org>
diff --git a/hacks/glx/starwars.txt b/hacks/glx/starwars.txt
new file mode 100644
index 0000000..0412ded
--- /dev/null
+++ b/hacks/glx/starwars.txt
@@ -0,0 +1,415 @@
+Episode IV
+
+STAR WARS: A NEW HOPE
+
+It is a period of Civil War.
+Rebel Spaceships, striking
+from a hidden base, have won
+their first victory against
+the evil Galactic Empire.
+
+During the battle, Rebel
+spies managed to steal secret
+plans to the Empire's
+ultimate weapon, the DEATH
+STAR, an armored space
+station with enough power to
+destroy an entire planet.
+
+Pursued by the Empire's
+sinister agents, Princess
+Leia races home aboard her
+starship, custodian of the
+stolen plans that can save
+her people and restore
+freedom to the galaxy.....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode V
+
+THE EMPIRE STRIKES BACK
+
+It is a dark time for the
+Rebellion. Although the Death
+Star has been destroyed,
+Imperial troops have driven the
+Rebel forces from their hidden
+base and pursued them across
+the galaxy.
+
+Evading the dreaded Imperial
+Starfleet, a group of freedom
+fighters led by Luke Skywalker
+has established a new secret
+base on the remote ice world
+of Hoth.
+
+The evil lord Darth Vader,
+obsessed with finding young
+Skywalker, has dispatched
+thousands of remote probes into
+the far reaches of space....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode VI
+
+RETURN OF THE JEDI
+
+Luke Skywalker has returned to
+his home planet of Tatooine in
+an attempt to rescue his
+friend Han Solo from the
+clutches of the vile gangster
+Jabba the Hutt.
+
+Little does Luke know that the
+GALACTIC EMPIRE has secretly
+begun construction on a new
+armored space station even
+more powerful than the first
+dreaded Death Star.
+
+When completed, this ultimate
+weapon will spell certain doom
+for the small band of rebels
+struggling to restore freedom
+to the galaxy...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode I
+
+THE PHANTOM MENACE
+
+Turmoil has engulfed the
+Galactic Republic. The taxation
+of trade routes to outlying star
+systems is in dispute.
+
+Hoping to resolve the matter
+with a blockade of deadly
+battleships, the greedy Trade
+Federation has stopped all
+shipping to the small planet
+of Naboo.
+
+While the Congress of the
+Republic endlessly debates
+this alarming chain of events,
+the Supreme Chancellor has
+secretly dispatched two Jedi
+Knights, the guardians of
+peace and justice in the
+galaxy, to settle the conflict....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode II
+
+ATTACK OF THE CLONES
+
+There is unrest in the Galactic
+Senate. Several thousand solar
+systems have declared their
+intentions to leave the Republic.
+
+This separatist movement,
+under the leadership of the
+mysterious Count Dooku, has
+made it difficult for the limited
+number of Jedi Knights to maintain
+peace and order in the galaxy.
+
+Senator Amidala, the former
+Queen of Naboo, is returning
+to the Galactic Senate to vote
+on the critical issue of creating
+an ARMY OF THE REPUBLIC
+to assist the overwhelmed
+Jedi....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode III
+
+REVENGE OF THE SITH
+
+War! The Republic is crumbling
+under attacks by the ruthless
+Sith Lord, Count Dooku.
+There are heroes on both sides.
+Evil is everywhere.
+
+In a stunning move, the
+fiendish droid leader, General
+Grievous, has swept into the
+Republic capital and kidnapped
+Chancellor Palpatine, leader of
+the Galactic Senate.
+
+As the Separatist Droid Army
+attempts to flee the besieged
+capital with their valuable
+hostage, two Jedi Knights lead a
+desperate mission to rescue the
+captive Chancellor....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode VII
+
+THE FORCE AWAKENS
+
+Luke Skywalker has vanished.
+In his absence, the sinister
+FIRST ORDER has risen from
+the ashes of the Empire
+and will not rest until
+Skywalker, the last Jedi,
+has been destroyed.
+
+With the support of the
+REPUBLIC, General Leia Organa
+leads a brave RESISTANCE.
+She is desperate to find her
+brother Luke and gain his
+help in restoring peace
+and justice to the galaxy.
+
+Leia has sent her most daring
+pilot on a secret mission
+to Jakku, where an old ally
+has discovered a clue to
+Luke's whereabouts....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode VIII
+
+THE LAST JEDI
+
+The FIRST ORDER reigns.
+Having decimated the peaceful
+Republic, Supreme Leader Snoke
+now deploys the merciless
+legions to seize military
+control of the galaxy.
+
+Only General Leia Organa's
+band of RESISTANCE fighters
+stand against the rising
+tyranny, certain that Jedi
+Master Luke Skywalker will
+return and restore a spark of
+hope to the fight.
+
+But the Resistance has been
+exposed. As the First Order
+speeds toward the rebel base,
+the brave heroes mount a
+desperate escape....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hacks/glx/stonerview-move.c b/hacks/glx/stonerview-move.c
new file mode 100644
index 0000000..8639f10
--- /dev/null
+++ b/hacks/glx/stonerview-move.c
@@ -0,0 +1,147 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "yarandom.h"
+#include "stonerview.h"
+
+
+void
+stonerview_init_move(stonerview_state *st)
+{
+ /*st->theta = new_osc_linear(
+ new_osc_wrap(0, 36000, 25),
+ new_osc_constant(2000));*/
+
+ st->theta = new_osc_linear(st,
+ new_osc_velowrap(st, 0, 36000, new_osc_multiplex(st,
+ new_osc_randphaser(st, 300, 600),
+ new_osc_constant(st, 25),
+ new_osc_constant(st, 75),
+ new_osc_constant(st, 50),
+ new_osc_constant(st, 100))
+ ),
+
+ new_osc_multiplex(st,
+ new_osc_buffer(st, new_osc_randphaser(st, 300, 600)),
+ new_osc_buffer(st, new_osc_wrap(st, 0, 36000, 10)),
+ new_osc_buffer(st, new_osc_wrap(st, 0, 36000, -8)),
+ new_osc_wrap(st, 0, 36000, 4),
+ new_osc_buffer(st, new_osc_bounce(st, -2000, 2000, 20))
+ )
+ );
+
+ st->rad = new_osc_buffer(st, new_osc_multiplex(st,
+ new_osc_randphaser(st, 250, 500),
+ new_osc_bounce(st, -1000, 1000, 10),
+ new_osc_bounce(st, 200, 1000, -15),
+ new_osc_bounce(st, 400, 1000, 10),
+ new_osc_bounce(st, -1000, 1000, -20)));
+ /*st->rad = new_osc_constant(st, 1000);*/
+
+ st->alti = new_osc_linear(st,
+ new_osc_constant(st, -1000),
+ new_osc_constant(st, 2000 / st->num_els));
+
+ /*st->alti = new_osc_multiplex(
+ new_osc_buffer(st, new_osc_randphaser(60, 270)),
+ new_osc_buffer(st, new_osc_bounce(-1000, 1000, 48)),
+ new_osc_linear(
+ new_osc_constant(-1000),
+ new_osc_constant(2000 / st->num_els)),
+ new_osc_buffer(st, new_osc_bounce(-1000, 1000, 27)),
+ new_osc_linear(
+ new_osc_constant(-1000),
+ new_osc_constant(2000 / st->num_els))
+ );*/
+
+ /*st->color = new_osc_buffer(st, new_osc_randphaser(5, 35));*/
+
+ /*st->color = new_osc_buffer(st, new_osc_multiplex(
+ new_osc_randphaser(25, 70),
+ new_osc_wrap(0, 3600, 20),
+ new_osc_wrap(0, 3600, 30),
+ new_osc_wrap(0, 3600, -20),
+ new_osc_wrap(0, 3600, 10)));*/
+ st->color = new_osc_multiplex(st,
+ new_osc_buffer(st, new_osc_randphaser(st, 150, 300)),
+ new_osc_buffer(st, new_osc_wrap(st, 0, 3600, 13)),
+ new_osc_buffer(st, new_osc_wrap(st, 0, 3600, 32)),
+ new_osc_buffer(st, new_osc_wrap(st, 0, 3600, 17)),
+ new_osc_buffer(st, new_osc_wrap(st, 0, 3600, 7)));
+
+ stonerview_move_increment(st);
+}
+
+/* Set up the list of polygon data for rendering. */
+void
+stonerview_move_increment(stonerview_state *st)
+{
+ int ix, val;
+/* double fval; */
+/* double recipels = (1.0 / (double)st->num_els); */
+ double pt[2];
+ double ptrad, pttheta;
+
+ for (ix=0; ix<st->num_els; ix++) {
+ stonerview_elem_t *el = &st->elist[ix];
+
+ /* Grab r and theta... */
+ val = osc_get(st, st->theta, ix);
+ pttheta = val * (0.01 * M_PI / 180.0);
+ ptrad = (double)osc_get(st, st->rad, ix) * 0.001;
+ /* And convert them to x,y coordinates. */
+ pt[0] = ptrad * cos(pttheta);
+ pt[1] = ptrad * sin(pttheta);
+
+ /* Set x,y,z. */
+ el->pos[0] = pt[0];
+ el->pos[1] = pt[1];
+ el->pos[2] = (double)osc_get(st, st->alti, ix) * 0.001;
+
+ /* Set which way the square is rotated. This is fixed for now, although
+ it would be trivial to make the squares spin as they revolve. */
+ el->vervec[0] = 0.11;
+ el->vervec[1] = 0.0;
+
+ /* Grab the color, and convert it to RGB values. Technically, we're
+ converting an HSV value to RGB, where S and V are always 1. */
+ val = osc_get(st, st->color, ix);
+ if (val < 1200) {
+ el->col[0] = ((double)val / 1200.0);
+ el->col[1] = 0;
+ el->col[2] = (double)(1200 - val) / 1200.0;
+ }
+ else if (val < 2400) {
+ el->col[0] = (double)(2400 - val) / 1200.0;
+ el->col[1] = ((double)(val - 1200) / 1200.0);
+ el->col[2] = 0;
+ }
+ else {
+ el->col[0] = 0;
+ el->col[1] = (double)(3600 - val) / 1200.0;
+ el->col[2] = ((double)(val - 2400) / 1200.0);
+ }
+ el->col[3] = 1.0;
+ }
+
+ osc_increment(st);
+}
+
diff --git a/hacks/glx/stonerview-move.h b/hacks/glx/stonerview-move.h
new file mode 100644
index 0000000..82073e9
--- /dev/null
+++ b/hacks/glx/stonerview-move.h
@@ -0,0 +1,32 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+#ifndef __STONERVIEW_MOVE_H__
+#define __STONERVIEW_MOVE_H__
+
+typedef struct {
+ double pos[3];
+ double vervec[2];
+ double col[4];
+} stonerview_elem_t;
+
+extern void stonerview_init_move(stonerview_state *);
+extern void stonerview_final_move(stonerview_state *);
+extern void stonerview_move_increment(stonerview_state *);
+
+
+extern stonerview_state * stonerview_init_view(int wireframe_p,
+ int transparent_p);
+extern void stonerview_win_draw(stonerview_state *);
+extern void stonerview_win_release(stonerview_state *);
+
+#endif /* __STONERVIEW_MOVE_H__ */
diff --git a/hacks/glx/stonerview-osc.c b/hacks/glx/stonerview-osc.c
new file mode 100644
index 0000000..1b79a23
--- /dev/null
+++ b/hacks/glx/stonerview-osc.c
@@ -0,0 +1,341 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "yarandom.h"
+#include "stonerview.h"
+
+
+/* Return a random number between min and max, inclusive. */
+static int rand_range(int min, int max)
+{
+ int res;
+ unsigned int diff = (max+1) - min;
+ if (diff <= 1)
+ return min;
+ res = random() % diff;
+ return min+res;
+}
+
+
+/* Create a new, blank osc_t. The caller must fill in the type data. */
+static osc_t *create_osc(stonerview_state *st, int type)
+{
+ osc_t *osc = (osc_t *)malloc(sizeof(osc_t));
+ if (!osc)
+ return NULL;
+
+ osc->type = type;
+ osc->next = NULL;
+
+ *st->osctail = osc;
+ st->osctail = &(osc->next);
+
+ return osc;
+}
+
+/* Creation functions for all the osc_t types. These are all pretty obvious
+ in their construction. */
+
+osc_t *new_osc_constant(stonerview_state *st, int val)
+{
+ osc_t *osc = create_osc(st, otyp_Constant);
+ if (!osc)
+ return NULL;
+
+ osc->u.oconstant.val = val;
+ return osc;
+}
+
+osc_t *new_osc_bounce(stonerview_state *st, int min, int max, int step)
+{
+ int diff;
+ osc_t *osc = create_osc(st, otyp_Bounce);
+ if (!osc)
+ return NULL;
+
+ osc->u.obounce.min = min;
+ osc->u.obounce.max = max;
+ osc->u.obounce.step = step;
+
+ /* Pick a random initial value between min and max. */
+ if (step < 0)
+ step = (-step);
+ diff = (max-min) / step;
+ osc->u.obounce.val = min + step * rand_range(0, diff-1);
+
+ return osc;
+}
+
+osc_t *new_osc_wrap(stonerview_state *st, int min, int max, int step)
+{
+ int diff;
+ osc_t *osc = create_osc(st, otyp_Wrap);
+ if (!osc)
+ return NULL;
+
+ osc->u.owrap.min = min;
+ osc->u.owrap.max = max;
+ osc->u.owrap.step = step;
+
+ /* Pick a random initial value between min and max. */
+ if (step < 0)
+ step = (-step);
+ diff = (max-min) / step;
+ osc->u.owrap.val = min + step * rand_range(0, diff-1);
+
+ return osc;
+}
+
+osc_t *new_osc_velowrap(stonerview_state *st, int min, int max, osc_t *step)
+{
+ osc_t *osc = create_osc(st, otyp_VeloWrap);
+ if (!osc)
+ return NULL;
+
+ osc->u.ovelowrap.min = min;
+ osc->u.ovelowrap.max = max;
+ osc->u.ovelowrap.step = step;
+
+ /* Pick a random initial value between min and max. */
+ osc->u.ovelowrap.val = rand_range(min, max);
+
+ return osc;
+}
+
+osc_t *new_osc_multiplex(stonerview_state *st,
+ osc_t *sel, osc_t *ox0,
+ osc_t *ox1, osc_t *ox2,
+ osc_t *ox3)
+{
+ osc_t *osc = create_osc(st, otyp_Multiplex);
+ if (!osc)
+ return NULL;
+
+ osc->u.omultiplex.sel = sel;
+ osc->u.omultiplex.val[0] = ox0;
+ osc->u.omultiplex.val[1] = ox1;
+ osc->u.omultiplex.val[2] = ox2;
+ osc->u.omultiplex.val[3] = ox3;
+
+ return osc;
+}
+
+osc_t *new_osc_phaser(stonerview_state *st, int phaselen)
+{
+ osc_t *osc = create_osc(st, otyp_Phaser);
+ if (!osc)
+ return NULL;
+
+ osc->u.ophaser.phaselen = phaselen;
+
+ osc->u.ophaser.count = 0;
+ /* Pick a random phase to start in. */
+ osc->u.ophaser.curphase = rand_range(0, NUM_PHASES-1);
+
+ return osc;
+}
+
+osc_t *new_osc_randphaser(stonerview_state *st,
+ int minphaselen, int maxphaselen)
+{
+ osc_t *osc = create_osc(st, otyp_RandPhaser);
+ if (!osc)
+ return NULL;
+
+ osc->u.orandphaser.minphaselen = minphaselen;
+ osc->u.orandphaser.maxphaselen = maxphaselen;
+
+ osc->u.orandphaser.count = 0;
+ /* Pick a random phaselen to start with. */
+ osc->u.orandphaser.curphaselen = rand_range(minphaselen, maxphaselen);
+ /* Pick a random phase to start in. */
+ osc->u.orandphaser.curphase = rand_range(0, NUM_PHASES-1);
+
+ return osc;
+}
+
+osc_t *new_osc_linear(stonerview_state *st, osc_t *base, osc_t *diff)
+{
+ osc_t *osc = create_osc(st, otyp_Linear);
+ if (!osc)
+ return NULL;
+
+ osc->u.olinear.base = base;
+ osc->u.olinear.diff = diff;
+
+ return osc;
+}
+
+osc_t *new_osc_buffer(stonerview_state *st, osc_t *val)
+{
+ int ix;
+ osc_t *osc = create_osc(st, otyp_Buffer);
+ if (!osc)
+ return NULL;
+
+ osc->u.obuffer.val = val;
+ osc->u.obuffer.firstel = st->num_els-1;
+
+ /* The last N values are stored in a ring buffer, which we must initialize
+ here. */
+ for (ix=0; ix<st->num_els; ix++) {
+ osc->u.obuffer.el[ix] = osc_get(st, val, 0);
+ }
+
+ return osc;
+}
+
+/* Compute f(i,el) for the current i. */
+int osc_get(stonerview_state *st, osc_t *osc, int el)
+{
+ if (!osc)
+ return 0;
+
+ switch (osc->type) {
+
+ case otyp_Constant:
+ return osc->u.oconstant.val;
+
+ case otyp_Bounce:
+ return osc->u.obounce.val;
+
+ case otyp_Wrap:
+ return osc->u.owrap.val;
+
+ case otyp_VeloWrap:
+ return osc->u.ovelowrap.val;
+
+ case otyp_Linear:
+ return osc_get(st, osc->u.olinear.base, el)
+ + el * osc_get(st, osc->u.olinear.diff, el);
+
+ case otyp_Multiplex: {
+ struct omultiplex_struct *ox = &(osc->u.omultiplex);
+ int sel = osc_get(st, ox->sel, el);
+ return osc_get(st, ox->val[sel % NUM_PHASES], el);
+ }
+
+ case otyp_Phaser: {
+ struct ophaser_struct *ox = &(osc->u.ophaser);
+ return ox->curphase;
+ }
+
+ case otyp_RandPhaser: {
+ struct orandphaser_struct *ox = &(osc->u.orandphaser);
+ return ox->curphase;
+ }
+
+ case otyp_Buffer: {
+ struct obuffer_struct *ox = &(osc->u.obuffer);
+ return ox->el[(ox->firstel + el) % st->num_els];
+ }
+
+ default:
+ return 0;
+ }
+}
+
+/* Increment i. This affects all osc_t objects; we go down the linked list to
+ get them all. */
+void osc_increment(stonerview_state *st)
+{
+ osc_t *osc;
+
+ for (osc = st->oscroot; osc; osc = osc->next) {
+ switch (osc->type) {
+
+ case otyp_Bounce: {
+ struct obounce_struct *ox = &(osc->u.obounce);
+ ox->val += ox->step;
+ if (ox->val < ox->min && ox->step < 0) {
+ ox->step = -(ox->step);
+ ox->val = ox->min + (ox->min - ox->val);
+ }
+ if (ox->val > ox->max && ox->step > 0) {
+ ox->step = -(ox->step);
+ ox->val = ox->max + (ox->max - ox->val);
+ }
+ break;
+ }
+
+ case otyp_Wrap: {
+ struct owrap_struct *ox = &(osc->u.owrap);
+ ox->val += ox->step;
+ if (ox->val < ox->min && ox->step < 0) {
+ ox->val += (ox->max - ox->min);
+ }
+ if (ox->val > ox->max && ox->step > 0) {
+ ox->val -= (ox->max - ox->min);
+ }
+ break;
+ }
+
+ case otyp_VeloWrap: {
+ struct ovelowrap_struct *ox = &(osc->u.ovelowrap);
+ int diff = (ox->max - ox->min);
+ ox->val += osc_get(st, ox->step, 0);
+ while (ox->val < ox->min)
+ ox->val += diff;
+ while (ox->val > ox->max)
+ ox->val -= diff;
+ break;
+ }
+
+ case otyp_Phaser: {
+ struct ophaser_struct *ox = &(osc->u.ophaser);
+ ox->count++;
+ if (ox->count >= ox->phaselen) {
+ ox->count = 0;
+ ox->curphase++;
+ if (ox->curphase >= NUM_PHASES)
+ ox->curphase = 0;
+ }
+ break;
+ }
+
+ case otyp_RandPhaser: {
+ struct orandphaser_struct *ox = &(osc->u.orandphaser);
+ ox->count++;
+ if (ox->count >= ox->curphaselen) {
+ ox->count = 0;
+ ox->curphaselen = rand_range(ox->minphaselen, ox->maxphaselen);
+ ox->curphase++;
+ if (ox->curphase >= NUM_PHASES)
+ ox->curphase = 0;
+ }
+ break;
+ }
+
+ case otyp_Buffer: {
+ struct obuffer_struct *ox = &(osc->u.obuffer);
+ ox->firstel--;
+ if (ox->firstel < 0)
+ ox->firstel += st->num_els;
+ ox->el[ox->firstel] = osc_get(st, ox->val, 0);
+ /* We can assume that ox->val has already been incremented, since it
+ was created first. This is why new objects are put on the end
+ of the linked list... yeah, it's gross. */
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+}
diff --git a/hacks/glx/stonerview-osc.h b/hacks/glx/stonerview-osc.h
new file mode 100644
index 0000000..b8c0778
--- /dev/null
+++ b/hacks/glx/stonerview-osc.h
@@ -0,0 +1,175 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+#ifndef __STONERVIEW_OSC_H__
+#define __STONERVIEW_OSC_H__
+
+/* This defines the osc_t object, which generates a stream of
+ numbers. It is the heart of the StonerSound/StonerView engine.
+
+ The idea is simple; an osc_t represents some function f(), which
+ can be evaluated to generate an infinite stream of integers (f(0),
+ f(1), f(2), f(3)...). Some of these functions are defined in
+ terms of other osc_t functions: f(i) = g(h(i)) or some such thing.
+
+ To simplify the code, we don't try to calculate f(i) for any
+ arbitrary i. Instead, we start with i=0. Calling osc_get(f)
+ returns f(0) for all osc_t's in the system. When we're ready, we
+ call osc_increment(), which advances every osc_t to i=1;
+ thereafter, calling osc_get(f) returns f(1). When you call
+ osc_increment() again, you get f(2). And so on. You can't go
+ backwards, or move forwards more than 1 at a time, or move some
+ osc_t's without moving others. This is a very restricted model, but
+ it's exactly what's needed for this system.
+
+ Now, there's an additional complication. To get the rippling
+ effect, we don't pull out single values, but *sets* of N elements
+ at a time. (N is defined by NUM_ELS below.) So f(i) is really an
+ ordered N-tuple (f(i,0), f(i,1), f(i,2), f(i,3), f(i,4)). And f()
+ generates an infinite stream of these N-tuples. The osc_get() call
+ really has two parameters; you call osc_get(f, n) to find the n'th
+ element of the current N-tuple. Remember, n must be between 0 and
+ n-1.
+
+ (Do *not* try to get an infinite stream f(i) by calling
+ osc_get(f, i) for i ranging to infinity! Use osc_increment() to
+ advance to the next N-tuple in the stream.)
+*/
+
+#define NUM_ELS (40) /* Forty polygons at a time. */
+
+#define NUM_PHASES (4) /* Some of the osc functions switch between P
+ alternatives. We arbitrarily choose P=4. */
+
+/* Here are the functions which are available.
+ Constant: f(i,n) = k. Always the same value. Very simple.
+ Wrap: f(i,n) slides up or down as i increases. There's a minimum and maximum
+ value, and a step. When the current value reaches the min or max, it jumps
+ to the other end and keeps moving the same direction.
+ Bounce: f(i,n) slides up and down as i increases. There's a minimum and
+ maximum value, and a step. When the current value reaches the min or max,
+ the step is flipped to move the other way.
+ Phaser: f(i,n) = floor(i / phaselen) modulo 4. That is, it generates
+ phaselen 0 values, and then phaselen 1 values, then phaselen 2 values,
+ then phaselen 3 values, then back to 0. (Phaselen is a parameter you
+ supply when you create the phaser.) As you see, this is much the same as
+ the Wrap function, with a minimum of 0, a maximum of 3, and a step of
+ 1/phaselen. But since this code uses integer math, fractional steps
+ aren't possible; it's easier to write a separate function.
+ RandPhaser: The same as Phaser, but the phaselen isn't fixed. It varies
+ randomly between a minimum and maximum value you supply.
+ Multiplex: There are five subsidiary functions within a multiplex function:
+ g0, g1, g2, g3, and a selector function s. Then:
+ f(i,n) = gX(i,n), where X = s(i,n). (Obviously s must generate only values
+ in the range 0 to 3. This is what the phaser functions are designed for,
+ but you can use anything.)
+ Linear: There are two subsidiary functions within this, a and b. Then:
+ f(i,n) = a(i,n) + n*b(i,n). This is an easy way to make an N-tuple that
+ forms a linear sequence, such as (41, 43, 45, 47, 49).
+ Buffer: This takes a subsidiary function g, and computes:
+ f(i,n) = g(i-n,0). That is, the 0th element of the N-tuple is the
+ *current* value of g; the 1st element is the *previous* value of g; the
+ 2nd element is the second-to-last value, and so on back in time. This
+ is a weird idea, but it causes exactly the rippling-change effect that
+ we want.
+
+ Note that Buffer only looks up g(i,0) -- it only uses the 0th elements of
+ the N-tuples that g generates. This saves time and memory, but it means
+ that certain things don't work. For example, if you try to build
+ Buffer(Linear(A,B)), B will have no effect, because Linear computes
+ a(i,n) + n*b(i,n), and inside the Buffer, n is always zero. On the other
+ hand, Linear(Buffer(A),Buffer(B)) works fine, and is probably what you
+ wanted anyway.
+ Similarly, Buffer(Buffer(A)) is the same as Buffer(A). Proof left as an
+ exercise.
+*/
+
+#define otyp_Constant (1)
+#define otyp_Bounce (2)
+#define otyp_Wrap (3)
+#define otyp_Phaser (4)
+#define otyp_RandPhaser (5)
+#define otyp_VeloWrap (7)
+#define otyp_Linear (6)
+#define otyp_Buffer (8)
+#define otyp_Multiplex (9)
+
+/* The osc_t structure itself. */
+typedef struct osc_struct {
+ int type; /* An otyp_* constant. */
+
+ struct osc_struct *next; /* osc.c uses this to maintain a private linked list
+ of all osc_t objects created. */
+
+ /* Union of the data used by all the possible osc_t functions. */
+ union {
+ struct {
+ int val;
+ } oconstant;
+ struct owrap_struct {
+ int min, max, step;
+ int val;
+ } owrap;
+ struct obounce_struct {
+ int min, max, step;
+ int val;
+ } obounce;
+ struct omultiplex_struct {
+ struct osc_struct *sel;
+ struct osc_struct *val[NUM_PHASES];
+ } omultiplex;
+ struct ophaser_struct {
+ int phaselen;
+ int count;
+ int curphase;
+ } ophaser;
+ struct orandphaser_struct {
+ int minphaselen, maxphaselen;
+ int count;
+ int curphaselen;
+ int curphase;
+ } orandphaser;
+ struct ovelowrap_struct {
+ int min, max;
+ struct osc_struct *step;
+ int val;
+ } ovelowrap;
+ struct olinear_struct {
+ struct osc_struct *base;
+ struct osc_struct *diff;
+ } olinear;
+ struct obuffer_struct {
+ struct osc_struct *val;
+ int firstel;
+ int el[NUM_ELS];
+ } obuffer;
+ } u;
+} osc_t;
+
+extern osc_t *new_osc_constant(stonerview_state *, int val);
+extern osc_t *new_osc_bounce(stonerview_state *, int min, int max, int step);
+extern osc_t *new_osc_wrap(stonerview_state *, int min, int max, int step);
+extern osc_t *new_osc_phaser(stonerview_state *, int phaselen);
+extern osc_t *new_osc_randphaser(stonerview_state *,
+ int minphaselen, int maxphaselen);
+extern osc_t *new_osc_velowrap(stonerview_state *,
+ int min, int max, osc_t *step);
+extern osc_t *new_osc_linear(stonerview_state *, osc_t *base, osc_t *diff);
+extern osc_t *new_osc_buffer(stonerview_state *st, osc_t *val);
+extern osc_t *new_osc_multiplex(stonerview_state *,
+ osc_t *sel, osc_t *ox0, osc_t *ox1,
+ osc_t *ox2, osc_t *ox3);
+
+extern int osc_get(stonerview_state *, osc_t *osc, int el);
+extern void osc_increment(stonerview_state *);
+
+#endif /* __STONERVIEW_OSC_H__ */
diff --git a/hacks/glx/stonerview-view.c b/hacks/glx/stonerview-view.c
new file mode 100644
index 0000000..baf40e4
--- /dev/null
+++ b/hacks/glx/stonerview-view.c
@@ -0,0 +1,134 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+ http://www.eblong.com/zarf/stonerview.html
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+/* Ported away from GLUT (so that it can do `-root' and work with xscreensaver)
+ by Jamie Zawinski <jwz@jwz.org>, 22-Jan-2001.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real Xlib */
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include <stdlib.h>
+#include "stonerview.h"
+
+static GLfloat view_rotx = -45.0, view_roty = 0.0, view_rotz = 15.0;
+static GLfloat view_scale = 4.0;
+
+
+stonerview_state *
+stonerview_init_view(int wireframe_p, int transparent_p)
+{
+ stonerview_state *st = (stonerview_state *) calloc (1, sizeof(*st));
+
+ st->wireframe = wireframe_p;
+ st->transparent = transparent_p;
+ st->num_els = NUM_ELS;
+ st->elist = (stonerview_elem_t *) calloc (st->num_els, sizeof(*st->elist));
+
+ st->osctail = &st->oscroot;
+
+ /* for trackball, two-sided lighting and no face culling */
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+
+ glEnable(GL_NORMALIZE);
+
+ glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+
+ if (st->transparent)
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+
+ return st;
+}
+
+/* callback: draw everything */
+void
+stonerview_win_draw(stonerview_state *st)
+{
+ int ix;
+ static const GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat gray[] = { 0.6, 0.6, 0.6, 1.0 };
+
+ glDrawBuffer(GL_BACK);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glScalef(view_scale, view_scale, view_scale);
+ glRotatef(view_rotx, 1.0, 0.0, 0.0);
+ glRotatef(view_roty, 0.0, 1.0, 0.0);
+ glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+ glShadeModel(GL_FLAT);
+
+ for (ix=0; ix < st->num_els; ix++) {
+ stonerview_elem_t *el = &st->elist[ix];
+
+ glNormal3f(0.0, 0.0, 1.0);
+
+ /* outline the square */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (st->wireframe ? white : gray));
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(el->pos[0]-el->vervec[0], el->pos[1]-el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[1], el->pos[1]-el->vervec[0], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[0], el->pos[1]+el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]-el->vervec[1], el->pos[1]+el->vervec[0], el->pos[2]);
+ glEnd();
+
+ if (st->wireframe) continue;
+
+ /* fill the square */
+ {
+ GLfloat col[4];
+ col[0] = el->col[0]; col[1] = el->col[1];
+ col[2] = el->col[2]; col[3] = el->col[3];
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ }
+ glBegin(GL_QUADS);
+ glVertex3f(el->pos[0]-el->vervec[0], el->pos[1]-el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[1], el->pos[1]-el->vervec[0], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[0], el->pos[1]+el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]-el->vervec[1], el->pos[1]+el->vervec[0], el->pos[2]);
+ glEnd();
+ }
+
+ glPopMatrix();
+}
+
+void
+stonerview_win_release(stonerview_state *st)
+{
+ free (st->elist);
+ /*free (st->oscroot); -- #### how do we free this? */
+ free (st);
+}
diff --git a/hacks/glx/stonerview.c b/hacks/glx/stonerview.c
new file mode 100644
index 0000000..880ef01
--- /dev/null
+++ b/hacks/glx/stonerview.c
@@ -0,0 +1,154 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+
+ For the latest version, source code, and links to more of my stuff, see:
+ http://www.eblong.com/zarf/stonerview.html
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+/* Ported away from GLUT (so that it can do `-root' and work with xscreensaver)
+ by Jamie Zawinski <jwz@jwz.org>, 22-Jan-2001.
+
+ Revamped to work in the xlockmore framework so that it will also work
+ with the MacOS X port of xscreensaver by jwz, 21-Feb-2006.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define release_stonerview 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+
+#ifdef USE_GL /* whole file */
+
+#include "stonerview.h"
+#include "gltrackball.h"
+
+#define DEF_TRANSPARENT "True"
+
+typedef struct {
+ GLXContext *glx_context;
+ stonerview_state *st;
+ trackball_state *trackball;
+ Bool button_down_p;
+} stonerview_configuration;
+
+static stonerview_configuration *bps = NULL;
+
+static Bool transparent_p;
+
+
+static XrmOptionDescRec opts[] = {
+ { "-transparent", ".transparent", XrmoptionNoArg, "True" },
+ { "+transparent", ".transparent", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&transparent_p, "transparent", "Transparent", DEF_TRANSPARENT, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt stonerview_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+ENTRYPOINT void
+reshape_stonerview (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+}
+
+
+ENTRYPOINT void
+init_stonerview (ModeInfo *mi)
+{
+ stonerview_configuration *bp;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ bp->trackball = gltrackball_init (False);
+ bp->st = stonerview_init_view(MI_IS_WIREFRAME(mi), transparent_p);
+ stonerview_init_move(bp->st);
+
+ reshape_stonerview (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+}
+
+
+ENTRYPOINT void
+draw_stonerview (ModeInfo *mi)
+{
+ stonerview_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glPushMatrix ();
+ glRotatef( current_device_rotation(), 0, 0, 1);
+ gltrackball_rotate (bp->trackball);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ }
+# endif
+
+ stonerview_win_draw(bp->st);
+ if (! bp->button_down_p)
+ stonerview_move_increment(bp->st);
+ glPopMatrix ();
+
+ mi->polygon_count = NUM_ELS;
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+free_stonerview (ModeInfo *mi)
+{
+ stonerview_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (bp->st)
+ stonerview_win_release (bp->st);
+}
+
+ENTRYPOINT Bool
+stonerview_handle_event (ModeInfo *mi, XEvent *event)
+{
+ stonerview_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+XSCREENSAVER_MODULE ("StonerView", stonerview)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/stonerview.h b/hacks/glx/stonerview.h
new file mode 100644
index 0000000..0afd7a6
--- /dev/null
+++ b/hacks/glx/stonerview.h
@@ -0,0 +1,59 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+#ifndef __STONERVIEW_H__
+# define __STONERVIEW_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+typedef struct stonerview_state stonerview_state;
+
+#include "stonerview-osc.h"
+#include "stonerview-move.h"
+
+struct stonerview_state {
+
+ int wireframe;
+ int transparent;
+
+ /* The list of polygons. This is filled in by move_increment(), and rendered
+ by perform_render(). */
+ int num_els;
+ stonerview_elem_t *elist;
+
+ /* A linked list of all osc_t objects created. New objects are added
+ to the end of the list, not the beginning. */
+ osc_t *oscroot;
+ osc_t **osctail;
+
+ /* The polygons are controlled by four parameters. Each is represented by
+ an osc_t object, which is just something that returns a stream of numbers.
+ (Originally the name stood for "oscillator", but it does ever so much more
+ now... see osc.c.)
+ Imagine a cylinder with a vertical axis (along the Z axis), stretching
+ from Z=1 to Z=-1, and a radius of 1.
+ */
+ osc_t *theta; /* Angle around the axis. This is expressed in
+ hundredths of a degree, so it's actually 0 to 36000. */
+ osc_t *rad; /* Distance from the axis. This goes up to 1000,
+ but we actually allow negative distances -- that just
+ goes to the opposite side of the circle -- so the range
+ is really -1000 to 1000. */
+ osc_t *alti; /* Height (Z position). This goes from -1000 to 1000. */
+ osc_t *color; /* Consider this to be an angle of a circle going
+ around the color wheel. It's in tenths of a degree
+ (consistency is all I ask) so it ranges from 0 to 3600. */
+};
+
+#endif /* __STONERVIEW_H__ */
diff --git a/hacks/glx/stonerview.man b/hacks/glx/stonerview.man
new file mode 100644
index 0000000..820e9af
--- /dev/null
+++ b/hacks/glx/stonerview.man
@@ -0,0 +1,53 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+stonerview - 3D undulating ribbons of squares.
+.SH SYNOPSIS
+.B stonerview
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Chains of colorful squares dance around each other in complex spiral
+patterns. This is a clone of the SGI "electropaint" screen saver.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Andrew Plotkin. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Andrew Plotkin.
diff --git a/hacks/glx/superquadrics.c b/hacks/glx/superquadrics.c
new file mode 100644
index 0000000..3c08335
--- /dev/null
+++ b/hacks/glx/superquadrics.c
@@ -0,0 +1,807 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* superquadrics --- 3D mathematical shapes */
+
+#if 0
+static const char sccsid[] = "@(#)superquadrics.c 4.07 97/11/24 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Superquadrics were invented by Dr. Alan Barr of Caltech University.
+ * They were first published in "Computer Graphics and Applications",
+ * volume 1, number 1, 1981, in the article "Superquadrics and Angle-
+ * Preserving Transformations." Dr. Barr based the Superquadrics on
+ * Piet Hein's "super ellipses." Super ellipses are like 2D ellipses,
+ * except that the formula includes an exponent, raising its X and Y
+ * values to a (fractional) power, and allowing them to gradually
+ * change from round to square edges. Superquadrics extend this
+ * idea into 3 dimensions, using two exponents to modify a
+ * quadric surface in a similar fashion.
+ *
+ * Revision History:
+ * 30-Mar-97: Turned into a module for xlockmore 4.02 alpha. The code
+ * is almost unrecognizable now from the first revision, except for
+ * a few remaining two-letter variable names. I still don't have
+ * the normal vectors working right (I wrote the buggy normal vector
+ * code myself, can you tell?)
+ * 07-Jan-97: A legend reborn; Superquadrics make an appearance as a
+ * real OpenGL program written in C. I can even render them with
+ * proper lighting and specular highlights. Gee, they look almost
+ * as good now as the original color plates of them that my uncle
+ * showed me as a child in 1981. I don't know what computer hardware
+ * he was using at the time, but it's taken a couple decades for the
+ * PC clone hardware to catch up to it.
+ * 05-Jan-97: After almost a decade, Superquadrics had almost faded away
+ * into the myths and folklore of all the things my brother and I played
+ * with on computers when we were kids with too much time on our hands.
+ * I had since gotten involved in Unix, OpenGL, and other things.
+ * A sudden flash of inspiration caused me to dig out the old Pascal
+ * source code, run it through p2c, and start ripping away the old
+ * wireframe rendering code, to be replaced by OpenGL.
+ * Late 1989 or early 1990: Around this time I did the Turbo Pascal
+ * port of the Superquadrics. Unfortunately, many of the original variable
+ * names remained the same from the C= 64 original. This was unfortunate
+ * because BASIC on the c64 only allowed 2-letter, global variable names.
+ * But the speed improvement over BASIC was very impressive at the time.
+ * Thanksgiving, 1987: Written. My uncle Al, who invented Superquadrics some
+ * years earlier, came to visit us. I was a high school kid at the time,
+ * with nothing more than a Commodore 64. Somehow we wrote this program,
+ * (he did the math obviously, I just coded it into BASIC for the c64).
+ * Yeah, 320x200 resolution, colorless white wireframe, and half an hour
+ * rendering time per superquadric. PLOT x,y. THOSE were the days.
+ * In the following years I would port Superquadrics to AppleBASIC,
+ * AmigaBASIC, and then Turbo Pascal for IBM clones. 5 minutes on a 286!
+ * Talk about fast rendering! But these days, when my Pentium 166 runs
+ * the same program, the superquadric will already be waiting on the
+ * screen before my monitor can change frequency from text to graphics
+ * mode. Can't time the number of minutes that way! Darn ;)
+ *
+ * Ed Mackey
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 40000 \n" \
+ "*count: 25 \n" \
+ "*cycles: 40 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_superquadrics 0
+# define release_superquadrics 0
+# define superquadrics_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+/*-
+ * Note for low-CPU-speed machines: If your frame rate is so low that
+ * attempts at animation appear futile, try using "-cycles 1", which puts
+ * Superquadrics into kind of a slide-show mode. It will still use up
+ * all of your CPU power, but it may look nicer.
+ */
+
+#define DEF_SPINSPEED "5.0"
+
+static float spinspeed;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-spinspeed", ".superquadrics.spinspeed", XrmoptionSepArg, 0}
+};
+static argtype vars[] =
+{
+ {&spinspeed, "spinspeed", "Spinspeed", DEF_SPINSPEED, t_Float}
+};
+static OptionStruct desc[] =
+{
+ {"-spinspeed num", "speed of rotation, in degrees per frame"}
+};
+
+ENTRYPOINT ModeSpecOpt superquadrics_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct superquadrics_description =
+{"superquadrics", "init_superquadrics", "draw_superquadrics", NULL,
+ "refresh_superquadrics", "init_superquadrics", NULL, &superquadrics_opts,
+ 1000, 25, 40, 1, 4, 1.0, "",
+ "Shows 3D mathematical shapes", 0, NULL};
+
+#endif
+
+#define MaxRes 50
+#define MinRes 5
+
+typedef double dimi[MaxRes + 1];
+
+typedef struct {
+ double xExponent, yExponent;
+ GLfloat r[4], g[4], b[4];
+ long Mode;
+ int rotx, rotz;
+} state;
+
+typedef struct {
+ GLXContext *glx_context;
+ int dist, wireframe, flatshade, shownorms, maxcount, maxwait;
+ int counter, viewcount, viewwait, mono;
+ GLfloat curmat[4][4], rotx, roty, rotz, spinspeed;
+ /* In dimi: the first letter stands for cosine/sine, the second
+ * stands for North, South, East, or West. I think.
+ */
+ dimi cs, se, sw, sn, ss, ce, cw, cn, Prevxx, Prevyy, Prevzz,
+ Prevxn, Prevyn, Prevzn;
+ double xExponent, yExponent, Mode;
+ int resolution;
+ state now, later;
+
+ int pats[4][4];
+ int cullmode;
+
+} superquadricsstruct;
+
+static superquadricsstruct *superquadrics = NULL;
+
+#define CLIP_NORMALS 10000.0
+
+static void ReshapeSuperquadrics(int w, int h);
+
+static int
+myrand(int range)
+{
+ return ((int) (((float) range) * LRAND() / (MAXRAND)));
+}
+
+static float
+myrandreal(void)
+{
+ return (LRAND() / (MAXRAND));
+}
+
+/* Some old, old, OLD code follows. Ahh this takes me back..... */
+
+/* Output from p2c, the Pascal-to-C translator */
+/* From input file "squad.pas" */
+
+static double
+XtoY(double x, double y)
+{
+ double z, a;
+
+ /* This is NOT your typical raise-X-to-the-Y-power function. Do not attempt
+ * to replace this with a standard exponent function. If you must, just
+ * replace the "a = exp(y * log(z));" line with something faster.
+ */
+
+ z = fabs(x);
+ if (z < 1e-20) {
+ a = 0.0;
+ return a;
+ }
+ a = exp(y * log(z));
+ if (a > CLIP_NORMALS)
+ a = CLIP_NORMALS;
+ if (x < 0)
+ a = -a;
+ return a;
+}
+
+
+static double
+Sine(double x, double e)
+{
+ /* This is just the sine wave raised to the exponent. BUT, you can't
+ * raise negative numbers to fractional exponents. So we have a special
+ * XtoY routune which handles it in a way useful to superquadrics.
+ */
+
+ return (XtoY(sin(x), e));
+}
+
+
+static double
+Cosine(double x, double e)
+{
+ return (XtoY(cos(x), e));
+}
+
+
+static void
+MakeUpStuff(int allstuff, superquadricsstruct * sp)
+{
+ int dostuff;
+ int t, pat;
+ GLfloat r, g, b, r2, g2, b2;
+
+ /* randomize it. */
+
+ if (sp->maxcount < 2)
+ allstuff = 1;
+ dostuff = allstuff * 15;
+ if (!dostuff) {
+ dostuff = myrand(3) + 1;
+ if (myrand(2) || (dostuff & 1))
+ dostuff |= 4;
+ if (myrand(2))
+ dostuff |= 8;
+ }
+ if (dostuff & 1) {
+ sp->later.xExponent = (((long) floor(myrandreal() * 250 + 0.5)) / 100.0) + 0.1;
+ sp->later.yExponent = (((long) floor(myrandreal() * 250 + 0.5)) / 100.0) + 0.1;
+
+ /* Increase the 2.0 .. 2.5 range to 2.0 .. 3.0 */
+ if (sp->later.xExponent > 2.0)
+ sp->later.xExponent = (sp->later.xExponent * 2.0) - 2.0;
+ if (sp->later.yExponent > 2.0)
+ sp->later.yExponent = (sp->later.yExponent * 2.0) - 2.0;
+ }
+ if (dostuff & 2) {
+ do {
+ sp->later.Mode = myrand(3L) + 1;
+ } while (!allstuff && (sp->later.Mode == sp->now.Mode));
+ /* On init: make sure it can stay in mode 1 if it feels like it. */
+ }
+ if (dostuff & 4) {
+ if (sp->mono) {
+ if (sp->wireframe) {
+ b = g = r = 1.0;
+ b2 = g2 = r2 = 1.0;
+ } else {
+ b = g = r = (GLfloat) (140 + myrand(100)) / 255.0;
+ b2 = g2 = r2 = ((r > 0.69) ? (1.0 - r) : r);
+ }
+ } else {
+ r = (GLfloat) (40 + myrand(200)) / 255.0;
+ g = (GLfloat) (40 + myrand(200)) / 255.0;
+ b = (GLfloat) (40 + myrand(200)) / 255.0;
+
+ r2 = ((myrand(4) && ((r < 0.31) || (r > 0.69))) ? (1.0 - r) : r);
+ g2 = ((myrand(4) && ((g < 0.31) || (g > 0.69))) ? (1.0 - g) : g);
+ b2 = ((myrand(4) && ((b < 0.31) || (b > 0.69))) ? (1.0 - b) : b);
+ }
+
+ pat = myrand(4);
+ for (t = 0; t < 4; ++t) {
+ sp->later.r[t] = sp->pats[pat][t] ? r : r2;
+ sp->later.g[t] = sp->pats[pat][t] ? g : g2;
+ sp->later.b[t] = sp->pats[pat][t] ? b : b2;
+ }
+ }
+ if (dostuff & 8) {
+ sp->later.rotx = myrand(360) - 180;
+ sp->later.rotz = myrand(160) - 80;
+ }
+}
+
+static void
+inputs(superquadricsstruct * sp)
+{
+ int iv;
+ double u, v, mode3, cn3, inverter2, flatu, flatv;
+
+ if (sp->Mode < 1.000001) {
+ mode3 = 1.0;
+ cn3 = 0.0;
+ inverter2 = 1.0;
+ } else if (sp->Mode < 2.000001) {
+ mode3 = 1.0;
+ cn3 = (sp->Mode - 1.0) * 1.5;
+ inverter2 = (sp->Mode - 1.0) * -2.0 + 1.0;
+ } else {
+ mode3 = (sp->Mode - 1.0);
+ cn3 = (sp->Mode - 2.0) / 2.0 + 1.5;
+ inverter2 = -1.0;
+ }
+
+ if (sp->flatshade) {
+ flatu = M_PI / (sp->resolution - 1);
+ flatv = mode3 * M_PI / ((sp->resolution - 1) * 2);
+ } else {
+ flatu = flatv = 0.0;
+ }
+
+ /* (void) printf("Calculating....\n"); */
+ for (iv = 1; iv <= sp->resolution; iv++) {
+
+ /* u ranges from PI down to -PI */
+ u = (1 - iv) * 2 * M_PI / (sp->resolution - 1) + M_PI;
+
+ /* v ranges from PI/2 down to -PI/2 */
+ v = (1 - iv) * mode3 * M_PI / (sp->resolution - 1) + M_PI * (mode3 / 2.0);
+
+ /* Use of xExponent */
+ sp->se[iv] = Sine(u, sp->xExponent);
+ sp->ce[iv] = Cosine(u, sp->xExponent);
+ sp->sn[iv] = Sine(v, sp->yExponent);
+ sp->cn[iv] = Cosine(v, sp->yExponent) * inverter2 + cn3;
+
+ /* Normal vector computations only */
+ sp->sw[iv] = Sine(u + flatu, 2 - sp->xExponent);
+ sp->cw[iv] = Cosine(u + flatu, 2 - sp->xExponent);
+ sp->ss[iv] = Sine(v + flatv, 2 - sp->yExponent) * inverter2;
+ sp->cs[iv] = Cosine(v + flatv, 2 - sp->yExponent);
+ } /* next */
+
+ /* Now fix up the endpoints */
+ sp->se[sp->resolution] = sp->se[1];
+ sp->ce[sp->resolution] = sp->ce[1];
+
+ if (sp->Mode > 2.999999) {
+ sp->sn[sp->resolution] = sp->sn[1];
+ sp->cn[sp->resolution] = sp->cn[1];
+ }
+}
+
+
+static int
+DoneScale(superquadricsstruct * sp)
+{
+ double xx, yy, zz, xp = 0, yp = 0, zp = 0, xn, yn, zn, xnp = 0,
+ ynp = 0, znp = 0;
+ int ih, iv;
+ int polys = 0;
+
+ /* Hey don't knock my 2-letter variable names. Simon's BASIC rules, man! ;-> */
+ /* Just kidding..... */
+ int toggle = 0;
+
+ for (ih = 1; ih <= sp->resolution; ih++) {
+ toggle ^= 2;
+ for (iv = 1; iv <= sp->resolution; iv++) {
+ toggle ^= 1;
+ if (sp->wireframe)
+ glColor3f(sp->curmat[toggle][0], sp->curmat[toggle][1], sp->curmat[toggle][2]);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sp->curmat[toggle]);
+
+ xx = sp->cn[iv] * sp->ce[ih];
+ zz = sp->cn[iv] * sp->se[ih];
+ yy = sp->sn[iv];
+
+ if (sp->wireframe) {
+ if ((ih > 1) || (iv > 1)) {
+ glBegin(GL_LINES);
+ if (ih > 1) {
+ glVertex3f(xx, yy, zz);
+ glVertex3f(sp->Prevxx[iv], sp->Prevyy[iv], sp->Prevzz[iv]);
+ polys++;
+ }
+ if (iv > 1) {
+ glVertex3f(xx, yy, zz);
+ glVertex3f(sp->Prevxx[iv - 1], sp->Prevyy[iv - 1], sp->Prevzz[iv - 1]);
+ polys++;
+ }
+/* PURIFY 4.0.1 reports an unitialized memory read on the next line when using
+ * MesaGL 2.2 and -mono. This has been fixed in MesaGL 2.3 and later. */
+ glEnd();
+ }
+ } else {
+ if ((sp->cs[iv] > 1e+10) || (sp->cs[iv] < -1e+10)) {
+ xn = sp->cs[iv];
+ zn = sp->cs[iv];
+ yn = sp->ss[iv];
+ } else {
+ xn = sp->cs[iv] * sp->cw[ih];
+ zn = sp->cs[iv] * sp->sw[ih];
+ yn = sp->ss[iv];
+ }
+ if ((ih > 1) && (iv > 1)) {
+ glNormal3f(xn, yn, zn);
+ glBegin(GL_POLYGON);
+ glVertex3f(xx, yy, zz);
+ if (!sp->flatshade)
+ glNormal3f(sp->Prevxn[iv], sp->Prevyn[iv], sp->Prevzn[iv]);
+ glVertex3f(sp->Prevxx[iv], sp->Prevyy[iv], sp->Prevzz[iv]);
+ if (!sp->flatshade)
+ glNormal3f(xnp, ynp, znp);
+ glVertex3f(xp, yp, zp);
+ if (!sp->flatshade)
+ glNormal3f(sp->Prevxn[iv - 1], sp->Prevyn[iv - 1], sp->Prevzn[iv - 1]);
+ glVertex3f(sp->Prevxx[iv - 1], sp->Prevyy[iv - 1], sp->Prevzz[iv - 1]);
+ polys++;
+ glEnd();
+ }
+ if (sp->shownorms) {
+ if (!sp->flatshade)
+ glShadeModel(GL_FLAT);
+ glDisable(GL_LIGHTING);
+ glBegin(GL_LINES);
+ glVertex3f(xx, yy, zz);
+ glVertex3f(xx + xn, yy + yn, zz + zn);
+ polys++;
+ glEnd();
+ if (!sp->flatshade)
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_LIGHTING);
+ }
+ xnp = sp->Prevxn[iv];
+ ynp = sp->Prevyn[iv];
+ znp = sp->Prevzn[iv];
+ sp->Prevxn[iv] = xn;
+ sp->Prevyn[iv] = yn;
+ sp->Prevzn[iv] = zn;
+ }
+
+ xp = sp->Prevxx[iv];
+ yp = sp->Prevyy[iv];
+ zp = sp->Prevzz[iv];
+ sp->Prevxx[iv] = xx;
+ sp->Prevyy[iv] = yy;
+ sp->Prevzz[iv] = zz;
+
+ } /* next */
+ } /* next */
+ return polys;
+}
+
+/**** End of really old code ****/
+
+static void
+SetCull(int init, superquadricsstruct * sp)
+{
+ if (init) {
+ glDisable(GL_CULL_FACE);
+ sp->cullmode = 0;
+ return;
+ }
+ if (sp->Mode < 1.0001) {
+ if (sp->cullmode != 1) {
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ sp->cullmode = 1;
+ }
+ } else if (sp->Mode > 2.9999) {
+ if (sp->cullmode != 2) {
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ sp->cullmode = 2;
+ }
+ } else {
+ if (sp->cullmode) {
+ glDisable(GL_CULL_FACE);
+ sp->cullmode = 0;
+ }
+ }
+}
+
+static void
+SetCurrentShape(superquadricsstruct * sp)
+{
+ int t;
+
+ sp->xExponent = sp->now.xExponent = sp->later.xExponent;
+ sp->yExponent = sp->now.yExponent = sp->later.yExponent;
+
+ for (t = 0; t < 4; ++t) {
+ sp->curmat[t][0] = sp->now.r[t] = sp->later.r[t];
+ sp->curmat[t][1] = sp->now.g[t] = sp->later.g[t];
+ sp->curmat[t][2] = sp->now.b[t] = sp->later.b[t];
+ }
+
+ sp->Mode = (double) (sp->now.Mode = sp->later.Mode);
+ sp->rotx = sp->now.rotx = sp->later.rotx;
+ sp->rotz = sp->now.rotz = sp->later.rotz;
+
+ sp->counter = -sp->maxwait;
+
+ inputs(sp);
+}
+
+static void
+NextSuperquadric(superquadricsstruct * sp)
+{
+ double fnow, flater;
+ int t;
+
+ sp->roty -= sp->spinspeed;
+ while (sp->roty >= 360.0)
+ sp->roty -= 360.0;
+ while (sp->roty < 0.0)
+ sp->roty += 360.0;
+
+ --sp->viewcount;
+
+ if (sp->counter > 0) {
+ if (--sp->counter == 0) {
+ SetCurrentShape(sp);
+ if (sp->counter == 0) { /* Happens if sp->maxwait == 0 */
+ MakeUpStuff(0, sp);
+ sp->counter = sp->maxcount;
+ }
+ } else {
+ fnow = (double) sp->counter / (double) sp->maxcount;
+ flater = (double) (sp->maxcount - sp->counter) / (double) sp->maxcount;
+ sp->xExponent = sp->now.xExponent * fnow + sp->later.xExponent * flater;
+ sp->yExponent = sp->now.yExponent * fnow + sp->later.yExponent * flater;
+
+ for (t = 0; t < 4; ++t) {
+ sp->curmat[t][0] = sp->now.r[t] * fnow + sp->later.r[t] * flater;
+ sp->curmat[t][1] = sp->now.g[t] * fnow + sp->later.g[t] * flater;
+ sp->curmat[t][2] = sp->now.b[t] * fnow + sp->later.b[t] * flater;
+ }
+
+ sp->Mode = (double) sp->now.Mode * fnow + (double) sp->later.Mode * flater;
+ sp->rotx = (double) sp->now.rotx * fnow + (double) sp->later.rotx * flater;
+ sp->rotz = (double) sp->now.rotz * fnow + (double) sp->later.rotz * flater;
+
+ inputs(sp);
+ }
+ } else {
+ if (++sp->counter >= 0) {
+ MakeUpStuff(0, sp);
+ sp->counter = sp->maxcount;
+ }
+ }
+}
+
+static int
+DisplaySuperquadrics(ModeInfo *mi)
+{
+ superquadricsstruct *sp = &superquadrics[MI_SCREEN(mi)];
+ int polys = 0;
+ glDrawBuffer(GL_BACK);
+ if (sp->wireframe)
+ glClear(GL_COLOR_BUFFER_BIT);
+ else
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (sp->viewcount < 1) {
+ sp->viewcount = sp->viewwait;
+/* ReshapeSuperquadrics(-1, -1);*/
+ }
+ glPushMatrix();
+ glTranslatef(0.0, 0.0, -((GLfloat) (sp->dist) / 16.0) - (sp->Mode * 3.0 - 1.0)); /* viewing transform */
+ glRotatef(sp->rotx, 1.0, 0.0, 0.0); /* pitch */
+ glRotatef(sp->rotz, 0.0, 0.0, 1.0); /* bank */
+ glRotatef(sp->roty, 0.0, 1.0, 0.0); /* "spin", like heading but comes after P & B */
+
+ SetCull(0, sp);
+
+ glScalef(0.7, 0.7, 0.7); /* jwz: scale it down a bit */
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ polys = DoneScale(sp);
+
+ glPopMatrix();
+
+ /* Remember to flush & swap the buffers after calling this function! */
+ return polys;
+}
+
+static int
+NextSuperquadricDisplay(ModeInfo *mi)
+{
+ superquadricsstruct *sp = &superquadrics[MI_SCREEN(mi)];
+ NextSuperquadric(sp);
+ return DisplaySuperquadrics(mi);
+}
+
+#define MINSIZE 200
+static void
+ReshapeSuperquadrics(int w, int h)
+{
+#if 0
+ int maxsize, cursize;
+
+ maxsize = (w < h) ? w : h;
+ if (maxsize <= MINSIZE) {
+ cursize = maxsize;
+ } else {
+ cursize = myrand(maxsize - MINSIZE) + MINSIZE;
+ }
+ if ((w > cursize) && (h > cursize)) {
+ glViewport(myrand(w - cursize), myrand(h - cursize), cursize, cursize);
+ w = h = cursize;
+ } else {
+ glViewport(0, 0, w, h);
+ }
+#else
+ int y = 0;
+
+ if (w > h * 5) { /* tiny window: show middle */
+ h = w;
+ y = -h/2;
+ }
+
+ glViewport(0, y, w, h);
+#endif
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(15.0, (GLfloat) w / (GLfloat) h, 0.1, 200.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+static void
+InitSuperquadrics(int wfmode, int snorm, int res, int count, float speed, superquadricsstruct * sp)
+{
+ GLfloat ambient[] =
+ {0.4, 0.4, 0.4, 1.0};
+ GLfloat position[] =
+ {10.0, 1.0, 1.0, 10.0};
+ GLfloat mat_diffuse[] =
+ {1.0, 0.5, 0.5, 1.0};
+ GLfloat mat_specular[] =
+ {0.8, 0.8, 0.8, 1.0};
+ GLfloat mat_shininess[] =
+ {50.0};
+
+ int t;
+
+ for (t = 0; t < 4; ++t) {
+ sp->curmat[t][0] = 0.0;
+ sp->curmat[t][1] = 0.0;
+ sp->curmat[t][2] = 0.0;
+ sp->curmat[t][3] = 1.0;
+ }
+
+ sp->rotx = 35.0;
+ sp->roty = 0.0;
+ sp->rotz = 0.0;
+ sp->dist = (16 << 3);
+ sp->wireframe = sp->flatshade = sp->shownorms = 0;
+ sp->maxcount = count;
+ if (sp->maxcount < 1)
+ sp->maxcount = 1;
+ sp->maxwait = sp->maxcount >> 1;
+ SetCull(1, sp);
+
+ sp->mono = 0;
+ sp->spinspeed = speed;
+ sp->viewcount = sp->viewwait = (sp->maxcount < 2) ? 1 : (sp->maxcount << 3);
+
+ if (res < MinRes)
+ res = MinRes;
+ if (res > MaxRes)
+ res = MaxRes;
+ sp->resolution = res;
+
+ if (wfmode == 2)
+ sp->flatshade = 1;
+ else if (wfmode)
+ sp->wireframe = 1;
+
+ if (snorm)
+ sp->shownorms = 1;
+
+ glClearDepth(1.0);
+
+ if (sp->wireframe) {
+ glShadeModel(GL_FLAT);
+ glDisable(GL_LIGHTING);
+ glColor3f(mat_diffuse[0], mat_diffuse[1], mat_diffuse[2]);
+ } else {
+ if (sp->flatshade) {
+ glShadeModel(GL_FLAT);
+ position[0] = 1.0;
+ position[3] = 0.0;
+ }
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+ /*glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse); */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+
+ glFrontFace(GL_CW);
+ glEnable(GL_NORMALIZE);
+ }
+
+ MakeUpStuff(1, sp);
+ SetCurrentShape(sp);
+ MakeUpStuff(1, sp); /* Initialize it */
+ sp->counter = sp->maxcount;
+}
+
+/* End of superquadrics main functions */
+
+ENTRYPOINT void
+init_superquadrics(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int screen = MI_SCREEN(mi);
+
+ superquadricsstruct *sp;
+
+ MI_INIT (mi, superquadrics);
+ sp = &superquadrics[screen];
+ sp->mono = (MI_IS_MONO(mi) ? 1 : 0);
+
+ sp->pats[1][1] = 1;
+ sp->pats[1][3] = 1;
+ sp->pats[2][2] = 1;
+ sp->pats[2][3] = 1;
+ sp->pats[3][1] = 1;
+ sp->pats[3][2] = 1;
+
+/* {0, 0, 0, 0},
+ {0, 1, 0, 1},
+ {0, 0, 1, 1},
+ {0, 1, 1, 0}
+ */
+
+ if ((sp->glx_context = init_GL(mi)) != NULL) {
+
+ InitSuperquadrics(MI_IS_WIREFRAME(mi), 0,
+ MI_COUNT(mi), MI_CYCLES(mi), spinspeed, sp);
+ ReshapeSuperquadrics(MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ DisplaySuperquadrics(mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_superquadrics(ModeInfo * mi)
+{
+ superquadricsstruct *sp = &superquadrics[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!sp->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(sp->glx_context));
+
+ mi->polygon_count = NextSuperquadricDisplay(mi);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_superquadrics(ModeInfo * mi)
+{
+ /* Nothing happens here */
+}
+#endif
+
+ENTRYPOINT void
+reshape_superquadrics(ModeInfo * mi, int width, int height)
+{
+ ReshapeSuperquadrics(MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+#endif
+
+/* End of superquadrics.c */
+
+XSCREENSAVER_MODULE ("Superquadrics", superquadrics)
diff --git a/hacks/glx/superquadrics.man b/hacks/glx/superquadrics.man
new file mode 100644
index 0000000..8a127f0
--- /dev/null
+++ b/hacks/glx/superquadrics.man
@@ -0,0 +1,70 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+superquadrics - morphing 3d shapes.
+.SH SYNOPSIS
+.B superquadrics
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-spinspeed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Ed Mackey reports that he wrote the first version of this program in BASIC
+on a Commodore 64 in 1987, as a 320x200 black and white wireframe. Now it
+is GL and has specular reflections.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-spinspeed \fInumber\fP
+0.1 - 15.0. Default: 5.0.
+.TP 8
+.B \-count \fInumber\fP
+0 - 100. Default: 25.
+.TP 8
+.B \-cycles \fInumber\fP
+0 - 100. Default: 40.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ed Mackey. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ed Mackey.
diff --git a/hacks/glx/surfaces.c b/hacks/glx/surfaces.c
new file mode 100644
index 0000000..4c79740
--- /dev/null
+++ b/hacks/glx/surfaces.c
@@ -0,0 +1,648 @@
+/* Surface --- Parametric 3d surfaces visualization */
+
+/*
+ * Revision History:
+ * 2000: written by Andrey Mirtchovski <mirtchov@cpsc.ucalgary.ca>
+ *
+ * 01-Mar-2003 mirtchov Modified as a xscreensaver hack.
+ * 01-jan-2009 steger Renamed from klein.c to surfaces.c.
+ * Removed the Klein bottle.
+ * Added many new surfaces.
+ * Added many command line options.
+ *
+ */
+
+/* surfaces to draw */
+#define SURFACE_RANDOM -1
+#define SURFACE_DINI 0
+#define SURFACE_ENNEPER 1
+#define SURFACE_KUEN 2
+#define SURFACE_MOEBIUS 3
+#define SURFACE_SEASHELL 4
+#define SURFACE_SWALLOWTAIL 5
+#define SURFACE_BOHEMIAN 6
+#define SURFACE_WHITNEY 7
+#define SURFACE_PLUECKER 8
+#define SURFACE_HENNEBERG 9
+#define SURFACE_CATALAN 10
+#define SURFACE_CORKSCREW 11
+#define NUM_SURFACES 12
+
+/* primitives to draw with
+ * note that we skip the polygons and
+ * triangle fans -- too slow
+ *
+ * also removed triangle_strip and quads --
+ * just doesn't look good enough
+ */
+#define RENDER_RANDOM -1
+#define RENDER_POINTS 0
+#define RENDER_LINES 1
+#define RENDER_LINE_LOOP 2
+#define NUM_RENDER 3
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_surface 0
+# define release_surface 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#define DEF_SURFACE "random"
+#define DEF_MODE "random"
+#define DEF_SPIN "True"
+#define DEF_WANDER "False"
+#define DEF_SPEED "300"
+
+#include "rotator.h"
+#include "gltrackball.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+static char *surface_type;
+static char *render_mode;
+static int render;
+static int speed;
+static Bool do_spin;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-surface", ".surface", XrmoptionSepArg, 0 },
+ { "-random-surface", ".surface", XrmoptionNoArg, "random" },
+ { "-dini", ".surface", XrmoptionNoArg, "dini" },
+ { "-enneper", ".surface", XrmoptionNoArg, "enneper" },
+ { "-kuen", ".surface", XrmoptionNoArg, "kuen" },
+ { "-moebius", ".surface", XrmoptionNoArg, "moebius" },
+ { "-seashell", ".surface", XrmoptionNoArg, "seashell" },
+ { "-swallowtail", ".surface", XrmoptionNoArg, "swallowtail" },
+ { "-bohemian", ".surface", XrmoptionNoArg, "bohemian" },
+ { "-whitney", ".surface", XrmoptionNoArg, "whitney" },
+ { "-pluecker", ".surface", XrmoptionNoArg, "pluecker" },
+ { "-henneberg", ".surface", XrmoptionNoArg, "henneberg" },
+ { "-catalan", ".surface", XrmoptionNoArg, "catalan" },
+ { "-corkscrew", ".surface", XrmoptionNoArg, "corkscrew" },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-random-mode", ".mode", XrmoptionNoArg, "random" },
+ { "-points", ".mode", XrmoptionNoArg, "points" },
+ { "-lines", ".mode", XrmoptionNoArg, "lines" },
+ { "-line-loops", ".mode", XrmoptionNoArg, "line-loops" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&surface_type, "surface", "Surface", DEF_SURFACE, t_String },
+ {&render_mode, "mode", "Mode", DEF_MODE, t_String },
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool },
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool },
+ {&speed, "speed", "Speed", DEF_SPEED, t_Int },
+};
+
+
+ENTRYPOINT ModeSpecOpt surface_opts =
+{countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+} GL_VECTOR;
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int render;
+ Bool random_render;
+ int surface;
+ Bool random_surface;
+ int frame;
+
+ float du, dv;
+ float a, b, c;
+
+ float draw_step;
+} surfacestruct;
+
+static surfacestruct *surface = NULL;
+
+
+static void draw(ModeInfo *mi)
+{
+ surfacestruct *sp = &surface[MI_SCREEN(mi)];
+ double u, v;
+ float coord[3];
+ int render;
+
+ mi->polygon_count = 0;
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glPushMatrix();
+
+ {
+ double x, y, z;
+ get_position(sp->rot, &x, &y, &z, !sp->button_down_p);
+ glTranslatef((x-0.5)*10, (y-0.5)*10, (z-0.5)*20);
+
+ gltrackball_rotate(sp->trackball);
+
+ get_rotation(sp->rot, &x, &y, &z, !sp->button_down_p);
+ glRotatef(x*360, 1.0, 0.0, 0.0);
+ glRotatef(y*360, 0.0, 1.0, 0.0);
+ glRotatef(z*360, 0.0, 0.0, 1.0);
+ }
+
+ glScalef(4.0, 4.0, 4.0);
+
+ switch(sp->surface)
+ {
+ case SURFACE_DINI:
+ for (v=0.11; v<=2.0; v+=sp->dv)
+ {
+ glBegin(sp->render);
+ for (u=0; u<=6.0*M_PI; u+=sp->du)
+ {
+ coord[0] = sp->a*cos(u)*sin(v);
+ coord[1] = sp->a*sin(u)*sin(v);
+ coord[2] = sp->a*(cos(v)+log(tan(0.5*v)))+0.2*sp->b*u;
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_ENNEPER:
+ for (u=-M_PI; u<=M_PI; u+=sp->du)
+ {
+ glBegin(sp->render);
+ for (v=-M_PI; v<M_PI; v+=sp->dv)
+ {
+ coord[0] = sp->a*(u-(1.0/3.0*u*u*u)+u*v*v);
+ coord[1] = sp->b*(v-(1.0/3.0*v*v*v)+u*u*v);
+ coord[2] = u*u-v*v;
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_KUEN:
+ for (u=-4.48; u<=4.48; u+=sp->du)
+ {
+ glBegin(sp->render);
+ for (v=M_PI/51; v<M_PI; v+=sp->dv)
+ {
+ coord[0] = 2*(cos(u)+u*sin(u))*sin(v)/(1+u*u*sin(v)*sin(v));
+ coord[1] = 2*(sin(u)-u*cos(u))*sin(v)/(1+u*u*sin(v)*sin(v));
+ coord[2] = log(tan(0.5*v))+2*cos(v)/(1+u*u*sin(v)*sin(v));
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_MOEBIUS:
+ for (u=-M_PI; u<M_PI; u+=sp->du)
+ {
+ glBegin(sp->render);
+ for (v=-0.735; v<0.74; v+=sp->dv)
+ {
+ coord[0] = cos(u)+v*cos(u/2)*cos(u);
+ coord[1] = sin(u)+v*cos(u/2)*sin(u);
+ coord[2] = v*sin(u/2);
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_SEASHELL:
+ for (u=0; u<2*M_PI; u+=sp->du)
+ {
+ glBegin(sp->render);
+ for (v=0; v<2*M_PI; v+=sp->dv)
+ {
+ coord[0] = sp->a*(1-v/(2*M_PI))*cos(2*v)*(1+cos(u))+sp->c*cos(2*v);
+ coord[1] = sp->a*(1-v/(2*M_PI))*sin(2*v)*(1+cos(u))+sp->c*sin(2*v);
+ coord[2] = 2*sp->b*v/(2*M_PI)+sp->a*(1-v/(2*M_PI))*sin(u);
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_SWALLOWTAIL:
+ for (u=-2.5; u<2.0; u+=sp->du)
+ {
+ glBegin(sp->render);
+ for (v=-1.085; v<1.09; v+=sp->dv)
+ {
+ coord[0] = u*v*v+3*v*v*v*v;
+ coord[1] = -2*u*v-4*v*v*v;
+ coord[2] = u;
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_BOHEMIAN:
+ for (u=-M_PI; u<M_PI; u+=sp->du)
+ {
+ glBegin(sp->render);
+ for (v=-M_PI; v<M_PI; v+=sp->dv)
+ {
+ coord[0] = sp->a*cos(u);
+ coord[1] = sp->b*cos(v)+sp->a*sin(u);
+ coord[2] = sin(v);
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_WHITNEY:
+ for (v=-1.995; v<2.0; v+=sp->dv)
+ {
+ glBegin(sp->render);
+ for (u=-1.995; u<2.0; u+=sp->du)
+ {
+ coord[0] = u*v;
+ coord[1] = u;
+ coord[2] = v*v-2;
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_PLUECKER:
+ for (u=0; u<2.5; u+=sp->dv)
+ {
+ glBegin(sp->render);
+ for (v=-M_PI; v<M_PI; v+=sp->du)
+ {
+ coord[0] = u*cos(v);
+ coord[1] = u*sin(v);
+ coord[2] = 2*cos(v)*sin(v);
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_HENNEBERG:
+ for (u=0.9; u<2.55; u+=sp->dv)
+ {
+ glBegin(sp->render);
+ for (v=-M_PI; v<M_PI; v+=sp->du)
+ {
+ coord[0] = sinh(1.0/3.0*u)*cos(v)-1.0/3.0*sinh(u)*cos(3.0*v);
+ coord[1] = sinh(1.0/3.0*u)*sin(v)+1.0/3.0*sinh(u)*sin(3.0*v);
+ coord[2] = cosh(2.0/3.0*u)*cos(2.0*v);
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_CATALAN:
+ for (v=-2; v<2; v+=sp->du)
+ {
+ glBegin(sp->render);
+ for (u=-2*M_PI; u<2*M_PI+0.05; u+=sp->dv)
+ {
+ coord[0] = 0.33*(u-sin(u)*cosh(v));
+ coord[1] = 0.33*(1.0-cos(u)*cosh(v));
+ coord[2] = 0.33*4.0*sin(0.5*u)*sinh(0.5*v);
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ case SURFACE_CORKSCREW:
+ for (v=-M_PI; v<M_PI; v+=sp->du)
+ {
+ glBegin(sp->render);
+ for (u=-M_PI; u<M_PI; u+=sp->dv)
+ {
+ coord[0] = 0.5*(sp->a+2.0)*cos(u)*cos(v);
+ coord[1] = 0.5*(sp->a+2.0)*sin(u)*cos(v);
+ coord[2] = 0.5*(sp->a+2.0)*sin(v)+u;
+ glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+ glVertex3fv(coord);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+ break;
+ }
+ glPopMatrix();
+
+ if (sp->render == GL_LINES)
+ mi->polygon_count /= 2;
+
+ sp->a = sin(sp->draw_step+=0.01);
+ sp->b = cos(sp->draw_step+=0.01);
+ sp->c = sin(sp->draw_step+0.25*M_PI);
+
+ if (sp->random_surface || sp->random_render)
+ {
+ sp->frame++;
+ if (sp->frame >= speed)
+ {
+ sp->frame = 0;
+ if (sp->random_surface)
+ sp->surface = random() % NUM_SURFACES;
+ if (sp->random_render)
+ {
+ render = random() % NUM_RENDER;
+ switch (render)
+ {
+ case RENDER_POINTS:
+ sp->render = GL_POINTS;
+ break;
+ case RENDER_LINES:
+ sp->render = GL_LINES;
+ break;
+ case RENDER_LINE_LOOP:
+ if (sp->surface == SURFACE_BOHEMIAN ||
+ sp->surface == SURFACE_PLUECKER ||
+ sp->surface == SURFACE_HENNEBERG)
+ sp->render = GL_LINE_LOOP;
+ else
+ sp->render = GL_LINE_STRIP;
+ break;
+ default:
+ sp->render = GL_LINE_LOOP;
+ break;
+ }
+ }
+ }
+ }
+}
+
+
+/* new window size or exposure */
+ENTRYPOINT void reshape_surface(ModeInfo *mi, int width, int height)
+{
+ surfacestruct *sp = &surface[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt(0.0, 0.0, 30.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool surface_handle_event(ModeInfo *mi, XEvent *event)
+{
+ surfacestruct *sp = &surface[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void init_surface(ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ surfacestruct *sp;
+
+ MI_INIT (mi, surface);
+ sp = &surface[screen];
+
+ sp->window = MI_WINDOW(mi);
+
+ {
+ double spin_speed = 1.0;
+ double wander_speed = 0.03;
+ sp->rot = make_rotator(do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ True);
+ sp->trackball = gltrackball_init (True);
+ }
+
+ if (!strcasecmp(surface_type,"random"))
+ {
+ sp->random_surface = True;
+ sp->surface = random() % NUM_SURFACES;
+ }
+ else if (!strcasecmp(surface_type,"dini"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_DINI;
+ }
+ else if (!strcasecmp(surface_type,"enneper"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_ENNEPER;
+ }
+ else if (!strcasecmp(surface_type,"kuen"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_KUEN;
+ }
+ else if (!strcasecmp(surface_type,"moebius"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_MOEBIUS;
+ }
+ else if (!strcasecmp(surface_type,"seashell"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_SEASHELL;
+ }
+ else if (!strcasecmp(surface_type,"swallowtail"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_SWALLOWTAIL;
+ }
+ else if (!strcasecmp(surface_type,"bohemian"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_BOHEMIAN;
+ }
+ else if (!strcasecmp(surface_type,"whitney"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_WHITNEY;
+ }
+ else if (!strcasecmp(surface_type,"pluecker"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_PLUECKER;
+ }
+ else if (!strcasecmp(surface_type,"henneberg"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_HENNEBERG;
+ }
+ else if (!strcasecmp(surface_type,"catalan"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_CATALAN;
+ }
+ else if (!strcasecmp(surface_type,"corkscrew"))
+ {
+ sp->random_surface = False;
+ sp->surface = SURFACE_CORKSCREW;
+ }
+ else
+ {
+ sp->random_surface = True;
+ sp->surface = random() % NUM_SURFACES;
+ }
+
+ if (!strcasecmp(render_mode,"random"))
+ {
+ sp->random_render = True;
+ render = random() % NUM_RENDER;
+ }
+ else if (!strcasecmp(render_mode,"points"))
+ {
+ sp->random_render = False;
+ render = RENDER_POINTS;
+ }
+ else if (!strcasecmp(render_mode,"lines"))
+ {
+ sp->random_render = False;
+ render = RENDER_LINES;
+ }
+ else if (!strcasecmp(render_mode,"line-loops"))
+ {
+ sp->random_render = False;
+ render = RENDER_LINE_LOOP;
+ }
+ else
+ {
+ sp->random_render = True;
+ render = random() % NUM_RENDER;
+ }
+
+ switch (render)
+ {
+ case RENDER_POINTS:
+ sp->render = GL_POINTS;
+ break;
+ case RENDER_LINES:
+ sp->render = GL_LINES;
+ break;
+ case RENDER_LINE_LOOP:
+ if (sp->surface == SURFACE_BOHEMIAN ||
+ sp->surface == SURFACE_PLUECKER ||
+ sp->surface == SURFACE_HENNEBERG)
+ sp->render = GL_LINE_LOOP;
+ else
+ sp->render = GL_LINE_STRIP;
+ break;
+ default:
+ sp->render = GL_LINE_LOOP;
+ break;
+ }
+
+ sp->frame = 0;
+
+ sp->du = 0.07;
+ sp->dv = 0.07;
+ sp->a = sp->b = 1;
+ sp->c = 0.1;
+
+ if ((sp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_surface(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+
+ENTRYPOINT void draw_surface(ModeInfo * mi)
+{
+ surfacestruct *sp = &surface[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!sp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+
+ glXMakeCurrent(display, window, *(sp->glx_context));
+ draw(mi);
+ if (mi->fps_p)
+ do_fps(mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+
+XSCREENSAVER_MODULE_2("Surfaces", surfaces, surface)
+
+#endif
diff --git a/hacks/glx/surfaces.man b/hacks/glx/surfaces.man
new file mode 100644
index 0000000..4c62a0e
--- /dev/null
+++ b/hacks/glx/surfaces.man
@@ -0,0 +1,127 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+surfaces - Draws some interesting 3d parametric surfaces.
+.SH SYNOPSIS
+.B surfaces
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-speed \fInumber\fP]
+[\-rand]
+[\-spin]
+[\-wander]
+[\-fps]
+[\-surface \fIsurface-name\fP]
+[\-random-surface]
+[\-dini]
+[\-enneper]
+[\-kuen]
+[\-moebius]
+[\-seashell]
+[\-swallowtail]
+[\-bohemian]
+[\-whitney]
+[\-pluecker]
+[\-henneberg]
+[\-catalan]
+[\-corkscrew]
+[\-mode \fIdisplay-mode\fP]
+[\-random-mode]
+[\-points]
+[\-lines]
+[\-line-loops]
+.SH DESCRIPTION
+This draws one of several three dimensional parametric surfaces.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Number of frames before changing shape. Default: 1000.
+.TP 8
+.B \-surface random \fP(Shortcut: \fB\-random-surface\fP)
+Display a random surface. This is the default.
+.TP 8
+.B \-surface dini \fP(Shortcut: \fB\-dini\fP)
+Display Dini's surface.
+.TP 8
+.B \-surface enneper \fP(Shortcut: \fB\-enneper\fP)
+Display Enneper's minimal surface.
+.TP 8
+.B \-surface kuen \fP(Shortcut: \fB\-kuen\fP)
+Display the Kuen surface.
+.TP 8
+.B \-surface moebius \fP(Shortcut: \fB\-moebius\fP)
+Display the Moebius strip.
+.TP 8
+.B \-surface seashell \fP(Shortcut: \fB\-seashell\fP)
+Display the seashell surface.
+.TP 8
+.B \-surface swallowtail \fP(Shortcut: \fB\-swallowtail\fP)
+Display the swallowtail catastrophe.
+.TP 8
+.B \-surface bohemian \fP(Shortcut: \fB\-bohemian\fP)
+Display the Bohemian dome.
+.TP 8
+.B \-surface whitney \fP(Shortcut: \fB\-whitney\fP)
+Display the Whitney umbrella.
+.TP 8
+.B \-surface pluecker \fP(Shortcut: \fB\-pluecker\fP)
+Display Pluecker's conoid.
+.TP 8
+.B \-surface henneberg \fP(Shortcut: \fB\-henneberg\fP)
+Display Henneberg's minimal surface.
+.TP 8
+.B \-surface catalan \fP(Shortcut: \fB\-catalan\fP)
+Display Catalan's minimal surface.
+.TP 8
+.B \-surface corkscrew \fP(Shortcut: \fB\-corkscrew\fP)
+Display the corkscrew surface.
+.TP 8
+.B \-mode random \fP(Shortcut: \fB\-random-mode\fP)
+Use random OpenGL primitives to display the surface. This is the
+default.
+.TP 8
+.B \-mode points \fP(Shortcut: \fB\-points\fP)
+Use OpenGL points to display the surface.
+.TP 8
+.B \-mode lines \fP(Shortcut: \fB\-lines\fP)
+Use OpenGL lines to display the surface.
+.TP 8
+.B \-mode line-loops \fP(Shortcut: \fB\-line-loops\fP)
+Use OpenGL line loops to display the surface.
+.TP 8
+.B \-wander | \-no-wander
+Whether to wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether to rotate around the center of the figure.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH AUTHORS
+Andrey Mirtchovski, Carsten Steger
diff --git a/hacks/glx/swim.c b/hacks/glx/swim.c
new file mode 100644
index 0000000..e20655a
--- /dev/null
+++ b/hacks/glx/swim.c
@@ -0,0 +1,232 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if 0
+static const char sccsid[] = "@(#)swim.c 1.3 98/06/18 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@users.sourceforge.net
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef STANDALONE
+# include <math.h>
+# include "xlockmoreI.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+void
+FishTransform(fishRec * fish)
+{
+
+ glTranslatef(fish->y, fish->z, -fish->x);
+ glRotatef(-fish->psi, 0.0, 1.0, 0.0);
+ glRotatef(fish->theta, 1.0, 0.0, 0.0);
+ glRotatef(-fish->phi, 0.0, 0.0, 1.0);
+}
+
+void
+WhalePilot(fishRec * fish, float whalespeed, Bool whaledir)
+{
+
+ fish->phi = -20.0;
+ fish->theta = 0.0;
+ fish->psi += ((whaledir) ? -0.5 : 0.5);
+
+ fish->x += whalespeed * fish->v * cos(fish->psi / RAD) * cos(fish->theta / RAD);
+ fish->y += whalespeed * fish->v * sin(fish->psi / RAD) * cos(fish->theta / RAD);
+ fish->z += whalespeed * fish->v * sin(fish->theta / RAD);
+}
+
+void
+SharkPilot(fishRec * fish, float sharkspeed)
+{
+ float X, Y, Z, tpsi, ttheta, thetal;
+
+ fish->xt = 60000.0;
+ fish->yt = 0.0;
+ fish->zt = 0.0;
+
+ X = fish->xt - fish->x;
+ Y = fish->yt - fish->y;
+ Z = fish->zt - fish->z;
+
+ thetal = fish->theta;
+
+ ttheta = RAD * atan(Z / (sqrt(X * X + Y * Y)));
+
+ if (ttheta > fish->theta + 0.25) {
+ fish->theta += 0.5;
+ } else if (ttheta < fish->theta - 0.25) {
+ fish->theta -= 0.5;
+ }
+ if (fish->theta > 90.0) {
+ fish->theta = 90.0;
+ }
+ if (fish->theta < -90.0) {
+ fish->theta = -90.0;
+ }
+ fish->dtheta = fish->theta - thetal;
+
+ tpsi = RAD * atan2(Y, X);
+
+ fish->attack = 0;
+
+ if (fabs(tpsi - fish->psi) < 10.0) {
+ fish->attack = 1;
+ } else if (fabs(tpsi - fish->psi) < 45.0) {
+ if (fish->psi > tpsi) {
+ fish->psi -= 0.5;
+ if (fish->psi < -180.0) {
+ fish->psi += 360.0;
+ }
+ } else if (fish->psi < tpsi) {
+ fish->psi += 0.5;
+ if (fish->psi > 180.0) {
+ fish->psi -= 360.0;
+ }
+ }
+ } else {
+ if (NRAND(100) > 98) {
+ fish->sign = (fish->sign < 0 ? 1 : -1);
+ }
+ fish->psi += (fish->sign ? 1 : -1);
+ if (fish->psi > 180.0) {
+ fish->psi -= 360.0;
+ }
+ if (fish->psi < -180.0) {
+ fish->psi += 360.0;
+ }
+ }
+
+ if (fish->attack) {
+ if (fish->v < 1.1) {
+ fish->spurt = 1;
+ }
+ if (fish->spurt) {
+ fish->v += 0.2;
+ }
+ if (fish->v > 5.0) {
+ fish->spurt = 0;
+ }
+ if ((fish->v > 1.0) && (!fish->spurt)) {
+ fish->v -= 0.2;
+ }
+ } else {
+ if (!(NRAND(400)) && (!fish->spurt)) {
+ fish->spurt = 1;
+ }
+ if (fish->spurt) {
+ fish->v += 0.05;
+ }
+ if (fish->v > 3.0) {
+ fish->spurt = 0;
+ }
+ if ((fish->v > 1.0) && (!fish->spurt)) {
+ fish->v -= 0.05;
+ }
+ }
+
+ fish->x += sharkspeed * fish->v * cos(fish->psi / RAD) * cos(fish->theta / RAD);
+ fish->y += sharkspeed * fish->v * sin(fish->psi / RAD) * cos(fish->theta / RAD);
+ fish->z += sharkspeed * fish->v * sin(fish->theta / RAD);
+}
+
+void
+SharkMiss(atlantisstruct * ap, int i)
+{
+ int j;
+ float avoid, thetal;
+ float X, Y, Z, R;
+
+ for (j = 0; j < ap->num_sharks; j++) {
+ if (j != i) {
+ X = ap->sharks[j].x - ap->sharks[i].x;
+ Y = ap->sharks[j].y - ap->sharks[i].y;
+ Z = ap->sharks[j].z - ap->sharks[i].z;
+
+ R = sqrt(X * X + Y * Y + Z * Z);
+
+ avoid = 1.0;
+ thetal = ap->sharks[i].theta;
+
+ if (R < ap->sharksize) {
+ if (Z > 0.0) {
+ ap->sharks[i].theta -= avoid;
+ } else {
+ ap->sharks[i].theta += avoid;
+ }
+ }
+ ap->sharks[i].dtheta += (ap->sharks[i].theta - thetal);
+ }
+ }
+}
+#endif
diff --git a/hacks/glx/tangram.c b/hacks/glx/tangram.c
new file mode 100644
index 0000000..c250f54
--- /dev/null
+++ b/hacks/glx/tangram.c
@@ -0,0 +1,1067 @@
+/* tangram, Copyright (c) 2005-2014 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation. No representations are made
+ * about the suitability of this software for any purpose. It is
+ * provided "as is" without express or implied warranty.
+ *
+ * Sun 10 July 2005 Changed the code that solves the puzzles.
+ * Also, limited the palette and added names.
+ *
+ * Wed 13 July 2005 Added option to turn off rotation.
+ * Changed color and materials
+ */
+
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*wireframe: False \n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*titleFont2: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*\n" \
+ "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n" \
+
+# define free_tangram 0
+# define release_tangram 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+
+#include <ctype.h>
+
+
+#ifdef USE_GL /* whole file */
+
+#include <time.h>
+#include <math.h>
+#include "tangram_shapes.h"
+#include "texfont.h"
+
+typedef struct {
+ GLubyte r;
+ GLubyte g;
+ GLubyte b;
+} color;
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+} coord;
+
+typedef struct {
+ coord crd; /* coordinates */
+ GLint r; /* rotation */
+ GLint fr; /* flip Rotate. Used to keep track during animation */
+ GLint dl; /* display List */
+ GLfloat dz; /* velocity */
+ GLfloat ddz; /* Acceleration */
+ GLfloat solved; /* shapes state */
+ Bool up; /* Move up the z axis? */
+} tangram_shape;
+
+typedef struct {
+ char *name;
+ tangram_shape ts[7];
+} puzzle;
+
+typedef enum {
+ no_shape = -1,
+ small_triangle1 = 0,
+ small_triangle2 = 1,
+ medium_triangle = 2,
+ large_triangle1 = 3,
+ large_triangle2 = 4,
+ square = 5,
+ rhomboid = 6
+} shape_type;
+
+#define SPEED 0.03
+enum {
+ BOTTOM = 0,
+ DEF_WAIT = 500,
+ INIT_DZ = 2,
+ NUM_SHAPES = 7
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ tangram_shape tsm1, tsm2, tm, tlg1, tlg2, sq, rh;
+ tangram_shape n_tsm1, n_tsm2, n_tm, n_tlg1, n_tlg2, n_sq, n_rh;
+ char *puzzle_name;
+ int csi;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+ texture_font_data *font1_data, *font2_data, *font3_data;
+ GLfloat theta[3];
+ Bool going_down[3];
+
+ const char *pn;
+ int display_counter;
+
+} tangram_configuration;
+
+static tangram_configuration *tps = NULL;
+
+#define DEF_VIEWING_TIME "5"
+#define DEF_ROTATE "True"
+#define DEF_X_CAMERA_ROTATE "0.2"
+#define DEF_Y_CAMERA_ROTATE "0.5"
+#define DEF_Z_CAMERA_ROTATE "0"
+#define DEF_LABELS "True"
+
+static GLuint viewing_time;
+static Bool do_rotate;
+static Bool do_labels;
+static GLfloat x_camera_rotate;
+static GLfloat y_camera_rotate;
+static GLfloat z_camera_rotate;
+static int wire;
+
+static XrmOptionDescRec opts[] = {
+ {"-viewing_time", ".viewingTime", XrmoptionSepArg, 0},
+ {"-rotate", ".rotate", XrmoptionNoArg, "True"},
+ {"+rotate", ".rotate", XrmoptionNoArg, "False"},
+ {"-labels", ".labels", XrmoptionNoArg, "True"},
+ {"+labels", ".labels", XrmoptionNoArg, "False"},
+ {"-x_camera_rotate", ".xCameraRotate", XrmoptionSepArg, 0},
+ {"-y_camera_rotate", ".yCameraRotate", XrmoptionSepArg, 0},
+ {"-z_camera_rotate", ".zCameraRotate", XrmoptionSepArg, 0}
+};
+
+static argtype vars[] = {
+ {&viewing_time, "viewingTime", "ViewingTime", DEF_VIEWING_TIME, t_Int},
+ {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
+ {&x_camera_rotate, "xCameraRotate", "XCameraRotate", DEF_X_CAMERA_ROTATE, t_Float},
+ {&y_camera_rotate, "yCameraRotate", "YCameraRotate", DEF_Y_CAMERA_ROTATE, t_Float},
+ {&z_camera_rotate, "zCameraRotate", "ZCameraRotate", DEF_Z_CAMERA_ROTATE, t_Float}
+};
+
+ENTRYPOINT ModeSpecOpt tangram_opts = { countof(opts), opts, countof(vars), vars, NULL };
+
+static const puzzle solved[] = {
+ {"Teapot", {
+ {{-1.664000, -1.552000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.696000, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.064000, -2.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.960000, -1.056000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.104000, 0.960000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.376000, -0.800000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.152000, 0.736000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Candle", {
+ {{-0.016000, 2.176001, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.016000, 2.960001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.000000, 0.400000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-2.015998, 2.208001, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.000001, 2.208001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.496000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.016000, -0.672000, 0}, 335, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Square", {
+ {{-0.048000, -0.016000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.704000, 0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.488000, 1.424001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.016000, -0.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.000000, 0.000000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.688000, 0.720000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.784000, 0.672000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Crane", {
+ {{1.248001, 1.759999, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.024000, 3.071999, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.975999, -2.096001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.480000, -1.968001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.056000, -0.496000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.239999, -1.312001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.223999, -1.360001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Crane", {
+ {{0.320000, 1.360000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.704000, 3.072000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.200000, -3.392000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.688000, -1.184000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.768000, 0.192000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.168000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.312000, 1.296000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Duck", {
+ {{-1.391999, 1.424000, 0}, 65, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.768000, 2.000000, 0}, 99, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.688001, -1.872000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.343999, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.112000, -0.464000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.984001, -1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.536001, 0.912000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Pelican", {
+ {{1.088000, 0.064001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.864000, -1.279999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.807999, 1.520000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.824001, -1.231998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.368000, 1.472000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.832000, -2.271998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.776001, 0.816000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Cat", {
+ {{0.416000, -2.432000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.352000, -2.432000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.832000, -0.480000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.632000, 3.056000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.616000, 1.040000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.088000, -1.696000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.832000, -0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Coi", {
+ {{1.264000, -1.232000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.216000, 0.816000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.631999, 1.872000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.832000, 2.287999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.608000, 0.912000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.240001, -0.176000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.256000, -1.200000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Man Skipping", {
+ {{1.727998, 2.303998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.120000, 3.376001, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.879998, -3.008001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.072000, 2.559999, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.440000, 0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.192001, -2.592001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.015999, 0.176000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Old Man", {
+ {{-0.400000, 1.744000, 0}, 58, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.704000, 0.128000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.656000, 0.320000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.112000, -0.384000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.096000, -0.399999, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.736000, 0.352000, 0}, 123, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.336000, 0.352000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Spear Head", {
+ {{0.688000, -0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.080000, 0.592000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.048000, 0.592000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.488000, -0.848000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.376000, -0.864000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.688000, -0.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.504000, -0.832000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Diamond", {
+ {{0.624000, -1.776000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.144000, 0.432000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.800000, -0.272000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-2.320000, -0.304000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{2.048000, -0.320000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.112000, 0.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.832000, -0.320000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Arrow", {
+ {{-2.048001, -1.232000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.112000, 0.943999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.312001, -0.560000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.496000, 0.656000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.528000, 0.608000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-2.048001, -2.704000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.312001, -0.512000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Lady", {
+ {{-0.720000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.912000, -1.072000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.736000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.720000, 1.984000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.672000, 0.544000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.192000, -3.840000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.528000, -2.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Running Man", {
+ {{1.136000, 2.720000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-2.304001, 1.776000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.256000, 0.288000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.304000, 0.304000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.096000, -0.128000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.656000, -2.832000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.784000, -0.096000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Parallelogram", {
+ {{-1.104000, -1.455999, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.912000, -0.447999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.048000, -1.471999, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.136000, -1.439999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.944000, 1.552000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.912000, 0.560000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.112000, 1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"N", {
+ {{-1.615999, 0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.592000, 0.112000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.432000, 0.096000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.679999, -0.880000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.488001, 1.103999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.640000, 0.112000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.392001, -0.928000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Farm House", {
+ {{2.112000, 1.504000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.040000, 1.472000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.032000, -1.600000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.056000, 1.504000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.992000, -0.528000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.080000, 0.512000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.104000, 0.480000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Vulture", {
+ {{0.912000, 1.728000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-2.623998, -1.040000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.992000, 1.104000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.944000, -0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.448000, -1.760000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.887998, -0.368000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{3.008002, 2.160000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Swan", {
+ {{0.720000, 0.352000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.672000, -1.568000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.376000, 1.104000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.151999, 1.488000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.320000, 2.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.656000, 0.304000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.624000, -2.559999, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"High Karate", {
+ {{-0.144000, 2.576000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.696001, -2.432000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.176001, -0.400000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.624000, -0.512000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.576000, -1.152000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.919999, -1.376000, 0}, 303, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.448000, -0.096001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Lazy", {
+ {{-2.416000, 1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.952000, -2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.552000, -0.640000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.016000, 1.840000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.456000, -1.072000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.848000, -0.816000, 0}, 332, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.200000, -1.792000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Bat", {
+ {{-0.304000, -0.352000, 0}, 259, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.304000, -1.344000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.312000, -1.024000, 0}, 300, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.952000, 0.240000, 0}, 195, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-2.272000, 0.096000, 0}, 11, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.112000, -1.056000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.560000, -1.344000, 0}, 281, 180, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Sail Boat", {
+ {{0.544000, 2.000000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.880000, 0.160000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.656000, -1.503999, 0}, 220, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.656000, -0.336000, 0}, 50, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.688000, -0.288000, 0}, 310, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.864000, 1.232000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.496000, 2.016001, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Glenda", {
+ {{-2.016000, 2.080000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.240001, 1.824000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.239999, -0.752000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.264000, 2.784000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.248000, 0.736000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.240001, 0.304000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.544000, -2.976001, 0}, 149, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Cat", {
+ {{1.376000, -1.536001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.488000, -1.552001, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.352000, -0.048000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-2.144000, 2.415999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-2.096000, 0.368000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.144000, -0.800000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.392000, -0.064000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Lying Cat", {
+ {{2.480000, -0.912000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{2.592000, -0.928000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.352000, 1.280000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.688000, 0.336000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.808000, -0.112000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{3.248000, -0.176000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.472000, 1.024000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Witch", {
+ {{-0.943999, -0.304000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.144000, 0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.360000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.328000, -0.848000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.008000, 1.584000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.512000, 2.688000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.863999, -0.096000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Laugh", {
+ {{0.703999, -0.160000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.064000, -0.400000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.767999, -1.408000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.232000, -1.328000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.040000, 2.624000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.288000, 1.264000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.760001, -1.408000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Standing Man", {
+ {{0.272000, 3.392000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.144000, -1.328000, 0}, 331, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.216001, 0.272000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.736000, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.432000, -3.440000, 0}, 151, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.720000, 2.320000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.263998, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Walking Man", {
+ {{-1.056000, -3.456000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.736000, 2.000000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.488000, 1.760000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.432000, 0.016000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.432000, -0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.560000, -2.576000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.032000, 2.656000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Repose", {
+ {{-2.800000, -2.304000, 0}, 101, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.888000, 2.032000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.856000, 2.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.352000, -0.144000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-2.848000, 0.976000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.424000, -1.104000, 0}, 236, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.792000, 2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Shape", {
+ {{1.263999, 1.600001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.311999, -1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.736000, 0.576000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.736000, -2.591999, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.768000, 2.640001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.784000, -0.528000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.736000, 0.496000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Shape", {
+ {{-0.816000, 1.392000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.832000, -1.807999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.216000, -0.752000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.232000, -2.815999, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.248000, 2.400000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.864000, 1.392000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.240000, 1.328000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Lightning", {
+ {{0.176000, -2.448000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.888000, 2.880000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.856000, 1.824000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.872000, -1.392000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.264000, -0.432000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{2.320001, -2.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.872000, 1.728000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"E", {
+ {{0.928000, 1.664000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.896000, -1.519998, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.136000, 0.608000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.152000, -2.559998, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.152000, 2.672002, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.960000, -0.384000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.136000, 0.528000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Dagger", {
+ {{-0.096000, 0.448000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.640000, 2.656000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.064000, -3.104000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.767999, 1.184000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.080000, 0.416000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.416000, -2.064000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.112000, 3.328001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Knight", {
+ {{-0.368000, 0.400000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.871998, -1.808000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.056000, -0.368000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.056000, -1.840000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.352000, 1.440000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.128000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.119999, -1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Candy", {
+ {{-1.039999, 1.136000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.024000, 0.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.016000, 0.048000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.016000, -1.008000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.016000, 1.216000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.024000, 0.144000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.032000, 1.088000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"King", {
+ {{-0.688000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.800000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.512000, -1.392000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.488000, 1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.392000, 1.120000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.496000, -1.312000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.480000, -1.376000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Top", {
+ {{-1.055999, -0.800000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.103999, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{0.000000, -0.784000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.016000, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.032000, 0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{0.480000, -1.855999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.096001, 0.224000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Dog", {
+ {{-2.896000, -0.128000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.800000, 0.992000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-1.152000, -0.416000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.016000, 0.656000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.456000, -0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{2.864000, 0.736000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.048000, 1.664000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+ },
+ },
+ {"Moose Head", {
+ {{2.944000, -0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.936000, -0.224000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.112000, 1.808000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{-2.128000, 0.768000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{1.888000, 0.768000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.112000, -0.688000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-3.184000, -1.216000, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, False},
+ },
+ },
+ {"Negative Square", {
+ {{-1.520000, -0.624000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-1.520000, 0.480000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{2.352000, 0.480000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+ {{-0.080000, -3.040000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+ {{-0.096000, 2.944000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+ {{-2.528000, -0.576000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+ {{1.360000, -1.600000, 0}, 360, 180, INIT_DZ, -SPEED, 0, True},
+ }}
+};
+
+
+static void get_solved_puzzle(ModeInfo * mi,
+ tangram_shape * tsm1, tangram_shape * tsm2,
+ tangram_shape * tm, tangram_shape * tlg1,
+ tangram_shape * tlg2, tangram_shape * sq,
+ tangram_shape * rh)
+{
+ tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+ int sz = sizeof(solved) / sizeof(solved[0]);
+ int r;
+
+ /* we don't want to see the same puzzle twice */
+ do {
+ r = random() % sz;
+ } while (r == tp->csi);
+ tp->csi = r;
+
+ *tsm1 = solved[r].ts[small_triangle1];
+ *tsm2 = solved[r].ts[small_triangle2];
+ *tm = solved[r].ts[medium_triangle];
+ *tlg1 = solved[r].ts[large_triangle1];
+ *tlg2 = solved[r].ts[large_triangle2];
+ *sq = solved[r].ts[square];
+ *rh = solved[r].ts[rhomboid];
+
+ tp->puzzle_name = solved[r].name;
+}
+
+static int approach_number(int goal, int current, int step)
+{
+
+ int i = 0;
+
+ if (goal > current) {
+ while (i < step) {
+ current++;
+ if (goal <= current)
+ break;
+ i++;
+ }
+ } else if (goal < current) {
+ while (i < step) {
+ current--;
+ if (goal >= current)
+ break;
+ i++;
+ }
+ }
+
+ return current;
+}
+
+/* gt - floating point greater than comparison */
+static Bool gt(GLfloat x1, GLfloat x2, GLfloat per)
+{
+ if ((x1 > x2) && (fabs(x1 - x2) > per))
+ return True;
+ else
+ return False;
+}
+
+/* lt - floating point less than comparison */
+static Bool lt(GLfloat x1, GLfloat x2, GLfloat per)
+{
+ if ((x1 < x2) && (fabs(x1 - x2) > per))
+ return True;
+ else
+ return False;
+}
+
+static GLfloat approach_float(GLfloat goal, GLfloat current,
+ Bool * changed, GLfloat per)
+{
+ *changed = False;
+ if (gt(goal, current, per)) {
+ current += per;
+ *changed = True;
+ } else if (lt(goal, current, per)) {
+ current -= per;
+ *changed = True;
+ }
+ return current;
+}
+
+#if 0
+static void print_shape(char *s, tangram_shape sh)
+{
+ fprintf(stderr, "%s\n", s);
+ fprintf(stderr, "(%f, %f, %f)\n", sh.crd.x, sh.crd.y, sh.crd.z);
+ fprintf(stderr, "%d\n", sh.r);
+ fprintf(stderr, "%d\n", sh.fr);
+ fprintf(stderr, "\n");
+}
+#endif
+
+
+static void reset_shape(tangram_shape * ts)
+{
+ GLfloat r = random() % 10;
+ GLfloat f = r / 10;
+ ts->crd.z = BOTTOM;
+ ts->dz = INIT_DZ + f;
+ ts->ddz = -SPEED;
+}
+
+static void bounce(tangram_shape * ts)
+{
+ ts->crd.z *= -1; /* ignore this */
+ ts->dz += ts->ddz;
+ ts->crd.z += ts->dz * SPEED;
+ if (ts->crd.z < BOTTOM) {
+ reset_shape(ts);
+ }
+
+ ts->crd.z *= -1; /* ignore this */
+}
+
+static void draw_tangram_shape(tangram_shape ts)
+{
+ glPushMatrix();
+
+ if (!do_rotate) {
+ ts.up = True;
+ }
+
+ glTranslatef(ts.crd.x, ts.crd.y, ts.up ? ts.crd.z : -ts.crd.z);
+ glRotated(90, 1, 0, 0);
+ glRotated(ts.fr, 1, 0, 0);
+ glRotated(ts.r, 0, 1, 0);
+ glCallList(ts.dl);
+ glPopMatrix();
+}
+
+static void load_fonts(ModeInfo * mi)
+{
+ tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+ tp->font1_data = load_texture_font (mi->dpy, "titleFont");
+ tp->font2_data = load_texture_font (mi->dpy, "titleFont2");
+ tp->font3_data = load_texture_font (mi->dpy, "titleFont3");
+}
+
+static void draw_shapes(ModeInfo * mi)
+{
+ tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, 1/h, 1);
+ }
+# endif
+
+ draw_tangram_shape(tp->tsm1);
+
+ draw_tangram_shape(tp->tsm2);
+ draw_tangram_shape(tp->tm);
+ draw_tangram_shape(tp->tlg1);
+ draw_tangram_shape(tp->tlg2);
+ draw_tangram_shape(tp->sq);
+ draw_tangram_shape(tp->rh);
+
+ if (do_labels)
+ {
+ texture_font_data *f;
+ if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+ f = tp->font1_data;
+ else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+ f = tp->font2_data;
+ else
+ f = tp->font3_data;
+
+ glColor3f(0.8, 0.8, 0);
+ print_texture_label (mi->dpy, f,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, tp->pn);
+ }
+}
+
+ENTRYPOINT void reshape_tangram(ModeInfo * mi, int w, int h)
+{
+ int y = 0;
+
+ if (w > h * 5) { /* tiny window: show middle */
+ h = w;
+ y = -h/2;
+ }
+
+ glViewport(0, y, w, h);
+}
+
+static void set_camera(tangram_configuration *tp)
+{
+ glPushMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(60, -1, 0.1, 50);
+
+
+ gluLookAt(0, 5, -5, 0, 0, 0, 0, -1, 0);
+
+ if (do_rotate) {
+ glRotatef(tp->theta[0], 1, 0, 0);
+ glRotatef(tp->theta[1], 0, 1, 0);
+ glRotatef(tp->theta[2], 0, 0, 1);
+ }
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+
+ if (tp->going_down[0] && tp->theta[0] < 0) {
+
+ tp->going_down[0] = False;
+ } else if ((!tp->going_down[0]) && tp->theta[0] > 90) {
+
+ tp->going_down[0] = True;
+ }
+
+ if (tp->theta[1] > 360.0)
+ tp->theta[1] -= 360.0;
+
+ if (tp->theta[2] > 360.0)
+ tp->theta[2] -= 360.0;
+
+ if (tp->going_down[0])
+ tp->theta[0] -= x_camera_rotate;
+ else
+ tp->theta[0] += x_camera_rotate;
+
+ tp->theta[1] += y_camera_rotate;
+ tp->theta[2] += z_camera_rotate;
+}
+
+static void init_shapes(ModeInfo * mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+ get_solved_puzzle(mi, &tp->tsm1, &tp->tsm2, &tp->tm, &tp->tlg1,
+ &tp->tlg2, &tp->sq, &tp->rh);
+ get_solved_puzzle(mi, &tp->n_tsm1, &tp->n_tsm2, &tp->n_tm, &tp->n_tlg1,
+ &tp->n_tlg2, &tp->n_sq, &tp->n_rh);
+ tp->tsm1.dl = tangram_get_sm_tri_dl(wire);
+ tp->tsm2.dl = tangram_get_sm_tri_dl(wire);
+ tp->tm.dl = tangram_get_md_tri_dl(wire);
+ tp->tlg1.dl = tangram_get_lg_tri_dl(wire);
+ tp->tlg2.dl = tangram_get_lg_tri_dl(wire);
+ tp->sq.dl = tangram_get_square_dl(wire);
+ tp->rh.dl = tangram_get_rhomboid_dl(wire);
+}
+
+static void gl_init(ModeInfo * mi)
+{
+
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat y = do_rotate ? -10 : 3;
+ GLfloat x = do_rotate ? 5 : 10;
+ GLfloat pos[4] = { 0, 0, -5, 1.00 };
+ GLfloat pos2[4] = { 0, 0, 5, 1.00 };
+ GLfloat dif2[4] = { 1, 1, 1, 1 };
+
+ pos[0] = -x;
+ pos[1] = y;
+
+ pos2[1] = x;
+ pos2[1] = y;
+
+ if (!wire) {
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_LIGHT0);
+ if (do_rotate) {
+ glLightfv(GL_LIGHT1, GL_POSITION, pos2);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif2);
+ glEnable(GL_LIGHT1);
+ }
+ glEnable(GL_DEPTH_TEST);
+ }
+
+}
+
+ENTRYPOINT void init_tangram(ModeInfo * mi)
+{
+ tangram_configuration *tp;
+
+ MI_INIT (mi, tps);
+
+ tp = &tps[MI_SCREEN(mi)];
+
+ if ((tp->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ }
+
+ reshape_tangram (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ wire = MI_IS_WIREFRAME(mi);
+
+ load_fonts(mi);
+ init_shapes(mi);
+
+ tp->theta[0] = tp->theta[1] = tp->theta[2] = 1;
+
+}
+
+static Bool all_solved(tangram_shape * ls[])
+{
+ int i;
+ Bool b = True;
+ for (i = 0; i < NUM_SHAPES; i++) {
+ b = (b && ls[i]->solved);
+ }
+ return b;
+}
+
+static void solve(tangram_shape * new_s, tangram_shape * old_s)
+{
+ Bool moved_x, moved_y, moved_r, moved_fr, z_ok;
+
+ old_s->fr = approach_number(new_s->fr, old_s->fr, 2);
+ moved_fr = (old_s->fr != new_s->fr);
+
+ old_s->r = approach_number(new_s->r, old_s->r, 2);
+ moved_r = (old_s->r != new_s->r);
+
+ old_s->crd.x =
+ approach_float(new_s->crd.x, old_s->crd.x, &moved_x, 0.1);
+ if (!moved_x)
+ old_s->crd.x = new_s->crd.x;
+
+ old_s->crd.y =
+ approach_float(new_s->crd.y, old_s->crd.y, &moved_y, 0.1);
+ if (!moved_y)
+ old_s->crd.y = new_s->crd.y;
+
+ z_ok = (-old_s->crd.z <= BOTTOM);
+
+ old_s->solved = (moved_x == False && moved_y == False &&
+ moved_r == False && moved_fr == False &&
+ z_ok == True);
+}
+
+static void set_not_solved(tangram_shape * ls[])
+{
+ int i;
+ for (i = 0; i < NUM_SHAPES; i++)
+ ls[i]->solved = False;
+}
+
+
+ENTRYPOINT void draw_tangram(ModeInfo * mi)
+{
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+
+ tangram_shape *ls[NUM_SHAPES];
+ tangram_shape *nls[NUM_SHAPES];
+
+
+ int i;
+ int MAX_DISPLAY;
+
+ GLfloat color[4] = { 0.0, 0.0, 0.0, 1.0 };
+ GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
+ MAX_DISPLAY = viewing_time * 100;
+
+ if (! tp->glx_context)
+ return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(tp->glx_context));
+
+ ls[small_triangle1] = &tp->tsm1;
+ ls[small_triangle2] = &tp->tsm2;
+ ls[medium_triangle] = &tp->tm;
+ ls[large_triangle1] = &tp->tlg1;
+ ls[large_triangle2] = &tp->tlg2;
+ ls[square] = &tp->sq;
+ ls[rhomboid] = &tp->rh;
+
+ nls[small_triangle1] = &tp->n_tsm1;
+ nls[small_triangle2] = &tp->n_tsm2;
+ nls[medium_triangle] = &tp->n_tm;
+ nls[large_triangle1] = &tp->n_tlg1;
+ nls[large_triangle2] = &tp->n_tlg2;
+ nls[square] = &tp->n_sq;
+ nls[rhomboid] = &tp->n_rh;
+
+ set_camera(tp);
+
+ if (tp->display_counter <= 0) {
+ for (i = 0; i < NUM_SHAPES; i++) {
+ if (ls[i]->solved) {
+ if (all_solved(ls)) {
+ tp->display_counter = MAX_DISPLAY;
+ tp->pn = tp->puzzle_name;
+ get_solved_puzzle(mi, nls[small_triangle1],
+ nls[small_triangle2],
+ nls[medium_triangle],
+ nls[large_triangle1],
+ nls[large_triangle2], nls[square],
+ nls[rhomboid]);
+ tp->ncolors = 128;
+ tp->colors =
+ (XColor *) calloc(tp->ncolors, sizeof(XColor));
+
+ make_random_colormap(0, 0, 0,
+ tp->colors, &tp->ncolors,
+ True, False, 0, False);
+
+
+ color[0] = tp->colors[0].red / 65536.0;
+ color[1] = tp->colors[1].green / 65536.0;
+ color[2] = tp->colors[2].blue / 65536.0;
+
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
+ color);
+
+ set_not_solved(ls);
+ break;
+ }
+ } else {
+ tp->pn = "";
+ bounce(ls[i]);
+ solve(nls[i], ls[i]);
+ }
+ }
+ } else {
+ tp->display_counter--;
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glPushMatrix();
+
+ glLoadIdentity();
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 128);
+
+ draw_shapes(mi);
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFlush();
+ glPopMatrix();
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT Bool
+tangram_handle_event (ModeInfo *mi, XEvent *event)
+{
+ tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ tp->display_counter = 0;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+XSCREENSAVER_MODULE ("Tangram", tangram)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/tangram.man b/hacks/glx/tangram.man
new file mode 100644
index 0000000..c5d3980
--- /dev/null
+++ b/hacks/glx/tangram.man
@@ -0,0 +1,67 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+tangram - watch the computer solve tangram puzzles.
+.SH SYNOPSIS
+.B tangram
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-viewing_time \fInumber\fP]
+[\-rotate]
+[\-fps]
+.SH DESCRIPTION
+The \fItangram\fP program uses a few basic shapes to build silhouettes of recognizable objects.
+.SH OPTIONS
+.I tangram
+accepts the following options:
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-viewing_time \fInumber\fP
+Specify the length of time, in seconds, that the finished puzzle
+should be displayed. Default: 5
+.TP 8
+.B \-rotate | \-no-rotate
+Rotate the camera around the puzzle.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jeremy English. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jeremy English <jhe@jeremyenglish.org>
diff --git a/hacks/glx/tangram_shapes.c b/hacks/glx/tangram_shapes.c
new file mode 100644
index 0000000..267b187
--- /dev/null
+++ b/hacks/glx/tangram_shapes.c
@@ -0,0 +1,240 @@
+/* tangram, Copyright (c) 2005 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "tangram_shapes.h"
+
+#define small_scale ( 1 )
+#define large_scale ( 2 )
+#define medium_scale ( 1.414213562 )
+
+#define alpha (0.05)
+
+static void
+tri_45_90(int wire)
+{
+ GLfloat vertices[][3] = {
+ {0, alpha, 0},
+ {0, alpha, 1},
+ {1, alpha, 0},
+ {0, -alpha, 0},
+ {0, -alpha, 1},
+ {1, -alpha, 0}
+ };
+
+ glBegin((wire) ? GL_LINE_LOOP : GL_TRIANGLES);
+
+ glNormal3f(0, 1, 0);
+ glVertex3fv(vertices[0]);
+ glNormal3f(0, 1, 0);
+ glVertex3fv(vertices[2]);
+ glNormal3f(0, 1, 0);
+ glVertex3fv(vertices[1]);
+
+ glNormal3f(0, -1, 0);
+ glVertex3fv(vertices[3]);
+ glNormal3f(0, -1, 0);
+ glVertex3fv(vertices[4]);
+ glNormal3f(0, -1, 0);
+ glVertex3fv(vertices[5]);
+ glEnd();
+
+ glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[2]);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[5]);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[4]);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[1]);
+
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[0]);
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[1]);
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[4]);
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[3]);
+
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[0]);
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[3]);
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[5]);
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[2]);
+ glEnd();
+}
+
+static void
+unit_cube(int wire)
+{
+ glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
+
+
+ glNormal3f(0.0f, 1.0f, 0.0f);
+ glVertex3f(0.0f, alpha, 0.0f);
+ glVertex3f(0.0f, alpha, 1.0f);
+ glVertex3f(1.0f, alpha, 1.0f);
+ glVertex3f(1.0f, alpha, 0.0f);
+
+ glNormal3f(0.0f, 0.0f, 1.0f);
+ glVertex3f(0.0f, -alpha, 1.0f);
+ glVertex3f(1.0f, -alpha, 1.0f);
+ glVertex3f(1.0f, alpha, 1.0f);
+ glVertex3f(0.0f, alpha, 1.0f);
+
+ glNormal3f(0.0f, 0.0f, -1.0f);
+ glVertex3f(0.0f, -alpha, 0.0f);
+ glVertex3f(0.0f, alpha, 0.0f);
+ glVertex3f(1.0f, alpha, 0.0f);
+ glVertex3f(1.0f, -alpha, 0.0f);
+
+ glNormal3f(1.0f, 0.0f, 0.0f);
+ glVertex3f(1.0f, -alpha, 0.0f);
+ glVertex3f(1.0f, alpha, 0.0f);
+ glVertex3f(1.0f, alpha, 1.0f);
+ glVertex3f(1.0f, -alpha, 1.0f);
+
+ glNormal3f(-1.0f, 0.0f, 0.0f);
+ glVertex3f(0.0f, -alpha, 0.0f);
+ glVertex3f(0.0f, -alpha, 1.0f);
+ glVertex3f(0.0f, alpha, 1.0f);
+ glVertex3f(0.0f, alpha, 0.0f);
+
+ glNormal3f(0.0f, -1.0f, 0.0f);
+ glVertex3f(0.0f, -alpha, 0.0f);
+ glVertex3f(1.0f, -alpha, 0.0f);
+ glVertex3f(1.0f, -alpha, 1.0f);
+ glVertex3f(0.0f, -alpha, 1.0f);
+
+ glEnd();
+}
+
+static void
+unit_rhomboid(int wire)
+{
+ glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
+
+ glNormal3f(0.0f, 1.0f, 0.0f);
+ glVertex3f(0, alpha, 0);
+ glVertex3f(1, alpha, 1);
+ glVertex3f(1, alpha, 2);
+ glVertex3f(0, alpha, 1);
+
+ glNormal3f(0.0f, -1.0f, 0.0f);
+ glVertex3f(0, -alpha, 0);
+ glVertex3f(0, -alpha, 1);
+ glVertex3f(1, -alpha, 2);
+ glVertex3f(1, -alpha, 1);
+
+ glNormal3f(-1.0f, 0.0f, 0.0f);
+ glVertex3f(0, alpha, 0);
+ glVertex3f(0, alpha, 1);
+ glVertex3f(0, -alpha, 1);
+ glVertex3f(0, -alpha, 0);
+
+
+ glNormal3f(0.0f, 0.0f, 1.0f);
+ glVertex3f(0, alpha, 1);
+ glVertex3f(1, alpha, 2);
+ glVertex3f(1, -alpha, 2);
+ glVertex3f(0, -alpha, 1);
+
+ glNormal3f(1.0f, 0.0f, 0.0f);
+ glVertex3f(1, alpha, 1);
+ glVertex3f(1, -alpha, 1);
+ glVertex3f(1, -alpha, 2);
+ glVertex3f(1, alpha, 2);
+
+ glNormal3f(0.0f, 0.0f, 1.0f);
+ glVertex3f(0, alpha, 0);
+ glVertex3f(0, -alpha, 0);
+ glVertex3f(1, -alpha, 1);
+ glVertex3f(1, alpha, 1);
+
+ glEnd();
+}
+
+/* All of the pieces have the same thickness so all of the Y values are the same */
+
+GLuint
+tangram_get_sm_tri_dl(int wire)
+{
+ GLuint triangle = glGenLists(1);
+ glNewList(triangle, GL_COMPILE);
+ glScalef(small_scale, small_scale, small_scale);
+ tri_45_90(wire);
+ glEndList();
+ return triangle;
+}
+
+GLuint
+tangram_get_lg_tri_dl(int wire)
+{
+ GLuint triangle = glGenLists(1);
+ glNewList(triangle, GL_COMPILE);
+ glScalef(large_scale, small_scale, large_scale);
+ tri_45_90(wire);
+ glEndList();
+ return triangle;
+}
+
+GLuint
+tangram_get_md_tri_dl(int wire)
+{
+ GLuint triangle = glGenLists(1);
+ glNewList(triangle, GL_COMPILE);
+ glScalef(medium_scale, small_scale, medium_scale);
+ tri_45_90(wire);
+ glEndList();
+ return triangle;
+}
+
+GLuint
+tangram_get_square_dl(int wire)
+{
+ GLuint square = glGenLists(1);
+ glNewList(square, GL_COMPILE);
+ glScalef(small_scale, small_scale, small_scale);
+ unit_cube(wire);
+ glEndList();
+ return square;
+}
+
+GLuint
+tangram_get_rhomboid_dl(int wire)
+{
+ GLuint rhomboid = glGenLists(1);
+ glNewList(rhomboid, GL_COMPILE);
+ glScalef(small_scale, small_scale, small_scale);
+ unit_rhomboid(wire);
+ glEndList();
+ return rhomboid;
+}
diff --git a/hacks/glx/tangram_shapes.h b/hacks/glx/tangram_shapes.h
new file mode 100644
index 0000000..254f8f3
--- /dev/null
+++ b/hacks/glx/tangram_shapes.h
@@ -0,0 +1,15 @@
+#ifndef TANGRAM_SHAPES_H
+#define TANGRAM_SHAPES_H
+
+/* get_sm_tri_dl - Get small triangle Display List */
+GLuint tangram_get_sm_tri_dl(int wire);
+/* get_lg_tri_dl - Get large triangle Display List */
+GLuint tangram_get_lg_tri_dl(int wire);
+/* get_md_tri_dl - Get medium triangle Display List */
+GLuint tangram_get_md_tri_dl(int wire);
+/* get_square_dl - Get square Display List */
+GLuint tangram_get_square_dl(int wire);
+/* get_rhomboid_dl - Get rhomboid Display List */
+GLuint tangram_get_rhomboid_dl(int wire);
+
+#endif
diff --git a/hacks/glx/teapot.c b/hacks/glx/teapot.c
new file mode 100644
index 0000000..c885d27
--- /dev/null
+++ b/hacks/glx/teapot.c
@@ -0,0 +1,285 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+(c) Copyright 1993, Silicon Graphics, Inc.
+
+ALL RIGHTS RESERVED
+
+Permission to use, copy, modify, and distribute this software
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that
+both the copyright notice and this permission notice appear in
+supporting documentation, and that the name of Silicon
+Graphics, Inc. not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission.
+
+THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
+"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
+EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
+ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
+INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
+SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
+NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
+OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+US Government Users Restricted Rights
+
+Use, duplication, or disclosure by the Government is subject to
+restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+(c)(1)(ii) of the Rights in Technical Data and Computer
+Software clause at DFARS 252.227-7013 and/or in similar or
+successor clauses in the FAR or the DOD or NASA FAR
+Supplement. Unpublished-- rights reserved under the copyright
+laws of the United States. Contractor/manufacturer is Silicon
+Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
+94039-7311.
+
+OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+*/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "teapot.h"
+
+#ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+#endif
+#ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#else
+# define HAVE_GLMAP
+#endif
+
+
+#ifdef HAVE_GLMAP
+
+/* Rim, body, lid, and bottom data must be reflected in x
+ and y; handle and spout data across the y axis only. */
+
+static long patchdata[][16] =
+{
+ /* rim */
+ {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15},
+ /* body */
+ {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27},
+ {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40},
+ /* lid */
+ {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
+ 101, 0, 1, 2, 3,},
+ {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117},
+ /* bottom */
+ {118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
+ 125, 120, 40, 39, 38, 37},
+ /* handle */
+ {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56},
+ {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 28, 65, 66, 67},
+ /* spout */
+ {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83},
+ {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95}
+};
+/* *INDENT-OFF* */
+
+static float cpdata[][3] =
+{
+ {0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0,
+ -0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},
+ {0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375,
+ 0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375,
+ 2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84,
+ 2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875},
+ {1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75,
+ 1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35},
+ {0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2,
+ 0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12,
+ 0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225},
+ {1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225},
+ {1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0,
+ -1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5,
+ -0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3,
+ 2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0,
+ 2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0,
+ 2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8},
+ {-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3,
+ -0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3,
+ 1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2,
+ -0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0,
+ 1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0,
+ 0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66,
+ 0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},
+ {2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7,
+ -0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0,
+ 2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},
+ {3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},
+ {3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},
+ {2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0,
+ 3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8,
+ 3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4,
+ -0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0,
+ 2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4,
+ 2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3,
+ 2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4},
+ {0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425,
+ -0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425,
+ 0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075},
+ {0.84, -1.5, 0.075}
+};
+
+static float tex[2][2][2] =
+{
+ { {0, 0},
+ {1, 0}},
+ { {0, 1},
+ {1, 1}}
+};
+
+
+int
+unit_teapot (int grid, int wire_p)
+{
+ GLenum type = wire_p ? GL_LINE : GL_FILL;
+ float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
+ long i, j, k, l;
+ int polys = 0;
+
+ glPushAttrib(GL_ENABLE_BIT | GL_EVAL_BIT);
+ glEnable(GL_AUTO_NORMAL);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_MAP2_VERTEX_3);
+ glEnable(GL_MAP2_TEXTURE_COORD_2);
+ glFrontFace (GL_CW);
+ glPushMatrix();
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ glScalef(0.5, 0.5, 0.5);
+ glTranslatef(0.0, 0.0, -1.5);
+ for (i = 0; i < 10; i++) {
+ for (j = 0; j < 4; j++) {
+ for (k = 0; k < 4; k++) {
+ for (l = 0; l < 3; l++) {
+ p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
+ q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 1)
+ q[j][k][l] *= -1.0;
+ if (i < 6) {
+ r[j][k][l] =
+ cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 0)
+ r[j][k][l] *= -1.0;
+ s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
+ if (l == 0)
+ s[j][k][l] *= -1.0;
+ if (l == 1)
+ s[j][k][l] *= -1.0;
+ }
+ }
+ }
+ }
+ glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2,
+ &tex[0][0][0]);
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &p[0][0][0]);
+ glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ polys += grid*grid*2;
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &q[0][0][0]);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ polys += grid*grid*2;
+ if (i < 6) {
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &r[0][0][0]);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ polys += grid*grid*2;
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &s[0][0][0]);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ polys += grid*grid*2;
+ }
+ }
+ glPopMatrix();
+ glPopAttrib();
+
+ return polys;
+}
+
+#else /* !HAVE_GLMAP */
+
+# include "normals.h"
+# include "teapot2.h"
+
+int
+unit_teapot (int grid, int wire_p)
+{
+ int polys = sizeof (teapot_triangles) / sizeof (*teapot_triangles) / 9;
+ int i;
+ const GLfloat *p = teapot_triangles;
+ GLfloat scale = 1 / 2.3;
+
+ glPushMatrix();
+ glScalef (scale, scale, scale);
+ glTranslatef (0, -1.25, 0);
+
+ if (wire_p)
+ {
+ glBegin (GL_LINES);
+ for (i = 0; i < polys; i++)
+ {
+ XYZ p1, p2, p3;
+ p1.x = *p++; p1.y = *p++; p1.z = *p++;
+ p2.x = *p++; p2.y = *p++; p2.z = *p++;
+ p3.x = *p++; p3.y = *p++; p3.z = *p++;
+ glVertex3f (p1.x, p1.y, p1.z); /* Draw 2 edges of each triangle */
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ i++; /* Skip every other triangle */
+ p += 9;
+ }
+ glEnd();
+ polys /= 2;
+ }
+ else
+ {
+ glFrontFace (GL_CCW);
+ glBegin (GL_TRIANGLES);
+ for (i = 0; i < polys; i++)
+ {
+ XYZ p1, p2, p3;
+ p1.x = *p++; p1.y = *p++; p1.z = *p++;
+ p2.x = *p++; p2.y = *p++; p2.z = *p++;
+ p3.x = *p++; p3.y = *p++; p3.z = *p++;
+ do_normal (p1.x, p1.y, p1.z,
+ p2.x, p2.y, p2.z,
+ p3.x, p3.y, p3.z);
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ }
+ glEnd();
+ }
+ glPopMatrix();
+
+ return polys;
+}
+
+#endif /* !HAVE_GLMAP */
diff --git a/hacks/glx/teapot.h b/hacks/glx/teapot.h
new file mode 100644
index 0000000..60b5fe5
--- /dev/null
+++ b/hacks/glx/teapot.h
@@ -0,0 +1,7 @@
+
+#ifndef __TEAPOT_H__
+#define __TEAPOT_H__
+
+extern int unit_teapot (int density, int wire_p);
+
+#endif /* __TEAPOT_H__ */
diff --git a/hacks/glx/teapot2.h b/hacks/glx/teapot2.h
new file mode 100644
index 0000000..c9d4def
--- /dev/null
+++ b/hacks/glx/teapot2.h
@@ -0,0 +1,6330 @@
+/* The Utah Teapot. Martin Newell, 1975.
+
+ Since GLUtesselator doesn't exist in the iOS build, we use these
+ triangles there instead of generating the teapot from Newell's
+ original Bezier patches, because I didn't feel like re-implementing
+ that code.
+ */
+
+static const GLfloat teapot_triangles[] = {
+ 1.368074,2.435437,-0.227403, 1.381968,2.4,-0.229712, 1.4,2.4,0,
+ 1.4,2.4,0, 1.385925,2.435437,0, 1.368074,2.435437,-0.227403,
+ 1.316296,2.435437,-0.442166, 1.329664,2.4,-0.446656, 1.381968,2.4,-0.229712,
+ 1.381968,2.4,-0.229712, 1.368074,2.435437,-0.227403, 1.316296,2.435437,-0.442166,
+ 1.233252,2.435437,-0.641628, 1.245776,2.4,-0.648144, 1.329664,2.4,-0.446656,
+ 1.329664,2.4,-0.446656, 1.316296,2.435437,-0.442166, 1.233252,2.435437,-0.641628,
+ 1.121601,2.435437,-0.823129, 1.132992,2.4,-0.831488, 1.245776,2.4,-0.648144,
+ 1.245776,2.4,-0.648144, 1.233252,2.435437,-0.641628, 1.121601,2.435437,-0.823129,
+ 0.984007,2.435437,-0.984007, 0.994,2.4,-0.994, 1.132992,2.4,-0.831488,
+ 1.132992,2.4,-0.831488, 1.121601,2.435437,-0.823129, 0.984007,2.435437,-0.984007,
+ 0.823129,2.435437,-1.121601, 0.831488,2.4,-1.132992, 0.994,2.4,-0.994,
+ 0.994,2.4,-0.994, 0.984007,2.435437,-0.984007, 0.823129,2.435437,-1.121601,
+ 0.641628,2.435437,-1.233252, 0.648144,2.4,-1.245776, 0.831488,2.4,-1.132992,
+ 0.831488,2.4,-1.132992, 0.823129,2.435437,-1.121601, 0.641628,2.435437,-1.233252,
+ 0.442166,2.435437,-1.316296, 0.446656,2.4,-1.329664, 0.648144,2.4,-1.245776,
+ 0.648144,2.4,-1.245776, 0.641628,2.435437,-1.233252, 0.442166,2.435437,-1.316296,
+ 0.227403,2.435437,-1.368074, 0.229712,2.4,-1.381968, 0.446656,2.4,-1.329664,
+ 0.446656,2.4,-1.329664, 0.442166,2.435437,-1.316296, 0.227403,2.435437,-1.368074,
+ 0,2.435437,-1.385925, 0,2.4,-1.4, 0.229712,2.4,-1.381968,
+ 0.229712,2.4,-1.381968, 0.227403,2.435437,-1.368074, 0,2.435437,-1.385925,
+ 1.36262,2.463,-0.226496, 1.368074,2.435437,-0.227403, 1.385925,2.435437,0,
+ 1.385925,2.435437,0, 1.3804,2.463,0, 1.36262,2.463,-0.226496,
+ 1.311049,2.463,-0.440403, 1.316296,2.435437,-0.442166, 1.368074,2.435437,-0.227403,
+ 1.368074,2.435437,-0.227403, 1.36262,2.463,-0.226496, 1.311049,2.463,-0.440403,
+ 1.228335,2.463,-0.63907, 1.233252,2.435437,-0.641628, 1.316296,2.435437,-0.442166,
+ 1.316296,2.435437,-0.442166, 1.311049,2.463,-0.440403, 1.228335,2.463,-0.63907,
+ 1.11713,2.463,-0.819847, 1.121601,2.435437,-0.823129, 1.233252,2.435437,-0.641628,
+ 1.233252,2.435437,-0.641628, 1.228335,2.463,-0.63907, 1.11713,2.463,-0.819847,
+ 0.980084,2.463,-0.980084, 0.984007,2.435437,-0.984007, 1.121601,2.435437,-0.823129,
+ 1.121601,2.435437,-0.823129, 1.11713,2.463,-0.819847, 0.980084,2.463,-0.980084,
+ 0.819847,2.463,-1.11713, 0.823129,2.435437,-1.121601, 0.984007,2.435437,-0.984007,
+ 0.984007,2.435437,-0.984007, 0.980084,2.463,-0.980084, 0.819847,2.463,-1.11713,
+ 0.63907,2.463,-1.228335, 0.641628,2.435437,-1.233252, 0.823129,2.435437,-1.121601,
+ 0.823129,2.435437,-1.121601, 0.819847,2.463,-1.11713, 0.63907,2.463,-1.228335,
+ 0.440403,2.463,-1.311049, 0.442166,2.435437,-1.316296, 0.641628,2.435437,-1.233252,
+ 0.641628,2.435437,-1.233252, 0.63907,2.463,-1.228335, 0.440403,2.463,-1.311049,
+ 0.226496,2.463,-1.36262, 0.227403,2.435437,-1.368074, 0.442166,2.435437,-1.316296,
+ 0.442166,2.435437,-1.316296, 0.440403,2.463,-1.311049, 0.226496,2.463,-1.36262,
+ 0,2.463,-1.3804, 0,2.435437,-1.385925, 0.227403,2.435437,-1.368074,
+ 0.227403,2.435437,-1.368074, 0.226496,2.463,-1.36262, 0,2.463,-1.3804,
+ 1.364422,2.482687,-0.226795, 1.36262,2.463,-0.226496, 1.3804,2.463,0,
+ 1.3804,2.463,0, 1.382225,2.482687,0, 1.364422,2.482687,-0.226795,
+ 1.312782,2.482687,-0.440985, 1.311049,2.463,-0.440403, 1.36262,2.463,-0.226496,
+ 1.36262,2.463,-0.226496, 1.364422,2.482687,-0.226795, 1.312782,2.482687,-0.440985,
+ 1.229959,2.482687,-0.639915, 1.228335,2.463,-0.63907, 1.311049,2.463,-0.440403,
+ 1.311049,2.463,-0.440403, 1.312782,2.482687,-0.440985, 1.229959,2.482687,-0.639915,
+ 1.118607,2.482687,-0.820931, 1.11713,2.463,-0.819847, 1.228335,2.463,-0.63907,
+ 1.228335,2.463,-0.63907, 1.229959,2.482687,-0.639915, 1.118607,2.482687,-0.820931,
+ 0.98138,2.482687,-0.98138, 0.980084,2.463,-0.980084, 1.11713,2.463,-0.819847,
+ 1.11713,2.463,-0.819847, 1.118607,2.482687,-0.820931, 0.98138,2.482687,-0.98138,
+ 0.820931,2.482687,-1.118607, 0.819847,2.463,-1.11713, 0.980084,2.463,-0.980084,
+ 0.980084,2.463,-0.980084, 0.98138,2.482687,-0.98138, 0.820931,2.482687,-1.118607,
+ 0.639915,2.482687,-1.229959, 0.63907,2.463,-1.228335, 0.819847,2.463,-1.11713,
+ 0.819847,2.463,-1.11713, 0.820931,2.482687,-1.118607, 0.639915,2.482687,-1.229959,
+ 0.440985,2.482687,-1.312782, 0.440403,2.463,-1.311049, 0.63907,2.463,-1.228335,
+ 0.63907,2.463,-1.228335, 0.639915,2.482687,-1.229959, 0.440985,2.482687,-1.312782,
+ 0.226795,2.482687,-1.364422, 0.226496,2.463,-1.36262, 0.440403,2.463,-1.311049,
+ 0.440403,2.463,-1.311049, 0.440985,2.482687,-1.312782, 0.226795,2.482687,-1.364422,
+ 0,2.482687,-1.382225, 0,2.463,-1.3804, 0.226496,2.463,-1.36262,
+ 0.226496,2.463,-1.36262, 0.226795,2.482687,-1.364422, 0,2.482687,-1.382225,
+ 1.372294,2.4945,-0.228104, 1.364422,2.482687,-0.226795, 1.382225,2.482687,0,
+ 1.382225,2.482687,0, 1.3902,2.4945,0, 1.372294,2.4945,-0.228104,
+ 1.320356,2.4945,-0.443529, 1.312782,2.482687,-0.440985, 1.364422,2.482687,-0.226795,
+ 1.364422,2.482687,-0.226795, 1.372294,2.4945,-0.228104, 1.320356,2.4945,-0.443529,
+ 1.237056,2.4945,-0.643607, 1.229959,2.482687,-0.639915, 1.312782,2.482687,-0.440985,
+ 1.312782,2.482687,-0.440985, 1.320356,2.4945,-0.443529, 1.237056,2.4945,-0.643607,
+ 1.125061,2.4945,-0.825668, 1.118607,2.482687,-0.820931, 1.229959,2.482687,-0.639915,
+ 1.229959,2.482687,-0.639915, 1.237056,2.4945,-0.643607, 1.125061,2.4945,-0.825668,
+ 0.987042,2.4945,-0.987042, 0.98138,2.482687,-0.98138, 1.118607,2.482687,-0.820931,
+ 1.118607,2.482687,-0.820931, 1.125061,2.4945,-0.825668, 0.987042,2.4945,-0.987042,
+ 0.825668,2.4945,-1.125061, 0.820931,2.482687,-1.118607, 0.98138,2.482687,-0.98138,
+ 0.98138,2.482687,-0.98138, 0.987042,2.4945,-0.987042, 0.825668,2.4945,-1.125061,
+ 0.643607,2.4945,-1.237056, 0.639915,2.482687,-1.229959, 0.820931,2.482687,-1.118607,
+ 0.820931,2.482687,-1.118607, 0.825668,2.4945,-1.125061, 0.643607,2.4945,-1.237056,
+ 0.443529,2.4945,-1.320356, 0.440985,2.482687,-1.312782, 0.639915,2.482687,-1.229959,
+ 0.639915,2.482687,-1.229959, 0.643607,2.4945,-1.237056, 0.443529,2.4945,-1.320356,
+ 0.228104,2.4945,-1.372294, 0.226795,2.482687,-1.364422, 0.440985,2.482687,-1.312782,
+ 0.440985,2.482687,-1.312782, 0.443529,2.4945,-1.320356, 0.228104,2.4945,-1.372294,
+ 0,2.4945,-1.3902, 0,2.482687,-1.382225, 0.226795,2.482687,-1.364422,
+ 0.226795,2.482687,-1.364422, 0.228104,2.4945,-1.372294, 0,2.4945,-1.3902,
+ 1.385053,2.498438,-0.230225, 1.372294,2.4945,-0.228104, 1.3902,2.4945,0,
+ 1.3902,2.4945,0, 1.403125,2.498438,0, 1.385053,2.498438,-0.230225,
+ 1.332632,2.498438,-0.447653, 1.320356,2.4945,-0.443529, 1.372294,2.4945,-0.228104,
+ 1.372294,2.4945,-0.228104, 1.385053,2.498438,-0.230225, 1.332632,2.498438,-0.447653,
+ 1.248557,2.498438,-0.649591, 1.237056,2.4945,-0.643607, 1.320356,2.4945,-0.443529,
+ 1.320356,2.4945,-0.443529, 1.332632,2.498438,-0.447653, 1.248557,2.498438,-0.649591,
+ 1.135521,2.498438,-0.833344, 1.125061,2.4945,-0.825668, 1.237056,2.4945,-0.643607,
+ 1.237056,2.4945,-0.643607, 1.248557,2.498438,-0.649591, 1.135521,2.498438,-0.833344,
+ 0.996219,2.498438,-0.996219, 0.987042,2.4945,-0.987042, 1.125061,2.4945,-0.825668,
+ 1.125061,2.4945,-0.825668, 1.135521,2.498438,-0.833344, 0.996219,2.498438,-0.996219,
+ 0.833344,2.498438,-1.135521, 0.825668,2.4945,-1.125061, 0.987042,2.4945,-0.987042,
+ 0.987042,2.4945,-0.987042, 0.996219,2.498438,-0.996219, 0.833344,2.498438,-1.135521,
+ 0.649591,2.498438,-1.248557, 0.643607,2.4945,-1.237056, 0.825668,2.4945,-1.125061,
+ 0.825668,2.4945,-1.125061, 0.833344,2.498438,-1.135521, 0.649591,2.498438,-1.248557,
+ 0.447653,2.498438,-1.332632, 0.443529,2.4945,-1.320356, 0.643607,2.4945,-1.237056,
+ 0.643607,2.4945,-1.237056, 0.649591,2.498438,-1.248557, 0.447653,2.498438,-1.332632,
+ 0.230225,2.498438,-1.385053, 0.228104,2.4945,-1.372294, 0.443529,2.4945,-1.320356,
+ 0.443529,2.4945,-1.320356, 0.447653,2.498438,-1.332632, 0.230225,2.498438,-1.385053,
+ 0,2.498438,-1.403125, 0,2.4945,-1.3902, 0.228104,2.4945,-1.372294,
+ 0.228104,2.4945,-1.372294, 0.230225,2.498438,-1.385053, 0,2.498438,-1.403125,
+ 1.401513,2.4945,-0.232961, 1.385053,2.498438,-0.230225, 1.403125,2.498438,0,
+ 1.403125,2.498438,0, 1.4198,2.4945,0, 1.401513,2.4945,-0.232961,
+ 1.348469,2.4945,-0.452973, 1.332632,2.498438,-0.447653, 1.385053,2.498438,-0.230225,
+ 1.385053,2.498438,-0.230225, 1.401513,2.4945,-0.232961, 1.348469,2.4945,-0.452973,
+ 1.263395,2.4945,-0.657311, 1.248557,2.498438,-0.649591, 1.332632,2.498438,-0.447653,
+ 1.332632,2.498438,-0.447653, 1.348469,2.4945,-0.452973, 1.263395,2.4945,-0.657311,
+ 1.149016,2.4945,-0.843248, 1.135521,2.498438,-0.833344, 1.248557,2.498438,-0.649591,
+ 1.248557,2.498438,-0.649591, 1.263395,2.4945,-0.657311, 1.149016,2.4945,-0.843248,
+ 1.008058,2.4945,-1.008058, 0.996219,2.498438,-0.996219, 1.135521,2.498438,-0.833344,
+ 1.135521,2.498438,-0.833344, 1.149016,2.4945,-0.843248, 1.008058,2.4945,-1.008058,
+ 0.843248,2.4945,-1.149016, 0.833344,2.498438,-1.135521, 0.996219,2.498438,-0.996219,
+ 0.996219,2.498438,-0.996219, 1.008058,2.4945,-1.008058, 0.843248,2.4945,-1.149016,
+ 0.657311,2.4945,-1.263395, 0.649591,2.498438,-1.248557, 0.833344,2.498438,-1.135521,
+ 0.833344,2.498438,-1.135521, 0.843248,2.4945,-1.149016, 0.657311,2.4945,-1.263395,
+ 0.452973,2.4945,-1.348469, 0.447653,2.498438,-1.332632, 0.649591,2.498438,-1.248557,
+ 0.649591,2.498438,-1.248557, 0.657311,2.4945,-1.263395, 0.452973,2.4945,-1.348469,
+ 0.232961,2.4945,-1.401513, 0.230225,2.498438,-1.385053, 0.447653,2.498438,-1.332632,
+ 0.447653,2.498438,-1.332632, 0.452973,2.4945,-1.348469, 0.232961,2.4945,-1.401513,
+ 0,2.4945,-1.4198, 0,2.498438,-1.403125, 0.230225,2.498438,-1.385053,
+ 0.230225,2.498438,-1.385053, 0.232961,2.4945,-1.401513, 0,2.4945,-1.4198,
+ 1.42049,2.482687,-0.236115, 1.401513,2.4945,-0.232961, 1.4198,2.4945,0,
+ 1.4198,2.4945,0, 1.439025,2.482687,0, 1.42049,2.482687,-0.236115,
+ 1.366728,2.482687,-0.459107, 1.348469,2.4945,-0.452973, 1.401513,2.4945,-0.232961,
+ 1.401513,2.4945,-0.232961, 1.42049,2.482687,-0.236115, 1.366728,2.482687,-0.459107,
+ 1.280502,2.482687,-0.666211, 1.263395,2.4945,-0.657311, 1.348469,2.4945,-0.452973,
+ 1.348469,2.4945,-0.452973, 1.366728,2.482687,-0.459107, 1.280502,2.482687,-0.666211,
+ 1.164574,2.482687,-0.854666, 1.149016,2.4945,-0.843248, 1.263395,2.4945,-0.657311,
+ 1.263395,2.4945,-0.657311, 1.280502,2.482687,-0.666211, 1.164574,2.482687,-0.854666,
+ 1.021708,2.482687,-1.021708, 1.008058,2.4945,-1.008058, 1.149016,2.4945,-0.843248,
+ 1.149016,2.4945,-0.843248, 1.164574,2.482687,-0.854666, 1.021708,2.482687,-1.021708,
+ 0.854666,2.482687,-1.164574, 0.843248,2.4945,-1.149016, 1.008058,2.4945,-1.008058,
+ 1.008058,2.4945,-1.008058, 1.021708,2.482687,-1.021708, 0.854666,2.482687,-1.164574,
+ 0.666211,2.482687,-1.280502, 0.657311,2.4945,-1.263395, 0.843248,2.4945,-1.149016,
+ 0.843248,2.4945,-1.149016, 0.854666,2.482687,-1.164574, 0.666211,2.482687,-1.280502,
+ 0.459107,2.482687,-1.366728, 0.452973,2.4945,-1.348469, 0.657311,2.4945,-1.263395,
+ 0.657311,2.4945,-1.263395, 0.666211,2.482687,-1.280502, 0.459107,2.482687,-1.366728,
+ 0.236115,2.482687,-1.42049, 0.232961,2.4945,-1.401513, 0.452973,2.4945,-1.348469,
+ 0.452973,2.4945,-1.348469, 0.459107,2.482687,-1.366728, 0.236115,2.482687,-1.42049,
+ 0,2.482687,-1.439025, 0,2.4945,-1.4198, 0.232961,2.4945,-1.401513,
+ 0.232961,2.4945,-1.401513, 0.236115,2.482687,-1.42049, 0,2.482687,-1.439025,
+ 1.4408,2.463,-0.239491, 1.42049,2.482687,-0.236115, 1.439025,2.482687,0,
+ 1.439025,2.482687,0, 1.4596,2.463,0, 1.4408,2.463,-0.239491,
+ 1.38627,2.463,-0.465671, 1.366728,2.482687,-0.459107, 1.42049,2.482687,-0.236115,
+ 1.42049,2.482687,-0.236115, 1.4408,2.463,-0.239491, 1.38627,2.463,-0.465671,
+ 1.29881,2.463,-0.675736, 1.280502,2.482687,-0.666211, 1.366728,2.482687,-0.459107,
+ 1.366728,2.482687,-0.459107, 1.38627,2.463,-0.465671, 1.29881,2.463,-0.675736,
+ 1.181225,2.463,-0.866886, 1.164574,2.482687,-0.854666, 1.280502,2.482687,-0.666211,
+ 1.280502,2.482687,-0.666211, 1.29881,2.463,-0.675736, 1.181225,2.463,-0.866886,
+ 1.036316,2.463,-1.036316, 1.021708,2.482687,-1.021708, 1.164574,2.482687,-0.854666,
+ 1.164574,2.482687,-0.854666, 1.181225,2.463,-0.866886, 1.036316,2.463,-1.036316,
+ 0.866886,2.463,-1.181225, 0.854666,2.482687,-1.164574, 1.021708,2.482687,-1.021708,
+ 1.021708,2.482687,-1.021708, 1.036316,2.463,-1.036316, 0.866886,2.463,-1.181225,
+ 0.675736,2.463,-1.29881, 0.666211,2.482687,-1.280502, 0.854666,2.482687,-1.164574,
+ 0.854666,2.482687,-1.164574, 0.866886,2.463,-1.181225, 0.675736,2.463,-1.29881,
+ 0.465671,2.463,-1.38627, 0.459107,2.482687,-1.366728, 0.666211,2.482687,-1.280502,
+ 0.666211,2.482687,-1.280502, 0.675736,2.463,-1.29881, 0.465671,2.463,-1.38627,
+ 0.239491,2.463,-1.4408, 0.236115,2.482687,-1.42049, 0.459107,2.482687,-1.366728,
+ 0.459107,2.482687,-1.366728, 0.465671,2.463,-1.38627, 0.239491,2.463,-1.4408,
+ 0,2.463,-1.4596, 0,2.482687,-1.439025, 0.236115,2.482687,-1.42049,
+ 0.236115,2.482687,-1.42049, 0.239491,2.463,-1.4408, 0,2.463,-1.4596,
+ 1.461258,2.435437,-0.242892, 1.4408,2.463,-0.239491, 1.4596,2.463,0,
+ 1.4596,2.463,0, 1.480325,2.435437,0, 1.461258,2.435437,-0.242892,
+ 1.405953,2.435437,-0.472283, 1.38627,2.463,-0.465671, 1.4408,2.463,-0.239491,
+ 1.4408,2.463,-0.239491, 1.461258,2.435437,-0.242892, 1.405953,2.435437,-0.472283,
+ 1.317252,2.435437,-0.685331, 1.29881,2.463,-0.675736, 1.38627,2.463,-0.465671,
+ 1.38627,2.463,-0.465671, 1.405953,2.435437,-0.472283, 1.317252,2.435437,-0.685331,
+ 1.197997,2.435437,-0.879195, 1.181225,2.463,-0.866886, 1.29881,2.463,-0.675736,
+ 1.29881,2.463,-0.675736, 1.317252,2.435437,-0.685331, 1.197997,2.435437,-0.879195,
+ 1.051031,2.435437,-1.051031, 1.036316,2.463,-1.036316, 1.181225,2.463,-0.866886,
+ 1.181225,2.463,-0.866886, 1.197997,2.435437,-0.879195, 1.051031,2.435437,-1.051031,
+ 0.879195,2.435437,-1.197997, 0.866886,2.463,-1.181225, 1.036316,2.463,-1.036316,
+ 1.036316,2.463,-1.036316, 1.051031,2.435437,-1.051031, 0.879195,2.435437,-1.197997,
+ 0.685331,2.435437,-1.317252, 0.675736,2.463,-1.29881, 0.866886,2.463,-1.181225,
+ 0.866886,2.463,-1.181225, 0.879195,2.435437,-1.197997, 0.685331,2.435437,-1.317252,
+ 0.472283,2.435437,-1.405953, 0.465671,2.463,-1.38627, 0.675736,2.463,-1.29881,
+ 0.675736,2.463,-1.29881, 0.685331,2.435437,-1.317252, 0.472283,2.435437,-1.405953,
+ 0.242892,2.435437,-1.461258, 0.239491,2.463,-1.4408, 0.465671,2.463,-1.38627,
+ 0.465671,2.463,-1.38627, 0.472283,2.435437,-1.405953, 0.242892,2.435437,-1.461258,
+ 0,2.435437,-1.480325, 0,2.463,-1.4596, 0.239491,2.463,-1.4408,
+ 0.239491,2.463,-1.4408, 0.242892,2.435437,-1.461258, 0,2.435437,-1.480325,
+ 1.48068,2.4,-0.24612, 1.461258,2.435437,-0.242892, 1.480325,2.435437,0,
+ 1.480325,2.435437,0, 1.5,2.4,0, 1.48068,2.4,-0.24612,
+ 1.42464,2.4,-0.47856, 1.405953,2.435437,-0.472283, 1.461258,2.435437,-0.242892,
+ 1.461258,2.435437,-0.242892, 1.48068,2.4,-0.24612, 1.42464,2.4,-0.47856,
+ 1.33476,2.4,-0.69444, 1.317252,2.435437,-0.685331, 1.405953,2.435437,-0.472283,
+ 1.405953,2.435437,-0.472283, 1.42464,2.4,-0.47856, 1.33476,2.4,-0.69444,
+ 1.21392,2.4,-0.89088, 1.197997,2.435437,-0.879195, 1.317252,2.435437,-0.685331,
+ 1.317252,2.435437,-0.685331, 1.33476,2.4,-0.69444, 1.21392,2.4,-0.89088,
+ 1.065,2.4,-1.065, 1.051031,2.435437,-1.051031, 1.197997,2.435437,-0.879195,
+ 1.197997,2.435437,-0.879195, 1.21392,2.4,-0.89088, 1.065,2.4,-1.065,
+ 0.89088,2.4,-1.21392, 0.879195,2.435437,-1.197997, 1.051031,2.435437,-1.051031,
+ 1.051031,2.435437,-1.051031, 1.065,2.4,-1.065, 0.89088,2.4,-1.21392,
+ 0.69444,2.4,-1.33476, 0.685331,2.435437,-1.317252, 0.879195,2.435437,-1.197997,
+ 0.879195,2.435437,-1.197997, 0.89088,2.4,-1.21392, 0.69444,2.4,-1.33476,
+ 0.47856,2.4,-1.42464, 0.472283,2.435437,-1.405953, 0.685331,2.435437,-1.317252,
+ 0.685331,2.435437,-1.317252, 0.69444,2.4,-1.33476, 0.47856,2.4,-1.42464,
+ 0.24612,2.4,-1.48068, 0.242892,2.435437,-1.461258, 0.472283,2.435437,-1.405953,
+ 0.472283,2.435437,-1.405953, 0.47856,2.4,-1.42464, 0.24612,2.4,-1.48068,
+ 0,2.4,-1.5, 0,2.435437,-1.480325, 0.242892,2.435437,-1.461258,
+ 0.242892,2.435437,-1.461258, 0.24612,2.4,-1.48068, 0,2.4,-1.5,
+ -0.227403,2.435437,-1.368074, -0.229712,2.4,-1.381968, 0,2.4,-1.4,
+ 0,2.4,-1.4, 0,2.435437,-1.385925, -0.227403,2.435437,-1.368074,
+ -0.442166,2.435437,-1.316296, -0.446656,2.4,-1.329664, -0.229712,2.4,-1.381968,
+ -0.229712,2.4,-1.381968, -0.227403,2.435437,-1.368074, -0.442166,2.435437,-1.316296,
+ -0.641628,2.435437,-1.233252, -0.648144,2.4,-1.245776, -0.446656,2.4,-1.329664,
+ -0.446656,2.4,-1.329664, -0.442166,2.435437,-1.316296, -0.641628,2.435437,-1.233252,
+ -0.823129,2.435437,-1.121601, -0.831488,2.4,-1.132992, -0.648144,2.4,-1.245776,
+ -0.648144,2.4,-1.245776, -0.641628,2.435437,-1.233252, -0.823129,2.435437,-1.121601,
+ -0.984007,2.435437,-0.984007, -0.994,2.4,-0.994, -0.831488,2.4,-1.132992,
+ -0.831488,2.4,-1.132992, -0.823129,2.435437,-1.121601, -0.984007,2.435437,-0.984007,
+ -1.121601,2.435437,-0.823129, -1.132992,2.4,-0.831488, -0.994,2.4,-0.994,
+ -0.994,2.4,-0.994, -0.984007,2.435437,-0.984007, -1.121601,2.435437,-0.823129,
+ -1.233252,2.435437,-0.641628, -1.245776,2.4,-0.648144, -1.132992,2.4,-0.831488,
+ -1.132992,2.4,-0.831488, -1.121601,2.435437,-0.823129, -1.233252,2.435437,-0.641628,
+ -1.316296,2.435437,-0.442166, -1.329664,2.4,-0.446656, -1.245776,2.4,-0.648144,
+ -1.245776,2.4,-0.648144, -1.233252,2.435437,-0.641628, -1.316296,2.435437,-0.442166,
+ -1.368074,2.435437,-0.227403, -1.381968,2.4,-0.229712, -1.329664,2.4,-0.446656,
+ -1.329664,2.4,-0.446656, -1.316296,2.435437,-0.442166, -1.368074,2.435437,-0.227403,
+ -1.385925,2.435437,0, -1.4,2.4,0, -1.381968,2.4,-0.229712,
+ -1.381968,2.4,-0.229712, -1.368074,2.435437,-0.227403, -1.385925,2.435437,0,
+ -0.226496,2.463,-1.36262, -0.227403,2.435437,-1.368074, 0,2.435437,-1.385925,
+ 0,2.435437,-1.385925, 0,2.463,-1.3804, -0.226496,2.463,-1.36262,
+ -0.440403,2.463,-1.311049, -0.442166,2.435437,-1.316296, -0.227403,2.435437,-1.368074,
+ -0.227403,2.435437,-1.368074, -0.226496,2.463,-1.36262, -0.440403,2.463,-1.311049,
+ -0.63907,2.463,-1.228335, -0.641628,2.435437,-1.233252, -0.442166,2.435437,-1.316296,
+ -0.442166,2.435437,-1.316296, -0.440403,2.463,-1.311049, -0.63907,2.463,-1.228335,
+ -0.819847,2.463,-1.11713, -0.823129,2.435437,-1.121601, -0.641628,2.435437,-1.233252,
+ -0.641628,2.435437,-1.233252, -0.63907,2.463,-1.228335, -0.819847,2.463,-1.11713,
+ -0.980084,2.463,-0.980084, -0.984007,2.435437,-0.984007, -0.823129,2.435437,-1.121601,
+ -0.823129,2.435437,-1.121601, -0.819847,2.463,-1.11713, -0.980084,2.463,-0.980084,
+ -1.11713,2.463,-0.819847, -1.121601,2.435437,-0.823129, -0.984007,2.435437,-0.984007,
+ -0.984007,2.435437,-0.984007, -0.980084,2.463,-0.980084, -1.11713,2.463,-0.819847,
+ -1.228335,2.463,-0.63907, -1.233252,2.435437,-0.641628, -1.121601,2.435437,-0.823129,
+ -1.121601,2.435437,-0.823129, -1.11713,2.463,-0.819847, -1.228335,2.463,-0.63907,
+ -1.311049,2.463,-0.440403, -1.316296,2.435437,-0.442166, -1.233252,2.435437,-0.641628,
+ -1.233252,2.435437,-0.641628, -1.228335,2.463,-0.63907, -1.311049,2.463,-0.440403,
+ -1.36262,2.463,-0.226496, -1.368074,2.435437,-0.227403, -1.316296,2.435437,-0.442166,
+ -1.316296,2.435437,-0.442166, -1.311049,2.463,-0.440403, -1.36262,2.463,-0.226496,
+ -1.3804,2.463,0, -1.385925,2.435437,0, -1.368074,2.435437,-0.227403,
+ -1.368074,2.435437,-0.227403, -1.36262,2.463,-0.226496, -1.3804,2.463,0,
+ -0.226795,2.482687,-1.364422, -0.226496,2.463,-1.36262, 0,2.463,-1.3804,
+ 0,2.463,-1.3804, 0,2.482687,-1.382225, -0.226795,2.482687,-1.364422,
+ -0.440985,2.482687,-1.312782, -0.440403,2.463,-1.311049, -0.226496,2.463,-1.36262,
+ -0.226496,2.463,-1.36262, -0.226795,2.482687,-1.364422, -0.440985,2.482687,-1.312782,
+ -0.639915,2.482687,-1.229959, -0.63907,2.463,-1.228335, -0.440403,2.463,-1.311049,
+ -0.440403,2.463,-1.311049, -0.440985,2.482687,-1.312782, -0.639915,2.482687,-1.229959,
+ -0.820931,2.482687,-1.118607, -0.819847,2.463,-1.11713, -0.63907,2.463,-1.228335,
+ -0.63907,2.463,-1.228335, -0.639915,2.482687,-1.229959, -0.820931,2.482687,-1.118607,
+ -0.98138,2.482687,-0.98138, -0.980084,2.463,-0.980084, -0.819847,2.463,-1.11713,
+ -0.819847,2.463,-1.11713, -0.820931,2.482687,-1.118607, -0.98138,2.482687,-0.98138,
+ -1.118607,2.482687,-0.820931, -1.11713,2.463,-0.819847, -0.980084,2.463,-0.980084,
+ -0.980084,2.463,-0.980084, -0.98138,2.482687,-0.98138, -1.118607,2.482687,-0.820931,
+ -1.229959,2.482687,-0.639915, -1.228335,2.463,-0.63907, -1.11713,2.463,-0.819847,
+ -1.11713,2.463,-0.819847, -1.118607,2.482687,-0.820931, -1.229959,2.482687,-0.639915,
+ -1.312782,2.482687,-0.440985, -1.311049,2.463,-0.440403, -1.228335,2.463,-0.63907,
+ -1.228335,2.463,-0.63907, -1.229959,2.482687,-0.639915, -1.312782,2.482687,-0.440985,
+ -1.364422,2.482687,-0.226795, -1.36262,2.463,-0.226496, -1.311049,2.463,-0.440403,
+ -1.311049,2.463,-0.440403, -1.312782,2.482687,-0.440985, -1.364422,2.482687,-0.226795,
+ -1.382225,2.482687,0, -1.3804,2.463,0, -1.36262,2.463,-0.226496,
+ -1.36262,2.463,-0.226496, -1.364422,2.482687,-0.226795, -1.382225,2.482687,0,
+ -0.228104,2.4945,-1.372294, -0.226795,2.482687,-1.364422, 0,2.482687,-1.382225,
+ 0,2.482687,-1.382225, 0,2.4945,-1.3902, -0.228104,2.4945,-1.372294,
+ -0.443529,2.4945,-1.320356, -0.440985,2.482687,-1.312782, -0.226795,2.482687,-1.364422,
+ -0.226795,2.482687,-1.364422, -0.228104,2.4945,-1.372294, -0.443529,2.4945,-1.320356,
+ -0.643607,2.4945,-1.237056, -0.639915,2.482687,-1.229959, -0.440985,2.482687,-1.312782,
+ -0.440985,2.482687,-1.312782, -0.443529,2.4945,-1.320356, -0.643607,2.4945,-1.237056,
+ -0.825668,2.4945,-1.125061, -0.820931,2.482687,-1.118607, -0.639915,2.482687,-1.229959,
+ -0.639915,2.482687,-1.229959, -0.643607,2.4945,-1.237056, -0.825668,2.4945,-1.125061,
+ -0.987042,2.4945,-0.987042, -0.98138,2.482687,-0.98138, -0.820931,2.482687,-1.118607,
+ -0.820931,2.482687,-1.118607, -0.825668,2.4945,-1.125061, -0.987042,2.4945,-0.987042,
+ -1.125061,2.4945,-0.825668, -1.118607,2.482687,-0.820931, -0.98138,2.482687,-0.98138,
+ -0.98138,2.482687,-0.98138, -0.987042,2.4945,-0.987042, -1.125061,2.4945,-0.825668,
+ -1.237056,2.4945,-0.643607, -1.229959,2.482687,-0.639915, -1.118607,2.482687,-0.820931,
+ -1.118607,2.482687,-0.820931, -1.125061,2.4945,-0.825668, -1.237056,2.4945,-0.643607,
+ -1.320356,2.4945,-0.443529, -1.312782,2.482687,-0.440985, -1.229959,2.482687,-0.639915,
+ -1.229959,2.482687,-0.639915, -1.237056,2.4945,-0.643607, -1.320356,2.4945,-0.443529,
+ -1.372294,2.4945,-0.228104, -1.364422,2.482687,-0.226795, -1.312782,2.482687,-0.440985,
+ -1.312782,2.482687,-0.440985, -1.320356,2.4945,-0.443529, -1.372294,2.4945,-0.228104,
+ -1.3902,2.4945,0, -1.382225,2.482687,0, -1.364422,2.482687,-0.226795,
+ -1.364422,2.482687,-0.226795, -1.372294,2.4945,-0.228104, -1.3902,2.4945,0,
+ -0.230225,2.498438,-1.385053, -0.228104,2.4945,-1.372294, 0,2.4945,-1.3902,
+ 0,2.4945,-1.3902, 0,2.498438,-1.403125, -0.230225,2.498438,-1.385053,
+ -0.447653,2.498438,-1.332632, -0.443529,2.4945,-1.320356, -0.228104,2.4945,-1.372294,
+ -0.228104,2.4945,-1.372294, -0.230225,2.498438,-1.385053, -0.447653,2.498438,-1.332632,
+ -0.649591,2.498438,-1.248557, -0.643607,2.4945,-1.237056, -0.443529,2.4945,-1.320356,
+ -0.443529,2.4945,-1.320356, -0.447653,2.498438,-1.332632, -0.649591,2.498438,-1.248557,
+ -0.833344,2.498438,-1.135521, -0.825668,2.4945,-1.125061, -0.643607,2.4945,-1.237056,
+ -0.643607,2.4945,-1.237056, -0.649591,2.498438,-1.248557, -0.833344,2.498438,-1.135521,
+ -0.996219,2.498438,-0.996219, -0.987042,2.4945,-0.987042, -0.825668,2.4945,-1.125061,
+ -0.825668,2.4945,-1.125061, -0.833344,2.498438,-1.135521, -0.996219,2.498438,-0.996219,
+ -1.135521,2.498438,-0.833344, -1.125061,2.4945,-0.825668, -0.987042,2.4945,-0.987042,
+ -0.987042,2.4945,-0.987042, -0.996219,2.498438,-0.996219, -1.135521,2.498438,-0.833344,
+ -1.248557,2.498438,-0.649591, -1.237056,2.4945,-0.643607, -1.125061,2.4945,-0.825668,
+ -1.125061,2.4945,-0.825668, -1.135521,2.498438,-0.833344, -1.248557,2.498438,-0.649591,
+ -1.332632,2.498438,-0.447653, -1.320356,2.4945,-0.443529, -1.237056,2.4945,-0.643607,
+ -1.237056,2.4945,-0.643607, -1.248557,2.498438,-0.649591, -1.332632,2.498438,-0.447653,
+ -1.385053,2.498438,-0.230225, -1.372294,2.4945,-0.228104, -1.320356,2.4945,-0.443529,
+ -1.320356,2.4945,-0.443529, -1.332632,2.498438,-0.447653, -1.385053,2.498438,-0.230225,
+ -1.403125,2.498438,0, -1.3902,2.4945,0, -1.372294,2.4945,-0.228104,
+ -1.372294,2.4945,-0.228104, -1.385053,2.498438,-0.230225, -1.403125,2.498438,0,
+ -0.232961,2.4945,-1.401513, -0.230225,2.498438,-1.385053, 0,2.498438,-1.403125,
+ 0,2.498438,-1.403125, 0,2.4945,-1.4198, -0.232961,2.4945,-1.401513,
+ -0.452973,2.4945,-1.348469, -0.447653,2.498438,-1.332632, -0.230225,2.498438,-1.385053,
+ -0.230225,2.498438,-1.385053, -0.232961,2.4945,-1.401513, -0.452973,2.4945,-1.348469,
+ -0.657311,2.4945,-1.263395, -0.649591,2.498438,-1.248557, -0.447653,2.498438,-1.332632,
+ -0.447653,2.498438,-1.332632, -0.452973,2.4945,-1.348469, -0.657311,2.4945,-1.263395,
+ -0.843248,2.4945,-1.149016, -0.833344,2.498438,-1.135521, -0.649591,2.498438,-1.248557,
+ -0.649591,2.498438,-1.248557, -0.657311,2.4945,-1.263395, -0.843248,2.4945,-1.149016,
+ -1.008058,2.4945,-1.008058, -0.996219,2.498438,-0.996219, -0.833344,2.498438,-1.135521,
+ -0.833344,2.498438,-1.135521, -0.843248,2.4945,-1.149016, -1.008058,2.4945,-1.008058,
+ -1.149016,2.4945,-0.843248, -1.135521,2.498438,-0.833344, -0.996219,2.498438,-0.996219,
+ -0.996219,2.498438,-0.996219, -1.008058,2.4945,-1.008058, -1.149016,2.4945,-0.843248,
+ -1.263395,2.4945,-0.657311, -1.248557,2.498438,-0.649591, -1.135521,2.498438,-0.833344,
+ -1.135521,2.498438,-0.833344, -1.149016,2.4945,-0.843248, -1.263395,2.4945,-0.657311,
+ -1.348469,2.4945,-0.452973, -1.332632,2.498438,-0.447653, -1.248557,2.498438,-0.649591,
+ -1.248557,2.498438,-0.649591, -1.263395,2.4945,-0.657311, -1.348469,2.4945,-0.452973,
+ -1.401513,2.4945,-0.232961, -1.385053,2.498438,-0.230225, -1.332632,2.498438,-0.447653,
+ -1.332632,2.498438,-0.447653, -1.348469,2.4945,-0.452973, -1.401513,2.4945,-0.232961,
+ -1.4198,2.4945,0, -1.403125,2.498438,0, -1.385053,2.498438,-0.230225,
+ -1.385053,2.498438,-0.230225, -1.401513,2.4945,-0.232961, -1.4198,2.4945,0,
+ -0.236115,2.482687,-1.42049, -0.232961,2.4945,-1.401513, 0,2.4945,-1.4198,
+ 0,2.4945,-1.4198, 0,2.482687,-1.439025, -0.236115,2.482687,-1.42049,
+ -0.459107,2.482687,-1.366728, -0.452973,2.4945,-1.348469, -0.232961,2.4945,-1.401513,
+ -0.232961,2.4945,-1.401513, -0.236115,2.482687,-1.42049, -0.459107,2.482687,-1.366728,
+ -0.666211,2.482687,-1.280502, -0.657311,2.4945,-1.263395, -0.452973,2.4945,-1.348469,
+ -0.452973,2.4945,-1.348469, -0.459107,2.482687,-1.366728, -0.666211,2.482687,-1.280502,
+ -0.854666,2.482687,-1.164574, -0.843248,2.4945,-1.149016, -0.657311,2.4945,-1.263395,
+ -0.657311,2.4945,-1.263395, -0.666211,2.482687,-1.280502, -0.854666,2.482687,-1.164574,
+ -1.021708,2.482687,-1.021708, -1.008058,2.4945,-1.008058, -0.843248,2.4945,-1.149016,
+ -0.843248,2.4945,-1.149016, -0.854666,2.482687,-1.164574, -1.021708,2.482687,-1.021708,
+ -1.164574,2.482687,-0.854666, -1.149016,2.4945,-0.843248, -1.008058,2.4945,-1.008058,
+ -1.008058,2.4945,-1.008058, -1.021708,2.482687,-1.021708, -1.164574,2.482687,-0.854666,
+ -1.280502,2.482687,-0.666211, -1.263395,2.4945,-0.657311, -1.149016,2.4945,-0.843248,
+ -1.149016,2.4945,-0.843248, -1.164574,2.482687,-0.854666, -1.280502,2.482687,-0.666211,
+ -1.366728,2.482687,-0.459107, -1.348469,2.4945,-0.452973, -1.263395,2.4945,-0.657311,
+ -1.263395,2.4945,-0.657311, -1.280502,2.482687,-0.666211, -1.366728,2.482687,-0.459107,
+ -1.42049,2.482687,-0.236115, -1.401513,2.4945,-0.232961, -1.348469,2.4945,-0.452973,
+ -1.348469,2.4945,-0.452973, -1.366728,2.482687,-0.459107, -1.42049,2.482687,-0.236115,
+ -1.439025,2.482687,0, -1.4198,2.4945,0, -1.401513,2.4945,-0.232961,
+ -1.401513,2.4945,-0.232961, -1.42049,2.482687,-0.236115, -1.439025,2.482687,0,
+ -0.239491,2.463,-1.4408, -0.236115,2.482687,-1.42049, 0,2.482687,-1.439025,
+ 0,2.482687,-1.439025, 0,2.463,-1.4596, -0.239491,2.463,-1.4408,
+ -0.465671,2.463,-1.38627, -0.459107,2.482687,-1.366728, -0.236115,2.482687,-1.42049,
+ -0.236115,2.482687,-1.42049, -0.239491,2.463,-1.4408, -0.465671,2.463,-1.38627,
+ -0.675736,2.463,-1.29881, -0.666211,2.482687,-1.280502, -0.459107,2.482687,-1.366728,
+ -0.459107,2.482687,-1.366728, -0.465671,2.463,-1.38627, -0.675736,2.463,-1.29881,
+ -0.866886,2.463,-1.181225, -0.854666,2.482687,-1.164574, -0.666211,2.482687,-1.280502,
+ -0.666211,2.482687,-1.280502, -0.675736,2.463,-1.29881, -0.866886,2.463,-1.181225,
+ -1.036316,2.463,-1.036316, -1.021708,2.482687,-1.021708, -0.854666,2.482687,-1.164574,
+ -0.854666,2.482687,-1.164574, -0.866886,2.463,-1.181225, -1.036316,2.463,-1.036316,
+ -1.181225,2.463,-0.866886, -1.164574,2.482687,-0.854666, -1.021708,2.482687,-1.021708,
+ -1.021708,2.482687,-1.021708, -1.036316,2.463,-1.036316, -1.181225,2.463,-0.866886,
+ -1.29881,2.463,-0.675736, -1.280502,2.482687,-0.666211, -1.164574,2.482687,-0.854666,
+ -1.164574,2.482687,-0.854666, -1.181225,2.463,-0.866886, -1.29881,2.463,-0.675736,
+ -1.38627,2.463,-0.465671, -1.366728,2.482687,-0.459107, -1.280502,2.482687,-0.666211,
+ -1.280502,2.482687,-0.666211, -1.29881,2.463,-0.675736, -1.38627,2.463,-0.465671,
+ -1.4408,2.463,-0.239491, -1.42049,2.482687,-0.236115, -1.366728,2.482687,-0.459107,
+ -1.366728,2.482687,-0.459107, -1.38627,2.463,-0.465671, -1.4408,2.463,-0.239491,
+ -1.4596,2.463,0, -1.439025,2.482687,0, -1.42049,2.482687,-0.236115,
+ -1.42049,2.482687,-0.236115, -1.4408,2.463,-0.239491, -1.4596,2.463,0,
+ -0.242892,2.435437,-1.461258, -0.239491,2.463,-1.4408, 0,2.463,-1.4596,
+ 0,2.463,-1.4596, 0,2.435437,-1.480325, -0.242892,2.435437,-1.461258,
+ -0.472283,2.435437,-1.405953, -0.465671,2.463,-1.38627, -0.239491,2.463,-1.4408,
+ -0.239491,2.463,-1.4408, -0.242892,2.435437,-1.461258, -0.472283,2.435437,-1.405953,
+ -0.685331,2.435437,-1.317252, -0.675736,2.463,-1.29881, -0.465671,2.463,-1.38627,
+ -0.465671,2.463,-1.38627, -0.472283,2.435437,-1.405953, -0.685331,2.435437,-1.317252,
+ -0.879195,2.435437,-1.197997, -0.866886,2.463,-1.181225, -0.675736,2.463,-1.29881,
+ -0.675736,2.463,-1.29881, -0.685331,2.435437,-1.317252, -0.879195,2.435437,-1.197997,
+ -1.051031,2.435437,-1.051031, -1.036316,2.463,-1.036316, -0.866886,2.463,-1.181225,
+ -0.866886,2.463,-1.181225, -0.879195,2.435437,-1.197997, -1.051031,2.435437,-1.051031,
+ -1.197997,2.435437,-0.879195, -1.181225,2.463,-0.866886, -1.036316,2.463,-1.036316,
+ -1.036316,2.463,-1.036316, -1.051031,2.435437,-1.051031, -1.197997,2.435437,-0.879195,
+ -1.317252,2.435437,-0.685331, -1.29881,2.463,-0.675736, -1.181225,2.463,-0.866886,
+ -1.181225,2.463,-0.866886, -1.197997,2.435437,-0.879195, -1.317252,2.435437,-0.685331,
+ -1.405953,2.435437,-0.472283, -1.38627,2.463,-0.465671, -1.29881,2.463,-0.675736,
+ -1.29881,2.463,-0.675736, -1.317252,2.435437,-0.685331, -1.405953,2.435437,-0.472283,
+ -1.461258,2.435437,-0.242892, -1.4408,2.463,-0.239491, -1.38627,2.463,-0.465671,
+ -1.38627,2.463,-0.465671, -1.405953,2.435437,-0.472283, -1.461258,2.435437,-0.242892,
+ -1.480325,2.435437,0, -1.4596,2.463,0, -1.4408,2.463,-0.239491,
+ -1.4408,2.463,-0.239491, -1.461258,2.435437,-0.242892, -1.480325,2.435437,0,
+ -0.24612,2.4,-1.48068, -0.242892,2.435437,-1.461258, 0,2.435437,-1.480325,
+ 0,2.435437,-1.480325, 0,2.4,-1.5, -0.24612,2.4,-1.48068,
+ -0.47856,2.4,-1.42464, -0.472283,2.435437,-1.405953, -0.242892,2.435437,-1.461258,
+ -0.242892,2.435437,-1.461258, -0.24612,2.4,-1.48068, -0.47856,2.4,-1.42464,
+ -0.69444,2.4,-1.33476, -0.685331,2.435437,-1.317252, -0.472283,2.435437,-1.405953,
+ -0.472283,2.435437,-1.405953, -0.47856,2.4,-1.42464, -0.69444,2.4,-1.33476,
+ -0.89088,2.4,-1.21392, -0.879195,2.435437,-1.197997, -0.685331,2.435437,-1.317252,
+ -0.685331,2.435437,-1.317252, -0.69444,2.4,-1.33476, -0.89088,2.4,-1.21392,
+ -1.065,2.4,-1.065, -1.051031,2.435437,-1.051031, -0.879195,2.435437,-1.197997,
+ -0.879195,2.435437,-1.197997, -0.89088,2.4,-1.21392, -1.065,2.4,-1.065,
+ -1.21392,2.4,-0.89088, -1.197997,2.435437,-0.879195, -1.051031,2.435437,-1.051031,
+ -1.051031,2.435437,-1.051031, -1.065,2.4,-1.065, -1.21392,2.4,-0.89088,
+ -1.33476,2.4,-0.69444, -1.317252,2.435437,-0.685331, -1.197997,2.435437,-0.879195,
+ -1.197997,2.435437,-0.879195, -1.21392,2.4,-0.89088, -1.33476,2.4,-0.69444,
+ -1.42464,2.4,-0.47856, -1.405953,2.435437,-0.472283, -1.317252,2.435437,-0.685331,
+ -1.317252,2.435437,-0.685331, -1.33476,2.4,-0.69444, -1.42464,2.4,-0.47856,
+ -1.48068,2.4,-0.24612, -1.461258,2.435437,-0.242892, -1.405953,2.435437,-0.472283,
+ -1.405953,2.435437,-0.472283, -1.42464,2.4,-0.47856, -1.48068,2.4,-0.24612,
+ -1.5,2.4,0, -1.480325,2.435437,0, -1.461258,2.435437,-0.242892,
+ -1.461258,2.435437,-0.242892, -1.48068,2.4,-0.24612, -1.5,2.4,0,
+ -1.368074,2.435437,0.227403, -1.381968,2.4,0.229712, -1.4,2.4,0,
+ -1.4,2.4,0, -1.385925,2.435437,0, -1.368074,2.435437,0.227403,
+ -1.316296,2.435437,0.442166, -1.329664,2.4,0.446656, -1.381968,2.4,0.229712,
+ -1.381968,2.4,0.229712, -1.368074,2.435437,0.227403, -1.316296,2.435437,0.442166,
+ -1.233252,2.435437,0.641628, -1.245776,2.4,0.648144, -1.329664,2.4,0.446656,
+ -1.329664,2.4,0.446656, -1.316296,2.435437,0.442166, -1.233252,2.435437,0.641628,
+ -1.121601,2.435437,0.823129, -1.132992,2.4,0.831488, -1.245776,2.4,0.648144,
+ -1.245776,2.4,0.648144, -1.233252,2.435437,0.641628, -1.121601,2.435437,0.823129,
+ -0.984007,2.435437,0.984007, -0.994,2.4,0.994, -1.132992,2.4,0.831488,
+ -1.132992,2.4,0.831488, -1.121601,2.435437,0.823129, -0.984007,2.435437,0.984007,
+ -0.823129,2.435437,1.121601, -0.831488,2.4,1.132992, -0.994,2.4,0.994,
+ -0.994,2.4,0.994, -0.984007,2.435437,0.984007, -0.823129,2.435437,1.121601,
+ -0.641628,2.435437,1.233252, -0.648144,2.4,1.245776, -0.831488,2.4,1.132992,
+ -0.831488,2.4,1.132992, -0.823129,2.435437,1.121601, -0.641628,2.435437,1.233252,
+ -0.442166,2.435437,1.316296, -0.446656,2.4,1.329664, -0.648144,2.4,1.245776,
+ -0.648144,2.4,1.245776, -0.641628,2.435437,1.233252, -0.442166,2.435437,1.316296,
+ -0.227403,2.435437,1.368074, -0.229712,2.4,1.381968, -0.446656,2.4,1.329664,
+ -0.446656,2.4,1.329664, -0.442166,2.435437,1.316296, -0.227403,2.435437,1.368074,
+ 0,2.435437,1.385925, 0,2.4,1.4, -0.229712,2.4,1.381968,
+ -0.229712,2.4,1.381968, -0.227403,2.435437,1.368074, 0,2.435437,1.385925,
+ -1.36262,2.463,0.226496, -1.368074,2.435437,0.227403, -1.385925,2.435437,0,
+ -1.385925,2.435437,0, -1.3804,2.463,0, -1.36262,2.463,0.226496,
+ -1.311049,2.463,0.440403, -1.316296,2.435437,0.442166, -1.368074,2.435437,0.227403,
+ -1.368074,2.435437,0.227403, -1.36262,2.463,0.226496, -1.311049,2.463,0.440403,
+ -1.228335,2.463,0.63907, -1.233252,2.435437,0.641628, -1.316296,2.435437,0.442166,
+ -1.316296,2.435437,0.442166, -1.311049,2.463,0.440403, -1.228335,2.463,0.63907,
+ -1.11713,2.463,0.819847, -1.121601,2.435437,0.823129, -1.233252,2.435437,0.641628,
+ -1.233252,2.435437,0.641628, -1.228335,2.463,0.63907, -1.11713,2.463,0.819847,
+ -0.980084,2.463,0.980084, -0.984007,2.435437,0.984007, -1.121601,2.435437,0.823129,
+ -1.121601,2.435437,0.823129, -1.11713,2.463,0.819847, -0.980084,2.463,0.980084,
+ -0.819847,2.463,1.11713, -0.823129,2.435437,1.121601, -0.984007,2.435437,0.984007,
+ -0.984007,2.435437,0.984007, -0.980084,2.463,0.980084, -0.819847,2.463,1.11713,
+ -0.63907,2.463,1.228335, -0.641628,2.435437,1.233252, -0.823129,2.435437,1.121601,
+ -0.823129,2.435437,1.121601, -0.819847,2.463,1.11713, -0.63907,2.463,1.228335,
+ -0.440403,2.463,1.311049, -0.442166,2.435437,1.316296, -0.641628,2.435437,1.233252,
+ -0.641628,2.435437,1.233252, -0.63907,2.463,1.228335, -0.440403,2.463,1.311049,
+ -0.226496,2.463,1.36262, -0.227403,2.435437,1.368074, -0.442166,2.435437,1.316296,
+ -0.442166,2.435437,1.316296, -0.440403,2.463,1.311049, -0.226496,2.463,1.36262,
+ 0,2.463,1.3804, 0,2.435437,1.385925, -0.227403,2.435437,1.368074,
+ -0.227403,2.435437,1.368074, -0.226496,2.463,1.36262, 0,2.463,1.3804,
+ -1.364422,2.482687,0.226795, -1.36262,2.463,0.226496, -1.3804,2.463,0,
+ -1.3804,2.463,0, -1.382225,2.482687,0, -1.364422,2.482687,0.226795,
+ -1.312782,2.482687,0.440985, -1.311049,2.463,0.440403, -1.36262,2.463,0.226496,
+ -1.36262,2.463,0.226496, -1.364422,2.482687,0.226795, -1.312782,2.482687,0.440985,
+ -1.229959,2.482687,0.639915, -1.228335,2.463,0.63907, -1.311049,2.463,0.440403,
+ -1.311049,2.463,0.440403, -1.312782,2.482687,0.440985, -1.229959,2.482687,0.639915,
+ -1.118607,2.482687,0.820931, -1.11713,2.463,0.819847, -1.228335,2.463,0.63907,
+ -1.228335,2.463,0.63907, -1.229959,2.482687,0.639915, -1.118607,2.482687,0.820931,
+ -0.98138,2.482687,0.98138, -0.980084,2.463,0.980084, -1.11713,2.463,0.819847,
+ -1.11713,2.463,0.819847, -1.118607,2.482687,0.820931, -0.98138,2.482687,0.98138,
+ -0.820931,2.482687,1.118607, -0.819847,2.463,1.11713, -0.980084,2.463,0.980084,
+ -0.980084,2.463,0.980084, -0.98138,2.482687,0.98138, -0.820931,2.482687,1.118607,
+ -0.639915,2.482687,1.229959, -0.63907,2.463,1.228335, -0.819847,2.463,1.11713,
+ -0.819847,2.463,1.11713, -0.820931,2.482687,1.118607, -0.639915,2.482687,1.229959,
+ -0.440985,2.482687,1.312782, -0.440403,2.463,1.311049, -0.63907,2.463,1.228335,
+ -0.63907,2.463,1.228335, -0.639915,2.482687,1.229959, -0.440985,2.482687,1.312782,
+ -0.226795,2.482687,1.364422, -0.226496,2.463,1.36262, -0.440403,2.463,1.311049,
+ -0.440403,2.463,1.311049, -0.440985,2.482687,1.312782, -0.226795,2.482687,1.364422,
+ 0,2.482687,1.382225, 0,2.463,1.3804, -0.226496,2.463,1.36262,
+ -0.226496,2.463,1.36262, -0.226795,2.482687,1.364422, 0,2.482687,1.382225,
+ -1.372294,2.4945,0.228104, -1.364422,2.482687,0.226795, -1.382225,2.482687,0,
+ -1.382225,2.482687,0, -1.3902,2.4945,0, -1.372294,2.4945,0.228104,
+ -1.320356,2.4945,0.443529, -1.312782,2.482687,0.440985, -1.364422,2.482687,0.226795,
+ -1.364422,2.482687,0.226795, -1.372294,2.4945,0.228104, -1.320356,2.4945,0.443529,
+ -1.237056,2.4945,0.643607, -1.229959,2.482687,0.639915, -1.312782,2.482687,0.440985,
+ -1.312782,2.482687,0.440985, -1.320356,2.4945,0.443529, -1.237056,2.4945,0.643607,
+ -1.125061,2.4945,0.825668, -1.118607,2.482687,0.820931, -1.229959,2.482687,0.639915,
+ -1.229959,2.482687,0.639915, -1.237056,2.4945,0.643607, -1.125061,2.4945,0.825668,
+ -0.987042,2.4945,0.987042, -0.98138,2.482687,0.98138, -1.118607,2.482687,0.820931,
+ -1.118607,2.482687,0.820931, -1.125061,2.4945,0.825668, -0.987042,2.4945,0.987042,
+ -0.825668,2.4945,1.125061, -0.820931,2.482687,1.118607, -0.98138,2.482687,0.98138,
+ -0.98138,2.482687,0.98138, -0.987042,2.4945,0.987042, -0.825668,2.4945,1.125061,
+ -0.643607,2.4945,1.237056, -0.639915,2.482687,1.229959, -0.820931,2.482687,1.118607,
+ -0.820931,2.482687,1.118607, -0.825668,2.4945,1.125061, -0.643607,2.4945,1.237056,
+ -0.443529,2.4945,1.320356, -0.440985,2.482687,1.312782, -0.639915,2.482687,1.229959,
+ -0.639915,2.482687,1.229959, -0.643607,2.4945,1.237056, -0.443529,2.4945,1.320356,
+ -0.228104,2.4945,1.372294, -0.226795,2.482687,1.364422, -0.440985,2.482687,1.312782,
+ -0.440985,2.482687,1.312782, -0.443529,2.4945,1.320356, -0.228104,2.4945,1.372294,
+ 0,2.4945,1.3902, 0,2.482687,1.382225, -0.226795,2.482687,1.364422,
+ -0.226795,2.482687,1.364422, -0.228104,2.4945,1.372294, 0,2.4945,1.3902,
+ -1.385053,2.498438,0.230225, -1.372294,2.4945,0.228104, -1.3902,2.4945,0,
+ -1.3902,2.4945,0, -1.403125,2.498438,0, -1.385053,2.498438,0.230225,
+ -1.332632,2.498438,0.447653, -1.320356,2.4945,0.443529, -1.372294,2.4945,0.228104,
+ -1.372294,2.4945,0.228104, -1.385053,2.498438,0.230225, -1.332632,2.498438,0.447653,
+ -1.248557,2.498438,0.649591, -1.237056,2.4945,0.643607, -1.320356,2.4945,0.443529,
+ -1.320356,2.4945,0.443529, -1.332632,2.498438,0.447653, -1.248557,2.498438,0.649591,
+ -1.135521,2.498438,0.833344, -1.125061,2.4945,0.825668, -1.237056,2.4945,0.643607,
+ -1.237056,2.4945,0.643607, -1.248557,2.498438,0.649591, -1.135521,2.498438,0.833344,
+ -0.996219,2.498438,0.996219, -0.987042,2.4945,0.987042, -1.125061,2.4945,0.825668,
+ -1.125061,2.4945,0.825668, -1.135521,2.498438,0.833344, -0.996219,2.498438,0.996219,
+ -0.833344,2.498438,1.135521, -0.825668,2.4945,1.125061, -0.987042,2.4945,0.987042,
+ -0.987042,2.4945,0.987042, -0.996219,2.498438,0.996219, -0.833344,2.498438,1.135521,
+ -0.649591,2.498438,1.248557, -0.643607,2.4945,1.237056, -0.825668,2.4945,1.125061,
+ -0.825668,2.4945,1.125061, -0.833344,2.498438,1.135521, -0.649591,2.498438,1.248557,
+ -0.447653,2.498438,1.332632, -0.443529,2.4945,1.320356, -0.643607,2.4945,1.237056,
+ -0.643607,2.4945,1.237056, -0.649591,2.498438,1.248557, -0.447653,2.498438,1.332632,
+ -0.230225,2.498438,1.385053, -0.228104,2.4945,1.372294, -0.443529,2.4945,1.320356,
+ -0.443529,2.4945,1.320356, -0.447653,2.498438,1.332632, -0.230225,2.498438,1.385053,
+ 0,2.498438,1.403125, 0,2.4945,1.3902, -0.228104,2.4945,1.372294,
+ -0.228104,2.4945,1.372294, -0.230225,2.498438,1.385053, 0,2.498438,1.403125,
+ -1.401513,2.4945,0.232961, -1.385053,2.498438,0.230225, -1.403125,2.498438,0,
+ -1.403125,2.498438,0, -1.4198,2.4945,0, -1.401513,2.4945,0.232961,
+ -1.348469,2.4945,0.452973, -1.332632,2.498438,0.447653, -1.385053,2.498438,0.230225,
+ -1.385053,2.498438,0.230225, -1.401513,2.4945,0.232961, -1.348469,2.4945,0.452973,
+ -1.263395,2.4945,0.657311, -1.248557,2.498438,0.649591, -1.332632,2.498438,0.447653,
+ -1.332632,2.498438,0.447653, -1.348469,2.4945,0.452973, -1.263395,2.4945,0.657311,
+ -1.149016,2.4945,0.843248, -1.135521,2.498438,0.833344, -1.248557,2.498438,0.649591,
+ -1.248557,2.498438,0.649591, -1.263395,2.4945,0.657311, -1.149016,2.4945,0.843248,
+ -1.008058,2.4945,1.008058, -0.996219,2.498438,0.996219, -1.135521,2.498438,0.833344,
+ -1.135521,2.498438,0.833344, -1.149016,2.4945,0.843248, -1.008058,2.4945,1.008058,
+ -0.843248,2.4945,1.149016, -0.833344,2.498438,1.135521, -0.996219,2.498438,0.996219,
+ -0.996219,2.498438,0.996219, -1.008058,2.4945,1.008058, -0.843248,2.4945,1.149016,
+ -0.657311,2.4945,1.263395, -0.649591,2.498438,1.248557, -0.833344,2.498438,1.135521,
+ -0.833344,2.498438,1.135521, -0.843248,2.4945,1.149016, -0.657311,2.4945,1.263395,
+ -0.452973,2.4945,1.348469, -0.447653,2.498438,1.332632, -0.649591,2.498438,1.248557,
+ -0.649591,2.498438,1.248557, -0.657311,2.4945,1.263395, -0.452973,2.4945,1.348469,
+ -0.232961,2.4945,1.401513, -0.230225,2.498438,1.385053, -0.447653,2.498438,1.332632,
+ -0.447653,2.498438,1.332632, -0.452973,2.4945,1.348469, -0.232961,2.4945,1.401513,
+ 0,2.4945,1.4198, 0,2.498438,1.403125, -0.230225,2.498438,1.385053,
+ -0.230225,2.498438,1.385053, -0.232961,2.4945,1.401513, 0,2.4945,1.4198,
+ -1.42049,2.482687,0.236115, -1.401513,2.4945,0.232961, -1.4198,2.4945,0,
+ -1.4198,2.4945,0, -1.439025,2.482687,0, -1.42049,2.482687,0.236115,
+ -1.366728,2.482687,0.459107, -1.348469,2.4945,0.452973, -1.401513,2.4945,0.232961,
+ -1.401513,2.4945,0.232961, -1.42049,2.482687,0.236115, -1.366728,2.482687,0.459107,
+ -1.280502,2.482687,0.666211, -1.263395,2.4945,0.657311, -1.348469,2.4945,0.452973,
+ -1.348469,2.4945,0.452973, -1.366728,2.482687,0.459107, -1.280502,2.482687,0.666211,
+ -1.164574,2.482687,0.854666, -1.149016,2.4945,0.843248, -1.263395,2.4945,0.657311,
+ -1.263395,2.4945,0.657311, -1.280502,2.482687,0.666211, -1.164574,2.482687,0.854666,
+ -1.021708,2.482687,1.021708, -1.008058,2.4945,1.008058, -1.149016,2.4945,0.843248,
+ -1.149016,2.4945,0.843248, -1.164574,2.482687,0.854666, -1.021708,2.482687,1.021708,
+ -0.854666,2.482687,1.164574, -0.843248,2.4945,1.149016, -1.008058,2.4945,1.008058,
+ -1.008058,2.4945,1.008058, -1.021708,2.482687,1.021708, -0.854666,2.482687,1.164574,
+ -0.666211,2.482687,1.280502, -0.657311,2.4945,1.263395, -0.843248,2.4945,1.149016,
+ -0.843248,2.4945,1.149016, -0.854666,2.482687,1.164574, -0.666211,2.482687,1.280502,
+ -0.459107,2.482687,1.366728, -0.452973,2.4945,1.348469, -0.657311,2.4945,1.263395,
+ -0.657311,2.4945,1.263395, -0.666211,2.482687,1.280502, -0.459107,2.482687,1.366728,
+ -0.236115,2.482687,1.42049, -0.232961,2.4945,1.401513, -0.452973,2.4945,1.348469,
+ -0.452973,2.4945,1.348469, -0.459107,2.482687,1.366728, -0.236115,2.482687,1.42049,
+ 0,2.482687,1.439025, 0,2.4945,1.4198, -0.232961,2.4945,1.401513,
+ -0.232961,2.4945,1.401513, -0.236115,2.482687,1.42049, 0,2.482687,1.439025,
+ -1.4408,2.463,0.239491, -1.42049,2.482687,0.236115, -1.439025,2.482687,0,
+ -1.439025,2.482687,0, -1.4596,2.463,0, -1.4408,2.463,0.239491,
+ -1.38627,2.463,0.465671, -1.366728,2.482687,0.459107, -1.42049,2.482687,0.236115,
+ -1.42049,2.482687,0.236115, -1.4408,2.463,0.239491, -1.38627,2.463,0.465671,
+ -1.29881,2.463,0.675736, -1.280502,2.482687,0.666211, -1.366728,2.482687,0.459107,
+ -1.366728,2.482687,0.459107, -1.38627,2.463,0.465671, -1.29881,2.463,0.675736,
+ -1.181225,2.463,0.866886, -1.164574,2.482687,0.854666, -1.280502,2.482687,0.666211,
+ -1.280502,2.482687,0.666211, -1.29881,2.463,0.675736, -1.181225,2.463,0.866886,
+ -1.036316,2.463,1.036316, -1.021708,2.482687,1.021708, -1.164574,2.482687,0.854666,
+ -1.164574,2.482687,0.854666, -1.181225,2.463,0.866886, -1.036316,2.463,1.036316,
+ -0.866886,2.463,1.181225, -0.854666,2.482687,1.164574, -1.021708,2.482687,1.021708,
+ -1.021708,2.482687,1.021708, -1.036316,2.463,1.036316, -0.866886,2.463,1.181225,
+ -0.675736,2.463,1.29881, -0.666211,2.482687,1.280502, -0.854666,2.482687,1.164574,
+ -0.854666,2.482687,1.164574, -0.866886,2.463,1.181225, -0.675736,2.463,1.29881,
+ -0.465671,2.463,1.38627, -0.459107,2.482687,1.366728, -0.666211,2.482687,1.280502,
+ -0.666211,2.482687,1.280502, -0.675736,2.463,1.29881, -0.465671,2.463,1.38627,
+ -0.239491,2.463,1.4408, -0.236115,2.482687,1.42049, -0.459107,2.482687,1.366728,
+ -0.459107,2.482687,1.366728, -0.465671,2.463,1.38627, -0.239491,2.463,1.4408,
+ 0,2.463,1.4596, 0,2.482687,1.439025, -0.236115,2.482687,1.42049,
+ -0.236115,2.482687,1.42049, -0.239491,2.463,1.4408, 0,2.463,1.4596,
+ -1.461258,2.435437,0.242892, -1.4408,2.463,0.239491, -1.4596,2.463,0,
+ -1.4596,2.463,0, -1.480325,2.435437,0, -1.461258,2.435437,0.242892,
+ -1.405953,2.435437,0.472283, -1.38627,2.463,0.465671, -1.4408,2.463,0.239491,
+ -1.4408,2.463,0.239491, -1.461258,2.435437,0.242892, -1.405953,2.435437,0.472283,
+ -1.317252,2.435437,0.685331, -1.29881,2.463,0.675736, -1.38627,2.463,0.465671,
+ -1.38627,2.463,0.465671, -1.405953,2.435437,0.472283, -1.317252,2.435437,0.685331,
+ -1.197997,2.435437,0.879195, -1.181225,2.463,0.866886, -1.29881,2.463,0.675736,
+ -1.29881,2.463,0.675736, -1.317252,2.435437,0.685331, -1.197997,2.435437,0.879195,
+ -1.051031,2.435437,1.051031, -1.036316,2.463,1.036316, -1.181225,2.463,0.866886,
+ -1.181225,2.463,0.866886, -1.197997,2.435437,0.879195, -1.051031,2.435437,1.051031,
+ -0.879195,2.435437,1.197997, -0.866886,2.463,1.181225, -1.036316,2.463,1.036316,
+ -1.036316,2.463,1.036316, -1.051031,2.435437,1.051031, -0.879195,2.435437,1.197997,
+ -0.685331,2.435437,1.317252, -0.675736,2.463,1.29881, -0.866886,2.463,1.181225,
+ -0.866886,2.463,1.181225, -0.879195,2.435437,1.197997, -0.685331,2.435437,1.317252,
+ -0.472283,2.435437,1.405953, -0.465671,2.463,1.38627, -0.675736,2.463,1.29881,
+ -0.675736,2.463,1.29881, -0.685331,2.435437,1.317252, -0.472283,2.435437,1.405953,
+ -0.242892,2.435437,1.461258, -0.239491,2.463,1.4408, -0.465671,2.463,1.38627,
+ -0.465671,2.463,1.38627, -0.472283,2.435437,1.405953, -0.242892,2.435437,1.461258,
+ 0,2.435437,1.480325, 0,2.463,1.4596, -0.239491,2.463,1.4408,
+ -0.239491,2.463,1.4408, -0.242892,2.435437,1.461258, 0,2.435437,1.480325,
+ -1.48068,2.4,0.24612, -1.461258,2.435437,0.242892, -1.480325,2.435437,0,
+ -1.480325,2.435437,0, -1.5,2.4,0, -1.48068,2.4,0.24612,
+ -1.42464,2.4,0.47856, -1.405953,2.435437,0.472283, -1.461258,2.435437,0.242892,
+ -1.461258,2.435437,0.242892, -1.48068,2.4,0.24612, -1.42464,2.4,0.47856,
+ -1.33476,2.4,0.69444, -1.317252,2.435437,0.685331, -1.405953,2.435437,0.472283,
+ -1.405953,2.435437,0.472283, -1.42464,2.4,0.47856, -1.33476,2.4,0.69444,
+ -1.21392,2.4,0.89088, -1.197997,2.435437,0.879195, -1.317252,2.435437,0.685331,
+ -1.317252,2.435437,0.685331, -1.33476,2.4,0.69444, -1.21392,2.4,0.89088,
+ -1.065,2.4,1.065, -1.051031,2.435437,1.051031, -1.197997,2.435437,0.879195,
+ -1.197997,2.435437,0.879195, -1.21392,2.4,0.89088, -1.065,2.4,1.065,
+ -0.89088,2.4,1.21392, -0.879195,2.435437,1.197997, -1.051031,2.435437,1.051031,
+ -1.051031,2.435437,1.051031, -1.065,2.4,1.065, -0.89088,2.4,1.21392,
+ -0.69444,2.4,1.33476, -0.685331,2.435437,1.317252, -0.879195,2.435437,1.197997,
+ -0.879195,2.435437,1.197997, -0.89088,2.4,1.21392, -0.69444,2.4,1.33476,
+ -0.47856,2.4,1.42464, -0.472283,2.435437,1.405953, -0.685331,2.435437,1.317252,
+ -0.685331,2.435437,1.317252, -0.69444,2.4,1.33476, -0.47856,2.4,1.42464,
+ -0.24612,2.4,1.48068, -0.242892,2.435437,1.461258, -0.472283,2.435437,1.405953,
+ -0.472283,2.435437,1.405953, -0.47856,2.4,1.42464, -0.24612,2.4,1.48068,
+ 0,2.4,1.5, 0,2.435437,1.480325, -0.242892,2.435437,1.461258,
+ -0.242892,2.435437,1.461258, -0.24612,2.4,1.48068, 0,2.4,1.5,
+ 0.227403,2.435437,1.368074, 0.229712,2.4,1.381968, 0,2.4,1.4,
+ 0,2.4,1.4, 0,2.435437,1.385925, 0.227403,2.435437,1.368074,
+ 0.442166,2.435437,1.316296, 0.446656,2.4,1.329664, 0.229712,2.4,1.381968,
+ 0.229712,2.4,1.381968, 0.227403,2.435437,1.368074, 0.442166,2.435437,1.316296,
+ 0.641628,2.435437,1.233252, 0.648144,2.4,1.245776, 0.446656,2.4,1.329664,
+ 0.446656,2.4,1.329664, 0.442166,2.435437,1.316296, 0.641628,2.435437,1.233252,
+ 0.823129,2.435437,1.121601, 0.831488,2.4,1.132992, 0.648144,2.4,1.245776,
+ 0.648144,2.4,1.245776, 0.641628,2.435437,1.233252, 0.823129,2.435437,1.121601,
+ 0.984007,2.435437,0.984007, 0.994,2.4,0.994, 0.831488,2.4,1.132992,
+ 0.831488,2.4,1.132992, 0.823129,2.435437,1.121601, 0.984007,2.435437,0.984007,
+ 1.121601,2.435437,0.823129, 1.132992,2.4,0.831488, 0.994,2.4,0.994,
+ 0.994,2.4,0.994, 0.984007,2.435437,0.984007, 1.121601,2.435437,0.823129,
+ 1.233252,2.435437,0.641628, 1.245776,2.4,0.648144, 1.132992,2.4,0.831488,
+ 1.132992,2.4,0.831488, 1.121601,2.435437,0.823129, 1.233252,2.435437,0.641628,
+ 1.316296,2.435437,0.442166, 1.329664,2.4,0.446656, 1.245776,2.4,0.648144,
+ 1.245776,2.4,0.648144, 1.233252,2.435437,0.641628, 1.316296,2.435437,0.442166,
+ 1.368074,2.435437,0.227403, 1.381968,2.4,0.229712, 1.329664,2.4,0.446656,
+ 1.329664,2.4,0.446656, 1.316296,2.435437,0.442166, 1.368074,2.435437,0.227403,
+ 1.385925,2.435437,0, 1.4,2.4,0, 1.381968,2.4,0.229712,
+ 1.381968,2.4,0.229712, 1.368074,2.435437,0.227403, 1.385925,2.435437,0,
+ 0.226496,2.463,1.36262, 0.227403,2.435437,1.368074, 0,2.435437,1.385925,
+ 0,2.435437,1.385925, 0,2.463,1.3804, 0.226496,2.463,1.36262,
+ 0.440403,2.463,1.311049, 0.442166,2.435437,1.316296, 0.227403,2.435437,1.368074,
+ 0.227403,2.435437,1.368074, 0.226496,2.463,1.36262, 0.440403,2.463,1.311049,
+ 0.63907,2.463,1.228335, 0.641628,2.435437,1.233252, 0.442166,2.435437,1.316296,
+ 0.442166,2.435437,1.316296, 0.440403,2.463,1.311049, 0.63907,2.463,1.228335,
+ 0.819847,2.463,1.11713, 0.823129,2.435437,1.121601, 0.641628,2.435437,1.233252,
+ 0.641628,2.435437,1.233252, 0.63907,2.463,1.228335, 0.819847,2.463,1.11713,
+ 0.980084,2.463,0.980084, 0.984007,2.435437,0.984007, 0.823129,2.435437,1.121601,
+ 0.823129,2.435437,1.121601, 0.819847,2.463,1.11713, 0.980084,2.463,0.980084,
+ 1.11713,2.463,0.819847, 1.121601,2.435437,0.823129, 0.984007,2.435437,0.984007,
+ 0.984007,2.435437,0.984007, 0.980084,2.463,0.980084, 1.11713,2.463,0.819847,
+ 1.228335,2.463,0.63907, 1.233252,2.435437,0.641628, 1.121601,2.435437,0.823129,
+ 1.121601,2.435437,0.823129, 1.11713,2.463,0.819847, 1.228335,2.463,0.63907,
+ 1.311049,2.463,0.440403, 1.316296,2.435437,0.442166, 1.233252,2.435437,0.641628,
+ 1.233252,2.435437,0.641628, 1.228335,2.463,0.63907, 1.311049,2.463,0.440403,
+ 1.36262,2.463,0.226496, 1.368074,2.435437,0.227403, 1.316296,2.435437,0.442166,
+ 1.316296,2.435437,0.442166, 1.311049,2.463,0.440403, 1.36262,2.463,0.226496,
+ 1.3804,2.463,0, 1.385925,2.435437,0, 1.368074,2.435437,0.227403,
+ 1.368074,2.435437,0.227403, 1.36262,2.463,0.226496, 1.3804,2.463,0,
+ 0.226795,2.482687,1.364422, 0.226496,2.463,1.36262, 0,2.463,1.3804,
+ 0,2.463,1.3804, 0,2.482687,1.382225, 0.226795,2.482687,1.364422,
+ 0.440985,2.482687,1.312782, 0.440403,2.463,1.311049, 0.226496,2.463,1.36262,
+ 0.226496,2.463,1.36262, 0.226795,2.482687,1.364422, 0.440985,2.482687,1.312782,
+ 0.639915,2.482687,1.229959, 0.63907,2.463,1.228335, 0.440403,2.463,1.311049,
+ 0.440403,2.463,1.311049, 0.440985,2.482687,1.312782, 0.639915,2.482687,1.229959,
+ 0.820931,2.482687,1.118607, 0.819847,2.463,1.11713, 0.63907,2.463,1.228335,
+ 0.63907,2.463,1.228335, 0.639915,2.482687,1.229959, 0.820931,2.482687,1.118607,
+ 0.98138,2.482687,0.98138, 0.980084,2.463,0.980084, 0.819847,2.463,1.11713,
+ 0.819847,2.463,1.11713, 0.820931,2.482687,1.118607, 0.98138,2.482687,0.98138,
+ 1.118607,2.482687,0.820931, 1.11713,2.463,0.819847, 0.980084,2.463,0.980084,
+ 0.980084,2.463,0.980084, 0.98138,2.482687,0.98138, 1.118607,2.482687,0.820931,
+ 1.229959,2.482687,0.639915, 1.228335,2.463,0.63907, 1.11713,2.463,0.819847,
+ 1.11713,2.463,0.819847, 1.118607,2.482687,0.820931, 1.229959,2.482687,0.639915,
+ 1.312782,2.482687,0.440985, 1.311049,2.463,0.440403, 1.228335,2.463,0.63907,
+ 1.228335,2.463,0.63907, 1.229959,2.482687,0.639915, 1.312782,2.482687,0.440985,
+ 1.364422,2.482687,0.226795, 1.36262,2.463,0.226496, 1.311049,2.463,0.440403,
+ 1.311049,2.463,0.440403, 1.312782,2.482687,0.440985, 1.364422,2.482687,0.226795,
+ 1.382225,2.482687,0, 1.3804,2.463,0, 1.36262,2.463,0.226496,
+ 1.36262,2.463,0.226496, 1.364422,2.482687,0.226795, 1.382225,2.482687,0,
+ 0.228104,2.4945,1.372294, 0.226795,2.482687,1.364422, 0,2.482687,1.382225,
+ 0,2.482687,1.382225, 0,2.4945,1.3902, 0.228104,2.4945,1.372294,
+ 0.443529,2.4945,1.320356, 0.440985,2.482687,1.312782, 0.226795,2.482687,1.364422,
+ 0.226795,2.482687,1.364422, 0.228104,2.4945,1.372294, 0.443529,2.4945,1.320356,
+ 0.643607,2.4945,1.237056, 0.639915,2.482687,1.229959, 0.440985,2.482687,1.312782,
+ 0.440985,2.482687,1.312782, 0.443529,2.4945,1.320356, 0.643607,2.4945,1.237056,
+ 0.825668,2.4945,1.125061, 0.820931,2.482687,1.118607, 0.639915,2.482687,1.229959,
+ 0.639915,2.482687,1.229959, 0.643607,2.4945,1.237056, 0.825668,2.4945,1.125061,
+ 0.987042,2.4945,0.987042, 0.98138,2.482687,0.98138, 0.820931,2.482687,1.118607,
+ 0.820931,2.482687,1.118607, 0.825668,2.4945,1.125061, 0.987042,2.4945,0.987042,
+ 1.125061,2.4945,0.825668, 1.118607,2.482687,0.820931, 0.98138,2.482687,0.98138,
+ 0.98138,2.482687,0.98138, 0.987042,2.4945,0.987042, 1.125061,2.4945,0.825668,
+ 1.237056,2.4945,0.643607, 1.229959,2.482687,0.639915, 1.118607,2.482687,0.820931,
+ 1.118607,2.482687,0.820931, 1.125061,2.4945,0.825668, 1.237056,2.4945,0.643607,
+ 1.320356,2.4945,0.443529, 1.312782,2.482687,0.440985, 1.229959,2.482687,0.639915,
+ 1.229959,2.482687,0.639915, 1.237056,2.4945,0.643607, 1.320356,2.4945,0.443529,
+ 1.372294,2.4945,0.228104, 1.364422,2.482687,0.226795, 1.312782,2.482687,0.440985,
+ 1.312782,2.482687,0.440985, 1.320356,2.4945,0.443529, 1.372294,2.4945,0.228104,
+ 1.3902,2.4945,0, 1.382225,2.482687,0, 1.364422,2.482687,0.226795,
+ 1.364422,2.482687,0.226795, 1.372294,2.4945,0.228104, 1.3902,2.4945,0,
+ 0.230225,2.498438,1.385053, 0.228104,2.4945,1.372294, 0,2.4945,1.3902,
+ 0,2.4945,1.3902, 0,2.498438,1.403125, 0.230225,2.498438,1.385053,
+ 0.447653,2.498438,1.332632, 0.443529,2.4945,1.320356, 0.228104,2.4945,1.372294,
+ 0.228104,2.4945,1.372294, 0.230225,2.498438,1.385053, 0.447653,2.498438,1.332632,
+ 0.649591,2.498438,1.248557, 0.643607,2.4945,1.237056, 0.443529,2.4945,1.320356,
+ 0.443529,2.4945,1.320356, 0.447653,2.498438,1.332632, 0.649591,2.498438,1.248557,
+ 0.833344,2.498438,1.135521, 0.825668,2.4945,1.125061, 0.643607,2.4945,1.237056,
+ 0.643607,2.4945,1.237056, 0.649591,2.498438,1.248557, 0.833344,2.498438,1.135521,
+ 0.996219,2.498438,0.996219, 0.987042,2.4945,0.987042, 0.825668,2.4945,1.125061,
+ 0.825668,2.4945,1.125061, 0.833344,2.498438,1.135521, 0.996219,2.498438,0.996219,
+ 1.135521,2.498438,0.833344, 1.125061,2.4945,0.825668, 0.987042,2.4945,0.987042,
+ 0.987042,2.4945,0.987042, 0.996219,2.498438,0.996219, 1.135521,2.498438,0.833344,
+ 1.248557,2.498438,0.649591, 1.237056,2.4945,0.643607, 1.125061,2.4945,0.825668,
+ 1.125061,2.4945,0.825668, 1.135521,2.498438,0.833344, 1.248557,2.498438,0.649591,
+ 1.332632,2.498438,0.447653, 1.320356,2.4945,0.443529, 1.237056,2.4945,0.643607,
+ 1.237056,2.4945,0.643607, 1.248557,2.498438,0.649591, 1.332632,2.498438,0.447653,
+ 1.385053,2.498438,0.230225, 1.372294,2.4945,0.228104, 1.320356,2.4945,0.443529,
+ 1.320356,2.4945,0.443529, 1.332632,2.498438,0.447653, 1.385053,2.498438,0.230225,
+ 1.403125,2.498438,0, 1.3902,2.4945,0, 1.372294,2.4945,0.228104,
+ 1.372294,2.4945,0.228104, 1.385053,2.498438,0.230225, 1.403125,2.498438,0,
+ 0.232961,2.4945,1.401513, 0.230225,2.498438,1.385053, 0,2.498438,1.403125,
+ 0,2.498438,1.403125, 0,2.4945,1.4198, 0.232961,2.4945,1.401513,
+ 0.452973,2.4945,1.348469, 0.447653,2.498438,1.332632, 0.230225,2.498438,1.385053,
+ 0.230225,2.498438,1.385053, 0.232961,2.4945,1.401513, 0.452973,2.4945,1.348469,
+ 0.657311,2.4945,1.263395, 0.649591,2.498438,1.248557, 0.447653,2.498438,1.332632,
+ 0.447653,2.498438,1.332632, 0.452973,2.4945,1.348469, 0.657311,2.4945,1.263395,
+ 0.843248,2.4945,1.149016, 0.833344,2.498438,1.135521, 0.649591,2.498438,1.248557,
+ 0.649591,2.498438,1.248557, 0.657311,2.4945,1.263395, 0.843248,2.4945,1.149016,
+ 1.008058,2.4945,1.008058, 0.996219,2.498438,0.996219, 0.833344,2.498438,1.135521,
+ 0.833344,2.498438,1.135521, 0.843248,2.4945,1.149016, 1.008058,2.4945,1.008058,
+ 1.149016,2.4945,0.843248, 1.135521,2.498438,0.833344, 0.996219,2.498438,0.996219,
+ 0.996219,2.498438,0.996219, 1.008058,2.4945,1.008058, 1.149016,2.4945,0.843248,
+ 1.263395,2.4945,0.657311, 1.248557,2.498438,0.649591, 1.135521,2.498438,0.833344,
+ 1.135521,2.498438,0.833344, 1.149016,2.4945,0.843248, 1.263395,2.4945,0.657311,
+ 1.348469,2.4945,0.452973, 1.332632,2.498438,0.447653, 1.248557,2.498438,0.649591,
+ 1.248557,2.498438,0.649591, 1.263395,2.4945,0.657311, 1.348469,2.4945,0.452973,
+ 1.401513,2.4945,0.232961, 1.385053,2.498438,0.230225, 1.332632,2.498438,0.447653,
+ 1.332632,2.498438,0.447653, 1.348469,2.4945,0.452973, 1.401513,2.4945,0.232961,
+ 1.4198,2.4945,0, 1.403125,2.498438,0, 1.385053,2.498438,0.230225,
+ 1.385053,2.498438,0.230225, 1.401513,2.4945,0.232961, 1.4198,2.4945,0,
+ 0.236115,2.482687,1.42049, 0.232961,2.4945,1.401513, 0,2.4945,1.4198,
+ 0,2.4945,1.4198, 0,2.482687,1.439025, 0.236115,2.482687,1.42049,
+ 0.459107,2.482687,1.366728, 0.452973,2.4945,1.348469, 0.232961,2.4945,1.401513,
+ 0.232961,2.4945,1.401513, 0.236115,2.482687,1.42049, 0.459107,2.482687,1.366728,
+ 0.666211,2.482687,1.280502, 0.657311,2.4945,1.263395, 0.452973,2.4945,1.348469,
+ 0.452973,2.4945,1.348469, 0.459107,2.482687,1.366728, 0.666211,2.482687,1.280502,
+ 0.854666,2.482687,1.164574, 0.843248,2.4945,1.149016, 0.657311,2.4945,1.263395,
+ 0.657311,2.4945,1.263395, 0.666211,2.482687,1.280502, 0.854666,2.482687,1.164574,
+ 1.021708,2.482687,1.021708, 1.008058,2.4945,1.008058, 0.843248,2.4945,1.149016,
+ 0.843248,2.4945,1.149016, 0.854666,2.482687,1.164574, 1.021708,2.482687,1.021708,
+ 1.164574,2.482687,0.854666, 1.149016,2.4945,0.843248, 1.008058,2.4945,1.008058,
+ 1.008058,2.4945,1.008058, 1.021708,2.482687,1.021708, 1.164574,2.482687,0.854666,
+ 1.280502,2.482687,0.666211, 1.263395,2.4945,0.657311, 1.149016,2.4945,0.843248,
+ 1.149016,2.4945,0.843248, 1.164574,2.482687,0.854666, 1.280502,2.482687,0.666211,
+ 1.366728,2.482687,0.459107, 1.348469,2.4945,0.452973, 1.263395,2.4945,0.657311,
+ 1.263395,2.4945,0.657311, 1.280502,2.482687,0.666211, 1.366728,2.482687,0.459107,
+ 1.42049,2.482687,0.236115, 1.401513,2.4945,0.232961, 1.348469,2.4945,0.452973,
+ 1.348469,2.4945,0.452973, 1.366728,2.482687,0.459107, 1.42049,2.482687,0.236115,
+ 1.439025,2.482687,0, 1.4198,2.4945,0, 1.401513,2.4945,0.232961,
+ 1.401513,2.4945,0.232961, 1.42049,2.482687,0.236115, 1.439025,2.482687,0,
+ 0.239491,2.463,1.4408, 0.236115,2.482687,1.42049, 0,2.482687,1.439025,
+ 0,2.482687,1.439025, 0,2.463,1.4596, 0.239491,2.463,1.4408,
+ 0.465671,2.463,1.38627, 0.459107,2.482687,1.366728, 0.236115,2.482687,1.42049,
+ 0.236115,2.482687,1.42049, 0.239491,2.463,1.4408, 0.465671,2.463,1.38627,
+ 0.675736,2.463,1.29881, 0.666211,2.482687,1.280502, 0.459107,2.482687,1.366728,
+ 0.459107,2.482687,1.366728, 0.465671,2.463,1.38627, 0.675736,2.463,1.29881,
+ 0.866886,2.463,1.181225, 0.854666,2.482687,1.164574, 0.666211,2.482687,1.280502,
+ 0.666211,2.482687,1.280502, 0.675736,2.463,1.29881, 0.866886,2.463,1.181225,
+ 1.036316,2.463,1.036316, 1.021708,2.482687,1.021708, 0.854666,2.482687,1.164574,
+ 0.854666,2.482687,1.164574, 0.866886,2.463,1.181225, 1.036316,2.463,1.036316,
+ 1.181225,2.463,0.866886, 1.164574,2.482687,0.854666, 1.021708,2.482687,1.021708,
+ 1.021708,2.482687,1.021708, 1.036316,2.463,1.036316, 1.181225,2.463,0.866886,
+ 1.29881,2.463,0.675736, 1.280502,2.482687,0.666211, 1.164574,2.482687,0.854666,
+ 1.164574,2.482687,0.854666, 1.181225,2.463,0.866886, 1.29881,2.463,0.675736,
+ 1.38627,2.463,0.465671, 1.366728,2.482687,0.459107, 1.280502,2.482687,0.666211,
+ 1.280502,2.482687,0.666211, 1.29881,2.463,0.675736, 1.38627,2.463,0.465671,
+ 1.4408,2.463,0.239491, 1.42049,2.482687,0.236115, 1.366728,2.482687,0.459107,
+ 1.366728,2.482687,0.459107, 1.38627,2.463,0.465671, 1.4408,2.463,0.239491,
+ 1.4596,2.463,0, 1.439025,2.482687,0, 1.42049,2.482687,0.236115,
+ 1.42049,2.482687,0.236115, 1.4408,2.463,0.239491, 1.4596,2.463,0,
+ 0.242892,2.435437,1.461258, 0.239491,2.463,1.4408, 0,2.463,1.4596,
+ 0,2.463,1.4596, 0,2.435437,1.480325, 0.242892,2.435437,1.461258,
+ 0.472283,2.435437,1.405953, 0.465671,2.463,1.38627, 0.239491,2.463,1.4408,
+ 0.239491,2.463,1.4408, 0.242892,2.435437,1.461258, 0.472283,2.435437,1.405953,
+ 0.685331,2.435437,1.317252, 0.675736,2.463,1.29881, 0.465671,2.463,1.38627,
+ 0.465671,2.463,1.38627, 0.472283,2.435437,1.405953, 0.685331,2.435437,1.317252,
+ 0.879195,2.435437,1.197997, 0.866886,2.463,1.181225, 0.675736,2.463,1.29881,
+ 0.675736,2.463,1.29881, 0.685331,2.435437,1.317252, 0.879195,2.435437,1.197997,
+ 1.051031,2.435437,1.051031, 1.036316,2.463,1.036316, 0.866886,2.463,1.181225,
+ 0.866886,2.463,1.181225, 0.879195,2.435437,1.197997, 1.051031,2.435437,1.051031,
+ 1.197997,2.435437,0.879195, 1.181225,2.463,0.866886, 1.036316,2.463,1.036316,
+ 1.036316,2.463,1.036316, 1.051031,2.435437,1.051031, 1.197997,2.435437,0.879195,
+ 1.317252,2.435437,0.685331, 1.29881,2.463,0.675736, 1.181225,2.463,0.866886,
+ 1.181225,2.463,0.866886, 1.197997,2.435437,0.879195, 1.317252,2.435437,0.685331,
+ 1.405953,2.435437,0.472283, 1.38627,2.463,0.465671, 1.29881,2.463,0.675736,
+ 1.29881,2.463,0.675736, 1.317252,2.435437,0.685331, 1.405953,2.435437,0.472283,
+ 1.461258,2.435437,0.242892, 1.4408,2.463,0.239491, 1.38627,2.463,0.465671,
+ 1.38627,2.463,0.465671, 1.405953,2.435437,0.472283, 1.461258,2.435437,0.242892,
+ 1.480325,2.435437,0, 1.4596,2.463,0, 1.4408,2.463,0.239491,
+ 1.4408,2.463,0.239491, 1.461258,2.435437,0.242892, 1.480325,2.435437,0,
+ 0.24612,2.4,1.48068, 0.242892,2.435437,1.461258, 0,2.435437,1.480325,
+ 0,2.435437,1.480325, 0,2.4,1.5, 0.24612,2.4,1.48068,
+ 0.47856,2.4,1.42464, 0.472283,2.435437,1.405953, 0.242892,2.435437,1.461258,
+ 0.242892,2.435437,1.461258, 0.24612,2.4,1.48068, 0.47856,2.4,1.42464,
+ 0.69444,2.4,1.33476, 0.685331,2.435437,1.317252, 0.472283,2.435437,1.405953,
+ 0.472283,2.435437,1.405953, 0.47856,2.4,1.42464, 0.69444,2.4,1.33476,
+ 0.89088,2.4,1.21392, 0.879195,2.435437,1.197997, 0.685331,2.435437,1.317252,
+ 0.685331,2.435437,1.317252, 0.69444,2.4,1.33476, 0.89088,2.4,1.21392,
+ 1.065,2.4,1.065, 1.051031,2.435437,1.051031, 0.879195,2.435437,1.197997,
+ 0.879195,2.435437,1.197997, 0.89088,2.4,1.21392, 1.065,2.4,1.065,
+ 1.21392,2.4,0.89088, 1.197997,2.435437,0.879195, 1.051031,2.435437,1.051031,
+ 1.051031,2.435437,1.051031, 1.065,2.4,1.065, 1.21392,2.4,0.89088,
+ 1.33476,2.4,0.69444, 1.317252,2.435437,0.685331, 1.197997,2.435437,0.879195,
+ 1.197997,2.435437,0.879195, 1.21392,2.4,0.89088, 1.33476,2.4,0.69444,
+ 1.42464,2.4,0.47856, 1.405953,2.435437,0.472283, 1.317252,2.435437,0.685331,
+ 1.317252,2.435437,0.685331, 1.33476,2.4,0.69444, 1.42464,2.4,0.47856,
+ 1.48068,2.4,0.24612, 1.461258,2.435437,0.242892, 1.405953,2.435437,0.472283,
+ 1.405953,2.435437,0.472283, 1.42464,2.4,0.47856, 1.48068,2.4,0.24612,
+ 1.5,2.4,0, 1.480325,2.435437,0, 1.461258,2.435437,0.242892,
+ 1.461258,2.435437,0.242892, 1.48068,2.4,0.24612, 1.5,2.4,0,
+ 1.554467,2.242575,-0.258385, 1.48068,2.4,-0.24612, 1.5,2.4,0,
+ 1.5,2.4,0, 1.57475,2.242575,0, 1.554467,2.242575,-0.258385,
+ 1.495635,2.242575,-0.502408, 1.42464,2.4,-0.47856, 1.48068,2.4,-0.24612,
+ 1.48068,2.4,-0.24612, 1.554467,2.242575,-0.258385, 1.495635,2.242575,-0.502408,
+ 1.401276,2.242575,-0.729046, 1.33476,2.4,-0.69444, 1.42464,2.4,-0.47856,
+ 1.42464,2.4,-0.47856, 1.495635,2.242575,-0.502408, 1.401276,2.242575,-0.729046,
+ 1.274414,2.242575,-0.935276, 1.21392,2.4,-0.89088, 1.33476,2.4,-0.69444,
+ 1.33476,2.4,-0.69444, 1.401276,2.242575,-0.729046, 1.274414,2.242575,-0.935276,
+ 1.118073,2.242575,-1.118073, 1.065,2.4,-1.065, 1.21392,2.4,-0.89088,
+ 1.21392,2.4,-0.89088, 1.274414,2.242575,-0.935276, 1.118073,2.242575,-1.118073,
+ 0.935276,2.242575,-1.274414, 0.89088,2.4,-1.21392, 1.065,2.4,-1.065,
+ 1.065,2.4,-1.065, 1.118073,2.242575,-1.118073, 0.935276,2.242575,-1.274414,
+ 0.729046,2.242575,-1.401276, 0.69444,2.4,-1.33476, 0.89088,2.4,-1.21392,
+ 0.89088,2.4,-1.21392, 0.935276,2.242575,-1.274414, 0.729046,2.242575,-1.401276,
+ 0.502408,2.242575,-1.495635, 0.47856,2.4,-1.42464, 0.69444,2.4,-1.33476,
+ 0.69444,2.4,-1.33476, 0.729046,2.242575,-1.401276, 0.502408,2.242575,-1.495635,
+ 0.258385,2.242575,-1.554467, 0.24612,2.4,-1.48068, 0.47856,2.4,-1.42464,
+ 0.47856,2.4,-1.42464, 0.502408,2.242575,-1.495635, 0.258385,2.242575,-1.554467,
+ 0,2.242575,-1.57475, 0,2.4,-1.5, 0.24612,2.4,-1.48068,
+ 0.24612,2.4,-1.48068, 0.258385,2.242575,-1.554467, 0,2.242575,-1.57475,
+ 1.626774,2.0856,-0.270404, 1.554467,2.242575,-0.258385, 1.57475,2.242575,0,
+ 1.57475,2.242575,0, 1.648,2.0856,0, 1.626774,2.0856,-0.270404,
+ 1.565204,2.0856,-0.525778, 1.495635,2.242575,-0.502408, 1.554467,2.242575,-0.258385,
+ 1.554467,2.242575,-0.258385, 1.626774,2.0856,-0.270404, 1.565204,2.0856,-0.525778,
+ 1.466456,2.0856,-0.762958, 1.401276,2.242575,-0.729046, 1.495635,2.242575,-0.502408,
+ 1.495635,2.242575,-0.502408, 1.565204,2.0856,-0.525778, 1.466456,2.0856,-0.762958,
+ 1.333693,2.0856,-0.97878, 1.274414,2.242575,-0.935276, 1.401276,2.242575,-0.729046,
+ 1.401276,2.242575,-0.729046, 1.466456,2.0856,-0.762958, 1.333693,2.0856,-0.97878,
+ 1.17008,2.0856,-1.17008, 1.118073,2.242575,-1.118073, 1.274414,2.242575,-0.935276,
+ 1.274414,2.242575,-0.935276, 1.333693,2.0856,-0.97878, 1.17008,2.0856,-1.17008,
+ 0.97878,2.0856,-1.333693, 0.935276,2.242575,-1.274414, 1.118073,2.242575,-1.118073,
+ 1.118073,2.242575,-1.118073, 1.17008,2.0856,-1.17008, 0.97878,2.0856,-1.333693,
+ 0.762958,2.0856,-1.466456, 0.729046,2.242575,-1.401276, 0.935276,2.242575,-1.274414,
+ 0.935276,2.242575,-1.274414, 0.97878,2.0856,-1.333693, 0.762958,2.0856,-1.466456,
+ 0.525778,2.0856,-1.565204, 0.502408,2.242575,-1.495635, 0.729046,2.242575,-1.401276,
+ 0.729046,2.242575,-1.401276, 0.762958,2.0856,-1.466456, 0.525778,2.0856,-1.565204,
+ 0.270404,2.0856,-1.626774, 0.258385,2.242575,-1.554467, 0.502408,2.242575,-1.495635,
+ 0.502408,2.242575,-1.495635, 0.525778,2.0856,-1.565204, 0.270404,2.0856,-1.626774,
+ 0,2.0856,-1.648, 0,2.242575,-1.57475, 0.258385,2.242575,-1.554467,
+ 0.258385,2.242575,-1.554467, 0.270404,2.0856,-1.626774, 0,2.0856,-1.648,
+ 1.696119,1.929525,-0.28193, 1.626774,2.0856,-0.270404, 1.648,2.0856,0,
+ 1.648,2.0856,0, 1.71825,1.929525,0, 1.696119,1.929525,-0.28193,
+ 1.631925,1.929525,-0.54819, 1.565204,2.0856,-0.525778, 1.626774,2.0856,-0.270404,
+ 1.626774,2.0856,-0.270404, 1.696119,1.929525,-0.28193, 1.631925,1.929525,-0.54819,
+ 1.528968,1.929525,-0.795481, 1.466456,2.0856,-0.762958, 1.565204,2.0856,-0.525778,
+ 1.565204,2.0856,-0.525778, 1.631925,1.929525,-0.54819, 1.528968,1.929525,-0.795481,
+ 1.390545,1.929525,-1.020503, 1.333693,2.0856,-0.97878, 1.466456,2.0856,-0.762958,
+ 1.466456,2.0856,-0.762958, 1.528968,1.929525,-0.795481, 1.390545,1.929525,-1.020503,
+ 1.219958,1.929525,-1.219958, 1.17008,2.0856,-1.17008, 1.333693,2.0856,-0.97878,
+ 1.333693,2.0856,-0.97878, 1.390545,1.929525,-1.020503, 1.219958,1.929525,-1.219958,
+ 1.020503,1.929525,-1.390545, 0.97878,2.0856,-1.333693, 1.17008,2.0856,-1.17008,
+ 1.17008,2.0856,-1.17008, 1.219958,1.929525,-1.219958, 1.020503,1.929525,-1.390545,
+ 0.795481,1.929525,-1.528968, 0.762958,2.0856,-1.466456, 0.97878,2.0856,-1.333693,
+ 0.97878,2.0856,-1.333693, 1.020503,1.929525,-1.390545, 0.795481,1.929525,-1.528968,
+ 0.54819,1.929525,-1.631925, 0.525778,2.0856,-1.565204, 0.762958,2.0856,-1.466456,
+ 0.762958,2.0856,-1.466456, 0.795481,1.929525,-1.528968, 0.54819,1.929525,-1.631925,
+ 0.28193,1.929525,-1.696119, 0.270404,2.0856,-1.626774, 0.525778,2.0856,-1.565204,
+ 0.525778,2.0856,-1.565204, 0.54819,1.929525,-1.631925, 0.28193,1.929525,-1.696119,
+ 0,1.929525,-1.71825, 0,2.0856,-1.648, 0.270404,2.0856,-1.626774,
+ 0.270404,2.0856,-1.626774, 0.28193,1.929525,-1.696119, 0,1.929525,-1.71825,
+ 1.761022,1.7748,-0.292719, 1.696119,1.929525,-0.28193, 1.71825,1.929525,0,
+ 1.71825,1.929525,0, 1.784,1.7748,0, 1.761022,1.7748,-0.292719,
+ 1.694372,1.7748,-0.569167, 1.631925,1.929525,-0.54819, 1.696119,1.929525,-0.28193,
+ 1.696119,1.929525,-0.28193, 1.761022,1.7748,-0.292719, 1.694372,1.7748,-0.569167,
+ 1.587475,1.7748,-0.825921, 1.528968,1.929525,-0.795481, 1.631925,1.929525,-0.54819,
+ 1.631925,1.929525,-0.54819, 1.694372,1.7748,-0.569167, 1.587475,1.7748,-0.825921,
+ 1.443756,1.7748,-1.059553, 1.390545,1.929525,-1.020503, 1.528968,1.929525,-0.795481,
+ 1.528968,1.929525,-0.795481, 1.587475,1.7748,-0.825921, 1.443756,1.7748,-1.059553,
+ 1.26664,1.7748,-1.26664, 1.219958,1.929525,-1.219958, 1.390545,1.929525,-1.020503,
+ 1.390545,1.929525,-1.020503, 1.443756,1.7748,-1.059553, 1.26664,1.7748,-1.26664,
+ 1.059553,1.7748,-1.443756, 1.020503,1.929525,-1.390545, 1.219958,1.929525,-1.219958,
+ 1.219958,1.929525,-1.219958, 1.26664,1.7748,-1.26664, 1.059553,1.7748,-1.443756,
+ 0.825921,1.7748,-1.587475, 0.795481,1.929525,-1.528968, 1.020503,1.929525,-1.390545,
+ 1.020503,1.929525,-1.390545, 1.059553,1.7748,-1.443756, 0.825921,1.7748,-1.587475,
+ 0.569167,1.7748,-1.694372, 0.54819,1.929525,-1.631925, 0.795481,1.929525,-1.528968,
+ 0.795481,1.929525,-1.528968, 0.825921,1.7748,-1.587475, 0.569167,1.7748,-1.694372,
+ 0.292719,1.7748,-1.761022, 0.28193,1.929525,-1.696119, 0.54819,1.929525,-1.631925,
+ 0.54819,1.929525,-1.631925, 0.569167,1.7748,-1.694372, 0.292719,1.7748,-1.761022,
+ 0,1.7748,-1.784, 0,1.929525,-1.71825, 0.28193,1.929525,-1.696119,
+ 0.28193,1.929525,-1.696119, 0.292719,1.7748,-1.761022, 0,1.7748,-1.784,
+ 1.820003,1.621875,-0.302523, 1.761022,1.7748,-0.292719, 1.784,1.7748,0,
+ 1.784,1.7748,0, 1.84375,1.621875,0, 1.820003,1.621875,-0.302523,
+ 1.75112,1.621875,-0.58823, 1.694372,1.7748,-0.569167, 1.761022,1.7748,-0.292719,
+ 1.761022,1.7748,-0.292719, 1.820003,1.621875,-0.302523, 1.75112,1.621875,-0.58823,
+ 1.640643,1.621875,-0.853583, 1.587475,1.7748,-0.825921, 1.694372,1.7748,-0.569167,
+ 1.694372,1.7748,-0.569167, 1.75112,1.621875,-0.58823, 1.640643,1.621875,-0.853583,
+ 1.49211,1.621875,-1.09504, 1.443756,1.7748,-1.059553, 1.587475,1.7748,-0.825921,
+ 1.587475,1.7748,-0.825921, 1.640643,1.621875,-0.853583, 1.49211,1.621875,-1.09504,
+ 1.309063,1.621875,-1.309063, 1.26664,1.7748,-1.26664, 1.443756,1.7748,-1.059553,
+ 1.443756,1.7748,-1.059553, 1.49211,1.621875,-1.09504, 1.309063,1.621875,-1.309063,
+ 1.09504,1.621875,-1.49211, 1.059553,1.7748,-1.443756, 1.26664,1.7748,-1.26664,
+ 1.26664,1.7748,-1.26664, 1.309063,1.621875,-1.309063, 1.09504,1.621875,-1.49211,
+ 0.853583,1.621875,-1.640643, 0.825921,1.7748,-1.587475, 1.059553,1.7748,-1.443756,
+ 1.059553,1.7748,-1.443756, 1.09504,1.621875,-1.49211, 0.853583,1.621875,-1.640643,
+ 0.58823,1.621875,-1.75112, 0.569167,1.7748,-1.694372, 0.825921,1.7748,-1.587475,
+ 0.825921,1.7748,-1.587475, 0.853583,1.621875,-1.640643, 0.58823,1.621875,-1.75112,
+ 0.302522,1.621875,-1.820003, 0.292719,1.7748,-1.761022, 0.569167,1.7748,-1.694372,
+ 0.569167,1.7748,-1.694372, 0.58823,1.621875,-1.75112, 0.302522,1.621875,-1.820003,
+ 0,1.621875,-1.84375, 0,1.7748,-1.784, 0.292719,1.7748,-1.761022,
+ 0.292719,1.7748,-1.761022, 0.302522,1.621875,-1.820003, 0,1.621875,-1.84375,
+ 1.87158,1.4712,-0.311096, 1.820003,1.621875,-0.302523, 1.84375,1.621875,0,
+ 1.84375,1.621875,0, 1.896,1.4712,0, 1.87158,1.4712,-0.311096,
+ 1.800745,1.4712,-0.6049, 1.75112,1.621875,-0.58823, 1.820003,1.621875,-0.302523,
+ 1.820003,1.621875,-0.302523, 1.87158,1.4712,-0.311096, 1.800745,1.4712,-0.6049,
+ 1.687137,1.4712,-0.877772, 1.640643,1.621875,-0.853583, 1.75112,1.621875,-0.58823,
+ 1.75112,1.621875,-0.58823, 1.800745,1.4712,-0.6049, 1.687137,1.4712,-0.877772,
+ 1.534395,1.4712,-1.126072, 1.49211,1.621875,-1.09504, 1.640643,1.621875,-0.853583,
+ 1.640643,1.621875,-0.853583, 1.687137,1.4712,-0.877772, 1.534395,1.4712,-1.126072,
+ 1.34616,1.4712,-1.34616, 1.309063,1.621875,-1.309063, 1.49211,1.621875,-1.09504,
+ 1.49211,1.621875,-1.09504, 1.534395,1.4712,-1.126072, 1.34616,1.4712,-1.34616,
+ 1.126072,1.4712,-1.534395, 1.09504,1.621875,-1.49211, 1.309063,1.621875,-1.309063,
+ 1.309063,1.621875,-1.309063, 1.34616,1.4712,-1.34616, 1.126072,1.4712,-1.534395,
+ 0.877772,1.4712,-1.687137, 0.853583,1.621875,-1.640643, 1.09504,1.621875,-1.49211,
+ 1.09504,1.621875,-1.49211, 1.126072,1.4712,-1.534395, 0.877772,1.4712,-1.687137,
+ 0.6049,1.4712,-1.800745, 0.58823,1.621875,-1.75112, 0.853583,1.621875,-1.640643,
+ 0.853583,1.621875,-1.640643, 0.877772,1.4712,-1.687137, 0.6049,1.4712,-1.800745,
+ 0.311096,1.4712,-1.87158, 0.302522,1.621875,-1.820003, 0.58823,1.621875,-1.75112,
+ 0.58823,1.621875,-1.75112, 0.6049,1.4712,-1.800745, 0.311096,1.4712,-1.87158,
+ 0,1.4712,-1.896, 0,1.621875,-1.84375, 0.302522,1.621875,-1.820003,
+ 0.302522,1.621875,-1.820003, 0.311096,1.4712,-1.87158, 0,1.4712,-1.896,
+ 1.914272,1.323225,-0.318192, 1.87158,1.4712,-0.311096, 1.896,1.4712,0,
+ 1.896,1.4712,0, 1.93925,1.323225,0, 1.914272,1.323225,-0.318192,
+ 1.841822,1.323225,-0.618698, 1.800745,1.4712,-0.6049, 1.87158,1.4712,-0.311096,
+ 1.87158,1.4712,-0.311096, 1.914272,1.323225,-0.318192, 1.841822,1.323225,-0.618698,
+ 1.725622,1.323225,-0.897795, 1.687137,1.4712,-0.877772, 1.800745,1.4712,-0.6049,
+ 1.800745,1.4712,-0.6049, 1.841822,1.323225,-0.618698, 1.725622,1.323225,-0.897795,
+ 1.569396,1.323225,-1.151759, 1.534395,1.4712,-1.126072, 1.687137,1.4712,-0.877772,
+ 1.687137,1.4712,-0.877772, 1.725622,1.323225,-0.897795, 1.569396,1.323225,-1.151759,
+ 1.376867,1.323225,-1.376868, 1.34616,1.4712,-1.34616, 1.534395,1.4712,-1.126072,
+ 1.534395,1.4712,-1.126072, 1.569396,1.323225,-1.151759, 1.376867,1.323225,-1.376868,
+ 1.151759,1.323225,-1.569396, 1.126072,1.4712,-1.534395, 1.34616,1.4712,-1.34616,
+ 1.34616,1.4712,-1.34616, 1.376867,1.323225,-1.376868, 1.151759,1.323225,-1.569396,
+ 0.897795,1.323225,-1.725622, 0.877772,1.4712,-1.687137, 1.126072,1.4712,-1.534395,
+ 1.126072,1.4712,-1.534395, 1.151759,1.323225,-1.569396, 0.897795,1.323225,-1.725622,
+ 0.618698,1.323225,-1.841822, 0.6049,1.4712,-1.800745, 0.877772,1.4712,-1.687137,
+ 0.877772,1.4712,-1.687137, 0.897795,1.323225,-1.725622, 0.618698,1.323225,-1.841822,
+ 0.318192,1.323225,-1.914272, 0.311096,1.4712,-1.87158, 0.6049,1.4712,-1.800745,
+ 0.6049,1.4712,-1.800745, 0.618698,1.323225,-1.841822, 0.318192,1.323225,-1.914272,
+ 0,1.323225,-1.93925, 0,1.4712,-1.896, 0.311096,1.4712,-1.87158,
+ 0.311096,1.4712,-1.87158, 0.318192,1.323225,-1.914272, 0,1.323225,-1.93925,
+ 1.946601,1.1784,-0.323566, 1.914272,1.323225,-0.318192, 1.93925,1.323225,0,
+ 1.93925,1.323225,0, 1.972,1.1784,0, 1.946601,1.1784,-0.323566,
+ 1.872927,1.1784,-0.629147, 1.841822,1.323225,-0.618698, 1.914272,1.323225,-0.318192,
+ 1.914272,1.323225,-0.318192, 1.946601,1.1784,-0.323566, 1.872927,1.1784,-0.629147,
+ 1.754764,1.1784,-0.912957, 1.725622,1.323225,-0.897795, 1.841822,1.323225,-0.618698,
+ 1.841822,1.323225,-0.618698, 1.872927,1.1784,-0.629147, 1.754764,1.1784,-0.912957,
+ 1.5959,1.1784,-1.17121, 1.569396,1.323225,-1.151759, 1.725622,1.323225,-0.897795,
+ 1.725622,1.323225,-0.897795, 1.754764,1.1784,-0.912957, 1.5959,1.1784,-1.17121,
+ 1.40012,1.1784,-1.40012, 1.376867,1.323225,-1.376868, 1.569396,1.323225,-1.151759,
+ 1.569396,1.323225,-1.151759, 1.5959,1.1784,-1.17121, 1.40012,1.1784,-1.40012,
+ 1.17121,1.1784,-1.5959, 1.151759,1.323225,-1.569396, 1.376867,1.323225,-1.376868,
+ 1.376867,1.323225,-1.376868, 1.40012,1.1784,-1.40012, 1.17121,1.1784,-1.5959,
+ 0.912957,1.1784,-1.754764, 0.897795,1.323225,-1.725622, 1.151759,1.323225,-1.569396,
+ 1.151759,1.323225,-1.569396, 1.17121,1.1784,-1.5959, 0.912957,1.1784,-1.754764,
+ 0.629147,1.1784,-1.872927, 0.618698,1.323225,-1.841822, 0.897795,1.323225,-1.725622,
+ 0.897795,1.323225,-1.725622, 0.912957,1.1784,-1.754764, 0.629147,1.1784,-1.872927,
+ 0.323566,1.1784,-1.946601, 0.318192,1.323225,-1.914272, 0.618698,1.323225,-1.841822,
+ 0.618698,1.323225,-1.841822, 0.629147,1.1784,-1.872927, 0.323566,1.1784,-1.946601,
+ 0,1.1784,-1.972, 0,1.323225,-1.93925, 0.318192,1.323225,-1.914272,
+ 0.318192,1.323225,-1.914272, 0.323566,1.1784,-1.946601, 0,1.1784,-1.972,
+ 1.967083,1.037175,-0.32697, 1.946601,1.1784,-0.323566, 1.972,1.1784,0,
+ 1.972,1.1784,0, 1.99275,1.037175,0, 1.967083,1.037175,-0.32697,
+ 1.892634,1.037175,-0.635767, 1.872927,1.1784,-0.629147, 1.946601,1.1784,-0.323566,
+ 1.946601,1.1784,-0.323566, 1.967083,1.037175,-0.32697, 1.892634,1.037175,-0.635767,
+ 1.773229,1.037175,-0.922564, 1.754764,1.1784,-0.912957, 1.872927,1.1784,-0.629147,
+ 1.872927,1.1784,-0.629147, 1.892634,1.037175,-0.635767, 1.773229,1.037175,-0.922564,
+ 1.612693,1.037175,-1.183534, 1.5959,1.1784,-1.17121, 1.754764,1.1784,-0.912957,
+ 1.754764,1.1784,-0.912957, 1.773229,1.037175,-0.922564, 1.612693,1.037175,-1.183534,
+ 1.414853,1.037175,-1.414853, 1.40012,1.1784,-1.40012, 1.5959,1.1784,-1.17121,
+ 1.5959,1.1784,-1.17121, 1.612693,1.037175,-1.183534, 1.414853,1.037175,-1.414853,
+ 1.183534,1.037175,-1.612693, 1.17121,1.1784,-1.5959, 1.40012,1.1784,-1.40012,
+ 1.40012,1.1784,-1.40012, 1.414853,1.037175,-1.414853, 1.183534,1.037175,-1.612693,
+ 0.922564,1.037175,-1.773229, 0.912957,1.1784,-1.754764, 1.17121,1.1784,-1.5959,
+ 1.17121,1.1784,-1.5959, 1.183534,1.037175,-1.612693, 0.922564,1.037175,-1.773229,
+ 0.635767,1.037175,-1.892634, 0.629147,1.1784,-1.872927, 0.912957,1.1784,-1.754764,
+ 0.912957,1.1784,-1.754764, 0.922564,1.037175,-1.773229, 0.635767,1.037175,-1.892634,
+ 0.32697,1.037175,-1.967083, 0.323566,1.1784,-1.946601, 0.629147,1.1784,-1.872927,
+ 0.629147,1.1784,-1.872927, 0.635767,1.037175,-1.892634, 0.32697,1.037175,-1.967083,
+ 0,1.037175,-1.99275, 0,1.1784,-1.972, 0.323566,1.1784,-1.946601,
+ 0.323566,1.1784,-1.946601, 0.32697,1.037175,-1.967083, 0,1.037175,-1.99275,
+ 1.97424,0.9,-0.32816, 1.967083,1.037175,-0.32697, 1.99275,1.037175,0,
+ 1.99275,1.037175,0, 2,0.9,0, 1.97424,0.9,-0.32816,
+ 1.89952,0.9,-0.63808, 1.892634,1.037175,-0.635767, 1.967083,1.037175,-0.32697,
+ 1.967083,1.037175,-0.32697, 1.97424,0.9,-0.32816, 1.89952,0.9,-0.63808,
+ 1.77968,0.9,-0.92592, 1.773229,1.037175,-0.922564, 1.892634,1.037175,-0.635767,
+ 1.892634,1.037175,-0.635767, 1.89952,0.9,-0.63808, 1.77968,0.9,-0.92592,
+ 1.61856,0.9,-1.18784, 1.612693,1.037175,-1.183534, 1.773229,1.037175,-0.922564,
+ 1.773229,1.037175,-0.922564, 1.77968,0.9,-0.92592, 1.61856,0.9,-1.18784,
+ 1.42,0.9,-1.42, 1.414853,1.037175,-1.414853, 1.612693,1.037175,-1.183534,
+ 1.612693,1.037175,-1.183534, 1.61856,0.9,-1.18784, 1.42,0.9,-1.42,
+ 1.18784,0.9,-1.61856, 1.183534,1.037175,-1.612693, 1.414853,1.037175,-1.414853,
+ 1.414853,1.037175,-1.414853, 1.42,0.9,-1.42, 1.18784,0.9,-1.61856,
+ 0.92592,0.9,-1.77968, 0.922564,1.037175,-1.773229, 1.183534,1.037175,-1.612693,
+ 1.183534,1.037175,-1.612693, 1.18784,0.9,-1.61856, 0.92592,0.9,-1.77968,
+ 0.63808,0.9,-1.89952, 0.635767,1.037175,-1.892634, 0.922564,1.037175,-1.773229,
+ 0.922564,1.037175,-1.773229, 0.92592,0.9,-1.77968, 0.63808,0.9,-1.89952,
+ 0.32816,0.9,-1.97424, 0.32697,1.037175,-1.967083, 0.635767,1.037175,-1.892634,
+ 0.635767,1.037175,-1.892634, 0.63808,0.9,-1.89952, 0.32816,0.9,-1.97424,
+ 0,0.9,-2, 0,1.037175,-1.99275, 0.32697,1.037175,-1.967083,
+ 0.32697,1.037175,-1.967083, 0.32816,0.9,-1.97424, 0,0.9,-2,
+ -0.258385,2.242575,-1.554467, -0.24612,2.4,-1.48068, 0,2.4,-1.5,
+ 0,2.4,-1.5, 0,2.242575,-1.57475, -0.258385,2.242575,-1.554467,
+ -0.502408,2.242575,-1.495635, -0.47856,2.4,-1.42464, -0.24612,2.4,-1.48068,
+ -0.24612,2.4,-1.48068, -0.258385,2.242575,-1.554467, -0.502408,2.242575,-1.495635,
+ -0.729046,2.242575,-1.401276, -0.69444,2.4,-1.33476, -0.47856,2.4,-1.42464,
+ -0.47856,2.4,-1.42464, -0.502408,2.242575,-1.495635, -0.729046,2.242575,-1.401276,
+ -0.935276,2.242575,-1.274414, -0.89088,2.4,-1.21392, -0.69444,2.4,-1.33476,
+ -0.69444,2.4,-1.33476, -0.729046,2.242575,-1.401276, -0.935276,2.242575,-1.274414,
+ -1.118073,2.242575,-1.118073, -1.065,2.4,-1.065, -0.89088,2.4,-1.21392,
+ -0.89088,2.4,-1.21392, -0.935276,2.242575,-1.274414, -1.118073,2.242575,-1.118073,
+ -1.274414,2.242575,-0.935276, -1.21392,2.4,-0.89088, -1.065,2.4,-1.065,
+ -1.065,2.4,-1.065, -1.118073,2.242575,-1.118073, -1.274414,2.242575,-0.935276,
+ -1.401276,2.242575,-0.729046, -1.33476,2.4,-0.69444, -1.21392,2.4,-0.89088,
+ -1.21392,2.4,-0.89088, -1.274414,2.242575,-0.935276, -1.401276,2.242575,-0.729046,
+ -1.495635,2.242575,-0.502408, -1.42464,2.4,-0.47856, -1.33476,2.4,-0.69444,
+ -1.33476,2.4,-0.69444, -1.401276,2.242575,-0.729046, -1.495635,2.242575,-0.502408,
+ -1.554467,2.242575,-0.258385, -1.48068,2.4,-0.24612, -1.42464,2.4,-0.47856,
+ -1.42464,2.4,-0.47856, -1.495635,2.242575,-0.502408, -1.554467,2.242575,-0.258385,
+ -1.57475,2.242575,0, -1.5,2.4,0, -1.48068,2.4,-0.24612,
+ -1.48068,2.4,-0.24612, -1.554467,2.242575,-0.258385, -1.57475,2.242575,0,
+ -0.270404,2.0856,-1.626774, -0.258385,2.242575,-1.554467, 0,2.242575,-1.57475,
+ 0,2.242575,-1.57475, 0,2.0856,-1.648, -0.270404,2.0856,-1.626774,
+ -0.525778,2.0856,-1.565204, -0.502408,2.242575,-1.495635, -0.258385,2.242575,-1.554467,
+ -0.258385,2.242575,-1.554467, -0.270404,2.0856,-1.626774, -0.525778,2.0856,-1.565204,
+ -0.762958,2.0856,-1.466456, -0.729046,2.242575,-1.401276, -0.502408,2.242575,-1.495635,
+ -0.502408,2.242575,-1.495635, -0.525778,2.0856,-1.565204, -0.762958,2.0856,-1.466456,
+ -0.97878,2.0856,-1.333693, -0.935276,2.242575,-1.274414, -0.729046,2.242575,-1.401276,
+ -0.729046,2.242575,-1.401276, -0.762958,2.0856,-1.466456, -0.97878,2.0856,-1.333693,
+ -1.17008,2.0856,-1.17008, -1.118073,2.242575,-1.118073, -0.935276,2.242575,-1.274414,
+ -0.935276,2.242575,-1.274414, -0.97878,2.0856,-1.333693, -1.17008,2.0856,-1.17008,
+ -1.333693,2.0856,-0.97878, -1.274414,2.242575,-0.935276, -1.118073,2.242575,-1.118073,
+ -1.118073,2.242575,-1.118073, -1.17008,2.0856,-1.17008, -1.333693,2.0856,-0.97878,
+ -1.466456,2.0856,-0.762958, -1.401276,2.242575,-0.729046, -1.274414,2.242575,-0.935276,
+ -1.274414,2.242575,-0.935276, -1.333693,2.0856,-0.97878, -1.466456,2.0856,-0.762958,
+ -1.565204,2.0856,-0.525778, -1.495635,2.242575,-0.502408, -1.401276,2.242575,-0.729046,
+ -1.401276,2.242575,-0.729046, -1.466456,2.0856,-0.762958, -1.565204,2.0856,-0.525778,
+ -1.626774,2.0856,-0.270404, -1.554467,2.242575,-0.258385, -1.495635,2.242575,-0.502408,
+ -1.495635,2.242575,-0.502408, -1.565204,2.0856,-0.525778, -1.626774,2.0856,-0.270404,
+ -1.648,2.0856,0, -1.57475,2.242575,0, -1.554467,2.242575,-0.258385,
+ -1.554467,2.242575,-0.258385, -1.626774,2.0856,-0.270404, -1.648,2.0856,0,
+ -0.28193,1.929525,-1.696119, -0.270404,2.0856,-1.626774, 0,2.0856,-1.648,
+ 0,2.0856,-1.648, 0,1.929525,-1.71825, -0.28193,1.929525,-1.696119,
+ -0.54819,1.929525,-1.631925, -0.525778,2.0856,-1.565204, -0.270404,2.0856,-1.626774,
+ -0.270404,2.0856,-1.626774, -0.28193,1.929525,-1.696119, -0.54819,1.929525,-1.631925,
+ -0.795481,1.929525,-1.528968, -0.762958,2.0856,-1.466456, -0.525778,2.0856,-1.565204,
+ -0.525778,2.0856,-1.565204, -0.54819,1.929525,-1.631925, -0.795481,1.929525,-1.528968,
+ -1.020503,1.929525,-1.390545, -0.97878,2.0856,-1.333693, -0.762958,2.0856,-1.466456,
+ -0.762958,2.0856,-1.466456, -0.795481,1.929525,-1.528968, -1.020503,1.929525,-1.390545,
+ -1.219958,1.929525,-1.219958, -1.17008,2.0856,-1.17008, -0.97878,2.0856,-1.333693,
+ -0.97878,2.0856,-1.333693, -1.020503,1.929525,-1.390545, -1.219958,1.929525,-1.219958,
+ -1.390545,1.929525,-1.020503, -1.333693,2.0856,-0.97878, -1.17008,2.0856,-1.17008,
+ -1.17008,2.0856,-1.17008, -1.219958,1.929525,-1.219958, -1.390545,1.929525,-1.020503,
+ -1.528968,1.929525,-0.795481, -1.466456,2.0856,-0.762958, -1.333693,2.0856,-0.97878,
+ -1.333693,2.0856,-0.97878, -1.390545,1.929525,-1.020503, -1.528968,1.929525,-0.795481,
+ -1.631925,1.929525,-0.54819, -1.565204,2.0856,-0.525778, -1.466456,2.0856,-0.762958,
+ -1.466456,2.0856,-0.762958, -1.528968,1.929525,-0.795481, -1.631925,1.929525,-0.54819,
+ -1.696119,1.929525,-0.28193, -1.626774,2.0856,-0.270404, -1.565204,2.0856,-0.525778,
+ -1.565204,2.0856,-0.525778, -1.631925,1.929525,-0.54819, -1.696119,1.929525,-0.28193,
+ -1.71825,1.929525,0, -1.648,2.0856,0, -1.626774,2.0856,-0.270404,
+ -1.626774,2.0856,-0.270404, -1.696119,1.929525,-0.28193, -1.71825,1.929525,0,
+ -0.292719,1.7748,-1.761022, -0.28193,1.929525,-1.696119, 0,1.929525,-1.71825,
+ 0,1.929525,-1.71825, 0,1.7748,-1.784, -0.292719,1.7748,-1.761022,
+ -0.569167,1.7748,-1.694372, -0.54819,1.929525,-1.631925, -0.28193,1.929525,-1.696119,
+ -0.28193,1.929525,-1.696119, -0.292719,1.7748,-1.761022, -0.569167,1.7748,-1.694372,
+ -0.825921,1.7748,-1.587475, -0.795481,1.929525,-1.528968, -0.54819,1.929525,-1.631925,
+ -0.54819,1.929525,-1.631925, -0.569167,1.7748,-1.694372, -0.825921,1.7748,-1.587475,
+ -1.059553,1.7748,-1.443756, -1.020503,1.929525,-1.390545, -0.795481,1.929525,-1.528968,
+ -0.795481,1.929525,-1.528968, -0.825921,1.7748,-1.587475, -1.059553,1.7748,-1.443756,
+ -1.26664,1.7748,-1.26664, -1.219958,1.929525,-1.219958, -1.020503,1.929525,-1.390545,
+ -1.020503,1.929525,-1.390545, -1.059553,1.7748,-1.443756, -1.26664,1.7748,-1.26664,
+ -1.443756,1.7748,-1.059553, -1.390545,1.929525,-1.020503, -1.219958,1.929525,-1.219958,
+ -1.219958,1.929525,-1.219958, -1.26664,1.7748,-1.26664, -1.443756,1.7748,-1.059553,
+ -1.587475,1.7748,-0.825921, -1.528968,1.929525,-0.795481, -1.390545,1.929525,-1.020503,
+ -1.390545,1.929525,-1.020503, -1.443756,1.7748,-1.059553, -1.587475,1.7748,-0.825921,
+ -1.694372,1.7748,-0.569167, -1.631925,1.929525,-0.54819, -1.528968,1.929525,-0.795481,
+ -1.528968,1.929525,-0.795481, -1.587475,1.7748,-0.825921, -1.694372,1.7748,-0.569167,
+ -1.761022,1.7748,-0.292719, -1.696119,1.929525,-0.28193, -1.631925,1.929525,-0.54819,
+ -1.631925,1.929525,-0.54819, -1.694372,1.7748,-0.569167, -1.761022,1.7748,-0.292719,
+ -1.784,1.7748,0, -1.71825,1.929525,0, -1.696119,1.929525,-0.28193,
+ -1.696119,1.929525,-0.28193, -1.761022,1.7748,-0.292719, -1.784,1.7748,0,
+ -0.302523,1.621875,-1.820003, -0.292719,1.7748,-1.761022, 0,1.7748,-1.784,
+ 0,1.7748,-1.784, 0,1.621875,-1.84375, -0.302523,1.621875,-1.820003,
+ -0.58823,1.621875,-1.75112, -0.569167,1.7748,-1.694372, -0.292719,1.7748,-1.761022,
+ -0.292719,1.7748,-1.761022, -0.302523,1.621875,-1.820003, -0.58823,1.621875,-1.75112,
+ -0.853583,1.621875,-1.640643, -0.825921,1.7748,-1.587475, -0.569167,1.7748,-1.694372,
+ -0.569167,1.7748,-1.694372, -0.58823,1.621875,-1.75112, -0.853583,1.621875,-1.640643,
+ -1.09504,1.621875,-1.49211, -1.059553,1.7748,-1.443756, -0.825921,1.7748,-1.587475,
+ -0.825921,1.7748,-1.587475, -0.853583,1.621875,-1.640643, -1.09504,1.621875,-1.49211,
+ -1.309063,1.621875,-1.309063, -1.26664,1.7748,-1.26664, -1.059553,1.7748,-1.443756,
+ -1.059553,1.7748,-1.443756, -1.09504,1.621875,-1.49211, -1.309063,1.621875,-1.309063,
+ -1.49211,1.621875,-1.09504, -1.443756,1.7748,-1.059553, -1.26664,1.7748,-1.26664,
+ -1.26664,1.7748,-1.26664, -1.309063,1.621875,-1.309063, -1.49211,1.621875,-1.09504,
+ -1.640643,1.621875,-0.853583, -1.587475,1.7748,-0.825921, -1.443756,1.7748,-1.059553,
+ -1.443756,1.7748,-1.059553, -1.49211,1.621875,-1.09504, -1.640643,1.621875,-0.853583,
+ -1.75112,1.621875,-0.58823, -1.694372,1.7748,-0.569167, -1.587475,1.7748,-0.825921,
+ -1.587475,1.7748,-0.825921, -1.640643,1.621875,-0.853583, -1.75112,1.621875,-0.58823,
+ -1.820003,1.621875,-0.302522, -1.761022,1.7748,-0.292719, -1.694372,1.7748,-0.569167,
+ -1.694372,1.7748,-0.569167, -1.75112,1.621875,-0.58823, -1.820003,1.621875,-0.302522,
+ -1.84375,1.621875,0, -1.784,1.7748,0, -1.761022,1.7748,-0.292719,
+ -1.761022,1.7748,-0.292719, -1.820003,1.621875,-0.302522, -1.84375,1.621875,0,
+ -0.311096,1.4712,-1.87158, -0.302523,1.621875,-1.820003, 0,1.621875,-1.84375,
+ 0,1.621875,-1.84375, 0,1.4712,-1.896, -0.311096,1.4712,-1.87158,
+ -0.6049,1.4712,-1.800745, -0.58823,1.621875,-1.75112, -0.302523,1.621875,-1.820003,
+ -0.302523,1.621875,-1.820003, -0.311096,1.4712,-1.87158, -0.6049,1.4712,-1.800745,
+ -0.877772,1.4712,-1.687137, -0.853583,1.621875,-1.640643, -0.58823,1.621875,-1.75112,
+ -0.58823,1.621875,-1.75112, -0.6049,1.4712,-1.800745, -0.877772,1.4712,-1.687137,
+ -1.126072,1.4712,-1.534395, -1.09504,1.621875,-1.49211, -0.853583,1.621875,-1.640643,
+ -0.853583,1.621875,-1.640643, -0.877772,1.4712,-1.687137, -1.126072,1.4712,-1.534395,
+ -1.34616,1.4712,-1.34616, -1.309063,1.621875,-1.309063, -1.09504,1.621875,-1.49211,
+ -1.09504,1.621875,-1.49211, -1.126072,1.4712,-1.534395, -1.34616,1.4712,-1.34616,
+ -1.534395,1.4712,-1.126072, -1.49211,1.621875,-1.09504, -1.309063,1.621875,-1.309063,
+ -1.309063,1.621875,-1.309063, -1.34616,1.4712,-1.34616, -1.534395,1.4712,-1.126072,
+ -1.687137,1.4712,-0.877772, -1.640643,1.621875,-0.853583, -1.49211,1.621875,-1.09504,
+ -1.49211,1.621875,-1.09504, -1.534395,1.4712,-1.126072, -1.687137,1.4712,-0.877772,
+ -1.800745,1.4712,-0.6049, -1.75112,1.621875,-0.58823, -1.640643,1.621875,-0.853583,
+ -1.640643,1.621875,-0.853583, -1.687137,1.4712,-0.877772, -1.800745,1.4712,-0.6049,
+ -1.87158,1.4712,-0.311096, -1.820003,1.621875,-0.302522, -1.75112,1.621875,-0.58823,
+ -1.75112,1.621875,-0.58823, -1.800745,1.4712,-0.6049, -1.87158,1.4712,-0.311096,
+ -1.896,1.4712,0, -1.84375,1.621875,0, -1.820003,1.621875,-0.302522,
+ -1.820003,1.621875,-0.302522, -1.87158,1.4712,-0.311096, -1.896,1.4712,0,
+ -0.318192,1.323225,-1.914272, -0.311096,1.4712,-1.87158, 0,1.4712,-1.896,
+ 0,1.4712,-1.896, 0,1.323225,-1.93925, -0.318192,1.323225,-1.914272,
+ -0.618698,1.323225,-1.841822, -0.6049,1.4712,-1.800745, -0.311096,1.4712,-1.87158,
+ -0.311096,1.4712,-1.87158, -0.318192,1.323225,-1.914272, -0.618698,1.323225,-1.841822,
+ -0.897795,1.323225,-1.725622, -0.877772,1.4712,-1.687137, -0.6049,1.4712,-1.800745,
+ -0.6049,1.4712,-1.800745, -0.618698,1.323225,-1.841822, -0.897795,1.323225,-1.725622,
+ -1.151759,1.323225,-1.569396, -1.126072,1.4712,-1.534395, -0.877772,1.4712,-1.687137,
+ -0.877772,1.4712,-1.687137, -0.897795,1.323225,-1.725622, -1.151759,1.323225,-1.569396,
+ -1.376868,1.323225,-1.376867, -1.34616,1.4712,-1.34616, -1.126072,1.4712,-1.534395,
+ -1.126072,1.4712,-1.534395, -1.151759,1.323225,-1.569396, -1.376868,1.323225,-1.376867,
+ -1.569396,1.323225,-1.151759, -1.534395,1.4712,-1.126072, -1.34616,1.4712,-1.34616,
+ -1.34616,1.4712,-1.34616, -1.376868,1.323225,-1.376867, -1.569396,1.323225,-1.151759,
+ -1.725622,1.323225,-0.897795, -1.687137,1.4712,-0.877772, -1.534395,1.4712,-1.126072,
+ -1.534395,1.4712,-1.126072, -1.569396,1.323225,-1.151759, -1.725622,1.323225,-0.897795,
+ -1.841822,1.323225,-0.618698, -1.800745,1.4712,-0.6049, -1.687137,1.4712,-0.877772,
+ -1.687137,1.4712,-0.877772, -1.725622,1.323225,-0.897795, -1.841822,1.323225,-0.618698,
+ -1.914272,1.323225,-0.318192, -1.87158,1.4712,-0.311096, -1.800745,1.4712,-0.6049,
+ -1.800745,1.4712,-0.6049, -1.841822,1.323225,-0.618698, -1.914272,1.323225,-0.318192,
+ -1.93925,1.323225,0, -1.896,1.4712,0, -1.87158,1.4712,-0.311096,
+ -1.87158,1.4712,-0.311096, -1.914272,1.323225,-0.318192, -1.93925,1.323225,0,
+ -0.323566,1.1784,-1.946601, -0.318192,1.323225,-1.914272, 0,1.323225,-1.93925,
+ 0,1.323225,-1.93925, 0,1.1784,-1.972, -0.323566,1.1784,-1.946601,
+ -0.629147,1.1784,-1.872927, -0.618698,1.323225,-1.841822, -0.318192,1.323225,-1.914272,
+ -0.318192,1.323225,-1.914272, -0.323566,1.1784,-1.946601, -0.629147,1.1784,-1.872927,
+ -0.912957,1.1784,-1.754764, -0.897795,1.323225,-1.725622, -0.618698,1.323225,-1.841822,
+ -0.618698,1.323225,-1.841822, -0.629147,1.1784,-1.872927, -0.912957,1.1784,-1.754764,
+ -1.17121,1.1784,-1.5959, -1.151759,1.323225,-1.569396, -0.897795,1.323225,-1.725622,
+ -0.897795,1.323225,-1.725622, -0.912957,1.1784,-1.754764, -1.17121,1.1784,-1.5959,
+ -1.40012,1.1784,-1.40012, -1.376868,1.323225,-1.376867, -1.151759,1.323225,-1.569396,
+ -1.151759,1.323225,-1.569396, -1.17121,1.1784,-1.5959, -1.40012,1.1784,-1.40012,
+ -1.5959,1.1784,-1.17121, -1.569396,1.323225,-1.151759, -1.376868,1.323225,-1.376867,
+ -1.376868,1.323225,-1.376867, -1.40012,1.1784,-1.40012, -1.5959,1.1784,-1.17121,
+ -1.754764,1.1784,-0.912957, -1.725622,1.323225,-0.897795, -1.569396,1.323225,-1.151759,
+ -1.569396,1.323225,-1.151759, -1.5959,1.1784,-1.17121, -1.754764,1.1784,-0.912957,
+ -1.872927,1.1784,-0.629147, -1.841822,1.323225,-0.618698, -1.725622,1.323225,-0.897795,
+ -1.725622,1.323225,-0.897795, -1.754764,1.1784,-0.912957, -1.872927,1.1784,-0.629147,
+ -1.946601,1.1784,-0.323566, -1.914272,1.323225,-0.318192, -1.841822,1.323225,-0.618698,
+ -1.841822,1.323225,-0.618698, -1.872927,1.1784,-0.629147, -1.946601,1.1784,-0.323566,
+ -1.972,1.1784,0, -1.93925,1.323225,0, -1.914272,1.323225,-0.318192,
+ -1.914272,1.323225,-0.318192, -1.946601,1.1784,-0.323566, -1.972,1.1784,0,
+ -0.32697,1.037175,-1.967083, -0.323566,1.1784,-1.946601, 0,1.1784,-1.972,
+ 0,1.1784,-1.972, 0,1.037175,-1.99275, -0.32697,1.037175,-1.967083,
+ -0.635767,1.037175,-1.892634, -0.629147,1.1784,-1.872927, -0.323566,1.1784,-1.946601,
+ -0.323566,1.1784,-1.946601, -0.32697,1.037175,-1.967083, -0.635767,1.037175,-1.892634,
+ -0.922564,1.037175,-1.773229, -0.912957,1.1784,-1.754764, -0.629147,1.1784,-1.872927,
+ -0.629147,1.1784,-1.872927, -0.635767,1.037175,-1.892634, -0.922564,1.037175,-1.773229,
+ -1.183534,1.037175,-1.612693, -1.17121,1.1784,-1.5959, -0.912957,1.1784,-1.754764,
+ -0.912957,1.1784,-1.754764, -0.922564,1.037175,-1.773229, -1.183534,1.037175,-1.612693,
+ -1.414853,1.037175,-1.414853, -1.40012,1.1784,-1.40012, -1.17121,1.1784,-1.5959,
+ -1.17121,1.1784,-1.5959, -1.183534,1.037175,-1.612693, -1.414853,1.037175,-1.414853,
+ -1.612693,1.037175,-1.183534, -1.5959,1.1784,-1.17121, -1.40012,1.1784,-1.40012,
+ -1.40012,1.1784,-1.40012, -1.414853,1.037175,-1.414853, -1.612693,1.037175,-1.183534,
+ -1.773229,1.037175,-0.922564, -1.754764,1.1784,-0.912957, -1.5959,1.1784,-1.17121,
+ -1.5959,1.1784,-1.17121, -1.612693,1.037175,-1.183534, -1.773229,1.037175,-0.922564,
+ -1.892634,1.037175,-0.635767, -1.872927,1.1784,-0.629147, -1.754764,1.1784,-0.912957,
+ -1.754764,1.1784,-0.912957, -1.773229,1.037175,-0.922564, -1.892634,1.037175,-0.635767,
+ -1.967083,1.037175,-0.32697, -1.946601,1.1784,-0.323566, -1.872927,1.1784,-0.629147,
+ -1.872927,1.1784,-0.629147, -1.892634,1.037175,-0.635767, -1.967083,1.037175,-0.32697,
+ -1.99275,1.037175,0, -1.972,1.1784,0, -1.946601,1.1784,-0.323566,
+ -1.946601,1.1784,-0.323566, -1.967083,1.037175,-0.32697, -1.99275,1.037175,0,
+ -0.32816,0.9,-1.97424, -0.32697,1.037175,-1.967083, 0,1.037175,-1.99275,
+ 0,1.037175,-1.99275, 0,0.9,-2, -0.32816,0.9,-1.97424,
+ -0.63808,0.9,-1.89952, -0.635767,1.037175,-1.892634, -0.32697,1.037175,-1.967083,
+ -0.32697,1.037175,-1.967083, -0.32816,0.9,-1.97424, -0.63808,0.9,-1.89952,
+ -0.92592,0.9,-1.77968, -0.922564,1.037175,-1.773229, -0.635767,1.037175,-1.892634,
+ -0.635767,1.037175,-1.892634, -0.63808,0.9,-1.89952, -0.92592,0.9,-1.77968,
+ -1.18784,0.9,-1.61856, -1.183534,1.037175,-1.612693, -0.922564,1.037175,-1.773229,
+ -0.922564,1.037175,-1.773229, -0.92592,0.9,-1.77968, -1.18784,0.9,-1.61856,
+ -1.42,0.9,-1.42, -1.414853,1.037175,-1.414853, -1.183534,1.037175,-1.612693,
+ -1.183534,1.037175,-1.612693, -1.18784,0.9,-1.61856, -1.42,0.9,-1.42,
+ -1.61856,0.9,-1.18784, -1.612693,1.037175,-1.183534, -1.414853,1.037175,-1.414853,
+ -1.414853,1.037175,-1.414853, -1.42,0.9,-1.42, -1.61856,0.9,-1.18784,
+ -1.77968,0.9,-0.92592, -1.773229,1.037175,-0.922564, -1.612693,1.037175,-1.183534,
+ -1.612693,1.037175,-1.183534, -1.61856,0.9,-1.18784, -1.77968,0.9,-0.92592,
+ -1.89952,0.9,-0.63808, -1.892634,1.037175,-0.635767, -1.773229,1.037175,-0.922564,
+ -1.773229,1.037175,-0.922564, -1.77968,0.9,-0.92592, -1.89952,0.9,-0.63808,
+ -1.97424,0.9,-0.32816, -1.967083,1.037175,-0.32697, -1.892634,1.037175,-0.635767,
+ -1.892634,1.037175,-0.635767, -1.89952,0.9,-0.63808, -1.97424,0.9,-0.32816,
+ -2,0.9,0, -1.99275,1.037175,0, -1.967083,1.037175,-0.32697,
+ -1.967083,1.037175,-0.32697, -1.97424,0.9,-0.32816, -2,0.9,0,
+ -1.554467,2.242575,0.258385, -1.48068,2.4,0.24612, -1.5,2.4,0,
+ -1.5,2.4,0, -1.57475,2.242575,0, -1.554467,2.242575,0.258385,
+ -1.495635,2.242575,0.502408, -1.42464,2.4,0.47856, -1.48068,2.4,0.24612,
+ -1.48068,2.4,0.24612, -1.554467,2.242575,0.258385, -1.495635,2.242575,0.502408,
+ -1.401276,2.242575,0.729046, -1.33476,2.4,0.69444, -1.42464,2.4,0.47856,
+ -1.42464,2.4,0.47856, -1.495635,2.242575,0.502408, -1.401276,2.242575,0.729046,
+ -1.274414,2.242575,0.935276, -1.21392,2.4,0.89088, -1.33476,2.4,0.69444,
+ -1.33476,2.4,0.69444, -1.401276,2.242575,0.729046, -1.274414,2.242575,0.935276,
+ -1.118073,2.242575,1.118073, -1.065,2.4,1.065, -1.21392,2.4,0.89088,
+ -1.21392,2.4,0.89088, -1.274414,2.242575,0.935276, -1.118073,2.242575,1.118073,
+ -0.935276,2.242575,1.274414, -0.89088,2.4,1.21392, -1.065,2.4,1.065,
+ -1.065,2.4,1.065, -1.118073,2.242575,1.118073, -0.935276,2.242575,1.274414,
+ -0.729046,2.242575,1.401276, -0.69444,2.4,1.33476, -0.89088,2.4,1.21392,
+ -0.89088,2.4,1.21392, -0.935276,2.242575,1.274414, -0.729046,2.242575,1.401276,
+ -0.502408,2.242575,1.495635, -0.47856,2.4,1.42464, -0.69444,2.4,1.33476,
+ -0.69444,2.4,1.33476, -0.729046,2.242575,1.401276, -0.502408,2.242575,1.495635,
+ -0.258385,2.242575,1.554467, -0.24612,2.4,1.48068, -0.47856,2.4,1.42464,
+ -0.47856,2.4,1.42464, -0.502408,2.242575,1.495635, -0.258385,2.242575,1.554467,
+ 0,2.242575,1.57475, 0,2.4,1.5, -0.24612,2.4,1.48068,
+ -0.24612,2.4,1.48068, -0.258385,2.242575,1.554467, 0,2.242575,1.57475,
+ -1.626774,2.0856,0.270404, -1.554467,2.242575,0.258385, -1.57475,2.242575,0,
+ -1.57475,2.242575,0, -1.648,2.0856,0, -1.626774,2.0856,0.270404,
+ -1.565204,2.0856,0.525778, -1.495635,2.242575,0.502408, -1.554467,2.242575,0.258385,
+ -1.554467,2.242575,0.258385, -1.626774,2.0856,0.270404, -1.565204,2.0856,0.525778,
+ -1.466456,2.0856,0.762958, -1.401276,2.242575,0.729046, -1.495635,2.242575,0.502408,
+ -1.495635,2.242575,0.502408, -1.565204,2.0856,0.525778, -1.466456,2.0856,0.762958,
+ -1.333693,2.0856,0.97878, -1.274414,2.242575,0.935276, -1.401276,2.242575,0.729046,
+ -1.401276,2.242575,0.729046, -1.466456,2.0856,0.762958, -1.333693,2.0856,0.97878,
+ -1.17008,2.0856,1.17008, -1.118073,2.242575,1.118073, -1.274414,2.242575,0.935276,
+ -1.274414,2.242575,0.935276, -1.333693,2.0856,0.97878, -1.17008,2.0856,1.17008,
+ -0.97878,2.0856,1.333693, -0.935276,2.242575,1.274414, -1.118073,2.242575,1.118073,
+ -1.118073,2.242575,1.118073, -1.17008,2.0856,1.17008, -0.97878,2.0856,1.333693,
+ -0.762958,2.0856,1.466456, -0.729046,2.242575,1.401276, -0.935276,2.242575,1.274414,
+ -0.935276,2.242575,1.274414, -0.97878,2.0856,1.333693, -0.762958,2.0856,1.466456,
+ -0.525778,2.0856,1.565204, -0.502408,2.242575,1.495635, -0.729046,2.242575,1.401276,
+ -0.729046,2.242575,1.401276, -0.762958,2.0856,1.466456, -0.525778,2.0856,1.565204,
+ -0.270404,2.0856,1.626774, -0.258385,2.242575,1.554467, -0.502408,2.242575,1.495635,
+ -0.502408,2.242575,1.495635, -0.525778,2.0856,1.565204, -0.270404,2.0856,1.626774,
+ 0,2.0856,1.648, 0,2.242575,1.57475, -0.258385,2.242575,1.554467,
+ -0.258385,2.242575,1.554467, -0.270404,2.0856,1.626774, 0,2.0856,1.648,
+ -1.696119,1.929525,0.28193, -1.626774,2.0856,0.270404, -1.648,2.0856,0,
+ -1.648,2.0856,0, -1.71825,1.929525,0, -1.696119,1.929525,0.28193,
+ -1.631925,1.929525,0.54819, -1.565204,2.0856,0.525778, -1.626774,2.0856,0.270404,
+ -1.626774,2.0856,0.270404, -1.696119,1.929525,0.28193, -1.631925,1.929525,0.54819,
+ -1.528968,1.929525,0.795481, -1.466456,2.0856,0.762958, -1.565204,2.0856,0.525778,
+ -1.565204,2.0856,0.525778, -1.631925,1.929525,0.54819, -1.528968,1.929525,0.795481,
+ -1.390545,1.929525,1.020503, -1.333693,2.0856,0.97878, -1.466456,2.0856,0.762958,
+ -1.466456,2.0856,0.762958, -1.528968,1.929525,0.795481, -1.390545,1.929525,1.020503,
+ -1.219958,1.929525,1.219958, -1.17008,2.0856,1.17008, -1.333693,2.0856,0.97878,
+ -1.333693,2.0856,0.97878, -1.390545,1.929525,1.020503, -1.219958,1.929525,1.219958,
+ -1.020503,1.929525,1.390545, -0.97878,2.0856,1.333693, -1.17008,2.0856,1.17008,
+ -1.17008,2.0856,1.17008, -1.219958,1.929525,1.219958, -1.020503,1.929525,1.390545,
+ -0.795481,1.929525,1.528968, -0.762958,2.0856,1.466456, -0.97878,2.0856,1.333693,
+ -0.97878,2.0856,1.333693, -1.020503,1.929525,1.390545, -0.795481,1.929525,1.528968,
+ -0.54819,1.929525,1.631925, -0.525778,2.0856,1.565204, -0.762958,2.0856,1.466456,
+ -0.762958,2.0856,1.466456, -0.795481,1.929525,1.528968, -0.54819,1.929525,1.631925,
+ -0.28193,1.929525,1.696119, -0.270404,2.0856,1.626774, -0.525778,2.0856,1.565204,
+ -0.525778,2.0856,1.565204, -0.54819,1.929525,1.631925, -0.28193,1.929525,1.696119,
+ 0,1.929525,1.71825, 0,2.0856,1.648, -0.270404,2.0856,1.626774,
+ -0.270404,2.0856,1.626774, -0.28193,1.929525,1.696119, 0,1.929525,1.71825,
+ -1.761022,1.7748,0.292719, -1.696119,1.929525,0.28193, -1.71825,1.929525,0,
+ -1.71825,1.929525,0, -1.784,1.7748,0, -1.761022,1.7748,0.292719,
+ -1.694372,1.7748,0.569167, -1.631925,1.929525,0.54819, -1.696119,1.929525,0.28193,
+ -1.696119,1.929525,0.28193, -1.761022,1.7748,0.292719, -1.694372,1.7748,0.569167,
+ -1.587475,1.7748,0.825921, -1.528968,1.929525,0.795481, -1.631925,1.929525,0.54819,
+ -1.631925,1.929525,0.54819, -1.694372,1.7748,0.569167, -1.587475,1.7748,0.825921,
+ -1.443756,1.7748,1.059553, -1.390545,1.929525,1.020503, -1.528968,1.929525,0.795481,
+ -1.528968,1.929525,0.795481, -1.587475,1.7748,0.825921, -1.443756,1.7748,1.059553,
+ -1.26664,1.7748,1.26664, -1.219958,1.929525,1.219958, -1.390545,1.929525,1.020503,
+ -1.390545,1.929525,1.020503, -1.443756,1.7748,1.059553, -1.26664,1.7748,1.26664,
+ -1.059553,1.7748,1.443756, -1.020503,1.929525,1.390545, -1.219958,1.929525,1.219958,
+ -1.219958,1.929525,1.219958, -1.26664,1.7748,1.26664, -1.059553,1.7748,1.443756,
+ -0.825921,1.7748,1.587475, -0.795481,1.929525,1.528968, -1.020503,1.929525,1.390545,
+ -1.020503,1.929525,1.390545, -1.059553,1.7748,1.443756, -0.825921,1.7748,1.587475,
+ -0.569167,1.7748,1.694372, -0.54819,1.929525,1.631925, -0.795481,1.929525,1.528968,
+ -0.795481,1.929525,1.528968, -0.825921,1.7748,1.587475, -0.569167,1.7748,1.694372,
+ -0.292719,1.7748,1.761022, -0.28193,1.929525,1.696119, -0.54819,1.929525,1.631925,
+ -0.54819,1.929525,1.631925, -0.569167,1.7748,1.694372, -0.292719,1.7748,1.761022,
+ 0,1.7748,1.784, 0,1.929525,1.71825, -0.28193,1.929525,1.696119,
+ -0.28193,1.929525,1.696119, -0.292719,1.7748,1.761022, 0,1.7748,1.784,
+ -1.820003,1.621875,0.302523, -1.761022,1.7748,0.292719, -1.784,1.7748,0,
+ -1.784,1.7748,0, -1.84375,1.621875,0, -1.820003,1.621875,0.302523,
+ -1.75112,1.621875,0.58823, -1.694372,1.7748,0.569167, -1.761022,1.7748,0.292719,
+ -1.761022,1.7748,0.292719, -1.820003,1.621875,0.302523, -1.75112,1.621875,0.58823,
+ -1.640643,1.621875,0.853583, -1.587475,1.7748,0.825921, -1.694372,1.7748,0.569167,
+ -1.694372,1.7748,0.569167, -1.75112,1.621875,0.58823, -1.640643,1.621875,0.853583,
+ -1.49211,1.621875,1.09504, -1.443756,1.7748,1.059553, -1.587475,1.7748,0.825921,
+ -1.587475,1.7748,0.825921, -1.640643,1.621875,0.853583, -1.49211,1.621875,1.09504,
+ -1.309063,1.621875,1.309063, -1.26664,1.7748,1.26664, -1.443756,1.7748,1.059553,
+ -1.443756,1.7748,1.059553, -1.49211,1.621875,1.09504, -1.309063,1.621875,1.309063,
+ -1.09504,1.621875,1.49211, -1.059553,1.7748,1.443756, -1.26664,1.7748,1.26664,
+ -1.26664,1.7748,1.26664, -1.309063,1.621875,1.309063, -1.09504,1.621875,1.49211,
+ -0.853583,1.621875,1.640643, -0.825921,1.7748,1.587475, -1.059553,1.7748,1.443756,
+ -1.059553,1.7748,1.443756, -1.09504,1.621875,1.49211, -0.853583,1.621875,1.640643,
+ -0.58823,1.621875,1.75112, -0.569167,1.7748,1.694372, -0.825921,1.7748,1.587475,
+ -0.825921,1.7748,1.587475, -0.853583,1.621875,1.640643, -0.58823,1.621875,1.75112,
+ -0.302522,1.621875,1.820003, -0.292719,1.7748,1.761022, -0.569167,1.7748,1.694372,
+ -0.569167,1.7748,1.694372, -0.58823,1.621875,1.75112, -0.302522,1.621875,1.820003,
+ 0,1.621875,1.84375, 0,1.7748,1.784, -0.292719,1.7748,1.761022,
+ -0.292719,1.7748,1.761022, -0.302522,1.621875,1.820003, 0,1.621875,1.84375,
+ -1.87158,1.4712,0.311096, -1.820003,1.621875,0.302523, -1.84375,1.621875,0,
+ -1.84375,1.621875,0, -1.896,1.4712,0, -1.87158,1.4712,0.311096,
+ -1.800745,1.4712,0.6049, -1.75112,1.621875,0.58823, -1.820003,1.621875,0.302523,
+ -1.820003,1.621875,0.302523, -1.87158,1.4712,0.311096, -1.800745,1.4712,0.6049,
+ -1.687137,1.4712,0.877772, -1.640643,1.621875,0.853583, -1.75112,1.621875,0.58823,
+ -1.75112,1.621875,0.58823, -1.800745,1.4712,0.6049, -1.687137,1.4712,0.877772,
+ -1.534395,1.4712,1.126072, -1.49211,1.621875,1.09504, -1.640643,1.621875,0.853583,
+ -1.640643,1.621875,0.853583, -1.687137,1.4712,0.877772, -1.534395,1.4712,1.126072,
+ -1.34616,1.4712,1.34616, -1.309063,1.621875,1.309063, -1.49211,1.621875,1.09504,
+ -1.49211,1.621875,1.09504, -1.534395,1.4712,1.126072, -1.34616,1.4712,1.34616,
+ -1.126072,1.4712,1.534395, -1.09504,1.621875,1.49211, -1.309063,1.621875,1.309063,
+ -1.309063,1.621875,1.309063, -1.34616,1.4712,1.34616, -1.126072,1.4712,1.534395,
+ -0.877772,1.4712,1.687137, -0.853583,1.621875,1.640643, -1.09504,1.621875,1.49211,
+ -1.09504,1.621875,1.49211, -1.126072,1.4712,1.534395, -0.877772,1.4712,1.687137,
+ -0.6049,1.4712,1.800745, -0.58823,1.621875,1.75112, -0.853583,1.621875,1.640643,
+ -0.853583,1.621875,1.640643, -0.877772,1.4712,1.687137, -0.6049,1.4712,1.800745,
+ -0.311096,1.4712,1.87158, -0.302522,1.621875,1.820003, -0.58823,1.621875,1.75112,
+ -0.58823,1.621875,1.75112, -0.6049,1.4712,1.800745, -0.311096,1.4712,1.87158,
+ 0,1.4712,1.896, 0,1.621875,1.84375, -0.302522,1.621875,1.820003,
+ -0.302522,1.621875,1.820003, -0.311096,1.4712,1.87158, 0,1.4712,1.896,
+ -1.914272,1.323225,0.318192, -1.87158,1.4712,0.311096, -1.896,1.4712,0,
+ -1.896,1.4712,0, -1.93925,1.323225,0, -1.914272,1.323225,0.318192,
+ -1.841822,1.323225,0.618698, -1.800745,1.4712,0.6049, -1.87158,1.4712,0.311096,
+ -1.87158,1.4712,0.311096, -1.914272,1.323225,0.318192, -1.841822,1.323225,0.618698,
+ -1.725622,1.323225,0.897795, -1.687137,1.4712,0.877772, -1.800745,1.4712,0.6049,
+ -1.800745,1.4712,0.6049, -1.841822,1.323225,0.618698, -1.725622,1.323225,0.897795,
+ -1.569396,1.323225,1.151759, -1.534395,1.4712,1.126072, -1.687137,1.4712,0.877772,
+ -1.687137,1.4712,0.877772, -1.725622,1.323225,0.897795, -1.569396,1.323225,1.151759,
+ -1.376867,1.323225,1.376868, -1.34616,1.4712,1.34616, -1.534395,1.4712,1.126072,
+ -1.534395,1.4712,1.126072, -1.569396,1.323225,1.151759, -1.376867,1.323225,1.376868,
+ -1.151759,1.323225,1.569396, -1.126072,1.4712,1.534395, -1.34616,1.4712,1.34616,
+ -1.34616,1.4712,1.34616, -1.376867,1.323225,1.376868, -1.151759,1.323225,1.569396,
+ -0.897795,1.323225,1.725622, -0.877772,1.4712,1.687137, -1.126072,1.4712,1.534395,
+ -1.126072,1.4712,1.534395, -1.151759,1.323225,1.569396, -0.897795,1.323225,1.725622,
+ -0.618698,1.323225,1.841822, -0.6049,1.4712,1.800745, -0.877772,1.4712,1.687137,
+ -0.877772,1.4712,1.687137, -0.897795,1.323225,1.725622, -0.618698,1.323225,1.841822,
+ -0.318192,1.323225,1.914272, -0.311096,1.4712,1.87158, -0.6049,1.4712,1.800745,
+ -0.6049,1.4712,1.800745, -0.618698,1.323225,1.841822, -0.318192,1.323225,1.914272,
+ 0,1.323225,1.93925, 0,1.4712,1.896, -0.311096,1.4712,1.87158,
+ -0.311096,1.4712,1.87158, -0.318192,1.323225,1.914272, 0,1.323225,1.93925,
+ -1.946601,1.1784,0.323566, -1.914272,1.323225,0.318192, -1.93925,1.323225,0,
+ -1.93925,1.323225,0, -1.972,1.1784,0, -1.946601,1.1784,0.323566,
+ -1.872927,1.1784,0.629147, -1.841822,1.323225,0.618698, -1.914272,1.323225,0.318192,
+ -1.914272,1.323225,0.318192, -1.946601,1.1784,0.323566, -1.872927,1.1784,0.629147,
+ -1.754764,1.1784,0.912957, -1.725622,1.323225,0.897795, -1.841822,1.323225,0.618698,
+ -1.841822,1.323225,0.618698, -1.872927,1.1784,0.629147, -1.754764,1.1784,0.912957,
+ -1.5959,1.1784,1.17121, -1.569396,1.323225,1.151759, -1.725622,1.323225,0.897795,
+ -1.725622,1.323225,0.897795, -1.754764,1.1784,0.912957, -1.5959,1.1784,1.17121,
+ -1.40012,1.1784,1.40012, -1.376867,1.323225,1.376868, -1.569396,1.323225,1.151759,
+ -1.569396,1.323225,1.151759, -1.5959,1.1784,1.17121, -1.40012,1.1784,1.40012,
+ -1.17121,1.1784,1.5959, -1.151759,1.323225,1.569396, -1.376867,1.323225,1.376868,
+ -1.376867,1.323225,1.376868, -1.40012,1.1784,1.40012, -1.17121,1.1784,1.5959,
+ -0.912957,1.1784,1.754764, -0.897795,1.323225,1.725622, -1.151759,1.323225,1.569396,
+ -1.151759,1.323225,1.569396, -1.17121,1.1784,1.5959, -0.912957,1.1784,1.754764,
+ -0.629147,1.1784,1.872927, -0.618698,1.323225,1.841822, -0.897795,1.323225,1.725622,
+ -0.897795,1.323225,1.725622, -0.912957,1.1784,1.754764, -0.629147,1.1784,1.872927,
+ -0.323566,1.1784,1.946601, -0.318192,1.323225,1.914272, -0.618698,1.323225,1.841822,
+ -0.618698,1.323225,1.841822, -0.629147,1.1784,1.872927, -0.323566,1.1784,1.946601,
+ 0,1.1784,1.972, 0,1.323225,1.93925, -0.318192,1.323225,1.914272,
+ -0.318192,1.323225,1.914272, -0.323566,1.1784,1.946601, 0,1.1784,1.972,
+ -1.967083,1.037175,0.32697, -1.946601,1.1784,0.323566, -1.972,1.1784,0,
+ -1.972,1.1784,0, -1.99275,1.037175,0, -1.967083,1.037175,0.32697,
+ -1.892634,1.037175,0.635767, -1.872927,1.1784,0.629147, -1.946601,1.1784,0.323566,
+ -1.946601,1.1784,0.323566, -1.967083,1.037175,0.32697, -1.892634,1.037175,0.635767,
+ -1.773229,1.037175,0.922564, -1.754764,1.1784,0.912957, -1.872927,1.1784,0.629147,
+ -1.872927,1.1784,0.629147, -1.892634,1.037175,0.635767, -1.773229,1.037175,0.922564,
+ -1.612693,1.037175,1.183534, -1.5959,1.1784,1.17121, -1.754764,1.1784,0.912957,
+ -1.754764,1.1784,0.912957, -1.773229,1.037175,0.922564, -1.612693,1.037175,1.183534,
+ -1.414853,1.037175,1.414853, -1.40012,1.1784,1.40012, -1.5959,1.1784,1.17121,
+ -1.5959,1.1784,1.17121, -1.612693,1.037175,1.183534, -1.414853,1.037175,1.414853,
+ -1.183534,1.037175,1.612693, -1.17121,1.1784,1.5959, -1.40012,1.1784,1.40012,
+ -1.40012,1.1784,1.40012, -1.414853,1.037175,1.414853, -1.183534,1.037175,1.612693,
+ -0.922564,1.037175,1.773229, -0.912957,1.1784,1.754764, -1.17121,1.1784,1.5959,
+ -1.17121,1.1784,1.5959, -1.183534,1.037175,1.612693, -0.922564,1.037175,1.773229,
+ -0.635767,1.037175,1.892634, -0.629147,1.1784,1.872927, -0.912957,1.1784,1.754764,
+ -0.912957,1.1784,1.754764, -0.922564,1.037175,1.773229, -0.635767,1.037175,1.892634,
+ -0.32697,1.037175,1.967083, -0.323566,1.1784,1.946601, -0.629147,1.1784,1.872927,
+ -0.629147,1.1784,1.872927, -0.635767,1.037175,1.892634, -0.32697,1.037175,1.967083,
+ 0,1.037175,1.99275, 0,1.1784,1.972, -0.323566,1.1784,1.946601,
+ -0.323566,1.1784,1.946601, -0.32697,1.037175,1.967083, 0,1.037175,1.99275,
+ -1.97424,0.9,0.32816, -1.967083,1.037175,0.32697, -1.99275,1.037175,0,
+ -1.99275,1.037175,0, -2,0.9,0, -1.97424,0.9,0.32816,
+ -1.89952,0.9,0.63808, -1.892634,1.037175,0.635767, -1.967083,1.037175,0.32697,
+ -1.967083,1.037175,0.32697, -1.97424,0.9,0.32816, -1.89952,0.9,0.63808,
+ -1.77968,0.9,0.92592, -1.773229,1.037175,0.922564, -1.892634,1.037175,0.635767,
+ -1.892634,1.037175,0.635767, -1.89952,0.9,0.63808, -1.77968,0.9,0.92592,
+ -1.61856,0.9,1.18784, -1.612693,1.037175,1.183534, -1.773229,1.037175,0.922564,
+ -1.773229,1.037175,0.922564, -1.77968,0.9,0.92592, -1.61856,0.9,1.18784,
+ -1.42,0.9,1.42, -1.414853,1.037175,1.414853, -1.612693,1.037175,1.183534,
+ -1.612693,1.037175,1.183534, -1.61856,0.9,1.18784, -1.42,0.9,1.42,
+ -1.18784,0.9,1.61856, -1.183534,1.037175,1.612693, -1.414853,1.037175,1.414853,
+ -1.414853,1.037175,1.414853, -1.42,0.9,1.42, -1.18784,0.9,1.61856,
+ -0.92592,0.9,1.77968, -0.922564,1.037175,1.773229, -1.183534,1.037175,1.612693,
+ -1.183534,1.037175,1.612693, -1.18784,0.9,1.61856, -0.92592,0.9,1.77968,
+ -0.63808,0.9,1.89952, -0.635767,1.037175,1.892634, -0.922564,1.037175,1.773229,
+ -0.922564,1.037175,1.773229, -0.92592,0.9,1.77968, -0.63808,0.9,1.89952,
+ -0.32816,0.9,1.97424, -0.32697,1.037175,1.967083, -0.635767,1.037175,1.892634,
+ -0.635767,1.037175,1.892634, -0.63808,0.9,1.89952, -0.32816,0.9,1.97424,
+ 0,0.9,2, 0,1.037175,1.99275, -0.32697,1.037175,1.967083,
+ -0.32697,1.037175,1.967083, -0.32816,0.9,1.97424, 0,0.9,2,
+ 0.258385,2.242575,1.554467, 0.24612,2.4,1.48068, 0,2.4,1.5,
+ 0,2.4,1.5, 0,2.242575,1.57475, 0.258385,2.242575,1.554467,
+ 0.502408,2.242575,1.495635, 0.47856,2.4,1.42464, 0.24612,2.4,1.48068,
+ 0.24612,2.4,1.48068, 0.258385,2.242575,1.554467, 0.502408,2.242575,1.495635,
+ 0.729046,2.242575,1.401276, 0.69444,2.4,1.33476, 0.47856,2.4,1.42464,
+ 0.47856,2.4,1.42464, 0.502408,2.242575,1.495635, 0.729046,2.242575,1.401276,
+ 0.935276,2.242575,1.274414, 0.89088,2.4,1.21392, 0.69444,2.4,1.33476,
+ 0.69444,2.4,1.33476, 0.729046,2.242575,1.401276, 0.935276,2.242575,1.274414,
+ 1.118073,2.242575,1.118073, 1.065,2.4,1.065, 0.89088,2.4,1.21392,
+ 0.89088,2.4,1.21392, 0.935276,2.242575,1.274414, 1.118073,2.242575,1.118073,
+ 1.274414,2.242575,0.935276, 1.21392,2.4,0.89088, 1.065,2.4,1.065,
+ 1.065,2.4,1.065, 1.118073,2.242575,1.118073, 1.274414,2.242575,0.935276,
+ 1.401276,2.242575,0.729046, 1.33476,2.4,0.69444, 1.21392,2.4,0.89088,
+ 1.21392,2.4,0.89088, 1.274414,2.242575,0.935276, 1.401276,2.242575,0.729046,
+ 1.495635,2.242575,0.502408, 1.42464,2.4,0.47856, 1.33476,2.4,0.69444,
+ 1.33476,2.4,0.69444, 1.401276,2.242575,0.729046, 1.495635,2.242575,0.502408,
+ 1.554467,2.242575,0.258385, 1.48068,2.4,0.24612, 1.42464,2.4,0.47856,
+ 1.42464,2.4,0.47856, 1.495635,2.242575,0.502408, 1.554467,2.242575,0.258385,
+ 1.57475,2.242575,0, 1.5,2.4,0, 1.48068,2.4,0.24612,
+ 1.48068,2.4,0.24612, 1.554467,2.242575,0.258385, 1.57475,2.242575,0,
+ 0.270404,2.0856,1.626774, 0.258385,2.242575,1.554467, 0,2.242575,1.57475,
+ 0,2.242575,1.57475, 0,2.0856,1.648, 0.270404,2.0856,1.626774,
+ 0.525778,2.0856,1.565204, 0.502408,2.242575,1.495635, 0.258385,2.242575,1.554467,
+ 0.258385,2.242575,1.554467, 0.270404,2.0856,1.626774, 0.525778,2.0856,1.565204,
+ 0.762958,2.0856,1.466456, 0.729046,2.242575,1.401276, 0.502408,2.242575,1.495635,
+ 0.502408,2.242575,1.495635, 0.525778,2.0856,1.565204, 0.762958,2.0856,1.466456,
+ 0.97878,2.0856,1.333693, 0.935276,2.242575,1.274414, 0.729046,2.242575,1.401276,
+ 0.729046,2.242575,1.401276, 0.762958,2.0856,1.466456, 0.97878,2.0856,1.333693,
+ 1.17008,2.0856,1.17008, 1.118073,2.242575,1.118073, 0.935276,2.242575,1.274414,
+ 0.935276,2.242575,1.274414, 0.97878,2.0856,1.333693, 1.17008,2.0856,1.17008,
+ 1.333693,2.0856,0.97878, 1.274414,2.242575,0.935276, 1.118073,2.242575,1.118073,
+ 1.118073,2.242575,1.118073, 1.17008,2.0856,1.17008, 1.333693,2.0856,0.97878,
+ 1.466456,2.0856,0.762958, 1.401276,2.242575,0.729046, 1.274414,2.242575,0.935276,
+ 1.274414,2.242575,0.935276, 1.333693,2.0856,0.97878, 1.466456,2.0856,0.762958,
+ 1.565204,2.0856,0.525778, 1.495635,2.242575,0.502408, 1.401276,2.242575,0.729046,
+ 1.401276,2.242575,0.729046, 1.466456,2.0856,0.762958, 1.565204,2.0856,0.525778,
+ 1.626774,2.0856,0.270404, 1.554467,2.242575,0.258385, 1.495635,2.242575,0.502408,
+ 1.495635,2.242575,0.502408, 1.565204,2.0856,0.525778, 1.626774,2.0856,0.270404,
+ 1.648,2.0856,0, 1.57475,2.242575,0, 1.554467,2.242575,0.258385,
+ 1.554467,2.242575,0.258385, 1.626774,2.0856,0.270404, 1.648,2.0856,0,
+ 0.28193,1.929525,1.696119, 0.270404,2.0856,1.626774, 0,2.0856,1.648,
+ 0,2.0856,1.648, 0,1.929525,1.71825, 0.28193,1.929525,1.696119,
+ 0.54819,1.929525,1.631925, 0.525778,2.0856,1.565204, 0.270404,2.0856,1.626774,
+ 0.270404,2.0856,1.626774, 0.28193,1.929525,1.696119, 0.54819,1.929525,1.631925,
+ 0.795481,1.929525,1.528968, 0.762958,2.0856,1.466456, 0.525778,2.0856,1.565204,
+ 0.525778,2.0856,1.565204, 0.54819,1.929525,1.631925, 0.795481,1.929525,1.528968,
+ 1.020503,1.929525,1.390545, 0.97878,2.0856,1.333693, 0.762958,2.0856,1.466456,
+ 0.762958,2.0856,1.466456, 0.795481,1.929525,1.528968, 1.020503,1.929525,1.390545,
+ 1.219958,1.929525,1.219958, 1.17008,2.0856,1.17008, 0.97878,2.0856,1.333693,
+ 0.97878,2.0856,1.333693, 1.020503,1.929525,1.390545, 1.219958,1.929525,1.219958,
+ 1.390545,1.929525,1.020503, 1.333693,2.0856,0.97878, 1.17008,2.0856,1.17008,
+ 1.17008,2.0856,1.17008, 1.219958,1.929525,1.219958, 1.390545,1.929525,1.020503,
+ 1.528968,1.929525,0.795481, 1.466456,2.0856,0.762958, 1.333693,2.0856,0.97878,
+ 1.333693,2.0856,0.97878, 1.390545,1.929525,1.020503, 1.528968,1.929525,0.795481,
+ 1.631925,1.929525,0.54819, 1.565204,2.0856,0.525778, 1.466456,2.0856,0.762958,
+ 1.466456,2.0856,0.762958, 1.528968,1.929525,0.795481, 1.631925,1.929525,0.54819,
+ 1.696119,1.929525,0.28193, 1.626774,2.0856,0.270404, 1.565204,2.0856,0.525778,
+ 1.565204,2.0856,0.525778, 1.631925,1.929525,0.54819, 1.696119,1.929525,0.28193,
+ 1.71825,1.929525,0, 1.648,2.0856,0, 1.626774,2.0856,0.270404,
+ 1.626774,2.0856,0.270404, 1.696119,1.929525,0.28193, 1.71825,1.929525,0,
+ 0.292719,1.7748,1.761022, 0.28193,1.929525,1.696119, 0,1.929525,1.71825,
+ 0,1.929525,1.71825, 0,1.7748,1.784, 0.292719,1.7748,1.761022,
+ 0.569167,1.7748,1.694372, 0.54819,1.929525,1.631925, 0.28193,1.929525,1.696119,
+ 0.28193,1.929525,1.696119, 0.292719,1.7748,1.761022, 0.569167,1.7748,1.694372,
+ 0.825921,1.7748,1.587475, 0.795481,1.929525,1.528968, 0.54819,1.929525,1.631925,
+ 0.54819,1.929525,1.631925, 0.569167,1.7748,1.694372, 0.825921,1.7748,1.587475,
+ 1.059553,1.7748,1.443756, 1.020503,1.929525,1.390545, 0.795481,1.929525,1.528968,
+ 0.795481,1.929525,1.528968, 0.825921,1.7748,1.587475, 1.059553,1.7748,1.443756,
+ 1.26664,1.7748,1.26664, 1.219958,1.929525,1.219958, 1.020503,1.929525,1.390545,
+ 1.020503,1.929525,1.390545, 1.059553,1.7748,1.443756, 1.26664,1.7748,1.26664,
+ 1.443756,1.7748,1.059553, 1.390545,1.929525,1.020503, 1.219958,1.929525,1.219958,
+ 1.219958,1.929525,1.219958, 1.26664,1.7748,1.26664, 1.443756,1.7748,1.059553,
+ 1.587475,1.7748,0.825921, 1.528968,1.929525,0.795481, 1.390545,1.929525,1.020503,
+ 1.390545,1.929525,1.020503, 1.443756,1.7748,1.059553, 1.587475,1.7748,0.825921,
+ 1.694372,1.7748,0.569167, 1.631925,1.929525,0.54819, 1.528968,1.929525,0.795481,
+ 1.528968,1.929525,0.795481, 1.587475,1.7748,0.825921, 1.694372,1.7748,0.569167,
+ 1.761022,1.7748,0.292719, 1.696119,1.929525,0.28193, 1.631925,1.929525,0.54819,
+ 1.631925,1.929525,0.54819, 1.694372,1.7748,0.569167, 1.761022,1.7748,0.292719,
+ 1.784,1.7748,0, 1.71825,1.929525,0, 1.696119,1.929525,0.28193,
+ 1.696119,1.929525,0.28193, 1.761022,1.7748,0.292719, 1.784,1.7748,0,
+ 0.302523,1.621875,1.820003, 0.292719,1.7748,1.761022, 0,1.7748,1.784,
+ 0,1.7748,1.784, 0,1.621875,1.84375, 0.302523,1.621875,1.820003,
+ 0.58823,1.621875,1.75112, 0.569167,1.7748,1.694372, 0.292719,1.7748,1.761022,
+ 0.292719,1.7748,1.761022, 0.302523,1.621875,1.820003, 0.58823,1.621875,1.75112,
+ 0.853583,1.621875,1.640643, 0.825921,1.7748,1.587475, 0.569167,1.7748,1.694372,
+ 0.569167,1.7748,1.694372, 0.58823,1.621875,1.75112, 0.853583,1.621875,1.640643,
+ 1.09504,1.621875,1.49211, 1.059553,1.7748,1.443756, 0.825921,1.7748,1.587475,
+ 0.825921,1.7748,1.587475, 0.853583,1.621875,1.640643, 1.09504,1.621875,1.49211,
+ 1.309063,1.621875,1.309063, 1.26664,1.7748,1.26664, 1.059553,1.7748,1.443756,
+ 1.059553,1.7748,1.443756, 1.09504,1.621875,1.49211, 1.309063,1.621875,1.309063,
+ 1.49211,1.621875,1.09504, 1.443756,1.7748,1.059553, 1.26664,1.7748,1.26664,
+ 1.26664,1.7748,1.26664, 1.309063,1.621875,1.309063, 1.49211,1.621875,1.09504,
+ 1.640643,1.621875,0.853583, 1.587475,1.7748,0.825921, 1.443756,1.7748,1.059553,
+ 1.443756,1.7748,1.059553, 1.49211,1.621875,1.09504, 1.640643,1.621875,0.853583,
+ 1.75112,1.621875,0.58823, 1.694372,1.7748,0.569167, 1.587475,1.7748,0.825921,
+ 1.587475,1.7748,0.825921, 1.640643,1.621875,0.853583, 1.75112,1.621875,0.58823,
+ 1.820003,1.621875,0.302522, 1.761022,1.7748,0.292719, 1.694372,1.7748,0.569167,
+ 1.694372,1.7748,0.569167, 1.75112,1.621875,0.58823, 1.820003,1.621875,0.302522,
+ 1.84375,1.621875,0, 1.784,1.7748,0, 1.761022,1.7748,0.292719,
+ 1.761022,1.7748,0.292719, 1.820003,1.621875,0.302522, 1.84375,1.621875,0,
+ 0.311096,1.4712,1.87158, 0.302523,1.621875,1.820003, 0,1.621875,1.84375,
+ 0,1.621875,1.84375, 0,1.4712,1.896, 0.311096,1.4712,1.87158,
+ 0.6049,1.4712,1.800745, 0.58823,1.621875,1.75112, 0.302523,1.621875,1.820003,
+ 0.302523,1.621875,1.820003, 0.311096,1.4712,1.87158, 0.6049,1.4712,1.800745,
+ 0.877772,1.4712,1.687137, 0.853583,1.621875,1.640643, 0.58823,1.621875,1.75112,
+ 0.58823,1.621875,1.75112, 0.6049,1.4712,1.800745, 0.877772,1.4712,1.687137,
+ 1.126072,1.4712,1.534395, 1.09504,1.621875,1.49211, 0.853583,1.621875,1.640643,
+ 0.853583,1.621875,1.640643, 0.877772,1.4712,1.687137, 1.126072,1.4712,1.534395,
+ 1.34616,1.4712,1.34616, 1.309063,1.621875,1.309063, 1.09504,1.621875,1.49211,
+ 1.09504,1.621875,1.49211, 1.126072,1.4712,1.534395, 1.34616,1.4712,1.34616,
+ 1.534395,1.4712,1.126072, 1.49211,1.621875,1.09504, 1.309063,1.621875,1.309063,
+ 1.309063,1.621875,1.309063, 1.34616,1.4712,1.34616, 1.534395,1.4712,1.126072,
+ 1.687137,1.4712,0.877772, 1.640643,1.621875,0.853583, 1.49211,1.621875,1.09504,
+ 1.49211,1.621875,1.09504, 1.534395,1.4712,1.126072, 1.687137,1.4712,0.877772,
+ 1.800745,1.4712,0.6049, 1.75112,1.621875,0.58823, 1.640643,1.621875,0.853583,
+ 1.640643,1.621875,0.853583, 1.687137,1.4712,0.877772, 1.800745,1.4712,0.6049,
+ 1.87158,1.4712,0.311096, 1.820003,1.621875,0.302522, 1.75112,1.621875,0.58823,
+ 1.75112,1.621875,0.58823, 1.800745,1.4712,0.6049, 1.87158,1.4712,0.311096,
+ 1.896,1.4712,0, 1.84375,1.621875,0, 1.820003,1.621875,0.302522,
+ 1.820003,1.621875,0.302522, 1.87158,1.4712,0.311096, 1.896,1.4712,0,
+ 0.318192,1.323225,1.914272, 0.311096,1.4712,1.87158, 0,1.4712,1.896,
+ 0,1.4712,1.896, 0,1.323225,1.93925, 0.318192,1.323225,1.914272,
+ 0.618698,1.323225,1.841822, 0.6049,1.4712,1.800745, 0.311096,1.4712,1.87158,
+ 0.311096,1.4712,1.87158, 0.318192,1.323225,1.914272, 0.618698,1.323225,1.841822,
+ 0.897795,1.323225,1.725622, 0.877772,1.4712,1.687137, 0.6049,1.4712,1.800745,
+ 0.6049,1.4712,1.800745, 0.618698,1.323225,1.841822, 0.897795,1.323225,1.725622,
+ 1.151759,1.323225,1.569396, 1.126072,1.4712,1.534395, 0.877772,1.4712,1.687137,
+ 0.877772,1.4712,1.687137, 0.897795,1.323225,1.725622, 1.151759,1.323225,1.569396,
+ 1.376868,1.323225,1.376867, 1.34616,1.4712,1.34616, 1.126072,1.4712,1.534395,
+ 1.126072,1.4712,1.534395, 1.151759,1.323225,1.569396, 1.376868,1.323225,1.376867,
+ 1.569396,1.323225,1.151759, 1.534395,1.4712,1.126072, 1.34616,1.4712,1.34616,
+ 1.34616,1.4712,1.34616, 1.376868,1.323225,1.376867, 1.569396,1.323225,1.151759,
+ 1.725622,1.323225,0.897795, 1.687137,1.4712,0.877772, 1.534395,1.4712,1.126072,
+ 1.534395,1.4712,1.126072, 1.569396,1.323225,1.151759, 1.725622,1.323225,0.897795,
+ 1.841822,1.323225,0.618698, 1.800745,1.4712,0.6049, 1.687137,1.4712,0.877772,
+ 1.687137,1.4712,0.877772, 1.725622,1.323225,0.897795, 1.841822,1.323225,0.618698,
+ 1.914272,1.323225,0.318192, 1.87158,1.4712,0.311096, 1.800745,1.4712,0.6049,
+ 1.800745,1.4712,0.6049, 1.841822,1.323225,0.618698, 1.914272,1.323225,0.318192,
+ 1.93925,1.323225,0, 1.896,1.4712,0, 1.87158,1.4712,0.311096,
+ 1.87158,1.4712,0.311096, 1.914272,1.323225,0.318192, 1.93925,1.323225,0,
+ 0.323566,1.1784,1.946601, 0.318192,1.323225,1.914272, 0,1.323225,1.93925,
+ 0,1.323225,1.93925, 0,1.1784,1.972, 0.323566,1.1784,1.946601,
+ 0.629147,1.1784,1.872927, 0.618698,1.323225,1.841822, 0.318192,1.323225,1.914272,
+ 0.318192,1.323225,1.914272, 0.323566,1.1784,1.946601, 0.629147,1.1784,1.872927,
+ 0.912957,1.1784,1.754764, 0.897795,1.323225,1.725622, 0.618698,1.323225,1.841822,
+ 0.618698,1.323225,1.841822, 0.629147,1.1784,1.872927, 0.912957,1.1784,1.754764,
+ 1.17121,1.1784,1.5959, 1.151759,1.323225,1.569396, 0.897795,1.323225,1.725622,
+ 0.897795,1.323225,1.725622, 0.912957,1.1784,1.754764, 1.17121,1.1784,1.5959,
+ 1.40012,1.1784,1.40012, 1.376868,1.323225,1.376867, 1.151759,1.323225,1.569396,
+ 1.151759,1.323225,1.569396, 1.17121,1.1784,1.5959, 1.40012,1.1784,1.40012,
+ 1.5959,1.1784,1.17121, 1.569396,1.323225,1.151759, 1.376868,1.323225,1.376867,
+ 1.376868,1.323225,1.376867, 1.40012,1.1784,1.40012, 1.5959,1.1784,1.17121,
+ 1.754764,1.1784,0.912957, 1.725622,1.323225,0.897795, 1.569396,1.323225,1.151759,
+ 1.569396,1.323225,1.151759, 1.5959,1.1784,1.17121, 1.754764,1.1784,0.912957,
+ 1.872927,1.1784,0.629147, 1.841822,1.323225,0.618698, 1.725622,1.323225,0.897795,
+ 1.725622,1.323225,0.897795, 1.754764,1.1784,0.912957, 1.872927,1.1784,0.629147,
+ 1.946601,1.1784,0.323566, 1.914272,1.323225,0.318192, 1.841822,1.323225,0.618698,
+ 1.841822,1.323225,0.618698, 1.872927,1.1784,0.629147, 1.946601,1.1784,0.323566,
+ 1.972,1.1784,0, 1.93925,1.323225,0, 1.914272,1.323225,0.318192,
+ 1.914272,1.323225,0.318192, 1.946601,1.1784,0.323566, 1.972,1.1784,0,
+ 0.32697,1.037175,1.967083, 0.323566,1.1784,1.946601, 0,1.1784,1.972,
+ 0,1.1784,1.972, 0,1.037175,1.99275, 0.32697,1.037175,1.967083,
+ 0.635767,1.037175,1.892634, 0.629147,1.1784,1.872927, 0.323566,1.1784,1.946601,
+ 0.323566,1.1784,1.946601, 0.32697,1.037175,1.967083, 0.635767,1.037175,1.892634,
+ 0.922564,1.037175,1.773229, 0.912957,1.1784,1.754764, 0.629147,1.1784,1.872927,
+ 0.629147,1.1784,1.872927, 0.635767,1.037175,1.892634, 0.922564,1.037175,1.773229,
+ 1.183534,1.037175,1.612693, 1.17121,1.1784,1.5959, 0.912957,1.1784,1.754764,
+ 0.912957,1.1784,1.754764, 0.922564,1.037175,1.773229, 1.183534,1.037175,1.612693,
+ 1.414853,1.037175,1.414853, 1.40012,1.1784,1.40012, 1.17121,1.1784,1.5959,
+ 1.17121,1.1784,1.5959, 1.183534,1.037175,1.612693, 1.414853,1.037175,1.414853,
+ 1.612693,1.037175,1.183534, 1.5959,1.1784,1.17121, 1.40012,1.1784,1.40012,
+ 1.40012,1.1784,1.40012, 1.414853,1.037175,1.414853, 1.612693,1.037175,1.183534,
+ 1.773229,1.037175,0.922564, 1.754764,1.1784,0.912957, 1.5959,1.1784,1.17121,
+ 1.5959,1.1784,1.17121, 1.612693,1.037175,1.183534, 1.773229,1.037175,0.922564,
+ 1.892634,1.037175,0.635767, 1.872927,1.1784,0.629147, 1.754764,1.1784,0.912957,
+ 1.754764,1.1784,0.912957, 1.773229,1.037175,0.922564, 1.892634,1.037175,0.635767,
+ 1.967083,1.037175,0.32697, 1.946601,1.1784,0.323566, 1.872927,1.1784,0.629147,
+ 1.872927,1.1784,0.629147, 1.892634,1.037175,0.635767, 1.967083,1.037175,0.32697,
+ 1.99275,1.037175,0, 1.972,1.1784,0, 1.946601,1.1784,0.323566,
+ 1.946601,1.1784,0.323566, 1.967083,1.037175,0.32697, 1.99275,1.037175,0,
+ 0.32816,0.9,1.97424, 0.32697,1.037175,1.967083, 0,1.037175,1.99275,
+ 0,1.037175,1.99275, 0,0.9,2, 0.32816,0.9,1.97424,
+ 0.63808,0.9,1.89952, 0.635767,1.037175,1.892634, 0.32697,1.037175,1.967083,
+ 0.32697,1.037175,1.967083, 0.32816,0.9,1.97424, 0.63808,0.9,1.89952,
+ 0.92592,0.9,1.77968, 0.922564,1.037175,1.773229, 0.635767,1.037175,1.892634,
+ 0.635767,1.037175,1.892634, 0.63808,0.9,1.89952, 0.92592,0.9,1.77968,
+ 1.18784,0.9,1.61856, 1.183534,1.037175,1.612693, 0.922564,1.037175,1.773229,
+ 0.922564,1.037175,1.773229, 0.92592,0.9,1.77968, 1.18784,0.9,1.61856,
+ 1.42,0.9,1.42, 1.414853,1.037175,1.414853, 1.183534,1.037175,1.612693,
+ 1.183534,1.037175,1.612693, 1.18784,0.9,1.61856, 1.42,0.9,1.42,
+ 1.61856,0.9,1.18784, 1.612693,1.037175,1.183534, 1.414853,1.037175,1.414853,
+ 1.414853,1.037175,1.414853, 1.42,0.9,1.42, 1.61856,0.9,1.18784,
+ 1.77968,0.9,0.92592, 1.773229,1.037175,0.922564, 1.612693,1.037175,1.183534,
+ 1.612693,1.037175,1.183534, 1.61856,0.9,1.18784, 1.77968,0.9,0.92592,
+ 1.89952,0.9,0.63808, 1.892634,1.037175,0.635767, 1.773229,1.037175,0.922564,
+ 1.773229,1.037175,0.922564, 1.77968,0.9,0.92592, 1.89952,0.9,0.63808,
+ 1.97424,0.9,0.32816, 1.967083,1.037175,0.32697, 1.892634,1.037175,0.635767,
+ 1.892634,1.037175,0.635767, 1.89952,0.9,0.63808, 1.97424,0.9,0.32816,
+ 2,0.9,0, 1.99275,1.037175,0, 1.967083,1.037175,0.32697,
+ 1.967083,1.037175,0.32697, 1.97424,0.9,0.32816, 2,0.9,0,
+ 1.96042,0.771675,-0.325863, 1.97424,0.9,-0.32816, 2,0.9,0,
+ 2,0.9,0, 1.986,0.771675,0, 1.96042,0.771675,-0.325863,
+ 1.886223,0.771675,-0.633613, 1.89952,0.9,-0.63808, 1.97424,0.9,-0.32816,
+ 1.97424,0.9,-0.32816, 1.96042,0.771675,-0.325863, 1.886223,0.771675,-0.633613,
+ 1.767222,0.771675,-0.919439, 1.77968,0.9,-0.92592, 1.89952,0.9,-0.63808,
+ 1.89952,0.9,-0.63808, 1.886223,0.771675,-0.633613, 1.767222,0.771675,-0.919439,
+ 1.60723,0.771675,-1.179525, 1.61856,0.9,-1.18784, 1.77968,0.9,-0.92592,
+ 1.77968,0.9,-0.92592, 1.767222,0.771675,-0.919439, 1.60723,0.771675,-1.179525,
+ 1.41006,0.771675,-1.41006, 1.42,0.9,-1.42, 1.61856,0.9,-1.18784,
+ 1.61856,0.9,-1.18784, 1.60723,0.771675,-1.179525, 1.41006,0.771675,-1.41006,
+ 1.179525,0.771675,-1.60723, 1.18784,0.9,-1.61856, 1.42,0.9,-1.42,
+ 1.42,0.9,-1.42, 1.41006,0.771675,-1.41006, 1.179525,0.771675,-1.60723,
+ 0.919439,0.771675,-1.767222, 0.92592,0.9,-1.77968, 1.18784,0.9,-1.61856,
+ 1.18784,0.9,-1.61856, 1.179525,0.771675,-1.60723, 0.919439,0.771675,-1.767222,
+ 0.633613,0.771675,-1.886223, 0.63808,0.9,-1.89952, 0.92592,0.9,-1.77968,
+ 0.92592,0.9,-1.77968, 0.919439,0.771675,-1.767222, 0.633613,0.771675,-1.886223,
+ 0.325863,0.771675,-1.96042, 0.32816,0.9,-1.97424, 0.63808,0.9,-1.89952,
+ 0.63808,0.9,-1.89952, 0.633613,0.771675,-1.886223, 0.325863,0.771675,-1.96042,
+ 0,0.771675,-1.986, 0,0.9,-2, 0.32816,0.9,-1.97424,
+ 0.32816,0.9,-1.97424, 0.325863,0.771675,-1.96042, 0,0.771675,-1.986,
+ 1.92291,0.6564,-0.319628, 1.96042,0.771675,-0.325863, 1.986,0.771675,0,
+ 1.986,0.771675,0, 1.948,0.6564,0, 1.92291,0.6564,-0.319628,
+ 1.850132,0.6564,-0.62149, 1.886223,0.771675,-0.633613, 1.96042,0.771675,-0.325863,
+ 1.96042,0.771675,-0.325863, 1.92291,0.6564,-0.319628, 1.850132,0.6564,-0.62149,
+ 1.733408,0.6564,-0.901846, 1.767222,0.771675,-0.919439, 1.886223,0.771675,-0.633613,
+ 1.886223,0.771675,-0.633613, 1.850132,0.6564,-0.62149, 1.733408,0.6564,-0.901846,
+ 1.576477,0.6564,-1.156956, 1.60723,0.771675,-1.179525, 1.767222,0.771675,-0.919439,
+ 1.767222,0.771675,-0.919439, 1.733408,0.6564,-0.901846, 1.576477,0.6564,-1.156956,
+ 1.38308,0.6564,-1.38308, 1.41006,0.771675,-1.41006, 1.60723,0.771675,-1.179525,
+ 1.60723,0.771675,-1.179525, 1.576477,0.6564,-1.156956, 1.38308,0.6564,-1.38308,
+ 1.156956,0.6564,-1.576477, 1.179525,0.771675,-1.60723, 1.41006,0.771675,-1.41006,
+ 1.41006,0.771675,-1.41006, 1.38308,0.6564,-1.38308, 1.156956,0.6564,-1.576477,
+ 0.901846,0.6564,-1.733408, 0.919439,0.771675,-1.767222, 1.179525,0.771675,-1.60723,
+ 1.179525,0.771675,-1.60723, 1.156956,0.6564,-1.576477, 0.901846,0.6564,-1.733408,
+ 0.62149,0.6564,-1.850132, 0.633613,0.771675,-1.886223, 0.919439,0.771675,-1.767222,
+ 0.919439,0.771675,-1.767222, 0.901846,0.6564,-1.733408, 0.62149,0.6564,-1.850132,
+ 0.319628,0.6564,-1.92291, 0.325863,0.771675,-1.96042, 0.633613,0.771675,-1.886223,
+ 0.633613,0.771675,-1.886223, 0.62149,0.6564,-1.850132, 0.319628,0.6564,-1.92291,
+ 0,0.6564,-1.948, 0,0.771675,-1.986, 0.325863,0.771675,-1.96042,
+ 0.325863,0.771675,-1.96042, 0.319628,0.6564,-1.92291, 0,0.6564,-1.948,
+ 1.867631,0.553725,-0.310439, 1.92291,0.6564,-0.319628, 1.948,0.6564,0,
+ 1.948,0.6564,0, 1.892,0.553725,0, 1.867631,0.553725,-0.310439,
+ 1.796946,0.553725,-0.603624, 1.850132,0.6564,-0.62149, 1.92291,0.6564,-0.319628,
+ 1.92291,0.6564,-0.319628, 1.867631,0.553725,-0.310439, 1.796946,0.553725,-0.603624,
+ 1.683577,0.553725,-0.87592, 1.733408,0.6564,-0.901846, 1.850132,0.6564,-0.62149,
+ 1.850132,0.6564,-0.62149, 1.796946,0.553725,-0.603624, 1.683577,0.553725,-0.87592,
+ 1.531158,0.553725,-1.123697, 1.576477,0.6564,-1.156956, 1.733408,0.6564,-0.901846,
+ 1.733408,0.6564,-0.901846, 1.683577,0.553725,-0.87592, 1.531158,0.553725,-1.123697,
+ 1.34332,0.553725,-1.34332, 1.38308,0.6564,-1.38308, 1.576477,0.6564,-1.156956,
+ 1.576477,0.6564,-1.156956, 1.531158,0.553725,-1.123697, 1.34332,0.553725,-1.34332,
+ 1.123697,0.553725,-1.531158, 1.156956,0.6564,-1.576477, 1.38308,0.6564,-1.38308,
+ 1.38308,0.6564,-1.38308, 1.34332,0.553725,-1.34332, 1.123697,0.553725,-1.531158,
+ 0.87592,0.553725,-1.683577, 0.901846,0.6564,-1.733408, 1.156956,0.6564,-1.576477,
+ 1.156956,0.6564,-1.576477, 1.123697,0.553725,-1.531158, 0.87592,0.553725,-1.683577,
+ 0.603624,0.553725,-1.796946, 0.62149,0.6564,-1.850132, 0.901846,0.6564,-1.733408,
+ 0.901846,0.6564,-1.733408, 0.87592,0.553725,-1.683577, 0.603624,0.553725,-1.796946,
+ 0.310439,0.553725,-1.867631, 0.319628,0.6564,-1.92291, 0.62149,0.6564,-1.850132,
+ 0.62149,0.6564,-1.850132, 0.603624,0.553725,-1.796946, 0.310439,0.553725,-1.867631,
+ 0,0.553725,-1.892, 0,0.6564,-1.948, 0.319628,0.6564,-1.92291,
+ 0.319628,0.6564,-1.92291, 0.310439,0.553725,-1.867631, 0,0.553725,-1.892,
+ 1.800507,0.4632,-0.299282, 1.867631,0.553725,-0.310439, 1.892,0.553725,0,
+ 1.892,0.553725,0, 1.824,0.4632,0, 1.800507,0.4632,-0.299282,
+ 1.732362,0.4632,-0.581929, 1.796946,0.553725,-0.603624, 1.867631,0.553725,-0.310439,
+ 1.867631,0.553725,-0.310439, 1.800507,0.4632,-0.299282, 1.732362,0.4632,-0.581929,
+ 1.623068,0.4632,-0.844439, 1.683577,0.553725,-0.87592, 1.796946,0.553725,-0.603624,
+ 1.796946,0.553725,-0.603624, 1.732362,0.4632,-0.581929, 1.623068,0.4632,-0.844439,
+ 1.476127,0.4632,-1.08331, 1.531158,0.553725,-1.123697, 1.683577,0.553725,-0.87592,
+ 1.683577,0.553725,-0.87592, 1.623068,0.4632,-0.844439, 1.476127,0.4632,-1.08331,
+ 1.29504,0.4632,-1.29504, 1.34332,0.553725,-1.34332, 1.531158,0.553725,-1.123697,
+ 1.531158,0.553725,-1.123697, 1.476127,0.4632,-1.08331, 1.29504,0.4632,-1.29504,
+ 1.08331,0.4632,-1.476127, 1.123697,0.553725,-1.531158, 1.34332,0.553725,-1.34332,
+ 1.34332,0.553725,-1.34332, 1.29504,0.4632,-1.29504, 1.08331,0.4632,-1.476127,
+ 0.844439,0.4632,-1.623068, 0.87592,0.553725,-1.683577, 1.123697,0.553725,-1.531158,
+ 1.123697,0.553725,-1.531158, 1.08331,0.4632,-1.476127, 0.844439,0.4632,-1.623068,
+ 0.581929,0.4632,-1.732362, 0.603624,0.553725,-1.796946, 0.87592,0.553725,-1.683577,
+ 0.87592,0.553725,-1.683577, 0.844439,0.4632,-1.623068, 0.581929,0.4632,-1.732362,
+ 0.299282,0.4632,-1.800507, 0.310439,0.553725,-1.867631, 0.603624,0.553725,-1.796946,
+ 0.603624,0.553725,-1.796946, 0.581929,0.4632,-1.732362, 0.299282,0.4632,-1.800507,
+ 0,0.4632,-1.824, 0,0.553725,-1.892, 0.310439,0.553725,-1.867631,
+ 0.310439,0.553725,-1.867631, 0.299282,0.4632,-1.800507, 0,0.4632,-1.824,
+ 1.72746,0.384375,-0.28714, 1.800507,0.4632,-0.299282, 1.824,0.4632,0,
+ 1.824,0.4632,0, 1.75,0.384375,0, 1.72746,0.384375,-0.28714,
+ 1.66208,0.384375,-0.55832, 1.732362,0.4632,-0.581929, 1.800507,0.4632,-0.299282,
+ 1.800507,0.4632,-0.299282, 1.72746,0.384375,-0.28714, 1.66208,0.384375,-0.55832,
+ 1.55722,0.384375,-0.81018, 1.623068,0.4632,-0.844439, 1.732362,0.4632,-0.581929,
+ 1.732362,0.4632,-0.581929, 1.66208,0.384375,-0.55832, 1.55722,0.384375,-0.81018,
+ 1.41624,0.384375,-1.03936, 1.476127,0.4632,-1.08331, 1.623068,0.4632,-0.844439,
+ 1.623068,0.4632,-0.844439, 1.55722,0.384375,-0.81018, 1.41624,0.384375,-1.03936,
+ 1.2425,0.384375,-1.2425, 1.29504,0.4632,-1.29504, 1.476127,0.4632,-1.08331,
+ 1.476127,0.4632,-1.08331, 1.41624,0.384375,-1.03936, 1.2425,0.384375,-1.2425,
+ 1.03936,0.384375,-1.41624, 1.08331,0.4632,-1.476127, 1.29504,0.4632,-1.29504,
+ 1.29504,0.4632,-1.29504, 1.2425,0.384375,-1.2425, 1.03936,0.384375,-1.41624,
+ 0.81018,0.384375,-1.55722, 0.844439,0.4632,-1.623068, 1.08331,0.4632,-1.476127,
+ 1.08331,0.4632,-1.476127, 1.03936,0.384375,-1.41624, 0.81018,0.384375,-1.55722,
+ 0.55832,0.384375,-1.66208, 0.581929,0.4632,-1.732362, 0.844439,0.4632,-1.623068,
+ 0.844439,0.4632,-1.623068, 0.81018,0.384375,-1.55722, 0.55832,0.384375,-1.66208,
+ 0.28714,0.384375,-1.72746, 0.299282,0.4632,-1.800507, 0.581929,0.4632,-1.732362,
+ 0.581929,0.4632,-1.732362, 0.55832,0.384375,-1.66208, 0.28714,0.384375,-1.72746,
+ 0,0.384375,-1.75, 0,0.4632,-1.824, 0.299282,0.4632,-1.800507,
+ 0.299282,0.4632,-1.800507, 0.28714,0.384375,-1.72746, 0,0.384375,-1.75,
+ 1.654413,0.3168,-0.274998, 1.72746,0.384375,-0.28714, 1.75,0.384375,0,
+ 1.75,0.384375,0, 1.676,0.3168,0, 1.654413,0.3168,-0.274998,
+ 1.591798,0.3168,-0.534711, 1.66208,0.384375,-0.55832, 1.72746,0.384375,-0.28714,
+ 1.72746,0.384375,-0.28714, 1.654413,0.3168,-0.274998, 1.591798,0.3168,-0.534711,
+ 1.491372,0.3168,-0.775921, 1.55722,0.384375,-0.81018, 1.66208,0.384375,-0.55832,
+ 1.66208,0.384375,-0.55832, 1.591798,0.3168,-0.534711, 1.491372,0.3168,-0.775921,
+ 1.356353,0.3168,-0.99541, 1.41624,0.384375,-1.03936, 1.55722,0.384375,-0.81018,
+ 1.55722,0.384375,-0.81018, 1.491372,0.3168,-0.775921, 1.356353,0.3168,-0.99541,
+ 1.18996,0.3168,-1.18996, 1.2425,0.384375,-1.2425, 1.41624,0.384375,-1.03936,
+ 1.41624,0.384375,-1.03936, 1.356353,0.3168,-0.99541, 1.18996,0.3168,-1.18996,
+ 0.99541,0.3168,-1.356353, 1.03936,0.384375,-1.41624, 1.2425,0.384375,-1.2425,
+ 1.2425,0.384375,-1.2425, 1.18996,0.3168,-1.18996, 0.99541,0.3168,-1.356353,
+ 0.775921,0.3168,-1.491372, 0.81018,0.384375,-1.55722, 1.03936,0.384375,-1.41624,
+ 1.03936,0.384375,-1.41624, 0.99541,0.3168,-1.356353, 0.775921,0.3168,-1.491372,
+ 0.534711,0.3168,-1.591798, 0.55832,0.384375,-1.66208, 0.81018,0.384375,-1.55722,
+ 0.81018,0.384375,-1.55722, 0.775921,0.3168,-1.491372, 0.534711,0.3168,-1.591798,
+ 0.274998,0.3168,-1.654413, 0.28714,0.384375,-1.72746, 0.55832,0.384375,-1.66208,
+ 0.55832,0.384375,-1.66208, 0.534711,0.3168,-1.591798, 0.274998,0.3168,-1.654413,
+ 0,0.3168,-1.676, 0,0.384375,-1.75, 0.28714,0.384375,-1.72746,
+ 0.28714,0.384375,-1.72746, 0.274998,0.3168,-1.654413, 0,0.3168,-1.676,
+ 1.587289,0.260025,-0.263841, 1.654413,0.3168,-0.274998, 1.676,0.3168,0,
+ 1.676,0.3168,0, 1.608,0.260025,0, 1.587289,0.260025,-0.263841,
+ 1.527214,0.260025,-0.513016, 1.591798,0.3168,-0.534711, 1.654413,0.3168,-0.274998,
+ 1.654413,0.3168,-0.274998, 1.587289,0.260025,-0.263841, 1.527214,0.260025,-0.513016,
+ 1.430863,0.260025,-0.74444, 1.491372,0.3168,-0.775921, 1.591798,0.3168,-0.534711,
+ 1.591798,0.3168,-0.534711, 1.527214,0.260025,-0.513016, 1.430863,0.260025,-0.74444,
+ 1.301322,0.260025,-0.955023, 1.356353,0.3168,-0.99541, 1.491372,0.3168,-0.775921,
+ 1.491372,0.3168,-0.775921, 1.430863,0.260025,-0.74444, 1.301322,0.260025,-0.955023,
+ 1.14168,0.260025,-1.14168, 1.18996,0.3168,-1.18996, 1.356353,0.3168,-0.99541,
+ 1.356353,0.3168,-0.99541, 1.301322,0.260025,-0.955023, 1.14168,0.260025,-1.14168,
+ 0.955023,0.260025,-1.301322, 0.99541,0.3168,-1.356353, 1.18996,0.3168,-1.18996,
+ 1.18996,0.3168,-1.18996, 1.14168,0.260025,-1.14168, 0.955023,0.260025,-1.301322,
+ 0.74444,0.260025,-1.430863, 0.775921,0.3168,-1.491372, 0.99541,0.3168,-1.356353,
+ 0.99541,0.3168,-1.356353, 0.955023,0.260025,-1.301322, 0.74444,0.260025,-1.430863,
+ 0.513016,0.260025,-1.527214, 0.534711,0.3168,-1.591798, 0.775921,0.3168,-1.491372,
+ 0.775921,0.3168,-1.491372, 0.74444,0.260025,-1.430863, 0.513016,0.260025,-1.527214,
+ 0.263841,0.260025,-1.587289, 0.274998,0.3168,-1.654413, 0.534711,0.3168,-1.591798,
+ 0.534711,0.3168,-1.591798, 0.513016,0.260025,-1.527214, 0.263841,0.260025,-1.587289,
+ 0,0.260025,-1.608, 0,0.3168,-1.676, 0.274998,0.3168,-1.654413,
+ 0.274998,0.3168,-1.654413, 0.263841,0.260025,-1.587289, 0,0.260025,-1.608,
+ 1.53201,0.2136,-0.254652, 1.587289,0.260025,-0.263841, 1.608,0.260025,0,
+ 1.608,0.260025,0, 1.552,0.2136,0, 1.53201,0.2136,-0.254652,
+ 1.474028,0.2136,-0.49515, 1.527214,0.260025,-0.513016, 1.587289,0.260025,-0.263841,
+ 1.587289,0.260025,-0.263841, 1.53201,0.2136,-0.254652, 1.474028,0.2136,-0.49515,
+ 1.381032,0.2136,-0.718514, 1.430863,0.260025,-0.74444, 1.527214,0.260025,-0.513016,
+ 1.527214,0.260025,-0.513016, 1.474028,0.2136,-0.49515, 1.381032,0.2136,-0.718514,
+ 1.256003,0.2136,-0.921764, 1.301322,0.260025,-0.955023, 1.430863,0.260025,-0.74444,
+ 1.430863,0.260025,-0.74444, 1.381032,0.2136,-0.718514, 1.256003,0.2136,-0.921764,
+ 1.10192,0.2136,-1.10192, 1.14168,0.260025,-1.14168, 1.301322,0.260025,-0.955023,
+ 1.301322,0.260025,-0.955023, 1.256003,0.2136,-0.921764, 1.10192,0.2136,-1.10192,
+ 0.921764,0.2136,-1.256003, 0.955023,0.260025,-1.301322, 1.14168,0.260025,-1.14168,
+ 1.14168,0.260025,-1.14168, 1.10192,0.2136,-1.10192, 0.921764,0.2136,-1.256003,
+ 0.718514,0.2136,-1.381032, 0.74444,0.260025,-1.430863, 0.955023,0.260025,-1.301322,
+ 0.955023,0.260025,-1.301322, 0.921764,0.2136,-1.256003, 0.718514,0.2136,-1.381032,
+ 0.49515,0.2136,-1.474028, 0.513016,0.260025,-1.527214, 0.74444,0.260025,-1.430863,
+ 0.74444,0.260025,-1.430863, 0.718514,0.2136,-1.381032, 0.49515,0.2136,-1.474028,
+ 0.254652,0.2136,-1.53201, 0.263841,0.260025,-1.587289, 0.513016,0.260025,-1.527214,
+ 0.513016,0.260025,-1.527214, 0.49515,0.2136,-1.474028, 0.254652,0.2136,-1.53201,
+ 0,0.2136,-1.552, 0,0.260025,-1.608, 0.263841,0.260025,-1.587289,
+ 0.263841,0.260025,-1.587289, 0.254652,0.2136,-1.53201, 0,0.2136,-1.552,
+ 1.4945,0.177075,-0.248417, 1.53201,0.2136,-0.254652, 1.552,0.2136,0,
+ 1.552,0.2136,0, 1.514,0.177075,0, 1.4945,0.177075,-0.248417,
+ 1.437937,0.177075,-0.483027, 1.474028,0.2136,-0.49515, 1.53201,0.2136,-0.254652,
+ 1.53201,0.2136,-0.254652, 1.4945,0.177075,-0.248417, 1.437937,0.177075,-0.483027,
+ 1.347218,0.177075,-0.700921, 1.381032,0.2136,-0.718514, 1.474028,0.2136,-0.49515,
+ 1.474028,0.2136,-0.49515, 1.437937,0.177075,-0.483027, 1.347218,0.177075,-0.700921,
+ 1.22525,0.177075,-0.899195, 1.256003,0.2136,-0.921764, 1.381032,0.2136,-0.718514,
+ 1.381032,0.2136,-0.718514, 1.347218,0.177075,-0.700921, 1.22525,0.177075,-0.899195,
+ 1.07494,0.177075,-1.07494, 1.10192,0.2136,-1.10192, 1.256003,0.2136,-0.921764,
+ 1.256003,0.2136,-0.921764, 1.22525,0.177075,-0.899195, 1.07494,0.177075,-1.07494,
+ 0.899195,0.177075,-1.22525, 0.921764,0.2136,-1.256003, 1.10192,0.2136,-1.10192,
+ 1.10192,0.2136,-1.10192, 1.07494,0.177075,-1.07494, 0.899195,0.177075,-1.22525,
+ 0.700921,0.177075,-1.347218, 0.718514,0.2136,-1.381032, 0.921764,0.2136,-1.256003,
+ 0.921764,0.2136,-1.256003, 0.899195,0.177075,-1.22525, 0.700921,0.177075,-1.347218,
+ 0.483027,0.177075,-1.437937, 0.49515,0.2136,-1.474028, 0.718514,0.2136,-1.381032,
+ 0.718514,0.2136,-1.381032, 0.700921,0.177075,-1.347218, 0.483027,0.177075,-1.437937,
+ 0.248417,0.177075,-1.4945, 0.254652,0.2136,-1.53201, 0.49515,0.2136,-1.474028,
+ 0.49515,0.2136,-1.474028, 0.483027,0.177075,-1.437937, 0.248417,0.177075,-1.4945,
+ 0,0.177075,-1.514, 0,0.2136,-1.552, 0.254652,0.2136,-1.53201,
+ 0.254652,0.2136,-1.53201, 0.248417,0.177075,-1.4945, 0,0.177075,-1.514,
+ 1.48068,0.15,-0.24612, 1.4945,0.177075,-0.248417, 1.514,0.177075,0,
+ 1.514,0.177075,0, 1.5,0.15,0, 1.48068,0.15,-0.24612,
+ 1.42464,0.15,-0.47856, 1.437937,0.177075,-0.483027, 1.4945,0.177075,-0.248417,
+ 1.4945,0.177075,-0.248417, 1.48068,0.15,-0.24612, 1.42464,0.15,-0.47856,
+ 1.33476,0.15,-0.69444, 1.347218,0.177075,-0.700921, 1.437937,0.177075,-0.483027,
+ 1.437937,0.177075,-0.483027, 1.42464,0.15,-0.47856, 1.33476,0.15,-0.69444,
+ 1.21392,0.15,-0.89088, 1.22525,0.177075,-0.899195, 1.347218,0.177075,-0.700921,
+ 1.347218,0.177075,-0.700921, 1.33476,0.15,-0.69444, 1.21392,0.15,-0.89088,
+ 1.065,0.15,-1.065, 1.07494,0.177075,-1.07494, 1.22525,0.177075,-0.899195,
+ 1.22525,0.177075,-0.899195, 1.21392,0.15,-0.89088, 1.065,0.15,-1.065,
+ 0.89088,0.15,-1.21392, 0.899195,0.177075,-1.22525, 1.07494,0.177075,-1.07494,
+ 1.07494,0.177075,-1.07494, 1.065,0.15,-1.065, 0.89088,0.15,-1.21392,
+ 0.69444,0.15,-1.33476, 0.700921,0.177075,-1.347218, 0.899195,0.177075,-1.22525,
+ 0.899195,0.177075,-1.22525, 0.89088,0.15,-1.21392, 0.69444,0.15,-1.33476,
+ 0.47856,0.15,-1.42464, 0.483027,0.177075,-1.437937, 0.700921,0.177075,-1.347218,
+ 0.700921,0.177075,-1.347218, 0.69444,0.15,-1.33476, 0.47856,0.15,-1.42464,
+ 0.24612,0.15,-1.48068, 0.248417,0.177075,-1.4945, 0.483027,0.177075,-1.437937,
+ 0.483027,0.177075,-1.437937, 0.47856,0.15,-1.42464, 0.24612,0.15,-1.48068,
+ 0,0.15,-1.5, 0,0.177075,-1.514, 0.248417,0.177075,-1.4945,
+ 0.248417,0.177075,-1.4945, 0.24612,0.15,-1.48068, 0,0.15,-1.5,
+ -0.325863,0.771675,-1.96042, -0.32816,0.9,-1.97424, 0,0.9,-2,
+ 0,0.9,-2, 0,0.771675,-1.986, -0.325863,0.771675,-1.96042,
+ -0.633613,0.771675,-1.886223, -0.63808,0.9,-1.89952, -0.32816,0.9,-1.97424,
+ -0.32816,0.9,-1.97424, -0.325863,0.771675,-1.96042, -0.633613,0.771675,-1.886223,
+ -0.919439,0.771675,-1.767222, -0.92592,0.9,-1.77968, -0.63808,0.9,-1.89952,
+ -0.63808,0.9,-1.89952, -0.633613,0.771675,-1.886223, -0.919439,0.771675,-1.767222,
+ -1.179525,0.771675,-1.60723, -1.18784,0.9,-1.61856, -0.92592,0.9,-1.77968,
+ -0.92592,0.9,-1.77968, -0.919439,0.771675,-1.767222, -1.179525,0.771675,-1.60723,
+ -1.41006,0.771675,-1.41006, -1.42,0.9,-1.42, -1.18784,0.9,-1.61856,
+ -1.18784,0.9,-1.61856, -1.179525,0.771675,-1.60723, -1.41006,0.771675,-1.41006,
+ -1.60723,0.771675,-1.179525, -1.61856,0.9,-1.18784, -1.42,0.9,-1.42,
+ -1.42,0.9,-1.42, -1.41006,0.771675,-1.41006, -1.60723,0.771675,-1.179525,
+ -1.767222,0.771675,-0.919439, -1.77968,0.9,-0.92592, -1.61856,0.9,-1.18784,
+ -1.61856,0.9,-1.18784, -1.60723,0.771675,-1.179525, -1.767222,0.771675,-0.919439,
+ -1.886223,0.771675,-0.633613, -1.89952,0.9,-0.63808, -1.77968,0.9,-0.92592,
+ -1.77968,0.9,-0.92592, -1.767222,0.771675,-0.919439, -1.886223,0.771675,-0.633613,
+ -1.96042,0.771675,-0.325863, -1.97424,0.9,-0.32816, -1.89952,0.9,-0.63808,
+ -1.89952,0.9,-0.63808, -1.886223,0.771675,-0.633613, -1.96042,0.771675,-0.325863,
+ -1.986,0.771675,0, -2,0.9,0, -1.97424,0.9,-0.32816,
+ -1.97424,0.9,-0.32816, -1.96042,0.771675,-0.325863, -1.986,0.771675,0,
+ -0.319628,0.6564,-1.92291, -0.325863,0.771675,-1.96042, 0,0.771675,-1.986,
+ 0,0.771675,-1.986, 0,0.6564,-1.948, -0.319628,0.6564,-1.92291,
+ -0.62149,0.6564,-1.850132, -0.633613,0.771675,-1.886223, -0.325863,0.771675,-1.96042,
+ -0.325863,0.771675,-1.96042, -0.319628,0.6564,-1.92291, -0.62149,0.6564,-1.850132,
+ -0.901846,0.6564,-1.733408, -0.919439,0.771675,-1.767222, -0.633613,0.771675,-1.886223,
+ -0.633613,0.771675,-1.886223, -0.62149,0.6564,-1.850132, -0.901846,0.6564,-1.733408,
+ -1.156956,0.6564,-1.576477, -1.179525,0.771675,-1.60723, -0.919439,0.771675,-1.767222,
+ -0.919439,0.771675,-1.767222, -0.901846,0.6564,-1.733408, -1.156956,0.6564,-1.576477,
+ -1.38308,0.6564,-1.38308, -1.41006,0.771675,-1.41006, -1.179525,0.771675,-1.60723,
+ -1.179525,0.771675,-1.60723, -1.156956,0.6564,-1.576477, -1.38308,0.6564,-1.38308,
+ -1.576477,0.6564,-1.156956, -1.60723,0.771675,-1.179525, -1.41006,0.771675,-1.41006,
+ -1.41006,0.771675,-1.41006, -1.38308,0.6564,-1.38308, -1.576477,0.6564,-1.156956,
+ -1.733408,0.6564,-0.901846, -1.767222,0.771675,-0.919439, -1.60723,0.771675,-1.179525,
+ -1.60723,0.771675,-1.179525, -1.576477,0.6564,-1.156956, -1.733408,0.6564,-0.901846,
+ -1.850132,0.6564,-0.62149, -1.886223,0.771675,-0.633613, -1.767222,0.771675,-0.919439,
+ -1.767222,0.771675,-0.919439, -1.733408,0.6564,-0.901846, -1.850132,0.6564,-0.62149,
+ -1.92291,0.6564,-0.319628, -1.96042,0.771675,-0.325863, -1.886223,0.771675,-0.633613,
+ -1.886223,0.771675,-0.633613, -1.850132,0.6564,-0.62149, -1.92291,0.6564,-0.319628,
+ -1.948,0.6564,0, -1.986,0.771675,0, -1.96042,0.771675,-0.325863,
+ -1.96042,0.771675,-0.325863, -1.92291,0.6564,-0.319628, -1.948,0.6564,0,
+ -0.310439,0.553725,-1.867631, -0.319628,0.6564,-1.92291, 0,0.6564,-1.948,
+ 0,0.6564,-1.948, 0,0.553725,-1.892, -0.310439,0.553725,-1.867631,
+ -0.603624,0.553725,-1.796946, -0.62149,0.6564,-1.850132, -0.319628,0.6564,-1.92291,
+ -0.319628,0.6564,-1.92291, -0.310439,0.553725,-1.867631, -0.603624,0.553725,-1.796946,
+ -0.87592,0.553725,-1.683577, -0.901846,0.6564,-1.733408, -0.62149,0.6564,-1.850132,
+ -0.62149,0.6564,-1.850132, -0.603624,0.553725,-1.796946, -0.87592,0.553725,-1.683577,
+ -1.123697,0.553725,-1.531158, -1.156956,0.6564,-1.576477, -0.901846,0.6564,-1.733408,
+ -0.901846,0.6564,-1.733408, -0.87592,0.553725,-1.683577, -1.123697,0.553725,-1.531158,
+ -1.34332,0.553725,-1.34332, -1.38308,0.6564,-1.38308, -1.156956,0.6564,-1.576477,
+ -1.156956,0.6564,-1.576477, -1.123697,0.553725,-1.531158, -1.34332,0.553725,-1.34332,
+ -1.531158,0.553725,-1.123697, -1.576477,0.6564,-1.156956, -1.38308,0.6564,-1.38308,
+ -1.38308,0.6564,-1.38308, -1.34332,0.553725,-1.34332, -1.531158,0.553725,-1.123697,
+ -1.683577,0.553725,-0.87592, -1.733408,0.6564,-0.901846, -1.576477,0.6564,-1.156956,
+ -1.576477,0.6564,-1.156956, -1.531158,0.553725,-1.123697, -1.683577,0.553725,-0.87592,
+ -1.796946,0.553725,-0.603624, -1.850132,0.6564,-0.62149, -1.733408,0.6564,-0.901846,
+ -1.733408,0.6564,-0.901846, -1.683577,0.553725,-0.87592, -1.796946,0.553725,-0.603624,
+ -1.867631,0.553725,-0.310439, -1.92291,0.6564,-0.319628, -1.850132,0.6564,-0.62149,
+ -1.850132,0.6564,-0.62149, -1.796946,0.553725,-0.603624, -1.867631,0.553725,-0.310439,
+ -1.892,0.553725,0, -1.948,0.6564,0, -1.92291,0.6564,-0.319628,
+ -1.92291,0.6564,-0.319628, -1.867631,0.553725,-0.310439, -1.892,0.553725,0,
+ -0.299282,0.4632,-1.800507, -0.310439,0.553725,-1.867631, 0,0.553725,-1.892,
+ 0,0.553725,-1.892, 0,0.4632,-1.824, -0.299282,0.4632,-1.800507,
+ -0.581929,0.4632,-1.732362, -0.603624,0.553725,-1.796946, -0.310439,0.553725,-1.867631,
+ -0.310439,0.553725,-1.867631, -0.299282,0.4632,-1.800507, -0.581929,0.4632,-1.732362,
+ -0.844439,0.4632,-1.623068, -0.87592,0.553725,-1.683577, -0.603624,0.553725,-1.796946,
+ -0.603624,0.553725,-1.796946, -0.581929,0.4632,-1.732362, -0.844439,0.4632,-1.623068,
+ -1.08331,0.4632,-1.476127, -1.123697,0.553725,-1.531158, -0.87592,0.553725,-1.683577,
+ -0.87592,0.553725,-1.683577, -0.844439,0.4632,-1.623068, -1.08331,0.4632,-1.476127,
+ -1.29504,0.4632,-1.29504, -1.34332,0.553725,-1.34332, -1.123697,0.553725,-1.531158,
+ -1.123697,0.553725,-1.531158, -1.08331,0.4632,-1.476127, -1.29504,0.4632,-1.29504,
+ -1.476127,0.4632,-1.08331, -1.531158,0.553725,-1.123697, -1.34332,0.553725,-1.34332,
+ -1.34332,0.553725,-1.34332, -1.29504,0.4632,-1.29504, -1.476127,0.4632,-1.08331,
+ -1.623068,0.4632,-0.844439, -1.683577,0.553725,-0.87592, -1.531158,0.553725,-1.123697,
+ -1.531158,0.553725,-1.123697, -1.476127,0.4632,-1.08331, -1.623068,0.4632,-0.844439,
+ -1.732362,0.4632,-0.581929, -1.796946,0.553725,-0.603624, -1.683577,0.553725,-0.87592,
+ -1.683577,0.553725,-0.87592, -1.623068,0.4632,-0.844439, -1.732362,0.4632,-0.581929,
+ -1.800507,0.4632,-0.299282, -1.867631,0.553725,-0.310439, -1.796946,0.553725,-0.603624,
+ -1.796946,0.553725,-0.603624, -1.732362,0.4632,-0.581929, -1.800507,0.4632,-0.299282,
+ -1.824,0.4632,0, -1.892,0.553725,0, -1.867631,0.553725,-0.310439,
+ -1.867631,0.553725,-0.310439, -1.800507,0.4632,-0.299282, -1.824,0.4632,0,
+ -0.28714,0.384375,-1.72746, -0.299282,0.4632,-1.800507, 0,0.4632,-1.824,
+ 0,0.4632,-1.824, 0,0.384375,-1.75, -0.28714,0.384375,-1.72746,
+ -0.55832,0.384375,-1.66208, -0.581929,0.4632,-1.732362, -0.299282,0.4632,-1.800507,
+ -0.299282,0.4632,-1.800507, -0.28714,0.384375,-1.72746, -0.55832,0.384375,-1.66208,
+ -0.81018,0.384375,-1.55722, -0.844439,0.4632,-1.623068, -0.581929,0.4632,-1.732362,
+ -0.581929,0.4632,-1.732362, -0.55832,0.384375,-1.66208, -0.81018,0.384375,-1.55722,
+ -1.03936,0.384375,-1.41624, -1.08331,0.4632,-1.476127, -0.844439,0.4632,-1.623068,
+ -0.844439,0.4632,-1.623068, -0.81018,0.384375,-1.55722, -1.03936,0.384375,-1.41624,
+ -1.2425,0.384375,-1.2425, -1.29504,0.4632,-1.29504, -1.08331,0.4632,-1.476127,
+ -1.08331,0.4632,-1.476127, -1.03936,0.384375,-1.41624, -1.2425,0.384375,-1.2425,
+ -1.41624,0.384375,-1.03936, -1.476127,0.4632,-1.08331, -1.29504,0.4632,-1.29504,
+ -1.29504,0.4632,-1.29504, -1.2425,0.384375,-1.2425, -1.41624,0.384375,-1.03936,
+ -1.55722,0.384375,-0.81018, -1.623068,0.4632,-0.844439, -1.476127,0.4632,-1.08331,
+ -1.476127,0.4632,-1.08331, -1.41624,0.384375,-1.03936, -1.55722,0.384375,-0.81018,
+ -1.66208,0.384375,-0.55832, -1.732362,0.4632,-0.581929, -1.623068,0.4632,-0.844439,
+ -1.623068,0.4632,-0.844439, -1.55722,0.384375,-0.81018, -1.66208,0.384375,-0.55832,
+ -1.72746,0.384375,-0.28714, -1.800507,0.4632,-0.299282, -1.732362,0.4632,-0.581929,
+ -1.732362,0.4632,-0.581929, -1.66208,0.384375,-0.55832, -1.72746,0.384375,-0.28714,
+ -1.75,0.384375,0, -1.824,0.4632,0, -1.800507,0.4632,-0.299282,
+ -1.800507,0.4632,-0.299282, -1.72746,0.384375,-0.28714, -1.75,0.384375,0,
+ -0.274998,0.3168,-1.654413, -0.28714,0.384375,-1.72746, 0,0.384375,-1.75,
+ 0,0.384375,-1.75, 0,0.3168,-1.676, -0.274998,0.3168,-1.654413,
+ -0.534711,0.3168,-1.591798, -0.55832,0.384375,-1.66208, -0.28714,0.384375,-1.72746,
+ -0.28714,0.384375,-1.72746, -0.274998,0.3168,-1.654413, -0.534711,0.3168,-1.591798,
+ -0.775921,0.3168,-1.491372, -0.81018,0.384375,-1.55722, -0.55832,0.384375,-1.66208,
+ -0.55832,0.384375,-1.66208, -0.534711,0.3168,-1.591798, -0.775921,0.3168,-1.491372,
+ -0.99541,0.3168,-1.356353, -1.03936,0.384375,-1.41624, -0.81018,0.384375,-1.55722,
+ -0.81018,0.384375,-1.55722, -0.775921,0.3168,-1.491372, -0.99541,0.3168,-1.356353,
+ -1.18996,0.3168,-1.18996, -1.2425,0.384375,-1.2425, -1.03936,0.384375,-1.41624,
+ -1.03936,0.384375,-1.41624, -0.99541,0.3168,-1.356353, -1.18996,0.3168,-1.18996,
+ -1.356353,0.3168,-0.99541, -1.41624,0.384375,-1.03936, -1.2425,0.384375,-1.2425,
+ -1.2425,0.384375,-1.2425, -1.18996,0.3168,-1.18996, -1.356353,0.3168,-0.99541,
+ -1.491372,0.3168,-0.775921, -1.55722,0.384375,-0.81018, -1.41624,0.384375,-1.03936,
+ -1.41624,0.384375,-1.03936, -1.356353,0.3168,-0.99541, -1.491372,0.3168,-0.775921,
+ -1.591798,0.3168,-0.534711, -1.66208,0.384375,-0.55832, -1.55722,0.384375,-0.81018,
+ -1.55722,0.384375,-0.81018, -1.491372,0.3168,-0.775921, -1.591798,0.3168,-0.534711,
+ -1.654413,0.3168,-0.274998, -1.72746,0.384375,-0.28714, -1.66208,0.384375,-0.55832,
+ -1.66208,0.384375,-0.55832, -1.591798,0.3168,-0.534711, -1.654413,0.3168,-0.274998,
+ -1.676,0.3168,0, -1.75,0.384375,0, -1.72746,0.384375,-0.28714,
+ -1.72746,0.384375,-0.28714, -1.654413,0.3168,-0.274998, -1.676,0.3168,0,
+ -0.263841,0.260025,-1.587289, -0.274998,0.3168,-1.654413, 0,0.3168,-1.676,
+ 0,0.3168,-1.676, 0,0.260025,-1.608, -0.263841,0.260025,-1.587289,
+ -0.513016,0.260025,-1.527214, -0.534711,0.3168,-1.591798, -0.274998,0.3168,-1.654413,
+ -0.274998,0.3168,-1.654413, -0.263841,0.260025,-1.587289, -0.513016,0.260025,-1.527214,
+ -0.74444,0.260025,-1.430863, -0.775921,0.3168,-1.491372, -0.534711,0.3168,-1.591798,
+ -0.534711,0.3168,-1.591798, -0.513016,0.260025,-1.527214, -0.74444,0.260025,-1.430863,
+ -0.955023,0.260025,-1.301322, -0.99541,0.3168,-1.356353, -0.775921,0.3168,-1.491372,
+ -0.775921,0.3168,-1.491372, -0.74444,0.260025,-1.430863, -0.955023,0.260025,-1.301322,
+ -1.14168,0.260025,-1.14168, -1.18996,0.3168,-1.18996, -0.99541,0.3168,-1.356353,
+ -0.99541,0.3168,-1.356353, -0.955023,0.260025,-1.301322, -1.14168,0.260025,-1.14168,
+ -1.301322,0.260025,-0.955023, -1.356353,0.3168,-0.99541, -1.18996,0.3168,-1.18996,
+ -1.18996,0.3168,-1.18996, -1.14168,0.260025,-1.14168, -1.301322,0.260025,-0.955023,
+ -1.430863,0.260025,-0.74444, -1.491372,0.3168,-0.775921, -1.356353,0.3168,-0.99541,
+ -1.356353,0.3168,-0.99541, -1.301322,0.260025,-0.955023, -1.430863,0.260025,-0.74444,
+ -1.527214,0.260025,-0.513016, -1.591798,0.3168,-0.534711, -1.491372,0.3168,-0.775921,
+ -1.491372,0.3168,-0.775921, -1.430863,0.260025,-0.74444, -1.527214,0.260025,-0.513016,
+ -1.587289,0.260025,-0.263841, -1.654413,0.3168,-0.274998, -1.591798,0.3168,-0.534711,
+ -1.591798,0.3168,-0.534711, -1.527214,0.260025,-0.513016, -1.587289,0.260025,-0.263841,
+ -1.608,0.260025,0, -1.676,0.3168,0, -1.654413,0.3168,-0.274998,
+ -1.654413,0.3168,-0.274998, -1.587289,0.260025,-0.263841, -1.608,0.260025,0,
+ -0.254652,0.2136,-1.53201, -0.263841,0.260025,-1.587289, 0,0.260025,-1.608,
+ 0,0.260025,-1.608, 0,0.2136,-1.552, -0.254652,0.2136,-1.53201,
+ -0.49515,0.2136,-1.474028, -0.513016,0.260025,-1.527214, -0.263841,0.260025,-1.587289,
+ -0.263841,0.260025,-1.587289, -0.254652,0.2136,-1.53201, -0.49515,0.2136,-1.474028,
+ -0.718514,0.2136,-1.381032, -0.74444,0.260025,-1.430863, -0.513016,0.260025,-1.527214,
+ -0.513016,0.260025,-1.527214, -0.49515,0.2136,-1.474028, -0.718514,0.2136,-1.381032,
+ -0.921764,0.2136,-1.256003, -0.955023,0.260025,-1.301322, -0.74444,0.260025,-1.430863,
+ -0.74444,0.260025,-1.430863, -0.718514,0.2136,-1.381032, -0.921764,0.2136,-1.256003,
+ -1.10192,0.2136,-1.10192, -1.14168,0.260025,-1.14168, -0.955023,0.260025,-1.301322,
+ -0.955023,0.260025,-1.301322, -0.921764,0.2136,-1.256003, -1.10192,0.2136,-1.10192,
+ -1.256003,0.2136,-0.921764, -1.301322,0.260025,-0.955023, -1.14168,0.260025,-1.14168,
+ -1.14168,0.260025,-1.14168, -1.10192,0.2136,-1.10192, -1.256003,0.2136,-0.921764,
+ -1.381032,0.2136,-0.718514, -1.430863,0.260025,-0.74444, -1.301322,0.260025,-0.955023,
+ -1.301322,0.260025,-0.955023, -1.256003,0.2136,-0.921764, -1.381032,0.2136,-0.718514,
+ -1.474028,0.2136,-0.49515, -1.527214,0.260025,-0.513016, -1.430863,0.260025,-0.74444,
+ -1.430863,0.260025,-0.74444, -1.381032,0.2136,-0.718514, -1.474028,0.2136,-0.49515,
+ -1.53201,0.2136,-0.254652, -1.587289,0.260025,-0.263841, -1.527214,0.260025,-0.513016,
+ -1.527214,0.260025,-0.513016, -1.474028,0.2136,-0.49515, -1.53201,0.2136,-0.254652,
+ -1.552,0.2136,0, -1.608,0.260025,0, -1.587289,0.260025,-0.263841,
+ -1.587289,0.260025,-0.263841, -1.53201,0.2136,-0.254652, -1.552,0.2136,0,
+ -0.248417,0.177075,-1.4945, -0.254652,0.2136,-1.53201, 0,0.2136,-1.552,
+ 0,0.2136,-1.552, 0,0.177075,-1.514, -0.248417,0.177075,-1.4945,
+ -0.483027,0.177075,-1.437937, -0.49515,0.2136,-1.474028, -0.254652,0.2136,-1.53201,
+ -0.254652,0.2136,-1.53201, -0.248417,0.177075,-1.4945, -0.483027,0.177075,-1.437937,
+ -0.700921,0.177075,-1.347218, -0.718514,0.2136,-1.381032, -0.49515,0.2136,-1.474028,
+ -0.49515,0.2136,-1.474028, -0.483027,0.177075,-1.437937, -0.700921,0.177075,-1.347218,
+ -0.899195,0.177075,-1.22525, -0.921764,0.2136,-1.256003, -0.718514,0.2136,-1.381032,
+ -0.718514,0.2136,-1.381032, -0.700921,0.177075,-1.347218, -0.899195,0.177075,-1.22525,
+ -1.07494,0.177075,-1.07494, -1.10192,0.2136,-1.10192, -0.921764,0.2136,-1.256003,
+ -0.921764,0.2136,-1.256003, -0.899195,0.177075,-1.22525, -1.07494,0.177075,-1.07494,
+ -1.22525,0.177075,-0.899195, -1.256003,0.2136,-0.921764, -1.10192,0.2136,-1.10192,
+ -1.10192,0.2136,-1.10192, -1.07494,0.177075,-1.07494, -1.22525,0.177075,-0.899195,
+ -1.347218,0.177075,-0.700921, -1.381032,0.2136,-0.718514, -1.256003,0.2136,-0.921764,
+ -1.256003,0.2136,-0.921764, -1.22525,0.177075,-0.899195, -1.347218,0.177075,-0.700921,
+ -1.437937,0.177075,-0.483027, -1.474028,0.2136,-0.49515, -1.381032,0.2136,-0.718514,
+ -1.381032,0.2136,-0.718514, -1.347218,0.177075,-0.700921, -1.437937,0.177075,-0.483027,
+ -1.4945,0.177075,-0.248417, -1.53201,0.2136,-0.254652, -1.474028,0.2136,-0.49515,
+ -1.474028,0.2136,-0.49515, -1.437937,0.177075,-0.483027, -1.4945,0.177075,-0.248417,
+ -1.514,0.177075,0, -1.552,0.2136,0, -1.53201,0.2136,-0.254652,
+ -1.53201,0.2136,-0.254652, -1.4945,0.177075,-0.248417, -1.514,0.177075,0,
+ -0.24612,0.15,-1.48068, -0.248417,0.177075,-1.4945, 0,0.177075,-1.514,
+ 0,0.177075,-1.514, 0,0.15,-1.5, -0.24612,0.15,-1.48068,
+ -0.47856,0.15,-1.42464, -0.483027,0.177075,-1.437937, -0.248417,0.177075,-1.4945,
+ -0.248417,0.177075,-1.4945, -0.24612,0.15,-1.48068, -0.47856,0.15,-1.42464,
+ -0.69444,0.15,-1.33476, -0.700921,0.177075,-1.347218, -0.483027,0.177075,-1.437937,
+ -0.483027,0.177075,-1.437937, -0.47856,0.15,-1.42464, -0.69444,0.15,-1.33476,
+ -0.89088,0.15,-1.21392, -0.899195,0.177075,-1.22525, -0.700921,0.177075,-1.347218,
+ -0.700921,0.177075,-1.347218, -0.69444,0.15,-1.33476, -0.89088,0.15,-1.21392,
+ -1.065,0.15,-1.065, -1.07494,0.177075,-1.07494, -0.899195,0.177075,-1.22525,
+ -0.899195,0.177075,-1.22525, -0.89088,0.15,-1.21392, -1.065,0.15,-1.065,
+ -1.21392,0.15,-0.89088, -1.22525,0.177075,-0.899195, -1.07494,0.177075,-1.07494,
+ -1.07494,0.177075,-1.07494, -1.065,0.15,-1.065, -1.21392,0.15,-0.89088,
+ -1.33476,0.15,-0.69444, -1.347218,0.177075,-0.700921, -1.22525,0.177075,-0.899195,
+ -1.22525,0.177075,-0.899195, -1.21392,0.15,-0.89088, -1.33476,0.15,-0.69444,
+ -1.42464,0.15,-0.47856, -1.437937,0.177075,-0.483027, -1.347218,0.177075,-0.700921,
+ -1.347218,0.177075,-0.700921, -1.33476,0.15,-0.69444, -1.42464,0.15,-0.47856,
+ -1.48068,0.15,-0.24612, -1.4945,0.177075,-0.248417, -1.437937,0.177075,-0.483027,
+ -1.437937,0.177075,-0.483027, -1.42464,0.15,-0.47856, -1.48068,0.15,-0.24612,
+ -1.5,0.15,0, -1.514,0.177075,0, -1.4945,0.177075,-0.248417,
+ -1.4945,0.177075,-0.248417, -1.48068,0.15,-0.24612, -1.5,0.15,0,
+ -1.96042,0.771675,0.325863, -1.97424,0.9,0.32816, -2,0.9,0,
+ -2,0.9,0, -1.986,0.771675,0, -1.96042,0.771675,0.325863,
+ -1.886223,0.771675,0.633613, -1.89952,0.9,0.63808, -1.97424,0.9,0.32816,
+ -1.97424,0.9,0.32816, -1.96042,0.771675,0.325863, -1.886223,0.771675,0.633613,
+ -1.767222,0.771675,0.919439, -1.77968,0.9,0.92592, -1.89952,0.9,0.63808,
+ -1.89952,0.9,0.63808, -1.886223,0.771675,0.633613, -1.767222,0.771675,0.919439,
+ -1.60723,0.771675,1.179525, -1.61856,0.9,1.18784, -1.77968,0.9,0.92592,
+ -1.77968,0.9,0.92592, -1.767222,0.771675,0.919439, -1.60723,0.771675,1.179525,
+ -1.41006,0.771675,1.41006, -1.42,0.9,1.42, -1.61856,0.9,1.18784,
+ -1.61856,0.9,1.18784, -1.60723,0.771675,1.179525, -1.41006,0.771675,1.41006,
+ -1.179525,0.771675,1.60723, -1.18784,0.9,1.61856, -1.42,0.9,1.42,
+ -1.42,0.9,1.42, -1.41006,0.771675,1.41006, -1.179525,0.771675,1.60723,
+ -0.919439,0.771675,1.767222, -0.92592,0.9,1.77968, -1.18784,0.9,1.61856,
+ -1.18784,0.9,1.61856, -1.179525,0.771675,1.60723, -0.919439,0.771675,1.767222,
+ -0.633613,0.771675,1.886223, -0.63808,0.9,1.89952, -0.92592,0.9,1.77968,
+ -0.92592,0.9,1.77968, -0.919439,0.771675,1.767222, -0.633613,0.771675,1.886223,
+ -0.325863,0.771675,1.96042, -0.32816,0.9,1.97424, -0.63808,0.9,1.89952,
+ -0.63808,0.9,1.89952, -0.633613,0.771675,1.886223, -0.325863,0.771675,1.96042,
+ 0,0.771675,1.986, 0,0.9,2, -0.32816,0.9,1.97424,
+ -0.32816,0.9,1.97424, -0.325863,0.771675,1.96042, 0,0.771675,1.986,
+ -1.92291,0.6564,0.319628, -1.96042,0.771675,0.325863, -1.986,0.771675,0,
+ -1.986,0.771675,0, -1.948,0.6564,0, -1.92291,0.6564,0.319628,
+ -1.850132,0.6564,0.62149, -1.886223,0.771675,0.633613, -1.96042,0.771675,0.325863,
+ -1.96042,0.771675,0.325863, -1.92291,0.6564,0.319628, -1.850132,0.6564,0.62149,
+ -1.733408,0.6564,0.901846, -1.767222,0.771675,0.919439, -1.886223,0.771675,0.633613,
+ -1.886223,0.771675,0.633613, -1.850132,0.6564,0.62149, -1.733408,0.6564,0.901846,
+ -1.576477,0.6564,1.156956, -1.60723,0.771675,1.179525, -1.767222,0.771675,0.919439,
+ -1.767222,0.771675,0.919439, -1.733408,0.6564,0.901846, -1.576477,0.6564,1.156956,
+ -1.38308,0.6564,1.38308, -1.41006,0.771675,1.41006, -1.60723,0.771675,1.179525,
+ -1.60723,0.771675,1.179525, -1.576477,0.6564,1.156956, -1.38308,0.6564,1.38308,
+ -1.156956,0.6564,1.576477, -1.179525,0.771675,1.60723, -1.41006,0.771675,1.41006,
+ -1.41006,0.771675,1.41006, -1.38308,0.6564,1.38308, -1.156956,0.6564,1.576477,
+ -0.901846,0.6564,1.733408, -0.919439,0.771675,1.767222, -1.179525,0.771675,1.60723,
+ -1.179525,0.771675,1.60723, -1.156956,0.6564,1.576477, -0.901846,0.6564,1.733408,
+ -0.62149,0.6564,1.850132, -0.633613,0.771675,1.886223, -0.919439,0.771675,1.767222,
+ -0.919439,0.771675,1.767222, -0.901846,0.6564,1.733408, -0.62149,0.6564,1.850132,
+ -0.319628,0.6564,1.92291, -0.325863,0.771675,1.96042, -0.633613,0.771675,1.886223,
+ -0.633613,0.771675,1.886223, -0.62149,0.6564,1.850132, -0.319628,0.6564,1.92291,
+ 0,0.6564,1.948, 0,0.771675,1.986, -0.325863,0.771675,1.96042,
+ -0.325863,0.771675,1.96042, -0.319628,0.6564,1.92291, 0,0.6564,1.948,
+ -1.867631,0.553725,0.310439, -1.92291,0.6564,0.319628, -1.948,0.6564,0,
+ -1.948,0.6564,0, -1.892,0.553725,0, -1.867631,0.553725,0.310439,
+ -1.796946,0.553725,0.603624, -1.850132,0.6564,0.62149, -1.92291,0.6564,0.319628,
+ -1.92291,0.6564,0.319628, -1.867631,0.553725,0.310439, -1.796946,0.553725,0.603624,
+ -1.683577,0.553725,0.87592, -1.733408,0.6564,0.901846, -1.850132,0.6564,0.62149,
+ -1.850132,0.6564,0.62149, -1.796946,0.553725,0.603624, -1.683577,0.553725,0.87592,
+ -1.531158,0.553725,1.123697, -1.576477,0.6564,1.156956, -1.733408,0.6564,0.901846,
+ -1.733408,0.6564,0.901846, -1.683577,0.553725,0.87592, -1.531158,0.553725,1.123697,
+ -1.34332,0.553725,1.34332, -1.38308,0.6564,1.38308, -1.576477,0.6564,1.156956,
+ -1.576477,0.6564,1.156956, -1.531158,0.553725,1.123697, -1.34332,0.553725,1.34332,
+ -1.123697,0.553725,1.531158, -1.156956,0.6564,1.576477, -1.38308,0.6564,1.38308,
+ -1.38308,0.6564,1.38308, -1.34332,0.553725,1.34332, -1.123697,0.553725,1.531158,
+ -0.87592,0.553725,1.683577, -0.901846,0.6564,1.733408, -1.156956,0.6564,1.576477,
+ -1.156956,0.6564,1.576477, -1.123697,0.553725,1.531158, -0.87592,0.553725,1.683577,
+ -0.603624,0.553725,1.796946, -0.62149,0.6564,1.850132, -0.901846,0.6564,1.733408,
+ -0.901846,0.6564,1.733408, -0.87592,0.553725,1.683577, -0.603624,0.553725,1.796946,
+ -0.310439,0.553725,1.867631, -0.319628,0.6564,1.92291, -0.62149,0.6564,1.850132,
+ -0.62149,0.6564,1.850132, -0.603624,0.553725,1.796946, -0.310439,0.553725,1.867631,
+ 0,0.553725,1.892, 0,0.6564,1.948, -0.319628,0.6564,1.92291,
+ -0.319628,0.6564,1.92291, -0.310439,0.553725,1.867631, 0,0.553725,1.892,
+ -1.800507,0.4632,0.299282, -1.867631,0.553725,0.310439, -1.892,0.553725,0,
+ -1.892,0.553725,0, -1.824,0.4632,0, -1.800507,0.4632,0.299282,
+ -1.732362,0.4632,0.581929, -1.796946,0.553725,0.603624, -1.867631,0.553725,0.310439,
+ -1.867631,0.553725,0.310439, -1.800507,0.4632,0.299282, -1.732362,0.4632,0.581929,
+ -1.623068,0.4632,0.844439, -1.683577,0.553725,0.87592, -1.796946,0.553725,0.603624,
+ -1.796946,0.553725,0.603624, -1.732362,0.4632,0.581929, -1.623068,0.4632,0.844439,
+ -1.476127,0.4632,1.08331, -1.531158,0.553725,1.123697, -1.683577,0.553725,0.87592,
+ -1.683577,0.553725,0.87592, -1.623068,0.4632,0.844439, -1.476127,0.4632,1.08331,
+ -1.29504,0.4632,1.29504, -1.34332,0.553725,1.34332, -1.531158,0.553725,1.123697,
+ -1.531158,0.553725,1.123697, -1.476127,0.4632,1.08331, -1.29504,0.4632,1.29504,
+ -1.08331,0.4632,1.476127, -1.123697,0.553725,1.531158, -1.34332,0.553725,1.34332,
+ -1.34332,0.553725,1.34332, -1.29504,0.4632,1.29504, -1.08331,0.4632,1.476127,
+ -0.844439,0.4632,1.623068, -0.87592,0.553725,1.683577, -1.123697,0.553725,1.531158,
+ -1.123697,0.553725,1.531158, -1.08331,0.4632,1.476127, -0.844439,0.4632,1.623068,
+ -0.581929,0.4632,1.732362, -0.603624,0.553725,1.796946, -0.87592,0.553725,1.683577,
+ -0.87592,0.553725,1.683577, -0.844439,0.4632,1.623068, -0.581929,0.4632,1.732362,
+ -0.299282,0.4632,1.800507, -0.310439,0.553725,1.867631, -0.603624,0.553725,1.796946,
+ -0.603624,0.553725,1.796946, -0.581929,0.4632,1.732362, -0.299282,0.4632,1.800507,
+ 0,0.4632,1.824, 0,0.553725,1.892, -0.310439,0.553725,1.867631,
+ -0.310439,0.553725,1.867631, -0.299282,0.4632,1.800507, 0,0.4632,1.824,
+ -1.72746,0.384375,0.28714, -1.800507,0.4632,0.299282, -1.824,0.4632,0,
+ -1.824,0.4632,0, -1.75,0.384375,0, -1.72746,0.384375,0.28714,
+ -1.66208,0.384375,0.55832, -1.732362,0.4632,0.581929, -1.800507,0.4632,0.299282,
+ -1.800507,0.4632,0.299282, -1.72746,0.384375,0.28714, -1.66208,0.384375,0.55832,
+ -1.55722,0.384375,0.81018, -1.623068,0.4632,0.844439, -1.732362,0.4632,0.581929,
+ -1.732362,0.4632,0.581929, -1.66208,0.384375,0.55832, -1.55722,0.384375,0.81018,
+ -1.41624,0.384375,1.03936, -1.476127,0.4632,1.08331, -1.623068,0.4632,0.844439,
+ -1.623068,0.4632,0.844439, -1.55722,0.384375,0.81018, -1.41624,0.384375,1.03936,
+ -1.2425,0.384375,1.2425, -1.29504,0.4632,1.29504, -1.476127,0.4632,1.08331,
+ -1.476127,0.4632,1.08331, -1.41624,0.384375,1.03936, -1.2425,0.384375,1.2425,
+ -1.03936,0.384375,1.41624, -1.08331,0.4632,1.476127, -1.29504,0.4632,1.29504,
+ -1.29504,0.4632,1.29504, -1.2425,0.384375,1.2425, -1.03936,0.384375,1.41624,
+ -0.81018,0.384375,1.55722, -0.844439,0.4632,1.623068, -1.08331,0.4632,1.476127,
+ -1.08331,0.4632,1.476127, -1.03936,0.384375,1.41624, -0.81018,0.384375,1.55722,
+ -0.55832,0.384375,1.66208, -0.581929,0.4632,1.732362, -0.844439,0.4632,1.623068,
+ -0.844439,0.4632,1.623068, -0.81018,0.384375,1.55722, -0.55832,0.384375,1.66208,
+ -0.28714,0.384375,1.72746, -0.299282,0.4632,1.800507, -0.581929,0.4632,1.732362,
+ -0.581929,0.4632,1.732362, -0.55832,0.384375,1.66208, -0.28714,0.384375,1.72746,
+ 0,0.384375,1.75, 0,0.4632,1.824, -0.299282,0.4632,1.800507,
+ -0.299282,0.4632,1.800507, -0.28714,0.384375,1.72746, 0,0.384375,1.75,
+ -1.654413,0.3168,0.274998, -1.72746,0.384375,0.28714, -1.75,0.384375,0,
+ -1.75,0.384375,0, -1.676,0.3168,0, -1.654413,0.3168,0.274998,
+ -1.591798,0.3168,0.534711, -1.66208,0.384375,0.55832, -1.72746,0.384375,0.28714,
+ -1.72746,0.384375,0.28714, -1.654413,0.3168,0.274998, -1.591798,0.3168,0.534711,
+ -1.491372,0.3168,0.775921, -1.55722,0.384375,0.81018, -1.66208,0.384375,0.55832,
+ -1.66208,0.384375,0.55832, -1.591798,0.3168,0.534711, -1.491372,0.3168,0.775921,
+ -1.356353,0.3168,0.99541, -1.41624,0.384375,1.03936, -1.55722,0.384375,0.81018,
+ -1.55722,0.384375,0.81018, -1.491372,0.3168,0.775921, -1.356353,0.3168,0.99541,
+ -1.18996,0.3168,1.18996, -1.2425,0.384375,1.2425, -1.41624,0.384375,1.03936,
+ -1.41624,0.384375,1.03936, -1.356353,0.3168,0.99541, -1.18996,0.3168,1.18996,
+ -0.99541,0.3168,1.356353, -1.03936,0.384375,1.41624, -1.2425,0.384375,1.2425,
+ -1.2425,0.384375,1.2425, -1.18996,0.3168,1.18996, -0.99541,0.3168,1.356353,
+ -0.775921,0.3168,1.491372, -0.81018,0.384375,1.55722, -1.03936,0.384375,1.41624,
+ -1.03936,0.384375,1.41624, -0.99541,0.3168,1.356353, -0.775921,0.3168,1.491372,
+ -0.534711,0.3168,1.591798, -0.55832,0.384375,1.66208, -0.81018,0.384375,1.55722,
+ -0.81018,0.384375,1.55722, -0.775921,0.3168,1.491372, -0.534711,0.3168,1.591798,
+ -0.274998,0.3168,1.654413, -0.28714,0.384375,1.72746, -0.55832,0.384375,1.66208,
+ -0.55832,0.384375,1.66208, -0.534711,0.3168,1.591798, -0.274998,0.3168,1.654413,
+ 0,0.3168,1.676, 0,0.384375,1.75, -0.28714,0.384375,1.72746,
+ -0.28714,0.384375,1.72746, -0.274998,0.3168,1.654413, 0,0.3168,1.676,
+ -1.587289,0.260025,0.263841, -1.654413,0.3168,0.274998, -1.676,0.3168,0,
+ -1.676,0.3168,0, -1.608,0.260025,0, -1.587289,0.260025,0.263841,
+ -1.527214,0.260025,0.513016, -1.591798,0.3168,0.534711, -1.654413,0.3168,0.274998,
+ -1.654413,0.3168,0.274998, -1.587289,0.260025,0.263841, -1.527214,0.260025,0.513016,
+ -1.430863,0.260025,0.74444, -1.491372,0.3168,0.775921, -1.591798,0.3168,0.534711,
+ -1.591798,0.3168,0.534711, -1.527214,0.260025,0.513016, -1.430863,0.260025,0.74444,
+ -1.301322,0.260025,0.955023, -1.356353,0.3168,0.99541, -1.491372,0.3168,0.775921,
+ -1.491372,0.3168,0.775921, -1.430863,0.260025,0.74444, -1.301322,0.260025,0.955023,
+ -1.14168,0.260025,1.14168, -1.18996,0.3168,1.18996, -1.356353,0.3168,0.99541,
+ -1.356353,0.3168,0.99541, -1.301322,0.260025,0.955023, -1.14168,0.260025,1.14168,
+ -0.955023,0.260025,1.301322, -0.99541,0.3168,1.356353, -1.18996,0.3168,1.18996,
+ -1.18996,0.3168,1.18996, -1.14168,0.260025,1.14168, -0.955023,0.260025,1.301322,
+ -0.74444,0.260025,1.430863, -0.775921,0.3168,1.491372, -0.99541,0.3168,1.356353,
+ -0.99541,0.3168,1.356353, -0.955023,0.260025,1.301322, -0.74444,0.260025,1.430863,
+ -0.513016,0.260025,1.527214, -0.534711,0.3168,1.591798, -0.775921,0.3168,1.491372,
+ -0.775921,0.3168,1.491372, -0.74444,0.260025,1.430863, -0.513016,0.260025,1.527214,
+ -0.263841,0.260025,1.587289, -0.274998,0.3168,1.654413, -0.534711,0.3168,1.591798,
+ -0.534711,0.3168,1.591798, -0.513016,0.260025,1.527214, -0.263841,0.260025,1.587289,
+ 0,0.260025,1.608, 0,0.3168,1.676, -0.274998,0.3168,1.654413,
+ -0.274998,0.3168,1.654413, -0.263841,0.260025,1.587289, 0,0.260025,1.608,
+ -1.53201,0.2136,0.254652, -1.587289,0.260025,0.263841, -1.608,0.260025,0,
+ -1.608,0.260025,0, -1.552,0.2136,0, -1.53201,0.2136,0.254652,
+ -1.474028,0.2136,0.49515, -1.527214,0.260025,0.513016, -1.587289,0.260025,0.263841,
+ -1.587289,0.260025,0.263841, -1.53201,0.2136,0.254652, -1.474028,0.2136,0.49515,
+ -1.381032,0.2136,0.718514, -1.430863,0.260025,0.74444, -1.527214,0.260025,0.513016,
+ -1.527214,0.260025,0.513016, -1.474028,0.2136,0.49515, -1.381032,0.2136,0.718514,
+ -1.256003,0.2136,0.921764, -1.301322,0.260025,0.955023, -1.430863,0.260025,0.74444,
+ -1.430863,0.260025,0.74444, -1.381032,0.2136,0.718514, -1.256003,0.2136,0.921764,
+ -1.10192,0.2136,1.10192, -1.14168,0.260025,1.14168, -1.301322,0.260025,0.955023,
+ -1.301322,0.260025,0.955023, -1.256003,0.2136,0.921764, -1.10192,0.2136,1.10192,
+ -0.921764,0.2136,1.256003, -0.955023,0.260025,1.301322, -1.14168,0.260025,1.14168,
+ -1.14168,0.260025,1.14168, -1.10192,0.2136,1.10192, -0.921764,0.2136,1.256003,
+ -0.718514,0.2136,1.381032, -0.74444,0.260025,1.430863, -0.955023,0.260025,1.301322,
+ -0.955023,0.260025,1.301322, -0.921764,0.2136,1.256003, -0.718514,0.2136,1.381032,
+ -0.49515,0.2136,1.474028, -0.513016,0.260025,1.527214, -0.74444,0.260025,1.430863,
+ -0.74444,0.260025,1.430863, -0.718514,0.2136,1.381032, -0.49515,0.2136,1.474028,
+ -0.254652,0.2136,1.53201, -0.263841,0.260025,1.587289, -0.513016,0.260025,1.527214,
+ -0.513016,0.260025,1.527214, -0.49515,0.2136,1.474028, -0.254652,0.2136,1.53201,
+ 0,0.2136,1.552, 0,0.260025,1.608, -0.263841,0.260025,1.587289,
+ -0.263841,0.260025,1.587289, -0.254652,0.2136,1.53201, 0,0.2136,1.552,
+ -1.4945,0.177075,0.248417, -1.53201,0.2136,0.254652, -1.552,0.2136,0,
+ -1.552,0.2136,0, -1.514,0.177075,0, -1.4945,0.177075,0.248417,
+ -1.437937,0.177075,0.483027, -1.474028,0.2136,0.49515, -1.53201,0.2136,0.254652,
+ -1.53201,0.2136,0.254652, -1.4945,0.177075,0.248417, -1.437937,0.177075,0.483027,
+ -1.347218,0.177075,0.700921, -1.381032,0.2136,0.718514, -1.474028,0.2136,0.49515,
+ -1.474028,0.2136,0.49515, -1.437937,0.177075,0.483027, -1.347218,0.177075,0.700921,
+ -1.22525,0.177075,0.899195, -1.256003,0.2136,0.921764, -1.381032,0.2136,0.718514,
+ -1.381032,0.2136,0.718514, -1.347218,0.177075,0.700921, -1.22525,0.177075,0.899195,
+ -1.07494,0.177075,1.07494, -1.10192,0.2136,1.10192, -1.256003,0.2136,0.921764,
+ -1.256003,0.2136,0.921764, -1.22525,0.177075,0.899195, -1.07494,0.177075,1.07494,
+ -0.899195,0.177075,1.22525, -0.921764,0.2136,1.256003, -1.10192,0.2136,1.10192,
+ -1.10192,0.2136,1.10192, -1.07494,0.177075,1.07494, -0.899195,0.177075,1.22525,
+ -0.700921,0.177075,1.347218, -0.718514,0.2136,1.381032, -0.921764,0.2136,1.256003,
+ -0.921764,0.2136,1.256003, -0.899195,0.177075,1.22525, -0.700921,0.177075,1.347218,
+ -0.483027,0.177075,1.437937, -0.49515,0.2136,1.474028, -0.718514,0.2136,1.381032,
+ -0.718514,0.2136,1.381032, -0.700921,0.177075,1.347218, -0.483027,0.177075,1.437937,
+ -0.248417,0.177075,1.4945, -0.254652,0.2136,1.53201, -0.49515,0.2136,1.474028,
+ -0.49515,0.2136,1.474028, -0.483027,0.177075,1.437937, -0.248417,0.177075,1.4945,
+ 0,0.177075,1.514, 0,0.2136,1.552, -0.254652,0.2136,1.53201,
+ -0.254652,0.2136,1.53201, -0.248417,0.177075,1.4945, 0,0.177075,1.514,
+ -1.48068,0.15,0.24612, -1.4945,0.177075,0.248417, -1.514,0.177075,0,
+ -1.514,0.177075,0, -1.5,0.15,0, -1.48068,0.15,0.24612,
+ -1.42464,0.15,0.47856, -1.437937,0.177075,0.483027, -1.4945,0.177075,0.248417,
+ -1.4945,0.177075,0.248417, -1.48068,0.15,0.24612, -1.42464,0.15,0.47856,
+ -1.33476,0.15,0.69444, -1.347218,0.177075,0.700921, -1.437937,0.177075,0.483027,
+ -1.437937,0.177075,0.483027, -1.42464,0.15,0.47856, -1.33476,0.15,0.69444,
+ -1.21392,0.15,0.89088, -1.22525,0.177075,0.899195, -1.347218,0.177075,0.700921,
+ -1.347218,0.177075,0.700921, -1.33476,0.15,0.69444, -1.21392,0.15,0.89088,
+ -1.065,0.15,1.065, -1.07494,0.177075,1.07494, -1.22525,0.177075,0.899195,
+ -1.22525,0.177075,0.899195, -1.21392,0.15,0.89088, -1.065,0.15,1.065,
+ -0.89088,0.15,1.21392, -0.899195,0.177075,1.22525, -1.07494,0.177075,1.07494,
+ -1.07494,0.177075,1.07494, -1.065,0.15,1.065, -0.89088,0.15,1.21392,
+ -0.69444,0.15,1.33476, -0.700921,0.177075,1.347218, -0.899195,0.177075,1.22525,
+ -0.899195,0.177075,1.22525, -0.89088,0.15,1.21392, -0.69444,0.15,1.33476,
+ -0.47856,0.15,1.42464, -0.483027,0.177075,1.437937, -0.700921,0.177075,1.347218,
+ -0.700921,0.177075,1.347218, -0.69444,0.15,1.33476, -0.47856,0.15,1.42464,
+ -0.24612,0.15,1.48068, -0.248417,0.177075,1.4945, -0.483027,0.177075,1.437937,
+ -0.483027,0.177075,1.437937, -0.47856,0.15,1.42464, -0.24612,0.15,1.48068,
+ 0,0.15,1.5, 0,0.177075,1.514, -0.248417,0.177075,1.4945,
+ -0.248417,0.177075,1.4945, -0.24612,0.15,1.48068, 0,0.15,1.5,
+ 0.325863,0.771675,1.96042, 0.32816,0.9,1.97424, 0,0.9,2,
+ 0,0.9,2, 0,0.771675,1.986, 0.325863,0.771675,1.96042,
+ 0.633613,0.771675,1.886223, 0.63808,0.9,1.89952, 0.32816,0.9,1.97424,
+ 0.32816,0.9,1.97424, 0.325863,0.771675,1.96042, 0.633613,0.771675,1.886223,
+ 0.919439,0.771675,1.767222, 0.92592,0.9,1.77968, 0.63808,0.9,1.89952,
+ 0.63808,0.9,1.89952, 0.633613,0.771675,1.886223, 0.919439,0.771675,1.767222,
+ 1.179525,0.771675,1.60723, 1.18784,0.9,1.61856, 0.92592,0.9,1.77968,
+ 0.92592,0.9,1.77968, 0.919439,0.771675,1.767222, 1.179525,0.771675,1.60723,
+ 1.41006,0.771675,1.41006, 1.42,0.9,1.42, 1.18784,0.9,1.61856,
+ 1.18784,0.9,1.61856, 1.179525,0.771675,1.60723, 1.41006,0.771675,1.41006,
+ 1.60723,0.771675,1.179525, 1.61856,0.9,1.18784, 1.42,0.9,1.42,
+ 1.42,0.9,1.42, 1.41006,0.771675,1.41006, 1.60723,0.771675,1.179525,
+ 1.767222,0.771675,0.919439, 1.77968,0.9,0.92592, 1.61856,0.9,1.18784,
+ 1.61856,0.9,1.18784, 1.60723,0.771675,1.179525, 1.767222,0.771675,0.919439,
+ 1.886223,0.771675,0.633613, 1.89952,0.9,0.63808, 1.77968,0.9,0.92592,
+ 1.77968,0.9,0.92592, 1.767222,0.771675,0.919439, 1.886223,0.771675,0.633613,
+ 1.96042,0.771675,0.325863, 1.97424,0.9,0.32816, 1.89952,0.9,0.63808,
+ 1.89952,0.9,0.63808, 1.886223,0.771675,0.633613, 1.96042,0.771675,0.325863,
+ 1.986,0.771675,0, 2,0.9,0, 1.97424,0.9,0.32816,
+ 1.97424,0.9,0.32816, 1.96042,0.771675,0.325863, 1.986,0.771675,0,
+ 0.319628,0.6564,1.92291, 0.325863,0.771675,1.96042, 0,0.771675,1.986,
+ 0,0.771675,1.986, 0,0.6564,1.948, 0.319628,0.6564,1.92291,
+ 0.62149,0.6564,1.850132, 0.633613,0.771675,1.886223, 0.325863,0.771675,1.96042,
+ 0.325863,0.771675,1.96042, 0.319628,0.6564,1.92291, 0.62149,0.6564,1.850132,
+ 0.901846,0.6564,1.733408, 0.919439,0.771675,1.767222, 0.633613,0.771675,1.886223,
+ 0.633613,0.771675,1.886223, 0.62149,0.6564,1.850132, 0.901846,0.6564,1.733408,
+ 1.156956,0.6564,1.576477, 1.179525,0.771675,1.60723, 0.919439,0.771675,1.767222,
+ 0.919439,0.771675,1.767222, 0.901846,0.6564,1.733408, 1.156956,0.6564,1.576477,
+ 1.38308,0.6564,1.38308, 1.41006,0.771675,1.41006, 1.179525,0.771675,1.60723,
+ 1.179525,0.771675,1.60723, 1.156956,0.6564,1.576477, 1.38308,0.6564,1.38308,
+ 1.576477,0.6564,1.156956, 1.60723,0.771675,1.179525, 1.41006,0.771675,1.41006,
+ 1.41006,0.771675,1.41006, 1.38308,0.6564,1.38308, 1.576477,0.6564,1.156956,
+ 1.733408,0.6564,0.901846, 1.767222,0.771675,0.919439, 1.60723,0.771675,1.179525,
+ 1.60723,0.771675,1.179525, 1.576477,0.6564,1.156956, 1.733408,0.6564,0.901846,
+ 1.850132,0.6564,0.62149, 1.886223,0.771675,0.633613, 1.767222,0.771675,0.919439,
+ 1.767222,0.771675,0.919439, 1.733408,0.6564,0.901846, 1.850132,0.6564,0.62149,
+ 1.92291,0.6564,0.319628, 1.96042,0.771675,0.325863, 1.886223,0.771675,0.633613,
+ 1.886223,0.771675,0.633613, 1.850132,0.6564,0.62149, 1.92291,0.6564,0.319628,
+ 1.948,0.6564,0, 1.986,0.771675,0, 1.96042,0.771675,0.325863,
+ 1.96042,0.771675,0.325863, 1.92291,0.6564,0.319628, 1.948,0.6564,0,
+ 0.310439,0.553725,1.867631, 0.319628,0.6564,1.92291, 0,0.6564,1.948,
+ 0,0.6564,1.948, 0,0.553725,1.892, 0.310439,0.553725,1.867631,
+ 0.603624,0.553725,1.796946, 0.62149,0.6564,1.850132, 0.319628,0.6564,1.92291,
+ 0.319628,0.6564,1.92291, 0.310439,0.553725,1.867631, 0.603624,0.553725,1.796946,
+ 0.87592,0.553725,1.683577, 0.901846,0.6564,1.733408, 0.62149,0.6564,1.850132,
+ 0.62149,0.6564,1.850132, 0.603624,0.553725,1.796946, 0.87592,0.553725,1.683577,
+ 1.123697,0.553725,1.531158, 1.156956,0.6564,1.576477, 0.901846,0.6564,1.733408,
+ 0.901846,0.6564,1.733408, 0.87592,0.553725,1.683577, 1.123697,0.553725,1.531158,
+ 1.34332,0.553725,1.34332, 1.38308,0.6564,1.38308, 1.156956,0.6564,1.576477,
+ 1.156956,0.6564,1.576477, 1.123697,0.553725,1.531158, 1.34332,0.553725,1.34332,
+ 1.531158,0.553725,1.123697, 1.576477,0.6564,1.156956, 1.38308,0.6564,1.38308,
+ 1.38308,0.6564,1.38308, 1.34332,0.553725,1.34332, 1.531158,0.553725,1.123697,
+ 1.683577,0.553725,0.87592, 1.733408,0.6564,0.901846, 1.576477,0.6564,1.156956,
+ 1.576477,0.6564,1.156956, 1.531158,0.553725,1.123697, 1.683577,0.553725,0.87592,
+ 1.796946,0.553725,0.603624, 1.850132,0.6564,0.62149, 1.733408,0.6564,0.901846,
+ 1.733408,0.6564,0.901846, 1.683577,0.553725,0.87592, 1.796946,0.553725,0.603624,
+ 1.867631,0.553725,0.310439, 1.92291,0.6564,0.319628, 1.850132,0.6564,0.62149,
+ 1.850132,0.6564,0.62149, 1.796946,0.553725,0.603624, 1.867631,0.553725,0.310439,
+ 1.892,0.553725,0, 1.948,0.6564,0, 1.92291,0.6564,0.319628,
+ 1.92291,0.6564,0.319628, 1.867631,0.553725,0.310439, 1.892,0.553725,0,
+ 0.299282,0.4632,1.800507, 0.310439,0.553725,1.867631, 0,0.553725,1.892,
+ 0,0.553725,1.892, 0,0.4632,1.824, 0.299282,0.4632,1.800507,
+ 0.581929,0.4632,1.732362, 0.603624,0.553725,1.796946, 0.310439,0.553725,1.867631,
+ 0.310439,0.553725,1.867631, 0.299282,0.4632,1.800507, 0.581929,0.4632,1.732362,
+ 0.844439,0.4632,1.623068, 0.87592,0.553725,1.683577, 0.603624,0.553725,1.796946,
+ 0.603624,0.553725,1.796946, 0.581929,0.4632,1.732362, 0.844439,0.4632,1.623068,
+ 1.08331,0.4632,1.476127, 1.123697,0.553725,1.531158, 0.87592,0.553725,1.683577,
+ 0.87592,0.553725,1.683577, 0.844439,0.4632,1.623068, 1.08331,0.4632,1.476127,
+ 1.29504,0.4632,1.29504, 1.34332,0.553725,1.34332, 1.123697,0.553725,1.531158,
+ 1.123697,0.553725,1.531158, 1.08331,0.4632,1.476127, 1.29504,0.4632,1.29504,
+ 1.476127,0.4632,1.08331, 1.531158,0.553725,1.123697, 1.34332,0.553725,1.34332,
+ 1.34332,0.553725,1.34332, 1.29504,0.4632,1.29504, 1.476127,0.4632,1.08331,
+ 1.623068,0.4632,0.844439, 1.683577,0.553725,0.87592, 1.531158,0.553725,1.123697,
+ 1.531158,0.553725,1.123697, 1.476127,0.4632,1.08331, 1.623068,0.4632,0.844439,
+ 1.732362,0.4632,0.581929, 1.796946,0.553725,0.603624, 1.683577,0.553725,0.87592,
+ 1.683577,0.553725,0.87592, 1.623068,0.4632,0.844439, 1.732362,0.4632,0.581929,
+ 1.800507,0.4632,0.299282, 1.867631,0.553725,0.310439, 1.796946,0.553725,0.603624,
+ 1.796946,0.553725,0.603624, 1.732362,0.4632,0.581929, 1.800507,0.4632,0.299282,
+ 1.824,0.4632,0, 1.892,0.553725,0, 1.867631,0.553725,0.310439,
+ 1.867631,0.553725,0.310439, 1.800507,0.4632,0.299282, 1.824,0.4632,0,
+ 0.28714,0.384375,1.72746, 0.299282,0.4632,1.800507, 0,0.4632,1.824,
+ 0,0.4632,1.824, 0,0.384375,1.75, 0.28714,0.384375,1.72746,
+ 0.55832,0.384375,1.66208, 0.581929,0.4632,1.732362, 0.299282,0.4632,1.800507,
+ 0.299282,0.4632,1.800507, 0.28714,0.384375,1.72746, 0.55832,0.384375,1.66208,
+ 0.81018,0.384375,1.55722, 0.844439,0.4632,1.623068, 0.581929,0.4632,1.732362,
+ 0.581929,0.4632,1.732362, 0.55832,0.384375,1.66208, 0.81018,0.384375,1.55722,
+ 1.03936,0.384375,1.41624, 1.08331,0.4632,1.476127, 0.844439,0.4632,1.623068,
+ 0.844439,0.4632,1.623068, 0.81018,0.384375,1.55722, 1.03936,0.384375,1.41624,
+ 1.2425,0.384375,1.2425, 1.29504,0.4632,1.29504, 1.08331,0.4632,1.476127,
+ 1.08331,0.4632,1.476127, 1.03936,0.384375,1.41624, 1.2425,0.384375,1.2425,
+ 1.41624,0.384375,1.03936, 1.476127,0.4632,1.08331, 1.29504,0.4632,1.29504,
+ 1.29504,0.4632,1.29504, 1.2425,0.384375,1.2425, 1.41624,0.384375,1.03936,
+ 1.55722,0.384375,0.81018, 1.623068,0.4632,0.844439, 1.476127,0.4632,1.08331,
+ 1.476127,0.4632,1.08331, 1.41624,0.384375,1.03936, 1.55722,0.384375,0.81018,
+ 1.66208,0.384375,0.55832, 1.732362,0.4632,0.581929, 1.623068,0.4632,0.844439,
+ 1.623068,0.4632,0.844439, 1.55722,0.384375,0.81018, 1.66208,0.384375,0.55832,
+ 1.72746,0.384375,0.28714, 1.800507,0.4632,0.299282, 1.732362,0.4632,0.581929,
+ 1.732362,0.4632,0.581929, 1.66208,0.384375,0.55832, 1.72746,0.384375,0.28714,
+ 1.75,0.384375,0, 1.824,0.4632,0, 1.800507,0.4632,0.299282,
+ 1.800507,0.4632,0.299282, 1.72746,0.384375,0.28714, 1.75,0.384375,0,
+ 0.274998,0.3168,1.654413, 0.28714,0.384375,1.72746, 0,0.384375,1.75,
+ 0,0.384375,1.75, 0,0.3168,1.676, 0.274998,0.3168,1.654413,
+ 0.534711,0.3168,1.591798, 0.55832,0.384375,1.66208, 0.28714,0.384375,1.72746,
+ 0.28714,0.384375,1.72746, 0.274998,0.3168,1.654413, 0.534711,0.3168,1.591798,
+ 0.775921,0.3168,1.491372, 0.81018,0.384375,1.55722, 0.55832,0.384375,1.66208,
+ 0.55832,0.384375,1.66208, 0.534711,0.3168,1.591798, 0.775921,0.3168,1.491372,
+ 0.99541,0.3168,1.356353, 1.03936,0.384375,1.41624, 0.81018,0.384375,1.55722,
+ 0.81018,0.384375,1.55722, 0.775921,0.3168,1.491372, 0.99541,0.3168,1.356353,
+ 1.18996,0.3168,1.18996, 1.2425,0.384375,1.2425, 1.03936,0.384375,1.41624,
+ 1.03936,0.384375,1.41624, 0.99541,0.3168,1.356353, 1.18996,0.3168,1.18996,
+ 1.356353,0.3168,0.99541, 1.41624,0.384375,1.03936, 1.2425,0.384375,1.2425,
+ 1.2425,0.384375,1.2425, 1.18996,0.3168,1.18996, 1.356353,0.3168,0.99541,
+ 1.491372,0.3168,0.775921, 1.55722,0.384375,0.81018, 1.41624,0.384375,1.03936,
+ 1.41624,0.384375,1.03936, 1.356353,0.3168,0.99541, 1.491372,0.3168,0.775921,
+ 1.591798,0.3168,0.534711, 1.66208,0.384375,0.55832, 1.55722,0.384375,0.81018,
+ 1.55722,0.384375,0.81018, 1.491372,0.3168,0.775921, 1.591798,0.3168,0.534711,
+ 1.654413,0.3168,0.274998, 1.72746,0.384375,0.28714, 1.66208,0.384375,0.55832,
+ 1.66208,0.384375,0.55832, 1.591798,0.3168,0.534711, 1.654413,0.3168,0.274998,
+ 1.676,0.3168,0, 1.75,0.384375,0, 1.72746,0.384375,0.28714,
+ 1.72746,0.384375,0.28714, 1.654413,0.3168,0.274998, 1.676,0.3168,0,
+ 0.263841,0.260025,1.587289, 0.274998,0.3168,1.654413, 0,0.3168,1.676,
+ 0,0.3168,1.676, 0,0.260025,1.608, 0.263841,0.260025,1.587289,
+ 0.513016,0.260025,1.527214, 0.534711,0.3168,1.591798, 0.274998,0.3168,1.654413,
+ 0.274998,0.3168,1.654413, 0.263841,0.260025,1.587289, 0.513016,0.260025,1.527214,
+ 0.74444,0.260025,1.430863, 0.775921,0.3168,1.491372, 0.534711,0.3168,1.591798,
+ 0.534711,0.3168,1.591798, 0.513016,0.260025,1.527214, 0.74444,0.260025,1.430863,
+ 0.955023,0.260025,1.301322, 0.99541,0.3168,1.356353, 0.775921,0.3168,1.491372,
+ 0.775921,0.3168,1.491372, 0.74444,0.260025,1.430863, 0.955023,0.260025,1.301322,
+ 1.14168,0.260025,1.14168, 1.18996,0.3168,1.18996, 0.99541,0.3168,1.356353,
+ 0.99541,0.3168,1.356353, 0.955023,0.260025,1.301322, 1.14168,0.260025,1.14168,
+ 1.301322,0.260025,0.955023, 1.356353,0.3168,0.99541, 1.18996,0.3168,1.18996,
+ 1.18996,0.3168,1.18996, 1.14168,0.260025,1.14168, 1.301322,0.260025,0.955023,
+ 1.430863,0.260025,0.74444, 1.491372,0.3168,0.775921, 1.356353,0.3168,0.99541,
+ 1.356353,0.3168,0.99541, 1.301322,0.260025,0.955023, 1.430863,0.260025,0.74444,
+ 1.527214,0.260025,0.513016, 1.591798,0.3168,0.534711, 1.491372,0.3168,0.775921,
+ 1.491372,0.3168,0.775921, 1.430863,0.260025,0.74444, 1.527214,0.260025,0.513016,
+ 1.587289,0.260025,0.263841, 1.654413,0.3168,0.274998, 1.591798,0.3168,0.534711,
+ 1.591798,0.3168,0.534711, 1.527214,0.260025,0.513016, 1.587289,0.260025,0.263841,
+ 1.608,0.260025,0, 1.676,0.3168,0, 1.654413,0.3168,0.274998,
+ 1.654413,0.3168,0.274998, 1.587289,0.260025,0.263841, 1.608,0.260025,0,
+ 0.254652,0.2136,1.53201, 0.263841,0.260025,1.587289, 0,0.260025,1.608,
+ 0,0.260025,1.608, 0,0.2136,1.552, 0.254652,0.2136,1.53201,
+ 0.49515,0.2136,1.474028, 0.513016,0.260025,1.527214, 0.263841,0.260025,1.587289,
+ 0.263841,0.260025,1.587289, 0.254652,0.2136,1.53201, 0.49515,0.2136,1.474028,
+ 0.718514,0.2136,1.381032, 0.74444,0.260025,1.430863, 0.513016,0.260025,1.527214,
+ 0.513016,0.260025,1.527214, 0.49515,0.2136,1.474028, 0.718514,0.2136,1.381032,
+ 0.921764,0.2136,1.256003, 0.955023,0.260025,1.301322, 0.74444,0.260025,1.430863,
+ 0.74444,0.260025,1.430863, 0.718514,0.2136,1.381032, 0.921764,0.2136,1.256003,
+ 1.10192,0.2136,1.10192, 1.14168,0.260025,1.14168, 0.955023,0.260025,1.301322,
+ 0.955023,0.260025,1.301322, 0.921764,0.2136,1.256003, 1.10192,0.2136,1.10192,
+ 1.256003,0.2136,0.921764, 1.301322,0.260025,0.955023, 1.14168,0.260025,1.14168,
+ 1.14168,0.260025,1.14168, 1.10192,0.2136,1.10192, 1.256003,0.2136,0.921764,
+ 1.381032,0.2136,0.718514, 1.430863,0.260025,0.74444, 1.301322,0.260025,0.955023,
+ 1.301322,0.260025,0.955023, 1.256003,0.2136,0.921764, 1.381032,0.2136,0.718514,
+ 1.474028,0.2136,0.49515, 1.527214,0.260025,0.513016, 1.430863,0.260025,0.74444,
+ 1.430863,0.260025,0.74444, 1.381032,0.2136,0.718514, 1.474028,0.2136,0.49515,
+ 1.53201,0.2136,0.254652, 1.587289,0.260025,0.263841, 1.527214,0.260025,0.513016,
+ 1.527214,0.260025,0.513016, 1.474028,0.2136,0.49515, 1.53201,0.2136,0.254652,
+ 1.552,0.2136,0, 1.608,0.260025,0, 1.587289,0.260025,0.263841,
+ 1.587289,0.260025,0.263841, 1.53201,0.2136,0.254652, 1.552,0.2136,0,
+ 0.248417,0.177075,1.4945, 0.254652,0.2136,1.53201, 0,0.2136,1.552,
+ 0,0.2136,1.552, 0,0.177075,1.514, 0.248417,0.177075,1.4945,
+ 0.483027,0.177075,1.437937, 0.49515,0.2136,1.474028, 0.254652,0.2136,1.53201,
+ 0.254652,0.2136,1.53201, 0.248417,0.177075,1.4945, 0.483027,0.177075,1.437937,
+ 0.700921,0.177075,1.347218, 0.718514,0.2136,1.381032, 0.49515,0.2136,1.474028,
+ 0.49515,0.2136,1.474028, 0.483027,0.177075,1.437937, 0.700921,0.177075,1.347218,
+ 0.899195,0.177075,1.22525, 0.921764,0.2136,1.256003, 0.718514,0.2136,1.381032,
+ 0.718514,0.2136,1.381032, 0.700921,0.177075,1.347218, 0.899195,0.177075,1.22525,
+ 1.07494,0.177075,1.07494, 1.10192,0.2136,1.10192, 0.921764,0.2136,1.256003,
+ 0.921764,0.2136,1.256003, 0.899195,0.177075,1.22525, 1.07494,0.177075,1.07494,
+ 1.22525,0.177075,0.899195, 1.256003,0.2136,0.921764, 1.10192,0.2136,1.10192,
+ 1.10192,0.2136,1.10192, 1.07494,0.177075,1.07494, 1.22525,0.177075,0.899195,
+ 1.347218,0.177075,0.700921, 1.381032,0.2136,0.718514, 1.256003,0.2136,0.921764,
+ 1.256003,0.2136,0.921764, 1.22525,0.177075,0.899195, 1.347218,0.177075,0.700921,
+ 1.437937,0.177075,0.483027, 1.474028,0.2136,0.49515, 1.381032,0.2136,0.718514,
+ 1.381032,0.2136,0.718514, 1.347218,0.177075,0.700921, 1.437937,0.177075,0.483027,
+ 1.4945,0.177075,0.248417, 1.53201,0.2136,0.254652, 1.474028,0.2136,0.49515,
+ 1.474028,0.2136,0.49515, 1.437937,0.177075,0.483027, 1.4945,0.177075,0.248417,
+ 1.514,0.177075,0, 1.552,0.2136,0, 1.53201,0.2136,0.254652,
+ 1.53201,0.2136,0.254652, 1.4945,0.177075,0.248417, 1.514,0.177075,0,
+ 0.24612,0.15,1.48068, 0.248417,0.177075,1.4945, 0,0.177075,1.514,
+ 0,0.177075,1.514, 0,0.15,1.5, 0.24612,0.15,1.48068,
+ 0.47856,0.15,1.42464, 0.483027,0.177075,1.437937, 0.248417,0.177075,1.4945,
+ 0.248417,0.177075,1.4945, 0.24612,0.15,1.48068, 0.47856,0.15,1.42464,
+ 0.69444,0.15,1.33476, 0.700921,0.177075,1.347218, 0.483027,0.177075,1.437937,
+ 0.483027,0.177075,1.437937, 0.47856,0.15,1.42464, 0.69444,0.15,1.33476,
+ 0.89088,0.15,1.21392, 0.899195,0.177075,1.22525, 0.700921,0.177075,1.347218,
+ 0.700921,0.177075,1.347218, 0.69444,0.15,1.33476, 0.89088,0.15,1.21392,
+ 1.065,0.15,1.065, 1.07494,0.177075,1.07494, 0.899195,0.177075,1.22525,
+ 0.899195,0.177075,1.22525, 0.89088,0.15,1.21392, 1.065,0.15,1.065,
+ 1.21392,0.15,0.89088, 1.22525,0.177075,0.899195, 1.07494,0.177075,1.07494,
+ 1.07494,0.177075,1.07494, 1.065,0.15,1.065, 1.21392,0.15,0.89088,
+ 1.33476,0.15,0.69444, 1.347218,0.177075,0.700921, 1.22525,0.177075,0.899195,
+ 1.22525,0.177075,0.899195, 1.21392,0.15,0.89088, 1.33476,0.15,0.69444,
+ 1.42464,0.15,0.47856, 1.437937,0.177075,0.483027, 1.347218,0.177075,0.700921,
+ 1.347218,0.177075,0.700921, 1.33476,0.15,0.69444, 1.42464,0.15,0.47856,
+ 1.48068,0.15,0.24612, 1.4945,0.177075,0.248417, 1.437937,0.177075,0.483027,
+ 1.437937,0.177075,0.483027, 1.42464,0.15,0.47856, 1.48068,0.15,0.24612,
+ 1.5,0.15,0, 1.514,0.177075,0, 1.4945,0.177075,0.248417,
+ 1.4945,0.177075,0.248417, 1.48068,0.15,0.24612, 1.5,0.15,0,
+ -1.800455,2.031069,-0.081, -1.5972,2.0313,-0.081, -1.6,2.025,0,
+ -1.6,2.025,0, -1.8009,2.024775,0, -1.800455,2.031069,-0.081,
+ -1.799246,2.048152,-0.144, -1.5896,2.0484,-0.144, -1.5972,2.0313,-0.081,
+ -1.5972,2.0313,-0.081, -1.800455,2.031069,-0.081, -1.799246,2.048152,-0.144,
+ -1.797466,2.073326,-0.189, -1.5784,2.0736,-0.189, -1.5896,2.0484,-0.144,
+ -1.5896,2.0484,-0.144, -1.799246,2.048152,-0.144, -1.797466,2.073326,-0.189,
+ -1.795303,2.103896,-0.216, -1.5648,2.1042,-0.216, -1.5784,2.0736,-0.189,
+ -1.5784,2.0736,-0.189, -1.797466,2.073326,-0.189, -1.795303,2.103896,-0.216,
+ -1.79295,2.137163,-0.225, -1.55,2.1375,-0.225, -1.5648,2.1042,-0.216,
+ -1.5648,2.1042,-0.216, -1.795303,2.103896,-0.216, -1.79295,2.137163,-0.225,
+ -1.790597,2.170429,-0.216, -1.5352,2.1708,-0.216, -1.55,2.1375,-0.225,
+ -1.55,2.1375,-0.225, -1.79295,2.137163,-0.225, -1.790597,2.170429,-0.216,
+ -1.788434,2.200999,-0.189, -1.5216,2.2014,-0.189, -1.5352,2.1708,-0.216,
+ -1.5352,2.1708,-0.216, -1.790597,2.170429,-0.216, -1.788434,2.200999,-0.189,
+ -1.786654,2.226173,-0.144, -1.5104,2.2266,-0.144, -1.5216,2.2014,-0.189,
+ -1.5216,2.2014,-0.189, -1.788434,2.200999,-0.189, -1.786654,2.226173,-0.144,
+ -1.785445,2.243256,-0.081, -1.5028,2.2437,-0.081, -1.5104,2.2266,-0.144,
+ -1.5104,2.2266,-0.144, -1.786654,2.226173,-0.144, -1.785445,2.243256,-0.081,
+ -1.785,2.24955,0, -1.5,2.25,0, -1.5028,2.2437,-0.081,
+ -1.5028,2.2437,-0.081, -1.785445,2.243256,-0.081, -1.785,2.24955,0,
+ -1.98479,2.02945,-0.081, -1.800455,2.031069,-0.081, -1.8009,2.024775,0,
+ -1.8009,2.024775,0, -1.9832,2.0232,0, -1.98479,2.02945,-0.081,
+ -1.989107,2.046413,-0.144, -1.799246,2.048152,-0.144, -1.800455,2.031069,-0.081,
+ -1.800455,2.031069,-0.081, -1.98479,2.02945,-0.081, -1.989107,2.046413,-0.144,
+ -1.995469,2.071411,-0.189, -1.797466,2.073326,-0.189, -1.799246,2.048152,-0.144,
+ -1.799246,2.048152,-0.144, -1.989107,2.046413,-0.144, -1.995469,2.071411,-0.189,
+ -2.003194,2.101766,-0.216, -1.795303,2.103896,-0.216, -1.797466,2.073326,-0.189,
+ -1.797466,2.073326,-0.189, -1.995469,2.071411,-0.189, -2.003194,2.101766,-0.216,
+ -2.0116,2.1348,-0.225, -1.79295,2.137163,-0.225, -1.795303,2.103896,-0.216,
+ -1.795303,2.103896,-0.216, -2.003194,2.101766,-0.216, -2.0116,2.1348,-0.225,
+ -2.020006,2.167834,-0.216, -1.790597,2.170429,-0.216, -1.79295,2.137163,-0.225,
+ -1.79295,2.137163,-0.225, -2.0116,2.1348,-0.225, -2.020006,2.167834,-0.216,
+ -2.027731,2.198189,-0.189, -1.788434,2.200999,-0.189, -1.790597,2.170429,-0.216,
+ -1.790597,2.170429,-0.216, -2.020006,2.167834,-0.216, -2.027731,2.198189,-0.189,
+ -2.034093,2.223187,-0.144, -1.786654,2.226173,-0.144, -1.788434,2.200999,-0.189,
+ -1.788434,2.200999,-0.189, -2.027731,2.198189,-0.189, -2.034093,2.223187,-0.144,
+ -2.03841,2.24015,-0.081, -1.785445,2.243256,-0.081, -1.786654,2.226173,-0.144,
+ -1.786654,2.226173,-0.144, -2.034093,2.223187,-0.144, -2.03841,2.24015,-0.081,
+ -2.04,2.2464,0, -1.785,2.24955,0, -1.785445,2.243256,-0.081,
+ -1.785445,2.243256,-0.081, -2.03841,2.24015,-0.081, -2.04,2.2464,0,
+ -2.149624,2.025055,-0.081, -1.98479,2.02945,-0.081, -1.9832,2.0232,0,
+ -1.9832,2.0232,0, -2.1463,2.018925,0, -2.149624,2.025055,-0.081,
+ -2.158645,2.041693,-0.144, -1.989107,2.046413,-0.144, -1.98479,2.02945,-0.081,
+ -1.98479,2.02945,-0.081, -2.149624,2.025055,-0.081, -2.158645,2.041693,-0.144,
+ -2.171939,2.066213,-0.189, -1.995469,2.071411,-0.189, -1.989107,2.046413,-0.144,
+ -1.989107,2.046413,-0.144, -2.158645,2.041693,-0.144, -2.171939,2.066213,-0.189,
+ -2.188082,2.095987,-0.216, -2.003194,2.101766,-0.216, -1.995469,2.071411,-0.189,
+ -1.995469,2.071411,-0.189, -2.171939,2.066213,-0.189, -2.188082,2.095987,-0.216,
+ -2.20565,2.128388,-0.225, -2.0116,2.1348,-0.225, -2.003194,2.101766,-0.216,
+ -2.003194,2.101766,-0.216, -2.188082,2.095987,-0.216, -2.20565,2.128388,-0.225,
+ -2.223218,2.160788,-0.216, -2.020006,2.167834,-0.216, -2.0116,2.1348,-0.225,
+ -2.0116,2.1348,-0.225, -2.20565,2.128388,-0.225, -2.223218,2.160788,-0.216,
+ -2.239361,2.190562,-0.189, -2.027731,2.198189,-0.189, -2.020006,2.167834,-0.216,
+ -2.020006,2.167834,-0.216, -2.223218,2.160788,-0.216, -2.239361,2.190562,-0.189,
+ -2.252655,2.215082,-0.144, -2.034093,2.223187,-0.144, -2.027731,2.198189,-0.189,
+ -2.027731,2.198189,-0.189, -2.239361,2.190562,-0.189, -2.252655,2.215082,-0.144,
+ -2.261676,2.23172,-0.081, -2.03841,2.24015,-0.081, -2.034093,2.223187,-0.144,
+ -2.034093,2.223187,-0.144, -2.252655,2.215082,-0.144, -2.261676,2.23172,-0.081,
+ -2.265,2.23785,0, -2.04,2.2464,0, -2.03841,2.24015,-0.081,
+ -2.03841,2.24015,-0.081, -2.261676,2.23172,-0.081, -2.265,2.23785,0,
+ -2.294371,2.016497,-0.081, -2.149624,2.025055,-0.081, -2.1463,2.018925,0,
+ -2.1463,2.018925,0, -2.2896,2.0106,0, -2.294371,2.016497,-0.081,
+ -2.307322,2.032502,-0.144, -2.158645,2.041693,-0.144, -2.149624,2.025055,-0.081,
+ -2.149624,2.025055,-0.081, -2.294371,2.016497,-0.081, -2.307322,2.032502,-0.144,
+ -2.326406,2.05609,-0.189, -2.171939,2.066213,-0.189, -2.158645,2.041693,-0.144,
+ -2.158645,2.041693,-0.144, -2.307322,2.032502,-0.144, -2.326406,2.05609,-0.189,
+ -2.349581,2.084731,-0.216, -2.188082,2.095987,-0.216, -2.171939,2.066213,-0.189,
+ -2.171939,2.066213,-0.189, -2.326406,2.05609,-0.189, -2.349581,2.084731,-0.216,
+ -2.3748,2.1159,-0.225, -2.20565,2.128388,-0.225, -2.188082,2.095987,-0.216,
+ -2.188082,2.095987,-0.216, -2.349581,2.084731,-0.216, -2.3748,2.1159,-0.225,
+ -2.400019,2.147069,-0.216, -2.223218,2.160788,-0.216, -2.20565,2.128388,-0.225,
+ -2.20565,2.128388,-0.225, -2.3748,2.1159,-0.225, -2.400019,2.147069,-0.216,
+ -2.423194,2.17571,-0.189, -2.239361,2.190562,-0.189, -2.223218,2.160788,-0.216,
+ -2.223218,2.160788,-0.216, -2.400019,2.147069,-0.216, -2.423194,2.17571,-0.189,
+ -2.442278,2.199298,-0.144, -2.252655,2.215082,-0.144, -2.239361,2.190562,-0.189,
+ -2.239361,2.190562,-0.189, -2.423194,2.17571,-0.189, -2.442278,2.199298,-0.144,
+ -2.455229,2.215303,-0.081, -2.261676,2.23172,-0.081, -2.252655,2.215082,-0.144,
+ -2.252655,2.215082,-0.144, -2.442278,2.199298,-0.144, -2.455229,2.215303,-0.081,
+ -2.46,2.2212,0, -2.265,2.23785,0, -2.261676,2.23172,-0.081,
+ -2.261676,2.23172,-0.081, -2.455229,2.215303,-0.081, -2.46,2.2212,0,
+ -2.41845,2.002387,-0.081, -2.294371,2.016497,-0.081, -2.2896,2.0106,0,
+ -2.2896,2.0106,0, -2.4125,1.996875,0, -2.41845,2.002387,-0.081,
+ -2.4346,2.01735,-0.144, -2.307322,2.032502,-0.144, -2.294371,2.016497,-0.081,
+ -2.294371,2.016497,-0.081, -2.41845,2.002387,-0.081, -2.4346,2.01735,-0.144,
+ -2.4584,2.0394,-0.189, -2.326406,2.05609,-0.189, -2.307322,2.032502,-0.144,
+ -2.307322,2.032502,-0.144, -2.4346,2.01735,-0.144, -2.4584,2.0394,-0.189,
+ -2.4873,2.066175,-0.216, -2.349581,2.084731,-0.216, -2.326406,2.05609,-0.189,
+ -2.326406,2.05609,-0.189, -2.4584,2.0394,-0.189, -2.4873,2.066175,-0.216,
+ -2.51875,2.095312,-0.225, -2.3748,2.1159,-0.225, -2.349581,2.084731,-0.216,
+ -2.349581,2.084731,-0.216, -2.4873,2.066175,-0.216, -2.51875,2.095312,-0.225,
+ -2.5502,2.12445,-0.216, -2.400019,2.147069,-0.216, -2.3748,2.1159,-0.225,
+ -2.3748,2.1159,-0.225, -2.51875,2.095312,-0.225, -2.5502,2.12445,-0.216,
+ -2.5791,2.151225,-0.189, -2.423194,2.17571,-0.189, -2.400019,2.147069,-0.216,
+ -2.400019,2.147069,-0.216, -2.5502,2.12445,-0.216, -2.5791,2.151225,-0.189,
+ -2.6029,2.173275,-0.144, -2.442278,2.199298,-0.144, -2.423194,2.17571,-0.189,
+ -2.423194,2.17571,-0.189, -2.5791,2.151225,-0.189, -2.6029,2.173275,-0.144,
+ -2.61905,2.188238,-0.081, -2.455229,2.215303,-0.081, -2.442278,2.199298,-0.144,
+ -2.442278,2.199298,-0.144, -2.6029,2.173275,-0.144, -2.61905,2.188238,-0.081,
+ -2.625,2.19375,0, -2.46,2.2212,0, -2.455229,2.215303,-0.081,
+ -2.455229,2.215303,-0.081, -2.61905,2.188238,-0.081, -2.625,2.19375,0,
+ -2.521277,1.981339,-0.081, -2.41845,2.002387,-0.081, -2.4125,1.996875,0,
+ -2.4125,1.996875,0, -2.5144,1.9764,0, -2.521277,1.981339,-0.081,
+ -2.539942,1.994746,-0.144, -2.4346,2.01735,-0.144, -2.41845,2.002387,-0.081,
+ -2.41845,2.002387,-0.081, -2.521277,1.981339,-0.081, -2.539942,1.994746,-0.144,
+ -2.56745,2.014502,-0.189, -2.4584,2.0394,-0.189, -2.4346,2.01735,-0.144,
+ -2.4346,2.01735,-0.144, -2.539942,1.994746,-0.144, -2.56745,2.014502,-0.189,
+ -2.600851,2.038493,-0.216, -2.4873,2.066175,-0.216, -2.4584,2.0394,-0.189,
+ -2.4584,2.0394,-0.189, -2.56745,2.014502,-0.189, -2.600851,2.038493,-0.216,
+ -2.6372,2.0646,-0.225, -2.51875,2.095312,-0.225, -2.4873,2.066175,-0.216,
+ -2.4873,2.066175,-0.216, -2.600851,2.038493,-0.216, -2.6372,2.0646,-0.225,
+ -2.673549,2.090707,-0.216, -2.5502,2.12445,-0.216, -2.51875,2.095312,-0.225,
+ -2.51875,2.095312,-0.225, -2.6372,2.0646,-0.225, -2.673549,2.090707,-0.216,
+ -2.70695,2.114698,-0.189, -2.5791,2.151225,-0.189, -2.5502,2.12445,-0.216,
+ -2.5502,2.12445,-0.216, -2.673549,2.090707,-0.216, -2.70695,2.114698,-0.189,
+ -2.734458,2.134454,-0.144, -2.6029,2.173275,-0.144, -2.5791,2.151225,-0.189,
+ -2.5791,2.151225,-0.189, -2.70695,2.114698,-0.189, -2.734458,2.134454,-0.144,
+ -2.753123,2.147861,-0.081, -2.61905,2.188238,-0.081, -2.6029,2.173275,-0.144,
+ -2.6029,2.173275,-0.144, -2.734458,2.134454,-0.144, -2.753123,2.147861,-0.081,
+ -2.76,2.1528,0, -2.625,2.19375,0, -2.61905,2.188238,-0.081,
+ -2.61905,2.188238,-0.081, -2.753123,2.147861,-0.081, -2.76,2.1528,0,
+ -2.602268,1.951964,-0.081, -2.521277,1.981339,-0.081, -2.5144,1.9764,0,
+ -2.5144,1.9764,0, -2.5947,1.947825,0, -2.602268,1.951964,-0.081,
+ -2.622811,1.963199,-0.144, -2.539942,1.994746,-0.144, -2.521277,1.981339,-0.081,
+ -2.521277,1.981339,-0.081, -2.602268,1.951964,-0.081, -2.622811,1.963199,-0.144,
+ -2.653085,1.979755,-0.189, -2.56745,2.014502,-0.189, -2.539942,1.994746,-0.144,
+ -2.539942,1.994746,-0.144, -2.622811,1.963199,-0.144, -2.653085,1.979755,-0.189,
+ -2.689846,1.999859,-0.216, -2.600851,2.038493,-0.216, -2.56745,2.014502,-0.189,
+ -2.56745,2.014502,-0.189, -2.653085,1.979755,-0.189, -2.689846,1.999859,-0.216,
+ -2.72985,2.021737,-0.225, -2.6372,2.0646,-0.225, -2.600851,2.038493,-0.216,
+ -2.600851,2.038493,-0.216, -2.689846,1.999859,-0.216, -2.72985,2.021737,-0.225,
+ -2.769854,2.043616,-0.216, -2.673549,2.090707,-0.216, -2.6372,2.0646,-0.225,
+ -2.6372,2.0646,-0.225, -2.72985,2.021737,-0.225, -2.769854,2.043616,-0.216,
+ -2.806615,2.06372,-0.189, -2.70695,2.114698,-0.189, -2.673549,2.090707,-0.216,
+ -2.673549,2.090707,-0.216, -2.769854,2.043616,-0.216, -2.806615,2.06372,-0.189,
+ -2.836889,2.080276,-0.144, -2.734458,2.134454,-0.144, -2.70695,2.114698,-0.189,
+ -2.70695,2.114698,-0.189, -2.806615,2.06372,-0.189, -2.836889,2.080276,-0.144,
+ -2.857432,2.091511,-0.081, -2.753123,2.147861,-0.081, -2.734458,2.134454,-0.144,
+ -2.734458,2.134454,-0.144, -2.836889,2.080276,-0.144, -2.857432,2.091511,-0.081,
+ -2.865,2.09565,0, -2.76,2.1528,0, -2.753123,2.147861,-0.081,
+ -2.753123,2.147861,-0.081, -2.857432,2.091511,-0.081, -2.865,2.09565,0,
+ -2.660842,1.912874,-0.081, -2.602268,1.951964,-0.081, -2.5947,1.947825,0,
+ -2.5947,1.947825,0, -2.6528,1.9098,0, -2.660842,1.912874,-0.081,
+ -2.682669,1.921219,-0.144, -2.622811,1.963199,-0.144, -2.602268,1.951964,-0.081,
+ -2.602268,1.951964,-0.081, -2.660842,1.912874,-0.081, -2.682669,1.921219,-0.144,
+ -2.714835,1.933517,-0.189, -2.653085,1.979755,-0.189, -2.622811,1.963199,-0.144,
+ -2.622811,1.963199,-0.144, -2.682669,1.921219,-0.144, -2.714835,1.933517,-0.189,
+ -2.753894,1.94845,-0.216, -2.689846,1.999859,-0.216, -2.653085,1.979755,-0.189,
+ -2.653085,1.979755,-0.189, -2.714835,1.933517,-0.189, -2.753894,1.94845,-0.216,
+ -2.7964,1.9647,-0.225, -2.72985,2.021737,-0.225, -2.689846,1.999859,-0.216,
+ -2.689846,1.999859,-0.216, -2.753894,1.94845,-0.216, -2.7964,1.9647,-0.225,
+ -2.838906,1.98095,-0.216, -2.769854,2.043616,-0.216, -2.72985,2.021737,-0.225,
+ -2.72985,2.021737,-0.225, -2.7964,1.9647,-0.225, -2.838906,1.98095,-0.216,
+ -2.877965,1.995883,-0.189, -2.806615,2.06372,-0.189, -2.769854,2.043616,-0.216,
+ -2.769854,2.043616,-0.216, -2.838906,1.98095,-0.216, -2.877965,1.995883,-0.189,
+ -2.910131,2.008181,-0.144, -2.836889,2.080276,-0.144, -2.806615,2.06372,-0.189,
+ -2.806615,2.06372,-0.189, -2.877965,1.995883,-0.189, -2.910131,2.008181,-0.144,
+ -2.931958,2.016526,-0.081, -2.857432,2.091511,-0.081, -2.836889,2.080276,-0.144,
+ -2.836889,2.080276,-0.144, -2.910131,2.008181,-0.144, -2.931958,2.016526,-0.081,
+ -2.94,2.0196,0, -2.865,2.09565,0, -2.857432,2.091511,-0.081,
+ -2.857432,2.091511,-0.081, -2.931958,2.016526,-0.081, -2.94,2.0196,0,
+ -2.696413,1.862682,-0.081, -2.660842,1.912874,-0.081, -2.6528,1.9098,0,
+ -2.6528,1.9098,0, -2.6881,1.860975,0, -2.696413,1.862682,-0.081,
+ -2.718978,1.867316,-0.144, -2.682669,1.921219,-0.144, -2.660842,1.912874,-0.081,
+ -2.660842,1.912874,-0.081, -2.696413,1.862682,-0.081, -2.718978,1.867316,-0.144,
+ -2.75223,1.874146,-0.189, -2.714835,1.933517,-0.189, -2.682669,1.921219,-0.144,
+ -2.682669,1.921219,-0.144, -2.718978,1.867316,-0.144, -2.75223,1.874146,-0.189,
+ -2.792609,1.882438,-0.216, -2.753894,1.94845,-0.216, -2.714835,1.933517,-0.189,
+ -2.714835,1.933517,-0.189, -2.75223,1.874146,-0.189, -2.792609,1.882438,-0.216,
+ -2.83655,1.891463,-0.225, -2.7964,1.9647,-0.225, -2.753894,1.94845,-0.216,
+ -2.753894,1.94845,-0.216, -2.792609,1.882438,-0.216, -2.83655,1.891463,-0.225,
+ -2.880491,1.900487,-0.216, -2.838906,1.98095,-0.216, -2.7964,1.9647,-0.225,
+ -2.7964,1.9647,-0.225, -2.83655,1.891463,-0.225, -2.880491,1.900487,-0.216,
+ -2.92087,1.908779,-0.189, -2.877965,1.995883,-0.189, -2.838906,1.98095,-0.216,
+ -2.838906,1.98095,-0.216, -2.880491,1.900487,-0.216, -2.92087,1.908779,-0.189,
+ -2.954122,1.915609,-0.144, -2.910131,2.008181,-0.144, -2.877965,1.995883,-0.189,
+ -2.877965,1.995883,-0.189, -2.92087,1.908779,-0.189, -2.954122,1.915609,-0.144,
+ -2.976687,1.920243,-0.081, -2.931958,2.016526,-0.081, -2.910131,2.008181,-0.144,
+ -2.910131,2.008181,-0.144, -2.954122,1.915609,-0.144, -2.976687,1.920243,-0.081,
+ -2.985,1.92195,0, -2.94,2.0196,0, -2.931958,2.016526,-0.081,
+ -2.931958,2.016526,-0.081, -2.976687,1.920243,-0.081, -2.985,1.92195,0,
+ -2.7084,1.8,-0.081, -2.696413,1.862682,-0.081, -2.6881,1.860975,0,
+ -2.6881,1.860975,0, -2.7,1.8,0, -2.7084,1.8,-0.081,
+ -2.7312,1.8,-0.144, -2.718978,1.867316,-0.144, -2.696413,1.862682,-0.081,
+ -2.696413,1.862682,-0.081, -2.7084,1.8,-0.081, -2.7312,1.8,-0.144,
+ -2.7648,1.8,-0.189, -2.75223,1.874146,-0.189, -2.718978,1.867316,-0.144,
+ -2.718978,1.867316,-0.144, -2.7312,1.8,-0.144, -2.7648,1.8,-0.189,
+ -2.8056,1.8,-0.216, -2.792609,1.882438,-0.216, -2.75223,1.874146,-0.189,
+ -2.75223,1.874146,-0.189, -2.7648,1.8,-0.189, -2.8056,1.8,-0.216,
+ -2.85,1.8,-0.225, -2.83655,1.891463,-0.225, -2.792609,1.882438,-0.216,
+ -2.792609,1.882438,-0.216, -2.8056,1.8,-0.216, -2.85,1.8,-0.225,
+ -2.8944,1.8,-0.216, -2.880491,1.900487,-0.216, -2.83655,1.891463,-0.225,
+ -2.83655,1.891463,-0.225, -2.85,1.8,-0.225, -2.8944,1.8,-0.216,
+ -2.9352,1.8,-0.189, -2.92087,1.908779,-0.189, -2.880491,1.900487,-0.216,
+ -2.880491,1.900487,-0.216, -2.8944,1.8,-0.216, -2.9352,1.8,-0.189,
+ -2.9688,1.8,-0.144, -2.954122,1.915609,-0.144, -2.92087,1.908779,-0.189,
+ -2.92087,1.908779,-0.189, -2.9352,1.8,-0.189, -2.9688,1.8,-0.144,
+ -2.9916,1.8,-0.081, -2.976687,1.920243,-0.081, -2.954122,1.915609,-0.144,
+ -2.954122,1.915609,-0.144, -2.9688,1.8,-0.144, -2.9916,1.8,-0.081,
+ -3,1.8,0, -2.985,1.92195,0, -2.976687,1.920243,-0.081,
+ -2.976687,1.920243,-0.081, -2.9916,1.8,-0.081, -3,1.8,0,
+ -1.785445,2.243256,0.081, -1.5028,2.2437,0.081, -1.5,2.25,0,
+ -1.5,2.25,0, -1.785,2.24955,0, -1.785445,2.243256,0.081,
+ -1.786654,2.226173,0.144, -1.5104,2.2266,0.144, -1.5028,2.2437,0.081,
+ -1.5028,2.2437,0.081, -1.785445,2.243256,0.081, -1.786654,2.226173,0.144,
+ -1.788434,2.200999,0.189, -1.5216,2.2014,0.189, -1.5104,2.2266,0.144,
+ -1.5104,2.2266,0.144, -1.786654,2.226173,0.144, -1.788434,2.200999,0.189,
+ -1.790597,2.170429,0.216, -1.5352,2.1708,0.216, -1.5216,2.2014,0.189,
+ -1.5216,2.2014,0.189, -1.788434,2.200999,0.189, -1.790597,2.170429,0.216,
+ -1.79295,2.137163,0.225, -1.55,2.1375,0.225, -1.5352,2.1708,0.216,
+ -1.5352,2.1708,0.216, -1.790597,2.170429,0.216, -1.79295,2.137163,0.225,
+ -1.795303,2.103896,0.216, -1.5648,2.1042,0.216, -1.55,2.1375,0.225,
+ -1.55,2.1375,0.225, -1.79295,2.137163,0.225, -1.795303,2.103896,0.216,
+ -1.797466,2.073326,0.189, -1.5784,2.0736,0.189, -1.5648,2.1042,0.216,
+ -1.5648,2.1042,0.216, -1.795303,2.103896,0.216, -1.797466,2.073326,0.189,
+ -1.799246,2.048152,0.144, -1.5896,2.0484,0.144, -1.5784,2.0736,0.189,
+ -1.5784,2.0736,0.189, -1.797466,2.073326,0.189, -1.799246,2.048152,0.144,
+ -1.800455,2.031069,0.081, -1.5972,2.0313,0.081, -1.5896,2.0484,0.144,
+ -1.5896,2.0484,0.144, -1.799246,2.048152,0.144, -1.800455,2.031069,0.081,
+ -1.8009,2.024775,0, -1.6,2.025,0, -1.5972,2.0313,0.081,
+ -1.5972,2.0313,0.081, -1.800455,2.031069,0.081, -1.8009,2.024775,0,
+ -2.03841,2.24015,0.081, -1.785445,2.243256,0.081, -1.785,2.24955,0,
+ -1.785,2.24955,0, -2.04,2.2464,0, -2.03841,2.24015,0.081,
+ -2.034093,2.223187,0.144, -1.786654,2.226173,0.144, -1.785445,2.243256,0.081,
+ -1.785445,2.243256,0.081, -2.03841,2.24015,0.081, -2.034093,2.223187,0.144,
+ -2.027731,2.198189,0.189, -1.788434,2.200999,0.189, -1.786654,2.226173,0.144,
+ -1.786654,2.226173,0.144, -2.034093,2.223187,0.144, -2.027731,2.198189,0.189,
+ -2.020006,2.167834,0.216, -1.790597,2.170429,0.216, -1.788434,2.200999,0.189,
+ -1.788434,2.200999,0.189, -2.027731,2.198189,0.189, -2.020006,2.167834,0.216,
+ -2.0116,2.1348,0.225, -1.79295,2.137163,0.225, -1.790597,2.170429,0.216,
+ -1.790597,2.170429,0.216, -2.020006,2.167834,0.216, -2.0116,2.1348,0.225,
+ -2.003194,2.101766,0.216, -1.795303,2.103896,0.216, -1.79295,2.137163,0.225,
+ -1.79295,2.137163,0.225, -2.0116,2.1348,0.225, -2.003194,2.101766,0.216,
+ -1.995469,2.071411,0.189, -1.797466,2.073326,0.189, -1.795303,2.103896,0.216,
+ -1.795303,2.103896,0.216, -2.003194,2.101766,0.216, -1.995469,2.071411,0.189,
+ -1.989107,2.046413,0.144, -1.799246,2.048152,0.144, -1.797466,2.073326,0.189,
+ -1.797466,2.073326,0.189, -1.995469,2.071411,0.189, -1.989107,2.046413,0.144,
+ -1.98479,2.02945,0.081, -1.800455,2.031069,0.081, -1.799246,2.048152,0.144,
+ -1.799246,2.048152,0.144, -1.989107,2.046413,0.144, -1.98479,2.02945,0.081,
+ -1.9832,2.0232,0, -1.8009,2.024775,0, -1.800455,2.031069,0.081,
+ -1.800455,2.031069,0.081, -1.98479,2.02945,0.081, -1.9832,2.0232,0,
+ -2.261676,2.23172,0.081, -2.03841,2.24015,0.081, -2.04,2.2464,0,
+ -2.04,2.2464,0, -2.265,2.23785,0, -2.261676,2.23172,0.081,
+ -2.252655,2.215082,0.144, -2.034093,2.223187,0.144, -2.03841,2.24015,0.081,
+ -2.03841,2.24015,0.081, -2.261676,2.23172,0.081, -2.252655,2.215082,0.144,
+ -2.239361,2.190562,0.189, -2.027731,2.198189,0.189, -2.034093,2.223187,0.144,
+ -2.034093,2.223187,0.144, -2.252655,2.215082,0.144, -2.239361,2.190562,0.189,
+ -2.223218,2.160788,0.216, -2.020006,2.167834,0.216, -2.027731,2.198189,0.189,
+ -2.027731,2.198189,0.189, -2.239361,2.190562,0.189, -2.223218,2.160788,0.216,
+ -2.20565,2.128387,0.225, -2.0116,2.1348,0.225, -2.020006,2.167834,0.216,
+ -2.020006,2.167834,0.216, -2.223218,2.160788,0.216, -2.20565,2.128387,0.225,
+ -2.188082,2.095987,0.216, -2.003194,2.101766,0.216, -2.0116,2.1348,0.225,
+ -2.0116,2.1348,0.225, -2.20565,2.128387,0.225, -2.188082,2.095987,0.216,
+ -2.171939,2.066213,0.189, -1.995469,2.071411,0.189, -2.003194,2.101766,0.216,
+ -2.003194,2.101766,0.216, -2.188082,2.095987,0.216, -2.171939,2.066213,0.189,
+ -2.158645,2.041693,0.144, -1.989107,2.046413,0.144, -1.995469,2.071411,0.189,
+ -1.995469,2.071411,0.189, -2.171939,2.066213,0.189, -2.158645,2.041693,0.144,
+ -2.149624,2.025055,0.081, -1.98479,2.02945,0.081, -1.989107,2.046413,0.144,
+ -1.989107,2.046413,0.144, -2.158645,2.041693,0.144, -2.149624,2.025055,0.081,
+ -2.1463,2.018925,0, -1.9832,2.0232,0, -1.98479,2.02945,0.081,
+ -1.98479,2.02945,0.081, -2.149624,2.025055,0.081, -2.1463,2.018925,0,
+ -2.455229,2.215303,0.081, -2.261676,2.23172,0.081, -2.265,2.23785,0,
+ -2.265,2.23785,0, -2.46,2.2212,0, -2.455229,2.215303,0.081,
+ -2.442278,2.199298,0.144, -2.252655,2.215082,0.144, -2.261676,2.23172,0.081,
+ -2.261676,2.23172,0.081, -2.455229,2.215303,0.081, -2.442278,2.199298,0.144,
+ -2.423194,2.17571,0.189, -2.239361,2.190562,0.189, -2.252655,2.215082,0.144,
+ -2.252655,2.215082,0.144, -2.442278,2.199298,0.144, -2.423194,2.17571,0.189,
+ -2.400019,2.147069,0.216, -2.223218,2.160788,0.216, -2.239361,2.190562,0.189,
+ -2.239361,2.190562,0.189, -2.423194,2.17571,0.189, -2.400019,2.147069,0.216,
+ -2.3748,2.1159,0.225, -2.20565,2.128387,0.225, -2.223218,2.160788,0.216,
+ -2.223218,2.160788,0.216, -2.400019,2.147069,0.216, -2.3748,2.1159,0.225,
+ -2.349581,2.084731,0.216, -2.188082,2.095987,0.216, -2.20565,2.128387,0.225,
+ -2.20565,2.128387,0.225, -2.3748,2.1159,0.225, -2.349581,2.084731,0.216,
+ -2.326406,2.05609,0.189, -2.171939,2.066213,0.189, -2.188082,2.095987,0.216,
+ -2.188082,2.095987,0.216, -2.349581,2.084731,0.216, -2.326406,2.05609,0.189,
+ -2.307322,2.032502,0.144, -2.158645,2.041693,0.144, -2.171939,2.066213,0.189,
+ -2.171939,2.066213,0.189, -2.326406,2.05609,0.189, -2.307322,2.032502,0.144,
+ -2.294371,2.016497,0.081, -2.149624,2.025055,0.081, -2.158645,2.041693,0.144,
+ -2.158645,2.041693,0.144, -2.307322,2.032502,0.144, -2.294371,2.016497,0.081,
+ -2.2896,2.0106,0, -2.1463,2.018925,0, -2.149624,2.025055,0.081,
+ -2.149624,2.025055,0.081, -2.294371,2.016497,0.081, -2.2896,2.0106,0,
+ -2.61905,2.188238,0.081, -2.455229,2.215303,0.081, -2.46,2.2212,0,
+ -2.46,2.2212,0, -2.625,2.19375,0, -2.61905,2.188238,0.081,
+ -2.6029,2.173275,0.144, -2.442278,2.199298,0.144, -2.455229,2.215303,0.081,
+ -2.455229,2.215303,0.081, -2.61905,2.188238,0.081, -2.6029,2.173275,0.144,
+ -2.5791,2.151225,0.189, -2.423194,2.17571,0.189, -2.442278,2.199298,0.144,
+ -2.442278,2.199298,0.144, -2.6029,2.173275,0.144, -2.5791,2.151225,0.189,
+ -2.5502,2.12445,0.216, -2.400019,2.147069,0.216, -2.423194,2.17571,0.189,
+ -2.423194,2.17571,0.189, -2.5791,2.151225,0.189, -2.5502,2.12445,0.216,
+ -2.51875,2.095312,0.225, -2.3748,2.1159,0.225, -2.400019,2.147069,0.216,
+ -2.400019,2.147069,0.216, -2.5502,2.12445,0.216, -2.51875,2.095312,0.225,
+ -2.4873,2.066175,0.216, -2.349581,2.084731,0.216, -2.3748,2.1159,0.225,
+ -2.3748,2.1159,0.225, -2.51875,2.095312,0.225, -2.4873,2.066175,0.216,
+ -2.4584,2.0394,0.189, -2.326406,2.05609,0.189, -2.349581,2.084731,0.216,
+ -2.349581,2.084731,0.216, -2.4873,2.066175,0.216, -2.4584,2.0394,0.189,
+ -2.4346,2.01735,0.144, -2.307322,2.032502,0.144, -2.326406,2.05609,0.189,
+ -2.326406,2.05609,0.189, -2.4584,2.0394,0.189, -2.4346,2.01735,0.144,
+ -2.41845,2.002388,0.081, -2.294371,2.016497,0.081, -2.307322,2.032502,0.144,
+ -2.307322,2.032502,0.144, -2.4346,2.01735,0.144, -2.41845,2.002388,0.081,
+ -2.4125,1.996875,0, -2.2896,2.0106,0, -2.294371,2.016497,0.081,
+ -2.294371,2.016497,0.081, -2.41845,2.002388,0.081, -2.4125,1.996875,0,
+ -2.753123,2.147861,0.081, -2.61905,2.188238,0.081, -2.625,2.19375,0,
+ -2.625,2.19375,0, -2.76,2.1528,0, -2.753123,2.147861,0.081,
+ -2.734458,2.134454,0.144, -2.6029,2.173275,0.144, -2.61905,2.188238,0.081,
+ -2.61905,2.188238,0.081, -2.753123,2.147861,0.081, -2.734458,2.134454,0.144,
+ -2.70695,2.114698,0.189, -2.5791,2.151225,0.189, -2.6029,2.173275,0.144,
+ -2.6029,2.173275,0.144, -2.734458,2.134454,0.144, -2.70695,2.114698,0.189,
+ -2.673549,2.090707,0.216, -2.5502,2.12445,0.216, -2.5791,2.151225,0.189,
+ -2.5791,2.151225,0.189, -2.70695,2.114698,0.189, -2.673549,2.090707,0.216,
+ -2.6372,2.0646,0.225, -2.51875,2.095312,0.225, -2.5502,2.12445,0.216,
+ -2.5502,2.12445,0.216, -2.673549,2.090707,0.216, -2.6372,2.0646,0.225,
+ -2.600851,2.038493,0.216, -2.4873,2.066175,0.216, -2.51875,2.095312,0.225,
+ -2.51875,2.095312,0.225, -2.6372,2.0646,0.225, -2.600851,2.038493,0.216,
+ -2.56745,2.014502,0.189, -2.4584,2.0394,0.189, -2.4873,2.066175,0.216,
+ -2.4873,2.066175,0.216, -2.600851,2.038493,0.216, -2.56745,2.014502,0.189,
+ -2.539942,1.994746,0.144, -2.4346,2.01735,0.144, -2.4584,2.0394,0.189,
+ -2.4584,2.0394,0.189, -2.56745,2.014502,0.189, -2.539942,1.994746,0.144,
+ -2.521277,1.981339,0.081, -2.41845,2.002388,0.081, -2.4346,2.01735,0.144,
+ -2.4346,2.01735,0.144, -2.539942,1.994746,0.144, -2.521277,1.981339,0.081,
+ -2.5144,1.9764,0, -2.4125,1.996875,0, -2.41845,2.002388,0.081,
+ -2.41845,2.002388,0.081, -2.521277,1.981339,0.081, -2.5144,1.9764,0,
+ -2.857432,2.091511,0.081, -2.753123,2.147861,0.081, -2.76,2.1528,0,
+ -2.76,2.1528,0, -2.865,2.09565,0, -2.857432,2.091511,0.081,
+ -2.836889,2.080276,0.144, -2.734458,2.134454,0.144, -2.753123,2.147861,0.081,
+ -2.753123,2.147861,0.081, -2.857432,2.091511,0.081, -2.836889,2.080276,0.144,
+ -2.806615,2.06372,0.189, -2.70695,2.114698,0.189, -2.734458,2.134454,0.144,
+ -2.734458,2.134454,0.144, -2.836889,2.080276,0.144, -2.806615,2.06372,0.189,
+ -2.769854,2.043616,0.216, -2.673549,2.090707,0.216, -2.70695,2.114698,0.189,
+ -2.70695,2.114698,0.189, -2.806615,2.06372,0.189, -2.769854,2.043616,0.216,
+ -2.72985,2.021737,0.225, -2.6372,2.0646,0.225, -2.673549,2.090707,0.216,
+ -2.673549,2.090707,0.216, -2.769854,2.043616,0.216, -2.72985,2.021737,0.225,
+ -2.689846,1.999859,0.216, -2.600851,2.038493,0.216, -2.6372,2.0646,0.225,
+ -2.6372,2.0646,0.225, -2.72985,2.021737,0.225, -2.689846,1.999859,0.216,
+ -2.653085,1.979755,0.189, -2.56745,2.014502,0.189, -2.600851,2.038493,0.216,
+ -2.600851,2.038493,0.216, -2.689846,1.999859,0.216, -2.653085,1.979755,0.189,
+ -2.622811,1.963199,0.144, -2.539942,1.994746,0.144, -2.56745,2.014502,0.189,
+ -2.56745,2.014502,0.189, -2.653085,1.979755,0.189, -2.622811,1.963199,0.144,
+ -2.602268,1.951964,0.081, -2.521277,1.981339,0.081, -2.539942,1.994746,0.144,
+ -2.539942,1.994746,0.144, -2.622811,1.963199,0.144, -2.602268,1.951964,0.081,
+ -2.5947,1.947825,0, -2.5144,1.9764,0, -2.521277,1.981339,0.081,
+ -2.521277,1.981339,0.081, -2.602268,1.951964,0.081, -2.5947,1.947825,0,
+ -2.931958,2.016526,0.081, -2.857432,2.091511,0.081, -2.865,2.09565,0,
+ -2.865,2.09565,0, -2.94,2.0196,0, -2.931958,2.016526,0.081,
+ -2.910131,2.008181,0.144, -2.836889,2.080276,0.144, -2.857432,2.091511,0.081,
+ -2.857432,2.091511,0.081, -2.931958,2.016526,0.081, -2.910131,2.008181,0.144,
+ -2.877965,1.995883,0.189, -2.806615,2.06372,0.189, -2.836889,2.080276,0.144,
+ -2.836889,2.080276,0.144, -2.910131,2.008181,0.144, -2.877965,1.995883,0.189,
+ -2.838906,1.98095,0.216, -2.769854,2.043616,0.216, -2.806615,2.06372,0.189,
+ -2.806615,2.06372,0.189, -2.877965,1.995883,0.189, -2.838906,1.98095,0.216,
+ -2.7964,1.9647,0.225, -2.72985,2.021737,0.225, -2.769854,2.043616,0.216,
+ -2.769854,2.043616,0.216, -2.838906,1.98095,0.216, -2.7964,1.9647,0.225,
+ -2.753894,1.94845,0.216, -2.689846,1.999859,0.216, -2.72985,2.021737,0.225,
+ -2.72985,2.021737,0.225, -2.7964,1.9647,0.225, -2.753894,1.94845,0.216,
+ -2.714835,1.933517,0.189, -2.653085,1.979755,0.189, -2.689846,1.999859,0.216,
+ -2.689846,1.999859,0.216, -2.753894,1.94845,0.216, -2.714835,1.933517,0.189,
+ -2.682669,1.921219,0.144, -2.622811,1.963199,0.144, -2.653085,1.979755,0.189,
+ -2.653085,1.979755,0.189, -2.714835,1.933517,0.189, -2.682669,1.921219,0.144,
+ -2.660842,1.912874,0.081, -2.602268,1.951964,0.081, -2.622811,1.963199,0.144,
+ -2.622811,1.963199,0.144, -2.682669,1.921219,0.144, -2.660842,1.912874,0.081,
+ -2.6528,1.9098,0, -2.5947,1.947825,0, -2.602268,1.951964,0.081,
+ -2.602268,1.951964,0.081, -2.660842,1.912874,0.081, -2.6528,1.9098,0,
+ -2.976687,1.920243,0.081, -2.931958,2.016526,0.081, -2.94,2.0196,0,
+ -2.94,2.0196,0, -2.985,1.92195,0, -2.976687,1.920243,0.081,
+ -2.954122,1.915609,0.144, -2.910131,2.008181,0.144, -2.931958,2.016526,0.081,
+ -2.931958,2.016526,0.081, -2.976687,1.920243,0.081, -2.954122,1.915609,0.144,
+ -2.92087,1.908779,0.189, -2.877965,1.995883,0.189, -2.910131,2.008181,0.144,
+ -2.910131,2.008181,0.144, -2.954122,1.915609,0.144, -2.92087,1.908779,0.189,
+ -2.880491,1.900487,0.216, -2.838906,1.98095,0.216, -2.877965,1.995883,0.189,
+ -2.877965,1.995883,0.189, -2.92087,1.908779,0.189, -2.880491,1.900487,0.216,
+ -2.83655,1.891463,0.225, -2.7964,1.9647,0.225, -2.838906,1.98095,0.216,
+ -2.838906,1.98095,0.216, -2.880491,1.900487,0.216, -2.83655,1.891463,0.225,
+ -2.792609,1.882438,0.216, -2.753894,1.94845,0.216, -2.7964,1.9647,0.225,
+ -2.7964,1.9647,0.225, -2.83655,1.891463,0.225, -2.792609,1.882438,0.216,
+ -2.75223,1.874146,0.189, -2.714835,1.933517,0.189, -2.753894,1.94845,0.216,
+ -2.753894,1.94845,0.216, -2.792609,1.882438,0.216, -2.75223,1.874146,0.189,
+ -2.718978,1.867316,0.144, -2.682669,1.921219,0.144, -2.714835,1.933517,0.189,
+ -2.714835,1.933517,0.189, -2.75223,1.874146,0.189, -2.718978,1.867316,0.144,
+ -2.696413,1.862682,0.081, -2.660842,1.912874,0.081, -2.682669,1.921219,0.144,
+ -2.682669,1.921219,0.144, -2.718978,1.867316,0.144, -2.696413,1.862682,0.081,
+ -2.6881,1.860975,0, -2.6528,1.9098,0, -2.660842,1.912874,0.081,
+ -2.660842,1.912874,0.081, -2.696413,1.862682,0.081, -2.6881,1.860975,0,
+ -2.9916,1.8,0.081, -2.976687,1.920243,0.081, -2.985,1.92195,0,
+ -2.985,1.92195,0, -3,1.8,0, -2.9916,1.8,0.081,
+ -2.9688,1.8,0.144, -2.954122,1.915609,0.144, -2.976687,1.920243,0.081,
+ -2.976687,1.920243,0.081, -2.9916,1.8,0.081, -2.9688,1.8,0.144,
+ -2.9352,1.8,0.189, -2.92087,1.908779,0.189, -2.954122,1.915609,0.144,
+ -2.954122,1.915609,0.144, -2.9688,1.8,0.144, -2.9352,1.8,0.189,
+ -2.8944,1.8,0.216, -2.880491,1.900487,0.216, -2.92087,1.908779,0.189,
+ -2.92087,1.908779,0.189, -2.9352,1.8,0.189, -2.8944,1.8,0.216,
+ -2.85,1.8,0.225, -2.83655,1.891463,0.225, -2.880491,1.900487,0.216,
+ -2.880491,1.900487,0.216, -2.8944,1.8,0.216, -2.85,1.8,0.225,
+ -2.8056,1.8,0.216, -2.792609,1.882438,0.216, -2.83655,1.891463,0.225,
+ -2.83655,1.891463,0.225, -2.85,1.8,0.225, -2.8056,1.8,0.216,
+ -2.7648,1.8,0.189, -2.75223,1.874146,0.189, -2.792609,1.882438,0.216,
+ -2.792609,1.882438,0.216, -2.8056,1.8,0.216, -2.7648,1.8,0.189,
+ -2.7312,1.8,0.144, -2.718978,1.867316,0.144, -2.75223,1.874146,0.189,
+ -2.75223,1.874146,0.189, -2.7648,1.8,0.189, -2.7312,1.8,0.144,
+ -2.7084,1.8,0.081, -2.696413,1.862682,0.081, -2.718978,1.867316,0.144,
+ -2.718978,1.867316,0.144, -2.7312,1.8,0.144, -2.7084,1.8,0.081,
+ -2.7,1.8,0, -2.6881,1.860975,0, -2.696413,1.862682,0.081,
+ -2.696413,1.862682,0.081, -2.7084,1.8,0.081, -2.7,1.8,0,
+ -2.702175,1.724519,-0.081, -2.7084,1.8,-0.081, -2.7,1.8,0,
+ -2.7,1.8,0, -2.6939,1.7262,0, -2.702175,1.724519,-0.081,
+ -2.724637,1.719956,-0.144, -2.7312,1.8,-0.144, -2.7084,1.8,-0.081,
+ -2.7084,1.8,-0.081, -2.702175,1.724519,-0.081, -2.724637,1.719956,-0.144,
+ -2.757739,1.713232,-0.189, -2.7648,1.8,-0.189, -2.7312,1.8,-0.144,
+ -2.7312,1.8,-0.144, -2.724637,1.719956,-0.144, -2.757739,1.713232,-0.189,
+ -2.797934,1.705067,-0.216, -2.8056,1.8,-0.216, -2.7648,1.8,-0.189,
+ -2.7648,1.8,-0.189, -2.757739,1.713232,-0.189, -2.797934,1.705067,-0.216,
+ -2.841675,1.696181,-0.225, -2.85,1.8,-0.225, -2.8056,1.8,-0.216,
+ -2.8056,1.8,-0.216, -2.797934,1.705067,-0.216, -2.841675,1.696181,-0.225,
+ -2.885416,1.687296,-0.216, -2.8944,1.8,-0.216, -2.85,1.8,-0.225,
+ -2.85,1.8,-0.225, -2.841675,1.696181,-0.225, -2.885416,1.687296,-0.216,
+ -2.925611,1.679131,-0.189, -2.9352,1.8,-0.189, -2.8944,1.8,-0.216,
+ -2.8944,1.8,-0.216, -2.885416,1.687296,-0.216, -2.925611,1.679131,-0.189,
+ -2.958713,1.672406,-0.144, -2.9688,1.8,-0.144, -2.9352,1.8,-0.189,
+ -2.9352,1.8,-0.189, -2.925611,1.679131,-0.189, -2.958713,1.672406,-0.144,
+ -2.981175,1.667844,-0.081, -2.9916,1.8,-0.081, -2.9688,1.8,-0.144,
+ -2.9688,1.8,-0.144, -2.958713,1.672406,-0.144, -2.981175,1.667844,-0.081,
+ -2.98945,1.666162,0, -3,1.8,0, -2.9916,1.8,-0.081,
+ -2.9916,1.8,-0.081, -2.981175,1.667844,-0.081, -2.98945,1.666162,0,
+ -2.683107,1.63861,-0.081, -2.702175,1.724519,-0.081, -2.6939,1.7262,0,
+ -2.6939,1.7262,0, -2.6752,1.6416,0, -2.683107,1.63861,-0.081,
+ -2.70457,1.630493,-0.144, -2.724637,1.719956,-0.144, -2.702175,1.724519,-0.081,
+ -2.702175,1.724519,-0.081, -2.683107,1.63861,-0.081, -2.70457,1.630493,-0.144,
+ -2.736198,1.618531,-0.189, -2.757739,1.713232,-0.189, -2.724637,1.719956,-0.144,
+ -2.724637,1.719956,-0.144, -2.70457,1.630493,-0.144, -2.736198,1.618531,-0.189,
+ -2.774605,1.604006,-0.216, -2.797934,1.705067,-0.216, -2.757739,1.713232,-0.189,
+ -2.757739,1.713232,-0.189, -2.736198,1.618531,-0.189, -2.774605,1.604006,-0.216,
+ -2.8164,1.5882,-0.225, -2.841675,1.696181,-0.225, -2.797934,1.705067,-0.216,
+ -2.797934,1.705067,-0.216, -2.774605,1.604006,-0.216, -2.8164,1.5882,-0.225,
+ -2.858195,1.572394,-0.216, -2.885416,1.687296,-0.216, -2.841675,1.696181,-0.225,
+ -2.841675,1.696181,-0.225, -2.8164,1.5882,-0.225, -2.858195,1.572394,-0.216,
+ -2.896602,1.557869,-0.189, -2.925611,1.679131,-0.189, -2.885416,1.687296,-0.216,
+ -2.885416,1.687296,-0.216, -2.858195,1.572394,-0.216, -2.896602,1.557869,-0.189,
+ -2.92823,1.545907,-0.144, -2.958713,1.672406,-0.144, -2.925611,1.679131,-0.189,
+ -2.925611,1.679131,-0.189, -2.896602,1.557869,-0.189, -2.92823,1.545907,-0.144,
+ -2.949693,1.53779,-0.081, -2.981175,1.667844,-0.081, -2.958713,1.672406,-0.144,
+ -2.958713,1.672406,-0.144, -2.92823,1.545907,-0.144, -2.949693,1.53779,-0.081,
+ -2.9576,1.5348,0, -2.98945,1.666162,0, -2.981175,1.667844,-0.081,
+ -2.981175,1.667844,-0.081, -2.949693,1.53779,-0.081, -2.9576,1.5348,0,
+ -2.650604,1.544903,-0.081, -2.683107,1.63861,-0.081, -2.6752,1.6416,0,
+ -2.6752,1.6416,0, -2.6433,1.5489,0, -2.650604,1.544903,-0.081,
+ -2.670428,1.534053,-0.144, -2.70457,1.630493,-0.144, -2.683107,1.63861,-0.081,
+ -2.683107,1.63861,-0.081, -2.650604,1.544903,-0.081, -2.670428,1.534053,-0.144,
+ -2.699644,1.518063,-0.189, -2.736198,1.618531,-0.189, -2.70457,1.630493,-0.144,
+ -2.70457,1.630493,-0.144, -2.670428,1.534053,-0.144, -2.699644,1.518063,-0.189,
+ -2.735119,1.498648,-0.216, -2.774605,1.604006,-0.216, -2.736198,1.618531,-0.189,
+ -2.736198,1.618531,-0.189, -2.699644,1.518063,-0.189, -2.735119,1.498648,-0.216,
+ -2.773725,1.477519,-0.225, -2.8164,1.5882,-0.225, -2.774605,1.604006,-0.216,
+ -2.774605,1.604006,-0.216, -2.735119,1.498648,-0.216, -2.773725,1.477519,-0.225,
+ -2.812331,1.45639,-0.216, -2.858195,1.572394,-0.216, -2.8164,1.5882,-0.225,
+ -2.8164,1.5882,-0.225, -2.773725,1.477519,-0.225, -2.812331,1.45639,-0.216,
+ -2.847806,1.436974,-0.189, -2.896602,1.557869,-0.189, -2.858195,1.572394,-0.216,
+ -2.858195,1.572394,-0.216, -2.812331,1.45639,-0.216, -2.847806,1.436974,-0.189,
+ -2.877022,1.420985,-0.144, -2.92823,1.545907,-0.144, -2.896602,1.557869,-0.189,
+ -2.896602,1.557869,-0.189, -2.847806,1.436974,-0.189, -2.877022,1.420985,-0.144,
+ -2.896846,1.410135,-0.081, -2.949693,1.53779,-0.081, -2.92823,1.545907,-0.144,
+ -2.92823,1.545907,-0.144, -2.877022,1.420985,-0.144, -2.896846,1.410135,-0.081,
+ -2.90415,1.406137,0, -2.9576,1.5348,0, -2.949693,1.53779,-0.081,
+ -2.949693,1.53779,-0.081, -2.896846,1.410135,-0.081, -2.90415,1.406137,0,
+ -2.604074,1.446029,-0.081, -2.650604,1.544903,-0.081, -2.6433,1.5489,0,
+ -2.6433,1.5489,0, -2.5976,1.4508,0, -2.604074,1.446029,-0.081,
+ -2.621645,1.433078,-0.144, -2.670428,1.534053,-0.144, -2.650604,1.544903,-0.081,
+ -2.650604,1.544903,-0.081, -2.604074,1.446029,-0.081, -2.621645,1.433078,-0.144,
+ -2.647539,1.413994,-0.189, -2.699644,1.518063,-0.189, -2.670428,1.534053,-0.144,
+ -2.670428,1.534053,-0.144, -2.621645,1.433078,-0.144, -2.647539,1.413994,-0.189,
+ -2.678982,1.390819,-0.216, -2.735119,1.498648,-0.216, -2.699644,1.518063,-0.189,
+ -2.699644,1.518063,-0.189, -2.647539,1.413994,-0.189, -2.678982,1.390819,-0.216,
+ -2.7132,1.3656,-0.225, -2.773725,1.477519,-0.225, -2.735119,1.498648,-0.216,
+ -2.735119,1.498648,-0.216, -2.678982,1.390819,-0.216, -2.7132,1.3656,-0.225,
+ -2.747418,1.340381,-0.216, -2.812331,1.45639,-0.216, -2.773725,1.477519,-0.225,
+ -2.773725,1.477519,-0.225, -2.7132,1.3656,-0.225, -2.747418,1.340381,-0.216,
+ -2.778861,1.317206,-0.189, -2.847806,1.436974,-0.189, -2.812331,1.45639,-0.216,
+ -2.812331,1.45639,-0.216, -2.747418,1.340381,-0.216, -2.778861,1.317206,-0.189,
+ -2.804755,1.298122,-0.144, -2.877022,1.420985,-0.144, -2.847806,1.436974,-0.189,
+ -2.847806,1.436974,-0.189, -2.778861,1.317206,-0.189, -2.804755,1.298122,-0.144,
+ -2.822326,1.285171,-0.081, -2.896846,1.410135,-0.081, -2.877022,1.420985,-0.144,
+ -2.877022,1.420985,-0.144, -2.804755,1.298122,-0.144, -2.822326,1.285171,-0.081,
+ -2.8288,1.2804,0, -2.90415,1.406137,0, -2.896846,1.410135,-0.081,
+ -2.896846,1.410135,-0.081, -2.822326,1.285171,-0.081, -2.8288,1.2804,0,
+ -2.542925,1.344619,-0.081, -2.604074,1.446029,-0.081, -2.5976,1.4508,0,
+ -2.5976,1.4508,0, -2.5375,1.35,0, -2.542925,1.344619,-0.081,
+ -2.55765,1.330013,-0.144, -2.621645,1.433078,-0.144, -2.604074,1.446029,-0.081,
+ -2.604074,1.446029,-0.081, -2.542925,1.344619,-0.081, -2.55765,1.330013,-0.144,
+ -2.57935,1.308488,-0.189, -2.647539,1.413994,-0.189, -2.621645,1.433078,-0.144,
+ -2.621645,1.433078,-0.144, -2.55765,1.330013,-0.144, -2.57935,1.308488,-0.189,
+ -2.6057,1.28235,-0.216, -2.678982,1.390819,-0.216, -2.647539,1.413994,-0.189,
+ -2.647539,1.413994,-0.189, -2.57935,1.308488,-0.189, -2.6057,1.28235,-0.216,
+ -2.634375,1.253906,-0.225, -2.7132,1.3656,-0.225, -2.678982,1.390819,-0.216,
+ -2.678982,1.390819,-0.216, -2.6057,1.28235,-0.216, -2.634375,1.253906,-0.225,
+ -2.66305,1.225463,-0.216, -2.747418,1.340381,-0.216, -2.7132,1.3656,-0.225,
+ -2.7132,1.3656,-0.225, -2.634375,1.253906,-0.225, -2.66305,1.225463,-0.216,
+ -2.6894,1.199325,-0.189, -2.778861,1.317206,-0.189, -2.747418,1.340381,-0.216,
+ -2.747418,1.340381,-0.216, -2.66305,1.225463,-0.216, -2.6894,1.199325,-0.189,
+ -2.7111,1.1778,-0.144, -2.804755,1.298122,-0.144, -2.778861,1.317206,-0.189,
+ -2.778861,1.317206,-0.189, -2.6894,1.199325,-0.189, -2.7111,1.1778,-0.144,
+ -2.725825,1.163194,-0.081, -2.822326,1.285171,-0.081, -2.804755,1.298122,-0.144,
+ -2.804755,1.298122,-0.144, -2.7111,1.1778,-0.144, -2.725825,1.163194,-0.081,
+ -2.73125,1.157813,0, -2.8288,1.2804,0, -2.822326,1.285171,-0.081,
+ -2.822326,1.285171,-0.081, -2.725825,1.163194,-0.081, -2.73125,1.157813,0,
+ -2.466566,1.243303,-0.081, -2.542925,1.344619,-0.081, -2.5375,1.35,0,
+ -2.5375,1.35,0, -2.4624,1.2492,0, -2.466566,1.243303,-0.081,
+ -2.477875,1.227298,-0.144, -2.55765,1.330013,-0.144, -2.542925,1.344619,-0.081,
+ -2.542925,1.344619,-0.081, -2.466566,1.243303,-0.081, -2.477875,1.227298,-0.144,
+ -2.494541,1.20371,-0.189, -2.57935,1.308488,-0.189, -2.55765,1.330013,-0.144,
+ -2.55765,1.330013,-0.144, -2.477875,1.227298,-0.144, -2.494541,1.20371,-0.189,
+ -2.514778,1.175069,-0.216, -2.6057,1.28235,-0.216, -2.57935,1.308488,-0.189,
+ -2.57935,1.308488,-0.189, -2.494541,1.20371,-0.189, -2.514778,1.175069,-0.216,
+ -2.5368,1.1439,-0.225, -2.634375,1.253906,-0.225, -2.6057,1.28235,-0.216,
+ -2.6057,1.28235,-0.216, -2.514778,1.175069,-0.216, -2.5368,1.1439,-0.225,
+ -2.558822,1.112731,-0.216, -2.66305,1.225463,-0.216, -2.634375,1.253906,-0.225,
+ -2.634375,1.253906,-0.225, -2.5368,1.1439,-0.225, -2.558822,1.112731,-0.216,
+ -2.579059,1.08409,-0.189, -2.6894,1.199325,-0.189, -2.66305,1.225463,-0.216,
+ -2.66305,1.225463,-0.216, -2.558822,1.112731,-0.216, -2.579059,1.08409,-0.189,
+ -2.595725,1.060502,-0.144, -2.7111,1.1778,-0.144, -2.6894,1.199325,-0.189,
+ -2.6894,1.199325,-0.189, -2.579059,1.08409,-0.189, -2.595725,1.060502,-0.144,
+ -2.607034,1.044497,-0.081, -2.725825,1.163194,-0.081, -2.7111,1.1778,-0.144,
+ -2.7111,1.1778,-0.144, -2.595725,1.060502,-0.144, -2.607034,1.044497,-0.081,
+ -2.6112,1.0386,0, -2.73125,1.157813,0, -2.725825,1.163194,-0.081,
+ -2.725825,1.163194,-0.081, -2.607034,1.044497,-0.081, -2.6112,1.0386,0,
+ -2.374406,1.144713,-0.081, -2.466566,1.243303,-0.081, -2.4624,1.2492,0,
+ -2.4624,1.2492,0, -2.3717,1.1511,0, -2.374406,1.144713,-0.081,
+ -2.381752,1.127376,-0.144, -2.477875,1.227298,-0.144, -2.466566,1.243303,-0.081,
+ -2.466566,1.243303,-0.081, -2.374406,1.144713,-0.081, -2.381752,1.127376,-0.144,
+ -2.392576,1.101828,-0.189, -2.494541,1.20371,-0.189, -2.477875,1.227298,-0.144,
+ -2.477875,1.227298,-0.144, -2.381752,1.127376,-0.144, -2.392576,1.101828,-0.189,
+ -2.405721,1.070804,-0.216, -2.514778,1.175069,-0.216, -2.494541,1.20371,-0.189,
+ -2.494541,1.20371,-0.189, -2.392576,1.101828,-0.189, -2.405721,1.070804,-0.216,
+ -2.420025,1.037044,-0.225, -2.5368,1.1439,-0.225, -2.514778,1.175069,-0.216,
+ -2.514778,1.175069,-0.216, -2.405721,1.070804,-0.216, -2.420025,1.037044,-0.225,
+ -2.434329,1.003283,-0.216, -2.558822,1.112731,-0.216, -2.5368,1.1439,-0.225,
+ -2.5368,1.1439,-0.225, -2.420025,1.037044,-0.225, -2.434329,1.003283,-0.216,
+ -2.447474,0.97226,-0.189, -2.579059,1.08409,-0.189, -2.558822,1.112731,-0.216,
+ -2.558822,1.112731,-0.216, -2.434329,1.003283,-0.216, -2.447474,0.97226,-0.189,
+ -2.458298,0.946711,-0.144, -2.595725,1.060502,-0.144, -2.579059,1.08409,-0.189,
+ -2.579059,1.08409,-0.189, -2.447474,0.97226,-0.189, -2.458298,0.946711,-0.144,
+ -2.465644,0.929375,-0.081, -2.607034,1.044497,-0.081, -2.595725,1.060502,-0.144,
+ -2.595725,1.060502,-0.144, -2.458298,0.946711,-0.144, -2.465644,0.929375,-0.081,
+ -2.46835,0.922987,0, -2.6112,1.0386,0, -2.607034,1.044497,-0.081,
+ -2.607034,1.044497,-0.081, -2.465644,0.929375,-0.081, -2.46835,0.922987,0,
+ -2.265853,1.051478,-0.081, -2.374406,1.144713,-0.081, -2.3717,1.1511,0,
+ -2.3717,1.1511,0, -2.2648,1.0584,0, -2.265853,1.051478,-0.081,
+ -2.26871,1.032691,-0.144, -2.381752,1.127376,-0.144, -2.374406,1.144713,-0.081,
+ -2.374406,1.144713,-0.081, -2.265853,1.051478,-0.081, -2.26871,1.032691,-0.144,
+ -2.272922,1.005005,-0.189, -2.392576,1.101828,-0.189, -2.381752,1.127376,-0.144,
+ -2.381752,1.127376,-0.144, -2.26871,1.032691,-0.144, -2.272922,1.005005,-0.189,
+ -2.278035,0.971386,-0.216, -2.405721,1.070804,-0.216, -2.392576,1.101828,-0.189,
+ -2.392576,1.101828,-0.189, -2.272922,1.005005,-0.189, -2.278035,0.971386,-0.216,
+ -2.2836,0.9348,-0.225, -2.420025,1.037044,-0.225, -2.405721,1.070804,-0.216,
+ -2.405721,1.070804,-0.216, -2.278035,0.971386,-0.216, -2.2836,0.9348,-0.225,
+ -2.289165,0.898214,-0.216, -2.434329,1.003283,-0.216, -2.420025,1.037044,-0.225,
+ -2.420025,1.037044,-0.225, -2.2836,0.9348,-0.225, -2.289165,0.898214,-0.216,
+ -2.294278,0.864595,-0.189, -2.447474,0.97226,-0.189, -2.434329,1.003283,-0.216,
+ -2.434329,1.003283,-0.216, -2.289165,0.898214,-0.216, -2.294278,0.864595,-0.189,
+ -2.29849,0.836909,-0.144, -2.458298,0.946711,-0.144, -2.447474,0.97226,-0.189,
+ -2.447474,0.97226,-0.189, -2.294278,0.864595,-0.189, -2.29849,0.836909,-0.144,
+ -2.301347,0.818122,-0.081, -2.465644,0.929375,-0.081, -2.458298,0.946711,-0.144,
+ -2.458298,0.946711,-0.144, -2.29849,0.836909,-0.144, -2.301347,0.818122,-0.081,
+ -2.3024,0.8112,0, -2.46835,0.922987,0, -2.465644,0.929375,-0.081,
+ -2.465644,0.929375,-0.081, -2.301347,0.818122,-0.081, -2.3024,0.8112,0,
+ -2.140315,0.966231,-0.081, -2.265853,1.051478,-0.081, -2.2648,1.0584,0,
+ -2.2648,1.0584,0, -2.1411,0.9738,0, -2.140315,0.966231,-0.081,
+ -2.138183,0.945685,-0.144, -2.26871,1.032691,-0.144, -2.265853,1.051478,-0.081,
+ -2.265853,1.051478,-0.081, -2.140315,0.966231,-0.081, -2.138183,0.945685,-0.144,
+ -2.135041,0.915407,-0.189, -2.272922,1.005005,-0.189, -2.26871,1.032691,-0.144,
+ -2.26871,1.032691,-0.144, -2.138183,0.945685,-0.144, -2.135041,0.915407,-0.189,
+ -2.131226,0.878641,-0.216, -2.278035,0.971386,-0.216, -2.272922,1.005005,-0.189,
+ -2.272922,1.005005,-0.189, -2.135041,0.915407,-0.189, -2.131226,0.878641,-0.216,
+ -2.127075,0.838631,-0.225, -2.2836,0.9348,-0.225, -2.278035,0.971386,-0.216,
+ -2.278035,0.971386,-0.216, -2.131226,0.878641,-0.216, -2.127075,0.838631,-0.225,
+ -2.122924,0.798621,-0.216, -2.289165,0.898214,-0.216, -2.2836,0.9348,-0.225,
+ -2.2836,0.9348,-0.225, -2.127075,0.838631,-0.225, -2.122924,0.798621,-0.216,
+ -2.119109,0.761855,-0.189, -2.294278,0.864595,-0.189, -2.289165,0.898214,-0.216,
+ -2.289165,0.898214,-0.216, -2.122924,0.798621,-0.216, -2.119109,0.761855,-0.189,
+ -2.115967,0.731578,-0.144, -2.29849,0.836909,-0.144, -2.294278,0.864595,-0.189,
+ -2.294278,0.864595,-0.189, -2.119109,0.761855,-0.189, -2.115967,0.731578,-0.144,
+ -2.113835,0.711032,-0.081, -2.301347,0.818122,-0.081, -2.29849,0.836909,-0.144,
+ -2.29849,0.836909,-0.144, -2.115967,0.731578,-0.144, -2.113835,0.711032,-0.081,
+ -2.11305,0.703463,0, -2.3024,0.8112,0, -2.301347,0.818122,-0.081,
+ -2.301347,0.818122,-0.081, -2.113835,0.711032,-0.081, -2.11305,0.703463,0,
+ -1.9972,0.8916,-0.081, -2.140315,0.966231,-0.081, -2.1411,0.9738,0,
+ -2.1411,0.9738,0, -2,0.9,0, -1.9972,0.8916,-0.081,
+ -1.9896,0.8688,-0.144, -2.138183,0.945685,-0.144, -2.140315,0.966231,-0.081,
+ -2.140315,0.966231,-0.081, -1.9972,0.8916,-0.081, -1.9896,0.8688,-0.144,
+ -1.9784,0.8352,-0.189, -2.135041,0.915407,-0.189, -2.138183,0.945685,-0.144,
+ -2.138183,0.945685,-0.144, -1.9896,0.8688,-0.144, -1.9784,0.8352,-0.189,
+ -1.9648,0.7944,-0.216, -2.131226,0.878641,-0.216, -2.135041,0.915407,-0.189,
+ -2.135041,0.915407,-0.189, -1.9784,0.8352,-0.189, -1.9648,0.7944,-0.216,
+ -1.95,0.75,-0.225, -2.127075,0.838631,-0.225, -2.131226,0.878641,-0.216,
+ -2.131226,0.878641,-0.216, -1.9648,0.7944,-0.216, -1.95,0.75,-0.225,
+ -1.9352,0.7056,-0.216, -2.122924,0.798621,-0.216, -2.127075,0.838631,-0.225,
+ -2.127075,0.838631,-0.225, -1.95,0.75,-0.225, -1.9352,0.7056,-0.216,
+ -1.9216,0.6648,-0.189, -2.119109,0.761855,-0.189, -2.122924,0.798621,-0.216,
+ -2.122924,0.798621,-0.216, -1.9352,0.7056,-0.216, -1.9216,0.6648,-0.189,
+ -1.9104,0.6312,-0.144, -2.115967,0.731578,-0.144, -2.119109,0.761855,-0.189,
+ -2.119109,0.761855,-0.189, -1.9216,0.6648,-0.189, -1.9104,0.6312,-0.144,
+ -1.9028,0.6084,-0.081, -2.113835,0.711032,-0.081, -2.115967,0.731578,-0.144,
+ -2.115967,0.731578,-0.144, -1.9104,0.6312,-0.144, -1.9028,0.6084,-0.081,
+ -1.9,0.6,0, -2.11305,0.703463,0, -2.113835,0.711032,-0.081,
+ -2.113835,0.711032,-0.081, -1.9028,0.6084,-0.081, -1.9,0.6,0,
+ -2.981175,1.667844,0.081, -2.9916,1.8,0.081, -3,1.8,0,
+ -3,1.8,0, -2.98945,1.666162,0, -2.981175,1.667844,0.081,
+ -2.958713,1.672406,0.144, -2.9688,1.8,0.144, -2.9916,1.8,0.081,
+ -2.9916,1.8,0.081, -2.981175,1.667844,0.081, -2.958713,1.672406,0.144,
+ -2.925611,1.679131,0.189, -2.9352,1.8,0.189, -2.9688,1.8,0.144,
+ -2.9688,1.8,0.144, -2.958713,1.672406,0.144, -2.925611,1.679131,0.189,
+ -2.885416,1.687296,0.216, -2.8944,1.8,0.216, -2.9352,1.8,0.189,
+ -2.9352,1.8,0.189, -2.925611,1.679131,0.189, -2.885416,1.687296,0.216,
+ -2.841675,1.696181,0.225, -2.85,1.8,0.225, -2.8944,1.8,0.216,
+ -2.8944,1.8,0.216, -2.885416,1.687296,0.216, -2.841675,1.696181,0.225,
+ -2.797934,1.705067,0.216, -2.8056,1.8,0.216, -2.85,1.8,0.225,
+ -2.85,1.8,0.225, -2.841675,1.696181,0.225, -2.797934,1.705067,0.216,
+ -2.757739,1.713232,0.189, -2.7648,1.8,0.189, -2.8056,1.8,0.216,
+ -2.8056,1.8,0.216, -2.797934,1.705067,0.216, -2.757739,1.713232,0.189,
+ -2.724637,1.719956,0.144, -2.7312,1.8,0.144, -2.7648,1.8,0.189,
+ -2.7648,1.8,0.189, -2.757739,1.713232,0.189, -2.724637,1.719956,0.144,
+ -2.702175,1.724519,0.081, -2.7084,1.8,0.081, -2.7312,1.8,0.144,
+ -2.7312,1.8,0.144, -2.724637,1.719956,0.144, -2.702175,1.724519,0.081,
+ -2.6939,1.7262,0, -2.7,1.8,0, -2.7084,1.8,0.081,
+ -2.7084,1.8,0.081, -2.702175,1.724519,0.081, -2.6939,1.7262,0,
+ -2.949693,1.53779,0.081, -2.981175,1.667844,0.081, -2.98945,1.666162,0,
+ -2.98945,1.666162,0, -2.9576,1.5348,0, -2.949693,1.53779,0.081,
+ -2.92823,1.545907,0.144, -2.958713,1.672406,0.144, -2.981175,1.667844,0.081,
+ -2.981175,1.667844,0.081, -2.949693,1.53779,0.081, -2.92823,1.545907,0.144,
+ -2.896602,1.557869,0.189, -2.925611,1.679131,0.189, -2.958713,1.672406,0.144,
+ -2.958713,1.672406,0.144, -2.92823,1.545907,0.144, -2.896602,1.557869,0.189,
+ -2.858195,1.572394,0.216, -2.885416,1.687296,0.216, -2.925611,1.679131,0.189,
+ -2.925611,1.679131,0.189, -2.896602,1.557869,0.189, -2.858195,1.572394,0.216,
+ -2.8164,1.5882,0.225, -2.841675,1.696181,0.225, -2.885416,1.687296,0.216,
+ -2.885416,1.687296,0.216, -2.858195,1.572394,0.216, -2.8164,1.5882,0.225,
+ -2.774605,1.604006,0.216, -2.797934,1.705067,0.216, -2.841675,1.696181,0.225,
+ -2.841675,1.696181,0.225, -2.8164,1.5882,0.225, -2.774605,1.604006,0.216,
+ -2.736198,1.618531,0.189, -2.757739,1.713232,0.189, -2.797934,1.705067,0.216,
+ -2.797934,1.705067,0.216, -2.774605,1.604006,0.216, -2.736198,1.618531,0.189,
+ -2.70457,1.630493,0.144, -2.724637,1.719956,0.144, -2.757739,1.713232,0.189,
+ -2.757739,1.713232,0.189, -2.736198,1.618531,0.189, -2.70457,1.630493,0.144,
+ -2.683107,1.63861,0.081, -2.702175,1.724519,0.081, -2.724637,1.719956,0.144,
+ -2.724637,1.719956,0.144, -2.70457,1.630493,0.144, -2.683107,1.63861,0.081,
+ -2.6752,1.6416,0, -2.6939,1.7262,0, -2.702175,1.724519,0.081,
+ -2.702175,1.724519,0.081, -2.683107,1.63861,0.081, -2.6752,1.6416,0,
+ -2.896846,1.410135,0.081, -2.949693,1.53779,0.081, -2.9576,1.5348,0,
+ -2.9576,1.5348,0, -2.90415,1.406137,0, -2.896846,1.410135,0.081,
+ -2.877022,1.420985,0.144, -2.92823,1.545907,0.144, -2.949693,1.53779,0.081,
+ -2.949693,1.53779,0.081, -2.896846,1.410135,0.081, -2.877022,1.420985,0.144,
+ -2.847806,1.436974,0.189, -2.896602,1.557869,0.189, -2.92823,1.545907,0.144,
+ -2.92823,1.545907,0.144, -2.877022,1.420985,0.144, -2.847806,1.436974,0.189,
+ -2.812331,1.45639,0.216, -2.858195,1.572394,0.216, -2.896602,1.557869,0.189,
+ -2.896602,1.557869,0.189, -2.847806,1.436974,0.189, -2.812331,1.45639,0.216,
+ -2.773725,1.477519,0.225, -2.8164,1.5882,0.225, -2.858195,1.572394,0.216,
+ -2.858195,1.572394,0.216, -2.812331,1.45639,0.216, -2.773725,1.477519,0.225,
+ -2.735119,1.498648,0.216, -2.774605,1.604006,0.216, -2.8164,1.5882,0.225,
+ -2.8164,1.5882,0.225, -2.773725,1.477519,0.225, -2.735119,1.498648,0.216,
+ -2.699644,1.518063,0.189, -2.736198,1.618531,0.189, -2.774605,1.604006,0.216,
+ -2.774605,1.604006,0.216, -2.735119,1.498648,0.216, -2.699644,1.518063,0.189,
+ -2.670428,1.534053,0.144, -2.70457,1.630493,0.144, -2.736198,1.618531,0.189,
+ -2.736198,1.618531,0.189, -2.699644,1.518063,0.189, -2.670428,1.534053,0.144,
+ -2.650604,1.544903,0.081, -2.683107,1.63861,0.081, -2.70457,1.630493,0.144,
+ -2.70457,1.630493,0.144, -2.670428,1.534053,0.144, -2.650604,1.544903,0.081,
+ -2.6433,1.5489,0, -2.6752,1.6416,0, -2.683107,1.63861,0.081,
+ -2.683107,1.63861,0.081, -2.650604,1.544903,0.081, -2.6433,1.5489,0,
+ -2.822326,1.285171,0.081, -2.896846,1.410135,0.081, -2.90415,1.406137,0,
+ -2.90415,1.406137,0, -2.8288,1.2804,0, -2.822326,1.285171,0.081,
+ -2.804755,1.298122,0.144, -2.877022,1.420985,0.144, -2.896846,1.410135,0.081,
+ -2.896846,1.410135,0.081, -2.822326,1.285171,0.081, -2.804755,1.298122,0.144,
+ -2.778861,1.317206,0.189, -2.847806,1.436974,0.189, -2.877022,1.420985,0.144,
+ -2.877022,1.420985,0.144, -2.804755,1.298122,0.144, -2.778861,1.317206,0.189,
+ -2.747418,1.340381,0.216, -2.812331,1.45639,0.216, -2.847806,1.436974,0.189,
+ -2.847806,1.436974,0.189, -2.778861,1.317206,0.189, -2.747418,1.340381,0.216,
+ -2.7132,1.3656,0.225, -2.773725,1.477519,0.225, -2.812331,1.45639,0.216,
+ -2.812331,1.45639,0.216, -2.747418,1.340381,0.216, -2.7132,1.3656,0.225,
+ -2.678982,1.390819,0.216, -2.735119,1.498648,0.216, -2.773725,1.477519,0.225,
+ -2.773725,1.477519,0.225, -2.7132,1.3656,0.225, -2.678982,1.390819,0.216,
+ -2.647539,1.413994,0.189, -2.699644,1.518063,0.189, -2.735119,1.498648,0.216,
+ -2.735119,1.498648,0.216, -2.678982,1.390819,0.216, -2.647539,1.413994,0.189,
+ -2.621645,1.433078,0.144, -2.670428,1.534053,0.144, -2.699644,1.518063,0.189,
+ -2.699644,1.518063,0.189, -2.647539,1.413994,0.189, -2.621645,1.433078,0.144,
+ -2.604074,1.446029,0.081, -2.650604,1.544903,0.081, -2.670428,1.534053,0.144,
+ -2.670428,1.534053,0.144, -2.621645,1.433078,0.144, -2.604074,1.446029,0.081,
+ -2.5976,1.4508,0, -2.6433,1.5489,0, -2.650604,1.544903,0.081,
+ -2.650604,1.544903,0.081, -2.604074,1.446029,0.081, -2.5976,1.4508,0,
+ -2.725825,1.163194,0.081, -2.822326,1.285171,0.081, -2.8288,1.2804,0,
+ -2.8288,1.2804,0, -2.73125,1.157813,0, -2.725825,1.163194,0.081,
+ -2.7111,1.1778,0.144, -2.804755,1.298122,0.144, -2.822326,1.285171,0.081,
+ -2.822326,1.285171,0.081, -2.725825,1.163194,0.081, -2.7111,1.1778,0.144,
+ -2.6894,1.199325,0.189, -2.778861,1.317206,0.189, -2.804755,1.298122,0.144,
+ -2.804755,1.298122,0.144, -2.7111,1.1778,0.144, -2.6894,1.199325,0.189,
+ -2.66305,1.225463,0.216, -2.747418,1.340381,0.216, -2.778861,1.317206,0.189,
+ -2.778861,1.317206,0.189, -2.6894,1.199325,0.189, -2.66305,1.225463,0.216,
+ -2.634375,1.253906,0.225, -2.7132,1.3656,0.225, -2.747418,1.340381,0.216,
+ -2.747418,1.340381,0.216, -2.66305,1.225463,0.216, -2.634375,1.253906,0.225,
+ -2.6057,1.28235,0.216, -2.678982,1.390819,0.216, -2.7132,1.3656,0.225,
+ -2.7132,1.3656,0.225, -2.634375,1.253906,0.225, -2.6057,1.28235,0.216,
+ -2.57935,1.308488,0.189, -2.647539,1.413994,0.189, -2.678982,1.390819,0.216,
+ -2.678982,1.390819,0.216, -2.6057,1.28235,0.216, -2.57935,1.308488,0.189,
+ -2.55765,1.330013,0.144, -2.621645,1.433078,0.144, -2.647539,1.413994,0.189,
+ -2.647539,1.413994,0.189, -2.57935,1.308488,0.189, -2.55765,1.330013,0.144,
+ -2.542925,1.344619,0.081, -2.604074,1.446029,0.081, -2.621645,1.433078,0.144,
+ -2.621645,1.433078,0.144, -2.55765,1.330013,0.144, -2.542925,1.344619,0.081,
+ -2.5375,1.35,0, -2.5976,1.4508,0, -2.604074,1.446029,0.081,
+ -2.604074,1.446029,0.081, -2.542925,1.344619,0.081, -2.5375,1.35,0,
+ -2.607034,1.044497,0.081, -2.725825,1.163194,0.081, -2.73125,1.157813,0,
+ -2.73125,1.157813,0, -2.6112,1.0386,0, -2.607034,1.044497,0.081,
+ -2.595725,1.060502,0.144, -2.7111,1.1778,0.144, -2.725825,1.163194,0.081,
+ -2.725825,1.163194,0.081, -2.607034,1.044497,0.081, -2.595725,1.060502,0.144,
+ -2.579059,1.08409,0.189, -2.6894,1.199325,0.189, -2.7111,1.1778,0.144,
+ -2.7111,1.1778,0.144, -2.595725,1.060502,0.144, -2.579059,1.08409,0.189,
+ -2.558822,1.112731,0.216, -2.66305,1.225463,0.216, -2.6894,1.199325,0.189,
+ -2.6894,1.199325,0.189, -2.579059,1.08409,0.189, -2.558822,1.112731,0.216,
+ -2.5368,1.1439,0.225, -2.634375,1.253906,0.225, -2.66305,1.225463,0.216,
+ -2.66305,1.225463,0.216, -2.558822,1.112731,0.216, -2.5368,1.1439,0.225,
+ -2.514778,1.175069,0.216, -2.6057,1.28235,0.216, -2.634375,1.253906,0.225,
+ -2.634375,1.253906,0.225, -2.5368,1.1439,0.225, -2.514778,1.175069,0.216,
+ -2.494541,1.20371,0.189, -2.57935,1.308488,0.189, -2.6057,1.28235,0.216,
+ -2.6057,1.28235,0.216, -2.514778,1.175069,0.216, -2.494541,1.20371,0.189,
+ -2.477875,1.227298,0.144, -2.55765,1.330013,0.144, -2.57935,1.308488,0.189,
+ -2.57935,1.308488,0.189, -2.494541,1.20371,0.189, -2.477875,1.227298,0.144,
+ -2.466566,1.243303,0.081, -2.542925,1.344619,0.081, -2.55765,1.330013,0.144,
+ -2.55765,1.330013,0.144, -2.477875,1.227298,0.144, -2.466566,1.243303,0.081,
+ -2.4624,1.2492,0, -2.5375,1.35,0, -2.542925,1.344619,0.081,
+ -2.542925,1.344619,0.081, -2.466566,1.243303,0.081, -2.4624,1.2492,0,
+ -2.465644,0.929375,0.081, -2.607034,1.044497,0.081, -2.6112,1.0386,0,
+ -2.6112,1.0386,0, -2.46835,0.922987,0, -2.465644,0.929375,0.081,
+ -2.458298,0.946711,0.144, -2.595725,1.060502,0.144, -2.607034,1.044497,0.081,
+ -2.607034,1.044497,0.081, -2.465644,0.929375,0.081, -2.458298,0.946711,0.144,
+ -2.447474,0.97226,0.189, -2.579059,1.08409,0.189, -2.595725,1.060502,0.144,
+ -2.595725,1.060502,0.144, -2.458298,0.946711,0.144, -2.447474,0.97226,0.189,
+ -2.434329,1.003283,0.216, -2.558822,1.112731,0.216, -2.579059,1.08409,0.189,
+ -2.579059,1.08409,0.189, -2.447474,0.97226,0.189, -2.434329,1.003283,0.216,
+ -2.420025,1.037044,0.225, -2.5368,1.1439,0.225, -2.558822,1.112731,0.216,
+ -2.558822,1.112731,0.216, -2.434329,1.003283,0.216, -2.420025,1.037044,0.225,
+ -2.405721,1.070804,0.216, -2.514778,1.175069,0.216, -2.5368,1.1439,0.225,
+ -2.5368,1.1439,0.225, -2.420025,1.037044,0.225, -2.405721,1.070804,0.216,
+ -2.392576,1.101828,0.189, -2.494541,1.20371,0.189, -2.514778,1.175069,0.216,
+ -2.514778,1.175069,0.216, -2.405721,1.070804,0.216, -2.392576,1.101828,0.189,
+ -2.381752,1.127376,0.144, -2.477875,1.227298,0.144, -2.494541,1.20371,0.189,
+ -2.494541,1.20371,0.189, -2.392576,1.101828,0.189, -2.381752,1.127376,0.144,
+ -2.374406,1.144713,0.081, -2.466566,1.243303,0.081, -2.477875,1.227298,0.144,
+ -2.477875,1.227298,0.144, -2.381752,1.127376,0.144, -2.374406,1.144713,0.081,
+ -2.3717,1.1511,0, -2.4624,1.2492,0, -2.466566,1.243303,0.081,
+ -2.466566,1.243303,0.081, -2.374406,1.144713,0.081, -2.3717,1.1511,0,
+ -2.301347,0.818122,0.081, -2.465644,0.929375,0.081, -2.46835,0.922987,0,
+ -2.46835,0.922987,0, -2.3024,0.8112,0, -2.301347,0.818122,0.081,
+ -2.29849,0.836909,0.144, -2.458298,0.946711,0.144, -2.465644,0.929375,0.081,
+ -2.465644,0.929375,0.081, -2.301347,0.818122,0.081, -2.29849,0.836909,0.144,
+ -2.294278,0.864595,0.189, -2.447474,0.97226,0.189, -2.458298,0.946711,0.144,
+ -2.458298,0.946711,0.144, -2.29849,0.836909,0.144, -2.294278,0.864595,0.189,
+ -2.289165,0.898214,0.216, -2.434329,1.003283,0.216, -2.447474,0.97226,0.189,
+ -2.447474,0.97226,0.189, -2.294278,0.864595,0.189, -2.289165,0.898214,0.216,
+ -2.2836,0.9348,0.225, -2.420025,1.037044,0.225, -2.434329,1.003283,0.216,
+ -2.434329,1.003283,0.216, -2.289165,0.898214,0.216, -2.2836,0.9348,0.225,
+ -2.278035,0.971386,0.216, -2.405721,1.070804,0.216, -2.420025,1.037044,0.225,
+ -2.420025,1.037044,0.225, -2.2836,0.9348,0.225, -2.278035,0.971386,0.216,
+ -2.272922,1.005005,0.189, -2.392576,1.101828,0.189, -2.405721,1.070804,0.216,
+ -2.405721,1.070804,0.216, -2.278035,0.971386,0.216, -2.272922,1.005005,0.189,
+ -2.26871,1.032691,0.144, -2.381752,1.127376,0.144, -2.392576,1.101828,0.189,
+ -2.392576,1.101828,0.189, -2.272922,1.005005,0.189, -2.26871,1.032691,0.144,
+ -2.265853,1.051478,0.081, -2.374406,1.144713,0.081, -2.381752,1.127376,0.144,
+ -2.381752,1.127376,0.144, -2.26871,1.032691,0.144, -2.265853,1.051478,0.081,
+ -2.2648,1.0584,0, -2.3717,1.1511,0, -2.374406,1.144713,0.081,
+ -2.374406,1.144713,0.081, -2.265853,1.051478,0.081, -2.2648,1.0584,0,
+ -2.113835,0.711032,0.081, -2.301347,0.818122,0.081, -2.3024,0.8112,0,
+ -2.3024,0.8112,0, -2.11305,0.703463,0, -2.113835,0.711032,0.081,
+ -2.115967,0.731578,0.144, -2.29849,0.836909,0.144, -2.301347,0.818122,0.081,
+ -2.301347,0.818122,0.081, -2.113835,0.711032,0.081, -2.115967,0.731578,0.144,
+ -2.119109,0.761855,0.189, -2.294278,0.864595,0.189, -2.29849,0.836909,0.144,
+ -2.29849,0.836909,0.144, -2.115967,0.731578,0.144, -2.119109,0.761855,0.189,
+ -2.122924,0.798621,0.216, -2.289165,0.898214,0.216, -2.294278,0.864595,0.189,
+ -2.294278,0.864595,0.189, -2.119109,0.761855,0.189, -2.122924,0.798621,0.216,
+ -2.127075,0.838631,0.225, -2.2836,0.9348,0.225, -2.289165,0.898214,0.216,
+ -2.289165,0.898214,0.216, -2.122924,0.798621,0.216, -2.127075,0.838631,0.225,
+ -2.131226,0.878641,0.216, -2.278035,0.971386,0.216, -2.2836,0.9348,0.225,
+ -2.2836,0.9348,0.225, -2.127075,0.838631,0.225, -2.131226,0.878641,0.216,
+ -2.135041,0.915407,0.189, -2.272922,1.005005,0.189, -2.278035,0.971386,0.216,
+ -2.278035,0.971386,0.216, -2.131226,0.878641,0.216, -2.135041,0.915407,0.189,
+ -2.138183,0.945685,0.144, -2.26871,1.032691,0.144, -2.272922,1.005005,0.189,
+ -2.272922,1.005005,0.189, -2.135041,0.915407,0.189, -2.138183,0.945685,0.144,
+ -2.140315,0.966231,0.081, -2.265853,1.051478,0.081, -2.26871,1.032691,0.144,
+ -2.26871,1.032691,0.144, -2.138183,0.945685,0.144, -2.140315,0.966231,0.081,
+ -2.1411,0.9738,0, -2.2648,1.0584,0, -2.265853,1.051478,0.081,
+ -2.265853,1.051478,0.081, -2.140315,0.966231,0.081, -2.1411,0.9738,0,
+ -1.9028,0.6084,0.081, -2.113835,0.711032,0.081, -2.11305,0.703463,0,
+ -2.11305,0.703463,0, -1.9,0.6,0, -1.9028,0.6084,0.081,
+ -1.9104,0.6312,0.144, -2.115967,0.731578,0.144, -2.113835,0.711032,0.081,
+ -2.113835,0.711032,0.081, -1.9028,0.6084,0.081, -1.9104,0.6312,0.144,
+ -1.9216,0.6648,0.189, -2.119109,0.761855,0.189, -2.115967,0.731578,0.144,
+ -2.115967,0.731578,0.144, -1.9104,0.6312,0.144, -1.9216,0.6648,0.189,
+ -1.9352,0.7056,0.216, -2.122924,0.798621,0.216, -2.119109,0.761855,0.189,
+ -2.119109,0.761855,0.189, -1.9216,0.6648,0.189, -1.9352,0.7056,0.216,
+ -1.95,0.75,0.225, -2.127075,0.838631,0.225, -2.122924,0.798621,0.216,
+ -2.122924,0.798621,0.216, -1.9352,0.7056,0.216, -1.95,0.75,0.225,
+ -1.9648,0.7944,0.216, -2.131226,0.878641,0.216, -2.127075,0.838631,0.225,
+ -2.127075,0.838631,0.225, -1.95,0.75,0.225, -1.9648,0.7944,0.216,
+ -1.9784,0.8352,0.189, -2.135041,0.915407,0.189, -2.131226,0.878641,0.216,
+ -2.131226,0.878641,0.216, -1.9648,0.7944,0.216, -1.9784,0.8352,0.189,
+ -1.9896,0.8688,0.144, -2.138183,0.945685,0.144, -2.135041,0.915407,0.189,
+ -2.135041,0.915407,0.189, -1.9784,0.8352,0.189, -1.9896,0.8688,0.144,
+ -1.9972,0.8916,0.081, -2.140315,0.966231,0.081, -2.138183,0.945685,0.144,
+ -2.138183,0.945685,0.144, -1.9896,0.8688,0.144, -1.9972,0.8916,0.081,
+ -2,0.9,0, -2.1411,0.9738,0, -2.140315,0.966231,0.081,
+ -2.140315,0.966231,0.081, -1.9972,0.8916,0.081, -2,0.9,0,
+ 1.939394,1.423221,-0.1751, 1.7,1.4019,-0.1782, 1.7,1.425,0,
+ 1.7,1.425,0, 1.9359,1.4442,0, 1.939394,1.423221,-0.1751,
+ 1.948879,1.366278,-0.31129, 1.7,1.3392,-0.3168, 1.7,1.4019,-0.1782,
+ 1.7,1.4019,-0.1782, 1.939394,1.423221,-0.1751, 1.948879,1.366278,-0.31129,
+ 1.962857,1.282362,-0.408568, 1.7,1.2468,-0.4158, 1.7,1.3392,-0.3168,
+ 1.7,1.3392,-0.3168, 1.948879,1.366278,-0.31129, 1.962857,1.282362,-0.408568,
+ 1.97983,1.180464,-0.466934, 1.7,1.1346,-0.4752, 1.7,1.2468,-0.4158,
+ 1.7,1.2468,-0.4158, 1.962857,1.282362,-0.408568, 1.97983,1.180464,-0.466934,
+ 1.9983,1.069575,-0.48639, 1.7,1.0125,-0.495, 1.7,1.1346,-0.4752,
+ 1.7,1.1346,-0.4752, 1.97983,1.180464,-0.466934, 1.9983,1.069575,-0.48639,
+ 2.01677,0.958686,-0.466934, 1.7,0.8904,-0.4752, 1.7,1.0125,-0.495,
+ 1.7,1.0125,-0.495, 1.9983,1.069575,-0.48639, 2.01677,0.958686,-0.466934,
+ 2.033743,0.856788,-0.408568, 1.7,0.7782,-0.4158, 1.7,0.8904,-0.4752,
+ 1.7,0.8904,-0.4752, 2.01677,0.958686,-0.466934, 2.033743,0.856788,-0.408568,
+ 2.047721,0.772872,-0.31129, 1.7,0.6858,-0.3168, 1.7,0.7782,-0.4158,
+ 1.7,0.7782,-0.4158, 2.033743,0.856788,-0.408568, 2.047721,0.772872,-0.31129,
+ 2.057206,0.715929,-0.1751, 1.7,0.6231,-0.1782, 1.7,0.6858,-0.3168,
+ 1.7,0.6858,-0.3168, 2.047721,0.772872,-0.31129, 2.057206,0.715929,-0.1751,
+ 2.0607,0.69495,0, 1.7,0.6,0, 1.7,0.6231,-0.1782,
+ 1.7,0.6231,-0.1782, 2.057206,0.715929,-0.1751, 2.0607,0.69495,0,
+ 2.116979,1.47912,-0.166687, 1.939394,1.423221,-0.1751, 1.9359,1.4442,0,
+ 1.9359,1.4442,0, 2.1112,1.4976,0, 2.116979,1.47912,-0.166687,
+ 2.132666,1.42896,-0.296333, 1.948879,1.366278,-0.31129, 1.939394,1.423221,-0.1751,
+ 1.939394,1.423221,-0.1751, 2.116979,1.47912,-0.166687, 2.132666,1.42896,-0.296333,
+ 2.155782,1.35504,-0.388937, 1.962857,1.282362,-0.408568, 1.948879,1.366278,-0.31129,
+ 1.948879,1.366278,-0.31129, 2.132666,1.42896,-0.296333, 2.155782,1.35504,-0.388937,
+ 2.183853,1.26528,-0.444499, 1.97983,1.180464,-0.466934, 1.962857,1.282362,-0.408568,
+ 1.962857,1.282362,-0.408568, 2.155782,1.35504,-0.388937, 2.183853,1.26528,-0.444499,
+ 2.2144,1.1676,-0.46302, 1.9983,1.069575,-0.48639, 1.97983,1.180464,-0.466934,
+ 1.97983,1.180464,-0.466934, 2.183853,1.26528,-0.444499, 2.2144,1.1676,-0.46302,
+ 2.244947,1.06992,-0.444499, 2.01677,0.958686,-0.466934, 1.9983,1.069575,-0.48639,
+ 1.9983,1.069575,-0.48639, 2.2144,1.1676,-0.46302, 2.244947,1.06992,-0.444499,
+ 2.273018,0.98016,-0.388937, 2.033743,0.856788,-0.408568, 2.01677,0.958686,-0.466934,
+ 2.01677,0.958686,-0.466934, 2.244947,1.06992,-0.444499, 2.273018,0.98016,-0.388937,
+ 2.296134,0.90624,-0.296333, 2.047721,0.772872,-0.31129, 2.033743,0.856788,-0.408568,
+ 2.033743,0.856788,-0.408568, 2.273018,0.98016,-0.388937, 2.296134,0.90624,-0.296333,
+ 2.311821,0.85608,-0.166687, 2.057206,0.715929,-0.1751, 2.047721,0.772872,-0.31129,
+ 2.047721,0.772872,-0.31129, 2.296134,0.90624,-0.296333, 2.311821,0.85608,-0.166687,
+ 2.3176,0.8376,0, 2.0607,0.69495,0, 2.057206,0.715929,-0.1751,
+ 2.057206,0.715929,-0.1751, 2.311821,0.85608,-0.166687, 2.3176,0.8376,0,
+ 2.244457,1.563171,-0.154289, 2.116979,1.47912,-0.166687, 2.1112,1.4976,0,
+ 2.1112,1.4976,0, 2.2373,1.5789,0, 2.244457,1.563171,-0.154289,
+ 2.263882,1.520478,-0.274291, 2.132666,1.42896,-0.296333, 2.116979,1.47912,-0.166687,
+ 2.116979,1.47912,-0.166687, 2.244457,1.563171,-0.154289, 2.263882,1.520478,-0.274291,
+ 2.29251,1.457562,-0.360007, 2.155782,1.35504,-0.388937, 2.132666,1.42896,-0.296333,
+ 2.132666,1.42896,-0.296333, 2.263882,1.520478,-0.274291, 2.29251,1.457562,-0.360007,
+ 2.327271,1.381164,-0.411437, 2.183853,1.26528,-0.444499, 2.155782,1.35504,-0.388937,
+ 2.155782,1.35504,-0.388937, 2.29251,1.457562,-0.360007, 2.327271,1.381164,-0.411437,
+ 2.3651,1.298025,-0.42858, 2.2144,1.1676,-0.46302, 2.183853,1.26528,-0.444499,
+ 2.183853,1.26528,-0.444499, 2.327271,1.381164,-0.411437, 2.3651,1.298025,-0.42858,
+ 2.402929,1.214886,-0.411437, 2.244947,1.06992,-0.444499, 2.2144,1.1676,-0.46302,
+ 2.2144,1.1676,-0.46302, 2.3651,1.298025,-0.42858, 2.402929,1.214886,-0.411437,
+ 2.43769,1.138488,-0.360007, 2.273018,0.98016,-0.388937, 2.244947,1.06992,-0.444499,
+ 2.244947,1.06992,-0.444499, 2.402929,1.214886,-0.411437, 2.43769,1.138488,-0.360007,
+ 2.466318,1.075572,-0.274291, 2.296134,0.90624,-0.296333, 2.273018,0.98016,-0.388937,
+ 2.273018,0.98016,-0.388937, 2.43769,1.138488,-0.360007, 2.466318,1.075572,-0.274291,
+ 2.485743,1.032879,-0.154289, 2.311821,0.85608,-0.166687, 2.296134,0.90624,-0.296333,
+ 2.296134,0.90624,-0.296333, 2.466318,1.075572,-0.274291, 2.485743,1.032879,-0.154289,
+ 2.4929,1.01715,0, 2.3176,0.8376,0, 2.311821,0.85608,-0.166687,
+ 2.311821,0.85608,-0.166687, 2.485743,1.032879,-0.154289, 2.4929,1.01715,0,
+ 2.33353,1.668948,-0.139234, 2.244457,1.563171,-0.154289, 2.2373,1.5789,0,
+ 2.2373,1.5789,0, 2.3256,1.6818,0, 2.33353,1.668948,-0.139234,
+ 2.355053,1.634064,-0.247526, 2.263882,1.520478,-0.274291, 2.244457,1.563171,-0.154289,
+ 2.244457,1.563171,-0.154289, 2.33353,1.668948,-0.139234, 2.355053,1.634064,-0.247526,
+ 2.386771,1.582656,-0.324878, 2.29251,1.457562,-0.360007, 2.263882,1.520478,-0.274291,
+ 2.263882,1.520478,-0.274291, 2.355053,1.634064,-0.247526, 2.386771,1.582656,-0.324878,
+ 2.425286,1.520232,-0.37129, 2.327271,1.381164,-0.411437, 2.29251,1.457562,-0.360007,
+ 2.29251,1.457562,-0.360007, 2.386771,1.582656,-0.324878, 2.425286,1.520232,-0.37129,
+ 2.4672,1.4523,-0.38676, 2.3651,1.298025,-0.42858, 2.327271,1.381164,-0.411437,
+ 2.327271,1.381164,-0.411437, 2.425286,1.520232,-0.37129, 2.4672,1.4523,-0.38676,
+ 2.509114,1.384368,-0.37129, 2.402929,1.214886,-0.411437, 2.3651,1.298025,-0.42858,
+ 2.3651,1.298025,-0.42858, 2.4672,1.4523,-0.38676, 2.509114,1.384368,-0.37129,
+ 2.547629,1.321944,-0.324878, 2.43769,1.138488,-0.360007, 2.402929,1.214886,-0.411437,
+ 2.402929,1.214886,-0.411437, 2.509114,1.384368,-0.37129, 2.547629,1.321944,-0.324878,
+ 2.579347,1.270536,-0.247526, 2.466318,1.075572,-0.274291, 2.43769,1.138488,-0.360007,
+ 2.43769,1.138488,-0.360007, 2.547629,1.321944,-0.324878, 2.579347,1.270536,-0.247526,
+ 2.60087,1.235652,-0.139234, 2.485743,1.032879,-0.154289, 2.466318,1.075572,-0.274291,
+ 2.466318,1.075572,-0.274291, 2.579347,1.270536,-0.247526, 2.60087,1.235652,-0.139234,
+ 2.6088,1.2228,0, 2.4929,1.01715,0, 2.485743,1.032879,-0.154289,
+ 2.485743,1.032879,-0.154289, 2.60087,1.235652,-0.139234, 2.6088,1.2228,0,
+ 2.3959,1.790025,-0.12285, 2.33353,1.668948,-0.139234, 2.3256,1.6818,0,
+ 2.3256,1.6818,0, 2.3875,1.8,0, 2.3959,1.790025,-0.12285,
+ 2.4187,1.76295,-0.2184, 2.355053,1.634064,-0.247526, 2.33353,1.668948,-0.139234,
+ 2.33353,1.668948,-0.139234, 2.3959,1.790025,-0.12285, 2.4187,1.76295,-0.2184,
+ 2.4523,1.72305,-0.28665, 2.386771,1.582656,-0.324878, 2.355053,1.634064,-0.247526,
+ 2.355053,1.634064,-0.247526, 2.4187,1.76295,-0.2184, 2.4523,1.72305,-0.28665,
+ 2.4931,1.6746,-0.3276, 2.425286,1.520232,-0.37129, 2.386771,1.582656,-0.324878,
+ 2.386771,1.582656,-0.324878, 2.4523,1.72305,-0.28665, 2.4931,1.6746,-0.3276,
+ 2.5375,1.621875,-0.34125, 2.4672,1.4523,-0.38676, 2.425286,1.520232,-0.37129,
+ 2.425286,1.520232,-0.37129, 2.4931,1.6746,-0.3276, 2.5375,1.621875,-0.34125,
+ 2.5819,1.56915,-0.3276, 2.509114,1.384368,-0.37129, 2.4672,1.4523,-0.38676,
+ 2.4672,1.4523,-0.38676, 2.5375,1.621875,-0.34125, 2.5819,1.56915,-0.3276,
+ 2.6227,1.5207,-0.28665, 2.547629,1.321944,-0.324878, 2.509114,1.384368,-0.37129,
+ 2.509114,1.384368,-0.37129, 2.5819,1.56915,-0.3276, 2.6227,1.5207,-0.28665,
+ 2.6563,1.4808,-0.2184, 2.579347,1.270536,-0.247526, 2.547629,1.321944,-0.324878,
+ 2.547629,1.321944,-0.324878, 2.6227,1.5207,-0.28665, 2.6563,1.4808,-0.2184,
+ 2.6791,1.453725,-0.12285, 2.60087,1.235652,-0.139234, 2.579347,1.270536,-0.247526,
+ 2.579347,1.270536,-0.247526, 2.6563,1.4808,-0.2184, 2.6791,1.453725,-0.12285,
+ 2.6875,1.44375,0, 2.6088,1.2228,0, 2.60087,1.235652,-0.139234,
+ 2.60087,1.235652,-0.139234, 2.6791,1.453725,-0.12285, 2.6875,1.44375,0,
+ 2.44327,1.919976,-0.106466, 2.3959,1.790025,-0.12285, 2.3875,1.8,0,
+ 2.3875,1.8,0, 2.4344,1.9272,0, 2.44327,1.919976,-0.106466,
+ 2.467347,1.900368,-0.189274, 2.4187,1.76295,-0.2184, 2.3959,1.790025,-0.12285,
+ 2.3959,1.790025,-0.12285, 2.44327,1.919976,-0.106466, 2.467347,1.900368,-0.189274,
+ 2.502829,1.871472,-0.248422, 2.4523,1.72305,-0.28665, 2.4187,1.76295,-0.2184,
+ 2.4187,1.76295,-0.2184, 2.467347,1.900368,-0.189274, 2.502829,1.871472,-0.248422,
+ 2.545914,1.836384,-0.28391, 2.4931,1.6746,-0.3276, 2.4523,1.72305,-0.28665,
+ 2.4523,1.72305,-0.28665, 2.502829,1.871472,-0.248422, 2.545914,1.836384,-0.28391,
+ 2.5928,1.7982,-0.29574, 2.5375,1.621875,-0.34125, 2.4931,1.6746,-0.3276,
+ 2.4931,1.6746,-0.3276, 2.545914,1.836384,-0.28391, 2.5928,1.7982,-0.29574,
+ 2.639686,1.760016,-0.28391, 2.5819,1.56915,-0.3276, 2.5375,1.621875,-0.34125,
+ 2.5375,1.621875,-0.34125, 2.5928,1.7982,-0.29574, 2.639686,1.760016,-0.28391,
+ 2.682771,1.724928,-0.248422, 2.6227,1.5207,-0.28665, 2.5819,1.56915,-0.3276,
+ 2.5819,1.56915,-0.3276, 2.639686,1.760016,-0.28391, 2.682771,1.724928,-0.248422,
+ 2.718253,1.696032,-0.189274, 2.6563,1.4808,-0.2184, 2.6227,1.5207,-0.28665,
+ 2.6227,1.5207,-0.28665, 2.682771,1.724928,-0.248422, 2.718253,1.696032,-0.189274,
+ 2.74233,1.676424,-0.106466, 2.6791,1.453725,-0.12285, 2.6563,1.4808,-0.2184,
+ 2.6563,1.4808,-0.2184, 2.718253,1.696032,-0.189274, 2.74233,1.676424,-0.106466,
+ 2.7512,1.6692,0, 2.6875,1.44375,0, 2.6791,1.453725,-0.12285,
+ 2.6791,1.453725,-0.12285, 2.74233,1.676424,-0.106466, 2.7512,1.6692,0,
+ 2.487343,2.052375,-0.091411, 2.44327,1.919976,-0.106466, 2.4344,1.9272,0,
+ 2.4344,1.9272,0, 2.4777,2.0571,0, 2.487343,2.052375,-0.091411,
+ 2.513518,2.03955,-0.162509, 2.467347,1.900368,-0.189274, 2.44327,1.919976,-0.106466,
+ 2.44327,1.919976,-0.106466, 2.487343,2.052375,-0.091411, 2.513518,2.03955,-0.162509,
+ 2.55209,2.02065,-0.213293, 2.502829,1.871472,-0.248422, 2.467347,1.900368,-0.189274,
+ 2.467347,1.900368,-0.189274, 2.513518,2.03955,-0.162509, 2.55209,2.02065,-0.213293,
+ 2.598929,1.9977,-0.243763, 2.545914,1.836384,-0.28391, 2.502829,1.871472,-0.248422,
+ 2.502829,1.871472,-0.248422, 2.55209,2.02065,-0.213293, 2.598929,1.9977,-0.243763,
+ 2.6499,1.972725,-0.25392, 2.5928,1.7982,-0.29574, 2.545914,1.836384,-0.28391,
+ 2.545914,1.836384,-0.28391, 2.598929,1.9977,-0.243763, 2.6499,1.972725,-0.25392,
+ 2.700871,1.94775,-0.243763, 2.639686,1.760016,-0.28391, 2.5928,1.7982,-0.29574,
+ 2.5928,1.7982,-0.29574, 2.6499,1.972725,-0.25392, 2.700871,1.94775,-0.243763,
+ 2.74771,1.9248,-0.213293, 2.682771,1.724928,-0.248422, 2.639686,1.760016,-0.28391,
+ 2.639686,1.760016,-0.28391, 2.700871,1.94775,-0.243763, 2.74771,1.9248,-0.213293,
+ 2.786282,1.9059,-0.162509, 2.718253,1.696032,-0.189274, 2.682771,1.724928,-0.248422,
+ 2.682771,1.724928,-0.248422, 2.74771,1.9248,-0.213293, 2.786282,1.9059,-0.162509,
+ 2.812457,1.893075,-0.091411, 2.74233,1.676424,-0.106466, 2.718253,1.696032,-0.189274,
+ 2.718253,1.696032,-0.189274, 2.786282,1.9059,-0.162509, 2.812457,1.893075,-0.091411,
+ 2.8221,1.88835,0, 2.7512,1.6692,0, 2.74233,1.676424,-0.106466,
+ 2.74233,1.676424,-0.106466, 2.812457,1.893075,-0.091411, 2.8221,1.88835,0,
+ 2.539821,2.180796,-0.079013, 2.487343,2.052375,-0.091411, 2.4777,2.0571,0,
+ 2.4777,2.0571,0, 2.5288,2.1834,0, 2.539821,2.180796,-0.079013,
+ 2.569734,2.173728,-0.140467, 2.513518,2.03955,-0.162509, 2.487343,2.052375,-0.091411,
+ 2.487343,2.052375,-0.091411, 2.539821,2.180796,-0.079013, 2.569734,2.173728,-0.140467,
+ 2.613818,2.163312,-0.184363, 2.55209,2.02065,-0.213293, 2.513518,2.03955,-0.162509,
+ 2.513518,2.03955,-0.162509, 2.569734,2.173728,-0.140467, 2.613818,2.163312,-0.184363,
+ 2.667347,2.150664,-0.210701, 2.598929,1.9977,-0.243763, 2.55209,2.02065,-0.213293,
+ 2.55209,2.02065,-0.213293, 2.613818,2.163312,-0.184363, 2.667347,2.150664,-0.210701,
+ 2.7256,2.1369,-0.21948, 2.6499,1.972725,-0.25392, 2.598929,1.9977,-0.243763,
+ 2.598929,1.9977,-0.243763, 2.667347,2.150664,-0.210701, 2.7256,2.1369,-0.21948,
+ 2.783853,2.123136,-0.210701, 2.700871,1.94775,-0.243763, 2.6499,1.972725,-0.25392,
+ 2.6499,1.972725,-0.25392, 2.7256,2.1369,-0.21948, 2.783853,2.123136,-0.210701,
+ 2.837382,2.110488,-0.184363, 2.74771,1.9248,-0.213293, 2.700871,1.94775,-0.243763,
+ 2.700871,1.94775,-0.243763, 2.783853,2.123136,-0.210701, 2.837382,2.110488,-0.184363,
+ 2.881466,2.100072,-0.140467, 2.786282,1.9059,-0.162509, 2.74771,1.9248,-0.213293,
+ 2.74771,1.9248,-0.213293, 2.837382,2.110488,-0.184363, 2.881466,2.100072,-0.140467,
+ 2.911379,2.093004,-0.079013, 2.812457,1.893075,-0.091411, 2.786282,1.9059,-0.162509,
+ 2.786282,1.9059,-0.162509, 2.881466,2.100072,-0.140467, 2.911379,2.093004,-0.079013,
+ 2.9224,2.0904,0, 2.8221,1.88835,0, 2.812457,1.893075,-0.091411,
+ 2.812457,1.893075,-0.091411, 2.911379,2.093004,-0.079013, 2.9224,2.0904,0,
+ 2.612406,2.298813,-0.0706, 2.539821,2.180796,-0.079013, 2.5288,2.1834,0,
+ 2.5288,2.1834,0, 2.5991,2.2998,0, 2.612406,2.298813,-0.0706,
+ 2.648521,2.296134,-0.12551, 2.569734,2.173728,-0.140467, 2.539821,2.180796,-0.079013,
+ 2.539821,2.180796,-0.079013, 2.612406,2.298813,-0.0706, 2.648521,2.296134,-0.12551,
+ 2.701743,2.292186,-0.164732, 2.613818,2.163312,-0.184363, 2.569734,2.173728,-0.140467,
+ 2.569734,2.173728,-0.140467, 2.648521,2.296134,-0.12551, 2.701743,2.292186,-0.164732,
+ 2.76637,2.287392,-0.188266, 2.667347,2.150664,-0.210701, 2.613818,2.163312,-0.184363,
+ 2.613818,2.163312,-0.184363, 2.701743,2.292186,-0.164732, 2.76637,2.287392,-0.188266,
+ 2.8367,2.282175,-0.19611, 2.7256,2.1369,-0.21948, 2.667347,2.150664,-0.210701,
+ 2.667347,2.150664,-0.210701, 2.76637,2.287392,-0.188266, 2.8367,2.282175,-0.19611,
+ 2.90703,2.276958,-0.188266, 2.783853,2.123136,-0.210701, 2.7256,2.1369,-0.21948,
+ 2.7256,2.1369,-0.21948, 2.8367,2.282175,-0.19611, 2.90703,2.276958,-0.188266,
+ 2.971657,2.272164,-0.164732, 2.837382,2.110488,-0.184363, 2.783853,2.123136,-0.210701,
+ 2.783853,2.123136,-0.210701, 2.90703,2.276958,-0.188266, 2.971657,2.272164,-0.164732,
+ 3.024879,2.268216,-0.12551, 2.881466,2.100072,-0.140467, 2.837382,2.110488,-0.184363,
+ 2.837382,2.110488,-0.184363, 2.971657,2.272164,-0.164732, 3.024879,2.268216,-0.12551,
+ 3.060994,2.265537,-0.0706, 2.911379,2.093004,-0.079013, 2.881466,2.100072,-0.140467,
+ 2.881466,2.100072,-0.140467, 3.024879,2.268216,-0.12551, 3.060994,2.265537,-0.0706,
+ 3.0743,2.26455,0, 2.9224,2.0904,0, 2.911379,2.093004,-0.079013,
+ 2.911379,2.093004,-0.079013, 3.060994,2.265537,-0.0706, 3.0743,2.26455,0,
+ 2.7168,2.4,-0.0675, 2.612406,2.298813,-0.0706, 2.5991,2.2998,0,
+ 2.5991,2.2998,0, 2.7,2.4,0, 2.7168,2.4,-0.0675,
+ 2.7624,2.4,-0.12, 2.648521,2.296134,-0.12551, 2.612406,2.298813,-0.0706,
+ 2.612406,2.298813,-0.0706, 2.7168,2.4,-0.0675, 2.7624,2.4,-0.12,
+ 2.8296,2.4,-0.1575, 2.701743,2.292186,-0.164732, 2.648521,2.296134,-0.12551,
+ 2.648521,2.296134,-0.12551, 2.7624,2.4,-0.12, 2.8296,2.4,-0.1575,
+ 2.9112,2.4,-0.18, 2.76637,2.287392,-0.188266, 2.701743,2.292186,-0.164732,
+ 2.701743,2.292186,-0.164732, 2.8296,2.4,-0.1575, 2.9112,2.4,-0.18,
+ 3,2.4,-0.1875, 2.8367,2.282175,-0.19611, 2.76637,2.287392,-0.188266,
+ 2.76637,2.287392,-0.188266, 2.9112,2.4,-0.18, 3,2.4,-0.1875,
+ 3.0888,2.4,-0.18, 2.90703,2.276958,-0.188266, 2.8367,2.282175,-0.19611,
+ 2.8367,2.282175,-0.19611, 3,2.4,-0.1875, 3.0888,2.4,-0.18,
+ 3.1704,2.4,-0.1575, 2.971657,2.272164,-0.164732, 2.90703,2.276958,-0.188266,
+ 2.90703,2.276958,-0.188266, 3.0888,2.4,-0.18, 3.1704,2.4,-0.1575,
+ 3.2376,2.4,-0.12, 3.024879,2.268216,-0.12551, 2.971657,2.272164,-0.164732,
+ 2.971657,2.272164,-0.164732, 3.1704,2.4,-0.1575, 3.2376,2.4,-0.12,
+ 3.2832,2.4,-0.0675, 3.060994,2.265537,-0.0706, 3.024879,2.268216,-0.12551,
+ 3.024879,2.268216,-0.12551, 3.2376,2.4,-0.12, 3.2832,2.4,-0.0675,
+ 3.3,2.4,0, 3.0743,2.26455,0, 3.060994,2.265537,-0.0706,
+ 3.060994,2.265537,-0.0706, 3.2832,2.4,-0.0675, 3.3,2.4,0,
+ 2.057206,0.715929,0.1751, 1.7,0.6231,0.1782, 1.7,0.6,0,
+ 1.7,0.6,0, 2.0607,0.69495,0, 2.057206,0.715929,0.1751,
+ 2.047721,0.772872,0.31129, 1.7,0.6858,0.3168, 1.7,0.6231,0.1782,
+ 1.7,0.6231,0.1782, 2.057206,0.715929,0.1751, 2.047721,0.772872,0.31129,
+ 2.033743,0.856788,0.408568, 1.7,0.7782,0.4158, 1.7,0.6858,0.3168,
+ 1.7,0.6858,0.3168, 2.047721,0.772872,0.31129, 2.033743,0.856788,0.408568,
+ 2.01677,0.958686,0.466934, 1.7,0.8904,0.4752, 1.7,0.7782,0.4158,
+ 1.7,0.7782,0.4158, 2.033743,0.856788,0.408568, 2.01677,0.958686,0.466934,
+ 1.9983,1.069575,0.48639, 1.7,1.0125,0.495, 1.7,0.8904,0.4752,
+ 1.7,0.8904,0.4752, 2.01677,0.958686,0.466934, 1.9983,1.069575,0.48639,
+ 1.97983,1.180464,0.466934, 1.7,1.1346,0.4752, 1.7,1.0125,0.495,
+ 1.7,1.0125,0.495, 1.9983,1.069575,0.48639, 1.97983,1.180464,0.466934,
+ 1.962857,1.282362,0.408568, 1.7,1.2468,0.4158, 1.7,1.1346,0.4752,
+ 1.7,1.1346,0.4752, 1.97983,1.180464,0.466934, 1.962857,1.282362,0.408568,
+ 1.948879,1.366278,0.31129, 1.7,1.3392,0.3168, 1.7,1.2468,0.4158,
+ 1.7,1.2468,0.4158, 1.962857,1.282362,0.408568, 1.948879,1.366278,0.31129,
+ 1.939394,1.423221,0.1751, 1.7,1.4019,0.1782, 1.7,1.3392,0.3168,
+ 1.7,1.3392,0.3168, 1.948879,1.366278,0.31129, 1.939394,1.423221,0.1751,
+ 1.9359,1.4442,0, 1.7,1.425,0, 1.7,1.4019,0.1782,
+ 1.7,1.4019,0.1782, 1.939394,1.423221,0.1751, 1.9359,1.4442,0,
+ 2.311821,0.85608,0.166687, 2.057206,0.715929,0.1751, 2.0607,0.69495,0,
+ 2.0607,0.69495,0, 2.3176,0.8376,0, 2.311821,0.85608,0.166687,
+ 2.296134,0.90624,0.296333, 2.047721,0.772872,0.31129, 2.057206,0.715929,0.1751,
+ 2.057206,0.715929,0.1751, 2.311821,0.85608,0.166687, 2.296134,0.90624,0.296333,
+ 2.273018,0.98016,0.388937, 2.033743,0.856788,0.408568, 2.047721,0.772872,0.31129,
+ 2.047721,0.772872,0.31129, 2.296134,0.90624,0.296333, 2.273018,0.98016,0.388937,
+ 2.244947,1.06992,0.444499, 2.01677,0.958686,0.466934, 2.033743,0.856788,0.408568,
+ 2.033743,0.856788,0.408568, 2.273018,0.98016,0.388937, 2.244947,1.06992,0.444499,
+ 2.2144,1.1676,0.46302, 1.9983,1.069575,0.48639, 2.01677,0.958686,0.466934,
+ 2.01677,0.958686,0.466934, 2.244947,1.06992,0.444499, 2.2144,1.1676,0.46302,
+ 2.183853,1.26528,0.444499, 1.97983,1.180464,0.466934, 1.9983,1.069575,0.48639,
+ 1.9983,1.069575,0.48639, 2.2144,1.1676,0.46302, 2.183853,1.26528,0.444499,
+ 2.155782,1.35504,0.388937, 1.962857,1.282362,0.408568, 1.97983,1.180464,0.466934,
+ 1.97983,1.180464,0.466934, 2.183853,1.26528,0.444499, 2.155782,1.35504,0.388937,
+ 2.132666,1.42896,0.296333, 1.948879,1.366278,0.31129, 1.962857,1.282362,0.408568,
+ 1.962857,1.282362,0.408568, 2.155782,1.35504,0.388937, 2.132666,1.42896,0.296333,
+ 2.116979,1.47912,0.166687, 1.939394,1.423221,0.1751, 1.948879,1.366278,0.31129,
+ 1.948879,1.366278,0.31129, 2.132666,1.42896,0.296333, 2.116979,1.47912,0.166687,
+ 2.1112,1.4976,0, 1.9359,1.4442,0, 1.939394,1.423221,0.1751,
+ 1.939394,1.423221,0.1751, 2.116979,1.47912,0.166687, 2.1112,1.4976,0,
+ 2.485743,1.032879,0.154289, 2.311821,0.85608,0.166687, 2.3176,0.8376,0,
+ 2.3176,0.8376,0, 2.4929,1.01715,0, 2.485743,1.032879,0.154289,
+ 2.466318,1.075572,0.274291, 2.296134,0.90624,0.296333, 2.311821,0.85608,0.166687,
+ 2.311821,0.85608,0.166687, 2.485743,1.032879,0.154289, 2.466318,1.075572,0.274291,
+ 2.43769,1.138488,0.360007, 2.273018,0.98016,0.388937, 2.296134,0.90624,0.296333,
+ 2.296134,0.90624,0.296333, 2.466318,1.075572,0.274291, 2.43769,1.138488,0.360007,
+ 2.402929,1.214886,0.411437, 2.244947,1.06992,0.444499, 2.273018,0.98016,0.388937,
+ 2.273018,0.98016,0.388937, 2.43769,1.138488,0.360007, 2.402929,1.214886,0.411437,
+ 2.3651,1.298025,0.42858, 2.2144,1.1676,0.46302, 2.244947,1.06992,0.444499,
+ 2.244947,1.06992,0.444499, 2.402929,1.214886,0.411437, 2.3651,1.298025,0.42858,
+ 2.327271,1.381164,0.411437, 2.183853,1.26528,0.444499, 2.2144,1.1676,0.46302,
+ 2.2144,1.1676,0.46302, 2.3651,1.298025,0.42858, 2.327271,1.381164,0.411437,
+ 2.29251,1.457562,0.360007, 2.155782,1.35504,0.388937, 2.183853,1.26528,0.444499,
+ 2.183853,1.26528,0.444499, 2.327271,1.381164,0.411437, 2.29251,1.457562,0.360007,
+ 2.263882,1.520478,0.274291, 2.132666,1.42896,0.296333, 2.155782,1.35504,0.388937,
+ 2.155782,1.35504,0.388937, 2.29251,1.457562,0.360007, 2.263882,1.520478,0.274291,
+ 2.244457,1.563171,0.154289, 2.116979,1.47912,0.166687, 2.132666,1.42896,0.296333,
+ 2.132666,1.42896,0.296333, 2.263882,1.520478,0.274291, 2.244457,1.563171,0.154289,
+ 2.2373,1.5789,0, 2.1112,1.4976,0, 2.116979,1.47912,0.166687,
+ 2.116979,1.47912,0.166687, 2.244457,1.563171,0.154289, 2.2373,1.5789,0,
+ 2.60087,1.235652,0.139234, 2.485743,1.032879,0.154289, 2.4929,1.01715,0,
+ 2.4929,1.01715,0, 2.6088,1.2228,0, 2.60087,1.235652,0.139234,
+ 2.579347,1.270536,0.247526, 2.466318,1.075572,0.274291, 2.485743,1.032879,0.154289,
+ 2.485743,1.032879,0.154289, 2.60087,1.235652,0.139234, 2.579347,1.270536,0.247526,
+ 2.547629,1.321944,0.324878, 2.43769,1.138488,0.360007, 2.466318,1.075572,0.274291,
+ 2.466318,1.075572,0.274291, 2.579347,1.270536,0.247526, 2.547629,1.321944,0.324878,
+ 2.509114,1.384368,0.37129, 2.402929,1.214886,0.411437, 2.43769,1.138488,0.360007,
+ 2.43769,1.138488,0.360007, 2.547629,1.321944,0.324878, 2.509114,1.384368,0.37129,
+ 2.4672,1.4523,0.38676, 2.3651,1.298025,0.42858, 2.402929,1.214886,0.411437,
+ 2.402929,1.214886,0.411437, 2.509114,1.384368,0.37129, 2.4672,1.4523,0.38676,
+ 2.425286,1.520232,0.37129, 2.327271,1.381164,0.411437, 2.3651,1.298025,0.42858,
+ 2.3651,1.298025,0.42858, 2.4672,1.4523,0.38676, 2.425286,1.520232,0.37129,
+ 2.386771,1.582656,0.324878, 2.29251,1.457562,0.360007, 2.327271,1.381164,0.411437,
+ 2.327271,1.381164,0.411437, 2.425286,1.520232,0.37129, 2.386771,1.582656,0.324878,
+ 2.355053,1.634064,0.247526, 2.263882,1.520478,0.274291, 2.29251,1.457562,0.360007,
+ 2.29251,1.457562,0.360007, 2.386771,1.582656,0.324878, 2.355053,1.634064,0.247526,
+ 2.33353,1.668948,0.139234, 2.244457,1.563171,0.154289, 2.263882,1.520478,0.274291,
+ 2.263882,1.520478,0.274291, 2.355053,1.634064,0.247526, 2.33353,1.668948,0.139234,
+ 2.3256,1.6818,0, 2.2373,1.5789,0, 2.244457,1.563171,0.154289,
+ 2.244457,1.563171,0.154289, 2.33353,1.668948,0.139234, 2.3256,1.6818,0,
+ 2.6791,1.453725,0.12285, 2.60087,1.235652,0.139234, 2.6088,1.2228,0,
+ 2.6088,1.2228,0, 2.6875,1.44375,0, 2.6791,1.453725,0.12285,
+ 2.6563,1.4808,0.2184, 2.579347,1.270536,0.247526, 2.60087,1.235652,0.139234,
+ 2.60087,1.235652,0.139234, 2.6791,1.453725,0.12285, 2.6563,1.4808,0.2184,
+ 2.6227,1.5207,0.28665, 2.547629,1.321944,0.324878, 2.579347,1.270536,0.247526,
+ 2.579347,1.270536,0.247526, 2.6563,1.4808,0.2184, 2.6227,1.5207,0.28665,
+ 2.5819,1.56915,0.3276, 2.509114,1.384368,0.37129, 2.547629,1.321944,0.324878,
+ 2.547629,1.321944,0.324878, 2.6227,1.5207,0.28665, 2.5819,1.56915,0.3276,
+ 2.5375,1.621875,0.34125, 2.4672,1.4523,0.38676, 2.509114,1.384368,0.37129,
+ 2.509114,1.384368,0.37129, 2.5819,1.56915,0.3276, 2.5375,1.621875,0.34125,
+ 2.4931,1.6746,0.3276, 2.425286,1.520232,0.37129, 2.4672,1.4523,0.38676,
+ 2.4672,1.4523,0.38676, 2.5375,1.621875,0.34125, 2.4931,1.6746,0.3276,
+ 2.4523,1.72305,0.28665, 2.386771,1.582656,0.324878, 2.425286,1.520232,0.37129,
+ 2.425286,1.520232,0.37129, 2.4931,1.6746,0.3276, 2.4523,1.72305,0.28665,
+ 2.4187,1.76295,0.2184, 2.355053,1.634064,0.247526, 2.386771,1.582656,0.324878,
+ 2.386771,1.582656,0.324878, 2.4523,1.72305,0.28665, 2.4187,1.76295,0.2184,
+ 2.3959,1.790025,0.12285, 2.33353,1.668948,0.139234, 2.355053,1.634064,0.247526,
+ 2.355053,1.634064,0.247526, 2.4187,1.76295,0.2184, 2.3959,1.790025,0.12285,
+ 2.3875,1.8,0, 2.3256,1.6818,0, 2.33353,1.668948,0.139234,
+ 2.33353,1.668948,0.139234, 2.3959,1.790025,0.12285, 2.3875,1.8,0,
+ 2.74233,1.676424,0.106466, 2.6791,1.453725,0.12285, 2.6875,1.44375,0,
+ 2.6875,1.44375,0, 2.7512,1.6692,0, 2.74233,1.676424,0.106466,
+ 2.718253,1.696032,0.189274, 2.6563,1.4808,0.2184, 2.6791,1.453725,0.12285,
+ 2.6791,1.453725,0.12285, 2.74233,1.676424,0.106466, 2.718253,1.696032,0.189274,
+ 2.682771,1.724928,0.248422, 2.6227,1.5207,0.28665, 2.6563,1.4808,0.2184,
+ 2.6563,1.4808,0.2184, 2.718253,1.696032,0.189274, 2.682771,1.724928,0.248422,
+ 2.639686,1.760016,0.28391, 2.5819,1.56915,0.3276, 2.6227,1.5207,0.28665,
+ 2.6227,1.5207,0.28665, 2.682771,1.724928,0.248422, 2.639686,1.760016,0.28391,
+ 2.5928,1.7982,0.29574, 2.5375,1.621875,0.34125, 2.5819,1.56915,0.3276,
+ 2.5819,1.56915,0.3276, 2.639686,1.760016,0.28391, 2.5928,1.7982,0.29574,
+ 2.545914,1.836384,0.28391, 2.4931,1.6746,0.3276, 2.5375,1.621875,0.34125,
+ 2.5375,1.621875,0.34125, 2.5928,1.7982,0.29574, 2.545914,1.836384,0.28391,
+ 2.502829,1.871472,0.248422, 2.4523,1.72305,0.28665, 2.4931,1.6746,0.3276,
+ 2.4931,1.6746,0.3276, 2.545914,1.836384,0.28391, 2.502829,1.871472,0.248422,
+ 2.467347,1.900368,0.189274, 2.4187,1.76295,0.2184, 2.4523,1.72305,0.28665,
+ 2.4523,1.72305,0.28665, 2.502829,1.871472,0.248422, 2.467347,1.900368,0.189274,
+ 2.44327,1.919976,0.106466, 2.3959,1.790025,0.12285, 2.4187,1.76295,0.2184,
+ 2.4187,1.76295,0.2184, 2.467347,1.900368,0.189274, 2.44327,1.919976,0.106466,
+ 2.4344,1.9272,0, 2.3875,1.8,0, 2.3959,1.790025,0.12285,
+ 2.3959,1.790025,0.12285, 2.44327,1.919976,0.106466, 2.4344,1.9272,0,
+ 2.812457,1.893075,0.091411, 2.74233,1.676424,0.106466, 2.7512,1.6692,0,
+ 2.7512,1.6692,0, 2.8221,1.88835,0, 2.812457,1.893075,0.091411,
+ 2.786282,1.9059,0.162509, 2.718253,1.696032,0.189274, 2.74233,1.676424,0.106466,
+ 2.74233,1.676424,0.106466, 2.812457,1.893075,0.091411, 2.786282,1.9059,0.162509,
+ 2.74771,1.9248,0.213293, 2.682771,1.724928,0.248422, 2.718253,1.696032,0.189274,
+ 2.718253,1.696032,0.189274, 2.786282,1.9059,0.162509, 2.74771,1.9248,0.213293,
+ 2.700871,1.94775,0.243763, 2.639686,1.760016,0.28391, 2.682771,1.724928,0.248422,
+ 2.682771,1.724928,0.248422, 2.74771,1.9248,0.213293, 2.700871,1.94775,0.243763,
+ 2.6499,1.972725,0.25392, 2.5928,1.7982,0.29574, 2.639686,1.760016,0.28391,
+ 2.639686,1.760016,0.28391, 2.700871,1.94775,0.243763, 2.6499,1.972725,0.25392,
+ 2.598929,1.9977,0.243763, 2.545914,1.836384,0.28391, 2.5928,1.7982,0.29574,
+ 2.5928,1.7982,0.29574, 2.6499,1.972725,0.25392, 2.598929,1.9977,0.243763,
+ 2.55209,2.02065,0.213293, 2.502829,1.871472,0.248422, 2.545914,1.836384,0.28391,
+ 2.545914,1.836384,0.28391, 2.598929,1.9977,0.243763, 2.55209,2.02065,0.213293,
+ 2.513518,2.03955,0.162509, 2.467347,1.900368,0.189274, 2.502829,1.871472,0.248422,
+ 2.502829,1.871472,0.248422, 2.55209,2.02065,0.213293, 2.513518,2.03955,0.162509,
+ 2.487343,2.052375,0.091411, 2.44327,1.919976,0.106466, 2.467347,1.900368,0.189274,
+ 2.467347,1.900368,0.189274, 2.513518,2.03955,0.162509, 2.487343,2.052375,0.091411,
+ 2.4777,2.0571,0, 2.4344,1.9272,0, 2.44327,1.919976,0.106466,
+ 2.44327,1.919976,0.106466, 2.487343,2.052375,0.091411, 2.4777,2.0571,0,
+ 2.911379,2.093004,0.079013, 2.812457,1.893075,0.091411, 2.8221,1.88835,0,
+ 2.8221,1.88835,0, 2.9224,2.0904,0, 2.911379,2.093004,0.079013,
+ 2.881466,2.100072,0.140467, 2.786282,1.9059,0.162509, 2.812457,1.893075,0.091411,
+ 2.812457,1.893075,0.091411, 2.911379,2.093004,0.079013, 2.881466,2.100072,0.140467,
+ 2.837382,2.110488,0.184363, 2.74771,1.9248,0.213293, 2.786282,1.9059,0.162509,
+ 2.786282,1.9059,0.162509, 2.881466,2.100072,0.140467, 2.837382,2.110488,0.184363,
+ 2.783853,2.123136,0.210701, 2.700871,1.94775,0.243763, 2.74771,1.9248,0.213293,
+ 2.74771,1.9248,0.213293, 2.837382,2.110488,0.184363, 2.783853,2.123136,0.210701,
+ 2.7256,2.1369,0.21948, 2.6499,1.972725,0.25392, 2.700871,1.94775,0.243763,
+ 2.700871,1.94775,0.243763, 2.783853,2.123136,0.210701, 2.7256,2.1369,0.21948,
+ 2.667347,2.150664,0.210701, 2.598929,1.9977,0.243763, 2.6499,1.972725,0.25392,
+ 2.6499,1.972725,0.25392, 2.7256,2.1369,0.21948, 2.667347,2.150664,0.210701,
+ 2.613818,2.163312,0.184363, 2.55209,2.02065,0.213293, 2.598929,1.9977,0.243763,
+ 2.598929,1.9977,0.243763, 2.667347,2.150664,0.210701, 2.613818,2.163312,0.184363,
+ 2.569734,2.173728,0.140467, 2.513518,2.03955,0.162509, 2.55209,2.02065,0.213293,
+ 2.55209,2.02065,0.213293, 2.613818,2.163312,0.184363, 2.569734,2.173728,0.140467,
+ 2.539821,2.180796,0.079013, 2.487343,2.052375,0.091411, 2.513518,2.03955,0.162509,
+ 2.513518,2.03955,0.162509, 2.569734,2.173728,0.140467, 2.539821,2.180796,0.079013,
+ 2.5288,2.1834,0, 2.4777,2.0571,0, 2.487343,2.052375,0.091411,
+ 2.487343,2.052375,0.091411, 2.539821,2.180796,0.079013, 2.5288,2.1834,0,
+ 3.060994,2.265537,0.0706, 2.911379,2.093004,0.079013, 2.9224,2.0904,0,
+ 2.9224,2.0904,0, 3.0743,2.26455,0, 3.060994,2.265537,0.0706,
+ 3.024879,2.268216,0.12551, 2.881466,2.100072,0.140467, 2.911379,2.093004,0.079013,
+ 2.911379,2.093004,0.079013, 3.060994,2.265537,0.0706, 3.024879,2.268216,0.12551,
+ 2.971657,2.272164,0.164732, 2.837382,2.110488,0.184363, 2.881466,2.100072,0.140467,
+ 2.881466,2.100072,0.140467, 3.024879,2.268216,0.12551, 2.971657,2.272164,0.164732,
+ 2.90703,2.276958,0.188266, 2.783853,2.123136,0.210701, 2.837382,2.110488,0.184363,
+ 2.837382,2.110488,0.184363, 2.971657,2.272164,0.164732, 2.90703,2.276958,0.188266,
+ 2.8367,2.282175,0.19611, 2.7256,2.1369,0.21948, 2.783853,2.123136,0.210701,
+ 2.783853,2.123136,0.210701, 2.90703,2.276958,0.188266, 2.8367,2.282175,0.19611,
+ 2.76637,2.287392,0.188266, 2.667347,2.150664,0.210701, 2.7256,2.1369,0.21948,
+ 2.7256,2.1369,0.21948, 2.8367,2.282175,0.19611, 2.76637,2.287392,0.188266,
+ 2.701743,2.292186,0.164732, 2.613818,2.163312,0.184363, 2.667347,2.150664,0.210701,
+ 2.667347,2.150664,0.210701, 2.76637,2.287392,0.188266, 2.701743,2.292186,0.164732,
+ 2.648521,2.296134,0.12551, 2.569734,2.173728,0.140467, 2.613818,2.163312,0.184363,
+ 2.613818,2.163312,0.184363, 2.701743,2.292186,0.164732, 2.648521,2.296134,0.12551,
+ 2.612406,2.298813,0.0706, 2.539821,2.180796,0.079013, 2.569734,2.173728,0.140467,
+ 2.569734,2.173728,0.140467, 2.648521,2.296134,0.12551, 2.612406,2.298813,0.0706,
+ 2.5991,2.2998,0, 2.5288,2.1834,0, 2.539821,2.180796,0.079013,
+ 2.539821,2.180796,0.079013, 2.612406,2.298813,0.0706, 2.5991,2.2998,0,
+ 3.2832,2.4,0.0675, 3.060994,2.265537,0.0706, 3.0743,2.26455,0,
+ 3.0743,2.26455,0, 3.3,2.4,0, 3.2832,2.4,0.0675,
+ 3.2376,2.4,0.12, 3.024879,2.268216,0.12551, 3.060994,2.265537,0.0706,
+ 3.060994,2.265537,0.0706, 3.2832,2.4,0.0675, 3.2376,2.4,0.12,
+ 3.1704,2.4,0.1575, 2.971657,2.272164,0.164732, 3.024879,2.268216,0.12551,
+ 3.024879,2.268216,0.12551, 3.2376,2.4,0.12, 3.1704,2.4,0.1575,
+ 3.0888,2.4,0.18, 2.90703,2.276958,0.188266, 2.971657,2.272164,0.164732,
+ 2.971657,2.272164,0.164732, 3.1704,2.4,0.1575, 3.0888,2.4,0.18,
+ 3,2.4,0.1875, 2.8367,2.282175,0.19611, 2.90703,2.276958,0.188266,
+ 2.90703,2.276958,0.188266, 3.0888,2.4,0.18, 3,2.4,0.1875,
+ 2.9112,2.4,0.18, 2.76637,2.287392,0.188266, 2.8367,2.282175,0.19611,
+ 2.8367,2.282175,0.19611, 3,2.4,0.1875, 2.9112,2.4,0.18,
+ 2.8296,2.4,0.1575, 2.701743,2.292186,0.164732, 2.76637,2.287392,0.188266,
+ 2.76637,2.287392,0.188266, 2.9112,2.4,0.18, 2.8296,2.4,0.1575,
+ 2.7624,2.4,0.12, 2.648521,2.296134,0.12551, 2.701743,2.292186,0.164732,
+ 2.701743,2.292186,0.164732, 2.8296,2.4,0.1575, 2.7624,2.4,0.12,
+ 2.7168,2.4,0.0675, 2.612406,2.298813,0.0706, 2.648521,2.296134,0.12551,
+ 2.648521,2.296134,0.12551, 2.7624,2.4,0.12, 2.7168,2.4,0.0675,
+ 2.7,2.4,0, 2.5991,2.2998,0, 2.612406,2.298813,0.0706,
+ 2.612406,2.298813,0.0706, 2.7168,2.4,0.0675, 2.7,2.4,0,
+ 2.747407,2.420406,-0.066744, 2.7168,2.4,-0.0675, 2.7,2.4,0,
+ 2.7,2.4,0, 2.7298,2.42025,0, 2.747407,2.420406,-0.066744,
+ 2.795198,2.420829,-0.118656, 2.7624,2.4,-0.12, 2.7168,2.4,-0.0675,
+ 2.7168,2.4,-0.0675, 2.747407,2.420406,-0.066744, 2.795198,2.420829,-0.118656,
+ 2.865626,2.421453,-0.155736, 2.8296,2.4,-0.1575, 2.7624,2.4,-0.12,
+ 2.7624,2.4,-0.12, 2.795198,2.420829,-0.118656, 2.865626,2.421453,-0.155736,
+ 2.951146,2.42221,-0.177984, 2.9112,2.4,-0.18, 2.8296,2.4,-0.1575,
+ 2.8296,2.4,-0.1575, 2.865626,2.421453,-0.155736, 2.951146,2.42221,-0.177984,
+ 3.044212,2.423034,-0.1854, 3,2.4,-0.1875, 2.9112,2.4,-0.18,
+ 2.9112,2.4,-0.18, 2.951146,2.42221,-0.177984, 3.044212,2.423034,-0.1854,
+ 3.137279,2.423859,-0.177984, 3.0888,2.4,-0.18, 3,2.4,-0.1875,
+ 3,2.4,-0.1875, 3.044212,2.423034,-0.1854, 3.137279,2.423859,-0.177984,
+ 3.222799,2.424616,-0.155736, 3.1704,2.4,-0.1575, 3.0888,2.4,-0.18,
+ 3.0888,2.4,-0.18, 3.137279,2.423859,-0.177984, 3.222799,2.424616,-0.155736,
+ 3.293227,2.42524,-0.118656, 3.2376,2.4,-0.12, 3.1704,2.4,-0.1575,
+ 3.1704,2.4,-0.1575, 3.222799,2.424616,-0.155736, 3.293227,2.42524,-0.118656,
+ 3.341018,2.425663,-0.066744, 3.2832,2.4,-0.0675, 3.2376,2.4,-0.12,
+ 3.2376,2.4,-0.12, 3.293227,2.42524,-0.118656, 3.341018,2.425663,-0.066744,
+ 3.358625,2.425819,0, 3.3,2.4,0, 3.2832,2.4,-0.0675,
+ 3.2832,2.4,-0.0675, 3.341018,2.425663,-0.066744, 3.358625,2.425819,0,
+ 2.776365,2.436302,-0.064692, 2.747407,2.420406,-0.066744, 2.7298,2.42025,0,
+ 2.7298,2.42025,0, 2.7584,2.436,0, 2.776365,2.436302,-0.064692,
+ 2.825126,2.437123,-0.115008, 2.795198,2.420829,-0.118656, 2.747407,2.420406,-0.066744,
+ 2.747407,2.420406,-0.066744, 2.776365,2.436302,-0.064692, 2.825126,2.437123,-0.115008,
+ 2.896986,2.438333,-0.150948, 2.865626,2.421453,-0.155736, 2.795198,2.420829,-0.118656,
+ 2.795198,2.420829,-0.118656, 2.825126,2.437123,-0.115008, 2.896986,2.438333,-0.150948,
+ 2.984243,2.439802,-0.172512, 2.951146,2.42221,-0.177984, 2.865626,2.421453,-0.155736,
+ 2.865626,2.421453,-0.155736, 2.896986,2.438333,-0.150948, 2.984243,2.439802,-0.172512,
+ 3.0792,2.4414,-0.1797, 3.044212,2.423034,-0.1854, 2.951146,2.42221,-0.177984,
+ 2.951146,2.42221,-0.177984, 2.984243,2.439802,-0.172512, 3.0792,2.4414,-0.1797,
+ 3.174157,2.442998,-0.172512, 3.137279,2.423859,-0.177984, 3.044212,2.423034,-0.1854,
+ 3.044212,2.423034,-0.1854, 3.0792,2.4414,-0.1797, 3.174157,2.442998,-0.172512,
+ 3.261414,2.444467,-0.150948, 3.222799,2.424616,-0.155736, 3.137279,2.423859,-0.177984,
+ 3.137279,2.423859,-0.177984, 3.174157,2.442998,-0.172512, 3.261414,2.444467,-0.150948,
+ 3.333274,2.445677,-0.115008, 3.293227,2.42524,-0.118656, 3.222799,2.424616,-0.155736,
+ 3.222799,2.424616,-0.155736, 3.261414,2.444467,-0.150948, 3.333274,2.445677,-0.115008,
+ 3.382035,2.446498,-0.064692, 3.341018,2.425663,-0.066744, 3.293227,2.42524,-0.118656,
+ 3.293227,2.42524,-0.118656, 3.333274,2.445677,-0.115008, 3.382035,2.446498,-0.064692,
+ 3.4,2.4468,0, 3.358625,2.425819,0, 3.341018,2.425663,-0.066744,
+ 3.341018,2.425663,-0.066744, 3.382035,2.446498,-0.064692, 3.4,2.4468,0,
+ 2.802528,2.44768,-0.061668, 2.776365,2.436302,-0.064692, 2.7584,2.436,0,
+ 2.7584,2.436,0, 2.7846,2.44725,0, 2.802528,2.44768,-0.061668,
+ 2.851189,2.448847,-0.109632, 2.825126,2.437123,-0.115008, 2.776365,2.436302,-0.064692,
+ 2.776365,2.436302,-0.064692, 2.802528,2.44768,-0.061668, 2.851189,2.448847,-0.109632,
+ 2.922899,2.450567,-0.143892, 2.896986,2.438333,-0.150948, 2.825126,2.437123,-0.115008,
+ 2.825126,2.437123,-0.115008, 2.851189,2.448847,-0.109632, 2.922899,2.450567,-0.143892,
+ 3.009977,2.452655,-0.164448, 2.984243,2.439802,-0.172512, 2.896986,2.438333,-0.150948,
+ 2.896986,2.438333,-0.150948, 2.922899,2.450567,-0.143892, 3.009977,2.452655,-0.164448,
+ 3.104737,2.454928,-0.1713, 3.0792,2.4414,-0.1797, 2.984243,2.439802,-0.172512,
+ 2.984243,2.439802,-0.172512, 3.009977,2.452655,-0.164448, 3.104737,2.454928,-0.1713,
+ 3.199498,2.457201,-0.164448, 3.174157,2.442998,-0.172512, 3.0792,2.4414,-0.1797,
+ 3.0792,2.4414,-0.1797, 3.104737,2.454928,-0.1713, 3.199498,2.457201,-0.164448,
+ 3.286576,2.459289,-0.143892, 3.261414,2.444467,-0.150948, 3.174157,2.442998,-0.172512,
+ 3.174157,2.442998,-0.172512, 3.199498,2.457201,-0.164448, 3.286576,2.459289,-0.143892,
+ 3.358286,2.461009,-0.109632, 3.333274,2.445677,-0.115008, 3.261414,2.444467,-0.150948,
+ 3.261414,2.444467,-0.150948, 3.286576,2.459289,-0.143892, 3.358286,2.461009,-0.109632,
+ 3.406947,2.462176,-0.061668, 3.382035,2.446498,-0.064692, 3.333274,2.445677,-0.115008,
+ 3.333274,2.445677,-0.115008, 3.358286,2.461009,-0.109632, 3.406947,2.462176,-0.061668,
+ 3.424875,2.462606,0, 3.4,2.4468,0, 3.382035,2.446498,-0.064692,
+ 3.382035,2.446498,-0.064692, 3.406947,2.462176,-0.061668, 3.424875,2.462606,0,
+ 2.82475,2.454529,-0.057996, 2.802528,2.44768,-0.061668, 2.7846,2.44725,0,
+ 2.7846,2.44725,0, 2.8072,2.454,0, 2.82475,2.454529,-0.057996,
+ 2.872387,2.455966,-0.103104, 2.851189,2.448847,-0.109632, 2.802528,2.44768,-0.061668,
+ 2.802528,2.44768,-0.061668, 2.82475,2.454529,-0.057996, 2.872387,2.455966,-0.103104,
+ 2.942589,2.458082,-0.135324, 2.922899,2.450567,-0.143892, 2.851189,2.448847,-0.109632,
+ 2.851189,2.448847,-0.109632, 2.872387,2.455966,-0.103104, 2.942589,2.458082,-0.135324,
+ 3.027834,2.460653,-0.154656, 3.009977,2.452655,-0.164448, 2.922899,2.450567,-0.143892,
+ 2.922899,2.450567,-0.143892, 2.942589,2.458082,-0.135324, 3.027834,2.460653,-0.154656,
+ 3.1206,2.46345,-0.1611, 3.104737,2.454928,-0.1713, 3.009977,2.452655,-0.164448,
+ 3.009977,2.452655,-0.164448, 3.027834,2.460653,-0.154656, 3.1206,2.46345,-0.1611,
+ 3.213366,2.466247,-0.154656, 3.199498,2.457201,-0.164448, 3.104737,2.454928,-0.1713,
+ 3.104737,2.454928,-0.1713, 3.1206,2.46345,-0.1611, 3.213366,2.466247,-0.154656,
+ 3.298611,2.468818,-0.135324, 3.286576,2.459289,-0.143892, 3.199498,2.457201,-0.164448,
+ 3.199498,2.457201,-0.164448, 3.213366,2.466247,-0.154656, 3.298611,2.468818,-0.135324,
+ 3.368813,2.470934,-0.103104, 3.358286,2.461009,-0.109632, 3.286576,2.459289,-0.143892,
+ 3.286576,2.459289,-0.143892, 3.298611,2.468818,-0.135324, 3.368813,2.470934,-0.103104,
+ 3.41645,2.472371,-0.057996, 3.406947,2.462176,-0.061668, 3.358286,2.461009,-0.109632,
+ 3.358286,2.461009,-0.109632, 3.368813,2.470934,-0.103104, 3.41645,2.472371,-0.057996,
+ 3.434,2.4729,0, 3.424875,2.462606,0, 3.406947,2.462176,-0.061668,
+ 3.406947,2.462176,-0.061668, 3.41645,2.472371,-0.057996, 3.434,2.4729,0,
+ 2.841887,2.456841,-0.054, 2.82475,2.454529,-0.057996, 2.8072,2.454,0,
+ 2.8072,2.454,0, 2.825,2.45625,0, 2.841887,2.456841,-0.054,
+ 2.887725,2.458444,-0.096, 2.872387,2.455966,-0.103104, 2.82475,2.454529,-0.057996,
+ 2.82475,2.454529,-0.057996, 2.841887,2.456841,-0.054, 2.887725,2.458444,-0.096,
+ 2.955275,2.460806,-0.126, 2.942589,2.458082,-0.135324, 2.872387,2.455966,-0.103104,
+ 2.872387,2.455966,-0.103104, 2.887725,2.458444,-0.096, 2.955275,2.460806,-0.126,
+ 3.0373,2.463675,-0.144, 3.027834,2.460653,-0.154656, 2.942589,2.458082,-0.135324,
+ 2.942589,2.458082,-0.135324, 2.955275,2.460806,-0.126, 3.0373,2.463675,-0.144,
+ 3.126562,2.466797,-0.15, 3.1206,2.46345,-0.1611, 3.027834,2.460653,-0.154656,
+ 3.027834,2.460653,-0.154656, 3.0373,2.463675,-0.144, 3.126562,2.466797,-0.15,
+ 3.215825,2.469919,-0.144, 3.213366,2.466247,-0.154656, 3.1206,2.46345,-0.1611,
+ 3.1206,2.46345,-0.1611, 3.126562,2.466797,-0.15, 3.215825,2.469919,-0.144,
+ 3.29785,2.472787,-0.126, 3.298611,2.468818,-0.135324, 3.213366,2.466247,-0.154656,
+ 3.213366,2.466247,-0.154656, 3.215825,2.469919,-0.144, 3.29785,2.472787,-0.126,
+ 3.3654,2.47515,-0.096, 3.368813,2.470934,-0.103104, 3.298611,2.468818,-0.135324,
+ 3.298611,2.468818,-0.135324, 3.29785,2.472787,-0.126, 3.3654,2.47515,-0.096,
+ 3.411237,2.476753,-0.054, 3.41645,2.472371,-0.057996, 3.368813,2.470934,-0.103104,
+ 3.368813,2.470934,-0.103104, 3.3654,2.47515,-0.096, 3.411237,2.476753,-0.054,
+ 3.428125,2.477344,0, 3.434,2.4729,0, 3.41645,2.472371,-0.057996,
+ 3.41645,2.472371,-0.057996, 3.411237,2.476753,-0.054, 3.428125,2.477344,0,
+ 2.852794,2.454605,-0.050004, 2.841887,2.456841,-0.054, 2.825,2.45625,0,
+ 2.825,2.45625,0, 2.8368,2.454,0, 2.852794,2.454605,-0.050004,
+ 2.896205,2.456246,-0.088896, 2.887725,2.458444,-0.096, 2.841887,2.456841,-0.054,
+ 2.841887,2.456841,-0.054, 2.852794,2.454605,-0.050004, 2.896205,2.456246,-0.088896,
+ 2.960179,2.458666,-0.116676, 2.955275,2.460806,-0.126, 2.887725,2.458444,-0.096,
+ 2.887725,2.458444,-0.096, 2.896205,2.456246,-0.088896, 2.960179,2.458666,-0.116676,
+ 3.037862,2.461603,-0.133344, 3.0373,2.463675,-0.144, 2.955275,2.460806,-0.126,
+ 2.955275,2.460806,-0.126, 2.960179,2.458666,-0.116676, 3.037862,2.461603,-0.133344,
+ 3.1224,2.4648,-0.1389, 3.126562,2.466797,-0.15, 3.0373,2.463675,-0.144,
+ 3.0373,2.463675,-0.144, 3.037862,2.461603,-0.133344, 3.1224,2.4648,-0.1389,
+ 3.206938,2.467997,-0.133344, 3.215825,2.469919,-0.144, 3.126562,2.466797,-0.15,
+ 3.126562,2.466797,-0.15, 3.1224,2.4648,-0.1389, 3.206938,2.467997,-0.133344,
+ 3.284621,2.470934,-0.116676, 3.29785,2.472787,-0.126, 3.215825,2.469919,-0.144,
+ 3.215825,2.469919,-0.144, 3.206938,2.467997,-0.133344, 3.284621,2.470934,-0.116676,
+ 3.348595,2.473354,-0.088896, 3.3654,2.47515,-0.096, 3.29785,2.472787,-0.126,
+ 3.29785,2.472787,-0.126, 3.284621,2.470934,-0.116676, 3.348595,2.473354,-0.088896,
+ 3.392006,2.474995,-0.050004, 3.411237,2.476753,-0.054, 3.3654,2.47515,-0.096,
+ 3.3654,2.47515,-0.096, 3.348595,2.473354,-0.088896, 3.392006,2.474995,-0.050004,
+ 3.408,2.4756,0, 3.428125,2.477344,0, 3.411237,2.476753,-0.054,
+ 3.411237,2.476753,-0.054, 3.392006,2.474995,-0.050004, 3.408,2.4756,0,
+ 2.856323,2.447812,-0.046332, 2.852794,2.454605,-0.050004, 2.8368,2.454,0,
+ 2.8368,2.454,0, 2.8414,2.44725,0, 2.856323,2.447812,-0.046332,
+ 2.896829,2.449338,-0.082368, 2.896205,2.456246,-0.088896, 2.852794,2.454605,-0.050004,
+ 2.852794,2.454605,-0.050004, 2.856323,2.447812,-0.046332, 2.896829,2.449338,-0.082368,
+ 2.956523,2.451588,-0.108108, 2.960179,2.458666,-0.116676, 2.896205,2.456246,-0.088896,
+ 2.896205,2.456246,-0.088896, 2.896829,2.449338,-0.082368, 2.956523,2.451588,-0.108108,
+ 3.029007,2.454319,-0.123552, 3.037862,2.461603,-0.133344, 2.960179,2.458666,-0.116676,
+ 2.960179,2.458666,-0.116676, 2.956523,2.451588,-0.108108, 3.029007,2.454319,-0.123552,
+ 3.107887,2.457291,-0.1287, 3.1224,2.4648,-0.1389, 3.037862,2.461603,-0.133344,
+ 3.037862,2.461603,-0.133344, 3.029007,2.454319,-0.123552, 3.107887,2.457291,-0.1287,
+ 3.186768,2.460263,-0.123552, 3.206938,2.467997,-0.133344, 3.1224,2.4648,-0.1389,
+ 3.1224,2.4648,-0.1389, 3.107887,2.457291,-0.1287, 3.186768,2.460263,-0.123552,
+ 3.259252,2.462994,-0.108108, 3.284621,2.470934,-0.116676, 3.206938,2.467997,-0.133344,
+ 3.206938,2.467997,-0.133344, 3.186768,2.460263,-0.123552, 3.259252,2.462994,-0.108108,
+ 3.318946,2.465243,-0.082368, 3.348595,2.473354,-0.088896, 3.284621,2.470934,-0.116676,
+ 3.284621,2.470934,-0.116676, 3.259252,2.462994,-0.108108, 3.318946,2.465243,-0.082368,
+ 3.359452,2.466769,-0.046332, 3.392006,2.474995,-0.050004, 3.348595,2.473354,-0.088896,
+ 3.348595,2.473354,-0.088896, 3.318946,2.465243,-0.082368, 3.359452,2.466769,-0.046332,
+ 3.374375,2.467331,0, 3.408,2.4756,0, 3.392006,2.474995,-0.050004,
+ 3.392006,2.474995,-0.050004, 3.359452,2.466769,-0.046332, 3.374375,2.467331,0,
+ 2.851331,2.436454,-0.043308, 2.856323,2.447812,-0.046332, 2.8414,2.44725,0,
+ 2.8414,2.44725,0, 2.8376,2.436,0, 2.851331,2.436454,-0.043308,
+ 2.888602,2.437685,-0.076992, 2.896829,2.449338,-0.082368, 2.856323,2.447812,-0.046332,
+ 2.856323,2.447812,-0.046332, 2.851331,2.436454,-0.043308, 2.888602,2.437685,-0.076992,
+ 2.943526,2.439499,-0.101052, 2.956523,2.451588,-0.108108, 2.896829,2.449338,-0.082368,
+ 2.896829,2.449338,-0.082368, 2.888602,2.437685,-0.076992, 2.943526,2.439499,-0.101052,
+ 3.010221,2.441702,-0.115488, 3.029007,2.454319,-0.123552, 2.956523,2.451588,-0.108108,
+ 2.956523,2.451588,-0.108108, 2.943526,2.439499,-0.101052, 3.010221,2.441702,-0.115488,
+ 3.0828,2.4441,-0.1203, 3.107887,2.457291,-0.1287, 3.029007,2.454319,-0.123552,
+ 3.029007,2.454319,-0.123552, 3.010221,2.441702,-0.115488, 3.0828,2.4441,-0.1203,
+ 3.155379,2.446498,-0.115488, 3.186768,2.460263,-0.123552, 3.107887,2.457291,-0.1287,
+ 3.107887,2.457291,-0.1287, 3.0828,2.4441,-0.1203, 3.155379,2.446498,-0.115488,
+ 3.222074,2.448701,-0.101052, 3.259252,2.462994,-0.108108, 3.186768,2.460263,-0.123552,
+ 3.186768,2.460263,-0.123552, 3.155379,2.446498,-0.115488, 3.222074,2.448701,-0.101052,
+ 3.276998,2.450515,-0.076992, 3.318946,2.465243,-0.082368, 3.259252,2.462994,-0.108108,
+ 3.259252,2.462994,-0.108108, 3.222074,2.448701,-0.101052, 3.276998,2.450515,-0.076992,
+ 3.314269,2.451746,-0.043308, 3.359452,2.466769,-0.046332, 3.318946,2.465243,-0.082368,
+ 3.318946,2.465243,-0.082368, 3.276998,2.450515,-0.076992, 3.314269,2.451746,-0.043308,
+ 3.328,2.4522,0, 3.374375,2.467331,0, 3.359452,2.466769,-0.046332,
+ 3.359452,2.466769,-0.046332, 3.314269,2.451746,-0.043308, 3.328,2.4522,0,
+ 2.836672,2.420519,-0.041256, 2.851331,2.436454,-0.043308, 2.8376,2.436,0,
+ 2.8376,2.436,0, 2.8242,2.42025,0, 2.836672,2.420519,-0.041256,
+ 2.870524,2.42125,-0.073344, 2.888602,2.437685,-0.076992, 2.851331,2.436454,-0.043308,
+ 2.851331,2.436454,-0.043308, 2.836672,2.420519,-0.041256, 2.870524,2.42125,-0.073344,
+ 2.920412,2.422328,-0.096264, 2.943526,2.439499,-0.101052, 2.888602,2.437685,-0.076992,
+ 2.888602,2.437685,-0.076992, 2.870524,2.42125,-0.073344, 2.920412,2.422328,-0.096264,
+ 2.98099,2.423636,-0.110016, 3.010221,2.441702,-0.115488, 2.943526,2.439499,-0.101052,
+ 2.943526,2.439499,-0.101052, 2.920412,2.422328,-0.096264, 2.98099,2.423636,-0.110016,
+ 3.046912,2.425059,-0.1146, 3.0828,2.4441,-0.1203, 3.010221,2.441702,-0.115488,
+ 3.010221,2.441702,-0.115488, 2.98099,2.423636,-0.110016, 3.046912,2.425059,-0.1146,
+ 3.112835,2.426483,-0.110016, 3.155379,2.446498,-0.115488, 3.0828,2.4441,-0.1203,
+ 3.0828,2.4441,-0.1203, 3.046912,2.425059,-0.1146, 3.112835,2.426483,-0.110016,
+ 3.173413,2.427791,-0.096264, 3.222074,2.448701,-0.101052, 3.155379,2.446498,-0.115488,
+ 3.155379,2.446498,-0.115488, 3.112835,2.426483,-0.110016, 3.173413,2.427791,-0.096264,
+ 3.223301,2.428868,-0.073344, 3.276998,2.450515,-0.076992, 3.222074,2.448701,-0.101052,
+ 3.222074,2.448701,-0.101052, 3.173413,2.427791,-0.096264, 3.223301,2.428868,-0.073344,
+ 3.257153,2.429599,-0.041256, 3.314269,2.451746,-0.043308, 3.276998,2.450515,-0.076992,
+ 3.276998,2.450515,-0.076992, 3.223301,2.428868,-0.073344, 3.257153,2.429599,-0.041256,
+ 3.269625,2.429869,0, 3.328,2.4522,0, 3.314269,2.451746,-0.043308,
+ 3.314269,2.451746,-0.043308, 3.257153,2.429599,-0.041256, 3.269625,2.429869,0,
+ 2.8112,2.4,-0.0405, 2.836672,2.420519,-0.041256, 2.8242,2.42025,0,
+ 2.8242,2.42025,0, 2.8,2.4,0, 2.8112,2.4,-0.0405,
+ 2.8416,2.4,-0.072, 2.870524,2.42125,-0.073344, 2.836672,2.420519,-0.041256,
+ 2.836672,2.420519,-0.041256, 2.8112,2.4,-0.0405, 2.8416,2.4,-0.072,
+ 2.8864,2.4,-0.0945, 2.920412,2.422328,-0.096264, 2.870524,2.42125,-0.073344,
+ 2.870524,2.42125,-0.073344, 2.8416,2.4,-0.072, 2.8864,2.4,-0.0945,
+ 2.9408,2.4,-0.108, 2.98099,2.423636,-0.110016, 2.920412,2.422328,-0.096264,
+ 2.920412,2.422328,-0.096264, 2.8864,2.4,-0.0945, 2.9408,2.4,-0.108,
+ 3,2.4,-0.1125, 3.046912,2.425059,-0.1146, 2.98099,2.423636,-0.110016,
+ 2.98099,2.423636,-0.110016, 2.9408,2.4,-0.108, 3,2.4,-0.1125,
+ 3.0592,2.4,-0.108, 3.112835,2.426483,-0.110016, 3.046912,2.425059,-0.1146,
+ 3.046912,2.425059,-0.1146, 3,2.4,-0.1125, 3.0592,2.4,-0.108,
+ 3.1136,2.4,-0.0945, 3.173413,2.427791,-0.096264, 3.112835,2.426483,-0.110016,
+ 3.112835,2.426483,-0.110016, 3.0592,2.4,-0.108, 3.1136,2.4,-0.0945,
+ 3.1584,2.4,-0.072, 3.223301,2.428868,-0.073344, 3.173413,2.427791,-0.096264,
+ 3.173413,2.427791,-0.096264, 3.1136,2.4,-0.0945, 3.1584,2.4,-0.072,
+ 3.1888,2.4,-0.0405, 3.257153,2.429599,-0.041256, 3.223301,2.428868,-0.073344,
+ 3.223301,2.428868,-0.073344, 3.1584,2.4,-0.072, 3.1888,2.4,-0.0405,
+ 3.2,2.4,0, 3.269625,2.429869,0, 3.257153,2.429599,-0.041256,
+ 3.257153,2.429599,-0.041256, 3.1888,2.4,-0.0405, 3.2,2.4,0,
+ 3.341018,2.425663,0.066744, 3.2832,2.4,0.0675, 3.3,2.4,0,
+ 3.3,2.4,0, 3.358625,2.425819,0, 3.341018,2.425663,0.066744,
+ 3.293227,2.42524,0.118656, 3.2376,2.4,0.12, 3.2832,2.4,0.0675,
+ 3.2832,2.4,0.0675, 3.341018,2.425663,0.066744, 3.293227,2.42524,0.118656,
+ 3.222799,2.424616,0.155736, 3.1704,2.4,0.1575, 3.2376,2.4,0.12,
+ 3.2376,2.4,0.12, 3.293227,2.42524,0.118656, 3.222799,2.424616,0.155736,
+ 3.137279,2.423859,0.177984, 3.0888,2.4,0.18, 3.1704,2.4,0.1575,
+ 3.1704,2.4,0.1575, 3.222799,2.424616,0.155736, 3.137279,2.423859,0.177984,
+ 3.044212,2.423034,0.1854, 3,2.4,0.1875, 3.0888,2.4,0.18,
+ 3.0888,2.4,0.18, 3.137279,2.423859,0.177984, 3.044212,2.423034,0.1854,
+ 2.951146,2.42221,0.177984, 2.9112,2.4,0.18, 3,2.4,0.1875,
+ 3,2.4,0.1875, 3.044212,2.423034,0.1854, 2.951146,2.42221,0.177984,
+ 2.865626,2.421453,0.155736, 2.8296,2.4,0.1575, 2.9112,2.4,0.18,
+ 2.9112,2.4,0.18, 2.951146,2.42221,0.177984, 2.865626,2.421453,0.155736,
+ 2.795198,2.420829,0.118656, 2.7624,2.4,0.12, 2.8296,2.4,0.1575,
+ 2.8296,2.4,0.1575, 2.865626,2.421453,0.155736, 2.795198,2.420829,0.118656,
+ 2.747407,2.420406,0.066744, 2.7168,2.4,0.0675, 2.7624,2.4,0.12,
+ 2.7624,2.4,0.12, 2.795198,2.420829,0.118656, 2.747407,2.420406,0.066744,
+ 2.7298,2.42025,0, 2.7,2.4,0, 2.7168,2.4,0.0675,
+ 2.7168,2.4,0.0675, 2.747407,2.420406,0.066744, 2.7298,2.42025,0,
+ 3.382035,2.446498,0.064692, 3.341018,2.425663,0.066744, 3.358625,2.425819,0,
+ 3.358625,2.425819,0, 3.4,2.4468,0, 3.382035,2.446498,0.064692,
+ 3.333274,2.445677,0.115008, 3.293227,2.42524,0.118656, 3.341018,2.425663,0.066744,
+ 3.341018,2.425663,0.066744, 3.382035,2.446498,0.064692, 3.333274,2.445677,0.115008,
+ 3.261414,2.444467,0.150948, 3.222799,2.424616,0.155736, 3.293227,2.42524,0.118656,
+ 3.293227,2.42524,0.118656, 3.333274,2.445677,0.115008, 3.261414,2.444467,0.150948,
+ 3.174157,2.442998,0.172512, 3.137279,2.423859,0.177984, 3.222799,2.424616,0.155736,
+ 3.222799,2.424616,0.155736, 3.261414,2.444467,0.150948, 3.174157,2.442998,0.172512,
+ 3.0792,2.4414,0.1797, 3.044212,2.423034,0.1854, 3.137279,2.423859,0.177984,
+ 3.137279,2.423859,0.177984, 3.174157,2.442998,0.172512, 3.0792,2.4414,0.1797,
+ 2.984243,2.439802,0.172512, 2.951146,2.42221,0.177984, 3.044212,2.423034,0.1854,
+ 3.044212,2.423034,0.1854, 3.0792,2.4414,0.1797, 2.984243,2.439802,0.172512,
+ 2.896986,2.438333,0.150948, 2.865626,2.421453,0.155736, 2.951146,2.42221,0.177984,
+ 2.951146,2.42221,0.177984, 2.984243,2.439802,0.172512, 2.896986,2.438333,0.150948,
+ 2.825126,2.437123,0.115008, 2.795198,2.420829,0.118656, 2.865626,2.421453,0.155736,
+ 2.865626,2.421453,0.155736, 2.896986,2.438333,0.150948, 2.825126,2.437123,0.115008,
+ 2.776365,2.436302,0.064692, 2.747407,2.420406,0.066744, 2.795198,2.420829,0.118656,
+ 2.795198,2.420829,0.118656, 2.825126,2.437123,0.115008, 2.776365,2.436302,0.064692,
+ 2.7584,2.436,0, 2.7298,2.42025,0, 2.747407,2.420406,0.066744,
+ 2.747407,2.420406,0.066744, 2.776365,2.436302,0.064692, 2.7584,2.436,0,
+ 3.406947,2.462176,0.061668, 3.382035,2.446498,0.064692, 3.4,2.4468,0,
+ 3.4,2.4468,0, 3.424875,2.462606,0, 3.406947,2.462176,0.061668,
+ 3.358286,2.461009,0.109632, 3.333274,2.445677,0.115008, 3.382035,2.446498,0.064692,
+ 3.382035,2.446498,0.064692, 3.406947,2.462176,0.061668, 3.358286,2.461009,0.109632,
+ 3.286576,2.459289,0.143892, 3.261414,2.444467,0.150948, 3.333274,2.445677,0.115008,
+ 3.333274,2.445677,0.115008, 3.358286,2.461009,0.109632, 3.286576,2.459289,0.143892,
+ 3.199498,2.457201,0.164448, 3.174157,2.442998,0.172512, 3.261414,2.444467,0.150948,
+ 3.261414,2.444467,0.150948, 3.286576,2.459289,0.143892, 3.199498,2.457201,0.164448,
+ 3.104738,2.454928,0.1713, 3.0792,2.4414,0.1797, 3.174157,2.442998,0.172512,
+ 3.174157,2.442998,0.172512, 3.199498,2.457201,0.164448, 3.104738,2.454928,0.1713,
+ 3.009977,2.452655,0.164448, 2.984243,2.439802,0.172512, 3.0792,2.4414,0.1797,
+ 3.0792,2.4414,0.1797, 3.104738,2.454928,0.1713, 3.009977,2.452655,0.164448,
+ 2.922899,2.450567,0.143892, 2.896986,2.438333,0.150948, 2.984243,2.439802,0.172512,
+ 2.984243,2.439802,0.172512, 3.009977,2.452655,0.164448, 2.922899,2.450567,0.143892,
+ 2.851189,2.448847,0.109632, 2.825126,2.437123,0.115008, 2.896986,2.438333,0.150948,
+ 2.896986,2.438333,0.150948, 2.922899,2.450567,0.143892, 2.851189,2.448847,0.109632,
+ 2.802528,2.44768,0.061668, 2.776365,2.436302,0.064692, 2.825126,2.437123,0.115008,
+ 2.825126,2.437123,0.115008, 2.851189,2.448847,0.109632, 2.802528,2.44768,0.061668,
+ 2.7846,2.44725,0, 2.7584,2.436,0, 2.776365,2.436302,0.064692,
+ 2.776365,2.436302,0.064692, 2.802528,2.44768,0.061668, 2.7846,2.44725,0,
+ 3.41645,2.472371,0.057996, 3.406947,2.462176,0.061668, 3.424875,2.462606,0,
+ 3.424875,2.462606,0, 3.434,2.4729,0, 3.41645,2.472371,0.057996,
+ 3.368813,2.470934,0.103104, 3.358286,2.461009,0.109632, 3.406947,2.462176,0.061668,
+ 3.406947,2.462176,0.061668, 3.41645,2.472371,0.057996, 3.368813,2.470934,0.103104,
+ 3.298611,2.468818,0.135324, 3.286576,2.459289,0.143892, 3.358286,2.461009,0.109632,
+ 3.358286,2.461009,0.109632, 3.368813,2.470934,0.103104, 3.298611,2.468818,0.135324,
+ 3.213366,2.466247,0.154656, 3.199498,2.457201,0.164448, 3.286576,2.459289,0.143892,
+ 3.286576,2.459289,0.143892, 3.298611,2.468818,0.135324, 3.213366,2.466247,0.154656,
+ 3.1206,2.46345,0.1611, 3.104738,2.454928,0.1713, 3.199498,2.457201,0.164448,
+ 3.199498,2.457201,0.164448, 3.213366,2.466247,0.154656, 3.1206,2.46345,0.1611,
+ 3.027834,2.460653,0.154656, 3.009977,2.452655,0.164448, 3.104738,2.454928,0.1713,
+ 3.104738,2.454928,0.1713, 3.1206,2.46345,0.1611, 3.027834,2.460653,0.154656,
+ 2.942589,2.458082,0.135324, 2.922899,2.450567,0.143892, 3.009977,2.452655,0.164448,
+ 3.009977,2.452655,0.164448, 3.027834,2.460653,0.154656, 2.942589,2.458082,0.135324,
+ 2.872387,2.455966,0.103104, 2.851189,2.448847,0.109632, 2.922899,2.450567,0.143892,
+ 2.922899,2.450567,0.143892, 2.942589,2.458082,0.135324, 2.872387,2.455966,0.103104,
+ 2.82475,2.454529,0.057996, 2.802528,2.44768,0.061668, 2.851189,2.448847,0.109632,
+ 2.851189,2.448847,0.109632, 2.872387,2.455966,0.103104, 2.82475,2.454529,0.057996,
+ 2.8072,2.454,0, 2.7846,2.44725,0, 2.802528,2.44768,0.061668,
+ 2.802528,2.44768,0.061668, 2.82475,2.454529,0.057996, 2.8072,2.454,0,
+ 3.411237,2.476753,0.054, 3.41645,2.472371,0.057996, 3.434,2.4729,0,
+ 3.434,2.4729,0, 3.428125,2.477344,0, 3.411237,2.476753,0.054,
+ 3.3654,2.47515,0.096, 3.368813,2.470934,0.103104, 3.41645,2.472371,0.057996,
+ 3.41645,2.472371,0.057996, 3.411237,2.476753,0.054, 3.3654,2.47515,0.096,
+ 3.29785,2.472788,0.126, 3.298611,2.468818,0.135324, 3.368813,2.470934,0.103104,
+ 3.368813,2.470934,0.103104, 3.3654,2.47515,0.096, 3.29785,2.472788,0.126,
+ 3.215825,2.469919,0.144, 3.213366,2.466247,0.154656, 3.298611,2.468818,0.135324,
+ 3.298611,2.468818,0.135324, 3.29785,2.472788,0.126, 3.215825,2.469919,0.144,
+ 3.126562,2.466797,0.15, 3.1206,2.46345,0.1611, 3.213366,2.466247,0.154656,
+ 3.213366,2.466247,0.154656, 3.215825,2.469919,0.144, 3.126562,2.466797,0.15,
+ 3.0373,2.463675,0.144, 3.027834,2.460653,0.154656, 3.1206,2.46345,0.1611,
+ 3.1206,2.46345,0.1611, 3.126562,2.466797,0.15, 3.0373,2.463675,0.144,
+ 2.955275,2.460806,0.126, 2.942589,2.458082,0.135324, 3.027834,2.460653,0.154656,
+ 3.027834,2.460653,0.154656, 3.0373,2.463675,0.144, 2.955275,2.460806,0.126,
+ 2.887725,2.458444,0.096, 2.872387,2.455966,0.103104, 2.942589,2.458082,0.135324,
+ 2.942589,2.458082,0.135324, 2.955275,2.460806,0.126, 2.887725,2.458444,0.096,
+ 2.841887,2.456841,0.054, 2.82475,2.454529,0.057996, 2.872387,2.455966,0.103104,
+ 2.872387,2.455966,0.103104, 2.887725,2.458444,0.096, 2.841887,2.456841,0.054,
+ 2.825,2.45625,0, 2.8072,2.454,0, 2.82475,2.454529,0.057996,
+ 2.82475,2.454529,0.057996, 2.841887,2.456841,0.054, 2.825,2.45625,0,
+ 3.392006,2.474995,0.050004, 3.411237,2.476753,0.054, 3.428125,2.477344,0,
+ 3.428125,2.477344,0, 3.408,2.4756,0, 3.392006,2.474995,0.050004,
+ 3.348595,2.473354,0.088896, 3.3654,2.47515,0.096, 3.411237,2.476753,0.054,
+ 3.411237,2.476753,0.054, 3.392006,2.474995,0.050004, 3.348595,2.473354,0.088896,
+ 3.284621,2.470934,0.116676, 3.29785,2.472788,0.126, 3.3654,2.47515,0.096,
+ 3.3654,2.47515,0.096, 3.348595,2.473354,0.088896, 3.284621,2.470934,0.116676,
+ 3.206938,2.467997,0.133344, 3.215825,2.469919,0.144, 3.29785,2.472788,0.126,
+ 3.29785,2.472788,0.126, 3.284621,2.470934,0.116676, 3.206938,2.467997,0.133344,
+ 3.1224,2.4648,0.1389, 3.126562,2.466797,0.15, 3.215825,2.469919,0.144,
+ 3.215825,2.469919,0.144, 3.206938,2.467997,0.133344, 3.1224,2.4648,0.1389,
+ 3.037862,2.461603,0.133344, 3.0373,2.463675,0.144, 3.126562,2.466797,0.15,
+ 3.126562,2.466797,0.15, 3.1224,2.4648,0.1389, 3.037862,2.461603,0.133344,
+ 2.960179,2.458666,0.116676, 2.955275,2.460806,0.126, 3.0373,2.463675,0.144,
+ 3.0373,2.463675,0.144, 3.037862,2.461603,0.133344, 2.960179,2.458666,0.116676,
+ 2.896205,2.456246,0.088896, 2.887725,2.458444,0.096, 2.955275,2.460806,0.126,
+ 2.955275,2.460806,0.126, 2.960179,2.458666,0.116676, 2.896205,2.456246,0.088896,
+ 2.852794,2.454605,0.050004, 2.841887,2.456841,0.054, 2.887725,2.458444,0.096,
+ 2.887725,2.458444,0.096, 2.896205,2.456246,0.088896, 2.852794,2.454605,0.050004,
+ 2.8368,2.454,0, 2.825,2.45625,0, 2.841887,2.456841,0.054,
+ 2.841887,2.456841,0.054, 2.852794,2.454605,0.050004, 2.8368,2.454,0,
+ 3.359452,2.466769,0.046332, 3.392006,2.474995,0.050004, 3.408,2.4756,0,
+ 3.408,2.4756,0, 3.374375,2.467331,0, 3.359452,2.466769,0.046332,
+ 3.318946,2.465243,0.082368, 3.348595,2.473354,0.088896, 3.392006,2.474995,0.050004,
+ 3.392006,2.474995,0.050004, 3.359452,2.466769,0.046332, 3.318946,2.465243,0.082368,
+ 3.259252,2.462994,0.108108, 3.284621,2.470934,0.116676, 3.348595,2.473354,0.088896,
+ 3.348595,2.473354,0.088896, 3.318946,2.465243,0.082368, 3.259252,2.462994,0.108108,
+ 3.186768,2.460263,0.123552, 3.206938,2.467997,0.133344, 3.284621,2.470934,0.116676,
+ 3.284621,2.470934,0.116676, 3.259252,2.462994,0.108108, 3.186768,2.460263,0.123552,
+ 3.107887,2.457291,0.1287, 3.1224,2.4648,0.1389, 3.206938,2.467997,0.133344,
+ 3.206938,2.467997,0.133344, 3.186768,2.460263,0.123552, 3.107887,2.457291,0.1287,
+ 3.029007,2.454319,0.123552, 3.037862,2.461603,0.133344, 3.1224,2.4648,0.1389,
+ 3.1224,2.4648,0.1389, 3.107887,2.457291,0.1287, 3.029007,2.454319,0.123552,
+ 2.956523,2.451588,0.108108, 2.960179,2.458666,0.116676, 3.037862,2.461603,0.133344,
+ 3.037862,2.461603,0.133344, 3.029007,2.454319,0.123552, 2.956523,2.451588,0.108108,
+ 2.896829,2.449338,0.082368, 2.896205,2.456246,0.088896, 2.960179,2.458666,0.116676,
+ 2.960179,2.458666,0.116676, 2.956523,2.451588,0.108108, 2.896829,2.449338,0.082368,
+ 2.856323,2.447812,0.046332, 2.852794,2.454605,0.050004, 2.896205,2.456246,0.088896,
+ 2.896205,2.456246,0.088896, 2.896829,2.449338,0.082368, 2.856323,2.447812,0.046332,
+ 2.8414,2.44725,0, 2.8368,2.454,0, 2.852794,2.454605,0.050004,
+ 2.852794,2.454605,0.050004, 2.856323,2.447812,0.046332, 2.8414,2.44725,0,
+ 3.314269,2.451746,0.043308, 3.359452,2.466769,0.046332, 3.374375,2.467331,0,
+ 3.374375,2.467331,0, 3.328,2.4522,0, 3.314269,2.451746,0.043308,
+ 3.276998,2.450515,0.076992, 3.318946,2.465243,0.082368, 3.359452,2.466769,0.046332,
+ 3.359452,2.466769,0.046332, 3.314269,2.451746,0.043308, 3.276998,2.450515,0.076992,
+ 3.222074,2.448701,0.101052, 3.259252,2.462994,0.108108, 3.318946,2.465243,0.082368,
+ 3.318946,2.465243,0.082368, 3.276998,2.450515,0.076992, 3.222074,2.448701,0.101052,
+ 3.155379,2.446498,0.115488, 3.186768,2.460263,0.123552, 3.259252,2.462994,0.108108,
+ 3.259252,2.462994,0.108108, 3.222074,2.448701,0.101052, 3.155379,2.446498,0.115488,
+ 3.0828,2.4441,0.1203, 3.107887,2.457291,0.1287, 3.186768,2.460263,0.123552,
+ 3.186768,2.460263,0.123552, 3.155379,2.446498,0.115488, 3.0828,2.4441,0.1203,
+ 3.010221,2.441702,0.115488, 3.029007,2.454319,0.123552, 3.107887,2.457291,0.1287,
+ 3.107887,2.457291,0.1287, 3.0828,2.4441,0.1203, 3.010221,2.441702,0.115488,
+ 2.943526,2.439499,0.101052, 2.956523,2.451588,0.108108, 3.029007,2.454319,0.123552,
+ 3.029007,2.454319,0.123552, 3.010221,2.441702,0.115488, 2.943526,2.439499,0.101052,
+ 2.888602,2.437685,0.076992, 2.896829,2.449338,0.082368, 2.956523,2.451588,0.108108,
+ 2.956523,2.451588,0.108108, 2.943526,2.439499,0.101052, 2.888602,2.437685,0.076992,
+ 2.851331,2.436454,0.043308, 2.856323,2.447812,0.046332, 2.896829,2.449338,0.082368,
+ 2.896829,2.449338,0.082368, 2.888602,2.437685,0.076992, 2.851331,2.436454,0.043308,
+ 2.8376,2.436,0, 2.8414,2.44725,0, 2.856323,2.447812,0.046332,
+ 2.856323,2.447812,0.046332, 2.851331,2.436454,0.043308, 2.8376,2.436,0,
+ 3.257153,2.429599,0.041256, 3.314269,2.451746,0.043308, 3.328,2.4522,0,
+ 3.328,2.4522,0, 3.269625,2.429869,0, 3.257153,2.429599,0.041256,
+ 3.223301,2.428868,0.073344, 3.276998,2.450515,0.076992, 3.314269,2.451746,0.043308,
+ 3.314269,2.451746,0.043308, 3.257153,2.429599,0.041256, 3.223301,2.428868,0.073344,
+ 3.173413,2.427791,0.096264, 3.222074,2.448701,0.101052, 3.276998,2.450515,0.076992,
+ 3.276998,2.450515,0.076992, 3.223301,2.428868,0.073344, 3.173413,2.427791,0.096264,
+ 3.112835,2.426483,0.110016, 3.155379,2.446498,0.115488, 3.222074,2.448701,0.101052,
+ 3.222074,2.448701,0.101052, 3.173413,2.427791,0.096264, 3.112835,2.426483,0.110016,
+ 3.046912,2.425059,0.1146, 3.0828,2.4441,0.1203, 3.155379,2.446498,0.115488,
+ 3.155379,2.446498,0.115488, 3.112835,2.426483,0.110016, 3.046912,2.425059,0.1146,
+ 2.98099,2.423636,0.110016, 3.010221,2.441702,0.115488, 3.0828,2.4441,0.1203,
+ 3.0828,2.4441,0.1203, 3.046912,2.425059,0.1146, 2.98099,2.423636,0.110016,
+ 2.920412,2.422328,0.096264, 2.943526,2.439499,0.101052, 3.010221,2.441702,0.115488,
+ 3.010221,2.441702,0.115488, 2.98099,2.423636,0.110016, 2.920412,2.422328,0.096264,
+ 2.870524,2.42125,0.073344, 2.888602,2.437685,0.076992, 2.943526,2.439499,0.101052,
+ 2.943526,2.439499,0.101052, 2.920412,2.422328,0.096264, 2.870524,2.42125,0.073344,
+ 2.836672,2.420519,0.041256, 2.851331,2.436454,0.043308, 2.888602,2.437685,0.076992,
+ 2.888602,2.437685,0.076992, 2.870524,2.42125,0.073344, 2.836672,2.420519,0.041256,
+ 2.8242,2.42025,0, 2.8376,2.436,0, 2.851331,2.436454,0.043308,
+ 2.851331,2.436454,0.043308, 2.836672,2.420519,0.041256, 2.8242,2.42025,0,
+ 3.1888,2.4,0.0405, 3.257153,2.429599,0.041256, 3.269625,2.429869,0,
+ 3.269625,2.429869,0, 3.2,2.4,0, 3.1888,2.4,0.0405,
+ 3.1584,2.4,0.072, 3.223301,2.428868,0.073344, 3.257153,2.429599,0.041256,
+ 3.257153,2.429599,0.041256, 3.1888,2.4,0.0405, 3.1584,2.4,0.072,
+ 3.1136,2.4,0.0945, 3.173413,2.427791,0.096264, 3.223301,2.428868,0.073344,
+ 3.223301,2.428868,0.073344, 3.1584,2.4,0.072, 3.1136,2.4,0.0945,
+ 3.0592,2.4,0.108, 3.112835,2.426483,0.110016, 3.173413,2.427791,0.096264,
+ 3.173413,2.427791,0.096264, 3.1136,2.4,0.0945, 3.0592,2.4,0.108,
+ 3,2.4,0.1125, 3.046912,2.425059,0.1146, 3.112835,2.426483,0.110016,
+ 3.112835,2.426483,0.110016, 3.0592,2.4,0.108, 3,2.4,0.1125,
+ 2.9408,2.4,0.108, 2.98099,2.423636,0.110016, 3.046912,2.425059,0.1146,
+ 3.046912,2.425059,0.1146, 3,2.4,0.1125, 2.9408,2.4,0.108,
+ 2.8864,2.4,0.0945, 2.920412,2.422328,0.096264, 2.98099,2.423636,0.110016,
+ 2.98099,2.423636,0.110016, 2.9408,2.4,0.108, 2.8864,2.4,0.0945,
+ 2.8416,2.4,0.072, 2.870524,2.42125,0.073344, 2.920412,2.422328,0.096264,
+ 2.920412,2.422328,0.096264, 2.8864,2.4,0.0945, 2.8416,2.4,0.072,
+ 2.8112,2.4,0.0405, 2.836672,2.420519,0.041256, 2.870524,2.42125,0.073344,
+ 2.870524,2.42125,0.073344, 2.8416,2.4,0.072, 2.8112,2.4,0.0405,
+ 2.8,2.4,0, 2.8242,2.42025,0, 2.836672,2.420519,0.041256,
+ 2.836672,2.420519,0.041256, 2.8112,2.4,0.0405, 2.8,2.4,0,
+ 0,3.15,0, 0.1946,3.14145,0, 0.192107,3.14145,-0.032048,
+ 0,3.15,0, 0.192107,3.14145,-0.032048, 0.18487,3.14145,-0.062272,
+ 0,3.15,0, 0.18487,3.14145,-0.062272, 0.173255,3.14145,-0.090306,
+ 0,3.15,0, 0.173255,3.14145,-0.090306, 0.157626,3.14145,-0.115787,
+ 0,3.15,0, 0.157626,3.14145,-0.115787, 0.138348,3.14145,-0.138348,
+ 0,3.15,0, 0.138348,3.14145,-0.138348, 0.115787,3.14145,-0.157626,
+ 0,3.15,0, 0.115787,3.14145,-0.157626, 0.090306,3.14145,-0.173255,
+ 0,3.15,0, 0.090306,3.14145,-0.173255, 0.062272,3.14145,-0.18487,
+ 0,3.15,0, 0.062272,3.14145,-0.18487, 0.032048,3.14145,-0.192107,
+ 0,3.15,0, 0.032048,3.14145,-0.192107, 0,3.14145,-0.1946,
+ 0.304843,3.1176,-0.050855, 0.192107,3.14145,-0.032048, 0.1946,3.14145,0,
+ 0.1946,3.14145,0, 0.3088,3.1176,0, 0.304843,3.1176,-0.050855,
+ 0.29336,3.1176,-0.098814, 0.18487,3.14145,-0.062272, 0.192107,3.14145,-0.032048,
+ 0.192107,3.14145,-0.032048, 0.304843,3.1176,-0.050855, 0.29336,3.1176,-0.098814,
+ 0.274928,3.1176,-0.143301, 0.173255,3.14145,-0.090306, 0.18487,3.14145,-0.062272,
+ 0.18487,3.14145,-0.062272, 0.29336,3.1176,-0.098814, 0.274928,3.1176,-0.143301,
+ 0.250127,3.1176,-0.183734, 0.157626,3.14145,-0.115787, 0.173255,3.14145,-0.090306,
+ 0.173255,3.14145,-0.090306, 0.274928,3.1176,-0.143301, 0.250127,3.1176,-0.183734,
+ 0.219536,3.1176,-0.219536, 0.138348,3.14145,-0.138348, 0.157626,3.14145,-0.115787,
+ 0.157626,3.14145,-0.115787, 0.250127,3.1176,-0.183734, 0.219536,3.1176,-0.219536,
+ 0.183734,3.1176,-0.250127, 0.115787,3.14145,-0.157626, 0.138348,3.14145,-0.138348,
+ 0.138348,3.14145,-0.138348, 0.219536,3.1176,-0.219536, 0.183734,3.1176,-0.250127,
+ 0.143301,3.1176,-0.274928, 0.090306,3.14145,-0.173255, 0.115787,3.14145,-0.157626,
+ 0.115787,3.14145,-0.157626, 0.183734,3.1176,-0.250127, 0.143301,3.1176,-0.274928,
+ 0.098814,3.1176,-0.29336, 0.062272,3.14145,-0.18487, 0.090306,3.14145,-0.173255,
+ 0.090306,3.14145,-0.173255, 0.143301,3.1176,-0.274928, 0.098814,3.1176,-0.29336,
+ 0.050855,3.1176,-0.304843, 0.032048,3.14145,-0.192107, 0.062272,3.14145,-0.18487,
+ 0.062272,3.14145,-0.18487, 0.098814,3.1176,-0.29336, 0.050855,3.1176,-0.304843,
+ 0,3.1176,-0.3088, 0,3.14145,-0.1946, 0.032048,3.14145,-0.192107,
+ 0.032048,3.14145,-0.192107, 0.050855,3.1176,-0.304843, 0,3.1176,-0.3088,
+ 0.35361,3.08115,-0.058988, 0.304843,3.1176,-0.050855, 0.3088,3.1176,0,
+ 0.3088,3.1176,0, 0.3582,3.08115,0, 0.35361,3.08115,-0.058988,
+ 0.340289,3.08115,-0.114619, 0.29336,3.1176,-0.098814, 0.304843,3.1176,-0.050855,
+ 0.304843,3.1176,-0.050855, 0.35361,3.08115,-0.058988, 0.340289,3.08115,-0.114619,
+ 0.318907,3.08115,-0.166221, 0.274928,3.1176,-0.143301, 0.29336,3.1176,-0.098814,
+ 0.29336,3.1176,-0.098814, 0.340289,3.08115,-0.114619, 0.318907,3.08115,-0.166221,
+ 0.290138,3.08115,-0.213123, 0.250127,3.1176,-0.183734, 0.274928,3.1176,-0.143301,
+ 0.274928,3.1176,-0.143301, 0.318907,3.08115,-0.166221, 0.290138,3.08115,-0.213123,
+ 0.254653,3.08115,-0.254653, 0.219536,3.1176,-0.219536, 0.250127,3.1176,-0.183734,
+ 0.250127,3.1176,-0.183734, 0.290138,3.08115,-0.213123, 0.254653,3.08115,-0.254653,
+ 0.213123,3.08115,-0.290138, 0.183734,3.1176,-0.250127, 0.219536,3.1176,-0.219536,
+ 0.219536,3.1176,-0.219536, 0.254653,3.08115,-0.254653, 0.213123,3.08115,-0.290138,
+ 0.166221,3.08115,-0.318907, 0.143301,3.1176,-0.274928, 0.183734,3.1176,-0.250127,
+ 0.183734,3.1176,-0.250127, 0.213123,3.08115,-0.290138, 0.166221,3.08115,-0.318907,
+ 0.114619,3.08115,-0.340289, 0.098814,3.1176,-0.29336, 0.143301,3.1176,-0.274928,
+ 0.143301,3.1176,-0.274928, 0.166221,3.08115,-0.318907, 0.114619,3.08115,-0.340289,
+ 0.058988,3.08115,-0.35361, 0.050855,3.1176,-0.304843, 0.098814,3.1176,-0.29336,
+ 0.098814,3.1176,-0.29336, 0.114619,3.08115,-0.340289, 0.058988,3.08115,-0.35361,
+ 0,3.08115,-0.3582, 0,3.1176,-0.3088, 0.050855,3.1176,-0.304843,
+ 0.050855,3.1176,-0.304843, 0.058988,3.08115,-0.35361, 0,3.08115,-0.3582,
+ 0.353807,3.0348,-0.059016, 0.35361,3.08115,-0.058988, 0.3582,3.08115,0,
+ 0.3582,3.08115,0, 0.3584,3.0348,0, 0.353807,3.0348,-0.059016,
+ 0.340477,3.0348,-0.114676, 0.340289,3.08115,-0.114619, 0.35361,3.08115,-0.058988,
+ 0.35361,3.08115,-0.058988, 0.353807,3.0348,-0.059016, 0.340477,3.0348,-0.114676,
+ 0.319082,3.0348,-0.166306, 0.318907,3.08115,-0.166221, 0.340289,3.08115,-0.114619,
+ 0.340289,3.08115,-0.114619, 0.340477,3.0348,-0.114676, 0.319082,3.0348,-0.166306,
+ 0.290295,3.0348,-0.213234, 0.290138,3.08115,-0.213123, 0.318907,3.08115,-0.166221,
+ 0.318907,3.08115,-0.166221, 0.319082,3.0348,-0.166306, 0.290295,3.0348,-0.213234,
+ 0.254788,3.0348,-0.254788, 0.254653,3.08115,-0.254653, 0.290138,3.08115,-0.213123,
+ 0.290138,3.08115,-0.213123, 0.290295,3.0348,-0.213234, 0.254788,3.0348,-0.254788,
+ 0.213234,3.0348,-0.290295, 0.213123,3.08115,-0.290138, 0.254653,3.08115,-0.254653,
+ 0.254653,3.08115,-0.254653, 0.254788,3.0348,-0.254788, 0.213234,3.0348,-0.290295,
+ 0.166306,3.0348,-0.319082, 0.166221,3.08115,-0.318907, 0.213123,3.08115,-0.290138,
+ 0.213123,3.08115,-0.290138, 0.213234,3.0348,-0.290295, 0.166306,3.0348,-0.319082,
+ 0.114676,3.0348,-0.340477, 0.114619,3.08115,-0.340289, 0.166221,3.08115,-0.318907,
+ 0.166221,3.08115,-0.318907, 0.166306,3.0348,-0.319082, 0.114676,3.0348,-0.340477,
+ 0.059016,3.0348,-0.353807, 0.058988,3.08115,-0.35361, 0.114619,3.08115,-0.340289,
+ 0.114619,3.08115,-0.340289, 0.114676,3.0348,-0.340477, 0.059016,3.0348,-0.353807,
+ 0,3.0348,-0.3584, 0,3.08115,-0.3582, 0.058988,3.08115,-0.35361,
+ 0.058988,3.08115,-0.35361, 0.059016,3.0348,-0.353807, 0,3.0348,-0.3584,
+ 0.320834,2.98125,-0.053508, 0.353807,3.0348,-0.059016, 0.3584,3.0348,0,
+ 0.3584,3.0348,0, 0.325,2.98125,0, 0.320834,2.98125,-0.053508,
+ 0.308744,2.98125,-0.103976, 0.340477,3.0348,-0.114676, 0.353807,3.0348,-0.059016,
+ 0.353807,3.0348,-0.059016, 0.320834,2.98125,-0.053508, 0.308744,2.98125,-0.103976,
+ 0.28934,2.98125,-0.150793, 0.319082,3.0348,-0.166306, 0.340477,3.0348,-0.114676,
+ 0.340477,3.0348,-0.114676, 0.308744,2.98125,-0.103976, 0.28934,2.98125,-0.150793,
+ 0.263232,2.98125,-0.193348, 0.290295,3.0348,-0.213234, 0.319082,3.0348,-0.166306,
+ 0.319082,3.0348,-0.166306, 0.28934,2.98125,-0.150793, 0.263232,2.98125,-0.193348,
+ 0.231031,2.98125,-0.231031, 0.254788,3.0348,-0.254788, 0.290295,3.0348,-0.213234,
+ 0.290295,3.0348,-0.213234, 0.263232,2.98125,-0.193348, 0.231031,2.98125,-0.231031,
+ 0.193348,2.98125,-0.263232, 0.213234,3.0348,-0.290295, 0.254788,3.0348,-0.254788,
+ 0.254788,3.0348,-0.254788, 0.231031,2.98125,-0.231031, 0.193348,2.98125,-0.263232,
+ 0.150793,2.98125,-0.28934, 0.166306,3.0348,-0.319082, 0.213234,3.0348,-0.290295,
+ 0.213234,3.0348,-0.290295, 0.193348,2.98125,-0.263232, 0.150793,2.98125,-0.28934,
+ 0.103976,2.98125,-0.308744, 0.114676,3.0348,-0.340477, 0.166306,3.0348,-0.319082,
+ 0.166306,3.0348,-0.319082, 0.150793,2.98125,-0.28934, 0.103976,2.98125,-0.308744,
+ 0.053508,2.98125,-0.320834, 0.059016,3.0348,-0.353807, 0.114676,3.0348,-0.340477,
+ 0.114676,3.0348,-0.340477, 0.103976,2.98125,-0.308744, 0.053508,2.98125,-0.320834,
+ 0,2.98125,-0.325, 0,3.0348,-0.3584, 0.059016,3.0348,-0.353807,
+ 0.059016,3.0348,-0.353807, 0.053508,2.98125,-0.320834, 0,2.98125,-0.325,
+ 0.270092,2.9232,-0.045032, 0.320834,2.98125,-0.053508, 0.325,2.98125,0,
+ 0.325,2.98125,0, 0.2736,2.9232,0, 0.270092,2.9232,-0.045032,
+ 0.25991,2.9232,-0.087511, 0.308744,2.98125,-0.103976, 0.320834,2.98125,-0.053508,
+ 0.320834,2.98125,-0.053508, 0.270092,2.9232,-0.045032, 0.25991,2.9232,-0.087511,
+ 0.243569,2.9232,-0.12692, 0.28934,2.98125,-0.150793, 0.308744,2.98125,-0.103976,
+ 0.308744,2.98125,-0.103976, 0.25991,2.9232,-0.087511, 0.243569,2.9232,-0.12692,
+ 0.221585,2.9232,-0.162745, 0.263232,2.98125,-0.193348, 0.28934,2.98125,-0.150793,
+ 0.28934,2.98125,-0.150793, 0.243569,2.9232,-0.12692, 0.221585,2.9232,-0.162745,
+ 0.194472,2.9232,-0.194472, 0.231031,2.98125,-0.231031, 0.263232,2.98125,-0.193348,
+ 0.263232,2.98125,-0.193348, 0.221585,2.9232,-0.162745, 0.194472,2.9232,-0.194472,
+ 0.162745,2.9232,-0.221585, 0.193348,2.98125,-0.263232, 0.231031,2.98125,-0.231031,
+ 0.231031,2.98125,-0.231031, 0.194472,2.9232,-0.194472, 0.162745,2.9232,-0.221585,
+ 0.12692,2.9232,-0.243569, 0.150793,2.98125,-0.28934, 0.193348,2.98125,-0.263232,
+ 0.193348,2.98125,-0.263232, 0.162745,2.9232,-0.221585, 0.12692,2.9232,-0.243569,
+ 0.087511,2.9232,-0.25991, 0.103976,2.98125,-0.308744, 0.150793,2.98125,-0.28934,
+ 0.150793,2.98125,-0.28934, 0.12692,2.9232,-0.243569, 0.087511,2.9232,-0.25991,
+ 0.045032,2.9232,-0.270092, 0.053508,2.98125,-0.320834, 0.103976,2.98125,-0.308744,
+ 0.103976,2.98125,-0.308744, 0.087511,2.9232,-0.25991, 0.045032,2.9232,-0.270092,
+ 0,2.9232,-0.2736, 0,2.98125,-0.325, 0.053508,2.98125,-0.320834,
+ 0.053508,2.98125,-0.320834, 0.045032,2.9232,-0.270092, 0,2.9232,-0.2736,
+ 0.216979,2.86335,-0.036157, 0.270092,2.9232,-0.045032, 0.2736,2.9232,0,
+ 0.2736,2.9232,0, 0.2198,2.86335,0, 0.216979,2.86335,-0.036157,
+ 0.208794,2.86335,-0.07027, 0.25991,2.9232,-0.087511, 0.270092,2.9232,-0.045032,
+ 0.270092,2.9232,-0.045032, 0.216979,2.86335,-0.036157, 0.208794,2.86335,-0.07027,
+ 0.195658,2.86335,-0.101925, 0.243569,2.9232,-0.12692, 0.25991,2.9232,-0.087511,
+ 0.25991,2.9232,-0.087511, 0.208794,2.86335,-0.07027, 0.195658,2.86335,-0.101925,
+ 0.177989,2.86335,-0.130707, 0.221585,2.9232,-0.162745, 0.243569,2.9232,-0.12692,
+ 0.243569,2.9232,-0.12692, 0.195658,2.86335,-0.101925, 0.177989,2.86335,-0.130707,
+ 0.1562,2.86335,-0.1562, 0.194472,2.9232,-0.194472, 0.221585,2.9232,-0.162745,
+ 0.221585,2.9232,-0.162745, 0.177989,2.86335,-0.130707, 0.1562,2.86335,-0.1562,
+ 0.130707,2.86335,-0.177989, 0.162745,2.9232,-0.221585, 0.194472,2.9232,-0.194472,
+ 0.194472,2.9232,-0.194472, 0.1562,2.86335,-0.1562, 0.130707,2.86335,-0.177989,
+ 0.101925,2.86335,-0.195658, 0.12692,2.9232,-0.243569, 0.162745,2.9232,-0.221585,
+ 0.162745,2.9232,-0.221585, 0.130707,2.86335,-0.177989, 0.101925,2.86335,-0.195658,
+ 0.07027,2.86335,-0.208794, 0.087511,2.9232,-0.25991, 0.12692,2.9232,-0.243569,
+ 0.12692,2.9232,-0.243569, 0.101925,2.86335,-0.195658, 0.07027,2.86335,-0.208794,
+ 0.036157,2.86335,-0.216979, 0.045032,2.9232,-0.270092, 0.087511,2.9232,-0.25991,
+ 0.087511,2.9232,-0.25991, 0.07027,2.86335,-0.208794, 0.036157,2.86335,-0.216979,
+ 0,2.86335,-0.2198, 0,2.9232,-0.2736, 0.045032,2.9232,-0.270092,
+ 0.045032,2.9232,-0.270092, 0.036157,2.86335,-0.216979, 0,2.86335,-0.2198,
+ 0.176897,2.8044,-0.02945, 0.216979,2.86335,-0.036157, 0.2198,2.86335,0,
+ 0.2198,2.86335,0, 0.1792,2.8044,0, 0.176897,2.8044,-0.02945,
+ 0.170215,2.8044,-0.057246, 0.208794,2.86335,-0.07027, 0.216979,2.86335,-0.036157,
+ 0.216979,2.86335,-0.036157, 0.176897,2.8044,-0.02945, 0.170215,2.8044,-0.057246,
+ 0.159496,2.8044,-0.083047, 0.195658,2.86335,-0.101925, 0.208794,2.86335,-0.07027,
+ 0.208794,2.86335,-0.07027, 0.170215,2.8044,-0.057246, 0.159496,2.8044,-0.083047,
+ 0.145078,2.8044,-0.106513, 0.177989,2.86335,-0.130707, 0.195658,2.86335,-0.101925,
+ 0.195658,2.86335,-0.101925, 0.159496,2.8044,-0.083047, 0.145078,2.8044,-0.106513,
+ 0.127304,2.8044,-0.127304, 0.1562,2.86335,-0.1562, 0.177989,2.86335,-0.130707,
+ 0.177989,2.86335,-0.130707, 0.145078,2.8044,-0.106513, 0.127304,2.8044,-0.127304,
+ 0.106513,2.8044,-0.145078, 0.130707,2.86335,-0.177989, 0.1562,2.86335,-0.1562,
+ 0.1562,2.86335,-0.1562, 0.127304,2.8044,-0.127304, 0.106513,2.8044,-0.145078,
+ 0.083047,2.8044,-0.159496, 0.101925,2.86335,-0.195658, 0.130707,2.86335,-0.177989,
+ 0.130707,2.86335,-0.177989, 0.106513,2.8044,-0.145078, 0.083047,2.8044,-0.159496,
+ 0.057246,2.8044,-0.170215, 0.07027,2.86335,-0.208794, 0.101925,2.86335,-0.195658,
+ 0.101925,2.86335,-0.195658, 0.083047,2.8044,-0.159496, 0.057246,2.8044,-0.170215,
+ 0.02945,2.8044,-0.176897, 0.036157,2.86335,-0.216979, 0.07027,2.86335,-0.208794,
+ 0.07027,2.86335,-0.208794, 0.057246,2.8044,-0.170215, 0.02945,2.8044,-0.176897,
+ 0,2.8044,-0.1792, 0,2.86335,-0.2198, 0.036157,2.86335,-0.216979,
+ 0.036157,2.86335,-0.216979, 0.02945,2.8044,-0.176897, 0,2.8044,-0.1792,
+ 0.165245,2.74905,-0.02748, 0.176897,2.8044,-0.02945, 0.1792,2.8044,0,
+ 0.1792,2.8044,0, 0.1674,2.74905,0, 0.165245,2.74905,-0.02748,
+ 0.158995,2.74905,-0.053428, 0.170215,2.8044,-0.057246, 0.176897,2.8044,-0.02945,
+ 0.176897,2.8044,-0.02945, 0.165245,2.74905,-0.02748, 0.158995,2.74905,-0.053428,
+ 0.148969,2.74905,-0.077523, 0.159496,2.8044,-0.083047, 0.170215,2.8044,-0.057246,
+ 0.170215,2.8044,-0.057246, 0.158995,2.74905,-0.053428, 0.148969,2.74905,-0.077523,
+ 0.135489,2.74905,-0.099446, 0.145078,2.8044,-0.106513, 0.159496,2.8044,-0.083047,
+ 0.159496,2.8044,-0.083047, 0.148969,2.74905,-0.077523, 0.135489,2.74905,-0.099446,
+ 0.118874,2.74905,-0.118874, 0.127304,2.8044,-0.127304, 0.145078,2.8044,-0.106513,
+ 0.145078,2.8044,-0.106513, 0.135489,2.74905,-0.099446, 0.118874,2.74905,-0.118874,
+ 0.099446,2.74905,-0.135489, 0.106513,2.8044,-0.145078, 0.127304,2.8044,-0.127304,
+ 0.127304,2.8044,-0.127304, 0.118874,2.74905,-0.118874, 0.099446,2.74905,-0.135489,
+ 0.077523,2.74905,-0.148969, 0.083047,2.8044,-0.159496, 0.106513,2.8044,-0.145078,
+ 0.106513,2.8044,-0.145078, 0.099446,2.74905,-0.135489, 0.077523,2.74905,-0.148969,
+ 0.053428,2.74905,-0.158995, 0.057246,2.8044,-0.170215, 0.083047,2.8044,-0.159496,
+ 0.083047,2.8044,-0.159496, 0.077523,2.74905,-0.148969, 0.053428,2.74905,-0.158995,
+ 0.02748,2.74905,-0.165245, 0.02945,2.8044,-0.176897, 0.057246,2.8044,-0.170215,
+ 0.057246,2.8044,-0.170215, 0.053428,2.74905,-0.158995, 0.02748,2.74905,-0.165245,
+ 0,2.74905,-0.1674, 0,2.8044,-0.1792, 0.02945,2.8044,-0.176897,
+ 0.02945,2.8044,-0.176897, 0.02748,2.74905,-0.165245, 0,2.74905,-0.1674,
+ 0.197424,2.7,-0.032816, 0.165245,2.74905,-0.02748, 0.1674,2.74905,0,
+ 0.1674,2.74905,0, 0.2,2.7,0, 0.197424,2.7,-0.032816,
+ 0.189952,2.7,-0.063808, 0.158995,2.74905,-0.053428, 0.165245,2.74905,-0.02748,
+ 0.165245,2.74905,-0.02748, 0.197424,2.7,-0.032816, 0.189952,2.7,-0.063808,
+ 0.177968,2.7,-0.092592, 0.148969,2.74905,-0.077523, 0.158995,2.74905,-0.053428,
+ 0.158995,2.74905,-0.053428, 0.189952,2.7,-0.063808, 0.177968,2.7,-0.092592,
+ 0.161856,2.7,-0.118784, 0.135489,2.74905,-0.099446, 0.148969,2.74905,-0.077523,
+ 0.148969,2.74905,-0.077523, 0.177968,2.7,-0.092592, 0.161856,2.7,-0.118784,
+ 0.142,2.7,-0.142, 0.118874,2.74905,-0.118874, 0.135489,2.74905,-0.099446,
+ 0.135489,2.74905,-0.099446, 0.161856,2.7,-0.118784, 0.142,2.7,-0.142,
+ 0.118784,2.7,-0.161856, 0.099446,2.74905,-0.135489, 0.118874,2.74905,-0.118874,
+ 0.118874,2.74905,-0.118874, 0.142,2.7,-0.142, 0.118784,2.7,-0.161856,
+ 0.092592,2.7,-0.177968, 0.077523,2.74905,-0.148969, 0.099446,2.74905,-0.135489,
+ 0.099446,2.74905,-0.135489, 0.118784,2.7,-0.161856, 0.092592,2.7,-0.177968,
+ 0.063808,2.7,-0.189952, 0.053428,2.74905,-0.158995, 0.077523,2.74905,-0.148969,
+ 0.077523,2.74905,-0.148969, 0.092592,2.7,-0.177968, 0.063808,2.7,-0.189952,
+ 0.032816,2.7,-0.197424, 0.02748,2.74905,-0.165245, 0.053428,2.74905,-0.158995,
+ 0.053428,2.74905,-0.158995, 0.063808,2.7,-0.189952, 0.032816,2.7,-0.197424,
+ 0,2.7,-0.2, 0,2.74905,-0.1674, 0.02748,2.74905,-0.165245,
+ 0.02748,2.74905,-0.165245, 0.032816,2.7,-0.197424, 0,2.7,-0.2,
+ 0,3.15,0, 0,3.14145,-0.1946, -0.032048,3.14145,-0.192107,
+ 0,3.15,0, -0.032048,3.14145,-0.192107, -0.062272,3.14145,-0.18487,
+ 0,3.15,0, -0.062272,3.14145,-0.18487, -0.090306,3.14145,-0.173255,
+ 0,3.15,0, -0.090306,3.14145,-0.173255, -0.115787,3.14145,-0.157626,
+ 0,3.15,0, -0.115787,3.14145,-0.157626, -0.138348,3.14145,-0.138348,
+ 0,3.15,0, -0.138348,3.14145,-0.138348, -0.157626,3.14145,-0.115787,
+ 0,3.15,0, -0.157626,3.14145,-0.115787, -0.173255,3.14145,-0.090306,
+ 0,3.15,0, -0.173255,3.14145,-0.090306, -0.18487,3.14145,-0.062272,
+ 0,3.15,0, -0.18487,3.14145,-0.062272, -0.192107,3.14145,-0.032048,
+ 0,3.15,0, -0.192107,3.14145,-0.032048, -0.1946,3.14145,0,
+ -0.050855,3.1176,-0.304843, -0.032048,3.14145,-0.192107, 0,3.14145,-0.1946,
+ 0,3.14145,-0.1946, 0,3.1176,-0.3088, -0.050855,3.1176,-0.304843,
+ -0.098814,3.1176,-0.29336, -0.062272,3.14145,-0.18487, -0.032048,3.14145,-0.192107,
+ -0.032048,3.14145,-0.192107, -0.050855,3.1176,-0.304843, -0.098814,3.1176,-0.29336,
+ -0.143301,3.1176,-0.274928, -0.090306,3.14145,-0.173255, -0.062272,3.14145,-0.18487,
+ -0.062272,3.14145,-0.18487, -0.098814,3.1176,-0.29336, -0.143301,3.1176,-0.274928,
+ -0.183734,3.1176,-0.250127, -0.115787,3.14145,-0.157626, -0.090306,3.14145,-0.173255,
+ -0.090306,3.14145,-0.173255, -0.143301,3.1176,-0.274928, -0.183734,3.1176,-0.250127,
+ -0.219536,3.1176,-0.219536, -0.138348,3.14145,-0.138348, -0.115787,3.14145,-0.157626,
+ -0.115787,3.14145,-0.157626, -0.183734,3.1176,-0.250127, -0.219536,3.1176,-0.219536,
+ -0.250127,3.1176,-0.183734, -0.157626,3.14145,-0.115787, -0.138348,3.14145,-0.138348,
+ -0.138348,3.14145,-0.138348, -0.219536,3.1176,-0.219536, -0.250127,3.1176,-0.183734,
+ -0.274928,3.1176,-0.143301, -0.173255,3.14145,-0.090306, -0.157626,3.14145,-0.115787,
+ -0.157626,3.14145,-0.115787, -0.250127,3.1176,-0.183734, -0.274928,3.1176,-0.143301,
+ -0.29336,3.1176,-0.098814, -0.18487,3.14145,-0.062272, -0.173255,3.14145,-0.090306,
+ -0.173255,3.14145,-0.090306, -0.274928,3.1176,-0.143301, -0.29336,3.1176,-0.098814,
+ -0.304843,3.1176,-0.050855, -0.192107,3.14145,-0.032048, -0.18487,3.14145,-0.062272,
+ -0.18487,3.14145,-0.062272, -0.29336,3.1176,-0.098814, -0.304843,3.1176,-0.050855,
+ -0.3088,3.1176,0, -0.1946,3.14145,0, -0.192107,3.14145,-0.032048,
+ -0.192107,3.14145,-0.032048, -0.304843,3.1176,-0.050855, -0.3088,3.1176,0,
+ -0.058988,3.08115,-0.35361, -0.050855,3.1176,-0.304843, 0,3.1176,-0.3088,
+ 0,3.1176,-0.3088, 0,3.08115,-0.3582, -0.058988,3.08115,-0.35361,
+ -0.114619,3.08115,-0.340289, -0.098814,3.1176,-0.29336, -0.050855,3.1176,-0.304843,
+ -0.050855,3.1176,-0.304843, -0.058988,3.08115,-0.35361, -0.114619,3.08115,-0.340289,
+ -0.166221,3.08115,-0.318907, -0.143301,3.1176,-0.274928, -0.098814,3.1176,-0.29336,
+ -0.098814,3.1176,-0.29336, -0.114619,3.08115,-0.340289, -0.166221,3.08115,-0.318907,
+ -0.213123,3.08115,-0.290138, -0.183734,3.1176,-0.250127, -0.143301,3.1176,-0.274928,
+ -0.143301,3.1176,-0.274928, -0.166221,3.08115,-0.318907, -0.213123,3.08115,-0.290138,
+ -0.254653,3.08115,-0.254653, -0.219536,3.1176,-0.219536, -0.183734,3.1176,-0.250127,
+ -0.183734,3.1176,-0.250127, -0.213123,3.08115,-0.290138, -0.254653,3.08115,-0.254653,
+ -0.290138,3.08115,-0.213123, -0.250127,3.1176,-0.183734, -0.219536,3.1176,-0.219536,
+ -0.219536,3.1176,-0.219536, -0.254653,3.08115,-0.254653, -0.290138,3.08115,-0.213123,
+ -0.318907,3.08115,-0.166221, -0.274928,3.1176,-0.143301, -0.250127,3.1176,-0.183734,
+ -0.250127,3.1176,-0.183734, -0.290138,3.08115,-0.213123, -0.318907,3.08115,-0.166221,
+ -0.340289,3.08115,-0.114619, -0.29336,3.1176,-0.098814, -0.274928,3.1176,-0.143301,
+ -0.274928,3.1176,-0.143301, -0.318907,3.08115,-0.166221, -0.340289,3.08115,-0.114619,
+ -0.35361,3.08115,-0.058988, -0.304843,3.1176,-0.050855, -0.29336,3.1176,-0.098814,
+ -0.29336,3.1176,-0.098814, -0.340289,3.08115,-0.114619, -0.35361,3.08115,-0.058988,
+ -0.3582,3.08115,0, -0.3088,3.1176,0, -0.304843,3.1176,-0.050855,
+ -0.304843,3.1176,-0.050855, -0.35361,3.08115,-0.058988, -0.3582,3.08115,0,
+ -0.059016,3.0348,-0.353807, -0.058988,3.08115,-0.35361, 0,3.08115,-0.3582,
+ 0,3.08115,-0.3582, 0,3.0348,-0.3584, -0.059016,3.0348,-0.353807,
+ -0.114676,3.0348,-0.340477, -0.114619,3.08115,-0.340289, -0.058988,3.08115,-0.35361,
+ -0.058988,3.08115,-0.35361, -0.059016,3.0348,-0.353807, -0.114676,3.0348,-0.340477,
+ -0.166306,3.0348,-0.319082, -0.166221,3.08115,-0.318907, -0.114619,3.08115,-0.340289,
+ -0.114619,3.08115,-0.340289, -0.114676,3.0348,-0.340477, -0.166306,3.0348,-0.319082,
+ -0.213234,3.0348,-0.290295, -0.213123,3.08115,-0.290138, -0.166221,3.08115,-0.318907,
+ -0.166221,3.08115,-0.318907, -0.166306,3.0348,-0.319082, -0.213234,3.0348,-0.290295,
+ -0.254788,3.0348,-0.254788, -0.254653,3.08115,-0.254653, -0.213123,3.08115,-0.290138,
+ -0.213123,3.08115,-0.290138, -0.213234,3.0348,-0.290295, -0.254788,3.0348,-0.254788,
+ -0.290295,3.0348,-0.213234, -0.290138,3.08115,-0.213123, -0.254653,3.08115,-0.254653,
+ -0.254653,3.08115,-0.254653, -0.254788,3.0348,-0.254788, -0.290295,3.0348,-0.213234,
+ -0.319082,3.0348,-0.166306, -0.318907,3.08115,-0.166221, -0.290138,3.08115,-0.213123,
+ -0.290138,3.08115,-0.213123, -0.290295,3.0348,-0.213234, -0.319082,3.0348,-0.166306,
+ -0.340477,3.0348,-0.114676, -0.340289,3.08115,-0.114619, -0.318907,3.08115,-0.166221,
+ -0.318907,3.08115,-0.166221, -0.319082,3.0348,-0.166306, -0.340477,3.0348,-0.114676,
+ -0.353807,3.0348,-0.059016, -0.35361,3.08115,-0.058988, -0.340289,3.08115,-0.114619,
+ -0.340289,3.08115,-0.114619, -0.340477,3.0348,-0.114676, -0.353807,3.0348,-0.059016,
+ -0.3584,3.0348,0, -0.3582,3.08115,0, -0.35361,3.08115,-0.058988,
+ -0.35361,3.08115,-0.058988, -0.353807,3.0348,-0.059016, -0.3584,3.0348,0,
+ -0.053508,2.98125,-0.320834, -0.059016,3.0348,-0.353807, 0,3.0348,-0.3584,
+ 0,3.0348,-0.3584, 0,2.98125,-0.325, -0.053508,2.98125,-0.320834,
+ -0.103976,2.98125,-0.308744, -0.114676,3.0348,-0.340477, -0.059016,3.0348,-0.353807,
+ -0.059016,3.0348,-0.353807, -0.053508,2.98125,-0.320834, -0.103976,2.98125,-0.308744,
+ -0.150793,2.98125,-0.28934, -0.166306,3.0348,-0.319082, -0.114676,3.0348,-0.340477,
+ -0.114676,3.0348,-0.340477, -0.103976,2.98125,-0.308744, -0.150793,2.98125,-0.28934,
+ -0.193348,2.98125,-0.263232, -0.213234,3.0348,-0.290295, -0.166306,3.0348,-0.319082,
+ -0.166306,3.0348,-0.319082, -0.150793,2.98125,-0.28934, -0.193348,2.98125,-0.263232,
+ -0.231031,2.98125,-0.231031, -0.254788,3.0348,-0.254788, -0.213234,3.0348,-0.290295,
+ -0.213234,3.0348,-0.290295, -0.193348,2.98125,-0.263232, -0.231031,2.98125,-0.231031,
+ -0.263232,2.98125,-0.193348, -0.290295,3.0348,-0.213234, -0.254788,3.0348,-0.254788,
+ -0.254788,3.0348,-0.254788, -0.231031,2.98125,-0.231031, -0.263232,2.98125,-0.193348,
+ -0.28934,2.98125,-0.150793, -0.319082,3.0348,-0.166306, -0.290295,3.0348,-0.213234,
+ -0.290295,3.0348,-0.213234, -0.263232,2.98125,-0.193348, -0.28934,2.98125,-0.150793,
+ -0.308744,2.98125,-0.103976, -0.340477,3.0348,-0.114676, -0.319082,3.0348,-0.166306,
+ -0.319082,3.0348,-0.166306, -0.28934,2.98125,-0.150793, -0.308744,2.98125,-0.103976,
+ -0.320834,2.98125,-0.053508, -0.353807,3.0348,-0.059016, -0.340477,3.0348,-0.114676,
+ -0.340477,3.0348,-0.114676, -0.308744,2.98125,-0.103976, -0.320834,2.98125,-0.053508,
+ -0.325,2.98125,0, -0.3584,3.0348,0, -0.353807,3.0348,-0.059016,
+ -0.353807,3.0348,-0.059016, -0.320834,2.98125,-0.053508, -0.325,2.98125,0,
+ -0.045032,2.9232,-0.270092, -0.053508,2.98125,-0.320834, 0,2.98125,-0.325,
+ 0,2.98125,-0.325, 0,2.9232,-0.2736, -0.045032,2.9232,-0.270092,
+ -0.087511,2.9232,-0.25991, -0.103976,2.98125,-0.308744, -0.053508,2.98125,-0.320834,
+ -0.053508,2.98125,-0.320834, -0.045032,2.9232,-0.270092, -0.087511,2.9232,-0.25991,
+ -0.12692,2.9232,-0.243569, -0.150793,2.98125,-0.28934, -0.103976,2.98125,-0.308744,
+ -0.103976,2.98125,-0.308744, -0.087511,2.9232,-0.25991, -0.12692,2.9232,-0.243569,
+ -0.162745,2.9232,-0.221585, -0.193348,2.98125,-0.263232, -0.150793,2.98125,-0.28934,
+ -0.150793,2.98125,-0.28934, -0.12692,2.9232,-0.243569, -0.162745,2.9232,-0.221585,
+ -0.194472,2.9232,-0.194472, -0.231031,2.98125,-0.231031, -0.193348,2.98125,-0.263232,
+ -0.193348,2.98125,-0.263232, -0.162745,2.9232,-0.221585, -0.194472,2.9232,-0.194472,
+ -0.221585,2.9232,-0.162745, -0.263232,2.98125,-0.193348, -0.231031,2.98125,-0.231031,
+ -0.231031,2.98125,-0.231031, -0.194472,2.9232,-0.194472, -0.221585,2.9232,-0.162745,
+ -0.243569,2.9232,-0.12692, -0.28934,2.98125,-0.150793, -0.263232,2.98125,-0.193348,
+ -0.263232,2.98125,-0.193348, -0.221585,2.9232,-0.162745, -0.243569,2.9232,-0.12692,
+ -0.25991,2.9232,-0.087511, -0.308744,2.98125,-0.103976, -0.28934,2.98125,-0.150793,
+ -0.28934,2.98125,-0.150793, -0.243569,2.9232,-0.12692, -0.25991,2.9232,-0.087511,
+ -0.270092,2.9232,-0.045032, -0.320834,2.98125,-0.053508, -0.308744,2.98125,-0.103976,
+ -0.308744,2.98125,-0.103976, -0.25991,2.9232,-0.087511, -0.270092,2.9232,-0.045032,
+ -0.2736,2.9232,0, -0.325,2.98125,0, -0.320834,2.98125,-0.053508,
+ -0.320834,2.98125,-0.053508, -0.270092,2.9232,-0.045032, -0.2736,2.9232,0,
+ -0.036157,2.86335,-0.216979, -0.045032,2.9232,-0.270092, 0,2.9232,-0.2736,
+ 0,2.9232,-0.2736, 0,2.86335,-0.2198, -0.036157,2.86335,-0.216979,
+ -0.07027,2.86335,-0.208794, -0.087511,2.9232,-0.25991, -0.045032,2.9232,-0.270092,
+ -0.045032,2.9232,-0.270092, -0.036157,2.86335,-0.216979, -0.07027,2.86335,-0.208794,
+ -0.101925,2.86335,-0.195658, -0.12692,2.9232,-0.243569, -0.087511,2.9232,-0.25991,
+ -0.087511,2.9232,-0.25991, -0.07027,2.86335,-0.208794, -0.101925,2.86335,-0.195658,
+ -0.130707,2.86335,-0.177989, -0.162745,2.9232,-0.221585, -0.12692,2.9232,-0.243569,
+ -0.12692,2.9232,-0.243569, -0.101925,2.86335,-0.195658, -0.130707,2.86335,-0.177989,
+ -0.1562,2.86335,-0.1562, -0.194472,2.9232,-0.194472, -0.162745,2.9232,-0.221585,
+ -0.162745,2.9232,-0.221585, -0.130707,2.86335,-0.177989, -0.1562,2.86335,-0.1562,
+ -0.177989,2.86335,-0.130707, -0.221585,2.9232,-0.162745, -0.194472,2.9232,-0.194472,
+ -0.194472,2.9232,-0.194472, -0.1562,2.86335,-0.1562, -0.177989,2.86335,-0.130707,
+ -0.195658,2.86335,-0.101925, -0.243569,2.9232,-0.12692, -0.221585,2.9232,-0.162745,
+ -0.221585,2.9232,-0.162745, -0.177989,2.86335,-0.130707, -0.195658,2.86335,-0.101925,
+ -0.208794,2.86335,-0.07027, -0.25991,2.9232,-0.087511, -0.243569,2.9232,-0.12692,
+ -0.243569,2.9232,-0.12692, -0.195658,2.86335,-0.101925, -0.208794,2.86335,-0.07027,
+ -0.216979,2.86335,-0.036157, -0.270092,2.9232,-0.045032, -0.25991,2.9232,-0.087511,
+ -0.25991,2.9232,-0.087511, -0.208794,2.86335,-0.07027, -0.216979,2.86335,-0.036157,
+ -0.2198,2.86335,0, -0.2736,2.9232,0, -0.270092,2.9232,-0.045032,
+ -0.270092,2.9232,-0.045032, -0.216979,2.86335,-0.036157, -0.2198,2.86335,0,
+ -0.02945,2.8044,-0.176897, -0.036157,2.86335,-0.216979, 0,2.86335,-0.2198,
+ 0,2.86335,-0.2198, 0,2.8044,-0.1792, -0.02945,2.8044,-0.176897,
+ -0.057246,2.8044,-0.170215, -0.07027,2.86335,-0.208794, -0.036157,2.86335,-0.216979,
+ -0.036157,2.86335,-0.216979, -0.02945,2.8044,-0.176897, -0.057246,2.8044,-0.170215,
+ -0.083047,2.8044,-0.159496, -0.101925,2.86335,-0.195658, -0.07027,2.86335,-0.208794,
+ -0.07027,2.86335,-0.208794, -0.057246,2.8044,-0.170215, -0.083047,2.8044,-0.159496,
+ -0.106513,2.8044,-0.145078, -0.130707,2.86335,-0.177989, -0.101925,2.86335,-0.195658,
+ -0.101925,2.86335,-0.195658, -0.083047,2.8044,-0.159496, -0.106513,2.8044,-0.145078,
+ -0.127304,2.8044,-0.127304, -0.1562,2.86335,-0.1562, -0.130707,2.86335,-0.177989,
+ -0.130707,2.86335,-0.177989, -0.106513,2.8044,-0.145078, -0.127304,2.8044,-0.127304,
+ -0.145078,2.8044,-0.106513, -0.177989,2.86335,-0.130707, -0.1562,2.86335,-0.1562,
+ -0.1562,2.86335,-0.1562, -0.127304,2.8044,-0.127304, -0.145078,2.8044,-0.106513,
+ -0.159496,2.8044,-0.083047, -0.195658,2.86335,-0.101925, -0.177989,2.86335,-0.130707,
+ -0.177989,2.86335,-0.130707, -0.145078,2.8044,-0.106513, -0.159496,2.8044,-0.083047,
+ -0.170215,2.8044,-0.057246, -0.208794,2.86335,-0.07027, -0.195658,2.86335,-0.101925,
+ -0.195658,2.86335,-0.101925, -0.159496,2.8044,-0.083047, -0.170215,2.8044,-0.057246,
+ -0.176897,2.8044,-0.02945, -0.216979,2.86335,-0.036157, -0.208794,2.86335,-0.07027,
+ -0.208794,2.86335,-0.07027, -0.170215,2.8044,-0.057246, -0.176897,2.8044,-0.02945,
+ -0.1792,2.8044,0, -0.2198,2.86335,0, -0.216979,2.86335,-0.036157,
+ -0.216979,2.86335,-0.036157, -0.176897,2.8044,-0.02945, -0.1792,2.8044,0,
+ -0.02748,2.74905,-0.165245, -0.02945,2.8044,-0.176897, 0,2.8044,-0.1792,
+ 0,2.8044,-0.1792, 0,2.74905,-0.1674, -0.02748,2.74905,-0.165245,
+ -0.053428,2.74905,-0.158995, -0.057246,2.8044,-0.170215, -0.02945,2.8044,-0.176897,
+ -0.02945,2.8044,-0.176897, -0.02748,2.74905,-0.165245, -0.053428,2.74905,-0.158995,
+ -0.077523,2.74905,-0.148969, -0.083047,2.8044,-0.159496, -0.057246,2.8044,-0.170215,
+ -0.057246,2.8044,-0.170215, -0.053428,2.74905,-0.158995, -0.077523,2.74905,-0.148969,
+ -0.099446,2.74905,-0.135489, -0.106513,2.8044,-0.145078, -0.083047,2.8044,-0.159496,
+ -0.083047,2.8044,-0.159496, -0.077523,2.74905,-0.148969, -0.099446,2.74905,-0.135489,
+ -0.118874,2.74905,-0.118874, -0.127304,2.8044,-0.127304, -0.106513,2.8044,-0.145078,
+ -0.106513,2.8044,-0.145078, -0.099446,2.74905,-0.135489, -0.118874,2.74905,-0.118874,
+ -0.135489,2.74905,-0.099446, -0.145078,2.8044,-0.106513, -0.127304,2.8044,-0.127304,
+ -0.127304,2.8044,-0.127304, -0.118874,2.74905,-0.118874, -0.135489,2.74905,-0.099446,
+ -0.148969,2.74905,-0.077523, -0.159496,2.8044,-0.083047, -0.145078,2.8044,-0.106513,
+ -0.145078,2.8044,-0.106513, -0.135489,2.74905,-0.099446, -0.148969,2.74905,-0.077523,
+ -0.158995,2.74905,-0.053428, -0.170215,2.8044,-0.057246, -0.159496,2.8044,-0.083047,
+ -0.159496,2.8044,-0.083047, -0.148969,2.74905,-0.077523, -0.158995,2.74905,-0.053428,
+ -0.165245,2.74905,-0.02748, -0.176897,2.8044,-0.02945, -0.170215,2.8044,-0.057246,
+ -0.170215,2.8044,-0.057246, -0.158995,2.74905,-0.053428, -0.165245,2.74905,-0.02748,
+ -0.1674,2.74905,0, -0.1792,2.8044,0, -0.176897,2.8044,-0.02945,
+ -0.176897,2.8044,-0.02945, -0.165245,2.74905,-0.02748, -0.1674,2.74905,0,
+ -0.032816,2.7,-0.197424, -0.02748,2.74905,-0.165245, 0,2.74905,-0.1674,
+ 0,2.74905,-0.1674, 0,2.7,-0.2, -0.032816,2.7,-0.197424,
+ -0.063808,2.7,-0.189952, -0.053428,2.74905,-0.158995, -0.02748,2.74905,-0.165245,
+ -0.02748,2.74905,-0.165245, -0.032816,2.7,-0.197424, -0.063808,2.7,-0.189952,
+ -0.092592,2.7,-0.177968, -0.077523,2.74905,-0.148969, -0.053428,2.74905,-0.158995,
+ -0.053428,2.74905,-0.158995, -0.063808,2.7,-0.189952, -0.092592,2.7,-0.177968,
+ -0.118784,2.7,-0.161856, -0.099446,2.74905,-0.135489, -0.077523,2.74905,-0.148969,
+ -0.077523,2.74905,-0.148969, -0.092592,2.7,-0.177968, -0.118784,2.7,-0.161856,
+ -0.142,2.7,-0.142, -0.118874,2.74905,-0.118874, -0.099446,2.74905,-0.135489,
+ -0.099446,2.74905,-0.135489, -0.118784,2.7,-0.161856, -0.142,2.7,-0.142,
+ -0.161856,2.7,-0.118784, -0.135489,2.74905,-0.099446, -0.118874,2.74905,-0.118874,
+ -0.118874,2.74905,-0.118874, -0.142,2.7,-0.142, -0.161856,2.7,-0.118784,
+ -0.177968,2.7,-0.092592, -0.148969,2.74905,-0.077523, -0.135489,2.74905,-0.099446,
+ -0.135489,2.74905,-0.099446, -0.161856,2.7,-0.118784, -0.177968,2.7,-0.092592,
+ -0.189952,2.7,-0.063808, -0.158995,2.74905,-0.053428, -0.148969,2.74905,-0.077523,
+ -0.148969,2.74905,-0.077523, -0.177968,2.7,-0.092592, -0.189952,2.7,-0.063808,
+ -0.197424,2.7,-0.032816, -0.165245,2.74905,-0.02748, -0.158995,2.74905,-0.053428,
+ -0.158995,2.74905,-0.053428, -0.189952,2.7,-0.063808, -0.197424,2.7,-0.032816,
+ -0.2,2.7,0, -0.1674,2.74905,0, -0.165245,2.74905,-0.02748,
+ -0.165245,2.74905,-0.02748, -0.197424,2.7,-0.032816, -0.2,2.7,0,
+ 0,3.15,0, -0.1946,3.14145,0, -0.192107,3.14145,0.032048,
+ 0,3.15,0, -0.192107,3.14145,0.032048, -0.18487,3.14145,0.062272,
+ 0,3.15,0, -0.18487,3.14145,0.062272, -0.173255,3.14145,0.090306,
+ 0,3.15,0, -0.173255,3.14145,0.090306, -0.157626,3.14145,0.115787,
+ 0,3.15,0, -0.157626,3.14145,0.115787, -0.138348,3.14145,0.138348,
+ 0,3.15,0, -0.138348,3.14145,0.138348, -0.115787,3.14145,0.157626,
+ 0,3.15,0, -0.115787,3.14145,0.157626, -0.090306,3.14145,0.173255,
+ 0,3.15,0, -0.090306,3.14145,0.173255, -0.062272,3.14145,0.18487,
+ 0,3.15,0, -0.062272,3.14145,0.18487, -0.032048,3.14145,0.192107,
+ 0,3.15,0, -0.032048,3.14145,0.192107, 0,3.14145,0.1946,
+ -0.304843,3.1176,0.050855, -0.192107,3.14145,0.032048, -0.1946,3.14145,0,
+ -0.1946,3.14145,0, -0.3088,3.1176,0, -0.304843,3.1176,0.050855,
+ -0.29336,3.1176,0.098814, -0.18487,3.14145,0.062272, -0.192107,3.14145,0.032048,
+ -0.192107,3.14145,0.032048, -0.304843,3.1176,0.050855, -0.29336,3.1176,0.098814,
+ -0.274928,3.1176,0.143301, -0.173255,3.14145,0.090306, -0.18487,3.14145,0.062272,
+ -0.18487,3.14145,0.062272, -0.29336,3.1176,0.098814, -0.274928,3.1176,0.143301,
+ -0.250127,3.1176,0.183734, -0.157626,3.14145,0.115787, -0.173255,3.14145,0.090306,
+ -0.173255,3.14145,0.090306, -0.274928,3.1176,0.143301, -0.250127,3.1176,0.183734,
+ -0.219536,3.1176,0.219536, -0.138348,3.14145,0.138348, -0.157626,3.14145,0.115787,
+ -0.157626,3.14145,0.115787, -0.250127,3.1176,0.183734, -0.219536,3.1176,0.219536,
+ -0.183734,3.1176,0.250127, -0.115787,3.14145,0.157626, -0.138348,3.14145,0.138348,
+ -0.138348,3.14145,0.138348, -0.219536,3.1176,0.219536, -0.183734,3.1176,0.250127,
+ -0.143301,3.1176,0.274928, -0.090306,3.14145,0.173255, -0.115787,3.14145,0.157626,
+ -0.115787,3.14145,0.157626, -0.183734,3.1176,0.250127, -0.143301,3.1176,0.274928,
+ -0.098814,3.1176,0.29336, -0.062272,3.14145,0.18487, -0.090306,3.14145,0.173255,
+ -0.090306,3.14145,0.173255, -0.143301,3.1176,0.274928, -0.098814,3.1176,0.29336,
+ -0.050855,3.1176,0.304843, -0.032048,3.14145,0.192107, -0.062272,3.14145,0.18487,
+ -0.062272,3.14145,0.18487, -0.098814,3.1176,0.29336, -0.050855,3.1176,0.304843,
+ 0,3.1176,0.3088, 0,3.14145,0.1946, -0.032048,3.14145,0.192107,
+ -0.032048,3.14145,0.192107, -0.050855,3.1176,0.304843, 0,3.1176,0.3088,
+ -0.35361,3.08115,0.058988, -0.304843,3.1176,0.050855, -0.3088,3.1176,0,
+ -0.3088,3.1176,0, -0.3582,3.08115,0, -0.35361,3.08115,0.058988,
+ -0.340289,3.08115,0.114619, -0.29336,3.1176,0.098814, -0.304843,3.1176,0.050855,
+ -0.304843,3.1176,0.050855, -0.35361,3.08115,0.058988, -0.340289,3.08115,0.114619,
+ -0.318907,3.08115,0.166221, -0.274928,3.1176,0.143301, -0.29336,3.1176,0.098814,
+ -0.29336,3.1176,0.098814, -0.340289,3.08115,0.114619, -0.318907,3.08115,0.166221,
+ -0.290138,3.08115,0.213123, -0.250127,3.1176,0.183734, -0.274928,3.1176,0.143301,
+ -0.274928,3.1176,0.143301, -0.318907,3.08115,0.166221, -0.290138,3.08115,0.213123,
+ -0.254653,3.08115,0.254653, -0.219536,3.1176,0.219536, -0.250127,3.1176,0.183734,
+ -0.250127,3.1176,0.183734, -0.290138,3.08115,0.213123, -0.254653,3.08115,0.254653,
+ -0.213123,3.08115,0.290138, -0.183734,3.1176,0.250127, -0.219536,3.1176,0.219536,
+ -0.219536,3.1176,0.219536, -0.254653,3.08115,0.254653, -0.213123,3.08115,0.290138,
+ -0.166221,3.08115,0.318907, -0.143301,3.1176,0.274928, -0.183734,3.1176,0.250127,
+ -0.183734,3.1176,0.250127, -0.213123,3.08115,0.290138, -0.166221,3.08115,0.318907,
+ -0.114619,3.08115,0.340289, -0.098814,3.1176,0.29336, -0.143301,3.1176,0.274928,
+ -0.143301,3.1176,0.274928, -0.166221,3.08115,0.318907, -0.114619,3.08115,0.340289,
+ -0.058988,3.08115,0.35361, -0.050855,3.1176,0.304843, -0.098814,3.1176,0.29336,
+ -0.098814,3.1176,0.29336, -0.114619,3.08115,0.340289, -0.058988,3.08115,0.35361,
+ 0,3.08115,0.3582, 0,3.1176,0.3088, -0.050855,3.1176,0.304843,
+ -0.050855,3.1176,0.304843, -0.058988,3.08115,0.35361, 0,3.08115,0.3582,
+ -0.353807,3.0348,0.059016, -0.35361,3.08115,0.058988, -0.3582,3.08115,0,
+ -0.3582,3.08115,0, -0.3584,3.0348,0, -0.353807,3.0348,0.059016,
+ -0.340477,3.0348,0.114676, -0.340289,3.08115,0.114619, -0.35361,3.08115,0.058988,
+ -0.35361,3.08115,0.058988, -0.353807,3.0348,0.059016, -0.340477,3.0348,0.114676,
+ -0.319082,3.0348,0.166306, -0.318907,3.08115,0.166221, -0.340289,3.08115,0.114619,
+ -0.340289,3.08115,0.114619, -0.340477,3.0348,0.114676, -0.319082,3.0348,0.166306,
+ -0.290295,3.0348,0.213234, -0.290138,3.08115,0.213123, -0.318907,3.08115,0.166221,
+ -0.318907,3.08115,0.166221, -0.319082,3.0348,0.166306, -0.290295,3.0348,0.213234,
+ -0.254788,3.0348,0.254788, -0.254653,3.08115,0.254653, -0.290138,3.08115,0.213123,
+ -0.290138,3.08115,0.213123, -0.290295,3.0348,0.213234, -0.254788,3.0348,0.254788,
+ -0.213234,3.0348,0.290295, -0.213123,3.08115,0.290138, -0.254653,3.08115,0.254653,
+ -0.254653,3.08115,0.254653, -0.254788,3.0348,0.254788, -0.213234,3.0348,0.290295,
+ -0.166306,3.0348,0.319082, -0.166221,3.08115,0.318907, -0.213123,3.08115,0.290138,
+ -0.213123,3.08115,0.290138, -0.213234,3.0348,0.290295, -0.166306,3.0348,0.319082,
+ -0.114676,3.0348,0.340477, -0.114619,3.08115,0.340289, -0.166221,3.08115,0.318907,
+ -0.166221,3.08115,0.318907, -0.166306,3.0348,0.319082, -0.114676,3.0348,0.340477,
+ -0.059016,3.0348,0.353807, -0.058988,3.08115,0.35361, -0.114619,3.08115,0.340289,
+ -0.114619,3.08115,0.340289, -0.114676,3.0348,0.340477, -0.059016,3.0348,0.353807,
+ 0,3.0348,0.3584, 0,3.08115,0.3582, -0.058988,3.08115,0.35361,
+ -0.058988,3.08115,0.35361, -0.059016,3.0348,0.353807, 0,3.0348,0.3584,
+ -0.320834,2.98125,0.053508, -0.353807,3.0348,0.059016, -0.3584,3.0348,0,
+ -0.3584,3.0348,0, -0.325,2.98125,0, -0.320834,2.98125,0.053508,
+ -0.308744,2.98125,0.103976, -0.340477,3.0348,0.114676, -0.353807,3.0348,0.059016,
+ -0.353807,3.0348,0.059016, -0.320834,2.98125,0.053508, -0.308744,2.98125,0.103976,
+ -0.28934,2.98125,0.150793, -0.319082,3.0348,0.166306, -0.340477,3.0348,0.114676,
+ -0.340477,3.0348,0.114676, -0.308744,2.98125,0.103976, -0.28934,2.98125,0.150793,
+ -0.263232,2.98125,0.193348, -0.290295,3.0348,0.213234, -0.319082,3.0348,0.166306,
+ -0.319082,3.0348,0.166306, -0.28934,2.98125,0.150793, -0.263232,2.98125,0.193348,
+ -0.231031,2.98125,0.231031, -0.254788,3.0348,0.254788, -0.290295,3.0348,0.213234,
+ -0.290295,3.0348,0.213234, -0.263232,2.98125,0.193348, -0.231031,2.98125,0.231031,
+ -0.193348,2.98125,0.263232, -0.213234,3.0348,0.290295, -0.254788,3.0348,0.254788,
+ -0.254788,3.0348,0.254788, -0.231031,2.98125,0.231031, -0.193348,2.98125,0.263232,
+ -0.150793,2.98125,0.28934, -0.166306,3.0348,0.319082, -0.213234,3.0348,0.290295,
+ -0.213234,3.0348,0.290295, -0.193348,2.98125,0.263232, -0.150793,2.98125,0.28934,
+ -0.103976,2.98125,0.308744, -0.114676,3.0348,0.340477, -0.166306,3.0348,0.319082,
+ -0.166306,3.0348,0.319082, -0.150793,2.98125,0.28934, -0.103976,2.98125,0.308744,
+ -0.053508,2.98125,0.320834, -0.059016,3.0348,0.353807, -0.114676,3.0348,0.340477,
+ -0.114676,3.0348,0.340477, -0.103976,2.98125,0.308744, -0.053508,2.98125,0.320834,
+ 0,2.98125,0.325, 0,3.0348,0.3584, -0.059016,3.0348,0.353807,
+ -0.059016,3.0348,0.353807, -0.053508,2.98125,0.320834, 0,2.98125,0.325,
+ -0.270092,2.9232,0.045032, -0.320834,2.98125,0.053508, -0.325,2.98125,0,
+ -0.325,2.98125,0, -0.2736,2.9232,0, -0.270092,2.9232,0.045032,
+ -0.25991,2.9232,0.087511, -0.308744,2.98125,0.103976, -0.320834,2.98125,0.053508,
+ -0.320834,2.98125,0.053508, -0.270092,2.9232,0.045032, -0.25991,2.9232,0.087511,
+ -0.243569,2.9232,0.12692, -0.28934,2.98125,0.150793, -0.308744,2.98125,0.103976,
+ -0.308744,2.98125,0.103976, -0.25991,2.9232,0.087511, -0.243569,2.9232,0.12692,
+ -0.221585,2.9232,0.162745, -0.263232,2.98125,0.193348, -0.28934,2.98125,0.150793,
+ -0.28934,2.98125,0.150793, -0.243569,2.9232,0.12692, -0.221585,2.9232,0.162745,
+ -0.194472,2.9232,0.194472, -0.231031,2.98125,0.231031, -0.263232,2.98125,0.193348,
+ -0.263232,2.98125,0.193348, -0.221585,2.9232,0.162745, -0.194472,2.9232,0.194472,
+ -0.162745,2.9232,0.221585, -0.193348,2.98125,0.263232, -0.231031,2.98125,0.231031,
+ -0.231031,2.98125,0.231031, -0.194472,2.9232,0.194472, -0.162745,2.9232,0.221585,
+ -0.12692,2.9232,0.243569, -0.150793,2.98125,0.28934, -0.193348,2.98125,0.263232,
+ -0.193348,2.98125,0.263232, -0.162745,2.9232,0.221585, -0.12692,2.9232,0.243569,
+ -0.087511,2.9232,0.25991, -0.103976,2.98125,0.308744, -0.150793,2.98125,0.28934,
+ -0.150793,2.98125,0.28934, -0.12692,2.9232,0.243569, -0.087511,2.9232,0.25991,
+ -0.045032,2.9232,0.270092, -0.053508,2.98125,0.320834, -0.103976,2.98125,0.308744,
+ -0.103976,2.98125,0.308744, -0.087511,2.9232,0.25991, -0.045032,2.9232,0.270092,
+ 0,2.9232,0.2736, 0,2.98125,0.325, -0.053508,2.98125,0.320834,
+ -0.053508,2.98125,0.320834, -0.045032,2.9232,0.270092, 0,2.9232,0.2736,
+ -0.216979,2.86335,0.036157, -0.270092,2.9232,0.045032, -0.2736,2.9232,0,
+ -0.2736,2.9232,0, -0.2198,2.86335,0, -0.216979,2.86335,0.036157,
+ -0.208794,2.86335,0.07027, -0.25991,2.9232,0.087511, -0.270092,2.9232,0.045032,
+ -0.270092,2.9232,0.045032, -0.216979,2.86335,0.036157, -0.208794,2.86335,0.07027,
+ -0.195658,2.86335,0.101925, -0.243569,2.9232,0.12692, -0.25991,2.9232,0.087511,
+ -0.25991,2.9232,0.087511, -0.208794,2.86335,0.07027, -0.195658,2.86335,0.101925,
+ -0.177989,2.86335,0.130707, -0.221585,2.9232,0.162745, -0.243569,2.9232,0.12692,
+ -0.243569,2.9232,0.12692, -0.195658,2.86335,0.101925, -0.177989,2.86335,0.130707,
+ -0.1562,2.86335,0.1562, -0.194472,2.9232,0.194472, -0.221585,2.9232,0.162745,
+ -0.221585,2.9232,0.162745, -0.177989,2.86335,0.130707, -0.1562,2.86335,0.1562,
+ -0.130707,2.86335,0.177989, -0.162745,2.9232,0.221585, -0.194472,2.9232,0.194472,
+ -0.194472,2.9232,0.194472, -0.1562,2.86335,0.1562, -0.130707,2.86335,0.177989,
+ -0.101925,2.86335,0.195658, -0.12692,2.9232,0.243569, -0.162745,2.9232,0.221585,
+ -0.162745,2.9232,0.221585, -0.130707,2.86335,0.177989, -0.101925,2.86335,0.195658,
+ -0.07027,2.86335,0.208794, -0.087511,2.9232,0.25991, -0.12692,2.9232,0.243569,
+ -0.12692,2.9232,0.243569, -0.101925,2.86335,0.195658, -0.07027,2.86335,0.208794,
+ -0.036157,2.86335,0.216979, -0.045032,2.9232,0.270092, -0.087511,2.9232,0.25991,
+ -0.087511,2.9232,0.25991, -0.07027,2.86335,0.208794, -0.036157,2.86335,0.216979,
+ 0,2.86335,0.2198, 0,2.9232,0.2736, -0.045032,2.9232,0.270092,
+ -0.045032,2.9232,0.270092, -0.036157,2.86335,0.216979, 0,2.86335,0.2198,
+ -0.176897,2.8044,0.02945, -0.216979,2.86335,0.036157, -0.2198,2.86335,0,
+ -0.2198,2.86335,0, -0.1792,2.8044,0, -0.176897,2.8044,0.02945,
+ -0.170215,2.8044,0.057246, -0.208794,2.86335,0.07027, -0.216979,2.86335,0.036157,
+ -0.216979,2.86335,0.036157, -0.176897,2.8044,0.02945, -0.170215,2.8044,0.057246,
+ -0.159496,2.8044,0.083047, -0.195658,2.86335,0.101925, -0.208794,2.86335,0.07027,
+ -0.208794,2.86335,0.07027, -0.170215,2.8044,0.057246, -0.159496,2.8044,0.083047,
+ -0.145078,2.8044,0.106513, -0.177989,2.86335,0.130707, -0.195658,2.86335,0.101925,
+ -0.195658,2.86335,0.101925, -0.159496,2.8044,0.083047, -0.145078,2.8044,0.106513,
+ -0.127304,2.8044,0.127304, -0.1562,2.86335,0.1562, -0.177989,2.86335,0.130707,
+ -0.177989,2.86335,0.130707, -0.145078,2.8044,0.106513, -0.127304,2.8044,0.127304,
+ -0.106513,2.8044,0.145078, -0.130707,2.86335,0.177989, -0.1562,2.86335,0.1562,
+ -0.1562,2.86335,0.1562, -0.127304,2.8044,0.127304, -0.106513,2.8044,0.145078,
+ -0.083047,2.8044,0.159496, -0.101925,2.86335,0.195658, -0.130707,2.86335,0.177989,
+ -0.130707,2.86335,0.177989, -0.106513,2.8044,0.145078, -0.083047,2.8044,0.159496,
+ -0.057246,2.8044,0.170215, -0.07027,2.86335,0.208794, -0.101925,2.86335,0.195658,
+ -0.101925,2.86335,0.195658, -0.083047,2.8044,0.159496, -0.057246,2.8044,0.170215,
+ -0.02945,2.8044,0.176897, -0.036157,2.86335,0.216979, -0.07027,2.86335,0.208794,
+ -0.07027,2.86335,0.208794, -0.057246,2.8044,0.170215, -0.02945,2.8044,0.176897,
+ 0,2.8044,0.1792, 0,2.86335,0.2198, -0.036157,2.86335,0.216979,
+ -0.036157,2.86335,0.216979, -0.02945,2.8044,0.176897, 0,2.8044,0.1792,
+ -0.165245,2.74905,0.02748, -0.176897,2.8044,0.02945, -0.1792,2.8044,0,
+ -0.1792,2.8044,0, -0.1674,2.74905,0, -0.165245,2.74905,0.02748,
+ -0.158995,2.74905,0.053428, -0.170215,2.8044,0.057246, -0.176897,2.8044,0.02945,
+ -0.176897,2.8044,0.02945, -0.165245,2.74905,0.02748, -0.158995,2.74905,0.053428,
+ -0.148969,2.74905,0.077523, -0.159496,2.8044,0.083047, -0.170215,2.8044,0.057246,
+ -0.170215,2.8044,0.057246, -0.158995,2.74905,0.053428, -0.148969,2.74905,0.077523,
+ -0.135489,2.74905,0.099446, -0.145078,2.8044,0.106513, -0.159496,2.8044,0.083047,
+ -0.159496,2.8044,0.083047, -0.148969,2.74905,0.077523, -0.135489,2.74905,0.099446,
+ -0.118874,2.74905,0.118874, -0.127304,2.8044,0.127304, -0.145078,2.8044,0.106513,
+ -0.145078,2.8044,0.106513, -0.135489,2.74905,0.099446, -0.118874,2.74905,0.118874,
+ -0.099446,2.74905,0.135489, -0.106513,2.8044,0.145078, -0.127304,2.8044,0.127304,
+ -0.127304,2.8044,0.127304, -0.118874,2.74905,0.118874, -0.099446,2.74905,0.135489,
+ -0.077523,2.74905,0.148969, -0.083047,2.8044,0.159496, -0.106513,2.8044,0.145078,
+ -0.106513,2.8044,0.145078, -0.099446,2.74905,0.135489, -0.077523,2.74905,0.148969,
+ -0.053428,2.74905,0.158995, -0.057246,2.8044,0.170215, -0.083047,2.8044,0.159496,
+ -0.083047,2.8044,0.159496, -0.077523,2.74905,0.148969, -0.053428,2.74905,0.158995,
+ -0.02748,2.74905,0.165245, -0.02945,2.8044,0.176897, -0.057246,2.8044,0.170215,
+ -0.057246,2.8044,0.170215, -0.053428,2.74905,0.158995, -0.02748,2.74905,0.165245,
+ 0,2.74905,0.1674, 0,2.8044,0.1792, -0.02945,2.8044,0.176897,
+ -0.02945,2.8044,0.176897, -0.02748,2.74905,0.165245, 0,2.74905,0.1674,
+ -0.197424,2.7,0.032816, -0.165245,2.74905,0.02748, -0.1674,2.74905,0,
+ -0.1674,2.74905,0, -0.2,2.7,0, -0.197424,2.7,0.032816,
+ -0.189952,2.7,0.063808, -0.158995,2.74905,0.053428, -0.165245,2.74905,0.02748,
+ -0.165245,2.74905,0.02748, -0.197424,2.7,0.032816, -0.189952,2.7,0.063808,
+ -0.177968,2.7,0.092592, -0.148969,2.74905,0.077523, -0.158995,2.74905,0.053428,
+ -0.158995,2.74905,0.053428, -0.189952,2.7,0.063808, -0.177968,2.7,0.092592,
+ -0.161856,2.7,0.118784, -0.135489,2.74905,0.099446, -0.148969,2.74905,0.077523,
+ -0.148969,2.74905,0.077523, -0.177968,2.7,0.092592, -0.161856,2.7,0.118784,
+ -0.142,2.7,0.142, -0.118874,2.74905,0.118874, -0.135489,2.74905,0.099446,
+ -0.135489,2.74905,0.099446, -0.161856,2.7,0.118784, -0.142,2.7,0.142,
+ -0.118784,2.7,0.161856, -0.099446,2.74905,0.135489, -0.118874,2.74905,0.118874,
+ -0.118874,2.74905,0.118874, -0.142,2.7,0.142, -0.118784,2.7,0.161856,
+ -0.092592,2.7,0.177968, -0.077523,2.74905,0.148969, -0.099446,2.74905,0.135489,
+ -0.099446,2.74905,0.135489, -0.118784,2.7,0.161856, -0.092592,2.7,0.177968,
+ -0.063808,2.7,0.189952, -0.053428,2.74905,0.158995, -0.077523,2.74905,0.148969,
+ -0.077523,2.74905,0.148969, -0.092592,2.7,0.177968, -0.063808,2.7,0.189952,
+ -0.032816,2.7,0.197424, -0.02748,2.74905,0.165245, -0.053428,2.74905,0.158995,
+ -0.053428,2.74905,0.158995, -0.063808,2.7,0.189952, -0.032816,2.7,0.197424,
+ 0,2.7,0.2, 0,2.74905,0.1674, -0.02748,2.74905,0.165245,
+ -0.02748,2.74905,0.165245, -0.032816,2.7,0.197424, 0,2.7,0.2,
+ 0,3.15,0, 0,3.14145,0.1946, 0.032048,3.14145,0.192107,
+ 0,3.15,0, 0.032048,3.14145,0.192107, 0.062272,3.14145,0.18487,
+ 0,3.15,0, 0.062272,3.14145,0.18487, 0.090306,3.14145,0.173255,
+ 0,3.15,0, 0.090306,3.14145,0.173255, 0.115787,3.14145,0.157626,
+ 0,3.15,0, 0.115787,3.14145,0.157626, 0.138348,3.14145,0.138348,
+ 0,3.15,0, 0.138348,3.14145,0.138348, 0.157626,3.14145,0.115787,
+ 0,3.15,0, 0.157626,3.14145,0.115787, 0.173255,3.14145,0.090306,
+ 0,3.15,0, 0.173255,3.14145,0.090306, 0.18487,3.14145,0.062272,
+ 0,3.15,0, 0.18487,3.14145,0.062272, 0.192107,3.14145,0.032048,
+ 0,3.15,0, 0.192107,3.14145,0.032048, 0.1946,3.14145,0,
+ 0.050855,3.1176,0.304843, 0.032048,3.14145,0.192107, 0,3.14145,0.1946,
+ 0,3.14145,0.1946, 0,3.1176,0.3088, 0.050855,3.1176,0.304843,
+ 0.098814,3.1176,0.29336, 0.062272,3.14145,0.18487, 0.032048,3.14145,0.192107,
+ 0.032048,3.14145,0.192107, 0.050855,3.1176,0.304843, 0.098814,3.1176,0.29336,
+ 0.143301,3.1176,0.274928, 0.090306,3.14145,0.173255, 0.062272,3.14145,0.18487,
+ 0.062272,3.14145,0.18487, 0.098814,3.1176,0.29336, 0.143301,3.1176,0.274928,
+ 0.183734,3.1176,0.250127, 0.115787,3.14145,0.157626, 0.090306,3.14145,0.173255,
+ 0.090306,3.14145,0.173255, 0.143301,3.1176,0.274928, 0.183734,3.1176,0.250127,
+ 0.219536,3.1176,0.219536, 0.138348,3.14145,0.138348, 0.115787,3.14145,0.157626,
+ 0.115787,3.14145,0.157626, 0.183734,3.1176,0.250127, 0.219536,3.1176,0.219536,
+ 0.250127,3.1176,0.183734, 0.157626,3.14145,0.115787, 0.138348,3.14145,0.138348,
+ 0.138348,3.14145,0.138348, 0.219536,3.1176,0.219536, 0.250127,3.1176,0.183734,
+ 0.274928,3.1176,0.143301, 0.173255,3.14145,0.090306, 0.157626,3.14145,0.115787,
+ 0.157626,3.14145,0.115787, 0.250127,3.1176,0.183734, 0.274928,3.1176,0.143301,
+ 0.29336,3.1176,0.098814, 0.18487,3.14145,0.062272, 0.173255,3.14145,0.090306,
+ 0.173255,3.14145,0.090306, 0.274928,3.1176,0.143301, 0.29336,3.1176,0.098814,
+ 0.304843,3.1176,0.050855, 0.192107,3.14145,0.032048, 0.18487,3.14145,0.062272,
+ 0.18487,3.14145,0.062272, 0.29336,3.1176,0.098814, 0.304843,3.1176,0.050855,
+ 0.3088,3.1176,0, 0.1946,3.14145,0, 0.192107,3.14145,0.032048,
+ 0.192107,3.14145,0.032048, 0.304843,3.1176,0.050855, 0.3088,3.1176,0,
+ 0.058988,3.08115,0.35361, 0.050855,3.1176,0.304843, 0,3.1176,0.3088,
+ 0,3.1176,0.3088, 0,3.08115,0.3582, 0.058988,3.08115,0.35361,
+ 0.114619,3.08115,0.340289, 0.098814,3.1176,0.29336, 0.050855,3.1176,0.304843,
+ 0.050855,3.1176,0.304843, 0.058988,3.08115,0.35361, 0.114619,3.08115,0.340289,
+ 0.166221,3.08115,0.318907, 0.143301,3.1176,0.274928, 0.098814,3.1176,0.29336,
+ 0.098814,3.1176,0.29336, 0.114619,3.08115,0.340289, 0.166221,3.08115,0.318907,
+ 0.213123,3.08115,0.290138, 0.183734,3.1176,0.250127, 0.143301,3.1176,0.274928,
+ 0.143301,3.1176,0.274928, 0.166221,3.08115,0.318907, 0.213123,3.08115,0.290138,
+ 0.254653,3.08115,0.254653, 0.219536,3.1176,0.219536, 0.183734,3.1176,0.250127,
+ 0.183734,3.1176,0.250127, 0.213123,3.08115,0.290138, 0.254653,3.08115,0.254653,
+ 0.290138,3.08115,0.213123, 0.250127,3.1176,0.183734, 0.219536,3.1176,0.219536,
+ 0.219536,3.1176,0.219536, 0.254653,3.08115,0.254653, 0.290138,3.08115,0.213123,
+ 0.318907,3.08115,0.166221, 0.274928,3.1176,0.143301, 0.250127,3.1176,0.183734,
+ 0.250127,3.1176,0.183734, 0.290138,3.08115,0.213123, 0.318907,3.08115,0.166221,
+ 0.340289,3.08115,0.114619, 0.29336,3.1176,0.098814, 0.274928,3.1176,0.143301,
+ 0.274928,3.1176,0.143301, 0.318907,3.08115,0.166221, 0.340289,3.08115,0.114619,
+ 0.35361,3.08115,0.058988, 0.304843,3.1176,0.050855, 0.29336,3.1176,0.098814,
+ 0.29336,3.1176,0.098814, 0.340289,3.08115,0.114619, 0.35361,3.08115,0.058988,
+ 0.3582,3.08115,0, 0.3088,3.1176,0, 0.304843,3.1176,0.050855,
+ 0.304843,3.1176,0.050855, 0.35361,3.08115,0.058988, 0.3582,3.08115,0,
+ 0.059016,3.0348,0.353807, 0.058988,3.08115,0.35361, 0,3.08115,0.3582,
+ 0,3.08115,0.3582, 0,3.0348,0.3584, 0.059016,3.0348,0.353807,
+ 0.114676,3.0348,0.340477, 0.114619,3.08115,0.340289, 0.058988,3.08115,0.35361,
+ 0.058988,3.08115,0.35361, 0.059016,3.0348,0.353807, 0.114676,3.0348,0.340477,
+ 0.166306,3.0348,0.319082, 0.166221,3.08115,0.318907, 0.114619,3.08115,0.340289,
+ 0.114619,3.08115,0.340289, 0.114676,3.0348,0.340477, 0.166306,3.0348,0.319082,
+ 0.213234,3.0348,0.290295, 0.213123,3.08115,0.290138, 0.166221,3.08115,0.318907,
+ 0.166221,3.08115,0.318907, 0.166306,3.0348,0.319082, 0.213234,3.0348,0.290295,
+ 0.254788,3.0348,0.254788, 0.254653,3.08115,0.254653, 0.213123,3.08115,0.290138,
+ 0.213123,3.08115,0.290138, 0.213234,3.0348,0.290295, 0.254788,3.0348,0.254788,
+ 0.290295,3.0348,0.213234, 0.290138,3.08115,0.213123, 0.254653,3.08115,0.254653,
+ 0.254653,3.08115,0.254653, 0.254788,3.0348,0.254788, 0.290295,3.0348,0.213234,
+ 0.319082,3.0348,0.166306, 0.318907,3.08115,0.166221, 0.290138,3.08115,0.213123,
+ 0.290138,3.08115,0.213123, 0.290295,3.0348,0.213234, 0.319082,3.0348,0.166306,
+ 0.340477,3.0348,0.114676, 0.340289,3.08115,0.114619, 0.318907,3.08115,0.166221,
+ 0.318907,3.08115,0.166221, 0.319082,3.0348,0.166306, 0.340477,3.0348,0.114676,
+ 0.353807,3.0348,0.059016, 0.35361,3.08115,0.058988, 0.340289,3.08115,0.114619,
+ 0.340289,3.08115,0.114619, 0.340477,3.0348,0.114676, 0.353807,3.0348,0.059016,
+ 0.3584,3.0348,0, 0.3582,3.08115,0, 0.35361,3.08115,0.058988,
+ 0.35361,3.08115,0.058988, 0.353807,3.0348,0.059016, 0.3584,3.0348,0,
+ 0.053508,2.98125,0.320834, 0.059016,3.0348,0.353807, 0,3.0348,0.3584,
+ 0,3.0348,0.3584, 0,2.98125,0.325, 0.053508,2.98125,0.320834,
+ 0.103976,2.98125,0.308744, 0.114676,3.0348,0.340477, 0.059016,3.0348,0.353807,
+ 0.059016,3.0348,0.353807, 0.053508,2.98125,0.320834, 0.103976,2.98125,0.308744,
+ 0.150793,2.98125,0.28934, 0.166306,3.0348,0.319082, 0.114676,3.0348,0.340477,
+ 0.114676,3.0348,0.340477, 0.103976,2.98125,0.308744, 0.150793,2.98125,0.28934,
+ 0.193348,2.98125,0.263232, 0.213234,3.0348,0.290295, 0.166306,3.0348,0.319082,
+ 0.166306,3.0348,0.319082, 0.150793,2.98125,0.28934, 0.193348,2.98125,0.263232,
+ 0.231031,2.98125,0.231031, 0.254788,3.0348,0.254788, 0.213234,3.0348,0.290295,
+ 0.213234,3.0348,0.290295, 0.193348,2.98125,0.263232, 0.231031,2.98125,0.231031,
+ 0.263232,2.98125,0.193348, 0.290295,3.0348,0.213234, 0.254788,3.0348,0.254788,
+ 0.254788,3.0348,0.254788, 0.231031,2.98125,0.231031, 0.263232,2.98125,0.193348,
+ 0.28934,2.98125,0.150793, 0.319082,3.0348,0.166306, 0.290295,3.0348,0.213234,
+ 0.290295,3.0348,0.213234, 0.263232,2.98125,0.193348, 0.28934,2.98125,0.150793,
+ 0.308744,2.98125,0.103976, 0.340477,3.0348,0.114676, 0.319082,3.0348,0.166306,
+ 0.319082,3.0348,0.166306, 0.28934,2.98125,0.150793, 0.308744,2.98125,0.103976,
+ 0.320834,2.98125,0.053508, 0.353807,3.0348,0.059016, 0.340477,3.0348,0.114676,
+ 0.340477,3.0348,0.114676, 0.308744,2.98125,0.103976, 0.320834,2.98125,0.053508,
+ 0.325,2.98125,0, 0.3584,3.0348,0, 0.353807,3.0348,0.059016,
+ 0.353807,3.0348,0.059016, 0.320834,2.98125,0.053508, 0.325,2.98125,0,
+ 0.045032,2.9232,0.270092, 0.053508,2.98125,0.320834, 0,2.98125,0.325,
+ 0,2.98125,0.325, 0,2.9232,0.2736, 0.045032,2.9232,0.270092,
+ 0.087511,2.9232,0.25991, 0.103976,2.98125,0.308744, 0.053508,2.98125,0.320834,
+ 0.053508,2.98125,0.320834, 0.045032,2.9232,0.270092, 0.087511,2.9232,0.25991,
+ 0.12692,2.9232,0.243569, 0.150793,2.98125,0.28934, 0.103976,2.98125,0.308744,
+ 0.103976,2.98125,0.308744, 0.087511,2.9232,0.25991, 0.12692,2.9232,0.243569,
+ 0.162745,2.9232,0.221585, 0.193348,2.98125,0.263232, 0.150793,2.98125,0.28934,
+ 0.150793,2.98125,0.28934, 0.12692,2.9232,0.243569, 0.162745,2.9232,0.221585,
+ 0.194472,2.9232,0.194472, 0.231031,2.98125,0.231031, 0.193348,2.98125,0.263232,
+ 0.193348,2.98125,0.263232, 0.162745,2.9232,0.221585, 0.194472,2.9232,0.194472,
+ 0.221585,2.9232,0.162745, 0.263232,2.98125,0.193348, 0.231031,2.98125,0.231031,
+ 0.231031,2.98125,0.231031, 0.194472,2.9232,0.194472, 0.221585,2.9232,0.162745,
+ 0.243569,2.9232,0.12692, 0.28934,2.98125,0.150793, 0.263232,2.98125,0.193348,
+ 0.263232,2.98125,0.193348, 0.221585,2.9232,0.162745, 0.243569,2.9232,0.12692,
+ 0.25991,2.9232,0.087511, 0.308744,2.98125,0.103976, 0.28934,2.98125,0.150793,
+ 0.28934,2.98125,0.150793, 0.243569,2.9232,0.12692, 0.25991,2.9232,0.087511,
+ 0.270092,2.9232,0.045032, 0.320834,2.98125,0.053508, 0.308744,2.98125,0.103976,
+ 0.308744,2.98125,0.103976, 0.25991,2.9232,0.087511, 0.270092,2.9232,0.045032,
+ 0.2736,2.9232,0, 0.325,2.98125,0, 0.320834,2.98125,0.053508,
+ 0.320834,2.98125,0.053508, 0.270092,2.9232,0.045032, 0.2736,2.9232,0,
+ 0.036157,2.86335,0.216979, 0.045032,2.9232,0.270092, 0,2.9232,0.2736,
+ 0,2.9232,0.2736, 0,2.86335,0.2198, 0.036157,2.86335,0.216979,
+ 0.07027,2.86335,0.208794, 0.087511,2.9232,0.25991, 0.045032,2.9232,0.270092,
+ 0.045032,2.9232,0.270092, 0.036157,2.86335,0.216979, 0.07027,2.86335,0.208794,
+ 0.101925,2.86335,0.195658, 0.12692,2.9232,0.243569, 0.087511,2.9232,0.25991,
+ 0.087511,2.9232,0.25991, 0.07027,2.86335,0.208794, 0.101925,2.86335,0.195658,
+ 0.130707,2.86335,0.177989, 0.162745,2.9232,0.221585, 0.12692,2.9232,0.243569,
+ 0.12692,2.9232,0.243569, 0.101925,2.86335,0.195658, 0.130707,2.86335,0.177989,
+ 0.1562,2.86335,0.1562, 0.194472,2.9232,0.194472, 0.162745,2.9232,0.221585,
+ 0.162745,2.9232,0.221585, 0.130707,2.86335,0.177989, 0.1562,2.86335,0.1562,
+ 0.177989,2.86335,0.130707, 0.221585,2.9232,0.162745, 0.194472,2.9232,0.194472,
+ 0.194472,2.9232,0.194472, 0.1562,2.86335,0.1562, 0.177989,2.86335,0.130707,
+ 0.195658,2.86335,0.101925, 0.243569,2.9232,0.12692, 0.221585,2.9232,0.162745,
+ 0.221585,2.9232,0.162745, 0.177989,2.86335,0.130707, 0.195658,2.86335,0.101925,
+ 0.208794,2.86335,0.07027, 0.25991,2.9232,0.087511, 0.243569,2.9232,0.12692,
+ 0.243569,2.9232,0.12692, 0.195658,2.86335,0.101925, 0.208794,2.86335,0.07027,
+ 0.216979,2.86335,0.036157, 0.270092,2.9232,0.045032, 0.25991,2.9232,0.087511,
+ 0.25991,2.9232,0.087511, 0.208794,2.86335,0.07027, 0.216979,2.86335,0.036157,
+ 0.2198,2.86335,0, 0.2736,2.9232,0, 0.270092,2.9232,0.045032,
+ 0.270092,2.9232,0.045032, 0.216979,2.86335,0.036157, 0.2198,2.86335,0,
+ 0.02945,2.8044,0.176897, 0.036157,2.86335,0.216979, 0,2.86335,0.2198,
+ 0,2.86335,0.2198, 0,2.8044,0.1792, 0.02945,2.8044,0.176897,
+ 0.057246,2.8044,0.170215, 0.07027,2.86335,0.208794, 0.036157,2.86335,0.216979,
+ 0.036157,2.86335,0.216979, 0.02945,2.8044,0.176897, 0.057246,2.8044,0.170215,
+ 0.083047,2.8044,0.159496, 0.101925,2.86335,0.195658, 0.07027,2.86335,0.208794,
+ 0.07027,2.86335,0.208794, 0.057246,2.8044,0.170215, 0.083047,2.8044,0.159496,
+ 0.106513,2.8044,0.145078, 0.130707,2.86335,0.177989, 0.101925,2.86335,0.195658,
+ 0.101925,2.86335,0.195658, 0.083047,2.8044,0.159496, 0.106513,2.8044,0.145078,
+ 0.127304,2.8044,0.127304, 0.1562,2.86335,0.1562, 0.130707,2.86335,0.177989,
+ 0.130707,2.86335,0.177989, 0.106513,2.8044,0.145078, 0.127304,2.8044,0.127304,
+ 0.145078,2.8044,0.106513, 0.177989,2.86335,0.130707, 0.1562,2.86335,0.1562,
+ 0.1562,2.86335,0.1562, 0.127304,2.8044,0.127304, 0.145078,2.8044,0.106513,
+ 0.159496,2.8044,0.083047, 0.195658,2.86335,0.101925, 0.177989,2.86335,0.130707,
+ 0.177989,2.86335,0.130707, 0.145078,2.8044,0.106513, 0.159496,2.8044,0.083047,
+ 0.170215,2.8044,0.057246, 0.208794,2.86335,0.07027, 0.195658,2.86335,0.101925,
+ 0.195658,2.86335,0.101925, 0.159496,2.8044,0.083047, 0.170215,2.8044,0.057246,
+ 0.176897,2.8044,0.02945, 0.216979,2.86335,0.036157, 0.208794,2.86335,0.07027,
+ 0.208794,2.86335,0.07027, 0.170215,2.8044,0.057246, 0.176897,2.8044,0.02945,
+ 0.1792,2.8044,0, 0.2198,2.86335,0, 0.216979,2.86335,0.036157,
+ 0.216979,2.86335,0.036157, 0.176897,2.8044,0.02945, 0.1792,2.8044,0,
+ 0.02748,2.74905,0.165245, 0.02945,2.8044,0.176897, 0,2.8044,0.1792,
+ 0,2.8044,0.1792, 0,2.74905,0.1674, 0.02748,2.74905,0.165245,
+ 0.053428,2.74905,0.158995, 0.057246,2.8044,0.170215, 0.02945,2.8044,0.176897,
+ 0.02945,2.8044,0.176897, 0.02748,2.74905,0.165245, 0.053428,2.74905,0.158995,
+ 0.077523,2.74905,0.148969, 0.083047,2.8044,0.159496, 0.057246,2.8044,0.170215,
+ 0.057246,2.8044,0.170215, 0.053428,2.74905,0.158995, 0.077523,2.74905,0.148969,
+ 0.099446,2.74905,0.135489, 0.106513,2.8044,0.145078, 0.083047,2.8044,0.159496,
+ 0.083047,2.8044,0.159496, 0.077523,2.74905,0.148969, 0.099446,2.74905,0.135489,
+ 0.118874,2.74905,0.118874, 0.127304,2.8044,0.127304, 0.106513,2.8044,0.145078,
+ 0.106513,2.8044,0.145078, 0.099446,2.74905,0.135489, 0.118874,2.74905,0.118874,
+ 0.135489,2.74905,0.099446, 0.145078,2.8044,0.106513, 0.127304,2.8044,0.127304,
+ 0.127304,2.8044,0.127304, 0.118874,2.74905,0.118874, 0.135489,2.74905,0.099446,
+ 0.148969,2.74905,0.077523, 0.159496,2.8044,0.083047, 0.145078,2.8044,0.106513,
+ 0.145078,2.8044,0.106513, 0.135489,2.74905,0.099446, 0.148969,2.74905,0.077523,
+ 0.158995,2.74905,0.053428, 0.170215,2.8044,0.057246, 0.159496,2.8044,0.083047,
+ 0.159496,2.8044,0.083047, 0.148969,2.74905,0.077523, 0.158995,2.74905,0.053428,
+ 0.165245,2.74905,0.02748, 0.176897,2.8044,0.02945, 0.170215,2.8044,0.057246,
+ 0.170215,2.8044,0.057246, 0.158995,2.74905,0.053428, 0.165245,2.74905,0.02748,
+ 0.1674,2.74905,0, 0.1792,2.8044,0, 0.176897,2.8044,0.02945,
+ 0.176897,2.8044,0.02945, 0.165245,2.74905,0.02748, 0.1674,2.74905,0,
+ 0.032816,2.7,0.197424, 0.02748,2.74905,0.165245, 0,2.74905,0.1674,
+ 0,2.74905,0.1674, 0,2.7,0.2, 0.032816,2.7,0.197424,
+ 0.063808,2.7,0.189952, 0.053428,2.74905,0.158995, 0.02748,2.74905,0.165245,
+ 0.02748,2.74905,0.165245, 0.032816,2.7,0.197424, 0.063808,2.7,0.189952,
+ 0.092592,2.7,0.177968, 0.077523,2.74905,0.148969, 0.053428,2.74905,0.158995,
+ 0.053428,2.74905,0.158995, 0.063808,2.7,0.189952, 0.092592,2.7,0.177968,
+ 0.118784,2.7,0.161856, 0.099446,2.74905,0.135489, 0.077523,2.74905,0.148969,
+ 0.077523,2.74905,0.148969, 0.092592,2.7,0.177968, 0.118784,2.7,0.161856,
+ 0.142,2.7,0.142, 0.118874,2.74905,0.118874, 0.099446,2.74905,0.135489,
+ 0.099446,2.74905,0.135489, 0.118784,2.7,0.161856, 0.142,2.7,0.142,
+ 0.161856,2.7,0.118784, 0.135489,2.74905,0.099446, 0.118874,2.74905,0.118874,
+ 0.118874,2.74905,0.118874, 0.142,2.7,0.142, 0.161856,2.7,0.118784,
+ 0.177968,2.7,0.092592, 0.148969,2.74905,0.077523, 0.135489,2.74905,0.099446,
+ 0.135489,2.74905,0.099446, 0.161856,2.7,0.118784, 0.177968,2.7,0.092592,
+ 0.189952,2.7,0.063808, 0.158995,2.74905,0.053428, 0.148969,2.74905,0.077523,
+ 0.148969,2.74905,0.077523, 0.177968,2.7,0.092592, 0.189952,2.7,0.063808,
+ 0.197424,2.7,0.032816, 0.165245,2.74905,0.02748, 0.158995,2.74905,0.053428,
+ 0.158995,2.74905,0.053428, 0.189952,2.7,0.063808, 0.197424,2.7,0.032816,
+ 0.2,2.7,0, 0.1674,2.74905,0, 0.165245,2.74905,0.02748,
+ 0.165245,2.74905,0.02748, 0.197424,2.7,0.032816, 0.2,2.7,0,
+ 0.275801,2.6592,-0.045844, 0.197424,2.7,-0.032816, 0.2,2.7,0,
+ 0.2,2.7,0, 0.2794,2.6592,0, 0.275801,2.6592,-0.045844,
+ 0.265363,2.6592,-0.08914, 0.189952,2.7,-0.063808, 0.197424,2.7,-0.032816,
+ 0.197424,2.7,-0.032816, 0.275801,2.6592,-0.045844, 0.265363,2.6592,-0.08914,
+ 0.248621,2.6592,-0.129351, 0.177968,2.7,-0.092592, 0.189952,2.7,-0.063808,
+ 0.189952,2.7,-0.063808, 0.265363,2.6592,-0.08914, 0.248621,2.6592,-0.129351,
+ 0.226113,2.6592,-0.165941, 0.161856,2.7,-0.118784, 0.177968,2.7,-0.092592,
+ 0.177968,2.7,-0.092592, 0.248621,2.6592,-0.129351, 0.226113,2.6592,-0.165941,
+ 0.198374,2.6592,-0.198374, 0.142,2.7,-0.142, 0.161856,2.7,-0.118784,
+ 0.161856,2.7,-0.118784, 0.226113,2.6592,-0.165941, 0.198374,2.6592,-0.198374,
+ 0.165941,2.6592,-0.226113, 0.118784,2.7,-0.161856, 0.142,2.7,-0.142,
+ 0.142,2.7,-0.142, 0.198374,2.6592,-0.198374, 0.165941,2.6592,-0.226113,
+ 0.129351,2.6592,-0.248621, 0.092592,2.7,-0.177968, 0.118784,2.7,-0.161856,
+ 0.118784,2.7,-0.161856, 0.165941,2.6592,-0.226113, 0.129351,2.6592,-0.248621,
+ 0.08914,2.6592,-0.265363, 0.063808,2.7,-0.189952, 0.092592,2.7,-0.177968,
+ 0.092592,2.7,-0.177968, 0.129351,2.6592,-0.248621, 0.08914,2.6592,-0.265363,
+ 0.045844,2.6592,-0.275801, 0.032816,2.7,-0.197424, 0.063808,2.7,-0.189952,
+ 0.063808,2.7,-0.189952, 0.08914,2.6592,-0.265363, 0.045844,2.6592,-0.275801,
+ 0,2.6592,-0.2794, 0,2.7,-0.2, 0.032816,2.7,-0.197424,
+ 0.032816,2.7,-0.197424, 0.045844,2.6592,-0.275801, 0,2.6592,-0.2794,
+ 0.386161,2.6256,-0.064188, 0.275801,2.6592,-0.045844, 0.2794,2.6592,0,
+ 0.2794,2.6592,0, 0.3912,2.6256,0, 0.386161,2.6256,-0.064188,
+ 0.371546,2.6256,-0.124808, 0.265363,2.6592,-0.08914, 0.275801,2.6592,-0.045844,
+ 0.275801,2.6592,-0.045844, 0.386161,2.6256,-0.064188, 0.371546,2.6256,-0.124808,
+ 0.348105,2.6256,-0.18111, 0.248621,2.6592,-0.129351, 0.265363,2.6592,-0.08914,
+ 0.265363,2.6592,-0.08914, 0.371546,2.6256,-0.124808, 0.348105,2.6256,-0.18111,
+ 0.31659,2.6256,-0.232342, 0.226113,2.6592,-0.165941, 0.248621,2.6592,-0.129351,
+ 0.248621,2.6592,-0.129351, 0.348105,2.6256,-0.18111, 0.31659,2.6256,-0.232342,
+ 0.277752,2.6256,-0.277752, 0.198374,2.6592,-0.198374, 0.226113,2.6592,-0.165941,
+ 0.226113,2.6592,-0.165941, 0.31659,2.6256,-0.232342, 0.277752,2.6256,-0.277752,
+ 0.232342,2.6256,-0.31659, 0.165941,2.6592,-0.226113, 0.198374,2.6592,-0.198374,
+ 0.198374,2.6592,-0.198374, 0.277752,2.6256,-0.277752, 0.232342,2.6256,-0.31659,
+ 0.18111,2.6256,-0.348105, 0.129351,2.6592,-0.248621, 0.165941,2.6592,-0.226113,
+ 0.165941,2.6592,-0.226113, 0.232342,2.6256,-0.31659, 0.18111,2.6256,-0.348105,
+ 0.124808,2.6256,-0.371546, 0.08914,2.6592,-0.265363, 0.129351,2.6592,-0.248621,
+ 0.129351,2.6592,-0.248621, 0.18111,2.6256,-0.348105, 0.124808,2.6256,-0.371546,
+ 0.064188,2.6256,-0.386161, 0.045844,2.6592,-0.275801, 0.08914,2.6592,-0.265363,
+ 0.08914,2.6592,-0.265363, 0.124808,2.6256,-0.371546, 0.064188,2.6256,-0.386161,
+ 0,2.6256,-0.3912, 0,2.6592,-0.2794, 0.045844,2.6592,-0.275801,
+ 0.045844,2.6592,-0.275801, 0.064188,2.6256,-0.386161, 0,2.6256,-0.3912,
+ 0.519028,2.5974,-0.086273, 0.386161,2.6256,-0.064188, 0.3912,2.6256,0,
+ 0.3912,2.6256,0, 0.5258,2.5974,0, 0.519028,2.5974,-0.086273,
+ 0.499384,2.5974,-0.167751, 0.371546,2.6256,-0.124808, 0.386161,2.6256,-0.064188,
+ 0.386161,2.6256,-0.064188, 0.519028,2.5974,-0.086273, 0.499384,2.5974,-0.167751,
+ 0.467878,2.5974,-0.243424, 0.348105,2.6256,-0.18111, 0.371546,2.6256,-0.124808,
+ 0.371546,2.6256,-0.124808, 0.499384,2.5974,-0.167751, 0.467878,2.5974,-0.243424,
+ 0.425519,2.5974,-0.312283, 0.31659,2.6256,-0.232342, 0.348105,2.6256,-0.18111,
+ 0.348105,2.6256,-0.18111, 0.467878,2.5974,-0.243424, 0.425519,2.5974,-0.312283,
+ 0.373318,2.5974,-0.373318, 0.277752,2.6256,-0.277752, 0.31659,2.6256,-0.232342,
+ 0.31659,2.6256,-0.232342, 0.425519,2.5974,-0.312283, 0.373318,2.5974,-0.373318,
+ 0.312283,2.5974,-0.425519, 0.232342,2.6256,-0.31659, 0.277752,2.6256,-0.277752,
+ 0.277752,2.6256,-0.277752, 0.373318,2.5974,-0.373318, 0.312283,2.5974,-0.425519,
+ 0.243424,2.5974,-0.467878, 0.18111,2.6256,-0.348105, 0.232342,2.6256,-0.31659,
+ 0.232342,2.6256,-0.31659, 0.312283,2.5974,-0.425519, 0.243424,2.5974,-0.467878,
+ 0.167751,2.5974,-0.499384, 0.124808,2.6256,-0.371546, 0.18111,2.6256,-0.348105,
+ 0.18111,2.6256,-0.348105, 0.243424,2.5974,-0.467878, 0.167751,2.5974,-0.499384,
+ 0.086273,2.5974,-0.519028, 0.064188,2.6256,-0.386161, 0.124808,2.6256,-0.371546,
+ 0.124808,2.6256,-0.371546, 0.167751,2.5974,-0.499384, 0.086273,2.5974,-0.519028,
+ 0,2.5974,-0.5258, 0,2.6256,-0.3912, 0.064188,2.6256,-0.386161,
+ 0.064188,2.6256,-0.386161, 0.086273,2.5974,-0.519028, 0,2.5974,-0.5258,
+ 0.664924,2.5728,-0.110524, 0.519028,2.5974,-0.086273, 0.5258,2.5974,0,
+ 0.5258,2.5974,0, 0.6736,2.5728,0, 0.664924,2.5728,-0.110524,
+ 0.639758,2.5728,-0.214905, 0.499384,2.5974,-0.167751, 0.519028,2.5974,-0.086273,
+ 0.519028,2.5974,-0.086273, 0.664924,2.5728,-0.110524, 0.639758,2.5728,-0.214905,
+ 0.599396,2.5728,-0.31185, 0.467878,2.5974,-0.243424, 0.499384,2.5974,-0.167751,
+ 0.499384,2.5974,-0.167751, 0.639758,2.5728,-0.214905, 0.599396,2.5728,-0.31185,
+ 0.545131,2.5728,-0.400065, 0.425519,2.5974,-0.312283, 0.467878,2.5974,-0.243424,
+ 0.467878,2.5974,-0.243424, 0.599396,2.5728,-0.31185, 0.545131,2.5728,-0.400065,
+ 0.478256,2.5728,-0.478256, 0.373318,2.5974,-0.373318, 0.425519,2.5974,-0.312283,
+ 0.425519,2.5974,-0.312283, 0.545131,2.5728,-0.400065, 0.478256,2.5728,-0.478256,
+ 0.400065,2.5728,-0.545131, 0.312283,2.5974,-0.425519, 0.373318,2.5974,-0.373318,
+ 0.373318,2.5974,-0.373318, 0.478256,2.5728,-0.478256, 0.400065,2.5728,-0.545131,
+ 0.31185,2.5728,-0.599396, 0.243424,2.5974,-0.467878, 0.312283,2.5974,-0.425519,
+ 0.312283,2.5974,-0.425519, 0.400065,2.5728,-0.545131, 0.31185,2.5728,-0.599396,
+ 0.214905,2.5728,-0.639758, 0.167751,2.5974,-0.499384, 0.243424,2.5974,-0.467878,
+ 0.243424,2.5974,-0.467878, 0.31185,2.5728,-0.599396, 0.214905,2.5728,-0.639758,
+ 0.110524,2.5728,-0.664924, 0.086273,2.5974,-0.519028, 0.167751,2.5974,-0.499384,
+ 0.167751,2.5974,-0.499384, 0.214905,2.5728,-0.639758, 0.110524,2.5728,-0.664924,
+ 0,2.5728,-0.6736, 0,2.5974,-0.5258, 0.086273,2.5974,-0.519028,
+ 0.086273,2.5974,-0.519028, 0.110524,2.5728,-0.664924, 0,2.5728,-0.6736,
+ 0.814374,2.55,-0.135366, 0.664924,2.5728,-0.110524, 0.6736,2.5728,0,
+ 0.6736,2.5728,0, 0.825,2.55,0, 0.814374,2.55,-0.135366,
+ 0.783552,2.55,-0.263208, 0.639758,2.5728,-0.214905, 0.664924,2.5728,-0.110524,
+ 0.664924,2.5728,-0.110524, 0.814374,2.55,-0.135366, 0.783552,2.55,-0.263208,
+ 0.734118,2.55,-0.381942, 0.599396,2.5728,-0.31185, 0.639758,2.5728,-0.214905,
+ 0.639758,2.5728,-0.214905, 0.783552,2.55,-0.263208, 0.734118,2.55,-0.381942,
+ 0.667656,2.55,-0.489984, 0.545131,2.5728,-0.400065, 0.599396,2.5728,-0.31185,
+ 0.599396,2.5728,-0.31185, 0.734118,2.55,-0.381942, 0.667656,2.55,-0.489984,
+ 0.58575,2.55,-0.58575, 0.478256,2.5728,-0.478256, 0.545131,2.5728,-0.400065,
+ 0.545131,2.5728,-0.400065, 0.667656,2.55,-0.489984, 0.58575,2.55,-0.58575,
+ 0.489984,2.55,-0.667656, 0.400065,2.5728,-0.545131, 0.478256,2.5728,-0.478256,
+ 0.478256,2.5728,-0.478256, 0.58575,2.55,-0.58575, 0.489984,2.55,-0.667656,
+ 0.381942,2.55,-0.734118, 0.31185,2.5728,-0.599396, 0.400065,2.5728,-0.545131,
+ 0.400065,2.5728,-0.545131, 0.489984,2.55,-0.667656, 0.381942,2.55,-0.734118,
+ 0.263208,2.55,-0.783552, 0.214905,2.5728,-0.639758, 0.31185,2.5728,-0.599396,
+ 0.31185,2.5728,-0.599396, 0.381942,2.55,-0.734118, 0.263208,2.55,-0.783552,
+ 0.135366,2.55,-0.814374, 0.110524,2.5728,-0.664924, 0.214905,2.5728,-0.639758,
+ 0.214905,2.5728,-0.639758, 0.263208,2.55,-0.783552, 0.135366,2.55,-0.814374,
+ 0,2.55,-0.825, 0,2.5728,-0.6736, 0.110524,2.5728,-0.664924,
+ 0.110524,2.5728,-0.664924, 0.135366,2.55,-0.814374, 0,2.55,-0.825,
+ 0.957901,2.5272,-0.159223, 0.814374,2.55,-0.135366, 0.825,2.55,0,
+ 0.825,2.55,0, 0.9704,2.5272,0, 0.957901,2.5272,-0.159223,
+ 0.921647,2.5272,-0.309596, 0.783552,2.55,-0.263208, 0.814374,2.55,-0.135366,
+ 0.814374,2.55,-0.135366, 0.957901,2.5272,-0.159223, 0.921647,2.5272,-0.309596,
+ 0.863501,2.5272,-0.449256, 0.734118,2.55,-0.381942, 0.783552,2.55,-0.263208,
+ 0.783552,2.55,-0.263208, 0.921647,2.5272,-0.309596, 0.863501,2.5272,-0.449256,
+ 0.785325,2.5272,-0.57634, 0.667656,2.55,-0.489984, 0.734118,2.55,-0.381942,
+ 0.734118,2.55,-0.381942, 0.863501,2.5272,-0.449256, 0.785325,2.5272,-0.57634,
+ 0.688984,2.5272,-0.688984, 0.58575,2.55,-0.58575, 0.667656,2.55,-0.489984,
+ 0.667656,2.55,-0.489984, 0.785325,2.5272,-0.57634, 0.688984,2.5272,-0.688984,
+ 0.57634,2.5272,-0.785325, 0.489984,2.55,-0.667656, 0.58575,2.55,-0.58575,
+ 0.58575,2.55,-0.58575, 0.688984,2.5272,-0.688984, 0.57634,2.5272,-0.785325,
+ 0.449256,2.5272,-0.863501, 0.381942,2.55,-0.734118, 0.489984,2.55,-0.667656,
+ 0.489984,2.55,-0.667656, 0.57634,2.5272,-0.785325, 0.449256,2.5272,-0.863501,
+ 0.309596,2.5272,-0.921647, 0.263208,2.55,-0.783552, 0.381942,2.55,-0.734118,
+ 0.381942,2.55,-0.734118, 0.449256,2.5272,-0.863501, 0.309596,2.5272,-0.921647,
+ 0.159223,2.5272,-0.957901, 0.135366,2.55,-0.814374, 0.263208,2.55,-0.783552,
+ 0.263208,2.55,-0.783552, 0.309596,2.5272,-0.921647, 0.159223,2.5272,-0.957901,
+ 0,2.5272,-0.9704, 0,2.55,-0.825, 0.135366,2.55,-0.814374,
+ 0.135366,2.55,-0.814374, 0.159223,2.5272,-0.957901, 0,2.5272,-0.9704,
+ 1.086029,2.5026,-0.180521, 0.957901,2.5272,-0.159223, 0.9704,2.5272,0,
+ 0.9704,2.5272,0, 1.1002,2.5026,0, 1.086029,2.5026,-0.180521,
+ 1.044926,2.5026,-0.351008, 0.921647,2.5272,-0.309596, 0.957901,2.5272,-0.159223,
+ 0.957901,2.5272,-0.159223, 1.086029,2.5026,-0.180521, 1.044926,2.5026,-0.351008,
+ 0.979002,2.5026,-0.509349, 0.863501,2.5272,-0.449256, 0.921647,2.5272,-0.309596,
+ 0.921647,2.5272,-0.309596, 1.044926,2.5026,-0.351008, 0.979002,2.5026,-0.509349,
+ 0.89037,2.5026,-0.653431, 0.785325,2.5272,-0.57634, 0.863501,2.5272,-0.449256,
+ 0.863501,2.5272,-0.449256, 0.979002,2.5026,-0.509349, 0.89037,2.5026,-0.653431,
+ 0.781142,2.5026,-0.781142, 0.688984,2.5272,-0.688984, 0.785325,2.5272,-0.57634,
+ 0.785325,2.5272,-0.57634, 0.89037,2.5026,-0.653431, 0.781142,2.5026,-0.781142,
+ 0.653431,2.5026,-0.89037, 0.57634,2.5272,-0.785325, 0.688984,2.5272,-0.688984,
+ 0.688984,2.5272,-0.688984, 0.781142,2.5026,-0.781142, 0.653431,2.5026,-0.89037,
+ 0.509349,2.5026,-0.979002, 0.449256,2.5272,-0.863501, 0.57634,2.5272,-0.785325,
+ 0.57634,2.5272,-0.785325, 0.653431,2.5026,-0.89037, 0.509349,2.5026,-0.979002,
+ 0.351008,2.5026,-1.044926, 0.309596,2.5272,-0.921647, 0.449256,2.5272,-0.863501,
+ 0.449256,2.5272,-0.863501, 0.509349,2.5026,-0.979002, 0.351008,2.5026,-1.044926,
+ 0.180521,2.5026,-1.086029, 0.159223,2.5272,-0.957901, 0.309596,2.5272,-0.921647,
+ 0.309596,2.5272,-0.921647, 0.351008,2.5026,-1.044926, 0.180521,2.5026,-1.086029,
+ 0,2.5026,-1.1002, 0,2.5272,-0.9704, 0.159223,2.5272,-0.957901,
+ 0.159223,2.5272,-0.957901, 0.180521,2.5026,-1.086029, 0,2.5026,-1.1002,
+ 1.189282,2.4744,-0.197684, 1.086029,2.5026,-0.180521, 1.1002,2.5026,0,
+ 1.1002,2.5026,0, 1.2048,2.4744,0, 1.189282,2.4744,-0.197684,
+ 1.144271,2.4744,-0.384379, 1.044926,2.5026,-0.351008, 1.086029,2.5026,-0.180521,
+ 1.086029,2.5026,-0.180521, 1.189282,2.4744,-0.197684, 1.144271,2.4744,-0.384379,
+ 1.072079,2.4744,-0.557774, 0.979002,2.5026,-0.509349, 1.044926,2.5026,-0.351008,
+ 1.044926,2.5026,-0.351008, 1.144271,2.4744,-0.384379, 1.072079,2.4744,-0.557774,
+ 0.975021,2.4744,-0.715555, 0.89037,2.5026,-0.653431, 0.979002,2.5026,-0.509349,
+ 0.979002,2.5026,-0.509349, 1.072079,2.4744,-0.557774, 0.975021,2.4744,-0.715555,
+ 0.855408,2.4744,-0.855408, 0.781142,2.5026,-0.781142, 0.89037,2.5026,-0.653431,
+ 0.89037,2.5026,-0.653431, 0.975021,2.4744,-0.715555, 0.855408,2.4744,-0.855408,
+ 0.715555,2.4744,-0.975021, 0.653431,2.5026,-0.89037, 0.781142,2.5026,-0.781142,
+ 0.781142,2.5026,-0.781142, 0.855408,2.4744,-0.855408, 0.715555,2.4744,-0.975021,
+ 0.557774,2.4744,-1.072079, 0.509349,2.5026,-0.979002, 0.653431,2.5026,-0.89037,
+ 0.653431,2.5026,-0.89037, 0.715555,2.4744,-0.975021, 0.557774,2.4744,-1.072079,
+ 0.384379,2.4744,-1.144271, 0.351008,2.5026,-1.044926, 0.509349,2.5026,-0.979002,
+ 0.509349,2.5026,-0.979002, 0.557774,2.4744,-1.072079, 0.384379,2.4744,-1.144271,
+ 0.197684,2.4744,-1.189282, 0.180521,2.5026,-1.086029, 0.351008,2.5026,-1.044926,
+ 0.351008,2.5026,-1.044926, 0.384379,2.4744,-1.144271, 0.197684,2.4744,-1.189282,
+ 0,2.4744,-1.2048, 0,2.5026,-1.1002, 0.180521,2.5026,-1.086029,
+ 0.180521,2.5026,-1.086029, 0.197684,2.4744,-1.189282, 0,2.4744,-1.2048,
+ 1.258183,2.4408,-0.209136, 1.189282,2.4744,-0.197684, 1.2048,2.4744,0,
+ 1.2048,2.4744,0, 1.2746,2.4408,0, 1.258183,2.4408,-0.209136,
+ 1.210564,2.4408,-0.406648, 1.144271,2.4744,-0.384379, 1.189282,2.4744,-0.197684,
+ 1.189282,2.4744,-0.197684, 1.258183,2.4408,-0.209136, 1.210564,2.4408,-0.406648,
+ 1.13419,2.4408,-0.590089, 1.072079,2.4744,-0.557774, 1.144271,2.4744,-0.384379,
+ 1.144271,2.4744,-0.384379, 1.210564,2.4408,-0.406648, 1.13419,2.4408,-0.590089,
+ 1.031508,2.4408,-0.75701, 0.975021,2.4744,-0.715555, 1.072079,2.4744,-0.557774,
+ 1.072079,2.4744,-0.557774, 1.13419,2.4408,-0.590089, 1.031508,2.4408,-0.75701,
+ 0.904966,2.4408,-0.904966, 0.855408,2.4744,-0.855408, 0.975021,2.4744,-0.715555,
+ 0.975021,2.4744,-0.715555, 1.031508,2.4408,-0.75701, 0.904966,2.4408,-0.904966,
+ 0.75701,2.4408,-1.031508, 0.715555,2.4744,-0.975021, 0.855408,2.4744,-0.855408,
+ 0.855408,2.4744,-0.855408, 0.904966,2.4408,-0.904966, 0.75701,2.4408,-1.031508,
+ 0.590089,2.4408,-1.13419, 0.557774,2.4744,-1.072079, 0.715555,2.4744,-0.975021,
+ 0.715555,2.4744,-0.975021, 0.75701,2.4408,-1.031508, 0.590089,2.4408,-1.13419,
+ 0.406648,2.4408,-1.210564, 0.384379,2.4744,-1.144271, 0.557774,2.4744,-1.072079,
+ 0.557774,2.4744,-1.072079, 0.590089,2.4408,-1.13419, 0.406648,2.4408,-1.210564,
+ 0.209136,2.4408,-1.258183, 0.197684,2.4744,-1.189282, 0.384379,2.4744,-1.144271,
+ 0.384379,2.4744,-1.144271, 0.406648,2.4408,-1.210564, 0.209136,2.4408,-1.258183,
+ 0,2.4408,-1.2746, 0,2.4744,-1.2048, 0.197684,2.4744,-1.189282,
+ 0.197684,2.4744,-1.189282, 0.209136,2.4408,-1.258183, 0,2.4408,-1.2746,
+ 1.283256,2.4,-0.213304, 1.258183,2.4408,-0.209136, 1.2746,2.4408,0,
+ 1.2746,2.4408,0, 1.3,2.4,0, 1.283256,2.4,-0.213304,
+ 1.234688,2.4,-0.414752, 1.210564,2.4408,-0.406648, 1.258183,2.4408,-0.209136,
+ 1.258183,2.4408,-0.209136, 1.283256,2.4,-0.213304, 1.234688,2.4,-0.414752,
+ 1.156792,2.4,-0.601848, 1.13419,2.4408,-0.590089, 1.210564,2.4408,-0.406648,
+ 1.210564,2.4408,-0.406648, 1.234688,2.4,-0.414752, 1.156792,2.4,-0.601848,
+ 1.052064,2.4,-0.772096, 1.031508,2.4408,-0.75701, 1.13419,2.4408,-0.590089,
+ 1.13419,2.4408,-0.590089, 1.156792,2.4,-0.601848, 1.052064,2.4,-0.772096,
+ 0.923,2.4,-0.923, 0.904966,2.4408,-0.904966, 1.031508,2.4408,-0.75701,
+ 1.031508,2.4408,-0.75701, 1.052064,2.4,-0.772096, 0.923,2.4,-0.923,
+ 0.772096,2.4,-1.052064, 0.75701,2.4408,-1.031508, 0.904966,2.4408,-0.904966,
+ 0.904966,2.4408,-0.904966, 0.923,2.4,-0.923, 0.772096,2.4,-1.052064,
+ 0.601848,2.4,-1.156792, 0.590089,2.4408,-1.13419, 0.75701,2.4408,-1.031508,
+ 0.75701,2.4408,-1.031508, 0.772096,2.4,-1.052064, 0.601848,2.4,-1.156792,
+ 0.414752,2.4,-1.234688, 0.406648,2.4408,-1.210564, 0.590089,2.4408,-1.13419,
+ 0.590089,2.4408,-1.13419, 0.601848,2.4,-1.156792, 0.414752,2.4,-1.234688,
+ 0.213304,2.4,-1.283256, 0.209136,2.4408,-1.258183, 0.406648,2.4408,-1.210564,
+ 0.406648,2.4408,-1.210564, 0.414752,2.4,-1.234688, 0.213304,2.4,-1.283256,
+ 0,2.4,-1.3, 0,2.4408,-1.2746, 0.209136,2.4408,-1.258183,
+ 0.209136,2.4408,-1.258183, 0.213304,2.4,-1.283256, 0,2.4,-1.3,
+ -0.045844,2.6592,-0.275801, -0.032816,2.7,-0.197424, 0,2.7,-0.2,
+ 0,2.7,-0.2, 0,2.6592,-0.2794, -0.045844,2.6592,-0.275801,
+ -0.08914,2.6592,-0.265363, -0.063808,2.7,-0.189952, -0.032816,2.7,-0.197424,
+ -0.032816,2.7,-0.197424, -0.045844,2.6592,-0.275801, -0.08914,2.6592,-0.265363,
+ -0.129351,2.6592,-0.248621, -0.092592,2.7,-0.177968, -0.063808,2.7,-0.189952,
+ -0.063808,2.7,-0.189952, -0.08914,2.6592,-0.265363, -0.129351,2.6592,-0.248621,
+ -0.165941,2.6592,-0.226113, -0.118784,2.7,-0.161856, -0.092592,2.7,-0.177968,
+ -0.092592,2.7,-0.177968, -0.129351,2.6592,-0.248621, -0.165941,2.6592,-0.226113,
+ -0.198374,2.6592,-0.198374, -0.142,2.7,-0.142, -0.118784,2.7,-0.161856,
+ -0.118784,2.7,-0.161856, -0.165941,2.6592,-0.226113, -0.198374,2.6592,-0.198374,
+ -0.226113,2.6592,-0.165941, -0.161856,2.7,-0.118784, -0.142,2.7,-0.142,
+ -0.142,2.7,-0.142, -0.198374,2.6592,-0.198374, -0.226113,2.6592,-0.165941,
+ -0.248621,2.6592,-0.129351, -0.177968,2.7,-0.092592, -0.161856,2.7,-0.118784,
+ -0.161856,2.7,-0.118784, -0.226113,2.6592,-0.165941, -0.248621,2.6592,-0.129351,
+ -0.265363,2.6592,-0.08914, -0.189952,2.7,-0.063808, -0.177968,2.7,-0.092592,
+ -0.177968,2.7,-0.092592, -0.248621,2.6592,-0.129351, -0.265363,2.6592,-0.08914,
+ -0.275801,2.6592,-0.045844, -0.197424,2.7,-0.032816, -0.189952,2.7,-0.063808,
+ -0.189952,2.7,-0.063808, -0.265363,2.6592,-0.08914, -0.275801,2.6592,-0.045844,
+ -0.2794,2.6592,0, -0.2,2.7,0, -0.197424,2.7,-0.032816,
+ -0.197424,2.7,-0.032816, -0.275801,2.6592,-0.045844, -0.2794,2.6592,0,
+ -0.064188,2.6256,-0.386161, -0.045844,2.6592,-0.275801, 0,2.6592,-0.2794,
+ 0,2.6592,-0.2794, 0,2.6256,-0.3912, -0.064188,2.6256,-0.386161,
+ -0.124808,2.6256,-0.371546, -0.08914,2.6592,-0.265363, -0.045844,2.6592,-0.275801,
+ -0.045844,2.6592,-0.275801, -0.064188,2.6256,-0.386161, -0.124808,2.6256,-0.371546,
+ -0.18111,2.6256,-0.348105, -0.129351,2.6592,-0.248621, -0.08914,2.6592,-0.265363,
+ -0.08914,2.6592,-0.265363, -0.124808,2.6256,-0.371546, -0.18111,2.6256,-0.348105,
+ -0.232342,2.6256,-0.31659, -0.165941,2.6592,-0.226113, -0.129351,2.6592,-0.248621,
+ -0.129351,2.6592,-0.248621, -0.18111,2.6256,-0.348105, -0.232342,2.6256,-0.31659,
+ -0.277752,2.6256,-0.277752, -0.198374,2.6592,-0.198374, -0.165941,2.6592,-0.226113,
+ -0.165941,2.6592,-0.226113, -0.232342,2.6256,-0.31659, -0.277752,2.6256,-0.277752,
+ -0.31659,2.6256,-0.232342, -0.226113,2.6592,-0.165941, -0.198374,2.6592,-0.198374,
+ -0.198374,2.6592,-0.198374, -0.277752,2.6256,-0.277752, -0.31659,2.6256,-0.232342,
+ -0.348105,2.6256,-0.18111, -0.248621,2.6592,-0.129351, -0.226113,2.6592,-0.165941,
+ -0.226113,2.6592,-0.165941, -0.31659,2.6256,-0.232342, -0.348105,2.6256,-0.18111,
+ -0.371546,2.6256,-0.124808, -0.265363,2.6592,-0.08914, -0.248621,2.6592,-0.129351,
+ -0.248621,2.6592,-0.129351, -0.348105,2.6256,-0.18111, -0.371546,2.6256,-0.124808,
+ -0.386161,2.6256,-0.064188, -0.275801,2.6592,-0.045844, -0.265363,2.6592,-0.08914,
+ -0.265363,2.6592,-0.08914, -0.371546,2.6256,-0.124808, -0.386161,2.6256,-0.064188,
+ -0.3912,2.6256,0, -0.2794,2.6592,0, -0.275801,2.6592,-0.045844,
+ -0.275801,2.6592,-0.045844, -0.386161,2.6256,-0.064188, -0.3912,2.6256,0,
+ -0.086273,2.5974,-0.519028, -0.064188,2.6256,-0.386161, 0,2.6256,-0.3912,
+ 0,2.6256,-0.3912, 0,2.5974,-0.5258, -0.086273,2.5974,-0.519028,
+ -0.167751,2.5974,-0.499384, -0.124808,2.6256,-0.371546, -0.064188,2.6256,-0.386161,
+ -0.064188,2.6256,-0.386161, -0.086273,2.5974,-0.519028, -0.167751,2.5974,-0.499384,
+ -0.243424,2.5974,-0.467878, -0.18111,2.6256,-0.348105, -0.124808,2.6256,-0.371546,
+ -0.124808,2.6256,-0.371546, -0.167751,2.5974,-0.499384, -0.243424,2.5974,-0.467878,
+ -0.312283,2.5974,-0.425519, -0.232342,2.6256,-0.31659, -0.18111,2.6256,-0.348105,
+ -0.18111,2.6256,-0.348105, -0.243424,2.5974,-0.467878, -0.312283,2.5974,-0.425519,
+ -0.373318,2.5974,-0.373318, -0.277752,2.6256,-0.277752, -0.232342,2.6256,-0.31659,
+ -0.232342,2.6256,-0.31659, -0.312283,2.5974,-0.425519, -0.373318,2.5974,-0.373318,
+ -0.425519,2.5974,-0.312283, -0.31659,2.6256,-0.232342, -0.277752,2.6256,-0.277752,
+ -0.277752,2.6256,-0.277752, -0.373318,2.5974,-0.373318, -0.425519,2.5974,-0.312283,
+ -0.467878,2.5974,-0.243424, -0.348105,2.6256,-0.18111, -0.31659,2.6256,-0.232342,
+ -0.31659,2.6256,-0.232342, -0.425519,2.5974,-0.312283, -0.467878,2.5974,-0.243424,
+ -0.499384,2.5974,-0.167751, -0.371546,2.6256,-0.124808, -0.348105,2.6256,-0.18111,
+ -0.348105,2.6256,-0.18111, -0.467878,2.5974,-0.243424, -0.499384,2.5974,-0.167751,
+ -0.519028,2.5974,-0.086273, -0.386161,2.6256,-0.064188, -0.371546,2.6256,-0.124808,
+ -0.371546,2.6256,-0.124808, -0.499384,2.5974,-0.167751, -0.519028,2.5974,-0.086273,
+ -0.5258,2.5974,0, -0.3912,2.6256,0, -0.386161,2.6256,-0.064188,
+ -0.386161,2.6256,-0.064188, -0.519028,2.5974,-0.086273, -0.5258,2.5974,0,
+ -0.110524,2.5728,-0.664924, -0.086273,2.5974,-0.519028, 0,2.5974,-0.5258,
+ 0,2.5974,-0.5258, 0,2.5728,-0.6736, -0.110524,2.5728,-0.664924,
+ -0.214905,2.5728,-0.639758, -0.167751,2.5974,-0.499384, -0.086273,2.5974,-0.519028,
+ -0.086273,2.5974,-0.519028, -0.110524,2.5728,-0.664924, -0.214905,2.5728,-0.639758,
+ -0.31185,2.5728,-0.599396, -0.243424,2.5974,-0.467878, -0.167751,2.5974,-0.499384,
+ -0.167751,2.5974,-0.499384, -0.214905,2.5728,-0.639758, -0.31185,2.5728,-0.599396,
+ -0.400065,2.5728,-0.545131, -0.312283,2.5974,-0.425519, -0.243424,2.5974,-0.467878,
+ -0.243424,2.5974,-0.467878, -0.31185,2.5728,-0.599396, -0.400065,2.5728,-0.545131,
+ -0.478256,2.5728,-0.478256, -0.373318,2.5974,-0.373318, -0.312283,2.5974,-0.425519,
+ -0.312283,2.5974,-0.425519, -0.400065,2.5728,-0.545131, -0.478256,2.5728,-0.478256,
+ -0.545131,2.5728,-0.400065, -0.425519,2.5974,-0.312283, -0.373318,2.5974,-0.373318,
+ -0.373318,2.5974,-0.373318, -0.478256,2.5728,-0.478256, -0.545131,2.5728,-0.400065,
+ -0.599396,2.5728,-0.31185, -0.467878,2.5974,-0.243424, -0.425519,2.5974,-0.312283,
+ -0.425519,2.5974,-0.312283, -0.545131,2.5728,-0.400065, -0.599396,2.5728,-0.31185,
+ -0.639758,2.5728,-0.214905, -0.499384,2.5974,-0.167751, -0.467878,2.5974,-0.243424,
+ -0.467878,2.5974,-0.243424, -0.599396,2.5728,-0.31185, -0.639758,2.5728,-0.214905,
+ -0.664924,2.5728,-0.110524, -0.519028,2.5974,-0.086273, -0.499384,2.5974,-0.167751,
+ -0.499384,2.5974,-0.167751, -0.639758,2.5728,-0.214905, -0.664924,2.5728,-0.110524,
+ -0.6736,2.5728,0, -0.5258,2.5974,0, -0.519028,2.5974,-0.086273,
+ -0.519028,2.5974,-0.086273, -0.664924,2.5728,-0.110524, -0.6736,2.5728,0,
+ -0.135366,2.55,-0.814374, -0.110524,2.5728,-0.664924, 0,2.5728,-0.6736,
+ 0,2.5728,-0.6736, 0,2.55,-0.825, -0.135366,2.55,-0.814374,
+ -0.263208,2.55,-0.783552, -0.214905,2.5728,-0.639758, -0.110524,2.5728,-0.664924,
+ -0.110524,2.5728,-0.664924, -0.135366,2.55,-0.814374, -0.263208,2.55,-0.783552,
+ -0.381942,2.55,-0.734118, -0.31185,2.5728,-0.599396, -0.214905,2.5728,-0.639758,
+ -0.214905,2.5728,-0.639758, -0.263208,2.55,-0.783552, -0.381942,2.55,-0.734118,
+ -0.489984,2.55,-0.667656, -0.400065,2.5728,-0.545131, -0.31185,2.5728,-0.599396,
+ -0.31185,2.5728,-0.599396, -0.381942,2.55,-0.734118, -0.489984,2.55,-0.667656,
+ -0.58575,2.55,-0.58575, -0.478256,2.5728,-0.478256, -0.400065,2.5728,-0.545131,
+ -0.400065,2.5728,-0.545131, -0.489984,2.55,-0.667656, -0.58575,2.55,-0.58575,
+ -0.667656,2.55,-0.489984, -0.545131,2.5728,-0.400065, -0.478256,2.5728,-0.478256,
+ -0.478256,2.5728,-0.478256, -0.58575,2.55,-0.58575, -0.667656,2.55,-0.489984,
+ -0.734118,2.55,-0.381942, -0.599396,2.5728,-0.31185, -0.545131,2.5728,-0.400065,
+ -0.545131,2.5728,-0.400065, -0.667656,2.55,-0.489984, -0.734118,2.55,-0.381942,
+ -0.783552,2.55,-0.263208, -0.639758,2.5728,-0.214905, -0.599396,2.5728,-0.31185,
+ -0.599396,2.5728,-0.31185, -0.734118,2.55,-0.381942, -0.783552,2.55,-0.263208,
+ -0.814374,2.55,-0.135366, -0.664924,2.5728,-0.110524, -0.639758,2.5728,-0.214905,
+ -0.639758,2.5728,-0.214905, -0.783552,2.55,-0.263208, -0.814374,2.55,-0.135366,
+ -0.825,2.55,0, -0.6736,2.5728,0, -0.664924,2.5728,-0.110524,
+ -0.664924,2.5728,-0.110524, -0.814374,2.55,-0.135366, -0.825,2.55,0,
+ -0.159223,2.5272,-0.957901, -0.135366,2.55,-0.814374, 0,2.55,-0.825,
+ 0,2.55,-0.825, 0,2.5272,-0.9704, -0.159223,2.5272,-0.957901,
+ -0.309596,2.5272,-0.921647, -0.263208,2.55,-0.783552, -0.135366,2.55,-0.814374,
+ -0.135366,2.55,-0.814374, -0.159223,2.5272,-0.957901, -0.309596,2.5272,-0.921647,
+ -0.449256,2.5272,-0.863501, -0.381942,2.55,-0.734118, -0.263208,2.55,-0.783552,
+ -0.263208,2.55,-0.783552, -0.309596,2.5272,-0.921647, -0.449256,2.5272,-0.863501,
+ -0.57634,2.5272,-0.785325, -0.489984,2.55,-0.667656, -0.381942,2.55,-0.734118,
+ -0.381942,2.55,-0.734118, -0.449256,2.5272,-0.863501, -0.57634,2.5272,-0.785325,
+ -0.688984,2.5272,-0.688984, -0.58575,2.55,-0.58575, -0.489984,2.55,-0.667656,
+ -0.489984,2.55,-0.667656, -0.57634,2.5272,-0.785325, -0.688984,2.5272,-0.688984,
+ -0.785325,2.5272,-0.57634, -0.667656,2.55,-0.489984, -0.58575,2.55,-0.58575,
+ -0.58575,2.55,-0.58575, -0.688984,2.5272,-0.688984, -0.785325,2.5272,-0.57634,
+ -0.863501,2.5272,-0.449256, -0.734118,2.55,-0.381942, -0.667656,2.55,-0.489984,
+ -0.667656,2.55,-0.489984, -0.785325,2.5272,-0.57634, -0.863501,2.5272,-0.449256,
+ -0.921647,2.5272,-0.309596, -0.783552,2.55,-0.263208, -0.734118,2.55,-0.381942,
+ -0.734118,2.55,-0.381942, -0.863501,2.5272,-0.449256, -0.921647,2.5272,-0.309596,
+ -0.957901,2.5272,-0.159223, -0.814374,2.55,-0.135366, -0.783552,2.55,-0.263208,
+ -0.783552,2.55,-0.263208, -0.921647,2.5272,-0.309596, -0.957901,2.5272,-0.159223,
+ -0.9704,2.5272,0, -0.825,2.55,0, -0.814374,2.55,-0.135366,
+ -0.814374,2.55,-0.135366, -0.957901,2.5272,-0.159223, -0.9704,2.5272,0,
+ -0.180521,2.5026,-1.086029, -0.159223,2.5272,-0.957901, 0,2.5272,-0.9704,
+ 0,2.5272,-0.9704, 0,2.5026,-1.1002, -0.180521,2.5026,-1.086029,
+ -0.351008,2.5026,-1.044926, -0.309596,2.5272,-0.921647, -0.159223,2.5272,-0.957901,
+ -0.159223,2.5272,-0.957901, -0.180521,2.5026,-1.086029, -0.351008,2.5026,-1.044926,
+ -0.509349,2.5026,-0.979002, -0.449256,2.5272,-0.863501, -0.309596,2.5272,-0.921647,
+ -0.309596,2.5272,-0.921647, -0.351008,2.5026,-1.044926, -0.509349,2.5026,-0.979002,
+ -0.653431,2.5026,-0.89037, -0.57634,2.5272,-0.785325, -0.449256,2.5272,-0.863501,
+ -0.449256,2.5272,-0.863501, -0.509349,2.5026,-0.979002, -0.653431,2.5026,-0.89037,
+ -0.781142,2.5026,-0.781142, -0.688984,2.5272,-0.688984, -0.57634,2.5272,-0.785325,
+ -0.57634,2.5272,-0.785325, -0.653431,2.5026,-0.89037, -0.781142,2.5026,-0.781142,
+ -0.89037,2.5026,-0.653431, -0.785325,2.5272,-0.57634, -0.688984,2.5272,-0.688984,
+ -0.688984,2.5272,-0.688984, -0.781142,2.5026,-0.781142, -0.89037,2.5026,-0.653431,
+ -0.979002,2.5026,-0.509349, -0.863501,2.5272,-0.449256, -0.785325,2.5272,-0.57634,
+ -0.785325,2.5272,-0.57634, -0.89037,2.5026,-0.653431, -0.979002,2.5026,-0.509349,
+ -1.044926,2.5026,-0.351008, -0.921647,2.5272,-0.309596, -0.863501,2.5272,-0.449256,
+ -0.863501,2.5272,-0.449256, -0.979002,2.5026,-0.509349, -1.044926,2.5026,-0.351008,
+ -1.086029,2.5026,-0.180521, -0.957901,2.5272,-0.159223, -0.921647,2.5272,-0.309596,
+ -0.921647,2.5272,-0.309596, -1.044926,2.5026,-0.351008, -1.086029,2.5026,-0.180521,
+ -1.1002,2.5026,0, -0.9704,2.5272,0, -0.957901,2.5272,-0.159223,
+ -0.957901,2.5272,-0.159223, -1.086029,2.5026,-0.180521, -1.1002,2.5026,0,
+ -0.197684,2.4744,-1.189282, -0.180521,2.5026,-1.086029, 0,2.5026,-1.1002,
+ 0,2.5026,-1.1002, 0,2.4744,-1.2048, -0.197684,2.4744,-1.189282,
+ -0.384379,2.4744,-1.144271, -0.351008,2.5026,-1.044926, -0.180521,2.5026,-1.086029,
+ -0.180521,2.5026,-1.086029, -0.197684,2.4744,-1.189282, -0.384379,2.4744,-1.144271,
+ -0.557774,2.4744,-1.072079, -0.509349,2.5026,-0.979002, -0.351008,2.5026,-1.044926,
+ -0.351008,2.5026,-1.044926, -0.384379,2.4744,-1.144271, -0.557774,2.4744,-1.072079,
+ -0.715555,2.4744,-0.975021, -0.653431,2.5026,-0.89037, -0.509349,2.5026,-0.979002,
+ -0.509349,2.5026,-0.979002, -0.557774,2.4744,-1.072079, -0.715555,2.4744,-0.975021,
+ -0.855408,2.4744,-0.855408, -0.781142,2.5026,-0.781142, -0.653431,2.5026,-0.89037,
+ -0.653431,2.5026,-0.89037, -0.715555,2.4744,-0.975021, -0.855408,2.4744,-0.855408,
+ -0.975021,2.4744,-0.715555, -0.89037,2.5026,-0.653431, -0.781142,2.5026,-0.781142,
+ -0.781142,2.5026,-0.781142, -0.855408,2.4744,-0.855408, -0.975021,2.4744,-0.715555,
+ -1.072079,2.4744,-0.557774, -0.979002,2.5026,-0.509349, -0.89037,2.5026,-0.653431,
+ -0.89037,2.5026,-0.653431, -0.975021,2.4744,-0.715555, -1.072079,2.4744,-0.557774,
+ -1.144271,2.4744,-0.384379, -1.044926,2.5026,-0.351008, -0.979002,2.5026,-0.509349,
+ -0.979002,2.5026,-0.509349, -1.072079,2.4744,-0.557774, -1.144271,2.4744,-0.384379,
+ -1.189282,2.4744,-0.197684, -1.086029,2.5026,-0.180521, -1.044926,2.5026,-0.351008,
+ -1.044926,2.5026,-0.351008, -1.144271,2.4744,-0.384379, -1.189282,2.4744,-0.197684,
+ -1.2048,2.4744,0, -1.1002,2.5026,0, -1.086029,2.5026,-0.180521,
+ -1.086029,2.5026,-0.180521, -1.189282,2.4744,-0.197684, -1.2048,2.4744,0,
+ -0.209136,2.4408,-1.258183, -0.197684,2.4744,-1.189282, 0,2.4744,-1.2048,
+ 0,2.4744,-1.2048, 0,2.4408,-1.2746, -0.209136,2.4408,-1.258183,
+ -0.406648,2.4408,-1.210564, -0.384379,2.4744,-1.144271, -0.197684,2.4744,-1.189282,
+ -0.197684,2.4744,-1.189282, -0.209136,2.4408,-1.258183, -0.406648,2.4408,-1.210564,
+ -0.590089,2.4408,-1.13419, -0.557774,2.4744,-1.072079, -0.384379,2.4744,-1.144271,
+ -0.384379,2.4744,-1.144271, -0.406648,2.4408,-1.210564, -0.590089,2.4408,-1.13419,
+ -0.75701,2.4408,-1.031508, -0.715555,2.4744,-0.975021, -0.557774,2.4744,-1.072079,
+ -0.557774,2.4744,-1.072079, -0.590089,2.4408,-1.13419, -0.75701,2.4408,-1.031508,
+ -0.904966,2.4408,-0.904966, -0.855408,2.4744,-0.855408, -0.715555,2.4744,-0.975021,
+ -0.715555,2.4744,-0.975021, -0.75701,2.4408,-1.031508, -0.904966,2.4408,-0.904966,
+ -1.031508,2.4408,-0.75701, -0.975021,2.4744,-0.715555, -0.855408,2.4744,-0.855408,
+ -0.855408,2.4744,-0.855408, -0.904966,2.4408,-0.904966, -1.031508,2.4408,-0.75701,
+ -1.13419,2.4408,-0.590089, -1.072079,2.4744,-0.557774, -0.975021,2.4744,-0.715555,
+ -0.975021,2.4744,-0.715555, -1.031508,2.4408,-0.75701, -1.13419,2.4408,-0.590089,
+ -1.210564,2.4408,-0.406648, -1.144271,2.4744,-0.384379, -1.072079,2.4744,-0.557774,
+ -1.072079,2.4744,-0.557774, -1.13419,2.4408,-0.590089, -1.210564,2.4408,-0.406648,
+ -1.258183,2.4408,-0.209136, -1.189282,2.4744,-0.197684, -1.144271,2.4744,-0.384379,
+ -1.144271,2.4744,-0.384379, -1.210564,2.4408,-0.406648, -1.258183,2.4408,-0.209136,
+ -1.2746,2.4408,0, -1.2048,2.4744,0, -1.189282,2.4744,-0.197684,
+ -1.189282,2.4744,-0.197684, -1.258183,2.4408,-0.209136, -1.2746,2.4408,0,
+ -0.213304,2.4,-1.283256, -0.209136,2.4408,-1.258183, 0,2.4408,-1.2746,
+ 0,2.4408,-1.2746, 0,2.4,-1.3, -0.213304,2.4,-1.283256,
+ -0.414752,2.4,-1.234688, -0.406648,2.4408,-1.210564, -0.209136,2.4408,-1.258183,
+ -0.209136,2.4408,-1.258183, -0.213304,2.4,-1.283256, -0.414752,2.4,-1.234688,
+ -0.601848,2.4,-1.156792, -0.590089,2.4408,-1.13419, -0.406648,2.4408,-1.210564,
+ -0.406648,2.4408,-1.210564, -0.414752,2.4,-1.234688, -0.601848,2.4,-1.156792,
+ -0.772096,2.4,-1.052064, -0.75701,2.4408,-1.031508, -0.590089,2.4408,-1.13419,
+ -0.590089,2.4408,-1.13419, -0.601848,2.4,-1.156792, -0.772096,2.4,-1.052064,
+ -0.923,2.4,-0.923, -0.904966,2.4408,-0.904966, -0.75701,2.4408,-1.031508,
+ -0.75701,2.4408,-1.031508, -0.772096,2.4,-1.052064, -0.923,2.4,-0.923,
+ -1.052064,2.4,-0.772096, -1.031508,2.4408,-0.75701, -0.904966,2.4408,-0.904966,
+ -0.904966,2.4408,-0.904966, -0.923,2.4,-0.923, -1.052064,2.4,-0.772096,
+ -1.156792,2.4,-0.601848, -1.13419,2.4408,-0.590089, -1.031508,2.4408,-0.75701,
+ -1.031508,2.4408,-0.75701, -1.052064,2.4,-0.772096, -1.156792,2.4,-0.601848,
+ -1.234688,2.4,-0.414752, -1.210564,2.4408,-0.406648, -1.13419,2.4408,-0.590089,
+ -1.13419,2.4408,-0.590089, -1.156792,2.4,-0.601848, -1.234688,2.4,-0.414752,
+ -1.283256,2.4,-0.213304, -1.258183,2.4408,-0.209136, -1.210564,2.4408,-0.406648,
+ -1.210564,2.4408,-0.406648, -1.234688,2.4,-0.414752, -1.283256,2.4,-0.213304,
+ -1.3,2.4,0, -1.2746,2.4408,0, -1.258183,2.4408,-0.209136,
+ -1.258183,2.4408,-0.209136, -1.283256,2.4,-0.213304, -1.3,2.4,0,
+ -0.275801,2.6592,0.045844, -0.197424,2.7,0.032816, -0.2,2.7,0,
+ -0.2,2.7,0, -0.2794,2.6592,0, -0.275801,2.6592,0.045844,
+ -0.265363,2.6592,0.08914, -0.189952,2.7,0.063808, -0.197424,2.7,0.032816,
+ -0.197424,2.7,0.032816, -0.275801,2.6592,0.045844, -0.265363,2.6592,0.08914,
+ -0.248621,2.6592,0.129351, -0.177968,2.7,0.092592, -0.189952,2.7,0.063808,
+ -0.189952,2.7,0.063808, -0.265363,2.6592,0.08914, -0.248621,2.6592,0.129351,
+ -0.226113,2.6592,0.165941, -0.161856,2.7,0.118784, -0.177968,2.7,0.092592,
+ -0.177968,2.7,0.092592, -0.248621,2.6592,0.129351, -0.226113,2.6592,0.165941,
+ -0.198374,2.6592,0.198374, -0.142,2.7,0.142, -0.161856,2.7,0.118784,
+ -0.161856,2.7,0.118784, -0.226113,2.6592,0.165941, -0.198374,2.6592,0.198374,
+ -0.165941,2.6592,0.226113, -0.118784,2.7,0.161856, -0.142,2.7,0.142,
+ -0.142,2.7,0.142, -0.198374,2.6592,0.198374, -0.165941,2.6592,0.226113,
+ -0.129351,2.6592,0.248621, -0.092592,2.7,0.177968, -0.118784,2.7,0.161856,
+ -0.118784,2.7,0.161856, -0.165941,2.6592,0.226113, -0.129351,2.6592,0.248621,
+ -0.08914,2.6592,0.265363, -0.063808,2.7,0.189952, -0.092592,2.7,0.177968,
+ -0.092592,2.7,0.177968, -0.129351,2.6592,0.248621, -0.08914,2.6592,0.265363,
+ -0.045844,2.6592,0.275801, -0.032816,2.7,0.197424, -0.063808,2.7,0.189952,
+ -0.063808,2.7,0.189952, -0.08914,2.6592,0.265363, -0.045844,2.6592,0.275801,
+ 0,2.6592,0.2794, 0,2.7,0.2, -0.032816,2.7,0.197424,
+ -0.032816,2.7,0.197424, -0.045844,2.6592,0.275801, 0,2.6592,0.2794,
+ -0.386161,2.6256,0.064188, -0.275801,2.6592,0.045844, -0.2794,2.6592,0,
+ -0.2794,2.6592,0, -0.3912,2.6256,0, -0.386161,2.6256,0.064188,
+ -0.371546,2.6256,0.124808, -0.265363,2.6592,0.08914, -0.275801,2.6592,0.045844,
+ -0.275801,2.6592,0.045844, -0.386161,2.6256,0.064188, -0.371546,2.6256,0.124808,
+ -0.348105,2.6256,0.18111, -0.248621,2.6592,0.129351, -0.265363,2.6592,0.08914,
+ -0.265363,2.6592,0.08914, -0.371546,2.6256,0.124808, -0.348105,2.6256,0.18111,
+ -0.31659,2.6256,0.232342, -0.226113,2.6592,0.165941, -0.248621,2.6592,0.129351,
+ -0.248621,2.6592,0.129351, -0.348105,2.6256,0.18111, -0.31659,2.6256,0.232342,
+ -0.277752,2.6256,0.277752, -0.198374,2.6592,0.198374, -0.226113,2.6592,0.165941,
+ -0.226113,2.6592,0.165941, -0.31659,2.6256,0.232342, -0.277752,2.6256,0.277752,
+ -0.232342,2.6256,0.31659, -0.165941,2.6592,0.226113, -0.198374,2.6592,0.198374,
+ -0.198374,2.6592,0.198374, -0.277752,2.6256,0.277752, -0.232342,2.6256,0.31659,
+ -0.18111,2.6256,0.348105, -0.129351,2.6592,0.248621, -0.165941,2.6592,0.226113,
+ -0.165941,2.6592,0.226113, -0.232342,2.6256,0.31659, -0.18111,2.6256,0.348105,
+ -0.124808,2.6256,0.371546, -0.08914,2.6592,0.265363, -0.129351,2.6592,0.248621,
+ -0.129351,2.6592,0.248621, -0.18111,2.6256,0.348105, -0.124808,2.6256,0.371546,
+ -0.064188,2.6256,0.386161, -0.045844,2.6592,0.275801, -0.08914,2.6592,0.265363,
+ -0.08914,2.6592,0.265363, -0.124808,2.6256,0.371546, -0.064188,2.6256,0.386161,
+ 0,2.6256,0.3912, 0,2.6592,0.2794, -0.045844,2.6592,0.275801,
+ -0.045844,2.6592,0.275801, -0.064188,2.6256,0.386161, 0,2.6256,0.3912,
+ -0.519028,2.5974,0.086273, -0.386161,2.6256,0.064188, -0.3912,2.6256,0,
+ -0.3912,2.6256,0, -0.5258,2.5974,0, -0.519028,2.5974,0.086273,
+ -0.499384,2.5974,0.167751, -0.371546,2.6256,0.124808, -0.386161,2.6256,0.064188,
+ -0.386161,2.6256,0.064188, -0.519028,2.5974,0.086273, -0.499384,2.5974,0.167751,
+ -0.467878,2.5974,0.243424, -0.348105,2.6256,0.18111, -0.371546,2.6256,0.124808,
+ -0.371546,2.6256,0.124808, -0.499384,2.5974,0.167751, -0.467878,2.5974,0.243424,
+ -0.425519,2.5974,0.312283, -0.31659,2.6256,0.232342, -0.348105,2.6256,0.18111,
+ -0.348105,2.6256,0.18111, -0.467878,2.5974,0.243424, -0.425519,2.5974,0.312283,
+ -0.373318,2.5974,0.373318, -0.277752,2.6256,0.277752, -0.31659,2.6256,0.232342,
+ -0.31659,2.6256,0.232342, -0.425519,2.5974,0.312283, -0.373318,2.5974,0.373318,
+ -0.312283,2.5974,0.425519, -0.232342,2.6256,0.31659, -0.277752,2.6256,0.277752,
+ -0.277752,2.6256,0.277752, -0.373318,2.5974,0.373318, -0.312283,2.5974,0.425519,
+ -0.243424,2.5974,0.467878, -0.18111,2.6256,0.348105, -0.232342,2.6256,0.31659,
+ -0.232342,2.6256,0.31659, -0.312283,2.5974,0.425519, -0.243424,2.5974,0.467878,
+ -0.167751,2.5974,0.499384, -0.124808,2.6256,0.371546, -0.18111,2.6256,0.348105,
+ -0.18111,2.6256,0.348105, -0.243424,2.5974,0.467878, -0.167751,2.5974,0.499384,
+ -0.086273,2.5974,0.519028, -0.064188,2.6256,0.386161, -0.124808,2.6256,0.371546,
+ -0.124808,2.6256,0.371546, -0.167751,2.5974,0.499384, -0.086273,2.5974,0.519028,
+ 0,2.5974,0.5258, 0,2.6256,0.3912, -0.064188,2.6256,0.386161,
+ -0.064188,2.6256,0.386161, -0.086273,2.5974,0.519028, 0,2.5974,0.5258,
+ -0.664924,2.5728,0.110524, -0.519028,2.5974,0.086273, -0.5258,2.5974,0,
+ -0.5258,2.5974,0, -0.6736,2.5728,0, -0.664924,2.5728,0.110524,
+ -0.639758,2.5728,0.214905, -0.499384,2.5974,0.167751, -0.519028,2.5974,0.086273,
+ -0.519028,2.5974,0.086273, -0.664924,2.5728,0.110524, -0.639758,2.5728,0.214905,
+ -0.599396,2.5728,0.31185, -0.467878,2.5974,0.243424, -0.499384,2.5974,0.167751,
+ -0.499384,2.5974,0.167751, -0.639758,2.5728,0.214905, -0.599396,2.5728,0.31185,
+ -0.545131,2.5728,0.400065, -0.425519,2.5974,0.312283, -0.467878,2.5974,0.243424,
+ -0.467878,2.5974,0.243424, -0.599396,2.5728,0.31185, -0.545131,2.5728,0.400065,
+ -0.478256,2.5728,0.478256, -0.373318,2.5974,0.373318, -0.425519,2.5974,0.312283,
+ -0.425519,2.5974,0.312283, -0.545131,2.5728,0.400065, -0.478256,2.5728,0.478256,
+ -0.400065,2.5728,0.545131, -0.312283,2.5974,0.425519, -0.373318,2.5974,0.373318,
+ -0.373318,2.5974,0.373318, -0.478256,2.5728,0.478256, -0.400065,2.5728,0.545131,
+ -0.31185,2.5728,0.599396, -0.243424,2.5974,0.467878, -0.312283,2.5974,0.425519,
+ -0.312283,2.5974,0.425519, -0.400065,2.5728,0.545131, -0.31185,2.5728,0.599396,
+ -0.214905,2.5728,0.639758, -0.167751,2.5974,0.499384, -0.243424,2.5974,0.467878,
+ -0.243424,2.5974,0.467878, -0.31185,2.5728,0.599396, -0.214905,2.5728,0.639758,
+ -0.110524,2.5728,0.664924, -0.086273,2.5974,0.519028, -0.167751,2.5974,0.499384,
+ -0.167751,2.5974,0.499384, -0.214905,2.5728,0.639758, -0.110524,2.5728,0.664924,
+ 0,2.5728,0.6736, 0,2.5974,0.5258, -0.086273,2.5974,0.519028,
+ -0.086273,2.5974,0.519028, -0.110524,2.5728,0.664924, 0,2.5728,0.6736,
+ -0.814374,2.55,0.135366, -0.664924,2.5728,0.110524, -0.6736,2.5728,0,
+ -0.6736,2.5728,0, -0.825,2.55,0, -0.814374,2.55,0.135366,
+ -0.783552,2.55,0.263208, -0.639758,2.5728,0.214905, -0.664924,2.5728,0.110524,
+ -0.664924,2.5728,0.110524, -0.814374,2.55,0.135366, -0.783552,2.55,0.263208,
+ -0.734118,2.55,0.381942, -0.599396,2.5728,0.31185, -0.639758,2.5728,0.214905,
+ -0.639758,2.5728,0.214905, -0.783552,2.55,0.263208, -0.734118,2.55,0.381942,
+ -0.667656,2.55,0.489984, -0.545131,2.5728,0.400065, -0.599396,2.5728,0.31185,
+ -0.599396,2.5728,0.31185, -0.734118,2.55,0.381942, -0.667656,2.55,0.489984,
+ -0.58575,2.55,0.58575, -0.478256,2.5728,0.478256, -0.545131,2.5728,0.400065,
+ -0.545131,2.5728,0.400065, -0.667656,2.55,0.489984, -0.58575,2.55,0.58575,
+ -0.489984,2.55,0.667656, -0.400065,2.5728,0.545131, -0.478256,2.5728,0.478256,
+ -0.478256,2.5728,0.478256, -0.58575,2.55,0.58575, -0.489984,2.55,0.667656,
+ -0.381942,2.55,0.734118, -0.31185,2.5728,0.599396, -0.400065,2.5728,0.545131,
+ -0.400065,2.5728,0.545131, -0.489984,2.55,0.667656, -0.381942,2.55,0.734118,
+ -0.263208,2.55,0.783552, -0.214905,2.5728,0.639758, -0.31185,2.5728,0.599396,
+ -0.31185,2.5728,0.599396, -0.381942,2.55,0.734118, -0.263208,2.55,0.783552,
+ -0.135366,2.55,0.814374, -0.110524,2.5728,0.664924, -0.214905,2.5728,0.639758,
+ -0.214905,2.5728,0.639758, -0.263208,2.55,0.783552, -0.135366,2.55,0.814374,
+ 0,2.55,0.825, 0,2.5728,0.6736, -0.110524,2.5728,0.664924,
+ -0.110524,2.5728,0.664924, -0.135366,2.55,0.814374, 0,2.55,0.825,
+ -0.957901,2.5272,0.159223, -0.814374,2.55,0.135366, -0.825,2.55,0,
+ -0.825,2.55,0, -0.9704,2.5272,0, -0.957901,2.5272,0.159223,
+ -0.921647,2.5272,0.309596, -0.783552,2.55,0.263208, -0.814374,2.55,0.135366,
+ -0.814374,2.55,0.135366, -0.957901,2.5272,0.159223, -0.921647,2.5272,0.309596,
+ -0.863501,2.5272,0.449256, -0.734118,2.55,0.381942, -0.783552,2.55,0.263208,
+ -0.783552,2.55,0.263208, -0.921647,2.5272,0.309596, -0.863501,2.5272,0.449256,
+ -0.785325,2.5272,0.57634, -0.667656,2.55,0.489984, -0.734118,2.55,0.381942,
+ -0.734118,2.55,0.381942, -0.863501,2.5272,0.449256, -0.785325,2.5272,0.57634,
+ -0.688984,2.5272,0.688984, -0.58575,2.55,0.58575, -0.667656,2.55,0.489984,
+ -0.667656,2.55,0.489984, -0.785325,2.5272,0.57634, -0.688984,2.5272,0.688984,
+ -0.57634,2.5272,0.785325, -0.489984,2.55,0.667656, -0.58575,2.55,0.58575,
+ -0.58575,2.55,0.58575, -0.688984,2.5272,0.688984, -0.57634,2.5272,0.785325,
+ -0.449256,2.5272,0.863501, -0.381942,2.55,0.734118, -0.489984,2.55,0.667656,
+ -0.489984,2.55,0.667656, -0.57634,2.5272,0.785325, -0.449256,2.5272,0.863501,
+ -0.309596,2.5272,0.921647, -0.263208,2.55,0.783552, -0.381942,2.55,0.734118,
+ -0.381942,2.55,0.734118, -0.449256,2.5272,0.863501, -0.309596,2.5272,0.921647,
+ -0.159223,2.5272,0.957901, -0.135366,2.55,0.814374, -0.263208,2.55,0.783552,
+ -0.263208,2.55,0.783552, -0.309596,2.5272,0.921647, -0.159223,2.5272,0.957901,
+ 0,2.5272,0.9704, 0,2.55,0.825, -0.135366,2.55,0.814374,
+ -0.135366,2.55,0.814374, -0.159223,2.5272,0.957901, 0,2.5272,0.9704,
+ -1.086029,2.5026,0.180521, -0.957901,2.5272,0.159223, -0.9704,2.5272,0,
+ -0.9704,2.5272,0, -1.1002,2.5026,0, -1.086029,2.5026,0.180521,
+ -1.044926,2.5026,0.351008, -0.921647,2.5272,0.309596, -0.957901,2.5272,0.159223,
+ -0.957901,2.5272,0.159223, -1.086029,2.5026,0.180521, -1.044926,2.5026,0.351008,
+ -0.979002,2.5026,0.509349, -0.863501,2.5272,0.449256, -0.921647,2.5272,0.309596,
+ -0.921647,2.5272,0.309596, -1.044926,2.5026,0.351008, -0.979002,2.5026,0.509349,
+ -0.89037,2.5026,0.653431, -0.785325,2.5272,0.57634, -0.863501,2.5272,0.449256,
+ -0.863501,2.5272,0.449256, -0.979002,2.5026,0.509349, -0.89037,2.5026,0.653431,
+ -0.781142,2.5026,0.781142, -0.688984,2.5272,0.688984, -0.785325,2.5272,0.57634,
+ -0.785325,2.5272,0.57634, -0.89037,2.5026,0.653431, -0.781142,2.5026,0.781142,
+ -0.653431,2.5026,0.89037, -0.57634,2.5272,0.785325, -0.688984,2.5272,0.688984,
+ -0.688984,2.5272,0.688984, -0.781142,2.5026,0.781142, -0.653431,2.5026,0.89037,
+ -0.509349,2.5026,0.979002, -0.449256,2.5272,0.863501, -0.57634,2.5272,0.785325,
+ -0.57634,2.5272,0.785325, -0.653431,2.5026,0.89037, -0.509349,2.5026,0.979002,
+ -0.351008,2.5026,1.044926, -0.309596,2.5272,0.921647, -0.449256,2.5272,0.863501,
+ -0.449256,2.5272,0.863501, -0.509349,2.5026,0.979002, -0.351008,2.5026,1.044926,
+ -0.180521,2.5026,1.086029, -0.159223,2.5272,0.957901, -0.309596,2.5272,0.921647,
+ -0.309596,2.5272,0.921647, -0.351008,2.5026,1.044926, -0.180521,2.5026,1.086029,
+ 0,2.5026,1.1002, 0,2.5272,0.9704, -0.159223,2.5272,0.957901,
+ -0.159223,2.5272,0.957901, -0.180521,2.5026,1.086029, 0,2.5026,1.1002,
+ -1.189282,2.4744,0.197684, -1.086029,2.5026,0.180521, -1.1002,2.5026,0,
+ -1.1002,2.5026,0, -1.2048,2.4744,0, -1.189282,2.4744,0.197684,
+ -1.144271,2.4744,0.384379, -1.044926,2.5026,0.351008, -1.086029,2.5026,0.180521,
+ -1.086029,2.5026,0.180521, -1.189282,2.4744,0.197684, -1.144271,2.4744,0.384379,
+ -1.072079,2.4744,0.557774, -0.979002,2.5026,0.509349, -1.044926,2.5026,0.351008,
+ -1.044926,2.5026,0.351008, -1.144271,2.4744,0.384379, -1.072079,2.4744,0.557774,
+ -0.975021,2.4744,0.715555, -0.89037,2.5026,0.653431, -0.979002,2.5026,0.509349,
+ -0.979002,2.5026,0.509349, -1.072079,2.4744,0.557774, -0.975021,2.4744,0.715555,
+ -0.855408,2.4744,0.855408, -0.781142,2.5026,0.781142, -0.89037,2.5026,0.653431,
+ -0.89037,2.5026,0.653431, -0.975021,2.4744,0.715555, -0.855408,2.4744,0.855408,
+ -0.715555,2.4744,0.975021, -0.653431,2.5026,0.89037, -0.781142,2.5026,0.781142,
+ -0.781142,2.5026,0.781142, -0.855408,2.4744,0.855408, -0.715555,2.4744,0.975021,
+ -0.557774,2.4744,1.072079, -0.509349,2.5026,0.979002, -0.653431,2.5026,0.89037,
+ -0.653431,2.5026,0.89037, -0.715555,2.4744,0.975021, -0.557774,2.4744,1.072079,
+ -0.384379,2.4744,1.144271, -0.351008,2.5026,1.044926, -0.509349,2.5026,0.979002,
+ -0.509349,2.5026,0.979002, -0.557774,2.4744,1.072079, -0.384379,2.4744,1.144271,
+ -0.197684,2.4744,1.189282, -0.180521,2.5026,1.086029, -0.351008,2.5026,1.044926,
+ -0.351008,2.5026,1.044926, -0.384379,2.4744,1.144271, -0.197684,2.4744,1.189282,
+ 0,2.4744,1.2048, 0,2.5026,1.1002, -0.180521,2.5026,1.086029,
+ -0.180521,2.5026,1.086029, -0.197684,2.4744,1.189282, 0,2.4744,1.2048,
+ -1.258183,2.4408,0.209136, -1.189282,2.4744,0.197684, -1.2048,2.4744,0,
+ -1.2048,2.4744,0, -1.2746,2.4408,0, -1.258183,2.4408,0.209136,
+ -1.210564,2.4408,0.406648, -1.144271,2.4744,0.384379, -1.189282,2.4744,0.197684,
+ -1.189282,2.4744,0.197684, -1.258183,2.4408,0.209136, -1.210564,2.4408,0.406648,
+ -1.13419,2.4408,0.590089, -1.072079,2.4744,0.557774, -1.144271,2.4744,0.384379,
+ -1.144271,2.4744,0.384379, -1.210564,2.4408,0.406648, -1.13419,2.4408,0.590089,
+ -1.031508,2.4408,0.75701, -0.975021,2.4744,0.715555, -1.072079,2.4744,0.557774,
+ -1.072079,2.4744,0.557774, -1.13419,2.4408,0.590089, -1.031508,2.4408,0.75701,
+ -0.904966,2.4408,0.904966, -0.855408,2.4744,0.855408, -0.975021,2.4744,0.715555,
+ -0.975021,2.4744,0.715555, -1.031508,2.4408,0.75701, -0.904966,2.4408,0.904966,
+ -0.75701,2.4408,1.031508, -0.715555,2.4744,0.975021, -0.855408,2.4744,0.855408,
+ -0.855408,2.4744,0.855408, -0.904966,2.4408,0.904966, -0.75701,2.4408,1.031508,
+ -0.590089,2.4408,1.13419, -0.557774,2.4744,1.072079, -0.715555,2.4744,0.975021,
+ -0.715555,2.4744,0.975021, -0.75701,2.4408,1.031508, -0.590089,2.4408,1.13419,
+ -0.406648,2.4408,1.210564, -0.384379,2.4744,1.144271, -0.557774,2.4744,1.072079,
+ -0.557774,2.4744,1.072079, -0.590089,2.4408,1.13419, -0.406648,2.4408,1.210564,
+ -0.209136,2.4408,1.258183, -0.197684,2.4744,1.189282, -0.384379,2.4744,1.144271,
+ -0.384379,2.4744,1.144271, -0.406648,2.4408,1.210564, -0.209136,2.4408,1.258183,
+ 0,2.4408,1.2746, 0,2.4744,1.2048, -0.197684,2.4744,1.189282,
+ -0.197684,2.4744,1.189282, -0.209136,2.4408,1.258183, 0,2.4408,1.2746,
+ -1.283256,2.4,0.213304, -1.258183,2.4408,0.209136, -1.2746,2.4408,0,
+ -1.2746,2.4408,0, -1.3,2.4,0, -1.283256,2.4,0.213304,
+ -1.234688,2.4,0.414752, -1.210564,2.4408,0.406648, -1.258183,2.4408,0.209136,
+ -1.258183,2.4408,0.209136, -1.283256,2.4,0.213304, -1.234688,2.4,0.414752,
+ -1.156792,2.4,0.601848, -1.13419,2.4408,0.590089, -1.210564,2.4408,0.406648,
+ -1.210564,2.4408,0.406648, -1.234688,2.4,0.414752, -1.156792,2.4,0.601848,
+ -1.052064,2.4,0.772096, -1.031508,2.4408,0.75701, -1.13419,2.4408,0.590089,
+ -1.13419,2.4408,0.590089, -1.156792,2.4,0.601848, -1.052064,2.4,0.772096,
+ -0.923,2.4,0.923, -0.904966,2.4408,0.904966, -1.031508,2.4408,0.75701,
+ -1.031508,2.4408,0.75701, -1.052064,2.4,0.772096, -0.923,2.4,0.923,
+ -0.772096,2.4,1.052064, -0.75701,2.4408,1.031508, -0.904966,2.4408,0.904966,
+ -0.904966,2.4408,0.904966, -0.923,2.4,0.923, -0.772096,2.4,1.052064,
+ -0.601848,2.4,1.156792, -0.590089,2.4408,1.13419, -0.75701,2.4408,1.031508,
+ -0.75701,2.4408,1.031508, -0.772096,2.4,1.052064, -0.601848,2.4,1.156792,
+ -0.414752,2.4,1.234688, -0.406648,2.4408,1.210564, -0.590089,2.4408,1.13419,
+ -0.590089,2.4408,1.13419, -0.601848,2.4,1.156792, -0.414752,2.4,1.234688,
+ -0.213304,2.4,1.283256, -0.209136,2.4408,1.258183, -0.406648,2.4408,1.210564,
+ -0.406648,2.4408,1.210564, -0.414752,2.4,1.234688, -0.213304,2.4,1.283256,
+ 0,2.4,1.3, 0,2.4408,1.2746, -0.209136,2.4408,1.258183,
+ -0.209136,2.4408,1.258183, -0.213304,2.4,1.283256, 0,2.4,1.3,
+ 0.045844,2.6592,0.275801, 0.032816,2.7,0.197424, 0,2.7,0.2,
+ 0,2.7,0.2, 0,2.6592,0.2794, 0.045844,2.6592,0.275801,
+ 0.08914,2.6592,0.265363, 0.063808,2.7,0.189952, 0.032816,2.7,0.197424,
+ 0.032816,2.7,0.197424, 0.045844,2.6592,0.275801, 0.08914,2.6592,0.265363,
+ 0.129351,2.6592,0.248621, 0.092592,2.7,0.177968, 0.063808,2.7,0.189952,
+ 0.063808,2.7,0.189952, 0.08914,2.6592,0.265363, 0.129351,2.6592,0.248621,
+ 0.165941,2.6592,0.226113, 0.118784,2.7,0.161856, 0.092592,2.7,0.177968,
+ 0.092592,2.7,0.177968, 0.129351,2.6592,0.248621, 0.165941,2.6592,0.226113,
+ 0.198374,2.6592,0.198374, 0.142,2.7,0.142, 0.118784,2.7,0.161856,
+ 0.118784,2.7,0.161856, 0.165941,2.6592,0.226113, 0.198374,2.6592,0.198374,
+ 0.226113,2.6592,0.165941, 0.161856,2.7,0.118784, 0.142,2.7,0.142,
+ 0.142,2.7,0.142, 0.198374,2.6592,0.198374, 0.226113,2.6592,0.165941,
+ 0.248621,2.6592,0.129351, 0.177968,2.7,0.092592, 0.161856,2.7,0.118784,
+ 0.161856,2.7,0.118784, 0.226113,2.6592,0.165941, 0.248621,2.6592,0.129351,
+ 0.265363,2.6592,0.08914, 0.189952,2.7,0.063808, 0.177968,2.7,0.092592,
+ 0.177968,2.7,0.092592, 0.248621,2.6592,0.129351, 0.265363,2.6592,0.08914,
+ 0.275801,2.6592,0.045844, 0.197424,2.7,0.032816, 0.189952,2.7,0.063808,
+ 0.189952,2.7,0.063808, 0.265363,2.6592,0.08914, 0.275801,2.6592,0.045844,
+ 0.2794,2.6592,0, 0.2,2.7,0, 0.197424,2.7,0.032816,
+ 0.197424,2.7,0.032816, 0.275801,2.6592,0.045844, 0.2794,2.6592,0,
+ 0.064188,2.6256,0.386161, 0.045844,2.6592,0.275801, 0,2.6592,0.2794,
+ 0,2.6592,0.2794, 0,2.6256,0.3912, 0.064188,2.6256,0.386161,
+ 0.124808,2.6256,0.371546, 0.08914,2.6592,0.265363, 0.045844,2.6592,0.275801,
+ 0.045844,2.6592,0.275801, 0.064188,2.6256,0.386161, 0.124808,2.6256,0.371546,
+ 0.18111,2.6256,0.348105, 0.129351,2.6592,0.248621, 0.08914,2.6592,0.265363,
+ 0.08914,2.6592,0.265363, 0.124808,2.6256,0.371546, 0.18111,2.6256,0.348105,
+ 0.232342,2.6256,0.31659, 0.165941,2.6592,0.226113, 0.129351,2.6592,0.248621,
+ 0.129351,2.6592,0.248621, 0.18111,2.6256,0.348105, 0.232342,2.6256,0.31659,
+ 0.277752,2.6256,0.277752, 0.198374,2.6592,0.198374, 0.165941,2.6592,0.226113,
+ 0.165941,2.6592,0.226113, 0.232342,2.6256,0.31659, 0.277752,2.6256,0.277752,
+ 0.31659,2.6256,0.232342, 0.226113,2.6592,0.165941, 0.198374,2.6592,0.198374,
+ 0.198374,2.6592,0.198374, 0.277752,2.6256,0.277752, 0.31659,2.6256,0.232342,
+ 0.348105,2.6256,0.18111, 0.248621,2.6592,0.129351, 0.226113,2.6592,0.165941,
+ 0.226113,2.6592,0.165941, 0.31659,2.6256,0.232342, 0.348105,2.6256,0.18111,
+ 0.371546,2.6256,0.124808, 0.265363,2.6592,0.08914, 0.248621,2.6592,0.129351,
+ 0.248621,2.6592,0.129351, 0.348105,2.6256,0.18111, 0.371546,2.6256,0.124808,
+ 0.386161,2.6256,0.064188, 0.275801,2.6592,0.045844, 0.265363,2.6592,0.08914,
+ 0.265363,2.6592,0.08914, 0.371546,2.6256,0.124808, 0.386161,2.6256,0.064188,
+ 0.3912,2.6256,0, 0.2794,2.6592,0, 0.275801,2.6592,0.045844,
+ 0.275801,2.6592,0.045844, 0.386161,2.6256,0.064188, 0.3912,2.6256,0,
+ 0.086273,2.5974,0.519028, 0.064188,2.6256,0.386161, 0,2.6256,0.3912,
+ 0,2.6256,0.3912, 0,2.5974,0.5258, 0.086273,2.5974,0.519028,
+ 0.167751,2.5974,0.499384, 0.124808,2.6256,0.371546, 0.064188,2.6256,0.386161,
+ 0.064188,2.6256,0.386161, 0.086273,2.5974,0.519028, 0.167751,2.5974,0.499384,
+ 0.243424,2.5974,0.467878, 0.18111,2.6256,0.348105, 0.124808,2.6256,0.371546,
+ 0.124808,2.6256,0.371546, 0.167751,2.5974,0.499384, 0.243424,2.5974,0.467878,
+ 0.312283,2.5974,0.425519, 0.232342,2.6256,0.31659, 0.18111,2.6256,0.348105,
+ 0.18111,2.6256,0.348105, 0.243424,2.5974,0.467878, 0.312283,2.5974,0.425519,
+ 0.373318,2.5974,0.373318, 0.277752,2.6256,0.277752, 0.232342,2.6256,0.31659,
+ 0.232342,2.6256,0.31659, 0.312283,2.5974,0.425519, 0.373318,2.5974,0.373318,
+ 0.425519,2.5974,0.312283, 0.31659,2.6256,0.232342, 0.277752,2.6256,0.277752,
+ 0.277752,2.6256,0.277752, 0.373318,2.5974,0.373318, 0.425519,2.5974,0.312283,
+ 0.467878,2.5974,0.243424, 0.348105,2.6256,0.18111, 0.31659,2.6256,0.232342,
+ 0.31659,2.6256,0.232342, 0.425519,2.5974,0.312283, 0.467878,2.5974,0.243424,
+ 0.499384,2.5974,0.167751, 0.371546,2.6256,0.124808, 0.348105,2.6256,0.18111,
+ 0.348105,2.6256,0.18111, 0.467878,2.5974,0.243424, 0.499384,2.5974,0.167751,
+ 0.519028,2.5974,0.086273, 0.386161,2.6256,0.064188, 0.371546,2.6256,0.124808,
+ 0.371546,2.6256,0.124808, 0.499384,2.5974,0.167751, 0.519028,2.5974,0.086273,
+ 0.5258,2.5974,0, 0.3912,2.6256,0, 0.386161,2.6256,0.064188,
+ 0.386161,2.6256,0.064188, 0.519028,2.5974,0.086273, 0.5258,2.5974,0,
+ 0.110524,2.5728,0.664924, 0.086273,2.5974,0.519028, 0,2.5974,0.5258,
+ 0,2.5974,0.5258, 0,2.5728,0.6736, 0.110524,2.5728,0.664924,
+ 0.214905,2.5728,0.639758, 0.167751,2.5974,0.499384, 0.086273,2.5974,0.519028,
+ 0.086273,2.5974,0.519028, 0.110524,2.5728,0.664924, 0.214905,2.5728,0.639758,
+ 0.31185,2.5728,0.599396, 0.243424,2.5974,0.467878, 0.167751,2.5974,0.499384,
+ 0.167751,2.5974,0.499384, 0.214905,2.5728,0.639758, 0.31185,2.5728,0.599396,
+ 0.400065,2.5728,0.545131, 0.312283,2.5974,0.425519, 0.243424,2.5974,0.467878,
+ 0.243424,2.5974,0.467878, 0.31185,2.5728,0.599396, 0.400065,2.5728,0.545131,
+ 0.478256,2.5728,0.478256, 0.373318,2.5974,0.373318, 0.312283,2.5974,0.425519,
+ 0.312283,2.5974,0.425519, 0.400065,2.5728,0.545131, 0.478256,2.5728,0.478256,
+ 0.545131,2.5728,0.400065, 0.425519,2.5974,0.312283, 0.373318,2.5974,0.373318,
+ 0.373318,2.5974,0.373318, 0.478256,2.5728,0.478256, 0.545131,2.5728,0.400065,
+ 0.599396,2.5728,0.31185, 0.467878,2.5974,0.243424, 0.425519,2.5974,0.312283,
+ 0.425519,2.5974,0.312283, 0.545131,2.5728,0.400065, 0.599396,2.5728,0.31185,
+ 0.639758,2.5728,0.214905, 0.499384,2.5974,0.167751, 0.467878,2.5974,0.243424,
+ 0.467878,2.5974,0.243424, 0.599396,2.5728,0.31185, 0.639758,2.5728,0.214905,
+ 0.664924,2.5728,0.110524, 0.519028,2.5974,0.086273, 0.499384,2.5974,0.167751,
+ 0.499384,2.5974,0.167751, 0.639758,2.5728,0.214905, 0.664924,2.5728,0.110524,
+ 0.6736,2.5728,0, 0.5258,2.5974,0, 0.519028,2.5974,0.086273,
+ 0.519028,2.5974,0.086273, 0.664924,2.5728,0.110524, 0.6736,2.5728,0,
+ 0.135366,2.55,0.814374, 0.110524,2.5728,0.664924, 0,2.5728,0.6736,
+ 0,2.5728,0.6736, 0,2.55,0.825, 0.135366,2.55,0.814374,
+ 0.263208,2.55,0.783552, 0.214905,2.5728,0.639758, 0.110524,2.5728,0.664924,
+ 0.110524,2.5728,0.664924, 0.135366,2.55,0.814374, 0.263208,2.55,0.783552,
+ 0.381942,2.55,0.734118, 0.31185,2.5728,0.599396, 0.214905,2.5728,0.639758,
+ 0.214905,2.5728,0.639758, 0.263208,2.55,0.783552, 0.381942,2.55,0.734118,
+ 0.489984,2.55,0.667656, 0.400065,2.5728,0.545131, 0.31185,2.5728,0.599396,
+ 0.31185,2.5728,0.599396, 0.381942,2.55,0.734118, 0.489984,2.55,0.667656,
+ 0.58575,2.55,0.58575, 0.478256,2.5728,0.478256, 0.400065,2.5728,0.545131,
+ 0.400065,2.5728,0.545131, 0.489984,2.55,0.667656, 0.58575,2.55,0.58575,
+ 0.667656,2.55,0.489984, 0.545131,2.5728,0.400065, 0.478256,2.5728,0.478256,
+ 0.478256,2.5728,0.478256, 0.58575,2.55,0.58575, 0.667656,2.55,0.489984,
+ 0.734118,2.55,0.381942, 0.599396,2.5728,0.31185, 0.545131,2.5728,0.400065,
+ 0.545131,2.5728,0.400065, 0.667656,2.55,0.489984, 0.734118,2.55,0.381942,
+ 0.783552,2.55,0.263208, 0.639758,2.5728,0.214905, 0.599396,2.5728,0.31185,
+ 0.599396,2.5728,0.31185, 0.734118,2.55,0.381942, 0.783552,2.55,0.263208,
+ 0.814374,2.55,0.135366, 0.664924,2.5728,0.110524, 0.639758,2.5728,0.214905,
+ 0.639758,2.5728,0.214905, 0.783552,2.55,0.263208, 0.814374,2.55,0.135366,
+ 0.825,2.55,0, 0.6736,2.5728,0, 0.664924,2.5728,0.110524,
+ 0.664924,2.5728,0.110524, 0.814374,2.55,0.135366, 0.825,2.55,0,
+ 0.159223,2.5272,0.957901, 0.135366,2.55,0.814374, 0,2.55,0.825,
+ 0,2.55,0.825, 0,2.5272,0.9704, 0.159223,2.5272,0.957901,
+ 0.309596,2.5272,0.921647, 0.263208,2.55,0.783552, 0.135366,2.55,0.814374,
+ 0.135366,2.55,0.814374, 0.159223,2.5272,0.957901, 0.309596,2.5272,0.921647,
+ 0.449256,2.5272,0.863501, 0.381942,2.55,0.734118, 0.263208,2.55,0.783552,
+ 0.263208,2.55,0.783552, 0.309596,2.5272,0.921647, 0.449256,2.5272,0.863501,
+ 0.57634,2.5272,0.785325, 0.489984,2.55,0.667656, 0.381942,2.55,0.734118,
+ 0.381942,2.55,0.734118, 0.449256,2.5272,0.863501, 0.57634,2.5272,0.785325,
+ 0.688984,2.5272,0.688984, 0.58575,2.55,0.58575, 0.489984,2.55,0.667656,
+ 0.489984,2.55,0.667656, 0.57634,2.5272,0.785325, 0.688984,2.5272,0.688984,
+ 0.785325,2.5272,0.57634, 0.667656,2.55,0.489984, 0.58575,2.55,0.58575,
+ 0.58575,2.55,0.58575, 0.688984,2.5272,0.688984, 0.785325,2.5272,0.57634,
+ 0.863501,2.5272,0.449256, 0.734118,2.55,0.381942, 0.667656,2.55,0.489984,
+ 0.667656,2.55,0.489984, 0.785325,2.5272,0.57634, 0.863501,2.5272,0.449256,
+ 0.921647,2.5272,0.309596, 0.783552,2.55,0.263208, 0.734118,2.55,0.381942,
+ 0.734118,2.55,0.381942, 0.863501,2.5272,0.449256, 0.921647,2.5272,0.309596,
+ 0.957901,2.5272,0.159223, 0.814374,2.55,0.135366, 0.783552,2.55,0.263208,
+ 0.783552,2.55,0.263208, 0.921647,2.5272,0.309596, 0.957901,2.5272,0.159223,
+ 0.9704,2.5272,0, 0.825,2.55,0, 0.814374,2.55,0.135366,
+ 0.814374,2.55,0.135366, 0.957901,2.5272,0.159223, 0.9704,2.5272,0,
+ 0.180521,2.5026,1.086029, 0.159223,2.5272,0.957901, 0,2.5272,0.9704,
+ 0,2.5272,0.9704, 0,2.5026,1.1002, 0.180521,2.5026,1.086029,
+ 0.351008,2.5026,1.044926, 0.309596,2.5272,0.921647, 0.159223,2.5272,0.957901,
+ 0.159223,2.5272,0.957901, 0.180521,2.5026,1.086029, 0.351008,2.5026,1.044926,
+ 0.509349,2.5026,0.979002, 0.449256,2.5272,0.863501, 0.309596,2.5272,0.921647,
+ 0.309596,2.5272,0.921647, 0.351008,2.5026,1.044926, 0.509349,2.5026,0.979002,
+ 0.653431,2.5026,0.89037, 0.57634,2.5272,0.785325, 0.449256,2.5272,0.863501,
+ 0.449256,2.5272,0.863501, 0.509349,2.5026,0.979002, 0.653431,2.5026,0.89037,
+ 0.781142,2.5026,0.781142, 0.688984,2.5272,0.688984, 0.57634,2.5272,0.785325,
+ 0.57634,2.5272,0.785325, 0.653431,2.5026,0.89037, 0.781142,2.5026,0.781142,
+ 0.89037,2.5026,0.653431, 0.785325,2.5272,0.57634, 0.688984,2.5272,0.688984,
+ 0.688984,2.5272,0.688984, 0.781142,2.5026,0.781142, 0.89037,2.5026,0.653431,
+ 0.979002,2.5026,0.509349, 0.863501,2.5272,0.449256, 0.785325,2.5272,0.57634,
+ 0.785325,2.5272,0.57634, 0.89037,2.5026,0.653431, 0.979002,2.5026,0.509349,
+ 1.044926,2.5026,0.351008, 0.921647,2.5272,0.309596, 0.863501,2.5272,0.449256,
+ 0.863501,2.5272,0.449256, 0.979002,2.5026,0.509349, 1.044926,2.5026,0.351008,
+ 1.086029,2.5026,0.180521, 0.957901,2.5272,0.159223, 0.921647,2.5272,0.309596,
+ 0.921647,2.5272,0.309596, 1.044926,2.5026,0.351008, 1.086029,2.5026,0.180521,
+ 1.1002,2.5026,0, 0.9704,2.5272,0, 0.957901,2.5272,0.159223,
+ 0.957901,2.5272,0.159223, 1.086029,2.5026,0.180521, 1.1002,2.5026,0,
+ 0.197684,2.4744,1.189282, 0.180521,2.5026,1.086029, 0,2.5026,1.1002,
+ 0,2.5026,1.1002, 0,2.4744,1.2048, 0.197684,2.4744,1.189282,
+ 0.384379,2.4744,1.144271, 0.351008,2.5026,1.044926, 0.180521,2.5026,1.086029,
+ 0.180521,2.5026,1.086029, 0.197684,2.4744,1.189282, 0.384379,2.4744,1.144271,
+ 0.557774,2.4744,1.072079, 0.509349,2.5026,0.979002, 0.351008,2.5026,1.044926,
+ 0.351008,2.5026,1.044926, 0.384379,2.4744,1.144271, 0.557774,2.4744,1.072079,
+ 0.715555,2.4744,0.975021, 0.653431,2.5026,0.89037, 0.509349,2.5026,0.979002,
+ 0.509349,2.5026,0.979002, 0.557774,2.4744,1.072079, 0.715555,2.4744,0.975021,
+ 0.855408,2.4744,0.855408, 0.781142,2.5026,0.781142, 0.653431,2.5026,0.89037,
+ 0.653431,2.5026,0.89037, 0.715555,2.4744,0.975021, 0.855408,2.4744,0.855408,
+ 0.975021,2.4744,0.715555, 0.89037,2.5026,0.653431, 0.781142,2.5026,0.781142,
+ 0.781142,2.5026,0.781142, 0.855408,2.4744,0.855408, 0.975021,2.4744,0.715555,
+ 1.072079,2.4744,0.557774, 0.979002,2.5026,0.509349, 0.89037,2.5026,0.653431,
+ 0.89037,2.5026,0.653431, 0.975021,2.4744,0.715555, 1.072079,2.4744,0.557774,
+ 1.144271,2.4744,0.384379, 1.044926,2.5026,0.351008, 0.979002,2.5026,0.509349,
+ 0.979002,2.5026,0.509349, 1.072079,2.4744,0.557774, 1.144271,2.4744,0.384379,
+ 1.189282,2.4744,0.197684, 1.086029,2.5026,0.180521, 1.044926,2.5026,0.351008,
+ 1.044926,2.5026,0.351008, 1.144271,2.4744,0.384379, 1.189282,2.4744,0.197684,
+ 1.2048,2.4744,0, 1.1002,2.5026,0, 1.086029,2.5026,0.180521,
+ 1.086029,2.5026,0.180521, 1.189282,2.4744,0.197684, 1.2048,2.4744,0,
+ 0.209136,2.4408,1.258183, 0.197684,2.4744,1.189282, 0,2.4744,1.2048,
+ 0,2.4744,1.2048, 0,2.4408,1.2746, 0.209136,2.4408,1.258183,
+ 0.406648,2.4408,1.210564, 0.384379,2.4744,1.144271, 0.197684,2.4744,1.189282,
+ 0.197684,2.4744,1.189282, 0.209136,2.4408,1.258183, 0.406648,2.4408,1.210564,
+ 0.590089,2.4408,1.13419, 0.557774,2.4744,1.072079, 0.384379,2.4744,1.144271,
+ 0.384379,2.4744,1.144271, 0.406648,2.4408,1.210564, 0.590089,2.4408,1.13419,
+ 0.75701,2.4408,1.031508, 0.715555,2.4744,0.975021, 0.557774,2.4744,1.072079,
+ 0.557774,2.4744,1.072079, 0.590089,2.4408,1.13419, 0.75701,2.4408,1.031508,
+ 0.904966,2.4408,0.904966, 0.855408,2.4744,0.855408, 0.715555,2.4744,0.975021,
+ 0.715555,2.4744,0.975021, 0.75701,2.4408,1.031508, 0.904966,2.4408,0.904966,
+ 1.031508,2.4408,0.75701, 0.975021,2.4744,0.715555, 0.855408,2.4744,0.855408,
+ 0.855408,2.4744,0.855408, 0.904966,2.4408,0.904966, 1.031508,2.4408,0.75701,
+ 1.13419,2.4408,0.590089, 1.072079,2.4744,0.557774, 0.975021,2.4744,0.715555,
+ 0.975021,2.4744,0.715555, 1.031508,2.4408,0.75701, 1.13419,2.4408,0.590089,
+ 1.210564,2.4408,0.406648, 1.144271,2.4744,0.384379, 1.072079,2.4744,0.557774,
+ 1.072079,2.4744,0.557774, 1.13419,2.4408,0.590089, 1.210564,2.4408,0.406648,
+ 1.258183,2.4408,0.209136, 1.189282,2.4744,0.197684, 1.144271,2.4744,0.384379,
+ 1.144271,2.4744,0.384379, 1.210564,2.4408,0.406648, 1.258183,2.4408,0.209136,
+ 1.2746,2.4408,0, 1.2048,2.4744,0, 1.189282,2.4744,0.197684,
+ 1.189282,2.4744,0.197684, 1.258183,2.4408,0.209136, 1.2746,2.4408,0,
+ 0.213304,2.4,1.283256, 0.209136,2.4408,1.258183, 0,2.4408,1.2746,
+ 0,2.4408,1.2746, 0,2.4,1.3, 0.213304,2.4,1.283256,
+ 0.414752,2.4,1.234688, 0.406648,2.4408,1.210564, 0.209136,2.4408,1.258183,
+ 0.209136,2.4408,1.258183, 0.213304,2.4,1.283256, 0.414752,2.4,1.234688,
+ 0.601848,2.4,1.156792, 0.590089,2.4408,1.13419, 0.406648,2.4408,1.210564,
+ 0.406648,2.4408,1.210564, 0.414752,2.4,1.234688, 0.601848,2.4,1.156792,
+ 0.772096,2.4,1.052064, 0.75701,2.4408,1.031508, 0.590089,2.4408,1.13419,
+ 0.590089,2.4408,1.13419, 0.601848,2.4,1.156792, 0.772096,2.4,1.052064,
+ 0.923,2.4,0.923, 0.904966,2.4408,0.904966, 0.75701,2.4408,1.031508,
+ 0.75701,2.4408,1.031508, 0.772096,2.4,1.052064, 0.923,2.4,0.923,
+ 1.052064,2.4,0.772096, 1.031508,2.4408,0.75701, 0.904966,2.4408,0.904966,
+ 0.904966,2.4408,0.904966, 0.923,2.4,0.923, 1.052064,2.4,0.772096,
+ 1.156792,2.4,0.601848, 1.13419,2.4408,0.590089, 1.031508,2.4408,0.75701,
+ 1.031508,2.4408,0.75701, 1.052064,2.4,0.772096, 1.156792,2.4,0.601848,
+ 1.234688,2.4,0.414752, 1.210564,2.4408,0.406648, 1.13419,2.4408,0.590089,
+ 1.13419,2.4408,0.590089, 1.156792,2.4,0.601848, 1.234688,2.4,0.414752,
+ 1.283256,2.4,0.213304, 1.258183,2.4408,0.209136, 1.210564,2.4408,0.406648,
+ 1.210564,2.4408,0.406648, 1.234688,2.4,0.414752, 1.283256,2.4,0.213304,
+ 1.3,2.4,0, 1.2746,2.4408,0, 1.258183,2.4408,0.209136,
+ 1.258183,2.4408,0.209136, 1.283256,2.4,0.213304, 1.3,2.4,0,
+ 0,0,0, 0.388275,0.002175,0, 0.383274,0.002175,0.063708,
+ 0,0,0, 0.383274,0.002175,0.063708, 0.368768,0.002175,0.123875,
+ 0,0,0, 0.368768,0.002175,0.123875, 0.345503,0.002175,0.179756,
+ 0,0,0, 0.345503,0.002175,0.179756, 0.314223,0.002175,0.230604,
+ 0,0,0, 0.314223,0.002175,0.230604, 0.275675,0.002175,0.275675,
+ 0,0,0, 0.275675,0.002175,0.275675, 0.230604,0.002175,0.314223,
+ 0,0,0, 0.230604,0.002175,0.314223, 0.179756,0.002175,0.345503,
+ 0,0,0, 0.179756,0.002175,0.345503, 0.123875,0.002175,0.368768,
+ 0,0,0, 0.123875,0.002175,0.368768, 0.063708,0.002175,0.383274,
+ 0,0,0, 0.063708,0.002175,0.383274, 0,0.002175,0.388275,
+ 0.694143,0.0084,0.115381, 0.383274,0.002175,0.063708, 0.388275,0.002175,0,
+ 0.388275,0.002175,0, 0.7032,0.0084,0, 0.694143,0.0084,0.115381,
+ 0.667871,0.0084,0.224349, 0.368768,0.002175,0.123875, 0.383274,0.002175,0.063708,
+ 0.383274,0.002175,0.063708, 0.694143,0.0084,0.115381, 0.667871,0.0084,0.224349,
+ 0.625735,0.0084,0.325553, 0.345503,0.002175,0.179756, 0.368768,0.002175,0.123875,
+ 0.368768,0.002175,0.123875, 0.667871,0.0084,0.224349, 0.625735,0.0084,0.325553,
+ 0.569086,0.0084,0.417645, 0.314223,0.002175,0.230604, 0.345503,0.002175,0.179756,
+ 0.345503,0.002175,0.179756, 0.625735,0.0084,0.325553, 0.569086,0.0084,0.417645,
+ 0.499272,0.0084,0.499272, 0.275675,0.002175,0.275675, 0.314223,0.002175,0.230604,
+ 0.314223,0.002175,0.230604, 0.569086,0.0084,0.417645, 0.499272,0.0084,0.499272,
+ 0.417645,0.0084,0.569086, 0.230604,0.002175,0.314223, 0.275675,0.002175,0.275675,
+ 0.275675,0.002175,0.275675, 0.499272,0.0084,0.499272, 0.417645,0.0084,0.569086,
+ 0.325553,0.0084,0.625735, 0.179756,0.002175,0.345503, 0.230604,0.002175,0.314223,
+ 0.230604,0.002175,0.314223, 0.417645,0.0084,0.569086, 0.325553,0.0084,0.625735,
+ 0.224349,0.0084,0.667871, 0.123875,0.002175,0.368768, 0.179756,0.002175,0.345503,
+ 0.179756,0.002175,0.345503, 0.325553,0.0084,0.625735, 0.224349,0.0084,0.667871,
+ 0.115381,0.0084,0.694143, 0.063708,0.002175,0.383274, 0.123875,0.002175,0.368768,
+ 0.123875,0.002175,0.368768, 0.224349,0.0084,0.667871, 0.115381,0.0084,0.694143,
+ 0,0.0084,0.7032, 0,0.002175,0.388275, 0.063708,0.002175,0.383274,
+ 0.063708,0.002175,0.383274, 0.115381,0.0084,0.694143, 0,0.0084,0.7032,
+ 0.940158,0.018225,0.156274, 0.694143,0.0084,0.115381, 0.7032,0.0084,0,
+ 0.7032,0.0084,0, 0.952425,0.018225,0, 0.940158,0.018225,0.156274,
+ 0.904575,0.018225,0.303862, 0.667871,0.0084,0.224349, 0.694143,0.0084,0.115381,
+ 0.694143,0.0084,0.115381, 0.940158,0.018225,0.156274, 0.904575,0.018225,0.303862,
+ 0.847506,0.018225,0.440935, 0.625735,0.0084,0.325553, 0.667871,0.0084,0.224349,
+ 0.667871,0.0084,0.224349, 0.904575,0.018225,0.303862, 0.847506,0.018225,0.440935,
+ 0.770779,0.018225,0.565664, 0.569086,0.0084,0.417645, 0.625735,0.0084,0.325553,
+ 0.625735,0.0084,0.325553, 0.847506,0.018225,0.440935, 0.770779,0.018225,0.565664,
+ 0.676222,0.018225,0.676222, 0.499272,0.0084,0.499272, 0.569086,0.0084,0.417645,
+ 0.569086,0.0084,0.417645, 0.770779,0.018225,0.565664, 0.676222,0.018225,0.676222,
+ 0.565664,0.018225,0.770779, 0.417645,0.0084,0.569086, 0.499272,0.0084,0.499272,
+ 0.499272,0.0084,0.499272, 0.676222,0.018225,0.676222, 0.565664,0.018225,0.770779,
+ 0.440935,0.018225,0.847506, 0.325553,0.0084,0.625735, 0.417645,0.0084,0.569086,
+ 0.417645,0.0084,0.569086, 0.565664,0.018225,0.770779, 0.440935,0.018225,0.847506,
+ 0.303862,0.018225,0.904575, 0.224349,0.0084,0.667871, 0.325553,0.0084,0.625735,
+ 0.325553,0.0084,0.625735, 0.440935,0.018225,0.847506, 0.303862,0.018225,0.904575,
+ 0.156274,0.018225,0.940158, 0.115381,0.0084,0.694143, 0.224349,0.0084,0.667871,
+ 0.224349,0.0084,0.667871, 0.303862,0.018225,0.904575, 0.156274,0.018225,0.940158,
+ 0,0.018225,0.952425, 0,0.0084,0.7032, 0.115381,0.0084,0.694143,
+ 0.115381,0.0084,0.694143, 0.156274,0.018225,0.940158, 0,0.018225,0.952425,
+ 1.12887,0.0312,0.187642, 0.940158,0.018225,0.156274, 0.952425,0.018225,0,
+ 0.952425,0.018225,0, 1.1436,0.0312,0, 1.12887,0.0312,0.187642,
+ 1.086146,0.0312,0.364854, 0.904575,0.018225,0.303862, 0.940158,0.018225,0.156274,
+ 0.940158,0.018225,0.156274, 1.12887,0.0312,0.187642, 1.086146,0.0312,0.364854,
+ 1.017621,0.0312,0.529441, 0.847506,0.018225,0.440935, 0.904575,0.018225,0.303862,
+ 0.904575,0.018225,0.303862, 1.086146,0.0312,0.364854, 1.017621,0.0312,0.529441,
+ 0.925493,0.0312,0.679207, 0.770779,0.018225,0.565664, 0.847506,0.018225,0.440935,
+ 0.847506,0.018225,0.440935, 1.017621,0.0312,0.529441, 0.925493,0.0312,0.679207,
+ 0.811956,0.0312,0.811956, 0.676222,0.018225,0.676222, 0.770779,0.018225,0.565664,
+ 0.770779,0.018225,0.565664, 0.925493,0.0312,0.679207, 0.811956,0.0312,0.811956,
+ 0.679207,0.0312,0.925493, 0.565664,0.018225,0.770779, 0.676222,0.018225,0.676222,
+ 0.676222,0.018225,0.676222, 0.811956,0.0312,0.811956, 0.679207,0.0312,0.925493,
+ 0.529441,0.0312,1.017621, 0.440935,0.018225,0.847506, 0.565664,0.018225,0.770779,
+ 0.565664,0.018225,0.770779, 0.679207,0.0312,0.925493, 0.529441,0.0312,1.017621,
+ 0.364854,0.0312,1.086146, 0.303862,0.018225,0.904575, 0.440935,0.018225,0.847506,
+ 0.440935,0.018225,0.847506, 0.529441,0.0312,1.017621, 0.364854,0.0312,1.086146,
+ 0.187642,0.0312,1.12887, 0.156274,0.018225,0.940158, 0.303862,0.018225,0.904575,
+ 0.303862,0.018225,0.904575, 0.364854,0.0312,1.086146, 0.187642,0.0312,1.12887,
+ 0,0.0312,1.1436, 0,0.018225,0.952425, 0.156274,0.018225,0.940158,
+ 0.156274,0.018225,0.940158, 0.187642,0.0312,1.12887, 0,0.0312,1.1436,
+ 1.267832,0.046875,0.21074, 1.12887,0.0312,0.187642, 1.1436,0.0312,0,
+ 1.1436,0.0312,0, 1.284375,0.046875,0, 1.267832,0.046875,0.21074,
+ 1.219848,0.046875,0.409767, 1.086146,0.0312,0.364854, 1.12887,0.0312,0.187642,
+ 1.12887,0.0312,0.187642, 1.267832,0.046875,0.21074, 1.219848,0.046875,0.409767,
+ 1.142888,0.046875,0.594614, 1.017621,0.0312,0.529441, 1.086146,0.0312,0.364854,
+ 1.086146,0.0312,0.364854, 1.219848,0.046875,0.409767, 1.142888,0.046875,0.594614,
+ 1.039419,0.046875,0.762816, 0.925493,0.0312,0.679207, 1.017621,0.0312,0.529441,
+ 1.017621,0.0312,0.529441, 1.142888,0.046875,0.594614, 1.039419,0.046875,0.762816,
+ 0.911906,0.046875,0.911906, 0.811956,0.0312,0.811956, 0.925493,0.0312,0.679207,
+ 0.925493,0.0312,0.679207, 1.039419,0.046875,0.762816, 0.911906,0.046875,0.911906,
+ 0.762816,0.046875,1.039419, 0.679207,0.0312,0.925493, 0.811956,0.0312,0.811956,
+ 0.811956,0.0312,0.811956, 0.911906,0.046875,0.911906, 0.762816,0.046875,1.039419,
+ 0.594614,0.046875,1.142888, 0.529441,0.0312,1.017621, 0.679207,0.0312,0.925493,
+ 0.679207,0.0312,0.925493, 0.762816,0.046875,1.039419, 0.594614,0.046875,1.142888,
+ 0.409767,0.046875,1.219848, 0.364854,0.0312,1.086146, 0.529441,0.0312,1.017621,
+ 0.529441,0.0312,1.017621, 0.594614,0.046875,1.142888, 0.409767,0.046875,1.219848,
+ 0.21074,0.046875,1.267832, 0.187642,0.0312,1.12887, 0.364854,0.0312,1.086146,
+ 0.364854,0.0312,1.086146, 0.409767,0.046875,1.219848, 0.21074,0.046875,1.267832,
+ 0,0.046875,1.284375, 0,0.0312,1.1436, 0.187642,0.0312,1.12887,
+ 0.187642,0.0312,1.12887, 0.21074,0.046875,1.267832, 0,0.046875,1.284375,
+ 1.364595,0.0648,0.226824, 1.267832,0.046875,0.21074, 1.284375,0.046875,0,
+ 1.284375,0.046875,0, 1.3824,0.0648,0, 1.364595,0.0648,0.226824,
+ 1.312948,0.0648,0.441041, 1.219848,0.046875,0.409767, 1.267832,0.046875,0.21074,
+ 1.267832,0.046875,0.21074, 1.364595,0.0648,0.226824, 1.312948,0.0648,0.441041,
+ 1.230115,0.0648,0.639996, 1.142888,0.046875,0.594614, 1.219848,0.046875,0.409767,
+ 1.219848,0.046875,0.409767, 1.312948,0.0648,0.441041, 1.230115,0.0648,0.639996,
+ 1.118749,0.0648,0.821035, 1.039419,0.046875,0.762816, 1.142888,0.046875,0.594614,
+ 1.142888,0.046875,0.594614, 1.230115,0.0648,0.639996, 1.118749,0.0648,0.821035,
+ 0.981504,0.0648,0.981504, 0.911906,0.046875,0.911906, 1.039419,0.046875,0.762816,
+ 1.039419,0.046875,0.762816, 1.118749,0.0648,0.821035, 0.981504,0.0648,0.981504,
+ 0.821035,0.0648,1.118749, 0.762816,0.046875,1.039419, 0.911906,0.046875,0.911906,
+ 0.911906,0.046875,0.911906, 0.981504,0.0648,0.981504, 0.821035,0.0648,1.118749,
+ 0.639996,0.0648,1.230115, 0.594614,0.046875,1.142888, 0.762816,0.046875,1.039419,
+ 0.762816,0.046875,1.039419, 0.821035,0.0648,1.118749, 0.639996,0.0648,1.230115,
+ 0.441041,0.0648,1.312948, 0.409767,0.046875,1.219848, 0.594614,0.046875,1.142888,
+ 0.594614,0.046875,1.142888, 0.639996,0.0648,1.230115, 0.441041,0.0648,1.312948,
+ 0.226824,0.0648,1.364595, 0.21074,0.046875,1.267832, 0.409767,0.046875,1.219848,
+ 0.409767,0.046875,1.219848, 0.441041,0.0648,1.312948, 0.226824,0.0648,1.364595,
+ 0,0.0648,1.3824, 0,0.046875,1.284375, 0.21074,0.046875,1.267832,
+ 0.21074,0.046875,1.267832, 0.226824,0.0648,1.364595, 0,0.0648,1.3824,
+ 1.426709,0.084525,0.237149, 1.364595,0.0648,0.226824, 1.3824,0.0648,0,
+ 1.3824,0.0648,0, 1.445325,0.084525,0, 1.426709,0.084525,0.237149,
+ 1.372712,0.084525,0.461116, 1.312948,0.0648,0.441041, 1.364595,0.0648,0.226824,
+ 1.364595,0.0648,0.226824, 1.426709,0.084525,0.237149, 1.372712,0.084525,0.461116,
+ 1.286108,0.084525,0.669128, 1.230115,0.0648,0.639996, 1.312948,0.0648,0.441041,
+ 1.312948,0.0648,0.441041, 1.372712,0.084525,0.461116, 1.286108,0.084525,0.669128,
+ 1.169673,0.084525,0.858407, 1.118749,0.0648,0.821035, 1.230115,0.0648,0.639996,
+ 1.230115,0.0648,0.639996, 1.286108,0.084525,0.669128, 1.169673,0.084525,0.858407,
+ 1.026181,0.084525,1.026181, 0.981504,0.0648,0.981504, 1.118749,0.0648,0.821035,
+ 1.118749,0.0648,0.821035, 1.169673,0.084525,0.858407, 1.026181,0.084525,1.026181,
+ 0.858407,0.084525,1.169673, 0.821035,0.0648,1.118749, 0.981504,0.0648,0.981504,
+ 0.981504,0.0648,0.981504, 1.026181,0.084525,1.026181, 0.858407,0.084525,1.169673,
+ 0.669128,0.084525,1.286108, 0.639996,0.0648,1.230115, 0.821035,0.0648,1.118749,
+ 0.821035,0.0648,1.118749, 0.858407,0.084525,1.169673, 0.669128,0.084525,1.286108,
+ 0.461116,0.084525,1.372712, 0.441041,0.0648,1.312948, 0.639996,0.0648,1.230115,
+ 0.639996,0.0648,1.230115, 0.669128,0.084525,1.286108, 0.461116,0.084525,1.372712,
+ 0.237149,0.084525,1.426709, 0.226824,0.0648,1.364595, 0.441041,0.0648,1.312948,
+ 0.441041,0.0648,1.312948, 0.461116,0.084525,1.372712, 0.237149,0.084525,1.426709,
+ 0,0.084525,1.445325, 0,0.0648,1.3824, 0.226824,0.0648,1.364595,
+ 0.226824,0.0648,1.364595, 0.237149,0.084525,1.426709, 0,0.084525,1.445325,
+ 1.461727,0.1056,0.24297, 1.426709,0.084525,0.237149, 1.445325,0.084525,0,
+ 1.445325,0.084525,0, 1.4808,0.1056,0, 1.461727,0.1056,0.24297,
+ 1.406405,0.1056,0.472434, 1.372712,0.084525,0.461116, 1.426709,0.084525,0.237149,
+ 1.426709,0.084525,0.237149, 1.461727,0.1056,0.24297, 1.406405,0.1056,0.472434,
+ 1.317675,0.1056,0.685551, 1.286108,0.084525,0.669128, 1.372712,0.084525,0.461116,
+ 1.372712,0.084525,0.461116, 1.406405,0.1056,0.472434, 1.317675,0.1056,0.685551,
+ 1.198382,0.1056,0.879477, 1.169673,0.084525,0.858407, 1.286108,0.084525,0.669128,
+ 1.286108,0.084525,0.669128, 1.317675,0.1056,0.685551, 1.198382,0.1056,0.879477,
+ 1.051368,0.1056,1.051368, 1.026181,0.084525,1.026181, 1.169673,0.084525,0.858407,
+ 1.169673,0.084525,0.858407, 1.198382,0.1056,0.879477, 1.051368,0.1056,1.051368,
+ 0.879477,0.1056,1.198382, 0.858407,0.084525,1.169673, 1.026181,0.084525,1.026181,
+ 1.026181,0.084525,1.026181, 1.051368,0.1056,1.051368, 0.879477,0.1056,1.198382,
+ 0.685551,0.1056,1.317675, 0.669128,0.084525,1.286108, 0.858407,0.084525,1.169673,
+ 0.858407,0.084525,1.169673, 0.879477,0.1056,1.198382, 0.685551,0.1056,1.317675,
+ 0.472434,0.1056,1.406405, 0.461116,0.084525,1.372712, 0.669128,0.084525,1.286108,
+ 0.669128,0.084525,1.286108, 0.685551,0.1056,1.317675, 0.472434,0.1056,1.406405,
+ 0.24297,0.1056,1.461727, 0.237149,0.084525,1.426709, 0.461116,0.084525,1.372712,
+ 0.461116,0.084525,1.372712, 0.472434,0.1056,1.406405, 0.24297,0.1056,1.461727,
+ 0,0.1056,1.4808, 0,0.084525,1.445325, 0.237149,0.084525,1.426709,
+ 0.237149,0.084525,1.426709, 0.24297,0.1056,1.461727, 0,0.1056,1.4808,
+ 1.4772,0.127575,0.245542, 1.461727,0.1056,0.24297, 1.4808,0.1056,0,
+ 1.4808,0.1056,0, 1.496475,0.127575,0, 1.4772,0.127575,0.245542,
+ 1.421292,0.127575,0.477435, 1.406405,0.1056,0.472434, 1.461727,0.1056,0.24297,
+ 1.461727,0.1056,0.24297, 1.4772,0.127575,0.245542, 1.421292,0.127575,0.477435,
+ 1.331623,0.127575,0.692808, 1.317675,0.1056,0.685551, 1.406405,0.1056,0.472434,
+ 1.406405,0.1056,0.472434, 1.421292,0.127575,0.477435, 1.331623,0.127575,0.692808,
+ 1.211067,0.127575,0.888786, 1.198382,0.1056,0.879477, 1.317675,0.1056,0.685551,
+ 1.317675,0.1056,0.685551, 1.331623,0.127575,0.692808, 1.211067,0.127575,0.888786,
+ 1.062497,0.127575,1.062497, 1.051368,0.1056,1.051368, 1.198382,0.1056,0.879477,
+ 1.198382,0.1056,0.879477, 1.211067,0.127575,0.888786, 1.062497,0.127575,1.062497,
+ 0.888786,0.127575,1.211067, 0.879477,0.1056,1.198382, 1.051368,0.1056,1.051368,
+ 1.051368,0.1056,1.051368, 1.062497,0.127575,1.062497, 0.888786,0.127575,1.211067,
+ 0.692808,0.127575,1.331623, 0.685551,0.1056,1.317675, 0.879477,0.1056,1.198382,
+ 0.879477,0.1056,1.198382, 0.888786,0.127575,1.211067, 0.692808,0.127575,1.331623,
+ 0.477435,0.127575,1.421292, 0.472434,0.1056,1.406405, 0.685551,0.1056,1.317675,
+ 0.685551,0.1056,1.317675, 0.692808,0.127575,1.331623, 0.477435,0.127575,1.421292,
+ 0.245542,0.127575,1.4772, 0.24297,0.1056,1.461727, 0.472434,0.1056,1.406405,
+ 0.472434,0.1056,1.406405, 0.477435,0.127575,1.421292, 0.245542,0.127575,1.4772,
+ 0,0.127575,1.496475, 0,0.1056,1.4808, 0.24297,0.1056,1.461727,
+ 0.24297,0.1056,1.461727, 0.245542,0.127575,1.4772, 0,0.127575,1.496475,
+ 1.48068,0.15,0.24612, 1.4772,0.127575,0.245542, 1.496475,0.127575,0,
+ 1.496475,0.127575,0, 1.5,0.15,0, 1.48068,0.15,0.24612,
+ 1.42464,0.15,0.47856, 1.421292,0.127575,0.477435, 1.4772,0.127575,0.245542,
+ 1.4772,0.127575,0.245542, 1.48068,0.15,0.24612, 1.42464,0.15,0.47856,
+ 1.33476,0.15,0.69444, 1.331623,0.127575,0.692808, 1.421292,0.127575,0.477435,
+ 1.421292,0.127575,0.477435, 1.42464,0.15,0.47856, 1.33476,0.15,0.69444,
+ 1.21392,0.15,0.89088, 1.211067,0.127575,0.888786, 1.331623,0.127575,0.692808,
+ 1.331623,0.127575,0.692808, 1.33476,0.15,0.69444, 1.21392,0.15,0.89088,
+ 1.065,0.15,1.065, 1.062497,0.127575,1.062497, 1.211067,0.127575,0.888786,
+ 1.211067,0.127575,0.888786, 1.21392,0.15,0.89088, 1.065,0.15,1.065,
+ 0.89088,0.15,1.21392, 0.888786,0.127575,1.211067, 1.062497,0.127575,1.062497,
+ 1.062497,0.127575,1.062497, 1.065,0.15,1.065, 0.89088,0.15,1.21392,
+ 0.69444,0.15,1.33476, 0.692808,0.127575,1.331623, 0.888786,0.127575,1.211067,
+ 0.888786,0.127575,1.211067, 0.89088,0.15,1.21392, 0.69444,0.15,1.33476,
+ 0.47856,0.15,1.42464, 0.477435,0.127575,1.421292, 0.692808,0.127575,1.331623,
+ 0.692808,0.127575,1.331623, 0.69444,0.15,1.33476, 0.47856,0.15,1.42464,
+ 0.24612,0.15,1.48068, 0.245542,0.127575,1.4772, 0.477435,0.127575,1.421292,
+ 0.477435,0.127575,1.421292, 0.47856,0.15,1.42464, 0.24612,0.15,1.48068,
+ 0,0.15,1.5, 0,0.127575,1.496475, 0.245542,0.127575,1.4772,
+ 0.245542,0.127575,1.4772, 0.24612,0.15,1.48068, 0,0.15,1.5,
+ 0,0,0, 0,0.002175,0.388275, -0.063708,0.002175,0.383274,
+ 0,0,0, -0.063708,0.002175,0.383274, -0.123875,0.002175,0.368768,
+ 0,0,0, -0.123875,0.002175,0.368768, -0.179756,0.002175,0.345503,
+ 0,0,0, -0.179756,0.002175,0.345503, -0.230604,0.002175,0.314223,
+ 0,0,0, -0.230604,0.002175,0.314223, -0.275675,0.002175,0.275675,
+ 0,0,0, -0.275675,0.002175,0.275675, -0.314223,0.002175,0.230604,
+ 0,0,0, -0.314223,0.002175,0.230604, -0.345503,0.002175,0.179756,
+ 0,0,0, -0.345503,0.002175,0.179756, -0.368768,0.002175,0.123875,
+ 0,0,0, -0.368768,0.002175,0.123875, -0.383274,0.002175,0.063708,
+ 0,0,0, -0.383274,0.002175,0.063708, -0.388275,0.002175,0,
+ -0.115381,0.0084,0.694143, -0.063708,0.002175,0.383274, 0,0.002175,0.388275,
+ 0,0.002175,0.388275, 0,0.0084,0.7032, -0.115381,0.0084,0.694143,
+ -0.224349,0.0084,0.667871, -0.123875,0.002175,0.368768, -0.063708,0.002175,0.383274,
+ -0.063708,0.002175,0.383274, -0.115381,0.0084,0.694143, -0.224349,0.0084,0.667871,
+ -0.325553,0.0084,0.625735, -0.179756,0.002175,0.345503, -0.123875,0.002175,0.368768,
+ -0.123875,0.002175,0.368768, -0.224349,0.0084,0.667871, -0.325553,0.0084,0.625735,
+ -0.417645,0.0084,0.569086, -0.230604,0.002175,0.314223, -0.179756,0.002175,0.345503,
+ -0.179756,0.002175,0.345503, -0.325553,0.0084,0.625735, -0.417645,0.0084,0.569086,
+ -0.499272,0.0084,0.499272, -0.275675,0.002175,0.275675, -0.230604,0.002175,0.314223,
+ -0.230604,0.002175,0.314223, -0.417645,0.0084,0.569086, -0.499272,0.0084,0.499272,
+ -0.569086,0.0084,0.417645, -0.314223,0.002175,0.230604, -0.275675,0.002175,0.275675,
+ -0.275675,0.002175,0.275675, -0.499272,0.0084,0.499272, -0.569086,0.0084,0.417645,
+ -0.625735,0.0084,0.325553, -0.345503,0.002175,0.179756, -0.314223,0.002175,0.230604,
+ -0.314223,0.002175,0.230604, -0.569086,0.0084,0.417645, -0.625735,0.0084,0.325553,
+ -0.667871,0.0084,0.224349, -0.368768,0.002175,0.123875, -0.345503,0.002175,0.179756,
+ -0.345503,0.002175,0.179756, -0.625735,0.0084,0.325553, -0.667871,0.0084,0.224349,
+ -0.694143,0.0084,0.115381, -0.383274,0.002175,0.063708, -0.368768,0.002175,0.123875,
+ -0.368768,0.002175,0.123875, -0.667871,0.0084,0.224349, -0.694143,0.0084,0.115381,
+ -0.7032,0.0084,0, -0.388275,0.002175,0, -0.383274,0.002175,0.063708,
+ -0.383274,0.002175,0.063708, -0.694143,0.0084,0.115381, -0.7032,0.0084,0,
+ -0.156274,0.018225,0.940158, -0.115381,0.0084,0.694143, 0,0.0084,0.7032,
+ 0,0.0084,0.7032, 0,0.018225,0.952425, -0.156274,0.018225,0.940158,
+ -0.303862,0.018225,0.904575, -0.224349,0.0084,0.667871, -0.115381,0.0084,0.694143,
+ -0.115381,0.0084,0.694143, -0.156274,0.018225,0.940158, -0.303862,0.018225,0.904575,
+ -0.440935,0.018225,0.847506, -0.325553,0.0084,0.625735, -0.224349,0.0084,0.667871,
+ -0.224349,0.0084,0.667871, -0.303862,0.018225,0.904575, -0.440935,0.018225,0.847506,
+ -0.565664,0.018225,0.770779, -0.417645,0.0084,0.569086, -0.325553,0.0084,0.625735,
+ -0.325553,0.0084,0.625735, -0.440935,0.018225,0.847506, -0.565664,0.018225,0.770779,
+ -0.676222,0.018225,0.676222, -0.499272,0.0084,0.499272, -0.417645,0.0084,0.569086,
+ -0.417645,0.0084,0.569086, -0.565664,0.018225,0.770779, -0.676222,0.018225,0.676222,
+ -0.770779,0.018225,0.565664, -0.569086,0.0084,0.417645, -0.499272,0.0084,0.499272,
+ -0.499272,0.0084,0.499272, -0.676222,0.018225,0.676222, -0.770779,0.018225,0.565664,
+ -0.847506,0.018225,0.440935, -0.625735,0.0084,0.325553, -0.569086,0.0084,0.417645,
+ -0.569086,0.0084,0.417645, -0.770779,0.018225,0.565664, -0.847506,0.018225,0.440935,
+ -0.904575,0.018225,0.303862, -0.667871,0.0084,0.224349, -0.625735,0.0084,0.325553,
+ -0.625735,0.0084,0.325553, -0.847506,0.018225,0.440935, -0.904575,0.018225,0.303862,
+ -0.940158,0.018225,0.156274, -0.694143,0.0084,0.115381, -0.667871,0.0084,0.224349,
+ -0.667871,0.0084,0.224349, -0.904575,0.018225,0.303862, -0.940158,0.018225,0.156274,
+ -0.952425,0.018225,0, -0.7032,0.0084,0, -0.694143,0.0084,0.115381,
+ -0.694143,0.0084,0.115381, -0.940158,0.018225,0.156274, -0.952425,0.018225,0,
+ -0.187642,0.0312,1.12887, -0.156274,0.018225,0.940158, 0,0.018225,0.952425,
+ 0,0.018225,0.952425, 0,0.0312,1.1436, -0.187642,0.0312,1.12887,
+ -0.364854,0.0312,1.086146, -0.303862,0.018225,0.904575, -0.156274,0.018225,0.940158,
+ -0.156274,0.018225,0.940158, -0.187642,0.0312,1.12887, -0.364854,0.0312,1.086146,
+ -0.529441,0.0312,1.017621, -0.440935,0.018225,0.847506, -0.303862,0.018225,0.904575,
+ -0.303862,0.018225,0.904575, -0.364854,0.0312,1.086146, -0.529441,0.0312,1.017621,
+ -0.679207,0.0312,0.925493, -0.565664,0.018225,0.770779, -0.440935,0.018225,0.847506,
+ -0.440935,0.018225,0.847506, -0.529441,0.0312,1.017621, -0.679207,0.0312,0.925493,
+ -0.811956,0.0312,0.811956, -0.676222,0.018225,0.676222, -0.565664,0.018225,0.770779,
+ -0.565664,0.018225,0.770779, -0.679207,0.0312,0.925493, -0.811956,0.0312,0.811956,
+ -0.925493,0.0312,0.679207, -0.770779,0.018225,0.565664, -0.676222,0.018225,0.676222,
+ -0.676222,0.018225,0.676222, -0.811956,0.0312,0.811956, -0.925493,0.0312,0.679207,
+ -1.017621,0.0312,0.529441, -0.847506,0.018225,0.440935, -0.770779,0.018225,0.565664,
+ -0.770779,0.018225,0.565664, -0.925493,0.0312,0.679207, -1.017621,0.0312,0.529441,
+ -1.086146,0.0312,0.364854, -0.904575,0.018225,0.303862, -0.847506,0.018225,0.440935,
+ -0.847506,0.018225,0.440935, -1.017621,0.0312,0.529441, -1.086146,0.0312,0.364854,
+ -1.12887,0.0312,0.187642, -0.940158,0.018225,0.156274, -0.904575,0.018225,0.303862,
+ -0.904575,0.018225,0.303862, -1.086146,0.0312,0.364854, -1.12887,0.0312,0.187642,
+ -1.1436,0.0312,0, -0.952425,0.018225,0, -0.940158,0.018225,0.156274,
+ -0.940158,0.018225,0.156274, -1.12887,0.0312,0.187642, -1.1436,0.0312,0,
+ -0.21074,0.046875,1.267832, -0.187642,0.0312,1.12887, 0,0.0312,1.1436,
+ 0,0.0312,1.1436, 0,0.046875,1.284375, -0.21074,0.046875,1.267832,
+ -0.409767,0.046875,1.219848, -0.364854,0.0312,1.086146, -0.187642,0.0312,1.12887,
+ -0.187642,0.0312,1.12887, -0.21074,0.046875,1.267832, -0.409767,0.046875,1.219848,
+ -0.594614,0.046875,1.142888, -0.529441,0.0312,1.017621, -0.364854,0.0312,1.086146,
+ -0.364854,0.0312,1.086146, -0.409767,0.046875,1.219848, -0.594614,0.046875,1.142888,
+ -0.762816,0.046875,1.039419, -0.679207,0.0312,0.925493, -0.529441,0.0312,1.017621,
+ -0.529441,0.0312,1.017621, -0.594614,0.046875,1.142888, -0.762816,0.046875,1.039419,
+ -0.911906,0.046875,0.911906, -0.811956,0.0312,0.811956, -0.679207,0.0312,0.925493,
+ -0.679207,0.0312,0.925493, -0.762816,0.046875,1.039419, -0.911906,0.046875,0.911906,
+ -1.039419,0.046875,0.762816, -0.925493,0.0312,0.679207, -0.811956,0.0312,0.811956,
+ -0.811956,0.0312,0.811956, -0.911906,0.046875,0.911906, -1.039419,0.046875,0.762816,
+ -1.142888,0.046875,0.594614, -1.017621,0.0312,0.529441, -0.925493,0.0312,0.679207,
+ -0.925493,0.0312,0.679207, -1.039419,0.046875,0.762816, -1.142888,0.046875,0.594614,
+ -1.219848,0.046875,0.409767, -1.086146,0.0312,0.364854, -1.017621,0.0312,0.529441,
+ -1.017621,0.0312,0.529441, -1.142888,0.046875,0.594614, -1.219848,0.046875,0.409767,
+ -1.267832,0.046875,0.21074, -1.12887,0.0312,0.187642, -1.086146,0.0312,0.364854,
+ -1.086146,0.0312,0.364854, -1.219848,0.046875,0.409767, -1.267832,0.046875,0.21074,
+ -1.284375,0.046875,0, -1.1436,0.0312,0, -1.12887,0.0312,0.187642,
+ -1.12887,0.0312,0.187642, -1.267832,0.046875,0.21074, -1.284375,0.046875,0,
+ -0.226824,0.0648,1.364595, -0.21074,0.046875,1.267832, 0,0.046875,1.284375,
+ 0,0.046875,1.284375, 0,0.0648,1.3824, -0.226824,0.0648,1.364595,
+ -0.441041,0.0648,1.312948, -0.409767,0.046875,1.219848, -0.21074,0.046875,1.267832,
+ -0.21074,0.046875,1.267832, -0.226824,0.0648,1.364595, -0.441041,0.0648,1.312948,
+ -0.639996,0.0648,1.230115, -0.594614,0.046875,1.142888, -0.409767,0.046875,1.219848,
+ -0.409767,0.046875,1.219848, -0.441041,0.0648,1.312948, -0.639996,0.0648,1.230115,
+ -0.821035,0.0648,1.118749, -0.762816,0.046875,1.039419, -0.594614,0.046875,1.142888,
+ -0.594614,0.046875,1.142888, -0.639996,0.0648,1.230115, -0.821035,0.0648,1.118749,
+ -0.981504,0.0648,0.981504, -0.911906,0.046875,0.911906, -0.762816,0.046875,1.039419,
+ -0.762816,0.046875,1.039419, -0.821035,0.0648,1.118749, -0.981504,0.0648,0.981504,
+ -1.118749,0.0648,0.821035, -1.039419,0.046875,0.762816, -0.911906,0.046875,0.911906,
+ -0.911906,0.046875,0.911906, -0.981504,0.0648,0.981504, -1.118749,0.0648,0.821035,
+ -1.230115,0.0648,0.639996, -1.142888,0.046875,0.594614, -1.039419,0.046875,0.762816,
+ -1.039419,0.046875,0.762816, -1.118749,0.0648,0.821035, -1.230115,0.0648,0.639996,
+ -1.312948,0.0648,0.441041, -1.219848,0.046875,0.409767, -1.142888,0.046875,0.594614,
+ -1.142888,0.046875,0.594614, -1.230115,0.0648,0.639996, -1.312948,0.0648,0.441041,
+ -1.364595,0.0648,0.226824, -1.267832,0.046875,0.21074, -1.219848,0.046875,0.409767,
+ -1.219848,0.046875,0.409767, -1.312948,0.0648,0.441041, -1.364595,0.0648,0.226824,
+ -1.3824,0.0648,0, -1.284375,0.046875,0, -1.267832,0.046875,0.21074,
+ -1.267832,0.046875,0.21074, -1.364595,0.0648,0.226824, -1.3824,0.0648,0,
+ -0.237149,0.084525,1.426709, -0.226824,0.0648,1.364595, 0,0.0648,1.3824,
+ 0,0.0648,1.3824, 0,0.084525,1.445325, -0.237149,0.084525,1.426709,
+ -0.461116,0.084525,1.372712, -0.441041,0.0648,1.312948, -0.226824,0.0648,1.364595,
+ -0.226824,0.0648,1.364595, -0.237149,0.084525,1.426709, -0.461116,0.084525,1.372712,
+ -0.669128,0.084525,1.286108, -0.639996,0.0648,1.230115, -0.441041,0.0648,1.312948,
+ -0.441041,0.0648,1.312948, -0.461116,0.084525,1.372712, -0.669128,0.084525,1.286108,
+ -0.858407,0.084525,1.169673, -0.821035,0.0648,1.118749, -0.639996,0.0648,1.230115,
+ -0.639996,0.0648,1.230115, -0.669128,0.084525,1.286108, -0.858407,0.084525,1.169673,
+ -1.026181,0.084525,1.026181, -0.981504,0.0648,0.981504, -0.821035,0.0648,1.118749,
+ -0.821035,0.0648,1.118749, -0.858407,0.084525,1.169673, -1.026181,0.084525,1.026181,
+ -1.169673,0.084525,0.858407, -1.118749,0.0648,0.821035, -0.981504,0.0648,0.981504,
+ -0.981504,0.0648,0.981504, -1.026181,0.084525,1.026181, -1.169673,0.084525,0.858407,
+ -1.286108,0.084525,0.669128, -1.230115,0.0648,0.639996, -1.118749,0.0648,0.821035,
+ -1.118749,0.0648,0.821035, -1.169673,0.084525,0.858407, -1.286108,0.084525,0.669128,
+ -1.372712,0.084525,0.461116, -1.312948,0.0648,0.441041, -1.230115,0.0648,0.639996,
+ -1.230115,0.0648,0.639996, -1.286108,0.084525,0.669128, -1.372712,0.084525,0.461116,
+ -1.426709,0.084525,0.237149, -1.364595,0.0648,0.226824, -1.312948,0.0648,0.441041,
+ -1.312948,0.0648,0.441041, -1.372712,0.084525,0.461116, -1.426709,0.084525,0.237149,
+ -1.445325,0.084525,0, -1.3824,0.0648,0, -1.364595,0.0648,0.226824,
+ -1.364595,0.0648,0.226824, -1.426709,0.084525,0.237149, -1.445325,0.084525,0,
+ -0.24297,0.1056,1.461727, -0.237149,0.084525,1.426709, 0,0.084525,1.445325,
+ 0,0.084525,1.445325, 0,0.1056,1.4808, -0.24297,0.1056,1.461727,
+ -0.472434,0.1056,1.406405, -0.461116,0.084525,1.372712, -0.237149,0.084525,1.426709,
+ -0.237149,0.084525,1.426709, -0.24297,0.1056,1.461727, -0.472434,0.1056,1.406405,
+ -0.685551,0.1056,1.317675, -0.669128,0.084525,1.286108, -0.461116,0.084525,1.372712,
+ -0.461116,0.084525,1.372712, -0.472434,0.1056,1.406405, -0.685551,0.1056,1.317675,
+ -0.879477,0.1056,1.198382, -0.858407,0.084525,1.169673, -0.669128,0.084525,1.286108,
+ -0.669128,0.084525,1.286108, -0.685551,0.1056,1.317675, -0.879477,0.1056,1.198382,
+ -1.051368,0.1056,1.051368, -1.026181,0.084525,1.026181, -0.858407,0.084525,1.169673,
+ -0.858407,0.084525,1.169673, -0.879477,0.1056,1.198382, -1.051368,0.1056,1.051368,
+ -1.198382,0.1056,0.879477, -1.169673,0.084525,0.858407, -1.026181,0.084525,1.026181,
+ -1.026181,0.084525,1.026181, -1.051368,0.1056,1.051368, -1.198382,0.1056,0.879477,
+ -1.317675,0.1056,0.685551, -1.286108,0.084525,0.669128, -1.169673,0.084525,0.858407,
+ -1.169673,0.084525,0.858407, -1.198382,0.1056,0.879477, -1.317675,0.1056,0.685551,
+ -1.406405,0.1056,0.472434, -1.372712,0.084525,0.461116, -1.286108,0.084525,0.669128,
+ -1.286108,0.084525,0.669128, -1.317675,0.1056,0.685551, -1.406405,0.1056,0.472434,
+ -1.461727,0.1056,0.24297, -1.426709,0.084525,0.237149, -1.372712,0.084525,0.461116,
+ -1.372712,0.084525,0.461116, -1.406405,0.1056,0.472434, -1.461727,0.1056,0.24297,
+ -1.4808,0.1056,0, -1.445325,0.084525,0, -1.426709,0.084525,0.237149,
+ -1.426709,0.084525,0.237149, -1.461727,0.1056,0.24297, -1.4808,0.1056,0,
+ -0.245542,0.127575,1.4772, -0.24297,0.1056,1.461727, 0,0.1056,1.4808,
+ 0,0.1056,1.4808, 0,0.127575,1.496475, -0.245542,0.127575,1.4772,
+ -0.477435,0.127575,1.421292, -0.472434,0.1056,1.406405, -0.24297,0.1056,1.461727,
+ -0.24297,0.1056,1.461727, -0.245542,0.127575,1.4772, -0.477435,0.127575,1.421292,
+ -0.692808,0.127575,1.331623, -0.685551,0.1056,1.317675, -0.472434,0.1056,1.406405,
+ -0.472434,0.1056,1.406405, -0.477435,0.127575,1.421292, -0.692808,0.127575,1.331623,
+ -0.888786,0.127575,1.211067, -0.879477,0.1056,1.198382, -0.685551,0.1056,1.317675,
+ -0.685551,0.1056,1.317675, -0.692808,0.127575,1.331623, -0.888786,0.127575,1.211067,
+ -1.062497,0.127575,1.062497, -1.051368,0.1056,1.051368, -0.879477,0.1056,1.198382,
+ -0.879477,0.1056,1.198382, -0.888786,0.127575,1.211067, -1.062497,0.127575,1.062497,
+ -1.211067,0.127575,0.888786, -1.198382,0.1056,0.879477, -1.051368,0.1056,1.051368,
+ -1.051368,0.1056,1.051368, -1.062497,0.127575,1.062497, -1.211067,0.127575,0.888786,
+ -1.331623,0.127575,0.692808, -1.317675,0.1056,0.685551, -1.198382,0.1056,0.879477,
+ -1.198382,0.1056,0.879477, -1.211067,0.127575,0.888786, -1.331623,0.127575,0.692808,
+ -1.421292,0.127575,0.477435, -1.406405,0.1056,0.472434, -1.317675,0.1056,0.685551,
+ -1.317675,0.1056,0.685551, -1.331623,0.127575,0.692808, -1.421292,0.127575,0.477435,
+ -1.4772,0.127575,0.245542, -1.461727,0.1056,0.24297, -1.406405,0.1056,0.472434,
+ -1.406405,0.1056,0.472434, -1.421292,0.127575,0.477435, -1.4772,0.127575,0.245542,
+ -1.496475,0.127575,0, -1.4808,0.1056,0, -1.461727,0.1056,0.24297,
+ -1.461727,0.1056,0.24297, -1.4772,0.127575,0.245542, -1.496475,0.127575,0,
+ -0.24612,0.15,1.48068, -0.245542,0.127575,1.4772, 0,0.127575,1.496475,
+ 0,0.127575,1.496475, 0,0.15,1.5, -0.24612,0.15,1.48068,
+ -0.47856,0.15,1.42464, -0.477435,0.127575,1.421292, -0.245542,0.127575,1.4772,
+ -0.245542,0.127575,1.4772, -0.24612,0.15,1.48068, -0.47856,0.15,1.42464,
+ -0.69444,0.15,1.33476, -0.692808,0.127575,1.331623, -0.477435,0.127575,1.421292,
+ -0.477435,0.127575,1.421292, -0.47856,0.15,1.42464, -0.69444,0.15,1.33476,
+ -0.89088,0.15,1.21392, -0.888786,0.127575,1.211067, -0.692808,0.127575,1.331623,
+ -0.692808,0.127575,1.331623, -0.69444,0.15,1.33476, -0.89088,0.15,1.21392,
+ -1.065,0.15,1.065, -1.062497,0.127575,1.062497, -0.888786,0.127575,1.211067,
+ -0.888786,0.127575,1.211067, -0.89088,0.15,1.21392, -1.065,0.15,1.065,
+ -1.21392,0.15,0.89088, -1.211067,0.127575,0.888786, -1.062497,0.127575,1.062497,
+ -1.062497,0.127575,1.062497, -1.065,0.15,1.065, -1.21392,0.15,0.89088,
+ -1.33476,0.15,0.69444, -1.331623,0.127575,0.692808, -1.211067,0.127575,0.888786,
+ -1.211067,0.127575,0.888786, -1.21392,0.15,0.89088, -1.33476,0.15,0.69444,
+ -1.42464,0.15,0.47856, -1.421292,0.127575,0.477435, -1.331623,0.127575,0.692808,
+ -1.331623,0.127575,0.692808, -1.33476,0.15,0.69444, -1.42464,0.15,0.47856,
+ -1.48068,0.15,0.24612, -1.4772,0.127575,0.245542, -1.421292,0.127575,0.477435,
+ -1.421292,0.127575,0.477435, -1.42464,0.15,0.47856, -1.48068,0.15,0.24612,
+ -1.5,0.15,0, -1.496475,0.127575,0, -1.4772,0.127575,0.245542,
+ -1.4772,0.127575,0.245542, -1.48068,0.15,0.24612, -1.5,0.15,0,
+ 0,0,0, -0.388275,0.002175,0, -0.383274,0.002175,-0.063708,
+ 0,0,0, -0.383274,0.002175,-0.063708, -0.368768,0.002175,-0.123875,
+ 0,0,0, -0.368768,0.002175,-0.123875, -0.345503,0.002175,-0.179756,
+ 0,0,0, -0.345503,0.002175,-0.179756, -0.314223,0.002175,-0.230604,
+ 0,0,0, -0.314223,0.002175,-0.230604, -0.275675,0.002175,-0.275675,
+ 0,0,0, -0.275675,0.002175,-0.275675, -0.230604,0.002175,-0.314223,
+ 0,0,0, -0.230604,0.002175,-0.314223, -0.179756,0.002175,-0.345503,
+ 0,0,0, -0.179756,0.002175,-0.345503, -0.123875,0.002175,-0.368768,
+ 0,0,0, -0.123875,0.002175,-0.368768, -0.063708,0.002175,-0.383274,
+ 0,0,0, -0.063708,0.002175,-0.383274, 0,0.002175,-0.388275,
+ -0.694143,0.0084,-0.115381, -0.383274,0.002175,-0.063708, -0.388275,0.002175,0,
+ -0.388275,0.002175,0, -0.7032,0.0084,0, -0.694143,0.0084,-0.115381,
+ -0.667871,0.0084,-0.224349, -0.368768,0.002175,-0.123875, -0.383274,0.002175,-0.063708,
+ -0.383274,0.002175,-0.063708, -0.694143,0.0084,-0.115381, -0.667871,0.0084,-0.224349,
+ -0.625735,0.0084,-0.325553, -0.345503,0.002175,-0.179756, -0.368768,0.002175,-0.123875,
+ -0.368768,0.002175,-0.123875, -0.667871,0.0084,-0.224349, -0.625735,0.0084,-0.325553,
+ -0.569086,0.0084,-0.417645, -0.314223,0.002175,-0.230604, -0.345503,0.002175,-0.179756,
+ -0.345503,0.002175,-0.179756, -0.625735,0.0084,-0.325553, -0.569086,0.0084,-0.417645,
+ -0.499272,0.0084,-0.499272, -0.275675,0.002175,-0.275675, -0.314223,0.002175,-0.230604,
+ -0.314223,0.002175,-0.230604, -0.569086,0.0084,-0.417645, -0.499272,0.0084,-0.499272,
+ -0.417645,0.0084,-0.569086, -0.230604,0.002175,-0.314223, -0.275675,0.002175,-0.275675,
+ -0.275675,0.002175,-0.275675, -0.499272,0.0084,-0.499272, -0.417645,0.0084,-0.569086,
+ -0.325553,0.0084,-0.625735, -0.179756,0.002175,-0.345503, -0.230604,0.002175,-0.314223,
+ -0.230604,0.002175,-0.314223, -0.417645,0.0084,-0.569086, -0.325553,0.0084,-0.625735,
+ -0.224349,0.0084,-0.667871, -0.123875,0.002175,-0.368768, -0.179756,0.002175,-0.345503,
+ -0.179756,0.002175,-0.345503, -0.325553,0.0084,-0.625735, -0.224349,0.0084,-0.667871,
+ -0.115381,0.0084,-0.694143, -0.063708,0.002175,-0.383274, -0.123875,0.002175,-0.368768,
+ -0.123875,0.002175,-0.368768, -0.224349,0.0084,-0.667871, -0.115381,0.0084,-0.694143,
+ 0,0.0084,-0.7032, 0,0.002175,-0.388275, -0.063708,0.002175,-0.383274,
+ -0.063708,0.002175,-0.383274, -0.115381,0.0084,-0.694143, 0,0.0084,-0.7032,
+ -0.940158,0.018225,-0.156274, -0.694143,0.0084,-0.115381, -0.7032,0.0084,0,
+ -0.7032,0.0084,0, -0.952425,0.018225,0, -0.940158,0.018225,-0.156274,
+ -0.904575,0.018225,-0.303862, -0.667871,0.0084,-0.224349, -0.694143,0.0084,-0.115381,
+ -0.694143,0.0084,-0.115381, -0.940158,0.018225,-0.156274, -0.904575,0.018225,-0.303862,
+ -0.847506,0.018225,-0.440935, -0.625735,0.0084,-0.325553, -0.667871,0.0084,-0.224349,
+ -0.667871,0.0084,-0.224349, -0.904575,0.018225,-0.303862, -0.847506,0.018225,-0.440935,
+ -0.770779,0.018225,-0.565664, -0.569086,0.0084,-0.417645, -0.625735,0.0084,-0.325553,
+ -0.625735,0.0084,-0.325553, -0.847506,0.018225,-0.440935, -0.770779,0.018225,-0.565664,
+ -0.676222,0.018225,-0.676222, -0.499272,0.0084,-0.499272, -0.569086,0.0084,-0.417645,
+ -0.569086,0.0084,-0.417645, -0.770779,0.018225,-0.565664, -0.676222,0.018225,-0.676222,
+ -0.565664,0.018225,-0.770779, -0.417645,0.0084,-0.569086, -0.499272,0.0084,-0.499272,
+ -0.499272,0.0084,-0.499272, -0.676222,0.018225,-0.676222, -0.565664,0.018225,-0.770779,
+ -0.440935,0.018225,-0.847506, -0.325553,0.0084,-0.625735, -0.417645,0.0084,-0.569086,
+ -0.417645,0.0084,-0.569086, -0.565664,0.018225,-0.770779, -0.440935,0.018225,-0.847506,
+ -0.303862,0.018225,-0.904575, -0.224349,0.0084,-0.667871, -0.325553,0.0084,-0.625735,
+ -0.325553,0.0084,-0.625735, -0.440935,0.018225,-0.847506, -0.303862,0.018225,-0.904575,
+ -0.156274,0.018225,-0.940158, -0.115381,0.0084,-0.694143, -0.224349,0.0084,-0.667871,
+ -0.224349,0.0084,-0.667871, -0.303862,0.018225,-0.904575, -0.156274,0.018225,-0.940158,
+ 0,0.018225,-0.952425, 0,0.0084,-0.7032, -0.115381,0.0084,-0.694143,
+ -0.115381,0.0084,-0.694143, -0.156274,0.018225,-0.940158, 0,0.018225,-0.952425,
+ -1.12887,0.0312,-0.187642, -0.940158,0.018225,-0.156274, -0.952425,0.018225,0,
+ -0.952425,0.018225,0, -1.1436,0.0312,0, -1.12887,0.0312,-0.187642,
+ -1.086146,0.0312,-0.364854, -0.904575,0.018225,-0.303862, -0.940158,0.018225,-0.156274,
+ -0.940158,0.018225,-0.156274, -1.12887,0.0312,-0.187642, -1.086146,0.0312,-0.364854,
+ -1.017621,0.0312,-0.529441, -0.847506,0.018225,-0.440935, -0.904575,0.018225,-0.303862,
+ -0.904575,0.018225,-0.303862, -1.086146,0.0312,-0.364854, -1.017621,0.0312,-0.529441,
+ -0.925493,0.0312,-0.679207, -0.770779,0.018225,-0.565664, -0.847506,0.018225,-0.440935,
+ -0.847506,0.018225,-0.440935, -1.017621,0.0312,-0.529441, -0.925493,0.0312,-0.679207,
+ -0.811956,0.0312,-0.811956, -0.676222,0.018225,-0.676222, -0.770779,0.018225,-0.565664,
+ -0.770779,0.018225,-0.565664, -0.925493,0.0312,-0.679207, -0.811956,0.0312,-0.811956,
+ -0.679207,0.0312,-0.925493, -0.565664,0.018225,-0.770779, -0.676222,0.018225,-0.676222,
+ -0.676222,0.018225,-0.676222, -0.811956,0.0312,-0.811956, -0.679207,0.0312,-0.925493,
+ -0.529441,0.0312,-1.017621, -0.440935,0.018225,-0.847506, -0.565664,0.018225,-0.770779,
+ -0.565664,0.018225,-0.770779, -0.679207,0.0312,-0.925493, -0.529441,0.0312,-1.017621,
+ -0.364854,0.0312,-1.086146, -0.303862,0.018225,-0.904575, -0.440935,0.018225,-0.847506,
+ -0.440935,0.018225,-0.847506, -0.529441,0.0312,-1.017621, -0.364854,0.0312,-1.086146,
+ -0.187642,0.0312,-1.12887, -0.156274,0.018225,-0.940158, -0.303862,0.018225,-0.904575,
+ -0.303862,0.018225,-0.904575, -0.364854,0.0312,-1.086146, -0.187642,0.0312,-1.12887,
+ 0,0.0312,-1.1436, 0,0.018225,-0.952425, -0.156274,0.018225,-0.940158,
+ -0.156274,0.018225,-0.940158, -0.187642,0.0312,-1.12887, 0,0.0312,-1.1436,
+ -1.267832,0.046875,-0.21074, -1.12887,0.0312,-0.187642, -1.1436,0.0312,0,
+ -1.1436,0.0312,0, -1.284375,0.046875,0, -1.267832,0.046875,-0.21074,
+ -1.219848,0.046875,-0.409767, -1.086146,0.0312,-0.364854, -1.12887,0.0312,-0.187642,
+ -1.12887,0.0312,-0.187642, -1.267832,0.046875,-0.21074, -1.219848,0.046875,-0.409767,
+ -1.142888,0.046875,-0.594614, -1.017621,0.0312,-0.529441, -1.086146,0.0312,-0.364854,
+ -1.086146,0.0312,-0.364854, -1.219848,0.046875,-0.409767, -1.142888,0.046875,-0.594614,
+ -1.039419,0.046875,-0.762816, -0.925493,0.0312,-0.679207, -1.017621,0.0312,-0.529441,
+ -1.017621,0.0312,-0.529441, -1.142888,0.046875,-0.594614, -1.039419,0.046875,-0.762816,
+ -0.911906,0.046875,-0.911906, -0.811956,0.0312,-0.811956, -0.925493,0.0312,-0.679207,
+ -0.925493,0.0312,-0.679207, -1.039419,0.046875,-0.762816, -0.911906,0.046875,-0.911906,
+ -0.762816,0.046875,-1.039419, -0.679207,0.0312,-0.925493, -0.811956,0.0312,-0.811956,
+ -0.811956,0.0312,-0.811956, -0.911906,0.046875,-0.911906, -0.762816,0.046875,-1.039419,
+ -0.594614,0.046875,-1.142888, -0.529441,0.0312,-1.017621, -0.679207,0.0312,-0.925493,
+ -0.679207,0.0312,-0.925493, -0.762816,0.046875,-1.039419, -0.594614,0.046875,-1.142888,
+ -0.409767,0.046875,-1.219848, -0.364854,0.0312,-1.086146, -0.529441,0.0312,-1.017621,
+ -0.529441,0.0312,-1.017621, -0.594614,0.046875,-1.142888, -0.409767,0.046875,-1.219848,
+ -0.21074,0.046875,-1.267832, -0.187642,0.0312,-1.12887, -0.364854,0.0312,-1.086146,
+ -0.364854,0.0312,-1.086146, -0.409767,0.046875,-1.219848, -0.21074,0.046875,-1.267832,
+ 0,0.046875,-1.284375, 0,0.0312,-1.1436, -0.187642,0.0312,-1.12887,
+ -0.187642,0.0312,-1.12887, -0.21074,0.046875,-1.267832, 0,0.046875,-1.284375,
+ -1.364595,0.0648,-0.226824, -1.267832,0.046875,-0.21074, -1.284375,0.046875,0,
+ -1.284375,0.046875,0, -1.3824,0.0648,0, -1.364595,0.0648,-0.226824,
+ -1.312948,0.0648,-0.441041, -1.219848,0.046875,-0.409767, -1.267832,0.046875,-0.21074,
+ -1.267832,0.046875,-0.21074, -1.364595,0.0648,-0.226824, -1.312948,0.0648,-0.441041,
+ -1.230115,0.0648,-0.639996, -1.142888,0.046875,-0.594614, -1.219848,0.046875,-0.409767,
+ -1.219848,0.046875,-0.409767, -1.312948,0.0648,-0.441041, -1.230115,0.0648,-0.639996,
+ -1.118749,0.0648,-0.821035, -1.039419,0.046875,-0.762816, -1.142888,0.046875,-0.594614,
+ -1.142888,0.046875,-0.594614, -1.230115,0.0648,-0.639996, -1.118749,0.0648,-0.821035,
+ -0.981504,0.0648,-0.981504, -0.911906,0.046875,-0.911906, -1.039419,0.046875,-0.762816,
+ -1.039419,0.046875,-0.762816, -1.118749,0.0648,-0.821035, -0.981504,0.0648,-0.981504,
+ -0.821035,0.0648,-1.118749, -0.762816,0.046875,-1.039419, -0.911906,0.046875,-0.911906,
+ -0.911906,0.046875,-0.911906, -0.981504,0.0648,-0.981504, -0.821035,0.0648,-1.118749,
+ -0.639996,0.0648,-1.230115, -0.594614,0.046875,-1.142888, -0.762816,0.046875,-1.039419,
+ -0.762816,0.046875,-1.039419, -0.821035,0.0648,-1.118749, -0.639996,0.0648,-1.230115,
+ -0.441041,0.0648,-1.312948, -0.409767,0.046875,-1.219848, -0.594614,0.046875,-1.142888,
+ -0.594614,0.046875,-1.142888, -0.639996,0.0648,-1.230115, -0.441041,0.0648,-1.312948,
+ -0.226824,0.0648,-1.364595, -0.21074,0.046875,-1.267832, -0.409767,0.046875,-1.219848,
+ -0.409767,0.046875,-1.219848, -0.441041,0.0648,-1.312948, -0.226824,0.0648,-1.364595,
+ 0,0.0648,-1.3824, 0,0.046875,-1.284375, -0.21074,0.046875,-1.267832,
+ -0.21074,0.046875,-1.267832, -0.226824,0.0648,-1.364595, 0,0.0648,-1.3824,
+ -1.426709,0.084525,-0.237149, -1.364595,0.0648,-0.226824, -1.3824,0.0648,0,
+ -1.3824,0.0648,0, -1.445325,0.084525,0, -1.426709,0.084525,-0.237149,
+ -1.372712,0.084525,-0.461116, -1.312948,0.0648,-0.441041, -1.364595,0.0648,-0.226824,
+ -1.364595,0.0648,-0.226824, -1.426709,0.084525,-0.237149, -1.372712,0.084525,-0.461116,
+ -1.286108,0.084525,-0.669128, -1.230115,0.0648,-0.639996, -1.312948,0.0648,-0.441041,
+ -1.312948,0.0648,-0.441041, -1.372712,0.084525,-0.461116, -1.286108,0.084525,-0.669128,
+ -1.169673,0.084525,-0.858407, -1.118749,0.0648,-0.821035, -1.230115,0.0648,-0.639996,
+ -1.230115,0.0648,-0.639996, -1.286108,0.084525,-0.669128, -1.169673,0.084525,-0.858407,
+ -1.026181,0.084525,-1.026181, -0.981504,0.0648,-0.981504, -1.118749,0.0648,-0.821035,
+ -1.118749,0.0648,-0.821035, -1.169673,0.084525,-0.858407, -1.026181,0.084525,-1.026181,
+ -0.858407,0.084525,-1.169673, -0.821035,0.0648,-1.118749, -0.981504,0.0648,-0.981504,
+ -0.981504,0.0648,-0.981504, -1.026181,0.084525,-1.026181, -0.858407,0.084525,-1.169673,
+ -0.669128,0.084525,-1.286108, -0.639996,0.0648,-1.230115, -0.821035,0.0648,-1.118749,
+ -0.821035,0.0648,-1.118749, -0.858407,0.084525,-1.169673, -0.669128,0.084525,-1.286108,
+ -0.461116,0.084525,-1.372712, -0.441041,0.0648,-1.312948, -0.639996,0.0648,-1.230115,
+ -0.639996,0.0648,-1.230115, -0.669128,0.084525,-1.286108, -0.461116,0.084525,-1.372712,
+ -0.237149,0.084525,-1.426709, -0.226824,0.0648,-1.364595, -0.441041,0.0648,-1.312948,
+ -0.441041,0.0648,-1.312948, -0.461116,0.084525,-1.372712, -0.237149,0.084525,-1.426709,
+ 0,0.084525,-1.445325, 0,0.0648,-1.3824, -0.226824,0.0648,-1.364595,
+ -0.226824,0.0648,-1.364595, -0.237149,0.084525,-1.426709, 0,0.084525,-1.445325,
+ -1.461727,0.1056,-0.24297, -1.426709,0.084525,-0.237149, -1.445325,0.084525,0,
+ -1.445325,0.084525,0, -1.4808,0.1056,0, -1.461727,0.1056,-0.24297,
+ -1.406405,0.1056,-0.472434, -1.372712,0.084525,-0.461116, -1.426709,0.084525,-0.237149,
+ -1.426709,0.084525,-0.237149, -1.461727,0.1056,-0.24297, -1.406405,0.1056,-0.472434,
+ -1.317675,0.1056,-0.685551, -1.286108,0.084525,-0.669128, -1.372712,0.084525,-0.461116,
+ -1.372712,0.084525,-0.461116, -1.406405,0.1056,-0.472434, -1.317675,0.1056,-0.685551,
+ -1.198382,0.1056,-0.879477, -1.169673,0.084525,-0.858407, -1.286108,0.084525,-0.669128,
+ -1.286108,0.084525,-0.669128, -1.317675,0.1056,-0.685551, -1.198382,0.1056,-0.879477,
+ -1.051368,0.1056,-1.051368, -1.026181,0.084525,-1.026181, -1.169673,0.084525,-0.858407,
+ -1.169673,0.084525,-0.858407, -1.198382,0.1056,-0.879477, -1.051368,0.1056,-1.051368,
+ -0.879477,0.1056,-1.198382, -0.858407,0.084525,-1.169673, -1.026181,0.084525,-1.026181,
+ -1.026181,0.084525,-1.026181, -1.051368,0.1056,-1.051368, -0.879477,0.1056,-1.198382,
+ -0.685551,0.1056,-1.317675, -0.669128,0.084525,-1.286108, -0.858407,0.084525,-1.169673,
+ -0.858407,0.084525,-1.169673, -0.879477,0.1056,-1.198382, -0.685551,0.1056,-1.317675,
+ -0.472434,0.1056,-1.406405, -0.461116,0.084525,-1.372712, -0.669128,0.084525,-1.286108,
+ -0.669128,0.084525,-1.286108, -0.685551,0.1056,-1.317675, -0.472434,0.1056,-1.406405,
+ -0.24297,0.1056,-1.461727, -0.237149,0.084525,-1.426709, -0.461116,0.084525,-1.372712,
+ -0.461116,0.084525,-1.372712, -0.472434,0.1056,-1.406405, -0.24297,0.1056,-1.461727,
+ 0,0.1056,-1.4808, 0,0.084525,-1.445325, -0.237149,0.084525,-1.426709,
+ -0.237149,0.084525,-1.426709, -0.24297,0.1056,-1.461727, 0,0.1056,-1.4808,
+ -1.4772,0.127575,-0.245542, -1.461727,0.1056,-0.24297, -1.4808,0.1056,0,
+ -1.4808,0.1056,0, -1.496475,0.127575,0, -1.4772,0.127575,-0.245542,
+ -1.421292,0.127575,-0.477435, -1.406405,0.1056,-0.472434, -1.461727,0.1056,-0.24297,
+ -1.461727,0.1056,-0.24297, -1.4772,0.127575,-0.245542, -1.421292,0.127575,-0.477435,
+ -1.331623,0.127575,-0.692808, -1.317675,0.1056,-0.685551, -1.406405,0.1056,-0.472434,
+ -1.406405,0.1056,-0.472434, -1.421292,0.127575,-0.477435, -1.331623,0.127575,-0.692808,
+ -1.211067,0.127575,-0.888786, -1.198382,0.1056,-0.879477, -1.317675,0.1056,-0.685551,
+ -1.317675,0.1056,-0.685551, -1.331623,0.127575,-0.692808, -1.211067,0.127575,-0.888786,
+ -1.062497,0.127575,-1.062497, -1.051368,0.1056,-1.051368, -1.198382,0.1056,-0.879477,
+ -1.198382,0.1056,-0.879477, -1.211067,0.127575,-0.888786, -1.062497,0.127575,-1.062497,
+ -0.888786,0.127575,-1.211067, -0.879477,0.1056,-1.198382, -1.051368,0.1056,-1.051368,
+ -1.051368,0.1056,-1.051368, -1.062497,0.127575,-1.062497, -0.888786,0.127575,-1.211067,
+ -0.692808,0.127575,-1.331623, -0.685551,0.1056,-1.317675, -0.879477,0.1056,-1.198382,
+ -0.879477,0.1056,-1.198382, -0.888786,0.127575,-1.211067, -0.692808,0.127575,-1.331623,
+ -0.477435,0.127575,-1.421292, -0.472434,0.1056,-1.406405, -0.685551,0.1056,-1.317675,
+ -0.685551,0.1056,-1.317675, -0.692808,0.127575,-1.331623, -0.477435,0.127575,-1.421292,
+ -0.245542,0.127575,-1.4772, -0.24297,0.1056,-1.461727, -0.472434,0.1056,-1.406405,
+ -0.472434,0.1056,-1.406405, -0.477435,0.127575,-1.421292, -0.245542,0.127575,-1.4772,
+ 0,0.127575,-1.496475, 0,0.1056,-1.4808, -0.24297,0.1056,-1.461727,
+ -0.24297,0.1056,-1.461727, -0.245542,0.127575,-1.4772, 0,0.127575,-1.496475,
+ -1.48068,0.15,-0.24612, -1.4772,0.127575,-0.245542, -1.496475,0.127575,0,
+ -1.496475,0.127575,0, -1.5,0.15,0, -1.48068,0.15,-0.24612,
+ -1.42464,0.15,-0.47856, -1.421292,0.127575,-0.477435, -1.4772,0.127575,-0.245542,
+ -1.4772,0.127575,-0.245542, -1.48068,0.15,-0.24612, -1.42464,0.15,-0.47856,
+ -1.33476,0.15,-0.69444, -1.331623,0.127575,-0.692808, -1.421292,0.127575,-0.477435,
+ -1.421292,0.127575,-0.477435, -1.42464,0.15,-0.47856, -1.33476,0.15,-0.69444,
+ -1.21392,0.15,-0.89088, -1.211067,0.127575,-0.888786, -1.331623,0.127575,-0.692808,
+ -1.331623,0.127575,-0.692808, -1.33476,0.15,-0.69444, -1.21392,0.15,-0.89088,
+ -1.065,0.15,-1.065, -1.062497,0.127575,-1.062497, -1.211067,0.127575,-0.888786,
+ -1.211067,0.127575,-0.888786, -1.21392,0.15,-0.89088, -1.065,0.15,-1.065,
+ -0.89088,0.15,-1.21392, -0.888786,0.127575,-1.211067, -1.062497,0.127575,-1.062497,
+ -1.062497,0.127575,-1.062497, -1.065,0.15,-1.065, -0.89088,0.15,-1.21392,
+ -0.69444,0.15,-1.33476, -0.692808,0.127575,-1.331623, -0.888786,0.127575,-1.211067,
+ -0.888786,0.127575,-1.211067, -0.89088,0.15,-1.21392, -0.69444,0.15,-1.33476,
+ -0.47856,0.15,-1.42464, -0.477435,0.127575,-1.421292, -0.692808,0.127575,-1.331623,
+ -0.692808,0.127575,-1.331623, -0.69444,0.15,-1.33476, -0.47856,0.15,-1.42464,
+ -0.24612,0.15,-1.48068, -0.245542,0.127575,-1.4772, -0.477435,0.127575,-1.421292,
+ -0.477435,0.127575,-1.421292, -0.47856,0.15,-1.42464, -0.24612,0.15,-1.48068,
+ 0,0.15,-1.5, 0,0.127575,-1.496475, -0.245542,0.127575,-1.4772,
+ -0.245542,0.127575,-1.4772, -0.24612,0.15,-1.48068, 0,0.15,-1.5,
+ 0,0,0, 0,0.002175,-0.388275, 0.063708,0.002175,-0.383274,
+ 0,0,0, 0.063708,0.002175,-0.383274, 0.123875,0.002175,-0.368768,
+ 0,0,0, 0.123875,0.002175,-0.368768, 0.179756,0.002175,-0.345503,
+ 0,0,0, 0.179756,0.002175,-0.345503, 0.230604,0.002175,-0.314223,
+ 0,0,0, 0.230604,0.002175,-0.314223, 0.275675,0.002175,-0.275675,
+ 0,0,0, 0.275675,0.002175,-0.275675, 0.314223,0.002175,-0.230604,
+ 0,0,0, 0.314223,0.002175,-0.230604, 0.345503,0.002175,-0.179756,
+ 0,0,0, 0.345503,0.002175,-0.179756, 0.368768,0.002175,-0.123875,
+ 0,0,0, 0.368768,0.002175,-0.123875, 0.383274,0.002175,-0.063708,
+ 0,0,0, 0.383274,0.002175,-0.063708, 0.388275,0.002175,0,
+ 0.115381,0.0084,-0.694143, 0.063708,0.002175,-0.383274, 0,0.002175,-0.388275,
+ 0,0.002175,-0.388275, 0,0.0084,-0.7032, 0.115381,0.0084,-0.694143,
+ 0.224349,0.0084,-0.667871, 0.123875,0.002175,-0.368768, 0.063708,0.002175,-0.383274,
+ 0.063708,0.002175,-0.383274, 0.115381,0.0084,-0.694143, 0.224349,0.0084,-0.667871,
+ 0.325553,0.0084,-0.625735, 0.179756,0.002175,-0.345503, 0.123875,0.002175,-0.368768,
+ 0.123875,0.002175,-0.368768, 0.224349,0.0084,-0.667871, 0.325553,0.0084,-0.625735,
+ 0.417645,0.0084,-0.569086, 0.230604,0.002175,-0.314223, 0.179756,0.002175,-0.345503,
+ 0.179756,0.002175,-0.345503, 0.325553,0.0084,-0.625735, 0.417645,0.0084,-0.569086,
+ 0.499272,0.0084,-0.499272, 0.275675,0.002175,-0.275675, 0.230604,0.002175,-0.314223,
+ 0.230604,0.002175,-0.314223, 0.417645,0.0084,-0.569086, 0.499272,0.0084,-0.499272,
+ 0.569086,0.0084,-0.417645, 0.314223,0.002175,-0.230604, 0.275675,0.002175,-0.275675,
+ 0.275675,0.002175,-0.275675, 0.499272,0.0084,-0.499272, 0.569086,0.0084,-0.417645,
+ 0.625735,0.0084,-0.325553, 0.345503,0.002175,-0.179756, 0.314223,0.002175,-0.230604,
+ 0.314223,0.002175,-0.230604, 0.569086,0.0084,-0.417645, 0.625735,0.0084,-0.325553,
+ 0.667871,0.0084,-0.224349, 0.368768,0.002175,-0.123875, 0.345503,0.002175,-0.179756,
+ 0.345503,0.002175,-0.179756, 0.625735,0.0084,-0.325553, 0.667871,0.0084,-0.224349,
+ 0.694143,0.0084,-0.115381, 0.383274,0.002175,-0.063708, 0.368768,0.002175,-0.123875,
+ 0.368768,0.002175,-0.123875, 0.667871,0.0084,-0.224349, 0.694143,0.0084,-0.115381,
+ 0.7032,0.0084,0, 0.388275,0.002175,0, 0.383274,0.002175,-0.063708,
+ 0.383274,0.002175,-0.063708, 0.694143,0.0084,-0.115381, 0.7032,0.0084,0,
+ 0.156274,0.018225,-0.940158, 0.115381,0.0084,-0.694143, 0,0.0084,-0.7032,
+ 0,0.0084,-0.7032, 0,0.018225,-0.952425, 0.156274,0.018225,-0.940158,
+ 0.303862,0.018225,-0.904575, 0.224349,0.0084,-0.667871, 0.115381,0.0084,-0.694143,
+ 0.115381,0.0084,-0.694143, 0.156274,0.018225,-0.940158, 0.303862,0.018225,-0.904575,
+ 0.440935,0.018225,-0.847506, 0.325553,0.0084,-0.625735, 0.224349,0.0084,-0.667871,
+ 0.224349,0.0084,-0.667871, 0.303862,0.018225,-0.904575, 0.440935,0.018225,-0.847506,
+ 0.565664,0.018225,-0.770779, 0.417645,0.0084,-0.569086, 0.325553,0.0084,-0.625735,
+ 0.325553,0.0084,-0.625735, 0.440935,0.018225,-0.847506, 0.565664,0.018225,-0.770779,
+ 0.676222,0.018225,-0.676222, 0.499272,0.0084,-0.499272, 0.417645,0.0084,-0.569086,
+ 0.417645,0.0084,-0.569086, 0.565664,0.018225,-0.770779, 0.676222,0.018225,-0.676222,
+ 0.770779,0.018225,-0.565664, 0.569086,0.0084,-0.417645, 0.499272,0.0084,-0.499272,
+ 0.499272,0.0084,-0.499272, 0.676222,0.018225,-0.676222, 0.770779,0.018225,-0.565664,
+ 0.847506,0.018225,-0.440935, 0.625735,0.0084,-0.325553, 0.569086,0.0084,-0.417645,
+ 0.569086,0.0084,-0.417645, 0.770779,0.018225,-0.565664, 0.847506,0.018225,-0.440935,
+ 0.904575,0.018225,-0.303862, 0.667871,0.0084,-0.224349, 0.625735,0.0084,-0.325553,
+ 0.625735,0.0084,-0.325553, 0.847506,0.018225,-0.440935, 0.904575,0.018225,-0.303862,
+ 0.940158,0.018225,-0.156274, 0.694143,0.0084,-0.115381, 0.667871,0.0084,-0.224349,
+ 0.667871,0.0084,-0.224349, 0.904575,0.018225,-0.303862, 0.940158,0.018225,-0.156274,
+ 0.952425,0.018225,0, 0.7032,0.0084,0, 0.694143,0.0084,-0.115381,
+ 0.694143,0.0084,-0.115381, 0.940158,0.018225,-0.156274, 0.952425,0.018225,0,
+ 0.187642,0.0312,-1.12887, 0.156274,0.018225,-0.940158, 0,0.018225,-0.952425,
+ 0,0.018225,-0.952425, 0,0.0312,-1.1436, 0.187642,0.0312,-1.12887,
+ 0.364854,0.0312,-1.086146, 0.303862,0.018225,-0.904575, 0.156274,0.018225,-0.940158,
+ 0.156274,0.018225,-0.940158, 0.187642,0.0312,-1.12887, 0.364854,0.0312,-1.086146,
+ 0.529441,0.0312,-1.017621, 0.440935,0.018225,-0.847506, 0.303862,0.018225,-0.904575,
+ 0.303862,0.018225,-0.904575, 0.364854,0.0312,-1.086146, 0.529441,0.0312,-1.017621,
+ 0.679207,0.0312,-0.925493, 0.565664,0.018225,-0.770779, 0.440935,0.018225,-0.847506,
+ 0.440935,0.018225,-0.847506, 0.529441,0.0312,-1.017621, 0.679207,0.0312,-0.925493,
+ 0.811956,0.0312,-0.811956, 0.676222,0.018225,-0.676222, 0.565664,0.018225,-0.770779,
+ 0.565664,0.018225,-0.770779, 0.679207,0.0312,-0.925493, 0.811956,0.0312,-0.811956,
+ 0.925493,0.0312,-0.679207, 0.770779,0.018225,-0.565664, 0.676222,0.018225,-0.676222,
+ 0.676222,0.018225,-0.676222, 0.811956,0.0312,-0.811956, 0.925493,0.0312,-0.679207,
+ 1.017621,0.0312,-0.529441, 0.847506,0.018225,-0.440935, 0.770779,0.018225,-0.565664,
+ 0.770779,0.018225,-0.565664, 0.925493,0.0312,-0.679207, 1.017621,0.0312,-0.529441,
+ 1.086146,0.0312,-0.364854, 0.904575,0.018225,-0.303862, 0.847506,0.018225,-0.440935,
+ 0.847506,0.018225,-0.440935, 1.017621,0.0312,-0.529441, 1.086146,0.0312,-0.364854,
+ 1.12887,0.0312,-0.187642, 0.940158,0.018225,-0.156274, 0.904575,0.018225,-0.303862,
+ 0.904575,0.018225,-0.303862, 1.086146,0.0312,-0.364854, 1.12887,0.0312,-0.187642,
+ 1.1436,0.0312,0, 0.952425,0.018225,0, 0.940158,0.018225,-0.156274,
+ 0.940158,0.018225,-0.156274, 1.12887,0.0312,-0.187642, 1.1436,0.0312,0,
+ 0.21074,0.046875,-1.267832, 0.187642,0.0312,-1.12887, 0,0.0312,-1.1436,
+ 0,0.0312,-1.1436, 0,0.046875,-1.284375, 0.21074,0.046875,-1.267832,
+ 0.409767,0.046875,-1.219848, 0.364854,0.0312,-1.086146, 0.187642,0.0312,-1.12887,
+ 0.187642,0.0312,-1.12887, 0.21074,0.046875,-1.267832, 0.409767,0.046875,-1.219848,
+ 0.594614,0.046875,-1.142888, 0.529441,0.0312,-1.017621, 0.364854,0.0312,-1.086146,
+ 0.364854,0.0312,-1.086146, 0.409767,0.046875,-1.219848, 0.594614,0.046875,-1.142888,
+ 0.762816,0.046875,-1.039419, 0.679207,0.0312,-0.925493, 0.529441,0.0312,-1.017621,
+ 0.529441,0.0312,-1.017621, 0.594614,0.046875,-1.142888, 0.762816,0.046875,-1.039419,
+ 0.911906,0.046875,-0.911906, 0.811956,0.0312,-0.811956, 0.679207,0.0312,-0.925493,
+ 0.679207,0.0312,-0.925493, 0.762816,0.046875,-1.039419, 0.911906,0.046875,-0.911906,
+ 1.039419,0.046875,-0.762816, 0.925493,0.0312,-0.679207, 0.811956,0.0312,-0.811956,
+ 0.811956,0.0312,-0.811956, 0.911906,0.046875,-0.911906, 1.039419,0.046875,-0.762816,
+ 1.142888,0.046875,-0.594614, 1.017621,0.0312,-0.529441, 0.925493,0.0312,-0.679207,
+ 0.925493,0.0312,-0.679207, 1.039419,0.046875,-0.762816, 1.142888,0.046875,-0.594614,
+ 1.219848,0.046875,-0.409767, 1.086146,0.0312,-0.364854, 1.017621,0.0312,-0.529441,
+ 1.017621,0.0312,-0.529441, 1.142888,0.046875,-0.594614, 1.219848,0.046875,-0.409767,
+ 1.267832,0.046875,-0.21074, 1.12887,0.0312,-0.187642, 1.086146,0.0312,-0.364854,
+ 1.086146,0.0312,-0.364854, 1.219848,0.046875,-0.409767, 1.267832,0.046875,-0.21074,
+ 1.284375,0.046875,0, 1.1436,0.0312,0, 1.12887,0.0312,-0.187642,
+ 1.12887,0.0312,-0.187642, 1.267832,0.046875,-0.21074, 1.284375,0.046875,0,
+ 0.226824,0.0648,-1.364595, 0.21074,0.046875,-1.267832, 0,0.046875,-1.284375,
+ 0,0.046875,-1.284375, 0,0.0648,-1.3824, 0.226824,0.0648,-1.364595,
+ 0.441041,0.0648,-1.312948, 0.409767,0.046875,-1.219848, 0.21074,0.046875,-1.267832,
+ 0.21074,0.046875,-1.267832, 0.226824,0.0648,-1.364595, 0.441041,0.0648,-1.312948,
+ 0.639996,0.0648,-1.230115, 0.594614,0.046875,-1.142888, 0.409767,0.046875,-1.219848,
+ 0.409767,0.046875,-1.219848, 0.441041,0.0648,-1.312948, 0.639996,0.0648,-1.230115,
+ 0.821035,0.0648,-1.118749, 0.762816,0.046875,-1.039419, 0.594614,0.046875,-1.142888,
+ 0.594614,0.046875,-1.142888, 0.639996,0.0648,-1.230115, 0.821035,0.0648,-1.118749,
+ 0.981504,0.0648,-0.981504, 0.911906,0.046875,-0.911906, 0.762816,0.046875,-1.039419,
+ 0.762816,0.046875,-1.039419, 0.821035,0.0648,-1.118749, 0.981504,0.0648,-0.981504,
+ 1.118749,0.0648,-0.821035, 1.039419,0.046875,-0.762816, 0.911906,0.046875,-0.911906,
+ 0.911906,0.046875,-0.911906, 0.981504,0.0648,-0.981504, 1.118749,0.0648,-0.821035,
+ 1.230115,0.0648,-0.639996, 1.142888,0.046875,-0.594614, 1.039419,0.046875,-0.762816,
+ 1.039419,0.046875,-0.762816, 1.118749,0.0648,-0.821035, 1.230115,0.0648,-0.639996,
+ 1.312948,0.0648,-0.441041, 1.219848,0.046875,-0.409767, 1.142888,0.046875,-0.594614,
+ 1.142888,0.046875,-0.594614, 1.230115,0.0648,-0.639996, 1.312948,0.0648,-0.441041,
+ 1.364595,0.0648,-0.226824, 1.267832,0.046875,-0.21074, 1.219848,0.046875,-0.409767,
+ 1.219848,0.046875,-0.409767, 1.312948,0.0648,-0.441041, 1.364595,0.0648,-0.226824,
+ 1.3824,0.0648,0, 1.284375,0.046875,0, 1.267832,0.046875,-0.21074,
+ 1.267832,0.046875,-0.21074, 1.364595,0.0648,-0.226824, 1.3824,0.0648,0,
+ 0.237149,0.084525,-1.426709, 0.226824,0.0648,-1.364595, 0,0.0648,-1.3824,
+ 0,0.0648,-1.3824, 0,0.084525,-1.445325, 0.237149,0.084525,-1.426709,
+ 0.461116,0.084525,-1.372712, 0.441041,0.0648,-1.312948, 0.226824,0.0648,-1.364595,
+ 0.226824,0.0648,-1.364595, 0.237149,0.084525,-1.426709, 0.461116,0.084525,-1.372712,
+ 0.669128,0.084525,-1.286108, 0.639996,0.0648,-1.230115, 0.441041,0.0648,-1.312948,
+ 0.441041,0.0648,-1.312948, 0.461116,0.084525,-1.372712, 0.669128,0.084525,-1.286108,
+ 0.858407,0.084525,-1.169673, 0.821035,0.0648,-1.118749, 0.639996,0.0648,-1.230115,
+ 0.639996,0.0648,-1.230115, 0.669128,0.084525,-1.286108, 0.858407,0.084525,-1.169673,
+ 1.026181,0.084525,-1.026181, 0.981504,0.0648,-0.981504, 0.821035,0.0648,-1.118749,
+ 0.821035,0.0648,-1.118749, 0.858407,0.084525,-1.169673, 1.026181,0.084525,-1.026181,
+ 1.169673,0.084525,-0.858407, 1.118749,0.0648,-0.821035, 0.981504,0.0648,-0.981504,
+ 0.981504,0.0648,-0.981504, 1.026181,0.084525,-1.026181, 1.169673,0.084525,-0.858407,
+ 1.286108,0.084525,-0.669128, 1.230115,0.0648,-0.639996, 1.118749,0.0648,-0.821035,
+ 1.118749,0.0648,-0.821035, 1.169673,0.084525,-0.858407, 1.286108,0.084525,-0.669128,
+ 1.372712,0.084525,-0.461116, 1.312948,0.0648,-0.441041, 1.230115,0.0648,-0.639996,
+ 1.230115,0.0648,-0.639996, 1.286108,0.084525,-0.669128, 1.372712,0.084525,-0.461116,
+ 1.426709,0.084525,-0.237149, 1.364595,0.0648,-0.226824, 1.312948,0.0648,-0.441041,
+ 1.312948,0.0648,-0.441041, 1.372712,0.084525,-0.461116, 1.426709,0.084525,-0.237149,
+ 1.445325,0.084525,0, 1.3824,0.0648,0, 1.364595,0.0648,-0.226824,
+ 1.364595,0.0648,-0.226824, 1.426709,0.084525,-0.237149, 1.445325,0.084525,0,
+ 0.24297,0.1056,-1.461727, 0.237149,0.084525,-1.426709, 0,0.084525,-1.445325,
+ 0,0.084525,-1.445325, 0,0.1056,-1.4808, 0.24297,0.1056,-1.461727,
+ 0.472434,0.1056,-1.406405, 0.461116,0.084525,-1.372712, 0.237149,0.084525,-1.426709,
+ 0.237149,0.084525,-1.426709, 0.24297,0.1056,-1.461727, 0.472434,0.1056,-1.406405,
+ 0.685551,0.1056,-1.317675, 0.669128,0.084525,-1.286108, 0.461116,0.084525,-1.372712,
+ 0.461116,0.084525,-1.372712, 0.472434,0.1056,-1.406405, 0.685551,0.1056,-1.317675,
+ 0.879477,0.1056,-1.198382, 0.858407,0.084525,-1.169673, 0.669128,0.084525,-1.286108,
+ 0.669128,0.084525,-1.286108, 0.685551,0.1056,-1.317675, 0.879477,0.1056,-1.198382,
+ 1.051368,0.1056,-1.051368, 1.026181,0.084525,-1.026181, 0.858407,0.084525,-1.169673,
+ 0.858407,0.084525,-1.169673, 0.879477,0.1056,-1.198382, 1.051368,0.1056,-1.051368,
+ 1.198382,0.1056,-0.879477, 1.169673,0.084525,-0.858407, 1.026181,0.084525,-1.026181,
+ 1.026181,0.084525,-1.026181, 1.051368,0.1056,-1.051368, 1.198382,0.1056,-0.879477,
+ 1.317675,0.1056,-0.685551, 1.286108,0.084525,-0.669128, 1.169673,0.084525,-0.858407,
+ 1.169673,0.084525,-0.858407, 1.198382,0.1056,-0.879477, 1.317675,0.1056,-0.685551,
+ 1.406405,0.1056,-0.472434, 1.372712,0.084525,-0.461116, 1.286108,0.084525,-0.669128,
+ 1.286108,0.084525,-0.669128, 1.317675,0.1056,-0.685551, 1.406405,0.1056,-0.472434,
+ 1.461727,0.1056,-0.24297, 1.426709,0.084525,-0.237149, 1.372712,0.084525,-0.461116,
+ 1.372712,0.084525,-0.461116, 1.406405,0.1056,-0.472434, 1.461727,0.1056,-0.24297,
+ 1.4808,0.1056,0, 1.445325,0.084525,0, 1.426709,0.084525,-0.237149,
+ 1.426709,0.084525,-0.237149, 1.461727,0.1056,-0.24297, 1.4808,0.1056,0,
+ 0.245542,0.127575,-1.4772, 0.24297,0.1056,-1.461727, 0,0.1056,-1.4808,
+ 0,0.1056,-1.4808, 0,0.127575,-1.496475, 0.245542,0.127575,-1.4772,
+ 0.477435,0.127575,-1.421292, 0.472434,0.1056,-1.406405, 0.24297,0.1056,-1.461727,
+ 0.24297,0.1056,-1.461727, 0.245542,0.127575,-1.4772, 0.477435,0.127575,-1.421292,
+ 0.692808,0.127575,-1.331623, 0.685551,0.1056,-1.317675, 0.472434,0.1056,-1.406405,
+ 0.472434,0.1056,-1.406405, 0.477435,0.127575,-1.421292, 0.692808,0.127575,-1.331623,
+ 0.888786,0.127575,-1.211067, 0.879477,0.1056,-1.198382, 0.685551,0.1056,-1.317675,
+ 0.685551,0.1056,-1.317675, 0.692808,0.127575,-1.331623, 0.888786,0.127575,-1.211067,
+ 1.062497,0.127575,-1.062497, 1.051368,0.1056,-1.051368, 0.879477,0.1056,-1.198382,
+ 0.879477,0.1056,-1.198382, 0.888786,0.127575,-1.211067, 1.062497,0.127575,-1.062497,
+ 1.211067,0.127575,-0.888786, 1.198382,0.1056,-0.879477, 1.051368,0.1056,-1.051368,
+ 1.051368,0.1056,-1.051368, 1.062497,0.127575,-1.062497, 1.211067,0.127575,-0.888786,
+ 1.331623,0.127575,-0.692808, 1.317675,0.1056,-0.685551, 1.198382,0.1056,-0.879477,
+ 1.198382,0.1056,-0.879477, 1.211067,0.127575,-0.888786, 1.331623,0.127575,-0.692808,
+ 1.421292,0.127575,-0.477435, 1.406405,0.1056,-0.472434, 1.317675,0.1056,-0.685551,
+ 1.317675,0.1056,-0.685551, 1.331623,0.127575,-0.692808, 1.421292,0.127575,-0.477435,
+ 1.4772,0.127575,-0.245542, 1.461727,0.1056,-0.24297, 1.406405,0.1056,-0.472434,
+ 1.406405,0.1056,-0.472434, 1.421292,0.127575,-0.477435, 1.4772,0.127575,-0.245542,
+ 1.496475,0.127575,0, 1.4808,0.1056,0, 1.461727,0.1056,-0.24297,
+ 1.461727,0.1056,-0.24297, 1.4772,0.127575,-0.245542, 1.496475,0.127575,0,
+ 0.24612,0.15,-1.48068, 0.245542,0.127575,-1.4772, 0,0.127575,-1.496475,
+ 0,0.127575,-1.496475, 0,0.15,-1.5, 0.24612,0.15,-1.48068,
+ 0.47856,0.15,-1.42464, 0.477435,0.127575,-1.421292, 0.245542,0.127575,-1.4772,
+ 0.245542,0.127575,-1.4772, 0.24612,0.15,-1.48068, 0.47856,0.15,-1.42464,
+ 0.69444,0.15,-1.33476, 0.692808,0.127575,-1.331623, 0.477435,0.127575,-1.421292,
+ 0.477435,0.127575,-1.421292, 0.47856,0.15,-1.42464, 0.69444,0.15,-1.33476,
+ 0.89088,0.15,-1.21392, 0.888786,0.127575,-1.211067, 0.692808,0.127575,-1.331623,
+ 0.692808,0.127575,-1.331623, 0.69444,0.15,-1.33476, 0.89088,0.15,-1.21392,
+ 1.065,0.15,-1.065, 1.062497,0.127575,-1.062497, 0.888786,0.127575,-1.211067,
+ 0.888786,0.127575,-1.211067, 0.89088,0.15,-1.21392, 1.065,0.15,-1.065,
+ 1.21392,0.15,-0.89088, 1.211067,0.127575,-0.888786, 1.062497,0.127575,-1.062497,
+ 1.062497,0.127575,-1.062497, 1.065,0.15,-1.065, 1.21392,0.15,-0.89088,
+ 1.33476,0.15,-0.69444, 1.331623,0.127575,-0.692808, 1.211067,0.127575,-0.888786,
+ 1.211067,0.127575,-0.888786, 1.21392,0.15,-0.89088, 1.33476,0.15,-0.69444,
+ 1.42464,0.15,-0.47856, 1.421292,0.127575,-0.477435, 1.331623,0.127575,-0.692808,
+ 1.331623,0.127575,-0.692808, 1.33476,0.15,-0.69444, 1.42464,0.15,-0.47856,
+ 1.48068,0.15,-0.24612, 1.4772,0.127575,-0.245542, 1.421292,0.127575,-0.477435,
+ 1.421292,0.127575,-0.477435, 1.42464,0.15,-0.47856, 1.48068,0.15,-0.24612,
+ 1.5,0.15,0, 1.496475,0.127575,0, 1.4772,0.127575,-0.245542,
+ 1.4772,0.127575,-0.245542, 1.48068,0.15,-0.24612, 1.5,0.15,0
+};
diff --git a/hacks/glx/texfont.c b/hacks/glx/texfont.c
new file mode 100644
index 0000000..540db9f
--- /dev/null
+++ b/hacks/glx/texfont.c
@@ -0,0 +1,961 @@
+/* texfonts, Copyright (c) 2005-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Renders X11 fonts into textures for use with OpenGL.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#ifdef HAVE_COCOA
+# ifdef USE_IPHONE
+# include "jwzgles.h"
+# else
+# include <OpenGL/glu.h>
+# endif
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+# include "jwzgles.h"
+#else
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+#endif /* HAVE_XSHM_EXTENSION */
+
+#include "xft.h"
+#include "pow2.h"
+#include "resources.h"
+#include "texfont.h"
+#include "fps.h" /* for current_device_rotation() */
+
+#undef HAVE_XSHM_EXTENSION /* doesn't actually do any good here */
+
+
+/* These are in xlock-gl.c */
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+/* screenhack.h */
+extern char *progname;
+
+/* LRU cache of textures, to optimize the case where we're drawing the
+ same strings repeatedly.
+ */
+typedef struct texfont_cache texfont_cache;
+struct texfont_cache {
+ char *string;
+ GLuint texid;
+ XCharStruct extents;
+ int tex_width, tex_height;
+ texfont_cache *next;
+};
+
+struct texture_font_data {
+ Display *dpy;
+ XftFont *xftfont;
+ int cache_size;
+ texfont_cache *cache;
+};
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+/* Given a Pixmap (of screen depth), converts it to an OpenGL luminance mipmap.
+ RGB are averaged to grayscale, and the resulting value is treated as alpha.
+ Pass in the size of the pixmap; the size of the texture is returned
+ (it may be larger, since GL like powers of 2.)
+
+ We use a screen-depth pixmap instead of a 1bpp bitmap so that if the fonts
+ were drawn with antialiasing, that is preserved.
+ */
+static void
+bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int depth,
+ int *wP, int *hP)
+{
+ Bool mipmap_p = True;
+ int ow = *wP;
+ int oh = *hP;
+ GLsizei w2 = (GLsizei) to_pow2 (ow);
+ GLsizei h2 = (GLsizei) to_pow2 (oh);
+ int x, y, max, scale;
+ XImage *image = 0;
+ unsigned char *data = (unsigned char *) calloc (w2 * 2, (h2 + 1));
+ unsigned char *out = data;
+
+ /* OpenGLES doesn't support GL_INTENSITY, so instead of using a
+ texture with 1 byte per pixel, the intensity value, we have
+ to use 2 bytes per pixel: solid white, and an alpha value.
+ */
+# ifdef HAVE_JWZGLES
+# undef GL_INTENSITY
+# endif
+
+# ifdef HAVE_XSHM_EXTENSION
+ Bool use_shm = get_boolean_resource (dpy, "useSHM", "Boolean");
+ XShmSegmentInfo shm_info;
+# endif /* HAVE_XSHM_EXTENSION */
+
+ /* If either dimension is larger than the supported size, reduce.
+ We still return the old size to keep the caller's math working,
+ but the texture itself will have fewer pixels in it.
+ */
+ glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max);
+ scale = 1;
+ while (w2 > max || h2 > max)
+ {
+ w2 /= 2;
+ h2 /= 2;
+ scale *= 2;
+ }
+
+# ifdef HAVE_XSHM_EXTENSION
+ if (use_shm)
+ {
+ image = create_xshm_image (dpy, visual, depth, ZPixmap, 0, &shm_info,
+ ow, oh);
+ if (image)
+ XShmGetImage (dpy, p, image, 0, 0, ~0L);
+ else
+ use_shm = False;
+ }
+# endif /* HAVE_XSHM_EXTENSION */
+
+ if (!image) {
+ /* XCreateImage fills in (red|green_blue)_mask. XGetImage only does that
+ when reading from a Window, not when it's a Pixmap.
+ */
+ image = XCreateImage (dpy, visual, depth, ZPixmap, 0, NULL, ow, oh,
+ BitmapPad (dpy), 0);
+ image->data = malloc (image->height * image->bytes_per_line);
+ XGetSubImage (dpy, p, 0, 0, ow, oh, ~0L, ZPixmap, image, 0, 0);
+ }
+
+# ifdef HAVE_JWZGLES
+ /* This would work, but it's wasteful for no benefit. */
+ mipmap_p = False;
+# endif
+
+# ifdef DUMP_BITMAPS
+ fprintf (stderr, "\n");
+# endif
+ for (y = 0; y < h2; y++) {
+ for (x = 0; x < w2; x++) {
+ /* Might be better to average a scale x scale square of source pixels,
+ but at the resolutions we're dealing with, this is probably good
+ enough. */
+ int sx = x * scale;
+ int sy = y * scale;
+ unsigned long pixel = (sx >= ow || sy >= oh ? 0 :
+ XGetPixel (image, sx, sy));
+ /* instead of averaging all three channels, let's just use red,
+ and assume it was already grayscale. */
+ unsigned long r = pixel & image->red_mask;
+ /* This goofy trick is to make any of RGBA/ABGR/ARGB work. */
+ pixel = ((r >> 24) | (r >> 16) | (r >> 8) | r) & 0xFF;
+
+# ifdef DUMP_BITMAPS
+ if (sx < ow && sy < oh)
+# ifdef HAVE_JWXYZ
+ fprintf (stderr, "%c",
+ r >= 0xFF000000 ? '#' :
+ r >= 0x88000000 ? '%' :
+ r ? '.' : ' ');
+# else
+ fprintf (stderr, "%c",
+ r >= 0xFF0000 ? '#' :
+ r >= 0x880000 ? '%' :
+ r ? '.' : ' ');
+# endif
+# endif
+
+# if 0 /* Debugging checkerboard */
+ if (sx < ow && sy < oh && (((sx / 4) & 1) ^ ((sy / 4) & 1)))
+ pixel = 0x3F;
+# endif
+
+# ifndef GL_INTENSITY
+ *out++ = 0xFF; /* 2 bytes per pixel (luminance, alpha) */
+# endif
+ *out++ = pixel;
+ }
+# ifdef DUMP_BITMAPS
+ fprintf (stderr, "\n");
+# endif
+ }
+
+# ifdef HAVE_XSHM_EXTENSION
+ if (use_shm)
+ destroy_xshm_image (dpy, image, &shm_info);
+ else
+# endif /* HAVE_XSHM_EXTENSION */
+ {
+ /* We malloc'd image->data, so we free it. */
+ free (image->data);
+ image->data = NULL;
+ XDestroyImage (image);
+ }
+
+ image = 0;
+
+ {
+# ifdef GL_INTENSITY
+ GLuint iformat = GL_INTENSITY;
+ GLuint format = GL_LUMINANCE;
+# else
+ GLuint iformat = GL_LUMINANCE_ALPHA;
+ GLuint format = GL_LUMINANCE_ALPHA;
+# endif
+ GLuint type = GL_UNSIGNED_BYTE;
+
+ if (mipmap_p)
+ gluBuild2DMipmaps (GL_TEXTURE_2D, iformat, w2, h2, format, type, data);
+ else
+ glTexImage2D (GL_TEXTURE_2D, 0, iformat, w2, h2, 0, format, type, data);
+ }
+
+ {
+ char msg[100];
+ sprintf (msg, "texture font %s (%d x %d)",
+ mipmap_p ? "gluBuild2DMipmaps" : "glTexImage2D",
+ w2, h2);
+ check_gl_error (msg);
+ }
+
+ free (data);
+
+ *wP = w2 * scale;
+ *hP = h2 * scale;
+}
+
+
+/* Loads the font named by the X resource "res" and returns
+ a texture-font object.
+*/
+texture_font_data *
+load_texture_font (Display *dpy, char *res)
+{
+ int screen = DefaultScreen (dpy);
+ char *font = get_string_resource (dpy, res, "Font");
+ const char *def1 = "-*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*";
+ const char *def2 = "-*-helvetica-medium-r-normal-*-*-140-*-*-*-*-*-*";
+ const char *def3 = "fixed";
+ XftFont *f = 0;
+ texture_font_data *data;
+ int cache_size = get_integer_resource (dpy, "texFontCacheSize", "Integer");
+
+ /* Hacks that draw a lot of different strings on the screen simultaneously,
+ like Star Wars, should set this to a larger value for performance. */
+ if (cache_size <= 0)
+ cache_size = 30;
+
+ if (!res || !*res) abort();
+
+ if (!strcmp (res, "fpsFont")) { /* Kludge. */
+ def1 = "-*-courier-bold-r-normal-*-*-180-*-*-*-*-*-*"; /* also fps.c */
+ cache_size = 0; /* No need for a cache on FPS: already throttled. */
+ }
+
+ if (!font) font = strdup(def1);
+
+ f = XftFontOpenXlfd (dpy, screen, font);
+ if (!f && !!strcmp (font, def1))
+ {
+ fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+ progname, font, def1);
+ free (font);
+ font = strdup (def1);
+ f = XftFontOpenXlfd (dpy, screen, font);
+ }
+
+ if (!f && !!strcmp (font, def2))
+ {
+ fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+ progname, font, def2);
+ free (font);
+ font = strdup (def2);
+ f = XftFontOpenXlfd (dpy, screen, font);
+ }
+
+ if (!f && !!strcmp (font, def3))
+ {
+ fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+ progname, font, def3);
+ free (font);
+ font = strdup (def3);
+ f = XftFontOpenXlfd (dpy, screen, font);
+ }
+
+ if (!f)
+ {
+ fprintf (stderr, "%s: unable to load fallback font \"%s\" either!\n",
+ progname, font);
+ abort();
+ }
+
+ free (font);
+ font = 0;
+
+ data = (texture_font_data *) calloc (1, sizeof(*data));
+ data->dpy = dpy;
+ data->xftfont = f;
+ data->cache_size = cache_size;
+
+ return data;
+}
+
+
+/* Measure the string, returning the overall metrics.
+ Newlines and tab stops are honored.
+ Any numbers inside [] will be rendered as a subscript.
+
+ The origin is at the origin of the first character, so subsequent
+ lines of a multi-line string look like descenders (below baseline).
+
+ If an XftDraw is supplied, render the string as well, at X,Y.
+ Positive Y is down (X11 style, not OpenGL style).
+ */
+static void
+iterate_texture_string (texture_font_data *data,
+ const char *s,
+ int draw_x, int draw_y,
+ XftDraw *xftdraw, XftColor *xftcolor,
+ XCharStruct *metrics_ret)
+{
+ int line_height = data->xftfont->ascent + data->xftfont->descent;
+ int subscript_offset = line_height * 0.3;
+ const char *os = s;
+ Bool sub_p = False, osub_p = False;
+ int cw = 0, tabs = 0;
+ XCharStruct overall = { 0, };
+ int x = 0, y = 0;
+ int ox = x, oy = y;
+
+ while (1)
+ {
+ if (*s == 0 ||
+ *s == '\n' ||
+ *s == '\t' ||
+ (*s == '[' && isdigit(s[1])) ||
+ (*s == ']' && sub_p))
+ {
+ if (s != os)
+ {
+ XGlyphInfo e;
+ XCharStruct c;
+ int y2 = y;
+ if (sub_p) y2 += subscript_offset;
+
+ XftTextExtentsUtf8 (data->dpy, data->xftfont,
+ (FcChar8 *) os, (int) (s - os),
+ &e);
+ c.lbearing = -e.x; /* XGlyphInfo to XCharStruct */
+ c.rbearing = e.width - e.x;
+ c.ascent = e.y;
+ c.descent = e.height - e.y;
+ c.width = e.xOff;
+
+# undef MAX
+# undef MIN
+# define MAX(A,B) ((A)>(B)?(A):(B))
+# define MIN(A,B) ((A)<(B)?(A):(B))
+ overall.ascent = MAX (overall.ascent, -y2 + c.ascent);
+ overall.descent = MAX (overall.descent, y2 + c.descent);
+ overall.lbearing = MIN (overall.lbearing, (x + c.lbearing));
+ overall.rbearing = MAX (overall.rbearing, x + c.rbearing);
+ overall.width = MAX (overall.width, x + c.width);
+ x += c.width;
+# undef MAX
+# undef MIN
+ }
+
+ if (*s == '\n')
+ {
+ x = 0;
+ y += line_height;
+ sub_p = False;
+ }
+ else if (*s == '\t')
+ {
+ if (! cw)
+ {
+ /* Measure "m" to determine tab width. */
+ XGlyphInfo e;
+ XftTextExtentsUtf8 (data->dpy, data->xftfont,
+ (FcChar8 *) "m", 1, &e);
+ cw = e.xOff;
+ if (cw <= 0) cw = 1;
+ tabs = cw * 7;
+ }
+ x = ((x + tabs) / tabs) * tabs;
+ }
+ else if (*s == '[' && isdigit(s[1]))
+ sub_p = True;
+ else if (*s == ']' && sub_p)
+ sub_p = False;
+
+ if (xftdraw && s != os)
+ XftDrawStringUtf8 (xftdraw, xftcolor, data->xftfont,
+ draw_x + ox,
+ draw_y +
+ oy + (osub_p ? subscript_offset : 0),
+ (FcChar8 *) os, (int) (s - os));
+ if (!*s) break;
+ os = s+1;
+ ox = x;
+ oy = y;
+ osub_p = sub_p;
+ }
+ s++;
+ }
+
+ if (metrics_ret)
+ *metrics_ret = overall;
+}
+
+
+/* Bounding box of the multi-line string, in pixels,
+ and overall ascent/descent of the font.
+ */
+void
+texture_string_metrics (texture_font_data *data, const char *s,
+ XCharStruct *metrics_ret,
+ int *ascent_ret, int *descent_ret)
+{
+ if (metrics_ret)
+ iterate_texture_string (data, s, 0, 0, 0, 0, metrics_ret);
+ if (ascent_ret) *ascent_ret = data->xftfont->ascent;
+ if (descent_ret) *descent_ret = data->xftfont->descent;
+}
+
+
+/* Returns a cache entry for this string, with a valid texid.
+ If the returned entry has a string in it, the texture is valid.
+ Otherwise it is an empty entry waiting to be rendered.
+ */
+static struct texfont_cache *
+get_cache (texture_font_data *data, const char *string)
+{
+ int count = 0;
+ texfont_cache *prev = 0, *prev2 = 0, *curr = 0, *next = 0;
+
+ if (data->cache)
+ for (prev2 = 0, prev = 0, curr = data->cache, next = curr->next;
+ curr;
+ prev2 = prev, prev = curr, curr = next,
+ next = (curr ? curr->next : 0), count++)
+ {
+ if (!strcmp (string, curr->string))
+ {
+ if (prev)
+ prev->next = next; /* Unlink from list */
+ if (curr != data->cache)
+ {
+ curr->next = data->cache; /* Move to front */
+ data->cache = curr;
+ }
+ return curr;
+ }
+ }
+
+ /* Made it to the end of the list without a hit.
+ If the cache is full, empty out the last one on the list,
+ and move it to the front. Keep the texid.
+ */
+ if (count > data->cache_size)
+ {
+ if (!prev) abort();
+ free (prev->string);
+ prev->string = 0;
+ prev->tex_width = 0;
+ prev->tex_height = 0;
+ memset (&prev->extents, 0, sizeof(prev->extents));
+ if (prev2)
+ prev2->next = 0;
+ if (prev != data->cache)
+ prev->next = data->cache;
+ data->cache = prev;
+ return prev;
+ }
+
+ /* Not cached, and cache not full. Add a new entry at the front,
+ and allocate a new texture for it.
+ */
+ curr = (struct texfont_cache *) calloc (1, sizeof(*prev));
+ glGenTextures (1, &curr->texid);
+ curr->string = 0;
+ curr->next = data->cache;
+ data->cache = curr;
+
+ return curr;
+}
+
+
+/* Renders the given string into the prevailing texture.
+ Returns the metrics of the text, and size of the texture.
+ */
+void
+string_to_texture (texture_font_data *data, const char *string,
+ XCharStruct *extents_ret,
+ int *tex_width_ret, int *tex_height_ret)
+{
+ Window window = RootWindow (data->dpy, 0);
+ Pixmap p;
+ XGCValues gcv;
+ GC gc;
+ XWindowAttributes xgwa;
+ XRenderColor rcolor;
+ XftColor xftcolor;
+ XftDraw *xftdraw;
+ int width, height;
+ XCharStruct overall;
+
+ /* Measure the string and create a Pixmap of the proper size.
+ */
+ XGetWindowAttributes (data->dpy, window, &xgwa);
+ iterate_texture_string (data, string, 0, 0, 0, 0, &overall);
+ width = overall.rbearing - overall.lbearing;
+ height = overall.ascent + overall.descent;
+ if (width <= 0) width = 1;
+ if (height <= 0) height = 1;
+ p = XCreatePixmap (data->dpy, window, width, height, xgwa.depth);
+
+ gcv.foreground = BlackPixelOfScreen (xgwa.screen);
+ gc = XCreateGC (data->dpy, p, GCForeground, &gcv);
+ XFillRectangle (data->dpy, p, gc, 0, 0, width, height);
+ XFreeGC (data->dpy, gc);
+
+ /* Render the string into the pixmap.
+ */
+ rcolor.red = rcolor.green = rcolor.blue = rcolor.alpha = 0xFFFF;
+ XftColorAllocValue (data->dpy, xgwa.visual, xgwa.colormap,
+ &rcolor, &xftcolor);
+ xftdraw = XftDrawCreate (data->dpy, p, xgwa.visual, xgwa.colormap);
+ iterate_texture_string (data, string,
+ -overall.lbearing, overall.ascent,
+ xftdraw, &xftcolor, 0);
+ XftDrawDestroy (xftdraw);
+ XftColorFree (data->dpy, xgwa.visual, xgwa.colormap, &xftcolor);
+
+ /* Copy the bits from the Pixmap into a texture, unless it's cached.
+ */
+ bitmap_to_texture (data->dpy, p, xgwa.visual, xgwa.depth,
+ &width, &height);
+ XFreePixmap (data->dpy, p);
+
+ if (extents_ret) *extents_ret = overall;
+ if (tex_width_ret) *tex_width_ret = width;
+ if (tex_height_ret) *tex_height_ret = height;
+}
+
+
+/* Set the various OpenGL parameters for properly rendering things
+ with a texture generated by string_to_texture().
+ */
+void
+enable_texture_string_parameters (void)
+{
+ glEnable (GL_TEXTURE_2D);
+
+ /* Texture-rendering parameters to make font pixmaps tolerable to look at.
+ */
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+
+ /* LOD bias is part of OpenGL 1.4.
+ GL_EXT_texture_lod_bias has been present since the original iPhone.
+ */
+# if !defined(GL_TEXTURE_LOD_BIAS) && defined(GL_TEXTURE_LOD_BIAS_EXT)
+# define GL_TEXTURE_LOD_BIAS GL_TEXTURE_LOD_BIAS_EXT
+# endif
+# ifdef GL_TEXTURE_LOD_BIAS
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.25);
+# endif
+ clear_gl_error(); /* invalid enum on iPad 3 */
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ /* Don't write the transparent parts of the quad into the depth buffer. */
+ glAlphaFunc (GL_GREATER, 0.01);
+ glEnable (GL_ALPHA_TEST);
+ glEnable (GL_BLEND);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+}
+
+
+/* Draws the string in the scene at the origin.
+ Newlines and tab stops are honored.
+ Any numbers inside [] will be rendered as a subscript.
+ Assumes the font has been loaded as with load_texture_font().
+
+ The origin is at the origin of the first character, so subsequent
+ lines of a multi-line string are below that.
+ */
+void
+print_texture_string (texture_font_data *data, const char *string)
+{
+ XCharStruct overall;
+ int tex_width, tex_height;
+ texfont_cache *cache;
+ GLint old_texture;
+
+ if (!*string) return;
+
+ clear_gl_error ();
+
+ /* Save the prevailing texture ID, and bind ours. Restored at the end. */
+ glGetIntegerv (GL_TEXTURE_BINDING_2D, &old_texture);
+
+ cache = get_cache (data, string);
+
+ glBindTexture (GL_TEXTURE_2D, cache->texid);
+ check_gl_error ("texture font binding");
+
+ /* Measure the string and make a pixmap that will fit it,
+ unless it's cached.
+ */
+ if (cache->string)
+ {
+ overall = data->cache->extents;
+ tex_width = data->cache->tex_width;
+ tex_height = data->cache->tex_height;
+ }
+ else
+ {
+# if defined HAVE_JWXYZ && defined JWXYZ_GL
+ /* TODO, JWXYZ_GL: Mixing Xlib and GL has issues. */
+ memset (&overall, 0, sizeof(overall));
+ tex_width = 8;
+ tex_height = 8;
+# else
+ string_to_texture (data, string, &overall, &tex_width, &tex_height);
+# endif
+ }
+
+ {
+ int ofront, oblend;
+ Bool alpha_p, blend_p, light_p, gen_s_p, gen_t_p;
+ GLfloat omatrix[16];
+ GLfloat qx0, qy0, qx1, qy1;
+ GLfloat tx0, ty0, tx1, ty1;
+
+ /* If face culling is not enabled, draw front and back. */
+ Bool draw_back_face_p = !glIsEnabled (GL_CULL_FACE);
+
+ /* Save the prevailing texture environment, and set up ours.
+ */
+ glGetIntegerv (GL_FRONT_FACE, &ofront);
+ glGetIntegerv (GL_BLEND_DST, &oblend);
+ glGetFloatv (GL_TEXTURE_MATRIX, omatrix);
+ blend_p = glIsEnabled (GL_BLEND);
+ alpha_p = glIsEnabled (GL_ALPHA_TEST);
+ light_p = glIsEnabled (GL_LIGHTING);
+ gen_s_p = glIsEnabled (GL_TEXTURE_GEN_S);
+ gen_t_p = glIsEnabled (GL_TEXTURE_GEN_T);
+
+ glPushMatrix();
+
+ glNormal3f (0, 0, 1);
+ glFrontFace (GL_CW);
+
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity ();
+ glMatrixMode (GL_MODELVIEW);
+
+ enable_texture_string_parameters();
+
+ /* Draw a quad with that texture on it, possibly using a cached texture.
+ Position the XCharStruct origin at 0,0 in the scene.
+ */
+ qx0 = overall.lbearing;
+ qy0 = -overall.descent;
+ qx1 = overall.rbearing;
+ qy1 = overall.ascent;
+
+ tx0 = 0;
+ ty1 = 0;
+ tx1 = (overall.rbearing - overall.lbearing) / (GLfloat) tex_width;
+ ty0 = (overall.ascent + overall.descent) / (GLfloat) tex_height;
+
+ glEnable (GL_CULL_FACE);
+ glFrontFace (GL_CCW);
+ glBegin (GL_QUADS);
+ glTexCoord2f (tx0, ty0); glVertex3f (qx0, qy0, 0);
+ glTexCoord2f (tx1, ty0); glVertex3f (qx1, qy0, 0);
+ glTexCoord2f (tx1, ty1); glVertex3f (qx1, qy1, 0);
+ glTexCoord2f (tx0, ty1); glVertex3f (qx0, qy1, 0);
+ glEnd();
+
+ if (draw_back_face_p)
+ {
+ glFrontFace (GL_CW);
+ glBegin (GL_QUADS);
+ glTexCoord2f (tx0, ty0); glVertex3f (qx0, qy0, 0);
+ glTexCoord2f (tx1, ty0); glVertex3f (qx1, qy0, 0);
+ glTexCoord2f (tx1, ty1); glVertex3f (qx1, qy1, 0);
+ glTexCoord2f (tx0, ty1); glVertex3f (qx0, qy1, 0);
+ glEnd();
+ glDisable (GL_CULL_FACE);
+ }
+
+ glPopMatrix();
+
+ /* Reset to the caller's texture environment.
+ */
+ glBindTexture (GL_TEXTURE_2D, old_texture);
+ glFrontFace (ofront);
+ if (!alpha_p) glDisable (GL_ALPHA_TEST);
+ if (!blend_p) glDisable (GL_BLEND);
+ if (light_p) glEnable (GL_LIGHTING);
+ if (gen_s_p) glEnable (GL_TEXTURE_GEN_S);
+ if (gen_t_p) glEnable (GL_TEXTURE_GEN_T);
+
+ glBlendFunc (GL_SRC_ALPHA, oblend);
+
+ glMatrixMode (GL_TEXTURE);
+ glMultMatrixf (omatrix);
+ glMatrixMode (GL_MODELVIEW);
+
+ check_gl_error ("texture font print");
+
+ /* Store this string into the cache, unless that's where it came from.
+ */
+ if (!cache->string)
+ {
+ cache->string = strdup (string);
+ cache->extents = overall;
+ cache->tex_width = tex_width;
+ cache->tex_height = tex_height;
+ }
+ }
+}
+
+
+/* Draws the string on the window at the given pixel position.
+ Newlines and tab stops are honored.
+ Any numbers inside [] will be rendered as a subscript.
+ Assumes the font has been loaded as with load_texture_font().
+
+ Position is 0 for center, 1 for top left, 2 for bottom left.
+ */
+void
+print_texture_label (Display *dpy,
+ texture_font_data *data,
+ int window_width, int window_height,
+ int position,
+ const char *string)
+{
+ GLfloat color[4];
+
+ Bool tex_p = glIsEnabled (GL_TEXTURE_2D);
+ Bool texs_p = glIsEnabled (GL_TEXTURE_GEN_S);
+ Bool text_p = glIsEnabled (GL_TEXTURE_GEN_T);
+ Bool depth_p = glIsEnabled (GL_DEPTH_TEST);
+ Bool cull_p = glIsEnabled (GL_CULL_FACE);
+ Bool fog_p = glIsEnabled (GL_FOG);
+ GLint ovp[4];
+
+# ifndef HAVE_JWZGLES
+ GLint opoly[2];
+ glGetIntegerv (GL_POLYGON_MODE, opoly);
+# endif
+
+ glGetIntegerv (GL_VIEWPORT, ovp);
+
+ glGetFloatv (GL_CURRENT_COLOR, color);
+
+ glEnable (GL_TEXTURE_2D);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glPolygonMode (GL_FRONT, GL_FILL);
+
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_FOG);
+
+ glDisable (GL_DEPTH_TEST);
+
+ /* Each matrix mode has its own stack, so we need to push/pop
+ them separately.
+ */
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ {
+ XCharStruct cs;
+ int ascent, descent;
+ int x, y, w, h, swap;
+ /* int rot = (int) current_device_rotation(); */
+ int rot = 0; /* Since GL hacks rotate now */
+
+ glLoadIdentity();
+ glViewport (0, 0, window_width, window_height);
+ glOrtho (0, window_width, 0, window_height, -1, 1);
+
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+
+ texture_string_metrics (data, string, &cs, &ascent, &descent);
+ h = cs.ascent + cs.descent;
+ w = cs.width;
+
+# ifdef USE_IPHONE
+ {
+ /* Size of the font is in points, so scale iOS pixels to points. */
+ GLfloat scale = ((window_width > window_height
+ ? window_width : window_height)
+ / 768.0);
+ if (scale < 1) scale = 1;
+
+ /* jwxyz-XLoadFont has already doubled the font size, to compensate
+ for physically smaller screens. Undo that, since OpenGL hacks
+ use full-resolution framebuffers, unlike X11 hacks. */
+ scale /= 2;
+
+ window_width /= scale;
+ window_height /= scale;
+ glScalef (scale, scale, scale);
+ }
+# endif /* USE_IPHONE */
+
+ if (rot > 135 || rot < -135) /* 180 */
+ {
+ glTranslatef (window_width, window_height, 0);
+ glRotatef (180, 0, 0, 1);
+ }
+ else if (rot > 45) /* 90 */
+ {
+ glTranslatef (window_width, 0, 0);
+ glRotatef (90, 0, 0, 1);
+ swap = window_width;
+ window_width = window_height;
+ window_height = swap;
+ }
+ else if (rot < -45) /* 270 */
+ {
+ glTranslatef(0, window_height, 0);
+ glRotatef (-90, 0, 0, 1);
+ swap = window_width;
+ window_width = window_height;
+ window_height = swap;
+ }
+
+ switch (position) {
+ case 0: /* center */
+ x = (window_width - w) / 2;
+ y = (window_height + h) / 2 - ascent;
+ break;
+ case 1: /* top */
+ x = ascent;
+ y = window_height - ascent*2;
+ break;
+ case 2: /* bottom */
+ x = ascent;
+ y = h;
+ break;
+ default:
+ abort();
+ }
+
+ glTranslatef (x, y, 0);
+
+ /* draw the text five times, to give it a border. */
+ {
+ const XPoint offsets[] = {{ -1, -1 },
+ { -1, 1 },
+ { 1, 1 },
+ { 1, -1 },
+ { 0, 0 }};
+ int i;
+
+ glColor3f (0, 0, 0);
+ for (i = 0; i < countof(offsets); i++)
+ {
+ if (offsets[i].x == 0)
+ glColor4fv (color);
+ glPushMatrix();
+ glTranslatef (offsets[i].x, offsets[i].y, 0);
+ print_texture_string (data, string);
+ glPopMatrix();
+ }
+ }
+ }
+ glPopMatrix();
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ if (tex_p) glEnable (GL_TEXTURE_2D); else glDisable (GL_TEXTURE_2D);
+ if (texs_p) glEnable (GL_TEXTURE_GEN_S);/*else glDisable(GL_TEXTURE_GEN_S);*/
+ if (text_p) glEnable (GL_TEXTURE_GEN_T);/*else glDisable(GL_TEXTURE_GEN_T);*/
+ if (depth_p) glEnable (GL_DEPTH_TEST); else glDisable (GL_DEPTH_TEST);
+ if (cull_p) glEnable (GL_CULL_FACE); /*else glDisable (GL_CULL_FACE);*/
+ if (fog_p) glEnable (GL_FOG); /*else glDisable (GL_FOG);*/
+
+ glViewport (ovp[0], ovp[1], ovp[2], ovp[3]);
+
+# ifndef HAVE_JWZGLES
+ glPolygonMode (GL_FRONT, opoly[0]);
+# endif
+
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+#ifdef HAVE_JWXYZ
+char *
+texfont_unicode_character_name (texture_font_data *data, unsigned long uc)
+{
+ Font fid = data->xftfont->xfont->fid;
+ return jwxyz_unicode_character_name (data->dpy, fid, uc);
+}
+#endif /* HAVE_JWXYZ */
+
+
+
+/* Releases the font and texture.
+ */
+void
+free_texture_font (texture_font_data *data)
+{
+ while (data->cache)
+ {
+ texfont_cache *next = data->cache->next;
+ glDeleteTextures (1, &data->cache->texid);
+ free (data->cache);
+ data->cache = next;
+ }
+ if (data->xftfont)
+ XftFontClose (data->dpy, data->xftfont);
+ free (data);
+}
diff --git a/hacks/glx/texfont.h b/hacks/glx/texfont.h
new file mode 100644
index 0000000..8f86dab
--- /dev/null
+++ b/hacks/glx/texfont.h
@@ -0,0 +1,72 @@
+/* texfonts, Copyright (c) 2005-2016 Jamie Zawinski <jwz@jwz.org>
+ * Loads X11 fonts into textures for use with OpenGL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __TEXTURE_FONT_H__
+#define __TEXTURE_FONT_H__
+
+typedef struct texture_font_data texture_font_data;
+
+/* Loads the font named by the X resource "res" and returns
+ a texture-font object.
+*/
+extern texture_font_data *load_texture_font (Display *, char *res);
+
+/* Bounding box of the multi-line string, in pixels,
+ and overall ascent/descent of the font.
+ */
+extern void texture_string_metrics (texture_font_data *, const char *,
+ XCharStruct *metrics_ret,
+ int *ascent_ret, int *descent_ret);
+
+/* Draws the string in the scene at the origin.
+ Newlines and tab stops are honored.
+ Any numbers inside [] will be rendered as a subscript.
+ Assumes the font has been loaded as with load_texture_font().
+ */
+extern void print_texture_string (texture_font_data *, const char *);
+
+/* Draws the string on the window at the given pixel position.
+ Newlines and tab stops are honored.
+ Any numbers inside [] will be rendered as a subscript.
+ Assumes the font has been loaded as with load_texture_font().
+
+ Position is 0 for center, 1 for top left, 2 for bottom left.
+ */
+void print_texture_label (Display *, texture_font_data *,
+ int window_width, int window_height,
+ int position, const char *string);
+
+/* Renders the given string into the prevailing texture.
+ Returns the metrics of the text, and size of the texture.
+ */
+void string_to_texture (texture_font_data *, const char *,
+ XCharStruct *extents_ret,
+ int *tex_width_ret, int *tex_height_ret);
+
+/* Set the various OpenGL parameters for properly rendering things
+ with a texture generated by string_to_texture().
+ */
+void enable_texture_string_parameters (void);
+
+
+/* Releases the texture font.
+ */
+extern void free_texture_font (texture_font_data *);
+
+
+#ifdef HAVE_JWXYZ
+extern char *texfont_unicode_character_name (texture_font_data *,
+ unsigned long uc);
+#endif
+
+
+#endif /* __TEXTURE_FONT_H__ */
diff --git a/hacks/glx/timetunnel.c b/hacks/glx/timetunnel.c
new file mode 100644
index 0000000..723d04d
--- /dev/null
+++ b/hacks/glx/timetunnel.c
@@ -0,0 +1,1240 @@
+/* timetunnel. Based on dangerball.c, hack by Sean Brennan <zettix@yahoo.com>*/
+/* dangerball, Copyright (c) 2001-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define GL_GLEXT_PROTOTYPES 1
+
+#include <math.h> /* for log2 */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*timeStart: 0.0 \n" \
+ "*timeEnd: 27.79 \n" \
+ "*wireframe: False \n" \
+
+
+
+# define free_tunnel 0
+# define release_tunnel 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+#define DEF_START "0.00"
+#define DEF_DILATE "1.00"
+#define DEF_END "27.79"
+#define DEF_LOCKLOGO "False"
+#define DEF_DRAWLOGO "True"
+#define DEF_REVERSE "False"
+#define DEF_FOG "True"
+#define DEF_TEXTURE "True"
+#define MAX_TEXTURE 10
+#define CYL_LEN 14.0
+#define DIAMOND_LEN 10.0
+
+static float start, end, dilate;
+static Bool do_texture, drawlogo, wire, reverse, do_fog;
+static const char *do_tx1, *do_tx2, *do_tx3, *do_tun1, *do_tun2, *do_tun3;
+
+static XrmOptionDescRec opts[] = {
+ {"-texture" , ".texture", XrmoptionNoArg, "true" },
+ {"+texture" , ".texture", XrmoptionNoArg, "false" },
+ {"-start" , ".start", XrmoptionSepArg, 0 },
+ {"-end" , ".end", XrmoptionSepArg, 0 },
+ {"-dilate" , ".dilate", XrmoptionSepArg, 0 },
+ {"+logo" , ".drawlogo", XrmoptionNoArg, "false" },
+ {"-reverse" , ".reverse", XrmoptionNoArg, "true" },
+ {"+fog" , ".fog", XrmoptionNoArg, "false" },
+ {"-marquee" , ".marquee", XrmoptionSepArg, 0},
+ /* {"+marquee" , ".marquee", XrmoptionNoArg, "(none)"}, */
+ {"-tardis" , ".tardis", XrmoptionSepArg, 0},
+ /* {"+tardis" , ".tardis", XrmoptionNoArg, "(none)"}, */
+ {"-head" , ".head", XrmoptionSepArg, 0},
+ /* {"+head" , ".head", XrmoptionNoArg, "(none)"}, */
+ {"-tun1" , ".tun1", XrmoptionSepArg, 0},
+ /* {"+tun1" , ".tun1", XrmoptionNoArg, "(none)"}, */
+ {"-tun2" , ".tun2", XrmoptionSepArg, 0},
+ /* {"+tun2" , ".tun2", XrmoptionNoArg, "(none)"}, */
+ {"-tun3" , ".tun3", XrmoptionSepArg, 0},
+ /* {"+tun3" , ".tun3", XrmoptionNoArg, "(none)"}, */
+};
+
+static argtype vars[] = {
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&start, "start", "Start", DEF_START, t_Float},
+ {&end, "end", "End", DEF_END , t_Float},
+ {&dilate, "dilate", "Dilate", DEF_DILATE , t_Float},
+ {&drawlogo, "drawlogo", "DrawLogo", DEF_DRAWLOGO , t_Bool},
+ {&reverse, "reverse", "Reverse", DEF_REVERSE , t_Bool},
+ {&do_fog, "fog", "Fog", DEF_FOG , t_Bool},
+ {&do_tx1, "marquee", "Marquee", "(none)", t_String},
+ {&do_tx2, "tardis", "Tardis", "(none)", t_String},
+ {&do_tx3, "head", "Head", "(none)", t_String},
+ {&do_tun1, "tun1", "Tunnel 1", "(none)", t_String},
+ {&do_tun2, "tun2", "Tunnel 2", "(none)", t_String},
+ {&do_tun3, "tun3", "Tunnel 3", "(none)", t_String},
+};
+
+ENTRYPOINT ModeSpecOpt tunnel_opts = {countof(opts), opts, countof(vars), vars, NULL};
+#include "ximage-loader.h"
+#include "images/gen/logo-180_png.h"
+#include "images/gen/tunnelstar_png.h"
+#include "images/gen/timetunnel0_png.h"
+#include "images/gen/timetunnel1_png.h"
+#include "images/gen/timetunnel2_png.h"
+
+
+#ifdef USE_GL /* whole file */
+
+/* ANIMATION CONTROLS */
+/* an effect is a collection of floating point variables that vary with time.
+A knot is a timestamp with an array of floats. State is the current values of the floats.
+State is set by linearly interpolating between knots */
+typedef struct {
+ float *knots, *state;
+ int numknots, knotwidth;
+ float direction;
+} effect_t;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int time_oldusec, time_oldsec;
+
+ int num_texshifts; /* animates tunnels. Not an effect. */
+ GLfloat pos, *texshift;
+
+ GLuint texture_binds[MAX_TEXTURE], cyllist, diamondlist;
+
+ float effect_time, effect_maxsecs; /* global time controls */
+ float start_time, end_time;
+
+ int num_effects;
+ effect_t *effects; /* array of all effects */
+
+} tunnel_configuration;
+
+static tunnel_configuration *tconf = NULL;
+
+/* allocate memory and populate effect with knot data */
+static void init_effect(effect_t *e, int numk, int kwidth,
+ float dir, float *data )
+{
+ int i, j;
+
+ e->numknots = numk;
+ e->knotwidth = kwidth;
+ e->direction = dir;
+ e->knots = calloc(numk * kwidth, sizeof(float));
+ e->state = calloc(numk, sizeof(float));
+ for ( i = 0 ; i < e->numknots ; i++)
+ for ( j = 0 ; j < e->knotwidth; j++)
+ e->knots[i * kwidth + j] = data[i * kwidth + j];
+}
+
+/* static knot data. each effect is listed and knot data is hard coded.
+ Knots are linerally interpolated to yield float values, depending on
+ knot width. knot format is [time, data, data, data...].
+ Data can be alpha, zvalue, etc. */
+static void init_effects(effect_t *e, int effectnum)
+{
+ /* effect 1: wall tunnel. percent closed */
+ float e1d[6][2] =
+ {{0.0, 0.055},
+ {2.77, 0.055},
+ {3.07,1.0},
+ {8.08, 1.0},
+ {8.08, 0.0},
+ {10.0, 0.0}};
+ /* effect 2: tardis. distance and alpha */
+ float e2d[8][3] =
+ { {0.0, 0.0 , 0.0},
+ {3.44, 0.0 , 0.0},
+ {3.36, 5.4 , 0.0},
+ {4.24, 3.66, 1.0},
+ {6.51, 2.4, 0.94},
+ {8.08, 0.75 , 0.0},
+ {8.08, 0.0 , 0.0},
+ {10.0, 0.0, 0.0}};
+ /* effect 3: cylinder. alpha */
+ float e3d[5][2] =
+ {{0.0, 0.0},
+ {6.41, 0.00},
+ {8.08, 1.0},
+ {14.81, 1.0},
+ {15.65, 0.0}};
+
+ /* effect 4: fog. color, density, start, end */
+ float e4d[9][5] =
+ {{0.0 , 1.0, 0.45, 3.0, 15.0},
+ {6.40, 1.0, 0.45, 3.0, 14.0},
+ {8.08, 1.0, 0.95, 1.0, 14.0},
+ {15.17, 1.0, 0.95, 1.0, 6.0},
+ {15.51, 1.0, 0.95, 3.0, 8.0},
+ {23.35, 1.0, 0.95, 3.0, 8.0},
+ {24.02, 0.0, 0.95, 2.3, 5.0},
+ {26.02, 0.0, 0.95, 2.3, 5.0},
+ {27.72, 0.0, 1.00, 0.3, 0.9}
+ };
+
+ /* effect 5: logo. dist, alpha */
+ float e5d[7][3] =
+ {{0.0, 0.0, 0.0},
+ {16.52, 0.00, 0.0},
+ {16.52, 0.80, 0.01},
+ {17.18, 1.15, 1.0},
+ {22.36, 5.3, 1.0},
+ {22.69, 5.7, 0.0},
+ {22.69, 0.0, 0.0}
+ };
+ /* effect 6: diamond tunnel. alpha */
+ float e6d[3][2] =
+ {{0.0, 0.00},
+ {15.17, 0.00},
+ {15.51,1.0}};
+
+ /* effect 7: tardis cap draw . positive draws cap*/
+ float e7d[3][2] =
+ {{0.0, -1.00},
+ {4.24, -1.00},
+ {4.24, 1.00}};
+
+ /* effect 8: star/asterisk: alpha */
+ float e8d[5][2] =
+ {{0.0, .00},
+ {10.77, .00},
+ {11.48, 1.00},
+ {15.35, 1.00},
+ {16.12, 0.00}};
+
+ /* effect 9: whohead 1 alpha */
+ float e9d[5][2] =
+ {{0.0, .00},
+ {13.35, .00},
+ {14.48, 1.00},
+ {15.17, 1.00},
+ {15.97, 0.00}};
+ /* {14.87, 1.00},
+ {15.17, 0.00}}; */
+
+ /* effect 10: whohead-brite alpha */
+ float e10d[5][2] =
+ {{0.0, .00},
+ {11.34, .00},
+ {12.34, .20},
+ {13.35, 0.60},
+ {14.48, 0.00}};
+ /* {13.95, 0.00}}; */
+
+ /* effect 11: whohead-psy alpha */
+ float e11d[5][2] =
+ {{0.0, .00},
+ {14.87, .00},
+ {15.17, 1.00},
+ {15.91, 0.00},
+ {16.12, 0.00}};
+
+ /* effect 12: whohead-silhouette pos-z, alpha */
+ float e12d[6][3] =
+ {{0.0, 1.0, .00},
+ {15.07, 1.0, 0.00},
+ {15.07, 1.0, 1.00},
+ {16.01, 1.0, 1.00},
+ {16.78, 0.5, 1.00},
+ {16.78, 0.1, 0.00} };
+
+ /* effect 1: wall tunnel */
+ if (effectnum == 1)
+ init_effect(e, 6, 2, -0.2, (float *) e1d);
+
+ /* effect 2: tardisl */
+ if (effectnum == 2)
+ init_effect(e, 8, 3, 1.0, (float *) e2d);
+
+ /* effect 3: cylinder tunnel */
+ if (effectnum == 3)
+ init_effect(e, 5, 2, 0.889 , (float *) e3d);
+
+ /* effect 4: fog color */
+ if (effectnum == 4)
+ init_effect(e, 9, 5, 1.0, (float *) e4d);
+ /* effect 5: logo distance, alpha*/
+ if (effectnum == 5)
+ init_effect(e, 7, 3, 1.0, (float *) e5d);
+ /* effect 6: diamond tunnel, alpha*/
+ if (effectnum == 6)
+ init_effect(e, 3, 2, 0.24 , (float *) e6d);
+
+ /* effect 7: cap wall tunnel*/
+ if (effectnum == 7)
+ init_effect(e, 3, 2, 1.0, (float *) e7d);
+
+ /* effect 8: asterisk */
+ if (effectnum == 8)
+ init_effect(e, 5, 2, 1.0, (float *) e8d);
+
+ /* effect 9, 10, 11, 12: whoheads */
+ if (effectnum == 9 )
+ init_effect(e, 5, 2, 1.0, (float *) e9d);
+ if (effectnum == 10 )
+ init_effect(e, 5, 2, 1.0, (float *) e10d);
+ if (effectnum == 11 )
+ init_effect(e, 5, 2, 1.0, (float *) e11d);
+ if (effectnum == 12 )
+ init_effect(e, 6, 3, 1.0, (float *) e12d);
+}
+
+
+/* set fog parameters, controlled by effect */
+static void update_fog(float color, float density, float start, float end)
+{
+ GLfloat col[4];
+
+ col[0] = col[1] = col[2] = color;
+ col[3] = 1.0;
+
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glFogfv(GL_FOG_COLOR, col);
+ glFogf(GL_FOG_DENSITY, density);
+ glFogf(GL_FOG_START, start);
+ glFogf(GL_FOG_END, end);
+}
+
+/* set effect's floating point data values by linearally interpolating
+between two knots whose times bound the current time: eff_time */
+
+static void update_knots(effect_t *e, float eff_time)
+{
+ int i, j;
+ float timedelta, lowknot, highknot, *curknot, *nextknot;
+
+ for ( i = 0 ; i < e->numknots ; i++)
+ if (e->knots[i * e->knotwidth] <= eff_time) {
+ if ( i < e->numknots - 1)
+ nextknot = e->knots + (i + 1) * e->knotwidth;
+ else
+ /*repeat last knot to carry knot data forward*/
+ nextknot = e->knots + (i) * e->knotwidth;
+ curknot = e->knots + i * e->knotwidth;
+ if (*nextknot - *curknot <= 0.0) timedelta = 1.0;
+ else
+ timedelta = (eff_time-*curknot)/(*nextknot-*curknot);
+ if (timedelta > 1.0) timedelta = 1.0;
+ for (j = 1 ; j < e->knotwidth ; j++) {
+ highknot = (float) *(nextknot + j);
+ lowknot = (float) *(curknot + j);
+ e->state[j - 1 ] = lowknot+(highknot-lowknot)*timedelta;
+ }
+ }
+
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_tunnel (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (90.0, 1/h, 0.2, 50.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 0.3,
+ 0.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+
+ENTRYPOINT Bool
+tunnel_handle_event (ModeInfo *mi, XEvent *event)
+{
+ tunnel_configuration *tc = &tconf[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, tc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &tc->button_down_p))
+ return True;
+
+ return False;
+}
+
+static void setTexParams(void)
+{
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+}
+
+static void update_animation(tunnel_configuration *tc) {
+
+ /* time based, of course*/
+ /* shift texture based on elapsed time since previous call*/
+ struct timeval tv;
+ struct timezone tz;
+ int elapsed_usecs, elapsed_secs, i;
+ float computed_timeshift;
+
+ /* get new animation time */
+ gettimeofday(&tv, &tz);
+ elapsed_secs = tv.tv_sec - tc->time_oldsec;
+ elapsed_usecs = tv.tv_usec - tc->time_oldusec;
+ /* store current time */
+ tc->time_oldsec = tv.tv_sec ;
+ tc->time_oldusec = tv.tv_usec;
+ /* elaped time. computed timeshift is tenths of a second */
+ computed_timeshift = (float) (elapsed_secs * 1000000. + elapsed_usecs)/
+ 100000.0;
+
+ /* calibrate effect time to lie between start and end times */
+ /* loop if time exceeds end time */
+ if (reverse)
+ tc->effect_time -= computed_timeshift / 10.0 * dilate;
+ else
+ tc->effect_time += computed_timeshift / 10.0 * dilate;
+ if ( tc->effect_time >= tc->end_time)
+ tc->effect_time = tc->start_time;
+ if ( tc->effect_time < tc->start_time)
+ tc->effect_time = tc->end_time;;
+
+ /* move texture shifters in effect's direction, e.g. tardis
+ tunnel moves backward, effect 1's direction */
+ if (reverse) {
+ tc->texshift[0] -= tc->effects[1].direction * computed_timeshift/ 10.0;
+ tc->texshift[1] -= tc->effects[3].direction * computed_timeshift/ 10.0;
+ tc->texshift[2] -= tc->effects[6].direction * computed_timeshift/ 10.0;
+
+ } else {
+ tc->texshift[0] += tc->effects[1].direction * computed_timeshift/ 10.0;
+ tc->texshift[1] += tc->effects[3].direction * computed_timeshift/ 10.0;
+ tc->texshift[2] += tc->effects[6].direction * computed_timeshift/ 10.0;
+ }
+
+ /* loop texture shifters if necessary */
+ for ( i = 0 ; i < tc->num_texshifts; i++) {
+ if (tc->texshift[i] > 1.0)
+ tc->texshift[i] -= (int) tc->texshift[i];
+ if (tc->texshift[i]< -1.0)
+ tc->texshift[i] -= (int) tc->texshift[i];
+ }
+
+ /* update effect data with current time. Uses linear interpolation */
+ for ( i = 1 ; i <= tc->num_effects ; i++)
+ update_knots(&tc->effects[i], tc->effect_time);
+
+} /*update_animation*/
+
+/* draw a textured(tex) quad at a certain depth (z), and certain alpha (alpha),
+with aspect ratio (aspect), and blending mode (blend_mode) of either adding
+or subtracting. if alpha is zero or less, nothing happens */
+static void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z, float alpha, float aspect,
+ GLuint tex, int blend_mode)
+{
+
+#ifndef HAVE_JWZGLES
+ if (alpha > 0.0) {
+ mi->polygon_count ++;
+ /* glEnable(GL_BLEND); */
+ glBlendColor(0.0, 0.0, 0.0, alpha);
+ /*glBlendColor(0.0, 0.0, 0.0, 0.0); */
+ if (blend_mode == 1) {
+ glBlendFunc(GL_CONSTANT_ALPHA,
+ GL_ONE);
+ glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
+ } else if (blend_mode == 2) {
+ glBlendFunc(GL_CONSTANT_ALPHA,
+ GL_ONE);
+ glBlendEquation(GL_FUNC_ADD);
+ } else {
+ glBlendFunc(GL_CONSTANT_ALPHA,
+ GL_ONE_MINUS_CONSTANT_ALPHA);
+ glBlendEquation(GL_FUNC_ADD);
+ } /* blend mode switch */
+
+#ifdef HAVE_GLBINDTEXTURE
+ if (do_texture)
+ glBindTexture(GL_TEXTURE_2D, tc->texture_binds[tex]);
+#endif
+ glBegin(GL_QUADS);
+ glTexCoord2f(1.0, 0.0);
+ glVertex3f(-1.0 , -1.0 * aspect , z);
+ glTexCoord2f(1.0, 1.0);
+ glVertex3f(-1.0 , 1.0 * aspect , z);
+ glTexCoord2f(0.0, 1.0);
+ glVertex3f(1.0 , 1.0 * aspect , z);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(1.0 , -1.0 * aspect , z);
+ glEnd();
+ if (blend_mode != 0) {
+ glBlendFunc(GL_CONSTANT_ALPHA,
+ GL_ONE_MINUS_CONSTANT_ALPHA);
+ glBlendEquation(GL_FUNC_ADD);
+ }
+ /* glDisable(GL_BLEND); */
+
+ }
+#endif /* !HAVE_JWZGLES */
+} /* draw sign */
+
+
+/* draw a time tunnel. used for both cylinder and diamond tunnels.
+ uses texture shifter (indexed by shiftnum) to simulate motion.
+ tunnel does not move, and is acutally a display list. if alpha = 0, skip */
+static void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int texnum, int listnum, int shiftnum)
+{
+#ifndef HAVE_JWZGLES
+ if (alpha > 0.0) {
+ if (listnum == tc->diamondlist)
+ mi->polygon_count += 4;
+ if (listnum == tc->cyllist)
+ mi->polygon_count += 30;
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glTranslatef(tc->texshift[shiftnum], 0.0, 0.0);
+ glMatrixMode(GL_MODELVIEW);
+ /* glEnable(GL_BLEND); */
+ glBlendColor(0.0, 0.0, 0.0, alpha);
+ glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
+
+#ifdef HAVE_GLBINDTEXTURE
+ if (do_texture)
+ glBindTexture(GL_TEXTURE_2D, tc->texture_binds[texnum]);
+#endif
+ glCallList(listnum);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ /* glDisable(GL_BLEND); */
+ }
+#endif /* HAVE_JWZGLES */
+}
+
+
+/* make tardis type tunnel. Starts as walls and then
+grows to outline of tardis. percent is how complete
+tardis outline is. cap is to draw cap for nice fog effects */
+
+static void make_wall_tunnel(ModeInfo *mi, tunnel_configuration *tc, float percent, float cap)
+{
+ /* tardis is about 2x1, so wrap tex around, starting at the base*/
+ /* tex coords are:
+
+ _tl__tr_
+ | |
+l| |r
+ | |
+ -bl__br_
+ that's br=bottom right, etc. ttr is top-top-right */
+
+ float half_floor= 0.08333333333333333,
+ full_wall = 0.33333333333333333;
+ float br1,
+ r0 , r1 ,
+ tr0, tr1,
+ tl0, tl1,
+ l0 , l1 ,
+ depth=0.3, zdepth=15.0;
+ /* zdepth is how far back tunnel goes */
+ /* depth is tex coord scale. low number = fast texture shifting */
+
+ float textop, texbot;
+ float height;
+
+ br1 = half_floor;
+ r0 = br1 ;
+ r1 = r0 + full_wall;
+ tr0 = r1;
+ tr1 = r1 + half_floor;
+ tl0 = tr1;
+ tl1 = tl0 + half_floor;
+ l0 = tr1;
+ l1 = l0 + full_wall;
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ glTranslatef(tc->texshift[0], 0.0, 0.0);
+ glMatrixMode(GL_MODELVIEW);
+
+#ifdef HAVE_GLBINDTEXTURE
+ if (do_texture)
+ glBindTexture(GL_TEXTURE_2D, tc->texture_binds[0]);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ if (cap > 0.0 && percent > 0.0 && drawlogo && do_fog) {
+ mi->polygon_count += 6;
+ glBegin(GL_TRIANGLE_FAN);
+ glVertex3f(0.0, 0.0, zdepth);
+ glVertex3f(-1.0, -2.0, zdepth);
+ glVertex3f(1.0, -2.0, zdepth);
+ glVertex3f(1.0, 2.0, zdepth);
+ glVertex3f(0.2, 2.0, zdepth);
+ glVertex3f(0.2, 2.2, zdepth);
+ glVertex3f(-0.2, 2.2, zdepth);
+ glVertex3f(-0.2, 2.0, zdepth);
+ glVertex3f(-1.0, 2.0, zdepth);
+ glVertex3f(-1.0, -2.0, zdepth);
+ glEnd();
+ }
+ if (percent > ( full_wall * 2.0)) {
+ glBegin(GL_QUADS);
+
+ height = (percent - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+ if (height > 1.0) height = 1.0;
+
+
+ if ( height > 0.8) {
+ mi->polygon_count += 2;
+ if ( height > 0.90) {
+ mi->polygon_count += 2;
+ /* TTTR */
+ texbot = tr0;
+ textop = tr0 + half_floor * height;
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(0.2, 2.2, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(2.0 - height * 2.0, 2.2, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(2.0 - height * 2.0, 2.2, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(0.2, 2.2, zdepth);
+
+ /* TTTL */
+ texbot = tl1 - half_floor * height;
+ textop = tl1;
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(-2.0 + height * 2.0, 2.2, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(-0.2, 2.2, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(-0.2, 2.2, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(-2.0 + height * 2.0, 2.2, zdepth);
+ }
+ if (height > 0.90) height = 0.90;
+
+ /* TTR */
+ texbot = tr0;
+ textop = tr0 + half_floor * height;
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(0.2, 2.0, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(0.2, 0.4 + height * 2.0, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(0.2, 0.4 + height * 2.0, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(0.2, 2.0, zdepth);
+
+ /* TTL */
+ texbot = tl1 - half_floor * height;
+ textop = tl1;
+ glTexCoord2f(0.0, texbot);
+ /*glVertex3f(-.2, 2.0 + (0.9 - height) * 2.0, 0.0); */
+ glVertex3f(-.2, 0.4 + height * 2.0, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(-.2, 2.0, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(-.2, 2.0, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(-.2, 0.4 + height * 2.0, zdepth);
+ }
+
+ height = (percent - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+ if (height > 0.8) height = 0.8;
+
+
+ mi->polygon_count += 2;
+ /* TR */
+ texbot = tr0;
+ textop = tr0 + half_floor * height;
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(1.0, 2.0, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(1.0 - height, 2.0, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(1.0 - height, 2.0, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(1.0, 2.0, zdepth);
+
+ /* TL */
+ texbot = tl1 - half_floor * height;
+ textop = tl1;
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(-1.0 + height, 2.0, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(-1.0, 2.0, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(-1.0, 2.0, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(-1.0 + height, 2.0, zdepth);
+
+ height = (percent - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+
+ if (height > 1.0) height = 1.0;
+
+
+ mi->polygon_count += 2;
+ /* BR */
+ texbot = tr0;
+ textop = tr0 + half_floor * height;
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(1.0, -2.0, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(1.0 - height, -2.0, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(1.0 - height, -2.0, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(1.0, -2.0, zdepth);
+
+ /* BL */
+ texbot = tl1 - half_floor * height;
+ textop = tl1;
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(-1.0 + height, -2.0, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(-1.0, -2.0, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(-1.0, -2.0, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(-1.0 + height, -2.0, zdepth);
+
+
+ glEnd();
+ }
+
+ if (percent > 0.0) {
+ mi->polygon_count += 2;
+ glBegin(GL_QUADS);
+ height = percent / ( full_wall * 2.0);
+ if (height > 1.0) height = 1.0;
+ textop = (l0 + l1) / 2.0 - full_wall * 0.5 * height;
+ texbot = (l0 + l1) / 2.0 + full_wall * 0.5 * height;
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(-1.0, height * 2, 0.0);
+
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(-1.0, -height * 2, 0.0);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(-1.0, -height * 2, zdepth);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(-1.0, height * 2, zdepth);
+
+ textop = (r0 + r1) / 2.0 - full_wall * 0.5 * height;
+ texbot = (r0 + r1) / 2.0 + full_wall * 0.5 * height;
+
+ glTexCoord2f(0.0, texbot);
+ glVertex3f(1.0, height * 2, 0.0);
+
+ glTexCoord2f(0.0, textop);
+ glVertex3f(1.0, -height * 2, 0.0);
+
+ glTexCoord2f(depth, textop);
+ glVertex3f(1.0, -height * 2, zdepth);
+
+ glTexCoord2f(depth, texbot);
+ glVertex3f(1.0, height * 2, zdepth);
+ glEnd();
+ }
+
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+} /* make_wall_tunnel */
+
+/* wraps an int to between min and max.
+ Kind of like the remainder when devided by (max - min).
+ Used to create torus mapping on square array */
+static int wrapVal(int val, int min, int max)
+{
+ int ret;
+
+ ret = val;
+ if (val >= max)
+ ret = min + (val - max ) % (max - min);
+ if (val < min)
+ ret = max - (min - val) % (max - min);
+ return(ret);
+}
+
+/*=================== Load Texture =========================================*/
+/* ripped from atunnel.c, Copyright (c) E. Lassauge, 2003-2004. */
+/* modified like so by Sean Brennan:
+ take texture object for glbind
+ removed xlock stuff
+ Added filters:
+ blur color / alpha channel [3x3 box filter, done [blur] times
+ anegative : create b/w image from zero alpha. zero alpha gets bw_color,
+ nonzero alpha gets 1.0 - bwcolor, then alpha flipped to 1-alpha.
+
+ Inputs: xpm structure, or filename of xmp image. if filename == NULL, use structure.
+ Outputs: texture bound to texutre Id texbind.
+
+*/
+
+static float mylog2(float x) { return ( log(x) / log(2));}
+
+static void LoadTexture(ModeInfo * mi, const unsigned char *fn, unsigned long size, const char *filename, GLuint texbind, int blur, float bw_color, Bool anegative, Bool onealpha)
+{
+ /* looping and temporary array index variables */
+ int ix, iy, bx, by, indx, indy, boxsize, cchan, tmpidx, dtaidx;
+
+ float boxdiv, tmpfa, blursum ;
+ unsigned char *tmpbuf, tmpa;
+ Bool rescale;
+
+
+ XImage *teximage; /* Texture data */
+
+ rescale = False;
+
+ boxsize = 2;
+ boxdiv = 1.0 / ( boxsize * 2.0 + 1.0) / ( boxsize * 2.0 + 1.0);
+
+
+ if (filename)
+ teximage = file_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ filename);
+ else
+ teximage = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ fn, size);
+ if (teximage == NULL) {
+ fprintf(stderr, "%s: error reading the texture.\n", progname);
+ glDeleteTextures(1, &texbind);
+ do_texture = False;
+ exit(0);
+ }
+
+ /* check if image is 2^kumquat, where kumquat is an integer between 1 and 10. Recale to
+ nearest power of 2. */
+ tmpfa = mylog2((float) teximage->width);
+ bx = 2 << (int) (tmpfa -1);
+ if (bx != teximage->width) {
+ rescale = True;
+ if ((tmpfa - (int) tmpfa) > 0.5849)
+ bx = bx * 2;
+ }
+ tmpfa = mylog2((float) teximage->height);
+ by = 2 << (int) (tmpfa - 1);
+ if (by != teximage->height) {
+ rescale = True;
+ if ((tmpfa - (int) tmpfa) > 0.5849)
+ by = by * 2;
+ }
+
+ if (rescale) {
+#ifndef HAVE_JWZGLES
+ tmpbuf = calloc(bx * by * 4, sizeof(unsigned char));
+ if (gluScaleImage(GL_RGBA, teximage->width, teximage->height, GL_UNSIGNED_BYTE, teximage->data,
+ bx, by, GL_UNSIGNED_BYTE, tmpbuf))
+ check_gl_error("scale image");
+
+ free(teximage->data);
+ teximage->data = (char *) tmpbuf;
+ teximage->width = bx;
+ teximage->height= by;
+#endif /* !HAVE_JWZGLES */
+ }
+ /* end rescale code */
+
+ if (anegative ) {
+ for (ix = 0 ; ix < teximage->height * teximage->width; ix++)
+ {
+ if (!teximage->data[ ix * 4 + 3]) {
+ teximage->data[ ix * 4 + 3] = (unsigned char) 0xff;
+ tmpa = (unsigned char) (bw_color * 0xff);
+ } else {
+ if (onealpha)
+ teximage->data[ ix * 4 + 3] = (unsigned char) 0xff;
+ else
+ teximage->data[ ix * 4 + 3] = (unsigned char) 0xff -
+ teximage->data[ ix * 4 + 3];
+ tmpa = (unsigned char) ((1.0 - bw_color) * 0xff);
+ }
+ /* make texture uniform b/w color */
+ teximage->data[ ix * 4 + 0] =
+ (unsigned char) ( tmpa);
+ teximage->data[ ix * 4 + 1] =
+ (unsigned char) ( tmpa);
+ teximage->data[ ix * 4 + 2] =
+ (unsigned char) ( tmpa);
+ /* negate alpha */
+ }
+ }
+
+ if (blur > 0) {
+ if (! anegative ) /* anegative alread b/w's the whole image */
+ for (ix = 0 ; ix < teximage->height * teximage->width; ix++)
+ if (!teximage->data[ ix * 4 + 3])
+ {
+ teximage->data[ ix * 4 + 0] =
+ (unsigned char) ( 255.0 * bw_color);
+ teximage->data[ ix * 4 + 1] =
+ (unsigned char) ( 255.0 * bw_color);
+ teximage->data[ ix * 4 + 2] =
+ (unsigned char) ( 255.0 * bw_color);
+ }
+ ;
+ tmpbuf = calloc(teximage->height * teximage->width * 4, sizeof(unsigned char) ) ;
+ while (blur--) {
+ /* zero out tmp alpha buffer */
+ for (iy = 0 ; iy <teximage->height * teximage->width * 4 ; iy++)
+ tmpbuf[iy] = 0;
+ for (cchan = 0; cchan < 4 ; cchan++) {
+ for (iy = 0 ; iy < teximage->height ; iy++) {
+ for (ix = 0 ; ix < teximage->width ; ix++) {
+ dtaidx = (teximage->width * iy + ix) * 4;
+ tmpa = teximage->data[dtaidx + cchan];
+ tmpfa = (float) tmpa * boxdiv;
+ /* box filter */
+ for (by = -boxsize ; by <= boxsize; by++) {
+ for (bx = -boxsize ; bx <= boxsize; bx++) {
+ indx = wrapVal(ix + bx, 0, teximage->width);
+ indy = wrapVal(iy + by, 0, teximage->height);
+ tmpidx = (teximage->width * indy + indx) * 4;
+ blursum = tmpfa;
+ tmpbuf[tmpidx + cchan] += (unsigned char) blursum;
+ } /* for bx */
+ } /* for by */
+ } /* for ix */
+ } /* for iy */
+ } /* for cchan */
+ /* copy back buffer */
+ for (ix = 0 ; ix < teximage->height * teximage->width * 4; ix++)
+ teximage->data[ix] = tmpbuf[ix];
+ } /*while blur */
+ free(tmpbuf); /*tidy*/
+ } /* if blur */
+
+
+
+
+ clear_gl_error();
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, texbind);
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glBindTexture! */
+#endif
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
+ check_gl_error("texture");
+ setTexParams();
+ XDestroyImage(teximage);
+}
+
+/* creates cylinder for time tunnel. sides, zmin, zmax, rad(ius) obvious.
+ stretch scales texture coords; makes tunnel go slower the larger it is.
+ not drawn, but put into display list. */
+static void makecyl(int sides, float zmin, float zmax, float rad, float stretch)
+{
+ int i;
+ float theta;
+
+ /* cap */
+ if (do_fog) {
+ glBegin(GL_TRIANGLE_FAN);
+ glTexCoord2f(1.0, 0.0);
+ glVertex3f(0.0 , 0.0 , zmax);
+ for (i = 0 ; i <= sides; i++) {
+ theta = 2.0 * M_PI * ((float) i / (float) sides);
+ glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+ }
+ glVertex3f(cos(0.0) * rad, sin(0.0) * rad, zmax);
+ glEnd();
+ }
+
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0 ; i <= sides; i++)
+ {
+ if ( i != sides) {
+ theta = 2.0 * M_PI * ((float) i / (float) sides);
+ glTexCoord2f(0.0, 1.0 * (float) i / (float) sides);
+ glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin);
+ glTexCoord2f(stretch, 1.0 * (float) i / (float) sides);
+ glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+ } else {
+ theta = 0.0;
+ glTexCoord2f(0.0, 1.0);
+ glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin);
+ glTexCoord2f(stretch, 1.0);
+ glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+ }
+ }
+ glEnd();
+}
+
+ENTRYPOINT void
+init_tunnel (ModeInfo *mi)
+{
+ int i;
+
+ tunnel_configuration *tc;
+
+ wire = MI_IS_WIREFRAME(mi);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ wire = 0;
+# endif
+
+ MI_INIT (mi, tconf);
+
+ tc = &tconf[MI_SCREEN(mi)];
+
+ tc->glx_context = init_GL(mi);
+
+ tc->cyllist = glGenLists(1);
+ tc->diamondlist = glGenLists(1);
+ tc->num_effects = 12;
+ tc->num_texshifts = 3;
+ tc->effect_time = 0.0;
+ tc->effect_maxsecs = 30.00;
+ /* check bounds on cmd line opts */
+ if (start > tc->effect_maxsecs) start = tc->effect_maxsecs;
+ if (end > tc->effect_maxsecs) end = tc->effect_maxsecs;
+ if (start < tc->effect_time) start = tc->effect_time;
+ if (end < tc->effect_time) end = tc->effect_time;
+
+ /* set loop times, in seconds */
+ tc->start_time = start;
+ tc->end_time = end;
+
+ /* reset animation knots, effect 0 not defined. */
+ tc->effects = malloc(sizeof(effect_t) * ( tc->num_effects + 1));
+ for ( i = 1; i <= tc->num_effects ; i++)
+ init_effects(&tc->effects[i], i);
+
+ if (wire) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ do_texture = False;
+ }
+
+ if (do_texture)
+ {
+ /* the following textures are loaded, and possible overridden:
+ tunnel 1, tunnel 2, tunnel 3, marquee, tardis, head */
+ glGenTextures(MAX_TEXTURE, tc->texture_binds);
+
+ /*LoadTexture(*mi, *data, size, *filename, texbind, bluralpha, bw_color, anegative, onealpha)*/
+ if (strcasecmp (do_tun1, "(none)")) /* tunnel 1 */
+ LoadTexture(mi, NULL, 0, do_tun1, tc->texture_binds[0], 0,0.0, False, False);
+ else
+ LoadTexture(mi, timetunnel0_png, sizeof(timetunnel0_png), NULL, tc->texture_binds[0], 0, 0.0, False, False);
+ if (strcasecmp (do_tun2, "(none)")) /* tunnel 2 */
+ LoadTexture(mi, NULL, 0, do_tun2, tc->texture_binds[2], 0,0.0, False, False);
+ else
+ LoadTexture(mi, timetunnel1_png, sizeof(timetunnel1_png), NULL, tc->texture_binds[2], 0, 0.0, False, False);
+ if (strcasecmp (do_tun3, "(none)")) /* tunnel 3 */
+ LoadTexture(mi, NULL, 0, do_tun3, tc->texture_binds[5], 0,0.0, False, False);
+ else
+ LoadTexture(mi, timetunnel2_png, sizeof(timetunnel2_png), NULL, tc->texture_binds[5], 0, 0.0, False, False);
+ LoadTexture(mi, tunnelstar_png, sizeof(tunnelstar_png), NULL, tc->texture_binds[4], 0, 0.0, False, False);
+ if (strcasecmp (do_tx1, "(none)")) /* marquee */
+ LoadTexture(mi, NULL, 0, do_tx1, tc->texture_binds[3], 0,0.0, False, False);
+#ifndef HAVE_JWZGLES /* logo_180_png is 180px which is not a power of 2! */
+ else
+ LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[3], 0,0.0, False, False);
+#endif
+ if (strcasecmp (do_tx2, "(none)")) /* tardis */
+ LoadTexture(mi, NULL, 0, do_tx2, tc->texture_binds[1], 0, 0.0 ,False, False);
+#ifndef HAVE_JWZGLES /* logo_180_png is 180px which is not a power of 2! */
+ else
+ LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[1], 0,0.0, False, False);
+#endif
+ if (strcasecmp (do_tx3, "(none)")) { /* head */
+ LoadTexture(mi, NULL, 0, do_tx3, tc->texture_binds[6], 0, 0.0 ,False, False);
+ /* negative */
+ LoadTexture(mi, NULL, 0, do_tx3, tc->texture_binds[9], 2,1.0, True, True);
+#ifndef HAVE_JWZGLES /* logo_180_png is 180px which is not a power of 2! */
+ } else {
+ LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[6], 0,0.0, False, False);
+ /* negative */
+ LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[9], 2,1.0, True, True);
+#endif
+ }
+ glEnable(GL_TEXTURE_2D);
+ check_gl_error("tex");
+ }
+
+ reshape_tunnel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glDisable(GL_DEPTH_TEST); /* who needs it? ;-) */
+
+ if (do_fog)
+ glEnable(GL_FOG);
+
+ if (!wire)
+ {
+ glEnable(GL_ALPHA_TEST);
+ glAlphaFunc(GL_GREATER, 0.5);
+ }
+
+ tc->trackball = gltrackball_init (True);
+
+
+ tc->texshift = calloc(tc->num_texshifts, sizeof(GLfloat));
+ for ( i = 0 ; i < tc->num_texshifts; i++)
+ tc->texshift[i] = 0.0;
+
+ glNewList(tc->cyllist, GL_COMPILE);
+ makecyl(30, -0.1, CYL_LEN, 1., 10. / 40.0 * CYL_LEN);
+ /*makecyl(30, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN); */
+ glEndList();
+
+ glNewList(tc->diamondlist, GL_COMPILE);
+ makecyl(4, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN);
+ glEndList();
+}
+
+
+ENTRYPOINT void
+draw_tunnel (ModeInfo *mi)
+{
+ tunnel_configuration *tc = &tconf[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+
+ if (!tc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(tc->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_NORMALIZE);
+ /* glEnable(GL_CULL_FACE); */
+
+ glClear(GL_COLOR_BUFFER_BIT );
+
+ update_animation(tc);
+
+
+ glPushMatrix ();
+
+ glRotatef(180., 0., 1., 0.);
+ gltrackball_rotate (tc->trackball);
+ glRotatef(180., 0., 1., 0.);
+
+
+
+ mi->polygon_count = 0;
+
+ update_fog(tc->effects[4].state[0], /*color*/
+ tc->effects[4].state[1], /*density*/
+ tc->effects[4].state[2], /*start*/
+ tc->effects[4].state[3]); /*end*/
+
+ /* --- begin composite image assembly --- */
+
+ /* head mask and draw diamond tunnel */
+
+ glEnable(GL_BLEND);
+ draw_cyl(mi, tc, tc->effects[6].state[0], 5, tc->diamondlist, 2);
+ if (drawlogo)
+ draw_sign(mi, tc,tc->effects[12].state[0], tc->effects[12].state[1], 1.0 / 1.33, 9, 1);
+ glDisable(GL_BLEND);
+ /* then tardis tunnel */
+ make_wall_tunnel(mi, tc, tc->effects[1].state[0], tc->effects[7].state[0]);
+
+ /* then cylinder tunnel */
+ glEnable(GL_BLEND);
+ draw_cyl(mi, tc, tc->effects[3].state[0], 2, tc->cyllist, 1);
+
+ /*void draw_sign(mi, tc,z,alpha,aspect,tex,blendmode)*/
+ /* tardis */
+ if (drawlogo)
+ draw_sign(mi, tc, tc->effects[2].state[0], tc->effects[2].state[1], 2.0, 1, 0);
+ /* marquee */
+ if (drawlogo)
+ draw_sign(mi, tc, tc->effects[5].state[0], tc->effects[5].state[1], 1.0, 3, 0);
+ /*who head brite*/
+ if (drawlogo)
+ draw_sign(mi, tc,1.0, tc->effects[10].state[0], 1.0 / 1.33, 6, 2);
+ /*who head psychadelic REMOVED*/
+ /* draw_sign(mi, tc,1.0, tc->effects[11].state[0], 1.0 / 1.33, 8, 0); */
+
+ /* star */
+ /* draw_sign(mi, tc, tc->effects[8].state[0]tc->effects[8].state[0], 1.0 , 1.0, 4, 1); */
+ draw_sign(mi, tc, tc->effects[8].state[0], tc->effects[8].state[0], 1.0, 4, 1);
+
+ /* normal head */
+ if (drawlogo)
+ draw_sign(mi, tc,1.0, tc->effects[9].state[0], 1.0 / 1.33, 6, 0);
+
+ /* --- end composite image assembly --- */
+
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ check_gl_error("drawing done, calling swap buffers");
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("TimeTunnel", timetunnel, tunnel)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/timetunnel.man b/hacks/glx/timetunnel.man
new file mode 100644
index 0000000..cdd6af5
--- /dev/null
+++ b/hacks/glx/timetunnel.man
@@ -0,0 +1,105 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+timetunnel - Plasma tunnels fade in and out
+.SH SYNOPSIS
+.B timetunnel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-start \fInumber\fP]
+[\-end \fInumber\fP]
+[\-dilate \fInumber\fP]
+[\-no-logo]
+[\-reverse]
+[\-no-fog]
+[\-no-texture]
+[\-wireframe]
+[\-fps]
+[\-tardis \fItexture\fP]
+[\-head \fItexture\fP]
+[\-marquee \fItexture\fP]
+[\-tun1 \fItexture\fP]
+[\-tun2 \fItexture\fP]
+[\-tun3 \fItexture\fP]
+.SH DESCRIPTION
+Draws an animation similar to the opening and closing effects on the
+Dr. Who television show.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-start \fInumber\fP
+Start time of loop, 0.0 - 30.00. Default 0.0. May be identical to end time.
+.TP 8
+.B \-end \fInumber\fP
+End time of loop, 0.0 - 30.00. Default 27.79. May be identical to start time.
+.TP 8
+.B \-dilate \fInumber\fP
+Scale time to speed or slow simulation. Numbers less than one slow it down.
+.TP 8
+.B \-no-logo
+Show only tunnels, no logos, etc.
+.TP 8
+.B \-reverse
+Play in reverse, including tunnels.
+.TP 8
+.B \-no-fog
+Turn off fog.
+.TP 8
+.B \-no-texture
+Turn off textures.
+.TP 8
+.B \-wireframe
+Show as wire frame.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-tardis \fItexture\fP
+Specify an xpm file to override default tardis texture.
+.TP 8
+.B \-head \fItexture\fP
+Specify an xpm file to override default Dr. Who head texture.
+.TP 8
+.B \-marquee \fItexture\fP
+Specify an xpm file to override default show marquee texture.
+.TP 8
+.B \-tun1 \fItexture\fP
+Specify an xpm file to override default tardis tunnel texture.
+.TP 8
+.B \-tun2 \fItexture\fP
+Specify an xpm file to override default middle tunnel texture.
+.TP 8
+.B \-tun3 \fItexture\fP
+Specify an xpm file to override default final tunnel texture.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Sean Brennan. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Sean Brennan <zettix@yahoo.com>
diff --git a/hacks/glx/toast.c b/hacks/glx/toast.c
new file mode 100644
index 0000000..eb84601
--- /dev/null
+++ b/hacks/glx/toast.c
@@ -0,0 +1,190 @@
+/* Generated from "toast.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toast_data[] = {
+ 0,-1,0,0.391859,-0.5,0.047937,
+ 0,-1,0,-0.3866,-0.5,-0.047937,
+ 0,-1,0,0.391859,-0.5,-0.047937,
+ 0,-1,0,-0.3866,-0.5,-0.047937,
+ 0,-1,0,0.391859,-0.5,0.047937,
+ 0,-1,0,-0.3866,-0.5,0.047937,
+ 0.794299,-0.607527,0,0.448134,-0.426425,-0.047937,
+ 0.794299,-0.607527,0,0.391859,-0.5,0.047937,
+ 0.794299,-0.607527,0,0.391859,-0.5,-0.047937,
+ 0.794299,-0.607527,0,0.391859,-0.5,0.047937,
+ 0.794299,-0.607527,0,0.448134,-0.426425,-0.047937,
+ 0.794299,-0.607527,0,0.448134,-0.426425,0.047937,
+ 1,0,0,0.448134,0.061584,-0.047937,
+ 1,0,0,0.448134,-0.426425,0.047937,
+ 1,0,0,0.448134,-0.426425,-0.047937,
+ 1,0,0,0.448134,-0.426425,0.047937,
+ 1,0,0,0.448134,0.061584,-0.047937,
+ 1,0,0,0.448134,0.061584,0.047937,
+ -0.951883,0.306462,0,-0.3866,0.438467,0.047937,
+ -0.978441,0.206528,0,-0.448134,0.247342,-0.047937,
+ -0.994654,0.103264,0,-0.448134,0.247342,0.047937,
+ -0.978441,0.206528,0,-0.448134,0.247342,-0.047937,
+ -0.951883,0.306462,0,-0.3866,0.438467,0.047937,
+ -0.951883,0.306462,0,-0.3866,0.438467,-0.047937,
+ -0.994654,0.103264,0,-0.448134,0.247342,0.047937,
+ -1,0,0,-0.448134,0.184705,-0.047937,
+ -1,0,0,-0.448134,0.184705,0.047937,
+ -1,0,0,-0.448134,0.184705,-0.047937,
+ -0.994654,0.103264,0,-0.448134,0.247342,0.047937,
+ -0.978441,0.206528,0,-0.448134,0.247342,-0.047937,
+ -0.306512,0.951867,0,-0.3866,0.438467,0.047937,
+ -0.206563,0.978433,0,-0.195512,0.5,-0.047937,
+ -0.306512,0.951867,0,-0.3866,0.438467,-0.047937,
+ -0.206563,0.978433,0,-0.195512,0.5,-0.047937,
+ -0.306512,0.951867,0,-0.3866,0.438467,0.047937,
+ -0.103281,0.994652,0,-0.195512,0.5,0.047937,
+ 0.994378,0.105891,0,0.448134,0.247342,-0.047937,
+ 1,0,0,0.448134,0.184705,0.047937,
+ 1,0,0,0.448134,0.184705,-0.047937,
+ 1,0,0,0.448134,0.184705,0.047937,
+ 0.994378,0.105891,0,0.448134,0.247342,-0.047937,
+ 0.977317,0.211783,0,0.448134,0.247342,0.047937,
+ 0.949396,0.314082,0,0.384905,0.438467,-0.047937,
+ 0.977317,0.211783,0,0.448134,0.247342,0.047937,
+ 0.994378,0.105891,0,0.448134,0.247342,-0.047937,
+ 0.977317,0.211783,0,0.448134,0.247342,0.047937,
+ 0.949396,0.314082,0,0.384905,0.438467,-0.047937,
+ 0.949396,0.314082,0,0.384905,0.438467,0.047937,
+ 0,0,-1,-0.3866,0.438467,-0.047937,
+ 0,0,-1,-0.448134,0.184705,-0.047937,
+ 0,0,-1,-0.448134,0.247342,-0.047937,
+ 0,0,-1,-0.448134,0.184705,-0.047937,
+ 0,0,-1,-0.3866,0.438467,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,0.448134,0.247342,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.384905,0.438467,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.448134,0.247342,-0.047937,
+ 0,0,-1,0.448134,0.184705,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,-0.448134,-0.426425,-0.047937,
+ 0,0,-1,-0.448134,0.061584,-0.047937,
+ 0,0,-1,-0.448134,-0.426425,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,-0.3866,-0.5,-0.047937,
+ 0,0,-1,-0.3866,-0.5,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,-0.3866,0.438467,-0.047937,
+ 0,0,-1,-0.3866,-0.5,-0.047937,
+ 0,0,-1,-0.3866,0.438467,-0.047937,
+ 0,0,-1,-0.195512,0.5,-0.047937,
+ 0,0,-1,-0.3866,-0.5,-0.047937,
+ 0,0,-1,-0.195512,0.5,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,-0.195512,0.5,-0.047937,
+ 0,0,-1,0.193226,0.5,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.193226,0.5,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.193226,0.5,-0.047937,
+ 0,0,-1,0.384905,0.438467,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.448134,0.061584,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.448134,0.061584,-0.047937,
+ 0,0,-1,0.448134,-0.426425,-0.047937,
+ 0.205973,0.978558,0,0.193226,0.5,0.047937,
+ 0.305656,0.952142,0,0.384905,0.438467,-0.047937,
+ 0.102986,0.994683,0,0.193226,0.5,-0.047937,
+ 0.305656,0.952142,0,0.384905,0.438467,-0.047937,
+ 0.205973,0.978558,0,0.193226,0.5,0.047937,
+ 0.305656,0.952142,0,0.384905,0.438467,0.047937,
+ -0.103281,0.994652,0,-0.195512,0.5,0.047937,
+ 0.102986,0.994683,0,0.193226,0.5,-0.047937,
+ -0.206563,0.978433,0,-0.195512,0.5,-0.047937,
+ 0.102986,0.994683,0,0.193226,0.5,-0.047937,
+ -0.103281,0.994652,0,-0.195512,0.5,0.047937,
+ 0.205973,0.978558,0,0.193226,0.5,0.047937,
+ 0.691249,0.722617,0,0.384905,0.122068,0.047937,
+ 0.691249,0.722617,0,0.448134,0.061584,-0.047937,
+ 0.691249,0.722617,0,0.384905,0.122068,-0.047937,
+ 0.691249,0.722617,0,0.448134,0.061584,-0.047937,
+ 0.691249,0.722617,0,0.384905,0.122068,0.047937,
+ 0.691249,0.722617,0,0.448134,0.061584,0.047937,
+ -1,0,0,-0.448134,0.061584,0.047937,
+ -1,0,0,-0.448134,-0.426425,-0.047937,
+ -1,0,0,-0.448134,-0.426425,0.047937,
+ -1,0,0,-0.448134,-0.426425,-0.047937,
+ -1,0,0,-0.448134,0.061584,0.047937,
+ -1,0,0,-0.448134,0.061584,-0.047937,
+ -0.767086,-0.641544,0,-0.448134,-0.426425,0.047937,
+ -0.767086,-0.641544,0,-0.3866,-0.5,-0.047937,
+ -0.767086,-0.641544,0,-0.3866,-0.5,0.047937,
+ -0.767086,-0.641544,0,-0.3866,-0.5,-0.047937,
+ -0.767086,-0.641544,0,-0.448134,-0.426425,0.047937,
+ -0.767086,-0.641544,0,-0.448134,-0.426425,-0.047937,
+ 0.703773,-0.710425,0,0.448134,0.184705,0.047937,
+ 0.703773,-0.710425,0,0.384905,0.122068,-0.047937,
+ 0.703773,-0.710425,0,0.448134,0.184705,-0.047937,
+ 0.703773,-0.710425,0,0.384905,0.122068,-0.047937,
+ 0.703773,-0.710425,0,0.448134,0.184705,0.047937,
+ 0.703773,-0.710425,0,0.384905,0.122068,0.047937,
+ -0.746008,0.665937,0,-0.394142,0.122068,0.047937,
+ -0.746008,0.665937,0,-0.448134,0.061584,-0.047937,
+ -0.746008,0.665937,0,-0.448134,0.061584,0.047937,
+ -0.746008,0.665937,0,-0.448134,0.061584,-0.047937,
+ -0.746008,0.665937,0,-0.394142,0.122068,0.047937,
+ -0.746008,0.665937,0,-0.394142,0.122068,-0.047937,
+ -0.757441,-0.652904,0,-0.448134,0.184705,0.047937,
+ -0.757441,-0.652904,0,-0.394142,0.122068,-0.047937,
+ -0.757441,-0.652904,0,-0.394142,0.122068,0.047937,
+ -0.757441,-0.652904,0,-0.394142,0.122068,-0.047937,
+ -0.757441,-0.652904,0,-0.448134,0.184705,0.047937,
+ -0.757441,-0.652904,0,-0.448134,0.184705,-0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,-0.448134,0.061584,0.047937,
+ 0,0,1,-0.448134,-0.426425,0.047937,
+ 0,0,1,-0.448134,0.061584,0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.448134,0.247342,0.047937,
+ 0,0,1,-0.448134,0.184705,0.047937,
+ 0,0,1,-0.448134,0.247342,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.3866,0.438467,0.047937,
+ 0,0,1,-0.3866,0.438467,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,-0.3866,0.438467,0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,-0.3866,0.438467,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,-0.195512,0.5,0.047937,
+ 0,0,1,-0.195512,0.5,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.193226,0.5,0.047937,
+ 0,0,1,0.193226,0.5,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.193226,0.5,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.384905,0.438467,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.448134,0.061584,0.047937,
+ 0,0,1,0.448134,0.061584,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.448134,-0.426425,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.448134,0.247342,0.047937,
+ 0,0,1,0.384905,0.438467,0.047937,
+ 0,0,1,0.448134,0.247342,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.448134,0.184705,0.047937
+};
+static const struct gllist toast_frame = { GL_N3F_V3F, GL_TRIANGLES, 180, toast_data, 0 };
+const struct gllist *toast = &toast_frame;
diff --git a/hacks/glx/toast.dxf b/hacks/glx/toast.dxf
new file mode 100644
index 0000000..dbee027
--- /dev/null
+++ b/hacks/glx/toast.dxf
@@ -0,0 +1,1814 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+-37.623432
+12
+307.550490
+22
+-392.424732
+32
+-37.623432
+13
+307.550490
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+-303.422838
+22
+-392.424732
+32
+37.623432
+13
+-303.422838
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+-334.679514
+30
+-37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+307.550490
+22
+-392.424732
+32
+-37.623432
+13
+307.550490
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+37.623432
+11
+351.717412
+21
+-334.679514
+31
+-37.623432
+12
+351.717412
+22
+-334.679514
+32
+37.623432
+13
+351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+48.334405
+30
+-37.623432
+11
+351.717412
+21
+-334.679514
+31
+37.623432
+12
+351.717412
+22
+-334.679514
+32
+-37.623432
+13
+351.717412
+23
+-334.679514
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+-334.679514
+30
+37.623432
+11
+351.717412
+21
+48.334405
+31
+-37.623432
+12
+351.717412
+22
+48.334405
+32
+37.623432
+13
+351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+344.130963
+30
+37.623432
+11
+-351.717412
+21
+194.126040
+31
+-37.623432
+12
+-351.717412
+22
+194.126040
+32
+37.623432
+13
+-351.717412
+23
+194.126040
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+194.126040
+30
+-37.623432
+11
+-303.422838
+21
+344.130963
+31
+37.623432
+12
+-303.422838
+22
+344.130963
+32
+-37.623432
+13
+-303.422838
+23
+344.130963
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+194.126040
+30
+37.623432
+11
+-351.717412
+21
+144.965619
+31
+-37.623432
+12
+-351.717412
+22
+144.965619
+32
+37.623432
+13
+-351.717412
+23
+144.965619
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+144.965619
+30
+-37.623432
+11
+-351.717412
+21
+194.126040
+31
+37.623432
+12
+-351.717412
+22
+194.126040
+32
+-37.623432
+13
+-351.717412
+23
+194.126040
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+344.130963
+30
+37.623432
+11
+-153.447717
+21
+392.424732
+31
+-37.623432
+12
+-303.422838
+22
+344.130963
+32
+-37.623432
+13
+-303.422838
+23
+344.130963
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-153.447717
+20
+392.424732
+30
+-37.623432
+11
+-303.422838
+21
+344.130963
+31
+37.623432
+12
+-153.447717
+22
+392.424732
+32
+37.623432
+13
+-153.447717
+23
+392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+-37.623432
+11
+351.717412
+21
+144.965619
+31
+37.623432
+12
+351.717412
+22
+144.965619
+32
+-37.623432
+13
+351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+144.965619
+30
+37.623432
+11
+351.717412
+21
+194.126040
+31
+-37.623432
+12
+351.717412
+22
+194.126040
+32
+37.623432
+13
+351.717412
+23
+194.126040
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+344.130963
+30
+-37.623432
+11
+351.717412
+21
+194.126040
+31
+37.623432
+12
+351.717412
+22
+194.126040
+32
+-37.623432
+13
+351.717412
+23
+194.126040
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+37.623432
+11
+302.092403
+21
+344.130963
+31
+-37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+344.130963
+30
+-37.623432
+11
+-351.717412
+21
+144.965619
+31
+-37.623432
+12
+-351.717412
+22
+194.126040
+32
+-37.623432
+13
+-351.717412
+23
+194.126040
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+144.965619
+30
+-37.623432
+11
+-303.422838
+21
+344.130963
+31
+-37.623432
+12
+-309.341788
+22
+95.805228
+32
+-37.623432
+13
+-309.341788
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+-37.623432
+11
+302.092403
+21
+95.805228
+31
+-37.623432
+12
+302.092403
+22
+344.130963
+32
+-37.623432
+13
+302.092403
+23
+344.130963
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+-37.623432
+11
+351.717412
+21
+194.126040
+31
+-37.623432
+12
+351.717412
+22
+144.965619
+32
+-37.623432
+13
+351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+-37.623432
+11
+-351.717412
+21
+-334.679514
+31
+-37.623432
+12
+-351.717412
+22
+48.334405
+32
+-37.623432
+13
+-351.717412
+23
+48.334405
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+-334.679514
+30
+-37.623432
+11
+-309.341788
+21
+95.805228
+31
+-37.623432
+12
+-303.422838
+22
+-392.424732
+32
+-37.623432
+13
+-303.422838
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+-309.341788
+21
+95.805228
+31
+-37.623432
+12
+-303.422838
+22
+344.130963
+32
+-37.623432
+13
+-303.422838
+23
+344.130963
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+-303.422838
+21
+344.130963
+31
+-37.623432
+12
+-153.447717
+22
+392.424732
+32
+-37.623432
+13
+-153.447717
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+-153.447717
+21
+392.424732
+31
+-37.623432
+12
+307.550490
+22
+-392.424732
+32
+-37.623432
+13
+307.550490
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+-153.447717
+21
+392.424732
+31
+-37.623432
+12
+151.653573
+22
+392.424732
+32
+-37.623432
+13
+151.653573
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+151.653573
+21
+392.424732
+31
+-37.623432
+12
+302.092403
+22
+95.805228
+32
+-37.623432
+13
+302.092403
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+-37.623432
+11
+151.653573
+21
+392.424732
+31
+-37.623432
+12
+302.092403
+22
+344.130963
+32
+-37.623432
+13
+302.092403
+23
+344.130963
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+302.092403
+21
+95.805228
+31
+-37.623432
+12
+351.717412
+22
+48.334405
+32
+-37.623432
+13
+351.717412
+23
+48.334405
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+351.717412
+21
+48.334405
+31
+-37.623432
+12
+351.717412
+22
+-334.679514
+32
+-37.623432
+13
+351.717412
+23
+-334.679514
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+37.623432
+11
+302.092403
+21
+344.130963
+31
+-37.623432
+12
+151.653573
+22
+392.424732
+32
+-37.623432
+13
+151.653573
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+344.130963
+30
+-37.623432
+11
+151.653573
+21
+392.424732
+31
+37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-153.447717
+20
+392.424732
+30
+37.623432
+11
+151.653573
+21
+392.424732
+31
+-37.623432
+12
+-153.447717
+22
+392.424732
+32
+-37.623432
+13
+-153.447717
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+-37.623432
+11
+-153.447717
+21
+392.424732
+31
+37.623432
+12
+151.653573
+22
+392.424732
+32
+37.623432
+13
+151.653573
+23
+392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+37.623432
+11
+351.717412
+21
+48.334405
+31
+-37.623432
+12
+302.092403
+22
+95.805228
+32
+-37.623432
+13
+302.092403
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+48.334405
+30
+-37.623432
+11
+302.092403
+21
+95.805228
+31
+37.623432
+12
+351.717412
+22
+48.334405
+32
+37.623432
+13
+351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+48.334405
+30
+37.623432
+11
+-351.717412
+21
+-334.679514
+31
+-37.623432
+12
+-351.717412
+22
+-334.679514
+32
+37.623432
+13
+-351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+-334.679514
+30
+-37.623432
+11
+-351.717412
+21
+48.334405
+31
+37.623432
+12
+-351.717412
+22
+48.334405
+32
+-37.623432
+13
+-351.717412
+23
+48.334405
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+-334.679514
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+-37.623432
+12
+-303.422838
+22
+-392.424732
+32
+37.623432
+13
+-303.422838
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+-351.717412
+21
+-334.679514
+31
+37.623432
+12
+-351.717412
+22
+-334.679514
+32
+-37.623432
+13
+-351.717412
+23
+-334.679514
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+144.965619
+30
+37.623432
+11
+302.092403
+21
+95.805228
+31
+-37.623432
+12
+351.717412
+22
+144.965619
+32
+-37.623432
+13
+351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+-37.623432
+11
+351.717412
+21
+144.965619
+31
+37.623432
+12
+302.092403
+22
+95.805228
+32
+37.623432
+13
+302.092403
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+37.623432
+11
+-351.717412
+21
+48.334405
+31
+-37.623432
+12
+-351.717412
+22
+48.334405
+32
+37.623432
+13
+-351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+48.334405
+30
+-37.623432
+11
+-309.341788
+21
+95.805228
+31
+37.623432
+12
+-309.341788
+22
+95.805228
+32
+-37.623432
+13
+-309.341788
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+144.965619
+30
+37.623432
+11
+-309.341788
+21
+95.805228
+31
+-37.623432
+12
+-309.341788
+22
+95.805228
+32
+37.623432
+13
+-309.341788
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+-37.623432
+11
+-351.717412
+21
+144.965619
+31
+37.623432
+12
+-351.717412
+22
+144.965619
+32
+-37.623432
+13
+-351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+37.623432
+11
+-351.717412
+21
+48.334405
+31
+37.623432
+12
+-351.717412
+22
+-334.679514
+32
+37.623432
+13
+-351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+48.334405
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+37.623432
+12
+-309.341788
+22
+95.805228
+32
+37.623432
+13
+-309.341788
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+37.623432
+11
+-351.717412
+21
+194.126040
+31
+37.623432
+12
+-351.717412
+22
+144.965619
+32
+37.623432
+13
+-351.717412
+23
+144.965619
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+194.126040
+30
+37.623432
+11
+-309.341788
+21
+95.805228
+31
+37.623432
+12
+-303.422838
+22
+344.130963
+32
+37.623432
+13
+-303.422838
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+344.130963
+30
+37.623432
+11
+-309.341788
+21
+95.805228
+31
+37.623432
+12
+-303.422838
+22
+-392.424732
+32
+37.623432
+13
+-303.422838
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+344.130963
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+37.623432
+12
+307.550490
+22
+-392.424732
+32
+37.623432
+13
+307.550490
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+344.130963
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+-153.447717
+22
+392.424732
+32
+37.623432
+13
+-153.447717
+23
+392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-153.447717
+20
+392.424732
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+151.653573
+22
+392.424732
+32
+37.623432
+13
+151.653573
+23
+392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+302.092403
+22
+95.805228
+32
+37.623432
+13
+302.092403
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+37.623432
+11
+302.092403
+21
+95.805228
+31
+37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+351.717412
+22
+48.334405
+32
+37.623432
+13
+351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+48.334405
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+351.717412
+22
+-334.679514
+32
+37.623432
+13
+351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+37.623432
+11
+351.717412
+21
+194.126040
+31
+37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+37.623432
+11
+302.092403
+21
+95.805228
+31
+37.623432
+12
+351.717412
+22
+144.965619
+32
+37.623432
+13
+351.717412
+23
+144.965619
+33
+37.623432
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toast2.c b/hacks/glx/toast2.c
new file mode 100644
index 0000000..3d653ee
--- /dev/null
+++ b/hacks/glx/toast2.c
@@ -0,0 +1,214 @@
+/* Generated from "toast2.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toast2_data[] = {
+ -0.746008,0.665937,0,-0.394142,0.122068,0.047937,
+ -0.746008,0.665937,0,-0.448134,0.061584,-0.047937,
+ -0.746008,0.665937,0,-0.448134,0.061584,0.047937,
+ -0.746008,0.665937,0,-0.448134,0.061584,-0.047937,
+ -0.746008,0.665937,0,-0.394142,0.122068,0.047937,
+ -0.746008,0.665937,0,-0.394142,0.122068,-0.047937,
+ -0.757441,-0.652904,0,-0.448134,0.184705,0.047937,
+ -0.757441,-0.652904,0,-0.394142,0.122068,-0.047937,
+ -0.757441,-0.652904,0,-0.394142,0.122068,0.047937,
+ -0.757441,-0.652904,0,-0.394142,0.122068,-0.047937,
+ -0.757441,-0.652904,0,-0.448134,0.184705,0.047937,
+ -0.757441,-0.652904,0,-0.448134,0.184705,-0.047937,
+ 0,0,-1,0.448134,0.247342,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.384905,0.438467,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.448134,0.247342,-0.047937,
+ 0,0,-1,0.448134,0.184705,-0.047937,
+ 0,0,-1,-0.233894,0.20122,-0.047937,
+ 0,0,-1,-0.448134,0.184705,-0.047937,
+ 0,0,-1,-0.448134,0.247342,-0.047937,
+ 0,0,-1,-0.448134,0.184705,-0.047937,
+ 0,0,-1,-0.233894,0.20122,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,-0.233894,0.20122,-0.047937,
+ 0,0,-1,-0.3866,-0.5,-0.047937,
+ 0,0,-1,-0.3866,-0.5,-0.047937,
+ 0,0,-1,-0.233894,0.20122,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,-0.233894,0.20122,-0.047937,
+ 0,0,-1,-0.092355,0.236111,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,-0.092355,0.236111,-0.047937,
+ 0,0,-1,-0.001143,0.324361,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,-0.001143,0.324361,-0.047937,
+ 0,0,-1,0.039021,0.5,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.039021,0.5,-0.047937,
+ 0,0,-1,0.193226,0.5,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.193226,0.5,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.193226,0.5,-0.047937,
+ 0,0,-1,0.384905,0.438467,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.384905,0.122068,-0.047937,
+ 0,0,-1,0.448134,0.061584,-0.047937,
+ 0,0,-1,0.391859,-0.5,-0.047937,
+ 0,0,-1,0.448134,0.061584,-0.047937,
+ 0,0,-1,0.448134,-0.426425,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,-0.448134,-0.426425,-0.047937,
+ 0,0,-1,-0.448134,0.061584,-0.047937,
+ 0,0,-1,-0.448134,-0.426425,-0.047937,
+ 0,0,-1,-0.394142,0.122068,-0.047937,
+ 0,0,-1,-0.3866,-0.5,-0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,-0.448134,0.061584,0.047937,
+ 0,0,1,-0.448134,-0.426425,0.047937,
+ 0,0,1,-0.448134,0.061584,0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.448134,0.247342,0.047937,
+ 0,0,1,-0.448134,0.184705,0.047937,
+ 0,0,1,-0.448134,0.247342,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.233894,0.20122,0.047937,
+ 0,0,1,-0.233894,0.20122,0.047937,
+ 0,0,1,-0.394142,0.122068,0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,-0.233894,0.20122,0.047937,
+ 0,0,1,-0.3866,-0.5,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,-0.233894,0.20122,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,-0.092355,0.236111,0.047937,
+ 0,0,1,-0.092355,0.236111,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,-0.001143,0.324361,0.047937,
+ 0,0,1,-0.001143,0.324361,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.039021,0.5,0.047937,
+ 0,0,1,0.039021,0.5,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.193226,0.5,0.047937,
+ 0,0,1,0.193226,0.5,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.193226,0.5,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.384905,0.438467,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.448134,0.061584,0.047937,
+ 0,0,1,0.448134,0.061584,0.047937,
+ 0,0,1,0.391859,-0.5,0.047937,
+ 0,0,1,0.448134,-0.426425,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.448134,0.247342,0.047937,
+ 0,0,1,0.384905,0.438467,0.047937,
+ 0,0,1,0.448134,0.247342,0.047937,
+ 0,0,1,0.384905,0.122068,0.047937,
+ 0,0,1,0.448134,0.184705,0.047937,
+ 0.210457,0.977603,0,-0.448134,0.247342,0.047937,
+ 0.061931,0.99808,0,-0.233894,0.20122,-0.047937,
+ 0.210457,0.977603,0,-0.448134,0.247342,-0.047937,
+ 0.061931,0.99808,0,-0.233894,0.20122,-0.047937,
+ 0.210457,0.977603,0,-0.448134,0.247342,0.047937,
+ -0.091493,0.995806,0,-0.233894,0.20122,0.047937,
+ -0.974837,0.222918,0,0.039021,0.5,0.047937,
+ -0.974837,0.222918,0,-0.001143,0.324361,-0.047937,
+ -0.974837,0.222918,0,-0.001143,0.324361,0.047937,
+ -0.974837,0.222918,0,-0.001143,0.324361,-0.047937,
+ -0.974837,0.222918,0,0.039021,0.5,0.047937,
+ -0.974837,0.222918,0,0.039021,0.5,-0.047937,
+ -0.091493,0.995806,0,-0.233894,0.20122,0.047937,
+ -0.239346,0.970934,0,-0.092355,0.236111,-0.047937,
+ 0.061931,0.99808,0,-0.233894,0.20122,-0.047937,
+ -0.239346,0.970934,0,-0.092355,0.236111,-0.047937,
+ -0.091493,0.995806,0,-0.233894,0.20122,0.047937,
+ -0.239346,0.970934,0,-0.092355,0.236111,0.047937,
+ -0.695338,0.718683,0,-0.092355,0.236111,0.047937,
+ -0.695338,0.718683,0,-0.001143,0.324361,-0.047937,
+ -0.695338,0.718683,0,-0.092355,0.236111,-0.047937,
+ -0.695338,0.718683,0,-0.001143,0.324361,-0.047937,
+ -0.695338,0.718683,0,-0.092355,0.236111,0.047937,
+ -0.695338,0.718683,0,-0.001143,0.324361,0.047937,
+ -1,0,0,-0.448134,0.247342,0.047937,
+ -1,0,0,-0.448134,0.184705,-0.047937,
+ -1,0,0,-0.448134,0.184705,0.047937,
+ -1,0,0,-0.448134,0.184705,-0.047937,
+ -1,0,0,-0.448134,0.247342,0.047937,
+ -1,0,0,-0.448134,0.247342,-0.047937,
+ 0,1,0,0.039021,0.5,0.047937,
+ 0.102986,0.994683,0,0.193226,0.5,-0.047937,
+ 0,1,0,0.039021,0.5,-0.047937,
+ 0.102986,0.994683,0,0.193226,0.5,-0.047937,
+ 0,1,0,0.039021,0.5,0.047937,
+ 0.205973,0.978558,0,0.193226,0.5,0.047937,
+ 0.205973,0.978558,0,0.193226,0.5,0.047937,
+ 0.305656,0.952142,0,0.384905,0.438467,-0.047937,
+ 0.102986,0.994683,0,0.193226,0.5,-0.047937,
+ 0.305656,0.952142,0,0.384905,0.438467,-0.047937,
+ 0.205973,0.978558,0,0.193226,0.5,0.047937,
+ 0.305656,0.952142,0,0.384905,0.438467,0.047937,
+ 0.949396,0.314082,0,0.384905,0.438467,-0.047937,
+ 0.977317,0.211783,0,0.448134,0.247342,0.047937,
+ 0.994378,0.105891,0,0.448134,0.247342,-0.047937,
+ 0.977317,0.211783,0,0.448134,0.247342,0.047937,
+ 0.949396,0.314082,0,0.384905,0.438467,-0.047937,
+ 0.949396,0.314082,0,0.384905,0.438467,0.047937,
+ 0.994378,0.105891,0,0.448134,0.247342,-0.047937,
+ 1,0,0,0.448134,0.184705,0.047937,
+ 1,0,0,0.448134,0.184705,-0.047937,
+ 1,0,0,0.448134,0.184705,0.047937,
+ 0.994378,0.105891,0,0.448134,0.247342,-0.047937,
+ 0.977317,0.211783,0,0.448134,0.247342,0.047937,
+ 0.703773,-0.710425,0,0.448134,0.184705,0.047937,
+ 0.703773,-0.710425,0,0.384905,0.122068,-0.047937,
+ 0.703773,-0.710425,0,0.448134,0.184705,-0.047937,
+ 0.703773,-0.710425,0,0.384905,0.122068,-0.047937,
+ 0.703773,-0.710425,0,0.448134,0.184705,0.047937,
+ 0.703773,-0.710425,0,0.384905,0.122068,0.047937,
+ 0.691249,0.722617,0,0.384905,0.122068,0.047937,
+ 0.691249,0.722617,0,0.448134,0.061584,-0.047937,
+ 0.691249,0.722617,0,0.384905,0.122068,-0.047937,
+ 0.691249,0.722617,0,0.448134,0.061584,-0.047937,
+ 0.691249,0.722617,0,0.384905,0.122068,0.047937,
+ 0.691249,0.722617,0,0.448134,0.061584,0.047937,
+ 1,0,0,0.448134,0.061584,-0.047937,
+ 1,0,0,0.448134,-0.426425,0.047937,
+ 1,0,0,0.448134,-0.426425,-0.047937,
+ 1,0,0,0.448134,-0.426425,0.047937,
+ 1,0,0,0.448134,0.061584,-0.047937,
+ 1,0,0,0.448134,0.061584,0.047937,
+ 0.794299,-0.607527,0,0.448134,-0.426425,-0.047937,
+ 0.794299,-0.607527,0,0.391859,-0.5,0.047937,
+ 0.794299,-0.607527,0,0.391859,-0.5,-0.047937,
+ 0.794299,-0.607527,0,0.391859,-0.5,0.047937,
+ 0.794299,-0.607527,0,0.448134,-0.426425,-0.047937,
+ 0.794299,-0.607527,0,0.448134,-0.426425,0.047937,
+ 0,-1,0,0.391859,-0.5,0.047937,
+ 0,-1,0,-0.3866,-0.5,-0.047937,
+ 0,-1,0,0.391859,-0.5,-0.047937,
+ 0,-1,0,-0.3866,-0.5,-0.047937,
+ 0,-1,0,0.391859,-0.5,0.047937,
+ 0,-1,0,-0.3866,-0.5,0.047937,
+ -0.767086,-0.641544,0,-0.448134,-0.426425,0.047937,
+ -0.767086,-0.641544,0,-0.3866,-0.5,-0.047937,
+ -0.767086,-0.641544,0,-0.3866,-0.5,0.047937,
+ -0.767086,-0.641544,0,-0.3866,-0.5,-0.047937,
+ -0.767086,-0.641544,0,-0.448134,-0.426425,0.047937,
+ -0.767086,-0.641544,0,-0.448134,-0.426425,-0.047937,
+ -1,0,0,-0.448134,0.061584,0.047937,
+ -1,0,0,-0.448134,-0.426425,-0.047937,
+ -1,0,0,-0.448134,-0.426425,0.047937,
+ -1,0,0,-0.448134,-0.426425,-0.047937,
+ -1,0,0,-0.448134,0.061584,0.047937,
+ -1,0,0,-0.448134,0.061584,-0.047937
+};
+static const struct gllist toast2_frame = { GL_N3F_V3F, GL_TRIANGLES, 204, toast2_data, 0 };
+const struct gllist *toast2 = &toast2_frame;
diff --git a/hacks/glx/toast2.dxf b/hacks/glx/toast2.dxf
new file mode 100644
index 0000000..6cb545a
--- /dev/null
+++ b/hacks/glx/toast2.dxf
@@ -0,0 +1,2054 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+37.623432
+11
+-351.717412
+21
+48.334405
+31
+-37.623432
+12
+-351.717412
+22
+48.334405
+32
+37.623432
+13
+-351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+48.334405
+30
+-37.623432
+11
+-309.341788
+21
+95.805228
+31
+37.623432
+12
+-309.341788
+22
+95.805228
+32
+-37.623432
+13
+-309.341788
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+144.965619
+30
+37.623432
+11
+-309.341788
+21
+95.805228
+31
+-37.623432
+12
+-309.341788
+22
+95.805228
+32
+37.623432
+13
+-309.341788
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+-37.623432
+11
+-351.717412
+21
+144.965619
+31
+37.623432
+12
+-351.717412
+22
+144.965619
+32
+-37.623432
+13
+-351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+-37.623432
+11
+302.092403
+21
+95.805228
+31
+-37.623432
+12
+302.092403
+22
+344.130963
+32
+-37.623432
+13
+302.092403
+23
+344.130963
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+-37.623432
+11
+351.717412
+21
+194.126040
+31
+-37.623432
+12
+351.717412
+22
+144.965619
+32
+-37.623432
+13
+351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-183.571503
+20
+157.927796
+30
+-37.623432
+11
+-351.717412
+21
+144.965619
+31
+-37.623432
+12
+-351.717412
+22
+194.126040
+32
+-37.623432
+13
+-351.717412
+23
+194.126040
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+144.965619
+30
+-37.623432
+11
+-183.571503
+21
+157.927796
+31
+-37.623432
+12
+-309.341788
+22
+95.805228
+32
+-37.623432
+13
+-309.341788
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+-37.623432
+11
+-183.571503
+21
+157.927796
+31
+-37.623432
+12
+-303.422838
+22
+-392.424732
+32
+-37.623432
+13
+-303.422838
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+-183.571503
+21
+157.927796
+31
+-37.623432
+12
+307.550490
+22
+-392.424732
+32
+-37.623432
+13
+307.550490
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+-183.571503
+21
+157.927796
+31
+-37.623432
+12
+-72.484739
+22
+185.311958
+32
+-37.623432
+13
+-72.484739
+23
+185.311958
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+-72.484739
+21
+185.311958
+31
+-37.623432
+12
+-0.897070
+22
+254.574299
+32
+-37.623432
+13
+-0.897070
+23
+254.574299
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+-0.897070
+21
+254.574299
+31
+-37.623432
+12
+30.625457
+22
+392.424732
+32
+-37.623432
+13
+30.625457
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+30.625457
+21
+392.424732
+31
+-37.623432
+12
+151.653573
+22
+392.424732
+32
+-37.623432
+13
+151.653573
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+151.653573
+21
+392.424732
+31
+-37.623432
+12
+302.092403
+22
+95.805228
+32
+-37.623432
+13
+302.092403
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+-37.623432
+11
+151.653573
+21
+392.424732
+31
+-37.623432
+12
+302.092403
+22
+344.130963
+32
+-37.623432
+13
+302.092403
+23
+344.130963
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+302.092403
+21
+95.805228
+31
+-37.623432
+12
+351.717412
+22
+48.334405
+32
+-37.623432
+13
+351.717412
+23
+48.334405
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+-37.623432
+11
+351.717412
+21
+48.334405
+31
+-37.623432
+12
+351.717412
+22
+-334.679514
+32
+-37.623432
+13
+351.717412
+23
+-334.679514
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+-37.623432
+11
+-351.717412
+21
+-334.679514
+31
+-37.623432
+12
+-351.717412
+22
+48.334405
+32
+-37.623432
+13
+-351.717412
+23
+48.334405
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+-334.679514
+30
+-37.623432
+11
+-309.341788
+21
+95.805228
+31
+-37.623432
+12
+-303.422838
+22
+-392.424732
+32
+-37.623432
+13
+-303.422838
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+37.623432
+11
+-351.717412
+21
+48.334405
+31
+37.623432
+12
+-351.717412
+22
+-334.679514
+32
+37.623432
+13
+-351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+48.334405
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+37.623432
+12
+-309.341788
+22
+95.805228
+32
+37.623432
+13
+-309.341788
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-309.341788
+20
+95.805228
+30
+37.623432
+11
+-351.717412
+21
+194.126040
+31
+37.623432
+12
+-351.717412
+22
+144.965619
+32
+37.623432
+13
+-351.717412
+23
+144.965619
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+194.126040
+30
+37.623432
+11
+-309.341788
+21
+95.805228
+31
+37.623432
+12
+-183.571503
+22
+157.927796
+32
+37.623432
+13
+-183.571503
+23
+157.927796
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-183.571503
+20
+157.927796
+30
+37.623432
+11
+-309.341788
+21
+95.805228
+31
+37.623432
+12
+-303.422838
+22
+-392.424732
+32
+37.623432
+13
+-303.422838
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-183.571503
+20
+157.927796
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+37.623432
+12
+307.550490
+22
+-392.424732
+32
+37.623432
+13
+307.550490
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-183.571503
+20
+157.927796
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+-72.484739
+22
+185.311958
+32
+37.623432
+13
+-72.484739
+23
+185.311958
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-72.484739
+20
+185.311958
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+-0.897070
+22
+254.574299
+32
+37.623432
+13
+-0.897070
+23
+254.574299
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-0.897070
+20
+254.574299
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+30.625457
+22
+392.424732
+32
+37.623432
+13
+30.625457
+23
+392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+30.625457
+20
+392.424732
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+151.653573
+22
+392.424732
+32
+37.623432
+13
+151.653573
+23
+392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+302.092403
+22
+95.805228
+32
+37.623432
+13
+302.092403
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+37.623432
+11
+302.092403
+21
+95.805228
+31
+37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+351.717412
+22
+48.334405
+32
+37.623432
+13
+351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+48.334405
+30
+37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+351.717412
+22
+-334.679514
+32
+37.623432
+13
+351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+37.623432
+11
+351.717412
+21
+194.126040
+31
+37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+37.623432
+11
+302.092403
+21
+95.805228
+31
+37.623432
+12
+351.717412
+22
+144.965619
+32
+37.623432
+13
+351.717412
+23
+144.965619
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+194.126040
+30
+37.623432
+11
+-183.571503
+21
+157.927796
+31
+-37.623432
+12
+-351.717412
+22
+194.126040
+32
+-37.623432
+13
+-351.717412
+23
+194.126040
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-183.571503
+20
+157.927796
+30
+-37.623432
+11
+-351.717412
+21
+194.126040
+31
+37.623432
+12
+-183.571503
+22
+157.927796
+32
+37.623432
+13
+-183.571503
+23
+157.927796
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+30.625457
+20
+392.424732
+30
+37.623432
+11
+-0.897070
+21
+254.574299
+31
+-37.623432
+12
+-0.897070
+22
+254.574299
+32
+37.623432
+13
+-0.897070
+23
+254.574299
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-0.897070
+20
+254.574299
+30
+-37.623432
+11
+30.625457
+21
+392.424732
+31
+37.623432
+12
+30.625457
+22
+392.424732
+32
+-37.623432
+13
+30.625457
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-183.571503
+20
+157.927796
+30
+37.623432
+11
+-72.484739
+21
+185.311958
+31
+-37.623432
+12
+-183.571503
+22
+157.927796
+32
+-37.623432
+13
+-183.571503
+23
+157.927796
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-72.484739
+20
+185.311958
+30
+-37.623432
+11
+-183.571503
+21
+157.927796
+31
+37.623432
+12
+-72.484739
+22
+185.311958
+32
+37.623432
+13
+-72.484739
+23
+185.311958
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-72.484739
+20
+185.311958
+30
+37.623432
+11
+-0.897070
+21
+254.574299
+31
+-37.623432
+12
+-72.484739
+22
+185.311958
+32
+-37.623432
+13
+-72.484739
+23
+185.311958
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-0.897070
+20
+254.574299
+30
+-37.623432
+11
+-72.484739
+21
+185.311958
+31
+37.623432
+12
+-0.897070
+22
+254.574299
+32
+37.623432
+13
+-0.897070
+23
+254.574299
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+194.126040
+30
+37.623432
+11
+-351.717412
+21
+144.965619
+31
+-37.623432
+12
+-351.717412
+22
+144.965619
+32
+37.623432
+13
+-351.717412
+23
+144.965619
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+144.965619
+30
+-37.623432
+11
+-351.717412
+21
+194.126040
+31
+37.623432
+12
+-351.717412
+22
+194.126040
+32
+-37.623432
+13
+-351.717412
+23
+194.126040
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+30.625457
+20
+392.424732
+30
+37.623432
+11
+151.653573
+21
+392.424732
+31
+-37.623432
+12
+30.625457
+22
+392.424732
+32
+-37.623432
+13
+30.625457
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+-37.623432
+11
+30.625457
+21
+392.424732
+31
+37.623432
+12
+151.653573
+22
+392.424732
+32
+37.623432
+13
+151.653573
+23
+392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+151.653573
+20
+392.424732
+30
+37.623432
+11
+302.092403
+21
+344.130963
+31
+-37.623432
+12
+151.653573
+22
+392.424732
+32
+-37.623432
+13
+151.653573
+23
+392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+344.130963
+30
+-37.623432
+11
+151.653573
+21
+392.424732
+31
+37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+344.130963
+30
+-37.623432
+11
+351.717412
+21
+194.126040
+31
+37.623432
+12
+351.717412
+22
+194.126040
+32
+-37.623432
+13
+351.717412
+23
+194.126040
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+37.623432
+11
+302.092403
+21
+344.130963
+31
+-37.623432
+12
+302.092403
+22
+344.130963
+32
+37.623432
+13
+302.092403
+23
+344.130963
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+194.126040
+30
+-37.623432
+11
+351.717412
+21
+144.965619
+31
+37.623432
+12
+351.717412
+22
+144.965619
+32
+-37.623432
+13
+351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+144.965619
+30
+37.623432
+11
+351.717412
+21
+194.126040
+31
+-37.623432
+12
+351.717412
+22
+194.126040
+32
+37.623432
+13
+351.717412
+23
+194.126040
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+144.965619
+30
+37.623432
+11
+302.092403
+21
+95.805228
+31
+-37.623432
+12
+351.717412
+22
+144.965619
+32
+-37.623432
+13
+351.717412
+23
+144.965619
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+-37.623432
+11
+351.717412
+21
+144.965619
+31
+37.623432
+12
+302.092403
+22
+95.805228
+32
+37.623432
+13
+302.092403
+23
+95.805228
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+302.092403
+20
+95.805228
+30
+37.623432
+11
+351.717412
+21
+48.334405
+31
+-37.623432
+12
+302.092403
+22
+95.805228
+32
+-37.623432
+13
+302.092403
+23
+95.805228
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+48.334405
+30
+-37.623432
+11
+302.092403
+21
+95.805228
+31
+37.623432
+12
+351.717412
+22
+48.334405
+32
+37.623432
+13
+351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+48.334405
+30
+-37.623432
+11
+351.717412
+21
+-334.679514
+31
+37.623432
+12
+351.717412
+22
+-334.679514
+32
+-37.623432
+13
+351.717412
+23
+-334.679514
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+-334.679514
+30
+37.623432
+11
+351.717412
+21
+48.334405
+31
+-37.623432
+12
+351.717412
+22
+48.334405
+32
+37.623432
+13
+351.717412
+23
+48.334405
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+351.717412
+20
+-334.679514
+30
+-37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+307.550490
+22
+-392.424732
+32
+-37.623432
+13
+307.550490
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+37.623432
+11
+351.717412
+21
+-334.679514
+31
+-37.623432
+12
+351.717412
+22
+-334.679514
+32
+37.623432
+13
+351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+307.550490
+20
+-392.424732
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+-37.623432
+12
+307.550490
+22
+-392.424732
+32
+-37.623432
+13
+307.550490
+23
+-392.424732
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+307.550490
+21
+-392.424732
+31
+37.623432
+12
+-303.422838
+22
+-392.424732
+32
+37.623432
+13
+-303.422838
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+-334.679514
+30
+37.623432
+11
+-303.422838
+21
+-392.424732
+31
+-37.623432
+12
+-303.422838
+22
+-392.424732
+32
+37.623432
+13
+-303.422838
+23
+-392.424732
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-303.422838
+20
+-392.424732
+30
+-37.623432
+11
+-351.717412
+21
+-334.679514
+31
+37.623432
+12
+-351.717412
+22
+-334.679514
+32
+-37.623432
+13
+-351.717412
+23
+-334.679514
+33
+-37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+48.334405
+30
+37.623432
+11
+-351.717412
+21
+-334.679514
+31
+-37.623432
+12
+-351.717412
+22
+-334.679514
+32
+37.623432
+13
+-351.717412
+23
+-334.679514
+33
+37.623432
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-351.717412
+20
+-334.679514
+30
+-37.623432
+11
+-351.717412
+21
+48.334405
+31
+37.623432
+12
+-351.717412
+22
+48.334405
+32
+-37.623432
+13
+-351.717412
+23
+48.334405
+33
+-37.623432
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster.c b/hacks/glx/toaster.c
new file mode 100644
index 0000000..1feca5d
--- /dev/null
+++ b/hacks/glx/toaster.c
@@ -0,0 +1,376 @@
+/* Generated from "toaster.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_data[] = {
+ -0.316307,-0.948657,0,-0.283103,-0.467335,0.222248,
+ -0.101389,-0.994724,-0.015639,-0.234168,-0.483652,-0.380912,
+ -0.194699,-0.980863,0,-0.234168,-0.483652,0.222248,
+ -0.015849,0.992717,0.119421,-0.001224,0.5,0.222248,
+ -0.130021,0.991469,-0.009119,-0.234168,0.483652,-0.380912,
+ -0.197233,0.97209,0.127042,-0.234168,0.483652,0.222248,
+ -0.104394,-0.808168,0.579627,-0.17891,-0.455225,0.279296,
+ -0.132836,-0.912766,0.386282,-0.234168,-0.483652,0.222248,
+ -0.012111,-0.87373,0.486261,-0.001224,-0.5,0.222248,
+ -0.999999,0,-0.001399,-0.345926,0,-0.380912,
+ -0.974495,-0.224383,-0.003566,-0.299415,-0.418387,-0.380912,
+ -0.996185,-0.087205,0.003347,-0.331315,-0.208938,0.222248,
+ 0.996185,0.087205,0.003347,0.331315,0.208938,0.222248,
+ 0.996185,-0.087205,0.003347,0.331315,-0.208938,0.222248,
+ 0.999999,0,-0.001399,0.345926,0,-0.380912,
+ -0.000242,0.999959,-0.009047,-0.001224,0.5,0.222248,
+ 0.129779,0.991501,-0.009119,0.234168,0.483652,-0.380912,
+ -0.130021,0.991469,-0.009119,-0.234168,0.483652,-0.380912,
+ -0.154648,-0.973224,0.170058,-0.234168,-0.483652,0.222248,
+ -0.101389,-0.994724,-0.015639,-0.234168,-0.483652,-0.380912,
+ -0.010495,-0.997502,0.069855,-0.001224,-0.5,0.222248,
+ 0.967433,0.253065,0.005626,0.292931,0.437844,-0.141156,
+ 0.965122,0.261801,0,0.299415,0.418387,0.222248,
+ 0.979828,0.199828,-0.002375,0.299415,0.418387,-0.380912,
+ 0.965122,0.261801,0,0.299415,0.418387,0.222248,
+ 0.967433,0.253065,0.005626,0.292931,0.437844,-0.141156,
+ 0.977686,0.209863,0.009409,0.283103,0.467335,0.222248,
+ 0.977686,0.209863,0.009409,0.283103,0.467335,0.222248,
+ 0.967433,0.253065,0.005626,0.292931,0.437844,-0.141156,
+ 0.977686,0.209863,0.009409,0.288017,0.45259,0.040546,
+ 0.316307,0.948657,0,0.283103,0.467335,0.222248,
+ 0.316307,0.948657,0,0.283103,0.467335,-0.380912,
+ 0.235633,0.971842,0,0.234168,0.483652,0.222248,
+ 0.94871,0.316149,-0,0.283103,0.467335,-0.380912,
+ 0.967433,0.253065,0.005626,0.292931,0.437844,-0.141156,
+ 0.979828,0.199828,-0.002375,0.299415,0.418387,-0.380912,
+ 0.967433,0.253065,0.005626,0.292931,0.437844,-0.141156,
+ 0.94871,0.316149,-0,0.283103,0.467335,-0.380912,
+ 0.977686,0.209863,0.009409,0.288017,0.45259,0.040546,
+ 0.977686,0.209863,0.009409,0.288017,0.45259,0.040546,
+ 0.94871,0.316149,-0,0.283103,0.467335,-0.380912,
+ 0.977686,0.209863,0.009409,0.283103,0.467335,0.222248,
+ 0,0.227898,0.973685,0.054097,0.251982,0.357142,
+ 0,0.227898,0.973685,-0.054097,0.251982,0.357142,
+ 0,-0,1,0.05339,0,0.380912,
+ -0.743012,0.091749,0.66296,-0.257344,0.251982,0.320299,
+ -0.817604,0.124528,0.562153,-0.31207,0.335293,0.222248,
+ -0.809725,0.0624,0.583482,-0.331315,0.208938,0.222248,
+ -0.817604,0.124528,0.562153,-0.31207,0.335293,0.222248,
+ -0.743012,0.091749,0.66296,-0.257344,0.251982,0.320299,
+ -0.680969,0.208836,0.701903,-0.299415,0.418387,0.222248,
+ 0,0,1,-0.31207,0.335293,0.222248,
+ 0,0,1,-0.299415,0.418387,0.222248,
+ 0,0,1,-0.305628,0.377591,0.222248,
+ 0.490312,-0.197001,0.84899,0.257344,-0.251982,0.320299,
+ 0.439235,-0,0.898372,0.166895,0,0.380912,
+ 0.369417,-0.202622,0.906904,0.166895,-0.251982,0.357142,
+ 0.479243,0.170617,0.860939,0.257344,0.251982,0.320299,
+ 0.344013,0.237244,0.908499,0.166895,0.251982,0.357142,
+ 0.439235,-0,0.898372,0.166895,0,0.380912,
+ 0.806304,-0.04159,0.590037,0.331315,-0.208938,0.222248,
+ 0.743012,0.091749,0.66296,0.257344,0.251982,0.320299,
+ 0.726863,-0.090005,0.680859,0.257344,-0.251982,0.320299,
+ 0.743012,0.091749,0.66296,0.257344,0.251982,0.320299,
+ 0.806304,-0.04159,0.590037,0.331315,-0.208938,0.222248,
+ 0.809725,0.062401,0.583482,0.331315,0.208938,0.222248,
+ 0,-0,1,0.05339,0,0.380912,
+ 0,0.227898,0.973685,-0.054097,0.251982,0.357142,
+ 0,-0,1,-0.05339,0,0.380912,
+ -0.988599,0.150571,-0,-0.31207,0.335293,0.222248,
+ -0.979828,0.199828,-0.002375,-0.299415,0.418387,-0.380912,
+ -0.996185,0.087204,0.003347,-0.331315,0.208938,0.222248,
+ -0.979828,0.199828,-0.002375,-0.299415,0.418387,-0.380912,
+ -0.988599,0.150571,-0,-0.31207,0.335293,0.222248,
+ -0.988599,0.150572,-0,-0.305628,0.377591,0.222248,
+ -0.979828,0.199828,-0.002375,-0.299415,0.418387,-0.380912,
+ -0.988599,0.150572,-0,-0.305628,0.377591,0.222248,
+ -0.965122,0.261802,0,-0.299415,0.418387,0.222248,
+ -0.594501,-0.161247,0.787761,-0.257344,-0.251982,0.320299,
+ -0.757873,-0.17819,0.627596,-0.299415,-0.418387,0.222248,
+ -0.563931,-0.285379,0.774946,-0.283103,-0.467335,0.222248,
+ -0.191789,-0.715866,0.671382,-0.17891,-0.455225,0.279296,
+ -0.34735,-0.55882,0.753039,-0.283103,-0.467335,0.222248,
+ -0.156515,-0.815104,0.55777,-0.234168,-0.483652,0.222248,
+ -0.353973,-0.479978,0.802698,-0.17891,-0.455225,0.279296,
+ -0.490312,-0.197001,0.84899,-0.257344,-0.251982,0.320299,
+ -0.476561,-0.458788,0.749935,-0.283103,-0.467335,0.222248,
+ -0.965122,0.261802,0,-0.299415,0.418387,0.222248,
+ -0.94871,0.316149,0,-0.286127,0.45826,0.110422,
+ -0.979828,0.199828,-0.002375,-0.299415,0.418387,-0.380912,
+ -0.94871,0.316149,0,-0.286127,0.45826,0.110422,
+ -0.965122,0.261802,0,-0.299415,0.418387,0.222248,
+ -0.948709,0.316149,0,-0.283103,0.467335,0.222248,
+ 0.812952,-0.581784,0.025229,-0.286127,0.45826,0.110422,
+ 0.812952,-0.581784,0.025229,-0.283103,0.467335,0.222248,
+ 0.812952,-0.581784,0.025229,-0.285423,0.460375,0.136473,
+ -0.94871,0.316149,0,-0.286127,0.45826,0.110422,
+ -0.94871,0.316149,-0,-0.283103,0.467335,-0.380912,
+ -0.979828,0.199828,-0.002375,-0.299415,0.418387,-0.380912,
+ -0.94871,0.316149,-0,-0.283103,0.467335,-0.380912,
+ -0.94871,0.316149,0,-0.286127,0.45826,0.110422,
+ -0.94871,0.316149,-0,-0.285423,0.460375,0.136473,
+ -0.94871,0.316149,-0,-0.283103,0.467335,-0.380912,
+ -0.94871,0.316149,-0,-0.285423,0.460375,0.136473,
+ -0.948709,0.316149,0,-0.283103,0.467335,0.222248,
+ -0.38567,0.427053,0.817853,-0.231791,0.418387,0.27573,
+ -0.241461,0.701279,0.670749,-0.234168,0.483652,0.222248,
+ -0.205338,0.615841,0.760642,-0.283103,0.467335,0.222248,
+ 0,0.78664,0.617411,0.054097,0.455225,0.279296,
+ -0.000123,0.822299,0.569056,-0.001224,0.5,0.222248,
+ 0,0.78664,0.617411,-0.054097,0.455225,0.279296,
+ 0,-0.78664,0.617411,0.054097,-0.455225,0.279296,
+ 0,-0.78664,0.617411,-0.054097,-0.455225,0.279296,
+ -0.000123,-0.822299,0.569056,-0.001224,-0.5,0.222248,
+ 0,-0.664991,0.746852,-0.054097,-0.455225,0.279296,
+ 0,-0.593633,0.804736,0.054097,-0.455225,0.279296,
+ 0,-0.357681,0.933844,0,-0.455225,0.279296,
+ 0,-0.357681,0.933844,0,-0.455225,0.279296,
+ 0,-0.254425,0.967093,-0.054097,-0.251982,0.357142,
+ 0,-0.357681,0.933844,-0.054097,-0.455225,0.279296,
+ 0,-0.254425,0.967093,-0.054097,-0.251982,0.357142,
+ 0,-0.357681,0.933844,0,-0.455225,0.279296,
+ 0,-0.357681,0.933844,0.054097,-0.455225,0.279296,
+ -0.369417,-0.202622,0.906904,-0.166895,-0.251982,0.357142,
+ -0.490312,-0.197001,0.84899,-0.257344,-0.251982,0.320299,
+ -0.390635,-0.324541,0.861439,-0.17891,-0.455225,0.279296,
+ 0,0.78664,0.617411,-0.054097,0.455225,0.279296,
+ -0.000123,0.822299,0.569056,-0.001224,0.5,0.222248,
+ -0.171632,0.762512,0.623793,-0.17891,0.455225,0.279296,
+ -0.42641,0.391747,0.815297,-0.231791,0.418387,0.27573,
+ -0.680969,0.208836,0.701903,-0.299415,0.418387,0.222248,
+ -0.662215,0.119119,0.739785,-0.257344,0.251982,0.320299,
+ 0.476561,-0.458788,0.749935,0.283103,-0.467335,0.222248,
+ 0.490312,-0.197001,0.84899,0.257344,-0.251982,0.320299,
+ 0.353972,-0.479978,0.802698,0.17891,-0.455225,0.279296,
+ 0.979828,0.199828,-0.002375,0.299415,0.418387,-0.380912,
+ 0.988599,0.150572,0,0.318731,0.29156,0.222248,
+ 0.996185,0.087205,0.003347,0.331315,0.208938,0.222248,
+ 0.988599,0.150572,0,0.318731,0.29156,0.222248,
+ 0.979828,0.199828,-0.002375,0.299415,0.418387,-0.380912,
+ 0.988599,0.150571,0,0.310276,0.347076,0.222248,
+ 0.988599,0.150571,0,0.310276,0.347076,0.222248,
+ 0.979828,0.199828,-0.002375,0.299415,0.418387,-0.380912,
+ 0.965122,0.261801,0,0.299415,0.418387,0.222248,
+ -0.252774,0.582577,0.77247,-0.17891,0.455225,0.279296,
+ -0.323984,0.592558,0.737502,-0.234168,0.483652,0.222248,
+ -0.42641,0.391747,0.815297,-0.231791,0.418387,0.27573,
+ 0,-0.227898,0.973685,0.054097,-0.251982,0.357142,
+ 0,-0,1,0.05339,0,0.380912,
+ 0,-0.254425,0.967093,-0.054097,-0.251982,0.357142,
+ 0.979828,0.199828,-0.002375,0.299415,0.418387,-0.380912,
+ 0.996185,0.087205,0.003347,0.331315,0.208938,0.222248,
+ 0.999999,0,-0.001399,0.345926,0,-0.380912,
+ 0.141954,-0.989813,-0.010959,0.234168,-0.483652,-0.380912,
+ 0,-0.999633,-0.027095,0.008103,-0.487773,-0.228855,
+ -0.101389,-0.994724,-0.015639,-0.234168,-0.483652,-0.380912,
+ 0,-0.999633,-0.027095,0.008103,-0.487773,-0.228855,
+ 0.141954,-0.989813,-0.010959,0.234168,-0.483652,-0.380912,
+ 0.027733,-0.999483,-0.016268,0.054066,-0.49616,0.080576,
+ 0,-0.999633,-0.027095,0.008103,-0.487773,-0.228855,
+ 0.027733,-0.999483,-0.016268,0.054066,-0.49616,0.080576,
+ 0,-0.999633,-0.027095,0.008103,-0.49662,0.097563,
+ 0,-0.999633,-0.027095,0.008103,-0.49662,0.097563,
+ 0.027733,-0.999483,-0.016268,0.054066,-0.49616,0.080576,
+ -0.000145,-0.999868,-0.016274,-0.001224,-0.5,0.222248,
+ 0,-0.999633,-0.027095,0.008103,-0.49662,0.097563,
+ -0.000145,-0.999868,-0.016274,-0.001224,-0.5,0.222248,
+ -0,-0.999633,-0.027095,-0.017747,-0.49662,0.097563,
+ -0.101389,-0.994724,-0.015639,-0.234168,-0.483652,-0.380912,
+ -0,-0.999633,-0.027095,-0.017747,-0.49662,0.097563,
+ -0.000145,-0.999868,-0.016274,-0.001224,-0.5,0.222248,
+ -0,-0.999633,-0.027095,-0.017747,-0.49662,0.097563,
+ -0.101389,-0.994724,-0.015639,-0.234168,-0.483652,-0.380912,
+ 0,-0.999633,-0.027095,-0.017747,-0.487773,-0.228855,
+ 0,-0.999633,-0.027095,-0.017747,-0.487773,-0.228855,
+ -0.101389,-0.994724,-0.015639,-0.234168,-0.483652,-0.380912,
+ 0,-0.999633,-0.027095,0.008103,-0.487773,-0.228855,
+ -0.806304,-0.04159,0.590037,-0.331315,-0.208938,0.222248,
+ -0.757873,-0.17819,0.627596,-0.299415,-0.418387,0.222248,
+ -0.726863,-0.090005,0.680859,-0.257344,-0.251982,0.320299,
+ -0.104394,-0.808168,0.579627,-0.17891,-0.455225,0.279296,
+ -0.000123,-0.822299,0.569056,-0.001224,-0.5,0.222248,
+ 0,-0.78664,0.617411,-0.054097,-0.455225,0.279296,
+ 0,0.357681,0.933844,0.054097,0.455225,0.279296,
+ 0,0.357681,0.933844,-0.054097,0.455225,0.279296,
+ 0,0.227898,0.973685,-0.054097,0.251982,0.357142,
+ -0.344013,0.237244,0.908499,-0.166895,0.251982,0.357142,
+ -0.42641,0.391747,0.815297,-0.231791,0.418387,0.27573,
+ -0.479243,0.170617,0.860939,-0.257344,0.251982,0.320299,
+ -0.344013,0.237244,0.908499,-0.166895,0.251982,0.357142,
+ -0.368596,0.450419,0.813179,-0.17891,0.455225,0.279296,
+ -0.42641,0.391747,0.815297,-0.231791,0.418387,0.27573,
+ 0.132836,-0.983007,0.126693,0.234168,-0.483652,0.222248,
+ 0.027733,-0.999483,-0.016268,0.054066,-0.49616,0.080576,
+ 0.141954,-0.989813,-0.010959,0.234168,-0.483652,-0.380912,
+ 0.027733,-0.999483,-0.016268,0.054066,-0.49616,0.080576,
+ 0.132836,-0.983007,0.126693,0.234168,-0.483652,0.222248,
+ 0.010143,-0.997511,0.069776,-0.001224,-0.5,0.222248,
+ 0,0,-1,-0.299415,0.418387,-0.380912,
+ 0,0,-1,-0.299415,-0.418387,-0.380912,
+ 0,0,-1,-0.345926,0,-0.380912,
+ 0,0,-1,-0.299415,-0.418387,-0.380912,
+ 0,0,-1,-0.299415,0.418387,-0.380912,
+ 0,0,-1,-0.283103,0.467335,-0.380912,
+ 0,0,-1,-0.299415,-0.418387,-0.380912,
+ 0,0,-1,-0.283103,0.467335,-0.380912,
+ 0,0,-1,-0.283103,-0.467335,-0.380912,
+ 0,0,-1,-0.283103,-0.467335,-0.380912,
+ 0,0,-1,-0.283103,0.467335,-0.380912,
+ 0,0,-1,-0.234168,0.483652,-0.380912,
+ 0,0,-1,-0.283103,-0.467335,-0.380912,
+ 0,0,-1,-0.234168,0.483652,-0.380912,
+ 0,0,-1,-0.234168,-0.483652,-0.380912,
+ 0,0,-1,-0.234168,-0.483652,-0.380912,
+ 0,0,-1,-0.234168,0.483652,-0.380912,
+ 0,0,-1,0.234168,0.483652,-0.380912,
+ 0,0,-1,-0.234168,-0.483652,-0.380912,
+ 0,0,-1,0.234168,0.483652,-0.380912,
+ 0,0,-1,0.234168,-0.483652,-0.380912,
+ 0,0,-1,0.234168,-0.483652,-0.380912,
+ 0,0,-1,0.234168,0.483652,-0.380912,
+ 0,0,-1,0.283103,-0.467335,-0.380912,
+ 0,0,-1,0.283103,-0.467335,-0.380912,
+ 0,0,-1,0.234168,0.483652,-0.380912,
+ 0,0,-1,0.283103,0.467335,-0.380912,
+ 0,0,-1,0.283103,-0.467335,-0.380912,
+ 0,0,-1,0.283103,0.467335,-0.380912,
+ 0,0,-1,0.299415,-0.418387,-0.380912,
+ 0,0,-1,0.299415,-0.418387,-0.380912,
+ 0,0,-1,0.283103,0.467335,-0.380912,
+ 0,0,-1,0.299415,0.418387,-0.380912,
+ 0,0,-1,0.299415,-0.418387,-0.380912,
+ 0,0,-1,0.299415,0.418387,-0.380912,
+ 0,0,-1,0.345926,0,-0.380912,
+ -0.466133,0.34121,0.816269,-0.231791,0.418387,0.27573,
+ -0.60748,0.202437,0.768106,-0.283103,0.467335,0.222248,
+ -0.680969,0.208836,0.701903,-0.299415,0.418387,0.222248,
+ 0.490312,-0.197001,0.84899,0.257344,-0.251982,0.320299,
+ 0.369417,-0.202622,0.906904,0.166895,-0.251982,0.357142,
+ 0.390635,-0.324541,0.861439,0.17891,-0.455225,0.279296,
+ 0.191639,-0.715981,0.671301,0.17891,-0.455225,0.279296,
+ 0.156214,-0.815296,0.557574,0.234168,-0.483652,0.222248,
+ 0.34735,-0.55882,0.753039,0.283103,-0.467335,0.222248,
+ 0.594501,-0.161247,0.787761,0.257344,-0.251982,0.320299,
+ 0.563931,-0.285379,0.774946,0.283103,-0.467335,0.222248,
+ 0.757873,-0.17819,0.627596,0.299415,-0.418387,0.222248,
+ 0,0.357681,0.933844,0.054097,0.455225,0.279296,
+ 0,0.227898,0.973685,-0.054097,0.251982,0.357142,
+ 0,0.227898,0.973685,0.054097,0.251982,0.357142,
+ -0.974495,-0.224383,-0.003566,-0.299415,-0.418387,-0.380912,
+ -0.94871,-0.316149,0,-0.283103,-0.467335,0.222248,
+ -0.972186,-0.234211,0,-0.299415,-0.418387,0.222248,
+ -0.996185,-0.087205,0.003347,-0.331315,-0.208938,0.222248,
+ -0.974495,-0.224383,-0.003566,-0.299415,-0.418387,-0.380912,
+ -0.972186,-0.234211,0,-0.299415,-0.418387,0.222248,
+ 0,-0,1,0.05339,0,0.380912,
+ 0,-0,1,-0.05339,0,0.380912,
+ 0,-0.254425,0.967093,-0.054097,-0.251982,0.357142,
+ 0,-0.227898,0.973685,0.054097,-0.251982,0.357142,
+ 0,-0.254425,0.967093,-0.054097,-0.251982,0.357142,
+ 0,-0.357681,0.933844,0.054097,-0.455225,0.279296,
+ -0.235866,0.971786,0,-0.234168,0.483652,0.222248,
+ -0.316307,0.948657,0,-0.283103,0.467335,-0.380912,
+ -0.316307,0.948657,0,-0.283103,0.467335,0.222248,
+ 0.974495,-0.224383,-0.003566,0.299415,-0.418387,-0.380912,
+ 0.94871,-0.316149,0,0.283103,-0.467335,0.222248,
+ 0.94871,-0.316149,0,0.283103,-0.467335,-0.380912,
+ 0.196887,0.972176,0.126926,0.234168,0.483652,0.222248,
+ 0.129779,0.991501,-0.009119,0.234168,0.483652,-0.380912,
+ 0.015319,0.99274,0.119299,-0.001224,0.5,0.222248,
+ -0.030578,0.830318,0.55645,-0.17891,0.455225,0.279296,
+ -0.012111,0.87373,0.486261,-0.001224,0.5,0.222248,
+ -0.120094,0.886303,0.447263,-0.234168,0.483652,0.222248,
+ -0.235866,0.971786,0,-0.234168,0.483652,0.222248,
+ -0.130021,0.991469,-0.009119,-0.234168,0.483652,-0.380912,
+ -0.316307,0.948657,0,-0.283103,0.467335,-0.380912,
+ 0.323984,0.592558,0.737502,0.234168,0.483652,0.222248,
+ 0.252774,0.582577,0.77247,0.17891,0.455225,0.279296,
+ 0.42641,0.391747,0.815297,0.231791,0.418387,0.27573,
+ -0.974495,-0.224383,-0.003566,-0.299415,-0.418387,-0.380912,
+ -0.94871,-0.316149,0,-0.283103,-0.467335,-0.380912,
+ -0.94871,-0.316149,0,-0.283103,-0.467335,0.222248,
+ -0.316307,-0.948657,0,-0.283103,-0.467335,0.222248,
+ -0.316307,-0.948657,0,-0.283103,-0.467335,-0.380912,
+ -0.101389,-0.994724,-0.015639,-0.234168,-0.483652,-0.380912,
+ 0,-0.78664,0.617411,0.054097,-0.455225,0.279296,
+ -0.000123,-0.822299,0.569056,-0.001224,-0.5,0.222248,
+ 0.104191,-0.80829,0.579493,0.17891,-0.455225,0.279296,
+ 0.680969,0.208836,0.701903,0.299415,0.418387,0.222248,
+ 0.42641,0.391747,0.815297,0.231791,0.418387,0.27573,
+ 0.662215,0.119119,0.739785,0.257344,0.251982,0.320299,
+ 0.680969,0.208836,0.701903,0.299415,0.418387,0.222248,
+ 0.60748,0.202437,0.768106,0.283103,0.467335,0.222248,
+ 0.466133,0.34121,0.816269,0.231791,0.418387,0.27573,
+ 0.479243,0.170617,0.860939,0.257344,0.251982,0.320299,
+ 0.42641,0.391747,0.815297,0.231791,0.418387,0.27573,
+ 0.344013,0.237244,0.908499,0.166895,0.251982,0.357142,
+ 0.662215,0.119119,0.739785,0.257344,0.251982,0.320299,
+ 0.439235,-0,0.898372,0.166895,0,0.380912,
+ 0.594501,-0.161247,0.787761,0.257344,-0.251982,0.320299,
+ 0.999999,0,-0.001399,0.345926,0,-0.380912,
+ 0.996185,-0.087205,0.003347,0.331315,-0.208938,0.222248,
+ 0.974495,-0.224383,-0.003566,0.299415,-0.418387,-0.380912,
+ 0.42641,0.391747,0.815297,0.231791,0.418387,0.27573,
+ 0.368596,0.450419,0.813179,0.17891,0.455225,0.279296,
+ 0.344013,0.237244,0.908499,0.166895,0.251982,0.357142,
+ 0.972186,-0.234211,0,0.299415,-0.418387,0.222248,
+ 0.94871,-0.316149,0,0.283103,-0.467335,0.222248,
+ 0.974495,-0.224383,-0.003566,0.299415,-0.418387,-0.380912,
+ 0.104191,-0.80829,0.579493,0.17891,-0.455225,0.279296,
+ 0.011777,-0.873735,0.486259,-0.001224,-0.5,0.222248,
+ 0.117871,-0.949523,0.29071,0.234168,-0.483652,0.222248,
+ 0.806304,-0.04159,0.590037,0.331315,-0.208938,0.222248,
+ 0.726863,-0.090005,0.680859,0.257344,-0.251982,0.320299,
+ 0.757873,-0.17819,0.627596,0.299415,-0.418387,0.222248,
+ 0.17143,0.762655,0.623674,0.17891,0.455225,0.279296,
+ -0.000123,0.822299,0.569056,-0.001224,0.5,0.222248,
+ 0,0.78664,0.617411,0.054097,0.455225,0.279296,
+ 0.235633,0.971842,0,0.234168,0.483652,0.222248,
+ 0.316307,0.948657,0,0.283103,0.467335,-0.380912,
+ 0.129779,0.991501,-0.009119,0.234168,0.483652,-0.380912,
+ 0.817604,0.124528,0.562153,0.318731,0.29156,0.222248,
+ 0.743012,0.091749,0.66296,0.257344,0.251982,0.320299,
+ 0.809725,0.062401,0.583482,0.331315,0.208938,0.222248,
+ 0.743012,0.091749,0.66296,0.257344,0.251982,0.320299,
+ 0.817604,0.124528,0.562153,0.318731,0.29156,0.222248,
+ 0.680969,0.208836,0.701903,0.299415,0.418387,0.222248,
+ 0,0,-1,0.299415,0.418387,0.222248,
+ 0,0,-1,0.318731,0.29156,0.222248,
+ 0,0,-1,0.310276,0.347076,0.222248,
+ 0.152705,-0.988272,-0,0.234168,-0.483652,0.222248,
+ 0.141954,-0.989813,-0.010959,0.234168,-0.483652,-0.380912,
+ 0.316307,-0.948657,0,0.283103,-0.467335,0.222248,
+ 0.316307,-0.948657,0,0.283103,-0.467335,0.222248,
+ 0.141954,-0.989813,-0.010959,0.234168,-0.483652,-0.380912,
+ 0.316307,-0.948657,0,0.283103,-0.467335,-0.380912,
+ 0.996185,-0.087205,0.003347,0.331315,-0.208938,0.222248,
+ 0.972186,-0.234211,0,0.299415,-0.418387,0.222248,
+ 0.974495,-0.224383,-0.003566,0.299415,-0.418387,-0.380912,
+ 0.205338,0.615841,0.760642,0.283103,0.467335,0.222248,
+ 0.24127,0.701439,0.670651,0.234168,0.483652,0.222248,
+ 0.38567,0.427053,0.817853,0.231791,0.418387,0.27573,
+ -0.439235,-0,0.898372,-0.166895,0,0.380912,
+ -0.490312,-0.197001,0.84899,-0.257344,-0.251982,0.320299,
+ -0.369417,-0.202622,0.906904,-0.166895,-0.251982,0.357142,
+ -0.439235,-0,0.898372,-0.166895,0,0.380912,
+ -0.344013,0.237244,0.908499,-0.166895,0.251982,0.357142,
+ -0.479243,0.170617,0.860939,-0.257344,0.251982,0.320299,
+ 0.030271,0.830475,0.556232,0.17891,0.455225,0.279296,
+ 0.119619,0.886444,0.447112,0.234168,0.483652,0.222248,
+ 0.011777,0.873735,0.486259,-0.001224,0.5,0.222248,
+ -0.979828,0.199828,-0.002375,-0.299415,0.418387,-0.380912,
+ -0.999999,0,-0.001399,-0.345926,0,-0.380912,
+ -0.996185,0.087204,0.003347,-0.331315,0.208938,0.222248,
+ -0.439235,-0,0.898372,-0.166895,0,0.380912,
+ -0.662215,0.119119,0.739785,-0.257344,0.251982,0.320299,
+ -0.594501,-0.161247,0.787761,-0.257344,-0.251982,0.320299,
+ -0.996185,0.087204,0.003347,-0.331315,0.208938,0.222248,
+ -0.999999,0,-0.001399,-0.345926,0,-0.380912,
+ -0.996185,-0.087205,0.003347,-0.331315,-0.208938,0.222248,
+ -0.743012,0.091749,0.66296,-0.257344,0.251982,0.320299,
+ -0.806304,-0.04159,0.590037,-0.331315,-0.208938,0.222248,
+ -0.726863,-0.090005,0.680859,-0.257344,-0.251982,0.320299,
+ -0.806304,-0.04159,0.590037,-0.331315,-0.208938,0.222248,
+ -0.743012,0.091749,0.66296,-0.257344,0.251982,0.320299,
+ -0.809725,0.0624,0.583482,-0.331315,0.208938,0.222248
+};
+static const struct gllist toaster_frame = { GL_N3F_V3F, GL_TRIANGLES, 366, toaster_data, 0 };
+const struct gllist *toaster = &toaster_frame;
diff --git a/hacks/glx/toaster.dxf b/hacks/glx/toaster.dxf
new file mode 100644
index 0000000..c1cedfa
--- /dev/null
+++ b/hacks/glx/toaster.dxf
@@ -0,0 +1,3674 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-59.550893
+20
+-98.304297
+30
+46.749999
+11
+-49.257401
+21
+-101.736418
+31
+-80.124995
+12
+-49.257401
+22
+-101.736418
+32
+46.749999
+13
+-49.257401
+23
+-101.736418
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-0.257406
+20
+105.175312
+30
+46.749999
+11
+-49.257401
+21
+101.736418
+31
+-80.124995
+12
+-49.257401
+22
+101.736418
+32
+46.749999
+13
+-49.257401
+23
+101.736418
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-37.633746
+20
+-95.756860
+30
+58.749998
+11
+-49.257401
+21
+-101.736418
+31
+46.749999
+12
+-0.257406
+22
+-105.175312
+32
+46.749999
+13
+-0.257406
+23
+-105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-72.765693
+20
+0.000000
+30
+-80.124995
+11
+-62.982058
+21
+-88.007949
+31
+-80.124995
+12
+-69.692379
+22
+-43.950311
+32
+46.749999
+13
+-69.692379
+23
+-43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+69.692395
+20
+43.950311
+30
+46.749999
+11
+69.692395
+21
+-43.950311
+31
+46.749999
+12
+72.765693
+22
+0.000000
+32
+-80.124995
+13
+72.765693
+23
+0.000000
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-0.257406
+20
+105.175312
+30
+46.749999
+11
+49.257405
+21
+101.736418
+31
+-80.124995
+12
+-49.257401
+22
+101.736418
+32
+-80.124995
+13
+-49.257401
+23
+101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.257401
+20
+-101.736418
+30
+46.749999
+11
+-49.257401
+21
+-101.736418
+31
+-80.124995
+12
+-0.257406
+22
+-105.175312
+32
+46.749999
+13
+-0.257406
+23
+-105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+61.618173
+20
+92.100747
+30
+-29.692172
+11
+62.982058
+21
+88.007949
+31
+46.749999
+12
+62.982058
+22
+88.007949
+32
+-80.124995
+13
+62.982058
+23
+88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+88.007949
+30
+46.749999
+11
+61.618173
+21
+92.100747
+31
+-29.692172
+12
+59.550897
+22
+98.304297
+32
+46.749999
+13
+59.550897
+23
+98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+98.304297
+30
+46.749999
+11
+61.618173
+21
+92.100747
+31
+-29.692172
+12
+60.584535
+22
+95.202526
+32
+8.528915
+13
+60.584535
+23
+95.202526
+33
+8.528915
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+98.304297
+30
+46.749999
+11
+59.550897
+21
+98.304297
+31
+-80.124995
+12
+49.257405
+22
+101.736418
+32
+46.749999
+13
+49.257405
+23
+101.736418
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+98.304297
+30
+-80.124995
+11
+61.618173
+21
+92.100747
+31
+-29.692172
+12
+62.982058
+22
+88.007949
+32
+-80.124995
+13
+62.982058
+23
+88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+61.618173
+20
+92.100747
+30
+-29.692172
+11
+59.550897
+21
+98.304297
+31
+-80.124995
+12
+60.584535
+22
+95.202526
+32
+8.528915
+13
+60.584535
+23
+95.202526
+33
+8.528915
+0
+3DFACE
+8
+0
+ 62
+55
+10
+60.584535
+20
+95.202526
+30
+8.528915
+11
+59.550897
+21
+98.304297
+31
+-80.124995
+12
+59.550897
+22
+98.304297
+32
+46.749999
+13
+59.550897
+23
+98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+53.004574
+30
+75.124998
+11
+-11.379373
+21
+53.004574
+31
+75.124998
+12
+11.230625
+22
+0.000000
+32
+80.124995
+13
+11.230625
+23
+0.000000
+33
+80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-54.132399
+20
+53.004574
+30
+67.374997
+11
+-65.644221
+21
+70.529158
+31
+46.749999
+12
+-69.692379
+22
+43.950311
+32
+46.749999
+13
+-69.692379
+23
+43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-65.644221
+20
+70.529158
+30
+46.749999
+11
+-54.132399
+21
+53.004574
+31
+67.374997
+12
+-62.982058
+22
+88.007949
+32
+46.749999
+13
+-62.982058
+23
+88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-65.644221
+20
+70.529158
+30
+46.749999
+11
+-62.982058
+21
+88.007949
+31
+46.749999
+12
+-64.289076
+22
+79.426547
+32
+46.749999
+13
+-64.289076
+23
+79.426547
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+-53.004570
+30
+67.374997
+11
+35.106469
+21
+0.000000
+31
+80.124995
+12
+35.106469
+22
+-53.004570
+32
+75.124998
+13
+35.106469
+23
+-53.004570
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+53.004574
+30
+67.374997
+11
+35.106469
+21
+53.004574
+31
+75.124998
+12
+35.106469
+22
+0.000000
+32
+80.124995
+13
+35.106469
+23
+0.000000
+33
+80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+69.692395
+20
+-43.950311
+30
+46.749999
+11
+54.132404
+21
+53.004574
+31
+67.374997
+12
+54.132404
+22
+-53.004570
+32
+67.374997
+13
+54.132404
+23
+-53.004570
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+53.004574
+30
+67.374997
+11
+69.692395
+21
+-43.950311
+31
+46.749999
+12
+69.692395
+22
+43.950311
+32
+46.749999
+13
+69.692395
+23
+43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.230625
+20
+0.000000
+30
+80.124995
+11
+-11.379373
+21
+53.004574
+31
+75.124998
+12
+-11.230623
+22
+0.000000
+32
+80.124995
+13
+-11.230623
+23
+0.000000
+33
+80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-65.644221
+20
+70.529158
+30
+46.749999
+11
+-62.982058
+21
+88.007949
+31
+-80.124995
+12
+-69.692379
+22
+43.950311
+32
+46.749999
+13
+-69.692379
+23
+43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+88.007949
+30
+-80.124995
+11
+-65.644221
+21
+70.529158
+31
+46.749999
+12
+-64.289076
+22
+79.426547
+32
+46.749999
+13
+-64.289076
+23
+79.426547
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+88.007949
+30
+-80.124995
+11
+-64.289076
+21
+79.426547
+31
+46.749999
+12
+-62.982058
+22
+88.007949
+32
+46.749999
+13
+-62.982058
+23
+88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-54.132399
+20
+-53.004570
+30
+67.374997
+11
+-62.982058
+21
+-88.007949
+31
+46.749999
+12
+-59.550893
+22
+-98.304297
+32
+46.749999
+13
+-59.550893
+23
+-98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-37.633746
+20
+-95.756860
+30
+58.749998
+11
+-59.550893
+21
+-98.304297
+31
+46.749999
+12
+-49.257401
+22
+-101.736418
+32
+46.749999
+13
+-49.257401
+23
+-101.736418
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-37.633746
+20
+-95.756860
+30
+58.749998
+11
+-54.132399
+21
+-53.004570
+31
+67.374997
+12
+-59.550893
+22
+-98.304297
+32
+46.749999
+13
+-59.550893
+23
+-98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+88.007949
+30
+46.749999
+11
+-60.187034
+21
+96.395348
+31
+23.227255
+12
+-62.982058
+22
+88.007949
+32
+-80.124995
+13
+-62.982058
+23
+88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-60.187034
+20
+96.395348
+30
+23.227255
+11
+-62.982058
+21
+88.007949
+31
+46.749999
+12
+-59.550893
+22
+98.304297
+32
+46.749999
+13
+-59.550893
+23
+98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-60.187034
+20
+96.395348
+30
+23.227255
+11
+-59.550893
+21
+98.304297
+31
+46.749999
+12
+-60.038836
+22
+96.840066
+32
+28.707243
+13
+-60.038836
+23
+96.840066
+33
+28.707243
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-60.187034
+20
+96.395348
+30
+23.227255
+11
+-59.550893
+21
+98.304297
+31
+-80.124995
+12
+-62.982058
+22
+88.007949
+32
+-80.124995
+13
+-62.982058
+23
+88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-59.550893
+20
+98.304297
+30
+-80.124995
+11
+-60.187034
+21
+96.395348
+31
+23.227255
+12
+-60.038836
+22
+96.840066
+32
+28.707243
+13
+-60.038836
+23
+96.840066
+33
+28.707243
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-59.550893
+20
+98.304297
+30
+-80.124995
+11
+-60.038836
+21
+96.840066
+31
+28.707243
+12
+-59.550893
+22
+98.304297
+32
+46.749999
+13
+-59.550893
+23
+98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-48.757403
+20
+88.007949
+30
+57.999999
+11
+-49.257401
+21
+101.736418
+31
+46.749999
+12
+-59.550893
+22
+98.304297
+32
+46.749999
+13
+-59.550893
+23
+98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+95.756860
+30
+58.749998
+11
+-0.257406
+21
+105.175312
+31
+46.749999
+12
+-11.379373
+22
+95.756860
+32
+58.749998
+13
+-11.379373
+23
+95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+-95.756860
+30
+58.749998
+11
+-11.379373
+21
+-95.756860
+31
+58.749998
+12
+-0.257406
+22
+-105.175312
+32
+46.749999
+13
+-0.257406
+23
+-105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-11.379373
+20
+-95.756860
+30
+58.749998
+11
+11.379375
+21
+-95.756860
+31
+58.749998
+12
+0.000001
+22
+-95.756860
+32
+58.749998
+13
+0.000001
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+0.000001
+20
+-95.756860
+30
+58.749998
+11
+-11.379373
+21
+-53.004570
+31
+75.124998
+12
+-11.379373
+22
+-95.756860
+32
+58.749998
+13
+-11.379373
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-11.379373
+20
+-53.004570
+30
+75.124998
+11
+0.000001
+21
+-95.756860
+31
+58.749998
+12
+11.379375
+22
+-95.756860
+32
+58.749998
+13
+11.379375
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-35.106469
+20
+-53.004570
+30
+75.124998
+11
+-54.132399
+21
+-53.004570
+31
+67.374997
+12
+-37.633746
+22
+-95.756860
+32
+58.749998
+13
+-37.633746
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-11.379373
+20
+95.756860
+30
+58.749998
+11
+-0.257406
+21
+105.175312
+31
+46.749999
+12
+-37.633746
+22
+95.756860
+32
+58.749998
+13
+-37.633746
+23
+95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-48.757403
+20
+88.007949
+30
+57.999999
+11
+-62.982058
+21
+88.007949
+31
+46.749999
+12
+-54.132399
+22
+53.004574
+32
+67.374997
+13
+-54.132399
+23
+53.004574
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+-98.304297
+30
+46.749999
+11
+54.132404
+21
+-53.004570
+31
+67.374997
+12
+37.633750
+22
+-95.756860
+32
+58.749998
+13
+37.633750
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+88.007949
+30
+-80.124995
+11
+67.045331
+21
+61.329929
+31
+46.749999
+12
+69.692395
+22
+43.950311
+32
+46.749999
+13
+69.692395
+23
+43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+67.045331
+20
+61.329929
+30
+46.749999
+11
+62.982058
+21
+88.007949
+31
+-80.124995
+12
+65.266704
+22
+73.007757
+32
+46.749999
+13
+65.266704
+23
+73.007757
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+65.266704
+20
+73.007757
+30
+46.749999
+11
+62.982058
+21
+88.007949
+31
+-80.124995
+12
+62.982058
+22
+88.007949
+32
+46.749999
+13
+62.982058
+23
+88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-37.633746
+20
+95.756860
+30
+58.749998
+11
+-49.257401
+21
+101.736418
+31
+46.749999
+12
+-48.757403
+22
+88.007949
+32
+57.999999
+13
+-48.757403
+23
+88.007949
+33
+57.999999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+-53.004570
+30
+75.124998
+11
+11.230625
+21
+0.000000
+31
+80.124995
+12
+-11.379373
+22
+-53.004570
+32
+75.124998
+13
+-11.379373
+23
+-53.004570
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+88.007949
+30
+-80.124995
+11
+69.692395
+21
+43.950311
+31
+46.749999
+12
+72.765693
+22
+0.000000
+32
+-80.124995
+13
+72.765693
+23
+0.000000
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.257405
+20
+-101.736418
+30
+-80.124995
+11
+1.704490
+21
+-102.603365
+31
+-48.139738
+12
+-49.257401
+22
+-101.736418
+32
+-80.124995
+13
+-49.257401
+23
+-101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+1.704490
+20
+-102.603365
+30
+-48.139738
+11
+49.257405
+21
+-101.736418
+31
+-80.124995
+12
+11.372780
+22
+-104.367574
+32
+16.949225
+13
+11.372780
+23
+-104.367574
+33
+16.949225
+0
+3DFACE
+8
+0
+ 62
+55
+10
+1.704490
+20
+-102.603365
+30
+-48.139738
+11
+11.372780
+21
+-104.367574
+31
+16.949225
+12
+1.704490
+22
+-104.464430
+32
+20.522543
+13
+1.704490
+23
+-104.464430
+33
+20.522543
+0
+3DFACE
+8
+0
+ 62
+55
+10
+1.704490
+20
+-104.464430
+30
+20.522543
+11
+11.372780
+21
+-104.367574
+31
+16.949225
+12
+-0.257406
+22
+-105.175312
+32
+46.749999
+13
+-0.257406
+23
+-105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+1.704490
+20
+-104.464430
+30
+20.522543
+11
+-0.257406
+21
+-105.175312
+31
+46.749999
+12
+-3.733010
+22
+-104.464430
+32
+20.522543
+13
+-3.733010
+23
+-104.464430
+33
+20.522543
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.257401
+20
+-101.736418
+30
+-80.124995
+11
+-3.733010
+21
+-104.464430
+31
+20.522543
+12
+-0.257406
+22
+-105.175312
+32
+46.749999
+13
+-0.257406
+23
+-105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-3.733010
+20
+-104.464430
+30
+20.522543
+11
+-49.257401
+21
+-101.736418
+31
+-80.124995
+12
+-3.733010
+22
+-102.603365
+32
+-48.139738
+13
+-3.733010
+23
+-102.603365
+33
+-48.139738
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-3.733010
+20
+-102.603365
+30
+-48.139738
+11
+-49.257401
+21
+-101.736418
+31
+-80.124995
+12
+1.704490
+22
+-102.603365
+32
+-48.139738
+13
+1.704490
+23
+-102.603365
+33
+-48.139738
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-69.692379
+20
+-43.950311
+30
+46.749999
+11
+-62.982058
+21
+-88.007949
+31
+46.749999
+12
+-54.132399
+22
+-53.004570
+32
+67.374997
+13
+-54.132399
+23
+-53.004570
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-37.633746
+20
+-95.756860
+30
+58.749998
+11
+-0.257406
+21
+-105.175312
+31
+46.749999
+12
+-11.379373
+22
+-95.756860
+32
+58.749998
+13
+-11.379373
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+95.756860
+30
+58.749998
+11
+-11.379373
+21
+95.756860
+31
+58.749998
+12
+-11.379373
+22
+53.004574
+32
+75.124998
+13
+-11.379373
+23
+53.004574
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-35.106469
+20
+53.004574
+30
+75.124998
+11
+-48.757403
+21
+88.007949
+31
+57.999999
+12
+-54.132399
+22
+53.004574
+32
+67.374997
+13
+-54.132399
+23
+53.004574
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-35.106469
+20
+53.004574
+30
+75.124998
+11
+-37.633746
+21
+95.756860
+31
+58.749998
+12
+-48.757403
+22
+88.007949
+32
+57.999999
+13
+-48.757403
+23
+88.007949
+33
+57.999999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.257405
+20
+-101.736418
+30
+46.749999
+11
+11.372780
+21
+-104.367574
+31
+16.949225
+12
+49.257405
+22
+-101.736418
+32
+-80.124995
+13
+49.257405
+23
+-101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.372780
+20
+-104.367574
+30
+16.949225
+11
+49.257405
+21
+-101.736418
+31
+46.749999
+12
+-0.257406
+22
+-105.175312
+32
+46.749999
+13
+-0.257406
+23
+-105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+88.007949
+30
+-80.124995
+11
+-62.982058
+21
+-88.007949
+31
+-80.124995
+12
+-72.765693
+22
+0.000000
+32
+-80.124995
+13
+-72.765693
+23
+0.000000
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+-88.007949
+30
+-80.124995
+11
+-62.982058
+21
+88.007949
+31
+-80.124995
+12
+-59.550893
+22
+98.304297
+32
+-80.124995
+13
+-59.550893
+23
+98.304297
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+-88.007949
+30
+-80.124995
+11
+-59.550893
+21
+98.304297
+31
+-80.124995
+12
+-59.550893
+22
+-98.304297
+32
+-80.124995
+13
+-59.550893
+23
+-98.304297
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-59.550893
+20
+-98.304297
+30
+-80.124995
+11
+-59.550893
+21
+98.304297
+31
+-80.124995
+12
+-49.257401
+22
+101.736418
+32
+-80.124995
+13
+-49.257401
+23
+101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-59.550893
+20
+-98.304297
+30
+-80.124995
+11
+-49.257401
+21
+101.736418
+31
+-80.124995
+12
+-49.257401
+22
+-101.736418
+32
+-80.124995
+13
+-49.257401
+23
+-101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.257401
+20
+-101.736418
+30
+-80.124995
+11
+-49.257401
+21
+101.736418
+31
+-80.124995
+12
+49.257405
+22
+101.736418
+32
+-80.124995
+13
+49.257405
+23
+101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.257401
+20
+-101.736418
+30
+-80.124995
+11
+49.257405
+21
+101.736418
+31
+-80.124995
+12
+49.257405
+22
+-101.736418
+32
+-80.124995
+13
+49.257405
+23
+-101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.257405
+20
+-101.736418
+30
+-80.124995
+11
+49.257405
+21
+101.736418
+31
+-80.124995
+12
+59.550897
+22
+-98.304297
+32
+-80.124995
+13
+59.550897
+23
+-98.304297
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+-98.304297
+30
+-80.124995
+11
+49.257405
+21
+101.736418
+31
+-80.124995
+12
+59.550897
+22
+98.304297
+32
+-80.124995
+13
+59.550897
+23
+98.304297
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+-98.304297
+30
+-80.124995
+11
+59.550897
+21
+98.304297
+31
+-80.124995
+12
+62.982058
+22
+-88.007949
+32
+-80.124995
+13
+62.982058
+23
+-88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+-88.007949
+30
+-80.124995
+11
+59.550897
+21
+98.304297
+31
+-80.124995
+12
+62.982058
+22
+88.007949
+32
+-80.124995
+13
+62.982058
+23
+88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+-88.007949
+30
+-80.124995
+11
+62.982058
+21
+88.007949
+31
+-80.124995
+12
+72.765693
+22
+0.000000
+32
+-80.124995
+13
+72.765693
+23
+0.000000
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-48.757403
+20
+88.007949
+30
+57.999999
+11
+-59.550893
+21
+98.304297
+31
+46.749999
+12
+-62.982058
+22
+88.007949
+32
+46.749999
+13
+-62.982058
+23
+88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+-53.004570
+30
+67.374997
+11
+35.106469
+21
+-53.004570
+31
+75.124998
+12
+37.633750
+22
+-95.756860
+32
+58.749998
+13
+37.633750
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+37.633750
+20
+-95.756860
+30
+58.749998
+11
+49.257405
+21
+-101.736418
+31
+46.749999
+12
+59.550897
+22
+-98.304297
+32
+46.749999
+13
+59.550897
+23
+-98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+-53.004570
+30
+67.374997
+11
+59.550897
+21
+-98.304297
+31
+46.749999
+12
+62.982058
+22
+-88.007949
+32
+46.749999
+13
+62.982058
+23
+-88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+95.756860
+30
+58.749998
+11
+-11.379373
+21
+53.004574
+31
+75.124998
+12
+11.379375
+22
+53.004574
+32
+75.124998
+13
+11.379375
+23
+53.004574
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+-88.007949
+30
+-80.124995
+11
+-59.550893
+21
+-98.304297
+31
+46.749999
+12
+-62.982058
+22
+-88.007949
+32
+46.749999
+13
+-62.982058
+23
+-88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-69.692379
+20
+-43.950311
+30
+46.749999
+11
+-62.982058
+21
+-88.007949
+31
+-80.124995
+12
+-62.982058
+22
+-88.007949
+32
+46.749999
+13
+-62.982058
+23
+-88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.230625
+20
+0.000000
+30
+80.124995
+11
+-11.230623
+21
+0.000000
+31
+80.124995
+12
+-11.379373
+22
+-53.004570
+32
+75.124998
+13
+-11.379373
+23
+-53.004570
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+-53.004570
+30
+75.124998
+11
+-11.379373
+21
+-53.004570
+31
+75.124998
+12
+11.379375
+22
+-95.756860
+32
+58.749998
+13
+11.379375
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.257401
+20
+101.736418
+30
+46.749999
+11
+-59.550893
+21
+98.304297
+31
+-80.124995
+12
+-59.550893
+22
+98.304297
+32
+46.749999
+13
+-59.550893
+23
+98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+-88.007949
+30
+-80.124995
+11
+59.550897
+21
+-98.304297
+31
+46.749999
+12
+59.550897
+22
+-98.304297
+32
+-80.124995
+13
+59.550897
+23
+-98.304297
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.257405
+20
+101.736418
+30
+46.749999
+11
+49.257405
+21
+101.736418
+31
+-80.124995
+12
+-0.257406
+22
+105.175312
+32
+46.749999
+13
+-0.257406
+23
+105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-37.633746
+20
+95.756860
+30
+58.749998
+11
+-0.257406
+21
+105.175312
+31
+46.749999
+12
+-49.257401
+22
+101.736418
+32
+46.749999
+13
+-49.257401
+23
+101.736418
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.257401
+20
+101.736418
+30
+46.749999
+11
+-49.257401
+21
+101.736418
+31
+-80.124995
+12
+-59.550893
+22
+98.304297
+32
+-80.124995
+13
+-59.550893
+23
+98.304297
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.257405
+20
+101.736418
+30
+46.749999
+11
+37.633750
+21
+95.756860
+31
+58.749998
+12
+48.757407
+22
+88.007949
+32
+57.999999
+13
+48.757407
+23
+88.007949
+33
+57.999999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+-88.007949
+30
+-80.124995
+11
+-59.550893
+21
+-98.304297
+31
+-80.124995
+12
+-59.550893
+22
+-98.304297
+32
+46.749999
+13
+-59.550893
+23
+-98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-59.550893
+20
+-98.304297
+30
+46.749999
+11
+-59.550893
+21
+-98.304297
+31
+-80.124995
+12
+-49.257401
+22
+-101.736418
+32
+-80.124995
+13
+-49.257401
+23
+-101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+11.379375
+20
+-95.756860
+30
+58.749998
+11
+-0.257406
+21
+-105.175312
+31
+46.749999
+12
+37.633750
+22
+-95.756860
+32
+58.749998
+13
+37.633750
+23
+-95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+88.007949
+30
+46.749999
+11
+48.757407
+21
+88.007949
+31
+57.999999
+12
+54.132404
+22
+53.004574
+32
+67.374997
+13
+54.132404
+23
+53.004574
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+88.007949
+30
+46.749999
+11
+59.550897
+21
+98.304297
+31
+46.749999
+12
+48.757407
+22
+88.007949
+32
+57.999999
+13
+48.757407
+23
+88.007949
+33
+57.999999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+53.004574
+30
+67.374997
+11
+48.757407
+21
+88.007949
+31
+57.999999
+12
+35.106469
+22
+53.004574
+32
+75.124998
+13
+35.106469
+23
+53.004574
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+53.004574
+30
+67.374997
+11
+35.106469
+21
+0.000000
+31
+80.124995
+12
+54.132404
+22
+-53.004570
+32
+67.374997
+13
+54.132404
+23
+-53.004570
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+72.765693
+20
+0.000000
+30
+-80.124995
+11
+69.692395
+21
+-43.950311
+31
+46.749999
+12
+62.982058
+22
+-88.007949
+32
+-80.124995
+13
+62.982058
+23
+-88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+48.757407
+20
+88.007949
+30
+57.999999
+11
+37.633750
+21
+95.756860
+31
+58.749998
+12
+35.106469
+22
+53.004574
+32
+75.124998
+13
+35.106469
+23
+53.004574
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+-88.007949
+30
+46.749999
+11
+59.550897
+21
+-98.304297
+31
+46.749999
+12
+62.982058
+22
+-88.007949
+32
+-80.124995
+13
+62.982058
+23
+-88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+37.633750
+20
+-95.756860
+30
+58.749998
+11
+-0.257406
+21
+-105.175312
+31
+46.749999
+12
+49.257405
+22
+-101.736418
+32
+46.749999
+13
+49.257405
+23
+-101.736418
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+69.692395
+20
+-43.950311
+30
+46.749999
+11
+54.132404
+21
+-53.004570
+31
+67.374997
+12
+62.982058
+22
+-88.007949
+32
+46.749999
+13
+62.982058
+23
+-88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+37.633750
+20
+95.756860
+30
+58.749998
+11
+-0.257406
+21
+105.175312
+31
+46.749999
+12
+11.379375
+22
+95.756860
+32
+58.749998
+13
+11.379375
+23
+95.756860
+33
+58.749998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.257405
+20
+101.736418
+30
+46.749999
+11
+59.550897
+21
+98.304297
+31
+-80.124995
+12
+49.257405
+22
+101.736418
+32
+-80.124995
+13
+49.257405
+23
+101.736418
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+67.045331
+20
+61.329929
+30
+46.749999
+11
+54.132404
+21
+53.004574
+31
+67.374997
+12
+69.692395
+22
+43.950311
+32
+46.749999
+13
+69.692395
+23
+43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+54.132404
+20
+53.004574
+30
+67.374997
+11
+67.045331
+21
+61.329929
+31
+46.749999
+12
+62.982058
+22
+88.007949
+32
+46.749999
+13
+62.982058
+23
+88.007949
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+62.982058
+20
+88.007949
+30
+46.749999
+11
+67.045331
+21
+61.329929
+31
+46.749999
+12
+65.266704
+22
+73.007757
+32
+46.749999
+13
+65.266704
+23
+73.007757
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.257405
+20
+-101.736418
+30
+46.749999
+11
+49.257405
+21
+-101.736418
+31
+-80.124995
+12
+59.550897
+22
+-98.304297
+32
+46.749999
+13
+59.550897
+23
+-98.304297
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+-98.304297
+30
+46.749999
+11
+49.257405
+21
+-101.736418
+31
+-80.124995
+12
+59.550897
+22
+-98.304297
+32
+-80.124995
+13
+59.550897
+23
+-98.304297
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+69.692395
+20
+-43.950311
+30
+46.749999
+11
+62.982058
+21
+-88.007949
+31
+46.749999
+12
+62.982058
+22
+-88.007949
+32
+-80.124995
+13
+62.982058
+23
+-88.007949
+33
+-80.124995
+0
+3DFACE
+8
+0
+ 62
+55
+10
+59.550897
+20
+98.304297
+30
+46.749999
+11
+49.257405
+21
+101.736418
+31
+46.749999
+12
+48.757407
+22
+88.007949
+32
+57.999999
+13
+48.757407
+23
+88.007949
+33
+57.999999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-35.106469
+20
+0.000000
+30
+80.124995
+11
+-54.132399
+21
+-53.004570
+31
+67.374997
+12
+-35.106469
+22
+-53.004570
+32
+75.124998
+13
+-35.106469
+23
+-53.004570
+33
+75.124998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-35.106469
+20
+0.000000
+30
+80.124995
+11
+-35.106469
+21
+53.004574
+31
+75.124998
+12
+-54.132399
+22
+53.004574
+32
+67.374997
+13
+-54.132399
+23
+53.004574
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+37.633750
+20
+95.756860
+30
+58.749998
+11
+49.257405
+21
+101.736418
+31
+46.749999
+12
+-0.257406
+22
+105.175312
+32
+46.749999
+13
+-0.257406
+23
+105.175312
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-62.982058
+20
+88.007949
+30
+-80.124995
+11
+-72.765693
+21
+0.000000
+31
+-80.124995
+12
+-69.692379
+22
+43.950311
+32
+46.749999
+13
+-69.692379
+23
+43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-35.106469
+20
+0.000000
+30
+80.124995
+11
+-54.132399
+21
+53.004574
+31
+67.374997
+12
+-54.132399
+22
+-53.004570
+32
+67.374997
+13
+-54.132399
+23
+-53.004570
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-69.692379
+20
+43.950311
+30
+46.749999
+11
+-72.765693
+21
+0.000000
+31
+-80.124995
+12
+-69.692379
+22
+-43.950311
+32
+46.749999
+13
+-69.692379
+23
+-43.950311
+33
+46.749999
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-54.132399
+20
+53.004574
+30
+67.374997
+11
+-69.692379
+21
+-43.950311
+31
+46.749999
+12
+-54.132399
+22
+-53.004570
+32
+67.374997
+13
+-54.132399
+23
+-53.004570
+33
+67.374997
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-69.692379
+20
+-43.950311
+30
+46.749999
+11
+-54.132399
+21
+53.004574
+31
+67.374997
+12
+-69.692379
+22
+43.950311
+32
+46.749999
+13
+-69.692379
+23
+43.950311
+33
+46.749999
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster_base.c b/hacks/glx/toaster_base.c
new file mode 100644
index 0000000..a444ad5
--- /dev/null
+++ b/hacks/glx/toaster_base.c
@@ -0,0 +1,130 @@
+/* Generated from "toaster_base.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_base_data[] = {
+ -0.10666,0.994296,0,-0.242083,0.5,0.052679,
+ 0.10666,0.994296,0,0.242083,0.5,-0.052679,
+ -0.21332,0.976982,0,-0.242083,0.5,-0.052679,
+ 0.10666,0.994296,0,0.242083,0.5,-0.052679,
+ -0.10666,0.994296,0,-0.242083,0.5,0.052679,
+ 0.213319,0.976983,0,0.242083,0.5,0.052679,
+ 0.983679,0.17993,0,0.309535,0.432529,-0.052679,
+ 0.999314,0.03703,0,0.357619,0,0.052679,
+ 0.999314,-0.03703,0,0.357619,0,-0.052679,
+ 0.999314,0.03703,0,0.357619,0,0.052679,
+ 0.983679,0.17993,0,0.309535,0.432529,-0.052679,
+ 0.968549,0.248824,0,0.309535,0.432529,0.052679,
+ 0.10666,-0.994296,0,0.242083,-0.5,0.052679,
+ -0.10666,-0.994296,0,-0.242083,-0.5,-0.052679,
+ 0.213319,-0.976983,0,0.242083,-0.5,-0.052679,
+ -0.10666,-0.994296,0,-0.242083,-0.5,-0.052679,
+ 0.10666,-0.994296,0,0.242083,-0.5,0.052679,
+ -0.21332,-0.976982,0,-0.242083,-0.5,0.052679,
+ -0.983679,0.17993,0,-0.309535,0.432529,0.052679,
+ -0.999314,0.03703,0,-0.357619,0,-0.052679,
+ -0.999314,-0.03703,0,-0.357619,0,0.052679,
+ -0.999314,0.03703,0,-0.357619,0,-0.052679,
+ -0.983679,0.17993,0,-0.309535,0.432529,0.052679,
+ -0.968549,0.248824,0,-0.309535,0.432529,-0.052679,
+ 0,0,-1,-0.309535,0.432529,-0.052679,
+ 0,0,-1,-0.309535,-0.432529,-0.052679,
+ 0,0,-1,-0.357619,0,-0.052679,
+ 0,0,-1,-0.309535,-0.432529,-0.052679,
+ 0,0,-1,-0.309535,0.432529,-0.052679,
+ 0,0,-1,-0.292672,0.483132,-0.052679,
+ 0,0,-1,-0.309535,-0.432529,-0.052679,
+ 0,0,-1,-0.292672,0.483132,-0.052679,
+ 0,0,-1,-0.292672,-0.483132,-0.052679,
+ 0,0,-1,-0.292672,-0.483132,-0.052679,
+ 0,0,-1,-0.292672,0.483132,-0.052679,
+ 0,0,-1,-0.242083,0.5,-0.052679,
+ 0,0,-1,-0.292672,-0.483132,-0.052679,
+ 0,0,-1,-0.242083,0.5,-0.052679,
+ 0,0,-1,-0.242083,-0.5,-0.052679,
+ 0,0,-1,-0.242083,-0.5,-0.052679,
+ 0,0,-1,-0.242083,0.5,-0.052679,
+ 0,0,-1,0.242083,0.5,-0.052679,
+ 0,0,-1,-0.242083,-0.5,-0.052679,
+ 0,0,-1,0.242083,0.5,-0.052679,
+ 0,0,-1,0.242083,-0.5,-0.052679,
+ 0,0,-1,0.242083,-0.5,-0.052679,
+ 0,0,-1,0.242083,0.5,-0.052679,
+ 0,0,-1,0.292672,-0.483132,-0.052679,
+ 0,0,-1,0.292672,-0.483132,-0.052679,
+ 0,0,-1,0.242083,0.5,-0.052679,
+ 0,0,-1,0.292672,0.483132,-0.052679,
+ 0,0,-1,0.292672,-0.483132,-0.052679,
+ 0,0,-1,0.292672,0.483132,-0.052679,
+ 0,0,-1,0.309535,-0.432529,-0.052679,
+ 0,0,-1,0.309535,-0.432529,-0.052679,
+ 0,0,-1,0.292672,0.483132,-0.052679,
+ 0,0,-1,0.309535,0.432529,-0.052679,
+ 0,0,-1,0.309535,-0.432529,-0.052679,
+ 0,0,-1,0.309535,0.432529,-0.052679,
+ 0,0,-1,0.357619,0,-0.052679,
+ 0.999314,-0.03703,0,0.357619,0,-0.052679,
+ 0.983679,-0.17993,0,0.309535,-0.432529,0.052679,
+ 0.968549,-0.248824,0,0.309535,-0.432529,-0.052679,
+ 0.983679,-0.17993,0,0.309535,-0.432529,0.052679,
+ 0.999314,-0.03703,0,0.357619,0,-0.052679,
+ 0.999314,0.03703,0,0.357619,0,0.052679,
+ -0.999314,-0.03703,0,-0.357619,0,0.052679,
+ -0.983679,-0.17993,0,-0.309535,-0.432529,-0.052679,
+ -0.968549,-0.248824,0,-0.309535,-0.432529,0.052679,
+ -0.983679,-0.17993,0,-0.309535,-0.432529,-0.052679,
+ -0.999314,-0.03703,0,-0.357619,0,0.052679,
+ -0.999314,0.03703,0,-0.357619,0,-0.052679,
+ -0.968549,-0.248824,0,-0.309535,-0.432529,0.052679,
+ -0.948709,-0.316149,0,-0.292672,-0.483132,-0.052679,
+ -0.948709,-0.316149,0,-0.292672,-0.483132,0.052679,
+ -0.948709,-0.316149,0,-0.292672,-0.483132,-0.052679,
+ -0.968549,-0.248824,0,-0.309535,-0.432529,0.052679,
+ -0.983679,-0.17993,0,-0.309535,-0.432529,-0.052679,
+ -0.21332,-0.976982,0,-0.242083,-0.5,0.052679,
+ -0.316307,-0.948657,0,-0.292672,-0.483132,-0.052679,
+ -0.10666,-0.994296,0,-0.242083,-0.5,-0.052679,
+ -0.316307,-0.948657,0,-0.292672,-0.483132,-0.052679,
+ -0.21332,-0.976982,0,-0.242083,-0.5,0.052679,
+ -0.316307,-0.948657,0,-0.292672,-0.483132,0.052679,
+ 0.316307,-0.948657,0,0.292672,-0.483132,0.052679,
+ 0.213319,-0.976983,0,0.242083,-0.5,-0.052679,
+ 0.316307,-0.948657,0,0.292672,-0.483132,-0.052679,
+ 0.213319,-0.976983,0,0.242083,-0.5,-0.052679,
+ 0.316307,-0.948657,0,0.292672,-0.483132,0.052679,
+ 0.10666,-0.994296,0,0.242083,-0.5,0.052679,
+ 0.968549,-0.248824,0,0.309535,-0.432529,-0.052679,
+ 0.948709,-0.316149,0,0.292672,-0.483132,0.052679,
+ 0.948709,-0.316149,0,0.292672,-0.483132,-0.052679,
+ 0.948709,-0.316149,0,0.292672,-0.483132,0.052679,
+ 0.968549,-0.248824,0,0.309535,-0.432529,-0.052679,
+ 0.983679,-0.17993,0,0.309535,-0.432529,0.052679,
+ 0.213319,0.976983,0,0.242083,0.5,0.052679,
+ 0.316307,0.948657,0,0.292672,0.483132,-0.052679,
+ 0.10666,0.994296,0,0.242083,0.5,-0.052679,
+ 0.316307,0.948657,0,0.292672,0.483132,-0.052679,
+ 0.213319,0.976983,0,0.242083,0.5,0.052679,
+ 0.316307,0.948657,0,0.292672,0.483132,0.052679,
+ 0.948709,0.316149,0,0.292672,0.483132,-0.052679,
+ 0.968549,0.248824,0,0.309535,0.432529,0.052679,
+ 0.983679,0.17993,0,0.309535,0.432529,-0.052679,
+ 0.968549,0.248824,0,0.309535,0.432529,0.052679,
+ 0.948709,0.316149,0,0.292672,0.483132,-0.052679,
+ 0.948709,0.316149,0,0.292672,0.483132,0.052679,
+ -0.948709,0.316149,0,-0.292672,0.483132,0.052679,
+ -0.968549,0.248824,0,-0.309535,0.432529,-0.052679,
+ -0.983679,0.17993,0,-0.309535,0.432529,0.052679,
+ -0.968549,0.248824,0,-0.309535,0.432529,-0.052679,
+ -0.948709,0.316149,0,-0.292672,0.483132,0.052679,
+ -0.948709,0.316149,0,-0.292672,0.483132,-0.052679,
+ -0.316307,0.948657,0,-0.292672,0.483132,0.052679,
+ -0.21332,0.976982,0,-0.242083,0.5,-0.052679,
+ -0.316307,0.948657,0,-0.292672,0.483132,-0.052679,
+ -0.21332,0.976982,0,-0.242083,0.5,-0.052679,
+ -0.316307,0.948657,0,-0.292672,0.483132,0.052679,
+ -0.10666,0.994296,0,-0.242083,0.5,0.052679
+};
+static const struct gllist toaster_base_frame = { GL_N3F_V3F, GL_TRIANGLES, 120, toaster_base_data, 0 };
+const struct gllist *toaster_base = &toaster_base_frame;
diff --git a/hacks/glx/toaster_base.dxf b/hacks/glx/toaster_base.dxf
new file mode 100644
index 0000000..d1cb7c5
--- /dev/null
+++ b/hacks/glx/toaster_base.dxf
@@ -0,0 +1,1214 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-213.358000
+20
+440.670401
+30
+46.428166
+11
+213.358015
+21
+440.670401
+31
+-46.428166
+12
+-213.358000
+22
+440.670401
+32
+-46.428166
+13
+-213.358000
+23
+440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+213.358015
+20
+440.670401
+30
+-46.428166
+11
+-213.358000
+21
+440.670401
+31
+46.428166
+12
+213.358015
+22
+440.670401
+32
+46.428166
+13
+213.358015
+23
+440.670401
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+272.806257
+20
+381.205648
+30
+-46.428166
+11
+315.183967
+21
+0.000001
+31
+46.428166
+12
+315.183967
+22
+0.000001
+32
+-46.428166
+13
+315.183967
+23
+0.000001
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+315.183967
+20
+0.000001
+30
+46.428166
+11
+272.806257
+21
+381.205648
+31
+-46.428166
+12
+272.806257
+22
+381.205648
+32
+46.428166
+13
+272.806257
+23
+381.205648
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+213.358015
+20
+-440.670401
+30
+46.428166
+11
+-213.358000
+21
+-440.670401
+31
+-46.428166
+12
+213.358015
+22
+-440.670401
+32
+-46.428166
+13
+213.358015
+23
+-440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-213.358000
+20
+-440.670401
+30
+-46.428166
+11
+213.358015
+21
+-440.670401
+31
+46.428166
+12
+-213.358000
+22
+-440.670401
+32
+46.428166
+13
+-213.358000
+23
+-440.670401
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-272.806227
+20
+381.205648
+30
+46.428166
+11
+-315.183967
+21
+0.000001
+31
+-46.428166
+12
+-315.183967
+22
+0.000001
+32
+46.428166
+13
+-315.183967
+23
+0.000001
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-315.183967
+20
+0.000001
+30
+-46.428166
+11
+-272.806227
+21
+381.205648
+31
+46.428166
+12
+-272.806227
+22
+381.205648
+32
+-46.428166
+13
+-272.806227
+23
+381.205648
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-272.806227
+20
+381.205648
+30
+-46.428166
+11
+-272.806227
+21
+-381.205648
+31
+-46.428166
+12
+-315.183967
+22
+0.000001
+32
+-46.428166
+13
+-315.183967
+23
+0.000001
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-272.806227
+20
+-381.205648
+30
+-46.428166
+11
+-272.806227
+21
+381.205648
+31
+-46.428166
+12
+-257.944137
+22
+425.804198
+32
+-46.428166
+13
+-257.944137
+23
+425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-272.806227
+20
+-381.205648
+30
+-46.428166
+11
+-257.944137
+21
+425.804198
+31
+-46.428166
+12
+-257.944137
+22
+-425.804198
+32
+-46.428166
+13
+-257.944137
+23
+-425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-257.944137
+20
+-425.804198
+30
+-46.428166
+11
+-257.944137
+21
+425.804198
+31
+-46.428166
+12
+-213.358000
+22
+440.670401
+32
+-46.428166
+13
+-213.358000
+23
+440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-257.944137
+20
+-425.804198
+30
+-46.428166
+11
+-213.358000
+21
+440.670401
+31
+-46.428166
+12
+-213.358000
+22
+-440.670401
+32
+-46.428166
+13
+-213.358000
+23
+-440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-213.358000
+20
+-440.670401
+30
+-46.428166
+11
+-213.358000
+21
+440.670401
+31
+-46.428166
+12
+213.358015
+22
+440.670401
+32
+-46.428166
+13
+213.358015
+23
+440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-213.358000
+20
+-440.670401
+30
+-46.428166
+11
+213.358015
+21
+440.670401
+31
+-46.428166
+12
+213.358015
+22
+-440.670401
+32
+-46.428166
+13
+213.358015
+23
+-440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+213.358015
+20
+-440.670401
+30
+-46.428166
+11
+213.358015
+21
+440.670401
+31
+-46.428166
+12
+257.944167
+22
+-425.804198
+32
+-46.428166
+13
+257.944167
+23
+-425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+257.944167
+20
+-425.804198
+30
+-46.428166
+11
+213.358015
+21
+440.670401
+31
+-46.428166
+12
+257.944167
+22
+425.804198
+32
+-46.428166
+13
+257.944167
+23
+425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+257.944167
+20
+-425.804198
+30
+-46.428166
+11
+257.944167
+21
+425.804198
+31
+-46.428166
+12
+272.806257
+22
+-381.205648
+32
+-46.428166
+13
+272.806257
+23
+-381.205648
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+272.806257
+20
+-381.205648
+30
+-46.428166
+11
+257.944167
+21
+425.804198
+31
+-46.428166
+12
+272.806257
+22
+381.205648
+32
+-46.428166
+13
+272.806257
+23
+381.205648
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+272.806257
+20
+-381.205648
+30
+-46.428166
+11
+272.806257
+21
+381.205648
+31
+-46.428166
+12
+315.183967
+22
+0.000001
+32
+-46.428166
+13
+315.183967
+23
+0.000001
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+315.183967
+20
+0.000001
+30
+-46.428166
+11
+272.806257
+21
+-381.205648
+31
+46.428166
+12
+272.806257
+22
+-381.205648
+32
+-46.428166
+13
+272.806257
+23
+-381.205648
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+272.806257
+20
+-381.205648
+30
+46.428166
+11
+315.183967
+21
+0.000001
+31
+-46.428166
+12
+315.183967
+22
+0.000001
+32
+46.428166
+13
+315.183967
+23
+0.000001
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-315.183967
+20
+0.000001
+30
+46.428166
+11
+-272.806227
+21
+-381.205648
+31
+-46.428166
+12
+-272.806227
+22
+-381.205648
+32
+46.428166
+13
+-272.806227
+23
+-381.205648
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-272.806227
+20
+-381.205648
+30
+-46.428166
+11
+-315.183967
+21
+0.000001
+31
+46.428166
+12
+-315.183967
+22
+0.000001
+32
+-46.428166
+13
+-315.183967
+23
+0.000001
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-272.806227
+20
+-381.205648
+30
+46.428166
+11
+-257.944137
+21
+-425.804198
+31
+-46.428166
+12
+-257.944137
+22
+-425.804198
+32
+46.428166
+13
+-257.944137
+23
+-425.804198
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-257.944137
+20
+-425.804198
+30
+-46.428166
+11
+-272.806227
+21
+-381.205648
+31
+46.428166
+12
+-272.806227
+22
+-381.205648
+32
+-46.428166
+13
+-272.806227
+23
+-381.205648
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-213.358000
+20
+-440.670401
+30
+46.428166
+11
+-257.944137
+21
+-425.804198
+31
+-46.428166
+12
+-213.358000
+22
+-440.670401
+32
+-46.428166
+13
+-213.358000
+23
+-440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-257.944137
+20
+-425.804198
+30
+-46.428166
+11
+-213.358000
+21
+-440.670401
+31
+46.428166
+12
+-257.944137
+22
+-425.804198
+32
+46.428166
+13
+-257.944137
+23
+-425.804198
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+257.944167
+20
+-425.804198
+30
+46.428166
+11
+213.358015
+21
+-440.670401
+31
+-46.428166
+12
+257.944167
+22
+-425.804198
+32
+-46.428166
+13
+257.944167
+23
+-425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+213.358015
+20
+-440.670401
+30
+-46.428166
+11
+257.944167
+21
+-425.804198
+31
+46.428166
+12
+213.358015
+22
+-440.670401
+32
+46.428166
+13
+213.358015
+23
+-440.670401
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+272.806257
+20
+-381.205648
+30
+-46.428166
+11
+257.944167
+21
+-425.804198
+31
+46.428166
+12
+257.944167
+22
+-425.804198
+32
+-46.428166
+13
+257.944167
+23
+-425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+257.944167
+20
+-425.804198
+30
+46.428166
+11
+272.806257
+21
+-381.205648
+31
+-46.428166
+12
+272.806257
+22
+-381.205648
+32
+46.428166
+13
+272.806257
+23
+-381.205648
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+213.358015
+20
+440.670401
+30
+46.428166
+11
+257.944167
+21
+425.804198
+31
+-46.428166
+12
+213.358015
+22
+440.670401
+32
+-46.428166
+13
+213.358015
+23
+440.670401
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+257.944167
+20
+425.804198
+30
+-46.428166
+11
+213.358015
+21
+440.670401
+31
+46.428166
+12
+257.944167
+22
+425.804198
+32
+46.428166
+13
+257.944167
+23
+425.804198
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+257.944167
+20
+425.804198
+30
+-46.428166
+11
+272.806257
+21
+381.205648
+31
+46.428166
+12
+272.806257
+22
+381.205648
+32
+-46.428166
+13
+272.806257
+23
+381.205648
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+272.806257
+20
+381.205648
+30
+46.428166
+11
+257.944167
+21
+425.804198
+31
+-46.428166
+12
+257.944167
+22
+425.804198
+32
+46.428166
+13
+257.944167
+23
+425.804198
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-257.944137
+20
+425.804198
+30
+46.428166
+11
+-272.806227
+21
+381.205648
+31
+-46.428166
+12
+-272.806227
+22
+381.205648
+32
+46.428166
+13
+-272.806227
+23
+381.205648
+33
+46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-272.806227
+20
+381.205648
+30
+-46.428166
+11
+-257.944137
+21
+425.804198
+31
+46.428166
+12
+-257.944137
+22
+425.804198
+32
+-46.428166
+13
+-257.944137
+23
+425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-257.944137
+20
+425.804198
+30
+46.428166
+11
+-213.358000
+21
+440.670401
+31
+-46.428166
+12
+-257.944137
+22
+425.804198
+32
+-46.428166
+13
+-257.944137
+23
+425.804198
+33
+-46.428166
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-213.358000
+20
+440.670401
+30
+-46.428166
+11
+-257.944137
+21
+425.804198
+31
+46.428166
+12
+-213.358000
+22
+440.670401
+32
+46.428166
+13
+-213.358000
+23
+440.670401
+33
+46.428166
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster_handle.c b/hacks/glx/toaster_handle.c
new file mode 100644
index 0000000..f7c7c6b
--- /dev/null
+++ b/hacks/glx/toaster_handle.c
@@ -0,0 +1,64 @@
+/* Generated from "toaster_handle.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_handle_data[] = {
+ 0,0,1,0.5,-0.094169,0.035224,
+ 0,0,1,-0.356403,0.038624,0.035224,
+ 0,0,1,-0.5,-0.094169,0.035224,
+ 0,0,1,-0.356403,0.038624,0.035224,
+ 0,0,1,0.5,-0.094169,0.035224,
+ 0,0,1,-0.210084,0.094169,0.035224,
+ 0,0,1,-0.210084,0.094169,0.035224,
+ 0,0,1,0.5,-0.094169,0.035224,
+ 0,0,1,0.210084,0.094169,0.035224,
+ 0,0,1,0.210084,0.094169,0.035224,
+ 0,0,1,0.5,-0.094169,0.035224,
+ 0,0,1,0.356403,0.038624,0.035224,
+ -0.678947,0.734187,0,-0.5,-0.094169,0.035224,
+ -0.58038,0.814346,0,-0.356403,0.038624,-0.035224,
+ -0.678947,0.734187,0,-0.5,-0.094169,-0.035224,
+ -0.58038,0.814346,0,-0.356403,0.038624,-0.035224,
+ -0.678947,0.734187,0,-0.5,-0.094169,0.035224,
+ -0.47058,0.882357,0,-0.356403,0.038624,0.035224,
+ 0,0,-1,-0.356403,0.038624,-0.035224,
+ 0,0,-1,0.5,-0.094169,-0.035224,
+ 0,0,-1,-0.5,-0.094169,-0.035224,
+ 0,0,-1,0.5,-0.094169,-0.035224,
+ 0,0,-1,-0.356403,0.038624,-0.035224,
+ 0,0,-1,-0.210084,0.094169,-0.035224,
+ 0,0,-1,0.5,-0.094169,-0.035224,
+ 0,0,-1,-0.210084,0.094169,-0.035224,
+ 0,0,-1,0.210084,0.094169,-0.035224,
+ 0,0,-1,0.5,-0.094169,-0.035224,
+ 0,0,-1,0.210084,0.094169,-0.035224,
+ 0,0,-1,0.356403,0.038624,-0.035224,
+ 0.58038,0.814346,0,0.356403,0.038624,0.035224,
+ 0.678947,0.734187,0,0.5,-0.094169,-0.035224,
+ 0.47058,0.882357,0,0.356403,0.038624,-0.035224,
+ 0.678947,0.734187,0,0.5,-0.094169,-0.035224,
+ 0.58038,0.814346,0,0.356403,0.038624,0.035224,
+ 0.678947,0.734187,0,0.5,-0.094169,0.035224,
+ -0.120052,0.992768,0,-0.210084,0.094169,0.035224,
+ 0.120052,0.992768,0,0.210084,0.094169,-0.035224,
+ -0.240104,0.970747,0,-0.210084,0.094169,-0.035224,
+ 0.120052,0.992768,0,0.210084,0.094169,-0.035224,
+ -0.120052,0.992768,0,-0.210084,0.094169,0.035224,
+ 0.240104,0.970747,0,0.210084,0.094169,0.035224,
+ 0.240104,0.970747,0,0.210084,0.094169,0.035224,
+ 0.47058,0.882357,0,0.356403,0.038624,-0.035224,
+ 0.120052,0.992768,0,0.210084,0.094169,-0.035224,
+ 0.47058,0.882357,0,0.356403,0.038624,-0.035224,
+ 0.240104,0.970747,0,0.210084,0.094169,0.035224,
+ 0.58038,0.814346,0,0.356403,0.038624,0.035224,
+ -0.47058,0.882357,0,-0.356403,0.038624,0.035224,
+ -0.240104,0.970747,0,-0.210084,0.094169,-0.035224,
+ -0.58038,0.814346,0,-0.356403,0.038624,-0.035224,
+ -0.240104,0.970747,0,-0.210084,0.094169,-0.035224,
+ -0.47058,0.882357,0,-0.356403,0.038624,0.035224,
+ -0.120052,0.992768,0,-0.210084,0.094169,0.035224
+};
+static const struct gllist toaster_handle_frame = { GL_N3F_V3F, GL_TRIANGLES, 54, toaster_handle_data, 0 };
+const struct gllist *toaster_handle = &toaster_handle_frame;
diff --git a/hacks/glx/toaster_handle.dxf b/hacks/glx/toaster_handle.dxf
new file mode 100644
index 0000000..1c153d8
--- /dev/null
+++ b/hacks/glx/toaster_handle.dxf
@@ -0,0 +1,554 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+490.188003
+20
+-92.321426
+30
+34.532439
+11
+-349.408537
+21
+37.865948
+31
+34.532439
+12
+-490.188003
+22
+-92.321426
+32
+34.532439
+13
+-490.188003
+23
+-92.321426
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-349.408537
+20
+37.865948
+30
+34.532439
+11
+490.188003
+21
+-92.321426
+31
+34.532439
+12
+-205.961362
+22
+92.321426
+32
+34.532439
+13
+-205.961362
+23
+92.321426
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-205.961362
+20
+92.321426
+30
+34.532439
+11
+490.188003
+21
+-92.321426
+31
+34.532439
+12
+205.961317
+22
+92.321426
+32
+34.532439
+13
+205.961317
+23
+92.321426
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+205.961317
+20
+92.321426
+30
+34.532439
+11
+490.188003
+21
+-92.321426
+31
+34.532439
+12
+349.408507
+22
+37.865948
+32
+34.532439
+13
+349.408507
+23
+37.865948
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-490.188003
+20
+-92.321426
+30
+34.532439
+11
+-349.408537
+21
+37.865948
+31
+-34.532439
+12
+-490.188003
+22
+-92.321426
+32
+-34.532439
+13
+-490.188003
+23
+-92.321426
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-349.408537
+20
+37.865948
+30
+-34.532439
+11
+-490.188003
+21
+-92.321426
+31
+34.532439
+12
+-349.408537
+22
+37.865948
+32
+34.532439
+13
+-349.408537
+23
+37.865948
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-349.408537
+20
+37.865948
+30
+-34.532439
+11
+490.188003
+21
+-92.321426
+31
+-34.532439
+12
+-490.188003
+22
+-92.321426
+32
+-34.532439
+13
+-490.188003
+23
+-92.321426
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+490.188003
+20
+-92.321426
+30
+-34.532439
+11
+-349.408537
+21
+37.865948
+31
+-34.532439
+12
+-205.961362
+22
+92.321426
+32
+-34.532439
+13
+-205.961362
+23
+92.321426
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+490.188003
+20
+-92.321426
+30
+-34.532439
+11
+-205.961362
+21
+92.321426
+31
+-34.532439
+12
+205.961317
+22
+92.321426
+32
+-34.532439
+13
+205.961317
+23
+92.321426
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+490.188003
+20
+-92.321426
+30
+-34.532439
+11
+205.961317
+21
+92.321426
+31
+-34.532439
+12
+349.408507
+22
+37.865948
+32
+-34.532439
+13
+349.408507
+23
+37.865948
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+349.408507
+20
+37.865948
+30
+34.532439
+11
+490.188003
+21
+-92.321426
+31
+-34.532439
+12
+349.408507
+22
+37.865948
+32
+-34.532439
+13
+349.408507
+23
+37.865948
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+490.188003
+20
+-92.321426
+30
+-34.532439
+11
+349.408507
+21
+37.865948
+31
+34.532439
+12
+490.188003
+22
+-92.321426
+32
+34.532439
+13
+490.188003
+23
+-92.321426
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-205.961362
+20
+92.321426
+30
+34.532439
+11
+205.961317
+21
+92.321426
+31
+-34.532439
+12
+-205.961362
+22
+92.321426
+32
+-34.532439
+13
+-205.961362
+23
+92.321426
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+205.961317
+20
+92.321426
+30
+-34.532439
+11
+-205.961362
+21
+92.321426
+31
+34.532439
+12
+205.961317
+22
+92.321426
+32
+34.532439
+13
+205.961317
+23
+92.321426
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+205.961317
+20
+92.321426
+30
+34.532439
+11
+349.408507
+21
+37.865948
+31
+-34.532439
+12
+205.961317
+22
+92.321426
+32
+-34.532439
+13
+205.961317
+23
+92.321426
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+349.408507
+20
+37.865948
+30
+-34.532439
+11
+205.961317
+21
+92.321426
+31
+34.532439
+12
+349.408507
+22
+37.865948
+32
+34.532439
+13
+349.408507
+23
+37.865948
+33
+34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-349.408537
+20
+37.865948
+30
+34.532439
+11
+-205.961362
+21
+92.321426
+31
+-34.532439
+12
+-349.408537
+22
+37.865948
+32
+-34.532439
+13
+-349.408537
+23
+37.865948
+33
+-34.532439
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-205.961362
+20
+92.321426
+30
+-34.532439
+11
+-349.408537
+21
+37.865948
+31
+34.532439
+12
+-205.961362
+22
+92.321426
+32
+34.532439
+13
+-205.961362
+23
+92.321426
+33
+34.532439
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster_handle2.c b/hacks/glx/toaster_handle2.c
new file mode 100644
index 0000000..d73003e
--- /dev/null
+++ b/hacks/glx/toaster_handle2.c
@@ -0,0 +1,40 @@
+/* Generated from "toaster_handle2.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_handle2_data[] = {
+ 0,-0.027094,0.999633,0.038934,-0.294903,-0.5,
+ 0,-0.027094,0.999633,-0.038934,0.321555,-0.483291,
+ 0,-0.027094,0.999633,-0.038934,-0.294903,-0.5,
+ 0,-0.027094,0.999633,-0.038934,0.321555,-0.483291,
+ 0,-0.027094,0.999633,0.038934,-0.294903,-0.5,
+ 0,-0.027094,0.999633,0.038934,0.321555,-0.483291,
+ -1,0,0,0.038934,0.294903,0.5,
+ -1,0,0,0.038934,-0.294903,-0.5,
+ -1,0,0,0.038934,-0.321555,0.483291,
+ -1,0,0,0.038934,-0.294903,-0.5,
+ -1,0,0,0.038934,0.294903,0.5,
+ -1,0,0,0.038934,0.321555,-0.483291,
+ 0,0.027094,-0.999633,0.038934,0.294903,0.5,
+ 0,0.027094,-0.999633,-0.038934,-0.321555,0.483291,
+ 0,0.027094,-0.999633,-0.038934,0.294903,0.5,
+ 0,0.027094,-0.999633,-0.038934,-0.321555,0.483291,
+ 0,0.027094,-0.999633,0.038934,0.294903,0.5,
+ 0,0.027094,-0.999633,0.038934,-0.321555,0.483291,
+ 1,0,0,-0.038934,-0.294903,-0.5,
+ 1,0,0,-0.038934,0.294903,0.5,
+ 1,0,0,-0.038934,-0.321555,0.483291,
+ 1,0,0,-0.038934,0.294903,0.5,
+ 1,0,0,-0.038934,-0.294903,-0.5,
+ 1,0,0,-0.038934,0.321555,-0.483291,
+ 0,-0.999633,-0.027095,0.038934,0.294903,0.5,
+ 0,-0.999633,-0.027095,-0.038934,0.321555,-0.483291,
+ 0,-0.999633,-0.027095,0.038934,0.321555,-0.483291,
+ 0,-0.999633,-0.027095,-0.038934,0.321555,-0.483291,
+ 0,-0.999633,-0.027095,0.038934,0.294903,0.5,
+ 0,-0.999633,-0.027095,-0.038934,0.294903,0.5
+};
+static const struct gllist toaster_handle2_frame = { GL_N3F_V3F, GL_TRIANGLES, 30, toaster_handle2_data, 0 };
+const struct gllist *toaster_handle2 = &toaster_handle2_frame;
diff --git a/hacks/glx/toaster_handle2.dxf b/hacks/glx/toaster_handle2.dxf
new file mode 100644
index 0000000..d8eb850
--- /dev/null
+++ b/hacks/glx/toaster_handle2.dxf
@@ -0,0 +1,314 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+33.460636
+20
+-253.443152
+30
+-429.705501
+11
+-33.460632
+21
+276.347905
+31
+-415.345818
+12
+-33.460632
+22
+-253.443152
+32
+-429.705501
+13
+-33.460632
+23
+-253.443152
+33
+-429.705501
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-33.460632
+20
+276.347905
+30
+-415.345818
+11
+33.460636
+21
+-253.443152
+31
+-429.705501
+12
+33.460636
+22
+276.347905
+32
+-415.345818
+13
+33.460636
+23
+276.347905
+33
+-415.345818
+0
+3DFACE
+8
+0
+ 62
+55
+10
+33.460636
+20
+253.443152
+30
+429.705560
+11
+33.460636
+21
+-253.443152
+31
+-429.705501
+12
+33.460636
+22
+-276.347905
+32
+415.345907
+13
+33.460636
+23
+-276.347905
+33
+415.345907
+0
+3DFACE
+8
+0
+ 62
+55
+10
+33.460636
+20
+-253.443152
+30
+-429.705501
+11
+33.460636
+21
+253.443152
+31
+429.705560
+12
+33.460636
+22
+276.347905
+32
+-415.345818
+13
+33.460636
+23
+276.347905
+33
+-415.345818
+0
+3DFACE
+8
+0
+ 62
+55
+10
+33.460636
+20
+253.443152
+30
+429.705560
+11
+-33.460632
+21
+-276.347905
+31
+415.345907
+12
+-33.460632
+22
+253.443152
+32
+429.705560
+13
+-33.460632
+23
+253.443152
+33
+429.705560
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-33.460632
+20
+-276.347905
+30
+415.345907
+11
+33.460636
+21
+253.443152
+31
+429.705560
+12
+33.460636
+22
+-276.347905
+32
+415.345907
+13
+33.460636
+23
+-276.347905
+33
+415.345907
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-33.460632
+20
+-253.443152
+30
+-429.705501
+11
+-33.460632
+21
+253.443152
+31
+429.705560
+12
+-33.460632
+22
+-276.347905
+32
+415.345907
+13
+-33.460632
+23
+-276.347905
+33
+415.345907
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-33.460632
+20
+253.443152
+30
+429.705560
+11
+-33.460632
+21
+-253.443152
+31
+-429.705501
+12
+-33.460632
+22
+276.347905
+32
+-415.345818
+13
+-33.460632
+23
+276.347905
+33
+-415.345818
+0
+3DFACE
+8
+0
+ 62
+55
+10
+33.460636
+20
+253.443152
+30
+429.705560
+11
+-33.460632
+21
+276.347905
+31
+-415.345818
+12
+33.460636
+22
+276.347905
+32
+-415.345818
+13
+33.460636
+23
+276.347905
+33
+-415.345818
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-33.460632
+20
+276.347905
+30
+-415.345818
+11
+33.460636
+21
+253.443152
+31
+429.705560
+12
+-33.460632
+22
+253.443152
+32
+429.705560
+13
+-33.460632
+23
+253.443152
+33
+429.705560
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster_jet.c b/hacks/glx/toaster_jet.c
new file mode 100644
index 0000000..4d44a3c
--- /dev/null
+++ b/hacks/glx/toaster_jet.c
@@ -0,0 +1,178 @@
+/* Generated from "toaster_jet.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_jet_data[] = {
+ 0.813787,-0.208368,0.542526,-0.002117,-0.240071,0.000396,
+ 0.813787,-0.208368,0.542526,-0.061503,-0.5,-0.010357,
+ 0.813787,-0.208368,0.542526,-0.031551,-0.5,-0.055285,
+ -0.351369,0.154576,0.923388,0.012946,0.394969,0.120155,
+ -0.354839,-0.067247,0.932506,-0.087986,-0.240071,0.081748,
+ -0.352413,-0.134494,0.92613,0.012946,-0.240071,0.120155,
+ -0.707849,-0.221865,0.670616,-0.002117,-0.240071,0.000396,
+ -0.707849,-0.221865,0.670616,0.022249,-0.5,-0.059879,
+ -0.707849,-0.221865,0.670616,0.059386,-0.5,-0.020681,
+ -0.905798,0.309152,0.289748,-0.120888,0.394969,-0.02111,
+ -0.950301,-0.067247,0.303983,-0.120888,-0.240071,-0.02111,
+ -0.941009,0.154576,0.301011,-0.087986,0.394969,0.081748,
+ -0.083052,-0.217721,-0.972471,0.022249,-0.5,-0.059879,
+ -0.083052,-0.217721,-0.972471,-0.031551,-0.5,-0.055285,
+ -0.084182,-0.145927,-0.985707,-0.060985,-0.240071,-0.110965,
+ -0.084866,-0.072964,-0.993717,0.046616,-0.240071,-0.120155,
+ -0.083916,0.165753,-0.98259,-0.060985,0.394969,-0.110965,
+ -0.080281,0.331506,-0.940031,0.046616,0.394969,-0.120155,
+ -0.080281,0.331506,-0.940031,0.046616,0.394969,-0.120155,
+ -0.074495,0.483301,-0.872279,-0.031551,0.5,-0.055285,
+ -0.074495,0.483301,-0.872279,0.022249,0.5,-0.059879,
+ 0.987687,-0.072964,0.138384,0.105904,-0.240071,0.065189,
+ 0.96657,-0.217721,0.135426,0.051893,-0.5,0.032792,
+ 0.979726,-0.145927,0.137269,0.120888,-0.240071,-0.041759,
+ -0.084866,-0.072964,-0.993717,0.046616,-0.240071,-0.120155,
+ -0.084182,-0.145927,-0.985707,-0.060985,-0.240071,-0.110965,
+ -0.083916,0.165753,-0.98259,-0.060985,0.394969,-0.110965,
+ 0.63255,0.49066,-0.599278,0.059386,0.5,-0.020681,
+ 0.683508,0.336879,-0.647556,0.120888,0.394969,-0.041759,
+ 0.63255,0.49066,-0.599278,0.022249,0.5,-0.059879,
+ 0.933052,-0.200826,-0.298468,-0.002117,-0.240071,0.000396,
+ 0.933052,-0.200826,-0.298468,-0.045051,-0.5,0.041072,
+ 0.933052,-0.200826,-0.298468,-0.061503,-0.5,-0.010357,
+ -0.084866,-0.072964,-0.993717,0.046616,-0.240071,-0.120155,
+ -0.083052,-0.217721,-0.972471,0.022249,-0.5,-0.059879,
+ -0.084182,-0.145927,-0.985707,-0.060985,-0.240071,-0.110965,
+ 0.502451,0.15961,0.849746,0.105904,0.394969,0.065189,
+ 0.450231,0.466386,0.76143,0.051893,0.5,0.032792,
+ 0.482347,0.31922,0.815745,0.012946,0.394969,0.120155,
+ 0.934327,0.331506,0.130908,0.105904,0.394969,0.065189,
+ 0.987687,-0.072964,0.138384,0.105904,-0.240071,0.065189,
+ 0.976628,0.165753,0.136835,0.120888,0.394969,-0.041759,
+ 0.083052,-0.217721,0.972471,0.022249,-0.5,-0.059879,
+ 0.083052,-0.217721,0.972471,-0.002117,-0.240071,0.000396,
+ 0.083052,-0.217721,0.972471,-0.031551,-0.5,-0.055285,
+ -0.950301,-0.067247,0.303983,-0.120888,-0.240071,-0.02111,
+ -0.933052,-0.200826,0.298467,-0.061503,-0.5,-0.010357,
+ -0.943803,-0.134494,0.301905,-0.087986,-0.240071,0.081748,
+ -0.788518,0.319219,-0.525679,-0.060985,0.394969,-0.110965,
+ -0.830021,-0.069797,-0.553347,-0.060985,-0.240071,-0.110965,
+ -0.821384,0.15961,-0.547589,-0.120888,0.394969,-0.02111,
+ 0.503992,-0.139595,0.852353,0.105904,-0.240071,0.065189,
+ 0.507735,-0.069797,0.858681,0.012946,-0.240071,0.120155,
+ 0.497804,-0.208368,0.841887,0.005415,-0.5,0.060275,
+ 0.074495,0.483301,0.872279,0.022249,0.5,-0.059879,
+ 0.074495,0.483301,0.872279,-0.031551,0.5,-0.055285,
+ 0.074495,0.483301,0.872279,-0.002117,0.394969,0.000396,
+ -0.497804,-0.208368,-0.841887,0.051893,-0.5,0.032792,
+ -0.497804,-0.208368,-0.841887,0.005415,-0.5,0.060275,
+ -0.497804,-0.208368,-0.841887,-0.002117,-0.240071,0.000396,
+ -0.943803,-0.134494,0.301905,-0.087986,-0.240071,0.081748,
+ -0.933052,-0.200826,0.298467,-0.061503,-0.5,-0.010357,
+ -0.933052,-0.200826,0.298468,-0.045051,-0.5,0.041072,
+ -0.96657,-0.217721,-0.135426,-0.002117,-0.240071,0.000396,
+ -0.96657,-0.217721,-0.135426,0.059386,-0.5,-0.020681,
+ -0.96657,-0.217721,-0.135426,0.051893,-0.5,0.032792,
+ 0.736015,0.466386,0.490678,-0.031551,0.5,-0.055285,
+ 0.736015,0.466386,0.490678,-0.061503,0.5,-0.010357,
+ 0.736015,0.466386,0.490678,-0.002117,0.394969,0.000396,
+ 0.979726,-0.145927,0.137269,0.120888,-0.240071,-0.041759,
+ 0.96657,-0.217721,0.135426,0.051893,-0.5,0.032792,
+ 0.96657,-0.217721,0.135426,0.059386,-0.5,-0.020681,
+ 0.63255,0.49066,-0.599278,0.022249,0.5,-0.059879,
+ 0.683508,0.336879,-0.647556,0.120888,0.394969,-0.041759,
+ 0.715569,0.16844,-0.67793,0.046616,0.394969,-0.120155,
+ -0.736016,0.466386,-0.490678,-0.061503,0.5,-0.010357,
+ -0.788518,0.319219,-0.525679,-0.060985,0.394969,-0.110965,
+ -0.821384,0.15961,-0.547589,-0.120888,0.394969,-0.02111,
+ -0.788518,0.319219,-0.525679,-0.060985,0.394969,-0.110965,
+ -0.736016,0.466386,-0.490678,-0.061503,0.5,-0.010357,
+ -0.736015,0.466386,-0.490678,-0.031551,0.5,-0.055285,
+ -0.849396,0.452441,0.271706,-0.045051,0.5,0.041072,
+ -0.849396,0.45244,0.271707,-0.061503,0.5,-0.010357,
+ -0.905798,0.309152,0.289748,-0.120888,0.394969,-0.02111,
+ -0.45023,0.466386,-0.76143,0.051893,0.5,0.032792,
+ -0.45023,0.466386,-0.76143,-0.002117,0.394969,0.000396,
+ -0.45023,0.466386,-0.76143,0.005415,0.5,0.060275,
+ 0.723931,-0.074368,-0.685852,0.120888,-0.240071,-0.041759,
+ 0.707849,-0.221865,-0.670616,0.059386,-0.5,-0.020681,
+ 0.717867,-0.148736,-0.680107,0.046616,-0.240071,-0.120155,
+ -0.63255,0.49066,0.599278,0.022249,0.5,-0.059879,
+ -0.63255,0.49066,0.599278,-0.002117,0.394969,0.000396,
+ -0.63255,0.49066,0.599278,0.059386,0.5,-0.020681,
+ -0.351369,0.154576,0.923388,0.012946,0.394969,0.120155,
+ -0.338222,0.309153,0.888837,-0.087986,0.394969,0.081748,
+ -0.354839,-0.067247,0.932506,-0.087986,-0.240071,0.081748,
+ 0.849395,0.452441,-0.271707,-0.045051,0.5,0.041072,
+ 0.849395,0.452441,-0.271707,-0.002117,0.394969,0.000396,
+ 0.849395,0.452441,-0.271707,-0.061503,0.5,-0.010357,
+ 0.502451,0.15961,0.849746,0.105904,0.394969,0.065189,
+ 0.507735,-0.069797,0.858681,0.012946,-0.240071,0.120155,
+ 0.503992,-0.139595,0.852353,0.105904,-0.240071,0.065189,
+ -0.317161,0.452441,0.83349,0.005415,0.5,0.060275,
+ -0.317162,0.452441,0.83349,-0.045051,0.5,0.041072,
+ -0.338222,0.309153,0.888837,-0.087986,0.394969,0.081748,
+ -0.080281,0.331506,-0.940031,0.046616,0.394969,-0.120155,
+ -0.083916,0.165753,-0.98259,-0.060985,0.394969,-0.110965,
+ -0.074495,0.483301,-0.872279,-0.031551,0.5,-0.055285,
+ 0.715569,0.16844,-0.67793,0.046616,0.394969,-0.120155,
+ 0.723931,-0.074368,-0.685852,0.120888,-0.240071,-0.041759,
+ 0.717867,-0.148736,-0.680107,0.046616,-0.240071,-0.120155,
+ 0.866986,0.483301,0.121473,0.059386,0.5,-0.020681,
+ 0.934327,0.331506,0.130908,0.105904,0.394969,0.065189,
+ 0.976628,0.165753,0.136835,0.120888,0.394969,-0.041759,
+ -0.866986,0.483301,-0.121473,0.059386,0.5,-0.020681,
+ -0.866986,0.483301,-0.121473,-0.002117,0.394969,0.000396,
+ -0.866986,0.483301,-0.121473,0.051893,0.5,0.032792,
+ -0.352413,-0.134494,0.92613,0.012946,-0.240071,0.120155,
+ -0.348399,-0.200826,0.91558,-0.045051,-0.5,0.041072,
+ -0.348399,-0.200826,0.91558,0.005415,-0.5,0.060275,
+ -0.821384,0.15961,-0.547589,-0.120888,0.394969,-0.02111,
+ -0.830021,-0.069797,-0.553347,-0.060985,-0.240071,-0.110965,
+ -0.823903,-0.139594,-0.549269,-0.120888,-0.240071,-0.02111,
+ -0.941009,0.154576,0.301011,-0.087986,0.394969,0.081748,
+ -0.950301,-0.067247,0.303983,-0.120888,-0.240071,-0.02111,
+ -0.943803,-0.134494,0.301905,-0.087986,-0.240071,0.081748,
+ -0.849396,0.452441,0.271706,-0.045051,0.5,0.041072,
+ -0.905798,0.309152,0.289748,-0.120888,0.394969,-0.02111,
+ -0.941009,0.154576,0.301011,-0.087986,0.394969,0.081748,
+ 0.317162,0.452441,-0.83349,0.005415,0.5,0.060275,
+ 0.317162,0.452441,-0.83349,-0.002117,0.394969,0.000396,
+ 0.317162,0.452441,-0.83349,-0.045051,0.5,0.041072,
+ -0.823903,-0.139594,-0.549269,-0.120888,-0.240071,-0.02111,
+ -0.813787,-0.208368,-0.542525,-0.031551,-0.5,-0.055285,
+ -0.813787,-0.208368,-0.542526,-0.061503,-0.5,-0.010357,
+ -0.813787,-0.208368,-0.542525,-0.031551,-0.5,-0.055285,
+ -0.823903,-0.139594,-0.549269,-0.120888,-0.240071,-0.02111,
+ -0.830021,-0.069797,-0.553347,-0.060985,-0.240071,-0.110965,
+ 0.348399,-0.200826,-0.91558,0.005415,-0.5,0.060275,
+ 0.348399,-0.200826,-0.91558,-0.045051,-0.5,0.041072,
+ 0.348399,-0.200826,-0.91558,-0.002117,-0.240071,0.000396,
+ -0.352413,-0.134494,0.92613,0.012946,-0.240071,0.120155,
+ -0.354839,-0.067247,0.932506,-0.087986,-0.240071,0.081748,
+ -0.348399,-0.200826,0.91558,-0.045051,-0.5,0.041072,
+ -0.351369,0.154576,0.923388,0.012946,0.394969,0.120155,
+ -0.317161,0.452441,0.83349,0.005415,0.5,0.060275,
+ -0.338222,0.309153,0.888837,-0.087986,0.394969,0.081748,
+ 0.503992,-0.139595,0.852353,0.105904,-0.240071,0.065189,
+ 0.497804,-0.208368,0.841887,0.005415,-0.5,0.060275,
+ 0.497804,-0.208368,0.841887,0.051893,-0.5,0.032792,
+ 0.683508,0.336879,-0.647556,0.120888,0.394969,-0.041759,
+ 0.723931,-0.074368,-0.685852,0.120888,-0.240071,-0.041759,
+ 0.715569,0.16844,-0.67793,0.046616,0.394969,-0.120155,
+ 0.976628,0.165753,0.136835,0.120888,0.394969,-0.041759,
+ 0.987687,-0.072964,0.138384,0.105904,-0.240071,0.065189,
+ 0.979726,-0.145927,0.137269,0.120888,-0.240071,-0.041759,
+ 0.502451,0.15961,0.849746,0.105904,0.394969,0.065189,
+ 0.482347,0.31922,0.815745,0.012946,0.394969,0.120155,
+ 0.507735,-0.069797,0.858681,0.012946,-0.240071,0.120155,
+ 0.866986,0.483301,0.121473,0.051893,0.5,0.032792,
+ 0.934327,0.331506,0.130908,0.105904,0.394969,0.065189,
+ 0.866986,0.483301,0.121473,0.059386,0.5,-0.020681,
+ 0.450231,0.466386,0.76143,0.051893,0.5,0.032792,
+ 0.45023,0.466386,0.76143,0.005415,0.5,0.060275,
+ 0.482347,0.31922,0.815745,0.012946,0.394969,0.120155,
+ 0.717867,-0.148736,-0.680107,0.046616,-0.240071,-0.120155,
+ 0.707849,-0.221865,-0.670616,0.059386,-0.5,-0.020681,
+ 0.707849,-0.221865,-0.670616,0.022249,-0.5,-0.059879
+};
+static const struct gllist toaster_jet_frame = { GL_N3F_V3F, GL_TRIANGLES, 168, toaster_jet_data, 0 };
+const struct gllist *toaster_jet = &toaster_jet_frame;
diff --git a/hacks/glx/toaster_jet.dxf b/hacks/glx/toaster_jet.dxf
new file mode 100644
index 0000000..2b4a2d3
--- /dev/null
+++ b/hacks/glx/toaster_jet.dxf
@@ -0,0 +1,1694 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-2.099907
+20
+-238.135010
+30
+0.392425
+11
+-61.006751
+21
+-495.968699
+31
+-10.273786
+12
+-31.296514
+22
+-495.968699
+32
+-54.839045
+13
+-31.296514
+23
+-495.968699
+33
+-54.839045
+0
+3DFACE
+8
+0
+ 62
+55
+10
+12.841670
+20
+391.784638
+30
+119.185813
+11
+-87.276451
+21
+-238.135010
+31
+81.088670
+12
+12.841670
+22
+-238.135010
+32
+119.185813
+13
+12.841670
+23
+-238.135010
+33
+119.185813
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-2.099907
+20
+-238.135010
+30
+0.392425
+11
+22.069970
+21
+-495.968699
+31
+-59.396684
+12
+58.906760
+22
+-495.968699
+32
+-20.514699
+13
+58.906760
+23
+-495.968699
+33
+-20.514699
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-119.913481
+20
+391.784638
+30
+-20.939998
+11
+-119.913481
+21
+-238.135010
+31
+-20.939998
+12
+-87.276451
+22
+391.784638
+32
+81.088670
+13
+-87.276451
+23
+391.784638
+33
+81.088670
+0
+3DFACE
+8
+0
+ 62
+55
+10
+22.069970
+20
+-495.968699
+30
+-59.396684
+11
+-31.296514
+21
+-495.968699
+31
+-54.839045
+12
+-60.493119
+22
+-238.135010
+32
+-110.070519
+13
+-60.493119
+23
+-238.135010
+33
+-110.070519
+0
+3DFACE
+8
+0
+ 62
+55
+10
+46.239849
+20
+-238.135010
+30
+-119.185783
+11
+-60.493119
+21
+391.784638
+31
+-110.070519
+12
+46.239849
+22
+391.784638
+32
+-119.185783
+13
+46.239849
+23
+391.784638
+33
+-119.185783
+0
+3DFACE
+8
+0
+ 62
+55
+10
+46.239849
+20
+391.784638
+30
+-119.185783
+11
+-31.296514
+21
+495.968699
+31
+-54.839045
+12
+22.069970
+22
+495.968699
+32
+-59.396684
+13
+22.069970
+23
+495.968699
+33
+-59.396684
+0
+3DFACE
+8
+0
+ 62
+55
+10
+105.049863
+20
+-238.135010
+30
+64.663500
+11
+51.474977
+21
+-495.968699
+31
+32.527965
+12
+119.913429
+22
+-238.135010
+32
+-41.421823
+13
+119.913429
+23
+-238.135010
+33
+-41.421823
+0
+3DFACE
+8
+0
+ 62
+55
+10
+46.239849
+20
+-238.135010
+30
+-119.185783
+11
+-60.493119
+21
+-238.135010
+31
+-110.070519
+12
+-60.493119
+22
+391.784638
+32
+-110.070519
+13
+-60.493119
+23
+391.784638
+33
+-110.070519
+0
+3DFACE
+8
+0
+ 62
+55
+10
+58.906760
+20
+495.968699
+30
+-20.514699
+11
+119.913429
+21
+391.784638
+31
+-41.421823
+12
+22.069970
+22
+495.968699
+32
+-59.396684
+13
+22.069970
+23
+495.968699
+33
+-59.396684
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-2.099907
+20
+-238.135010
+30
+0.392425
+11
+-44.688124
+21
+-495.968699
+31
+40.740550
+12
+-61.006751
+22
+-495.968699
+32
+-10.273786
+13
+-61.006751
+23
+-495.968699
+33
+-10.273786
+0
+3DFACE
+8
+0
+ 62
+55
+10
+46.239849
+20
+-238.135010
+30
+-119.185783
+11
+22.069970
+21
+-495.968699
+31
+-59.396684
+12
+-60.493119
+22
+-238.135010
+32
+-110.070519
+13
+-60.493119
+23
+-238.135010
+33
+-110.070519
+0
+3DFACE
+8
+0
+ 62
+55
+10
+105.049863
+20
+391.784638
+30
+64.663500
+11
+51.474977
+21
+495.968699
+31
+32.527965
+12
+12.841670
+22
+391.784638
+32
+119.185813
+13
+12.841670
+23
+391.784638
+33
+119.185813
+0
+3DFACE
+8
+0
+ 62
+55
+10
+105.049863
+20
+391.784638
+30
+64.663500
+11
+105.049863
+21
+-238.135010
+31
+64.663500
+12
+119.913429
+22
+391.784638
+32
+-41.421823
+13
+119.913429
+23
+391.784638
+33
+-41.421823
+0
+3DFACE
+8
+0
+ 62
+55
+10
+22.069970
+20
+-495.968699
+30
+-59.396684
+11
+-2.099907
+21
+-238.135010
+31
+0.392425
+12
+-31.296514
+22
+-495.968699
+32
+-54.839045
+13
+-31.296514
+23
+-495.968699
+33
+-54.839045
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-119.913481
+20
+-238.135010
+30
+-20.939998
+11
+-61.006751
+21
+-495.968699
+31
+-10.273786
+12
+-87.276451
+22
+-238.135010
+32
+81.088670
+13
+-87.276451
+23
+-238.135010
+33
+81.088670
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-60.493119
+20
+391.784638
+30
+-110.070519
+11
+-60.493119
+21
+-238.135010
+31
+-110.070519
+12
+-119.913481
+22
+391.784638
+32
+-20.939998
+13
+-119.913481
+23
+391.784638
+33
+-20.939998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+105.049863
+20
+-238.135010
+30
+64.663500
+11
+12.841670
+21
+-238.135010
+31
+119.185813
+12
+5.370881
+22
+-495.968699
+32
+59.789117
+13
+5.370881
+23
+-495.968699
+33
+59.789117
+0
+3DFACE
+8
+0
+ 62
+55
+10
+22.069970
+20
+495.968699
+30
+-59.396684
+11
+-31.296514
+21
+495.968699
+31
+-54.839045
+12
+-2.099907
+22
+391.784638
+32
+0.392425
+13
+-2.099907
+23
+391.784638
+33
+0.392425
+0
+3DFACE
+8
+0
+ 62
+55
+10
+51.474977
+20
+-495.968699
+30
+32.527965
+11
+5.370881
+21
+-495.968699
+31
+59.789117
+12
+-2.099907
+22
+-238.135010
+32
+0.392425
+13
+-2.099907
+23
+-238.135010
+33
+0.392425
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-87.276451
+20
+-238.135010
+30
+81.088670
+11
+-61.006751
+21
+-495.968699
+31
+-10.273786
+12
+-44.688124
+22
+-495.968699
+32
+40.740550
+13
+-44.688124
+23
+-495.968699
+33
+40.740550
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-2.099907
+20
+-238.135010
+30
+0.392425
+11
+58.906760
+21
+-495.968699
+31
+-20.514699
+12
+51.474977
+22
+-495.968699
+32
+32.527965
+13
+51.474977
+23
+-495.968699
+33
+32.527965
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-31.296514
+20
+495.968699
+30
+-54.839045
+11
+-61.006751
+21
+495.968699
+31
+-10.273786
+12
+-2.099907
+22
+391.784638
+32
+0.392425
+13
+-2.099907
+23
+391.784638
+33
+0.392425
+0
+3DFACE
+8
+0
+ 62
+55
+10
+119.913429
+20
+-238.135010
+30
+-41.421823
+11
+51.474977
+21
+-495.968699
+31
+32.527965
+12
+58.906760
+22
+-495.968699
+32
+-20.514699
+13
+58.906760
+23
+-495.968699
+33
+-20.514699
+0
+3DFACE
+8
+0
+ 62
+55
+10
+22.069970
+20
+495.968699
+30
+-59.396684
+11
+119.913429
+21
+391.784638
+31
+-41.421823
+12
+46.239849
+22
+391.784638
+32
+-119.185783
+13
+46.239849
+23
+391.784638
+33
+-119.185783
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-61.006751
+20
+495.968699
+30
+-10.273786
+11
+-60.493119
+21
+391.784638
+31
+-110.070519
+12
+-119.913481
+22
+391.784638
+32
+-20.939998
+13
+-119.913481
+23
+391.784638
+33
+-20.939998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-60.493119
+20
+391.784638
+30
+-110.070519
+11
+-61.006751
+21
+495.968699
+31
+-10.273786
+12
+-31.296514
+22
+495.968699
+32
+-54.839045
+13
+-31.296514
+23
+495.968699
+33
+-54.839045
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-44.688124
+20
+495.968699
+30
+40.740550
+11
+-61.006751
+21
+495.968699
+31
+-10.273786
+12
+-119.913481
+22
+391.784638
+32
+-20.939998
+13
+-119.913481
+23
+391.784638
+33
+-20.939998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+51.474977
+20
+495.968699
+30
+32.527965
+11
+-2.099907
+21
+391.784638
+31
+0.392425
+12
+5.370881
+22
+495.968699
+32
+59.789117
+13
+5.370881
+23
+495.968699
+33
+59.789117
+0
+3DFACE
+8
+0
+ 62
+55
+10
+119.913429
+20
+-238.135010
+30
+-41.421823
+11
+58.906760
+21
+-495.968699
+31
+-20.514699
+12
+46.239849
+22
+-238.135010
+32
+-119.185783
+13
+46.239849
+23
+-238.135010
+33
+-119.185783
+0
+3DFACE
+8
+0
+ 62
+55
+10
+22.069970
+20
+495.968699
+30
+-59.396684
+11
+-2.099907
+21
+391.784638
+31
+0.392425
+12
+58.906760
+22
+495.968699
+32
+-20.514699
+13
+58.906760
+23
+495.968699
+33
+-20.514699
+0
+3DFACE
+8
+0
+ 62
+55
+10
+12.841670
+20
+391.784638
+30
+119.185813
+11
+-87.276451
+21
+391.784638
+31
+81.088670
+12
+-87.276451
+22
+-238.135010
+32
+81.088670
+13
+-87.276451
+23
+-238.135010
+33
+81.088670
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-44.688124
+20
+495.968699
+30
+40.740550
+11
+-2.099907
+21
+391.784638
+31
+0.392425
+12
+-61.006751
+22
+495.968699
+32
+-10.273786
+13
+-61.006751
+23
+495.968699
+33
+-10.273786
+0
+3DFACE
+8
+0
+ 62
+55
+10
+105.049863
+20
+391.784638
+30
+64.663500
+11
+12.841670
+21
+-238.135010
+31
+119.185813
+12
+105.049863
+22
+-238.135010
+32
+64.663500
+13
+105.049863
+23
+-238.135010
+33
+64.663500
+0
+3DFACE
+8
+0
+ 62
+55
+10
+5.370881
+20
+495.968699
+30
+59.789117
+11
+-44.688124
+21
+495.968699
+31
+40.740550
+12
+-87.276451
+22
+391.784638
+32
+81.088670
+13
+-87.276451
+23
+391.784638
+33
+81.088670
+0
+3DFACE
+8
+0
+ 62
+55
+10
+46.239849
+20
+391.784638
+30
+-119.185783
+11
+-60.493119
+21
+391.784638
+31
+-110.070519
+12
+-31.296514
+22
+495.968699
+32
+-54.839045
+13
+-31.296514
+23
+495.968699
+33
+-54.839045
+0
+3DFACE
+8
+0
+ 62
+55
+10
+46.239849
+20
+391.784638
+30
+-119.185783
+11
+119.913429
+21
+-238.135010
+31
+-41.421823
+12
+46.239849
+22
+-238.135010
+32
+-119.185783
+13
+46.239849
+23
+-238.135010
+33
+-119.185783
+0
+3DFACE
+8
+0
+ 62
+55
+10
+58.906760
+20
+495.968699
+30
+-20.514699
+11
+105.049863
+21
+391.784638
+31
+64.663500
+12
+119.913429
+22
+391.784638
+32
+-41.421823
+13
+119.913429
+23
+391.784638
+33
+-41.421823
+0
+3DFACE
+8
+0
+ 62
+55
+10
+58.906760
+20
+495.968699
+30
+-20.514699
+11
+-2.099907
+21
+391.784638
+31
+0.392425
+12
+51.474977
+22
+495.968699
+32
+32.527965
+13
+51.474977
+23
+495.968699
+33
+32.527965
+0
+3DFACE
+8
+0
+ 62
+55
+10
+12.841670
+20
+-238.135010
+30
+119.185813
+11
+-44.688124
+21
+-495.968699
+31
+40.740550
+12
+5.370881
+22
+-495.968699
+32
+59.789117
+13
+5.370881
+23
+-495.968699
+33
+59.789117
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-119.913481
+20
+391.784638
+30
+-20.939998
+11
+-60.493119
+21
+-238.135010
+31
+-110.070519
+12
+-119.913481
+22
+-238.135010
+32
+-20.939998
+13
+-119.913481
+23
+-238.135010
+33
+-20.939998
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-87.276451
+20
+391.784638
+30
+81.088670
+11
+-119.913481
+21
+-238.135010
+31
+-20.939998
+12
+-87.276451
+22
+-238.135010
+32
+81.088670
+13
+-87.276451
+23
+-238.135010
+33
+81.088670
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-44.688124
+20
+495.968699
+30
+40.740550
+11
+-119.913481
+21
+391.784638
+31
+-20.939998
+12
+-87.276451
+22
+391.784638
+32
+81.088670
+13
+-87.276451
+23
+391.784638
+33
+81.088670
+0
+3DFACE
+8
+0
+ 62
+55
+10
+5.370881
+20
+495.968699
+30
+59.789117
+11
+-2.099907
+21
+391.784638
+31
+0.392425
+12
+-44.688124
+22
+495.968699
+32
+40.740550
+13
+-44.688124
+23
+495.968699
+33
+40.740550
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-119.913481
+20
+-238.135010
+30
+-20.939998
+11
+-31.296514
+21
+-495.968699
+31
+-54.839045
+12
+-61.006751
+22
+-495.968699
+32
+-10.273786
+13
+-61.006751
+23
+-495.968699
+33
+-10.273786
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-31.296514
+20
+-495.968699
+30
+-54.839045
+11
+-119.913481
+21
+-238.135010
+31
+-20.939998
+12
+-60.493119
+22
+-238.135010
+32
+-110.070519
+13
+-60.493119
+23
+-238.135010
+33
+-110.070519
+0
+3DFACE
+8
+0
+ 62
+55
+10
+5.370881
+20
+-495.968699
+30
+59.789117
+11
+-44.688124
+21
+-495.968699
+31
+40.740550
+12
+-2.099907
+22
+-238.135010
+32
+0.392425
+13
+-2.099907
+23
+-238.135010
+33
+0.392425
+0
+3DFACE
+8
+0
+ 62
+55
+10
+12.841670
+20
+-238.135010
+30
+119.185813
+11
+-87.276451
+21
+-238.135010
+31
+81.088670
+12
+-44.688124
+22
+-495.968699
+32
+40.740550
+13
+-44.688124
+23
+-495.968699
+33
+40.740550
+0
+3DFACE
+8
+0
+ 62
+55
+10
+12.841670
+20
+391.784638
+30
+119.185813
+11
+5.370881
+21
+495.968699
+31
+59.789117
+12
+-87.276451
+22
+391.784638
+32
+81.088670
+13
+-87.276451
+23
+391.784638
+33
+81.088670
+0
+3DFACE
+8
+0
+ 62
+55
+10
+105.049863
+20
+-238.135010
+30
+64.663500
+11
+5.370881
+21
+-495.968699
+31
+59.789117
+12
+51.474977
+22
+-495.968699
+32
+32.527965
+13
+51.474977
+23
+-495.968699
+33
+32.527965
+0
+3DFACE
+8
+0
+ 62
+55
+10
+119.913429
+20
+391.784638
+30
+-41.421823
+11
+119.913429
+21
+-238.135010
+31
+-41.421823
+12
+46.239849
+22
+391.784638
+32
+-119.185783
+13
+46.239849
+23
+391.784638
+33
+-119.185783
+0
+3DFACE
+8
+0
+ 62
+55
+10
+119.913429
+20
+391.784638
+30
+-41.421823
+11
+105.049863
+21
+-238.135010
+31
+64.663500
+12
+119.913429
+22
+-238.135010
+32
+-41.421823
+13
+119.913429
+23
+-238.135010
+33
+-41.421823
+0
+3DFACE
+8
+0
+ 62
+55
+10
+105.049863
+20
+391.784638
+30
+64.663500
+11
+12.841670
+21
+391.784638
+31
+119.185813
+12
+12.841670
+22
+-238.135010
+32
+119.185813
+13
+12.841670
+23
+-238.135010
+33
+119.185813
+0
+3DFACE
+8
+0
+ 62
+55
+10
+51.474977
+20
+495.968699
+30
+32.527965
+11
+105.049863
+21
+391.784638
+31
+64.663500
+12
+58.906760
+22
+495.968699
+32
+-20.514699
+13
+58.906760
+23
+495.968699
+33
+-20.514699
+0
+3DFACE
+8
+0
+ 62
+55
+10
+51.474977
+20
+495.968699
+30
+32.527965
+11
+5.370881
+21
+495.968699
+31
+59.789117
+12
+12.841670
+22
+391.784638
+32
+119.185813
+13
+12.841670
+23
+391.784638
+33
+119.185813
+0
+3DFACE
+8
+0
+ 62
+55
+10
+46.239849
+20
+-238.135010
+30
+-119.185783
+11
+58.906760
+21
+-495.968699
+31
+-20.514699
+12
+22.069970
+22
+-495.968699
+32
+-59.396684
+13
+22.069970
+23
+-495.968699
+33
+-59.396684
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster_knob.c b/hacks/glx/toaster_knob.c
new file mode 100644
index 0000000..d48b6ba
--- /dev/null
+++ b/hacks/glx/toaster_knob.c
@@ -0,0 +1,76 @@
+/* Generated from "toaster_knob.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_knob_data[] = {
+ 0.894098,0.012135,-0.447706,0.220972,-0.2059,-0.429683,
+ 0.894098,0.012135,-0.447706,0.372946,0.214524,-0.114788,
+ 0.894098,0.012135,-0.447706,0.372946,-0.21412,-0.126406,
+ 0.894098,0.012135,-0.447706,0.372946,0.214524,-0.114788,
+ 0.894098,0.012135,-0.447706,0.220972,-0.2059,-0.429683,
+ 0.894098,0.012135,-0.447706,0.220972,0.222744,-0.418065,
+ -0.999879,-0.000422,0.015577,-0.367658,0.209613,0.06637,
+ -0.999879,-0.000422,0.015577,-0.372946,-0.209838,-0.284406,
+ -0.999879,-0.000422,0.015577,-0.367658,-0.21903,0.054752,
+ -0.999879,-0.000422,0.015577,-0.372946,-0.209838,-0.284406,
+ -0.999879,-0.000422,0.015577,-0.367658,0.209613,0.06637,
+ -0.999879,-0.000422,0.015577,-0.372946,0.218806,-0.272788,
+ 0.907621,-0.011374,0.419637,0.372946,-0.21412,-0.126406,
+ 0.911978,-0.115261,0.393715,0.2305,0.206179,0.193077,
+ 0.907621,-0.011374,0.419637,0.2305,-0.222464,0.181458,
+ 0.911978,-0.115261,0.393715,0.2305,0.206179,0.193077,
+ 0.907621,-0.011374,0.419637,0.372946,-0.21412,-0.126406,
+ 0.907621,-0.011374,0.419637,0.372946,0.214524,-0.114788,
+ -0.611231,-0.021444,0.791162,-0.099099,-0.22465,0.262081,
+ -0.611231,-0.021444,0.791162,-0.367658,0.209613,0.06637,
+ -0.611231,-0.021444,0.791162,-0.367658,-0.21903,0.054752,
+ -0.611231,-0.021444,0.791162,-0.367658,0.209613,0.06637,
+ -0.611231,-0.021444,0.791162,-0.099099,-0.22465,0.262081,
+ -0.655778,-0.184059,0.732173,-0.099099,0.203994,0.2737,
+ -0,-0.999633,-0.027095,0.220972,-0.2059,-0.429683,
+ -0,-0.999633,-0.027095,-0.372946,-0.209838,-0.284406,
+ -0,-0.999633,-0.027096,-0.11098,-0.203994,-0.5,
+ -0,-0.999633,-0.027095,-0.372946,-0.209838,-0.284406,
+ -0,-0.999633,-0.027095,0.220972,-0.2059,-0.429683,
+ 0,-0.999633,-0.027094,0.372946,-0.21412,-0.126406,
+ -0,-0.999633,-0.027095,-0.372946,-0.209838,-0.284406,
+ 0,-0.999633,-0.027094,0.372946,-0.21412,-0.126406,
+ 0,-0.999633,-0.027095,-0.367658,-0.21903,0.054752,
+ 0,-0.999633,-0.027095,-0.367658,-0.21903,0.054752,
+ 0,-0.999633,-0.027094,0.372946,-0.21412,-0.126406,
+ 0,-0.999633,-0.027095,0.2305,-0.222464,0.181458,
+ 0,-0.999633,-0.027095,-0.367658,-0.21903,0.054752,
+ 0,-0.999633,-0.027095,0.2305,-0.222464,0.181458,
+ 0,-0.999633,-0.027095,0.065701,-0.223557,0.22177,
+ 0,-0.999633,-0.027095,-0.367658,-0.21903,0.054752,
+ 0,-0.999633,-0.027095,0.065701,-0.223557,0.22177,
+ 0,-0.999633,-0.027095,-0.099099,-0.22465,0.262081,
+ -0.635597,0.020918,-0.771737,-0.11098,0.22465,-0.488382,
+ -0.635597,0.020918,-0.771737,-0.372946,-0.209838,-0.284406,
+ -0.635597,0.020918,-0.771737,-0.372946,0.218806,-0.272788,
+ -0.635597,0.020918,-0.771737,-0.372946,-0.209838,-0.284406,
+ -0.635597,0.020918,-0.771737,-0.11098,0.22465,-0.488382,
+ -0.635597,0.020918,-0.771737,-0.11098,-0.203994,-0.5,
+ 0.207302,0.026506,-0.977918,0.220972,0.222744,-0.418065,
+ 0.207302,0.026506,-0.977918,-0.11098,-0.203994,-0.5,
+ 0.207302,0.026506,-0.977918,-0.11098,0.22465,-0.488382,
+ 0.207302,0.026506,-0.977918,-0.11098,-0.203994,-0.5,
+ 0.207302,0.026506,-0.977918,0.220972,0.222744,-0.418065,
+ 0.207302,0.026506,-0.977918,0.220972,-0.2059,-0.429683,
+ 0.237686,-0.026318,0.970985,0.065701,-0.223557,0.22177,
+ 0.237686,-0.026318,0.970985,-0.099099,0.203994,0.2737,
+ 0.237686,-0.026318,0.970985,-0.099099,-0.22465,0.262081,
+ -0.6794,-0.340802,0.649823,0.116801,0.205086,0.5,
+ -0.655778,-0.184059,0.732173,-0.099099,0.203994,0.2737,
+ -0.6794,-0.340802,0.649823,0.065701,-0.223557,0.22177,
+ 0.237686,-0.026318,0.970985,0.2305,0.206179,0.193077,
+ 0.237686,-0.026318,0.970985,0.065701,-0.223557,0.22177,
+ 0.237686,-0.026318,0.970985,0.2305,-0.222464,0.181458,
+ 0.911978,-0.115261,0.393715,0.2305,0.206179,0.193077,
+ 0.88909,-0.319042,0.328226,0.116801,0.205086,0.5,
+ 0.88909,-0.319042,0.328226,0.065701,-0.223557,0.22177
+};
+static const struct gllist toaster_knob_frame = { GL_N3F_V3F, GL_TRIANGLES, 66, toaster_knob_data, 0 };
+const struct gllist *toaster_knob = &toaster_knob_frame;
diff --git a/hacks/glx/toaster_knob.dxf b/hacks/glx/toaster_knob.dxf
new file mode 100644
index 0000000..b0053e1
--- /dev/null
+++ b/hacks/glx/toaster_knob.dxf
@@ -0,0 +1,674 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+6.216122
+20
+-5.792122
+30
+-12.087326
+11
+10.491247
+21
+6.034714
+31
+-3.229065
+12
+10.491247
+22
+-6.023361
+32
+-3.555895
+13
+10.491247
+23
+-6.023361
+33
+-3.555895
+0
+3DFACE
+8
+0
+ 62
+55
+10
+10.491247
+20
+6.034714
+30
+-3.229065
+11
+6.216122
+21
+-5.792122
+31
+-12.087326
+12
+6.216122
+22
+6.265953
+32
+-11.760496
+13
+6.216122
+23
+6.265953
+33
+-11.760496
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.342501
+20
+5.896584
+30
+1.867052
+11
+-10.491246
+21
+-5.902893
+31
+-8.000555
+12
+-10.342501
+22
+-6.161491
+32
+1.540224
+13
+-10.342501
+23
+-6.161491
+33
+1.540224
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.491246
+20
+-5.902893
+30
+-8.000555
+11
+-10.342501
+21
+5.896584
+31
+1.867052
+12
+-10.491246
+22
+6.155182
+32
+-7.673727
+13
+-10.491246
+23
+6.155182
+33
+-7.673727
+0
+3DFACE
+8
+0
+ 62
+55
+10
+10.491247
+20
+-6.023361
+30
+-3.555895
+11
+6.484152
+21
+5.799973
+31
+5.431395
+12
+6.484152
+22
+-6.258095
+32
+5.104565
+13
+6.484152
+23
+-6.258095
+33
+5.104565
+0
+3DFACE
+8
+0
+ 62
+55
+10
+6.484152
+20
+5.799973
+30
+5.431395
+11
+10.491247
+21
+-6.023361
+31
+-3.555895
+12
+10.491247
+22
+6.034714
+32
+-3.229065
+13
+10.491247
+23
+6.034714
+33
+-3.229065
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-2.787737
+20
+-6.319573
+30
+7.372553
+11
+-10.342501
+21
+5.896584
+31
+1.867052
+12
+-10.342501
+22
+-6.161491
+32
+1.540224
+13
+-10.342501
+23
+-6.161491
+33
+1.540224
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.342501
+20
+5.896584
+30
+1.867052
+11
+-2.787737
+21
+-6.319573
+31
+7.372553
+12
+-2.787737
+22
+5.738503
+32
+7.699381
+13
+-2.787737
+23
+5.738503
+33
+7.699381
+0
+3DFACE
+8
+0
+ 62
+55
+10
+6.216122
+20
+-5.792122
+30
+-12.087326
+11
+-10.491246
+21
+-5.902893
+31
+-8.000555
+12
+-3.121965
+22
+-5.738503
+32
+-14.065386
+13
+-3.121965
+23
+-5.738503
+33
+-14.065386
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.491246
+20
+-5.902893
+30
+-8.000555
+11
+6.216122
+21
+-5.792122
+31
+-12.087326
+12
+10.491247
+22
+-6.023361
+32
+-3.555895
+13
+10.491247
+23
+-6.023361
+33
+-3.555895
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.491246
+20
+-5.902893
+30
+-8.000555
+11
+10.491247
+21
+-6.023361
+31
+-3.555895
+12
+-10.342501
+22
+-6.161491
+32
+1.540224
+13
+-10.342501
+23
+-6.161491
+33
+1.540224
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.342501
+20
+-6.161491
+30
+1.540224
+11
+10.491247
+21
+-6.023361
+31
+-3.555895
+12
+6.484152
+22
+-6.258095
+32
+5.104565
+13
+6.484152
+23
+-6.258095
+33
+5.104565
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.342501
+20
+-6.161491
+30
+1.540224
+11
+6.484152
+21
+-6.258095
+31
+5.104565
+12
+1.848208
+22
+-6.288834
+32
+6.238558
+13
+1.848208
+23
+-6.288834
+33
+6.238558
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.342501
+20
+-6.161491
+30
+1.540224
+11
+1.848208
+21
+-6.288834
+31
+6.238558
+12
+-2.787737
+22
+-6.319573
+32
+7.372553
+13
+-2.787737
+23
+-6.319573
+33
+7.372553
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-3.121965
+20
+6.319565
+30
+-13.738557
+11
+-10.491246
+21
+-5.902893
+31
+-8.000555
+12
+-10.491246
+22
+6.155182
+32
+-7.673727
+13
+-10.491246
+23
+6.155182
+33
+-7.673727
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-10.491246
+20
+-5.902893
+30
+-8.000555
+11
+-3.121965
+21
+6.319565
+31
+-13.738557
+12
+-3.121965
+22
+-5.738503
+32
+-14.065386
+13
+-3.121965
+23
+-5.738503
+33
+-14.065386
+0
+3DFACE
+8
+0
+ 62
+55
+10
+6.216122
+20
+6.265953
+30
+-11.760496
+11
+-3.121965
+21
+-5.738503
+31
+-14.065386
+12
+-3.121965
+22
+6.319565
+32
+-13.738557
+13
+-3.121965
+23
+6.319565
+33
+-13.738557
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-3.121965
+20
+-5.738503
+30
+-14.065386
+11
+6.216122
+21
+6.265953
+31
+-11.760496
+12
+6.216122
+22
+-5.792122
+32
+-12.087326
+13
+6.216122
+23
+-5.792122
+33
+-12.087326
+0
+3DFACE
+8
+0
+ 62
+55
+10
+1.848208
+20
+-6.288834
+30
+6.238558
+11
+-2.787737
+21
+5.738503
+31
+7.699381
+12
+-2.787737
+22
+-6.319573
+32
+7.372553
+13
+-2.787737
+23
+-6.319573
+33
+7.372553
+0
+3DFACE
+8
+0
+ 62
+55
+10
+3.285708
+20
+5.769234
+30
+14.065386
+11
+-2.787737
+21
+5.738503
+31
+7.699381
+12
+1.848208
+22
+-6.288834
+32
+6.238558
+13
+1.848208
+23
+-6.288834
+33
+6.238558
+0
+3DFACE
+8
+0
+ 62
+55
+10
+6.484152
+20
+5.799973
+30
+5.431395
+11
+1.848208
+21
+-6.288834
+31
+6.238558
+12
+6.484152
+22
+-6.258095
+32
+5.104565
+13
+6.484152
+23
+-6.258095
+33
+5.104565
+0
+3DFACE
+8
+0
+ 62
+55
+10
+6.484152
+20
+5.799973
+30
+5.431395
+11
+3.285708
+21
+5.769234
+31
+14.065386
+12
+1.848208
+22
+-6.288834
+32
+6.238558
+13
+1.848208
+23
+-6.288834
+33
+6.238558
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster_slots.c b/hacks/glx/toaster_slots.c
new file mode 100644
index 0000000..aaf7b23
--- /dev/null
+++ b/hacks/glx/toaster_slots.c
@@ -0,0 +1,106 @@
+/* Generated from "toaster_slots.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_slots_data[] = {
+ 0.999485,-0.028052,-0.015598,-0.18331,-0.276766,0.209005,
+ 0.998257,-0.059011,0,-0.196507,-0.5,0.123502,
+ 0.99963,-0.0187,-0.019753,-0.196507,-0.5,-0.235113,
+ 0.999546,0,-0.030136,-0.18331,0,0.235113,
+ 0.999485,-0.028052,-0.015598,-0.18331,-0.276766,0.209005,
+ 0.99963,-0.0187,-0.019753,-0.196507,-0.5,-0.235113,
+ 0,1,0,-0.059418,-0.5,0.123502,
+ 0,1,0,-0.058641,-0.5,-0.235113,
+ 0,1,0,-0.196507,-0.5,-0.235113,
+ 0,1,0,-0.059418,-0.5,0.123502,
+ 0,1,0,-0.196507,-0.5,-0.235113,
+ 0,1,0,-0.196507,-0.5,0.123502,
+ 0.998257,0.059011,0,-0.196507,0.5,0.123502,
+ 0.999485,0.028052,-0.015598,-0.18331,0.276766,0.209005,
+ 0.99963,0.0187,-0.019753,-0.196507,0.5,-0.235113,
+ 0.99963,0.0187,-0.019753,-0.196507,0.5,-0.235113,
+ 0.999485,0.028052,-0.015598,-0.18331,0.276766,0.209005,
+ 0.999546,0,-0.030136,-0.18331,0,0.235113,
+ 0,-1,0,-0.196507,0.5,0.123502,
+ 0,-1,0,-0.196507,0.5,-0.235113,
+ 0,-1,0,-0.059418,0.5,0.123502,
+ 0.99963,0.0187,-0.019753,-0.196507,0.5,-0.235113,
+ 0.999546,0,-0.030136,-0.18331,0,0.235113,
+ 0.99963,-0.0187,-0.019753,-0.196507,-0.5,-0.235113,
+ -0.999997,-0.001316,-0.001828,-0.058641,0.5,-0.235113,
+ -0.999998,0,-0.002211,-0.058641,0,0.235113,
+ -0.999994,-0.001974,-0.002741,-0.059418,0.276766,0.209005,
+ -0.999994,0.001974,-0.002741,-0.059418,-0.276766,0.209005,
+ -0.999997,0.001316,-0.001828,-0.058641,-0.5,-0.235113,
+ -0.999997,0.00083,-0.002166,-0.059418,-0.5,0.123502,
+ -0.999998,0,-0.002211,-0.058641,0,0.235113,
+ -0.999997,0.001316,-0.001828,-0.058641,-0.5,-0.235113,
+ -0.999994,0.001974,-0.002741,-0.059418,-0.276766,0.209005,
+ -0.999997,-0.001316,-0.001828,-0.058641,0.5,-0.235113,
+ -0.999997,0.001316,-0.001828,-0.058641,-0.5,-0.235113,
+ -0.999998,0,-0.002211,-0.058641,0,0.235113,
+ 0,0,1,-0.058641,-0.5,-0.235113,
+ 0,0,1,-0.058641,0.5,-0.235113,
+ 0,0,1,-0.196507,0.5,-0.235113,
+ 0,0,1,-0.058641,-0.5,-0.235113,
+ 0,0,1,-0.196507,0.5,-0.235113,
+ 0,0,1,-0.196507,-0.5,-0.235113,
+ 0,-1,0,-0.059418,0.5,0.123502,
+ 0,-1,0,-0.196507,0.5,-0.235113,
+ 0,-1,0,-0.058641,0.5,-0.235113,
+ -0.999997,-0.001316,-0.001828,-0.058641,0.5,-0.235113,
+ -0.999994,-0.001974,-0.002741,-0.059418,0.276766,0.209005,
+ -0.999997,-0.00083,-0.002166,-0.059418,0.5,0.123502,
+ 0.999997,-0.001316,-0.001828,0.058641,0.5,-0.235113,
+ 0.999998,0,-0.002211,0.058641,0,0.235113,
+ 0.999997,0.001316,-0.001828,0.058641,-0.5,-0.235113,
+ 0.999994,0.001974,-0.002741,0.059418,-0.276766,0.209005,
+ 0.999997,0.00083,-0.002166,0.059418,-0.5,0.123502,
+ 0.999997,0.001316,-0.001828,0.058641,-0.5,-0.235113,
+ 0.999997,-0.001316,-0.001828,0.058641,0.5,-0.235113,
+ 0.999994,-0.001974,-0.002741,0.059418,0.276766,0.209005,
+ 0.999998,0,-0.002211,0.058641,0,0.235113,
+ 0.999998,0,-0.002211,0.058641,0,0.235113,
+ 0.999994,0.001974,-0.002741,0.059418,-0.276766,0.209005,
+ 0.999997,0.001316,-0.001828,0.058641,-0.5,-0.235113,
+ -0.99963,0.0187,-0.019753,0.196507,0.5,-0.235113,
+ -0.999485,0.028052,-0.015598,0.18331,0.276766,0.209005,
+ -0.998257,0.059011,0,0.196507,0.5,0.123502,
+ -0.999546,0,-0.030136,0.18331,0,0.235113,
+ -0.99963,-0.0187,-0.019753,0.196507,-0.5,-0.235113,
+ -0.999485,-0.028052,-0.015598,0.18331,-0.276766,0.209005,
+ 0,1,0,0.059418,-0.5,0.123502,
+ 0,1,0,0.196507,-0.5,-0.235113,
+ 0,1,0,0.058641,-0.5,-0.235113,
+ -0.999485,-0.028052,-0.015598,0.18331,-0.276766,0.209005,
+ -0.99963,-0.0187,-0.019753,0.196507,-0.5,-0.235113,
+ -0.998257,-0.059011,0,0.196507,-0.5,0.123502,
+ 0,-1,0,0.059418,0.5,0.123502,
+ 0,-1,0,0.196507,0.5,-0.235113,
+ 0,-1,0,0.196507,0.5,0.123502,
+ 0,1,0,0.196507,-0.5,0.123502,
+ 0,1,0,0.196507,-0.5,-0.235113,
+ 0,1,0,0.059418,-0.5,0.123502,
+ -0.99963,0.0187,-0.019753,0.196507,0.5,-0.235113,
+ -0.999546,0,-0.030136,0.18331,0,0.235113,
+ -0.999485,0.028052,-0.015598,0.18331,0.276766,0.209005,
+ -0.99963,0.0187,-0.019753,0.196507,0.5,-0.235113,
+ -0.99963,-0.0187,-0.019753,0.196507,-0.5,-0.235113,
+ -0.999546,0,-0.030136,0.18331,0,0.235113,
+ 0,0,1,0.196507,0.5,-0.235113,
+ 0,0,1,0.058641,-0.5,-0.235113,
+ 0,0,1,0.196507,-0.5,-0.235113,
+ 0,0,1,0.196507,0.5,-0.235113,
+ 0,0,1,0.058641,0.5,-0.235113,
+ 0,0,1,0.058641,-0.5,-0.235113,
+ 0.999997,-0.00083,-0.002166,0.059418,0.5,0.123502,
+ 0.999994,-0.001974,-0.002741,0.059418,0.276766,0.209005,
+ 0.999997,-0.001316,-0.001828,0.058641,0.5,-0.235113,
+ 0,-1,0,0.059418,0.5,0.123502,
+ 0,-1,0,0.058641,0.5,-0.235113,
+ 0,-1,0,0.196507,0.5,-0.235113
+};
+static const struct gllist toaster_slots_frame = { GL_N3F_V3F, GL_TRIANGLES, 96, toaster_slots_data, 0 };
+const struct gllist *toaster_slots = &toaster_slots_frame;
diff --git a/hacks/glx/toaster_slots.dxf b/hacks/glx/toaster_slots.dxf
new file mode 100644
index 0000000..3f17b58
--- /dev/null
+++ b/hacks/glx/toaster_slots.dxf
@@ -0,0 +1,974 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-156.295180
+20
+-235.978112
+30
+178.203195
+11
+-167.546690
+21
+-426.312745
+31
+105.301157
+12
+-167.546690
+22
+-426.312745
+32
+-200.463355
+13
+-167.546690
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-156.295180
+20
+0.000001
+30
+200.463355
+11
+-156.295180
+21
+-235.978112
+31
+178.203195
+12
+-167.546690
+22
+-426.312745
+32
+-200.463355
+13
+-167.546690
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-50.661352
+20
+-426.312745
+30
+105.301157
+11
+-49.999118
+21
+-426.312745
+31
+-200.463355
+12
+-167.546690
+22
+-426.312745
+32
+-200.463355
+13
+-167.546690
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-50.661352
+20
+-426.312745
+30
+105.301157
+11
+-167.546690
+21
+-426.312745
+31
+-200.463355
+12
+-167.546690
+22
+-426.312745
+32
+105.301157
+13
+-167.546690
+23
+-426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-167.546690
+20
+426.312745
+30
+105.301157
+11
+-156.295180
+21
+235.978127
+31
+178.203195
+12
+-167.546690
+22
+426.312745
+32
+-200.463355
+13
+-167.546690
+23
+426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-167.546690
+20
+426.312745
+30
+-200.463355
+11
+-156.295180
+21
+235.978127
+31
+178.203195
+12
+-156.295180
+22
+0.000001
+32
+200.463355
+13
+-156.295180
+23
+0.000001
+33
+200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-167.546690
+20
+426.312745
+30
+105.301157
+11
+-167.546690
+21
+426.312745
+31
+-200.463355
+12
+-50.661352
+22
+426.312745
+32
+105.301157
+13
+-50.661352
+23
+426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-167.546690
+20
+426.312745
+30
+-200.463355
+11
+-156.295180
+21
+0.000001
+31
+200.463355
+12
+-167.546690
+22
+-426.312745
+32
+-200.463355
+13
+-167.546690
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.999118
+20
+426.312745
+30
+-200.463355
+11
+-49.999118
+21
+0.000001
+31
+200.463355
+12
+-50.661352
+22
+235.978127
+32
+178.203195
+13
+-50.661352
+23
+235.978127
+33
+178.203195
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-50.661352
+20
+-235.978112
+30
+178.203195
+11
+-49.999118
+21
+-426.312745
+31
+-200.463355
+12
+-50.661352
+22
+-426.312745
+32
+105.301157
+13
+-50.661352
+23
+-426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.999118
+20
+0.000001
+30
+200.463355
+11
+-49.999118
+21
+-426.312745
+31
+-200.463355
+12
+-50.661352
+22
+-235.978112
+32
+178.203195
+13
+-50.661352
+23
+-235.978112
+33
+178.203195
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.999118
+20
+426.312745
+30
+-200.463355
+11
+-49.999118
+21
+-426.312745
+31
+-200.463355
+12
+-49.999118
+22
+0.000001
+32
+200.463355
+13
+-49.999118
+23
+0.000001
+33
+200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.999118
+20
+-426.312745
+30
+-200.463355
+11
+-49.999118
+21
+426.312745
+31
+-200.463355
+12
+-167.546690
+22
+426.312745
+32
+-200.463355
+13
+-167.546690
+23
+426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.999118
+20
+-426.312745
+30
+-200.463355
+11
+-167.546690
+21
+426.312745
+31
+-200.463355
+12
+-167.546690
+22
+-426.312745
+32
+-200.463355
+13
+-167.546690
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-50.661352
+20
+426.312745
+30
+105.301157
+11
+-167.546690
+21
+426.312745
+31
+-200.463355
+12
+-49.999118
+22
+426.312745
+32
+-200.463355
+13
+-49.999118
+23
+426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+-49.999118
+20
+426.312745
+30
+-200.463355
+11
+-50.661352
+21
+235.978127
+31
+178.203195
+12
+-50.661352
+22
+426.312745
+32
+105.301157
+13
+-50.661352
+23
+426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.999110
+20
+426.312745
+30
+-200.463355
+11
+49.999110
+21
+0.000001
+31
+200.463355
+12
+49.999110
+22
+-426.312745
+32
+-200.463355
+13
+49.999110
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+50.661348
+20
+-235.978112
+30
+178.203195
+11
+50.661348
+21
+-426.312745
+31
+105.301157
+12
+49.999110
+22
+-426.312745
+32
+-200.463355
+13
+49.999110
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.999110
+20
+426.312745
+30
+-200.463355
+11
+50.661348
+21
+235.978127
+31
+178.203195
+12
+49.999110
+22
+0.000001
+32
+200.463355
+13
+49.999110
+23
+0.000001
+33
+200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+49.999110
+20
+0.000001
+30
+200.463355
+11
+50.661348
+21
+-235.978112
+31
+178.203195
+12
+49.999110
+22
+-426.312745
+32
+-200.463355
+13
+49.999110
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+167.546690
+20
+426.312745
+30
+-200.463355
+11
+156.295151
+21
+235.978127
+31
+178.203195
+12
+167.546690
+22
+426.312745
+32
+105.301157
+13
+167.546690
+23
+426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+156.295151
+20
+0.000001
+30
+200.463355
+11
+167.546690
+21
+-426.312745
+31
+-200.463355
+12
+156.295151
+22
+-235.978112
+32
+178.203195
+13
+156.295151
+23
+-235.978112
+33
+178.203195
+0
+3DFACE
+8
+0
+ 62
+55
+10
+50.661348
+20
+-426.312745
+30
+105.301157
+11
+167.546690
+21
+-426.312745
+31
+-200.463355
+12
+49.999110
+22
+-426.312745
+32
+-200.463355
+13
+49.999110
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+156.295151
+20
+-235.978112
+30
+178.203195
+11
+167.546690
+21
+-426.312745
+31
+-200.463355
+12
+167.546690
+22
+-426.312745
+32
+105.301157
+13
+167.546690
+23
+-426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+50.661348
+20
+426.312745
+30
+105.301157
+11
+167.546690
+21
+426.312745
+31
+-200.463355
+12
+167.546690
+22
+426.312745
+32
+105.301157
+13
+167.546690
+23
+426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+167.546690
+20
+-426.312745
+30
+105.301157
+11
+167.546690
+21
+-426.312745
+31
+-200.463355
+12
+50.661348
+22
+-426.312745
+32
+105.301157
+13
+50.661348
+23
+-426.312745
+33
+105.301157
+0
+3DFACE
+8
+0
+ 62
+55
+10
+167.546690
+20
+426.312745
+30
+-200.463355
+11
+156.295151
+21
+0.000001
+31
+200.463355
+12
+156.295151
+22
+235.978127
+32
+178.203195
+13
+156.295151
+23
+235.978127
+33
+178.203195
+0
+3DFACE
+8
+0
+ 62
+55
+10
+167.546690
+20
+426.312745
+30
+-200.463355
+11
+167.546690
+21
+-426.312745
+31
+-200.463355
+12
+156.295151
+22
+0.000001
+32
+200.463355
+13
+156.295151
+23
+0.000001
+33
+200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+167.546690
+20
+426.312745
+30
+-200.463355
+11
+49.999110
+21
+-426.312745
+31
+-200.463355
+12
+167.546690
+22
+-426.312745
+32
+-200.463355
+13
+167.546690
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+167.546690
+20
+426.312745
+30
+-200.463355
+11
+49.999110
+21
+426.312745
+31
+-200.463355
+12
+49.999110
+22
+-426.312745
+32
+-200.463355
+13
+49.999110
+23
+-426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+50.661348
+20
+426.312745
+30
+105.301157
+11
+50.661348
+21
+235.978127
+31
+178.203195
+12
+49.999110
+22
+426.312745
+32
+-200.463355
+13
+49.999110
+23
+426.312745
+33
+-200.463355
+0
+3DFACE
+8
+0
+ 62
+55
+10
+50.661348
+20
+426.312745
+30
+105.301157
+11
+49.999110
+21
+426.312745
+31
+-200.463355
+12
+167.546690
+22
+426.312745
+32
+-200.463355
+13
+167.546690
+23
+426.312745
+33
+-200.463355
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/toaster_wing.c b/hacks/glx/toaster_wing.c
new file mode 100644
index 0000000..48ce601
--- /dev/null
+++ b/hacks/glx/toaster_wing.c
@@ -0,0 +1,43 @@
+/* Generated from "toaster_wing.dxf" on Aug-22-2014.
+ Smoothed vertex normals. Normalized to unit bounding box.
+ */
+
+#include "gllist.h"
+
+static const float toaster_wing_data[] = {
+ -0.0018,-0.000471,-0.999998,0.5,-0.248054,-0.034832,
+ -0.002699,-0.000707,-0.999996,-0.5,0.248054,-0.032483,
+ -0.001465,-0.000586,-0.999999,0.399306,0.003521,-0.034832,
+ 0.301513,0.649532,0.697996,0.399306,0.003521,-0.034832,
+ 0.159005,0.609129,0.776968,-0.5,0.248054,-0.032483,
+ 0.244597,0.610231,0.753518,0.3827,-0.039065,0.01197,
+ 0.172439,-0.122105,0.977423,0.5,-0.248054,-0.034832,
+ 0.064485,-0.135273,0.988708,0.3827,-0.039065,0.01197,
+ -0.040003,-0.177228,0.983357,-0.466673,-0.094003,-0.032483,
+ -0.0018,-0.000471,-0.999998,0.5,-0.248054,-0.034832,
+ -0.002468,-0.00024,-0.999997,-0.466673,-0.094003,-0.032483,
+ -0.002699,-0.000707,-0.999996,-0.5,0.248054,-0.032483,
+ 0.064485,-0.135273,0.988708,0.3827,-0.039065,0.01197,
+ -0.051938,-0.00506,0.998637,-0.5,0.248054,-0.032483,
+ -0.040003,-0.177228,0.983357,-0.466673,-0.094003,-0.032483,
+ 0.064485,-0.135273,0.988708,0.3827,-0.039065,0.01197,
+ -0.031687,-0.285224,0.957937,-0.482606,0.13385,0.034832,
+ -0.040003,-0.177228,0.983357,-0.466673,-0.094003,-0.032483,
+ 0.370589,0,0.928797,0.5,-0.065307,-0.034832,
+ 0.064485,-0.135273,0.988708,0.3827,-0.039065,0.01197,
+ 0.172439,-0.122105,0.977423,0.5,-0.248054,-0.034832,
+ 0.244597,0.610231,0.753518,0.3827,-0.039065,0.01197,
+ 0.159005,0.609129,0.776968,-0.5,0.248054,-0.032483,
+ 0.125848,0.517903,0.846131,-0.482606,0.13385,0.034832,
+ -0.772167,-0.309062,-0.555193,0.399306,0.003521,-0.034832,
+ -0.772167,-0.309062,-0.555193,0.5,-0.248054,-0.034832,
+ -0.772167,-0.309062,-0.555193,0.3827,-0.039065,0.01197,
+ 0.408832,0.598113,0.689287,0.5,-0.065307,-0.034832,
+ 0.301513,0.649532,0.697996,0.399306,0.003521,-0.034832,
+ 0.244597,0.610231,0.753518,0.3827,-0.039065,0.01197,
+ -0.0018,-0.000471,-0.999998,0.5,-0.248054,-0.034832,
+ -0.001465,-0.000586,-0.999999,0.399306,0.003521,-0.034832,
+ 0,0,-1,0.5,-0.065307,-0.034832
+};
+static const struct gllist toaster_wing_frame = { GL_N3F_V3F, GL_TRIANGLES, 33, toaster_wing_data, 0 };
+const struct gllist *toaster_wing = &toaster_wing_frame;
diff --git a/hacks/glx/toaster_wing.dxf b/hacks/glx/toaster_wing.dxf
new file mode 100644
index 0000000..c5166a3
--- /dev/null
+++ b/hacks/glx/toaster_wing.dxf
@@ -0,0 +1,344 @@
+0
+SECTION
+2
+HEADER
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+3DFACE
+8
+0
+ 62
+55
+10
+447.039068
+20
+-221.779630
+30
+-31.142678
+11
+-447.039098
+21
+221.779630
+31
+-29.042747
+12
+357.011020
+22
+3.148119
+32
+-31.142678
+13
+357.011020
+23
+3.148119
+33
+-31.142678
+0
+3DFACE
+8
+0
+ 62
+55
+10
+357.011020
+20
+3.148119
+30
+-31.142678
+11
+-447.039098
+21
+221.779630
+31
+-29.042747
+12
+342.163920
+22
+-34.927092
+32
+10.702347
+13
+342.163920
+23
+-34.927092
+33
+10.702347
+0
+3DFACE
+8
+0
+ 62
+55
+10
+447.039068
+20
+-221.779630
+30
+-31.142678
+11
+342.163920
+21
+-34.927092
+31
+10.702347
+12
+-417.241931
+22
+-84.046043
+32
+-29.042747
+13
+-417.241931
+23
+-84.046043
+33
+-29.042747
+0
+3DFACE
+8
+0
+ 62
+55
+10
+447.039068
+20
+-221.779630
+30
+-31.142678
+11
+-417.241931
+21
+-84.046043
+31
+-29.042747
+12
+-447.039098
+22
+221.779630
+32
+-29.042747
+13
+-447.039098
+23
+221.779630
+33
+-29.042747
+0
+3DFACE
+8
+0
+ 62
+55
+10
+342.163920
+20
+-34.927092
+30
+10.702347
+11
+-447.039098
+21
+221.779630
+31
+-29.042747
+12
+-417.241931
+22
+-84.046043
+32
+-29.042747
+13
+-417.241931
+23
+-84.046043
+33
+-29.042747
+0
+3DFACE
+8
+0
+ 62
+55
+10
+342.163920
+20
+-34.927092
+30
+10.702347
+11
+-431.487292
+21
+119.671926
+31
+31.142659
+12
+-417.241931
+22
+-84.046043
+32
+-29.042747
+13
+-417.241931
+23
+-84.046043
+33
+-29.042747
+0
+3DFACE
+8
+0
+ 62
+55
+10
+447.039068
+20
+-58.389261
+30
+-31.142678
+11
+342.163920
+21
+-34.927092
+31
+10.702347
+12
+447.039068
+22
+-221.779630
+32
+-31.142678
+13
+447.039068
+23
+-221.779630
+33
+-31.142678
+0
+3DFACE
+8
+0
+ 62
+55
+10
+342.163920
+20
+-34.927092
+30
+10.702347
+11
+-447.039098
+21
+221.779630
+31
+-29.042747
+12
+-431.487292
+22
+119.671926
+32
+31.142659
+13
+-431.487292
+23
+119.671926
+33
+31.142659
+0
+3DFACE
+8
+0
+ 62
+55
+10
+357.011020
+20
+3.148119
+30
+-31.142678
+11
+447.039068
+21
+-221.779630
+31
+-31.142678
+12
+342.163920
+22
+-34.927092
+32
+10.702347
+13
+342.163920
+23
+-34.927092
+33
+10.702347
+0
+3DFACE
+8
+0
+ 62
+55
+10
+447.039068
+20
+-58.389261
+30
+-31.142678
+11
+357.011020
+21
+3.148119
+31
+-31.142678
+12
+342.163920
+22
+-34.927092
+32
+10.702347
+13
+342.163920
+23
+-34.927092
+33
+10.702347
+0
+3DFACE
+8
+0
+ 62
+55
+10
+447.039068
+20
+-221.779630
+30
+-31.142678
+11
+357.011020
+21
+3.148119
+31
+-31.142678
+12
+447.039068
+22
+-58.389261
+32
+-31.142678
+13
+447.039068
+23
+-58.389261
+33
+-31.142678
+0
+ENDSEC
+0
+EOF
diff --git a/hacks/glx/topblock.c b/hacks/glx/topblock.c
new file mode 100644
index 0000000..9161d38
--- /dev/null
+++ b/hacks/glx/topblock.c
@@ -0,0 +1,883 @@
+/* topblock, Copyright (c) 2006-2012 rednuht <topblock.xscreensaver@jumpstation.co.uk>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ *
+ *
+
+topBlock - a simple openGL 3D hack of falling blocks
+based on jwz's dangerball hack
+
+The proporations of the blocks and their features is not even close to the commercial building block products offered by a variety companies.
+
+information on this hack might be found at
+http://www.jumpstation.co.uk/xscreensaver/topblock/
+
+History
+25/02/2006 v1.0 release
+29/04/2006 v1.11 updated to better fit with xscreensaver v5
+ colors defaults to 7 (no black)
+19/06/2006 v1.2 fixed dropSpeed = 7 bug, added gltrackball support and some code neatening, thanks to Valdis Kletnieks and JWZ for their input.
+*/
+
+#include <math.h>
+
+# define release_topBlock 0
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "topblock.h"
+#include "sphere.h"
+#include "tube.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#ifndef HAVE_JWXYZ
+# include <GL/glu.h>
+#endif
+
+typedef struct
+{
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ GLfloat rotateSpeed;
+ GLfloat dropSpeed;
+ int maxFalling;
+ int resolution;
+ Bool button_down_p;
+ int numFallingBlocks;
+ GLfloat highest,highestFalling;
+ GLfloat eyeLine,eyeX,eyeY,eyeZ;
+ int carpetWidth, carpetLength;
+ int followMode;
+ GLfloat followRadius,followAngle;
+ int plusheight;
+ GLuint carpet;
+ GLuint block;
+ int carpet_polys, block_polys;
+ NODE *blockNodeRoot;
+ NODE *blockNodeFollow;
+ GLfloat rotation;
+} topBlockSTATE;
+
+/* parameter vars */
+static Bool override;
+static Bool rotate;
+static Bool follow;
+static Bool drawCarpet;
+static Bool drawBlob;
+static Bool drawNipples;
+static GLfloat rotateSpeed;
+static GLfloat camX;
+static GLfloat camY;
+static GLfloat camZ;
+static GLfloat dropSpeed;
+static int maxFalling;
+static int maxColors;
+static int size;
+static int spawn;
+static int resolution;
+
+static XrmOptionDescRec opts[] = {
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-spawn", ".spawn", XrmoptionSepArg, 0 },
+ { "-camX", ".camX", XrmoptionSepArg, 0 },
+ { "-camY", ".camY", XrmoptionSepArg, 0 },
+ { "-camZ", ".camZ", XrmoptionSepArg, 0 },
+ { "+rotate", ".rotate", XrmoptionNoArg, "False" },
+ { "-rotate", ".rotate", XrmoptionNoArg, "True" },
+ { "+carpet", ".carpet", XrmoptionNoArg, "False" },
+ { "+nipples", ".nipples", XrmoptionNoArg, "False" },
+ { "-blob", ".blob", XrmoptionNoArg, "True" },
+ { "-rotateSpeed", ".rotateSpeed", XrmoptionSepArg, 0 },
+ { "-follow", ".follow", XrmoptionNoArg, "True" },
+ { "-maxFalling", ".maxFalling", XrmoptionSepArg, 0 },
+ { "-resolution", ".resolution", XrmoptionSepArg, 0 },
+ { "-maxColors", ".maxColors", XrmoptionSepArg, 0 },
+ { "-dropSpeed", ".dropSpeed", XrmoptionSepArg, 0 },
+ { "-override", ".override", XrmoptionNoArg, "True" },
+};
+
+#define DEF_OVERRIDE "False"
+#define DEF_ROTATE "True"
+#define DEF_FOLLOW "False"
+#define DEF_CARPET "True"
+#define DEF_BLOB "False"
+#define DEF_NIPPLES "True"
+#define DEF_ROTATE_SPEED "10"
+#define DEF_MAX_FALLING "500"
+#define DEF_MAX_COLORS "7"
+#define DEF_SIZE "2"
+#define DEF_SPAWN "50"
+#define DEF_RESOLUTION "4"
+#define DEF_CAM_X "1"
+#define DEF_CAM_Y "20"
+#define DEF_CAM_Z "25"
+#define DEF_DROP_SPEED "4"
+
+static argtype vars[] = {
+ {&override, "override", "Override", DEF_OVERRIDE, t_Bool},
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&drawCarpet, "carpet", "Carpet", DEF_CARPET, t_Bool},
+ {&drawNipples, "nipples", "Nipples", DEF_NIPPLES, t_Bool},
+ {&drawBlob, "blob", "Blob", DEF_BLOB, t_Bool},
+ {&rotateSpeed, "rotateSpeed", "RotateSpeed", DEF_ROTATE_SPEED, t_Float},
+ {&follow, "follow", "Follow", DEF_FOLLOW, t_Bool},
+ {&camX, "camX", "camX", DEF_CAM_X, t_Float},
+ {&camY, "camY", "camY", DEF_CAM_Y, t_Float},
+ {&camZ, "camZ", "camZ", DEF_CAM_Z, t_Float},
+ {&size, "size", "size", DEF_SIZE, t_Int},
+ {&spawn, "spawn", "spawn", DEF_SPAWN, t_Int},
+ {&maxFalling, "maxFalling", "maxFalling", DEF_MAX_FALLING, t_Int},
+ {&resolution, "resolution", "resolution", DEF_RESOLUTION, t_Int},
+ {&maxColors, "maxColors", "maxColors", DEF_MAX_COLORS, t_Int},
+ {&dropSpeed, "dropSpeed", "DropSpeed", DEF_DROP_SPEED, t_Float},
+};
+
+static topBlockSTATE *tbs = NULL;
+
+static ModeSpecOpt topBlock_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+/* Window management, etc */
+ENTRYPOINT void
+reshape_topBlock (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width*1.5;
+ y = -height*0.2;
+ h = height / (GLfloat) width;
+ }
+ glViewport (0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (60.0, 1/h, 1.0, 1000.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+/* clean up on exit, not required ... */
+ENTRYPOINT void
+free_topBlock(ModeInfo *mi)
+{
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+ NODE *llCurrent, *llOld;
+ llCurrent = tb->blockNodeRoot;
+ while (llCurrent != NULL) {
+ llOld = llCurrent;
+ llCurrent = llCurrent->next;
+ free(llOld);
+ }
+}
+
+/* setup */
+ENTRYPOINT void
+init_topBlock (ModeInfo *mi)
+{
+ topBlockSTATE *tb;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, tbs);
+
+ tb = &tbs[MI_SCREEN(mi)];
+
+ tb->glx_context = init_GL(mi);
+
+ reshape_topBlock (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+/* if (wire) { drawNipples=False; }*/
+ tb->numFallingBlocks=0;
+
+ if (size>10) { size = 10; }
+ if (size<1) { size = 2; }
+ tb->carpetWidth = 8 * size;
+ tb->carpetLength = tb->carpetWidth;
+
+ tb->maxFalling = maxFalling;
+ tb->maxFalling*=size;
+
+ if (spawn<4) { spawn=4; }
+ if (spawn>1000) { spawn=1000; }
+
+ tb->rotateSpeed = rotateSpeed;
+ if (tb->rotateSpeed<1) {tb->rotateSpeed=1; }
+ if (tb->rotateSpeed>1000) {tb->rotateSpeed=1000;}
+ tb->rotateSpeed /= 100;
+
+ tb->resolution = resolution;
+ if (tb->resolution<4) {tb->resolution=4;}
+ if (tb->resolution>20) {tb->resolution=20;}
+ tb->resolution*=2;
+
+ if (maxColors<1) {maxColors=1;}
+ if (maxColors>8) {maxColors=8;}
+
+ tb->dropSpeed = dropSpeed;
+ if (tb->dropSpeed<1) {tb->dropSpeed=1;}
+ if (tb->dropSpeed>9) {tb->dropSpeed=9;} /* 10+ produces blocks that can pass through each other */
+
+ tb->dropSpeed = 80/tb->dropSpeed;
+ tb->dropSpeed = (blockHeight/tb->dropSpeed);
+
+ reshape_topBlock (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glClearDepth(1.0f);
+ if (!wire) {
+ GLfloat pos[4] = {10.0, 10.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.1, 0.1, 0.1, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE); /* all objects exhibit a reverse side */
+ glCullFace(GL_BACK);
+
+ if (drawBlob) {
+ buildBlobBlock(mi);
+ } else {
+ buildBlock(mi); /* build the display list holding the simple block */
+ }
+ buildCarpet(mi); /* build the base */
+ tb->highest=0;
+ tb->highestFalling=0;
+ tb->eyeLine=tb->highest;
+ tb->eyeX=0;
+ tb->eyeY=0;
+ tb->eyeZ=0;
+ tb->followMode=0;
+ if (follow) {
+ tb->plusheight=100;
+ camZ=camZ-60;
+ } else {
+ tb->rotation=random() % 360;
+ tb->eyeY=10;
+ tb->plusheight=30;
+ }
+ tb->followRadius=0;
+ /* override camera settings */
+ if (override) {
+ tb->plusheight=100;
+ drawCarpet=False;
+ camX=0;
+ camY=1;
+ camZ=0;
+ tb->eyeX=-1;
+ tb->eyeY=20;
+ tb->eyeZ=0;
+ }
+ tb->trackball = gltrackball_init (False);
+}
+
+/* provides the per frame entertainment */
+ENTRYPOINT void
+draw_topBlock (ModeInfo *mi)
+{
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ NODE *llCurrent;
+ NODE *llNode;
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+ GLfloat spcN1x,spcN1y,spcN2x,spcN2y;
+ GLfloat spcC1x,spcC1y,spcC2x,spcC2y;
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat color[4];
+
+ if (!tb->glx_context)
+ return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(tb->glx_context));
+ mi->polygon_count = 0;
+
+ generateNewBlock(mi);
+
+ if (rotate && (!tb->button_down_p)) { tb->rotation += tb->rotateSpeed; }
+ if (tb->rotation>=360) { tb->rotation=tb->rotation-360; }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* clear current */
+ glLoadIdentity(); /* resets directions, do it every time ! */
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ if (!follow) {
+ if (tb->highest>tb->eyeLine) { tb->eyeLine+=((tb->highest-tb->eyeLine)/100); } /* creates a smooth camera transition */
+ gluLookAt(camX, camY+tb->eyeLine, camZ, tb->eyeX, tb->eyeY+tb->eyeLine, tb->eyeZ, 0.0, 1.0, 0.0); /* setup viewer, xyz cam, xyz looking at and where is up normaly 0,1,0 */
+ glRotatef(90, 1.0, 0.0, 0.0); /* x axis */
+ } else {
+ glRotatef(90, 0.0, 0.0, 1.0); /* z axis */
+ followBlock(mi);
+ }
+
+ /* Rotate the scene around a point that's a little higher up. */
+ glTranslatef (0, 0, -5);
+ gltrackball_rotate (tb->trackball);
+ glTranslatef (0, 0, 5);
+
+ /* rotate the world */
+ glRotatef(tb->rotation, 0.0, 0.0, 1.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ llCurrent = tb->blockNodeRoot;
+ if (drawCarpet) {
+ /* center carpet */
+ glTranslatef(0.0-(tb->carpetWidth/2),0.0-(tb->carpetLength/2),0.0);
+ glCallList(tb->carpet);
+ mi->polygon_count += tb->carpet_polys;
+ glTranslatef(0.0+(tb->carpetWidth/2),0.0+(tb->carpetLength/2),0.0);
+ glTranslatef(0.0,0.0,-0.55);
+ }
+ tb->highestFalling=0;
+ while (llCurrent != NULL) { /* for each block */
+ glPushMatrix(); /* save state */
+ /* set color */
+ switch (llCurrent->color) {
+ case 0:
+ color[0] = 1.0f;
+ color[1] = 0.0f;
+ color[2] = 0.0f;
+ color[3] = 1.0f;
+ break;
+ case 1:
+ color[0] = 0.0f;
+ color[1] = 1.0f;
+ color[2] = 0.0f;
+ color[3] = 1.0f;
+ break;
+ case 2:
+ color[0] = 0.0f;
+ color[1] = 0.0f;
+ color[2] = 1.0f;
+ color[3] = 1.0f;
+ break;
+ case 3:
+ color[0] = 0.95f;
+ color[1] = 0.95f;
+ color[2] = 0.95f;
+ color[3] = 1.0f;
+ break;
+ case 4:
+ color[0] = 1.0f;
+ color[1] = 0.5f;
+ color[2] = 0.0f;
+ color[3] = 1.0f;
+ break;
+ case 5:
+ color[0] = 1.0f;
+ color[1] = 1.0f;
+ color[2] = 0.0f;
+ color[3] = 1.0f;
+ break;
+ case 6:
+ color[0] = 0.5f;
+ color[1] = 0.5f;
+ color[2] = 0.5f;
+ color[3] = 1.0f;
+ break;
+ case 7:
+ color[0] = 0.05f;
+ color[1] = 0.05f;
+ color[2] = 0.05f;
+ color[3] = 1.0f;
+ break;
+ }
+ if (wire) { glColor3fv(color); }
+ else { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); }
+
+ if (llCurrent->falling==1) {
+ spcC2x = 0;
+ spcC2y = 0;
+ spcN2x = 0;
+ spcN2y = 0;
+ if (llCurrent->height>tb->highestFalling) {tb->highestFalling=llCurrent->height;}
+ /* all blocks fall at the same rate to avoid mid air collisions */
+ llCurrent->height-=tb->dropSpeed;
+ if (llCurrent->height<=0) {
+ llCurrent->falling=0;
+ if (tb->highest==0) {
+ tb->highest+=blockHeight;
+ }
+ }
+ if ( (llCurrent->height<=tb->highest+1) && (llCurrent->falling==1) ) {
+ /* check for collision */
+ llNode = tb->blockNodeRoot;
+ spcC1x = llCurrent->x;
+ spcC1y = llCurrent->y;
+ switch(llCurrent->rotation) {
+ case getOrientation(0):
+ spcC2x = spcC1x;
+ spcC2y = spcC1y-2;
+ break;
+ case getOrientation(1):
+ spcC2x = spcC1x+2;
+ spcC2y = spcC1y;
+ break;
+ case getOrientation(2):
+ spcC2x = spcC1x;
+ spcC2y = spcC1y+2;
+ break;
+ case getOrientation(3):
+ spcC2x = spcC1x-2;
+ spcC2y = spcC1y;
+ break;
+ }
+ while (llNode != NULL) {
+ if ( (llNode->falling==0) && (llCurrent->falling==1) ) {
+ spcN1x = llNode->x;
+ spcN1y = llNode->y;
+ switch(llNode->rotation) {
+ case getOrientation(0):
+ spcN2x = spcN1x;
+ spcN2y = spcN1y-2;
+ break;
+ case getOrientation(1):
+ spcN2x = spcN1x+2;
+ spcN2y = spcN1y;
+ break;
+ case getOrientation(2):
+ spcN2x = spcN1x;
+ spcN2y = spcN1y+2;
+ break;
+ case getOrientation(3):
+ spcN2x = spcN1x-2;
+ spcN2y = spcN1y;
+ break;
+ }
+ if (
+ ( (spcC1x==spcN1x) && (spcC1y==spcN1y) ) ||
+ ( (spcC1x==spcN2x) && (spcC1y==spcN2y) ) ||
+ ( (spcC2x==spcN2x) && (spcC2y==spcN2y) ) ||
+ ( (spcC2x==spcN1x) && (spcC2y==spcN1y) )
+ ){
+ if ( fabs(llCurrent->height-(llNode->height+blockHeight)) <= TOLERANCE) {
+
+ llCurrent->falling=0;
+ llCurrent->height=llNode->height+blockHeight; /* if this is missing then small errors build up until the model fails */
+ if ( fabs(llCurrent->height-tb->highest) <= TOLERANCE+blockHeight ) {
+ tb->highest+=blockHeight;
+ }
+ }
+ }
+ }
+ llNode=llNode->next;
+ }
+ }
+ }
+ /* set location in space */
+ glTranslatef(llCurrent->x,llCurrent->y,-llCurrent->height);
+ /* rotate */
+ glRotatef(llCurrent->rotation, 0.0f, 0.0f, 1.0f);
+ if ((tb->followMode==0) && (llCurrent->next==NULL)) {
+ tb->blockNodeFollow = llCurrent;
+ tb->followMode=1;
+ }
+ llCurrent = llCurrent->next;
+ /* draw */
+ glCallList(tb->block);
+ mi->polygon_count += tb->block_polys;
+ glPopMatrix(); /* restore state */
+ }
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ if (tb->highest>(5*tb->maxFalling)) { drawCarpet=False; }
+ glXSwapBuffers(dpy, window);
+}
+
+
+
+/* camera is in follow mode, work out where we should be looking */
+static void followBlock(ModeInfo *mi)
+{
+ GLfloat xLen,yLen,cx,cy,rangle,xTarget,yTarget;
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+ cx=0;cy=0;
+ if ((tb->blockNodeFollow!=NULL) && (tb->followMode==1)){
+
+ if (tb->highest>tb->eyeLine) { tb->eyeLine+= ((tb->highest-tb->eyeLine)/100); }
+ /*tb->blockNodeFollow->color=1; only noticable if you set the colors to 1 */
+
+ if (tb->blockNodeFollow->height > tb->eyeZ) { tb->eyeZ+= ((tb->blockNodeFollow->height - tb->eyeZ)/100); }
+ if (tb->blockNodeFollow->height < tb->eyeZ) { tb->eyeZ-= ((tb->eyeZ - tb->blockNodeFollow->height)/100); }
+
+
+ /* when the scene is rotated we need to know where the block is in the 2 dimensional coordinates of the carpet area
+ (see http://www.jumpstation.co.uk/rotation/)
+ */
+
+ if (tb->followRadius==0) {
+ xLen = tb->blockNodeFollow->x-cx;
+ yLen = tb->blockNodeFollow->y-cy;
+ tb->followRadius=sqrt( (xLen*xLen) + (yLen*yLen) );
+ tb->followAngle = (180/M_PI) * asin(xLen/tb->followRadius);
+ tb->followAngle = quadrantCorrection(tb->followAngle,(int)cx,(int)cy,(int)tb->blockNodeFollow->x,(int)tb->blockNodeFollow->y);
+ }
+ rangle = (tb->followAngle+tb->rotation) * M_PI /180;
+ xTarget = cos(rangle) * tb->followRadius + cx;
+ yTarget = sin(rangle) * tb->followRadius + cy;
+ if (tb->followAngle>360) { tb->followAngle=tb->followAngle-360; }
+
+ if (xTarget < tb->eyeX) { tb->eyeX-= ((tb->eyeX - xTarget)/100); }
+ if (xTarget > tb->eyeX) { tb->eyeX+= ((xTarget - tb->eyeX)/100); }
+
+ if (yTarget < tb->eyeY) { tb->eyeY-= ((tb->eyeY - yTarget)/100); }
+ if (yTarget > tb->eyeY) { tb->eyeY+= ((yTarget - tb->eyeY)/100); }
+ if (!tb->blockNodeFollow->falling) {
+ tb->followMode=0;
+ /*tb->blockNodeFollow->color=2; only noticable if you set the colors to 1 */
+ tb->followRadius=0;
+ }
+ }
+ gluLookAt(camX, camY, camZ-tb->eyeLine, tb->eyeX, tb->eyeY, -tb->eyeZ,-1.0,0.0,0.0);
+}
+
+/* each quater of the circle has to be adjusted for */
+static double quadrantCorrection(double angle,int cx,int cy,int x,int y)
+{
+ if ((x>=cx) && (y>=cy)) {
+ angle += (90-(angle-90) * 2);
+ } else if ((x>=cx) && (y<=cy)) {
+ angle += 90;
+ } else if ((x<=cx) && (y<=cy)) {
+ angle += 90;
+ } else if ((x<=cx) && (y>=cy)) {
+ angle += (90-(angle-90) * 2);
+ }
+ return(angle-180);
+}
+
+/* if random chance then create a new falling block */
+static void generateNewBlock(ModeInfo *mi)
+{
+ NODE *llCurrent, *llTail;
+ GLfloat startOffx, startOffy;
+ int endOffx, endOffy;
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+ if ( ((random() % spawn) == 1) && (tb->highestFalling<getHeight((tb->plusheight-blockHeight)+tb->highest)) ) {
+ startOffx=0;
+ endOffx=0;
+ startOffy=0;
+ endOffy=0;
+ tb->numFallingBlocks++;
+ llTail = tb->blockNodeRoot;
+ if (llTail == NULL) {
+ llCurrent = ((NODE*) malloc(sizeof(NODE)));
+ if (!llCurrent) abort();
+ llTail = llCurrent;
+ tb->blockNodeRoot = llCurrent;
+ } else {
+ if (tb->numFallingBlocks>=tb->maxFalling) {
+ /* recycle */
+ llCurrent=llTail->next;
+ tb->blockNodeRoot=llCurrent->next;
+ } else {
+ llCurrent = ((NODE*) malloc(sizeof(NODE)));
+ if (!llCurrent) abort();
+ }
+ while (llTail->next != NULL) { llTail = llTail->next; } /* find last item in list */
+ }
+ llCurrent->falling=1;
+ llCurrent->rotation=getOrientation(random() % 4);
+ if (llCurrent->rotation==getOrientation(0)) {
+ startOffx=1.0;
+ endOffx=0;
+ startOffy=3.0;
+ endOffy=-1;
+ } else if (llCurrent->rotation==getOrientation(1)) {
+ startOffx=1.0;
+ endOffx=-1;
+ startOffy=1.0;
+ endOffy=0;
+ } else if (llCurrent->rotation==getOrientation(2)) {
+ startOffx=1.0;
+ endOffx=0;
+ startOffy=3.0;
+ endOffy=-1;
+ } else if (llCurrent->rotation==getOrientation(3)) {
+ startOffx=5.0;
+ endOffx=-1;
+ startOffy=1.0;
+ endOffy=0;
+ }
+
+ llCurrent->x=(startOffx-(tb->carpetLength/2)) + getLocation(random() % ((tb->carpetLength/2)+endOffx) );
+ llCurrent->y=(startOffy-(tb->carpetLength/2)) + getLocation(random() % ((tb->carpetLength/2)+endOffy) );
+ llCurrent->color=(random() % maxColors);
+ llCurrent->height=getHeight(tb->plusheight+tb->highest);
+ if (tb->numFallingBlocks>=tb->maxFalling) {
+ tb->numFallingBlocks--;
+ tb->numFallingBlocks--;
+ }
+ llTail->next = llCurrent;
+ llTail = llCurrent;
+ llTail->next = NULL;
+
+ }
+}
+
+/* called at init this creates the 'carpet' display list item */
+static void buildCarpet(ModeInfo *mi)
+{
+ int i,c,x,y;
+ GLfloat color[4];
+ int wire = MI_IS_WIREFRAME(mi);
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+ color[0] = 0.0f;
+ color[1] = 1.0f;
+ color[2] = 0.0f;
+ color[3] = 1.0f;
+ tb->carpet=glGenLists(1); /* only one */
+ glNewList(tb->carpet,GL_COMPILE);
+ tb->carpet_polys=0;
+ glPushMatrix(); /* save state */
+ x=tb->carpetWidth;
+ y=tb->carpetLength;
+ if (wire) { glColor3fv(color); }
+ else { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); }
+ /* draw carpet plane */
+ glBegin( wire ? GL_LINE_LOOP : GL_QUADS );
+ /* draw top */
+ glNormal3f( 0, 0, -1 );
+ glVertex3f(0.0,0.0,0.0);
+ glVertex3f(x,0.0,0.0);
+ glVertex3f(x,y,0.0);
+ glVertex3f(0.0,y,0.0);
+ tb->carpet_polys++;
+ if (!wire) {
+ /* add edge pieces */
+ /* side 1 */
+ glNormal3f( 0, -1, 0 );
+ glVertex3f(0.0,0.0,0.0);
+ glVertex3f(x,0.0,0.0);
+ glVertex3f(x,0,singleThick);
+ glVertex3f(0.0,0,singleThick);
+ tb->carpet_polys++;
+ /* side 2 */
+ glNormal3f( -1, 0, 0 );
+ glVertex3f(0.0,0.0,0.0);
+ glVertex3f(0,y,0.0);
+ glVertex3f(0,y,singleThick);
+ glVertex3f(0.0,0,singleThick);
+ tb->carpet_polys++;
+ /* side 3 */
+ glNormal3f( 1, 0, 0 );
+ glVertex3f(x,0.0,0.0);
+ glVertex3f(x,y,0.0);
+ glVertex3f(x,y,singleThick);
+ glVertex3f(x,0,singleThick);
+ tb->carpet_polys++;
+ /* side 4 */
+ glNormal3f( 0, 1, 0 );
+ glVertex3f(0,y,0.0);
+ glVertex3f(x,y,0.0);
+ glVertex3f(x,y,singleThick);
+ glVertex3f(0,y,singleThick);
+ tb->carpet_polys++;
+ }
+ glEnd();
+ /* nipples */
+ if (drawNipples) {
+ glTranslatef(0.5f,0.5f,-.25); /* move to the cylinder center */
+ for (c=0;c<x;c++) {
+ glPushMatrix(); /* save state */
+ for (i=0;i<y;i++) {
+ tb->carpet_polys += tube(0, 0, -0.1,
+ 0, 0, 0.26,
+ cylSize, 0,
+ tb->resolution, True, True,
+ wire);
+ glRotatef(180, 0.0f, 1.0f, 0.0f); /* they are upside down */
+ glRotatef(180, 0.0f, 1.0f, 0.0f); /* recover */
+ glTranslatef(0.0f,1.0f,0.0f); /* move to the next cylinder center (backward) */
+ }
+ glPopMatrix(); /* save state */
+ glTranslatef(1.0f,0.0f,0.0f); /* reset */
+ }
+ }
+ glPopMatrix(); /* restore state */
+ glEndList();
+}
+
+/* using the verticies arrays builds the plane, now with normals */
+static void polygonPlane(int wire, int a, int b, int c , int d, int i)
+{
+ GLfloat topBlockNormals[5][3] = { {0,0,-1}, {0,1,0}, {1,0,0}, {0,0,1}, {0,-1,0} };
+ GLfloat topBlockVertices[8][3] = { {-0.49,-2.97,-0.99}, {0.99,-2.97,-0.99}, {0.99,0.99,-0.99} , {-0.49,0.99,-0.99}, {-0.49,-2.97,0.99} , {0.99,-2.97,0.99}, {0.99,0.99,0.99} , {-0.49,0.99,0.99} };
+ glBegin( wire ? GL_LINE_LOOP : GL_POLYGON);
+ glNormal3fv(topBlockNormals[i] );
+ glVertex3fv(topBlockVertices[a]);
+ glVertex3fv(topBlockVertices[b]);
+ glVertex3fv(topBlockVertices[c]);
+ glVertex3fv(topBlockVertices[d]);
+ glEnd();
+}
+
+/* called at init this creates the 'block' display list item */
+/* the spheres came about originaly as quick way to test the directional lighting/normals */
+static void buildBlock(ModeInfo *mi)
+{
+ int i,c;
+ int wire = MI_IS_WIREFRAME(mi);
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+ tb->block=glGenLists(1); /* only one */
+ glNewList(tb->block,GL_COMPILE);
+ tb->block_polys=0;
+ glPushMatrix(); /* save state */
+ glRotatef(90, 0.0f, 1.0f, 0.0f);
+ /* base */
+ polygonPlane(wire, 0,3,2,1,0); tb->block_polys++;
+ polygonPlane(wire, 2,3,7,6,1); tb->block_polys++;
+ polygonPlane(wire, 1,2,6,5,2); tb->block_polys++;
+ polygonPlane(wire, 4,5,6,7,3); tb->block_polys++;
+ polygonPlane(wire, 0,1,5,4,4); tb->block_polys++;
+ if (drawNipples) {
+ /* nipples */
+ /* draw 8 cylinders each with a disk cap */
+ glRotatef(90, 0.0f, 1.0f, 0.0f); /* 'aim' the pointer ready for the cylinder */
+ glTranslatef(0.5f,0.5f,0.99f); /* move to the cylinder center */
+ for (c=0;c<2;c++) {
+ for (i=0;i<4;i++) {
+ tb->block_polys += tube(0, 0, 0,
+ 0, 0, 0.25,
+ cylSize, 0,
+ tb->resolution, True, True,
+ wire);
+ glTranslatef(0.0f,0.0f,0.25f); /* move to the cylinder cap */
+ glTranslatef(0.0f,0.0f,-0.25f); /* move back from the cylinder cap */
+ if (c==0) {
+ glTranslatef(0.0f,-1.0f,0.0f); /* move to the next cylinder center (forward) */
+ } else {
+ glTranslatef(0.0f,1.0f,0.0f); /* move to the next cylinder center (backward) */
+ }
+ }
+ glTranslatef(-1.0f,1.0f,0.0f); /* move to the cylinder center */
+ }
+ /* udders */
+ /* 3 cylinders on the underside */
+ glTranslatef(1.5f,-2.5f,-1.5f); /* move to the center, under the top of the brick */
+ if (! wire)
+ for (c=0;c<3;c++) {
+ tb->block_polys += tube(0, 0, 0.1,
+ 0, 0, 1.4,
+ uddSize, 0,
+ tb->resolution, True, True, wire);
+ glTranslatef(0.0f,-1.0f,0.0f); /* move to the center */
+ }
+ }
+ glPopMatrix(); /* restore state */
+ glEndList();
+}
+
+/*
+ rip off of the builBlock() function creating the GL compilied pointer "block" but only creates two spheres.
+ spheres are created with unit_sphere from spheres.h to allow wire frame
+*/
+static void buildBlobBlock(ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+ tb->block=glGenLists(1); /* only one */
+ glNewList(tb->block,GL_COMPILE);
+ glPushMatrix();
+ glScalef(1.4,1.4,1.4);
+ unit_sphere (tb->resolution/2,tb->resolution, wire);
+ glPopMatrix();
+ glTranslatef(0.0f,-2.0f,0.0f);
+ glScalef(1.4,1.4,1.4);
+ unit_sphere (tb->resolution/2,tb->resolution, wire);
+ glEndList();
+}
+
+
+/* handle input events or not if daemon running the show */
+ENTRYPOINT Bool
+topBlock_handle_event (ModeInfo *mi, XEvent *event)
+{
+ topBlockSTATE *tb = &tbs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, tb->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &tb->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress) {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == 'a') {
+ tb->eyeX++;
+ return True;
+ } else if (c == 'z') {
+ tb->eyeX--;
+ return True;
+ } else if (c == 's') {
+ tb->eyeY--;
+ return True;
+ } else if (c == 'x') {
+ tb->eyeY++;
+ return True;
+ } else if (c == 'd') {
+ tb->eyeZ++;
+ return True;
+ } else if (c == 'c') {
+ tb->eyeZ--;
+ return True;
+ } else if (c == 'f') {
+ camX++;
+ return True;
+ } else if (c == 'v') {
+ camX--;
+ return True;
+ } else if (c == 'g') {
+ camY++;
+ return True;
+ } else if (c == 'b') {
+ camY--;
+ return True;
+ } else if (c == 'h') {
+ camZ++;
+ return True;
+ } else if (c == 'n') {
+ camZ--;
+ return True;
+ } else if (c == 'r') {
+ tb->rotation++;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+/* this is tha main change for v5 compatability and acompanying ENTRYPOINTS */
+XSCREENSAVER_MODULE_2 ("TopBlock", topblock, topBlock)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/topblock.h b/hacks/glx/topblock.h
new file mode 100644
index 0000000..1a66c5d
--- /dev/null
+++ b/hacks/glx/topblock.h
@@ -0,0 +1,45 @@
+/* topblock - openGL based hack */
+
+static void buildCarpet(ModeInfo *);
+static void polygonPlane(int, int, int, int, int ,int);
+static void buildBlock(ModeInfo *);
+static void generateNewBlock(ModeInfo *);
+static void followBlock(ModeInfo *);
+static void buildBlobBlock(ModeInfo *);
+static double quadrantCorrection(double,int,int,int,int);
+
+/* this structure holds all the attributes about a block */
+typedef struct blockNode {
+ int color; /* indexed */
+ int rotation; /* indexed: 0=S-N, 1=W-E, 2=N-S, 3=E-W */
+ GLfloat height;
+ GLfloat x;
+ GLfloat y;
+ int falling;
+ struct blockNode *next;
+} NODE;
+
+
+/* some handy macros and definitions */
+#define blockHeight 1.49f
+#define getHeight(a) (a * blockHeight)
+
+#define getOrientation(a) (a * 90)
+
+#define blockWidth 2.0f
+#define getLocation(a) (a * blockWidth)
+
+#define TOLERANCE 0.1f
+
+#define cylSize 0.333334f
+#define uddSize 0.4f
+#define singleThick 0.29 /* defines the thickness of the carpet */
+
+
+
+
+
+
+
+
+
diff --git a/hacks/glx/topblock.man b/hacks/glx/topblock.man
new file mode 100644
index 0000000..bbe4965
--- /dev/null
+++ b/hacks/glx/topblock.man
@@ -0,0 +1,170 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+topblock - a 3D world of falling blocks that build up and up.
+.SH SYNOPSIS
+.B topblock
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+[\-size \fInumber\fP]
+[\-spawn \fInumber\fP]
+[\-camX \fInumber\fP]
+[\-camY \fInumber\fP]
+[\-camZ \fInumber\fP]
+[\-rotate]
+[\-no-carpet]
+[\-no-nipples]
+[\-blob]
+[\-rotateSpeed \fInumber\fP]
+[\-follow]
+[\-maxFalling \fInumber\fP]
+[\-resolution \fInumber\fP]
+[\-maxColors \fInumber\fP]
+[\-dropSpeed \fInumber\fP]
+[\-override]
+.SH DESCRIPTION
+Creates a world of falling blocks that build up and up.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-size \fInumber\fP
+Size of the base/carpet.
+.TP 8
+.B \-spawn \fInumber\fP
+Likeyhood of a new block being created per frame : 1 high, 1000 very low.
+.TP 8
+.B \-camX \fInumber\fP
+Initial camera X location in the world.
+.TP 8
+.B \-camY \fInumber\fP
+Initial camera Y location in the world.
+.TP 8
+.B \-camZ \fInumber\fP
+Initial camera Z location in the world.
+.TP 8
+.B \-rotate | -no-rotate
+Add/Remove rotation to/from the animation.
+.TP 8
+.B \-no-carpet
+Remove the base/carpet.
+.TP 8
+.B \-no-nipples
+Remove nipples on the blocks (also applies to udders) (has no effect in blob mode).
+.TP 8
+.B \-blob
+Run in blob mode, blocks become over sized spheres.
+.TP 8
+.B \-rotateSpeed \fInumber\fP
+Varries speed of world rotation.
+.TP 8
+.B \-follow
+Camera follows blocks as they fall instead of camera being semi static (stays with top block).
+.TP 8
+.B \-maxFalling \fInumber\fP
+Maximum number of objects created before recycling occurs.
+.TP 8
+.B \-resolution \fInumber\fP
+Resolution of tubes, disks and spheres.
+.TP 8
+.B \-maxColors \fInumber\fP
+Number of different colors available to falling objects.
+.TP 8
+.B \-dropSpeed \fInumber\fP
+Varries speed of falling objects.
+.TP 8
+.B \-override
+Overrides camera settings and provides a tunnel view.
+
+.SH KEYS
+.PP
+.TP 8
+.B a
+Increases viewing X coordinate.
+.TP 8
+.B z
+Decreases viewing X coordinate.
+.TP 8
+.B s
+Increases viewing Y coordinate.
+.TP 8
+.B x
+Decreases viewing Y coordinate.
+.TP 8
+.B d
+Increases viewing Z coordinate.
+.TP 8
+.B c
+Decreases viewing Z coordinate.
+.TP 8
+.B f
+Increases camera location X coordinate.
+.TP 8
+.B v
+Decreases camera location X coordinate.
+.TP 8
+.B g
+Increases camera location Y coordinate.
+.TP 8
+.B b
+Decreases camera location Y coordinate.
+.TP 8
+.B h
+Increases camera location Z coordinate.
+.TP 8
+.B n
+Decreases camera location Z coordinate.
+.TP 8
+.B r
+Increases world rotation.
+.TP 8
+.B q
+quit.
+.SH EXAMPLES
+To see which block follow-mode is tracking, set the number of block colors to 1.
+.TP 8
+.B topblock -follow -maxColors 1
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2006 by rednuht. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+rednuht <topblock.xscreensaver@jumpstation.co.uk>
+<http://www.jumpstation.co.uk/xscreensaver/topblock/>
diff --git a/hacks/glx/trackball.c b/hacks/glx/trackball.c
new file mode 100644
index 0000000..429ade9
--- /dev/null
+++ b/hacks/glx/trackball.c
@@ -0,0 +1,331 @@
+/*
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+/*
+ * Trackball code:
+ *
+ * Implementation of a virtual trackball.
+ * Implemented by Gavin Bell, lots of ideas from Thant Tessman and
+ * the August '88 issue of Siggraph's "Computer Graphics," pp. 121-129.
+ *
+ * Vector manip code:
+ *
+ * Original code from:
+ * David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli
+ *
+ * Much mucking with by:
+ * Gavin Bell
+ */
+
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "trackball.h"
+
+/*
+ * This size should really be based on the distance from the center of
+ * rotation to the point on the object underneath the mouse. That
+ * point would then track the mouse as closely as possible. This is a
+ * simple example, though, so that is left as an Exercise for the
+ * Programmer.
+ */
+#define TRACKBALLSIZE (0.8)
+
+/*
+ * Local function prototypes (not defined in trackball.h)
+ */
+static float tb_project_to_sphere(float, float, float);
+static void normalize_quat(float [4]);
+static void axis_to_quat(float a[3], float phi, float q[4]);
+
+static void
+vzero(float *v)
+{
+ v[0] = 0.0;
+ v[1] = 0.0;
+ v[2] = 0.0;
+}
+
+static void
+vset(float *v, float x, float y, float z)
+{
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+}
+
+static void
+vsub(const float *src1, const float *src2, float *dst)
+{
+ dst[0] = src1[0] - src2[0];
+ dst[1] = src1[1] - src2[1];
+ dst[2] = src1[2] - src2[2];
+}
+
+static void
+vcopy(const float *v1, float *v2)
+{
+ register int i;
+ for (i = 0 ; i < 3 ; i++)
+ v2[i] = v1[i];
+}
+
+static void
+vcross(const float *v1, const float *v2, float *cross)
+{
+ float temp[3];
+
+ temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]);
+ temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]);
+ temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]);
+ vcopy(temp, cross);
+}
+
+static float
+vlength(const float *v)
+{
+ return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+}
+
+static void
+vscale(float *v, float div)
+{
+ v[0] *= div;
+ v[1] *= div;
+ v[2] *= div;
+}
+
+static void
+vnormal(float *v)
+{
+ vscale(v,1.0/vlength(v));
+}
+
+static float
+vdot(const float *v1, const float *v2)
+{
+ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+
+static void
+vadd(const float *src1, const float *src2, float *dst)
+{
+ dst[0] = src1[0] + src2[0];
+ dst[1] = src1[1] + src2[1];
+ dst[2] = src1[2] + src2[2];
+}
+
+/*
+ * Ok, simulate a track-ball. Project the points onto the virtual
+ * trackball, then figure out the axis of rotation, which is the cross
+ * product of P1 P2 and O P1 (O is the center of the ball, 0,0,0)
+ * Note: This is a deformed trackball-- is a trackball in the center,
+ * but is deformed into a hyperbolic sheet of rotation away from the
+ * center. This particular function was chosen after trying out
+ * several variations.
+ *
+ * It is assumed that the arguments to this routine are in the range
+ * (-1.0 ... 1.0)
+ */
+void
+trackball(float q[4], float p1x, float p1y, float p2x, float p2y)
+{
+ float a[3]; /* Axis of rotation */
+ float phi; /* how much to rotate about axis */
+ float p1[3], p2[3], d[3];
+ float t;
+
+ if (p1x == p2x && p1y == p2y) {
+ /* Zero rotation */
+ vzero(q);
+ q[3] = 1.0;
+ return;
+ }
+
+ /*
+ * First, figure out z-coordinates for projection of P1 and P2 to
+ * deformed sphere
+ */
+ vset(p1,p1x,p1y,tb_project_to_sphere(TRACKBALLSIZE,p1x,p1y));
+ vset(p2,p2x,p2y,tb_project_to_sphere(TRACKBALLSIZE,p2x,p2y));
+
+ /*
+ * Now, we want the cross product of P1 and P2
+ */
+ vcross(p2,p1,a);
+
+ /*
+ * Figure out how much to rotate around that axis.
+ */
+ vsub(p1,p2,d);
+ t = vlength(d) / (2.0*TRACKBALLSIZE);
+
+ /*
+ * Avoid problems with out-of-control values...
+ */
+ if (t > 1.0) t = 1.0;
+ if (t < -1.0) t = -1.0;
+ phi = 2.0 * asin(t);
+
+ axis_to_quat(a,phi,q);
+}
+
+/*
+ * Given an axis and angle, compute quaternion.
+ */
+void
+axis_to_quat(float a[3], float phi, float q[4])
+{
+ vnormal(a);
+ vcopy(a,q);
+ vscale(q,sin(phi/2.0));
+ q[3] = cos(phi/2.0);
+}
+
+/*
+ * Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet
+ * if we are away from the center of the sphere.
+ */
+static float
+tb_project_to_sphere(float r, float x, float y)
+{
+ float d, t, z;
+
+ d = sqrt(x*x + y*y);
+ if (d < r * 0.70710678118654752440) { /* Inside sphere */
+ z = sqrt(r*r - d*d);
+ } else { /* On hyperbola */
+ t = r / 1.41421356237309504880;
+ z = t*t / d;
+ }
+ return z;
+}
+
+/*
+ * Given two rotations, e1 and e2, expressed as quaternion rotations,
+ * figure out the equivalent single rotation and stuff it into dest.
+ *
+ * This routine also normalizes the result every RENORMCOUNT times it is
+ * called, to keep error from creeping in.
+ *
+ * NOTE: This routine is written so that q1 or q2 may be the same
+ * as dest (or each other).
+ */
+
+#define RENORMCOUNT 97
+
+void
+add_quats(float q1[4], float q2[4], float dest[4])
+{
+ static int count=0;
+ float t1[4], t2[4], t3[4];
+ float tf[4];
+
+ vcopy(q1,t1);
+ vscale(t1,q2[3]);
+
+ vcopy(q2,t2);
+ vscale(t2,q1[3]);
+
+ vcross(q2,q1,t3);
+ vadd(t1,t2,tf);
+ vadd(t3,tf,tf);
+ tf[3] = q1[3] * q2[3] - vdot(q1,q2);
+
+ dest[0] = tf[0];
+ dest[1] = tf[1];
+ dest[2] = tf[2];
+ dest[3] = tf[3];
+
+ if (++count > RENORMCOUNT) {
+ count = 0;
+ normalize_quat(dest);
+ }
+}
+
+/*
+ * Quaternions always obey: a^2 + b^2 + c^2 + d^2 = 1.0
+ * If they don't add up to 1.0, dividing by their magnitued will
+ * renormalize them.
+ *
+ * Note: See the following for more information on quaternions:
+ *
+ * - Shoemake, K., Animating rotation with quaternion curves, Computer
+ * Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985.
+ * - Pletinckx, D., Quaternion calculus as a basic tool in computer
+ * graphics, The Visual Computer 5, 2-13, 1989.
+ */
+static void
+normalize_quat(float q[4])
+{
+ int i;
+ float mag;
+
+ mag = (q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
+ for (i = 0; i < 4; i++) q[i] /= mag;
+}
+
+/*
+ * Build a rotation matrix, given a quaternion rotation.
+ *
+ */
+void
+build_rotmatrix(float m[4][4], float q[4])
+{
+ m[0][0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2]);
+ m[0][1] = 2.0 * (q[0] * q[1] - q[2] * q[3]);
+ m[0][2] = 2.0 * (q[2] * q[0] + q[1] * q[3]);
+ m[0][3] = 0.0;
+
+ m[1][0] = 2.0 * (q[0] * q[1] + q[2] * q[3]);
+ m[1][1]= 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0]);
+ m[1][2] = 2.0 * (q[1] * q[2] - q[0] * q[3]);
+ m[1][3] = 0.0;
+
+ m[2][0] = 2.0 * (q[2] * q[0] - q[1] * q[3]);
+ m[2][1] = 2.0 * (q[1] * q[2] + q[0] * q[3]);
+ m[2][2] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0]);
+ m[2][3] = 0.0;
+
+ m[3][0] = 0.0;
+ m[3][1] = 0.0;
+ m[3][2] = 0.0;
+ m[3][3] = 1.0;
+}
+
diff --git a/hacks/glx/trackball.h b/hacks/glx/trackball.h
new file mode 100644
index 0000000..4b84ab7
--- /dev/null
+++ b/hacks/glx/trackball.h
@@ -0,0 +1,82 @@
+/*
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+/*
+ * trackball.h
+ * A virtual trackball implementation
+ * Written by Gavin Bell for Silicon Graphics, November 1988.
+ */
+
+#ifndef __TRACKBALL_H__
+#define __TRACKBALL_H__
+
+/*
+ * Pass the x and y coordinates of the last and current positions of
+ * the mouse, scaled so they are from (-1.0 ... 1.0).
+ *
+ * The resulting rotation is returned as a quaternion rotation in the
+ * first paramater.
+ */
+void
+trackball(float q[4], float p1x, float p1y, float p2x, float p2y);
+
+/*
+ * Given two quaternions, add them together to get a third quaternion.
+ * Adding quaternions to get a compound rotation is analagous to adding
+ * translations to get a compound translation. When incrementally
+ * adding rotations, the first argument here should be the new
+ * rotation, the second and third the total rotation (which will be
+ * over-written with the resulting new total rotation).
+ */
+void
+add_quats(float *q1, float *q2, float *dest);
+
+/*
+ * A useful function, builds a rotation matrix in Matrix based on
+ * given quaternion.
+ */
+void
+build_rotmatrix(float m[4][4], float q[4]);
+
+/*
+ * This function computes a quaternion based on an axis (defined by
+ * the given vector) and an angle about which to rotate. The angle is
+ * expressed in radians. The result is put into the third argument.
+ */
+/* void
+axis_to_quat(float a[3], float phi, float q[4]); */
+
+#endif /* __TRACKBALL_H__ */
diff --git a/hacks/glx/tronbit.c b/hacks/glx/tronbit.c
new file mode 100644
index 0000000..b79309c
--- /dev/null
+++ b/hacks/glx/tronbit.c
@@ -0,0 +1,536 @@
+/* tronbit, Copyright (c) 2011-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define free_bit 0
+# define release_bit 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern const struct gllist *tronbit_idle1, *tronbit_idle2,
+ *tronbit_no, *tronbit_yes;
+static const struct gllist * const *all_objs[] = {
+ &tronbit_idle1, &tronbit_idle2, &tronbit_no, &tronbit_yes };
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+
+#define HISTORY_LENGTH 512
+typedef enum { BIT_IDLE1, BIT_IDLE2, BIT_NO, BIT_YES } bit_state;
+#define MODELS 4
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ double frequency;
+ double confidence;
+
+ double last_time;
+ unsigned char history [HISTORY_LENGTH];
+ unsigned char histogram [HISTORY_LENGTH];
+ int history_fp, histogram_fp;
+
+ GLuint dlists[MODELS], polys[MODELS];
+ char kbd;
+
+} bit_configuration;
+
+static bit_configuration *bps = NULL;
+
+static const GLfloat colors[][4] = {
+ { 0.66, 0.85, 1.00, 1.00 },
+ { 0.66, 0.85, 1.00, 1.00 },
+ { 1.00, 0.12, 0.12, 1.00 },
+ { 0.98, 0.85, 0.30, 1.00 }
+};
+
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt bit_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static int
+make_bit (ModeInfo *mi, bit_state which)
+{
+ static const GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat shiny = 128.0;
+ const GLfloat *color = colors[which];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ GLfloat s;
+ const struct gllist *gll;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glColor4f (color[0], color[1], color[2], color[3]);
+
+ glPushMatrix();
+ switch (which)
+ {
+ case BIT_IDLE1:
+ glRotatef (-44, 0, 1, 0); /* line up the models with each other */
+ glRotatef (-11, 1, 0, 0);
+ glRotatef ( 8, 0, 0, 1);
+ s = 1.0;
+ break;
+ case BIT_IDLE2:
+ glRotatef ( 16.0, 0, 0, 1);
+ glRotatef (-28.0, 1, 0, 0);
+ s = 1.0;
+ break;
+ case BIT_NO:
+ glRotatef ( 16.0, 0, 0, 1);
+ glRotatef (-28.0, 1, 0, 0);
+ s = 1.6;
+ break;
+ case BIT_YES:
+ glRotatef (-44.0, 0, 1, 0);
+ glRotatef (-32.0, 1, 0, 0);
+ s = 1.53;
+ break;
+ default:
+ abort();
+ break;
+ }
+ glScalef (s, s, s);
+ gll = *all_objs[which];
+ renderList (gll, wire);
+ polys += gll->points / 3;
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static void
+tick_bit (ModeInfo *mi, double now)
+{
+ bit_configuration *bp = &bps[MI_SCREEN(mi)];
+ double freq = bp->frequency;
+ int n = bp->history[bp->history_fp];
+ int histogram_speed = 3 * speed;
+ int i;
+
+ if (histogram_speed < 1) histogram_speed = 1;
+
+ if (n == BIT_YES || n == BIT_NO)
+ freq *= 2;
+
+ if (bp->button_down_p) return;
+
+ for (i = 0; i < histogram_speed; i++)
+ {
+ int nn = (n == BIT_YES ? 240 : n == BIT_NO ? 17 : 128);
+ int on = bp->histogram[(bp->histogram_fp-1) % countof(bp->histogram)];
+
+ /* smooth out the square wave a little bit */
+
+ if (!(nn > 100 && nn < 200) !=
+ !(on > 100 && on < 200))
+ nn += (((random() % 48) - 32) *
+ ((on > 100 && on < 200) ? 1 : -1));
+
+ nn += (random() % 16) - 8;
+
+ bp->histogram_fp++;
+ if (bp->histogram_fp >= countof(bp->history))
+ bp->histogram_fp = 0;
+ bp->histogram [bp->histogram_fp] = nn;
+ }
+
+
+ if (bp->last_time + freq > now && !bp->kbd) return;
+
+ bp->last_time = now;
+
+ bp->history_fp++;
+ if (bp->history_fp >= countof(bp->history))
+ bp->history_fp = 0;
+
+ if (bp->kbd)
+ {
+ n = (bp->kbd == '1' ? BIT_YES :
+ bp->kbd == '0' ? BIT_NO :
+ (random() & 1) ? BIT_YES : BIT_NO);
+ bp->kbd = 0;
+ }
+ else if (n == BIT_YES ||
+ n == BIT_NO ||
+ frand(1.0) >= bp->confidence)
+ n = (n == BIT_IDLE1 ? BIT_IDLE2 : BIT_IDLE1);
+ else
+ n = (random() & 1) ? BIT_YES : BIT_NO;
+
+ bp->history [bp->history_fp] = n;
+}
+
+
+static int
+animate_bits (ModeInfo *mi, bit_state omodel, bit_state nmodel, GLfloat ratio)
+{
+ bit_configuration *bp = &bps[MI_SCREEN(mi)];
+ int polys = 0;
+ GLfloat scale = sin (ratio * M_PI / 2);
+ GLfloat osize, nsize, small;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ }
+
+ if ((omodel == BIT_IDLE1 || omodel == BIT_IDLE2) &&
+ (nmodel == BIT_IDLE1 || nmodel == BIT_IDLE2))
+ small = 0.9;
+ else
+ small = 0.5;
+
+ nsize = small + (1 - small) * scale;
+ osize = small + (1 - small) * (1 - scale);
+
+ glPushMatrix();
+ glScalef (osize, osize, osize);
+ glCallList (bp->dlists [omodel]);
+ polys += bp->polys [omodel];
+ glPopMatrix();
+
+ glPushMatrix();
+ glScalef (nsize, nsize, nsize);
+ glCallList (bp->dlists [nmodel]);
+ polys += bp->polys [nmodel];
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static int
+draw_histogram (ModeInfo *mi, GLfloat ratio)
+{
+ bit_configuration *bp = &bps[MI_SCREEN(mi)];
+ int samples = countof (bp->histogram);
+ GLfloat scalex = (GLfloat) mi->xgwa.width / samples;
+ GLfloat scaley = mi->xgwa.height / 255.0 / 4; /* about 1/4th of screen */
+ int polys = 0;
+ int overlays = 5;
+ int k;
+
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+
+ glLoadIdentity();
+ /* glRotatef(current_device_rotation(), 0, 0, 1); */
+ glOrtho (0, mi->xgwa.width, 0, mi->xgwa.height, -1, 1);
+
+ for (k = 0; k < overlays; k++)
+ {
+ int i, j;
+ GLfloat a = (GLfloat) k / overlays;
+
+ glColor3f (0.3 * a, 0.7 * a, 1.0 * a);
+
+ glBegin (GL_LINE_STRIP);
+
+ j = bp->histogram_fp + 1;
+ for (i = 0; i < samples; i++)
+ {
+ GLfloat x, y, z;
+ if (j >= samples) j = 0;
+ x = i;
+ y = bp->histogram[j];
+ z = 0;
+
+ y += (int) ((random() % 16) - 8);
+ y += 16; /* margin at bottom of screen */
+
+ x *= scalex;
+ y *= scaley;
+
+ glVertex3f (x, y, z);
+ ++j;
+ polys++;
+ }
+ glEnd();
+ }
+
+ glPopMatrix();
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+
+ return polys;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_bit (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+ENTRYPOINT Bool
+bit_handle_event (ModeInfo *mi, XEvent *event)
+{
+ bit_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+ if (keysym == XK_Up || keysym == XK_Left || keysym == XK_Prior)
+ c = '1';
+ else if (keysym == XK_Down || keysym == XK_Right || keysym == XK_Next)
+ c = '0';
+
+ if (c == ' ' || c == '\t' || c == '\n' || c == '1' || c == '0')
+ {
+ bp->kbd = c;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_bit (ModeInfo *mi)
+{
+ bit_configuration *bp;
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_bit (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ {
+ double spin_speed = 3.0;
+ double wander_speed = 0.03 * speed;
+ double spin_accel = 4.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (False);
+ }
+
+ for (i = 0; i < countof(bp->dlists); i++)
+ {
+ bp->dlists[i] = glGenLists (1);
+ glNewList (bp->dlists[i], GL_COMPILE);
+ bp->polys [i] = make_bit (mi, i);
+ glEndList ();
+ }
+
+ bp->frequency = 0.30 / speed; /* parity around 3x/second */
+ bp->confidence = 0.06; /* provide answer 1/15 or so */
+
+ for (i = 0; i < countof(bp->histogram); i++)
+ bp->histogram[i] = 128 + (random() % 16) - 8;
+}
+
+
+ENTRYPOINT void
+draw_bit (ModeInfo *mi)
+{
+ bit_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ glPushMatrix ();
+ glScalef(1.1, 1.1, 1.1);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 11,
+ (y - 0.5) * 5,
+ (z - 0.5) * 3);
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (6, 6, 6);
+
+ {
+ int nmodel = bp->history [bp->history_fp];
+ int omodel = bp->history [bp->history_fp > 0
+ ? bp->history_fp-1
+ : countof(bp->history)-1];
+ double now = double_time();
+ double ratio = 1 - ((bp->last_time + bp->frequency) - now) / bp->frequency;
+ if (ratio > 1) ratio = 1;
+ mi->polygon_count += draw_histogram (mi, ratio);
+
+ if (MI_WIDTH(mi) > MI_HEIGHT(mi) * 5) { /* wide window: scale up */
+ glScalef (8, 8, 8);
+ }
+
+ mi->polygon_count += animate_bits (mi, omodel, nmodel, ratio);
+ tick_bit (mi, now);
+ }
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("TronBit", tronbit, bit)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/tronbit.man b/hacks/glx/tronbit.man
new file mode 100644
index 0000000..9001f0e
--- /dev/null
+++ b/hacks/glx/tronbit.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+tronbit - Yes. Yes. No. Yes. Yes. No. Yes. Yes yes yes yes yes.
+.SH SYNOPSIS
+.B tronbit
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-spin]
+[\-wander]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws an animation of the character "Bit" from the film, \fITron\fP.
+
+The "yes" state is a tetrahedron; the "no" state is the second
+stellation of an icosahedron; and the idle state oscillates between
+a small triambic icosahedron and the compound of an icosahedron and
+a dodecahedron.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the animation should run.
+Less than 1 for slower, greater than 1 for faster.
+.TP 8
+.B \-no\-spin
+Don't rotate.
+.TP 8
+.B \-no\-wander
+Don't wander around.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR polyhedra (1),
+.BR dangerball (1),
+.BR companioncube (1),
+.BR xscreensaver (1),
+.BR TRON.
+.SH COPYRIGHT
+Copyright \(co 2011 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski, who fights for the users.
diff --git a/hacks/glx/tronbit_idle1.c b/hacks/glx/tronbit_idle1.c
new file mode 100644
index 0000000..f053259
--- /dev/null
+++ b/hacks/glx/tronbit_idle1.c
@@ -0,0 +1,247 @@
+/* odd parity = small triambic icosahedron */
+
+#include "gllist.h"
+static const float data[]={
+ 0,0,1,0.263523,-0.204124,0.372678,
+ 0,0,1,0.263523,0.10775,0.372678,
+ 0,0,1,0.045015,0.33028,0.372678,
+ 0,0,1,0.263523,-0.204124,0.372678,
+ 0,0,1,0.045015,0.33028,0.372678,
+ 0,0,1,-0.225076,0.174343,0.372678,
+ 0,0,1,0.263523,-0.204124,0.372678,
+ 0,0,1,-0.225076,0.174343,0.372678,
+ 0,0,1,-0.308538,-0.126156,0.372678,
+ 0,0,1,0.263523,-0.204124,0.372678,
+ 0,0,1,-0.308538,-0.126156,0.372678,
+ 0,0,1,-0.038448,-0.282093,0.372678,
+ 0.942809,0,0.333333,0.263523,-0.204124,0.372678,
+ 0.942809,0,0.333333,0.36418,-0.282093,0.087977,
+ 0.942809,0,0.333333,0.45421,-0.126156,-0.166667,
+ 0.942809,0,0.333333,0.263523,-0.204124,0.372678,
+ 0.942809,0,0.333333,0.45421,-0.126156,-0.166667,
+ 0.942809,0,0.333333,0.426389,0.174343,-0.087977,
+ 0.942809,0,0.333333,0.263523,-0.204124,0.372678,
+ 0.942809,0,0.333333,0.426389,0.174343,-0.087977,
+ 0.942809,0,0.333333,0.336359,0.33028,0.166667,
+ 0.942809,0,0.333333,0.263523,-0.204124,0.372678,
+ 0.942809,0,0.333333,0.336359,0.33028,0.166667,
+ 0.942809,0,0.333333,0.263523,0.10775,0.372678,
+ 0.672718,0.66056,0.333333,0.263523,0.10775,0.372678,
+ 0.672718,0.66056,0.333333,0.471405,0,0.166667,
+ 0.672718,0.66056,0.333333,0.426389,0.174343,-0.087977,
+ 0.672718,0.66056,0.333333,0.263523,0.10775,0.372678,
+ 0.672718,0.66056,0.333333,0.426389,0.174343,-0.087977,
+ 0.672718,0.66056,0.333333,0.235702,0.408248,-0.166667,
+ 0.672718,0.66056,0.333333,0.263523,0.10775,0.372678,
+ 0.672718,0.66056,0.333333,0.235702,0.408248,-0.166667,
+ 0.672718,0.66056,0.333333,0.062209,0.456436,0.087977,
+ 0.672718,0.66056,0.333333,0.263523,0.10775,0.372678,
+ 0.672718,0.66056,0.333333,0.062209,0.456436,0.087977,
+ 0.672718,0.66056,0.333333,0.045015,0.33028,0.372678,
+ -0.471405,0.816497,0.333333,0.045015,0.33028,0.372678,
+ -0.471405,0.816497,0.333333,0.062209,0.456436,0.087977,
+ -0.471405,0.816497,0.333333,-0.117851,0.456436,-0.166667,
+ -0.471405,0.816497,0.333333,0.045015,0.33028,0.372678,
+ -0.471405,0.816497,0.333333,-0.117851,0.456436,-0.166667,
+ -0.471405,0.816497,0.333333,-0.36418,0.282093,-0.087977,
+ -0.471405,0.816497,0.333333,0.045015,0.33028,0.372678,
+ -0.471405,0.816497,0.333333,-0.36418,0.282093,-0.087977,
+ -0.471405,0.816497,0.333333,-0.45421,0.126156,0.166667,
+ -0.471405,0.816497,0.333333,0.045015,0.33028,0.372678,
+ -0.471405,0.816497,0.333333,-0.45421,0.126156,0.166667,
+ -0.471405,0.816497,0.333333,-0.225076,0.174343,0.372678,
+ -0.908421,0.252311,0.333333,-0.225076,0.174343,0.372678,
+ -0.908421,0.252311,0.333333,-0.235702,0.408248,0.166667,
+ -0.908421,0.252311,0.333333,-0.36418,0.282093,-0.087977,
+ -0.90842,0.252312,0.333333,-0.225076,0.174343,0.372678,
+ -0.90842,0.252312,0.333333,-0.36418,0.282093,-0.087977,
+ -0.90842,0.252312,0.333333,-0.471405,0,-0.166667,
+ -0.90842,0.252311,0.333334,-0.225076,0.174343,0.372678,
+ -0.90842,0.252311,0.333334,-0.471405,0,-0.166667,
+ -0.90842,0.252311,0.333334,-0.426389,-0.174343,0.087977,
+ -0.908421,0.252311,0.333333,-0.225076,0.174343,0.372678,
+ -0.908421,0.252311,0.333333,-0.426389,-0.174343,0.087977,
+ -0.908421,0.252311,0.333333,-0.308538,-0.126156,0.372678,
+ -0.471405,-0.816497,0.333333,-0.308538,-0.126156,0.372678,
+ -0.471405,-0.816497,0.333333,-0.426389,-0.174343,0.087977,
+ -0.471405,-0.816497,0.333333,-0.336359,-0.33028,-0.166667,
+ -0.471404,-0.816497,0.333333,-0.308538,-0.126156,0.372678,
+ -0.471404,-0.816497,0.333333,-0.336359,-0.33028,-0.166667,
+ -0.471404,-0.816497,0.333333,-0.062209,-0.456436,-0.087977,
+ -0.471405,-0.816497,0.333333,-0.308538,-0.126156,0.372678,
+ -0.471405,-0.816497,0.333333,-0.062209,-0.456436,-0.087977,
+ -0.471405,-0.816497,0.333333,0.117851,-0.456436,0.166667,
+ -0.471405,-0.816497,0.333333,-0.308538,-0.126156,0.372678,
+ -0.471405,-0.816497,0.333333,0.117851,-0.456436,0.166667,
+ -0.471405,-0.816497,0.333333,-0.038448,-0.282093,0.372678,
+ 0.235702,-0.912871,0.333333,-0.038448,-0.282093,0.372678,
+ 0.235702,-0.912871,0.333333,-0.235702,-0.408248,0.166667,
+ 0.235702,-0.912871,0.333333,-0.062209,-0.456436,-0.087977,
+ 0.235702,-0.912871,0.333333,-0.038448,-0.282093,0.372678,
+ 0.235702,-0.912871,0.333333,-0.062209,-0.456436,-0.087977,
+ 0.235702,-0.912871,0.333333,0.235702,-0.408248,-0.166667,
+ 0.235702,-0.912871,0.333333,-0.038448,-0.282093,0.372678,
+ 0.235702,-0.912871,0.333333,0.235702,-0.408248,-0.166667,
+ 0.235702,-0.912871,0.333333,0.36418,-0.282093,0.087977,
+ 0.235702,-0.912871,0.333333,-0.038448,-0.282093,0.372678,
+ 0.235702,-0.912871,0.333333,0.36418,-0.282093,0.087977,
+ 0.235702,-0.912871,0.333333,0.263523,-0.204124,0.372678,
+ 0.09003,0.66056,0.745356,0.263523,0.10775,0.372678,
+ 0.09003,0.66056,0.745356,0.336359,0.33028,0.166667,
+ 0.09003,0.66056,0.745356,0.062209,0.456436,0.087977,
+ 0.09003,0.66056,0.745356,0.263523,0.10775,0.372678,
+ 0.09003,0.66056,0.745356,0.062209,0.456436,0.087977,
+ 0.09003,0.66056,0.745356,-0.235702,0.408248,0.166667,
+ 0.09003,0.66056,0.745356,0.263523,0.10775,0.372678,
+ 0.09003,0.66056,0.745356,-0.235702,0.408248,0.166667,
+ 0.09003,0.66056,0.745356,-0.225076,0.174343,0.372678,
+ 0.09003,0.660559,0.745356,0.263523,0.10775,0.372678,
+ 0.09003,0.660559,0.745356,-0.225076,0.174343,0.372678,
+ 0.09003,0.660559,0.745356,0,0,0.5,
+ 0.471405,0.816497,-0.333333,0.336359,0.33028,0.166667,
+ 0.471405,0.816497,-0.333333,0.426389,0.174343,-0.087977,
+ 0.471405,0.816497,-0.333333,0.308538,0.126156,-0.372678,
+ 0.471405,0.816497,-0.333333,0.336359,0.33028,0.166667,
+ 0.471405,0.816497,-0.333333,0.308538,0.126156,-0.372678,
+ 0.471405,0.816497,-0.333333,0.038448,0.282093,-0.372678,
+ 0.471405,0.816497,-0.333333,0.336359,0.33028,0.166667,
+ 0.471405,0.816497,-0.333333,0.038448,0.282093,-0.372678,
+ 0.471405,0.816497,-0.333333,-0.117851,0.456436,-0.166667,
+ 0.471404,0.816497,-0.333333,0.336359,0.33028,0.166667,
+ 0.471404,0.816497,-0.333333,-0.117851,0.456436,-0.166667,
+ 0.471404,0.816497,-0.333333,0.062209,0.456436,0.087977,
+ 0.617077,0.252311,-0.745356,0.426389,0.174343,-0.087977,
+ 0.617077,0.252311,-0.745356,0.45421,-0.126156,-0.166667,
+ 0.617077,0.252311,-0.745356,0.225076,-0.174343,-0.372678,
+ 0.617076,0.252311,-0.745356,0.426389,0.174343,-0.087977,
+ 0.617076,0.252311,-0.745356,0.225076,-0.174343,-0.372678,
+ 0.617076,0.252311,-0.745356,0,0,-0.5,
+ 0.617077,0.252311,-0.745356,0.426389,0.174343,-0.087977,
+ 0.617077,0.252311,-0.745356,0,0,-0.5,
+ 0.617077,0.252311,-0.745356,0.038448,0.282093,-0.372678,
+ 0.617077,0.252311,-0.745356,0.426389,0.174343,-0.087977,
+ 0.617077,0.252311,-0.745356,0.038448,0.282093,-0.372678,
+ 0.617077,0.252311,-0.745356,0.235702,0.408248,-0.166667,
+ 0.471405,-0.816497,-0.333333,0.45421,-0.126156,-0.166667,
+ 0.471405,-0.816497,-0.333333,0.36418,-0.282093,0.087977,
+ 0.471405,-0.816497,-0.333333,0.117851,-0.456436,0.166667,
+ 0.471405,-0.816497,-0.333333,0.45421,-0.126156,-0.166667,
+ 0.471405,-0.816497,-0.333333,0.117851,-0.456436,0.166667,
+ 0.471405,-0.816497,-0.333333,-0.062209,-0.456436,-0.087977,
+ 0.471405,-0.816497,-0.333333,0.45421,-0.126156,-0.166667,
+ 0.471405,-0.816497,-0.333333,-0.062209,-0.456436,-0.087977,
+ 0.471405,-0.816497,-0.333333,-0.045015,-0.33028,-0.372678,
+ 0.471405,-0.816497,-0.333333,0.45421,-0.126156,-0.166667,
+ 0.471405,-0.816497,-0.333333,-0.045015,-0.33028,-0.372678,
+ 0.471405,-0.816497,-0.333333,0.225076,-0.174343,-0.372678,
+ -0.235702,0.912871,-0.333333,0.062209,0.456436,0.087977,
+ -0.235702,0.912871,-0.333333,0.235702,0.408248,-0.166667,
+ -0.235702,0.912871,-0.333333,0.038448,0.282093,-0.372678,
+ -0.235702,0.912871,-0.333333,0.062209,0.456436,0.087977,
+ -0.235702,0.912871,-0.333333,0.038448,0.282093,-0.372678,
+ -0.235702,0.912871,-0.333333,-0.263523,0.204124,-0.372678,
+ -0.235702,0.912871,-0.333333,0.062209,0.456436,0.087977,
+ -0.235702,0.912871,-0.333333,-0.263523,0.204124,-0.372678,
+ -0.235702,0.912871,-0.333333,-0.36418,0.282093,-0.087977,
+ -0.235702,0.912871,-0.333333,0.062209,0.456436,0.087977,
+ -0.235702,0.912871,-0.333333,-0.36418,0.282093,-0.087977,
+ -0.235702,0.912871,-0.333333,-0.235702,0.408248,0.166667,
+ 0.90842,-0.252312,-0.333334,0.426389,0.174343,-0.087977,
+ 0.90842,-0.252312,-0.333334,0.471405,0,0.166667,
+ 0.90842,-0.252312,-0.333334,0.36418,-0.282093,0.087977,
+ 0.908421,-0.252311,-0.333333,0.426389,0.174343,-0.087977,
+ 0.908421,-0.252311,-0.333333,0.36418,-0.282093,0.087977,
+ 0.908421,-0.252311,-0.333333,0.235702,-0.408248,-0.166667,
+ 0.908421,-0.252311,-0.333333,0.426389,0.174343,-0.087977,
+ 0.908421,-0.252311,-0.333333,0.235702,-0.408248,-0.166667,
+ 0.908421,-0.252311,-0.333333,0.225076,-0.174343,-0.372678,
+ 0.908421,-0.252311,-0.333333,0.426389,0.174343,-0.087977,
+ 0.908421,-0.252311,-0.333333,0.225076,-0.174343,-0.372678,
+ 0.908421,-0.252311,-0.333333,0.308538,0.126156,-0.372678,
+ 0.527046,-0.408248,0.745356,0.471405,0,0.166667,
+ 0.527046,-0.408248,0.745356,0.263523,0.10775,0.372678,
+ 0.527046,-0.408248,0.745356,0,0,0.5,
+ 0.527046,-0.408248,0.745356,0.471405,0,0.166667,
+ 0.527046,-0.408248,0.745356,0,0,0.5,
+ 0.527046,-0.408248,0.745356,-0.038448,-0.282093,0.372678,
+ 0.527046,-0.408248,0.745356,0.471405,0,0.166667,
+ 0.527046,-0.408248,0.745356,-0.038448,-0.282093,0.372678,
+ 0.527046,-0.408248,0.745356,0.117851,-0.456436,0.166667,
+ 0.527047,-0.408249,0.745356,0.471405,0,0.166667,
+ 0.527047,-0.408249,0.745356,0.117851,-0.456436,0.166667,
+ 0.527047,-0.408249,0.745356,0.36418,-0.282093,0.087977,
+ -0.617077,-0.252311,0.745356,-0.225076,0.174343,0.372678,
+ -0.617077,-0.252311,0.745356,-0.45421,0.126156,0.166667,
+ -0.617077,-0.252311,0.745356,-0.426389,-0.174343,0.087977,
+ -0.617077,-0.252311,0.745356,-0.225076,0.174343,0.372678,
+ -0.617077,-0.252311,0.745356,-0.426389,-0.174343,0.087977,
+ -0.617077,-0.252311,0.745356,-0.235702,-0.408248,0.166667,
+ -0.617077,-0.252311,0.745356,-0.225076,0.174343,0.372678,
+ -0.617077,-0.252311,0.745356,-0.235702,-0.408248,0.166667,
+ -0.617077,-0.252311,0.745356,-0.038448,-0.282093,0.372678,
+ -0.617076,-0.252311,0.745356,-0.225076,0.174343,0.372678,
+ -0.617076,-0.252311,0.745356,-0.038448,-0.282093,0.372678,
+ -0.617076,-0.252311,0.745356,0,0,0.5,
+ -0.942809,0,-0.333333,-0.45421,0.126156,0.166667,
+ -0.942809,0,-0.333333,-0.36418,0.282093,-0.087977,
+ -0.942809,0,-0.333333,-0.263523,0.204124,-0.372678,
+ -0.942809,0,-0.333333,-0.45421,0.126156,0.166667,
+ -0.942809,0,-0.333333,-0.263523,0.204124,-0.372678,
+ -0.942809,0,-0.333333,-0.263523,-0.10775,-0.372678,
+ -0.942809,0,-0.333333,-0.45421,0.126156,0.166667,
+ -0.942809,0,-0.333333,-0.263523,-0.10775,-0.372678,
+ -0.942809,0,-0.333333,-0.336359,-0.33028,-0.166667,
+ -0.942809,0,-0.333333,-0.45421,0.126156,0.166667,
+ -0.942809,0,-0.333333,-0.336359,-0.33028,-0.166667,
+ -0.942809,0,-0.333333,-0.426389,-0.174343,0.087977,
+ -0.527046,0.408248,-0.745356,-0.36418,0.282093,-0.087977,
+ -0.527046,0.408248,-0.745356,-0.117851,0.456436,-0.166667,
+ -0.527046,0.408248,-0.745356,0.038448,0.282093,-0.372678,
+ -0.527046,0.408248,-0.745356,-0.36418,0.282093,-0.087977,
+ -0.527046,0.408248,-0.745356,0.038448,0.282093,-0.372678,
+ -0.527046,0.408248,-0.745356,0,0,-0.5,
+ -0.527046,0.408248,-0.745356,-0.36418,0.282093,-0.087977,
+ -0.527046,0.408248,-0.745356,0,0,-0.5,
+ -0.527046,0.408248,-0.745356,-0.263523,-0.10775,-0.372678,
+ -0.527046,0.408249,-0.745356,-0.36418,0.282093,-0.087977,
+ -0.527046,0.408249,-0.745356,-0.263523,-0.10775,-0.372678,
+ -0.527046,0.408249,-0.745356,-0.471405,0,-0.166667,
+ -0.672718,-0.66056,-0.333333,-0.426389,-0.174343,0.087977,
+ -0.672718,-0.66056,-0.333333,-0.471405,0,-0.166667,
+ -0.672718,-0.66056,-0.333333,-0.263523,-0.10775,-0.372678,
+ -0.672718,-0.66056,-0.333333,-0.426389,-0.174343,0.087977,
+ -0.672718,-0.66056,-0.333333,-0.263523,-0.10775,-0.372678,
+ -0.672718,-0.66056,-0.333333,-0.045015,-0.33028,-0.372678,
+ -0.672718,-0.66056,-0.333333,-0.426389,-0.174343,0.087977,
+ -0.672718,-0.66056,-0.333333,-0.045015,-0.33028,-0.372678,
+ -0.672718,-0.66056,-0.333333,-0.062209,-0.456436,-0.087977,
+ -0.672718,-0.66056,-0.333333,-0.426389,-0.174343,0.087977,
+ -0.672718,-0.66056,-0.333333,-0.062209,-0.456436,-0.087977,
+ -0.672718,-0.66056,-0.333333,-0.235702,-0.408248,0.166667,
+ -0.09003,-0.66056,-0.745356,-0.062209,-0.456436,-0.087977,
+ -0.09003,-0.66056,-0.745356,-0.336359,-0.33028,-0.166667,
+ -0.09003,-0.66056,-0.745356,-0.263523,-0.10775,-0.372678,
+ -0.09003,-0.66056,-0.745356,-0.062209,-0.456436,-0.087977,
+ -0.09003,-0.66056,-0.745356,-0.263523,-0.10775,-0.372678,
+ -0.09003,-0.66056,-0.745356,0,0,-0.5,
+ -0.09003,-0.66056,-0.745356,-0.062209,-0.456436,-0.087977,
+ -0.09003,-0.66056,-0.745356,0,0,-0.5,
+ -0.09003,-0.66056,-0.745356,0.225076,-0.174343,-0.372678,
+ -0.09003,-0.66056,-0.745356,-0.062209,-0.456436,-0.087977,
+ -0.09003,-0.66056,-0.745356,0.225076,-0.174343,-0.372678,
+ -0.09003,-0.66056,-0.745356,0.235702,-0.408248,-0.166667,
+ 0,0,-1,0.308538,0.126156,-0.372678,
+ 0,0,-1,0.225076,-0.174343,-0.372678,
+ 0,0,-1,-0.045015,-0.33028,-0.372678,
+ 0,0,-1,0.308538,0.126156,-0.372678,
+ 0,0,-1,-0.045015,-0.33028,-0.372678,
+ 0,0,-1,-0.263523,-0.10775,-0.372678,
+ 0,0,-1,0.308538,0.126156,-0.372678,
+ 0,0,-1,-0.263523,-0.10775,-0.372678,
+ 0,0,-1,-0.263523,0.204124,-0.372678,
+ 0,0,-1,0.308538,0.126156,-0.372678,
+ 0,0,-1,-0.263523,0.204124,-0.372678,
+ 0,0,-1,0.038448,0.282093,-0.372678
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,240,data,NULL};
+const struct gllist *tronbit_idle1=&frame;
diff --git a/hacks/glx/tronbit_idle2.c b/hacks/glx/tronbit_idle2.c
new file mode 100644
index 0000000..8ee0380
--- /dev/null
+++ b/hacks/glx/tronbit_idle2.c
@@ -0,0 +1,175 @@
+/* even parity = compound of icosahedron and dodecahedron */
+
+#include "gllist.h"
+static const float data[]={
+ 0.491123,0.356822,0.794655,0.138196,0.425326,0.223607,
+ 0.491123,0.356822,0.794655,0,0,0.5,
+ 0.491123,0.356822,0.794655,0.447213,0,0.223607,
+ -0.187593,0.57735,0.794655,-0.361804,0.262865,0.223607,
+ -0.187593,0.57735,0.794655,0,0,0.5,
+ -0.187593,0.57735,0.794655,0.138196,0.425326,0.223607,
+ -0.607062,0,0.794655,-0.361804,-0.262865,0.223607,
+ -0.607062,0,0.794655,0,0,0.5,
+ -0.607062,0,0.794655,-0.361804,0.262865,0.223607,
+ -0.187593,-0.57735,0.794655,0.138196,-0.425326,0.223607,
+ -0.187593,-0.57735,0.794655,0,0,0.5,
+ -0.187593,-0.57735,0.794655,-0.361804,-0.262865,0.223607,
+ 0.491123,-0.356822,0.794655,0,0,0.5,
+ 0.491123,-0.356822,0.794655,0.138196,-0.425326,0.223607,
+ 0.491123,-0.356822,0.794655,0.447213,0,0.223607,
+ 0.794655,-0.57735,0.187593,0.361804,-0.262865,-0.223607,
+ 0.794655,-0.57735,0.187593,0.447213,0,0.223607,
+ 0.794655,-0.57735,0.187593,0.138196,-0.425326,0.223607,
+ 0.982247,0,-0.187592,0.447213,0,0.223607,
+ 0.982247,0,-0.187592,0.361804,-0.262865,-0.223607,
+ 0.982247,0,-0.187592,0.361804,0.262865,-0.223607,
+ 0.794655,0.57735,0.187593,0.447213,0,0.223607,
+ 0.794655,0.57735,0.187593,0.361804,0.262865,-0.223607,
+ 0.794655,0.57735,0.187593,0.138196,0.425326,0.223607,
+ 0.303531,0.934172,-0.187592,-0.138196,0.425326,-0.223607,
+ 0.303531,0.934172,-0.187592,0.138196,0.425326,0.223607,
+ 0.303531,0.934172,-0.187592,0.361804,0.262865,-0.223607,
+ -0.303531,0.934172,0.187592,0.138196,0.425326,0.223607,
+ -0.303531,0.934172,0.187592,-0.138196,0.425326,-0.223607,
+ -0.303531,0.934172,0.187592,-0.361804,0.262865,0.223607,
+ -0.794655,0.57735,-0.187593,-0.447213,0,-0.223607,
+ -0.794655,0.57735,-0.187593,-0.361804,0.262865,0.223607,
+ -0.794655,0.57735,-0.187593,-0.138196,0.425326,-0.223607,
+ -0.982247,0,0.187592,-0.361804,0.262865,0.223607,
+ -0.982247,0,0.187592,-0.447213,0,-0.223607,
+ -0.982247,0,0.187592,-0.361804,-0.262865,0.223607,
+ -0.794655,-0.57735,-0.187593,-0.138196,-0.425326,-0.223607,
+ -0.794655,-0.57735,-0.187593,-0.361804,-0.262865,0.223607,
+ -0.794655,-0.57735,-0.187593,-0.447213,0,-0.223607,
+ -0.303531,-0.934172,0.187592,-0.361804,-0.262865,0.223607,
+ -0.303531,-0.934172,0.187592,-0.138196,-0.425326,-0.223607,
+ -0.303531,-0.934172,0.187592,0.138196,-0.425326,0.223607,
+ 0.303531,-0.934172,-0.187592,0.138196,-0.425326,0.223607,
+ 0.303531,-0.934172,-0.187592,-0.138196,-0.425326,-0.223607,
+ 0.303531,-0.934172,-0.187592,0.361804,-0.262865,-0.223607,
+ 0.607062,0,-0.794655,0,0,-0.5,
+ 0.607062,0,-0.794655,0.361804,0.262865,-0.223607,
+ 0.607062,0,-0.794655,0.361804,-0.262865,-0.223607,
+ 0.187593,0.57735,-0.794655,0.361804,0.262865,-0.223607,
+ 0.187593,0.57735,-0.794655,0,0,-0.5,
+ 0.187593,0.57735,-0.794655,-0.138196,0.425326,-0.223607,
+ 0.187593,-0.57735,-0.794655,0,0,-0.5,
+ 0.187593,-0.57735,-0.794655,0.361804,-0.262865,-0.223607,
+ 0.187593,-0.57735,-0.794655,-0.138196,-0.425326,-0.223607,
+ -0.491123,0.356822,-0.794655,-0.138196,0.425326,-0.223607,
+ -0.491123,0.356822,-0.794655,0,0,-0.5,
+ -0.491123,0.356822,-0.794655,-0.447213,0,-0.223607,
+ -0.491123,-0.356822,-0.794655,-0.447213,0,-0.223607,
+ -0.491123,-0.356822,-0.794655,0,0,-0.5,
+ -0.491123,-0.356822,-0.794655,-0.138196,-0.425326,-0.223607,
+ 0,0,1,0.223607,0.16246,0.361804,
+ 0,0,1,-0.08541,0.262865,0.361804,
+ 0,0,1,-0.276393,0,0.361804,
+ 0,0,1,0.223607,0.16246,0.361804,
+ 0,0,1,-0.276393,0,0.361804,
+ 0,0,1,-0.08541,-0.262865,0.361804,
+ 0,0,1,0.223607,0.16246,0.361804,
+ 0,0,1,-0.08541,-0.262865,0.361804,
+ 0,0,1,0.223607,-0.16246,0.361804,
+ 0.894427,0,0.447214,0.361804,-0.262865,0.08541,
+ 0.894427,0,0.447214,0.447213,0,-0.08541,
+ 0.894427,0,0.447214,0.361804,0.262865,0.08541,
+ 0.894428,0,0.447213,0.361804,-0.262865,0.08541,
+ 0.894428,0,0.447213,0.361804,0.262865,0.08541,
+ 0.894428,0,0.447213,0.223607,0.16246,0.361804,
+ 0.894428,0,0.447213,0.361804,-0.262865,0.08541,
+ 0.894428,0,0.447213,0.223607,0.16246,0.361804,
+ 0.894428,0,0.447213,0.223607,-0.16246,0.361804,
+ 0.276393,0.85065,0.447214,0.361804,0.262865,0.08541,
+ 0.276393,0.85065,0.447214,0.138196,0.425326,-0.08541,
+ 0.276393,0.85065,0.447214,-0.138196,0.425326,0.08541,
+ 0.276393,0.850651,0.447213,0.361804,0.262865,0.08541,
+ 0.276393,0.850651,0.447213,-0.138196,0.425326,0.08541,
+ 0.276393,0.850651,0.447213,-0.08541,0.262865,0.361804,
+ 0.276393,0.850652,0.447212,0.361804,0.262865,0.08541,
+ 0.276393,0.850652,0.447212,-0.08541,0.262865,0.361804,
+ 0.276393,0.850652,0.447212,0.223607,0.16246,0.361804,
+ -0.723606,0.525731,0.447215,-0.138196,0.425326,0.08541,
+ -0.723606,0.525731,0.447215,-0.361804,0.262865,-0.08541,
+ -0.723606,0.525731,0.447215,-0.447213,0,0.08541,
+ -0.723607,0.525731,0.447213,-0.138196,0.425326,0.08541,
+ -0.723607,0.525731,0.447213,-0.447213,0,0.08541,
+ -0.723607,0.525731,0.447213,-0.276393,0,0.361804,
+ -0.723607,0.525731,0.447214,-0.138196,0.425326,0.08541,
+ -0.723607,0.525731,0.447214,-0.276393,0,0.361804,
+ -0.723607,0.525731,0.447214,-0.08541,0.262865,0.361804,
+ -0.723606,-0.525731,0.447215,-0.447213,0,0.08541,
+ -0.723606,-0.525731,0.447215,-0.361804,-0.262865,-0.08541,
+ -0.723606,-0.525731,0.447215,-0.138196,-0.425326,0.08541,
+ -0.723607,-0.525731,0.447214,-0.447213,0,0.08541,
+ -0.723607,-0.525731,0.447214,-0.138196,-0.425326,0.08541,
+ -0.723607,-0.525731,0.447214,-0.08541,-0.262865,0.361804,
+ -0.723607,-0.525731,0.447213,-0.447213,0,0.08541,
+ -0.723607,-0.525731,0.447213,-0.08541,-0.262865,0.361804,
+ -0.723607,-0.525731,0.447213,-0.276393,0,0.361804,
+ 0.276393,-0.85065,0.447214,-0.138196,-0.425326,0.08541,
+ 0.276393,-0.85065,0.447214,0.138196,-0.425326,-0.08541,
+ 0.276393,-0.85065,0.447214,0.361804,-0.262865,0.08541,
+ 0.276394,-0.850651,0.447213,-0.138196,-0.425326,0.08541,
+ 0.276394,-0.850651,0.447213,0.361804,-0.262865,0.08541,
+ 0.276394,-0.850651,0.447213,0.223607,-0.16246,0.361804,
+ 0.276393,-0.850651,0.447214,-0.138196,-0.425326,0.08541,
+ 0.276393,-0.850651,0.447214,0.223607,-0.16246,0.361804,
+ 0.276393,-0.850651,0.447214,-0.08541,-0.262865,0.361804,
+ 0.723607,0.525731,-0.447213,0.447213,0,-0.08541,
+ 0.723607,0.525731,-0.447213,0.276393,0,-0.361804,
+ 0.723607,0.525731,-0.447213,0.08541,0.262865,-0.361804,
+ 0.723607,0.525731,-0.447214,0.447213,0,-0.08541,
+ 0.723607,0.525731,-0.447214,0.08541,0.262865,-0.361804,
+ 0.723607,0.525731,-0.447214,0.138196,0.425326,-0.08541,
+ 0.723606,0.525731,-0.447215,0.447213,0,-0.08541,
+ 0.723606,0.525731,-0.447215,0.138196,0.425326,-0.08541,
+ 0.723606,0.525731,-0.447215,0.361804,0.262865,0.08541,
+ 0.723606,-0.525732,-0.447214,0.361804,-0.262865,0.08541,
+ 0.723606,-0.525732,-0.447214,0.138196,-0.425326,-0.08541,
+ 0.723606,-0.525732,-0.447214,0.08541,-0.262865,-0.361804,
+ 0.723607,-0.525731,-0.447214,0.361804,-0.262865,0.08541,
+ 0.723607,-0.525731,-0.447214,0.08541,-0.262865,-0.361804,
+ 0.723607,-0.525731,-0.447214,0.276393,0,-0.361804,
+ 0.723607,-0.52573,-0.447214,0.361804,-0.262865,0.08541,
+ 0.723607,-0.52573,-0.447214,0.276393,0,-0.361804,
+ 0.723607,-0.52573,-0.447214,0.447213,0,-0.08541,
+ -0.276393,0.850651,-0.447214,0.138196,0.425326,-0.08541,
+ -0.276393,0.850651,-0.447214,0.08541,0.262865,-0.361804,
+ -0.276393,0.850651,-0.447214,-0.223607,0.16246,-0.361804,
+ -0.276394,0.850651,-0.447213,0.138196,0.425326,-0.08541,
+ -0.276394,0.850651,-0.447213,-0.223607,0.16246,-0.361804,
+ -0.276394,0.850651,-0.447213,-0.361804,0.262865,-0.08541,
+ -0.276393,0.85065,-0.447214,0.138196,0.425326,-0.08541,
+ -0.276393,0.85065,-0.447214,-0.361804,0.262865,-0.08541,
+ -0.276393,0.85065,-0.447214,-0.138196,0.425326,0.08541,
+ -0.894428,0,-0.447213,-0.361804,0.262865,-0.08541,
+ -0.894428,0,-0.447213,-0.223607,0.16246,-0.361804,
+ -0.894428,0,-0.447213,-0.223607,-0.16246,-0.361804,
+ -0.894428,0,-0.447213,-0.361804,0.262865,-0.08541,
+ -0.894428,0,-0.447213,-0.223607,-0.16246,-0.361804,
+ -0.894428,0,-0.447213,-0.361804,-0.262865,-0.08541,
+ -0.894427,0,-0.447214,-0.361804,0.262865,-0.08541,
+ -0.894427,0,-0.447214,-0.361804,-0.262865,-0.08541,
+ -0.894427,0,-0.447214,-0.447213,0,0.08541,
+ -0.276393,-0.850652,-0.447212,-0.361804,-0.262865,-0.08541,
+ -0.276393,-0.850652,-0.447212,-0.223607,-0.16246,-0.361804,
+ -0.276393,-0.850652,-0.447212,0.08541,-0.262865,-0.361804,
+ -0.276393,-0.850651,-0.447213,-0.361804,-0.262865,-0.08541,
+ -0.276393,-0.850651,-0.447213,0.08541,-0.262865,-0.361804,
+ -0.276393,-0.850651,-0.447213,0.138196,-0.425326,-0.08541,
+ -0.276393,-0.85065,-0.447214,-0.361804,-0.262865,-0.08541,
+ -0.276393,-0.85065,-0.447214,0.138196,-0.425326,-0.08541,
+ -0.276393,-0.85065,-0.447214,-0.138196,-0.425326,0.08541,
+ 0,0,-1,0.08541,-0.262865,-0.361804,
+ 0,0,-1,-0.223607,-0.16246,-0.361804,
+ 0,0,-1,-0.223607,0.16246,-0.361804,
+ 0,0,-1,0.08541,-0.262865,-0.361804,
+ 0,0,-1,-0.223607,0.16246,-0.361804,
+ 0,0,-1,0.08541,0.262865,-0.361804,
+ 0,0,-1,0.08541,-0.262865,-0.361804,
+ 0,0,-1,0.08541,0.262865,-0.361804,
+ 0,0,-1,0.276393,0,-0.361804
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,168,data,NULL};
+const struct gllist *tronbit_idle2=&frame;
diff --git a/hacks/glx/tronbit_no.c b/hacks/glx/tronbit_no.c
new file mode 100644
index 0000000..305790d
--- /dev/null
+++ b/hacks/glx/tronbit_no.c
@@ -0,0 +1,1087 @@
+/* no = second stellation of icosahedron */
+
+#include "gllist.h"
+static const float data[]={
+ -0.491121,-0.356821,-0.794656,-0.072949,0.100406,-0.118034,
+ -0.491121,-0.356821,-0.794656,-0.11459,0.117557,-0.1,
+ -0.491121,-0.356821,-0.794656,-0.138196,0.425325,-0.223606,
+ -0.491129,-0.356821,-0.794652,-0.038197,0.117557,-0.147214,
+ -0.491129,-0.356821,-0.794652,-0.072949,0.100406,-0.118034,
+ -0.491129,-0.356821,-0.794652,-0.138196,0.425325,-0.223606,
+ -0.491121,-0.356826,-0.794654,-0.138196,-0.100406,0.012461,
+ -0.491121,-0.356826,-0.794654,-0.123606,-0.145308,0.023607,
+ -0.491121,-0.356826,-0.794654,-0.361803,-0.262865,0.223606,
+ -0.491119,-0.356829,-0.794654,-0.176394,-0.072654,0.023607,
+ -0.491119,-0.356829,-0.794654,-0.138196,-0.100406,0.012461,
+ -0.491119,-0.356829,-0.794654,-0.361803,-0.262865,0.223606,
+ -0.491125,-0.356827,-0.794651,0.072949,-0.100406,-0.118034,
+ -0.491125,-0.356827,-0.794651,0.1,-0.072654,-0.147214,
+ -0.491125,-0.356827,-0.794651,0.361803,-0.262865,-0.223606,
+ -0.491124,-0.356824,-0.794654,0.076393,-0.145308,-0.1,
+ -0.491124,-0.356824,-0.794654,0.072949,-0.100406,-0.118034,
+ -0.491124,-0.356824,-0.794654,0.361803,-0.262865,-0.223606,
+ -0.491124,-0.356822,-0.794654,-0.150658,0.062054,-0.052786,
+ -0.491124,-0.356822,-0.794654,-0.18541,0.044903,-0.023607,
+ -0.491124,-0.356822,-0.794654,-0.223606,0.162459,-0.052786,
+ -0.491128,-0.356819,-0.794653,-0.052786,-0.162459,-0.012461,
+ -0.491128,-0.356819,-0.794653,-0.01459,-0.190211,-0.023607,
+ -0.491128,-0.356819,-0.794653,-0.08541,-0.262865,0.052786,
+ -0.491122,-0.356835,-0.79465,0.065247,0,-0.158359,
+ -0.491122,-0.356835,-0.79465,0.061803,0.044903,-0.176394,
+ -0.491122,-0.356835,-0.79465,0.17082,0,-0.223606,
+ -0.491135,-0.356817,-0.79465,0.061803,0.044903,-0.176394,
+ -0.491135,-0.356817,-0.79465,0.020163,0.062054,-0.158359,
+ -0.491135,-0.356817,-0.79465,0.052786,0.162459,-0.223606,
+ -0.491124,-0.356824,-0.794654,-0.18541,0.044903,-0.023607,
+ -0.491124,-0.356824,-0.794654,-0.17082,0,-0.012461,
+ -0.491124,-0.356824,-0.794654,-0.276393,0,0.052786,
+ -0.49112,-0.35682,-0.794658,-0.01459,-0.190211,-0.023607,
+ -0.49112,-0.35682,-0.794658,0.012461,-0.162459,-0.052786,
+ -0.49112,-0.35682,-0.794658,0.08541,-0.262865,-0.052786,
+ -0.491124,-0.35682,-0.794655,-0.11459,0.117557,-0.1,
+ -0.491124,-0.35682,-0.794655,-0.111804,0.08123,-0.08541,
+ -0.491124,-0.35682,-0.794655,-0.223606,0.162459,-0.052786,
+ -0.491133,-0.356822,-0.794648,-0.123606,-0.145308,0.023607,
+ -0.491133,-0.356822,-0.794648,-0.095491,-0.131433,0,
+ -0.491133,-0.356822,-0.794648,-0.08541,-0.262865,0.052786,
+ -0.491129,-0.356813,-0.794655,0.1,-0.072654,-0.147214,
+ -0.491129,-0.356813,-0.794655,0.069098,-0.050203,-0.138196,
+ -0.491129,-0.356813,-0.794655,0.17082,0,-0.223606,
+ -0.491117,-0.35683,-0.794655,-0.026393,0.08123,-0.138196,
+ -0.491117,-0.35683,-0.794655,-0.038197,0.117557,-0.147214,
+ -0.491117,-0.35683,-0.794655,0.052786,0.162459,-0.223606,
+ -0.491122,-0.356812,-0.79466,-0.154508,-0.050203,0,
+ -0.491122,-0.356812,-0.79466,-0.176394,-0.072654,0.023607,
+ -0.491122,-0.356812,-0.79466,-0.276393,0,0.052786,
+ -0.491117,-0.356823,-0.794658,0.042705,-0.131433,-0.08541,
+ -0.491117,-0.356823,-0.794658,0.076393,-0.145308,-0.1,
+ -0.491117,-0.356823,-0.794658,0.08541,-0.262865,-0.052786,
+ -0.607065,0.000003,0.794652,0,0.124108,0.118034,
+ -0.607065,0.000003,0.794652,0.038197,0.117557,0.147214,
+ -0.607065,0.000003,0.794652,0.138196,0.425325,0.223606,
+ -0.607062,0,0.794655,-0.023607,0.162459,0.1,
+ -0.607062,0,0.794655,0,0.124108,0.118034,
+ -0.607062,0,0.794655,0.138196,0.425325,0.223606,
+ -0.607062,0,0.794655,0,-0.124108,0.118034,
+ -0.607062,0,0.794655,-0.023607,-0.162459,0.1,
+ -0.607062,0,0.794655,0.138196,-0.425325,0.223606,
+ -0.607065,-0.000003,0.794652,0.038197,-0.117557,0.147214,
+ -0.607065,-0.000003,0.794652,0,-0.124108,0.118034,
+ -0.607065,-0.000003,0.794652,0.138196,-0.425325,0.223606,
+ -0.607062,-0.000002,0.794654,-0.17082,0,-0.012461,
+ -0.607062,-0.000002,0.794654,-0.18541,0.044903,-0.023607,
+ -0.607062,-0.000002,0.794654,-0.447213,0,-0.223606,
+ -0.607062,0.000002,0.794654,-0.18541,-0.044903,-0.023607,
+ -0.607062,0.000002,0.794654,-0.17082,0,-0.012461,
+ -0.607062,0.000002,0.794654,-0.447213,0,-0.223606,
+ -0.607069,0.000012,0.794649,0.052786,0.038352,0.158359,
+ -0.607069,0.000012,0.794649,0.076393,0,0.176394,
+ -0.607069,0.000012,0.794649,0.138196,0.100406,0.223606,
+ -0.607066,0,0.794652,-0.08541,-0.138758,0.052786,
+ -0.607066,0,0.794652,-0.123606,-0.145308,0.023607,
+ -0.607066,0,0.794652,-0.08541,-0.262865,0.052786,
+ -0.607061,0.000001,0.794655,-0.138196,0.100406,0.012461,
+ -0.607061,0.000001,0.794655,-0.123606,0.145308,0.023607,
+ -0.607061,0.000001,0.794655,-0.223606,0.162459,-0.052786,
+ -0.607066,0,0.794652,-0.123606,0.145308,0.023607,
+ -0.607066,0,0.794652,-0.08541,0.138758,0.052786,
+ -0.607066,0,0.794652,-0.08541,0.262865,0.052786,
+ -0.607069,-0.000012,0.794649,0.076393,0,0.176394,
+ -0.607069,-0.000012,0.794649,0.052786,-0.038352,0.158359,
+ -0.607069,-0.000012,0.794649,0.138196,-0.100406,0.223606,
+ -0.607061,-0.000001,0.794655,-0.123606,-0.145308,0.023607,
+ -0.607061,-0.000001,0.794655,-0.138196,-0.100406,0.012461,
+ -0.607061,-0.000001,0.794655,-0.223606,-0.162459,-0.052786,
+ -0.607061,-0.00001,0.794655,0.038197,0.117557,0.147214,
+ -0.607061,-0.00001,0.794655,0.026393,0.08123,0.138196,
+ -0.607061,-0.00001,0.794655,0.138196,0.100406,0.223606,
+ -0.607061,0,0.794655,-0.023607,-0.162459,0.1,
+ -0.607061,0,0.794655,-0.042705,-0.131433,0.08541,
+ -0.607061,0,0.794655,-0.08541,-0.262865,0.052786,
+ -0.60706,0.000002,0.794656,-0.18541,0.044903,-0.023607,
+ -0.60706,0.000002,0.794656,-0.154508,0.050203,0,
+ -0.60706,0.000002,0.794656,-0.223606,0.162459,-0.052786,
+ -0.607061,0,0.794655,-0.042705,0.131433,0.08541,
+ -0.607061,0,0.794655,-0.023607,0.162459,0.1,
+ -0.607061,0,0.794655,-0.08541,0.262865,0.052786,
+ -0.607061,0.00001,0.794655,0.026393,-0.08123,0.138196,
+ -0.607061,0.00001,0.794655,0.038197,-0.117557,0.147214,
+ -0.607061,0.00001,0.794655,0.138196,-0.100406,0.223606,
+ -0.60706,-0.000002,0.794656,-0.154508,-0.050203,0,
+ -0.60706,-0.000002,0.794656,-0.18541,-0.044903,-0.023607,
+ -0.60706,-0.000002,0.794656,-0.223606,-0.162459,-0.052786,
+ 0.303526,0.934174,-0.187592,0.020163,0.062054,-0.158359,
+ 0.303526,0.934174,-0.187592,0.061803,0.044903,-0.176394,
+ 0.303526,0.934174,-0.187592,0,0,-0.5,
+ 0.303535,0.934171,-0.187592,-0.023607,0.072654,-0.176394,
+ 0.303535,0.934171,-0.187592,0.020163,0.062054,-0.158359,
+ 0.303535,0.934171,-0.187592,0,0,-0.5,
+ 0.303532,0.934172,-0.187594,0.150658,0.062054,0.052786,
+ 0.303532,0.934172,-0.187594,0.147214,0.072654,0.1,
+ 0.303532,0.934172,-0.187594,0.447213,0,0.223606,
+ 0.303531,0.934173,-0.187591,0.18541,0.044903,0.023607,
+ 0.303531,0.934173,-0.187591,0.150658,0.062054,0.052786,
+ 0.303531,0.934173,-0.187591,0.447213,0,0.223606,
+ 0.303523,0.934173,-0.187603,-0.08541,0.138758,0.052786,
+ 0.303523,0.934173,-0.187603,-0.123606,0.145308,0.023607,
+ 0.303523,0.934173,-0.187603,-0.361803,0.262865,0.223606,
+ 0.303538,0.934173,-0.187579,-0.076393,0.145308,0.1,
+ 0.303538,0.934173,-0.187579,-0.08541,0.138758,0.052786,
+ 0.303538,0.934173,-0.187579,-0.361803,0.262865,0.223606,
+ 0.303529,0.934173,-0.187594,0.118034,0.038352,-0.118034,
+ 0.303529,0.934173,-0.187594,0.161804,0.027751,-0.1,
+ 0.303529,0.934173,-0.187594,0.17082,0,-0.223606,
+ 0.30353,0.934173,-0.187591,0.072949,0.100406,0.118034,
+ 0.30353,0.934173,-0.187591,0.038197,0.117557,0.147214,
+ 0.30353,0.934173,-0.187591,0.138196,0.100406,0.223606,
+ 0.303526,0.934172,-0.187599,-0.105573,0.124108,-0.052786,
+ 0.303526,0.934172,-0.187599,-0.11459,0.117557,-0.1,
+ 0.303526,0.934172,-0.187599,-0.223606,0.162459,-0.052786,
+ 0.30353,0.934173,-0.187591,-0.11459,0.117557,-0.1,
+ 0.30353,0.934173,-0.187591,-0.072949,0.100406,-0.118034,
+ 0.30353,0.934173,-0.187591,-0.138196,0.100406,-0.223606,
+ 0.303531,0.934173,-0.187588,0.161804,0.027751,-0.1,
+ 0.303531,0.934173,-0.187588,0.158359,0.038352,-0.052786,
+ 0.303531,0.934173,-0.187588,0.276393,0,-0.052786,
+ 0.303534,0.934173,-0.187586,0.038197,0.117557,0.147214,
+ 0.303534,0.934173,-0.187586,0,0.124108,0.118034,
+ 0.303534,0.934173,-0.187586,-0.052786,0.162459,0.223606,
+ 0.303535,0.934172,-0.187588,0.061803,0.044903,-0.176394,
+ 0.303535,0.934172,-0.187588,0.069098,0.050203,-0.138196,
+ 0.303535,0.934172,-0.187588,0.17082,0,-0.223606,
+ 0.303531,0.934173,-0.187592,0.147214,0.072654,0.1,
+ 0.303531,0.934173,-0.187592,0.111804,0.08123,0.08541,
+ 0.303531,0.934173,-0.187592,0.138196,0.100406,0.223606,
+ 0.303524,0.934177,-0.187583,-0.123606,0.145308,0.023607,
+ 0.303524,0.934177,-0.187583,-0.095491,0.131433,0,
+ 0.303524,0.934177,-0.187583,-0.223606,0.162459,-0.052786,
+ 0.303529,0.934174,-0.187588,-0.026393,0.08123,-0.138196,
+ 0.303529,0.934174,-0.187588,-0.023607,0.072654,-0.176394,
+ 0.303529,0.934174,-0.187588,-0.138196,0.100406,-0.223606,
+ 0.30353,0.934172,-0.187595,0.154508,0.050203,0,
+ 0.30353,0.934172,-0.187595,0.18541,0.044903,0.023607,
+ 0.30353,0.934172,-0.187595,0.276393,0,-0.052786,
+ 0.303516,0.934178,-0.18759,-0.042705,0.131433,0.08541,
+ 0.303516,0.934178,-0.18759,-0.076393,0.145308,0.1,
+ 0.303516,0.934178,-0.18759,-0.052786,0.162459,0.223606,
+ 0.794658,-0.577347,0.187587,0.012461,-0.162459,-0.052786,
+ 0.794658,-0.577347,0.187587,-0.01459,-0.190211,-0.023607,
+ 0.794658,-0.577347,0.187587,-0.138196,-0.425325,-0.223606,
+ 0.794655,-0.577349,0.187593,0.023607,-0.162459,-0.1,
+ 0.794655,-0.577349,0.187593,0.012461,-0.162459,-0.052786,
+ 0.794655,-0.577349,0.187593,-0.138196,-0.425325,-0.223606,
+ 0.794653,-0.577353,0.187592,0.052786,-0.038352,0.158359,
+ 0.794653,-0.577353,0.187592,0.076393,0,0.176394,
+ 0.794653,-0.577353,0.187592,0,0,0.5,
+ 0.794657,-0.577347,0.187592,0.023607,-0.072654,0.176394,
+ 0.794657,-0.577347,0.187592,0.052786,-0.038352,0.158359,
+ 0.794657,-0.577347,0.187592,0,0,0.5,
+ 0.794656,-0.577344,0.187604,0.158359,0.038352,-0.052786,
+ 0.794656,-0.577344,0.187604,0.161804,0.027751,-0.1,
+ 0.794656,-0.577344,0.187604,0.361803,0.262865,-0.223606,
+ 0.794652,-0.577358,0.18758,0.176394,0.072654,-0.023607,
+ 0.794652,-0.577358,0.18758,0.158359,0.038352,-0.052786,
+ 0.794652,-0.577358,0.18758,0.361803,0.262865,-0.223606,
+ 0.794654,-0.57735,0.187593,-0.012461,-0.162459,0.052786,
+ 0.794654,-0.57735,0.187593,-0.023607,-0.162459,0.1,
+ 0.794654,-0.57735,0.187593,-0.08541,-0.262865,0.052786,
+ 0.794652,-0.577353,0.187596,0.118034,0.038352,0.118034,
+ 0.794652,-0.577353,0.187596,0.147214,0.072654,0.1,
+ 0.794652,-0.577353,0.187596,0.138196,0.100406,0.223606,
+ 0.794654,-0.577351,0.187592,0.118034,-0.038352,-0.118034,
+ 0.794654,-0.577351,0.187592,0.1,-0.072654,-0.147214,
+ 0.794654,-0.577351,0.187592,0.17082,0,-0.223606,
+ 0.794655,-0.57735,0.18759,0.1,-0.072654,-0.147214,
+ 0.794655,-0.57735,0.18759,0.072949,-0.100406,-0.118034,
+ 0.794655,-0.57735,0.18759,0.052786,-0.162459,-0.223606,
+ 0.79465,-0.577356,0.187592,-0.023607,-0.162459,0.1,
+ 0.79465,-0.577356,0.187592,0,-0.124108,0.118034,
+ 0.79465,-0.577356,0.187592,-0.052786,-0.162459,0.223606,
+ 0.794655,-0.577351,0.187588,0.147214,0.072654,0.1,
+ 0.794655,-0.577351,0.187588,0.150658,0.062054,0.052786,
+ 0.794655,-0.577351,0.187588,0.223606,0.162459,0.052786,
+ 0.794655,-0.577346,0.187602,-0.01459,-0.190211,-0.023607,
+ 0.794655,-0.577346,0.187602,0,-0.162459,0,
+ 0.794655,-0.577346,0.187602,-0.08541,-0.262865,0.052786,
+ 0.794657,-0.577348,0.18759,0.076393,0,0.176394,
+ 0.794657,-0.577348,0.18759,0.08541,0,0.138196,
+ 0.794657,-0.577348,0.18759,0.138196,0.100406,0.223606,
+ 0.794646,-0.577362,0.187591,0.161804,0.027751,-0.1,
+ 0.794646,-0.577362,0.187591,0.138196,0,-0.08541,
+ 0.794646,-0.577362,0.187591,0.17082,0,-0.223606,
+ 0.794649,-0.577358,0.187592,0.042705,-0.131433,-0.08541,
+ 0.794649,-0.577358,0.187592,0.023607,-0.162459,-0.1,
+ 0.794649,-0.577358,0.187592,0.052786,-0.162459,-0.223606,
+ 0.794652,-0.577354,0.18759,0.026393,-0.08123,0.138196,
+ 0.794652,-0.577354,0.18759,0.023607,-0.072654,0.176394,
+ 0.794652,-0.577354,0.18759,-0.052786,-0.162459,0.223606,
+ 0.794648,-0.577354,0.187607,0.154508,0.050203,0,
+ 0.794648,-0.577354,0.187607,0.176394,0.072654,-0.023607,
+ 0.794648,-0.577354,0.187607,0.223606,0.162459,0.052786,
+ -0.187591,0.577356,0.794651,0.118034,0.038352,0.118034,
+ -0.187591,0.577356,0.794651,0.123606,0,0.147214,
+ -0.187591,0.577356,0.794651,0.447213,0,0.223606,
+ -0.187592,0.577351,0.794654,0.147214,0.072654,0.1,
+ -0.187592,0.577351,0.794654,0.118034,0.038352,0.118034,
+ -0.187592,0.577351,0.794654,0.447213,0,0.223606,
+ -0.187591,0.577349,0.794656,-0.118034,-0.038352,0.118034,
+ -0.187591,0.577349,0.794656,-0.161804,-0.027751,0.1,
+ -0.187591,0.577349,0.794656,-0.361803,-0.262865,0.223606,
+ -0.187596,0.577353,0.794652,-0.1,-0.072654,0.147214,
+ -0.187596,0.577353,0.794652,-0.118034,-0.038352,0.118034,
+ -0.187596,0.577353,0.794652,-0.361803,-0.262865,0.223606,
+ -0.1876,0.577347,0.794655,-0.052786,0.162459,-0.012461,
+ -0.1876,0.577347,0.794655,-0.01459,0.190211,-0.023607,
+ -0.1876,0.577347,0.794655,-0.138196,0.425325,-0.223606,
+ -0.187593,0.577349,0.794655,-0.1,0.162459,-0.023607,
+ -0.187593,0.577349,0.794655,-0.052786,0.162459,-0.012461,
+ -0.187593,0.577349,0.794655,-0.138196,0.425325,-0.223606,
+ -0.187583,0.57736,0.79465,0.052786,-0.038352,0.158359,
+ -0.187583,0.57736,0.79465,0.023607,-0.072654,0.176394,
+ -0.187583,0.57736,0.79465,0.138196,-0.100406,0.223606,
+ -0.187592,0.577347,0.794657,-0.158359,0.038352,0.052786,
+ -0.187592,0.577347,0.794657,-0.176394,0.072654,0.023607,
+ -0.187592,0.577347,0.794657,-0.276393,0,0.052786,
+ -0.187593,0.57735,0.794654,0.052786,0.162459,0.012461,
+ -0.187593,0.57735,0.794654,0.1,0.162459,0.023607,
+ -0.187593,0.57735,0.794654,0.08541,0.262865,-0.052786,
+ -0.187592,0.577357,0.79465,0.1,0.162459,0.023607,
+ -0.187592,0.577357,0.79465,0.105573,0.124108,0.052786,
+ -0.187592,0.577357,0.79465,0.223606,0.162459,0.052786,
+ -0.187605,0.577354,0.794649,0.023607,-0.072654,0.176394,
+ -0.187605,0.577354,0.794649,-0.020163,-0.062054,0.158359,
+ -0.187605,0.577354,0.794649,-0.052786,-0.162459,0.223606,
+ -0.187591,0.577354,0.794652,-0.176394,0.072654,0.023607,
+ -0.187591,0.577354,0.794652,-0.138196,0.100406,0.012461,
+ -0.187591,0.577354,0.794652,-0.223606,0.162459,-0.052786,
+ -0.187604,0.577345,0.794656,0.123606,0,0.147214,
+ -0.187604,0.577345,0.794656,0.08541,0,0.138196,
+ -0.187604,0.577345,0.794656,0.138196,-0.100406,0.223606,
+ -0.187593,0.577352,0.794653,-0.161804,-0.027751,0.1,
+ -0.187593,0.577352,0.794653,-0.138196,0,0.08541,
+ -0.187593,0.577352,0.794653,-0.276393,0,0.052786,
+ -0.187583,0.577345,0.79466,-0.01459,0.190211,-0.023607,
+ -0.187583,0.577345,0.79466,0,0.162459,0,
+ -0.187583,0.577345,0.79466,0.08541,0.262865,-0.052786,
+ -0.187592,0.577351,0.794654,0.111804,0.08123,0.08541,
+ -0.187592,0.577351,0.794654,0.147214,0.072654,0.1,
+ -0.187592,0.577351,0.794654,0.223606,0.162459,0.052786,
+ -0.187584,0.577353,0.794655,-0.069098,-0.050203,0.138196,
+ -0.187584,0.577353,0.794655,-0.1,-0.072654,0.147214,
+ -0.187584,0.577353,0.794655,-0.052786,-0.162459,0.223606,
+ -0.187591,0.577359,0.794648,-0.095491,0.131433,0,
+ -0.187591,0.577359,0.794648,-0.1,0.162459,-0.023607,
+ -0.187591,0.577359,0.794648,-0.223606,0.162459,-0.052786,
+ -0.491124,0.356824,-0.794654,0.072949,0.100406,-0.118034,
+ -0.491124,0.356824,-0.794654,0.076393,0.145308,-0.1,
+ -0.491124,0.356824,-0.794654,0.361803,0.262865,-0.223606,
+ -0.491125,0.356827,-0.794651,0.1,0.072654,-0.147214,
+ -0.491125,0.356827,-0.794651,0.072949,0.100406,-0.118034,
+ -0.491125,0.356827,-0.794651,0.361803,0.262865,-0.223606,
+ -0.491119,0.356829,-0.794654,-0.138196,0.100406,0.012461,
+ -0.491119,0.356829,-0.794654,-0.176394,0.072654,0.023607,
+ -0.491119,0.356829,-0.794654,-0.361803,0.262865,0.223606,
+ -0.491121,0.356826,-0.794654,-0.123606,0.145308,0.023607,
+ -0.491121,0.356826,-0.794654,-0.138196,0.100406,0.012461,
+ -0.491121,0.356826,-0.794654,-0.361803,0.262865,0.223606,
+ -0.491129,0.356821,-0.794652,-0.072949,-0.100406,-0.118034,
+ -0.491129,0.356821,-0.794652,-0.038197,-0.117557,-0.147214,
+ -0.491129,0.356821,-0.794652,-0.138196,-0.425325,-0.223606,
+ -0.491121,0.356821,-0.794656,-0.11459,-0.117557,-0.1,
+ -0.491121,0.356821,-0.794656,-0.072949,-0.100406,-0.118034,
+ -0.491121,0.356821,-0.794656,-0.138196,-0.425325,-0.223606,
+ -0.49112,0.35682,-0.794658,0.012461,0.162459,-0.052786,
+ -0.49112,0.35682,-0.794658,-0.01459,0.190211,-0.023607,
+ -0.49112,0.35682,-0.794658,0.08541,0.262865,-0.052786,
+ -0.491124,0.356824,-0.794654,-0.17082,0,-0.012461,
+ -0.491124,0.356824,-0.794654,-0.18541,-0.044903,-0.023607,
+ -0.491124,0.356824,-0.794654,-0.276393,0,0.052786,
+ -0.491135,0.356817,-0.79465,0.020163,-0.062054,-0.158359,
+ -0.491135,0.356817,-0.79465,0.061803,-0.044903,-0.176394,
+ -0.491135,0.356817,-0.79465,0.052786,-0.162459,-0.223606,
+ -0.491122,0.356835,-0.79465,0.061803,-0.044903,-0.176394,
+ -0.491122,0.356835,-0.79465,0.065247,0,-0.158359,
+ -0.491122,0.356835,-0.79465,0.17082,0,-0.223606,
+ -0.491128,0.356819,-0.794653,-0.01459,0.190211,-0.023607,
+ -0.491128,0.356819,-0.794653,-0.052786,0.162459,-0.012461,
+ -0.491128,0.356819,-0.794653,-0.08541,0.262865,0.052786,
+ -0.491124,0.356822,-0.794654,-0.18541,-0.044903,-0.023607,
+ -0.491124,0.356822,-0.794654,-0.150658,-0.062054,-0.052786,
+ -0.491124,0.356822,-0.794654,-0.223606,-0.162459,-0.052786,
+ -0.491117,0.356823,-0.794658,0.076393,0.145308,-0.1,
+ -0.491117,0.356823,-0.794658,0.042705,0.131433,-0.08541,
+ -0.491117,0.356823,-0.794658,0.08541,0.262865,-0.052786,
+ -0.491122,0.356812,-0.79466,-0.176394,0.072654,0.023607,
+ -0.491122,0.356812,-0.79466,-0.154508,0.050203,0,
+ -0.491122,0.356812,-0.79466,-0.276393,0,0.052786,
+ -0.491117,0.35683,-0.794655,-0.038197,-0.117557,-0.147214,
+ -0.491117,0.35683,-0.794655,-0.026393,-0.08123,-0.138196,
+ -0.491117,0.35683,-0.794655,0.052786,-0.162459,-0.223606,
+ -0.491129,0.356813,-0.794655,0.069098,0.050203,-0.138196,
+ -0.491129,0.356813,-0.794655,0.1,0.072654,-0.147214,
+ -0.491129,0.356813,-0.794655,0.17082,0,-0.223606,
+ -0.491133,0.356822,-0.794648,-0.095491,0.131433,0,
+ -0.491133,0.356822,-0.794648,-0.123606,0.145308,0.023607,
+ -0.491133,0.356822,-0.794648,-0.08541,0.262865,0.052786,
+ -0.491124,0.35682,-0.794655,-0.111804,-0.08123,-0.08541,
+ -0.491124,0.35682,-0.794655,-0.11459,-0.117557,-0.1,
+ -0.491124,0.35682,-0.794655,-0.223606,-0.162459,-0.052786,
+ 0.982247,0.000005,-0.187592,0.065247,0,-0.158359,
+ 0.982247,0.000005,-0.187592,0.061803,-0.044903,-0.176394,
+ 0.982247,0.000005,-0.187592,0,0,-0.5,
+ 0.982247,-0.000005,-0.187592,0.061803,0.044903,-0.176394,
+ 0.982247,-0.000005,-0.187592,0.065247,0,-0.158359,
+ 0.982247,-0.000005,-0.187592,0,0,-0.5,
+ 0.982245,-0.000005,-0.187601,0.105573,-0.124108,0.052786,
+ 0.982245,-0.000005,-0.187601,0.11459,-0.117557,0.1,
+ 0.982245,-0.000005,-0.187601,0.138196,-0.425325,0.223606,
+ 0.982248,0.000002,-0.187589,0.1,-0.162459,0.023607,
+ 0.982248,0.000002,-0.187589,0.105573,-0.124108,0.052786,
+ 0.982248,0.000002,-0.187589,0.138196,-0.425325,0.223606,
+ 0.982248,-0.000002,-0.187589,0.105573,0.124108,0.052786,
+ 0.982248,-0.000002,-0.187589,0.1,0.162459,0.023607,
+ 0.982248,-0.000002,-0.187589,0.138196,0.425325,0.223606,
+ 0.982245,0.000005,-0.187601,0.11459,0.117557,0.1,
+ 0.982245,0.000005,-0.187601,0.105573,0.124108,0.052786,
+ 0.982245,0.000005,-0.187601,0.138196,0.425325,0.223606,
+ 0.982247,-0.000001,-0.187593,0.072949,-0.100406,-0.118034,
+ 0.982247,-0.000001,-0.187593,0.076393,-0.145308,-0.1,
+ 0.982247,-0.000001,-0.187593,0.052786,-0.162459,-0.223606,
+ 0.982248,0.000006,-0.187588,0.118034,-0.038352,0.118034,
+ 0.982248,0.000006,-0.187588,0.123606,0,0.147214,
+ 0.982248,0.000006,-0.187588,0.138196,-0.100406,0.223606,
+ 0.982247,0,-0.187593,0.08541,0.138758,-0.052786,
+ 0.982247,0,-0.187593,0.076393,0.145308,-0.1,
+ 0.982247,0,-0.187593,0.08541,0.262865,-0.052786,
+ 0.982247,0.000001,-0.187593,0.076393,0.145308,-0.1,
+ 0.982247,0.000001,-0.187593,0.072949,0.100406,-0.118034,
+ 0.982247,0.000001,-0.187593,0.052786,0.162459,-0.223606,
+ 0.982247,0,-0.187593,0.076393,-0.145308,-0.1,
+ 0.982247,0,-0.187593,0.08541,-0.138758,-0.052786,
+ 0.982247,0,-0.187593,0.08541,-0.262865,-0.052786,
+ 0.982248,-0.000006,-0.187588,0.123606,0,0.147214,
+ 0.982248,-0.000006,-0.187588,0.118034,0.038352,0.118034,
+ 0.982248,-0.000006,-0.187588,0.138196,0.100406,0.223606,
+ 0.982248,-0.000003,-0.187589,0.061803,-0.044903,-0.176394,
+ 0.982248,-0.000003,-0.187589,0.069098,-0.050203,-0.138196,
+ 0.982248,-0.000003,-0.187589,0.052786,-0.162459,-0.223606,
+ 0.982248,-0.000002,-0.187589,0.11459,-0.117557,0.1,
+ 0.982248,-0.000002,-0.187589,0.111804,-0.08123,0.08541,
+ 0.982248,-0.000002,-0.187589,0.138196,-0.100406,0.223606,
+ 0.982247,0.000001,-0.187591,0.1,0.162459,0.023607,
+ 0.982247,0.000001,-0.187591,0.095491,0.131433,0,
+ 0.982247,0.000001,-0.187591,0.08541,0.262865,-0.052786,
+ 0.982248,0.000003,-0.187589,0.069098,0.050203,-0.138196,
+ 0.982248,0.000003,-0.187589,0.061803,0.044903,-0.176394,
+ 0.982248,0.000003,-0.187589,0.052786,0.162459,-0.223606,
+ 0.982247,-0.000001,-0.187591,0.095491,-0.131433,0,
+ 0.982247,-0.000001,-0.187591,0.1,-0.162459,0.023607,
+ 0.982247,-0.000001,-0.187591,0.08541,-0.262865,-0.052786,
+ 0.982248,0.000002,-0.187589,0.111804,0.08123,0.08541,
+ 0.982248,0.000002,-0.187589,0.11459,0.117557,0.1,
+ 0.982248,0.000002,-0.187589,0.138196,0.100406,0.223606,
+ -0.303531,-0.934173,0.187591,-0.150658,-0.062054,-0.052786,
+ -0.303531,-0.934173,0.187591,-0.18541,-0.044903,-0.023607,
+ -0.303531,-0.934173,0.187591,-0.447213,0,-0.223606,
+ -0.303532,-0.934172,0.187594,-0.147214,-0.072654,-0.1,
+ -0.303532,-0.934172,0.187594,-0.150658,-0.062054,-0.052786,
+ -0.303532,-0.934172,0.187594,-0.447213,0,-0.223606,
+ -0.303535,-0.934171,0.187592,-0.020163,-0.062054,0.158359,
+ -0.303535,-0.934171,0.187592,0.023607,-0.072654,0.176394,
+ -0.303535,-0.934171,0.187592,0,0,0.5,
+ -0.303526,-0.934174,0.187592,-0.061803,-0.044903,0.176394,
+ -0.303526,-0.934174,0.187592,-0.020163,-0.062054,0.158359,
+ -0.303526,-0.934174,0.187592,0,0,0.5,
+ -0.303538,-0.934173,0.187579,0.08541,-0.138758,-0.052786,
+ -0.303538,-0.934173,0.187579,0.076393,-0.145308,-0.1,
+ -0.303538,-0.934173,0.187579,0.361803,-0.262865,-0.223606,
+ -0.303523,-0.934173,0.187603,0.123606,-0.145308,-0.023607,
+ -0.303523,-0.934173,0.187603,0.08541,-0.138758,-0.052786,
+ -0.303523,-0.934173,0.187603,0.361803,-0.262865,-0.223606,
+ -0.303531,-0.934173,0.187588,-0.158359,-0.038352,0.052786,
+ -0.303531,-0.934173,0.187588,-0.161804,-0.027751,0.1,
+ -0.303531,-0.934173,0.187588,-0.276393,0,0.052786,
+ -0.30353,-0.934173,0.187591,0.072949,-0.100406,0.118034,
+ -0.30353,-0.934173,0.187591,0.11459,-0.117557,0.1,
+ -0.30353,-0.934173,0.187591,0.138196,-0.100406,0.223606,
+ -0.303534,-0.934173,0.187586,0,-0.124108,-0.118034,
+ -0.303534,-0.934173,0.187586,-0.038197,-0.117557,-0.147214,
+ -0.303534,-0.934173,0.187586,0.052786,-0.162459,-0.223606,
+ -0.30353,-0.934173,0.187591,-0.038197,-0.117557,-0.147214,
+ -0.30353,-0.934173,0.187591,-0.072949,-0.100406,-0.118034,
+ -0.30353,-0.934173,0.187591,-0.138196,-0.100406,-0.223606,
+ -0.303529,-0.934173,0.187594,-0.161804,-0.027751,0.1,
+ -0.303529,-0.934173,0.187594,-0.118034,-0.038352,0.118034,
+ -0.303529,-0.934173,0.187594,-0.17082,0,0.223606,
+ -0.303526,-0.934172,0.187599,0.11459,-0.117557,0.1,
+ -0.303526,-0.934172,0.187599,0.105573,-0.124108,0.052786,
+ -0.303526,-0.934172,0.187599,0.223606,-0.162459,0.052786,
+ -0.30353,-0.934172,0.187595,-0.18541,-0.044903,-0.023607,
+ -0.30353,-0.934172,0.187595,-0.154508,-0.050203,0,
+ -0.30353,-0.934172,0.187595,-0.276393,0,0.052786,
+ -0.303529,-0.934174,0.187588,0.023607,-0.072654,0.176394,
+ -0.303529,-0.934174,0.187588,0.026393,-0.08123,0.138196,
+ -0.303529,-0.934174,0.187588,0.138196,-0.100406,0.223606,
+ -0.303516,-0.934178,0.18759,0.076393,-0.145308,-0.1,
+ -0.303516,-0.934178,0.18759,0.042705,-0.131433,-0.08541,
+ -0.303516,-0.934178,0.18759,0.052786,-0.162459,-0.223606,
+ -0.303531,-0.934173,0.187592,-0.111804,-0.08123,-0.08541,
+ -0.303531,-0.934173,0.187592,-0.147214,-0.072654,-0.1,
+ -0.303531,-0.934173,0.187592,-0.138196,-0.100406,-0.223606,
+ -0.303535,-0.934172,0.187588,-0.069098,-0.050203,0.138196,
+ -0.303535,-0.934172,0.187588,-0.061803,-0.044903,0.176394,
+ -0.303535,-0.934172,0.187588,-0.17082,0,0.223606,
+ -0.303524,-0.934177,0.187583,0.095491,-0.131433,0,
+ -0.303524,-0.934177,0.187583,0.123606,-0.145308,-0.023607,
+ -0.303524,-0.934177,0.187583,0.223606,-0.162459,0.052786,
+ 0.187592,-0.577351,-0.794654,-0.118034,-0.038352,-0.118034,
+ 0.187592,-0.577351,-0.794654,-0.147214,-0.072654,-0.1,
+ 0.187592,-0.577351,-0.794654,-0.447213,0,-0.223606,
+ 0.187591,-0.577356,-0.794651,-0.123606,0,-0.147214,
+ 0.187591,-0.577356,-0.794651,-0.118034,-0.038352,-0.118034,
+ 0.187591,-0.577356,-0.794651,-0.447213,0,-0.223606,
+ 0.187593,-0.577349,-0.794655,0.052786,-0.162459,0.012461,
+ 0.187593,-0.577349,-0.794655,0.1,-0.162459,0.023607,
+ 0.187593,-0.577349,-0.794655,0.138196,-0.425325,0.223606,
+ 0.1876,-0.577347,-0.794655,0.01459,-0.190211,0.023607,
+ 0.1876,-0.577347,-0.794655,0.052786,-0.162459,0.012461,
+ 0.1876,-0.577347,-0.794655,0.138196,-0.425325,0.223606,
+ 0.187596,-0.577353,-0.794652,0.118034,0.038352,-0.118034,
+ 0.187596,-0.577353,-0.794652,0.1,0.072654,-0.147214,
+ 0.187596,-0.577353,-0.794652,0.361803,0.262865,-0.223606,
+ 0.187591,-0.577349,-0.794656,0.161804,0.027751,-0.1,
+ 0.187591,-0.577349,-0.794656,0.118034,0.038352,-0.118034,
+ 0.187591,-0.577349,-0.794656,0.361803,0.262865,-0.223606,
+ 0.187592,-0.577357,-0.79465,-0.105573,-0.124108,-0.052786,
+ 0.187592,-0.577357,-0.79465,-0.1,-0.162459,-0.023607,
+ 0.187592,-0.577357,-0.79465,-0.223606,-0.162459,-0.052786,
+ 0.187591,-0.577354,-0.794652,0.138196,-0.100406,-0.012461,
+ 0.187591,-0.577354,-0.794652,0.176394,-0.072654,-0.023607,
+ 0.187591,-0.577354,-0.794652,0.223606,-0.162459,0.052786,
+ 0.187605,-0.577354,-0.794649,0.020163,0.062054,-0.158359,
+ 0.187605,-0.577354,-0.794649,-0.023607,0.072654,-0.176394,
+ 0.187605,-0.577354,-0.794649,0.052786,0.162459,-0.223606,
+ 0.187583,-0.57736,-0.79465,-0.023607,0.072654,-0.176394,
+ 0.187583,-0.57736,-0.79465,-0.052786,0.038352,-0.158359,
+ 0.187583,-0.57736,-0.79465,-0.138196,0.100406,-0.223606,
+ 0.187593,-0.57735,-0.794654,-0.1,-0.162459,-0.023607,
+ 0.187593,-0.57735,-0.794654,-0.052786,-0.162459,-0.012461,
+ 0.187593,-0.57735,-0.794654,-0.08541,-0.262865,0.052786,
+ 0.187592,-0.577347,-0.794657,0.176394,-0.072654,-0.023607,
+ 0.187592,-0.577347,-0.794657,0.158359,-0.038352,-0.052786,
+ 0.187592,-0.577347,-0.794657,0.276393,0,-0.052786,
+ 0.187592,-0.577351,-0.794654,-0.147214,-0.072654,-0.1,
+ 0.187592,-0.577351,-0.794654,-0.111804,-0.08123,-0.08541,
+ 0.187592,-0.577351,-0.794654,-0.223606,-0.162459,-0.052786,
+ 0.187591,-0.577359,-0.794648,0.1,-0.162459,0.023607,
+ 0.187591,-0.577359,-0.794648,0.095491,-0.131433,0,
+ 0.187591,-0.577359,-0.794648,0.223606,-0.162459,0.052786,
+ 0.187584,-0.577353,-0.794655,0.1,0.072654,-0.147214,
+ 0.187584,-0.577353,-0.794655,0.069098,0.050203,-0.138196,
+ 0.187584,-0.577353,-0.794655,0.052786,0.162459,-0.223606,
+ 0.187604,-0.577345,-0.794656,-0.08541,0,-0.138196,
+ 0.187604,-0.577345,-0.794656,-0.123606,0,-0.147214,
+ 0.187604,-0.577345,-0.794656,-0.138196,0.100406,-0.223606,
+ 0.187583,-0.577345,-0.79466,0,-0.162459,0,
+ 0.187583,-0.577345,-0.79466,0.01459,-0.190211,0.023607,
+ 0.187583,-0.577345,-0.79466,-0.08541,-0.262865,0.052786,
+ 0.187593,-0.577352,-0.794653,0.138196,0,-0.08541,
+ 0.187593,-0.577352,-0.794653,0.161804,0.027751,-0.1,
+ 0.187593,-0.577352,-0.794653,0.276393,0,-0.052786,
+ -0.187596,-0.577353,0.794652,-0.118034,0.038352,0.118034,
+ -0.187596,-0.577353,0.794652,-0.1,0.072654,0.147214,
+ -0.187596,-0.577353,0.794652,-0.361803,0.262865,0.223606,
+ -0.187591,-0.577349,0.794656,-0.161804,0.027751,0.1,
+ -0.187591,-0.577349,0.794656,-0.118034,0.038352,0.118034,
+ -0.187591,-0.577349,0.794656,-0.361803,0.262865,0.223606,
+ -0.187592,-0.577351,0.794654,0.118034,-0.038352,0.118034,
+ -0.187592,-0.577351,0.794654,0.147214,-0.072654,0.1,
+ -0.187592,-0.577351,0.794654,0.447213,0,0.223606,
+ -0.187591,-0.577356,0.794651,0.123606,0,0.147214,
+ -0.187591,-0.577356,0.794651,0.118034,-0.038352,0.118034,
+ -0.187591,-0.577356,0.794651,0.447213,0,0.223606,
+ -0.187593,-0.577349,0.794655,-0.052786,-0.162459,-0.012461,
+ -0.187593,-0.577349,0.794655,-0.1,-0.162459,-0.023607,
+ -0.187593,-0.577349,0.794655,-0.138196,-0.425325,-0.223606,
+ -0.1876,-0.577347,0.794655,-0.01459,-0.190211,-0.023607,
+ -0.1876,-0.577347,0.794655,-0.052786,-0.162459,-0.012461,
+ -0.1876,-0.577347,0.794655,-0.138196,-0.425325,-0.223606,
+ -0.187605,-0.577354,0.794649,-0.020163,0.062054,0.158359,
+ -0.187605,-0.577354,0.794649,0.023607,0.072654,0.176394,
+ -0.187605,-0.577354,0.794649,-0.052786,0.162459,0.223606,
+ -0.187592,-0.577357,0.79465,0.105573,-0.124108,0.052786,
+ -0.187592,-0.577357,0.79465,0.1,-0.162459,0.023607,
+ -0.187592,-0.577357,0.79465,0.223606,-0.162459,0.052786,
+ -0.187591,-0.577354,0.794652,-0.138196,-0.100406,0.012461,
+ -0.187591,-0.577354,0.794652,-0.176394,-0.072654,0.023607,
+ -0.187591,-0.577354,0.794652,-0.223606,-0.162459,-0.052786,
+ -0.187592,-0.577347,0.794657,-0.176394,-0.072654,0.023607,
+ -0.187592,-0.577347,0.794657,-0.158359,-0.038352,0.052786,
+ -0.187592,-0.577347,0.794657,-0.276393,0,0.052786,
+ -0.187583,-0.57736,0.79465,0.023607,0.072654,0.176394,
+ -0.187583,-0.57736,0.79465,0.052786,0.038352,0.158359,
+ -0.187583,-0.57736,0.79465,0.138196,0.100406,0.223606,
+ -0.187593,-0.57735,0.794654,0.1,-0.162459,0.023607,
+ -0.187593,-0.57735,0.794654,0.052786,-0.162459,0.012461,
+ -0.187593,-0.57735,0.794654,0.08541,-0.262865,-0.052786,
+ -0.187584,-0.577353,0.794655,-0.1,0.072654,0.147214,
+ -0.187584,-0.577353,0.794655,-0.069098,0.050203,0.138196,
+ -0.187584,-0.577353,0.794655,-0.052786,0.162459,0.223606,
+ -0.187592,-0.577351,0.794654,0.147214,-0.072654,0.1,
+ -0.187592,-0.577351,0.794654,0.111804,-0.08123,0.08541,
+ -0.187592,-0.577351,0.794654,0.223606,-0.162459,0.052786,
+ -0.187591,-0.577359,0.794648,-0.1,-0.162459,-0.023607,
+ -0.187591,-0.577359,0.794648,-0.095491,-0.131433,0,
+ -0.187591,-0.577359,0.794648,-0.223606,-0.162459,-0.052786,
+ -0.187593,-0.577352,0.794653,-0.138196,0,0.08541,
+ -0.187593,-0.577352,0.794653,-0.161804,0.027751,0.1,
+ -0.187593,-0.577352,0.794653,-0.276393,0,0.052786,
+ -0.187604,-0.577345,0.794656,0.08541,0,0.138196,
+ -0.187604,-0.577345,0.794656,0.123606,0,0.147214,
+ -0.187604,-0.577345,0.794656,0.138196,0.100406,0.223606,
+ -0.187583,-0.577345,0.79466,0,-0.162459,0,
+ -0.187583,-0.577345,0.79466,-0.01459,-0.190211,-0.023607,
+ -0.187583,-0.577345,0.79466,0.08541,-0.262865,-0.052786,
+ 0.794652,0.577358,0.18758,0.158359,-0.038352,-0.052786,
+ 0.794652,0.577358,0.18758,0.176394,-0.072654,-0.023607,
+ 0.794652,0.577358,0.18758,0.361803,-0.262865,-0.223606,
+ 0.794656,0.577344,0.187604,0.161804,-0.027751,-0.1,
+ 0.794656,0.577344,0.187604,0.158359,-0.038352,-0.052786,
+ 0.794656,0.577344,0.187604,0.361803,-0.262865,-0.223606,
+ 0.794657,0.577347,0.187592,0.052786,0.038352,0.158359,
+ 0.794657,0.577347,0.187592,0.023607,0.072654,0.176394,
+ 0.794657,0.577347,0.187592,0,0,0.5,
+ 0.794653,0.577353,0.187592,0.076393,0,0.176394,
+ 0.794653,0.577353,0.187592,0.052786,0.038352,0.158359,
+ 0.794653,0.577353,0.187592,0,0,0.5,
+ 0.794655,0.577349,0.187593,0.012461,0.162459,-0.052786,
+ 0.794655,0.577349,0.187593,0.023607,0.162459,-0.1,
+ 0.794655,0.577349,0.187593,-0.138196,0.425325,-0.223606,
+ 0.794658,0.577347,0.187587,-0.01459,0.190211,-0.023607,
+ 0.794658,0.577347,0.187587,0.012461,0.162459,-0.052786,
+ 0.794658,0.577347,0.187587,-0.138196,0.425325,-0.223606,
+ 0.794655,0.577351,0.187588,0.150658,-0.062054,0.052786,
+ 0.794655,0.577351,0.187588,0.147214,-0.072654,0.1,
+ 0.794655,0.577351,0.187588,0.223606,-0.162459,0.052786,
+ 0.79465,0.577356,0.187592,0,0.124108,0.118034,
+ 0.79465,0.577356,0.187592,-0.023607,0.162459,0.1,
+ 0.79465,0.577356,0.187592,-0.052786,0.162459,0.223606,
+ 0.794655,0.57735,0.18759,0.072949,0.100406,-0.118034,
+ 0.794655,0.57735,0.18759,0.1,0.072654,-0.147214,
+ 0.794655,0.57735,0.18759,0.052786,0.162459,-0.223606,
+ 0.794654,0.577351,0.187592,0.1,0.072654,-0.147214,
+ 0.794654,0.577351,0.187592,0.118034,0.038352,-0.118034,
+ 0.794654,0.577351,0.187592,0.17082,0,-0.223606,
+ 0.794652,0.577353,0.187596,0.147214,-0.072654,0.1,
+ 0.794652,0.577353,0.187596,0.118034,-0.038352,0.118034,
+ 0.794652,0.577353,0.187596,0.138196,-0.100406,0.223606,
+ 0.794654,0.57735,0.187593,-0.023607,0.162459,0.1,
+ 0.794654,0.57735,0.187593,-0.012461,0.162459,0.052786,
+ 0.794654,0.57735,0.187593,-0.08541,0.262865,0.052786,
+ 0.794648,0.577354,0.187607,0.176394,-0.072654,-0.023607,
+ 0.794648,0.577354,0.187607,0.154508,-0.050203,0,
+ 0.794648,0.577354,0.187607,0.223606,-0.162459,0.052786,
+ 0.794652,0.577354,0.18759,0.023607,0.072654,0.176394,
+ 0.794652,0.577354,0.18759,0.026393,0.08123,0.138196,
+ 0.794652,0.577354,0.18759,-0.052786,0.162459,0.223606,
+ 0.794649,0.577358,0.187592,0.023607,0.162459,-0.1,
+ 0.794649,0.577358,0.187592,0.042705,0.131433,-0.08541,
+ 0.794649,0.577358,0.187592,0.052786,0.162459,-0.223606,
+ 0.794646,0.577362,0.187591,0.138196,0,-0.08541,
+ 0.794646,0.577362,0.187591,0.161804,-0.027751,-0.1,
+ 0.794646,0.577362,0.187591,0.17082,0,-0.223606,
+ 0.794657,0.577348,0.18759,0.08541,0,0.138196,
+ 0.794657,0.577348,0.18759,0.076393,0,0.176394,
+ 0.794657,0.577348,0.18759,0.138196,-0.100406,0.223606,
+ 0.794655,0.577346,0.187602,0,0.162459,0,
+ 0.794655,0.577346,0.187602,-0.01459,0.190211,-0.023607,
+ 0.794655,0.577346,0.187602,-0.08541,0.262865,0.052786,
+ -0.794657,0.577347,-0.187592,-0.052786,0.038352,-0.158359,
+ -0.794657,0.577347,-0.187592,-0.023607,0.072654,-0.176394,
+ -0.794657,0.577347,-0.187592,0,0,-0.5,
+ -0.794653,0.577353,-0.187592,-0.076393,0,-0.176394,
+ -0.794653,0.577353,-0.187592,-0.052786,0.038352,-0.158359,
+ -0.794653,0.577353,-0.187592,0,0,-0.5,
+ -0.794655,0.577349,-0.187593,-0.012461,0.162459,0.052786,
+ -0.794655,0.577349,-0.187593,-0.023607,0.162459,0.1,
+ -0.794655,0.577349,-0.187593,0.138196,0.425325,0.223606,
+ -0.794658,0.577347,-0.187587,0.01459,0.190211,0.023607,
+ -0.794658,0.577347,-0.187587,-0.012461,0.162459,0.052786,
+ -0.794658,0.577347,-0.187587,0.138196,0.425325,0.223606,
+ -0.794652,0.577358,-0.18758,-0.158359,-0.038352,0.052786,
+ -0.794652,0.577358,-0.18758,-0.176394,-0.072654,0.023607,
+ -0.794652,0.577358,-0.18758,-0.361803,-0.262865,0.223606,
+ -0.794656,0.577344,-0.187604,-0.161804,-0.027751,0.1,
+ -0.794656,0.577344,-0.187604,-0.158359,-0.038352,0.052786,
+ -0.794656,0.577344,-0.187604,-0.361803,-0.262865,0.223606,
+ -0.79465,0.577356,-0.187592,0,0.124108,-0.118034,
+ -0.79465,0.577356,-0.187592,0.023607,0.162459,-0.1,
+ -0.79465,0.577356,-0.187592,0.052786,0.162459,-0.223606,
+ -0.794655,0.57735,-0.18759,-0.072949,0.100406,0.118034,
+ -0.794655,0.57735,-0.18759,-0.1,0.072654,0.147214,
+ -0.794655,0.57735,-0.18759,-0.052786,0.162459,0.223606,
+ -0.794655,0.577351,-0.187588,-0.150658,-0.062054,-0.052786,
+ -0.794655,0.577351,-0.187588,-0.147214,-0.072654,-0.1,
+ -0.794655,0.577351,-0.187588,-0.223606,-0.162459,-0.052786,
+ -0.794652,0.577353,-0.187596,-0.147214,-0.072654,-0.1,
+ -0.794652,0.577353,-0.187596,-0.118034,-0.038352,-0.118034,
+ -0.794652,0.577353,-0.187596,-0.138196,-0.100406,-0.223606,
+ -0.794654,0.57735,-0.187593,0.023607,0.162459,-0.1,
+ -0.794654,0.57735,-0.187593,0.012461,0.162459,-0.052786,
+ -0.794654,0.57735,-0.187593,0.08541,0.262865,-0.052786,
+ -0.794654,0.577351,-0.187592,-0.1,0.072654,0.147214,
+ -0.794654,0.577351,-0.187592,-0.118034,0.038352,0.118034,
+ -0.794654,0.577351,-0.187592,-0.17082,0,0.223606,
+ -0.794652,0.577354,-0.18759,-0.023607,0.072654,-0.176394,
+ -0.794652,0.577354,-0.18759,-0.026393,0.08123,-0.138196,
+ -0.794652,0.577354,-0.18759,0.052786,0.162459,-0.223606,
+ -0.794649,0.577358,-0.187592,-0.023607,0.162459,0.1,
+ -0.794649,0.577358,-0.187592,-0.042705,0.131433,0.08541,
+ -0.794649,0.577358,-0.187592,-0.052786,0.162459,0.223606,
+ -0.794648,0.577354,-0.187607,-0.176394,-0.072654,0.023607,
+ -0.794648,0.577354,-0.187607,-0.154508,-0.050203,0,
+ -0.794648,0.577354,-0.187607,-0.223606,-0.162459,-0.052786,
+ -0.794657,0.577348,-0.18759,-0.08541,0,-0.138196,
+ -0.794657,0.577348,-0.18759,-0.076393,0,-0.176394,
+ -0.794657,0.577348,-0.18759,-0.138196,-0.100406,-0.223606,
+ -0.794655,0.577346,-0.187602,0,0.162459,0,
+ -0.794655,0.577346,-0.187602,0.01459,0.190211,0.023607,
+ -0.794655,0.577346,-0.187602,0.08541,0.262865,-0.052786,
+ -0.794646,0.577362,-0.187591,-0.138196,0,0.08541,
+ -0.794646,0.577362,-0.187591,-0.161804,-0.027751,0.1,
+ -0.794646,0.577362,-0.187591,-0.17082,0,0.223606,
+ 0.491129,0.356821,0.794652,0.072949,-0.100406,0.118034,
+ 0.491129,0.356821,0.794652,0.038197,-0.117557,0.147214,
+ 0.491129,0.356821,0.794652,0.138196,-0.425325,0.223606,
+ 0.491121,0.356821,0.794656,0.11459,-0.117557,0.1,
+ 0.491121,0.356821,0.794656,0.072949,-0.100406,0.118034,
+ 0.491121,0.356821,0.794656,0.138196,-0.425325,0.223606,
+ 0.491124,0.356824,0.794654,-0.072949,0.100406,0.118034,
+ 0.491124,0.356824,0.794654,-0.076393,0.145308,0.1,
+ 0.491124,0.356824,0.794654,-0.361803,0.262865,0.223606,
+ 0.491125,0.356827,0.794651,-0.1,0.072654,0.147214,
+ 0.491125,0.356827,0.794651,-0.072949,0.100406,0.118034,
+ 0.491125,0.356827,0.794651,-0.361803,0.262865,0.223606,
+ 0.491119,0.356829,0.794654,0.138196,0.100406,-0.012461,
+ 0.491119,0.356829,0.794654,0.176394,0.072654,-0.023607,
+ 0.491119,0.356829,0.794654,0.361803,0.262865,-0.223606,
+ 0.491121,0.356826,0.794654,0.123606,0.145308,-0.023607,
+ 0.491121,0.356826,0.794654,0.138196,0.100406,-0.012461,
+ 0.491121,0.356826,0.794654,0.361803,0.262865,-0.223606,
+ 0.491135,0.356817,0.79465,-0.020163,-0.062054,0.158359,
+ 0.491135,0.356817,0.79465,-0.061803,-0.044903,0.176394,
+ 0.491135,0.356817,0.79465,-0.052786,-0.162459,0.223606,
+ 0.49112,0.35682,0.794658,-0.012461,0.162459,0.052786,
+ 0.49112,0.35682,0.794658,0.01459,0.190211,0.023607,
+ 0.49112,0.35682,0.794658,-0.08541,0.262865,0.052786,
+ 0.491124,0.356824,0.794654,0.17082,0,0.012461,
+ 0.491124,0.356824,0.794654,0.18541,-0.044903,0.023607,
+ 0.491124,0.356824,0.794654,0.276393,0,-0.052786,
+ 0.491124,0.356822,0.794654,0.18541,-0.044903,0.023607,
+ 0.491124,0.356822,0.794654,0.150658,-0.062054,0.052786,
+ 0.491124,0.356822,0.794654,0.223606,-0.162459,0.052786,
+ 0.491122,0.356835,0.79465,-0.061803,-0.044903,0.176394,
+ 0.491122,0.356835,0.79465,-0.065247,0,0.158359,
+ 0.491122,0.356835,0.79465,-0.17082,0,0.223606,
+ 0.491128,0.356819,0.794653,0.01459,0.190211,0.023607,
+ 0.491128,0.356819,0.794653,0.052786,0.162459,0.012461,
+ 0.491128,0.356819,0.794653,0.08541,0.262865,-0.052786,
+ 0.491117,0.35683,0.794655,0.038197,-0.117557,0.147214,
+ 0.491117,0.35683,0.794655,0.026393,-0.08123,0.138196,
+ 0.491117,0.35683,0.794655,-0.052786,-0.162459,0.223606,
+ 0.491117,0.356823,0.794658,-0.076393,0.145308,0.1,
+ 0.491117,0.356823,0.794658,-0.042705,0.131433,0.08541,
+ 0.491117,0.356823,0.794658,-0.08541,0.262865,0.052786,
+ 0.491122,0.356812,0.79466,0.176394,0.072654,-0.023607,
+ 0.491122,0.356812,0.79466,0.154508,0.050203,0,
+ 0.491122,0.356812,0.79466,0.276393,0,-0.052786,
+ 0.491124,0.35682,0.794655,0.111804,-0.08123,0.08541,
+ 0.491124,0.35682,0.794655,0.11459,-0.117557,0.1,
+ 0.491124,0.35682,0.794655,0.223606,-0.162459,0.052786,
+ 0.491129,0.356813,0.794655,-0.069098,0.050203,0.138196,
+ 0.491129,0.356813,0.794655,-0.1,0.072654,0.147214,
+ 0.491129,0.356813,0.794655,-0.17082,0,0.223606,
+ 0.491133,0.356822,0.794648,0.095491,0.131433,0,
+ 0.491133,0.356822,0.794648,0.123606,0.145308,-0.023607,
+ 0.491133,0.356822,0.794648,0.08541,0.262865,-0.052786,
+ 0.187591,0.577349,-0.794656,0.118034,-0.038352,-0.118034,
+ 0.187591,0.577349,-0.794656,0.161804,-0.027751,-0.1,
+ 0.187591,0.577349,-0.794656,0.361803,-0.262865,-0.223606,
+ 0.187596,0.577353,-0.794652,0.1,-0.072654,-0.147214,
+ 0.187596,0.577353,-0.794652,0.118034,-0.038352,-0.118034,
+ 0.187596,0.577353,-0.794652,0.361803,-0.262865,-0.223606,
+ 0.1876,0.577347,-0.794655,0.052786,0.162459,0.012461,
+ 0.1876,0.577347,-0.794655,0.01459,0.190211,0.023607,
+ 0.1876,0.577347,-0.794655,0.138196,0.425325,0.223606,
+ 0.187593,0.577349,-0.794655,0.1,0.162459,0.023607,
+ 0.187593,0.577349,-0.794655,0.052786,0.162459,0.012461,
+ 0.187593,0.577349,-0.794655,0.138196,0.425325,0.223606,
+ 0.187591,0.577356,-0.794651,-0.118034,0.038352,-0.118034,
+ 0.187591,0.577356,-0.794651,-0.123606,0,-0.147214,
+ 0.187591,0.577356,-0.794651,-0.447213,0,-0.223606,
+ 0.187592,0.577351,-0.794654,-0.147214,0.072654,-0.1,
+ 0.187592,0.577351,-0.794654,-0.118034,0.038352,-0.118034,
+ 0.187592,0.577351,-0.794654,-0.447213,0,-0.223606,
+ 0.187592,0.577347,-0.794657,0.158359,0.038352,-0.052786,
+ 0.187592,0.577347,-0.794657,0.176394,0.072654,-0.023607,
+ 0.187592,0.577347,-0.794657,0.276393,0,-0.052786,
+ 0.187593,0.57735,-0.794654,-0.052786,0.162459,-0.012461,
+ 0.187593,0.57735,-0.794654,-0.1,0.162459,-0.023607,
+ 0.187593,0.57735,-0.794654,-0.08541,0.262865,0.052786,
+ 0.187583,0.57736,-0.79465,-0.052786,-0.038352,-0.158359,
+ 0.187583,0.57736,-0.79465,-0.023607,-0.072654,-0.176394,
+ 0.187583,0.57736,-0.79465,-0.138196,-0.100406,-0.223606,
+ 0.187605,0.577354,-0.794649,-0.023607,-0.072654,-0.176394,
+ 0.187605,0.577354,-0.794649,0.020163,-0.062054,-0.158359,
+ 0.187605,0.577354,-0.794649,0.052786,-0.162459,-0.223606,
+ 0.187591,0.577354,-0.794652,0.176394,0.072654,-0.023607,
+ 0.187591,0.577354,-0.794652,0.138196,0.100406,-0.012461,
+ 0.187591,0.577354,-0.794652,0.223606,0.162459,0.052786,
+ 0.187592,0.577357,-0.79465,-0.1,0.162459,-0.023607,
+ 0.187592,0.577357,-0.79465,-0.105573,0.124108,-0.052786,
+ 0.187592,0.577357,-0.79465,-0.223606,0.162459,-0.052786,
+ 0.187593,0.577352,-0.794653,0.161804,-0.027751,-0.1,
+ 0.187593,0.577352,-0.794653,0.138196,0,-0.08541,
+ 0.187593,0.577352,-0.794653,0.276393,0,-0.052786,
+ 0.187583,0.577345,-0.79466,0.01459,0.190211,0.023607,
+ 0.187583,0.577345,-0.79466,0,0.162459,0,
+ 0.187583,0.577345,-0.79466,-0.08541,0.262865,0.052786,
+ 0.187604,0.577345,-0.794656,-0.123606,0,-0.147214,
+ 0.187604,0.577345,-0.794656,-0.08541,0,-0.138196,
+ 0.187604,0.577345,-0.794656,-0.138196,-0.100406,-0.223606,
+ 0.187584,0.577353,-0.794655,0.069098,-0.050203,-0.138196,
+ 0.187584,0.577353,-0.794655,0.1,-0.072654,-0.147214,
+ 0.187584,0.577353,-0.794655,0.052786,-0.162459,-0.223606,
+ 0.187591,0.577359,-0.794648,0.095491,0.131433,0,
+ 0.187591,0.577359,-0.794648,0.1,0.162459,0.023607,
+ 0.187591,0.577359,-0.794648,0.223606,0.162459,0.052786,
+ 0.187592,0.577351,-0.794654,-0.111804,0.08123,-0.08541,
+ 0.187592,0.577351,-0.794654,-0.147214,0.072654,-0.1,
+ 0.187592,0.577351,-0.794654,-0.223606,0.162459,-0.052786,
+ 0.303535,-0.934171,-0.187592,0.020163,-0.062054,-0.158359,
+ 0.303535,-0.934171,-0.187592,-0.023607,-0.072654,-0.176394,
+ 0.303535,-0.934171,-0.187592,0,0,-0.5,
+ 0.303526,-0.934174,-0.187592,0.061803,-0.044903,-0.176394,
+ 0.303526,-0.934174,-0.187592,0.020163,-0.062054,-0.158359,
+ 0.303526,-0.934174,-0.187592,0,0,-0.5,
+ 0.303538,-0.934173,-0.187579,-0.08541,-0.138758,0.052786,
+ 0.303538,-0.934173,-0.187579,-0.076393,-0.145308,0.1,
+ 0.303538,-0.934173,-0.187579,-0.361803,-0.262865,0.223606,
+ 0.303523,-0.934173,-0.187603,-0.123606,-0.145308,0.023607,
+ 0.303523,-0.934173,-0.187603,-0.08541,-0.138758,0.052786,
+ 0.303523,-0.934173,-0.187603,-0.361803,-0.262865,0.223606,
+ 0.303531,-0.934173,-0.187591,0.150658,-0.062054,0.052786,
+ 0.303531,-0.934173,-0.187591,0.18541,-0.044903,0.023607,
+ 0.303531,-0.934173,-0.187591,0.447213,0,0.223606,
+ 0.303532,-0.934172,-0.187594,0.147214,-0.072654,0.1,
+ 0.303532,-0.934172,-0.187594,0.150658,-0.062054,0.052786,
+ 0.303532,-0.934172,-0.187594,0.447213,0,0.223606,
+ 0.30353,-0.934173,-0.187591,-0.072949,-0.100406,-0.118034,
+ 0.30353,-0.934173,-0.187591,-0.11459,-0.117557,-0.1,
+ 0.30353,-0.934173,-0.187591,-0.138196,-0.100406,-0.223606,
+ 0.303534,-0.934173,-0.187586,0,-0.124108,0.118034,
+ 0.303534,-0.934173,-0.187586,0.038197,-0.117557,0.147214,
+ 0.303534,-0.934173,-0.187586,-0.052786,-0.162459,0.223606,
+ 0.303531,-0.934173,-0.187588,0.158359,-0.038352,-0.052786,
+ 0.303531,-0.934173,-0.187588,0.161804,-0.027751,-0.1,
+ 0.303531,-0.934173,-0.187588,0.276393,0,-0.052786,
+ 0.303529,-0.934173,-0.187594,0.161804,-0.027751,-0.1,
+ 0.303529,-0.934173,-0.187594,0.118034,-0.038352,-0.118034,
+ 0.303529,-0.934173,-0.187594,0.17082,0,-0.223606,
+ 0.303526,-0.934172,-0.187599,-0.11459,-0.117557,-0.1,
+ 0.303526,-0.934172,-0.187599,-0.105573,-0.124108,-0.052786,
+ 0.303526,-0.934172,-0.187599,-0.223606,-0.162459,-0.052786,
+ 0.30353,-0.934173,-0.187591,0.038197,-0.117557,0.147214,
+ 0.30353,-0.934173,-0.187591,0.072949,-0.100406,0.118034,
+ 0.30353,-0.934173,-0.187591,0.138196,-0.100406,0.223606,
+ 0.303529,-0.934174,-0.187588,-0.023607,-0.072654,-0.176394,
+ 0.303529,-0.934174,-0.187588,-0.026393,-0.08123,-0.138196,
+ 0.303529,-0.934174,-0.187588,-0.138196,-0.100406,-0.223606,
+ 0.303516,-0.934178,-0.18759,-0.076393,-0.145308,0.1,
+ 0.303516,-0.934178,-0.18759,-0.042705,-0.131433,0.08541,
+ 0.303516,-0.934178,-0.18759,-0.052786,-0.162459,0.223606,
+ 0.30353,-0.934172,-0.187595,0.18541,-0.044903,0.023607,
+ 0.30353,-0.934172,-0.187595,0.154508,-0.050203,0,
+ 0.30353,-0.934172,-0.187595,0.276393,0,-0.052786,
+ 0.303535,-0.934172,-0.187588,0.069098,-0.050203,-0.138196,
+ 0.303535,-0.934172,-0.187588,0.061803,-0.044903,-0.176394,
+ 0.303535,-0.934172,-0.187588,0.17082,0,-0.223606,
+ 0.303524,-0.934177,-0.187583,-0.095491,-0.131433,0,
+ 0.303524,-0.934177,-0.187583,-0.123606,-0.145308,0.023607,
+ 0.303524,-0.934177,-0.187583,-0.223606,-0.162459,-0.052786,
+ 0.303531,-0.934173,-0.187592,0.111804,-0.08123,0.08541,
+ 0.303531,-0.934173,-0.187592,0.147214,-0.072654,0.1,
+ 0.303531,-0.934173,-0.187592,0.138196,-0.100406,0.223606,
+ -0.982248,-0.000002,0.187589,-0.105573,0.124108,-0.052786,
+ -0.982248,-0.000002,0.187589,-0.1,0.162459,-0.023607,
+ -0.982248,-0.000002,0.187589,-0.138196,0.425325,-0.223606,
+ -0.982245,0.000005,0.187601,-0.11459,0.117557,-0.1,
+ -0.982245,0.000005,0.187601,-0.105573,0.124108,-0.052786,
+ -0.982245,0.000005,0.187601,-0.138196,0.425325,-0.223606,
+ -0.982247,0.000005,0.187592,-0.065247,0,0.158359,
+ -0.982247,0.000005,0.187592,-0.061803,-0.044903,0.176394,
+ -0.982247,0.000005,0.187592,0,0,0.5,
+ -0.982247,-0.000005,0.187592,-0.061803,0.044903,0.176394,
+ -0.982247,-0.000005,0.187592,-0.065247,0,0.158359,
+ -0.982247,-0.000005,0.187592,0,0,0.5,
+ -0.982245,-0.000005,0.187601,-0.105573,-0.124108,-0.052786,
+ -0.982245,-0.000005,0.187601,-0.11459,-0.117557,-0.1,
+ -0.982245,-0.000005,0.187601,-0.138196,-0.425325,-0.223606,
+ -0.982248,0.000002,0.187589,-0.1,-0.162459,-0.023607,
+ -0.982248,0.000002,0.187589,-0.105573,-0.124108,-0.052786,
+ -0.982248,0.000002,0.187589,-0.138196,-0.425325,-0.223606,
+ -0.982247,0,0.187593,-0.08541,0.138758,0.052786,
+ -0.982247,0,0.187593,-0.076393,0.145308,0.1,
+ -0.982247,0,0.187593,-0.08541,0.262865,0.052786,
+ -0.982247,-0.000001,0.187593,-0.072949,-0.100406,0.118034,
+ -0.982247,-0.000001,0.187593,-0.076393,-0.145308,0.1,
+ -0.982247,-0.000001,0.187593,-0.052786,-0.162459,0.223606,
+ -0.982248,0.000006,0.187588,-0.118034,-0.038352,-0.118034,
+ -0.982248,0.000006,0.187588,-0.123606,0,-0.147214,
+ -0.982248,0.000006,0.187588,-0.138196,-0.100406,-0.223606,
+ -0.982248,-0.000006,0.187588,-0.123606,0,-0.147214,
+ -0.982248,-0.000006,0.187588,-0.118034,0.038352,-0.118034,
+ -0.982248,-0.000006,0.187588,-0.138196,0.100406,-0.223606,
+ -0.982247,0.000001,0.187593,-0.076393,0.145308,0.1,
+ -0.982247,0.000001,0.187593,-0.072949,0.100406,0.118034,
+ -0.982247,0.000001,0.187593,-0.052786,0.162459,0.223606,
+ -0.982247,0,0.187593,-0.076393,-0.145308,0.1,
+ -0.982247,0,0.187593,-0.08541,-0.138758,0.052786,
+ -0.982247,0,0.187593,-0.08541,-0.262865,0.052786,
+ -0.982247,0.000001,0.187591,-0.1,0.162459,-0.023607,
+ -0.982247,0.000001,0.187591,-0.095491,0.131433,0,
+ -0.982247,0.000001,0.187591,-0.08541,0.262865,0.052786,
+ -0.982248,-0.000003,0.187589,-0.061803,-0.044903,0.176394,
+ -0.982248,-0.000003,0.187589,-0.069098,-0.050203,0.138196,
+ -0.982248,-0.000003,0.187589,-0.052786,-0.162459,0.223606,
+ -0.982248,-0.000002,0.187589,-0.11459,-0.117557,-0.1,
+ -0.982248,-0.000002,0.187589,-0.111804,-0.08123,-0.08541,
+ -0.982248,-0.000002,0.187589,-0.138196,-0.100406,-0.223606,
+ -0.982248,0.000002,0.187589,-0.111804,0.08123,-0.08541,
+ -0.982248,0.000002,0.187589,-0.11459,0.117557,-0.1,
+ -0.982248,0.000002,0.187589,-0.138196,0.100406,-0.223606,
+ -0.982248,0.000003,0.187589,-0.069098,0.050203,0.138196,
+ -0.982248,0.000003,0.187589,-0.061803,0.044903,0.176394,
+ -0.982248,0.000003,0.187589,-0.052786,0.162459,0.223606,
+ -0.982247,-0.000001,0.187591,-0.095491,-0.131433,0,
+ -0.982247,-0.000001,0.187591,-0.1,-0.162459,-0.023607,
+ -0.982247,-0.000001,0.187591,-0.08541,-0.262865,0.052786,
+ 0.607062,0,-0.794655,0,-0.124108,-0.118034,
+ 0.607062,0,-0.794655,0.023607,-0.162459,-0.1,
+ 0.607062,0,-0.794655,-0.138196,-0.425325,-0.223606,
+ 0.607065,-0.000003,-0.794652,-0.038197,-0.117557,-0.147214,
+ 0.607065,-0.000003,-0.794652,0,-0.124108,-0.118034,
+ 0.607065,-0.000003,-0.794652,-0.138196,-0.425325,-0.223606,
+ 0.607062,-0.000002,-0.794654,0.17082,0,0.012461,
+ 0.607062,-0.000002,-0.794654,0.18541,0.044903,0.023607,
+ 0.607062,-0.000002,-0.794654,0.447213,0,0.223606,
+ 0.607062,0.000002,-0.794654,0.18541,-0.044903,0.023607,
+ 0.607062,0.000002,-0.794654,0.17082,0,0.012461,
+ 0.607062,0.000002,-0.794654,0.447213,0,0.223606,
+ 0.607065,0.000003,-0.794652,0,0.124108,-0.118034,
+ 0.607065,0.000003,-0.794652,-0.038197,0.117557,-0.147214,
+ 0.607065,0.000003,-0.794652,-0.138196,0.425325,-0.223606,
+ 0.607062,0,-0.794655,0.023607,0.162459,-0.1,
+ 0.607062,0,-0.794655,0,0.124108,-0.118034,
+ 0.607062,0,-0.794655,-0.138196,0.425325,-0.223606,
+ 0.607066,0,-0.794652,0.08541,-0.138758,-0.052786,
+ 0.607066,0,-0.794652,0.123606,-0.145308,-0.023607,
+ 0.607066,0,-0.794652,0.08541,-0.262865,-0.052786,
+ 0.607061,0.000001,-0.794655,0.138196,0.100406,-0.012461,
+ 0.607061,0.000001,-0.794655,0.123606,0.145308,-0.023607,
+ 0.607061,0.000001,-0.794655,0.223606,0.162459,0.052786,
+ 0.607069,0.000012,-0.794649,-0.052786,0.038352,-0.158359,
+ 0.607069,0.000012,-0.794649,-0.076393,0,-0.176394,
+ 0.607069,0.000012,-0.794649,-0.138196,0.100406,-0.223606,
+ 0.607069,-0.000012,-0.794649,-0.076393,0,-0.176394,
+ 0.607069,-0.000012,-0.794649,-0.052786,-0.038352,-0.158359,
+ 0.607069,-0.000012,-0.794649,-0.138196,-0.100406,-0.223606,
+ 0.607061,-0.000001,-0.794655,0.123606,-0.145308,-0.023607,
+ 0.607061,-0.000001,-0.794655,0.138196,-0.100406,-0.012461,
+ 0.607061,-0.000001,-0.794655,0.223606,-0.162459,0.052786,
+ 0.607066,0,-0.794652,0.123606,0.145308,-0.023607,
+ 0.607066,0,-0.794652,0.08541,0.138758,-0.052786,
+ 0.607066,0,-0.794652,0.08541,0.262865,-0.052786,
+ 0.607061,0,-0.794655,0.023607,-0.162459,-0.1,
+ 0.607061,0,-0.794655,0.042705,-0.131433,-0.08541,
+ 0.607061,0,-0.794655,0.08541,-0.262865,-0.052786,
+ 0.60706,0.000002,-0.794656,0.18541,0.044903,0.023607,
+ 0.60706,0.000002,-0.794656,0.154508,0.050203,0,
+ 0.60706,0.000002,-0.794656,0.223606,0.162459,0.052786,
+ 0.607061,-0.00001,-0.794655,-0.038197,0.117557,-0.147214,
+ 0.607061,-0.00001,-0.794655,-0.026393,0.08123,-0.138196,
+ 0.607061,-0.00001,-0.794655,-0.138196,0.100406,-0.223606,
+ 0.607061,0.00001,-0.794655,-0.026393,-0.08123,-0.138196,
+ 0.607061,0.00001,-0.794655,-0.038197,-0.117557,-0.147214,
+ 0.607061,0.00001,-0.794655,-0.138196,-0.100406,-0.223606,
+ 0.60706,-0.000002,-0.794656,0.154508,-0.050203,0,
+ 0.60706,-0.000002,-0.794656,0.18541,-0.044903,0.023607,
+ 0.60706,-0.000002,-0.794656,0.223606,-0.162459,0.052786,
+ 0.607061,0,-0.794655,0.042705,0.131433,-0.08541,
+ 0.607061,0,-0.794655,0.023607,0.162459,-0.1,
+ 0.607061,0,-0.794655,0.08541,0.262865,-0.052786,
+ 0.491125,-0.356827,0.794651,-0.072949,-0.100406,0.118034,
+ 0.491125,-0.356827,0.794651,-0.1,-0.072654,0.147214,
+ 0.491125,-0.356827,0.794651,-0.361803,-0.262865,0.223606,
+ 0.491124,-0.356824,0.794654,-0.076393,-0.145308,0.1,
+ 0.491124,-0.356824,0.794654,-0.072949,-0.100406,0.118034,
+ 0.491124,-0.356824,0.794654,-0.361803,-0.262865,0.223606,
+ 0.491121,-0.356821,0.794656,0.072949,0.100406,0.118034,
+ 0.491121,-0.356821,0.794656,0.11459,0.117557,0.1,
+ 0.491121,-0.356821,0.794656,0.138196,0.425325,0.223606,
+ 0.491129,-0.356821,0.794652,0.038197,0.117557,0.147214,
+ 0.491129,-0.356821,0.794652,0.072949,0.100406,0.118034,
+ 0.491129,-0.356821,0.794652,0.138196,0.425325,0.223606,
+ 0.491121,-0.356826,0.794654,0.138196,-0.100406,-0.012461,
+ 0.491121,-0.356826,0.794654,0.123606,-0.145308,-0.023607,
+ 0.491121,-0.356826,0.794654,0.361803,-0.262865,-0.223606,
+ 0.491119,-0.356829,0.794654,0.176394,-0.072654,-0.023607,
+ 0.491119,-0.356829,0.794654,0.138196,-0.100406,-0.012461,
+ 0.491119,-0.356829,0.794654,0.361803,-0.262865,-0.223606,
+ 0.491122,-0.356835,0.79465,-0.065247,0,0.158359,
+ 0.491122,-0.356835,0.79465,-0.061803,0.044903,0.176394,
+ 0.491122,-0.356835,0.79465,-0.17082,0,0.223606,
+ 0.491124,-0.356822,0.794654,0.150658,0.062054,0.052786,
+ 0.491124,-0.356822,0.794654,0.18541,0.044903,0.023607,
+ 0.491124,-0.356822,0.794654,0.223606,0.162459,0.052786,
+ 0.491128,-0.356819,0.794653,0.052786,-0.162459,0.012461,
+ 0.491128,-0.356819,0.794653,0.01459,-0.190211,0.023607,
+ 0.491128,-0.356819,0.794653,0.08541,-0.262865,-0.052786,
+ 0.49112,-0.35682,0.794658,0.01459,-0.190211,0.023607,
+ 0.49112,-0.35682,0.794658,-0.012461,-0.162459,0.052786,
+ 0.49112,-0.35682,0.794658,-0.08541,-0.262865,0.052786,
+ 0.491135,-0.356817,0.79465,-0.061803,0.044903,0.176394,
+ 0.491135,-0.356817,0.79465,-0.020163,0.062054,0.158359,
+ 0.491135,-0.356817,0.79465,-0.052786,0.162459,0.223606,
+ 0.491124,-0.356824,0.794654,0.18541,0.044903,0.023607,
+ 0.491124,-0.356824,0.794654,0.17082,0,0.012461,
+ 0.491124,-0.356824,0.794654,0.276393,0,-0.052786,
+ 0.491129,-0.356813,0.794655,-0.1,-0.072654,0.147214,
+ 0.491129,-0.356813,0.794655,-0.069098,-0.050203,0.138196,
+ 0.491129,-0.356813,0.794655,-0.17082,0,0.223606,
+ 0.491124,-0.35682,0.794655,0.11459,0.117557,0.1,
+ 0.491124,-0.35682,0.794655,0.111804,0.08123,0.08541,
+ 0.491124,-0.35682,0.794655,0.223606,0.162459,0.052786,
+ 0.491133,-0.356822,0.794648,0.123606,-0.145308,-0.023607,
+ 0.491133,-0.356822,0.794648,0.095491,-0.131433,0,
+ 0.491133,-0.356822,0.794648,0.08541,-0.262865,-0.052786,
+ 0.491117,-0.356823,0.794658,-0.042705,-0.131433,0.08541,
+ 0.491117,-0.356823,0.794658,-0.076393,-0.145308,0.1,
+ 0.491117,-0.356823,0.794658,-0.08541,-0.262865,0.052786,
+ 0.491117,-0.35683,0.794655,0.026393,0.08123,0.138196,
+ 0.491117,-0.35683,0.794655,0.038197,0.117557,0.147214,
+ 0.491117,-0.35683,0.794655,-0.052786,0.162459,0.223606,
+ 0.491122,-0.356812,0.79466,0.154508,-0.050203,0,
+ 0.491122,-0.356812,0.79466,0.176394,-0.072654,-0.023607,
+ 0.491122,-0.356812,0.79466,0.276393,0,-0.052786,
+ -0.794653,-0.577353,-0.187592,-0.052786,-0.038352,-0.158359,
+ -0.794653,-0.577353,-0.187592,-0.076393,0,-0.176394,
+ -0.794653,-0.577353,-0.187592,0,0,-0.5,
+ -0.794657,-0.577347,-0.187592,-0.023607,-0.072654,-0.176394,
+ -0.794657,-0.577347,-0.187592,-0.052786,-0.038352,-0.158359,
+ -0.794657,-0.577347,-0.187592,0,0,-0.5,
+ -0.794656,-0.577344,-0.187604,-0.158359,0.038352,0.052786,
+ -0.794656,-0.577344,-0.187604,-0.161804,0.027751,0.1,
+ -0.794656,-0.577344,-0.187604,-0.361803,0.262865,0.223606,
+ -0.794652,-0.577358,-0.18758,-0.176394,0.072654,0.023607,
+ -0.794652,-0.577358,-0.18758,-0.158359,0.038352,0.052786,
+ -0.794652,-0.577358,-0.18758,-0.361803,0.262865,0.223606,
+ -0.794658,-0.577347,-0.187587,-0.012461,-0.162459,0.052786,
+ -0.794658,-0.577347,-0.187587,0.01459,-0.190211,0.023607,
+ -0.794658,-0.577347,-0.187587,0.138196,-0.425325,0.223606,
+ -0.794655,-0.577349,-0.187593,-0.023607,-0.162459,0.1,
+ -0.794655,-0.577349,-0.187593,-0.012461,-0.162459,0.052786,
+ -0.794655,-0.577349,-0.187593,0.138196,-0.425325,0.223606,
+ -0.794652,-0.577353,-0.187596,-0.118034,0.038352,-0.118034,
+ -0.794652,-0.577353,-0.187596,-0.147214,0.072654,-0.1,
+ -0.794652,-0.577353,-0.187596,-0.138196,0.100406,-0.223606,
+ -0.794654,-0.577351,-0.187592,-0.118034,-0.038352,0.118034,
+ -0.794654,-0.577351,-0.187592,-0.1,-0.072654,0.147214,
+ -0.794654,-0.577351,-0.187592,-0.17082,0,0.223606,
+ -0.794654,-0.57735,-0.187593,0.012461,-0.162459,-0.052786,
+ -0.794654,-0.57735,-0.187593,0.023607,-0.162459,-0.1,
+ -0.794654,-0.57735,-0.187593,0.08541,-0.262865,-0.052786,
+ -0.79465,-0.577356,-0.187592,0.023607,-0.162459,-0.1,
+ -0.79465,-0.577356,-0.187592,0,-0.124108,-0.118034,
+ -0.79465,-0.577356,-0.187592,0.052786,-0.162459,-0.223606,
+ -0.794655,-0.577351,-0.187588,-0.147214,0.072654,-0.1,
+ -0.794655,-0.577351,-0.187588,-0.150658,0.062054,-0.052786,
+ -0.794655,-0.577351,-0.187588,-0.223606,0.162459,-0.052786,
+ -0.794655,-0.57735,-0.18759,-0.1,-0.072654,0.147214,
+ -0.794655,-0.57735,-0.18759,-0.072949,-0.100406,0.118034,
+ -0.794655,-0.57735,-0.18759,-0.052786,-0.162459,0.223606,
+ -0.794657,-0.577348,-0.18759,-0.076393,0,-0.176394,
+ -0.794657,-0.577348,-0.18759,-0.08541,0,-0.138196,
+ -0.794657,-0.577348,-0.18759,-0.138196,0.100406,-0.223606,
+ -0.794646,-0.577362,-0.187591,-0.161804,0.027751,0.1,
+ -0.794646,-0.577362,-0.187591,-0.138196,0,0.08541,
+ -0.794646,-0.577362,-0.187591,-0.17082,0,0.223606,
+ -0.794655,-0.577346,-0.187602,0.01459,-0.190211,0.023607,
+ -0.794655,-0.577346,-0.187602,0,-0.162459,0,
+ -0.794655,-0.577346,-0.187602,0.08541,-0.262865,-0.052786,
+ -0.794652,-0.577354,-0.18759,-0.026393,-0.08123,-0.138196,
+ -0.794652,-0.577354,-0.18759,-0.023607,-0.072654,-0.176394,
+ -0.794652,-0.577354,-0.18759,0.052786,-0.162459,-0.223606,
+ -0.794648,-0.577354,-0.187607,-0.154508,0.050203,0,
+ -0.794648,-0.577354,-0.187607,-0.176394,0.072654,0.023607,
+ -0.794648,-0.577354,-0.187607,-0.223606,0.162459,-0.052786,
+ -0.794649,-0.577358,-0.187592,-0.042705,-0.131433,0.08541,
+ -0.794649,-0.577358,-0.187592,-0.023607,-0.162459,0.1,
+ -0.794649,-0.577358,-0.187592,-0.052786,-0.162459,0.223606,
+ -0.303523,0.934173,0.187603,0.08541,0.138758,-0.052786,
+ -0.303523,0.934173,0.187603,0.123606,0.145308,-0.023607,
+ -0.303523,0.934173,0.187603,0.361803,0.262865,-0.223606,
+ -0.303538,0.934173,0.187579,0.076393,0.145308,-0.1,
+ -0.303538,0.934173,0.187579,0.08541,0.138758,-0.052786,
+ -0.303538,0.934173,0.187579,0.361803,0.262865,-0.223606,
+ -0.303526,0.934174,0.187592,-0.020163,0.062054,0.158359,
+ -0.303526,0.934174,0.187592,-0.061803,0.044903,0.176394,
+ -0.303526,0.934174,0.187592,0,0,0.5,
+ -0.303535,0.934171,0.187592,0.023607,0.072654,0.176394,
+ -0.303535,0.934171,0.187592,-0.020163,0.062054,0.158359,
+ -0.303535,0.934171,0.187592,0,0,0.5,
+ -0.303532,0.934172,0.187594,-0.150658,0.062054,-0.052786,
+ -0.303532,0.934172,0.187594,-0.147214,0.072654,-0.1,
+ -0.303532,0.934172,0.187594,-0.447213,0,-0.223606,
+ -0.303531,0.934173,0.187591,-0.18541,0.044903,-0.023607,
+ -0.303531,0.934173,0.187591,-0.150658,0.062054,-0.052786,
+ -0.303531,0.934173,0.187591,-0.447213,0,-0.223606,
+ -0.303526,0.934172,0.187599,0.105573,0.124108,0.052786,
+ -0.303526,0.934172,0.187599,0.11459,0.117557,0.1,
+ -0.303526,0.934172,0.187599,0.223606,0.162459,0.052786,
+ -0.303529,0.934173,0.187594,-0.118034,0.038352,0.118034,
+ -0.303529,0.934173,0.187594,-0.161804,0.027751,0.1,
+ -0.303529,0.934173,0.187594,-0.17082,0,0.223606,
+ -0.30353,0.934173,0.187591,-0.072949,0.100406,-0.118034,
+ -0.30353,0.934173,0.187591,-0.038197,0.117557,-0.147214,
+ -0.30353,0.934173,0.187591,-0.138196,0.100406,-0.223606,
+ -0.303534,0.934173,0.187586,-0.038197,0.117557,-0.147214,
+ -0.303534,0.934173,0.187586,0,0.124108,-0.118034,
+ -0.303534,0.934173,0.187586,0.052786,0.162459,-0.223606,
+ -0.30353,0.934173,0.187591,0.11459,0.117557,0.1,
+ -0.30353,0.934173,0.187591,0.072949,0.100406,0.118034,
+ -0.30353,0.934173,0.187591,0.138196,0.100406,0.223606,
+ -0.303531,0.934173,0.187588,-0.161804,0.027751,0.1,
+ -0.303531,0.934173,0.187588,-0.158359,0.038352,0.052786,
+ -0.303531,0.934173,0.187588,-0.276393,0,0.052786,
+ -0.303524,0.934177,0.187583,0.123606,0.145308,-0.023607,
+ -0.303524,0.934177,0.187583,0.095491,0.131433,0,
+ -0.303524,0.934177,0.187583,0.223606,0.162459,0.052786,
+ -0.303535,0.934172,0.187588,-0.061803,0.044903,0.176394,
+ -0.303535,0.934172,0.187588,-0.069098,0.050203,0.138196,
+ -0.303535,0.934172,0.187588,-0.17082,0,0.223606,
+ -0.303531,0.934173,0.187592,-0.147214,0.072654,-0.1,
+ -0.303531,0.934173,0.187592,-0.111804,0.08123,-0.08541,
+ -0.303531,0.934173,0.187592,-0.138196,0.100406,-0.223606,
+ -0.303516,0.934178,0.18759,0.042705,0.131433,-0.08541,
+ -0.303516,0.934178,0.18759,0.076393,0.145308,-0.1,
+ -0.303516,0.934178,0.18759,0.052786,0.162459,-0.223606,
+ -0.303529,0.934174,0.187588,0.026393,0.08123,0.138196,
+ -0.303529,0.934174,0.187588,0.023607,0.072654,0.176394,
+ -0.303529,0.934174,0.187588,0.138196,0.100406,0.223606,
+ -0.30353,0.934172,0.187595,-0.154508,0.050203,0,
+ -0.30353,0.934172,0.187595,-0.18541,0.044903,-0.023607,
+ -0.30353,0.934172,0.187595,-0.276393,0,0.052786
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1080,data,NULL};
+const struct gllist *tronbit_no=&frame;
diff --git a/hacks/glx/tronbit_yes.c b/hacks/glx/tronbit_yes.c
new file mode 100644
index 0000000..376e96c
--- /dev/null
+++ b/hacks/glx/tronbit_yes.c
@@ -0,0 +1,31 @@
+/* yes = tetrahedron */
+
+#include "gllist.h"
+static const float data[]={
+ 0.57735,0.57735,0.57735,0,0,0.5,
+ 0.57735,0.57735,0.57735,0.5,0,0,
+ 0.57735,0.57735,0.57735,0,0.5,0,
+ -0.57735,0.57735,0.57735,0,0,0.5,
+ -0.57735,0.57735,0.57735,0,0.5,0,
+ -0.57735,0.57735,0.57735,-0.5,0,0,
+ -0.57735,-0.57735,0.57735,0,0,0.5,
+ -0.57735,-0.57735,0.57735,-0.5,0,0,
+ -0.57735,-0.57735,0.57735,0,-0.5,0,
+ 0.57735,-0.57735,0.57735,0,0,0.5,
+ 0.57735,-0.57735,0.57735,0,-0.5,0,
+ 0.57735,-0.57735,0.57735,0.5,0,0,
+ 0.57735,-0.57735,-0.57735,0.5,0,0,
+ 0.57735,-0.57735,-0.57735,0,-0.5,0,
+ 0.57735,-0.57735,-0.57735,0,0,-0.5,
+ 0.57735,0.57735,-0.57735,0.5,0,0,
+ 0.57735,0.57735,-0.57735,0,0,-0.5,
+ 0.57735,0.57735,-0.57735,0,0.5,0,
+ -0.57735,0.57735,-0.57735,0,0.5,0,
+ -0.57735,0.57735,-0.57735,0,0,-0.5,
+ -0.57735,0.57735,-0.57735,-0.5,0,0,
+ -0.57735,-0.57735,-0.57735,-0.5,0,0,
+ -0.57735,-0.57735,-0.57735,0,0,-0.5,
+ -0.57735,-0.57735,-0.57735,0,-0.5,0
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,24,data,NULL};
+const struct gllist *tronbit_yes=&frame;
diff --git a/hacks/glx/tube.c b/hacks/glx/tube.c
new file mode 100644
index 0000000..a5c0c96
--- /dev/null
+++ b/hacks/glx/tube.c
@@ -0,0 +1,403 @@
+/* tube, Copyright (c) 2001-2012 Jamie Zawinski <jwz@jwz.org>
+ * Utility functions to create tubes and cones in GL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#ifdef HAVE_COCOA
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "tube.h"
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+
+static int
+unit_tube (int faces, int smooth, int caps_p, int wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat step = M_PI * 2 / faces;
+ GLfloat s2 = step/2;
+ GLfloat th;
+ GLfloat x, y, x0=0, y0=0;
+ int z = 0;
+
+ int arraysize, out;
+ struct { XYZ p; XYZ n; GLfloat s, t; } *array;
+
+ arraysize = (faces+1) * 6;
+ array = (void *) calloc (arraysize, sizeof(*array));
+ if (! array) abort();
+ out = 0;
+
+
+ /* #### texture coords are currently not being computed */
+
+
+ /* side walls
+ */
+ th = 0;
+ x = 1;
+ y = 0;
+
+ if (!smooth)
+ {
+ x0 = cos (s2);
+ y0 = sin (s2);
+ }
+
+ if (smooth) faces++;
+
+ for (i = 0; i < faces; i++)
+ {
+ array[out].p.x = x; /* bottom point A */
+ array[out].p.y = 0;
+ array[out].p.z = y;
+
+ if (smooth)
+ array[out].n = array[out].p; /* its own normal */
+ else
+ {
+ array[out].n.x = x0; /* mid-plane normal */
+ array[out].n.y = 0;
+ array[out].n.z = y0;
+ }
+ out++;
+
+
+ array[out].p.x = x; /* top point A */
+ array[out].p.y = 1;
+ array[out].p.z = y;
+ array[out].n = array[out-1].n; /* same normal */
+ out++;
+
+
+ th += step;
+ x = cos (th);
+ y = sin (th);
+
+ if (!smooth)
+ {
+ x0 = cos (th + s2);
+ y0 = sin (th + s2);
+
+ array[out].p.x = x; /* top point B */
+ array[out].p.y = 1;
+ array[out].p.z = y;
+ array[out].n = array[out-1].n; /* same normal */
+ out++;
+
+
+ array[out] = array[out-3]; /* bottom point A */
+ out++;
+
+ array[out] = array[out-2]; /* top point B */
+ out++;
+
+ array[out].p.x = x; /* bottom point B */
+ array[out].p.y = 0;
+ array[out].p.z = y;
+ array[out].n = array[out-1].n; /* same normal */
+ out++;
+
+ polys++;
+ }
+
+ polys++;
+ if (out >= arraysize) abort();
+ }
+
+ glEnableClientState (GL_VERTEX_ARRAY);
+ glEnableClientState (GL_NORMAL_ARRAY);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ glVertexPointer (3, GL_FLOAT, sizeof(*array), &array[0].p);
+ glNormalPointer ( GL_FLOAT, sizeof(*array), &array[0].n);
+ glTexCoordPointer (2, GL_FLOAT, sizeof(*array), &array[0].s);
+
+ glFrontFace(GL_CCW);
+ glDrawArrays ((wire_p ? GL_LINES :
+ (smooth ? GL_TRIANGLE_STRIP : GL_TRIANGLES)),
+ 0, out);
+
+
+ /* End caps
+ */
+ if (caps_p)
+ for (z = 0; z <= 1; z++)
+ {
+ out = 0;
+ if (! wire_p)
+ {
+ array[out].p.x = 0;
+ array[out].p.y = z;
+ array[out].p.z = 0;
+
+ array[out].n.x = 0;
+ array[out].n.y = (z == 0 ? -1 : 1);
+ array[out].n.z = 0;
+ out++;
+ }
+
+ th = 0;
+ for (i = (z == 0 ? 0 : faces);
+ (z == 0 ? i <= faces : i >= 0);
+ i += (z == 0 ? 1 : -1)) {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+
+ array[out] = array[0]; /* same normal and texture */
+ array[out].p.x = x;
+ array[out].p.y = z;
+ array[out].p.z = y;
+ out++;
+
+ th += (z == 0 ? step : -step);
+
+ polys++;
+ if (out >= arraysize) abort();
+ }
+
+ glVertexPointer (3, GL_FLOAT, sizeof(*array), &array[0].p);
+ glNormalPointer ( GL_FLOAT, sizeof(*array), &array[0].n);
+ glTexCoordPointer (2, GL_FLOAT, sizeof(*array), &array[0].s);
+
+ glFrontFace(GL_CCW);
+ glDrawArrays ((wire_p ? GL_LINE_LOOP : GL_TRIANGLE_FAN), 0, out);
+ }
+
+ free(array);
+
+ return polys;
+}
+
+
+static int
+unit_cone (int faces, int smooth, int cap_p, int wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat step = M_PI * 2 / faces;
+ GLfloat s2 = step/2;
+ GLfloat th;
+ GLfloat x, y, x0, y0;
+
+ int arraysize, out;
+ struct { XYZ p; XYZ n; GLfloat s, t; } *array;
+
+ arraysize = (faces+1) * 3;
+ array = (void *) calloc (arraysize, sizeof(*array));
+ if (! array) abort();
+ out = 0;
+
+
+ /* #### texture coords are currently not being computed */
+
+
+ /* side walls
+ */
+
+ th = 0;
+ x = 1;
+ y = 0;
+ x0 = cos (s2);
+ y0 = sin (s2);
+
+ for (i = 0; i < faces; i++)
+ {
+ array[out].p.x = x; /* bottom point A */
+ array[out].p.y = 0;
+ array[out].p.z = y;
+
+ if (smooth)
+ array[out].n = array[out].p; /* its own normal */
+ else
+ {
+ array[out].n.x = x0; /* mid-plane normal */
+ array[out].n.y = 0;
+ array[out].n.z = y0;
+ }
+ out++;
+
+
+ array[out].p.x = 0; /* tip point */
+ array[out].p.y = 1;
+ array[out].p.z = 0;
+
+ array[out].n.x = x0; /* mid-plane normal */
+ array[out].n.y = 0;
+ array[out].n.z = y0;
+ out++;
+
+
+ th += step;
+ x0 = cos (th + s2);
+ y0 = sin (th + s2);
+ x = cos (th);
+ y = sin (th);
+
+ array[out].p.x = x; /* bottom point B */
+ array[out].p.y = 0;
+ array[out].p.z = y;
+
+ if (smooth)
+ array[out].n = array[out].p; /* its own normal */
+ else
+ array[out].n = array[out-1].n; /* same normal as other two */
+ out++;
+
+
+ if (out >= arraysize) abort();
+ polys++;
+ }
+
+ glEnableClientState (GL_VERTEX_ARRAY);
+ glEnableClientState (GL_NORMAL_ARRAY);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ glVertexPointer (3, GL_FLOAT, sizeof(*array), &array[0].p);
+ glNormalPointer ( GL_FLOAT, sizeof(*array), &array[0].n);
+ glTexCoordPointer (2, GL_FLOAT, sizeof(*array), &array[0].s);
+
+ glFrontFace(GL_CCW);
+ glDrawArrays ((wire_p ? GL_LINES : GL_TRIANGLES), 0, out);
+
+
+ /* End cap
+ */
+ if (cap_p)
+ {
+ out = 0;
+
+ if (! wire_p)
+ {
+ array[out].p.x = 0;
+ array[out].p.y = 0;
+ array[out].p.z = 0;
+
+ array[out].n.x = 0;
+ array[out].n.y = -1;
+ array[out].n.z = 0;
+ out++;
+ }
+
+ for (i = 0, th = 0; i <= faces; i++)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+
+ array[out] = array[0]; /* same normal and texture */
+ array[out].p.x = x;
+ array[out].p.y = 0;
+ array[out].p.z = y;
+ out++;
+ th += step;
+ polys++;
+ if (out >= arraysize) abort();
+ }
+
+ glVertexPointer (3, GL_FLOAT, sizeof(*array), &array[0].p);
+ glNormalPointer ( GL_FLOAT, sizeof(*array), &array[0].n);
+ glTexCoordPointer (2, GL_FLOAT, sizeof(*array), &array[0].s);
+
+ glFrontFace(GL_CCW);
+ glDrawArrays ((wire_p ? GL_LINE_LOOP : GL_TRIANGLE_FAN), 0, out);
+ }
+
+ free (array);
+
+ return polys;
+}
+
+
+static int
+tube_1 (GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat diameter, GLfloat cap_size,
+ int faces, int smooth, int caps_p, int wire_p,
+ int cone_p)
+{
+ GLfloat length, X, Y, Z;
+ int polys = 0;
+
+ if (diameter <= 0) abort();
+
+ X = (x2 - x1);
+ Y = (y2 - y1);
+ Z = (z2 - z1);
+
+ if (X == 0 && Y == 0 && Z == 0)
+ return 0;
+
+ length = sqrt (X*X + Y*Y + Z*Z);
+
+ glPushMatrix();
+
+ glTranslatef(x1, y1, z1);
+ glRotatef (-atan2 (X, Y) * (180 / M_PI), 0, 0, 1);
+ glRotatef ( atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI), 1, 0, 0);
+ glScalef (diameter, length, diameter);
+
+ /* extend the endpoints of the tube by the cap size in both directions */
+ if (cap_size != 0)
+ {
+ GLfloat c = cap_size/length;
+ glTranslatef (0, -c, 0);
+ glScalef (1, 1+c+c, 1);
+ }
+
+ if (cone_p)
+ polys = unit_cone (faces, smooth, caps_p, wire_p);
+ else
+ polys = unit_tube (faces, smooth, caps_p, wire_p);
+
+ glPopMatrix();
+ return polys;
+}
+
+
+int
+tube (GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat diameter, GLfloat cap_size,
+ int faces, int smooth, int caps_p, int wire_p)
+{
+ return tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size,
+ faces, smooth, caps_p, wire_p,
+ 0);
+}
+
+
+int
+cone (GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat diameter, GLfloat cap_size,
+ int faces, int smooth, int cap_p, int wire_p)
+{
+ return tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size,
+ faces, smooth, cap_p, wire_p,
+ 1);
+}
diff --git a/hacks/glx/tube.h b/hacks/glx/tube.h
new file mode 100644
index 0000000..e3fff59
--- /dev/null
+++ b/hacks/glx/tube.h
@@ -0,0 +1,32 @@
+/* tube, Copyright (c) 2001, 2003, 2007 Jamie Zawinski <jwz@jwz.org>
+ * Utility functions to create tubes and cones in GL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __TUBE_H__
+#define __TUBE_H__
+
+/* Renders a tube along the line described by the two points.
+ Returns the number of polygons used.
+ */
+extern int tube (GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat diameter, GLfloat cap_size,
+ int faces, int smooth, int caps_p, int wire_p);
+
+/* Renders a cone along the line described by the two points.
+ Returns the number of polygons used.
+ */
+extern int cone (GLfloat x1, GLfloat y1, GLfloat z1,
+ GLfloat x2, GLfloat y2, GLfloat z2,
+ GLfloat diameter, GLfloat cap_size,
+ int faces, int smooth, int cap_p, int wire_p);
+
+#endif /* __TUBE_H__ */
diff --git a/hacks/glx/tunnel_draw.c b/hacks/glx/tunnel_draw.c
new file mode 100644
index 0000000..8a87c76
--- /dev/null
+++ b/hacks/glx/tunnel_draw.c
@@ -0,0 +1,512 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* atunnels --- OpenGL Advanced Tunnel Demo */
+
+#if 0
+static const char sccsid[] = "@(#)tunnel_draw.c 5.13 2004/05/25 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2002-2004. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Roman Podobedov
+ * Email: romka@ut.ee
+ * WEB: http://romka.demonews.com
+ *
+ * Eric Lassauge (May-25-2004) <lassauge@users.sourceforge.net>
+ * http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ * E.Lassauge - 25-May-2004:
+ * - added more texture
+ * - random texture init
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef USE_GL /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef STANDALONE
+# ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# include <GL/glu.h>
+# endif
+#endif
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+
+#include "tunnel_draw.h"
+
+#ifdef STANDALONE /* For NRAND() */
+#include "xlockmoreI.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+#include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+typedef struct
+{
+ float x, y, z; /* Point coordinates */
+} cvPoint;
+
+typedef struct _tnPath
+{
+ cvPoint p;
+ struct _tnPath *next;
+} tnPath;
+
+
+static const cvPoint initpath[]={
+{0.000000, 0.000000, 0.000000},
+{2.000000, 1.000000, 0.000000},
+{4.000000, 0.000000, 0.000000},
+{6.000000, 1.000000, 0.000000},
+{8.000000, 0.000000, 1.000000},
+{10.000000, 1.000000, 1.000000},
+{12.000000, 1.500000, 0.000000},
+{14.000000, 0.000000, 0.000000},
+{16.000000, 1.000000, 0.000000},
+{18.000000, 0.000000, 0.000000},
+{20.000000, 0.000000, 1.000000},
+{22.000000, 1.000000, 0.000000},
+{24.000000, 0.000000, 1.000000},
+{26.000000, 0.000000, 1.000000},
+{28.000000, 1.000000, 0.000000},
+{30.000000, 0.000000, 2.000000},
+{32.000000, 1.000000, 0.000000},
+{34.000000, 0.000000, 2.000000},
+{-1.000000, -1.000000, -1.000000}
+};
+
+
+struct tunnel_state {
+
+ tnPath *path;
+
+ float cam_t; /* Camera variables */
+ tnPath *cam_pos;
+ float alpha;
+
+ int tFlag; /* Tunnel Drawing Variables */
+ cvPoint prev_points[10];
+ int current_texture;
+
+ float ModeX; /* Modes */
+ int ModeXFlag;
+};
+
+/*=================== Vector normalization ==================================*/
+static void
+normalize(cvPoint *V)
+{
+ float d;
+
+ /* Vector length */
+ d = (float)sqrt(V->x*V->x + V->y*V->y + V->z*V->z);
+
+ /* Normalization */
+ V->x /= d;
+ V->y /= d;
+ V->z /= d;
+}
+/*=================== C = A x B (Vector multiply) ==========================*/
+#if 0
+static void
+vect_mult(cvPoint *A, cvPoint *B, cvPoint *C)
+{
+ /* Vector multiply */
+ C->x = A->y*B->z - A->z*B->y;
+ C->y = A->z*B->x - A->x*B->z;
+ C->z = A->x*B->y - A->y*B->x;
+}
+#endif
+
+/* Catmull-Rom Curve calculations */
+static void
+cvCatmullRom(cvPoint *p, float t, cvPoint *outp)
+{
+ float t2, t3, t1;
+
+ t2 = t*t;
+ t3 = t*t*t;
+ t1 = (1-t)*(1-t);
+
+ outp->x = (-t*t1*p[0].x + (2-5*t2+3*t3)*p[1].x + t*(1+4*t-3*t2)*p[2].x - t2*(1-t)*p[3].x)/2;
+ outp->y = (-t*t1*p[0].y + (2-5*t2+3*t3)*p[1].y + t*(1+4*t-3*t2)*p[2].y - t2*(1-t)*p[3].y)/2;
+ outp->z = (-t*t1*p[0].z + (2-5*t2+3*t3)*p[1].z + t*(1+4*t-3*t2)*p[2].z - t2*(1-t)*p[3].z)/2;
+}
+
+/*=================== Point Rotating Around Line ===========================
+// p - original point
+// pp - pivot point
+// pl - pivot line (vector)
+// a - angle to rotate in radians
+// outp - output point
+//==========================================================================
+*/
+static void
+RotateAroundLine(cvPoint *p, cvPoint *pp, cvPoint *pl, float a, cvPoint *outp)
+{
+ cvPoint p1, p2;
+ float l, m, n, ca, sa;
+
+ p1.x = p->x - pp->x;
+ p1.y = p->y - pp->y;
+ p1.z = p->z - pp->z;
+
+ l = pl->x;
+ m = pl->y;
+ n = pl->z;
+
+ ca = cos(a);
+ sa = sin(a);
+
+ p2.x = p1.x*((l*l)+ca*(1-l*l)) + p1.y*(l*(1-ca)*m+n*sa) + p1.z*(l*(1-ca)*n-m*sa);
+ p2.y = p1.x*(l*(1-ca)*m-n*sa) + p1.y*(m*m+ca*(1-m*m)) + p1.z*(m*(1-ca)*n+l*sa);
+ p2.z = p1.x*(l*(1-ca)*n+m*sa) + p1.y*(m*(1-ca)*n-l*sa) + p1.z*(n*n+ca*(1-n*n));
+
+ outp->x = p2.x + pp->x;
+ outp->y = p2.y + pp->y;
+ outp->z = p2.z + pp->z;
+}
+
+
+/*=================== Load camera and tunnel path ==========================*/
+static void
+LoadPath(struct tunnel_state *st)
+{
+ float x, y, z;
+ tnPath *path1=NULL, *path2=NULL;
+
+ cvPoint *f = (cvPoint *)initpath;
+
+ while (f->x != -1.0)
+ {
+ x = f->x;
+ y = f->y;
+ z = f->z;
+ f++;
+
+ if (st->path == NULL)
+ {
+ st->path = (tnPath *)malloc(sizeof(tnPath));
+ path1 = st->path;
+ }
+ else
+ {
+ if (!path1) path1 = st->path;
+ path2 = (tnPath *)malloc(sizeof(tnPath));
+ path1->next = path2;
+ path1 = path2;
+ }
+
+ path1->next = NULL;
+ path1->p.x = x;
+ path1->p.y = y;
+ path1->p.z = z;
+ }
+
+ st->cam_pos = st->path;
+ st->cam_t = 0;
+}
+
+/*=================== Tunnel Initialization ================================*/
+struct tunnel_state *
+atunnel_InitTunnel(void)
+{
+ struct tunnel_state *st = (struct tunnel_state *) calloc (1, sizeof(*st));
+ LoadPath(st);
+ st->current_texture = NRAND(MAX_TEXTURE);
+ return st;
+}
+
+void
+atunnel_DrawTunnel(struct tunnel_state *st,
+ int do_texture, int do_light, GLuint *textures)
+{
+ tnPath *p, *p1, *cmpos;
+ cvPoint op, p4[4], T, ppp, op1, op2;
+ float t;
+ int i, j, k, flag;
+ cvPoint points[10];
+ GLfloat light_position[4];
+
+
+ /* Select current tunnel texture */
+ if (do_texture)
+ glBindTexture(GL_TEXTURE_2D, textures[st->current_texture]);
+
+ cmpos = st->cam_pos;
+ /* Get current curve */
+ if (st->cam_pos->next &&
+ st->cam_pos->next->next &&
+ st->cam_pos->next->next->next)
+ {
+ p1 = st->cam_pos;
+ for (i=0; i<4; i++)
+ {
+ p4[i].x = p1->p.x;
+ p4[i].y = p1->p.y;
+ p4[i].z = p1->p.z;
+ p1 = p1->next;
+ }
+ }
+ else
+ {
+ /* End of tunnel */
+ st->ModeX = 1.0;
+ st->ModeXFlag = 0;
+ return;
+ };
+
+ /* Get current camera position */
+ cvCatmullRom(p4, st->cam_t, &op);
+
+ /* Next camera position */
+ st->cam_t += 0.02f;
+ if (st->cam_t >= 1)
+ {
+ st->cam_t = st->cam_t - 1;
+ cmpos = st->cam_pos->next;
+ }
+
+ /* Get curve for next camera position */
+ if (cmpos->next->next->next)
+ {
+ p1 = cmpos;
+ for (i=0; i<4; i++)
+ {
+ p4[i].x = p1->p.x;
+ p4[i].y = p1->p.y;
+ p4[i].z = p1->p.z;
+ p1 = p1->next;
+ }
+ }
+ else
+ {
+ /* End of tunnel */
+ st->ModeX = 1.0;
+ st->ModeXFlag = 0;
+ return;
+ }
+
+ /* Get next camera position */
+ cvCatmullRom(p4, st->cam_t, &op1);
+
+ /* Rotate camera */
+ glRotatef(st->alpha, 0, 0, -1);
+ st->alpha += 1;
+ /* Set camera position */
+ gluLookAt(op.x, op.y, op.z, op1.x, op1.y, op1.z, 0, 1, 0);
+
+ /* Set light position */
+ if (do_light)
+ {
+ light_position[0] = op.x;
+ light_position[1] = op.y;
+ light_position[2] = op.z;
+ light_position[3] = 1;
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+ }
+
+ p = st->cam_pos;
+ flag = 0;
+ t = 0;
+ k = 0;
+ /* Draw tunnel from current curve and next 2 curves */
+ glBegin(GL_QUADS);
+ while (k < 3)
+ {
+ if (p->next->next->next)
+ {
+ p1 = p;
+ for (i=0; i<4; i++)
+ {
+ p4[i].x = p1->p.x;
+ p4[i].y = p1->p.y;
+ p4[i].z = p1->p.z;
+ p1 = p1->next;
+ }
+ }
+ else
+ {
+ /* End of tunnel */
+ st->ModeX = 1.0;
+ st->ModeXFlag = 0;
+ glEnd();
+ return;
+ }
+ cvCatmullRom(p4, t, &op);
+
+ ppp.x = op.x;
+ ppp.y = op.y;
+ ppp.z = op.z + 0.25;
+
+ t += 0.1;
+ if (t >= 1.0)
+ {
+ t = t - 1;
+ k++;
+ p = p->next;
+ }
+
+ if (p->next->next->next)
+ {
+ p1 = p;
+ for (i=0; i<4; i++)
+ {
+ p4[i].x = p1->p.x;
+ p4[i].y = p1->p.y;
+ p4[i].z = p1->p.z;
+ p1 = p1->next;
+ }
+ }
+ else
+ {
+ /* End of tunnel */
+ st->ModeX = 1.0;
+ st->ModeXFlag = 0;
+ glEnd();
+ return;
+ }
+
+ cvCatmullRom(p4, t, &op1);
+
+ T.x = op1.x - op.x;
+ T.y = op1.y - op.y;
+ T.z = op1.z - op.z;
+
+ normalize(&T);
+
+ for (i=0; i<10; i++)
+ {
+ RotateAroundLine(&ppp, &op, &T, ((float)i*36.0*M_PI/180.0), &op2);
+ points[i].x = op2.x;
+ points[i].y = op2.y;
+ points[i].z = op2.z;
+ if (!flag)
+ {
+ st->prev_points[i].x = op2.x;
+ st->prev_points[i].y = op2.y;
+ st->prev_points[i].z = op2.z;
+ }
+ }
+
+ if (!flag)
+ {
+ flag = 1;
+ continue;
+ }
+
+ /* Draw 10 polygons for current point */
+ for (i=0; i<10; i++)
+ {
+ j = i+1;
+ if (j > 9) j = 0;
+ glNormal3f(0, 0, 1); /* Normal for lighting */
+ glTexCoord2f(0, 0); glVertex3f(st->prev_points[i].x, st->prev_points[i].y, st->prev_points[i].z);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(1, 0); glVertex3f(points[i].x, points[i].y, points[i].z);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(1, 1); glVertex3f(points[j].x, points[j].y, points[j].z);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(0, 1); glVertex3f(st->prev_points[j].x, st->prev_points[j].y, st->prev_points[j].z);
+ }
+ /* Save current polygon coordinates for next position */
+ for (i=0; i<10; i++)
+ {
+ st->prev_points[i].x = points[i].x;
+ st->prev_points[i].y = points[i].y;
+ st->prev_points[i].z = points[i].z;
+ }
+ }
+ glEnd();
+ st->cam_pos = cmpos;
+}
+
+/* =================== Show splash screen =================================== */
+void
+atunnel_SplashScreen(struct tunnel_state *st,
+ int do_wire, int do_texture, int do_light)
+{
+ if (st->ModeX > 0)
+ {
+ /* Reset tunnel and camera position */
+ if (!st->ModeXFlag)
+ {
+ st->cam_pos = st->path;
+ st->cam_t = 0;
+ st->tFlag = 0;
+ st->ModeXFlag = 1;
+ st->current_texture++;
+ if (st->current_texture >= MAX_TEXTURE) st->current_texture = 0;
+ }
+ /* Now we want to draw splash screen */
+ glLoadIdentity();
+ /* Disable all unused features */
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_FOG);
+ glDisable(GL_CULL_FACE);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
+ glEnable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, st->ModeX);
+
+ /* Draw splash screen (simply quad) */
+ glBegin(GL_QUADS);
+ glVertex3f(-10, -10, -1);
+ glVertex3f(10, -10, -1);
+ glVertex3f(10, 10, -1);
+ glVertex3f(-10, 10, -1);
+ glEnd();
+
+ st->ModeX -= 0.05;
+ if (st->ModeX <= 0) st->ModeX = 0;
+
+ if (!do_wire)
+ {
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_DEPTH_TEST);
+ }
+ if (do_light)
+ {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_FOG);
+ }
+ if (do_texture)
+ {
+ glEnable(GL_TEXTURE_2D);
+ }
+ glDisable(GL_BLEND);
+ glColor4f(1, 1, 1, 1);
+ }
+}
+
+void
+atunnel_FreeTunnel(struct tunnel_state *st)
+{
+ free (st);
+}
+
+#endif
diff --git a/hacks/glx/tunnel_draw.h b/hacks/glx/tunnel_draw.h
new file mode 100644
index 0000000..643b958
--- /dev/null
+++ b/hacks/glx/tunnel_draw.h
@@ -0,0 +1,11 @@
+#define MAX_TEXTURE 10
+
+struct tunnel_state;
+
+extern struct tunnel_state * atunnel_InitTunnel(void);
+extern void atunnel_DrawTunnel(struct tunnel_state *,
+ int do_texture, int do_light, GLuint *textures);
+extern void atunnel_SplashScreen(struct tunnel_state *,
+ int do_wire, int do_texture, int do_light);
+extern void atunnel_FreeTunnel(struct tunnel_state *);
+
diff --git a/hacks/glx/unicrud.c b/hacks/glx/unicrud.c
new file mode 100644
index 0000000..7942252
--- /dev/null
+++ b/hacks/glx/unicrud.c
@@ -0,0 +1,961 @@
+/* unicrud, Copyright (c) 2016-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*titleFont: -*-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*font: -*-helvetica-bold-r-normal-*-*-2400-*-*-*-*-iso10646-1\n" \
+
+# define free_unicrud 0
+# define release_unicrud 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "texfont.h"
+#include "utf8wc.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_BLOCK "ALL"
+#define DEF_TITLES "True"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat color[4];
+ texture_font_data *title_font, *char_font;
+ unsigned long unichar;
+ const char *charplane, *charblock, *charname;
+ enum { IN, LINGER, OUT } state;
+ int spin_direction;
+ GLfloat ratio;
+
+} unicrud_configuration;
+
+static unicrud_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static char *do_block = 0;
+static Bool do_titles;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-block", ".block", XrmoptionSepArg, 0 },
+ { "-titles", ".titles", XrmoptionNoArg, "True" },
+ { "+titles", ".titles", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_block, "block", "Block", DEF_BLOCK, t_String},
+ {&do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt unicrud_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static const struct {
+ unsigned long start;
+ const char * const name;
+} unicode_block_names[] = {
+
+ /* Through Unicode 8.0, early 2016. */
+
+ { 0x0000, "*Basic Multilingual" },
+ { 0x0000, "Unassigned" },
+ { 0x0021, "ASCII" },
+ { 0x0080, "Unassigned" },
+ { 0x00A1, "Latin1" },
+ { 0x0100, "Latin Extended-A" },
+ { 0x0180, "Latin Extended-B" },
+ { 0x0250, "IPA Extensions" },
+ { 0x02B0, "Spacing Modifier Letters" },
+ { 0x0300, "Combining Diacritical Marks" },
+ { 0x0370, "Greek and Coptic" },
+ { 0x0400, "Cyrillic" },
+ { 0x0500, "Cyrillic Supplement" },
+ { 0x0530, "Armenian" },
+ { 0x058B, "Unassigned" },
+ { 0x0590, "Hebrew" },
+ { 0x05F5, "Unassigned" },
+ { 0x0600, "Arabic" },
+ { 0x0700, "Syriac" },
+ { 0x0750, "Arabic Supplement" },
+ { 0x0780, "Thaana" },
+ { 0x07C0, "N'Ko" },
+ { 0x0800, "Samaritan" },
+ { 0x0840, "Mandaic" },
+ { 0x0860, "Unassigned" },
+ { 0x08A0, "Arabic Extended-A" },
+ { 0x0900, "Devanagari" },
+ { 0x0980, "Bengali" },
+ { 0x09FC, "Unassigned" },
+ { 0x0A00, "Gurmukhi" },
+ { 0x0A76, "Unassigned" },
+ { 0x0A80, "Gujarati" },
+ { 0x0AF2, "Unassigned" },
+ { 0x0B00, "Oriya" },
+ { 0x0B80, "Tamil" },
+ { 0x0BFB, "Unassigned" },
+ { 0x0C00, "Telugu" },
+ { 0x0C80, "Kannada" },
+ { 0x0CF0, "Unassigned" },
+ { 0x0D00, "Malayalam" },
+ { 0x0D80, "Sinhala" },
+ { 0x0DF5, "Unassigned" },
+ { 0x0E00, "Thai" },
+ { 0x0E5C, "Unassigned" },
+ { 0x0E80, "Lao" },
+ { 0x0EE0, "Unassigned" },
+ { 0x0F00, "Tibetan" },
+ { 0x0FDB, "Unassigned" },
+ { 0x1000, "Myanmar" },
+ { 0x10A0, "Georgian" },
+ { 0x1100, "Hangul Jamo" },
+ { 0x1200, "Ethiopic" },
+ { 0x1380, "Ethiopic Supplement" },
+ { 0x13A0, "Cherokee" },
+ { 0x1400, "Unified Canadian Aboriginal Syllabics" },
+ { 0x1677, "Unassigned" },
+ { 0x1680, "Ogham" },
+ { 0x16A0, "Runic" },
+ { 0x16F1, "Unassigned" },
+ { 0x1700, "Tagalog" },
+ { 0x1715, "Unassigned" },
+ { 0x1720, "Hanunoo" },
+ { 0x1737, "Unassigned" },
+ { 0x1740, "Buhid" },
+ { 0x1754, "Unassigned" },
+ { 0x1760, "Tagbanwa" },
+ { 0x1774, "Unassigned" },
+ { 0x1780, "Khmer" },
+ { 0x17FA, "Unassigned" },
+ { 0x1800, "Mongolian" },
+ { 0x18AB, "Unassigned" },
+ { 0x18B0, "Unified Canadian Aboriginal Syllabics Extended" },
+ { 0x18F6, "Unassigned" },
+ { 0x1900, "Limbu" },
+ { 0x1950, "Tai Le" },
+ { 0x1975, "Unassigned" },
+ { 0x1980, "Tai Lue" },
+ { 0x19E0, "Khmer Symbols" },
+ { 0x1A00, "Buginese" },
+ { 0x1A20, "Tai Tham" },
+ { 0x1AAE, "Unassigned" },
+ { 0x1AB0, "Combining Diacritical Marks Extended" },
+ { 0x1ABF, "Unassigned" },
+ { 0x1B00, "Balinese" },
+ { 0x1B80, "Sundanese" },
+ { 0x1BC0, "Batak" },
+ { 0x1C00, "Lepcha" },
+ { 0x1C50, "Ol Chiki" },
+ { 0x1C80, "Unassigned" },
+ { 0x1CC0, "Sundanese Supplement" },
+ { 0x1CC8, "Unassigned" },
+ { 0x1CD0, "Vedic Extensions" },
+ { 0x1CFA, "Unassigned" },
+ { 0x1D00, "Phonetic Extensions" },
+ { 0x1D80, "Phonetic Extensions Supplement" },
+ { 0x1DC0, "Combining Diacritical Marks Supplement" },
+ { 0x1E00, "Latin Extended Additional" },
+ { 0x1F00, "Greek Extended" },
+ { 0x2000, "General Punctuation" },
+ { 0x2070, "Superscripts and Subscripts" },
+ { 0x2095, "Unassigned" },
+ { 0x20A0, "Currency Symbols" },
+ { 0x20BE, "Unassigned" },
+ { 0x20D0, "Combining Diacritical Marks for Symbols" },
+ { 0x20F1, "Unassigned" },
+ { 0x2100, "Letterlike Symbols" },
+ { 0x2150, "Number Forms" },
+ { 0x2190, "Arrows" },
+ { 0x2200, "Mathematical Operators" },
+ { 0x2300, "Miscellaneous Technical" },
+ { 0x2400, "Control Pictures" },
+ { 0x2437, "Unassigned" },
+ { 0x2440, "Optical Character Recognition" },
+ { 0x244B, "Unassigned" },
+ { 0x2460, "Enclosed Alphanumerics" },
+ { 0x2500, "Box Drawing" },
+ { 0x2580, "Block Elements" },
+ { 0x25A0, "Geometric Shapes" },
+ { 0x2600, "Miscellaneous Symbols" },
+ { 0x2700, "Dingbats" },
+ { 0x27C0, "Miscellaneous Mathematical Symbols-A" },
+ { 0x27F0, "Supplemental Arrows-A" },
+ { 0x2800, "Braille Patterns" },
+ { 0x2900, "Supplemental Arrows-B" },
+ { 0x2980, "Miscellaneous Mathematical Symbols-B" },
+ { 0x2A00, "Supplemental Mathematical Operators" },
+ { 0x2B00, "Miscellaneous Symbols and Arrows" },
+ { 0x2B56, "Unassigned" }, /* Unicode 5.1 */
+ { 0x2BF0, "Unassigned" },
+ { 0x2C00, "Glagolitic" },
+ { 0x2C60, "Latin Extended-C" },
+ { 0x2C80, "Coptic" },
+ { 0x2D00, "Georgian Supplement" },
+ { 0x2D26, "Unassigned" },
+ { 0x2D30, "Tifinagh" },
+ { 0x2D80, "Ethiopic Extended" },
+ { 0x2DE0, "Cyrillic Extended-A" },
+ { 0x2E00, "Supplemental Punctuation" },
+ { 0x2E43, "Unassigned" },
+ { 0x2E80, "CJK Radicals Supplement" },
+ { 0x2EF5, "Unassigned" },
+ { 0x2F00, "Kangxi Radicals" },
+ { 0x2FD6, "Unassigned" },
+ { 0x2FE0, "Unassigned" },
+ { 0x2FF0, "Ideographic Description Characters" },
+ { 0x2FFC, "Unassigned" },
+ { 0x3000, "CJK Symbols and Punctuation" },
+ { 0x3040, "Hiragana" },
+ { 0x30A0, "Katakana" },
+ { 0x3100, "Bopomofo" },
+ { 0x3130, "Hangul Compatibility Jamo" },
+ { 0x3190, "Kanbun" },
+ { 0x31A0, "Bopomofo Extended" },
+ { 0x31BB, "Unassigned" },
+ { 0x31C0, "CJK Strokes" },
+ { 0x31E4, "Unassigned" },
+ { 0x31F0, "Katakana Phonetic Extensions" },
+ { 0x3200, "Enclosed CJK Letters and Months" },
+ { 0x3300, "CJK Compatibility" },
+ { 0x3400, "CJK Unified Ideographs Extension A" },
+ { 0x4DB6, "Unassigned" },
+ { 0x4DC0, "Yijing Hexagram Symbols" },
+ { 0x4E00, "CJK Unified Ideographs" },
+ { 0x9FD6, "Unassigned" },
+ { 0xA000, "Yi Syllables" },
+ { 0xA48D, "Unassigned" },
+ { 0xA490, "Yi Radicals" },
+ { 0xA4C7, "Unassigned" },
+ { 0xA4D0, "Lisu" },
+ { 0xA500, "Vai" },
+ { 0xA62C, "Unassigned" },
+ { 0xA640, "Cyrillic Extended-B" },
+ { 0xA6A0, "Bamum" },
+ { 0xA700, "Modifier Tone Letters" },
+ { 0xA720, "Latin Extended-D" },
+ { 0xA800, "Syloti Nagri" },
+ { 0xA82C, "Unassigned" },
+ { 0xA830, "Common Indic Number Forms" },
+ { 0xA83A, "Unassigned" },
+ { 0xA840, "Phags-pa" },
+ { 0xA878, "Unassigned" },
+ { 0xA880, "Saurashtra" },
+ { 0xA8DA, "Unassigned" },
+ { 0xA8E0, "Devanagari Extended" },
+ { 0xA8FE, "Unassigned" },
+ { 0xA900, "Kayah Li" },
+ { 0xA930, "Rejang" },
+ { 0xA960, "Hangul Jamo Extended-A" },
+ { 0xA97D, "Unassigned" },
+ { 0xA980, "Javanese" },
+ { 0xA9E0, "Myanmar Extended-B" },
+ { 0xAA00, "Cham" },
+ { 0xAA60, "Myanmar Extended-A" },
+ { 0xAA80, "Tai Viet" },
+ { 0xAAE0, "Meetei Mayek Extensions" },
+ { 0xAB00, "Ethiopic Extended-A" },
+ { 0xAB30, "Latin Extended-E" },
+ { 0xAB66, "Unassigned" },
+ { 0xAB70, "Cherokee Supplement" },
+ { 0xABC0, "Meetei Mayek" },
+ { 0xABFA, "Unassigned" },
+ { 0xAC00, "Hangul Syllables" },
+ { 0xD7B0, "Hangul Jamo Extended-B" },
+ { 0xD7FC, "Unassigned" },
+/*{ 0xD800, "High Surrogates" }, */ /* UTF-16 compatibility */
+/*{ 0xDC00, "Low Surrogates" }, */ /* UTF-16 compatibility */
+ { 0xE000, "Private Use Area" },
+ { 0xF900, "CJK Compatibility Ideographs" },
+ { 0xFAEA, "Unassigned" },
+ { 0xFB00, "Alphabetic Presentation Forms" },
+ { 0xFB50, "Arabic Presentation Forms-A" },
+ { 0xFE00, "Variation Selectors" },
+ { 0xFE10, "Vertical Forms" },
+ { 0xFE1A, "Unassigned" },
+ { 0xFE20, "Combining Half Marks" },
+ { 0xFE30, "CJK Compatibility Forms" },
+ { 0xFE50, "Small Form Variants" },
+ { 0xFE6C, "Unassigned" },
+ { 0xFE70, "Arabic Presentation Forms-B" },
+ { 0xFF00, "Halfwidth and Fullwidth Forms" },
+ { 0xFFF0, "Unassigned" },
+ { 0xFFF9, "Specials" },
+ { 0xFFFE, "Unassigned" },
+
+ { 0x10000, "*Supplementary Multilingual" },
+ { 0x10000, "Linear B Syllabary" },
+ { 0x1007E, "Unassigned" },
+ { 0x10080, "Linear B Ideograms" },
+ { 0x100FB, "Unassigned" },
+ { 0x10100, "Aegean Numbers" },
+ { 0x10140, "Ancient Greek Numbers" },
+ { 0x1018D, "Unassigned" },
+ { 0x10190, "Ancient Symbols" },
+ { 0x1019C, "Unassigned" },
+ { 0x101D0, "Phaistos Disc" },
+ { 0x10200, "Unassigned" },
+ { 0x10280, "Lycian" },
+ { 0x1029D, "Unassigned" },
+ { 0x102A0, "Carian" },
+ { 0x102D1, "Unassigned" },
+ { 0x102E0, "Coptic Epact Numbers" },
+ { 0x102FC, "Unassigned" },
+ { 0x10300, "Old Italic" },
+ { 0x10324, "Unassigned" },
+ { 0x10330, "Gothic" },
+ { 0x1034B, "Unassigned" },
+ { 0x10350, "Old Permic" },
+ { 0x10380, "Ugaritic" },
+ { 0x103A0, "Old Persian" },
+ { 0x103D6, "Unassigned" },
+ { 0x103E0, "Unassigned" },
+ { 0x10400, "Deseret" },
+ { 0x10450, "Shavian" },
+ { 0x10480, "Osmanya" },
+ { 0x104AA, "Unassigned" },
+ { 0x104B0, "Unassigned" },
+ { 0x10500, "Elbasan" },
+ { 0x10528, "Unassigned" },
+ { 0x10530, "Caucasian Albanian" },
+ { 0x10570, "Unassigned" },
+ { 0x10600, "Linear A" },
+ { 0x10768, "Unassigned" },
+ { 0x10780, "Unassigned" },
+ { 0x10800, "Cypriot Syllabary" },
+ { 0x10840, "Imperial Aramaic" },
+ { 0x10860, "Palmyrene" },
+ { 0x10880, "Nabataean" },
+ { 0x108B0, "Unassigned" },
+ { 0x108E0, "Hatran" },
+ { 0x10900, "Phoenician" },
+ { 0x10920, "Lydian" },
+ { 0x10940, "Unassigned" },
+ { 0x10980, "Meroitic Hieroglyphs" },
+ { 0x109A0, "Meroitic Cursive" },
+ { 0x10A00, "Kharoshthi" },
+ { 0x10A59, "Unassigned" },
+ { 0x10A60, "Old South Arabian" },
+ { 0x10A80, "Old North Arabian" },
+ { 0x10AA0, "Unassigned" },
+ { 0x10AC0, "Manichaean" },
+ { 0x10AF7, "Unassigned" },
+ { 0x10B00, "Avestan" },
+ { 0x10B40, "Inscriptional Parthian" },
+ { 0x10B60, "Inscriptional Pahlavi" },
+ { 0x10B80, "Psalter Pahlavi" },
+ { 0x10BB0, "Unassigned" },
+ { 0x10C00, "Old Turkic" },
+ { 0x10C49, "Unassigned" },
+ { 0x10C50, "Unassigned" },
+ { 0x10C80, "Old Hungarian" },
+ { 0x10D00, "Unassigned" },
+ { 0x10E60, "Rumi Numeral Symbols" },
+ { 0x10E80, "Unassigned" },
+ { 0x11000, "Brahmi" },
+ { 0x11070, "Unassigned" },
+ { 0x11080, "Kaithi" },
+ { 0x110C2, "Unassigned" },
+ { 0x110D0, "Sora Sompeng" },
+ { 0x110FA, "Unassigned" },
+ { 0x11100, "Chakma" },
+ { 0x11144, "Unassigned" },
+ { 0x11150, "Mahajani" },
+ { 0x11177, "Unassigned" },
+ { 0x11180, "Sharada" },
+ { 0x111E0, "Sinhala Archaic Numbers" },
+ { 0x111F5, "Unassigned" },
+ { 0x11200, "Khojki" },
+ { 0x1123E, "Unassigned" },
+ { 0x11250, "Unassigned" },
+ { 0x11280, "Multani" },
+ { 0x112AA, "Unassigned" },
+ { 0x112B0, "Khudawadi" },
+ { 0x112FA, "Unassigned" },
+ { 0x11300, "Grantha" },
+ { 0x11375, "Unassigned" },
+ { 0x11380, "Unassigned" },
+ { 0x11480, "Tirhuta" },
+ { 0x114DA, "Unassigned" },
+ { 0x114E0, "Unassigned" },
+ { 0x11580, "Siddham" },
+ { 0x115DE, "Unassigned" },
+ { 0x11600, "Modi" },
+ { 0x1165A, "Unassigned" },
+ { 0x11660, "Unassigned" },
+ { 0x11680, "Takri" },
+ { 0x116CA, "Unassigned" },
+ { 0x116D0, "Unassigned" },
+ { 0x11700, "Ahom" },
+ { 0x11740, "Unassigned" },
+ { 0x118A0, "Warang Citi" },
+ { 0x11900, "Unassigned" },
+ { 0x11AC0, "Pau Cin Hau" },
+ { 0x11AF9, "Unassigned" },
+ { 0x11B00, "Unassigned" },
+ { 0x12000, "Cuneiform" },
+ { 0x1239A, "Unassigned" },
+ { 0x12400, "Cuneiform Numbers and Punctuation" },
+ { 0x12475, "Unassigned" },
+ { 0x12480, "Early Dynastic Cuneiform" },
+ { 0x12544, "Unassigned" },
+ { 0x12550, "Unassigned" },
+ { 0x13000, "Egyptian Hieroglyphs" },
+ { 0x13430, "Unassigned" },
+ { 0x14400, "Anatolian Hieroglyphs" },
+ { 0x14647, "Unassigned" },
+ { 0x14680, "Unassigned" },
+ { 0x16800, "Bamum Supplement" },
+ { 0x16A39, "Unassigned" },
+ { 0x16A40, "Mro" },
+ { 0x16A70, "Unassigned" },
+ { 0x16AD0, "Bassa Vah" },
+ { 0x16AF6, "Unassigned" },
+ { 0x16B00, "Pahawh Hmong" },
+ { 0x16B90, "Unassigned" },
+ { 0x16F00, "Miao" },
+ { 0x16FA0, "Unassigned" },
+ { 0x1B000, "Kana Supplement" },
+ { 0x1B002, "Unassigned" },
+ { 0x1B100, "Unassigned" },
+ { 0x1BC00, "Duployan Shorthand" },
+ { 0x1BCA4, "Unassigned" },
+ { 0x1BCB0, "Unassigned" },
+ { 0x1D000, "Byzantine Musical Symbols" },
+ { 0x1D0F5, "Unassigned" },
+ { 0x1D100, "Musical Symbols" },
+ { 0x1D1E9, "Unassigned" },
+ { 0x1D200, "Ancient Greek Musical Notation" },
+ { 0x1D246, "Unassigned" },
+ { 0x1D250, "Unassigned" },
+ { 0x1D300, "Tai Xuan Jing Symbols" },
+ { 0x1D357, "Unassigned" },
+ { 0x1D360, "Counting Rod Numerals" },
+ { 0x1D372, "Unassigned" },
+ { 0x1D380, "Unassigned" },
+ { 0x1D400, "Mathematical Alphanumeric Symbols" },
+ { 0x1D800, "Sutton SignWriting" },
+ { 0x1DAB0, "Unassigned" },
+ { 0x1E800, "Mende Kikakui" },
+ { 0X1E8D7, "Unassigned" },
+ { 0x1E8E0, "Unassigned" },
+ { 0x1EE00, "Arabic Mathematical Alphabetic Symbols" },
+ { 0X1EEFC, "Unassigned" },
+ { 0x1EF00, "Unassigned" },
+ { 0x1F000, "Mahjong Tiles" },
+ { 0x1F02C, "Unassigned" },
+ { 0x1F030, "Domino Tiles" },
+ { 0x1F094, "Unassigned" },
+ { 0x1F0A0, "Playing Cards" },
+ { 0x1F0F6, "Unassigned" },
+ { 0x1F100, "Enclosed Alphanumeric Supplement" },
+ { 0x1F19B, "Unassigned" },
+ { 0x1F1E6, "Enclosed Alphanumeric Supplement" },
+ { 0x1F200, "Enclosed Ideographic Supplement" },
+ { 0x1F252, "Unassigned" },
+ { 0x1F300, "Miscellaneous Symbols and Pictographs" },
+ { 0x1F600, "Emoticons" },
+ { 0x1F650, "Ornamental Dingbats" },
+ { 0x1F680, "Transport and Map Symbols" },
+ { 0x1F6F4, "Unassigned" },
+ { 0x1F700, "Alchemical Symbols" },
+ { 0x1F774, "Unassigned" },
+ { 0x1F780, "Geometric Shapes Extended" },
+ { 0x1F7D5, "Unassigned" },
+ { 0x1F800, "Supplemental Arrows-C" },
+ { 0x1F8AD, "Unassigned" },
+ { 0x1F910, "Supplemental Symbols and Pictographs" },
+ { 0x1F9C1, "Unassigned" },
+ { 0x1FA00, "Unassigned" },
+
+ { 0x20000, "*Supplementary Ideographic" },
+ { 0x20000, "CJK Unified Ideographs Extension B" },
+ { 0x2A6D7, "Unassigned" },
+ { 0x2A6E0, "Unassigned" },
+ { 0x2A700, "CJK Unified Ideographs Extension C" },
+ { 0x2B740, "Unassigned" },
+ { 0x2B740, "CJK Unified Ideographs Extension D" },
+ { 0x2B820, "Unassigned" },
+ { 0x2B820, "CJK Unified Ideographs Extension E" },
+ { 0x2CEA2, "Unassigned" },
+ { 0x2CEB0, "Unassigned" },
+ { 0x2F800, "CJK Compatibility Ideographs Supplement" },
+ { 0x2FA20, "Unassigned" },
+
+ { 0x30000, "*Unassigned Plane 3" },
+ { 0x40000, "*Unassigned Plane 4" },
+ { 0x50000, "*Unassigned Plane 5" },
+ { 0x60000, "*Unassigned Plane 6" },
+ { 0x70000, "*Unassigned Plane 7" },
+ { 0x80000, "*Unassigned Plane 8" },
+ { 0x90000, "*Unassigned Plane 9" },
+ { 0xA0000, "*Unassigned Plane 10" },
+ { 0xB0000, "*Unassigned Plane 11" },
+ { 0xC0000, "*Unassigned Plane 12" },
+ { 0xD0000, "*Unassigned Plane 13" },
+
+ { 0xE0000, "*Supplementary Special-Purpose" },
+ { 0xE0080, "Unassigned" },
+ { 0xE0020, "Tags" },
+ { 0xE0080, "Unassigned" },
+ { 0xE0100, "Variation Selectors Supplement" },
+ { 0xE01F0, "Unassigned" },
+
+ { 0xF0000, "*Supplementary Private Use Area A" },
+ { 0x100000, "*Supplementary Private Use Area B" },
+};
+
+
+static char *
+strip (char *s)
+{
+ unsigned long L;
+ while (*s == ' ' || *s == '\t' || *s == '\n')
+ s++;
+ L = strlen (s);
+ while (s[L-1] == ' ' || s[L-1] == '\t' || s[L-1] == '\n')
+ s[--L] = 0;
+ return s;
+}
+
+
+/* matches ("AA, BB, CC", "CC") => True
+ matches ("AA, BB, CC", "CCx") => False
+ */
+static Bool
+matches (const char *pattern, const char *string)
+{
+ char *token = strdup (pattern ? pattern : "");
+ char *otoken = token;
+ char *name;
+ Bool match = False;
+ while ((name = strtok (token, ","))) {
+ token = 0;
+ name = strip (name);
+ if (*name && !strcasecmp (name, string))
+ {
+ match = True;
+ break;
+ }
+ }
+
+ free (otoken);
+ return match;
+}
+
+
+static void
+pick_unichar (ModeInfo *mi)
+{
+ unicrud_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ unsigned long min = 0;
+ unsigned long max = 0x2F800;
+ unsigned long last = 0;
+ int retries = 0;
+
+ AGAIN:
+ bp->unichar = min + (random() % (max - min));
+
+ if (++retries > 0xF0000 / 2)
+ {
+ fprintf (stderr, "%s: internal error: too many retries\n", progname);
+ exit (1);
+ }
+
+ /* bp->unichar = 0x1F4A9; */
+
+ last = 0;
+ bp->charplane = "Unassigned";
+ bp->charblock = "Unassigned";
+ for (i = 0; i < countof(unicode_block_names); i++)
+ {
+ if (unicode_block_names[i].start < last)
+ {
+ fprintf (stderr, "%s: progname: internal error: misordered: 0x%lX\n",
+ progname, unicode_block_names[i].start);
+ exit (1);
+ }
+ last = unicode_block_names[i].start;
+ if (bp->unichar >= unicode_block_names[i].start)
+ {
+ if (unicode_block_names[i].name[0] == '*')
+ {
+ bp->charplane = unicode_block_names[i].name + 1;
+ bp->charblock = "Unassigned";
+ }
+ else
+ bp->charblock = unicode_block_names[i].name;
+ }
+ else
+ break;
+ }
+
+ if (!strncmp (bp->charblock, "Unassigned", 10) ||
+ !strncmp (bp->charblock, "Combining", 9))
+ goto AGAIN;
+
+ if (*do_block && !matches (do_block, bp->charblock))
+ goto AGAIN;
+
+ /* Skip blank characters */
+ {
+ XCharStruct e;
+ char text[10];
+ i = utf8_encode (bp->unichar, text, sizeof(text) - 1);
+ text[i] = 0;
+ texture_string_metrics (bp->char_font, text, &e, 0, 0);
+ if (e.width < 2 || e.ascent + e.descent < 2)
+ goto AGAIN;
+ }
+
+# ifdef HAVE_JWXYZ
+ bp->charname = texfont_unicode_character_name (bp->char_font, bp->unichar);
+# endif
+
+ bp->color[0] = 0.5 + frand(0.5);
+ bp->color[1] = 0.5 + frand(0.5);
+ bp->color[2] = 0.5 + frand(0.5);
+ bp->color[3] = 1;
+}
+
+
+static void
+draw_unichar (ModeInfo *mi)
+{
+ unicrud_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ char text[10];
+ char title[400];
+ XCharStruct e;
+ int w, h, i, j;
+ GLfloat s;
+
+ i = utf8_encode (bp->unichar, text, sizeof(text) - 1);
+ text[i] = 0;
+
+ *title = 0;
+ sprintf (title + strlen(title), "Plane:\t%s\n", bp->charplane);
+ sprintf (title + strlen(title), "Block:\t%s\n", bp->charblock);
+# ifdef HAVE_JWXYZ
+ sprintf (title + strlen(title), "Name:\t%s\n",
+ (bp->charname ? bp->charname : ""));
+#endif
+ sprintf (title + strlen(title), "Unicode:\t%04lX\n", bp->unichar);
+ sprintf (title + strlen(title), "UTF-8:\t");
+ for (j = 0; j < i; j++)
+ sprintf (title + strlen(title), "%02X ", ((unsigned char *)text)[j]);
+
+ texture_string_metrics (bp->char_font, text, &e, 0, 0);
+ w = e.width;
+ h = e.ascent;
+
+ s = 9;
+ glScalef (s, s, s);
+
+ s = 1.0 / (h > w ? h : w); /* Scale to unit */
+ glScalef (s, s, s);
+
+ glTranslatef (-w/2, -h/2, 0);
+ glColor4fv (bp->color);
+ print_texture_string (bp->char_font, text);
+
+ glColor3f (1, 1, 0);
+ if (do_titles)
+ print_texture_label (mi->dpy, bp->title_font,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, title);
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_unicrud (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+unicrud_handle_event (ModeInfo *mi, XEvent *event)
+{
+ unicrud_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+ {
+ if (bp->state == LINGER) bp->ratio = 1;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_unicrud (ModeInfo *mi)
+{
+ unicrud_configuration *bp;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_unicrud (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ {
+ double spin_speed = 0.05;
+ double wander_speed = 0.01;
+ double spin_accel = 1.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->title_font = load_texture_font (mi->dpy, "titleFont");
+ bp->char_font = load_texture_font (mi->dpy, "font");
+ bp->state = IN;
+ bp->ratio = 0;
+ bp->spin_direction = (random() & 1) ? 1 : -1;
+
+
+
+ if (matches ("all", do_block))
+ do_block = strdup("");
+
+ {
+ char *s;
+ for (s = do_block; *s; s++)
+ if (*s == '_') *s = ' ';
+ }
+
+ if (matches ("help", do_block))
+ {
+ int i;
+ fprintf (stderr,
+ "%s: --blocks must contain one or more of these,"
+ " separated by commas:\n\n", progname);
+ for (i = 0; i < countof(unicode_block_names); i++)
+ {
+ const char *n = unicode_block_names[i].name;
+ if (*n == '*')
+ continue;
+ if (!strncmp (n, "Unassigned", 10) ||
+ !strncmp (n, "Combining", 9))
+ continue;
+ fprintf (stderr, "\t%s\n", n);
+ }
+ fprintf (stderr, "\n");
+ exit (1);
+ }
+
+
+ /* Make sure all elements in --block are valid.
+ */
+ if (*do_block)
+ {
+ char *token = strdup (do_block ? do_block : "");
+ char *otoken = token;
+ char *name;
+ while ((name = strtok (token, ","))) {
+ token = 0;
+ name = strip (name);
+ if (*name)
+ {
+ Bool match = False;
+ int i;
+ for (i = 0; i < countof(unicode_block_names); i++)
+ {
+ const char *n = unicode_block_names[i].name;
+ if (*n == '*')
+ continue;
+ if (!strncmp (n, "Unassigned", 10) ||
+ !strncmp (n, "Combining", 9))
+ continue;
+ if (!strcasecmp (name, n))
+ {
+ match = True;
+ break;
+ }
+ }
+ if (! match)
+ {
+ fprintf (stderr, "%s: unknown block name: \"%s\"\n",
+ progname, name);
+ fprintf (stderr, "%s: use '--block help' for a list\n",
+ progname);
+ exit (1);
+ }
+ }
+ }
+ free (otoken);
+ }
+
+ pick_unichar (mi);
+}
+
+
+ENTRYPOINT void
+draw_unicrud (ModeInfo *mi)
+{
+ unicrud_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel (GL_FLAT);
+ glEnable (GL_NORMALIZE);
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_LIGHTING);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (! bp->button_down_p)
+ switch (bp->state) {
+ case IN: bp->ratio += speed * 0.05; break;
+ case OUT: bp->ratio += speed * 0.05; break;
+ case LINGER: bp->ratio += speed * 0.005; break;
+ default: abort();
+ }
+
+ if (bp->ratio > 1.0)
+ {
+ bp->ratio = 0;
+ switch (bp->state) {
+ case IN:
+ bp->state = LINGER;
+ break;
+ case LINGER:
+ bp->state = OUT;
+ bp->spin_direction = (random() & 1) ? 1 : -1;
+ break;
+ case OUT:
+ bp->state = IN;
+ pick_unichar(mi);
+ break;
+ default: abort();
+ }
+ }
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 6,
+ (y - 0.5) * 6,
+ (z - 0.5) * 6);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ x = y = 0;
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+# define SINOID(N) (sin(M_PI - (N) / 2 * M_PI))
+ {
+ GLfloat s;
+ switch (bp->state) {
+ case IN: s = SINOID (bp->ratio); break;
+ case OUT: s = SINOID (1-bp->ratio); break;
+ default: s = 1; break;
+ }
+ glScalef (s, s, s);
+ glRotatef (360 * s * bp->spin_direction * (bp->state == IN ? -1 : 1),
+ 0, 0, 1);
+ }
+
+ draw_unichar (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("Unicrud", unicrud, unicrud)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/unicrud.man b/hacks/glx/unicrud.man
new file mode 100644
index 0000000..694ea06
--- /dev/null
+++ b/hacks/glx/unicrud.man
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+unicrud - Bounces a random Unicode character on the screen.
+.SH SYNOPSIS
+.B unicrud
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-block \fIstring\fP]
+[\-no-titles]
+[\-no-wander]
+[\-no-roll]
+[\-fps]
+.SH DESCRIPTION
+Chooses a random Unicode character and displays it full screen, along with
+some information about it. https://en.wikipedia.org/wiki/Unicode
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-titles | \-no-titles
+Whether to describe the character being shown. Default true.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-roll | \-no-roll
+Whether the object should rotate. Boolean.
+.TP 8
+.B \-block \fIstring\fP
+Which block or blocks of Unicode characters to display. Default: "all".
+Use \fI\-block help\fP to see the full list.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/unknownpleasures.c b/hacks/glx/unknownpleasures.c
new file mode 100644
index 0000000..9802566
--- /dev/null
+++ b/hacks/glx/unknownpleasures.c
@@ -0,0 +1,486 @@
+/* unknownpleasures, Copyright (c) 2013-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Translated from Mathematica code by Archery:
+ * http://intothecontinuum.tumblr.com/post/27443100682/in-july-1967-astronomers-at-the-cavendish
+ *
+ * Interestingly, the original image is copyright-free:
+ * http://adamcap.com/2011/05/19/history-of-joy-division-unknown-pleasures-album-art/
+ * https://en.wikipedia.org/wiki/Unknown_Pleasures
+ *
+ * TODO:
+ *
+ * - Performance is not great. Spending half our time in compute_line()
+ * and half our time in glEnd(). It's a vast number of cos/pow calls,
+ * and a vast number of polygons. I'm not sure how much could be cached.
+ *
+ * - There's too low periodicity vertically on the screen.
+ *
+ * - There's too low periodicity in time.
+ *
+ * - Could take advantage of time periodicity for caching: just save every
+ * poly for an N second loop. That would be a huge amount of RAM though.
+ *
+ * - At low resolutions, GL_POLYGON_OFFSET_FILL seems to work poorly
+ * and the lines get blocky.
+ */
+
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 80 \n" \
+ "*resolution: 100 \n" \
+ "*ortho: True \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*geometry: =800x800" "\n" \
+
+# define free_unk 0
+# define release_unk 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPEED "1.0"
+
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool orthop;
+ GLfloat resolution;
+ int count;
+ GLfloat t;
+} unk_configuration;
+
+static unk_configuration *bps = NULL;
+
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-resolution", ".resolution", XrmoptionSepArg, 0 },
+ { "-ortho", ".ortho", XrmoptionNoArg, "True" },
+ { "-no-ortho", ".ortho", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt unk_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_unk (ModeInfo *mi, int width, int height)
+{
+ unk_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width*1.5;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ if (bp->orthop)
+ {
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (1.0, 1/h, 690, 710);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0, 0, 700,
+ 0, 0, 0,
+ 0, 1, 0);
+ if (width < height)
+ glScalef (1/h, 1/h, 1);
+ glTranslatef (0, -0.5, 0);
+ }
+ else
+ {
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 20.0, 40.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+ if (width < height)
+ glScalef (1/h, 1/h, 1);
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+unk_handle_event (ModeInfo *mi, XEvent *event)
+{
+ unk_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button5 ||
+ event->xbutton.button == Button6 ||
+ event->xbutton.button == Button7))
+ {
+ int b = event->xbutton.button;
+ int speed = 1;
+ if (b == Button6 || b == Button7)
+ speed *= 3;
+ if (bp->orthop)
+ switch (b) { /* swap axes */
+ case Button4: b = Button6; break;
+ case Button5: b = Button7; break;
+ case Button6: b = Button4; break;
+ case Button7: b = Button5; break;
+ }
+ gltrackball_mousewheel (bp->trackball, b, speed, !!event->xbutton.state);
+ return True;
+ }
+ else if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ bp->orthop = !bp->orthop;
+ reshape_unk (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+
+ENTRYPOINT void
+init_unk (ModeInfo *mi)
+{
+ unk_configuration *bp;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ bp->orthop = get_boolean_resource (MI_DISPLAY (mi), "ortho", "Ortho");
+ bp->resolution = get_float_resource (MI_DISPLAY (mi),
+ "resolution", "Resolution");
+ if (bp->resolution < 1) bp->resolution = 1;
+ if (bp->resolution > 300) bp->resolution = 300;
+
+ reshape_unk (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ bp->count = MI_COUNT(mi);
+ if (bp->count < 1) bp->count = 1;
+
+ bp->trackball = gltrackball_init (False);
+
+ if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+
+static double
+R (double f)
+{
+ /* A simple, fast, deterministic PRNG.
+ ya_rand_init() is too slow for this, and the stream of numbers here
+ doesn't have to be high quality.
+ */
+#if 1
+ int seed0 = 1613287;
+
+# else
+ /* Kluge to let me pick a good seed factor by trial and error... */
+ static int seed0 = 0;
+ static int count = 0;
+ if (count++ > 150000000) seed0 = 0, count=0;
+ if (! seed0)
+ {
+ seed0 = (random() & 0xFFFFF);
+ fprintf(stderr, "seed0 = %8x %d\n", seed0, seed0);
+ }
+# endif
+
+ long seed = seed0 * f;
+ seed = 48271 * (seed % 44488) - 3399 * (seed / 44488);
+ f = (double) seed / 0x7FFFFFFF;
+
+ return f;
+}
+
+
+static void
+compute_line (ModeInfo *mi,
+ int xmin, int xmax, GLfloat xinc,
+ GLfloat res_scale,
+ int y,
+ GLfloat *points)
+{
+ unk_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ GLfloat fx;
+ int lastx = -999999;
+
+ /* Compute the points on the line */
+
+ for (fx = xmin; fx < xmax; fx += xinc)
+ {
+ int x = fx;
+ int n;
+ GLfloat hsum = 0, vsum = 0;
+
+ if (x == lastx) continue;
+ lastx = x;
+
+ for (n = 1; n <= 30; n++)
+ {
+ /* This sum affects crinkliness of the lines */
+ hsum += (10 *
+ sin (2 * M_PI
+ * R (4 * y)
+ + bp->t
+ + R (2 * n * y)
+ * 2 * M_PI)
+ * exp (-pow ((.3 * (x / res_scale) + 30
+ - 1 * 100 * R (2 * n * y)),
+ 2)
+ / 20.0));
+ }
+
+ for (n = 1; n <= 4; n++)
+ {
+ /* This sum affects amplitude of the peaks */
+ vsum += (3 * (1 + R (3 * n * y))
+ * fabs (sin (bp->t + R (n * y)
+ * 2 * M_PI))
+ * exp (-pow (((x / res_scale) - 1 * 100 * R (n * y)),
+ 2)
+ / 20.0));
+ }
+
+ /* Scale of this affects amplitude of the flat parts */
+ points[x - xmin] = (0.2 * sin (2 * M_PI * R (6 * y) + hsum) + vsum);
+ }
+
+}
+
+
+ENTRYPOINT void
+draw_unk (ModeInfo *mi)
+{
+ unk_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat aspect = 1.5;
+
+ GLfloat res_scale = 4;
+ int xmin = -50 * res_scale;
+ int xmax = 150 * res_scale;
+ GLfloat xinc = 100.0 / (bp->resolution / res_scale);
+ int ymin = 1;
+ int ytop = MI_COUNT(mi);
+ int yinc = 1;
+ int y;
+ GLfloat *points;
+
+ if (xinc < 0.25) xinc = 0.25;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glShadeModel (GL_FLAT);
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+
+ glPushMatrix ();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ gltrackball_rotate (bp->trackball);
+ glScalef (10, 10, 10);
+
+ glRotatef (-45, 1, 0, 0);
+ glTranslatef (-0.5, -0.5, 0);
+ if (bp->orthop)
+ glTranslatef (0, 0.05, 0);
+ else
+ glTranslatef (0, 0.15, 0);
+
+ points = (GLfloat *) malloc (sizeof(*points) * (xmax - xmin));
+
+ if (!bp->button_down_p)
+ {
+ double s = 6.3 / 19 / 3;
+# if 1
+ bp->t -= s * speed;
+ if (bp->t <= 0)
+ bp->t = s * 18 * 3;
+# else
+ bp->t += s;
+# endif
+ }
+
+ glLineWidth (2);
+
+ /* Lower the resolution to get a decent frame rate on iPhone 4s */
+ if (mi->xgwa.width <= 640 || mi->xgwa.height <= 640)
+ {
+ ytop *= 0.6;
+ xinc *= 3;
+ }
+
+# ifdef HAVE_MOBILE
+ /* Lower it even further for iPhone 3 */
+ if (mi->xgwa.width <= 480 || mi->xgwa.height <= 480)
+ {
+ ytop *= 0.8;
+ xinc *= 1.2;
+ }
+
+ /* Performance just sucks on iPad 3, even with a very high xinc. WTF? */
+/*
+ if (mi->xgwa.width >= 2048 || mi->xgwa.height >= 2048)
+ xinc *= 2;
+*/
+
+# endif /* HAVE_MOBILE */
+
+
+ /* Make the image fill the screen a little more fully */
+ if (mi->xgwa.width <= 640 || mi->xgwa.height <= 640)
+ {
+ glScalef (1.2, 1.2, 1.2);
+ glTranslatef (-0.08, 0, 0);
+ }
+
+ if (mi->xgwa.width <= 480 || mi->xgwa.height <= 480)
+ glLineWidth (1);
+
+
+ if (wire)
+ xinc *= 1.3;
+
+ /* Draw back mask */
+ {
+ GLfloat s = 0.99;
+ glDisable (GL_POLYGON_OFFSET_FILL);
+ glColor3f (0, 0, 0);
+ glPushMatrix();
+ glTranslatef (0, (1-aspect)/2, -0.005);
+ glScalef (1, aspect, 1);
+ glTranslatef (0.5, 0.5, 0);
+ glScalef (s, s, 1);
+ glBegin (GL_QUADS);
+ glVertex3f (-0.5, -0.5, 0);
+ glVertex3f ( 0.5, -0.5, 0);
+ glVertex3f ( 0.5, 0.5, 0);
+ glVertex3f (-0.5, 0.5, 0);
+ glEnd();
+ glPopMatrix();
+ }
+
+ if (! wire)
+ {
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+
+ /* So the masking quads don't interfere with the lines */
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+ }
+
+ for (y = ymin; y <= ytop; y += yinc)
+ {
+ /* Compute all the verts on the line */
+ compute_line (mi, xmin, xmax, xinc, res_scale, y, points);
+
+ /* Draw the line segments; then draw the black shielding quads. */
+ {
+ GLfloat yy = y / (GLfloat) ytop;
+ int linesp;
+
+ yy = (yy * aspect) - ((aspect - 1) / 2);
+
+ for (linesp = 0; linesp <= 1; linesp++)
+ {
+ GLfloat fx;
+ int lastx = -999999;
+
+ GLfloat c = (linesp || wire ? 1 : 0);
+ glColor3f (c, c, c);
+
+ glBegin (linesp
+ ? GL_LINE_STRIP
+ : wire ? GL_LINES : GL_QUAD_STRIP);
+ lastx = -999999;
+ for (fx = xmin; fx < xmax; fx += xinc)
+ {
+ int x = fx;
+ GLfloat xx = (x - xmin) / (GLfloat) (xmax - xmin);
+ GLfloat zz = points [x - xmin];
+
+ if (x == lastx) continue;
+ lastx = x;
+
+ zz /= 80;
+ glVertex3f (xx, yy, zz);
+ if (! linesp)
+ glVertex3f (xx, yy, 0);
+ mi->polygon_count++;
+ }
+ glEnd ();
+ }
+ }
+ }
+
+ free (points);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("UnknownPleasures", unknownpleasures, unk)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/unknownpleasures.man b/hacks/glx/unknownpleasures.man
new file mode 100644
index 0000000..422c81f
--- /dev/null
+++ b/hacks/glx/unknownpleasures.man
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+unknownpleasures - an animation of the signal from the pulsar PSR B1919+21.
+.SH SYNOPSIS
+.B unknownpleasures
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIpercent\fP]
+[\-count \fIinteger\fP]
+[\-resolution \fIpercent\fP]
+[\-no-ortho]
+[\-fps]
+.SH DESCRIPTION
+PSR B1919+21 (AKA CP 1919) was the first pulsar ever discovered: a spinning
+neutron star emitting a periodic lighthouse-like beacon. An illustration of
+the signal received from it was published in Scientific American in 1971,
+and later in The Cambridge Encyclopedia of Astronomy in 1977, where it was
+seen by Stephen Morris, the drummer of Joy Division, and was consequently
+appropriated by Peter Saville for the cover of the band's album "Unknown
+Pleasures".
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2 for twice as fast, 0.5 for half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Scanlines (vertical resolution). Default: 80.
+.TP 8
+.B \-count \fInumber\fP
+Horizontal Resolution, Default: 100%.
+.TP 8
+.B \-ortho | \-no-ortho
+Whether to use an orthographic projection.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/vigilance.c b/hacks/glx/vigilance.c
new file mode 100644
index 0000000..05e19ed
--- /dev/null
+++ b/hacks/glx/vigilance.c
@@ -0,0 +1,1150 @@
+/* vigilance, Copyright (c) 2017-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws surveillance cameras, taking an interest in their surroundings.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 5 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*bodyColor: #666666" "\n" \
+ "*capColor: #FFFFFF" "\n" \
+ "*hingeColor: #444444" "\n" \
+ "*mountColor: #444444" "\n" \
+ "*lensColor: #000000" "\n" \
+ "*groundColor: #004400" "\n" \
+
+# define free_camera 0
+# define release_camera 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_SPEED "1.0"
+#define DEF_CAMERA_SIZE "1.0"
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include "normals.h"
+
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#undef ABS
+#define ABS(x) ((x)<0?-(x):(x))
+#undef MAX
+#define MAX(A,B) ((A)>(B)?(A):(B))
+#undef MIN
+#define MIN(A,B) ((A)<(B)?(A):(B))
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "gllist.h"
+
+extern const struct gllist
+ *seccam_body, *seccam_cap, *seccam_hinge, *seccam_pipe, *seccam_lens;
+static struct gllist *ground = 0;
+
+static const struct gllist * const *all_objs[] = {
+ &seccam_body, &seccam_cap, &seccam_hinge, &seccam_pipe, &seccam_lens,
+ (const struct gllist * const *) &ground
+};
+
+#define CAMERA_BODY 0
+#define CAMERA_CAP 1
+#define CAMERA_HINGE 2
+#define CAMERA_MOUNT 3
+#define CAMERA_LENS 4
+#define GROUND 5
+
+#define BEAM_ZOFF 0.185 /* distance from origin to lens in model */
+
+typedef enum { IDLE, WARM_UP, ZOT, COOL_DOWN } camera_state;
+
+
+typedef struct {
+ XYZ pos;
+ GLfloat facing; /* rotation around vertical axis, degrees */
+ GLfloat pitch; /* front/back tilt, degrees */
+ GLfloat velocity; /* most recent angular velocity, degrees */
+ long focus_id; /* pedestrian or camera of interest */
+ XYZ focus; /* point of interest */
+ camera_state state;
+ GLfloat tick;
+} camera;
+
+typedef struct pedestrian pedestrian;
+struct pedestrian {
+ long id;
+ XYZ pos;
+ GLfloat length;
+ GLfloat frequency, amplitude;
+ GLfloat ratio;
+ GLfloat speed;
+ pedestrian *next;
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *user_trackball;
+ Bool button_down_p;
+
+ GLuint *dlists;
+ GLfloat component_colors[countof(all_objs)][4];
+
+ int ncameras;
+ camera *cameras;
+ pedestrian *pedestrians;
+} camera_configuration;
+
+static camera_configuration *bps = NULL;
+
+static GLfloat speed_arg;
+#ifdef DEBUG
+static int debug_p;
+#endif
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+#ifdef DEBUG
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+ {"+debug", ".debug", XrmoptionNoArg, "False" },
+#endif
+};
+
+static argtype vars[] = {
+ {&speed_arg, "speed", "Speed", DEF_SPEED, t_Float},
+#ifdef DEBUG
+ {&debug_p, "debug", "Debug", "False", t_Bool},
+#endif
+};
+
+ENTRYPOINT ModeSpecOpt camera_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+ENTRYPOINT void
+reshape_camera (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 200);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0, 0, 30,
+ 0, 0, 0,
+ 0, 1, 0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+camera_handle_event (ModeInfo *mi, XEvent *event)
+{
+ camera_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->user_trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ int i;
+ if (bp->cameras[0].state == IDLE && bp->pedestrians)
+ for (i = 0; i < bp->ncameras; i++)
+ {
+ bp->cameras[i].state = WARM_UP;
+ bp->cameras[i].tick = 1.0;
+ }
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+static int draw_ground (ModeInfo *, GLfloat color[4]);
+
+static void
+parse_color (ModeInfo *mi, char *key, GLfloat color[4])
+{
+ XColor xcolor;
+ char *string = get_string_resource (mi->dpy, key, "CameraColor");
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ key, string);
+ exit (1);
+ }
+
+ color[0] = xcolor.red / 65536.0;
+ color[1] = xcolor.green / 65536.0;
+ color[2] = xcolor.blue / 65536.0;
+ color[3] = 1;
+}
+
+
+ENTRYPOINT void
+init_camera (ModeInfo *mi)
+{
+ camera_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_camera (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ bp->user_trackball = gltrackball_init (False);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+ char *key = 0;
+ GLfloat spec1[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat spec2[4] = {0.40, 0.40, 0.70, 1.0};
+ GLfloat *spec = spec1;
+ GLfloat shiny = 20;
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 0, 0, 1);
+ glScalef (6, 6, 6);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+
+ switch (i) {
+ case CAMERA_BODY: key = "bodyColor"; break;
+ case CAMERA_CAP: key = "capColor"; break;
+ case CAMERA_HINGE: key = "hingeColor"; break;
+ case CAMERA_MOUNT: key = "mountColor"; break;
+ case CAMERA_LENS: key = "lensColor"; spec = spec2; break;
+ case GROUND: key = "groundColor"; spec = spec2; shiny = 128; break;
+ default: abort(); break;
+ }
+
+ parse_color (mi, key, bp->component_colors[i]);
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+
+ switch (i) {
+ case GROUND:
+ if (! ground)
+ ground = (struct gllist *) calloc (1, sizeof(*ground));
+ ground->points = draw_ground (mi, bp->component_colors[i]);
+ break;
+ default:
+ renderList (gll, wire);
+ /* glColor3f (1, 1, 1); renderListNormals (gll, 100, True); */
+ /* glColor3f (1, 1, 0); renderListNormals (gll, 100, False); */
+ break;
+ }
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glEndList ();
+ }
+
+ bp->ncameras = MI_COUNT(mi);
+ if (bp->ncameras <= 0) bp->ncameras = 1;
+ bp->cameras = (camera *) calloc (bp->ncameras, sizeof (camera));
+
+ {
+ GLfloat range = (MI_COUNT(mi) <= 2) ? 4 : 5.5;
+ GLfloat extent;
+ GLfloat spacing = range / bp->ncameras;
+ if (spacing < 0.7) spacing = 0.7;
+ extent = spacing * (bp->ncameras - 1);
+ for (i = 0; i < bp->ncameras; i++)
+ {
+ camera *c = &bp->cameras[i];
+ c->state = IDLE;
+ c->pos.x = i*spacing - extent/2;
+ c->pos.z += 0.7;
+ if (spacing < 1.6)
+ c->pos.z = (i & 1 ? 1.1 : -0.3);
+ c->focus.x = c->pos.x;
+ c->focus.y = c->pos.y + 1;
+ c->focus.z = c->pos.z + BEAM_ZOFF;
+ c->pitch = -50;
+ }
+ }
+
+
+# ifdef DEBUG
+ if (!debug_p)
+# endif
+ /* Let's tilt the floor a little. */
+ gltrackball_reset (bp->user_trackball,
+ -0.70 + frand(1.58),
+ -0.30 + frand(0.40));
+}
+
+
+static XYZ
+normalize (XYZ p)
+{
+ GLfloat d = sqrt(p.x*p.x + p.y*p.y * p.z*p.z);
+ if (d < 0.0000001)
+ p.x = p.y = p.z = 0;
+ else
+ {
+ p.x /= d;
+ p.y /= d;
+ p.z /= d;
+ }
+
+ return p;
+}
+
+
+static GLfloat
+vector_angle (XYZ a, XYZ b)
+{
+ double La = sqrt (a.x*a.x + a.y*a.y + a.z*a.z);
+ double Lb = sqrt (b.x*b.x + b.y*b.y + b.z*b.z);
+ double cc, angle;
+
+ if (La == 0 || Lb == 0) return 0;
+ if (a.x == b.x && a.y == b.y && a.z == b.z) return 0;
+
+ /* dot product of two vectors is defined as:
+ La * Lb * cos(angle between vectors)
+ and is also defined as:
+ ax*bx + ay*by + az*bz
+ so:
+ La * Lb * cos(angle) = ax*bx + ay*by + az*bz
+ cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
+ angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
+ */
+ cc = (a.x*b.x + a.y*b.y + a.z*b.z) / (La * Lb);
+ if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
+ angle = acos (cc);
+
+ return (angle);
+}
+
+
+static int
+draw_component (ModeInfo *mi, int i, GLfloat color[4])
+{
+ camera_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (! color)
+ color = bp->component_colors[i];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glCallList (bp->dlists[i]);
+ return (*all_objs[i])->points / 3;
+}
+
+
+static int
+draw_double_component (ModeInfo *mi, int i)
+{
+ int count = draw_component (mi, i, 0);
+
+ glFrontFace(GL_CCW);
+ glScalef (1, 1, -1);
+ count += draw_component (mi, i, 0);
+ glScalef (1, 1, -1);
+ glFrontFace(GL_CW);
+ return count;
+}
+
+
+static int
+draw_ray (ModeInfo *mi, camera *c)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int count = 0;
+ GLfloat length = 10000;
+ GLfloat thickness = 0.08;
+ int i;
+
+ glPushMatrix();
+ glTranslatef (c->pos.x, c->pos.y, c->pos.z + BEAM_ZOFF);
+ glRotatef (-c->facing, 0, 0, 1);
+ glRotatef ( c->pitch, 1, 0, 0);
+ glRotatef (frand(90), 0, 1, 0);
+ glScalef (thickness, length, thickness);
+ glDisable (GL_LIGHTING);
+
+ for (i = 0; i < 5; i++)
+ {
+ glColor4f (1, 0, 0, 0.1 + (i * 0.18));
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (0, 0, -0.5); glVertex3f (0, 0, 0.5);
+ glVertex3f (0, 1, 0.5); glVertex3f (0, 1, -0.5);
+ glEnd();
+ count++;
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-0.5, 0, 0); glVertex3f ( 0.5, 0, 0);
+ glVertex3f ( 0.5, 1, 0); glVertex3f (-0.5, 1, 0);
+ glEnd();
+ count++;
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (0, 1, -0.5); glVertex3f (0, 1, 0.5);
+ glVertex3f (0, 0, 0.5); glVertex3f (0, 0, -0.5);
+ glEnd();
+ count++;
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-0.5, 1, 0); glVertex3f ( 0.5, 1, 0);
+ glVertex3f ( 0.5, 0, 0); glVertex3f (-0.5, 0, 0);
+ glEnd();
+ count++;
+ glScalef (0.7, 1, 0.7);
+ }
+ if (!MI_IS_WIREFRAME(mi))
+ glEnable (GL_LIGHTING);
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_camera_1 (ModeInfo *mi, camera *c)
+{
+ int count = 0;
+ GLfloat scale = 0.01;
+ GLfloat color[4] = { 1, 0, 0, 1 };
+ glPushMatrix();
+
+ glTranslatef (c->pos.x, c->pos.y, c->pos.z);
+ glScalef (scale, scale, scale);
+
+ glRotatef (90, 1, 0, 0);
+ glRotatef (-90, 0, 1, 0);
+
+ count += draw_double_component (mi, CAMERA_MOUNT);
+
+ glRotatef (-c->facing, 0, 1, 0);
+ glRotatef (-c->pitch, 0, 0, 1);
+
+ count += draw_double_component (mi, CAMERA_HINGE);
+
+ if (c->state == WARM_UP)
+ {
+ if (c->tick < 0.2)
+ glTranslatef ((0.2 - c->tick) / (scale * 3), 0, 0);
+ }
+
+ if (c->state == ZOT)
+ {
+ glTranslatef ((0.005 - frand(0.01)) / scale,
+ (0.005 - frand(0.01)) / scale,
+ (0.005 - frand(0.01)) / scale);
+ }
+
+ count += draw_double_component (mi, CAMERA_BODY);
+
+ if (c->state == ZOT)
+ {
+ glTranslatef ((0.005 - frand(0.01)) / scale,
+ (0.005 - frand(0.01)) / scale,
+ (0.005 - frand(0.01)) / scale);
+ }
+
+ count += draw_double_component (mi, CAMERA_CAP);
+
+ switch (c->state) {
+ case IDLE: break;
+ case WARM_UP: color[0] = 1.0 - c->tick; break;
+ case ZOT: color[0] = 1.0; break;
+ case COOL_DOWN: color[0] = c->tick; break;
+ default: abort(); break;
+ }
+
+ count += draw_component (mi, CAMERA_LENS,
+ (c->state == IDLE ? 0 : color));
+
+# ifdef DEBUG
+ if (debug_p && c->state != ZOT)
+ {
+ glDisable (GL_LIGHTING);
+ glColor3f (1, 1, 0);
+ glBegin (GL_LINES);
+ glVertex3f (0, BEAM_ZOFF / scale, 0);
+ glVertex3f (-100 / scale, BEAM_ZOFF / scale, 0);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi))
+ glEnable (GL_LIGHTING);
+ }
+# endif
+
+ glPopMatrix();
+
+ return count;
+}
+
+
+/* The position this pedestrian would appear at during the given ratio
+ through its life cycle.
+ */
+static XYZ
+pedestrian_position (pedestrian *p, GLfloat ratio)
+{
+ XYZ pos = p->pos;
+ if (p->speed < 0)
+ ratio = 1-ratio;
+ pos.x += p->length * ratio;
+ pos.z += sin (M_PI * ratio * p->frequency * 2) * p->amplitude
+ + p->amplitude/2;
+ return pos;
+}
+
+
+static int
+draw_pedestrian (ModeInfo *mi, pedestrian *p)
+{
+ int count = 0;
+# ifdef DEBUG
+ if (debug_p)
+ {
+ GLfloat r;
+ GLfloat step = 0.001;
+ glDisable (GL_LIGHTING);
+ glColor3f (0, 0, 1);
+
+ glBegin (GL_LINE_STRIP);
+ glVertex3f (p->pos.x, p->pos.y, p->pos.z + p->amplitude);
+ glVertex3f (p->pos.x, p->pos.y, 0);
+ glVertex3f (p->pos.x + p->length, p->pos.y, 0);
+ glVertex3f (p->pos.x + p->length, p->pos.y, p->pos.z + p->amplitude);
+ glEnd();
+
+ glBegin (GL_LINE_STRIP);
+ for (r = 0; r <= 1; r += step)
+ {
+ XYZ pos = pedestrian_position (p, r);
+ glVertex3f (pos.x, pos.y, pos.z);
+ count++;
+ if (p->ratio >= r && p->ratio < r + step)
+ {
+ glVertex3f (pos.x, pos.y, pos.z - p->amplitude);
+ glVertex3f (pos.x, pos.y, pos.z + p->amplitude);
+ glVertex3f (pos.x, pos.y, pos.z);
+ count++;
+ }
+ }
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi))
+ glEnable (GL_LIGHTING);
+ }
+# endif
+ return count;
+}
+
+
+/* Start someone walking through the scene.
+ */
+static void
+add_pedestrian (ModeInfo *mi)
+{
+ camera_configuration *bp = &bps[MI_SCREEN(mi)];
+ pedestrian *p = (pedestrian *) calloc (1, sizeof(*p));
+ static int id = 100;
+ p->id = id++;
+ p->length = 35;
+ p->ratio = 0;
+ p->pos.x = -p->length/2;
+ p->pos.y = 3 + frand(10);
+ p->pos.z = -1.5 + frand(4) + ((random() % 10) ? 0 : frand(8));
+ p->frequency = 4 + frand(4);
+ p->amplitude = 0.1 + ((random() % 10) ? BELLRAND(0.45) : BELLRAND(1.5));
+ p->ratio = 0;
+ p->speed = ((4 + frand(4) + ((random() % 10) ? 0 : frand(10)))
+ * (random() & 1 ? 1 : -1)
+ * speed_arg);
+
+ if (bp->pedestrians)
+ {
+ pedestrian *p2; /* add it to the end */
+ for (p2 = bp->pedestrians; p2->next; p2 = p2->next)
+ ;
+ p2->next = p;
+ }
+ else
+ {
+ p->next = bp->pedestrians;
+ bp->pedestrians = p;
+ }
+}
+
+
+static void
+free_pedestrian (ModeInfo *mi, pedestrian *p)
+{
+ camera_configuration *bp = &bps[MI_SCREEN(mi)];
+ Bool ok = False;
+ if (!p) abort();
+ if (p == bp->pedestrians)
+ {
+ bp->pedestrians = p->next;
+ ok = True;
+ }
+ else
+ {
+ pedestrian *p0;
+ for (p0 = bp->pedestrians; p0; p0 = p0->next)
+ if (p0->next == p)
+ {
+ p0->next = p0->next ? p0->next->next : 0;
+ ok = True;
+ break;
+ }
+ }
+ if (!ok) abort();
+ p->next = 0;
+ free (p);
+}
+
+
+static void
+tick_pedestrian (ModeInfo *mi, pedestrian *p)
+{
+ p->ratio += 0.001 * (p->speed > 0 ? p->speed : -p->speed);
+ if (p->ratio >= 1)
+ free_pedestrian (mi, p);
+}
+
+
+/* Extract the position of the thing this camera would like to look at.
+ */
+static void
+set_camera_focus (ModeInfo *mi, camera *c)
+{
+ camera_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (c->focus_id > 0) /* Look at pedestrian with id N */
+ {
+ long id = c->focus_id;
+ pedestrian *p;
+ for (p = bp->pedestrians; p; p = p->next)
+ if (p->id == id)
+ break;
+ if (p)
+ c->focus = pedestrian_position (p, p->ratio);
+ else
+ c->focus_id = 0; /* that pedestrian has escaped */
+ }
+ else if (c->focus_id < 0) /* Look at camera -N-1 */
+ {
+ long n = -c->focus_id - 1;
+ if (bp->ncameras > n)
+ c->focus = bp->cameras[n].pos;
+ }
+}
+
+
+static void
+tick_camera (ModeInfo *mi, camera *c)
+{
+ camera_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ GLfloat X, Y, Z;
+ set_camera_focus (mi, c);
+
+ X = c->focus.x - c->pos.x;
+ Y = c->focus.y - c->pos.y;
+ Z = c->focus.z - c->pos.z - BEAM_ZOFF;
+
+ if (X != 0 || Y != 0)
+ {
+ GLfloat ofacing = c->facing;
+ GLfloat opitch = c->pitch;
+
+ GLfloat target_facing = atan2 (X, Y) * (180 / M_PI);
+ GLfloat target_pitch = atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI);
+
+ /* Adjust the current velocity.
+ If we are nearing the target, slow down (but don't stop).
+ Otherwise, speed up (but don't break the speed limit).
+ */
+ {
+ GLfloat accel = 0.5 * speed_arg;
+ GLfloat decel_range = 20;
+ GLfloat max_velocity = 5 * speed_arg;
+ GLfloat close_enough = 0.5 * speed_arg;
+
+ GLfloat dx = target_facing - c->facing;
+ GLfloat dy = target_pitch - c->pitch;
+ GLfloat angular_distance = sqrt (dx*dx + dy*dy);
+
+ /* Split the velocity into vx and vy components. This isn't
+ quite right since this treats them as Cartesian rather than
+ polar, but it's close enough.
+ */
+ GLfloat r = (dx == 0) ? 1 : ABS(dy) / ABS(dx);
+ GLfloat vx = 1-r;
+ GLfloat vy = r;
+
+ if (angular_distance < decel_range) /* Nearing target, slow down */
+ {
+ c->velocity -= accel;
+ if (c->velocity <= 0)
+ c->velocity = accel;
+ }
+ else
+ {
+ c->velocity += accel;
+ if (c->velocity > max_velocity)
+ c->velocity = max_velocity;
+ }
+
+ /* Don't overshoot */
+ if (vx > ABS(dx)) vx = ABS(dx);
+ if (vy > ABS(dy)) vy = ABS(dy);
+
+
+ /* Rotate toward target by current angular velocity. */
+ c->facing += vx * c->velocity * (target_facing > c->facing ? 1 : -1);
+ c->pitch += vy * c->velocity * (target_pitch > c->pitch ? 1 : -1);
+
+ /* If we are pointed *really close* to the target, just lock on,
+ to avoid twitchy overshoot rounding errors.
+ */
+ if (angular_distance < close_enough)
+ {
+ c->facing = target_facing;
+ c->pitch = target_pitch;
+ }
+
+ /* Constrain to hinge's range of motion */
+ c->facing = MAX (-90, MIN (90, c->facing));
+ c->pitch = MAX (-90, MIN (55, c->pitch));
+
+ /* After this motion, our prevailing velocity (for next time)
+ is the angular distance we actually moved.
+ */
+ dx = c->facing - ofacing;
+ dy = c->pitch - opitch;
+ c->velocity = sqrt (dx*dx + dy*dy);
+ }
+ }
+
+# ifdef DEBUG
+ if (debug_p && 1)
+ /* Mark the point on which this camera is focusing. */
+ {
+ glPushMatrix();
+ glDisable (GL_LIGHTING);
+ glColor3f(0.3, 0.3, 0.3);
+ glBegin (GL_LINES);
+ glVertex3f (c->pos.x, c->pos.y, c->pos.z + BEAM_ZOFF);
+ glVertex3f (c->focus.x, c->focus.y, c->focus.z);
+ glEnd();
+ glColor3f(1,1,1);
+ glBegin (GL_LINES);
+ glVertex3f (c->focus.x-0.25, c->focus.y, c->focus.z);
+ glVertex3f (c->focus.x+0.25, c->focus.y, c->focus.z);
+ glVertex3f (c->focus.x, c->focus.y-0.25, c->focus.z);
+ glVertex3f (c->focus.x, c->focus.y+0.25, c->focus.z);
+ glVertex3f (c->focus.x, c->focus.y, c->focus.z-0.25);
+ glVertex3f (c->focus.x, c->focus.y, c->focus.z+0.25);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi))
+ glEnable (GL_LIGHTING);
+ glPopMatrix();
+ }
+# endif
+
+ /* If this camera is looking at another camera, get shy and look away
+ if the target sees us looking.
+ */
+ if (c->focus_id < 0)
+ {
+ camera *c2 = &bp->cameras[-1 - c->focus_id];
+ XYZ a, b;
+ GLfloat aa = c->facing / (180 / M_PI);
+ GLfloat bb = c->pitch / (180 / M_PI);
+ GLfloat angle;
+
+ a.y = cos(aa)* cos(bb);
+ a.x = sin(aa)* cos(bb);
+ a.z = sin(bb);
+
+ aa = c2->facing / (180 / M_PI);
+ bb = c2->pitch / (180 / M_PI);
+ b.y = cos(aa)* cos(bb);
+ b.x = sin(aa)* cos(bb);
+ b.z = sin(bb);
+
+ angle = vector_angle (normalize(a), normalize(b)) * (180 / M_PI);
+
+ if (angle > 100)
+ {
+ c->focus_id = 0;
+ /* Look "away" which means in the same direction. */
+ c->focus.x = c->pos.x + (c2->focus.x - c2->pos.x);
+ c->focus.y = c->pos.y + (c2->focus.y - c2->pos.y);
+ c->focus.z = c->pos.z + (c2->focus.z - c2->pos.z);
+ /* Look at either the sky or the ground.*/
+ c->focus.z = c->focus.x * (random() & 1 ? 1 : -1) * 5;
+ c->velocity = c2->velocity * 3;
+ }
+ }
+
+
+ /* Randomly pick some other things to look at.
+ */
+
+ if (c->state == IDLE &&
+ (c->focus_id <= 0
+ ? !(random() % (int) MAX (1, (50 / speed_arg)))
+ : !(random() % (int) MAX (1, (1000 / speed_arg)))))
+ {
+
+ /* Shiny! Start paying attention to something else. */
+
+ if ((bp->ncameras > 1 && !(random() % 20))) /* look at a camera */
+ {
+ int which = random() % 4;
+ long i;
+ for (i = 0; i < bp->ncameras; i++)
+ if (c == &bp->cameras[i])
+ break;
+
+ /* Look at cameras 1 or 2 away in each direction, but not farther.
+ Since we arrange them in 2 staggered lines, those are the only
+ four that are in line of sight.
+ */
+ if (i >= 2 && which == 0)
+ which = i-2;
+ else if (i >= 1 && which == 1)
+ which = i-1;
+ else if (i < bp->ncameras-2 && which == 2)
+ which = i+2;
+ else if (i == bp->ncameras-1)
+ which = i-1;
+ else /* (i < bp->ncameras-2 && which == 3) */
+ which = i+1;
+
+ c->focus_id = -1 - which;
+ }
+ else /* look at a pedestrian */
+ {
+ int n = 0;
+ pedestrian *p;
+ for (p = bp->pedestrians; p; p = p->next)
+ n++;
+ if (n > 0)
+ {
+ n = random() % n;
+ p = bp->pedestrians;
+ while (n > 0 && p)
+ p = p->next;
+ if (p)
+ c->focus_id = p->id;
+ }
+ }
+ }
+
+ /* Run the animation */
+
+ if (c->state != IDLE)
+ {
+ pedestrian *p = bp->pedestrians; /* first one */
+ if (p) c->focus_id = p->id;
+
+ switch (c->state) {
+ case WARM_UP: c->tick -= 0.01 * speed_arg; break;
+ case ZOT: c->tick -= 0.006 * speed_arg;
+ if (p) p->speed *= 0.995; /* target takes 1d6 HP damage */
+ break;
+ case COOL_DOWN: c->tick -= 0.02 * speed_arg; break;
+ default: abort(); break;
+ }
+
+ if (c->tick <= 0)
+ {
+ c->tick = 1.0;
+ switch (c->state) {
+ case WARM_UP: c->state = ZOT; break;
+ case ZOT: c->state = COOL_DOWN;
+ c->focus_id = 0;
+ if (p) p->ratio = 1.0; /* threat eliminated */
+ break;
+ case COOL_DOWN: c->state = IDLE; break;
+ default: abort(); break;
+ }
+ }
+ }
+
+ if (bp->cameras[0].state == IDLE &&
+ bp->pedestrians &&
+ bp->pedestrians[0].ratio < 0.3 &&
+ !(random() % MAX (1, (int) (50000 / speed_arg))))
+ {
+ /* CASE NIGHTMARE RED detected, engage SCORPION STARE by authority
+ of MAGINOT BLUE STARS. */
+ int i;
+ for (i = 0; i < bp->ncameras; i++)
+ {
+ bp->cameras[i].state = WARM_UP;
+ bp->cameras[i].tick = 1.0;
+ }
+ }
+}
+
+
+static int
+draw_ground (ModeInfo *mi, GLfloat color[4])
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat i, j, k, h;
+
+ /* When using fog, iOS apparently doesn't like lines or quads that are
+ really long, and extend very far outside of the scene. Maybe? If the
+ length of the line (cells * cell_size) is greater than 25 or so, lines
+ that are oriented steeply away from the viewer tend to disappear
+ (whether implemented as GL_LINES or as GL_QUADS).
+
+ So we do a bunch of smaller grids instead of one big one.
+ */
+ int cells = 20;
+ GLfloat cell_size = 0.4;
+ int points = 0;
+ int gridsw = 10;
+ int gridsh = 2;
+
+ glPushMatrix();
+
+ if (!wire)
+ {
+ GLfloat fog_color[4] = { 0, 0, 0, 1 };
+
+ glLineWidth (2);
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+
+ glFogi (GL_FOG_MODE, GL_EXP2);
+ glFogfv (GL_FOG_COLOR, fog_color);
+ glFogf (GL_FOG_DENSITY, 0.017);
+ glFogf (GL_FOG_START, -cells/2 * cell_size * gridsh);
+ glEnable (GL_FOG);
+ }
+
+ glColor4fv (color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+
+ glTranslatef (-cells * gridsw * cell_size / 2, 0, 0);
+ for (h = 0; h < 2; h++)
+ {
+ glPushMatrix();
+ glTranslatef (0, cells * cell_size / 2, 0);
+ for (j = 0; j < gridsh; j++)
+ {
+ glPushMatrix();
+ for (k = 0; k < gridsw; k++)
+ {
+ glBegin (GL_LINES);
+ for (i = -cells/2; i < cells/2; i++)
+ {
+ GLfloat a = i * cell_size;
+ GLfloat b = cells/2 * cell_size;
+ glVertex3f (a, -b, 0); glVertex3f (a, b, 0); points++;
+ glVertex3f (-b, a, 0); glVertex3f (b, a, 0); points++;
+ }
+ glEnd();
+ glTranslatef (cells * cell_size, 0, 0);
+ }
+ glPopMatrix();
+ glTranslatef (0, cells * cell_size, 0);
+ }
+ glPopMatrix();
+ glRotatef (90, 1, 0, 0);
+ }
+
+ if (!wire)
+ glDisable (GL_LINE_SMOOTH);
+
+ glPopMatrix();
+
+ return points;
+}
+
+
+ENTRYPOINT void
+draw_camera (ModeInfo *mi)
+{
+ camera_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GLfloat camera_size;
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+# ifdef HAVE_MOBILE
+ glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
+# endif
+
+ gltrackball_rotate (bp->user_trackball);
+
+# ifdef HAVE_MOBILE
+ {
+ GLfloat s = 0.6;
+ glScalef (s, s, s);
+ }
+# endif
+
+# ifdef DEBUG
+ if (debug_p)
+ {
+ GLfloat s = 0.2;
+ glScalef (s, s, s);
+ glRotatef (30, 0, 1, 0);
+ glRotatef (15, 1, 0, 0);
+ glTranslatef (0, 0, -80);
+ }
+# endif
+
+ mi->polygon_count = 0;
+
+ camera_size = 5;
+
+ if (MI_COUNT(mi) <= 2) /* re-frame the scene a little bit */
+ glTranslatef (0, -1, 7);
+ if (MI_COUNT(mi) >= 20)
+ glTranslatef (0, -1.5, -5);
+ if (MI_COUNT(mi) >= 40)
+ glTranslatef (0, 2, -15);
+
+ glScalef (camera_size, camera_size, camera_size);
+
+ /* +Z is toward sky; +X is toward the right along the back wall;
+ +Y is toward the viewer. */
+ glRotatef (-90, 1, 0, 0);
+ glScalef (1, -1, 1);
+
+ glPushMatrix();
+ glScalef (1/camera_size, 1/camera_size, 1/camera_size);
+ glTranslatef (0, -2.38, -8); /* Move the ground down and back */
+ glCallList (bp->dlists[GROUND]);
+ mi->polygon_count += ground->points;
+
+ glPopMatrix();
+
+ {
+ pedestrian *p, *p2;
+ for (p = bp->pedestrians, p2 = p ? p->next : 0;
+ p;
+ p = p2, p2 = p2 ? p2->next : 0)
+ {
+ mi->polygon_count += draw_pedestrian (mi, p);
+ tick_pedestrian (mi, p); /* might free p */
+ }
+
+ if (!bp->pedestrians || !(random() % MAX (1, (int) (200 / speed_arg))))
+ add_pedestrian (mi);
+ }
+
+ for (i = 0; i < bp->ncameras; i++)
+ {
+ camera *c = &bp->cameras[i];
+ mi->polygon_count += draw_camera_1 (mi, c);
+ tick_camera (mi, c);
+ }
+
+ for (i = 0; i < bp->ncameras; i++)
+ {
+ camera *c = &bp->cameras[i];
+ if (c->state == ZOT) /* Do this last, for alpha blending */
+ mi->polygon_count += draw_ray (mi, c);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("Vigilance", vigilance, camera)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/vigilance.man b/hacks/glx/vigilance.man
new file mode 100644
index 0000000..306950d
--- /dev/null
+++ b/hacks/glx/vigilance.man
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+vigilance - screen saver.
+.SH SYNOPSIS
+.B vigilance
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+.SH DESCRIPTION
+A set of security cameras keep very careful track of their surroundings.
+You can trust them. Everything is completely under control.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Number of cameras. 1 - 50. Default: 5.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2017 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/voronoi.c b/hacks/glx/voronoi.c
new file mode 100644
index 0000000..895f967
--- /dev/null
+++ b/hacks/glx/voronoi.c
@@ -0,0 +1,543 @@
+/* voronoi, Copyright (c) 2007-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_voronoi 0
+# define release_voronoi 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+
+#include "xlockmore.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_POINTS "25"
+#define DEF_POINT_SIZE "9"
+#define DEF_POINT_SPEED "1.0"
+#define DEF_POINT_DELAY "0.05"
+#define DEF_ZOOM_SPEED "1.0"
+#define DEF_ZOOM_DELAY "15"
+
+typedef struct node {
+ GLfloat x, y;
+ GLfloat dx, dy;
+ GLfloat ddx, ddy;
+ struct node *next;
+ GLfloat color[4], color2[4];
+ int rot;
+} node;
+
+typedef struct {
+ GLXContext *glx_context;
+ node *nodes;
+ int nnodes;
+ node *dragging;
+ int ncolors;
+ XColor *colors;
+ int point_size;
+
+ enum { MODE_WAITING, MODE_ADDING, MODE_ZOOMING } mode;
+ int adding;
+ double last_time;
+
+ GLfloat zooming; /* 1.0 starting zoom, 0.0 no longer zooming. */
+ GLfloat zoom_toward[2];
+
+} voronoi_configuration;
+
+static voronoi_configuration *vps = NULL;
+
+/* command line arguments */
+static int npoints;
+static GLfloat point_size, point_speed, point_delay;
+static GLfloat zoom_speed, zoom_delay;
+
+static XrmOptionDescRec opts[] = {
+ { "-points", ".points", XrmoptionSepArg, 0 },
+ { "-point-size", ".pointSize", XrmoptionSepArg, 0 },
+ { "-point-speed", ".pointSpeed", XrmoptionSepArg, 0 },
+ { "-point-delay", ".pointDelay", XrmoptionSepArg, 0 },
+ { "-zoom-speed", ".zoomSpeed", XrmoptionSepArg, 0 },
+ { "-zoom-delay", ".zoomDelay", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&npoints, "points", "Points", DEF_POINTS, t_Int},
+ {&point_size, "pointSize", "PointSize", DEF_POINT_SIZE, t_Float},
+ {&point_speed, "pointSpeed", "PointSpeed", DEF_POINT_SPEED, t_Float},
+ {&point_delay, "pointDelay", "PointDelay", DEF_POINT_DELAY, t_Float},
+ {&zoom_speed, "zoomSpeed", "ZoomSpeed", DEF_ZOOM_SPEED, t_Float},
+ {&zoom_delay, "zoomDelay", "ZoomDelay", DEF_ZOOM_DELAY, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt voronoi_opts =
+ {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static node *
+add_node (voronoi_configuration *vp, GLfloat x, GLfloat y)
+{
+ node *nn = (node *) calloc (1, sizeof (*nn));
+ int i;
+ nn->x = x;
+ nn->y = y;
+
+ i = random() % vp->ncolors;
+ nn->color[0] = vp->colors[i].red / 65536.0;
+ nn->color[1] = vp->colors[i].green / 65536.0;
+ nn->color[2] = vp->colors[i].blue / 65536.0;
+ nn->color[3] = 1.0;
+
+ nn->color2[0] = nn->color[0] * 0.7;
+ nn->color2[1] = nn->color[1] * 0.7;
+ nn->color2[2] = nn->color[2] * 0.7;
+ nn->color2[3] = 1.0;
+
+ nn->ddx = frand (0.000001 * point_speed) * (random() & 1 ? 1 : -1);
+ nn->ddy = frand (0.000001 * point_speed) * (random() & 1 ? 1 : -1);
+
+ nn->rot = (random() % 360) * (random() & 1 ? 1 : -1);
+
+ nn->next = vp->nodes;
+ vp->nodes = nn;
+ vp->nnodes++;
+ return nn;
+}
+
+
+static int
+cone (void)
+{
+ int i;
+ int faces = 64;
+ GLfloat step = M_PI * 2 / faces;
+ GLfloat th = 0;
+ GLfloat x = 1;
+ GLfloat y = 0;
+
+ glBegin(GL_TRIANGLE_FAN);
+ glVertex3f (0, 0, 1);
+ for (i = 0; i < faces; i++)
+ {
+ glVertex3f (x, y, 0);
+ th += step;
+ x = cos (th);
+ y = sin (th);
+ }
+ glVertex3f (1, 0, 0);
+ glEnd();
+ return faces;
+}
+
+
+static void
+move_points (voronoi_configuration *vp)
+{
+ node *nn;
+ for (nn = vp->nodes; nn; nn = nn->next)
+ {
+ if (nn == vp->dragging) continue;
+ nn->x += nn->dx;
+ nn->y += nn->dy;
+
+ if (vp->mode == MODE_WAITING)
+ {
+ nn->dx += nn->ddx;
+ nn->dy += nn->ddy;
+ }
+ }
+}
+
+
+static void
+prune_points (voronoi_configuration *vp)
+{
+ node *nn;
+ node *prev = 0;
+ int lim = 5;
+
+ for (nn = vp->nodes; nn; prev = nn, nn = (nn ? nn->next : 0))
+ if (nn->x < -lim || nn->x > lim ||
+ nn->y < -lim || nn->y > lim)
+ {
+ if (prev)
+ prev->next = nn->next;
+ else
+ vp->nodes = nn->next;
+ free (nn);
+ vp->nnodes--;
+ nn = prev;
+ }
+}
+
+
+static void
+zoom_points (voronoi_configuration *vp)
+{
+ node *nn;
+
+ GLfloat tick = sin (vp->zooming * M_PI);
+ GLfloat scale = 1 + (tick * 0.02 * zoom_speed);
+
+ vp->zooming -= (0.01 * zoom_speed);
+ if (vp->zooming < 0) vp->zooming = 0;
+
+ if (vp->zooming <= 0) return;
+
+ if (scale < 1) scale = 1;
+
+ for (nn = vp->nodes; nn; nn = nn->next)
+ {
+ GLfloat x = nn->x - vp->zoom_toward[0];
+ GLfloat y = nn->y - vp->zoom_toward[1];
+ x *= scale;
+ y *= scale;
+ nn->x = x + vp->zoom_toward[0];
+ nn->y = y + vp->zoom_toward[1];
+ }
+}
+
+
+
+static void
+draw_cells (ModeInfo *mi)
+{
+ voronoi_configuration *vp = &vps[MI_SCREEN(mi)];
+ node *nn;
+ int lim = 5;
+
+ for (nn = vp->nodes; nn; nn = nn->next)
+ {
+ if (nn->x < -lim || nn->x > lim ||
+ nn->y < -lim || nn->y > lim)
+ continue;
+
+ glPushMatrix();
+ glTranslatef (nn->x, nn->y, 0);
+ glScalef (lim*2, lim*2, 1);
+ glColor4fv (nn->color);
+ mi->polygon_count += cone ();
+ glPopMatrix();
+ }
+
+ glClear (GL_DEPTH_BUFFER_BIT);
+
+ if (vp->point_size <= 0)
+ ;
+ else if (vp->point_size < 3)
+ {
+ glPointSize (vp->point_size);
+ for (nn = vp->nodes; nn; nn = nn->next)
+ {
+ glBegin (GL_POINTS);
+ glColor4fv (nn->color2);
+ glVertex2f (nn->x, nn->y);
+ glEnd();
+ mi->polygon_count++;
+ }
+ }
+ else
+ {
+ for (nn = vp->nodes; nn; nn = nn->next)
+ {
+ int w = MI_WIDTH (mi);
+ int h = MI_HEIGHT (mi);
+ int s = vp->point_size;
+ int i;
+
+ glColor4fv (nn->color2);
+ glPushMatrix();
+ glTranslatef (nn->x, nn->y, 0);
+ glScalef (1.0 / w * s, 1.0 / h * s, 1);
+
+ glLineWidth (vp->point_size / 10);
+ nn->rot += (nn->rot < 0 ? -1 : 1);
+ glRotatef (nn->rot, 0, 0, 1);
+
+ glRotatef (180, 0, 0, 1);
+ for (i = 0; i < 5; i++)
+ {
+ glBegin (GL_TRIANGLES);
+ glVertex2f (0, 1);
+ glVertex2f (-0.2, 0);
+ glVertex2f ( 0.2, 0);
+ glEnd ();
+ glRotatef (360.0/5, 0, 0, 1);
+ mi->polygon_count++;
+ }
+ glPopMatrix();
+ }
+ }
+
+#if 0
+ glPushMatrix();
+ glColor3f(1,1,1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0,0,0);
+ glVertex3f(1,0,0);
+ glVertex3f(1,1,0);
+ glVertex3f(0,1,0);
+ glEnd();
+ glScalef(0.25, 0.25, 1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0,0,0);
+ glVertex3f(1,0,0);
+ glVertex3f(1,1,0);
+ glVertex3f(0,1,0);
+ glEnd();
+ glPopMatrix();
+#endif
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_voronoi (ModeInfo *mi, int width, int height)
+{
+/* voronoi_configuration *vp = &vps[MI_SCREEN(mi)];*/
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho (0, 1, 1, 0, -1, 1);
+
+# ifdef HAVE_MOBILE /* So much WTF */
+ {
+ int rot = current_device_rotation();
+
+ glTranslatef (0.5, 0.5, 0);
+ // glScalef(0.19, 0.19, 0.19);
+
+ if (rot == 180 || rot == -180) {
+ glTranslatef (1, 1, 0);
+ } else if (rot == 90 || rot == -270) {
+ glRotatef (180, 0, 0, 1);
+ glTranslatef (0, 1, 0);
+ } else if (rot == -90 || rot == 270) {
+ glRotatef (180, 0, 0, 1);
+ glTranslatef (1, 0, 0);
+ }
+
+ glTranslatef(-0.5, -0.5, 0);
+ }
+# endif
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static node *
+find_node (ModeInfo *mi, GLfloat x, GLfloat y)
+{
+ voronoi_configuration *vp = &vps[MI_SCREEN(mi)];
+ int ps = (vp->point_size < 5 ? 5 : vp->point_size);
+ GLfloat hysteresis = (1.0 / MI_WIDTH (mi)) * ps;
+ node *nn;
+ for (nn = vp->nodes; nn; nn = nn->next)
+ if (nn->x > x - hysteresis && nn->x < x + hysteresis &&
+ nn->y > y - hysteresis && nn->y < y + hysteresis)
+ return nn;
+ return 0;
+}
+
+
+ENTRYPOINT Bool
+voronoi_handle_event (ModeInfo *mi, XEvent *event)
+{
+ voronoi_configuration *vp = &vps[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress)
+ {
+ GLfloat x = (GLfloat) event->xbutton.x / MI_WIDTH (mi);
+ GLfloat y = (GLfloat) event->xbutton.y / MI_HEIGHT (mi);
+ node *nn = find_node (mi, x, y);
+ if (!nn)
+ nn = add_node (vp, x, y);
+ vp->dragging = nn;
+
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease && vp->dragging)
+ {
+ vp->dragging = 0;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && vp->dragging)
+ {
+ vp->dragging->x = (GLfloat) event->xmotion.x / MI_WIDTH (mi);
+ vp->dragging->y = (GLfloat) event->xmotion.y / MI_HEIGHT (mi);
+ return True;
+ }
+
+ return False;
+}
+
+static void
+state_change (ModeInfo *mi)
+{
+ voronoi_configuration *vp = &vps[MI_SCREEN(mi)];
+ double now = double_time();
+
+ if (vp->dragging)
+ {
+ vp->last_time = now;
+ vp->adding = 0;
+ vp->zooming = 0;
+ return;
+ }
+
+ switch (vp->mode)
+ {
+ case MODE_WAITING:
+ if (vp->last_time + zoom_delay <= now)
+ {
+ node *tn = vp->nodes;
+ vp->zoom_toward[0] = (tn ? tn->x : 0.5);
+ vp->zoom_toward[1] = (tn ? tn->y : 0.5);
+
+ vp->mode = MODE_ZOOMING;
+ vp->zooming = 1;
+
+ vp->last_time = now;
+ }
+ break;
+
+ case MODE_ADDING:
+ if (vp->last_time + point_delay <= now)
+ {
+ add_node (vp,
+ BELLRAND(0.5) + 0.25,
+ BELLRAND(0.5) + 0.25);
+ vp->last_time = now;
+ vp->adding--;
+ if (vp->adding <= 0)
+ {
+ vp->adding = 0;
+ vp->mode = MODE_WAITING;
+ vp->last_time = now;
+ }
+ }
+ break;
+
+ case MODE_ZOOMING:
+ {
+ zoom_points (vp);
+ if (vp->zooming <= 0)
+ {
+ vp->mode = MODE_ADDING;
+ vp->adding = npoints;
+ vp->last_time = now;
+ }
+ }
+ break;
+
+ default:
+ abort();
+ }
+}
+
+
+ENTRYPOINT void
+init_voronoi (ModeInfo *mi)
+{
+ voronoi_configuration *vp;
+
+ MI_INIT (mi, vps);
+
+ vp = &vps[MI_SCREEN(mi)];
+
+ vp->glx_context = init_GL(mi);
+
+ vp->point_size = point_size;
+ if (vp->point_size < 0) vp->point_size = 10;
+
+ if (MI_WIDTH(mi) > 2560) vp->point_size *= 2; /* Retina displays */
+
+ vp->ncolors = 128;
+ vp->colors = (XColor *) calloc (vp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ vp->colors, &vp->ncolors,
+ False, False, False);
+
+ reshape_voronoi (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ vp->mode = MODE_ADDING;
+ vp->adding = npoints * 2;
+ vp->last_time = 0;
+}
+
+
+ENTRYPOINT void
+draw_voronoi (ModeInfo *mi)
+{
+ voronoi_configuration *vp = &vps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!vp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(vp->glx_context));
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_POINT_SMOOTH);
+/* glEnable(GL_LINE_SMOOTH);*/
+/* glEnable(GL_POLYGON_SMOOTH);*/
+
+ glEnable (GL_DEPTH_TEST);
+ glDepthFunc (GL_LEQUAL);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+ draw_cells (mi);
+ move_points (vp);
+ prune_points (vp);
+ state_change (mi);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Voronoi", voronoi)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/voronoi.man b/hacks/glx/voronoi.man
new file mode 100644
index 0000000..713f08c
--- /dev/null
+++ b/hacks/glx/voronoi.man
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+voronoi - draws a randomly-colored Voronoi tessellation
+.SH SYNOPSIS
+.B voronoi
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-points \fIint\fP]
+[\-point\-size \fIint\fP]
+[\-point\-speed \fIratio\fP]
+[\-point\-delay \fIseconds\fP]
+[\-zoom\-speed \fIratio\fP]
+[\-zoom\-delay \fIseconds\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a randomly-colored Voronoi tessellation, and periodically zooms
+in and adds new points. The existing points also wander around.
+
+There are a set of control points on the plane, each at the center of
+a colored cell. Every pixel within that cell is closer to that cell's
+control point than to any other control point. That is what
+determines the cell's shapes.
+
+When running in a window, you can click to insert a new point at
+the mouse position. Clicking on an existing point lets you drag
+it around.
+
+This implementation takes advantage of the OpenGL depth buffer to
+compute the cells for us, by rendering the intersection of overlapping
+cones in an orthographic plane.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-points \fIint\fP
+How many points to add each time we zoom in.
+.TP 8
+.B \-point\-size \fIint\fP
+How big to draw the stars, in pixels. 0 for no stars.
+.TP 8
+.B \-point\-speed \fIratio\fP
+How fast the points should wander.
+Less than 1 for slower, greater than 1 for faster.
+.TP 8
+.B \-point\-delay \fIseconds\fP
+How quickly to insert new points, when adding.
+.TP 8
+.B \-zoom\-speed \fIratio\fP
+How fast to zoom in.
+Less than 1 for slower, greater than 1 for faster.
+.TP 8
+.B \-zoom\-delay \fIseconds\fP
+Zoom in every this-many seconds.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/vrml2gl.pl b/hacks/glx/vrml2gl.pl
new file mode 100755
index 0000000..f0f42ba
--- /dev/null
+++ b/hacks/glx/vrml2gl.pl
@@ -0,0 +1,361 @@
+#!/usr/bin/perl -w
+# Copyright © 2003-2011 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Reads a VRML WRL file, and emits C data suitable for use with OpenGL's
+# glInterleavedArrays() and glDrawArrays() routines.
+#
+# Face normals are computed.
+#
+# Options:
+#
+# --normalize Compute the bounding box of the object, and scale all
+# coordinates so that the object fits inside a unit cube.
+#
+# Created: 8-Mar-2003 for Wavefront OBJ, converted to VRML 27-Sep-2011.
+
+require 5;
+use diagnostics;
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.2 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+
+# convert a vector to a unit vector
+sub normalize($$$) {
+ my ($x, $y, $z) = @_;
+ my $L = sqrt (($x * $x) + ($y * $y) + ($z * $z));
+ if ($L != 0) {
+ $x /= $L;
+ $y /= $L;
+ $z /= $L;
+ } else {
+ $x = $y = $z = 0;
+ }
+ return ($x, $y, $z);
+}
+
+
+# Calculate the unit normal at p0 given two other points p1,p2 on the
+# surface. The normal points in the direction of p1 crossproduct p2.
+#
+sub face_normal($$$$$$$$$) {
+ my ($p0x, $p0y, $p0z,
+ $p1x, $p1y, $p1z,
+ $p2x, $p2y, $p2z) = @_;
+
+ my ($nx, $ny, $nz);
+ my ($pax, $pay, $paz);
+ my ($pbx, $pby, $pbz);
+
+ $pax = $p1x - $p0x;
+ $pay = $p1y - $p0y;
+ $paz = $p1z - $p0z;
+ $pbx = $p2x - $p0x;
+ $pby = $p2y - $p0y;
+ $pbz = $p2z - $p0z;
+ $nx = $pay * $pbz - $paz * $pby;
+ $ny = $paz * $pbx - $pax * $pbz;
+ $nz = $pax * $pby - $pay * $pbx;
+
+ return (normalize ($nx, $ny, $nz));
+}
+
+
+sub parse_vrml_1($$$) {
+ my ($filename, $body, $normalize_p) = @_;
+
+ my @verts = (); # list of refs of coords, [x, y, z]
+ my @faces = (); # list of refs of [ point, point, point, ... ]
+ # where 'point' is a list of indexes into 'verts'.
+
+ $body =~ s% \b point \s* \[ (.*?) \] %{
+ foreach my $point (split (/,/, $1)) {
+ $point =~ s/^\s+|\s+$//gsi;
+ next unless $point;
+ my @p = split(/\s+/, $point);
+ push @verts, \@p;
+ }
+ }%gsexi;
+
+ $body =~ s% \b coordIndex \s* \[ (.*?) \] %{
+ foreach my $face (split (/\s*,-1,?\s*/, $1)) {
+ $face =~ s/^\s+|\s+$//gsi;
+ next unless $face;
+ my @p = split(/\s*,\s*/, $face);
+ push @faces, \@p;
+ }
+ }%gsexi;
+
+ return () if ($#verts < 0);
+
+ # generate interleaved list of triangle coordinates and normals
+ #
+ my @triangles = ();
+ my $nfaces = $#faces+1;
+
+ foreach my $f (@faces) {
+ # $f is [ p1, p2, p3, ... ]
+
+ my @f = @$f;
+
+ error ("too few points in face") if ($#f < 2);
+ my $p1 = shift @f;
+
+ # If there are more than 3 points, do a triangle fan from the first one:
+ # [1 2 3] [1 3 4] [1 4 5] etc. Doesn't always work with convex shapes.
+
+ while ($#f) {
+ my $p2 = shift @f;
+ my $p3 = $f[0];
+
+ my ($pp1, $pp2, $pp3) = ($p1, $p2, $p3);
+ # Reverse the winding order.
+# ($pp1, $pp2, $pp3) = ($pp3, $pp2, $pp1);
+
+ my $x1 = $verts[$pp1]->[0];
+ my $y1 = $verts[$pp1]->[1];
+ my $z1 = $verts[$pp1]->[2];
+
+ my $x2 = $verts[$pp2]->[0];
+ my $y2 = $verts[$pp2]->[1];
+ my $z2 = $verts[$pp2]->[2];
+
+ my $x3 = $verts[$pp3]->[0];
+ my $y3 = $verts[$pp3]->[1];
+ my $z3 = $verts[$pp3]->[2];
+
+ error ("missing points in face") unless defined($z3);
+
+ my ($nx, $ny, $nz) = face_normal ($x1, $y1, $z1,
+ $x2, $y2, $z2,
+ $x3, $y3, $z3);
+
+ push @triangles, [$nx, $ny, $nz, $x1, $y1, $z1,
+ $nx, $ny, $nz, $x2, $y2, $z2,
+ $nx, $ny, $nz, $x3, $y3, $z3];
+ }
+ }
+
+ return (@triangles);
+}
+
+
+sub parse_vrml($$$) {
+ my ($filename, $body, $normalize_p) = @_;
+
+ my @triangles = ();
+
+ $body =~ s/\s*\#.*$//gmi; # comments
+
+ # Lose 2D imagery
+ $body =~ s/\bIndexedLineSet \s* { \s* coordIndex \s* \[ .*? \] \s* }//gsix;
+
+ $body =~ s/(\bSeparator\b)/\001$1/g;
+
+ foreach my $sec (split (m/\001/, $body)) {
+ push @triangles, parse_vrml_1 ($filename, $sec, $normalize_p);
+ }
+
+
+ # find bounding box, and normalize
+ #
+ if ($normalize_p || $verbose) {
+ my $minx = 999999999;
+ my $miny = 999999999;
+ my $minz = 999999999;
+ my $maxx = -999999999;
+ my $maxy = -999999999;
+ my $maxz = -999999999;
+ my $i = 0;
+
+ foreach my $t (@triangles) {
+ my ($nx1, $ny1, $nz1, $x1, $y1, $z1,
+ $nx2, $ny2, $nz2, $x2, $y2, $z2,
+ $nx3, $ny3, $nz3, $x3, $y3, $z3) = @$t;
+
+ foreach my $x ($x1, $x2, $x3) {
+ $minx = $x if ($x < $minx);
+ $maxx = $x if ($x > $maxx);
+ }
+ foreach my $y ($y1, $y2, $y3) {
+ $miny = $y if ($y < $miny);
+ $maxy = $y if ($y > $maxy);
+ }
+ foreach my $z ($z1, $z2, $z3) {
+ $minz = $z if ($z < $minz);
+ $maxz = $z if ($z > $maxz);
+ }
+ }
+
+ my $w = ($maxx - $minx);
+ my $h = ($maxy - $miny);
+ my $d = ($maxz - $minz);
+ my $sizea = ($w > $h ? $w : $h);
+ my $sizeb = ($w > $d ? $w : $d);
+ my $size = ($sizea > $sizeb ? $sizea : $sizeb);
+
+ print STDERR "$progname: bbox is " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+
+ if ($normalize_p) {
+ $w /= $size;
+ $h /= $size;
+ $d /= $size;
+ print STDERR "$progname: dividing by $size for bbox of " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+
+ foreach my $t (@triangles) {
+ my @t = @$t;
+ $t[3] /= $size; $t[4] /= $size; $t[5] /= $size;
+ $t[9] /= $size; $t[10] /= $size; $t[11] /= $size;
+ $t[15] /= $size; $t[16] /= $size; $t[17] /= $size;
+ $t = \@t;
+ }
+ }
+ }
+
+ return @triangles;
+}
+
+
+sub generate_c($@) {
+ my ($filename, @triangles) = @_;
+
+ my $code = '';
+
+ $code .= "#include \"gllist.h\"\n";
+ $code .= "static const float data[]={\n";
+
+ my $nfaces = $#triangles + 1;
+ my $npoints = $nfaces * 3;
+
+ foreach my $t (@triangles) {
+ my ($nx1, $ny1, $nz1, $x1, $y1, $z1,
+ $nx2, $ny2, $nz2, $x2, $y2, $z2,
+ $nx3, $ny3, $nz3, $x3, $y3, $z3) = @$t;
+ my $lines = sprintf("\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n",
+ $nx1, $ny1, $nz1, $x1, $y1, $z1,
+ $nx2, $ny2, $nz2, $x2, $y2, $z2,
+ $nx3, $ny3, $nz3, $x3, $y3, $z3);
+ $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
+ $lines =~ s/\.,/,/g;
+ $lines =~ s/-0,/0,/g;
+
+ $code .= $lines;
+ }
+
+ my $token = $filename; # guess at a C token from the filename
+ $token =~ s/\<[^<>]*\>//;
+ $token =~ s@^.*/@@;
+ $token =~ s/\.[^.]*$//;
+ $token =~ s/[^a-z\d]/_/gi;
+ $token =~ s/__+/_/g;
+ $token =~ s/^_//g;
+ $token =~ s/_$//g;
+ $token =~ tr [A-Z] [a-z];
+ $token = 'foo' if ($token eq '');
+
+ my $format = 'GL_N3F_V3F';
+ my $primitive = 'GL_TRIANGLES';
+
+ $code =~ s/,\n$//s;
+ $code .= "\n};\n";
+ $code .= "static const struct gllist frame={";
+ $code .= "$format,$primitive,$npoints,data,NULL};\n";
+ $code .= "const struct gllist *$token=&frame;\n";
+
+ print STDERR "$filename: " .
+ (($#triangles+1)*3) . " points, " .
+ (($#triangles+1)) . " faces.\n"
+ if ($verbose);
+
+ return $code;
+}
+
+
+sub vrml_to_gl($$$) {
+ my ($infile, $outfile, $normalize_p) = @_;
+ my $body = '';
+
+ my $in;
+ if ($infile eq '-') {
+ $in = *STDIN;
+ } else {
+ open ($in, '<', $infile) || error ("$infile: $!");
+ }
+ my $filename = ($infile eq '-' ? "<stdin>" : $infile);
+ print STDERR "$progname: reading $filename...\n"
+ if ($verbose);
+ while (<$in>) { $body .= $_; }
+ close $in;
+
+ $body =~ s/\r\n/\n/g; # CRLF -> LF
+ $body =~ s/\r/\n/g; # CR -> LF
+
+ my @triangles = parse_vrml ($filename, $body, $normalize_p);
+
+ $filename = ($outfile eq '-' ? "<stdout>" : $outfile);
+ my $code = generate_c ($filename, @triangles);
+
+ my $out;
+ if ($outfile eq '-') {
+ $out = *STDOUT;
+ } else {
+ open ($out, '>', $outfile) || error ("$outfile: $!");
+ }
+ (print $out $code) || error ("$filename: $!");
+ (close $out) || error ("$filename: $!");
+
+ print STDERR "$progname: wrote $filename\n"
+ if ($verbose || $outfile ne '-');
+}
+
+
+sub error {
+ ($_) = @_;
+ print STDERR "$progname: $_\n";
+ exit 1;
+}
+
+sub usage {
+ print STDERR "usage: $progname [--verbose] [infile [outfile]]\n";
+ exit 1;
+}
+
+sub main {
+ my ($infile, $outfile);
+ my $normalize_p = 0;
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif ($_ eq "--normalize") { $normalize_p = 1; }
+ elsif (m/^-./) { usage; }
+ elsif (!defined($infile)) { $infile = $_; }
+ elsif (!defined($outfile)) { $outfile = $_; }
+ else { usage; }
+ }
+
+ $infile = "-" unless defined ($infile);
+ $outfile = "-" unless defined ($outfile);
+
+ vrml_to_gl ($infile, $outfile, $normalize_p);
+}
+
+main;
+exit 0;
diff --git a/hacks/glx/wfront2gl.pl b/hacks/glx/wfront2gl.pl
new file mode 100755
index 0000000..c78974e
--- /dev/null
+++ b/hacks/glx/wfront2gl.pl
@@ -0,0 +1,361 @@
+#!/usr/bin/perl -w
+# Copyright © 2003-2012 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Reads a Wavefront OBJ file, and emits C data suitable for use with OpenGL's
+# glInterleavedArrays() and glDrawArrays() routines.
+#
+# If the OBJ file does not contain face normals, they are computed.
+# Texture coordinates are ignored.
+#
+# Options:
+#
+# --normalize Compute the bounding box of the object, and scale all
+# coordinates so that the object fits inside a unit cube.
+#
+# Created: 8-Mar-2003.
+
+require 5;
+use diagnostics;
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.6 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+
+# convert a vector to a unit vector
+sub normalize($$$) {
+ my ($x, $y, $z) = @_;
+ my $L = sqrt (($x * $x) + ($y * $y) + ($z * $z));
+ if ($L != 0) {
+ $x /= $L;
+ $y /= $L;
+ $z /= $L;
+ } else {
+ $x = $y = $z = 0;
+ }
+ return ($x, $y, $z);
+}
+
+
+# Calculate the unit normal at p0 given two other points p1,p2 on the
+# surface. The normal points in the direction of p1 crossproduct p2.
+#
+sub face_normal($$$$$$$$$) {
+ my ($p0x, $p0y, $p0z,
+ $p1x, $p1y, $p1z,
+ $p2x, $p2y, $p2z) = @_;
+
+ my ($nx, $ny, $nz);
+ my ($pax, $pay, $paz);
+ my ($pbx, $pby, $pbz);
+
+ $pax = $p1x - $p0x;
+ $pay = $p1y - $p0y;
+ $paz = $p1z - $p0z;
+ $pbx = $p2x - $p0x;
+ $pby = $p2y - $p0y;
+ $pbz = $p2z - $p0z;
+ $nx = $pay * $pbz - $paz * $pby;
+ $ny = $paz * $pbx - $pax * $pbz;
+ $nz = $pax * $pby - $pay * $pbx;
+
+ return (normalize ($nx, $ny, $nz));
+}
+
+
+sub parse_obj($$$) {
+ my ($filename, $obj, $normalize_p) = @_;
+
+ $_ = $obj;
+ my @verts = (); # list of refs of coords, [x, y, z]
+ my @norms = (); # list of refs of coords, [x, y, z]
+ my @texts = (); # list of refs of coords, [u, v]
+ my @faces = (); # list of refs of [ point, point, point, ... ]
+ # where 'point' is a ref of indexes into the
+ # above lists, [ vert, text, norm ]
+
+ my $lineno = 0;
+ foreach (split (/\n/, $obj)) {
+ $lineno++;
+ next if (m/^\s*$|^\s*\#/);
+
+ if (m/^v\s/) {
+ my ($x, $y, $z) = m/^v\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s*$/;
+ error ("line $lineno: unparsable V line: $_") unless defined($z);
+ push @verts, [$x+0, $y+0, $z+0];
+
+ } elsif (m/^vn\s/) {
+ my ($x, $y, $z) = m/^vn\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s*$/;
+ error ("line $lineno: unparsable VN line: $_") unless defined($z);
+ push @norms, [$x+0, $y+0, $z+0];
+
+ } elsif (m/^vt\s/) {
+ my ($u, $v) = m/^vt\s+([^\s]+)\s+([^\s]+)\s*$/;
+ error ("line $lineno: unparsable VT line: $_") unless defined($v);
+ push @texts, [$u+0, $v+0];
+
+ } elsif (m/^g\b/) {
+ # group name
+
+ } elsif (m/f\s/) {
+ my @f = split(/\s+/, $_);
+ shift @f;
+ my @vs = ();
+ foreach my $f (@f) {
+ my ($v, $t, $n);
+ if ($f =~ m@^(\d+)$@s) { $v = $1; }
+ elsif ($f =~ m@^(\d+)/(\d+)$@s) { $v = $1, $t = $2; }
+ elsif ($f =~ m@^(\d+)/(\d+)/(\d+)$@s) { $v = $1, $t = $2; $n = $3; }
+ elsif ($f =~ m@^(\d+)///?(\d+)$@s) { $v = $1; $n = $3; }
+ else {
+ error ("line $lineno: unparsable F line: $_") unless defined($v);
+ }
+ $t = -1 unless defined($t);
+ $n = -1 unless defined($n);
+ push @vs, [$v+0, $t+0, $n+0];
+ }
+ push @faces, \@vs;
+
+ } elsif (m/^s\b/) {
+ # turn on smooth shading
+ } elsif (m/^(mtllib|usemtl)\b/) {
+ # reference to external materials file (textures, etc.)
+ } else {
+ error ("line $lineno: unknown line: $_");
+ }
+ }
+
+
+ # find bounding box, and normalize
+ #
+ if ($normalize_p || $verbose) {
+ my $minx = 999999999;
+ my $miny = 999999999;
+ my $minz = 999999999;
+ my $maxx = -999999999;
+ my $maxy = -999999999;
+ my $maxz = -999999999;
+ my $i = 0;
+ foreach my $v (@verts) {
+ my ($x, $y, $z) = @$v;
+ $minx = $x if ($x < $minx);
+ $maxx = $x if ($x > $maxx);
+ $miny = $y if ($y < $miny);
+ $maxy = $y if ($y > $maxy);
+ $minz = $z if ($z < $minz);
+ $maxz = $z if ($z > $maxz);
+ }
+
+ my $w = ($maxx - $minx);
+ my $h = ($maxy - $miny);
+ my $d = ($maxz - $minz);
+ my $sizea = ($w > $h ? $w : $h);
+ my $sizeb = ($w > $d ? $w : $d);
+ my $size = ($sizea > $sizeb ? $sizea : $sizeb);
+
+ print STDERR "$progname: bbox is " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+
+ if ($normalize_p) {
+ $w /= $size;
+ $h /= $size;
+ $d /= $size;
+ print STDERR "$progname: dividing by $size for bbox of " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+ foreach my $n (@verts) {
+ my @n = @$n;
+ foreach (@n) { $_ /= $size; }
+ $n = \@n;
+ }
+ }
+ }
+
+ # generate interleaved list of triangle coordinates and normals
+ #
+ my @triangles = ();
+ my $nfaces = $#faces+1;
+
+ foreach my $f (@faces) {
+ # $f is [ [v, t, n], [v, t, n], ... ]
+
+ my @f = @$f;
+
+# # (Kludge for the companion cube model)
+# if ($#f > 15) {
+# my $i = 12;
+# @f = (@f[$i-1 .. $#f], @f[0 .. $i]);
+# }
+
+ error ("too few points in face") if ($#f < 2);
+ my $p1 = shift @f;
+
+ # If there are more than 3 points, do a triangle fan from the first one:
+ # [1 2 3] [1 3 4] [1 4 5] etc. Doesn't always work with convex shapes.
+
+ while ($#f) {
+ my $p2 = shift @f;
+ my $p3 = $f[0];
+
+ my $x1 = $verts[$p1->[0]-1]->[0]; my $nx1 = $norms[$p1->[2]-1]->[0];
+ my $y1 = $verts[$p1->[0]-1]->[1]; my $ny1 = $norms[$p1->[2]-1]->[1];
+ my $z1 = $verts[$p1->[0]-1]->[2]; my $nz1 = $norms[$p1->[2]-1]->[2];
+
+ my $x2 = $verts[$p2->[0]-1]->[0]; my $nx2 = $norms[$p2->[2]-1]->[0];
+ my $y2 = $verts[$p2->[0]-1]->[1]; my $ny2 = $norms[$p2->[2]-1]->[1];
+ my $z2 = $verts[$p2->[0]-1]->[2]; my $nz2 = $norms[$p2->[2]-1]->[2];
+
+ my $x3 = $verts[$p3->[0]-1]->[0]; my $nx3 = $norms[$p3->[2]-1]->[0];
+ my $y3 = $verts[$p3->[0]-1]->[1]; my $ny3 = $norms[$p3->[2]-1]->[1];
+ my $z3 = $verts[$p3->[0]-1]->[2]; my $nz3 = $norms[$p3->[2]-1]->[2];
+
+ error ("missing points in face") unless defined($z3);
+
+ if (!defined($nz3)) {
+ my ($nx, $ny, $nz) = face_normal ($x1, $y1, $z1,
+ $x2, $y2, $z2,
+ $x3, $y3, $z3);
+ $nx1 = $nx2 = $nx3 = $nx;
+ $ny1 = $ny2 = $ny3 = $ny;
+ $nz1 = $nz2 = $nz3 = $nz;
+ }
+
+
+ push @triangles, [$nx1, $ny1, $nz1, $x1, $y1, $z1,
+ $nx2, $ny2, $nz2, $x2, $y2, $z2,
+ $nx3, $ny3, $nz3, $x3, $y3, $z3];
+ }
+ }
+
+ return (@triangles);
+}
+
+
+sub generate_c($@) {
+ my ($filename, @triangles) = @_;
+
+ my $code = '';
+
+ $code .= "#include \"gllist.h\"\n";
+ $code .= "static const float data[]={\n";
+
+ my $nfaces = $#triangles + 1;
+ my $npoints = $nfaces * 3;
+
+ foreach my $t (@triangles) {
+ my ($nx1, $ny1, $nz1, $x1, $y1, $z1,
+ $nx2, $ny2, $nz2, $x2, $y2, $z2,
+ $nx3, $ny3, $nz3, $x3, $y3, $z3) = @$t;
+ my $lines = sprintf("\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n",
+ $nx1, $ny1, $nz1, $x1, $y1, $z1,
+ $nx2, $ny2, $nz2, $x2, $y2, $z2,
+ $nx3, $ny3, $nz3, $x3, $y3, $z3);
+ $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
+ $lines =~ s/\.,/,/g;
+ $lines =~ s/-0,/0,/g;
+
+ $code .= $lines;
+ }
+
+ my $token = $filename; # guess at a C token from the filename
+ $token =~ s/\<[^<>]*\>//;
+ $token =~ s@^.*/@@;
+ $token =~ s/\.[^.]*$//;
+ $token =~ s/[^a-z\d]/_/gi;
+ $token =~ s/__+/_/g;
+ $token =~ s/^_//g;
+ $token =~ s/_$//g;
+ $token =~ tr [A-Z] [a-z];
+ $token = 'foo' if ($token eq '');
+
+ my $format = 'GL_N3F_V3F';
+ my $primitive = 'GL_TRIANGLES';
+
+ $code =~ s/,\n$//s;
+ $code .= "\n};\n";
+ $code .= "static const struct gllist frame={";
+ $code .= "$format,$primitive,$npoints,data,NULL};\n";
+ $code .= "const struct gllist *$token=&frame;\n";
+
+ print STDERR "$filename: " .
+ (($#triangles+1)*3) . " points, " .
+ (($#triangles+1)) . " faces.\n"
+ if ($verbose);
+
+ return $code;
+}
+
+
+sub obj_to_gl($$$) {
+ my ($infile, $outfile, $normalize_p) = @_;
+ my $obj = '';
+ open (my $in, '<', $infile) || error ("$infile: $!");
+ my $filename = ($infile eq '-' ? "<stdin>" : $infile);
+ print STDERR "$progname: reading $filename...\n"
+ if ($verbose);
+ while (<$in>) { $obj .= $_; }
+ close $in;
+
+ $obj =~ s/\r\n/\n/g; # CRLF -> LF
+ $obj =~ s/\r/\n/g; # CR -> LF
+
+ my @triangles = parse_obj ($filename, $obj, $normalize_p);
+
+ $filename = ($outfile eq '-' ? "<stdout>" : $outfile);
+ my $code = generate_c ($filename, @triangles);
+
+ open (my $out, '>', $outfile) || error ("$outfile: $!");
+ (print $out $code) || error ("$filename: $!");
+ (close $out) || error ("$filename: $!");
+
+ print STDERR "$progname: wrote $filename\n"
+ if ($verbose || $outfile ne '-');
+}
+
+
+sub error {
+ ($_) = @_;
+ print STDERR "$progname: $_\n";
+ exit 1;
+}
+
+sub usage {
+ print STDERR "usage: $progname [--verbose] [infile [outfile]]\n";
+ exit 1;
+}
+
+sub main {
+ my ($infile, $outfile);
+ my $normalize_p = 0;
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif ($_ eq "--normalize") { $normalize_p = 1; }
+ elsif (m/^-./) { usage; }
+ elsif (!defined($infile)) { $infile = $_; }
+ elsif (!defined($outfile)) { $outfile = $_; }
+ else { usage; }
+ }
+
+ $infile = "-" unless defined ($infile);
+ $outfile = "-" unless defined ($outfile);
+
+ obj_to_gl ($infile, $outfile, $normalize_p);
+}
+
+main;
+exit 0;
diff --git a/hacks/glx/whale.c b/hacks/glx/whale.c
new file mode 100644
index 0000000..638f642
--- /dev/null
+++ b/hacks/glx/whale.c
@@ -0,0 +1,1887 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if 0
+static const char sccsid[] = "@(#)whale.c 1.3 98/06/18 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@users.sourceforge.net
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ */
+
+/*-
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+/* *INDENT-OFF* */
+static const float N001[3] = {0.019249, 0.01134, -0.99975};
+static const float N002[3] = {-0.132579, 0.954547, 0.266952};
+static const float N003[3] = {-0.196061, 0.980392, -0.019778};
+static const float N004[3] = {0.695461, 0.604704, 0.388158};
+static const float N005[3] = {0.8706, 0.425754, 0.246557};
+static const float N006[3] = {-0.881191, 0.392012, 0.264251};
+#if 0
+static const float N007[3] = {0, 1, 0};
+#endif
+static const float N008[3] = {-0.341437, 0.887477, 0.309523};
+static const float N009[3] = {0.124035, -0.992278, 0};
+static const float N010[3] = {0.242536, 0, -0.970143};
+static const float N011[3] = {0.588172, 0, 0.808736};
+static const float N012[3] = {0.929824, -0.340623, -0.139298};
+static const float N013[3] = {0.954183, 0.267108, -0.134865};
+static const float N014[3] = {0.495127, 0.855436, -0.151914};
+static const float N015[3] = {-0.390199, 0.906569, -0.160867};
+static const float N016[3] = {-0.923605, 0.354581, -0.145692};
+static const float N017[3] = {-0.955796, -0.260667, -0.136036};
+static const float N018[3] = {-0.501283, -0.853462, -0.14254};
+static const float N019[3] = {0.4053, -0.901974, -0.148913};
+static const float N020[3] = {0.909913, -0.392746, -0.133451};
+static const float N021[3] = {0.936494, 0.331147, -0.115414};
+static const float N022[3] = {0.600131, 0.793724, -0.099222};
+static const float N023[3] = {-0.231556, 0.968361, -0.093053};
+static const float N024[3] = {-0.844369, 0.52533, -0.105211};
+static const float N025[3] = {-0.982725, -0.136329, -0.125164};
+static const float N026[3] = {-0.560844, -0.822654, -0.093241};
+static const float N027[3] = {0.263884, -0.959981, -0.093817};
+static const float N028[3] = {0.842057, -0.525192, -0.122938};
+static const float N029[3] = {0.92162, 0.367565, -0.124546};
+static const float N030[3] = {0.613927, 0.784109, -0.090918};
+static const float N031[3] = {-0.448754, 0.888261, -0.098037};
+static const float N032[3] = {-0.891865, 0.434376, -0.126077};
+static const float N033[3] = {-0.881447, -0.448017, -0.149437};
+static const float N034[3] = {-0.345647, -0.922057, -0.174183};
+static const float N035[3] = {0.307998, -0.941371, -0.137688};
+static const float N036[3] = {0.806316, -0.574647, -0.140124};
+static const float N037[3] = {0.961346, 0.233646, -0.145681};
+static const float N038[3] = {0.488451, 0.865586, -0.110351};
+static const float N039[3] = {-0.37429, 0.921953, -0.099553};
+static const float N040[3] = {-0.928504, 0.344533, -0.138485};
+static const float N041[3] = {-0.918419, -0.371792, -0.135189};
+static const float N042[3] = {-0.520666, -0.833704, -0.183968};
+static const float N043[3] = {0.339204, -0.920273, -0.195036};
+static const float N044[3] = {0.921475, -0.387382, -0.028636};
+static const float N045[3] = {0.842465, 0.533335, -0.076204};
+static const float N046[3] = {0.38011, 0.924939, 0.002073};
+static const float N047[3] = {-0.276128, 0.961073, -0.009579};
+static const float N048[3] = {-0.879684, 0.473001, -0.04925};
+static const float N049[3] = {-0.947184, -0.317614, -0.044321};
+static const float N050[3] = {-0.642059, -0.764933, -0.051363};
+static const float N051[3] = {0.466794, -0.880921, -0.07799};
+static const float N052[3] = {0.898509, -0.432277, 0.076279};
+static const float N053[3] = {0.938985, 0.328141, 0.103109};
+static const float N054[3] = {0.44242, 0.895745, 0.043647};
+static const float N055[3] = {-0.255163, 0.966723, 0.018407};
+static const float N056[3] = {-0.833769, 0.54065, 0.111924};
+static const float N057[3] = {-0.953653, -0.289939, 0.080507};
+static const float N058[3] = {-0.672357, -0.730524, 0.119461};
+static const float N059[3] = {0.522249, -0.846652, 0.102157};
+static const float N060[3] = {0.885868, -0.427631, 0.179914};
+#if 0
+static const float N061[3] = {0, 1, 0};
+#endif
+static const float N062[3] = {0.648942, 0.743116, 0.163255};
+static const float N063[3] = {-0.578967, 0.80773, 0.111219};
+#if 0
+static const float N064[3] = {0, 1, 0};
+#endif
+static const float N065[3] = {-0.909864, -0.352202, 0.219321};
+static const float N066[3] = {-0.502541, -0.81809, 0.27961};
+static const float N067[3] = {0.322919, -0.915358, 0.240504};
+static const float N068[3] = {0.242536, 0, -0.970143};
+static const float N069[3] = {0, 1, 0};
+static const float N070[3] = {0, 1, 0};
+static const float N071[3] = {0, 1, 0};
+static const float N072[3] = {0, 1, 0};
+static const float N073[3] = {0, 1, 0};
+static const float N074[3] = {0, 1, 0};
+static const float N075[3] = {0.03122, 0.999025, -0.03122};
+static const float N076[3] = {0, 1, 0};
+static const float N077[3] = {0.446821, 0.893642, 0.041889};
+static const float N078[3] = {0.863035, -0.10098, 0.494949};
+static const float N079[3] = {0.585597, -0.808215, 0.062174};
+static const float N080[3] = {0, 1, 0};
+static const float N081[3] = {1, 0, 0};
+static const float N082[3] = {0, 1, 0};
+static const float N083[3] = {-1, 0, 0};
+static const float N084[3] = {-0.478893, 0.837129, -0.264343};
+static const float N085[3] = {0, 1, 0};
+static const float N086[3] = {0.763909, 0.539455, -0.354163};
+static const float N087[3] = {0.446821, 0.893642, 0.041889};
+static const float N088[3] = {0.385134, -0.908288, 0.163352};
+static const float N089[3] = {-0.605952, 0.779253, -0.159961};
+static const float N090[3] = {0, 1, 0};
+static const float N091[3] = {0, 1, 0};
+static const float N092[3] = {0, 1, 0};
+static const float N093[3] = {0, 1, 0};
+static const float N094[3] = {1, 0, 0};
+static const float N095[3] = {-1, 0, 0};
+static const float N096[3] = {0.644444, -0.621516, 0.445433};
+static const float N097[3] = {-0.760896, -0.474416, 0.442681};
+static const float N098[3] = {0.636888, -0.464314, 0.615456};
+static const float N099[3] = {-0.710295, 0.647038, 0.277168};
+static const float N100[3] = {0.009604, 0.993655, 0.112063};
+#if 0
+static const float N101[3] = {0, 1, 0};
+static const float N102[3] = {0, 1, 0};
+static const float N103[3] = {0, 1, 0};
+static const float N104[3] = {0.031837, 0.999285, 0.020415};
+static const float N105[3] = {0.031837, 0.999285, 0.020415};
+static const float N106[3] = {0.031837, 0.999285, 0.020415};
+static const float N107[3] = {0.014647, 0.999648, 0.022115};
+static const float N108[3] = {0.014647, 0.999648, 0.022115};
+static const float N109[3] = {0.014647, 0.999648, 0.022115};
+static const float N110[3] = {-0.985141, 0.039475, 0.167149};
+static const float N111[3] = {-0.985141, 0.039475, 0.167149};
+static const float N112[3] = {-0.985141, 0.039475, 0.167149};
+static const float N113[3] = {0, 1, 0};
+static const float N114[3] = {0, 1, 0};
+static const float N115[3] = {0, 1, 0};
+static const float N116[3] = {0, 1, 0};
+static const float N117[3] = {0, 1, 0};
+static const float N118[3] = {0, 1, 0};
+static const float N119[3] = {0, 1, 0};
+static const float N120[3] = {0, 1, 0};
+static const float N121[3] = {0, 1, 0};
+#endif
+static const float iP001[3] = {18.74, 13.19, 3.76};
+static float P001[3] = {18.74, 13.19, 3.76};
+static const float P002[3] = {0, 390.42, 10292.57};
+static const float P003[3] = {55.8, 622.31, 8254.35};
+static const float P004[3] = {20.8, 247.66, 10652.13};
+static const float P005[3] = {487.51, 198.05, 9350.78};
+static const float P006[3] = {-457.61, 199.04, 9353.01};
+#if 0
+static const float P007[3] = {0, 259, 10276.27};
+#endif
+static const float P008[3] = {-34.67, 247.64, 10663.71};
+static const float iP009[3] = {97.46, 67.63, 593.82};
+static const float iP010[3] = {-84.33, 67.63, 588.18};
+static const float iP011[3] = {118.69, 8.98, -66.91};
+static float P009[3] = {97.46, 67.63, 593.82};
+static float P010[3] = {-84.33, 67.63, 588.18};
+static float P011[3] = {118.69, 8.98, -66.91};
+static const float iP012[3] = {156.48, -31.95, 924.54};
+static const float iP013[3] = {162, 110.22, 924.54};
+static const float iP014[3] = {88.16, 221.65, 924.54};
+static const float iP015[3] = {-65.21, 231.16, 924.54};
+static const float iP016[3] = {-156.48, 121.97, 924.54};
+static const float iP017[3] = {-162, -23.93, 924.54};
+static const float iP018[3] = {-88.16, -139.1, 924.54};
+static const float iP019[3] = {65.21, -148.61, 924.54};
+static const float iP020[3] = {246.87, -98.73, 1783.04};
+static const float iP021[3] = {253.17, 127.76, 1783.04};
+static const float iP022[3] = {132.34, 270.77, 1783.04};
+static const float iP023[3] = {-97.88, 285.04, 1783.04};
+static const float iP024[3] = {-222.97, 139.8, 1783.04};
+static const float iP025[3] = {-225.29, -86.68, 1783.04};
+static const float iP026[3] = {-108.44, -224.15, 1783.04};
+static const float iP027[3] = {97.88, -221.56, 1783.04};
+static const float iP028[3] = {410.55, -200.66, 3213.87};
+static const float iP029[3] = {432.19, 148.42, 3213.87};
+static const float iP030[3] = {200.66, 410.55, 3213.87};
+static const float iP031[3] = {-148.42, 432.19, 3213.87};
+static const float iP032[3] = {-407.48, 171.88, 3213.87};
+static const float iP033[3] = {-432.19, -148.42, 3213.87};
+static const float iP034[3] = {-148.88, -309.74, 3213.87};
+static const float iP035[3] = {156.38, -320.17, 3213.87};
+static const float iP036[3] = {523.39, -303.81, 4424.57};
+static const float iP037[3] = {574.66, 276.84, 4424.57};
+static const float iP038[3] = {243.05, 492.5, 4424.57};
+static const float iP039[3] = {-191.23, 520.13, 4424.57};
+static const float iP040[3] = {-523.39, 304.01, 4424.57};
+static const float iP041[3] = {-574.66, -231.83, 4424.57};
+static const float iP042[3] = {-266.95, -578.17, 4424.57};
+static const float iP043[3] = {211.14, -579.67, 4424.57};
+static const float iP044[3] = {680.57, -370.27, 5943.46};
+static const float iP045[3] = {834.01, 363.09, 5943.46};
+static const float iP046[3] = {371.29, 614.13, 5943.46};
+static const float iP047[3] = {-291.43, 621.86, 5943.46};
+static const float iP048[3] = {-784.13, 362.6, 5943.46};
+static const float iP049[3] = {-743.29, -325.82, 5943.46};
+static const float iP050[3] = {-383.24, -804.77, 5943.46};
+static const float iP051[3] = {283.47, -846.09, 5943.46};
+static float P012[3] = {156.48, -31.95, 924.54};
+static float P013[3] = {162, 110.22, 924.54};
+static float P014[3] = {88.16, 221.65, 924.54};
+static float P015[3] = {-65.21, 231.16, 924.54};
+static float P016[3] = {-156.48, 121.97, 924.54};
+static float P017[3] = {-162, -23.93, 924.54};
+static float P018[3] = {-88.16, -139.1, 924.54};
+static float P019[3] = {65.21, -148.61, 924.54};
+static float P020[3] = {246.87, -98.73, 1783.04};
+static float P021[3] = {253.17, 127.76, 1783.04};
+static float P022[3] = {132.34, 270.77, 1783.04};
+static float P023[3] = {-97.88, 285.04, 1783.04};
+static float P024[3] = {-222.97, 139.8, 1783.04};
+static float P025[3] = {-225.29, -86.68, 1783.04};
+static float P026[3] = {-108.44, -224.15, 1783.04};
+static float P027[3] = {97.88, -221.56, 1783.04};
+static float P028[3] = {410.55, -200.66, 3213.87};
+static float P029[3] = {432.19, 148.42, 3213.87};
+static float P030[3] = {200.66, 410.55, 3213.87};
+static float P031[3] = {-148.42, 432.19, 3213.87};
+static float P032[3] = {-407.48, 171.88, 3213.87};
+static float P033[3] = {-432.19, -148.42, 3213.87};
+static float P034[3] = {-148.88, -309.74, 3213.87};
+static float P035[3] = {156.38, -320.17, 3213.87};
+static float P036[3] = {523.39, -303.81, 4424.57};
+static float P037[3] = {574.66, 276.84, 4424.57};
+static float P038[3] = {243.05, 492.5, 4424.57};
+static float P039[3] = {-191.23, 520.13, 4424.57};
+static float P040[3] = {-523.39, 304.01, 4424.57};
+static float P041[3] = {-574.66, -231.83, 4424.57};
+static float P042[3] = {-266.95, -578.17, 4424.57};
+static float P043[3] = {211.14, -579.67, 4424.57};
+static float P044[3] = {680.57, -370.27, 5943.46};
+static float P045[3] = {834.01, 363.09, 5943.46};
+static float P046[3] = {371.29, 614.13, 5943.46};
+static float P047[3] = {-291.43, 621.86, 5943.46};
+static float P048[3] = {-784.13, 362.6, 5943.46};
+static float P049[3] = {-743.29, -325.82, 5943.46};
+static float P050[3] = {-383.24, -804.77, 5943.46};
+static float P051[3] = {283.47, -846.09, 5943.46};
+static const float P052[3] = {599.09, -332.24, 7902.59};
+static const float P053[3] = {735.48, 306.26, 7911.92};
+static const float P054[3] = {321.55, 558.53, 7902.59};
+static const float P055[3] = {-260.54, 559.84, 7902.59};
+static const float P056[3] = {-698.66, 320.83, 7902.59};
+static const float P057[3] = {-643.29, -299.16, 7902.59};
+static const float P058[3] = {-341.47, -719.3, 7902.59};
+static const float P059[3] = {252.57, -756.12, 7902.59};
+static const float P060[3] = {458.39, -265.31, 9355.44};
+static const float iP061[3] = {353.63, 138.7, 10214.2};
+static float P061[3] = {353.63, 138.7, 10214.2};
+static const float P062[3] = {224.04, 438.98, 9364.77};
+static const float P063[3] = {-165.71, 441.27, 9355.44};
+static const float iP064[3] = {-326.4, 162.04, 10209.54};
+static float P064[3] = {-326.4, 162.04, 10209.54};
+static const float P065[3] = {-473.99, -219.71, 9355.44};
+static const float P066[3] = {-211.97, -479.87, 9355.44};
+static const float P067[3] = {192.86, -504.03, 9355.44};
+static const float iP068[3] = {-112.44, 9.25, -64.42};
+static const float iP069[3] = {1155.63, 0, -182.46};
+static const float iP070[3] = {-1143.13, 0, -181.54};
+static const float iP071[3] = {1424.23, 0, -322.09};
+static const float iP072[3] = {-1368.01, 0, -310.38};
+static const float iP073[3] = {1255.57, 2.31, 114.05};
+static const float iP074[3] = {-1149.38, 0, 117.12};
+static const float iP075[3] = {718.36, 0, 433.36};
+static const float iP076[3] = {-655.9, 0, 433.36};
+static float P068[3] = {-112.44, 9.25, -64.42};
+static float P069[3] = {1155.63, 0, -182.46};
+static float P070[3] = {-1143.13, 0, -181.54};
+static float P071[3] = {1424.23, 0, -322.09};
+static float P072[3] = {-1368.01, 0, -310.38};
+static float P073[3] = {1255.57, 2.31, 114.05};
+static float P074[3] = {-1149.38, 0, 117.12};
+static float P075[3] = {718.36, 0, 433.36};
+static float P076[3] = {-655.9, 0, 433.36};
+static const float P077[3] = {1058, -2.66, 7923.51};
+static const float P078[3] = {-1016.51, -15.47, 7902.87};
+static const float P079[3] = {-1363.99, -484.5, 7593.38};
+static const float P080[3] = {1478.09, -861.47, 7098.12};
+static const float P081[3] = {1338.06, -284.68, 7024.15};
+static const float P082[3] = {-1545.51, -860.64, 7106.6};
+static const float P083[3] = {1063.19, -70.46, 7466.6};
+static const float P084[3] = {-1369.18, -288.11, 7015.34};
+static const float P085[3] = {1348.44, -482.5, 7591.41};
+static const float P086[3] = {-1015.45, -96.8, 7474.86};
+static const float P087[3] = {731.04, 148.38, 7682.58};
+static const float P088[3] = {-697.03, 151.82, 7668.81};
+static const float P089[3] = {-686.82, 157.09, 7922.29};
+static const float P090[3] = {724.73, 147.75, 7931.39};
+static const float iP091[3] = {0, 327.1, 2346.55};
+static const float iP092[3] = {0, 552.28, 2311.31};
+static const float iP093[3] = {0, 721.16, 2166.41};
+static const float iP094[3] = {0, 693.42, 2388.8};
+static const float iP095[3] = {0, 389.44, 2859.97};
+static float P091[3] = {0, 327.1, 2346.55};
+static float P092[3] = {0, 552.28, 2311.31};
+static float P093[3] = {0, 721.16, 2166.41};
+static float P094[3] = {0, 693.42, 2388.8};
+static float P095[3] = {0, 389.44, 2859.97};
+static const float iP096[3] = {222.02, -183.67, 10266.89};
+static const float iP097[3] = {-128.9, -182.7, 10266.89};
+static const float iP098[3] = {41.04, 88.31, 10659.36};
+static const float iP099[3] = {-48.73, 88.3, 10659.36};
+static float P096[3] = {222.02, -183.67, 10266.89};
+static float P097[3] = {-128.9, -182.7, 10266.89};
+static float P098[3] = {41.04, 88.31, 10659.36};
+static float P099[3] = {-48.73, 88.3, 10659.36};
+static const float P100[3] = {0, 603.42, 9340.68};
+#if 0
+static const float P101[3] = {5.7, 567, 7862.98};
+static const float P102[3] = {521.61, 156.61, 9162.34};
+static const float P103[3] = {83.68, 566.67, 7861.26};
+#endif
+static const float P104[3] = {-9.86, 567.62, 7858.65};
+static const float P105[3] = {31.96, 565.27, 7908.46};
+static const float P106[3] = {22.75, 568.13, 7782.83};
+static const float P107[3] = {58.93, 568.42, 7775.94};
+static const float P108[3] = {55.91, 565.59, 7905.86};
+static const float P109[3] = {99.21, 566, 7858.65};
+static const float P110[3] = {-498.83, 148.14, 9135.1};
+static const float P111[3] = {-495.46, 133.24, 9158.48};
+static const float P112[3] = {-490.82, 146.23, 9182.76};
+static const float P113[3] = {-489.55, 174.11, 9183.66};
+static const float P114[3] = {-492.92, 189, 9160.28};
+static const float P115[3] = {-497.56, 176.02, 9136};
+static const float P116[3] = {526.54, 169.68, 9137.7};
+static const float P117[3] = {523.49, 184.85, 9161.42};
+static const float P118[3] = {518.56, 171.78, 9186.06};
+static const float P119[3] = {516.68, 143.53, 9186.98};
+static const float P120[3] = {519.73, 128.36, 9163.26};
+static const float P121[3] = {524.66, 141.43, 9138.62};
+/* *INDENT-ON* */
+
+
+
+static void
+Whale001(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N068);
+ glVertex3fv(P068);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N068);
+ glVertex3fv(P068);
+ glNormal3fv(N076);
+ glVertex3fv(P076);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N068);
+ glVertex3fv(P068);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glNormal3fv(N076);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N076);
+ glVertex3fv(P076);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glNormal3fv(N074);
+ glVertex3fv(P074);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glNormal3fv(N072);
+ glVertex3fv(P072);
+ glNormal3fv(N074);
+ glVertex3fv(P074);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N072);
+ glVertex3fv(P072);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glNormal3fv(N074);
+ glVertex3fv(P074);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N074);
+ glVertex3fv(P074);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glNormal3fv(N076);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N070);
+ glVertex3fv(P070);
+ glNormal3fv(N068);
+ glVertex3fv(P068);
+ glNormal3fv(N076);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N076);
+ glVertex3fv(P076);
+ glNormal3fv(N068);
+ glVertex3fv(P068);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N068);
+ glVertex3fv(P068);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N010);
+ glVertex3fv(P010);
+ glEnd();
+}
+
+static void
+Whale002(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N075);
+ glVertex3fv(P075);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N075);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glNormal3fv(N075);
+ glVertex3fv(P075);
+ glNormal3fv(N073);
+ glVertex3fv(P073);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N071);
+ glVertex3fv(P071);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glNormal3fv(N073);
+ glVertex3fv(P073);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N009);
+ glVertex3fv(P009);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N075);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N011);
+ glVertex3fv(P011);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glNormal3fv(N075);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glNormal3fv(N073);
+ glVertex3fv(P073);
+ glNormal3fv(N075);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N069);
+ glVertex3fv(P069);
+ glNormal3fv(N071);
+ glVertex3fv(P071);
+ glNormal3fv(N073);
+ glVertex3fv(P073);
+ glEnd();
+}
+
+static void
+Whale003(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glEnd();
+}
+
+static void
+Whale004(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glEnd();
+}
+
+static void
+Whale005(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glEnd();
+}
+
+static void
+Whale006(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N093);
+ glVertex3fv(P093);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N093);
+ glVertex3fv(P093);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glEnd();
+}
+
+static void
+Whale007(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glEnd();
+}
+
+static void
+Whale008(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glEnd();
+}
+
+static void
+Whale009(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+}
+
+static void
+Whale010(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N080);
+ glVertex3fv(P080);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N090);
+ glVertex3fv(P090);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N080);
+ glVertex3fv(P080);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glNormal3fv(N090);
+ glVertex3fv(P090);
+ glEnd();
+}
+
+static void
+Whale011(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N082);
+ glVertex3fv(P082);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N082);
+ glVertex3fv(P082);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+}
+
+static void
+Whale012(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+}
+
+static void
+Whale013(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N096);
+ glVertex3fv(P096);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N096);
+ glVertex3fv(P096);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N096);
+ glVertex3fv(P096);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N096);
+ glVertex3fv(P096);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N096);
+ glVertex3fv(P096);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P005);
+ glVertex3fv(P006);
+ glVertex3fv(P099);
+ glVertex3fv(P098);
+ glEnd();
+}
+
+static void
+Whale014(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N004);
+ glVertex3fv(P004);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P006);
+ glVertex3fv(P005);
+ glVertex3fv(P004);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N004);
+ glVertex3fv(P004);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N004);
+ glVertex3fv(P004);
+ glEnd();
+}
+
+static void
+Whale015(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glEnd();
+}
+
+static void
+Whale016(GLenum cap)
+{
+ glBegin(cap);
+ glVertex3fv(P104);
+ glVertex3fv(P105);
+ glVertex3fv(P106);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P107);
+ glVertex3fv(P108);
+ glVertex3fv(P109);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P110);
+ glVertex3fv(P111);
+ glVertex3fv(P112);
+ glVertex3fv(P113);
+ glVertex3fv(P114);
+ glVertex3fv(P115);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P116);
+ glVertex3fv(P117);
+ glVertex3fv(P118);
+ glVertex3fv(P119);
+ glVertex3fv(P120);
+ glVertex3fv(P121);
+ glEnd();
+}
+
+void
+DrawWhale(fishRec * fish, int wire)
+{
+ float seg0, seg1, seg2, seg3, seg4, seg5, seg6, seg7;
+ float pitch, thrash, chomp;
+ GLenum cap;
+
+ fish->htail = (int) (fish->htail - (int) (5 * fish->v)) % 360;
+
+ thrash = 70 * fish->v;
+
+ seg0 = 1.5 * thrash * sin((fish->htail) * RRAD);
+ seg1 = 2.5 * thrash * sin((fish->htail + 10) * RRAD);
+ seg2 = 3.7 * thrash * sin((fish->htail + 15) * RRAD);
+ seg3 = 4.8 * thrash * sin((fish->htail + 23) * RRAD);
+ seg4 = 6 * thrash * sin((fish->htail + 28) * RRAD);
+ seg5 = 6.5 * thrash * sin((fish->htail + 35) * RRAD);
+ seg6 = 6.5 * thrash * sin((fish->htail + 40) * RRAD);
+ seg7 = 6.5 * thrash * sin((fish->htail + 55) * RRAD);
+
+ pitch = fish->v * sin((fish->htail - 160) * RRAD);
+
+ chomp = 0;
+ if (fish->v > 2) {
+ chomp = -(fish->v - 2) * 200;
+ }
+ P012[1] = iP012[1] + seg5;
+ P013[1] = iP013[1] + seg5;
+ P014[1] = iP014[1] + seg5;
+ P015[1] = iP015[1] + seg5;
+ P016[1] = iP016[1] + seg5;
+ P017[1] = iP017[1] + seg5;
+ P018[1] = iP018[1] + seg5;
+ P019[1] = iP019[1] + seg5;
+
+ P020[1] = iP020[1] + seg4;
+ P021[1] = iP021[1] + seg4;
+ P022[1] = iP022[1] + seg4;
+ P023[1] = iP023[1] + seg4;
+ P024[1] = iP024[1] + seg4;
+ P025[1] = iP025[1] + seg4;
+ P026[1] = iP026[1] + seg4;
+ P027[1] = iP027[1] + seg4;
+
+ P028[1] = iP028[1] + seg2;
+ P029[1] = iP029[1] + seg2;
+ P030[1] = iP030[1] + seg2;
+ P031[1] = iP031[1] + seg2;
+ P032[1] = iP032[1] + seg2;
+ P033[1] = iP033[1] + seg2;
+ P034[1] = iP034[1] + seg2;
+ P035[1] = iP035[1] + seg2;
+
+ P036[1] = iP036[1] + seg1;
+ P037[1] = iP037[1] + seg1;
+ P038[1] = iP038[1] + seg1;
+ P039[1] = iP039[1] + seg1;
+ P040[1] = iP040[1] + seg1;
+ P041[1] = iP041[1] + seg1;
+ P042[1] = iP042[1] + seg1;
+ P043[1] = iP043[1] + seg1;
+
+ P044[1] = iP044[1] + seg0;
+ P045[1] = iP045[1] + seg0;
+ P046[1] = iP046[1] + seg0;
+ P047[1] = iP047[1] + seg0;
+ P048[1] = iP048[1] + seg0;
+ P049[1] = iP049[1] + seg0;
+ P050[1] = iP050[1] + seg0;
+ P051[1] = iP051[1] + seg0;
+
+ P009[1] = iP009[1] + seg6;
+ P010[1] = iP010[1] + seg6;
+ P075[1] = iP075[1] + seg6;
+ P076[1] = iP076[1] + seg6;
+
+ P001[1] = iP001[1] + seg7;
+ P011[1] = iP011[1] + seg7;
+ P068[1] = iP068[1] + seg7;
+ P069[1] = iP069[1] + seg7;
+ P070[1] = iP070[1] + seg7;
+ P071[1] = iP071[1] + seg7;
+ P072[1] = iP072[1] + seg7;
+ P073[1] = iP073[1] + seg7;
+ P074[1] = iP074[1] + seg7;
+
+ P091[1] = iP091[1] + seg3 * 1.1;
+ P092[1] = iP092[1] + seg3;
+ P093[1] = iP093[1] + seg3;
+ P094[1] = iP094[1] + seg3;
+ P095[1] = iP095[1] + seg3 * 0.9;
+
+ P099[1] = iP099[1] + chomp;
+ P098[1] = iP098[1] + chomp;
+ P064[1] = iP064[1] + chomp;
+ P061[1] = iP061[1] + chomp;
+ P097[1] = iP097[1] + chomp;
+ P096[1] = iP096[1] + chomp;
+
+ glPushMatrix();
+
+ glRotatef(pitch, 1, 0, 0);
+
+ glTranslatef(0, 0, 8000);
+
+ glRotatef(180, 0, 1, 0);
+
+ glScalef(3, 3, 3);
+
+ glEnable(GL_CULL_FACE);
+
+ cap = wire ? GL_LINE_LOOP : GL_POLYGON;
+ Whale001(cap);
+ Whale002(cap);
+ Whale003(cap);
+ Whale004(cap);
+ Whale005(cap);
+ Whale006(cap);
+ Whale007(cap);
+ Whale008(cap);
+ Whale009(cap);
+ Whale010(cap);
+ Whale011(cap);
+ Whale012(cap);
+ Whale013(cap);
+ Whale014(cap);
+ Whale015(cap);
+ Whale016(cap);
+
+ glDisable(GL_CULL_FACE);
+
+ glPopMatrix();
+}
+#endif
diff --git a/hacks/glx/winduprobot.c b/hacks/glx/winduprobot.c
new file mode 100644
index 0000000..61091cf
--- /dev/null
+++ b/hacks/glx/winduprobot.c
@@ -0,0 +1,2483 @@
+/* winduprobot, Copyright (c) 2014-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws a robot wind-up toy.
+ *
+ * I've had this little robot since I was about six years old! When the time
+ * came for us to throw the Cocktail Robotics Grand Challenge at DNA Lounge, I
+ * photographed this robot (holding a tiny martini glass) to make a flyer for
+ * the event. You can see that photo here:
+ * https://www.dnalounge.com/flyers/2014/09/14.html
+ *
+ * Then I decided to try and make award statues for the contest by modeling
+ * this robot and 3D-printing it (a robot on a post, with the DNA Lounge
+ * grommet around it.) So I learned Maya and built a model.
+ *
+ * Well, that 3D printing idea didn't work out, but since I had the model
+ * already, I exported it and turned it into a screen saver.
+ *
+ * The DXF files that Maya exports aren't simple enough for my dxf2gl.pl
+ * script to process, so the exporting process went:
+ *
+ * - Save from Maya to OBJ;
+ * - Import OBJ into SketchUp using
+ * http://www.scriptspot.com/sketchup/scripts/obj-importer
+ * - Clean up the model a little bit more;
+ * - Export to DXF with "Millimeters", "Triangles", using
+ * http://www.guitar-list.com/download-software/convert-sketchup-skp-files-dxf-or-stl
+ *
+ * We did eventually end up with robotic award statues, but we constructed
+ * them out of mass-produced wind-up robots, rather than 3D printing them:
+ * https://www.dnalounge.com/gallery/2014/09-14/045.html
+ * https://www.youtube.com/watch?v=EZF4ZAAy49g
+ */
+
+#define LABEL_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 25 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*labelFont: " LABEL_FONT "\n" \
+ "*legColor: #AA2222" "\n" \
+ "*armColor: #AA2222" "\n" \
+ "*handColor: #AA2222" "\n" \
+ "*crankColor: #444444" "\n" \
+ "*bodyColor: #7777AA" "\n" \
+ "*domeColor: #7777AA" "\n" \
+ "*insideColor: #DDDDDD" "\n" \
+ "*gearboxColor: #444488" "\n" \
+ "*gearColor: #008877" "\n" \
+ "*wheelColor: #007788" "\n" \
+ "*wireColor: #006600" "\n" \
+ "*groundColor: #0000FF" "\n" \
+ "*textColor: #FFFFFF""\n" \
+ "*textBackground: #444444""\n" \
+ "*textBorderColor: #FFFF88""\n" \
+ "*textLines: 10 \n" \
+ "*program: xscreensaver-text\n" \
+ "*usePty: False\n"
+
+#undef DEBUG
+#define WORDBUBBLES
+
+# define release_robot 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_SPEED "1.0"
+#define DEF_ROBOT_SIZE "1.0"
+#define DEF_TEXTURE "True"
+#define DEF_FADE "True"
+#define DEF_OPACITY "1.0"
+#define DEF_TALK "0.2"
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include "involute.h"
+#include "sphere.h"
+
+#ifdef WORDBUBBLES
+# include "textclient.h"
+# include "texfont.h"
+#endif
+
+#include <ctype.h>
+
+#ifndef HAVE_JWZGLES /* No SPHERE_MAP on iPhone */
+# define HAVE_TEXTURE
+#endif
+
+#ifdef HAVE_TEXTURE
+# include "images/gen/chromesphere_png.h"
+#endif
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern const struct gllist
+ *robot_arm_half, *robot_body_half_outside, *robot_body_half_inside,
+ *robot_crank_full, *robot_gearbox_half, *robot_hand_half,
+ *robot_leg_half, *robot_rotator_half, *robot_wireframe;
+
+static struct gllist *robot_dome = 0, *robot_gear = 0, *ground = 0;
+
+static const struct gllist * const *all_objs[] = {
+ &robot_arm_half, &robot_body_half_outside, &robot_body_half_inside,
+ &robot_crank_full, &robot_gearbox_half, &robot_hand_half,
+ &robot_leg_half, &robot_rotator_half, &robot_wireframe,
+ (const struct gllist * const *) &robot_dome,
+ (const struct gllist * const *) &robot_gear,
+ (const struct gllist * const *) &ground
+};
+
+#define ROBOT_ARM 0
+#define ROBOT_BODY_1 1
+#define ROBOT_BODY_2 2
+#define ROBOT_CRANK 3
+#define ROBOT_GEARBOX 4
+#define ROBOT_HAND 5
+#define ROBOT_LEG 6
+#define ROBOT_ROTATOR 7
+#define ROBOT_WIREFRAME 8
+#define ROBOT_DOME 9
+#define ROBOT_GEAR 10
+#define GROUND 11
+
+typedef struct {
+ GLfloat x, y, z; /* position */
+ GLfloat facing; /* direction of front of robot, degrees */
+ GLfloat pitch; /* front/back tilt angle, degrees */
+ GLfloat roll; /* left/right tilt angle, degrees */
+ GLfloat speed; /* some robots are faster */
+ GLfloat crank_rot; /* gear state, degrees */
+ GLfloat hand_rot[2]; /* rotation of the hands, degrees */
+ GLfloat hand_pos[2]; /* openness of the hands, ratio */
+ GLfloat balance; /* how off-true does it walk? degrees */
+ GLfloat body_transparency; /* ratio */
+ int fading_p; /* -1, 0, 1 */
+
+} walker;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *user_trackball;
+ Bool button_down_p;
+
+ GLuint *dlists;
+ GLfloat component_colors[countof(all_objs)][4];
+
+ int nwalkers;
+ walker *walkers;
+
+ GLfloat looking_x, looking_y, looking_z; /* Where camera is aimed */
+ GLfloat olooking_x, olooking_y, olooking_z; /* Where camera was aimed */
+ Bool camera_tracking_p; /* Whether camera in motion */
+ GLfloat tracking_ratio;
+
+# ifdef HAVE_TEXTURE
+ GLuint chrome_texture;
+# endif
+
+# ifdef WORDBUBBLES
+ texture_font_data *font_data;
+ int bubble_tick;
+ text_data *tc;
+ char words[10240];
+ int lines, max_lines;
+
+ GLfloat text_color[4], text_bg[4], text_bd[4];
+
+# endif /* WORDBUBBLES */
+
+
+# ifdef DEBUG
+ GLfloat debug_x, debug_y, debug_z;
+# endif
+
+} robot_configuration;
+
+static robot_configuration *bps = NULL;
+
+static GLfloat speed, size, opacity;
+static int do_texture, do_fade;
+#ifdef WORDBUBBLES
+static GLfloat talk_chance;
+#endif
+#ifdef DEBUG
+static int debug_p;
+#endif
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-size", ".robotSize", XrmoptionSepArg, 0 },
+ { "-opacity", ".opacity", XrmoptionSepArg, 0 },
+ { "-talk", ".talk", XrmoptionSepArg, 0 },
+ {"-texture", ".texture", XrmoptionNoArg, "True" },
+ {"+texture", ".texture", XrmoptionNoArg, "False" },
+ {"-fade", ".fade", XrmoptionNoArg, "True" },
+ {"+fade", ".fade", XrmoptionNoArg, "False" },
+#ifdef DEBUG
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+ {"+debug", ".debug", XrmoptionNoArg, "False" },
+#endif
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&size, "robotSize", "RobotSize", DEF_ROBOT_SIZE, t_Float},
+ {&opacity, "opacity", "Opacity", DEF_OPACITY, t_Float},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_fade, "fade", "Fade", DEF_FADE, t_Bool},
+#ifdef WORDBUBBLES
+ {&talk_chance, "talk", "Talk", DEF_TALK, t_Float},
+#endif
+#ifdef DEBUG
+ {&debug_p, "debug", "Debug", "False", t_Bool},
+#endif
+};
+
+ENTRYPOINT ModeSpecOpt robot_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_robot (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, width, height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (40.0, 1/h, 1.0, 250);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0, 0, 30,
+ 0, 0, 0,
+ 0, 1, 0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+# ifdef WORDBUBBLES
+ {
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int w = (width < 800 ? 25 : 40);
+ int h = 1000;
+ if (bp->tc)
+ textclient_reshape (bp->tc, w, h, w, h,
+ /* Passing bp->max_lines isn't actually necessary */
+ 0);
+ }
+# endif
+
+}
+
+
+ENTRYPOINT Bool
+robot_handle_event (ModeInfo *mi, XEvent *event)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->user_trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+#ifdef DEBUG
+ else if (event->xany.type == KeyPress && debug_p)
+ {
+ KeySym keysym;
+ char c = 0;
+ double n[3] = { 1.0, 0.1, 0.1 };
+ int s = (event->xkey.state & ShiftMask ? 10 : 1);
+
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+ if (keysym == XK_Right) bp->debug_x += n[0] * s;
+ else if (keysym == XK_Left) bp->debug_x -= n[0] * s;
+ else if (keysym == XK_Up) bp->debug_y += n[1] * s;
+ else if (keysym == XK_Down) bp->debug_y -= n[1] * s;
+ else if (c == '=' || c == '+') bp->debug_z += n[2] * s;
+ else if (c == '-' || c == '_') bp->debug_z -= n[2] * s;
+ else if (c == ' ') bp->debug_x = bp->debug_y = bp->debug_z = 0;
+ else if (c == '\n' || c == '\r')
+ fprintf (stderr, "%.4f %.4f %.4f\n",
+ bp->debug_x, bp->debug_y, bp->debug_z);
+ else return False;
+ return True;
+ }
+#endif /* DEBUG */
+
+ return False;
+}
+
+
+#ifdef HAVE_TEXTURE
+
+static void
+load_textures (ModeInfo *mi)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ XImage *xi;
+
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ chromesphere_png, sizeof(chromesphere_png));
+ clear_gl_error();
+
+ glGenTextures (1, &bp->chrome_texture);
+ glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ xi->width, xi->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
+ check_gl_error("texture");
+
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_2D);
+}
+
+#endif /* HAVE_TEXTURE */
+
+
+static int unit_gear (ModeInfo *, GLfloat color[4]);
+static int draw_ground (ModeInfo *, GLfloat color[4]);
+static void init_walker (ModeInfo *, walker *);
+
+static void
+parse_color (ModeInfo *mi, char *key, GLfloat color[4])
+{
+ XColor xcolor;
+ char *string = get_string_resource (mi->dpy, key, "RobotColor");
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ key, string);
+ exit (1);
+ }
+
+ color[0] = xcolor.red / 65536.0;
+ color[1] = xcolor.green / 65536.0;
+ color[2] = xcolor.blue / 65536.0;
+ color[3] = 1;
+}
+
+
+ENTRYPOINT void
+init_robot (ModeInfo *mi)
+{
+ robot_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_robot (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+# ifdef HAVE_TEXTURE
+ if (!wire && do_texture)
+ load_textures (mi);
+# endif
+
+ bp->user_trackball = gltrackball_init (False);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+ char *key = 0;
+ GLfloat spec1[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat spec2[4] = {0.40, 0.40, 0.70, 1.0};
+ GLfloat *spec = 0;
+ GLfloat shiny = 20;
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 0, 0, 1);
+ glScalef (6, 6, 6);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+
+ switch (i) {
+ case ROBOT_BODY_1:
+ key = "bodyColor";
+ spec = spec1;
+ shiny = 128;
+# ifdef HAVE_TEXTURE
+ if (do_texture)
+ {
+ glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ }
+# endif
+ break;
+ case ROBOT_DOME:
+ key = "domeColor";
+ spec = spec1;
+ shiny = 128;
+# ifdef HAVE_TEXTURE
+ if (do_texture)
+ {
+ glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ }
+# endif
+ break;
+ case ROBOT_BODY_2:
+ key = "insideColor";
+ spec = spec2;
+ shiny = 128;
+ break;
+ case ROBOT_ARM:
+ key = "armColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case ROBOT_HAND:
+ key = "handColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case ROBOT_LEG:
+ key = "legColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case ROBOT_CRANK:
+ key = "crankColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case ROBOT_ROTATOR:
+ key = "wheelColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case ROBOT_GEAR:
+ key = "gearColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case ROBOT_GEARBOX:
+ key = "gearboxColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case ROBOT_WIREFRAME:
+ key = "wireColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ case GROUND:
+ key = "groundColor";
+ spec = spec2;
+ shiny = 20;
+ break;
+ default:
+ abort();
+ }
+
+ parse_color (mi, key, bp->component_colors[i]);
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+
+ switch (i) {
+ case ROBOT_DOME:
+ if (! robot_dome)
+ robot_dome = (struct gllist *) calloc (1, sizeof(*robot_dome));
+ robot_dome->points = unit_dome (32, 32, MI_IS_WIREFRAME(mi));
+ break;
+ case ROBOT_GEAR:
+ if (! robot_gear)
+ robot_gear = (struct gllist *) calloc (1, sizeof(*robot_gear));
+ robot_gear->points = unit_gear (mi, bp->component_colors[i]);
+ break;
+ case GROUND:
+ if (! ground)
+ ground = (struct gllist *) calloc (1, sizeof(*ground));
+ ground->points = draw_ground (mi, bp->component_colors[i]);
+ break;
+ case ROBOT_WIREFRAME:
+ glLineWidth (0.3);
+ renderList (gll, True);
+ break;
+ default:
+ renderList (gll, wire);
+ /* glColor3f (1, 1, 1); renderListNormals (gll, 100, True); */
+ /* glColor3f (1, 1, 0); renderListNormals (gll, 100, False); */
+ break;
+ }
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glEndList ();
+ }
+
+# ifdef DEBUG
+ if (debug_p) MI_COUNT(mi) = 1;
+# endif
+
+ bp->nwalkers = MI_COUNT(mi);
+ bp->walkers = (walker *) calloc (bp->nwalkers, sizeof (walker));
+
+ for (i = 0; i < bp->nwalkers; i++)
+ init_walker (mi, &bp->walkers[i]);
+
+ /* Since #0 is the one we track, make sure it doesn't walk too straight.
+ */
+ bp->walkers[0].balance *= 1.5;
+
+# ifdef WORDBUBBLES
+ bp->font_data = load_texture_font (mi->dpy, "labelFont");
+ bp->max_lines = get_integer_resource (mi->dpy, "textLines", "TextLines");
+ bp->tc = textclient_open (MI_DISPLAY (mi));
+
+ parse_color (mi, "textColor", bp->text_color);
+ parse_color (mi, "textBackground", bp->text_bg);
+ parse_color (mi, "textBorderColor", bp->text_bd);
+
+ reshape_robot (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+# endif /* WORDBUBBLES */
+
+# ifdef DEBUG
+ if (!debug_p)
+# endif
+ /* Let's tilt the floor a little. */
+ gltrackball_reset (bp->user_trackball,
+ -0.6 + frand(1.2),
+ -0.6 + frand(0.2));
+}
+
+
+static int
+draw_component (ModeInfo *mi, int i)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
+ bp->component_colors[i]);
+ glCallList (bp->dlists[i]);
+ return (*all_objs[i])->points / 3;
+}
+
+static int
+draw_transparent_component (ModeInfo *mi, int i, GLfloat alpha)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int count = 0;
+
+ if (alpha < 0) return 0;
+ if (alpha > 1) alpha = 1;
+ bp->component_colors[i][3] = alpha;
+
+ if (wire || alpha >= 1)
+ return draw_component (mi, i);
+
+ /* Draw into the depth buffer but not the frame buffer */
+ glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ count += draw_component (mi, i);
+
+ /* Now draw into the frame buffer only where there's already depth */
+ glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDepthFunc (GL_EQUAL);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ count += draw_component (mi, i);
+ glDepthFunc (GL_LESS);
+ glDisable (GL_BLEND);
+ return count;
+}
+
+
+
+static int
+draw_arm_half (ModeInfo *mi, walker *f)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_transparent_component (mi, ROBOT_ARM, f->body_transparency);
+ glPopMatrix();
+ return count;
+}
+
+static int
+draw_hand_half (ModeInfo *mi, walker *f)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_transparent_component (mi, ROBOT_HAND, f->body_transparency);
+ glPopMatrix();
+ return count;
+}
+
+
+/* rotation of arm: 0-360.
+ openness of fingers: 0.0 - 1.0.
+ */
+static int
+draw_arm (ModeInfo *mi, walker *f, GLfloat left_p, GLfloat rot, GLfloat open)
+{
+ int count = 0;
+ GLfloat arm_x = 4766; /* distance from origin to arm axis */
+ GLfloat arm_y = 12212;
+
+ open *= 5.5; /* scale of finger range */
+
+# ifdef DEBUG
+ if (debug_p) rot = 0;
+# endif
+
+ glPushMatrix();
+
+ if (! left_p)
+ glTranslatef (0, 0, arm_x * 2);
+
+ glTranslatef (0, arm_y, -arm_x); /* move to origin */
+ glRotatef (rot, 1, 0, 0);
+ glTranslatef (0, -arm_y, arm_x); /* move back */
+
+ glFrontFace(GL_CCW);
+ count += draw_arm_half (mi, f);
+
+ glScalef (1, -1, 1);
+ glTranslatef (0, -arm_y * 2, 0);
+ glFrontFace(GL_CW);
+ count += draw_arm_half (mi, f);
+
+ glPushMatrix();
+ glTranslatef (0, 0, -arm_x * 2);
+ glScalef (1, 1, -1);
+ glFrontFace(GL_CCW);
+ count += draw_arm_half (mi, f);
+
+ glScalef (1, -1, 1);
+ glTranslatef (0, -arm_y * 2, 0);
+ glFrontFace(GL_CW);
+ count += draw_arm_half (mi, f);
+ glPopMatrix();
+
+ glTranslatef (0, 0, open);
+ glFrontFace(GL_CW);
+ count += draw_hand_half (mi, f);
+
+ glTranslatef (0, 0, -open);
+ glScalef (1, 1, -1);
+ glTranslatef (0, 0, arm_x * 2);
+ glFrontFace(GL_CCW);
+ glTranslatef (0, 0, open);
+ count += draw_hand_half (mi, f);
+
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_body_half (ModeInfo *mi, walker *f, Bool inside_p)
+{
+ int count = 0;
+ int which = (inside_p ? ROBOT_BODY_2 : ROBOT_BODY_1);
+ glPushMatrix();
+ count += draw_transparent_component (mi, which, f->body_transparency);
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_body (ModeInfo *mi, walker *f, Bool inside_p)
+{
+ int count = 0;
+ glPushMatrix();
+
+ glFrontFace(GL_CCW);
+ count += draw_body_half (mi, f, inside_p);
+
+ glScalef (1, 1, -1);
+ glFrontFace(GL_CW);
+ count += draw_body_half (mi, f, inside_p);
+
+ glPopMatrix();
+
+ return count;
+}
+
+
+static int
+draw_gearbox_half (ModeInfo *mi)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_component (mi, ROBOT_GEARBOX);
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_gearbox (ModeInfo *mi)
+{
+ int count = 0;
+ glPushMatrix();
+
+ glFrontFace(GL_CCW);
+ count += draw_gearbox_half (mi);
+
+ glScalef (1, 1, -1);
+ glFrontFace(GL_CW);
+ count += draw_gearbox_half (mi);
+
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+unit_gear (ModeInfo *mi, GLfloat color[4])
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ gear G = { 0, };
+ gear *g = &G;
+
+ g->r = 0.5;
+ g->nteeth = 16;
+ g->tooth_h = 0.12;
+ g->thickness = 0.32;
+ g->thickness2 = g->thickness * 0.5;
+ g->thickness3 = g->thickness;
+ g->inner_r = g->r * 0.7;
+ g->inner_r2 = g->r * 0.4;
+ g->inner_r3 = g->r * 0.1;
+ g->size = INVOLUTE_LARGE;
+
+ g->color[0] = g->color2[0] = color[0];
+ g->color[1] = g->color2[1] = color[1];
+ g->color[2] = g->color2[2] = color[2];
+ g->color[3] = g->color2[3] = color[3];
+
+ return draw_involute_gear (g, wire);
+}
+
+
+static int
+draw_gear (ModeInfo *mi)
+{
+ int count = 0;
+ GLfloat n = 350;
+ glScalef (n, n, n);
+ count += draw_component (mi, ROBOT_GEAR);
+ return count;
+}
+
+
+static int
+draw_crank (ModeInfo *mi, walker *f, GLfloat rot)
+{
+ int count = 0;
+ GLfloat origin = 12210.0;
+
+ rot = -rot;
+
+ glPushMatrix();
+
+ glTranslatef (0, origin, 0); /* position at origin */
+ glRotatef (rot, 0, 0, 1);
+
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ count += draw_gear (mi);
+ glPopMatrix();
+
+ glTranslatef (0, -origin, 0); /* move back */
+
+ glFrontFace(GL_CCW);
+ count += draw_component (mi, ROBOT_CRANK);
+
+ glPopMatrix();
+
+ return count;
+}
+
+
+static int
+draw_rotator_half (ModeInfo *mi)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_component (mi, ROBOT_ROTATOR);
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_rotator (ModeInfo *mi, walker *f, GLfloat rot)
+{
+ int count = 0;
+ GLfloat origin = 10093.0;
+
+ glPushMatrix();
+
+ glTranslatef (0, origin, 0); /* position at origin */
+ glRotatef (rot, 0, 0, 1);
+
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ count += draw_gear (mi);
+ glPopMatrix();
+
+# ifdef DEBUG
+ if (debug_p)
+ {
+ glDisable(GL_LIGHTING);
+ glBegin(GL_LINES);
+ glVertex3f(0, 0, -3000);
+ glVertex3f(0, 0, 3000);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ }
+# endif
+
+ glTranslatef (0, -origin, 0); /* move back */
+
+ glFrontFace(GL_CCW);
+ count += draw_rotator_half (mi);
+
+ glScalef (1, 1, -1);
+ glFrontFace(GL_CW);
+ glRotatef (180, 0, 0, 1);
+ glTranslatef (0, -origin * 2, 0); /* move back */
+ count += draw_rotator_half (mi);
+
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_leg_half (ModeInfo *mi)
+{
+ int count = 0;
+ glPushMatrix();
+ count += draw_component (mi, ROBOT_LEG);
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_wireframe (ModeInfo *mi, walker *f)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int count = 0;
+ GLfloat alpha = 0.6 - f->body_transparency;
+ if (alpha < 0) return 0;
+ alpha *= 0.3;
+ if (!wire) glDisable (GL_LIGHTING);
+ glPushMatrix();
+ count += draw_transparent_component (mi, ROBOT_WIREFRAME, alpha);
+ glPopMatrix();
+ if (!wire) glEnable (GL_LIGHTING);
+ return count;
+}
+
+
+static int
+draw_leg (ModeInfo *mi, GLfloat rot, Bool left_p)
+{
+ int count = 0;
+ GLfloat x, y;
+ GLfloat leg_distance = 9401; /* distance from ground to leg axis */
+ GLfloat rot_distance = 10110; /* distance from ground to rotator axis */
+ GLfloat pin_distance = 14541; /* distance from ground to stop pin */
+ GLfloat orbit_r = rot_distance - leg_distance; /* radius of rotation */
+
+ /* Actually it's the bottom of the pin minus its diameter, or something. */
+ pin_distance -= 590;
+
+ glPushMatrix();
+
+ if (left_p)
+ glRotatef (180, 0, 1, 0);
+
+ if (!left_p) rot = -(rot + 180);
+
+ rot -= 90;
+
+ x = orbit_r * cos (-rot * M_PI / 180);
+ y = orbit_r * sin (-rot * M_PI / 180);
+
+ {
+ /* Rotate the leg by angle B of the right A
+ triangle ABC, where: /:
+ / :
+ A = position of stop pin / :
+ D = position of rotator wheel's axis , - ~ ~ ~ - ,
+ C = D + y , ' / : ' ,
+ B = D + xy (leg's axis) , / : ,
+ , / : ,
+ So: , / : ,
+ H = dist(A,B) , / D ,
+ O = dist(A,C) , / : ,
+ sin(th) = O/H , / : ,
+ th = asin(O/H) B ~ ~ ~ ~ ~ C .
+ , , '
+ ' - , _ _ _ , '
+ */
+ GLfloat Ay = pin_distance - leg_distance;
+ GLfloat Cx = 0, Cy = y;
+ GLfloat Bx = x;
+ GLfloat dBC = Cx - Bx;
+ GLfloat dAC = Cy - Ay;
+ GLfloat dAB = sqrt (dBC*dBC + dAC*dAC);
+ GLfloat th = asin (dAC / dAB);
+ rot = th / (M_PI / 180.0);
+ rot += 90;
+ if (dBC > 0) rot = 360-rot;
+ }
+
+ glTranslatef (0, orbit_r, 0); /* position on rotator axis */
+ glTranslatef (x, y, 0);
+
+ glTranslatef (0, leg_distance, 0); /* position on leg axis */
+ glRotatef(rot, 0, 0, 1);
+ glTranslatef (0, -leg_distance, 0); /* move back */
+
+ glFrontFace(GL_CCW);
+ count += draw_leg_half (mi);
+
+ glScalef (-1, 1, 1);
+ glFrontFace(GL_CW);
+ count += draw_leg_half (mi);
+
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_dome (ModeInfo *mi, walker *f)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int which = ROBOT_DOME;
+ int count = 0;
+ GLfloat n = 8.3;
+ GLfloat trans = f->body_transparency;
+ GLfloat max = 0.7;
+ GLfloat dome_y = 15290;
+
+ if (trans < 0) trans = 0;
+ if (trans > max) trans = max;
+
+ if (!wire) glEnable (GL_BLEND);
+
+ glPushMatrix();
+ glTranslatef (0, dome_y, 0);
+ glScalef (100, 100, 100);
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0.35, 0, 0);
+ glScalef (n, n, n);
+ glFrontFace(GL_CCW);
+ bp->component_colors[which][3] = trans;
+ count += draw_component (mi, which);
+ glPopMatrix();
+
+ if (!wire) glDisable (GL_BLEND);
+
+ return count;
+}
+
+
+/* Is this robot overlapping any other?
+ */
+static Bool
+collision_p (ModeInfo *mi, walker *w, GLfloat extra_space)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ if (MI_COUNT(mi) <= 1) return False;
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ walker *w2 = &bp->walkers[i];
+ GLfloat min = 0.75 + extra_space;
+ GLfloat d, dx, dy;
+ if (w == w2) continue;
+ dx = w->x - w2->x;
+ dy = w->y - w2->y;
+ d = (dx*dx + dy*dy);
+ if (d <= min*min) return True;
+ }
+ return False;
+}
+
+
+/* I couldn't figure out a straightforward trig solution to the
+ forward/backward tilting that happens as weight passes from one
+ foot to another, so I just built a tool to eyeball it manually.
+ { vertical_translation, rotation, forward_translation }
+ */
+static const struct { GLfloat up, rot, fwd; } wobble_profile[360] = {
+ { 0.0000, 0.00, 0.0000 }, /* 0 */
+ { 0.0000, -0.01, 0.0025 },
+ { 0.0000, -0.25, 0.0040 },
+ { 0.0000, -0.41, 0.0060 },
+ { 0.0000, -0.62, 0.0080 },
+ { 0.0000, -0.80, 0.0095 },
+ { 0.0000, -0.90, 0.0120 },
+ { 0.0000, -1.10, 0.0135 },
+ { 0.0000, -1.25, 0.0150 },
+ { 0.0000, -1.40, 0.0175 },
+ { 0.0000, -1.50, 0.0195 }, /* 10 */
+ { 0.0000, -1.70, 0.0215 },
+ { 0.0000, -1.80, 0.0230 },
+ { 0.0000, -2.00, 0.0250 },
+ { 0.0000, -2.10, 0.0270 },
+ { -0.0005, -2.30, 0.0290 },
+ { -0.0005, -2.50, 0.0305 },
+ { -0.0005, -2.60, 0.0330 },
+ { -0.0005, -2.70, 0.0330 },
+ { -0.0005, -2.90, 0.0350 },
+ { -0.0005, -3.00, 0.0365 }, /* 20 */
+ { -0.0010, -3.20, 0.0380 },
+ { -0.0005, -3.30, 0.0400 },
+ { -0.0010, -3.50, 0.0420 },
+ { -0.0010, -3.70, 0.0440 },
+ { -0.0010, -3.80, 0.0460 },
+ { -0.0010, -3.90, 0.0470 },
+ { -0.0015, -4.10, 0.0500 },
+ { -0.0015, -4.20, 0.0515 },
+ { -0.0015, -4.40, 0.0535 },
+ { -0.0015, -4.50, 0.0550 }, /* 30 */
+ { -0.0015, -4.60, 0.0565 },
+ { -0.0020, -4.80, 0.0585 },
+ { -0.0020, -5.00, 0.0600 },
+ { -0.0020, -5.10, 0.0620 },
+ { -0.0025, -5.20, 0.0635 },
+ { -0.0025, -5.40, 0.0655 },
+ { -0.0025, -5.50, 0.0675 },
+ { -0.0025, -5.60, 0.0690 },
+ { -0.0030, -5.80, 0.0710 },
+ { -0.0030, -5.90, 0.0720 }, /* 40 */
+ { -0.0030, -6.00, 0.0740 },
+ { -0.0035, -6.10, 0.0760 },
+ { -0.0035, -6.30, 0.0790 },
+ { -0.0040, -6.40, 0.0805 },
+ { -0.0040, -6.50, 0.0820 },
+ { -0.0040, -6.60, 0.0835 },
+ { -0.0045, -6.80, 0.0855 },
+ { -0.0045, -6.90, 0.0870 },
+ { -0.0050, -7.00, 0.0885 },
+ { -0.0050, -7.20, 0.0900 }, /* 50 */
+ { -0.0050, -7.20, 0.0915 },
+ { -0.0055, -7.40, 0.0930 },
+ { -0.0055, -7.50, 0.0945 },
+ { -0.0060, -7.60, 0.0960 },
+ { -0.0060, -7.70, 0.0970 },
+ { -0.0065, -7.80, 0.0985 },
+ { -0.0060, -7.70, 0.0995 },
+ { -0.0060, -7.60, 0.1010 },
+ { -0.0060, -7.50, 0.1020 },
+ { -0.0055, -7.30, 0.1030 }, /* 60 */
+ { -0.0050, -7.10, 0.1040 },
+ { -0.0050, -6.90, 0.1050 },
+ { -0.0045, -6.80, 0.1065 },
+ { -0.0045, -6.50, 0.1075 },
+ { -0.0040, -6.40, 0.1085 },
+ { -0.0040, -6.20, 0.1095 },
+ { -0.0040, -6.00, 0.1105 },
+ { -0.0035, -5.80, 0.1115 },
+ { -0.0030, -5.50, 0.1125 },
+ { -0.0030, -5.40, 0.1135 }, /* 70 */
+ { -0.0030, -5.10, 0.1145 },
+ { -0.0030, -4.90, 0.1150 },
+ { -0.0025, -4.70, 0.1160 },
+ { -0.0025, -4.40, 0.1165 },
+ { -0.0025, -4.20, 0.1175 },
+ { -0.0020, -3.90, 0.1180 },
+ { -0.0020, -3.70, 0.1185 },
+ { -0.0020, -3.40, 0.1190 },
+ { -0.0020, -3.10, 0.1195 },
+ { -0.0020, -2.90, 0.1200 }, /* 80 */
+ { -0.0015, -2.60, 0.1200 },
+ { -0.0015, -2.30, 0.1205 },
+ { -0.0015, -2.00, 0.1210 },
+ { -0.0015, -1.80, 0.1215 },
+ { -0.0015, -1.50, 0.1215 },
+ { -0.0015, -1.20, 0.1215 },
+ { -0.0015, -0.90, 0.1215 },
+ { -0.0015, -0.60, 0.1215 },
+ { -0.0015, -0.30, 0.1215 },
+ { -0.0010, 0.00, 0.1215 }, /* 90 */
+ { -0.0010, 0.30, 0.1215 },
+ { -0.0010, 0.60, 0.1215 },
+ { -0.0010, 0.90, 0.1215 },
+ { -0.0010, 1.20, 0.1215 },
+ { -0.0015, 1.40, 0.1215 },
+ { -0.0015, 1.70, 0.1215 },
+ { -0.0015, 2.00, 0.1215 },
+ { -0.0015, 2.30, 0.1215 },
+ { -0.0015, 2.60, 0.1215 },
+ { -0.0015, 2.80, 0.1220 }, /* 100 */
+ { -0.0020, 3.10, 0.1225 },
+ { -0.0020, 3.30, 0.1230 },
+ { -0.0020, 3.60, 0.1235 },
+ { -0.0020, 3.90, 0.1240 },
+ { -0.0025, 4.10, 0.1245 },
+ { -0.0025, 4.40, 0.1250 },
+ { -0.0025, 4.60, 0.1260 },
+ { -0.0025, 4.90, 0.1265 },
+ { -0.0030, 5.10, 0.1275 },
+ { -0.0030, 5.30, 0.1285 }, /* 110 */
+ { -0.0035, 5.60, 0.1290 },
+ { -0.0035, 5.80, 0.1300 },
+ { -0.0035, 6.00, 0.1310 },
+ { -0.0040, 6.20, 0.1325 },
+ { -0.0040, 6.40, 0.1335 },
+ { -0.0045, 6.60, 0.1345 },
+ { -0.0045, 6.70, 0.1355 },
+ { -0.0050, 6.90, 0.1365 },
+ { -0.0050, 7.10, 0.1375 },
+ { -0.0055, 7.30, 0.1390 }, /* 120 */
+ { -0.0055, 7.40, 0.1400 },
+ { -0.0060, 7.50, 0.1415 },
+ { -0.0065, 8.00, 0.1425 },
+ { -0.0065, 7.80, 0.1440 },
+ { -0.0060, 7.80, 0.1455 },
+ { -0.0060, 7.60, 0.1470 },
+ { -0.0055, 7.50, 0.1485 },
+ { -0.0055, 7.40, 0.1500 },
+ { -0.0050, 7.30, 0.1515 },
+ { -0.0050, 7.20, 0.1530 }, /* 130 */
+ { -0.0050, 7.00, 0.1545 },
+ { -0.0045, 6.90, 0.1560 },
+ { -0.0045, 6.80, 0.1575 },
+ { -0.0040, 6.70, 0.1590 },
+ { -0.0040, 6.50, 0.1605 },
+ { -0.0040, 6.40, 0.1625 },
+ { -0.0035, 6.30, 0.1640 },
+ { -0.0035, 6.10, 0.1655 },
+ { -0.0030, 6.10, 0.1670 },
+ { -0.0030, 5.90, 0.1690 }, /* 140 */
+ { -0.0030, 5.70, 0.1705 },
+ { -0.0025, 5.70, 0.1720 },
+ { -0.0025, 5.50, 0.1740 },
+ { -0.0025, 5.40, 0.1755 },
+ { -0.0025, 5.20, 0.1775 },
+ { -0.0020, 5.10, 0.1790 },
+ { -0.0020, 5.00, 0.1810 },
+ { -0.0020, 4.80, 0.1825 },
+ { -0.0015, 4.70, 0.1840 },
+ { -0.0015, 4.60, 0.1860 }, /* 150 */
+ { -0.0015, 4.40, 0.1880 },
+ { -0.0015, 4.20, 0.1900 },
+ { -0.0015, 4.10, 0.1915 },
+ { -0.0010, 4.00, 0.1935 },
+ { -0.0010, 3.80, 0.1955 },
+ { -0.0010, 3.70, 0.1970 },
+ { -0.0010, 3.50, 0.1990 },
+ { -0.0005, 3.40, 0.2010 },
+ { -0.0010, 3.20, 0.2025 },
+ { -0.0005, 3.10, 0.2045 }, /* 160 */
+ { -0.0005, 2.90, 0.2065 },
+ { -0.0005, 2.80, 0.2085 },
+ { -0.0005, 2.60, 0.2105 },
+ { -0.0005, 2.50, 0.2120 },
+ { -0.0005, 2.30, 0.2140 },
+ { -0.0005, 2.20, 0.2160 },
+ { -0.0005, 2.00, 0.2180 },
+ { 0.0000, 1.90, 0.2200 },
+ { 0.0000, 1.70, 0.2220 },
+ { 0.0000, 1.60, 0.2235 }, /* 170 */
+ { 0.0000, 1.40, 0.2255 },
+ { 0.0000, 1.30, 0.2275 },
+ { 0.0000, 1.10, 0.2295 },
+ { 0.0000, 0.90, 0.2315 },
+ { 0.0000, 0.80, 0.2335 },
+ { 0.0000, 0.60, 0.2355 },
+ { 0.0000, 0.50, 0.2375 },
+ { 0.0000, 0.30, 0.2395 },
+ { 0.0000, 0.10, 0.2415 },
+ { 0.0000, 0.00, 0.2430 }, /* 180 */
+ { 0.0000, -0.10, 0.2450 },
+ { 0.0000, -0.30, 0.2470 },
+ { 0.0000, -0.40, 0.2490 },
+ { 0.0000, -0.60, 0.2510 },
+ { 0.0000, -0.80, 0.2530 },
+ { 0.0000, -0.90, 0.2550 },
+ { 0.0000, -1.10, 0.2570 },
+ { 0.0000, -1.20, 0.2590 },
+ { 0.0000, -1.40, 0.2610 },
+ { 0.0000, -1.50, 0.2625 }, /* 190 */
+ { 0.0000, -1.70, 0.2645 },
+ { 0.0000, -1.80, 0.2665 },
+ { -0.0005, -2.00, 0.2685 },
+ { -0.0005, -2.10, 0.2705 },
+ { -0.0005, -2.30, 0.2725 },
+ { -0.0005, -2.40, 0.2740 },
+ { -0.0005, -2.60, 0.2760 },
+ { -0.0005, -2.80, 0.2780 },
+ { -0.0005, -2.90, 0.2800 },
+ { -0.0005, -3.00, 0.2820 }, /* 200 */
+ { -0.0010, -3.20, 0.2835 },
+ { -0.0005, -3.30, 0.2855 },
+ { -0.0010, -3.50, 0.2875 },
+ { -0.0010, -3.70, 0.2895 },
+ { -0.0010, -3.80, 0.2910 },
+ { -0.0010, -3.90, 0.2930 },
+ { -0.0010, -4.00, 0.2950 },
+ { -0.0015, -4.20, 0.2965 },
+ { -0.0015, -4.40, 0.2985 },
+ { -0.0015, -4.50, 0.3000 }, /* 210 */
+ { -0.0015, -4.60, 0.3020 },
+ { -0.0020, -4.80, 0.3040 },
+ { -0.0020, -5.00, 0.3055 },
+ { -0.0020, -5.00, 0.3075 },
+ { -0.0025, -5.20, 0.3090 },
+ { -0.0025, -5.30, 0.3110 },
+ { -0.0025, -5.50, 0.3125 },
+ { -0.0025, -5.60, 0.3140 },
+ { -0.0030, -5.70, 0.3160 },
+ { -0.0030, -5.90, 0.3175 }, /* 220 */
+ { -0.0030, -6.00, 0.3190 },
+ { -0.0035, -6.10, 0.3210 },
+ { -0.0035, -6.30, 0.3225 },
+ { -0.0040, -6.40, 0.3240 },
+ { -0.0040, -6.50, 0.3255 },
+ { -0.0040, -6.60, 0.3270 },
+ { -0.0045, -6.80, 0.3290 },
+ { -0.0045, -6.90, 0.3305 },
+ { -0.0050, -7.00, 0.3320 },
+ { -0.0050, -7.20, 0.3335 }, /* 230 */
+ { -0.0050, -7.20, 0.3350 },
+ { -0.0055, -7.40, 0.3365 },
+ { -0.0055, -7.50, 0.3380 },
+ { -0.0060, -7.60, 0.3390 },
+ { -0.0060, -7.70, 0.3405 },
+ { -0.0065, -7.80, 0.3420 },
+ { -0.0060, -7.60, 0.3425 },
+ { -0.0060, -7.50, 0.3440 },
+ { -0.0055, -7.40, 0.3455 },
+ { -0.0055, -7.20, 0.3470 }, /* 240 */
+ { -0.0050, -7.10, 0.3480 },
+ { -0.0050, -6.90, 0.3490 },
+ { -0.0045, -6.80, 0.3500 },
+ { -0.0045, -6.50, 0.3510 },
+ { -0.0040, -6.40, 0.3520 },
+ { -0.0040, -6.10, 0.3535 },
+ { -0.0035, -6.00, 0.3545 },
+ { -0.0035, -5.80, 0.3550 },
+ { -0.0030, -5.50, 0.3560 },
+ { -0.0030, -5.30, 0.3570 }, /* 250 */
+ { -0.0030, -5.10, 0.3580 },
+ { -0.0030, -4.90, 0.3585 },
+ { -0.0025, -4.70, 0.3595 },
+ { -0.0025, -4.40, 0.3600 },
+ { -0.0020, -4.10, 0.3610 },
+ { -0.0020, -3.90, 0.3615 },
+ { -0.0020, -3.70, 0.3620 },
+ { -0.0020, -3.30, 0.3625 },
+ { -0.0020, -3.10, 0.3630 },
+ { -0.0015, -2.80, 0.3635 }, /* 260 */
+ { -0.0015, -2.60, 0.3640 },
+ { -0.0015, -2.40, 0.3645 },
+ { -0.0015, -2.00, 0.3645 },
+ { -0.0015, -1.80, 0.3650 },
+ { -0.0015, -1.40, 0.3650 },
+ { -0.0015, -1.20, 0.3655 },
+ { -0.0010, -0.90, 0.3655 },
+ { -0.0010, -0.60, 0.3655 },
+ { -0.0010, -0.30, 0.3655 },
+ { -0.0010, 0.00, 0.3655 }, /* 270 */
+ { -0.0010, 0.30, 0.3655 },
+ { -0.0010, 0.60, 0.3655 },
+ { -0.0010, 0.90, 0.3655 },
+ { -0.0015, 1.10, 0.3655 },
+ { -0.0015, 1.40, 0.3655 },
+ { -0.0015, 1.70, 0.3655 },
+ { -0.0015, 1.90, 0.3660 },
+ { -0.0015, 2.20, 0.3660 },
+ { -0.0015, 2.50, 0.3665 },
+ { -0.0015, 2.80, 0.3670 }, /* 280 */
+ { -0.0015, 3.10, 0.3675 },
+ { -0.0020, 3.40, 0.3680 },
+ { -0.0020, 3.70, 0.3685 },
+ { -0.0020, 3.90, 0.3690 },
+ { -0.0025, 4.10, 0.3695 },
+ { -0.0025, 4.40, 0.3700 },
+ { -0.0025, 4.60, 0.3710 },
+ { -0.0025, 4.80, 0.3715 },
+ { -0.0025, 5.00, 0.3730 },
+ { -0.0030, 5.40, 0.3735 }, /* 290 */
+ { -0.0035, 5.60, 0.3745 },
+ { -0.0035, 5.80, 0.3755 },
+ { -0.0035, 6.00, 0.3765 },
+ { -0.0040, 6.20, 0.3775 },
+ { -0.0045, 6.50, 0.3785 },
+ { -0.0045, 6.60, 0.3795 },
+ { -0.0045, 6.80, 0.3805 },
+ { -0.0050, 7.00, 0.3815 },
+ { -0.0050, 7.10, 0.3825 },
+ { -0.0055, 7.20, 0.3840 }, /* 300 */
+ { -0.0055, 7.40, 0.3850 },
+ { -0.0060, 7.50, 0.3865 },
+ { -0.0060, 7.70, 0.3875 },
+ { -0.0065, 7.80, 0.3890 },
+ { -0.0060, 7.80, 0.3900 },
+ { -0.0060, 7.60, 0.3915 },
+ { -0.0055, 7.60, 0.3930 },
+ { -0.0055, 7.40, 0.3945 },
+ { -0.0050, 7.30, 0.3960 },
+ { -0.0050, 7.20, 0.3975 }, /* 310 */
+ { -0.0050, 7.00, 0.3990 },
+ { -0.0045, 6.90, 0.4005 },
+ { -0.0045, 6.80, 0.4020 },
+ { -0.0040, 6.70, 0.4035 },
+ { -0.0040, 6.60, 0.4050 },
+ { -0.0040, 6.40, 0.4065 },
+ { -0.0035, 6.30, 0.4085 },
+ { -0.0035, 6.20, 0.4100 },
+ { -0.0030, 6.10, 0.4115 },
+ { -0.0030, 5.90, 0.4130 }, /* 320 */
+ { -0.0030, 5.80, 0.4150 },
+ { -0.0025, 5.70, 0.4165 },
+ { -0.0025, 5.50, 0.4180 },
+ { -0.0025, 5.40, 0.4200 },
+ { -0.0025, 5.20, 0.4215 },
+ { -0.0020, 5.10, 0.4235 },
+ { -0.0020, 5.00, 0.4250 },
+ { -0.0020, 4.80, 0.4270 },
+ { -0.0015, 4.70, 0.4285 },
+ { -0.0015, 4.60, 0.4305 }, /* 330 */
+ { -0.0015, 4.40, 0.4325 },
+ { -0.0015, 4.20, 0.4340 },
+ { -0.0015, 4.10, 0.4360 },
+ { -0.0010, 4.00, 0.4375 },
+ { -0.0010, 3.80, 0.4395 },
+ { -0.0010, 3.70, 0.4415 },
+ { -0.0010, 3.50, 0.4435 },
+ { -0.0005, 3.40, 0.4450 },
+ { -0.0010, 3.20, 0.4470 },
+ { -0.0005, 3.10, 0.4490 }, /* 340 */
+ { -0.0005, 2.90, 0.4510 },
+ { -0.0005, 2.80, 0.4525 },
+ { -0.0005, 2.60, 0.4545 },
+ { -0.0005, 2.40, 0.4565 },
+ { -0.0005, 2.30, 0.4585 },
+ { -0.0005, 2.20, 0.4605 },
+ { -0.0005, 2.00, 0.4620 },
+ { 0.0000, 1.90, 0.4640 },
+ { 0.0000, 1.70, 0.4660 },
+ { 0.0000, 1.60, 0.4680 }, /* 350 */
+ { 0.0000, 1.40, 0.4700 },
+ { 0.0000, 1.20, 0.4720 },
+ { 0.0000, 1.10, 0.4740 },
+ { 0.0000, 0.90, 0.4760 },
+ { 0.0000, 0.80, 0.4780 },
+ { 0.0000, 0.60, 0.4795 },
+ { 0.0000, 0.50, 0.4815 },
+ { 0.0000, 0.30, 0.4835 },
+ { 0.0000, 0.20, 0.4855 }, /* 359 */
+};
+
+
+/* Turn the crank by 1 degree, which moves the legs and displaces the robot.
+ */
+static void
+tick_walker (ModeInfo *mi, walker *f)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int deg;
+ GLfloat th, fwd;
+
+ if (bp->button_down_p) return;
+
+ f->crank_rot++;
+ deg = ((int) (f->crank_rot + 0.5)) % 360;
+
+# ifdef DEBUG
+ if (debug_p)
+ {
+ f->crank_rot = bp->debug_x;
+ f->pitch = wobble_profile[deg].rot;
+ f->z = wobble_profile[deg].up;
+ }
+ else
+# endif /* DEBUG */
+
+ if (deg == 0)
+ {
+ fwd = wobble_profile[deg].fwd;
+ f->pitch = wobble_profile[deg].rot;
+ f->z = wobble_profile[deg].up;
+ }
+ else
+ {
+ fwd = (wobble_profile[deg].fwd - wobble_profile[deg-1].fwd);
+ f->pitch += (wobble_profile[deg].rot - wobble_profile[deg-1].rot);
+ f->z += (wobble_profile[deg].up - wobble_profile[deg-1].up);
+ }
+
+ /* Lean slightly toward the foot that is raised off the ground. */
+ f->roll = -2.5 * sin ((deg - 90) * M_PI / 180);
+
+ if (!(random() % 10))
+ {
+ GLfloat b = f->balance / 10.0;
+ int s = (f->balance > 0 ? 1 : -1);
+ if (s < 0) b = -b;
+ f->facing += s * frand (b);
+ }
+
+# ifdef DEBUG
+ if (debug_p) fwd = 0;
+# endif
+
+ {
+ GLfloat ox = f->x;
+ GLfloat oy = f->y;
+ th = f->facing * M_PI / 180.0;
+ f->x += fwd * cos (th);
+ f->y += fwd * sin (th);
+
+ /* If moving this robot would collide with another, undo the move,
+ recoil, and randomly turn.
+ */
+ if (collision_p (mi, f, 0))
+ {
+ fwd *= -1.5;
+ f->x = ox + fwd * cos (th);
+ f->y = oy + fwd * sin (th);
+ f->facing += frand(10) - 5;
+ if (! random() % 30)
+ f->facing += frand(90) - 45;
+ }
+ }
+
+
+ if (!do_fade ||
+ opacity > 0.5) /* Don't bother fading if it's already transparent. */
+ {
+ GLfloat tick = 0.002;
+ GLfloat linger = 3;
+
+ /* If we're not fading, maybe start fading out. */
+ if (f->fading_p == 0 && ! (random() % 40000))
+ f->fading_p = -1;
+
+# ifdef DEBUG
+ if (debug_p) f->fading_p = 0;
+# endif
+
+ if (f->fading_p < 0)
+ {
+ f->body_transparency -= tick;
+ if (f->body_transparency <= -linger)
+ {
+ f->body_transparency = -linger;
+ f->fading_p = 1;
+ }
+ }
+ else if (f->fading_p > 0)
+ {
+ f->body_transparency += tick;
+ if (f->body_transparency >= opacity)
+ {
+ f->body_transparency = opacity;
+ f->fading_p = 0;
+ }
+ }
+ }
+}
+
+
+static void
+init_walker (ModeInfo *mi, walker *f)
+{
+ int i, start_tick = random() % 360;
+
+ f->crank_rot = 0;
+ f->pitch = wobble_profile[0].rot;
+ f->z = wobble_profile[0].up;
+
+ f->body_transparency = opacity;
+
+ f->hand_rot[0] = frand(180);
+ f->hand_pos[0] = 0.6 + frand(0.4);
+ f->hand_rot[1] = 180 - f->hand_rot[0];
+ f->hand_pos[1] = f->hand_pos[0];
+
+ if (! (random() % 30)) f->hand_rot[1] += frand(10);
+ if (! (random() % 30)) f->hand_pos[1] = 0.6 + frand(0.4);
+
+ f->facing = frand(360);
+ f->balance = frand(10) - 5;
+
+ if (MI_COUNT(mi) == 1)
+ f->speed = 1.0;
+ else
+ f->speed = 0.6 + frand(0.8);
+
+# ifdef DEBUG
+ if (debug_p)
+ {
+ start_tick = 0;
+ f->facing = 0;
+ f->balance = 0;
+ }
+# endif
+
+ for (i = 0; i < start_tick; i++)
+ tick_walker (mi, f);
+
+ /* Place them randomly, but non-overlapping. */
+ for (i = 0; i < 1000; i++)
+ {
+ GLfloat range = 10;
+ if (MI_COUNT(mi) > 10) range += MI_COUNT(mi) / 10.0;
+ f->x = frand(range) - range/2;
+ f->y = frand(range) - range/2;
+ if (! collision_p (mi, f, 1.5))
+ break;
+ }
+
+# ifdef DEBUG
+ if (debug_p) f->x = f->y = 0;
+# endif
+
+}
+
+
+/* Draw a robot standing in the right place, 1 unit tall.
+ */
+static int
+draw_walker (ModeInfo *mi, walker *f, const char *tag)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int count = 0;
+ glPushMatrix();
+
+ glTranslatef (f->y, f->z, f->x);
+
+ {
+ GLfloat n = 0.01;
+ glScalef (n, n, n);
+ }
+
+ glRotatef (90, 0, 1, 0);
+ glRotatef (f->facing, 0, 1, 0);
+ glRotatef (f->pitch, 0, 0, 1);
+ glRotatef (f->roll, 1, 0, 0);
+
+ {
+ GLfloat n = 0.00484; /* make it 1 unit tall */
+ glScalef (n, n, n);
+ }
+
+ count += draw_gearbox (mi);
+ count += draw_crank (mi, f, f->crank_rot);
+ count += draw_rotator (mi, f, f->crank_rot);
+ count += draw_leg (mi, f->crank_rot, False);
+ count += draw_leg (mi, f->crank_rot, True);
+ count += draw_wireframe (mi, f);
+
+ /* Draw these last, and outer shell first, to make transparency work.
+ The order in which things hit the depth buffer matters.
+ */
+ if (f->body_transparency >= 0.001)
+ {
+ count += draw_arm (mi, f, True, f->hand_rot[0], f->hand_pos[0]);
+ count += draw_arm (mi, f, False, f->hand_rot[1], f->hand_pos[1]);
+ count += draw_body (mi, f, False);
+ count += draw_body (mi, f, True);
+ count += draw_dome (mi, f);
+ }
+
+ if (tag) /* For debugging depth sorting: label each robot */
+ {
+ GLfloat m[4][4];
+ if (! wire) glDisable (GL_DEPTH_TEST);
+ glColor3f (1, 1, 1);
+ glPushMatrix();
+
+ /* Billboard rotation */
+ glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]);
+ m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
+ m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
+ m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+ glScalef (0.04, 0.04, 0.04);
+
+ print_texture_string (bp->font_data, tag);
+ glPopMatrix();
+ if (! wire) glEnable (GL_DEPTH_TEST);
+ }
+
+ glPopMatrix();
+ return count;
+}
+
+
+static int
+draw_ground (ModeInfo *mi, GLfloat color[4])
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat i, j, k;
+
+ /* When using fog, iOS apparently doesn't like lines or quads that are
+ really long, and extend very far outside of the scene. Maybe? If the
+ length of the line (cells * cell_size) is greater than 25 or so, lines
+ that are oriented steeply away from the viewer tend to disappear
+ (whether implemented as GL_LINES or as GL_QUADS).
+
+ So we do a bunch of smaller grids instead of one big one.
+ */
+ int cells = 30;
+ GLfloat cell_size = 0.8;
+ int points = 0;
+ int grids = 12;
+
+# ifdef DEBUG
+ if (debug_p) return 0;
+# endif
+
+ glPushMatrix();
+
+ glRotatef (frand(90), 0, 0, 1);
+
+ if (!wire)
+ {
+ GLfloat fog_color[4] = { 0, 0, 0, 1 };
+
+ glLineWidth (4);
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+
+ glFogi (GL_FOG_MODE, GL_EXP2);
+ glFogfv (GL_FOG_COLOR, fog_color);
+ glFogf (GL_FOG_DENSITY, 0.015);
+ glFogf (GL_FOG_START, -cells/2 * cell_size * grids);
+ glEnable (GL_FOG);
+ }
+
+ glColor4fv (color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+
+ glTranslatef (-cells * grids * cell_size / 2,
+ -cells * grids * cell_size / 2, 0);
+
+ for (j = 0; j < grids; j++)
+ {
+ glPushMatrix();
+ for (k = 0; k < grids; k++)
+ {
+ glBegin (GL_LINES);
+ for (i = -cells/2; i < cells/2; i++)
+ {
+ GLfloat a = i * cell_size;
+ GLfloat b = cells/2 * cell_size;
+ glVertex3f (a, -b, 0); glVertex3f (a, b, 0); points++;
+ glVertex3f (-b, a, 0); glVertex3f (b, a, 0); points++;
+ }
+ glEnd();
+ glTranslatef (cells * cell_size, 0, 0);
+ }
+ glPopMatrix();
+ glTranslatef (0, cells * cell_size, 0);
+ }
+
+ if (!wire)
+ {
+ glDisable (GL_LINE_SMOOTH);
+ glDisable (GL_BLEND);
+ glDisable (GL_FOG);
+ }
+
+ glPopMatrix();
+
+ return points;
+}
+
+
+/* If the target robot (robot #0) has moved too far from the point at which
+ the camera is aimed, then initiate an animation to move the observer to
+ the new spot.
+
+ Because of the jerky forward motion of the robots, just always focusing
+ on the center of the robot looks terrible, so instead we let them walk
+ a little out of the center of the frame, and then catch up.
+ */
+static void
+look_at_center (ModeInfo *mi)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat target_x = bp->walkers[0].x;
+ GLfloat target_y = bp->walkers[0].y;
+ GLfloat target_z = 0.8; /* Look a little bit above his head */
+ GLfloat max_dist = 2.5 / size;
+
+# ifdef DEBUG
+ if (debug_p) return;
+# endif
+
+ if (max_dist < 1) max_dist = 1;
+ if (max_dist > 10) max_dist = 10;
+
+ if (bp->camera_tracking_p)
+ {
+ GLfloat r = (1 - cos (bp->tracking_ratio * M_PI)) / 2;
+ bp->looking_x = bp->olooking_x + r * (target_x - bp->olooking_x);
+ bp->looking_y = bp->olooking_y + r * (target_y - bp->olooking_y);
+ bp->looking_z = bp->olooking_z + r * (target_z - bp->olooking_z);
+
+ bp->tracking_ratio += 0.02;
+ if (bp->tracking_ratio >= 1)
+ {
+ bp->camera_tracking_p = False;
+ bp->olooking_x = bp->looking_x;
+ bp->olooking_y = bp->looking_y;
+ bp->olooking_z = bp->looking_z;
+ }
+ }
+
+ if (! bp->camera_tracking_p)
+ {
+ GLfloat dist =
+ sqrt ((target_x - bp->looking_x) * (target_x - bp->looking_x) +
+ (target_y - bp->looking_y) * (target_y - bp->looking_y) +
+ (target_z - bp->looking_z) * (target_z - bp->looking_z));
+
+ if (dist > max_dist)
+ {
+ bp->camera_tracking_p = True;
+ bp->tracking_ratio = 0;
+ bp->olooking_x = bp->looking_x;
+ bp->olooking_y = bp->looking_y;
+ bp->olooking_z = bp->looking_z;
+ }
+ }
+
+ glTranslatef (-bp->looking_y, -bp->looking_z, -bp->looking_x);
+
+# if 0 /* DEBUG */
+ {
+ GLfloat th;
+ glPushMatrix();
+ glColor3f(1, 0, 0);
+ glTranslatef (target_y, target_z, target_x);
+ glBegin(GL_LINES);
+ glVertex3f(0, -target_z, 0);
+ glVertex3f(0, 1, 0);
+ glVertex3f(-0.1, 0, -0.1);
+ glVertex3f( 0.1, 0, 0.1);
+ glVertex3f(-0.1, 0, 0.1);
+ glVertex3f( 0.1, 0, -0.1);
+ glEnd();
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0, 1, 0);
+ glTranslatef (bp->looking_y, bp->looking_z, bp->looking_x);
+ glRotatef (30, 0, 1, 0);
+ glBegin(GL_LINES);
+ glVertex3f(0, -bp->looking_z, 0);
+ glVertex3f(0, 1, 0);
+ glVertex3f(-0.1, 0, -0.1);
+ glVertex3f( 0.1, 0, 0.1);
+ glVertex3f(-0.1, 0, 0.1);
+ glVertex3f( 0.1, 0, -0.1);
+ glEnd();
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0, 0, 1);
+ glTranslatef (bp->olooking_y, bp->olooking_z, bp->olooking_x);
+ glRotatef (60, 0, 1, 0);
+ glBegin(GL_LINES);
+ glVertex3f(0, -bp->olooking_z, 0);
+ glVertex3f(0, 1, 0);
+ glVertex3f(-0.1, 0, -0.1);
+ glVertex3f( 0.1, 0, 0.1);
+ glVertex3f(-0.1, 0, 0.1);
+ glVertex3f( 0.1, 0, -0.1);
+ glEnd();
+
+ glTranslatef (0, -bp->olooking_z, 0);
+ glBegin (GL_LINE_LOOP);
+ for (th = 0; th < M_PI * 2; th += 0.1)
+ glVertex3f (bp->olooking_y + max_dist * cos(th), 0,
+ bp->olooking_x + max_dist * sin(th));
+ glEnd();
+ glPopMatrix();
+ }
+# endif /* DEBUG */
+}
+
+
+#ifdef WORDBUBBLES
+
+/* Draw a cartoony word bubble.
+ W and H are the inside size, for text.
+ Origin is at bottom left.
+ The bubble frame and arrow are outside that.
+ */
+static void
+draw_bubble_box (ModeInfo *mi,
+ GLfloat width, GLfloat height,
+ GLfloat corner_radius,
+ GLfloat arrow_h, GLfloat arrow_x,
+ GLfloat fg[4], GLfloat bg[4])
+{
+
+# define CORNER_POINTS 16
+ GLfloat outline_points[ (CORNER_POINTS + 2) * 4 + 8 ][3];
+ int i = 0;
+ GLfloat th;
+ GLfloat tick = M_PI / 2 / CORNER_POINTS;
+
+ GLfloat arrow_w = arrow_h / 2;
+ GLfloat arrow_x2 = MAX(0, MIN(width - arrow_w, arrow_x));
+
+ GLfloat w2 = MAX(arrow_w, width - corner_radius * 1.10);
+ GLfloat h2 = MAX(0, height - corner_radius * 1.28);
+ GLfloat x2 = (width - w2) / 2;
+ GLfloat y2 = (height - h2) / 2;
+ /* A B C D */
+ GLfloat xa = x2 -corner_radius; /* E _------------_ */
+ GLfloat xb = x2; /* D /__| |__\ */
+ GLfloat xc = xb + w2; /* | | | | */
+ GLfloat xd = xc + corner_radius; /* C |__| EF |__| */
+ GLfloat xe = xb + arrow_x2; /* B \_|_________|_/ */
+ GLfloat xf = xe + arrow_w; /* A \| */
+
+ GLfloat ya = y2 - (corner_radius + arrow_h);
+ GLfloat yb = y2 - corner_radius;
+ GLfloat yc = y2;
+ GLfloat yd = yc + h2;
+ GLfloat ye = yd + corner_radius;
+
+ GLfloat z = 0;
+
+ /* Let the lines take precedence over the fills. */
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+
+ glColor4fv (bg);
+ glFrontFace(GL_CW);
+
+ /* top left corner */
+
+ glBegin (GL_TRIANGLE_FAN);
+ glVertex3f (xb, yd, 0);
+ for (th = 0; th < M_PI/2 + tick; th += tick)
+ {
+ GLfloat x = xb - corner_radius * cos(th);
+ GLfloat y = yd + corner_radius * sin(th);
+ glVertex3f (x, y, z);
+ outline_points[i][0] = x;
+ outline_points[i][1] = y;
+ outline_points[i][2] = z;
+ i++;
+ }
+ glEnd();
+
+ /* top edge */
+ outline_points[i][0] = xc;
+ outline_points[i][1] = ye;
+ outline_points[i][2] = z;
+ i++;
+
+ /* top right corner */
+
+ glBegin (GL_TRIANGLE_FAN);
+ glVertex3f (xc, yd, 0);
+ for (th = M_PI/2; th > -tick; th -= tick)
+ {
+ GLfloat x = xc + corner_radius * cos(th);
+ GLfloat y = yd + corner_radius * sin(th);
+ glVertex3f (x, y, z);
+ outline_points[i][0] = x;
+ outline_points[i][1] = y;
+ outline_points[i][2] = z;
+ i++;
+ }
+ glEnd();
+
+ /* right edge */
+ outline_points[i][0] = xd;
+ outline_points[i][1] = yc;
+ outline_points[i][2] = z;
+ i++;
+
+ /* bottom right corner */
+
+ glBegin (GL_TRIANGLE_FAN);
+ glVertex3f (xc, yc, 0);
+ for (th = 0; th < M_PI/2 + tick; th += tick)
+ {
+ GLfloat x = xc + corner_radius * cos(th);
+ GLfloat y = yc - corner_radius * sin(th);
+ glVertex3f (x, y, z);
+ outline_points[i][0] = x;
+ outline_points[i][1] = y;
+ outline_points[i][2] = z;
+ i++;
+ }
+ glEnd();
+
+ /* bottom right edge */
+ outline_points[i][0] = xf;
+ outline_points[i][1] = yb;
+ outline_points[i][2] = z;
+ i++;
+
+ /* arrow triangle */
+ glFrontFace(GL_CW);
+ glBegin (GL_TRIANGLES);
+
+ /* bottom arrow point */
+ outline_points[i][0] = xf;
+ outline_points[i][1] = yb;
+ outline_points[i][2] = z;
+ glVertex3f (outline_points[i][0],
+ outline_points[i][1],
+ outline_points[i][2]);
+ i++;
+
+ /* bottom right edge */
+ outline_points[i][0] = xf;
+ outline_points[i][1] = ya;
+ outline_points[i][2] = z;
+ glVertex3f (outline_points[i][0],
+ outline_points[i][1],
+ outline_points[i][2]);
+ i++;
+
+ outline_points[i][0] = xe;
+ outline_points[i][1] = yb;
+ outline_points[i][2] = z;
+ glVertex3f (outline_points[i][0],
+ outline_points[i][1],
+ outline_points[i][2]);
+ i++;
+ glEnd();
+
+
+ /* bottom left corner */
+
+ glBegin (GL_TRIANGLE_FAN);
+ glVertex3f (xb, yc, 0);
+ for (th = M_PI/2; th > -tick; th -= tick)
+ {
+ GLfloat x = xb - corner_radius * cos(th);
+ GLfloat y = yc - corner_radius * sin(th);
+ glVertex3f (x, y, z);
+ outline_points[i][0] = x;
+ outline_points[i][1] = y;
+ outline_points[i][2] = z;
+ i++;
+ }
+ glEnd();
+
+ glFrontFace(GL_CCW);
+
+ /* left edge */
+ outline_points[i][0] = xa;
+ outline_points[i][1] = yd;
+ outline_points[i][2] = z;
+ i++;
+
+ glFrontFace(GL_CW);
+ glBegin (GL_QUADS);
+ /* left box */
+ glVertex3f (xa, yd, z);
+ glVertex3f (xb, yd, z);
+ glVertex3f (xb, yc, z);
+ glVertex3f (xa, yc, z);
+
+ /* center box */
+ glVertex3f (xb, ye, z);
+ glVertex3f (xc, ye, z);
+ glVertex3f (xc, yb, z);
+ glVertex3f (xb, yb, z);
+
+ /* right box */
+ glVertex3f (xc, yd, z);
+ glVertex3f (xd, yd, z);
+ glVertex3f (xd, yc, z);
+ glVertex3f (xc, yc, z);
+
+ glEnd();
+
+ glLineWidth (2.8);
+ glColor4fv (fg);
+
+ glBegin (GL_LINE_LOOP);
+ while (i > 0)
+ glVertex3fv (outline_points[--i]);
+ glEnd();
+
+ glDisable (GL_POLYGON_OFFSET_FILL);
+}
+
+
+static void
+draw_label (ModeInfo *mi, walker *f, GLfloat y_off, GLfloat scale,
+ const char *label)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat m[4][4];
+
+ if (scale == 0) return;
+
+ if (!wire)
+ glDisable (GL_LIGHTING); /* don't light fonts */
+
+ glPushMatrix();
+
+ /* First, we translate the origin to the center of the robot.
+
+ Then we retrieve the prevailing modelview matrix, which
+ includes any rotation, wandering, and user-trackball-rolling
+ of the scene.
+
+ We set the top 3x3 cells of that matrix to be the identity
+ matrix. This removes all rotation from the matrix, while
+ leaving the translation alone. This has the effect of
+ leaving the prevailing coordinate system perpendicular to
+ the camera view: were we to draw a square face, it would
+ be in the plane of the screen.
+
+ Now we translate by `size' toward the viewer -- so that the
+ origin is *just in front* of the ball.
+
+ Then we draw the label text, allowing the depth buffer to
+ do its work: that way, labels on atoms will be occluded
+ properly when other atoms move in front of them.
+
+ This technique (of neutralizing rotation relative to the
+ observer, after both rotations and translations have been
+ applied) is known as "billboarding".
+ */
+
+ if (f)
+ glTranslatef(f->y, 0, f->x); /* get matrix */
+
+ glTranslatef (0, y_off, 0);
+
+ glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]); /* load rot. identity */
+ m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
+ m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
+ m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
+ glLoadIdentity(); /* reset modelview */
+ glMultMatrixf (&m[0][0]); /* replace with ours */
+
+ glTranslatef (0, 0, 0.1); /* move toward camera */
+
+ glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
+
+ {
+ XCharStruct e;
+ int cw, ch, w, h, ascent, descent;
+ GLfloat s;
+ GLfloat max = 24; /* max point size to avoid pixellated text */
+
+ /* Let the font be much larger on iPhone */
+ if (mi->xgwa.height <= 640 || mi->xgwa.width <= 640)
+ max *= 3;
+
+ texture_string_metrics (bp->font_data, "X", &e, &ascent, &descent);
+ cw = e.width;
+ ch = ascent + descent;
+ s = 1.0 / ch;
+ if (ch > max) s *= max/ch;
+
+ s *= scale;
+
+ texture_string_metrics (bp->font_data, label, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+
+ glScalef (s, s, 1);
+ glTranslatef (-w/2, h*2/3 + (cw * 7), 0);
+
+ glPushMatrix();
+ glTranslatef (0, -h + (ch * 1.2), -0.1);
+ draw_bubble_box (mi, w, h,
+ ch * 2, /* corner radius */
+ ch * 2.5, /* arrow height */
+ w / 2 - cw * 8, /* arrow x */
+ bp->text_bd, bp->text_bg);
+ glPopMatrix();
+
+ glColor4fv (bp->text_color);
+ glTranslatef (0, ch/2, 0);
+ print_texture_string (bp->font_data, label);
+ }
+
+ glPopMatrix();
+
+ /* More efficient to always call glEnable() with correct values
+ than to call glPushAttrib()/glPopAttrib(), since reading
+ attributes from GL does a round-trip and stalls the pipeline.
+ */
+ if (!wire)
+ glEnable (GL_LIGHTING);
+}
+
+
+static void
+fill_words (ModeInfo *mi)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ char *p = bp->words + strlen(bp->words);
+ char *c;
+ int lines = 0;
+ int max = bp->max_lines;
+
+ /* Fewer lines on iPhone */
+ if ((mi->xgwa.height <= 640 || mi->xgwa.width <= 640) &&
+ max > 4)
+ max = 4;
+
+ for (c = bp->words; c < p; c++)
+ if (*c == '\n')
+ lines++;
+
+ while (p < bp->words + sizeof(bp->words) - 1 &&
+ lines < max)
+ {
+ int c = textclient_getc (bp->tc);
+ if (c == '\n')
+ lines++;
+ if (c > 0)
+ *p++ = (char) c;
+ else
+ break;
+ }
+ *p = 0;
+
+ bp->lines = lines;
+}
+
+
+static void
+bubble (ModeInfo *mi)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int duration = 200;
+ GLfloat fade = 0.015;
+ int chance = (talk_chance <= 0.0 ? 0 :
+ talk_chance >= 0.99 ? 1 :
+ (1-talk_chance) * 1000);
+ GLfloat scale;
+ char *s0 = strdup (bp->words);
+ char *s = s0;
+ int L;
+
+ while (*s == '\n') s++;
+ L = strlen(s);
+ while (L > 0 && (s[L-1] == '\n' || s[L-1] == ' ' || s[L-1] == '\t'))
+ s[--L] = 0;
+ if (! *s) goto DONE;
+
+# ifdef DEBUG
+ if (debug_p) goto DONE;
+# endif
+
+ if (chance <= 0) goto DONE;
+
+ if (bp->bubble_tick > 0)
+ {
+ bp->bubble_tick--;
+ if (! bp->bubble_tick)
+ *bp->words = 0;
+ }
+
+ if (! bp->bubble_tick)
+ {
+ if (!(random() % chance))
+ bp->bubble_tick = duration;
+ else
+ goto DONE;
+ }
+
+ scale = (bp->bubble_tick < duration * fade
+ ? bp->bubble_tick / (duration * fade)
+ : (bp->bubble_tick > duration * (1 - fade)
+ ? 1 - ((bp->bubble_tick - duration * (1 - fade))
+ / (duration * fade))
+ : 1));
+
+ draw_label (mi, &bp->walkers[0], 1.5, scale, s);
+
+ DONE:
+ free (s0);
+}
+#endif /* WORDBUBBLES */
+
+
+
+typedef struct {
+ int i;
+ GLdouble d;
+} depth_sorter;
+
+static int
+cmp_depth_sorter (const void *aa, const void *bb)
+{
+ const depth_sorter *a = (depth_sorter *) aa;
+ const depth_sorter *b = (depth_sorter *) bb;
+ return (a->d == b->d ? 0 : a->d < b->d ? -1 : 1);
+}
+
+
+ENTRYPOINT void
+draw_robot (ModeInfo *mi)
+{
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GLfloat robot_size;
+ depth_sorter *sorted;
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+# ifdef HAVE_MOBILE
+ glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
+# endif
+
+ gltrackball_rotate (bp->user_trackball);
+
+ glTranslatef (0, -20, 0); /* Move the horizon down the screen */
+
+ robot_size = size * 7;
+ glScalef (robot_size, robot_size, robot_size);
+ look_at_center (mi);
+
+ glPushMatrix();
+ glScalef (1/robot_size, 1/robot_size, 1/robot_size);
+ glCallList (bp->dlists[GROUND]);
+ glPopMatrix();
+
+# ifdef WORDBUBBLES
+ fill_words (mi);
+ bubble (mi);
+# endif
+
+#ifdef DEBUG
+ if (debug_p)
+ {
+ glTranslatef (0, -1.2, 0);
+ glScalef (3, 3, 3);
+ glRotatef (-43.5, 0, 0, 1);
+ glRotatef (-90, 0, 1, 0);
+
+ /* glTranslatef (bp->debug_z, bp->debug_y, 0); */
+
+ glPushMatrix();
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
+
+ glBegin(GL_LINES);
+ glVertex3f(-10, 0, 0); glVertex3f(10, 0, 0);
+ glVertex3f(0, -10, 0); glVertex3f(0, 10, 0);
+ glVertex3f(0, 0, -10); glVertex3f(0, 0, 10);
+ glEnd();
+
+ glTranslatef (-0.5, 0, -0.5);
+
+ glColor3f (1, 0, 0);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0); glVertex3f (0, 0, 1);
+ glVertex3f (0, 1, 1); glVertex3f (0, 1, 0);
+ glEnd();
+
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (1, 0, 0); glVertex3f (1, 0, 1);
+ glVertex3f (1, 1, 1); glVertex3f (1, 1, 0);
+ glEnd();
+
+# if 1
+ glColor3f (0.5, 0.5, 0.5);
+ glFrontFace (GL_CCW);
+ glBegin (GL_QUADS);
+ /* glVertex3f (0, 1, 0); glVertex3f (0, 1, 1); */
+ /* glVertex3f (1, 1, 1); glVertex3f (1, 1, 0); */
+ glVertex3f (0, 0, 0); glVertex3f (0, 0, 1);
+ glVertex3f (1, 0, 1); glVertex3f (1, 0, 0);
+ glEnd();
+
+ glFrontFace (GL_CW);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 1, 0); glVertex3f (0, 1, 1);
+ glVertex3f (1, 1, 1); glVertex3f (1, 1, 0);
+ glVertex3f (0, 0, 0); glVertex3f (0, 0, 1);
+ glVertex3f (1, 0, 1); glVertex3f (1, 0, 0);
+ glEnd();
+# endif
+
+ glColor3f (1, 0, 0);
+ glBegin (GL_LINES);
+ glVertex3f (0, 0, 0); glVertex3f (1, 0, 0);
+ glVertex3f (0, 0, 1); glVertex3f (1, 0, 1);
+ glVertex3f (0, 1, 0); glVertex3f (1, 1, 0);
+ glVertex3f (0, 1, 1); glVertex3f (1, 1, 1);
+
+ glVertex3f (0, 0, 0); glVertex3f (1, 0, 1);
+ glVertex3f (0, 0, 1); glVertex3f (1, 0, 0);
+ glVertex3f (0, 1, 0); glVertex3f (1, 1, 1);
+ glVertex3f (0, 1, 1); glVertex3f (1, 1, 0);
+ glEnd();
+
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
+
+ glPopMatrix();
+ }
+
+# endif /* DEBUG */
+
+ /* For transparency to work right, we have to draw the robots from
+ back to front, from the perspective of the observer. So project
+ the origin of the robot to screen coordinates, and sort that by Z.
+ */
+ sorted = (depth_sorter *) calloc (bp->nwalkers, sizeof (*sorted));
+ {
+ GLdouble m[16], p[16];
+ GLint v[4];
+ glGetDoublev (GL_MODELVIEW_MATRIX, m);
+ glGetDoublev (GL_PROJECTION_MATRIX, p);
+ glGetIntegerv (GL_VIEWPORT, v);
+
+ for (i = 0; i < bp->nwalkers; i++)
+ {
+ GLdouble x, y, z;
+ walker *f = &bp->walkers[i];
+ gluProject (f->y, f->z, f->x, m, p, v, &x, &y, &z);
+ sorted[i].i = i;
+ sorted[i].d = -z;
+ }
+ qsort (sorted, i, sizeof(*sorted), cmp_depth_sorter);
+ }
+
+
+ mi->polygon_count = 0;
+ for (i = 0; i < bp->nwalkers; i++)
+ {
+ int ii = sorted[i].i;
+ walker *f = &bp->walkers[ii];
+ int ticks = 22 * speed * f->speed;
+ int max = 180;
+ char tag[1024];
+ *tag = 0;
+
+ if (ticks < 1) ticks = 1;
+ if (ticks > max) ticks = max;
+
+# ifdef DEBUG
+ if (debug_p)
+ sprintf (tag, "%.4f, %.4f, %.4f",
+ bp->debug_x, bp->debug_y, bp->debug_z);
+ else
+ {
+# if 1
+ /* sprintf (tag + strlen(tag), " %d\n", ii); */
+ sprintf (tag + strlen(tag), " %d\n", bp->nwalkers - i - 1);
+ /* sprintf (tag + strlen(tag), "%.03f\n", sorted[i].d); */
+# endif
+ }
+
+# endif /* DEBUG */
+
+ mi->polygon_count += draw_walker (mi, f, tag);
+
+ for (ii = 0; ii < ticks; ii++)
+ tick_walker (mi, f);
+ }
+ free (sorted);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_robot (ModeInfo *mi)
+{
+# ifdef WORDBUBBLES
+ robot_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (bp->tc)
+ textclient_close (bp->tc);
+# endif
+}
+
+XSCREENSAVER_MODULE_2 ("WindupRobot", winduprobot, robot)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/winduprobot.man b/hacks/glx/winduprobot.man
new file mode 100644
index 0000000..5e7f801
--- /dev/null
+++ b/hacks/glx/winduprobot.man
@@ -0,0 +1,85 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+winduprobot - screen saver.
+.SH SYNOPSIS
+.B winduprobot
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-size \fIratio\fP]
+[\-opacity \fIratio\fP]
+[\-talk \fIratio\fP]
+[\-no-texture]
+[\-no-fade]
+[\-fps]
+.SH DESCRIPTION
+A swarm of wind-up toy robots wander around the table-top, bumping into
+each other. Each robot contains a mechanically accurate gear system inside,
+which you can see when the robot's shell occasionally fades to
+transparency.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-count \fInumber\fP
+Number of robots. 1 - 100. Default: 25.
+.TP 8
+.B \-speed \fIratio\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-size \fIratio\fP
+Robot size. 2.0 means twice as big, 0.5 means half as big.
+.TP 8
+.B \-opacity \fIratio\fP
+Robot skin transparency. 0.0 - 1.0. Default: 1.0.
+.TP 8
+.B \-talk \fIratio\fP
+How often to occasionally pop up a word bubble with random text in it.
+0.0 means never. 1.0 means often.
+.TP 8
+.B \-texture | \-no-texture
+Whether the robot's surface should be reflective chrome.
+.TP 8
+.B \-fade | \-no-fade
+Whether to sometimes fade the robot's opacity to show the inner mechanism.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver-text (1)
+.SH COPYRIGHT
+Copyright \(co 2014 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/xlock-gl-utils.c b/hacks/glx/xlock-gl-utils.c
new file mode 100644
index 0000000..36d724c
--- /dev/null
+++ b/hacks/glx/xlock-gl-utils.c
@@ -0,0 +1,230 @@
+/* xlock-gl.c --- xscreensaver compatibility layer for xlockmore GL modules.
+ * xscreensaver, Copyright (c) 1997-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This file, along with xlockmore.h, make it possible to compile an xlockmore
+ * GL module into a standalone program, and thus use it with xscreensaver.
+ * By Jamie Zawinski <jwz@jwz.org> on 31-May-97.
+ */
+
+#include <stdio.h>
+#include "xlockmoreI.h"
+#include "texfont.h"
+
+#ifndef isupper
+# define isupper(c) ((c) >= 'A' && (c) <= 'Z')
+#endif
+#ifndef _tolower
+# define _tolower(c) ((c) - 'A' + 'a')
+#endif
+
+
+/* Gag -- we use this to turn X errors from glXCreateContext() into
+ something that will actually make sense to the user.
+ */
+static XErrorHandler orig_ehandler = 0;
+static Bool got_error = 0;
+
+static int
+BadValue_ehandler (Display *dpy, XErrorEvent *error)
+{
+ if (error->error_code == BadValue)
+ {
+ got_error = True;
+ return 0;
+ }
+ else
+ return orig_ehandler (dpy, error);
+}
+
+
+GLXContext *
+init_GL(ModeInfo * mi)
+{
+ Display *dpy = mi->dpy;
+ Window window = mi->window;
+ Screen *screen = mi->xgwa.screen;
+ Visual *visual = mi->xgwa.visual;
+ XVisualInfo vi_in, *vi_out;
+ int out_count;
+
+ if (mi->glx_context) {
+ glXMakeCurrent (dpy, window, mi->glx_context);
+ return &mi->glx_context;
+ }
+
+# ifdef HAVE_JWZGLES
+ jwzgles_make_current(jwzgles_make_state(state));
+# endif
+
+ vi_in.screen = screen_number (screen);
+ vi_in.visualid = XVisualIDFromVisual (visual);
+ vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+ &vi_in, &out_count);
+ if (! vi_out) abort ();
+
+ {
+ XSync (dpy, False);
+ orig_ehandler = XSetErrorHandler (BadValue_ehandler);
+ mi->glx_context = glXCreateContext (dpy, vi_out, 0, GL_TRUE);
+ XSync (dpy, False);
+ XSetErrorHandler (orig_ehandler);
+ if (got_error)
+ mi->glx_context = 0;
+ }
+
+ XFree((char *) vi_out);
+
+ if (!mi->glx_context)
+ {
+ fprintf(stderr, "%s: couldn't create GL context for visual 0x%x.\n",
+ progname, (unsigned int) XVisualIDFromVisual (visual));
+ exit(1);
+ }
+
+ glXMakeCurrent (dpy, window, mi->glx_context);
+
+ {
+ GLboolean rgba_mode = 0;
+ glGetBooleanv(GL_RGBA_MODE, &rgba_mode);
+ if (!rgba_mode)
+ {
+ glIndexi (WhitePixelOfScreen (screen));
+ glClearIndex (BlackPixelOfScreen (screen));
+ }
+ }
+
+
+ /* jwz: the doc for glDrawBuffer says "The initial value is GL_FRONT
+ for single-buffered contexts, and GL_BACK for double-buffered
+ contexts." However, I find that this is not always the case,
+ at least with Mesa 3.4.2 -- sometimes the default seems to be
+ GL_FRONT even when glGet(GL_DOUBLEBUFFER) is true. So, let's
+ make sure.
+
+ Oh, hmm -- maybe this only happens when we are re-using the
+ xscreensaver window, and the previous GL hack happened to die with
+ the other buffer selected? I'm not sure. Anyway, this fixes it.
+ */
+ {
+ GLboolean d = False;
+ glGetBooleanv (GL_DOUBLEBUFFER, &d);
+ if (d)
+ glDrawBuffer (GL_BACK);
+ else
+ glDrawBuffer (GL_FRONT);
+ }
+
+ /* Sometimes glDrawBuffer() throws "invalid op". Dunno why. Ignore. */
+ clear_gl_error ();
+
+ /* Process the -background argument. */
+ {
+ char *s = get_string_resource(mi->dpy, "background", "Background");
+ XColor c = { 0, };
+ if (! XParseColor (dpy, mi->xgwa.colormap, s, &c))
+ fprintf (stderr, "%s: can't parse color %s; using black.\n",
+ progname, s);
+ glClearColor (c.red / 65535.0,
+ c.green / 65535.0,
+ c.blue / 65535.0,
+ 1.0);
+ }
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* GLXContext is already a pointer type.
+ Why this function returns a pointer to a pointer, I have no idea...
+ */
+ return &mi->glx_context;
+}
+
+
+
+/* clear away any lingering error codes */
+void
+clear_gl_error (void)
+{
+ while (glGetError() != GL_NO_ERROR)
+ ;
+}
+
+/* report a GL error. */
+void
+check_gl_error (const char *type)
+{
+ char buf[100];
+ GLenum i;
+ const char *e;
+ switch ((i = glGetError())) {
+ case GL_NO_ERROR: return;
+ case GL_INVALID_ENUM: e = "invalid enum"; break;
+ case GL_INVALID_VALUE: e = "invalid value"; break;
+ case GL_INVALID_OPERATION: e = "invalid operation"; break;
+ case GL_STACK_OVERFLOW: e = "stack overflow"; break;
+ case GL_STACK_UNDERFLOW: e = "stack underflow"; break;
+ case GL_OUT_OF_MEMORY: e = "out of memory"; break;
+#ifdef GL_INVALID_FRAMEBUFFER_OPERATION
+ case GL_INVALID_FRAMEBUFFER_OPERATION:
+ e = "invalid framebuffer operation";
+ break;
+#endif
+#ifdef GL_TABLE_TOO_LARGE_EXT
+ case GL_TABLE_TOO_LARGE_EXT: e = "table too large"; break;
+#endif
+#ifdef GL_TEXTURE_TOO_LARGE_EXT
+ case GL_TEXTURE_TOO_LARGE_EXT: e = "texture too large"; break;
+#endif
+ default:
+ e = buf; sprintf (buf, "unknown error %d", (int) i); break;
+ }
+ fprintf (stderr, "%s: %s error: %s\n", progname, type, e);
+ exit (1);
+}
+
+
+/* Callback in xscreensaver_function_table, via xlockmore.c.
+ */
+Visual *
+xlockmore_pick_gl_visual (Screen *screen)
+{
+ /* pick the "best" visual by interrogating the GL library instead of
+ by asking Xlib. GL knows better.
+ */
+ Visual *v = 0;
+ Display *dpy = DisplayOfScreen (screen);
+ char *string = get_string_resource (dpy, "visualID", "VisualID");
+ char *s;
+
+ if (string)
+ for (s = string; *s; s++)
+ if (isupper (*s)) *s = _tolower (*s);
+
+ if (!string || !*string ||
+ !strcmp (string, "gl") ||
+ !strcmp (string, "best") ||
+ !strcmp (string, "color") ||
+ !strcmp (string, "default"))
+ v = get_gl_visual (screen); /* from ../utils/visual-gl.c */
+
+ if (string)
+ free (string);
+
+ return v;
+}
+
+
+/* Callback in xscreensaver_function_table, via xlockmore.c.
+ */
+Bool
+xlockmore_validate_gl_visual (Screen *screen, const char *name, Visual *visual)
+{
+ return validate_gl_visual (stderr, screen, name, visual);
+}
diff --git a/hacks/glx/xscreensaver-gl-helper.c b/hacks/glx/xscreensaver-gl-helper.c
new file mode 100644
index 0000000..6da8a7f
--- /dev/null
+++ b/hacks/glx/xscreensaver-gl-helper.c
@@ -0,0 +1,74 @@
+/* xscreensaver, Copyright (c) 2000, 2002 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* xscreensaver-gl-helper -- prints the ID of the best visual to use
+ for GL programs on stdout.
+ */
+
+#include "utils.h"
+#include "visual.h"
+
+#include <GL/gl.h>
+#include <GL/glx.h>
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+int
+main (int argc, char **argv)
+{
+ Display *dpy;
+ Screen *screen;
+ Visual *visual;
+ char *d = getenv ("DISPLAY");
+ int i;
+
+ progname = argv[0];
+ for (i = 1; i < argc; i++)
+ {
+ if (argv[i][0] == '-' && argv[i][1] == '-') argv[i]++;
+ if (strlen(argv[i]) >= 2 &&
+ !strncmp ("-display", argv[i], strlen(argv[i])))
+ {
+ if (i == argc-1) goto LOSE;
+ d = argv[i+1];
+ i++;
+ }
+ else
+ {
+ LOSE:
+ fprintf (stderr, "usage: %s [ -display host:dpy.screen ]\n",
+ progname);
+ fprintf (stderr,
+ "This program prints out the ID of the best "
+ "X visual for GL programs to use.\n");
+ exit (1);
+ }
+ }
+
+ dpy = XOpenDisplay (d);
+ if (!dpy)
+ {
+ fprintf (stderr, "%s: couldn't open display %s\n", progname,
+ (d ? d : "(null)"));
+ exit (1);
+ }
+
+ screen = DefaultScreenOfDisplay (dpy);
+ visual = get_gl_visual (screen);
+
+ if (visual)
+ printf ("0x%x\n", (unsigned int) XVisualIDFromVisual (visual));
+ else
+ printf ("none\n");
+
+ exit (0);
+}
diff --git a/hacks/glx/xscreensaver-gl-helper.man b/hacks/glx/xscreensaver-gl-helper.man
new file mode 100644
index 0000000..7c40eb3
--- /dev/null
+++ b/hacks/glx/xscreensaver-gl-helper.man
@@ -0,0 +1,33 @@
+.TH XScreenSaver 1 "5-Nov-00" "X Version 11"
+.SH NAME
+xscreensaver-gl-helper - figure out which X visual to use for GL programs
+.SH SYNOPSIS
+.B xscreensaver-gl-helper
+[\-display \fIhost:display.screen\fP]
+.SH DESCRIPTION
+This program prints the ID of the visual that should be used for proper
+operation of OpenGL programs. This program only exists so that the
+.BR xscreensaver (1)
+daemon does not need to link against the OpenGL library.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host, display, and screen number.
+.SH SEE ALSO
+.BR X (1),
+.BR xdpyinfo (1),
+.BR xglinfo (1),
+.BR glxinfo (1),
+.BR glxdpyinfo (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-command (1)
+.SH COPYRIGHT
+Copyright \(co 2000 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
diff --git a/hacks/glx/zalgo.txt b/hacks/glx/zalgo.txt
new file mode 100644
index 0000000..ac6780b
--- /dev/null
+++ b/hacks/glx/zalgo.txt
@@ -0,0 +1,30 @@
+
+
+Man 👨
+Blackula 🧛ðŸ¿
+Black male teacher 👨ðŸ¿â€ðŸ«
+Female runner ðŸƒâ€â™€
+Woman astronaut ðŸƒâ€ðŸš€
+Multi-person group 👩ðŸ¿â€ðŸ‘¨ðŸ»â€ðŸ‘¦ðŸ½â€ðŸ‘§ðŸ¿
+
+
+Í P
+Í PÍ PÍ PÍ 
+PÍ 
+PÍ 
+
+💩💩💩💩💩💩💩💩💩💩💩💩💩💩
+
+y̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆
+â†Deleted Page
+H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈ÌÌ€Ì͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲ÌÍ–Í­Ìͥͮ͟OÍ®Í̮̪ÌÍM̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌ÍS̨̥̫͎̭ͯ̿̔̀ͅ
+
+
+
+Rege̿̔̉x-based HTML parsers are the cancer that is killing StackOverflow it is too late it is too late we cannot be saved the trangession of a chiÍ¡ld ensures regex will consume all living tissue (except for HTML which it cannot, as previously prophesied) dear lord help us how can anyone survive this scourge using regex to parse HTML has doomed humanity to an eternity of dread torture and security holes using regex as a tool to process HTML establishes a breach between this world and the dread realm of c͒ͪo͛ͫrrupt entities (like SGML entities, but more corrupt) a mere glimpse of the world of reg​ex parsers for HTML will ins​tantly transport a programmer's consciousness into a world of ceaseless screaming, he comes, the pestilent slithy regex-infection wil​l devour your HT​ML parser, application and existence for all time like Visual Basic only worse he comes he comes do not fi​ght he comÌ¡e̶s, Ì•h̵i​s un̨hoÍžly radiaÅ„cé destroÒ‰ying all enliÌ̈Ì̂̈Ìghtenment, HTML tags leaÍ ki̧n͘g fr̶ǫm Ì¡yo​͟ur eyeÍ¢s̸ Ì›lÌ•ikÍe liq​uid pain, the song of re̸gular exp​ression parsing will exti​nguish the voices of mor​tal man from the sp​here I can see it can you see ̲͚̖͔̙î̩Ìt̲͎̩̱͔ÌÌ‹Ì€ it is beautiful t​he final snuffing of the lie​s of Man ALL IS LOŚ͖̩͇̗̪Ì̈ÌT ALL I​S LOST the ponÌ·y he comes he c̶̮omes he comes the ich​or permeates all MY FACE MY FACE áµ’h god no NO NOO̼O​O NΘ stop the an​*̶͑̾̾​̅ͫÍ̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟ÌͫͥͨeÌ Ì…s ÍŽa̧͈͖r̽̾̈ÌÍ’Í‘e n​ot rè̑ͧ̌aͨl̘Ì̙̃ͤ͂̾̆ ZAÌ¡ÍŠÍ ÍLGÎŒ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅÆ̴ȳ̳ TH̘Ë͖Ì̉ Í P̯ÍÌ­O̚​NÌYÌ¡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈ÌÌ€Ì͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲ÌÍ–Í­Ìͥͮ͟OÍ®Í̮̪ÌÍM̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌ÍS̨̥̫͎̭ͯ̿̔̀ͅ
+
+
+
+
+
+
diff --git a/hacks/goop.c b/hacks/goop.c
new file mode 100644
index 0000000..62b704e
--- /dev/null
+++ b/hacks/goop.c
@@ -0,0 +1,650 @@
+/* xscreensaver, Copyright (c) 1997-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+#include "alpha.h"
+
+
+/* This is pretty compute-intensive, probably due to the large number of
+ polygon fills. I tried introducing a scaling factor to make the spline
+ code emit fewer line segments, but that made the edges very rough.
+ However, tuning *maxVelocity, *elasticity and *delay can result in much
+ smoother looking animation. I tuned these for a 1280x1024 Indy display,
+ but I don't know whether these values will be reasonable for a slower
+ machine...
+
+ The more planes the better -- SGIs have a 12-bit pseudocolor display
+ (4096 colormap cells) which is mostly useless, except for this program,
+ where it means you can have 11 or 12 mutually-transparent objects instead
+ of only 7 or 8. But, if you are using the 12-bit visual, you should crank
+ down the velocity and elasticity, or server slowness will cause the
+ animation to look jerky (yes, it's sad but true, SGI's X server is
+ perceptibly slower when using plane masks on a 12-bit visual than on an
+ 8-bit visual.) Using -max-velocity 0.5 -elasticity 0.9 seems to work ok
+ on my Indy R5k with visual 0x27 and the bottom-of-the-line 24-bit graphics
+ board.
+
+ It might look better if each blob had an outline, which was a *slightly*
+ darker color than the center, to give them a bit more definition -- but
+ that would mean using two planes per blob. (Or maybe allocating the
+ outline colors outside of the plane-space? Then the outlines wouldn't be
+ transparent, but maybe that wouldn't be so noticeable?)
+
+ Oh, for an alpha channel... maybe I should rewrite this in GL. Then the
+ blobs could have thickness, and curved edges with specular reflections...
+ */
+
+#define SCALE 10000 /* fixed-point math, for sub-pixel motion */
+#define DEF_COUNT 12 /* When planes and count are 0, how many blobs. */
+
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+struct blob {
+ long x, y; /* position of midpoint */
+ long dx, dy; /* velocity and direction */
+ double torque; /* rotational speed */
+ double th; /* angle of rotation */
+ long elasticity; /* how fast they deform */
+ long max_velocity; /* speed limit */
+ long min_r, max_r; /* radius range */
+ int npoints; /* control points */
+ long *r; /* radii */
+ spline *spline;
+};
+
+struct layer {
+ int nblobs;
+ struct blob **blobs;
+ Pixmap pixmap;
+ unsigned long pixel;
+ GC gc;
+};
+
+enum goop_mode {
+ transparent,
+ opaque,
+ xor,
+ outline
+};
+
+struct goop {
+ enum goop_mode mode;
+ int width, height;
+ int nlayers;
+ struct layer **layers;
+ unsigned long background;
+ Pixmap pixmap;
+ GC pixmap_gc;
+ GC window_gc;
+ Bool additive_p;
+ Bool cmap_p;
+ int delay;
+};
+
+
+static struct blob *
+make_blob (Display *dpy, int maxx, int maxy, int size)
+{
+ struct blob *b = (struct blob *) calloc(1, sizeof(*b));
+ int i;
+ int mid;
+
+ maxx *= SCALE;
+ maxy *= SCALE;
+ size *= SCALE;
+
+ b->max_r = size/2;
+ b->min_r = size/10;
+
+ if (b->min_r < (5*SCALE)) b->min_r = (5*SCALE);
+ mid = ((b->min_r + b->max_r) / 2);
+
+ b->torque = get_float_resource (dpy, "torque", "Torque");
+ b->elasticity = SCALE * get_float_resource (dpy, "elasticity", "Elasticity");
+ b->max_velocity = SCALE * get_float_resource (dpy, "maxVelocity", "MaxVelocity");
+
+ b->x = RAND(maxx);
+ b->y = RAND(maxy);
+
+ b->dx = RAND(b->max_velocity) * RANDSIGN();
+ b->dy = RAND(b->max_velocity) * RANDSIGN();
+ b->th = frand(M_PI+M_PI) * RANDSIGN();
+ b->npoints = (random() % 5) + 5;
+
+ b->spline = make_spline (b->npoints);
+ b->r = (long *) malloc (sizeof(*b->r) * b->npoints);
+ for (i = 0; i < b->npoints; i++)
+ b->r[i] = (long) ((random() % mid) + (mid/2)) * RANDSIGN();
+ return b;
+}
+
+static void
+free_blob(struct blob *blob)
+{
+ free_spline(blob->spline);
+ free(blob->r);
+ free(blob);
+}
+
+static void
+throb_blob (struct blob *b)
+{
+ int i;
+ double frac = ((M_PI+M_PI) / b->npoints);
+
+ for (i = 0; i < b->npoints; i++)
+ {
+ long r = b->r[i];
+ long ra = (r > 0 ? r : -r);
+ double th = (b->th > 0 ? b->th : -b->th);
+ long x, y;
+
+ /* place control points evenly around perimiter, shifted by theta */
+ x = b->x + ra * cos (i * frac + th);
+ y = b->y + ra * sin (i * frac + th);
+
+ b->spline->control_x[i] = x / SCALE;
+ b->spline->control_y[i] = y / SCALE;
+
+ /* alter the radius by a random amount, in the direction in which
+ it had been going (the sign of the radius indicates direction.) */
+ ra += (RAND(b->elasticity) * (r > 0 ? 1 : -1));
+ r = ra * (r >= 0 ? 1 : -1);
+
+ /* If we've reached the end (too long or too short) reverse direction. */
+ if ((ra > b->max_r && r >= 0) ||
+ (ra < b->min_r && r < 0))
+ r = -r;
+ /* And reverse direction in mid-course once every 50 times. */
+ else if (! (random() % 50))
+ r = -r;
+
+ b->r[i] = r;
+ }
+}
+
+static void
+move_blob (struct blob *b, int maxx, int maxy)
+{
+ maxx *= SCALE;
+ maxy *= SCALE;
+
+ b->x += b->dx;
+ b->y += b->dy;
+
+ /* If we've reached the edge of the box, reverse direction. */
+ if ((b->x > maxx && b->dx >= 0) ||
+ (b->x < 0 && b->dx < 0))
+ {
+ b->dx = -b->dx;
+ }
+ if ((b->y > maxy && b->dy >= 0) ||
+ (b->y < 0 && b->dy < 0))
+ {
+ b->dy = -b->dy;
+ }
+
+ /* Alter velocity randomly. */
+ if (! (random() % 10))
+ {
+ b->dx += (RAND(b->max_velocity/2) * RANDSIGN());
+ b->dy += (RAND(b->max_velocity/2) * RANDSIGN());
+
+ /* Throttle velocity */
+ if (b->dx > b->max_velocity || b->dx < -b->max_velocity)
+ b->dx /= 2;
+ if (b->dy > b->max_velocity || b->dy < -b->max_velocity)
+ b->dy /= 2;
+ }
+
+ {
+ double th = b->th;
+ double d = (b->torque == 0 ? 0 : frand(b->torque));
+ if (th < 0)
+ th = -(th + d);
+ else
+ th += d;
+
+ if (th > (M_PI+M_PI))
+ th -= (M_PI+M_PI);
+ else if (th < 0)
+ th += (M_PI+M_PI);
+
+ b->th = (b->th > 0 ? th : -th);
+ }
+
+ /* Alter direction of rotation randomly. */
+ if (! (random() % 100))
+ b->th *= -1;
+}
+
+static void
+draw_blob (Display *dpy, Drawable drawable, GC gc, struct blob *b,
+ Bool fill_p)
+{
+ compute_closed_spline (b->spline);
+#ifdef DEBUG
+ {
+ int i;
+ for (i = 0; i < b->npoints; i++)
+ XDrawLine (dpy, drawable, gc, b->x/SCALE, b->y/SCALE,
+ b->spline->control_x[i], b->spline->control_y[i]);
+ }
+#else
+ if (fill_p)
+ XFillPolygon (dpy, drawable, gc, b->spline->points, b->spline->n_points,
+ Nonconvex, CoordModeOrigin);
+ else
+#endif
+ XDrawLines (dpy, drawable, gc, b->spline->points, b->spline->n_points,
+ CoordModeOrigin);
+}
+
+
+static struct layer *
+make_layer (Display *dpy, Window window, int width, int height, int nblobs)
+{
+ int i;
+ struct layer *layer = (struct layer *) calloc(1, sizeof(*layer));
+ int blob_min, blob_max;
+ XGCValues gcv;
+ layer->nblobs = nblobs;
+
+ layer->blobs = (struct blob **) malloc(sizeof(*layer->blobs)*layer->nblobs);
+
+ blob_max = (width < height ? width : height) / 2;
+
+ if (width < 100 || height < 100) /* tiny window */
+ blob_max *= 10;
+
+ blob_min = (blob_max * 2) / 3;
+ for (i = 0; i < layer->nblobs; i++){
+ int j = blob_max - blob_min;
+ layer->blobs[i] = make_blob (dpy, width, height,
+ (j ? random() % j : 0) + blob_min);
+ }
+
+ layer->pixmap = XCreatePixmap (dpy, window, width, height, 1);
+ layer->gc = XCreateGC (dpy, layer->pixmap, 0, &gcv);
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAlphaAllowed (dpy, layer->gc, True);
+# endif /* HAVE_JWXYZ */
+
+ return layer;
+}
+
+static void
+free_layer(struct layer *layer, Display *dpy)
+{
+ int i;
+ for (i = 0; i < layer->nblobs; i++){
+ free_blob(layer->blobs[i]);
+ }
+ free(layer->blobs);
+ XFreeGC(dpy, layer->gc);
+ free(layer);
+}
+
+
+#ifndef HAVE_JWXYZ
+static void
+draw_layer_plane (Display *dpy, struct layer *layer, int width, int height)
+{
+ int i;
+ for (i = 0; i < layer->nblobs; i++)
+ {
+ throb_blob (layer->blobs[i]);
+ move_blob (layer->blobs[i], width, height);
+ draw_blob (dpy, layer->pixmap, layer->gc, layer->blobs[i], True);
+ }
+}
+#endif /* !HAVE_JWXYZ */
+
+
+static void
+draw_layer_blobs (Display *dpy, Drawable drawable, GC gc,
+ struct layer *layer, int width, int height,
+ Bool fill_p)
+{
+ int i;
+ for (i = 0; i < layer->nblobs; i++)
+ {
+ draw_blob (dpy, drawable, gc, layer->blobs[i], fill_p);
+ throb_blob (layer->blobs[i]);
+ move_blob (layer->blobs[i], width, height);
+ }
+}
+
+
+static struct goop *
+make_goop (Screen *screen, Visual *visual, Window window, Colormap cmap,
+ int width, int height, long depth)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int i;
+ struct goop *goop = (struct goop *) calloc(1, sizeof(*goop));
+ XGCValues gcv;
+ int nblobs = get_integer_resource (dpy, "count", "Count");
+
+ unsigned long *plane_masks = 0;
+# ifndef HAVE_JWXYZ
+ unsigned long base_pixel = 0;
+# endif
+ char *s;
+
+ s = get_string_resource (dpy, "mode", "Mode");
+ goop->mode = transparent;
+ if (!s || !*s || !strcasecmp (s, "transparent"))
+ ;
+ else if (!strcasecmp (s, "opaque"))
+ goop->mode = opaque;
+ else if (!strcasecmp (s, "xor"))
+ goop->mode = xor;
+ else
+ fprintf (stderr, "%s: bogus mode: \"%s\"\n", progname, s);
+ free(s);
+
+ goop->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ goop->width = width;
+ goop->height = height;
+
+ goop->nlayers = get_integer_resource (dpy, "planes", "Planes");
+ if (goop->nlayers <= 0)
+ goop->nlayers = (random() % (depth-2)) + 2;
+ if (! goop->layers)
+ goop->layers = (struct layer **)
+ malloc(sizeof(*goop->layers)*goop->nlayers);
+
+ goop->additive_p = get_boolean_resource (dpy, "additive", "Additive");
+ goop->cmap_p = has_writable_cells (screen, visual);
+
+ if (mono_p && goop->mode == transparent)
+ goop->mode = opaque;
+
+# ifndef HAVE_JWXYZ
+ /* Try to allocate some color planes before committing to nlayers.
+ */
+ if (goop->mode == transparent)
+ {
+ int nplanes = goop->nlayers;
+ allocate_alpha_colors (screen, visual, cmap,
+ &nplanes, goop->additive_p, &plane_masks,
+ &base_pixel);
+ if (nplanes > 1)
+ goop->nlayers = nplanes;
+ else
+ {
+ fprintf (stderr,
+ "%s: couldn't allocate any color planes; turning transparency off.\n",
+ progname);
+ goop->mode = opaque;
+ }
+ }
+# endif /* !HAVE_JWXYZ */
+
+ {
+ int lblobs[32];
+ int total = DEF_COUNT;
+ memset (lblobs, 0, sizeof(lblobs));
+ if (nblobs <= 0)
+ while (total)
+ for (i = 0; total && i < goop->nlayers; i++)
+ lblobs[i]++, total--;
+ for (i = 0; i < goop->nlayers; i++)
+ goop->layers[i] = make_layer (dpy, window, width, height,
+ (nblobs > 0 ? nblobs : lblobs[i]));
+ }
+
+# ifndef HAVE_JWXYZ
+ if (goop->mode == transparent && plane_masks)
+ {
+ for (i = 0; i < goop->nlayers; i++)
+ goop->layers[i]->pixel = base_pixel | plane_masks[i];
+ goop->background = base_pixel;
+ }
+# endif /* !HAVE_JWXYZ */
+
+ if (plane_masks)
+ free (plane_masks);
+
+# ifndef HAVE_JWXYZ
+ if (goop->mode != transparent)
+# endif /* !HAVE_JWXYZ */
+ {
+ XColor color;
+ color.flags = DoRed|DoGreen|DoBlue;
+
+ goop->background =
+ get_pixel_resource (dpy,cmap, "background", "Background");
+
+ for (i = 0; i < goop->nlayers; i++)
+ {
+ int H = random() % 360; /* range 0-360 */
+ double S = ((double) (random()%70) + 30)/100.0; /* range 30%-100% */
+ double V = ((double) (random()%34) + 66)/100.0; /* range 66%-100% */
+ hsv_to_rgb (H, S, V, &color.red, &color.green, &color.blue);
+ if (XAllocColor (dpy, cmap, &color))
+ goop->layers[i]->pixel = color.pixel;
+ else
+ goop->layers[i]->pixel =
+ WhitePixelOfScreen(DefaultScreenOfDisplay(dpy));
+# ifdef HAVE_JWXYZ
+ if (goop->mode == transparent)
+ {
+ /* give a non-opaque alpha to the color */
+ unsigned long pixel = goop->layers[i]->pixel;
+ unsigned long amask = BlackPixelOfScreen (screen);
+ unsigned long a = (0xBBBBBBBB & amask);
+ pixel = (pixel & (~amask)) | a;
+ goop->layers[i]->pixel = pixel;
+ }
+# endif /* HAVE_JWXYZ */
+ }
+ }
+
+ goop->pixmap = XCreatePixmap (dpy, window, width, height,
+ (goop->mode == xor ? 1L : depth));
+
+ gcv.background = goop->background;
+ gcv.foreground = get_pixel_resource (dpy, cmap, "foreground", "Foreground");
+ gcv.line_width = get_integer_resource (dpy, "thickness","Thickness");
+ goop->pixmap_gc = XCreateGC (dpy, goop->pixmap, GCLineWidth, &gcv);
+ goop->window_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAlphaAllowed (dpy, goop->pixmap_gc, True);
+# endif /* HAVE_JWXYZ */
+
+ return goop;
+}
+
+/* Well, the naming of this function is
+ confusing with goop_free()... */
+static void
+free_goop (struct goop *goop, Display *dpy)
+{
+ int i;
+ for (i = 0; i < goop->nlayers; i++){
+ struct layer * layer = goop->layers[i];
+ free_layer(layer, dpy);
+ }
+ free(goop->layers);
+ XFreeGC(dpy, goop->pixmap_gc);
+ XFreeGC(dpy, goop->window_gc);
+}
+
+static void *
+goop_init (Display *dpy, Window window)
+{
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ return make_goop (xgwa.screen, xgwa.visual, window, xgwa.colormap,
+ xgwa.width, xgwa.height, xgwa.depth);
+}
+
+static unsigned long
+goop_draw (Display *dpy, Window window, void *closure)
+{
+ struct goop *goop = (struct goop *) closure;
+ int i;
+
+ switch (goop->mode)
+ {
+# ifndef HAVE_JWXYZ
+ case transparent:
+
+ for (i = 0; i < goop->nlayers; i++)
+ draw_layer_plane (dpy, goop->layers[i], goop->width, goop->height);
+
+ XSetForeground (dpy, goop->pixmap_gc, goop->background);
+ XSetFunction (dpy, goop->pixmap_gc, GXcopy);
+ XSetPlaneMask (dpy, goop->pixmap_gc, AllPlanes);
+ XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0,
+ goop->width, goop->height);
+
+ XSetForeground (dpy, goop->pixmap_gc, ~0L);
+
+ if (!goop->cmap_p && !goop->additive_p)
+ {
+ int j;
+ for (i = 0; i < goop->nlayers; i++)
+ for (j = 0; j < goop->layers[i]->nblobs; j++)
+ draw_blob (dpy, goop->pixmap, goop->pixmap_gc,
+ goop->layers[i]->blobs[j], True);
+ XSetFunction (dpy, goop->pixmap_gc, GXclear);
+ }
+
+ for (i = 0; i < goop->nlayers; i++)
+ {
+ XSetPlaneMask (dpy, goop->pixmap_gc, goop->layers[i]->pixel);
+ draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc,
+ goop->layers[i], goop->width, goop->height,
+ True);
+ }
+ XCopyArea (dpy, goop->pixmap, window, goop->window_gc, 0, 0,
+ goop->width, goop->height, 0, 0);
+ break;
+#endif /* !HAVE_JWXYZ */
+
+ case xor:
+ XSetFunction (dpy, goop->pixmap_gc, GXcopy);
+ XSetForeground (dpy, goop->pixmap_gc, 0);
+ XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0,
+ goop->width, goop->height);
+ XSetFunction (dpy, goop->pixmap_gc, GXxor);
+ XSetForeground (dpy, goop->pixmap_gc, 1);
+ for (i = 0; i < goop->nlayers; i++)
+ draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc,
+ goop->layers[i], goop->width, goop->height,
+ (goop->mode != outline));
+ XCopyPlane (dpy, goop->pixmap, window, goop->window_gc, 0, 0,
+ goop->width, goop->height, 0, 0, 1L);
+ break;
+
+# ifdef HAVE_JWXYZ
+ case transparent:
+# endif
+ case opaque:
+ case outline:
+ XSetForeground (dpy, goop->pixmap_gc, goop->background);
+ XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0,
+ goop->width, goop->height);
+ for (i = 0; i < goop->nlayers; i++)
+ {
+ XSetForeground (dpy, goop->pixmap_gc, goop->layers[i]->pixel);
+ draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc,
+ goop->layers[i], goop->width, goop->height,
+ (goop->mode != outline));
+ }
+ XCopyArea (dpy, goop->pixmap, window, goop->window_gc, 0, 0,
+ goop->width, goop->height, 0, 0);
+ break;
+
+ default:
+ abort ();
+ break;
+ }
+ return goop->delay;
+}
+
+static void
+goop_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct goop *goop = (struct goop *) closure;
+
+ if (w != goop->width || h != goop->height)
+ {
+ struct goop *goop2 = goop_init (dpy, window);
+ free_goop(goop, dpy);
+ memcpy (goop, goop2, sizeof(*goop));
+ free(goop2);
+ }
+}
+
+static Bool
+goop_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+goop_free (Display *dpy, Window window, void *closure)
+{
+ struct goop *goop = (struct goop *) closure;
+ free_goop(goop, dpy);
+ free(goop);
+}
+
+
+
+
+static const char *goop_defaults [] = {
+ ".background: black",
+ ".foreground: yellow",
+ "*delay: 12000",
+ "*additive: true",
+ "*mode: transparent",
+ "*count: 1",
+ "*planes: 12",
+ "*thickness: 5",
+ "*torque: 0.0075",
+ "*elasticity: 0.9",
+ "*maxVelocity: 0.5",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec goop_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-planes", ".planes", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-xor", ".mode", XrmoptionNoArg, "xor" },
+ { "-transparent", ".mode", XrmoptionNoArg, "transparent" },
+ { "-opaque", ".mode", XrmoptionNoArg, "opaque" },
+ { "-additive", ".additive", XrmoptionNoArg, "True" },
+ { "-subtractive", ".additive", XrmoptionNoArg, "false" },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-torque", ".torque", XrmoptionSepArg, 0 },
+ { "-elasticity", ".elasticity", XrmoptionSepArg, 0 },
+ { "-max-velocity", ".maxVelocity", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Goop", goop)
diff --git a/hacks/goop.man b/hacks/goop.man
new file mode 100644
index 0000000..573bd1e
--- /dev/null
+++ b/hacks/goop.man
@@ -0,0 +1,84 @@
+.TH XScreenSaver 1 "11-Jun-97" "X Version 11"
+.SH NAME
+goop - squishy transparent oil and bubble screenhack
+.SH SYNOPSIS
+.B goop
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-xor] [\-no\-xor]
+[\-fps]
+.SH DESCRIPTION
+The \fIgoop\fP program draws a simulation of bubbles in layers of
+overlapping multicolored translucent fluid.
+.SH OPTIONS
+.I goop
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+How many bubbles to draw per layer. Default: random.
+.TP 8
+.B \-planes \fIinteger\fP
+How many planes to draw. Default: random, based on screen depth.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 12000, or about 0.012 seconds.
+.TP 8
+.B \-transparent
+If \fI\-layers\fP is greater than 1, then each layer will be drawn in one
+color, and when they overlap, the colors will be mixed. This is the default.
+.TP 8
+.B \-non\-transparent
+Turns off \fI\-transparent\fP.
+.TP 8
+.B \-additive
+If \fI\-transparent\fP is specified, then this option means that the colors
+will be mixed using an additive color model, as if the blobs were projected
+light. This is the default.
+.TP 8
+.B \-subtractive
+If \fI\-transparent\fP is specified, then this option means that the
+colors will be mixed using a subtractive color model, as if the blobs were
+translucent filters.
+.TP 8
+.B \-xor
+Draw with xor instead of the other color tricks.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 11-Jun-97.
diff --git a/hacks/grav.c b/hacks/grav.c
new file mode 100644
index 0000000..305b8e8
--- /dev/null
+++ b/hacks/grav.c
@@ -0,0 +1,356 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* grav --- planets spinning around a pulsar */
+
+#if 0
+static const char sccsid[] = "@(#)grav.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1993 by Greg Boewring <gb@pobox.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 11-Jul-1994: color version
+ * 06-Oct-1993: Written by Greg Bowering <gb@pobox.com>
+ */
+
+#ifdef STANDALONE
+#define MODE_grav
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 12 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ "*lowrez: True \n" \
+
+#define BRIGHT_COLORS
+# define release_grav 0
+# define grav_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_grav
+
+#define DEF_DECAY "True" /* Damping for decaying orbits */
+#define DEF_TRAIL "True" /* For trails (works good in mono only) */
+
+static Bool decay;
+static Bool trail;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-decay", ".grav.decay", XrmoptionNoArg, "on"},
+ {"+decay", ".grav.decay", XrmoptionNoArg, "off"},
+ {"-trail", ".grav.trail", XrmoptionNoArg, "on"},
+ {"+trail", ".grav.trail", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&decay, "decay", "Decay", DEF_DECAY, t_Bool},
+ {&trail, "trail", "Trail", DEF_TRAIL, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-/+decay", "turn on/off decaying orbits"},
+ {"-/+trail", "turn on/off trail dots"}
+};
+
+ENTRYPOINT ModeSpecOpt grav_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct grav_description =
+{"grav", "init_grav", "draw_grav", (char *) NULL,
+ "refresh_grav", "init_grav", "free_grav", &grav_opts,
+ 10000, -12, 1, 1, 64, 1.0, "",
+ "Shows orbiting planets", 0, NULL};
+
+#endif
+
+#define GRAV -0.02 /* Gravitational constant */
+#define DIST 16.0
+#define COLLIDE 0.0001
+#define ALMOST 15.99
+#define HALF 0.5
+/* #define INTRINSIC_RADIUS 200.0 */
+#define INTRINSIC_RADIUS ((float) (gp->height/5))
+#define STARRADIUS (unsigned int)(gp->height/(2*DIST))
+#define AVG_RADIUS (INTRINSIC_RADIUS/DIST)
+#define RADIUS (unsigned int)(INTRINSIC_RADIUS/(POS(Z)+DIST))
+
+#define XR HALF*ALMOST
+#define YR HALF*ALMOST
+#define ZR HALF*ALMOST
+
+#define VR 0.04
+
+#define DIMENSIONS 3
+#define X 0
+#define Y 1
+#define Z 2
+
+#define DAMP 0.999999
+#define MaxA 0.1 /* Maximum acceleration (w/ damping) */
+
+#define POS(c) planet->P[c]
+#define VEL(c) planet->V[c]
+#define ACC(c) planet->A[c]
+
+#define Planet(x,y)\
+ if ((x) >= 0 && (y) >= 0 && (x) <= gp->width && (y) <= gp->height) {\
+ if (planet->ri < 2)\
+ XDrawPoint(display, window, gc, (x), (y));\
+ else\
+ XFillArc(display, window, gc,\
+ (x) - planet->ri / 2, (y) - planet->ri / 2, planet->ri, planet->ri,\
+ 0, 23040);\
+ }
+
+#define FLOATRAND(min,max) ((min)+(LRAND()/MAXRAND)*((max)-(min)))
+
+typedef struct {
+ double P[DIMENSIONS], V[DIMENSIONS], A[DIMENSIONS];
+ int xi, yi, ri;
+ unsigned long colors;
+} planetstruct;
+
+typedef struct {
+ int width, height;
+ int x, y, sr, nplanets;
+ unsigned long starcolor;
+ planetstruct *planets;
+} gravstruct;
+
+static gravstruct *gravs = (gravstruct *) NULL;
+
+static void
+init_planet(ModeInfo * mi, planetstruct * planet)
+{
+ gravstruct *gp = &gravs[MI_SCREEN(mi)];
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+# endif
+
+ if (MI_NPIXELS(mi) > 2)
+ planet->colors = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+ else
+ planet->colors = MI_WHITE_PIXEL(mi);
+ /* Initialize positions */
+ POS(X) = FLOATRAND(-XR, XR);
+ POS(Y) = FLOATRAND(-YR, YR);
+ POS(Z) = FLOATRAND(-ZR, ZR);
+
+ if (POS(Z) > -ALMOST) {
+ planet->xi = (int)
+ ((double) gp->width * (HALF + POS(X) / (POS(Z) + DIST)));
+ planet->yi = (int)
+ ((double) gp->height * (HALF + POS(Y) / (POS(Z) + DIST)));
+ } else
+ planet->xi = planet->yi = -1;
+ planet->ri = RADIUS;
+
+ /* Initialize velocities */
+ VEL(X) = FLOATRAND(-VR, VR);
+ VEL(Y) = FLOATRAND(-VR, VR);
+ VEL(Z) = FLOATRAND(-VR, VR);
+}
+
+static void
+draw_planet(ModeInfo * mi, planetstruct * planet)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ gravstruct *gp = &gravs[MI_SCREEN(mi)];
+ double D; /* A distance variable to work with */
+ register unsigned char cmpt;
+
+ D = POS(X) * POS(X) + POS(Y) * POS(Y) + POS(Z) * POS(Z);
+ if (D < COLLIDE)
+ D = COLLIDE;
+ D = sqrt(D);
+ D = D * D * D;
+ for (cmpt = X; cmpt < DIMENSIONS; cmpt++) {
+ ACC(cmpt) = POS(cmpt) * GRAV / D;
+ if (decay) {
+ if (ACC(cmpt) > MaxA)
+ ACC(cmpt) = MaxA;
+ else if (ACC(cmpt) < -MaxA)
+ ACC(cmpt) = -MaxA;
+ VEL(cmpt) = VEL(cmpt) + ACC(cmpt);
+ VEL(cmpt) *= DAMP;
+ } else {
+ /* update velocity */
+ VEL(cmpt) = VEL(cmpt) + ACC(cmpt);
+ }
+ /* update position */
+ POS(cmpt) = POS(cmpt) + VEL(cmpt);
+ }
+
+ gp->x = planet->xi;
+ gp->y = planet->yi;
+
+ if (POS(Z) > -ALMOST) {
+ planet->xi = (int)
+ ((double) gp->width * (HALF + POS(X) / (POS(Z) + DIST)));
+ planet->yi = (int)
+ ((double) gp->height * (HALF + POS(Y) / (POS(Z) + DIST)));
+ } else
+ planet->xi = planet->yi = -1;
+
+ /* Mask */
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ Planet(gp->x, gp->y);
+ if (trail) {
+ XSetForeground(display, gc, planet->colors);
+ XDrawPoint(display, MI_WINDOW(mi), gc, gp->x, gp->y);
+ }
+ /* Move */
+ gp->x = planet->xi;
+ gp->y = planet->yi;
+ planet->ri = RADIUS;
+
+ /* Redraw */
+ XSetForeground(display, gc, planet->colors);
+ Planet(gp->x, gp->y);
+}
+
+ENTRYPOINT void
+init_grav(ModeInfo * mi)
+{
+ unsigned char ball;
+ gravstruct *gp;
+
+ MI_INIT (mi, gravs);
+ gp = &gravs[MI_SCREEN(mi)];
+
+ gp->width = MI_WIDTH(mi);
+ gp->height = MI_HEIGHT(mi);
+
+ gp->sr = STARRADIUS;
+
+ gp->nplanets = MI_COUNT(mi);
+ if (gp->nplanets < 0) {
+ if (gp->planets) {
+ (void) free((void *) gp->planets);
+ gp->planets = (planetstruct *) NULL;
+ }
+ gp->nplanets = NRAND(-gp->nplanets) + 1; /* Add 1 so its not too boring */
+ }
+ if (gp->planets == NULL) {
+ if ((gp->planets = (planetstruct *) calloc(gp->nplanets,
+ sizeof (planetstruct))) == NULL)
+ return;
+ }
+
+ MI_CLEARWINDOW(mi);
+
+ if (MI_NPIXELS(mi) > 2)
+ gp->starcolor = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+ else
+ gp->starcolor = MI_WHITE_PIXEL(mi);
+ for (ball = 0; ball < (unsigned char) gp->nplanets; ball++)
+ init_planet(mi, &gp->planets[ball]);
+}
+
+ENTRYPOINT void
+draw_grav(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ register unsigned char ball;
+ gravstruct *gp;
+
+ if (gravs == NULL)
+ return;
+ gp = &gravs[MI_SCREEN(mi)];
+ if (gp->planets == NULL)
+ return;
+
+ if (!MI_IS_DRAWN(mi)) {
+ for (ball = 0; ball < (unsigned char) gp->nplanets; ball++) {
+ planetstruct *planet = &gp->planets[ball];
+
+ /* Draw planets */
+ Planet(planet->xi, planet->yi);
+ }
+
+ /* Draw centrepoint */
+ XDrawArc(display, MI_WINDOW(mi), gc,
+ gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
+ 0, 23040);
+ }
+
+ MI_IS_DRAWN(mi) = True;
+ /* Mask centrepoint */
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XDrawArc(display, window, gc,
+ gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
+ 0, 23040);
+
+ /* Resize centrepoint */
+ switch (NRAND(4)) {
+ case 0:
+ if (gp->sr < (int) STARRADIUS)
+ gp->sr++;
+ break;
+ case 1:
+ if (gp->sr > 2)
+ gp->sr--;
+ }
+
+ /* Draw centrepoint */
+ XSetForeground(display, gc, gp->starcolor);
+ XDrawArc(display, window, gc,
+ gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
+ 0, 23040);
+
+ for (ball = 0; ball < (unsigned char) gp->nplanets; ball++)
+ draw_planet(mi, &gp->planets[ball]);
+}
+
+ENTRYPOINT void
+reshape_grav(ModeInfo * mi, int width, int height)
+{
+ gravstruct *gp = &gravs[MI_SCREEN(mi)];
+ gp->width = width;
+ gp->height = height;
+ XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+free_grav(ModeInfo * mi)
+{
+ gravstruct *gp = &gravs[MI_SCREEN(mi)];
+ if (gp->planets)
+ (void) free((void *) gp->planets);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_grav(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Grav", grav)
+
+#endif /* MODE_grav */
diff --git a/hacks/grav.man b/hacks/grav.man
new file mode 100644
index 0000000..f7017a7
--- /dev/null
+++ b/hacks/grav.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+grav - draws a simple orbital simulation
+.SH SYNOPSIS
+.B grav
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-decay] [\-no\-decay] [\-trail] [\-no\-trail]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIgrav\fP program draws a simple orbital simulation
+.SH OPTIONS
+.I grav
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-count \fIinteger\fP
+Default 12.
+.TP 8
+.B \-decay
+.TP 8
+.B \-no\-decay
+Whether orbits should decay.
+
+.TP 8
+.B \-trail
+.TP 8
+.B \-no\-trail
+Whether the objects should leave trails behind them (makes it look vaguely
+like a cloud-chamber.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1993 by Greg Bowering.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Greg Bowering <gb@pobox.com>, 1993.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/greynetic.c b/hacks/greynetic.c
new file mode 100644
index 0000000..586fdff
--- /dev/null
+++ b/hacks/greynetic.c
@@ -0,0 +1,296 @@
+/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+#ifndef HAVE_JWXYZ
+# define DO_STIPPLE
+#endif
+
+#define NBITS 12
+
+/* On some systems (notably MacOS X) these files are messed up.
+ * They're tiny, so we might as well just inline them here.
+ *
+ * # include <X11/bitmaps/stipple>
+ * # include <X11/bitmaps/cross_weave>
+ * # include <X11/bitmaps/dimple1>
+ * # include <X11/bitmaps/dimple3>
+ * # include <X11/bitmaps/flipped_gray>
+ * # include <X11/bitmaps/gray1>
+ * # include <X11/bitmaps/gray3>
+ * # include <X11/bitmaps/hlines2>
+ * # include <X11/bitmaps/light_gray>
+ * # include <X11/bitmaps/root_weave>
+ * # include <X11/bitmaps/vlines2>
+ * # include <X11/bitmaps/vlines3>
+*/
+
+#ifdef DO_STIPPLE
+#define stipple_width 16
+#define stipple_height 4
+static unsigned char stipple_bits[] = {
+ 0x55, 0x55, 0xee, 0xee, 0x55, 0x55, 0xba, 0xbb};
+
+#define cross_weave_width 16
+#define cross_weave_height 16
+static unsigned char cross_weave_bits[] = {
+ 0x55, 0x55, 0x88, 0x88, 0x55, 0x55, 0x22, 0x22, 0x55, 0x55, 0x88, 0x88,
+ 0x55, 0x55, 0x22, 0x22, 0x55, 0x55, 0x88, 0x88, 0x55, 0x55, 0x22, 0x22,
+ 0x55, 0x55, 0x88, 0x88, 0x55, 0x55, 0x22, 0x22};
+
+#define dimple1_width 16
+#define dimple1_height 16
+static unsigned char dimple1_bits[] = {
+ 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+ 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+ 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00};
+
+#define dimple3_width 16
+#define dimple3_height 16
+static unsigned char dimple3_bits[] = {
+ 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+#define flipped_gray_width 4
+#define flipped_gray_height 2
+static char flipped_gray_bits[] = { 0x07, 0x0d};
+#define gray1_width 2
+#define gray1_height 2
+static char gray1_bits[] = { 0x01, 0x02};
+#define gray3_width 4
+#define gray3_height 4
+static char gray3_bits[] = { 0x01, 0x00, 0x04, 0x00};
+#define hlines2_width 1
+#define hlines2_height 2
+static char hlines2_bits[] = { 0x01, 0x00};
+#define light_gray_width 4
+#define light_gray_height 2
+static char light_gray_bits[] = { 0x08, 0x02};
+#define root_weave_width 4
+#define root_weave_height 4
+static char root_weave_bits[] = { 0x07, 0x0d, 0x0b, 0x0e};
+#define vlines2_width 2
+#define vlines2_height 1
+static char vlines2_bits[] = { 0x01};
+#define vlines3_width 3
+#define vlines3_height 1
+static char vlines3_bits[] = { 0x02};
+
+#endif /* DO_STIPPLE */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Pixmap pixmaps [NBITS];
+
+ GC gc;
+ int delay;
+ unsigned long fg, bg, pixels [512];
+ int npixels;
+ int xlim, ylim;
+ Bool grey_p;
+ Colormap cmap;
+};
+
+
+static void *
+greynetic_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+# ifdef DO_STIPPLE
+ int i;
+# endif /* DO_STIPPLE */
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ st->dpy = dpy;
+ st->window = window;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->xlim = xgwa.width;
+ st->ylim = xgwa.height;
+ st->cmap = xgwa.colormap;
+ st->npixels = 0;
+ st->grey_p = get_boolean_resource(st->dpy, "grey", "Boolean");
+ gcv.foreground= st->fg= get_pixel_resource(st->dpy, st->cmap, "foreground","Foreground");
+ gcv.background= st->bg= get_pixel_resource(st->dpy, st->cmap, "background","Background");
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+
+# ifndef DO_STIPPLE
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+# ifdef HAVE_JWXYZ /* allow non-opaque alpha components in pixel values */
+ jwxyz_XSetAlphaAllowed (st->dpy, st->gc, True);
+# endif /* HAVE_JWXYZ */
+# else /* DO_STIPPLE */
+ gcv.fill_style= FillOpaqueStippled;
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground|GCFillStyle, &gcv);
+
+ i = 0;
+# define BITS(n,w,h) \
+ st->pixmaps [i++] = \
+ XCreatePixmapFromBitmapData (st->dpy, st->window, (char *) n, w, h, 1, 0, 1)
+
+ BITS (stipple_bits, stipple_width, stipple_height);
+ BITS (cross_weave_bits, cross_weave_width, cross_weave_height);
+ BITS (dimple1_bits, dimple1_width, dimple1_height);
+ BITS (dimple3_bits, dimple3_width, dimple3_height);
+ BITS (flipped_gray_bits, flipped_gray_width, flipped_gray_height);
+ BITS (gray1_bits, gray1_width, gray1_height);
+ BITS (gray3_bits, gray3_width, gray3_height);
+ BITS (hlines2_bits, hlines2_width, hlines2_height);
+ BITS (light_gray_bits, light_gray_width, light_gray_height);
+ BITS (root_weave_bits, root_weave_width, root_weave_height);
+ BITS (vlines2_bits, vlines2_width, vlines2_height);
+ BITS (vlines3_bits, vlines3_width, vlines3_height);
+# endif /* DO_STIPPLE */
+ return st;
+}
+
+static unsigned long
+greynetic_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int x, y, w=0, h=0, i;
+ XGCValues gcv;
+
+ for (i = 0; i < 10; i++) /* minimize area, but don't try too hard */
+ {
+ w = 50 + random () % (st->xlim - 50);
+ h = 50 + random () % (st->ylim - 50);
+ if (w + h < st->xlim && w + h < st->ylim)
+ break;
+ }
+ x = random () % (st->xlim - w);
+ y = random () % (st->ylim - h);
+# ifdef DO_STIPPLE
+ gcv.stipple = st->pixmaps [random () % NBITS];
+# endif /* !DO_STIPPLE */
+ if (mono_p)
+ {
+ MONO:
+ if (random () & 1)
+ gcv.foreground = st->fg, gcv.background = st->bg;
+ else
+ gcv.foreground = st->bg, gcv.background = st->fg;
+ }
+ else
+ {
+ XColor fgc, bgc;
+ if (st->npixels == sizeof (st->pixels) / sizeof (unsigned long))
+ goto REUSE;
+ fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue;
+ fgc.red = random ();
+ fgc.green = random ();
+ fgc.blue = random ();
+# ifdef DO_STIPPLE
+ bgc.red = random ();
+ bgc.green = random ();
+ bgc.blue = random ();
+# endif /* DO_STIPPLE */
+
+ if (st->grey_p)
+ {
+ fgc.green = fgc.blue = fgc.red;
+ bgc.green = bgc.blue = bgc.red;
+ }
+
+ if (! XAllocColor (st->dpy, st->cmap, &fgc))
+ goto REUSE;
+ st->pixels [st->npixels++] = fgc.pixel;
+ gcv.foreground = fgc.pixel;
+# ifdef DO_STIPPLE
+ if (! XAllocColor (st->dpy, st->cmap, &bgc))
+ goto REUSE;
+ st->pixels [st->npixels++] = bgc.pixel;
+ gcv.background = bgc.pixel;
+# endif /* DO_STIPPLE */
+ goto DONE;
+ REUSE:
+ if (st->npixels <= 0)
+ {
+ mono_p = 1;
+ goto MONO;
+ }
+ gcv.foreground = st->pixels [random () % st->npixels];
+# ifdef DO_STIPPLE
+ gcv.background = st->pixels [random () % st->npixels];
+# endif /* DO_STIPPLE */
+ DONE:
+ ;
+
+# ifdef HAVE_JWXYZ
+ {
+ /* give a non-opaque alpha to the color */
+ unsigned long pixel = gcv.foreground;
+ unsigned long amask = BlackPixel (dpy,0);
+ unsigned long a = (random() & amask);
+ pixel = (pixel & (~amask)) | a;
+ gcv.foreground = pixel;
+ }
+# endif /* !HAVE_JWXYZ */
+ }
+# ifndef DO_STIPPLE
+ XChangeGC (st->dpy, st->gc, GCForeground, &gcv);
+# else /* DO_STIPPLE */
+ XChangeGC (st->dpy, st->gc, GCStipple|GCForeground|GCBackground, &gcv);
+# endif /* DO_STIPPLE */
+ XFillRectangle (st->dpy, st->window, st->gc, x, y, w, h);
+ return st->delay;
+}
+
+
+static const char *greynetic_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 10000",
+ "*grey: false",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec greynetic_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-grey", ".grey", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+static void
+greynetic_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xlim = w;
+ st->ylim = h;
+}
+
+static Bool
+greynetic_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+greynetic_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (st->dpy, st->gc);
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Greynetic", greynetic)
+
diff --git a/hacks/greynetic.man b/hacks/greynetic.man
new file mode 100644
index 0000000..1144a82
--- /dev/null
+++ b/hacks/greynetic.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+greynetic - draw random stippled/color rectangles
+.SH SYNOPSIS
+.B greynetic
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIgreynetic\fP program draws random rectangles.
+.SH OPTIONS
+.I greynetic
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/halftone.c b/hacks/halftone.c
new file mode 100644
index 0000000..b70a636
--- /dev/null
+++ b/hacks/halftone.c
@@ -0,0 +1,397 @@
+/* halftone, Copyright (c) 2002 by Peter Jaric <peter@jaric.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Description:
+ * Draws the gravitational force in each point on the screen seen
+ * through a halftone dot pattern. The force is calculated from a set
+ * of moving mass points. View it from a distance for best effect.
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "screenhack.h"
+
+#define DEFAULT_DELAY 10000
+#define DEFAULT_SPACING 14
+#define DEFAULT_SIZE_FACTOR 1.5
+#define DEFAULT_COUNT 10
+#define DEFAULT_MIN_MASS 0.001
+#define DEFAULT_MAX_MASS 0.02
+#define DEFAULT_MIN_SPEED 0.001
+#define DEFAULT_MAX_SPEED 0.02
+
+
+typedef struct
+{
+ /* halftone dots */
+ double * dots;
+ int dots_width;
+ int dots_height;
+ int spacing;
+ int max_dot_size;
+
+ /* Moving gravity points */
+ int gravity_point_count;
+
+ double* gravity_point_x;
+ double* gravity_point_y;
+ double* gravity_point_mass;
+ double* gravity_point_x_inc;
+ double* gravity_point_y_inc;
+
+ /* X stuff */
+ Display *dpy;
+ Window window;
+ GC gc;
+
+ int ncolors;
+ XColor *colors;
+ int color0, color1;
+ int color_tick, cycle_speed;
+
+ /* Off screen buffer */
+ Pixmap buffer;
+ GC buffer_gc;
+ int buffer_width;
+ int buffer_height;
+
+ int delay;
+
+} halftone_screen;
+
+
+static void update_buffer(halftone_screen *halftone, XWindowAttributes * attrs)
+{
+ if (halftone->buffer_width != attrs->width ||
+ halftone->buffer_height != attrs->height)
+ {
+ XGCValues gc_values;
+
+ if (halftone->buffer_width != -1 &&
+ halftone->buffer_height != -1)
+ {
+ if (halftone->buffer != halftone->window)
+ XFreePixmap(halftone->dpy, halftone->buffer);
+ XFreeGC(halftone->dpy, halftone->buffer_gc);
+ }
+
+ halftone->buffer_width = attrs->width;
+ halftone->buffer_height = attrs->height;
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ halftone->buffer = halftone->window;
+#else
+ halftone->buffer = XCreatePixmap(halftone->dpy, halftone->window, halftone->buffer_width, halftone->buffer_height, attrs->depth);
+#endif
+
+ halftone->buffer_gc = XCreateGC(halftone->dpy, halftone->buffer, 0, &gc_values);
+ }
+}
+
+static void update_dot_attributes(halftone_screen *halftone, XWindowAttributes * attrs)
+{
+ double dots_width = attrs->width / halftone->spacing + 1;
+ double dots_height = attrs->height / halftone->spacing + 1;
+
+ if (halftone->dots == NULL ||
+ (dots_width != halftone->dots_width ||
+ dots_height != halftone->dots_height))
+ {
+ if (halftone->dots != NULL)
+ free(halftone->dots);
+
+ halftone->dots_width = dots_width;
+ halftone->dots_height = dots_height;
+ halftone->dots = (double *) malloc(halftone->dots_width * halftone->dots_height * sizeof(double));
+ }
+}
+
+static void *
+halftone_init (Display *dpy, Window window)
+{
+ int x, y, i;
+ int count;
+ int spacing;
+ double factor;
+ double min_mass;
+ double max_mass;
+ double min_speed;
+ double max_speed;
+ XGCValues gc_values;
+ XWindowAttributes attrs;
+ halftone_screen *halftone;
+
+ halftone = (halftone_screen *) calloc (1, sizeof(halftone_screen));
+
+ halftone->dpy = dpy;
+ halftone->window = window;
+
+ halftone->delay = get_integer_resource (dpy, "delay", "Integer");
+ halftone->delay = (halftone->delay < 0 ? DEFAULT_DELAY : halftone->delay);
+
+ halftone->gc = XCreateGC (halftone->dpy, halftone->window, 0, &gc_values);
+
+ halftone->buffer_width = -1;
+ halftone->buffer_height = -1;
+ halftone->dots = NULL;
+
+ /* Read command line arguments and set all settings. */
+ count = get_integer_resource (dpy, "count", "Count");
+ halftone->gravity_point_count = count < 1 ? DEFAULT_COUNT : count;
+
+ spacing = get_integer_resource (dpy, "spacing", "Integer");
+ halftone->spacing = spacing < 1 ? DEFAULT_SPACING : spacing;
+
+ factor = get_float_resource (dpy, "sizeFactor", "Double");
+ halftone->max_dot_size =
+ (factor < 0 ? DEFAULT_SIZE_FACTOR : factor) * halftone->spacing;
+
+ min_mass = get_float_resource (dpy, "minMass", "Double");
+ min_mass = min_mass < 0 ? DEFAULT_MIN_MASS : min_mass;
+
+ max_mass = get_float_resource (dpy, "maxMass", "Double");
+ max_mass = max_mass < 0 ? DEFAULT_MAX_MASS : max_mass;
+ max_mass = max_mass < min_mass ? min_mass : max_mass;
+
+ min_speed = get_float_resource (dpy, "minSpeed", "Double");
+ min_speed = min_speed < 0 ? DEFAULT_MIN_SPEED : min_speed;
+
+ max_speed = get_float_resource (dpy, "maxSpeed", "Double");
+ max_speed = max_speed < 0 ? DEFAULT_MAX_SPEED : max_speed;
+ max_speed = max_speed < min_speed ? min_speed : max_speed;
+
+
+ /* Set up the moving gravity points. */
+ halftone->gravity_point_x = (double *) malloc(halftone->gravity_point_count * sizeof(double));
+ halftone->gravity_point_y = (double *) malloc(halftone->gravity_point_count * sizeof(double));
+ halftone->gravity_point_mass = (double *) malloc(halftone->gravity_point_count * sizeof(double));
+ halftone->gravity_point_x_inc = (double *) malloc(halftone->gravity_point_count * sizeof(double));
+ halftone->gravity_point_y_inc = (double *) malloc(halftone->gravity_point_count * sizeof(double));
+
+ for (i = 0; i < halftone->gravity_point_count; i++)
+ {
+ halftone->gravity_point_x[i] = frand(1);
+ halftone->gravity_point_y[i] = frand(1);
+ halftone->gravity_point_mass[i] = min_mass + (max_mass - min_mass) * frand(1);
+ halftone->gravity_point_x_inc[i] = min_speed + (max_speed - min_speed) * frand(1);
+ halftone->gravity_point_y_inc[i] = min_speed + (max_speed - min_speed) * frand(1);
+ }
+
+
+ /* Set up the dots. */
+ XGetWindowAttributes(halftone->dpy, halftone->window, &attrs);
+
+ halftone->ncolors = get_integer_resource (dpy, "colors", "Colors");
+ if (halftone->ncolors < 4) halftone->ncolors = 4;
+ halftone->colors = (XColor *) calloc(halftone->ncolors, sizeof(XColor));
+ make_smooth_colormap (attrs.screen, attrs.visual, attrs.colormap,
+ halftone->colors, &halftone->ncolors,
+ True, 0, False);
+ halftone->color0 = 0;
+ halftone->color1 = halftone->ncolors / 2;
+ halftone->cycle_speed = get_integer_resource (dpy, "cycleSpeed", "CycleSpeed");
+ halftone->color_tick = 0;
+
+ update_buffer(halftone, &attrs);
+ update_dot_attributes(halftone, &attrs);
+
+ for (x = 0; x < halftone->dots_width; x++)
+ for (y = 0; y < halftone->dots_height; y++)
+ {
+ halftone->dots[x + y * halftone->dots_width] = 0;
+ }
+
+ return halftone;
+}
+
+
+
+static void fill_circle(Display *dpy, Window window, GC gc, int x, int y, int size)
+{
+ int start_x = x - (size / 2);
+ int start_y = y - (size / 2);
+ unsigned int width = size;
+ unsigned int height = size;
+ int angle1 = 0;
+ int angle2 = 360 * 64; /* A full circle */
+
+ XFillArc (dpy, window, gc,
+ start_x, start_y, width, height,
+ angle1, angle2);
+}
+
+static void repaint_halftone(halftone_screen *halftone)
+{
+ int x, y;
+ /*
+ int x_offset = halftone->spacing / 2;
+ int y_offset = halftone->spacing / 2;
+ */
+ int x_offset = 0;
+ int y_offset = 0;
+
+
+ /* Fill buffer with background color */
+ XSetForeground (halftone->dpy, halftone->buffer_gc,
+ halftone->colors[halftone->color0].pixel);
+ XFillRectangle(halftone->dpy, halftone->buffer, halftone->buffer_gc, 0, 0, halftone->buffer_width, halftone->buffer_height);
+
+ /* Draw dots on buffer */
+ XSetForeground (halftone->dpy, halftone->buffer_gc,
+ halftone->colors[halftone->color1].pixel);
+
+ if (halftone->color_tick++ >= halftone->cycle_speed)
+ {
+ halftone->color_tick = 0;
+ halftone->color0 = (halftone->color0 + 1) % halftone->ncolors;
+ halftone->color1 = (halftone->color1 + 1) % halftone->ncolors;
+ }
+
+ for (x = 0; x < halftone->dots_width; x++)
+ for (y = 0; y < halftone->dots_height; y++)
+ fill_circle(halftone->dpy, halftone->buffer, halftone->buffer_gc,
+ x_offset + x * halftone->spacing, y_offset + y * halftone->spacing,
+ halftone->max_dot_size * halftone->dots[x + y * halftone->dots_width]);
+
+ /* Copy buffer to window */
+ if (halftone->buffer != halftone->window)
+ XCopyArea(halftone->dpy, halftone->buffer, halftone->window, halftone->gc, 0, 0, halftone->buffer_width, halftone->buffer_height, 0, 0);
+}
+
+static double calculate_gravity(halftone_screen *halftone, int x, int y)
+{
+ int i;
+ double gx = 0;
+ double gy = 0;
+
+ for (i = 0; i < halftone->gravity_point_count; i++)
+ {
+ double dx = ((double) x) - halftone->gravity_point_x[i] * halftone->dots_width;
+ double dy = ((double) y) - halftone->gravity_point_y[i] * halftone->dots_height;
+ double distance = sqrt(dx * dx + dy * dy);
+
+ if (distance != 0)
+ {
+ double gravity = halftone->gravity_point_mass[i] / (distance * distance / (halftone->dots_width * halftone->dots_height));
+
+ gx += (dx / distance) * gravity;
+ gy += (dy / distance) * gravity;
+ }
+ }
+
+ return sqrt(gx * gx + gy * gy);
+}
+
+static void update_halftone(halftone_screen *halftone)
+{
+ int x, y, i;
+ XWindowAttributes attrs;
+
+ XGetWindowAttributes(halftone->dpy, halftone->window, &attrs);
+
+ /* Make sure we have a valid buffer */
+ update_buffer(halftone, &attrs);
+
+ /* Make sure all dot attributes (spacing, width, height, etc) are correct */
+ update_dot_attributes(halftone, &attrs);
+
+ /* Move gravity points */
+ for (i = 0; i < halftone->gravity_point_count; i++)
+ {
+ halftone->gravity_point_x_inc[i] =
+ (halftone->gravity_point_x[i] >= 1 || halftone->gravity_point_x[i] <= 0 ?
+ -halftone->gravity_point_x_inc[i] :
+ halftone->gravity_point_x_inc[i]);
+ halftone->gravity_point_y_inc[i] =
+ (halftone->gravity_point_y[i] >= 1 || halftone->gravity_point_y[i] <= 0 ?
+ -halftone->gravity_point_y_inc[i] :
+ halftone->gravity_point_y_inc[i]);
+
+ halftone->gravity_point_x[i] += halftone->gravity_point_x_inc[i];
+ halftone->gravity_point_y[i] += halftone->gravity_point_y_inc[i];
+ }
+
+ /* Update gravity in each dot .*/
+ for (x = 0; x < halftone->dots_width; x++)
+ for (y = 0; y < halftone->dots_height; y++)
+ {
+ double gravity = calculate_gravity(halftone, x, y);
+
+ halftone->dots[x + y * halftone->dots_width] = (gravity > 1 ? 1 : (gravity < 0 ? 0 : gravity));
+ }
+}
+
+
+static unsigned long
+halftone_draw (Display *dpy, Window window, void *closure)
+{
+ halftone_screen *halftone = (halftone_screen *) closure;
+
+ repaint_halftone(halftone);
+ update_halftone(halftone);
+
+ return halftone->delay;
+}
+
+
+static void
+halftone_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+halftone_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+halftone_free (Display *dpy, Window window, void *closure)
+{
+ halftone_screen *halftone = (halftone_screen *) closure;
+ free (halftone);
+}
+
+
+static const char *halftone_defaults [] = {
+ ".background: Black",
+ "*delay: 10000",
+ "*count: 10",
+ "*minMass: 0.001",
+ "*maxMass: 0.02",
+ "*minSpeed: 0.001",
+ "*maxSpeed: 0.02",
+ "*spacing: 14",
+ "*sizeFactor: 1.5",
+ "*colors: 200",
+ "*cycleSpeed: 10",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec halftone_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-minmass", ".minMass", XrmoptionSepArg, 0 },
+ { "-maxmass", ".maxMass", XrmoptionSepArg, 0 },
+ { "-minspeed", ".minSpeed", XrmoptionSepArg, 0 },
+ { "-maxspeed", ".maxSpeed", XrmoptionSepArg, 0 },
+ { "-spacing", ".spacing", XrmoptionSepArg, 0 },
+ { "-sizefactor", ".sizeFactor", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-cycle-speed", ".cycleSpeed", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Halftone", halftone)
diff --git a/hacks/halftone.man b/hacks/halftone.man
new file mode 100644
index 0000000..21ffb13
--- /dev/null
+++ b/hacks/halftone.man
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "9-oct-2002" "X Version 11"
+.SH NAME
+halftone - simple halftone pattern of moving mass points
+.SH SYNOPSIS
+.B halftone
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-spacing \fInumber\fP]
+[\-sizefactor \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-minmass \fInumber\fP]
+[\-maxmass \fInumber\fP]
+[\-minspeed \fInumber\fP]
+[\-maxspeed \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws the gravity force in each point on the screen seen through a
+halftone dot pattern. The gravity force is calculated from a set of
+moving mass points. View it from a distance for best effect.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+How many mass points to move around. Default: 10
+.TP 8
+.B \-spacing \fInumber\fP
+Distance between each halftone dot. Default: 14
+.TP 8
+.B \-sizefactor \fInumber\fP
+How big each halftone dot should be drawn compared to the spacing value. Default: 1.5
+.TP 8
+.B \-minmass \fInumber\fP
+The minimum mass of each mass point. Default: 0.001
+.TP 8
+.B \-maxmass \fInumber\fP
+The maximum mass of each mass point. Default: 0.02
+.TP 8
+.B \-minspeed \fInumber\fP
+The minimum speed of each mass point. Default: 0.001
+.TP 8
+.B \-maxspeed \fInumber\fP
+The maximum speed of each mass point. Default: 0.02
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Peter Jaric. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any
+purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Peter Jaric
+
diff --git a/hacks/halo.c b/hacks/halo.c
new file mode 100644
index 0000000..42b6a55
--- /dev/null
+++ b/hacks/halo.c
@@ -0,0 +1,440 @@
+/* xscreensaver, Copyright (c) 1993-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* I wanted to lay down new circles with TV:ALU-ADD instead of TV:ALU-XOR,
+ but X doesn't support arithmetic combinations of pixmaps!! What losers.
+ I suppose I could crank out the 2's compliment math by hand, but that's
+ a real drag...
+
+ This would probably look good with shapes other than circles as well.
+
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+
+struct circle {
+ int x, y, radius;
+ int increment;
+ int dx, dy;
+};
+
+static enum color_mode {
+ seuss_mode, ramp_mode, random_mode
+} cmode;
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ struct circle *circles;
+ int count, global_count;
+ Pixmap pixmap, buffer;
+ int width, height, global_inc;
+ int delay, delay2;
+ unsigned long fg_pixel, bg_pixel;
+ GC draw_gc, erase_gc, copy_gc, merge_gc;
+ Bool anim_p;
+ Colormap cmap;
+
+ int ncolors;
+ XColor *colors;
+ int fg_index;
+ int bg_index;
+
+ int iterations;
+ Bool done_once;
+ Bool done_once_no_really;
+ int clear_tick;
+ struct timeval then;
+};
+
+#define min(x,y) ((x)<(y)?(x):(y))
+#define max(x,y) ((x)>(y)?(x):(y))
+
+static void
+init_circles_1 (struct state *st)
+{
+ int i;
+ st->count = (st->global_count ? st->global_count
+ : (3 + (random () % max (1, (min (st->width, st->height) / 50)))
+ + (random () % max (1, (min (st->width, st->height) / 50)))));
+ st->circles = (struct circle *) malloc (st->count * sizeof (struct circle));
+ for (i = 0; i < st->count; i++)
+ {
+ st->circles [i].x = 10 + random () % (st->width - 20);
+ st->circles [i].y = 10 + random () % (st->height - 20);
+ if (st->global_inc)
+ st->circles [i].increment = st->global_inc;
+ else
+ { /* prefer smaller increments to larger ones */
+ int j = 8;
+ int inc = ((random()%j) + (random()%j) + (random()%j)) - ((j*3)/2);
+ if (inc < 0) inc = -inc + 3;
+ st->circles [i].increment = inc + 3;
+ }
+ st->circles [i].radius = random () % st->circles [i].increment;
+ st->circles [i].dx = ((random () % 3) - 1) * (1 + random () % 5);
+ st->circles [i].dy = ((random () % 3) - 1) * (1 + random () % 5);
+ }
+}
+
+static void *
+halo_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ char *mode_str = 0;
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->cmap = xgwa.colormap;
+ st->global_count = get_integer_resource (st->dpy, "count", "Integer");
+ if (st->global_count < 0) st->global_count = 0;
+ st->global_inc = get_integer_resource (st->dpy, "increment", "Integer");
+ if (st->global_inc < 0) st->global_inc = 0;
+ st->anim_p = get_boolean_resource (st->dpy, "animate", "Boolean");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer") * 1000000;
+ mode_str = get_string_resource (st->dpy, "colorMode", "ColorMode");
+ if (! mode_str) cmode = random_mode;
+ else if (!strcmp (mode_str, "seuss")) cmode = seuss_mode;
+ else if (!strcmp (mode_str, "ramp")) cmode = ramp_mode;
+ else if (!strcmp (mode_str, "random")) cmode = random_mode;
+ else {
+ fprintf (stderr,
+ "%s: colorMode must be seuss, ramp, or random, not \"%s\"\n",
+ progname, mode_str);
+ exit (1);
+ }
+
+ if (mono_p) cmode = seuss_mode;
+ if (cmode == random_mode)
+ cmode = ((random()&3) == 1) ? ramp_mode : seuss_mode;
+
+ if (cmode == ramp_mode)
+ st->anim_p = False; /* This combo doesn't work right... */
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+
+ if (mono_p)
+ st->colors = 0;
+ else
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+
+
+ if (mono_p)
+ ;
+ else if (random() % (cmode == seuss_mode ? 2 : 10))
+ make_uniform_colormap (xgwa.screen, xgwa.visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+ else
+ make_smooth_colormap (xgwa.screen, xgwa.visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+
+ if (st->ncolors <= 2) mono_p = True;
+ if (mono_p) cmode = seuss_mode;
+
+ if (mono_p)
+ {
+ st->fg_pixel = get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+ st->bg_pixel = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
+ }
+ else
+ {
+ st->fg_index = 0;
+ st->bg_index = st->ncolors / 4;
+ if (st->fg_index == st->bg_index) st->bg_index++;
+ st->fg_pixel = st->colors[st->fg_index].pixel;
+ st->bg_pixel = st->colors[st->bg_index].pixel;
+ }
+
+ st->width = max (50, xgwa.width);
+ st->height = max (50, xgwa.height);
+
+#ifdef DEBUG
+ st->width/=2; st->height/=2;
+#endif
+
+ st->pixmap = XCreatePixmap (st->dpy, st->window, st->width, st->height, 1);
+ if (cmode == seuss_mode)
+ st->buffer = XCreatePixmap (st->dpy, st->window, st->width, st->height, 1);
+ else
+ st->buffer = 0;
+
+ gcv.foreground = 1;
+ gcv.background = 0;
+ st->draw_gc = XCreateGC (st->dpy, st->pixmap, GCForeground | GCBackground, &gcv);
+ gcv.foreground = 0;
+ st->erase_gc = XCreateGC (st->dpy, st->pixmap, GCForeground, &gcv);
+ gcv.foreground = st->fg_pixel;
+ gcv.background = st->bg_pixel;
+ st->copy_gc = XCreateGC (st->dpy, st->window, GCForeground | GCBackground, &gcv);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, st->draw_gc, False);
+ jwxyz_XSetAntiAliasing (dpy, st->erase_gc, False);
+ jwxyz_XSetAntiAliasing (dpy, st->copy_gc, False);
+#endif
+
+ if (cmode == seuss_mode)
+ {
+ gcv.foreground = 1;
+ gcv.background = 0;
+ gcv.function = GXxor;
+ st->merge_gc = XCreateGC (st->dpy, st->pixmap,
+ GCForeground | GCBackground | GCFunction, &gcv);
+ }
+ else
+ {
+ gcv.foreground = st->fg_pixel;
+ gcv.background = st->bg_pixel;
+ gcv.function = GXcopy;
+ st->merge_gc = XCreateGC (st->dpy, st->window,
+ GCForeground | GCBackground | GCFunction, &gcv);
+ }
+
+ init_circles_1 (st);
+ XClearWindow (st->dpy, st->window);
+ if (st->buffer) XFillRectangle (st->dpy, st->buffer, st->erase_gc, 0, 0, st->width, st->height);
+ return st;
+}
+
+static unsigned long
+halo_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ Bool done = False;
+ Bool inhibit_sleep = False;
+ int this_delay = st->delay;
+
+ XFillRectangle (st->dpy, st->pixmap, st->erase_gc, 0, 0, st->width, st->height);
+ for (i = 0; i < st->count; i++)
+ {
+ int radius = st->circles [i].radius;
+ int inc = st->circles [i].increment;
+
+ if (! (st->iterations & 1)) /* never stop on an odd number of iterations */
+ ;
+ else if (radius == 0) /* eschew inf */
+ ;
+ else if (radius < 0) /* stop when the circles are points */
+ done = True;
+ else /* stop when the circles fill the st->window */
+ {
+ /* Probably there's a simpler way to ask the musical question,
+ "is this square completely enclosed by this circle," but I've
+ forgotten too much trig to know it... (That's not really the
+ right question anyway, but the right question is too hard.) */
+ double x1 = ((double) (-st->circles [i].x)) / ((double) radius);
+ double y1 = ((double) (-st->circles [i].y)) / ((double) radius);
+ double x2 = ((double) (st->width - st->circles [i].x)) / ((double) radius);
+ double y2 = ((double) (st->height - st->circles [i].y)) / ((double) radius);
+ x1 *= x1; x2 *= x2; y1 *= y1; y2 *= y2;
+ if ((x1 + y1) < 1 && (x2 + y2) < 1 && (x1 + y2) < 1 && (x2 + y1) < 1)
+ done = True;
+ }
+
+ if (radius > 0 &&
+ (cmode == seuss_mode || /* drawing all circles, or */
+ st->circles [0].increment < 0)) /* on the way back in */
+ {
+ XFillArc (st->dpy,
+ (cmode == seuss_mode ? st->pixmap : st->window),
+ (cmode == seuss_mode ? st->draw_gc : st->merge_gc),
+ st->circles [i].x - radius, st->circles [i].y - radius,
+ radius * 2, radius * 2, 0, 360*64);
+ }
+ st->circles [i].radius += inc;
+ }
+
+ if (st->anim_p && !st->done_once)
+ inhibit_sleep = !done;
+
+ if (done)
+ {
+ if (st->anim_p)
+ {
+ st->done_once = True;
+ for (i = 0; i < st->count; i++)
+ {
+ st->circles [i].x += st->circles [i].dx;
+ st->circles [i].y += st->circles [i].dy;
+ st->circles [i].radius %= st->circles [i].increment;
+ if (st->circles [i].x < 0 || st->circles [i].x >= st->width)
+ {
+ st->circles [i].dx = -st->circles [i].dx;
+ st->circles [i].x += (2 * st->circles [i].dx);
+ }
+ if (st->circles [i].y < 0 || st->circles [i].y >= st->height)
+ {
+ st->circles [i].dy = -st->circles [i].dy;
+ st->circles [i].y += (2 * st->circles [i].dy);
+ }
+ }
+ }
+ else if (st->circles [0].increment < 0)
+ {
+ /* We've zoomed out and the screen is blank -- re-pick the
+ center points, and shift the st->colors.
+ */
+ free (st->circles);
+ init_circles_1 (st);
+ if (! mono_p)
+ {
+ st->fg_index = (st->fg_index + 1) % st->ncolors;
+ st->bg_index = (st->fg_index + (st->ncolors/2)) % st->ncolors;
+ XSetForeground (st->dpy, st->copy_gc, st->colors [st->fg_index].pixel);
+ XSetBackground (st->dpy, st->copy_gc, st->colors [st->bg_index].pixel);
+ }
+ }
+ /* Sometimes go out from the inside instead of the outside */
+ else if (st->clear_tick == 0 && ((random () % 3) == 0))
+ {
+ st->iterations = 0; /* ick */
+ for (i = 0; i < st->count; i++)
+ st->circles [i].radius %= st->circles [i].increment;
+
+ st->clear_tick = ((random() % 8) + 4) | 1; /* must be odd */
+ }
+ else
+ {
+ for (i = 0; i < st->count; i++)
+ {
+ st->circles [i].increment = -st->circles [i].increment;
+ st->circles [i].radius += (2 * st->circles [i].increment);
+ }
+ }
+ }
+
+ if (st->buffer)
+ XCopyPlane (st->dpy, st->pixmap, st->buffer, st->merge_gc, 0, 0, st->width, st->height, 0, 0, 1);
+ else if (cmode != seuss_mode)
+ {
+
+ if (!mono_p)
+ {
+ st->fg_index++;
+ st->bg_index++;
+ if (st->fg_index >= st->ncolors) st->fg_index = 0;
+ if (st->bg_index >= st->ncolors) st->bg_index = 0;
+ XSetForeground (st->dpy, st->merge_gc, st->colors [st->fg_index].pixel);
+ }
+
+ if (st->circles [0].increment >= 0)
+ inhibit_sleep = True;
+ else if (done && cmode == seuss_mode)
+ XFillRectangle (st->dpy, st->window, st->merge_gc, 0, 0, st->width, st->height);
+ }
+ else
+ XCopyPlane (st->dpy, st->pixmap, st->window, st->merge_gc, 0, 0, st->width, st->height, 0, 0, 1);
+
+ /* st->buffer is only used in seuss-mode or anim-mode */
+ if (st->buffer && (st->anim_p
+ ? (done || (!st->done_once && (st->iterations & 1)))
+ : (st->iterations & 1)))
+ {
+ XCopyPlane (st->dpy, st->buffer, st->window, st->copy_gc, 0, 0, st->width, st->height, 0, 0, 1);
+ if (st->anim_p && done)
+ XFillRectangle (st->dpy, st->buffer, st->erase_gc, 0, 0, st->width, st->height);
+ }
+
+#ifdef DEBUG
+ XCopyPlane (st->dpy, st->pixmap, st->window, st->copy_gc, 0,0,st->width,st->height,st->width,st->height, 1);
+ if (st->buffer)
+ XCopyPlane (st->dpy, st->buffer, st->window, st->copy_gc, 0,0,st->width,st->height,0,st->height, 1);
+#endif
+
+ if (done)
+ st->iterations = 0;
+ else
+ st->iterations++;
+
+ if (st->delay && !inhibit_sleep)
+ {
+ int d = st->delay;
+
+ if (cmode == seuss_mode && st->anim_p)
+ this_delay = d/100;
+ else
+ this_delay = d;
+
+ if (done)
+ st->done_once_no_really = True;
+ }
+
+ if (done && st->clear_tick > 0)
+ {
+ st->clear_tick--;
+ if (!st->clear_tick)
+ {
+ XClearWindow (st->dpy, st->window);
+ if (st->buffer) XFillRectangle (st->dpy, st->buffer, st->erase_gc, 0,0,st->width,st->height);
+ }
+ }
+
+ if (inhibit_sleep) this_delay = 0;
+
+ return this_delay;
+}
+
+
+
+static const char *halo_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*colorMode: random",
+ "*colors: 100",
+ "*count: 0",
+ "*delay: 100000",
+ "*delay2: 20",
+ "*increment: 0",
+ "*animate: False",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec halo_options [] = {
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-animate", ".animate", XrmoptionNoArg, "True" },
+ { "-mode", ".colorMode", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+static void
+halo_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+halo_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+halo_free (Display *dpy, Window window, void *closure)
+{
+}
+
+XSCREENSAVER_MODULE ("Halo", halo)
diff --git a/hacks/halo.man b/hacks/halo.man
new file mode 100644
index 0000000..98960c4
--- /dev/null
+++ b/hacks/halo.man
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "12-Jun-97" "X Version 11"
+.SH NAME
+halo - draw circular patterns
+.SH SYNOPSIS
+.B halo
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIint\fP] [\-delay \fIusecs\fP] [\-mode seuss | ramp | random ] [\-animate] [\-colors \fIinteger\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIhalo\fP program draws cool patterns based on circles.
+.SH OPTIONS
+.I halo
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+How many circles to draw. Default 0, meaning random.
+.TP 8
+.B \-mode "seuss | ramp | random"
+In \fIseuss\fP mode, alternating striped curves will be drawn.
+
+In \fIramp\fP mode, a color ramp will be drawn.
+
+\fIrandom\fP means pick the mode randomly.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 100000, or about 0.1 second.
+.TP 8
+.B \-colors \fIinteger\fP
+How many colors to use. Default 100.
+.TP 8
+.B \-animate
+If specified, then the centerpoints of the circles will bounce around.
+Otherwise, the circles will be drawn once, erased, and a new set of
+circles will be drawn.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1993 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 6-jul-93.
diff --git a/hacks/helix.c b/hacks/helix.c
new file mode 100644
index 0000000..0fdaa90
--- /dev/null
+++ b/hacks/helix.c
@@ -0,0 +1,356 @@
+/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Algorithm from a Mac program by Chris Tate, written in 1988 or so. */
+
+/* 18-Sep-97: Johannes Keukelaar (johannes@nada.kth.se): Improved screen
+ * eraser.
+ * 10-May-97: merged ellipse code by Dan Stromberg <strombrg@nis.acs.uci.edu>
+ * as found in xlockmore 4.03a10.
+ * 1992: jwz created.
+ */
+
+/* 25 April 2002: Matthew Strait <straitm@mathcs.carleton.edu> added
+-subdelay option so the drawing process can be watched */
+
+#include <math.h>
+#include "screenhack.h"
+#include "erase.h"
+
+enum draw_state { HELIX, DRAW_HELIX, TRIG, DRAW_TRIG, LINGER, ERASE };
+
+struct state {
+ enum draw_state dstate;
+ double sins [360];
+ double coss [360];
+
+ GC draw_gc;
+ unsigned int default_fg_pixel;
+ int sleep_time;
+ int subdelay;
+ eraser_state *eraser;
+
+ int width, height;
+ Colormap cmap;
+
+ int x1, y1, x2, y2, angle, i;
+
+ int radius1, radius2, d_angle, factor1, factor2, factor3, factor4;
+ int d_angle_offset;
+ int offset, dir, density;
+};
+
+static void *
+helix_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ st->sleep_time = get_integer_resource(dpy, "delay", "Integer");
+ st->subdelay = get_integer_resource(dpy, "subdelay", "Integer");
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ st->cmap = xgwa.colormap;
+ gcv.foreground = st->default_fg_pixel =
+ get_pixel_resource (dpy, st->cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (dpy, st->cmap, "background", "Background");
+
+ for (i = 0; i < 360; i++)
+ {
+ st->sins [i] = sin ((((double) i) / 180.0) * M_PI);
+ st->coss [i] = cos ((((double) i) / 180.0) * M_PI);
+ }
+
+ st->dstate = (random() & 1) ? HELIX : TRIG;
+
+ return st;
+}
+
+static int
+gcd (int a, int b)
+{
+ while (b > 0)
+ {
+ int tmp;
+ tmp = a % b;
+ a = b;
+ b = tmp;
+ }
+ return (a < 0 ? -a : a);
+}
+
+static void
+helix (Display *dpy, Window window, struct state *st)
+{
+ int xmid = st->width / 2;
+ int ymid = st->height / 2;
+ int limit = 1 + (360 / gcd (360, st->d_angle));
+
+ if (st->i == 0)
+ {
+ st->x1 = xmid;
+ st->y1 = ymid + st->radius2;
+ st->x2 = xmid;
+ st->y2 = ymid + st->radius1;
+ st->angle = 0;
+ }
+
+/* for (st->i = 0; st->i < limit; st->i++)*/
+ {
+ int tmp;
+#define pmod(x,y) (tmp=((x) % (y)), (tmp >= 0 ? tmp : (tmp + (y))))
+
+ st->x1 = xmid + (((double) st->radius1) * st->sins [pmod ((st->angle * st->factor1), 360)]);
+ st->y1 = ymid + (((double) st->radius2) * st->coss [pmod ((st->angle * st->factor2), 360)]);
+ XDrawLine (dpy, window, st->draw_gc, st->x1, st->y1, st->x2, st->y2);
+ st->x2 = xmid + (((double) st->radius2) * st->sins [pmod ((st->angle * st->factor3), 360)]);
+ st->y2 = ymid + (((double) st->radius1) * st->coss [pmod ((st->angle * st->factor4), 360)]);
+ XDrawLine (dpy, window, st->draw_gc, st->x1, st->y1, st->x2, st->y2);
+ st->angle += st->d_angle;
+ }
+ st->i++;
+
+ if (st->i >= limit)
+ st->dstate = LINGER;
+}
+
+static void
+trig (Display *dpy, Window window, struct state *st)
+{
+ int xmid = st->width / 2;
+ int ymid = st->height / 2;
+
+/* while (st->d_angle >= -360 && st->d_angle <= 360)*/
+ {
+ int tmp;
+ int angle = st->d_angle + st->d_angle_offset;
+ st->x1 = (st->sins [pmod(angle * st->factor1, 360)] * xmid) + xmid;
+ st->y1 = (st->coss [pmod(angle * st->factor1, 360)] * ymid) + ymid;
+ st->x2 = (st->sins [pmod(angle * st->factor2 + st->offset, 360)] * xmid) + xmid;
+ st->y2 = (st->coss [pmod(angle * st->factor2 + st->offset, 360)] * ymid) + ymid;
+ XDrawLine(dpy, window, st->draw_gc, st->x1, st->y1, st->x2, st->y2);
+ tmp = (int) 360 / (2 * st->density * st->factor1 * st->factor2);
+ if (tmp == 0) /* Do not want it getting stuck... */
+ tmp = 1; /* Would not need if floating point */
+ st->d_angle += st->dir * tmp;
+ }
+
+ if (st->d_angle < -360 || st->d_angle > 360)
+ st->dstate = LINGER;
+}
+
+
+#define min(a,b) ((a)<(b)?(a):(b))
+
+static void
+random_helix (Display *dpy, Window window, struct state *st,
+ XColor *color, Bool *got_color)
+{
+ int radius;
+ double divisor;
+
+ radius = min (st->width, st->height) / 2;
+
+ st->i = 0;
+ st->d_angle = 0;
+ st->factor1 = 2;
+ st->factor2 = 2;
+ st->factor3 = 2;
+ st->factor4 = 2;
+
+ divisor = ((frand (3.0) + 1) * (((random() & 1) * 2) - 1));
+
+ if ((random () & 1) == 0)
+ {
+ st->radius1 = radius;
+ st->radius2 = radius / divisor;
+ }
+ else
+ {
+ st->radius2 = radius;
+ st->radius1 = radius / divisor;
+ }
+
+ while (gcd (360, st->d_angle) >= 2)
+ st->d_angle = random () % 360;
+
+#define random_factor() \
+ (((random() % 7) ? ((random() & 1) + 1) : 3) \
+ * (((random() & 1) * 2) - 1))
+
+ while (gcd (gcd (gcd (st->factor1, st->factor2), st->factor3), st->factor4) != 1)
+ {
+ st->factor1 = random_factor ();
+ st->factor2 = random_factor ();
+ st->factor3 = random_factor ();
+ st->factor4 = random_factor ();
+ }
+
+ if (mono_p)
+ XSetForeground (dpy, st->draw_gc, st->default_fg_pixel);
+ else
+ {
+ hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5,
+ &color->red, &color->green, &color->blue);
+ if ((*got_color = XAllocColor (dpy, st->cmap, color)))
+ XSetForeground (dpy, st->draw_gc, color->pixel);
+ else
+ XSetForeground (dpy, st->draw_gc, st->default_fg_pixel);
+ }
+
+ XClearWindow (dpy, window);
+}
+
+static void
+random_trig (Display *dpy, Window window, struct state *st,
+ XColor *color, Bool *got_color)
+{
+ st->d_angle = 0;
+ st->factor1 = (random() % 8) + 1;
+ do {
+ st->factor2 = (random() % 8) + 1;
+ } while (st->factor1 == st->factor2);
+
+ st->dir = (random() & 1) ? 1 : -1;
+ st->d_angle_offset = random() % 360;
+ st->offset = ((random() % ((360 / 4) - 1)) + 1) / 4;
+ st->density = 1 << ((random() % 4) + 4); /* Higher density, higher angles */
+
+ if (mono_p)
+ XSetForeground (dpy, st->draw_gc, st->default_fg_pixel);
+ else
+ {
+ hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5,
+ &color->red, &color->green, &color->blue);
+ if ((*got_color = XAllocColor (dpy, st->cmap, color)))
+ XSetForeground (dpy, st->draw_gc, color->pixel);
+ else
+ XSetForeground (dpy, st->draw_gc, st->default_fg_pixel);
+ }
+
+ XClearWindow (dpy, window);
+}
+
+
+/* random_helix_or_trig */
+static unsigned long
+helix_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ Bool free_color = False;
+ XColor color;
+ int delay = st->subdelay;
+ int erase_delay = 10000;
+ int ii;
+
+ if (st->eraser) {
+ st->eraser = erase_window (dpy, window, st->eraser);
+ if (st->eraser)
+ delay = erase_delay;
+ goto END;
+ }
+
+ switch (st->dstate)
+ {
+ case LINGER:
+ delay = st->sleep_time * 1000000;
+ st->dstate = ERASE;
+ break;
+
+ case ERASE:
+ st->eraser = erase_window (dpy, window, st->eraser);
+ delay = erase_delay;
+ if (free_color) XFreeColors (dpy, st->cmap, &color.pixel, 1, 0);
+ st->dstate = (random() & 1) ? HELIX : TRIG;
+ break;
+
+ case DRAW_HELIX:
+ for (ii = 0; ii < 10; ii++) {
+ helix (dpy, window, st);
+ if (st->dstate != DRAW_HELIX)
+ break;
+ }
+ break;
+
+ case DRAW_TRIG:
+ for (ii = 0; ii < 5; ii++) {
+ trig (dpy, window, st);
+ if (st->dstate != DRAW_TRIG)
+ break;
+ }
+ break;
+
+ case HELIX:
+ random_helix (dpy, window, st, &color, &free_color);
+ st->dstate = DRAW_HELIX;
+ break;
+
+ case TRIG:
+ random_trig(dpy, window, st, &color, &free_color);
+ st->dstate = DRAW_TRIG;
+ break;
+
+ default:
+ abort();
+ }
+
+ END:
+ return delay;
+}
+
+static void
+helix_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+}
+
+static Bool
+helix_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+helix_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+static const char *helix_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 5",
+ "*subdelay: 20000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec helix_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-subdelay", ".subdelay", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 },
+};
+
+XSCREENSAVER_MODULE ("Helix", helix)
diff --git a/hacks/helix.man b/hacks/helix.man
new file mode 100644
index 0000000..e022294
--- /dev/null
+++ b/hacks/helix.man
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "18-sep-97" "X Version 11"
+.SH NAME
+helix - draw helical string-art patterns
+.SH SYNOPSIS
+.B helix
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-erase\-speed \fIusecs\fP] [\-erase\-mode \fIinteger\fP] [\-delay \fIseconds\fP] [\-install] [\-visual \fIvisual\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIhelix\fP program draws interesting patterns composed of line segments
+in random colors.
+.SH OPTIONS
+.I helix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-delay \fIseconds\fP
+This sets the number of seconds that the helix will be on the screen.
+.TP 8
+.B \-subdelay \fImicroseconds\fP
+This sets the amount of time to pause periodically while drawing.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+Screen eraser improved by Johannes Keukelaar <johannes@nada.kth.se>,
+ 18-sep-97.
diff --git a/hacks/hexadrop.c b/hacks/hexadrop.c
new file mode 100644
index 0000000..678a3c3
--- /dev/null
+++ b/hacks/hexadrop.c
@@ -0,0 +1,414 @@
+/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws a grid of hexagons or other shapes and drops them out.
+ * Created 8-Jul-2013.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+
+/* Avoid rounding errors by using a larger fixed-point grid.
+ Without this, we got little pointy errors at some corners. */
+#define SCALE 10
+
+typedef struct {
+ int sides;
+ int cx, cy;
+ double th, radius, i, speed;
+ int colors[2];
+ Bool initted_p;
+} cell;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+
+ int ncells, cells_size, gw, gh;
+ cell *cells;
+
+ int delay;
+ double speed;
+ int sides;
+ Bool lockstep_p;
+ Bool uniform_p;
+ Bool initted_p;
+
+ int ncolors;
+ XColor *colors;
+ GC gc;
+
+} state;
+
+
+static void
+make_cells (state *st)
+{
+ int grid_size = get_integer_resource (st->dpy, "size", "Size");
+ cell *cells2;
+ int size, r, gw, gh, x, y, i;
+ double th = 0;
+
+ if (grid_size < 5) grid_size = 5;
+
+ size = ((st->xgwa.width > st->xgwa.height
+ ? st->xgwa.width : st->xgwa.height)
+ / grid_size);
+ gw = st->xgwa.width / size;
+ gh = st->xgwa.height / size;
+
+ switch (st->sides) {
+ case 8:
+ r = size * 0.75;
+ th = M_PI / st->sides;
+ gw *= 1.25;
+ gh *= 1.25;
+ break;
+ case 6:
+ r = size / sqrt(3);
+ th = M_PI / st->sides;
+ gh *= 1.2;
+ break;
+ case 3:
+ size *= 2;
+ r = size / sqrt(3);
+ th = M_PI / st->sides / 2;
+ break;
+ case 4:
+ size /= 2;
+ r = size * sqrt (2);
+ th = M_PI / st->sides;
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ gw += 3; /* leave a few extra columns off screen just in case */
+ gh += 3;
+
+ st->ncells = gw * gh;
+
+ if (st->initted_p && !st->cells) abort();
+ if (!st->initted_p && st->cells) abort();
+
+ cells2 = (cell *) calloc (st->ncells, sizeof(*cells2));
+ if (! cells2) abort();
+
+ if (st->cells)
+ {
+ for (y = 0; y < (st->gh < gh ? st->gh : gh); y++)
+ for (x = 0; x < (st->gw < gw ? st->gw : gw); x++)
+ cells2[y * gw + x] = st->cells [y * st->gw + x];
+ free (st->cells);
+ st->cells = 0;
+ }
+
+ st->cells = cells2;
+ st->gw = gw;
+ st->gh = gh;
+
+ i = 0;
+ for (y = 0; y < gh; y++)
+ for (x = 0; x < gw; x++)
+ {
+ cell *c = &st->cells[i];
+ c->sides = st->sides;
+ c->radius = SCALE * r;
+ c->th = th;
+
+ switch (st->sides) {
+ case 8:
+ if (x & 1)
+ {
+ c->cx = SCALE * x * size;
+ c->radius /= 2;
+ c->th = M_PI / 4;
+ c->sides = 4;
+ c->radius *= 1.1;
+ }
+ else
+ {
+ c->cx = SCALE * x * size;
+ c->radius *= 1.02;
+ c->radius--;
+ }
+
+ if (y & 1)
+ c->cx -= SCALE * size;
+
+ c->cy = SCALE * y * size;
+
+ break;
+ case 6:
+ c->cx = SCALE * x * size;
+ c->cy = SCALE * y * size * sqrt(3)/2;
+ if (y & 1)
+ c->cx -= SCALE * size * 0.5;
+ break;
+ case 4:
+ c->cx = SCALE * x * size * 2;
+ c->cy = SCALE * y * size * 2;
+ break;
+ case 3:
+ c->cx = SCALE * x * size * 0.5;
+ c->cy = SCALE * y * size * sqrt(3)/2;
+ if ((x & 1) ^ (y & 1))
+ {
+ c->th = th + M_PI;
+ c->cy -= SCALE * r * 0.5;
+ }
+ break;
+ default:
+ abort();
+ }
+
+ if (! c->initted_p)
+ {
+ c->speed = st->speed * (st->uniform_p ? 1 : (0.1 + frand(0.9)));
+ c->i = st->lockstep_p ? 0 : random() % r;
+ c->colors[0] = (st->lockstep_p ? 0 : random() % st->ncolors);
+ c->colors[1] = 0;
+ c->initted_p = True;
+ }
+
+ c->radius += SCALE; /* Avoid single-pixel erase rounding errors */
+
+ if (c->i > c->radius) c->i = c->radius;
+ if (c->colors[0] >= st->ncolors) c->colors[0] = st->ncolors-1;
+ if (c->colors[1] >= st->ncolors) c->colors[1] = st->ncolors-1;
+
+ i++;
+ }
+
+ st->initted_p = True;
+}
+
+
+static void
+draw_cell (state *st, cell *c)
+{
+ XPoint points[20];
+ int i, j;
+ for (j = 0; j <= 1; j++)
+ {
+ int r = (j == 0 ? c->radius : c->i);
+ for (i = 0; i < c->sides; i++)
+ {
+ double th = i * M_PI * 2 / c->sides;
+ points[i].x = (c->cx + r * cos (th + c->th) + 0.5) / SCALE;
+ points[i].y = (c->cy + r * sin (th + c->th) + 0.5) / SCALE;
+ }
+ XSetForeground (st->dpy, st->gc, st->colors[c->colors[j]].pixel);
+ XFillPolygon (st->dpy, st->window, st->gc, points, c->sides,
+ Convex, CoordModeOrigin);
+ }
+
+ c->i -= SCALE * c->speed;
+ if (c->i < 0)
+ {
+ c->i = c->radius;
+ c->colors[1] = c->colors[0];
+ if (c != &st->cells[0])
+ c->colors[0] = st->cells[0].colors[0];
+ else
+ c->colors[0] = random() % st->ncolors;
+ }
+}
+
+
+static void
+hexadrop_init_1 (Display *dpy, Window window, state *st)
+{
+ XGCValues gcv;
+ char *s1, *s2;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ st->speed = get_float_resource (st->dpy, "speed", "Speed");
+ if (st->speed < 0) st->speed = 0;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ if (st->ncolors < 2) st->ncolors = 2;
+
+ st->colors = (XColor *) calloc (sizeof(*st->colors), st->ncolors);
+
+ if (st->ncolors < 10)
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, False, True, 0, True);
+ else
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+ XSetWindowBackground (dpy, window, st->colors[0].pixel);
+
+ s1 = get_string_resource (st->dpy, "uniform", "Uniform");
+ s2 = get_string_resource (st->dpy, "lockstep", "Lockstep");
+
+ if ((!s1 || !*s1 || !strcasecmp(s1, "maybe")) &&
+ (!s2 || !*s2 || !strcasecmp(s2, "maybe")))
+ {
+ /* When being random, don't do both. */
+ st->uniform_p = random() & 1;
+ st->lockstep_p = st->uniform_p ? 0 : random() & 1;
+ }
+ else
+ {
+ if (!s1 || !*s1 || !strcasecmp(s1, "maybe"))
+ st->uniform_p = random() & 1;
+ else
+ st->uniform_p = get_boolean_resource (st->dpy, "uniform", "Uniform");
+
+ if (!s2 || !*s2 || !strcasecmp(s2, "maybe"))
+ st->lockstep_p = random() & 1;
+ else
+ st->lockstep_p = get_boolean_resource (st->dpy, "lockstep","Lockstep");
+ }
+
+
+ st->sides = get_integer_resource (st->dpy, "sides", "Sides");
+ if (! (st->sides == 0 || st->sides == 3 || st->sides == 4 ||
+ st->sides == 6 || st->sides == 8))
+ {
+ printf ("%s: invalid number of sides: %d\n", progname, st->sides);
+ st->sides = 0;
+ }
+
+ if (! st->sides)
+ {
+ static int defs[] = { 3, 3, 3,
+ 4,
+ 6, 6, 6, 6,
+ 8, 8, 8 };
+ st->sides = defs[random() % countof(defs)];
+ }
+
+ make_cells (st);
+ gcv.foreground = st->colors[0].pixel;
+ st->gc = XCreateGC (dpy, window, GCForeground, &gcv);
+}
+
+
+static void *
+hexadrop_init (Display *dpy, Window window)
+{
+ state *st = (state *) calloc (1, sizeof(*st));
+ hexadrop_init_1 (dpy, window, st);
+ return st;
+}
+
+
+
+static unsigned long
+hexadrop_draw (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+ int i;
+
+ for (i = 0; i < st->ncells; i++)
+ draw_cell (st, &st->cells[i]);
+
+ return st->delay;
+}
+
+
+static void
+hexadrop_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *st = (state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ make_cells (st);
+}
+
+
+static void
+hexadrop_free (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+ if (st->colors)
+ {
+ free_colors (st->xgwa.screen, st->xgwa.colormap, st->colors, st->ncolors);
+ free (st->colors);
+ st->colors = 0;
+ }
+ if (st->cells)
+ {
+ free (st->cells);
+ st->cells = 0;
+ }
+ if (st->gc)
+ {
+ XFreeGC (st->dpy, st->gc);
+ st->gc = 0;
+ }
+}
+
+
+static Bool
+hexadrop_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ state *st = (state *) closure;
+
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ cell *c = st->cells;
+ int i;
+ st->cells = 0;
+ hexadrop_free (st->dpy, st->window, st);
+ free (st->cells);
+ st->cells = c;
+ for (i = 0; i < st->ncells; i++)
+ st->cells[i].initted_p = False;
+ hexadrop_init_1 (st->dpy, st->window, st);
+ return True;
+ }
+
+ return False;
+}
+
+
+static const char *hexadrop_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 30000",
+ "*sides: 0",
+ "*size: 15",
+ "*speed: 1.0",
+ "*ncolors: 128",
+ "*uniform: Maybe",
+ "*lockstep: Maybe",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec hexadrop_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-sides", ".sides", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-uniform-speed", ".uniform", XrmoptionNoArg, "True" },
+ { "-no-uniform-speed",".uniform", XrmoptionNoArg, "False" },
+ { "-lockstep", ".lockstep", XrmoptionNoArg, "True" },
+ { "-no-lockstep", ".lockstep", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Hexadrop", hexadrop)
diff --git a/hacks/hexadrop.man b/hacks/hexadrop.man
new file mode 100644
index 0000000..b4a5f84
--- /dev/null
+++ b/hacks/hexadrop.man
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hexadrop - shrinking hexagons.
+.SH SYNOPSIS
+.B hexadrop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-size \fInumber\fP]
+[\-sides \fInumber\fP]
+[\-uniform-speed]
+[\-no-uniform-speed]
+[\-lockstep]
+[\-no-lockstep]
+[\-fps]
+.SH DESCRIPTION
+Draws a grid of hexagons or other shapes and drops them out.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Speed. 0.5 for half as fast; 2.0 for twice as fast.
+.TP 8
+.B \-size \fInumber\fP
+How many tiles to fit horizontally on the screen. Default 15.
+.TP 8
+.B \-sides \fInumber\fP
+Shape of the tiles. 3, 4, 6 or 8. Default: random.
+.TP 8
+.B \-uniform-speed | \-no-uniform-speed
+Whether each tile should drop at the same speed. Default: random.
+.TP 8
+.B \-lockstep | \-no-lockstep
+Whether each tile should drop at the same time. Default: random.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/hopalong.c b/hacks/hopalong.c
new file mode 100644
index 0000000..d3cc7df
--- /dev/null
+++ b/hacks/hopalong.c
@@ -0,0 +1,555 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* hop --- real plane fractals */
+
+#if 0
+static const char sccsid[] = "@(#)hop.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * Changes in xlockmore distribution
+ * 01-Nov-2000: Allocation checks
+ * 24-Jun-1997: EJK and RR functions stolen from xmartin2.2
+ * Ed Kubaitis <ejk@ux2.cso.uiuc.edu> ejk functions and xmartin
+ * Renaldo Recuerdo rr function, generalized exponent version
+ * of the Barry Martin's square root function
+ * 10-May-1997: Compatible with xscreensaver
+ * 27-Jul-1995: added Peter de Jong's hop from Scientific American
+ * July 87 p. 111. Sometimes they are amazing but there are a
+ * few duds (I did not see a pattern in the parameters).
+ * 29-Mar-1995: changed name from hopalong to hop
+ * 09-Dec-1994: added Barry Martin's sine hop
+ * Changes in original xlock
+ * 29-Oct-1990: fix bad (int) cast.
+ * 29-Jul-1990: support for multiple screens.
+ * 08-Jul-1990: new timing and colors and new algorithm for fractals.
+ * 15-Dec-1989: Fix for proper skipping of {White,Black}Pixel() in colors.
+ * 08-Oct-1989: Fixed long standing typo bug in RandomInitHop();
+ * Fixed bug in memory allocation in init_hop();
+ * Moved seconds() to an extern.
+ * Got rid of the % mod since .mod is slow on a sparc.
+ * 20-Sep-1989: Lint.
+ * 31-Aug-1988: Forked from xlock.c for modularity.
+ * 23-Mar-1988: Coded HOPALONG routines from Scientific American Sept. 86 p. 14.
+ * Hopalong was attributed to Barry Martin of Aston University
+ * (Birmingham, England)
+ */
+
+
+#ifdef STANDALONE
+#define MODE_hop
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 1000 \n" \
+ "*cycles: 2500 \n" \
+ "*ncolors: 200 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define SMOOTH_COLORS
+# define reshape_hop 0
+# define release_hop 0
+# define hop_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_hop
+
+#define DEF_MARTIN "False"
+#define DEF_POPCORN "False"
+#define DEF_EJK1 "False"
+#define DEF_EJK2 "False"
+#define DEF_EJK3 "False"
+#define DEF_EJK4 "False"
+#define DEF_EJK5 "False"
+#define DEF_EJK6 "False"
+#define DEF_RR "False"
+#define DEF_JONG "False"
+#define DEF_SINE "False"
+
+static Bool martin;
+static Bool popcorn;
+static Bool ejk1;
+static Bool ejk2;
+static Bool ejk3;
+static Bool ejk4;
+static Bool ejk5;
+static Bool ejk6;
+static Bool rr;
+static Bool jong;
+static Bool sine;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-martin", ".hop.martin", XrmoptionNoArg, "on"},
+ {"+martin", ".hop.martin", XrmoptionNoArg, "off"},
+ {"-popcorn", ".hop.popcorn", XrmoptionNoArg, "on"},
+ {"+popcorn", ".hop.popcorn", XrmoptionNoArg, "off"},
+ {"-ejk1", ".hop.ejk1", XrmoptionNoArg, "on"},
+ {"+ejk1", ".hop.ejk1", XrmoptionNoArg, "off"},
+ {"-ejk2", ".hop.ejk2", XrmoptionNoArg, "on"},
+ {"+ejk2", ".hop.ejk2", XrmoptionNoArg, "off"},
+ {"-ejk3", ".hop.ejk3", XrmoptionNoArg, "on"},
+ {"+ejk3", ".hop.ejk3", XrmoptionNoArg, "off"},
+ {"-ejk4", ".hop.ejk4", XrmoptionNoArg, "on"},
+ {"+ejk4", ".hop.ejk4", XrmoptionNoArg, "off"},
+ {"-ejk5", ".hop.ejk5", XrmoptionNoArg, "on"},
+ {"+ejk5", ".hop.ejk5", XrmoptionNoArg, "off"},
+ {"-ejk6", ".hop.ejk6", XrmoptionNoArg, "on"},
+ {"+ejk6", ".hop.ejk6", XrmoptionNoArg, "off"},
+ {"-rr", ".hop.rr", XrmoptionNoArg, "on"},
+ {"+rr", ".hop.rr", XrmoptionNoArg, "off"},
+ {"-jong", ".hop.jong", XrmoptionNoArg, "on"},
+ {"+jong", ".hop.jong", XrmoptionNoArg, "off"},
+ {"-sine", ".hop.sine", XrmoptionNoArg, "on"},
+ {"+sine", ".hop.sine", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&martin, "martin", "Martin", DEF_MARTIN, t_Bool},
+ {&popcorn, "popcorn", "Popcorn", DEF_POPCORN, t_Bool},
+ {&ejk1, "ejk1", "EJK1", DEF_EJK1, t_Bool},
+ {&ejk2, "ejk2", "EJK2", DEF_EJK2, t_Bool},
+ {&ejk3, "ejk3", "EJK3", DEF_EJK3, t_Bool},
+ {&ejk4, "ejk4", "EJK4", DEF_EJK4, t_Bool},
+ {&ejk5, "ejk5", "EJK5", DEF_EJK5, t_Bool},
+ {&ejk6, "ejk6", "EJK6", DEF_EJK6, t_Bool},
+ {&rr, "rr", "RR", DEF_RR, t_Bool},
+ {&jong, "jong", "Jong", DEF_JONG, t_Bool},
+ {&sine, "sine", "Sine", DEF_SINE, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-/+martin", "turn on/off sqrt format"},
+ {"-/+popcorn", "turn on/off Clifford A. Pickover's popcorn format"},
+ {"-/+ejk1", "turn on/off ejk1 format"},
+ {"-/+ejk2", "turn on/off ejk2 format"},
+ {"-/+ejk3", "turn on/off ejk3 format"},
+ {"-/+ejk4", "turn on/off ejk4 format"},
+ {"-/+ejk5", "turn on/off ejk5 format"},
+ {"-/+ejk6", "turn on/off ejk6 format"},
+ {"-/+rr", "turn on/off rr format"},
+ {"-/+jong", "turn on/off jong format"},
+ {"-/+sine", "turn on/off sine format"}
+};
+
+ENTRYPOINT ModeSpecOpt hop_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct hop_description =
+{"hop", "init_hop", "draw_hop", (char *) NULL,
+ "refresh_hop", "init_hop", "free_hop", &hop_opts,
+ 10000, 1000, 2500, 1, 64, 1.0, "",
+ "Shows real plane iterated fractals", 0, NULL};
+
+#endif
+
+#define MARTIN 0
+#define POPCORN 7
+#define SINE 8
+#define EJK1 1
+#define EJK2 2
+#define EJK3 9
+#define EJK4 3
+#define EJK5 4
+#define EJK6 10
+#define RR 5
+#define JONG 6
+#ifdef OFFENDING
+#define OPS 8 /* 8, 9, 10 might be too close to a swastika for some... */
+#else
+#define OPS 11
+#endif
+
+typedef struct {
+ int centerx, centery; /* center of the screen */
+ double a, b, c, d;
+ double i, j; /* hopalong parameters */
+ int inc;
+ int pix;
+ int op;
+ int count;
+ int bufsize;
+ XPoint *pointBuffer; /* pointer for XDrawPoints */
+} hopstruct;
+
+static hopstruct *hops = (hopstruct *) NULL;
+
+ENTRYPOINT void
+init_hop(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ double range;
+ hopstruct *hp;
+
+ MI_INIT (mi, hops);
+ hp = &hops[MI_SCREEN(mi)];
+
+ hp->centerx = MI_WIDTH(mi) / 2;
+ hp->centery = MI_HEIGHT(mi) / 2;
+ /* Make the other operations less common since they are less interesting */
+ if (MI_IS_FULLRANDOM(mi)) {
+ hp->op = NRAND(OPS);
+ } else {
+ if (martin)
+ hp->op = MARTIN;
+ else if (popcorn)
+ hp->op = POPCORN;
+ else if (ejk1)
+ hp->op = EJK1;
+ else if (ejk2)
+ hp->op = EJK2;
+ else if (ejk3)
+ hp->op = EJK3;
+ else if (ejk4)
+ hp->op = EJK4;
+ else if (ejk5)
+ hp->op = EJK5;
+ else if (ejk6)
+ hp->op = EJK6;
+ else if (rr)
+ hp->op = RR;
+ else if (jong)
+ hp->op = JONG;
+ else if (sine)
+ hp->op = SINE;
+ else
+ hp->op = NRAND(OPS);
+ }
+
+ range = sqrt((double) hp->centerx * hp->centerx +
+ (double) hp->centery * hp->centery) / (1.0 + LRAND() / MAXRAND);
+ hp->i = hp->j = 0.0;
+ hp->inc = (int) ((LRAND() / MAXRAND) * 200) - 100;
+#undef XMARTIN
+ switch (hp->op) {
+ case MARTIN:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 1500.0 + 40.0;
+ hp->b = (LRAND() / MAXRAND) * 17.0 + 3.0;
+ hp->c = (LRAND() / MAXRAND) * 3000.0 + 100.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+ hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+ if (LRAND() & 1)
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+ else
+ hp->c = 0.0;
+#endif
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "sqrt a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+ break;
+ case EJK1:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 500.0;
+ hp->c = (LRAND() / MAXRAND) * 100.0 + 10.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 40.0;
+#endif
+ hp->b = (LRAND() / MAXRAND) * 0.4;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "ejk1 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+ break;
+ case EJK2:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 500.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+#endif
+ hp->b = pow(10.0, 6.0 + (LRAND() / MAXRAND) * 24.0);
+ if (LRAND() & 1)
+ hp->b = -hp->b;
+ hp->c = pow(10.0, (LRAND() / MAXRAND) * 9.0);
+ if (LRAND() & 1)
+ hp->c = -hp->c;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "ejk2 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+ break;
+ case EJK3:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 500.0;
+ hp->c = (LRAND() / MAXRAND) * 80.0 + 30.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 70.0;
+#endif
+ hp->b = (LRAND() / MAXRAND) * 0.35 + 0.5;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "ejk3 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+ break;
+ case EJK4:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 1000.0;
+ hp->c = (LRAND() / MAXRAND) * 40.0 + 30.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 2.0;
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 200.0;
+#endif
+ hp->b = (LRAND() / MAXRAND) * 9.0 + 1.0;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "ejk4 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+ break;
+ case EJK5:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 600.0;
+ hp->c = (LRAND() / MAXRAND) * 90.0 + 20.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 2.0;
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 200.0;
+#endif
+ hp->b = (LRAND() / MAXRAND) * 0.3 + 0.1;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "ejk5 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+ break;
+ case EJK6:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 100.0 + 550.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+#endif
+ hp->b = (LRAND() / MAXRAND) + 0.5;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "ejk6 a=%g, b=%g\n", hp->a, hp->b);
+ break;
+ case RR:
+#ifdef XMARTIN
+ hp->a = (LRAND() / MAXRAND) * 100.0;
+ hp->b = (LRAND() / MAXRAND) * 20.0;
+ hp->c = (LRAND() / MAXRAND) * 200.0;
+#else
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 40.0;
+ hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 200.0;
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+#endif
+ hp->d = (LRAND() / MAXRAND) * 0.9;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "rr a=%g, b=%g, c=%g, d=%g\n",
+ hp->a, hp->b, hp->c, hp->d);
+ break;
+ case POPCORN:
+ hp->a = 0.0;
+ hp->b = 0.0;
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.24 + 0.25;
+ hp->inc = 100;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "popcorn a=%g, b=%g, c=%g, d=%g\n",
+ hp->a, hp->b, hp->c, hp->d);
+ break;
+ case JONG:
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+ hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+ hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+ hp->d = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "jong a=%g, b=%g, c=%g, d=%g\n",
+ hp->a, hp->b, hp->c, hp->d);
+ break;
+ case SINE: /* MARTIN2 */
+#ifdef XMARTIN
+ hp->a = M_PI + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.07;
+#else
+ hp->a = M_PI + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.7;
+#endif
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "sine a=%g\n", hp->a);
+ break;
+ }
+ if (MI_NPIXELS(mi) > 2)
+ hp->pix = NRAND(MI_NPIXELS(mi));
+ hp->bufsize = MI_COUNT(mi);
+
+ if (hp->pointBuffer == NULL) {
+ if ((hp->pointBuffer = (XPoint *) malloc(hp->bufsize *
+ sizeof (XPoint))) == NULL)
+ return;
+ }
+
+ MI_CLEARWINDOW(mi);
+
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ hp->count = 0;
+}
+
+
+ENTRYPOINT void
+draw_hop(ModeInfo * mi)
+{
+ double oldj, oldi;
+ XPoint *xp;
+ int k;
+ hopstruct *hp;
+
+ if (hops == NULL)
+ return;
+ hp = &hops[MI_SCREEN(mi)];
+
+
+ if (hp->pointBuffer == NULL)
+ return;
+ xp = hp->pointBuffer;
+ k = hp->bufsize;
+
+ MI_IS_DRAWN(mi) = True;
+ hp->inc++;
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, hp->pix));
+ if (++hp->pix >= MI_NPIXELS(mi))
+ hp->pix = 0;
+ }
+ while (k--) {
+ oldj = hp->j;
+ switch (hp->op) {
+ case MARTIN: /* SQRT, MARTIN1 */
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj + ((hp->i < 0)
+ ? sqrt(fabs(hp->b * oldi - hp->c))
+ : -sqrt(fabs(hp->b * oldi - hp->c)));
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case EJK1:
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - ((hp->i > 0) ? (hp->b * oldi - hp->c) :
+ -(hp->b * oldi - hp->c));
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case EJK2:
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - ((hp->i < 0) ? log(fabs(hp->b * oldi - hp->c)) :
+ -log(fabs(hp->b * oldi - hp->c)));
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case EJK3:
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - ((hp->i > 0) ? sin(hp->b * oldi) - hp->c :
+ -sin(hp->b * oldi) - hp->c);
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case EJK4:
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - ((hp->i > 0) ? sin(hp->b * oldi) - hp->c :
+ -sqrt(fabs(hp->b * oldi - hp->c)));
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case EJK5:
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - ((hp->i > 0) ? sin(hp->b * oldi) - hp->c :
+ -(hp->b * oldi - hp->c));
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case EJK6:
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - asin((hp->b * oldi) - (long) (hp->b * oldi));
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case RR: /* RR1 */
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - ((hp->i < 0) ? -pow(fabs(hp->b * oldi - hp->c), hp->d) :
+ pow(fabs(hp->b * oldi - hp->c), hp->d));
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ case POPCORN:
+#define HVAL 0.05
+#define INCVAL 50
+ {
+ double tempi, tempj;
+
+ if (hp->inc >= 100)
+ hp->inc = 0;
+ if (hp->inc == 0) {
+ if (hp->a++ >= INCVAL) {
+ hp->a = 0;
+ if (hp->b++ >= INCVAL)
+ hp->b = 0;
+ }
+ hp->i = (-hp->c * INCVAL / 2 + hp->c * hp->a) * M_PI / 180.0;
+ hp->j = (-hp->c * INCVAL / 2 + hp->c * hp->b) * M_PI / 180.0;
+ }
+ tempi = hp->i - HVAL * sin(hp->j + tan(3.0 * hp->j));
+ tempj = hp->j - HVAL * sin(hp->i + tan(3.0 * hp->i));
+ xp->x = hp->centerx + (int) (MI_WIDTH(mi) / 40 * tempi);
+ xp->y = hp->centery + (int) (MI_HEIGHT(mi) / 40 * tempj);
+ hp->i = tempi;
+ hp->j = tempj;
+ }
+ break;
+ case JONG:
+ if (hp->centerx > 0)
+ oldi = hp->i + 4 * hp->inc / hp->centerx;
+ else
+ oldi = hp->i;
+ hp->j = sin(hp->c * hp->i) - cos(hp->d * hp->j);
+ hp->i = sin(hp->a * oldj) - cos(hp->b * oldi);
+ xp->x = hp->centerx + (int) (hp->centerx * (hp->i + hp->j) / 4.0);
+ xp->y = hp->centery - (int) (hp->centery * (hp->i - hp->j) / 4.0);
+ break;
+ case SINE: /* MARTIN2 */
+ oldi = hp->i + hp->inc;
+ hp->j = hp->a - hp->i;
+ hp->i = oldj - sin(oldi);
+ xp->x = hp->centerx + (int) (hp->i + hp->j);
+ xp->y = hp->centery - (int) (hp->i - hp->j);
+ break;
+ }
+ xp++;
+ }
+ XDrawPoints(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ hp->pointBuffer, hp->bufsize, CoordModeOrigin);
+ if (++hp->count > MI_CYCLES(mi)) {
+ init_hop(mi);
+ }
+}
+
+ENTRYPOINT void
+free_hop(ModeInfo * mi)
+{
+ hopstruct *hp = &hops[MI_SCREEN(mi)];
+
+ if (hp->pointBuffer != NULL)
+ (void) free((void *) hp->pointBuffer);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_hop(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE_2 ("Hopalong", hopalong, hop)
+
+#endif /* MODE_hop */
diff --git a/hacks/hopalong.man b/hacks/hopalong.man
new file mode 100644
index 0000000..f38b481
--- /dev/null
+++ b/hacks/hopalong.man
@@ -0,0 +1,82 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+hopalong - draw real plane fractals
+.SH SYNOPSIS
+.B hopalong
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-jong] [\-no\-jong] [\-jong] [\-no\-sine]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIhop\fP program generates real plane fractals as described in
+the September 1986 issue of Scientific American.
+.SH OPTIONS
+.I hopalong
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+How long to run each batch. Default 2500 pixels.
+.TP 8
+.B \-count \fIinteger\fP
+How many pixels should be drawn before a color change. Default 1000.
+.TP 8
+.B \-jong \fIinteger\fP
+.TP 8
+.B \-no\-jong \fIinteger\fP
+Whether to use the Jong format (default is to choose randomly.)
+
+.TP 8
+.B \-sine \fIinteger\fP
+.TP 8
+.B \-no\-sine \fIinteger\fP
+Whether to use the Sine format (default is to choose randomly.)
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1988-91 by Patrick J. Naughton.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Patrick J. Naughton <naughton@eng.sun.com>, 23-mar-88.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92, and again on 10-May-97.
diff --git a/hacks/hyperball.c b/hacks/hyperball.c
new file mode 100644
index 0000000..cae6360
--- /dev/null
+++ b/hacks/hyperball.c
@@ -0,0 +1,2458 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1998, 2000
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This code derived from TI Explorer Lisp code by Joe Keane, Fritz Mueller,
+ * and Jamie Zawinski.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#define POINT_COUNT 600
+#define LINE_COUNT 1200
+
+#define ANGLE_SCALE 0.001
+
+struct point_info
+{
+ float pg_a;
+ float pg_b;
+ float pg_c;
+ float pg_d;
+};
+
+struct line_info
+{
+ short li_ip;
+ short li_iq;
+ char li_color;
+ char li_pad[3];
+};
+
+struct point_state
+{
+ short old_x, old_y;
+ short new_x, new_y;
+ unsigned char old_dep, new_dep;
+};
+
+struct hyper_state
+{
+ char hs_stop;
+ char hs_resize;
+ char hs_redraw;
+ char hs_icon;
+ Display *hs_display;
+ Window hs_window;
+ float hs_observer_z;
+ float hs_unit_scale;
+ float hs_offset_x;
+ float hs_offset_y;
+ int hs_delay;
+ double hs_angle_xy;
+ double hs_angle_xz;
+ double hs_angle_yz;
+ double hs_angle_xw;
+ double hs_angle_yw;
+ double hs_angle_zw;
+ double hs_cos_xy, hs_sin_xy;
+ double hs_cos_xz, hs_sin_xz;
+ double hs_cos_yz, hs_sin_yz;
+ double hs_cos_xw, hs_sin_xw;
+ double hs_cos_yw, hs_sin_yw;
+ double hs_cos_zw, hs_sin_zw;
+ double hs_ref_ax, hs_ref_ay, hs_ref_az, hs_ref_aw;
+ double hs_ref_bx, hs_ref_by, hs_ref_bz, hs_ref_bw;
+ double hs_ref_cx, hs_ref_cy, hs_ref_cz, hs_ref_cw;
+ double hs_ref_dx, hs_ref_dy, hs_ref_dz, hs_ref_dw;
+ GC hs_color_gcs[8][8];
+ GC black_gc;
+ char hs_moved[POINT_COUNT];
+ struct point_state hs_points[POINT_COUNT];
+ int roted;
+};
+
+static const struct point_info point_table[POINT_COUNT];
+static const struct line_info line_table[LINE_COUNT];
+
+static void set_sizes (struct hyper_state *hs, int width, int height);
+
+static void *
+hyperball_init (Display *dpy, Window win)
+{
+ struct hyper_state *hs = (struct hyper_state *) calloc (1, sizeof(*hs));
+
+ XGCValues gcv;
+ Colormap cmap;
+ /* double xy, xz, yz, xw, yw, zw; */
+ unsigned long bg_pixel;
+ float observer_z;
+ int delay;
+
+ hs->hs_display = dpy;
+ hs->hs_window = win;
+
+ observer_z = get_float_resource (dpy, "observer-z", "Float");
+ if (observer_z < 1.125)
+ observer_z = 1.125;
+ hs->hs_observer_z = observer_z;
+
+ {
+ XWindowAttributes wa;
+ XGetWindowAttributes (dpy, win, &wa);
+ cmap = wa.colormap;
+ set_sizes (hs, wa.width, wa.height);
+ }
+
+ hs->hs_angle_xy = get_float_resource (dpy, "xy", "Float") * ANGLE_SCALE;
+ hs->hs_angle_xz = get_float_resource (dpy, "xz", "Float") * ANGLE_SCALE;
+ hs->hs_angle_yz = get_float_resource (dpy, "yz", "Float") * ANGLE_SCALE;
+ hs->hs_angle_xw = get_float_resource (dpy, "xw", "Float") * ANGLE_SCALE;
+ hs->hs_angle_yw = get_float_resource (dpy, "yw", "Float") * ANGLE_SCALE;
+ hs->hs_angle_zw = get_float_resource (dpy, "zw", "Float") * ANGLE_SCALE;
+
+ delay = get_integer_resource (dpy, "delay", "Integer");
+ hs->hs_delay = delay;
+
+ bg_pixel = get_pixel_resource (dpy, cmap, "background", "Background");
+
+ if (mono_p)
+ {
+ GC black_gc;
+ unsigned long fg_pixel;
+ GC white_gc;
+
+ gcv.function = GXcopy;
+ gcv.foreground = bg_pixel;
+ black_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+ fg_pixel = get_pixel_resource (dpy, cmap, "foreground", "Foreground");
+ gcv.foreground = fg_pixel;
+ white_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+ hs->hs_color_gcs[0][0] = black_gc;
+ hs->hs_color_gcs[0][1] = white_gc;
+ }
+ else
+ {
+ int col;
+ int dep;
+
+ gcv.function = GXcopy;
+
+ gcv.foreground = get_pixel_resource (dpy, cmap,
+ "background", "Background");
+ hs->black_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+
+ for (col = 0; col < 8; col++)
+ for (dep = 0; dep < 8; dep++)
+ {
+ char buffer[16];
+ unsigned long fg_pixel;
+ GC color_gc;
+
+ sprintf (buffer, "color%d%d", col, dep);
+ fg_pixel = get_pixel_resource (dpy, cmap, buffer, "Foreground");
+ gcv.foreground = fg_pixel /*^ bg_pixel*/;
+ color_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+ hs->hs_color_gcs[col][dep] = color_gc;
+ }
+ }
+
+ {
+ double xy;
+ double xz;
+ double yz;
+ double xw;
+ double yw;
+ double zw;
+#if 1
+ double cos_xy, sin_xy;
+ double cos_xz, sin_xz;
+ double cos_yz, sin_yz;
+ double cos_xw, sin_xw;
+ double cos_yw, sin_yw;
+ double cos_zw, sin_zw;
+#endif
+
+ hs->hs_ref_ax = 1.0, hs->hs_ref_ay = 0.0, hs->hs_ref_az = 0.0, hs->hs_ref_aw = 0.0;
+ hs->hs_ref_bx = 0.0, hs->hs_ref_by = 1.0, hs->hs_ref_bz = 0.0, hs->hs_ref_bw = 0.0;
+ hs->hs_ref_cx = 0.0, hs->hs_ref_cy = 0.0, hs->hs_ref_cz = 1.0, hs->hs_ref_cw = 0.0;
+ hs->hs_ref_dx = 0.0, hs->hs_ref_dy = 0.0, hs->hs_ref_dz = 0.0, hs->hs_ref_dw = 1.0;
+
+ xy = hs->hs_angle_xy;
+ xz = hs->hs_angle_xz;
+ yz = hs->hs_angle_yz;
+ xw = hs->hs_angle_xw;
+ yw = hs->hs_angle_yw;
+ zw = hs->hs_angle_zw;
+
+ cos_xy = cos (xy), sin_xy = sin (xy);
+ hs->hs_cos_xy = cos_xy, hs->hs_sin_xy = sin_xy;
+ cos_xz = cos (xz), sin_xz = sin (xz);
+ hs->hs_cos_xz = cos_xz, hs->hs_sin_xz = sin_xz;
+ cos_yz = cos (yz), sin_yz = sin (yz);
+ hs->hs_cos_yz = cos_yz, hs->hs_sin_yz = sin_yz;
+ cos_xw = cos (xw), sin_xw = sin (xw);
+ hs->hs_cos_xw = cos_xw, hs->hs_sin_xw = sin_xw;
+ cos_yw = cos (yw), sin_yw = sin (yw);
+ hs->hs_cos_yw = cos_yw, hs->hs_sin_yw = sin_yw;
+ cos_zw = cos (zw), sin_zw = sin (zw);
+ hs->hs_cos_zw = cos_zw, hs->hs_sin_zw = sin_zw;
+ }
+
+ return hs;
+}
+
+
+static unsigned long
+hyperball_draw (Display *dpy, Window window, void *closure)
+{
+ struct hyper_state *hs = (struct hyper_state *) closure;
+
+ int icon;
+ int resize;
+ int redraw;
+ int stop;
+ int delay;
+
+ icon = hs->hs_icon;
+ resize = hs->hs_resize;
+ if (icon || !(hs->roted | resize))
+ goto skip1;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (dpy, window);
+#endif
+
+ {
+ int pc;
+ const struct point_info *point_ptr;
+ struct point_state *point_state;
+ float observer_z;
+ float unit_scale;
+ float offset_x;
+ float offset_y;
+ char *mark_ptr;
+
+ pc = POINT_COUNT;
+ point_ptr = &point_table[0];
+ point_state = &hs->hs_points[0];
+ mark_ptr = &hs->hs_moved[0];
+
+ while (--pc >= 0)
+ {
+ double pos_a;
+ double pos_b;
+ double pos_c;
+ double pos_d;
+ double az, bz, cz, dz;
+ double sum_z;
+ double ax, bx, cx, dx;
+ double sum_x;
+ double ay, by, cy, dy;
+ double sum_y;
+ double mul;
+ int old_x;
+ int old_y;
+ int old_dep;
+ double xf;
+ double yf;
+ int new_x;
+ int new_y;
+ int new_dep;
+ int mov;
+
+ pos_a = point_ptr->pg_a;
+ pos_b = point_ptr->pg_b;
+ pos_c = point_ptr->pg_c;
+ pos_d = point_ptr->pg_d;
+ point_ptr++;
+ az = hs->hs_ref_az; bz = hs->hs_ref_bz; cz = hs->hs_ref_cz; dz = hs->hs_ref_dz;
+ ax = hs->hs_ref_ax; bx = hs->hs_ref_bx; cx = hs->hs_ref_cx; dx = hs->hs_ref_dx;
+ ay = hs->hs_ref_ay; by = hs->hs_ref_by; cy = hs->hs_ref_cy; dy = hs->hs_ref_dy;
+ sum_z = pos_a * az + pos_b * bz + pos_c * cz + pos_d * dz;
+ observer_z = hs->hs_observer_z;
+ unit_scale = hs->hs_unit_scale;
+ sum_x = pos_a * ax + pos_b * bx + pos_c * cx + pos_d * dx;
+ sum_y = pos_a * ay + pos_b * by + pos_c * cy + pos_d * dy;
+ mul = unit_scale / (observer_z - sum_z);
+ offset_x = hs->hs_offset_x;
+ offset_y = hs->hs_offset_y;
+ old_x = point_state->new_x;
+ old_y = point_state->new_y;
+ old_dep = point_state->new_dep;
+ xf = sum_x * mul + offset_x;
+ yf = sum_y * mul + offset_y;
+ new_x = (int)rint(xf);
+ new_y = (int)rint(yf);
+ new_dep = (int)floor(sum_z * -128.0) + 128;
+ point_state->old_x = old_x;
+ point_state->old_y = old_y;
+ point_state->old_dep = old_dep;
+ point_state->new_x = new_x;
+ point_state->new_y = new_y;
+ point_state->new_dep = new_dep;
+ point_state++;
+ mov = new_x != old_x || new_y != old_y || new_dep != old_dep;
+ *mark_ptr = mov;
+ mark_ptr++;
+ }
+ }
+
+ skip1:
+ icon = hs->hs_icon;
+ redraw = hs->hs_redraw;
+ if (icon || !(hs->roted | redraw))
+ goto skip2;
+
+ {
+ int lc;
+ const struct line_info *li_ptr;
+ int mono;
+ Window win = hs->hs_window;
+
+ lc = LINE_COUNT;
+ li_ptr = &line_table[0];
+ mono = mono_p;
+
+ while (--lc >= 0)
+ {
+ int ip;
+ int iq;
+ int col;
+ int mov_p;
+ int mov_q;
+ struct point_state *sp;
+ struct point_state *sq;
+ int p_x;
+ int p_y;
+ int q_x;
+ int q_y;
+ GC erase_gc;
+ GC draw_gc;
+ int new_sum;
+ int new_dep;
+
+ ip = li_ptr->li_ip;
+ iq = li_ptr->li_iq;
+ col = li_ptr->li_color;
+ li_ptr++;
+ mov_p = hs->hs_moved[ip];
+ mov_q = hs->hs_moved[iq];
+ if (!(redraw | mov_p | mov_q))
+ continue;
+
+ sp = &hs->hs_points[ip];
+ sq = &hs->hs_points[iq];
+
+ if (mono)
+ {
+ erase_gc = hs->hs_color_gcs[0][0];
+ draw_gc = hs->hs_color_gcs[0][1];
+ }
+ else
+ {
+ GC *row;
+ new_sum = sp->new_dep + sq->new_dep;
+ row = &hs->hs_color_gcs[col][0];
+ new_dep = new_sum >> 6;
+ erase_gc = hs->black_gc;
+ draw_gc = row[new_dep];
+ }
+
+ if (!redraw && erase_gc)
+ {
+ p_x = sp->old_x;
+ p_y = sp->old_y;
+ q_x = sq->old_x;
+ q_y = sq->old_y;
+ XDrawLine (dpy, win, erase_gc, p_x, p_y, q_x, q_y);
+ }
+
+ p_x = sp->new_x;
+ p_y = sp->new_y;
+ q_x = sq->new_x;
+ q_y = sq->new_y;
+ XDrawLine (dpy, win, draw_gc, p_x, p_y, q_x, q_y);
+ }
+ }
+
+ skip2:
+ stop = hs->hs_stop;
+ hs->roted = 0;
+ if (stop)
+ goto skip3;
+
+ hs->roted = 1;
+
+ {
+ double cos_a;
+ double sin_a;
+ double old_u;
+ double old_v;
+ double new_u;
+ double new_v;
+
+ /* If you get error messages about the following forms, and you think you're
+ using an ANSI C conforming compiler, then you're mistaken. Possibly you're
+ mixing an ANSI compiler with a non-ANSI preprocessor, or vice versa.
+ Regardless, your system is broken; it's not a bug in this program.
+ */
+#if defined(__STDC__) || defined(__ANSI_CPP__)
+
+#define rotate(name,dim0,dim1) \
+ old_u = hs->hs_ref_##name##dim0; \
+ old_v = hs->hs_ref_##name##dim1; \
+ new_u = old_u * cos_a + old_v * sin_a; \
+ new_v = old_v * cos_a - old_u * sin_a; \
+ hs->hs_ref_##name##dim0 = new_u; \
+ hs->hs_ref_##name##dim1 = new_v;
+
+#define rotates(dim0,dim1) \
+ if (hs->hs_sin_##dim0##dim1 != 0) { \
+ cos_a = hs->hs_cos_##dim0##dim1; \
+ sin_a = hs->hs_sin_##dim0##dim1; \
+ rotate(a, dim0, dim1); \
+ rotate(b, dim0, dim1); \
+ rotate(c, dim0, dim1); \
+ rotate(d, dim0, dim1); \
+ }
+
+#else /* !__STDC__, courtesy of Andreas Luik <luik@isa.de> */
+
+#define rotate(name,dim0,dim1,cos,sin) \
+ old_u = hs->hs_ref_/**/name/**/dim0; \
+ old_v = hs->hs_ref_/**/name/**/dim1; \
+ new_u = old_u * cos_a + old_v * sin_a; \
+ new_v = old_v * cos_a - old_u * sin_a; \
+ hs->hs_ref_/**/name/**/dim0 = new_u; \
+ hs->hs_ref_/**/name/**/dim1 = new_v;
+
+#define rotates(dim0,dim1) \
+ if (hs->hs_sin_/**/dim0/**/dim1 != 0) { \
+ cos_a = hs->hs_cos_/**/dim0/**/dim1; \
+ sin_a = hs->hs_sin_/**/dim0/**/dim1; \
+ rotate(a, dim0, dim1); \
+ rotate(b, dim0, dim1); \
+ rotate(c, dim0, dim1); \
+ rotate(d, dim0, dim1); \
+ }
+
+#endif
+
+ rotates (x, y);
+ rotates (x, z);
+ rotates (y, z);
+ rotates (x, w);
+ rotates (y, w);
+ rotates (z, w);
+ }
+
+ skip3:
+ /* stop = hs->hs_stop; */
+ delay = hs->hs_delay;
+ if (stop && delay < 10000)
+ delay = 10000;
+
+ hs->hs_redraw = 0;
+ hs->hs_resize = 0;
+
+ return delay;
+}
+
+
+static Bool
+hyperball_event (Display *dpy, Window win, void *closure, XEvent *event)
+{
+ struct hyper_state *hs = (struct hyper_state *) closure;
+
+ hs->hs_redraw = 0;
+
+ switch (event->type)
+ {
+ case Expose:
+ hs->hs_icon = 0;
+ hs->hs_redraw = 1;
+ break;
+
+ case ButtonPress:
+ switch (event->xbutton.button)
+ {
+ case 2:
+ hs->hs_stop = !hs->hs_stop;
+ break;
+ default:
+ break;
+ }
+ break;
+
+#ifndef HAVE_JWXYZ
+ case UnmapNotify:
+ hs->hs_icon = 1;
+ hs->hs_redraw = 0;
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ if (hs->hs_redraw)
+ XClearWindow (dpy, win);
+
+ return False;
+}
+
+static void
+hyperball_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct hyper_state *hs = (struct hyper_state *) closure;
+ hs->hs_icon = 0;
+ hs->hs_resize = 1;
+ hs->hs_redraw = 1;
+ set_sizes (hs, w, h);
+ XClearWindow (dpy, window);
+}
+
+
+static void
+set_sizes (struct hyper_state *hs, int width, int height)
+{
+ double observer_z;
+ int min_dim;
+ double var;
+ double offset_x;
+ double offset_y;
+ double unit_scale;
+
+ observer_z = hs->hs_observer_z;
+ min_dim = width < height ? width : height;
+ var = sqrt(observer_z * observer_z - 1.0);
+ offset_x = 0.5 * (width - 1);
+ offset_y = 0.5 * (height - 1);
+ unit_scale = 0.4 * min_dim * var;
+ hs->hs_offset_x = (float)offset_x;
+ hs->hs_offset_y = (float)offset_y;
+ hs->hs_unit_scale = (float)unit_scale;
+}
+
+static void
+hyperball_free (Display *dpy, Window window, void *closure)
+{
+ struct hyper_state *hs = (struct hyper_state *) closure;
+ free (hs);
+}
+
+/* data */
+
+static const struct point_info point_table[POINT_COUNT] =
+{
+ { 0.93, 0.30, 0.09, 0.03, },
+ { 0.84, 0.49, -0.08, 0.05, },
+ { 0.72, 0.65, 0.02, -0.09, },
+ { 0.57, 0.79, 0.05, 0.07, },
+ { 0.40, 0.89, -0.09, -0.01, },
+ { 0.20, 0.95, 0.07, -0.06, },
+ { 0.00, 0.97, 0.00, 0.09, },
+ { -0.20, 0.95, -0.07, -0.06, },
+ { -0.40, 0.89, 0.09, -0.01, },
+ { -0.57, 0.79, -0.05, 0.07, },
+ { -0.72, 0.65, -0.02, -0.09, },
+ { -0.84, 0.49, 0.08, 0.05, },
+ { -0.93, 0.30, -0.09, 0.03, },
+ { -0.97, 0.10, 0.04, -0.08, },
+ { -0.97, -0.10, 0.04, 0.08, },
+ { -0.93, -0.30, -0.09, -0.03, },
+ { -0.84, -0.49, 0.08, -0.05, },
+ { -0.72, -0.65, -0.02, 0.09, },
+ { -0.57, -0.79, -0.05, -0.07, },
+ { -0.40, -0.89, 0.09, 0.01, },
+ { -0.20, -0.95, -0.07, 0.06, },
+ { 0.00, -0.97, 0.00, -0.09, },
+ { 0.20, -0.95, 0.07, 0.06, },
+ { 0.40, -0.89, -0.09, 0.01, },
+ { 0.57, -0.79, 0.05, -0.07, },
+ { 0.72, -0.65, 0.02, 0.09, },
+ { 0.84, -0.49, -0.08, -0.05, },
+ { 0.93, -0.30, 0.09, -0.03, },
+ { 0.97, -0.10, -0.04, 0.08, },
+ { 0.97, 0.10, -0.04, -0.08, },
+ { 0.27, 0.83, -0.13, -0.41, },
+ { 0.09, 0.87, 0.40, 0.18, },
+ { -0.09, 0.87, -0.40, 0.18, },
+ { -0.27, 0.83, 0.13, -0.41, },
+ { -0.44, 0.76, 0.22, 0.38, },
+ { -0.59, 0.65, -0.42, -0.09, },
+ { -0.71, 0.51, 0.35, -0.25, },
+ { -0.80, 0.36, -0.05, 0.43, },
+ { -0.86, 0.18, -0.29, -0.32, },
+ { -0.88, 0.00, 0.43, 0.00, },
+ { -0.86, -0.18, -0.29, 0.32, },
+ { -0.80, -0.36, -0.05, -0.43, },
+ { -0.71, -0.51, 0.35, 0.25, },
+ { -0.59, -0.65, -0.42, 0.09, },
+ { -0.44, -0.76, 0.22, -0.38, },
+ { -0.27, -0.83, 0.13, 0.41, },
+ { -0.09, -0.87, -0.40, -0.18, },
+ { 0.09, -0.87, 0.40, -0.18, },
+ { 0.27, -0.83, -0.13, 0.41, },
+ { 0.44, -0.76, -0.22, -0.38, },
+ { 0.59, -0.65, 0.42, 0.09, },
+ { 0.71, -0.51, -0.35, 0.25, },
+ { 0.80, -0.36, 0.05, -0.43, },
+ { 0.86, -0.18, 0.29, 0.32, },
+ { 0.88, 0.00, -0.43, 0.00, },
+ { 0.86, 0.18, 0.29, -0.32, },
+ { 0.80, 0.36, 0.05, 0.43, },
+ { 0.71, 0.51, -0.35, -0.25, },
+ { 0.59, 0.65, 0.42, -0.09, },
+ { 0.44, 0.76, -0.22, 0.38, },
+ { -0.13, 0.41, -0.27, 0.83, },
+ { -0.22, 0.38, -0.44, -0.76, },
+ { -0.29, 0.32, 0.86, 0.18, },
+ { -0.35, 0.25, -0.71, 0.51, },
+ { -0.40, 0.18, 0.09, -0.87, },
+ { -0.42, 0.09, 0.59, 0.65, },
+ { -0.43, 0.00, -0.88, 0.00, },
+ { -0.42, -0.09, 0.59, -0.65, },
+ { -0.40, -0.18, 0.09, 0.87, },
+ { -0.35, -0.25, -0.71, -0.51, },
+ { -0.29, -0.32, 0.86, -0.18, },
+ { -0.22, -0.38, -0.44, 0.76, },
+ { -0.13, -0.41, -0.27, -0.83, },
+ { -0.05, -0.43, 0.80, 0.36, },
+ { 0.05, -0.43, -0.80, 0.36, },
+ { 0.13, -0.41, 0.27, -0.83, },
+ { 0.22, -0.38, 0.44, 0.76, },
+ { 0.29, -0.32, -0.86, -0.18, },
+ { 0.35, -0.25, 0.71, -0.51, },
+ { 0.40, -0.18, -0.09, 0.87, },
+ { 0.42, -0.09, -0.59, -0.65, },
+ { 0.43, 0.00, 0.88, 0.00, },
+ { 0.42, 0.09, -0.59, 0.65, },
+ { 0.40, 0.18, -0.09, -0.87, },
+ { 0.35, 0.25, 0.71, 0.51, },
+ { 0.29, 0.32, -0.86, 0.18, },
+ { 0.22, 0.38, 0.44, -0.76, },
+ { 0.13, 0.41, 0.27, 0.83, },
+ { 0.05, 0.43, -0.80, -0.36, },
+ { -0.05, 0.43, 0.80, -0.36, },
+ { 0.09, -0.03, -0.93, 0.30, },
+ { 0.09, -0.01, 0.40, -0.89, },
+ { 0.09, 0.01, 0.40, 0.89, },
+ { 0.09, 0.03, -0.93, -0.30, },
+ { 0.08, 0.05, 0.84, -0.49, },
+ { 0.07, 0.06, -0.20, 0.95, },
+ { 0.05, 0.07, -0.57, -0.79, },
+ { 0.04, 0.08, 0.97, 0.10, },
+ { 0.02, 0.09, -0.72, 0.65, },
+ { 0.00, 0.09, 0.00, -0.97, },
+ { -0.02, 0.09, 0.72, 0.65, },
+ { -0.04, 0.08, -0.97, 0.10, },
+ { -0.05, 0.07, 0.57, -0.79, },
+ { -0.07, 0.06, 0.20, 0.95, },
+ { -0.08, 0.05, -0.84, -0.49, },
+ { -0.09, 0.03, 0.93, -0.30, },
+ { -0.09, 0.01, -0.40, 0.89, },
+ { -0.09, -0.01, -0.40, -0.89, },
+ { -0.09, -0.03, 0.93, 0.30, },
+ { -0.08, -0.05, -0.84, 0.49, },
+ { -0.07, -0.06, 0.20, -0.95, },
+ { -0.05, -0.07, 0.57, 0.79, },
+ { -0.04, -0.08, -0.97, -0.10, },
+ { -0.02, -0.09, 0.72, -0.65, },
+ { 0.00, -0.09, 0.00, 0.97, },
+ { 0.02, -0.09, -0.72, -0.65, },
+ { 0.04, -0.08, 0.97, -0.10, },
+ { 0.05, -0.07, -0.57, 0.79, },
+ { 0.07, -0.06, -0.20, -0.95, },
+ { 0.08, -0.05, 0.84, 0.49, },
+ { 0.64, 0.67, -0.15, -0.28, },
+ { 0.49, 0.79, 0.30, 0.07, },
+ { 0.31, 0.87, -0.26, 0.18, },
+ { 0.13, 0.92, 0.04, -0.31, },
+ { -0.07, 0.92, 0.20, 0.24, },
+ { -0.26, 0.89, -0.31, -0.01, },
+ { -0.44, 0.82, 0.22, -0.23, },
+ { -0.60, 0.71, 0.02, 0.31, },
+ { -0.73, 0.57, -0.25, -0.19, },
+ { -0.83, 0.40, 0.31, -0.06, },
+ { -0.90, 0.22, -0.16, 0.27, },
+ { -0.93, 0.03, -0.09, -0.30, },
+ { -0.91, -0.16, 0.28, 0.14, },
+ { -0.86, -0.35, -0.29, 0.12, },
+ { -0.77, -0.52, 0.11, -0.29, },
+ { -0.64, -0.67, 0.15, 0.28, },
+ { -0.49, -0.79, -0.30, -0.07, },
+ { -0.31, -0.87, 0.26, -0.18, },
+ { -0.13, -0.92, -0.04, 0.31, },
+ { 0.07, -0.92, -0.20, -0.24, },
+ { 0.26, -0.89, 0.31, 0.01, },
+ { 0.44, -0.82, -0.22, 0.23, },
+ { 0.60, -0.71, -0.02, -0.31, },
+ { 0.73, -0.57, 0.25, 0.19, },
+ { 0.83, -0.40, -0.31, 0.06, },
+ { 0.90, -0.22, 0.16, -0.27, },
+ { 0.93, -0.03, 0.09, 0.30, },
+ { 0.91, 0.16, -0.28, -0.14, },
+ { 0.86, 0.35, 0.29, -0.12, },
+ { 0.77, 0.52, -0.11, 0.29, },
+ { 0.44, 0.82, -0.22, -0.23, },
+ { 0.26, 0.89, 0.31, -0.01, },
+ { 0.07, 0.92, -0.20, 0.24, },
+ { -0.12, 0.92, -0.04, -0.31, },
+ { -0.31, 0.87, 0.26, 0.18, },
+ { -0.49, 0.79, -0.30, 0.07, },
+ { -0.64, 0.67, 0.15, -0.28, },
+ { -0.77, 0.52, 0.11, 0.29, },
+ { -0.86, 0.35, -0.29, -0.12, },
+ { -0.91, 0.16, 0.28, -0.14, },
+ { -0.93, -0.03, -0.09, 0.30, },
+ { -0.90, -0.22, -0.16, -0.27, },
+ { -0.83, -0.40, 0.31, 0.06, },
+ { -0.73, -0.57, -0.25, 0.19, },
+ { -0.60, -0.71, 0.02, -0.31, },
+ { -0.44, -0.82, 0.22, 0.23, },
+ { -0.26, -0.89, -0.31, 0.01, },
+ { -0.07, -0.92, 0.20, -0.24, },
+ { 0.12, -0.92, 0.04, 0.31, },
+ { 0.31, -0.87, -0.26, -0.18, },
+ { 0.49, -0.79, 0.30, -0.07, },
+ { 0.64, -0.67, -0.15, 0.28, },
+ { 0.77, -0.52, -0.11, -0.29, },
+ { 0.86, -0.35, 0.29, 0.12, },
+ { 0.91, -0.16, -0.28, 0.14, },
+ { 0.93, 0.03, 0.09, -0.30, },
+ { 0.90, 0.22, 0.16, 0.27, },
+ { 0.83, 0.40, -0.31, -0.06, },
+ { 0.73, 0.57, 0.25, -0.19, },
+ { 0.60, 0.71, -0.02, 0.31, },
+ { -0.13, 0.83, -0.27, -0.41, },
+ { -0.30, 0.79, 0.49, 0.07, },
+ { -0.46, 0.71, -0.38, 0.31, },
+ { -0.60, 0.60, 0.02, -0.49, },
+ { -0.71, 0.46, 0.35, 0.35, },
+ { -0.79, 0.30, -0.49, 0.03, },
+ { -0.83, 0.13, 0.31, -0.38, },
+ { -0.84, -0.05, 0.08, 0.49, },
+ { -0.81, -0.22, -0.41, -0.27, },
+ { -0.75, -0.38, 0.48, -0.13, },
+ { -0.65, -0.53, -0.22, 0.44, },
+ { -0.53, -0.66, -0.18, -0.46, },
+ { -0.38, -0.75, 0.46, 0.17, },
+ { -0.22, -0.82, -0.44, 0.23, },
+ { -0.04, -0.84, 0.12, -0.48, },
+ { 0.13, -0.83, 0.27, 0.41, },
+ { 0.30, -0.79, -0.49, -0.07, },
+ { 0.46, -0.71, 0.38, -0.31, },
+ { 0.60, -0.60, -0.02, 0.49, },
+ { 0.71, -0.46, -0.35, -0.35, },
+ { 0.79, -0.30, 0.49, -0.03, },
+ { 0.83, -0.13, -0.31, 0.38, },
+ { 0.84, 0.05, -0.08, -0.49, },
+ { 0.81, 0.22, 0.41, 0.27, },
+ { 0.75, 0.38, -0.48, 0.13, },
+ { 0.65, 0.53, 0.22, -0.44, },
+ { 0.53, 0.66, 0.18, 0.46, },
+ { 0.38, 0.75, -0.46, -0.17, },
+ { 0.22, 0.82, 0.44, -0.23, },
+ { 0.04, 0.84, -0.12, 0.48, },
+ { -0.65, 0.53, -0.22, -0.44, },
+ { -0.75, 0.38, 0.48, 0.13, },
+ { -0.81, 0.22, -0.41, 0.27, },
+ { -0.84, 0.05, 0.08, -0.49, },
+ { -0.83, -0.13, 0.31, 0.38, },
+ { -0.79, -0.30, -0.49, -0.03, },
+ { -0.71, -0.46, 0.35, -0.35, },
+ { -0.60, -0.60, 0.02, 0.49, },
+ { -0.46, -0.71, -0.38, -0.31, },
+ { -0.30, -0.79, 0.49, -0.07, },
+ { -0.13, -0.83, -0.27, 0.41, },
+ { 0.04, -0.84, -0.13, -0.48, },
+ { 0.22, -0.82, 0.44, 0.23, },
+ { 0.38, -0.75, -0.46, 0.17, },
+ { 0.53, -0.66, 0.18, -0.46, },
+ { 0.65, -0.53, 0.22, 0.44, },
+ { 0.75, -0.38, -0.48, -0.13, },
+ { 0.81, -0.22, 0.41, -0.27, },
+ { 0.84, -0.05, -0.08, 0.49, },
+ { 0.83, 0.13, -0.31, -0.38, },
+ { 0.79, 0.30, 0.49, 0.03, },
+ { 0.71, 0.46, -0.35, 0.35, },
+ { 0.60, 0.60, -0.02, -0.49, },
+ { 0.46, 0.71, 0.38, 0.31, },
+ { 0.30, 0.79, -0.49, 0.07, },
+ { 0.13, 0.83, 0.27, -0.41, },
+ { -0.04, 0.84, 0.13, 0.48, },
+ { -0.22, 0.82, -0.44, -0.23, },
+ { -0.38, 0.75, 0.46, -0.17, },
+ { -0.53, 0.66, -0.18, 0.46, },
+ { 0.11, 0.78, -0.33, -0.47, },
+ { -0.05, 0.79, 0.57, 0.07, },
+ { -0.22, 0.76, -0.44, 0.38, },
+ { -0.37, 0.70, 0.01, -0.58, },
+ { -0.51, 0.60, 0.42, 0.40, },
+ { -0.62, 0.49, -0.57, 0.05, },
+ { -0.71, 0.35, 0.35, -0.46, },
+ { -0.77, 0.19, 0.11, 0.57, },
+ { -0.79, 0.03, -0.49, -0.30, },
+ { -0.78, -0.14, 0.55, -0.16, },
+ { -0.73, -0.29, -0.25, 0.52, },
+ { -0.65, -0.44, -0.22, -0.53, },
+ { -0.55, -0.57, 0.54, 0.19, },
+ { -0.42, -0.67, -0.51, 0.28, },
+ { -0.27, -0.74, 0.13, -0.56, },
+ { -0.11, -0.78, 0.33, 0.47, },
+ { 0.05, -0.79, -0.57, -0.07, },
+ { 0.22, -0.76, 0.44, -0.38, },
+ { 0.37, -0.70, -0.01, 0.58, },
+ { 0.51, -0.60, -0.42, -0.40, },
+ { 0.62, -0.49, 0.57, -0.05, },
+ { 0.71, -0.35, -0.35, 0.46, },
+ { 0.77, -0.19, -0.11, -0.57, },
+ { 0.79, -0.03, 0.49, 0.30, },
+ { 0.78, 0.14, -0.55, 0.16, },
+ { 0.73, 0.29, 0.25, -0.52, },
+ { 0.65, 0.44, 0.22, 0.53, },
+ { 0.55, 0.57, -0.54, -0.19, },
+ { 0.42, 0.67, 0.51, -0.28, },
+ { 0.27, 0.74, -0.13, 0.56, },
+ { -0.73, 0.29, -0.25, -0.52, },
+ { -0.78, 0.14, 0.55, 0.16, },
+ { -0.79, -0.03, -0.49, 0.30, },
+ { -0.77, -0.19, 0.11, -0.57, },
+ { -0.71, -0.35, 0.35, 0.46, },
+ { -0.62, -0.49, -0.57, -0.05, },
+ { -0.51, -0.60, 0.42, -0.40, },
+ { -0.37, -0.70, 0.01, 0.58, },
+ { -0.22, -0.76, -0.44, -0.38, },
+ { -0.05, -0.79, 0.57, -0.07, },
+ { 0.11, -0.78, -0.33, 0.47, },
+ { 0.27, -0.74, -0.13, -0.56, },
+ { 0.42, -0.67, 0.51, 0.28, },
+ { 0.55, -0.57, -0.54, 0.19, },
+ { 0.65, -0.44, 0.22, -0.53, },
+ { 0.73, -0.29, 0.25, 0.52, },
+ { 0.78, -0.14, -0.55, -0.16, },
+ { 0.79, 0.03, 0.49, -0.30, },
+ { 0.77, 0.19, -0.11, 0.57, },
+ { 0.71, 0.35, -0.35, -0.46, },
+ { 0.62, 0.49, 0.57, 0.05, },
+ { 0.51, 0.60, -0.42, 0.40, },
+ { 0.37, 0.70, -0.01, -0.58, },
+ { 0.22, 0.76, 0.44, 0.38, },
+ { 0.05, 0.79, -0.57, 0.07, },
+ { -0.11, 0.78, 0.33, -0.47, },
+ { -0.27, 0.74, 0.13, 0.56, },
+ { -0.42, 0.67, -0.51, -0.28, },
+ { -0.55, 0.57, 0.54, -0.19, },
+ { -0.65, 0.44, -0.22, 0.53, },
+ { -0.28, 0.70, -0.24, -0.58, },
+ { -0.42, 0.62, 0.59, 0.21, },
+ { -0.54, 0.52, -0.55, 0.29, },
+ { -0.64, 0.40, 0.15, -0.60, },
+ { -0.71, 0.25, 0.35, 0.51, },
+ { -0.75, 0.10, -0.62, -0.08, },
+ { -0.75, -0.06, 0.48, -0.40, },
+ { -0.72, -0.21, -0.02, 0.62, },
+ { -0.66, -0.36, -0.45, -0.43, },
+ { -0.57, -0.49, 0.62, -0.05, },
+ { -0.46, -0.60, -0.38, 0.49, },
+ { -0.33, -0.68, -0.11, -0.61, },
+ { -0.18, -0.73, 0.53, 0.33, },
+ { -0.02, -0.75, -0.60, 0.17, },
+ { 0.13, -0.74, 0.27, -0.56, },
+ { 0.28, -0.70, 0.24, 0.58, },
+ { 0.42, -0.62, -0.59, -0.21, },
+ { 0.54, -0.52, 0.55, -0.29, },
+ { 0.64, -0.40, -0.15, 0.60, },
+ { 0.71, -0.25, -0.35, -0.51, },
+ { 0.75, -0.10, 0.62, 0.08, },
+ { 0.75, 0.06, -0.48, 0.40, },
+ { 0.72, 0.21, 0.02, -0.62, },
+ { 0.66, 0.36, 0.45, 0.43, },
+ { 0.57, 0.49, -0.62, 0.05, },
+ { 0.46, 0.60, 0.38, -0.49, },
+ { 0.33, 0.68, 0.11, 0.61, },
+ { 0.18, 0.73, -0.53, -0.33, },
+ { 0.02, 0.75, 0.60, -0.17, },
+ { -0.13, 0.74, -0.27, 0.56, },
+ { -0.46, 0.60, -0.38, -0.49, },
+ { -0.57, 0.49, 0.62, 0.05, },
+ { -0.66, 0.36, -0.45, 0.43, },
+ { -0.72, 0.21, -0.02, -0.62, },
+ { -0.75, 0.06, 0.48, 0.40, },
+ { -0.75, -0.10, -0.62, 0.08, },
+ { -0.71, -0.25, 0.35, -0.51, },
+ { -0.64, -0.40, 0.15, 0.60, },
+ { -0.54, -0.52, -0.55, -0.29, },
+ { -0.42, -0.62, 0.59, -0.21, },
+ { -0.28, -0.70, -0.24, 0.58, },
+ { -0.13, -0.74, -0.27, -0.56, },
+ { 0.02, -0.75, 0.60, 0.17, },
+ { 0.18, -0.73, -0.53, 0.33, },
+ { 0.33, -0.68, 0.11, -0.61, },
+ { 0.46, -0.60, 0.38, 0.49, },
+ { 0.57, -0.49, -0.62, -0.05, },
+ { 0.66, -0.36, 0.45, -0.43, },
+ { 0.72, -0.21, 0.02, 0.62, },
+ { 0.75, -0.06, -0.48, -0.40, },
+ { 0.75, 0.10, 0.62, -0.08, },
+ { 0.71, 0.25, -0.35, 0.51, },
+ { 0.64, 0.40, -0.15, -0.60, },
+ { 0.54, 0.52, 0.55, 0.29, },
+ { 0.42, 0.62, -0.59, 0.21, },
+ { 0.28, 0.70, 0.24, -0.58, },
+ { 0.13, 0.74, 0.27, 0.56, },
+ { -0.02, 0.75, -0.60, -0.17, },
+ { -0.18, 0.73, 0.53, -0.33, },
+ { -0.33, 0.68, -0.11, 0.61, },
+ { -0.24, 0.58, 0.28, 0.70, },
+ { -0.35, 0.51, -0.71, -0.25, },
+ { -0.45, 0.43, 0.66, -0.36, },
+ { -0.53, 0.33, -0.18, 0.73, },
+ { -0.59, 0.21, -0.42, -0.62, },
+ { -0.62, 0.08, 0.75, 0.10, },
+ { -0.62, -0.05, -0.57, 0.49, },
+ { -0.60, -0.17, 0.02, -0.75, },
+ { -0.55, -0.29, 0.54, 0.52, },
+ { -0.48, -0.40, -0.75, 0.06, },
+ { -0.38, -0.49, 0.46, -0.60, },
+ { -0.27, -0.56, 0.13, 0.74, },
+ { -0.15, -0.60, -0.64, -0.40, },
+ { -0.02, -0.62, 0.72, -0.21, },
+ { 0.11, -0.61, -0.33, 0.68, },
+ { 0.24, -0.58, -0.29, -0.70, },
+ { 0.35, -0.51, 0.71, 0.25, },
+ { 0.45, -0.43, -0.66, 0.36, },
+ { 0.53, -0.33, 0.18, -0.73, },
+ { 0.59, -0.21, 0.42, 0.62, },
+ { 0.62, -0.08, -0.75, -0.10, },
+ { 0.62, 0.05, 0.57, -0.49, },
+ { 0.60, 0.17, -0.02, 0.75, },
+ { 0.55, 0.29, -0.54, -0.52, },
+ { 0.48, 0.40, 0.75, -0.06, },
+ { 0.38, 0.49, -0.46, 0.60, },
+ { 0.27, 0.56, -0.13, -0.74, },
+ { 0.15, 0.60, 0.64, 0.40, },
+ { 0.02, 0.62, -0.72, 0.21, },
+ { -0.11, 0.61, 0.33, -0.68, },
+ { -0.38, 0.49, 0.46, 0.60, },
+ { -0.48, 0.40, -0.75, -0.06, },
+ { -0.55, 0.29, 0.54, -0.52, },
+ { -0.60, 0.17, 0.02, 0.75, },
+ { -0.62, 0.05, -0.57, -0.49, },
+ { -0.62, -0.08, 0.75, -0.10, },
+ { -0.59, -0.21, -0.42, 0.62, },
+ { -0.53, -0.33, -0.18, -0.73, },
+ { -0.45, -0.43, 0.66, 0.36, },
+ { -0.35, -0.51, -0.71, 0.25, },
+ { -0.24, -0.58, 0.28, -0.70, },
+ { -0.11, -0.61, 0.33, 0.68, },
+ { 0.02, -0.62, -0.72, -0.21, },
+ { 0.15, -0.60, 0.64, -0.40, },
+ { 0.27, -0.56, -0.13, 0.74, },
+ { 0.38, -0.49, -0.46, -0.60, },
+ { 0.48, -0.40, 0.75, 0.06, },
+ { 0.55, -0.29, -0.54, 0.52, },
+ { 0.60, -0.17, -0.02, -0.75, },
+ { 0.62, -0.05, 0.57, 0.49, },
+ { 0.62, 0.08, -0.75, 0.10, },
+ { 0.59, 0.21, 0.42, -0.62, },
+ { 0.53, 0.33, 0.18, 0.73, },
+ { 0.45, 0.43, -0.66, -0.36, },
+ { 0.35, 0.51, 0.71, -0.25, },
+ { 0.24, 0.58, -0.28, 0.70, },
+ { 0.11, 0.61, -0.33, -0.68, },
+ { -0.02, 0.62, 0.72, 0.21, },
+ { -0.15, 0.60, -0.64, 0.40, },
+ { -0.27, 0.56, 0.13, -0.74, },
+ { -0.33, 0.47, -0.11, 0.78, },
+ { -0.42, 0.40, -0.51, -0.60, },
+ { -0.49, 0.30, 0.79, 0.03, },
+ { -0.54, 0.19, -0.55, 0.57, },
+ { -0.57, 0.07, -0.05, -0.79, },
+ { -0.57, -0.05, 0.62, 0.49, },
+ { -0.55, -0.16, -0.78, 0.14, },
+ { -0.51, -0.28, 0.42, -0.67, },
+ { -0.44, -0.38, 0.22, 0.76, },
+ { -0.35, -0.46, -0.71, -0.35, },
+ { -0.25, -0.52, 0.73, -0.29, },
+ { -0.13, -0.56, -0.27, 0.74, },
+ { -0.01, -0.58, -0.37, -0.70, },
+ { 0.11, -0.57, 0.77, 0.19, },
+ { 0.22, -0.53, -0.65, 0.44, },
+ { 0.33, -0.47, 0.11, -0.78, },
+ { 0.42, -0.40, 0.51, 0.60, },
+ { 0.49, -0.30, -0.79, -0.03, },
+ { 0.54, -0.19, 0.55, -0.57, },
+ { 0.57, -0.07, 0.05, 0.79, },
+ { 0.57, 0.05, -0.62, -0.49, },
+ { 0.55, 0.16, 0.78, -0.14, },
+ { 0.51, 0.28, -0.42, 0.67, },
+ { 0.44, 0.38, -0.22, -0.76, },
+ { 0.35, 0.46, 0.71, 0.35, },
+ { 0.25, 0.52, -0.73, 0.29, },
+ { 0.13, 0.56, 0.27, -0.74, },
+ { 0.01, 0.58, 0.37, 0.70, },
+ { -0.11, 0.57, -0.77, -0.19, },
+ { -0.22, 0.53, 0.65, -0.44, },
+ { -0.25, 0.52, 0.73, 0.29, },
+ { -0.35, 0.46, -0.71, 0.35, },
+ { -0.44, 0.38, 0.22, -0.76, },
+ { -0.51, 0.28, 0.42, 0.67, },
+ { -0.55, 0.16, -0.78, -0.14, },
+ { -0.57, 0.05, 0.62, -0.49, },
+ { -0.57, -0.07, -0.05, 0.79, },
+ { -0.54, -0.19, -0.55, -0.57, },
+ { -0.49, -0.30, 0.79, -0.03, },
+ { -0.42, -0.40, -0.51, 0.60, },
+ { -0.33, -0.47, -0.11, -0.78, },
+ { -0.22, -0.53, 0.65, 0.44, },
+ { -0.11, -0.57, -0.77, 0.19, },
+ { 0.01, -0.58, 0.37, -0.70, },
+ { 0.13, -0.56, 0.27, 0.74, },
+ { 0.25, -0.52, -0.73, -0.29, },
+ { 0.35, -0.46, 0.71, -0.35, },
+ { 0.44, -0.38, -0.22, 0.76, },
+ { 0.51, -0.28, -0.42, -0.67, },
+ { 0.55, -0.16, 0.78, 0.14, },
+ { 0.57, -0.05, -0.62, 0.49, },
+ { 0.57, 0.07, 0.05, -0.79, },
+ { 0.54, 0.19, 0.55, 0.57, },
+ { 0.49, 0.30, -0.79, 0.03, },
+ { 0.42, 0.40, 0.51, -0.60, },
+ { 0.33, 0.47, 0.11, 0.78, },
+ { 0.22, 0.53, -0.65, -0.44, },
+ { 0.11, 0.57, 0.77, -0.19, },
+ { -0.01, 0.58, -0.37, 0.70, },
+ { -0.13, 0.56, -0.27, -0.74, },
+ { -0.27, 0.41, 0.13, 0.83, },
+ { -0.35, 0.35, -0.71, -0.46, },
+ { -0.41, 0.27, 0.81, -0.22, },
+ { -0.46, 0.17, -0.38, 0.75, },
+ { -0.49, 0.07, -0.30, -0.79, },
+ { -0.49, -0.03, 0.79, 0.30, },
+ { -0.48, -0.13, -0.75, 0.38, },
+ { -0.44, -0.23, 0.22, -0.82, },
+ { -0.38, -0.31, 0.46, 0.71, },
+ { -0.31, -0.38, -0.83, -0.13, },
+ { -0.22, -0.44, 0.65, -0.53, },
+ { -0.13, -0.48, -0.04, 0.84, },
+ { -0.02, -0.49, -0.60, -0.60, },
+ { 0.08, -0.49, 0.84, -0.05, },
+ { 0.18, -0.46, -0.53, 0.66, },
+ { 0.27, -0.41, -0.13, -0.83, },
+ { 0.35, -0.35, 0.71, 0.46, },
+ { 0.41, -0.27, -0.81, 0.22, },
+ { 0.46, -0.17, 0.38, -0.75, },
+ { 0.49, -0.07, 0.30, 0.79, },
+ { 0.49, 0.03, -0.79, -0.30, },
+ { 0.48, 0.13, 0.75, -0.38, },
+ { 0.44, 0.23, -0.22, 0.82, },
+ { 0.38, 0.31, -0.46, -0.71, },
+ { 0.31, 0.38, 0.83, 0.13, },
+ { 0.22, 0.44, -0.65, 0.53, },
+ { 0.12, 0.48, 0.04, -0.84, },
+ { 0.02, 0.49, 0.60, 0.60, },
+ { -0.08, 0.49, -0.84, 0.05, },
+ { -0.18, 0.46, 0.53, -0.66, },
+ { -0.22, 0.44, 0.65, 0.53, },
+ { -0.31, 0.38, -0.83, 0.13, },
+ { -0.38, 0.31, 0.46, -0.71, },
+ { -0.44, 0.23, 0.22, 0.82, },
+ { -0.48, 0.13, -0.75, -0.38, },
+ { -0.49, 0.03, 0.79, -0.30, },
+ { -0.49, -0.07, -0.30, 0.79, },
+ { -0.46, -0.17, -0.38, -0.75, },
+ { -0.41, -0.27, 0.81, 0.22, },
+ { -0.35, -0.35, -0.71, 0.46, },
+ { -0.27, -0.41, 0.13, -0.83, },
+ { -0.18, -0.46, 0.53, 0.66, },
+ { -0.08, -0.49, -0.84, -0.05, },
+ { 0.02, -0.49, 0.60, -0.60, },
+ { 0.12, -0.48, 0.04, 0.84, },
+ { 0.22, -0.44, -0.65, -0.53, },
+ { 0.31, -0.38, 0.83, -0.13, },
+ { 0.38, -0.31, -0.46, 0.71, },
+ { 0.44, -0.23, -0.22, -0.82, },
+ { 0.48, -0.13, 0.75, 0.38, },
+ { 0.49, -0.03, -0.79, 0.30, },
+ { 0.49, 0.07, 0.30, -0.79, },
+ { 0.46, 0.17, 0.38, 0.75, },
+ { 0.41, 0.27, -0.81, -0.22, },
+ { 0.35, 0.35, 0.71, -0.46, },
+ { 0.27, 0.41, -0.13, 0.83, },
+ { 0.18, 0.46, -0.53, -0.66, },
+ { 0.08, 0.49, 0.84, 0.05, },
+ { -0.02, 0.49, -0.60, 0.60, },
+ { -0.12, 0.48, -0.04, -0.84, },
+ { -0.15, 0.28, -0.64, 0.67, },
+ { -0.20, 0.24, -0.07, -0.92, },
+ { -0.25, 0.19, 0.73, 0.57, },
+ { -0.28, 0.14, -0.91, 0.16, },
+ { -0.30, 0.07, 0.49, -0.79, },
+ { -0.31, 0.01, 0.26, 0.89, },
+ { -0.31, -0.06, -0.83, -0.40, },
+ { -0.29, -0.12, 0.86, -0.35, },
+ { -0.26, -0.18, -0.31, 0.87, },
+ { -0.22, -0.23, -0.44, -0.82, },
+ { -0.16, -0.27, 0.90, 0.22, },
+ { -0.11, -0.29, -0.77, 0.52, },
+ { -0.04, -0.31, 0.12, -0.92, },
+ { 0.02, -0.31, 0.60, 0.71, },
+ { 0.09, -0.30, -0.93, -0.03, },
+ { 0.15, -0.28, 0.64, -0.67, },
+ { 0.20, -0.24, 0.07, 0.92, },
+ { 0.25, -0.19, -0.73, -0.57, },
+ { 0.28, -0.14, 0.91, -0.16, },
+ { 0.30, -0.07, -0.49, 0.79, },
+ { 0.31, -0.01, -0.26, -0.89, },
+ { 0.31, 0.06, 0.83, 0.40, },
+ { 0.29, 0.12, -0.86, 0.35, },
+ { 0.26, 0.18, 0.31, -0.87, },
+ { 0.22, 0.23, 0.44, 0.82, },
+ { 0.16, 0.27, -0.90, -0.22, },
+ { 0.11, 0.29, 0.77, -0.52, },
+ { 0.04, 0.31, -0.12, 0.92, },
+ { -0.02, 0.31, -0.60, -0.71, },
+ { -0.09, 0.30, 0.93, 0.03, },
+ { -0.22, 0.23, -0.44, 0.82, },
+ { -0.26, 0.18, -0.31, -0.87, },
+ { -0.29, 0.12, 0.86, 0.35, },
+ { -0.31, 0.06, -0.83, 0.40, },
+ { -0.31, -0.01, 0.26, -0.89, },
+ { -0.30, -0.07, 0.49, 0.79, },
+ { -0.28, -0.14, -0.91, -0.16, },
+ { -0.25, -0.19, 0.73, -0.57, },
+ { -0.20, -0.24, -0.07, 0.92, },
+ { -0.15, -0.28, -0.64, -0.67, },
+ { -0.09, -0.30, 0.93, -0.03, },
+ { -0.02, -0.31, -0.60, 0.71, },
+ { 0.04, -0.31, -0.13, -0.92, },
+ { 0.11, -0.29, 0.77, 0.52, },
+ { 0.16, -0.27, -0.90, 0.22, },
+ { 0.22, -0.23, 0.44, -0.82, },
+ { 0.26, -0.18, 0.31, 0.87, },
+ { 0.29, -0.12, -0.86, -0.35, },
+ { 0.31, -0.06, 0.83, -0.40, },
+ { 0.31, 0.01, -0.26, 0.89, },
+ { 0.30, 0.07, -0.49, -0.79, },
+ { 0.28, 0.14, 0.91, 0.16, },
+ { 0.25, 0.19, -0.73, 0.57, },
+ { 0.20, 0.24, 0.07, -0.92, },
+ { 0.15, 0.28, 0.64, 0.67, },
+ { 0.09, 0.30, -0.93, 0.03, },
+ { 0.02, 0.31, 0.60, -0.71, },
+ { -0.04, 0.31, 0.13, 0.92, },
+ { -0.11, 0.29, -0.77, -0.52, },
+ { -0.16, 0.27, 0.90, -0.22, },
+};
+
+static const struct line_info line_table[LINE_COUNT] =
+{
+ { 0, 1, 0, },
+ { 0, 29, 0, },
+ { 0, 148, 0, },
+ { 0, 176, 0, },
+ { 1, 2, 0, },
+ { 1, 149, 0, },
+ { 1, 177, 0, },
+ { 2, 3, 0, },
+ { 2, 120, 0, },
+ { 2, 178, 0, },
+ { 3, 4, 0, },
+ { 3, 121, 0, },
+ { 3, 179, 0, },
+ { 4, 5, 0, },
+ { 4, 122, 0, },
+ { 4, 150, 0, },
+ { 5, 6, 0, },
+ { 5, 123, 0, },
+ { 5, 151, 0, },
+ { 6, 7, 0, },
+ { 6, 124, 0, },
+ { 6, 152, 0, },
+ { 7, 8, 0, },
+ { 7, 125, 0, },
+ { 7, 153, 0, },
+ { 8, 9, 0, },
+ { 8, 126, 0, },
+ { 8, 154, 0, },
+ { 9, 10, 0, },
+ { 9, 127, 0, },
+ { 9, 155, 0, },
+ { 10, 11, 0, },
+ { 10, 128, 0, },
+ { 10, 156, 0, },
+ { 11, 12, 0, },
+ { 11, 129, 0, },
+ { 11, 157, 0, },
+ { 12, 13, 0, },
+ { 12, 130, 0, },
+ { 12, 158, 0, },
+ { 13, 14, 0, },
+ { 13, 131, 0, },
+ { 13, 159, 0, },
+ { 14, 15, 0, },
+ { 14, 132, 0, },
+ { 14, 160, 0, },
+ { 15, 16, 0, },
+ { 15, 133, 0, },
+ { 15, 161, 0, },
+ { 16, 17, 0, },
+ { 16, 134, 0, },
+ { 16, 162, 0, },
+ { 17, 18, 0, },
+ { 17, 135, 0, },
+ { 17, 163, 0, },
+ { 18, 19, 0, },
+ { 18, 136, 0, },
+ { 18, 164, 0, },
+ { 19, 20, 0, },
+ { 19, 137, 0, },
+ { 19, 165, 0, },
+ { 20, 21, 0, },
+ { 20, 138, 0, },
+ { 20, 166, 0, },
+ { 21, 22, 0, },
+ { 21, 139, 0, },
+ { 21, 167, 0, },
+ { 22, 23, 0, },
+ { 22, 140, 0, },
+ { 22, 168, 0, },
+ { 23, 24, 0, },
+ { 23, 141, 0, },
+ { 23, 169, 0, },
+ { 24, 25, 0, },
+ { 24, 142, 0, },
+ { 24, 170, 0, },
+ { 25, 26, 0, },
+ { 25, 143, 0, },
+ { 25, 171, 0, },
+ { 26, 27, 0, },
+ { 26, 144, 0, },
+ { 26, 172, 0, },
+ { 27, 28, 0, },
+ { 27, 145, 0, },
+ { 27, 173, 0, },
+ { 28, 29, 0, },
+ { 28, 146, 0, },
+ { 28, 174, 0, },
+ { 29, 147, 0, },
+ { 29, 175, 0, },
+ { 30, 123, 0, },
+ { 30, 150, 0, },
+ { 30, 240, 0, },
+ { 30, 292, 0, },
+ { 31, 124, 0, },
+ { 31, 151, 0, },
+ { 31, 241, 0, },
+ { 31, 293, 0, },
+ { 32, 125, 0, },
+ { 32, 152, 0, },
+ { 32, 242, 0, },
+ { 32, 294, 0, },
+ { 33, 126, 0, },
+ { 33, 153, 0, },
+ { 33, 243, 0, },
+ { 33, 295, 0, },
+ { 34, 127, 0, },
+ { 34, 154, 0, },
+ { 34, 244, 0, },
+ { 34, 296, 0, },
+ { 35, 128, 0, },
+ { 35, 155, 0, },
+ { 35, 245, 0, },
+ { 35, 297, 0, },
+ { 36, 129, 0, },
+ { 36, 156, 0, },
+ { 36, 246, 0, },
+ { 36, 298, 0, },
+ { 37, 130, 0, },
+ { 37, 157, 0, },
+ { 37, 247, 0, },
+ { 37, 299, 0, },
+ { 38, 131, 0, },
+ { 38, 158, 0, },
+ { 38, 248, 0, },
+ { 38, 270, 0, },
+ { 39, 132, 0, },
+ { 39, 159, 0, },
+ { 39, 249, 0, },
+ { 39, 271, 0, },
+ { 40, 133, 0, },
+ { 40, 160, 0, },
+ { 40, 250, 0, },
+ { 40, 272, 0, },
+ { 41, 134, 0, },
+ { 41, 161, 0, },
+ { 41, 251, 0, },
+ { 41, 273, 0, },
+ { 42, 135, 0, },
+ { 42, 162, 0, },
+ { 42, 252, 0, },
+ { 42, 274, 0, },
+ { 43, 136, 0, },
+ { 43, 163, 0, },
+ { 43, 253, 0, },
+ { 43, 275, 0, },
+ { 44, 137, 0, },
+ { 44, 164, 0, },
+ { 44, 254, 0, },
+ { 44, 276, 0, },
+ { 45, 138, 1, },
+ { 45, 165, 1, },
+ { 45, 255, 1, },
+ { 45, 277, 1, },
+ { 46, 139, 1, },
+ { 46, 166, 1, },
+ { 46, 256, 1, },
+ { 46, 278, 1, },
+ { 47, 140, 1, },
+ { 47, 167, 1, },
+ { 47, 257, 1, },
+ { 47, 279, 1, },
+ { 48, 141, 1, },
+ { 48, 168, 1, },
+ { 48, 258, 1, },
+ { 48, 280, 1, },
+ { 49, 142, 1, },
+ { 49, 169, 1, },
+ { 49, 259, 1, },
+ { 49, 281, 1, },
+ { 50, 143, 1, },
+ { 50, 170, 1, },
+ { 50, 260, 1, },
+ { 50, 282, 1, },
+ { 51, 144, 1, },
+ { 51, 171, 1, },
+ { 51, 261, 1, },
+ { 51, 283, 1, },
+ { 52, 145, 1, },
+ { 52, 172, 1, },
+ { 52, 262, 1, },
+ { 52, 284, 1, },
+ { 53, 146, 1, },
+ { 53, 173, 1, },
+ { 53, 263, 1, },
+ { 53, 285, 1, },
+ { 54, 147, 1, },
+ { 54, 174, 1, },
+ { 54, 264, 1, },
+ { 54, 286, 1, },
+ { 55, 148, 1, },
+ { 55, 175, 1, },
+ { 55, 265, 1, },
+ { 55, 287, 1, },
+ { 56, 149, 1, },
+ { 56, 176, 1, },
+ { 56, 266, 1, },
+ { 56, 288, 1, },
+ { 57, 120, 1, },
+ { 57, 177, 1, },
+ { 57, 267, 1, },
+ { 57, 289, 1, },
+ { 58, 121, 1, },
+ { 58, 178, 1, },
+ { 58, 268, 1, },
+ { 58, 290, 1, },
+ { 59, 122, 1, },
+ { 59, 179, 1, },
+ { 59, 269, 1, },
+ { 59, 291, 1, },
+ { 60, 420, 1, },
+ { 60, 478, 1, },
+ { 60, 567, 1, },
+ { 60, 570, 1, },
+ { 61, 421, 1, },
+ { 61, 479, 1, },
+ { 61, 568, 1, },
+ { 61, 571, 1, },
+ { 62, 422, 1, },
+ { 62, 450, 1, },
+ { 62, 569, 1, },
+ { 62, 572, 1, },
+ { 63, 423, 1, },
+ { 63, 451, 1, },
+ { 63, 540, 1, },
+ { 63, 573, 1, },
+ { 64, 424, 1, },
+ { 64, 452, 1, },
+ { 64, 541, 1, },
+ { 64, 574, 1, },
+ { 65, 425, 1, },
+ { 65, 453, 1, },
+ { 65, 542, 1, },
+ { 65, 575, 1, },
+ { 66, 426, 1, },
+ { 66, 454, 1, },
+ { 66, 543, 1, },
+ { 66, 576, 1, },
+ { 67, 427, 1, },
+ { 67, 455, 1, },
+ { 67, 544, 1, },
+ { 67, 577, 1, },
+ { 68, 428, 1, },
+ { 68, 456, 1, },
+ { 68, 545, 1, },
+ { 68, 578, 1, },
+ { 69, 429, 1, },
+ { 69, 457, 1, },
+ { 69, 546, 1, },
+ { 69, 579, 1, },
+ { 70, 430, 1, },
+ { 70, 458, 1, },
+ { 70, 547, 1, },
+ { 70, 580, 1, },
+ { 71, 431, 1, },
+ { 71, 459, 1, },
+ { 71, 548, 1, },
+ { 71, 581, 1, },
+ { 72, 432, 1, },
+ { 72, 460, 1, },
+ { 72, 549, 1, },
+ { 72, 582, 1, },
+ { 73, 433, 1, },
+ { 73, 461, 1, },
+ { 73, 550, 1, },
+ { 73, 583, 1, },
+ { 74, 434, 1, },
+ { 74, 462, 1, },
+ { 74, 551, 1, },
+ { 74, 584, 1, },
+ { 75, 435, 1, },
+ { 75, 463, 1, },
+ { 75, 552, 1, },
+ { 75, 585, 1, },
+ { 76, 436, 1, },
+ { 76, 464, 1, },
+ { 76, 553, 1, },
+ { 76, 586, 1, },
+ { 77, 437, 1, },
+ { 77, 465, 1, },
+ { 77, 554, 1, },
+ { 77, 587, 1, },
+ { 78, 438, 1, },
+ { 78, 466, 1, },
+ { 78, 555, 1, },
+ { 78, 588, 1, },
+ { 79, 439, 1, },
+ { 79, 467, 1, },
+ { 79, 556, 1, },
+ { 79, 589, 1, },
+ { 80, 440, 1, },
+ { 80, 468, 1, },
+ { 80, 557, 1, },
+ { 80, 590, 1, },
+ { 81, 441, 1, },
+ { 81, 469, 1, },
+ { 81, 558, 1, },
+ { 81, 591, 1, },
+ { 82, 442, 1, },
+ { 82, 470, 1, },
+ { 82, 559, 2, },
+ { 82, 592, 2, },
+ { 83, 443, 2, },
+ { 83, 471, 2, },
+ { 83, 560, 2, },
+ { 83, 593, 2, },
+ { 84, 444, 2, },
+ { 84, 472, 2, },
+ { 84, 561, 2, },
+ { 84, 594, 2, },
+ { 85, 445, 2, },
+ { 85, 473, 2, },
+ { 85, 562, 2, },
+ { 85, 595, 2, },
+ { 86, 446, 2, },
+ { 86, 474, 2, },
+ { 86, 563, 2, },
+ { 86, 596, 2, },
+ { 87, 447, 2, },
+ { 87, 475, 2, },
+ { 87, 564, 2, },
+ { 87, 597, 2, },
+ { 88, 448, 2, },
+ { 88, 476, 2, },
+ { 88, 565, 2, },
+ { 88, 598, 2, },
+ { 89, 449, 2, },
+ { 89, 477, 2, },
+ { 89, 566, 2, },
+ { 89, 599, 2, },
+ { 90, 101, 2, },
+ { 90, 109, 2, },
+ { 90, 562, 2, },
+ { 90, 584, 2, },
+ { 91, 102, 2, },
+ { 91, 110, 2, },
+ { 91, 563, 2, },
+ { 91, 585, 2, },
+ { 92, 103, 2, },
+ { 92, 111, 2, },
+ { 92, 564, 2, },
+ { 92, 586, 2, },
+ { 93, 104, 2, },
+ { 93, 112, 2, },
+ { 93, 565, 2, },
+ { 93, 587, 2, },
+ { 94, 105, 2, },
+ { 94, 113, 2, },
+ { 94, 566, 2, },
+ { 94, 588, 2, },
+ { 95, 106, 2, },
+ { 95, 114, 2, },
+ { 95, 567, 2, },
+ { 95, 589, 2, },
+ { 96, 107, 2, },
+ { 96, 115, 2, },
+ { 96, 568, 2, },
+ { 96, 590, 2, },
+ { 97, 108, 2, },
+ { 97, 116, 2, },
+ { 97, 569, 2, },
+ { 97, 591, 2, },
+ { 98, 109, 2, },
+ { 98, 117, 2, },
+ { 98, 540, 2, },
+ { 98, 592, 2, },
+ { 99, 110, 2, },
+ { 99, 118, 2, },
+ { 99, 541, 2, },
+ { 99, 593, 2, },
+ { 100, 111, 2, },
+ { 100, 119, 2, },
+ { 100, 542, 2, },
+ { 100, 594, 2, },
+ { 101, 112, 2, },
+ { 101, 543, 2, },
+ { 101, 595, 2, },
+ { 102, 113, 2, },
+ { 102, 544, 2, },
+ { 102, 596, 2, },
+ { 103, 114, 2, },
+ { 103, 545, 2, },
+ { 103, 597, 2, },
+ { 104, 115, 2, },
+ { 104, 546, 2, },
+ { 104, 598, 2, },
+ { 105, 116, 2, },
+ { 105, 547, 2, },
+ { 105, 599, 2, },
+ { 106, 117, 2, },
+ { 106, 548, 2, },
+ { 106, 570, 2, },
+ { 107, 118, 2, },
+ { 107, 549, 2, },
+ { 107, 571, 2, },
+ { 108, 119, 2, },
+ { 108, 550, 2, },
+ { 108, 572, 2, },
+ { 109, 551, 2, },
+ { 109, 573, 2, },
+ { 110, 552, 2, },
+ { 110, 574, 2, },
+ { 111, 553, 2, },
+ { 111, 575, 2, },
+ { 112, 554, 2, },
+ { 112, 576, 2, },
+ { 113, 555, 2, },
+ { 113, 577, 2, },
+ { 114, 556, 2, },
+ { 114, 578, 2, },
+ { 115, 557, 2, },
+ { 115, 579, 2, },
+ { 116, 558, 2, },
+ { 116, 580, 2, },
+ { 117, 559, 2, },
+ { 117, 581, 2, },
+ { 118, 560, 2, },
+ { 118, 582, 2, },
+ { 119, 561, 2, },
+ { 119, 583, 2, },
+ { 120, 150, 2, },
+ { 120, 232, 2, },
+ { 121, 151, 2, },
+ { 121, 233, 2, },
+ { 122, 152, 2, },
+ { 122, 234, 2, },
+ { 123, 153, 2, },
+ { 123, 235, 2, },
+ { 124, 154, 2, },
+ { 124, 236, 2, },
+ { 125, 155, 2, },
+ { 125, 237, 2, },
+ { 126, 156, 2, },
+ { 126, 238, 2, },
+ { 127, 157, 2, },
+ { 127, 239, 2, },
+ { 128, 158, 2, },
+ { 128, 210, 2, },
+ { 129, 159, 2, },
+ { 129, 211, 2, },
+ { 130, 160, 2, },
+ { 130, 212, 2, },
+ { 131, 161, 2, },
+ { 131, 213, 2, },
+ { 132, 162, 2, },
+ { 132, 214, 2, },
+ { 133, 163, 2, },
+ { 133, 215, 2, },
+ { 134, 164, 2, },
+ { 134, 216, 2, },
+ { 135, 165, 3, },
+ { 135, 217, 3, },
+ { 136, 166, 3, },
+ { 136, 218, 3, },
+ { 137, 167, 3, },
+ { 137, 219, 3, },
+ { 138, 168, 3, },
+ { 138, 220, 3, },
+ { 139, 169, 3, },
+ { 139, 221, 3, },
+ { 140, 170, 3, },
+ { 140, 222, 3, },
+ { 141, 171, 3, },
+ { 141, 223, 3, },
+ { 142, 172, 3, },
+ { 142, 224, 3, },
+ { 143, 173, 3, },
+ { 143, 225, 3, },
+ { 144, 174, 3, },
+ { 144, 226, 3, },
+ { 145, 175, 3, },
+ { 145, 227, 3, },
+ { 146, 176, 3, },
+ { 146, 228, 3, },
+ { 147, 177, 3, },
+ { 147, 229, 3, },
+ { 148, 178, 3, },
+ { 148, 230, 3, },
+ { 149, 179, 3, },
+ { 149, 231, 3, },
+ { 150, 207, 3, },
+ { 151, 208, 3, },
+ { 152, 209, 3, },
+ { 153, 180, 3, },
+ { 154, 181, 3, },
+ { 155, 182, 3, },
+ { 156, 183, 3, },
+ { 157, 184, 3, },
+ { 158, 185, 3, },
+ { 159, 186, 3, },
+ { 160, 187, 3, },
+ { 161, 188, 3, },
+ { 162, 189, 3, },
+ { 163, 190, 3, },
+ { 164, 191, 3, },
+ { 165, 192, 3, },
+ { 166, 193, 3, },
+ { 167, 194, 3, },
+ { 168, 195, 3, },
+ { 169, 196, 3, },
+ { 170, 197, 3, },
+ { 171, 198, 3, },
+ { 172, 199, 3, },
+ { 173, 200, 3, },
+ { 174, 201, 3, },
+ { 175, 202, 3, },
+ { 176, 203, 3, },
+ { 177, 204, 3, },
+ { 178, 205, 3, },
+ { 179, 206, 3, },
+ { 180, 237, 3, },
+ { 180, 240, 3, },
+ { 180, 300, 3, },
+ { 181, 238, 3, },
+ { 181, 241, 3, },
+ { 181, 301, 3, },
+ { 182, 239, 3, },
+ { 182, 242, 3, },
+ { 182, 302, 3, },
+ { 183, 210, 3, },
+ { 183, 243, 3, },
+ { 183, 303, 3, },
+ { 184, 211, 3, },
+ { 184, 244, 3, },
+ { 184, 304, 3, },
+ { 185, 212, 3, },
+ { 185, 245, 3, },
+ { 185, 305, 3, },
+ { 186, 213, 3, },
+ { 186, 246, 3, },
+ { 186, 306, 3, },
+ { 187, 214, 3, },
+ { 187, 247, 3, },
+ { 187, 307, 3, },
+ { 188, 215, 3, },
+ { 188, 248, 3, },
+ { 188, 308, 3, },
+ { 189, 216, 3, },
+ { 189, 249, 3, },
+ { 189, 309, 3, },
+ { 190, 217, 3, },
+ { 190, 250, 3, },
+ { 190, 310, 3, },
+ { 191, 218, 3, },
+ { 191, 251, 3, },
+ { 191, 311, 3, },
+ { 192, 219, 3, },
+ { 192, 252, 3, },
+ { 192, 312, 3, },
+ { 193, 220, 3, },
+ { 193, 253, 3, },
+ { 193, 313, 3, },
+ { 194, 221, 3, },
+ { 194, 254, 3, },
+ { 194, 314, 3, },
+ { 195, 222, 3, },
+ { 195, 255, 3, },
+ { 195, 315, 3, },
+ { 196, 223, 3, },
+ { 196, 256, 3, },
+ { 196, 316, 3, },
+ { 197, 224, 3, },
+ { 197, 257, 3, },
+ { 197, 317, 3, },
+ { 198, 225, 3, },
+ { 198, 258, 3, },
+ { 198, 318, 3, },
+ { 199, 226, 3, },
+ { 199, 259, 3, },
+ { 199, 319, 3, },
+ { 200, 227, 3, },
+ { 200, 260, 3, },
+ { 200, 320, 3, },
+ { 201, 228, 3, },
+ { 201, 261, 3, },
+ { 201, 321, 3, },
+ { 202, 229, 3, },
+ { 202, 262, 3, },
+ { 202, 322, 3, },
+ { 203, 230, 3, },
+ { 203, 263, 3, },
+ { 203, 323, 3, },
+ { 204, 231, 3, },
+ { 204, 264, 3, },
+ { 204, 324, 3, },
+ { 205, 232, 3, },
+ { 205, 265, 3, },
+ { 205, 325, 3, },
+ { 206, 233, 3, },
+ { 206, 266, 3, },
+ { 206, 326, 3, },
+ { 207, 234, 3, },
+ { 207, 267, 3, },
+ { 207, 327, 3, },
+ { 208, 235, 3, },
+ { 208, 268, 3, },
+ { 208, 328, 3, },
+ { 209, 236, 3, },
+ { 209, 269, 3, },
+ { 209, 329, 3, },
+ { 210, 270, 4, },
+ { 210, 330, 4, },
+ { 211, 271, 4, },
+ { 211, 331, 4, },
+ { 212, 272, 4, },
+ { 212, 332, 4, },
+ { 213, 273, 4, },
+ { 213, 333, 4, },
+ { 214, 274, 4, },
+ { 214, 334, 4, },
+ { 215, 275, 4, },
+ { 215, 335, 4, },
+ { 216, 276, 4, },
+ { 216, 336, 4, },
+ { 217, 277, 4, },
+ { 217, 337, 4, },
+ { 218, 278, 4, },
+ { 218, 338, 4, },
+ { 219, 279, 4, },
+ { 219, 339, 4, },
+ { 220, 280, 4, },
+ { 220, 340, 4, },
+ { 221, 281, 4, },
+ { 221, 341, 4, },
+ { 222, 282, 4, },
+ { 222, 342, 4, },
+ { 223, 283, 4, },
+ { 223, 343, 4, },
+ { 224, 284, 4, },
+ { 224, 344, 4, },
+ { 225, 285, 4, },
+ { 225, 345, 4, },
+ { 226, 286, 4, },
+ { 226, 346, 4, },
+ { 227, 287, 4, },
+ { 227, 347, 4, },
+ { 228, 288, 4, },
+ { 228, 348, 4, },
+ { 229, 289, 4, },
+ { 229, 349, 4, },
+ { 230, 290, 4, },
+ { 230, 350, 4, },
+ { 231, 291, 4, },
+ { 231, 351, 4, },
+ { 232, 292, 4, },
+ { 232, 352, 4, },
+ { 233, 293, 4, },
+ { 233, 353, 4, },
+ { 234, 294, 4, },
+ { 234, 354, 4, },
+ { 235, 295, 4, },
+ { 235, 355, 4, },
+ { 236, 296, 4, },
+ { 236, 356, 4, },
+ { 237, 297, 4, },
+ { 237, 357, 4, },
+ { 238, 298, 4, },
+ { 238, 358, 4, },
+ { 239, 299, 4, },
+ { 239, 359, 4, },
+ { 240, 327, 4, },
+ { 240, 416, 4, },
+ { 241, 328, 4, },
+ { 241, 417, 4, },
+ { 242, 329, 4, },
+ { 242, 418, 4, },
+ { 243, 300, 4, },
+ { 243, 419, 4, },
+ { 244, 301, 4, },
+ { 244, 390, 4, },
+ { 245, 302, 4, },
+ { 245, 391, 4, },
+ { 246, 303, 4, },
+ { 246, 392, 4, },
+ { 247, 304, 4, },
+ { 247, 393, 4, },
+ { 248, 305, 4, },
+ { 248, 394, 4, },
+ { 249, 306, 4, },
+ { 249, 395, 4, },
+ { 250, 307, 4, },
+ { 250, 396, 4, },
+ { 251, 308, 4, },
+ { 251, 397, 4, },
+ { 252, 309, 4, },
+ { 252, 398, 4, },
+ { 253, 310, 4, },
+ { 253, 399, 4, },
+ { 254, 311, 4, },
+ { 254, 400, 4, },
+ { 255, 312, 4, },
+ { 255, 401, 4, },
+ { 256, 313, 4, },
+ { 256, 402, 4, },
+ { 257, 314, 4, },
+ { 257, 403, 4, },
+ { 258, 315, 4, },
+ { 258, 404, 4, },
+ { 259, 316, 4, },
+ { 259, 405, 4, },
+ { 260, 317, 4, },
+ { 260, 406, 4, },
+ { 261, 318, 4, },
+ { 261, 407, 4, },
+ { 262, 319, 4, },
+ { 262, 408, 4, },
+ { 263, 320, 4, },
+ { 263, 409, 4, },
+ { 264, 321, 4, },
+ { 264, 410, 4, },
+ { 265, 322, 4, },
+ { 265, 411, 4, },
+ { 266, 323, 4, },
+ { 266, 412, 4, },
+ { 267, 324, 4, },
+ { 267, 413, 4, },
+ { 268, 325, 4, },
+ { 268, 414, 4, },
+ { 269, 326, 4, },
+ { 269, 415, 4, },
+ { 270, 333, 4, },
+ { 270, 364, 4, },
+ { 271, 334, 4, },
+ { 271, 365, 4, },
+ { 272, 335, 4, },
+ { 272, 366, 4, },
+ { 273, 336, 4, },
+ { 273, 367, 4, },
+ { 274, 337, 4, },
+ { 274, 368, 4, },
+ { 275, 338, 4, },
+ { 275, 369, 4, },
+ { 276, 339, 4, },
+ { 276, 370, 4, },
+ { 277, 340, 4, },
+ { 277, 371, 4, },
+ { 278, 341, 4, },
+ { 278, 372, 4, },
+ { 279, 342, 4, },
+ { 279, 373, 4, },
+ { 280, 343, 4, },
+ { 280, 374, 4, },
+ { 281, 344, 4, },
+ { 281, 375, 4, },
+ { 282, 345, 4, },
+ { 282, 376, 4, },
+ { 283, 346, 4, },
+ { 283, 377, 4, },
+ { 284, 347, 4, },
+ { 284, 378, 4, },
+ { 285, 348, 5, },
+ { 285, 379, 5, },
+ { 286, 349, 5, },
+ { 286, 380, 5, },
+ { 287, 350, 5, },
+ { 287, 381, 5, },
+ { 288, 351, 5, },
+ { 288, 382, 5, },
+ { 289, 352, 5, },
+ { 289, 383, 5, },
+ { 290, 353, 5, },
+ { 290, 384, 5, },
+ { 291, 354, 5, },
+ { 291, 385, 5, },
+ { 292, 355, 5, },
+ { 292, 386, 5, },
+ { 293, 356, 5, },
+ { 293, 387, 5, },
+ { 294, 357, 5, },
+ { 294, 388, 5, },
+ { 295, 358, 5, },
+ { 295, 389, 5, },
+ { 296, 359, 5, },
+ { 296, 360, 5, },
+ { 297, 330, 5, },
+ { 297, 361, 5, },
+ { 298, 331, 5, },
+ { 298, 362, 5, },
+ { 299, 332, 5, },
+ { 299, 363, 5, },
+ { 300, 330, 5, },
+ { 300, 479, 5, },
+ { 301, 331, 5, },
+ { 301, 450, 5, },
+ { 302, 332, 5, },
+ { 302, 451, 5, },
+ { 303, 333, 5, },
+ { 303, 452, 5, },
+ { 304, 334, 5, },
+ { 304, 453, 5, },
+ { 305, 335, 5, },
+ { 305, 454, 5, },
+ { 306, 336, 5, },
+ { 306, 455, 5, },
+ { 307, 337, 5, },
+ { 307, 456, 5, },
+ { 308, 338, 5, },
+ { 308, 457, 5, },
+ { 309, 339, 5, },
+ { 309, 458, 5, },
+ { 310, 340, 5, },
+ { 310, 459, 5, },
+ { 311, 341, 5, },
+ { 311, 460, 5, },
+ { 312, 342, 5, },
+ { 312, 461, 5, },
+ { 313, 343, 5, },
+ { 313, 462, 5, },
+ { 314, 344, 5, },
+ { 314, 463, 5, },
+ { 315, 345, 5, },
+ { 315, 464, 5, },
+ { 316, 346, 5, },
+ { 316, 465, 5, },
+ { 317, 347, 5, },
+ { 317, 466, 5, },
+ { 318, 348, 5, },
+ { 318, 467, 5, },
+ { 319, 349, 5, },
+ { 319, 468, 5, },
+ { 320, 350, 5, },
+ { 320, 469, 5, },
+ { 321, 351, 5, },
+ { 321, 470, 5, },
+ { 322, 352, 5, },
+ { 322, 471, 5, },
+ { 323, 353, 5, },
+ { 323, 472, 5, },
+ { 324, 354, 5, },
+ { 324, 473, 5, },
+ { 325, 355, 5, },
+ { 325, 474, 5, },
+ { 326, 356, 5, },
+ { 326, 475, 5, },
+ { 327, 357, 5, },
+ { 327, 476, 5, },
+ { 328, 358, 5, },
+ { 328, 477, 5, },
+ { 329, 359, 5, },
+ { 329, 478, 5, },
+ { 330, 421, 5, },
+ { 331, 422, 5, },
+ { 332, 423, 5, },
+ { 333, 424, 5, },
+ { 334, 425, 5, },
+ { 335, 426, 5, },
+ { 336, 427, 5, },
+ { 337, 428, 5, },
+ { 338, 429, 5, },
+ { 339, 430, 5, },
+ { 340, 431, 5, },
+ { 341, 432, 5, },
+ { 342, 433, 5, },
+ { 343, 434, 5, },
+ { 344, 435, 5, },
+ { 345, 436, 5, },
+ { 346, 437, 5, },
+ { 347, 438, 5, },
+ { 348, 439, 5, },
+ { 349, 440, 5, },
+ { 350, 441, 5, },
+ { 351, 442, 5, },
+ { 352, 443, 5, },
+ { 353, 444, 5, },
+ { 354, 445, 5, },
+ { 355, 446, 5, },
+ { 356, 447, 5, },
+ { 357, 448, 5, },
+ { 358, 449, 5, },
+ { 359, 420, 5, },
+ { 360, 390, 5, },
+ { 360, 447, 5, },
+ { 360, 480, 5, },
+ { 361, 391, 5, },
+ { 361, 448, 5, },
+ { 361, 481, 5, },
+ { 362, 392, 5, },
+ { 362, 449, 5, },
+ { 362, 482, 5, },
+ { 363, 393, 5, },
+ { 363, 420, 5, },
+ { 363, 483, 5, },
+ { 364, 394, 5, },
+ { 364, 421, 5, },
+ { 364, 484, 5, },
+ { 365, 395, 5, },
+ { 365, 422, 5, },
+ { 365, 485, 5, },
+ { 366, 396, 5, },
+ { 366, 423, 5, },
+ { 366, 486, 5, },
+ { 367, 397, 5, },
+ { 367, 424, 5, },
+ { 367, 487, 5, },
+ { 368, 398, 5, },
+ { 368, 425, 5, },
+ { 368, 488, 5, },
+ { 369, 399, 5, },
+ { 369, 426, 5, },
+ { 369, 489, 5, },
+ { 370, 400, 6, },
+ { 370, 427, 6, },
+ { 370, 490, 6, },
+ { 371, 401, 6, },
+ { 371, 428, 6, },
+ { 371, 491, 6, },
+ { 372, 402, 6, },
+ { 372, 429, 6, },
+ { 372, 492, 6, },
+ { 373, 403, 6, },
+ { 373, 430, 6, },
+ { 373, 493, 6, },
+ { 374, 404, 6, },
+ { 374, 431, 6, },
+ { 374, 494, 6, },
+ { 375, 405, 6, },
+ { 375, 432, 6, },
+ { 375, 495, 6, },
+ { 376, 406, 6, },
+ { 376, 433, 6, },
+ { 376, 496, 6, },
+ { 377, 407, 6, },
+ { 377, 434, 6, },
+ { 377, 497, 6, },
+ { 378, 408, 6, },
+ { 378, 435, 6, },
+ { 378, 498, 6, },
+ { 379, 409, 6, },
+ { 379, 436, 6, },
+ { 379, 499, 6, },
+ { 380, 410, 6, },
+ { 380, 437, 6, },
+ { 380, 500, 6, },
+ { 381, 411, 6, },
+ { 381, 438, 6, },
+ { 381, 501, 6, },
+ { 382, 412, 6, },
+ { 382, 439, 6, },
+ { 382, 502, 6, },
+ { 383, 413, 6, },
+ { 383, 440, 6, },
+ { 383, 503, 6, },
+ { 384, 414, 6, },
+ { 384, 441, 6, },
+ { 384, 504, 6, },
+ { 385, 415, 6, },
+ { 385, 442, 6, },
+ { 385, 505, 6, },
+ { 386, 416, 6, },
+ { 386, 443, 6, },
+ { 386, 506, 6, },
+ { 387, 417, 6, },
+ { 387, 444, 6, },
+ { 387, 507, 6, },
+ { 388, 418, 6, },
+ { 388, 445, 6, },
+ { 388, 508, 6, },
+ { 389, 419, 6, },
+ { 389, 446, 6, },
+ { 389, 509, 6, },
+ { 390, 453, 6, },
+ { 390, 510, 6, },
+ { 391, 454, 6, },
+ { 391, 511, 6, },
+ { 392, 455, 6, },
+ { 392, 512, 6, },
+ { 393, 456, 6, },
+ { 393, 513, 6, },
+ { 394, 457, 6, },
+ { 394, 514, 6, },
+ { 395, 458, 6, },
+ { 395, 515, 6, },
+ { 396, 459, 6, },
+ { 396, 516, 6, },
+ { 397, 460, 6, },
+ { 397, 517, 6, },
+ { 398, 461, 6, },
+ { 398, 518, 6, },
+ { 399, 462, 6, },
+ { 399, 519, 6, },
+ { 400, 463, 6, },
+ { 400, 520, 6, },
+ { 401, 464, 6, },
+ { 401, 521, 6, },
+ { 402, 465, 6, },
+ { 402, 522, 6, },
+ { 403, 466, 6, },
+ { 403, 523, 6, },
+ { 404, 467, 6, },
+ { 404, 524, 6, },
+ { 405, 468, 6, },
+ { 405, 525, 6, },
+ { 406, 469, 6, },
+ { 406, 526, 6, },
+ { 407, 470, 6, },
+ { 407, 527, 6, },
+ { 408, 471, 6, },
+ { 408, 528, 6, },
+ { 409, 472, 6, },
+ { 409, 529, 6, },
+ { 410, 473, 6, },
+ { 410, 530, 6, },
+ { 411, 474, 6, },
+ { 411, 531, 6, },
+ { 412, 475, 6, },
+ { 412, 532, 6, },
+ { 413, 476, 6, },
+ { 413, 533, 6, },
+ { 414, 477, 6, },
+ { 414, 534, 6, },
+ { 415, 478, 6, },
+ { 415, 535, 6, },
+ { 416, 479, 6, },
+ { 416, 536, 6, },
+ { 417, 450, 6, },
+ { 417, 537, 6, },
+ { 418, 451, 6, },
+ { 418, 538, 6, },
+ { 419, 452, 6, },
+ { 419, 539, 6, },
+ { 420, 480, 6, },
+ { 421, 481, 6, },
+ { 422, 482, 6, },
+ { 423, 483, 6, },
+ { 424, 484, 6, },
+ { 425, 485, 6, },
+ { 426, 486, 6, },
+ { 427, 487, 6, },
+ { 428, 488, 6, },
+ { 429, 489, 6, },
+ { 430, 490, 6, },
+ { 431, 491, 6, },
+ { 432, 492, 6, },
+ { 433, 493, 6, },
+ { 434, 494, 6, },
+ { 435, 495, 6, },
+ { 436, 496, 6, },
+ { 437, 497, 6, },
+ { 438, 498, 6, },
+ { 439, 499, 6, },
+ { 440, 500, 6, },
+ { 441, 501, 6, },
+ { 442, 502, 6, },
+ { 443, 503, 6, },
+ { 444, 504, 6, },
+ { 445, 505, 6, },
+ { 446, 506, 6, },
+ { 447, 507, 6, },
+ { 448, 508, 6, },
+ { 449, 509, 6, },
+ { 450, 510, 7, },
+ { 451, 511, 7, },
+ { 452, 512, 7, },
+ { 453, 513, 7, },
+ { 454, 514, 7, },
+ { 455, 515, 7, },
+ { 456, 516, 7, },
+ { 457, 517, 7, },
+ { 458, 518, 7, },
+ { 459, 519, 7, },
+ { 460, 520, 7, },
+ { 461, 521, 7, },
+ { 462, 522, 7, },
+ { 463, 523, 7, },
+ { 464, 524, 7, },
+ { 465, 525, 7, },
+ { 466, 526, 7, },
+ { 467, 527, 7, },
+ { 468, 528, 7, },
+ { 469, 529, 7, },
+ { 470, 530, 7, },
+ { 471, 531, 7, },
+ { 472, 532, 7, },
+ { 473, 533, 7, },
+ { 474, 534, 7, },
+ { 475, 535, 7, },
+ { 476, 536, 7, },
+ { 477, 537, 7, },
+ { 478, 538, 7, },
+ { 479, 539, 7, },
+ { 480, 513, 7, },
+ { 480, 597, 7, },
+ { 481, 514, 7, },
+ { 481, 598, 7, },
+ { 482, 515, 7, },
+ { 482, 599, 7, },
+ { 483, 516, 7, },
+ { 483, 570, 7, },
+ { 484, 517, 7, },
+ { 484, 571, 7, },
+ { 485, 518, 7, },
+ { 485, 572, 7, },
+ { 486, 519, 7, },
+ { 486, 573, 7, },
+ { 487, 520, 7, },
+ { 487, 574, 7, },
+ { 488, 521, 7, },
+ { 488, 575, 7, },
+ { 489, 522, 7, },
+ { 489, 576, 7, },
+ { 490, 523, 7, },
+ { 490, 577, 7, },
+ { 491, 524, 7, },
+ { 491, 578, 7, },
+ { 492, 525, 7, },
+ { 492, 579, 7, },
+ { 493, 526, 7, },
+ { 493, 580, 7, },
+ { 494, 527, 7, },
+ { 494, 581, 7, },
+ { 495, 528, 7, },
+ { 495, 582, 7, },
+ { 496, 529, 7, },
+ { 496, 583, 7, },
+ { 497, 530, 7, },
+ { 497, 584, 7, },
+ { 498, 531, 7, },
+ { 498, 585, 7, },
+ { 499, 532, 7, },
+ { 499, 586, 7, },
+ { 500, 533, 7, },
+ { 500, 587, 7, },
+ { 501, 534, 7, },
+ { 501, 588, 7, },
+ { 502, 535, 7, },
+ { 502, 589, 7, },
+ { 503, 536, 7, },
+ { 503, 590, 7, },
+ { 504, 537, 7, },
+ { 504, 591, 7, },
+ { 505, 538, 7, },
+ { 505, 592, 7, },
+ { 506, 539, 7, },
+ { 506, 593, 7, },
+ { 507, 510, 7, },
+ { 507, 594, 7, },
+ { 508, 511, 7, },
+ { 508, 595, 7, },
+ { 509, 512, 7, },
+ { 509, 596, 7, },
+ { 510, 542, 7, },
+ { 511, 543, 7, },
+ { 512, 544, 7, },
+ { 513, 545, 7, },
+ { 514, 546, 7, },
+ { 515, 547, 7, },
+ { 516, 548, 7, },
+ { 517, 549, 7, },
+ { 518, 550, 7, },
+ { 519, 551, 7, },
+ { 520, 552, 7, },
+ { 521, 553, 7, },
+ { 522, 554, 7, },
+ { 523, 555, 7, },
+ { 524, 556, 7, },
+ { 525, 557, 7, },
+ { 526, 558, 7, },
+ { 527, 559, 7, },
+ { 528, 560, 7, },
+ { 529, 561, 7, },
+ { 530, 562, 7, },
+ { 531, 563, 7, },
+ { 532, 564, 7, },
+ { 533, 565, 7, },
+ { 534, 566, 7, },
+ { 535, 567, 7, },
+ { 536, 568, 7, },
+ { 537, 569, 7, },
+ { 538, 540, 7, },
+ { 539, 541, 7, },
+ { 540, 570, 7, },
+ { 541, 571, 7, },
+ { 542, 572, 7, },
+ { 543, 573, 7, },
+ { 544, 574, 7, },
+ { 545, 575, 7, },
+ { 546, 576, 7, },
+ { 547, 577, 7, },
+ { 548, 578, 7, },
+ { 549, 579, 7, },
+ { 550, 580, 7, },
+ { 551, 581, 7, },
+ { 552, 582, 7, },
+ { 553, 583, 7, },
+ { 554, 584, 7, },
+ { 555, 585, 7, },
+ { 556, 586, 7, },
+ { 557, 587, 7, },
+ { 558, 588, 7, },
+ { 559, 589, 7, },
+ { 560, 590, 7, },
+ { 561, 591, 7, },
+ { 562, 592, 7, },
+ { 563, 593, 7, },
+ { 564, 594, 7, },
+ { 565, 595, 7, },
+ { 566, 596, 7, },
+ { 567, 597, 7, },
+ { 568, 598, 7, },
+ { 569, 599, 7, },
+};
+
+
+static const char *hyperball_defaults[] =
+{
+ "*observer-z: 3",
+ "*delay: 20000",
+ "*xy: 3",
+ "*xz: 5",
+ "*yw: 10",
+ "*yz: 0",
+ "*xw: 0",
+ "*zw: 0",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*color00:#FF66BE",
+ "*color10:#FFA300",
+ "*color20:#BEDC00",
+ "*color30:#12FB00",
+ "*color40:#00F9BE",
+ "*color50:#12D5FF",
+ "*color60:#BE9AFF",
+ "*color70:#FF5FFF",
+ "*color01:#FF5BAA",
+ "*color11:#F09200",
+ "*color21:#AAC500",
+ "*color31:#10E100",
+ "*color41:#00DFAA",
+ "*color51:#10BFFF",
+ "*color61:#AA8AFF",
+ "*color71:#F055FF",
+ "*color02:#EE529A",
+ "*color12:#D98400",
+ "*color22:#9AB200",
+ "*color32:#0ECB00",
+ "*color42:#00C99A",
+ "*color52:#0EADE7",
+ "*color62:#9A7DFF",
+ "*color72:#D94DE7",
+ "*color03:#DA4B8C",
+ "*color13:#C67900",
+ "*color23:#8CA300",
+ "*color33:#0DBA00",
+ "*color43:#00B88C",
+ "*color53:#0D9ED3",
+ "*color63:#8C72EA",
+ "*color73:#C646D3",
+ "*color04:#C84581",
+ "*color14:#B66F00",
+ "*color24:#819600",
+ "*color34:#0CAB00",
+ "*color44:#00A981",
+ "*color54:#0C91C2",
+ "*color64:#8169D7",
+ "*color74:#B641C2",
+ "*color05:#B94078",
+ "*color15:#A96700",
+ "*color25:#788B00",
+ "*color35:#0B9E00",
+ "*color45:#009D78",
+ "*color55:#0B86B3",
+ "*color65:#7861C7",
+ "*color75:#A93CB3",
+ "*color06:#AC3C6F",
+ "*color16:#9D6000",
+ "*color26:#6F8100",
+ "*color36:#0A9300",
+ "*color46:#00926F",
+ "*color56:#0A7DA7",
+ "*color66:#6F5AB9",
+ "*color76:#9D38A7",
+ "*color07:#A13868",
+ "*color17:#935900",
+ "*color27:#687900",
+ "*color37:#0A8A00",
+ "*color47:#008868",
+ "*color57:#0A759C",
+ "*color67:#6854AD",
+ "*color77:#93349C",
+ 0,
+};
+
+static XrmOptionDescRec hyperball_options [] =
+{
+ { "-observer-z", ".observer-z", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-xw", ".xw", XrmoptionSepArg, 0 },
+ { "-xy", ".xy", XrmoptionSepArg, 0 },
+ { "-xz", ".xz", XrmoptionSepArg, 0 },
+ { "-yw", ".yw", XrmoptionSepArg, 0 },
+ { "-yz", ".yz", XrmoptionSepArg, 0 },
+ { "-zw", ".zw", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 },
+};
+
+XSCREENSAVER_MODULE ("HyperBall", hyperball)
diff --git a/hacks/hyperball.man b/hacks/hyperball.man
new file mode 100644
index 0000000..241ff68
--- /dev/null
+++ b/hacks/hyperball.man
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hyperball - 2d projection of a 4d object
+.SH SYNOPSIS
+.B hyperball
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-xy \fIfloat\fP]
+[\-xz \fIfloat\fP]
+[\-yz \fIfloat\fP]
+[\-xw \fIfloat\fP]
+[\-yw \fIfloat\fP]
+[\-zw \fIfloat\fP]
+[\-delay \fIusecs\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIhyperball\fP program displays a wireframe projection of a hyperball
+which is rotating at user-specified rates around any or all of its four axes.
+.SH OPTIONS
+.I hyperball
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 20000, or about 0.02 seconds.
+.TP 8
+.B \-xw \fIfloat\fP
+.TP 8
+.B \-xy \fIfloat\fP
+.TP 8
+.B \-xz \fIfloat\fP
+.TP 8
+.B \-yw \fIfloat\fP
+.TP 8
+.B \-yz \fIfloat\fP
+.TP 8
+.B \-zw \fIfloat\fP
+The amount that the ball should be rotated around the specified axis at
+each frame of the animation, expressed in 0.001 radians. These should be small
+floating-point values (less than 50 works best.) Default: xy=3,
+xz=5, yw=10.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2000 by Joe Keane. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Joe Keane <jgk@jgk.org>
diff --git a/hacks/hypercube.c b/hacks/hypercube.c
new file mode 100644
index 0000000..0055696
--- /dev/null
+++ b/hacks/hypercube.c
@@ -0,0 +1,569 @@
+/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This code derived from TI Explorer Lisp code by Joe Keane, Fritz Mueller,
+ * and Jamie Zawinski.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#define POINT_COUNT 16
+#define LINE_COUNT 32
+
+#define ANGLE_SCALE 0.001
+
+struct line_info
+{
+ char li_ip;
+ char li_iq;
+ char li_color;
+ char li_pad;
+};
+
+struct point_state
+{
+ short old_x, old_y;
+ short new_x, new_y;
+};
+
+struct hyper_state
+{
+ char hs_stop;
+ char hs_icon;
+ char hs_resize;
+ char hs_redraw;
+ Display *hs_display;
+ Window hs_window;
+ float hs_two_observer_z;
+ float hs_offset_x;
+ float hs_offset_y;
+ float hs_unit_scale;
+ int hs_delay;
+ GC hs_color_gcs[8];
+ GC black_gc;
+#if 0
+ double hs_angle_xy;
+ double hs_angle_xz;
+ double hs_angle_yz;
+ double hs_angle_xw;
+ double hs_angle_yw;
+ double hs_angle_zw;
+#endif
+ double hs_cos_xy, hs_sin_xy;
+ double hs_cos_xz, hs_sin_xz;
+ double hs_cos_yz, hs_sin_yz;
+ double hs_cos_xw, hs_sin_xw;
+ double hs_cos_yw, hs_sin_yw;
+ double hs_cos_zw, hs_sin_zw;
+ double hs_ref_ax, hs_ref_ay, hs_ref_az, hs_ref_aw;
+ double hs_ref_bx, hs_ref_by, hs_ref_bz, hs_ref_bw;
+ double hs_ref_cx, hs_ref_cy, hs_ref_cz, hs_ref_cw;
+ double hs_ref_dx, hs_ref_dy, hs_ref_dz, hs_ref_dw;
+ struct point_state hs_points[POINT_COUNT];
+ int roted;
+};
+
+static const struct line_info line_table[LINE_COUNT];
+
+static const char *hypercube_defaults[] =
+{
+ "*observer-z: 3.0",
+ "*delay: 10000",
+ "*xy: 3",
+ "*xz: 5",
+ "*yw: 10",
+ "*yz: 0",
+ "*xw: 0",
+ "*zw: 0",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*color0: magenta",
+ "*color3: #FF0093",
+ "*color1: yellow",
+ "*color2: #FF9300",
+ "*color4: green",
+ "*color7: #00FFD0",
+ "*color5: #8080FF",
+ "*color6: #00D0FF",
+
+ 0
+};
+
+static XrmOptionDescRec hypercube_options [] =
+{
+ { "-color0", ".color0", XrmoptionSepArg, 0 },
+ { "-color1", ".color1", XrmoptionSepArg, 0 },
+ { "-color2", ".color2", XrmoptionSepArg, 0 },
+ { "-color3", ".color3", XrmoptionSepArg, 0 },
+ { "-color4", ".color4", XrmoptionSepArg, 0 },
+ { "-color5", ".color5", XrmoptionSepArg, 0 },
+ { "-color6", ".color6", XrmoptionSepArg, 0 },
+ { "-color7", ".color7", XrmoptionSepArg, 0 },
+
+ { "-xw", ".xw", XrmoptionSepArg, 0 },
+ { "-xy", ".xy", XrmoptionSepArg, 0 },
+ { "-xz", ".xz", XrmoptionSepArg, 0 },
+ { "-yw", ".yw", XrmoptionSepArg, 0 },
+ { "-yz", ".yz", XrmoptionSepArg, 0 },
+ { "-zw", ".zw", XrmoptionSepArg, 0 },
+
+ { "-observer-z", ".observer-z", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+static void set_sizes (struct hyper_state *hs, int width, int height);
+
+static void *
+hypercube_init (Display *dpy, Window win)
+{
+ XGCValues gcv;
+ Colormap cmap;
+ unsigned long bg_pixel;
+ int delay;
+ float observer_z;
+
+ struct hyper_state *hs = (struct hyper_state *) calloc (1, sizeof(*hs));
+ hs->hs_display = dpy;
+ hs->hs_window = win;
+
+ observer_z = get_float_resource (dpy, "observer-z", "Float");
+ if (observer_z < 1.125)
+ observer_z = 1.125;
+ /* hs->hs_observer_z = observer_z; */
+ hs->hs_two_observer_z = 2.0 * observer_z;
+
+ {
+ XWindowAttributes wa;
+ XGetWindowAttributes (dpy, win, &wa);
+ cmap = wa.colormap;
+ set_sizes (hs, wa.width, wa.height);
+ }
+
+ delay = get_integer_resource (dpy, "delay", "Integer");
+ hs->hs_delay = delay;
+
+ bg_pixel = get_pixel_resource (dpy, cmap, "background", "Background");
+
+ if (mono_p)
+ {
+ GC black_gc;
+ unsigned long fg_pixel;
+ GC white_gc;
+
+ gcv.function = GXcopy;
+ gcv.foreground = bg_pixel;
+ black_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+ fg_pixel = get_pixel_resource (dpy, cmap, "foreground", "Foreground");
+ gcv.foreground = fg_pixel ^ bg_pixel;
+ white_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+ hs->hs_color_gcs[0] = black_gc;
+ hs->hs_color_gcs[1] = white_gc;
+ }
+ else
+ {
+ int col;
+
+ gcv.function = GXcopy;
+
+ gcv.foreground = get_pixel_resource (dpy, cmap,
+ "background", "Background");
+ hs->black_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+
+ for (col = 0; col < 8; col++)
+ {
+ char buffer[16];
+ unsigned long fg_pixel;
+ GC color_gc;
+
+ sprintf (buffer, "color%d", col);
+ fg_pixel = get_pixel_resource (dpy, cmap, buffer, "Foreground");
+ gcv.foreground = fg_pixel;
+ color_gc = XCreateGC (dpy, win, GCForeground|GCFunction, &gcv);
+ hs->hs_color_gcs[col] = color_gc;
+ }
+ }
+
+ hs->hs_ref_ax = 1.0, hs->hs_ref_ay = 0.0, hs->hs_ref_az = 0.0, hs->hs_ref_aw = 0.0;
+ hs->hs_ref_bx = 0.0, hs->hs_ref_by = 1.0, hs->hs_ref_bz = 0.0, hs->hs_ref_bw = 0.0;
+ hs->hs_ref_cx = 0.0, hs->hs_ref_cy = 0.0, hs->hs_ref_cz = 1.0, hs->hs_ref_cw = 0.0;
+ hs->hs_ref_dx = 0.0, hs->hs_ref_dy = 0.0, hs->hs_ref_dz = 0.0, hs->hs_ref_dw = 1.0;
+
+ {
+ double xy;
+ double xz;
+ double yz;
+ double xw;
+ double yw;
+ double zw;
+ double cos_xy, sin_xy;
+ double cos_xz, sin_xz;
+ double cos_yz, sin_yz;
+ double cos_xw, sin_xw;
+ double cos_yw, sin_yw;
+ double cos_zw, sin_zw;
+
+ xy = get_float_resource (dpy, "xy", "Float") * ANGLE_SCALE;
+ xz = get_float_resource (dpy, "xz", "Float") * ANGLE_SCALE;
+ yz = get_float_resource (dpy, "yz", "Float") * ANGLE_SCALE;
+ xw = get_float_resource (dpy, "xw", "Float") * ANGLE_SCALE;
+ yw = get_float_resource (dpy, "yw", "Float") * ANGLE_SCALE;
+ zw = get_float_resource (dpy, "zw", "Float") * ANGLE_SCALE;
+
+ cos_xy = cos (xy), sin_xy = sin (xy);
+ hs->hs_cos_xy = cos_xy, hs->hs_sin_xy = sin_xy;
+ cos_xz = cos (xz), sin_xz = sin (xz);
+ hs->hs_cos_xz = cos_xz, hs->hs_sin_xz = sin_xz;
+ cos_yz = cos (yz), sin_yz = sin (yz);
+ hs->hs_cos_yz = cos_yz, hs->hs_sin_yz = sin_yz;
+ cos_xw = cos (xw), sin_xw = sin (xw);
+ hs->hs_cos_xw = cos_xw, hs->hs_sin_xw = sin_xw;
+ cos_yw = cos (yw), sin_yw = sin (yw);
+ hs->hs_cos_yw = cos_yw, hs->hs_sin_yw = sin_yw;
+ cos_zw = cos (zw), sin_zw = sin (zw);
+ hs->hs_cos_zw = cos_zw, hs->hs_sin_zw = sin_zw;
+ }
+
+ return hs;
+}
+
+
+static unsigned long
+hypercube_draw (Display *dpy, Window window, void *closure)
+{
+ struct hyper_state *hs = (struct hyper_state *) closure;
+ int this_delay = hs->hs_delay;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (dpy, window);
+#endif
+
+ {
+ int icon;
+ int resize;
+ char moved[POINT_COUNT];
+ int redraw;
+ int stop;
+
+ icon = hs->hs_icon;
+ resize = hs->hs_resize;
+ if (icon || !(hs->roted | resize))
+ goto skip1;
+
+ {
+ float observer_z;
+ float unit_scale;
+ float offset_x;
+ float offset_y;
+ double az, bz, cz, dz;
+ double sum_z;
+ double ax, bx, cx, dx;
+ double sum_x;
+ double ay, by, cy, dy;
+ double sum_y;
+ struct point_state *ps;
+ int old_x;
+ int old_y;
+ double mul;
+ double xf;
+ double yf;
+ int new_x;
+ int new_y;
+ int mov;
+
+
+#define compute(as,bs,cs,ds,i) \
+ az = hs->hs_ref_az; bz = hs->hs_ref_bz; cz = hs->hs_ref_cz; dz = hs->hs_ref_dz; \
+ ax = hs->hs_ref_ax; bx = hs->hs_ref_bx; cx = hs->hs_ref_cx; dx = hs->hs_ref_dx; \
+ ay = hs->hs_ref_ay; by = hs->hs_ref_by; cy = hs->hs_ref_cy; dy = hs->hs_ref_dy; \
+ sum_z = as az bs bz cs cz ds dz; \
+ observer_z = hs->hs_two_observer_z; \
+ unit_scale = hs->hs_unit_scale; \
+ sum_x = as ax bs bx cs cx ds dx; \
+ sum_y = as ay bs by cs cy ds dy; \
+ ps = &hs->hs_points[i]; \
+ mul = unit_scale / (observer_z - sum_z); \
+ offset_x = hs->hs_offset_x; \
+ offset_y = hs->hs_offset_y; \
+ old_x = ps->new_x; \
+ old_y = ps->new_y; \
+ xf = sum_x * mul + offset_x; \
+ yf = sum_y * mul + offset_y; \
+ new_x = (int)rint(xf); \
+ new_y = (int)rint(yf); \
+ ps->old_x = old_x; \
+ ps->old_y = old_y; \
+ ps->new_x = new_x; \
+ ps->new_y = new_y; \
+ mov = old_x != new_x || old_y != new_y; \
+ moved[i] = mov;
+
+ compute (-, -, -, -, 0);
+ compute (-, -, -, +, 1);
+ compute (-, -, +, -, 2);
+ compute (-, -, +, +, 3);
+ compute (-, +, -, -, 4);
+ compute (-, +, -, +, 5);
+ compute (-, +, +, -, 6);
+ compute (-, +, +, +, 7);
+ compute (+, -, -, -, 8);
+ compute (+, -, -, +, 9);
+ compute (+, -, +, -, 10);
+ compute (+, -, +, +, 11);
+ compute (+, +, -, -, 12);
+ compute (+, +, -, +, 13);
+ compute (+, +, +, -, 14);
+ compute (+, +, +, +, 15);
+ }
+
+ skip1:
+ icon = hs->hs_icon;
+ redraw = hs->hs_redraw;
+ if (icon || !(hs->roted | redraw))
+ goto skip2;
+
+ {
+ int lc;
+ const struct line_info *lip;
+ int mono;
+ Window win;
+
+ lc = LINE_COUNT;
+ lip = &line_table[0];
+ mono = mono_p;
+ win = hs->hs_window;
+
+ while (--lc >= 0)
+ {
+ int ip;
+ int iq;
+ int col;
+ struct point_state *sp;
+ struct point_state *sq;
+ int mov_p;
+ int mov_q;
+ GC erase_gc;
+ GC draw_gc;
+ int p_x;
+ int p_y;
+ int q_x;
+ int q_y;
+
+ ip = lip->li_ip;
+ iq = lip->li_iq;
+ col = lip->li_color;
+ lip++;
+ mov_p = moved[ip];
+ mov_q = moved[iq];
+ if (!(redraw | mov_p | mov_q))
+ continue;
+
+ sp = &hs->hs_points[ip];
+ sq = &hs->hs_points[iq];
+
+ if (mono)
+ {
+ erase_gc = hs->hs_color_gcs[0];
+ draw_gc = hs->hs_color_gcs[1];
+ }
+ else
+ {
+ erase_gc = hs->black_gc;
+ draw_gc = hs->hs_color_gcs[col];
+ }
+
+ if (!redraw)
+ {
+ p_x = sp->old_x;
+ p_y = sp->old_y;
+ q_x = sq->old_x;
+ q_y = sq->old_y;
+ XDrawLine (dpy, win, erase_gc, p_x, p_y, q_x, q_y);
+ }
+
+ p_x = sp->new_x;
+ p_y = sp->new_y;
+ q_x = sq->new_x;
+ q_y = sq->new_y;
+ XDrawLine (dpy, win, draw_gc, p_x, p_y, q_x, q_y);
+ }
+ }
+
+ skip2:
+ stop = hs->hs_stop;
+ hs->roted = 0;
+ if (stop)
+ goto skip3;
+
+ hs->roted = 1;
+
+ {
+ double cos_a;
+ double sin_a;
+ double old_u;
+ double old_v;
+ double new_u;
+ double new_v;
+
+ /* If you get error messages about the following forms, and you think you're
+ using an ANSI C conforming compiler, then you're mistaken. Possibly you're
+ mixing an ANSI compiler with a non-ANSI preprocessor, or vice versa.
+ Regardless, your system is broken; it's not a bug in this program.
+ */
+#if defined(__STDC__) || defined(__ANSI_CPP__)
+
+#define rotate(name,dim0,dim1) \
+ old_u = hs->hs_ref_##name##dim0; \
+ old_v = hs->hs_ref_##name##dim1; \
+ new_u = old_u * cos_a + old_v * sin_a; \
+ new_v = old_v * cos_a - old_u * sin_a; \
+ hs->hs_ref_##name##dim0 = new_u; \
+ hs->hs_ref_##name##dim1 = new_v;
+
+#define rotates(dim0,dim1) \
+ if (hs->hs_sin_##dim0##dim1 != 0) { \
+ cos_a = hs->hs_cos_##dim0##dim1; \
+ sin_a = hs->hs_sin_##dim0##dim1; \
+ rotate(a,dim0,dim1); \
+ rotate(b,dim0,dim1); \
+ rotate(c,dim0,dim1); \
+ rotate(d,dim0,dim1); \
+ }
+
+#else /* !__STDC__, courtesy of Andreas Luik <luik@isa.de> */
+
+#define rotate(name,dim0,dim1) \
+ old_u = hs->hs_ref_/**/name/**/dim0; \
+ old_v = hs->hs_ref_/**/name/**/dim1; \
+ new_u = old_u * cos_a + old_v * sin_a; \
+ new_v = old_v * cos_a - old_u * sin_a; \
+ hs->hs_ref_/**/name/**/dim0 = new_u; \
+ hs->hs_ref_/**/name/**/dim1 = new_v;
+
+#define rotates(dim0,dim1) \
+ if (hs->hs_sin_/**/dim0/**/dim1 != 0) { \
+ cos_a = hs->hs_cos_/**/dim0/**/dim1; \
+ sin_a = hs->hs_sin_/**/dim0/**/dim1; \
+ rotate(a,dim0,dim1); \
+ rotate(b,dim0,dim1); \
+ rotate(c,dim0,dim1); \
+ rotate(d,dim0,dim1); \
+ }
+
+#endif /* !__STDC__ */
+
+ rotates (x,y);
+ rotates (x,z);
+ rotates (y,z);
+ rotates (x,w);
+ rotates (y,w);
+ rotates (z,w);
+ }
+
+ skip3:
+ /* stop = hs->hs_stop; */
+ if (stop && this_delay < 10000)
+ this_delay = 10000;
+ }
+ return this_delay;
+}
+
+
+static Bool
+hypercube_event (Display *dpy, Window window, void *closure, XEvent *e)
+{
+ struct hyper_state *hs = (struct hyper_state *) closure;
+ if (e->type == ButtonPress && e->xbutton.button == 2)
+ {
+ hs->hs_stop = !hs->hs_stop;
+ return True;
+ }
+ return False;
+}
+
+static void
+hypercube_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct hyper_state *hs = (struct hyper_state *) closure;
+ set_sizes (hs, w, h);
+ XClearWindow (dpy, window);
+}
+
+
+static void
+set_sizes (struct hyper_state *hs, int width, int height)
+{
+ double observer_z;
+ int min_dim;
+ double var;
+ double offset_x;
+ double offset_y;
+ double unit_scale;
+
+ observer_z = 0.5 * hs->hs_two_observer_z;
+ min_dim = width < height ? width : height;
+ var = sqrt(observer_z * observer_z - 1.0);
+ offset_x = 0.5 * (double)(width - 1);
+ offset_y = 0.5 * (double)(height - 1);
+ unit_scale = 0.4 * min_dim * var;
+ hs->hs_offset_x = (float)offset_x;
+ hs->hs_offset_y = (float)offset_y;
+ hs->hs_unit_scale = (float)unit_scale;
+}
+
+
+/* data */
+
+static const struct line_info line_table[LINE_COUNT] =
+{
+ { 0, 1, 0, },
+ { 0, 2, 0, },
+ { 1, 3, 0, },
+ { 2, 3, 0, },
+ { 4, 5, 1, },
+ { 4, 6, 1, },
+ { 5, 7, 1, },
+ { 6, 7, 1, },
+ { 0, 4, 4, },
+ { 0, 8, 4, },
+ { 4, 12, 4, },
+ { 8, 12, 4, },
+ { 1, 5, 5, },
+ { 1, 9, 5, },
+ { 5, 13, 5, },
+ { 9, 13, 5, },
+ { 2, 6, 6, },
+ { 2, 10, 6, },
+ { 6, 14, 6, },
+ { 10, 14, 6, },
+ { 3, 7, 7, },
+ { 3, 11, 7, },
+ { 7, 15, 7, },
+ { 11, 15, 7, },
+ { 8, 9, 2, },
+ { 8, 10, 2, },
+ { 9, 11, 2, },
+ { 10, 11, 2, },
+ { 12, 13, 3, },
+ { 12, 14, 3, },
+ { 13, 15, 3, },
+ { 14, 15, 3, },
+};
+
+static void
+hypercube_free (Display *dpy, Window window, void *closure)
+{
+}
+
+XSCREENSAVER_MODULE ("HyperCube", hypercube)
diff --git a/hacks/hypercube.man b/hacks/hypercube.man
new file mode 100644
index 0000000..2594370
--- /dev/null
+++ b/hacks/hypercube.man
@@ -0,0 +1,97 @@
+.TH XScreenSaver 1 "6-dec-92" "X Version 11"
+.SH NAME
+hypercube - 2d projection of a 4d object
+.SH SYNOPSIS
+.B hypercube
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-color[0-7] \fIcolor\fP] [\-xy \fIfloat\fP] [\-xz \fIfloat\fP] [\-yz \fIfloat\fP] [\-xw \fIfloat\fP] [\-yw \fIfloat\fP] [\-zw \fIfloat\fP] [\-observer-z \fIint\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIhypercube\fP program displays a wireframe projection of a hypercube
+which is rotating at user-specified rates around any or all of its four axes.
+.SH OPTIONS
+.I hypercube
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 100000, or about 1/10th second.
+.TP 8
+.B \-observer-z \fIint\fP
+How far away the observer is from the center of the cube (the cube is one
+unit per side.) Default 5.
+.TP 8
+.B \-color0 \fIcolor\fP
+.TP 8
+.B \-color1 \fIcolor\fP
+.TP 8
+.B \-color2 \fIcolor\fP
+.TP 8
+.B \-color3 \fIcolor\fP
+.TP 8
+.B \-color4 \fIcolor\fP
+.TP 8
+.B \-color5 \fIcolor\fP
+.TP 8
+.B \-color6 \fIcolor\fP
+.TP 8
+.B \-color7 \fIcolor\fP
+The colors used to draw the line segments bordering the eight faces of
+the cube. Some of the faces have only two of their border-lines drawn in
+the specified color, and some have all four.
+.TP 8
+.B \-xw \fIfloat\fP
+.TP 8
+.B \-xy \fIfloat\fP
+.TP 8
+.B \-xz \fIfloat\fP
+.TP 8
+.B \-yw \fIfloat\fP
+.TP 8
+.B \-yz \fIfloat\fP
+.TP 8
+.B \-zw \fIfloat\fP
+The amount that the cube should be rotated around the specified axis at
+each frame of the animation, expressed in 0.001 radians. These should be small
+floating-point values (less than 50 works best.) Default: xy=3,
+xz=5, yw=10.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 6-dec-92.
diff --git a/hacks/ifs.c b/hacks/ifs.c
new file mode 100644
index 0000000..ad8af95
--- /dev/null
+++ b/hacks/ifs.c
@@ -0,0 +1,551 @@
+/* Copyright © Chris Le Sueur and Robby Griffin, 2005-2006
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Ultimate thanks go to Massimino Pascal, who created the original
+xscreensaver hack, and inspired me with it's swirly goodness. This
+version adds things like variable quality, number of functions and also
+a groovier colouring mode.
+
+This version by Chris Le Sueur <thefishface@gmail.com>, Feb 2005
+Many improvements by Robby Griffin <rmg@terc.edu>, Mar 2006
+Multi-coloured mode added by Jack Grahl <j.grahl@ucl.ac.uk>, Jan 2007
+*/
+
+#include <assert.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "screenhack.h"
+
+#undef countof
+#define countof(x) (sizeof((x)) / sizeof(*(x)))
+
+typedef struct {
+ float r, s, tx, ty; /* Rotation, Scale, Translation X & Y */
+ float ro, rt, rc; /* Old Rotation, Rotation Target, Rotation Counter */
+ float so, st, sc; /* Old Scale, Scale Target, Scale Counter */
+ float sa, txa, tya; /* Scale change, Translation change */
+
+ int ua, ub, utx; /* Precomputed combined r,s,t values */
+ int uc, ud, uty; /* Precomputed combined r,s,t values */
+
+} Lens;
+
+struct state {
+ Display *dpy;
+ Window window;
+ GC gc;
+ Drawable backbuffer;
+ XColor *colours;
+ int ncolours;
+ int ccolour;
+ int blackColor, whiteColor;
+
+ int width, widthb, height;
+ int width8, height8;
+ unsigned int *board;
+ XPoint pointbuf[1000];
+ int npoints;
+ int xmin, xmax, ymin, ymax;
+ int x, y;
+
+ int delay;
+
+ int lensnum;
+ Lens *lenses;
+ int length;
+ int mode;
+ Bool recurse;
+ Bool multi;
+ Bool translate, scale, rotate;
+};
+
+#define getdot(x,y) (st->board[((y)*st->widthb)+((x)>>5)] & (1<<((x) & 31)))
+#define setdot(x,y) (st->board[((y)*st->widthb)+((x)>>5)] |= (1<<((x) & 31)))
+
+static float
+myrandom(float up)
+{
+ return (((float)random() / RAND_MAX) * up);
+}
+
+static const char *ifs_defaults [] = {
+ ".lowrez: true",
+ ".background: Black",
+ "*lensnum: 3",
+ "*fpsSolid: true",
+ "*length: 9",
+ "*mode: 0",
+ "*colors: 200",
+ "*delay: 20000",
+ "*translate: True",
+ "*scale: True",
+ "*rotate: True",
+ "*recurse: False",
+ "*multi: True",
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ "*doubleBuffer: False",
+#else
+ "*doubleBuffer: True",
+#endif
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec ifs_options [] = {
+ { "-detail", ".length", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-functions", ".lensnum", XrmoptionSepArg, 0 },
+ { "-no-translate", ".translate", XrmoptionNoArg, "False" },
+ { "-no-scale", ".scale", XrmoptionNoArg, "False" },
+ { "-no-rotate", ".rotate", XrmoptionNoArg, "False" },
+ { "-recurse", ".recurse", XrmoptionNoArg, "True" },
+ { "-iterate", ".recurse", XrmoptionNoArg, "False" },
+ { "-multi", ".multi", XrmoptionNoArg, "True" },
+ { "-no-multi", ".multi", XrmoptionNoArg, "False" },
+ { "-db", ".doubleBuffer",XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer",XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+/* Draw all the queued points on the backbuffer */
+static void
+drawpoints(struct state *st)
+{
+ XDrawPoints(st->dpy, st->backbuffer, st->gc, st->pointbuf, st->npoints,
+ CoordModeOrigin);
+ st->npoints = 0;
+}
+
+/* Set a point to be drawn, if it hasn't been already.
+ * Expects coordinates in 256ths of a pixel. */
+static void
+sp(struct state *st, int x, int y)
+{
+ if (x < 0 || x >= st->width8 || y < 0 || y >= st->height8)
+ return;
+
+ x >>= 8;
+ y >>= 8;
+
+ if (getdot(x, y)) return;
+ setdot(x, y);
+
+ if (x < st->xmin) st->xmin = x;
+ if (x > st->xmax) st->xmax = x;
+ if (y < st->ymin) st->ymin = y;
+ if (y > st->ymax) st->ymax = y;
+
+ st->pointbuf[st->npoints].x = x;
+ st->pointbuf[st->npoints].y = y;
+ st->npoints++;
+
+ if (st->npoints >= countof(st->pointbuf)) {
+ drawpoints(st);
+ }
+}
+
+
+/* Precompute integer values for matrix multiplication and vector
+ * addition. The matrix multiplication will go like this (see iterate()):
+ * |x2| |ua ub| |x| |utx|
+ * | | = | | * | | + | |
+ * |y2| |uc ud| |y| |uty|
+ *
+ * There is an extra factor of 2^10 in these values, and an extra factor of
+ * 2^8 in the coordinates, in order to implement fixed-point arithmetic.
+ */
+static void
+lensmatrix(struct state *st, Lens *l)
+{
+ l->ua = 1024.0 * l->s * cos(l->r);
+ l->ub = -1024.0 * l->s * sin(l->r);
+ l->uc = -l->ub;
+ l->ud = l->ua;
+ l->utx = 131072.0 * st->width * (l->s * (sin(l->r) - cos(l->r))
+ + l->tx / 16 + 1);
+ l->uty = -131072.0 * st->height * (l->s * (sin(l->r) + cos(l->r))
+ + l->ty / 16 - 1);
+}
+
+static void
+CreateLens(struct state *st,
+ float nr,
+ float ns,
+ float nx,
+ float ny,
+ Lens *newlens)
+{
+ newlens->sa = newlens->txa = newlens->tya = 0;
+ if (st->rotate) {
+ newlens->r = newlens->ro = newlens->rt = nr;
+ newlens->rc = 1;
+ }
+ else newlens->r = 0;
+
+ if (st->scale) {
+ newlens->s = newlens->so = newlens->st = ns;
+ newlens->sc = 1;
+ }
+ else newlens->s = 0.5;
+
+ newlens->tx = nx;
+ newlens->ty = ny;
+
+ lensmatrix(st, newlens);
+}
+
+static void
+mutate(struct state *st, Lens *l)
+{
+ if (st->rotate) {
+ float factor;
+ if(l->rc >= 1) {
+ l->rc = 0;
+ l->ro = l->rt;
+ l->rt = myrandom(4) - 2;
+ }
+ factor = (sin((-M_PI / 2.0) + M_PI * l->rc) + 1.0) / 2.0;
+ l->r = l->ro + (l->rt - l->ro) * factor;
+ l->rc += 0.01;
+ }
+ if (st->scale) {
+ float factor;
+ if (l->sc >= 1) {
+ /* Reset counter, obtain new target value */
+ l->sc = 0;
+ l->so = l->st;
+ l->st = myrandom(2) - 1;
+ }
+ factor = (sin((-M_PI / 2.0) + M_PI * l->sc) + 1.0) / 2.0;
+ /* Take average of old target and new target, using factor to *
+ * weight. It's computed sinusoidally, resulting in smooth, *
+ * rhythmic transitions. */
+ l->s = l->so + (l->st - l->so) * factor;
+ l->sc += 0.01;
+ }
+ if (st->translate) {
+ l->txa += myrandom(0.004) - 0.002;
+ l->tya += myrandom(0.004) - 0.002;
+ l->tx += l->txa;
+ l->ty += l->tya;
+ if (l->tx > 6) l->txa -= 0.004;
+ if (l->ty > 6) l->tya -= 0.004;
+ if (l->tx < -6) l->txa += 0.004;
+ if (l->ty < -6) l->tya += 0.004;
+ if (l->txa > 0.05 || l->txa < -0.05) l->txa /= 1.7;
+ if (l->tya > 0.05 || l->tya < -0.05) l->tya /= 1.7;
+ }
+ if (st->rotate || st->scale || st->translate) {
+ lensmatrix(st, l);
+ }
+}
+
+
+#define STEPX(l,x,y) (((l)->ua * (x) + (l)->ub * (y) + (l)->utx) >> 10)
+#define STEPY(l,x,y) (((l)->uc * (x) + (l)->ud * (y) + (l)->uty) >> 10)
+/*#define STEPY(l,x,y) (((l)->ua * (y) - (l)->ub * (x) + (l)->uty) >> 10)*/
+
+/* Calls itself <lensnum> times - with results from each lens/function. *
+ * After <length> calls to itself, it stops iterating and draws a point. */
+static void
+recurse(struct state *st, int x, int y, int length, int p)
+{
+ int i;
+ Lens *l;
+
+ if (length == 0) {
+ if (p == 0)
+ sp(st, x, y);
+ else {
+ l = &st->lenses[p];
+ sp(st, STEPX(l, x, y), STEPY(l, x, y));
+ }
+ }
+ else {
+ for (i = 0; i < st->lensnum; i++) {
+ l = &st->lenses[i];
+ recurse(st, STEPX(l, x, y), STEPY(l, x, y), length - 1, p);
+ }
+ }
+}
+
+/* Performs <count> random lens transformations, drawing a point at each
+ * iteration after the first 10.
+ */
+static void
+iterate(struct state *st, int count, int p)
+{
+ int i;
+ Lens *l;
+ int x = st->x;
+ int y = st->y;
+ int tx;
+
+# define STEP() \
+ l = &st->lenses[random() % st->lensnum]; \
+ tx = STEPX(l, x, y); \
+ y = STEPY(l, x, y); \
+ x = tx
+
+ for (i = 0; i < 10; i++) {
+ STEP();
+ }
+
+ for ( ; i < count; i++) {
+ STEP();
+ if (p == 0)
+ sp(st, x, y);
+ else
+ {
+ l = &st->lenses[p];
+ sp(st, STEPX(l, x, y), STEPY(l, x, y));
+ }
+ }
+
+# undef STEP
+
+ st->x = x;
+ st->y = y;
+}
+
+/* Come on and iterate, iterate, iterate and sing... *
+ * Yeah, this function just calls iterate, mutate, *
+ * and then draws everything. */
+static unsigned long
+ifs_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ int xmin = st->xmin, xmax = st->xmax, ymin = st->ymin, ymax = st->ymax;
+ int partcolor, x, y;
+
+
+ /* erase whatever was drawn in the previous frame */
+ if (xmin <= xmax && ymin <= ymax) {
+ XSetForeground(st->dpy, st->gc, st->blackColor);
+ XFillRectangle(st->dpy, st->backbuffer, st->gc,
+ xmin, ymin,
+ xmax - xmin + 1, ymax - ymin + 1);
+ st->xmin = st->width + 1;
+ st->xmax = st->ymax = -1;
+ st->ymin = st->height + 1;
+ }
+
+ st->ccolour++;
+ st->ccolour %= st->ncolours;
+
+ /* calculate and draw points for this frame */
+ x = st->width << 7;
+ y = st->height << 7;
+
+ if (st->multi) {
+ for (i = 0; i < st->lensnum; i++) {
+ partcolor = st->ccolour * (i+1);
+ partcolor %= st->ncolours;
+ XSetForeground(st->dpy, st->gc, st->colours[partcolor].pixel);
+ memset(st->board, 0, st->widthb * st->height * sizeof(*st->board));
+ if (st->recurse)
+ recurse(st, x, y, st->length - 1, i);
+ else
+ iterate(st, pow(st->lensnum, st->length - 1), i);
+ if (st->npoints)
+ drawpoints(st);
+ }
+ }
+ else {
+
+ XSetForeground(st->dpy, st->gc, st->colours[st->ccolour].pixel);
+ memset(st->board, 0, st->widthb * st->height * sizeof(*st->board));
+ if (st->recurse)
+ recurse(st, x, y, st->length, 0);
+ else
+ iterate(st, pow(st->lensnum, st->length), 0);
+ if (st->npoints)
+ drawpoints(st);
+ }
+
+ /* if we just drew into a buffer, copy the changed area (including
+ * erased area) to screen */
+ if (st->backbuffer != st->window
+ && ((st->xmin <= st->xmax && st->ymin <= st->ymax)
+ || (xmin <= xmax && ymin <= ymax))) {
+ if (st->xmin < xmin) xmin = st->xmin;
+ if (st->xmax > xmax) xmax = st->xmax;
+ if (st->ymin < ymin) ymin = st->ymin;
+ if (st->ymax > ymax) ymax = st->ymax;
+ XCopyArea(st->dpy, st->backbuffer, st->window, st->gc,
+ xmin, ymin,
+ xmax - xmin + 1, ymax - ymin + 1,
+ xmin, ymin);
+ }
+
+ for(i = 0; i < st->lensnum; i++) {
+ mutate(st, &st->lenses[i]);
+ }
+
+ return st->delay;
+}
+
+static void
+ifs_reshape (Display *, Window, void *, unsigned int, unsigned int);
+
+static void *
+ifs_init (Display *d_arg, Window w_arg)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ XWindowAttributes xgwa;
+
+ /* Initialise all this X shizzle */
+ st->dpy = d_arg;
+ st->window = w_arg;
+
+ st->blackColor = BlackPixel(st->dpy, DefaultScreen(st->dpy));
+ st->whiteColor = WhitePixel(st->dpy, DefaultScreen(st->dpy));
+ st->gc = XCreateGC(st->dpy, st->window, 0, NULL);
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ ifs_reshape(st->dpy, st->window, st, xgwa.width, xgwa.height);
+
+ st->ncolours = get_integer_resource(st->dpy, "colors", "Colors");
+ if (st->ncolours < st->lensnum)
+ st->ncolours = st->lensnum;
+ if (st->colours) free(st->colours);
+ if (st->ncolours < 1) st->ncolours = 1;
+ st->colours = (XColor *)calloc(st->ncolours, sizeof(XColor));
+ if (!st->colours) exit(1);
+ make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap,
+ st->colours, &st->ncolours,
+ True, 0, False);
+
+ /* Initialize IFS data */
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Delay");
+ st->length = get_integer_resource(st->dpy, "length", "Detail");
+ if (st->length < 0) st->length = 0;
+ st->mode = get_integer_resource(st->dpy, "mode", "Mode");
+
+ st->rotate = get_boolean_resource(st->dpy, "rotate", "Boolean");
+ st->scale = get_boolean_resource(st->dpy, "scale", "Boolean");
+ st->translate = get_boolean_resource(st->dpy, "translate", "Boolean");
+ st->recurse = get_boolean_resource(st->dpy, "recurse", "Boolean");
+ st->multi = get_boolean_resource(st->dpy, "multi", "Boolean");
+
+ st->lensnum = get_integer_resource(st->dpy, "lensnum", "Functions");
+ if (st->lenses) free (st->lenses);
+ st->lenses = (Lens *)calloc(st->lensnum, sizeof(Lens));
+ if (!st->lenses) exit(1);
+ for (i = 0; i < st->lensnum; i++) {
+ CreateLens(st,
+ myrandom(1)-0.5,
+ myrandom(1),
+ myrandom(4)-2,
+ myrandom(4)+2,
+ &st->lenses[i]);
+ }
+
+ return st;
+}
+
+static void
+ifs_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *)closure;
+ XWindowAttributes xgwa;
+
+ /* oh well, we need the screen depth anyway */
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->width = xgwa.width;
+ st->widthb = ((xgwa.width + 31) >> 5);
+ st->height = xgwa.height;
+ st->width8 = xgwa.width << 8;
+ st->height8 = xgwa.height << 8;
+
+ if (!st->xmax && !st->ymax && !st->xmin && !st->ymin) {
+ st->xmin = xgwa.width + 1;
+ st->xmax = st->ymax = -1;
+ st->ymin = xgwa.height + 1;
+ }
+
+ if (st->backbuffer != None && st->backbuffer != st->window) {
+ XFreePixmap(st->dpy, st->backbuffer);
+ st->backbuffer = None;
+ }
+
+ if (get_boolean_resource (st->dpy, "doubleBuffer", "Boolean")) {
+ st->backbuffer = XCreatePixmap(st->dpy, st->window, st->width, st->height, xgwa.depth);
+ XSetForeground(st->dpy, st->gc, st->blackColor);
+ XFillRectangle(st->dpy, st->backbuffer, st->gc,
+ 0, 0, st->width, st->height);
+ } else {
+ st->backbuffer = st->window;
+ XClearWindow(st->dpy, st->window);
+ }
+
+ if (st->board) free(st->board);
+ st->board = (unsigned int *)calloc(st->widthb * st->height, sizeof(unsigned int));
+ if (!st->board) exit(1);
+}
+
+static Bool
+ifs_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *)closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ int i;
+ for (i = 0; i < st->lensnum; i++) {
+ CreateLens(st,
+ myrandom(1)-0.5,
+ myrandom(1),
+ myrandom(4)-2,
+ myrandom(4)+2,
+ &st->lenses[i]);
+ }
+ return True;
+ }
+ return False;
+}
+
+static void
+ifs_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->board) free(st->board);
+ if (st->lenses) free(st->lenses);
+ if (st->colours) free(st->colours);
+ if (st->backbuffer != None && st->backbuffer != st->window)
+ XFreePixmap(st->dpy, st->backbuffer);
+ free(st);
+}
+
+XSCREENSAVER_MODULE ("IFS", ifs)
diff --git a/hacks/ifs.man b/hacks/ifs.man
new file mode 100644
index 0000000..c95dce8
--- /dev/null
+++ b/hacks/ifs.man
@@ -0,0 +1,111 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ifs - draws spinning, colliding iterated-function-system images
+.SH SYNOPSIS
+.B ifs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no\-db]
+[\-delay \fInumber\fP]
+[\-detail \fInumber\fP]
+[\-colors \fInumber\fP]
+[\-functions \fInumber\fP]
+[\-iterate | \-recurse]
+[\-no\-rotate]
+[\-no\-scale]
+[\-no\-translate]
+[\-fps]
+.SH DESCRIPTION
+The \fIifs\fP program draws spinning, colliding iterated-function-system images.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-no\-db
+Disable double-buffering.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000
+.TP 8
+.B \-colors \fInumber\fP
+Number of colours to use. Default: 200
+.TP 8
+.B \-detail \fInumber\fP
+In \fI\-iterate\fP mode, number of times to randomly iterate the
+functions, in thousands. In \fI\-recurse\fP mode, number of times
+to apply functions (recursion depth) before drawing each point.
+Default: 9
+.TP 8
+.B \-functions \fInumber\fP
+Number of functions to be iterated. Default: 3
+.TP 8
+.B \-iterate
+Calculate by iteratively applying the functions in a random order,
+usually faster than \fI\-recurse\fP. This is the default.
+.TP 8
+.B \-recurse
+Calculate by recursively applying all combinations of the functions.
+This is the historical behavior and may produce neater output than
+\fI\-iterate\fP.
+.TP 8
+.B \-no-rotate
+Disable the rotation component of the functions.
+.TP 8
+.B \-no-scale
+Disable the scaling component of the functions.
+.TP 8
+.B \-no-translate
+Disable the varying translation component of the functions.
+.TP 8
+.B \-no-multi
+Turn off multi-coloured mode, only one colour is used to colour the whole set.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR ifs (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co Chris Le Sueur and Robby Griffin, 2005-2006
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+.SH AUTHOR
+This version by Chris Le Sueur <thefishface@gmail.com>, Feb 2005
+Many improvements by Robby Griffin <rmg@terc.edu>, Mar 2006
diff --git a/hacks/images/6x10font.png b/hacks/images/6x10font.png
new file mode 100644
index 0000000..70364d8
--- /dev/null
+++ b/hacks/images/6x10font.png
Binary files differ
diff --git a/hacks/images/Makefile b/hacks/images/Makefile
new file mode 100644
index 0000000..9f3d47c
--- /dev/null
+++ b/hacks/images/Makefile
@@ -0,0 +1,54 @@
+# hacks/images/Makefile.in --- xscreensaver, Copyright (c) 2018 Jamie Zawinski.
+# the `../configure' script generates `hacks/images/Makefile' from this file.
+
+
+srcdir = .
+VPATH = ${srcdir} ${srcdir}/bubbles ${srcdir}/m6502 \
+ ${srcdir}/molecules ${srcdir}/noseguy
+top_srcdir = ../..
+UTILS_SRC = $(top_srcdir)/utils
+RM = rm -f
+
+STAR = *
+TARFILES = Makefile \
+ Makefile.in \
+ $(STAR).png \
+ $(STAR).gif \
+ $(STAR)/$(STAR).png \
+ $(STAR)/$(STAR).asm \
+ $(STAR)/$(STAR).pdb \
+ $(STAR)/$(STAR).pov \
+ $(STAR)/$(STAR).txt \
+
+PNG_HDRS = $(shell find $(srcdir) -name \*.png | \
+ sed 's@^.*/\(.*\)\.\(png\)$$@gen/\1_\2.h@')
+
+default: all
+
+all: gen $(PNG_HDRS)
+
+gen:
+ mkdir gen
+
+# %.png dependency below works because VPATH contains subdirs
+# of 'images' dir not only 'images' itself
+gen/%_png.h: %.png
+ echo $(UTILS_SRC)/bin2c "$<" "$@"
+ $(UTILS_SRC)/bin2c "$<" "$@"
+
+clean:
+ $(RM) -r gen
+
+echo_tarfiles:
+ @echo $(TARFILES)
+
+install:
+install-program:
+install-man:
+install-strip:
+uninstall:
+uninstall-program:
+uninstall-man:
+depend:
+distdepend:
+tags:
diff --git a/hacks/images/Makefile.in b/hacks/images/Makefile.in
new file mode 100644
index 0000000..497ebfc
--- /dev/null
+++ b/hacks/images/Makefile.in
@@ -0,0 +1,54 @@
+# hacks/images/Makefile.in --- xscreensaver, Copyright (c) 2018 Jamie Zawinski.
+# the `../configure' script generates `hacks/images/Makefile' from this file.
+
+@SET_MAKE@
+srcdir = @srcdir@
+VPATH = ${srcdir} ${srcdir}/bubbles ${srcdir}/m6502 \
+ ${srcdir}/molecules ${srcdir}/noseguy
+top_srcdir = @top_srcdir@
+UTILS_SRC = $(top_srcdir)/utils
+RM = rm -f
+
+STAR = *
+TARFILES = Makefile \
+ Makefile.in \
+ $(STAR).png \
+ $(STAR).gif \
+ $(STAR)/$(STAR).png \
+ $(STAR)/$(STAR).asm \
+ $(STAR)/$(STAR).pdb \
+ $(STAR)/$(STAR).pov \
+ $(STAR)/$(STAR).txt \
+
+PNG_HDRS = $(shell find $(srcdir) -name \*.png | \
+ sed 's@^.*/\(.*\)\.\(png\)$$@gen/\1_\2.h@')
+
+default: all
+
+all: gen $(PNG_HDRS)
+
+gen:
+ mkdir gen
+
+# %.png dependency below works because VPATH contains subdirs
+# of 'images' dir not only 'images' itself
+gen/%_png.h: %.png
+ echo $(UTILS_SRC)/bin2c "$<" "$@"
+ $(UTILS_SRC)/bin2c "$<" "$@"
+
+clean:
+ $(RM) -r gen
+
+echo_tarfiles:
+ @echo $(TARFILES)
+
+install:
+install-program:
+install-man:
+install-strip:
+uninstall:
+uninstall-program:
+uninstall-man:
+depend:
+distdepend:
+tags:
diff --git a/hacks/images/amiga.png b/hacks/images/amiga.png
new file mode 100644
index 0000000..7ea62ff
--- /dev/null
+++ b/hacks/images/amiga.png
Binary files differ
diff --git a/hacks/images/android.png b/hacks/images/android.png
new file mode 100644
index 0000000..80115c3
--- /dev/null
+++ b/hacks/images/android.png
Binary files differ
diff --git a/hacks/images/apple.png b/hacks/images/apple.png
new file mode 100644
index 0000000..1cf5ab5
--- /dev/null
+++ b/hacks/images/apple.png
Binary files differ
diff --git a/hacks/images/apple2font.png b/hacks/images/apple2font.png
new file mode 100644
index 0000000..bf2a6cc
--- /dev/null
+++ b/hacks/images/apple2font.png
Binary files differ
diff --git a/hacks/images/atari.png b/hacks/images/atari.png
new file mode 100644
index 0000000..31d5d98
--- /dev/null
+++ b/hacks/images/atari.png
Binary files differ
diff --git a/hacks/images/atm.png b/hacks/images/atm.png
new file mode 100644
index 0000000..acb84c7
--- /dev/null
+++ b/hacks/images/atm.png
Binary files differ
diff --git a/hacks/images/blocktube.png b/hacks/images/blocktube.png
new file mode 100644
index 0000000..49423fa
--- /dev/null
+++ b/hacks/images/blocktube.png
Binary files differ
diff --git a/hacks/images/bob.png b/hacks/images/bob.png
new file mode 100644
index 0000000..8f490df
--- /dev/null
+++ b/hacks/images/bob.png
Binary files differ
diff --git a/hacks/images/brick1.png b/hacks/images/brick1.png
new file mode 100644
index 0000000..f7a9eac
--- /dev/null
+++ b/hacks/images/brick1.png
Binary files differ
diff --git a/hacks/images/brick2.png b/hacks/images/brick2.png
new file mode 100644
index 0000000..9667246
--- /dev/null
+++ b/hacks/images/brick2.png
Binary files differ
diff --git a/hacks/images/bubbles/blood.pov b/hacks/images/bubbles/blood.pov
new file mode 100644
index 0000000..8166f4e
--- /dev/null
+++ b/hacks/images/bubbles/blood.pov
@@ -0,0 +1,24 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+ location <5.8, 0, 0>
+ up <0, 1, 0>
+ right <1, 0, 0>
+ look_at <0, 0, 0>
+}
+
+sphere {
+ <0,0,0>, 2.5
+ texture { Blood_Marble
+ scale <2, 2, 2>
+ rotate <0, 20, 0> }
+ finish { Dull }
+}
+
+light_source {<6, 1, 0> color White}
+/* light_source {<6.1, 1, 0> color White} */
diff --git a/hacks/images/bubbles/blood1.png b/hacks/images/bubbles/blood1.png
new file mode 100644
index 0000000..58f16ab
--- /dev/null
+++ b/hacks/images/bubbles/blood1.png
Binary files differ
diff --git a/hacks/images/bubbles/blood10.png b/hacks/images/bubbles/blood10.png
new file mode 100644
index 0000000..a7acca5
--- /dev/null
+++ b/hacks/images/bubbles/blood10.png
Binary files differ
diff --git a/hacks/images/bubbles/blood11.png b/hacks/images/bubbles/blood11.png
new file mode 100644
index 0000000..dd74394
--- /dev/null
+++ b/hacks/images/bubbles/blood11.png
Binary files differ
diff --git a/hacks/images/bubbles/blood2.png b/hacks/images/bubbles/blood2.png
new file mode 100644
index 0000000..de2c4d8
--- /dev/null
+++ b/hacks/images/bubbles/blood2.png
Binary files differ
diff --git a/hacks/images/bubbles/blood3.png b/hacks/images/bubbles/blood3.png
new file mode 100644
index 0000000..fbd4ac4
--- /dev/null
+++ b/hacks/images/bubbles/blood3.png
Binary files differ
diff --git a/hacks/images/bubbles/blood4.png b/hacks/images/bubbles/blood4.png
new file mode 100644
index 0000000..145b673
--- /dev/null
+++ b/hacks/images/bubbles/blood4.png
Binary files differ
diff --git a/hacks/images/bubbles/blood5.png b/hacks/images/bubbles/blood5.png
new file mode 100644
index 0000000..01e1eb7
--- /dev/null
+++ b/hacks/images/bubbles/blood5.png
Binary files differ
diff --git a/hacks/images/bubbles/blood6.png b/hacks/images/bubbles/blood6.png
new file mode 100644
index 0000000..24000b1
--- /dev/null
+++ b/hacks/images/bubbles/blood6.png
Binary files differ
diff --git a/hacks/images/bubbles/blood7.png b/hacks/images/bubbles/blood7.png
new file mode 100644
index 0000000..2574449
--- /dev/null
+++ b/hacks/images/bubbles/blood7.png
Binary files differ
diff --git a/hacks/images/bubbles/blood8.png b/hacks/images/bubbles/blood8.png
new file mode 100644
index 0000000..852a572
--- /dev/null
+++ b/hacks/images/bubbles/blood8.png
Binary files differ
diff --git a/hacks/images/bubbles/blood9.png b/hacks/images/bubbles/blood9.png
new file mode 100644
index 0000000..52104a0
--- /dev/null
+++ b/hacks/images/bubbles/blood9.png
Binary files differ
diff --git a/hacks/images/bubbles/blue.pov b/hacks/images/bubbles/blue.pov
new file mode 100644
index 0000000..86d1ff8
--- /dev/null
+++ b/hacks/images/bubbles/blue.pov
@@ -0,0 +1,22 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+ location <5.8, 0, 0>
+ up <0, 1, 0>
+ right <1, 0, 0>
+ look_at <0, 0, 0>
+}
+
+sphere {
+ <0,0,0>, 2.5
+ texture { Blue_Agate
+ scale <0.7, 0.7, 0.7> }
+ finish { phong 1 }
+}
+
+light_source {<6, 1, 0> color White}
diff --git a/hacks/images/bubbles/blue1.png b/hacks/images/bubbles/blue1.png
new file mode 100644
index 0000000..072473e
--- /dev/null
+++ b/hacks/images/bubbles/blue1.png
Binary files differ
diff --git a/hacks/images/bubbles/blue10.png b/hacks/images/bubbles/blue10.png
new file mode 100644
index 0000000..2f1dd71
--- /dev/null
+++ b/hacks/images/bubbles/blue10.png
Binary files differ
diff --git a/hacks/images/bubbles/blue11.png b/hacks/images/bubbles/blue11.png
new file mode 100644
index 0000000..3ab183c
--- /dev/null
+++ b/hacks/images/bubbles/blue11.png
Binary files differ
diff --git a/hacks/images/bubbles/blue2.png b/hacks/images/bubbles/blue2.png
new file mode 100644
index 0000000..8e13a8a
--- /dev/null
+++ b/hacks/images/bubbles/blue2.png
Binary files differ
diff --git a/hacks/images/bubbles/blue3.png b/hacks/images/bubbles/blue3.png
new file mode 100644
index 0000000..427b644
--- /dev/null
+++ b/hacks/images/bubbles/blue3.png
Binary files differ
diff --git a/hacks/images/bubbles/blue4.png b/hacks/images/bubbles/blue4.png
new file mode 100644
index 0000000..6984ecc
--- /dev/null
+++ b/hacks/images/bubbles/blue4.png
Binary files differ
diff --git a/hacks/images/bubbles/blue5.png b/hacks/images/bubbles/blue5.png
new file mode 100644
index 0000000..a977d57
--- /dev/null
+++ b/hacks/images/bubbles/blue5.png
Binary files differ
diff --git a/hacks/images/bubbles/blue6.png b/hacks/images/bubbles/blue6.png
new file mode 100644
index 0000000..0c49aea
--- /dev/null
+++ b/hacks/images/bubbles/blue6.png
Binary files differ
diff --git a/hacks/images/bubbles/blue7.png b/hacks/images/bubbles/blue7.png
new file mode 100644
index 0000000..7a7087d
--- /dev/null
+++ b/hacks/images/bubbles/blue7.png
Binary files differ
diff --git a/hacks/images/bubbles/blue8.png b/hacks/images/bubbles/blue8.png
new file mode 100644
index 0000000..99cc930
--- /dev/null
+++ b/hacks/images/bubbles/blue8.png
Binary files differ
diff --git a/hacks/images/bubbles/blue9.png b/hacks/images/bubbles/blue9.png
new file mode 100644
index 0000000..753c6d2
--- /dev/null
+++ b/hacks/images/bubbles/blue9.png
Binary files differ
diff --git a/hacks/images/bubbles/glass.pov b/hacks/images/bubbles/glass.pov
new file mode 100644
index 0000000..c189771
--- /dev/null
+++ b/hacks/images/bubbles/glass.pov
@@ -0,0 +1,27 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+ location <5.8, 0, 0>
+ up <0, 1, 0>
+ right <1, 0, 0>
+ look_at <0, 0, 0>
+}
+
+sphere {
+ <0,0,0>, 2.5
+ texture { Glass
+ scale <0.7, 0.7, 0.7>
+ rotate y*clock
+ normal {bumps 0.4 scale 0.1}
+ finish { Shiny }
+# finish { phong 0.4 }
+ }
+}
+
+light_source {<6, 7, 0> color White}
+light_source {<6.1, 1, 0> color Blue}
diff --git a/hacks/images/bubbles/glass1.png b/hacks/images/bubbles/glass1.png
new file mode 100644
index 0000000..f758dae
--- /dev/null
+++ b/hacks/images/bubbles/glass1.png
Binary files differ
diff --git a/hacks/images/bubbles/glass10.png b/hacks/images/bubbles/glass10.png
new file mode 100644
index 0000000..3a703c0
--- /dev/null
+++ b/hacks/images/bubbles/glass10.png
Binary files differ
diff --git a/hacks/images/bubbles/glass11.png b/hacks/images/bubbles/glass11.png
new file mode 100644
index 0000000..72e1925
--- /dev/null
+++ b/hacks/images/bubbles/glass11.png
Binary files differ
diff --git a/hacks/images/bubbles/glass2.png b/hacks/images/bubbles/glass2.png
new file mode 100644
index 0000000..9c55e21
--- /dev/null
+++ b/hacks/images/bubbles/glass2.png
Binary files differ
diff --git a/hacks/images/bubbles/glass3.png b/hacks/images/bubbles/glass3.png
new file mode 100644
index 0000000..d8d25ca
--- /dev/null
+++ b/hacks/images/bubbles/glass3.png
Binary files differ
diff --git a/hacks/images/bubbles/glass4.png b/hacks/images/bubbles/glass4.png
new file mode 100644
index 0000000..1db6eef
--- /dev/null
+++ b/hacks/images/bubbles/glass4.png
Binary files differ
diff --git a/hacks/images/bubbles/glass5.png b/hacks/images/bubbles/glass5.png
new file mode 100644
index 0000000..e61c9ae
--- /dev/null
+++ b/hacks/images/bubbles/glass5.png
Binary files differ
diff --git a/hacks/images/bubbles/glass6.png b/hacks/images/bubbles/glass6.png
new file mode 100644
index 0000000..f7de0b4
--- /dev/null
+++ b/hacks/images/bubbles/glass6.png
Binary files differ
diff --git a/hacks/images/bubbles/glass7.png b/hacks/images/bubbles/glass7.png
new file mode 100644
index 0000000..0cde9b3
--- /dev/null
+++ b/hacks/images/bubbles/glass7.png
Binary files differ
diff --git a/hacks/images/bubbles/glass8.png b/hacks/images/bubbles/glass8.png
new file mode 100644
index 0000000..26b3f6a
--- /dev/null
+++ b/hacks/images/bubbles/glass8.png
Binary files differ
diff --git a/hacks/images/bubbles/glass9.png b/hacks/images/bubbles/glass9.png
new file mode 100644
index 0000000..7663ea1
--- /dev/null
+++ b/hacks/images/bubbles/glass9.png
Binary files differ
diff --git a/hacks/images/bubbles/jade.pov b/hacks/images/bubbles/jade.pov
new file mode 100644
index 0000000..7c1cb02
--- /dev/null
+++ b/hacks/images/bubbles/jade.pov
@@ -0,0 +1,24 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+ location <5.8, 0, 0>
+ up <0, 1, 0>
+ right <1, 0, 0>
+ look_at <0, 0, 0>
+}
+
+sphere {
+ <0,0,0>, 2.5
+ texture { Jade
+ scale <0.7, 0.7, 0.7>
+ rotate y*clock }
+ finish { phong 0.4 }
+}
+
+light_source {<6, 1, 0> color White}
+light_source {<6.1, 1, 0> color White}
diff --git a/hacks/images/bubbles/jade1.png b/hacks/images/bubbles/jade1.png
new file mode 100644
index 0000000..f6b4daa
--- /dev/null
+++ b/hacks/images/bubbles/jade1.png
Binary files differ
diff --git a/hacks/images/bubbles/jade10.png b/hacks/images/bubbles/jade10.png
new file mode 100644
index 0000000..6383cba
--- /dev/null
+++ b/hacks/images/bubbles/jade10.png
Binary files differ
diff --git a/hacks/images/bubbles/jade11.png b/hacks/images/bubbles/jade11.png
new file mode 100644
index 0000000..217794c
--- /dev/null
+++ b/hacks/images/bubbles/jade11.png
Binary files differ
diff --git a/hacks/images/bubbles/jade2.png b/hacks/images/bubbles/jade2.png
new file mode 100644
index 0000000..41f373b
--- /dev/null
+++ b/hacks/images/bubbles/jade2.png
Binary files differ
diff --git a/hacks/images/bubbles/jade3.png b/hacks/images/bubbles/jade3.png
new file mode 100644
index 0000000..516385b
--- /dev/null
+++ b/hacks/images/bubbles/jade3.png
Binary files differ
diff --git a/hacks/images/bubbles/jade4.png b/hacks/images/bubbles/jade4.png
new file mode 100644
index 0000000..a682ca5
--- /dev/null
+++ b/hacks/images/bubbles/jade4.png
Binary files differ
diff --git a/hacks/images/bubbles/jade5.png b/hacks/images/bubbles/jade5.png
new file mode 100644
index 0000000..f4d990f
--- /dev/null
+++ b/hacks/images/bubbles/jade5.png
Binary files differ
diff --git a/hacks/images/bubbles/jade6.png b/hacks/images/bubbles/jade6.png
new file mode 100644
index 0000000..ea8079d
--- /dev/null
+++ b/hacks/images/bubbles/jade6.png
Binary files differ
diff --git a/hacks/images/bubbles/jade7.png b/hacks/images/bubbles/jade7.png
new file mode 100644
index 0000000..d6e6440
--- /dev/null
+++ b/hacks/images/bubbles/jade7.png
Binary files differ
diff --git a/hacks/images/bubbles/jade8.png b/hacks/images/bubbles/jade8.png
new file mode 100644
index 0000000..45d58d3
--- /dev/null
+++ b/hacks/images/bubbles/jade8.png
Binary files differ
diff --git a/hacks/images/bubbles/jade9.png b/hacks/images/bubbles/jade9.png
new file mode 100644
index 0000000..382e9d8
--- /dev/null
+++ b/hacks/images/bubbles/jade9.png
Binary files differ
diff --git a/hacks/images/chromesphere.png b/hacks/images/chromesphere.png
new file mode 100644
index 0000000..7b19f76
--- /dev/null
+++ b/hacks/images/chromesphere.png
Binary files differ
diff --git a/hacks/images/earth.png b/hacks/images/earth.png
new file mode 100644
index 0000000..9819dac
--- /dev/null
+++ b/hacks/images/earth.png
Binary files differ
diff --git a/hacks/images/earth_flat.png b/hacks/images/earth_flat.png
new file mode 100644
index 0000000..e3e1b60
--- /dev/null
+++ b/hacks/images/earth_flat.png
Binary files differ
diff --git a/hacks/images/earth_night.png b/hacks/images/earth_night.png
new file mode 100644
index 0000000..5b0a646
--- /dev/null
+++ b/hacks/images/earth_night.png
Binary files differ
diff --git a/hacks/images/ground.png b/hacks/images/ground.png
new file mode 100644
index 0000000..52c80a8
--- /dev/null
+++ b/hacks/images/ground.png
Binary files differ
diff --git a/hacks/images/hmac.png b/hacks/images/hmac.png
new file mode 100644
index 0000000..6e7bf18
--- /dev/null
+++ b/hacks/images/hmac.png
Binary files differ
diff --git a/hacks/images/iris.png b/hacks/images/iris.png
new file mode 100644
index 0000000..69a8011
--- /dev/null
+++ b/hacks/images/iris.png
Binary files differ
diff --git a/hacks/images/jigglymap.png b/hacks/images/jigglymap.png
new file mode 100644
index 0000000..8da1fcd
--- /dev/null
+++ b/hacks/images/jigglymap.png
Binary files differ
diff --git a/hacks/images/lament512.png b/hacks/images/lament512.png
new file mode 100644
index 0000000..8c5cfab
--- /dev/null
+++ b/hacks/images/lament512.png
Binary files differ
diff --git a/hacks/images/logo-180.png b/hacks/images/logo-180.png
new file mode 100644
index 0000000..852cbea
--- /dev/null
+++ b/hacks/images/logo-180.png
Binary files differ
diff --git a/hacks/images/logo-32.png b/hacks/images/logo-32.png
new file mode 100644
index 0000000..fd588ac
--- /dev/null
+++ b/hacks/images/logo-32.png
Binary files differ
diff --git a/hacks/images/logo-50.png b/hacks/images/logo-50.png
new file mode 100644
index 0000000..8c29766
--- /dev/null
+++ b/hacks/images/logo-50.png
Binary files differ
diff --git a/hacks/images/m6502/amiga.asm b/hacks/images/m6502/amiga.asm
new file mode 100644
index 0000000..3195d4b
--- /dev/null
+++ b/hacks/images/m6502/amiga.asm
@@ -0,0 +1,120 @@
+; super mega amiga emulator :) :) :)
+; (c)by Thorex
+start:
+ lda #$b
+ jsr setcol
+ jsr delay
+ lda #$f
+ jsr setcol
+ jsr delay
+ lda #$1
+ jsr setcol
+ jsr delay
+
+ ldx #0
+cp:
+ lda pic,x
+ sta $200,x
+ lda pic2,x
+ sta $300,x
+ lda pic3,x
+ sta $400,x
+ lda pic4,x
+ sta $500,x
+ dex
+ bne cp
+ rts
+
+setcol:
+ ldx #0
+s:sta $200,x
+ sta $300,x
+ sta $400,x
+ sta $500,x
+ dex
+ bne s
+ rts
+
+delay:
+ ldy #29
+d1:
+ ldx #0
+d2:
+ dex
+ bne d2
+ dey
+ bne d1
+ rts
+
+pic:
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0
+ dcb 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,0,$f,$f,$f
+ dcb $f,$f,$f,$f,0,0,0,$f,0,$e,$e,0,1,1,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,0,$f,$f,$f
+ dcb $f,$f,$f,$f,0,$e,0,$f,0,$e,$e,$e,0,1,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,0,$f,$f,$f
+ dcb $f,$f,$f,$f,0,$e,0,$f,0,$e,$e,$e,$e,0,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,0,$f,$f,$f
+ dcb $f,$f,$f,$f,0,0,0,$f,0,$e,$e,$e,$e,0,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,0,0,0,0
+ dcb 0,0,0,0,0,0,0,0,0,$e,$e,$e,$e,0,1,1
+
+pic2:
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,$e,$e,$e,$e
+ dcb $e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,0,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,$e,$e,$e,$e
+ dcb $e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,0,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,$e,$e,$e,$e
+ dcb $e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,0,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,$e,$e,$e,$e,$e,$e,$e
+ dcb $e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,$e,0,1,1
+ dcb 1,1,1,1,1,1,1,0,$e,0,0,0,0,0,0,0
+ dcb 0,0,0,0,0,0,0,0,0,0,0,$e,$e,0,1,1
+ dcb 1,1,1,1,1,1,0,0,$e,0,0,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,0,$e,$e,0,1,1
+ dcb 1,1,1,1,1,0,1,0,$e,0,0,0,0,1,1,$e
+ dcb $e,$e,1,$e,1,$e,1,$e,1,1,0,$e,$e,0,1,1
+ dcb 1,1,1,0,0,1,1,0,0,1,0,1,1,0,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,0,$e,$e,0,1,1
+
+pic3:
+ dcb 1,1,0,1,1,1,0,1,1,1,1,0,0,1,1,1
+ dcb $e,1,$e,1,$e,1,$e,1,1,1,0,$e,$e,0,1,1
+ dcb 1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,0
+ dcb 1,1,1,1,1,1,1,1,1,1,0,$e,$e,0,1,1
+ dcb 1,0,1,0,1,1,1,1,1,1,0,0,1,1,0,$f
+ dcb 0,1,0,1,1,1,0,0,0,1,0,$e,$e,0,1,1
+ dcb 1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,0
+ dcb 0,$f,1,0,1,$f,1,0,1,1,0,$e,$e,0,1,1
+ dcb 1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0
+ dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
+ dcb 1,0,1,1,1,1,1,1,1,1,1,0,1,1,0,0
+ dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,1
+ dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1
+ dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+
+pic4:
+ dcb 1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0
+ dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,0,1,1,1,1,1,1,0,0,0,0,0,1,1,0
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ \ No newline at end of file
diff --git a/hacks/images/m6502/breakout.asm b/hacks/images/m6502/breakout.asm
new file mode 100644
index 0000000..a0fa694
--- /dev/null
+++ b/hacks/images/m6502/breakout.asm
@@ -0,0 +1,195 @@
+; Brick Out by Blake Ramsdell <blaker@gmail.com> http://www.blakeramsdell.com
+
+; A poor attempt at brick out with no player involved. Maybe someday I'll
+; let you play it, or you can view this as an exercise for the reader to put
+; in a paddle that is user-controlled.
+
+; I guess this is Copyright (C) 2007 Blake Ramsdell, and you have a license to
+; do whatever you want with it, just tell me what you did and give me a
+; mention. If you want to sell it, and you make a billion dollars, then good
+; for you. You might at least throw a party and invite me.
+
+; The gist of it is pretty simple -- you have a ball, and the ball has an X
+; and a Y velocity. When it hits something, it bounces off of it. If the thing
+; that it hits is not a wall, then it erases it. Pretty dead-simple behavior.
+
+; I don't like the vertical movement -- there's a shortcut in here somewhere
+; to make it less computationally expensive I think. Right now it just does a
+; two byte add and subtract of $20.
+
+; The ball motion is also a bit weird looking. I don't know if this is an
+; artifact of the simulation environment combined with a normal tearing
+; artifact related to refresh or what.
+
+; Blake Ramsdell, May 2007
+
+init:
+ lda #$fe
+ sta $2 ; X velocity (0 = fast, ff = slow)
+ ; (low bit is direction, 0 = down or right, 1 = up or left)
+ lda #$ee
+ sta $3 ; Y velocity
+
+drawbox:
+ lda #0 ; Use $0-$1 as a screen address for drawing the field
+ sta $0
+ lda #2
+ sta $1
+
+ ldx #$20 ; Loop $20 times
+boxloop:
+ lda #2 ; Line color (red)
+ sta $1ff,x ; Top line
+ sta $5df,x ; Bottom line
+ ldy #0
+ sta ($0),y ; Left line
+ ldy #$1f
+ sta ($0),y ; Right line
+
+ cpx #$1 ; If we're just before the bottom line...
+ beq noblocks ; Don't draw any blocks there
+
+
+ lda #3 ; First block for this row, Cyan in color
+ ldy #$17 ; It's at X position $17
+ sta ($0),y ; Draw it
+
+ lda #4 ; Second block for this row, Purple in color
+ iny ; It's at the next X position
+ sta ($0),y ; Draw it
+
+ lda #5 ; Third block for this row, Green in color
+ iny ; It's at the next X position
+ sta ($0),y ; Draw it
+
+ lda #6 ; Fourth block for this row, Blue in color
+ iny ; It's at the next X position
+ sta ($0),y ; Draw it
+
+
+noblocks:
+ clc ; Get ready to increment the row, clear the carry for add
+ lda $0 ; Get the low byte
+ adc #$20 ; Add $20 to it for the next row
+ sta $0 ; Put it back
+ lda $1 ; Get the high byte
+ adc #0 ; Factor in the carry
+ sta $1 ; Put it back
+
+ dex ; Decrement the loop counter
+ bne boxloop ; Do it again unless it's zero
+
+ ldx $2 ; Load the X velocity
+ ldy $3 ; Load the Y velocity
+
+ lda #$44 ; Pick a start point
+ sta $0 ; Ball position low
+ lda #$02
+ sta $1 ; Ball position high
+
+drawball:
+ txa ; Preserve X
+ pha
+ lda #1 ; Ball color (white)
+ ldx #0 ; Clear X for indirect addressing for writing to screen
+ sta ($0,x) ; Draw the ball
+ pla ; Restore X
+ tax
+
+decloop:
+ dex ; Decrement the X velocity
+ beq updatexpos ; If it's zero, time to adjust X
+ dey ; Decrement the Y velocity
+ bne decloop ; If it's not zero, loop, otherwise fall through to adjust Y
+
+updateypos:
+ txa ; Preserve X
+ pha
+ jsr clearball ; Put background over the current ball position
+updateyposnoclear:
+ lda $3 ; Get the Y velocity
+ and #1 ; See if it's down
+ bne moveup ; If not, then it's up, otherwise fall through to down
+
+movedown:
+ clc ; Prepare for moving to the next Y line and doing the add
+ lda $0 ; Low byte of the current ball position
+ adc #$20 ; Next row
+ sta $0 ; Put it back
+ bcc ycollision ; If no carry, go on to check for collision
+ inc $1 ; Had a carry, fix the high byte of the address
+ bne ycollision ; Z flag is always clear ($1 will never be zero)
+
+moveup:
+ sec ; Prepare for moving to the previous Y line and subtracting
+ lda $0 ; Low byte of the current ball position
+ sbc #$20 ; Previous row
+ sta $0 ; Put it back
+ lda $1 ; High byte
+ sbc #$0 ; Factor out the carry
+ sta $1 ; Put it back
+
+ycollision:
+ ldx #0 ; Prepare for indirect read
+ lda ($0,x) ; Get the current pixel at the new ball position
+ bne ycollided ; If it's not zero (the background color) then we hit
+ ldy $3 ; Otherwise, load up the current Y velocity
+ pla ; Restore the X velocity
+ tax
+ jmp drawball ; Back to the top
+
+ycollided:
+ cmp #$2 ; Border color?
+ beq ycollided2 ; If so, then we just bounce, don't eat a brick
+
+ ; Erase brick
+ lda #0 ; Background color (black)
+ sta ($0,x) ; Erase it
+
+ycollided2:
+ lda #1 ; Get ready to change direction
+ eor $3 ; Flip the low bit on the Y velocity (change direction)
+ sta $3 ; Put it back
+ jmp updateyposnoclear ; Go back to make sure we didn't hit anything else
+
+updatexpos:
+ jsr clearball ; Put background over the current ball position
+updatexposnoclear:
+ lda $2 ; Get the current X velocity
+ and #1 ; See if it's right by testing the low bit
+ bne moveleft ; If not, move left
+
+moveright:
+ inc $0 ; Move right
+ bne xcollision ; Z flag is always clear
+
+moveleft:
+ dec $0 ; Move left
+
+xcollision:
+ ldx #0 ; Prepare for indirect read
+ lda ($0,x) ; Get the current pixel at the new ball position
+ bne xcollided ; If it's not zero (the background color) then we hit
+ ldx $2 ; Otherwise, load up the current X velocity
+ jmp drawball ; Back to the top
+
+xcollided:
+ cmp #$2 ; Border color?
+ beq xcollided2 ; If so, then we just bounce, don't eat a brick
+
+ ; Erase brick
+ lda #0 ; Background color (black)
+ sta ($0,x) ; Erase it
+
+xcollided2:
+ lda #1 ; Get ready to change direction
+ eor $2 ; Flip the low bit on the X velocity (change direction)
+ sta $2 ; Put it back
+ jmp updatexposnoclear ; Go back to make sure we didn't hit anything else
+
+clearball:
+ lda #0 ; Background color (black)
+ tax ; Clear X for indirect
+ sta ($0,x) ; Black out the ball
+ rts ; Return to caller
+
diff --git a/hacks/images/m6502/byterun.asm b/hacks/images/m6502/byterun.asm
new file mode 100644
index 0000000..848b5c9
--- /dev/null
+++ b/hacks/images/m6502/byterun.asm
@@ -0,0 +1,100 @@
+; testing byterun compression
+
+start:
+ lda #<logo
+ sta $0
+ lda #>logo
+ sta $1
+ lda #$00
+ sta $2
+ lda #$02
+ sta $3
+
+decrunchLoop:
+ lda $3
+ cmp #$6
+ bne moreWork
+ rts
+moreWork:
+ ldy #0
+ lda ($0),y
+ cmp #$ff
+ bne notCrunched
+ iny
+ lda ($0),y ; repeat #
+ sta $4
+ iny
+ lda ($0),y ; color
+ ldy $4
+drawLoop:
+ ldx #0
+ sta ($2,x)
+ jsr nextPixel
+ dey
+ bne drawLoop
+ jsr getNextByte
+ jsr getNextByte
+ jmp decrunchLoop
+notCrunched:
+ ldx #0
+ sta ($2,x)
+ jsr nextPixel
+ jsr getNextByte
+ jmp decrunchLoop
+
+getNextByte:
+ inc $0
+ lda $0
+ cmp #$00
+ bne notHi
+ inc $1
+notHi:
+ rts
+
+nextPixel:
+ inc $2
+ ldx $2
+ cpx #$00
+ bne notNextLine
+ inc $3
+notNextLine:
+ rts
+
+
+logo:
+ dcb $ff,43,1,$f,$f,$f,$c,$f,$f,$f,$ff,24,1,$c,$f,$c,0
+ dcb $c,$f,$c,$ff,24,1,0,$f,$c,0,$c,$f,$c,$ff,24,1
+ dcb $c,$f,$c,0,$c,$f,$c,$ff,24,1,0,$f,$c,0,$c,$f,$c
+ dcb $ff,24,1,$c,$f,0,0,$c,$f,$c,$ff,24,1,0,$f,$c,0
+ dcb $c,$f,$c,$ff,24,1,0,$f,$c,0,$c,$f,0,$ff,24,1
+ dcb 0,$f,$c,0,$c,$f,0,$ff,23,1,$f,0,$f,$c,0,$c,$f,0,$f
+ dcb $ff,22,1,$c,0,1,$c,0,$c,$f,0,$c,$ff,21,1
+ dcb $f,0,0,1,0,0,$c,1,0,0,$ff,21,1,$c,0,$c,1,$c,0
+ dcb $c,1,$c,0,$c,$ff,19,1,$f,0,0,$f,1,$c,0
+ dcb $c,1,$f,0,0,$f,$ff,17,1,$f,0,0,0,1,1,$c,0
+ dcb $c,1,1,0,0,0,$ff,16,1,$f,0,0,0,$f,1,1,0,0
+ dcb $c,1,1,$f,0,0,0,$f,$ff,13,1
+ dcb $c,0,0,0,$c,1,1,1,$c,0,$c,1,1,1,$c,0,0,0,$c
+ dcb $ff,10,1,$c,0,0,0,0,$c,1,1,1,1,0,0
+ dcb $c,1,1,1,1,0,0,0,0,0,$c,$ff,8,1
+ dcb 0,0,0,0,$c,1,1,1,1,1,0,0
+ dcb $c,1,1,1,1,1,$c,0,0,0,0,1,1,1,1,1
+ dcb 1,1,1,1,0,0,$c,1,1,1,1,1,1,1,$c,0
+ dcb $c,1,1,1,1,1,1,$f,$c,0,0,$ff,18,1,$f
+ dcb $ff,53,1,0,$f,1,0,0,0,0,0,$f,1,$c
+ dcb $c,1,1,1,$c,0,0,0,1,1,0,$f,$f,1,1,1
+ dcb 1,1,1,1,$c,0,0,1,1,1,0,$f,1,1,$f,0
+ dcb 0,$f,1,1,0,$f,1,$c,$c,1,0,$f,1,1,1,1
+ dcb 1,1,1,1,0,$f,0,$f,1,1,0,$f,1,1,$f,$c
+ dcb $c,$c,1,1,0,1,1,$f,0,1,0,$f,1,1,1,1
+ dcb 1,1,1,1,0,1,$c,$f,1,1,$c,$f,1,1,0,$f
+ dcb $f,0,1,1,0,$f,$f,0,$f,1,0,$f,1,1,1,1
+ dcb 1,1,1,$c,0,$c,0,0,1,1,0,$f,1,1,0,$c
+ dcb $c,0,$f,1,0,$f,0,$f,1,1,0,$f,1,1,1,1
+ dcb 1,1,1,0,$c,$f,$f,0,$f,1,$c,$f,1,$c,$c,$f
+ dcb $f,$c,$c,1,0,1,$f,$c,1,1,0,$f,1,1,1,1
+ dcb 1,1,$f,0,1,1,1,$c,$c,1,0,$f,1,0,$f,1
+ dcb 1,$f,0,1,0,$f,1,0,$f,1,0,$f,$ff,16,1
+ dcb $f,$ff,5,1,$f,1,1,1,$f,$ff,38,1
+
+
diff --git a/hacks/images/m6502/cellular-30.asm b/hacks/images/m6502/cellular-30.asm
new file mode 100644
index 0000000..2439561
--- /dev/null
+++ b/hacks/images/m6502/cellular-30.asm
@@ -0,0 +1,67 @@
+; Rule 30 cellular automata
+; by D.S.
+
+ lda #1
+ sta $20f
+
+l3:
+ lda #2
+ sta 3
+ sta 5
+ sta 7
+ lda #1
+ sta 9
+ sta 6
+ lda #255
+ sta 8
+ lda #0
+ sta 2
+ lda #32
+ sta 4
+ ldx #30
+l1:
+ ldy #31
+
+l2:
+ lda ($2),y
+ ora ($6),y
+ eor ($8),y
+ sta ($4),y
+ dey
+ bpl l2
+
+ lda $2
+ adc #32
+ sta $2
+ lda $3
+ adc #0
+ sta $3
+ lda $4
+ adc #32
+ sta $4
+ lda $5
+ adc #0
+ sta $5
+ lda $6
+ adc #32
+ sta $6
+ lda $7
+ adc #0
+ sta $7
+ lda $8
+ adc #32
+ sta $8
+ lda $9
+ adc #0
+ sta $9
+ dex
+ bpl l1
+
+ ldy #31
+l4:
+ lda ($2),y
+ sta $200,y
+ dey
+ bpl l4
+
+ jmp l3
diff --git a/hacks/images/m6502/cellular-600.asm b/hacks/images/m6502/cellular-600.asm
new file mode 100644
index 0000000..db5497c
--- /dev/null
+++ b/hacks/images/m6502/cellular-600.asm
@@ -0,0 +1,209 @@
+; Code 600 cellular automata - by D.S.
+ lda #1
+ sta $22f
+
+l3:
+ ldy #29
+
+l2:
+ lda $220,y
+ adc $221,y
+ adc $222,y
+ tax
+ lda rule,x
+ sta $201,y
+ dey
+ bpl l2
+
+ ldy #$c0
+ sec
+ll2:
+ lda $503,y
+ sta $523,y
+ sta $53b,y
+ lda $504,y
+ sta $524,y
+ sta $53a,y
+ lda $505,y
+ sta $525,y
+ sta $539,y
+ lda $506,y
+ sta $526,y
+ sta $538,y
+ lda $507,y
+ sta $527,y
+ sta $537,y
+ lda $508,y
+ sta $528,y
+ sta $536,y
+ lda $509,y
+ sta $529,y
+ sta $535,y
+ lda $50a,y
+ sta $52a,y
+ sta $534,y
+ lda $50b,y
+ sta $52b,y
+ sta $533,y
+ lda $50c,y
+ sta $52c,y
+ sta $532,y
+ lda $50d,y
+ sta $52d,y
+ sta $531,y
+ lda $50e,y
+ sta $52e,y
+ sta $530,y
+ lda $50f,y
+ sta $52f,y
+ tya
+ adc #$df
+ tay
+ bcs ll2
+
+ ldy #$e0
+ sec
+ll3:
+ lda $403,y
+ sta $423,y
+ sta $43b,y
+ lda $404,y
+ sta $424,y
+ sta $43a,y
+ lda $405,y
+ sta $425,y
+ sta $439,y
+ lda $406,y
+ sta $426,y
+ sta $438,y
+ lda $407,y
+ sta $427,y
+ sta $437,y
+ lda $408,y
+ sta $428,y
+ sta $436,y
+ lda $409,y
+ sta $429,y
+ sta $435,y
+ lda $40a,y
+ sta $42a,y
+ sta $434,y
+ lda $40b,y
+ sta $42b,y
+ sta $433,y
+ lda $40c,y
+ sta $42c,y
+ sta $432,y
+ lda $40d,y
+ sta $42d,y
+ sta $431,y
+ lda $40e,y
+ sta $42e,y
+ sta $430,y
+ lda $40f,y
+ sta $42f,y
+ tya
+ adc #$df
+ tay
+ bcs ll3
+
+ ldy #$e0
+ sec
+ll4:
+ lda $303,y
+ sta $323,y
+ sta $33b,y
+ lda $304,y
+ sta $324,y
+ sta $33a,y
+ lda $305,y
+ sta $325,y
+ sta $339,y
+ lda $306,y
+ sta $326,y
+ sta $338,y
+ lda $307,y
+ sta $327,y
+ sta $337,y
+ lda $308,y
+ sta $328,y
+ sta $336,y
+ lda $309,y
+ sta $329,y
+ sta $335,y
+ lda $30a,y
+ sta $32a,y
+ sta $334,y
+ lda $30b,y
+ sta $32b,y
+ sta $333,y
+ lda $30c,y
+ sta $32c,y
+ sta $332,y
+ lda $30d,y
+ sta $32d,y
+ sta $331,y
+ lda $30e,y
+ sta $32e,y
+ sta $330,y
+ lda $30f,y
+ sta $32f,y
+ tya
+ adc #$df
+ tay
+ bcs ll4
+
+
+ ldy #$e0
+ sec
+ll1:
+ lda $203,y
+ sta $223,y
+ sta $23b,y
+ lda $204,y
+ sta $224,y
+ sta $23a,y
+ lda $205,y
+ sta $225,y
+ sta $239,y
+ lda $206,y
+ sta $226,y
+ sta $238,y
+ lda $207,y
+ sta $227,y
+ sta $237,y
+ lda $208,y
+ sta $228,y
+ sta $236,y
+ lda $209,y
+ sta $229,y
+ sta $235,y
+ lda $20a,y
+ sta $22a,y
+ sta $234,y
+ lda $20b,y
+ sta $22b,y
+ sta $233,y
+ lda $20c,y
+ sta $22c,y
+ sta $232,y
+ lda $20d,y
+ sta $22d,y
+ sta $231,y
+ lda $20e,y
+ sta $22e,y
+ sta $230,y
+ lda $20f,y
+ sta $22f,y
+ tya
+ adc #$df
+ tay
+ bcs ll1
+
+ jmp l3
+
+; Rules, uncomment only one line of the following.
+rule:
+ dcb 0,2,0,1,1,2,0 ; CODE 600
+; dcb 0,2,1,0,2,0,0 ; CODE 177
+; dcb 0,1,2,0,2,0,1; CODE 912 \ No newline at end of file
diff --git a/hacks/images/m6502/colors.asm b/hacks/images/m6502/colors.asm
new file mode 100644
index 0000000..2097f7a
--- /dev/null
+++ b/hacks/images/m6502/colors.asm
@@ -0,0 +1,46 @@
+; submitted by Anonymous
+
+ jmp $700
+ *=$700
+ ldx #0
+ ldy #0
+ ;init screen
+ lda #0
+ sta $0
+ sta $3
+ lda #2
+ sta $1
+loop:
+ lda colors,x
+ bpl ok
+ inc $0
+ ldx #0
+ lda colors,x
+ok:
+ inx
+ sta ($0),y
+ iny
+ bne ok2
+ inc $1
+ lda $1
+ cmp #6
+ beq end
+ok2:
+ jmp loop
+end:
+ inc $3
+ lda $3
+ and #$3f
+ tax
+ ldy #0
+ lda #2
+ sta $1
+ sty $0
+ jmp loop
+
+colors:
+dcb 0,2,0,2,2,8,2,8,8,7,8,7,7,1,7,1,1,7,1,7,7,8,7,8
+dcb 8,2,8,2,2,0,2,0,2,2,8,2,8,8,7,8,7,7,1,7,1,1,1,1
+dcb 1,1,1,1,7,1,7,7,8,7,8,8,2,8,2,2,255
+
+
diff --git a/hacks/images/m6502/crunch6502.asm b/hacks/images/m6502/crunch6502.asm
new file mode 100644
index 0000000..56ea507
--- /dev/null
+++ b/hacks/images/m6502/crunch6502.asm
@@ -0,0 +1,292 @@
+;; Show "6502" on the screen waving up and down.
+;; Jeremy English 29-December-2007
+;;
+;; Each digit is stored as a pattern of vertical bits.
+;; For example:
+;;
+;; 111111 This is the digit six. We think of the digit
+;; 111111 by it's column pattern. The column patterns
+;; 110000 are labeled at the bottom of the example.
+;; 110000 Pattern B is 1100110011. The basic algorithm
+;; 111111 is that we get the pattern, paint the first
+;; 111111 bit (1 foreground, 0 background) then dec y
+;; 110011 and get the next bit.
+;; 110011
+;; 111111 The pattern for each digit is:
+;; 111111 6 = AABBCC
+;; ------ 5 = DDBBCC
+;; AABBCC 0 = AAEEAA
+;; 2 = CCBBDD
+
+;; Addresses $0 and $1 are used by the paint subroutine.
+;; Addresses $2 through $6 are used by the display pattern subroutine
+;; Address $7 is used in the main loop
+;; Address $8 through $1a are used for the start positions
+;; Address $1b is used by the display pattern subroutine
+;; Address $1c is used as the color row offset.
+;; Addresses $d0 through $ef store the font table
+
+jmp init_font_table
+start:
+
+;; Initialize the pointers to the start position.
+lda #<y_start_pos1
+sta $b
+lda #>y_start_pos1
+sta $c
+lda #<y_start_pos2
+sta $d
+lda #>y_start_pos2
+sta $e
+lda #<y_start_pos3
+sta $f
+lda #>y_start_pos3
+sta $10
+lda #<y_start_pos4
+sta $11
+lda #>y_start_pos4
+sta $12
+lda #<y_start_pos5
+sta $13
+lda #>y_start_pos5
+sta $14
+lda #<y_start_pos4
+sta $15
+lda #>y_start_pos4
+sta $16
+lda #<y_start_pos3
+sta $17
+lda #>y_start_pos3
+sta $18
+lda #<y_start_pos2
+sta $19
+lda #>y_start_pos2
+sta $1a
+
+
+lda #0 ; start position to use
+sta $8
+
+main_loop:
+inc $1c ; increment the color offset.
+inc $1d ; increment the starting x position
+ldy $8 ; load the current start position index
+ldx $b,y ; get the lsb from the table
+txa
+sta $9 ; store the msb of the start position pointer
+iny ; move to the next position in the table
+ldx $b,y ; get the msb from the table
+txa
+sta $a ; store the lsb of the start position pointer
+iny ; move the index up by one
+tya
+cmp #$10 ; have we looked at all 16 start positions?
+bne store_idx ; if not then keep the index and store it
+lda #0 ; set the index back to zero
+store_idx:
+sta $8 ; save the index back in memory
+
+ldy #0
+lda #$ff
+sta $4 ; initialize the column to FF
+display_loop:
+ inc $4 ; increment the column
+ ldx $d0,y ; load the lsb from the font table
+ stx $2
+ iny
+ ldx $d0,y ; load the msb from the font table
+ stx $3
+ sty $7 ; save y in memory
+ jsr dis_pat ; Jump to the display pattern subroutine.
+ inc $4 ; increment the column
+ jsr dis_pat ; Each pattern gets painted twice so we have a thicker font
+ ldy $7 ; get y out of memory
+ iny ; increment the index
+ tya
+ cmp #$20 ; Did we display all of the columns?
+ bne display_loop ;if not continue
+jmp main_loop
+rts
+
+init_font_table:
+ ;;Setup a table in the zero page that contains the string "6502"
+ lda #<pattern_a ;start with digit 6. It's pattern is aabbcc
+ sta $d0
+ lda #>pattern_a
+ sta $d1
+ lda #<pattern_b
+ sta $d2
+ lda #>pattern_b
+ sta $d3
+ lda #<pattern_c
+ sta $d4
+ lda #>pattern_c
+ sta $d5
+ lda #<pattern_null ;We want to space everything out with blanks
+ sta $d6
+ lda #>pattern_null
+ sta $d7
+ lda #<pattern_d ;load memory for digit 5 ddbbcc
+ sta $d8
+ lda #>pattern_d
+ sta $d9
+ lda #<pattern_b
+ sta $da
+ lda #>pattern_b
+ sta $db
+ lda #<pattern_c
+ sta $dc
+ lda #>pattern_c
+ sta $dd
+ lda #<pattern_null
+ sta $de
+ lda #>pattern_null
+ sta $df
+ lda #<pattern_a ;load memory for digit 0 aaeeaa
+ sta $e0
+ lda #>pattern_a
+ sta $e1
+ lda #<pattern_e
+ sta $e2
+ lda #>pattern_e
+ sta $e3
+ lda #<pattern_a
+ sta $e4
+ lda #>pattern_a
+ sta $e5
+ lda #<pattern_null
+ sta $e6
+ lda #>pattern_null
+ sta $e7
+ lda #<pattern_c ;load memory for digit 2 ccbbdd
+ sta $e8
+ lda #>pattern_c
+ sta $e9
+ lda #<pattern_b
+ sta $ea
+ lda #>pattern_b
+ sta $eb
+ lda #<pattern_d
+ sta $ec
+ lda #>pattern_d
+ sta $ed
+ lda #<pattern_null
+ sta $ee
+ lda #>pattern_null
+ sta $ef
+ jmp start
+
+
+;; Display a pattern on the screen. The pattern to use is
+;; stored at $2 and $3. The current column is stored at $4.
+dis_pat:
+ ldy $4 ; Load the current column into y
+ lda ($9),y ; Get the start position for y
+ tay
+ sty $5 ; Store the starting position in memory
+ ldy #0 ; We have 12 bits that need to be painted
+dis_pat_loop:
+ lda ($2),y ; get a bit from the pattern
+ pha ; save the color on the stack
+ tya ; move the index into the accumulator
+ clc ; clear the carry
+ adc $5 ; add the starting position to the index
+ sty $6 ; store the index
+ tay ; The calculated y position
+ ldx $4 ; The x position is the current column
+ pla ; pop the color off of the stack
+ beq go_paint ; black just paint it
+ clc ; get rid of any carry bit
+ sty $1b ; save the y coordinate
+ tya
+ clc
+ adc $1c ; add the color offset
+ and #$7 ; make sure the look up is in range
+ tay ; move the new index into y so we can look up the color
+ lda color_row,y ; if not black get the row color
+ ldy $1b ; restore the y coordinate
+go_paint:
+ jsr paint ; paint the pixel on the screen
+ ldy $6 ; get the index out of memory
+ iny ; increment the index
+ tya
+ cmp #12 ; Have we looked at all of the bits?
+ bne dis_pat_loop ; if not then continue looking
+ rts ; else return from the subroutine
+
+;; Paint - Put a pixel on the screen by using the x registry for
+;; the x position, the y registry for the y position and
+;; the accumulator for the color.
+paint:
+ pha ; Save the color
+ lda yl,y ; Get the LSB of the memory address for y
+ sta $0 ; Store it first
+ lda yh,y ; Get the MSB of the memory address for y
+ sta $1 ; Store it next
+ txa ; We want x in the y registry so we transfer it to A
+ tay ; and then A into y.
+ pla ; Pop the color off of the stack
+ sta ($0),y ; Store the color at the correct y + x address.
+ rts ; return from the subroutine.
+
+;; Paint uses the following two tables to look up the
+;; correct address for a y coordinate between
+;; 0 and 31.
+
+;; Y cord MSB
+yh:
+ dcb $02, $02, $02, $02, $02, $02, $02, $02
+ dcb $03, $03, $03, $03, $03, $03, $03, $03
+ dcb $04, $04, $04, $04, $04, $04, $04, $04
+ dcb $05, $05, $05, $05, $05, $05, $05, $05
+;; Y cord LSB
+yl:
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+
+;; A zero is on the end of each pattern to clean up
+;; residue left by waving.
+pattern_a:
+ dcb 0,1,1,1,1,1,1,1,1,1,1,0
+
+pattern_b:
+ dcb 0,1,1,0,0,1,1,0,0,1,1,0
+
+pattern_c:
+ dcb 0,1,1,0,0,1,1,1,1,1,1,0
+
+pattern_d:
+ dcb 0,1,1,1,1,1,1,0,0,1,1,0
+
+pattern_e:
+ dcb 0,1,1,0,0,0,0,0,0,1,1,0
+
+pattern_null:
+ dcb 0,0,0,0,0,0,0,0,0,0,0,0
+
+;; Table that store the current start position
+;; of each y column.
+y_start_pos1:
+ dcb 10,10,9,9,8,8,7,7,6,6,7,7,8,8,9,9,10,10,9,9,8,8,7,7
+ dcb 6,6,7,7,8,8
+
+y_start_pos2:
+ dcb 9,9,8,8,8,8,8,8,7,7,8,8,8,8,8,8,9,9,8,8,8,8,8,8
+ dcb 7,7,8,8,8,8
+
+y_start_pos3:
+ dcb 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
+ dcb 8,8,8,8,8,8
+
+y_start_pos4:
+ dcb 7,7,8,8,8,8,8,8,9,9,8,8,8,8,8,8,7,7,8,8,8,8,8,8
+ dcb 9,9,8,8,8,8
+
+y_start_pos5:
+ dcb 6, 6,7,7,8,8,9,9,10,10,9,9,8,8,7,7, 6, 6,7,7,8,8,9,9
+ dcb 10,10,9,9,8,8
+
+color_row:
+ dcb $7,$8,$9,$2,$4,$6,$e,$3,$d,$5
diff --git a/hacks/images/m6502/demoscene.asm b/hacks/images/m6502/demoscene.asm
new file mode 100644
index 0000000..fdd9361
--- /dev/null
+++ b/hacks/images/m6502/demoscene.asm
@@ -0,0 +1,457 @@
+
+start:
+ ldx #0
+c:lda bottombar,x
+ cmp #$ff
+ beq init
+ sta $4e0,x
+ sta $5e0,x
+ inx
+ jmp c
+init:
+ jsr initDraw
+ lda #0
+ sta $10 ; scrptr
+ sta $11 ; txtptr
+loop:
+ jsr drawMain
+ jsr putfont
+ jsr scrollarea
+ jmp loop
+
+scrollarea:
+ ldx #0
+g:lda $521,x
+ sta $520,x
+ lda $541,x
+ sta $540,x
+ lda $561,x
+ sta $560,x
+ lda $581,x
+ sta $580,x
+ lda $5a1,x
+ sta $5a0,x
+ inx
+ cpx #31
+ bne g
+ rts
+
+putfont:
+ lda $10 ; scrptr
+ cmp #0
+ bne noNext
+ inc $11
+ ldx $11
+ lda scrolltext,x
+ tax
+ lda fontSize,x
+ sta $10
+noNext:
+ dec $10
+ ldx $11
+ lda scrolltext,x
+ cmp #$ff
+ bne notResetText
+ lda #0
+ sta $10
+ sta $11
+ rts
+
+notResetText:
+ asl
+ tax
+ lda fontlookup,x
+ sta $2
+ inx
+ lda fontlookup,x
+ sta $3
+ lda #<fonts
+ clc
+ adc $2
+ sta $0
+ lda #>fonts
+ adc $3
+ sta $1
+ ldy $10
+ lda ($00),y
+ sta $53f
+ tya
+ clc
+ adc #6
+ tay
+ lda ($00),y
+ sta $55f
+ tya
+ clc
+ adc #6
+ tay
+ lda ($00),y
+ sta $57f
+ tya
+ clc
+ adc #6
+ tay
+ lda ($00),y
+ sta $59f
+ tya
+ clc
+ adc #6
+ tay
+ lda ($00),y
+ sta $5bf
+ rts
+
+initDraw:
+ lda #<picture
+ sta $20
+ lda #>picture
+ sta $21
+ lda #$00
+ sta $22
+ lda #$02
+ sta $23
+ ldx #$0
+ rts
+drawMain:
+ ldx #0
+ lda ($20,x)
+ cmp #$ff
+ beq done
+ sta ($22,x)
+ inc $20
+ lda $20
+ cmp #$00
+ bne n1
+ inc $21
+n1:
+ inc $22
+ lda $22
+ cmp #$00
+ bne done
+ lda $23
+ cmp #$05
+ beq done
+ inc $23
+done:
+ rts
+
+picture:
+ dcb 0,0,0,0,0,0,0,0,0,$b,$b,$c,$f,$f,$f,$f
+ dcb $f,$b,0,0,0,$b,$b,$c,$c,$f,$f,$b,0,0,0,0
+ dcb 0,0,0,0,0,0,0,0,0,$b,$c,$c,$f,$c,$f,$f
+ dcb $b,$b,$b,$b,$b,0,$b,$b,$c,$f,$f,$c,0,0,0,0
+ dcb 0,0,0,0,0,0,0,$b,0,$c,$b,$f,$c,$f,$f,$c
+ dcb $c,$b,0,$b,$c,$c,$c,$f,$f,1,$f,$c,$b,0,0,0
+ dcb 0,0,0,0,0,0,0,0,$b,$b,$c,$c,$c,$f,$f,$f
+ dcb $c,$c,$c,$c,$c,$c,$f,$c,$f,$f,$f,$f,$b,0,0,0
+ dcb 0,0,0,0,0,0,0,$b,0,0,$b,$c,$c,$f,$f,$f
+ dcb $f,$c,$f,$f,$f,$f,$f,$f,$f,1,$f,$f,$c,0,0,0
+ dcb 0,0,0,0,0,0,0,0,0,$b,$b,$b,$c,$f,$f,1
+ dcb $f,$f,$c,$f,$f,$f,1,$f,$f,$f,$f,$f,$f,0,0,0
+ dcb 0,0,0,0,0,0,0,0,0,$b,$b,$b,$b,$c,$f,1
+ dcb $f,$f,$f,$f,$f,$f,$f,$f,1,$f,$f,$f,$f,$b,0,0
+ dcb 0,0,0,0,0,0,0,0,$b,0,$b,$c,$b,$c,$c,1
+ dcb 1,$f,1,$f,1,$f,1,$f,$f,1,$f,$f,1,$b,0,0
+ dcb 0,0,0,0,0,0,0,$b,$b,$b,$c,$c,$b,$c,$f,1
+ dcb 1,1,$f,$f,1,$f,$f,1,$f,$f,$f,$f,1,$c,0,0
+ dcb 0,0,0,0,0,0,0,$b,$b,$c,$c,$c,$b,$c,$c,$f
+ dcb 1,1,1,$f,$f,1,$f,1,$f,1,$f,$f,1,$c,0,0
+ dcb 0,0,0,0,0,$b,$b,$b,$c,$c,$c,$f,$c,$c,$f,$f
+ dcb 1,1,1,1,$f,$f,$f,1,$f,1,$f,$f,$f,$f,0,0
+ dcb 0,0,0,0,0,0,$b,$c,$c,$c,$f,$c,$f,$c,$f,$f
+ dcb 1,1,1,1,1,$f,$f,1,$f,$f,$f,$f,1,$f,$b,0
+ dcb 0,0,0,0,$b,$b,$b,$c,$c,$f,$c,$f,$f,$c,$f,$f
+ dcb 1,1,1,1,1,$f,$f,$f,1,$f,$f,$f,1,$c,$b,$b
+ dcb 0,0,0,0,$b,$b,$c,$f,$c,$f,$f,$f,$f,$f,$c,$f
+ dcb 1,1,1,1,1,$f,$f,$f,1,$f,$f,$f,$f,$f,$b,$b
+ dcb 0,0,0,0,$b,$c,$c,$c,$f,$f,$f,$f,$f,$f,$f,$f
+ dcb $f,1,1,1,$f,$b,$f,$f,$f,1,$f,$f,$f,$f,$b,$b
+ dcb 0,0,0,0,$b,$c,$c,$f,$c,$f,$f,$f,$f,$f,$f,$f
+ dcb $f,$f,$f,$c,$b,$f,$f,1,$f,$f,$f,$f,$f,$f,$c,$b
+ dcb 0,0,0,0,$b,$b,$c,$c,$f,$c,$f,$f,$f,$f,$f,$f
+ dcb $c,$c,$b,$c,$c,$f,$f,1,$c,$c,$f,$f,$f,$f,$c,$b
+ dcb 0,0,0,0,$b,$b,$c,$c,$c,$f,$f,$f,$f,$f,$f,$f
+ dcb $f,$f,$f,$f,$f,1,$f,$c,$b,$f,$c,$f,$c,$f,$c,$b
+ dcb 0,0,0,0,0,$b,$c,$c,$c,$c,$f,$f,$f,$f,$f,$f
+ dcb $f,$f,$f,$f,$f,$c,$b,$c,$c,$c,$f,$f,$c,$f,$c,$c
+ dcb 0,0,0,0,0,$b,$b,$c,$c,$c,$c,$c,$f,$f,$f,$f
+ dcb $f,$f,$f,$c,$b,$b,$c,$c,$c,$f,$c,$f,$f,$f,$c,$b
+ dcb 0,0,0,0,0,$b,$b,$b,$b,$c,$c,$f,$c,$f,$f,$f
+ dcb $c,$c,$b,$b,$b,$c,$b,$b,$c,$c,$f,$c,$c,$f,$c,$c
+ dcb 0,0,0,0,0,0,$b,$b,$c,$b,$c,$c,$c,$c,$c,$c
+ dcb $b,$b,$b,$b,$c,$b,$b,$c,$c,$f,$f,$f,$c,$c,$c,$b
+ dcb 0,0,0,0,0,0,0,0,$b,$b,$b,$c,$c,$c,$c,$c
+ dcb $c,$c,$b,$b,$b,$b,$c,$c,$f,$f,$f,$c,$c,$c,$c,$c
+ dcb $ff
+
+
+fontSize:
+ dcb 5,5,5,5,5,5,5,5 ;abcdefgh
+ dcb 2,5,5,5,6,6,5,5 ;ijklmnop
+ dcb 6,5,5,4,5,6,6,6 ;qrstuvwx
+ dcb 6,5,2,3 ;yz.[SPACE]
+
+;
+; a=0, b=1, c=2, d=3....
+;
+
+scrolltext:
+ dcb 0
+
+ dcb 14,13,11,24,27 ; "only "
+ dcb 03,04,15,19,07,27 ; "depth "
+ dcb 12,0,10,4,18,27 ; "makes "
+ dcb 8,19,27 ; "it "
+ dcb 15,14,18,18,8,1,11,4 ; "possible"
+ dcb 26,26,26 ; "..."
+ dcb 19,7,8,18,27 ; "this "
+ dcb 8,18,27 ; "is "
+ dcb 19,7,4,27 ; "the "
+ dcb 5,8,17,18,19,27 ; "first "
+ dcb 3,4,12,14,27 ; "demo "
+ dcb 12,0,3,4,27 ; "made "
+ dcb 8,13,27 ; "in "
+ dcb 19,7,8,18,27 ; "this "
+ dcb 4,13,21,26,26,26,26,27 ; "env.... "
+ dcb 7,14,15,4,27 ; "hope "
+ dcb 24,14,20,27 ; "you "
+ dcb 11,8,10,4,27 ; "like "
+ dcb 8,19,26,26,26,27,27 ; "it... "
+ dcb 22,22,22,26 ; "www."
+ dcb 3,4,15,19,7,26 ; "depth."
+ dcb 14,17,6,27,27,27,27,27 ; "org "
+
+ dcb $ff ; end of text
+
+fontlookup:
+ dcb $00,$00 ;a
+ dcb $20,$00 ;b
+ dcb $40,$00 ;c
+ dcb $60,$00 ;d
+ dcb $80,$00 ;e
+ dcb $a0,$00 ;f
+ dcb $c0,$00 ;g
+ dcb $e0,$00 ;h
+ dcb $00,$01 ;i
+ dcb $20,$01 ;j
+ dcb $40,$01 ;k
+ dcb $60,$01 ;l
+ dcb $80,$01 ;m
+ dcb $a0,$01 ;n
+ dcb $c0,$01 ;o
+ dcb $e0,$01 ;p
+ dcb $00,$02 ;q
+ dcb $20,$02 ;r
+ dcb $40,$02 ;s
+ dcb $60,$02 ;t
+ dcb $80,$02 ;u
+ dcb $a0,$02 ;v
+ dcb $c0,$02 ;w
+ dcb $e0,$02 ;x
+ dcb $00,$03 ;y
+ dcb $20,$03 ;z
+ dcb $40,$03 ;.
+ dcb $60,$03 ;" "
+
+fonts:
+ dcb 0,1,1,0,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,1,1,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,0
+
+ dcb 0,1,1,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,1,0,0
+ dcb 0,0
+
+ dcb 0,1,1,0,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,0,0,0
+ dcb 0,0
+
+ dcb 0,1,1,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,1,0,0
+ dcb 0,0
+
+ dcb 1,1,1,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,1,1,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 1,1,1,1,0,0
+ dcb 0,0
+
+ dcb 1,1,1,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,1,1,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,0
+
+ dcb 1,1,1,0,0,0
+ dcb 0,0,0,1,0,0
+ dcb 1,1,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,1,1,0,0,0
+ dcb 0,0
+
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,1,1,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,0
+
+ dcb 1,0,0,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 0,0
+
+ dcb 1,0,0,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,0,0,0
+ dcb 0,0
+
+ dcb 1,0,0,1,0,0
+ dcb 0,1,0,1,0,0
+ dcb 0,0,1,1,0,0
+ dcb 0,1,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,0
+
+ dcb 0,0,0,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 1,1,1,1,0,0
+ dcb 0,0
+
+ dcb 1,0,0,0,1,0
+ dcb 1,1,0,1,1,0
+ dcb 1,0,1,0,1,0
+ dcb 1,0,0,0,1,0
+ dcb 1,0,0,0,1,0
+ dcb 0,0
+
+ dcb 1,0,0,0,1,0
+ dcb 1,0,0,1,1,0
+ dcb 1,0,1,0,1,0
+ dcb 1,1,0,0,1,0
+ dcb 1,0,0,0,1,0
+ dcb 0,0
+
+ dcb 0,1,1,0,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,0,0,0
+ dcb 0,0
+
+ dcb 0,1,1,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,0
+
+ dcb 0,1,1,0,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,0,1,0,0
+ dcb 1,0,1,0,0,0
+ dcb 0,0
+
+ dcb 0,1,1,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,1,1,1,0,0
+ dcb 0,1,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 0,0
+
+ dcb 1,1,1,0,0,0
+ dcb 0,0,0,1,0,0
+ dcb 0,1,1,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 0,1,1,1,0,0
+ dcb 0,0
+
+ dcb 1,1,1,0,0,0
+ dcb 0,1,0,0,0,0
+ dcb 0,1,0,0,0,0
+ dcb 0,1,0,0,0,0
+ dcb 0,1,0,0,0,0
+ dcb 0,0
+
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,0,0,1,0,0
+ dcb 1,1,1,0,0,0
+ dcb 0,0
+
+ dcb 1,0,0,0,1,0
+ dcb 1,0,0,0,1,0
+ dcb 1,0,0,0,1,0
+ dcb 0,1,0,1,0,0
+ dcb 0,0,1,0,0,0
+ dcb 0,0
+
+ dcb 1,0,0,0,1,0
+ dcb 1,0,0,0,1,0
+ dcb 1,0,1,0,1,0
+ dcb 1,1,0,1,1,0
+ dcb 1,0,0,0,1,0
+ dcb 0,0
+
+ dcb 1,0,0,0,1,0
+ dcb 0,1,0,1,0,0
+ dcb 0,0,1,0,0,0
+ dcb 0,1,0,1,0,0
+ dcb 1,0,0,0,1,0
+ dcb 0,0
+
+ dcb 1,0,0,0,1,0
+ dcb 0,1,0,1,0,0
+ dcb 0,0,1,0,0,0
+ dcb 0,0,1,0,0,0
+ dcb 0,0,1,0,0,0
+ dcb 0,0
+
+ dcb 1,1,1,1,0,0 ; z
+ dcb 1,0,0,0,0,0
+ dcb 0,1,1,0,0,0
+ dcb 0,0,0,1,0,0
+ dcb 1,1,1,1,0,0
+ dcb 0,0
+
+ dcb 0,0,0,0,0,0 ; .
+ dcb 0,0,0,0,0,0
+ dcb 0,0,0,0,0,0
+ dcb 0,0,0,0,0,0
+ dcb 1,0,0,0,0,0
+ dcb 0,0
+
+ dcb 0,0,0,0,0,0 ; " "
+ dcb 0,0,0,0,0,0
+ dcb 0,0,0,0,0,0
+ dcb 0,0,0,0,0,0
+ dcb 0,0,0,0,0,0
+ dcb 0,0
+
+bottombar:
+ dcb $b,$9,$b,9,8,9,8,$a,8,$a,7,$a,7,1,7,1,1
+ dcb 7,1,7,$a,7,$a,8,$a,8,9,8,9,$b,9,$b
+ dcb $ff
+
diff --git a/hacks/images/m6502/disco.asm b/hacks/images/m6502/disco.asm
new file mode 100644
index 0000000..bc69d70
--- /dev/null
+++ b/hacks/images/m6502/disco.asm
@@ -0,0 +1,23 @@
+; DISCO DISCO
+; submitted by Anonymous
+
+start:
+ inx
+ txa
+ sta $200, y
+ sta $300, y
+ sta $400, y
+ sta $500, y
+ iny
+ tya
+ cmp 16
+ bne do
+ iny
+ jmp start
+do:
+ iny
+ iny
+ iny
+ iny
+jmp start
+
diff --git a/hacks/images/m6502/dmsc.asm b/hacks/images/m6502/dmsc.asm
new file mode 100644
index 0000000..9a0ae6b
--- /dev/null
+++ b/hacks/images/m6502/dmsc.asm
@@ -0,0 +1,130 @@
+;
+; 6502 Assembler Demo.
+; Copyright (C) 2007 Daniel Serpell <daniel.serpell@gmail.com>
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions are met:
+;
+; 1. Redistributions of source code must retain the above copyright notice,
+; this list of conditions and the following disclaimer.
+;
+; 2. 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.
+;
+; 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 HOLDER 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.
+;
+; By DMSC - daniel.serpell@gmail.com
+;
+; See xscreensaver/hacks/images/m6502/dsmc.txt for the source
+;
+ dcb 76, 94, 11,133, 32,162, 8,160, 8,145, 16,136,208,251,165, 16
+ dcb 24,105, 32,133, 16,165, 17,105, 0,133, 17,165, 32,202,208,231
+ dcb 96,230, 48,165, 48, 41, 63,133, 48,170,189,106, 6,170,189, 8
+ dcb 3,105, 1, 41, 3,157, 8, 3,138, 73,231,170,189, 0, 2,105
+ dcb 1, 41, 3,157, 0, 2,165, 48, 73, 63,170,189,106, 6, 73,224
+ dcb 170,189, 8, 2,105, 1, 41, 3,157, 8, 2,138, 73,231,170,189
+ dcb 0, 3,105, 1, 41, 3,157, 0, 3, 96,224,192,160,128, 96,225
+ dcb 64,193,161,226,129, 32,194, 97,162,227,195,130,228, 65,163,196
+ dcb 98,229,131,164,197,230,231,132,165,198, 99, 66, 33, 0,199,166
+ dcb 133,100,167, 67,134,101,135, 34, 68,102,103, 69, 35, 70, 71, 36
+ dcb 1, 37, 38, 39, 2, 3, 4, 5, 6, 7,166, 48,189,198, 6,170
+ dcb 254, 24, 3, 73, 7,170,254, 16, 3, 73,231,170,254, 24, 2, 73
+ dcb 7,170,254, 16, 2, 96, 0, 32, 1, 33, 64, 2, 65, 34, 96, 66
+ dcb 3, 97, 35, 98, 67,128, 4,129, 36, 99,130, 68,160, 5,161,131
+ dcb 100, 37,162, 69,132,192,163,101, 6,193, 38,194, 70,164,133,195
+ dcb 102,224, 7,225, 39,165,226,196,134, 71,227,103,197,166,228,135
+ dcb 198,229,167,230,199,231,166, 49,189, 21, 7,170,189, 0,160,157
+ dcb 0, 5,230, 49, 96,195,227,194,162,228, 97,226,128,129,130,225
+ dcb 64,161,163,224, 96,160,193,196, 32, 98,192, 65, 0,131,229,164
+ dcb 33, 99,197, 66,132, 1,230, 34,165, 67,100,198, 2, 3, 68, 6
+ dcb 35,133,166, 5,101, 4,199, 7, 36,231, 69,134,167, 37, 38,102
+ dcb 135, 70,232, 71, 39,103,136,200,168, 8, 11, 10,169,233,104, 9
+ dcb 12,137,201, 13, 40, 44, 72, 43,170, 42, 45, 41,105, 73,202, 14
+ dcb 138,234, 74, 75,106,203, 76,171, 46, 77,235,107,139, 15,108,172
+ dcb 174,140,173,141,142,204,109,206,207,205, 78,175, 47,236,239,143
+ dcb 237,238,110,240,241,111,208, 16, 79,176,209,242, 48,144,243, 80
+ dcb 177,244,112,210, 17, 49,178,179, 52, 53,147, 18, 81,211,145, 19
+ dcb 146, 51, 85,180, 20, 54,113,148, 22, 50, 84,212, 21, 55,115,245
+ dcb 83,114,116, 23, 82, 86, 88, 89, 87,118,117,119,149,213, 56, 57
+ dcb 181,214, 90,121,122,150,151,182,183,215,246, 58,120,247, 24,153
+ dcb 184,152,216, 25, 26, 59, 91,248,123,185, 27, 60,217,154, 28, 92
+ dcb 249, 29,155,186, 61,218, 93,124,250,187, 30,251, 62,156, 94,125
+ dcb 219,188, 31,252,254,220,253, 63,126,255,157,221, 95,159,191,222
+ dcb 127,189,223,158,190,165, 66, 41,224,208, 72,165, 66, 24,105, 1
+ dcb 41, 31,133, 66,165, 67,240, 7,198, 67,169, 0, 76, 97, 8,198
+ dcb 69,240,247, 16, 37,166, 64,230, 64,189,177, 9, 16, 15, 41,127
+ dcb 133, 67, 73,127,208,228,169, 1,133, 70, 76, 42, 8,170,189,117
+ dcb 8,133, 69,234,234,189,181, 8,133, 65,166, 65,230, 65,189,245
+ dcb 8,133, 68,165, 66, 24,105,224,133, 66,166, 66,169, 1,102, 68
+ dcb 42,157, 0,160, 96, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2
+ dcb 3, 2, 3, 3, 3, 3, 3, 1, 2, 3, 1, 5, 3, 3, 3, 3
+ dcb 3, 2, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 4, 3, 3, 4
+ dcb 4, 1, 3, 4, 3, 5, 5, 5, 4, 5, 4, 4, 3, 4, 4, 7
+ dcb 4, 4, 4, 2, 1, 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30
+ dcb 32, 35, 35, 38, 40, 43, 46, 49, 50, 52, 4, 55, 55, 60, 63, 65
+ dcb 68, 71, 73, 75, 78, 78, 33, 83, 86, 89, 94, 98,102,106,109,112
+ dcb 116, 94,120,123,127,130,134,139,144,148,153,157,161,164,167,171
+ dcb 178,171,182,186, 5, 56, 68, 56, 36,124, 4, 76, 84, 36, 68, 84
+ dcb 40, 24, 40,124,100, 84, 88, 56, 84, 72, 76, 80, 96, 40, 84, 40
+ dcb 36, 84, 56, 44, 28,124, 36, 24, 24, 36,124, 24, 52, 16, 60, 80
+ dcb 24, 37, 30,124, 32, 28,188, 1,190,124, 24, 36, 60, 32, 28, 32
+ dcb 28, 24, 36, 24, 63, 36, 24, 36, 63, 60, 16, 32, 52, 44,120, 36
+ dcb 56, 4, 60, 56, 4, 56, 4, 56, 57, 6, 56, 44, 52, 36, 12, 48
+ dcb 208, 48, 12,252,164,164, 88,120,132,132, 72,252,132,132,120,252
+ dcb 164,132,252,160,128,120,132,164, 56,252, 32, 32,252, 8, 4,248
+ dcb 252, 48, 80,140,252, 4, 4,252, 64, 60, 64,252, 64, 48, 8,252
+ dcb 120,132,132,132,120,252,144,144, 96,120,132,134,133,120,252,144
+ dcb 144,108, 68,164,164,152,128,252,128,248, 4, 4,248, 4, 8,240
+ dcb 224, 28, 16,224, 28, 16,224,204, 48, 48,204,140,148,164,196, 0
+ dcb 0,133, 41, 10, 28, 29, 63, 63, 63,136, 15, 10, 28, 29, 14, 27
+ dcb 63, 63, 63,132, 55, 17, 18, 28, 62, 18, 28, 62, 10,136, 27, 14
+ dcb 10, 21, 21, 34,143, 15, 10, 28, 29,142, 39, 40, 48, 50,149,145
+ dcb 10, 23, 13, 62, 23, 24, 32,136, 28, 24, 22, 14,136, 11, 14, 10
+ dcb 30, 29, 18, 15, 30, 21,128, 14, 15, 15, 14, 12, 29, 28, 63, 63
+ dcb 63,144,159,255, 55, 17, 18, 28, 62, 18, 28, 62, 10, 21, 21,129
+ dcb 15, 24, 27, 62, 23, 24, 32,136, 11, 34, 14, 63, 63, 63,141, 63
+ dcb 63, 63, 11, 34, 14,150,159,143, 11, 34, 62, 39, 48, 54, 38, 2
+ dcb 0, 0, 7, 63, 5, 63, 2, 9, 11, 34, 62, 39, 48, 54, 38, 2
+ dcb 0, 0, 7, 63, 5, 63, 2, 9, 11, 34, 62, 39, 48, 54, 38, 2
+ dcb 0, 0, 7, 63, 5, 63, 2, 9,143,159,255,169, 0,133, 42,169
+ dcb 1,133, 44,133, 45,169, 0,133, 32,169,160,133, 33,165, 42,133
+ dcb 43,162, 15,160, 15,145, 32, 24,101, 44,230, 44,136, 16,246,165
+ dcb 32, 24,105, 32,133, 32,165, 33,105, 0,133, 33,169, 1,133, 44
+ dcb 165, 43, 24,101, 45,133, 43,230, 45,202, 16,215,169, 0,133, 32
+ dcb 169,160,133, 33,169,224,133, 34,169, 3,133, 35,169, 0,133, 36
+ dcb 169, 4,133, 37,169,240,133, 38,169, 3,133, 39,169, 16,133, 40
+ dcb 169, 4,133, 41,169, 15,133, 46,160, 15,177, 32, 74, 74, 74, 74
+ dcb 170,189, 62, 11,209, 34,240, 18,145, 34,145, 36,170,152, 73, 15
+ dcb 168,138,145, 38,145, 40,152, 73, 15,168,136, 16,221,165, 32, 24
+ dcb 105, 32,133, 32,165, 33,105, 0,133, 33,165, 34, 24,105,224,133
+ dcb 34,165, 35,105,255,133, 35,165, 36, 24,105, 32,133, 36,165, 37
+ dcb 105, 0,133, 37,165, 38, 24,105,224,133, 38,165, 39,105,255,133
+ dcb 39,165, 40, 24,105, 32,133, 40,165, 41,105, 0,133, 41,198, 46
+ dcb 16,150,230, 42,165, 42, 41, 63,240, 3, 76, 95, 10, 96, 0, 11
+ dcb 12, 15, 1, 15, 12, 11, 0, 11, 12, 15, 1, 15, 12, 11, 0, 11
+ dcb 12, 15, 1, 15, 12, 11, 0, 11, 12, 15, 1, 15, 12, 11,169, 1
+ dcb 162,255,134, 16,162, 1,134, 17, 32, 3, 6,169, 2,162, 7,134
+ dcb 16,162, 2,134, 17, 32, 3, 6,169, 3,162, 7,134, 16,162, 3
+ dcb 134, 17, 32, 3, 6,169, 31,133, 66,169, 0,133, 70,133, 67,133
+ dcb 64,169, 1,141,109, 8,169, 0,141,114, 8,169,160,141,115, 8
+ dcb 169, 63,133, 48,169,128,133, 49,169, 3,141,109, 8,169, 0,170
+ dcb 157, 0,160,232,208,250, 32, 33, 6, 32,170, 6, 32, 6, 7, 32
+ dcb 21, 8,165, 66, 73, 31,208, 13,173,109, 8, 24,105, 2, 41, 3
+ dcb 105, 3,141,109, 8,165, 49,208,221,173, 17, 7, 73, 1,141, 17
+ dcb 7,165, 70,240,209, 32, 29, 12, 32, 91, 10,169, 31,133, 66,169
+ dcb 0,133, 70,133, 67,141,109, 8,169, 0,141,114, 8,169, 3,141
+ dcb 115, 8, 32, 29, 12, 32, 21, 8,165, 66, 73, 31,208,247,173,115
+ dcb 8, 73, 7,141,115, 8,165, 70,240,235, 76, 94, 11,169, 0,170
+ dcb 157, 0, 2,157, 0, 3,157, 0, 4,157, 0, 5,232,208,241, 96
+
diff --git a/hacks/images/m6502/dmsc.txt b/hacks/images/m6502/dmsc.txt
new file mode 100644
index 0000000..7e19f6b
--- /dev/null
+++ b/hacks/images/m6502/dmsc.txt
@@ -0,0 +1,768 @@
+;
+; 6502 Assembler Demo.
+; Copyright (C) 2007 Daniel Serpell <daniel.serpell@gmail.com>
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions are met:
+;
+; 1. Redistributions of source code must retain the above copyright notice,
+; this list of conditions and the following disclaimer.
+;
+; 2. 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.
+;
+; 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 HOLDER 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.
+;
+
+; Variable definitions
+ temp0 = $20
+ temp1 = $21
+ temp2 = $22
+ temp3 = $23
+ temp4 = $24
+ temp5 = $25
+
+ param0 = $10
+ param1 = $11
+ param2 = $12
+ param3 = $13
+
+
+; Output file
+ !to "all.bin", plain
+
+; Start of code
+ *= $600
+ jmp main
+
+; Used in "gira" and "circ"
+
+ gira_pos = $30
+ gira_scr = $200
+ circ_pos = $30
+ circ_scr = $210
+ show_pos = $31
+ show_source = $a000
+ show_dest = $500
+ text_state = $40
+ text_scr = $a000
+; text_scr = $480
+ moire_buf = $a000
+ moire_scr = $200
+ moire_temp = $20
+
+; Include routines and macros
+
+: ===========================================================================
+: !source "fillRect.asm"
+: ===========================================================================
+
+ !zone {
+
+; Uses the following:
+; params: param0, param1
+; temps: temp0
+
+
+; Locals
+ .color = temp0
+
+; Params
+ fillRect_buffer = param0
+ .buf = fillRect_buffer
+
+; fillRect:
+; Fill a rectangle of 8x8 pixels with a color.
+; input: A = color index
+; .buffer = output buffer (address)
+ !macro fillRect .buffer {
+ ldx #<.buffer
+ stx fillRect_buffer
+ ldx #>.buffer
+ stx fillRect_buffer+1
+ jsr fillRect_code
+ }
+
+; fillRect:
+; Fill a rectangle of 8x8 pixels with a color.
+; input: .color = color index
+; .buffer = output buffer (address)
+ !macro fillRect .buffer, .color {
+ lda #.color
+ +fillRect .buffer
+ }
+
+fillRect_code:
+ sta .color
+ ldx #8
+--
+ ldy #8
+-
+ sta (.buf),y
+ dey
+ bne -
+
+ lda .buf
+ clc
+ adc #32
+ sta .buf
+ lda .buf+1
+ adc #0
+ sta .buf+1
+ lda .color
+ dex
+ bne --
+
+ rts
+
+}
+
+
+: ===========================================================================
+: !source "gira.asm"
+: ===========================================================================
+
+ !zone {
+
+;
+; define "gira_pos" and "gira_scr" before including
+;
+ .pos = gira_pos
+ .scr00 = gira_scr
+ .scr01 = gira_scr + $8
+ .scr10 = gira_scr + $100
+ .scr11 = gira_scr + $108
+
+; gira:
+ !macro gira {
+ jsr gira_code
+ }
+
+; init code:
+ !macro giraInit {
+ +fillRect gira_scr-1, 1
+ +fillRect gira_scr+7, 2
+ +fillRect gira_scr+$107, 3
+ }
+
+gira_code:
+
+ inc .pos
+ lda .pos
+ and #63
+ sta .pos
+ tax
+
+ lda .tabla,x
+ tax
+ lda .scr11,x
+ adc #1
+ and #3
+
+ sta .scr11,x
+ txa
+ eor #$E7
+ tax
+ lda .scr00,x
+ adc #1
+ and #3
+ sta .scr00,x
+
+ lda .pos
+ eor #63
+ tax
+ lda .tabla,x
+ eor #$E0
+ tax
+ lda .scr01,x
+ adc #1
+ and #3
+ sta .scr01,x
+
+ txa
+ eor #$E7
+ tax
+ lda .scr10,x
+ adc #1
+ and #3
+ sta .scr10,x
+
+ rts
+
+.tabla
+ !byte 224, 192, 160, 128, 96, 225, 64, 193, 161, 226, 129, 32, 194, 97, 162, 227
+ !byte 195, 130, 228, 65, 163, 196, 98, 229, 131, 164, 197, 230, 231, 132, 165, 198
+ !byte 99, 66, 33, 0, 199, 166, 133, 100, 167, 67, 134, 101, 135, 34, 68, 102
+ !byte 103, 69, 35, 70, 71, 36, 1, 37, 38, 39, 2, 3, 4, 5, 6, 7
+
+}
+
+: ===========================================================================
+: !source "circ.asm"
+: ===========================================================================
+
+ !zone {
+;
+; define "circ_pos" before including
+;
+
+ .pos = circ_pos
+ .scr00 = circ_scr
+ .scr01 = circ_scr + $8
+ .scr10 = circ_scr + $100
+ .scr11 = circ_scr + $108
+
+; circ:
+ !macro circ {
+ jsr circ_code
+ }
+
+circ_code:
+
+ ldx .pos
+ lda .tabla,x
+ tax
+ inc .scr11,x
+ eor #07
+ tax
+ inc .scr10,x
+ eor #$e7
+ tax
+ inc .scr01,x
+ eor #07
+ tax
+ inc .scr00,x
+
+ rts
+
+.tabla
+ !byte 0, 32, 1, 33, 64, 2, 65, 34, 96, 66, 3, 97, 35, 98, 67, 128
+ !byte 4, 129, 36, 99, 130, 68, 160, 5, 161, 131, 100, 37, 162, 69, 132, 192
+ !byte 163, 101, 6, 193, 38, 194, 70, 164, 133, 195, 102, 224, 7, 225, 39, 165
+ !byte 226, 196, 134, 71, 227, 103, 197, 166, 228, 135, 198, 229, 167, 230, 199, 231
+
+}
+
+
+: ===========================================================================
+ !source "mapcopy.asm"
+: ===========================================================================
+
+ !zone {
+
+;
+; define "show_pos" and "show_scr" before including
+;
+ .pos = show_pos
+ .source = show_source
+ .dest = show_dest
+
+; show:
+ !macro show {
+ jsr show_code
+ }
+
+show_code
+ ldx .pos
+ lda .tabla,x
+ tax
+.source_label
+ lda .source,x
+.dest_label
+ sta .dest,x
+ inc .pos
+ rts
+
+ show_source_addr = .source_label + 1
+ show_dest_addr = .dest_label + 1
+
+.tabla
+ !byte 195, 227, 194, 162, 228, 97, 226, 128, 129, 130, 225, 64, 161, 163, 224, 96
+ !byte 160, 193, 196, 32, 98, 192, 65, 0, 131, 229, 164, 33, 99, 197, 66, 132
+ !byte 1, 230, 34, 165, 67, 100, 198, 2, 3, 68, 6, 35, 133, 166, 5, 101
+ !byte 4, 199, 7, 36, 231, 69, 134, 167, 37, 38, 102, 135, 70, 232, 71, 39
+ !byte 103, 136, 200, 168, 8, 11, 10, 169, 233, 104, 9, 12, 137, 201, 13, 40
+ !byte 44, 72, 43, 170, 42, 45, 41, 105, 73, 202, 14, 138, 234, 74, 75, 106
+ !byte 203, 76, 171, 46, 77, 235, 107, 139, 15, 108, 172, 174, 140, 173, 141, 142
+ !byte 204, 109, 206, 207, 205, 78, 175, 47, 236, 239, 143, 237, 238, 110, 240, 241
+ !byte 111, 208, 16, 79, 176, 209, 242, 48, 144, 243, 80, 177, 244, 112, 210, 17
+ !byte 49, 178, 179, 52, 53, 147, 18, 81, 211, 145, 19, 146, 51, 85, 180, 20
+ !byte 54, 113, 148, 22, 50, 84, 212, 21, 55, 115, 245, 83, 114, 116, 23, 82
+ !byte 86, 88, 89, 87, 118, 117, 119, 149, 213, 56, 57, 181, 214, 90, 121, 122
+ !byte 150, 151, 182, 183, 215, 246, 58, 120, 247, 24, 153, 184, 152, 216, 25, 26
+ !byte 59, 91, 248, 123, 185, 27, 60, 217, 154, 28, 92, 249, 29, 155, 186, 61
+ !byte 218, 93, 124, 250, 187, 30, 251, 62, 156, 94, 125, 219, 188, 31, 252, 254
+ !byte 220, 253, 63, 126, 255, 157, 221, 95, 159, 191, 222, 127, 189, 223, 158, 190
+
+}
+
+
+: ===========================================================================
+ !source "text.asm"
+: ===========================================================================
+
+ !zone {
+
+;
+; define:
+; "text_state": 8 bytes of internal state
+; "text_scr" : output screen address
+; "text_data" : text character data
+;
+ text_char = text_state + 0
+ .fps = text_state + 1
+ text_pixel = text_state + 2
+ text_skip = text_state + 3
+ .cb = text_state + 4
+ .fsz = text_state + 5
+ text_endFlag = text_state + 6
+ .scr = text_scr
+ .data = text_data
+
+ ; abbreviations
+ .pos = text_char
+ .cxy = text_pixel
+ .skp = text_skip
+
+; "pos" pointer to the next character
+; "cxy" screen position
+; "fps" position in font data of current character
+; "fsz" remaining bytes of current character
+; "skp" skip data, used in spaces, begining and ending
+; "cb" current output byte (8 bits, one column)
+
+; text:
+ !macro text {
+ jsr text_code
+ }
+
+ !macro textInit1 {
+ lda #$1f
+ sta text_pixel
+ lda #0
+ sta text_endFlag
+ sta text_skip
+ sta text_char
+ lda #1
+ sta text_base_color
+ lda #<text_scr
+ sta text_dest_addr
+ lda #>text_scr
+ sta text_dest_addr+1
+ }
+
+ !macro textInit2 .scrOut {
+ lda #$1f
+ sta text_pixel
+ lda #0
+ sta text_endFlag
+ sta text_skip
+ sta text_base_color
+ lda #<.scrOut
+ sta text_dest_addr
+ lda #>.scrOut
+ sta text_dest_addr+1
+ }
+
+
+text_code
+
+ lda .cxy
+ and #$e0
+ bne .putpixel ; If we have more pixels, put them
+
+ ; To next x coord
+ lda .cxy
+ clc
+ adc #1
+ and #$1f
+ sta .cxy
+
+ ; If we are in "skip" mode, skip :-)
+ lda .skp
+ beq .noskip
+
+.doSkip
+ ; skip this step (filling with blanks)
+ dec .skp
+
+.storeColumn0
+ lda #0
+ jmp .storeColumn
+
+.noskip
+ ; Continue font data
+ dec .fsz
+
+ ; Skip just one column if just at the end of character
+ beq .storeColumn0
+
+ bpl .nextcolumn ; More columns
+
+ ; Get next character
+ ldx .pos
+ inc .pos
+ lda .data, x
+ bpl .fontdata
+
+ ; A > 128, skip "A-128" characters
+ and #$7F
+ sta .skp
+
+ ; If skip == 127 (value=255), signal the end of text data
+ eor #$7F
+ bne .storeColumn0
+
+ lda #1
+ sta text_endFlag
+ jmp .storeColumn0
+
+.fontdata
+ tax
+ lda .font_size,x
+ sta .fsz
+ dec .fsz
+
+ lda .font_pos,x
+ sta .fps
+
+.nextcolumn
+ ldx .fps
+ inc .fps
+ lda .font_data, x
+
+.storeColumn
+ sta .cb
+ ; skip over to putpixel
+
+.putpixel
+ lda .cxy
+ clc
+ adc #$e0
+ sta .cxy
+ ldx .cxy
+.base_color
+ lda #1
+ ror .cb
+ rol
+.dest_label
+ sta .scr,x
+ rts
+
+ text_base_color = .base_color + 1
+ text_dest_addr = .dest_label + 1
+
+; font
+.font_size:
+ !byte 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 1, 2, 3, 1
+ !byte 5, 3, 3, 3, 3, 3, 2, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 4, 3, 3, 4, 4
+ !byte 1, 3, 4, 3, 5, 5, 5, 4, 5, 4, 4, 3, 4, 4, 7, 4, 4, 4, 2, 1
+.font_pos:
+ !byte 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 32, 35
+ !byte 35, 38, 40, 43, 46, 49, 50, 52, 4, 55, 55, 60, 63
+ !byte 65, 68, 71, 73, 75, 78, 78, 33, 83, 86, 89, 94, 98
+ !byte 102, 106, 109, 112, 116, 94, 120, 123, 127, 130, 134, 139, 144
+ !byte 148, 153, 157, 161, 164, 167, 171, 178, 171, 182, 186, 5
+.font_data:
+ !byte 56, 68, 56, 36,124, 4, 76, 84, 36, 68, 84, 40, 24, 40,124,100
+ !byte 84, 88, 56, 84, 72, 76, 80, 96, 40, 84, 40, 36, 84, 56, 44, 28
+ !byte 124, 36, 24, 24, 36,124, 24, 52, 16, 60, 80, 24, 37, 30,124, 32
+ !byte 28,188, 1,190,124, 24, 36, 60, 32, 28, 32, 28, 24, 36, 24, 63
+ !byte 36, 24, 36, 63, 60, 16, 32, 52, 44,120, 36, 56, 4, 60, 56, 4
+ !byte 56, 4, 56, 57, 6, 56, 44, 52, 36, 12, 48,208, 48, 12,252,164
+ !byte 164, 88,120,132,132, 72,252,132,132,120,252,164,132,252,160,128
+ !byte 120,132,164, 56,252, 32, 32,252, 8, 4,248,252, 48, 80,140,252
+ !byte 4, 4, 252, 64, 60, 64,252, 64, 48, 8,252,120,132,132,132,120
+ !byte 252,144,144, 96,120,132,134,133,120,252,144,144,108, 68,164,164
+ !byte 152,128,252,128,248, 4, 4,248, 4, 8,240,224, 28, 16,224, 28
+ !byte 16,224,204, 48, 48,204,140,148,164,196, 0, 0
+
+
+text_data
+ !byte (128+5), 41, 10, 28, 29, 63, 63, 63
+ !byte (128+8), 15, 10, 28, 29, 14, 27, 63, 63, 63
+ !byte (128+4), 55, 17, 18, 28, 62, 18, 28, 62, 10
+ !byte (128+8), 27, 14, 10, 21, 21, 34
+ !byte (128+15), 15, 10, 28, 29
+ !byte (128+14), 39, 40, 48, 50
+ !byte (128+21)
+ !byte (128+17), 10, 23, 13, 62, 23, 24, 32
+ !byte (128+8), 28, 24, 22, 14
+ !byte (128+8), 11, 14, 10, 30, 29, 18, 15, 30, 21
+ !byte (128+0), 14, 15, 15, 14, 12, 29, 28, 63, 63, 63
+ !byte (128+16)
+ !byte (128+31)
+ !byte 255
+ !byte 55, 17, 18, 28, 62, 18, 28, 62, 10, 21, 21
+ !byte (128+1), 15, 24, 27, 62, 23, 24, 32
+ !byte (128+8), 11, 34, 14, 63, 63, 63
+ !byte (128+13), 63, 63, 63, 11, 34, 14
+ !byte (128+22)
+ !byte (128+31)
+ !byte (128+15), 11, 34, 62, 39, 48, 54, 38
+ !byte 2, 0, 0, 7, 63, 5, 63, 2, 9
+ !byte 11, 34, 62, 39, 48, 54, 38
+ !byte 2, 0, 0, 7, 63, 5, 63, 2, 9
+ !byte 11, 34, 62, 39, 48, 54, 38
+ !byte 2, 0, 0, 7, 63, 5, 63, 2, 9
+ !byte (128+15)
+ !byte (128+31)
+ !byte 255
+
+}
+
+
+: ===========================================================================
+ !source "moireSmooth.asm"
+: ===========================================================================
+
+ !zone {
+
+; Parameters (consts)
+ .scr = moire_scr
+ .buf = moire_buf
+; Variables
+ .p1 = moire_temp
+ .o1 = moire_temp + 2
+ .o2 = moire_temp + 4
+ .o3 = moire_temp + 6
+ .o4 = moire_temp + 8
+ .iter = moire_temp + 10
+ .valStartX = moire_temp + 11
+ .deltaX = moire_temp + 12
+ .deltaY = moire_temp + 13
+ .yPos = moire_temp + 14
+
+; moire!:
+ !macro moire {
+ jsr moire_code
+ }
+
+ !macro add16 .var, .value {
+ lda .var
+ clc
+ adc #<.value
+ sta .var
+ lda .var+1
+ adc #>.value
+ sta .var+1
+ }
+
+ !macro sto16 .var, .value {
+ lda #<.value
+ sta .var
+ lda #>.value
+ sta .var+1
+ }
+
+moire_code:
+
+ lda #0
+ sta .iter
+
+.loop:
+
+ lda #1
+ sta .deltaX
+ sta .deltaY
+
+ +sto16 .p1, .buf
+
+ lda .iter
+ sta .valStartX
+
+ ldx #15
+--
+ ldy #15
+-
+ sta (.p1),y
+ clc
+ adc .deltaX
+ inc .deltaX
+ dey
+ bpl -
+
+ +add16 .p1, $0020
+
+ lda #1
+ sta .deltaX
+
+ lda .valStartX
+ clc
+ adc .deltaY
+ sta .valStartX
+ inc .deltaY
+
+ dex
+ bpl --
+
+
+; update screen
+ +sto16 .p1, .buf
+ +sto16 .o1, .scr + $01E0
+ +sto16 .o2, .scr + $0200
+ +sto16 .o3, .scr + $01F0
+ +sto16 .o4, .scr + $0210
+
+ lda #15
+ sta .yPos
+--
+ ldy #15
+-
+ lda (.p1),y
+ lsr
+ lsr
+ lsr
+ lsr
+ tax
+ lda .tabCol,x
+
+ cmp (.o1),y
+ beq .noCopy
+ sta (.o1),y
+ sta (.o2),y
+ tax
+ tya
+ eor #15
+ tay
+ txa
+ sta (.o3),y
+ sta (.o4),y
+ tya
+ eor #15
+ tay
+.noCopy:
+ dey
+ bpl -
+
+ +add16 .p1, $0020
+ +add16 .o1, $FFE0
+ +add16 .o2, $0020
+ +add16 .o3, $FFE0
+ +add16 .o4, $0020
+
+ dec .yPos
+ bpl --
+
+ inc .iter
+ lda .iter
+ and #$3f
+ beq +
+ jmp .loop
++
+ rts
+
+.tabCol
+ !byte 0,11,12,15,1,15,12,11
+ !byte 0,11,12,15,1,15,12,11
+ !byte 0,11,12,15,1,15,12,11
+ !byte 0,11,12,15,1,15,12,11
+
+}
+
+: ===========================================================================
+
+
+; Main loop
+
+main
+
+ +giraInit
+ +textInit1
+ lda #63
+ sta gira_pos
+
+ ; Start show-pos from middle of screen
+ lda #128
+ sta show_pos
+
+ ; First color is 3
+ lda #3
+ sta text_base_color
+
+ ; Clear old text image
+ lda #0
+ tax
+-
+ sta text_scr,x
+ inx
+ bne -
+
+loop
+ +gira
+ +circ
+ +show
+ +text
+
+ lda text_pixel
+ eor #$1f
+ bne notChangeTextColor
+ lda text_base_color
+ clc
+ adc #2
+ and #3
+ adc #3
+ sta text_base_color
+
+notChangeTextColor
+
+ lda show_pos
+ bne loop
+
+ lda show_dest_addr+1
+ eor #1
+ sta show_dest_addr+1
+
+ lda text_endFlag
+ beq loop
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; End of first text, do moire!
+ jsr clearScr
+ +moire
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; End of moire, do ending text
+ +textInit2 $300
+ jsr clearScr
+
+; loop text output
+-
+ +text
+
+ lda text_pixel
+ eor #$1f
+ bne -
+ lda text_dest_addr+1
+ eor #7
+ sta text_dest_addr+1
+
+ lda text_endFlag
+ beq -
+
+ jmp main
+
+clearScr
+ ; Clear screen
+ lda #0
+ tax
+-
+ sta $200,x
+ sta $300,x
+ sta $400,x
+ sta $500,x
+ inx
+ bne -
+ rts
+
diff --git a/hacks/images/m6502/dragon-fractal.asm b/hacks/images/m6502/dragon-fractal.asm
new file mode 100644
index 0000000..ce05ad4
--- /dev/null
+++ b/hacks/images/m6502/dragon-fractal.asm
@@ -0,0 +1,49 @@
+;; dmsc
+;;
+;; PostPosted: Thu Dec 13, 2007 11:57 pm Post subject: Dragon curve
+;; fractal
+;;
+;;
+;; Hi!
+;;
+;; This draws the dragon curve fractal (really a "twin dragon"):
+
+lda #0
+ sta $0
+
+lop:
+ lda $0
+ sta $1
+ lda #3
+ sta $6
+ lda #232
+ sta $5
+
+ ldx #0
+lpN:
+ lsr $1
+ bcc nos
+ lda $5
+ clc
+ adc tL,x
+ sta $5
+ lda $6
+ adc tH,x
+ sta $6
+nos:
+ inx
+ lda $1
+ bne lpN
+ inx
+ txa
+ ldy #0
+ sta ($5),y
+
+ inc $0
+ bne lop
+ rts
+
+tL:
+ dcb 32, 31, 254, 190, 128, 132, 8, 8
+tH:
+ dcb 0, 0, 255, 255, 255, 255, 0, 1
diff --git a/hacks/images/m6502/fullscreenlogo.asm b/hacks/images/m6502/fullscreenlogo.asm
new file mode 100644
index 0000000..6f9b079
--- /dev/null
+++ b/hacks/images/m6502/fullscreenlogo.asm
@@ -0,0 +1,107 @@
+;
+; draw image
+;
+
+start:
+ lda #<logo
+ sta $0
+ lda #>logo
+ sta $1
+
+ lda #$00
+ sta $2
+ lda #$02
+ sta $3
+
+ ldx #$0
+l:
+ lda ($0,x)
+ sta ($2,x)
+
+ inc $00
+ lda $00
+ cmp #$00
+ bne notReset1
+ inc $01
+notReset1:
+
+ inc $02
+ lda $02
+ cmp #$00
+ bne notReset2
+ lda $03
+ cmp #$05
+ beq done
+ inc $03
+notReset2:
+
+ jmp l
+done:
+ rts
+
+logo:
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6
+ dcb 6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,6,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,6,6,6,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,6,6,6,6,6,6,6,6,6,6,6,6,1
+ dcb 1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,6,6,6,6,6,6,6,6,6,6,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,6,6,6,6,6
+ dcb 1,1,6,6,6,6,6,6,6,6,6,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,6,6,6,6,1
+ dcb 1,1,6,6,6,6,6,6,6,6,1,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,6,6,6,1,1
+ dcb 1,1,6,6,6,6,6,6,6,6,1,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,6,6,1,1,1
+ dcb 1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,6,1,1,1,1
+ dcb 1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,1,1,1,1,1
+ dcb 1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,1,1,1,1,1,1
+ dcb 1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1
+ dcb 1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1
+ dcb 1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1
+ dcb 1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1
+ dcb 1,1,6,6,6,6,6,6,6,6,1,1,1,1,1,1
+ dcb 1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1
+ dcb 1,1,6,6,6,6,6,6,6,6,6,1,1,1,1,1
+ dcb 1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1
+ dcb 1,1,1,6,6,6,6,6,6,6,6,6,1,1,1,1
+ dcb 1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2
+ dcb 1,1,1,6,6,6,6,6,6,6,6,6,6,1,1,1
+ dcb 1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,6,6,6,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,6,6,6,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,6,6,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,6,6,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6
+ dcb 6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+
diff --git a/hacks/images/m6502/greynetic.asm b/hacks/images/m6502/greynetic.asm
new file mode 100644
index 0000000..1218d87
--- /dev/null
+++ b/hacks/images/m6502/greynetic.asm
@@ -0,0 +1,96 @@
+;Port of Greynetic
+;Jeremy English 2013
+
+lda #$0
+sta $0
+lda #$2
+sta $1
+
+start:
+lda $1
+cmp #$6
+bne randOffset
+lda #$2
+sta $1
+
+randOffset:
+;move position by some random offset
+clc
+lda $fe
+adc $0
+sta $0
+lda $1
+adc #$0
+sta $1
+cmp #$06 ;Did we go out of range
+bne setRect ;Nope
+lda #$02 ;Start back at the top
+sta $1
+
+setRect:
+lda $fe
+and #$f
+tax
+inx ;at least 1
+stx $2 ;width
+stx $3 ;working copy
+lda $fe
+and #$f
+tax
+inx ;at least 1
+stx $4 ;height
+
+lda $fe
+sta $5 ;color
+
+ldy #0
+draw:
+lda $5
+sta ($0), y
+dec $3
+beq down
+
+lda $0
+clc
+adc #$1
+sta $0
+lda $1
+adc #$0
+sta $1
+cmp #$06 ;Did we go out of range
+beq done ;yes
+jmp draw
+
+down:
+
+;;Move back to the start of this row
+ldx $2 ;The width of the rectangle
+dex
+lda $0
+stx $0
+sec
+sbc $0
+sta $0
+lda $1
+sbc #$0
+sta $1
+
+;;Move down one row
+dec $4
+beq done ;;Are we done drawing?
+
+lda $2
+sta $3 ;reset the width counter
+
+lda $0
+clc
+adc #$20
+sta $0
+lda $1
+adc #$0
+sta $1
+cmp #$06 ;Did we go out of range
+beq done ;yes
+jmp draw
+done:
+jmp start
diff --git a/hacks/images/m6502/keftal.asm b/hacks/images/m6502/keftal.asm
new file mode 100644
index 0000000..efb2982
--- /dev/null
+++ b/hacks/images/m6502/keftal.asm
@@ -0,0 +1,82 @@
+; awfully slow.. be patient
+
+init:
+ ldx #0
+ stx $0
+ inx
+ stx $2
+ stx $3
+ inx
+ stx $1
+
+loop:
+ lda $2
+ cmp #$20
+ bne notIncF2
+ inc $3
+ lda #0
+ sta $2
+notIncF2:
+ inc $2
+
+; CALCULATE START
+
+ lda $2
+ sta $f1
+ lda $2
+ sta $f2
+ jsr multiply
+
+ lda $f4
+ sta $f8
+
+ lda $3
+ sta $f1
+ lda $3
+ sta $f2
+ jsr multiply
+
+; CALCULATE STOP
+
+ lda $f4
+ clc
+ adc $f8
+
+ lsr
+ lsr
+ lsr
+ lsr
+ lsr
+ ldx #0
+ sta ($0,x)
+ inc $0
+ lda $0
+ cmp #$00
+ bne notNextY
+ inc $1
+ lda $1
+ cmp #6
+ beq exit
+notNextY:
+ jmp loop
+exit:
+ rts
+
+multiply:
+ lda #0
+ sta $f4
+ sta $f5
+ ldx #8
+a:asl $f4
+ rol $f5
+ asl $f2
+ bcc b
+ clc
+ lda $f4
+ adc $f1
+ sta $f4
+ bcc b
+ inc $f5
+b:dex
+ bne a
+ rts \ No newline at end of file
diff --git a/hacks/images/m6502/life.asm b/hacks/images/m6502/life.asm
new file mode 100644
index 0000000..6454812
--- /dev/null
+++ b/hacks/images/m6502/life.asm
@@ -0,0 +1,127 @@
+; Conway\'s Game of Life
+; http://rosettacode.org/wiki/Conway\'s_Game_of_Life
+; Submitted by Anonymous
+
+randfill: stx $01 ;$200 for indirect
+ ldx #$02 ;addressing
+ stx $02
+randloop: lda $fe ;generate random
+ and #$01 ;pixels on the
+ sta ($01),Y ;screen
+ jsr inc0103
+ cmp #$00
+ bne randloop
+ lda $02
+ cmp #$06
+ bne randloop
+
+
+clearmem: lda #$df ;set $07df-$0a20
+ sta $01 ;to $#00
+ lda #$07
+ sta $02
+clearbyte: lda #$00
+ sta ($01),Y
+ jsr inc0103
+ cmp #$20
+ bne clearbyte
+ lda $02
+ cmp #$0a
+ bne clearbyte
+
+
+starttick:
+copyscreen: lda #$00 ;set up source
+ sta $01 ;pointer at
+ sta $03 ;$01/$02 and
+ lda #$02 ;dest pointer
+ sta $02 ;at $03/$04
+ lda #$08
+ sta $04
+ ldy #$00
+copybyte: lda ($01),Y ;copy pixel to
+ sta ($03),Y ;back buffer
+ jsr inc0103 ;increment pointers
+ cmp #$00 ;check to see
+ bne copybyte ;if we\'re at $600
+ lda $02 ;if so, we\'ve
+ cmp #$06 ;copied the
+ bne copybyte ;entire screen
+
+
+conway: lda #$df ;apply conway rules
+ sta $01 ;reset the pointer
+ sta $03 ;to $#01df/$#07df
+ lda #$01 ;($200 - $21)
+ sta $02 ;($800 - $21)
+ lda #$07
+ sta $04
+onecell: lda #$00 ;process one cell
+ ldy #$01 ;upper cell
+ clc
+ adc ($03),Y
+ ldy #$41 ;lower cell
+ clc
+ adc ($03),Y
+chkleft: tax ;check to see
+ lda $01 ;if we\'re at the
+ and #$1f ;left edge
+ tay
+ txa
+ cpy #$1f
+ beq rightcells
+leftcells: ldy #$00 ;upper-left cell
+ clc
+ adc ($03),Y
+ ldy #$20 ;left cell
+ clc
+ adc ($03),Y
+ ldy #$40 ;lower-left cell
+ clc
+ adc ($03),Y
+chkright: tax ;check to see
+ lda $01 ;if we\'re at the
+ and #$1f ;right edge
+ tay
+ txa
+ cpy #$1e
+ beq evaluate
+rightcells: ldy #$02 ;upper-right cell
+ clc
+ adc ($03),Y
+ ldy #$22 ;right cell
+ clc
+ adc ($03),Y
+ ldy #$42 ;lower-right cell
+ clc
+ adc ($03),Y
+evaluate: ldx #$01 ;evaluate total
+ ldy #$21 ;for current cell
+ cmp #$03 ;3 = alive
+ beq storex
+ ldx #$00
+ cmp #$02 ;2 = alive if
+ bne storex ;c = alive
+ lda ($03),Y
+ and #$01
+ tax
+storex: txa ;store to screen
+ sta ($01),Y
+ jsr inc0103 ;move to next cell
+conwayloop: cmp #$e0 ;if not last cell,
+ bne onecell ;process next cell
+ lda $02
+ cmp #$05
+ bne onecell
+ jmp starttick ;run next tick
+
+
+inc0103: lda $01 ;increment $01
+ cmp #$ff ;and $03 as 16-bit
+ bne onlyinc01 ;pointers
+ inc $02
+ inc $04
+onlyinc01: inc $01
+ lda $01
+ sta $03
+ rts
diff --git a/hacks/images/m6502/lines.asm b/hacks/images/m6502/lines.asm
new file mode 100644
index 0000000..152d5fb
--- /dev/null
+++ b/hacks/images/m6502/lines.asm
@@ -0,0 +1,313 @@
+; -*- mode: c; tab-width: 4; fill-column: 128 -*-
+; vi: set ts=4 tw=128:
+
+; Lines, Copyright (c) 2018 Dave Odell <dmo2118@gmail.com>
+;
+; Permission to use, copy, modify, distribute, and sell this software and its
+; documentation for any purpose is hereby granted without fee, provided that
+; the above copyright notice appear in all copies and that both that
+; copyright notice and this permission notice appear in supporting
+; documentation. No representations are made about the suitability of this
+; software for any purpose. It is provided "as is" without express or
+; implied warranty.
+
+; Another port of 20 year old QBasic code.
+
+
+
+main_loop:
+ lda #$00
+ sta $0
+
+y_loop:
+ ldx $0
+
+ lda #1
+ bit $1
+ beq left_right
+
+ ; Up-down. Skip all blank columns.
+ lda x_px0,x
+ and #1
+ bne fill
+ jmp next_y ; next_y is too far to conditional-branch from here.
+
+clear:
+ ldx #1
+ lda $0
+ clc
+ adc #$20
+ tay
+
+ sec
+clear_loop:
+ lda #0 ; $fe
+ sta $0200,y
+ sta $0240,y
+ sta $0280,y
+ sta $02c0,y
+ sta $0300,y
+ sta $0340,y
+ sta $0380,y
+ sta $03c0,y
+ sta $0400,y
+ sta $0440,y
+ sta $0480,y
+ sta $04c0,y
+ sta $0500,y
+ sta $0540,y
+ sta $0580,y
+ sta $05c0,y
+ tya
+ sbc #$20
+ tay
+ dex
+ bpl clear_loop
+ jmp next_y
+
+left_right:
+ ; Repaint columns that were previously on.
+ lda x_px0,x
+ bit const_two
+ beq next_y
+ lda x_px0,x
+ and #1
+ beq clear
+ ;jmp fill
+
+fill:
+ ldx #1
+ lda $0
+ clc
+ adc #$20
+ tay
+
+ sec
+fill_loop:
+ ; 3 * 2 * 16 = 96 bytes
+ lda y_px0,x
+ sta $0200,y
+ lda y_px1,x
+ sta $0240,y
+ lda y_px2,x
+ sta $0280,y
+ lda y_px3,x
+ sta $02c0,y
+ lda y_px4,x
+ sta $0300,y
+ lda y_px5,x
+ sta $0340,y
+ lda y_px6,x
+ sta $0380,y
+ lda y_px7,x
+ sta $03c0,y
+ lda y_px8,x
+ sta $0400,y
+ lda y_px9,x
+ sta $0440,y
+ lda y_pxa,x
+ sta $0480,y
+ lda y_pxb,x
+ sta $04c0,y
+ lda y_pxc,x
+ sta $0500,y
+ lda y_pxd,x
+ sta $0540,y
+ lda y_pxe,x
+ sta $0580,y
+ lda y_pxf,x
+ sta $05c0,y
+ tya
+ sbc #$20
+ tay
+ dex
+ bpl fill_loop
+ ;jmp next_y
+
+next_y:
+ inc $0
+ lda #32
+ cmp $0
+ beq shift
+ jmp y_loop
+
+shift:
+ lda $fe
+ and #$3
+ sta $1 ; Left, down, right, up.
+ beq shift_x1
+
+ cmp #2
+ bmi shift_y1
+ beq shift_x0
+
+shift_y0:
+ ldx #0
+shift_y0_loop:
+ lda y_px0,x
+ eor y_px00,x
+ sta y_px0,x
+ inx
+ cpx #31
+ bne shift_y0_loop
+ jmp main_loop
+
+shift_y1:
+ ldx #30
+shift_y1_loop:
+ lda y_px00,x
+ eor y_px0,x
+ sta y_px00,x
+ dex
+ bpl shift_y1_loop
+ jmp main_loop
+
+shift_x0:
+ ldx #0
+shift_x0_loop:
+ ; px[0] = ((px[0] ^ px[1]) & 1) | (px[1] << 1)
+ lda x_px0,x
+ eor x_px00,x
+ lsr ; Save EOR bit in carry flag.
+ lda x_px00,x
+ rol ; Restore EOR bit.
+ sta x_px0,x
+ inx
+ cpx #31
+ bne shift_x0_loop
+ jmp main_loop
+
+shift_x1:
+ ldx #30
+shift_x1_loop:
+ lda x_px00,x
+ eor x_px0,x
+ lsr
+ lda x_px0,x
+ rol
+ sta x_px00,x
+ dex
+ bpl shift_x1_loop
+ jmp main_loop
+
+y_px0:
+ dcb 0
+y_px00:
+ dcb 0
+y_px1:
+ dcb 0, 0
+y_px2:
+ dcb 0, 0
+y_px3:
+ dcb 0, 0
+y_px4:
+ dcb 0, 0
+y_px5:
+ dcb 0, 0
+y_px6:
+ dcb 0, 0
+y_px7:
+ dcb 0, 0
+y_px8:
+ dcb 1, 0
+y_px9:
+ dcb 0, 0
+y_pxa:
+ dcb 0, 0
+y_pxb:
+ dcb 0, 0
+y_pxc:
+ dcb 0, 0
+y_pxd:
+ dcb 0, 0
+y_pxe:
+ dcb 0, 0
+y_pxf:
+ dcb 0, 0
+
+ ; Bit 0: black row, bit 1: changed row
+x_px0:
+ dcb 0
+x_px00:
+ dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ dcb 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+
+const_two: ; lolz
+ dcb 2
+
+;#include "screenhack.h"
+;
+;struct _lines
+;{
+; unsigned width, height;
+; unsigned long delay;
+; GC gc;
+;};
+;
+;static void *lines_init(Display *display, Window window)
+;{
+; struct _lines *self = malloc(sizeof(*self));
+; XGCValues gcv;
+; XWindowAttributes xgwa;
+;
+; if(!self)
+; abort();
+;
+; XGetWindowAttributes(display, window, &xgwa);
+; self->width = xgwa.width;
+; self->height = xgwa.height;
+;
+; self->delay = get_integer_resource(display, "delay", "Integer");
+;
+; gcv.function = GXxor;
+; gcv.foreground = get_pixel_resource(display, xgwa.colormap, "foreground", "Foreground");
+; self->gc = XCreateGC(display, window, GCFunction | GCForeground, &gcv);
+;
+; XDrawPoint(display, window, self->gc, xgwa.width >> 1, xgwa.height >> 1);
+;
+; return self;
+;}
+;
+;static unsigned long lines_draw(Display *display, Window window, void *self_raw)
+;{
+; struct _lines *self = self_raw;
+; static const XPoint xy[] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
+; const XPoint *p = xy + NRAND(4);
+;
+; XCopyArea(display, window, window, self->gc, 0, 0, self->width, self->height, p->x, p->y);
+; return self->delay;
+;}
+;
+;static void lines_reshape(Display *display, Window window, void *self_raw, unsigned width, unsigned height)
+;{
+; struct _lines *self = self_raw;
+; self->width = width;
+; self->height = height;
+;}
+;
+;static Bool lines_event(Display *display, Window window, void *self_raw, XEvent *event)
+;{
+; return False;
+;}
+;
+;static void lines_free(Display *display, Window window, void *self_raw)
+;{
+; struct _lines *self = self_raw;
+; XFreeGC(display, self->gc);
+; free(self);
+;}
+;
+;static const char *lines_defaults[] =
+;{
+; "*fpsSolid: true",
+; "*delay: 30000",
+; 0
+;};
+;
+;static XrmOptionDescRec lines_options [] =
+;{
+; {"-delay", ".delay", XrmoptionSepArg, 0},
+; {0, 0, 0, 0}
+;};
+;
+;XSCREENSAVER_MODULE ("Lines", lines)
diff --git a/hacks/images/m6502/matrix.asm b/hacks/images/m6502/matrix.asm
new file mode 100644
index 0000000..0ec27a7
--- /dev/null
+++ b/hacks/images/m6502/matrix.asm
@@ -0,0 +1,67 @@
+;;Matrix :)
+
+loop:
+ lda $fe
+ and #$1f
+ tay
+ tax
+ lda matrix,y
+ sta $1
+ tay
+ lda #0
+ jsr paint
+ inc $1
+ lda $1
+ and #$1f
+ sta matrix,y
+ tay
+ lda #5
+ jsr paint
+ lda $fe
+ and #$1f
+ tay
+ tax
+ lda matrix,y
+ sta $1
+ tay
+ lda #$d
+ jsr paint
+ lda $fe
+ and #$1f
+ tay
+ tax
+ lda matrix,y
+ sta $1
+ tay
+ lda #$5
+ jsr paint
+ jmp loop
+
+paint:
+ pha
+ lda yl,y
+ sta $2
+ lda yh,y
+ sta $3
+ txa
+ tay
+ pla
+ sta ($2),y
+ rts
+
+yh:
+ dcb $02, $02, $02, $02, $02, $02, $02, $02
+ dcb $03, $03, $03, $03, $03, $03, $03, $03
+ dcb $04, $04, $04, $04, $04, $04, $04, $04
+ dcb $05, $05, $05, $05, $05, $05, $05, $05
+
+yl:
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+
+matrix:
+ dcb 5,16,19,19,17,26,10,14,11,4,1,2,20,1,8,30
+ dcb 17,26,19,19,31,21,11,19,3,24,4,24,13,8,8,26
+
diff --git a/hacks/images/m6502/noise.asm b/hacks/images/m6502/noise.asm
new file mode 100644
index 0000000..32447d7
--- /dev/null
+++ b/hacks/images/m6502/noise.asm
@@ -0,0 +1,16 @@
+; static noise
+
+start: ldy #$ff
+ ldx #$0
+loop: lda $fe
+ sta $200,x
+ and #$7
+ sta $300,x
+ and #$3
+ sta $400,x
+ and #$1
+ sta $500,x
+ inx
+ dey
+ bne loop
+ rts
diff --git a/hacks/images/m6502/random-walk.asm b/hacks/images/m6502/random-walk.asm
new file mode 100644
index 0000000..4c3bd15
--- /dev/null
+++ b/hacks/images/m6502/random-walk.asm
@@ -0,0 +1,82 @@
+ ;; Jeremy English Dec 11 2007
+ ;; Random walk
+ lda #16
+ sta $0 ; The current x pos
+ sta $1 ; The current y pos
+ lda $fe ; Get random color
+ sta $5 ; Store the color
+ lda $fe ; Amount of time to use this color
+ sta $6
+
+loop:
+ ldx $0
+ ldy $1
+ lda $5
+ jsr paint
+ jsr walk
+ dec $6
+ bne loop
+ ;; get a new color
+ lda $fe
+ sta $5
+ ;; get a new duration
+ lda $fe
+ sta $6
+ jmp loop
+
+walk:
+ lda $fe
+ and #3
+ cmp #0
+ beq right
+ cmp #1
+ beq left
+ cmp #2
+ beq up
+ jmp down
+
+right:
+ inc $0
+ jmp done
+left:
+ dec $0
+ jmp done
+up:
+ dec $1
+ jmp done
+down:
+ inc $1
+ jmp done
+done:
+ lda $0
+ and #31
+ sta $0
+ lda $1
+ and #31
+ sta $1
+ rts
+
+paint:
+ pha
+ lda yl,y
+ sta $2
+ lda yh,y
+ sta $3
+ txa
+ tay
+ pla
+ sta ($2),y
+ rts
+
+ ;; Y cord MSB
+yh:
+ dcb $02, $02, $02, $02, $02, $02, $02, $02
+ dcb $03, $03, $03, $03, $03, $03, $03, $03
+ dcb $04, $04, $04, $04, $04, $04, $04, $04
+ dcb $05, $05, $05, $05, $05, $05, $05, $05
+ ;; Y cord LSB
+yl:
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
diff --git a/hacks/images/m6502/random.asm b/hacks/images/m6502/random.asm
new file mode 100644
index 0000000..9ff5d2d
--- /dev/null
+++ b/hacks/images/m6502/random.asm
@@ -0,0 +1,11 @@
+loop: lda $fe ; A=rnd
+ sta $00 ; ZP(0)=A
+ lda $fe
+ and #$3 ; A=A&3
+ clc ; Clear carry
+ adc #$2 ; A+=2
+ sta $01 ; ZP(1)=A
+ lda $fe ; A=rnd
+ ldy #$0 ; Y=0
+ sta ($00),y ; ZP(0),ZP(1)=y
+ jmp loop
diff --git a/hacks/images/m6502/random2.asm b/hacks/images/m6502/random2.asm
new file mode 100644
index 0000000..c209f9f
--- /dev/null
+++ b/hacks/images/m6502/random2.asm
@@ -0,0 +1,11 @@
+ lda $fe ; A=rnd
+ sta $00 ; ZP(0)=A
+ lda $fe
+ and #$3 ; A=A&3
+ clc ; Clear carry
+ adc #$2 ; A+=2
+ sta $01 ; ZP(1)=A
+ lda $fe ; A=rnd
+ ldy #$0 ; Y=0
+ sta ($00),y ; ZP(0),ZP(1)=y
+ jmp $600
diff --git a/hacks/images/m6502/rorschach.asm b/hacks/images/m6502/rorschach.asm
new file mode 100644
index 0000000..c5591f0
--- /dev/null
+++ b/hacks/images/m6502/rorschach.asm
@@ -0,0 +1,124 @@
+; "Rorschach test"
+; Not at all what it was supposed to be,
+; but it turns out pretty cool and can
+; create some interesting patterns.
+
+ lda #8
+ tax
+dr:
+ sta $3cb,x
+ sta $40b,x
+ dex
+ bpl dr
+ sta $3f3
+ sta $3eb
+
+ lda #1
+ sta $3ec
+
+ ldx #255
+mk:
+ lda $fe
+ sta $1200,x
+ lda $fe
+ sta $1300,x
+ lda $fe
+ sta $1400,x
+ lda $fe
+ sta $1500,x
+ dex
+ cpx #$ff
+ bne mk
+
+; smooth it
+
+ ldy #0
+re:
+ lda #1
+ sta $3ec,y
+
+ ldx #255
+sm:
+ lda $1201,x
+ adc $11ff,x
+ adc $1220,x
+ adc $11e0,x
+ lsr
+ lsr
+ sta $1200,x
+
+ lda $1301,x
+ adc $12ff,x
+ adc $1320,x
+ adc $12e0,x
+ lsr
+ lsr
+ sta $1300,x
+
+ lda $1401,x
+ adc $13ff,x
+ adc $1420,x
+ adc $13e0,x
+ lsr
+ lsr
+ sta $1400,x
+
+ lda $1501,x
+ adc $14ff,x
+ adc $1520,x
+ adc $14e0,x
+ lsr
+ lsr
+ sta $1500,x
+
+ dex
+ cpx #$ff
+ bne sm
+ iny
+ cpy #7
+ bne re
+
+ lda #1
+ sta $3f0
+
+ ;copy it
+
+ clc
+ ldx #255
+cp:
+ lda $1200,x
+ lsr
+ lsr
+ tay
+ lda colors,y
+ sta $200,x
+
+ lda $1300,x
+ lsr
+ lsr
+ tay
+ lda colors,y
+ sta $300,x
+
+ lda $1400,x
+ lsr
+ lsr
+ tay
+ lda colors,y
+ sta $400,x
+
+ lda $1500,x
+ lsr
+ lsr
+ tay
+ lda colors,y
+ sta $500,x
+
+ dex
+ cpx #$ff
+ bne cp
+ rts
+
+colors:
+ dcb 0,0,0,0,0,$9,$9,1,1,0,0,0,0,0
+
diff --git a/hacks/images/m6502/santa.asm b/hacks/images/m6502/santa.asm
new file mode 100644
index 0000000..be47502
--- /dev/null
+++ b/hacks/images/m6502/santa.asm
@@ -0,0 +1,142 @@
+start:
+ldx #0
+cs:
+lda $2000,x
+sta $500,x
+dex
+bne cs
+
+stx $20
+
+loop:
+
+inc $20
+lda $20
+and #$7f
+tay
+and #$1f
+tax
+lda sinus,x
+tax
+
+d:
+
+lda #0
+sta $1e0,x
+sta $2e0,x
+lda $1000,y
+sta $200,x
+lda $1080,y
+sta $220,x
+lda $1100,y
+sta $240,x
+lda $1180,y
+sta $260,x
+lda $1200,y
+sta $280,x
+lda $1280,y
+sta $2a0,x
+lda $1300,y
+sta $2c0,x
+lda $1380,y
+sta $2c0,x
+inx
+iny
+txa
+and #$1f
+bne d
+
+jmp loop
+
+; 32 ($20) long
+sinus:
+dcb 0,0,0,0,$20,$20,$20
+dcb $40,$40,$60,$80,$a0,$a0,$c0,$c0,$c0
+dcb $e0,$e0,$e0,$e0,$c0,$c0,$c0
+dcb $a0,$a0,$80,$60,$40,$40,$20,$20,$20
+
+*=$1000
+santa:
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,$a,$a,0,0,0,0,0,0
+dcb 0,0,0,0,0,$a,$a,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,2,2,2,1,0,0,0,0,$9,$9,$9,$9,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,$a,$a,$a,0,0,0,0,0
+dcb 0,0,0,0,0,$a,$a,$a,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,$9,$9,0,0,0,0,0,0,0,0
+dcb 0,1,1,2,2,0,$9,$9,$9,$9,$9,$9,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,$a,$a,$a,$a,$a,$a,0,0,0,0
+dcb 0,0,0,$a,$a,$a,$a,$a,$a,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,$9,$9,$9,0,0,0,0,0,0
+dcb 0,1,2,2,$9,$9,$9,$9,$9,$9,$9,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,$a,$a,$a,$a,$a,$a,$b
+dcb $b,$b,$b,$b,$b,$b,$a,$a,$a,$a,$a,$a,$b,$b,$b,$b
+dcb $b,$b,$b,$b,$b,$9,$9,$9,$9,$9,$9,$9,$9,$9,$9,$9
+dcb $9,2,2,$9,$9,$9,$9,$9,$9,$9,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,$a,$a,$a,$a,$a,$a,$a
+dcb $a,0,0,0,0,0,$a,$a,$a,$a,$a,$a,$a,$a,0,0
+dcb 0,0,0,0,0,0,0,$9,$9,$9,$9,$9,$9,$9,$9,$9
+dcb 2,2,$9,$9,$9,$9,$9,$9,$9,$9,$9,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,$a,$a,$a,$a,$a,$a,0
+dcb $a,$a,0,0,0,0,$a,$a,$a,$a,$a,$a,0,$a,$a,0
+dcb 0,0,0,0,0,$a,$a,0,0,$9,$a,$9,$9,$9,$9,$9
+dcb $9,$9,$a,$9,$9,$9,$9,$9,$9,$9,$9,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,$a,0,$a,0,0,$a,0
+dcb 0,$a,0,0,0,0,$a,0,$a,0,0,$a,0,0,$a,0
+dcb 0,0,0,0,0,$a,0,0,0,$a,0,0,0,0,0,0
+dcb 0,$a,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,$a,$a,0,$a,0,0,$a,$a
+dcb 0,$a,$a,0,0,$a,$a,0,$a,0,0,$a,$a,0,$a,$a
+dcb 0,0,0,0,0,0,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a
+dcb $a,$a,$a,$a,$a,$a,$a,$a,$a,$a,$a,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+*=$2000
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,$c,1,1,1
+dcb 0,0,0,0,0,0,0,0,0,0,0,1,1,1,$a,$a
+dcb 0,0,0,0,0,0,0,0,0,0,$c,1,1,1,1,1
+dcb 1,1,$c,0,0,0,0,0,0,0,0,0,1,1,0,0
+dcb 0,0,0,0,0,0,0,0,$c,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,$c,0,0,0,0,0,1,1,1,1,0
+dcb 0,0,0,0,0,0,$c,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,$c,0,0,0,0,1,1,1,1,0
+dcb 0,0,0,0,0,$c,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,$c,0,0,1,1,0,0
+dcb 0,0,$c,1,1,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ \ No newline at end of file
diff --git a/hacks/images/m6502/selfmodify.asm b/hacks/images/m6502/selfmodify.asm
new file mode 100644
index 0000000..f7bb646
--- /dev/null
+++ b/hacks/images/m6502/selfmodify.asm
@@ -0,0 +1,12 @@
+; A very simple example of
+; self-modifying code
+; and code entry points
+
+ lda $fe
+ sta $1001
+ jmp $1000
+
+ *=$1000
+ lda #$00
+ sta $3ef
+ jmp $600
diff --git a/hacks/images/m6502/sflake.asm b/hacks/images/m6502/sflake.asm
new file mode 100644
index 0000000..cbb72e8
--- /dev/null
+++ b/hacks/images/m6502/sflake.asm
@@ -0,0 +1,320 @@
+;; Jeremy English 01-December-2008
+;; Snowflakes
+
+;; Main loop Count
+lda #7
+sta $f
+
+;; pattern number
+lda #0
+sta $10
+
+;;Cells
+lda #$00
+sta $4
+lda #$10
+sta $5
+
+;;Tmp
+lda #$00
+sta $6
+lda #$11
+sta $7
+
+;;Init Cells Buffer
+;;------------------------------------------------------------
+ldy #$ff
+initCells:
+lda #0
+sta ($4),y
+sta ($6),y
+dey
+bne initCells
+
+;;Set start position
+ldy #115
+lda #1
+sta ($4),y
+
+;;Setup offset
+lda #15
+sta $d
+lda #16
+sta $e
+
+;;Start of main loop
+;;------------------------------------------------------------
+mainloop:
+
+;;init indent
+;;We want to indent every other line
+lda #0
+sta $a
+
+lda #0
+sta $9
+
+;; Display Cells
+;;------------------------------------------------------------
+;; 248 is the total number of cells
+ldy #248
+display:
+
+lda #0
+sta $8
+
+lda $a
+beq stop16
+lda #15
+sta $b
+lda #1
+sta $8
+jmp toggle
+stop16:
+lda #16
+sta $b
+toggle:
+lda $a
+eor #1
+sta $a
+
+;; Set the stop position
+ldx $b
+inner_display:
+dex
+txa
+pha
+
+dey
+tya
+pha
+lda ($4),y
+
+beq display_continue
+ldx $8
+ldy $9
+lda #1
+jsr paint
+ldx $8
+ldy $9
+inx
+jsr paint
+ldx $8
+ldy $9
+iny
+jsr paint
+ldx $8
+ldy $9
+inx
+iny
+jsr paint
+display_continue:
+inc $8
+inc $8
+
+;;Life Cycle
+;;------------------------------------------------------------
+pla
+tay
+pha ;;Store y on the stack
+
+tax
+dey
+lda ($4),y
+iny
+iny
+clc
+adc ($4),y
+sta $c
+
+txa
+sec
+sbc $d
+tay
+lda $c
+clc
+adc ($4),y
+sta $c
+
+txa
+sec
+sbc $e
+tay
+lda $c
+clc
+adc ($4),y
+sta $c
+
+txa
+clc
+adc $d
+tay
+lda $c
+clc
+adc ($4),y
+sta $c
+
+txa
+clc
+adc $e
+tay
+lda $c
+clc
+adc ($4),y
+sta $c
+
+pla
+tay ;;Pull Y off of the stack
+
+lda $c
+and #1
+beq dontset
+sta ($6),y
+dontset:
+
+pla
+tax ;;Pull x off of the stack
+beq exit_inner_display
+jmp inner_display
+exit_inner_display:
+inc $9
+inc $9
+tya
+beq display_exit
+jmp display
+display_exit:
+
+
+;;Copy Temporary Buffer
+;;------------------------------------------------------------
+ldy #248
+copybuf:
+dey
+lda ($6),y
+sta ($4),y
+tya
+bne copybuf
+
+dec $f
+lda $f
+beq reset_main
+jmp mainloop
+
+;;Reset main counter
+;;------------------------------------------------------------
+reset_main:
+lda #7
+sta $f
+
+lda #$ff ;;Delay Count
+sta $11
+delay:
+ldy #$a0
+inner_delay:
+nop
+dey
+bne inner_delay
+dec $11
+lda $11
+bne delay
+
+;; init buffer
+;; and clear screen
+clrscr:
+lda $fe
+and $f
+cmp #1
+beq clrscr ;We don't want a white background
+ldy #$00
+ldx #$0
+cs_loop:
+sta $200,x
+sta $300,x
+sta $400,x
+sta $500,x
+pha
+lda #0
+sta ($6),y
+sta ($4),y
+pla
+inx
+dey
+bne cs_loop
+
+;; Setup new pattern
+;;------------------------------------------------------------
+inc $10
+lda $10
+and #3
+sta $10
+cmp #0
+beq pattern1
+cmp #1
+beq pattern2
+cmp #2
+beq pattern3
+cmp #3
+beq pattern4
+
+pattern1:
+ldy #114
+lda #1
+sta ($4),y
+ldy #115
+lda #1
+sta ($4),y
+ldy #116
+lda #1
+sta ($4),y
+jmp mainloop
+
+pattern2:
+ldy #113
+lda #1
+sta ($4),y
+ldy #118
+lda #1
+sta ($4),y
+jmp mainloop
+
+pattern3:
+ldy #115
+lda #1
+sta ($4),y
+jmp mainloop
+
+pattern4:
+ldy #102
+lda #1
+sta ($4),y
+ldy #128
+lda #1
+sta ($4),y
+jmp mainloop
+
+;;Paint subroutine
+;;------------------------------------------------------------
+paint:
+ pha
+ lda yl,y
+ sta $2
+ lda yh,y
+ sta $3
+ txa
+ tay
+ pla
+ sta ($2),y
+ rts
+
+ ;; Y cord MSB
+yh:
+ dcb $02, $02, $02, $02, $02, $02, $02, $02
+ dcb $03, $03, $03, $03, $03, $03, $03, $03
+ dcb $04, $04, $04, $04, $04, $04, $04, $04
+ dcb $05, $05, $05, $05, $05, $05, $05, $05
+ ;; Y cord LSB
+yl:
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
+ dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
diff --git a/hacks/images/m6502/sierpinski.asm b/hacks/images/m6502/sierpinski.asm
new file mode 100644
index 0000000..2d21905
--- /dev/null
+++ b/hacks/images/m6502/sierpinski.asm
@@ -0,0 +1,24 @@
+; Sierpinski
+; Submitted by Anonymous
+
+start:
+ lda #$e1
+ sta $0
+ lda #$01
+ sta $1
+ ldy #$20
+
+write:
+ ldx #$00
+ eor ($0, x)
+ sta ($0),y
+
+ inc $0
+ bne write
+ inc $1
+ ldx $1
+ cpx #$06
+ bne write
+
+ rts
+
diff --git a/hacks/images/m6502/sierpinsky.asm b/hacks/images/m6502/sierpinsky.asm
new file mode 100644
index 0000000..6a67906
--- /dev/null
+++ b/hacks/images/m6502/sierpinsky.asm
@@ -0,0 +1,131 @@
+; 6502 assembler Sierpinsky Triangle ver.2
+; by Magnus Wedmark 2007-05-02
+; This program is especially written for
+; the 6502asm.com competition and
+; uses the 32*32 pixel display used in that
+; virtual platform. The sierpinsky
+; fractal is one of the simplest to
+; implement. Here is a walk-through:
+; 1) Specify 3 points that form a triangle
+; 2) Choose one of them as a starting point
+; 3) Choose one of them as targetpoint randomly
+; 4) Set the new current position half-way
+; between the current point and the target
+; point.
+; 5) Goto 3
+
+ LDX #0
+ LDY #0
+new_rnd:
+ LDA $FE ; random 0-255
+ AND #3 ; only 0-3 left
+ CMP #3
+ BNE good_rnd
+ JMP new_rnd
+good_rnd:
+; random = 0-2
+ PHA
+; transform X and Y values according to:
+; X=X/2+(P*8) and Y=Y/2+(P*16)
+ ASL
+ ASL
+ ASL
+ STA $F3 ; P*8
+ PLA
+ AND #1
+ ASL
+ ASL
+ ASL
+ ASL
+ STA $F4 ; (P AND 1)*16
+ TXA
+ LSR
+ ADC $F3
+ TAX
+ TYA
+ LSR
+ ADC $F4
+ TAY
+ JSR set_point ; use and restore regs
+ JMP new_rnd
+
+set_point: ; uses both X,Y,A and restores them
+ PHA ; backup all reg-value (X,Y,A)
+ TXA
+ PHA
+ TYA
+ PHA
+ PHA
+ PHA ; triple Y push, two for int. use
+ STX $F2 ; transfer X to Y using $F2
+ LDY $F2
+ LDA #0
+ STA $F0
+ LDA #$2
+ STA $F1 ; set base vector to $200
+ LDA #0
+ PLA ; transfer the pushed Y-coord to A
+ AND #$07 ; the value %0000'0111
+ ASL
+ ASL
+ ASL
+ ASL
+ ASL
+ CLC
+ ADC $F0
+ STA $F0
+ BCC no_carry
+ INC $F1
+no_carry:
+ CLC
+ PLA ; transfer the pushed Y-coord to A
+ AND #$18
+ LSR
+ LSR
+ LSR
+ ADC $F1
+ STA $F1
+
+ CLC
+ TYA
+ ADC $F0
+ ADC $F1
+
+ LDA #1 ;1 = white for trouble-shooting
+ JSR set_toning_point ; use for shading
+ STA ($F0),Y ; set pixel
+ PLA ; restore all reg-value (X,Y,A)
+ TAY
+ PLA
+ TAX
+ PLA
+ RTS
+
+; sub routine to shade the current pixel ($F0),Y
+; lighter on a scale: $0, $B, $C, $F, $1
+; Black, DarkGrey, Grey, LightGrey, White
+set_toning_point:
+ LDA ($F0),Y
+ CMP #$00
+ BNE not_black
+ LDA #$0B
+ RTS
+not_black:
+ CMP #$0B
+ BNE not_dgrey
+ LDA #$0C
+ RTS
+not_dgrey:
+ CMP #$0C
+ BNE not_grey
+ LDA #$0F
+ RTS
+not_grey:
+ CMP #$0F
+ BNE not_lgrey
+ LDA #$01
+ RTS
+not_lgrey:
+; white stays white
+ RTS
+
diff --git a/hacks/images/m6502/softsprite.asm b/hacks/images/m6502/softsprite.asm
new file mode 100644
index 0000000..eab6d67
--- /dev/null
+++ b/hacks/images/m6502/softsprite.asm
@@ -0,0 +1,132 @@
+; software sprites
+; by PJP
+
+loop:
+ ldx $90
+ inx
+ stx $90
+
+ lda #4 ; *** NUMBER OF SPRITES
+ sta $3
+ lda #0
+ sta $4
+
+multiple:
+ lda $90
+ clc
+ adc $4
+ tax
+
+ lda sinus,x
+ ldy cosinus,x
+ asl
+ tax
+ lda ypos,x
+ sta $00
+ inx
+ lda ypos,x
+ sta $01
+ ldx #0
+ lda #5 ; **** HEIGHT OF EACH SPRITE
+ sta $2
+draw:
+ lda image,x
+ sta ($0),y
+ inx
+ iny
+ lda image,x
+ sta ($0),y
+ inx
+ iny
+ lda image,x
+ sta ($0),y
+ inx
+ iny
+ lda image,x
+ sta ($0),y
+ inx
+ iny
+ lda image,x
+ sta ($0),y
+
+
+ tya
+ clc
+ adc #28
+ tay
+ inx
+ dec $2
+ bne draw
+
+ lda $4
+ clc
+ adc #18 ; *** DISTANCE BETWEEN SPRITES (FROM TABLE)
+ sta $4
+
+ dec $3
+ bne multiple
+
+ jmp loop
+
+; SINUS (AND COSINUS)
+
+sinus:
+ dcb $0e, $0e, $0e, $0f, $0f, $0f, $10, $10, $10, $11
+ dcb $11, $11, $12, $12, $12, $13, $13, $13, $14, $14
+ dcb $14, $14, $15, $15, $15, $16, $16, $16, $16, $17
+ dcb $17, $17, $17, $18, $18, $18, $18, $19, $19, $19
+ dcb $19, $19, $1a, $1a, $1a, $1a, $1a, $1a, $1a, $1b
+ dcb $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b
+ dcb $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b
+cosinus:
+ dcb $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b
+ dcb $1a, $1a, $1a, $1a, $1a, $1a, $19, $19, $19, $19
+ dcb $19, $18, $18, $18, $18, $18, $17, $17, $17, $17
+ dcb $16, $16, $16, $15, $15, $15, $15, $14, $14, $14
+ dcb $13, $13, $13, $12, $12, $12, $11, $11, $11, $10
+ dcb $10, $10, $0f, $0f, $0f, $0e, $0e, $0e, $0d, $0d
+ dcb $0d, $0c, $0c, $0c, $0b, $0b, $0b, $0a, $0a, $0a
+ dcb $09, $09, $09, $08, $08, $08, $07, $07, $07, $06
+ dcb $06, $06, $06, $05, $05, $05, $04, $04, $04, $04
+ dcb $03, $03, $03, $03, $03, $02, $02, $02, $02, $02
+ dcb $01, $01, $01, $01, $01, $01, $00, $00, $00, $00
+ dcb $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
+ dcb $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
+ dcb $00, $00, $00, $00, $00, $00, $00, $01, $01, $01
+ dcb $01, $01, $01, $01, $02, $02, $02, $02, $02, $03
+ dcb $03, $03, $03, $04, $04, $04, $04, $05, $05, $05
+ dcb $05, $06, $06, $06, $07, $07, $07, $07, $08, $08
+ dcb $08, $09, $09, $09, $0a, $0a, $0a, $0b, $0b, $0b
+ dcb $0c, $0c, $0c, $0d, $0d
+
+ dcb $0e, $0e, $0e, $0f, $0f, $0f, $10, $10, $10, $11
+ dcb $11, $11, $12, $12, $12, $13, $13, $13, $14, $14
+ dcb $14, $14, $15, $15, $15, $16, $16, $16, $16, $17
+ dcb $17, $17, $17, $18, $18, $18, $18, $19, $19, $19
+ dcb $19, $19, $1a, $1a, $1a, $1a, $1a, $1a, $1a, $1b
+ dcb $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b
+ dcb $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b
+ dcb $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b, $1b
+ dcb $1a, $1a, $1a, $1a, $1a, $1a, $19, $19, $19, $19
+
+; 5x5 BYTES
+
+image:
+ dcb $0,$0,$0,$0,$0
+ dcb $0,$c,$c,$c,$0
+ dcb $0,$c,$1,$c,$0
+ dcb $0,$c,$c,$c,$0
+ dcb $0,$0,$0,$0,$0
+
+; YPOS LOOKUP TABLE
+
+ypos:
+ dcb $00,$02,$20,$02,$40,$02,$60,$02
+ dcb $80,$02,$a0,$02,$c0,$02,$e0,$02
+ dcb $00,$03,$20,$03,$40,$03,$60,$03
+ dcb $80,$03,$a0,$03,$c0,$03,$e0,$03
+ dcb $00,$04,$20,$04,$40,$04,$60,$04
+ dcb $80,$04,$a0,$04,$c0,$04,$e0,$04
+ dcb $00,$05,$20,$05,$40,$05,$60,$05
+ dcb $80,$05,$a0,$05,$c0,$05,$e0,$05
+
diff --git a/hacks/images/m6502/spacer.asm b/hacks/images/m6502/spacer.asm
new file mode 100644
index 0000000..bdecbb5
--- /dev/null
+++ b/hacks/images/m6502/spacer.asm
@@ -0,0 +1,235 @@
+; "spacer", move a space ship through an
+; endless tunnel. You die once you hit
+; the walls.
+;
+; Controls:
+;
+; W - move up
+; X - move down
+; Any other key will stop the ship
+;
+; Ps: this game runs awfully slow =)
+;
+
+start:
+ jsr init
+
+loop:
+ ;; jsr drawShip
+ jsr drawMap
+ jsr genMap
+ jsr readKeys
+ jmp loop
+
+;--
+
+drawShip:
+ lda $82 ; mychange
+; asl
+ tay
+
+ lda ypos,y
+ sta $00
+ iny
+ lda ypos,y
+ sta $01
+
+ ldx #42
+ lda ($00,x)
+ cmp #0
+ beq noCrash
+ cmp #5
+; bne crashed
+;my changes
+noCrash:
+ lda #5
+ sta ($00,x)
+
+ lda $60
+ cmp $61
+ beq ret
+
+ lda $61
+ asl
+ tay
+ lda ypos,y
+ sta $00
+ iny
+ lda ypos,y
+ sta $01
+ lda #0
+ ldx #42
+ sta ($00,x)
+
+ lda $60
+ sta $61
+ret:
+ rts
+
+;--
+
+crashed:
+ lda $fe
+ sta ($00,x)
+ jmp crashed
+
+;--
+
+readKeys:
+ lda $ff
+ cmp #119
+ bne notUp
+ dec $60
+ rts
+notUp:
+ cmp #120
+ bne noMove
+ inc $60
+noMove:
+ rts
+
+;--
+
+init:
+ ldx #0
+drawLogo:
+ lda bottomLogo,x
+ sta $500,x
+ inx
+ cpx #0
+ bne drawLogo
+
+ lda #10
+ sta $60
+ sta $61
+
+ ldx #0
+ lda #$c
+c:sta $200,x
+ sta $400,x
+ dex
+ cpx #0
+ bne c
+
+ lda #16
+ sta $80 ; origin
+ ldx #15
+set:
+ sta $81,x ; target
+ dex
+ bpl set
+ rts
+
+;--
+
+drawMap:
+ lda #0
+ sta $78
+ lda #32
+ sta $79
+ lda #192
+ sta $7a
+ lda #224
+ sta $7b
+
+ ldx #15
+drawLoop:
+ lda $81,x
+ sta $82,x
+ tay
+ lda ypos,y
+ sta $00
+ iny
+ lda ypos,y
+ sta $01
+
+ lda #$c
+ ldy $78
+ sta ($00),y
+ iny
+ sta ($00),y
+
+ ldy $7b
+ sta ($00),y
+ iny
+ sta ($00),y
+
+ ldy $79
+ lda #0
+ sta ($00),y
+ iny
+ sta ($00),y
+
+ ldy $7a
+ sta ($00),y
+ iny
+ sta ($00),y
+
+ inc $78
+ inc $79
+ inc $7a
+ inc $7b
+ inc $78
+ inc $79
+ inc $7a
+ inc $7b
+ dex
+ bpl drawLoop
+ rts
+
+;---
+
+genMap:
+ lda $80
+ cmp $81
+ beq done
+ lda $80
+ clc
+ sbc $81
+ bpl plus
+ bmi minus
+done:
+ lda $fe
+ and #$f
+ asl
+ sta $80
+ rts
+minus:
+ dec $81
+ dec $81
+ rts
+plus:
+ inc $81
+ inc $81
+ rts
+
+ypos:
+ dcb $00,$02,$20,$02,$40,$02,$60,$02
+ dcb $80,$02,$a0,$02,$c0,$02,$e0,$02
+ dcb $00,$03,$20,$03,$40,$03,$60,$03
+ dcb $80,$03,$a0,$03,$c0,$03,$e0,$03
+ dcb $00,$04,$20,$04,$40,$04,$60,$04
+ dcb $80,$04,$a0,$04,$c0,$04,$e0,$04
+ dcb $00,$05,$20,$05,$40,$05,$60,$05
+ dcb $80,$05,$a0,$05,$c0,$05,$e0,$05
+
+bottomLogo:
+ dcb $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
+ dcb $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
+ dcb $0,$0,$0,$0,$0,$0,$1,$1,$1,$6,$1,$1,$1,$0
+ dcb $0,$6,$1,$1,$6,$0,$0,$1,$1,$1,$6,$0,$1,$1
+ dcb $1,$0,$1,$1,$1,$6,$0,$0,$6,$1,$6,$0,$6,$0
+ dcb $1,$0,$6,$1,$6,$1,$6,$0,$1,$0,$1,$0,$6,$0
+ dcb $6,$1,$6,$0,$6,$0,$1,$0,$6,$1,$6,$0,$0,$6
+ dcb $1,$1,$6,$6,$1,$1,$1,$0,$6,$1,$0,$0,$1,$0
+ dcb $1,$6,$0,$6,$6,$1,$1,$1,$0,$6,$1,$0,$6,$1
+ dcb $0,$6,$6,$6,$6,$6,$1,$6,$1,$1,$6,$6,$6,$1
+ dcb $1,$1,$1,$6,$1,$6,$6,$6,$6,$1,$6,$6,$6,$6
+ dcb $1,$1,$1,$6,$6,$6,$6,$1,$1,$1,$1,$e,$1,$1
+ dcb $e,$6,$6,$1,$1,$6,$1,$6,$1,$1,$1,$1,$e,$1
+ dcb $1,$1,$1,$6,$1,$1,$6,$1,$6,$6,$6,$1,$1,$1
+ dcb $6,$e,$1,$1,$6,$e,$6,$1,$1,$e,$1,$e,$6,$1
+ dcb $1,$1,$6,$e,$1,$1,$1,$e,$1,$1,$6,$1,$6,$e
+ dcb $e,$e,$6,$e,$e,$6,$e,$e,$6,$e,$e,$6,$e,$e
+ dcb $6,$e,$e,$6,$e,$e,$6,$e,$e,$6,$e,$e,$6,$e
+ dcb $e,$6,$e,$e
diff --git a/hacks/images/m6502/starfield2d.asm b/hacks/images/m6502/starfield2d.asm
new file mode 100644
index 0000000..4c26efe
--- /dev/null
+++ b/hacks/images/m6502/starfield2d.asm
@@ -0,0 +1,50 @@
+; 2d starfield
+; Submitted by Anonymous
+
+i:ldx #$7
+g:lda $fe
+ and #3
+ adc #1
+ sta $0,x
+ lda $fe
+ and #$1f
+ sta $20,x
+ dex
+ bpl g
+f:
+ lda #$ff
+ sta $10
+ delay:
+ nop
+ dec $10
+ bne delay
+
+ lda #$00
+ sta $80
+ lda #$02
+ sta $81
+ ldx #$7
+l:lda $20,x
+ pha
+ clc
+ sbc $00,x
+ and #$1f
+ sta $20,x
+ lda $20,x
+ tay
+ lda #1
+ sta ($80),y
+ pla
+ tay
+ lda #0
+ sta ($80),y
+ lda $80
+ clc
+ adc #$80
+ bne n
+ inc $81
+n:sta $80
+ dex
+ bpl l
+ jmp f
+
diff --git a/hacks/images/m6502/texture.asm b/hacks/images/m6502/texture.asm
new file mode 100644
index 0000000..b63d0a2
--- /dev/null
+++ b/hacks/images/m6502/texture.asm
@@ -0,0 +1,393 @@
+; -*- mode: c; tab-width: 4; fill-column: 128 -*-
+; vi: set ts=4 tw=128:
+
+; Texture, Copyright (c) 2017 Dave Odell <dmo2118@gmail.com>
+;
+; Permission to use, copy, modify, distribute, and sell this software and its
+; documentation for any purpose is hereby granted without fee, provided that
+; the above copyright notice appear in all copies and that both that
+; copyright notice and this permission notice appear in supporting
+; documentation. No representations are made about the suitability of this
+; software for any purpose. It is provided "as is" without express or
+; implied warranty.
+
+; A port of 20 year old QBasic code to a much more modern platform.
+
+
+
+
+
+ lda $fe
+ sta src_row
+
+ ldy #0
+top_loop:
+ lda $fe
+ and #$f
+ sbc #$8
+ adc src_row,y
+ iny
+ sta src_row,y
+ cpy #31
+ bne top_loop
+
+lda #$00
+sta $0
+lda #$02
+sta $1
+
+init_loop:
+ jsr tex
+ clc
+ lda $0
+ adc #$20
+ sta $0
+ lda $1
+ adc #0
+ sta $1
+ cmp #$06
+ bne init_loop
+
+lda #$e0
+sta $0
+lda #$05
+sta $1
+
+loop:
+ ;jmp skip_blit
+
+ clc
+ lda #0
+ blit_loop2:
+ tay
+ lda $0220,y
+ sta $0200,y
+ lda $0221,y
+ sta $0201,y
+ lda $0222,y
+ sta $0202,y
+ lda $0223,y
+ sta $0203,y
+ lda $0224,y
+ sta $0204,y
+ lda $0225,y
+ sta $0205,y
+ lda $0226,y
+ sta $0206,y
+ lda $0227,y
+ sta $0207,y
+
+ tya
+ adc #8
+ bne blit_loop2
+
+ clc
+ lda #0
+ blit_loop3:
+ tay
+ lda $0320,y
+ sta $0300,y
+ lda $0321,y
+ sta $0301,y
+ lda $0322,y
+ sta $0302,y
+ lda $0323,y
+ sta $0303,y
+ lda $0324,y
+ sta $0304,y
+ lda $0325,y
+ sta $0305,y
+ lda $0326,y
+ sta $0306,y
+ lda $0327,y
+ sta $0307,y
+
+ tya
+ adc #8
+ bne blit_loop3
+
+ clc
+ lda #0
+ blit_loop4:
+ tay
+ lda $0420,y
+ sta $0400,y
+ lda $0421,y
+ sta $0401,y
+ lda $0422,y
+ sta $0402,y
+ lda $0423,y
+ sta $0403,y
+ lda $0424,y
+ sta $0404,y
+ lda $0425,y
+ sta $0405,y
+ lda $0426,y
+ sta $0406,y
+ lda $0427,y
+ sta $0407,y
+
+ tya
+ adc #8
+ bne blit_loop4
+
+ lda #0
+ blit_loop5:
+ tay
+ lda $0520,y
+ sta $0500,y
+ lda $0521,y
+ sta $0501,y
+ lda $0522,y
+ sta $0502,y
+ lda $0523,y
+ sta $0503,y
+ lda $0524,y
+ sta $0504,y
+ lda $0525,y
+ sta $0505,y
+ lda $0526,y
+ sta $0506,y
+ lda $0527,y
+ sta $0507,y
+
+ tya
+ clc
+ adc #8
+ cmp #$e0
+ bne blit_loop5
+
+ skip_blit:
+
+ jsr tex
+jmp loop
+
+tex:
+ lda $fe
+ and #$f
+ sbc #$8
+ adc src_row
+ sta src_row
+
+ ldy #0
+ tax
+ lda pal0,x
+ sta ($0),y
+ tex_loop0:
+ lda $fe
+ and #$f
+ sbc #$8
+ ;clc
+ adc src_row,y
+ iny
+ ;clc
+ adc src_row,y
+ ror
+ sta src_row,y
+
+ tax
+ lda pal0,x
+ sta ($0),y
+
+ cpy #31
+ bne tex_loop0
+ rts
+
+pal0:
+ dcb $00, $00, $00, $00, $00, $00, $00, $00
+ dcb $00, $00, $0b, $0b, $0b, $0b, $0b, $0b
+ dcb $0b, $0b, $0b, $0b, $0b, $0b, $0b, $0b
+ dcb $0c, $0c, $0c, $0c, $0c, $0c, $0c, $0c
+ dcb $0c, $0c, $0c, $0c, $0c, $0c, $0c, $0c
+ dcb $0f, $0f, $0f, $0f, $0f, $0f, $0f, $0f
+ dcb $0f, $0f, $0f, $0f, $0f, $0f, $0f, $0f
+ dcb $0f, $01, $01, $01, $01, $01, $01, $01
+ dcb $01, $01, $01, $01, $01, $01, $01, $01
+ dcb $0f, $0f, $0f, $0f, $0f, $0f, $0f, $0f
+ dcb $0f, $0f, $0f, $0f, $0f, $0f, $0f, $0f
+ dcb $0f, $0c, $0c, $0c, $0c, $0c, $0c, $0c
+ dcb $0c, $0c, $0c, $0c, $0c, $0c, $0c, $0c
+ dcb $0c, $0b, $0b, $0b, $0b, $0b, $0b, $0b
+ dcb $0b, $0b, $0b, $0b, $0b, $0b, $0b, $00
+ dcb $00, $00, $00, $00, $00, $00, $00, $00
+ dcb $00, $00, $00, $00, $00, $00, $00, $00
+ dcb $00, $00, $00, $00, $00, $00, $00, $00
+ dcb $0b, $0b, $0b, $0b, $0b, $0b, $0b, $0b
+ dcb $0b, $0b, $0b, $0b, $0b, $0b, $0b, $0b
+ dcb $0b, $0b, $0b, $0b, $0b, $0b, $05, $05
+ dcb $05, $05, $05, $05, $05, $05, $05, $05
+ dcb $05, $05, $05, $05, $05, $05, $05, $05
+ dcb $0d, $0d, $0d, $0d, $0d, $0d, $0d, $0d
+ dcb $0d, $0d, $0d, $0d, $0d, $0d, $0d, $0d
+ dcb $0d, $05, $05, $05, $05, $05, $05, $05
+ dcb $05, $05, $05, $05, $05, $05, $05, $05
+ dcb $05, $05, $05, $0b, $0b, $0b, $0b, $0b
+ dcb $0b, $0b, $0b, $0b, $0b, $0b, $0b, $0b
+ dcb $0b, $0b, $0b, $0b, $0b, $0b, $0b, $0b
+ dcb $0b, $00, $00, $00, $00, $00, $00, $00
+ dcb $00, $00, $00, $00, $00, $00, $00, $00
+
+src_row:
+ ; (32 bytes)
+
+; A full-resolution version of the same thing. Not perhaps the most interesting thing to look at.
+
+;#include "screenhack.h"
+;
+;#include <inttypes.h>
+;
+;struct texture
+;{
+; unsigned width, height;
+; Colormap colormap;
+; GC gc;
+; unsigned long palette[128];
+; XImage *image;
+; uint8_t *row;
+; unsigned graininess;
+; unsigned lines;
+;};
+;
+;#define GRAIN(self) (NRAND((self)->graininess * 2 + 1) - (self)->graininess)
+;
+;static void _put_line(struct texture *self, Display *dpy, Window window, unsigned y)
+;{
+; unsigned x;
+; for(x = 0; x != self->width; ++x)
+; {
+; unsigned c1 = self->row[x];
+; unsigned c0 = c1;
+; if(c0 & 64)
+; c0 ^= 127;
+; XPutPixel(self->image, x, 0, self->palette[(c0 & 63) | ((c1 & 0x80) >> 1)]);
+; }
+;
+; XPutImage(dpy, window, self->gc, self->image, 0, 0, 0, y, self->width, 1);
+;
+; *self->row += GRAIN(self);
+;
+; for(x = 1; x != self->width; ++x);
+; {
+; unsigned avg = self->row[x - 1] + self->row[x];
+; self->row[x] = ((avg + ((avg & 2) >> 1)) >> 1) + GRAIN(self);
+; }
+;
+;
+;}
+;
+;static void texture_reshape(Display *dpy, Window window, void *self_raw, unsigned w, unsigned h)
+;{
+; struct texture *self = self_raw;
+; unsigned x, y;
+;
+; if(w == self->width && h == self->height)
+; return;
+;
+; self->image->bytes_per_line = 0;
+; self->image->width = w;
+; XInitImage(self->image);
+;
+; free(self->row);
+; self->row = malloc(w);
+; free(self->image->data);
+; self->image->data = malloc(w * self->image->bytes_per_line);
+;
+; self->width = w;
+; self->height = h;
+;
+; *self->row = NRAND(0xff);
+; for(x = 1; x != self->width; ++x)
+; self->row[x] = self->row[x - 1] + GRAIN(self);
+;
+; for(y = 0; y != self->height; ++y)
+; _put_line(self, dpy, window, y);
+;}
+;
+;static void *texture_init(Display *dpy, Window window)
+;{
+; static const XGCValues gcv_src = {GXcopy};
+; XGCValues gcv = gcv_src;
+; struct texture *self = malloc(sizeof(*self));
+; XWindowAttributes xwa;
+; unsigned i;
+;
+; XGetWindowAttributes(dpy, window, &xwa);
+; self->width = 0;
+; self->height = 0;
+; self->colormap = xwa.colormap;
+;
+; self->graininess = get_integer_resource(dpy, "graininess", "Graininess");
+; self->lines = get_integer_resource(dpy, "speed", "Speed");
+;
+; for(i = 0; i != 64; ++i)
+; {
+; XColor color;
+; unsigned short a = i * (0x10000 / 64);
+;
+; color.red = a;
+; color.green = a;
+; color.blue = a;
+; if(!XAllocColor(dpy, xwa.colormap, &color))
+; abort();
+; self->palette[i] = color.pixel;
+;
+; color.red = 0;
+; color.green = a;
+; color.blue = 0;
+; if(!XAllocColor(dpy, xwa.colormap, &color))
+; abort();
+; self->palette[i | 64] = color.pixel;
+; }
+;
+; self->gc = XCreateGC(dpy, window, GCFunction, &gcv);
+; self->image = XCreateImage(dpy, xwa.visual, xwa.depth, ZPixmap, 0, NULL, 0, 1, 32, 0);
+; self->row = NULL;
+;
+; texture_reshape(dpy, window, self, xwa.width, xwa.height);
+;
+; return self;
+;}
+;
+;static unsigned long texture_draw(Display *dpy, Window window, void *self_raw)
+;{
+; struct texture *self = self_raw;
+; unsigned y;
+; XCopyArea(dpy, window, window, self->gc, 0, self->lines, self->width, self->height - self->lines, 0, 0);
+; for(y = 0; y != self->lines; ++y)
+; _put_line(self, dpy, window, self->height - self->lines + y);
+; return 16667;
+;}
+;
+;static Bool texture_event (Display *dpy, Window window, void *self_raw, XEvent *event)
+;{
+; return False;
+;}
+;
+;static void texture_free(Display *dpy, Window window, void *self_raw)
+;{
+; struct texture *self = self_raw;
+;
+; XFreeGC(dpy, self->gc);
+; XFreeColors(dpy, self->colormap, self->palette, 128, 0);
+; XDestroyImage(self->image);
+; free(self->row);
+; free(self);
+;}
+;
+;static const char *texture_defaults[] =
+;{
+; "*speed: 2",
+; "*graininess: 1",
+; "*fpsSolid: True",
+; "*fpsTop: True",
+; 0
+;};
+;
+;static XrmOptionDescRec texture_options[] =
+;{
+; {"-speed", ".speed", XrmoptionSepArg, 0},
+; {"-graininess", ".graininess", XrmoptionSepArg, 0},
+; {0, 0, 0, 0}
+;};
+;
+;XSCREENSAVER_MODULE("Texture", texture)
diff --git a/hacks/images/m6502/wave6502.asm b/hacks/images/m6502/wave6502.asm
new file mode 100644
index 0000000..b40ea66
--- /dev/null
+++ b/hacks/images/m6502/wave6502.asm
@@ -0,0 +1,164 @@
+;;; 6502 logo Jeremy English 12-January-2008
+
+start:
+ldx #0
+stx $20
+lda #5
+sta $21
+lda $fe
+sta $22
+
+loop:
+dec $21
+lda $21
+beq randcolor
+jmp pastrandcolor
+
+randcolor:
+lda #5
+sta $21
+ldx #33
+inc $22
+lda $22
+and #7
+tay
+rl:
+lda $1000,x
+beq pastcolor1
+lda color_row,y
+sta $1000,x
+
+pastcolor1:
+lda $1040,x
+beq pastcolor2
+lda color_row,y
+sta $1040,x
+
+pastcolor2:
+lda $1080,x
+beq pastcolor3
+lda color_row,y
+sta $1080,x
+
+pastcolor3:
+lda $10c0,x
+beq pastcolor4
+lda color_row,y
+sta $10c0,x
+
+pastcolor4:
+lda $1100,x
+beq pastcolor5
+lda color_row,y
+sta $1100,x
+
+pastcolor5:
+lda $1140,x
+beq pastcolor6
+lda color_row,y
+sta $1140,x
+
+pastcolor6:
+lda $1180,x
+beq pastcolor7
+lda color_row,y
+sta $1180,x
+
+pastcolor7:
+lda $11C0,x
+beq pastcolor8
+lda color_row,y
+sta $11C0,x
+
+pastcolor8:
+lda $1200,x
+beq pastcolor9
+lda color_row,y
+sta $1200,x
+
+pastcolor9:
+inx
+txa
+and #$3f
+bne rl
+
+pastrandcolor:
+
+inc $20
+lda $20
+and #$3f
+tay
+and #$1f
+tax
+lda sinus,x
+tax
+
+d:
+
+lda #0
+sta $2e0,x
+sta $3e0,x
+lda $1000,y
+sta $300,x
+lda $1080,y
+sta $320,x
+lda $1100,y
+sta $340,x
+lda $1180,y
+sta $360,x
+lda $1200,y
+sta $380,x
+lda $1280,y
+sta $3a0,x
+lda $1300,y
+sta $3c0,x
+lda $1380,y
+sta $3c0,x
+inx
+iny
+txa
+and #$1f
+bne d
+
+jmp loop
+
+; 32 ($20) long
+sinus:
+dcb 0,0,0,0,$20,$20,$20
+dcb $40,$40,$60,$80,$a0,$a0,$c0,$c0,$c0
+dcb $e0,$e0,$e0,$e0,$c0,$c0,$c0
+dcb $a0,$a0,$80,$60,$40,$40,$20,$20,$20
+
+color_row:
+dcb $7,$8,$9,$2,$4,$6,$e,$3
+
+
+*=$1000
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1
+dcb 0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1
+dcb 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0
+dcb 0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0
+dcb 0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1
+dcb 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1
+dcb 0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1
+dcb 0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1
+dcb 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1
+dcb 0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1
+dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1
+dcb 0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1
+
diff --git a/hacks/images/m6502/zookeeper.asm b/hacks/images/m6502/zookeeper.asm
new file mode 100644
index 0000000..b3e3bd2
--- /dev/null
+++ b/hacks/images/m6502/zookeeper.asm
@@ -0,0 +1,109 @@
+; We all love zookeeper !!!!
+; muhmi Nov 13, 2007 9:45 am
+
+ldx #0
+lda #0
+hupsu:
+sta $200,x
+sta $300,x
+sta $400,x
+sta $500,x
+bne hupsu
+
+
+lda #1
+ldx #0
+fill:
+txa
+tay
+lda seko,x
+tax
+lda kuva,x
+sta $200,x
+lda kuva_0,x
+sta $300,x
+lda kuva_1,x
+sta $400,x
+lda kuva_2,x
+sta $500,x
+tya
+tax
+inx
+bne fill
+
+rts
+
+seko:
+dcb 46,93,219,97,168,170,196,63,204,201,206
+dcb 56,238,25,2,186,209,191,138,226,80,128
+dcb 58,171,81,115,42,44,102,193,69,231,107
+dcb 78,5,218,103,11,13,221,130,149,16,227
+dcb 105,213,232,182,17,255,27,190,205,137,192
+dcb 222,233,94,52,229,96,18,220,202,122,166
+dcb 43,153,131,246,177,4,70,22,7,86,173
+dcb 141,151,164,32,143,40,156,185,121,132,165
+dcb 62,249,252,139,154,251,85,236,12,134,245
+dcb 184,39,195,119,242,244,162,74,1,77,51
+dcb 33,75,35,76,34,10,89,47,189,237,71
+dcb 159,9,38,101,180,116,147,140,183,157,123
+dcb 14,19,126,199,100,45,241,28,125,210,155
+dcb 41,254,31,144,55,247,111,95,57,53,223
+dcb 152,108,203,36,214,37,113,200,66,67,197
+dcb 29,250,20,212,68,87,207,163,145,211,48
+dcb 136,24,98,215,169,83,124,224,181,187,142
+dcb 84,240,54,110,234,59,243,79,50,30,114
+dcb 6,178,0,172,148,146,179,120,60,225,65
+dcb 230,208,15,72,117,248,198,106,129,92,127
+dcb 175,160,49,216,176,133,64,109,112,82,90
+dcb 235,104,158,194,8,161,167,88,91,174,23
+dcb 73,118,150,3,99,61,217,26,239,21,253
+dcb 135,188,228
+
+kuva:
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0
+dcb 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1
+dcb 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
+dcb 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1
+dcb 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,11,11
+dcb 11,0,0,0,0,0,0,1,0,0,0,11,11,11,0,0,0,0,0,1,1,1,1,1
+dcb 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
+kuva_0:
+dcb 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1
+dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1
+dcb 1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0
+dcb 0,1,15,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1
+dcb 0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,1,1,0,0,0,1,0,0,0
+dcb 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,1
+dcb 1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1,1,0,0
+dcb 0,0,15,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,1
+dcb 0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1
+kuva_1:
+dcb 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
+dcb 0,0,15,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1
+dcb 0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,1,1,0,0,0,1,1,0,0
+dcb 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1
+dcb 1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1
+dcb 1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0
+dcb 1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1
+dcb 1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1
+dcb 1,0,0,0,1,1,1,1,1,1,1,1,1,15,15,15,1,1,1,1,1,1,1,1
+dcb 1,1,15,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,15,15,15
+dcb 1,1,1,1,1,1,1,1,1,1,15,0,0,0,1,1
+kuva_2:
+dcb 1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+dcb 1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,15,15,0
+dcb 15,15,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1
+dcb 1,1,1,1,1,15,15,0,15,15,1,1,1,1,1,1,1,1,1,0,0,0,1,1
+dcb 1,0,0,0,15,1,1,1,1,1,1,1,1,15,15,0,1,1,1,1,1,1,1,1
+dcb 1,1,1,0,0,0,1,1,1,0,0,0,0,15,15,15,15,15,15,1,15,1,1,1
+dcb 1,1,15,1,15,15,15,1,1,15,0,0,0,0,1,1,1,0,0,0,0,15,15,15
+dcb 15,15,15,1,15,1,1,1,1,1,15,1,15,15,15,1,1,15,0,0,0,0,1,1
+dcb 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
+dcb 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
diff --git a/hacks/images/mac.png b/hacks/images/mac.png
new file mode 100644
index 0000000..24f57b9
--- /dev/null
+++ b/hacks/images/mac.png
Binary files differ
diff --git a/hacks/images/macbomb.png b/hacks/images/macbomb.png
new file mode 100644
index 0000000..fccd05a
--- /dev/null
+++ b/hacks/images/macbomb.png
Binary files differ
diff --git a/hacks/images/matrix1.png b/hacks/images/matrix1.png
new file mode 100644
index 0000000..b102c2c
--- /dev/null
+++ b/hacks/images/matrix1.png
Binary files differ
diff --git a/hacks/images/matrix1b.png b/hacks/images/matrix1b.png
new file mode 100644
index 0000000..43fb477
--- /dev/null
+++ b/hacks/images/matrix1b.png
Binary files differ
diff --git a/hacks/images/matrix2.png b/hacks/images/matrix2.png
new file mode 100644
index 0000000..2b5aa54
--- /dev/null
+++ b/hacks/images/matrix2.png
Binary files differ
diff --git a/hacks/images/matrix2b.png b/hacks/images/matrix2b.png
new file mode 100644
index 0000000..08308d7
--- /dev/null
+++ b/hacks/images/matrix2b.png
Binary files differ
diff --git a/hacks/images/matrix3.png b/hacks/images/matrix3.png
new file mode 100644
index 0000000..3f7c8cb
--- /dev/null
+++ b/hacks/images/matrix3.png
Binary files differ
diff --git a/hacks/images/molecules/adenine.pdb b/hacks/images/molecules/adenine.pdb
new file mode 100644
index 0000000..354056c
--- /dev/null
+++ b/hacks/images/molecules/adenine.pdb
@@ -0,0 +1,37 @@
+HEADER Adenine: Vitamin B4; Purine base nucleotide
+COMPND jb09aden
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Mon Sep 18 15:35:27 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.394 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.084 1.211 0.000 1.00 0.00
+HETATM 4 N 1 1.337 2.342 -0.002 1.00 0.00
+HETATM 5 C 1 -0.017 2.313 -0.003 1.00 0.00
+HETATM 6 N 1 -0.710 1.149 -0.001 1.00 0.00
+HETATM 7 N 1 -0.391 -1.291 0.006 1.00 0.00
+HETATM 8 C 1 0.731 -2.049 0.010 1.00 0.00
+HETATM 9 N 1 1.843 -1.276 0.007 1.00 0.00
+HETATM 10 N 1 3.485 1.257 0.004 1.00 0.00
+HETATM 11 H 1 -0.567 3.254 -0.004 1.00 0.00
+HETATM 12 H 1 -1.347 -1.630 0.010 1.00 0.00
+HETATM 13 H 1 0.738 -3.139 0.017 1.00 0.00
+HETATM 14 H 1 3.799 2.220 -0.037 1.00 0.00
+HETATM 15 H 1 3.839 0.818 0.847 1.00 0.00
+CONECT 1 2 2 6 7
+CONECT 2 1 1 3 9
+CONECT 3 2 4 4 10
+CONECT 4 3 3 5
+CONECT 5 4 6 6 11
+CONECT 6 1 5 5
+CONECT 7 1 8 12
+CONECT 8 7 9 9 13
+CONECT 9 2 8 8
+CONECT 10 3 14 15
+CONECT 11 5
+CONECT 12 7
+CONECT 13 8
+CONECT 14 10
+CONECT 15 10
+MASTER 0 0 0 0 0 0 0 0 15 0 15 0
+END
diff --git a/hacks/images/molecules/adrenochrome.pdb b/hacks/images/molecules/adrenochrome.pdb
new file mode 100644
index 0000000..c4cbef2
--- /dev/null
+++ b/hacks/images/molecules/adrenochrome.pdb
@@ -0,0 +1,55 @@
+HEADER Adrenochrome: a nerve cell transmission inhibitor, and hallucinogen
+COMPND adrenochrome
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Tue Aug 29 08:56:34 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.400 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.056 1.235 0.000 1.00 0.00
+HETATM 4 C 1 1.351 2.436 -0.011 1.00 0.00
+HETATM 5 C 1 -0.047 2.437 -0.027 1.00 0.00
+HETATM 6 C 1 -0.714 1.206 -0.013 1.00 0.00
+HETATM 7 O 1 -0.597 -1.046 -0.002 1.00 0.00
+HETATM 8 O 1 -1.918 1.181 -0.023 1.00 0.00
+HETATM 9 N 1 2.243 3.571 -0.065 1.00 0.00
+HETATM 10 C 1 1.825 4.648 0.846 1.00 0.00
+HETATM 11 C 1 3.553 3.011 0.321 1.00 0.00
+HETATM 12 C 1 3.538 1.506 -0.050 1.00 0.00
+HETATM 13 H 1 4.088 0.906 0.675 1.00 0.00
+HETATM 14 O 1 4.023 1.295 -1.381 1.00 0.00
+HETATM 15 H 1 1.962 -0.934 -0.006 1.00 0.00
+HETATM 16 H 1 -0.608 3.370 -0.059 1.00 0.00
+HETATM 17 H 1 1.674 4.250 1.849 1.00 0.00
+HETATM 18 H 1 0.895 5.089 0.489 1.00 0.00
+HETATM 19 H 1 2.596 5.418 0.873 1.00 0.00
+HETATM 20 H 1 3.683 3.101 1.400 1.00 0.00
+HETATM 21 H 1 4.364 3.531 -0.190 1.00 0.00
+HETATM 22 H 1 4.963 1.501 -1.423 1.00 0.00
+CONECT 1 2 6 7
+CONECT 1 7
+CONECT 2 1 3 15
+CONECT 2 3
+CONECT 3 2 4 12
+CONECT 4 3 5 9
+CONECT 4 5
+CONECT 5 4 6 16
+CONECT 6 1 5 8
+CONECT 6 8
+CONECT 7 1
+CONECT 8 6
+CONECT 9 4 10 11
+CONECT 10 9 17 18 19
+CONECT 11 9 12 20 21
+CONECT 12 3 11 13 14
+CONECT 13 12
+CONECT 14 12 22
+CONECT 15 2
+CONECT 16 5
+CONECT 17 10
+CONECT 18 10
+CONECT 19 10
+CONECT 20 11
+CONECT 21 11
+CONECT 22 14
+MASTER 0 0 0 0 0 0 0 0 22 0 22 0
+END
diff --git a/hacks/images/molecules/bucky.pdb b/hacks/images/molecules/bucky.pdb
new file mode 100644
index 0000000..30f5b1f
--- /dev/null
+++ b/hacks/images/molecules/bucky.pdb
@@ -0,0 +1,156 @@
+HEADER Buckminsterfullerine: Bucky Ball
+COMPND bucky
+AUTHOR
+GENERATED BY SYMAPPS 1.0
+ATOM 1 C 0.994 0.523 -3.137
+ATOM 2 C 0.418 -0.689 -3.232
+ATOM 3 C 1.239 -1.587 -2.654
+ATOM 4 C 2.172 0.376 -2.500
+ATOM 5 C 2.323 -0.928 -2.202
+ATOM 6 C 1.297 -2.968 -0.779
+ATOM 7 C 0.727 -2.610 -1.946
+ATOM 8 C -0.608 -2.733 -1.813
+ATOM 9 C -0.863 -3.172 -0.565
+ATOM 10 C 0.315 -3.321 0.074
+ATOM 11 C -1.429 -1.836 -2.393
+ATOM 12 C -0.916 -0.814 -3.106
+ATOM 13 C -1.675 0.277 -2.878
+ATOM 14 C -2.657 -0.070 -2.024
+ATOM 15 C -2.506 -1.376 -1.724
+ATOM 16 C -1.096 1.488 -2.779
+ATOM 17 C 0.239 1.614 -2.915
+ATOM 18 C 0.658 2.557 -2.049
+ATOM 19 C -0.417 3.018 -1.381
+ATOM 20 C -1.503 2.359 -1.834
+ATOM 21 C 1.833 2.405 -1.409
+ATOM 22 C 2.596 1.319 -1.640
+ATOM 23 C 3.167 0.957 -0.474
+ATOM 24 C 2.760 1.823 0.475
+ATOM 25 C 1.935 2.717 -0.104
+ATOM 26 C 3.314 -0.348 -0.175
+ATOM 27 C 2.899 -1.293 -1.041
+ATOM 28 C 2.384 -2.314 -0.328
+ATOM 29 C 2.486 -2.003 0.979
+ATOM 30 C 3.063 -0.788 1.074
+ATOM 31 C -2.321 0.938 2.198
+ATOM 32 C -1.237 1.597 2.651
+ATOM 33 C -0.417 0.699 3.231
+ATOM 34 C -2.170 -0.366 2.497
+ATOM 35 C -0.993 -0.514 3.135
+ATOM 36 C 1.671 -0.268 2.871
+ATOM 37 C 0.916 0.824 3.104
+ATOM 38 C 1.430 1.846 2.390
+ATOM 39 C 2.506 1.386 1.722
+ATOM 40 C 2.653 0.079 2.018
+ATOM 41 C 0.609 2.745 1.813
+ATOM 42 C -0.727 2.622 1.945
+ATOM 43 C -1.298 2.984 0.779
+ATOM 44 C -0.315 3.332 -0.075
+ATOM 45 C 0.863 3.183 0.564
+ATOM 46 C -2.378 2.321 0.325
+ATOM 47 C -2.896 1.302 1.038
+ATOM 48 C -3.315 0.358 0.172
+ATOM 49 C -3.062 0.797 -1.076
+ATOM 50 C -2.485 2.012 -0.982
+ATOM 51 C -3.159 -0.945 0.470
+ATOM 52 C -2.593 -1.310 1.637
+ATOM 53 C -1.837 -2.402 1.409
+ATOM 54 C -1.939 -2.714 0.103
+ATOM 55 C -2.759 -1.815 -0.477
+ATOM 56 C -0.658 -2.546 2.045
+ATOM 57 C -0.238 -1.605 2.914
+ATOM 58 C 1.097 -1.482 2.780
+ATOM 59 C 1.503 -2.349 1.832
+ATOM 60 C 0.418 -3.010 1.379
+CONECT 21 25
+CONECT 26 27
+CONECT 2 3
+CONECT 1 4
+CONECT 7 8
+CONECT 8 9
+CONECT 9 10
+CONECT 27 28
+CONECT 28 29
+CONECT 29 30
+CONECT 26 30
+CONECT 6 10
+CONECT 11 12
+CONECT 3 7
+CONECT 8 11
+CONECT 3 5
+CONECT 1 17
+CONECT 5 27
+CONECT 12 13
+CONECT 13 14
+CONECT 14 15
+CONECT 11 15
+CONECT 16 17
+CONECT 6 28
+CONECT 4 5
+CONECT 18 21
+CONECT 1 2
+CONECT 4 22
+CONECT 17 18
+CONECT 18 19
+CONECT 19 20
+CONECT 16 20
+CONECT 21 22
+CONECT 23 26
+CONECT 6 7
+CONECT 2 12
+CONECT 13 16
+CONECT 22 23
+CONECT 23 24
+CONECT 24 25
+CONECT 36 40
+CONECT 41 42
+CONECT 33 37
+CONECT 38 41
+CONECT 33 35
+CONECT 31 47
+CONECT 35 57
+CONECT 42 43
+CONECT 43 44
+CONECT 44 45
+CONECT 41 45
+CONECT 46 47
+CONECT 36 58
+CONECT 34 35
+CONECT 48 51
+CONECT 31 32
+CONECT 34 52
+CONECT 47 48
+CONECT 48 49
+CONECT 49 50
+CONECT 46 50
+CONECT 51 52
+CONECT 53 56
+CONECT 36 37
+CONECT 32 42
+CONECT 43 46
+CONECT 52 53
+CONECT 53 54
+CONECT 54 55
+CONECT 51 55
+CONECT 56 57
+CONECT 32 33
+CONECT 31 34
+CONECT 37 38
+CONECT 38 39
+CONECT 39 40
+CONECT 57 58
+CONECT 58 59
+CONECT 59 60
+CONECT 56 60
+CONECT 10 60
+CONECT 29 59
+CONECT 30 40
+CONECT 24 39
+CONECT 9 54
+CONECT 15 55
+CONECT 14 49
+CONECT 20 50
+CONECT 19 44
+CONECT 25 45
+MASTER 0 0 0 0 0 0 0 0 60 0 0 0
+END
diff --git a/hacks/images/molecules/caffeine.pdb b/hacks/images/molecules/caffeine.pdb
new file mode 100644
index 0000000..830e75e
--- /dev/null
+++ b/hacks/images/molecules/caffeine.pdb
@@ -0,0 +1,54 @@
+HEADER Caffeine: Trimethylxanthine; a cardiac stimulant and diuretic
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 29 14:53:27 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.392 0.000 0.000 1.00 0.00
+HETATM 3 N 1 2.076 1.164 0.000 1.00 0.00
+HETATM 4 C 1 1.373 2.321 -0.003 1.00 0.00
+HETATM 5 O 1 1.978 3.365 -0.017 1.00 0.00
+HETATM 6 N 1 0.017 2.344 0.003 1.00 0.00
+HETATM 7 C 1 -0.710 1.202 0.002 1.00 0.00
+HETATM 8 O 1 -1.915 1.218 -0.006 1.00 0.00
+HETATM 9 N 1 -0.404 -1.287 -0.019 1.00 0.00
+HETATM 10 N 1 1.830 -1.279 -0.020 1.00 0.00
+HETATM 11 C 1 0.715 -2.048 -0.031 1.00 0.00
+HETATM 12 C 1 -1.795 -1.761 -0.044 1.00 0.00
+HETATM 13 C 1 3.546 1.178 -0.016 1.00 0.00
+HETATM 14 C 1 -0.690 3.634 -0.013 1.00 0.00
+HETATM 15 H 1 0.720 -3.138 -0.055 1.00 0.00
+HETATM 16 H 1 -1.813 -2.850 -0.090 1.00 0.00
+HETATM 17 H 1 -2.307 -1.428 0.860 1.00 0.00
+HETATM 18 H 1 -2.302 -1.352 -0.918 1.00 0.00
+HETATM 19 H 1 3.894 1.455 -1.011 1.00 0.00
+HETATM 20 H 1 3.929 0.190 0.239 1.00 0.00
+HETATM 21 H 1 3.911 1.904 0.710 1.00 0.00
+HETATM 22 H 1 -1.557 3.583 0.645 1.00 0.00
+HETATM 23 H 1 -0.027 4.428 0.329 1.00 0.00
+HETATM 24 H 1 -1.020 3.851 -1.029 1.00 0.00
+CONECT 1 2 2 7 9
+CONECT 2 1 1 3 10
+CONECT 3 2 4 13
+CONECT 4 3 5 5 6
+CONECT 5 4 4
+CONECT 6 4 7 14
+CONECT 7 1 6 8 8
+CONECT 8 7 7
+CONECT 9 1 11 12
+CONECT 10 2 11 11
+CONECT 11 9 10 10 15
+CONECT 12 9 16 17 18
+CONECT 13 3 19 20 21
+CONECT 14 6 22 23 24
+CONECT 15 11
+CONECT 16 12
+CONECT 17 12
+CONECT 18 12
+CONECT 19 13
+CONECT 20 13
+CONECT 21 13
+CONECT 22 14
+CONECT 23 14
+CONECT 24 14
+MASTER 0 0 0 0 0 0 0 0 24 0 24 0
+END
diff --git a/hacks/images/molecules/capsaicin.pdb b/hacks/images/molecules/capsaicin.pdb
new file mode 100644
index 0000000..fb88f09
--- /dev/null
+++ b/hacks/images/molecules/capsaicin.pdb
@@ -0,0 +1,49 @@
+HEADER Capsaicin: 8-methyl-N-vanillyl-6-nonenamide; Pepper; a mucous membrane irritant
+AUTHOR Marvin
+REVDAT 1 05-MAY-09 0
+HETATM 1 C UNK 0 3.607 -1.127 0.361 0.00 0.00 C+0
+HETATM 2 C UNK 0 4.334 0.075 0.158 0.00 0.00 C+0
+HETATM 3 C UNK 0 3.650 1.279 -0.101 0.00 0.00 C+0
+HETATM 4 C UNK 0 2.246 1.299 -0.172 0.00 0.00 C+0
+HETATM 5 C UNK 0 1.494 0.118 0.015 0.00 0.00 C+0
+HETATM 6 C UNK 0 2.190 -1.085 0.285 0.00 0.00 C+0
+HETATM 7 O UNK 0 4.263 -2.208 0.588 0.00 0.00 O+0
+HETATM 8 O UNK 0 5.598 0.109 0.186 0.00 0.00 O+0
+HETATM 9 C UNK 0 3.863 -3.458 0.839 0.00 0.00 C+0
+HETATM 10 C UNK 0 0.011 0.136 -0.126 0.00 0.00 C+0
+HETATM 11 N UNK 0 -0.660 -0.367 0.987 0.00 0.00 N+0
+HETATM 12 C UNK 0 -2.024 -0.105 1.237 0.00 0.00 C+0
+HETATM 13 C UNK 0 -2.604 -0.886 2.327 0.00 0.00 C+0
+HETATM 14 O UNK 0 -2.896 0.656 0.691 0.00 0.00 O+0
+HETATM 15 C UNK 0 -3.159 -0.033 3.504 0.00 0.00 C+0
+HETATM 16 C UNK 0 -3.849 -0.911 4.584 0.00 0.00 C+0
+HETATM 17 C UNK 0 -4.419 -0.081 5.764 0.00 0.00 C+0
+HETATM 18 C UNK 0 -5.132 -0.923 6.711 0.00 0.00 C+0
+HETATM 19 C UNK 0 -4.516 -1.628 7.675 0.00 0.00 C+0
+HETATM 20 C UNK 0 -5.206 -2.525 8.600 0.00 0.00 C+0
+HETATM 21 C UNK 0 -4.662 -3.972 8.454 0.00 0.00 C+0
+HETATM 22 C UNK 0 -5.081 -2.006 10.057 0.00 0.00 C+0
+CONECT 1 2 6 7
+CONECT 2 1 3 8
+CONECT 3 2 4
+CONECT 4 3 5
+CONECT 5 4 6 10
+CONECT 6 5 1
+CONECT 7 1 9
+CONECT 8 2
+CONECT 9 7
+CONECT 10 5 11
+CONECT 11 10 12
+CONECT 12 11 13 14
+CONECT 13 12 15
+CONECT 14 12
+CONECT 15 13 16
+CONECT 16 15 17
+CONECT 17 16 18
+CONECT 18 17 19
+CONECT 19 18 20
+CONECT 20 19 21 22
+CONECT 21 20
+CONECT 22 20
+MASTER 0 0 0 0 0 0 0 0 22 0 44 0
+END
diff --git a/hacks/images/molecules/chlordecone.pdb b/hacks/images/molecules/chlordecone.pdb
new file mode 100644
index 0000000..c49e754
--- /dev/null
+++ b/hacks/images/molecules/chlordecone.pdb
@@ -0,0 +1,49 @@
+HEADER Chlordecone: Kepone, an insecticide and fungicide
+COMPND al1113
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Tue Aug 29 17:54:52 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 O 1 1.206 0.000 0.000 1.00 0.00
+HETATM 3 C 1 -0.741 1.303 0.000 1.00 0.00
+HETATM 4 C 1 -0.875 1.738 -1.482 1.00 0.00
+HETATM 5 C 1 -0.879 0.377 -2.249 1.00 0.00
+HETATM 6 C 1 -0.745 -0.666 -1.117 1.00 0.00
+HETATM 7 C 1 -2.247 0.958 -0.112 1.00 0.00
+HETATM 8 C 1 -2.380 1.999 -1.247 1.00 0.00
+HETATM 9 C 1 -2.237 -0.385 -0.887 1.00 0.00
+HETATM 10 C 1 -2.379 0.045 -2.350 1.00 0.00
+HETATM 11 C 1 -3.162 1.358 -2.394 1.00 0.00
+HETATM 12 Cl 1 0.142 3.061 -2.080 1.00 0.00
+HETATM 13 Cl 1 -0.299 2.574 1.159 1.00 0.00
+HETATM 14 Cl 1 -2.803 3.653 -0.734 1.00 0.00
+HETATM 15 Cl 1 -3.272 1.132 1.330 1.00 0.00
+HETATM 16 Cl 1 -3.275 -1.723 -0.285 1.00 0.00
+HETATM 17 Cl 1 -4.883 1.128 -1.986 1.00 0.00
+HETATM 18 Cl 1 -2.936 2.229 -3.931 1.00 0.00
+HETATM 19 Cl 1 -2.805 -1.246 -3.509 1.00 0.00
+HETATM 20 Cl 1 0.141 0.211 -3.696 1.00 0.00
+HETATM 21 Cl 1 -0.301 -2.317 -1.612 1.00 0.00
+CONECT 1 2 2 3 6
+CONECT 2 1 1
+CONECT 3 1 4 7 13
+CONECT 4 3 5 8 12
+CONECT 5 4 6 10 20
+CONECT 6 1 5 9 21
+CONECT 7 3 8 9 15
+CONECT 8 4 7 11 14
+CONECT 9 6 7 10 16
+CONECT 10 5 9 11 19
+CONECT 11 8 10 17 18
+CONECT 12 4
+CONECT 13 3
+CONECT 14 8
+CONECT 15 7
+CONECT 16 9
+CONECT 17 11
+CONECT 18 11
+CONECT 19 10
+CONECT 20 5
+CONECT 21 6
+MASTER 0 0 0 0 0 0 0 0 21 0 21 0
+END
diff --git a/hacks/images/molecules/cocaine.pdb b/hacks/images/molecules/cocaine.pdb
new file mode 100644
index 0000000..30c826f
--- /dev/null
+++ b/hacks/images/molecules/cocaine.pdb
@@ -0,0 +1,93 @@
+HEADER Cocaine: Carboxylicacid methyl ester, an anesthetic
+COMPND al3078
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.399 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.099 1.211 0.000 1.00 0.00
+HETATM 4 C 1 1.400 2.423 -0.002 1.00 0.00
+HETATM 5 C 1 0.001 2.423 -0.007 1.00 0.00
+HETATM 6 C 1 -0.700 1.213 -0.005 1.00 0.00
+HETATM 7 C 1 -2.156 1.218 -0.022 1.00 0.00
+HETATM 8 O 1 -2.759 0.175 -0.044 1.00 0.00
+HETATM 9 O 1 -2.806 2.379 -0.075 1.00 0.00
+HETATM 10 C 1 -4.168 2.239 0.272 1.00 0.00
+HETATM 11 C 1 -4.872 3.590 0.031 1.00 0.00
+HETATM 12 C 1 -4.061 4.678 0.674 1.00 0.00
+HETATM 13 O 1 -4.560 5.346 1.542 1.00 0.00
+HETATM 14 O 1 -2.741 4.690 0.497 1.00 0.00
+HETATM 15 C 1 -2.091 5.352 1.560 1.00 0.00
+HETATM 16 C 1 -6.281 3.587 0.659 1.00 0.00
+HETATM 17 N 1 -6.101 3.424 2.109 1.00 0.00
+HETATM 18 C 1 -7.084 2.348 0.212 1.00 0.00
+HETATM 19 C 1 -6.737 1.277 1.267 1.00 0.00
+HETATM 20 C 1 -5.765 1.998 2.226 1.00 0.00
+HETATM 21 C 1 -4.304 1.831 1.755 1.00 0.00
+HETATM 22 C 1 -7.322 3.768 2.857 1.00 0.00
+HETATM 23 H 1 -0.544 -0.944 -0.002 1.00 0.00
+HETATM 24 H 1 1.944 -0.944 0.000 1.00 0.00
+HETATM 25 H 1 3.189 1.211 0.001 1.00 0.00
+HETATM 26 H 1 1.945 3.367 -0.004 1.00 0.00
+HETATM 27 H 1 -0.544 3.368 -0.019 1.00 0.00
+HETATM 28 H 1 -4.624 1.481 -0.363 1.00 0.00
+HETATM 29 H 1 -4.942 3.777 -1.041 1.00 0.00
+HETATM 30 H 1 -2.425 6.389 1.609 1.00 0.00
+HETATM 31 H 1 -2.320 4.851 2.501 1.00 0.00
+HETATM 32 H 1 -1.014 5.330 1.395 1.00 0.00
+HETATM 33 H 1 -6.802 4.513 0.416 1.00 0.00
+HETATM 34 H 1 -6.806 2.035 -0.795 1.00 0.00
+HETATM 35 H 1 -8.152 2.564 0.250 1.00 0.00
+HETATM 36 H 1 -6.275 0.397 0.819 1.00 0.00
+HETATM 37 H 1 -7.641 0.988 1.803 1.00 0.00
+HETATM 38 H 1 -5.872 1.638 3.249 1.00 0.00
+HETATM 39 H 1 -3.995 0.793 1.881 1.00 0.00
+HETATM 40 H 1 -3.664 2.470 2.364 1.00 0.00
+HETATM 41 H 1 -8.166 3.167 2.523 1.00 0.00
+HETATM 42 H 1 -7.551 4.823 2.706 1.00 0.00
+HETATM 43 H 1 -7.155 3.591 3.920 1.00 0.00
+CONECT 1 2 2 6 23
+CONECT 2 1 1 3 24
+CONECT 3 2 4 4 25
+CONECT 4 3 3 5 26
+CONECT 5 4 6 6 27
+CONECT 6 1 5 5 7
+CONECT 7 6 8 8 9
+CONECT 8 7 7
+CONECT 9 7 10
+CONECT 10 9 11 21 28
+CONECT 11 10 12 16 29
+CONECT 12 11 13 13 14
+CONECT 13 12 12
+CONECT 14 12 15
+CONECT 15 14 30 31 32
+CONECT 16 11 17 18 33
+CONECT 17 16 20 22
+CONECT 18 16 19 34 35
+CONECT 19 18 20 36 37
+CONECT 20 17 19 21 38
+CONECT 21 10 20 39 40
+CONECT 22 17 41 42 43
+CONECT 23 1
+CONECT 24 2
+CONECT 25 3
+CONECT 26 4
+CONECT 27 5
+CONECT 28 10
+CONECT 29 11
+CONECT 30 15
+CONECT 31 15
+CONECT 32 15
+CONECT 33 16
+CONECT 34 18
+CONECT 35 18
+CONECT 36 19
+CONECT 37 19
+CONECT 38 20
+CONECT 39 21
+CONECT 40 21
+CONECT 41 22
+CONECT 42 22
+CONECT 43 22
+MASTER 0 0 0 0 0 0 0 0 43 0 43 0
+END
diff --git a/hacks/images/molecules/codeine.pdb b/hacks/images/molecules/codeine.pdb
new file mode 100644
index 0000000..36a79fa
--- /dev/null
+++ b/hacks/images/molecules/codeine.pdb
@@ -0,0 +1,93 @@
+HEADER Methylmorphine: Codeine, a cough reflex inhibitor
+COMPND al3083
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.400 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.107 1.211 0.000 1.00 0.00
+HETATM 4 C 1 1.445 2.445 -0.038 1.00 0.00
+HETATM 5 C 1 0.048 2.457 0.012 1.00 0.00
+HETATM 6 C 1 -0.629 1.242 0.047 1.00 0.00
+HETATM 7 C 1 -2.076 1.497 -0.256 1.00 0.00
+HETATM 8 C 1 -2.718 0.335 -1.023 1.00 0.00
+HETATM 9 C 1 -2.362 -0.955 -0.251 1.00 0.00
+HETATM 10 C 1 -0.830 -1.234 -0.281 1.00 0.00
+HETATM 11 C 1 -1.864 2.827 -1.015 1.00 0.00
+HETATM 12 C 1 -2.785 1.642 1.099 1.00 0.00
+HETATM 13 C 1 -2.549 0.335 1.888 1.00 0.00
+HETATM 14 N 1 -2.944 -0.846 1.100 1.00 0.00
+HETATM 15 C 1 -2.815 -2.080 1.892 1.00 0.00
+HETATM 16 H 1 -3.800 0.464 -1.011 1.00 0.00
+HETATM 17 C 1 -2.286 0.268 -2.470 1.00 0.00
+HETATM 18 C 1 -2.002 1.392 -3.142 1.00 0.00
+HETATM 19 C 1 -1.354 2.572 -2.453 1.00 0.00
+HETATM 20 H 1 -2.774 3.428 -1.022 1.00 0.00
+HETATM 21 O 1 -0.789 3.474 -0.352 1.00 0.00
+HETATM 22 H 1 -1.514 3.472 -3.047 1.00 0.00
+HETATM 23 O 1 0.051 2.305 -2.404 1.00 0.00
+HETATM 24 O 1 2.148 3.606 -0.170 1.00 0.00
+HETATM 25 H 1 1.942 -0.944 -0.064 1.00 0.00
+HETATM 26 H 1 3.196 1.191 -0.044 1.00 0.00
+HETATM 27 H 1 -2.856 -1.789 -0.750 1.00 0.00
+HETATM 28 H 1 -0.570 -1.581 -1.281 1.00 0.00
+HETATM 29 H 1 -0.575 -2.018 0.429 1.00 0.00
+HETATM 30 H 1 -3.852 1.800 0.945 1.00 0.00
+HETATM 31 H 1 -2.368 2.484 1.653 1.00 0.00
+HETATM 32 H 1 -3.143 0.370 2.801 1.00 0.00
+HETATM 33 H 1 -1.498 0.252 2.165 1.00 0.00
+HETATM 34 H 1 -3.495 -2.034 2.743 1.00 0.00
+HETATM 35 H 1 -1.796 -2.189 2.261 1.00 0.00
+HETATM 36 H 1 -3.075 -2.943 1.279 1.00 0.00
+HETATM 37 H 1 -2.526 -0.630 -3.039 1.00 0.00
+HETATM 38 H 1 -1.938 1.338 -4.229 1.00 0.00
+HETATM 39 H 1 0.396 2.184 -3.295 1.00 0.00
+HETATM 40 C 1 2.068 4.090 -1.493 1.00 0.00
+HETATM 41 H 1 2.413 3.325 -2.189 1.00 0.00
+HETATM 42 H 1 1.038 4.360 -1.728 1.00 0.00
+HETATM 43 H 1 2.699 4.974 -1.590 1.00 0.00
+CONECT 1 2 2 6 10
+CONECT 2 1 1 3 25
+CONECT 3 2 4 4 26
+CONECT 4 3 3 5 24
+CONECT 5 4 6 6 21
+CONECT 6 1 5 5 7
+CONECT 7 6 8 11 12
+CONECT 8 7 9 16 17
+CONECT 9 8 10 14 27
+CONECT 10 1 9 28 29
+CONECT 11 7 19 20 21
+CONECT 12 7 13 30 31
+CONECT 13 12 14 32 33
+CONECT 14 9 13 15
+CONECT 15 14 34 35 36
+CONECT 16 8
+CONECT 17 8 18 18 37
+CONECT 18 17 17 19 38
+CONECT 19 11 18 22 23
+CONECT 20 11
+CONECT 21 5 11
+CONECT 22 19
+CONECT 23 19 39
+CONECT 24 4 40
+CONECT 25 2
+CONECT 26 3
+CONECT 27 9
+CONECT 28 10
+CONECT 29 10
+CONECT 30 12
+CONECT 31 12
+CONECT 32 13
+CONECT 33 13
+CONECT 34 15
+CONECT 35 15
+CONECT 36 15
+CONECT 37 17
+CONECT 38 18
+CONECT 39 23
+CONECT 40 24 41 42 43
+CONECT 41 40
+CONECT 42 40
+CONECT 43 40
+MASTER 0 0 0 0 0 0 0 0 43 0 43 0
+END
diff --git a/hacks/images/molecules/cyclohexane.pdb b/hacks/images/molecules/cyclohexane.pdb
new file mode 100644
index 0000000..db7b5f0
--- /dev/null
+++ b/hacks/images/molecules/cyclohexane.pdb
@@ -0,0 +1,151 @@
+HEADER Cyclohexane: 1,2,3,4,5,6-hexaisopropylcyclohexane
+COMPND al3063
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Sun Sep 3 10:20:00 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.565 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.185 1.436 0.000 1.00 0.00
+HETATM 4 C 1 1.565 2.409 1.058 1.00 0.00
+HETATM 5 C 1 0.011 2.333 1.199 1.00 0.00
+HETATM 6 C 1 -0.636 0.914 1.102 1.00 0.00
+HETATM 7 C 1 2.238 -0.920 1.062 1.00 0.00
+HETATM 8 C 1 3.676 -1.279 0.632 1.00 0.00
+HETATM 9 C 1 1.540 -2.282 1.218 1.00 0.00
+HETATM 10 C 1 2.217 2.309 2.471 1.00 0.00
+HETATM 11 C 1 1.987 3.605 3.278 1.00 0.00
+HETATM 12 C 1 3.745 2.126 2.455 1.00 0.00
+HETATM 13 C 1 -0.726 0.166 2.473 1.00 0.00
+HETATM 14 C 1 -1.806 -0.942 2.413 1.00 0.00
+HETATM 15 C 1 -1.162 1.048 3.662 1.00 0.00
+HETATM 16 C 1 -0.814 3.472 0.513 1.00 0.00
+HETATM 17 C 1 -0.477 3.821 -0.947 1.00 0.00
+HETATM 18 C 1 -0.663 4.782 1.320 1.00 0.00
+HETATM 19 C 1 -0.573 0.185 -1.439 1.00 0.00
+HETATM 20 C 1 -2.077 0.514 -1.474 1.00 0.00
+HETATM 21 C 1 -0.420 -1.124 -2.240 1.00 0.00
+HETATM 22 C 1 2.365 2.070 -1.423 1.00 0.00
+HETATM 23 C 1 3.380 3.248 -1.378 1.00 0.00
+HETATM 24 C 1 2.947 1.067 -2.454 1.00 0.00
+HETATM 25 H 1 -0.308 -1.011 0.219 1.00 0.00
+HETATM 26 H 1 1.866 -0.481 -0.919 1.00 0.00
+HETATM 27 H 1 3.219 1.312 0.276 1.00 0.00
+HETATM 28 H 1 1.800 3.418 0.741 1.00 0.00
+HETATM 29 H 1 -0.171 2.602 2.221 1.00 0.00
+HETATM 30 H 1 -1.683 1.071 0.864 1.00 0.00
+HETATM 31 H 1 2.274 -0.432 2.031 1.00 0.00
+HETATM 32 H 1 4.296 -0.395 0.523 1.00 0.00
+HETATM 33 H 1 3.659 -1.819 -0.314 1.00 0.00
+HETATM 34 H 1 4.129 -1.913 1.395 1.00 0.00
+HETATM 35 H 1 1.366 -2.731 0.241 1.00 0.00
+HETATM 36 H 1 0.598 -2.162 1.743 1.00 0.00
+HETATM 37 H 1 2.167 -2.946 1.814 1.00 0.00
+HETATM 38 H 1 1.784 1.476 3.021 1.00 0.00
+HETATM 39 H 1 0.931 3.795 3.446 1.00 0.00
+HETATM 40 H 1 2.426 4.454 2.754 1.00 0.00
+HETATM 41 H 1 2.462 3.505 4.254 1.00 0.00
+HETATM 42 H 1 4.206 2.819 1.750 1.00 0.00
+HETATM 43 H 1 3.992 1.100 2.194 1.00 0.00
+HETATM 44 H 1 4.144 2.311 3.452 1.00 0.00
+HETATM 45 H 1 0.232 -0.273 2.732 1.00 0.00
+HETATM 46 H 1 -1.609 -1.663 1.627 1.00 0.00
+HETATM 47 H 1 -2.784 -0.492 2.238 1.00 0.00
+HETATM 48 H 1 -1.828 -1.479 3.361 1.00 0.00
+HETATM 49 H 1 -1.986 1.697 3.365 1.00 0.00
+HETATM 50 H 1 -0.323 1.642 4.019 1.00 0.00
+HETATM 51 H 1 -1.487 0.415 4.488 1.00 0.00
+HETATM 52 H 1 -1.870 3.206 0.555 1.00 0.00
+HETATM 53 H 1 -0.618 2.957 -1.586 1.00 0.00
+HETATM 54 H 1 0.544 4.192 -1.014 1.00 0.00
+HETATM 55 H 1 -1.151 4.606 -1.289 1.00 0.00
+HETATM 56 H 1 0.380 5.094 1.338 1.00 0.00
+HETATM 57 H 1 -1.015 4.632 2.341 1.00 0.00
+HETATM 58 H 1 -1.262 5.567 0.860 1.00 0.00
+HETATM 59 H 1 -0.035 0.957 -1.972 1.00 0.00
+HETATM 60 H 1 -2.246 1.523 -1.106 1.00 0.00
+HETATM 61 H 1 -2.630 -0.201 -0.864 1.00 0.00
+HETATM 62 H 1 -2.439 0.465 -2.501 1.00 0.00
+HETATM 63 H 1 -0.991 -1.924 -1.768 1.00 0.00
+HETATM 64 H 1 0.625 -1.418 -2.300 1.00 0.00
+HETATM 65 H 1 -0.791 -0.971 -3.254 1.00 0.00
+HETATM 66 H 1 1.430 2.438 -1.818 1.00 0.00
+HETATM 67 H 1 4.327 2.902 -0.962 1.00 0.00
+HETATM 68 H 1 3.011 4.079 -0.782 1.00 0.00
+HETATM 69 H 1 3.557 3.619 -2.388 1.00 0.00
+HETATM 70 H 1 2.183 0.367 -2.790 1.00 0.00
+HETATM 71 H 1 3.780 0.521 -2.010 1.00 0.00
+HETATM 72 H 1 3.306 1.606 -3.330 1.00 0.00
+CONECT 1 2 6 19 25
+CONECT 2 1 3 7 26
+CONECT 3 2 4 22 27
+CONECT 4 3 5 10 28
+CONECT 5 4 6 16 29
+CONECT 6 1 5 13 30
+CONECT 7 2 8 9 31
+CONECT 8 7 32 33 34
+CONECT 9 7 35 36 37
+CONECT 10 4 11 12 38
+CONECT 11 10 39 40 41
+CONECT 12 10 42 43 44
+CONECT 13 6 14 15 45
+CONECT 14 13 46 47 48
+CONECT 15 13 49 50 51
+CONECT 16 5 17 18 52
+CONECT 17 16 53 54 55
+CONECT 18 16 56 57 58
+CONECT 19 1 20 21 59
+CONECT 20 19 60 61 62
+CONECT 21 19 63 64 65
+CONECT 22 3 23 24 66
+CONECT 23 22 67 68 69
+CONECT 24 22 70 71 72
+CONECT 25 1
+CONECT 26 2
+CONECT 27 3
+CONECT 28 4
+CONECT 29 5
+CONECT 30 6
+CONECT 31 7
+CONECT 32 8
+CONECT 33 8
+CONECT 34 8
+CONECT 35 9
+CONECT 36 9
+CONECT 37 9
+CONECT 38 10
+CONECT 39 11
+CONECT 40 11
+CONECT 41 11
+CONECT 42 12
+CONECT 43 12
+CONECT 44 12
+CONECT 45 13
+CONECT 46 14
+CONECT 47 14
+CONECT 48 14
+CONECT 49 15
+CONECT 50 15
+CONECT 51 15
+CONECT 52 16
+CONECT 53 17
+CONECT 54 17
+CONECT 55 17
+CONECT 56 18
+CONECT 57 18
+CONECT 58 18
+CONECT 59 19
+CONECT 60 20
+CONECT 61 20
+CONECT 62 20
+CONECT 63 21
+CONECT 64 21
+CONECT 65 21
+CONECT 66 22
+CONECT 67 23
+CONECT 68 23
+CONECT 69 23
+CONECT 70 24
+CONECT 71 24
+CONECT 72 24
+MASTER 0 0 0 0 0 0 0 0 72 0 72 0
+END
diff --git a/hacks/images/molecules/cytosine.pdb b/hacks/images/molecules/cytosine.pdb
new file mode 100644
index 0000000..e703179
--- /dev/null
+++ b/hacks/images/molecules/cytosine.pdb
@@ -0,0 +1,33 @@
+HEADER Cytosine: Pyrimidine base nucleotide
+COMPND jb09cyto
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 29 12:35:29 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.398 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.070 1.227 0.000 1.00 0.00
+HETATM 4 N 1 1.356 2.375 0.001 1.00 0.00
+HETATM 5 C 1 0.004 2.350 0.002 1.00 0.00
+HETATM 6 N 1 -0.667 1.176 0.001 1.00 0.00
+HETATM 7 O 1 -0.611 3.389 0.004 1.00 0.00
+HETATM 8 N 1 3.477 1.271 0.003 1.00 0.00
+HETATM 9 H 1 -0.548 -0.942 0.000 1.00 0.00
+HETATM 10 H 1 1.954 -0.938 0.001 1.00 0.00
+HETATM 11 H 1 -1.681 1.178 0.002 1.00 0.00
+HETATM 12 H 1 3.791 2.109 0.480 1.00 0.00
+HETATM 13 H 1 3.844 0.453 0.477 1.00 0.00
+CONECT 1 2 2 6 9
+CONECT 2 1 1 3 10
+CONECT 3 2 4 4 8
+CONECT 4 3 3 5
+CONECT 5 4 6 7 7
+CONECT 6 1 5 11
+CONECT 7 5 5
+CONECT 8 3 12 13
+CONECT 9 1
+CONECT 10 2
+CONECT 11 6
+CONECT 12 8
+CONECT 13 8
+MASTER 0 0 0 0 0 0 0 0 13 0 13 0
+END
diff --git a/hacks/images/molecules/dna.pdb b/hacks/images/molecules/dna.pdb
new file mode 100644
index 0000000..a060671
--- /dev/null
+++ b/hacks/images/molecules/dna.pdb
@@ -0,0 +1,972 @@
+HEADER DNA: Deoxyribonucleic acid
+ATOM 1 O ??? 1 4.674 19.391 -10.106
+ATOM 2 C ??? 1 4.459 17.981 -9.876
+ATOM 3 C ??? 1 5.288 17.571 -8.673
+ATOM 4 O ??? 1 4.895 17.956 -7.317
+ATOM 5 C ??? 1 5.700 16.166 -8.515
+ATOM 6 O ??? 1 6.993 16.174 -7.868
+ATOM 7 C ??? 1 4.606 15.591 -7.605
+ATOM 8 C ??? 1 4.489 16.741 -6.607
+ATOM 9 N ??? 1 3.143 16.925 -5.903
+ATOM 10 C ??? 1 3.127 17.319 -4.578
+ATOM 11 O ??? 1 4.173 17.497 -3.993
+ATOM 12 N ??? 1 1.955 17.554 -3.958
+ATOM 13 C ??? 1 0.773 17.466 -4.621
+ATOM 14 N ??? 1 -0.393 17.691 -3.955
+ATOM 15 C ??? 1 0.722 17.134 -5.985
+ATOM 16 C ??? 1 1.945 16.843 -6.625
+ATOM 17 P ??? 1 7.833 14.873 -7.879
+ATOM 18 O ??? 1 6.913 13.703 -8.299
+ATOM 19 O ??? 1 9.116 15.075 -8.639
+ATOM 20 O ??? 1 8.137 14.505 -6.390
+ATOM 21 C ??? 1 9.093 15.196 -5.586
+ATOM 22 C ??? 1 8.913 14.574 -4.231
+ATOM 23 O ??? 1 7.518 14.735 -3.865
+ATOM 24 C ??? 1 9.081 13.086 -4.262
+ATOM 25 O ??? 1 10.078 12.703 -3.397
+ATOM 26 C ??? 1 7.686 12.473 -4.029
+ATOM 27 C ??? 1 7.063 13.543 -3.201
+ATOM 28 N ??? 1 5.563 13.566 -3.134
+ATOM 29 C ??? 1 4.657 13.394 -4.141
+ATOM 30 N ??? 1 3.380 13.664 -3.752
+ATOM 31 C ??? 1 3.485 14.024 -2.465
+ATOM 32 C ??? 1 2.474 14.525 -1.574
+ATOM 33 O ??? 1 1.309 14.806 -1.867
+ATOM 34 N ??? 1 2.958 14.808 -0.289
+ATOM 35 C ??? 1 4.279 14.700 0.121
+ATOM 36 N ??? 1 4.596 14.961 1.424
+ATOM 37 N ??? 1 5.242 14.292 -0.749
+ATOM 38 C ??? 1 4.801 13.971 -2.035
+ATOM 39 P ??? 1 10.462 11.185 -3.172
+ATOM 40 O ??? 1 9.914 10.272 -4.247
+ATOM 41 O ??? 1 11.949 11.216 -2.975
+ATOM 42 O ??? 1 9.792 10.862 -1.765
+ATOM 43 C ??? 1 10.265 11.478 -0.528
+ATOM 44 C ??? 1 9.204 11.248 0.526
+ATOM 45 O ??? 1 7.918 11.627 0.016
+ATOM 46 C ??? 1 9.052 9.838 1.036
+ATOM 47 O ??? 1 9.614 9.642 2.306
+ATOM 48 C ??? 1 7.597 9.524 0.982
+ATOM 49 C ??? 1 6.965 10.887 0.744
+ATOM 50 N ??? 1 5.832 10.810 -0.183
+ATOM 51 C ??? 1 4.534 11.009 0.257
+ATOM 52 O ??? 1 4.306 11.269 1.440
+ATOM 53 N ??? 1 3.534 10.905 -0.642
+ATOM 54 C ??? 1 3.770 10.552 -1.926
+ATOM 55 N ??? 1 2.773 10.591 -2.855
+ATOM 56 C ??? 1 5.043 10.250 -2.374
+ATOM 57 C ??? 1 6.091 10.396 -1.479
+ATOM 58 P ??? 1 9.660 8.226 2.989
+ATOM 59 O ??? 1 9.518 7.127 1.928
+ATOM 60 O ??? 1 10.794 8.089 3.999
+ATOM 61 O ??? 1 8.355 8.291 3.834
+ATOM 62 C ??? 1 8.139 9.269 4.865
+ATOM 63 C ??? 1 6.937 8.745 5.644
+ATOM 64 O ??? 1 5.814 8.819 4.753
+ATOM 65 C ??? 1 6.948 7.295 6.225
+ATOM 66 O ??? 1 6.417 7.199 7.512
+ATOM 67 C ??? 1 6.148 6.464 5.250
+ATOM 68 C ??? 1 5.222 7.503 4.599
+ATOM 69 N ??? 1 4.918 7.267 3.140
+ATOM 70 C ??? 1 5.599 6.623 2.107
+ATOM 71 N ??? 1 4.919 6.594 0.951
+ATOM 72 C ??? 1 3.772 7.259 1.254
+ATOM 73 C ??? 1 2.598 7.558 0.439
+ATOM 74 O ??? 1 2.404 7.232 -0.737
+ATOM 75 N ??? 1 1.575 8.214 1.141
+ATOM 76 C ??? 1 1.613 8.566 2.471
+ATOM 77 N ??? 1 0.502 9.125 3.046
+ATOM 78 N ??? 1 2.702 8.309 3.210
+ATOM 79 C ??? 1 3.753 7.669 2.570
+ATOM 80 P ??? 1 6.301 5.803 8.277
+ATOM 81 O ??? 1 6.480 4.589 7.476
+ATOM 82 O ??? 1 7.156 5.937 9.499
+ATOM 83 O ??? 1 4.740 5.694 8.620
+ATOM 84 C ??? 1 3.911 6.858 8.929
+ATOM 85 C ??? 1 2.515 6.690 8.311
+ATOM 86 O ??? 1 2.653 6.561 6.911
+ATOM 87 C ??? 1 1.684 5.487 8.712
+ATOM 88 O ??? 1 0.539 5.815 9.516
+ATOM 89 C ??? 1 1.353 4.792 7.399
+ATOM 90 C ??? 1 1.556 5.869 6.393
+ATOM 91 N ??? 1 1.967 5.365 5.052
+ATOM 92 C ??? 1 3.193 4.822 4.658
+ATOM 93 N ??? 1 3.258 4.448 3.362
+ATOM 94 C ??? 1 2.043 4.779 2.883
+ATOM 95 C ??? 1 1.417 4.673 1.562
+ATOM 96 N ??? 1 2.034 4.100 0.514
+ATOM 97 N ??? 1 0.156 5.177 1.374
+ATOM 98 C ??? 1 -0.498 5.699 2.441
+ATOM 99 N ??? 1 -0.077 5.807 3.720
+ATOM 100 C ??? 1 1.230 5.336 3.901
+ATOM 101 P ??? 1 -0.488 4.701 10.028
+ATOM 102 O ??? 1 0.013 3.297 10.287
+ATOM 103 O ??? 1 -1.183 5.233 11.229
+ATOM 104 O ??? 1 -1.483 4.559 8.784
+ATOM 105 C ??? 1 -2.385 5.609 8.332
+ATOM 106 C ??? 1 -3.291 4.910 7.309
+ATOM 107 O ??? 1 -2.610 4.636 6.060
+ATOM 108 C ??? 1 -3.923 3.568 7.700
+ATOM 109 O ??? 1 -5.162 3.352 7.126
+ATOM 110 C ??? 1 -2.961 2.582 7.123
+ATOM 111 C ??? 1 -2.754 3.200 5.763
+ATOM 112 N ??? 1 -1.583 2.605 5.066
+ATOM 113 C ??? 1 -0.368 2.242 5.588
+ATOM 114 N ??? 1 0.486 1.776 4.665
+ATOM 115 C ??? 1 -0.189 1.878 3.525
+ATOM 116 C ??? 1 0.183 1.571 2.180
+ATOM 117 N ??? 1 1.377 0.958 1.920
+ATOM 118 N ??? 1 -0.730 1.786 1.174
+ATOM 119 C ??? 1 -1.964 2.218 1.475
+ATOM 120 N ??? 1 -2.439 2.500 2.716
+ATOM 121 C ??? 1 -1.479 2.331 3.718
+ATOM 122 P ??? 1 -5.924 1.982 7.353
+ATOM 123 O ??? 1 -5.172 0.938 8.012
+ATOM 124 O ??? 1 -7.186 2.593 7.897
+ATOM 125 O ??? 1 -6.252 1.347 5.938
+ATOM 126 C ??? 1 -6.944 2.135 4.921
+ATOM 127 C ??? 1 -6.715 1.372 3.651
+ATOM 128 O ??? 1 -5.286 1.133 3.458
+ATOM 129 C ??? 1 -7.407 0.057 3.644
+ATOM 130 O ??? 1 -8.489 0.026 2.771
+ATOM 131 C ??? 1 -6.310 -0.990 3.438
+ATOM 132 C ??? 1 -5.156 -0.150 2.865
+ATOM 133 N ??? 1 -3.757 -0.647 3.037
+ATOM 134 C ??? 1 -2.979 -0.923 1.905
+ATOM 135 O ??? 1 -3.374 -0.727 0.747
+ATOM 136 N ??? 1 -1.687 -1.340 2.116
+ATOM 137 C ??? 1 -1.144 -1.494 3.381
+ATOM 138 O ??? 1 0.074 -1.754 3.445
+ATOM 139 C ??? 1 -1.948 -1.227 4.501
+ATOM 140 C ??? 1 -1.422 -1.319 5.892
+ATOM 141 C ??? 1 -3.248 -0.795 4.314
+ATOM 142 P ??? 1 -9.378 -1.306 2.603
+ATOM 143 O ??? 1 -9.127 -2.221 3.726
+ATOM 145 O ??? 1 -8.753 -2.007 1.349
+ATOM 146 C ??? 1 -8.460 -1.252 0.127
+ATOM 147 C ??? 1 -7.623 -2.192 -0.688
+ATOM 148 O ??? 1 -6.477 -2.562 0.073
+ATOM 149 C ??? 1 -8.255 -3.511 -1.016
+ATOM 150 O ??? 1 -8.724 -3.527 -2.285
+ATOM 151 C ??? 1 -7.224 -4.587 -0.757
+ATOM 152 C ??? 1 -6.004 -3.753 -0.494
+ATOM 153 N ??? 1 -4.890 -4.263 0.346
+ATOM 154 C ??? 1 -3.627 -4.303 -0.238
+ATOM 155 O ??? 1 -3.413 -4.052 -1.439
+ATOM 156 N ??? 1 -2.559 -4.547 0.575
+ATOM 157 C ??? 1 -2.672 -4.694 1.927
+ATOM 158 O ??? 1 -1.603 -4.845 2.510
+ATOM 159 C ??? 1 -3.962 -4.607 2.537
+ATOM 160 C ??? 1 -4.169 -4.666 4.067
+ATOM 161 C ??? 1 -5.072 -4.416 1.690
+ATOM 162 P ??? 1 -9.083 -4.896 -2.982
+ATOM 163 O ??? 1 -9.692 -5.915 -2.114
+ATOM 164 O ??? 1 -9.784 -4.333 -4.195
+ATOM 165 O ??? 1 -7.769 -5.544 -3.501
+ATOM 166 C ??? 1 -6.988 -4.787 -4.548
+ATOM 167 C ??? 1 -5.787 -5.605 -4.680
+ATOM 168 O ??? 1 -5.186 -5.816 -3.381
+ATOM 169 C ??? 1 -6.160 -6.983 -5.172
+ATOM 170 O ??? 1 -5.775 -7.049 -6.554
+ATOM 171 C ??? 1 -5.475 -7.989 -4.170
+ATOM 172 C ??? 1 -4.470 -7.095 -3.471
+ATOM 173 N ??? 1 -4.143 -7.481 -2.064
+ATOM 174 C ??? 1 -2.880 -7.900 -1.674
+ATOM 175 O ??? 1 -1.981 -8.028 -2.497
+ATOM 176 N ??? 1 -2.644 -8.106 -0.357
+ATOM 177 C ??? 1 -3.593 -7.906 0.580
+ATOM 178 N ??? 1 -3.294 -8.029 1.897
+ATOM 179 C ??? 1 -4.887 -7.515 0.234
+ATOM 180 C ??? 1 -5.144 -7.290 -1.118
+ATOM 181 P ??? 1 -6.271 -8.185 -7.504
+ATOM 182 O ??? 1 -7.612 -8.682 -7.077
+ATOM 183 O ??? 1 -6.109 -7.701 -8.887
+ATOM 184 O ??? 1 -5.255 -9.348 -7.127
+ATOM 185 C ??? 1 -3.864 -9.233 -7.443
+ATOM 186 C ??? 1 -3.265 -10.503 -6.982
+ATOM 187 O ??? 1 -3.388 -10.408 -5.569
+ATOM 188 C ??? 1 -3.913 -11.848 -7.400
+ATOM 189 O ??? 1 -2.906 -12.861 -7.541
+ATOM 190 C ??? 1 -4.865 -12.134 -6.218
+ATOM 191 C ??? 1 -3.937 -11.700 -5.115
+ATOM 192 N ??? 1 -4.370 -11.653 -3.684
+ATOM 193 C ??? 1 -5.572 -11.359 -3.092
+ATOM 194 N ??? 1 -5.502 -11.208 -1.750
+ATOM 195 C ??? 1 -4.184 -11.405 -1.464
+ATOM 196 C ??? 1 -3.484 -11.398 -0.187
+ATOM 197 O ??? 1 -3.973 -11.294 0.939
+ATOM 198 N ??? 1 -2.117 -11.651 -0.293
+ATOM 199 C ??? 1 -1.432 -11.934 -1.458
+ATOM 200 N ??? 1 -0.114 -12.247 -1.341
+ATOM 201 N ??? 1 -2.059 -11.968 -2.664
+ATOM 202 C ??? 1 -3.452 -11.687 -2.620
+ATOM 203 P ??? 1 -2.430 -13.413 -8.952
+ATOM 204 O ??? 1 -3.259 -14.642 -9.185
+ATOM 205 O ??? 1 -2.433 -12.356 -10.046
+ATOM 206 O ??? 1 -0.882 -13.756 -8.697
+ATOM 207 C ??? 1 0.079 -12.685 -8.383
+ATOM 208 C ??? 1 1.266 -13.194 -7.564
+ATOM 209 O ??? 1 0.999 -13.349 -6.166
+ATOM 210 C ??? 1 1.851 -14.504 -7.958
+ATOM 211 O ??? 1 3.274 -14.536 -7.758
+ATOM 212 C ??? 1 1.034 -15.479 -7.076
+ATOM 213 C ??? 1 1.061 -14.732 -5.783
+ATOM 214 N ??? 1 0.018 -15.063 -4.744
+ATOM 215 C ??? 1 0.371 -15.193 -3.394
+ATOM 216 O ??? 1 1.555 -15.059 -3.043
+ATOM 217 N ??? 1 -0.605 -15.422 -2.469
+ATOM 218 C ??? 1 -1.903 -15.490 -2.823
+ATOM 219 N ??? 1 -2.850 -15.626 -1.852
+ATOM 220 C ??? 1 -2.311 -15.339 -4.167
+ATOM 221 C ??? 1 -1.315 -15.115 -5.135
+ATOM 222 P ??? 1 4.029 -15.922 -7.818
+ATOM 223 O ??? 1 3.416 -16.861 -8.809
+ATOM 224 O ??? 1 5.487 -15.559 -8.011
+ATOM 225 O ??? 1 3.714 -16.639 -6.402
+ATOM 226 C ??? 1 4.699 -16.656 -5.290
+ATOM 227 C ??? 1 4.464 -17.877 -4.385
+ATOM 228 O ??? 1 3.153 -17.818 -3.885
+ATOM 229 C ??? 1 4.685 -19.342 -4.849
+ATOM 230 O ??? 1 5.420 -20.114 -3.884
+ATOM 231 C ??? 1 3.295 -19.890 -5.050
+ATOM 232 C ??? 1 2.531 -19.057 -4.020
+ATOM 233 N ??? 1 1.056 -18.734 -4.183
+ATOM 234 C ??? 1 0.273 -18.422 -5.264
+ATOM 235 N ??? 1 -1.031 -18.317 -4.953
+ATOM 236 C ??? 1 -1.093 -18.575 -3.620
+ATOM 237 C ??? 1 -2.226 -18.671 -2.719
+ATOM 238 O ??? 1 -3.418 -18.578 -2.959
+ATOM 239 N ??? 1 -1.866 -18.877 -1.414
+ATOM 240 C ??? 1 -0.581 -18.991 -0.915
+ATOM 241 N ??? 1 -0.396 -19.286 0.409
+ATOM 242 N ??? 1 0.472 -18.926 -1.725
+ATOM 243 C ??? 1 0.163 -18.734 -3.100
+ATOM 244 O ??? 1 -6.680 -19.825 7.699
+ATOM 245 C ??? 1 -6.306 -20.194 6.315
+ATOM 246 C ??? 1 -5.053 -19.445 5.920
+ATOM 247 O ??? 1 -4.418 -19.699 4.659
+ATOM 248 C ??? 1 -4.994 -17.972 6.135
+ATOM 249 O ??? 1 -3.710 -17.604 6.687
+ATOM 250 C ??? 1 -5.163 -17.510 4.681
+ATOM 251 C ??? 1 -4.498 -18.548 3.817
+ATOM 252 N ??? 1 -5.087 -18.713 2.382
+ATOM 253 C ??? 1 -4.235 -18.653 1.283
+ATOM 254 O ??? 1 -3.023 -18.634 1.498
+ATOM 255 N ??? 1 -4.753 -18.618 0.009
+ATOM 256 C ??? 1 -6.087 -18.707 -0.208
+ATOM 257 N ??? 1 -6.569 -18.815 -1.491
+ATOM 258 C ??? 1 -6.991 -18.809 0.869
+ATOM 259 C ??? 1 -6.468 -18.783 2.177
+ATOM 260 P ??? 1 -3.519 -16.827 8.069
+ATOM 261 O ??? 1 -4.231 -15.537 8.035
+ATOM 262 O ??? 1 -3.821 -17.708 9.240
+ATOM 263 O ??? 1 -1.956 -16.549 8.073
+ATOM 264 C ??? 1 -0.947 -17.650 8.003
+ATOM 265 C ??? 1 0.325 -17.111 7.352
+ATOM 266 O ??? 1 0.066 -17.132 5.962
+ATOM 267 C ??? 1 0.613 -15.669 7.661
+ATOM 268 O ??? 1 1.856 -15.388 8.203
+ATOM 269 C ??? 1 0.265 -14.853 6.465
+ATOM 270 C ??? 1 0.285 -15.854 5.380
+ATOM 271 N ??? 1 -0.824 -15.536 4.452
+ATOM 272 C ??? 1 -2.113 -15.141 4.752
+ATOM 273 N ??? 1 -2.810 -14.728 3.684
+ATOM 274 C ??? 1 -1.957 -14.896 2.652
+ATOM 275 C ??? 1 -2.142 -14.574 1.260
+ATOM 276 O ??? 1 -3.179 -14.132 0.774
+ATOM 277 N ??? 1 -1.001 -14.804 0.451
+ATOM 278 C ??? 1 0.192 -15.336 0.902
+ATOM 279 N ??? 1 1.184 -15.515 0.002
+ATOM 280 N ??? 1 0.382 -15.672 2.205
+ATOM 281 C ??? 1 -0.729 -15.444 3.059
+ATOM 282 P ??? 1 2.293 -13.866 8.376
+ATOM 283 O ??? 1 1.086 -13.042 8.626
+ATOM 284 O ??? 1 3.396 -13.816 9.377
+ATOM 285 O ??? 1 2.922 -13.420 7.025
+ATOM 286 C ??? 1 4.007 -14.108 6.407
+ATOM 287 C ??? 1 4.054 -13.498 5.013
+ATOM 288 O ??? 1 2.780 -13.607 4.393
+ATOM 289 C ??? 1 4.326 -12.019 4.962
+ATOM 290 O ??? 1 5.715 -11.793 5.178
+ATOM 291 C ??? 1 3.795 -11.615 3.565
+ATOM 292 C ??? 1 2.647 -12.603 3.423
+ATOM 293 N ??? 1 1.244 -12.133 3.536
+ATOM 294 C ??? 1 0.427 -12.102 2.410
+ATOM 295 O ??? 1 0.835 -12.492 1.323
+ATOM 296 N ??? 1 -0.850 -11.713 2.533
+ATOM 297 C ??? 1 -1.391 -11.421 3.723
+ATOM 298 N ??? 1 -2.628 -10.831 3.762
+ATOM 299 C ??? 1 -0.649 -11.574 4.913
+ATOM 300 C ??? 1 0.708 -11.938 4.796
+ATOM 301 P ??? 1 6.336 -10.366 5.128
+ATOM 302 O ??? 1 5.449 -9.428 5.909
+ATOM 303 O ??? 1 7.745 -10.482 5.620
+ATOM 304 O ??? 1 6.290 -10.020 3.569
+ATOM 305 C ??? 1 7.055 -10.811 2.615
+ATOM 306 C ??? 1 6.734 -10.308 1.217
+ATOM 307 O ??? 1 5.297 -10.192 1.100
+ATOM 308 C ??? 1 7.286 -8.975 0.718
+ATOM 309 O ??? 1 7.393 -8.945 -0.714
+ATOM 310 C ??? 1 6.225 -7.973 1.221
+ATOM 311 C ??? 1 4.974 -8.794 0.845
+ATOM 312 N ??? 1 3.773 -8.455 1.602
+ATOM 313 C ??? 1 3.640 -7.981 2.890
+ATOM 314 N ??? 1 2.384 -7.801 3.240
+ATOM 315 C ??? 1 1.667 -8.192 2.129
+ATOM 316 C ??? 1 0.216 -8.383 1.898
+ATOM 317 O ??? 1 -0.692 -8.327 2.724
+ATOM 318 N ??? 1 -0.115 -8.589 0.569
+ATOM 319 C ??? 1 0.807 -8.696 -0.461
+ATOM 320 N ??? 1 0.345 -8.866 -1.749
+ATOM 321 N ??? 1 2.149 -8.691 -0.209
+ATOM 322 C ??? 1 2.524 -8.455 1.086
+ATOM 323 P ??? 1 7.575 -7.564 -1.471
+ATOM 324 O ??? 1 7.955 -6.449 -0.479
+ATOM 325 O ??? 1 8.741 -7.728 -2.458
+ATOM 326 O ??? 1 6.254 -7.373 -2.307
+ATOM 327 C ??? 1 6.024 -8.272 -3.442
+ATOM 328 C ??? 1 5.019 -7.727 -4.455
+ATOM 329 O ??? 1 3.633 -7.467 -4.002
+ATOM 330 C ??? 1 5.448 -6.462 -5.147
+ATOM 331 O ??? 1 5.043 -6.461 -6.529
+ATOM 332 C ??? 1 4.765 -5.380 -4.322
+ATOM 333 C ??? 1 3.522 -6.055 -3.759
+ATOM 334 N ??? 1 3.349 -5.765 -2.284
+ATOM 335 C ??? 1 4.280 -5.485 -1.291
+ATOM 336 N ??? 1 3.718 -5.218 -0.101
+ATOM 337 C ??? 1 2.389 -5.311 -0.337
+ATOM 338 C ??? 1 1.210 -5.068 0.470
+ATOM 339 N ??? 1 1.297 -4.554 1.713
+ATOM 340 N ??? 1 -0.018 -5.382 -0.038
+ATOM 341 C ??? 1 -0.107 -5.816 -1.309
+ATOM 342 N ??? 1 0.900 -5.988 -2.198
+ATOM 343 C ??? 1 2.136 -5.713 -1.640
+ATOM 344 P ??? 1 4.958 -5.104 -7.365
+ATOM 345 O ??? 1 5.978 -4.099 -6.859
+ATOM 346 O ??? 1 5.021 -5.615 -8.756
+ATOM 347 O ??? 1 3.560 -4.533 -7.033
+ATOM 348 C ??? 1 2.362 -5.321 -7.154
+ATOM 349 C ??? 1 1.273 -4.376 -6.720
+ATOM 350 O ??? 1 1.389 -4.141 -5.316
+ATOM 351 C ??? 1 1.322 -2.993 -7.366
+ATOM 352 O ??? 1 0.329 -2.831 -8.391
+ATOM 353 C ??? 1 1.333 -1.991 -6.194
+ATOM 354 C ??? 1 0.897 -2.852 -5.006
+ATOM 355 N ??? 1 1.537 -2.528 -3.709
+ATOM 356 C ??? 1 2.863 -2.388 -3.374
+ATOM 357 N ??? 1 3.059 -2.100 -2.081
+ATOM 358 C ??? 1 1.825 -2.100 -1.562
+ATOM 359 C ??? 1 1.312 -1.785 -0.242
+ATOM 360 N ??? 1 2.105 -1.419 0.792
+ATOM 361 N ??? 1 -0.035 -1.681 -0.088
+ATOM 362 C ??? 1 -0.863 -1.975 -1.112
+ATOM 363 N ??? 1 -0.516 -2.341 -2.360
+ATOM 364 C ??? 1 0.871 -2.352 -2.537
+ATOM 365 P ??? 1 0.096 -1.455 -9.141
+ATOM 366 O ??? 1 1.403 -0.827 -9.454
+ATOM 367 O ??? 1 -0.784 -1.681 -10.328
+ATOM 368 O ??? 1 -0.708 -0.618 -8.042
+ATOM 369 C ??? 1 -2.026 -1.063 -7.621
+ATOM 370 C ??? 1 -2.460 -0.283 -6.398
+ATOM 371 O ??? 1 -1.482 -0.424 -5.323
+ATOM 372 C ??? 1 -2.702 1.209 -6.627
+ATOM 373 O ??? 1 -4.034 1.463 -6.980
+ATOM 374 C ??? 1 -2.262 1.804 -5.316
+ATOM 375 C ??? 1 -1.039 0.909 -5.075
+ATOM 376 N ??? 1 -0.210 0.993 -3.836
+ATOM 377 C ??? 1 -0.736 1.017 -2.546
+ATOM 378 O ??? 1 -1.957 0.851 -2.314
+ATOM 379 N ??? 1 0.164 1.108 -1.498
+ATOM 380 C ??? 1 1.538 1.199 -1.677
+ATOM 381 O ??? 1 2.250 1.226 -0.672
+ATOM 382 C ??? 1 2.054 1.179 -2.992
+ATOM 383 C ??? 1 3.521 1.367 -3.242
+ATOM 384 C ??? 1 1.153 1.065 -4.071
+ATOM 385 P ??? 1 -4.609 2.928 -7.269
+ATOM 386 O ??? 1 -3.623 3.841 -7.848
+ATOM 387 O ??? 1 -5.862 2.588 -8.032
+ATOM 388 O ??? 1 -4.884 3.503 -5.838
+ATOM 389 C ??? 1 -5.822 2.805 -4.954
+ATOM 390 C ??? 1 -5.829 3.570 -3.680
+ATOM 391 O ??? 1 -4.506 3.511 -3.227
+ATOM 392 C ??? 1 -6.172 5.046 -3.735
+ATOM 393 O ??? 1 -7.441 5.291 -3.123
+ATOM 394 C ??? 1 -5.006 5.747 -3.052
+ATOM 395 C ??? 1 -4.274 4.597 -2.370
+ATOM 396 N ??? 1 -2.767 4.703 -2.324
+ATOM 397 C ??? 1 -2.085 4.842 -1.117
+ATOM 398 O ??? 1 -2.678 5.024 -0.043
+ATOM 399 N ??? 1 -0.697 4.808 -1.172
+ATOM 400 C ??? 1 0.014 4.669 -2.366
+ATOM 401 O ??? 1 1.237 4.636 -2.312
+ATOM 402 C ??? 1 -0.682 4.595 -3.576
+ATOM 403 C ??? 1 0.027 4.511 -4.924
+ATOM 404 C ??? 1 -2.079 4.607 -3.526
+ATOM 405 P ??? 1 -8.018 6.766 -2.948
+ATOM 406 O ??? 1 -7.635 7.566 -4.152
+ATOM 407 O ??? 1 -9.476 6.706 -2.680
+ATOM 408 O ??? 1 -7.320 7.281 -1.652
+ATOM 409 C ??? 1 -7.634 6.745 -0.332
+ATOM 410 C ??? 1 -6.740 7.536 0.578
+ATOM 411 O ??? 1 -5.356 7.300 0.129
+ATOM 412 C ??? 1 -6.992 9.072 0.483
+ATOM 413 O ??? 1 -7.500 9.642 1.681
+ATOM 414 C ??? 1 -5.648 9.640 0.010
+ATOM 415 C ??? 1 -4.683 8.515 0.475
+ATOM 416 N ??? 1 -3.379 8.489 -0.149
+ATOM 417 C ??? 1 -2.166 8.504 0.541
+ATOM 418 O ??? 1 -2.158 8.517 1.779
+ATOM 419 N ??? 1 -1.010 8.423 -0.184
+ATOM 420 C ??? 1 -1.042 8.316 -1.562
+ATOM 421 N ??? 1 0.083 8.179 -2.370
+ATOM 422 C ??? 1 -2.249 8.284 -2.244
+ATOM 423 C ??? 1 -3.426 8.372 -1.520
+ATOM 424 P ??? 1 -8.072 11.149 1.769
+ATOM 425 O ??? 1 -8.359 11.946 0.569
+ATOM 426 O ??? 1 -9.253 11.131 2.697
+ATOM 427 O ??? 1 -6.842 11.901 2.427
+ATOM 428 C ??? 1 -6.195 11.442 3.679
+ATOM 429 C ??? 1 -4.912 12.282 3.817
+ATOM 430 O ??? 1 -3.876 11.994 2.873
+ATOM 431 C ??? 1 -5.090 13.728 3.629
+ATOM 432 O ??? 1 -4.492 14.502 4.643
+ATOM 433 C ??? 1 -4.542 14.026 2.249
+ATOM 434 C ??? 1 -3.391 13.126 2.230
+ATOM 435 N ??? 1 -2.856 12.707 0.897
+ATOM 436 C ??? 1 -3.473 12.442 -0.319
+ATOM 437 N ??? 1 -2.637 12.015 -1.293
+ATOM 438 C ??? 1 -1.436 12.007 -0.688
+ATOM 439 C ??? 1 -0.127 11.608 -1.179
+ATOM 440 O ??? 1 0.172 11.212 -2.291
+ATOM 441 N ??? 1 0.874 11.683 -0.204
+ATOM 442 C ??? 1 0.686 12.119 1.100
+ATOM 443 N ??? 1 1.749 12.103 1.939
+ATOM 444 N ??? 1 -0.519 12.555 1.528
+ATOM 445 C ??? 1 -1.544 12.446 0.633
+ATOM 446 P ??? 1 -5.127 15.894 4.858
+ATOM 447 O ??? 1 -5.425 16.629 3.561
+ATOM 448 O ??? 1 -6.250 15.527 5.754
+ATOM 449 O ??? 1 -4.002 16.793 5.584
+ATOM 450 C ??? 1 -3.238 16.255 6.678
+ATOM 451 C ??? 1 -1.830 16.039 6.216
+ATOM 452 O ??? 1 -1.871 15.509 4.883
+ATOM 453 C ??? 1 -0.873 17.253 6.173
+ATOM 454 O ??? 1 -0.153 17.520 7.416
+ATOM 455 C ??? 1 0.090 16.942 5.027
+ATOM 456 C ??? 1 -0.595 15.819 4.260
+ATOM 457 N ??? 1 -0.730 16.057 2.785
+ATOM 458 C ??? 1 0.227 15.578 1.903
+ATOM 459 O ??? 1 1.293 15.046 2.291
+ATOM 460 N ??? 1 -0.055 15.614 0.600
+ATOM 461 C ??? 1 -1.197 16.106 0.107
+ATOM 462 N ??? 1 -1.457 15.971 -1.213
+ATOM 463 C ??? 1 -2.157 16.670 0.937
+ATOM 464 C ??? 1 -1.890 16.634 2.320
+ATOM 465 P ??? 1 0.085 19.035 7.891
+ATOM 466 O ??? 1 -1.103 19.918 7.465
+ATOM 467 O ??? 1 0.455 19.118 9.333
+ATOM 468 O ??? 1 1.304 19.503 6.967
+ATOM 469 C ??? 1 2.588 19.092 7.215
+ATOM 470 C ??? 1 3.346 19.369 5.986
+ATOM 471 O ??? 1 2.968 18.509 4.924
+ATOM 472 C ??? 1 3.325 20.751 5.383
+ATOM 473 O ??? 1 3.907 21.749 6.266
+ATOM 474 C ??? 1 4.203 20.393 4.162
+ATOM 475 C ??? 1 3.516 19.074 3.711
+ATOM 476 N ??? 1 2.407 19.227 2.697
+ATOM 477 C ??? 1 1.165 19.783 2.799
+ATOM 478 N ??? 1 0.472 19.784 1.639
+ATOM 479 C ??? 1 1.290 19.206 0.763
+ATOM 480 C ??? 1 1.097 18.852 -0.624
+ATOM 481 O ??? 1 0.123 18.893 -1.321
+ATOM 482 N ??? 1 2.227 18.334 -1.206
+ATOM 483 C ??? 1 3.438 18.092 -0.570
+ATOM 484 N ??? 1 4.500 17.628 -1.280
+ATOM 485 N ??? 1 3.571 18.322 0.734
+ATOM 486 C ??? 1 2.483 18.897 1.373
+CONECT 1 2
+CONECT 2 1 3
+CONECT 3 2 4 5
+CONECT 4 3 8
+CONECT 5 3 6 7
+CONECT 6 5 17
+CONECT 7 5 8
+CONECT 8 4 7 9
+CONECT 9 8 10 16
+CONECT 10 9 11 12
+CONECT 11 10
+CONECT 12 10 13
+CONECT 13 12 14 15
+CONECT 14 13
+CONECT 15 13 16
+CONECT 16 9 15
+CONECT 17 6 18 19 20
+CONECT 18 17
+CONECT 19 17
+CONECT 20 17 21
+CONECT 21 20 22
+CONECT 22 21 23 24
+CONECT 23 22 27
+CONECT 24 22 25 26
+CONECT 25 24 39
+CONECT 26 24 27
+CONECT 27 23 26 28
+CONECT 28 27 29 38
+CONECT 29 28 30
+CONECT 30 29 31
+CONECT 31 30 32 38
+CONECT 32 31 33 34
+CONECT 33 32
+CONECT 34 32 35
+CONECT 35 34 36 37
+CONECT 36 35
+CONECT 37 35 38
+CONECT 38 28 31 37
+CONECT 39 25 40 41 42
+CONECT 40 39
+CONECT 41 39
+CONECT 42 39 43
+CONECT 43 42 44
+CONECT 44 43 45 46
+CONECT 45 44 49
+CONECT 46 44 47 48
+CONECT 47 46 58
+CONECT 48 46 49
+CONECT 49 45 48 50
+CONECT 50 49 51 57
+CONECT 51 50 52 53
+CONECT 52 51
+CONECT 53 51 54
+CONECT 54 53 55 56
+CONECT 55 54
+CONECT 56 54 57
+CONECT 57 50 56
+CONECT 58 47 59 60 61
+CONECT 59 58
+CONECT 60 58
+CONECT 61 58 62
+CONECT 62 61 63
+CONECT 63 62 64 65
+CONECT 64 63 68
+CONECT 65 63 66 67
+CONECT 66 65 80
+CONECT 67 65 68
+CONECT 68 64 67 69
+CONECT 69 68 70 79
+CONECT 70 69 71
+CONECT 71 70 72
+CONECT 72 71 73 79
+CONECT 73 72 74 75
+CONECT 74 73
+CONECT 75 73 76
+CONECT 76 75 77 78
+CONECT 77 76
+CONECT 78 76 79
+CONECT 79 69 72 78
+CONECT 80 66 81 82 83
+CONECT 81 80
+CONECT 82 80
+CONECT 83 80 84
+CONECT 84 83 85
+CONECT 85 84 86 87
+CONECT 86 85 90
+CONECT 87 85 88 89
+CONECT 88 87 101
+CONECT 89 87 90
+CONECT 90 86 89 91
+CONECT 91 90 92 100
+CONECT 92 91 93
+CONECT 93 92 94
+CONECT 94 93 95 100
+CONECT 95 94 96 97
+CONECT 96 95
+CONECT 97 95 98
+CONECT 98 97 99
+CONECT 99 98 100
+CONECT 100 91 94 99
+CONECT 101 88 102 103 104
+CONECT 102 101
+CONECT 103 101
+CONECT 104 101 105
+CONECT 105 104 106
+CONECT 106 105 107 108
+CONECT 107 106 111
+CONECT 108 106 109 110
+CONECT 109 108 122
+CONECT 110 108 111
+CONECT 111 107 110 112
+CONECT 112 111 113 121
+CONECT 113 112 114
+CONECT 114 113 115
+CONECT 115 114 116 121
+CONECT 116 115 117 118
+CONECT 117 116
+CONECT 118 116 119
+CONECT 119 118 120
+CONECT 120 119 121
+CONECT 121 112 115 120
+CONECT 122 109 123 124 125
+CONECT 123 122
+CONECT 124 122
+CONECT 125 122 126
+CONECT 126 125 127
+CONECT 127 126 128 129
+CONECT 128 127 132
+CONECT 129 127 130 131
+CONECT 130 129 142
+CONECT 131 129 132
+CONECT 132 128 131 133
+CONECT 133 132 134 141
+CONECT 134 133 135 136
+CONECT 135 134
+CONECT 136 134 137
+CONECT 137 136 138 139
+CONECT 138 137
+CONECT 139 137 140 141
+CONECT 140 139
+CONECT 141 133 139
+CONECT 142 130 143 145
+CONECT 143 142
+CONECT 145 142 146
+CONECT 146 145 147
+CONECT 147 146 148 149
+CONECT 148 147 152
+CONECT 149 147 150 151
+CONECT 150 149 162
+CONECT 151 149 152
+CONECT 152 148 151 153
+CONECT 153 152 154 161
+CONECT 154 153 155 156
+CONECT 155 154
+CONECT 156 154 157
+CONECT 157 156 158 159
+CONECT 158 157
+CONECT 159 157 160 161
+CONECT 160 159
+CONECT 161 153 159
+CONECT 162 150 163 164 165
+CONECT 163 162
+CONECT 164 162
+CONECT 165 162 166
+CONECT 166 165 167
+CONECT 167 166 168 169
+CONECT 168 167 172
+CONECT 169 167 170 171
+CONECT 170 169 181
+CONECT 171 169 172
+CONECT 172 168 171 173
+CONECT 173 172 174 180
+CONECT 174 173 175 176
+CONECT 175 174
+CONECT 176 174 177
+CONECT 177 176 178 179
+CONECT 178 177
+CONECT 179 177 180
+CONECT 180 173 179
+CONECT 181 170 182 183 184
+CONECT 182 181
+CONECT 183 181
+CONECT 184 181 185
+CONECT 185 184 186
+CONECT 186 185 187 188
+CONECT 187 186 191
+CONECT 188 186 189 190
+CONECT 189 188 203
+CONECT 190 188 191
+CONECT 191 187 190 192
+CONECT 192 191 193 202
+CONECT 193 192 194
+CONECT 194 193 195
+CONECT 195 194 196 202
+CONECT 196 195 197 198
+CONECT 197 196
+CONECT 198 196 199
+CONECT 199 198 200 201
+CONECT 200 199
+CONECT 201 199 202
+CONECT 202 192 195 201
+CONECT 203 189 204 205 206
+CONECT 204 203
+CONECT 205 203
+CONECT 206 203 207
+CONECT 207 206 208
+CONECT 208 207 209 210
+CONECT 209 208 213
+CONECT 210 208 211 212
+CONECT 211 210 222
+CONECT 212 210 213
+CONECT 213 209 212 214
+CONECT 214 213 215 221
+CONECT 215 214 216 217
+CONECT 216 215
+CONECT 217 215 218
+CONECT 218 217 219 220
+CONECT 219 218
+CONECT 220 218 221
+CONECT 221 214 220
+CONECT 222 211 223 224 225
+CONECT 223 222
+CONECT 224 222
+CONECT 225 222 226
+CONECT 226 225 227
+CONECT 227 226 228 229
+CONECT 228 227 232
+CONECT 229 227 230 231
+CONECT 230 229
+CONECT 231 229 232
+CONECT 232 228 231 233
+CONECT 233 232 234 243
+CONECT 234 233 235
+CONECT 235 234 236
+CONECT 236 235 237 243
+CONECT 237 236 238 239
+CONECT 238 237
+CONECT 239 237 240
+CONECT 240 239 241 242
+CONECT 241 240
+CONECT 242 240 243
+CONECT 243 233 236 242
+CONECT 244 245
+CONECT 245 244 246
+CONECT 246 245 247 248
+CONECT 247 246 251
+CONECT 248 246 249 250
+CONECT 249 248 260
+CONECT 250 248 251
+CONECT 251 247 250 252
+CONECT 252 251 253 259
+CONECT 253 252 254 255
+CONECT 254 253
+CONECT 255 253 256
+CONECT 256 255 257 258
+CONECT 257 256
+CONECT 258 256 259
+CONECT 259 252 258
+CONECT 260 249 261 262 263
+CONECT 261 260
+CONECT 262 260
+CONECT 263 260 264
+CONECT 264 263 265
+CONECT 265 264 266 267
+CONECT 266 265 270
+CONECT 267 265 268 269
+CONECT 268 267 282
+CONECT 269 267 270
+CONECT 270 266 269 271
+CONECT 271 270 272 281
+CONECT 272 271 273
+CONECT 273 272 274
+CONECT 274 273 275 281
+CONECT 275 274 276 277
+CONECT 276 275
+CONECT 277 275 278
+CONECT 278 277 279 280
+CONECT 279 278
+CONECT 280 278 281
+CONECT 281 271 274 280
+CONECT 282 268 283 284 285
+CONECT 283 282
+CONECT 284 282
+CONECT 285 282 286
+CONECT 286 285 287
+CONECT 287 286 288 289
+CONECT 288 287 292
+CONECT 289 287 290 291
+CONECT 290 289 301
+CONECT 291 289 292
+CONECT 292 288 291 293
+CONECT 293 292 294 300
+CONECT 294 293 295 296
+CONECT 295 294
+CONECT 296 294 297
+CONECT 297 296 298 299
+CONECT 298 297
+CONECT 299 297 300
+CONECT 300 293 299
+CONECT 301 290 302 303 304
+CONECT 302 301
+CONECT 303 301
+CONECT 304 301 305
+CONECT 305 304 306
+CONECT 306 305 307 308
+CONECT 307 306 311
+CONECT 308 306 309 310
+CONECT 309 308 323
+CONECT 310 308 311
+CONECT 311 307 310 312
+CONECT 312 311 313 322
+CONECT 313 312 314
+CONECT 314 313 315
+CONECT 315 314 316 322
+CONECT 316 315 317 318
+CONECT 317 316
+CONECT 318 316 319
+CONECT 319 318 320 321
+CONECT 320 319
+CONECT 321 319 322
+CONECT 322 312 315 321
+CONECT 323 309 324 325 326
+CONECT 324 323
+CONECT 325 323
+CONECT 326 323 327
+CONECT 327 326 328
+CONECT 328 327 329 330
+CONECT 329 328 333
+CONECT 330 328 331 332
+CONECT 331 330 344
+CONECT 332 330 333
+CONECT 333 329 332 334
+CONECT 334 333 335 343
+CONECT 335 334 336
+CONECT 336 335 337
+CONECT 337 336 338 343
+CONECT 338 337 339 340
+CONECT 339 338
+CONECT 340 338 341
+CONECT 341 340 342
+CONECT 342 341 343
+CONECT 343 334 337 342
+CONECT 344 331 345 346 347
+CONECT 345 344
+CONECT 346 344
+CONECT 347 344 348
+CONECT 348 347 349
+CONECT 349 348 350 351
+CONECT 350 349 354
+CONECT 351 349 352 353
+CONECT 352 351 365
+CONECT 353 351 354
+CONECT 354 350 353 355
+CONECT 355 354 356 364
+CONECT 356 355 357
+CONECT 357 356 358
+CONECT 358 357 359 364
+CONECT 359 358 360 361
+CONECT 360 359
+CONECT 361 359 362
+CONECT 362 361 363
+CONECT 363 362 364
+CONECT 364 355 358 363
+CONECT 365 352 366 367 368
+CONECT 366 365
+CONECT 367 365
+CONECT 368 365 369
+CONECT 369 368 370
+CONECT 370 369 371 372
+CONECT 371 370 375
+CONECT 372 370 373 374
+CONECT 373 372 385
+CONECT 374 372 375
+CONECT 375 371 374 376
+CONECT 376 375 377 384
+CONECT 377 376 378 379
+CONECT 378 377
+CONECT 379 377 380
+CONECT 380 379 381 382
+CONECT 381 380
+CONECT 382 380 383 384
+CONECT 383 382
+CONECT 384 376 382
+CONECT 385 373 386 387 388
+CONECT 386 385
+CONECT 387 385
+CONECT 388 385 389
+CONECT 389 388 390
+CONECT 390 389 391 392
+CONECT 391 390 395
+CONECT 392 390 393 394
+CONECT 393 392 405
+CONECT 394 392 395
+CONECT 395 391 394 396
+CONECT 396 395 397 404
+CONECT 397 396 398 399
+CONECT 398 397
+CONECT 399 397 400
+CONECT 400 399 401 402
+CONECT 401 400
+CONECT 402 400 403 404
+CONECT 403 402
+CONECT 404 396 402
+CONECT 405 393 406 407 408
+CONECT 406 405
+CONECT 407 405
+CONECT 408 405 409
+CONECT 409 408 410
+CONECT 410 409 411 412
+CONECT 411 410 415
+CONECT 412 410 413 414
+CONECT 413 412 424
+CONECT 414 412 415
+CONECT 415 411 414 416
+CONECT 416 415 417 423
+CONECT 417 416 418 419
+CONECT 418 417
+CONECT 419 417 420
+CONECT 420 419 421 422
+CONECT 421 420
+CONECT 422 420 423
+CONECT 423 416 422
+CONECT 424 413 425 426 427
+CONECT 425 424
+CONECT 426 424
+CONECT 427 424 428
+CONECT 428 427 429
+CONECT 429 428 430 431
+CONECT 430 429 434
+CONECT 431 429 432 433
+CONECT 432 431 446
+CONECT 433 431 434
+CONECT 434 430 433 435
+CONECT 435 434 436 445
+CONECT 436 435 437
+CONECT 437 436 438
+CONECT 438 437 439 445
+CONECT 439 438 440 441
+CONECT 440 439
+CONECT 441 439 442
+CONECT 442 441 443 444
+CONECT 443 442
+CONECT 444 442 445
+CONECT 445 435 438 444
+CONECT 446 432 447 448 449
+CONECT 447 446
+CONECT 448 446
+CONECT 449 446 450
+CONECT 450 449 451
+CONECT 451 450 452 453
+CONECT 452 451 456
+CONECT 453 451 454 455
+CONECT 454 453 465
+CONECT 455 453 456
+CONECT 456 452 455 457
+CONECT 457 456 458 464
+CONECT 458 457 459 460
+CONECT 459 458
+CONECT 460 458 461
+CONECT 461 460 462 463
+CONECT 462 461
+CONECT 463 461 464
+CONECT 464 457 463
+CONECT 465 454 466 467 468
+CONECT 466 465
+CONECT 467 465
+CONECT 468 465 469
+CONECT 469 468 470
+CONECT 470 469 471 472
+CONECT 471 470 475
+CONECT 472 470 473 474
+CONECT 473 472
+CONECT 474 472 475
+CONECT 475 471 474 476
+CONECT 476 475 477 486
+CONECT 477 476 478
+CONECT 478 477 479
+CONECT 479 478 480 486
+CONECT 480 479 481 482
+CONECT 481 480
+CONECT 482 480 483
+CONECT 483 482 484 485
+CONECT 484 483
+CONECT 485 483 486
+CONECT 486 476 479 485
+END
diff --git a/hacks/images/molecules/dodecahedrane.pdb b/hacks/images/molecules/dodecahedrane.pdb
new file mode 100644
index 0000000..94b2d2f
--- /dev/null
+++ b/hacks/images/molecules/dodecahedrane.pdb
@@ -0,0 +1,87 @@
+HEADER Dodecahedrane
+COMPND al3056
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Sun Sep 3 10:20:00 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.540 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.016 1.465 0.000 1.00 0.00
+HETATM 4 C 1 0.771 2.369 0.000 1.00 0.00
+HETATM 5 C 1 -0.476 1.465 0.000 1.00 0.00
+HETATM 6 C 1 -0.476 -0.655 1.309 1.00 0.00
+HETATM 7 C 1 -1.246 0.404 2.118 1.00 0.00
+HETATM 8 C 1 -1.246 1.714 1.309 1.00 0.00
+HETATM 9 C 1 -0.476 2.774 2.119 1.00 0.00
+HETATM 10 C 1 0.770 3.179 1.310 1.00 0.00
+HETATM 11 C 1 2.016 2.774 2.120 1.00 0.00
+HETATM 12 C 1 2.786 1.715 1.310 1.00 0.00
+HETATM 13 C 1 2.785 0.405 2.120 1.00 0.00
+HETATM 14 C 1 2.016 -0.655 1.310 1.00 0.00
+HETATM 15 C 1 0.769 -1.059 2.118 1.00 0.00
+HETATM 16 C 1 0.770 -0.250 3.428 1.00 0.00
+HETATM 17 C 1 -0.476 0.655 3.428 1.00 0.00
+HETATM 18 C 1 2.015 0.656 3.429 1.00 0.00
+HETATM 19 C 1 0.000 2.119 3.428 1.00 0.00
+HETATM 20 C 1 1.539 2.119 3.428 1.00 0.00
+HETATM 21 H 1 -0.389 -0.536 -0.866 1.00 0.00
+HETATM 22 H 1 1.929 -0.535 -0.866 1.00 0.00
+HETATM 23 H 1 2.645 1.669 -0.866 1.00 0.00
+HETATM 24 H 1 0.771 3.031 -0.867 1.00 0.00
+HETATM 25 H 1 -1.105 1.670 -0.867 1.00 0.00
+HETATM 26 H 1 -1.105 -1.521 1.105 1.00 0.00
+HETATM 27 H 1 -2.264 0.073 2.321 1.00 0.00
+HETATM 28 H 1 -2.264 2.044 1.104 1.00 0.00
+HETATM 29 H 1 -1.105 3.639 2.324 1.00 0.00
+HETATM 30 H 1 0.771 4.249 1.105 1.00 0.00
+HETATM 31 H 1 2.645 3.640 2.327 1.00 0.00
+HETATM 32 H 1 3.804 2.046 1.106 1.00 0.00
+HETATM 33 H 1 3.803 0.073 2.325 1.00 0.00
+HETATM 34 H 1 2.645 -1.522 1.106 1.00 0.00
+HETATM 35 H 1 0.769 -2.130 2.322 1.00 0.00
+HETATM 36 H 1 0.771 -0.912 4.294 1.00 0.00
+HETATM 37 H 1 -1.106 0.451 4.294 1.00 0.00
+HETATM 38 H 1 2.644 0.453 4.295 1.00 0.00
+HETATM 39 H 1 -0.387 2.655 4.295 1.00 0.00
+HETATM 40 H 1 1.928 2.654 4.295 1.00 0.00
+CONECT 1 2 5 6 21
+CONECT 2 1 3 14 22
+CONECT 3 2 4 12 23
+CONECT 4 3 5 10 24
+CONECT 5 1 4 8 25
+CONECT 6 1 7 15 26
+CONECT 7 6 8 17 27
+CONECT 8 5 7 9 28
+CONECT 9 8 10 19 29
+CONECT 10 4 9 11 30
+CONECT 11 10 12 20 31
+CONECT 12 3 11 13 32
+CONECT 13 12 14 18 33
+CONECT 14 2 13 15 34
+CONECT 15 6 14 16 35
+CONECT 16 15 17 18 36
+CONECT 17 7 16 19 37
+CONECT 18 13 16 20 38
+CONECT 19 9 17 20 39
+CONECT 20 11 18 19 40
+CONECT 21 1
+CONECT 22 2
+CONECT 23 3
+CONECT 24 4
+CONECT 25 5
+CONECT 26 6
+CONECT 27 7
+CONECT 28 8
+CONECT 29 9
+CONECT 30 10
+CONECT 31 11
+CONECT 32 12
+CONECT 33 13
+CONECT 34 14
+CONECT 35 15
+CONECT 36 16
+CONECT 37 17
+CONECT 38 18
+CONECT 39 19
+CONECT 40 20
+MASTER 0 0 0 0 0 0 0 0 40 0 40 0
+END
diff --git a/hacks/images/molecules/dthc.pdb b/hacks/images/molecules/dthc.pdb
new file mode 100644
index 0000000..d8688ac
--- /dev/null
+++ b/hacks/images/molecules/dthc.pdb
@@ -0,0 +1,107 @@
+HEADER Tetrahydrocannabinol: Delta 9-THC, an hallucinogen
+ATOM 1 O UNK 0 -1.791 -1.420 0.434
+ATOM 2 C UNK 0 -0.536 -1.012 0.033
+ATOM 3 C UNK 0 0.565 -1.346 0.828
+ATOM 4 C UNK 0 1.855 -0.978 0.446
+ATOM 5 C UNK 0 2.038 -0.295 -0.757
+ATOM 6 C UNK 0 0.940 0.052 -1.556
+ATOM 7 C UNK 0 -0.363 -0.272 -1.148
+ATOM 8 C UNK 0 -1.599 0.113 -1.985
+ATOM 9 C UNK 0 -1.568 1.523 -2.537
+ATOM 10 C UNK 0 -2.681 2.231 -2.781
+ATOM 11 C UNK 0 -4.068 1.708 -2.479
+ATOM 12 C UNK 0 -4.085 0.222 -2.091
+ATOM 13 C UNK 0 -2.892 -0.061 -1.162
+ATOM 14 C UNK 0 -2.908 -1.421 -0.435
+ATOM 15 O UNK 0 1.151 0.702 -2.747
+ATOM 16 C UNK 0 -2.610 3.628 -3.338
+ATOM 17 C UNK 0 -2.824 -2.642 -1.364
+ATOM 18 C UNK 0 -4.125 -1.570 0.485
+ATOM 19 C UNK 0 3.056 -1.332 1.325
+ATOM 20 C UNK 0 3.365 -0.156 2.260
+ATOM 21 C UNK 0 4.569 -0.467 3.158
+ATOM 22 C UNK 0 4.872 0.726 4.074
+ATOM 23 C UNK 0 6.079 0.425 4.969
+ATOM 24 H UNK 0 0.400 -1.896 1.747
+ATOM 25 H UNK 0 -1.626 -0.566 -2.849
+ATOM 26 H UNK 0 -4.720 1.866 -3.352
+ATOM 27 H UNK 0 -4.004 -0.399 -2.997
+ATOM 28 H UNK 0 2.079 0.837 -2.898
+ATOM 29 H UNK 0 -3.163 4.315 -2.681
+ATOM 30 H UNK 0 -2.839 -3.562 -0.762
+ATOM 31 H UNK 0 -3.995 -2.460 1.119
+ATOM 32 H UNK 0 -4.210 -0.687 1.134
+ATOM 33 H UNK 0 2.828 -2.232 1.917
+ATOM 34 H UNK 0 2.480 0.048 2.884
+ATOM 35 H UNK 0 4.349 -1.356 3.772
+ATOM 36 H UNK 0 3.994 0.938 4.706
+ATOM 37 H UNK 0 6.286 1.290 5.618
+ATOM 38 H UNK 0 3.036 -0.022 -1.076
+ATOM 39 H UNK 0 -0.602 1.973 -2.755
+ATOM 40 H UNK 0 -5.037 -0.005 -1.590
+ATOM 41 H UNK 0 -2.881 0.709 -0.374
+ATOM 42 H UNK 0 -1.565 3.966 -3.407
+ATOM 43 H UNK 0 -3.058 3.644 -4.342
+ATOM 44 H UNK 0 -1.884 -2.619 -1.933
+ATOM 45 H UNK 0 -3.674 -2.652 -2.061
+ATOM 46 H UNK 0 -5.048 -1.683 -0.102
+ATOM 47 H UNK 0 3.928 -1.546 0.687
+ATOM 48 H UNK 0 3.578 0.739 1.654
+ATOM 49 H UNK 0 5.449 -0.681 2.531
+ATOM 50 H UNK 0 5.086 1.616 3.462
+ATOM 51 H UNK 0 5.873 -0.453 5.600
+ATOM 52 H UNK 0 6.967 0.224 4.351
+ATOM 53 H UNK 0 -4.467 2.295 -1.638
+CONECT 1 2 14
+CONECT 2 1 3 7
+CONECT 3 2 4 24
+CONECT 4 3 5 19
+CONECT 5 4 6 38
+CONECT 6 5 7 15
+CONECT 7 2 6 8
+CONECT 8 7 9 13 25
+CONECT 9 8 10 39
+CONECT 10 9 11 16
+CONECT 11 10 12 26 53
+CONECT 12 11 27 40 13
+CONECT 13 8 12 41 14
+CONECT 14 1 13 17 18
+CONECT 15 6 28
+CONECT 16 10 29 42 43
+CONECT 17 14 30 44 45
+CONECT 18 14 31 32 46
+CONECT 19 4 20 33 47
+CONECT 20 19 21 34 48
+CONECT 21 20 22 35 49
+CONECT 22 21 23 36 50
+CONECT 23 22 37 51 52
+CONECT 24 3
+CONECT 25 8
+CONECT 26 11
+CONECT 27 12
+CONECT 28 15
+CONECT 29 16
+CONECT 30 17
+CONECT 31 18
+CONECT 32 18
+CONECT 33 19
+CONECT 34 20
+CONECT 35 21
+CONECT 36 22
+CONECT 37 23
+CONECT 38 5
+CONECT 39 9
+CONECT 40 12
+CONECT 41 13
+CONECT 42 16
+CONECT 43 16
+CONECT 44 17
+CONECT 45 17
+CONECT 46 18
+CONECT 47 19
+CONECT 48 20
+CONECT 49 21
+CONECT 50 22
+CONECT 51 23
+CONECT 52 23
+CONECT 53 11
diff --git a/hacks/images/molecules/dynamite.pdb b/hacks/images/molecules/dynamite.pdb
new file mode 100644
index 0000000..b16dc64
--- /dev/null
+++ b/hacks/images/molecules/dynamite.pdb
@@ -0,0 +1,47 @@
+HEADER Trinitroglycerin: Dynamite, an explosive
+COMPND jb09trin
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Tue Sep 19 21:46:02 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.540 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.063 1.449 0.000 1.00 0.00
+HETATM 4 O 1 3.467 1.429 0.127 1.00 0.00
+HETATM 5 N 1 4.015 2.776 -0.152 1.00 0.00
+HETATM 6 O 1 4.998 3.268 0.635 1.00 0.00
+HETATM 7 O 1 3.773 3.351 -1.351 1.00 0.00
+HETATM 8 O 1 2.004 -0.755 1.098 1.00 0.00
+HETATM 9 N 1 2.641 -0.291 2.107 1.00 0.00
+HETATM 10 O 1 3.090 -1.154 3.047 1.00 0.00
+HETATM 11 O 1 2.879 1.030 2.268 1.00 0.00
+HETATM 12 O 1 -0.458 -1.330 -0.079 1.00 0.00
+HETATM 13 N 1 -1.911 -1.339 -0.361 1.00 0.00
+HETATM 14 O 1 -2.745 -2.029 0.450 1.00 0.00
+HETATM 15 O 1 -2.357 -0.902 -1.560 1.00 0.00
+HETATM 16 H 1 -0.365 0.561 -0.860 1.00 0.00
+HETATM 17 H 1 -0.369 0.458 0.918 1.00 0.00
+HETATM 18 H 1 1.886 -0.486 -0.912 1.00 0.00
+HETATM 19 H 1 1.620 2.013 0.821 1.00 0.00
+HETATM 20 H 1 1.793 1.925 -0.943 1.00 0.00
+CONECT 1 2 12 16 17
+CONECT 2 1 3 8 18
+CONECT 3 2 4 19 20
+CONECT 4 3 5
+CONECT 5 4 6 7
+CONECT 6 5
+CONECT 7 5
+CONECT 8 2 9
+CONECT 9 8 10 11
+CONECT 10 9
+CONECT 11 9
+CONECT 12 1 13
+CONECT 13 12 14 15
+CONECT 14 13
+CONECT 15 13
+CONECT 16 1
+CONECT 17 1
+CONECT 18 2
+CONECT 19 3
+CONECT 20 3
+MASTER 0 0 0 0 0 0 0 0 20 0 20 0
+END
diff --git a/hacks/images/molecules/glycol.pdb b/hacks/images/molecules/glycol.pdb
new file mode 100644
index 0000000..202d0e1
--- /dev/null
+++ b/hacks/images/molecules/glycol.pdb
@@ -0,0 +1,27 @@
+HEADER Ethylene Glycol: Ethane-1,2-diol, Anti-freeze
+COMPND al2034
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Tue Aug 29 17:54:52 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.542 0.000 0.000 1.00 0.00
+HETATM 3 O 1 2.027 1.347 0.000 1.00 0.00
+HETATM 4 O 1 -0.485 -1.347 -0.041 1.00 0.00
+HETATM 5 H 1 -0.360 0.537 -0.878 1.00 0.00
+HETATM 6 H 1 -0.367 0.494 0.900 1.00 0.00
+HETATM 7 H 1 1.902 -0.512 -0.893 1.00 0.00
+HETATM 8 H 1 1.908 -0.520 0.885 1.00 0.00
+HETATM 9 H 1 1.743 1.800 0.802 1.00 0.00
+HETATM 10 H 1 -0.202 -1.823 0.747 1.00 0.00
+CONECT 1 2 4 5 6
+CONECT 2 1 3 7 8
+CONECT 3 2 9
+CONECT 4 1 10
+CONECT 5 1
+CONECT 6 1
+CONECT 7 2
+CONECT 8 2
+CONECT 9 3
+CONECT 10 4
+MASTER 0 0 0 0 0 0 0 0 10 0 10 0
+END
diff --git a/hacks/images/molecules/guanine.pdb b/hacks/images/molecules/guanine.pdb
new file mode 100644
index 0000000..229b654
--- /dev/null
+++ b/hacks/images/molecules/guanine.pdb
@@ -0,0 +1,39 @@
+HEADER Guanine: Purine base nucleotide
+COMPND jb09guan
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Tue Sep 19 21:46:02 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.392 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.082 1.215 0.000 1.00 0.00
+HETATM 4 N 1 1.339 2.346 -0.001 1.00 0.00
+HETATM 5 C 1 -0.017 2.313 -0.003 1.00 0.00
+HETATM 6 N 1 -0.709 1.149 -0.003 1.00 0.00
+HETATM 7 N 1 -0.392 -1.291 -0.028 1.00 0.00
+HETATM 8 C 1 0.730 -2.047 -0.044 1.00 0.00
+HETATM 9 N 1 1.842 -1.275 -0.028 1.00 0.00
+HETATM 10 O 1 3.285 1.253 -0.010 1.00 0.00
+HETATM 11 N 1 -0.723 3.523 -0.019 1.00 0.00
+HETATM 12 H 1 1.811 3.244 -0.007 1.00 0.00
+HETATM 13 H 1 -1.347 -1.629 -0.048 1.00 0.00
+HETATM 14 H 1 0.738 -3.137 -0.077 1.00 0.00
+HETATM 15 H 1 -1.640 3.377 -0.427 1.00 0.00
+HETATM 16 H 1 -0.213 4.205 -0.570 1.00 0.00
+CONECT 1 2 2 6 7
+CONECT 2 1 1 3 9
+CONECT 3 2 4 10 10
+CONECT 4 3 5 12
+CONECT 5 4 6 6 11
+CONECT 6 1 5 5
+CONECT 7 1 8 13
+CONECT 8 7 9 9 14
+CONECT 9 2 8 8
+CONECT 10 3 3
+CONECT 11 5 15 16
+CONECT 12 4
+CONECT 13 7
+CONECT 14 8
+CONECT 15 11
+CONECT 16 11
+MASTER 0 0 0 0 0 0 0 0 16 0 16 0
+END
diff --git a/hacks/images/molecules/heroin.pdb b/hacks/images/molecules/heroin.pdb
new file mode 100644
index 0000000..ddb4014
--- /dev/null
+++ b/hacks/images/molecules/heroin.pdb
@@ -0,0 +1,107 @@
+HEADER Diacetylmorphine: Heroin, an opiate
+COMPND al3084
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.400 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.108 1.210 0.000 1.00 0.00
+HETATM 4 C 1 1.452 2.447 -0.065 1.00 0.00
+HETATM 5 C 1 0.055 2.457 -0.018 1.00 0.00
+HETATM 6 C 1 -0.624 1.244 0.041 1.00 0.00
+HETATM 7 C 1 -2.081 1.501 -0.201 1.00 0.00
+HETATM 8 C 1 -2.725 0.343 -0.973 1.00 0.00
+HETATM 9 C 1 -2.367 -0.953 -0.210 1.00 0.00
+HETATM 10 C 1 -0.836 -1.236 -0.253 1.00 0.00
+HETATM 11 C 1 -1.913 2.852 -0.934 1.00 0.00
+HETATM 12 C 1 -2.752 1.623 1.177 1.00 0.00
+HETATM 13 C 1 -2.503 0.306 1.943 1.00 0.00
+HETATM 14 N 1 -2.936 -0.856 1.147 1.00 0.00
+HETATM 15 C 1 -2.820 -2.103 1.920 1.00 0.00
+HETATM 16 H 1 -3.807 0.473 -0.972 1.00 0.00
+HETATM 17 C 1 -2.256 0.283 -2.408 1.00 0.00
+HETATM 18 C 1 -1.948 1.398 -3.085 1.00 0.00
+HETATM 19 C 1 -1.494 2.675 -2.413 1.00 0.00
+HETATM 20 H 1 -2.820 3.452 -0.859 1.00 0.00
+HETATM 21 O 1 -0.799 3.480 -0.318 1.00 0.00
+HETATM 22 H 1 -1.885 3.520 -2.982 1.00 0.00
+HETATM 23 O 1 -0.083 2.674 -2.462 1.00 0.00
+HETATM 24 O 1 2.142 3.620 -0.142 1.00 0.00
+HETATM 25 H 1 1.942 -0.945 -0.044 1.00 0.00
+HETATM 26 H 1 3.198 1.180 -0.006 1.00 0.00
+HETATM 27 H 1 -2.866 -1.782 -0.712 1.00 0.00
+HETATM 28 H 1 -0.588 -1.599 -1.250 1.00 0.00
+HETATM 29 H 1 -0.574 -2.010 0.465 1.00 0.00
+HETATM 30 H 1 -3.823 1.785 1.052 1.00 0.00
+HETATM 31 H 1 -2.320 2.456 1.731 1.00 0.00
+HETATM 32 H 1 -3.068 0.334 2.874 1.00 0.00
+HETATM 33 H 1 -1.444 0.211 2.184 1.00 0.00
+HETATM 34 H 1 -3.492 -2.057 2.778 1.00 0.00
+HETATM 35 H 1 -1.799 -2.234 2.280 1.00 0.00
+HETATM 36 H 1 -3.099 -2.953 1.298 1.00 0.00
+HETATM 37 H 1 -2.414 -0.639 -2.967 1.00 0.00
+HETATM 38 H 1 -1.797 1.313 -4.161 1.00 0.00
+HETATM 39 C 1 3.076 3.567 -1.091 1.00 0.00
+HETATM 40 O 1 2.786 3.826 -2.230 1.00 0.00
+HETATM 41 C 1 4.523 3.509 -0.695 1.00 0.00
+HETATM 42 H 1 5.012 2.691 -1.224 1.00 0.00
+HETATM 43 H 1 4.600 3.345 0.380 1.00 0.00
+HETATM 44 H 1 5.008 4.450 -0.954 1.00 0.00
+HETATM 45 C 1 0.390 3.733 -3.117 1.00 0.00
+HETATM 46 O 1 0.845 3.595 -4.223 1.00 0.00
+HETATM 47 C 1 0.417 5.083 -2.459 1.00 0.00
+HETATM 48 H 1 1.199 5.692 -2.913 1.00 0.00
+HETATM 49 H 1 0.619 4.970 -1.395 1.00 0.00
+HETATM 50 H 1 -0.547 5.574 -2.594 1.00 0.00
+CONECT 1 2 2 6 10
+CONECT 2 1 1 3 25
+CONECT 3 2 4 4 26
+CONECT 4 3 3 5 24
+CONECT 5 4 6 6 21
+CONECT 6 1 5 5 7
+CONECT 7 6 8 11 12
+CONECT 8 7 9 16 17
+CONECT 9 8 10 14 27
+CONECT 10 1 9 28 29
+CONECT 11 7 19 20 21
+CONECT 12 7 13 30 31
+CONECT 13 12 14 32 33
+CONECT 14 9 13 15
+CONECT 15 14 34 35 36
+CONECT 16 8
+CONECT 17 8 18 18 37
+CONECT 18 17 17 19 38
+CONECT 19 11 18 22 23
+CONECT 20 11
+CONECT 21 5 11
+CONECT 22 19
+CONECT 23 19 45
+CONECT 24 4 39
+CONECT 25 2
+CONECT 26 3
+CONECT 27 9
+CONECT 28 10
+CONECT 29 10
+CONECT 30 12
+CONECT 31 12
+CONECT 32 13
+CONECT 33 13
+CONECT 34 15
+CONECT 35 15
+CONECT 36 15
+CONECT 37 17
+CONECT 38 18
+CONECT 39 24 40 40 41
+CONECT 40 39 39
+CONECT 41 39 42 43 44
+CONECT 42 41
+CONECT 43 41
+CONECT 44 41
+CONECT 45 23 46 46 47
+CONECT 46 45 45
+CONECT 47 45 48 49 50
+CONECT 48 47
+CONECT 49 47
+CONECT 50 47
+MASTER 0 0 0 0 0 0 0 0 50 0 50 0
+END
diff --git a/hacks/images/molecules/hexahelicene.pdb b/hacks/images/molecules/hexahelicene.pdb
new file mode 100644
index 0000000..52162c5
--- /dev/null
+++ b/hacks/images/molecules/hexahelicene.pdb
@@ -0,0 +1,90 @@
+COMPND Hexahelicene
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.404 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.104 1.206 0.000 1.00 0.00
+HETATM 4 C 1 1.402 2.413 -0.064 1.00 0.00
+HETATM 5 C 1 0.002 2.407 -0.063 1.00 0.00
+HETATM 6 C 1 -0.705 1.209 0.071 1.00 0.00
+HETATM 7 C 1 -2.102 1.180 0.220 1.00 0.00
+HETATM 8 C 1 -2.847 2.295 0.643 1.00 0.00
+HETATM 9 C 1 -4.192 2.360 0.266 1.00 0.00
+HETATM 10 C 1 -4.858 1.229 -0.190 1.00 0.00
+HETATM 11 C 1 -4.166 0.012 -0.273 1.00 0.00
+HETATM 12 C 1 -2.782 -0.001 -0.086 1.00 0.00
+HETATM 13 C 1 -2.082 -1.204 -0.224 1.00 0.00
+HETATM 14 C 1 -0.685 -1.210 -0.107 1.00 0.00
+HETATM 15 C 1 -2.318 3.332 1.420 1.00 0.00
+HETATM 16 C 1 -1.206 3.177 2.264 1.00 0.00
+HETATM 17 C 1 -0.519 4.289 2.729 1.00 0.00
+HETATM 18 C 1 -1.052 5.582 2.503 1.00 0.00
+HETATM 19 C 1 -2.286 5.716 1.895 1.00 0.00
+HETATM 20 C 1 -2.936 4.583 1.371 1.00 0.00
+HETATM 21 C 1 -4.216 4.717 0.815 1.00 0.00
+HETATM 22 C 1 -4.881 3.585 0.350 1.00 0.00
+HETATM 23 C 1 -0.789 1.905 2.707 1.00 0.00
+HETATM 24 C 1 0.400 1.759 3.421 1.00 0.00
+HETATM 25 C 1 1.155 2.887 3.765 1.00 0.00
+HETATM 26 C 1 0.669 4.165 3.443 1.00 0.00
+HETATM 27 H 1 1.945 -0.947 -0.019 1.00 0.00
+HETATM 28 H 1 3.191 1.206 -0.002 1.00 0.00
+HETATM 29 H 1 1.942 3.359 -0.131 1.00 0.00
+HETATM 30 H 1 -0.523 3.350 -0.198 1.00 0.00
+HETATM 31 H 1 -5.918 1.264 -0.433 1.00 0.00
+HETATM 32 H 1 -4.698 -0.901 -0.555 1.00 0.00
+HETATM 33 H 1 -2.617 -2.140 -0.409 1.00 0.00
+HETATM 34 H 1 -0.142 -2.150 -0.180 1.00 0.00
+HETATM 35 H 1 -0.520 6.457 2.886 1.00 0.00
+HETATM 36 H 1 -2.751 6.690 1.806 1.00 0.00
+HETATM 37 H 1 -4.715 5.680 0.815 1.00 0.00
+HETATM 38 H 1 -5.917 3.654 0.008 1.00 0.00
+HETATM 39 H 1 -1.407 1.021 2.524 1.00 0.00
+HETATM 40 H 1 0.734 0.774 3.725 1.00 0.00
+HETATM 41 H 1 2.090 2.777 4.328 1.00 0.00
+HETATM 42 H 1 1.225 5.042 3.772 1.00 0.00
+CONECT 1 2 2 6 14
+CONECT 2 1 1 3 27
+CONECT 3 2 4 4 28
+CONECT 4 3 3 5 29
+CONECT 5 4 6 6 30
+CONECT 6 1 5 5 7
+CONECT 7 6 8 8 12
+CONECT 8 7 7 9 15
+CONECT 9 8 10 10 22
+CONECT 10 9 9 11 31
+CONECT 11 10 12 12 32
+CONECT 12 7 11 11 13
+CONECT 13 12 14 14 33
+CONECT 14 1 13 13 34
+CONECT 15 8 16 16 20
+CONECT 16 15 15 17 23
+CONECT 17 16 18 18 26
+CONECT 18 17 17 19 35
+CONECT 19 18 20 20 36
+CONECT 20 15 19 19 21
+CONECT 21 20 22 22 37
+CONECT 22 9 21 21 38
+CONECT 23 16 24 24 39
+CONECT 24 23 23 25 40
+CONECT 25 24 26 26 41
+CONECT 26 17 25 25 42
+CONECT 27 2
+CONECT 28 3
+CONECT 29 4
+CONECT 30 5
+CONECT 31 10
+CONECT 32 11
+CONECT 33 13
+CONECT 34 14
+CONECT 35 18
+CONECT 36 19
+CONECT 37 21
+CONECT 38 22
+CONECT 39 23
+CONECT 40 24
+CONECT 41 25
+CONECT 42 26
+MASTER 0 0 0 0 0 0 0 0 42 0 42 0
+END
diff --git a/hacks/images/molecules/ibuprofen.pdb b/hacks/images/molecules/ibuprofen.pdb
new file mode 100644
index 0000000..48d3dba
--- /dev/null
+++ b/hacks/images/molecules/ibuprofen.pdb
@@ -0,0 +1,72 @@
+HEADER Ibuprofen: Advil/Motrin, an anti-inflammatory
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.399 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.098 1.212 0.000 1.00 0.00
+HETATM 4 C 1 1.391 2.419 0.004 1.00 0.00
+HETATM 5 C 1 -0.008 2.417 0.005 1.00 0.00
+HETATM 6 C 1 -0.712 1.206 -0.003 1.00 0.00
+HETATM 7 C 1 -2.224 1.136 -0.009 1.00 0.00
+HETATM 8 C 1 -2.900 2.504 -0.232 1.00 0.00
+HETATM 9 C 1 3.611 1.210 -0.042 1.00 0.00
+HETATM 10 C 1 4.094 0.909 -1.477 1.00 0.00
+HETATM 11 C 1 5.635 0.868 -1.503 1.00 0.00
+HETATM 12 C 1 3.590 1.996 -2.450 1.00 0.00
+HETATM 13 C 1 -2.686 0.573 1.305 1.00 0.00
+HETATM 14 O 1 -3.846 0.297 1.466 1.00 0.00
+HETATM 15 O 1 -1.792 0.321 2.277 1.00 0.00
+HETATM 16 H 1 -0.539 -0.948 -0.004 1.00 0.00
+HETATM 17 H 1 1.943 -0.945 -0.009 1.00 0.00
+HETATM 18 H 1 1.930 3.366 -0.006 1.00 0.00
+HETATM 19 H 1 -0.533 3.371 0.004 1.00 0.00
+HETATM 20 H 1 -2.536 0.461 -0.807 1.00 0.00
+HETATM 21 H 1 -2.546 2.944 -1.165 1.00 0.00
+HETATM 22 H 1 -2.676 3.171 0.600 1.00 0.00
+HETATM 23 H 1 -3.980 2.365 -0.292 1.00 0.00
+HETATM 24 H 1 3.986 0.442 0.635 1.00 0.00
+HETATM 25 H 1 3.990 2.181 0.277 1.00 0.00
+HETATM 26 H 1 3.707 -0.061 -1.792 1.00 0.00
+HETATM 27 H 1 5.991 0.094 -0.823 1.00 0.00
+HETATM 28 H 1 6.034 1.834 -1.192 1.00 0.00
+HETATM 29 H 1 5.978 0.645 -2.513 1.00 0.00
+HETATM 30 H 1 3.941 2.975 -2.122 1.00 0.00
+HETATM 31 H 1 2.500 1.993 -2.477 1.00 0.00
+HETATM 32 H 1 3.970 1.793 -3.451 1.00 0.00
+HETATM 33 H 1 -1.689 -0.648 2.383 1.00 0.00
+CONECT 1 2 2 6 16
+CONECT 2 1 1 3 17
+CONECT 3 2 4 4 9
+CONECT 4 3 3 5 18
+CONECT 5 4 6 6 19
+CONECT 6 1 5 5 7
+CONECT 7 6 8 13 20
+CONECT 8 7 21 22 23
+CONECT 9 3 10 24 25
+CONECT 10 9 11 12 26
+CONECT 11 10 27 28 29
+CONECT 12 10 30 31 32
+CONECT 13 7 14 14 15
+CONECT 14 13 13
+CONECT 15 13 33
+CONECT 16 1
+CONECT 17 2
+CONECT 18 4
+CONECT 19 5
+CONECT 20 7
+CONECT 21 8
+CONECT 22 8
+CONECT 23 8
+CONECT 24 9
+CONECT 25 9
+CONECT 26 10
+CONECT 27 11
+CONECT 28 11
+CONECT 29 11
+CONECT 30 12
+CONECT 31 12
+CONECT 32 12
+CONECT 33 15
+MASTER 0 0 0 0 0 0 0 0 33 0 33 0
+END
diff --git a/hacks/images/molecules/lsd.pdb b/hacks/images/molecules/lsd.pdb
new file mode 100644
index 0000000..7d24830
--- /dev/null
+++ b/hacks/images/molecules/lsd.pdb
@@ -0,0 +1,104 @@
+HEADER Lysergic acid diethylamide, a potent hallucinogen
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.397 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.012 1.258 0.000 1.00 0.00
+HETATM 4 C 1 1.246 2.433 -0.052 1.00 0.00
+HETATM 5 C 1 -0.155 2.405 -0.125 1.00 0.00
+HETATM 6 C 1 -0.773 1.155 -0.096 1.00 0.00
+HETATM 7 N 1 -2.065 0.769 -0.378 1.00 0.00
+HETATM 8 C 1 -2.092 -0.602 -0.503 1.00 0.00
+HETATM 9 C 1 -0.810 -1.103 -0.242 1.00 0.00
+HETATM 10 C 1 -0.159 -2.415 -0.700 1.00 0.00
+HETATM 11 C 1 1.178 -2.555 0.075 1.00 0.00
+HETATM 12 C 1 2.056 -1.321 -0.019 1.00 0.00
+HETATM 13 H 1 0.916 -2.675 1.126 1.00 0.00
+HETATM 14 N 1 1.899 -3.768 -0.346 1.00 0.00
+HETATM 15 C 1 3.394 -1.430 0.057 1.00 0.00
+HETATM 16 C 1 4.101 -2.765 0.134 1.00 0.00
+HETATM 17 C 1 3.115 -3.899 0.470 1.00 0.00
+HETATM 18 H 1 4.565 -2.960 -0.830 1.00 0.00
+HETATM 19 C 1 5.121 -2.704 1.237 1.00 0.00
+HETATM 20 O 1 4.720 -2.413 2.335 1.00 0.00
+HETATM 21 N 1 6.434 -3.000 1.089 1.00 0.00
+HETATM 22 C 1 7.305 -2.925 2.274 1.00 0.00
+HETATM 23 C 1 7.755 -4.340 2.686 1.00 0.00
+HETATM 24 C 1 7.047 -3.307 -0.215 1.00 0.00
+HETATM 25 C 1 6.736 -4.755 -0.646 1.00 0.00
+HETATM 26 H 1 3.094 1.350 0.014 1.00 0.00
+HETATM 27 H 1 1.757 3.398 -0.079 1.00 0.00
+HETATM 28 H 1 -0.732 3.319 -0.249 1.00 0.00
+HETATM 29 H 1 -2.858 1.432 -0.658 1.00 0.00
+HETATM 30 H 1 -2.917 -1.177 -0.924 1.00 0.00
+HETATM 31 H 1 0.025 -2.349 -1.772 1.00 0.00
+HETATM 32 H 1 -0.811 -3.260 -0.484 1.00 0.00
+HETATM 33 H 1 4.015 -0.538 0.044 1.00 0.00
+HETATM 34 H 1 2.844 -3.840 1.524 1.00 0.00
+HETATM 35 H 1 3.586 -4.865 0.286 1.00 0.00
+HETATM 36 H 1 6.768 -2.468 3.105 1.00 0.00
+HETATM 37 H 1 8.181 -2.318 2.047 1.00 0.00
+HETATM 38 H 1 8.376 -4.772 1.903 1.00 0.00
+HETATM 39 H 1 6.879 -4.969 2.844 1.00 0.00
+HETATM 40 H 1 8.332 -4.283 3.609 1.00 0.00
+HETATM 41 H 1 8.129 -3.199 -0.132 1.00 0.00
+HETATM 42 H 1 6.693 -2.606 -0.971 1.00 0.00
+HETATM 43 H 1 5.663 -4.894 -0.765 1.00 0.00
+HETATM 44 H 1 7.103 -5.451 0.107 1.00 0.00
+HETATM 45 H 1 7.230 -4.962 -1.595 1.00 0.00
+HETATM 46 C 1 2.198 -3.813 -1.786 1.00 0.00
+HETATM 47 H 1 2.586 -2.854 -2.128 1.00 0.00
+HETATM 48 H 1 1.292 -4.053 -2.342 1.00 0.00
+HETATM 49 H 1 2.936 -4.591 -1.982 1.00 0.00
+CONECT 1 2 2 6 9
+CONECT 2 1 1 3 12
+CONECT 3 2 4 4 26
+CONECT 4 3 3 5 27
+CONECT 5 4 6 6 28
+CONECT 6 1 5 5 7
+CONECT 7 6 8 29
+CONECT 8 7 9 9 30
+CONECT 9 1 8 8 10
+CONECT 10 9 11 31 32
+CONECT 11 10 12 13 14
+CONECT 12 2 11 15 15
+CONECT 13 11
+CONECT 14 11 17 46
+CONECT 15 12 12 16 33
+CONECT 16 15 17 18 19
+CONECT 17 14 16 34 35
+CONECT 18 16
+CONECT 19 16 20 20 21
+CONECT 20 19 19
+CONECT 21 19 22 24
+CONECT 22 21 23 36 37
+CONECT 23 22 38 39 40
+CONECT 24 21 25 41 42
+CONECT 25 24 43 44 45
+CONECT 26 3
+CONECT 27 4
+CONECT 28 5
+CONECT 29 7
+CONECT 30 8
+CONECT 31 10
+CONECT 32 10
+CONECT 33 15
+CONECT 34 17
+CONECT 35 17
+CONECT 36 22
+CONECT 37 22
+CONECT 38 23
+CONECT 39 23
+CONECT 40 23
+CONECT 41 24
+CONECT 42 24
+CONECT 43 25
+CONECT 44 25
+CONECT 45 25
+CONECT 46 14 47 48 49
+CONECT 47 46
+CONECT 48 46
+CONECT 49 46
+MASTER 0 0 0 0 0 0 0 0 49 0 49 0
+END
diff --git a/hacks/images/molecules/menthol.pdb b/hacks/images/molecules/menthol.pdb
new file mode 100644
index 0000000..c418688
--- /dev/null
+++ b/hacks/images/molecules/menthol.pdb
@@ -0,0 +1,69 @@
+HEADER Menthol: Mentha arvensis oil
+COMPND menthol
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 O 1 1.431 0.000 0.000 1.00 0.00
+HETATM 3 C 1 -0.501 1.458 0.000 1.00 0.00
+HETATM 4 C 1 -2.042 1.485 -0.004 1.00 0.00
+HETATM 5 C 1 -2.576 0.746 1.240 1.00 0.00
+HETATM 6 C 1 -2.072 -0.710 1.236 1.00 0.00
+HETATM 7 C 1 -0.528 -0.726 1.258 1.00 0.00
+HETATM 8 C 1 -0.005 -2.181 1.381 1.00 0.00
+HETATM 9 C 1 1.486 -2.197 1.780 1.00 0.00
+HETATM 10 C 1 -0.183 -2.997 0.081 1.00 0.00
+HETATM 11 C 1 -2.539 2.945 0.003 1.00 0.00
+HETATM 12 H 1 -0.367 -0.497 -0.898 1.00 0.00
+HETATM 13 H 1 1.761 0.410 -0.806 1.00 0.00
+HETATM 14 H 1 -0.129 1.968 -0.889 1.00 0.00
+HETATM 15 H 1 -0.127 1.969 0.888 1.00 0.00
+HETATM 16 H 1 -2.409 0.987 -0.903 1.00 0.00
+HETATM 17 H 1 -3.666 0.750 1.224 1.00 0.00
+HETATM 18 H 1 -2.229 1.249 2.142 1.00 0.00
+HETATM 19 H 1 -2.440 -1.211 0.342 1.00 0.00
+HETATM 20 H 1 -2.455 -1.222 2.119 1.00 0.00
+HETATM 21 H 1 -0.200 -0.175 2.139 1.00 0.00
+HETATM 22 H 1 -0.565 -2.673 2.176 1.00 0.00
+HETATM 23 H 1 1.633 -1.600 2.680 1.00 0.00
+HETATM 24 H 1 2.100 -1.796 0.975 1.00 0.00
+HETATM 25 H 1 1.794 -3.223 1.980 1.00 0.00
+HETATM 26 H 1 0.434 -2.578 -0.713 1.00 0.00
+HETATM 27 H 1 -1.228 -2.993 -0.228 1.00 0.00
+HETATM 28 H 1 0.127 -4.026 0.261 1.00 0.00
+HETATM 29 H 1 -2.165 3.462 -0.880 1.00 0.00
+HETATM 30 H 1 -2.178 3.451 0.898 1.00 0.00
+HETATM 31 H 1 -3.629 2.960 -0.005 1.00 0.00
+CONECT 1 2 3 7 12
+CONECT 2 1 13
+CONECT 3 1 4 14 15
+CONECT 4 3 5 11 16
+CONECT 5 4 6 17 18
+CONECT 6 5 7 19 20
+CONECT 7 1 6 8 21
+CONECT 8 7 9 10 22
+CONECT 9 8 23 24 25
+CONECT 10 8 26 27 28
+CONECT 11 4 29 30 31
+CONECT 12 1
+CONECT 13 2
+CONECT 14 3
+CONECT 15 3
+CONECT 16 4
+CONECT 17 5
+CONECT 18 5
+CONECT 19 6
+CONECT 20 6
+CONECT 21 7
+CONECT 22 8
+CONECT 23 9
+CONECT 24 9
+CONECT 25 9
+CONECT 26 10
+CONECT 27 10
+CONECT 28 10
+CONECT 29 11
+CONECT 30 11
+CONECT 31 11
+MASTER 0 0 0 0 0 0 0 0 31 0 31 0
+END
diff --git a/hacks/images/molecules/mescaline.pdb b/hacks/images/molecules/mescaline.pdb
new file mode 100644
index 0000000..7143a22
--- /dev/null
+++ b/hacks/images/molecules/mescaline.pdb
@@ -0,0 +1,71 @@
+HEADER Mescaline: Peyote, an hallucinogen
+COMPND jb12mesc
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Sep 20 16:26:54 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.398 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.098 1.213 0.000 1.00 0.00
+HETATM 4 C 1 1.399 2.424 -0.005 1.00 0.00
+HETATM 5 C 1 -0.001 2.422 0.013 1.00 0.00
+HETATM 6 C 1 -0.700 1.211 0.014 1.00 0.00
+HETATM 7 O 1 -2.062 1.209 0.026 1.00 0.00
+HETATM 8 C 1 -2.564 1.047 -1.282 1.00 0.00
+HETATM 9 O 1 -0.682 -1.180 -0.024 1.00 0.00
+HETATM 10 C 1 -0.867 -1.664 1.288 1.00 0.00
+HETATM 11 O 1 2.078 -1.180 -0.002 1.00 0.00
+HETATM 12 C 1 2.225 -1.657 -1.321 1.00 0.00
+HETATM 13 C 1 2.154 3.735 -0.007 1.00 0.00
+HETATM 14 C 1 2.388 4.190 1.447 1.00 0.00
+HETATM 15 N 1 3.124 5.464 1.464 1.00 0.00
+HETATM 16 H 1 3.188 1.207 0.000 1.00 0.00
+HETATM 17 H 1 -0.549 3.364 0.023 1.00 0.00
+HETATM 18 H 1 -2.231 0.093 -1.690 1.00 0.00
+HETATM 19 H 1 -2.208 1.859 -1.916 1.00 0.00
+HETATM 20 H 1 -3.653 1.064 -1.252 1.00 0.00
+HETATM 21 H 1 -1.432 -0.938 1.873 1.00 0.00
+HETATM 22 H 1 0.101 -1.837 1.758 1.00 0.00
+HETATM 23 H 1 -1.419 -2.603 1.248 1.00 0.00
+HETATM 24 H 1 2.775 -0.929 -1.917 1.00 0.00
+HETATM 25 H 1 1.244 -1.825 -1.765 1.00 0.00
+HETATM 26 H 1 2.777 -2.597 -1.303 1.00 0.00
+HETATM 27 H 1 1.574 4.490 -0.538 1.00 0.00
+HETATM 28 H 1 3.114 3.603 -0.507 1.00 0.00
+HETATM 29 H 1 2.966 3.432 1.976 1.00 0.00
+HETATM 30 H 1 1.427 4.321 1.944 1.00 0.00
+HETATM 31 H 1 2.590 6.179 0.982 1.00 0.00
+HETATM 32 H 1 4.024 5.350 1.012 1.00 0.00
+CONECT 1 2 2 6 9
+CONECT 2 1 1 3 11
+CONECT 3 2 4 4 16
+CONECT 4 3 3 5 13
+CONECT 5 4 6 6 17
+CONECT 6 1 5 5 7
+CONECT 7 6 8
+CONECT 8 7 18 19 20
+CONECT 9 1 10
+CONECT 10 9 21 22 23
+CONECT 11 2 12
+CONECT 12 11 24 25 26
+CONECT 13 4 14 27 28
+CONECT 14 13 15 29 30
+CONECT 15 14 31 32
+CONECT 16 3
+CONECT 17 5
+CONECT 18 8
+CONECT 19 8
+CONECT 20 8
+CONECT 21 10
+CONECT 22 10
+CONECT 23 10
+CONECT 24 12
+CONECT 25 12
+CONECT 26 12
+CONECT 27 13
+CONECT 28 13
+CONECT 29 14
+CONECT 30 14
+CONECT 31 15
+CONECT 32 15
+MASTER 0 0 0 0 0 0 0 0 32 0 32 0
+END
diff --git a/hacks/images/molecules/methamphetamine.pdb b/hacks/images/molecules/methamphetamine.pdb
new file mode 100644
index 0000000..0cf567d
--- /dev/null
+++ b/hacks/images/molecules/methamphetamine.pdb
@@ -0,0 +1,88 @@
+HEADER Methamphetamine: D-Desoxyephedrine
+ORIGX1 1.000000 0.000000 0.000000 0.00000
+ORIGX2 0.000000 1.000000 0.000000 0.00000
+ORIGX3 0.000000 0.000000 1.000000 0.00000
+SCALE1 0.100000 0.000000 0.000000 0.00000
+SCALE2 0.000000 0.100000 0.000000 0.00000
+SCALE3 0.000000 0.000000 0.100000 0.00000
+ATOM 1 C 1 0.729 4.473 -1.914 1.00 0.00
+ATOM 2 C 1 -0.451 3.821 -2.014 1.00 0.00
+ATOM 3 C 1 -0.995 3.421 -3.398 1.00 0.00
+ATOM 4 C 1 -0.293 3.722 -4.513 1.00 0.00
+ATOM 5 C 1 1.052 4.465 -4.399 1.00 0.00
+ATOM 6 C 1 1.529 4.816 -3.184 1.00 0.00
+ATOM 7 H 1 1.115 4.756 -0.934 1.00 0.00
+ATOM 8 C 1 -1.251 3.478 -0.743 1.00 0.00
+ATOM 9 H 1 -1.947 2.896 -3.478 1.00 0.00
+ATOM 10 H 1 -0.678 3.440 -5.492 1.00 0.00
+ATOM 11 H 1 1.618 4.708 -5.298 1.00 0.00
+ATOM 12 H 1 2.481 5.342 -3.104 1.00 0.00
+ATOM 13 C 1 -0.489 3.986 0.496 1.00 0.00
+ATOM 14 N 1 -1.279 3.647 1.750 1.00 0.00
+ATOM 15 H 1 -1.378 2.398 -0.674 1.00 0.00
+ATOM 19 H 1 -2.229 3.957 -0.790 1.00 0.00
+ATOM 20 H 1 0.489 3.507 0.542 1.00 0.00
+ATOM 21 C 1 -0.310 5.512 0.398 1.00 0.00
+ATOM 22 H 1 -1.403 2.587 1.817 1.00 0.00
+ATOM 23 C 1 -0.528 4.148 2.972 1.00 0.00
+ATOM 24 H 1 -0.401 5.229 2.903 1.00 0.00
+ATOM 25 H 1 0.451 3.670 3.019 1.00 0.00
+ATOM 26 H 1 -1.094 3.905 3.871 1.00 0.00
+ATOM 27 H 1 0.229 5.871 1.275 1.00 0.00
+ATOM 28 H 1 -1.288 5.991 0.352 1.00 0.00
+ATOM 29 H 1 0.256 5.755 -0.501 1.00 0.00
+TER 30
+CONECT 1 2
+CONECT 2 1
+CONECT 2 3
+CONECT 3 2
+CONECT 3 4
+CONECT 4 3
+CONECT 4 5
+CONECT 5 4
+CONECT 5 6
+CONECT 6 5
+CONECT 6 1
+CONECT 1 6
+CONECT 1 7
+CONECT 7 1
+CONECT 2 8
+CONECT 8 2
+CONECT 3 9
+CONECT 9 3
+CONECT 4 10
+CONECT 10 4
+CONECT 5 11
+CONECT 11 5
+CONECT 6 12
+CONECT 12 6
+CONECT 8 13
+CONECT 13 8
+CONECT 13 14
+CONECT 14 13
+CONECT 8 15
+CONECT 15 8
+CONECT 8 19
+CONECT 19 8
+CONECT 13 20
+CONECT 20 13
+CONECT 13 21
+CONECT 21 13
+CONECT 14 22
+CONECT 22 14
+CONECT 14 23
+CONECT 23 14
+CONECT 23 24
+CONECT 24 23
+CONECT 23 25
+CONECT 25 23
+CONECT 23 26
+CONECT 26 23
+CONECT 21 27
+CONECT 27 21
+CONECT 21 28
+CONECT 28 21
+CONECT 21 29
+CONECT 29 21
+MASTER 0 0 0 0 0 0 0 6 26 1 52 0
+END
diff --git a/hacks/images/molecules/morphine.pdb b/hacks/images/molecules/morphine.pdb
new file mode 100644
index 0000000..57ae154
--- /dev/null
+++ b/hacks/images/molecules/morphine.pdb
@@ -0,0 +1,87 @@
+HEADER Morphine, an opiate
+COMPND al3058
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.400 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.106 1.211 0.000 1.00 0.00
+HETATM 4 C 1 1.444 2.446 -0.039 1.00 0.00
+HETATM 5 C 1 0.047 2.458 0.013 1.00 0.00
+HETATM 6 C 1 -0.629 1.243 0.051 1.00 0.00
+HETATM 7 C 1 -2.081 1.500 -0.228 1.00 0.00
+HETATM 8 C 1 -2.727 0.342 -0.999 1.00 0.00
+HETATM 9 C 1 -2.363 -0.953 -0.239 1.00 0.00
+HETATM 10 C 1 -0.832 -1.231 -0.285 1.00 0.00
+HETATM 11 C 1 -1.885 2.839 -0.975 1.00 0.00
+HETATM 12 C 1 -2.772 1.631 1.137 1.00 0.00
+HETATM 13 C 1 -2.525 0.318 1.912 1.00 0.00
+HETATM 14 N 1 -2.930 -0.855 1.119 1.00 0.00
+HETATM 15 C 1 -2.790 -2.096 1.899 1.00 0.00
+HETATM 16 H 1 -3.810 0.470 -0.978 1.00 0.00
+HETATM 17 C 1 -2.300 0.287 -2.447 1.00 0.00
+HETATM 18 C 1 -2.022 1.415 -3.116 1.00 0.00
+HETATM 19 C 1 -1.406 2.612 -2.428 1.00 0.00
+HETATM 20 H 1 -2.795 3.439 -0.953 1.00 0.00
+HETATM 21 O 1 -0.796 3.478 -0.328 1.00 0.00
+HETATM 22 H 1 -1.616 3.510 -3.009 1.00 0.00
+HETATM 23 O 1 0.011 2.407 -2.414 1.00 0.00
+HETATM 24 O 1 2.143 3.606 -0.184 1.00 0.00
+HETATM 25 H 1 1.942 -0.943 -0.066 1.00 0.00
+HETATM 26 H 1 3.195 1.192 -0.045 1.00 0.00
+HETATM 27 H 1 -2.861 -1.784 -0.739 1.00 0.00
+HETATM 28 H 1 -0.580 -1.568 -1.291 1.00 0.00
+HETATM 29 H 1 -0.568 -2.021 0.414 1.00 0.00
+HETATM 30 H 1 -3.842 1.788 0.997 1.00 0.00
+HETATM 31 H 1 -2.350 2.469 1.692 1.00 0.00
+HETATM 32 H 1 -3.107 0.346 2.833 1.00 0.00
+HETATM 33 H 1 -1.471 0.235 2.174 1.00 0.00
+HETATM 34 H 1 -3.461 -2.058 2.757 1.00 0.00
+HETATM 35 H 1 -1.767 -2.205 2.257 1.00 0.00
+HETATM 36 H 1 -3.054 -2.955 1.282 1.00 0.00
+HETATM 37 H 1 -2.529 -0.612 -3.019 1.00 0.00
+HETATM 38 H 1 -1.956 1.362 -4.203 1.00 0.00
+HETATM 39 H 1 0.343 2.320 -3.313 1.00 0.00
+HETATM 40 H 1 2.435 3.917 0.680 1.00 0.00
+CONECT 1 2 2 6 10
+CONECT 2 1 1 3 25
+CONECT 3 2 4 4 26
+CONECT 4 3 3 5 24
+CONECT 5 4 6 6 21
+CONECT 6 1 5 5 7
+CONECT 7 6 8 11 12
+CONECT 8 7 9 16 17
+CONECT 9 8 10 14 27
+CONECT 10 1 9 28 29
+CONECT 11 7 19 20 21
+CONECT 12 7 13 30 31
+CONECT 13 12 14 32 33
+CONECT 14 9 13 15
+CONECT 15 14 34 35 36
+CONECT 16 8
+CONECT 17 8 18 18 37
+CONECT 18 17 17 19 38
+CONECT 19 11 18 22 23
+CONECT 20 11
+CONECT 21 5 11
+CONECT 22 19
+CONECT 23 19 39
+CONECT 24 4 40
+CONECT 25 2
+CONECT 26 3
+CONECT 27 9
+CONECT 28 10
+CONECT 29 10
+CONECT 30 12
+CONECT 31 12
+CONECT 32 13
+CONECT 33 13
+CONECT 34 15
+CONECT 35 15
+CONECT 36 15
+CONECT 37 17
+CONECT 38 18
+CONECT 39 23
+CONECT 40 24
+MASTER 0 0 0 0 0 0 0 0 40 0 40 0
+END
diff --git a/hacks/images/molecules/nicotine.pdb b/hacks/images/molecules/nicotine.pdb
new file mode 100644
index 0000000..d429efe
--- /dev/null
+++ b/hacks/images/molecules/nicotine.pdb
@@ -0,0 +1,59 @@
+HEADER Nicotine, an insecticide
+COMPND nicotine
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.400 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.082 1.223 0.000 1.00 0.00
+HETATM 4 C 1 1.361 2.420 -0.060 1.00 0.00
+HETATM 5 C 1 -0.037 2.388 -0.103 1.00 0.00
+HETATM 6 N 1 -0.698 1.182 -0.064 1.00 0.00
+HETATM 7 C 1 2.135 -1.320 0.103 1.00 0.00
+HETATM 8 H 1 -0.543 -0.944 0.043 1.00 0.00
+HETATM 9 H 1 3.168 1.256 0.062 1.00 0.00
+HETATM 10 H 1 1.886 3.375 -0.067 1.00 0.00
+HETATM 11 H 1 -0.604 3.318 -0.148 1.00 0.00
+HETATM 12 H 1 2.087 -1.661 1.139 1.00 0.00
+HETATM 13 N 1 1.561 -2.374 -0.749 1.00 0.00
+HETATM 14 C 1 3.616 -1.255 -0.318 1.00 0.00
+HETATM 15 C 1 3.943 -2.708 -0.713 1.00 0.00
+HETATM 16 C 1 2.580 -3.434 -0.690 1.00 0.00
+HETATM 17 C 1 1.359 -1.946 -2.144 1.00 0.00
+HETATM 18 H 1 4.247 -0.910 0.502 1.00 0.00
+HETATM 19 H 1 3.736 -0.608 -1.187 1.00 0.00
+HETATM 20 H 1 4.627 -3.166 0.001 1.00 0.00
+HETATM 21 H 1 4.371 -2.732 -1.715 1.00 0.00
+HETATM 22 H 1 2.475 -3.968 0.255 1.00 0.00
+HETATM 23 H 1 2.490 -4.135 -1.520 1.00 0.00
+HETATM 24 H 1 2.299 -1.632 -2.594 1.00 0.00
+HETATM 25 H 1 0.648 -1.122 -2.190 1.00 0.00
+HETATM 26 H 1 0.956 -2.781 -2.717 1.00 0.00
+CONECT 1 2 2 6 8
+CONECT 2 1 1 3 7
+CONECT 3 2 4 4 9
+CONECT 4 3 3 5 10
+CONECT 5 4 6 6 11
+CONECT 6 1 5 5
+CONECT 7 2 12 13 14
+CONECT 8 1
+CONECT 9 3
+CONECT 10 4
+CONECT 11 5
+CONECT 12 7
+CONECT 13 7 16 17
+CONECT 14 7 15 18 19
+CONECT 15 14 16 20 21
+CONECT 16 13 15 22 23
+CONECT 17 13 24 25 26
+CONECT 18 14
+CONECT 19 14
+CONECT 20 15
+CONECT 21 15
+CONECT 22 16
+CONECT 23 16
+CONECT 24 17
+CONECT 25 17
+CONECT 26 17
+MASTER 0 0 0 0 0 0 0 0 26 0 26 0
+END
diff --git a/hacks/images/molecules/novocaine.pdb b/hacks/images/molecules/novocaine.pdb
new file mode 100644
index 0000000..0051f05
--- /dev/null
+++ b/hacks/images/molecules/novocaine.pdb
@@ -0,0 +1,81 @@
+HEADER Procaine: Novocaine, a local anesthetic
+COMPND al3080
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.399 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.099 1.211 0.000 1.00 0.00
+HETATM 4 C 1 1.398 2.422 0.001 1.00 0.00
+HETATM 5 C 1 -0.001 2.421 0.002 1.00 0.00
+HETATM 6 C 1 -0.702 1.211 0.002 1.00 0.00
+HETATM 7 N 1 -2.104 1.210 0.003 1.00 0.00
+HETATM 8 C 1 3.511 1.212 0.000 1.00 0.00
+HETATM 9 O 1 4.107 2.255 -0.002 1.00 0.00
+HETATM 10 O 1 4.172 0.056 0.011 1.00 0.00
+HETATM 11 C 1 5.562 0.269 0.112 1.00 0.00
+HETATM 12 C 1 6.275 -1.096 0.162 1.00 0.00
+HETATM 13 H 1 -0.542 -0.946 0.000 1.00 0.00
+HETATM 14 H 1 1.942 -0.945 -0.001 1.00 0.00
+HETATM 15 H 1 1.940 3.368 0.001 1.00 0.00
+HETATM 16 H 1 -0.544 3.367 0.004 1.00 0.00
+HETATM 17 H 1 -2.613 0.334 0.002 1.00 0.00
+HETATM 18 H 1 5.776 0.831 1.021 1.00 0.00
+HETATM 19 H 1 5.912 0.827 -0.758 1.00 0.00
+HETATM 20 H 1 5.949 -1.682 -0.697 1.00 0.00
+HETATM 21 H 1 5.984 -1.614 1.076 1.00 0.00
+HETATM 22 N 1 7.741 -0.935 0.107 1.00 0.00
+HETATM 23 C 1 8.433 -2.206 -0.184 1.00 0.00
+HETATM 24 C 1 8.171 -3.279 0.896 1.00 0.00
+HETATM 25 C 1 8.301 -0.239 1.281 1.00 0.00
+HETATM 26 C 1 8.683 1.204 0.891 1.00 0.00
+HETATM 27 H 1 -2.613 2.087 0.004 1.00 0.00
+HETATM 28 H 1 9.505 -2.021 -0.249 1.00 0.00
+HETATM 29 H 1 8.091 -2.587 -1.146 1.00 0.00
+HETATM 30 H 1 7.118 -3.559 0.896 1.00 0.00
+HETATM 31 H 1 8.444 -2.898 1.879 1.00 0.00
+HETATM 32 H 1 8.770 -4.162 0.675 1.00 0.00
+HETATM 33 H 1 9.205 -0.743 1.624 1.00 0.00
+HETATM 34 H 1 7.579 -0.223 2.098 1.00 0.00
+HETATM 35 H 1 7.804 1.747 0.546 1.00 0.00
+HETATM 36 H 1 9.424 1.176 0.092 1.00 0.00
+HETATM 37 H 1 9.105 1.714 1.757 1.00 0.00
+CONECT 1 2 2 6 13
+CONECT 2 1 1 3 14
+CONECT 3 2 4 4 8
+CONECT 4 3 3 5 15
+CONECT 5 4 6 6 16
+CONECT 6 1 5 5 7
+CONECT 7 6 17 27
+CONECT 8 3 9 9 10
+CONECT 9 8 8
+CONECT 10 8 11
+CONECT 11 10 12 18 19
+CONECT 12 11 20 21 22
+CONECT 13 1
+CONECT 14 2
+CONECT 15 4
+CONECT 16 5
+CONECT 17 7
+CONECT 18 11
+CONECT 19 11
+CONECT 20 12
+CONECT 21 12
+CONECT 22 12 23 25
+CONECT 23 22 24 28 29
+CONECT 24 23 30 31 32
+CONECT 25 22 26 33 34
+CONECT 26 25 35 36 37
+CONECT 27 7
+CONECT 28 23
+CONECT 29 23
+CONECT 30 24
+CONECT 31 24
+CONECT 32 24
+CONECT 33 25
+CONECT 34 25
+CONECT 35 26
+CONECT 36 26
+CONECT 37 26
+MASTER 0 0 0 0 0 0 0 0 37 0 37 0
+END
diff --git a/hacks/images/molecules/olestra.pdb b/hacks/images/molecules/olestra.pdb
new file mode 100644
index 0000000..b155d2f
--- /dev/null
+++ b/hacks/images/molecules/olestra.pdb
@@ -0,0 +1,913 @@
+HEADER Sucrose octaoleate: Olestra-like non-hydrolyzing fat
+COMPND jb15oles
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Sep 20 16:26:54 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.543 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.023 1.465 0.000 1.00 0.00
+HETATM 4 C 1 1.448 2.115 1.276 1.00 0.00
+HETATM 5 C 1 -0.094 1.986 1.258 1.00 0.00
+HETATM 6 O 1 -0.446 0.620 1.189 1.00 0.00
+HETATM 7 O 1 -0.682 2.630 0.148 1.00 0.00
+HETATM 8 C 1 -0.713 4.011 -0.142 1.00 0.00
+HETATM 9 C 1 -1.600 4.135 -1.401 1.00 0.00
+HETATM 10 C 1 -1.324 4.924 0.946 1.00 0.00
+HETATM 11 O 1 0.576 4.533 -0.389 1.00 0.00
+HETATM 12 C 1 0.436 5.938 -0.395 1.00 0.00
+HETATM 13 C 1 -0.617 6.269 0.681 1.00 0.00
+HETATM 14 C 1 1.756 6.671 -0.084 1.00 0.00
+HETATM 15 O 1 2.227 6.278 1.183 1.00 0.00
+HETATM 16 O 1 -1.499 7.264 0.209 1.00 0.00
+HETATM 17 O 1 -1.029 4.475 2.250 1.00 0.00
+HETATM 18 O 1 -1.000 3.465 -2.486 1.00 0.00
+HETATM 19 C 1 -0.514 -1.457 -0.089 1.00 0.00
+HETATM 20 O 1 -1.922 -1.490 0.008 1.00 0.00
+HETATM 21 O 1 2.044 -0.707 -1.115 1.00 0.00
+HETATM 22 O 1 3.434 1.488 -0.024 1.00 0.00
+HETATM 23 O 1 1.870 3.459 1.361 1.00 0.00
+HETATM 24 C 1 -2.482 -2.432 -0.753 1.00 0.00
+HETATM 25 O 1 -3.315 -2.099 -1.556 1.00 0.00
+HETATM 26 C 1 -2.336 -3.895 -0.434 1.00 0.00
+HETATM 27 C 1 -3.583 -4.668 -0.927 1.00 0.00
+HETATM 28 C 1 -3.416 -6.194 -0.736 1.00 0.00
+HETATM 29 C 1 -4.686 -6.939 -1.212 1.00 0.00
+HETATM 30 C 1 -4.492 -8.472 -1.146 1.00 0.00
+HETATM 31 C 1 -5.779 -9.194 -1.608 1.00 0.00
+HETATM 32 C 1 -5.580 -10.727 -1.651 1.00 0.00
+HETATM 33 C 1 -6.868 -11.389 -2.094 1.00 0.00
+HETATM 34 C 1 -6.933 -12.683 -2.447 1.00 0.00
+HETATM 35 C 1 -5.725 -13.593 -2.433 1.00 0.00
+HETATM 36 C 1 -6.164 -15.030 -2.794 1.00 0.00
+HETATM 37 C 1 -4.957 -15.993 -2.791 1.00 0.00
+HETATM 38 C 1 -5.423 -17.419 -3.153 1.00 0.00
+HETATM 39 C 1 -4.225 -18.393 -3.146 1.00 0.00
+HETATM 40 C 1 -4.700 -19.818 -3.505 1.00 0.00
+HETATM 41 C 1 3.344 -0.983 -0.999 1.00 0.00
+HETATM 42 O 1 4.098 -0.665 -1.882 1.00 0.00
+HETATM 43 C 1 3.844 -1.849 0.124 1.00 0.00
+HETATM 44 C 1 5.081 -2.680 -0.284 1.00 0.00
+HETATM 45 C 1 5.532 -3.506 0.946 1.00 0.00
+HETATM 46 C 1 6.768 -4.378 0.668 1.00 0.00
+HETATM 47 C 1 7.108 -5.157 1.969 1.00 0.00
+HETATM 48 C 1 8.283 -6.109 1.808 1.00 0.00
+HETATM 49 C 1 8.489 -6.845 3.177 1.00 0.00
+HETATM 50 C 1 9.603 -7.867 3.101 1.00 0.00
+HETATM 51 C 1 9.838 -8.686 4.139 1.00 0.00
+HETATM 52 C 1 8.989 -8.622 5.392 1.00 0.00
+HETATM 53 C 1 9.509 -9.601 6.463 1.00 0.00
+HETATM 54 C 1 8.612 -9.509 7.718 1.00 0.00
+HETATM 55 C 1 9.090 -10.491 8.808 1.00 0.00
+HETATM 56 C 1 8.155 -10.395 10.033 1.00 0.00
+HETATM 57 C 1 8.599 -11.385 11.130 1.00 0.00
+HETATM 58 C 1 3.954 2.643 0.391 1.00 0.00
+HETATM 59 O 1 4.364 2.722 1.520 1.00 0.00
+HETATM 60 C 1 3.833 3.903 -0.422 1.00 0.00
+HETATM 61 C 1 5.113 4.138 -1.254 1.00 0.00
+HETATM 62 C 1 5.001 5.470 -2.030 1.00 0.00
+HETATM 63 C 1 6.274 5.721 -2.868 1.00 0.00
+HETATM 64 C 1 6.142 7.042 -3.658 1.00 0.00
+HETATM 65 C 1 7.424 7.302 -4.480 1.00 0.00
+HETATM 66 C 1 7.292 8.604 -5.302 1.00 0.00
+HETATM 67 C 1 8.567 8.842 -6.080 1.00 0.00
+HETATM 68 C 1 8.673 9.819 -6.994 1.00 0.00
+HETATM 69 C 1 7.518 10.739 -7.321 1.00 0.00
+HETATM 70 C 1 7.962 11.764 -8.388 1.00 0.00
+HETATM 71 C 1 6.793 12.704 -8.749 1.00 0.00
+HETATM 72 C 1 7.240 13.712 -9.829 1.00 0.00
+HETATM 73 C 1 6.069 14.649 -10.192 1.00 0.00
+HETATM 74 C 1 6.510 15.654 -11.277 1.00 0.00
+HETATM 75 C 1 1.563 4.034 2.524 1.00 0.00
+HETATM 76 O 1 0.994 5.094 2.507 1.00 0.00
+HETATM 77 C 1 2.204 3.624 3.820 1.00 0.00
+HETATM 78 C 1 1.081 3.461 4.864 1.00 0.00
+HETATM 79 C 1 1.646 2.985 6.219 1.00 0.00
+HETATM 80 C 1 0.495 2.893 7.242 1.00 0.00
+HETATM 81 C 1 0.991 2.293 8.574 1.00 0.00
+HETATM 82 C 1 -0.180 2.239 9.577 1.00 0.00
+HETATM 83 C 1 0.252 1.529 10.878 1.00 0.00
+HETATM 84 C 1 -0.909 1.516 11.848 1.00 0.00
+HETATM 85 C 1 -1.007 0.609 12.832 1.00 0.00
+HETATM 86 C 1 0.023 -0.485 13.013 1.00 0.00
+HETATM 87 C 1 -0.255 -1.246 14.326 1.00 0.00
+HETATM 88 C 1 0.758 -2.396 14.494 1.00 0.00
+HETATM 89 C 1 0.465 -3.168 15.798 1.00 0.00
+HETATM 90 C 1 1.443 -4.352 15.937 1.00 0.00
+HETATM 91 C 1 1.138 -5.136 17.229 1.00 0.00
+HETATM 92 C 1 -1.640 3.717 -3.628 1.00 0.00
+HETATM 93 O 1 -1.012 4.078 -4.590 1.00 0.00
+HETATM 94 C 1 -3.121 3.488 -3.752 1.00 0.00
+HETATM 95 C 1 -3.553 3.549 -5.232 1.00 0.00
+HETATM 96 C 1 -5.083 3.368 -5.331 1.00 0.00
+HETATM 97 C 1 -5.545 3.449 -6.801 1.00 0.00
+HETATM 98 C 1 -7.080 3.295 -6.870 1.00 0.00
+HETATM 99 C 1 -7.563 3.372 -8.334 1.00 0.00
+HETATM 100 C 1 -9.099 3.230 -8.385 1.00 0.00
+HETATM 101 C 1 -9.579 3.302 -9.818 1.00 0.00
+HETATM 102 C 1 -10.886 3.239 -10.119 1.00 0.00
+HETATM 103 C 1 -11.934 3.095 -9.037 1.00 0.00
+HETATM 104 C 1 -13.340 3.036 -9.669 1.00 0.00
+HETATM 105 C 1 -14.403 2.883 -8.561 1.00 0.00
+HETATM 106 C 1 -15.815 2.830 -9.181 1.00 0.00
+HETATM 107 C 1 -16.867 2.668 -8.064 1.00 0.00
+HETATM 108 C 1 -18.283 2.619 -8.671 1.00 0.00
+HETATM 109 C 1 -2.001 7.975 1.218 1.00 0.00
+HETATM 110 O 1 -3.001 7.595 1.768 1.00 0.00
+HETATM 111 C 1 -1.156 9.034 1.872 1.00 0.00
+HETATM 112 C 1 -1.534 10.432 1.344 1.00 0.00
+HETATM 113 C 1 -0.625 11.493 2.001 1.00 0.00
+HETATM 114 C 1 -0.976 12.902 1.479 1.00 0.00
+HETATM 115 C 1 -0.062 13.955 2.143 1.00 0.00
+HETATM 116 C 1 -0.432 15.365 1.636 1.00 0.00
+HETATM 117 C 1 0.472 16.432 2.289 1.00 0.00
+HETATM 118 C 1 0.070 17.801 1.786 1.00 0.00
+HETATM 119 C 1 0.739 18.910 2.133 1.00 0.00
+HETATM 120 C 1 1.947 18.864 3.043 1.00 0.00
+HETATM 121 C 1 2.466 20.301 3.261 1.00 0.00
+HETATM 122 C 1 3.707 20.302 4.178 1.00 0.00
+HETATM 123 C 1 4.204 21.750 4.364 1.00 0.00
+HETATM 124 C 1 5.448 21.780 5.275 1.00 0.00
+HETATM 125 C 1 5.933 23.236 5.440 1.00 0.00
+HETATM 126 C 1 -1.676 5.203 3.160 1.00 0.00
+HETATM 127 O 1 -1.395 6.362 3.326 1.00 0.00
+HETATM 128 C 1 -2.722 4.564 4.031 1.00 0.00
+HETATM 129 C 1 -3.529 5.657 4.765 1.00 0.00
+HETATM 130 C 1 -4.616 5.007 5.648 1.00 0.00
+HETATM 131 C 1 -5.417 6.088 6.405 1.00 0.00
+HETATM 132 C 1 -6.505 5.421 7.274 1.00 0.00
+HETATM 133 C 1 -7.276 6.485 8.085 1.00 0.00
+HETATM 134 C 1 -8.342 5.803 8.967 1.00 0.00
+HETATM 135 C 1 -8.999 6.835 9.859 1.00 0.00
+HETATM 136 C 1 -10.265 7.250 9.698 1.00 0.00
+HETATM 137 C 1 -11.161 6.729 8.595 1.00 0.00
+HETATM 138 C 1 -12.519 7.460 8.650 1.00 0.00
+HETATM 139 C 1 -13.450 6.941 7.534 1.00 0.00
+HETATM 140 C 1 -14.810 7.665 7.610 1.00 0.00
+HETATM 141 C 1 -15.745 7.150 6.496 1.00 0.00
+HETATM 142 C 1 -17.110 7.866 6.583 1.00 0.00
+HETATM 143 C 1 2.842 7.281 1.802 1.00 0.00
+HETATM 144 O 1 2.205 8.253 2.118 1.00 0.00
+HETATM 145 C 1 4.220 7.092 2.370 1.00 0.00
+HETATM 146 C 1 4.473 8.156 3.459 1.00 0.00
+HETATM 147 C 1 5.893 8.017 4.051 1.00 0.00
+HETATM 148 C 1 6.113 9.105 5.125 1.00 0.00
+HETATM 149 C 1 7.536 9.013 5.717 1.00 0.00
+HETATM 150 C 1 7.731 10.123 6.772 1.00 0.00
+HETATM 151 C 1 9.153 10.065 7.368 1.00 0.00
+HETATM 152 C 1 9.319 11.173 8.385 1.00 0.00
+HETATM 153 C 1 10.461 11.337 9.067 1.00 0.00
+HETATM 154 C 1 11.643 10.413 8.868 1.00 0.00
+HETATM 155 C 1 12.819 10.884 9.749 1.00 0.00
+HETATM 156 C 1 14.028 9.942 9.572 1.00 0.00
+HETATM 157 C 1 15.194 10.418 10.464 1.00 0.00
+HETATM 158 C 1 16.397 9.465 10.312 1.00 0.00
+HETATM 159 C 1 17.555 9.936 11.217 1.00 0.00
+HETATM 160 C 1 18.753 8.973 11.081 1.00 0.00
+HETATM 161 C 1 19.907 9.437 11.992 1.00 0.00
+HETATM 162 C 1 7.637 -11.294 12.332 1.00 0.00
+HETATM 163 C 1 8.066 -12.287 13.432 1.00 0.00
+HETATM 164 C 1 -3.503 -20.792 -3.494 1.00 0.00
+HETATM 165 C 1 -3.976 -22.215 -3.853 1.00 0.00
+HETATM 166 C 1 2.094 -6.341 17.349 1.00 0.00
+HETATM 167 C 1 1.786 -7.131 18.637 1.00 0.00
+HETATM 168 C 1 5.336 16.589 -11.634 1.00 0.00
+HETATM 169 C 1 5.771 17.593 -12.721 1.00 0.00
+HETATM 170 C 1 7.177 23.279 6.350 1.00 0.00
+HETATM 171 C 1 7.661 24.734 6.509 1.00 0.00
+HETATM 172 C 1 -19.327 2.450 -7.548 1.00 0.00
+HETATM 173 C 1 -20.747 2.406 -8.149 1.00 0.00
+HETATM 174 C 1 -18.044 7.350 5.470 1.00 0.00
+HETATM 175 C 1 -19.412 8.057 5.560 1.00 0.00
+HETATM 176 H 1 -0.368 0.553 -0.864 1.00 0.00
+HETATM 177 H 1 1.874 -0.482 0.920 1.00 0.00
+HETATM 178 H 1 1.632 1.978 -0.879 1.00 0.00
+HETATM 179 H 1 1.826 1.557 2.131 1.00 0.00
+HETATM 180 H 1 -0.503 2.395 2.180 1.00 0.00
+HETATM 181 H 1 -1.766 5.183 -1.654 1.00 0.00
+HETATM 182 H 1 -2.562 3.672 -1.182 1.00 0.00
+HETATM 183 H 1 -2.404 5.015 0.817 1.00 0.00
+HETATM 184 H 1 0.079 6.263 -1.372 1.00 0.00
+HETATM 185 H 1 -0.107 6.607 1.580 1.00 0.00
+HETATM 186 H 1 1.568 7.745 -0.111 1.00 0.00
+HETATM 187 H 1 2.495 6.425 -0.844 1.00 0.00
+HETATM 188 H 1 -0.089 -2.043 0.726 1.00 0.00
+HETATM 189 H 1 -0.191 -1.883 -1.040 1.00 0.00
+HETATM 190 H 1 -2.226 -4.025 0.643 1.00 0.00
+HETATM 191 H 1 -1.448 -4.280 -0.936 1.00 0.00
+HETATM 192 H 1 -3.732 -4.461 -1.987 1.00 0.00
+HETATM 193 H 1 -4.457 -4.327 -0.372 1.00 0.00
+HETATM 194 H 1 -3.242 -6.413 0.317 1.00 0.00
+HETATM 195 H 1 -2.560 -6.535 -1.319 1.00 0.00
+HETATM 196 H 1 -4.902 -6.654 -2.241 1.00 0.00
+HETATM 197 H 1 -5.527 -6.653 -0.579 1.00 0.00
+HETATM 198 H 1 -4.259 -8.767 -0.123 1.00 0.00
+HETATM 199 H 1 -3.666 -8.756 -1.799 1.00 0.00
+HETATM 200 H 1 -6.047 -8.844 -2.605 1.00 0.00
+HETATM 201 H 1 -6.588 -8.955 -0.918 1.00 0.00
+HETATM 202 H 1 -5.310 -11.089 -0.659 1.00 0.00
+HETATM 203 H 1 -4.783 -10.967 -2.355 1.00 0.00
+HETATM 204 H 1 -7.781 -10.795 -2.125 1.00 0.00
+HETATM 205 H 1 -7.896 -13.091 -2.754 1.00 0.00
+HETATM 206 H 1 -5.275 -13.588 -1.440 1.00 0.00
+HETATM 207 H 1 -4.997 -13.243 -3.164 1.00 0.00
+HETATM 208 H 1 -6.618 -15.028 -3.785 1.00 0.00
+HETATM 209 H 1 -6.898 -15.374 -2.065 1.00 0.00
+HETATM 210 H 1 -4.502 -16.000 -1.801 1.00 0.00
+HETATM 211 H 1 -4.222 -15.655 -3.522 1.00 0.00
+HETATM 212 H 1 -5.875 -17.411 -4.145 1.00 0.00
+HETATM 213 H 1 -6.163 -17.753 -2.425 1.00 0.00
+HETATM 214 H 1 -3.773 -18.402 -2.155 1.00 0.00
+HETATM 215 H 1 -3.486 -18.063 -3.876 1.00 0.00
+HETATM 216 H 1 -5.150 -19.810 -4.498 1.00 0.00
+HETATM 217 H 1 -5.441 -20.147 -2.777 1.00 0.00
+HETATM 218 H 1 3.046 -2.532 0.416 1.00 0.00
+HETATM 219 H 1 4.102 -1.216 0.975 1.00 0.00
+HETATM 220 H 1 5.884 -2.006 -0.580 1.00 0.00
+HETATM 221 H 1 4.829 -3.337 -1.117 1.00 0.00
+HETATM 222 H 1 4.717 -4.156 1.264 1.00 0.00
+HETATM 223 H 1 5.773 -2.820 1.759 1.00 0.00
+HETATM 224 H 1 7.605 -3.757 0.345 1.00 0.00
+HETATM 225 H 1 6.511 -5.083 -0.123 1.00 0.00
+HETATM 226 H 1 6.244 -5.737 2.294 1.00 0.00
+HETATM 227 H 1 7.378 -4.451 2.755 1.00 0.00
+HETATM 228 H 1 9.158 -5.517 1.539 1.00 0.00
+HETATM 229 H 1 8.056 -6.812 1.007 1.00 0.00
+HETATM 230 H 1 7.572 -7.372 3.439 1.00 0.00
+HETATM 231 H 1 8.718 -6.129 3.967 1.00 0.00
+HETATM 232 H 1 10.222 -7.926 2.206 1.00 0.00
+HETATM 233 H 1 10.647 -9.413 4.074 1.00 0.00
+HETATM 234 H 1 7.960 -8.886 5.148 1.00 0.00
+HETATM 235 H 1 9.015 -7.611 5.799 1.00 0.00
+HETATM 236 H 1 10.534 -9.341 6.725 1.00 0.00
+HETATM 237 H 1 9.481 -10.616 6.068 1.00 0.00
+HETATM 238 H 1 7.586 -9.753 7.443 1.00 0.00
+HETATM 239 H 1 8.644 -8.493 8.111 1.00 0.00
+HETATM 240 H 1 10.108 -10.239 9.105 1.00 0.00
+HETATM 241 H 1 9.070 -11.507 8.415 1.00 0.00
+HETATM 242 H 1 7.136 -10.633 9.726 1.00 0.00
+HETATM 243 H 1 8.182 -9.380 10.429 1.00 0.00
+HETATM 244 H 1 9.611 -11.139 11.453 1.00 0.00
+HETATM 245 H 1 8.585 -12.399 10.730 1.00 0.00
+HETATM 246 H 1 3.697 4.738 0.262 1.00 0.00
+HETATM 247 H 1 2.973 3.837 -1.086 1.00 0.00
+HETATM 248 H 1 5.244 3.316 -1.956 1.00 0.00
+HETATM 249 H 1 5.973 4.181 -0.585 1.00 0.00
+HETATM 250 H 1 4.873 6.289 -1.322 1.00 0.00
+HETATM 251 H 1 4.136 5.428 -2.692 1.00 0.00
+HETATM 252 H 1 6.415 4.896 -3.567 1.00 0.00
+HETATM 253 H 1 7.137 5.781 -2.205 1.00 0.00
+HETATM 254 H 1 5.987 7.867 -2.962 1.00 0.00
+HETATM 255 H 1 5.288 6.976 -4.332 1.00 0.00
+HETATM 256 H 1 7.592 6.466 -5.158 1.00 0.00
+HETATM 257 H 1 8.273 7.389 -3.801 1.00 0.00
+HETATM 258 H 1 7.117 9.443 -4.629 1.00 0.00
+HETATM 259 H 1 6.453 8.510 -5.991 1.00 0.00
+HETATM 260 H 1 9.432 8.207 -5.887 1.00 0.00
+HETATM 261 H 1 9.620 9.946 -7.519 1.00 0.00
+HETATM 262 H 1 7.205 11.266 -6.419 1.00 0.00
+HETATM 263 H 1 6.685 10.153 -7.709 1.00 0.00
+HETATM 264 H 1 8.285 11.232 -9.283 1.00 0.00
+HETATM 265 H 1 8.793 12.353 -8.000 1.00 0.00
+HETATM 266 H 1 6.474 13.244 -7.858 1.00 0.00
+HETATM 267 H 1 5.958 12.114 -9.129 1.00 0.00
+HETATM 268 H 1 7.559 13.171 -10.720 1.00 0.00
+HETATM 269 H 1 8.073 14.304 -9.450 1.00 0.00
+HETATM 270 H 1 5.753 15.194 -9.302 1.00 0.00
+HETATM 271 H 1 5.234 14.057 -10.566 1.00 0.00
+HETATM 272 H 1 6.824 15.110 -12.168 1.00 0.00
+HETATM 273 H 1 7.346 16.246 -10.905 1.00 0.00
+HETATM 274 H 1 2.891 4.405 4.144 1.00 0.00
+HETATM 275 H 1 2.753 2.690 3.706 1.00 0.00
+HETATM 276 H 1 0.360 2.729 4.502 1.00 0.00
+HETATM 277 H 1 0.578 4.420 4.999 1.00 0.00
+HETATM 278 H 1 2.396 3.692 6.575 1.00 0.00
+HETATM 279 H 1 2.104 2.004 6.094 1.00 0.00
+HETATM 280 H 1 -0.293 2.257 6.838 1.00 0.00
+HETATM 281 H 1 0.092 3.890 7.420 1.00 0.00
+HETATM 282 H 1 1.792 2.910 8.980 1.00 0.00
+HETATM 283 H 1 1.366 1.285 8.397 1.00 0.00
+HETATM 284 H 1 -1.010 1.689 9.134 1.00 0.00
+HETATM 285 H 1 -0.503 3.254 9.807 1.00 0.00
+HETATM 286 H 1 1.090 2.062 11.326 1.00 0.00
+HETATM 287 H 1 0.555 0.509 10.641 1.00 0.00
+HETATM 288 H 1 -1.682 2.279 11.759 1.00 0.00
+HETATM 289 H 1 -1.860 0.654 13.508 1.00 0.00
+HETATM 290 H 1 1.020 -0.047 13.053 1.00 0.00
+HETATM 291 H 1 -0.037 -1.180 12.176 1.00 0.00
+HETATM 292 H 1 -1.264 -1.658 14.297 1.00 0.00
+HETATM 293 H 1 -0.170 -0.560 15.169 1.00 0.00
+HETATM 294 H 1 1.769 -1.990 14.531 1.00 0.00
+HETATM 295 H 1 0.675 -3.076 13.646 1.00 0.00
+HETATM 296 H 1 -0.557 -3.546 15.772 1.00 0.00
+HETATM 297 H 1 0.580 -2.498 16.650 1.00 0.00
+HETATM 298 H 1 2.466 -3.977 15.971 1.00 0.00
+HETATM 299 H 1 1.331 -5.015 15.078 1.00 0.00
+HETATM 300 H 1 0.108 -5.493 17.202 1.00 0.00
+HETATM 301 H 1 1.269 -4.481 18.090 1.00 0.00
+HETATM 302 H 1 -3.652 4.262 -3.197 1.00 0.00
+HETATM 303 H 1 -3.371 2.511 -3.339 1.00 0.00
+HETATM 304 H 1 -3.052 2.758 -5.791 1.00 0.00
+HETATM 305 H 1 -3.275 4.517 -5.650 1.00 0.00
+HETATM 306 H 1 -5.575 4.153 -4.757 1.00 0.00
+HETATM 307 H 1 -5.358 2.397 -4.919 1.00 0.00
+HETATM 308 H 1 -5.072 2.653 -7.376 1.00 0.00
+HETATM 309 H 1 -5.259 4.415 -7.219 1.00 0.00
+HETATM 310 H 1 -7.548 4.093 -6.294 1.00 0.00
+HETATM 311 H 1 -7.365 2.332 -6.447 1.00 0.00
+HETATM 312 H 1 -7.105 2.569 -8.910 1.00 0.00
+HETATM 313 H 1 -7.275 4.333 -8.761 1.00 0.00
+HETATM 314 H 1 -9.553 4.035 -7.808 1.00 0.00
+HETATM 315 H 1 -9.385 2.270 -7.955 1.00 0.00
+HETATM 316 H 1 -8.852 3.405 -10.623 1.00 0.00
+HETATM 317 H 1 -11.195 3.293 -11.162 1.00 0.00
+HETATM 318 H 1 -11.879 3.949 -8.362 1.00 0.00
+HETATM 319 H 1 -11.753 2.177 -8.477 1.00 0.00
+HETATM 320 H 1 -13.398 2.184 -10.347 1.00 0.00
+HETATM 321 H 1 -13.526 3.954 -10.227 1.00 0.00
+HETATM 322 H 1 -14.340 3.732 -7.880 1.00 0.00
+HETATM 323 H 1 -14.217 1.964 -8.007 1.00 0.00
+HETATM 324 H 1 -15.880 1.984 -9.865 1.00 0.00
+HETATM 325 H 1 -16.006 3.752 -9.729 1.00 0.00
+HETATM 326 H 1 -16.797 3.511 -7.377 1.00 0.00
+HETATM 327 H 1 -16.675 1.743 -7.519 1.00 0.00
+HETATM 328 H 1 -18.353 1.777 -9.361 1.00 0.00
+HETATM 329 H 1 -18.478 3.545 -9.212 1.00 0.00
+HETATM 330 H 1 -0.105 8.848 1.652 1.00 0.00
+HETATM 331 H 1 -1.308 8.997 2.950 1.00 0.00
+HETATM 332 H 1 -2.576 10.642 1.584 1.00 0.00
+HETATM 333 H 1 -1.400 10.458 0.262 1.00 0.00
+HETATM 334 H 1 0.416 11.272 1.765 1.00 0.00
+HETATM 335 H 1 -0.761 11.465 3.082 1.00 0.00
+HETATM 336 H 1 -2.016 13.126 1.716 1.00 0.00
+HETATM 337 H 1 -0.839 12.933 0.398 1.00 0.00
+HETATM 338 H 1 0.978 13.741 1.894 1.00 0.00
+HETATM 339 H 1 -0.189 13.915 3.224 1.00 0.00
+HETATM 340 H 1 -1.473 15.574 1.885 1.00 0.00
+HETATM 341 H 1 -0.309 15.403 0.553 1.00 0.00
+HETATM 342 H 1 1.512 16.236 2.027 1.00 0.00
+HETATM 343 H 1 0.356 16.395 3.372 1.00 0.00
+HETATM 344 H 1 -0.793 17.892 1.125 1.00 0.00
+HETATM 345 H 1 0.403 19.871 1.743 1.00 0.00
+HETATM 346 H 1 2.729 18.261 2.583 1.00 0.00
+HETATM 347 H 1 1.666 18.429 4.003 1.00 0.00
+HETATM 348 H 1 1.680 20.901 3.718 1.00 0.00
+HETATM 349 H 1 2.733 20.734 2.297 1.00 0.00
+HETATM 350 H 1 4.496 19.701 3.725 1.00 0.00
+HETATM 351 H 1 3.443 19.879 5.148 1.00 0.00
+HETATM 352 H 1 3.412 22.349 4.815 1.00 0.00
+HETATM 353 H 1 4.461 22.170 3.391 1.00 0.00
+HETATM 354 H 1 6.241 21.182 4.827 1.00 0.00
+HETATM 355 H 1 5.192 21.369 6.251 1.00 0.00
+HETATM 356 H 1 5.138 23.834 5.886 1.00 0.00
+HETATM 357 H 1 6.186 23.646 4.463 1.00 0.00
+HETATM 358 H 1 -2.234 3.917 4.760 1.00 0.00
+HETATM 359 H 1 -3.391 3.970 3.410 1.00 0.00
+HETATM 360 H 1 -3.999 6.312 4.032 1.00 0.00
+HETATM 361 H 1 -2.855 6.243 5.391 1.00 0.00
+HETATM 362 H 1 -4.143 4.340 6.369 1.00 0.00
+HETATM 363 H 1 -5.294 4.431 5.018 1.00 0.00
+HETATM 364 H 1 -5.887 6.762 5.689 1.00 0.00
+HETATM 365 H 1 -4.741 6.657 7.044 1.00 0.00
+HETATM 366 H 1 -6.034 4.719 7.961 1.00 0.00
+HETATM 367 H 1 -7.201 4.881 6.631 1.00 0.00
+HETATM 368 H 1 -7.762 7.185 7.405 1.00 0.00
+HETATM 369 H 1 -6.577 7.027 8.721 1.00 0.00
+HETATM 370 H 1 -7.858 5.057 9.599 1.00 0.00
+HETATM 371 H 1 -9.075 5.305 8.334 1.00 0.00
+HETATM 372 H 1 -8.416 7.259 10.676 1.00 0.00
+HETATM 373 H 1 -10.661 7.994 10.389 1.00 0.00
+HETATM 374 H 1 -11.324 5.660 8.731 1.00 0.00
+HETATM 375 H 1 -10.692 6.909 7.628 1.00 0.00
+HETATM 376 H 1 -12.360 8.530 8.520 1.00 0.00
+HETATM 377 H 1 -12.985 7.281 9.620 1.00 0.00
+HETATM 378 H 1 -13.603 5.869 7.659 1.00 0.00
+HETATM 379 H 1 -12.992 7.129 6.563 1.00 0.00
+HETATM 380 H 1 -14.657 8.738 7.488 1.00 0.00
+HETATM 381 H 1 -15.267 7.476 8.582 1.00 0.00
+HETATM 382 H 1 -15.891 6.077 6.614 1.00 0.00
+HETATM 383 H 1 -15.293 7.348 5.524 1.00 0.00
+HETATM 384 H 1 -16.964 8.939 6.466 1.00 0.00
+HETATM 385 H 1 -17.561 7.667 7.556 1.00 0.00
+HETATM 386 H 1 4.947 7.200 1.566 1.00 0.00
+HETATM 387 H 1 4.294 6.092 2.798 1.00 0.00
+HETATM 388 H 1 3.737 8.034 4.255 1.00 0.00
+HETATM 389 H 1 4.363 9.148 3.021 1.00 0.00
+HETATM 390 H 1 6.629 8.137 3.256 1.00 0.00
+HETATM 391 H 1 6.005 7.031 4.501 1.00 0.00
+HETATM 392 H 1 5.382 8.976 5.924 1.00 0.00
+HETATM 393 H 1 5.977 10.088 4.673 1.00 0.00
+HETATM 394 H 1 8.269 9.137 4.920 1.00 0.00
+HETATM 395 H 1 7.673 8.038 6.185 1.00 0.00
+HETATM 396 H 1 7.001 9.993 7.571 1.00 0.00
+HETATM 397 H 1 7.579 11.095 6.302 1.00 0.00
+HETATM 398 H 1 9.884 10.192 6.570 1.00 0.00
+HETATM 399 H 1 9.304 9.100 7.851 1.00 0.00
+HETATM 400 H 1 8.493 11.861 8.565 1.00 0.00
+HETATM 401 H 1 10.536 12.152 9.787 1.00 0.00
+HETATM 402 H 1 11.947 10.429 7.821 1.00 0.00
+HETATM 403 H 1 11.362 9.399 9.150 1.00 0.00
+HETATM 404 H 1 12.509 10.880 10.795 1.00 0.00
+HETATM 405 H 1 13.103 11.896 9.462 1.00 0.00
+HETATM 406 H 1 14.343 9.946 8.529 1.00 0.00
+HETATM 407 H 1 13.743 8.930 9.859 1.00 0.00
+HETATM 408 H 1 14.872 10.428 11.505 1.00 0.00
+HETATM 409 H 1 15.489 11.425 10.168 1.00 0.00
+HETATM 410 H 1 16.727 9.459 9.273 1.00 0.00
+HETATM 411 H 1 16.099 8.457 10.601 1.00 0.00
+HETATM 412 H 1 17.219 9.951 12.254 1.00 0.00
+HETATM 413 H 1 17.860 10.940 10.923 1.00 0.00
+HETATM 414 H 1 19.093 8.960 10.046 1.00 0.00
+HETATM 415 H 1 18.446 7.968 11.372 1.00 0.00
+HETATM 416 H 1 19.573 9.448 13.030 1.00 0.00
+HETATM 417 H 1 20.221 10.440 11.703 1.00 0.00
+HETATM 418 H 1 20.748 8.752 11.891 1.00 0.00
+HETATM 419 H 1 6.625 -11.535 12.006 1.00 0.00
+HETATM 420 H 1 7.653 -10.282 12.735 1.00 0.00
+HETATM 421 H 1 9.075 -12.048 13.767 1.00 0.00
+HETATM 422 H 1 8.046 -13.303 13.036 1.00 0.00
+HETATM 423 H 1 7.378 -12.215 14.274 1.00 0.00
+HETATM 424 H 1 -2.762 -20.465 -4.223 1.00 0.00
+HETATM 425 H 1 -3.052 -20.802 -2.502 1.00 0.00
+HETATM 426 H 1 -4.423 -22.213 -4.847 1.00 0.00
+HETATM 427 H 1 -4.714 -22.551 -3.124 1.00 0.00
+HETATM 428 H 1 -3.123 -22.895 -3.842 1.00 0.00
+HETATM 429 H 1 3.124 -5.987 17.380 1.00 0.00
+HETATM 430 H 1 1.964 -6.995 16.486 1.00 0.00
+HETATM 431 H 1 0.758 -7.491 18.610 1.00 0.00
+HETATM 432 H 1 1.921 -6.484 19.504 1.00 0.00
+HETATM 433 H 1 2.464 -7.981 18.713 1.00 0.00
+HETATM 434 H 1 5.023 17.135 -10.744 1.00 0.00
+HETATM 435 H 1 4.500 15.996 -12.005 1.00 0.00
+HETATM 436 H 1 6.079 17.053 -13.616 1.00 0.00
+HETATM 437 H 1 6.604 18.192 -12.354 1.00 0.00
+HETATM 438 H 1 4.935 18.248 -12.965 1.00 0.00
+HETATM 439 H 1 7.973 22.680 5.906 1.00 0.00
+HETATM 440 H 1 6.926 22.873 7.330 1.00 0.00
+HETATM 441 H 1 6.871 25.336 6.956 1.00 0.00
+HETATM 442 H 1 7.919 25.143 5.532 1.00 0.00
+HETATM 443 H 1 8.540 24.757 7.153 1.00 0.00
+HETATM 444 H 1 -19.255 3.289 -6.856 1.00 0.00
+HETATM 445 H 1 -19.135 1.523 -7.009 1.00 0.00
+HETATM 446 H 1 -20.826 1.565 -8.838 1.00 0.00
+HETATM 447 H 1 -20.947 3.334 -8.684 1.00 0.00
+HETATM 448 H 1 -21.476 2.286 -7.348 1.00 0.00
+HETATM 449 H 1 -18.187 6.275 5.583 1.00 0.00
+HETATM 450 H 1 -17.597 7.553 4.497 1.00 0.00
+HETATM 451 H 1 -19.276 9.132 5.443 1.00 0.00
+HETATM 452 H 1 -19.866 7.853 6.529 1.00 0.00
+HETATM 453 H 1 -20.065 7.687 4.770 1.00 0.00
+CONECT 1 2 6 19 176
+CONECT 2 1 3 21 177
+CONECT 3 2 4 22 178
+CONECT 4 3 5 23 179
+CONECT 5 4 6 7 180
+CONECT 6 1 5
+CONECT 7 5 8
+CONECT 8 7 9 10 11
+CONECT 9 8 18 181 182
+CONECT 10 8 13 17 183
+CONECT 11 8 12
+CONECT 12 11 13 14 184
+CONECT 13 10 12 16 185
+CONECT 14 12 15 186 187
+CONECT 15 14 143
+CONECT 16 13 109
+CONECT 17 10 126
+CONECT 18 9 92
+CONECT 19 1 20 188 189
+CONECT 20 19 24
+CONECT 21 2 41
+CONECT 22 3 58
+CONECT 23 4 75
+CONECT 24 20 25 25 26
+CONECT 25 24 24
+CONECT 26 24 27 190 191
+CONECT 27 26 28 192 193
+CONECT 28 27 29 194 195
+CONECT 29 28 30 196 197
+CONECT 30 29 31 198 199
+CONECT 31 30 32 200 201
+CONECT 32 31 33 202 203
+CONECT 33 32 34 34 204
+CONECT 34 33 33 35 205
+CONECT 35 34 36 206 207
+CONECT 36 35 37 208 209
+CONECT 37 36 38 210 211
+CONECT 38 37 39 212 213
+CONECT 39 38 40 214 215
+CONECT 40 39 164 216 217
+CONECT 41 21 42 42 43
+CONECT 42 41 41
+CONECT 43 41 44 218 219
+CONECT 44 43 45 220 221
+CONECT 45 44 46 222 223
+CONECT 46 45 47 224 225
+CONECT 47 46 48 226 227
+CONECT 48 47 49 228 229
+CONECT 49 48 50 230 231
+CONECT 50 49 51 51 232
+CONECT 51 50 50 52 233
+CONECT 52 51 53 234 235
+CONECT 53 52 54 236 237
+CONECT 54 53 55 238 239
+CONECT 55 54 56 240 241
+CONECT 56 55 57 242 243
+CONECT 57 56 162 244 245
+CONECT 58 22 59 59 60
+CONECT 59 58 58
+CONECT 60 58 61 246 247
+CONECT 61 60 62 248 249
+CONECT 62 61 63 250 251
+CONECT 63 62 64 252 253
+CONECT 64 63 65 254 255
+CONECT 65 64 66 256 257
+CONECT 66 65 67 258 259
+CONECT 67 66 68 68 260
+CONECT 68 67 67 69 261
+CONECT 69 68 70 262 263
+CONECT 70 69 71 264 265
+CONECT 71 70 72 266 267
+CONECT 72 71 73 268 269
+CONECT 73 72 74 270 271
+CONECT 74 73 168 272 273
+CONECT 75 23 76 76 77
+CONECT 76 75 75
+CONECT 77 75 78 274 275
+CONECT 78 77 79 276 277
+CONECT 79 78 80 278 279
+CONECT 80 79 81 280 281
+CONECT 81 80 82 282 283
+CONECT 82 81 83 284 285
+CONECT 83 82 84 286 287
+CONECT 84 83 85 85 288
+CONECT 85 84 84 86 289
+CONECT 86 85 87 290 291
+CONECT 87 86 88 292 293
+CONECT 88 87 89 294 295
+CONECT 89 88 90 296 297
+CONECT 90 89 91 298 299
+CONECT 91 90 166 300 301
+CONECT 92 18 93 93 94
+CONECT 93 92 92
+CONECT 94 92 95 302 303
+CONECT 95 94 96 304 305
+CONECT 96 95 97 306 307
+CONECT 97 96 98 308 309
+CONECT 98 97 99 310 311
+CONECT 99 98 100 312 313
+CONECT 100 99 101 314 315
+CONECT 101 100 102 102 316
+CONECT 102 101 101 103 317
+CONECT 103 102 104 318 319
+CONECT 104 103 105 320 321
+CONECT 105 104 106 322 323
+CONECT 106 105 107 324 325
+CONECT 107 106 108 326 327
+CONECT 108 107 172 328 329
+CONECT 109 16 110 110 111
+CONECT 110 109 109
+CONECT 111 109 112 330 331
+CONECT 112 111 113 332 333
+CONECT 113 112 114 334 335
+CONECT 114 113 115 336 337
+CONECT 115 114 116 338 339
+CONECT 116 115 117 340 341
+CONECT 117 116 118 342 343
+CONECT 118 117 119 119 344
+CONECT 119 118 118 120 345
+CONECT 120 119 121 346 347
+CONECT 121 120 122 348 349
+CONECT 122 121 123 350 351
+CONECT 123 122 124 352 353
+CONECT 124 123 125 354 355
+CONECT 125 124 170 356 357
+CONECT 126 17 127 127 128
+CONECT 127 126 126
+CONECT 128 126 129 358 359
+CONECT 129 128 130 360 361
+CONECT 130 129 131 362 363
+CONECT 131 130 132 364 365
+CONECT 132 131 133 366 367
+CONECT 133 132 134 368 369
+CONECT 134 133 135 370 371
+CONECT 135 134 136 136 372
+CONECT 136 135 135 137 373
+CONECT 137 136 138 374 375
+CONECT 138 137 139 376 377
+CONECT 139 138 140 378 379
+CONECT 140 139 141 380 381
+CONECT 141 140 142 382 383
+CONECT 142 141 174 384 385
+CONECT 143 15 144 144 145
+CONECT 144 143 143
+CONECT 145 143 146 386 387
+CONECT 146 145 147 388 389
+CONECT 147 146 148 390 391
+CONECT 148 147 149 392 393
+CONECT 149 148 150 394 395
+CONECT 150 149 151 396 397
+CONECT 151 150 152 398 399
+CONECT 152 151 153 153 400
+CONECT 153 152 152 154 401
+CONECT 154 153 155 402 403
+CONECT 155 154 156 404 405
+CONECT 156 155 157 406 407
+CONECT 157 156 158 408 409
+CONECT 158 157 159 410 411
+CONECT 159 158 160 412 413
+CONECT 160 159 161 414 415
+CONECT 161 160 416 417 418
+CONECT 162 57 163 419 420
+CONECT 163 162 421 422 423
+CONECT 164 40 165 424 425
+CONECT 165 164 426 427 428
+CONECT 166 91 167 429 430
+CONECT 167 166 431 432 433
+CONECT 168 74 169 434 435
+CONECT 169 168 436 437 438
+CONECT 170 125 171 439 440
+CONECT 171 170 441 442 443
+CONECT 172 108 173 444 445
+CONECT 173 172 446 447 448
+CONECT 174 142 175 449 450
+CONECT 175 174 451 452 453
+CONECT 176 1
+CONECT 177 2
+CONECT 178 3
+CONECT 179 4
+CONECT 180 5
+CONECT 181 9
+CONECT 182 9
+CONECT 183 10
+CONECT 184 12
+CONECT 185 13
+CONECT 186 14
+CONECT 187 14
+CONECT 188 19
+CONECT 189 19
+CONECT 190 26
+CONECT 191 26
+CONECT 192 27
+CONECT 193 27
+CONECT 194 28
+CONECT 195 28
+CONECT 196 29
+CONECT 197 29
+CONECT 198 30
+CONECT 199 30
+CONECT 200 31
+CONECT 201 31
+CONECT 202 32
+CONECT 203 32
+CONECT 204 33
+CONECT 205 34
+CONECT 206 35
+CONECT 207 35
+CONECT 208 36
+CONECT 209 36
+CONECT 210 37
+CONECT 211 37
+CONECT 212 38
+CONECT 213 38
+CONECT 214 39
+CONECT 215 39
+CONECT 216 40
+CONECT 217 40
+CONECT 218 43
+CONECT 219 43
+CONECT 220 44
+CONECT 221 44
+CONECT 222 45
+CONECT 223 45
+CONECT 224 46
+CONECT 225 46
+CONECT 226 47
+CONECT 227 47
+CONECT 228 48
+CONECT 229 48
+CONECT 230 49
+CONECT 231 49
+CONECT 232 50
+CONECT 233 51
+CONECT 234 52
+CONECT 235 52
+CONECT 236 53
+CONECT 237 53
+CONECT 238 54
+CONECT 239 54
+CONECT 240 55
+CONECT 241 55
+CONECT 242 56
+CONECT 243 56
+CONECT 244 57
+CONECT 245 57
+CONECT 246 60
+CONECT 247 60
+CONECT 248 61
+CONECT 249 61
+CONECT 250 62
+CONECT 251 62
+CONECT 252 63
+CONECT 253 63
+CONECT 254 64
+CONECT 255 64
+CONECT 256 65
+CONECT 257 65
+CONECT 258 66
+CONECT 259 66
+CONECT 260 67
+CONECT 261 68
+CONECT 262 69
+CONECT 263 69
+CONECT 264 70
+CONECT 265 70
+CONECT 266 71
+CONECT 267 71
+CONECT 268 72
+CONECT 269 72
+CONECT 270 73
+CONECT 271 73
+CONECT 272 74
+CONECT 273 74
+CONECT 274 77
+CONECT 275 77
+CONECT 276 78
+CONECT 277 78
+CONECT 278 79
+CONECT 279 79
+CONECT 280 80
+CONECT 281 80
+CONECT 282 81
+CONECT 283 81
+CONECT 284 82
+CONECT 285 82
+CONECT 286 83
+CONECT 287 83
+CONECT 288 84
+CONECT 289 85
+CONECT 290 86
+CONECT 291 86
+CONECT 292 87
+CONECT 293 87
+CONECT 294 88
+CONECT 295 88
+CONECT 296 89
+CONECT 297 89
+CONECT 298 90
+CONECT 299 90
+CONECT 300 91
+CONECT 301 91
+CONECT 302 94
+CONECT 303 94
+CONECT 304 95
+CONECT 305 95
+CONECT 306 96
+CONECT 307 96
+CONECT 308 97
+CONECT 309 97
+CONECT 310 98
+CONECT 311 98
+CONECT 312 99
+CONECT 313 99
+CONECT 314 100
+CONECT 315 100
+CONECT 316 101
+CONECT 317 102
+CONECT 318 103
+CONECT 319 103
+CONECT 320 104
+CONECT 321 104
+CONECT 322 105
+CONECT 323 105
+CONECT 324 106
+CONECT 325 106
+CONECT 326 107
+CONECT 327 107
+CONECT 328 108
+CONECT 329 108
+CONECT 330 111
+CONECT 331 111
+CONECT 332 112
+CONECT 333 112
+CONECT 334 113
+CONECT 335 113
+CONECT 336 114
+CONECT 337 114
+CONECT 338 115
+CONECT 339 115
+CONECT 340 116
+CONECT 341 116
+CONECT 342 117
+CONECT 343 117
+CONECT 344 118
+CONECT 345 119
+CONECT 346 120
+CONECT 347 120
+CONECT 348 121
+CONECT 349 121
+CONECT 350 122
+CONECT 351 122
+CONECT 352 123
+CONECT 353 123
+CONECT 354 124
+CONECT 355 124
+CONECT 356 125
+CONECT 357 125
+CONECT 358 128
+CONECT 359 128
+CONECT 360 129
+CONECT 361 129
+CONECT 362 130
+CONECT 363 130
+CONECT 364 131
+CONECT 365 131
+CONECT 366 132
+CONECT 367 132
+CONECT 368 133
+CONECT 369 133
+CONECT 370 134
+CONECT 371 134
+CONECT 372 135
+CONECT 373 136
+CONECT 374 137
+CONECT 375 137
+CONECT 376 138
+CONECT 377 138
+CONECT 378 139
+CONECT 379 139
+CONECT 380 140
+CONECT 381 140
+CONECT 382 141
+CONECT 383 141
+CONECT 384 142
+CONECT 385 142
+CONECT 386 145
+CONECT 387 145
+CONECT 388 146
+CONECT 389 146
+CONECT 390 147
+CONECT 391 147
+CONECT 392 148
+CONECT 393 148
+CONECT 394 149
+CONECT 395 149
+CONECT 396 150
+CONECT 397 150
+CONECT 398 151
+CONECT 399 151
+CONECT 400 152
+CONECT 401 153
+CONECT 402 154
+CONECT 403 154
+CONECT 404 155
+CONECT 405 155
+CONECT 406 156
+CONECT 407 156
+CONECT 408 157
+CONECT 409 157
+CONECT 410 158
+CONECT 411 158
+CONECT 412 159
+CONECT 413 159
+CONECT 414 160
+CONECT 415 160
+CONECT 416 161
+CONECT 417 161
+CONECT 418 161
+CONECT 419 162
+CONECT 420 162
+CONECT 421 163
+CONECT 422 163
+CONECT 423 163
+CONECT 424 164
+CONECT 425 164
+CONECT 426 165
+CONECT 427 165
+CONECT 428 165
+CONECT 429 166
+CONECT 430 166
+CONECT 431 167
+CONECT 432 167
+CONECT 433 167
+CONECT 434 168
+CONECT 435 168
+CONECT 436 169
+CONECT 437 169
+CONECT 438 169
+CONECT 439 170
+CONECT 440 170
+CONECT 441 171
+CONECT 442 171
+CONECT 443 171
+CONECT 444 172
+CONECT 445 172
+CONECT 446 173
+CONECT 447 173
+CONECT 448 173
+CONECT 449 174
+CONECT 450 174
+CONECT 451 175
+CONECT 452 175
+CONECT 453 175
+MASTER 0 0 0 0 0 0 0 0 453 0 453 0
+END
diff --git a/hacks/images/molecules/penicillin.pdb b/hacks/images/molecules/penicillin.pdb
new file mode 100644
index 0000000..54732f5
--- /dev/null
+++ b/hacks/images/molecules/penicillin.pdb
@@ -0,0 +1,89 @@
+HEADER Penicillin G, an antibiotic
+COMPND al3077
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.542 0.000 0.000 1.00 0.00
+HETATM 3 C 1 1.415 1.509 0.000 1.00 0.00
+HETATM 4 O 1 2.209 2.398 -0.083 1.00 0.00
+HETATM 5 N 1 0.066 1.475 0.061 1.00 0.00
+HETATM 6 N 1 2.125 -0.528 1.243 1.00 0.00
+HETATM 7 C 1 2.235 -1.858 1.457 1.00 0.00
+HETATM 8 O 1 2.669 -2.251 2.509 1.00 0.00
+HETATM 9 C 1 1.827 -2.860 0.414 1.00 0.00
+HETATM 10 C 1 1.446 -4.153 1.098 1.00 0.00
+HETATM 11 C 1 0.143 -4.328 1.578 1.00 0.00
+HETATM 12 C 1 -0.216 -5.521 2.214 1.00 0.00
+HETATM 13 C 1 0.729 -6.540 2.373 1.00 0.00
+HETATM 14 C 1 2.034 -6.363 1.902 1.00 0.00
+HETATM 15 C 1 2.393 -5.168 1.268 1.00 0.00
+HETATM 16 S 1 -0.818 -0.450 1.519 1.00 0.00
+HETATM 17 C 1 -1.605 1.127 1.810 1.00 0.00
+HETATM 18 C 1 -1.800 1.394 3.317 1.00 0.00
+HETATM 19 C 1 -2.966 1.138 1.082 1.00 0.00
+HETATM 20 C 1 -0.629 2.147 1.173 1.00 0.00
+HETATM 21 C 1 -1.351 3.368 0.682 1.00 0.00
+HETATM 22 O 1 -1.537 3.505 -0.499 1.00 0.00
+HETATM 23 O 1 -2.048 4.114 1.557 1.00 0.00
+HETATM 24 H 1 -0.466 -0.363 -0.916 1.00 0.00
+HETATM 25 H 1 1.982 -0.387 -0.919 1.00 0.00
+HETATM 26 H 1 2.409 0.115 1.973 1.00 0.00
+HETATM 27 H 1 2.660 -3.033 -0.268 1.00 0.00
+HETATM 28 H 1 0.971 -2.493 -0.151 1.00 0.00
+HETATM 29 H 1 -0.596 -3.536 1.454 1.00 0.00
+HETATM 30 H 1 -1.232 -5.657 2.584 1.00 0.00
+HETATM 31 H 1 0.449 -7.470 2.868 1.00 0.00
+HETATM 32 H 1 2.772 -7.155 2.030 1.00 0.00
+HETATM 33 H 1 3.412 -5.032 0.906 1.00 0.00
+HETATM 34 H 1 -0.839 1.345 3.829 1.00 0.00
+HETATM 35 H 1 -2.470 0.644 3.739 1.00 0.00
+HETATM 36 H 1 -2.233 2.384 3.459 1.00 0.00
+HETATM 37 H 1 -3.586 0.322 1.454 1.00 0.00
+HETATM 38 H 1 -2.811 1.012 0.010 1.00 0.00
+HETATM 39 H 1 -3.480 2.082 1.263 1.00 0.00
+HETATM 40 H 1 0.108 2.446 1.919 1.00 0.00
+HETATM 41 H 1 -2.798 4.548 1.098 1.00 0.00
+CONECT 1 2 5 16 24
+CONECT 2 1 3 6 25
+CONECT 3 2 4 4 5
+CONECT 4 3 3
+CONECT 5 1 3 20
+CONECT 6 2 7 26
+CONECT 7 6 8 8 9
+CONECT 8 7 7
+CONECT 9 7 10 27 28
+CONECT 10 9 11 11 15
+CONECT 11 10 10 12 29
+CONECT 12 11 13 13 30
+CONECT 13 12 12 14 31
+CONECT 14 13 15 15 32
+CONECT 15 10 14 14 33
+CONECT 16 1 17
+CONECT 17 16 18 19 20
+CONECT 18 17 34 35 36
+CONECT 19 17 37 38 39
+CONECT 20 5 17 21 40
+CONECT 21 20 22 22 23
+CONECT 22 21 21
+CONECT 23 21 41
+CONECT 24 1
+CONECT 25 2
+CONECT 26 6
+CONECT 27 9
+CONECT 28 9
+CONECT 29 11
+CONECT 30 12
+CONECT 31 13
+CONECT 32 14
+CONECT 33 15
+CONECT 34 18
+CONECT 35 18
+CONECT 36 18
+CONECT 37 19
+CONECT 38 19
+CONECT 39 19
+CONECT 40 20
+CONECT 41 23
+MASTER 0 0 0 0 0 0 0 0 41 0 41 0
+END
diff --git a/hacks/images/molecules/salvinorin.pdb b/hacks/images/molecules/salvinorin.pdb
new file mode 100644
index 0000000..6ac445b
--- /dev/null
+++ b/hacks/images/molecules/salvinorin.pdb
@@ -0,0 +1,92 @@
+HEADER Salvinorin A: A dissociative hallucinogen, kappa opioid receptor agonist
+ATOM 1 O 0 -1.578 3.509 1.054 0.00 0.00 O+0
+ATOM 2 O 0 -0.661 -3.341 -1.950 0.00 0.00 O+0
+ATOM 3 O 0 -0.961 -0.736 -2.292 0.00 0.00 O+0
+ATOM 4 O 0 0.223 4.284 1.789 0.00 0.00 O+0
+ATOM 5 O 0 4.133 -2.520 1.067 0.00 0.00 O+0
+ATOM 6 O 0 4.305 -2.225 -1.047 0.00 0.00 O+0
+ATOM 7 O 0 -5.473 1.972 2.519 0.00 0.00 O+0
+ATOM 8 O 0 -1.864 -4.598 -3.067 0.00 0.00 O+0
+ATOM 9 C 0 1.875 -0.263 -0.355 0.00 0.00 C+0
+ATOM 10 C 0 -0.335 1.379 -0.322 0.00 0.00 C+0
+ATOM 11 C 0 0.290 -0.090 -0.402 0.00 0.00 C+0
+ATOM 12 C 0 0.295 2.080 0.949 0.00 0.00 C+0
+ATOM 13 C 0 2.416 0.613 0.838 0.00 0.00 C+0
+ATOM 14 C 0 2.218 -1.798 -0.082 0.00 0.00 C+0
+ATOM 15 C 0 1.854 2.057 0.955 0.00 0.00 C+0
+ATOM 16 C 0 -1.892 1.349 -0.054 0.00 0.00 C+0
+ATOM 17 C 0 -0.312 -1.076 -1.312 0.00 0.00 C+0
+ATOM 18 C 0 1.427 -2.783 -1.008 0.00 0.00 C+0
+ATOM 19 C 0 2.599 0.182 -1.678 0.00 0.00 C+0
+ATOM 20 C 0 -0.152 2.242 -1.623 0.00 0.00 C+0
+ATOM 21 C 0 -0.102 -2.502 -1.056 0.00 0.00 C+0
+ATOM 22 C 0 -2.483 2.720 0.438 0.00 0.00 C+0
+ATOM 23 C 0 -0.364 3.344 1.274 0.00 0.00 C+0
+ATOM 24 C 0 3.632 -2.188 -0.023 0.00 0.00 C+0
+ATOM 25 C 0 -3.721 2.668 1.259 0.00 0.00 C+0
+ATOM 26 C 0 -4.516 3.764 1.594 0.00 0.00 C+0
+ATOM 27 C 0 -4.363 1.580 1.857 0.00 0.00 C+0
+ATOM 28 C 0 -1.768 -3.894 -2.073 0.00 0.00 C+0
+ATOM 29 C 0 5.353 -2.949 1.401 0.00 0.00 C+0
+ATOM 30 C 0 -5.577 3.309 2.365 0.00 0.00 C+0
+ATOM 31 C 0 -2.903 -3.782 -1.178 0.00 0.00 C+0
+ATOM 32 H 0 -0.032 -0.494 0.566 0.00 0.00 H+0
+ATOM 33 H 0 0.021 1.488 1.831 0.00 0.00 H+0
+ATOM 34 H 0 2.176 0.125 1.788 0.00 0.00 H+0
+ATOM 35 H 0 3.509 0.668 0.818 0.00 0.00 H+0
+ATOM 36 H 0 1.806 -2.023 0.910 0.00 0.00 H+0
+ATOM 37 H 0 2.250 2.682 0.154 0.00 0.00 H+0
+ATOM 38 H 0 2.226 2.485 1.891 0.00 0.00 H+0
+ATOM 39 H 0 -2.454 1.020 -0.933 0.00 0.00 H+0
+ATOM 40 H 0 -2.074 0.590 0.706 0.00 0.00 H+0
+ATOM 41 H 0 1.574 -3.811 -0.660 0.00 0.00 H+0
+ATOM 42 H 0 1.827 -2.744 -2.026 0.00 0.00 H+0
+ATOM 43 H 0 2.260 -0.386 -2.545 0.00 0.00 H+0
+ATOM 44 H 0 2.509 1.228 -1.923 0.00 0.00 H+0
+ATOM 45 H 0 3.681 0.081 -1.611 0.00 0.00 H+0
+ATOM 46 H 0 -0.558 1.749 -2.507 0.00 0.00 H+0
+ATOM 47 H 0 -0.638 3.215 -1.562 0.00 0.00 H+0
+ATOM 48 H 0 0.868 2.520 -1.836 0.00 0.00 H+0
+ATOM 49 H 0 -0.497 -2.735 -0.061 0.00 0.00 H+0
+ATOM 50 H 0 -2.764 3.279 -0.460 0.00 0.00 H+0
+ATOM 51 H 0 -4.357 4.736 1.321 0.00 0.00 H+0
+ATOM 52 H 0 -4.064 0.605 1.821 0.00 0.00 H+0
+ATOM 53 H 0 5.360 -3.151 2.472 0.00 0.00 H+0
+ATOM 54 H 0 6.112 -2.193 1.186 0.00 0.00 H+0
+ATOM 55 H 0 5.605 -3.873 0.875 0.00 0.00 H+0
+ATOM 56 H 0 -6.323 3.886 2.756 0.00 0.00 H+0
+ATOM 57 H 0 -3.222 -2.742 -1.105 0.00 0.00 H+0
+ATOM 58 H 0 -2.636 -4.143 -0.184 0.00 0.00 H+0
+ATOM 59 H 0 -3.759 -4.370 -1.521 0.00 0.00 H+0
+CONECT 1 22 23 0 0 NONE 65
+CONECT 2 21 28 0 0 NONE 66
+CONECT 3 17 0 0 0 NONE 67
+CONECT 4 23 0 0 0 NONE 68
+CONECT 5 24 29 0 0 NONE 69
+CONECT 6 24 0 0 0 NONE 70
+CONECT 7 27 30 0 0 NONE 71
+CONECT 8 28 0 0 0 NONE 72
+CONECT 9 11 13 14 19 NONE 73
+CONECT 10 11 12 16 20 NONE 74
+CONECT 11 9 10 17 32 NONE 75
+CONECT 12 10 15 23 33 NONE 76
+CONECT 13 9 15 34 35 NONE 77
+CONECT 14 9 18 24 36 NONE 78
+CONECT 15 12 13 37 38 NONE 79
+CONECT 16 10 22 39 40 NONE 80
+CONECT 17 3 11 21 0 NONE 81
+CONECT 18 14 21 41 42 NONE 82
+CONECT 19 9 43 44 45 NONE 83
+CONECT 20 10 46 47 48 NONE 84
+CONECT 21 2 17 18 49 NONE 85
+CONECT 22 1 16 25 50 NONE 86
+CONECT 23 1 4 12 0 NONE 87
+CONECT 24 5 6 14 0 NONE 88
+CONECT 25 22 26 27 0 NONE 89
+CONECT 26 25 30 51 0 NONE 90
+CONECT 27 7 25 52 0 NONE 91
+CONECT 28 2 8 31 0 NONE 92
+CONECT 29 5 53 54 55 NONE 93
+CONECT 30 7 26 56 0 NONE 94
+CONECT 31 28 57 58 59 NONE 95
+END NONE 96
diff --git a/hacks/images/molecules/sarin.pdb b/hacks/images/molecules/sarin.pdb
new file mode 100644
index 0000000..ae03028
--- /dev/null
+++ b/hacks/images/molecules/sarin.pdb
@@ -0,0 +1,43 @@
+HEADER Sarin: S Enantiomer, a chemical warfare agent
+COMPND al3023
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 P 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 F 1 1.779 0.000 0.000 1.00 0.00
+HETATM 3 C 1 -0.611 1.725 0.000 1.00 0.00
+HETATM 4 O 1 -0.599 -0.840 1.463 1.00 0.00
+HETATM 5 O 1 -0.599 -0.841 -1.466 1.00 0.00
+HETATM 6 C 1 -1.898 -1.369 -1.304 1.00 0.00
+HETATM 7 C 1 -1.817 -2.772 -0.672 1.00 0.00
+HETATM 8 C 1 -2.555 -1.476 -2.694 1.00 0.00
+HETATM 9 H 1 -0.248 2.240 -0.890 1.00 0.00
+HETATM 10 H 1 -0.248 2.239 0.891 1.00 0.00
+HETATM 11 H 1 -1.701 1.724 0.000 1.00 0.00
+HETATM 12 H 1 -2.510 -0.718 -0.679 1.00 0.00
+HETATM 13 H 1 -1.372 -2.712 0.320 1.00 0.00
+HETATM 14 H 1 -1.203 -3.414 -1.303 1.00 0.00
+HETATM 15 H 1 -2.818 -3.194 -0.591 1.00 0.00
+HETATM 16 H 1 -1.961 -2.124 -3.339 1.00 0.00
+HETATM 17 H 1 -3.561 -1.885 -2.595 1.00 0.00
+HETATM 18 H 1 -2.613 -0.482 -3.136 1.00 0.00
+CONECT 1 2 3 4 4 5
+CONECT 2 1
+CONECT 3 1 9 10 11
+CONECT 4 1 1
+CONECT 5 1 6
+CONECT 6 5 7 8 12
+CONECT 7 6 13 14 15
+CONECT 8 6 16 17 18
+CONECT 9 3
+CONECT 10 3
+CONECT 11 3
+CONECT 12 6
+CONECT 13 7
+CONECT 14 7
+CONECT 15 7
+CONECT 16 8
+CONECT 17 8
+CONECT 18 8
+MASTER 0 0 0 0 0 0 0 0 18 0 18 0
+END
diff --git a/hacks/images/molecules/strychnine.pdb b/hacks/images/molecules/strychnine.pdb
new file mode 100644
index 0000000..ecb0762
--- /dev/null
+++ b/hacks/images/molecules/strychnine.pdb
@@ -0,0 +1,101 @@
+HEADER Strychnine: Nux Vomica
+COMPND al3061
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Wed Aug 30 12:33:12 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.395 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.124 1.193 0.000 1.00 0.00
+HETATM 4 C 1 1.414 2.398 -0.067 1.00 0.00
+HETATM 5 C 1 0.014 2.401 -0.115 1.00 0.00
+HETATM 6 C 1 -0.709 1.203 -0.087 1.00 0.00
+HETATM 7 C 1 1.911 -1.410 0.160 1.00 0.00
+HETATM 8 N 1 -0.471 -1.291 -0.057 1.00 0.00
+HETATM 9 C 1 -1.720 -1.604 -0.472 1.00 0.00
+HETATM 10 O 1 -2.589 -0.778 -0.359 1.00 0.00
+HETATM 11 C 1 0.645 -2.239 -0.189 1.00 0.00
+HETATM 12 C 1 -1.941 -2.698 -1.483 1.00 0.00
+HETATM 13 C 1 -0.687 -3.549 -1.797 1.00 0.00
+HETATM 14 H 1 0.525 -3.093 0.477 1.00 0.00
+HETATM 15 C 1 0.573 -2.674 -1.656 1.00 0.00
+HETATM 16 H 1 -0.775 -3.908 -2.822 1.00 0.00
+HETATM 17 O 1 -0.654 -4.641 -0.904 1.00 0.00
+HETATM 18 C 1 0.221 -5.671 -1.313 1.00 0.00
+HETATM 19 C 1 1.595 -5.446 -0.726 1.00 0.00
+HETATM 20 C 1 2.356 -4.403 -1.088 1.00 0.00
+HETATM 21 C 1 3.723 -4.222 -0.464 1.00 0.00
+HETATM 22 C 1 1.893 -3.351 -2.072 1.00 0.00
+HETATM 23 H 1 0.431 -1.791 -2.279 1.00 0.00
+HETATM 24 H 1 1.803 -3.769 -3.074 1.00 0.00
+HETATM 25 C 1 2.942 -2.222 -2.062 1.00 0.00
+HETATM 26 C 1 3.199 -1.816 -0.595 1.00 0.00
+HETATM 27 C 1 2.322 -1.641 1.618 1.00 0.00
+HETATM 28 C 1 3.109 -2.956 1.512 1.00 0.00
+HETATM 29 N 1 3.783 -2.911 0.202 1.00 0.00
+HETATM 30 H 1 3.212 1.188 0.059 1.00 0.00
+HETATM 31 H 1 1.957 3.343 -0.078 1.00 0.00
+HETATM 32 H 1 -0.520 3.349 -0.172 1.00 0.00
+HETATM 33 H 1 -1.798 1.219 -0.127 1.00 0.00
+HETATM 34 H 1 -2.263 -2.218 -2.408 1.00 0.00
+HETATM 35 H 1 -2.740 -3.355 -1.139 1.00 0.00
+HETATM 36 H 1 0.290 -5.733 -2.400 1.00 0.00
+HETATM 37 H 1 -0.163 -6.618 -0.935 1.00 0.00
+HETATM 38 H 1 1.974 -6.159 0.006 1.00 0.00
+HETATM 39 H 1 4.483 -4.272 -1.243 1.00 0.00
+HETATM 40 H 1 3.923 -5.012 0.260 1.00 0.00
+HETATM 41 H 1 2.578 -1.363 -2.625 1.00 0.00
+HETATM 42 H 1 3.871 -2.566 -2.519 1.00 0.00
+HETATM 43 H 1 3.898 -0.980 -0.573 1.00 0.00
+HETATM 44 H 1 1.464 -1.724 2.285 1.00 0.00
+HETATM 45 H 1 2.987 -0.840 1.943 1.00 0.00
+HETATM 46 H 1 2.413 -3.794 1.551 1.00 0.00
+HETATM 47 H 1 3.833 -3.042 2.322 1.00 0.00
+CONECT 1 2 2 6 8
+CONECT 2 1 1 3 7
+CONECT 3 2 4 4 30
+CONECT 4 3 3 5 31
+CONECT 5 4 6 6 32
+CONECT 6 1 5 5 33
+CONECT 7 2 11 26 27
+CONECT 8 1 9 11
+CONECT 9 8 10 10 12
+CONECT 10 9 9
+CONECT 11 7 8 14 15
+CONECT 12 9 13 34 35
+CONECT 13 12 15 16 17
+CONECT 14 11
+CONECT 15 11 13 22 23
+CONECT 16 13
+CONECT 17 13 18
+CONECT 18 17 19 36 37
+CONECT 19 18 20 20 38
+CONECT 20 19 19 21 22
+CONECT 21 20 29 39 40
+CONECT 22 15 20 24 25
+CONECT 23 15
+CONECT 24 22
+CONECT 25 22 26 41 42
+CONECT 26 7 25 29 43
+CONECT 27 7 28 44 45
+CONECT 28 27 29 46 47
+CONECT 29 21 26 28
+CONECT 30 3
+CONECT 31 4
+CONECT 32 5
+CONECT 33 6
+CONECT 34 12
+CONECT 35 12
+CONECT 36 18
+CONECT 37 18
+CONECT 38 19
+CONECT 39 21
+CONECT 40 21
+CONECT 41 25
+CONECT 42 25
+CONECT 43 26
+CONECT 44 27
+CONECT 45 27
+CONECT 46 28
+CONECT 47 28
+MASTER 0 0 0 0 0 0 0 0 47 0 47 0
+END
diff --git a/hacks/images/molecules/sucrose.pdb b/hacks/images/molecules/sucrose.pdb
new file mode 100644
index 0000000..2a75f22
--- /dev/null
+++ b/hacks/images/molecules/sucrose.pdb
@@ -0,0 +1,97 @@
+HEADER Sucrose: Sugar
+COMPND nat0013
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.542 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.041 1.457 0.000 1.00 0.00
+HETATM 4 C 1 1.414 2.181 1.207 1.00 0.00
+HETATM 5 C 1 -0.117 2.034 1.128 1.00 0.00
+HETATM 6 O 1 -0.472 0.668 1.149 1.00 0.00
+HETATM 7 H 1 -0.566 2.548 1.978 1.00 0.00
+HETATM 8 O 1 -0.572 2.607 -0.076 1.00 0.00
+HETATM 9 C 1 -1.867 3.149 -0.193 1.00 0.00
+HETATM 10 C 1 -1.993 3.815 -1.579 1.00 0.00
+HETATM 11 C 1 -2.960 2.084 -0.002 1.00 0.00
+HETATM 12 O 1 -2.117 4.104 0.816 1.00 0.00
+HETATM 13 C 1 -3.516 4.220 0.978 1.00 0.00
+HETATM 14 C 1 -4.167 2.959 0.369 1.00 0.00
+HETATM 15 H 1 -0.368 0.500 -0.896 1.00 0.00
+HETATM 16 H 1 1.901 -0.501 0.899 1.00 0.00
+HETATM 17 H 1 1.728 1.949 -0.923 1.00 0.00
+HETATM 18 H 1 1.774 1.726 2.130 1.00 0.00
+HETATM 19 H 1 -1.836 3.065 -2.355 1.00 0.00
+HETATM 20 H 1 -2.981 4.259 -1.698 1.00 0.00
+HETATM 21 H 1 -3.133 1.511 -0.914 1.00 0.00
+HETATM 22 H 1 -3.871 5.100 0.441 1.00 0.00
+HETATM 23 H 1 -4.821 2.452 1.081 1.00 0.00
+HETATM 24 C 1 -3.859 4.364 2.474 1.00 0.00
+HETATM 25 O 1 -5.279 4.442 2.639 1.00 0.00
+HETATM 26 O 1 -4.897 3.325 -0.807 1.00 0.00
+HETATM 27 O 1 -2.638 1.202 1.079 1.00 0.00
+HETATM 28 O 1 -0.995 4.834 -1.694 1.00 0.00
+HETATM 29 C 1 -0.513 -1.453 0.003 1.00 0.00
+HETATM 30 O 1 -1.944 -1.459 -0.055 1.00 0.00
+HETATM 31 O 1 2.039 -0.690 -1.152 1.00 0.00
+HETATM 32 O 1 3.468 1.480 0.101 1.00 0.00
+HETATM 33 O 1 1.772 3.567 1.189 1.00 0.00
+HETATM 34 H 1 -3.396 5.270 2.866 1.00 0.00
+HETATM 35 H 1 -3.480 3.504 3.024 1.00 0.00
+HETATM 36 H 1 -5.622 5.216 2.180 1.00 0.00
+HETATM 37 H 1 -5.302 2.544 -1.199 1.00 0.00
+HETATM 38 H 1 -2.661 1.671 1.919 1.00 0.00
+HETATM 39 H 1 -1.056 5.255 -2.558 1.00 0.00
+HETATM 40 H 1 -0.180 -1.958 0.910 1.00 0.00
+HETATM 41 H 1 -0.118 -1.977 -0.868 1.00 0.00
+HETATM 42 H 1 -2.305 -1.058 0.741 1.00 0.00
+HETATM 43 H 1 1.728 -0.261 -1.956 1.00 0.00
+HETATM 44 H 1 3.781 2.391 0.099 1.00 0.00
+HETATM 45 H 1 1.428 3.987 0.394 1.00 0.00
+CONECT 1 2 6 15 29
+CONECT 2 1 3 16 31
+CONECT 3 2 4 17 32
+CONECT 4 3 5 18 33
+CONECT 5 4 6 7 8
+CONECT 6 1 5
+CONECT 7 5
+CONECT 8 5 9
+CONECT 9 8 10 11 12
+CONECT 10 9 19 20 28
+CONECT 11 9 14 21 27
+CONECT 12 9 13
+CONECT 13 12 14 22 24
+CONECT 14 11 13 23 26
+CONECT 15 1
+CONECT 16 2
+CONECT 17 3
+CONECT 18 4
+CONECT 19 10
+CONECT 20 10
+CONECT 21 11
+CONECT 22 13
+CONECT 23 14
+CONECT 24 13 25 34 35
+CONECT 25 24 36
+CONECT 26 14 37
+CONECT 27 11 38
+CONECT 28 10 39
+CONECT 29 1 30 40 41
+CONECT 30 29 42
+CONECT 31 2 43
+CONECT 32 3 44
+CONECT 33 4 45
+CONECT 34 24
+CONECT 35 24
+CONECT 36 25
+CONECT 37 26
+CONECT 38 27
+CONECT 39 28
+CONECT 40 29
+CONECT 41 29
+CONECT 42 30
+CONECT 43 31
+CONECT 44 32
+CONECT 45 33
+MASTER 0 0 0 0 0 0 0 0 45 0 45 0
+END
diff --git a/hacks/images/molecules/thalidomide.pdb b/hacks/images/molecules/thalidomide.pdb
new file mode 100644
index 0000000..f3edb72
--- /dev/null
+++ b/hacks/images/molecules/thalidomide.pdb
@@ -0,0 +1,65 @@
+HEADER (S)-Thalidomide, a teratogenic enantiomer
+COMPND jb03stha
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Mon Sep 18 15:35:27 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.402 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.128 1.197 0.000 1.00 0.00
+HETATM 4 C 1 1.396 2.389 -0.011 1.00 0.00
+HETATM 5 C 1 0.003 2.388 -0.010 1.00 0.00
+HETATM 6 C 1 -0.728 1.196 0.001 1.00 0.00
+HETATM 7 C 1 -0.415 3.783 0.056 1.00 0.00
+HETATM 8 O 1 -1.550 4.177 0.150 1.00 0.00
+HETATM 9 N 1 0.698 4.553 0.096 1.00 0.00
+HETATM 10 C 1 1.812 3.785 0.053 1.00 0.00
+HETATM 11 O 1 2.946 4.181 0.146 1.00 0.00
+HETATM 12 C 1 0.702 6.005 0.319 1.00 0.00
+HETATM 13 C 1 1.020 6.278 1.801 1.00 0.00
+HETATM 14 C 1 1.130 7.799 2.000 1.00 0.00
+HETATM 15 C 1 2.180 8.336 1.068 1.00 0.00
+HETATM 16 O 1 2.814 9.307 1.391 1.00 0.00
+HETATM 17 N 1 2.428 7.747 -0.124 1.00 0.00
+HETATM 18 C 1 1.757 6.647 -0.538 1.00 0.00
+HETATM 19 O 1 2.022 6.158 -1.607 1.00 0.00
+HETATM 20 H 1 -0.535 -0.949 0.010 1.00 0.00
+HETATM 21 H 1 1.938 -0.949 0.010 1.00 0.00
+HETATM 22 H 1 3.217 1.203 0.020 1.00 0.00
+HETATM 23 H 1 -1.817 1.201 0.022 1.00 0.00
+HETATM 24 H 1 -0.272 6.423 0.067 1.00 0.00
+HETATM 25 H 1 1.968 5.808 2.060 1.00 0.00
+HETATM 26 H 1 0.228 5.873 2.432 1.00 0.00
+HETATM 27 H 1 1.408 8.016 3.031 1.00 0.00
+HETATM 28 H 1 0.173 8.268 1.775 1.00 0.00
+HETATM 29 H 1 3.142 8.141 -0.727 1.00 0.00
+CONECT 1 2 2 6 20
+CONECT 2 1 1 3 21
+CONECT 3 2 4 4 22
+CONECT 4 3 3 5 10
+CONECT 5 4 6 6 7
+CONECT 6 1 5 5 23
+CONECT 7 5 8 8 9
+CONECT 8 7 7
+CONECT 9 7 10 12
+CONECT 10 4 9 11 11
+CONECT 11 10 10
+CONECT 12 9 13 18 24
+CONECT 13 12 14 25 26
+CONECT 14 13 15 27 28
+CONECT 15 14 16 16 17
+CONECT 16 15 15
+CONECT 17 15 18 29
+CONECT 18 12 17 19 19
+CONECT 19 18 18
+CONECT 20 1
+CONECT 21 2
+CONECT 22 3
+CONECT 23 6
+CONECT 24 12
+CONECT 25 13
+CONECT 26 13
+CONECT 27 14
+CONECT 28 14
+CONECT 29 17
+MASTER 0 0 0 0 0 0 0 0 29 0 29 0
+END
diff --git a/hacks/images/molecules/thymine.pdb b/hacks/images/molecules/thymine.pdb
new file mode 100644
index 0000000..b58f8a6
--- /dev/null
+++ b/hacks/images/molecules/thymine.pdb
@@ -0,0 +1,37 @@
+HEADER Thymine: Pyrimidine base nucleotide
+COMPND jb09thye
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Tue Sep 19 21:46:02 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.399 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.068 1.228 0.000 1.00 0.00
+HETATM 4 N 1 1.356 2.377 -0.004 1.00 0.00
+HETATM 5 C 1 0.004 2.350 -0.006 1.00 0.00
+HETATM 6 N 1 -0.667 1.176 -0.004 1.00 0.00
+HETATM 7 O 1 -0.611 3.385 -0.006 1.00 0.00
+HETATM 8 O 1 3.272 1.261 0.006 1.00 0.00
+HETATM 9 C 1 2.173 -1.300 0.014 1.00 0.00
+HETATM 10 H 1 -0.549 -0.941 0.006 1.00 0.00
+HETATM 11 H 1 1.840 3.268 -0.003 1.00 0.00
+HETATM 12 H 1 -1.681 1.178 -0.004 1.00 0.00
+HETATM 13 H 1 1.632 -2.055 -0.555 1.00 0.00
+HETATM 14 H 1 2.293 -1.638 1.044 1.00 0.00
+HETATM 15 H 1 3.155 -1.146 -0.433 1.00 0.00
+CONECT 1 2 2 6 10
+CONECT 2 1 1 3 9
+CONECT 3 2 4 8 8
+CONECT 4 3 5 11
+CONECT 5 4 6 7 7
+CONECT 6 1 5 12
+CONECT 7 5 5
+CONECT 8 3 3
+CONECT 9 2 13 14 15
+CONECT 10 1
+CONECT 11 4
+CONECT 12 6
+CONECT 13 9
+CONECT 14 9
+CONECT 15 9
+MASTER 0 0 0 0 0 0 0 0 15 0 15 0
+END
diff --git a/hacks/images/molecules/viagra.pdb b/hacks/images/molecules/viagra.pdb
new file mode 100644
index 0000000..243a038
--- /dev/null
+++ b/hacks/images/molecules/viagra.pdb
@@ -0,0 +1,133 @@
+COMPND Viagra
+AUTHOR Created by Dave Woodcock at Okanagan University College
+REMARK from a model provided by Dr Eric Walters
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Mon Oct 16 12:17:54 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.398 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.105 1.207 0.000 1.00 0.00
+HETATM 4 C 1 1.417 2.427 -0.037 1.00 0.00
+HETATM 5 C 1 0.017 2.422 -0.014 1.00 0.00
+HETATM 6 C 1 -0.692 1.216 -0.005 1.00 0.00
+HETATM 7 H 1 -0.545 -0.944 0.023 1.00 0.00
+HETATM 8 H 1 1.939 -0.946 0.029 1.00 0.00
+HETATM 9 H 1 -0.531 3.364 -0.022 1.00 0.00
+HETATM 10 C 1 2.100 3.733 -0.053 1.00 0.00
+HETATM 11 N 1 3.453 3.848 -0.302 1.00 0.00
+HETATM 12 C 1 4.091 5.067 -0.302 1.00 0.00
+HETATM 13 C 1 3.259 6.246 -0.033 1.00 0.00
+HETATM 14 C 1 1.897 6.080 0.190 1.00 0.00
+HETATM 15 N 1 1.310 4.840 0.169 1.00 0.00
+HETATM 16 O 1 5.271 5.168 -0.544 1.00 0.00
+HETATM 17 H 1 4.029 2.992 -0.569 1.00 0.00
+HETATM 18 N 1 3.538 7.572 0.006 1.00 0.00
+HETATM 19 N 1 2.406 8.264 0.248 1.00 0.00
+HETATM 20 C 1 1.373 7.363 0.369 1.00 0.00
+HETATM 21 C 1 4.863 8.163 -0.230 1.00 0.00
+HETATM 22 H 1 4.799 9.247 -0.133 1.00 0.00
+HETATM 23 H 1 5.200 7.907 -1.235 1.00 0.00
+HETATM 24 H 1 5.570 7.774 0.501 1.00 0.00
+HETATM 25 C 1 -0.079 7.701 0.624 1.00 0.00
+HETATM 26 C 1 -0.226 9.225 0.805 1.00 0.00
+HETATM 27 H 1 -0.415 7.190 1.526 1.00 0.00
+HETATM 28 H 1 -0.680 7.372 -0.224 1.00 0.00
+HETATM 29 C 1 -1.702 9.584 1.072 1.00 0.00
+HETATM 30 H 1 0.112 9.732 -0.099 1.00 0.00
+HETATM 31 H 1 0.383 9.550 1.649 1.00 0.00
+HETATM 32 H 1 -1.796 10.663 1.198 1.00 0.00
+HETATM 33 H 1 -2.043 9.083 1.978 1.00 0.00
+HETATM 34 H 1 -2.315 9.264 0.229 1.00 0.00
+HETATM 35 O 1 3.461 1.164 0.124 1.00 0.00
+HETATM 36 C 1 3.859 0.886 1.450 1.00 0.00
+HETATM 37 C 1 3.396 1.998 2.414 1.00 0.00
+HETATM 38 H 1 4.947 0.824 1.480 1.00 0.00
+HETATM 39 H 1 3.443 -0.069 1.771 1.00 0.00
+HETATM 40 H 1 3.774 1.788 3.414 1.00 0.00
+HETATM 41 H 1 2.307 2.037 2.446 1.00 0.00
+HETATM 42 H 1 3.786 2.959 2.077 1.00 0.00
+HETATM 43 S 1 -2.443 1.230 0.022 1.00 0.00
+HETATM 44 N 1 -3.045 -0.296 -0.555 1.00 0.00
+HETATM 45 C 1 -4.498 -0.382 -0.345 1.00 0.00
+HETATM 46 C 1 -4.996 -1.765 -0.804 1.00 0.00
+HETATM 47 N 1 -4.674 -1.957 -2.227 1.00 0.00
+HETATM 48 C 1 -3.222 -1.855 -2.442 1.00 0.00
+HETATM 49 C 1 -2.728 -0.471 -1.980 1.00 0.00
+HETATM 50 H 1 -5.005 0.395 -0.919 1.00 0.00
+HETATM 51 H 1 -4.725 -0.254 0.715 1.00 0.00
+HETATM 52 H 1 -6.076 -1.822 -0.662 1.00 0.00
+HETATM 53 H 1 -4.513 -2.539 -0.208 1.00 0.00
+HETATM 54 H 1 -2.998 -1.979 -3.502 1.00 0.00
+HETATM 55 H 1 -2.707 -2.629 -1.872 1.00 0.00
+HETATM 56 H 1 -3.222 0.303 -2.569 1.00 0.00
+HETATM 57 H 1 -1.651 -0.407 -2.135 1.00 0.00
+HETATM 58 O 1 -2.929 2.282 -0.818 1.00 0.00
+HETATM 59 O 1 -2.893 1.442 1.364 1.00 0.00
+HETATM 60 C 1 -5.177 -3.257 -2.700 1.00 0.00
+HETATM 61 H 1 -4.954 -3.372 -3.760 1.00 0.00
+HETATM 62 H 1 -6.257 -3.305 -2.557 1.00 0.00
+HETATM 63 H 1 -4.703 -4.065 -2.142 1.00 0.00
+CONECT 1 2 2 6 7
+CONECT 2 1 1 3 8
+CONECT 3 2 4 4 35
+CONECT 4 3 3 5 10
+CONECT 5 4 6 6 9
+CONECT 6 1 5 5 43
+CONECT 7 1
+CONECT 8 2
+CONECT 9 5
+CONECT 10 4 11 15 15
+CONECT 11 10 12 17
+CONECT 12 11 13 16 16
+CONECT 13 12 14 14 18
+CONECT 14 13 13 15 20
+CONECT 15 10 14 14
+CONECT 16 12 12
+CONECT 17 11
+CONECT 18 13 19 21
+CONECT 19 18 20 20
+CONECT 20 14 19 19 25
+CONECT 21 18 22 23 24
+CONECT 22 21
+CONECT 23 21
+CONECT 24 21
+CONECT 25 20 26 27 28
+CONECT 26 25 29 30 31
+CONECT 27 25
+CONECT 28 25
+CONECT 29 26 32 33 34
+CONECT 30 26
+CONECT 31 26
+CONECT 32 29
+CONECT 33 29
+CONECT 34 29
+CONECT 35 3 36
+CONECT 36 35 37 38 39
+CONECT 37 36 40 41 42
+CONECT 38 36
+CONECT 39 36
+CONECT 40 37
+CONECT 41 37
+CONECT 42 37
+CONECT 43 6 44 58 59
+CONECT 44 43 45 49
+CONECT 45 44 46 50 51
+CONECT 46 45 47 52 53
+CONECT 47 46 48 60
+CONECT 48 47 49 54 55
+CONECT 49 44 48 56 57
+CONECT 50 45
+CONECT 51 45
+CONECT 52 46
+CONECT 53 46
+CONECT 54 48
+CONECT 55 48
+CONECT 56 49
+CONECT 57 49
+CONECT 58 43
+CONECT 59 43
+CONECT 60 47 61 62 63
+CONECT 61 60
+CONECT 62 60
+CONECT 63 60
+MASTER 0 0 0 0 0 0 0 0 63 0 63 0
+END
diff --git a/hacks/images/molecules/vitaminb6.pdb b/hacks/images/molecules/vitaminb6.pdb
new file mode 100644
index 0000000..c21654b
--- /dev/null
+++ b/hacks/images/molecules/vitaminb6.pdb
@@ -0,0 +1,56 @@
+HEADER Pyridoxine: Vitamin B6
+COMPND c8h11no3
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.399 0.000 0.000 1.00 0.00
+HETATM 3 C 1 2.095 1.214 0.000 1.00 0.00
+HETATM 4 C 1 1.381 2.418 0.018 1.00 0.00
+HETATM 5 C 1 -0.018 2.390 0.005 1.00 0.00
+HETATM 6 N 1 -0.688 1.189 -0.006 1.00 0.00
+HETATM 7 C 1 -0.754 -1.311 0.010 1.00 0.00
+HETATM 8 O 1 2.079 -1.180 0.011 1.00 0.00
+HETATM 9 C 1 3.608 1.210 0.001 1.00 0.00
+HETATM 10 O 1 4.077 1.576 1.303 1.00 0.00
+HETATM 11 C 1 2.102 3.747 0.058 1.00 0.00
+HETATM 12 O 1 1.197 4.767 0.493 1.00 0.00
+HETATM 13 H 1 -0.583 3.322 0.008 1.00 0.00
+HETATM 14 H 1 -0.438 -1.905 0.867 1.00 0.00
+HETATM 15 H 1 -0.543 -1.858 -0.909 1.00 0.00
+HETATM 16 H 1 -1.824 -1.114 0.078 1.00 0.00
+HETATM 17 H 1 2.145 -1.522 -0.886 1.00 0.00
+HETATM 18 H 1 3.977 1.922 -0.737 1.00 0.00
+HETATM 19 H 1 3.973 0.214 -0.250 1.00 0.00
+HETATM 20 H 1 5.040 1.579 1.315 1.00 0.00
+HETATM 21 H 1 2.472 3.988 -0.939 1.00 0.00
+HETATM 22 H 1 2.940 3.690 0.753 1.00 0.00
+HETATM 23 H 1 1.650 5.617 0.520 1.00 0.00
+CONECT 1 2 6 7
+CONECT 1 2
+CONECT 2 1 3 8
+CONECT 3 2 4 9
+CONECT 3 4
+CONECT 4 3 5 11
+CONECT 5 4 6 13
+CONECT 5 6
+CONECT 6 1 5
+CONECT 7 1 14 15 16
+CONECT 8 2 17
+CONECT 9 3 10 18 19
+CONECT 10 9 20
+CONECT 11 4 12 21 22
+CONECT 12 11 23
+CONECT 13 5
+CONECT 14 7
+CONECT 15 7
+CONECT 16 7
+CONECT 17 8
+CONECT 18 9
+CONECT 19 9
+CONECT 20 10
+CONECT 21 11
+CONECT 22 11
+CONECT 23 12
+MASTER 0 0 0 0 0 0 0 0 23 0 23 0
+END
diff --git a/hacks/images/molecules/vitaminc.pdb b/hacks/images/molecules/vitaminc.pdb
new file mode 100644
index 0000000..d7a7d6a
--- /dev/null
+++ b/hacks/images/molecules/vitaminc.pdb
@@ -0,0 +1,47 @@
+HEADER Ascorbic Acid: Vitamin C
+COMPND vit-c
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.512 0.000 0.000 1.00 0.00
+HETATM 3 C 1 1.927 1.264 0.000 1.00 0.00
+HETATM 4 C 1 0.730 2.091 0.015 1.00 0.00
+HETATM 5 O 1 -0.382 1.359 0.113 1.00 0.00
+HETATM 6 O 1 0.759 3.270 0.261 1.00 0.00
+HETATM 7 O 1 3.197 1.690 0.245 1.00 0.00
+HETATM 8 O 1 2.283 -1.055 0.386 1.00 0.00
+HETATM 9 H 1 -0.390 -0.463 -0.907 1.00 0.00
+HETATM 10 C 1 -0.565 -0.653 1.264 1.00 0.00
+HETATM 11 H 1 0.050 -1.475 1.629 1.00 0.00
+HETATM 12 O 1 -0.674 0.397 2.229 1.00 0.00
+HETATM 13 C 1 -2.028 -1.077 1.106 1.00 0.00
+HETATM 14 O 1 -2.543 -0.906 2.429 1.00 0.00
+HETATM 15 H 1 3.383 1.620 1.187 1.00 0.00
+HETATM 16 H 1 2.156 -1.784 -0.228 1.00 0.00
+HETATM 17 H 1 -0.774 1.222 1.738 1.00 0.00
+HETATM 18 H 1 -2.112 -2.110 0.766 1.00 0.00
+HETATM 19 H 1 -2.545 -0.402 0.425 1.00 0.00
+HETATM 20 H 1 -2.081 -0.175 2.830 1.00 0.00
+CONECT 1 2 5 9 10
+CONECT 2 1 3 8
+CONECT 3 2 4 7
+CONECT 4 3 5 6 6
+CONECT 5 1 4
+CONECT 6 4 4
+CONECT 7 3 15
+CONECT 8 2 16
+CONECT 9 1
+CONECT 10 1 11 12 13
+CONECT 11 10
+CONECT 12 10 17
+CONECT 13 10 14 18 19
+CONECT 14 13 20
+CONECT 15 7
+CONECT 16 8
+CONECT 17 12
+CONECT 18 13
+CONECT 19 13
+CONECT 20 14
+MASTER 0 0 0 0 0 0 0 0 20 0 20 0
+END
diff --git a/hacks/images/molecules/vx.pdb b/hacks/images/molecules/vx.pdb
new file mode 100644
index 0000000..8b653cb
--- /dev/null
+++ b/hacks/images/molecules/vx.pdb
@@ -0,0 +1,92 @@
+HEADER VX: a chemical warfare agent, cholinesterase inhibitor
+COMPND VX
+AUTHOR Created by Dave Woodcock at Okanagan University College
+AUTHOR email:woodcock@okanagan.bc.ca
+AUTHOR Date revised: Fri Sep 1 09:41:05 2000 GENERATED BY BABEL 1.6
+HETATM 1 C 1 0.000 0.000 0.000 1.00 0.00
+HETATM 2 C 1 1.541 0.000 0.000 1.00 0.00
+HETATM 3 O 1 2.000 1.333 0.000 1.00 0.00
+HETATM 4 P 1 3.580 1.768 -0.723 1.00 0.00
+HETATM 5 O 1 3.908 3.507 -0.453 1.00 0.00
+HETATM 6 C 1 3.536 1.434 -2.522 1.00 0.00
+HETATM 7 S 1 5.089 0.633 0.149 1.00 0.00
+HETATM 8 C 1 6.652 1.113 -0.581 1.00 0.00
+HETATM 9 C 1 7.173 2.394 0.105 1.00 0.00
+HETATM 10 N 1 8.475 2.827 -0.436 1.00 0.00
+HETATM 11 C 1 9.247 3.677 0.492 1.00 0.00
+HETATM 12 C 1 9.948 2.776 1.531 1.00 0.00
+HETATM 13 C 1 8.388 4.729 1.230 1.00 0.00
+HETATM 14 C 1 8.465 3.210 -1.863 1.00 0.00
+HETATM 15 C 1 9.881 3.493 -2.414 1.00 0.00
+HETATM 16 C 1 7.562 4.422 -2.181 1.00 0.00
+HETATM 17 H 1 -0.362 0.520 0.887 1.00 0.00
+HETATM 18 H 1 -0.367 -1.026 0.006 1.00 0.00
+HETATM 19 H 1 -0.363 0.510 -0.892 1.00 0.00
+HETATM 20 H 1 1.902 -0.524 -0.885 1.00 0.00
+HETATM 21 H 1 1.904 -0.507 0.894 1.00 0.00
+HETATM 22 H 1 2.728 2.007 -2.976 1.00 0.00
+HETATM 23 H 1 3.367 0.370 -2.691 1.00 0.00
+HETATM 24 H 1 4.485 1.727 -2.970 1.00 0.00
+HETATM 25 H 1 6.489 1.278 -1.644 1.00 0.00
+HETATM 26 H 1 7.377 0.311 -0.444 1.00 0.00
+HETATM 27 H 1 7.282 2.161 1.162 1.00 0.00
+HETATM 28 H 1 6.438 3.191 0.006 1.00 0.00
+HETATM 29 H 1 10.030 4.205 -0.044 1.00 0.00
+HETATM 30 H 1 10.539 2.021 1.012 1.00 0.00
+HETATM 31 H 1 9.216 2.282 2.169 1.00 0.00
+HETATM 32 H 1 10.608 3.383 2.151 1.00 0.00
+HETATM 33 H 1 9.041 5.368 1.825 1.00 0.00
+HETATM 34 H 1 7.675 4.243 1.895 1.00 0.00
+HETATM 35 H 1 7.847 5.345 0.515 1.00 0.00
+HETATM 36 H 1 8.094 2.362 -2.434 1.00 0.00
+HETATM 37 H 1 10.574 2.735 -2.048 1.00 0.00
+HETATM 38 H 1 10.223 4.483 -2.116 1.00 0.00
+HETATM 39 H 1 9.853 3.454 -3.503 1.00 0.00
+HETATM 40 H 1 7.928 5.308 -1.665 1.00 0.00
+HETATM 41 H 1 6.533 4.222 -1.886 1.00 0.00
+HETATM 42 H 1 7.584 4.609 -3.255 1.00 0.00
+CONECT 1 2 17 18 19
+CONECT 2 1 3 20 21
+CONECT 3 2 4
+CONECT 4 3 5 6 7
+CONECT 4 5
+CONECT 5 4
+CONECT 6 4 22 23 24
+CONECT 7 4 8
+CONECT 8 7 9 25 26
+CONECT 9 8 10 27 28
+CONECT 10 9 11 14
+CONECT 11 10 12 13 29
+CONECT 12 11 30 31 32
+CONECT 13 11 33 34 35
+CONECT 14 10 15 16 36
+CONECT 15 14 37 38 39
+CONECT 16 14 40 41 42
+CONECT 17 1
+CONECT 18 1
+CONECT 19 1
+CONECT 20 2
+CONECT 21 2
+CONECT 22 6
+CONECT 23 6
+CONECT 24 6
+CONECT 25 8
+CONECT 26 8
+CONECT 27 9
+CONECT 28 9
+CONECT 29 11
+CONECT 30 12
+CONECT 31 12
+CONECT 32 12
+CONECT 33 13
+CONECT 34 13
+CONECT 35 13
+CONECT 36 14
+CONECT 37 15
+CONECT 38 15
+CONECT 39 15
+CONECT 40 16
+CONECT 41 16
+CONECT 42 16
+MASTER 0 0 0 0 0 0 0 0 42 0 42 0
+END
diff --git a/hacks/images/noseguy/nose-f1.png b/hacks/images/noseguy/nose-f1.png
new file mode 100644
index 0000000..3be8f4c
--- /dev/null
+++ b/hacks/images/noseguy/nose-f1.png
Binary files differ
diff --git a/hacks/images/noseguy/nose-f2.png b/hacks/images/noseguy/nose-f2.png
new file mode 100644
index 0000000..5e45842
--- /dev/null
+++ b/hacks/images/noseguy/nose-f2.png
Binary files differ
diff --git a/hacks/images/noseguy/nose-f3.png b/hacks/images/noseguy/nose-f3.png
new file mode 100644
index 0000000..75a9e3a
--- /dev/null
+++ b/hacks/images/noseguy/nose-f3.png
Binary files differ
diff --git a/hacks/images/noseguy/nose-f4.png b/hacks/images/noseguy/nose-f4.png
new file mode 100644
index 0000000..2573d8e
--- /dev/null
+++ b/hacks/images/noseguy/nose-f4.png
Binary files differ
diff --git a/hacks/images/noseguy/nose-l1.png b/hacks/images/noseguy/nose-l1.png
new file mode 100644
index 0000000..bfd2efd
--- /dev/null
+++ b/hacks/images/noseguy/nose-l1.png
Binary files differ
diff --git a/hacks/images/noseguy/nose-l2.png b/hacks/images/noseguy/nose-l2.png
new file mode 100644
index 0000000..2351865
--- /dev/null
+++ b/hacks/images/noseguy/nose-l2.png
Binary files differ
diff --git a/hacks/images/noseguy/nose-r1.png b/hacks/images/noseguy/nose-r1.png
new file mode 100644
index 0000000..41d8584
--- /dev/null
+++ b/hacks/images/noseguy/nose-r1.png
Binary files differ
diff --git a/hacks/images/noseguy/nose-r2.png b/hacks/images/noseguy/nose-r2.png
new file mode 100644
index 0000000..9513fe3
--- /dev/null
+++ b/hacks/images/noseguy/nose-r2.png
Binary files differ
diff --git a/hacks/images/osx_10_2.png b/hacks/images/osx_10_2.png
new file mode 100644
index 0000000..1db7911
--- /dev/null
+++ b/hacks/images/osx_10_2.png
Binary files differ
diff --git a/hacks/images/osx_10_3.png b/hacks/images/osx_10_3.png
new file mode 100644
index 0000000..53b3a2b
--- /dev/null
+++ b/hacks/images/osx_10_3.png
Binary files differ
diff --git a/hacks/images/pacman.png b/hacks/images/pacman.png
new file mode 100644
index 0000000..b5d3757
--- /dev/null
+++ b/hacks/images/pacman.png
Binary files differ
diff --git a/hacks/images/ransomware.png b/hacks/images/ransomware.png
new file mode 100644
index 0000000..ec2ea71
--- /dev/null
+++ b/hacks/images/ransomware.png
Binary files differ
diff --git a/hacks/images/sball-bg.png b/hacks/images/sball-bg.png
new file mode 100644
index 0000000..54bf9b5
--- /dev/null
+++ b/hacks/images/sball-bg.png
Binary files differ
diff --git a/hacks/images/sball.png b/hacks/images/sball.png
new file mode 100644
index 0000000..c3a8366
--- /dev/null
+++ b/hacks/images/sball.png
Binary files differ
diff --git a/hacks/images/scales.png b/hacks/images/scales.png
new file mode 100644
index 0000000..be74f1d
--- /dev/null
+++ b/hacks/images/scales.png
Binary files differ
diff --git a/hacks/images/sclera.png b/hacks/images/sclera.png
new file mode 100644
index 0000000..926b00f
--- /dev/null
+++ b/hacks/images/sclera.png
Binary files differ
diff --git a/hacks/images/sea-texture.png b/hacks/images/sea-texture.png
new file mode 100644
index 0000000..228368d
--- /dev/null
+++ b/hacks/images/sea-texture.png
Binary files differ
diff --git a/hacks/images/som.png b/hacks/images/som.png
new file mode 100644
index 0000000..f281e8d
--- /dev/null
+++ b/hacks/images/som.png
Binary files differ
diff --git a/hacks/images/start.png b/hacks/images/start.png
new file mode 100644
index 0000000..bfe92e5
--- /dev/null
+++ b/hacks/images/start.png
Binary files differ
diff --git a/hacks/images/testcard_bbcf.png b/hacks/images/testcard_bbcf.png
new file mode 100644
index 0000000..2a71585
--- /dev/null
+++ b/hacks/images/testcard_bbcf.png
Binary files differ
diff --git a/hacks/images/testcard_pm5544.png b/hacks/images/testcard_pm5544.png
new file mode 100644
index 0000000..37a292a
--- /dev/null
+++ b/hacks/images/testcard_pm5544.png
Binary files differ
diff --git a/hacks/images/testcard_rca.png b/hacks/images/testcard_rca.png
new file mode 100644
index 0000000..220f616
--- /dev/null
+++ b/hacks/images/testcard_rca.png
Binary files differ
diff --git a/hacks/images/timetunnel0.png b/hacks/images/timetunnel0.png
new file mode 100644
index 0000000..3ddb91e
--- /dev/null
+++ b/hacks/images/timetunnel0.png
Binary files differ
diff --git a/hacks/images/timetunnel1.png b/hacks/images/timetunnel1.png
new file mode 100644
index 0000000..61ad9e7
--- /dev/null
+++ b/hacks/images/timetunnel1.png
Binary files differ
diff --git a/hacks/images/timetunnel2.png b/hacks/images/timetunnel2.png
new file mode 100644
index 0000000..f1c2be8
--- /dev/null
+++ b/hacks/images/timetunnel2.png
Binary files differ
diff --git a/hacks/images/toast.png b/hacks/images/toast.png
new file mode 100644
index 0000000..a54c919
--- /dev/null
+++ b/hacks/images/toast.png
Binary files differ
diff --git a/hacks/images/tree.png b/hacks/images/tree.png
new file mode 100644
index 0000000..d3b9e36
--- /dev/null
+++ b/hacks/images/tree.png
Binary files differ
diff --git a/hacks/images/tunnel0.png b/hacks/images/tunnel0.png
new file mode 100644
index 0000000..cbbb372
--- /dev/null
+++ b/hacks/images/tunnel0.png
Binary files differ
diff --git a/hacks/images/tunnel1.png b/hacks/images/tunnel1.png
new file mode 100644
index 0000000..1f4ee22
--- /dev/null
+++ b/hacks/images/tunnel1.png
Binary files differ
diff --git a/hacks/images/tunnel2.png b/hacks/images/tunnel2.png
new file mode 100644
index 0000000..91f437f
--- /dev/null
+++ b/hacks/images/tunnel2.png
Binary files differ
diff --git a/hacks/images/tunnel3.png b/hacks/images/tunnel3.png
new file mode 100644
index 0000000..ecdf27d
--- /dev/null
+++ b/hacks/images/tunnel3.png
Binary files differ
diff --git a/hacks/images/tunnel4.png b/hacks/images/tunnel4.png
new file mode 100644
index 0000000..a844410
--- /dev/null
+++ b/hacks/images/tunnel4.png
Binary files differ
diff --git a/hacks/images/tunnel5.png b/hacks/images/tunnel5.png
new file mode 100644
index 0000000..45785e0
--- /dev/null
+++ b/hacks/images/tunnel5.png
Binary files differ
diff --git a/hacks/images/tunnelstar.png b/hacks/images/tunnelstar.png
new file mode 100644
index 0000000..995807c
--- /dev/null
+++ b/hacks/images/tunnelstar.png
Binary files differ
diff --git a/hacks/images/win10_spinner.gif b/hacks/images/win10_spinner.gif
new file mode 100644
index 0000000..7e37922
--- /dev/null
+++ b/hacks/images/win10_spinner.gif
Binary files differ
diff --git a/hacks/images/wood.png b/hacks/images/wood.png
new file mode 100644
index 0000000..6e52af7
--- /dev/null
+++ b/hacks/images/wood.png
Binary files differ
diff --git a/hacks/images/wood2.png b/hacks/images/wood2.png
new file mode 100644
index 0000000..2504877
--- /dev/null
+++ b/hacks/images/wood2.png
Binary files differ
diff --git a/hacks/imsmap.c b/hacks/imsmap.c
new file mode 100644
index 0000000..1877243
--- /dev/null
+++ b/hacks/imsmap.c
@@ -0,0 +1,420 @@
+/* imsmap, Copyright (c) 1992-2013 Juergen Nickelsen and Jamie Zawinski.
+ * Derived from code by Markus Schirmer, TU Berlin.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Revision History:
+ * 24-aug-92: jwz: hacked.
+ * 17-May-97: jwz: hacked more.
+ */
+
+#include <stdio.h>
+#include <math.h>
+
+#include "screenhack.h"
+
+#define NSTEPS 7
+#define COUNT (1 << NSTEPS)
+#define CELL(c, r) st->cell[((unsigned int)(c)) + ((unsigned int) (r)) * st->xmax]
+
+#if defined(sun) && !__STDC__ /* sun cc doesn't know "signed char" */
+#define signed /**/
+#endif
+
+struct state {
+ Display *dpy;
+ Window window;
+ Colormap cmap;
+ int ncolors;
+ XColor *colors;
+ Bool extra_krinkly_p;
+
+ int delay, delay2;
+ signed char *cell;
+ int xmax, ymax;
+ int iteration, iterations;
+
+ int cx, xstep, ystep, xnextStep, ynextStep;
+
+ unsigned int last_pixel, last_valid;
+ int flip_x;
+ int flip_xy;
+
+ GC gc, gc2;
+ XWindowAttributes xgwa;
+
+ struct timeval then;
+};
+
+
+#define HEIGHT_TO_PIXEL(height) \
+ ((height) < 0 \
+ ? (st->extra_krinkly_p \
+ ? st->ncolors - 1 - ((-(height)) % st->ncolors) \
+ : 0) \
+ : ((height) >= st->ncolors \
+ ? (st->extra_krinkly_p \
+ ? (height) % st->ncolors \
+ : st->ncolors-1) \
+ : (height)))
+
+
+static unsigned int
+set (struct state *st,
+ unsigned int l,
+ unsigned int c,
+ unsigned int size,
+ int height)
+{
+ int rang = 1 << (NSTEPS - size);
+ height = height + (random () % rang) - rang / 2;
+ height = HEIGHT_TO_PIXEL(height);
+ CELL (l, c) = height;
+ return st->colors[height].pixel;
+}
+
+
+static void
+floyd_steinberg (struct state *st)
+{
+ int x, y, err;
+
+ /* Instead of repeatedly calling XPutPixel(), we make an Image and then
+ send its bits over all at once. This consumes much less network
+ bandwidth. The image we create is Wx1 intead of WxH, so that we
+ don't use enormous amounts of memory.
+ */
+ XImage *image =
+ XCreateImage (st->dpy, st->xgwa.visual,
+ 1, XYBitmap, 0, /* depth, format, offset */
+ (char *) calloc ((st->xmax + 8) / 8, 1), /* data */
+ st->xmax, 1, 8, 0); /* w, h, pad, bpl */
+
+ XSetForeground (st->dpy, st->gc, st->colors[0].pixel);
+ XSetBackground (st->dpy, st->gc, st->colors[1].pixel);
+
+ for (y = 0; y < st->ymax - 1; y++)
+ {
+ for (x = 0; x < st->xmax - 1; x++)
+ {
+ if (CELL(x, y) < 0)
+ {
+ err = CELL (x, y);
+ XPutPixel (image, x, 0, 1);
+ }
+ else
+ {
+ err = CELL (x, y) - 1;
+ XPutPixel (image, x, 0, 0);
+ }
+ /* distribute error */
+ CELL (x, y+1) += (int) (((float) err) * 3.0/8.0);
+ CELL (x+1, y) += (int) (((float) err) * 3.0/8.0);
+ CELL (x+1, y+1) += (int) (((float) err) * 1.0/4.0);
+ }
+ XPutImage (st->dpy, st->window, st->gc, image, 0, 0, 0, y, st->xmax, 1);
+ }
+ XDestroyImage (image);
+}
+
+
+static void
+draw (struct state *st,
+ int x, int y, unsigned long pixel, int grid_size)
+{
+ if (st->flip_x)
+ x = st->xmax - x;
+
+ if (st->flip_xy)
+ {
+ int swap = x;
+ x = y;
+ y = swap;
+ }
+
+ if (! (st->last_valid && pixel == st->last_pixel))
+ XSetForeground (st->dpy, st->gc, pixel);
+ st->last_valid = 1, st->last_pixel = pixel;
+ if (grid_size == 1)
+ XDrawPoint (st->dpy, st->window, st->gc, x, y);
+ else
+ XFillRectangle (st->dpy, st->window, st->gc, x, y, grid_size, grid_size);
+}
+
+
+static void
+init_map (struct state *st)
+{
+ XGCValues gcv;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->cmap = st->xgwa.colormap;
+
+ st->flip_x = (random() % 2);
+ st->flip_xy = (random() % 2);
+
+ if (mono_p)
+ st->flip_xy = 0;
+ else if (st->colors)
+ free_colors (st->xgwa.screen, st->cmap, st->colors, st->ncolors);
+ st->colors = 0;
+
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ st->iterations = get_integer_resource (st->dpy, "iterations", "Integer");
+ if (st->iterations < 0) st->iterations = 0;
+ else if (st->iterations > 7) st->iterations = 7;
+
+ if (st->ncolors <= 2) st->ncolors = 0;
+ if (st->ncolors == 0) mono_p = True;
+ if (st->ncolors > 255) st->ncolors = 255; /* too many look bad */
+
+ if (!st->gc) st->gc = XCreateGC (st->dpy, st->window, 0, &gcv);
+ if (!st->gc2) st->gc2 = XCreateGC (st->dpy, st->window, 0, &gcv);
+
+ if (mono_p)
+ st->extra_krinkly_p = !(random() % 15);
+ else
+ st->extra_krinkly_p = !(random() % 5);
+
+ if (!mono_p)
+ {
+ if (st->ncolors < 1) st->ncolors = 1;
+ st->colors = (XColor *) malloc (st->ncolors * sizeof(*st->colors));
+
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, False);
+ if (st->ncolors <= 2)
+ mono_p = 1;
+ }
+
+ if (mono_p)
+ {
+ int i;
+ unsigned long fg_pixel =
+ get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ unsigned long bg_pixel =
+ get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ if (!st->colors)
+ {
+ st->ncolors = 50;
+ st->colors = (XColor *) calloc (st->ncolors, sizeof(*st->colors));
+ }
+ st->colors[0].pixel = fg_pixel;
+ for (i = 1; i < st->ncolors; i++)
+ st->colors[i].pixel = bg_pixel;
+ }
+
+ XSetForeground (st->dpy, st->gc, st->colors[1].pixel);
+ XFillRectangle (st->dpy, st->window, st->gc, 0, 0,
+ st->xgwa.width, st->xgwa.height);
+
+ if (st->flip_xy)
+ {
+ st->xmax = st->xgwa.height;
+ st->ymax = st->xgwa.width;
+ }
+ else
+ {
+ st->xmax = st->xgwa.width;
+ st->ymax = st->xgwa.height;
+ }
+
+ if (st->cell) free (st->cell);
+ st->cell = (signed char *) calloc (st->xmax * st->ymax, 1);
+
+ CELL (0, 0) = 0;
+ st->xstep = COUNT;
+ st->ystep = COUNT;
+
+ st->iteration = 0;
+ st->cx = 0;
+}
+
+
+static void *
+imsmap_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ init_map (st);
+ return st;
+}
+
+
+static unsigned long
+imsmap_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->delay2;
+ int i;
+
+ /* do this many lines at a time without pausing */
+ int col_chunk = st->iteration * 2 + 1;
+
+ if (st->iteration > st->iterations)
+ init_map (st);
+
+ if (st->cx == 0)
+ {
+ st->xnextStep = st->xstep / 2;
+ st->ynextStep = st->ystep / 2;
+ }
+
+ for (i = 0; i < col_chunk; i++)
+ {
+ int x1, x2, y1, y2;
+ int y;
+ int x = st->cx;
+
+ x1 = x + st->xnextStep;
+ if (x1 < 0)
+ x1 = st->xmax-1;
+ else if (x1 >= st->xmax)
+ x1 = 0;
+
+ x2 = x + st->xstep;
+ if (x2 < 0)
+ x2 = st->xmax-1;
+ else if (x2 >= st->xmax)
+ x2 = 0;
+
+ for (y = 0; y < st->ymax; y += st->ystep)
+ {
+ unsigned int pixel, qpixels [4];
+
+ y1 = y + st->ynextStep;
+ if (y1 < 0)
+ y1 = st->ymax-1;
+ else if (y1 >= st->ymax)
+ y1 = 0;
+
+ y2 = y + st->ystep;
+ if (y2 < 0)
+ y2 = st->ymax-1;
+ else if (y2 >= st->ymax)
+ y2 = 0;
+
+ qpixels [0] = st->colors [HEIGHT_TO_PIXEL (CELL (x, y))].pixel;
+ qpixels [1] = st->colors [HEIGHT_TO_PIXEL (CELL (x, y2))].pixel;
+ qpixels [2] = st->colors [HEIGHT_TO_PIXEL (CELL (x2, y))].pixel;
+ qpixels [3] = st->colors [HEIGHT_TO_PIXEL (CELL (x2, y2))].pixel;
+
+ pixel = set (st, x, y1, st->iteration,
+ ((int) CELL (x, y) + (int) CELL (x, y2) + 1) / 2);
+
+ if (! mono_p &&
+ (pixel != qpixels[0] || pixel != qpixels[1] ||
+ pixel != qpixels[2] || pixel != qpixels[3]))
+ draw (st, x, y1, pixel, st->ynextStep);
+
+ pixel = set (st, x1, y, st->iteration,
+ ((int) CELL (x, y) + (int) CELL (x2, y) + 1) / 2);
+ if (! mono_p &&
+ (pixel != qpixels[0] || pixel != qpixels[1] ||
+ pixel != qpixels[2] || pixel != qpixels[3]))
+ draw (st, x1, y, pixel, st->ynextStep);
+
+ pixel = set (st, x1, y1, st->iteration,
+ ((int) CELL (x, y) + (int) CELL (x, y2) +
+ (int) CELL (x2, y) + (int) CELL (x2, y2) + 2)
+ / 4);
+ if (! mono_p &&
+ (pixel != qpixels[0] || pixel != qpixels[1] ||
+ pixel != qpixels[2] || pixel != qpixels[3]))
+ draw (st, x1, y1, pixel, st->ynextStep);
+ }
+
+ st->cx += st->xstep;
+ if (st->cx >= st->xmax)
+ break;
+ }
+
+ if (st->cx >= st->xmax)
+ {
+ st->cx = 0;
+ st->xstep = st->xnextStep;
+ st->ystep = st->ynextStep;
+
+ st->iteration++;
+
+ if (st->iteration > st->iterations)
+ this_delay = st->delay * 1000000;
+
+ if (mono_p)
+ floyd_steinberg (st); /* in mono, do all drawing at the end */
+ }
+
+ return this_delay;
+}
+
+
+static void
+imsmap_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ init_map (st);
+}
+
+
+static Bool
+imsmap_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ init_map (st);
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+imsmap_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->colors) free (st->colors);
+ if (st->cell) free (st->cell);
+ free (st);
+}
+
+
+static const char *imsmap_defaults [] = {
+ ".background: #000066",
+ ".foreground: #FF00FF",
+ "*fpsSolid: true",
+ "*mode: random",
+ "*ncolors: 50",
+ "*iterations: 7",
+ "*delay: 5",
+ "*delay2: 20000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec imsmap_options [] = {
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-iterations", ".iterations", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("IMSMap", imsmap)
diff --git a/hacks/imsmap.man b/hacks/imsmap.man
new file mode 100644
index 0000000..b4bc092
--- /dev/null
+++ b/hacks/imsmap.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "17-May-97" "X Version 11"
+.SH NAME
+imsmap - generate fractal maps
+.SH SYNOPSIS
+.B imsmap
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIint\fP] [\-delay \fIseconds\fP] [\-delay2 \fImicroseconds\fP] [\-iterations \fIint\fP] [\-mode h|s|v|random]
+[\-fps]
+.SH DESCRIPTION
+The \fIimsmap\fP program generates map or cloud-like patterns. It looks
+quite different in monochrome and color.
+.SH OPTIONS
+.I imsmap
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors to use. Default 50.
+.TP 8
+.B \-delay \fIinteger\fP
+How long to delay between images. Default 10 seconds.
+.TP 8
+.B \-delay2 \fIinteger\fP
+How long to delay between bitmaps. Default 200000 (0.2 seconds).
+.TP 8
+.B \-iterations \fIinteger\fP
+A measure of the resolution of the resultant image, from 0 to 7. Default 7.
+.TP 8
+.B \-mode [ hue | saturation | value | random ]
+The axis upon which colors should be interpolated between the foreground
+and background color. Default random.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH AUTHOR
+Juergen Nickelsen <nickel@cs.tu-berlin.de>, 23-aug-92.
+
+Hacked on by Jamie Zawinski <jwz@jwz.org>, 24-aug-92, 17-May-97.
diff --git a/hacks/interaggregate.c b/hacks/interaggregate.c
new file mode 100644
index 0000000..6308841
--- /dev/null
+++ b/hacks/interaggregate.c
@@ -0,0 +1,981 @@
+/*
+ * InterAggregate (dagraz@gmail.com)
+ * Based on code from complexification.net Intersection Aggregate
+ * http://www.complexification.net/gallery/machines/interAggregate/index.php
+ *
+ * Intersection Aggregate code:
+ * j.tarbell May, 2004
+ * Albuquerque, New Mexico
+ * complexification.net
+ *
+ * Also based on substrate, a port of j.tarbell's Substrate Art done
+ * by dragorn@kismetwireless.net
+ *
+ *
+ * Interesting command line options, all of which serve to
+ * concentrate the painting in some way:
+ *
+ * -percent-orbits 100 -base-orbits 50 -base-on-center -growth-delay 0
+ *
+ * Paint should be concentrated in the center of the canvas, orbiting
+ * about it. -percent-orbits 100 implies -base-on-center, so that's
+ * not really needed.
+ *
+ *
+ * -percent-orbits 99 -base-orbits 50 -growth-delay 0
+ *
+ * Like the above example, but the 'center' will rove about the screen.
+ *
+ * -percent-orbits 98 -base-orbits 50 -growth-delay 0
+ *
+ * Like the above example, but there will be two roving centers.
+ *
+ *
+ * TODO:
+ * -fix alpha blending / byte ordering
+ *
+ * CHANGES
+ *
+ *
+ * Directly based the hacks of:
+ *
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+
+/* this program goes faster if some functions are inline. The following is
+ * borrowed from ifs.c */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+
+#ifndef MIN
+#define MIN(x,y) ((x < y) ? x : y)
+#endif
+
+#ifndef MAX
+#define MAX(x,y) ((x < y) ? y : x)
+#endif
+
+static const char *interaggregate_defaults[] =
+{
+ ".background: white",
+ ".foreground: black",
+ "*fpsSolid: true",
+ "*maxCycles: 100000",
+#ifdef TIME_ME
+ "*growthDelay: 0",
+#else
+ "*growthDelay: 18000",
+#endif
+ "*numCircles: 100",
+ "*percentOrbits: 0",
+ "*baseOrbits: 75",
+ "*baseOnCenter: False",
+ "*drawCenters: False",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec interaggregate_options[] =
+{
+ {"-background", ".background", XrmoptionSepArg, 0},
+ {"-foreground", ".foreground", XrmoptionSepArg, 0},
+ {"-max-cycles", ".maxCycles", XrmoptionSepArg, 0},
+ {"-growth-delay", ".growthDelay", XrmoptionSepArg, 0},
+ {"-num-circles", ".numCircles", XrmoptionSepArg, 0},
+ {"-percent-orbits", ".percentOrbits", XrmoptionSepArg, 0},
+ {"-base-orbits", ".baseOrbits", XrmoptionSepArg, 0},
+ {"-base-on-center", ".baseOnCenter", XrmoptionNoArg, "true"},
+ {"-draw-centers", ".drawCenters", XrmoptionNoArg, "true"},
+ {0, 0, 0, 0}
+};
+
+/* Raw colormap extracted from pollockEFF.gif */
+#if 0
+char *rgb_colormap[] =
+{
+ "#FFFFFF", /* white */
+ "#000000", /* black */
+ "#000000", /* more black */
+ /* "#736451", */
+ "#4e3e2e", /* olive */
+ /* "#666666", */
+ "#694d35", /* camel */
+ "#b9a88c", /* tan */
+ 0
+};
+#endif
+
+static const char *rgb_colormap[] =
+{
+ "#FFFFFF", /* white */
+ "#000000", /* more black */
+ "#000000", /* more black */
+ "#4e3e2e", /* olive */
+ "#694d35", /* camel */
+ "#b0a085", /* tan */
+ "#e6d3ae",
+ 0
+};
+
+/* black white brown olive grey camel */
+
+typedef enum { LINEAR, ORBIT } PathType;
+
+typedef struct
+{
+
+ unsigned long color;
+ double gain;
+ double p;
+
+} SandPainter;
+
+typedef struct _circle
+{
+ double radius;
+
+ double x;
+ double y;
+
+ PathType path_type;
+
+ /* for a linear path */
+ double dx;
+ double dy;
+
+ /* for orbital path */
+ double theta;
+ double r;
+ double dtheta;
+
+ struct _circle* center;
+
+ int num_painters;
+ SandPainter* painters;
+
+} Circle;
+
+
+struct field
+{
+ int height;
+ int width;
+
+ int num_circles;
+ Circle* circles;
+
+ int percent_orbits;
+ int base_orbits;
+ Bool base_on_center;
+
+ /* used for orbits circling the center of the screen */
+ Circle center_of_universe;
+
+ /* Raw map of pixels we need to keep for alpha blending */
+ unsigned long int *off_img;
+
+ /* color parms */
+ int numcolors;
+ unsigned long *parsedcolors;
+ unsigned long fgcolor;
+ unsigned long bgcolor;
+ int visdepth;
+
+ unsigned int cycles;
+
+ double max_gain;
+
+ /* for debugging */
+ Bool draw_centers;
+
+ /* for profiling whatnot */
+ int possible_intersections;
+ int intersection_count;
+};
+
+
+static struct field *
+init_field(void)
+{
+ struct field *f = (struct field*) malloc(sizeof(struct field));
+ if ( f == NULL )
+ {
+ fprintf(stderr, "%s: Failed to allocate field!\n", progname);
+ exit(1);
+ }
+
+ f->height = 0;
+ f->width = 0;
+ f->num_circles = 0;
+ f->circles = NULL;
+ f->percent_orbits = 0;
+ f->base_orbits = 0;
+ f->base_on_center = False;
+ f->off_img = NULL;
+ f->numcolors = 0;
+ f->parsedcolors = NULL;
+ f->fgcolor = 0;
+ f->bgcolor = 0;
+ f->visdepth = 0;
+
+ f->cycles = 0;
+
+ f->max_gain = 0.22;
+
+ f->draw_centers = False;
+
+ f->possible_intersections = 0;
+ f->intersection_count = 0;
+
+ return f;
+}
+
+/* Quick references to pixels in the offscreen map and in the crack grid */
+#define ref_pixel(f, x, y) ((f)->off_img[(y) * (f)->width + (x)])
+
+#define in_bounds(f, x, y) ((x >= 0) && (x < f->width) && (y >= 0) && (y < f->height))
+
+/* Consider rewriting with XQueryColor, or ImageByteOrder */
+
+static inline void point2rgb(int depth, unsigned long c, int *r, int *g, int *b)
+{
+ switch(depth)
+ {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ *r = (c & 0x00ff0000) >> 16;
+ *g = (c & 0x0000ffff) >> 8;
+ *b = (c & 0x000000ff);
+#else
+ *b = c & 0xff;
+ *g = (c & 0xff00) >> 8;
+ *r = (c & 0xff0000) >> 16;
+#endif
+ break;
+ case 16:
+ *b = (int) (c & 0x1f) << 3;
+ *g = (int) ((c >> 5) & 0x3f) << 2;
+ *r = (int) ((c >> 11) & 0x1f) << 3;
+ break;
+ case 15:
+ *b = (int) (c & 0x1f) << 3;
+ *g = (int) ((c >> 5) & 0x1f) << 3;
+ *r = (int) ((c >> 10) & 0x1f) << 3;
+ break;
+ }
+}
+
+static inline unsigned long rgb2point(int depth, int r, int g, int b)
+{
+ unsigned long ret = 0;
+
+ switch(depth)
+ {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ ret = 0xFF000000 | (r << 16) | (g << 8) | b;
+#else
+ ret |= (r << 16) | (g << 8) | b;
+#endif
+ break;
+ case 16:
+ ret = ((r>>3) << 11) | ((g>>2)<<5) | (b>>3);
+ break;
+ case 15:
+ ret = ((r>>3) << 10) | ((g>>3)<<5) | (b>>3);
+ break;
+ }
+
+ return ret;
+}
+
+/* alpha blended point drawing -- this is Not Right and will likely fail on
+ * non-intel platforms as it is now, needs fixing */
+static inline unsigned long trans_point(int x1, int y1, unsigned long myc, double a,
+ struct field *f)
+{
+ if (a >= 1.0)
+ {
+ ref_pixel(f, x1, y1) = myc;
+ return myc;
+ }
+ else
+ {
+ int or=0, og=0, ob=0;
+ int r=0, g=0, b=0;
+ int nr, ng, nb;
+ unsigned long c;
+
+ c = ref_pixel(f, x1, y1);
+
+ point2rgb(f->visdepth, c, &or, &og, &ob);
+ point2rgb(f->visdepth, myc, &r, &g, &b);
+
+ nr = or + (r - or) * a;
+ ng = og + (g - og) * a;
+ nb = ob + (b - ob) * a;
+
+ c = rgb2point(f->visdepth, nr, ng, nb);
+
+ ref_pixel(f, x1, y1) = c;
+
+ return c;
+ }
+}
+
+static inline void drawPoint(int x, int y, unsigned long color, double intensity,
+ Display *dpy, Window window, GC fgc, struct field *f)
+
+{
+ unsigned long c;
+
+ while ( x >= f->width ) x -= f->width;
+ while ( x < 0 ) x += f->width;
+
+ while ( y >= f->height ) y -= f->height;
+ while ( y < 0 ) y += f->height;
+
+ /* if ( in_bounds(f, x, y) ) ... */
+
+ c = trans_point(x, y, color, intensity, f);
+
+ XSetForeground(dpy, fgc, c);
+ XDrawPoint(dpy, window, fgc, x, y);
+}
+
+static inline void paint(SandPainter* painter, double ax, double ay, double bx, double by,
+ Display *dpy, Window window, GC fgc,
+ struct field *f)
+{
+ /* the sand painter */
+
+ double inc, sandp;
+ int i;
+
+ /* XXX try adding tpoint here, like orig */
+
+ /* jitter the painter's values */
+ painter->gain += frand(0.05) - 0.025;
+
+ if ( painter->gain > f->max_gain )
+ painter->gain = -f->max_gain;
+ else if ( painter->gain < -f->max_gain )
+ painter->gain = f->max_gain;
+
+ painter->p += frand(0.1) - 0.05;
+
+ if ( 0 < painter->p )
+ painter->p = 0;
+ else if ( painter->p > 1.0 )
+ painter->p = 1.0;
+
+ /* replace 0.1 with 1 / f->grains */
+ inc = painter->gain * 0.1;
+ sandp = 0;
+
+ for(i = 0; i <= 10; ++i)
+ {
+ int drawx, drawy;
+ double sp, sm;
+ double intensity = 0.1 - 0.009 * i;
+
+ sp = sin(painter->p + sandp);
+ drawx = ax + (bx - ax) * sp;
+ drawy = ay + (by - ay) * sp;
+
+ drawPoint(drawx, drawy, painter->color,
+ intensity,
+ dpy, window, fgc, f);
+
+ sm = sin(painter->p - sandp);
+ drawx = ax + (bx - ax) * sm;
+ drawy = ay + (by - ay) * sm;
+
+ drawPoint(drawx, drawy, painter->color,
+ intensity,
+ dpy, window, fgc, f);
+
+ sandp += inc;
+ }
+}
+
+static void build_colors(struct field *f, Display *dpy, XWindowAttributes *xgwa)
+{
+
+ XColor tmpcolor;
+ int i;
+ /* Count the colors in our map and assign them in a horrifically inefficient
+ * manner but it only happens once */
+
+ for( f->numcolors = 0;
+ rgb_colormap[f->numcolors] != NULL;
+ ++f->numcolors )
+ {
+ ;
+ }
+
+ if (f->numcolors < 1) f->numcolors = 1;
+ f->parsedcolors = (unsigned long *) calloc(f->numcolors,
+ sizeof(unsigned long));
+ if ( f->parsedcolors == NULL )
+ {
+ fprintf(stderr, "%s: Failed to allocate parsedcolors\n",
+ progname);
+ exit(1);
+ }
+
+ for(i = 0; i < f->numcolors; ++i)
+ {
+ if (!XParseColor(dpy, xgwa->colormap,
+ rgb_colormap[i], &tmpcolor))
+ {
+ fprintf(stderr, "%s: couldn't parse color %s\n", progname,
+ rgb_colormap[i]);
+ exit(1);
+ }
+
+ if (!XAllocColor(dpy, xgwa->colormap, &tmpcolor))
+ {
+ fprintf(stderr, "%s: couldn't allocate color %s\n", progname,
+ rgb_colormap[i]);
+ exit(1);
+ }
+
+ f->parsedcolors[i] = tmpcolor.pixel;
+
+ }
+}
+
+/* used when the window is resized */
+static void build_img(struct field *f)
+{
+ if (f->off_img) {
+ free(f->off_img);
+ f->off_img = NULL;
+ }
+
+ f->off_img = (unsigned long *) calloc(f->width * f->height,
+ sizeof(unsigned long));
+
+
+ if ( f->off_img == NULL )
+ {
+ fprintf(stderr, "%s: Failed to allocate off_img\n",
+ progname);
+ exit(1);
+ }
+
+ memset(f->off_img, f->bgcolor,
+ sizeof(unsigned long) * f->width * f->height);
+}
+
+static void free_circles(struct field *f)
+{
+ int i;
+
+ if ( f->circles != NULL )
+ {
+ for(i = 0; i < f->num_circles; ++i)
+ {
+ free (f->circles[i].painters);
+ }
+
+ free (f->circles);
+ f->circles = NULL;
+ }
+}
+
+static void build_field(Display *dpy, Window window, XWindowAttributes xgwa, GC fgc,
+ struct field *f)
+{
+ int i;
+ int num_orbits;
+ int base_orbits;
+ int orbit_start;
+ build_img(f);
+
+ f->center_of_universe.x = f->width / 2.0;
+ f->center_of_universe.y = f->height / 2.0;
+ f->center_of_universe.r = MAX(f->width, f->height) / 2.0;
+
+ num_orbits = (f->percent_orbits * f->num_circles) / 100;
+ orbit_start = f->num_circles - num_orbits;
+ base_orbits = orbit_start + (num_orbits * f->base_orbits) / 100;
+
+ free_circles(f);
+
+ f->circles = (Circle*) calloc(f->num_circles, sizeof(Circle));
+ if ( f->circles == NULL )
+ {
+ fprintf(stderr, "%s: Failed to allocate off_img\n",
+ progname);
+ exit(1);
+ }
+
+ for(i = 0; i < f->num_circles; ++i)
+ {
+ int j;
+ Circle *circle = f->circles + i;
+
+ /* make this a pref */
+
+ if ( i >= orbit_start )
+ circle->path_type = ORBIT;
+ else
+ circle->path_type = LINEAR;
+
+
+ if ( circle->path_type == LINEAR )
+ {
+ circle->x = frand(f->width);
+ circle->y = frand(f->height);
+
+ circle->dx = frand(0.5) - 0.25;
+ circle->dy = frand(0.5) - 0.25;
+ /* circle->dy = 0; */
+ /* circle->r = f->height * (0.05 + frand(0.1)); */
+ circle->radius = 5 + frand(55);
+
+ /* in case we want orbits based on lines */
+ circle->r = MIN(f->width, f->height) / 2.0;
+ circle->center = NULL;
+ }
+ else /* == ORBIT */
+ {
+ if (i < base_orbits )
+ {
+ if ( f->base_on_center )
+ circle->center = &f->center_of_universe;
+ else
+ {
+ circle->center = f->circles +
+ ((int)frand(orbit_start - 0.1));
+ }
+
+ circle->r = 1 + frand(MIN(f->width, f->height) / 2.0);
+
+ /* circle->radius = 5 + frand(55); */
+ }
+ else
+ {
+ /* give a preference for the earlier circles */
+
+ double p = frand(0.9);
+
+ circle->center = f->circles + (int) (p*i);
+
+ circle->r = 1 + 0.5 * circle->center->r + 0.5 * frand(circle->center->r);
+ /* circle->r = 1 + frand(circle->center->r / 2); */
+
+
+ /* circle->radius = MAX(5, frand(circle->r)); */
+ /* circle->radius = 5 + frand(55); */
+ }
+
+ circle->radius = 5 + frand(MIN(55, circle->r));
+ circle->dtheta = (frand(0.5) - 0.25) / circle->r;
+ circle->theta = frand(2 * M_PI);
+
+ circle->x = circle->r * cos(circle->theta) + circle->center->x;
+ circle->y = circle->r * sin(circle->theta) + circle->center->y;
+
+ }
+
+ /* make this a command line option */
+ circle->num_painters = 3;
+ circle->painters = (SandPainter*) calloc(circle->num_painters,
+ sizeof(SandPainter));
+ if ( circle->painters == NULL )
+ {
+ fprintf(stderr, "%s: failed to allocate painters", progname);
+ exit(1);
+ }
+
+ for(j = 0; j < circle->num_painters; ++j)
+ {
+ SandPainter *painter = circle->painters + j;
+
+ painter->gain = frand(0.09) + 0.01;
+ painter->p = frand(1.0);
+ painter->color =
+ f->parsedcolors[(int)(frand(0.999) * f->numcolors)];
+ }
+ }
+}
+
+static void moveCircles(struct field *f)
+{
+ int i;
+
+ for(i = 0; i < f->num_circles; ++i)
+ {
+ Circle *circle = f->circles + i;
+
+ if ( circle->path_type == LINEAR )
+ {
+ circle->x += circle->dx;
+ circle->y += circle->dy;
+
+#if 0
+ if ( circle->x < -circle->radius )
+ circle->x = f->width + circle->radius;
+ else if ( circle->x >= f->width + circle->radius )
+ circle->x = -circle->radius;
+
+ if ( circle->y < -circle->radius )
+ circle->y = f->height + circle->radius;
+ else if ( circle->y >= f->height + circle->radius )
+ circle->y = -circle->radius;
+#else
+ if ( circle->x < 0 ) circle->x += f->width;
+ else if ( circle->x >= f->width ) circle->x -= f->width;
+
+ if ( circle->y < 0 ) circle->y += f->height;
+ else if ( circle->y >= f->height ) circle->y -= f->height;
+#endif
+ }
+ else /* (circle->path_type == ORBIT) */
+ {
+ circle->theta += circle->dtheta;
+
+ if ( circle->theta < 0 ) circle->theta += 2 * M_PI;
+ else if ( circle->theta > 2 * M_PI ) circle->theta -= 2 * M_PI;
+
+ circle->x = circle->r * cos(circle->theta) + circle->center->x;
+ circle->y = circle->r * sin(circle->theta) + circle->center->y;
+
+#if 0
+ if ( circle->x < -circle->radius )
+ circle->x += f->width + 2 * circle->radius;
+ else if ( circle->x >= f->width + circle->radius )
+ circle->x -= f->width + 2 * circle->radius;
+
+ if ( circle->y < -circle->radius )
+ circle->y += f->height + 2 * circle->radius;
+ else if ( circle->y >= f->height + circle->radius )
+ circle->y -= f->height + 2 * circle->radius;
+#else
+ if ( circle->x < 0 ) circle->x += f->width;
+ else if ( circle->x >= f->width ) circle->x -= f->width;
+
+ if ( circle->y < 0 ) circle->y += f->height;
+ else if ( circle->y >= f->height ) circle->y -= f->height;
+#endif
+ }
+ }
+}
+
+static void drawIntersections(Display *dpy, Window window, GC fgc, struct field *f)
+{
+ int i,j;
+
+ /* One might be tempted to think 'hey, this is a crude algorithm
+ * that is going to check each of the n (n-1) / 2 possible
+ * intersections! Why not try bsp trees, quad trees, etc, etc,
+ * etc'
+ *
+ * In practice the time spent drawing the intersection of two
+ * circles dwarfs the time takes to check for intersection.
+ * Profiling on a 640x480 screen with 100 circles shows possible
+ * speed gains to be only a couple of percent.
+ *
+ * But hey, if you're bored, go have fun. Let me know how it
+ * turns out.
+ */
+
+
+ for(i = 0; i < f->num_circles; ++i)
+ {
+ Circle *c1 = f->circles + i;
+
+ if ( !f->draw_centers )
+ {
+ /* the default branch */
+
+ for(j = i + 1; j < f->num_circles; ++j)
+ {
+ double d, dsqr, dx, dy;
+ Circle *c2 = f->circles + j;
+
+#ifdef TIME_ME
+ ++f->possible_intersections;
+#endif
+ dx = c2->x - c1->x;
+ dy = c2->y - c1->y;
+
+ dsqr = dx * dx + dy * dy;
+ d = sqrt(dsqr);
+
+ if ( (fabs(dx) < (c1->radius + c2->radius)) &&
+ (fabs(dy) < (c1->radius + c2->radius)) &&
+ ( d < (c1->radius + c2->radius) ) &&
+ ( d > fabs(c1->radius - c2->radius) ) )
+ {
+ double d1, d2, r1sqr;
+ double bx, by;
+ double midpx, midpy;
+ double int1x, int1y;
+ double int2x, int2y;
+ int s;
+
+ /* woo-hoo. the circles are neither outside nor
+ * inside each other. they intersect.
+ *
+ * Now, compute the coordinates of the points of
+ * intersection
+ */
+
+#ifdef TIME_ME
+ ++f->intersection_count;
+#endif
+
+ /* unit vector in direction of c1 to c2 */
+ bx = dx / d;
+ by = dy / d;
+
+ r1sqr = c1->radius * c1->radius;
+
+ /* distance from c1's center midpoint of intersection
+ * points */
+
+ d1 = 0.5 * (r1sqr - c2->radius * c2->radius + dsqr) / d;
+
+ midpx = c1->x + d1 * bx;
+ midpy = c1->y + d1 * by;
+
+ /* distance from midpoint to points of intersection */
+
+ d2 = sqrt(r1sqr - d1 * d1);
+
+ int1x = midpx + d2 * by;
+ int1y = midpy - d2 * bx;
+
+ int2x = midpx - d2 * by;
+ int2y = midpy + d2 * bx;
+
+ for(s = 0; s < c1->num_painters; ++s)
+ {
+ paint(c1->painters + s, int1x, int1y, int2x, int2y,
+ dpy, window, fgc, f);
+ }
+ }
+ }
+ }
+ else /* f->draw_centers */
+ {
+ XDrawPoint(dpy, window, fgc, c1->x, c1->y);
+ }
+ }
+}
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ unsigned int max_cycles;
+ int growth_delay;
+ GC fgc;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ struct field *f;
+};
+
+
+static void *
+interaggregate_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+
+#ifdef TIME_ME
+ int frames;
+ struct timeval tm1, tm2;
+ double tdiff;
+#endif
+
+ st->dpy = dpy;
+ st->window = window;
+ st->f = init_field();
+ st->growth_delay = (get_integer_resource(st->dpy, "growthDelay", "Integer"));
+ st->max_cycles = (get_integer_resource(st->dpy, "maxCycles", "Integer"));
+ st->f->num_circles = (get_integer_resource(st->dpy, "numCircles", "Integer"));
+ st->f->percent_orbits = (get_integer_resource(st->dpy, "percentOrbits", "Integer"));
+ st->f->base_orbits = (get_integer_resource(st->dpy, "baseOrbits", "Integer"));
+ st->f->base_on_center = (get_boolean_resource(st->dpy, "baseOnCenter", "Boolean"));
+ st->f->draw_centers = (get_boolean_resource(st->dpy, "drawCenters", "Boolean"));
+
+ if (st->f->num_circles <= 1)
+ {
+ fprintf(stderr, "%s: Minimum number of circles is 2\n",
+ progname);
+ exit (1);
+ }
+
+ if ( (st->f->percent_orbits < 0) || (st->f->percent_orbits > 100) )
+ {
+ fprintf(stderr, "%s: percent-oribts must be between 0 and 100\n",
+ progname);
+ exit (1);
+ }
+
+ if ( (st->f->base_orbits < 0) || (st->f->base_orbits > 100) )
+ {
+ fprintf(stderr, "%s: base-oribts must be between 0 and 100\n",
+ progname);
+ exit (1);
+ }
+
+ if ( st->f->percent_orbits == 100 )
+ st->f->base_on_center = True;
+
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+
+ build_colors(st->f, st->dpy, &st->xgwa);
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->gcv.background = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+
+ st->fgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ st->f->height = st->xgwa.height;
+ st->f->width = st->xgwa.width;
+ st->f->visdepth = st->xgwa.depth;
+ st->f->fgcolor = st->gcv.foreground;
+ st->f->bgcolor = st->gcv.background;
+
+ /* Initialize stuff */
+ build_field(st->dpy, st->window, st->xgwa, st->fgc, st->f);
+
+#ifdef TIME_ME
+ gettimeofday(&tm1, NULL);
+ frames = 0;
+#endif
+
+ return st;
+}
+
+
+static unsigned long
+interaggregate_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if ((st->f->cycles % 10) == 0)
+ {
+ /* Restart if the window size changes */
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+
+ if (st->f->height != st->xgwa.height || st->f->width != st->xgwa.width)
+ {
+ st->f->height = st->xgwa.height;
+ st->f->width = st->xgwa.width;
+ st->f->visdepth = st->xgwa.depth;
+
+ build_field(st->dpy, st->window, st->xgwa, st->fgc, st->f);
+ XSetForeground(st->dpy, st->fgc, st->gcv.background);
+ XFillRectangle(st->dpy, st->window, st->fgc, 0, 0, st->xgwa.width, st->xgwa.height);
+ XSetForeground(st->dpy, st->fgc, st->gcv.foreground);
+ }
+ }
+
+ moveCircles(st->f);
+ drawIntersections(st->dpy, st->window, st->fgc, st->f);
+
+ st->f->cycles++;
+
+
+ if (st->f->cycles >= st->max_cycles && st->max_cycles != 0)
+ {
+ build_field(st->dpy, st->window, st->xgwa, st->fgc, st->f);
+ XSetForeground(st->dpy, st->fgc, st->gcv.background);
+ XFillRectangle(st->dpy, st->window, st->fgc, 0, 0, st->xgwa.width, st->xgwa.height);
+ XSetForeground(st->dpy, st->fgc, st->gcv.foreground);
+ }
+
+#ifdef TIME_ME
+ frames++;
+ gettimeofday(&tm2, NULL);
+
+ tdiff = (tm2.tv_sec - tm1.tv_sec)
+ + (tm2.tv_usec - tm1.tv_usec) * 0.00001;
+
+ if ( tdiff > 1 )
+ {
+ fprintf(stderr, "fps: %d %f %f\n",
+ frames, tdiff, frames / tdiff );
+
+ fprintf(stderr, "intersections: %d %d %f\n",
+ f->intersection_count, f->possible_intersections,
+ ((double)f->intersection_count) /
+ f->possible_intersections);
+
+ fprintf(stderr, "fpi: %f\n",
+ ((double)frames) / f->intersection_count );
+
+ frames = 0;
+ tm1.tv_sec = tm2.tv_sec;
+ tm1.tv_usec = tm2.tv_usec;
+
+ f->intersection_count = f->possible_intersections = 0;
+ }
+#endif
+
+ return st->growth_delay;
+}
+
+
+static void
+interaggregate_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+interaggregate_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->f->height--; /* act like a resize */
+ return True;
+ }
+ return False;
+}
+
+static void
+interaggregate_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+XSCREENSAVER_MODULE ("Interaggregate", interaggregate)
diff --git a/hacks/interaggregate.man b/hacks/interaggregate.man
new file mode 100644
index 0000000..3d1eee3
--- /dev/null
+++ b/hacks/interaggregate.man
@@ -0,0 +1,72 @@
+.TH Interaggregate 1 "08-Oct-04" "X Version 11"
+.SH NAME
+interaggregate - Visualize the momentary and aggregate intersections
+between slowly moving circles.
+.SH SYNOPSIS
+.B interaggregate
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-num\-circles \fIdisc count\fP]
+[\-growth\-delay \fIdelayms\fP]
+[\-max\-cycles \fImaxr\fP]
+[\-percent\-orbits \fIpercent\fP]
+[\-base\-orbits \fIpercent\fP]
+[\-base\-on\-center]
+[\-draw\-centers]
+[\-fps]
+.SH DESCRIPTION
+The Intersection Aggregate is a fun visualization defining the relationships
+between objects with Casey Reas, William Ngan, and Robert Hodgin. Commissioned
+for display at the Whitney Museum of American Art.
+
+A surface filled with 100 medium to small sized circles. Each circle has a
+different size and direction, but moves at the same slow rate. Display:
+
+ A. The instantaneous intersections of the circles.
+ B. The aggregate intersections of the circles.
+
+Ported to XScreensaver from the art project "InterAggregate" at
+http://www.complexification.net by J.Tarbell
+.SH OPTIONS
+.I interaggregate
+accepts the following options:
+.TP 8
+.B \-num\-circles \fIdisc count\fP (Default: \fI100\fP)
+Number of slowly moving and growing discs to use. The more discs,
+the more CPU power.
+.TP 8
+.B \-growth\-delay \fIdelayms\fP (Default: \fI18000\fP)
+Delay in ms between drawing cycles. More delay, slower (but smoother
+and less CPU intensive.)
+art.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global
+resources stored in the RESOURCE_MANAGER property.
+.TP 8
+.SH BUGS
+.PP
+.TP 8
+Setting the background to anything besides black confuses the intensity
+algorithm and will look terrible.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by J. Tarbell
+(complex@complexification.net, http://www.complexification.net).
+
+Ported to XScreensaver 2005 by David Agraz.
+.SH AUTHOR
+J. Tarbell <complex@complexification.net>, Jun-03
+
+David Agraz <dagraz@mindspring.com>, Apr-05.
diff --git a/hacks/interference.c b/hacks/interference.c
new file mode 100644
index 0000000..7860143
--- /dev/null
+++ b/hacks/interference.c
@@ -0,0 +1,1001 @@
+/* interference.c --- colored fields via decaying sinusoidal waves.
+ * An entry for the RHAD Labs Screensaver Contest.
+ *
+ * Author: Hannu Mallat <hmallat@cs.hut.fi>
+ *
+ * Copyright (C) 1998 Hannu Mallat.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * decaying sinusoidal waves, which extend spherically from their
+ * respective origins, move around the plane. a sort of interference
+ * between them is calculated and the resulting twodimensional wave
+ * height map is plotted in a grid, using softly changing colours.
+ *
+ * not physically (or in any sense) accurate, but fun to look at for
+ * a while. you may tune the speed/resolution/interestingness tradeoff
+ * with X resources, see below.
+ *
+ * Created : Wed Apr 22 09:30:30 1998, hmallat
+ * Last modified: Wed Apr 22 09:30:30 1998, hmallat
+ * Last modified: Sun Aug 31 23:40:14 2003,
+ * david slimp <rock808@DavidSlimp.com>
+ * added -hue option to specify base color hue
+ * Last modified: Wed May 15 00:04:43 2013,
+ * Dave Odell <dmo2118@gmail.com>
+ * Tuned performance; double-buffering is now off by default.
+ * Made animation speed independent of FPS.
+ * Added cleanup code, fixed a few glitches.
+ * Added gratuitous #ifdefs.
+ * Last modified: Fri Feb 21 02:14:29 2014, <dmo2118@gmail.com>
+ * Added support for SMP rendering.
+ * Tweaked math a bit re: performance.
+ * Last modified: Tue Dec 30 16:43:33 2014, <dmo2118@gmail.com>
+ * Killed the black margin on the right and bottom.
+ * Reduced the default grid size to 2.
+ * Last modified: Sun Oct 9 11:20:48 2016, <dmo2118@gmail.com>
+ * Updated for new xshm.c.
+ * Ditched USE_BIG_XIMAGE.
+ */
+
+#include <math.h>
+#include <errno.h>
+
+#include "screenhack.h"
+
+#include "thread_util.h"
+
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+
+typedef unsigned int uint32_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+
+#endif
+
+/*
+Tested on an Intel(R) Pentium(R) 4 CPU 3.00GHz (family 15, model 6, 2 cores),
+1 GB PC2-4200, nouveau - Gallium 0.4 on NV44, X.Org version: 1.13.3. A very
+modest system by current standards.
+
+Does double-buffering make sense? (gridsize = 2)
+USE_XIMAGE is off: Yes (-db: 4.1 FPS, -no-db: 2.9 FPS)
+XPutImage in strips: No (-db: 35.9 FPS, -no-db: 38.7 FPS)
+XPutImage, whole image: No (-db: 32.3 FPS, -no-db: 33.7 FPS)
+MIT-SHM, whole image: Doesn't work anyway: (-no-db: 37.3 FPS)
+
+If gridsize = 1, XPutImage is slow when the XImage is one line at a time.
+XPutImage in strips: -db: 21.2 FPS, -no-db: 19.7 FPS
+XPutimage, whole image: -db: 23.2 FPS, -no-db: 23.4 FPS
+MIT-SHM: 26.0 FPS
+
+So XPutImage in strips is very slightly faster when gridsize >= 2, but
+quite a bit worse when gridsize = 1.
+*/
+
+/* I thought it would be faster this way, but it turns out not to be... -jwz */
+/* It's a lot faster for me, though - D.O. */
+#define USE_XIMAGE
+
+/* Numbers are wave_table size, measured in # of unsigned integers.
+ * FPS/radius = 50/radius = 800/radius = 1500/Big-O memory usage
+ *
+ * Use at most one of the following:
+ * Both off = regular sqrt() - 13.5 FPS, 50/800/1500. */
+
+/* #define USE_FAST_SQRT_HACKISH */ /* 17.8 FPS/2873/4921/5395/O(lg(radius)) */
+#define USE_FAST_SQRT_BIGTABLE2 /* 26.1 FPS/156/2242/5386/O(radius^2) */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef USE_XIMAGE
+# include "xshm.h"
+#endif /* USE_XIMAGE */
+
+static const char *interference_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*count: 3", /* number of waves */
+ "*gridsize: 2", /* pixel size, smaller values for better resolution */
+ "*ncolors: 192", /* number of colours used */
+ "*hue: 0", /* hue to use for base color (0-360) */
+ "*speed: 30", /* speed of wave origins moving around */
+ "*delay: 30000", /* or something */
+ "*color-shift: 60", /* h in hsv space, smaller values for smaller
+ * color gradients */
+ "*radius: 800", /* wave extent */
+ "*gray: false", /* color or grayscale */
+ "*mono: false", /* monochrome, not very much fun */
+
+ "*doubleBuffer: False", /* doubleBuffer slows things down for me - D.O. */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True", /* use double buffering extension */
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True", /* use shared memory extension */
+#endif /* HAVE_XSHM_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ THREAD_DEFAULTS
+ 0
+};
+
+static XrmOptionDescRec interference_options [] = {
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-gridsize", ".gridsize", XrmoptionSepArg, 0 },
+ { "-hue", ".hue", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-color-shift", ".color-shift", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-gray", ".gray", XrmoptionNoArg, "True" },
+ { "-mono", ".mono", XrmoptionNoArg, "True" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+#ifdef HAVE_XSHM_EXTENSION
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+ THREAD_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+struct inter_source {
+ int x;
+ int y;
+ double x_theta;
+ double y_theta;
+};
+
+struct inter_context {
+ /*
+ * Display-related entries
+ */
+ Display* dpy;
+ Window win;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer back_buf;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ Pixmap pix_buf;
+
+ GC copy_gc;
+#ifdef USE_XIMAGE
+ XImage *ximage;
+
+ Bool shm_can_draw;
+ XShmSegmentInfo shm_info;
+#endif /* USE_XIMAGE */
+
+ /*
+ * Resources
+ */
+ int count;
+ int grid_size;
+ int colors;
+ float hue;
+ int speed;
+ int delay;
+ int shift;
+
+ /*
+ * Drawing-related entries
+ */
+ int w;
+ int h;
+ unsigned w_div_g, h_div_g;
+ Colormap cmap;
+ Screen *screen;
+ unsigned bits_per_pixel;
+ XColor* pal;
+#ifndef USE_XIMAGE
+ GC* gcs;
+#endif
+ int radius; /* Not always the same as the X resource. */
+ double last_frame;
+
+ struct threadpool threadpool;
+
+ /*
+ * lookup tables
+ */
+ unsigned* wave_height;
+
+ /*
+ * Interference sources
+ */
+ struct inter_source* source;
+};
+
+struct inter_thread
+{
+ const struct inter_context *context;
+ unsigned thread_id;
+
+#ifdef USE_XIMAGE
+ uint32_t* row;
+#endif
+
+ unsigned* result_row;
+};
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# define TARGET(c) ((c)->back_buf ? (c)->back_buf : \
+ (c)->pix_buf ? (c)->pix_buf : (c)->win)
+#else /* HAVE_DOUBLE_BUFFER_EXTENSION */
+# define TARGET(c) ((c)->pix_buf ? (c)->pix_buf : (c)->win)
+#endif /* !HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef USE_FAST_SQRT_HACKISH
+/* Based loosely on code from Wikipedia:
+ * https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Approximations_that_depend_on_IEEE_representation
+ */
+
+/* FAST_SQRT_EXTRA_BITS = 3: Smallest useful value
+ * = 5/6: A little bit of banding, wave_height table is on par with regular
+ * sqrt() code.
+ * = 7: No apparent difference with original @ radius = 800.
+ * = 8: One more just to be comfortable.
+ */
+
+# define FAST_SQRT_EXTRA_BITS 8
+
+union int_float
+{
+ uint32_t i;
+ float f;
+};
+
+static unsigned fast_log2(unsigned x)
+{
+ union int_float u;
+ if(!x)
+ return x;
+ u.f = x;
+ return ((u.i - 0x3f800000) >> (23 - FAST_SQRT_EXTRA_BITS)) + 1;
+}
+
+static float fast_inv_log2(unsigned x)
+{
+ union int_float u;
+ if(!x)
+ return 0.0f;
+ u.i = ((x - 1) << (23 - FAST_SQRT_EXTRA_BITS)) + 0x3f800000;
+ return u.f;
+}
+
+#endif
+
+#ifdef USE_FAST_SQRT_BIGTABLE2
+
+/* I eyeballed these figures. They could be improved. - D.O. */
+
+# define FAST_SQRT_DISCARD_BITS1 4
+/* = 5: Dot in center is almost invisible at radius = 800. */
+/* = 4: Dot in center looks OK at radius = 50. */
+
+/* 156/2740/9029 */
+/* # define FAST_SQRT_DISCARD_BITS2 8 */
+/* # define FAST_SQRT_CUTOFF 64 * 64 */
+
+/* 156/2242/5386 */
+# define FAST_SQRT_DISCARD_BITS2 9
+# define FAST_SQRT_CUTOFF 128 * 128
+
+/*
+ * This is a little faster:
+ * 44.5 FPS, 19/5000/17578
+ *
+ * # define FAST_SQRT_DISCARD_BITS1 7
+ * # define FAST_SQRT_DISCARD_BITS2 7
+ * # define FAST_SQRT_CUTOFF 0
+ *
+ * For radius = 800, FAST_SQRT_DISCARD_BITS2 =
+ * = 9/10: Approximately the original table size, some banding near origins.
+ * = 7: wave_height is 20 KB, and just fits inside a 32K L1 cache.
+ * = 6: Nearly indistinguishable from original
+ */
+
+/*
+ FAST_TABLE(x) is equivalent to, but slightly faster than:
+ x < FAST_SQRT_CUTOFF ?
+ (x >> FAST_SQRT_DISCARD_BITS1) :
+ ((x - FAST_SQRT_CUTOFF) >> FAST_SQRT_DISCARD_BITS2) +
+ (FAST_SQRT_CUTOFF >> FAST_SQRT_DISCARD_BITS1);
+*/
+
+#define FAST_TABLE(x) \
+ ((x) < FAST_SQRT_CUTOFF ? \
+ ((x) >> FAST_SQRT_DISCARD_BITS1) : \
+ (((x) + \
+ ((FAST_SQRT_CUTOFF << (FAST_SQRT_DISCARD_BITS2 - \
+ FAST_SQRT_DISCARD_BITS1)) - FAST_SQRT_CUTOFF)) >> \
+ FAST_SQRT_DISCARD_BITS2))
+
+static double fast_inv_table(unsigned x)
+{
+ return x < (FAST_SQRT_CUTOFF >> FAST_SQRT_DISCARD_BITS1) ?
+ (x << FAST_SQRT_DISCARD_BITS1) :
+ ((x - (FAST_SQRT_CUTOFF >> FAST_SQRT_DISCARD_BITS1)) <<
+ FAST_SQRT_DISCARD_BITS2) + FAST_SQRT_CUTOFF;
+}
+
+#endif
+
+static void destroy_image(Display* dpy, struct inter_context* c)
+{
+#ifdef USE_XIMAGE
+ if(c->ximage) {
+ destroy_xshm_image(dpy, c->ximage, &c->shm_info);
+ }
+#endif
+
+ if(c->threadpool.count)
+ {
+ threadpool_destroy(&c->threadpool);
+ c->threadpool.count = 0;
+ }
+}
+
+static void inter_free(Display* dpy, struct inter_context* c)
+{
+#ifndef USE_XIMAGE
+ unsigned i;
+#endif
+
+ if(c->pix_buf)
+ XFreePixmap(dpy, c->pix_buf);
+
+ if(c->copy_gc)
+ XFreeGC(dpy, c->copy_gc);
+
+ destroy_image(dpy, c);
+
+ if(c->colors <= 2)
+ free(c->pal);
+ else if(c->pal)
+ free_colors(c->screen, c->cmap, c->pal, c->colors);
+
+#ifndef USE_XIMAGE
+ for(i = 0; i != c->colors; ++i)
+ XFreeGC(dpy, c->gcs[i]);
+ free(c->gcs);
+#endif
+
+ free(c->wave_height);
+ free(c->source);
+}
+
+static void abort_on_error(int error)
+{
+ fprintf(stderr, "interference: %s\n", strerror(error));
+ exit(1);
+}
+
+static void abort_no_mem(void)
+{
+ abort_on_error(ENOMEM);
+}
+
+static void check_no_mem(Display* dpy, struct inter_context* c, void* ptr)
+{
+ if(!ptr) {
+ inter_free(dpy, c);
+ abort_no_mem();
+ }
+}
+
+static int inter_thread_create(
+ void* self_raw,
+ struct threadpool* pool,
+ unsigned id)
+{
+ struct inter_thread* self = (struct inter_thread*)self_raw;
+ const struct inter_context* c = GET_PARENT_OBJ(struct inter_context, threadpool, pool);
+
+ self->context = c;
+ self->thread_id = id;
+
+ self->result_row = malloc(c->w_div_g * sizeof(unsigned));
+ if(!self->result_row)
+ return ENOMEM;
+
+#ifdef USE_XIMAGE
+ self->row = malloc(c->w_div_g * sizeof(uint32_t));
+ if(!self->row) {
+ free(self->result_row);
+ return ENOMEM;
+ }
+#endif
+
+ return 0;
+}
+
+static void inter_thread_destroy(void* self_raw)
+{
+ struct inter_thread* self = (struct inter_thread*)self_raw;
+#ifdef USE_XIMAGE
+ free(self->row);
+#endif
+ free(self->result_row);
+}
+
+/*
+A higher performance design would have input and output queues, so that when
+worker threads finish with one frame, they can pull the next work order from
+the queue and get started on it immediately, rather than going straight to
+sleep. The current "single-buffered" design still provides reasonable
+performance at low frame rates; high frame rates are noticeably less efficient.
+*/
+
+static void inter_thread_run(void* self_raw)
+{
+ struct inter_thread* self = (struct inter_thread*)self_raw;
+ const struct inter_context* c = self->context;
+
+ int i, j, k;
+ unsigned result;
+ int dist1;
+ int g = c->grid_size;
+
+ int dx, dy, g2 = 2 * g * g;
+ int px, py, px2g;
+
+ int dist0, ddist;
+
+#ifdef USE_XIMAGE
+ unsigned img_y = g * self->thread_id;
+ void *scanline = c->ximage->data + c->ximage->bytes_per_line * g * self->thread_id;
+#endif
+
+ for(j = self->thread_id; j < c->h_div_g; j += c->threadpool.count) {
+ px = g/2;
+ py = j*g + px;
+
+ memset(self->result_row, 0, c->w_div_g * sizeof(unsigned));
+
+ for(k = 0; k < c->count; k++) {
+
+ dx = px - c->source[k].x;
+ dy = py - c->source[k].y;
+
+ dist0 = dx*dx + dy*dy;
+ ddist = -2 * g * c->source[k].x;
+
+ /* px2g = g*(px*2 + g); */
+ px2g = g2;
+
+ for(i = 0; i < c->w_div_g; i++) {
+ /*
+ * Discarded possibilities for improving performance here:
+ * 1. Using octagon-based distance estimation
+ * (Which causes giant octagons to appear.)
+ * 2. Square root approximation by reinterpret-casting IEEE floats to
+ * integers.
+ * (Which causes angles to appear when two waves interfere.)
+ */
+
+/* int_float u;
+ u.f = dx*dx + dy*dy;
+ u.i = (1 << 29) + (u.i >> 1) - (1 << 22);
+ dist = u.f; */
+
+#if defined USE_FAST_SQRT_BIGTABLE2
+ dist1 = FAST_TABLE(dist0);
+#elif defined USE_FAST_SQRT_HACKISH
+ dist1 = fast_log2(dist0);
+#else
+ dist1 = sqrt(dist0);
+#endif
+
+ if(dist1 < c->radius)
+ self->result_row[i] += c->wave_height[dist1];
+
+ dist0 += px2g + ddist;
+ px2g += g2;
+ }
+ }
+
+ for(i = 0; i < c->w_div_g; i++) {
+
+ result = self->result_row[i];
+
+ /* It's slightly faster to do a subtraction or two before calculating the
+ * modulus. - D.O. */
+ if(result >= c->colors)
+ {
+ result -= c->colors;
+ if(result >= c->colors)
+ result %= (unsigned)c->colors;
+ }
+
+#ifdef USE_XIMAGE
+ self->row[i] = c->pal[result].pixel;
+#else
+ XFillRectangle(c->dpy, TARGET(c), c->gcs[result], g*i, g*j, g, g);
+#endif /* USE_XIMAGE */
+ }
+
+#ifdef USE_XIMAGE
+ /* Fill in these `gridsize' horizontal bits in the scanline */
+ if(c->ximage->bits_per_pixel == 32)
+ {
+ uint32_t *ptr = (uint32_t *)scanline;
+ for(i = 0; i < c->w_div_g; i++) {
+ for(k = 0; k < g; k++)
+ ptr[g*i+k] = self->row[i];
+ }
+ }
+ else if(c->ximage->bits_per_pixel == 24)
+ {
+ uint8_t *ptr = (uint8_t *)scanline;
+ for(i = 0; i < c->w_div_g; i++) {
+ for(k = 0; k < g; k++) {
+ uint32_t pixel = self->row[i];
+ /* Might not work on big-endian. */
+ ptr[0] = pixel;
+ ptr[1] = (pixel & 0x0000ff00) >> 8;
+ ptr[2] = (pixel & 0x00ff0000) >> 16;
+ ptr += 3;
+ }
+ }
+ }
+ else if(c->ximage->bits_per_pixel == 16)
+ {
+ uint16_t *ptr = (uint16_t *)scanline;
+ for(i = 0; i < c->w_div_g; i++) {
+ for(k = 0; k < g; k++)
+ ptr[g*i+k] = self->row[i];
+ }
+ }
+ else if(c->ximage->bits_per_pixel == 8)
+ {
+ uint8_t *ptr = (uint8_t *)scanline;
+ for(i = 0; i < c->w_div_g; i++) {
+ for(k = 0; k < g; k++)
+ ptr[g*i+k] = self->row[i];
+ }
+ }
+ else
+ {
+ for(i = 0; i < c->w_div_g; i++) {
+ for(k = 0; k < g; k++)
+ /* XPutPixel is thread safe as long as the XImage didn't have its
+ * bits_per_pixel changed. */
+ XPutPixel(c->ximage, (g*i)+k, img_y, self->row[i]);
+ }
+ }
+
+ /* Only the first scanline of the image has been filled in; clone that
+ scanline to the rest of the `gridsize' lines in the ximage */
+ for(k = 0; k < (g-1); k++)
+ memcpy(c->ximage->data + (c->ximage->bytes_per_line * (img_y + k + 1)),
+ c->ximage->data + (c->ximage->bytes_per_line * img_y),
+ c->ximage->bytes_per_line);
+
+ scanline = (char *)scanline +
+ c->ximage->bytes_per_line * g * c->threadpool.count;
+ img_y += g * c->threadpool.count;
+
+#endif /* USE_XIMAGE */
+ }
+}
+
+/* On allocation error, c->ximage == NULL. */
+static void create_image(
+ Display* dpy,
+ struct inter_context* c,
+ const XWindowAttributes* xgwa)
+{
+#ifdef USE_XIMAGE
+
+ /* Set the width so that each thread can work on a different line. */
+ unsigned align = thread_memory_alignment(dpy) * 8 - 1;
+ unsigned wbits, w, h;
+#endif /* USE_XIMAGE */
+
+ c->w = xgwa->width;
+ c->h = xgwa->height;
+ c->w_div_g = (c->w + c->grid_size - 1) / c->grid_size;
+ c->h_div_g = (c->h + c->grid_size - 1) / c->grid_size;
+
+#ifdef USE_XIMAGE
+ w = c->w_div_g * c->grid_size;
+ h = c->h_div_g * c->grid_size;
+
+ /* The width of a scan line, in *bits*. */
+ wbits = (w * c->bits_per_pixel + align) & ~align;
+
+ /* This uses a lot more RAM than the single line approach. Users without
+ * enough RAM to fit even a single framebuffer should consider an upgrade for
+ * their 386. - D.O.
+ */
+
+ c->ximage = create_xshm_image(dpy, xgwa->visual, xgwa->depth,
+ ZPixmap, &c->shm_info,
+ wbits / c->bits_per_pixel, h);
+
+ c->shm_can_draw = True;
+
+ check_no_mem(dpy, c, c->ximage);
+#endif /* USE_XIMAGE */
+
+ {
+ static const struct threadpool_class cls =
+ {
+ sizeof(struct inter_thread),
+ inter_thread_create,
+ inter_thread_destroy
+ };
+
+ int error = threadpool_create(
+ &c->threadpool,
+ &cls,
+ dpy,
+#ifdef USE_XIMAGE
+ hardware_concurrency(dpy)
+#else
+ 1
+ /* At least two issues with threads without USE_XIMAGE:
+ * 1. Most of Xlib isn't thread safe without XInitThreads.
+ * 2. X(Un)LockDisplay would need to be called for each line, which is
+ * terrible.
+ */
+#endif
+ );
+
+ if(error) {
+ c->threadpool.count = 0; /* See the note in thread_util.h. */
+ inter_free(dpy, c);
+ abort_on_error(error);
+ }
+ }
+}
+
+static void create_pix_buf(Display* dpy, Window win, struct inter_context *c,
+ const XWindowAttributes* xgwa)
+{
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if(c->back_buf)
+ return;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ c->pix_buf = XCreatePixmap(dpy, win, xgwa->width, xgwa->height, xgwa->depth);
+}
+
+static double float_time(void)
+{
+ struct timeval result;
+ gettimeofday(
+ &result
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ , NULL
+#endif
+ );
+
+ return result.tv_usec * 1.0e-6 + result.tv_sec;
+}
+
+static void inter_init(Display* dpy, Window win, struct inter_context* c)
+{
+ XWindowAttributes xgwa;
+ double H[3], S[3], V[3];
+ int i;
+ int mono;
+ int gray;
+ int radius;
+ double scale = 1;
+ XGCValues val;
+ Bool dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
+
+#ifndef USE_XIMAGE
+ unsigned long valmask = 0;
+#endif
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ dbuf = False;
+# endif
+
+ memset (c, 0, sizeof(*c));
+
+ c->dpy = dpy;
+ c->win = win;
+
+
+ c->delay = get_integer_resource(dpy, "delay", "Integer");
+
+ XGetWindowAttributes(c->dpy, c->win, &xgwa);
+ c->cmap = xgwa.colormap;
+ c->screen = xgwa.screen;
+ c->bits_per_pixel = visual_pixmap_depth(xgwa.screen, xgwa.visual);
+ check_no_mem(dpy, c, (void *)(ptrdiff_t)c->bits_per_pixel);
+
+ val.function = GXcopy;
+ c->copy_gc = XCreateGC(c->dpy, TARGET(c), GCFunction, &val);
+
+ c->count = get_integer_resource(dpy, "count", "Integer");
+ if(c->count < 1)
+ c->count = 1;
+ c->grid_size = get_integer_resource(dpy, "gridsize", "Integer");
+ if(c->grid_size < 1)
+ c->grid_size = 1;
+ mono = get_boolean_resource(dpy, "mono", "Boolean");
+ if(!mono) {
+ c->colors = get_integer_resource(dpy, "ncolors", "Integer");
+ if(c->colors < 2)
+ c->colors = 2;
+ }
+ c->hue = get_integer_resource(dpy, "hue", "Float");
+ while (c->hue < 0 || c->hue >= 360)
+ c->hue = frand(360.0);
+ c->speed = get_integer_resource(dpy, "speed", "Integer");
+ c->shift = get_float_resource(dpy, "color-shift", "Float");
+ while(c->shift >= 360.0)
+ c->shift -= 360.0;
+ while(c->shift <= -360.0)
+ c->shift += 360.0;
+ radius = get_integer_resource(dpy, "radius", "Integer");;
+ if(radius < 1)
+ radius = 1;
+
+ if (xgwa.width > 2560) scale = 3.5; /* Retina displays */
+ radius *= scale;
+
+ create_image(dpy, c, &xgwa);
+
+ if(!mono) {
+ c->pal = calloc(c->colors, sizeof(XColor));
+ check_no_mem(dpy, c, c->pal);
+
+ gray = get_boolean_resource(dpy, "gray", "Boolean");
+ if(!gray) {
+ H[0] = c->hue;
+ H[1] = H[0] + c->shift < 360.0 ? H[0]+c->shift : H[0] + c->shift-360.0;
+ H[2] = H[1] + c->shift < 360.0 ? H[1]+c->shift : H[1] + c->shift-360.0;
+ S[0] = S[1] = S[2] = 1.0;
+ V[0] = V[1] = V[2] = 1.0;
+ } else {
+ H[0] = H[1] = H[2] = 0.0;
+ S[0] = S[1] = S[2] = 0.0;
+ V[0] = 1.0; V[1] = 0.5; V[2] = 0.0;
+ }
+
+ make_color_loop(c->screen, xgwa.visual, c->cmap,
+ H[0], S[0], V[0],
+ H[1], S[1], V[1],
+ H[2], S[2], V[2],
+ c->pal, &(c->colors),
+ True, False);
+ if(c->colors < 2) { /* color allocation failure */
+ mono = 1;
+ free(c->pal);
+ }
+ }
+
+ if(mono) { /* DON'T else this with the previous if! */
+ c->colors = 2;
+ c->pal = calloc(2, sizeof(XColor));
+ check_no_mem(dpy, c, c->pal);
+ c->pal[0].pixel = BlackPixel(c->dpy, DefaultScreen(c->dpy));
+ c->pal[1].pixel = WhitePixel(c->dpy, DefaultScreen(c->dpy));
+ }
+
+#ifdef USE_XIMAGE
+ dbuf = False;
+ /* Double-buffering doesn't work with MIT-SHM: XShmPutImage must draw to the
+ * window. Otherwise, XShmCompletion events will have the XAnyEvent::window
+ * field set to the back buffer, and XScreenSaver will ignore the event.
+ */
+#endif
+
+ if (dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ c->back_buf = xdbe_get_backbuffer (c->dpy, c->win, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ create_pix_buf(dpy, win, c, &xgwa);
+ }
+
+#ifndef USE_XIMAGE
+ valmask = GCForeground;
+ c->gcs = calloc(c->colors, sizeof(GC));
+ check_no_mem(dpy, c, c->gcs);
+ for(i = 0; i < c->colors; i++) {
+ val.foreground = c->pal[i].pixel;
+ c->gcs[i] = XCreateGC(c->dpy, TARGET(c), valmask, &val);
+ }
+#endif
+
+#if defined USE_FAST_SQRT_HACKISH
+ c->radius = fast_log2(radius * radius);
+#elif defined USE_FAST_SQRT_BIGTABLE2
+ c->radius = radius * radius;
+ c->radius = FAST_TABLE(c->radius);
+#else
+ c->radius = radius;
+#endif
+
+ if (c->radius < 1) c->radius = 1;
+ c->wave_height = calloc(c->radius, sizeof(unsigned));
+ check_no_mem(dpy, c, c->wave_height);
+
+ for(i = 0; i < c->radius; i++) {
+ float max, fi;
+#if defined USE_FAST_SQRT_HACKISH
+ fi = sqrt(fast_inv_log2(i));
+#elif defined USE_FAST_SQRT_BIGTABLE2
+ fi = sqrt(fast_inv_table(i));
+#else
+ fi = i;
+#endif
+ max =
+ ((float)c->colors) *
+ ((float)radius - fi) /
+ ((float)radius);
+ c->wave_height[i] =
+ (unsigned)
+ ((max + max*cos(fi/(50.0 * scale))) / 2.0);
+ }
+
+ c->source = calloc(c->count, sizeof(struct inter_source));
+ check_no_mem(dpy, c, c->source);
+
+ for(i = 0; i < c->count; i++) {
+ c->source[i].x_theta = frand(2.0)*3.14159;
+ c->source[i].y_theta = frand(2.0)*3.14159;
+ }
+
+ c->last_frame = float_time();
+}
+
+#define source_x(c, i) \
+ (c->w/2 + ((int)(cos(c->source[i].x_theta)*((float)c->w/2.0))))
+#define source_y(c, i) \
+ (c->h/2 + ((int)(cos(c->source[i].y_theta)*((float)c->h/2.0))))
+
+/*
+ * This is somewhat suboptimal. Calculating the distance per-pixel is going to
+ * be a lot slower than using now-ubiquitous SIMD CPU instructions to do four
+ * or eight pixels at a time.
+ */
+
+static unsigned long do_inter(struct inter_context* c)
+{
+ int i;
+
+ double now;
+ float elapsed;
+
+#ifdef USE_XIMAGE
+ /* Wait a little while for the XServer to become ready if necessary. */
+ if(!c->shm_can_draw)
+ return 2000;
+#endif
+
+ now = float_time();
+ elapsed = (now - c->last_frame) * 10.0;
+
+ c->last_frame = now;
+
+ for(i = 0; i < c->count; i++) {
+ c->source[i].x_theta += (elapsed*c->speed/1000.0);
+ if(c->source[i].x_theta > 2.0*3.14159)
+ c->source[i].x_theta -= 2.0*3.14159;
+ c->source[i].y_theta += (elapsed*c->speed/1000.0);
+ if(c->source[i].y_theta > 2.0*3.14159)
+ c->source[i].y_theta -= 2.0*3.14159;
+ c->source[i].x = source_x(c, i);
+ c->source[i].y = source_y(c, i);
+ }
+
+ threadpool_run(&c->threadpool, inter_thread_run);
+ threadpool_wait(&c->threadpool);
+
+#ifdef USE_XIMAGE
+ put_xshm_image(c->dpy, c->win, c->copy_gc, c->ximage, 0, 0, 0, 0,
+ c->ximage->width, c->ximage->height, &c->shm_info);
+ /* c->shm_can_draw = False; */
+#endif
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (c->back_buf)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = c->win;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers(c->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (c->pix_buf)
+ {
+ XCopyArea (c->dpy, c->pix_buf, c->win, c->copy_gc,
+ 0, 0, c->w, c->h, 0, 0);
+ }
+
+ return c->delay;
+}
+
+static void *
+interference_init (Display *dpy, Window win)
+{
+ struct inter_context *c = (struct inter_context *) calloc (1, sizeof(*c));
+ if(!c)
+ abort_no_mem();
+ inter_init(dpy, win, c);
+ return c;
+}
+
+static unsigned long
+interference_draw (Display *dpy, Window win, void *closure)
+{
+ struct inter_context *c = (struct inter_context *) closure;
+ return do_inter(c);
+}
+
+static void
+interference_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct inter_context *c = (struct inter_context *) closure;
+ XWindowAttributes xgwa;
+ Bool dbuf = (!!c->pix_buf
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ || c->back_buf
+# endif
+ );
+
+#ifdef USE_XIMAGE
+ destroy_image(dpy, c);
+ c->ximage = 0;
+#endif
+
+ if(c->pix_buf)
+ XFreePixmap(dpy, c->pix_buf);
+ c->pix_buf = None;
+
+ XGetWindowAttributes(dpy, window, &xgwa);
+ xgwa.width = w;
+ xgwa.height = h;
+ create_image(dpy, c, &xgwa);
+ if(dbuf)
+ create_pix_buf(dpy, window, c, &xgwa);
+}
+
+static Bool
+interference_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+#if HAVE_XSHM_EXTENSION
+ struct inter_context *c = (struct inter_context *) closure;
+
+ if(event->type == XShmGetEventBase(dpy) + ShmCompletion)
+ {
+ c->shm_can_draw = True;
+ return True;
+ }
+#endif
+ return False;
+}
+
+static void
+interference_free (Display *dpy, Window window, void *closure)
+{
+ struct inter_context *c = (struct inter_context *) closure;
+ inter_free(dpy, c);
+}
+
+XSCREENSAVER_MODULE ("Interference", interference)
+
diff --git a/hacks/interference.man b/hacks/interference.man
new file mode 100644
index 0000000..87866c8
--- /dev/null
+++ b/hacks/interference.man
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+interference - decaying sinusoidal waves
+.SH SYNOPSIS
+.B interference
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-gridsize \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-radius \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-color-shift \fInumber\fP]
+[\-hue \fInumber\fP]
+[\-no-db]
+[\-fps]
+.SH DESCRIPTION
+Another color-field hack, this one works by computing decaying sinusoidal
+waves, and allowing them to interfere with each other as their origins
+move.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Number of Waves. 0 - 20. Default: 3.
+.TP 8
+.B \-gridsize \fInumber\fP
+Magnification. 1 - 20. Default: 2.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Wave Speed. 1 - 100. Default: 30.
+.TP 8
+.B \-radius \fInumber\fP
+Wave Size. 50 - 1500. Default: 800.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 192.
+.TP 8
+.B \-color-shift \fInumber\fP
+Color Contrast. 0 - 100. Default: 60.
+.TP 8
+.B \-hue \fInumber\fP
+Hue of the base color (0-360, as in HSV space.) Default 0, meaning random.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Hannu Mallat. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Hannu Mallat.
diff --git a/hacks/intermomentary.c b/hacks/intermomentary.c
new file mode 100644
index 0000000..4e65b76
--- /dev/null
+++ b/hacks/intermomentary.c
@@ -0,0 +1,577 @@
+/*
+ * InterMomentary (dragorn@kismetwireless.net)
+ * Directly ported code from complexification.net InterMomentary art
+ * http://www.complexification.net/gallery/machines/interMomentary/applet_l/interMomentary_l.pde
+ *
+ * Intersecting Circles, Instantaneous
+ * J. Tarbell + complexification.net
+ * Albuquerque, New Mexico
+ * May, 2004
+ *
+ * a REAS collaboration for the + groupc.net
+ * Whitney Museum of American Art ARTPORT + artport.whitney.org
+ * Robert Hodgin + flight404.com
+ * William Ngan + metaphorical.net
+ *
+ *
+ * 1.0 Oct 10 2004 dragorn Completed first port
+ *
+ *
+ * Based, of course, on other hacks in:
+ *
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "hsv.h"
+
+/* this program goes faster if some functions are inline. The following is
+ * borrowed from ifs.c */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+
+/* Pixel rider */
+typedef struct {
+ float t;
+ float vt;
+ float mycharge;
+} PxRider;
+
+/* disc of light */
+typedef struct {
+ /* index identifier */
+ int id;
+ /* position */
+ float x, y;
+ /* radius */
+ float r, dr;
+ /* velocity */
+ float vx, vy;
+
+ /* pixel riders */
+ int numr;
+ PxRider *pxRiders;
+} Disc;
+
+struct field {
+ unsigned int height;
+ unsigned int width;
+
+ int initial_discs;
+ Disc *discs;
+
+ unsigned int num;
+
+ unsigned int maxrider;
+ unsigned int maxradius;
+
+ /* color parms */
+ unsigned long fgcolor;
+ unsigned long bgcolor;
+ int visdepth;
+
+ unsigned int cycles;
+
+ /* Offscreen image we draw to */
+ Pixmap off_map;
+ unsigned char *off_alpha;
+};
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ struct field *f;
+ GC fgc, copygc;
+ XWindowAttributes xgwa;
+ int draw_delay;
+
+ XColor *colors;
+ int ncolors;
+};
+
+
+static void *xrealloc(void *p, size_t size)
+{
+ void *ret;
+ if ((ret = realloc(p, size)) == NULL) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ return ret;
+}
+
+static struct field *init_field(void)
+{
+ struct field *f = xrealloc(NULL, sizeof(struct field));
+ f->height = 0;
+ f->width = 0;
+ f->initial_discs = 0;
+ f->discs = NULL;
+ f->num = 0;
+ f->maxrider = 0;
+ f->maxradius = 0;
+ f->cycles = 0;
+ f->fgcolor = 0;
+ f->bgcolor = 0;
+ f->off_alpha = NULL;
+ f->visdepth = 0;
+ return f;
+}
+
+/* Quick-ref to pixels in the alpha map */
+#define ref_pixel(f, x, y) ((f)->off_alpha[(y) * (f)->width + (x)])
+
+static inline void make_disc(struct field *f, float x, float y, float vx, float vy, float r)
+{
+ /* Synthesis of Disc::Disc and PxRider::PxRider */
+ Disc *nd;
+ int ix;
+
+ /* allocate a new disc */
+ f->discs = (Disc *) xrealloc(f->discs, sizeof(Disc) * (f->num + 1));
+
+ nd = &(f->discs[f->num]);
+
+ nd->id = f->num++;
+ nd->x = x;
+ nd->y = y;
+ nd->vx = vx;
+ nd->vy = vy;
+ nd->dr = r;
+ nd->r = frand(r) / 3;
+
+ nd->numr = (frand(r) / 2.62);
+ if (nd->numr > f->maxrider)
+ nd->numr = f->maxrider;
+
+ nd->pxRiders = NULL;
+ nd->pxRiders = (PxRider *) xrealloc(nd->pxRiders, sizeof(PxRider) * (f->maxrider));
+ for (ix = 0; ix < f->maxrider; ix++) {
+ nd->pxRiders[ix].vt = 0.0;
+ nd->pxRiders[ix].t = frand(M_PI * 2);
+ nd->pxRiders[ix].mycharge = 0;
+ }
+}
+
+
+/* alpha blended point drawing */
+static inline unsigned long
+trans_point(struct state *st,
+ int x1, int y1, unsigned char myc, float a, struct field *f)
+{
+ if ((x1 >= 0) && (x1 < f->width) && (y1 >= 0) && (y1 < f->height)) {
+ if (a >= 1.0) {
+ ref_pixel(f, x1, y1) = myc;
+ } else {
+ unsigned long c = ref_pixel(f, x1, y1);
+ c = c + (myc - c) * a;
+ ref_pixel(f, x1, y1) = c;
+ return c;
+ }
+ }
+
+ return 0;
+}
+
+static inline unsigned long
+get_pixel (struct state *st, unsigned char v)
+{
+ return st->colors [v * (st->ncolors-1) / 255].pixel;
+}
+
+
+static inline void move_disc(struct field *f, int dnum)
+{
+ Disc *d = &(f->discs[dnum]);
+
+ /* add velocity to position */
+ d->x += d->vx;
+ d->y += d->vy;
+
+ /* bound check */
+ if (d->x + d->r < 0)
+ d->x += f->width + d->r + d->r;
+ if (d->x - d->r > f->width)
+ d->x -= f->width + d->r + d->r;
+ if (d->y + d->r < 0)
+ d->y += f->height + d->r + d->r;
+ if (d->y - d->r > f->height)
+ d->y -= f->height + d->r + d->r;
+
+ /* increase to destination radius */
+ if (d->r < d->dr)
+ d->r += 0.1;
+}
+
+static inline void
+draw_glowpoint(struct state *st, Drawable drawable,
+ GC fgc, struct field *f, float px, float py)
+{
+ int i, j;
+ float a;
+ unsigned long c;
+
+ for (i = -2; i < 3; i++) {
+ for (j = -2; j < 3; j++) {
+ a = 0.8 - i * i * 0.1 - j * j * 0.1;
+
+ c = trans_point(st, px+i, py+j, 255, a, f);
+ XSetForeground(st->dpy, fgc, get_pixel (st, c));
+ XDrawPoint(st->dpy, drawable, fgc, px + i, py + j);
+ XSetForeground(st->dpy, fgc, f->fgcolor);
+ }
+ }
+}
+
+static inline void
+moverender_rider(struct state *st, Drawable drawable,
+ GC fgc, struct field *f, PxRider *rid,
+ float x, float y, float r)
+{
+ float px, py;
+ unsigned long int c;
+ double cv;
+
+ /* add velocity to theta */
+ rid->t = fmod((rid->t + rid->vt + M_PI), (2 * M_PI)) - M_PI;
+
+ rid->vt += frand(0.002) - 0.001;
+
+ /* apply friction brakes */
+ if (fabsf(rid->vt) > 0.02)
+ rid->vt *= 0.9;
+
+ /* draw */
+ px = x + r * cos(rid->t);
+ py = y + r * sin(rid->t);
+
+ if ((px < 0) || (px >= f->width) || (py < 0) || (py >= f->height))
+ return;
+
+ /* max brightness seems to be 0.003845 */
+
+ c = ref_pixel(f, (int) px, (int) py);
+ cv = c / 255.0;
+
+ /* guestimated - 40 is 18% of 255, so scale this to 0.0 to 0.003845 */
+ if (cv > 0.0006921) {
+ draw_glowpoint(st, drawable, fgc, f, px, py);
+
+ rid->mycharge = 0.003845;
+ } else {
+ rid->mycharge *= 0.98;
+
+ c = 255 * rid->mycharge;
+
+ trans_point(st, px, py, c, 0.5, f);
+
+ XSetForeground(st->dpy, fgc, get_pixel(st, c));
+ XDrawPoint(st->dpy, drawable, fgc, px, py);
+ XSetForeground(st->dpy, fgc, f->fgcolor);
+ }
+}
+
+static inline void
+render_disc(struct state *st, Drawable drawable, GC fgc, struct field *f, int dnum)
+{
+ Disc *di = &(f->discs[dnum]);
+ int n, m;
+ float dx, dy, d;
+ float a, p2x, p2y, h, p3ax, p3ay, p3bx, p3by;
+ unsigned long c;
+
+ /* Find intersecting points with all ascending discs */
+ for (n = di->id + 1; n < f->num; n++) {
+ dx = f->discs[n].x - di->x;
+ dy = f->discs[n].y - di->y;
+ d = sqrt(dx * dx + dy * dy);
+
+ /* intersection test */
+ if (d < (f->discs[n].r + di->r)) {
+ /* complete containment test */
+ if (d > fabsf(f->discs[n].r - di->r)) {
+ /* find solutions */
+ a = (di->r * di->r - f->discs[n].r * f->discs[n].r + d * d) / (2 * d);
+ p2x = di->x + a * (f->discs[n].x - di->x) / d;
+ p2y = di->y + a * (f->discs[n].y - di->y) / d;
+
+ h = sqrt(di->r * di->r - a * a);
+
+ p3ax = p2x + h * (f->discs[n].y - di->y) / d;
+ p3ay = p2y - h * (f->discs[n].x - di->x) / d;
+
+ p3bx = p2x - h * (f->discs[n].y - di->y) / d;
+ p3by = p2y + h * (f->discs[n].x - di->x) / d;
+
+ /* bounds check */
+ if ((p3ax < 0) || (p3ax >= f->width) || (p3ay < 0) || (p3ay >= f->height) ||
+ (p3bx < 0) || (p3bx >= f->width) || (p3by < 0) || (p3by >= f->height))
+ continue;
+
+ /* p3a and p3b might be identical, ignore this case for now */
+ /* XPutPixel(f->off_map, p3ax, p3ay, f->fgcolor); */
+ c = trans_point(st, p3ax, p3ay, 255, 0.75, f);
+ XSetForeground(st->dpy, fgc, get_pixel (st, c));
+ XDrawPoint(st->dpy, drawable, fgc, p3ax, p3ay);
+
+ /* XPutPixel(f->off_map, p3bx, p3by, f->fgcolor); */
+ c = trans_point(st, p3bx, p3by, 255, 0.75, f);
+ XSetForeground(st->dpy, fgc, get_pixel (st, c));
+ XDrawPoint(st->dpy, drawable, fgc, p3bx, p3by);
+ XSetForeground(st->dpy, fgc, f->fgcolor);
+ }
+ }
+
+ }
+
+ /* Render all the pixel riders */
+ for (m = 0; m < di->numr; m++) {
+ moverender_rider(st, drawable, fgc, f, &(di->pxRiders[m]),
+ di->x, di->y, di->r);
+ }
+}
+
+static void build_img(Display *dpy, Window window, struct field *f)
+{
+ if (f->off_alpha) {
+ free(f->off_alpha);
+ f->off_alpha = NULL;
+
+ /* Assume theres also an off pixmap */
+ if (f->off_map != window)
+ XFreePixmap(dpy, f->off_map);
+ }
+
+ f->off_alpha = (unsigned char *)
+ xrealloc(f->off_alpha, sizeof(unsigned char) * f->width * f->height);
+
+ memset(f->off_alpha, 0, sizeof(unsigned char) * f->width * f->height);
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ /* Or Android's */
+ f->off_map = window;
+# else
+ f->off_map = XCreatePixmap(dpy, window, f->width, f->height, f->visdepth);
+# endif
+
+}
+
+static inline void blank_img(Display *dpy, Window window, XWindowAttributes xgwa, GC fgc, struct field *f)
+{
+ memset(f->off_alpha, 0, sizeof(unsigned char) * f->width * f->height);
+
+ XSetForeground(dpy, fgc, f->bgcolor);
+ XFillRectangle(dpy, window, fgc, 0, 0, xgwa.width, xgwa.height);
+ XSetForeground(dpy, fgc, f->fgcolor);
+}
+
+
+static void *
+intermomentary_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+
+#ifdef TIME_ME
+ time_t start_time = time(NULL);
+#endif
+
+ int tempx;
+ XGCValues gcv;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ XGetWindowAttributes(dpy, window, &st->xgwa);
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ st->ncolors++;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+
+ gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ gcv.background = get_pixel_resource(dpy, st->xgwa.colormap,
+ "background", "Background");
+
+ {
+ XColor fgc, bgc;
+ int fgh, bgh;
+ double fgs, fgv, bgs, bgv;
+ fgc.pixel = gcv.foreground;
+ bgc.pixel = gcv.background;
+ XQueryColor (st->dpy, st->xgwa.colormap, &fgc);
+ XQueryColor (st->dpy, st->xgwa.colormap, &bgc);
+ rgb_to_hsv (fgc.red, fgc.green, fgc.blue, &fgh, &fgs, &fgv);
+ rgb_to_hsv (bgc.red, bgc.green, bgc.blue, &bgh, &bgs, &bgv);
+#if 0
+ bgh = fgh;
+ bgs = fgs;
+ bgv = fgv / 10.0;
+#endif
+ make_color_ramp (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ bgh, bgs, bgv,
+ fgh, fgs, fgv,
+ st->colors, &st->ncolors,
+ False, /* closed */
+ True, False);
+ }
+
+ st->f = init_field();
+
+ st->f->height = st->xgwa.height;
+ st->f->width = st->xgwa.width;
+ st->f->visdepth = st->xgwa.depth;
+
+ st->draw_delay = (get_integer_resource(dpy, "drawDelay", "Integer"));
+ st->f->maxrider = (get_integer_resource(dpy, "maxRiders", "Integer"));
+ st->f->maxradius = (get_integer_resource(dpy, "maxRadius", "Integer"));
+ st->f->initial_discs = (get_integer_resource(dpy, "numDiscs", "Integer"));
+
+ if (st->f->initial_discs <= 10) {
+ fprintf(stderr, "%s: Initial discs must be greater than 10\n", progname);
+ exit (1);
+ }
+
+ if (st->f->maxradius <= 30) {
+ fprintf(stderr, "%s: Max radius must be greater than 30\n", progname);
+ exit (1);
+ }
+
+ if (st->f->maxrider <= 10) {
+ fprintf(stderr, "%s: Max riders must be greater than 10\n", progname);
+ exit (1);
+ }
+
+ st->fgc = XCreateGC(dpy, window, GCForeground, &gcv);
+ st->copygc = XCreateGC(dpy, window, GCForeground, &gcv);
+
+ st->f->fgcolor = gcv.foreground;
+ st->f->bgcolor = gcv.background;
+
+ /* Initialize stuff */
+ build_img(dpy, window, st->f);
+
+ for (tempx = 0; tempx < st->f->initial_discs; tempx++) {
+ float fx, fy, x, y, r;
+ int bt;
+
+ /* Arrange in anti-collapsing circle */
+ fx = 0.4 * st->f->width * cos((2 * M_PI) * tempx / st->f->initial_discs);
+ fy = 0.4 * st->f->height * sin((2 * M_PI) * tempx / st->f->initial_discs);
+ x = frand(st->f->width / 2) + fx;
+ y = frand(st->f->height / 2) + fy;
+ r = 5 + frand(st->f->maxradius);
+ bt = 1;
+
+ if ((random() % 100) < 50)
+ bt = -1;
+
+ make_disc(st->f, x, y, bt * fx / 1000.0, bt * fy / 1000.0, r);
+
+ }
+
+ return st;
+}
+
+static unsigned long
+intermomentary_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int tempx;
+
+ if ((st->f->cycles % 10) == 0) {
+ /* Restart if the window size changes */
+ XGetWindowAttributes(dpy, window, &st->xgwa);
+
+ if (st->f->height != st->xgwa.height || st->f->width != st->xgwa.width) {
+ st->f->height = st->xgwa.height;
+ st->f->width = st->xgwa.width;
+ st->f->visdepth = st->xgwa.depth;
+
+ build_img(dpy, window, st->f);
+ }
+ }
+
+ blank_img(dpy, st->f->off_map, st->xgwa, st->fgc, st->f);
+ for (tempx = 0; tempx < st->f->num; tempx++) {
+ move_disc(st->f, tempx);
+ render_disc(st, st->f->off_map, st->fgc, st->f, tempx);
+ }
+
+#if 0
+ XSetFillStyle(dpy, st->copygc, FillTiled);
+ XSetTile(dpy, st->copygc, st->f->off_map);
+ XFillRectangle(dpy, window, st->copygc, 0, 0, st->f->width, st->f->height);
+#else
+ if (st->f->off_map != window)
+ XCopyArea (dpy, st->f->off_map, window, st->copygc, 0, 0,
+ st->f->width, st->f->height, 0, 0);
+
+#endif
+
+ st->f->cycles++;
+
+ return st->draw_delay;
+}
+
+
+static void
+intermomentary_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+intermomentary_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+intermomentary_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *intermomentary_defaults[] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: yellow",
+ "*drawDelay: 30000",
+ "*numDiscs: 85",
+ "*maxRiders: 40",
+ "*maxRadius: 100",
+ "*colors: 256",
+# ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+# endif
+ 0
+};
+
+static XrmOptionDescRec intermomentary_options[] = {
+ {"-background", ".background", XrmoptionSepArg, 0},
+ {"-foreground", ".foreground", XrmoptionSepArg, 0},
+ {"-draw-delay", ".drawDelay", XrmoptionSepArg, 0},
+ {"-num-discs", ".numDiscs", XrmoptionSepArg, 0},
+ {"-max-riders", ".maxRiders", XrmoptionSepArg, 0},
+ {"-max-radius", ".maxRadius", XrmoptionSepArg, 0},
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ {0, 0, 0, 0}
+};
+
+
+XSCREENSAVER_MODULE ("Intermomentary", intermomentary)
diff --git a/hacks/intermomentary.man b/hacks/intermomentary.man
new file mode 100644
index 0000000..5947c59
--- /dev/null
+++ b/hacks/intermomentary.man
@@ -0,0 +1,82 @@
+.TH Intermomentary 1 "08-Oct-04" "X Version 11"
+.SH NAME
+intermomentary - Visualize the momentary and aggregate intersections
+between slowly moving circles.
+.SH SYNOPSIS
+.B intermomentary
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-num\-discs \fIdisc count\fP]
+[\-draw\-delay \fIdelayms\fP]
+[\-max\-riders \fImaxr\fP]
+[\-max\-radius \fImaxradius\fP]
+[\-fps]
+.SH DESCRIPTION
+The Intersection Momentary is a fun visualization defining the relationships
+between objects with Casey Reas, William Ngan, and Robert Hodgin. Commissioned
+for display at the Whitney Museum of American Art.
+
+A surface filled with 100 medium to small sized circles. Each circle has a
+different size and direction, but moves at the same slow rate. Display:
+
+ A. The instantaneous intersections of the circles.
+ B. The aggregate intersections of the circles.
+
+The circles begin with a radius of 1 pixel and slowly increase to some
+arbitrary size. Circles are drawn with small moving points along the
+perimeter. The intersections are rendered as glowing orbs. Glowing
+orbs are rendered only when a perimeter point moves past the
+intersection point.
+
+Ported to XScreensaver from the art project "InterMomentary" at
+http://www.complexification.net by J.Tarbell
+.SH OPTIONS
+.I intermomentary
+accepts the following options:
+.TP 8
+.B \-num\-discs \fIdisc count\fP (Default: \fI85\fP)
+Number of slowly moving and growing discs to use. The more discs,
+the more CPU power.
+.TP 8
+.B \-draw\-delay \fIdelayms\fP (Default: \fI30000\fP)
+Delay in ms between drawing cycles. More delay, slower (but smoother
+and less CPU intensive.)
+art.
+.TP 8
+.B \-max\-riders \fImaxrider\fP (Default: \fI40\fP)
+Maximum number of 'riders', single dots moving around the edge of the discs.
+.TP 8
+.B \-max\-radius \fImaxradius\fP (Default: \fI100\fP)
+Maximum possible radius of a disc.
+.TP 8
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global
+resources stored in the RESOURCE_MANAGER property.
+.TP 8
+.SH BUGS
+.PP
+.TP 8
+Setting the background to anything besides black confuses the intensity
+algorithm and will look terrible.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by J. Tarbell
+(complex@complexification.net, http://www.complexification.net).
+
+Ported to XScreensaver 2004 by Mike Kershaw (dragorn@kismetwireless.net)
+.SH AUTHOR
+J. Tarbell <complex@complexification.net>, Jun-03
+
+Mike Kershaw <dragorn@kismetwireless.net>, Oct-04
diff --git a/hacks/juggle.c b/hacks/juggle.c
new file mode 100644
index 0000000..e6ff01f
--- /dev/null
+++ b/hacks/juggle.c
@@ -0,0 +1,2796 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* juggle */
+
+#if 0
+static const char sccsid[] = "@(#)juggle.c 5.10 2003/09/02 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History
+ * 13-Dec-2004: [TDA] Use -cycles and -count in a rational manner.
+ * Add -rings, -bballs. Add -describe. Finally made
+ * live pattern updates possible. Add refill_juggle(),
+ * change_juggle() and reshape_juggle(). Make
+ * init_juggle() non-destructive. Reorder erase/draw
+ * operations. Update xscreensaver xml and manpage.
+ * 15-Nov-2004: [TDA] Fix all memory leaks.
+ * 12-Nov-2004: [TDA] Add -torches and another new trail
+ * implementation, so that different objects can have
+ * different length trails.
+ * 11-Nov-2004: [TDA] Clap when all the balls are in the air.
+ * 10-Nov-2004: [TDA] Display pattern name converted to hight
+ * notation.
+ * 31-Oct-2004: [TDA] Add -clubs and new trail implementation.
+ * 02-Sep-2003: Non-real time to see what is happening without a
+ * strobe effect for slow machines.
+ * 01-Nov-2000: Allocation checks
+ * 1996: Written
+ */
+
+/*-
+ * TODO
+ * Implement the anonymously promised -uni option.
+ */
+
+
+/*
+ * Notes on Adam Chalcraft Juggling Notation (used by permission)
+ * a-> Adam's notation s-> Site swap (Cambridge) notation
+ *
+ * To define a map from a-notation to s-notation ("site-swap"), both
+ * of which look like doubly infinite sequences of natural numbers. In
+ * s-notation, there is a restriction on what is allowed, namely for
+ * the sequence s_n, the associated function f(n)=n+s_n must be a
+ * bijection. In a-notation, there is no restriction.
+ *
+ * To go from a-notation to s-notation, you start by mapping each a_n
+ * to a permutation of N, the natural numbers.
+ *
+ * 0 -> the identity
+ * 1 -> (10) [i.e. f(1)=0, f(0)=1]
+ * 2 -> (210) [i.e. f(2)=1, f(1)=0, f(0)=2]
+ * 3 -> (3210) [i.e. f(3)=2, f(2)=1, f(1)=0, f(0)=3]
+ * etc.
+ *
+ * Then for each n, you look at how long 0 takes to get back to 0
+ * again and you call this t_n. If a_n=0, for example, then since the
+ * identity leaves 0 alone, it gets back to 0 in 1 step, so t_n=1. If
+ * a_n=1, then f(0)=1. Now any further a_n=0 leave 1 alone, but the
+ * next a_n>0 sends 1 back to 0. Hence t_n is 2 + the number of 0's
+ * following the 1. Finally, set s_n = t_n - 1.
+ *
+ * To give some examples, it helps to have a notation for cyclic
+ * sequences. By (123), for example, I mean ...123123123123... . Now
+ * under the a-notation -> s-notation mapping we have some familiar
+ * examples:
+ *
+ * (0)->(0), (1)->(1), (2)->(2) etc.
+ * (21)->(31), (31)->(51), (41)->(71) etc.
+ * (10)->(20), (20)->(40), (30)->(60) etc.
+ * (331)->(441), (312)->(612), (303)->(504), (321)->(531)
+ * (43)->(53), (434)->(534), (433)->(633)
+ * (552)->(672)
+ *
+ * In general, the number of balls is the *average* of the s-notation,
+ * and the *maximum* of the a-notation. Another theorem is that the
+ * minimum values in the a-notation and the s-notation and equal, and
+ * preserved in the same positions.
+ *
+ * The usefulness of a-notation is the fact that there are no
+ * restrictions on what is allowed. This makes random juggle
+ * generation much easier. It also makes enumeration very
+ * easy. Another handy feature is computing changes. Suppose you can
+ * do (5) and want a neat change up to (771) in s-notation [Mike Day
+ * actually needed this example!]. Write them both in a-notation,
+ * which gives (5) and (551). Now concatenate them (in general, there
+ * may be more than one way to do this, but not in this example), to
+ * get
+ *
+ * ...55555555551551551551551...
+ *
+ * Now convert back to s-notation, to get
+ *
+ * ...55555566771771771771771...
+ *
+ * So the answer is to do two 6 throws and then go straight into
+ * (771). Coming back down of course,
+ *
+ * ...5515515515515515555555555...
+ *
+ * converts to
+ *
+ * ...7717717717716615555555555...
+ *
+ * so the answer is to do a single 661 and then drop straight down to
+ * (5).
+ *
+ * [The number of balls in the generated pattern occasionally changes.
+ * In order to decrease the number of balls I had to introduce a new
+ * symbol into the Adam notation, [*] which means 'lose the current
+ * ball'.]
+ */
+
+/* This code uses so many linked lists it's worth having a built-in
+ * leak-checker */
+#undef MEMTEST
+
+#ifdef STANDALONE
+# define MODE_juggle
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 200 \n" \
+ "*cycles: 1000 \n" \
+ "*ncolors: 32 \n" \
+ "*font: -*-helvetica-bold-r-normal-*-180-*\n" \
+ "*fpsSolid: true\n" \
+
+# define release_juggle 0
+# define reshape_juggle 0
+# define juggle_handle_event 0
+# undef SMOOTH_COLORS
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_juggle
+
+#if 0
+#define XClearWindow(d, w) \
+{ \
+ XSetForeground(d, MI_GC(mi), MI_PIXEL(mi, 3)); \
+ XFillRectangle(d, w, MI_GC(mi), \
+ 0, 0, (unsigned int) MI_WIDTH(mi), (unsigned int) MI_HEIGHT(mi)); \
+}
+#endif
+
+#define DEF_PATTERN "random" /* All patterns */
+#define DEF_TAIL "1" /* No trace */
+#ifdef UNI
+/* Maybe a ROLA BOLA would be at a better angle for viewing */
+#define DEF_UNI "False" /* No unicycle */ /* Not implemented yet */
+#endif
+#define DEF_REAL "True"
+#define DEF_DESCRIBE "True"
+
+#define DEF_BALLS "True" /* Use Balls */
+#define DEF_CLUBS "True" /* Use Clubs */
+#define DEF_TORCHES "True" /* Use Torches */
+#define DEF_KNIVES "True" /* Use Knives */
+#define DEF_RINGS "True" /* Use Rings */
+#define DEF_BBALLS "True" /* Use Bowling Balls */
+
+#ifndef XtNumber
+#define XtNumber(arr) ((unsigned int) (sizeof(arr) / sizeof(arr[0])))
+#endif
+
+static char *pattern;
+static int tail;
+#ifdef UNI
+static Bool uni;
+#endif
+static Bool real;
+static Bool describe;
+static Bool balls;
+static Bool clubs;
+static Bool torches;
+static Bool knives;
+static Bool rings;
+static Bool bballs;
+static char *only;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-pattern", ".juggle.pattern", XrmoptionSepArg, NULL },
+ {"-tail", ".juggle.tail", XrmoptionSepArg, NULL },
+#ifdef UNI
+ {"-uni", ".juggle.uni", XrmoptionNoArg, "on" },
+ {"+uni", ".juggle.uni", XrmoptionNoArg, "off" },
+#endif
+ {"-real", ".juggle.real", XrmoptionNoArg, "on" },
+ {"+real", ".juggle.real", XrmoptionNoArg, "off" },
+ {"-describe", ".juggle.describe", XrmoptionNoArg, "on" },
+ {"+describe", ".juggle.describe", XrmoptionNoArg, "off" },
+ {"-balls", ".juggle.balls", XrmoptionNoArg, "on" },
+ {"+balls", ".juggle.balls", XrmoptionNoArg, "off" },
+ {"-clubs", ".juggle.clubs", XrmoptionNoArg, "on" },
+ {"+clubs", ".juggle.clubs", XrmoptionNoArg, "off" },
+ {"-torches", ".juggle.torches", XrmoptionNoArg, "on" },
+ {"+torches", ".juggle.torches", XrmoptionNoArg, "off" },
+ {"-knives", ".juggle.knives", XrmoptionNoArg, "on" },
+ {"+knives", ".juggle.knives", XrmoptionNoArg, "off" },
+ {"-rings", ".juggle.rings", XrmoptionNoArg, "on" },
+ {"+rings", ".juggle.rings", XrmoptionNoArg, "off" },
+ {"-bballs", ".juggle.bballs", XrmoptionNoArg, "on" },
+ {"+bballs", ".juggle.bballs", XrmoptionNoArg, "off" },
+ {"-only", ".juggle.only", XrmoptionSepArg, NULL },
+};
+static argtype vars[] =
+{
+ { &pattern, "pattern", "Pattern", DEF_PATTERN, t_String },
+ { &tail, "tail", "Tail", DEF_TAIL, t_Int },
+#ifdef UNI
+ { &uni, "uni", "Uni", DEF_UNI, t_Bool },
+#endif
+ { &real, "real", "Real", DEF_REAL, t_Bool },
+ { &describe, "describe", "Describe", DEF_DESCRIBE, t_Bool },
+ { &balls, "balls", "Clubs", DEF_BALLS, t_Bool },
+ { &clubs, "clubs", "Clubs", DEF_CLUBS, t_Bool },
+ { &torches, "torches", "Torches", DEF_TORCHES, t_Bool },
+ { &knives, "knives", "Knives", DEF_KNIVES, t_Bool },
+ { &rings, "rings", "Rings", DEF_RINGS, t_Bool },
+ { &bballs, "bballs", "BBalls", DEF_BBALLS, t_Bool },
+ { &only, "only", "BBalls", " ", t_String },
+};
+static OptionStruct desc[] =
+{
+ { "-pattern string", "Cambridge Juggling Pattern" },
+ { "-tail num", "Trace Juggling Patterns" },
+#ifdef UNI
+ { "-/+uni", "Unicycle" },
+#endif
+ { "-/+real", "Real-time" },
+ { "-/+describe", "turn on/off pattern descriptions." },
+ { "-/+balls", "turn on/off Balls." },
+ { "-/+clubs", "turn on/off Clubs." },
+ { "-/+torches", "turn on/off Flaming Torches." },
+ { "-/+knives", "turn on/off Knives." },
+ { "-/+rings", "turn on/off Rings." },
+ { "-/+bballs", "turn on/off Bowling Balls." },
+ { "-only", "Turn off all objects but the named one." },
+};
+
+ENTRYPOINT ModeSpecOpt juggle_opts =
+ { XtNumber(opts), opts, XtNumber(vars), vars, desc };
+
+#ifdef USE_MODULES
+ModStruct juggle_description = {
+ "juggle", "init_juggle", "draw_juggle", (char *) NULL,
+ "draw_juggle", "change_juggle", "free_juggle", &juggle_opts,
+ 10000, 200, 1000, 1, 64, 1.0, "",
+ "Shows a Juggler, juggling", 0, NULL
+};
+
+#endif
+
+#ifdef USE_XVMSUTILS
+# include <X11/unix_time.h>
+#endif
+
+/* Note: All "lengths" are scaled by sp->scale = MI_HEIGHT/480. All
+ "thicknesses" are scaled by sqrt(sp->scale) so that they are
+ proportionally thicker for smaller windows. Objects spinning out
+ of the plane (such as clubs) fake perspective by compressing their
+ horizontal coordinates by PERSPEC */
+
+/* Figure */
+#define ARMLENGTH 50
+#define ARMWIDTH ((int) (8.0 * sqrt(sp->scale)))
+#define POSE 10
+#define BALLRADIUS ARMWIDTH
+
+#define PERSPEC 0.4
+
+/* macros */
+#define GRAVITY(h, t) 4*(double)(h)/((t)*(t))
+
+/* Timing based on count. Units are milliseconds. Juggles per second
+ is: 2000 / THROW_CATCH_INTERVAL + CATCH_THROW_INTERVAL */
+
+#define THROW_CATCH_INTERVAL (sp->count)
+#define THROW_NULL_INTERVAL (sp->count * 0.5)
+#define CATCH_THROW_INTERVAL (sp->count * 0.2)
+
+/********************************************************************
+ * Trace Definitions *
+ * *
+ * These record rendering data so that a drawn object can be erased *
+ * later. Each object has its own Trace list. *
+ * *
+ ********************************************************************/
+
+typedef struct {double x, y; } DXPoint;
+typedef struct trace *TracePtr;
+typedef struct trace {
+ TracePtr next, prev;
+ double x, y;
+ double angle;
+ int divisions;
+ DXPoint dlast;
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Trace;
+
+/*******************************************************************
+ * Object Definitions *
+ * *
+ * These describe the various types of Object that can be juggled *
+ * *
+ *******************************************************************/
+typedef void (DrawProc)(ModeInfo*, unsigned long, Trace *);
+
+static DrawProc show_ball, show_europeanclub, show_torch, show_knife;
+static DrawProc show_ring, show_bball;
+
+typedef enum {BALL, CLUB, TORCH, KNIFE, RING, BBALLS,
+ NUM_OBJECT_TYPES} ObjType;
+#define OBJMIXPROB 20 /* inverse of the chances of using an odd
+ object in the pattern */
+
+static const struct {
+ DrawProc *draw; /* Object Rendering function */
+ int handle; /* Length of object's handle */
+ int mintrail; /* Minimum trail length */
+ double cor; /* Coefficient of Restitution. perfect bounce = 1 */
+ double weight; /* Heavier objects don't get thrown as high */
+} ObjectDefs[] = {
+ { /* Ball */
+ show_ball,
+ 0,
+ 1,
+ 0.9,
+ 1.0,
+ },
+ { /* Club */
+ show_europeanclub,
+ 15,
+ 1,
+ 0.55, /* Clubs don't bounce too well */
+ 1.0,
+ },
+ { /* Torch */
+ show_torch,
+ 15,
+ 20, /* Torches need flames */
+ 0, /* Torches don't bounce -- fire risk! */
+ 1.0,
+ },
+ { /* Knife */
+ show_knife,
+ 15,
+ 1,
+ 0, /* Knives don't bounce */
+ 1.0,
+ },
+ { /* Ring */
+ show_ring,
+ 15,
+ 1,
+ 0.8,
+ 1.0,
+ },
+ { /* Bowling Ball */
+ show_bball,
+ 0,
+ 1,
+ 0.2,
+ 5.0,
+ },
+};
+
+/**************************
+ * Trajectory definitions *
+ **************************/
+
+typedef enum {HEIGHT, ADAM} Notation;
+typedef enum {Empty, Full, Ball} Throwable;
+typedef enum {LEFT, RIGHT} Hand;
+typedef enum {THROW, CATCH} Action;
+typedef enum {HAND, ELBOW, SHOULDER} Joint;
+typedef enum {ATCH, THRATCH, ACTION, LINKEDACTION,
+ PTHRATCH, BPREDICTOR, PREDICTOR} TrajectoryStatus;
+typedef struct {double a, b, c, d; } Spline;
+typedef DXPoint Arm[3];
+
+/* A Wander contains a Spline and a time interval. A list of Wanders
+ * describes the performer's position as he moves around the screen. */
+typedef struct wander *WanderPtr;
+typedef struct wander {
+ WanderPtr next, prev;
+ double x;
+ unsigned long finish;
+ Spline s;
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Wander;
+
+/* Object is an arbitrary object being juggled. Each Trajectory
+ * references an Object ("count" tracks this), and each Object is also
+ * linked into a global Objects list. Objects may include a Trace
+ * list for tracking erasures. */
+typedef struct object *ObjectPtr;
+typedef struct object {
+ ObjectPtr next, prev;
+
+ ObjType type;
+ int color;
+ int count; /* reference count */
+ Bool active; /* Object is in use */
+
+ Trace *trace;
+ int tracelen;
+ int tail;
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Object;
+
+/* Trajectory is a segment of juggling action. A list of Trajectories
+ * defines the juggling performance. The Trajectory list goes through
+ * multiple processing steps to convert it from basic juggling
+ * notation into rendering data. */
+
+typedef struct trajectory *TrajectoryPtr;
+typedef struct trajectory {
+ TrajectoryPtr prev, next; /* for building list */
+ TrajectoryStatus status;
+
+ /* Throw */
+ char posn;
+ int height;
+ int adam;
+ char *pattern;
+ char *name;
+
+ /* Action */
+ Hand hand;
+ Action action;
+
+ /* LinkedAction */
+ int color;
+ Object *object;
+ int divisions;
+ double angle, spin;
+ TrajectoryPtr balllink;
+ TrajectoryPtr handlink;
+
+ /* PThratch */
+ double cx; /* Moving juggler */
+ double x, y; /* current position */
+ double dx, dy; /* initial velocity */
+
+ /* Predictor */
+ Throwable type;
+ unsigned long start, finish;
+ Spline xp, yp;
+
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Trajectory;
+
+
+/*******************
+ * Pattern Library *
+ *******************/
+
+typedef struct {
+ const char * pattern;
+ const char * name;
+} patternstruct;
+
+/* List of popular patterns, in any order */
+/* Patterns should be given in Adam notation so the generator can
+ concatenate them safely. Null descriptions are ok. Height
+ notation will be displayed automatically. */
+/* Can't const this because it is qsorted. This *should* be reentrant,
+ I think... */
+static /*const*/ patternstruct portfolio[] = {
+ {"[+2 1]", /* +3 1 */ "Typical 2 ball juggler"},
+ {"[2 0]", /* 4 0 */ "2 in 1 hand"},
+ {"[2 0 1]", /* 5 0 1 */},
+ {"[+2 0 +2 0 0]" /* +5 0 +5 0 0 */},
+ {"[+2 0 1 2 2]", /* +4 0 1 2 3 */},
+ {"[2 0 1 1]", /* 6 0 1 1 */},
+
+ {"[3]", /* 3 */ "3 cascade"},
+ {"[+3]", /* +3 */ "reverse 3 cascade"},
+ {"[=3]", /* =3 */ "cascade 3 under arm"},
+ {"[&3]", /* &3 */ "cascade 3 catching under arm"},
+ {"[_3]", /* _3 */ "bouncing 3 cascade"},
+ {"[+3 x3 =3]", /* +3 x3 =3 */ "Mill's mess"},
+ {"[3 2 1]", /* 5 3 1" */},
+ {"[3 3 1]", /* 4 4 1" */},
+ {"[3 1 2]", /* 6 1 2 */ "See-saw"},
+ {"[=3 3 1 2]", /* =4 5 1 2 */},
+ {"[=3 2 2 3 1 2]", /* =6 2 2 5 1 2 */ "=4 5 1 2 stretched"},
+ {"[+3 3 1 3]", /* +4 4 1 3 */ "anemic shower box"},
+ {"[3 3 1]", /* 4 4 1 */},
+ {"[+3 2 3]", /* +4 2 3 */},
+ {"[+3 1]", /* +5 1 */ "3 shower"},
+ {"[_3 1]", /* _5 1 */ "bouncing 3 shower"},
+ {"[3 0 3 0 3]", /* 5 0 5 0 5 */ "shake 3 out of 5"},
+ {"[3 3 3 0 0]", /* 5 5 5 0 0 */ "flash 3 out of 5"},
+ {"[3 3 0]", /* 4 5 0 */ "complete waste of a 5 ball juggler"},
+ {"[3 3 3 0 0 0 0]", /* 7 7 7 0 0 0 0 */ "3 flash"},
+ {"[+3 0 +3 0 +3 0 0]", /* +7 0 +7 0 +7 0 0 */},
+ {"[3 2 2 0 3 2 0 2 3 0 2 2 0]", /* 7 3 3 0 7 3 0 3 7 0 3 3 0 */},
+ {"[3 0 2 0]", /* 8 0 4 0 */},
+ {"[_3 2 1]", /* _5 3 1 */},
+ {"[_3 0 1]", /* _8 0 1 */},
+ {"[1 _3 1 _3 0 1 _3 0]", /* 1 _7 1 _7 0 1 _7 0 */},
+ {"[_3 2 1 _3 1 2 1]", /* _6 3 1 _6 1 3 1 */},
+
+ {"[4]", /* 4 */ "4 cascade"},
+ {"[+4 3]", /* +5 3 */ "4 ball half shower"},
+ {"[4 4 2]", /* 5 5 2 */},
+ {"[+4 4 4 +4]", /* +4 4 4 +4 */ "4 columns"},
+ {"[+4 3 +4]", /* +5 3 +4 */},
+ {"[4 3 4 4]", /* 5 3 4 4 */},
+ {"[4 3 3 4]", /* 6 3 3 4 */},
+ {"[4 3 2 4", /* 6 4 2 4 */},
+ {"[+4 1]", /* +7 1 */ "4 shower"},
+ {"[4 4 4 4 0]", /* 5 5 5 5 0 */ "learning 5"},
+ {"[+4 x4 =4]", /* +4 x4 =4 */ "Mill's mess for 4"},
+ {"[+4 2 1 3]", /* +9 3 1 3 */},
+ {"[4 4 1 4 1 4]", /* 6 6 1 5 1 5, by Allen Knutson */},
+ {"[_4 _4 _4 1 _4 1]", /* _5 _6 _6 1 _5 1 */},
+ {"[_4 3 3]", /* _6 3 3 */},
+ {"[_4 3 1]", /* _7 4 1 */},
+ {"[_4 2 1]", /* _8 3 1 */},
+ {"[_4 3 3 3 0]", /* _8 4 4 4 0 */},
+ {"[_4 1 3 1]", /* _9 1 5 1 */},
+ {"[_4 1 3 1 2]", /* _10 1 6 1 2 */},
+
+ {"[5]", /* 5 */ "5 cascade"},
+ {"[_5 _5 _5 _5 _5 5 5 5 5 5]", /* _5 _5 _5 _5 _5 5 5 5 5 5 */},
+ {"[+5 x5 =5]", /* +5 x5 =5 */ "Mill's mess for 5"},
+ {"[5 4 4]", /* 7 4 4 */},
+ {"[_5 4 4]", /* _7 4 4 */},
+ {"[1 2 3 4 5 5 5 5 5]", /* 1 2 3 4 5 6 7 8 9 */ "5 ramp"},
+ {"[5 4 5 3 1]", /* 8 5 7 4 1, by Allen Knutson */},
+ {"[_5 4 1 +4]", /* _9 5 1 5 */},
+ {"[_5 4 +4 +4]", /* _8 4 +4 +4 */},
+ {"[_5 4 4 4 1]", /* _9 5 5 5 1 */},
+ {"[_5 4 4 5 1]",},
+ {"[_5 4 4 +4 4 0]", /*_10 5 5 +5 5 0 */},
+
+ {"[6]", /* 6 */ "6 cascade"},
+ {"[+6 5]", /* +7 5 */},
+ {"[6 4]", /* 8 4 */},
+ {"[+6 3]", /* +9 3 */},
+ {"[6 5 4 4]", /* 9 7 4 4 */},
+ {"[+6 5 5 5]", /* +9 5 5 5 */},
+ {"[6 0 6]", /* 9 0 9 */},
+ {"[_6 0 _6]", /* _9 0 _9 */},
+
+ {"[_7]", /* _7 */ "bouncing 7 cascade"},
+ {"[7]", /* 7 */ "7 cascade"},
+ {"[7 6 6 6 6]", /* 11 6 6 6 6 */ "Gatto's High Throw"},
+
+};
+
+
+
+typedef struct { int start; int number; } PatternIndex;
+
+struct patternindex {
+ int minballs;
+ int maxballs;
+ PatternIndex index[XtNumber(portfolio)];
+};
+
+
+/* Jugglestruct: per-screen global data. The master Wander, Object
+ * and Trajectory lists are anchored here. */
+typedef struct {
+ double scale;
+ Wander *wander;
+ double cx;
+ double Gr;
+ Trajectory *head;
+ Arm arm[2][2];
+ char *pattern;
+ int count;
+ int num_balls;
+ time_t begintime; /* should make 'time' usable for at least 48 days
+ on a 32-bit machine */
+ unsigned long time; /* millisecond timer*/
+ ObjType objtypes;
+ Object *objects;
+ struct patternindex patternindex;
+ XFontStruct *mode_font;
+} jugglestruct;
+
+static jugglestruct *juggles = (jugglestruct *) NULL;
+
+/*******************
+ * list management *
+ *******************/
+
+#define DUP_OBJECT(n, t) { \
+ (n)->object = (t)->object; \
+ if((n)->object != NULL) (n)->object->count++; \
+}
+
+/* t must point to an existing element. t must not be an
+ expression ending ->next or ->prev */
+#define REMOVE(t) { \
+ (t)->next->prev = (t)->prev; \
+ (t)->prev->next = (t)->next; \
+ free(t); \
+}
+
+/* t receives element to be created and added to the list. ot must
+ point to an existing element or be identical to t to start a new
+ list. Applicable to Trajectories, Objects and Traces. */
+#define ADD_ELEMENT(type, t, ot) \
+ if (((t) = (type*)calloc(1,sizeof(type))) != NULL) { \
+ (t)->next = (ot)->next; \
+ (t)->prev = (ot); \
+ (ot)->next = (t); \
+ (t)->next->prev = (t); \
+ }
+
+static void
+object_destroy(Object* o)
+{
+ if(o->trace != NULL) {
+ while(o->trace->next != o->trace) {
+ Trace *s = o->trace->next;
+ REMOVE(s); /* Don't eliminate 's' */
+ }
+ free(o->trace);
+ }
+ REMOVE(o);
+}
+
+static void
+trajectory_destroy(Trajectory *t) {
+ if(t->name != NULL) free(t->name);
+ if(t->pattern != NULL) free(t->pattern);
+ /* Reduce object link count and call destructor if necessary */
+ if(t->object != NULL && --t->object->count < 1 && t->object->tracelen == 0) {
+ object_destroy(t->object);
+ }
+ REMOVE(t); /* Unlink and free */
+}
+
+ENTRYPOINT void
+free_juggle(ModeInfo * mi) {
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+
+ if (sp->head != NULL) {
+ while (sp->head->next != sp->head) {
+ trajectory_destroy(sp->head->next);
+ }
+ free(sp->head);
+ sp->head = (Trajectory *) NULL;
+ }
+ if(sp->objects != NULL) {
+ while (sp->objects->next != sp->objects) {
+ object_destroy(sp->objects->next);
+ }
+ free(sp->objects);
+ sp->objects = (Object*)NULL;
+ }
+ if(sp->wander != NULL) {
+ while (sp->wander->next != sp->wander) {
+ Wander *w = sp->wander->next;
+ REMOVE(w);
+ }
+ free(sp->wander);
+ sp->wander = (Wander*)NULL;
+ }
+ if(sp->pattern != NULL) {
+ free(sp->pattern);
+ sp->pattern = NULL;
+ }
+ if (sp->mode_font!=None) {
+ XFreeFontInfo(NULL,sp->mode_font,1);
+ sp->mode_font = None;
+ }
+}
+
+static Bool
+add_throw(ModeInfo *mi, char type, int h, Notation n, const char* name)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t;
+
+ ADD_ELEMENT(Trajectory, t, sp->head->prev);
+ if(t == NULL){ /* Out of Memory */
+ free_juggle(mi);
+ return False;
+ }
+ t->object = NULL;
+ if(name != NULL)
+ t->name = strdup(name);
+ t->posn = type;
+ if (n == ADAM) {
+ t->adam = h;
+ t->height = 0;
+ t->status = ATCH;
+ } else {
+ t->height = h;
+ t->status = THRATCH;
+ }
+ return True;
+}
+
+/* add a Thratch to the performance */
+static Bool
+program(ModeInfo *mi, const char *patn, const char *name, int cycles)
+{
+ const char *p;
+ int w, h, i, seen;
+ Notation notation;
+ char type;
+
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "juggle[%d]: Programmed: %s x %d\n",
+ MI_SCREEN(mi), (name == NULL) ? patn : name, cycles);
+ }
+
+ for(w=i=0; i < cycles; i++, w++) { /* repeat until at least "cycles" throws
+ have been programmed */
+ /* title is the pattern name to be supplied to the first throw of
+ a sequence. If no name if given, use an empty title so that
+ the sequences are still delimited. */
+ const char *title = (name != NULL)? name : "";
+ type=' ';
+ h = 0;
+ seen = 0;
+ notation = HEIGHT;
+ for(p=patn; *p; p++) {
+ if (*p >= '0' && *p <='9') {
+ seen = 1;
+ h = 10*h + (*p - '0');
+ } else {
+ Notation nn = notation;
+ switch (*p) {
+ case '[': /* begin Adam notation */
+ notation = ADAM;
+ break;
+ case '-': /* Inside throw */
+ type = ' ';
+ break;
+ case '+': /* Outside throw */
+ case '=': /* Cross throw */
+ case '&': /* Cross catch */
+ case 'x': /* Cross throw and catch */
+ case '_': /* Bounce */
+ case 'k': /* Kickup */
+ type = *p;
+ break;
+ case '*': /* Lose ball */
+ seen = 1;
+ h = -1;
+ /* fall through */
+ case ']': /* end Adam notation */
+ nn = HEIGHT;
+ /* fall through */
+ case ' ':
+ if (seen) {
+ i++;
+ if (!add_throw(mi, type, h, notation, title))
+ return False;
+ title = NULL;
+ type=' ';
+ h = 0;
+ seen = 0;
+ }
+ notation = nn;
+ break;
+ default:
+ if(w == 0) { /* Only warn on first pass */
+ (void) fprintf(stderr,
+ "juggle[%d]: Unexpected pattern instruction: '%c'\n",
+ MI_SCREEN(mi), *p);
+ }
+ break;
+ }
+ }
+ }
+ if (seen) { /* end of sequence */
+ if (!add_throw(mi, type, h, notation, title))
+ return False;
+ title = NULL;
+ }
+ }
+ return True;
+}
+
+/*
+ ~~~~\~~~~~\~~~
+ \\~\\~\~\\\~~~
+ \\~\\\\~\\\~\~
+ \\\\\\\\\\\~\\
+
+[ 3 3 1 3 4 2 3 1 3 3 4 0 2 1 ]
+
+4 4 1 3 12 2 4 1 4 4 13 0 3 1
+
+*/
+#define BOUNCEOVER 10
+#define KICKMIN 7
+#define THROWMAX 20
+
+/* Convert Adam notation into heights */
+static void
+adam(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ for(t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == ATCH) {
+ int a = t->adam;
+ t->height = 0;
+ for(p = t->next; a > 0; p = p->next) {
+ if(p == sp->head) {
+ t->height = -9; /* Indicate end of processing for name() */
+ return;
+ }
+ if (p->status != ATCH || p->adam < 0 || p->adam>= a) {
+ a--;
+ }
+ t->height++;
+ }
+ if(t->height > BOUNCEOVER && t->posn == ' '){
+ t->posn = '_'; /* high defaults can be bounced */
+ } else if(t->height < 3 && t->posn == '_') {
+ t->posn = ' '; /* Can't bounce short throws. */
+ }
+ if(t->height < KICKMIN && t->posn == 'k'){
+ t->posn = ' '; /* Can't kick short throws */
+ }
+ if(t->height > THROWMAX){
+ t->posn = 'k'; /* Use kicks for ridiculously high throws */
+ }
+ t->status = THRATCH;
+ }
+ }
+}
+
+/* Discover converted heights and update the sequence title */
+static void
+name(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ char buffer[BUFSIZ];
+ char *b;
+ for(t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == THRATCH && t->name != NULL) {
+ b = buffer;
+ for(p = t; p == t || p->name == NULL; p = p->next) {
+ if(p == sp->head || p->height < 0) { /* end of reliable data */
+ return;
+ }
+ if(p->posn == ' ') {
+ b += sprintf(b, " %d", p->height);
+ } else {
+ b += sprintf(b, " %c%d", p->posn, p->height);
+ }
+ if(b - buffer > 500) break; /* otherwise this could eventually
+ overflow. It'll be too big to
+ display anyway. */
+ }
+ if(*t->name != 0) {
+ (void) sprintf(b, ", %s", t->name);
+ }
+ free(t->name); /* Don't need name any more, it's been converted
+ to pattern */
+ t->name = NULL;
+ if(t->pattern != NULL) free(t->pattern);
+ t->pattern = strdup(buffer);
+ }
+ }
+}
+
+/* Split Thratch notation into explicit throws and catches.
+ Usually Catch follows Throw in same hand, but take care of special
+ cases. */
+
+/* ..n1.. -> .. LTn RT1 LC RC .. */
+/* ..nm.. -> .. LTn LC RTm RC .. */
+
+static Bool
+part(ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t, *nt, *p;
+ Hand hand = (LRAND() & 1) ? RIGHT : LEFT;
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status > THRATCH) {
+ hand = t->hand;
+ } else if (t->status == THRATCH) {
+ char posn = '=';
+
+ /* plausibility check */
+ if (t->height <= 2 && t->posn == '_') {
+ t->posn = ' '; /* no short bounces */
+ }
+ if (t->height <= 1 && (t->posn == '=' || t->posn == '&')) {
+ t->posn = ' '; /* 1's need close catches */
+ }
+
+ switch (t->posn) {
+ /* throw catch */
+ case ' ': posn = '-'; t->posn = '+'; break;
+ case '+': posn = '+'; t->posn = '-'; break;
+ case '=': posn = '='; t->posn = '+'; break;
+ case '&': posn = '+'; t->posn = '='; break;
+ case 'x': posn = '='; t->posn = '='; break;
+ case '_': posn = '_'; t->posn = '-'; break;
+ case 'k': posn = 'k'; t->posn = 'k'; break;
+ default:
+ (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+ break;
+ }
+ hand = (Hand) ((hand + 1) % 2);
+ t->status = ACTION;
+ t->hand = hand;
+ p = t->prev;
+
+ if (t->height == 1 && p != sp->head) {
+ p = p->prev; /* '1's are thrown earlier than usual */
+ }
+
+
+
+ t->action = CATCH;
+ ADD_ELEMENT(Trajectory, nt, p);
+ if(nt == NULL){
+ free_juggle(mi);
+ return False;
+ }
+ nt->object = NULL;
+ nt->status = ACTION;
+ nt->action = THROW;
+ nt->height = t->height;
+ nt->hand = hand;
+ nt->posn = posn;
+
+ }
+ }
+ return True;
+}
+
+static ObjType
+choose_object(void) {
+ ObjType o;
+ for (;;) {
+ o = (ObjType)NRAND((ObjType)NUM_OBJECT_TYPES);
+ if(balls && o == BALL) break;
+ if(clubs && o == CLUB) break;
+ if(torches && o == TORCH) break;
+ if(knives && o == KNIFE) break;
+ if(rings && o == RING) break;
+ if(bballs && o == BBALLS) break;
+ }
+ return o;
+}
+
+/* Connnect up throws and catches to figure out which ball goes where.
+ Do the same with the juggler's hands. */
+
+static void
+lob(ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t, *p;
+ int h;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == ACTION) {
+ if (t->action == THROW) {
+ if (t->type == Empty) {
+ /* Create new Object */
+ ADD_ELEMENT(Object, t->object, sp->objects);
+ t->object->count = 1;
+ t->object->tracelen = 0;
+ t->object->active = False;
+ /* Initialise object's circular trace list */
+ ADD_ELEMENT(Trace, t->object->trace, t->object->trace);
+
+ if (MI_NPIXELS(mi) > 2) {
+ t->object->color = 1 + NRAND(MI_NPIXELS(mi) - 2);
+ } else {
+#ifdef STANDALONE
+ t->object->color = 1;
+#else
+ t->object->color = 0;
+#endif
+ }
+
+ /* Small chance of picking a random object instead of the
+ current theme. */
+ if(NRAND(OBJMIXPROB) == 0) {
+ t->object->type = choose_object();
+ } else {
+ t->object->type = sp->objtypes;
+ }
+
+ /* Check to see if we need trails for this object */
+ if(tail < ObjectDefs[t->object->type].mintrail) {
+ t->object->tail = ObjectDefs[t->object->type].mintrail;
+ } else {
+ t->object->tail = tail;
+ }
+ }
+
+ /* Balls can change divisions at each throw */
+ t->divisions = 2 * (NRAND(2) + 1);
+
+ /* search forward for next catch in this hand */
+ for (p = t->next; t->handlink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) return;
+ if (p->action == CATCH) {
+ if (t->handlink == NULL && p->hand == t->hand) {
+ t->handlink = p;
+ }
+ }
+ }
+
+ if (t->height > 0) {
+ h = t->height - 1;
+
+ /* search forward for next ball catch */
+ for (p = t->next; t->balllink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) {
+ t->handlink = NULL;
+ return;
+ }
+ if (p->action == CATCH) {
+ if (t->balllink == NULL && --h < 1) { /* caught */
+ t->balllink = p; /* complete trajectory */
+# if 0
+ if (p->type == Full) {
+ (void) fprintf(stderr, "juggle[%d]: Dropped %d\n",
+ MI_SCREEN(mi), t->object->color);
+ }
+#endif
+ p->type = Full;
+ DUP_OBJECT(p, t); /* accept catch */
+ p->angle = t->angle;
+ p->divisions = t->divisions;
+ }
+ }
+ }
+ }
+ t->type = Empty; /* thrown */
+ } else if (t->action == CATCH) {
+ /* search forward for next throw from this hand */
+ for (p = t->next; t->handlink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) return;
+ if (p->action == THROW && p->hand == t->hand) {
+ p->type = t->type; /* pass ball */
+ DUP_OBJECT(p, t); /* pass object */
+ p->divisions = t->divisions;
+ t->handlink = p;
+ }
+ }
+ }
+ t->status = LINKEDACTION;
+ }
+ }
+}
+
+/* Clap when both hands are empty */
+static void
+clap(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == LINKEDACTION &&
+ t->action == CATCH &&
+ t->type == Empty &&
+ t->handlink != NULL &&
+ t->handlink->height == 0) { /* Completely idle hand */
+
+ for (p = t->next; p != sp->head; p = p->next) {
+ if (p->status == LINKEDACTION &&
+ p->action == CATCH &&
+ p->hand != t->hand) { /* Next catch other hand */
+ if(p->type == Empty &&
+ p->handlink != NULL &&
+ p->handlink->height == 0) { /* Also completely idle */
+
+ t->handlink->posn = '^'; /* Move first hand's empty throw */
+ p->posn = '^'; /* to meet second hand's empty
+ catch */
+
+ }
+ break; /* Only need first catch */
+ }
+ }
+ }
+ }
+}
+
+#define CUBIC(s, t) ((((s).a * (t) + (s).b) * (t) + (s).c) * (t) + (s).d)
+
+/* Compute single spline from x0 with velocity dx0 at time t0 to x1
+ with velocity dx1 at time t1 */
+static Spline
+makeSpline(double x0, double dx0, int t0, double x1, double dx1, int t1)
+{
+ Spline s;
+ double a, b, c, d;
+ double x10;
+ double t10;
+
+ x10 = x1 - x0;
+ t10 = t1 - t0;
+ a = ((dx0 + dx1)*t10 - 2*x10) / (t10*t10*t10);
+ b = (3*x10 - (2*dx0 + dx1)*t10) / (t10*t10);
+ c = dx0;
+ d = x0;
+ s.a = a;
+ s.b = -3*a*t0 + b;
+ s.c = (3*a*t0 - 2*b)*t0 + c;
+ s.d = ((-a*t0 + b)*t0 - c)*t0 +d;
+ return s;
+}
+
+/* Compute a pair of splines. s1 goes from x0 vith velocity dx0 at
+ time t0 to x1 at time t1. s2 goes from x1 at time t1 to x2 with
+ velocity dx2 at time t2. The arrival and departure velocities at
+ x1, t1 must be the same. */
+static double
+makeSplinePair(Spline *s1, Spline *s2,
+ double x0, double dx0, int t0,
+ double x1, int t1,
+ double x2, double dx2, int t2)
+{
+ double x10, x21, t21, t10, t20, dx1;
+ x10 = x1 - x0;
+ x21 = x2 - x1;
+ t21 = t2 - t1;
+ t10 = t1 - t0;
+ t20 = t2 - t0;
+ dx1 = (3*x10*t21*t21 + 3*x21*t10*t10 + 3*dx0*t10*t21*t21
+ - dx2*t10*t10*t21 - 4*dx0*t10*t21*t21) /
+ (2*t10*t21*t20);
+ *s1 = makeSpline(x0, dx0, t0, x1, dx1, t1);
+ *s2 = makeSpline(x1, dx1, t1, x2, dx2, t2);
+ return dx1;
+}
+
+/* Compute a Ballistic path in a pair of degenerate splines. sx goes
+ from x at time t at constant velocity dx. sy goes from y at time t
+ with velocity dy and constant acceleration g. */
+static void
+makeParabola(Trajectory *n,
+ double x, double dx, double y, double dy, double g)
+{
+ double t = (double)n->start;
+ n->xp.a = 0;
+ n->xp.b = 0;
+ n->xp.c = dx;
+ n->xp.d = -dx*t + x;
+ n->yp.a = 0;
+ n->yp.b = g/2;
+ n->yp.c = -g*t + dy;
+ n->yp.d = g/2*t*t - dy*t + y;
+}
+
+
+
+/* Make juggler wander around the screen */
+static double wander(jugglestruct *sp, unsigned long time)
+{
+ Wander *w = NULL;
+ for (w = sp->wander->next; w != sp->wander; w = w->next) {
+ if (w->finish < sp->time) { /* expired */
+ Wander *ww = w;
+ w = w->prev;
+ REMOVE(ww);
+ } else if(w->finish > time) {
+ break;
+ }
+ }
+ if(w == sp->wander) { /* Need a new one */
+ ADD_ELEMENT(Wander, w, sp->wander->prev);
+ if(w == NULL) { /* Memory problem */
+ return 0.0;
+ }
+ w->finish = time + 3*THROW_CATCH_INTERVAL + NRAND(10*THROW_CATCH_INTERVAL);
+ if(time == 0) {
+ w->x = 0;
+ } else {
+ w->x = w->prev->x * 0.9 + NRAND(40) - 20;
+ }
+ w->s = makeSpline(w->prev->x, 0.0, w->prev->finish, w->x, 0.0, w->finish);
+ }
+ return CUBIC(w->s, time);
+}
+
+#define SX 25 /* Shoulder Width */
+
+/* Convert hand position symbols into actual time/space coordinates */
+static void
+positions(jugglestruct *sp)
+{
+ Trajectory *t;
+ unsigned long now = sp->time; /* Make sure we're not lost in the past */
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status >= PTHRATCH) {
+ now = t->start;
+ } else if (t->status == ACTION || t->status == LINKEDACTION) {
+ /* Allow ACTIONs to be annotated, but we won't mark them ready
+ for the next stage */
+
+ double xo = 0, yo;
+ double sx = SX;
+ double pose = SX/2;
+
+ /* time */
+ if (t->action == CATCH) { /* Throw-to-catch */
+ if (t->type == Empty) {
+ now += (int) THROW_NULL_INTERVAL; /* failed catch is short */
+ } else { /* successful catch */
+ now += (int)(THROW_CATCH_INTERVAL);
+ }
+ } else { /* Catch-to-throw */
+ if(t->object != NULL) {
+ now += (int) (CATCH_THROW_INTERVAL *
+ ObjectDefs[t->object->type].weight);
+ } else {
+ now += (int) (CATCH_THROW_INTERVAL);
+ }
+ }
+
+ if(t->start == 0)
+ t->start = now;
+ else /* Concatenated performances may need clock resync */
+ now = t->start;
+
+ t->cx = wander(sp, t->start);
+
+ /* space */
+ yo = 90;
+
+ /* Add room for the handle */
+ if(t->action == CATCH && t->object != NULL)
+ yo -= ObjectDefs[t->object->type].handle;
+
+ switch (t->posn) {
+ case '-': xo = sx - pose; break;
+ case '_':
+ case 'k':
+ case '+': xo = sx + pose; break;
+ case '~':
+ case '=': xo = - sx - pose; yo += pose; break;
+ case '^': xo = 0; yo += pose*2; break; /* clap */
+ default:
+ (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+ break;
+ }
+
+ t->angle = (((t->hand == LEFT) ^
+ (t->posn == '+' || t->posn == '_' || t->posn == 'k' ))?
+ -1 : 1) * M_PI/2;
+
+ t->x = t->cx + ((t->hand == LEFT) ? xo : -xo);
+ t->y = yo;
+
+ /* Only mark complete if it was already linked */
+ if(t->status == LINKEDACTION) {
+ t->status = PTHRATCH;
+ }
+ }
+ }
+}
+
+
+/* Private physics functions */
+
+/* Compute the spin-rate for a trajectory. Different types of throw
+ (eg, regular thows, bounces, kicks, etc) have different spin
+ requirements.
+
+ type = type of object
+ h = trajectory of throwing hand (throws), or next throwing hand (catches)
+ old = earlier spin to consider
+ dt = time span of this trajectory
+ height = height of ball throw or 0 if based on old spin
+ turns = full club turns required during this operation
+ togo = partial club turns required to match hands
+*/
+static double
+spinrate(ObjType type, Trajectory *h, double old, double dt,
+ int height, int turns, double togo)
+{
+ const int dir = (h->hand == LEFT) ^ (h->posn == '+')? -1 : 1;
+
+ if(ObjectDefs[type].handle != 0) { /* Clubs */
+ return (dir * turns * 2 * M_PI + togo) / dt;
+ } else if(height == 0) { /* Balls already spinning */
+ return old/2;
+ } else { /* Balls */
+ return dir * NRAND(height*10)/20/ObjectDefs[type].weight * 2 * M_PI / dt;
+ }
+}
+
+
+/* compute the angle at the end of a spinning trajectory */
+static double
+end_spin(Trajectory *t)
+{
+ return t->angle + t->spin * (t->finish - t->start);
+}
+
+/* Sets the initial angle of the catch following hand movement t to
+ the final angle of the throw n. Also sets the angle of the
+ subsequent throw to the same angle plus half a turn. */
+static void
+match_spins_on_catch(Trajectory *t, Trajectory *n)
+{
+ if(ObjectDefs[t->balllink->object->type].handle == 0) {
+ t->balllink->angle = end_spin(n);
+ if(t->balllink->handlink != NULL) {
+ t->balllink->handlink->angle = t->balllink->angle + M_PI;
+ }
+ }
+}
+
+static double
+find_bounce(jugglestruct *sp,
+ double yo, double yf, double yc, double tc, double cor)
+{
+ double tb, i, dy = 0;
+ const double e = 1; /* permissible error in yc */
+
+ /*
+ tb = time to bounce
+ yt = height at catch time after one bounce
+ one or three roots according to timing
+ find one by interval bisection
+ */
+ tb = tc;
+ for(i = tc / 2; i > 0.0001; i/=2){
+ double dt, yt;
+ if(tb == 0){
+ (void) fprintf(stderr, "juggle: bounce div by zero!\n");
+ break;
+ }
+ dy = (yf - yo)/tb + sp->Gr/2*tb;
+ dt = tc - tb;
+ yt = -cor*dy*dt + sp->Gr/2*dt*dt + yf;
+ if(yt < yc + e){
+ tb-=i;
+ }else if(yt > yc - e){
+ tb+=i;
+ }else{
+ break;
+ }
+ }
+ if(dy*THROW_CATCH_INTERVAL < -200) { /* bounce too hard */
+ tb = -1;
+ }
+ return tb;
+}
+
+static Trajectory*
+new_predictor(const Trajectory *t, int start, int finish, double angle)
+{
+ Trajectory *n;
+ ADD_ELEMENT(Trajectory, n, t->prev);
+ if(n == NULL){
+ return NULL;
+ }
+ DUP_OBJECT(n, t);
+ n->divisions = t->divisions;
+ n->type = Ball;
+ n->status = PREDICTOR;
+
+ n->start = start;
+ n->finish = finish;
+ n->angle = angle;
+ return n;
+}
+
+/* Turn abstract timings into physically appropriate object trajectories. */
+static Bool
+projectile(jugglestruct *sp)
+{
+ Trajectory *t;
+ const int yf = 0; /* Floor height */
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status != PTHRATCH || t->action != THROW) {
+ continue;
+ } else if (t->balllink == NULL) { /* Zero Throw */
+ t->status = BPREDICTOR;
+ } else if (t->balllink->handlink == NULL) { /* Incomplete */
+ return True;
+ } else if(t->balllink == t->handlink) {
+ /* '2' height - hold on to ball. Don't need to consider
+ flourishes, 'hands' will do that automatically anyway */
+
+ t->type = Full;
+ /* Zero spin to avoid wrist injuries */
+ t->spin = 0;
+ match_spins_on_catch(t, t);
+ t->dx = t->dy = 0;
+ t->status = BPREDICTOR;
+ continue;
+ } else {
+ if (t->posn == '_') { /* Bounce once */
+
+ const int tb = t->start +
+ find_bounce(sp, t->y, (double) yf, t->balllink->y,
+ (double) (t->balllink->start - t->start),
+ ObjectDefs[t->object->type].cor);
+
+ if(tb < t->start) { /* bounce too hard */
+ t->posn = '+'; /* Use regular throw */
+ } else {
+ Trajectory *n; /* First (throw) trajectory. */
+ double dt; /* Time span of a trajectory */
+ double dy; /* Distance span of a follow-on trajectory.
+ First trajectory uses t->dy */
+ /* dx is constant across both trajectories */
+ t->dx = (t->balllink->x - t->x) / (t->balllink->start - t->start);
+
+ { /* ball follows parabola down */
+ n = new_predictor(t, t->start, tb, t->angle);
+ if(n == NULL) return False;
+ dt = n->finish - n->start;
+ /* Ball rate 4, no flight or matching club turns */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0, 0.0);
+ t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ { /* ball follows parabola up */
+ Trajectory *m = new_predictor(t, n->finish, t->balllink->start,
+ end_spin(n));
+ if(m == NULL) return False;
+ dt = m->finish - m->start;
+ /* Use previous ball rate, no flight club turns */
+ m->spin = spinrate(t->object->type, t, n->spin, dt, 0, 0,
+ t->balllink->angle - m->angle);
+ match_spins_on_catch(t, m);
+ dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+ makeParabola(m, t->balllink->x - t->dx * dt,
+ t->dx, (double) yf, dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ continue;
+ }
+ } else if (t->posn == 'k') { /* Drop & Kick */
+ Trajectory *n; /* First (drop) trajectory. */
+ Trajectory *o; /* Second (rest) trajectory */
+ Trajectory *m; /* Third (kick) trajectory */
+ const int td = t->start + 2*THROW_CATCH_INTERVAL; /* Drop time */
+ const int tk = t->balllink->start - 5*THROW_CATCH_INTERVAL; /* Kick */
+ double dt, dy;
+
+ { /* Fall to ground */
+ n = new_predictor(t, t->start, td, t->angle);
+ if(n == NULL) return False;
+ dt = n->finish - n->start;
+ /* Ball spin rate 4, no flight club turns */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0,
+ t->balllink->angle - n->angle);
+ t->dx = (t->balllink->x - t->x) / dt;
+ t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ { /* Rest on ground */
+ o = new_predictor(t, n->finish, tk, end_spin(n));
+ if(o == NULL) return False;
+ o->spin = 0;
+ makeParabola(o, t->balllink->x, 0.0, (double) yf, 0.0, 0.0);
+ }
+
+ /* Kick up */
+ {
+ m = new_predictor(t, o->finish, t->balllink->start, end_spin(o));
+ if(m == NULL) return False;
+ dt = m->finish - m->start;
+ /* Match receiving hand, ball rate 4, one flight club turn */
+ m->spin = spinrate(t->object->type, t->balllink->handlink, 0.0, dt,
+ 4, 1, t->balllink->angle - m->angle);
+ match_spins_on_catch(t, m);
+ dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+ makeParabola(m, t->balllink->x, 0.0, (double) yf, dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ continue;
+ }
+
+ /* Regular flight, no bounce */
+ { /* ball follows parabola */
+ double dt;
+ Trajectory *n = new_predictor(t, t->start,
+ t->balllink->start, t->angle);
+ if(n == NULL) return False;
+ dt = t->balllink->start - t->start;
+ /* Regular spin */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, t->height, t->height/2,
+ t->balllink->angle - n->angle);
+ match_spins_on_catch(t, n);
+ t->dx = (t->balllink->x - t->x) / dt;
+ t->dy = (t->balllink->y - t->y) / dt - sp->Gr/2 * dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ }
+ }
+ return True;
+}
+
+/* Turn abstract hand motions into cubic splines. */
+static void
+hands(jugglestruct *sp)
+{
+ Trajectory *t, *u, *v;
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ /* no throw => no velocity */
+ if (t->status != BPREDICTOR) {
+ continue;
+ }
+
+ u = t->handlink;
+ if (u == NULL) { /* no next catch */
+ continue;
+ }
+ v = u->handlink;
+ if (v == NULL) { /* no next throw */
+ continue;
+ }
+
+ /* double spline takes hand from throw, thru catch, to
+ next throw */
+
+ t->finish = u->start;
+ t->status = PREDICTOR;
+
+ u->finish = v->start;
+ u->status = PREDICTOR;
+
+
+ /* FIXME: These adjustments leave a small glitch when alternating
+ balls and clubs. Just hope no-one notices. :-) */
+
+ /* make sure empty hand spin matches the thrown object in case it
+ had a handle */
+
+ t->spin = ((t->hand == LEFT)? -1 : 1 ) *
+ fabs((u->angle - t->angle)/(u->start - t->start));
+
+ u->spin = ((v->hand == LEFT) ^ (v->posn == '+')? -1 : 1 ) *
+ fabs((v->angle - u->angle)/(v->start - u->start));
+
+ (void) makeSplinePair(&t->xp, &u->xp,
+ t->x, t->dx, t->start,
+ u->x, u->start,
+ v->x, v->dx, v->start);
+ (void) makeSplinePair(&t->yp, &u->yp,
+ t->y, t->dy, t->start,
+ u->y, u->start,
+ v->y, v->dy, v->start);
+
+ t->status = PREDICTOR;
+ }
+}
+
+/* Given target x, y find_elbow puts hand at target if possible,
+ * otherwise makes hand point to the target */
+static void
+find_elbow(int armlength, DXPoint *h, DXPoint *e, DXPoint *p, DXPoint *s,
+ int z)
+{
+ double r, h2, t;
+ double x = p->x - s->x;
+ double y = p->y - s->y;
+ h2 = x*x + y*y + z*z;
+ if (h2 > 4 * armlength * armlength) {
+ t = armlength/sqrt(h2);
+ e->x = t*x + s->x;
+ e->y = t*y + s->y;
+ h->x = 2 * t * x + s->x;
+ h->y = 2 * t * y + s->y;
+ } else {
+ r = sqrt((double)(x*x + z*z));
+ t = sqrt(4 * armlength * armlength / h2 - 1);
+ e->x = x*(1 + y*t/r)/2 + s->x;
+ e->y = (y - r*t)/2 + s->y;
+ h->x = x + s->x;
+ h->y = y + s->y;
+ }
+}
+
+
+/* NOTE: returned x, y adjusted for arm reach */
+static void
+reach_arm(ModeInfo * mi, Hand side, DXPoint *p)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ DXPoint h, e;
+ find_elbow(40, &h, &e, p, &sp->arm[1][side][SHOULDER], 25);
+ *p = sp->arm[1][side][HAND] = h;
+ sp->arm[1][side][ELBOW] = e;
+}
+
+#if DEBUG
+/* dumps a human-readable rendition of the current state of the juggle
+ pipeline to stderr for debugging */
+static void
+dump(jugglestruct *sp)
+{
+ Trajectory *t;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ switch (t->status) {
+ case ATCH:
+ (void) fprintf(stderr, "%p a %c%d\n", (void*)t, t->posn, t->adam);
+ break;
+ case THRATCH:
+ (void) fprintf(stderr, "%p T %c%d %s\n", (void*)t, t->posn, t->height,
+ t->pattern == NULL?"":t->pattern);
+ break;
+ case ACTION:
+ if (t->action == CATCH)
+ (void) fprintf(stderr, "%p A %c%cC\n",
+ (void*)t, t->posn,
+ t->hand ? 'R' : 'L');
+ else
+ (void) fprintf(stderr, "%p A %c%c%c%d\n",
+ (void*)t, t->posn,
+ t->hand ? 'R' : 'L',
+ (t->action == THROW)?'T':'N',
+ t->height);
+ break;
+ case LINKEDACTION:
+ (void) fprintf(stderr, "%p L %c%c%c%d %d %p %p\n",
+ (void*)t, t->posn,
+ t->hand?'R':'L',
+ (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+ t->height, t->object == NULL?0:t->object->color,
+ (void*)t->handlink, (void*)t->balllink);
+ break;
+ case PTHRATCH:
+ (void) fprintf(stderr, "%p O %c%c%c%d %d %2d %6lu %6lu\n",
+ (void*)t, t->posn,
+ t->hand?'R':'L',
+ (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+ t->height, t->type, t->object == NULL?0:t->object->color,
+ t->start, t->finish);
+ break;
+ case BPREDICTOR:
+ (void) fprintf(stderr, "%p B %c %2d %6lu %6lu %g\n",
+ (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+ t->object == NULL?0:t->object->color,
+ t->start, t->finish, t->yp.c);
+ break;
+ case PREDICTOR:
+ (void) fprintf(stderr, "%p P %c %2d %6lu %6lu %g\n",
+ (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+ t->object == NULL?0:t->object->color,
+ t->start, t->finish, t->yp.c);
+ break;
+ default:
+ (void) fprintf(stderr, "%p: status %d not implemented\n",
+ (void*)t, t->status);
+ break;
+ }
+ }
+ (void) fprintf(stderr, "---\n");
+}
+#endif
+
+static int get_num_balls(const char *j)
+{
+ int balls = 0;
+ const char *p;
+ int h = 0;
+ if (!j) abort();
+ for (p = j; *p; p++) {
+ if (*p >= '0' && *p <='9') { /* digit */
+ h = 10*h + (*p - '0');
+ } else {
+ if (h > balls) {
+ balls = h;
+ }
+ h = 0;
+ }
+ }
+ return balls;
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static int
+compare_num_balls(const void *p1, const void *p2)
+{
+ int i, j;
+ i = get_num_balls(((patternstruct*)p1)->pattern);
+ j = get_num_balls(((patternstruct*)p2)->pattern);
+ if (i > j) {
+ return (1);
+ } else if (i < j) {
+ return (-1);
+ } else {
+ return (0);
+ }
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/**************************************************************************
+ * Rendering Functions *
+ * *
+ **************************************************************************/
+
+static void
+show_arms(ModeInfo * mi, unsigned long color)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ unsigned int i, j;
+ Hand side;
+ XPoint a[XtNumber(sp->arm[0][0])];
+ if(color == MI_BLACK_PIXEL(mi)) {
+ j = 0;
+ } else {
+ j = 1;
+ }
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ ARMWIDTH, LineSolid, CapRound, JoinRound);
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ for(side = LEFT; side <= RIGHT; side = (Hand)((int)side + 1)) {
+ /* Translate into device coords */
+ for(i = 0; i < XtNumber(a); i++) {
+ a[i].x = (short)(MI_WIDTH(mi)/2 + sp->arm[j][side][i].x*sp->scale);
+ a[i].y = (short)(MI_HEIGHT(mi) - sp->arm[j][side][i].y*sp->scale);
+ if(j == 1)
+ sp->arm[0][side][i] = sp->arm[1][side][i];
+ }
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ a, XtNumber(a), CoordModeOrigin);
+ }
+}
+
+static void
+show_figure(ModeInfo * mi, unsigned long color, Bool init)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ XPoint p[7];
+ unsigned int i;
+
+ /* +-----+ 9
+ | 6 |
+ 10 +--+--+
+ 2 +---+---+ 3
+ \ 5 /
+ \ /
+ \ /
+ 1 +
+ / \
+ / \
+ 0 +-----+ 4
+ | |
+ | |
+ | |
+ 7 + + 8
+ */
+
+ static const XPoint figure[] = {
+ { 15, 70}, /* 0 Left Hip */
+ { 0, 90}, /* 1 Waist */
+ { SX, 130}, /* 2 Left Shoulder */
+ {-SX, 130}, /* 3 Right Shoulder */
+ {-15, 70}, /* 4 Right Hip */
+ { 0, 130}, /* 5 Neck */
+ { 0, 140}, /* 6 Chin */
+ { SX, 0}, /* 7 Left Foot */
+ {-SX, 0}, /* 8 Right Foot */
+ {-17, 174}, /* 9 Head1 */
+ { 17, 140}, /* 10 Head2 */
+ };
+ XPoint a[XtNumber(figure)];
+
+ /* Translate into device coords */
+ for(i = 0; i < XtNumber(figure); i++) {
+ a[i].x = (short)(MI_WIDTH(mi)/2 + (sp->cx + figure[i].x)*sp->scale);
+ a[i].y = (short)(MI_HEIGHT(mi) - figure[i].y*sp->scale);
+ }
+
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ ARMWIDTH, LineSolid, CapRound, JoinRound);
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+
+ i = 0; /* Body */
+ p[i++] = a[0]; p[i++] = a[1]; p[i++] = a[2];
+ p[i++] = a[3]; p[i++] = a[1]; p[i++] = a[4];
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, CoordModeOrigin);
+
+ i = 0; /* Legs */
+ p[i++] = a[7]; p[i++] = a[0]; p[i++] = a[4]; p[i++] = a[8];
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, CoordModeOrigin);
+
+ i = 0; /* Neck */
+ p[i++] = a[5]; p[i++] = a[6];
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, CoordModeOrigin);
+
+ /* Head */
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ a[9].x, a[9].y,
+ a[10].x - a[9].x, a[10].y - a[9].y, 0, 64*360);
+ sp->arm[1][LEFT][SHOULDER].x = sp->cx + figure[2].x;
+ sp->arm[1][RIGHT][SHOULDER].x = sp->cx + figure[3].x;
+ if(init) {
+ /* Initialise arms */
+ unsigned int i;
+ for(i = 0; i < 2; i++){
+ sp->arm[i][LEFT][SHOULDER].y = figure[2].y;
+ sp->arm[i][LEFT][ELBOW].x = figure[2].x;
+ sp->arm[i][LEFT][ELBOW].y = figure[1].y;
+ sp->arm[i][LEFT][HAND].x = figure[0].x;
+ sp->arm[i][LEFT][HAND].y = figure[1].y;
+ sp->arm[i][RIGHT][SHOULDER].y = figure[3].y;
+ sp->arm[i][RIGHT][ELBOW].x = figure[3].x;
+ sp->arm[i][RIGHT][ELBOW].y = figure[1].y;
+ sp->arm[i][RIGHT][HAND].x = figure[4].x;
+ sp->arm[i][RIGHT][HAND].y = figure[1].y;
+ }
+ }
+}
+
+static void
+show_ball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ int offset = (int)(s->angle*64*180/M_PI);
+ short x = (short)(MI_WIDTH(mi)/2 + s->x * sp->scale);
+ short y = (short)(MI_HEIGHT(mi) - s->y * sp->scale);
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > MI_HEIGHT(mi) * 2) return;
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ if (s->divisions == 0 || color == MI_BLACK_PIXEL(mi)) {
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x - BALLRADIUS, y - BALLRADIUS,
+ 2*BALLRADIUS, 2*BALLRADIUS,
+ 0, 23040);
+ } else if (s->divisions == 4) { /* 90 degree divisions */
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x - BALLRADIUS, y - BALLRADIUS,
+ 2*BALLRADIUS, 2*BALLRADIUS,
+ offset % 23040, 5760);
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x - BALLRADIUS, y - BALLRADIUS,
+ 2*BALLRADIUS, 2*BALLRADIUS,
+ (offset + 11520) % 23040, 5760);
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x - BALLRADIUS, y - BALLRADIUS,
+ 2*BALLRADIUS, 2*BALLRADIUS,
+ (offset + 5760) % 23040, 5760);
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x - BALLRADIUS, y - BALLRADIUS,
+ 2*BALLRADIUS, 2*BALLRADIUS,
+ (offset + 17280) % 23040, 5760);
+ } else if (s->divisions == 2) { /* 180 degree divisions */
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x - BALLRADIUS, y - BALLRADIUS,
+ 2*BALLRADIUS, 2*BALLRADIUS,
+ offset % 23040, 11520);
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x - BALLRADIUS, y - BALLRADIUS,
+ 2*BALLRADIUS, 2*BALLRADIUS,
+ (offset + 11520) % 23040, 11520);
+ } else {
+ (void) fprintf(stderr, "juggle[%d]: unexpected divisions: %d\n",
+ MI_SCREEN(mi), s->divisions);
+ }
+}
+
+static void
+show_europeanclub(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ XPoint p[4];
+ const double sa = sin(s->angle);
+ const double ca = cos(s->angle);
+ unsigned int i;
+
+ /* 6 6
+ +-+
+ / \
+ 4 +-----+ 7
+ ////////\
+ 3 +---------+ 8
+ 2 +---------+ 9
+ |///////|
+ 1 +-------+ 10
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ +-+
+ 0 11 */
+
+ static const XPoint club[] = {
+ {-24, 2}, /* 0 */
+ {-10, 3}, /* 1 */
+ { 1, 6}, /* 2 */
+ { 8, 6}, /* 3 */
+ { 14, 4}, /* 4 */
+ { 16, 3}, /* 5 */
+ { 16,-3}, /* 6 */
+ { 14,-4}, /* 7 */
+ { 8,-6}, /* 8 */
+ { 1,-6}, /* 9 */
+ {-10,-3}, /* 10 */
+ {-24,-2}, /* 11 */
+ {-24, 2}, /* 0 close boundary */
+ };
+ XPoint a[XtNumber(club)];
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > MI_HEIGHT(mi) * 2) return;
+
+ /* Translate and fake perspective */
+ for(i = 0; i < XtNumber(club); i++) {
+ a[i].x = (short)(MI_WIDTH(mi)/2 +
+ (s->x + club[i].x*PERSPEC*sa)*sp->scale -
+ club[i].y*sqrt(sp->scale)*ca);
+ a[i].y = (short)(MI_HEIGHT(mi) - (s->y - club[i].x*ca)*sp->scale +
+ club[i].y*sa*sqrt(sp->scale));
+ }
+
+ if(color != MI_BLACK_PIXEL(mi)) {
+ /* Outline in black */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 2,
+ LineSolid, CapRound, JoinRound);
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ a, XtNumber(a), CoordModeOrigin);
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+
+ /* Don't be tempted to optimize erase by drawing all the black in
+ one X operation. It must use the same ops as the colours to
+ guarantee a clean erase. */
+
+ i = 0; /* Colored stripes */
+ p[i++] = a[1]; p[i++] = a[2];
+ p[i++] = a[9]; p[i++] = a[10];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+ i = 0;
+ p[i++] = a[3]; p[i++] = a[4];
+ p[i++] = a[7]; p[i++] = a[8];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+
+ if(color != MI_BLACK_PIXEL(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ }
+
+ i = 0; /* White center band */
+ p[i++] = a[2]; p[i++] = a[3]; p[i++] = a[8]; p[i++] = a[9];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+
+ i = 0; /* White handle */
+ p[i++] = a[0]; p[i++] = a[1]; p[i++] = a[10]; p[i++] = a[11];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+
+ i = 0; /* White tip */
+ p[i++] = a[4]; p[i++] = a[5]; p[i++] = a[6]; p[i++] = a[7];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+}
+
+#if 0
+static void
+show_jugglebugclub(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ XPoint p[6];
+ const double sa = sin(s->angle);
+ const double ca = cos(s->angle);
+ unsigned int i;
+
+ /* 4 5
+ +-+
+ / \
+ 3 +-----+ 6
+ ////////\
+ 2 +/////////+ 7
+ |///////|
+ 1 +-------+ 8
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ +-+
+ 0 9 */
+
+ static const XPoint club[] = {
+ {-24, 2}, /* 0 */
+ { -9, 3}, /* 1 */
+ { 5, 6}, /* 2 */
+ { 11, 4}, /* 3 */
+ { 16, 3}, /* 4 */
+ { 16,-3}, /* 5 */
+ { 11,-4}, /* 6 */
+ { 5,-6}, /* 7 */
+ { -9,-3}, /* 8 */
+ {-24,-2}, /* 9 */
+ {-24, 2}, /* 0 close boundary */
+ };
+ XPoint a[XtNumber(club)];
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > MI_HEIGHT(mi) * 2) return;
+
+ /* Translate and fake perspective */
+ for(i = 0; i < XtNumber(club); i++) {
+ a[i].x = (short)(MI_WIDTH(mi)/2 +
+ (s->x + club[i].x*PERSPEC*sa)*sp->scale -
+ club[i].y*sqrt(sp->scale)*ca);
+ a[i].y = (short)(MI_HEIGHT(mi) - (s->y - club[i].x*ca)*sp->scale +
+ club[i].y*sa*sqrt(sp->scale));
+ }
+
+ if(color != MI_BLACK_PIXEL(mi)) {
+ /* Outline in black */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 2,
+ LineSolid, CapRound, JoinRound);
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ a, XtNumber(a), CoordModeOrigin);
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+
+ /* Don't be tempted to optimize erase by drawing all the black in
+ one X operation. It must use the same ops as the colours to
+ guarantee a clean erase. */
+
+ i = 0; /* Coloured center band */
+ p[i++] = a[1]; p[i++] = a[2]; p[i++] = a[3];
+ p[i++] = a[6]; p[i++] = a[7]; p[i++] = a[8];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+
+ if(color != MI_BLACK_PIXEL(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ }
+
+ i = 0; /* White handle */
+ p[i++] = a[0]; p[i++] = a[1]; p[i++] = a[8]; p[i++] = a[9];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+
+ i = 0; /* White tip */
+ p[i++] = a[3]; p[i++] = a[4]; p[i++] = a[5]; p[i++] = a[6];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+}
+#endif
+
+static void
+show_torch(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ XPoint head, tail, last;
+ DXPoint dhead, dlast;
+ const double sa = sin(s->angle);
+ const double ca = cos(s->angle);
+
+ const double TailLen = -24;
+ const double HeadLen = 16;
+ const short Width = (short)(5 * sqrt(sp->scale));
+
+ /*
+ +///+ head
+ last |
+ |
+ |
+ |
+ |
+ + tail
+ */
+
+ dhead.x = s->x + HeadLen * PERSPEC * sa;
+ dhead.y = s->y - HeadLen * ca;
+
+ if(color == MI_BLACK_PIXEL(mi)) { /* Use 'last' when erasing */
+ dlast = s->dlast;
+ } else { /* Store 'last' so we can use it later when s->prev has
+ gone */
+ if(s->prev != s->next) {
+ dlast.x = s->prev->x + HeadLen * PERSPEC * sin(s->prev->angle);
+ dlast.y = s->prev->y - HeadLen * cos(s->prev->angle);
+ } else {
+ dlast = dhead;
+ }
+ s->dlast = dlast;
+ }
+
+ /* Avoid wrapping (after last is stored) */
+ if(s->y*sp->scale > MI_HEIGHT(mi) * 2) return;
+
+ head.x = (short)(MI_WIDTH(mi)/2 + dhead.x*sp->scale);
+ head.y = (short)(MI_HEIGHT(mi) - dhead.y*sp->scale);
+
+ last.x = (short)(MI_WIDTH(mi)/2 + dlast.x*sp->scale);
+ last.y = (short)(MI_HEIGHT(mi) - dlast.y*sp->scale);
+
+ tail.x = (short)(MI_WIDTH(mi)/2 +
+ (s->x + TailLen * PERSPEC * sa)*sp->scale );
+ tail.y = (short)(MI_HEIGHT(mi) - (s->y - TailLen * ca)*sp->scale );
+
+ if(color != MI_BLACK_PIXEL(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ Width, LineSolid, CapRound, JoinRound);
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ head.x, head.y, tail.x, tail.y);
+ }
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ Width * 2, LineSolid, CapRound, JoinRound);
+
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ head.x, head.y, last.x, last.y);
+
+}
+
+static void
+show_knife(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ unsigned int i;
+ const double sa = sin(s->angle);
+ const double ca = cos(s->angle);
+
+ /*
+ 2 +
+ |+ 3
+ ||
+ 1 +++ 5
+ |4|
+ | |
+ + 0
+ */
+ static const XPoint knife[] = {
+ {-24, 0}, /* 0 */
+ { -5,-3}, /* 1 */
+ { 16,-3}, /* 2 */
+ { 12, 0}, /* 3 */
+ { -5, 0}, /* 4 */
+ { -5, 3}, /* 5 */
+ };
+ XPoint a[XtNumber(knife)], p[5];
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > MI_HEIGHT(mi) * 2) return;
+
+ /* Translate and fake perspective */
+ for(i = 0; i < XtNumber(knife); i++) {
+ a[i].x = (short)(MI_WIDTH(mi)/2 +
+ (s->x + knife[i].x*PERSPEC*sa)*sp->scale -
+ knife[i].y*sqrt(sp->scale)*ca*PERSPEC);
+ a[i].y = (short)(MI_HEIGHT(mi) - (s->y - knife[i].x*ca)*sp->scale +
+ knife[i].y*sa*sqrt(sp->scale));
+ }
+
+ /* Handle */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), (short)(4*sqrt(sp->scale)),
+ LineSolid, CapRound, JoinRound);
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ a[0].x, a[0].y, a[4].x, a[4].y);
+
+ /* Blade */
+ if(color != MI_BLACK_PIXEL(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ }
+ i = 0;
+ p[i++] = a[1]; p[i++] = a[2]; p[i++] = a[3]; p[i++] = a[5];
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ p, i, Convex, CoordModeOrigin);
+}
+
+static void
+show_ring(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ short x = (short)(MI_WIDTH(mi)/2 + s->x * sp->scale);
+ short y = (short)(MI_HEIGHT(mi) - s->y * sp->scale);
+ double radius = 15 * sp->scale;
+ short thickness = (short)(8 * sqrt(sp->scale));
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > MI_HEIGHT(mi) * 2) return;
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ thickness, LineSolid, CapRound, JoinRound);
+
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (short)(x - radius*PERSPEC), (short)(y - radius),
+ (short)(2*radius*PERSPEC), (short)(2*radius),
+ 0, 23040);
+}
+
+
+static void
+show_bball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ short x = (short)(MI_WIDTH(mi)/2 + s->x * sp->scale);
+ short y = (short)(MI_HEIGHT(mi) - s->y * sp->scale);
+ double radius = 12 * sp->scale;
+ int offset = (int)(s->angle*64*180/M_PI);
+ int holesize = (int)(3.0*sqrt(sp->scale));
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > MI_HEIGHT(mi) * 2) return;
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (short)(x - radius), (short)(y - radius),
+ (short)(2*radius), (short)(2*radius),
+ 0, 23040);
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 2,
+ LineSolid, CapRound, JoinRound);
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (short)(x - radius), (short)(y - radius),
+ (short)(2*radius), (short)(2*radius),
+ 0, 23040);
+
+ /* Draw finger holes */
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), holesize,
+ LineSolid, CapRound, JoinRound);
+
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (short)(x - radius*0.5), (short)(y - radius*0.5),
+ (short)(2*radius*0.5), (short)(2*radius*0.5),
+ (offset + 960) % 23040, 0);
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (short)(x - radius*0.7), (short)(y - radius*0.7),
+ (short)(2*radius*0.7), (short)(2*radius*0.7),
+ (offset + 1920) % 23040, 0);
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (short)(x - radius*0.7), (short)(y - radius*0.7),
+ (short)(2*radius*0.7), (short)(2*radius*0.7),
+ offset % 23040, 0);
+}
+
+/**************************************************************************
+ * Public Functions *
+ * *
+ **************************************************************************/
+
+
+/* FIXME: refill_juggle currently just appends new throws to the
+ * programme. This is fine if the programme is empty, but if there
+ * are still some trajectories left then it really should take these
+ * into account */
+
+static void
+refill_juggle(ModeInfo * mi)
+{
+ jugglestruct *sp = NULL;
+ int i;
+
+ if (juggles == NULL)
+ return;
+ sp = &juggles[MI_SCREEN(mi)];
+
+ /* generate pattern */
+ if (pattern == NULL) {
+
+#define MAXPAT 10
+#define MAXREPEAT 300
+#define CHANGE_BIAS 8 /* larger makes num_ball changes less likely */
+#define POSITION_BIAS 20 /* larger makes hand movements less likely */
+
+ int count = 0;
+ while (count < MI_CYCLES(mi)) {
+ char buf[MAXPAT * 3 + 3], *b = buf;
+ int maxseen = 0;
+ int l = NRAND(MAXPAT) + 1;
+ int t = NRAND(MIN(MAXREPEAT, (MI_CYCLES(mi) - count))) + 1;
+
+ { /* vary number of balls */
+ int new_balls = sp->num_balls;
+ int change;
+
+ if (new_balls == 2) /* Do not juggle 2 that often */
+ change = NRAND(2 + CHANGE_BIAS / 4);
+ else
+ change = NRAND(2 + CHANGE_BIAS);
+ switch (change) {
+ case 0:
+ new_balls++;
+ break;
+ case 1:
+ new_balls--;
+ break;
+ default:
+ break; /* NO-OP */
+ }
+ if (new_balls < sp->patternindex.minballs) {
+ new_balls += 2;
+ }
+ if (new_balls > sp->patternindex.maxballs) {
+ new_balls -= 2;
+ }
+ if (new_balls < sp->num_balls) {
+ if (!program(mi, "[*]", NULL, 1)) /* lose ball */
+ return;
+ }
+ sp->num_balls = new_balls;
+ }
+
+ count += t;
+ if (NRAND(2) && sp->patternindex.index[sp->num_balls].number) {
+ /* Pick from PortFolio */
+ int p = sp->patternindex.index[sp->num_balls].start +
+ NRAND(sp->patternindex.index[sp->num_balls].number);
+ if (!program(mi, portfolio[p].pattern, portfolio[p].name, t))
+ return;
+ } else {
+ /* Invent a new pattern */
+ *b++='[';
+ for(i = 0; i < l; i++){
+ int n, m;
+ do { /* Triangular Distribution => high values more likely */
+ m = NRAND(sp->num_balls + 1);
+ n = NRAND(sp->num_balls + 1);
+ } while(m >= n);
+ if (n == sp->num_balls) {
+ maxseen = 1;
+ }
+ switch(NRAND(5 + POSITION_BIAS)){
+ case 0: /* Outside throw */
+ *b++ = '+'; break;
+ case 1: /* Cross throw */
+ *b++ = '='; break;
+ case 2: /* Cross catch */
+ *b++ = '&'; break;
+ case 3: /* Cross throw and catch */
+ *b++ = 'x'; break;
+ case 4: /* Bounce */
+ *b++ = '_'; break;
+ default:
+ break; /* Inside throw (default) */
+ }
+
+ *b++ = n + '0';
+ *b++ = ' ';
+ }
+ *b++ = ']';
+ *b = '\0';
+ if (maxseen) {
+ if (!program(mi, buf, NULL, t))
+ return;
+ }
+ }
+ }
+ } else { /* pattern supplied in height or 'a' notation */
+ if (!program(mi, pattern, NULL, MI_CYCLES(mi)))
+ return;
+ }
+
+ adam(sp);
+
+ name(sp);
+
+ if (!part(mi))
+ return;
+
+ lob(mi);
+
+ clap(sp);
+
+ positions(sp);
+
+ if (!projectile(sp)) {
+ free_juggle(mi);
+ return;
+ }
+
+ hands(sp);
+#ifdef DEBUG
+ if(MI_IS_DEBUG(mi)) dump(sp);
+#endif
+}
+
+static void
+change_juggle(ModeInfo * mi)
+{
+ jugglestruct *sp = NULL;
+ Trajectory *t;
+
+ if (juggles == NULL)
+ return;
+ sp = &juggles[MI_SCREEN(mi)];
+
+ /* Strip pending trajectories */
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if(t->start > sp->time || t->finish < sp->time) {
+ Trajectory *n = t;
+ t=t->prev;
+ trajectory_destroy(n);
+ }
+ }
+
+ /* Pick the current object theme */
+ sp->objtypes = choose_object();
+
+ refill_juggle(mi);
+
+ /* Clean up the Screen. Don't use MI_CLEARWINDOW(mi), since we
+ don't all those special effects. */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ show_figure(mi, MI_WHITE_PIXEL(mi), True);
+
+}
+
+ENTRYPOINT void
+init_juggle (ModeInfo * mi)
+{
+ jugglestruct *sp = 0;
+ int i;
+
+ MI_INIT (mi, juggles);
+ sp = &juggles[MI_SCREEN(mi)];
+
+ if (only && *only && strcmp(only, " ")) {
+ balls = clubs = torches = knives = rings = bballs = False;
+ if (!strcasecmp (only, "balls")) balls = True;
+ else if (!strcasecmp (only, "clubs")) clubs = True;
+ else if (!strcasecmp (only, "torches")) torches = True;
+ else if (!strcasecmp (only, "knives")) knives = True;
+ else if (!strcasecmp (only, "rings")) rings = True;
+ else if (!strcasecmp (only, "bballs")) bballs = True;
+ else {
+ (void) fprintf (stderr,
+ "Juggle: -only must be one of: balls, clubs, torches, knives,\n"
+ "\t rings, or bballs (not \"%s\")\n", only);
+#ifdef STANDALONE /* xlock mustn't exit merely because of a bad argument */
+ exit (1);
+#endif
+ }
+ }
+
+ if (sp->head == 0) { /* first time initializing this juggler */
+
+ sp->count = ABS(MI_COUNT(mi));
+ if (sp->count == 0)
+ sp->count = 200;
+
+ /* record start time */
+ sp->begintime = time(NULL);
+ if(sp->patternindex.maxballs > 0) {
+ sp->num_balls = sp->patternindex.minballs +
+ NRAND(sp->patternindex.maxballs - sp->patternindex.minballs);
+ }
+
+ show_figure(mi, MI_WHITE_PIXEL(mi), True); /* Draw figure. Also discovers
+ information about the juggler's
+ proportions */
+
+ /* "7" should be about three times the height of the juggler's
+ shoulders */
+ sp->Gr = -GRAVITY(3 * sp->arm[0][RIGHT][SHOULDER].y,
+ 7 * THROW_CATCH_INTERVAL);
+
+ if(!balls && !clubs && !torches && !knives && !rings && !bballs)
+ balls = True; /* Have to juggle something! */
+
+ /* create circular trajectory list */
+ ADD_ELEMENT(Trajectory, sp->head, sp->head);
+ if(sp->head == NULL){
+ free_juggle(mi);
+ return;
+ }
+
+ /* create circular object list */
+ ADD_ELEMENT(Object, sp->objects, sp->objects);
+ if(sp->objects == NULL){
+ free_juggle(mi);
+ return;
+ }
+
+ /* create circular wander list */
+ ADD_ELEMENT(Wander, sp->wander, sp->wander);
+ if(sp->wander == NULL){
+ free_juggle(mi);
+ return;
+ }
+ (void)wander(sp, 0); /* Initialize wander */
+
+ sp->pattern = strdup(""); /* Initialise saved pattern with
+ free-able memory */
+ }
+
+ sp = &juggles[MI_SCREEN(mi)];
+
+ if (pattern &&
+ (!*pattern ||
+ !strcasecmp (pattern, ".") ||
+ !strcasecmp (pattern, "random")))
+ pattern = NULL;
+
+ if (pattern == NULL && sp->patternindex.maxballs == 0) {
+ /* pattern list needs indexing */
+ int nelements = XtNumber(portfolio);
+ int numpat = 0;
+
+ /* sort according to number of balls */
+ qsort((void*)portfolio, nelements,
+ sizeof(portfolio[1]), compare_num_balls);
+
+ /* last pattern has most balls */
+ sp->patternindex.maxballs = get_num_balls(portfolio[nelements - 1].pattern);
+ /* run through sorted list, indexing start of each group
+ and number in group */
+ sp->patternindex.maxballs = 1;
+ for (i = 0; i < nelements; i++) {
+ int b = get_num_balls(portfolio[i].pattern);
+ if (b > sp->patternindex.maxballs) {
+ sp->patternindex.index[sp->patternindex.maxballs].number = numpat;
+ if(numpat == 0) sp->patternindex.minballs = b;
+ sp->patternindex.maxballs = b;
+ numpat = 1;
+ sp->patternindex.index[sp->patternindex.maxballs].start = i;
+ } else {
+ numpat++;
+ }
+ }
+ sp->patternindex.index[sp->patternindex.maxballs].number = numpat;
+ }
+
+ /* Set up programme */
+ change_juggle(mi);
+
+ /* Clean up the Screen. Don't use MI_CLEARWINDOW(mi), since we may
+ only be resizing and then we won't all those special effects. */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ /* Only put things here that won't interrupt the programme during
+ a window resize */
+
+ /* Use MIN so that users can resize in interesting ways, eg
+ narrow windows for tall patterns, etc */
+ sp->scale = MIN(MI_HEIGHT(mi)/480.0, MI_WIDTH(mi)/160.0);
+
+ if(describe && !sp->mode_font) { /* Check to see if there's room to describe patterns. */
+ char *font = get_string_resource (MI_DISPLAY(mi), "font", "Font");
+ sp->mode_font = load_font_retry(MI_DISPLAY(mi), font);
+ }
+}
+
+ENTRYPOINT void
+draw_juggle (ModeInfo * mi)
+{
+ Trajectory *traj = NULL;
+ Object *o = NULL;
+ unsigned long future = 0;
+ jugglestruct *sp = NULL;
+ char *pattern = NULL;
+ double cx;
+
+ if (juggles == NULL)
+ return;
+ sp = &juggles[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+#ifdef HAVE_JWXYZ
+ /* Don't worry about flicker, trust Quartz's double-buffering.
+ This is a fast fix for the pixel-turds I can't track down...
+ */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+ /* Update timer */
+ if (real) {
+ struct timeval tv;
+ (void)gettimeofday(&tv, NULL);
+ sp->time = (int) ((tv.tv_sec - sp->begintime)*1000 + tv.tv_usec/1000);
+ } else {
+ sp->time += MI_DELAY(mi) / 1000;
+ }
+
+ /* First pass: Move arms and strip out expired elements */
+ for (traj = sp->head->next; traj != sp->head; traj = traj->next) {
+ if (traj->status != PREDICTOR) {
+ /* Skip any elements that need further processing */
+ /* We could remove them, but there shoudn't be many and they
+ would be needed if we ever got the pattern refiller
+ working */
+ continue;
+ }
+ if (traj->start > future) { /* Lookahead to the end of the show */
+ future = traj->start;
+ }
+ if (sp->time < traj->start) { /* early */
+ continue;
+ } else if (sp->time < traj->finish) { /* working */
+
+ /* Look for pattern name */
+ if(traj->pattern != NULL) {
+ pattern=traj->pattern;
+ }
+
+ if (traj->type == Empty || traj->type == Full) {
+ /* Only interested in hands on this pass */
+ double angle = traj->angle + traj->spin * (sp->time - traj->start);
+ double xd = 0, yd = 0;
+ DXPoint p;
+
+ /* Find the catching offset */
+ if(traj->object != NULL) {
+ if(ObjectDefs[traj->object->type].handle > 0) {
+ /* Handles Need to be oriented */
+ xd = ObjectDefs[traj->object->type].handle *
+ PERSPEC * sin(angle);
+ yd = ObjectDefs[traj->object->type].handle *
+ cos(angle);
+ } else {
+ /* Balls are always caught at the bottom */
+ xd = 0;
+ yd = -4;
+ }
+ }
+ p.x = (CUBIC(traj->xp, sp->time) - xd);
+ p.y = (CUBIC(traj->yp, sp->time) + yd);
+ reach_arm(mi, traj->hand, &p);
+
+ /* Store updated hand position */
+ traj->x = p.x + xd;
+ traj->y = p.y - yd;
+ }
+ if (traj->type == Ball || traj->type == Full) {
+ /* Only interested in objects on this pass */
+ double x, y;
+ Trace *s;
+
+ if(traj->type == Full) {
+ /* Adjusted these in the first pass */
+ x = traj->x;
+ y = traj->y;
+ } else {
+ x = CUBIC(traj->xp, sp->time);
+ y = CUBIC(traj->yp, sp->time);
+ }
+
+ ADD_ELEMENT(Trace, s, traj->object->trace->prev);
+ s->x = x;
+ s->y = y;
+ s->angle = traj->angle + traj->spin * (sp->time - traj->start);
+ s->divisions = traj->divisions;
+ traj->object->tracelen++;
+ traj->object->active = True;
+ }
+ } else { /* expired */
+ Trajectory *n = traj;
+ traj=traj->prev;
+ trajectory_destroy(n);
+ }
+ }
+
+ /* Erase end of trails */
+ for (o = sp->objects->next; o != sp->objects; o = o->next) {
+ Trace *s;
+ for (s = o->trace->next;
+ o->trace->next != o->trace &&
+ (o->count == 0 || o->tracelen > o->tail);
+ s = o->trace->next) {
+ ObjectDefs[o->type].draw(mi, MI_BLACK_PIXEL(mi), s);
+ REMOVE(s);
+ o->tracelen--;
+ if(o->count <= 0 && o->tracelen <= 0) {
+ /* Object no longer in use and trail gone */
+ Object *n = o;
+ o = o->prev;
+ object_destroy(n);
+ }
+ if(o->count <= 0) break; /* Allow loop for catch-up, but not clean-up */
+ }
+ }
+
+ show_arms(mi, MI_BLACK_PIXEL(mi));
+ cx = wander(sp, sp->time);
+ /* Reduce flicker by only permitting movements of more than a pixel */
+ if(fabs((sp->cx - cx))*sp->scale >= 2.0 ) {
+ show_figure(mi, MI_BLACK_PIXEL(mi), False);
+ sp->cx = cx;
+ }
+
+ show_figure(mi, MI_WHITE_PIXEL(mi), False);
+
+ show_arms(mi, MI_WHITE_PIXEL(mi));
+
+ /* Draw Objects */
+ for (o = sp->objects->next; o != sp->objects; o = o->next) {
+ if(o->active) {
+ ObjectDefs[o->type].draw(mi,MI_PIXEL(mi, o->color), o->trace->prev);
+ o->active = False;
+ }
+ }
+
+
+ /* Save pattern name so we can erase it when it changes */
+ if(pattern != NULL && strcmp(sp->pattern, pattern) != 0 ) {
+ /* Erase old name */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+# if 0
+ XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, 20, sp->pattern, strlen(sp->pattern));
+# else
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, 0, MI_WIDTH(mi), 25);
+# endif
+ free(sp->pattern);
+ sp->pattern = strdup(pattern);
+
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Juggle[%d]: Running: %s\n",
+ MI_SCREEN(mi), sp->pattern);
+ }
+ }
+ if(sp->mode_font != None &&
+ XTextWidth(sp->mode_font, sp->pattern, strlen(sp->pattern)) < MI_WIDTH(mi)) {
+ /* Redraw once a cycle, in case it's obscured or it changed */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ XDrawImageString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, 20, sp->pattern, strlen(sp->pattern));
+ }
+
+#ifdef MEMTEST
+ if((int)(sp->time/10) % 1000 == 0)
+ (void) fprintf(stderr, "sbrk: %d\n", (int)sbrk(0));
+#endif
+
+ if (future < sp->time + 100 * THROW_CATCH_INTERVAL) {
+ refill_juggle(mi);
+ } else if (sp->time > 1<<30) { /* Hard Reset before the clock wraps */
+ init_juggle(mi);
+ }
+}
+
+XSCREENSAVER_MODULE ("Juggle", juggle)
+
+#endif /* MODE_juggle */
diff --git a/hacks/juggle.man b/hacks/juggle.man
new file mode 100644
index 0000000..17ea20b
--- /dev/null
+++ b/hacks/juggle.man
@@ -0,0 +1,181 @@
+'\" t
+.\" ** The above line should force tbl to be used as a preprocessor **
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+juggle - juggling man screen saver.
+.SH SYNOPSIS
+.B juggle
+[\-display host:display.screen ]
+[\-root ]
+[\-window ]
+[\-mono ]
+[\-install | \-noinstall ]
+[\-visual visual ]
+[\-window\-id id ]
+[\-pattern pattern ]
+[\-tail number ]
+[\-real | \-no\-real ]
+[\-describe | \-no\-describe ]
+[\-balls | \-no\-balls ]
+[\-clubs | \-no\-clubs ]
+[\-torches | \-no\-torches ]
+[\-knives | \-no\-knives ]
+[\-rings | \-no\-rings ]
+[\-bballs | \-no\-bballs ]
+[\-count count ]
+[\-cycles cycles ]
+[\-delay delay ]
+[\-ncolors ncolors ]
+[\-fps]
+.SH DESCRIPTION
+Draws a stick-man juggling various collections of objects.
+.SH OPTIONS
+.I juggle
+accepts the following options:
+.TP 8
+.B \-display host:display.screen
+X11 display to use. Overrides
+.B DISPLAY
+environment variable.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created X window. This is the default.
+.TP 8
+.B \-mono
+Draw in monochrome.
+.TP 8
+.B \-install | \-noinstall
+Turn on/off installing colormap.
+.TP 8
+.B \-visual visual
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window\-id id
+Draw on an already existing X window.
+.TP 8
+.B \-pattern\ \(dq pattern \(dq
+Specify juggling pattern in annotated
+.B site-swap
+notation. In
+.B site-swap
+notation, the "height" of each throw is given. E.g., "3" is the height
+needed to juggle a 3\-Cascade. Note that these sequences need to be
+chosen carefully, to avoid collisions.
+
+Annotations indicate relative hand movements or tricks:
+.TS
+cb l.
+\&\- Inside throw (default)
++ Outside throw
+\&= Cross Throw
+& Cross Catch
+x Cross Throw and Catch
+\&_ Bounce
+.TE
+.TP 8
+.B \-pattern\ \(dq[ pattern ]\(dq
+Specify juggling pattern in annotated
+.B Adam
+notation. Adam notation is a little harder to visualize. Each
+integer
+.B n
+represents a cyclic permutation of (0...n). The equivalent
+.B site-swap
+value is determined by calculating how many of the permutations it
+takes to get back to the identity. The largest number used is the
+same as the number of objects in the pattern. The advantage of Adam
+notation is that these sequences do not need to be chosen carefully,
+since all possible sequences are juggle-able. Annotations are the same
+as in
+.B site-swap
+notation.
+
+For example, both of these describe a 3\-Shower:
+.IP
+.B \-pattern\ "+5 1"
+.IP
+.B \-pattern\ "[+3 1]"
+
+For further examples, see the
+.B portfolio
+list in the source code.
+.TP 8
+.B \-tail number
+Minimum Trail Length. 0 \- 100. Default: 1. Objects may override
+this, for example flaming torches always leave a trail.
+.TP 8
+.BR \-real | \-no\-real
+Turn on/off real-time juggling.
+.B Deprecated.
+There should be no need to turn off real-time juggling, even on slow
+systems. Adjust speed using
+.B \-count
+above.
+.TP 8
+.BR \-describe | \-no\-describe
+Turn on/off pattern descriptions.
+.TP 8
+.BR \-balls | \-no\-balls
+Turn on/off Balls.
+.TP 8
+.BR \-clubs | \-no\-clubs
+Turn on/off Clubs.
+.TP 8
+.BR \-torches | \-no\-torches
+Turn on/off Flaming Torches.
+.TP 8
+.BR \-knives | \-no\-knives
+Turn on/off Knives.
+.TP 8
+.BR \-rings | \-no\-rings
+Turn on/off Rings.
+.TP 8
+.BR \-bballs | \-no\-bballs
+Turn on/off Bowling Balls.
+.TP 8
+.B \-count number
+Speed. 50 \- 1000. Default: 200. This determines the expected time
+interval between a throw and the next catch, in milliseconds.
+.TP 8
+.B \-cycles number
+Performance Length. 50 \- 1000. Default: 1000. Setting this smaller
+will force the juggler to switch patterns (and objects) more often.
+.TP 8
+.B \-delay delay
+Additional delay between frames, in microseconds. Default: 10000.
+.B Deprecated.
+Adjust speed using
+.BR \-count .
+.TP 8
+.B \-ncolors ncolors
+Maximum number of colors to use. Default: 32.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1996,2000,2002,2004 by Tim Auckland. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both
+that copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Tim Auckland.
diff --git a/hacks/julia.c b/hacks/julia.c
new file mode 100644
index 0000000..7311ce7
--- /dev/null
+++ b/hacks/julia.c
@@ -0,0 +1,442 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * julia --- continuously varying Julia set.
+ */
+#if 0
+static const char sccsid[] = "@(#)julia.c 4.03 97/04/10 xlockmore";
+#endif
+
+/* Copyright (c) 1995 Sean McCullough <bankshot@mailhost.nmt.edu>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-Jun-06: j.grahl@ucl.ac.uk: tweaked functions for parameter of Julia set
+ * 28-May-97: jwz@jwz.org: added interactive frobbing with the mouse.
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 02-Dec-95: snagged boilerplate from hop.c
+ * used ifs {w0 = sqrt(x-c), w1 = -sqrt(x-c)} with random iteration
+ * to plot the julia set, and sinusoidially varied parameter for set
+ * and plotted parameter with a circle.
+ */
+
+/*-
+ * One thing to note is that batchcount is the *depth* of the search tree,
+ * so the number of points computed is 2^batchcount - 1. I use 8 or 9
+ * on a dx266 and it looks okay. The sinusoidal variation of the parameter
+ * might not be as interesting as it could, but it still gives an idea of
+ * the effect of the parameter.
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*count: 1000 \n" \
+ "*cycles: 20 \n" \
+ "*delay: 10000 \n" \
+ "*ncolors: 200 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define UNIFORM_COLORS
+# define release_julia 0
+# define reshape_julia 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* !STANDALONE */
+
+
+#define DEF_MOUSE "False"
+
+ENTRYPOINT ModeSpecOpt julia_opts = { 0, };
+
+
+#define numpoints ((0x2<<jp->depth)-1)
+
+typedef struct {
+ int centerx;
+ int centery; /* center of the screen */
+ double cr;
+ double ci; /* julia params */
+ int depth;
+ int inc;
+ int circsize;
+ int erase;
+ int pix;
+ long itree;
+ int buffer;
+ int nbuffers;
+ int redrawing, redrawpos;
+ Pixmap pixmap;
+#ifndef HAVE_JWXYZ
+ Cursor cursor;
+#endif
+ GC stippledGC;
+ XPoint **pointBuffer; /* pointer for XDrawPoints */
+ Bool button_down_p;
+ int mouse_x, mouse_y;
+
+} juliastruct;
+
+static juliastruct *julias = NULL;
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+static void
+apply(juliastruct * jp, register double xr, register double xi, int d)
+{
+ double theta, r;
+
+ jp->pointBuffer[jp->buffer][jp->itree].x =
+ (int) (0.5 * xr * jp->centerx + jp->centerx);
+ jp->pointBuffer[jp->buffer][jp->itree].y =
+ (int) (0.5 * xi * jp->centery + jp->centery);
+ jp->itree++;
+
+ if (d > 0) {
+ xi -= jp->ci;
+ xr -= jp->cr;
+
+/* Avoid atan2: DOMAIN error message */
+ if (xi == 0.0 && xr == 0.0)
+ theta = 0.0;
+ else
+ theta = atan2(xi, xr) / 2.0;
+
+ /*r = pow(xi * xi + xr * xr, 0.25); */
+ r = sqrt(sqrt(xi * xi + xr * xr)); /* 3 times faster */
+
+ xr = r * cos(theta);
+ xi = r * sin(theta);
+
+ d--;
+ apply(jp, xr, xi, d);
+ apply(jp, -xr, -xi, d);
+ }
+}
+
+static void
+incr(ModeInfo * mi, juliastruct * jp)
+{
+ if (jp->button_down_p)
+ {
+ jp->cr = ((double) (jp->mouse_x + 2 - jp->centerx)) * 2 / jp->centerx;
+ jp->ci = ((double) (jp->mouse_y + 2 - jp->centery)) * 2 / jp->centery;
+ }
+ else
+ {
+#if 0
+ jp->cr = 1.5 * (sin(M_PI * (jp->inc / 300.0)) *
+ sin(jp->inc * M_PI / 200.0));
+ jp->ci = 1.5 * (cos(M_PI * (jp->inc / 300.0)) *
+ cos(jp->inc * M_PI / 200.0));
+
+ jp->cr += 0.5 * cos(M_PI * jp->inc / 400.0);
+ jp->ci += 0.5 * sin(M_PI * jp->inc / 400.0);
+#else
+ jp->cr = 1.5 * (sin(M_PI * (jp->inc / 290.0)) *
+ sin(jp->inc * M_PI / 210.0));
+ jp->ci = 1.5 * (cos(M_PI * (jp->inc / 310.0)) *
+ cos(jp->inc * M_PI / 190.0));
+
+ jp->cr += 0.5 * cos(M_PI * jp->inc / 395.0);
+ jp->ci += 0.5 * sin(M_PI * jp->inc / 410.0);
+#endif
+ }
+}
+
+ENTRYPOINT void
+init_julia(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ juliastruct *jp;
+ XGCValues gcv;
+ int i;
+
+ MI_INIT (mi, julias);
+ jp = &julias[MI_SCREEN(mi)];
+
+ jp->centerx = MI_WIN_WIDTH(mi) / 2;
+ jp->centery = MI_WIN_HEIGHT(mi) / 2;
+
+ jp->depth = MI_BATCHCOUNT(mi);
+ if (jp->depth > 10)
+ jp->depth = 10;
+
+
+#ifndef HAVE_JWXYZ
+ if (jp->button_down_p && !jp->cursor && !jp->cursor)
+ {
+ Pixmap bit;
+ XColor black;
+ black.red = black.green = black.blue = 0;
+ black.flags = DoRed|DoGreen|DoBlue;
+ bit = XCreatePixmapFromBitmapData (display, window, "\000", 1, 1,
+ MI_WIN_BLACK_PIXEL(mi),
+ MI_WIN_BLACK_PIXEL(mi), 1);
+ jp->cursor = XCreatePixmapCursor (display, bit, bit, &black, &black,
+ 0, 0);
+ XFreePixmap (display, bit);
+ }
+#endif /* HAVE_JWXYZ */
+
+ if (jp->pixmap != None &&
+ jp->circsize != (MIN(jp->centerx, jp->centery) / 60) * 2 + 1) {
+ XFreePixmap(display, jp->pixmap);
+ jp->pixmap = None;
+ }
+ if (jp->pixmap == None) {
+ GC fg_gc = None, bg_gc = None;
+
+ jp->circsize = MAX(8, (MIN(jp->centerx, jp->centery) / 96) * 2 + 1);
+ jp->pixmap = XCreatePixmap(display, window, jp->circsize, jp->circsize, 1);
+ gcv.foreground = 1;
+ fg_gc = XCreateGC(display, jp->pixmap, GCForeground, &gcv);
+ gcv.foreground = 0;
+ bg_gc = XCreateGC(display, jp->pixmap, GCForeground, &gcv);
+ XFillRectangle(display, jp->pixmap, bg_gc,
+ 0, 0, jp->circsize, jp->circsize);
+ if (jp->circsize < 2)
+ XDrawPoint(display, jp->pixmap, fg_gc, 0, 0);
+ else
+ XFillArc(display, jp->pixmap, fg_gc,
+ 0, 0, jp->circsize, jp->circsize, 0, 23040);
+ if (fg_gc != None)
+ XFreeGC(display, fg_gc);
+ if (bg_gc != None)
+ XFreeGC(display, bg_gc);
+ }
+
+#ifndef HAVE_JWXYZ
+ if (MI_WIN_IS_INROOT(mi))
+ ;
+ else if (jp->circsize > 0)
+ XDefineCursor (display, window, jp->cursor);
+ else
+ XUndefineCursor (display, window);
+#endif /* HAVE_JWXYZ */
+
+ if (!jp->stippledGC) {
+ gcv.foreground = MI_WIN_BLACK_PIXEL(mi);
+ gcv.background = MI_WIN_BLACK_PIXEL(mi);
+ if ((jp->stippledGC = XCreateGC(display, window,
+ GCForeground | GCBackground, &gcv)) == None)
+ return;
+ }
+ if (MI_NPIXELS(mi) > 2)
+ jp->pix = NRAND(MI_NPIXELS(mi));
+ jp->inc = ((LRAND() & 1) * 2 - 1) * NRAND(200);
+ jp->nbuffers = (MI_CYCLES(mi) + 1);
+ if (!jp->pointBuffer)
+ jp->pointBuffer = (XPoint **) calloc(jp->nbuffers, sizeof (XPoint *));
+ for (i = 0; i < jp->nbuffers; ++i)
+ if (jp->pointBuffer[i])
+ (void) memset((char *) jp->pointBuffer[i], 0,
+ numpoints * sizeof (XPoint));
+ else
+ jp->pointBuffer[i] = (XPoint *) calloc(numpoints, sizeof (XPoint));
+ jp->buffer = 0;
+ jp->redrawing = 0;
+ jp->erase = 0;
+ XClearWindow(display, window);
+}
+
+
+ENTRYPOINT Bool
+julia_handle_event (ModeInfo *mi, XEvent *event)
+{
+ juliastruct *jp = &julias[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ jp->button_down_p = True;
+ jp->mouse_x = event->xbutton.x;
+ jp->mouse_y = event->xbutton.y;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ jp->button_down_p = False;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && jp->button_down_p)
+ {
+ jp->mouse_x = event->xmotion.x;
+ jp->mouse_y = event->xmotion.y;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+/* hack: moved here by jwz. */
+#define ERASE_IMAGE(d,w,g,x,y,xl,yl,xs,ys) \
+if (yl<y) \
+(y<yl+ys)?XFillRectangle(d,w,g,xl,yl,xs,y-yl): \
+XFillRectangle(d,w,g,xl,yl,xs,ys); \
+else if (yl>y) \
+(y>yl-ys)?XFillRectangle(d,w,g,xl,y+ys,xs,yl-y): \
+XFillRectangle(d,w,g,xl,yl,xs,ys); \
+if (xl<x) \
+(x<xl+xs)?XFillRectangle(d,w,g,xl,yl,x-xl,ys): \
+XFillRectangle(d,w,g,xl,yl,xs,ys); \
+else if (xl>x) \
+(x>xl-xs)?XFillRectangle(d,w,g,x+xs,yl,xl-x,ys): \
+XFillRectangle(d,w,g,xl,yl,xs,ys)
+
+
+ENTRYPOINT void
+draw_julia (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ juliastruct *jp = &julias[MI_SCREEN(mi)];
+ double r, theta;
+ register double xr = 0.0, xi = 0.0;
+ int k = 64, rnd = 0, i, j;
+ XPoint *xp = jp->pointBuffer[jp->buffer], old_circle, new_circle;
+
+ old_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2;
+ old_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2;
+ incr(mi, jp);
+ new_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2;
+ new_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2;
+ XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+ XFillArc(display, window, gc,
+ old_circle.x-jp->circsize/2-2,
+ old_circle.y-jp->circsize/2-2,
+ jp->circsize+4, jp->circsize+4,
+ 0, 360*64);
+ /* draw a circle at the c-parameter so you can see it's effect on the
+ structure of the julia set */
+ XSetForeground(display, jp->stippledGC, MI_WIN_WHITE_PIXEL(mi));
+#ifndef HAVE_JWXYZ
+ XSetTSOrigin(display, jp->stippledGC, new_circle.x, new_circle.y);
+ XSetStipple(display, jp->stippledGC, jp->pixmap);
+ XSetFillStyle(display, jp->stippledGC, FillOpaqueStippled);
+#endif /* HAVE_JWXYZ */
+ XDrawArc(display, window, jp->stippledGC,
+ new_circle.x-jp->circsize/2,
+ new_circle.y-jp->circsize/2,
+ jp->circsize, jp->circsize,
+ 0, 360*64);
+
+ if (jp->erase == 1) {
+ XDrawPoints(display, window, gc,
+ jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin);
+ }
+ jp->inc++;
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, gc, MI_PIXEL(mi, jp->pix));
+ if (++jp->pix >= MI_NPIXELS(mi))
+ jp->pix = 0;
+ } else
+ XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+ while (k--) {
+
+ /* save calls to LRAND by using bit shifts over and over on the same
+ int for 32 iterations, then get a new random int */
+ if (!(k % 32))
+ rnd = LRAND();
+
+ /* complex sqrt: x^0.5 = radius^0.5*(cos(theta/2) + i*sin(theta/2)) */
+
+ xi -= jp->ci;
+ xr -= jp->cr;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (xi == 0.0 && xr == 0.0)
+ theta = 0.0;
+ else
+ theta = atan2(xi, xr) / 2.0;
+
+ /*r = pow(xi * xi + xr * xr, 0.25); */
+ r = sqrt(sqrt(xi * xi + xr * xr)); /* 3 times faster */
+
+ xr = r * cos(theta);
+ xi = r * sin(theta);
+
+ if ((rnd >> (k % 32)) & 0x1) {
+ xi = -xi;
+ xr = -xr;
+ }
+ xp->x = jp->centerx + (int) ((jp->centerx >> 1) * xr);
+ xp->y = jp->centery + (int) ((jp->centery >> 1) * xi);
+ xp++;
+ }
+
+ jp->itree = 0;
+ apply(jp, xr, xi, jp->depth);
+
+ XDrawPoints(display, window, gc,
+ jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin);
+
+ jp->buffer++;
+ if (jp->buffer > jp->nbuffers - 1) {
+ jp->buffer -= jp->nbuffers;
+ jp->erase = 1;
+ }
+ if (jp->redrawing) {
+ for (i = 0; i < REDRAWSTEP; i++) {
+ j = (jp->buffer - jp->redrawpos + jp->nbuffers) % jp->nbuffers;
+ XDrawPoints(display, window, gc,
+ jp->pointBuffer[j], numpoints, CoordModeOrigin);
+
+ if (++(jp->redrawpos) >= jp->nbuffers) {
+ jp->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+ENTRYPOINT void
+free_julia (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ juliastruct *jp = &julias[MI_SCREEN(mi)];
+ int buffer;
+
+ if (jp->pointBuffer) {
+ for (buffer = 0; buffer < jp->nbuffers; buffer++)
+ if (jp->pointBuffer[buffer])
+ (void) free((void *) jp->pointBuffer[buffer]);
+ (void) free((void *) jp->pointBuffer);
+ }
+ if (jp->stippledGC != None)
+ XFreeGC(display, jp->stippledGC);
+ if (jp->pixmap != None)
+ XFreePixmap(display, jp->pixmap);
+#ifndef HAVE_JWXYZ
+ if (jp->cursor)
+ XFreeCursor (display, jp->cursor);
+#endif
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_julia (ModeInfo * mi)
+{
+ juliastruct *jp = &julias[MI_SCREEN(mi)];
+
+ jp->redrawing = 1;
+ jp->redrawpos = 0;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Julia", julia)
diff --git a/hacks/julia.man b/hacks/julia.man
new file mode 100644
index 0000000..4e0f2e8
--- /dev/null
+++ b/hacks/julia.man
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "28-May-97" "X Version 11"
+.SH NAME
+julia - draws spinning, animating julia-set fractals
+.SH SYNOPSIS
+.B julia
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIjulia\fP program draws spinning, animating julia-set fractals.
+
+It uses ifs {w0 = sqrt(x-c), w1 = -sqrt(x-c)} with random iteration
+to plot the julia set, and sinusoidially varied parameters for the set,
+and plots parameters with a circle.
+
+One thing to note is that count is the \fIdepth\fP of the search tree,
+so the number of points computed is (2^count)-1. I use 8 or 9 on a
+dx266 and it looks okay. The sinusoidal variation of the parameter
+might not be as interesting as it could, but it still gives an idea
+of the effect of the parameter.
+
+Dragging the mouse in the window uses the mouse's position as the
+control point for the generation of ths set.
+.SH OPTIONS
+.I julia
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by Sean McCullough.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Sean McCullough <bankshot@mailhost.nmt.edu>, 1995.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/kaleidescope.c b/hacks/kaleidescope.c
new file mode 100644
index 0000000..87a8236
--- /dev/null
+++ b/hacks/kaleidescope.c
@@ -0,0 +1,490 @@
+/* kaleidescope, Copyright (c) 1997, 2006 Ron Tapia <tapia@nmia.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ * The above, for lack of a better copyright statement in easy reach
+ * was just lifted from the xscreensaver source.
+ *
+ * One of the odd things about this hack is that the radial motion of the
+ * segments depends on roundoff error alone.
+ *
+ * I tried to make the source easy to add other shapes. So far, I've
+ * only messed with elipses and I couldn't do much with them that looked
+ * cool. A nice addition would be to add some sort of spline based shapes.
+ * Maybe rectangles would look nice.
+ *
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <time.h>
+#include "screenhack.h"
+#include "spline.h"
+
+#define NEWX(x,y) ((x*g->costheta) + (y*g->sintheta))
+#define NEWY(x,y) ((y*g->costheta) - (x*g->sintheta))
+
+
+typedef struct state GLOBAL;
+typedef struct Obj OBJECT;
+struct Obj {
+ int type;
+ int time;
+ void (*propigate) (GLOBAL *, OBJECT *);
+ void (*draw) (GLOBAL *, OBJECT *);
+ void (*init) (GLOBAL *, OBJECT *);
+ void *cur;
+};
+
+typedef struct KSEGMENT {
+ struct KSEGMENT *next;
+ XColor color;
+ int drawn;
+ short int x1,y1,x2,y2; /* these are in the natural coordinate system */
+ XSegment *xsegments; /* these are in the X coordinate system */
+} Ksegment;
+
+struct state {
+ int xoff, yoff; /* offset of origin xmax/2, ymax/2 */
+ int xmax, ymax; /* width, height of window */
+ float costheta, sintheta;
+ int symmetry;
+ int ntrails;
+ int nsegments;
+ int narcs;
+ int nobjects;
+ int local_rotation;
+ int global_rotation;
+ int spring_constant;
+ Colormap cmap;
+ GC draw_gc;
+ GC erase_gc;
+ unsigned int default_fg_pixel;
+ Display *dpy;
+ Window window;
+ unsigned long delay;
+ unsigned short redmin,redrange,greenmin,greenrange,bluemin,bluerange;
+ int color_mode;
+
+ OBJECT *objects;
+ int counter;
+
+ int done_once;
+};
+
+
+static const char *kaleidescope_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*color_mode: nice",
+ "*symmetry: 11",
+ "*ntrails: 100",
+ "*nsegments: 7",
+ "*narcs: 0",
+ "*local_rotation: -59",
+ "*global_rotation: 1",
+ "*spring_constant: 5",
+ "*delay: 20000",
+ "*redmin: 30000",
+ "*redrange: 20000",
+ "*greenmin: 30000",
+ "*greenrange: 20000",
+ "*bluemin: 30000",
+ "*bluerange: 20000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec kaleidescope_options [] = {
+ { "-color_mode", ".color_mode", XrmoptionSepArg, 0 },
+ { "-symmetry", ".symmetry", XrmoptionSepArg, 0 },
+ { "-nsegments", ".nsegments", XrmoptionSepArg, 0 },
+ { "-ntrails", ".ntrails", XrmoptionSepArg, 0 },
+ { "-local_rotation", ".local_rotation", XrmoptionSepArg, 0 },
+ { "-global_rotation", ".global_rotation", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-spring_constant", ".spring_constant", XrmoptionSepArg, 0 },
+ { "-redmin", ".redmin", XrmoptionSepArg, 0 },
+ { "-redrange", ".redrange", XrmoptionSepArg, 0 },
+ { "-bluemin", ".bluemin", XrmoptionSepArg, 0 },
+ { "-bluerange", ".bluerange", XrmoptionSepArg, 0 },
+ { "-greenmin", ".greenmin", XrmoptionSepArg, 0 },
+ { "-greenrange", ".greenrange", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+/* END global variables */
+
+static void
+krandom_color(GLOBAL *g, XColor *color)
+{
+ if((g->color_mode == 0) || (g->color_mode == 1)) {
+
+ color->blue = (random() % g->bluerange) + g->bluemin;
+ color->green = (random() % g->greenrange) + g->greenmin;
+ color->red = (random() % g->redrange) + g->redmin;
+
+ if(!XAllocColor(g->dpy, g->cmap, color)) {
+ color->pixel = g->default_fg_pixel;
+ }
+ return;
+ } else {
+ color->pixel = g->default_fg_pixel;
+ return;
+ }
+}
+
+
+static void
+kcopy_color(XColor *to, XColor *from)
+{
+ to->red = from->red;
+ to->green = from->green;
+ to->blue = from->blue;
+ to->pixel = from->pixel;
+}
+
+static void
+kcycle_color(GLOBAL *g,
+ XColor *color,
+ unsigned short redstep,
+ unsigned short greenstep,
+ unsigned short bluestep)
+{
+ unsigned short red,green,blue;
+
+ if (! g->color_mode) {
+ XColor copy;
+ color->flags = DoRed|DoGreen|DoBlue;
+ color->red = (red = color->red) - redstep;
+ color->green = (green = color->green) - greenstep;
+ color->blue = (blue = color->blue) - bluestep;
+ copy = *color;
+
+ if(!XAllocColor(g->dpy, g->cmap, color)) {
+ /* printf("couldn't alloc color...\n"); */
+ color->pixel = g->default_fg_pixel;
+ }
+ copy.pixel = color->pixel;
+ *color = copy;
+
+ color->red = red - redstep;
+ color->green = green- greenstep;
+ color->blue = blue - bluestep;
+ return;
+ }
+}
+
+
+static Ksegment *
+create_ksegment (GLOBAL *g)
+{
+ Ksegment *seg, *prev;
+ XColor new_color;
+ int i;
+ unsigned short redstep,bluestep,greenstep;
+
+ krandom_color(g, &new_color);
+
+ redstep = new_color.red/(2 * g->ntrails);
+ greenstep = new_color.green/(2 * g->ntrails);
+ bluestep = new_color.blue/(2 * g->ntrails);
+
+ seg = (Ksegment *) malloc(sizeof(Ksegment));
+ seg->xsegments = (XSegment *) malloc(g->symmetry * sizeof(XSegment));
+
+ prev = seg;
+ for(i=0; i< (g->ntrails - 1); i++) {
+
+ kcycle_color(g, &new_color,redstep,greenstep,bluestep);
+
+ kcopy_color(&(prev->color), &new_color);
+
+ prev->next = (Ksegment*)malloc(sizeof(Ksegment));
+ (prev->next)->xsegments = (XSegment*)malloc(g->symmetry * sizeof(XSegment));
+ prev->drawn = 0;
+ prev = (prev->next);
+ }
+
+ prev->drawn = 0;
+ prev->next = seg;
+ kcopy_color(&(prev->color), &new_color);
+
+ return seg;
+}
+
+static void
+init_ksegment (GLOBAL *g, OBJECT *obj)
+{
+
+ /* Give the segment some random values */
+ ((Ksegment *)obj->cur)->x1 = (g->xoff ? random() % g->xoff : 0);
+ ((Ksegment *)obj->cur)->y1 = (g->yoff ? random() % g->yoff : 0);
+ ((Ksegment *)obj->cur)->x2 = (g->xoff ? random() % g->xoff : 0);
+ ((Ksegment *)obj->cur)->y2 = (g->yoff ? random() % g->yoff : 0);
+}
+
+
+static void
+draw_ksegment (GLOBAL *g, OBJECT *obj)
+{
+ register short x1, y1, x2, y2;
+ int dx, dy;
+ int i;
+
+ g->counter++;
+
+ x1 = ((Ksegment *)obj->cur)->x1; /* in the natural coordinate system */
+ y1 = ((Ksegment *)obj->cur)->y1;
+ x2 = ((Ksegment *)obj->cur)->x2;
+ y2 = ((Ksegment *)obj->cur)->y2;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+
+ /* maybe throw away values and start over */
+ if( ((dx*dx) + (dy * dy)) < 100) {
+ init_ksegment (g, obj);
+ x1 = ((Ksegment *)obj->cur)->x1; /* in the natural coordinate system */
+ y1 = ((Ksegment *)obj->cur)->y1;
+ x2 = ((Ksegment *)obj->cur)->x2;
+ y2 = ((Ksegment *)obj->cur)->y2;
+ }
+
+ for (i=0; i<g->symmetry; i++) {
+ (((Ksegment *)obj->cur)->xsegments)[i].x1 = NEWX(x1,y1);
+ (((Ksegment *)obj->cur)->xsegments)[i].y1 = NEWY(x1,y1);
+ (((Ksegment *)obj->cur)->xsegments)[i].x2 = NEWX(x2,y2);
+ (((Ksegment *)obj->cur)->xsegments)[i].y2 = NEWY(x2,y2);
+
+ (((Ksegment *)obj->cur)->xsegments)[i].x1 = (x1 = (((Ksegment *)obj->cur)->xsegments)[i].x1) + g->xoff;
+ (((Ksegment *)obj->cur)->xsegments)[i].y1 = (y1 = (((Ksegment *)obj->cur)->xsegments)[i].y1) + g->yoff;
+ (((Ksegment *)obj->cur)->xsegments)[i].x2 = (x2 = (((Ksegment *)obj->cur)->xsegments)[i].x2) + g->xoff;
+ (((Ksegment *)obj->cur)->xsegments)[i].y2 = (y2 = (((Ksegment *)obj->cur)->xsegments)[i].y2) + g->yoff;
+ }
+
+ XSetForeground(g->dpy, g->draw_gc, (((Ksegment *)obj->cur)->color).pixel);
+
+ XDrawSegments(g->dpy, g->window, g->draw_gc, ((Ksegment *)obj->cur)->xsegments, g->symmetry);
+ ((Ksegment *)obj->cur)->drawn = 1;
+
+ if (((((Ksegment *)obj->cur)->next)->drawn) != 0) {
+ XDrawSegments(g->dpy, g->window, g->erase_gc, ((Ksegment *)obj->cur)->next->xsegments, g->symmetry);
+ }
+}
+
+static void
+propigate_ksegment(GLOBAL *g, OBJECT *obj)
+{
+ int t;
+ short int x1,y1,x2,y2;
+ short int midx,midy,nmidx,nmidy;
+ float lsin, lcos, gsin, gcos;
+
+ lsin = sin((2*M_PI/10000)*g->local_rotation);
+ lcos = cos((2*M_PI/10000)*g->local_rotation);
+ gsin = sin((2*M_PI/10000)*g->global_rotation);
+ gcos = cos((2*M_PI/10000)*g->global_rotation);
+
+ t=obj->time;
+ obj->time = t + 1;
+
+ x1 = ((Ksegment *) obj->cur)->x1;
+ y1 = ((Ksegment *) obj->cur)->y1;
+ x2 = ((Ksegment *) obj->cur)->x2;
+ y2 = ((Ksegment *) obj->cur)->y2;
+
+ midx = (x1 + x2)/2;
+ midy = (y1 + y2)/2;
+
+ nmidx = midx*gcos + midy*gsin;
+ nmidy = midy*gcos - midx*gsin;
+
+ x1 = x1 - midx;
+ x2 = x2 - midx;
+ y1 = y1 - midy;
+ y2 = y2 - midy;
+
+
+ /* This is where we move to the next ksegment... */
+ obj->cur = ((Ksegment *)obj->cur)->next;
+
+ ((Ksegment *)obj->cur)->x1 = ((x1*lcos) + (y1*lsin)) + nmidx;
+ ((Ksegment *)obj->cur)->y1 = ((y1*lcos) - (x1*lsin)) + nmidy;
+ ((Ksegment *)obj->cur)->x2 = ((x2*lcos) + (y2*lsin)) + nmidx;
+ ((Ksegment *)obj->cur)->y2 = ((y2*lcos) - (x2*lsin)) + nmidy;
+
+ return ;
+}
+
+static void
+init_objects (GLOBAL *g)
+{
+ int i;
+ for (i=0; i<g->nobjects; i++) {
+ (g->objects[i].init)(g, g->objects + i);
+ }
+}
+
+static void
+create_objects (GLOBAL *g)
+{
+ int i;
+
+ g->objects = (OBJECT *) malloc(g->nobjects * sizeof(OBJECT));
+
+ for (i=0; i< g->nsegments; i++) {
+ g->objects[i].cur = create_ksegment(g);
+ g->objects[i].type = 1;
+ g->objects[i].time = 0;
+ g->objects[i].propigate = propigate_ksegment;
+ g->objects[i].draw = draw_ksegment;
+ g->objects[i].init = init_ksegment;
+ }
+
+ /* Here we can add creation functions for other object types. */
+}
+
+
+static void
+propigate_objects (GLOBAL *g)
+{
+ int i;
+
+ for(i=0; i<g->nobjects; i++) {
+ g->objects[i].propigate(g, g->objects + i);
+ }
+}
+
+static void
+draw_objects (GLOBAL *g)
+{
+ int i;
+
+ for(i=0; i<g->nobjects; i++) {
+ g->objects[i].draw(g, g->objects + i);
+ }
+}
+
+static void
+init_g (GLOBAL *g)
+{
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+ char *color_mode_str;
+
+ g->symmetry = get_integer_resource(g->dpy, "symmetry", "Integer");
+ g->ntrails = get_integer_resource(g->dpy, "ntrails" , "Integer");
+ g->nsegments = get_integer_resource(g->dpy, "nsegments", "Integer");
+ g->narcs = get_integer_resource(g->dpy, "narcs", "Integer");
+ g->local_rotation = get_integer_resource(g->dpy, "local_rotation", "Integer");
+ g->global_rotation = get_integer_resource(g->dpy, "global_rotation", "Integer");
+ g->spring_constant = get_integer_resource(g->dpy, "spring_constant", "Integer");
+ g->delay = get_integer_resource(g->dpy, "delay", "Integer");
+ g->nobjects = g->nsegments + g->narcs;
+
+ color_mode_str = get_string_resource(g->dpy, "color_mode", "color_mode");
+
+ /* make into an enum... */
+ if(!color_mode_str) {
+ g->color_mode = 0;
+ } else if (!strcmp(color_mode_str, "greedy")) {
+ g->color_mode = 0;
+ } else if (!strcmp(color_mode_str, "nice")) {
+ g->color_mode = 1;
+ } else {
+ g->color_mode = 2;
+ }
+
+ XGetWindowAttributes (g->dpy, g->window, &xgwa);
+ g->xmax = xgwa.width;
+ g->ymax = xgwa.height;
+ g->xoff = g->xmax/2;
+ g->yoff = g->ymax/2;
+ g->costheta = cos(2*M_PI/g->symmetry);
+ g->sintheta = sin(2*M_PI/g->symmetry);
+ g->cmap = xgwa.colormap;
+
+ g->redmin = get_integer_resource(g->dpy, "redmin", "Integer");
+ g->redrange = get_integer_resource(g->dpy, "redrange", "Integer");
+ g->greenmin = get_integer_resource(g->dpy, "greenmin", "Integer");
+ g->greenrange = get_integer_resource(g->dpy, "greenrange", "Integer");
+ g->bluemin = get_integer_resource(g->dpy, "bluemin", "Integer");
+ g->bluerange = get_integer_resource(g->dpy, "bluerange", "Integer");
+
+ gcv.line_width = 1;
+ gcv.cap_style = CapRound;
+ gcv.foreground = g->default_fg_pixel = get_pixel_resource (g->dpy, g->cmap, "foreground", "Foreground");
+ g->draw_gc = XCreateGC (g->dpy, g->window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+
+ gcv.foreground = get_pixel_resource (g->dpy, g->cmap, "background", "Background");
+ g->erase_gc = XCreateGC (g->dpy, g->window, GCForeground|GCLineWidth|GCCapStyle,&gcv);
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (g->dpy, g->draw_gc, False);
+ jwxyz_XSetAntiAliasing (g->dpy, g->erase_gc, False);
+# endif
+
+
+}
+
+static void *
+kaleidescope_init (Display *dpy, Window window)
+{
+ GLOBAL *g = (GLOBAL *) calloc (1, sizeof(*g));
+ g->dpy = dpy;
+ g->window = window;
+ init_g (g);
+ create_objects(g);
+ init_objects (g);
+ return g;
+}
+
+static unsigned long
+kaleidescope_draw (Display *dpy, Window window, void *closure)
+{
+ GLOBAL *g = (GLOBAL *) closure;
+ if (g->done_once)
+ propigate_objects(g);
+ else
+ g->done_once = 1;
+ draw_objects (g);
+ return g->delay;
+}
+
+static void
+kaleidescope_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ GLOBAL *g = (GLOBAL *) closure;
+ g->xmax = w;
+ g->ymax = h;
+ g->xoff = g->xmax/2;
+ g->yoff = g->ymax/2;
+}
+
+static Bool
+kaleidescope_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+kaleidescope_free (Display *dpy, Window window, void *closure)
+{
+ GLOBAL *g = (GLOBAL *) closure;
+ free (g);
+}
+
+XSCREENSAVER_MODULE ("Kaleidescope", kaleidescope)
diff --git a/hacks/kaleidescope.man b/hacks/kaleidescope.man
new file mode 100644
index 0000000..2c9ba2b
--- /dev/null
+++ b/hacks/kaleidescope.man
@@ -0,0 +1,89 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH Kaleidescpe 1 "14-Dec-95" "X Version 11"
+.SH NAME
+Kaleidescope - rotating line segments
+.SH SYNOPSIS
+.B kaleidescope
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-color_mode \fImono | nice | greedy\fP] [-nsegments \fIint\fP] [\-ntrails \fIint\fP] [\-local_rotation \fIint\fP] [\-global_rotation \fIint\fP] [\-delay \fIusecs\fP] [\-redmin \fIint\fP] [\-greenmin \fIint\fP] [\-bluemin \fIint\fP] [\-redrange \fIint\fP] [\-greenrange \fIint\fP] [\-bluerange \fIint\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIkaleidescope\fP program draws line segments in a symmetric pattern
+that evolves over time.
+.SH OPTIONS
+.I kaleidescope
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-color_mode "mono | nice | greedy"
+Specify how kaleidescope uses colors. Mono uses
+just the default foreground and background colors. Nice uses one
+color for each segment (specified by nsegments). Greedy uses (ntrails * nsegments) + 1 colors.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-nsegments integer
+The number of segments to draw. Default is 7.
+.TP 8
+.B \-ntrails integer
+The number of trails to draw. Default is 100.
+.TP 8
+.B \-local_rotation integer
+The rate at which segments rotate around their center. Default is -59.
+.TP 8
+.B \-global_rotation integer
+The rate at which segments rotate around the center of the window.
+Default is 1.
+.TP 8
+.B \-redmin, \-greenmin, \-bluemin, \-redrange, \-greenrange, \-bluerange
+All take an integer argument. When colors are randomly chosen, they
+are chosen from the interval min to min plus range. The minimums default
+to 30000. The ranges default to 20000.
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default is 20000, or about 5 frames a second.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR kaleidescope (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 1997 by Ron Tapia. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ron Tapia <tapia@nmia.com>, 20-Mar-97.
+
diff --git a/hacks/kumppa.c b/hacks/kumppa.c
new file mode 100644
index 0000000..2e2955b
--- /dev/null
+++ b/hacks/kumppa.c
@@ -0,0 +1,537 @@
+/*
+
+Copyright (C) Teemu Suutari (temisu@utu.fi) Feb 1998
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+*/
+
+
+
+
+/*
+
+*** This is contest-version. Don't look any further, code is *very* ugly.
+
+*/
+
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static const char *kumppa_defaults [] ={
+ ".background: black",
+ ".lowrez: true",
+ "*fpsSolid: true",
+ "*speed: 0.1",
+ "*delay: 10000",
+ "*random: True",
+ /* leave this off by default, since it slows things down. -- jwz. */
+ "*useDBE: False",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec kumppa_options [] = {
+ {"-delay", ".delay", XrmoptionSepArg, 0 },
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+ {"-random", ".random", XrmoptionNoArg, "True" },
+ {"-no-random", ".random", XrmoptionNoArg, "False" },
+ {"-db", ".useDBE", XrmoptionNoArg, "True" },
+ {"-no-db", ".useDBE", XrmoptionNoArg, "False" },
+ {0,0,0,0}
+};
+
+static const unsigned char colors[96]=
+ {0,0,255, 0,51,255, 0,102,255, 0,153,255, 0,204,255,
+ 0,255,255,0,255,204, 0,255,153, 0,255,102, 0,255,51,
+ 0,255,0, 51,255,0, 102,255,0, 153,255,0, 204,255,0,
+ 255,255,0, 255,204,0, 255,153,0, 255,102,0, 255,51,0,
+ 255,0,0, 255,0,51, 255,0,102, 255,0,153, 255,0,204,
+ 255,0,255, 219,0,255, 182,0,255, 146,0,255, 109,0,255,
+ 73,0,255, 37,0,255};
+static const float cosinus[8][6]=
+ {{-0.07,0.12,-0.06,32,25,37},{0.08,-0.03,0.05,51,46,32},{0.12,0.07,-0.13,27,45,36},
+ {0.05,-0.04,-0.07,36,27,39},{-0.02,-0.07,0.1,21,43,42},{-0.11,0.06,0.02,51,25,34},{0.04,-0.15,0.02,42,32,25},
+ {-0.02,-0.04,-0.13,34,20,15}};
+
+
+struct state {
+ Display *dpy;
+ Window win[2];
+
+ float acosinus[8][3];
+ int coords[8];
+ int ocoords[8];
+
+ GC fgc[33];
+ GC cgc;
+ int sizx,sizy;
+ int midx,midy;
+ unsigned long delay;
+ Bool cosilines;
+
+ int *Xrotations;
+ int *Yrotations;
+ int *Xrottable;
+ int *Yrottable;
+
+ int *rotateX;
+ int *rotateY;
+
+ int rotsizeX,rotsizeY;
+ int stateX,stateY;
+
+ int rx,ry;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeSwapInfo xdswp;
+ Bool usedouble;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ int draw_count;
+};
+
+
+static int Satnum(int maxi)
+{
+ return (int)(maxi*frand(1));
+}
+
+
+static void palaRotate(struct state *st, int x,int y)
+{
+ int ax,ay,bx,by,cx,cy;
+
+ ax=st->rotateX[x];
+ ay=st->rotateY[y];
+ bx=st->rotateX[x+1]+2;
+ by=st->rotateY[y+1]+2;
+ cx=st->rotateX[x]-(y-st->ry)+x-st->rx;
+ cy=st->rotateY[y]+(x-st->rx)+y-st->ry;
+ if (cx<0)
+ {
+ ax-=cx;
+ cx=0;
+ }
+ if (cy<0)
+ {
+ ay-=cy;
+ cy=0;
+ }
+ if (cx+bx-ax>st->sizx) bx=ax-cx+st->sizx;
+ if (cy+by-ay>st->sizy) by=ay-cy+st->sizy;
+ if (ax<bx && ay<by)
+ XCopyArea(st->dpy,st->win[0],st->win[1],st->cgc,ax,ay,bx-ax,by-ay,cx,cy);
+}
+
+
+static void rotate(struct state *st)
+{
+ int x,y;
+ int dx,dy;
+
+ st->rx=st->Xrottable[st->stateX+1]-st->Xrottable[st->stateX];
+ st->ry=st->Yrottable[st->stateY+1]-st->Yrottable[st->stateY];
+
+
+ for (x=0;x<=st->rx;x++)
+ st->rotateX[x]=(x)?st->midx-1-st->Xrotations[st->Xrottable[st->stateX+1]-x]:0;
+ for (x=0;x<=st->rx;x++)
+ st->rotateX[x+st->rx+1]=(x==st->rx)?st->sizx-1:st->midx+st->Xrotations[st->Xrottable[st->stateX]+x];
+ for (y=0;y<=st->ry;y++)
+ st->rotateY[y]=(y)?st->midy-1-st->Yrotations[st->Yrottable[st->stateY+1]-y]:0;
+ for (y=0;y<=st->ry;y++)
+ st->rotateY[y+st->ry+1]=(y==st->ry)?st->sizy-1:st->midy+st->Yrotations[st->Yrottable[st->stateY]+y];
+
+ x=(st->rx>st->ry)?st->rx:st->ry;
+ for (dy=0;dy<(x+1)<<1;dy++)
+ for (dx=0;dx<(x+1)<<1;dx++)
+ {
+ y=(st->rx>st->ry)?st->ry-st->rx:0;
+ if (dy+y>=0 && dy<(st->ry+1)<<1 && dx<(st->rx+1)<<1)
+ if (dy+y+dx<=st->ry+st->rx && dy+y-dx<=st->ry-st->rx)
+ {
+ palaRotate(st, (st->rx<<1)+1-dx,dy+y);
+ palaRotate(st, dx,(st->ry<<1)+1-dy-y);
+ }
+ y=(st->ry>st->rx)?st->rx-st->ry:0;
+ if (dy+y>=0 && dx<(st->ry+1)<<1 && dy<(st->rx+1)<<1)
+ if (dy+y+dx<=st->ry+st->rx && dx-dy-y>=st->ry-st->rx)
+ {
+ palaRotate(st, dy+y,dx);
+ palaRotate(st, (st->rx<<1)+1-dy-y,(st->ry<<1)+1-dx);
+ }
+ }
+ st->stateX++;
+ if (st->stateX==st->rotsizeX) st->stateX=0;
+ st->stateY++;
+ if (st->stateY==st->rotsizeY) st->stateY=0;
+}
+
+
+
+static Bool make_rots(struct state *st, double xspeed,double yspeed)
+{
+ int a,b,c,f,g,j,k=0,l;
+ double m,om,ok;
+ double d,ix,iy;
+ int maxi;
+
+ Bool *chks;
+
+ st->rotsizeX=(int)(2/xspeed+1);
+ ix=(double)(st->midx+1)/(double)(st->rotsizeX);
+ st->rotsizeY=(int)(2/yspeed+1);
+ iy=(double)(st->midy+1)/(double)(st->rotsizeY);
+
+ st->Xrotations=malloc((st->midx+2)*sizeof(unsigned int));
+ st->Xrottable=malloc((st->rotsizeX+1)*sizeof(unsigned int));
+ st->Yrotations=malloc((st->midy+2)*sizeof(unsigned int));
+ st->Yrottable=malloc((st->rotsizeY+1)*sizeof(unsigned int));
+ chks=malloc(((st->midx>st->midy)?st->midx:st->midy)*sizeof(Bool));
+ if (!st->Xrottable || !st->Yrottable || !st->Xrotations || !st->Yrotations || !chks) return False;
+
+
+ maxi=0;
+ c=0;
+ d=0;
+ g=0;
+ for (a=0;a<st->midx;a++) chks[a]=True;
+ for (a=0;a<st->rotsizeX;a++)
+ {
+ st->Xrottable[a]=c;
+ f=(int)(d+ix)-g; /*viivojen lkm.*/
+ g+=f;
+ if (g>st->midx)
+ {
+ f-=g-st->midx;
+ g=st->midx;
+ }
+ for (b=0;b<f;b++)
+ {
+ m=0;
+ for (j=0;j<st->midx;j++) /*testi*/
+ {
+ if (chks[j])
+ {
+ om=0;
+ ok=1;
+ l=0;
+ while (j+l<st->midx && om+12*ok>m)
+ {
+ if (j-l>=0) if (chks[j-l]) om+=ok;
+ else; else if (chks[l-j]) om+=ok;
+ if (chks[j+l]) om+=ok;
+ ok/=1.5;
+ l++;
+ }
+ if (om>=m)
+ {
+ k=j;
+ m=om;
+ }
+ }
+ }
+ chks[k]=False;
+ l=c;
+ while (l>=st->Xrottable[a])
+ {
+ if (l!=st->Xrottable[a]) st->Xrotations[l]=st->Xrotations[l-1];
+ if (k>st->Xrotations[l] || l==st->Xrottable[a])
+ {
+ st->Xrotations[l]=k;
+ c++;
+ l=st->Xrottable[a];
+ }
+ l--;
+ }
+ }
+ d+=ix;
+ if (maxi<c-st->Xrottable[a]) maxi=c-st->Xrottable[a];
+ }
+ st->Xrottable[a]=c;
+ st->rotateX=malloc((maxi+2)*sizeof(int)<<1);
+ if (!st->rotateX) return False;
+
+ maxi=0;
+ c=0;
+ d=0;
+ g=0;
+ for (a=0;a<st->midy;a++) chks[a]=True;
+ for (a=0;a<st->rotsizeY;a++)
+ {
+ st->Yrottable[a]=c;
+ f=(int)(d+iy)-g; /*viivojen lkm.*/
+ g+=f;
+ if (g>st->midy)
+ {
+ f-=g-st->midy;
+ g=st->midy;
+ }
+ for (b=0;b<f;b++)
+ {
+ m=0;
+ for (j=0;j<st->midy;j++) /*testi*/
+ {
+ if (chks[j])
+ {
+ om=0;
+ ok=1;
+ l=0;
+ while (j+l<st->midy && om+12*ok>m)
+ {
+ if (j-l>=0) if (chks[j-l]) om+=ok;
+ else; else if (chks[l-j]) om+=ok;
+ if (chks[j+l]) om+=ok;
+ ok/=1.5;
+ l++;
+ }
+ if (om>=m)
+ {
+ k=j;
+ m=om;
+ }
+ }
+ }
+ chks[k]=False;
+ l=c;
+ while (l>=st->Yrottable[a])
+ {
+ if (l!=st->Yrottable[a]) st->Yrotations[l]=st->Yrotations[l-1];
+ if (k>st->Yrotations[l] || l==st->Yrottable[a])
+ {
+ st->Yrotations[l]=k;
+ c++;
+ l=st->Yrottable[a];
+ }
+ l--;
+ }
+
+ }
+ d+=iy;
+ if (maxi<c-st->Yrottable[a]) maxi=c-st->Yrottable[a];
+ }
+ st->Yrottable[a]=c;
+ st->rotateY=malloc((maxi+2)*sizeof(int)<<1);
+ if (!st->rotateY) return False;
+
+ free(chks);
+ return (True);
+}
+
+
+static Bool InitializeAll(struct state *st)
+{
+ XGCValues xgcv;
+ XWindowAttributes xgwa;
+/* XSetWindowAttributes xswa;*/
+ Colormap cmap;
+ XColor color;
+ int n,i;
+ double rspeed;
+
+ st->cosilines = True;
+
+ XGetWindowAttributes(st->dpy,st->win[0],&xgwa);
+ cmap=xgwa.colormap;
+/* xswa.backing_store=Always;
+ XChangeWindowAttributes(st->dpy,st->win[0],CWBackingStore,&xswa);*/
+ xgcv.function=GXcopy;
+
+ xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background");
+ st->fgc[32]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
+
+ n=0;
+ if (mono_p)
+ {
+ st->fgc[0]=st->fgc[32];
+ xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
+ st->fgc[1]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
+ for (i=0;i<32;i+=2) st->fgc[i]=st->fgc[0];
+ for (i=1;i<32;i+=2) st->fgc[i]=st->fgc[1];
+ } else
+ for (i=0;i<32;i++)
+ {
+ color.red=colors[n++]<<8;
+ color.green=colors[n++]<<8;
+ color.blue=colors[n++]<<8;
+ color.flags=DoRed|DoGreen|DoBlue;
+ XAllocColor(st->dpy,cmap,&color);
+ xgcv.foreground=color.pixel;
+ st->fgc[i]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
+ }
+ st->cgc=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
+ XSetGraphicsExposures(st->dpy,st->cgc,False);
+
+ st->cosilines = get_boolean_resource(st->dpy, "random","Boolean");
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (get_boolean_resource (st->dpy, "useDBE", "Boolean"))
+ st->usedouble = True;
+ st->win[1] = xdbe_get_backbuffer (st->dpy, st->win[0], XdbeUndefined);
+ if (!st->win[1])
+ {
+ st->usedouble = False;
+ st->win[1] = st->win[0];
+ }
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ st->delay=get_integer_resource(st->dpy, "delay","Integer");
+ rspeed=get_float_resource(st->dpy, "speed","Float");
+ if (rspeed<0.0001 || rspeed>0.2)
+ {
+ fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n");
+ rspeed=0.1;
+ }
+
+ st->sizx=xgwa.width;
+ st->sizy=xgwa.height;
+ st->midx=st->sizx>>1;
+ st->midy=st->sizy>>1;
+ st->stateX=0;
+ st->stateY=0;
+
+ if (!make_rots(st,rspeed,rspeed))
+ {
+ fprintf(stderr,"Not enough memory for tables!\n");
+ return False;
+ }
+ return True;
+}
+
+static void *
+kumppa_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy=d;
+ st->win[0]=w;
+ if (!InitializeAll(st)) abort();
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->usedouble)
+ {
+ st->xdswp.swap_action=XdbeUndefined;
+ st->xdswp.swap_window=st->win[0];
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ st->win[1]=st->win[0];
+
+ return st;
+}
+
+static unsigned long
+kumppa_draw (Display *d, Window w, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->cosilines)
+ {
+ int a;
+ st->draw_count++;
+ for (a=0;a<8;a++)
+ {
+ float f=0;
+ int b;
+ for (b=0;b<3;b++)
+ {
+ st->acosinus[a][b]+=cosinus[a][b];
+ f+=cosinus[a][b+3]*sin((double)st->acosinus[a][b]);
+ }
+ st->coords[a]=(int)f;
+ }
+ for (a=0;a<4;a++)
+ {
+ XDrawLine(st->dpy,st->win[0],(mono_p)?st->fgc[1]:st->fgc[((a<<2)+st->draw_count)&31],st->midx+st->ocoords[a<<1],st->midy+st->ocoords[(a<<1)+1]
+ ,st->midx+st->coords[a<<1],st->midy+st->coords[(a<<1)+1]);
+ st->ocoords[a<<1]=st->coords[a<<1];
+ st->ocoords[(a<<1)+1]=st->coords[(a<<1)+1];
+ }
+
+ } else {
+ int e;
+ for (e=0;e<8;e++)
+ {
+ int a=Satnum(50);
+ int b;
+ if (a>=32) a=32;
+ b=Satnum(32)-16+st->midx;
+ st->draw_count=Satnum(32)-16+st->midy;
+ XFillRectangle(st->dpy,st->win[0],st->fgc[a],b,st->draw_count,2,2);
+ }
+ }
+ XFillRectangle(st->dpy,st->win[0],st->fgc[32],st->midx-2,st->midy-2,4,4);
+ rotate(st);
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->usedouble) XdbeSwapBuffers(st->dpy,&st->xdswp,1);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ return st->delay;
+}
+
+
+static void
+kumppa_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->sizx=w;
+ st->sizy=h;
+ st->midx=st->sizx>>1;
+ st->midy=st->sizy>>1;
+ st->stateX=0;
+ st->stateY=0;
+}
+
+static Bool
+kumppa_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+kumppa_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ for (i = 0; i < countof(st->fgc); i++)
+ if (st->fgc[i]) XFreeGC (dpy, st->fgc[i]);
+ XFreeGC (dpy, st->cgc);
+ free (st->Xrotations);
+ free (st->Yrotations);
+ free (st->Xrottable);
+ free (st->Yrottable);
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Kumppa", kumppa)
diff --git a/hacks/kumppa.man b/hacks/kumppa.man
new file mode 100644
index 0000000..ed31a82
--- /dev/null
+++ b/hacks/kumppa.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+kumppa - spiraling, spinning, splashes of color rush toward the screen.
+.SH SYNOPSIS
+.B kumppa
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-random]
+[\-dbuf]
+[\-fps]
+.SH DESCRIPTION
+Spiraling, spinning, and very, very fast splashes of color rush toward the
+screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Density. 0.0001 - 0.2. Default: 0.1.
+.TP 8
+.B \-random | \-no-random
+Whether to randomize.
+.TP 8
+.B \-dbuf | \-no-dbuf
+Whether to double buffer.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Teemu Suutari. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Teemu Suutari.
diff --git a/hacks/laser.c b/hacks/laser.c
new file mode 100644
index 0000000..8ee0219
--- /dev/null
+++ b/hacks/laser.c
@@ -0,0 +1,355 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* laser --- spinning lasers */
+
+#if 0
+static const char sccsid[] = "@(#)laser.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 Pascal Pensa <pensa@aurora.unice.fr>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 1995: Written.
+ */
+
+#ifdef STANDALONE
+# define MODE_laser
+# define DEFAULTS "*delay: 40000 \n" \
+ "*count: 10 \n" \
+ "*cycles: 200 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+
+# define BRIGHT_COLORS
+# define release_laser 0
+# define reshape_laser 0
+# define laser_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_laser
+
+ENTRYPOINT ModeSpecOpt laser_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct laser_description =
+{"laser", "init_laser", "draw_laser", (char *) NULL,
+ "refresh_laser", "init_laser", "free_laser", &laser_opts,
+ 20000, -10, 200, 1, 64, 1.0, "",
+ "Shows spinning lasers", 0, NULL};
+
+#endif
+
+#define MINREDRAW 3 /* Number of redrawn on each frame */
+#define MAXREDRAW 8
+
+#define MINLASER 1 /* Laser number */
+
+#define MINWIDTH 2 /* Laser ray width range */
+#define MAXWIDTH 40
+
+#define MINSPEED 2 /* Speed range */
+#define MAXSPEED 17
+
+#define MINDIST 10 /* Minimal distance from edges */
+
+#define COLORSTEP 2 /* Laser color step */
+
+#define RANGE_RAND(min,max) (int) ((min) + LRAND() % ((max) - (min)))
+
+typedef enum {
+ TOP, RIGHT, BOTTOM, LEFT
+} border;
+
+typedef struct {
+ int bx; /* border x */
+ int by; /* border y */
+ border bn; /* active border */
+ int dir; /* direction */
+ int speed; /* laser velocity from MINSPEED to MAXSPEED */
+ int sx[MAXWIDTH]; /* x stack */
+ int sy[MAXWIDTH]; /* x stack */
+ XGCValues gcv; /* for color */
+} laserstruct;
+
+typedef struct {
+ int width;
+ int height;
+ int cx; /* center x */
+ int cy; /* center y */
+ int lw; /* laser width */
+ int ln; /* laser number */
+ int lr; /* laser redraw */
+ int sw; /* stack width */
+ int so; /* stack offset */
+ int time; /* up time */
+ GC stippledGC;
+ XGCValues gcv_black; /* for black color */
+ laserstruct *laser;
+} lasersstruct;
+
+static lasersstruct *lasers = (lasersstruct *) NULL;
+
+ENTRYPOINT void
+free_laser(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ lasersstruct *lp = &lasers[MI_SCREEN(mi)];
+
+ if (lp->laser != NULL) {
+ (void) free((void *) lp->laser);
+ lp->laser = (laserstruct *) NULL;
+ }
+ if (lp->stippledGC != None) {
+ XFreeGC(display, lp->stippledGC);
+ lp->stippledGC = None;
+ }
+}
+
+ENTRYPOINT void
+init_laser(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ int i, c = 0;
+ lasersstruct *lp;
+
+ MI_INIT (mi, lasers);
+ lp = &lasers[MI_SCREEN(mi)];
+
+ lp->width = MI_WIDTH(mi);
+ lp->height = MI_HEIGHT(mi);
+ lp->time = 0;
+
+ lp->ln = MI_COUNT(mi);
+ if (lp->ln < -MINLASER) {
+ /* if lp->ln is random ... the size can change */
+ if (lp->laser != NULL) {
+ (void) free((void *) lp->laser);
+ lp->laser = (laserstruct *) NULL;
+ }
+ lp->ln = NRAND(-lp->ln - MINLASER + 1) + MINLASER;
+ } else if (lp->ln < MINLASER)
+ lp->ln = MINLASER;
+
+ if (lp->laser == NULL) {
+ if ((lp->laser = (laserstruct *) malloc(lp->ln *
+ sizeof (laserstruct))) == NULL) {
+ free_laser(mi);
+ return;
+ }
+ }
+ if (lp->stippledGC == None) {
+ XGCValues gcv;
+
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ lp->gcv_black.foreground = MI_BLACK_PIXEL(mi);
+ if ((lp->stippledGC = XCreateGC(display, MI_WINDOW(mi),
+ GCForeground | GCBackground, &gcv)) == None) {
+ free_laser(mi);
+ return;
+ }
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), lp->stippledGC, False);
+# endif
+ }
+ MI_CLEARWINDOW(mi);
+
+ if (MINDIST < lp->width - MINDIST)
+ lp->cx = RANGE_RAND(MINDIST, lp->width - MINDIST);
+ else
+ lp->cx = RANGE_RAND(0, lp->width);
+ if (MINDIST < lp->height - MINDIST)
+ lp->cy = RANGE_RAND(MINDIST, lp->height - MINDIST);
+ else
+ lp->cy = RANGE_RAND(0, lp->height);
+ lp->lw = RANGE_RAND(MINWIDTH, MAXWIDTH);
+ lp->lr = RANGE_RAND(MINREDRAW, MAXREDRAW);
+ lp->sw = 0;
+ lp->so = 0;
+
+ if (MI_NPIXELS(mi) > 2)
+ c = NRAND(MI_NPIXELS(mi));
+
+ for (i = 0; i < lp->ln; i++) {
+ laserstruct *l = &lp->laser[i];
+
+ l->bn = (border) NRAND(4);
+
+ switch (l->bn) {
+ case TOP:
+ l->bx = NRAND(lp->width);
+ l->by = 0;
+ break;
+ case RIGHT:
+ l->bx = lp->width;
+ l->by = NRAND(lp->height);
+ break;
+ case BOTTOM:
+ l->bx = NRAND(lp->width);
+ l->by = lp->height;
+ break;
+ case LEFT:
+ l->bx = 0;
+ l->by = NRAND(lp->height);
+ }
+
+ l->dir = (int) (LRAND() & 1);
+ l->speed = ((RANGE_RAND(MINSPEED, MAXSPEED) * lp->width) / 1000) + 1;
+ if (MI_NPIXELS(mi) > 2) {
+ l->gcv.foreground = MI_PIXEL(mi, c);
+ c = (c + COLORSTEP) % MI_NPIXELS(mi);
+ } else
+ l->gcv.foreground = MI_WHITE_PIXEL(mi);
+ }
+}
+
+static void
+draw_laser_once(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ lasersstruct *lp = &lasers[MI_SCREEN(mi)];
+ int i;
+
+ for (i = 0; i < lp->ln; i++) {
+ laserstruct *l = &lp->laser[i];
+
+ if (lp->sw >= lp->lw) {
+ XChangeGC(display, lp->stippledGC, GCForeground, &(lp->gcv_black));
+ XDrawLine(display, MI_WINDOW(mi), lp->stippledGC,
+ lp->cx, lp->cy,
+ l->sx[lp->so], l->sy[lp->so]);
+ }
+ if (l->dir) {
+ switch (l->bn) {
+ case TOP:
+ l->bx -= l->speed;
+ if (l->bx < 0) {
+ l->by = -l->bx;
+ l->bx = 0;
+ l->bn = LEFT;
+ }
+ break;
+ case RIGHT:
+ l->by -= l->speed;
+ if (l->by < 0) {
+ l->bx = lp->width + l->by;
+ l->by = 0;
+ l->bn = TOP;
+ }
+ break;
+ case BOTTOM:
+ l->bx += l->speed;
+ if (l->bx >= lp->width) {
+ l->by = lp->height - l->bx % lp->width;
+ l->bx = lp->width;
+ l->bn = RIGHT;
+ }
+ break;
+ case LEFT:
+ l->by += l->speed;
+ if (l->by >= lp->height) {
+ l->bx = l->by % lp->height;
+ l->by = lp->height;
+ l->bn = BOTTOM;
+ }
+ }
+ } else {
+ switch (l->bn) {
+ case TOP:
+ l->bx += l->speed;
+ if (l->bx >= lp->width) {
+ l->by = l->bx % lp->width;
+ l->bx = lp->width;
+ l->bn = RIGHT;
+ }
+ break;
+ case RIGHT:
+ l->by += l->speed;
+ if (l->by >= lp->height) {
+ l->bx = lp->width - l->by % lp->height;
+ l->by = lp->height;
+ l->bn = BOTTOM;
+ }
+ break;
+ case BOTTOM:
+ l->bx -= l->speed;
+ if (l->bx < 0) {
+ l->by = lp->height + l->bx;
+ l->bx = 0;
+ l->bn = LEFT;
+ }
+ break;
+ case LEFT:
+ l->by -= l->speed;
+ if (l->by < 0) {
+ l->bx = -l->bx;
+ l->by = 0;
+ l->bn = TOP;
+ }
+ }
+ }
+
+ XChangeGC(display, lp->stippledGC, GCForeground, &l->gcv);
+ XDrawLine(display, MI_WINDOW(mi), lp->stippledGC,
+ lp->cx, lp->cy, l->bx, l->by);
+
+ l->sx[lp->so] = l->bx;
+ l->sy[lp->so] = l->by;
+
+ }
+
+ if (lp->sw < lp->lw)
+ ++lp->sw;
+
+ lp->so = (lp->so + 1) % lp->lw;
+}
+
+ENTRYPOINT void
+draw_laser(ModeInfo * mi)
+{
+ int i;
+ lasersstruct *lp;
+
+ if (lasers == NULL)
+ return;
+ lp = &lasers[MI_SCREEN(mi)];
+ if (lp->laser == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ for (i = 0; i < lp->lr; i++)
+ draw_laser_once(mi);
+
+ if (++lp->time > MI_CYCLES(mi))
+ init_laser(mi);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_laser(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Laser", laser)
+
+#endif /* MODE_laser */
diff --git a/hacks/laser.man b/hacks/laser.man
new file mode 100644
index 0000000..77367af
--- /dev/null
+++ b/hacks/laser.man
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+laser - draws vaguely laser-like moving lines
+.SH SYNOPSIS
+.B laser
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIlaser\fP program draws vaguely laser-like moving lines
+.SH OPTIONS
+.I laser
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors used cycle through the hue, making N stops around the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+Default 200.
+.TP 8
+.B \-count \fIinteger\fP
+Default 10.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by Pascal Pensa.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Pascal Pensa <pensa@aurora.unice.fr>, 1995.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/lcdscrub.c b/hacks/lcdscrub.c
new file mode 100644
index 0000000..5fd165e
--- /dev/null
+++ b/hacks/lcdscrub.c
@@ -0,0 +1,401 @@
+/* xscreensaver, Copyright (c) 2008-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws repetitive patterns that should undo burned in LCD screens.
+ * Concept shamelessly cloned from
+ * http://toastycode.com/blog/2008/02/05/lcd-scrub/
+ */
+
+#include "screenhack.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ enum { HORIZ_W, HORIZ_B,
+ VERT_W, VERT_B,
+ DIAG_W, DIAG_B,
+ WHITE, BLACK,
+ RGB,
+ RANDOM,
+ END } mode;
+ unsigned int enabled_mask;
+ int count;
+ GC fg, bg, bg2;
+ int color_tick;
+ int delay;
+ int spread;
+ int cycles;
+ XImage *collisions;
+ long ncollisions;
+};
+
+
+static void
+pick_mode (struct state *st)
+{
+ st->count = 0;
+ while (1)
+ {
+ if (++st->mode == END)
+ st->mode = 0;
+ if (st->enabled_mask & (1 << st->mode))
+ break;
+ }
+}
+
+static void *
+lcdscrub_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ unsigned long fgp, bgp;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->spread = get_integer_resource (st->dpy, "spread", "Integer");
+ st->cycles = get_integer_resource (st->dpy, "cycles", "Integer");
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ fgp = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ bgp = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+
+ gcv.foreground = bgp;
+ gcv.background = fgp;
+ st->bg = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ st->bg2 = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = fgp;
+ gcv.background = bgp;
+ st->fg = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (st->dpy, st->fg, False);
+ jwxyz_XSetAntiAliasing (st->dpy, st->bg, False);
+ jwxyz_XSetAntiAliasing (st->dpy, st->bg2, False);
+#endif
+
+ st->enabled_mask = 0;
+# define PREF(R,F) \
+ if (get_boolean_resource (st->dpy, R, "Mode")) st->enabled_mask |= (1 << F)
+ PREF("modeHW", HORIZ_W);
+ PREF("modeHB", HORIZ_B);
+ PREF("modeVW", VERT_W);
+ PREF("modeVB", VERT_B);
+ PREF("modeDW", DIAG_W);
+ PREF("modeDB", DIAG_B);
+ PREF("modeW", WHITE);
+ PREF("modeB", BLACK);
+ PREF("modeRGB", RGB);
+ PREF("modeRandom", RANDOM);
+# undef PREF
+ if (! st->enabled_mask)
+ {
+ fprintf (stderr, "%s: no modes enabled\n", progname);
+ exit (1);
+ }
+
+ pick_mode (st);
+
+ return st;
+}
+
+
+/* A test harness for visualizing different random number generators.
+ This doesn't really belong in lcdscrub, but it was a convenient
+ place to put it.
+ */
+#if 0 /* mwc1616 */
+
+static unsigned long mwc1616_x = 1;
+static unsigned long mwc1616_y = 2;
+
+static void
+mwc1616_srand (unsigned long seed)
+{
+ mwc1616_x = seed | 1;
+ mwc1616_y = seed | 2;
+}
+
+static unsigned long
+mwc1616 (void)
+{
+ mwc1616_x = 18000 * (mwc1616_x & 0xFFFF) + (mwc1616_x >> 16);
+ mwc1616_y = 30903 * (mwc1616_y & 0xFFFF) + (mwc1616_y >> 16);
+ return (mwc1616_x << 16) + (mwc1616_y & 0xFFFF);
+}
+
+# undef random
+# undef srand
+# define srand mwc1616_srand
+# define random() ((unsigned int) (mwc1616() & (unsigned int) (~0)))
+
+
+#elif 0 /* xorshift128plus */
+
+
+static uint64_t xo_state0 = 1;
+static uint64_t xo_state1 = 2;
+
+static void
+xorshift128plus_srand (unsigned long seed)
+{
+ xo_state0 = seed | 1;
+ xo_state1 = seed | 2;
+}
+
+static uint64_t
+xorshift128plus (void)
+{
+ register uint64_t s1 = xo_state0;
+ register uint64_t s0 = xo_state1;
+ xo_state0 = s0;
+ s1 ^= s1 << 23;
+ s1 ^= s1 >> 17;
+ s1 ^= s0;
+ s1 ^= s0 >> 26;
+ xo_state1 = s1;
+ return s1;
+}
+
+# undef random
+# undef srand
+# define srand xorshift128plus_srand
+# define random() ((unsigned int) (xorshift128plus() & (unsigned int) (~0)))
+
+
+#else /* ya_random */
+# undef srand
+# define srand(n)
+
+#endif /* ya_random */
+
+
+
+/* If you see patterns in this image, the PRNG sucks.
+ */
+static void
+lcdscrub_random (struct state *st)
+{
+ unsigned long steps_per_frame = 3000000;
+ unsigned long segments = 0x8000; /* 2^15 */
+
+ if (! st->collisions)
+ {
+ struct timeval tp;
+# if GETTIMEOFDAY_TWO_ARGS
+ gettimeofday (&tp, 0);
+# else
+ gettimeofday (&tp);
+# endif
+ srand ((unsigned int) (tp.tv_sec ^ tp.tv_usec));
+
+ st->collisions =
+ XCreateImage (st->dpy, st->xgwa.visual, 1, XYPixmap,
+ 0, NULL, segments, segments, 8, 0);
+ if (! st->collisions) abort();
+ st->collisions->data = (char *)
+ calloc (segments, st->collisions->bytes_per_line); /* 128 MB */
+ if (! st->collisions->data) abort();
+ }
+
+ while (--steps_per_frame)
+ {
+ unsigned long x = random() & (segments-1);
+ unsigned long y = random() & (segments-1);
+ unsigned long p = XGetPixel (st->collisions, x, y) ? 0 : 1;
+ XPutPixel (st->collisions, x, y, p);
+ st->ncollisions += (p ? 1 : -1);
+ }
+
+ {
+ int w, h;
+ Pixmap p;
+ GC gc;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ w = st->xgwa.width;
+ h = st->xgwa.height;
+
+ p = XCreatePixmap (st->dpy, st->window, w, h, 1);
+ gc = XCreateGC (st->dpy, p, 0, 0);
+ XSetBackground (st->dpy, gc, 0);
+ XSetForeground (st->dpy, gc, 1);
+ XPutImage (st->dpy, p, gc, st->collisions, 0, 0, 0, 0, w, h);
+ XFreeGC (st->dpy, gc);
+
+ gc = st->fg;
+ XClearWindow (st->dpy, st->window);
+ XSetClipMask (st->dpy, gc, p);
+ XFillRectangle (st->dpy, st->window, gc, 0, 0, w, h);
+ XFreePixmap (st->dpy, p);
+ }
+
+ /*
+ fprintf(stderr, "%.2f\n", st->ncollisions / (float) (segments*segments));
+ */
+}
+
+
+static unsigned long
+lcdscrub_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int count = st->count % st->spread;
+ int i;
+ GC fg = (st->mode & 1 ? st->fg : st->bg);
+ GC bg = (st->mode & 1 ? st->bg : st->fg);
+
+ switch (st->mode) {
+ case HORIZ_W:
+ case HORIZ_B:
+ XFillRectangle (st->dpy, st->window, bg, 0, 0,
+ st->xgwa.width, st->xgwa.height);
+ for (i = count; i < st->xgwa.height; i += st->spread)
+ XDrawLine (st->dpy, st->window, fg, 0, i, st->xgwa.width, i);
+ break;
+ case VERT_W:
+ case VERT_B:
+ XFillRectangle (st->dpy, st->window, bg, 0, 0,
+ st->xgwa.width, st->xgwa.height);
+ for (i = count; i < st->xgwa.width; i += st->spread)
+ XDrawLine (st->dpy, st->window, fg, i, 0, i, st->xgwa.height);
+ break;
+ case DIAG_W:
+ case DIAG_B:
+ XFillRectangle (st->dpy, st->window, bg, 0, 0,
+ st->xgwa.width, st->xgwa.height);
+ for (i = count; i < st->xgwa.width; i += st->spread)
+ XDrawLine (st->dpy, st->window, fg, i, 0,
+ i + st->xgwa.width, st->xgwa.width);
+ for (i = -count; i < st->xgwa.height; i += st->spread)
+ XDrawLine (st->dpy, st->window, fg, 0, i,
+ st->xgwa.height, i + st->xgwa.height);
+ break;
+ case RGB:
+ {
+ int scale = 10 * 8; /* 8 sec */
+ static const unsigned short colors[][3] = {
+ { 0xFFFF, 0x0000, 0x0000 },
+ { 0x0000, 0xFFFF, 0x0000 },
+ { 0x0000, 0x0000, 0xFFFF },
+ { 0xFFFF, 0xFFFF, 0x0000 },
+ { 0xFFFF, 0x0000, 0xFFFF },
+ { 0x0000, 0xFFFF, 0xFFFF },
+ { 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0x0000, 0x0000, 0x0000 },
+ };
+ static unsigned long last = 0;
+ XColor xc;
+ bg = st->bg2;
+ xc.red = colors[st->color_tick / scale][0];
+ xc.green = colors[st->color_tick / scale][1];
+ xc.blue = colors[st->color_tick / scale][2];
+ if (last) XFreeColors (st->dpy, st->xgwa.colormap, &last, 1, 0);
+ XAllocColor (st->dpy, st->xgwa.colormap, &xc);
+ last = xc.pixel;
+ XSetForeground (st->dpy, bg, xc.pixel);
+ st->color_tick = (st->color_tick + 1) % (countof(colors) * scale);
+ /* fall through */
+ }
+ case WHITE:
+ case BLACK:
+ XFillRectangle (st->dpy, st->window, bg, 0, 0,
+ st->xgwa.width, st->xgwa.height);
+ break;
+ case RANDOM:
+ lcdscrub_random (st);
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ st->count++;
+
+ if (st->count > st->spread * st->cycles)
+ pick_mode (st);
+
+ return st->delay;
+}
+
+static void
+lcdscrub_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+lcdscrub_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+lcdscrub_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (dpy, st->fg);
+ XFreeGC (dpy, st->bg);
+ XFreeGC (dpy, st->bg2);
+ if (st->collisions)
+ {
+ free (st->collisions->data);
+ st->collisions->data = 0;
+ XDestroyImage (st->collisions);
+ }
+ free (st);
+}
+
+
+static const char *lcdscrub_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: True",
+ "*delay: 100000",
+ "*spread: 8",
+ "*cycles: 60",
+ "*modeHW: True",
+ "*modeHB: True",
+ "*modeVW: True",
+ "*modeVB: True",
+ "*modeDW: True",
+ "*modeDB: True",
+ "*modeW: True",
+ "*modeB: True",
+ "*modeRGB: True",
+ "*modeRandom: False",
+ 0
+};
+
+static XrmOptionDescRec lcdscrub_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-spread", ".spread", XrmoptionSepArg, 0 },
+ { "-cycles", ".cycles", XrmoptionSepArg, 0 },
+ { "-no-hw", ".modeHW", XrmoptionNoArg, "False" },
+ { "-no-hb", ".modeHB", XrmoptionNoArg, "False" },
+ { "-no-vw", ".modeVW", XrmoptionNoArg, "False" },
+ { "-no-vb", ".modeVB", XrmoptionNoArg, "False" },
+ { "-no-dw", ".modeDW", XrmoptionNoArg, "False" },
+ { "-no-db", ".modeDB", XrmoptionNoArg, "False" },
+ { "-no-w", ".modeW", XrmoptionNoArg, "False" },
+ { "-no-b", ".modeB", XrmoptionNoArg, "False" },
+ { "-no-rgb", ".modeRGB", XrmoptionNoArg, "False" },
+ { "-random", ".modeRandom", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("LCDscrub", lcdscrub)
diff --git a/hacks/lcdscrub.man b/hacks/lcdscrub.man
new file mode 100644
index 0000000..04e0d72
--- /dev/null
+++ b/hacks/lcdscrub.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+lcdscrub - attempt to repair burn-in on LCD screens
+.SH SYNOPSIS
+.B lcdscrub
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-spread \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+This screen saver is not meant to look pretty, but rather, to
+repair burn-in on LCD monitors.
+
+Believe it or not, screen burn is not a thing of the past.
+It can happen to LCD screens pretty easily, even in this modern age.
+However, leaving the screen on and displaying high contrast images
+can often repair the damage. That's what this screen saver does.
+
+See also:
+
+ http://docs.info.apple.com/article.html?artnum=88343
+ http://toastycode.com/blog/2008/02/05/lcd-scrub/
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000000 (1 second.).
+.TP 8
+.B \-spread \fInumber\fP
+Distance between lines. Default 8.
+.TP 8
+.B \-cycles \fInumber\fP
+Steps before switching display mode. Default 60.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2008 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Inspired by the like-named program by Daniel Sandler.
+
+Written by Jamie Zawinski.
diff --git a/hacks/lightning.c b/hacks/lightning.c
new file mode 100644
index 0000000..027bc75
--- /dev/null
+++ b/hacks/lightning.c
@@ -0,0 +1,601 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* lightning --- fractal lightning bolds */
+
+#if 0
+static const char sccsid[] = "@(#)lightning.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Keith Romberg <kromberg@saxe.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 14-Jul-1996: Cleaned up code.
+ * 27-Jun-1996: Written and submitted by Keith Romberg <kromberg@saxe.com>.
+ */
+
+#ifdef STANDALONE
+# define MODE_lightning
+# define DEFAULTS "*delay: 10000 \n" \
+ "*ncolors: 64 \n"
+
+# define BRIGHT_COLORS
+# define free_lightning 0
+# define release_lightning 0
+# define reshape_lightning 0
+# define lightning_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_lightning
+
+ENTRYPOINT ModeSpecOpt lightning_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct lightning_description =
+{"lightning", "init_lightning", "draw_lightning", (char *) NULL,
+ "refresh_lightning", "init_lightning", (char *) NULL, &lightning_opts,
+ 10000, 1, 1, 1, 64, 0.6, "",
+ "Shows Keith's fractal lightning bolts", 0, NULL};
+
+#endif
+
+#define BOLT_NUMBER 4
+#define BOLT_ITERATION 4
+#define LONG_FORK_ITERATION 3
+#define MEDIUM_FORK_ITERATION 2
+#define SMALL_FORK_ITERATION 1
+
+#define WIDTH_VARIATION 30
+#define HEIGHT_VARIATION 15
+
+#define DELAY_TIME_AMOUNT 15
+#define MULTI_DELAY_TIME_BASE 5
+
+#define MAX_WIGGLES 16
+#define WIGGLE_BASE 8
+#define WIGGLE_AMOUNT 14
+
+#define RANDOM_FORK_PROBILITY 4
+
+#define FIRST_LEVEL_STRIKE 0
+#define LEVEL_ONE_STRIKE 1
+#define LEVEL_TWO_STRIKE 2
+
+#define BOLT_VERTICIES ((1<<BOLT_ITERATION)-1)
+ /* BOLT_ITERATION = 4. 2^(BOLT_ITERATION) - 1 = 15 */
+
+#define NUMBER_FORK_VERTICIES 9
+
+#define FLASH_PROBILITY 20
+#define MAX_FLASH_AMOUNT 2 /* half the total duration of the bolt */
+
+typedef struct {
+ XPoint ForkVerticies[NUMBER_FORK_VERTICIES];
+ int num_used;
+} Fork;
+
+typedef struct {
+ XPoint end1, end2;
+ XPoint middle[BOLT_VERTICIES];
+ int fork_number;
+ int forks_start[2];
+ Fork branch[2];
+ int wiggle_number;
+ int wiggle_amount;
+ int delay_time;
+ int flash;
+ int flash_begin, flash_stop;
+ int visible;
+ int strike_level;
+} Lightning;
+
+typedef struct {
+ Lightning bolts[BOLT_NUMBER];
+ int scr_width, scr_height;
+ int multi_strike;
+ int give_it_hell;
+ int draw_time;
+ int stage;
+ int busyLoop;
+ unsigned long color;
+} Storm;
+
+static Storm *Helga = (Storm *) NULL;
+
+/*------------------- function prototypes ----------------------------*/
+
+static int distance(XPoint a, XPoint b);
+
+static int setup_multi_strike(void);
+static int flashing_strike(void);
+static void flash_duration(int *start, int *end, int total_duration);
+static void random_storm(Storm * st);
+static void generate(XPoint A, XPoint B, int iter, XPoint * verts, int *vert_index);
+static void create_fork(Fork * f, XPoint start, XPoint end, int level);
+
+static void first_strike(Lightning bolt, ModeInfo * mi);
+static void draw_bolt(Lightning * bolt, ModeInfo * mi);
+static void draw_line(ModeInfo * mi, XPoint * p, int number, GC use, int x_offset);
+static void level1_strike(Lightning bolt, ModeInfo * mi);
+static void level2_strike(Lightning bolt, ModeInfo * mi);
+
+static int storm_active(Storm * st);
+static void update_bolt(Lightning * bolt, int time_now);
+static void wiggle_bolt(Lightning * bolt);
+static void wiggle_line(XPoint * p, int number, int wiggle_amount);
+
+/*------------------------- functions ---------------------------------*/
+
+static int
+setup_multi_strike(void)
+{
+ int result, multi_prob;
+
+ multi_prob = NRAND(100);
+
+ if (multi_prob < 50)
+ result = 1;
+ else if ((multi_prob >= 51) && (multi_prob < 75))
+ result = 2;
+ else if ((multi_prob >= 76) && (multi_prob < 92))
+ result = 3;
+ else
+ result = BOLT_NUMBER; /* 4 */
+
+ return (result);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static int
+flashing_strike(void)
+{
+ int tmp = NRAND(FLASH_PROBILITY);
+
+ if (tmp <= FLASH_PROBILITY)
+ return (1);
+ return (0);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static void
+flash_duration(int *start, int *end, int total_duration)
+{
+ int mid, d;
+
+ mid = total_duration / MAX_FLASH_AMOUNT;
+ d = NRAND(total_duration / MAX_FLASH_AMOUNT) / 2;
+ *start = mid - d;
+ *end = mid + d;
+}
+
+/*-------------------------------------------------------------------------*/
+
+static void
+random_storm(Storm * st)
+{
+ int i, j, tmp;
+ XPoint p;
+
+ for (i = 0; i < st->multi_strike; i++) {
+ st->bolts[i].end1.x = NRAND(st->scr_width);
+ st->bolts[i].end1.y = 0;
+ st->bolts[i].end2.x = NRAND(st->scr_width);
+ st->bolts[i].end2.y = st->scr_height;
+ st->bolts[i].wiggle_number = WIGGLE_BASE + NRAND(MAX_WIGGLES);
+ if ((st->bolts[i].flash = flashing_strike()))
+ flash_duration(&(st->bolts[i].flash_begin), &(st->bolts[i].flash_stop),
+ st->bolts[i].wiggle_number);
+ else
+ st->bolts[i].flash_begin = st->bolts[i].flash_stop = 0;
+ st->bolts[i].wiggle_amount = WIGGLE_AMOUNT;
+ if (i == 0)
+ st->bolts[i].delay_time = NRAND(DELAY_TIME_AMOUNT);
+ else
+ st->bolts[i].delay_time = NRAND(DELAY_TIME_AMOUNT) +
+ (MULTI_DELAY_TIME_BASE * i);
+ st->bolts[i].strike_level = FIRST_LEVEL_STRIKE;
+ tmp = 0;
+ generate(st->bolts[i].end1, st->bolts[i].end2, BOLT_ITERATION,
+ st->bolts[i].middle, &tmp);
+ st->bolts[i].fork_number = 0;
+ st->bolts[i].visible = 0;
+ for (j = 0; j < BOLT_VERTICIES; j++) {
+ if (st->bolts[i].fork_number >= 2)
+ break;
+ if (NRAND(100) < RANDOM_FORK_PROBILITY) {
+ p.x = NRAND(st->scr_width);
+ p.y = st->scr_height;
+ st->bolts[i].forks_start[st->bolts[i].fork_number] = j;
+ create_fork(&(st->bolts[i].branch[st->bolts[i].fork_number]),
+ st->bolts[i].middle[j], p, j);
+ st->bolts[i].fork_number++;
+ }
+ }
+ }
+}
+
+static void
+generate(XPoint A, XPoint B, int iter, XPoint * verts, int *vert_index)
+{
+ XPoint mid;
+
+ mid.x = (A.x + B.x) / 2 + NRAND(WIDTH_VARIATION) - WIDTH_VARIATION / 2;
+ mid.y = (A.y + B.y) / 2 + NRAND(HEIGHT_VARIATION) - HEIGHT_VARIATION / 2;
+
+ if (!iter) {
+ verts[*vert_index].x = mid.x;
+ verts[*vert_index].y = mid.y;
+ (*vert_index)++;
+ return;
+ }
+ generate(A, mid, iter - 1, verts, vert_index);
+ generate(mid, B, iter - 1, verts, vert_index);
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+create_fork(Fork * f, XPoint start, XPoint end, int level)
+{
+ int tmp = 1;
+
+ f->ForkVerticies[0].x = start.x;
+ f->ForkVerticies[0].y = start.y;
+
+ if (level <= 6) {
+ generate(start, end, LONG_FORK_ITERATION, f->ForkVerticies, &tmp);
+ f->num_used = 9;
+ } else if ((level > 6) && (level <= 11)) {
+ generate(start, end, MEDIUM_FORK_ITERATION, f->ForkVerticies, &tmp);
+ f->num_used = 5;
+ } else {
+ if (distance(start, end) > 100) {
+ generate(start, end, MEDIUM_FORK_ITERATION, f->ForkVerticies, &tmp);
+ f->num_used = 5;
+ } else {
+ generate(start, end, SMALL_FORK_ITERATION, f->ForkVerticies, &tmp);
+ f->num_used = 3;
+ }
+ }
+
+ f->ForkVerticies[f->num_used - 1].x = end.x;
+ f->ForkVerticies[f->num_used - 1].y = end.y;
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+update_bolt(Lightning * bolt, int time_now)
+{
+ wiggle_bolt(bolt);
+ if ((bolt->wiggle_amount == 0) && (bolt->wiggle_number > 2))
+ bolt->wiggle_number = 0;
+ if (((time_now % 3) == 0))
+ bolt->wiggle_amount++;
+
+ if (((time_now >= bolt->delay_time) && (time_now < bolt->flash_begin)) ||
+ (time_now > bolt->flash_stop))
+ bolt->visible = 1;
+ else
+ bolt->visible = 0;
+
+ if (time_now == bolt->delay_time)
+ bolt->strike_level = FIRST_LEVEL_STRIKE;
+ else if (time_now == (bolt->delay_time + 1))
+ bolt->strike_level = LEVEL_ONE_STRIKE;
+ else if ((time_now > (bolt->delay_time + 1)) &&
+ (time_now <= (bolt->delay_time + bolt->flash_begin - 2)))
+ bolt->strike_level = LEVEL_TWO_STRIKE;
+ else if (time_now == (bolt->delay_time + bolt->flash_begin - 1))
+ bolt->strike_level = LEVEL_ONE_STRIKE;
+ else if (time_now == (bolt->delay_time + bolt->flash_stop + 1))
+ bolt->strike_level = LEVEL_ONE_STRIKE;
+ else
+ bolt->strike_level = LEVEL_TWO_STRIKE;
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+draw_bolt(Lightning * bolt, ModeInfo * mi)
+{
+ if (bolt->visible) {
+ if (bolt->strike_level == FIRST_LEVEL_STRIKE)
+ first_strike(*bolt, mi);
+ else if (bolt->strike_level == LEVEL_ONE_STRIKE)
+ level1_strike(*bolt, mi);
+ else
+ level2_strike(*bolt, mi);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+first_strike(Lightning bolt, ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int i;
+
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawLine(display, window, gc,
+ bolt.end1.x, bolt.end1.y, bolt.middle[0].x, bolt.middle[0].y);
+ draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 0);
+ XDrawLine(display, window, gc,
+ bolt.middle[BOLT_VERTICIES - 1].x, bolt.middle[BOLT_VERTICIES - 1].y,
+ bolt.end2.x, bolt.end2.y);
+
+ for (i = 0; i < bolt.fork_number; i++)
+ draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+ gc, 0);
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+draw_line(ModeInfo * mi, XPoint * points, int number, GC to_use, int offset)
+{
+ int i;
+
+ for (i = 0; i < number - 1; i++) {
+ if (points[i].y <= points[i + 1].y)
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x + offset,
+ points[i].y, points[i + 1].x + offset, points[i + 1].y);
+ else {
+ if (points[i].x < points[i + 1].x)
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x +
+ offset, points[i].y + offset, points[i + 1].x + offset,
+ points[i + 1].y + offset);
+ else
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x -
+ offset, points[i].y + offset, points[i + 1].x - offset,
+ points[i + 1].y + offset);
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+level1_strike(Lightning bolt, ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ Storm *st = &Helga[MI_SCREEN(mi)];
+ GC gc = MI_GC(mi);
+ int i;
+
+ if (MI_NPIXELS(mi) > 2) /* color */
+ XSetForeground(display, gc, MI_PIXEL(mi, st->color));
+ else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawLine(display, window, gc,
+ bolt.end1.x - 1, bolt.end1.y, bolt.middle[0].x - 1, bolt.middle[0].y);
+ draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -1);
+ XDrawLine(display, window, gc,
+ bolt.middle[BOLT_VERTICIES - 1].x - 1,
+ bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x - 1, bolt.end2.y);
+ XDrawLine(display, window, gc,
+ bolt.end1.x + 1, bolt.end1.y, bolt.middle[0].x + 1, bolt.middle[0].y);
+ draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 1);
+ XDrawLine(display, window, gc,
+ bolt.middle[BOLT_VERTICIES - 1].x + 1,
+ bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x + 1, bolt.end2.y);
+
+ for (i = 0; i < bolt.fork_number; i++) {
+ draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+ gc, -1);
+ draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+ gc, 1);
+ }
+ first_strike(bolt, mi);
+}
+
+/*------------------------------------------------------------------------*/
+
+static int
+distance(XPoint a, XPoint b)
+{
+ return ((int) sqrt((double) (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)));
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+level2_strike(Lightning bolt, ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ Storm *st = &Helga[MI_SCREEN(mi)];
+ GC gc = MI_GC(mi);
+ int i;
+
+ /* This was originally designed to be a little darker then the
+ level1 strike. This was changed to get it to work on
+ multiscreens and to add more color variety. I tried
+ stippling but it did not look good. */
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, st->color));
+ else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawLine(display, window, gc,
+ bolt.end1.x - 2, bolt.end1.y, bolt.middle[0].x - 2, bolt.middle[0].y);
+ draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -2);
+ XDrawLine(display, window, gc,
+ bolt.middle[BOLT_VERTICIES - 1].x - 2,
+ bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x - 2, bolt.end2.y);
+
+ XDrawLine(display, window, gc,
+ bolt.end1.x + 2, bolt.end1.y, bolt.middle[0].x + 2, bolt.middle[0].y);
+ draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 2);
+ XDrawLine(display, window, gc,
+ bolt.middle[BOLT_VERTICIES - 1].x + 2,
+ bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x + 2, bolt.end2.y);
+
+ for (i = 0; i < bolt.fork_number; i++) {
+ draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+ gc, -2);
+ draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+ gc, 2);
+ }
+ level1_strike(bolt, mi);
+}
+
+/*------------------------------------------------------------------------*/
+
+static int
+storm_active(Storm * st)
+{
+ int i, atleast_1 = 0;
+
+ for (i = 0; i < st->multi_strike; i++)
+ if (st->bolts[i].wiggle_number > 0)
+ atleast_1++;
+
+ return (atleast_1);
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+wiggle_bolt(Lightning * bolt)
+{
+ int i;
+
+ wiggle_line(bolt->middle, BOLT_VERTICIES, bolt->wiggle_amount);
+ bolt->end2.x += NRAND(bolt->wiggle_amount) - bolt->wiggle_amount / 2;
+ bolt->end2.y += NRAND(bolt->wiggle_amount) - bolt->wiggle_amount / 2;
+
+ for (i = 0; i < bolt->fork_number; i++) {
+ wiggle_line(bolt->branch[i].ForkVerticies, bolt->branch[i].num_used,
+ bolt->wiggle_amount);
+ bolt->branch[i].ForkVerticies[0].x = bolt->middle[bolt->forks_start[i]].x;
+ bolt->branch[i].ForkVerticies[0].y = bolt->middle[bolt->forks_start[i]].y;
+ }
+
+ if (bolt->wiggle_amount > 1)
+ bolt->wiggle_amount -= 1;
+ else
+ bolt->wiggle_amount = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+wiggle_line(XPoint * p, int number, int amount)
+{
+ int i;
+
+ for (i = 0; i < number; i++) {
+ p[i].x += NRAND(amount) - amount / 2;
+ p[i].y += NRAND(amount) - amount / 2;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+ENTRYPOINT void
+init_lightning (ModeInfo * mi)
+{
+ Storm *st;
+
+ MI_INIT (mi, Helga);
+ st = &Helga[MI_SCREEN(mi)];
+
+ st->scr_width = MI_WIDTH(mi);
+ st->scr_height = MI_HEIGHT(mi);
+
+ st->multi_strike = setup_multi_strike();
+ random_storm(st);
+ st->stage = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+ENTRYPOINT void
+draw_lightning (ModeInfo * mi)
+{
+ int i;
+ Storm *st;
+
+ if (Helga == NULL)
+ return;
+ st = &Helga[MI_SCREEN(mi)];
+ MI_IS_DRAWN(mi) = True;
+ switch (st->stage) {
+ case 0:
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ st->color = NRAND(MI_NPIXELS(mi));
+ st->draw_time = 0;
+ if (storm_active(st))
+ st->stage++;
+ else
+ st->stage = 4;
+ break;
+ case 1:
+ for (i = 0; i < st->multi_strike; i++) {
+ if (st->bolts[i].visible)
+ draw_bolt(&(st->bolts[i]), mi);
+ update_bolt(&(st->bolts[i]), st->draw_time);
+ }
+ st->draw_time++;
+ st->stage++;
+ st->busyLoop = 0;
+ break;
+ case 2:
+ if (++st->busyLoop > 6) {
+ st->stage++;
+ st->busyLoop = 0;
+ }
+ break;
+ case 3:
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ if (storm_active(st))
+ st->stage = 1;
+ else
+ st->stage++;
+ break;
+ case 4:
+ if (++st->busyLoop > 100) {
+ st->busyLoop = 0;
+ }
+ init_lightning(mi);
+ break;
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_lightning(ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Lightning", lightning)
+
+
+#endif /* MODE_lightning */
diff --git a/hacks/lightning.man b/hacks/lightning.man
new file mode 100644
index 0000000..65386d3
--- /dev/null
+++ b/hacks/lightning.man
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+lightning - draws fractal lightning bolts
+.SH SYNOPSIS
+.B lightning
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIlightning\fP program draws fractal lightning bolts
+.SH OPTIONS
+.I lightning
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Keith Romberg.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Keith Romberg <kromberg@saxe.com>, 27-Jun-96.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/link_axp.com b/hacks/link_axp.com
new file mode 100644
index 0000000..203affc
--- /dev/null
+++ b/hacks/link_axp.com
@@ -0,0 +1,107 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link/exe=attraction.exe screenhack,attraction,vms_axp_12.opt/opt
+$ link/exe=blitspin.exe screenhack,blitspin,vms_axp_12.opt/opt
+$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_axp_12.opt/opt
+$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_axp_12.opt/opt
+$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_axp_12.opt/opt
+$ link/exe=coral.exe screenhack,coral,vms_axp_12.opt/opt
+$ link/exe=decayscreen.exe screenhack,decayscreen,vms_axp_12.opt/opt
+$ link/exe=deco.exe screenhack,deco,vms_axp_12.opt/opt
+$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_axp_12.opt/opt
+$ link/exe=fadeplot.exe screenhack-xlock,fadeplot,xlockmore,vms_axp_12.opt/opt
+$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_axp_12.opt/opt
+$ link/exe=flame.exe screenhack,flame,vms_axp_12.opt/opt
+$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_axp_12.opt/opt
+$ link/exe=vines.exe screenhack-xlock,vines,xlockmore,vms_axp_12.opt/opt
+$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_axp_12.opt/opt
+$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_axp_12.opt/opt
+$ link/exe=greynetic screenhack,greynetic,vms_axp_12.opt/opt
+$ link/exe=halo.exe screenhack,halo,vms_axp_12.opt/opt
+$ link/exe=helix.exe screenhack,helix,vms_axp_12.opt/opt
+$ link/exe=hop.exe screenhack-xlock,hop,xlockmore,vms_axp_12.opt/opt
+$ link/exe=hypercube.exe screenhack,hypercube,vms_axp_12.opt/opt
+$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_axp_12.opt/opt
+$ link/exe=imsmap.exe screenhack,imsmap,vms_axp_12.opt/opt
+$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_axp_12.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_axp_12.opt/opt
+$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_axp_12.opt/opt
+$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_axp_12.opt/opt
+$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_axp_12.opt/opt
+$ link/exe=lmorph.exe screenhack,lmorph,vms_axp_12.opt/opt
+$ link/exe=maze.exe screenhack,maze,vms_axp_12.opt/opt
+$ link/exe=moire.exe screenhack,moire,vms_axp_12.opt/opt
+$ link/exe=noseguy.exe screenhack,noseguy,vms_axp_12.opt/opt
+$ link/exe=pedal.exe screenhack,pedal,vms_axp_12.opt/opt
+$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_axp_12.opt/opt
+$ link/exe=pyro.exe screenhack,pyro,vms_axp_12.opt/opt
+$ link/exe=qix.exe screenhack,qix,vms_axp_12.opt/opt
+$ link/exe=rd-bomb.exe screenhack,rd-bomb,vms_axp_12.opt/opt
+$ link/exe=rocks.exe screenhack,rocks,vms_axp_12.opt/opt
+$ link/exe=rorschach.exe screenhack,rorschach,vms_axp_12.opt/opt
+$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_axp_12.opt/opt
+$ link/exe=slidescreen.exe screenhack,slidescreen,vms_axp_12.opt/opt
+$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_axp_12.opt/opt
+$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_axp_12.opt/opt
+$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_axp_12.opt/opt
+$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_axp_12.opt/opt
+$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_axp_12.opt/opt
+$ link/exe=goop.exe screenhack,goop,vms_axp_12.opt/opt
+$ link/exe=starfish.exe screenhack,starfish,vms_axp_12.opt/opt
+$ link/exe=munch.exe screenhack,munch,vms_axp_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link/exe=attraction.exe screenhack,attraction,vms_axp.opt/opt
+$ link/exe=blitspin.exe screenhack,blitspin,vms_axp.opt/opt
+$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_axp.opt/opt
+$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_axp.opt/opt
+$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_axp.opt/opt
+$ link/exe=coral.exe screenhack,coral,vms_axp.opt/opt
+$ link/exe=decayscreen.exe screenhack,decayscreen,vms_axp.opt/opt
+$ link/exe=deco.exe screenhack,deco,vms_axp.opt/opt
+$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_axp.opt/opt
+$ link/exe=fadeplot.exe screenhack-xlock,fadeplot,xlockmore,vms_axp.opt/opt
+$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_axp.opt/opt
+$ link/exe=flame.exe screenhack,flame,vms_axp.opt/opt
+$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_axp.opt/opt
+$ link/exe=vines.exe screenhack-xlock,vines,xlockmore,vms_axp.opt/opt
+$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_axp.opt/opt
+$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_axp.opt/opt
+$ link/exe=greynetic screenhack,greynetic,vms_axp.opt/opt
+$ link/exe=halo.exe screenhack,halo,vms_axp.opt/opt
+$ link/exe=helix.exe screenhack,helix,vms_axp.opt/opt
+$ link/exe=hop.exe screenhack-xlock,hop,xlockmore,vms_axp.opt/opt
+$ link/exe=hypercube.exe screenhack,hypercube,vms_axp.opt/opt
+$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_axp.opt/opt
+$ link/exe=imsmap.exe screenhack,imsmap,vms_axp.opt/opt
+$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_axp.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_axp.opt/opt
+$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_axp.opt/opt
+$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_axp.opt/opt
+$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_axp.opt/opt
+$ link/exe=lmorph.exe screenhack,lmorph,vms_axp.opt/opt
+$ link/exe=maze.exe screenhack,maze,vms_axp.opt/opt
+$ link/exe=moire.exe screenhack,moire,vms_axp.opt/opt
+$ link/exe=noseguy.exe screenhack,noseguy,vms_axp.opt/opt
+$ link/exe=pedal.exe screenhack,pedal,vms_axp.opt/opt
+$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_axp.opt/opt
+$ link/exe=pyro.exe screenhack,pyro,vms_axp.opt/opt
+$ link/exe=qix.exe screenhack,qix,vms_axp.opt/opt
+$ link/exe=rd-bomb.exe screenhack,rd-bomb,vms_axp.opt/opt
+$ link/exe=rocks.exe screenhack,rocks,vms_axp.opt/opt
+$ link/exe=rorschach.exe screenhack,rorschach,vms_axp.opt/opt
+$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_axp.opt/opt
+$ link/exe=slidescreen.exe screenhack,slidescreen,vms_axp.opt/opt
+$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_axp.opt/opt
+$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_axp.opt/opt
+$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_axp.opt/opt
+$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_axp.opt/opt
+$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_axp.opt/opt
+$ link/exe=goop.exe screenhack,goop,vms_axp.opt/opt
+$ link/exe=starfish.exe screenhack,starfish,vms_axp.opt/opt
+$ link/exe=munch.exe screenhack,munch,vms_axp.opt/opt
+$ endif
diff --git a/hacks/link_decc.com b/hacks/link_decc.com
new file mode 100644
index 0000000..571c4f8
--- /dev/null
+++ b/hacks/link_decc.com
@@ -0,0 +1,107 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link/exe=attraction.exe screenhack,attraction,vms_decc_12.opt/opt
+$ link/exe=blitspin.exe screenhack,blitspin,vms_decc_12.opt/opt
+$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_decc_12.opt/opt
+$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_decc_12.opt/opt
+$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_decc_12.opt/opt
+$ link/exe=coral.exe screenhack,coral,vms_decc_12.opt/opt
+$ link/exe=decayscreen.exe screenhack,decayscreen,vms_decc_12.opt/opt
+$ link/exe=deco.exe screenhack,deco,vms_decc_12.opt/opt
+$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_decc_12.opt/opt
+$ link/exe=fadeplot.exe screenhack-xlock,fadeplot,xlockmore,vms_decc_12.opt/opt
+$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_decc_12.opt/opt
+$ link/exe=flame.exe screenhack,flame,vms_decc_12.opt/opt
+$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_decc_12.opt/opt
+$ link/exe=vines.exe screenhack-xlock,vines,xlockmore,vms_decc_12.opt/opt
+$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_decc_12.opt/opt
+$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_decc_12.opt/opt
+$ link/exe=greynetic screenhack,greynetic,vms_decc_12.opt/opt
+$ link/exe=halo.exe screenhack,halo,vms_decc_12.opt/opt
+$ link/exe=helix.exe screenhack,helix,vms_decc_12.opt/opt
+$ link/exe=hop.exe screenhack-xlock,hop,xlockmore,vms_decc_12.opt/opt
+$ link/exe=hypercube.exe screenhack,hypercube,vms_decc_12.opt/opt
+$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_decc_12.opt/opt
+$ link/exe=imsmap.exe screenhack,imsmap,vms_decc_12.opt/opt
+$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_decc_12.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_decc_12.opt/opt
+$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_decc_12.opt/opt
+$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_decc_12.opt/opt
+$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_decc_12.opt/opt
+$ link/exe=lmorph.exe screenhack,lmorph,vms_decc_12.opt/opt
+$ link/exe=maze.exe screenhack,maze,vms_decc_12.opt/opt
+$ link/exe=moire.exe screenhack,moire,vms_decc_12.opt/opt
+$ link/exe=noseguy.exe screenhack,noseguy,vms_decc_12.opt/opt
+$ link/exe=pedal.exe screenhack,pedal,vms_decc_12.opt/opt
+$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_decc_12.opt/opt
+$ link/exe=pyro.exe screenhack,pyro,vms_decc_12.opt/opt
+$ link/exe=qix.exe screenhack,qix,vms_decc_12.opt/opt
+$ link/exe=rd-bomb.exe screenhack,rd-bomb,vms_decc_12.opt/opt
+$ link/exe=rocks.exe screenhack,rocks,vms_decc_12.opt/opt
+$ link/exe=rorschach.exe screenhack,rorschach,vms_decc_12.opt/opt
+$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_decc_12.opt/opt
+$ link/exe=slidescreen.exe screenhack,slidescreen,vms_decc_12.opt/opt
+$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_decc_12.opt/opt
+$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_decc_12.opt/opt
+$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_decc_12.opt/opt
+$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_decc_12.opt/opt
+$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_decc_12.opt/opt
+$ link/exe=goop.exe screenhack,goop,vms_decc_12.opt/opt
+$ link/exe=starfish.exe screenhack,starfish,vms_decc_12.opt/opt
+$ link/exe=munch.exe screenhack,munch,vms_decc_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link/exe=attraction.exe screenhack,attraction,vms_decc.opt/opt
+$ link/exe=blitspin.exe screenhack,blitspin,vms_decc.opt/opt
+$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_decc.opt/opt
+$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_decc.opt/opt
+$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_decc.opt/opt
+$ link/exe=coral.exe screenhack,coral,vms_decc.opt/opt
+$ link/exe=decayscreen.exe screenhack,decayscreen,vms_decc.opt/opt
+$ link/exe=deco.exe screenhack,deco,vms_decc.opt/opt
+$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_decc.opt/opt
+$ link/exe=fadeplot.exe screenhack-xlock,fadeplot,xlockmore,vms_decc.opt/opt
+$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_decc.opt/opt
+$ link/exe=flame.exe screenhack,flame,vms_decc.opt/opt
+$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_decc.opt/opt
+$ link/exe=vines.exe screenhack-xlock,vines,xlockmore,vms_decc.opt/opt
+$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_decc.opt/opt
+$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_decc.opt/opt
+$ link/exe=greynetic screenhack,greynetic,vms_decc.opt/opt
+$ link/exe=halo.exe screenhack,halo,vms_decc.opt/opt
+$ link/exe=helix.exe screenhack,helix,vms_decc.opt/opt
+$ link/exe=hop.exe screenhack-xlock,hop,xlockmore,vms_decc.opt/opt
+$ link/exe=hypercube.exe screenhack,hypercube,vms_decc.opt/opt
+$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_decc.opt/opt
+$ link/exe=imsmap.exe screenhack,imsmap,vms_decc.opt/opt
+$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_decc.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_decc.opt/opt
+$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_decc.opt/opt
+$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_decc.opt/opt
+$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_decc.opt/opt
+$ link/exe=lmorph.exe screenhack,lmorph,vms_decc.opt/opt
+$ link/exe=maze.exe screenhack,maze,vms_decc.opt/opt
+$ link/exe=moire.exe screenhack,moire,vms_decc.opt/opt
+$ link/exe=noseguy.exe screenhack,noseguy,vms_decc.opt/opt
+$ link/exe=pedal.exe screenhack,pedal,vms_decc.opt/opt
+$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_decc.opt/opt
+$ link/exe=pyro.exe screenhack,pyro,vms_decc.opt/opt
+$ link/exe=qix.exe screenhack,qix,vms_decc.opt/opt
+$ link/exe=rd-bomb.exe screenhack,rd-bomb,vms_decc.opt/opt
+$ link/exe=rocks.exe screenhack,rocks,vms_decc.opt/opt
+$ link/exe=rorschach.exe screenhack,rorschach,vms_decc.opt/opt
+$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_decc.opt/opt
+$ link/exe=slidescreen.exe screenhack,slidescreen,vms_decc.opt/opt
+$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_decc.opt/opt
+$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_decc.opt/opt
+$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_decc.opt/opt
+$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_decc.opt/opt
+$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_decc.opt/opt
+$ link/exe=goop.exe screenhack,goop,vms_decc.opt/opt
+$ link/exe=starfish.exe screenhack,starfish,vms_decc.opt/opt
+$ link/exe=munch.exe screenhack,munch,vms_decc.opt/opt
+$ endif
diff --git a/hacks/lisa.c b/hacks/lisa.c
new file mode 100644
index 0000000..d0303b8
--- /dev/null
+++ b/hacks/lisa.c
@@ -0,0 +1,739 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* lisa --- animated full-loop lissajous figures */
+
+#if 0
+static const char sccsid[] = "@(#)lisa.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1997, 2006 by Caleb Cullen.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 23-Feb-2006: fixed color-cycling issues
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ *
+ * The inspiration for this program, Lasp, was written by Adam B. Roach
+ * in 1990, assisted by me, Caleb Cullen. It was written first in C, then
+ * in assembly, and used pre-calculated data tables to graph lissajous
+ * figures on 386 machines and lower. This version bears only superficial
+ * resemblances to the original Lasp.
+ *
+ * The `lissie' module's source code was studied as an example of how
+ * to incorporate a new module into xlock. Resemblances to it are
+ * expected, but not intended to be plaigiaristic.
+ *
+ * February, 2006: 21st Century Update for Lisa
+ * + fixed color-mapping: the 'beginning' of the loop always uses the
+ * same (starting) pixel value, causing the loop's coloration to
+ * appear solid rather than flickering as in the previous version
+ * + all lines/points in a single color are drawn at once using XDrawLines()
+ * or XDrawPoints(); the artifacting evident in the previous version
+ * has been masked by the use of CapNotLast to separate individual drawn
+ * areas with intentional "whitespace" (typically black)
+ * + added many new elements to the Function[] array
+ * + randomized selection of next function
+ * + introduced concept of "rarely-chosen" functions
+ * + cleaned up code somewhat, standardized capitalization, commented all
+ * #directives with block labels
+ */
+
+#ifdef STANDALONE
+# define MODE_lisa
+# define DEFAULTS "*delay: 17000 \n" \
+ "*count: 1 \n" \
+ "*cycles: 768 \n" \
+ "*size: 500 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*lowrez: True \n" \
+
+# define UNIFORM_COLORS
+# define release_lisa 0
+# define reshape_lisa 0
+# define lisa_handle_event xlockmore_no_events
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+#include "xlock.h" /* in xlockmore distribution */
+
+#endif /* STANDALONE */
+
+#ifdef MODE_lisa
+
+#define DEF_ADDITIVE "True"
+
+static Bool additive;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-additive", ".lisa.additive", XrmoptionNoArg, "True"},
+ {"+additive", ".lisa.additive", XrmoptionNoArg, "False"}
+};
+
+static argtype vars[] =
+{
+ {&additive, "additive", "Additive", DEF_ADDITIVE, t_Bool}
+};
+
+static OptionStruct desc[] =
+{
+ {"-/+additive", "turn on/off additive functions mode"}
+};
+
+ENTRYPOINT ModeSpecOpt lisa_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct lisa_description =
+{"lisa", "init_lisa", "draw_lisa", (char *) NULL,
+ "refresh_lisa", "change_lisa", "free_lisa", &lisa_opts,
+ 17000, 1, 768, -1, 64, 1.0, "",
+ "Shows animated lissajous figures", 0, NULL};
+
+#endif
+
+#define DRAWLINES 1
+/* #define FOLLOW_FUNC_ORDER 1 */
+#define TWOLOOPS 1
+#define XVMAX 10 /* Maximum velocities */
+#define YVMAX 10
+#define LISAMAXFUNCS 2
+#define NUMSTDFUNCS 28
+#define RAREFUNCMIN 25
+#define RAREFUNCODDS 4 /* 1:n chance a rare function will be re-randomized */
+#define MAXCYCLES 3
+#define MINLISAS 1
+#define STARTCOLOR 0
+#define STARTFUNC 24 /* if negative, is upper-bound on randomization */
+#define LINEWIDTH -8 /* if negative, is upper-bound on randomization */
+#define LINESTYLE LineSolid /* an insane man might have fun with this :) */
+#define LINECAP CapNotLast /* anything else looks pretty crappy */
+#define LINEJOIN JoinBevel /* this ought to be fastest */
+#define SET_COLOR() \
+ if (MI_NPIXELS(mi) > 2) { \
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, loop->color)); \
+ if (loop->cstep \
+ && pctr % loop->cstep == 0 \
+ && ++(loop->color) >= (unsigned) MI_NPIXELS(mi)) \
+ { loop->color=STARTCOLOR; } \
+ } else { XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi)); }
+#define GET_RADIUS(context) \
+ ((context->width > context->height)?context->height:context->width) * 3 / 8
+#define CHECK_RADIUS(loop, context) \
+ if ((context->height / 2 > MI_SIZE(mi)) && (context->width / 2 > MI_SIZE(mi))) \
+ loop->radius = MI_SIZE(mi); \
+ if ((loop->radius < 0) || \
+ (loop->radius > loop->center.x) || \
+ (loop->radius > loop->center.y)) loop->radius = GET_RADIUS(context)
+#define PRINT_FUNC(funcptr) \
+ printf("new function -- #%d:\n\tx = sin(%gs) * sin(%gs)\n\ty = sin(%gt) * sin(%gt)\n", \
+ funcptr->index, \
+ funcptr->xcoeff[0], funcptr->xcoeff[1], \
+ funcptr->ycoeff[0], funcptr->ycoeff[1])
+
+
+typedef struct lisafunc_struct {
+ double xcoeff[2], ycoeff[2];
+ int nx, ny;
+ int index;
+} lisafuncs;
+
+typedef struct lisa_struct {
+ unsigned long color;
+ int radius, dx, dy, nsteps, nfuncs, melting, cstep;
+ double pistep, phi, theta;
+ XPoint center, *lastpoint;
+ lisafuncs *function[LISAMAXFUNCS];
+ int linewidth;
+} lisas;
+
+typedef struct lisacontext_struct {
+ lisas *lissajous;
+ int width, height, nlissajous, loopcount;
+ int maxcycles;
+ Bool painted;
+} lisacons;
+
+static lisacons *Lisa = (lisacons *) NULL;
+
+static lisafuncs Function[NUMSTDFUNCS] =
+ {
+ {
+ {1.0, 2.0},
+ {1.0, 2.0}, 2, 2, 0},
+ {
+ {1.0, 2.0},
+ {1.0, 1.0}, 2, 2, 1},
+ {
+ {1.0, 3.0},
+ {1.0, 2.0}, 2, 2, 2},
+ {
+ {1.0, 3.0},
+ {1.0, 3.0}, 2, 2, 3},
+ {
+ {2.0, 4.0},
+ {1.0, 2.0}, 2, 2, 4},
+ {
+ {1.0, 4.0},
+ {1.0, 3.0}, 2, 2, 5},
+ {
+ {1.0, 4.0},
+ {1.0, 4.0}, 2, 2, 6},
+ {
+ {1.0, 5.0},
+ {1.0, 5.0}, 2, 2, 7},
+ {
+ {2.0, 5.0},
+ {2.0, 5.0}, 2, 2, 8},
+ {
+ {1.0, 2.0},
+ {2.0, 5.0}, 2, 2, 9},
+ {
+ {1.0, 2.0},
+ {3.0, 5.0}, 2, 2, 10},
+ {
+ {1.0, 2.0},
+ {2.0, 3.0}, 2, 2, 11},
+ {
+ {1.0, 3.0},
+ {2.0, 3.0}, 2, 2, 12},
+ {
+ {2.0, 3.0},
+ {1.0, 3.0}, 2, 2, 13},
+ {
+ {2.0, 4.0},
+ {1.0, 3.0}, 2, 2, 14},
+ {
+ {1.0, 4.0},
+ {2.0, 3.0}, 2, 2, 15},
+ {
+ {2.0, 4.0},
+ {2.0, 3.0}, 2, 2, 16},
+ {
+ {1.0, 5.0},
+ {2.0, 3.0}, 2, 2, 17},
+ {
+ {2.0, 5.0},
+ {2.0, 3.0}, 2, 2, 18},
+ {
+ {1.0, 5.0},
+ {2.0, 5.0}, 2, 2, 19},
+ {
+ {1.0, 3.0},
+ {2.0, 7.0}, 2, 2, 20},
+ {
+ {2.0, 3.0},
+ {5.0, 7.0}, 2, 2, 21},
+ {
+ {1.0, 2.0},
+ {3.0, 7.0}, 2, 2, 22},
+ {
+ {2.0, 5.0},
+ {5.0, 7.0}, 2, 2, 23},
+ {
+ {5.0, 7.0},
+ {5.0, 7.0}, 2, 2, 24},
+ { /* functions past here are 'rare' and won't */
+ {2.0, 7.0}, /* show up as often. tweak the #defines above */
+ {1.0, 7.0}, 2, 2, 25}, /* to see them more frequently */
+ {
+ {2.0, 9.0},
+ {1.0, 7.0}, 2, 2, 26},
+ {
+ {5.0, 11.0},
+ {2.0, 9.0}, 2, 2, 27}
+};
+
+int xMaxLines;
+
+ENTRYPOINT void
+free_lisa(ModeInfo * mi)
+{
+ lisacons *lc = &Lisa[MI_SCREEN(mi)];
+ while (lc->lissajous) {
+ int lctr;
+
+ for (lctr = 0; lctr < lc->nlissajous; lctr++) {
+ (void) free((void *) lc->lissajous[lctr].lastpoint);
+ }
+ (void) free((void *) lc->lissajous);
+ lc->lissajous = (lisas *) NULL;
+ }
+}
+
+static Bool
+drawlisa(ModeInfo * mi, lisas * loop)
+{
+ XPoint *np;
+ XPoint *lp = loop->lastpoint;
+ lisacons *lc = &Lisa[MI_SCREEN(mi)];
+ lisafuncs **lf = loop->function;
+ int phase = lc->loopcount % loop->nsteps;
+ int pctr, fctr, xctr, yctr, extra_points;
+ double xprod, yprod, xsum, ysum;
+
+ /* why carry this around in the struct when we can calculate it on demand? */
+ extra_points = loop->cstep - (loop->nsteps % loop->cstep);
+
+ /* Allocate the np (new point) array (with padding) */
+ if ((np = (XPoint *) calloc(loop->nsteps+extra_points, sizeof (XPoint))) == NULL) {
+ free_lisa(mi);
+ return False;
+ }
+
+ /* Update the center */
+ loop->center.x += loop->dx;
+ loop->center.y += loop->dy;
+ CHECK_RADIUS(loop, lc);
+
+ /* check for overlaps -- where the figure might go off the screen */
+
+ if ((loop->center.x - loop->radius) <= 0) {
+ loop->center.x = loop->radius;
+ loop->dx = NRAND(XVMAX);
+ } else if ((loop->center.x + loop->radius) >= lc->width) {
+ loop->center.x = lc->width - loop->radius;
+ loop->dx = -NRAND(XVMAX);
+ };
+ if ((loop->center.y - loop->radius) <= 0) {
+ loop->center.y = loop->radius;
+ loop->dy = NRAND(YVMAX);
+ } else if ((loop->center.y + loop->radius) >= lc->height) {
+ loop->center.y = lc->height - loop->radius;
+ loop->dy = -NRAND(YVMAX);
+ };
+
+ /* Now draw the points, and erase the ones from the last cycle */
+
+ for (pctr = 0; pctr < loop->nsteps; pctr++) {
+ fctr = loop->nfuncs;
+ loop->phi = (double) (pctr - phase) * loop->pistep;
+ loop->theta = (double) (pctr + phase) * loop->pistep;
+ xsum = ysum = 0;
+ while (fctr--) {
+ xctr = lf[fctr]->nx;
+ yctr = lf[fctr]->ny;
+ if (additive) {
+ xprod = yprod = 0.0;
+ while (xctr--)
+ xprod += sin(lf[fctr]->xcoeff[xctr] * loop->theta);
+ while (yctr--)
+ yprod += sin(lf[fctr]->ycoeff[yctr] * loop->phi);
+ if (loop->melting) {
+ if (fctr) {
+ xsum += xprod * (double) (loop->nsteps - loop->melting) /
+ (double) loop->nsteps;
+ ysum += yprod * (double) (loop->nsteps - loop->melting) /
+ (double) loop->nsteps;
+ } else {
+ xsum += xprod * (double) loop->melting / (double) loop->nsteps;
+ ysum += yprod * (double) loop->melting / (double) loop->nsteps;
+ }
+ } else {
+ xsum = xprod;
+ ysum = yprod;
+ }
+ if (!fctr) {
+ xsum = xsum * (double) loop->radius / (double) lf[fctr]->nx;
+ ysum = ysum * (double) loop->radius / (double) lf[fctr]->ny;
+ }
+ } else {
+ if (loop->melting) {
+ if (fctr) {
+ yprod = xprod = (double) loop->radius *
+ (double) (loop->nsteps - loop->melting) /
+ (double) (loop->nsteps);
+ } else {
+ yprod = xprod = (double) loop->radius *
+ (double) (loop->melting) / (double) (loop->nsteps);
+ }
+ } else {
+ xprod = yprod = (double) loop->radius;
+ }
+ while (xctr--)
+ xprod *= sin(lf[fctr]->xcoeff[xctr] * loop->theta);
+ while (yctr--)
+ yprod *= sin(lf[fctr]->ycoeff[yctr] * loop->phi);
+ xsum += xprod;
+ ysum += yprod;
+ }
+ }
+ if ((loop->nfuncs > 1) && (!loop->melting)) {
+ xsum /= (double) loop->nfuncs;
+ ysum /= (double) loop->nfuncs;
+ }
+ xsum += (double) loop->center.x;
+ ysum += (double) loop->center.y;
+
+ np[pctr].x = (int) ceil(xsum);
+ np[pctr].y = (int) ceil(ysum);
+ }
+ /* fill in extra points */
+ for (pctr=loop->nsteps; pctr < loop->nsteps+extra_points; pctr++) {
+ np[pctr].x = np[pctr - loop->nsteps].x;
+ np[pctr].y = np[pctr - loop->nsteps].y;
+ }
+ if (loop->melting) {
+ if (!--loop->melting) {
+ loop->nfuncs = 1;
+ loop->function[0] = loop->function[1];
+ }
+ }
+
+ /* reset starting color each time to prevent ass-like appearance */
+ loop->color = STARTCOLOR;
+
+ if (loop->cstep < xMaxLines) {
+ /* printf("Drawing dashes\n"); */
+ for (pctr = 0; pctr < loop->nsteps; pctr+=loop->cstep) {
+#if defined DRAWLINES
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), loop->linewidth,
+ LINESTYLE, LINECAP, LINEJOIN);
+ /* erase the last cycle's point */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), &lp[pctr],
+ loop->cstep, CoordModeOrigin);
+
+ /* Set the new color */
+ SET_COLOR();
+
+ /* plot this cycle's point */
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ &np[pctr], loop->cstep, CoordModeOrigin);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 1,
+ LINESTYLE, LINECAP, LINEJOIN);
+#else
+ /* erase the last cycle's point */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XDrawPoints(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ &lp[pctr], loop->cstep, CoordModeOrigin);
+
+ /* Set the new color */
+ SET_COLOR();
+
+ /* plot this cycle's point */
+ XDrawPoints(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_GC(mi), &np[pctr], loop->cstep, CoordModeOrigin);
+#endif
+ }
+ } else { /* on my system, cstep is larger than 65532/2 if we get here */
+ for (pctr = 0; pctr < loop->nsteps; pctr++) {
+#if defined DRAWLINES
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), loop->linewidth,
+ LINESTYLE, LINECAP, LINEJOIN);
+ /* erase the last cycle's point */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_GC(mi), lp[pctr].x, lp[pctr].y,
+ lp[(pctr + 1) % loop->nsteps].x,
+ lp[(pctr + 1) % loop->nsteps].y);
+
+ /* Set the new color */
+ SET_COLOR();
+
+ /* plot this cycle's point */
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_GC(mi), np[pctr].x, np[pctr].y,
+ np[(pctr + 1) % loop->nsteps].x,
+ np[(pctr + 1) % loop->nsteps].y);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 1,
+ LINESTYLE, LINECAP, LINEJOIN);
+#else /* DRAWLINES */
+ /* erase the last cycle's point */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_GC(mi), lp[pctr].x, lp[pctr].y);
+
+ /* Set the new color */
+ SET_COLOR();
+
+ /* plot this cycle's point */
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_GC(mi), np[pctr].x, np[pctr].y);
+#endif /* DRAWLINES */
+ }
+ }
+ (void) free((void *) lp);
+ loop->lastpoint = np;
+ return True;
+}
+
+static Bool
+initlisa(ModeInfo * mi, lisas * loop)
+{
+ lisacons *lc = &Lisa[MI_SCREEN(mi)];
+ lisafuncs **lf = loop->function;
+ XPoint *lp;
+ int phase, pctr, fctr, xctr, yctr, extra_points;
+ double xprod, yprod, xsum, ysum;
+
+ xMaxLines = (XMaxRequestSize(MI_DISPLAY(mi))-3)/2;
+ /* printf("Got xMaxLines = %d\n", xMaxLines); */
+ loop->nsteps = MI_CYCLES(mi);
+ if (loop->nsteps == 0)
+ loop->nsteps = 1;
+ if (MI_NPIXELS(mi) > 2) {
+ loop->color = STARTCOLOR;
+ loop->cstep = (loop->nsteps > MI_NPIXELS(mi)) ? loop->nsteps / MI_NPIXELS(mi) : 1;
+ } else {
+ loop->color = MI_WHITE_PIXEL(mi);
+ loop->cstep = 0;
+ }
+ extra_points = loop->cstep - (loop->nsteps % loop->cstep);
+ lc->maxcycles = (MAXCYCLES * loop->nsteps) - 1;
+ loop->cstep = ( loop->nsteps > MI_NPIXELS(mi) ) ? loop->nsteps / MI_NPIXELS(mi) : 1;
+ /* printf("Got cstep = %d\n", loop->cstep); */
+ loop->melting = 0;
+ loop->nfuncs = 1;
+ loop->pistep = 2.0 * M_PI / (double) loop->nsteps;
+ loop->center.x = lc->width / 2;
+ loop->center.y = lc->height / 2;
+ loop->radius = (int) MI_SIZE(mi);
+ CHECK_RADIUS(loop, lc);
+ loop->dx = NRAND(XVMAX);
+ loop->dy = NRAND(YVMAX);
+ loop->dx++;
+ loop->dy++;
+#if defined STARTFUNC
+ lf[0] = &Function[STARTFUNC];
+#else /* STARTFUNC */
+ lf[0] = &Function[NRAND(NUMSTDFUNCS)];
+#endif /* STARTFUNC */
+
+ if ((lp = loop->lastpoint = (XPoint *)
+ calloc(loop->nsteps+extra_points, sizeof (XPoint))) == NULL) {
+ free_lisa(mi);
+ return False;
+ }
+ phase = lc->loopcount % loop->nsteps;
+
+#if defined DEBUG
+ printf( "nsteps = %d\tcstep = %d\tmrs = %d\textra_points = %d\n",
+ loop->nsteps, loop->cstep, xMaxLines, extra_points );
+ PRINT_FUNC(lf[0]);
+#endif /* DEBUG */
+
+ for (pctr = 0; pctr < loop->nsteps; pctr++) {
+ loop->phi = (double) (pctr - phase) * loop->pistep;
+ loop->theta = (double) (pctr + phase) * loop->pistep;
+ fctr = loop->nfuncs;
+ xsum = ysum = 0.0;
+ while (fctr--) {
+ xprod = yprod = (double) loop->radius;
+ xctr = lf[fctr]->nx;
+ yctr = lf[fctr]->ny;
+ while (xctr--)
+ xprod *= sin(lf[fctr]->xcoeff[xctr] * loop->theta);
+ while (yctr--)
+ yprod *= sin(lf[fctr]->ycoeff[yctr] * loop->phi);
+ xsum += xprod;
+ ysum += yprod;
+ }
+ if (loop->nfuncs > 1) {
+ xsum /= 2.0;
+ ysum /= 2.0;
+ }
+ xsum += (double) loop->center.x;
+ ysum += (double) loop->center.y;
+
+ lp[pctr].x = (int) ceil(xsum);
+ lp[pctr].y = (int) ceil(ysum);
+ }
+ /* this fills in the extra points, so we can use segment-drawing calls */
+ for (pctr = loop->nsteps; pctr < loop->nsteps + extra_points; pctr++) {
+ lp[pctr].x=lp[pctr - loop->nsteps].x;
+ lp[pctr].y=lp[pctr - loop->nsteps].y;
+ }
+#if defined DRAWLINES
+ loop->linewidth = LINEWIDTH; /* #### make this a resource */
+
+ if (loop->linewidth == 0)
+ loop->linewidth = 1;
+ if (loop->linewidth < 0)
+ loop->linewidth = NRAND(-loop->linewidth) + 1;
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), loop->linewidth,
+ LINESTYLE, LINECAP, LINEJOIN);
+#endif /* DRAWLINES */
+
+ if ( loop->cstep < xMaxLines ) {
+ /* we can send each color segment in a single request
+ * because the max request length is long enough
+ * and because we have padded out the array to have extra elements
+ * to support calls which would otherwise fall off the end*/
+ for (pctr = 0; pctr < loop->nsteps; pctr+=loop->cstep) {
+ /* Set the color */
+ SET_COLOR();
+
+#if defined DRAWLINES
+ XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_GC(mi), &lp[pctr], loop->cstep, CoordModeOrigin );
+#else /* DRAWLINES */
+ XDrawPoints(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ &lp[pctr], loop->cstep, CoordModeOrigin );
+#endif /* DRAWLINES */
+ }
+ } else { /* do it one by one as before */
+ for (pctr = 0; pctr < loop->nsteps; pctr++ ) {
+ SET_COLOR();
+
+#if defined DRAWLINES
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ lp[pctr].x, lp[pctr].y,
+ lp[pctr+1 % loop->nsteps].x, lp[pctr+1 % loop->nsteps].y);
+#else /* DRAWLINES */
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ lp[pctr].x, lp[pctr].y);
+#endif /* DRAWLINES */
+ }
+ }
+
+#if defined DRAWLINES
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 1,
+ LINESTYLE, LINECAP, LINEJOIN);
+#endif /* DRAWLINES */
+ return True;
+}
+
+static void
+refreshlisa(ModeInfo * mi)
+{
+ lisacons *lc = &Lisa[MI_SCREEN(mi)];
+ int lctr;
+
+ for (lctr = 0; lctr < lc->nlissajous; lctr++) {
+ if (!drawlisa(mi, &lc->lissajous[lctr]))
+ return;
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_lisa(ModeInfo * mi)
+{
+ lisacons *lc;
+
+ if (Lisa == NULL)
+ return;
+ lc = &Lisa[MI_SCREEN(mi)];
+ if (lc->lissajous == NULL)
+ return;
+
+ if (lc->painted) {
+ lc->painted = False;
+ MI_CLEARWINDOW(mi);
+ refreshlisa(mi);
+ }
+}
+#endif
+
+static void
+change_lisa(ModeInfo * mi)
+{
+ lisas *loop;
+ int lctr, newfunc;
+ lisacons *lc;
+
+ if (Lisa == NULL)
+ return;
+ lc = &Lisa[MI_SCREEN(mi)];
+ if (lc->lissajous == NULL)
+ return;
+
+ lc->loopcount = 0;
+ for (lctr = 0; lctr < lc->nlissajous; lctr++) {
+ loop = &lc->lissajous[lctr]; /* count through the loops we're drawing */
+ newfunc = NRAND(NUMSTDFUNCS); /* choose a new function at random */
+#if defined FOLLOW_FUNC_ORDER
+ loop->function[1] =
+ &Function[(loop->function[0]->index + 1) % NUMSTDFUNCS];
+#else /* FOLLOW_FUNC_ORDER */
+ if (newfunc == loop->function[0]->index) {
+ ++newfunc;
+ newfunc %= NUMSTDFUNCS; /* take the next if we got the one we have */
+ }
+ if (newfunc >= RAREFUNCMIN \
+ && !(random() % RAREFUNCODDS) \
+ && (newfunc = NRAND(NUMSTDFUNCS)) == loop->function[0]->index) {
+ ++newfunc;
+ newfunc %= NUMSTDFUNCS;
+ }
+ loop->function[1] = /* set 2nd function pointer on the loop */
+ &Function[newfunc]; /* to the new function we just chose */
+#endif /* FOLLOW_FUNC_ORDER */
+#if defined DEBUG
+ PRINT_FUNC(loop->function[1]);
+#endif /* DEBUG */
+ loop->melting = loop->nsteps - 1; /* melt the two functions together */
+ loop->nfuncs = 2; /* simultaneously for a full cycle */
+ }
+}
+
+ENTRYPOINT void
+init_lisa (ModeInfo * mi)
+{
+ int lctr;
+ lisacons *lc;
+
+ MI_INIT (mi, Lisa);
+ lc = &Lisa[MI_SCREEN(mi)];
+ lc->width = MI_WIDTH(mi);
+ lc->height = MI_HEIGHT(mi);
+ lc->loopcount = 0;
+ lc->nlissajous = MI_COUNT(mi);
+ if (lc->nlissajous <= 0)
+ lc->nlissajous = 1;
+ MI_CLEARWINDOW(mi);
+ lc->painted = False;
+
+ if (lc->lissajous == NULL) {
+ if ((lc->lissajous = (lisas *) calloc(lc->nlissajous,
+ sizeof (lisas))) == NULL)
+ return;
+ for (lctr = 0; lctr < lc->nlissajous; lctr++) {
+ if (!initlisa(mi, &lc->lissajous[lctr]))
+ return;
+ lc->loopcount++;
+ }
+ } else {
+ refreshlisa(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_lisa (ModeInfo * mi)
+{
+ lisacons *lc;
+
+ if (Lisa == NULL)
+ return;
+ lc = &Lisa[MI_SCREEN(mi)];
+ if (lc->lissajous == NULL)
+ return;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+ MI_IS_DRAWN(mi) = True;
+ lc->painted = True;
+ if (++lc->loopcount > lc->maxcycles) {
+ change_lisa(mi);
+ }
+ refreshlisa(mi);
+}
+
+XSCREENSAVER_MODULE ("Lisa", lisa)
+
+#endif /* MODE_lisa */
diff --git a/hacks/lisa.man b/hacks/lisa.man
new file mode 100644
index 0000000..2bfd7f4
--- /dev/null
+++ b/hacks/lisa.man
@@ -0,0 +1,71 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+lisa - draws animated full-loop lissajous figures
+.SH SYNOPSIS
+.B lisa
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIlisa\fP program draws animated full-loop lissajous figures.
+.SH OPTIONS
+.I lisa
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+The colors are chosen randomly.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-size \fIinteger\fP
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Caleb Cullen.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Caleb Cullen, 1997.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/lissie.c b/hacks/lissie.c
new file mode 100644
index 0000000..bb631b2
--- /dev/null
+++ b/hacks/lissie.c
@@ -0,0 +1,322 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* lissie --- the Lissajous worm */
+
+#if 0
+static const char sccsid[] = "@(#)lissie.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * lissie.c - The Lissajous worm for xlock, the X Window System
+ * lockscreen.
+ *
+ * Copyright (c) 1996 by Alexander Jolk <ub9x@rz.uni-karlsruhe.de>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 18-Aug-1996: added refresh-hook.
+ * 01-May-1996: written.
+ */
+
+#ifdef STANDALONE
+# define MODE_lissie
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 1 \n" \
+ "*cycles: 20000 \n" \
+ "*size: -200 \n" \
+ "*ncolors: 200 \n" \
+ "*fpsSolid: true \n" \
+
+# define SMOOTH_COLORS
+# define release_lissie 0
+# define reshape_lissie 0
+# define lissie_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_lissie
+
+ENTRYPOINT ModeSpecOpt lissie_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct lissie_description =
+{"lissie", "init_lissie", "draw_lissie", (char *) NULL,
+ "refresh_lissie", "init_lissie", "free_lissie", &lissie_opts,
+ 10000, 1, 2000, -200, 64, 0.6, "",
+ "Shows lissajous worms", 0, NULL};
+
+#endif
+
+#define MINSIZE 1
+
+#define Lissie(n)\
+ if (lissie->loc[(n)].x > 0 && lissie->loc[(n)].y > 0 &&\
+ lissie->loc[(n)].x <= lp->width && lissie->loc[(n)].y <= lp->height) {\
+ if (lissie->ri < 2)\
+ XDrawPoint(display, MI_WINDOW(mi),\
+ gc, lissie->loc[(n)].x, lissie->loc[(n)].y);\
+ else\
+ XDrawArc(display, MI_WINDOW(mi), gc,\
+ lissie->loc[(n)].x - lissie->ri / 2,\
+ lissie->loc[(n)].y - lissie->ri / 2,\
+ lissie->ri, lissie->ri, 0, 23040);\
+ }
+
+#define FLOATRAND(min,max) ((min)+(LRAND()/MAXRAND)*((max)-(min)))
+#define INTRAND(min,max) ((min)+NRAND((max)-(min)+1))
+
+#define MINDT 0.01
+#define MAXDT 0.15
+
+#define MAXLISSIELEN 100
+#define MINLISSIELEN 10
+#define MINLISSIES 1
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+typedef struct {
+ double tx, ty, dtx, dty;
+ int xi, yi, ri, rx, ry, len, pos;
+ int redrawing, redrawpos;
+ XPoint loc[MAXLISSIELEN];
+ unsigned long color;
+} lissiestruct;
+
+typedef struct {
+ Bool painted;
+ int width, height;
+ int nlissies;
+ lissiestruct *lissie;
+ int loopcount;
+} lissstruct;
+
+static lissstruct *lisses = (lissstruct *) NULL;
+
+
+static void
+drawlissie(ModeInfo * mi, lissiestruct * lissie)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ lissstruct *lp = &lisses[MI_SCREEN(mi)];
+ int p = (++lissie->pos) % MAXLISSIELEN;
+ int oldp = (lissie->pos - lissie->len + MAXLISSIELEN) % MAXLISSIELEN;
+
+ /* Let time go by ... */
+ lissie->tx += lissie->dtx;
+ lissie->ty += lissie->dty;
+ if (lissie->tx > 2 * M_PI)
+ lissie->tx -= 2 * M_PI;
+ if (lissie->ty > 2 * M_PI)
+ lissie->ty -= 2 * M_PI;
+
+ /* vary both (x/y) speeds by max. 1% */
+ lissie->dtx *= FLOATRAND(0.99, 1.01);
+ lissie->dty *= FLOATRAND(0.99, 1.01);
+ if (lissie->dtx < MINDT)
+ lissie->dtx = MINDT;
+ else if (lissie->dtx > MAXDT)
+ lissie->dtx = MAXDT;
+ if (lissie->dty < MINDT)
+ lissie->dty = MINDT;
+ else if (lissie->dty > MAXDT)
+ lissie->dty = MAXDT;
+
+ lissie->loc[p].x = lissie->xi + (int) (sin(lissie->tx) * lissie->rx);
+ lissie->loc[p].y = lissie->yi + (int) (sin(lissie->ty) * lissie->ry);
+
+ /* Mask */
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ Lissie(oldp);
+
+ /* Redraw */
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, gc, MI_PIXEL(mi, lissie->color));
+ if (++lissie->color >= (unsigned) MI_NPIXELS(mi))
+ lissie->color = 0;
+ } else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ Lissie(p);
+ if (lissie->redrawing) {
+ int i;
+
+ lissie->redrawpos++;
+ /* This compensates for the changed p
+ since the last callback. */
+
+ for (i = 0; i < REDRAWSTEP; i++) {
+ Lissie((p - lissie->redrawpos + MAXLISSIELEN) % MAXLISSIELEN);
+ if (++(lissie->redrawpos) >= lissie->len) {
+ lissie->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+static void
+initlissie(ModeInfo * mi, lissiestruct * lissie)
+{
+ lissstruct *lp = &lisses[MI_SCREEN(mi)];
+ int size = MI_SIZE(mi);
+ int i;
+
+ if (MI_NPIXELS(mi) > 2)
+ lissie->color = NRAND(MI_NPIXELS(mi));
+ else
+ lissie->color = MI_WHITE_PIXEL(mi);
+ /* Initialize parameters */
+ if (size < -MINSIZE)
+ lissie->ri = NRAND(MIN(-size, MAX(MINSIZE,
+ MIN(lp->width, lp->height) / 4)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ lissie->ri = MAX(MINSIZE, MIN(lp->width, lp->height) / 4);
+ else
+ lissie->ri = MINSIZE;
+ } else
+ lissie->ri = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) / 4));
+ lissie->xi = INTRAND(lp->width / 4 + lissie->ri,
+ lp->width * 3 / 4 - lissie->ri);
+ lissie->yi = INTRAND(lp->height / 4 + lissie->ri,
+ lp->height * 3 / 4 - lissie->ri);
+ lissie->rx = INTRAND(lp->width / 4,
+ MIN(lp->width - lissie->xi, lissie->xi)) - 2 * lissie->ri;
+ lissie->ry = INTRAND(lp->height / 4,
+ MIN(lp->height - lissie->yi, lissie->yi)) - 2 * lissie->ri;
+ lissie->len = INTRAND(MINLISSIELEN, MAXLISSIELEN - 1);
+ lissie->pos = 0;
+
+ lissie->redrawing = 0;
+
+ lissie->tx = FLOATRAND(0, 2 * M_PI);
+ lissie->ty = FLOATRAND(0, 2 * M_PI);
+ lissie->dtx = FLOATRAND(MINDT, MAXDT);
+ lissie->dty = FLOATRAND(MINDT, MAXDT);
+
+ for (i = 0; i < MAXLISSIELEN; i++)
+ lissie->loc[i].x = lissie->loc[i].y = 0;
+}
+
+ENTRYPOINT void
+init_lissie (ModeInfo * mi)
+{
+ lissstruct *lp;
+ unsigned char ball;
+
+ MI_INIT (mi, lisses);
+ lp = &lisses[MI_SCREEN(mi)];
+
+ lp->width = MI_WIDTH(mi);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+#endif
+
+ lp->height = MI_HEIGHT(mi);
+
+ lp->nlissies = MI_COUNT(mi);
+ if (lp->nlissies < -MINLISSIES) {
+ if (lp->lissie) {
+ (void) free((void *) lp->lissie);
+ lp->lissie = (lissiestruct *) NULL;
+ }
+ lp->nlissies = NRAND(-lp->nlissies - MINLISSIES + 1) + MINLISSIES;
+ } else if (lp->nlissies < MINLISSIES)
+ lp->nlissies = MINLISSIES;
+
+ lp->loopcount = 0;
+
+ if (lp->lissie == NULL)
+ if ((lp->lissie = (lissiestruct *) calloc(lp->nlissies,
+ sizeof (lissiestruct))) == NULL)
+ return;
+
+ MI_CLEARWINDOW(mi);
+ lp->painted = False;
+
+ for (ball = 0; ball < (unsigned char) lp->nlissies; ball++)
+ initlissie(mi, &lp->lissie[ball]);
+
+}
+
+ENTRYPOINT void
+draw_lissie (ModeInfo * mi)
+{
+ register unsigned char ball;
+ lissstruct *lp;
+
+ if (lisses == NULL)
+ return;
+ lp = &lisses[MI_SCREEN(mi)];
+ if (lp->lissie == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (++lp->loopcount > MI_CYCLES(mi)) {
+ init_lissie(mi);
+ } else {
+ lp->painted = True;
+ for (ball = 0; ball < (unsigned char) lp->nlissies; ball++)
+ drawlissie(mi, &lp->lissie[ball]);
+ }
+}
+
+ENTRYPOINT void
+free_lissie (ModeInfo * mi)
+{
+ lissstruct *lp;
+
+ if (lisses == NULL)
+ return;
+ lp = &lisses[MI_SCREEN(mi)];
+
+ if (lp->lissie != NULL) {
+ (void) free((void *) lp->lissie);
+ /* lp->lissie = NULL; */
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_lissie(ModeInfo * mi)
+{
+ int i;
+ lissstruct *lp;
+
+ if (lisses == NULL)
+ return;
+ lp = &lisses[MI_SCREEN(mi)];
+ if (lp->lissie == NULL)
+ return;
+
+ if (lp->painted) {
+ MI_CLEARWINDOW(mi);
+ for (i = 0; i < lp->nlissies; i++) {
+ lp->lissie[i].redrawing = 1;
+ lp->lissie[i].redrawpos = 0;
+ }
+ }
+}
+#endif
+
+XSCREENSAVER_MODULE ("Lissie", lissie)
+
+#endif /* MODE_lissie */
diff --git a/hacks/lissie.man b/hacks/lissie.man
new file mode 100644
index 0000000..43123b2
--- /dev/null
+++ b/hacks/lissie.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+lissie - lissajous figure.
+.SH SYNOPSIS
+.B lissie
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Another Lissajous figure. This one draws the progress of circular shapes
+along a path.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Count. 0 - 20. Default: 1.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout. Default: 20000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 200.
+.TP 8
+.B \-size \fInumber\fP
+Size. -500 to +500. Default: -200.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Alexander Jolk. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Alexander Jolk.
diff --git a/hacks/ljlatest b/hacks/ljlatest
new file mode 100755
index 0000000..1a24852
--- /dev/null
+++ b/hacks/ljlatest
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/hacks/ljlatest.man b/hacks/ljlatest.man
new file mode 100644
index 0000000..21fe450
--- /dev/null
+++ b/hacks/ljlatest.man
@@ -0,0 +1,61 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "20-Mar-2005" "X Version 11"
+.SH NAME
+ljlatest - prints the most recent public posts on livejournal.com.
+.SH SYNOPSIS
+.B ljlatest
+[\--verbose]
+[\--columns \fIN\fP]
+.SH DESCRIPTION
+The \fIljlatest\fP script reads the most recent public posts made to
+livejournal.com, and prints them on stdout, after doing a rudimentary
+conversion of HTML to plain text.
+
+This script is just a wrapper around
+.EX
+xscreensaver-text \\
+ --url http://www.livejournal.com/stats/latest-rss.bml
+.EE
+As of XScreenSaver 4.21, you can just use use above URL
+in the "Text URL" field on the "Advanced" tab in
+.BR xscreensaver-demo (1).
+.SH BUGS
+This program makes it seem like morons have invaded your screen saver.
+
+The output is always ISO-8859-1, regardless of locale.
+.SH SEE ALSO
+.I http://www.livejournal.com/,
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR fontglide (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 2003, 2005 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 30-Aug-2003.
diff --git a/hacks/lmorph.c b/hacks/lmorph.c
new file mode 100644
index 0000000..9468a72
--- /dev/null
+++ b/hacks/lmorph.c
@@ -0,0 +1,568 @@
+/* lmorph, Copyright (c) 1993-1999 Sverre H. Huseby and Glenn T. Lines
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*------------------------------------------------------------------------
+ |
+ | FILE lmorph.c
+ | MODULE OF xscreensaver
+ |
+ | DESCRIPTION Smooth and non-linear morphing between 1D curves.
+ |
+ | WRITTEN BY Sverre H. Huseby Glenn T. Lines
+ | Kurvn. 30 Østgaardsgt. 5
+ | N-0495 Oslo N-0474 Oslo
+ | Norway Norway
+ |
+ | Phone: +47 901 63 579 Phone: +47 22 04 67 28
+ | E-mail: sverrehu@online.no E-mail: glennli@ifi.uio.no
+ | URL: http://home.sol.no/~sverrehu/
+ |
+ | The original idea, and the bilinear interpolation
+ | mathematics used, emerged in the head of the wise
+ | Glenn T. Lines.
+ |
+ | MODIFICATIONS october 1999 (shh)
+ | * Removed option to use integer arithmetic.
+ | * Increased default number of points, and brightened
+ | the foreground color a little bit.
+ | * Minor code cleanup (very minor, that is).
+ | * Default number of steps is no longer random.
+ | * Added -linewidth option (and resource).
+ |
+ | october 1999 (gtl)
+ | * Added cubic interpolation between shapes
+ | * Added non-linear transformation speed
+ |
+ | june 1998 (shh)
+ | * Minor code cleanup.
+ |
+ | january 1997 (shh)
+ | * Some code reformatting.
+ | * Added possibility to use float arithmetic.
+ | * Added -figtype option.
+ | * Made color blue default.
+ |
+ | december 1995 (jwz)
+ | * Function headers converted from ANSI to K&R.
+ | * Added posibility for random number of steps, and
+ | made this the default.
+ |
+ | march 1995 (shh)
+ | * Converted from an MS-Windows program to X Window.
+ |
+ | november 1993 (gtl, shh, lots of beer)
+ | * Original Windows version (we didn't know better).
+ +----------------------------------------------------------------------*/
+
+#include <math.h>
+#include "screenhack.h"
+
+/*-----------------------------------------------------------------------+
+| PRIVATE DATA |
++-----------------------------------------------------------------------*/
+
+/* define MARGINS to make some space around the figure. */
+#define MARGINS
+
+#define MAXFIGS 20
+#define TWO_PI (2.0 * M_PI)
+#define RND(x) (random() % (x))
+
+#define FT_OPEN 1
+#define FT_CLOSED 2
+#define FT_ALL (FT_OPEN | FT_CLOSED)
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int numFigs; /* number of figure arrays. */
+ int numPoints; /* number of points in each array. */
+ int nWork; /* current work array number. */
+ int nFrom; /* current from array number. */
+ int nTo; /* current to array number. */
+ int nNext; /* current next array number (after to).*/
+ int shift; /* shifts the starting point of a figure */
+ int figType;
+
+ long delay; /* usecs to wait between updates. */
+
+ XPoint *aWork[2]; /* working arrays. */
+ XPoint *a[MAXFIGS]; /* the figure arrays. */
+ XPoint *aTmp; /* used as source when interrupting morph */
+ XPoint *aPrev; /* previous points displayed. */
+ XPoint *aCurr; /* the current points displayed. */
+ XPoint *aFrom; /* figure converting from. */
+ XPoint *aTo; /* figure converting to. */
+ XPoint *aNext; /* figure converting to next time. */
+ XPoint *aSlopeFrom; /* slope at start of morph */
+ XPoint *aSlopeTo; /* slope at end of morph */
+
+ int scrWidth, scrHeight;
+ double currGamma, maxGamma, deltaGamma;
+ GC gcDraw, gcClear;
+};
+
+
+/*-----------------------------------------------------------------------+
+| PUBLIC DATA |
++-----------------------------------------------------------------------*/
+
+static const char *lmorph_defaults [] = {
+ ".background: black",
+ ".foreground: #4444FF",
+ "*points: 200",
+ "*steps: 150",
+ "*delay: 70000",
+ "*figtype: all",
+ "*linewidth: 5",
+ 0
+};
+
+static XrmOptionDescRec lmorph_options [] = {
+ { "-points", ".points", XrmoptionSepArg, 0 },
+ { "-steps", ".steps", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-figtype", ".figtype", XrmoptionSepArg, 0 },
+ { "-linewidth", ".linewidth", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+/*-----------------------------------------------------------------------+
+| PRIVATE FUNCTIONS |
++-----------------------------------------------------------------------*/
+
+static void *
+xmalloc(size_t size)
+{
+ void *ret;
+
+ if ((ret = malloc(size)) == NULL) {
+ fprintf(stderr, "lmorph: out of memory\n");
+ exit(1);
+ }
+ return ret;
+}
+
+static void
+initPointArrays(struct state *st)
+{
+ int q, w;
+ int mx, my; /* max screen coordinates. */
+ int mp; /* max point number. */
+ int s, rx, ry;
+ int marginx, marginy;
+ double scalex, scaley;
+
+ mx = st->scrWidth - 1;
+ my = st->scrHeight - 1;
+ mp = st->numPoints - 1;
+
+ st->aWork[0] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ st->aWork[1] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ st->aTmp = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+
+ if (st->figType & FT_CLOSED) {
+ /* rectangle */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ s = st->numPoints / 4;
+ for (q = 0; q < s; q++) {
+ st->a[st->numFigs][q].x = ((double) q / s) * mx;
+ st->a[st->numFigs][q].y = 0;
+ st->a[st->numFigs][s + q].x = mx;
+ st->a[st->numFigs][s + q].y = ((double) q / s) * my;
+ st->a[st->numFigs][2 * s + q].x = mx - ((double) q / s) * mx;
+ st->a[st->numFigs][2 * s + q].y = my;
+ st->a[st->numFigs][3 * s + q].x = 0;
+ st->a[st->numFigs][3 * s + q].y = my - ((double) q / s) * my;
+ }
+ for (q = 4 * s; q < st->numPoints; q++)
+ st->a[st->numFigs][q].x = st->a[st->numFigs][q].y = 0;
+ st->a[st->numFigs][mp].x = st->a[st->numFigs][0].x;
+ st->a[st->numFigs][mp].y = st->a[st->numFigs][0].y;
+ ++st->numFigs;
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + rx * sin(1 * TWO_PI * (double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp);
+ }
+ st->a[st->numFigs][mp].x = st->a[st->numFigs][0].x;
+ st->a[st->numFigs][mp].y = st->a[st->numFigs][0].y;
+ ++st->numFigs;
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + ry * sin(3 * TWO_PI * (double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 + ry * cos(1 * TWO_PI * (double) q / mp);
+ }
+ st->a[st->numFigs][mp].x = st->a[st->numFigs][0].x;
+ st->a[st->numFigs][mp].y = st->a[st->numFigs][0].y;
+ ++st->numFigs;
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + ry
+ * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp))
+ * sin(TWO_PI * (double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 + ry
+ * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp))
+ * cos(TWO_PI * (double) q / mp);
+ }
+ st->a[st->numFigs][mp].x = st->a[st->numFigs][0].x;
+ st->a[st->numFigs][mp].y = st->a[st->numFigs][0].y;
+ ++st->numFigs;
+
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + ry * sin(TWO_PI * (double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 + ry * cos(TWO_PI * (double) q / mp);
+ }
+ st->a[st->numFigs][mp].x = st->a[st->numFigs][0].x;
+ st->a[st->numFigs][mp].y = st->a[st->numFigs][0].y;
+ ++st->numFigs;
+
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + rx * cos(TWO_PI * (double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 + ry * sin(TWO_PI * (double) q / mp);
+ }
+ st->a[st->numFigs][mp].x = st->a[st->numFigs][0].x;
+ st->a[st->numFigs][mp].y = st->a[st->numFigs][0].y;
+ ++st->numFigs;
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + rx * sin(2 * TWO_PI * (double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp);
+ }
+ st->a[st->numFigs][mp].x = st->a[st->numFigs][0].x;
+ st->a[st->numFigs][mp].y = st->a[st->numFigs][0].y;
+ ++st->numFigs;
+ }
+
+ if (st->figType & FT_OPEN) {
+ /* sine wave, one period */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = ((double) q / st->numPoints) * mx;
+ st->a[st->numFigs][q].y = (1.0 - sin(((double) q / mp) * TWO_PI))
+ * my / 2.0;
+ }
+ ++st->numFigs;
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = ((double) q / mp) * mx;
+ st->a[st->numFigs][q].y = (1.0 - cos(((double) q / mp) * 3 * TWO_PI))
+ * my / 2.0;
+ }
+ ++st->numFigs;
+
+ /* spiral, one endpoint at bottom */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + ry * sin(5 * TWO_PI * (double) q / mp)
+ * ((double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 + ry * cos(5 * TWO_PI * (double) q / mp)
+ * ((double) q / mp);
+ }
+ ++st->numFigs;
+
+ /* spiral, one endpoint at top */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ rx = mx / 2;
+ ry = my / 2;
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = mx / 2 + ry * sin(6 * TWO_PI * (double) q / mp)
+ * ((double) q / mp);
+ st->a[st->numFigs][q].y = my / 2 - ry * cos(6 * TWO_PI * (double) q / mp)
+ * ((double) q / mp);
+ }
+ ++st->numFigs;
+
+ /* */
+ st->a[st->numFigs] = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ for (q = 0; q < st->numPoints; q++) {
+ st->a[st->numFigs][q].x = ((double) q / mp) * mx;
+ st->a[st->numFigs][q].y = (1.0 - sin(((double) q / mp) * 5 * TWO_PI))
+ * my / 2.0;
+ }
+ ++st->numFigs;
+ }
+
+#ifdef MARGINS
+ /* make some space around the figures. */
+ marginx = (mx + 1) / 10;
+ marginy = (my + 1) / 10;
+ scalex = (double) ((mx + 1) - 2.0 * marginx) / (mx + 1.0);
+ scaley = (double) ((my + 1) - 2.0 * marginy) / (my + 1.0);
+ for (q = 0; q < st->numFigs; q++)
+ for (w = 0; w < st->numPoints; w++) {
+ st->a[q][w].x = marginx + st->a[q][w].x * scalex;
+ st->a[q][w].y = marginy + st->a[q][w].y * scaley;
+ }
+#endif
+}
+
+static void
+initLMorph(struct state *st)
+{
+ int steps;
+ XGCValues gcv;
+ XWindowAttributes wa;
+ Colormap cmap;
+ char *ft;
+ int i;
+
+ st->maxGamma = 1.0;
+ st->numPoints = get_integer_resource(st->dpy, "points", "Integer");
+ steps = get_integer_resource(st->dpy, "steps", "Integer");
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ ft = get_string_resource(st->dpy, "figtype", "String");
+
+ if (strcmp(ft, "all") == 0)
+ st->figType = FT_ALL;
+ else if (strcmp(ft, "open") == 0)
+ st->figType = FT_OPEN;
+ else if (strcmp(ft, "closed") == 0)
+ st->figType = FT_CLOSED;
+ else {
+ fprintf(stderr, "figtype should be `all', `open' or `closed'.\n");
+ st->figType = FT_ALL;
+ }
+
+ if (steps <= 0)
+ steps = (random() % 400) + 100;
+
+ st->deltaGamma = 1.0 / steps;
+ XGetWindowAttributes(st->dpy, st->window, &wa);
+ st->scrWidth = wa.width;
+ st->scrHeight = wa.height;
+ cmap = wa.colormap;
+ gcv.foreground = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
+ st->gcDraw = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ XSetForeground(st->dpy, st->gcDraw, gcv.foreground);
+ gcv.foreground = get_pixel_resource(st->dpy, cmap, "background", "Background");
+ st->gcClear = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ XClearWindow(st->dpy, st->window);
+
+ initPointArrays(st);
+ st->aCurr = st->aWork[st->nWork = 0];
+ st->aPrev = NULL;
+ st->currGamma = st->maxGamma + 1.0; /* force creation of new figure at startup */
+ st->nTo = RND(st->numFigs);
+ do {
+ st->nNext = RND(st->numFigs);
+ } while (st->nNext == st->nTo);
+
+ st->aSlopeTo = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ st->aSlopeFrom = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+ st->aNext = (XPoint *) xmalloc(st->numPoints * sizeof(XPoint));
+
+ for (i = 0; i < st->numPoints ; i++) {
+ st->aSlopeTo[i].x = 0.0;
+ st->aSlopeTo[i].y = 0.0;
+ }
+
+ { /* jwz for version 2.11 */
+ /* int width = random() % 10;*/
+ int width = get_integer_resource(st->dpy, "linewidth", "Integer");
+ int style = LineSolid;
+ int cap = (width > 1 ? CapRound : CapButt);
+ int join = (width > 1 ? JoinRound : JoinBevel);
+ if (width == 1)
+ width = 0;
+ XSetLineAttributes(st->dpy, st->gcDraw, width, style, cap, join);
+ XSetLineAttributes(st->dpy, st->gcClear, width, style, cap, join);
+ }
+}
+
+/* 55% of execution time */
+static void
+createPoints(struct state *st)
+{
+ int q;
+ XPoint *pa = st->aCurr, *pa1 = st->aFrom, *pa2 = st->aTo;
+ XPoint *qa1 = st->aSlopeFrom, *qa2 = st->aSlopeTo;
+ float fg, f1g;
+ float speed;
+
+ fg = st->currGamma;
+ f1g = 1.0 - st->currGamma;
+ for (q = st->numPoints; q; q--) {
+ speed = 0.45 * sin(TWO_PI * (double) (q + st->shift) / (st->numPoints - 1));
+ fg = st->currGamma + 1.67 * speed
+ * exp(-200.0 * (st->currGamma - 0.5 + 0.7 * speed)
+ * (st->currGamma - 0.5 + 0.7 * speed));
+
+ f1g = 1.0 - fg;
+ pa->x = (short) (f1g * f1g * f1g * pa1->x + f1g * f1g * fg
+ * (3 * pa1->x + qa1->x) + f1g * fg * fg
+ * (3 * pa2->x - qa2->x) + fg * fg * fg * pa2->x);
+ pa->y = (short) (f1g * f1g * f1g * pa1->y + f1g * f1g * fg
+ * (3 * pa1->y + qa1->y) + f1g * fg * fg
+ * (3 * pa2->y - qa2->y) + fg * fg * fg * pa2->y);
+
+ ++pa;
+ ++pa1;
+ ++pa2;
+ ++qa1;
+ ++qa2;
+ }
+}
+
+/* 36% of execution time */
+static void
+drawImage(struct state *st)
+{
+#if 0
+ int q;
+ XPoint *old0, *old1, *new0, *new1;
+
+ /* Problem: update the window without too much flickering. I do
+ * this by handling each linesegment separately. First remove a
+ * line, then draw the new line. The problem is that this leaves
+ * small black pixels on the figure. To fix this, we draw the
+ * entire figure using XDrawLines() afterwards. */
+ if (st->aPrev) {
+ old0 = st->aPrev;
+ old1 = st->aPrev + 1;
+ new0 = st->aCurr;
+ new1 = st->aCurr + 1;
+ for (q = st->numPoints - 1; q; q--) {
+ XDrawLine(st->dpy, st->window, st->gcClear,
+ old0->x, old0->y, old1->x, old1->y);
+ XDrawLine(st->dpy, st->window, st->gcDraw,
+ new0->x, new0->y, new1->x, new1->y);
+ ++old0;
+ ++old1;
+ ++new0;
+ ++new1;
+ }
+ }
+#else
+ XClearWindow(st->dpy,st->window);
+#endif
+ XDrawLines(st->dpy, st->window, st->gcDraw, st->aCurr, st->numPoints, CoordModeOrigin);
+}
+
+/* neglectible % of execution time */
+static void
+animateLMorph(struct state *st)
+{
+ int i;
+ if (st->currGamma > st->maxGamma) {
+ st->currGamma = 0.0;
+ st->nFrom = st->nTo;
+ st->nTo = st->nNext;
+ st->aFrom = st->a[st->nFrom];
+ st->aTo = st->a[st->nTo];
+ do {
+ st->nNext = RND(st->numFigs);
+ } while (st->nNext == st->nTo);
+ st->aNext = st->a[st->nNext];
+
+ st->shift = RND(st->numPoints);
+ if (RND(2)) {
+ /* reverse the array to get more variation. */
+ int i1, i2;
+ XPoint p;
+
+ for (i1 = 0, i2 = st->numPoints - 1; i1 < st->numPoints / 2; i1++, i2--) {
+ p = st->aNext[i1];
+ st->aNext[i1] = st->aNext[i2];
+ st->aNext[i2] = p;
+ }
+ }
+
+ /* calculate the slopes */
+ for (i = 0; i < st->numPoints ; i++) {
+ st->aSlopeFrom[i].x = st->aSlopeTo[i].x;
+ st->aSlopeFrom[i].y = st->aSlopeTo[i].y;
+ st->aSlopeTo[i].x = st->aNext[i].x - st->aTo[i].x;
+ st->aSlopeTo[i].y = (st->aNext[i].y - st->aTo[i].y);
+ }
+ }
+
+ createPoints(st);
+ drawImage(st);
+ st->aPrev = st->aCurr;
+ st->aCurr = st->aWork[st->nWork ^= 1];
+
+ st->currGamma += st->deltaGamma;
+}
+
+/*-----------------------------------------------------------------------+
+| PUBLIC FUNCTIONS |
++-----------------------------------------------------------------------*/
+
+static void *
+lmorph_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = d;
+ st->window = w;
+ initLMorph(st);
+ return st;
+}
+
+static unsigned long
+lmorph_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ animateLMorph(st);
+ return st->delay;
+}
+
+static void
+lmorph_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+lmorph_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+lmorph_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("LMorph", lmorph)
diff --git a/hacks/lmorph.man b/hacks/lmorph.man
new file mode 100644
index 0000000..be8e19e
--- /dev/null
+++ b/hacks/lmorph.man
@@ -0,0 +1,65 @@
+.TH LMORPH 1 "xscreensaver hack"
+.SH NAME
+lmorph \- morphing lines
+.SH SYNOPSIS
+.B lmorph
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIint\fP] [\-steps \fIint\fP] [\-delay \fIusecs\fP] [\-figtype \fItype\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIlmorph\fP program generates random spline-ish line drawings and
+morphs between them.
+.SH OPTIONS
+.I lmorph
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-points \fIinteger\fP
+Number of points in each line drawing. Default is 200 points.
+.TP 8
+.B \-steps \fIinteger\fP
+Interpolation steps from one drawing to the next. Default is 150. You
+may specify 0, to get a random number between 100 and 500.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 70000.
+.TP 8
+.B \-figtype \fItype\fP
+Limit the figures to only open or closed figures. Possible types are
+"all" (default), "open" and "closed".
+.TP 8
+.B \-linewidth \fIinteger\fP
+Width of lines. Default is 5 pixels.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH AUTHOR
+Sverre H. Huseby <sverrehu@online.no> and Glenn T. Lines <glennli@ifi.uio.no>,
+built on top of the screen saver routines by Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/loop.c b/hacks/loop.c
new file mode 100644
index 0000000..8d9cc95
--- /dev/null
+++ b/hacks/loop.c
@@ -0,0 +1,1694 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* loop --- Chris Langton's self-producing loops */
+
+#if 0
+static const char sccsid[] = "@(#)loop.c 5.01 2000/03/15 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by David Bagley.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 15-Mar-2001: Added some flaws, random blue wall spots, to liven it up.
+ * This mod seems to expose a bug where hexagons are erased
+ * for no apparent reason.
+ * 01-Nov-2000: Allocation checks
+ * 16-Jun-2000: Fully coded the hexagonal rules. (Rules that end up in
+ * state zero were not bothered with since a calloc was used
+ * to set non-explicit rules to zero. This allows the
+ * compile-time option RAND_RULES to work here (at least to
+ * generation 540).)
+ * Also added compile-time option DELAYDEBUGLOOP for debugging
+ * life form. This also turns off the random initial direction
+ * of the loop. Set DELAYDEBUGLOOP to be 10 and use with
+ * something like this:
+ * xlock -mode loop -neighbors 6 -size 5 -delay 1 -count 540 -nolock
+ * 18-Oct-1998: Started creating a hexagon version.
+ * It proved not that difficult because I used Langton's Loop
+ * as a guide, hexagons have more neighbors so there is more
+ * freedom to program, and the loop will has six sides to
+ * store its genes (data).
+ * (Soon after this a triangular version with neighbors = 6
+ * was attempted but was unsuccessful).
+ * 10-May-1997: Compatible with xscreensaver
+ * 15-Nov-1995: Coded from Chris Langton's Self-Reproduction in Cellular
+ * Automata Physica 10D 135-144 1984, also used wire.c as a
+ * guide.
+ */
+
+/*-
+ Grid Number of Neighbors
+ ---- ------------------
+ Square 4
+ Hexagon 6 (currently in development)
+*/
+
+/*-
+ * From Steven Levy's Artificial Life
+ * Chris Langton's cellular automata "loops" reproduce in the spirit of life.
+ * Beginning from a single organism, the loops from a colony. As the loops
+ * on the outer fringes reproduce, the inner loops -- blocked by their
+ * daughters -- can no longer produce offspring. These dead progenitors
+ * provide a base for future generations' expansion, much like the formation
+ * of a coral reef. This self-organizing behavior emerges spontaneously,
+ * from the bottom up -- a key characteristic of artificial life.
+ */
+
+/*-
+ Don't Panic -- When the artificial life tries to leave its petri
+ dish (ie. the screen) it will (usually) die...
+ The loops are short of "real" life because a general purpose Turing
+ machine is not contained in the loop. This is a simplification of
+ von Neumann and Codd's self-producing Turing machine.
+ The data spinning around could be viewed as both its DNA and its internal
+ clock. The program can be initalized to have the loop spin both ways...
+ but only one way around will work for a given rule. An open question (at
+ least to me): Is handedness a requirement for (artificial) life? Here
+ there is handedness at both the initial condition and the transition rule.
+ */
+
+#ifndef HAVE_JWXYZ
+# define DO_STIPPLE
+#endif
+
+#ifdef STANDALONE
+# define MODE_loop
+# define DEFAULTS "*delay: 100000 \n" \
+ "*count: -5 \n" \
+ "*cycles: 1600 \n" \
+ "*size: -12 \n" \
+ "*ncolors: 15 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ ".lowrez: True \n" \
+
+# define reshape_loop 0
+# define loop_handle_event 0
+# define UNIFORM_COLORS
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+#include "automata.h"
+
+#ifdef MODE_loop
+
+/*-
+ * neighbors of 0 randomizes between 4 and 6.
+ */
+#define DEF_NEIGHBORS "0" /* choose random value */
+
+static int neighbors;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-neighbors", ".loop.neighbors", XrmoptionSepArg, 0}
+};
+
+static argtype vars[] =
+{
+ {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
+};
+
+static OptionStruct desc[] =
+{
+ {"-neighbors num", "squares 4 or hexagons 6"}
+};
+
+ENTRYPOINT ModeSpecOpt loop_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+
+#ifdef USE_MODULES
+ModStruct loop_description =
+{"loop", "init_loop", "draw_loop", "release_loop",
+ "refresh_loop", "init_loop", "free_loop", &loop_opts,
+ 100000, 5, 1600, -12, 64, 1.0, "",
+ "Shows Langton's self-producing loops", 0, NULL};
+
+#endif
+
+#define LOOPBITS(n,w,h)\
+ if ((lp->pixmaps[lp->init_bits]=\
+ XCreatePixmapFromBitmapData(MI_DISPLAY(mi),window,(char *)n,w,h,1,0,1))==None){\
+ free_loop(mi); return;} else {lp->init_bits++;}
+
+static int local_neighbors = 0;
+
+#if 0
+/* Used to fast forward to troubled generations, mainly used for debugging.
+ -delay 1 -count 170 -neighbors 6 # divisions starts
+ 540 first cell collision
+ 1111 mutant being born from 2 parents
+ 1156 mutant born
+ */
+#define DELAYDEBUGLOOP 10
+#endif
+
+#define COLORS 8
+#define REALCOLORS (COLORS-2)
+#define MINLOOPS 1
+#define REDRAWSTEP 2000 /* How many cells to draw per cycle */
+#define ADAM_SIZE 8 /* MIN 5 */
+#if 1
+#define ADAM_LOOPX (ADAM_SIZE+2)
+#define ADAM_LOOPY (ADAM_SIZE+2)
+#else
+#define ADAM_LOOPX 16
+#define ADAM_LOOPY 10
+#endif
+#define MINGRIDSIZE (3*ADAM_LOOPX)
+#if 0
+/* TRIA stuff was an attempt to make a triangular lifeform on a
+ hexagonal grid but I got bored. You may need an additional 7th
+ state for a coherent step by step process of cell separation and
+ initial stem development.
+ */
+#define TRIA 1
+#endif
+#ifdef TRIA
+#define HEX_ADAM_SIZE 3 /* MIN 3 */
+#else
+#define HEX_ADAM_SIZE 5 /* MIN 3 */
+#endif
+#if 1
+#define HEX_ADAM_LOOPX (2*HEX_ADAM_SIZE+1)
+#define HEX_ADAM_LOOPY (2*HEX_ADAM_SIZE+1)
+#else
+#define HEX_ADAM_LOOPX 3
+#define HEX_ADAM_LOOPY 7
+#endif
+#define HEX_MINGRIDSIZE (6*HEX_ADAM_LOOPX)
+/* #define MINSIZE ((MI_NPIXELS(mi)>=COLORS)?1:(2+(local_neighbors==6))) */
+#define MINSIZE 5
+#define NEIGHBORKINDS 2
+#define ANGLES 360
+#define MAXNEIGHBORS 6
+
+/* Singly linked list */
+typedef struct _CellList {
+ XPoint pt;
+ struct _CellList *next;
+} CellList;
+
+typedef struct {
+ int init_bits;
+ int generation;
+ int xs, ys;
+ int xb, yb;
+ int nrows, ncols;
+ int bx, by, bnrows, bncols;
+ int mincol, minrow, maxcol, maxrow;
+ int width, height;
+ int redrawing, redrawpos;
+ Bool dead, clockwise;
+ unsigned char *newcells, *oldcells;
+ int ncells[COLORS];
+ CellList *cellList[COLORS];
+ unsigned long colors[COLORS];
+ GC stippledGC;
+ Pixmap pixmaps[COLORS];
+ union {
+ XPoint hexagon[6];
+ } shape;
+} loopstruct;
+
+static loopstruct *loops = (loopstruct *) NULL;
+
+#define TRANSITION(TT,V) V=TT&7;TT>>=3
+#define FINALTRANSITION(TT,V) V=TT&7
+#define TABLE(R,T,L,B) (table[((B)<<9)|((L)<<6)|((T)<<3)|(R)])
+#define HEX_TABLE(R,T,t,l,b,B) (table[((B)<<15)|((b)<<12)|((l)<<9)|((t)<<6)|((T)<<3)|(R)])
+
+#if 0
+/* Instead of setting "unused" state rules to zero it randomizes them.
+ These rules take over when something unexpected happens... like when a
+ cell hits a wall (the end of the screen).
+ */
+#define RAND_RULES
+#endif
+
+#ifdef RAND_RULES
+#define TABLE_IN(C,R,T,L,B,I) (TABLE(R,T,L,B)&=~(7<<((C)*3)));\
+(TABLE(R,T,L,B)|=((I)<<((C)*3)))
+#define HEX_TABLE_IN(C,R,T,t,l,b,B,I) (HEX_TABLE(R,T,t,l,b,B)&=~(7<<((C)*3)));\
+(HEX_TABLE(R,T,t,l,b,B)|=((I)<<((C)*3)))
+#else
+#define TABLE_IN(C,R,T,L,B,I) (TABLE(R,T,L,B)|=((I)<<((C)*3)))
+#define HEX_TABLE_IN(C,R,T,t,l,b,B,I) (HEX_TABLE(R,T,t,l,b,B)|=((I)<<((C)*3)))
+#endif
+#define TABLE_OUT(C,R,T,L,B) ((TABLE(R,T,L,B)>>((C)*3))&7)
+#define HEX_TABLE_OUT(C,R,T,t,l,b,B) ((HEX_TABLE(R,T,t,l,b,B)>>((C)*3))&7)
+
+static unsigned int *table = (unsigned int *) NULL;
+ /* square: 8*8*8*8 = 2^12 = 2^3^4 = 4096 */
+ /* hexagon: 8*8*8*8*8*8 = 2^18 = 2^3^6 = 262144 = too big? */
+
+static char plots[NEIGHBORKINDS] =
+{
+ 4, 6 /* Neighborhoods */
+};
+
+static unsigned int transition_table[] =
+{ /* Octal CBLTR->I */
+ /* CBLTRI CBLTRI CBLTRI CBLTRI CBLTRI */
+ 0000000, 0025271, 0113221, 0202422, 0301021,
+ 0000012, 0100011, 0122244, 0202452, 0301220,
+ 0000020, 0100061, 0122277, 0202520, 0302511,
+ 0000030, 0100077, 0122434, 0202552, 0401120,
+ 0000050, 0100111, 0122547, 0202622, 0401220,
+ 0000063, 0100121, 0123244, 0202722, 0401250,
+ 0000071, 0100211, 0123277, 0203122, 0402120,
+ 0000112, 0100244, 0124255, 0203216, 0402221,
+ 0000122, 0100277, 0124267, 0203226, 0402326,
+ 0000132, 0100511, 0125275, 0203422, 0402520,
+ 0000212, 0101011, 0200012, 0204222, 0403221,
+ 0000220, 0101111, 0200022, 0205122, 0500022,
+ 0000230, 0101244, 0200042, 0205212, 0500215,
+ 0000262, 0101277, 0200071, 0205222, 0500225,
+ 0000272, 0102026, 0200122, 0205521, 0500232,
+ 0000320, 0102121, 0200152, 0205725, 0500272,
+ 0000525, 0102211, 0200212, 0206222, 0500520,
+ 0000622, 0102244, 0200222, 0206722, 0502022,
+ 0000722, 0102263, 0200232, 0207122, 0502122,
+ 0001022, 0102277, 0200242, 0207222, 0502152,
+ 0001120, 0102327, 0200250, 0207422, 0502220,
+ 0002020, 0102424, 0200262, 0207722, 0502244,
+ 0002030, 0102626, 0200272, 0211222, 0502722,
+ 0002050, 0102644, 0200326, 0211261, 0512122,
+ 0002125, 0102677, 0200423, 0212222, 0512220,
+ 0002220, 0102710, 0200517, 0212242, 0512422,
+ 0002322, 0102727, 0200522, 0212262, 0512722,
+ 0005222, 0105427, 0200575, 0212272, 0600011,
+ 0012321, 0111121, 0200722, 0214222, 0600021,
+ 0012421, 0111221, 0201022, 0215222, 0602120,
+ 0012525, 0111244, 0201122, 0216222, 0612125,
+ 0012621, 0111251, 0201222, 0217222, 0612131,
+ 0012721, 0111261, 0201422, 0222272, 0612225,
+ 0012751, 0111277, 0201722, 0222442, 0700077,
+ 0014221, 0111522, 0202022, 0222462, 0701120,
+ 0014321, 0112121, 0202032, 0222762, 0701220,
+ 0014421, 0112221, 0202052, 0222772, 0701250,
+ 0014721, 0112244, 0202073, 0300013, 0702120,
+ 0016251, 0112251, 0202122, 0300022, 0702221,
+ 0017221, 0112277, 0202152, 0300041, 0702251,
+ 0017255, 0112321, 0202212, 0300076, 0702321,
+ 0017521, 0112424, 0202222, 0300123, 0702525,
+ 0017621, 0112621, 0202272, 0300421, 0702720,
+ 0017721, 0112727, 0202321, 0300622
+};
+
+static unsigned int hex_transition_table[] =
+{ /* Octal CBbltTR->I */
+ /* CBbltTRI CBbltTRI CBbltTRI CBbltTRI CBbltTRI */
+
+#ifdef TRIA
+ 000000000, 000000020, 000000220, 000002220, 000022220,
+ 011122121, 011121221, 011122221, 011221221,
+ 011222221, 011112121, 011112221,
+ 020021122, 020002122, 020211222, 021111222,
+ 020221122, 020027122, 020020722, 020021022,
+ 001127221,
+ 011122727, 011227227, 010122121, 010222211,
+ 021117222, 020112272,
+ 070221220,
+ 001227221,
+ 010221121, 011721221, 011222277,
+ 020111222, 020221172,
+ 070211220,
+ 001217221,
+ 010212277, 010221221,
+ 020122112,
+ 070122220,
+ 001722221,
+ 010221271,
+ 020002022, 021122172,
+ 070121220,
+ 011122277, 011172121,
+ 010212177, 011212277,
+ 070112220,
+ 001772221,
+ 021221772,
+ 070121270, 070721220,
+ 000112721, 000272211,
+ 010022211, 012222277,
+ 020072272, 020227122, 020217222,
+ 010211121,
+ 020002727,
+ 070222220,
+ 001727721,
+ 020021072, 020070722,
+ 070002072, 070007022,
+ 001772721,
+ 070002022,
+ 000000070, 000000770, 000072220, 000000270,
+ 020110222, 020220272, 020220722,
+ 070007071, 070002072, 070007022,
+ 000000012, 000000122, 000000212, 001277721,
+ 020122072, 020202212,
+ 010002121,
+ 020001122, 020002112,
+ 020021722,
+ 020122022, 020027022, 020070122, 020020122,
+ 010227027,
+ 020101222,
+ 010227227, 010227277,
+ 021722172,
+ 001727221,
+ 010222277,
+ 020702272,
+ 070122020,
+ 000172721,
+ 010022277, 010202177, 010227127,
+
+ 001214221,
+ 010202244,
+ 020024122, 020020422,
+ 040122220,
+ 001422221,
+ 010221241, 010224224,
+ 021122142,
+ 040121220,
+ 001124221,
+ 010224274,
+ 020112242, 021422172,
+ 040221220,
+ 001224221, 001427221,
+ 010222244,
+ 020227042,
+ 040122020,
+ 000142721,
+ 010022244, 010202144, 010224124,
+ 040112220,
+ 001442221,
+ 021221442,
+ 040121240, 040421220,
+ 000242211, 000112421,
+ 020042242, 020214222, 020021422, 020220242, 020024022,
+ 011224224,
+ 020224122,
+ 020220422,
+ 012222244,
+ 020002424,
+ 040222220,
+ 001244421, 000000420, 000000440, 000000240, 000000040,
+ 020040121, 020021042,
+ 040004022, 040004042, 040002042,
+ 010021121,
+ 020011122, 020002112,
+ 001424421,
+ 020040422,
+ 001442421,
+ 040002022,
+ 001724221,
+ 010227247,
+ 020224072, 021417222,
+ 000172421,
+ 010021721,
+ 020017022,
+ 020120212,
+ 020271727,
+ 070207072, 070701220,
+ 000001222,
+ 020110122,
+ 001277221,
+ 001777721,
+ 020021222, 020202272, 020120222, 020221722,
+ 020027227,
+ 070070222,
+ 000007220,
+ 020101272, 020272172, 020721422, 020721722,
+ 020011222, 020202242,
+#if 0
+ {2,2,0,0,2,7,0},
+ {2,0,2,0,2,0,2},
+ {2,4,1,2,2,1,2},
+ {2,1,2,1,2,1,2},
+ {2,0,2,2,1,1,2},
+ {2,7,1,1,1,1,2},
+ {0,2,2,2,2,2,2},
+ {2,2,0,0,7,7,0},
+ {2,1,2,0,2,0,7},
+ {2,0,1,2,2,1,2},
+ {2,4,2,1,2,1,2},
+ {2,1,2,2,1,1,2},
+ {2,0,7,1,1,1,2},
+ {0,2,2,2,2,2,2},
+#endif
+#else
+ 000000000, 000000020, 000000220, 000002220,
+ 011212121, 011212221, 011221221, 011222221,
+ 020002122, 020021122, 020211122,
+
+ 010221221, 010222121,
+ 020002022, 020021022, 020020122, 020112022,
+
+ 010202121,
+ 020102022, 020202112,
+
+ 000000012, 000000122, 000000212,
+ 010002121,
+ 020001122, 020002112, 020011122,
+
+
+ 001227221, 001272221, 001272721,
+ 012212277, 011222727, 011212727,
+ 020021722, 020027122, 020020722, 020027022,
+ 020211722, 020202172, 020120272,
+ 020271122, 020202172, 020207122, 020217122,
+ 020120272, 020210722, 020270722,
+ 070212220, 070221220, 070212120,
+
+
+ 012222277,
+ 020002727,
+ 070222220,
+
+ 001277721, 000000070, 000000270, 000000720, 000000770,
+ 020070122, 020021072,
+ 070002072, 070007022, 070007071,
+
+ 020070722,
+ 070002022,
+
+ 010227227, 010222727, 010202727,
+ 020172022, 020202712,
+
+ 001224221, 001242221, 001242421,
+ 012212244, 011222424, 011212424,
+ 020021422, 020024122, 020020422, 020024022,
+ 020211422, 020202142, 020120242,
+ 020241122, 020202142, 020204122, 020214122,
+ 020120242, 020210422, 020240422,
+ 040212220, 040221220, 040212120,
+
+
+ 012222244,
+ 020002424,
+ 040222220,
+
+ 001244421, 000000040, 000000240, 000000420, 000000440,
+ 020040122, 020021042,
+ 040002042,
+ 040004021, 040004042,
+
+ 020040422,
+ 040002022,
+
+ 010224224, 010222424, 010202424,
+ 020142022, 020202412,
+ 020011722, 020112072, 020172072, 020142072,
+
+
+
+ 000210225, 000022015, 000022522,
+ 011225521,
+ 020120525, 020020152, 020005122, 020214255, 020021152,
+ 020255242,
+ 050215222, 050225121,
+
+ 000225220, 001254222,
+ 010221250, 011221251, 011225221,
+ 020025122, 020152152, 020211252, 020214522, 020511125,
+ 050212241, 05221120,
+ 040521225,
+
+ 000000250, 000000520, 000150220, 000220520, 000222210,
+ 001224251,
+ 010022152, 010251221, 010522121, 011212151, 011221251,
+ 011215221,
+ 020000220, 020002152, 020020220, 020022152,
+ 020021422, 020022152, 020022522, 020025425, 020050422,
+ 020051022, 020051122, 020211122, 020211222, 020215222,
+ 020245122,
+ 050021125, 050021025, 050011125, 051242221,
+ 041225220,
+
+ 000220250, 000220520, 001227521, 001275221,
+ 011257227, 011522727,
+ 020002052, 020002752, 020021052, 020057125,
+ 050020722, 050027125,
+ 070215220,
+
+ 070212255,
+ 071225220,
+ 020275122,
+ 051272521,
+ 020055725,
+ 020021552,
+ 012252277,
+ 050002521,
+ 020005725,
+
+ 050011022,
+ 000000155,
+ 020050722,
+ 001227250,
+ 010512727,
+ 010002151,
+ 020027112,
+ 001227251,
+ 012227257,
+ 050002125,
+ 020517122,
+ 050002025,
+ 020050102,
+ 050002725,
+ 020570722,
+ 001252721,
+ 020007051,
+ 020102052,
+ 020271072,
+ 050001122,
+ 010002151,
+ 011227257,
+ 020051722,
+ 020057022,
+ 020050122,
+
+
+ 020051422,
+ 011224254,
+ 012224254,
+
+ 020054022,
+ 050002425,
+ 040252220,
+ 020002454,
+
+
+ 000000540,
+ 001254425,
+ 050004024,
+ 040004051,
+
+ 000000142,
+ 040001522,
+ 010002547,
+ 020045122,
+ 051221240,
+ 020002512,
+ 020021522,
+
+
+ 020020022,
+ 021125522,
+ 020521122,
+ 020025022,
+ 020025522,
+ 020020522,
+
+ 020202222,
+ 020212222,
+ 021212222,
+ 021222722,
+ 021222422,
+ 020002222,
+ 020021222,
+ 020022122,
+ 020212122,
+ 020027222,
+ 020024222,
+ 020212722,
+ 020212422,
+ 020202122,
+ 001222221,
+ 020002522,
+
+ 020017125,
+ 010022722,
+ 020212052,
+
+ 020205052,
+ 070221250,
+
+ 000000050, 000005220, 000002270, 070252220,
+ 000000450, 000007220,
+ 000220220, 000202220, 000022020, 000020220,
+
+ 000222040,
+ 000220440,
+ 000022040,
+ 000040220,
+
+ 000252220,
+ 050221120, 010221520,
+ 002222220,
+
+ 000070220, 000220720,
+ 000020520, 000070250, 000222070, 000027020,
+ 000022070, 000202270, 000024020, 000220420,
+ 000220270, 000220240, 000072020, 000042020,
+ 000002020, 000002070, 000020270, 000020250,
+ 000270270, 000007020, 000040270,
+
+ /* Collision starts (gen 540), not sure to have rules to save it
+ or depend on calloc to intialize remaining rules to 0 so that
+ the mutant will be born
+ */
+ 000050220,
+#endif
+};
+
+
+/*-
+Neighborhoods are read as follows (rotations are not listed):
+ T
+ L C R ==> I
+ B
+
+ t T
+ l C R ==> I
+ b B
+ */
+
+static unsigned char self_reproducing_loop[ADAM_LOOPY][ADAM_LOOPX] =
+{
+/* 10x10 */
+ {0, 2, 2, 2, 2, 2, 2, 2, 2, 0},
+ {2, 4, 0, 1, 4, 0, 1, 1, 1, 2},
+ {2, 1, 2, 2, 2, 2, 2, 2, 1, 2},
+ {2, 0, 2, 0, 0, 0, 0, 2, 1, 2},
+ {2, 7, 2, 0, 0, 0, 0, 2, 7, 2},
+ {2, 1, 2, 0, 0, 0, 0, 2, 0, 2},
+ {2, 0, 2, 0, 0, 0, 0, 2, 1, 2},
+ {2, 7, 2, 2, 2, 2, 2, 2, 7, 2},
+ {2, 1, 0, 6, 1, 0, 7, 1, 0, 2},
+ {0, 2, 2, 2, 2, 2, 2, 2, 2, 0}
+};
+
+static unsigned char hex_self_reproducing_loop[HEX_ADAM_LOOPY][HEX_ADAM_LOOPX] =
+{
+#if 0
+/* Experimental TRIA5:7x7 */
+ {2,2,0,0,0,0,0},
+ {2,1,2,0,2,2,0},
+ {2,0,4,2,2,0,2},
+ {2,7,2,0,2,0,2},
+ {2,1,2,2,1,1,2},
+ {2,0,7,1,0,7,2},
+ {0,2,2,2,2,2,2},
+ /* Stem cells, only "5" will fully reproduce itself */
+/* 3:12x7 */
+ {2,2,2,2,0,0,0,0,0,0,0,0},
+ {2,1,1,1,2,0,0,0,0,0,0,0},
+ {2,1,2,2,1,2,2,2,2,2,2,0},
+ {2,1,2,0,2,7,1,1,1,1,1,2},
+ {0,2,1,2,2,0,2,2,2,2,2,2},
+ {0,0,2,0,4,1,2,0,0,0,0,0},
+ {0,0,0,2,2,2,2,0,0,0,0,0}
+/* 4:14x9 */
+ {2,2,2,2,2,0,0,0,0,0,0,0,0,0},
+ {2,1,1,1,1,2,0,0,0,0,0,0,0,0},
+ {2,1,2,2,2,1,2,0,0,0,0,0,0,0},
+ {2,1,2,0,0,2,1,2,2,2,2,2,2,0},
+ {2,1,2,0,0,0,2,7,1,1,1,1,1,2},
+ {0,2,1,2,0,0,2,0,2,2,2,2,2,2},
+ {0,0,2,0,2,2,2,1,2,0,0,0,0,0},
+ {0,0,0,2,4,1,0,7,2,0,0,0,0,0},
+ {0,0,0,0,2,2,2,2,2,0,0,0,0,0}
+/* 5:16x11 */
+ {2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0},
+ {2,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0},
+ {2,1,2,2,2,2,1,2,0,0,0,0,0,0,0,0},
+ {2,1,2,0,0,0,2,1,2,0,0,0,0,0,0,0},
+ {2,1,2,0,0,0,0,2,1,2,2,2,2,2,2,0},
+ {2,1,2,0,0,0,0,0,2,7,1,1,1,1,1,2},
+ {0,2,1,2,0,0,0,0,2,0,2,2,2,2,2,2},
+ {0,0,2,0,2,0,0,0,2,1,2,0,0,0,0,0},
+ {0,0,0,2,4,2,2,2,2,7,2,0,0,0,0,0},
+ {0,0,0,0,2,1,0,7,1,0,2,0,0,0,0,0},
+ {0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0}
+/* test:3x7 (0,4) is blank ... very strange.
+ init_adam seems ok something after that I guess */
+ {2,2,0},
+ {2,0,2},
+ {0,2,2},
+ {0,0,0},
+ {2,2,0},
+ {2,1,2},
+ {0,2,2},
+#else /* this might be better for hexagons, spacewise efficient... */
+#ifdef TRIA
+/* Experimental TRIA5:7x7 */
+ {2,2,0,0,2,2,0},
+ {2,4,2,0,2,7,2},
+ {2,1,0,2,2,0,2},
+ {2,0,2,1,2,1,2},
+ {2,7,2,2,7,7,2},
+ {2,1,0,7,1,0,2},
+ {0,2,2,2,2,2,2},
+#else
+/* 5:11x11 */
+ {2,2,2,2,2,2,0,0,0,0,0},
+ {2,1,1,7,0,1,2,0,0,0,0},
+ {2,1,2,2,2,2,7,2,0,0,0},
+ {2,1,2,0,0,0,2,0,2,0,0},
+ {2,1,2,0,0,0,0,2,1,2,0},
+ {2,1,2,0,0,0,0,0,2,7,2},
+ {0,2,1,2,0,0,0,0,2,0,2},
+ {0,0,2,1,2,0,0,0,2,1,2},
+ {0,0,0,2,1,2,2,2,2,4,2},
+ {0,0,0,0,2,1,1,1,1,5,2},
+ {0,0,0,0,0,2,2,2,2,2,2}
+#endif
+#endif
+};
+
+static void
+position_of_neighbor(int dir, int *pcol, int *prow)
+{
+ int col = *pcol, row = *prow;
+
+ /* NO WRAPING */
+
+ if (local_neighbors == 6) {
+ switch (dir) {
+ case 0:
+ col++;
+ break;
+ case 60:
+ col += (row & 1);
+ row--;
+ break;
+ case 120:
+ col -= !(row & 1);
+ row--;
+ break;
+ case 180:
+ col--;
+ break;
+ case 240:
+ col -= !(row & 1);
+ row++;
+ break;
+ case 300:
+ col += (row & 1);
+ row++;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ } else {
+ switch (dir) {
+ case 0:
+ col++;
+ break;
+ case 90:
+ row--;
+ break;
+ case 180:
+ col--;
+ break;
+ case 270:
+ row++;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ }
+ *pcol = col;
+ *prow = row;
+}
+
+static Bool
+withinBounds(loopstruct * lp, int col, int row)
+{
+ return (row >= 1 && row < lp->bnrows - 1 &&
+ col >= 1 && col < lp->bncols - 1 - (local_neighbors == 6 && (row % 2)));
+}
+
+static void
+fillcell(ModeInfo * mi, GC gc, int col, int row)
+{
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+
+ if (local_neighbors == 6) {
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+ lp->shape.hexagon[0].x = lp->xb + ccol * lp->xs;
+ lp->shape.hexagon[0].y = lp->yb + crow * lp->ys;
+ if (lp->xs == 1 && lp->ys == 1)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ lp->shape.hexagon[0].x, lp->shape.hexagon[0].y);
+ else
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ lp->shape.hexagon, 6, Convex, CoordModePrevious);
+ } else {
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ lp->xb + lp->xs * col, lp->yb + lp->ys * row,
+ lp->xs - (lp->xs > 3), lp->ys - (lp->ys > 3));
+ }
+}
+
+static void
+drawcell(ModeInfo * mi, int col, int row, int state)
+{
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+ XGCValues gcv;
+ GC gc;
+
+ if (MI_NPIXELS(mi) >= COLORS) {
+ gc = MI_GC(mi);
+ XSetForeground(MI_DISPLAY(mi), gc, lp->colors[state]);
+ } else {
+#ifdef DO_STIPPLE
+ gcv.stipple = lp->pixmaps[state];
+#endif /* DO_STIPPLE */
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ XChangeGC(MI_DISPLAY(mi), lp->stippledGC,
+#ifdef DO_STIPPLE
+ GCStipple |
+#endif /* DO_STIPPLE */
+ GCForeground | GCBackground, &gcv);
+ gc = lp->stippledGC;
+ }
+ fillcell(mi, gc, col, row);
+}
+
+#ifdef DEBUG
+static void
+print_state(ModeInfo * mi, int state)
+{
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+ CellList *locallist = lp->cellList[state];
+ int i = 0;
+
+ (void) printf("state %d\n", state);
+ while (locallist) {
+ (void) printf("%d x %d, y %d\n", i,
+ locallist->pt.x, locallist->pt.y);
+ locallist = locallist->next;
+ i++;
+ }
+}
+
+#endif
+
+static void
+free_state(loopstruct * lp, int state)
+{
+ CellList *current;
+
+ while (lp->cellList[state]) {
+ current = lp->cellList[state];
+ lp->cellList[state] = lp->cellList[state]->next;
+ (void) free((void *) current);
+ }
+ lp->ncells[state] = 0;
+}
+
+static void
+free_list(loopstruct * lp)
+{
+ int state;
+
+ for (state = 0; state < COLORS; state++)
+ free_state(lp, state);
+}
+
+ENTRYPOINT void
+free_loop(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+ int shade;
+
+ for (shade = 0; shade < lp->init_bits; shade++)
+ if (lp->pixmaps[shade] != None) {
+ XFreePixmap(display, lp->pixmaps[shade]);
+ lp->pixmaps[shade] = None;
+ }
+ if (lp->stippledGC != None) {
+ XFreeGC(display, lp->stippledGC);
+ lp->stippledGC = None;
+ }
+ if (lp->oldcells != NULL) {
+ (void) free((void *) lp->oldcells);
+ lp->oldcells = (unsigned char *) NULL;
+ }
+ if (lp->newcells != NULL) {
+ (void) free((void *) lp->newcells);
+ lp->newcells = (unsigned char *) NULL;
+ }
+ free_list(lp);
+}
+
+static Bool
+addtolist(ModeInfo * mi, int col, int row, unsigned char state)
+{
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+ CellList *current = lp->cellList[state];
+
+ if ((lp->cellList[state] = (CellList *) malloc(sizeof (CellList))) ==
+ NULL) {
+ lp->cellList[state] = current;
+ free_loop(mi);
+ return False;
+ }
+ lp->cellList[state]->pt.x = col;
+ lp->cellList[state]->pt.y = row;
+ lp->cellList[state]->next = current;
+ lp->ncells[state]++;
+ return True;
+}
+
+static Bool
+draw_state(ModeInfo * mi, int state)
+{
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ GC gc;
+ XGCValues gcv;
+ CellList *current = lp->cellList[state];
+
+ if (MI_NPIXELS(mi) >= COLORS) {
+ gc = MI_GC(mi);
+ XSetForeground(display, gc, lp->colors[state]);
+ } else {
+#ifdef DO_STIPPLE
+ gcv.stipple = lp->pixmaps[state];
+#endif /* DO_STIPPLE */
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ XChangeGC(display, lp->stippledGC,
+#ifdef DO_STIPPLE
+ GCStipple |
+#endif /* DO_STIPPLE */
+ GCForeground | GCBackground, &gcv);
+ gc = lp->stippledGC;
+ }
+
+ if (local_neighbors == 6) { /* Draw right away, slow */
+ while (current) {
+ int col, row, ccol, crow;
+
+ col = current->pt.x;
+ row = current->pt.y;
+ ccol = 2 * col + !(row & 1), crow = 2 * row;
+ lp->shape.hexagon[0].x = lp->xb + ccol * lp->xs;
+ lp->shape.hexagon[0].y = lp->yb + crow * lp->ys;
+ if (lp->xs == 1 && lp->ys == 1)
+ XDrawPoint(display, MI_WINDOW(mi), gc,
+ lp->shape.hexagon[0].x, lp->shape.hexagon[0].y);
+ else
+ XFillPolygon(display, MI_WINDOW(mi), gc,
+ lp->shape.hexagon, 6, Convex, CoordModePrevious);
+ current = current->next;
+ }
+ } else {
+ /* Take advantage of XFillRectangles */
+ XRectangle *rects;
+ int nrects = 0;
+
+ /* Create Rectangle list from part of the cellList */
+ if ((rects = (XRectangle *) malloc(lp->ncells[state] *
+ sizeof (XRectangle))) == NULL) {
+ return False;
+ }
+
+ while (current) {
+ rects[nrects].x = lp->xb + current->pt.x * lp->xs;
+ rects[nrects].y = lp->yb + current->pt.y * lp->ys;
+ rects[nrects].width = lp->xs - (lp->xs > 3);
+ rects[nrects].height = lp->ys - (lp->ys > 3);
+ current = current->next;
+ nrects++;
+ }
+ /* Finally get to draw */
+ XFillRectangles(display, MI_WINDOW(mi), gc, rects, nrects);
+ /* Free up rects list and the appropriate part of the cellList */
+ (void) free((void *) rects);
+ }
+ free_state(lp, state);
+ return True;
+}
+
+static Bool
+init_table(void)
+{
+ if (table == NULL) {
+ int mult = 1;
+ unsigned int tt, c, n[MAXNEIGHBORS], i;
+ int j, k;
+ int size_transition_table = sizeof (transition_table) /
+ sizeof (unsigned int);
+ int size_hex_transition_table = sizeof (hex_transition_table) /
+ sizeof (unsigned int);
+
+ for (j = 0; j < local_neighbors; j++)
+ mult *= 8;
+
+ if ((table = (unsigned int *) calloc(mult, sizeof (unsigned int))) == NULL) {
+ return False;
+ }
+
+
+#ifdef RAND_RULES
+ /* Here I was interested to see what happens when it hits a wall....
+ Rules not normally used take over... takes too much time though */
+ /* Each state = 3 bits */
+ if (MAXRAND < 16777216.0) {
+ for (j = 0; j < mult; j++) {
+ table[j] = (unsigned int) ((NRAND(4096) << 12) & NRAND(4096));
+ }
+ } else {
+ for (j = 0; j < mult; j++) {
+ table[j] = (unsigned int) (NRAND(16777216));
+ }
+ }
+#endif
+ if (local_neighbors == 6) {
+ for (j = 0; j < size_hex_transition_table; j++) {
+ tt = hex_transition_table[j];
+ TRANSITION(tt, i);
+ for (k = 0; k < local_neighbors; k++) {
+ TRANSITION(tt, n[k]);
+ }
+ FINALTRANSITION(tt, c);
+ HEX_TABLE_IN(c, n[0], n[1], n[2], n[3], n[4], n[5], i);
+ HEX_TABLE_IN(c, n[1], n[2], n[3], n[4], n[5], n[0], i);
+ HEX_TABLE_IN(c, n[2], n[3], n[4], n[5], n[0], n[1], i);
+ HEX_TABLE_IN(c, n[3], n[4], n[5], n[0], n[1], n[2], i);
+ HEX_TABLE_IN(c, n[4], n[5], n[0], n[1], n[2], n[3], i);
+ HEX_TABLE_IN(c, n[5], n[0], n[1], n[2], n[3], n[4], i);
+ }
+ } else {
+ for (j = 0; j < size_transition_table; j++) {
+ tt = transition_table[j];
+ TRANSITION(tt, i);
+ for (k = 0; k < local_neighbors; k++) {
+ TRANSITION(tt, n[k]);
+ }
+ FINALTRANSITION(tt, c);
+ TABLE_IN(c, n[0], n[1], n[2], n[3], i);
+ TABLE_IN(c, n[1], n[2], n[3], n[0], i);
+ TABLE_IN(c, n[2], n[3], n[0], n[1], i);
+ TABLE_IN(c, n[3], n[0], n[1], n[2], i);
+ }
+ }
+ }
+ return True;
+}
+
+static void
+init_flaw(ModeInfo * mi)
+{
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+ int a, b;
+
+#define BLUE 2
+ if (lp->bncols <= 3 || lp->bnrows <= 3)
+ return;
+ a = MIN(lp->bncols - 3, 2 * ((local_neighbors == 6) ?
+ HEX_MINGRIDSIZE : MINGRIDSIZE));
+ a = NRAND(a) + (lp->bncols - a) / 2;
+ b = MIN(lp->bnrows - 3, 2 * ((local_neighbors == 6) ?
+ HEX_MINGRIDSIZE : MINGRIDSIZE));
+ b = NRAND(b) + (lp->bnrows - b) / 2;
+ if (lp->mincol > a)
+ lp->mincol = a;
+ if (lp->minrow > b)
+ lp->minrow = b;
+ if (lp->maxcol < a + 2)
+ lp->maxcol = a + 2;
+ if (lp->maxrow < b + 2)
+ lp->maxrow = b + 2;
+
+ if (local_neighbors == 6) {
+ lp->newcells[b * lp->bncols + a + !(b % 2) ] = BLUE;
+ lp->newcells[b * lp->bncols + a + 1 + !(b % 2)] = BLUE;
+ lp->newcells[(b + 1) * lp->bncols + a] = BLUE;
+ lp->newcells[(b + 1) * lp->bncols + a + 2] = BLUE;
+ lp->newcells[(b + 2) * lp->bncols + a + !(b % 2)] = BLUE;
+ lp->newcells[(b + 2) * lp->bncols + a + 1 + !(b % 2)] = BLUE;
+ } else {
+ int orient = NRAND(4);
+ lp->newcells[lp->bncols * (b + 1) + a + 1] = BLUE;
+ if (orient == 0 || orient == 1) {
+ lp->newcells[lp->bncols * b + a + 1] = BLUE;
+ }
+ if (orient == 1 || orient == 2) {
+ lp->newcells[lp->bncols * (b + 1) + a + 2] = BLUE;
+ }
+ if (orient == 2 || orient == 3) {
+ lp->newcells[lp->bncols * (b + 2) + a + 1] = BLUE;
+ }
+ if (orient == 3 || orient == 0) {
+ lp->newcells[lp->bncols * (b + 1) + a] = BLUE;
+ }
+ }
+}
+
+static void
+init_adam(ModeInfo * mi)
+{
+ loopstruct *lp = &loops[MI_SCREEN(mi)];
+ XPoint start = { 0, 0 }, dirx = { 0, 0 }, diry = { 0, 0 };
+ int i, j, dir;
+
+#ifdef DELAYDEBUGLOOP
+ lp->clockwise = 0;
+ if (!MI_COUNT(mi)) /* Probably doing testing so do not confuse */
+#endif
+ lp->clockwise = (Bool) (LRAND() & 1);
+#ifdef DELAYDEBUGLOOP
+ dir = 0;
+ if (!MI_COUNT(mi)) /* Probably doing testing so do not confuse */
+#endif
+ dir = NRAND(local_neighbors);
+ if (local_neighbors == 6) {
+ int k;
+
+ switch (dir) {
+ case 0:
+ start.x = (lp->bncols - HEX_ADAM_LOOPX / 2) / 2;
+ start.y = (lp->bnrows - HEX_ADAM_LOOPY) / 2;
+ if (lp->mincol > start.x - 2)
+ lp->mincol = start.x - 2;
+ if (lp->minrow > start.y - 1)
+ lp->minrow = start.y - 1;
+ if (lp->maxcol < start.x + HEX_ADAM_LOOPX + 1)
+ lp->maxcol = start.x + HEX_ADAM_LOOPX + 1;
+ if (lp->maxrow < start.y + HEX_ADAM_LOOPY + 1)
+ lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+ for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+ for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+ k = (((lp->bnrows / 2 + HEX_ADAM_LOOPY / 2) % 2) ? -j / 2 : -(j + 1) / 2);
+ lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+ (lp->clockwise) ?
+ hex_self_reproducing_loop[i][j] :
+ hex_self_reproducing_loop[j][i];
+ }
+ }
+ break;
+ case 1:
+ start.x = (lp->bncols - (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) / 2;
+ start.y = (lp->bnrows - HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2;
+ if (lp->mincol > start.x - 1)
+ lp->mincol = start.x - 1;
+ if (lp->minrow > start.y - HEX_ADAM_LOOPX)
+ lp->minrow = start.y - HEX_ADAM_LOOPX;
+ if (lp->maxcol < start.x + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2 + 1)
+ lp->maxcol = start.x + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2 + 1;
+ if (lp->maxrow < start.y + HEX_ADAM_LOOPY + 1)
+ lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+ for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+ for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+ k = (((lp->bnrows / 2 + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) % 2)
+ ? -(i + j + 1) / 2 : -(i + j) / 2);
+ lp->newcells[(start.y + j - i) * lp->bncols + start.x + i + j + k] =
+ (lp->clockwise) ?
+ hex_self_reproducing_loop[i][j] :
+ hex_self_reproducing_loop[j][i];
+ }
+ }
+ break;
+ case 2:
+ start.x = (lp->bncols - HEX_ADAM_LOOPY / 2) / 2;
+ start.y = (lp->bnrows - HEX_ADAM_LOOPX) / 2;
+ if (lp->mincol > start.x - 2)
+ lp->mincol = start.x - 2;
+ if (lp->minrow > start.y - 1)
+ lp->minrow = start.y - 1;
+ if (lp->maxcol < start.x + HEX_ADAM_LOOPX + 1)
+ lp->maxcol = start.x + HEX_ADAM_LOOPX + 1;
+ if (lp->maxrow < start.y + HEX_ADAM_LOOPY + 1)
+ lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+ for (j = 0; j < HEX_ADAM_LOOPX; j++) {
+ for (i = 0; i < HEX_ADAM_LOOPY; i++) {
+ k = (((lp->bnrows / 2 + HEX_ADAM_LOOPX / 2) % 2) ? -(HEX_ADAM_LOOPX - j - 1) / 2 : -(HEX_ADAM_LOOPX - j) / 2);
+ lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+ (lp->clockwise) ?
+ hex_self_reproducing_loop[j][HEX_ADAM_LOOPX - i - 1] :
+ hex_self_reproducing_loop[i][HEX_ADAM_LOOPY - j - 1];
+ }
+ }
+ break;
+ case 3:
+ start.x = (lp->bncols - HEX_ADAM_LOOPX / 2) / 2;
+ start.y = (lp->bnrows - HEX_ADAM_LOOPY) / 2;
+ if (lp->mincol > start.x - 1)
+ lp->mincol = start.x - 1;
+ if (lp->minrow > start.y - 1)
+ lp->minrow = start.y - 1;
+ if (lp->maxcol < start.x + HEX_ADAM_LOOPX + 1)
+ lp->maxcol = start.x + HEX_ADAM_LOOPX + 1;
+ if (lp->maxrow < start.y + HEX_ADAM_LOOPY + 1)
+ lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+ for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+ for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+ k = (((lp->bnrows / 2 + HEX_ADAM_LOOPY / 2) % 2) ? -j / 2 : -(j + 1) / 2);
+ lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+ (lp->clockwise) ?
+ hex_self_reproducing_loop[HEX_ADAM_LOOPX - i - 1][HEX_ADAM_LOOPY - j - 1] :
+ hex_self_reproducing_loop[HEX_ADAM_LOOPY - j - 1][HEX_ADAM_LOOPX - i - 1];
+ }
+ }
+ break;
+ case 4:
+ start.x = (lp->bncols - (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) / 2;
+ start.y = (lp->bnrows - HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2;
+ if (lp->mincol > start.x - 1)
+ lp->mincol = start.x - 1;
+ if (lp->minrow > start.y - HEX_ADAM_LOOPX)
+ lp->minrow = start.y - HEX_ADAM_LOOPX;
+ if (lp->maxcol < start.x + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2 + 1)
+ lp->maxcol = start.x + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2 + 1;
+ if (lp->maxrow < start.y + HEX_ADAM_LOOPY + 1)
+ lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+ for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+ for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+ k = (((lp->bnrows / 2 + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) % 2)
+ ? -(i + j + 1) / 2 : -(i + j) / 2);
+ lp->newcells[(start.y + j - i) * lp->bncols + start.x + i + j + k] =
+ (lp->clockwise) ?
+ hex_self_reproducing_loop[HEX_ADAM_LOOPX - i - 1][HEX_ADAM_LOOPY - j - 1] :
+ hex_self_reproducing_loop[HEX_ADAM_LOOPY - j - 1][HEX_ADAM_LOOPX - i - 1];
+ }
+ }
+ break;
+ case 5:
+ start.x = (lp->bncols - HEX_ADAM_LOOPY / 2) / 2;
+ start.y = (lp->bnrows - HEX_ADAM_LOOPX) / 2;
+ if (lp->mincol > start.x - 2)
+ lp->mincol = start.x - 2;
+ if (lp->minrow > start.y - 1)
+ lp->minrow = start.y - 1;
+ if (lp->maxcol < start.x + HEX_ADAM_LOOPY + 1)
+ lp->maxcol = start.x + HEX_ADAM_LOOPY + 1;
+ if (lp->maxrow < start.y + HEX_ADAM_LOOPX + 1)
+ lp->maxrow = start.y + HEX_ADAM_LOOPX + 1;
+ for (j = 0; j < HEX_ADAM_LOOPX; j++) {
+ for (i = 0; i < HEX_ADAM_LOOPY; i++) {
+ k = (((lp->bnrows / 2 + HEX_ADAM_LOOPX / 2) % 2) ? -(HEX_ADAM_LOOPX - j - 1) / 2 : -(HEX_ADAM_LOOPX - j) / 2);
+ lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+ (lp->clockwise) ?
+ hex_self_reproducing_loop[HEX_ADAM_LOOPY - j - 1][i] :
+ hex_self_reproducing_loop[HEX_ADAM_LOOPX - i - 1][j];
+ }
+ }
+ break;
+ }
+#if DEBUGTEST
+ /* (void) printf ("s %d s %d \n", start.x, start.y); */
+ (void) printf ("%d %d %d %d %d\n",
+ start.x + i + ((lp->bnrows / 2 % 2) ? -j / 2 : -(j + 1) / 2) - lp->bx,
+ start.y + j - lp->by, i, j, hex_self_reproducing_loop[j][i]);
+ /* Draw right away */
+ drawcell(mi, start.x + i + ((lp->bnrows / 2 % 2) ? -j / 2 : -(j + 1) / 2) - lp->bx,
+ start.y + j - lp->by,
+ hex_self_reproducing_loop[j][i]);
+#endif
+ } else {
+ switch (dir) {
+ case 0:
+ start.x = (lp->bncols - ADAM_LOOPX) / 2;
+ start.y = (lp->bnrows - ADAM_LOOPY) / 2;
+ dirx.x = 1, dirx.y = 0;
+ diry.x = 0, diry.y = 1;
+ if (lp->mincol > start.x)
+ lp->mincol = start.x;
+ if (lp->minrow > start.y)
+ lp->minrow = start.y;
+ if (lp->maxcol < start.x + ADAM_LOOPX)
+ lp->maxcol = start.x + ADAM_LOOPX;
+ if (lp->maxrow < start.y + ADAM_LOOPY)
+ lp->maxrow = start.y + ADAM_LOOPY;
+ break;
+ case 1:
+ start.x = (lp->bncols + ADAM_LOOPY) / 2;
+ start.y = (lp->bnrows - ADAM_LOOPX) / 2;
+ dirx.x = 0, dirx.y = 1;
+ diry.x = -1, diry.y = 0;
+ if (lp->mincol > start.x - ADAM_LOOPY)
+ lp->mincol = start.x - ADAM_LOOPY;
+ if (lp->minrow > start.y)
+ lp->minrow = start.y;
+ if (lp->maxcol < start.x)
+ lp->maxcol = start.x;
+ if (lp->maxrow < start.y + ADAM_LOOPX)
+ lp->maxrow = start.y + ADAM_LOOPX;
+ break;
+ case 2:
+ start.x = (lp->bncols + ADAM_LOOPX) / 2;
+ start.y = (lp->bnrows + ADAM_LOOPY) / 2;
+ dirx.x = -1, dirx.y = 0;
+ diry.x = 0, diry.y = -1;
+ if (lp->mincol > start.x - ADAM_LOOPX)
+ lp->mincol = start.x - ADAM_LOOPX;
+ if (lp->minrow > start.y - ADAM_LOOPY)
+ lp->minrow = start.y - ADAM_LOOPY;
+ if (lp->maxcol < start.x)
+ lp->maxcol = start.x;
+ if (lp->maxrow < start.y)
+ lp->maxrow = start.y;
+ break;
+ case 3:
+ start.x = (lp->bncols - ADAM_LOOPY) / 2;
+ start.y = (lp->bnrows + ADAM_LOOPX) / 2;
+ dirx.x = 0, dirx.y = -1;
+ diry.x = 1, diry.y = 0;
+ if (lp->mincol > start.x)
+ lp->mincol = start.x;
+ if (lp->minrow > start.y - ADAM_LOOPX)
+ lp->minrow = start.y - ADAM_LOOPX;
+ if (lp->maxcol < start.x + ADAM_LOOPX)
+ lp->maxcol = start.x + ADAM_LOOPX;
+ if (lp->maxrow < start.y)
+ lp->maxrow = start.y;
+ break;
+ }
+ for (j = 0; j < ADAM_LOOPY; j++)
+ for (i = 0; i < ADAM_LOOPX; i++)
+ lp->newcells[lp->bncols * (start.y + dirx.y * i + diry.y * j) +
+ start.x + dirx.x * i + diry.x * j] =
+ (lp->clockwise) ?
+ self_reproducing_loop[j][ADAM_LOOPX - i - 1] :
+ self_reproducing_loop[j][i];
+#if DEBUG
+ /* Draw right away */
+ drawcell(mi, start.x + dirx.x * i + diry.x * j - lp->bx,
+ start.y + dirx.y * i + diry.y * j - lp->by,
+ (lp->clockwise) ? self_reproducing_loop[j][ADAM_LOOPX - i - i] : self_reproducing_loop[j][i]);
+#endif
+ }
+}
+
+
+static void
+do_gen(loopstruct * lp)
+{
+ int i, j, k;
+ unsigned char *z;
+ unsigned int n[MAXNEIGHBORS];
+ unsigned int c;
+
+#define LOC(X, Y) (*(lp->oldcells + (X) + ((Y) * lp->bncols)))
+
+ for (j = lp->minrow; j <= lp->maxrow; j++) {
+ for (i = lp->mincol; i <= lp->maxcol; i++) {
+ z = lp->newcells + i + j * lp->bncols;
+ c = LOC(i, j);
+ for (k = 0; k < local_neighbors; k++) {
+ int newi = i, newj = j;
+
+ position_of_neighbor(k * ANGLES / local_neighbors, &newi, &newj);
+ n[k] = 0;
+ if (withinBounds(lp, newi, newj)) {
+ n[k] = LOC(newi, newj);
+ }
+ }
+ if (local_neighbors == 6) {
+ *z = (lp->clockwise) ?
+ HEX_TABLE_OUT(c, n[5], n[4], n[3], n[2], n[1], n[0]) :
+ HEX_TABLE_OUT(c, n[0], n[1], n[2], n[3], n[4], n[5]);
+ } else {
+ *z = (lp->clockwise) ?
+ TABLE_OUT(c, n[3], n[2], n[1], n[0]) :
+ TABLE_OUT(c, n[0], n[1], n[2], n[3]);
+ }
+ }
+ }
+}
+
+ENTRYPOINT void
+release_loop (ModeInfo * mi)
+{
+ if (table != NULL) {
+ (void) free((void *) table);
+ table = (unsigned int *) NULL;
+ }
+}
+
+static void *stop_warning_about_triangleUnit_already;
+
+
+ENTRYPOINT void
+init_loop (ModeInfo * mi)
+{
+ int i, size = MI_SIZE(mi);
+ loopstruct *lp;
+
+ stop_warning_about_triangleUnit_already = (void *) &triangleUnit;
+
+ MI_INIT (mi, loops);
+ lp = &loops[MI_SCREEN(mi)];
+
+ lp->redrawing = 0;
+
+ if (MI_WIDTH(mi) < 100 || MI_HEIGHT(mi) < 100) /* tiny window */
+ size = MIN(MI_WIDTH(mi), MI_HEIGHT(mi));
+
+#ifdef DO_STIPPLE
+ if ((MI_NPIXELS(mi) < COLORS) && (lp->init_bits == 0)) {
+ Window window = MI_WINDOW(mi);
+ XGCValues gcv;
+ if (lp->stippledGC == None) {
+ gcv.fill_style = FillOpaqueStippled;
+ if ((lp->stippledGC = XCreateGC(MI_DISPLAY(mi), window,
+ GCFillStyle, &gcv)) == None) {
+ free_loop(mi);
+ return;
+ }
+ }
+ LOOPBITS(stipples[0], STIPPLESIZE, STIPPLESIZE);
+ LOOPBITS(stipples[2], STIPPLESIZE, STIPPLESIZE);
+ LOOPBITS(stipples[3], STIPPLESIZE, STIPPLESIZE);
+ LOOPBITS(stipples[4], STIPPLESIZE, STIPPLESIZE);
+ LOOPBITS(stipples[6], STIPPLESIZE, STIPPLESIZE);
+ LOOPBITS(stipples[7], STIPPLESIZE, STIPPLESIZE);
+ LOOPBITS(stipples[8], STIPPLESIZE, STIPPLESIZE);
+ LOOPBITS(stipples[10], STIPPLESIZE, STIPPLESIZE);
+ }
+#endif /* DO_STIPPLE */
+ if (MI_NPIXELS(mi) >= COLORS) {
+ /* Maybe these colors should be randomized */
+ lp->colors[0] = MI_BLACK_PIXEL(mi);
+ lp->colors[1] = MI_PIXEL(mi, 0); /* RED */
+ lp->colors[5] = MI_PIXEL(mi, MI_NPIXELS(mi) / REALCOLORS); /* YELLOW */
+ lp->colors[4] = MI_PIXEL(mi, 2 * MI_NPIXELS(mi) / REALCOLORS); /* GREEN */
+ lp->colors[6] = MI_PIXEL(mi, 3 * MI_NPIXELS(mi) / REALCOLORS); /* CYAN */
+ lp->colors[2] = MI_PIXEL(mi, 4 * MI_NPIXELS(mi) / REALCOLORS); /* BLUE */
+ lp->colors[3] = MI_PIXEL(mi, 5 * MI_NPIXELS(mi) / REALCOLORS); /* MAGENTA */
+ lp->colors[7] = MI_WHITE_PIXEL(mi);
+ }
+ free_list(lp);
+ lp->generation = 0;
+ lp->width = MI_WIDTH(mi);
+ lp->height = MI_HEIGHT(mi);
+
+ if (!local_neighbors) {
+ for (i = 0; i < NEIGHBORKINDS; i++) {
+ if (neighbors == plots[i]) {
+ local_neighbors = neighbors;
+ break;
+ }
+ if (i == NEIGHBORKINDS - 1) {
+#if 1
+ local_neighbors = plots[NRAND(NEIGHBORKINDS)];
+#else
+ local_neighbors = 4;
+#endif
+ break;
+ }
+ }
+ }
+
+
+ if (local_neighbors == 6) {
+ int nccols, ncrows;
+
+ if (lp->width < 8)
+ lp->width = 8;
+ if (lp->height < 8)
+ lp->height = 8;
+ if (size < -MINSIZE) {
+ lp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+ HEX_MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ } else if (size < MINSIZE) {
+ if (!size)
+ lp->ys = MAX(MINSIZE, MIN(lp->width, lp->height) / HEX_MINGRIDSIZE);
+ else
+ lp->ys = MINSIZE;
+ } else
+ lp->ys = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+ HEX_MINGRIDSIZE));
+ lp->xs = lp->ys;
+ nccols = MAX(lp->width / lp->xs - 2, HEX_MINGRIDSIZE);
+ ncrows = MAX(lp->height / lp->ys - 1, HEX_MINGRIDSIZE);
+ lp->ncols = nccols / 2;
+ lp->nrows = ncrows / 2;
+ lp->nrows -= !(lp->nrows & 1); /* Must be odd */
+ lp->xb = (lp->width - lp->xs * nccols) / 2 + lp->xs;
+ lp->yb = (lp->height - lp->ys * ncrows) / 2 + lp->ys;
+ for (i = 0; i < 6; i++) {
+ lp->shape.hexagon[i].x = (lp->xs - 1) * hexagonUnit[i].x;
+ lp->shape.hexagon[i].y = ((lp->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+ }
+ } else {
+ if (size < -MINSIZE)
+ lp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ lp->ys = MAX(MINSIZE, MIN(lp->width, lp->height) / MINGRIDSIZE);
+ else
+ lp->ys = MINSIZE;
+ } else
+ lp->ys = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+ MINGRIDSIZE));
+ lp->xs = lp->ys;
+ lp->ncols = MAX(lp->width / lp->xs, ADAM_LOOPX + 1);
+ lp->nrows = MAX(lp->height / lp->ys, ADAM_LOOPX + 1);
+ lp->xb = (lp->width - lp->xs * lp->ncols) / 2;
+ lp->yb = (lp->height - lp->ys * lp->nrows) / 2;
+ }
+ lp->bx = 1;
+ lp->by = 1;
+ lp->bncols = lp->ncols + 2 * lp->bx;
+ lp->bnrows = lp->nrows + 2 * lp->by;
+
+ MI_CLEARWINDOW(mi);
+
+ if (lp->oldcells != NULL) {
+ (void) free((void *) lp->oldcells);
+ lp->oldcells = (unsigned char *) NULL;
+ }
+ if ((lp->oldcells = (unsigned char *) calloc(lp->bncols * lp->bnrows,
+ sizeof (unsigned char))) == NULL) {
+ free_loop(mi);
+ return;
+ }
+ if (lp->newcells != NULL) {
+ (void) free((void *) lp->newcells);
+ lp->newcells = (unsigned char *) NULL;
+ }
+ if ((lp->newcells = (unsigned char *) calloc(lp->bncols * lp->bnrows,
+ sizeof (unsigned char))) == NULL) {
+ free_loop(mi);
+ return;
+ }
+ if (!init_table()) {
+ release_loop(mi);
+ return;
+ }
+ lp->mincol = lp->bncols - 1;
+ lp->minrow = lp->bnrows - 1;
+ lp->maxcol = 0;
+ lp->maxrow = 0;
+#ifndef DELAYDEBUGLOOP
+ {
+ int flaws = MI_COUNT(mi);
+
+ if (flaws < 0)
+ flaws = NRAND(-MI_COUNT(mi) + 1);
+ for (i = 0; i < flaws; i++) {
+ init_flaw(mi);
+ }
+ /* actual flaws might be less since the adam loop done next */
+ }
+#endif
+ init_adam(mi);
+}
+
+ENTRYPOINT void
+draw_loop (ModeInfo * mi)
+{
+ int offset, i, j;
+ unsigned char *z, *znew;
+ loopstruct *lp;
+
+ if (loops == NULL)
+ return;
+ lp = &loops[MI_SCREEN(mi)];
+ if (lp->newcells == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ lp->dead = True;
+#ifdef DELAYDEBUGLOOP
+ if (MI_COUNT(mi) && lp->generation > MI_COUNT(mi)) {
+ (void) sleep(DELAYDEBUGLOOP);
+ }
+#endif
+
+ for (j = lp->minrow; j <= lp->maxrow; j++) {
+ for (i = lp->mincol; i <= lp->maxcol; i++) {
+ offset = j * lp->bncols + i;
+ z = lp->oldcells + offset;
+ znew = lp->newcells + offset;
+ if (*z != *znew) {
+ lp->dead = False;
+ *z = *znew;
+ if (!addtolist(mi, i - lp->bx, j - lp->by, *znew))
+ return;
+ if (i == lp->mincol && i > lp->bx)
+ lp->mincol--;
+ if (j == lp->minrow && j > lp->by)
+ lp->minrow--;
+ if (i == lp->maxcol && i < lp->bncols - 2 * lp->bx)
+ lp->maxcol++;
+ if (j == lp->maxrow && j < lp->bnrows - 2 * lp->by)
+ lp->maxrow++;
+ }
+ }
+ }
+ for (i = 0; i < COLORS; i++)
+ if (!draw_state(mi, i)) {
+ free_loop(mi);
+ return;
+ }
+ if (++lp->generation > MI_CYCLES(mi) || lp->dead) {
+ init_loop(mi);
+ return;
+ } else
+ do_gen(lp);
+
+ if (lp->redrawing) {
+ for (i = 0; i < REDRAWSTEP; i++) {
+ if ((*(lp->oldcells + lp->redrawpos))) {
+ drawcell(mi, lp->redrawpos % lp->bncols - lp->bx,
+ lp->redrawpos / lp->bncols - lp->by,
+ *(lp->oldcells + lp->redrawpos));
+ }
+ if (++(lp->redrawpos) >= lp->bncols * (lp->bnrows - lp->bx)) {
+ lp->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_loop (ModeInfo * mi)
+{
+ loopstruct *lp;
+
+ if (loops == NULL)
+ return;
+ lp = &loops[MI_SCREEN(mi)];
+
+ MI_CLEARWINDOW(mi);
+ lp->redrawing = 1;
+ lp->redrawpos = lp->by * lp->ncols + lp->bx;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Loop", loop)
+
+#endif /* MODE_loop */
diff --git a/hacks/loop.man b/hacks/loop.man
new file mode 100644
index 0000000..37fb970
--- /dev/null
+++ b/hacks/loop.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+loop - cellular automaton.
+.SH SYNOPSIS
+.B loop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Another cellular automaton.
+This one produces loop-shaped colonies that spawn, age, and eventually die.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout. 0 - 8000. Default: 1600.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 100000 (0.10 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 15.
+.TP 8
+.B \-size \fInumber\fP
+Size. -50 - 50. Default: -12.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by David Bagley. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David Bagley.
diff --git a/hacks/m6502.c b/hacks/m6502.c
new file mode 100644
index 0000000..ce18e9d
--- /dev/null
+++ b/hacks/m6502.c
@@ -0,0 +1,307 @@
+/* -*- indent-tabs-mode:nil -*-
+ * Copyright (c) 2007 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 07-May-2007
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#if defined(HAVE_STDINT_H)
+#include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+#include <inttypes.h>
+#endif
+#include <string.h>
+#include "screenhack.h"
+#include "analogtv.h"
+#include "asm6502.h"
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the length
+ ISO C89 compilers are required to support" when includng
+ the following data file... */
+# endif
+static const char * const demo_files[] = {
+# include "m6502.h"
+};
+
+
+#ifndef HAVE_MOBILE
+# define READ_FILES
+#endif
+
+
+/* We want to paint on a 32 by 32 grid of pixels. We will needed to
+ divided the screen up into chuncks */
+enum {
+ SCREEN_W = ANALOGTV_VIS_LEN,
+ SCREEN_H = ANALOGTV_VISLINES,
+ NUM_PROGS = 9
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Bit8 pixels[32][32];
+
+ machine_6502 *machine;
+
+ analogtv *tv;
+ analogtv_input *inp;
+ analogtv_reception reception;
+ int pixw; /* pixel width */
+ int pixh;/* pixel height */
+ int topb;/* top boarder */
+ int field_ntsc[4];/* used for clearing the screen*/
+ double dt;/* how long to wait before changing the demo*/
+ int which;/* the program to run*/
+ int demos;/* number of demos included */
+ double start_time;
+ int reset_p;
+ char *file;
+ double last_frame, last_delay;
+ unsigned ips;
+};
+
+static void
+plot6502(Bit8 x, Bit8 y, Bit8 color, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ st->pixels[x][y] = color;
+}
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+static void
+start_rand_bin_prog(machine_6502 *machine, struct state *st){
+ int n = st->which;
+ while(n == st->which)
+ n = random() % st->demos;
+ st->which = n;
+ m6502_start_eval_string(machine, demo_files[st->which], plot6502, st);
+}
+
+
+/*
+ * double_time ()
+ *
+ * returns the current time as a floating-point value
+ */
+static double double_time(void) {
+ struct timeval t;
+ double f;
+#if GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&t, NULL);
+#else
+ gettimeofday(&t);
+#endif
+ f = ((double)t.tv_sec) + t.tv_usec*1e-6;
+ return f;
+}
+
+static void *
+m6502_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int n = get_float_resource(dpy, "displaytime", "Displaytime");
+ int dh;
+ st->demos = countof(demo_files);
+ st->which = random() % st->demos;
+ st->dt = n;
+ st->dpy = dpy;
+ st->window = window;
+ st->tv=analogtv_allocate(st->dpy, st->window);
+ analogtv_set_defaults(st->tv, "");
+
+ st->machine = m6502_build();
+ st->inp=analogtv_input_allocate();
+ analogtv_setup_sync(st->inp, 1, 0);
+
+ st->reception.input = st->inp;
+ st->reception.level = 2.0;
+ st->reception.ofs=0;
+
+ st->reception.multipath=0.0;
+ st->pixw = SCREEN_W / 32;
+ st->pixh = SCREEN_H / 32;
+ dh = SCREEN_H % 32;
+ st->topb = dh / 2;
+
+ st->last_frame = double_time();
+ st->last_delay = 0;
+ st->ips = get_integer_resource(dpy, "ips", "IPS");
+
+#ifdef READ_FILES
+ st->file = get_string_resource (dpy, "file", "File");
+#endif
+
+ st->reset_p = 1;
+
+ analogtv_lcp_to_ntsc(ANALOGTV_BLACK_LEVEL, 0.0, 0.0, st->field_ntsc);
+
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START, ANALOGTV_VIS_END,
+ ANALOGTV_TOP, ANALOGTV_BOT,
+ st->field_ntsc);
+
+ return st;
+}
+
+static void
+paint_pixel(struct state *st, int x, int y, int idx)
+{
+ double clr_tbl[16][3] = {
+ { 0, 0, 0},
+ {255, 255, 255},
+ {136, 0, 0},
+ {170, 255, 238},
+ {204, 68, 204},
+ { 0, 204, 85},
+ { 0, 0, 170},
+ {238, 238, 119},
+ {221, 136, 85},
+ {102, 68, 0},
+ {255, 119, 119},
+ { 51, 51, 51},
+ {119, 119, 119},
+ {170, 255, 102},
+ { 0, 136, 255},
+ {187, 187, 187}
+ };
+ int ntsc[4], i;
+ int rawy,rawi,rawq;
+ /* RGB conversion taken from analogtv draw xpm */
+ rawy=( 5*clr_tbl[idx][0] + 11*clr_tbl[idx][1] + 2*clr_tbl[idx][2]) / 64;
+ rawi=(10*clr_tbl[idx][0] - 4*clr_tbl[idx][1] - 5*clr_tbl[idx][2]) / 64;
+ rawq=( 3*clr_tbl[idx][0] - 8*clr_tbl[idx][1] + 5*clr_tbl[idx][2]) / 64;
+
+ ntsc[0]=rawy+rawq;
+ ntsc[1]=rawy-rawi;
+ ntsc[2]=rawy-rawq;
+ ntsc[3]=rawy+rawi;
+
+ for (i=0; i<4; i++) {
+ if (ntsc[i]>ANALOGTV_WHITE_LEVEL) ntsc[i]=ANALOGTV_WHITE_LEVEL;
+ if (ntsc[i]<ANALOGTV_BLACK_LEVEL) ntsc[i]=ANALOGTV_BLACK_LEVEL;
+ }
+
+
+ x *= st->pixw;
+ y *= st->pixh;
+ y += st->topb;
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START + x, ANALOGTV_VIS_START + x + st->pixw,
+ ANALOGTV_TOP + y, ANALOGTV_TOP + y + st->pixh, ntsc);
+}
+
+static unsigned long
+m6502_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ unsigned int x = 0, y = 0;
+ double now, last_delay = st->last_delay >= 0 ? st->last_delay : 0;
+ double insno = st->ips * ((1 / 29.97) + last_delay - st->last_delay);
+ const analogtv_reception *reception = &st->reception;
+
+ if (st->reset_p){ /* do something more interesting here XXX */
+ st->reset_p = 0;
+ for(x = 0; x < 32; x++)
+ for(y = 0; y < 32; y++)
+ st->pixels[x][y] = 0;
+ st->start_time = st->last_frame + last_delay;
+
+#ifdef READ_FILES
+ if (st->file && *st->file)
+ m6502_start_eval_file(st->machine, st->file, plot6502, st);
+ else
+#endif
+ start_rand_bin_prog(st->machine,st);
+ }
+
+ if (insno < 10)
+ insno = 10;
+ else if (insno > 100000) /* Real 6502 went no faster than 3 MHz. */
+ insno = 100000;
+ m6502_next_eval(st->machine,insno);
+
+ for (x = 0; x < 32; x++)
+ for (y = 0; y < 32; y++)
+ paint_pixel(st,x,y,st->pixels[x][y]);
+
+ analogtv_reception_update(&st->reception);
+ analogtv_draw(st->tv, 0.04, &reception, 1);
+ now = double_time();
+ st->last_delay = (1 / 29.97) + st->last_frame + last_delay - now;
+ st->last_frame = now;
+
+ if (now - st->start_time > st->dt)
+ st->reset_p = 1;
+
+ return st->last_delay >= 0 ? st->last_delay * 1e6 : 0;
+}
+
+
+
+
+static const char *m6502_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*file:",
+ "*displaytime: 30.0", /* demoscene: 24s, dmsc: 48s, sierpinsky: 26s
+ sflake, two runs: 35s
+ */
+ "*ips: 15000", /* Actual MOS 6502 ran at least 1 MHz. */
+ ANALOGTV_DEFAULTS
+ 0
+};
+
+static XrmOptionDescRec m6502_options [] = {
+ { "-file", ".file", XrmoptionSepArg, 0 },
+ { "-displaytime", ".displaytime", XrmoptionSepArg, 0},
+ { "-ips", ".ips", XrmoptionSepArg, 0},
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+static void
+m6502_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_reconfigure (st->tv);
+}
+
+static Bool
+m6502_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->reset_p = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+m6502_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_release(st->tv);
+ free (st->file);
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("m6502", m6502)
diff --git a/hacks/m6502.sh b/hacks/m6502.sh
new file mode 100755
index 0000000..30f338c
--- /dev/null
+++ b/hacks/m6502.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+TARGET=$1
+shift
+SRCS=$*
+
+TMP1=m6502.h.1.$$
+TMP2=m6502.h.2.$$
+rm -f $TMP1 $TMP2
+trap "rm -f $TMP1 $TMP2" 1 2 3 15 EXIT
+
+if [ -z "$UTILS_SRC" ]; then UTILS_SRC="../utils"; fi
+
+for f in $SRCS ; do
+ sed 's/[ ]*;.*$//' < "$f" > $TMP1 # lose comments
+ sh "$UTILS_SRC/ad2c" $TMP1 |
+ sed 's/",$/\\n"/' >> $TMP2
+ echo ',' >> $TMP2
+done
+rm -f $TMP1
+if cmp -s $TMP2 $TARGET ; then
+ rm -f $TMP2
+else
+ mv $TMP2 $TARGET
+fi
+
diff --git a/hacks/maze.c b/hacks/maze.c
new file mode 100644
index 0000000..a0007dd
--- /dev/null
+++ b/hacks/maze.c
@@ -0,0 +1,1661 @@
+/******************************************************************************
+ * [ maze ] ...
+ *
+ * modified: [ 13-08-08 ] Jamie Zawinski <jwz@jwz.org>
+ * Removed the bridge option: it didn't look good, and it made
+ * the code a lot harder to understand.
+ * Made the maze stay out of the area used for the -fps display.
+ * Cleaned up and commented.
+ *
+ * modified: [ 1-04-00 ] Johannes Keukelaar <johannes@nada.kth.se>
+ * Added -ignorant option (not the default) to remove knowlege
+ * of the direction in which the exit lies.
+ *
+ * modified: [ 6-28-98 ] Zack Weinberg <zack@rabi.phys.columbia.edu>
+ *
+ * Made the maze-solver somewhat more intelligent. There are
+ * three optimizations:
+ *
+ * - Straight-line lookahead: the solver does not enter dead-end
+ * corridors. This is a win with all maze generators.
+ *
+ * - First order direction choice: the solver knows where the
+ * exit is in relation to itself, and will try paths leading in
+ * that direction first. This is a major win on maze generator 1
+ * which tends to offer direct routes to the exit.
+ *
+ * - Dead region elimination: the solver already has a map of
+ * all squares visited. Whenever it starts to backtrack, it
+ * consults this map and marks off all squares that cannot be
+ * reached from the exit without crossing a square already
+ * visited. Those squares can never contribute to the path to
+ * the exit, so it doesn't bother checking them. This helps a
+ * lot with maze generator 2 and somewhat less with generator 1.
+ *
+ * Further improvements would require knowledge of the wall map
+ * as well as the position of the exit and the squares visited.
+ * I would consider that to be cheating. Generator 0 makes
+ * mazes which are remarkably difficult to solve mechanically --
+ * even with these optimizations the solver generally must visit
+ * at least two-thirds of the squares. This is partially
+ * because generator 0's mazes have longer paths to the exit.
+ *
+ * modified: [ 4-10-97 ] Johannes Keukelaar <johannes@nada.kth.se>
+ * Added multiple maze creators. Robustified solver.
+ * Added bridge option.
+ * modified: [ 8-11-95 ] Ed James <james@mml.mmc.com>
+ * added fill of dead-end box to solve_maze while loop.
+ * modified: [ 3-7-93 ] Jamie Zawinski <jwz@jwz.org>
+ * added the XRoger logo, cleaned up resources, made
+ * grid size a parameter.
+ * modified: [ 3-3-93 ] Jim Randell <jmr@mddjmr.fc.hp.com>
+ * Added the colour stuff and integrated it with jwz's
+ * screenhack stuff. There's still some work that could
+ * be done on this, particularly allowing a resource to
+ * specify how big the squares are.
+ * modified: [ 10-4-88 ] Richard Hess ...!uunet!cimshop!rhess
+ * [ Revised primary execution loop within main()...
+ * [ Extended X event handler, check_events()...
+ * modified: [ 1-29-88 ] Dave Lemke lemke@sun.com
+ * [ Hacked for X11...
+ * [ Note the word "hacked" -- this is extremely ugly, but at
+ * [ least it does the job. NOT a good programming example
+ * [ for X.
+ * original: [ 6/21/85 ] Martin Weiss Sun Microsystems [ SunView ]
+ *
+ ******************************************************************************
+ Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA.
+
+ All Rights Reserved
+
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted,
+ provided that the above copyright notice appear in all copies and that
+ both that copyright notice and this permission notice appear in
+ supporting documentation, and that the names of Sun or MIT not be
+ used in advertising or publicity pertaining to distribution of the
+ software without specific prior written permission. Sun and M.I.T.
+ make no representations about the suitability of this software for
+ any purpose. It is provided "as is" without any express or implied warranty.
+
+ SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE. IN NO EVENT SHALL SUN BE LIABLE FOR ANY SPECIAL, INDIRECT
+ OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+ OR PERFORMANCE OF THIS SOFTWARE.
+ *****************************************************************************/
+
+#include "screenhack.h"
+#include "erase.h"
+#include "ximage-loader.h"
+#include "images/gen/logo-50_png.h"
+#include "images/gen/logo-180_png.h"
+
+#include <stdio.h>
+
+/* #include <X11/bitmaps/gray1> */
+/*
+#define gray1_width 2
+#define gray1_height 2
+static const char gray1_bits[] = { 0x01, 0x02 };
+*/
+
+#define MAX_MAZE_SIZE_X 1000
+#define MAX_MAZE_SIZE_Y 1000
+
+#define MOVE_LIST_SIZE (MAX_MAZE_SIZE_X * MAX_MAZE_SIZE_Y)
+
+#define NOT_DEAD 0x8000
+#define SOLVER_VISIT 0x4000
+#define START_SQUARE 0x2000
+#define END_SQUARE 0x1000
+
+#define WALL_TOP 0x8
+#define WALL_RIGHT 0x4
+#define WALL_BOTTOM 0x2
+#define WALL_LEFT 0x1
+#define WALL_ANY 0xF
+
+#define DOOR_IN_TOP 0x800
+#define DOOR_IN_RIGHT 0x400
+#define DOOR_IN_BOTTOM 0x200
+#define DOOR_IN_LEFT 0x100
+#define DOOR_IN_ANY 0xF00
+
+#define DOOR_OUT_TOP 0x80
+#define DOOR_OUT_RIGHT 0x40
+#define DOOR_OUT_BOTTOM 0x20
+#define DOOR_OUT_LEFT 0x10
+
+
+#define border_x (0)
+#define border_y (0)
+
+#define get_random(x) (random() % (x))
+
+
+struct move_list_struct {
+ unsigned short x;
+ unsigned short y;
+ unsigned char dir, ways;
+};
+
+struct solve_state {
+ int running;
+ int i, x, y, bt;
+};
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC gc, cgc, tgc, sgc, ugc, logo_gc, erase_gc;
+ Pixmap logo_map;
+
+ int logo_x, logo_y; /* in grid cells (or -1) */
+ int logo_width, logo_height; /* in pixels */
+ int fps_width, fps_height; /* in pixels */
+
+ int solve_delay, pre_solve_delay, post_solve_delay;
+
+ unsigned short maze[MAX_MAZE_SIZE_X][MAX_MAZE_SIZE_Y];
+
+ struct move_list_struct move_list[MOVE_LIST_SIZE];
+ struct move_list_struct save_path[MOVE_LIST_SIZE];
+ struct move_list_struct path[MOVE_LIST_SIZE];
+
+ int maze_size_x, maze_size_y;
+ int sqnum, cur_sq_x, cur_sq_y, path_length;
+ int start_x, start_y, start_dir, end_x, end_y, end_dir;
+ int grid_width, grid_height;
+ int bw;
+
+ int x, y, restart, stop, state, max_length;
+ int sync_p, sync_tick;
+ int ignorant_p;
+
+ struct solve_state *solve_state;
+
+ int *sets; /* The sets that our squares are in. */
+ int *hedges; /* The `list' of hedges. */
+
+ int this_gen;
+ int erase_window;
+ eraser_state *eraser;
+
+ int ifrandom;
+ int ifinit;
+
+};
+
+
+static void draw_wall (struct state *, int, int, int, GC);
+static void draw_solid_square (struct state *, int, int, int, GC);
+static void build_wall (struct state *, int, int, int);
+
+
+static void
+set_maze_sizes (struct state *st, int width, int height)
+{
+ st->maze_size_x = width / st->grid_width;
+ st->maze_size_y = height / st->grid_height;
+
+ if (st->maze_size_x < 4) st->maze_size_x = 4;
+ if (st->maze_size_y < 4) st->maze_size_y = 4;
+}
+
+
+/* Resets the maze grid, picks the starting and ending points,
+ and the position of the logo, if any.
+ */
+static void
+initialize_maze (struct state *st)
+{
+ int retry_count = 0;
+ int i, j, wall;
+ int logow = 1 + st->logo_width / st->grid_width;
+ int logoh = 1 + st->logo_height / st->grid_height;
+
+ AGAIN:
+
+ /* This can happen if the window is really small. Let's not sweat it. */
+ if (++retry_count > 100) return;
+
+
+ /* initialize all squares */
+ for ( i=0; i<st->maze_size_x; i++) {
+ for ( j=0; j<st->maze_size_y; j++) {
+ st->maze[i][j] = 0;
+ }
+ }
+
+ /* top wall */
+ for ( i=0; i<st->maze_size_x; i++ ) {
+ st->maze[i][0] |= WALL_TOP;
+ }
+
+ /* right wall */
+ for ( j=0; j<st->maze_size_y; j++ ) {
+ st->maze[st->maze_size_x-1][j] |= WALL_RIGHT;
+ }
+
+ /* bottom wall */
+ for ( i=0; i<st->maze_size_x; i++ ) {
+ st->maze[i][st->maze_size_y-1] |= WALL_BOTTOM;
+ }
+
+ /* left wall */
+ for ( j=0; j<st->maze_size_y; j++ ) {
+ st->maze[0][j] |= WALL_LEFT;
+ }
+
+ /* set start square */
+ wall = get_random(4);
+ switch (wall) {
+ case 0:
+ i = get_random(st->maze_size_x);
+ j = 0;
+ break;
+ case 1:
+ i = st->maze_size_x - 1;
+ j = get_random(st->maze_size_y);
+ break;
+ case 2:
+ i = get_random(st->maze_size_x);
+ j = st->maze_size_y - 1;
+ break;
+ case 3:
+ i = 0;
+ j = get_random(st->maze_size_y);
+ break;
+ }
+ st->maze[i][j] |= START_SQUARE;
+ st->maze[i][j] |= ( DOOR_IN_TOP >> wall );
+ st->maze[i][j] &= ~( WALL_TOP >> wall );
+ st->cur_sq_x = i;
+ st->cur_sq_y = j;
+ st->start_x = i;
+ st->start_y = j;
+ st->start_dir = wall;
+ st->sqnum = 0;
+
+ /* set end square */
+ wall = (wall + 2)%4;
+ switch (wall) {
+ case 0:
+ i = get_random(st->maze_size_x);
+ j = 0;
+ break;
+ case 1:
+ i = st->maze_size_x - 1;
+ j = get_random(st->maze_size_y);
+ break;
+ case 2:
+ i = get_random(st->maze_size_x);
+ j = st->maze_size_y - 1;
+ break;
+ case 3:
+ i = 0;
+ j = get_random(st->maze_size_y);
+ break;
+ }
+ st->maze[i][j] |= END_SQUARE;
+ st->maze[i][j] |= ( DOOR_OUT_TOP >> wall );
+ st->maze[i][j] &= ~( WALL_TOP >> wall );
+ st->end_x = i;
+ st->end_y = j;
+ st->end_dir = wall;
+
+ /* set logo */
+ if ((st->maze_size_x-logow >= 6) && (st->maze_size_y-logoh >= 6))
+ {
+ /* not closer than 3 grid units from a wall, to ensure that it
+ won't overlap the entrance or exit. */
+ st->logo_x = get_random (st->maze_size_x - logow - 5) + 3;
+ st->logo_y = get_random (st->maze_size_y - logoh - 5) + 3;
+ for (i=0; i<logow; i++)
+ for (j=0; j<logoh; j++)
+ /* mark as having doors to prevent these cells being used in maze. */
+ st->maze[st->logo_x + i][st->logo_y + j] |= DOOR_IN_ANY;
+ }
+ else
+ st->logo_y = st->logo_x = -1;
+
+ /* mask out the fps area */
+ if (st->fps_width > 0)
+ {
+ int fpsw = 1 + st->fps_width / st->grid_width;
+ int fpsh = 1 + st->fps_height / st->grid_width;
+
+ /* if the chosen logo position overlapped the fps area, try again! */
+ if (st->logo_x < fpsw+3 && st->logo_y+logoh > st->maze_size_y-fpsh-4)
+ goto AGAIN;
+
+ /* if the start or end point is inside the fps area, try again! */
+ if ((st->start_x <= fpsw && st->start_y >= st->maze_size_y-fpsh-1) ||
+ (st->end_x <= fpsw && st->end_y >= st->maze_size_y-fpsh-1))
+ goto AGAIN;
+
+ for (i=0; i<fpsw; i++)
+ for (j=0; j<fpsh; j++) {
+ /* mark as having doors to prevent these cells being used in maze.
+ mark as visit to prevent it being colored "unreachable". */
+ st->maze[i][st->maze_size_y - j - 1] |= DOOR_IN_ANY|SOLVER_VISIT;
+ /* take off left/bottom wall or the FPS text overlaps it */
+ st->maze[i][st->maze_size_y - j - 1] &= ~(WALL_BOTTOM|WALL_LEFT);
+ }
+ }
+}
+
+
+/****************************************************************************
+ Generator 2: Set-based maze generator.
+
+ Put each square in the maze in a separate set. Also, make a list of all the
+ hedges. Randomize that list. Walk through the list. If, for a certain
+ hedge, the two squares on both sides of it are in different sets, union the
+ sets and remove the hedge. Continue until all hedges have been processed or
+ only one set remains.
+
+ This is essentially the "Kruskal" algorithm.
+
+ ****************************************************************************/
+
+static void mask_out_set_rect(struct state *st, int x, int y, int w, int h);
+
+/* Initialise the sets. */
+static void
+init_sets(struct state *st)
+{
+ int i, t, r;
+
+ if(st->sets)
+ free(st->sets);
+ st->sets = (int *)malloc(st->maze_size_x*st->maze_size_y*sizeof(int));
+ if(!st->sets)
+ abort();
+ for(i = 0; i < st->maze_size_x*st->maze_size_y; i++)
+ {
+ st->sets[i] = i;
+ }
+
+ if(st->hedges)
+ free(st->hedges);
+ st->hedges = (int *)malloc(st->maze_size_x*st->maze_size_y*2*sizeof(int));
+ if(!st->hedges)
+ abort();
+ for(i = 0; i < st->maze_size_x*st->maze_size_y*2; i++)
+ {
+ st->hedges[i] = i;
+ }
+ /* Mask out outside walls. */
+ for(i = 0; i < st->maze_size_y; i++)
+ {
+ st->hedges[2*((st->maze_size_x)*i+st->maze_size_x-1)+1] = -1;
+ }
+ for(i = 0; i < st->maze_size_x; i++)
+ {
+ st->hedges[2*((st->maze_size_y-1)*st->maze_size_x+i)] = -1;
+ }
+
+ /* Mask out the logo area. */
+ if(st->logo_x!=-1)
+ {
+ int logow = 1 + st->logo_width / st->grid_width;
+ int logoh = 1 + st->logo_height / st->grid_height;
+ mask_out_set_rect(st, st->logo_x, st->logo_y, logow, logoh);
+ }
+
+ /* Mask out the FPS area. */
+ if(st->fps_width > 0)
+ {
+ int fpsw = 1 + st->fps_width / st->grid_width;
+ int fpsh = 1 + st->fps_height / st->grid_height;
+ mask_out_set_rect(st, 0, st->maze_size_y-fpsh, fpsw, fpsh);
+ }
+
+ for(i = 0; i < st->maze_size_x*st->maze_size_y*2; i++)
+ {
+ t = st->hedges[i];
+ r = random()%(st->maze_size_x*st->maze_size_y*2);
+ st->hedges[i] = st->hedges[r];
+ st->hedges[r] = t;
+ }
+}
+
+/* Get the representative of a set. */
+static int
+get_set(struct state *st, int num)
+{
+ int s;
+
+ if(st->sets[num]==num)
+ return num;
+ else
+ {
+ s = get_set(st, st->sets[num]);
+ st->sets[num] = s;
+ return s;
+ }
+}
+
+/* Join two sets together. */
+static void
+join_sets(struct state *st, int num1, int num2)
+{
+ int s1, s2;
+
+ s1 = get_set(st, num1);
+ s2 = get_set(st, num2);
+
+ if(s1<s2)
+ st->sets[s2] = s1;
+ else
+ st->sets[s1] = s2;
+}
+
+/* Exitialise the sets. */
+static void
+exit_sets(struct state *st)
+{
+ if(st->hedges)
+ free(st->hedges);
+ st->hedges = 0;
+ if(st->sets)
+ free(st->sets);
+ st->sets = 0;
+}
+
+
+static void
+set_create_maze(struct state *st)
+{
+ int i, h, xx, yy, dir, v, w;
+
+ /* Do almost all the setup. */
+ init_sets(st);
+
+ /* Start running through the hedges. */
+ for(i = 0; i < 2*st->maze_size_x*st->maze_size_y; i++)
+ {
+ h = st->hedges[i];
+
+ /* This one is in the logo or outside border. */
+ if(h==-1)
+ continue;
+
+ dir = h%2?1:2;
+ xx = (h>>1)%st->maze_size_x;
+ yy = (h>>1)/st->maze_size_x;
+
+ v = xx;
+ w = yy;
+ switch(dir)
+ {
+ case 1:
+ v++;
+ break;
+ case 2:
+ w++;
+ break;
+ }
+
+ if(get_set(st, xx+yy*st->maze_size_x)!=get_set(st, v+w*st->maze_size_x))
+ {
+ join_sets(st, xx+yy*st->maze_size_x, v+w*st->maze_size_x);
+ /* Don't draw the wall. */
+ }
+ else
+ {
+ /* Don't join the sets. */
+ build_wall(st, xx, yy, dir);
+ }
+ }
+
+ /* Free some memory. */
+ exit_sets(st);
+}
+
+/* mark a rectangle as being unavailable for usage in the maze */
+static void
+mask_out_set_rect(struct state *st, int x, int y, int w, int h)
+{
+ int xx, yy;
+ for(xx = x; xx < x+w; xx++)
+ for(yy = y; yy < y+h; yy++)
+ {
+ st->hedges[2*(xx+st->maze_size_x*yy)+1] = -1;
+ st->hedges[2*(xx+st->maze_size_x*yy)] = -1;
+ }
+ for(xx = x; xx < x+w; xx++)
+ {
+ build_wall(st, xx, y, 0);
+ build_wall(st, xx, y+h, 0);
+ st->hedges[2*(xx+st->maze_size_x*(y-1))] = -1;
+ }
+ for(yy = y; yy < y+h; yy++)
+ {
+ build_wall(st, x, yy, 3);
+ build_wall(st, x+w, yy, 3);
+ st->hedges[2*(x-1+st->maze_size_x*yy)+1] = -1;
+ }
+}
+
+
+/****************************************************************************
+ Generator 1: Wall-building maze generator.
+
+ Pick a random, empty corner in the maze. Pick a random direction. Draw a
+ wall in that direction, from that corner until we hit a wall. Option: Only
+ draw the wall if it's going to be shorter than a certain length. Otherwise
+ we get lots of long walls.
+
+ This is essentially the "Prim" algorithm.
+ ****************************************************************************/
+
+static void alt_mask_out_rect(struct state *st, char *corners,
+ int x, int y, int w, int h);
+
+static void
+alt_create_maze(struct state *st)
+{
+ char *corners;
+ int *c_idx;
+ int i, j, height, width, open_corners, k, dir, xx, yy;
+
+ height = st->maze_size_y+1;
+ width = st->maze_size_x+1;
+
+ /* Allocate and clear some mem. */
+ corners = (char *)calloc(height*width, 1);
+ if(!corners)
+ return;
+
+ /* Set up the indexing array. */
+ c_idx = (int *)malloc(sizeof(int)*height*width);
+ if(!c_idx)
+ {
+ free(corners);
+ return;
+ }
+ for(i = 0; i < height*width; i++)
+ c_idx[i] = i;
+ for(i = 0; i < height*width; i++)
+ {
+ j = c_idx[i];
+ k = random()%(height*width);
+ c_idx[i] = c_idx[k];
+ c_idx[k] = j;
+ }
+
+ /* Set up some initial walls. */
+ /* Outside walls. */
+ for(i = 0; i < width; i++)
+ {
+ corners[i] = 1;
+ corners[i+width*(height-1)] = 1;
+ }
+ for(i = 0; i < height; i++)
+ {
+ corners[i*width] = 1;
+ corners[i*width+width-1] = 1;
+ }
+
+ /* mask out the logo area */
+ if(st->logo_x!=-1)
+ {
+ int logow = 1 + st->logo_width / st->grid_width;
+ int logoh = 1 + st->logo_height / st->grid_height;
+ alt_mask_out_rect (st, corners, st->logo_x, st->logo_y, logow, logoh);
+ }
+
+ /* mask out the FPS area */
+ if(st->fps_width>0)
+ {
+ int fpsw = 1 + st->fps_width / st->grid_width;
+ int fpsh = 1 + st->fps_height / st->grid_height;
+ alt_mask_out_rect (st, corners, 0, st->maze_size_y-fpsh, fpsw, fpsh);
+ }
+
+ /* Count open gridpoints. */
+ open_corners = 0;
+ for(i = 0; i < width; i++)
+ for(j = 0; j < height; j++)
+ if(!corners[i+width*j])
+ open_corners++;
+
+ /* Now do actual maze generation. */
+ while(open_corners>0)
+ {
+ for(i = 0; i < width*height; i++)
+ {
+ if(!corners[c_idx[i]])
+ {
+ xx = c_idx[i]%width;
+ yy = c_idx[i]/width;
+ /* Choose a random direction. */
+ dir = random()%4;
+
+ k = 0;
+ /* Measure the length of the wall we'd draw. */
+ while(!corners[xx+width*yy])
+ {
+ k++;
+ switch(dir)
+ {
+ case 0:
+ yy--;
+ break;
+ case 1:
+ xx++;
+ break;
+ case 2:
+ yy++;
+ break;
+ case 3:
+ xx--;
+ break;
+ }
+ }
+
+ if(k<=st->max_length)
+ {
+ xx = c_idx[i]%width;
+ yy = c_idx[i]/width;
+
+ /* Draw a wall until we hit something. */
+ while(!corners[xx+width*yy])
+ {
+ open_corners--;
+ corners[xx+width*yy] = 1;
+ switch(dir)
+ {
+ case 0:
+ build_wall(st, xx-1, yy-1, 1);
+ yy--;
+ break;
+ case 1:
+ build_wall(st, xx, yy, 0);
+ xx++;
+ break;
+ case 2:
+ build_wall(st, xx, yy, 3);
+ yy++;
+ break;
+ case 3:
+ build_wall(st, xx-1, yy-1, 2);
+ xx--;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* Free some memory we used. */
+ free(corners);
+ free(c_idx);
+}
+
+
+/* mark a rectangle as being unavailable for usage in the maze */
+static void
+alt_mask_out_rect(struct state *st, char *corners, int x, int y, int w, int h)
+{
+ int i, j, xx, yy;
+ int mazew = st->maze_size_x+1;
+
+ for(i = x; i <= x+w; i++)
+ for(j = y; j <= y+h; j++)
+ corners[i+mazew*j] = 1;
+
+ for(xx = x; xx < x+w; xx++)
+ {
+ build_wall(st, xx, y, 0);
+ if (y+h < st->maze_size_y)
+ build_wall(st, xx, y+h, 0);
+ }
+ for(yy = y; yy < y+h; yy++)
+ {
+ if (x > 0)
+ build_wall(st, x, yy, 3);
+ build_wall(st, x+w, yy, 3);
+ }
+}
+
+
+/****************************************************************************
+ Generator 0: The original maze generator.
+
+ Start somewhere. Take a step in a random direction. Keep doing this until
+ we hit a wall. Then, backtrack until we find a point where we can go in
+ another direction.
+
+ This is essentially the "depth-first recursive backtracker" algorithm.
+ ****************************************************************************/
+
+static int choose_door (struct state *st);
+static int backup (struct state *st);
+
+static void
+create_maze (struct state *st) /* create a maze layout given the initialized maze */
+{
+ int i, newdoor = 0;
+
+ do {
+ st->move_list[st->sqnum].x = st->cur_sq_x;
+ st->move_list[st->sqnum].y = st->cur_sq_y;
+ st->move_list[st->sqnum].dir = newdoor;
+ while ( ( newdoor = choose_door(st) ) == -1 ) { /* pick a door */
+ if ( backup(st) == -1 ) { /* no more doors ... backup */
+ return; /* done ... return */
+ }
+ }
+
+ /* mark the out door */
+ st->maze[st->cur_sq_x][st->cur_sq_y] |= ( DOOR_OUT_TOP >> newdoor );
+
+ switch (newdoor) {
+ case 0: st->cur_sq_y--;
+ break;
+ case 1: st->cur_sq_x++;
+ break;
+ case 2: st->cur_sq_y++;
+ break;
+ case 3: st->cur_sq_x--;
+ break;
+ }
+ st->sqnum++;
+
+ /* mark the in door */
+ st->maze[st->cur_sq_x][st->cur_sq_y] |= ( DOOR_IN_TOP >> ((newdoor+2)%4) );
+
+ /* if end square set path length and save path */
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & END_SQUARE ) {
+ st->path_length = st->sqnum;
+ for ( i=0; i<st->path_length; i++) {
+ st->save_path[i].x = st->move_list[i].x;
+ st->save_path[i].y = st->move_list[i].y;
+ st->save_path[i].dir = st->move_list[i].dir;
+ }
+ }
+
+ } while (1);
+
+}
+
+
+static int
+choose_door (struct state *st) /* pick a new path */
+{
+ int candidates[3];
+ int num_candidates;
+
+ num_candidates = 0;
+
+ /* top wall */
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_IN_TOP )
+ goto rightwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_OUT_TOP )
+ goto rightwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & WALL_TOP )
+ goto rightwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y - 1] & DOOR_IN_ANY ) {
+ st->maze[st->cur_sq_x][st->cur_sq_y] |= WALL_TOP;
+ st->maze[st->cur_sq_x][st->cur_sq_y - 1] |= WALL_BOTTOM;
+ draw_wall(st, st->cur_sq_x, st->cur_sq_y, 0, st->gc);
+ goto rightwall;
+ }
+ candidates[num_candidates++] = 0;
+
+ rightwall:
+ /* right wall */
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_IN_RIGHT )
+ goto bottomwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_OUT_RIGHT )
+ goto bottomwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & WALL_RIGHT )
+ goto bottomwall;
+ if ( st->maze[st->cur_sq_x + 1][st->cur_sq_y] & DOOR_IN_ANY ) {
+ st->maze[st->cur_sq_x][st->cur_sq_y] |= WALL_RIGHT;
+ st->maze[st->cur_sq_x + 1][st->cur_sq_y] |= WALL_LEFT;
+ draw_wall(st, st->cur_sq_x, st->cur_sq_y, 1, st->gc);
+ goto bottomwall;
+ }
+ candidates[num_candidates++] = 1;
+
+ bottomwall:
+ /* bottom wall */
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_IN_BOTTOM )
+ goto leftwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_OUT_BOTTOM )
+ goto leftwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & WALL_BOTTOM )
+ goto leftwall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y + 1] & DOOR_IN_ANY ) {
+ st->maze[st->cur_sq_x][st->cur_sq_y] |= WALL_BOTTOM;
+ st->maze[st->cur_sq_x][st->cur_sq_y + 1] |= WALL_TOP;
+ draw_wall(st, st->cur_sq_x, st->cur_sq_y, 2, st->gc);
+ goto leftwall;
+ }
+ candidates[num_candidates++] = 2;
+
+ leftwall:
+ /* left wall */
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_IN_LEFT )
+ goto donewall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & DOOR_OUT_LEFT )
+ goto donewall;
+ if ( st->maze[st->cur_sq_x][st->cur_sq_y] & WALL_LEFT )
+ goto donewall;
+ if ( st->maze[st->cur_sq_x - 1][st->cur_sq_y] & DOOR_IN_ANY ) {
+ st->maze[st->cur_sq_x][st->cur_sq_y] |= WALL_LEFT;
+ st->maze[st->cur_sq_x - 1][st->cur_sq_y] |= WALL_RIGHT;
+ draw_wall(st, st->cur_sq_x, st->cur_sq_y, 3, st->gc);
+ goto donewall;
+ }
+ candidates[num_candidates++] = 3;
+
+ donewall:
+ if (num_candidates == 0)
+ return ( -1 );
+ if (num_candidates == 1)
+ return ( candidates[0] );
+ return ( candidates[ get_random(num_candidates) ] );
+
+}
+
+
+static int
+backup (struct state *st) /* back up a move */
+{
+ st->sqnum--;
+ if (st->sqnum >= 0) {
+ st->cur_sq_x = st->move_list[st->sqnum].x;
+ st->cur_sq_y = st->move_list[st->sqnum].y;
+ }
+ return ( st->sqnum );
+}
+
+
+/****************************************************************************
+ Drawing the maze
+ ****************************************************************************/
+
+/* draws the maze outline, and the logo */
+static void
+draw_maze_border (struct state *st)
+{
+ int i, j;
+
+ for ( i=0; i<st->maze_size_x; i++) {
+ if ( st->maze[i][0] & WALL_TOP ) {
+ XDrawLine(st->dpy, st->window, st->gc,
+ border_x + st->grid_width * i,
+ border_y,
+ border_x + st->grid_width * (i+1) - 1,
+ border_y);
+ }
+ if ((st->maze[i][st->maze_size_y - 1] & WALL_BOTTOM)) {
+ XDrawLine(st->dpy, st->window, st->gc,
+ border_x + st->grid_width * i,
+ border_y + st->grid_height * (st->maze_size_y) - 1,
+ border_x + st->grid_width * (i+1) - 1,
+ border_y + st->grid_height * (st->maze_size_y) - 1);
+ }
+ }
+ for ( j=0; j<st->maze_size_y; j++) {
+ if ( st->maze[st->maze_size_x - 1][j] & WALL_RIGHT ) {
+ XDrawLine(st->dpy, st->window, st->gc,
+ border_x + st->grid_width * st->maze_size_x - 1,
+ border_y + st->grid_height * j,
+ border_x + st->grid_width * st->maze_size_x - 1,
+ border_y + st->grid_height * (j+1) - 1);
+ }
+ if ( st->maze[0][j] & WALL_LEFT ) {
+ XDrawLine(st->dpy, st->window, st->gc,
+ border_x,
+ border_y + st->grid_height * j,
+ border_x,
+ border_y + st->grid_height * (j+1) - 1);
+ }
+ }
+
+ if (st->logo_x != -1)
+ {
+ Window r;
+ int xx, yy;
+ unsigned int w, h, bbw, d;
+
+ /* round up to grid size */
+ int ww = ((st->logo_width / st->grid_width) + 1) * st->grid_width;
+ int hh = ((st->logo_height / st->grid_height) + 1) * st->grid_height;
+ int lx, ly;
+
+ XGetGeometry (st->dpy, st->logo_map, &r, &xx, &yy, &w, &h, &bbw, &d);
+
+ /* kludge: if the logo "hole" is around the same size as the logo,
+ don't center it (since the xscreensaver logo image is a little
+ off center... But do center it if the hole/gridsize is large. */
+ if (ww < st->logo_width + 5) ww = w;
+ if (hh < st->logo_height + 5) hh = h;
+
+
+ lx = border_x + 3 + st->grid_width * st->logo_x + ((ww - w) / 2);
+ ly = border_y + 3 + st->grid_height * st->logo_y + ((hh - h) / 2);
+
+ /* Fill the background of the logo box with the "unreachable" color */
+ XFillRectangle (st->dpy, st->window, st->ugc,
+ border_x + 3 + st->grid_width * st->logo_x,
+ border_y + 3 + st->grid_height * st->logo_y,
+ ww, hh);
+
+ XSetClipOrigin (st->dpy, st->logo_gc, lx, ly);
+ if (d == 1)
+ XCopyPlane (st->dpy, st->logo_map, st->window, st->logo_gc,
+ 0, 0, w, h, lx, ly, 1);
+ else
+ XCopyArea (st->dpy, st->logo_map, st->window, st->logo_gc,
+ 0, 0, w, h, lx, ly);
+ }
+ draw_solid_square (st, st->start_x, st->start_y, WALL_TOP >> st->start_dir, st->tgc);
+ draw_solid_square (st, st->end_x, st->end_y, WALL_TOP >> st->end_dir, st->tgc);
+}
+
+
+/* Mark the maze grid as having a wall at the given coordinate,
+ and draw that wall on the screen. */
+static void
+build_wall(struct state *st, int i, int j, int dir)
+{
+ /* Draw it on the screen. */
+ draw_wall(st, i, j, dir, st->gc);
+ /* Put it in the maze. */
+ switch(dir)
+ {
+ case 0:
+ st->maze[i][j] |= WALL_TOP;
+ if(j>0)
+ st->maze[i][j-1] |= WALL_BOTTOM;
+ break;
+ case 1:
+ st->maze[i][j] |= WALL_RIGHT;
+ if(i<st->maze_size_x-1)
+ st->maze[i+1][j] |= WALL_LEFT;
+ break;
+ case 2:
+ st->maze[i][j] |= WALL_BOTTOM;
+ if(j<st->maze_size_y-1)
+ st->maze[i][j+1] |= WALL_TOP;
+ break;
+ case 3:
+ st->maze[i][j] |= WALL_LEFT;
+ if(i>0)
+ st->maze[i-1][j] |= WALL_RIGHT;
+ break;
+ }
+}
+
+
+static void
+draw_wall(struct state *st, int i, int j, int dir, GC with_gc) /* draw a single wall */
+{
+ switch (dir) {
+ case 0:
+ XDrawLine(st->dpy, st->window, with_gc,
+ border_x + st->grid_width * i,
+ border_y + st->grid_height * j,
+ border_x + st->grid_width * (i+1),
+ border_y + st->grid_height * j);
+ break;
+ case 1:
+ XDrawLine(st->dpy, st->window, with_gc,
+ border_x + st->grid_width * (i+1),
+ border_y + st->grid_height * j,
+ border_x + st->grid_width * (i+1),
+ border_y + st->grid_height * (j+1));
+ break;
+ case 2:
+ XDrawLine(st->dpy, st->window, with_gc,
+ border_x + st->grid_width * i,
+ border_y + st->grid_height * (j+1),
+ border_x + st->grid_width * (i+1),
+ border_y + st->grid_height * (j+1));
+ break;
+ case 3:
+ XDrawLine(st->dpy, st->window, with_gc,
+ border_x + st->grid_width * i,
+ border_y + st->grid_height * j,
+ border_x + st->grid_width * i,
+ border_y + st->grid_height * (j+1));
+ break;
+ }
+
+ if(st->sync_p) {
+ /* too slow if we sync on every wall, so only sync about ten times
+ during the maze-creation process.
+ */
+ st->sync_tick--;
+ if (st->sync_tick <= 0) {
+ XSync(st->dpy, False);
+ st->sync_tick = st->maze_size_x * st->maze_size_x / 10;
+ }
+ }
+}
+
+
+static void
+draw_solid_square(struct state *st,
+ int i, int j,
+ int dir, GC with_gc)
+{
+ switch (dir) {
+ case WALL_TOP:
+ XFillRectangle(st->dpy, st->window, with_gc,
+ border_x + st->bw+(st->bw==0?1:0) + st->grid_width * i,
+ border_y - st->bw-(st->bw==0?1:0) + st->grid_height * j,
+ st->grid_width - (st->bw+st->bw+(st->bw==0?1:0)), st->grid_height);
+ break;
+ case WALL_RIGHT:
+ XFillRectangle(st->dpy, st->window, with_gc,
+ border_x + st->bw+(st->bw==0?1:0) + st->grid_width * i,
+ border_y + st->bw+(st->bw==0?1:0) + st->grid_height * j,
+ st->grid_width, st->grid_height - (st->bw+st->bw+(st->bw==0?1:0)));
+ break;
+ case WALL_BOTTOM:
+ XFillRectangle(st->dpy, st->window, with_gc,
+ border_x + st->bw+(st->bw==0?1:0) + st->grid_width * i,
+ border_y + st->bw+(st->bw==0?1:0) + st->grid_height * j,
+ st->grid_width - (st->bw+st->bw+(st->bw==0?1:0)), st->grid_height);
+ break;
+ case WALL_LEFT:
+ XFillRectangle(st->dpy, st->window, with_gc,
+ border_x - st->bw-(st->bw==0?1:0) + st->grid_width * i,
+ border_y + st->bw+(st->bw==0?1:0) + st->grid_height * j,
+ st->grid_width, st->grid_height - (st->bw+st->bw+(st->bw==0?1:0)));
+ break;
+ }
+}
+
+/****************************************************************************
+ Solving the maze
+ ****************************************************************************/
+
+static int
+longdeadend_p(struct state *st, int x1, int y1, int x2, int y2, int endwall)
+{
+ int dx = x2 - x1, dy = y2 - y1;
+ int sidewalls;
+
+ sidewalls = endwall | (endwall >> 2 | endwall << 2);
+ sidewalls = ~sidewalls & WALL_ANY;
+
+ while((st->maze[x2][y2] & WALL_ANY) == sidewalls)
+ {
+ if (x2 + dx < 0 || x2 + dx >= st->maze_size_x ||
+ y2 + dy < 0 || y2 + dy >= st->maze_size_y)
+ break;
+ x2 += dx;
+ y2 += dy;
+ }
+
+ if((st->maze[x2][y2] & WALL_ANY) == (sidewalls | endwall))
+ {
+ endwall = (endwall >> 2 | endwall << 2) & WALL_ANY;
+ while(x1 != x2 || y1 != y2)
+ {
+ x1 += dx;
+ y1 += dy;
+ draw_solid_square(st, x1, y1, endwall, st->sgc);
+ st->maze[x1][y1] |= SOLVER_VISIT;
+ }
+ return 1;
+ }
+ else
+ return 0;
+}
+
+/* Find all dead regions -- areas from which the goal cannot be reached --
+ and mark them visited. */
+static void
+find_dead_regions(struct state *st)
+{
+ int xx, yy, flipped;
+
+ /* Find all not SOLVER_VISIT squares bordering NOT_DEAD squares
+ and mark them NOT_DEAD also. Repeat until no more such squares. */
+ st->maze[st->start_x][st->start_y] |= NOT_DEAD;
+
+ do
+ {
+ flipped = 0;
+ for(xx = 0; xx < st->maze_size_x; xx++)
+ for(yy = 0; yy < st->maze_size_y; yy++)
+ if(!(st->maze[xx][yy] & (SOLVER_VISIT | NOT_DEAD))
+ && ( (xx && (st->maze[xx-1][yy] & NOT_DEAD))
+ || (yy && (st->maze[xx][yy-1] & NOT_DEAD))))
+ {
+ flipped = 1;
+ st->maze[xx][yy] |= NOT_DEAD;
+ }
+ for(xx = st->maze_size_x-1; xx >= 0; xx--)
+ for(yy = st->maze_size_y-1; yy >= 0; yy--)
+ if(!(st->maze[xx][yy] & (SOLVER_VISIT | NOT_DEAD))
+ && ( (xx != st->maze_size_x-1 && (st->maze[xx+1][yy] & NOT_DEAD))
+ || (yy != st->maze_size_y-1 && (st->maze[xx][yy+1] & NOT_DEAD))))
+ {
+ flipped = 1;
+ st->maze[xx][yy] |= NOT_DEAD;
+ }
+ }
+ while(flipped);
+
+ for (yy = 0; yy < st->maze_size_y; yy++)
+ for (xx = 0; xx < st->maze_size_x; xx++)
+ {
+ if (st->maze[xx][yy] & NOT_DEAD)
+ st->maze[xx][yy] &= ~NOT_DEAD;
+ else if (!(st->maze[xx][yy] & SOLVER_VISIT))
+ {
+ st->maze[xx][yy] |= SOLVER_VISIT;
+ if((xx < st->logo_x || xx > st->logo_x + st->logo_width / st->grid_width) ||
+ (yy < st->logo_y || yy > st->logo_y + st->logo_height / st->grid_height))
+ {
+ /* if we are completely surrounded by walls, just draw the
+ inside part */
+ if ((st->maze[xx][yy] & WALL_ANY) == WALL_ANY)
+ XFillRectangle(st->dpy, st->window, st->ugc,
+ border_x + st->bw + st->grid_width * xx,
+ border_y + st->bw + st->grid_height * yy,
+ st->grid_width - (st->bw+st->bw), st->grid_height - (st->bw+st->bw));
+ else
+ {
+ if (! (st->maze[xx][yy] & WALL_LEFT))
+ draw_solid_square(st, xx, yy, WALL_LEFT, st->ugc);
+ if (! (st->maze[xx][yy] & WALL_RIGHT))
+ draw_solid_square(st, xx, yy, WALL_RIGHT, st->ugc);
+ if (! (st->maze[xx][yy] & WALL_TOP))
+ draw_solid_square(st, xx, yy, WALL_TOP, st->ugc);
+ if (! (st->maze[xx][yy] & WALL_BOTTOM))
+ draw_solid_square(st, xx, yy, WALL_BOTTOM, st->ugc);
+ }
+ }
+ }
+ }
+}
+
+/* solve the maze by one more tick */
+static int
+solve_maze (struct state *st)
+{
+ struct solve_state *ss = st->solve_state;
+ if (!ss)
+ ss = st->solve_state = (struct solve_state *) calloc (1, sizeof(*ss));
+
+ if (!ss->running) {
+ /* plug up the surrounding wall */
+ st->maze[st->end_x][st->end_y] |= (WALL_TOP >> st->end_dir);
+
+ /* initialize search path */
+ ss->i = 0;
+ st->path[ss->i].x = st->end_x;
+ st->path[ss->i].y = st->end_y;
+ st->path[ss->i].dir = 0;
+ st->maze[st->end_x][st->end_y] |= SOLVER_VISIT;
+
+ ss->running = 1;
+ }
+
+ /* do it */
+ /* while (1) */
+ {
+ int dir, from, ways;
+
+ if ( st->maze[st->path[ss->i].x][st->path[ss->i].y] & START_SQUARE )
+ {
+ ss->running = 0;
+ return 1;
+ }
+
+ if(!st->path[ss->i].dir)
+ {
+ ways = 0;
+ /* First visit this square. Which adjacent squares are open? */
+ for(dir = WALL_TOP; dir & WALL_ANY; dir >>= 1)
+ {
+ if(st->maze[st->path[ss->i].x][st->path[ss->i].y] & dir)
+ continue;
+
+ ss->y = st->path[ss->i].y - !!(dir & WALL_TOP) + !!(dir & WALL_BOTTOM);
+ ss->x = st->path[ss->i].x + !!(dir & WALL_RIGHT) - !!(dir & WALL_LEFT);
+
+ if(st->maze[ss->x][ss->y] & SOLVER_VISIT)
+ continue;
+
+ from = (dir << 2 & WALL_ANY) | (dir >> 2 & WALL_ANY);
+ /* don't enter obvious dead ends */
+ if(((st->maze[ss->x][ss->y] & WALL_ANY) | from) != WALL_ANY)
+ {
+ if(!longdeadend_p(st, st->path[ss->i].x, st->path[ss->i].y, ss->x, ss->y, dir))
+ ways |= dir;
+ }
+ else
+ {
+ draw_solid_square(st, ss->x, ss->y, from, st->sgc);
+ st->maze[ss->x][ss->y] |= SOLVER_VISIT;
+ }
+ }
+ }
+ else
+ ways = st->path[ss->i].ways;
+ /* ways now has a bitmask of open paths. */
+
+ if(!ways)
+ goto backtrack;
+
+ if (!st->ignorant_p)
+ {
+ ss->x = st->path[ss->i].x - st->start_x;
+ ss->y = st->path[ss->i].y - st->start_y;
+ /* choice one */
+ if(abs(ss->y) <= abs(ss->x))
+ dir = (ss->x > 0) ? WALL_LEFT : WALL_RIGHT;
+ else
+ dir = (ss->y > 0) ? WALL_TOP : WALL_BOTTOM;
+
+ if(dir & ways)
+ goto found;
+
+ /* choice two */
+ switch(dir)
+ {
+ case WALL_LEFT:
+ case WALL_RIGHT:
+ dir = (ss->y > 0) ? WALL_TOP : WALL_BOTTOM; break;
+ case WALL_TOP:
+ case WALL_BOTTOM:
+ dir = (ss->x > 0) ? WALL_LEFT : WALL_RIGHT;
+ }
+
+ if(dir & ways)
+ goto found;
+
+ /* choice three */
+
+ dir = (dir << 2 & WALL_ANY) | (dir >> 2 & WALL_ANY);
+ if(dir & ways)
+ goto found;
+
+ /* choice four */
+ dir = ways;
+ if(!dir)
+ goto backtrack;
+
+ found: ;
+ }
+ else
+ {
+ if(ways&WALL_TOP)
+ dir = WALL_TOP;
+ else if(ways&WALL_LEFT)
+ dir = WALL_LEFT;
+ else if(ways&WALL_BOTTOM)
+ dir = WALL_BOTTOM;
+ else if(ways&WALL_RIGHT)
+ dir = WALL_RIGHT;
+ else
+ goto backtrack;
+ }
+ ss->bt = 0;
+ ways &= ~dir; /* tried this one */
+
+ ss->y = st->path[ss->i].y - !!(dir & WALL_TOP) + !!(dir & WALL_BOTTOM);
+ ss->x = st->path[ss->i].x + !!(dir & WALL_RIGHT) - !!(dir & WALL_LEFT);
+
+ /* advance in direction dir */
+ st->path[ss->i].dir = dir;
+ st->path[ss->i].ways = ways;
+ draw_solid_square(st, st->path[ss->i].x, st->path[ss->i].y, dir, st->tgc);
+
+ ss->i++;
+ st->path[ss->i].dir = 0;
+ st->path[ss->i].ways = 0;
+ st->path[ss->i].x = ss->x;
+ st->path[ss->i].y = ss->y;
+ st->maze[ss->x][ss->y] |= SOLVER_VISIT;
+ return 0;
+ /* continue; */
+
+ backtrack:
+ if(ss->i == 0)
+ {
+ printf("Unsolvable maze.\n");
+ ss->running = 0;
+ return 1;
+ }
+
+ if(!ss->bt && !st->ignorant_p)
+ find_dead_regions(st);
+ ss->bt = 1;
+ from = st->path[ss->i-1].dir;
+ from = (from << 2 & WALL_ANY) | (from >> 2 & WALL_ANY);
+
+ draw_solid_square(st, st->path[ss->i].x, st->path[ss->i].y, from, st->cgc);
+ ss->i--;
+ }
+
+ return 0;
+}
+
+
+/****************************************************************************
+ XScreenSaver boilerplate: resources, command line options, and main loop.
+ ****************************************************************************/
+
+static const char *maze_defaults[] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*gridSize: 0",
+ "*generator: -1",
+ "*maxLength: 5",
+ "*ignorant: False",
+
+ "*solveDelay: 10000",
+ "*preDelay: 2000000",
+ "*postDelay: 4000000",
+
+ "*liveColor: #00FF00",
+ "*deadColor: #880000",
+ "*skipColor: #8B5A00",
+ "*surroundColor: #220055",
+
+ 0
+};
+
+static XrmOptionDescRec maze_options[] = {
+ { "-ignorant", ".ignorant", XrmoptionNoArg, "True" },
+ { "-no-ignorant", ".ignorant", XrmoptionNoArg, "False" },
+ { "-grid-size", ".gridSize", XrmoptionSepArg, 0 },
+ { "-solve-delay", ".solveDelay", XrmoptionSepArg, 0 },
+ { "-pre-delay", ".preDelay", XrmoptionSepArg, 0 },
+ { "-post-delay", ".postDelay", XrmoptionSepArg, 0 },
+ { "-bg-color", ".background", XrmoptionSepArg, 0 },
+ { "-fg-color", ".foreground", XrmoptionSepArg, 0 },
+ { "-live-color", ".liveColor", XrmoptionSepArg, 0 },
+ { "-dead-color", ".deadColor", XrmoptionSepArg, 0 },
+ { "-skip-color", ".skipColor", XrmoptionSepArg, 0 },
+ { "-surround-color", ".surroundColor",XrmoptionSepArg, 0 },
+ { "-generator", ".generator", XrmoptionSepArg, 0 },
+ { "-max-length", ".maxLength", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+static int generator = 0;
+
+static void *
+maze_init (Display *dpy_arg, Window window_arg)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int size;
+ XWindowAttributes xgwa;
+ unsigned long bg, fg, pfg, pbg, sfg, ufg;
+
+ st->dpy = dpy_arg;
+ st->window = window_arg;
+
+ st->stop = 0;
+ st->state = 1;
+ st->restart = 1;
+
+ st->ifrandom = 0;
+ st->ifinit = 1;
+
+ size = get_integer_resource (st->dpy, "gridSize", "Dimension");
+ st->solve_delay = get_integer_resource (st->dpy, "solveDelay", "Integer");
+ st->pre_solve_delay = get_integer_resource (st->dpy, "preDelay", "Integer");
+ st->post_solve_delay = get_integer_resource (st->dpy, "postDelay", "Integer");
+ generator = get_integer_resource(st->dpy, "generator", "Integer");
+ st->max_length = get_integer_resource(st->dpy, "maxLength", "Integer");
+ st->ignorant_p = get_boolean_resource(st->dpy, "ignorant", "Boolean");
+
+ if (get_boolean_resource (st->dpy, "doFPS", "DoFPS"))
+ {
+ /* Just guess, rather than loading and measuring the "fpsFont"... */
+ st->fps_width = 210;
+ st->fps_height = 62;
+ }
+
+ if (!size) st->ifrandom = 1;
+
+ if (size < 2) size = 7 + (random () % 30);
+ st->grid_width = st->grid_height = size;
+ st->bw = (size > 6 ? 3 : (size-1)/2);
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->x = 0;
+ st->y = 0;
+
+ set_maze_sizes (st, xgwa.width, xgwa.height);
+
+ st->gc = XCreateGC(st->dpy, st->window, 0, 0);
+ st->cgc = XCreateGC(st->dpy, st->window, 0, 0);
+ st->tgc = XCreateGC(st->dpy, st->window, 0, 0);
+ st->sgc = XCreateGC(st->dpy, st->window, 0, 0);
+ st->ugc = XCreateGC(st->dpy, st->window, 0, 0);
+ st->logo_gc = XCreateGC(st->dpy, st->window, 0, 0);
+ st->erase_gc = XCreateGC(st->dpy, st->window, 0, 0);
+
+ bg = get_pixel_resource (st->dpy, xgwa.colormap, "background","Background");
+ fg = get_pixel_resource (st->dpy, xgwa.colormap, "foreground","Foreground");
+ pfg = get_pixel_resource (st->dpy, xgwa.colormap, "liveColor", "Foreground");
+ pbg = get_pixel_resource (st->dpy, xgwa.colormap, "deadColor", "Foreground");
+ sfg = get_pixel_resource (st->dpy, xgwa.colormap, "skipColor", "Foreground");
+ ufg = get_pixel_resource (st->dpy, xgwa.colormap, "surroundColor", "Foreground");
+
+ XSetForeground (st->dpy, st->gc, fg);
+ XSetBackground (st->dpy, st->gc, bg);
+ XSetForeground (st->dpy, st->cgc, pbg);
+ XSetBackground (st->dpy, st->cgc, bg);
+ XSetForeground (st->dpy, st->tgc, pfg);
+ XSetBackground (st->dpy, st->tgc, bg);
+ XSetForeground (st->dpy, st->sgc, sfg);
+ XSetBackground (st->dpy, st->sgc, bg);
+ XSetForeground (st->dpy, st->ugc, ufg);
+ XSetBackground (st->dpy, st->ugc, bg);
+ XSetForeground (st->dpy, st->logo_gc, fg);
+ XSetBackground (st->dpy, st->logo_gc, bg);
+ XSetForeground (st->dpy, st->erase_gc, bg);
+ XSetBackground (st->dpy, st->erase_gc, bg);
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (st->dpy, st->gc, False);
+# endif
+
+ {
+ Pixmap logo_mask = 0;
+ if (xgwa.width > 900 || xgwa.height > 900)
+ st->logo_map = image_data_to_pixmap (st->dpy, st->window,
+ logo_180_png, sizeof(logo_180_png),
+ &st->logo_width, &st->logo_height,
+ &logo_mask);
+ else
+ st->logo_map = image_data_to_pixmap (st->dpy, st->window,
+ logo_50_png, sizeof(logo_50_png),
+ &st->logo_width, &st->logo_height,
+ &logo_mask);
+ if (logo_mask) {
+ XSetClipMask (st->dpy, st->logo_gc, logo_mask);
+ XFreePixmap (st->dpy, logo_mask);
+ }
+ }
+
+ st->restart = 0;
+ st->sync_p = 1;
+
+ return st;
+}
+
+
+static void
+maze_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->restart = 1;
+}
+
+
+static unsigned long
+maze_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->solve_delay;
+
+ if (st->eraser || st->erase_window)
+ {
+ st->erase_window = 0;
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ if (st->eraser)
+ this_delay = 10000;
+ else {
+ this_delay = 1000000;
+ if (this_delay > st->pre_solve_delay)
+ this_delay = st->pre_solve_delay;
+ }
+ goto END;
+ }
+
+ if (st->restart || st->stop) goto pop;
+ switch (st->state) {
+ case 1:
+ initialize_maze(st);
+ if (st->ifrandom && st->ifinit)
+ {
+ int size;
+ size = 7 + (random () % 30);
+ st->grid_width = st->grid_height = size;
+ st->bw = (size > 6 ? 3 : (size-1)/2);
+ st->ifinit = 0;
+ st->restart = 1;
+ }
+ break;
+ case 2:
+ XClearWindow(st->dpy, st->window);
+ draw_maze_border(st);
+ break;
+ case 3:
+ st->this_gen = generator;
+ if(st->this_gen<0 || st->this_gen>2)
+ st->this_gen = random()%3;
+
+ switch(st->this_gen)
+ {
+ case 0:
+ create_maze(st);
+ break;
+ case 1:
+ alt_create_maze(st);
+ break;
+ case 2:
+ set_create_maze(st);
+ break;
+ }
+ break;
+ case 4:
+ this_delay = st->pre_solve_delay;
+ break;
+ case 5:
+ if (! solve_maze(st))
+ --st->state; /* stay in state 5 */
+ break;
+ case 6:
+ st->erase_window = 1;
+ this_delay = st->post_solve_delay;
+ st->state = 0 ;
+ st->ifinit = 1;
+ break;
+ default:
+ abort ();
+ }
+ ++st->state;
+ pop:
+ if (st->restart)
+ {
+ XWindowAttributes xgwa;
+ int size;
+
+ st->restart = 0;
+ st->stop = 0;
+ st->state = 1;
+
+ if (st->solve_state && st->solve_state->running)
+ st->solve_state->running = 0;
+
+ st->sync_p = ((random() % 4) != 0);
+
+ size = get_integer_resource (st->dpy, "gridSize", "Dimension");
+ if (size < 2) size = 7 + (random () % 30);
+ st->grid_width = st->grid_height = size;
+ st->bw = (size > 6 ? 3 : (size-1)/2);
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ set_maze_sizes (st, xgwa.width, xgwa.height);
+ }
+
+ END:
+ return this_delay;
+}
+
+
+static Bool
+maze_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->type == ButtonPress)
+ {
+ switch (event->xbutton.button)
+ {
+ case 2:
+ st->stop = !st->stop ;
+ if (st->state == 5) st->state = 4 ;
+ else {
+ st->restart = 1;
+ st->stop = 0;
+ }
+ return True;
+
+ default:
+ st->restart = 1 ;
+ st->stop = 0 ;
+ return True;
+ }
+ }
+ else if (event->type == Expose)
+ {
+ st->restart = 1;
+ return False;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ {
+ st->restart = 1 ;
+ st->stop = 0 ;
+ return True;
+ }
+ return False;
+}
+
+
+static void
+maze_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Maze", maze)
diff --git a/hacks/maze.man b/hacks/maze.man
new file mode 100644
index 0000000..c827da8
--- /dev/null
+++ b/hacks/maze.man
@@ -0,0 +1,148 @@
+.TH XScreenSaver 1 "7-mar-93" "X Version 11"
+.SH NAME
+maze \- an automated X11 demo repeatedly creating and solving a random maze
+.SH SYNOPSIS
+.B maze
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-grid\-size \fIpixels\fP] [\-live\-color \fIcolor\fP] [\-dead\-color \fIcolor\fP] [\-solve\-delay \fIusecs\fP] [\-pre\-delay \fIusecs\fP] [\-post\-delay \fIusecs\fP] [\-generator \fIinteger\fP] [\-max\-length \fIinteger\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fImaze\fP program creates a "random" maze and then solves it with
+graphical feedback.
+.SH OPTIONS
+.I maze
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-grid\-size \fIpixels\fP
+The size of each block of the maze, in pixels; default is 0, meaning
+pick a random grid size. Minimum meaningful value is 2.
+.TP 8
+.B \-live\-color \fIcolor\fP
+The color of the path.
+.TP 8
+.B \-dead\-color \fIcolor\fP
+The color of the failed path (it is also stippled with a 50% pattern.)
+.TP 8
+.B \-skip\-color \fIcolor\fP
+The maze solver will choose to not go down a path if it can "see" (in a
+straight line) that it is a dead end. This is the color to use for paths
+that are skipped for this reason.
+.TP 8
+.B \-surround\-color \fIcolor\fP
+If the maze solver ever completely encloses an area within the maze, then
+it knows that the exit is not in there (and in fact the interior of that
+area might not even be reachable.) It will mark out those cells using this
+color.
+.TP 8
+.B \-solve\-delay \fIinteger\fP
+Delay (in microseconds) between each step of the solution path.
+Default 5000, or about 1/200th second.
+.TP 8
+.B \-pre\-delay \fIinteger\fP
+Delay (in microseconds) between generating a maze and starting to solve it.
+Default 2000000 (2 seconds.)
+.TP 8
+.B \-post\-delay \fIinteger\fP
+Delay (in microseconds) after solving a maze and before generating a new one.
+Default 4000000 (4 seconds.)
+.TP 8
+.B \-generator \fInum\fP
+Sets the algorithm that will be used to generate the mazes. The
+default is \-1, which randomly selects an algorithm for each maze that
+is generated. Generator 0 is the original one, and works by walking
+around randomly until we hit a place we've been before, then
+backtracking and trying a new direction somewhere. Generator 1 picks a
+random spot in the maze, then draws a straight wall from that spot in
+a random direction until it hits another wall (and continues until the
+maze is complete). Generator 2 is based on sets. Initially all cells
+are in different sets. Then two neighboring cells are chosen and if
+they are in different sets, their sets are joined. If they were in the
+same set, a wall is built between them. This continues until the maze is
+complete.
+
+All generators generate mazes with a certain 'characteristic'. See if you
+can spot them!
+
+The three algorithms are essentially Kruskal, Prim, and a depth-first
+recursive backtracker.
+.TP 8
+.B \-max\-length \fInum\fP
+Controls the maximum length of walls drawn in one go by generator 1.
+.PP
+Clicking the mouse in the maze window controls it.
+.TP 16
+.B "LeftButton
+Clears the window and restarts maze.
+.TP 16
+.B MiddleButton
+Pause or unpause the program.
+.TP 16
+.B RightButton
+Exit.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH BUGS
+Expose events force a restart of maze.
+
+Mouse actions are based on "raw" values (Button1, Button2 and Button3)
+instead of using the pointer map.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+.PP
+Copyright \(co 1988 by Sun Microsystems, Inc. Mountain View, CA.
+.PP
+All Rights Reserved
+.PP
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and that
+the names of Sun or MIT not be used in advertising or publicity pertaining to
+distribution of the software without specific prior written permission. Sun
+and M.I.T. make no representations about the suitability of this software for
+any purpose. It is provided "as is" without any express or implied warranty.
+.PP
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN
+NO EVENT SHALL SUN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.SH AUTHOR(s)
+.nf
+Zack Weinberg [ Smarter maze-solver ] zack@rabi.phys.columbia.edu
+Johannes Keukelaar [ Generators 1 and 2 ] johannes@nada.kth.se
+ Royal Institute of Technology, Stockholm, Sweden
+Jim Randell [ XScreenSaver version ] jmr@mddjmr.fc.hp.com
+ HPLabs, Bristol
+Richard Hess [ X11 extensions ] {...}!uunet!cimshop!rhess
+ Consilium, Mountain View, CA
+Dave Lemke [ X11 version ] lemke@sun.COM
+ Sun MicroSystems, Mountain View, CA
+Martin Weiss [ SunView version ]
+ Sun MicroSystems, Mountain View, CA
+.fi
diff --git a/hacks/memscroller.c b/hacks/memscroller.c
new file mode 100644
index 0000000..2ccc8ad
--- /dev/null
+++ b/hacks/memscroller.c
@@ -0,0 +1,636 @@
+/* xscreensaver, Copyright (c) 2002-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Memscroller -- scrolls a dump of its own RAM across the screen.
+ */
+
+#include "screenhack.h"
+#include "xshm.h"
+#include <stdio.h>
+
+#undef countof
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+
+#ifndef HAVE_MOBILE
+# define READ_FILES
+#endif
+
+typedef struct {
+ int which;
+ XRectangle rect;
+ XImage *image;
+ int rez;
+ int speed;
+ int scroll_tick;
+ unsigned int value;
+ unsigned char *data;
+ int count_zero;
+} scroller;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ GC draw_gc, erase_gc, text_gc;
+ XFontStruct *fonts[6];
+ int border;
+
+ enum { SEED_RAM, SEED_RANDOM, SEED_FILE } seed_mode;
+ enum { DRAW_COLOR, DRAW_MONO } draw_mode;
+
+ char *filename;
+ FILE *in;
+
+ int nscrollers;
+ scroller *scrollers;
+
+ XShmSegmentInfo shm_info;
+
+ int delay;
+
+} state;
+
+
+static void reshape_memscroller (state *st);
+
+
+static void *
+memscroller_init (Display *dpy, Window window)
+{
+ int i;
+ XGCValues gcv;
+ state *st = (state *) calloc (1, sizeof (*st));
+ char *s;
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ /* Fill up the colormap with random colors.
+ We don't actually use these explicitly, but in 8-bit mode,
+ they will be used implicitly by the random image bits. */
+ {
+ int ncolors = 255;
+ XColor colors[256];
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ colors, &ncolors, True, True, 0, False);
+ }
+
+ st->border = get_integer_resource (dpy, "borderSize", "BorderSize");
+ if (st->xgwa.width > 2560) st->border *= 2; /* Retina displays */
+
+ {
+ int i;
+ int nfonts = countof (st->fonts);
+ for (i = nfonts-1; i >= 0; i--)
+ {
+ char *fontname;
+ char res[20];
+ sprintf (res, "font%d", i+1);
+ fontname = get_string_resource (dpy, res, "Font");
+ /* Each resource can be a comma-separated list of font names.
+ We use the first one that exists. */
+ if (fontname && *fontname)
+ {
+ char *f2 = strdup(fontname);
+ char *f, *token = f2;
+ while ((f = strtok(token, ",")) && !st->fonts[i])
+ {
+ token = 0;
+ while (*f == ' ' || *f == '\t') f++;
+ st->fonts[i] = load_font_retry (dpy, f);
+ }
+ free (f2);
+ if (!st->fonts[i] && i < nfonts-1)
+ {
+ fprintf (stderr, "%s: unable to load font: \"%s\"\n",
+ progname, fontname);
+ st->fonts[i] = st->fonts[i+1];
+ }
+ }
+ }
+
+ if (!st->fonts[0])
+ st->fonts[0] = load_font_retry (dpy, "fixed");
+ if (!st->fonts[0]) abort();
+ }
+
+ gcv.line_width = st->border;
+
+ gcv.background = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "textColor", "Foreground");
+ st->text_gc = XCreateGC (st->dpy, st->window,
+ GCForeground|GCBackground, &gcv);
+
+ gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->draw_gc = XCreateGC (st->dpy, st->window,
+ GCForeground|GCBackground|GCLineWidth,
+ &gcv);
+ gcv.foreground = gcv.background;
+ st->erase_gc = XCreateGC (st->dpy, st->window,
+ GCForeground|GCBackground, &gcv);
+
+
+ s = get_string_resource (dpy, "drawMode", "DrawMode");
+ if (!s || !*s || !strcasecmp (s, "color"))
+ st->draw_mode = DRAW_COLOR;
+ else if (!strcasecmp (s, "mono"))
+ st->draw_mode = DRAW_MONO;
+ else
+ {
+ fprintf (stderr, "%s: drawMode must be 'mono' or 'color', not '%s'\n",
+ progname, s);
+ exit (1);
+ }
+ if (s) free (s);
+ s = 0;
+
+
+# ifdef READ_FILES
+ st->filename = get_string_resource (dpy, "filename", "Filename");
+# endif
+
+ if (!st->filename ||
+ !*st->filename ||
+ !strcasecmp (st->filename, "(ram)") ||
+ !strcasecmp (st->filename, "(mem)") ||
+ !strcasecmp (st->filename, "(memory)"))
+ st->seed_mode = SEED_RAM;
+# ifdef READ_FILES
+ else if (st->filename &&
+ (!strcasecmp (st->filename, "(rand)") ||
+ !strcasecmp (st->filename, "(random)")))
+ st->seed_mode = SEED_RANDOM;
+ else
+ st->seed_mode = SEED_FILE;
+# else
+ st->seed_mode = SEED_RANDOM;
+# endif
+
+ st->nscrollers = 3;
+ st->scrollers = (scroller *) calloc (st->nscrollers, sizeof(scroller));
+
+ for (i = 0; i < st->nscrollers; i++)
+ {
+ scroller *sc = &st->scrollers[i];
+ int max_height = 4096;
+
+ sc->which = i;
+ sc->speed = i+1;
+
+ if (st->xgwa.width > 2560) sc->speed *= 2.5; /* Retina displays */
+
+ sc->image = create_xshm_image (st->dpy, st->xgwa.visual,
+ st->xgwa.depth,
+ ZPixmap, &st->shm_info,
+ 1, max_height);
+
+ if (!sc->image)
+ {
+ fprintf (stderr, "%s: out of memory (allocating 1x%d image)\n",
+ progname, sc->image->height);
+ exit (1);
+ }
+ }
+
+ reshape_memscroller (st);
+ return st;
+}
+
+
+static void
+reshape_memscroller (state *st)
+{
+ int i;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ for (i = 0; i < st->nscrollers; i++)
+ {
+ scroller *sc = &st->scrollers[i];
+
+ if (i == 0)
+ {
+ sc->rez = 6; /* #### */
+
+ if (st->xgwa.width > 2560) sc->rez *= 2.5; /* Retina displays */
+
+ sc->rect.width = (((int) (st->xgwa.width * 0.8)
+ / sc->rez) * sc->rez);
+ sc->rect.height = (((int) (st->xgwa.height * 0.3)
+ / sc->rez) * sc->rez);
+
+ sc->rect.x = (st->xgwa.width - sc->rect.width) / 2;
+ sc->rect.y = (st->xgwa.height - sc->rect.height) / 2;
+ }
+ else
+ {
+ scroller *sc0 = &st->scrollers[i-1];
+ sc->rez = sc0->rez * 1.8;
+
+ sc->rect.x = sc0->rect.x;
+ sc->rect.y = (sc0->rect.y + sc0->rect.height + st->border
+ + (st->border + 2) * 7);
+ sc->rect.width = sc0->rect.width;
+ sc->rect.height = (((int) (st->xgwa.height * 0.1)
+ / sc->rez) * sc->rez);
+ }
+
+ XDrawRectangle (st->dpy, st->window, st->draw_gc,
+ sc->rect.x - st->border*2,
+ sc->rect.y - st->border*2,
+ sc->rect.width + st->border*4,
+ sc->rect.height + st->border*4);
+ }
+}
+
+
+
+# ifdef READ_FILES
+static void
+open_file (state *st)
+{
+ if (st->in)
+ {
+ fclose (st->in);
+ st->in = 0;
+ }
+
+ st->in = fopen (st->filename, "r");
+ if (!st->in)
+ {
+ char buf[1024];
+ sprintf (buf, "%s: %s", progname, st->filename);
+ perror (buf);
+ exit (1);
+ }
+}
+#endif
+
+
+/* "The brk and sbrk functions are historical curiosities left over
+ from earlier days before the advent of virtual memory management."
+ -- sbrk(2) man page on BSD systems, as of 1995 or so.
+ */
+#ifdef HAVE_SBRK
+# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) /* gcc >= 4.2 */
+ /* Don't print "warning: 'sbrk' is deprecated". */
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+# endif
+#endif
+
+
+static unsigned int
+more_bits (state *st, scroller *sc)
+{
+ static unsigned char *lomem = 0;
+ static unsigned char *himem = 0;
+ unsigned char r, g, b;
+
+ /* vv: Each incoming byte rolls through all 4 bytes of this (it is sc->value)
+ This is the number displayed at the top.
+ pv: the pixel color value. incoming bytes land in R,G,B, or maybe just G.
+ */
+ unsigned int vv, pv;
+
+ unsigned int rmsk = st->scrollers[0].image->red_mask;
+ unsigned int gmsk = st->scrollers[0].image->green_mask;
+ unsigned int bmsk = st->scrollers[0].image->blue_mask;
+ unsigned int amsk = ~(rmsk | gmsk | bmsk);
+
+ vv = sc->value;
+
+ /* Pack RGB into a pixel according to the XImage component masks;
+ set the remaining bits to 1 for the benefit of HAVE_JWXYZ alpha.
+ */
+# undef PACK
+# define PACK() ((((r << 24) | (r << 16) | (r << 8) | r) & rmsk) | \
+ (((g << 24) | (g << 16) | (g << 8) | g) & gmsk) | \
+ (((b << 24) | (b << 16) | (b << 8) | b) & bmsk) | \
+ amsk)
+
+ switch (st->seed_mode)
+ {
+ case SEED_RAM:
+ if (himem == 0)
+ {
+ lomem = (unsigned char *) progname; /* not first malloc, but early */
+ himem = (unsigned char *) /* not last malloc, but late */
+ st->scrollers[st->nscrollers-1].image->data;
+ }
+
+ if (sc->data < lomem)
+ sc->data = lomem;
+
+# ifdef HAVE_SBRK /* re-get it each time through */
+ himem = ((unsigned char *) sbrk(0)) - (2 * sizeof(void *));
+# endif
+
+ if (!lomem || !himem)
+ {
+ /* bad craziness! give up! */
+ st->seed_mode = SEED_RANDOM;
+ return 0;
+ }
+
+ /* I don't understand what's going on there, but on MacOS X, we're
+ getting insane values for lomem and himem (both Xlib and HAVE_JWXYZ).
+ Does malloc() draw from more than one heap? */
+ if ((unsigned long) himem - (unsigned long) lomem > 0x0FFFFFFF) {
+# if 0
+ fprintf (stderr, "%s: wonky: 0x%08x - 0x%08x = 0x%08x\n", progname,
+ (unsigned int) himem, (unsigned int) lomem,
+ (unsigned int) himem - (unsigned int) lomem);
+# endif
+ himem = lomem + 0xFFFF;
+ }
+
+ if (lomem >= himem) abort();
+
+ RETRY:
+ if (sc->data >= himem)
+ sc->data = lomem;
+
+ switch (st->draw_mode)
+ {
+ case DRAW_COLOR:
+ r = *sc->data++;
+ g = *sc->data++;
+ b = *sc->data++;
+ vv = (vv << 24) | (r << 16) | (g << 8) | b;
+ break;
+ case DRAW_MONO:
+ r = 0;
+ g = *sc->data++;
+ b = 0;
+ vv = (vv << 8) | g;
+ break;
+ default:
+ abort();
+ }
+
+ pv = PACK();
+
+ /* avoid having many seconds of blackness: truncate zeros at 24K.
+ */
+ if (vv == 0)
+ sc->count_zero++;
+ else
+ sc->count_zero = 0;
+ if (sc->count_zero > 1024 * (st->draw_mode == DRAW_COLOR ? 24 : 8))
+ goto RETRY;
+
+ break;
+
+ case SEED_RANDOM:
+ vv = random();
+ switch (st->draw_mode)
+ {
+ case DRAW_COLOR:
+ r = (vv >> 16) & 0xFF;
+ g = (vv >> 8) & 0xFF;
+ b = (vv ) & 0xFF;
+ break;
+ case DRAW_MONO:
+ r = 0;
+ g = vv & 0xFF;
+ b = 0;
+ break;
+ default:
+ abort();
+ }
+ pv = PACK();
+ break;
+
+# ifdef READ_FILES
+ case SEED_FILE:
+ {
+ int i;
+
+ /* this one returns only bytes from the file */
+# define GETC(V) \
+ do { \
+ i = fgetc (st->in); \
+ } while (i == EOF \
+ ? (open_file (st), 1) \
+ : 0); \
+ V = i
+
+ /* this one returns a null at EOF -- else we hang on zero-length files */
+# undef GETC
+# define GETC(V) \
+ i = fgetc (st->in); \
+ if (i == EOF) { i = 0; open_file (st); } \
+ V = i
+
+ if (!st->in)
+ open_file (st);
+
+ switch (st->draw_mode)
+ {
+ case DRAW_COLOR:
+ GETC(r);
+ GETC(g);
+ GETC(b);
+ vv = (vv << 24) | (r << 16) | (g << 8) | b;
+ break;
+ case DRAW_MONO:
+ r = 0;
+ GETC(g);
+ b = 0;
+ vv = (vv << 8) | g;
+ break;
+ default:
+ abort();
+ }
+# undef GETC
+ pv = PACK();
+ }
+ break;
+# endif /* READ_FILES */
+
+ default:
+ abort();
+ }
+
+# undef PACK
+
+ sc->value = vv;
+ return pv;
+}
+
+
+static void
+draw_string (state *st)
+{
+ char buf[40];
+ int direction, ascent, descent;
+ int bot = st->scrollers[0].rect.y;
+ const char *fmt = "%08X";
+ int i;
+
+ /* Draw the first font that fits.
+ */
+ for (i = 0; i < countof (st->fonts); i++)
+ {
+ XCharStruct overall;
+ int x, y, w, h;
+
+ if (! st->fonts[i]) continue;
+
+ sprintf (buf, fmt, 0);
+ XTextExtents (st->fonts[i], buf, strlen(buf),
+ &direction, &ascent, &descent, &overall);
+ sprintf (buf, "%08X", st->scrollers[0].value);
+
+ w = overall.width;
+ h = ascent + descent + 1;
+ x = (st->xgwa.width - w) / 2;
+ y = (bot - h) / 2;
+
+ if (y + h + 10 <= bot && x > -10)
+ {
+ XSetFont (st->dpy, st->text_gc, st->fonts[i]->fid);
+ XFillRectangle (st->dpy, st->window, st->erase_gc,
+ x-w-1, y-1, w*3+2, h+2);
+ XDrawString (st->dpy, st->window, st->text_gc,
+ x, y + ascent, buf, strlen(buf));
+ break;
+ }
+ }
+}
+
+
+static unsigned long
+memscroller_draw (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+ int i;
+ draw_string (st);
+
+ for (i = 0; i < st->nscrollers; i++)
+ {
+ scroller *sc = &st->scrollers[i];
+ int j;
+
+ XCopyArea (st->dpy, st->window, st->window, st->draw_gc,
+ sc->rect.x + sc->speed, sc->rect.y,
+ sc->rect.width - sc->speed, sc->rect.height,
+ sc->rect.x, sc->rect.y);
+
+ if (sc->scroll_tick == 0)
+ {
+ int top = ((sc->image->bytes_per_line * sc->rect.height) /
+ (4 * sc->rez));
+ unsigned int *out = (unsigned int *) sc->image->data;
+ for (j = 0; j < top; j++)
+ {
+ unsigned int v = more_bits(st, sc);
+ int k;
+ for (k = 0; k < sc->rez; k++)
+ *out++ = v;
+ }
+ }
+
+ sc->scroll_tick++;
+ if (sc->scroll_tick * sc->speed >= sc->rez)
+ sc->scroll_tick = 0;
+
+ for (j = 0; j < sc->speed; j++)
+ {
+ put_xshm_image (st->dpy, st->window, st->draw_gc, sc->image,
+ 0, 0,
+ sc->rect.x + sc->rect.width - sc->image->width - j,
+ sc->rect.y,
+ sc->rect.width, sc->rect.height,
+ &st->shm_info);
+ }
+ }
+
+ return st->delay;
+}
+
+
+static void
+memscroller_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *st = (state *) closure;
+ XClearWindow (st->dpy, st->window);
+ reshape_memscroller (st);
+}
+
+static Bool
+memscroller_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+
+static void
+memscroller_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *memscroller_defaults [] = {
+ ".background: black",
+ "*drawMode: color",
+ "*fpsSolid: true",
+ "*fpsTop: true",
+ "*filename: (RAM)",
+ ".textColor: #00FF00",
+ ".foreground: #00FF00",
+ "*borderSize: 2",
+
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+ ".font1: OCR A Std 192, Lucida Console 192, Monaco 192",
+ ".font2: OCR A Std 144, Lucida Console 144, Monaco 144",
+ ".font3: OCR A Std 128, Lucida Console 128, Monaco 128",
+ ".font4: OCR A Std 96, Lucida Console 96, Monaco 96",
+ ".font5: OCR A Std 48, Lucida Console 48, Monaco 48",
+ ".font6: OCR A Std 24, Lucida Console 24, Monaco 24",
+#elif 0 /* real X11, XQueryFont() */
+ ".font1: -*-courier-bold-r-*-*-*-1440-*-*-m-*-*-*",
+ ".font2: -*-courier-bold-r-*-*-*-960-*-*-m-*-*-*",
+ ".font3: -*-courier-bold-r-*-*-*-480-*-*-m-*-*-*",
+ ".font4: -*-courier-bold-r-*-*-*-320-*-*-m-*-*-*",
+ ".font5: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+ ".font6: fixed",
+#else /* real X11, load_font_retry() */
+ ".font1: -*-ocr a std-medium-r-*-*-*-1440-*-*-m-*-*-*",
+ ".font2: -*-ocr a std-medium-r-*-*-*-960-*-*-m-*-*-*",
+ ".font3: -*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*",
+ ".font4: -*-ocr a std-medium-r-*-*-*-320-*-*-m-*-*-*",
+ ".font5: -*-ocr a std-medium-r-*-*-*-180-*-*-m-*-*-*",
+ ".font6: -*-ocr a std-medium-r-*-*-*-120-*-*-m-*-*-*",
+#endif /* X11 */
+
+ "*delay: 10000",
+ "*offset: 0",
+ 0
+};
+
+static XrmOptionDescRec memscroller_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-font", ".font", XrmoptionSepArg, 0 },
+ { "-filename", ".filename", XrmoptionSepArg, 0 },
+ { "-color", ".drawMode", XrmoptionNoArg, "color" },
+ { "-mono", ".drawMode", XrmoptionNoArg, "mono" },
+ { "-ram", ".filename", XrmoptionNoArg, "(RAM)" },
+ { "-random", ".filename", XrmoptionNoArg, "(RANDOM)" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("MemScroller", memscroller)
diff --git a/hacks/memscroller.man b/hacks/memscroller.man
new file mode 100644
index 0000000..33754a2
--- /dev/null
+++ b/hacks/memscroller.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "14-Aug-2004" "X Version 11"
+.SH NAME
+memscroller - scrolls a dump of its own RAM across the screen
+.SH SYNOPSIS
+.B memscroller
+[\-display \fIhost:display.screen\fP]
+[\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP]
+[\-font \fIfont\fP]
+[\-delay \fIint\fP]
+[\-mono | -color]
+[\-ram | -random | \-filename \fIfile\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fImemscroller\fP program scrolls a dump of its own process memory
+across the screen in three windows at three different rates.
+.SH OPTIONS
+.I memscroller
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-color
+Render each three bytes of memory as R, G, B. This is the default.
+.TP 8
+.B \-mono
+Render each byte of memory in shades of green.
+.TP 8
+.B \-ram
+Read from the process's address space. This is the default.
+.TP 8
+.B \-random
+Instead of reading from memory, generate random numbers.
+.TP 8
+.B \-filename \fIfile\fP
+Instead of reading from memory, read from the given file until EOF, then
+re-open it. If you have permission, /dev/mem is an interesting choice here.
+(Note that /dev/null won't ever display anything, because it returns EOF
+without ever returning any data.)
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 10000.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Aug-2004.
diff --git a/hacks/metaballs.c b/hacks/metaballs.c
new file mode 100644
index 0000000..3a2ae73
--- /dev/null
+++ b/hacks/metaballs.c
@@ -0,0 +1,436 @@
+/* MetaBalls, Copyright (c) 2002-2003 W.P. van Paassen <peter@paassen.tmfweb.nl>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Module - "metaballs.c"
+ *
+ * [01/24/03] - W.P. van Paassen: Additional features
+ * [12/29/02] - W.P. van Paassen: Port to X for use with XScreenSaver, the shadebob hack by Shane Smit was used as a template
+ * [12/26/02] - W.P. van Paassen: Creation for the Demo Effects Collection (http://demo-effects.sourceforge.net)
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+/*#define VERBOSE*/
+
+/*blob structure*/
+typedef struct
+{
+ short xpos,ypos;
+} BLOB;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ unsigned short iWinWidth, iWinHeight;
+ char *sColor;
+
+ unsigned int nBlobCount;
+ unsigned char radius;
+ unsigned char delta;
+ unsigned char dradius;
+ unsigned short sradius;
+ unsigned char **blob;
+ BLOB *blobs;
+ unsigned char **blub;
+
+ int delay, cycles;
+ signed short iColorCount;
+ unsigned long *aiColorVals;
+ XImage *pImage;
+ GC gc;
+ int draw_i;
+};
+
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+static void init_blob(struct state *st, BLOB *blob)
+{
+ blob->xpos = st->iWinWidth/4 + BELLRAND(st->iWinWidth/2) - st->radius;
+ blob->ypos = st->iWinHeight/4 + BELLRAND(st->iWinHeight/2) - st->radius;
+}
+
+static void Execute( struct state *st )
+{
+ int i, j, k;
+
+ /* clear st->blub array */
+ for (i = 0; i < st->iWinHeight; ++i)
+ memset(st->blub[i], 0, st->iWinWidth * sizeof(unsigned char));
+
+ /* move st->blobs */
+ for (i = 0; i < st->nBlobCount; i++)
+ {
+ st->blobs[i].xpos += -st->delta + (int)((st->delta + .5f) * frand(2.0));
+ st->blobs[i].ypos += -st->delta + (int)((st->delta + .5f) * frand(2.0));
+ }
+
+ /* draw st->blobs to st->blub array */
+ for (k = 0; k < st->nBlobCount; ++k)
+ {
+ if (st->blobs[k].ypos > -st->dradius && st->blobs[k].xpos > -st->dradius && st->blobs[k].ypos < st->iWinHeight && st->blobs[k].xpos < st->iWinWidth)
+ {
+ for (i = 0; i < st->dradius; ++i)
+ {
+ if (st->blobs[k].ypos + i >= 0 && st->blobs[k].ypos + i < st->iWinHeight)
+ {
+ for (j = 0; j < st->dradius; ++j)
+ {
+ if (st->blobs[k].xpos + j >= 0 && st->blobs[k].xpos + j < st->iWinWidth)
+ {
+ if (st->blub[st->blobs[k].ypos + i][st->blobs[k].xpos + j] < st->iColorCount-1)
+ {
+ if (st->blub[st->blobs[k].ypos + i][st->blobs[k].xpos + j] + st->blob[i][j] > st->iColorCount-1)
+ st->blub[st->blobs[k].ypos + i][st->blobs[k].xpos + j] = st->iColorCount-1;
+ else
+ st->blub[st->blobs[k].ypos + i][st->blobs[k].xpos + j] += st->blob[i][j];
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ init_blob(st, st->blobs + k);
+ }
+
+ memset( st->pImage->data, 0, st->pImage->bytes_per_line * st->pImage->height);
+
+ /* draw st->blub array to screen */
+ for (i = 0; i < st->iWinHeight; ++i)
+ {
+ for (j = 0; j < st->iWinWidth; ++j)
+ {
+ if (st->aiColorVals[st->blub[i][j]] > 0)
+ XPutPixel( st->pImage, j, i, st->aiColorVals[st->blub[i][j]] );
+ }
+ }
+
+ XPutImage( st->dpy, st->window, st->gc, st->pImage,
+ 0, 0, 0, 0, st->iWinWidth, st->iWinHeight );
+}
+
+static unsigned long * SetPalette(struct state *st )
+{
+ XWindowAttributes XWinAttribs;
+ XColor Color, *aColors;
+ signed short iColor;
+ float nHalfColors;
+
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ Color.red = random() % 0xFFFF;
+ Color.green = random() % 0xFFFF;
+ Color.blue = random() % 0xFFFF;
+
+ if( strcasecmp( st->sColor, "random" ) && !XParseColor( st->dpy, XWinAttribs.colormap, st->sColor, &Color ) )
+ fprintf( stderr, "%s: color %s not found in database. Choosing to random...\n", progname, st->sColor );
+
+#ifdef VERBOSE
+ printf( "%s: Base color (RGB): <%d, %d, %d>\n", progname, Color.red, Color.green, Color.blue );
+#endif /* VERBOSE */
+
+ st->iColorCount = get_integer_resource(st->dpy, "ncolors", "Integer" );
+ if( st->iColorCount < 2 ) st->iColorCount = 2;
+ if( st->iColorCount > 255 ) st->iColorCount = 255;
+
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+
+ for( iColor=0; iColor < st->iColorCount; iColor++ )
+ {
+ nHalfColors = st->iColorCount / 2.0F;
+ /* Black -> Base Color */
+ if( iColor < (st->iColorCount/2) )
+ {
+ aColors[ iColor ].red = ( Color.red / nHalfColors ) * iColor;
+ aColors[ iColor ].green = ( Color.green / nHalfColors ) * iColor;
+ aColors[ iColor ].blue = ( Color.blue / nHalfColors ) * iColor;
+ }
+ /* Base Color -> White */
+ else
+ {
+ aColors[ iColor ].red = ( ( ( 0xFFFF - Color.red ) / nHalfColors ) * ( iColor - nHalfColors ) ) + Color.red;
+ aColors[ iColor ].green = ( ( ( 0xFFFF - Color.green ) / nHalfColors ) * ( iColor - nHalfColors ) ) + Color.green;
+ aColors[ iColor ].blue = ( ( ( 0xFFFF - Color.blue ) / nHalfColors ) * ( iColor - nHalfColors ) ) + Color.blue;
+ }
+
+ if( !XAllocColor( st->dpy, XWinAttribs.colormap, &aColors[ iColor ] ) )
+ {
+ /* start all over with less colors */
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, iColor, 0 );
+ free( aColors );
+ free( st->aiColorVals );
+ (st->iColorCount)--;
+
+ if (st->iColorCount < 6)
+ {
+ fprintf (stderr, "%s: insufficient colors!\n",
+ progname);
+ exit (1);
+ }
+
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+ iColor = -1;
+ }
+ else
+ st->aiColorVals[ iColor ] = aColors[ iColor ].pixel;
+ }
+
+ free( aColors );
+
+ XSetWindowBackground( st->dpy, st->window, st->aiColorVals[ 0 ] );
+
+ return st->aiColorVals;
+}
+
+
+static void Initialize( struct state *st )
+{
+ XGCValues gcValues;
+ XWindowAttributes XWinAttribs;
+ int /*iBitsPerPixel,*/ i, j;
+ unsigned int distance_squared;
+ float fraction;
+
+ /* Create the Image for drawing */
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ /* Find the preferred bits-per-pixel. (jwz) */
+#if 0
+ {
+ int pfvc = 0;
+ XPixmapFormatValues *pfv = XListPixmapFormats( st->dpy, &pfvc );
+ for( i=0; i<pfvc; i++ )
+ if( pfv[ i ].depth == XWinAttribs.depth )
+ {
+ iBitsPerPixel = pfv[ i ].bits_per_pixel;
+ break;
+ }
+ if( pfv )
+ XFree (pfv);
+ }
+#endif
+
+ /* Create the GC. */
+ st->gc = XCreateGC( st->dpy, st->window, 0, &gcValues );
+
+ st->pImage = XCreateImage( st->dpy, XWinAttribs.visual, XWinAttribs.depth, ZPixmap, 0, NULL,
+ XWinAttribs.width, XWinAttribs.height, BitmapPad( st->dpy ), 0 );
+ (st->pImage)->data = calloc((st->pImage)->bytes_per_line, (st->pImage)->height);
+
+ st->iWinWidth = XWinAttribs.width;
+ st->iWinHeight = XWinAttribs.height;
+
+ /* Get the base color. */
+ st->sColor = get_string_resource(st->dpy, "color", "Color" );
+
+ /* Get the st->delta. */
+ st->delta = get_integer_resource(st->dpy, "delta", "Integer" );
+ if (st->delta < 1)
+ st->delta = 1;
+ else if (st->delta > 20)
+ st->delta = 20;
+
+ /* Get the st->radius. */
+ st->radius = get_integer_resource(st->dpy, "radius", "Integer" );
+ if (st->radius < 2)
+ st->radius = 2;
+ if (st->radius > 100)
+ st->radius = 100;
+
+ st->radius = (st->radius / 100.0) * (st->iWinHeight >> 3);
+ if (st->radius >= 128) /* should use UCHAR_MAX? */
+ st->radius = 127; /* st->dradius should fit in u_char */
+
+ if (st->iWinWidth < 100 || st->iWinHeight < 100) /* tiny window */
+ if (st->radius < 20)
+ st->radius = 20;
+
+ st->dradius = st->radius * 2;
+ st->sradius = st->radius * st->radius;
+
+ /* create st->blob */
+ st->blob = malloc ( st->dradius * sizeof(unsigned char*));
+ for (i = 0; i < st->dradius; ++i)
+ st->blob[i] = malloc( st->dradius * sizeof(unsigned char));
+
+ /* create st->blub array */
+ st->blub = malloc( st->iWinHeight * sizeof(unsigned char*));
+ for (i = 0; i < st->iWinHeight; ++i)
+ st->blub[i] = malloc( st->iWinWidth * sizeof(unsigned char));
+
+ /* create st->blob */
+ for (i = -st->radius; i < st->radius; ++i)
+ {
+ for (j = -st->radius; j < st->radius; ++j)
+ {
+ distance_squared = i * i + j * j;
+ if (distance_squared <= st->sradius)
+ {
+ /* compute density */
+ fraction = (float)distance_squared / (float)st->sradius;
+ st->blob[i + st->radius][j + st->radius] = pow((1.0 - (fraction * fraction)),4.0) * 255.0;
+ }
+ else
+ {
+ st->blob[i + st->radius][j + st->radius] = 0;
+ }
+ }
+ }
+
+ for (i = 0; i < st->nBlobCount; i++)
+ {
+ init_blob(st, st->blobs + i);
+ }
+}
+
+static void *
+metaballs_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+#ifdef VERBOSE
+ time_t nTime = time( NULL );
+ unsigned short iFrame = 0;
+#endif /* VERBOSE */
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->nBlobCount = get_integer_resource(st->dpy, "count", "Integer" );
+ if( st->nBlobCount > 255 ) st->nBlobCount = 255;
+ if( st->nBlobCount < 2 ) st->nBlobCount = 2;
+
+ if( ( st->blobs = calloc( st->nBlobCount, sizeof(BLOB) ) ) == NULL )
+ {
+ fprintf( stderr, "%s: Could not allocate %d Blobs\n", progname, st->nBlobCount );
+ abort();
+ }
+#ifdef VERBOSE
+ printf( "%s: Allocated %d Blobs\n", progname, st->nBlobCount );
+#endif /* VERBOSE */
+
+ Initialize( st );
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer" );
+ st->cycles = get_integer_resource(st->dpy, "cycles", "Integer" );
+
+ st->draw_i = -1;
+ return st;
+}
+
+
+
+static unsigned long
+metaballs_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if( st->draw_i < 0 || st->draw_i++ >= st->cycles )
+ {
+ int i;
+ XWindowAttributes XWinAttribs;
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ memset( st->pImage->data, 0, st->pImage->bytes_per_line * st->pImage->height );
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, st->iColorCount, 0 );
+ free( st->aiColorVals );
+ st->aiColorVals = SetPalette( st );
+ XClearWindow( st->dpy, st->window );
+ for (i = 0; i < st->nBlobCount; i++)
+ {
+ init_blob(st, st->blobs + i);
+ }
+ st->draw_i = 0;
+ }
+
+ Execute( st );
+
+#ifdef VERBOSE
+ iFrame++;
+ if( nTime - time( NULL ) )
+ {
+ printf( "%s: %d FPS\n", progname, iFrame );
+ nTime = time( NULL );
+ iFrame = 0;
+ }
+#endif /* VERBOSE */
+
+ return st->delay;
+}
+
+
+static void
+metaballs_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+metaballs_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+metaballs_free (Display *dpy, Window window, void *closure)
+{
+#if 0
+ struct state *st = (struct state *) closure;
+ free( st->pImage->data );
+ XDestroyImage( st->pImage );
+ free( st->aiColorVals );
+ free( st->blobs );
+ for (i = 0; i < st->iWinHeight; ++i)
+ free( st->blub[i] );
+ free( st->blub );
+ for (i = 0; i < st->dradius; ++i)
+ free( st->blob[i] );
+ free( st->blob );
+#endif
+}
+
+
+static const char *metaballs_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*color: random",
+ "*count: 10",
+ "*cycles: 1000",
+ "*ncolors: 256",
+ "*delay: 10000",
+ "*radius: 100",
+ "*delta: 3",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec metaballs_options [] = {
+ { "-color", ".color", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-cycles", ".cycles", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-delta", ".delta", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("MetaBalls", metaballs)
+
+/* End of Module - "metaballs.c" */
+
diff --git a/hacks/metaballs.man b/hacks/metaballs.man
new file mode 100644
index 0000000..e9ba541
--- /dev/null
+++ b/hacks/metaballs.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+MetaBalls - draws 2D metaballs
+.SH SYNOPSIS
+.B MetaBalls
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-ncolors \fInumber\fP]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-radius \fInumber\fP]
+[\-delta \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+This hack draws 2D metaballs to the screen by calculating the sum of the colors of all metaballs covering a pixel.
+Ported from the demo effects collection (http://demo-effects.sourceforge.net)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 256.
+.TP 8
+.B \-count \fInumber\fP
+Number of MetaBalls. 2 - 255. Default: 10.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.005 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+Duration. 100 - 3000. Default: 1000.
+.TP 8
+.B \-radius \fInumber\fP
+MetaBall Radius. 2 - 100. Default: 100.
+.TP 8
+.B \-delta \fInumber\fP
+MetaBall Movement. 1 - 20. Default: 3.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002-2003 by W.P. van Paassen. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+ suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+W.P. van Paassen
diff --git a/hacks/moire.c b/hacks/moire.c
new file mode 100644
index 0000000..4add457
--- /dev/null
+++ b/hacks/moire.c
@@ -0,0 +1,245 @@
+/* xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Concept snarfed from Michael D. Bayne in
+ * http://samskivert.com/internet/deep/1997/04/16/body.html
+ */
+
+#include "screenhack.h"
+#include "xshm.h"
+
+struct state {
+ Display *dpy;
+ Window window;
+ XShmSegmentInfo shm_info;
+
+ int delay;
+ int offset;
+ XColor *colors;
+ int ncolors;
+ GC gc;
+ unsigned long fg_pixel;
+ unsigned long bg_pixel;
+ int depth;
+
+ int draw_y, draw_xo, draw_yo;
+ int draw_factor;
+ XImage *draw_image;
+ XWindowAttributes xgwa;
+};
+
+static void
+moire_init_1 (struct state *st)
+{
+ int oncolors;
+ int i;
+ int fgh, bgh;
+ double fgs, fgv, bgs, bgv;
+ XWindowAttributes xgwa;
+ XColor fgc, bgc;
+ XGCValues gcv;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->offset = get_integer_resource (st->dpy, "offset", "Integer");
+ if (st->offset < 2) st->offset = 2;
+
+ MONO:
+ if (st->colors)
+ {
+ for (i = 0; i < st->ncolors; i++)
+ XFreeColors (st->dpy, xgwa.colormap, &st->colors[i].pixel, 1, 0);
+ free(st->colors);
+ st->colors = 0;
+ }
+
+ if (mono_p)
+ {
+ st->fg_pixel = WhitePixelOfScreen (DefaultScreenOfDisplay(st->dpy));
+ st->bg_pixel = BlackPixelOfScreen (DefaultScreenOfDisplay(st->dpy));
+ }
+ else
+ {
+ st->fg_pixel = get_pixel_resource (st->dpy,
+ xgwa.colormap, "foreground", "Foreground");
+ st->bg_pixel = get_pixel_resource (st->dpy,
+ xgwa.colormap, "background", "Background");
+ }
+
+ if (mono_p)
+ {
+ st->offset *= 20; /* compensate for lack of shading */
+ gcv.foreground = st->fg_pixel;
+ }
+ else
+ {
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ if (st->ncolors < 2) st->ncolors = 2;
+ oncolors = st->ncolors;
+
+ fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue;
+ if (get_boolean_resource(st->dpy, "random","Boolean"))
+ {
+ fgc.red = random() & 0xFFFF;
+ fgc.green = random() & 0xFFFF;
+ fgc.blue = random() & 0xFFFF;
+ bgc.red = random() & 0xFFFF;
+ bgc.green = random() & 0xFFFF;
+ bgc.blue = random() & 0xFFFF;
+ }
+ else
+ {
+ fgc.pixel = st->fg_pixel;
+ bgc.pixel = st->bg_pixel;
+ XQueryColor (st->dpy, xgwa.colormap, &fgc);
+ XQueryColor (st->dpy, xgwa.colormap, &bgc);
+ }
+ rgb_to_hsv (fgc.red, fgc.green, fgc.blue, &fgh, &fgs, &fgv);
+ rgb_to_hsv (bgc.red, bgc.green, bgc.blue, &bgh, &bgs, &bgv);
+
+ st->colors = (XColor *) malloc (sizeof (XColor) * (st->ncolors+2));
+ memset(st->colors, 0, (sizeof (XColor) * (st->ncolors+2)));
+ make_color_ramp (xgwa.screen, xgwa.visual, xgwa.colormap,
+ fgh, fgs, fgv, bgh, bgs, bgv,
+ st->colors, &st->ncolors,
+ True, True, False);
+ if (st->ncolors != oncolors)
+ fprintf(stderr, "%s: got %d of %d requested colors.\n",
+ progname, st->ncolors, oncolors);
+
+ if (st->ncolors <= 2)
+ {
+ mono_p = True;
+ goto MONO;
+ }
+
+ gcv.foreground = st->colors[0].pixel;
+ }
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+}
+
+
+static void *
+moire_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ moire_init_1 (st);
+ return st;
+}
+
+
+static unsigned long
+moire_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XGCValues gcv;
+ int chunk_size = 20, ii;
+
+ if (st->draw_y == 0)
+ {
+ moire_init_1 (st);
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->draw_xo = (random() % st->xgwa.width) - st->xgwa.width/2;
+ st->draw_yo = (random() % st->xgwa.height) - st->xgwa.height/2;
+ st->draw_factor = (random() % st->offset) + 1;
+
+ st->depth = visual_depth(DefaultScreenOfDisplay(st->dpy), st->xgwa.visual);
+
+ st->draw_image = create_xshm_image(st->dpy, st->xgwa.visual,
+ st->depth, ZPixmap, &st->shm_info, /* depth, format, shm_info */
+ st->xgwa.width, chunk_size); /* w, h */
+ }
+
+ /* for (y = 0; y < st->xgwa.height; y++) */
+ for (ii = 0; ii < chunk_size; ii++)
+ {
+ int x;
+ for (x = 0; x < st->xgwa.width; x++)
+ {
+ double xx = x + st->draw_xo;
+ double yy = st->draw_y + ii + st->draw_yo;
+ double i = ((xx * xx) + (yy * yy)) / (double) st->draw_factor;
+ if (mono_p)
+ gcv.foreground = ((((long) i) & 1) ? st->fg_pixel : st->bg_pixel);
+ else
+ gcv.foreground = st->colors[((long) i) % st->ncolors].pixel;
+ XPutPixel (st->draw_image, x, ii, gcv.foreground);
+ }
+
+ if (st->draw_y + ii >= st->xgwa.height)
+ break;
+ }
+
+ put_xshm_image(st->dpy, st->window, st->gc, st->draw_image, 0, 0, 0, st->draw_y, st->xgwa.width, chunk_size, &st->shm_info);
+ st->draw_y += chunk_size;
+
+ if (st->draw_y >= st->xgwa.height)
+ {
+ st->draw_y = 0;
+
+ destroy_xshm_image (st->dpy, st->draw_image, &st->shm_info);
+ st->draw_image = 0;
+
+ return st->delay * 1000000;
+ }
+
+ return st->delay * 10000;
+}
+
+
+static const char *moire_defaults [] = {
+ ".background: blue",
+ ".foreground: red",
+ "*fpsSolid: true",
+ "*random: true",
+ "*delay: 5",
+ "*ncolors: 64",
+ "*offset: 50",
+ "*useSHM: True",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec moire_options [] = {
+ { "-random", ".random", XrmoptionNoArg, "True" },
+ { "-no-random", ".random", XrmoptionNoArg, "False" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-offset", ".offset", XrmoptionSepArg, 0 },
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+static void
+moire_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+moire_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+moire_free (Display *dpy, Window window, void *closure)
+{
+}
+
+XSCREENSAVER_MODULE ("Moire", moire)
diff --git a/hacks/moire.man b/hacks/moire.man
new file mode 100644
index 0000000..b38d343
--- /dev/null
+++ b/hacks/moire.man
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+moire - draw circular interference patterns
+.SH SYNOPSIS
+.B moire
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fImoire\fP program draws cool circular interference patterns.
+.SH OPTIONS
+.I moire
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to wait before starting over. Default 5 seconds.
+.TP 8
+.B \-random \fIboolean\fP
+Whether to ignore the foreground/background colors, and pick them randomly
+instead.
+.TP 8
+.B \-offset \fIinteger\fP
+The maximum random radius increment to use.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be allocated in the color ramp (note that this
+value interacts with \fIoffset\fP.)
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 27-Apr-97, based on code by
+Michael D. Bayne <mdb@go2net.com>.
diff --git a/hacks/moire2.c b/hacks/moire2.c
new file mode 100644
index 0000000..dad9d66
--- /dev/null
+++ b/hacks/moire2.c
@@ -0,0 +1,356 @@
+/* xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int ncolors;
+ XColor *colors;
+ int fg_pixel, bg_pixel;
+ Pixmap p0, p1, p2, p3;
+ GC copy_gc, erase_gc, window_gc;
+ int width, height, size;
+ int x1, x2, y1, y2, x3, y3;
+ int dx1, dx2, dx3, dy1, dy2, dy3;
+ int othickness, thickness;
+ Bool do_three;
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer back_buf;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ Bool flip_a, flip_b;
+ int pix;
+ int delay, color_shift;
+
+ int reset;
+ int iterations, iteration;
+};
+
+static void
+moire2_init_1 (struct state *st)
+{
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->othickness = get_integer_resource(st->dpy, "thickness", "Thickness");
+
+ if (mono_p)
+ st->ncolors = 2;
+ else
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+
+ if (mono_p)
+ st->colors = 0;
+ else
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+
+ if (mono_p)
+ ;
+ else
+ make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+
+ st->bg_pixel = get_pixel_resource(st->dpy,
+ xgwa.colormap, "background", "Background");
+ st->fg_pixel = get_pixel_resource(st->dpy,
+ xgwa.colormap, "foreground", "Foreground");
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->back_buf = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+}
+
+
+static void
+reset_moire2 (struct state *st)
+{
+ GC gc;
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+ Bool xor;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->do_three = (0 == (random() % 3));
+
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ st->size = st->width > st->height ? st->width : st->height;
+
+ if (st->p0) XFreePixmap(st->dpy, st->p0);
+ if (st->p1) XFreePixmap(st->dpy, st->p1);
+ if (st->p2) XFreePixmap(st->dpy, st->p2);
+ if (st->p3) XFreePixmap(st->dpy, st->p3);
+
+ st->p0 = XCreatePixmap(st->dpy, st->window, st->width, st->height, 1);
+ st->p1 = XCreatePixmap(st->dpy, st->window, st->width*2, st->height*2, 1);
+ st->p2 = XCreatePixmap(st->dpy, st->window, st->width*2, st->height*2, 1);
+ if (st->do_three)
+ st->p3 = XCreatePixmap(st->dpy, st->window, st->width*2, st->height*2, 1);
+ else
+ st->p3 = 0;
+
+ st->thickness = (st->othickness > 0 ? st->othickness : (1 + (random() % 4)));
+
+ gcv.foreground = 0;
+ gcv.line_width = (st->thickness == 1 ? 0 : st->thickness);
+ gc = XCreateGC (st->dpy, st->p1, GCForeground|GCLineWidth, &gcv);
+
+ XFillRectangle(st->dpy, st->p1, gc, 0, 0, st->width*2, st->height*2);
+ XFillRectangle(st->dpy, st->p2, gc, 0, 0, st->width*2, st->height*2);
+ if (st->do_three)
+ XFillRectangle(st->dpy, st->p3, gc, 0, 0, st->width*2, st->height*2);
+
+ XSetForeground(st->dpy, gc, 1);
+
+ xor = (st->do_three || (st->thickness == 1) || (random() & 1));
+
+ {
+ int i, ii, maxx, maxy;
+
+#define FROB(P) do { \
+ maxx = (st->size*4); \
+ maxy = (st->size*4); \
+ if (0 == (random() % 5)) { \
+ float f = 1.0 + frand(0.05); \
+ if (random() & 1) maxx *= f; \
+ else maxy *= f; \
+ } \
+ ii = (st->thickness + 1 + (xor ? 0 : 1) + (random() % (4 * st->thickness))); \
+ for (i = 0; i < (st->size*2); i += ii) \
+ XDrawArc(st->dpy, (P), gc, i-st->size, i-st->size, maxx-i-i, maxy-i-i, 0, 360*64); \
+ if (0 == (random() % 5)) \
+ { \
+ XSetFunction(st->dpy, gc, GXxor); \
+ XFillRectangle(st->dpy, (P), gc, 0, 0, st->width*2, st->height*2); \
+ XSetFunction(st->dpy, gc, GXcopy); \
+ } \
+ } while(0)
+
+ FROB(st->p1);
+ FROB(st->p2);
+ if (st->do_three)
+ FROB(st->p3);
+#undef FROB
+ }
+
+ XFreeGC(st->dpy, gc);
+
+ if (st->copy_gc) XFreeGC(st->dpy, st->copy_gc);
+ gcv.function = (xor ? GXxor : GXor);
+ gcv.foreground = 1;
+ gcv.background = 0;
+
+ st->copy_gc = XCreateGC (st->dpy, st->p0, GCFunction|GCForeground|GCBackground, &gcv);
+
+ gcv.foreground = 0;
+ if (st->erase_gc) XFreeGC(st->dpy, st->erase_gc);
+ st->erase_gc = XCreateGC (st->dpy, st->p0, GCForeground, &gcv);
+
+ gcv.foreground = st->fg_pixel;
+ gcv.background = st->bg_pixel;
+ if (st->window_gc) XFreeGC(st->dpy, st->window_gc);
+ st->window_gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+
+#define FROB(N,DN,MAX) \
+ N = (MAX/2) + (random() % MAX); \
+ DN = ((1 + (random() % (7*st->thickness))) * ((random() & 1) ? 1 : -1))
+
+ FROB(st->x1,st->dx1,st->width);
+ FROB(st->x2,st->dx2,st->width);
+ FROB(st->x3,st->dx3,st->width);
+ FROB(st->y1,st->dy1,st->height);
+ FROB(st->y2,st->dy2,st->height);
+ FROB(st->y3,st->dy3,st->height);
+#undef FROB
+}
+
+
+
+static void
+moire2 (struct state *st)
+{
+#define FROB(N,DN,MAX) \
+ N += DN; \
+ if (N <= 0) N = 0, DN = -DN; \
+ else if (N >= MAX) N = MAX, DN = -DN; \
+ else if (0 == (random() % 100)) DN = -DN; \
+ else if (0 == (random() % 50)) \
+ DN += (DN <= -20 ? 1 : (DN >= 20 ? -1 : ((random() & 1) ? 1 : -1)))
+
+ FROB(st->x1,st->dx1,st->width);
+ FROB(st->x2,st->dx2,st->width);
+ FROB(st->x3,st->dx3,st->width);
+ FROB(st->y1,st->dy1,st->height);
+ FROB(st->y2,st->dy2,st->height);
+ FROB(st->y3,st->dy3,st->height);
+#undef FROB
+
+ XFillRectangle(st->dpy, st->p0, st->erase_gc, 0, 0, st->width, st->height);
+ XCopyArea(st->dpy, st->p1, st->p0, st->copy_gc, st->x1, st->y1, st->width, st->height, 0, 0);
+ XCopyArea(st->dpy, st->p2, st->p0, st->copy_gc, st->x2, st->y2, st->width, st->height, 0, 0);
+ if (st->do_three)
+ XCopyArea(st->dpy, st->p3, st->p0, st->copy_gc, st->x3, st->y3, st->width, st->height, 0, 0);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->back_buf)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = XdbeUndefined;
+ XCopyPlane (st->dpy, st->p0, st->back_buf, st->window_gc, 0, 0, st->width, st->height, 0, 0, 1L);
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ XCopyPlane (st->dpy, st->p0, st->window, st->window_gc, 0, 0, st->width, st->height, 0, 0, 1L);
+
+#if 0
+ XCopyPlane(st->dpy, st->p1, st->window, st->window_gc, (st->width*2)/3, (st->height*2)/3,
+ st->width/2, st->height/2,
+ 0, st->height/2, 1L);
+ XCopyPlane(st->dpy, st->p2, st->window, st->window_gc, (st->width*2)/3, (st->height*2)/3,
+ st->width/2, st->height/2,
+ st->width/2, st->height/2, 1L);
+#endif
+}
+
+
+
+static void *
+moire2_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ st->reset = 1;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->color_shift = get_integer_resource (st->dpy, "colorShift", "Integer");
+
+ if (st->color_shift <= 0) st->color_shift = 1;
+ moire2_init_1 (st);
+ return st;
+}
+
+static unsigned long
+moire2_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->reset)
+ {
+ st->reset = 0;
+
+ st->iteration = 0;
+ st->iterations = 30 + (random() % 70) + (random() % 70);
+ reset_moire2 (st);
+
+ st->flip_a = mono_p ? False : (random() & 1);
+ st->flip_b = mono_p ? False : (random() & 1);
+
+ if (st->flip_b)
+ {
+ XSetForeground(st->dpy, st->window_gc, st->bg_pixel);
+ XSetBackground(st->dpy, st->window_gc, st->fg_pixel);
+ }
+ else
+ {
+ XSetForeground(st->dpy, st->window_gc, st->fg_pixel);
+ XSetBackground(st->dpy, st->window_gc, st->bg_pixel);
+ }
+ }
+
+ if (!mono_p)
+ {
+ st->pix++;
+ st->pix = st->pix % st->ncolors;
+
+ if (st->flip_a)
+ XSetBackground(st->dpy, st->window_gc, st->colors[st->pix].pixel);
+ else
+ XSetForeground(st->dpy, st->window_gc, st->colors[st->pix].pixel);
+ }
+
+
+ moire2 (st);
+ st->iteration++;
+ if (st->iteration >= st->color_shift)
+ {
+ st->iteration = 0;
+ st->iterations--;
+ if (st->iterations <= 0)
+ st->reset = 1;
+ }
+
+ return st->delay;
+}
+
+static void
+moire2_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->reset = 1;
+}
+
+static Bool
+moire2_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+moire2_free (Display *dpy, Window window, void *closure)
+{
+}
+
+static const char *moire2_defaults [] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*delay: 50000",
+ "*thickness: 0",
+ "*colors: 150",
+ "*colorShift: 5",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ /* Off by default, since it slows it down a lot, and the flicker isn't really
+ all that bad without it... Or rather, it flickers just as badly with it.
+ The XFree86 implementation of the XDBE extension totally blows! There is
+ just *no* excuse for the "swap buffers" operation to flicker like it does.
+ */
+ "*useDBE: False",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ 0
+};
+
+static XrmOptionDescRec moire2_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".colors", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Moire2", moire2)
diff --git a/hacks/moire2.man b/hacks/moire2.man
new file mode 100644
index 0000000..b57c485
--- /dev/null
+++ b/hacks/moire2.man
@@ -0,0 +1,63 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+moire2 - circular interference patterns.
+.SH SYNOPSIS
+.B moire2
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Another example of the fun you can have with moire interference patterns;
+this hack generates fields of concentric circles or ovals, and combines the
+planes with various operations. The planes are moving independently of one
+another, causing the interference lines to ``spray.''
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 50000 (0.05 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 150.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of lines, in pixels. Default: 0.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/mountain.c b/hacks/mountain.c
new file mode 100644
index 0000000..541b187
--- /dev/null
+++ b/hacks/mountain.c
@@ -0,0 +1,282 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* mountain -- square grid mountains */
+
+#if 0
+static const char sccsid[] = "@(#)mountain.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 Pascal Pensa <pensa@aurora.unice.fr>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 1995: Written
+ */
+
+#ifdef STANDALONE
+# define MODE_mountain
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 30 \n" \
+ "*cycles: 4000 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+
+# define SMOOTH_COLORS
+# define release_mountain 0
+# define reshape_mountain 0
+# define mountain_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_mountain
+
+ENTRYPOINT ModeSpecOpt mountain_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct mountain_description =
+{"mountain", "init_mountain", "draw_mountain", (char *) NULL,
+ "refresh_mountain", "init_mountain", "free_mountain", &mountain_opts,
+ 1000, 30, 4000, 1, 64, 1.0, "",
+ "Shows Papo's mountain range", 0, NULL};
+
+#endif
+
+/* ~ 5000 Max mountain height (1000 - 10000) */
+#define MAXHEIGHT (3 * (mp->width + mp->height))
+
+#define WORLDWIDTH 50 /* World size x * y */
+
+#define RANGE_RAND(min,max) ((min) + NRAND((max) - (min)))
+
+typedef struct {
+ int pixelmode;
+ int width;
+ int height;
+ int x, y;
+ int offset;
+ int stage;
+ int h[WORLDWIDTH][WORLDWIDTH];
+ long time; /* up time */
+ Bool wireframe;
+ Bool joke;
+ GC stippledGC;
+} mountainstruct;
+
+static mountainstruct *mountains = (mountainstruct *) NULL;
+
+static void
+spread(int (*m)[50], int x, int y)
+{
+ int x2, y2;
+ int h = m[x][y];
+
+ for (y2 = y - 1; y2 <= y + 1; y2++)
+ for (x2 = x - 1; x2 <= x + 1; x2++)
+ if (x2 >= 0 && y2 >= 0 && x2 < WORLDWIDTH && y2 < WORLDWIDTH)
+ m[x2][y2] = (m[x2][y2] + h) / 2;
+}
+
+static void
+drawamountain(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ mountainstruct *mp = &mountains[MI_SCREEN(mi)];
+ int x2, y2, x3, y3, y4, y5, c = 0;
+ XPoint p[5];
+
+ if (MI_NPIXELS(mi) > 2) {
+ c = (mp->h[mp->x][mp->y] + mp->h[mp->x + 1][mp->y] +
+ mp->h[mp->x][mp->y + 1] + mp->h[mp->x + 1][mp->y + 1]) / 4;
+ c = (c / 10 + mp->offset) % MI_NPIXELS(mi);
+ }
+ x2 = mp->x * (2 * mp->width) / (3 * WORLDWIDTH);
+ y2 = mp->y * (2 * mp->height) / (3 * WORLDWIDTH);
+ p[0].x = (x2 - y2 / 2) + (mp->width / 4);
+ p[0].y = (y2 - mp->h[mp->x][mp->y]) + mp->height / 4;
+
+ x3 = (mp->x + 1) * (2 * mp->width) / (3 * WORLDWIDTH);
+ y3 = mp->y * (2 * mp->height) / (3 * WORLDWIDTH);
+ p[1].x = (x3 - y3 / 2) + (mp->width / 4);
+ p[1].y = (y3 - mp->h[mp->x + 1][mp->y]) + mp->height / 4;
+
+ y4 = (mp->y + 1) * (2 * mp->height) / (3 * WORLDWIDTH);
+ p[2].x = (x3 - y4 / 2) + (mp->width / 4);
+ p[2].y = (y4 - mp->h[mp->x + 1][mp->y + 1]) + mp->height / 4;
+
+ y5 = (mp->y + 1) * (2 * mp->height) / (3 * WORLDWIDTH);
+ p[3].x = (x2 - y5 / 2) + (mp->width / 4);
+ p[3].y = (y5 - mp->h[mp->x][mp->y + 1]) + mp->height / 4;
+
+ p[4].x = p[0].x;
+ p[4].y = p[0].y;
+
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, c));
+ else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+
+ if (mp->joke) {
+ if ((Bool) (LRAND() & 1))
+ XDrawLines(display, window, gc, p, 5, CoordModeOrigin);
+ else {
+ XFillPolygon(display, window, gc, p, 4, Complex, CoordModeOrigin);
+ if (!mp->pixelmode) {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XDrawLines(display, window, gc, p, 5, CoordModeOrigin);
+ }
+ }
+ } else {
+ if (mp->wireframe) {
+ XDrawLines(display, window, gc, p, 5, CoordModeOrigin);
+ } else {
+ XFillPolygon(display, window, gc, p, 4, Complex, CoordModeOrigin);
+
+ if (!mp->pixelmode) {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XDrawLines(display, window, gc, p, 5, CoordModeOrigin);
+ }
+ }
+ }
+ mp->x++;
+ if (mp->x == WORLDWIDTH - 1) {
+ mp->y++;
+ mp->x = 0;
+ }
+ if (mp->y == WORLDWIDTH - 1)
+ mp->stage++;
+}
+
+ENTRYPOINT void
+init_mountain (ModeInfo * mi)
+{
+ int i, j, x, y;
+ XGCValues gcv;
+ mountainstruct *mp;
+
+ MI_INIT (mi, mountains);
+ mp = &mountains[MI_SCREEN(mi)];
+
+ mp->width = MI_WIDTH(mi);
+ mp->height = MI_HEIGHT(mi);
+ mp->pixelmode = (mp->width + mp->height < 200);
+ mp->stage = 0;
+ mp->time = 0;
+ mp->x = mp->y = 0;
+ if (MI_IS_FULLRANDOM(mi)) {
+ mp->joke = (Bool) (NRAND(10) == 0);
+ mp->wireframe = (Bool) (LRAND() & 1);
+ } else {
+ mp->joke = False;
+ mp->wireframe = MI_IS_WIREFRAME(mi);
+ }
+
+ if (mp->stippledGC == None) {
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ if ((mp->stippledGC = XCreateGC(MI_DISPLAY(mi), MI_WINDOW(mi),
+ GCForeground | GCBackground, &gcv)) == None)
+ return;
+ }
+ MI_CLEARWINDOW(mi);
+
+ for (y = 0; y < (int) WORLDWIDTH; y++)
+ for (x = 0; x < (int) WORLDWIDTH; x++)
+ mp->h[x][y] = 0;
+
+ j = MI_COUNT(mi);
+ if (j < 0)
+ j = NRAND(-j) + 1;
+ for (i = 0; i < j; i++)
+ mp->h[RANGE_RAND(1, WORLDWIDTH - 1)][RANGE_RAND(1, WORLDWIDTH - 1)] =
+ NRAND(MAXHEIGHT);
+
+ for (y = 0; y < WORLDWIDTH; y++)
+ for (x = 0; x < WORLDWIDTH; x++)
+ spread(mp->h, x, y);
+
+ for (y = 0; y < WORLDWIDTH; y++)
+ for (x = 0; x < WORLDWIDTH; x++) {
+ mp->h[x][y] = mp->h[x][y] + NRAND(10) - 5;
+ if (mp->h[x][y] < 10)
+ mp->h[x][y] = 0;
+ }
+
+ if (MI_NPIXELS(mi) > 2)
+ mp->offset = NRAND(MI_NPIXELS(mi));
+ else
+ mp->offset = 0;
+}
+
+ENTRYPOINT void
+draw_mountain (ModeInfo * mi)
+{
+ mountainstruct *mp;
+
+ if (mountains == NULL)
+ return;
+ mp = &mountains[MI_SCREEN(mi)];
+ if (mp->stippledGC == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+
+ switch (mp->stage) {
+ case 0:
+ drawamountain(mi);
+ break;
+ case 1:
+ if (++mp->time > MI_CYCLES(mi))
+ mp->stage++;
+ break;
+ case 2:
+ init_mountain(mi);
+ break;
+ }
+}
+
+ENTRYPOINT void
+free_mountain (ModeInfo * mi)
+{
+ mountainstruct *mp = &mountains[MI_SCREEN(mi)];
+
+ if (mp->stippledGC)
+ XFreeGC(MI_DISPLAY(mi), mp->stippledGC);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_mountain(ModeInfo * mi)
+{
+ mountainstruct *mp;
+
+ if (mountains == NULL)
+ return;
+ mp = &mountains[MI_SCREEN(mi)];
+
+ MI_CLEARWINDOW(mi);
+ mp->x = 0;
+ mp->y = 0;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Mountain", mountain)
+
+#endif /* MODE_mountain */
diff --git a/hacks/mountain.man b/hacks/mountain.man
new file mode 100644
index 0000000..692eb47
--- /dev/null
+++ b/hacks/mountain.man
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+mountain - random 3D plots that look vaguely mountainous.
+.SH SYNOPSIS
+.B mountain
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Generates random 3d plots that look vaguely mountainous.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Count. 0 - 100. Default: 30.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Pascal Pensa. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Pascal Pensa.
diff --git a/hacks/munch.c b/hacks/munch.c
new file mode 100644
index 0000000..836731a
--- /dev/null
+++ b/hacks/munch.c
@@ -0,0 +1,476 @@
+/* Munching Squares and Mismunch
+ *
+ * Portions copyright 1992-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this
+ * software and its documentation for any purpose is hereby
+ * granted without fee, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation. No
+ * representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Portions Copyright 1997, Tim Showalter
+ *
+ * Permission is granted to copy, modify, and use this as long
+ * as this notice remains intact. No warranties are expressed or
+ * implied. CMU Sucks.
+ *
+ * Portions Copyright 2004 Steven Hazel <sah@thalassocracy.org>
+ *
+ * (The "mismunch" part).
+ *
+ * "munch.c" and "mismunch.c" merged by jwz, 29-Aug-2008.
+ *
+ *
+ *
+ ***********************************************************************
+ *
+ * HAKMEM
+ *
+ * MIT AI Memo 239, Feb. 29, 1972.
+ * Beeler, M., Gosper, R.W., and Schroeppel, R.
+ *
+ * http://www.inwap.com/pdp10/hbaker/hakmem/hacks.html#item146
+ *
+ ***********************************************************************
+ *
+ * ITEM 146: MUNCHING SQUARES
+ *
+ * Another simple display program. It is thought that this was
+ * discovered by Jackson Wright on the RLE PDP-1 circa 1962.
+ *
+ * DATAI 2
+ * ADDB 1,2
+ * ROTC 2,-22
+ * XOR 1,2
+ * JRST .-4
+ *
+ * 2=X, 3=Y. Try things like 1001002 in data switches. This also
+ * does * interesting things with operations other than XOR, and
+ * rotations * other than -22. (Try IOR; AND; TSC; FADR; FDV(!);
+ * ROT * -14, -9, -20, * ...)
+ *
+ * ITEM 147 (Schroeppel):
+ *
+ * Munching squares is just views of the graph Y = X XOR T for
+ * consecutive values of T = time.
+ *
+ * ITEM 147 (Cohen, Beeler):
+ *
+ * A modification to munching squares which reveals them in frozen
+ * states through opening and closing curtains: insert FADR 2,1
+ * before the XOR. Try data switches =
+ *
+ * 4000,,4 1000,,2002 2000,,4 0,,1002
+ *
+ * (Notation: <left half>,,<right half>)
+ * Also try the FADR after the XOR, switches = 1001,,1.
+ *
+ ***********************************************************************
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+typedef struct _muncher {
+ int mismunch;
+ int width;
+ int atX, atY;
+ int kX, kT, kY;
+ int grav;
+ XColor fgc;
+ int yshadow, xshadow;
+ int x, y, t;
+ int doom;
+ int done;
+} muncher;
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC gc;
+ int delay, simul, clear, xor;
+ int logminwidth, logmaxwidth;
+ int restart, window_width, window_height;
+
+ int draw_n; /* number of squares before we have to clear */
+ int draw_i;
+ int mismunch;
+
+ muncher **munchers;
+};
+
+
+/*
+ * dumb way to get # of digits in number. Probably faster than actually
+ * doing a log and a division, maybe.
+ */
+static int dumb_log_2(int k)
+{
+ int r = -1;
+ while (k > 0) {
+ k >>= 1; r++;
+ }
+ return r;
+}
+
+
+static void calc_logwidths (struct state *st)
+{
+ /* Choose a range of square sizes based on the window size. We want
+ a power of 2 for the square width or the munch doesn't fill up.
+ Also, if a square doesn't fit inside an area 20% smaller than the
+ window, it's too big. Mismunched squares that big make things
+ look too noisy. */
+
+ if (st->window_height < st->window_width &&
+ st->window_width < st->window_height * 5) {
+ st->logmaxwidth = (int)dumb_log_2(st->window_height * 0.8);
+ } else {
+ st->logmaxwidth = (int)dumb_log_2(st->window_width * 0.8);
+ }
+
+ if (st->logmaxwidth < 2) {
+ st->logmaxwidth = 2;
+ }
+
+ /* we always want three sizes of squares */
+ st->logminwidth = st->logmaxwidth - 2;
+
+ if (st->logminwidth < 2) {
+ st->logminwidth = 2;
+ }
+}
+
+
+
+static muncher *make_muncher (struct state *st)
+{
+ int logwidth;
+ XWindowAttributes xgwa;
+ muncher *m = (muncher *) malloc(sizeof(muncher));
+
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+
+ m->mismunch = st->mismunch;
+
+ /* choose size -- power of two */
+ logwidth = (st->logminwidth +
+ (random() % (1 + st->logmaxwidth - st->logminwidth)));
+
+ m->width = 1 << logwidth;
+
+ /* draw at this location */
+ m->atX = (random() % (xgwa.width <= m->width ? 1
+ : xgwa.width - m->width));
+ m->atY = (random() % (xgwa.height <= m->width ? 1
+ : xgwa.height - m->width));
+
+ /* wrap-around by these values; no need to % as we end up doing that
+ later anyway */
+ m->kX = ((random() % 2)
+ ? (random() % m->width) : 0);
+ m->kT = ((random() % 2)
+ ? (random() % m->width) : 0);
+ m->kY = ((random() % 2)
+ ? (random() % m->width) : 0);
+
+ /* set the gravity of the munch, or rather, which direction we draw
+ stuff in. */
+ m->grav = random() % 2;
+
+ /* I like this color scheme better than random colors. */
+ switch (random() % 4) {
+ case 0:
+ m->fgc.red = random() % 65536;
+ m->fgc.blue = random() % 32768;
+ m->fgc.green = random() % 16384;
+ break;
+
+ case 1:
+ m->fgc.red = 0;
+ m->fgc.blue = random() % 65536;
+ m->fgc.green = random() % 16384;
+ break;
+
+ case 2:
+ m->fgc.red = random() % 8192;
+ m->fgc.blue = random() % 8192;
+ m->fgc.green = random() % 49152;
+ break;
+
+ case 3:
+ m->fgc.red = random() % 65536;
+ m->fgc.green = m->fgc.red;
+ m->fgc.blue = m->fgc.red;
+ break;
+ }
+
+ /* Sometimes draw a mostly-overlapping copy of the square. This
+ generates all kinds of neat blocky graphics when drawing in xor
+ mode. */
+ if (!m->mismunch || (random() % 4)) {
+ m->xshadow = 0;
+ m->yshadow = 0;
+ } else {
+ m->xshadow = (random() % (m->width/3)) - (m->width/6);
+ m->yshadow = (random() % (m->width/3)) - (m->width/6);
+ }
+
+ /* Start with a random y value -- this sort of controls the type of
+ deformities seen in the squares. */
+ m->y = random() % 256;
+
+ m->t = 0;
+
+ /*
+ Doom each square to be aborted at some random point.
+ (When doom == (width - 1), the entire square will be drawn.)
+ */
+ m->doom = (m->mismunch ? (random() % m->width) : (m->width - 1));
+ m->done = 0;
+
+ return m;
+}
+
+
+static void munch (struct state *st, muncher *m)
+{
+ int drawX, drawY;
+ XWindowAttributes xgwa;
+
+ if (m->done) {
+ return;
+ }
+
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+
+ if (!mono_p) {
+ /* XXX there are probably bugs with this. */
+ if (XAllocColor(st->dpy, xgwa.colormap, &m->fgc)) {
+ XSetForeground(st->dpy, st->gc, m->fgc.pixel);
+ }
+ }
+
+ /* Finally draw this pass of the munching error. */
+
+ for(m->x = 0; m->x < m->width; m->x++) {
+ /* figure out the next point */
+
+ /*
+ The ordinary Munching Squares calculation is:
+ m->y = ((m->x ^ ((m->t + m->kT) % m->width)) + m->kY) % m->width;
+
+ We create some feedback by plugging in y in place of x, and
+ make a couple of values negative so that some parts of some
+ squares get drawn in the wrong place.
+ */
+ if (m->mismunch)
+ m->y = ((-m->y ^ ((-m->t + m->kT) % m->width)) + m->kY) % m->width;
+ else
+ m->y = ((m->x ^ ((m->t + m->kT) % m->width)) + m->kY) % m->width;
+
+ drawX = ((m->x + m->kX) % m->width) + m->atX;
+ drawY = (m->grav ? m->y + m->atY : m->atY + m->width - 1 - m->y);
+
+ XDrawPoint(st->dpy, st->window, st->gc, drawX, drawY);
+ if ((m->xshadow != 0) || (m->yshadow != 0)) {
+ /* draw the corresponding shadow point */
+ XDrawPoint(st->dpy, st->window, st->gc, drawX + m->xshadow, drawY + m->yshadow);
+ }
+ /* XXX may want to change this to XDrawPoints,
+ but it's fast enough without it for the moment. */
+
+ }
+
+ m->t++;
+ if (m->t > m->doom) {
+ m->done = 1;
+ }
+}
+
+
+static void *
+munch_init (Display *dpy, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+ int i;
+ char *mm;
+
+ st->dpy = dpy;
+ st->window = w;
+ st->restart = 0;
+
+ /* get the dimensions of the window */
+ XGetWindowAttributes(st->dpy, w, &xgwa);
+
+ /* create the gc */
+ gcv.foreground= get_pixel_resource(st->dpy, xgwa.colormap,
+ "foreground","Foreground");
+ gcv.background= get_pixel_resource(st->dpy, xgwa.colormap,
+ "background","Background");
+
+ st->gc = XCreateGC(st->dpy, w, GCForeground|GCBackground, &gcv);
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+
+ st->simul = get_integer_resource(st->dpy, "simul", "Integer");
+ if (st->simul < 1) st->simul = 1;
+
+ st->clear = get_integer_resource(st->dpy, "clear", "Integer");
+ if (st->clear < 0) st->clear = 0;
+
+ st->xor = get_boolean_resource(st->dpy, "xor", "Boolean");
+
+ mm = get_string_resource (st->dpy, "mismunch", "Mismunch");
+ if (!mm || !*mm || !strcmp(mm, "random"))
+ st->mismunch = random() & 1;
+ else
+ st->mismunch = get_boolean_resource (st->dpy, "mismunch", "Mismunch");
+
+ st->window_width = xgwa.width;
+ st->window_height = xgwa.height;
+
+ calc_logwidths(st);
+
+ /* always draw xor on mono. */
+ if (mono_p || st->xor) {
+ XSetFunction(st->dpy, st->gc, GXxor);
+ }
+
+ st->munchers = (muncher **) calloc(st->simul, sizeof(muncher *));
+ for (i = 0; i < st->simul; i++) {
+ st->munchers[i] = make_muncher(st);
+ }
+
+ return st;
+}
+
+static unsigned long
+munch_draw (Display *dpy, Window w, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+
+ for (i = 0; i < 5; i++) {
+
+ /* for (draw_i = 0; draw_i < simul; draw_i++) */
+ {
+ munch(st, st->munchers[st->draw_i]);
+
+ if (st->munchers[st->draw_i]->done) {
+ st->draw_n++;
+
+ free(st->munchers[st->draw_i]);
+ st->munchers[st->draw_i] = make_muncher(st);
+ }
+ }
+
+ st->draw_i++;
+ if (st->draw_i >= st->simul) {
+ int i = 0;
+ st->draw_i = 0;
+ if (st->restart || (st->clear && st->draw_n >= st->clear)) {
+
+ char *mm = get_string_resource (st->dpy, "mismunch", "Mismunch");
+ if (!mm || !*mm || !strcmp(mm, "random"))
+ st->mismunch = random() & 1;
+
+ for (i = 0; i < st->simul; i++) {
+ free(st->munchers[i]);
+ st->munchers[i] = make_muncher(st);
+ }
+
+ XClearWindow(st->dpy, w);
+ st->draw_n = 0;
+ st->restart = 0;
+ }
+ }
+
+ }
+
+ return st->delay;
+}
+
+
+static void
+munch_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (w != st->window_width ||
+ h != st->window_height) {
+ st->window_width = w;
+ st->window_height = h;
+ calc_logwidths(st);
+ st->restart = 1;
+ st->draw_i = 0;
+ }
+}
+
+static Bool
+munch_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ int i;
+ st->window_height--;
+ munch_reshape(dpy, window, closure, st->window_width, st->window_height);
+ st->mismunch = random() & 1;
+ for (i = 0; i < st->simul; i++) {
+ free (st->munchers[i]);
+ st->munchers[i] = make_muncher(st);
+ }
+ XClearWindow(dpy, window);
+ return True;
+ }
+ return False;
+}
+
+static void
+munch_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *munch_defaults [] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 10000",
+ "*mismunch: random",
+ "*simul: 5",
+ "*clear: 65",
+ "*xor: True",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+
+ 0
+};
+
+static XrmOptionDescRec munch_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-simul", ".simul", XrmoptionSepArg, 0 },
+ { "-clear", ".clear", XrmoptionSepArg, "true" },
+ { "-xor", ".xor", XrmoptionNoArg, "true" },
+ { "-no-xor", ".xor", XrmoptionNoArg, "false" },
+ { "-classic", ".mismunch", XrmoptionNoArg, "false" },
+ { "-mismunch", ".mismunch", XrmoptionNoArg, "true" },
+ { "-random", ".mismunch", XrmoptionNoArg, "random" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Munch", munch)
diff --git a/hacks/munch.man b/hacks/munch.man
new file mode 100644
index 0000000..d5423c9
--- /dev/null
+++ b/hacks/munch.man
@@ -0,0 +1,153 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "29-Aug-2008" "X Version 11"
+.SH NAME
+munch - munching squares
+.SH SYNOPSIS
+.B munch
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-xor] [\-noxor]
+[\-clear \fInumber\fP] [\-simul \fInumber\fP]
+[\-classic | \-mismunch | \-random]
+[\-fps]
+.SH DESCRIPTION
+The
+.I munch
+program performs the munching squares hack. It picks square
+size, position, and gravity randomly. It also displays a
+creatively broken misimplementation of the classic algorithm.
+
+The munching squares hack consists of drawing Y = X XOR T for a range of X
+and T over and over until all the possible combinations of X and T have
+come up. It was reportedly discovered by Jackson Wright in 1962 and took 5
+instructions of PDP-6 code.
+.SH OPTIONS
+.I munch
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation, in microseconds. Default: 2500.
+.TP 8
+.B \-xor
+Use the XOR drawing function. This is the default.
+.TP 8
+.B \-no\-xor
+Don't use the XOR drawing function.
+.TP 8
+.B \-clear \fInumber\fP
+Number of squares to misdraw before clearing the display. Default: 65.
+.TP 8
+.B \-simul \fInumber\fP
+Number of squares to misdraw simultaneously. Default: 5.
+.TP 8
+.B \-classic
+Draw classic munching squares only.
+.TP 8
+.B \-mismunch
+Draw "mismunch" only.
+.TP 8
+.B \-random
+Do one or the other.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.RS 0
+.BR http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html
+.SH HISTORY
+HAKMEM: MIT AI Memo 239, Feb. 29, 1972.
+.RS 8
+Beeler, M., Gosper, R.W., and Schroeppel, R.
+
+"Unless otherwise stated, all computer programs are in PDP-6/10
+assembly language."
+.TP 4
+ITEM 146: MUNCHING SQUARES
+
+Another simple display program. It is thought that this was discovered by
+Jackson Wright on the RLE PDP-1 circa 1962.
+
+.EX
+ DATAI 2
+ ADDB 1,2
+ ROTC 2,-22
+ XOR 1,2
+ JRST .-4
+.EE
+.RS 4
+2=X, 3=Y. Try things like 1001002 in data switches. This also does
+interesting things with operations other than XOR, and rotations other
+than -22. (Try IOR; AND; TSC; FADR; FDV(!); ROT -14, -9, -20, ...)
+.RE
+.TP 4
+ITEM 147 (Schroeppel):
+
+Munching squares is just views of the graph Y = X XOR T for consecutive
+values of T = time.
+.TP 4
+ITEM 148 (Cohen, Beeler):
+
+A modification to munching squares which reveals them in frozen states
+through opening and closing curtains: insert FADR 2,1 before the XOR. Try
+data switches =
+
+.EX
+ 4000,,4 1000,,2002 2000,,4 0,,1002
+.EE
+.RS 4
+(Notation: <left half>,,<right half>)
+.RS 0
+Also try the FADR after the XOR, switches = 1001,,1.
+.SH COPYRIGHT
+Copyright 1997 Tim Showalter.
+.RS 0
+Copyright 2004 Steven Hazel.
+.RS 0
+Copyright 1992-2008 Jamie Zawinski.
+.PP
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
diff --git a/hacks/munge-ad.pl b/hacks/munge-ad.pl
new file mode 100755
index 0000000..7504d2c
--- /dev/null
+++ b/hacks/munge-ad.pl
@@ -0,0 +1,237 @@
+#!/usr/bin/perl -w
+# Copyright © 2008-2014 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This updates driver/XScreenSaver.ad.in with the current list of savers.
+#
+# Created: 3-Aug-2008.
+
+require 5;
+use diagnostics;
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.10 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+# 1 means disabled: marked with "-" by default in the .ad file.
+# 2 means retired: not mentioned in .ad at all (parsed from Makefile).
+#
+my %disable = (
+ 'antinspect' => 1,
+ 'antmaze' => 1,
+ 'antspotlight' => 1,
+ 'braid' => 1,
+ 'crystal' => 1,
+ 'demon' => 1,
+ 'dnalogo' => 1,
+ 'fadeplot' => 1,
+ 'glblur' => 1,
+ 'glslideshow' => 1,
+ 'jigglypuff' => 1,
+ 'kaleidescope' => 1,
+ 'lcdscrub' => 1,
+ 'loop' => 1,
+ 'mismunch' => 2,
+ 'nerverot' => 1,
+ 'noseguy' => 1,
+ 'polyominoes' => 1,
+ 'providence' => 1,
+ 'pyro' => 1,
+ 'rdbomb' => 2, # alternate name
+ 'rocks' => 1,
+ 'sballs' => 1,
+ 'sierpinski' => 1,
+ 'thornbird' => 1,
+ 'vidwhacker' => 1,
+ 'webcollage' => 1,
+ );
+
+
+# Parse the RETIRED_EXES variable from the Makefiles to populate %disable.
+# Duplicated in ../OSX/build-fntable.pl.
+#
+sub parse_makefiles() {
+ foreach my $mf ( "Makefile.in", "glx/Makefile.in" ) {
+ open (my $in, '<', $mf) || error ("$mf: $!");
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+
+ $body =~ s/\\\n//gs;
+ my ($var) = ($body =~ m/^RETIRED_EXES\s*=\s*(.*)$/mi);
+ my ($var2) = ($body =~ m/^RETIRED_GL_EXES\s*=\s*(.*)$/mi);
+ error ("no RETIRED_EXES in $mf") unless $var;
+ $var .= " $var2" if $var2;
+ foreach my $hack (split (/\s+/, $var)) {
+ $disable{$hack} = 2;
+ }
+ }
+}
+
+
+sub munge_ad($) {
+ my ($file) = @_;
+
+ parse_makefiles();
+
+ open (my $in, '<', $file) || error ("$file: $!");
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+ my $obody = $body;
+
+ my ($top, $mid, $bot) = ($body =~ m/^(.*?\n)(\*hacks\..*?\n)(\n.*)$/s);
+
+ my $mid2 = '';
+
+ my %hacks;
+
+ # Update the "*hacks.foo.name" section of the file based on the contents
+ # of config/*.xml.
+ #
+ my $dir = $file;
+ $dir =~ s@/[^/]*$@@s;
+ my @counts = (0,0,0,0,0,0,0,0,0,0);
+ foreach my $xml (sort (glob ("$dir/../hacks/config/*.xml"))) {
+ open (my $in, '<', $xml) || error ("$xml: $!");
+ local $/ = undef; # read entire file
+ my $b = <$in>;
+ close $in;
+ my ($name) = ($b =~ m@<screensaver[^<>]*\b_label=\"([^<>\"]+)\"@s);
+ error ("$xml: no name") unless $name;
+
+ my $name2 = lc($name);
+ $name2 =~ s/^((x|gl)?[a-z])/\U$1/s; # what prefs.c (make_hack_name) does
+
+ $xml =~ s@^.*/([^/]+)\.xml$@$1@s;
+ if ($name ne $name2) {
+ my $s = sprintf("*hacks.%s.name:", $xml);
+ $mid2 .= sprintf ("%-28s%s\n", $s, $name);
+ $counts[9]++;
+ }
+
+ # Grab the year.
+ my ($year) =
+ ($b =~ m/<_description>.*Written by.*?;\s+(19[6-9]\d|20\d\d)\b/si);
+ error ("no year in $xml.xml") unless $year;
+ $hacks{$xml} = $year;
+ }
+
+ # Splice in new names.
+ $body = $top . $mid2 . $bot;
+
+
+ # Replace the "programs" section.
+ # Sort hacks by creation date, but put the OpenGL ones at the end.
+ #
+ my $segregate_p = 0; # whether to put the GL hacks at the end.
+ my $xhacks = '';
+ my $ghacks = '';
+ foreach my $hack (sort { $hacks{$a} == $hacks{$b}
+ ? $a cmp $b
+ : $hacks{$a} <=> $hacks{$b}}
+ (keys(%hacks))) {
+ my $cmd = "$hack -root";
+ my $ts = (length($cmd) / 8) * 8;
+ while ($ts < 40) { $cmd .= "\t"; $ts += 8; }
+
+ my $dis = $disable{$hack} || 0;
+
+ my $glp;
+ my $glep = ($hack eq 'extrusion');
+ if (-f "$hack.c" || -f "$hack") { $glp = 0; }
+ elsif (-f "glx/$hack.c") { $glp = 1; }
+ elsif ($hack eq 'companioncube') { $glp = 1; } # kludge
+ elsif ($dis != 2) { error ("is $hack X or GL?"); }
+
+ $counts[($disable{$hack} || 0)]++;
+ if ($glp) {
+ $counts[6+($disable{$hack} || 0)]++;
+ } else {
+ $counts[3+($disable{$hack} || 0)]++;
+ }
+
+ next if ($dis == 2);
+
+ $dis = ($dis ? '-' : '');
+ my $vis = ($glp
+ ? (($dis ? '' : $glep ? '@GLE_KLUDGE@' : '@GL_KLUDGE@') .
+ ' GL: ')
+ : '');
+ $cmd = "$dis$vis\t\t\t\t$cmd \\n\\\n";
+
+ if ($glp) {
+ ($segregate_p ? $ghacks : $xhacks) .= $cmd;
+ } else {
+ $xhacks .= $cmd;
+ }
+ }
+
+ # Splice in new programs list.
+ #
+ $mid2 = ($xhacks .
+ ($segregate_p ? "\t\t\t\t\t\t\t\t\t \\\n" : "") .
+ $ghacks);
+ $mid2 =~ s@\\$@@s;
+ ($top, $mid, $bot) =
+ ($body =~ m/^(.*?\n\*programs:\s+\\\n)(.*?\n)(\n.*)$/s);
+ error ("unparsable") unless $mid;
+ $body = $top . $mid2 . $bot;
+
+ print STDERR "$progname: " .
+ "Total: $counts[0]+$counts[1]+$counts[2]; " .
+ "X11: $counts[3]+$counts[4]+$counts[5]; " .
+ "GL: $counts[6]+$counts[7]+$counts[8]; " .
+ "Names: $counts[9]\n"
+ if ($verbose);
+
+ # Write file if changed.
+ #
+ if ($body ne $obody) {
+ open (my $out, '>', $file) || error ("$file: $!");
+ print $out $body;
+ close $out;
+ print STDERR "$progname: wrote $file\n";
+ } elsif ($verbose) {
+ print STDERR "$progname: $file unchanged\n";
+ }
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] ad-file\n";
+ exit 1;
+}
+
+sub main() {
+ my $file;
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if (m/^--?verbose$/) { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^-./) { usage; }
+ elsif (!$file) { $file = $_; }
+ else { usage; }
+ }
+
+ usage unless ($file);
+ munge_ad ($file);
+}
+
+main();
+exit 0;
diff --git a/hacks/nerverot.c b/hacks/nerverot.c
new file mode 100644
index 0000000..081dbca
--- /dev/null
+++ b/hacks/nerverot.c
@@ -0,0 +1,1354 @@
+/* nerverot, nervous rotation of random thingies, v1.4
+ * by Dan Bornstein, danfuzz@milk.com
+ * Copyright (c) 2000-2001 Dan Bornstein. All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * The goal of this screensaver is to be interesting and compelling to
+ * watch, yet induce a state of nervous edginess in the viewer.
+ *
+ * See the included man page for more details.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#define FLOAT double
+
+/* random float in the range (-1..1) */
+#define RAND_FLOAT_PM1 \
+ (((FLOAT) ((random() >> 8) & 0xffff)) / ((FLOAT) 0x10000) * 2 - 1)
+
+/* random float in the range (0..1) */
+#define RAND_FLOAT_01 \
+ (((FLOAT) ((random() >> 8) & 0xffff)) / ((FLOAT) 0x10000))
+
+
+/* structure of the model */
+
+/* each point-like thingy to draw is represented as a blot */
+typedef struct blot_s
+{
+ FLOAT x; /* 3d x position (-1..1) */
+ FLOAT y; /* 3d y position (-1..1) */
+ FLOAT z; /* 3d z position (-1..1) */
+ FLOAT xoff[3][3]; /* display x offset per drawn point (-1..1) */
+ FLOAT yoff[3][3]; /* display x offset per drawn point (-1..1) */
+} Blot;
+
+/* each drawn line is represented as a LineSegment */
+typedef struct linesegment_s
+{
+ GC gc;
+ int x1;
+ int y1;
+ int x2;
+ int y2;
+} LineSegment;
+
+/* each blot draws as a simple 2d shape with each coordinate as an int
+ * in the range (-1..1); this is the base shape */
+static const XPoint blotShape[] = { { 0, 0}, { 1, 0}, { 1, 1},
+ { 0, 1}, {-1, 1}, {-1, 0},
+ {-1,-1}, { 0,-1}, { 1,-1} };
+static int blotShapeCount = sizeof (blotShape) / sizeof (XPoint);
+
+
+
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int requestedBlotCount; /* number of blots */
+ int delay; /* delay (usec) between iterations */
+ int maxIters; /* max iterations per model */
+ FLOAT nervousness; /* variability of xoff/yoff per iteration (0..1) */
+ FLOAT maxNerveRadius; /* max nervousness radius (0..1) */
+ FLOAT eventChance; /* chance per iteration that an event will happen */
+ FLOAT iterAmt; /* fraction (0..1) towards rotation target or scale target to move each * iteration */
+ FLOAT minScale; /* min and max scale for drawing, as fraction of baseScale */
+ FLOAT maxScale;
+ int minRadius; /* min and max radius of blot drawing */
+ int maxRadius;
+ int colorCount; /* the number of colors to use */
+
+ int lineWidth; /* width of lines */
+
+ Bool doubleBuffer; /* whether or not to do double-buffering */
+
+
+ int baseScale; /* base scale factor for drawing, calculated as max(screenWidth,screenHeight) */
+
+
+ int windowWidth; /* width and height of the window */
+ int windowHeight;
+
+ int centerX; /* center position of the window */
+ int centerY;
+
+ Drawable drawable; /* the thing to directly draw on */
+ GC *gcs; /* array of gcs, one per color used */
+
+ Blot *blots; /* array of the blots in the model */
+ int blotCount;
+
+ int segCount; /* two arrays of line segments; one for the ones to erase, and one for the ones to draw */
+
+ LineSegment *segsToDraw;
+ LineSegment *segsToErase;
+
+
+ FLOAT xRot; /* current rotation values per axis, scale factor, and light position */
+
+ FLOAT yRot;
+ FLOAT zRot;
+ FLOAT curScale;
+ FLOAT lightX;
+ FLOAT lightY;
+ FLOAT lightZ;
+
+ FLOAT xRotTarget; /* target rotation values per axis, scale factor, and light position */
+
+ FLOAT yRotTarget;
+ FLOAT zRotTarget;
+ FLOAT scaleTarget;
+ FLOAT lightXTarget;
+ FLOAT lightYTarget;
+ FLOAT lightZTarget;
+
+ int centerXOff; /* current absolute offsets from the center */
+ int centerYOff;
+
+ int itersTillNext; /* iterations until the model changes */
+};
+
+
+/*
+ * generic blot setup and manipulation
+ */
+
+/* initialize a blot with the given coordinates and random display offsets */
+static void initBlot (Blot *b, FLOAT x, FLOAT y, FLOAT z)
+{
+ int i, j;
+
+ b->x = x;
+ b->y = y;
+ b->z = z;
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ b->xoff[i][j] = RAND_FLOAT_PM1;
+ b->yoff[i][j] = RAND_FLOAT_PM1;
+ }
+ }
+}
+
+/* scale the blots to have a max distance of 1 from the center */
+static void scaleBlotsToRadius1 (struct state *st)
+{
+ FLOAT max = 0.0;
+ int n;
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ FLOAT distSquare =
+ st->blots[n].x * st->blots[n].x +
+ st->blots[n].y * st->blots[n].y +
+ st->blots[n].z * st->blots[n].z;
+ if (distSquare > max)
+ {
+ max = distSquare;
+ }
+ }
+
+ if (max == 0.0)
+ {
+ return;
+ }
+
+ max = sqrt (max);
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ st->blots[n].x /= max;
+ st->blots[n].y /= max;
+ st->blots[n].z /= max;
+ }
+}
+
+/* randomly reorder the blots */
+static void randomlyReorderBlots (struct state *st)
+{
+ int n;
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ int m = RAND_FLOAT_01 * (st->blotCount - n) + n;
+ Blot tmpBlot = st->blots[n];
+ st->blots[n] = st->blots[m];
+ st->blots[m] = tmpBlot;
+ }
+}
+
+/* randomly rotate the blots around the origin */
+static void randomlyRotateBlots (struct state *st)
+{
+ int n;
+
+ /* random amounts to rotate about each axis */
+ FLOAT xRot = RAND_FLOAT_PM1 * M_PI;
+ FLOAT yRot = RAND_FLOAT_PM1 * M_PI;
+ FLOAT zRot = RAND_FLOAT_PM1 * M_PI;
+
+ /* rotation factors */
+ FLOAT sinX = sin (xRot);
+ FLOAT cosX = cos (xRot);
+ FLOAT sinY = sin (yRot);
+ FLOAT cosY = cos (yRot);
+ FLOAT sinZ = sin (zRot);
+ FLOAT cosZ = cos (zRot);
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ FLOAT x1 = st->blots[n].x;
+ FLOAT y1 = st->blots[n].y;
+ FLOAT z1 = st->blots[n].z;
+ FLOAT x2, y2, z2;
+
+ /* rotate on z axis */
+ x2 = x1 * cosZ - y1 * sinZ;
+ y2 = x1 * sinZ + y1 * cosZ;
+ z2 = z1;
+
+ /* rotate on x axis */
+ y1 = y2 * cosX - z2 * sinX;
+ z1 = y2 * sinX + z2 * cosX;
+ x1 = x2;
+
+ /* rotate on y axis */
+ z2 = z1 * cosY - x1 * sinY;
+ x2 = z1 * sinY + x1 * cosY;
+ y2 = y1;
+
+ st->blots[n].x = x2;
+ st->blots[n].y = y2;
+ st->blots[n].z = z2;
+ }
+}
+
+
+
+/*
+ * blot configurations
+ */
+
+/* set up the initial array of blots to be a at the edge of a sphere */
+static void setupBlotsSphere (struct state *st)
+{
+ int n;
+
+ st->blotCount = st->requestedBlotCount;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ /* pick a spot, but reject if its radius is < 0.2 or > 1 to
+ * avoid scaling problems */
+ FLOAT x, y, z, radius;
+
+ for (;;)
+ {
+ x = RAND_FLOAT_PM1;
+ y = RAND_FLOAT_PM1;
+ z = RAND_FLOAT_PM1;
+
+ radius = sqrt (x * x + y * y + z * z);
+ if ((radius >= 0.2) && (radius <= 1.0))
+ {
+ break;
+ }
+ }
+
+ x /= radius;
+ y /= radius;
+ z /= radius;
+
+ initBlot (&st->blots[n], x, y, z);
+ }
+}
+
+/* set up the initial array of blots to be a simple cube */
+static void setupBlotsCube (struct state *st)
+{
+ int i, j, k, n;
+
+ /* derive blotsPerEdge from blotCount, but then do the reverse
+ * since roundoff may have changed blotCount */
+ int blotsPerEdge = ((st->requestedBlotCount - 8) / 12) + 2;
+ FLOAT distBetween;
+
+ if (blotsPerEdge < 2)
+ {
+ blotsPerEdge = 2;
+ }
+
+ distBetween = 2.0 / (blotsPerEdge - 1.0);
+
+ st->blotCount = 8 + (blotsPerEdge - 2) * 12;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+ n = 0;
+
+ /* define the corners */
+ for (i = -1; i < 2; i += 2)
+ {
+ for (j = -1; j < 2; j += 2)
+ {
+ for (k = -1; k < 2; k += 2)
+ {
+ initBlot (&st->blots[n], i, j, k);
+ n++;
+ }
+ }
+ }
+
+ /* define the edges */
+ for (i = 1; i < (blotsPerEdge - 1); i++)
+ {
+ FLOAT varEdge = distBetween * i - 1;
+ initBlot (&st->blots[n++], varEdge, -1, -1);
+ initBlot (&st->blots[n++], varEdge, 1, -1);
+ initBlot (&st->blots[n++], varEdge, -1, 1);
+ initBlot (&st->blots[n++], varEdge, 1, 1);
+ initBlot (&st->blots[n++], -1, varEdge, -1);
+ initBlot (&st->blots[n++], 1, varEdge, -1);
+ initBlot (&st->blots[n++], -1, varEdge, 1);
+ initBlot (&st->blots[n++], 1, varEdge, 1);
+ initBlot (&st->blots[n++], -1, -1, varEdge);
+ initBlot (&st->blots[n++], 1, -1, varEdge);
+ initBlot (&st->blots[n++], -1, 1, varEdge);
+ initBlot (&st->blots[n++], 1, 1, varEdge);
+ }
+
+ scaleBlotsToRadius1 (st);
+ randomlyReorderBlots (st);
+ randomlyRotateBlots (st);
+}
+
+/* set up the initial array of blots to be a cylinder */
+static void setupBlotsCylinder (struct state *st)
+{
+ int i, j, n;
+ FLOAT distBetween;
+
+ /* derive blotsPerEdge and blotsPerRing from blotCount, but then do the
+ * reverse since roundoff may have changed blotCount */
+ FLOAT reqRoot = sqrt ((FLOAT) st->requestedBlotCount);
+ int blotsPerRing = ceil (RAND_FLOAT_PM1 * reqRoot) / 2 + reqRoot;
+ int blotsPerEdge = st->requestedBlotCount / blotsPerRing;
+
+ if (blotsPerRing < 2)
+ {
+ blotsPerRing = 2;
+ }
+
+ if (blotsPerEdge < 2)
+ {
+ blotsPerEdge = 2;
+ }
+
+ distBetween = 2.0 / (blotsPerEdge - 1);
+
+ st->blotCount = blotsPerEdge * blotsPerRing;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+ n = 0;
+
+ /* define the edges */
+ for (i = 0; i < blotsPerRing; i++)
+ {
+ FLOAT x = sin (2 * M_PI / blotsPerRing * i);
+ FLOAT y = cos (2 * M_PI / blotsPerRing * i);
+ for (j = 0; j < blotsPerEdge; j++)
+ {
+ initBlot (&st->blots[n], x, y, j * distBetween - 1);
+ n++;
+ }
+ }
+
+ scaleBlotsToRadius1 (st);
+ randomlyReorderBlots (st);
+ randomlyRotateBlots (st);
+}
+
+/* set up the initial array of blots to be a squiggle */
+static void setupBlotsSquiggle (struct state *st)
+{
+ FLOAT x, y, z, xv, yv, zv, len;
+ int minCoor, maxCoor;
+ int n;
+
+ st->blotCount = st->requestedBlotCount;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+
+ maxCoor = (int) (RAND_FLOAT_01 * 5) + 1;
+ minCoor = -maxCoor;
+
+ x = RAND_FLOAT_PM1;
+ y = RAND_FLOAT_PM1;
+ z = RAND_FLOAT_PM1;
+
+ xv = RAND_FLOAT_PM1;
+ yv = RAND_FLOAT_PM1;
+ zv = RAND_FLOAT_PM1;
+ len = sqrt (xv * xv + yv * yv + zv * zv);
+ xv /= len;
+ yv /= len;
+ zv /= len;
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ FLOAT newx, newy, newz;
+ initBlot (&st->blots[n], x, y, z);
+
+ for (;;)
+ {
+ xv += RAND_FLOAT_PM1 * 0.1;
+ yv += RAND_FLOAT_PM1 * 0.1;
+ zv += RAND_FLOAT_PM1 * 0.1;
+ len = sqrt (xv * xv + yv * yv + zv * zv);
+ xv /= len;
+ yv /= len;
+ zv /= len;
+
+ newx = x + xv * 0.1;
+ newy = y + yv * 0.1;
+ newz = z + zv * 0.1;
+
+ if ( (newx >= minCoor) && (newx <= maxCoor)
+ && (newy >= minCoor) && (newy <= maxCoor)
+ && (newz >= minCoor) && (newz <= maxCoor))
+ {
+ break;
+ }
+ }
+
+ x = newx;
+ y = newy;
+ z = newz;
+ }
+
+ scaleBlotsToRadius1 (st);
+ randomlyReorderBlots (st);
+}
+
+/* set up the initial array of blots to be near the corners of a
+ * cube, distributed slightly */
+static void setupBlotsCubeCorners (struct state *st)
+{
+ int n;
+
+ st->blotCount = st->requestedBlotCount;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ FLOAT x = rint (RAND_FLOAT_01) * 2 - 1;
+ FLOAT y = rint (RAND_FLOAT_01) * 2 - 1;
+ FLOAT z = rint (RAND_FLOAT_01) * 2 - 1;
+
+ x += RAND_FLOAT_PM1 * 0.3;
+ y += RAND_FLOAT_PM1 * 0.3;
+ z += RAND_FLOAT_PM1 * 0.3;
+
+ initBlot (&st->blots[n], x, y, z);
+ }
+
+ scaleBlotsToRadius1 (st);
+ randomlyRotateBlots (st);
+}
+
+/* set up the initial array of blots to be randomly distributed
+ * on the surface of a tetrahedron */
+static void setupBlotsTetrahedron (struct state *st)
+{
+ /* table of corners of the tetrahedron */
+ static const FLOAT cor[4][3] = { { 0.0, 1.0, 0.0 },
+ { -0.75, -0.5, -0.433013 },
+ { 0.0, -0.5, 0.866025 },
+ { 0.75, -0.5, -0.433013 } };
+
+ int n, c;
+
+ /* derive blotsPerSurface from blotCount, but then do the reverse
+ * since roundoff may have changed blotCount */
+ int blotsPerSurface = st->requestedBlotCount / 4;
+
+ st->blotCount = blotsPerSurface * 4;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+
+ for (n = 0; n < st->blotCount; n += 4)
+ {
+ /* pick a random point on a unit right triangle */
+ FLOAT rawx = RAND_FLOAT_01;
+ FLOAT rawy = RAND_FLOAT_01;
+
+ if ((rawx + rawy) > 1)
+ {
+ /* swap coords into place */
+ FLOAT t = 1.0 - rawx;
+ rawx = 1.0 - rawy;
+ rawy = t;
+ }
+
+ /* translate the point to be on each of the surfaces */
+ for (c = 0; c < 4; c++)
+ {
+ FLOAT x, y, z;
+
+ int c1 = (c + 1) % 4;
+ int c2 = (c + 2) % 4;
+
+ x = (cor[c1][0] - cor[c][0]) * rawx +
+ (cor[c2][0] - cor[c][0]) * rawy +
+ cor[c][0];
+
+ y = (cor[c1][1] - cor[c][1]) * rawx +
+ (cor[c2][1] - cor[c][1]) * rawy +
+ cor[c][1];
+
+ z = (cor[c1][2] - cor[c][2]) * rawx +
+ (cor[c2][2] - cor[c][2]) * rawy +
+ cor[c][2];
+
+ initBlot (&st->blots[n + c], x, y, z);
+ }
+ }
+
+ randomlyRotateBlots (st);
+}
+
+/* set up the initial array of blots to be an almost-evenly-distributed
+ * square sheet */
+static void setupBlotsSheet (struct state *st)
+{
+ int x, y;
+
+ int blotsPerDimension = floor (sqrt (st->requestedBlotCount));
+ FLOAT spaceBetween;
+
+ if (blotsPerDimension < 2)
+ {
+ blotsPerDimension = 2;
+ }
+
+ spaceBetween = 2.0 / (blotsPerDimension - 1);
+
+ st->blotCount = blotsPerDimension * blotsPerDimension;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+
+ for (x = 0; x < blotsPerDimension; x++)
+ {
+ for (y = 0; y < blotsPerDimension; y++)
+ {
+ FLOAT x1 = x * spaceBetween - 1.0;
+ FLOAT y1 = y * spaceBetween - 1.0;
+ FLOAT z1 = 0.0;
+
+ x1 += RAND_FLOAT_PM1 * spaceBetween / 3;
+ y1 += RAND_FLOAT_PM1 * spaceBetween / 3;
+ z1 += RAND_FLOAT_PM1 * spaceBetween / 2;
+
+ initBlot (&st->blots[x + y * blotsPerDimension], x1, y1, z1);
+ }
+ }
+
+ scaleBlotsToRadius1 (st);
+ randomlyReorderBlots (st);
+ randomlyRotateBlots (st);
+}
+
+/* set up the initial array of blots to be a swirlycone */
+static void setupBlotsSwirlyCone (struct state *st)
+{
+ FLOAT radSpace = 1.0 / (st->requestedBlotCount - 1);
+ FLOAT zSpace = radSpace * 2;
+ FLOAT rotAmt = RAND_FLOAT_PM1 * M_PI / 10;
+
+ int n;
+ FLOAT rot = 0.0;
+
+ st->blotCount = st->requestedBlotCount;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ FLOAT radius = n * radSpace;
+ FLOAT x = cos (rot) * radius;
+ FLOAT y = sin (rot) * radius;
+ FLOAT z = n * zSpace - 1.0;
+
+ rot += rotAmt;
+ initBlot (&st->blots[n], x, y, z);
+ }
+
+ scaleBlotsToRadius1 (st);
+ randomlyReorderBlots (st);
+ randomlyRotateBlots (st);
+}
+
+/* forward declaration for recursive use immediately below */
+static void setupBlots (struct state *st);
+
+/* set up the blots to be two of the other choices, placed next to
+ * each other */
+static void setupBlotsDuo (struct state *st)
+{
+ int origRequest = st->requestedBlotCount;
+ FLOAT tx, ty, tz, radius;
+ Blot *blots1, *blots2;
+ int count1, count2;
+ int n;
+
+ if (st->requestedBlotCount < 15)
+ {
+ /* special case bottom-out */
+ setupBlotsSphere (st);
+ return;
+ }
+
+ tx = RAND_FLOAT_PM1;
+ ty = RAND_FLOAT_PM1;
+ tz = RAND_FLOAT_PM1;
+ radius = sqrt (tx * tx + ty * ty + tz * tz);
+ tx /= radius;
+ ty /= radius;
+ tz /= radius;
+
+ /* recursive call to setup set 1 */
+ st->requestedBlotCount = origRequest / 2;
+ setupBlots (st);
+
+ if (st->blotCount >= origRequest)
+ {
+ /* return immediately if this satisfies the original count request */
+ st->requestedBlotCount = origRequest;
+ return;
+ }
+
+ blots1 = st->blots;
+ count1 = st->blotCount;
+ st->blots = NULL;
+ st->blotCount = 0;
+
+ /* translate to new position */
+ for (n = 0; n < count1; n++)
+ {
+ blots1[n].x += tx;
+ blots1[n].y += ty;
+ blots1[n].z += tz;
+ }
+
+ /* recursive call to setup set 2 */
+ st->requestedBlotCount = origRequest - count1;
+ setupBlots (st);
+ blots2 = st->blots;
+ count2 = st->blotCount;
+
+ /* translate to new position */
+ for (n = 0; n < count2; n++)
+ {
+ blots2[n].x -= tx;
+ blots2[n].y -= ty;
+ blots2[n].z -= tz;
+ }
+
+ /* combine the two arrays */
+ st->blotCount = count1 + count2;
+ st->blots = calloc (sizeof (Blot), st->blotCount);
+ memcpy (&st->blots[0], blots1, sizeof (Blot) * count1);
+ memcpy (&st->blots[count1], blots2, sizeof (Blot) * count2);
+ free (blots1);
+ free (blots2);
+
+ scaleBlotsToRadius1 (st);
+ randomlyReorderBlots (st);
+
+ /* restore the original requested count, for future iterations */
+ st->requestedBlotCount = origRequest;
+}
+
+
+
+/*
+ * main blot setup
+ */
+
+/* free the blots, in preparation for a new shape */
+static void freeBlots (struct state *st)
+{
+ if (st->blots != NULL)
+ {
+ free (st->blots);
+ st->blots = NULL;
+ }
+
+ if (st->segsToErase != NULL)
+ {
+ free (st->segsToErase);
+ st->segsToErase = NULL;
+ }
+
+ if (st->segsToDraw != NULL)
+ {
+ free (st->segsToDraw);
+ st->segsToDraw = NULL;
+ }
+}
+
+/* set up the initial arrays of blots */
+static void setupBlots (struct state *st)
+{
+ int which = RAND_FLOAT_01 * 11;
+
+ freeBlots (st);
+
+ switch (which)
+ {
+ case 0:
+ setupBlotsCube (st);
+ break;
+ case 1:
+ setupBlotsSphere (st);
+ break;
+ case 2:
+ setupBlotsCylinder (st);
+ break;
+ case 3:
+ setupBlotsSquiggle (st);
+ break;
+ case 4:
+ setupBlotsCubeCorners (st);
+ break;
+ case 5:
+ setupBlotsTetrahedron (st);
+ break;
+ case 6:
+ setupBlotsSheet (st);
+ break;
+ case 7:
+ setupBlotsSwirlyCone (st);
+ break;
+ case 8:
+ case 9:
+ case 10:
+ setupBlotsDuo (st);
+ break;
+ }
+}
+
+/* set up the segments arrays */
+static void setupSegs (struct state *st)
+{
+ /* there are blotShapeCount - 1 line segments per blot */
+ st->segCount = st->blotCount * (blotShapeCount - 1);
+ st->segsToErase = calloc (sizeof (LineSegment), st->segCount);
+ st->segsToDraw = calloc (sizeof (LineSegment), st->segCount);
+}
+
+
+
+/*
+ * color setup stuff
+ */
+
+/* set up the colormap */
+static void setupColormap (struct state *st, XWindowAttributes *xgwa)
+{
+ int n;
+ XGCValues gcv;
+ XColor *colors = (XColor *) calloc (sizeof (XColor), st->colorCount + 1);
+
+ unsigned short r, g, b;
+ int h1, h2;
+ double s1, s2, v1, v2;
+
+ r = RAND_FLOAT_01 * 0x10000;
+ g = RAND_FLOAT_01 * 0x10000;
+ b = RAND_FLOAT_01 * 0x10000;
+ rgb_to_hsv (r, g, b, &h1, &s1, &v1);
+ v1 = 1.0;
+ s1 = 1.0;
+
+ r = RAND_FLOAT_01 * 0x10000;
+ g = RAND_FLOAT_01 * 0x10000;
+ b = RAND_FLOAT_01 * 0x10000;
+ rgb_to_hsv (r, g, b, &h2, &s2, &v2);
+ s2 = 0.7;
+ v2 = 0.7;
+
+ colors[0].pixel = get_pixel_resource (st->dpy, xgwa->colormap,
+ "background", "Background");
+
+ make_color_ramp (xgwa->screen, xgwa->visual, xgwa->colormap,
+ h1, s1, v1, h2, s2, v2,
+ colors + 1, &st->colorCount, False, True, False);
+
+ if (st->colorCount < 1)
+ {
+ fprintf (stderr, "%s: couldn't allocate any colors\n", progname);
+ exit (-1);
+ }
+
+ st->gcs = (GC *) calloc (sizeof (GC), st->colorCount + 1);
+
+ for (n = 0; n <= st->colorCount; n++)
+ {
+ gcv.foreground = colors[n].pixel;
+ gcv.line_width = st->lineWidth;
+ st->gcs[n] = XCreateGC (st->dpy, st->window, GCForeground | GCLineWidth, &gcv);
+ }
+
+ free (colors);
+}
+
+
+
+/*
+ * overall setup stuff
+ */
+
+/* set up the system */
+static void setup (struct state *st)
+{
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->windowWidth = xgwa.width;
+ st->windowHeight = xgwa.height;
+ st->centerX = st->windowWidth / 2;
+ st->centerY = st->windowHeight / 2;
+ st->baseScale = (xgwa.height < xgwa.width) ? xgwa.height : xgwa.width;
+
+ if (st->doubleBuffer)
+ {
+ st->drawable = XCreatePixmap (st->dpy, st->window, xgwa.width, xgwa.height,
+ xgwa.depth);
+ }
+ else
+ {
+ st->drawable = st->window;
+ }
+
+ setupColormap (st, &xgwa);
+ setupBlots (st);
+ setupSegs (st);
+
+ /* set up the initial rotation, scale, and light values as random, but
+ * with the targets equal to where it is */
+ st->xRot = st->xRotTarget = RAND_FLOAT_01 * M_PI;
+ st->yRot = st->yRotTarget = RAND_FLOAT_01 * M_PI;
+ st->zRot = st->zRotTarget = RAND_FLOAT_01 * M_PI;
+ st->curScale = st->scaleTarget = RAND_FLOAT_01 * (st->maxScale - st->minScale) + st->minScale;
+ st->lightX = st->lightXTarget = RAND_FLOAT_PM1;
+ st->lightY = st->lightYTarget = RAND_FLOAT_PM1;
+ st->lightZ = st->lightZTarget = RAND_FLOAT_PM1;
+
+ st->itersTillNext = RAND_FLOAT_01 * st->maxIters;
+}
+
+
+
+/*
+ * the simulation
+ */
+
+/* "render" the blots into segsToDraw, with the current rotation factors */
+static void renderSegs (struct state *st)
+{
+ int n;
+ int m = 0;
+
+ /* rotation factors */
+ FLOAT sinX = sin (st->xRot);
+ FLOAT cosX = cos (st->xRot);
+ FLOAT sinY = sin (st->yRot);
+ FLOAT cosY = cos (st->yRot);
+ FLOAT sinZ = sin (st->zRot);
+ FLOAT cosZ = cos (st->zRot);
+
+ for (n = 0; n < st->blotCount; n++)
+ {
+ Blot *b = &st->blots[n];
+ int i, j;
+ int baseX, baseY;
+ FLOAT radius;
+ int x[3][3];
+ int y[3][3];
+ int color;
+
+ FLOAT x1 = st->blots[n].x;
+ FLOAT y1 = st->blots[n].y;
+ FLOAT z1 = st->blots[n].z;
+ FLOAT x2, y2, z2;
+
+ /* rotate on z axis */
+ x2 = x1 * cosZ - y1 * sinZ;
+ y2 = x1 * sinZ + y1 * cosZ;
+ z2 = z1;
+
+ /* rotate on x axis */
+ y1 = y2 * cosX - z2 * sinX;
+ z1 = y2 * sinX + z2 * cosX;
+ x1 = x2;
+
+ /* rotate on y axis */
+ z2 = z1 * cosY - x1 * sinY;
+ x2 = z1 * sinY + x1 * cosY;
+ y2 = y1;
+
+ /* the color to draw is based on the distance from the light of
+ * the post-rotation blot */
+ x1 = x2 - st->lightX;
+ y1 = y2 - st->lightY;
+ z1 = z2 - st->lightZ;
+ color = 1 + (x1 * x1 + y1 * y1 + z1 * z1) / 4 * st->colorCount;
+ if (color > st->colorCount)
+ {
+ color = st->colorCount;
+ }
+
+ /* set up the base screen coordinates for drawing */
+ baseX = x2 / 2 * st->baseScale * st->curScale + st->centerX + st->centerXOff;
+ baseY = y2 / 2 * st->baseScale * st->curScale + st->centerY + st->centerYOff;
+
+ radius = (z2 + 1) / 2 * (st->maxRadius - st->minRadius) + st->minRadius;
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ x[i][j] = baseX +
+ ((i - 1) + (b->xoff[i][j] * st->maxNerveRadius)) * radius;
+ y[i][j] = baseY +
+ ((j - 1) + (b->yoff[i][j] * st->maxNerveRadius)) * radius;
+ }
+ }
+
+ for (i = 1; i < blotShapeCount; i++)
+ {
+ st->segsToDraw[m].gc = st->gcs[color];
+ st->segsToDraw[m].x1 = x[blotShape[i-1].x + 1][blotShape[i-1].y + 1];
+ st->segsToDraw[m].y1 = y[blotShape[i-1].x + 1][blotShape[i-1].y + 1];
+ st->segsToDraw[m].x2 = x[blotShape[i].x + 1][blotShape[i].y + 1];
+ st->segsToDraw[m].y2 = y[blotShape[i].x + 1][blotShape[i].y + 1];
+ m++;
+ }
+ }
+}
+
+/* update blots, adjusting the offsets and rotation factors. */
+static void updateWithFeeling (struct state *st)
+{
+ int n, i, j;
+
+ /* pick a new model if the time is right */
+ st->itersTillNext--;
+ if (st->itersTillNext < 0)
+ {
+ st->itersTillNext = RAND_FLOAT_01 * st->maxIters;
+ setupBlots (st);
+ setupSegs (st);
+ renderSegs (st);
+ }
+
+ /* update the rotation factors by moving them a bit toward the targets */
+ st->xRot = st->xRot + (st->xRotTarget - st->xRot) * st->iterAmt;
+ st->yRot = st->yRot + (st->yRotTarget - st->yRot) * st->iterAmt;
+ st->zRot = st->zRot + (st->zRotTarget - st->zRot) * st->iterAmt;
+
+ /* similarly the scale factor */
+ st->curScale = st->curScale + (st->scaleTarget - st->curScale) * st->iterAmt;
+
+ /* and similarly the light position */
+ st->lightX = st->lightX + (st->lightXTarget - st->lightX) * st->iterAmt;
+ st->lightY = st->lightY + (st->lightYTarget - st->lightY) * st->iterAmt;
+ st->lightZ = st->lightZ + (st->lightZTarget - st->lightZ) * st->iterAmt;
+
+ /* for each blot... */
+ for (n = 0; n < st->blotCount; n++)
+ {
+ /* add a bit of random jitter to xoff/yoff */
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ FLOAT newOff;
+
+ newOff = st->blots[n].xoff[i][j] + RAND_FLOAT_PM1 * st->nervousness;
+ if (newOff < -1) newOff = -(newOff + 1) - 1;
+ else if (newOff > 1) newOff = -(newOff - 1) + 1;
+ st->blots[n].xoff[i][j] = newOff;
+
+ newOff = st->blots[n].yoff[i][j] + RAND_FLOAT_PM1 * st->nervousness;
+ if (newOff < -1) newOff = -(newOff + 1) - 1;
+ else if (newOff > 1) newOff = -(newOff - 1) + 1;
+ st->blots[n].yoff[i][j] = newOff;
+ }
+ }
+ }
+
+ /* depending on random chance, update one or more factors */
+ if (RAND_FLOAT_01 <= st->eventChance)
+ {
+ int which = RAND_FLOAT_01 * 14;
+ switch (which)
+ {
+ case 0:
+ {
+ st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ break;
+ }
+ case 1:
+ {
+ st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ break;
+ }
+ case 2:
+ {
+ st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ break;
+ }
+ case 3:
+ {
+ st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ break;
+ }
+ case 4:
+ {
+ st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ break;
+ }
+ case 5:
+ {
+ st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ break;
+ }
+ case 6:
+ {
+ st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2;
+ break;
+ }
+ case 7:
+ {
+ st->centerXOff = RAND_FLOAT_PM1 * st->maxRadius;
+ break;
+ }
+ case 8:
+ {
+ st->centerYOff = RAND_FLOAT_PM1 * st->maxRadius;
+ break;
+ }
+ case 9:
+ {
+ st->centerXOff = RAND_FLOAT_PM1 * st->maxRadius;
+ st->centerYOff = RAND_FLOAT_PM1 * st->maxRadius;
+ break;
+ }
+ case 10:
+ {
+ st->scaleTarget =
+ RAND_FLOAT_01 * (st->maxScale - st->minScale) + st->minScale;
+ break;
+ }
+ case 11:
+ {
+ st->curScale =
+ RAND_FLOAT_01 * (st->maxScale - st->minScale) + st->minScale;
+ break;
+ }
+ case 12:
+ {
+ st->lightX = RAND_FLOAT_PM1;
+ st->lightY = RAND_FLOAT_PM1;
+ st->lightZ = RAND_FLOAT_PM1;
+ break;
+ }
+ case 13:
+ {
+ st->lightXTarget = RAND_FLOAT_PM1;
+ st->lightYTarget = RAND_FLOAT_PM1;
+ st->lightZTarget = RAND_FLOAT_PM1;
+ break;
+ }
+ }
+ }
+}
+
+/* erase segsToErase and draw segsToDraw */
+static void eraseAndDraw (struct state *st)
+{
+ int n;
+
+ if (st->doubleBuffer)
+ XFillRectangle (st->dpy, st->drawable, st->gcs[0], 0, 0,
+ st->windowWidth, st->windowHeight);
+ else
+ XClearWindow (st->dpy, st->drawable);
+
+ for (n = 0; n < st->segCount; n++)
+ {
+ LineSegment *seg = &st->segsToErase[n];
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XDrawLine (st->dpy, st->drawable, st->gcs[0],
+ seg->x1, seg->y1, seg->x2, seg->y2);
+#endif
+ seg = &st->segsToDraw[n];
+ XDrawLine (st->dpy, st->drawable, seg->gc,
+ seg->x1, seg->y1, seg->x2, seg->y2);
+ }
+
+ if (st->doubleBuffer)
+ {
+ XCopyArea (st->dpy, st->drawable, st->window, st->gcs[0], 0, 0,
+ st->windowWidth, st->windowHeight, 0, 0);
+ }
+}
+
+/* do one iteration */
+static unsigned long
+nerverot_draw (Display *dpy, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ /* switch segsToErase and segsToDraw */
+ LineSegment *temp = st->segsToDraw;
+ st->segsToDraw = st->segsToErase;
+ st->segsToErase = temp;
+
+ /* update the model */
+ updateWithFeeling (st);
+
+ /* render new segments */
+ renderSegs (st);
+
+ /* erase old segments and draw new ones */
+ eraseAndDraw (st);
+
+ return st->delay;
+}
+
+/* initialize the user-specifiable params */
+static void initParams (struct state *st)
+{
+ int problems = 0;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ if (st->delay < 0)
+ {
+ fprintf (stderr, "error: delay must be at least 0\n");
+ problems = 1;
+ }
+
+ st->maxIters = get_integer_resource (st->dpy, "maxIters", "Integer");
+ if (st->maxIters < 0)
+ {
+ fprintf (stderr, "error: maxIters must be at least 0\n");
+ problems = 1;
+ }
+
+ st->doubleBuffer = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->doubleBuffer = False;
+# endif
+
+ st->requestedBlotCount = get_integer_resource (st->dpy, "count", "Count");
+ if (st->requestedBlotCount <= 0)
+ {
+ fprintf (stderr, "error: count must be at least 0\n");
+ problems = 1;
+ }
+
+ st->colorCount = get_integer_resource (st->dpy, "colors", "Colors");
+ if (st->colorCount <= 0)
+ {
+ fprintf (stderr, "error: colors must be at least 1\n");
+ problems = 1;
+ }
+
+ st->lineWidth = get_integer_resource (st->dpy, "lineWidth", "LineWidth");
+ if (st->lineWidth < 0)
+ {
+ fprintf (stderr, "error: line width must be at least 0\n");
+ problems = 1;
+ }
+
+ st->nervousness = get_float_resource (st->dpy, "nervousness", "Float");
+ if ((st->nervousness < 0) || (st->nervousness > 1))
+ {
+ fprintf (stderr, "error: nervousness must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ st->maxNerveRadius = get_float_resource (st->dpy, "maxNerveRadius", "Float");
+ if ((st->maxNerveRadius < 0) || (st->maxNerveRadius > 1))
+ {
+ fprintf (stderr, "error: maxNerveRadius must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ st->eventChance = get_float_resource (st->dpy, "eventChance", "Float");
+ if ((st->eventChance < 0) || (st->eventChance > 1))
+ {
+ fprintf (stderr, "error: eventChance must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ st->iterAmt = get_float_resource (st->dpy, "iterAmt", "Float");
+ if ((st->iterAmt < 0) || (st->iterAmt > 1))
+ {
+ fprintf (stderr, "error: iterAmt must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ st->minScale = get_float_resource (st->dpy, "minScale", "Float");
+ if ((st->minScale < 0) || (st->minScale > 10))
+ {
+ fprintf (stderr, "error: minScale must be in the range 0..10\n");
+ problems = 1;
+ }
+
+ st->maxScale = get_float_resource (st->dpy, "maxScale", "Float");
+ if ((st->maxScale < 0) || (st->maxScale > 10))
+ {
+ fprintf (stderr, "error: maxScale must be in the range 0..10\n");
+ problems = 1;
+ }
+
+ if (st->maxScale < st->minScale)
+ {
+ fprintf (stderr, "error: maxScale must be >= minScale\n");
+ problems = 1;
+ }
+
+ st->minRadius = get_integer_resource (st->dpy, "minRadius", "Integer");
+ if ((st->minRadius < 1) || (st->minRadius > 100))
+ {
+ fprintf (stderr, "error: minRadius must be in the range 1..100\n");
+ problems = 1;
+ }
+
+ st->maxRadius = get_integer_resource (st->dpy, "maxRadius", "Integer");
+ if ((st->maxRadius < 1) || (st->maxRadius > 100))
+ {
+ fprintf (stderr, "error: maxRadius must be in the range 1..100\n");
+ problems = 1;
+ }
+
+ if (st->maxRadius < st->minRadius)
+ {
+ fprintf (stderr, "error: maxRadius must be >= minRadius\n");
+ problems = 1;
+ }
+
+ if (problems)
+ {
+ exit (1);
+ }
+}
+
+static void *
+nerverot_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+
+ initParams (st);
+ setup (st);
+
+ /* make a valid set to erase at first */
+ renderSegs (st);
+ return st;
+}
+
+static void
+nerverot_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+nerverot_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+nerverot_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ freeBlots (st);
+ free (st);
+}
+
+
+static const char *nerverot_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*count: 250",
+ "*colors: 4",
+ "*delay: 10000",
+ "*maxIters: 1200",
+ "*doubleBuffer: false",
+ "*eventChance: 0.2",
+ "*iterAmt: 0.01",
+ "*lineWidth: 0",
+ "*minScale: 0.6",
+ "*maxScale: 1.75",
+ "*minRadius: 3",
+ "*maxRadius: 25",
+ "*maxNerveRadius: 0.7",
+ "*nervousness: 0.3",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec nerverot_options [] = {
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-max-iters", ".maxIters", XrmoptionSepArg, 0 },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "true" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "false" },
+ { "-event-chance", ".eventChance", XrmoptionSepArg, 0 },
+ { "-iter-amt", ".iterAmt", XrmoptionSepArg, 0 },
+ { "-line-width", ".lineWidth", XrmoptionSepArg, 0 },
+ { "-min-scale", ".minScale", XrmoptionSepArg, 0 },
+ { "-max-scale", ".maxScale", XrmoptionSepArg, 0 },
+ { "-min-radius", ".minRadius", XrmoptionSepArg, 0 },
+ { "-max-radius", ".maxRadius", XrmoptionSepArg, 0 },
+ { "-max-nerve-radius", ".maxNerveRadius", XrmoptionSepArg, 0 },
+ { "-nervousness", ".nervousness", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("NerveRot", nerverot)
diff --git a/hacks/nerverot.man b/hacks/nerverot.man
new file mode 100644
index 0000000..2c474b6
--- /dev/null
+++ b/hacks/nerverot.man
@@ -0,0 +1,132 @@
+.TH XScreenSaver 1 "20-Mar-2001" "X Version 11"
+.SH NAME
+nerverot - induces edginess in the viewer
+.SH SYNOPSIS
+.B nerverot
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-db] [\-no\-db] [\-colors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-line\-width \fIinteger\fP] [\-event\-chance \fIfraction\fP] [\-iter\-amt \fIfraction\fP] [\-nervousness \fIfraction\fP] [\-max\-nerve\-radius \fIfraction\fP] [\-min\-radius \fIinteger\fP] [\-max\-radius \fIinteger\fP] [\-min\-scale \fIfraction\fP] [\-max\-scale \fIfraction\fP]
+[\-fps]
+.SH DESCRIPTION
+The goal of \fInerverot\fP is to be interesting and compelling to
+watch, yet induce a state of nervous edginess in the viewer. This manpage
+describes v1.3 of the program.
+.SH OPTIONS
+.I nerverot
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-db
+.B \-no\-db
+Use double-buffering (or not, respectively). Double-buffering may make
+things look better for larger line widths and/or larger numbers of
+blots, but "better" may equate to yielding less of the desired edginess
+effect. You'll be calmer after watching the double-buffered variant;
+you're more likely to go into epileptic fits with it off. Hence, it
+is off (false) by default, resource \fIdoubleBuffer\fP.
+.TP 8
+.B \-colors \fIinteger\fP
+How many colors should be used (if possible). The colors
+form a smooth ramp between two randomly-chosen colors. Defaults to 4,
+resource \fIcolors\fP.
+.TP 8
+.B \-delay \fImicroseconds\fP
+The interframe delay, in microseconds. Defaults to 10000, resource
+\fIdelay\fP.
+.TP 8
+.B \-max\-iters \fIinteger\fP
+The maximum number of iterations (frames) before a new model is
+generated. The actual number of iterations per model is a random number
+between 1 and this value. Defaults to 1200, resource
+\fImaxIters\fP.
+.TP 8
+.B \-count \fIinteger\fP
+How many "blots" to draw at a time. This number may be rounded down to
+fit the particularly chosen model, and has a fixed minimum per-model.
+Defaults to 250, resource \fIcount\fP.
+.TP 8
+.B \-line\-width \fIinteger\fP
+The width of the lines to draw. 0 means an optimized pixel-thick line.
+Defaults to 0, resource \fIlineWidth\fP.
+.TP 8
+.B \-event\-chance \fIfraction\fP
+The chance, per iteration, for a life-altering event to occur (such as
+picking a new rotation target), in the range 0..1. Defaults to 0.2,
+resource \fIeventChance\fP.
+.TP 8
+.B \-iter\-amt \fIfraction\fP
+The fraction of movement towards a target (such as rotation angle or scale)
+that happens per iteration, in the range 0..1. Defaults to 0.01,
+resource \fIiterAmt\fP.
+.TP 8
+.B \-nervousness \fIfraction\fP
+How nervous the drawing is, in the range 0..1. This is how jumpy the points
+on each blot are. Defaults to 0.3, resource \fInervousness\fP.
+.TP 8
+.B \-max\-nerve\-radius \fIfraction\fP
+The maximum radius of blot nervousness, as a fraction of the radius of the
+blot, in the range 0..1. Defaults to 0.7, resource \fImaxNerveRadius\fP.
+.TP 8
+.B \-min\-radius \fIinteger\fP
+The minimum radius for a blot, in the range 1..100. Defaults to 3,
+resource \fIminRadius\fP.
+.TP 8
+.B \-max\-radius \fIinteger\fP
+The maximum radius for a blot, in the range 1..100. Defaults to 25,
+resource \fImaxRadius\fP.
+.TP 8
+.B \-min\-scale \fIfraction\fP
+The minimum overall scale of drawing, as a fraction of
+\fImin(windowHeight,windowWidth)\fP, in the range 0..10. Defaults to 0.6,
+resource \fIminScale\fP.
+.TP 8
+.B \-max\-scale \fIfraction\fP
+The maximum overall scale of drawing, as a fraction of
+\fImin(windowHeight,windowWidth)\fP, in the range 0..10. Defaults to 1.75,
+resource \fImaxScale\fP.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+There are resource equivalents for each option, noted above.
+.SH BUGS
+.I nerverot
+should have more models.
+.TP 8
+XDBE should be detected and used, if available.
+.SH SEE ALSO
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2000-2001 by Dan Bornstein. All rights reserved.
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of this
+software for any purpose. It is provided "as is" without express or
+implied warranty.
+.SH AUTHOR
+Dan Bornstein <danfuzz@milk.com>.
diff --git a/hacks/noseguy.c b/hacks/noseguy.c
new file mode 100644
index 0000000..726c2a7
--- /dev/null
+++ b/hacks/noseguy.c
@@ -0,0 +1,689 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Make a little guy with a big nose and a hat wanter around the screen,
+ spewing out messages. Derived from xnlock by
+ Dan Heller <argv@danheller.com>.
+ */
+
+#include "screenhack.h"
+#include "ximage-loader.h"
+#include "textclient.h"
+#include "xft.h"
+
+#define font_height(font) (font->ascent + font->descent)
+
+
+typedef struct { Pixmap p, m; } PM;
+
+struct state {
+ Display *dpy;
+ Window window;
+ int Width, Height;
+ GC fg_gc, bg_gc, text_fg_gc, text_bg_gc;
+ int x, y;
+
+ XftFont *xftfont;
+ XftColor xftcolor;
+ XftDraw *xftdraw;
+
+ unsigned long interval;
+ PM left1, left2, right1, right2, left_front, right_front, front, down;
+ int pix_w, pix_h;
+
+ text_data *tc;
+
+ int state; /* indicates states: walking or getting passwd */
+ int first_time;
+
+ void (*next_fn) (struct state *);
+
+ int move_length, move_dir;
+
+ int walk_lastdir;
+ int walk_up;
+ PM *walk_frame;
+
+ int X, Y, talking;
+
+ struct {
+ int x, y, width, height;
+ } s_rect;
+
+ char words[10240];
+ int lines;
+};
+
+static void fill_words (struct state *);
+static void walk (struct state *, int dir);
+static void talk (struct state *, int erase);
+static void talk_1 (struct state *);
+static int think (struct state *);
+static unsigned long look (struct state *);
+
+#define IS_MOVING 1
+
+#include "images/gen/nose-f1_png.h"
+#include "images/gen/nose-f2_png.h"
+#include "images/gen/nose-f3_png.h"
+#include "images/gen/nose-f4_png.h"
+#include "images/gen/nose-l1_png.h"
+#include "images/gen/nose-l2_png.h"
+#include "images/gen/nose-r1_png.h"
+#include "images/gen/nose-r2_png.h"
+
+static Pixmap
+double_pixmap (Display *dpy, Visual *visual, int depth, Pixmap pixmap,
+ int pix_w, int pix_h)
+{
+ int x, y;
+ Pixmap p2 = XCreatePixmap(dpy, pixmap, pix_w*2, pix_h*2, depth);
+ XImage *i1 = XGetImage (dpy, pixmap, 0, 0, pix_w, pix_h, ~0L,
+ (depth == 1 ? XYPixmap : ZPixmap));
+ XImage *i2 = XCreateImage (dpy, visual, depth,
+ (depth == 1 ? XYPixmap : ZPixmap), 0, 0,
+ pix_w*2, pix_h*2, 8, 0);
+ XGCValues gcv;
+ GC gc = XCreateGC (dpy, p2, 0, &gcv);
+ i2->data = (char *) calloc(i2->height, i2->bytes_per_line);
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ {
+ unsigned long p = XGetPixel(i1, x, y);
+ XPutPixel(i2, x*2, y*2, p);
+ XPutPixel(i2, x*2+1, y*2, p);
+ XPutPixel(i2, x*2, y*2+1, p);
+ XPutPixel(i2, x*2+1, y*2+1, p);
+ }
+ free(i1->data); i1->data = 0;
+ XDestroyImage(i1);
+ XPutImage(dpy, p2, gc, i2, 0, 0, 0, 0, i2->width, i2->height);
+ XFreeGC (dpy, gc);
+ free(i2->data); i2->data = 0;
+ XDestroyImage(i2);
+ XFreePixmap(dpy, pixmap);
+ return p2;
+}
+
+
+static void
+init_images (struct state *st)
+{
+ PM *images[8];
+ struct { const unsigned char *png; unsigned long size; } bits[8];
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ int i = 0;
+ images[i++] = &st->left1;
+ images[i++] = &st->left2;
+ images[i++] = &st->right1;
+ images[i++] = &st->right2;
+ images[i++] = &st->left_front;
+ images[i++] = &st->right_front;
+ images[i++] = &st->front;
+ images[i] = &st->down;
+
+#define DEF(N,S) bits[i].png = N; bits[i].size = S; i++
+ i = 0;
+ DEF(nose_l1_png, sizeof(nose_l1_png));
+ DEF(nose_l2_png, sizeof(nose_l2_png));
+ DEF(nose_r1_png, sizeof(nose_r1_png));
+ DEF(nose_r2_png, sizeof(nose_r2_png));
+ DEF(nose_f2_png, sizeof(nose_f2_png));
+ DEF(nose_f3_png, sizeof(nose_f3_png));
+ DEF(nose_f1_png, sizeof(nose_f1_png));
+ DEF(nose_f4_png, sizeof(nose_f4_png));
+
+ for (i = 0; i < sizeof (images) / sizeof(*images); i++)
+ {
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (st->dpy, st->window,
+ bits[i].png, bits[i].size,
+ &st->pix_w, &st->pix_h, &mask);
+ if (!pixmap)
+ {
+ fprintf (stderr, "%s: Can't load nose images\n", progname);
+ exit (1);
+ }
+ images[i]->p = pixmap;
+ images[i]->m = mask;
+ }
+
+ if (xgwa.width > 2560) /* Retina display */
+ {
+ for (i = 0; i < sizeof (images) / sizeof(*images); i++)
+ {
+ images[i]->p = double_pixmap (st->dpy, xgwa.visual, xgwa.depth,
+ images[i]->p, st->pix_w, st->pix_h);
+ images[i]->m = double_pixmap (st->dpy, xgwa.visual, 1,
+ images[i]->m, st->pix_w, st->pix_h);
+ }
+ st->pix_w *= 2;
+ st->pix_h *= 2;
+ }
+}
+
+#define LEFT 001
+#define RIGHT 002
+#define DOWN 004
+#define UP 010
+#define FRONT 020
+#define X_INCR 3
+#define Y_INCR 2
+
+static void
+move (struct state *st)
+{
+ if (!st->move_length)
+ {
+ register int tries = 0;
+ st->move_dir = 0;
+ if ((random() & 1) && think(st))
+ {
+ talk(st, 0); /* sets timeout to itself */
+ return;
+ }
+ if (!(random() % 3) && (st->interval = look(st)))
+ {
+ st->next_fn = move;
+ return;
+ }
+ st->interval = 20 + random() % 100;
+ do
+ {
+ if (!tries)
+ st->move_length = st->Width / 100 + random() % 90, tries = 8;
+ else
+ tries--;
+ /* There maybe the case that we won't be able to exit from
+ this routine (especially when the geometry is too small)!!
+
+ Ensure that we can exit from this routine.
+ */
+#if 1
+ if (!tries && (st->move_length <= 1)) {
+ st->move_length = 1;
+ break;
+ }
+#endif
+ switch (random() % 8)
+ {
+ case 0:
+ if (st->x - X_INCR * st->move_length >= 5)
+ st->move_dir = LEFT;
+ break;
+ case 1:
+ if (st->x + X_INCR * st->move_length <= st->Width - 70)
+ st->move_dir = RIGHT;
+ break;
+ case 2:
+ if (st->y - (Y_INCR * st->move_length) >= 5)
+ st->move_dir = UP, st->interval = 40;
+ break;
+ case 3:
+ if (st->y + Y_INCR * st->move_length <= st->Height - 70)
+ st->move_dir = DOWN, st->interval = 20;
+ break;
+ case 4:
+ if (st->x - X_INCR * st->move_length >= 5 && st->y - (Y_INCR * st->move_length) >= 5)
+ st->move_dir = (LEFT | UP);
+ break;
+ case 5:
+ if (st->x + X_INCR * st->move_length <= st->Width - 70 &&
+ st->y - Y_INCR * st->move_length >= 5)
+ st->move_dir = (RIGHT | UP);
+ break;
+ case 6:
+ if (st->x - X_INCR * st->move_length >= 5 &&
+ st->y + Y_INCR * st->move_length <= st->Height - 70)
+ st->move_dir = (LEFT | DOWN);
+ break;
+ case 7:
+ if (st->x + X_INCR * st->move_length <= st->Width - 70 &&
+ st->y + Y_INCR * st->move_length <= st->Height - 70)
+ st->move_dir = (RIGHT | DOWN);
+ break;
+ default:
+ /* No Defaults */
+ break;
+ }
+ } while (!st->move_dir);
+ }
+ if (st->move_dir)
+ walk(st, st->move_dir);
+ --st->move_length;
+ st->next_fn = move;
+}
+
+# define COPY(dpy,frame,window,gc,x,y,w,h,x2,y2) do {\
+ int X2 = (x2), Y2 = (y2); \
+ PM *FRAME = (frame); \
+ XFillRectangle(dpy,window,st->bg_gc,X2,Y2,w,h); \
+ XSetClipMask (dpy,gc,FRAME->m); \
+ XSetClipOrigin (dpy,gc,X2,Y2); \
+ XCopyArea (dpy,FRAME->p,window,gc,x,y,w,h,X2,Y2); \
+ XSetClipMask (dpy,gc,None); \
+ } while(0)
+
+static void
+walk (struct state *st, int dir)
+{
+ register int incr = 0;
+
+ if (dir & (LEFT | RIGHT))
+ { /* left/right movement (mabye up/st->down too) */
+ st->walk_up = -st->walk_up; /* bouncing effect (even if hit a wall) */
+ if (dir & LEFT)
+ {
+ incr = X_INCR;
+ st->walk_frame = (st->walk_up < 0) ? &st->left1 : &st->left2;
+ }
+ else
+ {
+ incr = -X_INCR;
+ st->walk_frame = (st->walk_up < 0) ? &st->right1 : &st->right2;
+ }
+ if ((st->walk_lastdir == FRONT || st->walk_lastdir == DOWN) && dir & UP)
+ {
+
+ /*
+ * workaround silly bug that leaves screen dust when guy is
+ * facing forward or st->down and moves up-left/right.
+ */
+ COPY(st->dpy, st->walk_frame, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, st->x, st->y);
+ }
+ /* note that maybe neither UP nor DOWN is set! */
+ if (dir & UP && st->y > Y_INCR)
+ st->y -= Y_INCR;
+ else if (dir & DOWN && st->y < st->Height - st->pix_h)
+ st->y += Y_INCR;
+ }
+ /* Explicit up/st->down movement only (no left/right) */
+ else if (dir == UP)
+ COPY(st->dpy, &st->front, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, st->x, st->y -= Y_INCR);
+ else if (dir == DOWN)
+ COPY(st->dpy, &st->down, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, st->x, st->y += Y_INCR);
+ else if (dir == FRONT && st->walk_frame != &st->front)
+ {
+ if (st->walk_up > 0)
+ st->walk_up = -st->walk_up;
+ if (st->walk_lastdir & LEFT)
+ st->walk_frame = &st->left_front;
+ else if (st->walk_lastdir & RIGHT)
+ st->walk_frame = &st->right_front;
+ else
+ st->walk_frame = &st->front;
+ COPY(st->dpy, st->walk_frame, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, st->x, st->y);
+ }
+ if (dir & LEFT)
+ while (--incr >= 0)
+ {
+ COPY(st->dpy, st->walk_frame, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, --st->x, st->y + st->walk_up);
+ }
+ else if (dir & RIGHT)
+ while (++incr <= 0)
+ {
+ COPY(st->dpy, st->walk_frame, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, ++st->x, st->y + st->walk_up);
+ }
+ st->walk_lastdir = dir;
+}
+
+static int
+think (struct state *st)
+{
+ if (random() & 1)
+ walk(st, FRONT);
+ if (random() & 1)
+ return 1;
+ return 0;
+}
+
+#define MAXLINES 10
+#define LINELEN 256
+
+static void
+talk (struct state *st, int force_erase)
+{
+ int width = 0,
+ height,
+ Z,
+ total = 0;
+ register char *p,
+ *p2;
+ char args[MAXLINES][LINELEN];
+
+ /* clear what we've written */
+ if (st->talking || force_erase)
+ {
+ if (!st->talking)
+ return;
+ XFillRectangle(st->dpy, st->window, st->bg_gc, st->s_rect.x - 5, st->s_rect.y - 5,
+ st->s_rect.width + 10, st->s_rect.height + 10);
+ st->talking = 0;
+ if (!force_erase)
+ st->next_fn = move;
+ st->interval = 0;
+ {
+ /* might as well check the st->window for size changes now... */
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->Width = xgwa.width + 2;
+ st->Height = xgwa.height + 2;
+ }
+ return;
+ }
+ p = st->words;
+ /* If there is actually no words, just return */
+ if (!*p)
+ {
+ st->talking = 0;
+ return;
+ }
+ st->talking = 1;
+ walk(st, FRONT);
+
+ for (p2 = p; *p2; p2++)
+ if (*p2 == '\t') *p2 = ' ';
+
+ if (!(p2 = strchr(p, '\n')) || !p2[1])
+ {
+ XGlyphInfo extents;
+
+ total = strlen (st->words);
+ strncpy (args[0], st->words, LINELEN);
+ args[0][LINELEN - 1] = 0;
+ XftTextExtentsUtf8 (st->dpy, st->xftfont,
+ (FcChar8 *) st->words, total,
+ &extents);
+ width = extents.xOff;
+ height = 0;
+ }
+ else
+ /* p2 now points to the first '\n' */
+ for (height = 0; p; height++)
+ {
+ int w;
+ XGlyphInfo extents;
+ *p2 = 0;
+
+ XftTextExtentsUtf8 (st->dpy, st->xftfont,
+ (FcChar8 *) p, p2 - p,
+ &extents);
+ w = extents.xOff;
+ if (w > width)
+ width = w;
+
+ total += p2 - p; /* total chars; count to determine reading
+ * time */
+ (void) strncpy(args[height], p, LINELEN);
+ args[height][LINELEN - 1] = 0;
+ if (height == MAXLINES - 1)
+ {
+ /* puts("Message too long!"); */
+ break;
+ }
+ p = p2 + 1;
+ if (!(p2 = strchr(p, '\n')))
+ break;
+ }
+ height++;
+
+ /*
+ * Figure out the height and width in pixels (height, width) extend the
+ * new box by 15 pixels on the sides (30 total) top and bottom.
+ */
+ st->s_rect.width = width + 30;
+ st->s_rect.height = height * font_height(st->xftfont) + 30;
+ if (st->x - st->s_rect.width - 10 < 5)
+ st->s_rect.x = 5;
+ else if ((st->s_rect.x = st->x + 32 - (st->s_rect.width + 15) / 2)
+ + st->s_rect.width + 15 > st->Width - 5)
+ st->s_rect.x = st->Width - 15 - st->s_rect.width;
+ if (st->y - st->s_rect.height - 10 < 5)
+ st->s_rect.y = st->y + st->pix_h + 5;
+ else
+ st->s_rect.y = st->y - 5 - st->s_rect.height;
+
+ XFillRectangle(st->dpy, st->window, st->text_bg_gc,
+ st->s_rect.x, st->s_rect.y, st->s_rect.width, st->s_rect.height);
+
+ /* make a box that's 5 pixels thick. Then add a thin box inside it */
+ XSetLineAttributes(st->dpy, st->text_fg_gc, 5, 0, 0, 0);
+ XDrawRectangle(st->dpy, st->window, st->text_fg_gc,
+ st->s_rect.x, st->s_rect.y, st->s_rect.width - 1, st->s_rect.height - 1);
+ XSetLineAttributes(st->dpy, st->text_fg_gc, 0, 0, 0, 0);
+ XDrawRectangle(st->dpy, st->window, st->text_fg_gc,
+ st->s_rect.x + 7, st->s_rect.y + 7, st->s_rect.width - 15, st->s_rect.height - 15);
+
+ st->X = 15;
+ st->Y = 15 + font_height(st->xftfont);
+
+ /* now print each string in reverse order (start at bottom of box) */
+ for (Z = 0; Z < height; Z++)
+ {
+ int L = strlen(args[Z]);
+ /* If there are continuous new lines, L can be 0 */
+ if (L && (args[Z][L-1] == '\r' || args[Z][L-1] == '\n'))
+ args[Z][--L] = 0;
+ XftDrawStringUtf8 (st->xftdraw, &st->xftcolor, st->xftfont,
+ st->s_rect.x + st->X, st->s_rect.y + st->Y,
+ (FcChar8 *) args[Z], L);
+
+ st->Y += font_height(st->xftfont);
+ }
+ st->interval = (total / 15) * 1000;
+ if (st->interval < 2000) st->interval = 2000;
+ st->next_fn = talk_1;
+ *st->words = 0;
+ st->lines = 0;
+}
+
+static void
+talk_1 (struct state *st)
+{
+ talk(st, 0);
+}
+
+
+static unsigned long
+look (struct state *st)
+{
+ if (random() % 3)
+ {
+ COPY(st->dpy, (random() & 1) ? &st->down : &st->front, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, st->x, st->y);
+ return 1000L;
+ }
+ if (!(random() % 5))
+ return 0;
+ if (random() % 3)
+ {
+ COPY(st->dpy, (random() & 1) ? &st->left_front : &st->right_front,
+ st->window, st->fg_gc, 0, 0, st->pix_w, st->pix_h, st->x, st->y);
+ return 1000L;
+ }
+ if (!(random() % 5))
+ return 0;
+ COPY(st->dpy, (random() & 1) ? &st->left1 : &st->right1, st->window, st->fg_gc,
+ 0, 0, st->pix_w, st->pix_h, st->x, st->y);
+ return 1000L;
+}
+
+
+static void
+fill_words (struct state *st)
+{
+ char *p = st->words + strlen(st->words);
+ char *c;
+ int lines = 0;
+ int max = MAXLINES;
+
+ for (c = st->words; c < p; c++)
+ if (*c == '\n')
+ lines++;
+
+ while (p < st->words + sizeof(st->words) - 1 &&
+ lines < max)
+ {
+ int c = textclient_getc (st->tc);
+ if (c == '\n')
+ lines++;
+ if (c > 0)
+ *p++ = (char) c;
+ else
+ break;
+ }
+ *p = 0;
+
+ st->lines = lines;
+}
+
+
+
+static const char *noseguy_defaults [] = {
+ ".background: black",
+ ".foreground: #CCCCCC",
+ "*textForeground: black",
+ "*textBackground: #CCCCCC",
+ "*fpsSolid: true",
+ "*program: xscreensaver-text",
+ "*usePty: False",
+ ".font: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
+ 0
+};
+
+static XrmOptionDescRec noseguy_options [] = {
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-font", ".font", XrmoptionSepArg, 0 },
+ { "-text-foreground", ".textForeground", XrmoptionSepArg, 0 },
+ { "-text-background", ".textBackground", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+static void *
+noseguy_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ unsigned long fg, bg, text_fg, text_bg;
+ XWindowAttributes xgwa;
+ Colormap cmap;
+ char *fontname;
+ XGCValues gcvalues;
+ st->dpy = d;
+ st->window = w;
+ st->first_time = 1;
+
+ fontname = get_string_resource (st->dpy, "font", "Font");
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->Width = xgwa.width + 2;
+ st->Height = xgwa.height + 2;
+ cmap = xgwa.colormap;
+
+ st->tc = textclient_open (st->dpy);
+ {
+ int w = 40;
+ int h = 15;
+ textclient_reshape (st->tc, w, h, w, h,
+ /* Passing MAXLINES isn't actually necessary */
+ 0);
+ }
+
+ init_images(st);
+
+ st->xftfont = XftFontOpenXlfd (st->dpy, screen_number (xgwa.screen),
+ fontname);
+ XftColorAllocName (st->dpy, xgwa.visual, xgwa.colormap,
+ get_string_resource (st->dpy,
+ "textForeground", "Foreground"),
+ &st->xftcolor);
+ st->xftdraw = XftDrawCreate (st->dpy, st->window, xgwa.visual,
+ xgwa.colormap);
+
+
+ fg = get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
+ bg = get_pixel_resource (st->dpy, cmap, "background", "Background");
+ text_fg = get_pixel_resource (st->dpy, cmap, "textForeground", "Foreground");
+ text_bg = get_pixel_resource (st->dpy, cmap, "textBackground", "Background");
+ /* notice when unspecified */
+ if (! get_string_resource (st->dpy, "textForeground", "Foreground"))
+ text_fg = bg;
+ if (! get_string_resource (st->dpy, "textBackground", "Background"))
+ text_bg = fg;
+
+ gcvalues.foreground = fg;
+ gcvalues.background = bg;
+ st->fg_gc = XCreateGC (st->dpy, st->window,
+ GCForeground|GCBackground,
+ &gcvalues);
+ gcvalues.foreground = bg;
+ gcvalues.background = fg;
+ st->bg_gc = XCreateGC (st->dpy, st->window,
+ GCForeground|GCBackground,
+ &gcvalues);
+ gcvalues.foreground = text_fg;
+ gcvalues.background = text_bg;
+ st->text_fg_gc = XCreateGC (st->dpy, st->window,
+ GCForeground|GCBackground,
+ &gcvalues);
+ gcvalues.foreground = text_bg;
+ gcvalues.background = text_fg;
+ st->text_bg_gc = XCreateGC (st->dpy, st->window,
+ GCForeground|GCBackground,
+ &gcvalues);
+ st->x = st->Width / 2;
+ st->y = st->Height / 2;
+ st->state = IS_MOVING;
+ st->next_fn = move;
+ st->walk_up = 1;
+ return st;
+}
+
+static unsigned long
+noseguy_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ fill_words(st);
+ st->next_fn(st);
+ return (st->interval * 1000);
+}
+
+static void
+noseguy_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->Width = w + 2;
+ st->Height = h + 2;
+}
+
+static Bool
+noseguy_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+noseguy_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ textclient_close (st->tc);
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("NoseGuy", noseguy)
diff --git a/hacks/noseguy.man b/hacks/noseguy.man
new file mode 100644
index 0000000..3d98ea0
--- /dev/null
+++ b/hacks/noseguy.man
@@ -0,0 +1,84 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+noseguy - a little guy with a big nose wanders around being witty
+.SH SYNOPSIS
+.B noseguy
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-text-foreground \fIcolor\fP]
+[\-text-background \fIcolor\fP]
+[\-font \fIfont\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-mode \fImode\fP]
+[\-program \fIprogram\fP]
+[\-filename \fIfile\fP]
+[\-text \fItext\fP]
+[\-fps]
+.SH DESCRIPTION
+A little man with a big nose and a hat runs around spewing out messages to
+the screen. This code (and its bitmaps) were extracted from the \fIxnlock\fP
+program.
+.SH OPTIONS
+.I noseguy
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-font \fIfont\fP
+The font used for the messages.
+.TP 8
+.B \-program \fIprogram\fP
+This program will be run periodically, and its output will be the text
+of the messages. Default:
+
+ xscreensaver-text --cols 40 | head -n15
+
+You can configure the text printed through the "Advanced" tab of
+.BR xscreensaver\-demo (1),
+or by editing your ~/.xscreensaver file.
+.TP 8
+.B \-filename \fIfile\fP
+If \fImode\fP is \fIfile\fP, then the contents of this file will be used
+for all messages.
+.TP 8
+.B \-text \fIstring\fP
+If \fImode\fP is \fIstring\fP, then this text will be used for all messages.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR xnlock (1)
+.SH COPYRIGHT
+Copyright 1985, 1990 by Dan Heller <argv@danheller.com>.
+.SH AUTHOR
+Dan Heller <argv@danheller.com>, 1985.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/pacman.c b/hacks/pacman.c
new file mode 100644
index 0000000..f7282fd
--- /dev/null
+++ b/hacks/pacman.c
@@ -0,0 +1,1467 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* pacman --- Mr. Pacman and his ghost friends */
+
+#if 0
+static const char sccsid[] = "@(#)pacman.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 25-Feb-2005: Added bonus dots. I am using a recursive back track algorithm
+ * to help the ghost find there way home. This also means that
+ * they do not know the shorts path.
+ * Jeremy English jhe@jeremyenglish.org
+ * 15-Aug-2004: Added support for pixmap pacman.
+ * Jeremy English jhe@jeremyenglish.org
+ * 11-Aug-2004: Added support for pixmap ghost.
+ * Jeremy English jhe@jeremyenglish.org
+ * 13-May-2002: Added -trackmouse feature thanks to code from 'maze.c'.
+ * splitted up code into several files. Retouched AI code, cleaned
+ * up code.
+ * 3-May-2002: Added AI to pacman and ghosts, slowed down ghosts.
+ * 26-Nov-2001: Random level generator added
+ * 01-Nov-2000: Allocation checks
+ * 04-Jun-1997: Compatible with xscreensaver
+ *
+ */
+
+/* TODO:
+ 1. think of a better level generation algorithm
+*/
+
+#define DEF_TRACKMOUSE "False"
+
+#ifdef STANDALONE
+# define MODE_pacman
+# define DEFAULTS "*delay: 10000 \n" \
+ "*size: 0 \n" \
+ "*ncolors: 6 \n" \
+ "*fpsTop: true \n" \
+ "*fpsSolid: true \n" \
+
+# define UNIFORM_COLORS
+# define BRIGHT_COLORS
+# define release_pacman 0
+# define pacman_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+# include <assert.h>
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_pacman
+
+#include "pacman.h"
+#include "pacman_ai.h"
+#include "pacman_level.h"
+#include "images/gen/pacman_png.h"
+
+#ifdef DISABLE_INTERACTIVE
+ENTRYPOINT ModeSpecOpt pacman_opts = {
+ 0,
+ (XrmOptionDescRec *) NULL,
+ 0,
+ (argtype *) NULL,
+ (OptionStruct *) NULL
+};
+#else
+static XrmOptionDescRec opts[] = {
+ {"-trackmouse", ".pacman.trackmouse", XrmoptionNoArg, "on"},
+ {"+trackmouse", ".pacman.trackmouse", XrmoptionNoArg, "off"}
+};
+
+static argtype vars[] = {
+ {&pacman_trackmouse, "trackmouse", "TrackMouse", DEF_TRACKMOUSE, t_Bool}
+};
+
+static OptionStruct desc[] = {
+ {"-/+trackmouse", "turn on/off the tracking of the mouse"}
+};
+
+ENTRYPOINT ModeSpecOpt pacman_opts =
+ { sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars,
+desc };
+#endif
+
+#ifdef USE_MODULES
+ModStruct pacman_description = {
+ "pacman", /* *cmdline_arg; */
+ "init_pacman", /* *init_name; */
+ "draw_pacman", /* *callback_name; */
+ (char *) NULL, /* *release_name; */
+ "refresh_pacman", /* *refresh_name; */
+ "change_pacman", /* *change_name; */
+ "free_pacman", /* *free_name; */
+ &pacman_opts, /* *msopts */
+ 10000, 4, 1, 0, 64, 1.0, "", "Shows Pacman(tm)", 0, NULL
+};
+
+#endif
+
+Bool pacman_trackmouse;
+pacmangamestruct *pacman_games = (pacmangamestruct *) NULL;
+
+static void repopulate (ModeInfo * mi);
+static void drawlevel (ModeInfo * mi);
+
+
+ENTRYPOINT void
+free_pacman (ModeInfo * mi)
+{
+ Display * display = MI_DISPLAY (mi);
+ pacmangamestruct * pp = &pacman_games[MI_SCREEN (mi)];
+ int dir, mouth, i, j, k;
+
+ if (pp->ghosts != NULL) {
+ free (pp->ghosts);
+ pp->ghosts = (ghoststruct *) NULL;
+ }
+ if (pp->stippledGC != None) {
+ XFreeGC (display, pp->stippledGC);
+ pp->stippledGC = None;
+ }
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < MAXGDIR; j++) {
+ for (k = 0; k < MAXGWAG; k++) {
+ if (pp->ghostPixmap[i][j][k] != None) {
+ XFreePixmap (display, pp->ghostPixmap[i][j][k]);
+ pp->ghostPixmap[i][j][k] = None;
+ }
+ }
+ }
+ }
+ for (dir = 0; dir < 4; dir++)
+ for (mouth = 0; mouth < MAXMOUTH; mouth++)
+ if (pp->pacmanPixmap[dir][mouth] != None) {
+ XFreePixmap (display, pp->pacmanPixmap[dir][mouth]);
+ pp->pacmanPixmap[dir][mouth] = None;
+ }
+}
+
+/* set pacman and the ghost in there starting positions, but don't draw a new
+ level */
+static void
+reset_level (ModeInfo * mi, int n, int pac_init)
+{
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ unsigned int ghost;
+
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+ drawlevel (mi);
+
+ pp->gamestate = GHOST_DANGER;
+
+ if ( pac_init ){
+ pp->pacman.row = (LEVHEIGHT + JAILHEIGHT) / 2 - n;
+ pp->pacman.init_row = pp->pacman.row;
+ }
+ else{
+ pp->pacman.row = pp->pacman.init_row;
+ }
+ pp->pacman.col = (LEVWIDTH / 2);
+ pp->pacman.nextrow = NOWHERE;
+ pp->pacman.nextcol = NOWHERE;
+ pp->pacman.cf = NOWHERE;
+ pp->pacman.rf = NOWHERE;
+ pp->pacman.oldcf = NOWHERE;
+ pp->pacman.oldrf = NOWHERE;
+ pp->pacman.oldlx = NOWHERE;
+ pp->pacman.oldly = NOWHERE;
+ pp->pacman.aistate = ps_eating;
+ pp->pacman.cur_trace = 0;
+ pp->pacman.roundscore = 0;
+ pp->pacman.speed = 4;
+ pp->pacman.lastturn = 0;
+ pp->pacman.delta.x = 0;
+ pp->pacman.delta.y = 0;
+
+ for (ghost = 0; ghost < pp->nghosts; ghost++) {
+ pp->ghosts[ghost].col = (LEVWIDTH / 2);
+ pp->ghosts[ghost].row = (LEVHEIGHT / 2);
+ pp->ghosts[ghost].nextcol = NOWHERE;
+ pp->ghosts[ghost].nextrow = NOWHERE;
+ pp->ghosts[ghost].dead = 0;
+ pp->ghosts[ghost].lastbox = START;
+ pp->ghosts[ghost].cf = NOWHERE;
+ pp->ghosts[ghost].rf = NOWHERE;
+ pp->ghosts[ghost].oldcf = NOWHERE;
+ pp->ghosts[ghost].oldrf = NOWHERE;
+ pp->ghosts[ghost].aistate = inbox;
+ pp->ghosts[ghost].timeleft = ghost * 20;
+ pp->ghosts[ghost].speed = 3;
+ pp->ghosts[ghost].delta.x = 0;
+ pp->ghosts[ghost].delta.y = 0;
+ pp->ghosts[ghost].flash_scared = False;
+ pp->ghosts[ghost].wait_pos = False;
+ pacman_ghost_update (pp, &(pp->ghosts[ghost]));
+ }
+ pacman_update (mi, pp, &(pp->pacman));
+}
+
+static int
+pacman_ghost_collision(unsigned int ghost, pacmangamestruct * pp)
+{
+ return (((pp->ghosts[ghost].nextrow == pp->pacman.nextrow) &&
+ (pp->ghosts[ghost].nextcol == pp->pacman.nextcol)) ||
+ ((pp->ghosts[ghost].nextrow == pp->pacman.row) &&
+ (pp->ghosts[ghost].nextcol == pp->pacman.col) &&
+ (pp->ghosts[ghost].row == pp->pacman.nextrow) &&
+ (pp->ghosts[ghost].col == pp->pacman.nextcol)));
+}
+
+
+/* Checks for death of any ghosts/pacman and updates. It also makes a new
+ level if all ghosts are dead or all dots are eaten. */
+static void
+check_death (ModeInfo * mi, pacmangamestruct * pp)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ unsigned int ghost;
+
+ if (pp->pacman.aistate == ps_dieing) return;
+
+ for (ghost = 0; ghost < pp->nghosts; ghost++) {
+
+ /* The ghost have to be scared before you can kill them */
+ if ( pacman_ghost_collision ( ghost, pp ) ) {
+ if (pp->ghosts[ghost].aistate == goingin) continue;
+
+ if (pp->ghosts[ghost].aistate == hiding) {
+ pp->ghosts[ghost].dead = 1;
+ pp->ghosts[ghost].aistate = goingin;
+ pp->ghosts[ghost].wait_pos = True;
+ XSetForeground (display, pp->stippledGC, MI_BLACK_PIXEL (mi));
+ XFillRectangle (display, window,
+ pp->stippledGC,
+ pp->ghosts[ghost].cf,
+ pp->ghosts[ghost].rf,
+ pp->spritexs, pp->spriteys);
+ }
+ /* DIE PACMAN... */
+ else {
+ pp->pacman.deaths++;
+ pp->pacman.aistate = ps_dieing;
+
+ }
+ continue;
+ }
+ }
+}
+
+/* Resets state of ghosts + pacman. Creates a new level, draws that level. */
+static void
+repopulate (ModeInfo * mi)
+{
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ pp->pacman.deaths = 0;
+ reset_level (mi, pacman_createnewlevel (pp), True);
+ check_death (mi, pp);
+}
+
+/* Sets the color to the color of a wall. */
+static void
+setwallcolor (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+
+ if (MI_NPIXELS (mi) > 2)
+ XSetForeground (display, pp->stippledGC, MI_PIXEL (mi, BLUE));
+ else
+ XSetForeground (display, pp->stippledGC, MI_WHITE_PIXEL (mi));
+}
+
+/* Sets the color to the color of a dot. */
+static void
+setdotcolor (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+
+ XSetForeground (display, pp->stippledGC, MI_WHITE_PIXEL (mi));
+}
+
+static void
+cleardotcolor (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+
+ XSetForeground (display, pp->stippledGC, MI_BLACK_PIXEL (mi));
+}
+
+#if 0
+static void
+draw_position (ModeInfo * mi, int x, int y, int color)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ XFontStruct *font = NULL;
+ char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
+ char *s = NULL;
+
+ font = load_font_retry (display, f_name);
+ assert (font != NULL);
+
+ s = (char *) malloc (256);
+ assert (s != NULL);
+ sprintf (s, "(%d,%d)", x, y);
+ XSetForeground (display, pp->stippledGC, color);
+ XDrawString (display, window, pp->stippledGC, x, y, s, strlen (s));
+ free (s);
+ free (font);
+}
+#endif
+#if 0
+static void
+draw_number (ModeInfo * mi, int x, int y, int num, int color)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ XFontStruct *font = NULL;
+ char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
+ char *s = NULL;
+
+ font = load_font_retry (display, f_name);
+ assert (font != NULL);
+
+ s = (char *) malloc (256);
+ assert (s != NULL);
+ sprintf (s, "%d", num);
+ XSetForeground (display, pp->stippledGC, color);
+ XDrawString (display, window, pp->stippledGC, x, y, s, strlen (s));
+ free (s);
+ free (font);
+}
+#endif
+
+#if 0
+/* draw_grid - draws a grid on top of the playing field.
+ * Used so that I can determine if I'm converting from rows and columns to x and y
+ * coordinates correctly.
+ */
+static void
+draw_grid (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ int h = MI_HEIGHT (mi);
+ int w = MI_WIDTH (mi);
+ int y = 0;
+ int x = 0;
+ XSetForeground (display, pp->stippledGC, 0xff0000);
+ while (y < h) {
+ while (x < w) {
+ XDrawLine (display, window, pp->stippledGC, x, 0, x, h);
+ x += 10;
+ }
+ x = 0;
+ XDrawLine (display, window, pp->stippledGC, 0, y, w, y);
+ y += 10;
+ }
+}
+#endif
+
+#if 0
+static void
+draw_string (ModeInfo * mi, int x, int y, char *s, int color)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ XFontStruct *font = NULL;
+ char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
+
+ font = load_font_retry (display, f_name);
+ assert (font != NULL);
+
+ assert (s != NULL);
+ XSetForeground (display, pp->stippledGC, color);
+ XDrawString (display, window, pp->stippledGC, x, y, s, strlen (s));
+ free (font);
+}
+
+/* I think this function has a memory leak. Be careful if you enable it. */
+/* I only used it briefly to help me debug the ghost's aistate. It prints */
+/* the state of each ghost on the left hand side of the screen */
+static void
+print_ghost_stats (ModeInfo *mi, ghoststruct *g , int ghost_num)
+{
+ char s[1024];
+
+ sprintf (s, "GHOST: %d", ghost_num );
+ switch (g->aistate){
+ case inbox:
+ sprintf (s, "%s inbox", s);
+ break;
+ case goingout:
+ sprintf (s, "%s goingout", s);
+ break;
+ case randdir:
+ sprintf (s, "%s randdir", s);
+ break;
+ case chasing:
+ sprintf (s, "%s chasing", s);
+ break;
+ case hiding:
+ sprintf (s, "%s hiding", s);
+ break;
+ case goingin:
+ sprintf (s, "%s goingin",s);
+ break;
+ }
+ draw_string (mi, 0, (ghost_num *3) *10+50, g->last_stat, 0x000000);
+ draw_string (mi, 0, (ghost_num *3) *10+50, s, 0xff0000);
+ strcpy(g->last_stat,s);
+}
+
+/* prints the number of times pacman has died and his aistate on the left hand */
+/* side of the screen */
+static void
+print_pac_stats ( ModeInfo *mi, pacmanstruct *pac )
+{
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ char s[1024];
+ sprintf (s, "Pacman, Deaths: %d", pac->deaths );
+ switch ( pac->aistate ){
+ case ps_eating:
+ sprintf(s, "%s ps_eating",s );
+ break;
+ case ps_chasing:
+ sprintf(s, "%s ps_chasing",s );
+ break;
+ case ps_hiding:
+ sprintf(s, "%s ps_hiding",s );
+ break;
+ case ps_random:
+ sprintf(s, "%s ps_random",s );
+ break;
+ case ps_dieing:
+ sprintf(s, "%s ps_dieing",s );
+ break;
+ }
+ draw_string ( mi, 0, 200, pp->last_pac_stat, 0x000000);
+ draw_string ( mi, 0, 200, s, 0xff0000);
+ strcpy(pp->last_pac_stat, s );
+}
+
+#endif
+
+/*Ok, yeah whatever?*/
+/*dot_rc_to_pixel - magic that converts row and columns into
+ *the x and y coordinates of the screen.
+ */
+static void
+dot_rc_to_pixel (ModeInfo * mi, int *x, int *y)
+{
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ *x = (pp->xs * *x) +
+ (pp->xs / 2) - (pp->xs > 32 ? (pp->xs / 16) : 1) + pp->xb;
+ *y = (pp->ys * *y) +
+ (pp->ys / 2) - (pp->ys > 32 ? (pp->ys / 16) : 1) + pp->yb;
+}
+
+/* dot_width_height - magic used to get the width and height of
+ * a dot. This dot can also be scaled by a value.
+ */
+static void
+dot_width_height (ModeInfo *mi, int *w, int *h)
+{
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ if (pp->xs > 32){
+ *w = *h = (pp->xs / 16 );
+ }else {
+ *w = *h = 1;
+ }
+}
+
+static void
+bonus_dot_width_height (ModeInfo *mi, int *w, int *h )
+{
+ *w = *h = MI_HEIGHT (mi) / 65;
+}
+
+
+
+static void
+draw_dot (ModeInfo * mi, pacmangamestruct * pp, int x, int y,
+ void (*width_height)(ModeInfo * mi, int *w, int *h),
+ int (*arc_func) (Display * display, Drawable d, GC gc,
+ int x, int y, unsigned int width,
+ unsigned int height, int angle1,
+ int angle2))
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ int w, h;
+ dot_rc_to_pixel (mi, &x, &y);
+ width_height(mi, &w, &h);
+ (void) arc_func (display, window, pp->stippledGC,
+ x, y, w, h, 0, 23040);
+}
+
+static void
+draw_bonus_dot (ModeInfo * mi, pacmangamestruct * pp, int x, int y)
+{
+ int x2 = x;
+ int y2 = y;
+ setdotcolor (mi);
+ draw_dot (mi, pp, x, y, bonus_dot_width_height, XFillArc);
+ dot_rc_to_pixel (mi, &x2, &y2);
+#if 0
+ draw_position (mi, x2, y2, 0xff0000);
+#endif
+}
+
+static void
+clear_bonus_dot (ModeInfo * mi, pacmangamestruct * pp, int x, int y)
+{
+ cleardotcolor (mi);
+ draw_dot (mi, pp, x, y, bonus_dot_width_height, XFillArc);
+}
+
+static void
+draw_regular_dot (ModeInfo * mi, pacmangamestruct * pp, int x, int y)
+{
+ setdotcolor (mi);
+ draw_dot (mi, pp, x, y, dot_width_height, XDrawArc);
+}
+
+/* Draws a block in the level at the specified x and y locations. */
+static void
+drawlevelblock (ModeInfo * mi, pacmangamestruct * pp,
+ const unsigned x, const unsigned y)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ int dx = 0, dy = 0;
+
+ if (pp->xs % 2 == 1)
+ dx = -1;
+ if (pp->ys % 2 == 1)
+ dy = -1;
+
+#ifndef HAVE_JWXYZ
+ XSetFillStyle (display, pp->stippledGC, FillSolid);
+#endif /* !HAVE_JWXYZ */
+ XSetLineAttributes (display, pp->stippledGC, pp->wallwidth,
+ LineSolid, CapRound, JoinMiter);
+
+ if (pp->xs < 2 || pp->ys < 2) {
+ switch (pp->level[y * LEVWIDTH + x]) {
+ case ' ':
+ case '=':
+ break;
+ case '.':
+ setdotcolor (mi);
+ (void) XDrawPoint (display, window,
+ pp->stippledGC,
+ x * pp->xs + pp->xb, y * pp->ys + pp->yb);
+ break;
+ default:
+ setwallcolor (mi);
+ (void) XDrawPoint (display, window,
+ pp->stippledGC,
+ x * pp->xs + pp->xb, y * pp->ys + pp->yb);
+ }
+
+ return;
+ }
+
+ switch (pp->level[y * LEVWIDTH + x]) {
+ case ' ':
+ case '=':
+ break;
+
+ case '.':
+ setdotcolor (mi);
+ if (pp->xs < 8 || pp->ys < 8) {
+ (void) XDrawPoint (display, window,
+ pp->stippledGC,
+ x * pp->xs + pp->xb +
+ pp->xs / 2, y * pp->ys + pp->yb + pp->ys / 2);
+ break;
+ }
+
+ draw_regular_dot (mi, pp, x, y);
+ break;
+ /* What we will probably want to do here is have the pp->level store a 'o' for
+ * the bonus dots. The we can use the drawing routine above just with a bigger
+ * radius.
+ */
+ case 'o':
+ draw_bonus_dot (mi, pp, x, y);
+ break;
+
+
+ case '-':
+ setwallcolor (mi);
+ (void) XDrawLine (display, window, pp->stippledGC,
+ (pp->xs * x) + pp->xb,
+ (pp->ys * y) + (pp->ys / 2) + pp->yb,
+ (pp->xs * (x + 1)) + pp->xb,
+ (pp->ys * y) + (pp->ys / 2) + pp->yb);
+ break;
+
+ case '|':
+ setwallcolor (mi);
+ (void) XDrawLine (display, window, pp->stippledGC,
+ (pp->xs * x) + (pp->xs / 2) + pp->xb,
+ (pp->ys * y) + pp->yb,
+ (pp->xs * x) + (pp->xs / 2) + pp->xb,
+ (pp->ys * (y + 1)) + pp->yb);
+ break;
+
+ case '_':
+ setwallcolor (mi);
+ (void) XDrawArc (display, window, pp->stippledGC,
+ (pp->xs * x) - (pp->ys / 2) + pp->xb + dx,
+ (pp->ys * y) + (pp->ys / 2) + pp->yb,
+ pp->xs, pp->ys, 0 * 64, 90 * 64);
+ break;
+
+ case ',':
+ setwallcolor (mi);
+ (void) XDrawArc (display, window, pp->stippledGC,
+ (pp->xs * x) + (pp->ys / 2) + pp->xb,
+ (pp->ys * y) + (pp->ys / 2) + pp->yb,
+ pp->xs, pp->ys, 90 * 64, 90 * 64);
+ break;
+
+ case '`':
+ setwallcolor (mi);
+ (void) XDrawArc (display, window, pp->stippledGC,
+ (pp->xs * x) + (pp->ys / 2) + pp->xb,
+ (pp->ys * y) - (pp->ys / 2) + pp->yb + dy,
+ pp->xs, pp->ys, 180 * 64, 90 * 64);
+ break;
+
+ case '\'':
+ setwallcolor (mi);
+ (void) XDrawArc (display, window, pp->stippledGC,
+ (pp->xs * x) - (pp->ys / 2) + pp->xb + dx,
+ (pp->ys * y) - (pp->ys / 2) + pp->yb + dy,
+ pp->xs, pp->ys, 270 * 64, 90 * 64);
+ break;
+
+ }
+}
+
+/* Draws a complete level. */
+static void
+drawlevel (ModeInfo * mi)
+{
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ unsigned int x, y;
+
+ for (y = 0; y < LEVHEIGHT; y++)
+ for (x = 0; x < LEVWIDTH; x++)
+ drawlevelblock (mi, pp, x, y);
+}
+
+/* There is some overlap so it can be made more efficient */
+#define ERASE_IMAGE(d,w,g,x,y,xl,yl,xs,ys) \
+ if (yl<y) \
+ (y<(yl+ys))?XFillRectangle(d,w,g,xl,yl,xs,y-(yl)): \
+ XFillRectangle(d,w,g,xl,yl,xs,ys); \
+ else if (yl>y) \
+ (y>(yl-(ys)))?XFillRectangle(d,w,g,xl,y+ys,xs,yl-(y)): \
+ XFillRectangle(d,w,g,xl,yl,xs,ys); \
+ if (xl<x) \
+ (x<(xl+xs))?XFillRectangle(d,w,g,xl,yl,x-(xl),ys): \
+ XFillRectangle(d,w,g,xl,yl,xs,ys); \
+ else if (xl>x) \
+ (x>(xl-(xs)))?XFillRectangle(d,w,g,x+xs,yl,xl-(x),ys): \
+ XFillRectangle(d,w,g,xl,yl,xs,ys)
+
+
+/* Draws the pacman sprite, removing the previous location. */
+
+static void
+draw_pacman_sprite (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ unsigned int dir = 0;
+ int old_mask_dir = 0;
+ int old_mask_mouth = 0;
+ Pixmap old_mask, new_mask;
+ Pixmap pacman;
+
+#define MAX_MOUTH_DELAY 2
+#define MAX_DEATH_DELAY 20
+
+ if (pp->pacman.aistate == ps_dieing){
+ pp->pacman.cf = pp->pacman.oldcf;
+ pp->pacman.rf = pp->pacman.oldrf;
+ }
+ else {
+ pp->pacman.cf = pp->pacman.col * pp->xs + pp->pacman.delta.x *
+ pp->pacman.cfactor + pp->xb + pp->spritedx;
+ pp->pacman.rf = pp->pacman.row * pp->ys + pp->pacman.delta.y *
+ pp->pacman.rfactor + pp->yb + pp->spritedy;
+ }
+
+ dir = (ABS (pp->pacman.cfactor) * (2 - pp->pacman.cfactor) +
+ ABS (pp->pacman.rfactor) * (1 + pp->pacman.rfactor)) % 4;
+
+ if (pp->pm_mouth_delay == MAX_MOUTH_DELAY) {
+ if (pp->pm_mouth == (MAXMOUTH - 1) || pp->pm_mouth == 0) {
+ pp->pm_open_mouth = !pp->pm_open_mouth;
+ }
+ pp->pm_open_mouth ? pp->pm_mouth++ : pp->pm_mouth--;
+ pp->pm_mouth_delay = 0;
+ }
+ else {
+ pp->pm_mouth_delay++;
+ }
+
+ if (pp->pacman.aistate == ps_dieing){
+ if (pp->pm_death_frame >= PAC_DEATH_FRAMES) {
+ pp->pacman.aistate = ps_eating;
+ pp->pm_death_frame = 0;
+ pp->pm_death_delay = 0;
+ reset_level (mi, 0, False);
+ return;
+ }
+ else {
+ old_mask = pp->pacmanMask[0][0];
+ new_mask = pp->pacmanMask[0][0];
+ pacman = pp->pacman_ds[pp->pm_death_frame];
+ if (pp->pm_death_delay == MAX_DEATH_DELAY){
+ pp->pm_death_frame++;
+ pp->pm_death_delay = 0;
+ }
+ else{
+ pp->pm_death_delay++;
+ }
+ }
+ }
+ else{
+ old_mask = pp->pacmanMask[old_mask_dir][old_mask_mouth];
+ new_mask = pp->pacmanMask[dir][pp->pm_mouth];
+ pacman = pp->pacmanPixmap[dir][pp->pm_mouth];
+ }
+
+ XSetForeground (display, pp->stippledGC, MI_BLACK_PIXEL (mi));
+
+ XSetClipMask (display, pp->stippledGC, old_mask);
+
+ XSetClipOrigin (display, pp->stippledGC, pp->pacman.oldcf,
+ pp->pacman.oldrf);
+ XFillRectangle (display, window, pp->stippledGC, pp->pacman.oldcf,
+ pp->pacman.oldrf, pp->spritexs, pp->spriteys);
+ XSetClipMask (display, pp->stippledGC, new_mask);
+ XSetClipOrigin (display, pp->stippledGC, pp->pacman.cf, pp->pacman.rf);
+ XCopyArea (display, pacman, window,
+ pp->stippledGC, 0, 0, pp->spritexs, pp->spriteys,
+ pp->pacman.cf, pp->pacman.rf);
+ XSetClipMask (display, pp->stippledGC, None);
+ if (pp->pacman.aistate != ps_dieing){
+ pp->pacman.oldcf = pp->pacman.cf;
+ pp->pacman.oldrf = pp->pacman.rf;
+ }
+}
+
+#if 0
+static void
+draw_ghost_position (ModeInfo * mi, ghoststruct * ghost)
+{
+ draw_position (mi, ghost->oldcf, ghost->oldrf, MI_BLACK_PIXEL (mi));
+ draw_position (mi, ghost->cf, ghost->rf, 0x00ff00);
+}
+#endif
+#if 0
+static void
+draw_ghost_ndirs ( ModeInfo *mi, ghoststruct * ghost)
+{
+ draw_number (mi, ghost->oldcf, ghost->oldrf, ghost->oldndirs, MI_BLACK_PIXEL (mi));
+ ghost->oldndirs = ghost->ndirs;
+ draw_number (mi, ghost->cf, ghost->rf, ghost->ndirs, 0x00ff00);
+}
+
+#endif
+
+static void
+draw_ghost_sprite (ModeInfo * mi, const unsigned ghost)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+#define MAX_WAG_COUNT 50
+ unsigned int dir = 0;
+ unsigned int fs = 0; /*flash scared*/
+ Pixmap g_pix; /*ghost pixmap*/
+
+
+ dir = (ABS (pp->ghosts[ghost].cfactor) * (2 - pp->ghosts[ghost].cfactor) +
+ ABS (pp->ghosts[ghost].rfactor) * (1 + pp->ghosts[ghost].rfactor)) % 4;
+
+
+ fs = pp->ghosts[ghost].flash_scared;
+ assert (fs == 0 || fs == 1);
+
+ /* Choose the pixmap */
+ switch (pp->ghosts[ghost].aistate){
+ case hiding:
+ g_pix = pp->s_ghostPixmap[fs][pp->gh_wag];
+ break;
+ case goingin:
+ g_pix = pp->ghostEyes[dir];
+#if 1
+ {
+ int i = 0;
+ while ( i < pp->ghosts[ghost].trace_idx ){
+ XFillRectangle (display,
+ window,
+ pp->stippledGC,
+ pp->ghosts[ghost].trace[i].vx,
+ pp->ghosts[ghost].trace[i].vy,
+ pp->spritexs, pp->spriteys);
+
+ i++;
+ }
+ }
+#endif
+
+ break;
+ default:
+ g_pix = pp->ghostPixmap[ghost][dir][pp->gh_wag];
+ }
+
+ pp->ghosts[ghost].cf =
+ pp->ghosts[ghost].col * pp->xs + pp->ghosts[ghost].delta.x *
+ pp->ghosts[ghost].cfactor + pp->xb + pp->spritedx;
+ pp->ghosts[ghost].rf =
+ pp->ghosts[ghost].row * pp->ys + pp->ghosts[ghost].delta.y *
+ pp->ghosts[ghost].rfactor + pp->yb + pp->spritedy;
+
+ XSetForeground (display, pp->stippledGC, MI_BLACK_PIXEL (mi));
+
+ XSetClipMask (display, pp->stippledGC, pp->ghostMask);
+ XSetClipOrigin (display, pp->stippledGC,
+ pp->ghosts[ghost].oldcf, pp->ghosts[ghost].oldrf);
+ XFillRectangle (display,
+ window,
+ pp->stippledGC,
+ pp->ghosts[ghost].oldcf,
+ pp->ghosts[ghost].oldrf, pp->spritexs, pp->spriteys);
+
+
+ if (pp->pacman.aistate != ps_dieing) {
+ drawlevelblock (mi, pp,
+ (unsigned int) pp->ghosts[ghost].col,
+ (unsigned int) pp->ghosts[ghost].row);
+
+
+
+ XSetClipOrigin (display, pp->stippledGC,
+ pp->ghosts[ghost].cf, pp->ghosts[ghost].rf);
+
+ XCopyArea (display, g_pix, window, pp->stippledGC, 0, 0,
+ pp->spritexs, pp->spriteys, pp->ghosts[ghost].cf,
+ pp->ghosts[ghost].rf);
+ }
+ XSetClipMask (display, pp->stippledGC, None);
+
+#if 0
+ draw_ghost_position (mi, &(pp->ghosts[ghost]));
+#endif
+
+#if 0
+ draw_ghost_ndirs ( mi, &(pp->ghosts[ghost]));
+#endif
+
+ if (pp->pacman.aistate != ps_dieing) {
+ pp->ghosts[ghost].oldcf = pp->ghosts[ghost].cf;
+ pp->ghosts[ghost].oldrf = pp->ghosts[ghost].rf;
+ if (pp->gh_wag_count++ == MAX_WAG_COUNT) {
+ pp->gh_wag = !pp->gh_wag;
+ pp->gh_wag_count = 0;
+ }
+ }
+}
+
+
+static int
+ghost_over (ModeInfo * mi, int x, int y)
+{
+ int ghost = 0;
+ int ret = False;
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ dot_rc_to_pixel (mi, &x, &y);
+ for (ghost = 0; ghost < pp->nghosts; ghost++) {
+ if ((pp->ghosts[ghost].cf <= x
+ && x <= pp->ghosts[ghost].cf + pp->spritexs)
+ && (pp->ghosts[ghost].rf <= y
+ && y <= pp->ghosts[ghost].rf + pp->spriteys)) {
+ ret = True;
+ break;
+ }
+ }
+ return ret;
+}
+
+
+static void
+flash_bonus_dots (ModeInfo * mi)
+{
+#define MAX_FLASH_COUNT 25
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ int i, x, y;
+ for (i = 0; i < NUM_BONUS_DOTS; i++) {
+ if (!pacman_bonus_dot_eaten (pp, i)) {
+ pacman_bonus_dot_pos (pp, i, &x, &y);
+ if (ghost_over (mi, x, y))
+ continue;
+ if (pp->bd_on)
+ draw_bonus_dot (mi, pp, x, y);
+ else
+ clear_bonus_dot (mi, pp, x, y);
+ }
+ }
+ if (pp->bd_flash_count-- == 0) {
+ pp->bd_flash_count = MAX_FLASH_COUNT;
+ pp->bd_on = !pp->bd_on;
+ }
+}
+
+static unsigned int
+ate_bonus_dot (ModeInfo * mi)
+{
+ /*Check pacman's position. If it is over a bonus dot and that dot
+ *has not been eaten, then return true
+ */
+ unsigned int ret = 0;
+ int idx = 0;
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ if (pacman_is_bonus_dot (pp, pp->pacman.col, pp->pacman.row, &idx)) {
+ ret = !pacman_bonus_dot_eaten (pp, idx);
+ pacman_eat_bonus_dot (pp, idx);
+ }
+ return ret;
+}
+
+static void
+ghost_scared (ModeInfo * mi)
+{
+ unsigned int ghost;
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ for (ghost = 0; ghost < pp->nghosts; ghost++) {
+ if (pp->ghosts[ghost].aistate == goingin ||
+ pp->ghosts[ghost].aistate == goingout ||
+ pp->ghosts[ghost].aistate == inbox ) continue;
+ pp->ghosts[ghost].aistate = hiding;
+ pp->ghosts[ghost].flash_scared = 0;
+ if (pp->pacman.aistate != ps_dieing)
+ pp->pacman.aistate = ps_chasing;
+ }
+}
+
+static void
+ghost_not_scared (ModeInfo * mi)
+{
+ unsigned int ghost;
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ for (ghost = 0; ghost < pp->nghosts; ghost++){
+ if (pp->ghosts[ghost].aistate == goingin ||
+ pp->ghosts[ghost].aistate == goingout ||
+ pp->ghosts[ghost].aistate == inbox ) continue;
+ pp->ghosts[ghost].aistate = chasing;
+ }
+ if (pp->pacman.aistate != ps_dieing)
+ pp->pacman.aistate = ps_eating;
+
+}
+
+static void
+ghost_flash_scared (ModeInfo * mi)
+{
+ unsigned int ghost;
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ for (ghost = 0; ghost < pp->nghosts; ghost++)
+ pp->ghosts[ghost].flash_scared = !pp->ghosts[ghost].flash_scared;
+}
+
+/* Does all drawing of moving sprites in the level. */
+static void
+pacman_tick (ModeInfo * mi)
+{
+#define DEFAULT_SCARED_TIME 500
+#define START_FLASH 200
+#define FLASH_COUNT 25
+
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ unsigned int ghost;
+#if 0
+ draw_grid (mi);
+#endif
+ for (ghost = 0; ghost < pp->nghosts; ghost++) {
+ draw_ghost_sprite (mi, ghost);
+#if 0
+ print_ghost_stats (mi, &(pp->ghosts[ghost]), ghost);
+#endif
+ }
+#if 0
+ print_pac_stats (mi, &(pp->pacman));
+#endif
+ draw_pacman_sprite (mi);
+ flash_bonus_dots (mi);
+ if (ate_bonus_dot (mi)) {
+ pp->ghost_scared_timer = (random () % 100) + DEFAULT_SCARED_TIME;
+ ghost_scared (mi);
+ }
+
+ if (pp->ghost_scared_timer > 0) {
+ if (--pp->ghost_scared_timer == 0)
+ ghost_not_scared (mi);
+ else if (pp->ghost_scared_timer <= START_FLASH) {
+ if (pp->flash_timer <= 0) {
+ pp->flash_timer = FLASH_COUNT;
+ ghost_flash_scared (mi);
+ }
+ pp->flash_timer--;
+ }
+ }
+
+ /*
+ We don't want to miss the last death sequence. So if pacman has died three times
+ we wait for his state to change from dieing to something else before we repopulate
+ the level. If pacman ate all of the dots then we just repopulate.
+ */
+
+ if (pp->dotsleft == 0 )
+ repopulate (mi);
+ else if (pp->pacman.deaths >= 3){
+ if (pp->old_pac_state == ps_dieing && pp->pacman.aistate != ps_dieing)
+ repopulate (mi);
+ }
+
+ pp->old_pac_state = pp->pacman.aistate;
+}
+
+
+/* CODE TO LOAD AND SCALE THE PIXMAPS
+ */
+
+/* Grabbed the scaling routine off of usenet.
+ * Changed it so that the information specific
+ * to the source pixmap does not have to be a parameter.
+ *
+ * There is probably a better way to scale pixmaps.
+ * From: Chris Fiddyment (cxf@itd.dsto.gov.au)
+ * Subject: Scaling Pixmap Algorithm.
+ * Newsgroups: comp.graphics.algorithms
+ * Date: 1994-07-06 18:51:38 PST
+ * -jeremy
+ */
+
+static Pixmap
+scale_pixmap (Display ** dpy, GC gc, Pixmap source, int dwidth, int dheight)
+{
+ Pixmap temp, dest;
+ int j, end;
+ float i;
+ float xscale, yscale;
+ unsigned int swidth, sheight;
+ Window window;
+ int x, y;
+ unsigned border_width_return, depth;
+ XGetGeometry (*dpy, source, &window, &x, &y, &swidth, &sheight,
+ &border_width_return, &depth);
+
+ xscale = (float) swidth / (float) dwidth; /* Scaling factors */
+ yscale = (float) sheight / (float) dheight;
+
+ dest = XCreatePixmap (*dpy, window, dwidth, dheight, depth);
+ if (!dest) {
+ fprintf (stderr, "%s Could not scale image", progname);
+ }
+ temp = XCreatePixmap (*dpy, window, dwidth, sheight, depth);
+ if (!temp) {
+ fprintf (stderr, "%s Could not scale image", progname);
+ }
+
+ j = 0;
+ end = dwidth * xscale;
+ /* Scale width of source into temp pixmap */
+ for (i = 0; i <= end; i += xscale)
+ XCopyArea (*dpy, source, temp, gc, i, 0, 1, sheight, j++, 0);
+
+ j = 0;
+ end = dheight * yscale;
+ /* Scale height of temp into dest pixmap */
+ for (i = 0; i <= end; i += yscale)
+ XCopyArea (*dpy, temp, dest, gc, 0, i, dwidth, 1, 0, j++);
+
+ XFreePixmap (*dpy, temp);
+ return (Pixmap) dest;
+}
+
+static Pixmap
+subpixmap (Display *dpy, Window window, Pixmap src,
+ int w, int h, int y, int depth)
+{
+ XGCValues gcv;
+ Pixmap dest = XCreatePixmap (dpy, window, w, h, depth);
+ GC gc = XCreateGC (dpy, src, 0, &gcv);
+ XCopyArea (dpy, src, dest, gc, 0, y, w, h, 0, 0);
+ XFreeGC (dpy, gc);
+ return dest;
+}
+
+
+/* Load the ghost pixmaps and their mask. */
+static void
+load_pixmaps (Display ** dpy, Window window, pacmangamestruct ** ps)
+{
+ pacmangamestruct *pp = *ps;
+ Display *display = *dpy;
+ Pixmap sprites, sprites_mask;
+ int i, j, k, m, sw, sh, srcy;
+/* int w = pp->spritexs;
+ int h = pp->spriteys;*/
+ GC gc = 0;
+/* Pixmap temp;*/
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes (display, window, &xgwa);
+
+ sprites = image_data_to_pixmap (display, window,
+ pacman_png, sizeof(pacman_png), &sw, &sh,
+ &sprites_mask);
+ if (!sprites || !sprites_mask) abort();
+
+ srcy = 0;
+
+ gc = XCreateGC (display, sprites_mask, 0, &gcv);
+
+ pp->ghostMask = subpixmap (display, window, sprites_mask,
+ sw, sw, srcy, 1);
+ pp->ghostMask = scale_pixmap (&display, gc, pp->ghostMask,
+ pp->spritexs, pp->spriteys);
+
+ for (i = 0; i < 4; i++) {
+ m = 0;
+ for (j = 0; j < MAXGDIR; j++) {
+ for (k = 0; k < MAXGWAG; k++) {
+ pp->ghostPixmap[i][j][k] =
+ subpixmap (display, window, sprites, sw, sw, srcy,
+ xgwa.depth);
+ pp->ghostPixmap[i][j][k] =
+ scale_pixmap (&display, pp->stippledGC,
+ pp->ghostPixmap[i][j][k], pp->spritexs,
+ pp->spriteys);
+ m++;
+ srcy += sw;
+ if (srcy >= sh) abort();
+ }
+ }
+ }
+
+ /* load the scared ghost */
+ m = 0;
+ for (i = 0; i < MAXGFLASH; i++) {
+ for (j = 0; j < MAXGWAG; j++) {
+ pp->s_ghostPixmap[i][j] =
+ subpixmap (display, window, sprites, sw, sw, srcy,
+ xgwa.depth);
+ m++;
+ pp->s_ghostPixmap[i][j] = scale_pixmap (&display, pp->stippledGC,
+ pp->s_ghostPixmap[i][j],
+ pp->spritexs,
+ pp->spriteys);
+ srcy += sw;
+ if (srcy >= sh) abort();
+ }
+ }
+
+ /* load the ghost eyes */
+ for (i = 0; i < MAXGDIR; i++) {
+ pp->ghostEyes[i] =
+ subpixmap (display, window, sprites, sw, sw, srcy, xgwa.depth);
+ pp->ghostEyes[i] = scale_pixmap (&display, pp->stippledGC,
+ pp->ghostEyes[i],
+ pp->spritexs,
+ pp->spriteys);
+ srcy += sw;
+ if (srcy >= sh) abort();
+ }
+
+
+ /* Load the pacman pixmaps and their mask. */
+
+ m = 0;
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < MAXMOUTH; j++) {
+ pp->pacmanPixmap[i][j] =
+ subpixmap (display, window, sprites, sw, sw, srcy,
+ xgwa.depth);
+ pp->pacmanMask[i][j] =
+ subpixmap (display, window, sprites_mask, sw, sw, srcy, 1);
+ m++;
+ pp->pacmanPixmap[i][j] = scale_pixmap (&display, pp->stippledGC,
+ pp->pacmanPixmap[i][j],
+ pp->spritexs,
+ pp->spriteys);
+ pp->pacmanMask[i][j] =
+ scale_pixmap (&display, gc, pp->pacmanMask[i][j],
+ pp->spritexs, pp->spriteys);
+ srcy += sw;
+ if (srcy >= sh) abort();
+ }
+ }
+
+ /* Load pacman death sequence */
+ for ( i = 0; i < PAC_DEATH_FRAMES; i++ ){
+ if (srcy > sh - sw) abort();
+ pp->pacman_ds[i] =
+ subpixmap (display, window, sprites, sw, sw, srcy, xgwa.depth);
+ pp->pacman_ds_mask[i] =
+ subpixmap (display, window, sprites_mask, sw, sw, srcy, 1);
+
+ pp->pacman_ds[i] = scale_pixmap ( &display, pp->stippledGC,
+ pp->pacman_ds[i],
+ pp->spritexs,
+ pp->spriteys);
+ pp->pacman_ds_mask[i] =
+ scale_pixmap (&display, gc, pp->pacman_ds_mask[i],
+ pp->spritexs, pp->spriteys);
+ srcy += sw;
+ }
+}
+
+
+/* Hook function, sets state to initial position. */
+ENTRYPOINT void
+init_pacman (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY (mi);
+ Window window = MI_WINDOW (mi);
+ long size = MI_SIZE (mi);
+ pacmangamestruct *pp;
+ XGCValues gcv;
+ int i, j, k;
+
+ MI_INIT (mi, pacman_games);
+ pp = &pacman_games[MI_SCREEN (mi)];
+
+ pp->width = (unsigned short) MI_WIDTH (mi);
+ pp->height = (unsigned short) MI_HEIGHT (mi);
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < MAXGDIR; j++) {
+ for (k = 0; k < MAXGWAG; k++) {
+ if (pp->ghostPixmap[i][j][k] != None) {
+ XFreePixmap (display, pp->ghostPixmap[i][j][k]);
+ pp->ghostPixmap[i][j][k] = None;
+ pp->graphics_format = 0 /*IS_NONE */ ;
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < MAXGFLASH; i++) {
+ for (j = 0; j < MAXGWAG; j++) {
+ if (pp->s_ghostPixmap[i][j] != None) {
+ XFreePixmap (display, pp->s_ghostPixmap[i][j]);
+ pp->s_ghostPixmap[i][j] = None;
+ }
+ }
+ }
+
+ if (size == 0 ||
+ MINGRIDSIZE * size > (int) pp->width ||
+ MINGRIDSIZE * size > (int) pp->height) {
+ double scale = MIN (pp->width / LEVWIDTH, pp->height / LEVHEIGHT);
+
+ if (pp->width > pp->height * 5 || /* weird window aspect ratio */
+ pp->height > pp->width * 5)
+ scale = 0.8 * (pp->width / pp->height
+ ? pp->width / (double) pp->height
+ : pp->height / (double) pp->width);
+ pp->ys = MAX (scale, 1);
+ pp->xs = pp->ys;
+ }
+ else {
+ if (size < -MINSIZE)
+ pp->ys = (short) (NRAND (MIN (-size, MAX (MINSIZE,
+ MIN (pp->width,
+ pp->height) /
+ MINGRIDSIZE))
+ - MINSIZE + 1) + MINSIZE);
+ else if (size < MINSIZE)
+ pp->ys = MINSIZE;
+ else
+ pp->ys = (short) (MIN (size,
+ MAX (MINSIZE, MIN (pp->width, pp->height) /
+ MINGRIDSIZE)));
+ pp->xs = pp->ys;
+ }
+
+
+ pp->wallwidth = (unsigned int) (pp->xs + pp->ys) >> 4;
+ if (pp->wallwidth < 1)
+ pp->wallwidth = 1;
+ pp->incx = (pp->xs >> 3) + 1;
+ pp->incy = (pp->ys >> 3) + 1;
+ pp->ncols = (unsigned short) MAX (LEVWIDTH, 2);
+ pp->nrows = (unsigned short) MAX (LEVHEIGHT, 2);
+ pp->xb = (pp->width - pp->ncols * pp->xs) >> 1;
+ pp->yb = (pp->height - pp->nrows * pp->ys) >> 1;
+ pp->spritexs = MAX (pp->xs + (pp->xs >> 1) - 1, 1);
+ pp->spriteys = MAX (pp->ys + (pp->ys >> 1) - 1, 1);
+ pp->spritedx = (pp->xs - pp->spritexs) >> 1;
+ pp->spritedy = (pp->ys - pp->spriteys) >> 1;
+ pp->old_pac_state = ps_chasing;
+
+ if (!pp->stippledGC) {
+ gcv.foreground = MI_BLACK_PIXEL (mi);
+ gcv.background = MI_BLACK_PIXEL (mi);
+ if ((pp->stippledGC = XCreateGC (display, window,
+ GCForeground | GCBackground,
+ &gcv)) == None) {
+ free_pacman (mi);
+ return;
+ }
+ }
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (display, pp->stippledGC, False);
+#endif
+
+ load_pixmaps (&display, window, &pp);
+
+ pp->pacman.lastbox = START;
+ pp->pacman.mouthdirection = 1;
+ pp->pacman.nextcol = NOWHERE;
+ pp->pacman.nextrow = NOWHERE;
+
+ if (pp->ghosts != NULL) {
+ free (pp->ghosts);
+ pp->ghosts = (ghoststruct *) NULL;
+ }
+ pp->nghosts = GHOSTS;
+
+ if (!pp->ghosts)
+ if ((pp->ghosts = (ghoststruct *) calloc ((size_t) pp->nghosts,
+ sizeof (ghoststruct))) ==
+ NULL) {
+ free_pacman (mi);
+ return;
+ }
+
+ pp->pacman.mouthstage = MAXMOUTH - 1;
+
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+ repopulate (mi);
+}
+
+/* Callback function called for each tick. This is the complete machinery of
+ everything that moves. */
+ENTRYPOINT void
+draw_pacman (ModeInfo * mi)
+{
+ unsigned int g;
+ pacmangamestruct *pp;
+
+ if (pacman_games == NULL)
+ return;
+ pp = &pacman_games[MI_SCREEN (mi)];
+ if (pp->ghosts == NULL)
+ return;
+
+ pp->pacman.err.x = (pp->pacman.err.x + 1) % pp->pacman.speed;
+ pp->pacman.err.y = (pp->pacman.err.y + 1) % pp->pacman.speed;
+ pp->pacman.delta.x += pp->pacman.err.x != 0 ? pp->incx : 0;
+ pp->pacman.delta.y += pp->pacman.err.y != 0 ? pp->incy : 0;
+
+ if (pp->pacman.delta.x >= pp->xs && pp->pacman.delta.y >= pp->ys) {
+ pacman_update (mi, pp, &(pp->pacman));
+ check_death (mi, pp);
+ pp->pacman.delta.x = pp->incx;
+ pp->pacman.delta.y = pp->incy;
+ }
+
+ if (pp->pacman.delta.x > pp->xs + pp->incx)
+ pp->pacman.delta.x = pp->xs + pp->incx;
+ if (pp->pacman.delta.y > pp->ys + pp->incy)
+ pp->pacman.delta.y = pp->ys + pp->incy;
+
+ for (g = 0; g < pp->nghosts; g++) {
+ pp->ghosts[g].err.x = (pp->ghosts[g].err.x + 1) % pp->ghosts[g].speed;
+ pp->ghosts[g].err.y = (pp->ghosts[g].err.y + 1) % pp->ghosts[g].speed;
+ pp->ghosts[g].delta.x += pp->ghosts[g].err.x != 0 ? pp->incx : 0;
+ pp->ghosts[g].delta.y += pp->ghosts[g].err.y != 0 ? pp->incy : 0;
+
+ if (pp->ghosts[g].delta.x >= pp->xs &&
+ pp->ghosts[g].delta.y >= pp->ys) {
+ pacman_ghost_update (pp, &(pp->ghosts[g]));
+ pp->ghosts[g].delta.x = pp->incx;
+ pp->ghosts[g].delta.y = pp->incy;
+ }
+
+ if (pp->ghosts[g].delta.x > pp->xs + pp->incx)
+ pp->ghosts[g].delta.x = pp->xs + pp->incx;
+ if (pp->ghosts[g].delta.y > pp->ys + pp->incy)
+ pp->ghosts[g].delta.y = pp->ys + pp->incy;
+ }
+ pacman_tick (mi);
+}
+
+#ifndef STANDALONE
+/* Refresh current level. */
+ENTRYPOINT void
+refresh_pacman (ModeInfo * mi)
+{
+ drawlevel (mi);
+ pacman_tick (mi);
+}
+#endif
+
+ENTRYPOINT void
+reshape_pacman(ModeInfo * mi, int width, int height)
+{
+ pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
+ pp->width = width;
+ pp->height = height;
+ pp->xb = (pp->width - pp->ncols * pp->xs) >> 1;
+ pp->yb = (pp->height - pp->nrows * pp->ys) >> 1;
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+ /* repopulate (mi); */
+ drawlevel (mi);
+}
+
+#ifndef STANDALONE
+/* Callback to change level. */
+ENTRYPOINT void
+change_pacman (ModeInfo * mi)
+{
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+ repopulate (mi);
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("Pacman", pacman)
+
+#endif /* MODE_pacman */
diff --git a/hacks/pacman.h b/hacks/pacman.h
new file mode 100644
index 0000000..a5b91dc
--- /dev/null
+++ b/hacks/pacman.h
@@ -0,0 +1,220 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 3-May-2002: Added AI to pacman and ghosts, slowed down ghosts.
+ * 26-Nov-2001: Random level generator added
+ * 01-Nov-2000: Allocation checks
+ * 04-Jun-1997: Compatible with xscreensaver
+ *
+ */
+
+#ifndef __PACMAN_H__
+#define __PACMAN_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "xlockmoreI.h"
+
+#include "ximage-loader.h"
+
+#define LEVHEIGHT 32U
+#define LEVWIDTH 40U
+
+#define TILEWIDTH 5U
+#define TILEHEIGHT 5U
+
+#define GETNB(n) ((1 << (n)) - 1)
+#define TESTNB(v, n) (((1 << (n)) & v) != 0x00)
+#define SNB(v, n) ((v) |= (1 << (n)))
+#define UNSNB(v, n) ((v) &= ~(1 << (n)))
+#define GHOSTS 4U
+#define MAXMOUTH 3
+#define MAXGPOS 2
+#define MAXGDIR 4
+#define MAXGWAG 2
+#define MAXGFLASH 2
+#define MINGRIDSIZE 4
+#define MINSIZE 3
+#define NOWHERE 16383
+#define START ((LRAND() & 1) ? 1 : 3)
+#define MINDOTPERC 10
+
+#define YELLOW (MI_NPIXELS(mi) / 6)
+#define GREEN (23 * MI_NPIXELS(mi) / 64)
+#define BLUE (45 * MI_NPIXELS(mi) / 64)
+#define WHITE (MI_NPIXELS(mi))
+
+#define LINEWIDTH 4
+#define HLINEWIDTH 1
+#define JAILHEIGHT 7
+#define JAILWIDTH 8
+
+#define GETFACTOR(x, y) ((x) > (y) ? 1 : ((x) < (y) ? -1 : 0))
+#define SIGN(x) GETFACTOR((x), 0)
+#define TRACEVECS 40
+#define PAC_DEATH_FRAMES 8
+
+#define GHOST_TRACE ( LEVWIDTH * LEVHEIGHT )
+
+#define DIRVECS 4
+#define NUM_BONUS_DOTS 4
+
+typedef struct
+{
+ int vx, vy;
+} tracevec_struct;
+
+typedef enum
+ { inbox = 0, goingout, randdir, chasing, hiding, goingin } GhostState;
+typedef enum
+ { ps_eating = 0, ps_chasing, ps_hiding, ps_random, ps_dieing } PacmanState;
+typedef enum
+{ GHOST_DANGER, GHOST_EATEN } GameState;
+
+typedef struct
+{
+ volatile unsigned int col, row;
+ unsigned int lastbox, nextcol, nextrow;
+ int dead;
+ int cfactor, rfactor;
+ int cf, rf;
+ int oldcf, oldrf;
+ volatile int timeleft;
+ GhostState aistate;
+ int speed;
+ XPoint delta;
+ XPoint err;
+ int flash_scared;
+ int trace_idx;
+ tracevec_struct trace[GHOST_TRACE];
+ int home_idx;
+ volatile int home_count;
+ tracevec_struct way_home[GHOST_TRACE];
+ volatile int wait_pos; /* a cycle before calculating the position */
+#if 0 /* Used for debugging */
+ int ndirs;
+ int oldndirs;
+#endif
+
+#if 0 /* Used for debugging */
+ char last_stat[1024];
+#endif
+
+} ghoststruct;
+
+typedef struct
+{
+ unsigned int col, row;
+ unsigned int lastbox, nextcol, nextrow;
+ int mouthstage, mouthdirection;
+ int cfactor, rfactor;
+ int cf, rf;
+ int oldcf, oldrf;
+ int oldlx, oldly;
+ int justate;
+ PacmanState aistate;
+ tracevec_struct trace[TRACEVECS];
+ int cur_trace;
+ int state_change;
+ int roundscore;
+ int speed;
+ int lastturn;
+ XPoint delta;
+ XPoint err;
+ int deaths;
+ int init_row;
+} pacmanstruct;
+
+
+typedef struct
+{
+ unsigned int x, y;
+ int eaten;
+} bonus_dot;
+
+
+/* This are tiles which can be placed to create a level. */
+struct tiles {
+ char block[TILEWIDTH * TILEHEIGHT + 1];
+ unsigned dirvec[4];
+ unsigned ndirs;
+ unsigned simular_to;
+};
+
+typedef struct
+{
+ unsigned short width, height;
+ unsigned short nrows, ncols;
+ short xs, ys, xb, yb;
+ short incx, incy;
+ GC stippledGC;
+ int graphics_format;
+ pacmanstruct pacman;
+ ghoststruct *ghosts;
+ unsigned int nghosts;
+ Pixmap pacmanPixmap[4][MAXMOUTH];
+ Pixmap pacmanMask[4][MAXMOUTH];
+ Pixmap pacman_ds[PAC_DEATH_FRAMES]; /* pacman death sequence */
+ Pixmap pacman_ds_mask[PAC_DEATH_FRAMES];
+ Pixmap ghostPixmap[4][MAXGDIR][MAXGWAG];
+ Pixmap ghostMask;
+ Pixmap s_ghostPixmap[MAXGFLASH][MAXGWAG]; /* Scared ghost Pixmaps */
+ Pixmap ghostEyes[MAXGDIR];
+ char level[LEVHEIGHT * LEVWIDTH];
+ unsigned int wallwidth;
+ unsigned int dotsleft;
+ int spritexs, spriteys, spritedx, spritedy;
+
+ GameState gamestate;
+ unsigned int timeleft;
+
+ char last_pac_stat[1024];
+
+ /* draw_pacman_sprite */
+ int pm_mouth;
+ int pm_mouth_delay;
+ int pm_open_mouth;
+ int pm_death_frame;
+ int pm_death_delay;
+
+ /* draw_ghost_sprite */
+ int gh_wag;
+ int gh_wag_count;
+
+ /* flash_bonus_dots */
+ int bd_flash_count;
+ int bd_on;
+
+ /* pacman_tick */
+ int ghost_scared_timer;
+ int flash_timer;
+ PacmanState old_pac_state;
+
+ /* pacman_level.c */
+ bonus_dot bonus_dots[NUM_BONUS_DOTS];
+ struct tiles *tiles;
+
+} pacmangamestruct;
+
+extern pacmangamestruct *pacman_games;
+extern Bool pacman_trackmouse;
+
+typedef char lev_t[LEVHEIGHT][LEVWIDTH + 1];
+
+#endif /* __PACMAN_H__ */
diff --git a/hacks/pacman.man b/hacks/pacman.man
new file mode 100644
index 0000000..ba19a56
--- /dev/null
+++ b/hacks/pacman.man
@@ -0,0 +1,67 @@
+.TH XScreenSaver 1 "12-Feb-2004" "X Version 11"
+.SH NAME
+pacman - simulates a game of Pac-Man on a randomly-created level.
+.SH SYNOPSIS
+.B pacman
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-ncolors \fIinteger\fP]
+[\-delay \fImicroseconds\fP]
+[\-size \fIpixels\fP]
+[\-fps]
+.SH DESCRIPTION
+Simulates a game of Pac-Man on a randomly-created level.
+.SH OPTIONS
+.I pacman
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 6.
+.TP 8
+.B \-size \fIinteger\fP
+How big to make Pac-Man and the ghosts. 0 means "default."
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1).
+.SH COPYRIGHT
+Copyright \(co 2000 Edwin de Jong.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Edwin de Jong <mauddib@gmx.net>.
diff --git a/hacks/pacman_ai.c b/hacks/pacman_ai.c
new file mode 100644
index 0000000..b85bd96
--- /dev/null
+++ b/hacks/pacman_ai.c
@@ -0,0 +1,876 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+/* this file handles the AI of the ghosts and the pacman. */
+
+#include <math.h>
+#include <assert.h>
+#include "pacman.h"
+#include "pacman_ai.h"
+#include "pacman_level.h"
+
+#define MI_DISPLAY(MI) ((MI)->dpy)
+#define MI_WINDOW(MI) ((MI)->window)
+#define MI_WIDTH(MI) ((MI)->xgwa.width)
+#define MI_HEIGHT(MI) ((MI)->xgwa.height)
+
+#define DIRVECS 4
+static const struct
+{
+ int dx, dy;
+} dirvecs[DIRVECS] = { {
+-1, 0}, {
+0, 1}, {
+1, 0}, {
+0, -1}};
+
+/* positions that match the dirvecs */
+typedef enum {pos_none = -1, pos_left = 0, pos_up = 1, pos_right = 2, pos_down = 3} pos;
+
+
+/* fills array of DIRVECS size with possible directions, returns number of
+ directions. 'posdirs' points to a possibly undefined array of four
+ integers. The vector will contain booleans wether the direction is
+ a possible direction or not. Reverse directions are deleted. */
+static int
+ghost_get_posdirs (pacmangamestruct * pp, int *posdirs, ghoststruct * g)
+{
+ unsigned int i, nrdirs = 0;
+ unsigned int can_go_in = 0;
+
+ /* bit of black magic here */
+ for (i = 0; i < DIRVECS; i++) {
+ /* remove opposite */
+ if (g->lastbox != NOWHERE && i == (g->lastbox + 2) % DIRVECS
+ && (g->aistate != goingout )) {
+ posdirs[i] = 0;
+ continue;
+ }
+ if (g->aistate == goingout && i == 1) {
+ posdirs[i] = 0;
+ continue;
+ }
+ /* check if possible direction */
+ can_go_in = (g->aistate == goingout || g->aistate == goingin);
+ if ((posdirs[i] =
+ pacman_check_pos (pp, g->row + dirvecs[i].dy,
+ g->col + dirvecs[i].dx,
+ can_go_in)) == True) {
+ nrdirs++;
+ }
+ }
+
+ return nrdirs;
+}
+
+/* Directs ghost to a random direction, exluding opposite (except in the
+ impossible situation that there is only one valid direction). */
+static void
+ghost_random (pacmangamestruct * pp, ghoststruct * g)
+{
+ int posdirs[DIRVECS], nrdirs = 0, i, dir = 0;
+
+ nrdirs = ghost_get_posdirs (pp, posdirs, g);
+#if 0
+ g->ndirs = nrdirs;
+#endif
+ for (i = 0; i < DIRVECS; i++)
+ if (posdirs[i] == True)
+ dir = i;
+
+ if (nrdirs == 0)
+ dir = (g->lastbox + 2) % DIRVECS;
+ else if (nrdirs > 1)
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == True && NRAND (nrdirs) == 0) {
+ dir = i;
+ break;
+ }
+ }
+
+ g->nextrow = g->row + dirvecs[dir].dy;
+ g->nextcol = g->col + dirvecs[dir].dx;
+ g->lastbox = dir;
+}
+
+/* Determines best direction to chase the pacman and goes that direction. */
+static void
+ghost_chasing (pacmangamestruct * pp, ghoststruct * g)
+{
+ int posdirs[DIRVECS], nrdirs = 0, i, dir = 0, highest = -100000,
+ thisvecx, thisvecy, thisvec;
+
+ nrdirs = ghost_get_posdirs (pp, posdirs, g);
+#if 0
+ g->ndirs = nrdirs;
+#endif
+ for (i = 0; i < DIRVECS; i++)
+ if (posdirs[i] == True)
+ dir = i;
+
+ if (nrdirs == 0)
+ dir = (g->lastbox + 2) % DIRVECS;
+ else if (nrdirs > 1)
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == False)
+ continue;
+ thisvecx = (pp->pacman.col - g->col) * dirvecs[i].dx;
+ thisvecy = (pp->pacman.row - g->row) * dirvecs[i].dy;
+ thisvec = thisvecx + thisvecy;
+ if (thisvec >= highest) {
+ dir = i;
+ highest = thisvec;
+ }
+ }
+
+ g->nextrow = g->row + dirvecs[dir].dy;
+ g->nextcol = g->col + dirvecs[dir].dx;
+ g->lastbox = dir;
+}
+
+/* Determines the best direction to go away from the pacman, and goes that
+ direction. */
+static void
+ghost_hiding (pacmangamestruct * pp, ghoststruct * g)
+{
+ int posdirs[DIRVECS], nrdirs = 0, i, dir = 0, highest = -100000,
+ thisvecx, thisvecy, thisvec;
+
+ nrdirs = ghost_get_posdirs (pp, posdirs, g);
+#if 0
+ g->ndirs = nrdirs;
+#endif
+ for (i = 0; i < DIRVECS; i++)
+ if (posdirs[i] == True)
+ dir = i;
+
+ if (nrdirs == 0)
+ dir = (g->lastbox + 2) % DIRVECS;
+ else if (nrdirs > 1)
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == False)
+ continue;
+ thisvecx = (g->col - pp->pacman.col) * dirvecs[i].dx;
+ thisvecy = (g->row - pp->pacman.row) * dirvecs[i].dy;
+ thisvec = thisvecx + thisvecy;
+ if (thisvec >= highest)
+ dir = i;
+ }
+
+ g->nextrow = g->row + dirvecs[dir].dy;
+ g->nextcol = g->col + dirvecs[dir].dx;
+ g->lastbox = dir;
+}
+
+#if 1
+static void
+clear_trace(ghoststruct *g)
+{
+ int i = 0;
+ g->trace_idx = 0;
+ while (i < GHOST_TRACE){
+ g->trace[i].vx = -1;
+ g->trace[i++].vy = -1;
+ }
+}
+
+
+static void
+save_position (ghoststruct *g, int x, int y)
+{
+ int i = g->trace_idx;
+ assert ( 0 <= i && i < GHOST_TRACE );
+ g->trace[i].vx = x;
+ g->trace[i].vy = y;
+ g->trace_idx++;
+}
+
+static int
+already_tried (ghoststruct *g, int x, int y)
+{
+ int i = 0;
+ if (! ( 0 <= g->trace_idx && g->trace_idx < GHOST_TRACE ) ){
+ fprintf(stderr, "FOUND TRACE ERROR. DUMPING TRACE.\n");
+ fprintf(stderr, "%d\n", g->trace_idx );
+ for ( i = 0; i < GHOST_TRACE; i++ ){
+ fprintf(stderr, "( %d, %d )\n", g->trace[i].vx, g->trace[i].vy );
+ }
+ assert ( False );
+ }
+ while (i < g->trace_idx){
+ if ( x == g->trace[i].vx && y == g->trace[i].vy ){
+ /* fprintf ( stderr, "Match FOUND (%d, %d)\n", x, y); */
+ return 1;
+ }
+ i++;
+ }
+ return 0;
+}
+#endif
+
+static void
+store_dir ( ghoststruct *g, pos ps ){
+ int i = g->home_count;
+ assert ( 0 <= i && i < GHOST_TRACE );
+ g->way_home[i].vx = dirvecs[ps].dx;
+ g->way_home[i].vy = dirvecs[ps].dy;
+ g->home_count++;
+}
+
+static void
+clear_dir ( ghoststruct *g ){
+ int i = 0;
+ g->home_count = 0;
+ g->home_idx = 0;
+ while (i < GHOST_TRACE){
+ g->way_home[i].vx = -1;
+ g->way_home[i++].vy = -1;
+ }
+}
+
+static int
+found_jail ( int col, int row ){
+ int cx, cy;
+ pacman_get_jail_opening ( &cx, &cy );
+ cy += 1;
+ if (row == cy && col == cx )
+ return 1;
+ else
+ return 0;
+}
+
+static int
+move_ghost ( pacmangamestruct * pp,
+ int row, int col,
+ pos ps,
+ int *new_row, int *new_col){
+ int idx = (int)ps;
+ int tr = row + dirvecs[idx].dx;
+ int tc = col + dirvecs[idx].dy;
+ if ( pacman_check_pos ( pp, tr, tc, True )){
+ *new_row = tr;
+ *new_col = tc;
+ return True;
+ }
+ else {
+ return False;
+ }
+}
+
+static int
+recur_back_track ( pacmangamestruct * pp, ghoststruct *g, int row, int col ){
+ int new_row, new_col;
+
+ if ( already_tried ( g, col, row ) )
+ return False;
+
+ if ( found_jail ( col, row ) )
+ return True;
+
+ save_position ( g, col, row );
+
+ if ( move_ghost ( pp, row, col, pos_left, &new_row, &new_col ))
+ if ( recur_back_track ( pp, g, new_row, new_col )){
+ store_dir ( g, pos_left );
+ return True;
+ }
+
+ if ( move_ghost ( pp, row, col, pos_up, &new_row, &new_col ))
+ if ( recur_back_track ( pp, g, new_row, new_col )){
+ store_dir ( g, pos_up );
+ return True;
+ }
+
+ if ( move_ghost ( pp, row, col, pos_down, &new_row, &new_col ))
+ if ( recur_back_track ( pp, g, new_row, new_col )){
+ store_dir ( g, pos_down );
+ return True;
+ }
+
+ if ( move_ghost ( pp, row, col, pos_right, &new_row, &new_col ))
+ if ( recur_back_track ( pp, g, new_row, new_col )){
+ store_dir ( g, pos_right );
+ return True;
+ }
+
+ return False;
+}
+
+static void
+find_home ( pacmangamestruct *pp, ghoststruct *g ){
+ int i;
+ int r,c;
+ int cx, cy;
+ ghoststruct *tmp_ghost;
+ tmp_ghost = (ghoststruct*)malloc(sizeof ( ghoststruct ));
+ if ( tmp_ghost == NULL ){
+ fprintf(stderr, "find_home : Could not allocate memory.");
+ exit ( 1 );
+ }
+ tmp_ghost = memmove(tmp_ghost, g, sizeof ( ghoststruct ));
+ if ( tmp_ghost == NULL ){
+ fprintf(stderr, "find_home : Could not copy memory.");
+ exit ( 1 );
+ }
+ clear_trace ( tmp_ghost );
+ clear_dir ( tmp_ghost );
+ r = tmp_ghost->row;
+ c = tmp_ghost->col;
+ if ( ! recur_back_track ( pp, tmp_ghost, r, c ) ){
+ fprintf(stderr, "Could not find way home.#@$?\n");
+ pacman_get_jail_opening ( &cx, &cy);
+ fprintf(stderr, "Jail was at (%d%d)\n", cx,cy);
+ }
+ for ( i = 0; i < GHOST_TRACE; i++ ){
+ g->way_home[i].vx = tmp_ghost->way_home[i].vx;
+ g->way_home[i].vy = tmp_ghost->way_home[i].vy;
+ }
+ g->home_count = tmp_ghost->home_count;
+ g->home_idx = tmp_ghost->home_count;
+ free(tmp_ghost);
+}
+
+/* Make the ghost go back to the inbox */
+static void
+ghost_goingin (pacmangamestruct * pp, ghoststruct * g)
+{
+ g->home_idx--;
+ if (g->home_idx < 0){ g->aistate = goingout; return;}
+ /* row == vx ? wtf... Don't Ask */
+ g->nextrow = g->row + g->way_home[g->home_idx].vx;
+ g->nextcol = g->col + g->way_home[g->home_idx].vy;
+}
+
+
+/* Determines a vector from the pacman position, towards all dots. The vector
+ is inversely proportional to the square of the distance of each dot.
+ (so, close dots attract more than far away dots). */
+static void
+pac_dot_vec (pacmangamestruct * pp, pacmanstruct * p, long *vx, long *vy)
+{
+ int x, y, bx = 0, by = 0, ex = LEVWIDTH, ey = LEVHEIGHT;
+ long dx, dy, dist, top = 0;
+
+#if 0
+ int rnr = NRAND (50);
+ /* determine begin and end vectors */
+
+ switch (rnr) {
+ case 0:
+ ex = LEVHEIGHT / 2;
+ break;
+ case 1:
+ bx = LEVHEIGHT / 2;
+ break;
+ case 2:
+ ey = LEVHEIGHT / 2;
+ break;
+ case 3:
+ by = LEVHEIGHT / 2;
+ break;
+ }
+#endif
+ *vx = *vy = 0;
+
+ for (y = by; y < ey; y++)
+ for (x = bx; x < ex; x++)
+ if (pacman_check_dot (pp, x, y) == 1) {
+ dx = (long) x - (long) (p->col);
+ dy = (long) y - (long) (p->row);
+ dist = dx * dx + dy * dy;
+ if (dist > top)
+ top = dist;
+ *vx += (dx * ((long) LEVWIDTH * (long) LEVHEIGHT))
+ / dist;
+ *vy += (dy * ((long) LEVWIDTH * (long) LEVHEIGHT))
+ / dist;
+ }
+}
+
+/* Determine a vector towards the closest ghost (in one loop, so we spare a
+ couple of cycles which we can spoil somewhere else just as fast). */
+static int
+pac_ghost_prox_and_vector (pacmangamestruct * pp, pacmanstruct * p,
+ int *vx, int *vy)
+{
+ int dx, dy, dist, closest = 100000;
+ unsigned int g;
+
+ if (vx != NULL)
+ *vx = *vy = 0;
+
+ for (g = 0; g < pp->nghosts; g++) {
+ if (pp->ghosts[g].dead == True ||
+ pp->ghosts[g].aistate == inbox ||
+ pp->ghosts[g].aistate == goingout)
+ continue;
+ dx = pp->ghosts[g].col + /*dirvecs[pp->ghosts[g].lastbox].dx */ -
+ p->col;
+ dy = pp->ghosts[g].row + /*dirvecs[pp->ghosts[g].lastbox].dy */ -
+ p->row;
+ dist = dx * dx + dy * dy;
+ if (dist < closest) {
+ closest = dist;
+ if (vx != NULL) {
+ *vx = dx;
+ *vy = dy;
+ }
+ }
+ }
+ return closest;
+}
+
+/* fills array of DIRVECS size with possible directions, returns number of
+ directions. posdirs should point to an array of 4 integers. */
+static int
+pac_get_posdirs (pacmangamestruct * pp, pacmanstruct * p, int *posdirs)
+{
+ int nrdirs = 0;
+ unsigned int i;
+
+ for (i = 0; i < DIRVECS; i++) {
+ /* if we just ate, or we are in a statechange, it is allowed
+ * to go the opposite direction */
+ if (p->justate == 0 &&
+ p->state_change == 0 &&
+ p->lastbox != NOWHERE && i == (p->lastbox + 2) % DIRVECS) {
+ posdirs[i] = 0;
+ }
+ else if ((posdirs[i] =
+ pacman_check_pos (pp, p->row + dirvecs[i].dy,
+ p->col + dirvecs[i].dx, 0)) == 1)
+ nrdirs++;
+ }
+ p->state_change = 0;
+
+ return nrdirs;
+}
+
+/* Clears the trace of vectors. */
+void
+pacman_clear_trace (pacmanstruct * p)
+{
+ int i;
+
+ for (i = 0; i < TRACEVECS; i++) {
+ p->trace[i].vx = NOWHERE;
+ p->trace[i].vy = NOWHERE;
+ }
+ p->cur_trace = 0;
+}
+
+/* Adds a new vector to the trace. */
+static void
+pac_save_trace (pacmanstruct * p, const int vx, const int vy)
+{
+ if (!(vx == NOWHERE && vy == NOWHERE)) {
+ p->trace[p->cur_trace].vx = vx;
+ p->trace[p->cur_trace].vy = vy;
+ p->cur_trace = (p->cur_trace + 1) % TRACEVECS;
+ }
+}
+
+/* Check if a vector can be found in the trace. */
+static int
+pac_check_trace (const pacmanstruct * p, const int vx, const int vy)
+{
+ int i, curel;
+
+ for (i = 1; i < TRACEVECS; i++) {
+ curel = (p->cur_trace - i + TRACEVECS) % TRACEVECS;
+ if (p->trace[curel].vx == NOWHERE && p->trace[curel].vy == NOWHERE)
+ continue;
+ if (p->trace[curel].vx == vx && p->trace[curel].vy == vy)
+ return 1;
+ }
+
+
+ return 0;
+}
+
+/* AI mode "Eating" for pacman. Tries to eat as many dots as possible, goes
+ to "hiding" if too close to a ghost. If in state "hiding" the vectors
+ of the ghosts are also taken into account (thus not running towards them
+ is the general idea). */
+static void
+pac_eating (pacmangamestruct * pp, pacmanstruct * p)
+{
+ int posdirs[DIRVECS], nrdirs, i, highest = -(1 << 16),
+ score, dir = 0, dotfound = 0, prox, worst = 0;
+ int vx, vy;
+
+ if ((prox = pac_ghost_prox_and_vector (pp, p, &vx, &vy)) <
+ 4 * 4 && p->aistate == ps_eating) {
+ p->aistate = ps_hiding;
+ p->state_change = 1;
+ pacman_clear_trace (p);
+ }
+
+ if (prox > 6 * 6 && p->aistate == ps_hiding) {
+ p->aistate = ps_eating;
+ if (p->justate == 0)
+ p->state_change = 1;
+ pacman_clear_trace (p);
+ }
+
+ if (prox < 3 * 3)
+ p->state_change = 1;
+
+ nrdirs = pac_get_posdirs (pp, p, posdirs);
+
+ /* remove directions which lead to ghosts */
+ if (p->aistate == ps_hiding) {
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == 0)
+ continue;
+ score = vx * dirvecs[i].dx + vy * dirvecs[i].dy;
+ if (score > highest) {
+ worst = i;
+ highest = score;
+ }
+ dir = i;
+ }
+ nrdirs--;
+ posdirs[worst] = 0;
+ highest = -(1 << 16);
+ }
+
+ /* get last possible direction if all else fails */
+ for (i = 0; i < DIRVECS; i++)
+ if (posdirs[i] != 0)
+ dir = i;
+
+ {
+ long lvx = vx;
+ long lvy = vy;
+ pac_dot_vec (pp, p, &lvx, &lvy);
+ vx = lvx;
+ vy = lvy;
+ }
+
+ if (vx != NOWHERE && vy != NOWHERE && pac_check_trace (p, vx, vy) > 0) {
+ p->roundscore++;
+ if (p->roundscore >= 12) {
+ p->roundscore = 0;
+ p->aistate = ps_random;
+ pacman_clear_trace (p);
+ }
+ }
+ else
+ p->roundscore = 0;
+
+ if (p->justate == 0)
+ pac_save_trace (p, vx, vy);
+
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == 0)
+ continue;
+ score = dirvecs[i].dx * vx + dirvecs[i].dy * vy;
+ if (pacman_check_dot (pp, p->col + dirvecs[i].dx,
+ p->row + dirvecs[i].dy) == 1) {
+ if (dotfound == 0) {
+ highest = score;
+ dir = i;
+ dotfound = 1;
+ }
+ else if (score > highest) {
+ highest = score;
+ dir = i;
+ }
+ }
+ else if (score > highest && dotfound == 0) {
+ dir = i;
+ highest = score;
+ }
+ }
+
+ p->nextrow = p->row + dirvecs[dir].dy;
+ p->nextcol = p->col + dirvecs[dir].dx;
+ p->lastbox = dir;
+}
+
+#if 1
+/* Tries to catch the ghosts. */
+static void
+pac_chasing (pacmangamestruct * pp, pacmanstruct * p)
+{
+ int posdirs[DIRVECS], nrdirs, i, highest = -(1 << 16),
+ score, dir = 0, worst = 0;
+ int vx = 0, vy = 0;
+
+ nrdirs = pac_get_posdirs (pp, p, posdirs);
+
+ /* keep directions which lead to ghosts */
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == 0)
+ continue;
+ score = vx * dirvecs[i].dx + vy * dirvecs[i].dy;
+ if (score < highest) {
+ worst = i;
+ highest = score;
+ }
+ dir = i;
+ }
+ nrdirs--;
+ posdirs[worst] = 0;
+
+
+ /* get last possible direction if all else fails */
+ for (i = 0; i < DIRVECS; i++)
+ if (posdirs[i] != 0)
+ dir = i;
+
+ {
+ long lvx = vx;
+ long lvy = vy;
+ pac_dot_vec (pp, p, &lvx, &lvy);
+ vx = lvx;
+ vy = lvy;
+ }
+
+ if (vx != NOWHERE && vy != NOWHERE && pac_check_trace (p, vx, vy) > 0) {
+ p->roundscore++;
+ if (p->roundscore >= 12) {
+ p->roundscore = 0;
+ p->aistate = ps_random;
+ pacman_clear_trace (p);
+ }
+ }
+ else
+ p->roundscore = 0;
+
+
+ p->nextrow = p->row + dirvecs[dir].dy;
+ p->nextcol = p->col + dirvecs[dir].dx;
+ p->lastbox = dir;
+}
+#endif
+
+/* Goes completely random, but not in the opposite direction. Used when a
+ loop is detected. */
+static void
+pac_random (pacmangamestruct * pp, pacmanstruct * p)
+{
+ int posdirs[DIRVECS], nrdirs, i, dir = -1, lastdir = 0;
+
+ if (pac_ghost_prox_and_vector (pp, p, NULL, NULL) < 5 * 5) {
+ p->aistate = ps_hiding;
+ p->state_change = 1;
+ }
+ if (NRAND (20) == 0) {
+ p->aistate = ps_eating;
+ p->state_change = 1;
+ pacman_clear_trace (p);
+ }
+
+ nrdirs = pac_get_posdirs (pp, p, posdirs);
+
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == 0)
+ continue;
+ lastdir = i;
+ if (pacman_check_dot (pp, p->col + dirvecs[i].dx,
+ p->row + dirvecs[i].dy) == 1) {
+ dir = i;
+ p->aistate = ps_eating;
+ p->state_change = 1;
+ pacman_clear_trace (p);
+ break;
+ }
+ else if (NRAND (nrdirs) == 0)
+ dir = i;
+ }
+
+ if (dir == -1)
+ dir = lastdir;
+
+ p->nextrow = p->row + dirvecs[dir].dy;
+ p->nextcol = p->col + dirvecs[dir].dx;
+ p->lastbox = dir;
+}
+
+static int
+pac_get_vector_screen (pacmangamestruct * pp, pacmanstruct * p,
+ const int x, const int y, int *vx, int *vy)
+{
+ int lx, ly;
+
+ lx = (x - pp->xb) / pp->xs;
+ ly = (y - pp->yb) / pp->ys;
+
+ if (lx < 0)
+ lx = 0;
+ else if ((unsigned int) lx > LEVWIDTH)
+ lx = LEVWIDTH - 1;
+
+ if (ly < 0)
+ ly = 0;
+ else if ((unsigned int) ly > LEVHEIGHT)
+ ly = LEVHEIGHT - 1;
+
+ *vx = lx - p->col;
+ *vy = ly - p->row;
+
+ if (lx == p->oldlx && ly == p->oldly)
+ return 0;
+ p->oldlx = lx;
+ p->oldly = ly;
+ return 1;
+}
+
+static int
+pac_trackmouse (ModeInfo * mi, pacmangamestruct * pp, pacmanstruct * p)
+{
+ int dx, dy, cx, cy, vx, vy;
+ unsigned int m;
+ int posdirs[DIRVECS], i, dir = -1, highest = -(2 << 16), score;
+ Window r, c;
+
+ (void) XQueryPointer (MI_DISPLAY (mi), MI_WINDOW (mi),
+ &r, &c, &dx, &dy, &cx, &cy, &m);
+
+ if (cx <= 0 || cy <= 0 ||
+ cx >= MI_WIDTH (mi) - 1 || cy >= MI_HEIGHT (mi) - 1)
+ return 0;
+ /* get vector */
+ p->state_change = pac_get_vector_screen (pp, p, cx, cy, &vx, &vy);
+
+ (void) pac_get_posdirs (pp, p, posdirs);
+
+ for (i = 0; i < DIRVECS; i++) {
+ if (posdirs[i] == 0)
+ continue;
+ score = dirvecs[i].dx * vx + dirvecs[i].dy * vy;
+ if (score > highest) {
+ highest = score;
+ dir = i;
+ }
+ }
+
+ p->nextrow = p->row + dirvecs[dir].dy;
+ p->nextcol = p->col + dirvecs[dir].dx;
+ p->lastbox = dir;
+ return 1;
+}
+
+/* Calls correct state function, and changes between states. */
+void
+pacman_ghost_update (pacmangamestruct * pp, ghoststruct * g)
+{
+
+ if (!(g->nextrow == NOWHERE && g->nextcol == NOWHERE)) {
+ g->row = g->nextrow;
+ g->col = g->nextcol;
+ }
+
+ if ((g->aistate == randdir || g->aistate == chasing) && NRAND (10) == 0) {
+ switch (NRAND (3)) {
+ case 0:
+ g->aistate = randdir;
+ break;
+ case 1:
+ g->aistate = chasing;
+ break;
+ case 2:
+ g->aistate = chasing;
+ break;
+ }
+
+ }
+ else if (g->aistate == inbox) {
+ if (g->timeleft < 0)
+ g->aistate = goingout;
+ else
+ g->timeleft--;
+
+ }
+ else if (g->aistate == goingout) {
+ if (g->col < LEVWIDTH / 2 - JAILWIDTH / 2 ||
+ g->col > LEVWIDTH / 2 + JAILWIDTH / 2 ||
+ g->row < LEVHEIGHT / 2 - JAILHEIGHT / 2 ||
+ g->row > LEVHEIGHT / 2 + JAILHEIGHT / 2)
+ g->aistate = randdir;
+ }
+
+ switch (g->aistate) {
+ case inbox:
+ case goingout:
+ case randdir:
+ ghost_random (pp, g);
+ break;
+ case chasing:
+ ghost_chasing (pp, g);
+ break;
+ case hiding:
+ ghost_hiding (pp, g);
+ break;
+ case goingin:
+ if ( g->wait_pos ){
+ find_home(pp, g);
+ g->wait_pos = False;
+ }
+ ghost_goingin (pp, g);
+ break;
+ }
+
+ g->cfactor = GETFACTOR (g->nextcol, g->col);
+ g->rfactor = GETFACTOR (g->nextrow, g->row);
+}
+
+/* Calls correct pacman state function. */
+void
+pacman_update (ModeInfo * mi, pacmangamestruct * pp, pacmanstruct * p)
+{
+ if (!(p->nextrow == NOWHERE && p->nextcol == NOWHERE)) {
+ p->row = p->nextrow;
+ p->col = p->nextcol;
+ }
+
+ if (pp->level[p->row * LEVWIDTH + p->col] == '.' ||
+ pp->level[p->row * LEVWIDTH + p->col] == 'o') {
+ pp->level[p->row * LEVWIDTH + p->col] = ' ';
+ if (!pacman_trackmouse)
+ p->justate = 1;
+ pp->dotsleft--;
+ }
+ else if (!pacman_trackmouse) {
+ p->justate = 0;
+ }
+
+ if (!(pacman_trackmouse && pac_trackmouse (mi, pp, p))) {
+ /* update pacman */
+ switch (p->aistate) {
+ case ps_eating:
+ pac_eating (pp, p);
+ break;
+ case ps_hiding:
+ pac_eating (pp, p);
+ break;
+ case ps_random:
+ pac_random (pp, p);
+ break;
+ case ps_chasing:
+ pac_chasing (pp, p);
+ break;
+ case ps_dieing:
+ break; /* Don't move */
+ }
+ }
+
+ p->cfactor = GETFACTOR (p->nextcol, p->col);
+ p->rfactor = GETFACTOR (p->nextrow, p->row);
+}
diff --git a/hacks/pacman_ai.h b/hacks/pacman_ai.h
new file mode 100644
index 0000000..2488600
--- /dev/null
+++ b/hacks/pacman_ai.h
@@ -0,0 +1,32 @@
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 3-May-2002: Added AI to pacman and ghosts, slowed down ghosts.
+ * 26-Nov-2001: Random level generator added
+ * 01-Nov-2000: Allocation checks
+ * 04-Jun-1997: Compatible with xscreensaver
+ *
+ */
+
+#ifndef __PACMAN_AI_H__
+#define __PACMAN_AI_H__
+
+extern void pacman_ghost_update (pacmangamestruct * pp, ghoststruct * g);
+extern void pacman_clear_trace (pacmanstruct * p);
+extern void pacman_update (ModeInfo * mi, pacmangamestruct * pp,
+ pacmanstruct * p);
+
+#endif /* __PACMAN_AI_H__ */
diff --git a/hacks/pacman_level.c b/hacks/pacman_level.c
new file mode 100644
index 0000000..f26b3bf
--- /dev/null
+++ b/hacks/pacman_level.c
@@ -0,0 +1,772 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#include <assert.h>
+#include "pacman.h"
+#include "pacman_level.h"
+
+
+#define NONE 0x0000
+#define LT 0x1000
+#define RT 0x0001
+#define RB 0x0010
+#define LB 0x0100
+#define ALL 0x1111
+
+#define BLOCK_EMPTY ' '
+#define BLOCK_DOT_1 '`'
+#define BLOCK_DOT_2 '.'
+#define BLOCK_WALL '#'
+#define BLOCK_GHOST_ONLY '='
+#define BLOCK_WALL_TL '\''
+#define BLOCK_WALL_TR '`'
+#define BLOCK_WALL_BR ','
+#define BLOCK_WALL_BL '_'
+#define BLOCK_WALL_HO '-'
+#define BLOCK_WALL_VE '|'
+#define BLOCK_DOT_BONUS 'o'
+
+/* This is more or less the standard pacman level (without the left-right
+ tunnel. */
+static const lev_t stdlevel = {
+ "########################################",
+ "########################################",
+ "#######````````````##````````````#######",
+ "#######`####`#####`##`#####`####`#######",
+ "#######`####`#####`##`#####`####`#######",
+ "#######`####`#####`##`#####`####`#######",
+ "#######``````````````````````````#######",
+ "#######`####`##`########`##`####`#######",
+ "#######`####`##`########`##`####`#######",
+ "#######``````##````##````##``````#######",
+ "############`#####`##`#####`############",
+ "############`#####`##`#####`############",
+ "############`##``````````##`############",
+ "############`##`###==###`##`############",
+ "############`##`########`##`############",
+ "############````########````############",
+ "############`##`########`##`############",
+ "############`##`########`##`############",
+ "############`##``````````##`############",
+ "############`##`########`##`############",
+ "############`##`########`##`############",
+ "#######````````````##````````````#######",
+ "#######`####`#####`##`#####`####`#######",
+ "#######`####`#####`##`#####`####`#######",
+ "#######```##````````````````##```#######",
+ "#########`##`##`########`##`##`#########",
+ "#########`##`##`########`##`##`#########",
+ "#######``````##````##````##``````#######",
+ "#######`##########`##`##########`#######",
+ "#######`##########`##`##########`#######",
+ "#######``````````````````````````#######",
+ "########################################"
+};
+
+#define TILES_COUNT 11U
+
+#define GO_UP 0x0001U
+#define GO_LEFT 0x0002U
+#define GO_RIGHT 0x0004U
+#define GO_DOWN 0x0008U
+
+static const struct tiles def_tiles[TILES_COUNT] = {
+/*
+ * ' ' == dont care == BLOCK_EMPTY
+ * '#' == set wall, and not clear == BLOCK_WALL
+ * '`' == clear == BLOCK_DOT_1
+ * middle position is always set as cleardef
+ */
+ {
+ " # " " # " " ``` " " # " " # ", {
+ GO_LEFT, GO_RIGHT, 0, 0}, 2,
+ (unsigned) (1 << 0 | 1 << 6 | 1 << 8 | 1 << 10)}, {
+ " " " ` " "##`##" " ` " " ", {
+ GO_UP, GO_DOWN, 0, 0}, 2,
+ (unsigned) (1 << 1 | 1 << 7 | 1 << 9 | 1 << 10)}, {
+ " ##" "##`##" "##`` " "#### " "#### ", {
+ GO_UP, GO_RIGHT, 0, 0}, 2,
+ (unsigned) (1 << 2 | 1 << 6 | 1 << 7 | 1 << 10)}, {
+ "#### " "#### " "##`` " "##`##" " ##", {
+ GO_RIGHT, GO_DOWN, 0, 0}, 2,
+ (unsigned) (1 << 3 | 1 << 7 | 1 << 8 | 1 << 10)}, {
+ " ###" " ###" " ``##" "##` " "## ", {
+ GO_LEFT, GO_DOWN, 0, 0}, 2,
+ (unsigned) (1 << 4 | 1 << 8 | 1 << 9 | 1 << 10)}, {
+ "## " "##`##" " ``##" " ####" " ####", {
+ GO_LEFT, GO_UP, 0, 0}, 2,
+ (unsigned) (1 << 5 | 1 << 6 | 1 << 9 | 1 << 10)}, {
+ "##`##" "##`##" "`````" " ### " " ### ", {
+ GO_LEFT, GO_UP, GO_RIGHT, 0}, 3, (unsigned) 1 << 6}, {
+ " `##" "##`##" "##```" "##`##" " `##", {
+ GO_UP, GO_RIGHT, GO_DOWN, 0}, 3, (unsigned) (1 << 7)}, {
+ " ### " " ### " "`````" "##`##" "##`##", {
+ GO_LEFT, GO_RIGHT, GO_DOWN, 0}, 3, (unsigned) (1 << 8)}, {
+ "##` " "##`##" "```##" "##`##" "##` ", {
+ GO_UP, GO_DOWN, GO_LEFT, 0}, 3, (unsigned) (1 << 9)}, {
+ "##`##" "##`##" "`````" "##`##" "##`##", {
+ GO_UP, GO_DOWN, GO_LEFT, GO_RIGHT}, 4, (unsigned) (1 << 10)}
+};
+
+/* probability array for each of the tiles */
+#define MAXTILEPROB 22
+static const unsigned tileprob[MAXTILEPROB] =
+ { 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10 };
+
+
+static int creatlevelblock (pacmangamestruct *pp,
+ lev_t * level, const unsigned x,
+ const unsigned y);
+
+
+enum
+{ TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT };
+
+/* Sets a block in the level to a certain state. */
+static void
+setblockto (lev_t * level, const unsigned x, const unsigned y, const char c)
+{
+ if (!(x < LEVWIDTH && y < LEVHEIGHT))
+ return;
+ (*level)[y][x] = c;
+}
+
+/* check if a block is set */
+static int
+checkset (lev_t * level, const unsigned x, const unsigned y)
+{
+ if (!(x < LEVWIDTH && y < LEVHEIGHT) ||
+ (*level)[y][x] == BLOCK_WALL || (*level)[y][x] == BLOCK_GHOST_ONLY)
+ return True;
+ return False;
+}
+
+/* Check if a block is not set */
+static int
+checksetout (lev_t * level, const unsigned x, const unsigned y)
+{
+ if (!(x < LEVWIDTH && y < LEVHEIGHT) || checkset (level, x, y) != 0)
+ return True;
+
+ return False;
+}
+
+/* Check if a block cannot be set */
+static int
+checkunsetdef (lev_t * level, const unsigned x, const unsigned y)
+{
+ if (!(x < LEVWIDTH && y < LEVHEIGHT))
+ return False;
+ if ((*level)[y][x] == BLOCK_DOT_1)
+ return True;
+ return False;
+}
+
+/* Initializes a level to empty state. */
+static void
+clearlevel (lev_t * level)
+{
+ unsigned x, y;
+
+ for (y = 0; y < LEVHEIGHT; y++)
+ for (x = 0; x < LEVWIDTH; x++)
+ (*level)[y][x] = BLOCK_EMPTY;
+}
+
+/* Changes a level from the level creation structure ((array to array) to
+ array. */
+static void
+copylevel (char *dest, lev_t * level)
+{
+ unsigned x, y;
+
+ for (y = 0; y < LEVHEIGHT; y++)
+ for (x = 0; x < LEVWIDTH; x++)
+ dest[y * LEVWIDTH + x] = (*level)[y][x];
+}
+
+/* Creates a jail to work around, so we can finish it later. */
+static void
+createjail (lev_t * level, const unsigned width, const unsigned height)
+{
+ unsigned x, y, xstart, xend, ystart, yend;
+
+ if (LEVWIDTH < width || LEVHEIGHT < height)
+ return;
+
+ xstart = LEVWIDTH / 2 - width / 2;
+ xend = LEVWIDTH / 2 + width / 2;
+ ystart = LEVHEIGHT / 2 - height / 2;
+ yend = LEVHEIGHT / 2 + height / 2;
+
+ for (y = ystart - 1; y < yend + 1; y++)
+ for (x = xstart - 1; x < xend + 1; x++)
+ setblockto (level, x, y, BLOCK_DOT_1);
+
+ for (y = ystart; y < yend; y++)
+ for (x = xstart; x < xend; x++)
+ setblockto (level, x, y, BLOCK_WALL);
+}
+
+void
+pacman_get_jail_opening ( int *x, int *y)
+{
+ int xstart = LEVWIDTH / 2 - JAILWIDTH / 2;
+ int ystart = LEVHEIGHT / 2 - JAILHEIGHT / 2;
+ *x = xstart + JAILWIDTH / 2;
+ *y = ystart;
+}
+
+/* Finishes a jail so it is empty and the ghostpass is on top. */
+static void
+finishjail (lev_t * level, const unsigned width, const unsigned height)
+{
+ unsigned x, y, xstart, xend, ystart, yend;
+
+ xstart = LEVWIDTH / 2 - width / 2;
+ xend = LEVWIDTH / 2 + width / 2;
+ ystart = LEVHEIGHT / 2 - height / 2;
+ yend = LEVHEIGHT / 2 + height / 2;
+
+ for (y = ystart + 1; y < yend - 1; y++)
+ for (x = xstart + 1; x < xend - 1; x++)
+ setblockto (level, x, y, BLOCK_EMPTY);
+
+ for (x = xstart - 1; x < xend + 1; x++) {
+ setblockto (level, x, ystart - 1, BLOCK_EMPTY);
+ setblockto (level, x, yend, BLOCK_EMPTY);
+ }
+
+ for (y = ystart - 1; y < yend + 1; y++) {
+ setblockto (level, xstart - 1, y, BLOCK_EMPTY);
+ setblockto (level, xend, y, BLOCK_EMPTY);
+ }
+
+ setblockto (level, xstart + width / 2 - 1, ystart, BLOCK_GHOST_ONLY);
+ setblockto (level, xstart + width / 2, ystart, BLOCK_GHOST_ONLY);
+}
+
+/* Tries to set a block at a certain position. Returns true if possible,
+ and leaves level in new state (plus block), or False if not possible,
+ and leaves level in unpredictable state. */
+static int
+tryset (lev_t * level, const unsigned xpos, const unsigned ypos,
+ const char *block)
+{
+ register unsigned x, y;
+ register char locchar;
+ int xstart, ystart;
+ unsigned xend, yend;
+
+ if ((*level)[ypos][xpos] == BLOCK_DOT_1)
+ return False;
+
+ xstart = xpos - 2;
+ ystart = ypos - 2;
+
+ for (y = 0; y < TILEHEIGHT; y++)
+ for (x = 0; x < TILEWIDTH; x++) {
+ locchar = block[y * TILEWIDTH + x];
+ if (locchar == BLOCK_EMPTY)
+ continue;
+ if (locchar == BLOCK_DOT_1 &&
+ (xstart + x < 1 ||
+ xstart + x >= LEVWIDTH - 1 ||
+ ystart + y < 1 ||
+ ystart + y >= LEVHEIGHT - 1 ||
+ checkset (level, xstart + x, ystart + y) != 0))
+ return False;
+ else if (locchar == BLOCK_WALL &&
+ (xstart + x > 1 &&
+ xstart + x < LEVWIDTH &&
+ ystart + y > 1 &&
+ ystart + y < LEVHEIGHT - 1) &&
+ checkunsetdef (level,
+ (unsigned) (xstart + x),
+ (unsigned) (ystart + y)) != 0)
+ return False;
+ }
+
+ /* and set the block in place */
+
+ xend = (xstart + TILEWIDTH < LEVWIDTH - 1) ?
+ TILEWIDTH : LEVWIDTH - xstart - 2;
+ yend = (ystart + TILEHEIGHT < LEVHEIGHT - 1) ?
+ TILEHEIGHT : LEVHEIGHT - ystart - 2;
+
+ for (y = (ystart < 1) ? (unsigned) (1 - ystart) : 0U; y < yend; y++)
+ for (x = (xstart < 1) ? (unsigned) (1 - xstart) : 0U; x < xend; x++) {
+ locchar = block[y * TILEWIDTH + x];
+ if ((locchar == BLOCK_WALL) &&
+ ((*level)[ystart + y][xstart + x] == BLOCK_EMPTY)) {
+ (*level)[ystart + y][xstart + x] = BLOCK_WALL;
+ (*level)[ystart + y]
+ [LEVWIDTH - (xstart + x + 1)] = BLOCK_WALL;
+ }
+ }
+
+ (*level)[ypos][xpos] = BLOCK_DOT_1;
+ (*level)[ypos][LEVWIDTH - xpos - 1] = BLOCK_DOT_1;
+
+ return True;
+}
+
+/* Tries certain combinations of blocks in the level recursively. */
+static unsigned
+nextstep (pacmangamestruct *pp,
+ lev_t * level, const unsigned x, const unsigned y,
+ unsigned dirvec[], unsigned ndirs)
+{
+ unsigned dirpos, curdir, inc = 0;
+ int ret = 0;
+
+ while (ndirs > 0) {
+ ndirs--;
+ if (ndirs == 0) {
+ curdir = dirvec[0];
+ }
+ else {
+ dirpos = NRAND (ndirs);
+ curdir = dirvec[dirpos];
+ /* nope, no bufoverflow, but ndirs - 1 + 1 */
+ dirvec[dirpos] = dirvec[ndirs];
+ dirvec[ndirs] = curdir;
+ }
+
+ switch (curdir) {
+ case GO_UP:
+ if (y < 1 || (ret = creatlevelblock (pp, level, x, y - 1))
+ == 0)
+ return 0;
+ break;
+ case GO_RIGHT:
+ if (x > LEVWIDTH - 2 || (ret = creatlevelblock (pp, level, x + 1, y))
+ == 0)
+ return 0;
+ break;
+ case GO_DOWN:
+ if (y > LEVHEIGHT - 2 || (ret = creatlevelblock (pp, level, x, y + 1))
+ == 0)
+ return 0;
+ break;
+ case GO_LEFT:
+ if (x < 1 || (ret = creatlevelblock (pp, level, x - 1, y))
+ == 0)
+ return 0;
+ }
+ if (ret != -1)
+ inc += (unsigned) ret;
+ }
+ if (inc == 0)
+ inc = 1;
+ return inc;
+}
+
+static int
+creatlevelblock (pacmangamestruct *pp,
+ lev_t * level, const unsigned x, const unsigned y)
+{
+ unsigned tried = GETNB (TILES_COUNT);
+ unsigned tilenr;
+ unsigned ret;
+ lev_t savedlev;
+
+ if (!pp->tiles) {
+ pp->tiles = (struct tiles *) malloc (sizeof (def_tiles));
+ memcpy (pp->tiles, def_tiles, sizeof (def_tiles));
+ }
+
+ if (!((x < LEVWIDTH) && (y < LEVHEIGHT)))
+ return 0;
+
+ if (checkunsetdef (level, x, y) != 0)
+ return -1;
+
+ if (x == 0)
+ tried &= ~(1 << 0);
+ else if (x == 1)
+ tried &= ~(1 << 4 | 1 << 5 | 1 << 6 | 1 << 8 | 1 << 9 | 1 << 10);
+ else if (x == LEVWIDTH - 1)
+ tried &= ~(1 << 0);
+ else if (x == LEVWIDTH - 2)
+ tried &= ~(1 << 2 | 1 << 3 | 1 << 6 | 1 << 7 | 1 << 8 | 1 << 10);
+
+ if (y == 1)
+ tried &= ~(1 << 2 | 1 << 5 | 1 << 6 | 1 << 7 | 1 << 9 | 1 << 10);
+ else if (y == 0)
+ tried &= ~(1 << 1);
+ else if (y == LEVHEIGHT - 1)
+ tried &= ~(1 << 1);
+ else if (y == LEVHEIGHT - 2)
+ tried &= ~(1 << 3 | 1 << 4 | 1 << 7 | 1 << 8 | 1 << 9 | 1 << 10);
+
+ /* make a copy of the current level, so we can go back on the stack */
+ (void) memcpy (&savedlev, level, sizeof (lev_t));
+
+ /* while there are still some blocks left to try */
+ while (tried != 0x00) {
+ tilenr = tileprob[NRAND (MAXTILEPROB)];
+
+ if (!TESTNB (tried, tilenr))
+ continue;
+
+ if (tryset (level, x, y, pp->tiles[tilenr].block) != 0) {
+ if ((ret = nextstep (pp, level, x, y, pp->tiles[tilenr].dirvec,
+ pp->tiles[tilenr].ndirs)) != 0) {
+ return ret + 1;
+ }
+ (void) memcpy (level, &savedlev, sizeof (lev_t));
+ }
+ tried &= ~(pp->tiles[tilenr].simular_to);
+ }
+ return 0;
+}
+
+/* Fills up all empty space so there is wall everywhere. */
+static void
+filllevel (lev_t * level)
+{
+ unsigned x, y;
+
+ for (y = 0; y < LEVHEIGHT; y++)
+ for (x = 0; x < LEVWIDTH; x++)
+ if ((*level)[y][x] == BLOCK_EMPTY)
+ (*level)[y][x] = BLOCK_WALL;
+}
+
+
+/* Check to see if the x and y value are in the corners.
+ * we could probable compute these values once and avoid
+ * go through the loops every time.
+ */
+static void
+top_left (lev_t * level, unsigned int *passed_x, unsigned int *passed_y)
+{
+ int x, y;
+ for (y = 0; y < LEVHEIGHT; y++)
+ for (x = 0; x < LEVWIDTH; x++) {
+ if (checkset (level, x, y) == 0) {
+ *passed_x = x;
+ *passed_y = y;
+ return;
+ }
+ }
+}
+
+
+static void
+bottom_left (lev_t * level, unsigned int *passed_x, unsigned int *passed_y)
+{
+ int x, y;
+ for (y = LEVHEIGHT; y > -1; y--)
+ for (x = 0; x < LEVWIDTH; x++) {
+ if (checkset (level, x, y) == 0) {
+ *passed_x = x;
+ *passed_y = y;
+ return;
+ }
+ }
+}
+
+static void
+top_right (lev_t * level, unsigned int *passed_x, unsigned int *passed_y)
+{
+ int x, y;
+
+ for (y = 0; y < LEVHEIGHT; y++)
+ for (x = LEVWIDTH; x >= 0; x--) {
+ if (checkset (level, x, y) == 0) {
+ *passed_x = x;
+ *passed_y = y;
+ return;
+ }
+ }
+}
+
+static void
+bottom_right (lev_t * level, unsigned int *passed_x, unsigned int *passed_y)
+{
+ int x, y;
+
+ for (y = LEVHEIGHT; y >= 0; y--)
+ for (x = LEVWIDTH; x >= 0; x--) {
+ if (checkset (level, x, y) == 0) {
+ *passed_x = x;
+ *passed_y = y;
+ return;
+ }
+ }
+}
+
+static void
+init_bonus_dots (pacmangamestruct *pp, lev_t * level)
+{
+ unsigned int x = 0, y = 0;
+ top_left (level, &x, &y);
+ pp->bonus_dots[TOP_LEFT].x = x;
+ pp->bonus_dots[TOP_LEFT].y = y;
+ pp->bonus_dots[TOP_LEFT].eaten = False;
+ top_right (level, &x, &y);
+ pp->bonus_dots[TOP_RIGHT].x = x;
+ pp->bonus_dots[TOP_RIGHT].y = y;
+ pp->bonus_dots[TOP_RIGHT].eaten = False;
+ bottom_left (level, &x, &y);
+ pp->bonus_dots[BOTTOM_LEFT].x = x;
+ pp->bonus_dots[BOTTOM_LEFT].y = y;
+ pp->bonus_dots[BOTTOM_LEFT].eaten = False;
+ bottom_right (level, &x, &y);
+ pp->bonus_dots[BOTTOM_RIGHT].x = x;
+ pp->bonus_dots[BOTTOM_RIGHT].y = y;
+ pp->bonus_dots[BOTTOM_RIGHT].eaten = False;
+}
+
+int
+pacman_is_bonus_dot (pacmangamestruct *pp, int x, int y, int *idx)
+{
+ int ret = False;
+ int i;
+ for (i = 0; i < NUM_BONUS_DOTS; i++) {
+/* fprintf(stderr,"is bonus: passed x (%d, %d) bonus (%d, %d)\n",x,y,bonus_dots[i].x, bonus_dots[i].y); */
+ if (x == pp->bonus_dots[i].x && y == pp->bonus_dots[i].y) {
+ ret = True;
+ *idx = i;
+ break;
+ }
+ }
+ return ret;
+}
+
+static void
+check_bonus_idx (int idx)
+{
+ assert (0 <= idx && idx < NUM_BONUS_DOTS);
+}
+
+int
+pacman_bonus_dot_eaten (pacmangamestruct *pp, int idx)
+{
+ check_bonus_idx (idx);
+ return pp->bonus_dots[idx].eaten;
+}
+
+void
+pacman_eat_bonus_dot (pacmangamestruct *pp, int idx)
+{
+ check_bonus_idx (idx);
+ pp->bonus_dots[idx].eaten = True;
+}
+
+void
+pacman_bonus_dot_pos (pacmangamestruct *pp, int idx, int *x, int *y)
+{
+ check_bonus_idx (idx);
+ *x = pp->bonus_dots[idx].x;
+ *y = pp->bonus_dots[idx].y;
+}
+
+/* Changes a level from a simple wall/nowall to a wall with rounded corners
+ and such. Stupid algorithm, could be done better! */
+static void
+frmtlevel (pacmangamestruct *pp, lev_t * level)
+{
+ lev_t frmtlev;
+ int x, y;
+ int idx;
+ register unsigned poscond;
+ register unsigned poscond2;
+
+ clearlevel (&frmtlev);
+ init_bonus_dots (pp, level);
+ for (y = 0; y < LEVHEIGHT; y++)
+ for (x = 0; x < LEVWIDTH; x++) {
+
+ if (checkset (level, x, y) == 0) {
+ if (pacman_is_bonus_dot (pp, x, y, &idx)) {
+ frmtlev[y][x] = BLOCK_DOT_BONUS;
+ }
+ else {
+ frmtlev[y][x] = BLOCK_DOT_2;
+ }
+ continue;
+ }
+
+ if ((*level)[y][x] == BLOCK_GHOST_ONLY) {
+ frmtlev[y][x] = BLOCK_GHOST_ONLY;
+ continue;
+ }
+
+ poscond =
+ (checksetout (level, x - 1, y - 1) != 0 ?
+ 0x01U : 0U) |
+ (checksetout (level, x + 1, y - 1) != 0 ?
+ 0x02U : 0U) |
+ (checksetout (level, x + 1, y + 1) != 0 ?
+ 0x04U : 0U) |
+ (checksetout (level, x - 1, y + 1) != 0 ? 0x08U : 0U);
+
+ poscond2 =
+ (checksetout (level, x - 1, y) != 0 ?
+ 0x01U : 0) |
+ (checksetout (level, x, y - 1) != 0 ?
+ 0x02U : 0) |
+ (checksetout (level, x + 1, y) != 0 ?
+ 0x04U : 0) |
+ (checksetout (level, x, y + 1) != 0 ? 0x08U : 0);
+
+ switch (poscond) {
+ /* completely filled */
+ case 0x01U | 0x02U | 0x04U | 0x08U:
+ frmtlev[y][x] = BLOCK_EMPTY;
+ continue;
+
+ /* left to top corner */
+ case 0x01U:
+ frmtlev[y][x] = BLOCK_WALL_TL;
+ continue;
+ /* top to right corner */
+ case 0x02U:
+ frmtlev[y][x] = BLOCK_WALL_TR;
+ continue;
+ /* right to bottom corner */
+ case 0x04U:
+ frmtlev[y][x] = BLOCK_WALL_BR;
+ continue;
+ /* bottom to left corner */
+ case 0x08U:
+ frmtlev[y][x] = BLOCK_WALL_BL;
+ continue;
+ }
+
+ switch (poscond2) {
+ case 0x01U | 0x04U:
+ case 0x01U | 0x04U | 0x08U:
+ case 0x01U | 0x04U | 0x02U:
+ frmtlev[y][x] = BLOCK_WALL_HO;
+ continue;
+ case 0x02U | 0x08U:
+ case 0x02U | 0x08U | 0x01U:
+ case 0x02U | 0x08U | 0x04U:
+ frmtlev[y][x] = BLOCK_WALL_VE;
+ continue;
+ case 0x01U | 0x02U:
+ frmtlev[y][x] = BLOCK_WALL_TL;
+ continue;
+ case 0x02U | 0x04U:
+ frmtlev[y][x] = BLOCK_WALL_TR;
+ continue;
+ case 0x04U | 0x08U:
+ frmtlev[y][x] = BLOCK_WALL_BR;
+ continue;
+ case 0x08U | 0x01U:
+ frmtlev[y][x] = BLOCK_WALL_BL;
+ continue;
+ }
+ switch (poscond) {
+ case 0x02U | 0x04U | 0x08U:
+ frmtlev[y][x] = BLOCK_WALL_TL;
+ continue;
+ case 0x01U | 0x04U | 0x08U:
+ frmtlev[y][x] = BLOCK_WALL_TR;
+ continue;
+ case 0x01U | 0x02U | 0x08U:
+ frmtlev[y][x] = BLOCK_WALL_BR;
+ continue;
+ case 0x01U | 0x02U | 0x04U:
+ frmtlev[y][x] = BLOCK_WALL_BL;
+ continue;
+ }
+ frmtlev[y][x] = BLOCK_EMPTY;
+ }
+ (void) memcpy ((lev_t *) level, (lev_t *) & frmtlev, sizeof (lev_t));
+}
+
+/* Counts the number of dots in the level, and returns that number. */
+static unsigned
+countdots (pacmangamestruct *pp)
+{
+ unsigned i, count = 0;
+
+ for (i = 0; i < LEVWIDTH * LEVHEIGHT; i++)
+ if (pp->level[i] == BLOCK_DOT_2 || pp->level[i] == BLOCK_DOT_BONUS)
+ count++;
+
+ return count;
+}
+
+/* Creates a new level, and places that in the pacmangamestruct. */
+int
+pacman_createnewlevel (pacmangamestruct *pp)
+{
+ lev_t *level;
+ unsigned dirvec[1] = { GO_UP };
+ unsigned ret = 0, i = 0;
+
+ if ((level = (lev_t *) calloc (1, sizeof (lev_t))) == NULL)
+ return i;
+
+ if (NRAND (2) == 0) {
+
+ do {
+ clearlevel (level);
+ createjail (level, JAILWIDTH, JAILHEIGHT);
+ if ((ret = nextstep (pp, level, LEVWIDTH / 2 - 1,
+ LEVHEIGHT / 2 - JAILHEIGHT / 2 - 3,
+ dirvec, 1)) == 0) {
+ (void) free ((void *) level);
+ return i;
+ }
+ } while (ret * 100 < (LEVWIDTH * LEVHEIGHT * MINDOTPERC));
+
+ filllevel (level);
+ frmtlevel (pp, level);
+ finishjail (level, JAILWIDTH, JAILHEIGHT);
+ }
+ else {
+ (void) memcpy (level, stdlevel, sizeof (lev_t));
+ frmtlevel (pp, level);
+ i = 1;
+ }
+ copylevel (pp->level, level);
+ pp->dotsleft = countdots (pp);
+
+ (void) free ((void *) level);
+ return i;
+}
+
+/* Checks if a position is allowable for ghosts/pacs to enter. */
+int
+pacman_check_pos (pacmangamestruct * pp, int y, int x, int ghostpass)
+{
+ if ((pp->level[y * LEVWIDTH + x] == BLOCK_DOT_2) ||
+ (pp->level[y * LEVWIDTH + x] == BLOCK_EMPTY) ||
+ (pp->level[y * LEVWIDTH + x] == BLOCK_DOT_BONUS) ||
+ ((pp->level[y * LEVWIDTH + x] == BLOCK_GHOST_ONLY) && ghostpass)) {
+ return 1;
+ }
+ return 0;
+}
+
+/* Checks if there is a dot on the specified position in the level. */
+int
+pacman_check_dot (pacmangamestruct * pp, unsigned int x, unsigned int y)
+{
+ if (x >= LEVWIDTH || y >= LEVHEIGHT)
+ return 0;
+ if (pp->level[y * LEVWIDTH + x] == BLOCK_DOT_2)
+ return 1;
+ return 0;
+}
diff --git a/hacks/pacman_level.h b/hacks/pacman_level.h
new file mode 100644
index 0000000..0eccc33
--- /dev/null
+++ b/hacks/pacman_level.h
@@ -0,0 +1,33 @@
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#ifndef __PACMAN_LEVEL_H__
+#define __PACMAN_LEVEL_H__
+
+/* typedef struct { */
+/* int x, y; */
+/* } XY; */
+
+extern int pacman_createnewlevel (pacmangamestruct *);
+extern int pacman_check_pos (pacmangamestruct *, int y, int x, int ghostpass);
+extern int pacman_check_dot (pacmangamestruct *,
+ unsigned int x, unsigned int y);
+extern int pacman_is_bonus_dot (pacmangamestruct *, int x, int y, int *idx);
+extern int pacman_bonus_dot_eaten (pacmangamestruct *, int idx);
+extern void pacman_eat_bonus_dot (pacmangamestruct *, int idx);
+extern void pacman_bonus_dot_pos (pacmangamestruct *, int idx, int *x, int *y);
+extern void pacman_get_jail_opening (int *x, int *y);
+#endif /* __PACMAN_LEVEL_H__ */
diff --git a/hacks/pedal.c b/hacks/pedal.c
new file mode 100644
index 0000000..87820be
--- /dev/null
+++ b/hacks/pedal.c
@@ -0,0 +1,335 @@
+/*
+ * pedal
+ *
+ * Based on a program for some old PDP-11 Graphics Display Processors
+ * at CMU.
+ *
+ * X version by
+ *
+ * Dale Moore <Dale.Moore@cs.cmu.edu>
+ * 24-Jun-1994
+ *
+ * Copyright (c) 1994, by Carnegie Mellon University. Permission to use,
+ * copy, modify, distribute, and sell this software and its documentation
+ * for any purpose is hereby granted without fee, provided fnord that the
+ * above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation.
+ * No representations are made about the suitability of fnord this software
+ * for any purpose. It is provided "as is" without express or implied
+ * warranty.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include "screenhack.h"
+#include "erase.h"
+
+/* If MAXLINES is too big, we might not be able to get it
+ * to the X server in the 2byte length field. Must be less
+ * than 16k
+ */
+#define MAXLINES (16 * 1024)
+#define MAXPOINTS MAXLINES
+
+/*
+ * If the pedal has only this many lines, it must be ugly and we dont
+ * want to see it.
+ */
+#define MINLINES 7
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ XPoint *points;
+
+ int sizex, sizey;
+ int delay;
+ int maxlines;
+ GC gc;
+ XColor foreground, background;
+ Colormap cmap;
+
+ eraser_state *eraser;
+ int erase_p;
+};
+
+
+/*
+ * Routine (Macro actually)
+ * mysin
+ * Description:
+ * Assume that degrees is .. oh 360... meaning that
+ * there are 360 degress in a circle. Then this function
+ * would return the sin of the angle in degrees. But lets
+ * say that they are really big degrees, with 4 big degrees
+ * the same as one regular degree. Then this routine
+ * would be called mysin(t, 90) and would return sin(t degrees * 4)
+ */
+#define mysin(t, degrees) sin(t * 2 * M_PI / (degrees))
+#define mycos(t, degrees) cos(t * 2 * M_PI / (degrees))
+
+/*
+ * Macro:
+ * rand_range
+ * Description:
+ * Return a random number between a inclusive and b exclusive.
+ * rand (3, 6) returns 3 or 4 or 5, but not 6.
+ */
+#define rand_range(a, b) (a + random() % (b - a))
+
+
+static int
+gcd(int m, int n) /* Greatest Common Divisor (also Greates common factor). */
+{
+ int r;
+
+ for (;;) {
+ r = m % n;
+ if (r == 0) return (n);
+ m = n;
+ n = r;
+ }
+}
+
+static int numlines (int a, int b, int d)
+/*
+ * Description:
+ *
+ * Given parameters a and b, how many lines will we have to draw?
+ *
+ * Algorithm:
+ *
+ * This algorithm assumes that r = sin (theta * a), where we
+ * evaluate theta on multiples of b.
+ *
+ * LCM (i, j) = i * j / GCD (i, j);
+ *
+ * So, at LCM (b, 360) we start over again. But since we
+ * got to LCM (b, 360) by steps of b, the number of lines is
+ * LCM (b, 360) / b.
+ *
+ * If a is odd, then at 180 we cross over and start the
+ * negative. Someone should write up an elegant way of proving
+ * this. Why? Because I'm not convinced of it myself.
+ *
+ */
+{
+#define odd(x) (x & 1)
+#define even(x) (!odd(x))
+ if ( odd(a) && odd(b) && even(d)) d /= 2;
+ return (d / gcd (d, b));
+#undef odd
+}
+
+static int
+compute_pedal(struct state *st, XPoint *points, int maxpoints)
+/*
+ * Description:
+ *
+ * Basically, it's combination spirograph and string art.
+ * Instead of doing lines, we just use a complex polygon,
+ * and use an even/odd rule for filling in between.
+ *
+ * The spirograph, in mathematical terms is a polar
+ * plot of the form r = sin (theta * c);
+ * The string art of this is that we evaluate that
+ * function only on certain multiples of theta. That is
+ * we let theta advance in some random increment. And then
+ * we draw a straight line between those two adjacent points.
+ *
+ * Eventually, the lines will start repeating themselves
+ * if we've evaluated theta on some rational portion of the
+ * whole.
+ *
+ * The number of lines generated is limited to the
+ * ratio of the increment we put on theta to the whole.
+ * If we say that there are 360 degrees in a circle, then we
+ * will never have more than 360 lines.
+ *
+ * Return:
+ *
+ * The number of points.
+ *
+ */
+{
+ int a, b, d; /* These describe a unique pedal */
+
+ double r;
+ int theta = 0;
+ XPoint *pp = st->points;
+ int count;
+ int numpoints;
+
+ /* Just to make sure that this division is not done inside the loop */
+ int h_width = st->sizex / 2, h_height = st->sizey / 2 ;
+
+ for (;;) {
+ d = rand_range (MINLINES, st->maxlines);
+
+ a = rand_range (1, d);
+ b = rand_range (1, d);
+ numpoints = numlines(a, b, d);
+ if (numpoints > MINLINES) break;
+ }
+
+ /* it might be nice to try to move as much sin and cos computing
+ * (or at least the argument computing) out of the loop.
+ */
+ for (count = numpoints; count-- ; )
+ {
+ r = mysin (theta * a, d);
+
+ /* Convert from polar to cartesian coordinates */
+ /* We could round the results, but coercing seems just fine */
+ pp->x = mysin (theta, d) * r * h_width + h_width;
+ pp->y = mycos (theta, d) * r * h_height + h_height;
+
+ /* Advance index into array */
+ pp++;
+
+ /* Advance theta */
+ theta += b;
+ theta %= d;
+ }
+
+ return(numpoints);
+}
+
+static void *
+pedal_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+
+ st->maxlines = get_integer_resource (st->dpy, "maxlines", "Integer");
+ if (st->maxlines < MINLINES) st->maxlines = MINLINES;
+ else if (st->maxlines > MAXLINES) st->maxlines = MAXLINES;
+
+ st->points = (XPoint *)malloc(sizeof(XPoint) * st->maxlines);
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->sizex = xgwa.width;
+ st->sizey = xgwa.height;
+
+ st->cmap = xgwa.colormap;
+
+ gcv.function = GXcopy;
+ gcv.foreground = get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+ gcv.background = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground | GCBackground |GCFunction, &gcv);
+
+ return st;
+}
+
+/*
+ * Since the XFillPolygon doesn't require that the last
+ * point == first point, the number of points is the same
+ * as the number of lines. We just let XFillPolygon supply
+ * the line from the last point to the first point.
+ *
+ */
+static unsigned long
+pedal_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int numpoints;
+ int erase_delay = 10000;
+ int long_delay = 1000000 * st->delay;
+
+ if (st->erase_p || st->eraser) {
+ st->eraser = erase_window (dpy, window, st->eraser);
+ st->erase_p = 0;
+ return (st->eraser ? erase_delay : 1000000);
+ }
+
+ numpoints = compute_pedal(st, st->points, st->maxlines);
+
+ /* Pick a new foreground color (added by jwz) */
+ if (! mono_p)
+ {
+ XColor color;
+ hsv_to_rgb (random()%360, 1.0, 1.0,
+ &color.red, &color.green, &color.blue);
+ if (XAllocColor (st->dpy, st->cmap, &color))
+ {
+ XSetForeground (st->dpy, st->gc, color.pixel);
+ XFreeColors (st->dpy, st->cmap, &st->foreground.pixel, 1, 0);
+ st->foreground.red = color.red;
+ st->foreground.green = color.green;
+ st->foreground.blue = color.blue;
+ st->foreground.pixel = color.pixel;
+ }
+ }
+
+ XFillPolygon (st->dpy, st->window, st->gc, st->points, numpoints,
+ Complex, CoordModeOrigin);
+
+ st->erase_p = 1;
+ return long_delay;
+}
+
+static void
+pedal_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->sizex = w;
+ st->sizey = h;
+}
+
+static Bool
+pedal_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->erase_p = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+pedal_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+
+/*
+ * If we are trying to save the screen, the background
+ * should be dark.
+ */
+static const char *pedal_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 5",
+ "*maxlines: 1000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec pedal_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-maxlines", ".maxlines", XrmoptionSepArg, 0 },
+ { "-foreground", ".foreground", XrmoptionSepArg, 0 },
+ { "-background", ".background", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Pedal", pedal)
diff --git a/hacks/pedal.man b/hacks/pedal.man
new file mode 100644
index 0000000..79d0d0c
--- /dev/null
+++ b/hacks/pedal.man
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "24-Jun-94" "X Version 11"
+.SH NAME
+pedal - pretty geometric picture program
+.SH SYNOPSIS
+.B pedal
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIseconds\fP] [-maxlines \fInumber\fP] [-mono] [\-install] [\-visual \fIvisual\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIpedal\fP program displays pretty geometric pictures.
+.SH OPTIONS
+.I pedal
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-foreground \fIcolor\fP
+The color for the foreground. Default is white.
+.TP 8
+.B \-background \fIcolor\fP
+The color for the background. Default is black.
+.TP 8
+.B \-delay \fIseconds\fP
+The number of seconds to pause between each picture.
+.TP 8
+.B \-maxlines \fInumber\fP
+The maximum number of lines in the drawing. Good values are
+between 20 and 2000. Maximum value is 16K.
+.PP
+To make your X server grunt under load, and to impress your
+friends, try \fIpedal -mono -delay 0 -maxlines 100\fp.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1994, by Carnegie Mellon University. Permission to use,
+copy, modify, distribute, and sell this software and its documentation
+for any purpose is hereby granted without fee, provided fnord that the
+above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of fnord this software
+for any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Dale Moore <Dale.Moore@cs.cmu.edu>, 24-Jun-1994.
diff --git a/hacks/penetrate.c b/hacks/penetrate.c
new file mode 100644
index 0000000..9148827
--- /dev/null
+++ b/hacks/penetrate.c
@@ -0,0 +1,977 @@
+/* Copyright (c) 1999 Adam Miller adum@aya.yale.edu
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+
+ * penetrate simulates the arcade classic with the cities and the stuff
+ * shooting down from the sky and stuff. The computer plays against itself,
+ * desperately defending the forces of good against those thingies raining
+ * down. Bonus cities are awarded at ever-increasing intervals. Every five
+ * levels appears a bonus round. The computer player gets progressively
+ * more intelligent as the game progresses. Better aim, more economical with
+ * ammo, and better target selection. Points are in the bottom right, and
+ * high score is in the bottom left. Start with -smart to have the computer
+ * player skip the learning process.
+
+ Version: 0.2
+ -- fixed an AI bug that was keeping the computer player a tad weak
+ Version: 0.1
+ -- first release
+
+ */
+
+#include "screenhack.h"
+
+#define kSleepTime 10000
+
+#define font_height(font) (font->ascent + font->descent)
+
+#define kCityPause 500000
+#define kLevelPause 1
+#define SCORE_MISSILE 100
+#define kFirstBonus 5000
+#define kMinRate 30
+#define kMaxRadius 100
+
+typedef struct {
+ int alive;
+ int x, y;
+ int startx, starty;
+ int endx, endy;
+ int dcity;
+ float pos;
+ int enemies;
+ int jenis;
+ int splits;
+ XColor color;
+} Missile;
+
+typedef struct {
+ int alive;
+ int x, y, rad, oflaser;
+ int max, outgoing;
+ XColor color;
+} Boom;
+
+typedef struct {
+ int alive;
+ int x;
+ XColor color;
+} City;
+
+typedef struct {
+ int alive;
+ int x, y;
+ int startx, starty;
+ int endx, endy;
+ int oldx, oldy;
+ int oldx2, oldy2;
+ float velx, vely, fposx, fposy;
+ float lenMul;
+ XColor color;
+ int target;
+} Laser;
+
+#define kMaxMissiles 256
+#define kMaxBooms 512
+#define kMaxLasers 128
+#define kBoomRad 40
+#define kNumCities 5
+
+#define kLaserLength 12
+
+#define kMissileSpeed 0.003
+#define kLaserSpeed (kMissileSpeed * 6)
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ XFontStruct *font, *scoreFont;
+ GC draw_gc, erase_gc, level_gc;
+ unsigned int default_fg_pixel;
+ XColor scoreColor;
+
+ int bgrowth;
+ int lrate, startlrate;
+ long loop;
+ long score, highscore;
+ long nextBonus;
+ int numBonus;
+ int bround;
+ long lastLaser;
+ int gamez;
+ int aim;
+ int econpersen;
+ int choosypersen;
+ int carefulpersen;
+ int smart;
+ Colormap cmap;
+
+ Missile missile[kMaxMissiles];
+ Boom boom[kMaxBooms];
+ City city[kNumCities];
+ Laser laser[kMaxLasers];
+ int blive[kNumCities];
+
+ int level, levMissiles, levFreq;
+
+ int draw_xlim, draw_ylim;
+ int draw_reset;
+};
+
+
+static void Explode(struct state *st, int x, int y, int max, XColor color, int oflaser)
+{
+ int i;
+ Boom *m = 0;
+ for (i=0;i<kMaxBooms;i++)
+ if (!st->boom[i].alive) {
+ m = &st->boom[i];
+ break;
+ }
+ if (!m)
+ return;
+
+ m->alive = 1;
+ m->x = x;
+ m->y = y;
+ m->rad = 0;
+ if (max > kMaxRadius)
+ max = kMaxRadius;
+ m->max = max;
+ m->outgoing = 1;
+ m->color = color;
+ m->oflaser = oflaser;
+}
+
+static void launch (struct state *st, int xlim, int ylim, int src)
+{
+ int i;
+ Missile *m = 0, *msrc;
+ for (i=0;i<kMaxMissiles;i++)
+ if (!st->missile[i].alive) {
+ m = &st->missile[i];
+ break;
+ }
+ if (!m)
+ return;
+
+ m->alive = 1;
+ m->startx = (random() % xlim);
+ m->starty = 0;
+ m->endy = ylim;
+ m->pos = 0.0;
+ m->jenis = random() % 360;
+ m->splits = 0;
+ if (m->jenis < 50) {
+ int j = ylim * 0.4;
+ if (j) {
+ m->splits = random() % j;
+ if (m->splits < ylim * 0.08)
+ m->splits = 0;
+ }
+ }
+
+ /* special if we're from another missile */
+ if (src >= 0) {
+ int dc = random() % (kNumCities - 1);
+ msrc = &st->missile[src];
+ if (dc == msrc->dcity)
+ dc++;
+ m->dcity = dc;
+ m->startx = msrc->x;
+ m->starty = msrc->y;
+ if (m->starty > ylim * 0.4 || m->splits <= m->starty)
+ m->splits = 0; /* too far down already */
+ m->jenis = msrc->jenis;
+ }
+ else
+ m->dcity = random() % kNumCities;
+ m->endx = st->city[m->dcity].x + (random() % 20) - 10;
+ m->x = m->startx;
+ m->y = m->starty;
+ m->enemies = 0;
+
+ if (!mono_p) {
+ hsv_to_rgb (m->jenis, 1.0, 1.0,
+ &m->color.red, &m->color.green, &m->color.blue);
+ m->color.flags = DoRed | DoGreen | DoBlue;
+ if (!XAllocColor (st->dpy, st->cmap, &m->color)) {
+ m->color.pixel = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ m->color.red = m->color.green = m->color.blue = 0xFFFF;
+ }
+ }
+}
+
+#define kExpHelp 0.2
+#define kSpeedDiff 3.5
+#define kMaxToGround 0.75
+static int fire(struct state *st, int xlim, int ylim)
+{
+ int i, j, cnt = 0;
+ int dcity;
+ long dx, dy, ex, ey;
+ Missile *mis = 0;
+ Laser *m = 0;
+ int untargeted = 0;
+ int choosy = 0, economic = 0, careful = 0;
+ int suitor[kMaxMissiles];
+ int livecity = 0;
+ int ytargetmin = ylim * 0.75;
+ int deepest = 0;
+ int misnum = 0;
+
+ choosy = (random() % 100) < st->choosypersen;
+ economic = (random() % 100) < st->econpersen;
+ careful = (random() % 100) < st->carefulpersen;
+
+ /* count our cities */
+ for (i=0;i<kNumCities;i++)
+ livecity += st->city[i].alive;
+ if (livecity == 0)
+ return 1; /* no guns */
+
+ for (i=0;i<kMaxLasers;i++)
+ if (!st->laser[i].alive) {
+ m = &st->laser[i];
+ break;
+ }
+ if (!m)
+ return 1;
+
+ /* if no missiles on target, no need to be choosy */
+ if (choosy) {
+ int choo = 0;
+ for (j=0;j<kMaxMissiles;j++) {
+ mis = &st->missile[j];
+ if (!mis->alive || (mis->y > ytargetmin))
+ continue;
+ if (st->city[mis->dcity].alive)
+ choo++;
+ }
+ if (choo == 0)
+ choosy = 0;
+ }
+
+ for (j=0;j<kMaxMissiles;j++) {
+ mis = &st->missile[j];
+ suitor[j] = 0;
+ if (!mis->alive || (mis->y > ytargetmin))
+ continue;
+ if (choosy && (st->city[mis->dcity].alive == 0))
+ continue;
+ ey = mis->starty + ((float) (mis->endy - mis->starty)) * (mis->pos + kExpHelp + (1.0 - mis->pos) / kSpeedDiff);
+ if (ey > ylim * kMaxToGround)
+ continue; /* too far down */
+ cnt++;
+ suitor[j] = 1;
+ }
+
+ /* count missiles that are on target and not being targeted */
+ if (choosy && economic)
+ for (j=0;j<kMaxMissiles;j++)
+ if (suitor[j] && st->missile[j].enemies == 0)
+ untargeted++;
+
+ if (economic)
+ for (j=0;j<kMaxMissiles;j++) {
+ if (suitor[j] && cnt > 1)
+ if (st->missile[j].enemies > 0)
+ if (st->missile[j].enemies > 1 || untargeted == 0) {
+ suitor[j] = 0;
+ cnt--;
+ }
+ /* who's closest? biggest threat */
+ if (suitor[j] && st->missile[j].y > deepest)
+ deepest = st->missile[j].y;
+ }
+
+ if (deepest > 0 && careful) {
+ /* only target deepest missile */
+ cnt = 1;
+ for (j=0;j<kMaxMissiles;j++)
+ if (suitor[j] && st->missile[j].y != deepest)
+ suitor[j] = 0;
+ }
+
+ if (cnt == 0)
+ return 1; /* no targets available */
+ cnt = random() % cnt;
+ for (j=0;j<kMaxMissiles;j++)
+ if (suitor[j])
+ if (cnt-- == 0) {
+ mis = &st->missile[j];
+ misnum = j;
+ break;
+ }
+
+ if (mis == 0)
+ return 1; /* shouldn't happen */
+
+ dcity = random() % livecity;
+ for (j=0;j<kNumCities;j++)
+ if (st->city[j].alive)
+ if (dcity-- == 0) {
+ dcity = j;
+ break;
+ }
+ m->startx = st->city[dcity].x;
+ m->starty = ylim;
+ ex = mis->startx + ((float) (mis->endx - mis->startx)) * (mis->pos + kExpHelp + (1.0 - mis->pos) / kSpeedDiff);
+ ey = mis->starty + ((float) (mis->endy - mis->starty)) * (mis->pos + kExpHelp + (1.0 - mis->pos) / kSpeedDiff);
+ m->endx = ex + random() % 16 - 8 + (random() % st->aim) - st->aim / 2;
+ m->endy = ey + random() % 16 - 8 + (random() % st->aim) - st->aim / 2;
+ if (ey > ylim * kMaxToGround)
+ return 0; /* too far down */
+ mis->enemies++;
+ m->target = misnum;
+ m->x = m->startx;
+ m->y = m->starty;
+ m->oldx = -1;
+ m->oldy = -1;
+ m->oldx2 = -1;
+ m->oldy2 = -1;
+ m->fposx = m->x;
+ m->fposy = m->y;
+ dx = (m->endx - m->x);
+ dy = (m->endy - m->y);
+ m->velx = dx / 100.0;
+ m->vely = dy / 100.0;
+ m->alive = 1;
+ /* m->lenMul = (kLaserLength * kLaserLength) / (m->velx * m->velx + m->vely * m->vely); */
+ m->lenMul = -(kLaserLength / m->vely);
+
+ if (!mono_p) {
+ m->color.blue = 0x0000;
+ m->color.green = 0xFFFF;
+ m->color.red = 0xFFFF;
+ m->color.flags = DoRed | DoGreen | DoBlue;
+ if (!XAllocColor (st->dpy, st->cmap, &m->color)) {
+ m->color.pixel = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ m->color.red = m->color.green = m->color.blue = 0xFFFF;
+ }
+ }
+ return 1;
+}
+
+static void *
+penetrate_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ const char *levelfont = "-*-courier-*-r-*-*-*-380-*-*-*-*-*-*";
+ const char *scorefont = "-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*";
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->cmap = xgwa.colormap;
+
+ st->lrate = 80;
+ st->nextBonus = kFirstBonus;
+ st->aim = 180;
+
+ st->smart = get_boolean_resource(st->dpy, "smart","Boolean");
+ st->bgrowth = get_integer_resource (st->dpy, "bgrowth", "Integer");
+ st->lrate = get_integer_resource (st->dpy, "lrate", "Integer");
+ if (st->bgrowth < 0) st->bgrowth = 2;
+ if (st->lrate < 0) st->lrate = 2;
+ st->startlrate = st->lrate;
+
+ st->font = load_font_retry(st->dpy, levelfont);
+ if (!st->font) abort();
+
+ st->scoreFont = load_font_retry(st->dpy, scorefont);
+ if (!st->scoreFont) abort();
+
+ for (i = 0; i < kMaxMissiles; i++)
+ st->missile[i].alive = 0;
+
+ for (i = 0; i < kMaxLasers; i++)
+ st->laser[i].alive = 0;
+
+ for (i = 0; i < kMaxBooms; i++)
+ st->boom[i].alive = 0;
+
+ for (i = 0; i < kNumCities; i++) {
+ City *m = &st->city[i];
+ m->alive = 1;
+ m->color.red = m->color.green = m->color.blue = 0xFFFF;
+ m->color.blue = 0x1111; m->color.green = 0x8888;
+ m->color.flags = DoRed | DoGreen | DoBlue;
+ if (!XAllocColor (st->dpy, st->cmap, &m->color)) {
+ m->color.pixel = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ m->color.red = m->color.green = m->color.blue = 0xFFFF;
+ }
+ }
+
+ gcv.foreground = st->default_fg_pixel =
+ get_pixel_resource(st->dpy, st->cmap, "foreground", "Foreground");
+ gcv.font = st->scoreFont->fid;
+ st->draw_gc = XCreateGC(st->dpy, st->window, GCForeground | GCFont, &gcv);
+ gcv.font = st->font->fid;
+ st->level_gc = XCreateGC(st->dpy, st->window, GCForeground | GCFont, &gcv);
+ XSetForeground (st->dpy, st->level_gc, st->city[0].color.pixel);
+ gcv.foreground = get_pixel_resource(st->dpy, st->cmap, "background", "Background");
+ st->erase_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (st->dpy, st->erase_gc, False);
+ jwxyz_XSetAntiAliasing (st->dpy, st->draw_gc, False);
+# endif
+
+
+ /* make a gray color for score */
+ if (!mono_p) {
+ st->scoreColor.red = st->scoreColor.green = st->scoreColor.blue = 0xAAAA;
+ st->scoreColor.flags = DoRed | DoGreen | DoBlue;
+ if (!XAllocColor (st->dpy, st->cmap, &st->scoreColor)) {
+ st->scoreColor.pixel = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ st->scoreColor.red = st->scoreColor.green = st->scoreColor.blue = 0xFFFF;
+ }
+ }
+
+ XClearWindow(st->dpy, st->window);
+ return st;
+}
+
+static void DrawScore(struct state *st, int xlim, int ylim)
+{
+ char buf[16];
+ int width, height;
+ sprintf(buf, "%ld", st->score);
+ width = XTextWidth(st->scoreFont, buf, strlen(buf));
+ height = font_height(st->scoreFont);
+ XSetForeground (st->dpy, st->draw_gc, st->scoreColor.pixel);
+ XFillRectangle(st->dpy, st->window, st->erase_gc,
+ xlim - width - 6, ylim - height - 2, width + 6, height + 2);
+ XDrawString(st->dpy, st->window, st->draw_gc, xlim - width - 2, ylim - 2,
+ buf, strlen(buf));
+
+ sprintf(buf, "%ld", st->highscore);
+ width = XTextWidth(st->scoreFont, buf, strlen(buf));
+ XFillRectangle(st->dpy, st->window, st->erase_gc,
+ 4, ylim - height - 2, width + 4, height + 2);
+ XDrawString(st->dpy, st->window, st->draw_gc, 4, ylim - 2,
+ buf, strlen(buf));
+}
+
+static void AddScore(struct state *st, int xlim, int ylim, long dif)
+{
+ int i, sumlive = 0;
+ for (i=0;i<kNumCities;i++)
+ sumlive += st->city[i].alive;
+ if (sumlive == 0)
+ return; /* no cities, not possible to score */
+
+ st->score += dif;
+ if (st->score > st->highscore)
+ st->highscore = st->score;
+ DrawScore(st, xlim, ylim);
+}
+
+static void DrawCity(struct state *st, int x, int y, XColor col)
+{
+ XSetForeground (st->dpy, st->draw_gc, col.pixel);
+ XFillRectangle(st->dpy, st->window, st->draw_gc,
+ x - 30, y - 40, 60, 40);
+ XFillRectangle(st->dpy, st->window, st->draw_gc,
+ x - 20, y - 50, 10, 10);
+ XFillRectangle(st->dpy, st->window, st->draw_gc,
+ x + 10, y - 50, 10, 10);
+}
+
+static void DrawCities(struct state *st, int xlim, int ylim)
+{
+ int i, x;
+ for (i = 0; i < kNumCities; i++) {
+ City *m = &st->city[i];
+ if (!m->alive)
+ continue;
+ x = (i + 1) * (xlim / (kNumCities + 1));
+ m->x = x;
+
+ DrawCity(st, x, ylim, m->color);
+ }
+}
+
+static void LoopMissiles(struct state *st, int xlim, int ylim)
+{
+ int i, j, max = 0;
+ for (i = 0; i < kMaxMissiles; i++) {
+ int old_x, old_y;
+ Missile *m = &st->missile[i];
+ if (!m->alive)
+ continue;
+ old_x = m->x;
+ old_y = m->y;
+ m->pos += kMissileSpeed;
+ m->x = m->startx + ((float) (m->endx - m->startx)) * m->pos;
+ m->y = m->starty + ((float) (m->endy - m->starty)) * m->pos;
+
+ /* erase old one */
+
+ XSetLineAttributes(st->dpy, st->draw_gc, 4, 0,0,0);
+ XSetForeground (st->dpy, st->draw_gc, m->color.pixel);
+ XDrawLine(st->dpy, st->window, st->draw_gc,
+ old_x, old_y, m->x, m->y);
+
+ /* maybe split off a new missile? */
+ if (m->splits && (m->y > m->splits)) {
+ m->splits = 0;
+ launch(st, xlim, ylim, i);
+ }
+
+ if (m->y >= ylim) {
+ m->alive = 0;
+ if (st->city[m->dcity].alive) {
+ st->city[m->dcity].alive = 0;
+ Explode(st, m->x, m->y, kBoomRad * 2, m->color, 0);
+ }
+ }
+
+ /* check hitting explosions */
+ for (j=0;j<kMaxBooms;j++) {
+ Boom *b = &st->boom[j];
+ if (!b->alive)
+ continue;
+ else {
+ int dx = abs(m->x - b->x);
+ int dy = abs(m->y - b->y);
+ int r = b->rad + 2;
+ if ((dx < r) && (dy < r))
+ if (dx * dx + dy * dy < r * r) {
+ m->alive = 0;
+ max = b->max + st->bgrowth - kBoomRad;
+ AddScore(st, xlim, ylim, SCORE_MISSILE);
+ }
+ }
+ }
+
+ if (m->alive == 0) {
+ float my_pos;
+ /* we just died */
+ Explode(st, m->x, m->y, kBoomRad + max, m->color, 0);
+ XSetLineAttributes(st->dpy, st->erase_gc, 4, 0,0,0);
+ /* In a perfect world, we could simply erase a line from
+ (m->startx, m->starty) to (m->x, m->y). This is not a
+ perfect world. */
+ old_x = m->startx;
+ old_y = m->starty;
+ my_pos = kMissileSpeed;
+ while (my_pos <= m->pos) {
+ m->x = m->startx + ((float) (m->endx - m->startx)) * my_pos;
+ m->y = m->starty + ((float) (m->endy - m->starty)) * my_pos;
+ XDrawLine(st->dpy, st->window, st->erase_gc, old_x, old_y, m->x, m->y);
+ old_x = m->x;
+ old_y = m->y;
+ my_pos += kMissileSpeed;
+ }
+ }
+ }
+}
+
+static void LoopLasers(struct state *st, int xlim, int ylim)
+{
+ int i, j, miny = ylim * 0.8;
+ int x, y;
+ for (i = 0; i < kMaxLasers; i++) {
+ Laser *m = &st->laser[i];
+ if (!m->alive)
+ continue;
+
+ if (m->oldx != -1) {
+ XSetLineAttributes(st->dpy, st->erase_gc, 2, 0,0,0);
+ XDrawLine(st->dpy, st->window, st->erase_gc,
+ m->oldx2, m->oldy2, m->oldx, m->oldy);
+ }
+
+ m->fposx += m->velx;
+ m->fposy += m->vely;
+ m->x = m->fposx;
+ m->y = m->fposy;
+
+ x = m->fposx + (-m->velx * m->lenMul);
+ y = m->fposy + (-m->vely * m->lenMul);
+
+ m->oldx = x;
+ m->oldy = y;
+
+ XSetLineAttributes(st->dpy, st->draw_gc, 2, 0,0,0);
+ XSetForeground (st->dpy, st->draw_gc, m->color.pixel);
+ XDrawLine(st->dpy, st->window, st->draw_gc,
+ m->x, m->y, x, y);
+
+ m->oldx2 = m->x;
+ m->oldy2 = m->y;
+ m->oldx = x;
+ m->oldy = y;
+
+ if (m->y < m->endy) {
+ m->alive = 0;
+ }
+
+ /* check hitting explosions */
+ if (m->y < miny)
+ for (j=0;j<kMaxBooms;j++) {
+ Boom *b = &st->boom[j];
+ if (!b->alive)
+ continue;
+ else {
+ int dx = abs(m->x - b->x);
+ int dy = abs(m->y - b->y);
+ int r = b->rad + 2;
+ if (b->oflaser)
+ continue;
+ if ((dx < r) && (dy < r))
+ if (dx * dx + dy * dy < r * r) {
+ m->alive = 0;
+ /* one less enemy on this missile -- it probably didn't make it */
+ if (st->missile[m->target].alive)
+ st->missile[m->target].enemies--;
+ }
+ }
+ }
+
+ if (m->alive == 0) {
+ /* we just died */
+ XDrawLine(st->dpy, st->window, st->erase_gc,
+ m->x, m->y, x, y);
+ Explode(st, m->x, m->y, kBoomRad, m->color, 1);
+ }
+ }
+}
+
+static void LoopBooms(struct state *st, int xlim, int ylim)
+{
+ int i;
+ for (i = 0; i < kMaxBooms; i++) {
+ Boom *m = &st->boom[i];
+ if (!m->alive)
+ continue;
+
+ if (st->loop & 1) {
+ if (m->outgoing) {
+ m->rad++;
+ if (m->rad >= m->max)
+ m->outgoing = 0;
+ XSetLineAttributes(st->dpy, st->draw_gc, 1, 0,0,0);
+ XSetForeground (st->dpy, st->draw_gc, m->color.pixel);
+ XDrawArc(st->dpy, st->window, st->draw_gc, m->x - m->rad, m->y - m->rad, m->rad * 2, m->rad * 2, 0, 360 * 64);
+ }
+ else {
+ XSetLineAttributes(st->dpy, st->erase_gc, 1, 0,0,0);
+ XDrawArc(st->dpy, st->window, st->erase_gc, m->x - m->rad, m->y - m->rad, m->rad * 2, m->rad * 2, 0, 360 * 64);
+ m->rad--;
+ if (m->rad <= 0)
+ m->alive = 0;
+ }
+ }
+ }
+}
+
+
+/* after they die, let's change a few things */
+static void Improve(struct state *st)
+{
+ if (st->smart)
+ return;
+ if (st->level > 20)
+ return; /* no need, really */
+ st->aim -= 4;
+ if (st->level <= 2) st->aim -= 8;
+ if (st->level <= 5) st->aim -= 6;
+ if (st->gamez < 3)
+ st->aim -= 10;
+ st->carefulpersen += 6;
+ st->choosypersen += 4;
+ if (st->level <= 5) st->choosypersen += 3;
+ st->econpersen += 4;
+ st->lrate -= 2;
+ if (st->startlrate < kMinRate) {
+ if (st->lrate < st->startlrate)
+ st->lrate = st->startlrate;
+ }
+ else {
+ if (st->lrate < kMinRate)
+ st->lrate = kMinRate;
+ }
+ if (st->level <= 5) st->econpersen += 3;
+ if (st->aim < 1) st->aim = 1;
+ if (st->choosypersen > 100) st->choosypersen = 100;
+ if (st->carefulpersen > 100) st->carefulpersen = 100;
+ if (st->econpersen > 100) st->econpersen = 100;
+}
+
+static void NewLevel(struct state *st, int xlim, int ylim)
+{
+ char buf[32];
+ int width, i, sumlive = 0;
+ int liv[kNumCities];
+ int freecity = 0;
+
+ if (st->level == 0) {
+ st->level++;
+ goto END_LEVEL;
+ }
+
+ /* check for a free city */
+ if (st->score >= st->nextBonus) {
+ st->numBonus++;
+ st->nextBonus += kFirstBonus * st->numBonus;
+ freecity = 1;
+ }
+
+ for (i=0;i<kNumCities;i++) {
+ if (st->bround)
+ st->city[i].alive = st->blive[i];
+ liv[i] = st->city[i].alive;
+ sumlive += liv[i];
+ if (!st->bround)
+ st->city[i].alive = 0;
+ }
+
+ /* print out screen */
+ XFillRectangle(st->dpy, st->window, st->erase_gc,
+ 0, 0, xlim, ylim);
+ if (st->bround)
+ sprintf(buf, "Bonus Round Over");
+ else {
+ if (sumlive || freecity)
+ sprintf(buf, "Level %d Cleared", st->level);
+ else
+ sprintf(buf, "GAME OVER");
+ }
+ if (st->level > 0) {
+ width = XTextWidth(st->font, buf, strlen(buf));
+ XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - width / 2, ylim / 2 - font_height(st->font) / 2,
+ buf, strlen(buf));
+ XSync(st->dpy, False);
+ usleep(1000000);
+ }
+
+ if (!st->bround) {
+ if (sumlive || freecity) {
+ int sumwidth;
+ /* draw live cities */
+ XFillRectangle(st->dpy, st->window, st->erase_gc,
+ 0, ylim - 100, xlim, 100);
+
+ sprintf(buf, "X %ld", st->level * 100L);
+ /* how much they get */
+ sumwidth = XTextWidth(st->font, buf, strlen(buf));
+ /* add width of city */
+ sumwidth += 60;
+ /* add spacer */
+ sumwidth += 40;
+ DrawCity(st, xlim / 2 - sumwidth / 2 + 30, ylim * 0.70, st->city[0].color);
+ XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - sumwidth / 2 + 40 + 60, ylim * 0.7, buf, strlen(buf));
+ for (i=0;i<kNumCities;i++) {
+ if (liv[i]) {
+ st->city[i].alive = 1;
+ AddScore(st, xlim, ylim, 100 * st->level);
+ DrawCities(st, xlim, ylim);
+ XSync(st->dpy, False);
+ usleep(kCityPause);
+ }
+ }
+ }
+ else {
+ /* we're dead */
+ usleep(3000000);
+
+ /* start new */
+ st->gamez++;
+ Improve(st);
+ for (i=0;i<kNumCities;i++)
+ st->city[i].alive = 1;
+ st->level = 0;
+ st->loop = 1;
+ st->score = 0;
+ st->nextBonus = kFirstBonus;
+ st->numBonus = 0;
+ DrawCities(st, xlim, ylim);
+ }
+ }
+
+ /* do free city part */
+ if (freecity && sumlive < 5) {
+ int ncnt = random() % (5 - sumlive) + 1;
+ for (i=0;i<kNumCities;i++)
+ if (!st->city[i].alive)
+ if (!--ncnt)
+ st->city[i].alive = 1;
+ strcpy(buf, "Bonus City");
+ width = XTextWidth(st->font, buf, strlen(buf));
+ XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - width / 2, ylim / 4, buf, strlen(buf));
+ DrawCities(st, xlim, ylim);
+ XSync(st->dpy, False);
+ usleep(1000000);
+ }
+
+ XFillRectangle(st->dpy, st->window, st->erase_gc,
+ 0, 0, xlim, ylim - 100);
+
+ if (!st->bround)
+ st->level++;
+ if (st->level == 1) {
+ st->nextBonus = kFirstBonus;
+ }
+
+ if (st->level > 3 && (st->level % 5 == 1)) {
+ if (st->bround) {
+ st->bround = 0;
+ DrawCities(st, xlim, ylim);
+ }
+ else {
+ /* bonus round */
+ st->bround = 1;
+ st->levMissiles = 20 + st->level * 10;
+ st->levFreq = 10;
+ for (i=0;i<kNumCities;i++)
+ st->blive[i] = st->city[i].alive;
+ sprintf(buf, "Bonus Round");
+ width = XTextWidth(st->font, buf, strlen(buf));
+ XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - width / 2, ylim / 2 - font_height(st->font) / 2, buf, strlen(buf));
+ XSync(st->dpy, False);
+ usleep(1000000);
+ XFillRectangle(st->dpy, st->window, st->erase_gc,
+ 0, 0, xlim, ylim - 100);
+ }
+ }
+
+ END_LEVEL: ;
+
+ if (!st->bround) {
+ st->levMissiles = 5 + st->level * 3;
+ if (st->level > 5)
+ st->levMissiles += st->level * 5;
+ /* levMissiles = 2; */
+ st->levFreq = 120 - st->level * 5;
+ if (st->levFreq < 30)
+ st->levFreq = 30;
+ }
+
+ /* ready to fire */
+ st->lastLaser = 0;
+}
+
+
+static unsigned long
+penetrate_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes xgwa;
+
+ if (st->draw_reset)
+ {
+ st->draw_reset = 0;
+ DrawCities(st, st->draw_xlim, st->draw_ylim);
+ }
+
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->draw_xlim = xgwa.width;
+ st->draw_ylim = xgwa.height;
+
+ /* see if just started */
+ if (st->loop == 0) {
+ if (st->smart) {
+ st->choosypersen = st->econpersen = st->carefulpersen = 100;
+ st->lrate = kMinRate; st->aim = 1;
+ }
+ NewLevel(st, st->draw_xlim, st->draw_ylim);
+ DrawScore(st, st->draw_xlim, st->draw_ylim);
+ }
+
+ st->loop++;
+
+ if (st->levMissiles == 0) {
+ /* see if anything's still on the screen, to know when to end level */
+ int i;
+ for (i=0;i<kMaxMissiles;i++)
+ if (st->missile[i].alive)
+ goto END_CHECK;
+ for (i=0;i<kMaxBooms;i++)
+ if (st->boom[i].alive)
+ goto END_CHECK;
+ for (i=0;i<kMaxLasers;i++)
+ if (st->laser[i].alive)
+ goto END_CHECK;
+ /* okay, nothing's alive, start end of level countdown */
+ usleep(kLevelPause*1000000);
+ NewLevel(st, st->draw_xlim, st->draw_ylim);
+ goto END;
+ END_CHECK: ;
+ }
+ else if ((random() % st->levFreq) == 0) {
+ launch(st, st->draw_xlim, st->draw_ylim, -1);
+ st->levMissiles--;
+ }
+
+ if (st->loop - st->lastLaser >= st->lrate) {
+ if (fire(st, st->draw_xlim, st->draw_ylim))
+ st->lastLaser = st->loop;
+ }
+
+ if ((st->loop & 7) == 0)
+ st->draw_reset = 1;
+
+ LoopMissiles(st, st->draw_xlim, st->draw_ylim);
+ LoopLasers(st, st->draw_xlim, st->draw_ylim);
+ LoopBooms(st, st->draw_xlim, st->draw_ylim);
+
+ END:
+ return kSleepTime;
+}
+
+static void
+penetrate_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ XClearWindow (dpy, window);
+}
+
+static Bool
+penetrate_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+penetrate_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *penetrate_defaults [] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsTop: true",
+ "*fpsSolid: true",
+ "*bgrowth: 5",
+ "*lrate: 80",
+ "*smart: False",
+ 0
+};
+
+static XrmOptionDescRec penetrate_options [] = {
+ { "-bgrowth", ".bgrowth", XrmoptionSepArg, 0 },
+ { "-lrate", ".lrate", XrmoptionSepArg, 0 },
+ {"-smart", ".smart", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Penetrate", penetrate)
diff --git a/hacks/penetrate.man b/hacks/penetrate.man
new file mode 100644
index 0000000..15e8d01
--- /dev/null
+++ b/hacks/penetrate.man
@@ -0,0 +1,98 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "18-Jun-01" "X Version 11"
+.SH NAME
+penetrate - simulates a classic arcade shooting game
+.SH SYNOPSIS
+.B penetrate
+[\-display \fIhost:display.screen\fP] [\-root] [\-window]
+[\-install] [\-noinstall] [\-visual \fIvisual\fP]
+[\-bgrowth \fImicroseconds\fP] [\-lrate \fInumber\fP] [\-smart \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+.PP
+\fIPenetrate\fP simulates the arcade classic with the cities and the stuff
+shooting down from the sky and stuff. The computer plays against itself,
+desperately defending the forces of good against those thingies raining
+down. Bonus cities are awarded at ever-increasing intervals. Every five
+levels appears a bonus round. The computer player gets progressively
+more intelligent as the game progresses. Better aim, more economical with
+ammo, and better target selection. Points are in the bottom right, and
+high score is in the bottom left. Start with -smart to have the computer
+player skip the learning process.
+.SH OPTIONS
+.TP 8
+.B \-display \fIhost:display.screen\fP
+Specifies which X display we should use.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+Possible choices include
+
+.RS
+default, best, mono, monochrome, gray, grey, color, staticgray, staticcolor,
+truecolor, grayscale, greyscale, pseudocolor, directcolor, \fInumber\fP
+
+If a decimal or hexadecimal number is used,
+.BR XGetVisualInfo (3X)
+is consulted to obtain the required visual.
+.RE
+.TP 8
+.B \-foreground \fIcolor\fP
+Specifies the default foreground color.
+.TP 8
+.B \-background \fIcolor\fP
+Specifies the default background color.
+.TP 8
+.B \-bgrowth \fIinteger\fP
+Specifies the growth rate of the bomb explosions.
+.TP 8
+.B \-lrate \fIinteger\fP
+Set the initial rate of laser fire.
+.TP 8
+.B -smart
+Have the computer player skip the learning process.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH BUGS
+The layout of the screen isn't quite the same as the game this program
+tries to emulate. In this this program, the missiles come out of the
+cities; when really, there are supposed to be three missile bases on
+hills, with the cities in the valleys between them.
+
+See http://www.mame.net/ for details.
+.SH COPYRIGHT
+Copyright \(co 1999 Adam Miller. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Adam Miller <adum@aya.yale.edu>, 1999.
diff --git a/hacks/penrose.c b/hacks/penrose.c
new file mode 100644
index 0000000..6317cb6
--- /dev/null
+++ b/hacks/penrose.c
@@ -0,0 +1,1352 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* penrose --- quasiperiodic tilings */
+
+/* As reported in News of the Weird:
+
+ In April, Sir Roger Penrose, a British math professor who has worked
+ with Stephen Hawking on such topics as relativity, black holes, and
+ whether time has a beginning, filed a copyright-infringement lawsuit
+ against the Kimberly-Clark Corporation, which Penrose said copied a
+ pattern he created (a pattern demonstrating that "a nonrepeating
+ pattern could exist in nature") for its Kleenex quilted toilet paper.
+ Penrose said he doesn't like litigation but, "When it comes to the
+ population of Great Britain being invited by a multinational to wipe
+ their bottoms on what appears to be the work of a Knight of the
+ Realm, then a last stand must be taken."
+
+ NOTW #491, 4-jul-1997, by Chuck Shepherd.
+ http://www.nine.org/notw/notw.html
+ */
+
+#if 0
+static const char sccsid[] = "@(#)penrose.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Timo Korvola <tkorvola@dopey.hut.fi>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
+ * 09-Sep-1996: Written.
+ */
+
+/*-
+Be careful, this probably still has a few bugs (many of which may only
+appear with a very low probability). These are seen with -verbose .
+If one of these are hit penrose will reinitialize.
+*/
+
+/*-
+ * See Onoda, Steinhardt, DiVincenzo and Socolar in
+ * Phys. Rev. Lett. 60, #25, 1988 or
+ * Strandburg in Computers in Physics, Sep/Oct 1991.
+ *
+ * This implementation uses the simpler version of the growth
+ * algorithm, i.e., if there are no forced vertices, a randomly chosen
+ * tile is added to a randomly chosen vertex (no preference for those
+ * 108 degree angles).
+ *
+ * There are two essential differences to the algorithm presented in
+ * the literature: First, we do not allow the tiling to enclose an
+ * untiled area. Whenever this is in danger of happening, we just
+ * do not add the tile, hoping for a better random choice the next
+ * time. Second, when choosing a vertex randomly, we will take
+ * one that lies within the viewport if available. If this seems to
+ * cause enclosures in the forced rule case, we will allow invisible
+ * vertices to be chosen.
+ *
+ * Tiling is restarted whenever one of the following happens: there
+ * are no incomplete vertices within the viewport or the tiling has
+ * extended a window's length beyond the edge of the window
+ * horizontally or vertically or forced rule choice has failed 100
+ * times due to areas about to become enclosed.
+ *
+ * Introductory info:
+ * Science News March 23 1985 Vol 127, No. 12
+ * Science News July 16 1988 Vol 134, No. 3
+ * The Economist Sept 17 1988 pg. 100
+ *
+ */
+
+#ifdef STANDALONE
+#define MODE_penrose
+#define DEFAULTS "*delay: 10000 \n" \
+ "*size: 40 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define release_penrose 0
+# define penrose_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_penrose
+
+#define DEF_AMMANN "False"
+
+static Bool ammann;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-ammann", ".penrose.ammann", XrmoptionNoArg, "on"},
+ {"+ammann", ".penrose.ammann", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&ammann, "ammann", "Ammann", DEF_AMMANN, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-/+ammann", "turn on/off Ammann lines"}
+};
+
+ENTRYPOINT ModeSpecOpt penrose_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct penrose_description =
+{"penrose", "init_penrose", "draw_penrose", (char *) NULL,
+ "init_penrose", "init_penrose", "free_penrose", &penrose_opts,
+ 10000, 1, 1, -40, 64, 1.0, "",
+ "Shows Penrose's quasiperiodic tilings", 0, NULL};
+
+#endif
+
+/*-
+ * Annoyingly the ANSI C library people have reserved all identifiers
+ * ending with _t for future use. Hence we use _c as a suffix for
+ * typedefs (c for class, although this is not C++).
+ */
+
+#define MINSIZE 5
+
+/*-
+ * In theory one could fit 10 tiles to a single vertex. However, the
+ * vertex rules only allow at most seven tiles to meet at a vertex.
+ */
+
+#define CELEBRATE 31415 /* This causes a pause, an error occurred. */
+#define COMPLETION 3141 /* This causes a pause, tiles filled up screen. */
+
+#define MAX_TILES_PER_VERTEX 7
+#define N_VERTEX_RULES 8
+#define ALLOC_NODE(type) (type *)malloc(sizeof (type))
+
+/*-
+ * These are used to specify directions. They can also be used in bit
+ * masks to specify a combination of directions.
+ */
+#define S_LEFT 1
+#define S_RIGHT 2
+
+
+/*-
+ * We do not actually maintain objects corresponding to the tiles since
+ * we do not really need them and they would only consume memory and
+ * cause additional bookkeeping. Instead we only have vertices, and
+ * each vertex lists the type of each adjacent tile as well as the
+ * position of the vertex on the tile (hereafter refered to as
+ * "corner"). These positions are numbered in counterclockwise order
+ * so that 0 is where two double arrows meet (see one of the
+ * articles). The tile type and vertex number are stored in a single
+ * integer (we use char, and even most of it remains unused).
+ *
+ * The primary use of tile objects would be draw traversal, but we do
+ * not currently do redraws at all (we just start over).
+ */
+#define VT_CORNER_MASK 0x3
+#define VT_TYPE_MASK 0x4
+#define VT_THIN 0
+#define VT_THICK 0x4
+#define VT_BITS 3
+#define VT_TOTAL_MASK 0x7
+
+typedef unsigned char vertex_type_c;
+
+/*-
+ * These allow one to compute the types of the other corners of the tile. If
+ * you are standing at a vertex of type vt looking towards the middle of the
+ * tile, VT_LEFT( vt) is the vertex on your left etc.
+ */
+#define VT_LEFT( vt) ((((vt) - 1) & VT_CORNER_MASK) | (((vt) & VT_TYPE_MASK)))
+#define VT_RIGHT( vt) ((((vt) + 1) & VT_CORNER_MASK) | (((vt) & VT_TYPE_MASK)))
+#define VT_FAR( vt) ((vt) ^ 2)
+
+
+/*-
+ * Since we do not do redraws, we only store the vertices we need. These are
+ * the ones with still some empty space around them for the growth algorithm
+ * to fill.
+ *
+ * Here we use a doubly chained ring-like structure as vertices often need
+ * to be removed or inserted (they are kept in geometrical order
+ * circling the tiled area counterclockwise). The ring is refered to by
+ * a pointer to one more or less random node. When deleting nodes one
+ * must make sure that this pointer continues to refer to a valid
+ * node. A vertex count is maintained to make it easier to pick
+ * vertices randomly.
+ */
+typedef struct forced_node forced_node_c;
+
+typedef struct fringe_node {
+ struct fringe_node *prev;
+ struct fringe_node *next;
+ /* These are numbered counterclockwise. The gap, if any, lies
+ between the last and first tiles. */
+ vertex_type_c tiles[MAX_TILES_PER_VERTEX];
+ int n_tiles;
+ /* A bit mask used to indicate vertex rules that are still applicable for
+ completing this vertex. Initialize this to (1 << N_VERTEX_RULES) - 1,
+ i.e., all ones, and the rule matching functions will automatically mask
+ out rules that no longer match. */
+ unsigned char rule_mask;
+ /* If the vertex is on the forced vertex list, this points to the
+ pointer to the appropriate node in the list. To remove the
+ vertex from the list just set *list_ptr to the next node,
+ deallocate and decrement node count. */
+ struct forced_node **list_ptr;
+ /* Screen coordinates. */
+ XPoint loc;
+ /* We also keep track of 5D coordinates to avoid rounding errors.
+ These are in units of edge length. */
+ int fived[5];
+ /* This is used to quickly check if a vertex is visible. */
+ unsigned char off_screen;
+} fringe_node_c;
+
+typedef struct {
+ fringe_node_c *nodes;
+ /* This does not count off-screen nodes. */
+ int n_nodes;
+} fringe_c;
+
+
+/*-
+ * The forced vertex pool contains vertices where at least one
+ * side of the tiled region can only be extended in one way. Note
+ * that this does not necessarily mean that there would only be one
+ * applicable rule. forced_sides are specified using S_LEFT and
+ * S_RIGHT as if looking at the untiled region from the vertex.
+ */
+struct forced_node {
+ fringe_node_c *vertex;
+ unsigned forced_sides;
+ struct forced_node *next;
+};
+
+typedef struct {
+ forced_node_c *first;
+ int n_nodes, n_visible;
+} forced_pool_c;
+
+
+/* The tiles are listed in counterclockwise order. */
+typedef struct {
+ vertex_type_c tiles[MAX_TILES_PER_VERTEX];
+ int n_tiles;
+} vertex_rule_c;
+
+static vertex_rule_c vertex_rules[N_VERTEX_RULES] =
+{
+ {
+ {VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2}, 5},
+ {
+ {VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THICK | 0}, 5},
+ {
+ {VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THIN | 0}, 4},
+ {
+ {VT_THICK | 2, VT_THICK | 2, VT_THIN | 1, VT_THIN | 3, VT_THICK | 2,
+ VT_THIN | 1, VT_THIN | 3}, 7},
+ {
+ {VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2,
+ VT_THIN | 1, VT_THIN | 3}, 6},
+ {
+ {VT_THICK | 1, VT_THICK | 3, VT_THIN | 2}, 3},
+ {
+ {VT_THICK | 0, VT_THIN | 0, VT_THIN | 0}, 3},
+ {
+ {VT_THICK | 2, VT_THIN | 1, VT_THICK | 3, VT_THICK | 1, VT_THIN | 3}, 5}
+};
+
+
+/* Match information returned by match_rules. */
+typedef struct {
+ int rule;
+ int pos;
+} rule_match_c;
+
+
+/* Occasionally floating point coordinates are needed. */
+typedef struct {
+ float x, y;
+} fcoord_c;
+
+
+/* All angles are measured in multiples of 36 degrees. */
+typedef int angle_c;
+
+static angle_c vtype_angles[] =
+{4, 1, 4, 1, 2, 3, 2, 3};
+
+#define vtype_angle( v) (vtype_angles[ v])
+
+
+/* This is the data related to the tiling of one screen. */
+typedef struct {
+ int width, height;
+ XPoint origin;
+ int edge_length, line_width;
+ fringe_c fringe;
+ forced_pool_c forced;
+ int done, failures;
+ unsigned long thick_color, thin_color;
+ int busyLoop;
+ Bool ammann;
+ float ammann_r;
+ fcoord_c fived_table[5];
+} tiling_c;
+
+static tiling_c *tilings = (tiling_c *) NULL;
+
+
+
+/* Direction angle of an edge. */
+static angle_c
+vertex_dir(ModeInfo * mi, fringe_node_c * vertex, unsigned side)
+{
+ tiling_c *tp = &tilings[MI_SCREEN(mi)];
+ fringe_node_c *v2 =
+ (side == S_LEFT ? vertex->next : vertex->prev);
+ register int i;
+
+ for (i = 0; i < 5; i++)
+ switch (v2->fived[i] - vertex->fived[i]) {
+ case 1:
+ return 2 * i;
+ case -1:
+ return (2 * i + 5) % 10;
+ }
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr,
+ "Weirdness in vertex_dir (this has been reported)\n");
+ for (i = 0; i < 5; i++)
+ (void) fprintf(stderr, "v2->fived[%d]=%d, vertex->fived[%d]=%d\n",
+ i, v2->fived[i], i, vertex->fived[i]);
+ }
+ tp->busyLoop = CELEBRATE;
+ return 0;
+}
+
+
+/* Move one step to a given direction. */
+static void
+add_unit_vec(angle_c dir, int *fived)
+{
+ static const int dir2i[] = {0, 3, 1, 4, 2};
+
+ while (dir < 0)
+ dir += 10;
+ fived[dir2i[dir % 5]] += (dir % 2 ? -1 : 1);
+}
+
+
+/* For comparing coordinates. */
+#define fived_equal( f1, f2) (!memcmp( (f1), (f2), 5 * sizeof( int)))
+
+
+/*-
+ * This computes screen coordinates from 5D representation. Note that X
+ * uses left-handed coordinates (y increases downwards).
+ */
+static void
+fived_to_loc(int fived[], tiling_c * tp, XPoint *pt)
+{
+ float fifth = 8 * atan(1.) / 5;
+ register int i;
+ register float r;
+ register fcoord_c offset;
+
+ *pt = tp->origin;
+ offset.x = 0.0;
+ offset.y = 0.0;
+ if (tp->fived_table[0].x == .0)
+ for (i = 0; i < 5; i++) {
+ tp->fived_table[i].x = cos(fifth * i);
+ tp->fived_table[i].y = sin(fifth * i);
+ }
+ for (i = 0; i < 5; i++) {
+ r = fived[i] * tp->edge_length;
+ offset.x += r * tp->fived_table[i].x;
+ offset.y -= r * tp->fived_table[i].y;
+ }
+ (*pt).x += (int) (offset.x + .5);
+ (*pt).y += (int) (offset.y + .5);
+}
+
+
+/* Mop up dynamic data for one screen. */
+ENTRYPOINT void
+free_penrose(ModeInfo * mi)
+{
+ tiling_c * tp = &tilings[MI_SCREEN(mi)];
+ register fringe_node_c *fp1, *fp2;
+ register forced_node_c *lp1, *lp2;
+
+ if (tp->fringe.nodes == NULL)
+ return;
+ fp1 = tp->fringe.nodes;
+ do {
+ fp2 = fp1;
+ fp1 = fp1->next;
+ (void) free((void *) fp2);
+ } while (fp1 != tp->fringe.nodes);
+ tp->fringe.nodes = (fringe_node_c *) NULL;
+ for (lp1 = tp->forced.first; lp1 != 0;) {
+ lp2 = lp1;
+ lp1 = lp1->next;
+ (void) free((void *) lp2);
+ }
+ tp->forced.first = 0;
+}
+
+
+/* Called to init the mode. */
+ENTRYPOINT void
+init_penrose(ModeInfo * mi)
+{
+ tiling_c *tp;
+ fringe_node_c *fp;
+ int i, size;
+
+ MI_INIT (mi, tilings);
+ tp = &tilings[MI_SCREEN(mi)];
+
+#if 0 /* if you do this, then the -ammann and -no-ammann options don't work.
+ -- jwz */
+ if (MI_IS_FULLRANDOM(mi))
+ tp->ammann = (Bool) (LRAND() & 1);
+ else
+#endif /* 0 */
+ tp->ammann = ammann;
+
+ tp->done = False;
+ tp->busyLoop = 0;
+ tp->failures = 0;
+ tp->width = MI_WIDTH(mi);
+ tp->height = MI_HEIGHT(mi);
+ if (MI_NPIXELS(mi) > 2) {
+ tp->thick_color = NRAND(MI_NPIXELS(mi));
+ /* Insure good contrast */
+ tp->thin_color = (NRAND(2 * MI_NPIXELS(mi) / 3) + tp->thick_color +
+ MI_NPIXELS(mi) / 6) % MI_NPIXELS(mi);
+ }
+ size = MI_SIZE(mi);
+ tp->line_width = 1;
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ size *= 3;
+ tp->line_width *= 3;
+ }
+
+ if (size < -MINSIZE)
+ tp->edge_length = NRAND(MIN(-size, MAX(MINSIZE,
+ MIN(tp->width, tp->height) / 2)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ tp->edge_length = MAX(MINSIZE, MIN(tp->width, tp->height) / 2);
+ else
+ tp->edge_length = MINSIZE;
+ } else
+ tp->edge_length = MIN(size, MAX(MINSIZE,
+ MIN(tp->width, tp->height) / 2));
+ tp->origin.x = (tp->width / 2 + NRAND(tp->width)) / 2;
+ tp->origin.y = (tp->height / 2 + NRAND(tp->height)) / 2;
+ tp->fringe.n_nodes = 2;
+ if (tp->fringe.nodes != NULL)
+ free_penrose(mi);
+ if (tp->fringe.nodes != NULL || tp->forced.first != 0) {
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in init_penrose()\n");
+ (void) fprintf(stderr, "tp->fringe.nodes = NULL && tp->forced.first = 0\n");
+ }
+ free_penrose(mi); /* Try again */
+ tp->done = True;
+ }
+ tp->forced.n_nodes = tp->forced.n_visible = 0;
+ if ((fp = tp->fringe.nodes = ALLOC_NODE(fringe_node_c)) == NULL) {
+ free_penrose(mi);
+ return;
+ }
+ if (fp == 0) {
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in init_penrose()\n");
+ (void) fprintf(stderr, "fp = 0\n");
+ }
+ if ((fp = tp->fringe.nodes = ALLOC_NODE(fringe_node_c)) == NULL) {
+ free_penrose(mi);
+ return;
+ }
+ tp->done = True;
+ }
+ /* First vertex. */
+ fp->rule_mask = (1 << N_VERTEX_RULES) - 1;
+ fp->list_ptr = 0;
+ if ((fp->prev = fp->next = ALLOC_NODE(fringe_node_c)) == NULL) {
+ free_penrose(mi);
+ return;
+ }
+ if (fp->next == 0) {
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in init_penrose()\n");
+ (void) fprintf(stderr, "fp->next = 0\n");
+ }
+ if ((fp->prev = fp->next = ALLOC_NODE(fringe_node_c)) == NULL) {
+ free_penrose(mi);
+ return;
+ }
+ tp->done = True;
+ }
+ fp->n_tiles = 0;
+ fp->loc = tp->origin;
+ fp->off_screen = False;
+ for (i = 0; i < 5; i++)
+ fp->fived[i] = 0;
+
+ /* Second vertex. */
+ *(fp->next) = *fp;
+ fp->next->prev = fp->next->next = fp;
+ fp = fp->next;
+ i = NRAND(5);
+ fp->fived[i] = 2 * NRAND(2) - 1;
+ fived_to_loc(fp->fived, tp, &(fp->loc));
+ /* That's it! We have created our first edge. */
+
+ MI_CLEARWINDOW(mi);
+}
+
+/*-
+ * This attempts to match the configuration of vertex with the vertex
+ * rules. The return value is a total match count. If matches is
+ * non-null, it will be used to store information about the matches
+ * and must be large enough to contain it. To play it absolutely
+ * safe, allocate room for MAX_TILES_PER_VERTEX * N_VERTEX_RULES
+ * entries when searching all matches. The rule mask of vertex will
+ * be applied and rules masked out will not be searched. Only strict
+ * subsequences match. If first_only is true, the search stops when
+ * the first match is found. Otherwise all matches will be found and
+ * the rule_mask of vertex will be updated, which also happens in
+ * single-match mode if no match is found.
+ */
+static int
+match_rules(fringe_node_c * vertex, rule_match_c * matches, int first_only)
+{
+ /* I will assume that I can fit all the relevant bits in vertex->tiles
+ into one unsigned long. With 3 bits per element and at most 7
+ elements this means 21 bits, which should leave plenty of room.
+ After packing the bits the rest is just integer comparisons and
+ some bit shuffling. This is essentially Rabin-Karp without
+ congruence arithmetic. */
+ register int i, j;
+ int hits = 0, good_rules[N_VERTEX_RULES], n_good = 0;
+ unsigned long
+ vertex_hash = 0, lower_bits_mask = ~(VT_TOTAL_MASK << VT_BITS * (vertex->n_tiles - 1));
+ unsigned new_rule_mask = 0;
+
+ for (i = 0; i < N_VERTEX_RULES; i++)
+ if (vertex->n_tiles >= vertex_rules[i].n_tiles)
+ vertex->rule_mask &= ~(1 << i);
+ else if (vertex->rule_mask & 1 << i)
+ good_rules[n_good++] = i;
+ for (i = 0; i < vertex->n_tiles; i++)
+ vertex_hash |= (unsigned long) vertex->tiles[i] << (VT_BITS * i);
+
+ for (j = 0; j < n_good; j++) {
+ unsigned long rule_hash = 0;
+ vertex_rule_c *vr = vertex_rules + good_rules[j];
+
+ for (i = 0; i < vertex->n_tiles; i++)
+ rule_hash |= (unsigned long) vr->tiles[i] << (VT_BITS * i);
+ if (rule_hash == vertex_hash) {
+ if (matches != 0) {
+ matches[hits].rule = good_rules[j];
+ matches[hits].pos = 0;
+ }
+ hits++;
+ if (first_only)
+ return hits;
+ else
+ new_rule_mask |= 1 << good_rules[j];
+ }
+ for (i = vr->n_tiles - 1; i > 0; i--) {
+ rule_hash = vr->tiles[i] | (rule_hash & lower_bits_mask) << VT_BITS;
+ if (vertex_hash == rule_hash) {
+ if (matches != 0) {
+ matches[hits].rule = good_rules[j];
+ matches[hits].pos = i;
+ }
+ hits++;
+ if (first_only)
+ return hits;
+ else
+ new_rule_mask |= 1 << good_rules[j];
+ }
+ }
+ }
+ vertex->rule_mask = new_rule_mask;
+ return hits;
+}
+
+
+/*-
+ * find_completions finds the possible ways to add a tile to a vertex.
+ * The return values is the number of such possibilities. You must
+ * first call match_rules to produce matches and n_matches. sides
+ * specifies which side of the vertex to extend and can be S_LEFT or
+ * S_RIGHT. If results is non-null, it should point to an array large
+ * enough to contain the results, which will be stored there.
+ * MAX_COMPL elements will always suffice. If first_only is true we
+ * stop as soon as we find one possibility (NOT USED).
+ */
+#define MAX_COMPL 2
+
+static int
+find_completions(fringe_node_c * vertex, rule_match_c * matches, int n_matches,
+ unsigned side, vertex_type_c * results /*, int first_only */ )
+{
+ int n_res = 0, cont;
+ register int i, j;
+ vertex_type_c buf[MAX_COMPL];
+
+ if (results == 0)
+ results = buf;
+ if (n_matches <= 0)
+ return 0;
+ for (i = 0; i < n_matches; i++) {
+ vertex_rule_c *rule = vertex_rules + matches[i].rule;
+ int pos = (matches[i].pos
+ + (side == S_RIGHT ? vertex->n_tiles : rule->n_tiles - 1))
+ % rule->n_tiles;
+ vertex_type_c vtype = rule->tiles[pos];
+
+ cont = 1;
+ for (j = 0; j < n_res; j++)
+ if (vtype == results[j]) {
+ cont = 0;
+ break;
+ }
+ if (cont)
+ results[n_res++] = vtype;
+ }
+ return n_res;
+}
+
+
+/*-
+ * Draw a tile on the display. Vertices must be given in a
+ * counterclockwise order. vtype is the vertex type of v1 (and thus
+ * also gives the tile type).
+ */
+static void
+draw_tile(fringe_node_c * v1, fringe_node_c * v2,
+ fringe_node_c * v3, fringe_node_c * v4,
+ vertex_type_c vtype, ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ tiling_c *tp = &tilings[MI_SCREEN(mi)];
+ XPoint pts[5];
+ vertex_type_c corner = vtype & VT_CORNER_MASK;
+
+ if (v1->off_screen && v2->off_screen && v3->off_screen && v4->off_screen)
+ return;
+ pts[corner] = v1->loc;
+ pts[VT_RIGHT(corner)] = v2->loc;
+ pts[VT_FAR(corner)] = v3->loc;
+ pts[VT_LEFT(corner)] = v4->loc;
+ pts[4] = pts[0];
+ if (MI_NPIXELS(mi) > 2) {
+ if ((vtype & VT_TYPE_MASK) == VT_THICK)
+ XSetForeground(display, gc, MI_PIXEL(mi, tp->thick_color));
+ else
+ XSetForeground(display, gc, MI_PIXEL(mi, tp->thin_color));
+ } else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XFillPolygon(display, window, gc, pts, 4, Convex, CoordModeOrigin);
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(display, gc, tp->line_width,
+ LineSolid, CapNotLast, JoinMiter);
+ XDrawLines(display, window, gc, pts, 5, CoordModeOrigin);
+
+ if (tp->ammann) {
+ /* Draw some Ammann lines for debugging purposes. This will probably
+ fail miserably on a b&w display. */
+
+ if ((vtype & VT_TYPE_MASK) == VT_THICK) {
+
+ if (tp->ammann_r == .0) {
+ float pi10 = 2 * atan(1.) / 5;
+
+ tp->ammann_r = 1 - sin(pi10) / (2 * sin(3 * pi10));
+ }
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, tp->thin_color));
+ else {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(display, gc, 1, LineOnOffDash, CapNotLast, JoinMiter);
+ }
+ XDrawLine(display, window, gc,
+ (int) (tp->ammann_r * pts[3].x + (1 - tp->ammann_r) * pts[0].x + .5),
+ (int) (tp->ammann_r * pts[3].y + (1 - tp->ammann_r) * pts[0].y + .5),
+ (int) (tp->ammann_r * pts[1].x + (1 - tp->ammann_r) * pts[0].x + .5),
+ (int) (tp->ammann_r * pts[1].y + (1 - tp->ammann_r) * pts[0].y + .5));
+ if (MI_NPIXELS(mi) <= 2)
+ XSetLineAttributes(display, gc, 1, LineSolid, CapNotLast, JoinMiter);
+ } else {
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, tp->thick_color));
+ else {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(display, gc, 1, LineOnOffDash, CapNotLast, JoinMiter);
+ }
+ XDrawLine(display, window, gc,
+ (int) ((pts[3].x + pts[2].x) / 2 + .5),
+ (int) ((pts[3].y + pts[2].y) / 2 + .5),
+ (int) ((pts[1].x + pts[2].x) / 2 + .5),
+ (int) ((pts[1].y + pts[2].y) / 2 + .5));
+ if (MI_NPIXELS(mi) <= 2)
+ XSetLineAttributes(display, gc, 1, LineSolid, CapNotLast, JoinMiter);
+ }
+ }
+}
+
+/*-
+ * Update the status of this vertex on the forced vertex queue. If
+ * the vertex has become untileable set tp->done. This is supposed
+ * to detect dislocations -- never call this routine with a completely
+ * tiled vertex.
+ *
+ * Check for untileable vertices in check_vertex and stop tiling as
+ * soon as one finds one. I don't know if it is possible to run out
+ * of forced vertices while untileable vertices exist (or will
+ * cavities inevitably appear). If this can happen, add_random_tile
+ * might get called with an untileable vertex, causing ( n <= 1).
+ * (This is what the tp->done checks for).
+ *
+ * A delayLoop celebrates the dislocation.
+ */
+static void
+check_vertex(ModeInfo * mi, fringe_node_c * vertex, tiling_c * tp)
+{
+ rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+ int n_hits = match_rules(vertex, hits, False);
+ unsigned forced_sides = 0;
+
+ if (vertex->rule_mask == 0) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Dislocation occurred!\n");
+ }
+ tp->busyLoop = CELEBRATE; /* Should be able to recover */
+ }
+ if (1 == find_completions(vertex, hits, n_hits, S_LEFT, 0 /*, False */ ))
+ forced_sides |= S_LEFT;
+ if (1 == find_completions(vertex, hits, n_hits, S_RIGHT, 0 /*, False */ ))
+ forced_sides |= S_RIGHT;
+ if (forced_sides == 0) {
+ if (vertex->list_ptr != 0) {
+ forced_node_c *node = *vertex->list_ptr;
+
+ *vertex->list_ptr = node->next;
+ if (node->next != 0)
+ node->next->vertex->list_ptr = vertex->list_ptr;
+ (void) free((void *) node);
+ tp->forced.n_nodes--;
+ if (!vertex->off_screen)
+ tp->forced.n_visible--;
+ vertex->list_ptr = 0;
+ }
+ } else {
+ forced_node_c *node;
+
+ if (vertex->list_ptr == 0) {
+ if ((node = ALLOC_NODE(forced_node_c)) == NULL)
+ return;
+ node->vertex = vertex;
+ node->next = tp->forced.first;
+ if (tp->forced.first != 0)
+ tp->forced.first->vertex->list_ptr = &(node->next);
+ tp->forced.first = node;
+ vertex->list_ptr = &(tp->forced.first);
+ tp->forced.n_nodes++;
+ if (!vertex->off_screen)
+ tp->forced.n_visible++;
+ } else
+ node = *vertex->list_ptr;
+ node->forced_sides = forced_sides;
+ }
+}
+
+
+/*-
+ * Delete this vertex. If the vertex is a member of the forced vertex queue,
+ * also remove that entry. We assume that the vertex is no longer
+ * connected to the fringe. Note that tp->fringe.nodes must not point to
+ * the vertex being deleted.
+ */
+static void
+delete_vertex(ModeInfo * mi, fringe_node_c * vertex, tiling_c * tp)
+{
+ if (tp->fringe.nodes == vertex) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in delete_penrose()\n");
+ (void) fprintf(stderr, "tp->fringe.nodes == vertex\n");
+ }
+ tp->busyLoop = CELEBRATE;
+ }
+ if (vertex->list_ptr != 0) {
+ forced_node_c *node = *vertex->list_ptr;
+
+ *vertex->list_ptr = node->next;
+ if (node->next != 0)
+ node->next->vertex->list_ptr = vertex->list_ptr;
+ (void) free((void *) node);
+ tp->forced.n_nodes--;
+ if (!vertex->off_screen)
+ tp->forced.n_visible--;
+ }
+ if (!vertex->off_screen)
+ tp->fringe.n_nodes--;
+ (void) free((void *) vertex);
+}
+
+
+/*-
+ * Check whether the addition of a tile of type vtype would completely fill
+ * the space available at vertex.
+ */
+static int
+fills_vertex(ModeInfo * mi, vertex_type_c vtype, fringe_node_c * vertex)
+{
+ return
+ (vertex_dir(mi, vertex, S_LEFT) - vertex_dir(mi, vertex, S_RIGHT)
+ - vtype_angle(vtype)) % 10 == 0;
+}
+
+
+/*-
+ * If you were to add a tile of type vtype to a specified side of
+ * vertex, fringe_changes tells you which other vertices it would
+ * attach to. The addresses of these vertices will be stored in the
+ * last three arguments. Null is stored if the corresponding vertex
+ * would need to be allocated.
+ *
+ * The function also analyzes which vertices would be swallowed by the tiling
+ * and thus cut off from the fringe. The result is returned as a bit pattern.
+ */
+#define FC_BAG 1 /* Total enclosure. Should never occur. */
+#define FC_NEW_RIGHT 2
+#define FC_NEW_FAR 4
+#define FC_NEW_LEFT 8
+#define FC_NEW_MASK 0xe
+#define FC_CUT_THIS 0x10
+#define FC_CUT_RIGHT 0x20
+#define FC_CUT_FAR 0x40
+#define FC_CUT_LEFT 0x80
+#define FC_CUT_MASK 0xf0
+#define FC_TOTAL_MASK 0xff
+
+static unsigned
+fringe_changes(ModeInfo * mi, fringe_node_c * vertex,
+ unsigned side, vertex_type_c vtype,
+ fringe_node_c ** right, fringe_node_c ** far,
+ fringe_node_c ** left)
+{
+ fringe_node_c *v, *f = (fringe_node_c *) NULL;
+ unsigned result = FC_NEW_FAR; /* We clear this later if necessary. */
+
+ if (far)
+ *far = 0;
+ if (fills_vertex(mi, vtype, vertex)) {
+ result |= FC_CUT_THIS;
+ } else if (side == S_LEFT) {
+ result |= FC_NEW_RIGHT;
+ if (right)
+ *right = 0;
+ } else {
+ result |= FC_NEW_LEFT;
+ if (left)
+ *left = 0;
+ }
+
+ if (!(result & FC_NEW_LEFT)) {
+ v = vertex->next;
+ if (left)
+ *left = v;
+ if (fills_vertex(mi, VT_LEFT(vtype), v)) {
+ result = (result & ~FC_NEW_FAR) | FC_CUT_LEFT;
+ f = v->next;
+ if (far)
+ *far = f;
+ }
+ }
+ if (!(result & FC_NEW_RIGHT)) {
+ v = vertex->prev;
+ if (right)
+ *right = v;
+ if (fills_vertex(mi, VT_RIGHT(vtype), v)) {
+ result = (result & ~FC_NEW_FAR) | FC_CUT_RIGHT;
+ f = v->prev;
+ if (far)
+ *far = f;
+ }
+ }
+ if (!(result & FC_NEW_FAR)
+ && fills_vertex(mi, VT_FAR(vtype), f)) {
+ result |= FC_CUT_FAR;
+ result &= (~FC_NEW_LEFT & ~FC_NEW_RIGHT);
+ if (right && (result & FC_CUT_LEFT))
+ *right = f->next;
+ if (left && (result & FC_CUT_RIGHT))
+ *left = f->prev;
+ }
+ if (((result & FC_CUT_LEFT) && (result & FC_CUT_RIGHT))
+ || ((result & FC_CUT_THIS) && (result & FC_CUT_FAR)))
+ result |= FC_BAG;
+ return result;
+}
+
+
+/* A couple of lesser helper functions for add_tile. */
+static void
+add_vtype(fringe_node_c * vertex, unsigned side, vertex_type_c vtype)
+{
+ if (side == S_RIGHT)
+ vertex->tiles[vertex->n_tiles++] = vtype;
+ else {
+ register int i;
+
+ for (i = vertex->n_tiles; i > 0; i--)
+ vertex->tiles[i] = vertex->tiles[i - 1];
+ vertex->tiles[0] = vtype;
+ vertex->n_tiles++;
+ }
+}
+
+static fringe_node_c *
+alloc_vertex(ModeInfo * mi, angle_c dir, fringe_node_c * from, tiling_c * tp)
+{
+ fringe_node_c *v;
+
+ if ((v = ALLOC_NODE(fringe_node_c)) == NULL) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "No memory in alloc_vertex()\n");
+ }
+ tp->busyLoop = CELEBRATE;
+ return v;
+ }
+ *v = *from;
+ add_unit_vec(dir, v->fived);
+ fived_to_loc(v->fived, tp, &(v->loc));
+ if (v->loc.x < 0 || v->loc.y < 0
+ || v->loc.x >= tp->width || v->loc.y >= tp->height) {
+ int ww = tp->width;
+ int hh = tp->height;
+ if (ww < 200) ww = 200; /* tiny window */
+ if (hh < 200) hh = 200;
+ v->off_screen = True;
+ if (v->loc.x < -ww || v->loc.y < -hh ||
+ v->loc.x >= 2 * ww || v->loc.y >= 2 * hh)
+ tp->done = True;
+ } else {
+ v->off_screen = False;
+ tp->fringe.n_nodes++;
+ }
+ v->n_tiles = 0;
+ v->rule_mask = (1 << N_VERTEX_RULES) - 1;
+ v->list_ptr = 0;
+ return v;
+}
+
+/*-
+ * Add a tile described by vtype to the side of vertex. This must be
+ * allowed by the rules -- we do not check it here. New vertices are
+ * allocated as necessary. The fringe and the forced vertex pool are updated.
+ * The new tile is drawn on the display.
+ *
+ * One thing we do check here is whether the new tile causes an untiled
+ * area to become enclosed by the tiling. If this would happen, the tile
+ * is not added. The return value is true iff a tile was added.
+ */
+static int
+add_tile(ModeInfo * mi,
+ fringe_node_c * vertex, unsigned side, vertex_type_c vtype)
+{
+ tiling_c *tp = &tilings[MI_SCREEN(mi)];
+
+ fringe_node_c
+ *left = (fringe_node_c *) NULL,
+ *right = (fringe_node_c *) NULL,
+ *far = (fringe_node_c *) NULL,
+ *node;
+ unsigned fc = fringe_changes(mi, vertex, side, vtype, &right, &far, &left);
+
+ vertex_type_c
+ ltype = VT_LEFT(vtype),
+ rtype = VT_RIGHT(vtype),
+ ftype = VT_FAR(vtype);
+
+ /* By our conventions vertex->next lies to the left of vertex and
+ vertex->prev to the right. */
+
+ /* This should never occur. */
+ if (fc & FC_BAG) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in add_tile()\n");
+ (void) fprintf(stderr, "fc = %d, FC_BAG = %d\n", fc, FC_BAG);
+ }
+ }
+ if (side == S_LEFT) {
+ if (right == NULL)
+ if ((right = alloc_vertex(mi, vertex_dir(mi, vertex, S_LEFT) -
+ vtype_angle(vtype), vertex, tp)) == NULL)
+ return False;
+ if (far == NULL)
+ if ((far = alloc_vertex(mi, vertex_dir(mi, left, S_RIGHT) +
+ vtype_angle(ltype), left, tp)) == NULL)
+ return False;
+ } else {
+ if (left == NULL)
+ if ((left = alloc_vertex(mi, vertex_dir(mi, vertex, S_RIGHT) +
+ vtype_angle(vtype), vertex, tp)) == NULL)
+ return False;
+ if (far == NULL)
+ if ((far = alloc_vertex(mi, vertex_dir(mi, right, S_LEFT) -
+ vtype_angle(rtype), right, tp)) == NULL)
+ return False;
+ }
+
+ /* Having allocated the new vertices, but before joining them with
+ the rest of the fringe, check if vertices with same coordinates
+ already exist. If any such are found, give up. */
+ node = tp->fringe.nodes;
+ do {
+ if (((fc & FC_NEW_LEFT) && fived_equal(node->fived, left->fived))
+ || ((fc & FC_NEW_RIGHT) && fived_equal(node->fived, right->fived))
+ || ((fc & FC_NEW_FAR) && fived_equal(node->fived, far->fived))) {
+ /* Better luck next time. */
+ if (fc & FC_NEW_LEFT)
+ delete_vertex(mi, left, tp);
+ if (fc & FC_NEW_RIGHT)
+ delete_vertex(mi, right, tp);
+ if (fc & FC_NEW_FAR)
+ delete_vertex(mi, far, tp);
+ return False;
+ }
+ node = node->next;
+ } while (node != tp->fringe.nodes);
+
+ /* Rechain. */
+ if (!(fc & FC_CUT_THIS)) {
+ if (side == S_LEFT) {
+ vertex->next = right;
+ right->prev = vertex;
+ } else {
+ vertex->prev = left;
+ left->next = vertex;
+ }
+ }
+ if (!(fc & FC_CUT_FAR)) {
+ if (!(fc & FC_CUT_LEFT)) {
+ far->next = left;
+ left->prev = far;
+ }
+ if (!(fc & FC_CUT_RIGHT)) {
+ far->prev = right;
+ right->next = far;
+ }
+ }
+ draw_tile(vertex, right, far, left, vtype, mi);
+
+ /* Delete vertices that are no longer on the fringe. Check the others. */
+ if (fc & FC_CUT_THIS) {
+ tp->fringe.nodes = far;
+ delete_vertex(mi, vertex, tp);
+ } else {
+ add_vtype(vertex, side, vtype);
+ check_vertex(mi, vertex, tp);
+ tp->fringe.nodes = vertex;
+ }
+ if (fc & FC_CUT_FAR)
+ delete_vertex(mi, far, tp);
+ else {
+ add_vtype(far, fc & FC_CUT_RIGHT ? S_LEFT : S_RIGHT, ftype);
+ check_vertex(mi, far, tp);
+ }
+ if (fc & FC_CUT_LEFT)
+ delete_vertex(mi, left, tp);
+ else {
+ add_vtype(left, fc & FC_CUT_FAR ? S_LEFT : S_RIGHT, ltype);
+ check_vertex(mi, left, tp);
+ }
+ if (fc & FC_CUT_RIGHT)
+ delete_vertex(mi, right, tp);
+ else {
+ add_vtype(right, fc & FC_CUT_FAR ? S_RIGHT : S_LEFT, rtype);
+ check_vertex(mi, right, tp);
+ }
+ return True;
+}
+
+
+/*-
+ * Add a forced tile to a given forced vertex. Basically an easy job,
+ * since we know what to add. But it might fail if adding the tile
+ * would cause some untiled area to become enclosed. There is also another
+ * more exotic culprit: we might have a dislocation. Fortunately, they
+ * are very rare (the PRL article reported that perfect tilings of over
+ * 2^50 tiles had been generated). There is a version of the algorithm
+ * that doesn't produce dislocations, but it's a lot hairier than the
+ * simpler version I used.
+ */
+static int
+add_forced_tile(ModeInfo * mi, forced_node_c * node)
+{
+ tiling_c *tp = &tilings[MI_SCREEN(mi)];
+ unsigned side;
+ vertex_type_c vtype = 0;
+ rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+ int n;
+
+ if (node->forced_sides == (S_LEFT | S_RIGHT))
+ side = NRAND(2) ? S_LEFT : S_RIGHT;
+ else
+ side = node->forced_sides;
+ n = match_rules(node->vertex, hits, True);
+ n = find_completions(node->vertex, hits, n, side, &vtype /*, True */ );
+ if (n <= 0) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in add_forced_tile()\n");
+ (void) fprintf(stderr, "n = %d\n", n);
+ }
+ }
+ return add_tile(mi, node->vertex, side, vtype);
+}
+
+
+/*-
+ * Whether the addition of a tile of vtype on the given side of vertex
+ * would conform to the rules. The efficient way to do this would be
+ * to add the new tile and then use the same type of search as in
+ * match_rules. However, this function is not a performance
+ * bottleneck (only needed for random tile additions, which are
+ * relatively infrequent), so I will settle for a simpler implementation.
+ */
+static int
+legal_move(fringe_node_c * vertex, unsigned side, vertex_type_c vtype)
+{
+ rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+ vertex_type_c legal_vt[MAX_COMPL];
+ int n_hits, n_legal, i;
+
+ n_hits = match_rules(vertex, hits, False);
+ n_legal = find_completions(vertex, hits, n_hits, side, legal_vt /*, False */ );
+ for (i = 0; i < n_legal; i++)
+ if (legal_vt[i] == vtype)
+ return True;
+ return False;
+}
+
+
+/*-
+ * Add a randomly chosen tile to a given vertex. This requires more checking
+ * as we must make sure the new tile conforms to the vertex rules at every
+ * vertex it touches. */
+static void
+add_random_tile(fringe_node_c * vertex, ModeInfo * mi)
+{
+ fringe_node_c *right, *left, *far;
+ int i, j, n, n_hits, n_good;
+ unsigned side, fc, no_good, s;
+ vertex_type_c vtypes[MAX_COMPL];
+ rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+ tiling_c *tp = &tilings[MI_SCREEN(mi)];
+
+ if (MI_NPIXELS(mi) > 2) {
+ tp->thick_color = NRAND(MI_NPIXELS(mi));
+ /* Insure good contrast */
+ tp->thin_color = (NRAND(2 * MI_NPIXELS(mi) / 3) + tp->thick_color +
+ MI_NPIXELS(mi) / 6) % MI_NPIXELS(mi);
+ } else
+ tp->thick_color = tp->thin_color = MI_WHITE_PIXEL(mi);
+ n_hits = match_rules(vertex, hits, False);
+ side = NRAND(2) ? S_LEFT : S_RIGHT;
+ n = find_completions(vertex, hits, n_hits, side, vtypes /*, False */ );
+ /* One answer would mean a forced tile. */
+ if (n <= 0) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+ (void) fprintf(stderr, "n = %d\n", n);
+ }
+ }
+ no_good = 0;
+ n_good = n;
+ for (i = 0; i < n; i++) {
+ fc = fringe_changes(mi, vertex, side, vtypes[i], &right, &far, &left);
+ if (fc & FC_BAG) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+ (void) fprintf(stderr, "fc = %d, FC_BAG = %d\n", fc, FC_BAG);
+ }
+ }
+ if (right) {
+ s = (((fc & FC_CUT_FAR) && (fc & FC_CUT_LEFT)) ? S_RIGHT : S_LEFT);
+ if (!legal_move(right, s, VT_RIGHT(vtypes[i]))) {
+ no_good |= (1 << i);
+ n_good--;
+ continue;
+ }
+ }
+ if (left) {
+ s = (((fc & FC_CUT_FAR) && (fc & FC_CUT_RIGHT)) ? S_LEFT : S_RIGHT);
+ if (!legal_move(left, s, VT_LEFT(vtypes[i]))) {
+ no_good |= (1 << i);
+ n_good--;
+ continue;
+ }
+ }
+ if (far) {
+ s = ((fc & FC_CUT_LEFT) ? S_RIGHT : S_LEFT);
+ if (!legal_move(far, s, VT_FAR(vtypes[i]))) {
+ no_good |= (1 << i);
+ n_good--;
+ }
+ }
+ }
+ if (n_good <= 0) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+ (void) fprintf(stderr, "n_good = %d\n", n_good);
+ }
+ }
+ n = NRAND(n_good);
+ for (i = j = 0; i <= n; i++, j++)
+ while (no_good & (1 << j))
+ j++;
+
+ if (!add_tile(mi, vertex, side, vtypes[j - 1])) {
+ tp->done = True;
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+ }
+ free_penrose(mi);
+ }
+}
+
+/* One step of the growth algorithm. */
+ENTRYPOINT void
+draw_penrose(ModeInfo * mi)
+{
+ int i = 0, n;
+ forced_node_c *p;
+ tiling_c *tp;
+
+ if (tilings == NULL)
+ return;
+ tp = &tilings[MI_SCREEN(mi)];
+ if (tp->fringe.nodes == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ p = tp->forced.first;
+ if (tp->busyLoop > 0) {
+ tp->busyLoop--;
+ return;
+ }
+ if (tp->done || tp->failures >= 100) {
+ init_penrose(mi);
+ return;
+ }
+ /* Check for the initial "2-gon". */
+ if (tp->fringe.nodes->prev == tp->fringe.nodes->next) {
+ vertex_type_c vtype = (unsigned char) (VT_TOTAL_MASK & LRAND());
+
+ if (!add_tile(mi, tp->fringe.nodes, S_LEFT, vtype))
+ free_penrose(mi);
+ return;
+ }
+ /* No visible nodes left. */
+ if (tp->fringe.n_nodes == 0) {
+ tp->done = True;
+ tp->busyLoop = COMPLETION; /* Just finished drawing */
+ return;
+ }
+ if (tp->forced.n_visible > 0 && tp->failures < 10) {
+ n = NRAND(tp->forced.n_visible);
+ for (;;) {
+ while (p->vertex->off_screen)
+ p = p->next;
+ if (i++ < n)
+ p = p->next;
+ else
+ break;
+ }
+ } else if (tp->forced.n_nodes > 0) {
+ n = NRAND(tp->forced.n_nodes);
+ while (i++ < n)
+ p = p->next;
+ } else {
+ fringe_node_c *fringe_p = tp->fringe.nodes;
+
+ n = NRAND(tp->fringe.n_nodes);
+ i = 0;
+ for (; i <= n; i++)
+ do {
+ fringe_p = fringe_p->next;
+ } while (fringe_p->off_screen);
+ add_random_tile(fringe_p, mi);
+ tp->failures = 0;
+ return;
+ }
+ if (add_forced_tile(mi, p))
+ tp->failures = 0;
+ else
+ tp->failures++;
+}
+
+
+ENTRYPOINT void
+reshape_penrose(ModeInfo * mi, int width, int height)
+{
+ tiling_c *tp = &tilings[MI_SCREEN(mi)];
+ tp->width = width;
+ tp->height = height;
+}
+
+XSCREENSAVER_MODULE ("Penrose", penrose)
+
+#endif /* MODE_penrose */
diff --git a/hacks/penrose.man b/hacks/penrose.man
new file mode 100644
index 0000000..8c6d4ee
--- /dev/null
+++ b/hacks/penrose.man
@@ -0,0 +1,106 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+penrose - draws quasiperiodic tilings
+.SH SYNOPSIS
+.B penrose
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-size \fIinteger\fP] [\-ammann] [\-no\-ammann]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIpenrose\fP program draws quasiperiodic tilings.
+
+See Onoda, Steinhardt, DiVincenzo and Socolar in
+Phys. Rev. Lett. 60, #25, 1988 or
+Strandburg in Computers in Physics, Sep/Oct 1991.
+
+This implementation uses the simpler version of the growth
+algorithm, i.e., if there are no forced vertices, a randomly chosen
+tile is added to a randomly chosen vertex (no preference for those
+108 degree angles).
+
+There are two essential differences to the algorithm presented in
+the literature: First, we do not allow the tiling to enclose an
+untiled area. Whenever this is in danger of happening, we just
+do not add the tile, hoping for a better random choice the next
+time. Second, when choosing a vertex randomly, we will take
+one that lies withing the viewport if available. If this seems to
+cause enclosures in the forced rule case, we will allow invisible
+vertices to be chosen.
+
+Tiling is restarted whenever one of the following happens: there
+are no incomplete vertices within the viewport or the tiling has
+extended a window's length beyond the edge of the window
+horizontally or vertically or forced rule choice has failed 100
+times due to areas about to become enclosed.
+
+Although quasiperiodic tilings are produced, the tiles themselves are
+not penrose tiles (darts and kites). In contrast to penrose tiles,
+these tiles can be arranged to form a periodic tiling.
+
+.SH OPTIONS
+.I penrose
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-size \fIinteger\fP
+How big the tiles should be. Default 40 pixels.
+
+.TP 8
+.B \-delay \fImilliseconds\fP
+How long (in 1/1,000,000'ths of a second) to wait between drawing each
+tile. Default 10,000 or .01 seconds.
+
+.TP 8
+.B \-ammann
+.TP 8
+.B \-no\-ammann
+Whether Ammann lines should be added.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Timo Korvola.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Timo Korvola <tkorvola@dopey.hut.fi>, 1996.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/petri.c b/hacks/petri.c
new file mode 100644
index 0000000..97299d6
--- /dev/null
+++ b/hacks/petri.c
@@ -0,0 +1,761 @@
+/* petri, simulate mold in a petri dish. v2.7
+ * by Dan Bornstein, danfuzz@milk.com
+ * with help from Jamie Zawinski, jwz@jwz.org
+ * Copyright (c) 1992-1999 Dan Bornstein.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ *
+ * Brief description of options/resources:
+ *
+ * delay: the delay in microseconds between iterations
+ * size: the size of a cell in pixels
+ * count: the number of different kinds of mold (minimum: 2)
+ * diaglim: the age limit for diagonal growth as a multiplier of orthogonal
+ * growth (minimum: 1, maximum 2). 1 means square growth, 1.414
+ * (i.e., sqrt(2)) means approximately circular growth, 2 means diamond
+ * growth.
+ * anychan: the chance (fraction, between 0 and 1) that at each iteration,
+ * any new cell will be born
+ * minorchan: the chance (fraction, between 0 and 1) that, given that new
+ * cells will be added, that only two will be added (a minor cell birth
+ * event)
+ * instantdeathchan: the chance (fraction, between 0 and 1) that, given
+ * that death and destruction will happen, that instead of using plague
+ * cells, death will be instantaneous
+ * minlifespan: the minimum lifespan of a colony (before black death ensues)
+ * maxlifespan: the maximum lifespan of a colony (before black death ensues)
+ * minlifespeed: the minimum speed for living cells as a fraction of the
+ * maximum possible speed (fraction, between 0 and 1)
+ * maxlifespeed: the maximum speed for living cells as a fraction of the
+ * maximum possible speed (fraction, between 0 and 1)
+ * mindeathspeed: the minimum speed for black death cells as a fraction of the
+ * maximum possible speed (fraction, between 0 and 1)
+ * maxdeathspeed: the maximum speed for black death cells as a fraction of the
+ * maximum possible speed (fraction, between 0 and 1)
+ * originalcolors: if true, count must be 8 or less and the colors are a
+ * fixed set of primary and secondary colors (the artist's original choices)
+ *
+ * Interesting settings:
+ *
+ * petri -originalcolors -size 8
+ * petri -size 2
+ * petri -size 8 -diaglim 1.8
+ * petri -diaglim 1.1
+ *
+ * petri -count 4 -anychan 0.01 -minorchan 1 \
+ * -minlifespan 2000 -maxlifespan 5000
+ *
+ * petri -count 3 -anychan 1 -minlifespan 100000 \
+ * -instantdeathchan 0
+ *
+ * petri -minlifespeed 0.02 -maxlifespeed 0.03 -minlifespan 1 \
+ * -maxlifespan 1 -instantdeathchan 0 -minorchan 0 \
+ * -anychan 0.3 -delay 4000
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+
+#define FLOAT float
+#define RAND_FLOAT (((FLOAT) (random() & 0xffff)) / ((FLOAT) 0x10000))
+
+typedef struct cell_s
+{
+ unsigned char col; /* 0 */
+ unsigned char isnext; /* 1 */
+ unsigned char nextcol; /* 2 */
+ /* 3 */
+ struct cell_s *next; /* 4 */
+ struct cell_s *prev; /* 8 - */
+ FLOAT speed; /* 12 */
+ FLOAT growth; /* 16 20 - */
+ FLOAT nextspeed; /* 20 28 */
+ /* 24 36 - */
+} cell;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int arr_width;
+ int arr_height;
+ int count;
+
+ cell *arr;
+ cell *head;
+ cell *tail;
+ int blastcount;
+
+ GC *coloredGCs;
+
+ int windowWidth;
+ int windowHeight;
+ int xOffset;
+ int yOffset;
+ int xSize;
+ int ySize;
+
+ FLOAT orthlim;
+ FLOAT diaglim;
+ FLOAT anychan;
+ FLOAT minorchan;
+ FLOAT instantdeathchan;
+ int minlifespan;
+ int maxlifespan;
+ FLOAT minlifespeed;
+ FLOAT maxlifespeed;
+ FLOAT mindeathspeed;
+ FLOAT maxdeathspeed;
+ Bool originalcolors;
+
+ int warned;
+ int delay;
+};
+
+
+#define cell_x(c) (st->arr_width ? ((c) - st->arr) % st->arr_width : 0)
+#define cell_y(c) (st->arr_width ? ((c) - st->arr) / st->arr_width : 0)
+
+
+static int random_life_value (struct state *st)
+{
+ return (int) ((RAND_FLOAT * (st->maxlifespan - st->minlifespan)) + st->minlifespan);
+}
+
+static void setup_random_colormap (struct state *st, XWindowAttributes *xgwa)
+{
+ XGCValues gcv;
+ int lose = 0;
+ int ncolors = st->count - 1;
+ int n;
+ XColor *colors = (XColor *) calloc (sizeof(*colors), st->count*2);
+
+ colors[0].pixel = get_pixel_resource (st->dpy, xgwa->colormap,
+ "background", "Background");
+
+ make_random_colormap (xgwa->screen, xgwa->visual, xgwa->colormap,
+ colors+1, &ncolors, True, True, 0, True);
+ if (ncolors < 1)
+ {
+ fprintf (stderr, "%s: couldn't allocate any colors\n", progname);
+ exit (-1);
+ }
+
+ ncolors++;
+ st->count = ncolors;
+
+ memcpy (colors + st->count, colors, st->count * sizeof(*colors));
+ colors[st->count].pixel = get_pixel_resource (st->dpy, xgwa->colormap,
+ "foreground", "Foreground");
+
+ for (n = 1; n < st->count; n++)
+ {
+ int m = n + st->count;
+ colors[n].red = colors[m].red / 2;
+ colors[n].green = colors[m].green / 2;
+ colors[n].blue = colors[m].blue / 2;
+
+ if (!XAllocColor (st->dpy, xgwa->colormap, &colors[n]))
+ {
+ lose++;
+ colors[n] = colors[m];
+ }
+ }
+
+ if (lose)
+ {
+ fprintf (stderr,
+ "%s: unable to allocate %d half-intensity colors.\n",
+ progname, lose);
+ }
+
+ for (n = 0; n < st->count*2; n++)
+ {
+ gcv.foreground = colors[n].pixel;
+ st->coloredGCs[n] = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ }
+
+ free (colors);
+}
+
+static void setup_original_colormap (struct state *st, XWindowAttributes *xgwa)
+{
+ XGCValues gcv;
+ int lose = 0;
+ int n;
+ XColor *colors = (XColor *) calloc (sizeof(*colors), st->count*2);
+
+ colors[0].pixel = get_pixel_resource (st->dpy, xgwa->colormap,
+ "background", "Background");
+
+ colors[st->count].pixel = get_pixel_resource (st->dpy, xgwa->colormap,
+ "foreground", "Foreground");
+
+ for (n = 1; n < st->count; n++)
+ {
+ int m = n + st->count;
+ colors[n].red = ((n & 0x01) != 0) * 0x8000;
+ colors[n].green = ((n & 0x02) != 0) * 0x8000;
+ colors[n].blue = ((n & 0x04) != 0) * 0x8000;
+
+ if (!XAllocColor (st->dpy, xgwa->colormap, &colors[n]))
+ {
+ lose++;
+ colors[n] = colors[0];
+ }
+
+ colors[m].red = colors[n].red + 0x4000;
+ colors[m].green = colors[n].green + 0x4000;
+ colors[m].blue = colors[n].blue + 0x4000;
+
+ if (!XAllocColor (st->dpy, xgwa->colormap, &colors[m]))
+ {
+ lose++;
+ colors[m] = colors[st->count];
+ }
+ }
+
+ if (lose)
+ {
+ fprintf (stderr,
+ "%s: unable to allocate %d colors.\n",
+ progname, lose);
+ }
+
+ for (n = 0; n < st->count*2; n++)
+ {
+ gcv.foreground = colors[n].pixel;
+ st->coloredGCs[n] = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ }
+
+ free (colors);
+}
+
+static void
+setup_display (struct state *st)
+{
+ XWindowAttributes xgwa;
+
+ int cell_size = get_integer_resource (st->dpy, "size", "Integer");
+ int osize, alloc_size, oalloc;
+ int mem_throttle = 0;
+ char *s;
+
+ if (cell_size < 1) cell_size = 1;
+
+ osize = cell_size;
+
+ s = get_string_resource (st->dpy, "memThrottle", "MemThrottle");
+ if (s)
+ {
+ int n;
+ char c;
+ if (1 == sscanf (s, " %d M %c", &n, &c) ||
+ 1 == sscanf (s, " %d m %c", &n, &c))
+ mem_throttle = n * (1 << 20);
+ else if (1 == sscanf (s, " %d K %c", &n, &c) ||
+ 1 == sscanf (s, " %d k %c", &n, &c))
+ mem_throttle = n * (1 << 10);
+ else if (1 == sscanf (s, " %d %c", &n, &c))
+ mem_throttle = n;
+ else
+ {
+ fprintf (stderr, "%s: invalid memThrottle \"%s\" (try \"10M\")\n",
+ progname, s);
+ exit (1);
+ }
+
+ free (s);
+ }
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->originalcolors = get_boolean_resource (st->dpy, "originalcolors", "Boolean");
+
+ st->count = get_integer_resource (st->dpy, "count", "Integer");
+ if (st->count < 2) st->count = 2;
+
+ /* number of colors can't be greater than the half depth of the screen. */
+ if (st->count > (unsigned int) (1L << (xgwa.depth-1)))
+ st->count = (unsigned int) (1L << (xgwa.depth-1));
+
+ /* Actually, since cell->col is of type char, this has to be small. */
+ if (st->count >= (unsigned int) (1L << ((sizeof(st->arr[0].col) * 8) - 1)))
+ st->count = (unsigned int) (1L << ((sizeof(st->arr[0].col) * 8) - 1));
+
+
+ if (st->originalcolors && (st->count > 8))
+ {
+ st->count = 8;
+ }
+
+ st->coloredGCs = (GC *) calloc (sizeof(GC), st->count * 2);
+
+ st->diaglim = get_float_resource (st->dpy, "diaglim", "Float");
+ if (st->diaglim < 1.0)
+ {
+ st->diaglim = 1.0;
+ }
+ else if (st->diaglim > 2.0)
+ {
+ st->diaglim = 2.0;
+ }
+ st->diaglim *= st->orthlim;
+
+ st->anychan = get_float_resource (st->dpy, "anychan", "Float");
+ if (st->anychan < 0.0)
+ {
+ st->anychan = 0.0;
+ }
+ else if (st->anychan > 1.0)
+ {
+ st->anychan = 1.0;
+ }
+
+ st->minorchan = get_float_resource (st->dpy, "minorchan","Float");
+ if (st->minorchan < 0.0)
+ {
+ st->minorchan = 0.0;
+ }
+ else if (st->minorchan > 1.0)
+ {
+ st->minorchan = 1.0;
+ }
+
+ st->instantdeathchan = get_float_resource (st->dpy, "instantdeathchan","Float");
+ if (st->instantdeathchan < 0.0)
+ {
+ st->instantdeathchan = 0.0;
+ }
+ else if (st->instantdeathchan > 1.0)
+ {
+ st->instantdeathchan = 1.0;
+ }
+
+ st->minlifespan = get_integer_resource (st->dpy, "minlifespan", "Integer");
+ if (st->minlifespan < 1)
+ {
+ st->minlifespan = 1;
+ }
+
+ st->maxlifespan = get_integer_resource (st->dpy, "maxlifespan", "Integer");
+ if (st->maxlifespan < st->minlifespan)
+ {
+ st->maxlifespan = st->minlifespan;
+ }
+
+ st->minlifespeed = get_float_resource (st->dpy, "minlifespeed", "Float");
+ if (st->minlifespeed < 0.0)
+ {
+ st->minlifespeed = 0.0;
+ }
+ else if (st->minlifespeed > 1.0)
+ {
+ st->minlifespeed = 1.0;
+ }
+
+ st->maxlifespeed = get_float_resource (st->dpy, "maxlifespeed", "Float");
+ if (st->maxlifespeed < st->minlifespeed)
+ {
+ st->maxlifespeed = st->minlifespeed;
+ }
+ else if (st->maxlifespeed > 1.0)
+ {
+ st->maxlifespeed = 1.0;
+ }
+
+ st->mindeathspeed = get_float_resource (st->dpy, "mindeathspeed", "Float");
+ if (st->mindeathspeed < 0.0)
+ {
+ st->mindeathspeed = 0.0;
+ }
+ else if (st->mindeathspeed > 1.0)
+ {
+ st->mindeathspeed = 1.0;
+ }
+
+ st->maxdeathspeed = get_float_resource (st->dpy, "maxdeathspeed", "Float");
+ if (st->maxdeathspeed < st->mindeathspeed)
+ {
+ st->maxdeathspeed = st->mindeathspeed;
+ }
+ else if (st->maxdeathspeed > 1.0)
+ {
+ st->maxdeathspeed = 1.0;
+ }
+
+ st->minlifespeed *= st->diaglim;
+ st->maxlifespeed *= st->diaglim;
+ st->mindeathspeed *= st->diaglim;
+ st->maxdeathspeed *= st->diaglim;
+
+ st->windowWidth = xgwa.width;
+ st->windowHeight = xgwa.height;
+
+ st->arr_width = st->windowWidth / cell_size;
+ st->arr_height = st->windowHeight / cell_size;
+
+ alloc_size = sizeof(cell) * st->arr_width * st->arr_height;
+ oalloc = alloc_size;
+
+ if (mem_throttle > 0)
+ while (cell_size < st->windowWidth/10 &&
+ cell_size < st->windowHeight/10 &&
+ alloc_size > mem_throttle)
+ {
+ cell_size++;
+ st->arr_width = st->windowWidth / cell_size;
+ st->arr_height = st->windowHeight / cell_size;
+ alloc_size = sizeof(cell) * st->arr_width * st->arr_height;
+ }
+
+ if (osize != cell_size)
+ {
+ if (!st->warned)
+ {
+ fprintf (stderr,
+ "%s: throttling cell size from %d to %d because of %dM limit.\n",
+ progname, osize, cell_size, mem_throttle / (1 << 20));
+ fprintf (stderr, "%s: %dx%dx%d = %.1fM, %dx%dx%d = %.1fM.\n",
+ progname,
+ st->windowWidth, st->windowHeight, osize,
+ ((float) oalloc) / (1 << 20),
+ st->windowWidth, st->windowHeight, cell_size,
+ ((float) alloc_size) / (1 << 20));
+ st->warned = 1;
+ }
+ }
+
+ st->xSize = st->arr_width ? st->windowWidth / st->arr_width : 0;
+ st->ySize = st->arr_height ? st->windowHeight / st->arr_height : 0;
+ if (st->xSize > st->ySize)
+ {
+ st->xSize = st->ySize;
+ }
+ else
+ {
+ st->ySize = st->xSize;
+ }
+
+ st->xOffset = (st->windowWidth - (st->arr_width * st->xSize)) / 2;
+ st->yOffset = (st->windowHeight - (st->arr_height * st->ySize)) / 2;
+
+ if (st->originalcolors)
+ {
+ setup_original_colormap (st, &xgwa);
+ }
+ else
+ {
+ setup_random_colormap (st, &xgwa);
+ }
+}
+
+static void drawblock (struct state *st, int x, int y, unsigned char c)
+{
+ if (st->xSize == 1 && st->ySize == 1)
+ XDrawPoint (st->dpy, st->window, st->coloredGCs[c], x + st->xOffset, y + st->yOffset);
+ else
+ XFillRectangle (st->dpy, st->window, st->coloredGCs[c],
+ x * st->xSize + st->xOffset, y * st->ySize + st->yOffset,
+ st->xSize, st->ySize);
+}
+
+static void setup_arr (struct state *st)
+{
+ int x, y;
+
+ if (st->arr != NULL)
+ {
+ free (st->arr);
+ }
+
+ XFillRectangle (st->dpy, st->window, st->coloredGCs[0], 0, 0,
+ st->windowWidth, st->windowHeight);
+
+ if (!st->arr_width) st->arr_width = 1;
+ if (!st->arr_height) st->arr_height = 1;
+
+ st->arr = (cell *) calloc (sizeof(cell), st->arr_width * st->arr_height);
+ if (!st->arr)
+ {
+ fprintf (stderr, "%s: out of memory allocating %dx%d grid\n",
+ progname, st->arr_width, st->arr_height);
+ exit (1);
+ }
+
+ for (y = 0; y < st->arr_height; y++)
+ {
+ int row = y * st->arr_width;
+ for (x = 0; x < st->arr_width; x++)
+ {
+ st->arr[row+x].speed = 0.0;
+ st->arr[row+x].growth = 0.0;
+ st->arr[row+x].col = 0;
+ st->arr[row+x].isnext = 0;
+ st->arr[row+x].next = 0;
+ st->arr[row+x].prev = 0;
+ }
+ }
+
+ if (st->head == NULL)
+ {
+ st->head = (cell *) malloc (sizeof (cell));
+ }
+
+ if (st->tail == NULL)
+ {
+ st->tail = (cell *) malloc (sizeof (cell));
+ }
+
+ st->head->next = st->tail;
+ st->head->prev = st->head;
+ st->tail->next = st->tail;
+ st->tail->prev = st->head;
+
+ st->blastcount = random_life_value (st);
+}
+
+static void newcell (struct state *st, cell *c, unsigned char col, FLOAT sp)
+{
+ if (! c) return;
+
+ if (c->col == col) return;
+
+ c->nextcol = col;
+ c->nextspeed = sp;
+ c->isnext = 1;
+
+ if (c->prev == 0) {
+ c->next = st->head->next;
+ c->prev = st->head;
+ st->head->next = c;
+ c->next->prev = c;
+ }
+}
+
+static void killcell (struct state *st, cell *c)
+{
+ c->prev->next = c->next;
+ c->next->prev = c->prev;
+ c->prev = 0;
+ c->speed = 0.0;
+ drawblock (st, cell_x(c), cell_y(c), c->col);
+}
+
+
+static void randblip (struct state *st, int doit)
+{
+ int n;
+ int b = 0;
+ if (!doit
+ && (st->blastcount-- >= 0)
+ && (RAND_FLOAT > st->anychan))
+ {
+ return;
+ }
+
+ if (st->blastcount < 0)
+ {
+ b = 1;
+ n = 2;
+ st->blastcount = random_life_value (st);
+ if (RAND_FLOAT < st->instantdeathchan)
+ {
+ /* clear everything every so often to keep from getting into a
+ * rut */
+ setup_arr (st);
+ b = 0;
+ }
+ }
+ else if (RAND_FLOAT <= st->minorchan)
+ {
+ n = 2;
+ }
+ else
+ {
+ n = random () % 3 + 3;
+ }
+
+ while (n--)
+ {
+ int x = st->arr_width ? random () % st->arr_width : 0;
+ int y = st->arr_height ? random () % st->arr_height : 0;
+ int c;
+ FLOAT s;
+ if (b)
+ {
+ c = 0;
+ s = RAND_FLOAT * (st->maxdeathspeed - st->mindeathspeed) + st->mindeathspeed;
+ }
+ else
+ {
+ c = ((st->count - 1) ? random () % (st->count-1) : 0) + 1;
+ s = RAND_FLOAT * (st->maxlifespeed - st->minlifespeed) + st->minlifespeed;
+ }
+ newcell (st, &st->arr[y * st->arr_width + x], c, s);
+ }
+}
+
+static void update (struct state *st)
+{
+ cell *a;
+
+ for (a = st->head->next; a != st->tail; a = a->next)
+ {
+ static const XPoint all_coords[] = {{-1, -1}, {-1, 1}, {1, -1}, {1, 1},
+ {-1, 0}, { 1, 0}, {0, -1}, {0, 1},
+ {99, 99}};
+
+ const XPoint *coords = 0;
+
+ if (a->speed == 0) continue;
+ a->growth += a->speed;
+
+ if (a->growth >= st->diaglim)
+ {
+ coords = all_coords;
+ }
+ else if (a->growth >= st->orthlim)
+ {
+ coords = &all_coords[4];
+ }
+ else
+ {
+ continue;
+ }
+
+ while (coords->x != 99)
+ {
+ int x = cell_x(a) + coords->x;
+ int y = cell_y(a) + coords->y;
+ coords++;
+
+ if (x < 0) x = st->arr_width - 1;
+ else if (x >= st->arr_width) x = 0;
+
+ if (y < 0) y = st->arr_height - 1;
+ else if (y >= st->arr_height) y = 0;
+
+ newcell (st, &st->arr[y * st->arr_width + x], a->col, a->speed);
+ }
+
+ if (a->growth >= st->diaglim)
+ killcell (st, a);
+ }
+
+ randblip (st, (st->head->next) == st->tail);
+
+ for (a = st->head->next; a != st->tail; a = a->next)
+ {
+ if (a->isnext)
+ {
+ a->isnext = 0;
+ a->speed = a->nextspeed;
+ a->growth = 0.0;
+ a->col = a->nextcol;
+ drawblock (st, cell_x(a), cell_y(a), a->col + st->count);
+ }
+ }
+}
+
+static void *
+petri_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = win;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ st->orthlim = 1;
+
+ setup_display (st);
+ setup_arr (st);
+ randblip (st, 1);
+
+ return st;
+}
+
+static unsigned long
+petri_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ update (st);
+ return st->delay;
+}
+
+static void
+petri_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+petri_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+petri_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+static const char *petri_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 10000",
+ "*count: 20",
+ "*size: 2",
+ "*diaglim: 1.414",
+ "*anychan: 0.0015",
+ "*minorchan: 0.5",
+ "*instantdeathchan: 0.2",
+ "*minlifespan: 500",
+ "*maxlifespan: 1500",
+ "*minlifespeed: 0.04",
+ "*maxlifespeed: 0.13",
+ "*mindeathspeed: 0.42",
+ "*maxdeathspeed: 0.46",
+ "*originalcolors: false",
+ "*memThrottle: 22M", /* don't malloc more than this much.
+ Scale the pixels up if necessary. */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec petri_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-diaglim", ".diaglim", XrmoptionSepArg, 0 },
+ { "-anychan", ".anychan", XrmoptionSepArg, 0 },
+ { "-minorchan", ".minorchan", XrmoptionSepArg, 0 },
+ { "-instantdeathchan", ".instantdeathchan", XrmoptionSepArg, 0 },
+ { "-minlifespan", ".minlifespan", XrmoptionSepArg, 0 },
+ { "-maxlifespan", ".maxlifespan", XrmoptionSepArg, 0 },
+ { "-minlifespeed", ".minlifespeed", XrmoptionSepArg, 0 },
+ { "-maxlifespeed", ".maxlifespeed", XrmoptionSepArg, 0 },
+ { "-mindeathspeed", ".mindeathspeed", XrmoptionSepArg, 0 },
+ { "-maxdeathspeed", ".maxdeathspeed", XrmoptionSepArg, 0 },
+ { "-originalcolors", ".originalcolors", XrmoptionNoArg, "true" },
+ { "-mem-throttle", ".memThrottle", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Petri", petri)
diff --git a/hacks/petri.man b/hacks/petri.man
new file mode 100644
index 0000000..b89230a
--- /dev/null
+++ b/hacks/petri.man
@@ -0,0 +1,129 @@
+.TH XScreenSaver 1 "06-Jul-2000" "X Version 11"
+.SH NAME
+petri - simulates mold growing in a petri dish
+.SH SYNOPSIS
+.B petri
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-size \fIinteger\fP] [\-mem-throttle \fIamount\fP] [\-count \fIinteger\fP] [\-originalcolors] [\-diaglim \fIreal\fP] [\-anychan \fIreal\fP] [\-minorchan \fIreal\fP] [\-instantdeathchan \fIreal\fP] [\-minlifespeed \fIreal\fP] [\-maxlifespeed \fIreal\fP] [\-mindeathspeed \fIreal\fP] [\-maxdeathspeed \fIreal\fP] [\-minlifespan \fIinteger\fP] [\-maxlifespan \fIinteger\fP]
+[\-fps]
+.SH DESCRIPTION
+\fIpetri\fP simulates mold growing in a petri dish via a state-heavy grid
+of automata (vaguely like Conway's Life, only with much more state per
+cell).
+.SH OPTIONS
+.I petri
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+The interframe delay, in microseconds. Defaults to 10000, resource
+\fIdelay\fP.
+.TP 8
+.B \-size \fIinteger\fP
+The size of a cell in pixels. Defaults to 4, resource \fIsize\fP.
+.TP 8
+.B \-mem-throttle \fIamount\fP
+The maximum amount of memory to consume, specified either in megabytes
+(suffix "M"), kilobytes (suffix "K"), or bytes (sans suffix). In order
+to meet the memory requirement, the cell size may be increased.
+Defaults to 22M, resource \fImemThrottle\fP.
+.TP 8
+.B \-count \fIinteger\fP
+How many different varieties of mold to grow (including Black Death).
+Defaults to 8, resource \fIcount\fP.
+.TP 8
+.B \-originalcolors
+If specified, indicates that the colors used should be the artist's
+original choices (a fixed set of primary and secondary colors). In this
+case, count must be 8 or less. Defaults to not specified (i.e., false),
+resource \fIoriginalcolors\fP.
+.TP 8
+.B \-diaglim \fIreal\fP
+The age limit for diagonal growth as a multiplier of
+orthogonal growth (range 1..2). 1 means square growth, 1.414
+(i.e., \fIsqrt(2)\fP) means approximately circular growth, 2 means
+diamond growth. Defaults to 1.414, resource \fIdiaglim\fP.
+.TP 8
+.B \-anychan \fIreal\fP
+The chance (range 0..1) that at each iteration, one or more
+new cells will be born. Defaults to 0.0015, resource \fIanychan\fP.
+.TP 8
+.B \-minorchan \fIreal\fP
+The chance (range 0..1) that, given that new cells will be born, that only
+two will be added (hence being a minor cell birth event).
+Defaults to 0.5, resource \fIminorchan\fP.
+.TP 8
+.B \-instantdeathchan \fIreal\fP
+The chance (range 0..1) that, given that death and destruction will happen,
+that instead of using Black Death cells, death will come instantaneously.
+Defaults to 0.2, resource \fIinstantdeathchan\fP.
+.TP 8
+.B \-minlifespeed \fIreal\fP
+The minimum speed for living cells as a fraction of the maximum possible
+speed (range 0..1). Defaults to 0.04, resource \fIminlifespeed\fP.
+.TP 8
+.B \-maxlifespeed \fIreal\fP
+The maximum speed for living cells as a fraction of the maximum possible
+speed (range 0..1). Defaults to 0.13, resource \fImaxlifespeed\fP.
+.TP 8
+.B \-mindeathspeed \fIreal\fP
+The minimum speed for Black Death cells as a fraction of the maximum possible
+speed (range 0..1). Defaults to 0.42, resource \fImindeathspeed\fP.
+.TP 8
+.B \-maxdeathspeed \fIreal\fP
+The maximum speed for Black Death cells as a fraction of the maximum possible
+speed (range 0..1). Defaults to 0.46, resource \fImaxdeathspeed\fP.
+.TP 8
+.B \-minlifespan \fIinteger\fP
+The minimum lifespan for a colony, in iterations, before Black Death
+comes. Defaults to 500, resource \fIminlifespan\fP.
+.TP 8
+.B \-maxlifespan \fIinteger\fP
+The maximum lifespan for a colony, in iterations, before Black Death
+comes. Defaults to 1500, resource \fImaxlifespan\fP.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+There are resource equivalents for each option, noted above.
+.SH BUGS
+There are no known bugs in
+.I petri
+as of this writing.
+.SH SEE ALSO
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992-2000 by Dan Bornstein.
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of this
+software for any purpose. It is provided "as is" without express or
+implied warranty.
+.SH AUTHOR
+Dan Bornstein <danfuzz@milk.com>, 06-Jul-2000.
diff --git a/hacks/phosphor.c b/hacks/phosphor.c
new file mode 100644
index 0000000..2e57b86
--- /dev/null
+++ b/hacks/phosphor.c
@@ -0,0 +1,1451 @@
+/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Phosphor -- simulate a glass tty with long-sustain phosphor.
+ * Written by Jamie Zawinski <jwz@jwz.org>
+ * Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h>
+#endif
+
+#include "screenhack.h"
+#include "textclient.h"
+#include "ximage-loader.h"
+#include "utf8wc.h"
+
+#define FUZZY_BORDER
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+#define BLANK 0
+#define FLARE 1
+#define NORMAL 2
+#define FADE 3
+#define STATE_MAX FADE
+
+#define CURSOR_INDEX 128
+
+#define NPAR 16
+
+#define BUILTIN_FONT
+
+#ifdef BUILTIN_FONT
+# include "images/gen/6x10font_png.h"
+#endif /* BUILTIN_FONT */
+
+typedef struct {
+ unsigned char name;
+ int width, height;
+ Pixmap pixmap;
+#ifdef FUZZY_BORDER
+ Pixmap pixmap2;
+#endif /* FUZZY_BORDER */
+ Bool blank_p;
+} p_char;
+
+typedef struct {
+ p_char *p_char;
+ int state;
+ Bool changed;
+} p_cell;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ XFontStruct *font;
+ const char *program;
+ int grid_width, grid_height;
+ int char_width, char_height;
+ int xmargin, ymargin;
+ int saved_x, saved_y;
+ int scale;
+ int ticks;
+ int mode;
+
+ int escstate;
+ int csiparam[NPAR];
+ int curparam;
+ int unicruds; unsigned char unicrud[7];
+
+ p_char **chars;
+ p_cell *cells;
+ XGCValues gcv;
+ GC gc0;
+ GC gc1;
+#ifdef FUZZY_BORDER
+ GC gc2;
+#endif /* FUZZY_BORDER */
+ GC *gcs;
+ XImage *font_bits;
+
+ int cursor_x, cursor_y;
+ XtIntervalId cursor_timer;
+ Time cursor_blink;
+ int delay;
+ Bool pty_p;
+
+ text_data *tc;
+
+ char last_c;
+ int bk;
+
+} p_state;
+
+
+static void capture_font_bits (p_state *state);
+static p_char *make_character (p_state *state, int c);
+static void char_to_pixmap (p_state *state, p_char *pc, int c);
+
+
+/* About font metrics:
+
+ "lbearing" is the distance from the leftmost pixel of a character to
+ the logical origin of that character. That is, it is the number of
+ pixels of the character which are to the left of its logical origin.
+
+ "rbearing" is the distance from the logical origin of a character to
+ the rightmost pixel of a character. That is, it is the number of
+ pixels of the character to the right of its logical origin.
+
+ "descent" is the distance from the bottommost pixel of a character to
+ the logical baseline. That is, it is the number of pixels of the
+ character which are below the baseline.
+
+ "ascent" is the distance from the logical baseline to the topmost pixel.
+ That is, it is the number of pixels of the character above the baseline.
+
+ Therefore, the bounding box of the "ink" of a character is
+ lbearing + rbearing by ascent + descent;
+
+ "width" is the distance from the logical origin of this character to
+ the position where the logical orgin of the next character should be
+ placed.
+
+ For our purposes, we're only interested in the part of the character
+ lying inside the "width" box. If the characters have ink outside of
+ that box (the "charcell" box) then we're going to lose it. Alas.
+ */
+
+
+static void clear (p_state *);
+static void set_cursor (p_state *, Bool on);
+
+static unsigned short scale_color_channel (unsigned short ch1, unsigned short ch2)
+{
+ return (ch1 * 100 + ch2 * 156) >> 8;
+}
+
+#define FONT6x10_WIDTH (256*7)
+#define FONT6x10_HEIGHT 10
+
+static void *
+phosphor_init (Display *dpy, Window window)
+{
+ int i;
+ unsigned long flags;
+ p_state *state = (p_state *) calloc (sizeof(*state), 1);
+ char *fontname = get_string_resource (dpy, "font", "Font");
+ XFontStruct *font;
+
+ state->dpy = dpy;
+ state->window = window;
+
+ XGetWindowAttributes (dpy, window, &state->xgwa);
+/* XSelectInput (dpy, window, state->xgwa.your_event_mask | ExposureMask);*/
+
+ state->delay = get_integer_resource (dpy, "delay", "Integer");
+ state->pty_p = get_boolean_resource (dpy, "usePty", "UsePty");
+
+ if (!strcasecmp (fontname, "builtin") ||
+ !strcasecmp (fontname, "(builtin)"))
+ {
+#ifndef BUILTIN_FONT
+ fprintf (stderr, "%s: no builtin font\n", progname);
+ state->font = load_font_retry (dpy, "fixed");
+#endif /* !BUILTIN_FONT */
+ }
+ else
+ {
+ state->font = load_font_retry (dpy, fontname);
+ if (!state->font) abort();
+ }
+
+ font = state->font;
+ state->scale = get_integer_resource (dpy, "scale", "Integer");
+ state->ticks = STATE_MAX + get_integer_resource (dpy, "ticks", "Integer");
+ state->escstate = 0;
+
+ if (state->xgwa.width > 2560) state->scale *= 2; /* Retina displays */
+
+ state->cursor_blink = get_integer_resource (dpy, "cursor", "Time");
+
+# ifdef BUILTIN_FONT
+ if (! font)
+ {
+ state->char_width = (FONT6x10_WIDTH / 256) - 1;
+ state->char_height = FONT6x10_HEIGHT;
+ }
+ else
+# endif /* BUILTIN_FONT */
+ {
+ state->char_width = font->max_bounds.width;
+ state->char_height = font->max_bounds.ascent + font->max_bounds.descent;
+ }
+
+# ifdef USE_IPHONE
+ /* Stupid iPhone X bezel.
+ #### This is the worst of all possible ways to do this! But how else?
+ */
+ if (state->xgwa.width == 2436 || state->xgwa.height == 2436) {
+ state->xmargin = 96;
+ state->ymargin = state->xmargin;
+ }
+# endif
+
+ state->grid_width = ((state->xgwa.width - state->xmargin * 2) /
+ (state->char_width * state->scale));
+ state->grid_height = ((state->xgwa.height - state->ymargin * 2) /
+ (state->char_height * state->scale));
+ state->cells = (p_cell *) calloc (sizeof(p_cell),
+ state->grid_width * state->grid_height);
+ state->chars = (p_char **) calloc (sizeof(p_char *), 256);
+
+ state->gcs = (GC *) calloc (sizeof(GC), state->ticks + 1);
+
+ {
+ int ncolors = MAX (1, state->ticks - 3);
+ XColor *colors = (XColor *) calloc (ncolors, sizeof(XColor));
+ int h1, h2;
+ double s1, s2, v1, v2;
+
+ unsigned long fg = get_pixel_resource (state->dpy, state->xgwa.colormap,
+ "foreground", "Foreground");
+ unsigned long bg = get_pixel_resource (state->dpy, state->xgwa.colormap,
+ "background", "Background");
+ unsigned long flare = fg;
+
+ XColor fg_color, bg_color;
+
+ fg_color.pixel = fg;
+ XQueryColor (state->dpy, state->xgwa.colormap, &fg_color);
+
+ bg_color.pixel = bg;
+ XQueryColor (state->dpy, state->xgwa.colormap, &bg_color);
+
+ /* Now allocate a ramp of colors from the main color to the background. */
+ rgb_to_hsv (scale_color_channel(fg_color.red, bg_color.red),
+ scale_color_channel(fg_color.green, bg_color.green),
+ scale_color_channel(fg_color.blue, bg_color.blue),
+ &h1, &s1, &v1);
+ rgb_to_hsv (bg_color.red, bg_color.green, bg_color.blue, &h2, &s2, &v2);
+
+ /* Avoid rainbow effects when fading to black/grey/white. */
+ if (s2 < 0.003)
+ h2 = h1;
+ if (s1 < 0.003)
+ h1 = h2;
+
+ make_color_ramp (state->xgwa.screen, state->xgwa.visual,
+ state->xgwa.colormap,
+ h1, s1, v1,
+ h2, s2, v2,
+ colors, &ncolors,
+ False, True, False);
+
+ /* Adjust to the number of colors we actually got. */
+ state->ticks = ncolors + STATE_MAX;
+
+ /* If the foreground is brighter than the background, the flare is white.
+ * Otherwise, the flare is left at the foreground color (i.e. no flare). */
+ rgb_to_hsv (fg_color.red, fg_color.green, fg_color.blue, &h1, &s1, &v1);
+ if (v2 <= v1)
+ {
+ XColor white;
+ /* WhitePixel is only for the default visual, which can be overridden
+ * on the command line. */
+ white.red = 0xffff;
+ white.green = 0xffff;
+ white.blue = 0xffff;
+ if (XAllocColor(state->dpy, state->xgwa.colormap, &white))
+ flare = white.pixel;
+ }
+
+ /* Now, GCs all around.
+ */
+ state->gcv.font = (font ? font->fid : 0);
+ state->gcv.cap_style = CapRound;
+#ifdef FUZZY_BORDER
+ state->gcv.line_width = (int) (((long) state->scale) * 1.3);
+ if (state->gcv.line_width == state->scale)
+ state->gcv.line_width++;
+#else /* !FUZZY_BORDER */
+ state->gcv.line_width = (int) (((long) state->scale) * 0.9);
+ if (state->gcv.line_width >= state->scale)
+ state->gcv.line_width = state->scale - 1;
+ if (state->gcv.line_width < 1)
+ state->gcv.line_width = 1;
+#endif /* !FUZZY_BORDER */
+
+ flags = (GCForeground | GCBackground | GCCapStyle | GCLineWidth);
+
+ state->gcv.background = bg;
+ state->gcv.foreground = bg;
+ state->gcs[BLANK] = XCreateGC (state->dpy, state->window, flags,
+ &state->gcv);
+
+ state->gcv.foreground = flare;
+ state->gcs[FLARE] = XCreateGC (state->dpy, state->window, flags,
+ &state->gcv);
+
+ state->gcv.foreground = fg;
+ state->gcs[NORMAL] = XCreateGC (state->dpy, state->window, flags,
+ &state->gcv);
+
+ for (i = 0; i < ncolors; i++)
+ {
+ state->gcv.foreground = colors[i].pixel;
+ state->gcs[STATE_MAX + i] = XCreateGC (state->dpy, state->window,
+ flags, &state->gcv);
+ }
+ }
+
+ capture_font_bits (state);
+
+ set_cursor (state, True);
+
+/* clear (state);*/
+
+ state->tc = textclient_open (dpy);
+ textclient_reshape (state->tc,
+ state->xgwa.width - state->xmargin * 2,
+ state->xgwa.height - state->ymargin * 2,
+ state->grid_width - 1,
+ state->grid_height - 1,
+ 0);
+
+ return state;
+}
+
+
+/* Re-query the window size and update the internal character grid if changed.
+ */
+static Bool
+resize_grid (p_state *state)
+{
+ int ow = state->grid_width;
+ int oh = state->grid_height;
+ p_cell *ocells = state->cells;
+ int x, y;
+
+ XGetWindowAttributes (state->dpy, state->window, &state->xgwa);
+
+ /* Would like to ensure here that
+ state->char_height * state->scale <= state->xgwa.height
+ but changing scale requires regenerating the bitmaps. */
+
+ state->grid_width = ((state->xgwa.width - state->xmargin * 2) /
+ (state->char_width * state->scale));
+ state->grid_height = ((state->xgwa.height - state->ymargin * 2) /
+ (state->char_height * state->scale));
+
+ if (state->grid_width < 2) state->grid_width = 2;
+ if (state->grid_height < 2) state->grid_height = 2;
+
+ if (ow == state->grid_width &&
+ oh == state->grid_height)
+ return False;
+
+ state->cells = (p_cell *) calloc (sizeof(p_cell),
+ state->grid_width * state->grid_height);
+
+ for (y = 0; y < state->grid_height; y++)
+ {
+ for (x = 0; x < state->grid_width; x++)
+ {
+ p_cell *ncell = &state->cells [state->grid_width * y + x];
+ if (x < ow && y < oh)
+ *ncell = ocells [ow * y + x];
+ ncell->changed = True;
+ }
+ }
+
+ if (state->cursor_x >= state->grid_width)
+ state->cursor_x = state->grid_width-1;
+ if (state->cursor_y >= state->grid_height)
+ state->cursor_y = state->grid_height-1;
+
+ free (ocells);
+ return True;
+}
+
+
+static void
+capture_font_bits (p_state *state)
+{
+ XFontStruct *font = state->font;
+ int safe_width, height;
+ unsigned char string[257];
+ int i;
+ Pixmap p;
+
+# ifdef BUILTIN_FONT
+ Pixmap p2 = 0;
+
+ if (!font)
+ {
+ safe_width = state->char_width + 1;
+ height = state->char_height;
+
+ int pix_w, pix_h;
+ XWindowAttributes xgwa;
+ Pixmap m = 0;
+ Pixmap p = image_data_to_pixmap (state->dpy, state->window,
+ _6x10font_png, sizeof(_6x10font_png),
+ &pix_w, &pix_h, &m);
+ XImage *im = XGetImage (state->dpy, p, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
+ XImage *mm = XGetImage (state->dpy, m, 0, 0, pix_w, pix_h, 1, XYPixmap);
+ XImage *im2;
+ int x, y;
+ XGCValues gcv;
+ GC gc;
+ unsigned long black =
+ BlackPixelOfScreen (DefaultScreenOfDisplay (state->dpy));
+
+ XFreePixmap (state->dpy, p);
+ XFreePixmap (state->dpy, m);
+ if (pix_w != 256*7) abort();
+ if (pix_h != 10) abort();
+ if (pix_w != FONT6x10_WIDTH) abort();
+ if (pix_h != FONT6x10_HEIGHT) abort();
+
+ XGetWindowAttributes (state->dpy, state->window, &xgwa);
+ im2 = XCreateImage (state->dpy, xgwa.visual, 1, XYBitmap, 0, 0,
+ pix_w, pix_h, 8, 0);
+ im2->data = malloc (im2->bytes_per_line * im2->height);
+
+ /* Convert deep image to 1 bit */
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ XPutPixel (im2, x, y,
+ (XGetPixel (mm, x, y)
+ ? (XGetPixel (im, x, y) == black)
+ : 0));
+
+ XDestroyImage (im);
+ XDestroyImage (mm);
+ im = 0;
+
+ p2 = XCreatePixmap (state->dpy, state->window,
+ im2->width, im2->height, im2->depth);
+ gcv.foreground = 1;
+ gcv.background = 0;
+ gc = XCreateGC (state->dpy, p2, GCForeground|GCBackground, &gcv);
+ XPutImage (state->dpy, p2, gc, im2, 0, 0, 0, 0, im2->width, im2->height);
+ XFreeGC (state->dpy, gc);
+ XDestroyImage (im2);
+ }
+ else
+# endif /* BUILTIN_FONT */
+ {
+ safe_width = font->max_bounds.rbearing - font->min_bounds.lbearing;
+ height = state->char_height;
+ }
+
+ p = XCreatePixmap (state->dpy, state->window,
+ (safe_width * 256), height, 1);
+
+ for (i = 0; i < 256; i++)
+ string[i] = (unsigned char) i;
+ string[256] = 0;
+
+ state->gcv.foreground = 0;
+ state->gcv.background = 0;
+ state->gc0 = XCreateGC (state->dpy, p,
+ (GCForeground | GCBackground),
+ &state->gcv);
+
+ state->gcv.foreground = 1;
+ state->gc1 = XCreateGC (state->dpy, p,
+ ((font ? GCFont : 0) |
+ GCForeground | GCBackground |
+ GCCapStyle | GCLineWidth),
+ &state->gcv);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (state->dpy, state->gc0, False);
+ jwxyz_XSetAntiAliasing (state->dpy, state->gc1, False);
+#endif
+
+#ifdef FUZZY_BORDER
+ {
+ state->gcv.line_width = (int) (((long) state->scale) * 0.8);
+ if (state->gcv.line_width >= state->scale)
+ state->gcv.line_width = state->scale - 1;
+ if (state->gcv.line_width < 1)
+ state->gcv.line_width = 1;
+ state->gc2 = XCreateGC (state->dpy, p,
+ ((font ? GCFont : 0) |
+ GCForeground | GCBackground |
+ GCCapStyle | GCLineWidth),
+ &state->gcv);
+ }
+#endif /* FUZZY_BORDER */
+
+ XFillRectangle (state->dpy, p, state->gc0, 0, 0, (safe_width * 256), height);
+
+# ifdef BUILTIN_FONT
+ if (p2)
+ {
+ XCopyPlane (state->dpy, p2, p, state->gc1,
+ 0, 0, FONT6x10_WIDTH, FONT6x10_HEIGHT,
+ 0, 0, 1);
+ XFreePixmap (state->dpy, p2);
+ }
+ else
+# endif /* BUILTIN_FONT */
+ {
+ for (i = 0; i < 256; i++)
+ {
+ if (string[i] < font->min_char_or_byte2 ||
+ string[i] > font->max_char_or_byte2)
+ continue;
+ XDrawString (state->dpy, p, state->gc1,
+ i * safe_width, font->ascent,
+ (char *) (string + i), 1);
+ }
+ }
+
+ /* Draw the cursor. */
+ XFillRectangle (state->dpy, p, state->gc1,
+ (CURSOR_INDEX * safe_width), 1,
+ (font
+ ? (font->per_char
+ ? font->per_char['n'-font->min_char_or_byte2].width
+ : font->max_bounds.width)
+ : state->char_width),
+ (font
+ ? font->ascent - 1
+ : state->char_height));
+
+ state->font_bits = XGetImage (state->dpy, p, 0, 0,
+ (safe_width * 256), height, ~0L, XYPixmap);
+ XFreePixmap (state->dpy, p);
+
+ for (i = 0; i < 256; i++)
+ state->chars[i] = make_character (state, i);
+ state->chars[CURSOR_INDEX] = make_character (state, CURSOR_INDEX);
+}
+
+
+static p_char *
+make_character (p_state *state, int c)
+{
+ p_char *pc = (p_char *) malloc (sizeof (*pc));
+ pc->name = (unsigned char) c;
+ pc->width = state->scale * state->char_width;
+ pc->height = state->scale * state->char_height;
+ char_to_pixmap (state, pc, c);
+ return pc;
+}
+
+
+static void
+char_to_pixmap (p_state *state, p_char *pc, int c)
+{
+ Pixmap p = 0;
+ GC gc;
+#ifdef FUZZY_BORDER
+ Pixmap p2 = 0;
+ GC gc2;
+#endif /* FUZZY_BORDER */
+ int from, to;
+ int x1, y;
+
+ XFontStruct *font = state->font;
+ int safe_width = (font
+ ? font->max_bounds.rbearing - font->min_bounds.lbearing
+ : state->char_width + 1);
+
+ int width = state->scale * state->char_width;
+ int height = state->scale * state->char_height;
+
+ if (font && (c < font->min_char_or_byte2 ||
+ c > font->max_char_or_byte2))
+ goto DONE;
+
+ gc = state->gc1;
+ p = XCreatePixmap (state->dpy, state->window, width, height, 1);
+ XFillRectangle (state->dpy, p, state->gc0, 0, 0, width, height);
+#ifdef FUZZY_BORDER
+ gc2 = state->gc2;
+ p2 = XCreatePixmap (state->dpy, state->window, width, height, 1);
+ XFillRectangle (state->dpy, p2, state->gc0, 0, 0, width, height);
+#endif /* FUZZY_BORDER */
+
+ from = safe_width * c;
+ to = safe_width * (c + 1);
+
+#if 0
+ if (c > 75 && c < 150)
+ {
+ printf ("\n=========== %d (%c)\n", c, c);
+ for (y = 0; y < state->char_height; y++)
+ {
+ for (x1 = from; x1 < to; x1++)
+ printf (XGetPixel (state->font_bits, x1, y) ? "* " : ". ");
+ printf ("\n");
+ }
+ }
+#endif
+
+ pc->blank_p = True;
+ for (y = 0; y < state->char_height; y++)
+ for (x1 = from; x1 < to; x1++)
+ if (XGetPixel (state->font_bits, x1, y))
+ {
+ int xoff = state->scale / 2;
+ int x2;
+ for (x2 = x1; x2 < to; x2++)
+ if (!XGetPixel (state->font_bits, x2, y))
+ break;
+ x2--;
+ XDrawLine (state->dpy, p, gc,
+ (x1 - from) * state->scale + xoff, y * state->scale,
+ (x2 - from) * state->scale + xoff, y * state->scale);
+#ifdef FUZZY_BORDER
+ XDrawLine (state->dpy, p2, gc2,
+ (x1 - from) * state->scale + xoff, y * state->scale,
+ (x2 - from) * state->scale + xoff, y * state->scale);
+#endif /* FUZZY_BORDER */
+ x1 = x2;
+ pc->blank_p = False;
+ }
+
+ /* if (pc->blank_p && c == CURSOR_INDEX)
+ abort();*/
+
+ DONE:
+ pc->pixmap = p;
+#ifdef FUZZY_BORDER
+ pc->pixmap2 = p2;
+#endif /* FUZZY_BORDER */
+}
+
+
+/* Managing the display.
+ */
+
+static void cursor_on_timer (XtPointer closure, XtIntervalId *id);
+static void cursor_off_timer (XtPointer closure, XtIntervalId *id);
+
+static Bool
+set_cursor_1 (p_state *state, Bool on)
+{
+ p_cell *cell = &state->cells[state->grid_width * state->cursor_y
+ + state->cursor_x];
+ p_char *cursor = state->chars[CURSOR_INDEX];
+ int new_state = (on ? NORMAL : FADE);
+
+ if (cell->p_char != cursor)
+ cell->changed = True;
+
+ if (cell->state != new_state)
+ cell->changed = True;
+
+ cell->p_char = cursor;
+ cell->state = new_state;
+ return cell->changed;
+}
+
+static void
+set_cursor (p_state *state, Bool on)
+{
+ if (set_cursor_1 (state, on))
+ {
+ if (state->cursor_timer)
+ XtRemoveTimeOut (state->cursor_timer);
+ state->cursor_timer = 0;
+ cursor_on_timer (state, 0);
+ }
+}
+
+
+static void
+cursor_off_timer (XtPointer closure, XtIntervalId *id)
+{
+ p_state *state = (p_state *) closure;
+ XtAppContext app = XtDisplayToApplicationContext (state->dpy);
+ set_cursor_1 (state, False);
+ state->cursor_timer = XtAppAddTimeOut (app, state->cursor_blink,
+ cursor_on_timer, closure);
+}
+
+static void
+cursor_on_timer (XtPointer closure, XtIntervalId *id)
+{
+ p_state *state = (p_state *) closure;
+ XtAppContext app = XtDisplayToApplicationContext (state->dpy);
+ set_cursor_1 (state, True);
+ state->cursor_timer = XtAppAddTimeOut (app, 2 * state->cursor_blink,
+ cursor_off_timer, closure);
+}
+
+
+static void
+clear (p_state *state)
+{
+ int x, y;
+ state->cursor_x = 0;
+ state->cursor_y = 0;
+ for (y = 0; y < state->grid_height; y++)
+ for (x = 0; x < state->grid_width; x++)
+ {
+ p_cell *cell = &state->cells[state->grid_width * y + x];
+ if (cell->state == FLARE || cell->state == NORMAL)
+ {
+ cell->state = FADE;
+ cell->changed = True;
+ }
+ }
+ set_cursor (state, True);
+}
+
+
+static void
+decay (p_state *state)
+{
+ int x, y;
+ for (y = 0; y < state->grid_height; y++)
+ for (x = 0; x < state->grid_width; x++)
+ {
+ p_cell *cell = &state->cells[state->grid_width * y + x];
+ if (cell->state == FLARE)
+ {
+ cell->state = NORMAL;
+ cell->changed = True;
+ }
+ else if (cell->state >= FADE)
+ {
+ cell->state++;
+ if (cell->state >= state->ticks)
+ cell->state = BLANK;
+ cell->changed = True;
+ }
+ }
+}
+
+
+static void
+scroll (p_state *state)
+{
+ int x, y;
+
+ for (x = 0; x < state->grid_width; x++)
+ {
+ p_cell *from = 0, *to = 0;
+ for (y = 1; y < state->grid_height; y++)
+ {
+ from = &state->cells[state->grid_width * y + x];
+ to = &state->cells[state->grid_width * (y-1) + x];
+
+ if ((from->state == FLARE || from->state == NORMAL) &&
+ !from->p_char->blank_p)
+ {
+ *to = *from;
+ to->state = NORMAL; /* should be FLARE? Looks bad... */
+ }
+ else
+ {
+ if (to->state == FLARE || to->state == NORMAL)
+ to->state = FADE;
+ }
+
+ to->changed = True;
+ }
+
+ to = from;
+ if (to && (to->state == FLARE || to->state == NORMAL))
+ {
+ to->state = FADE;
+ to->changed = True;
+ }
+ }
+ set_cursor (state, True);
+}
+
+
+static int
+process_unicrud (p_state *state, int c)
+{
+ if ((c & 0xE0) == 0xC0) { /* 110xxxxx: 11 bits, 2 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 102;
+ } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx: 16 bits, 3 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 103;
+ } else if ((c & 0xF8) == 0xF0) { /* 11110xxx: 21 bits, 4 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 104;
+ } else if ((c & 0xFC) == 0xF8) { /* 111110xx: 26 bits, 5 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 105;
+ } else if ((c & 0xFE) == 0xFC) { /* 1111110x: 31 bits, 6 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 106;
+ } else if (state->unicruds == 0) {
+ return c;
+ } else {
+ int total = state->escstate - 100; /* see what I did there */
+ if (state->unicruds < total) {
+ /* Buffer more bytes of the UTF-8 sequence */
+ state->unicrud[state->unicruds++] = c;
+ }
+
+ if (state->unicruds >= total) {
+ /* Done! Convert it to Latin1 and print that. */
+ char *s;
+ state->unicrud[state->unicruds] = 0;
+ s = utf8_to_latin1 ((const char *) state->unicrud, False);
+ state->unicruds = 0;
+ state->escstate = 0;
+ if (s) {
+ c = (unsigned char) s[0];
+ free (s);
+ return c;
+ }
+ }
+ }
+ return 0;
+}
+
+
+static void
+print_char (p_state *state, int c)
+{
+ int cols = state->grid_width;
+ int rows = state->grid_height;
+ p_cell *cell = &state->cells[state->grid_width * state->cursor_y
+ + state->cursor_x];
+
+ /* Start the cursor fading (in case we don't end up overwriting it.) */
+ if (cell->state == FLARE || cell->state == NORMAL)
+ {
+ cell->state = FADE;
+ cell->changed = True;
+ }
+
+#ifdef HAVE_FORKPTY
+ if (state->pty_p) /* Only interpret VT100 sequences if running in pty-mode.
+ It would be nice if we could just interpret them all
+ the time, but that would require subprocesses to send
+ CRLF line endings instead of bare LF, so that's no good.
+ */
+ {
+ int i;
+ int start, end;
+
+ /* Mostly duplicated in apple2-main.c */
+
+ switch (state->escstate)
+ {
+ case 0:
+ switch (c)
+ {
+ case 7: /* BEL */
+ /* Dummy case - we don't want the screensaver to beep */
+ /* #### But maybe this should flash the screen? */
+ break;
+ case 8: /* BS */
+ if (state->cursor_x > 0)
+ state->cursor_x--;
+ break;
+ case 9: /* HT */
+ if (state->cursor_x < cols - 8)
+ {
+ state->cursor_x = (state->cursor_x & ~7) + 8;
+ }
+ else
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ scroll (state);
+ }
+ break;
+ case 10: /* LF */
+# ifndef HAVE_FORKPTY
+ state->cursor_x = 0; /* No ptys on iPhone; assume CRLF. */
+# endif
+ case 11: /* VT */
+ case 12: /* FF */
+ if(state->last_c == 13)
+ {
+ cell->state = NORMAL;
+ cell->p_char = state->chars[state->bk];
+ cell->changed = True;
+ }
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ scroll (state);
+ break;
+ case 13: /* CR */
+ state->cursor_x = 0;
+ cell = &state->cells[cols * state->cursor_y];
+ if((cell->p_char == NULL) || (cell->p_char->name == CURSOR_INDEX))
+ state->bk = ' ';
+ else
+ state->bk = cell->p_char->name;
+ break;
+ case 14: /* SO */
+ case 15: /* SI */
+ /* Dummy case - there is one and only one font. */
+ break;
+ case 24: /* CAN */
+ case 26: /* SUB */
+ /* Dummy case - these interrupt escape sequences, so
+ they don't do anything in this state */
+ break;
+ case 27: /* ESC */
+ state->escstate = 1;
+ break;
+ case 127: /* DEL */
+ /* Dummy case - this is supposed to be ignored */
+ break;
+ case 155: /* CSI */
+ state->escstate = 2;
+ for(i = 0; i < NPAR; i++)
+ state->csiparam[i] = 0;
+ state->curparam = 0;
+ break;
+ default:
+
+ PRINT: /* Come from states 102-106 */
+ c = process_unicrud (state, c);
+ if (! c)
+ break;
+
+ /* If the cursor is in column 39 and we print a character, then
+ that character shows up in column 39, and the cursor is no
+ longer visible on the screen (it's in "column 40".) If
+ another character is printed, then that character shows up in
+ column 0, and the cursor moves to column 1.
+
+ This is empirically what xterm and gnome-terminal do, so that
+ must be the right thing. (In xterm, the cursor vanishes,
+ whereas; in gnome-terminal, the cursor overprints the
+ character in col 39.)
+ */
+ cell->state = FLARE;
+ cell->p_char = state->chars[c];
+ cell->changed = True;
+ state->cursor_x++;
+
+ if (c != ' ' && cell->p_char->blank_p)
+ cell->p_char = state->chars[CURSOR_INDEX];
+
+ if (state->cursor_x >= cols - 1 /*####*/)
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y >= rows - 1)
+ scroll (state);
+ else
+ state->cursor_y++;
+ }
+ break;
+ }
+ break;
+ case 1:
+ switch (c)
+ {
+ case 24: /* CAN */
+ case 26: /* SUB */
+ state->escstate = 0;
+ break;
+ case 'c': /* Reset */
+ clear (state);
+ state->escstate = 0;
+ break;
+ case 'D': /* Linefeed */
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ scroll (state);
+ state->escstate = 0;
+ break;
+ case 'E': /* Newline */
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'M': /* Reverse newline */
+ if (state->cursor_y > 0)
+ state->cursor_y--;
+ state->escstate = 0;
+ break;
+ case '7': /* Save state */
+ state->saved_x = state->cursor_x;
+ state->saved_y = state->cursor_y;
+ state->escstate = 0;
+ break;
+ case '8': /* Restore state */
+ state->cursor_x = state->saved_x;
+ state->cursor_y = state->saved_y;
+ state->escstate = 0;
+ break;
+ case '[': /* CSI */
+ state->escstate = 2;
+ for(i = 0; i < NPAR; i++)
+ state->csiparam[i] = 0;
+ state->curparam = 0;
+ break;
+ case '%': /* Select charset */
+ /* @: Select default (ISO 646 / ISO 8859-1)
+ G: Select UTF-8
+ 8: Select UTF-8 (obsolete)
+
+ We can just ignore this and always process UTF-8, I think?
+ We must still catch the last byte, though.
+ */
+ case '(':
+ case ')':
+ /* I don't support different fonts either - see above
+ for SO and SI */
+ state->escstate = 3;
+ break;
+ default:
+ /* Escape sequences not supported:
+ *
+ * H - Set tab stop
+ * Z - Terminal identification
+ * > - Keypad change
+ * = - Other keypad change
+ * ] - OS command
+ */
+ state->escstate = 0;
+ break;
+ }
+ break;
+ case 2:
+ switch (c)
+ {
+ case 24: /* CAN */
+ case 26: /* SUB */
+ state->escstate = 0;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ if (state->curparam < NPAR)
+ state->csiparam[state->curparam] = (state->csiparam[state->curparam] * 10) + (c - '0');
+ break;
+ case ';':
+ state->csiparam[++state->curparam] = 0;
+ break;
+ case '[':
+ state->escstate = 3;
+ break;
+ case '@':
+ for (i = 0; i < state->csiparam[0]; i++)
+ {
+ if(++state->cursor_x > cols)
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ scroll (state);
+ }
+ cell = &state->cells[cols * state->cursor_y + state->cursor_x];
+ if (cell->state == FLARE || cell->state == NORMAL)
+ {
+ cell->state = FADE;
+ cell->changed = True;
+ }
+ }
+ state->escstate = 0;
+ break;
+ case 'F':
+ state->cursor_x = 0;
+ case 'A':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_y -= state->csiparam[0]) < 0)
+ state->cursor_y = 0;
+ state->escstate = 0;
+ break;
+ case 'E':
+ state->cursor_x = 0;
+ case 'e':
+ case 'B':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_y += state->csiparam[0]) >= rows - 1 /*####*/)
+ state->cursor_y = rows - 1;
+ state->escstate = 0;
+ break;
+ case 'a':
+ case 'C':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_x += state->csiparam[0]) >= cols - 1 /*####*/)
+ state->cursor_x = cols - 1;
+ state->escstate = 0;
+ break;
+ case 'D':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_x -= state->csiparam[0]) < 0)
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'd':
+ if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows - 1 /*####*/)
+ state->cursor_y = rows - 1;
+ state->escstate = 0;
+ break;
+ case '`':
+ case 'G':
+ if ((state->cursor_x = (state->csiparam[0] - 1)) >= cols - 1 /*####*/)
+ state->cursor_x = cols - 1;
+ state->escstate = 0;
+ break;
+ case 'f':
+ case 'H':
+ if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows - 1 /*####*/)
+ state->cursor_y = rows - 1;
+ if ((state->cursor_x = (state->csiparam[1] - 1)) >= cols - 1 /*####*/)
+ state->cursor_x = cols - 1;
+ if(state->cursor_y < 0)
+ state->cursor_y = 0;
+ if(state->cursor_x < 0)
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'J':
+ start = 0;
+ end = rows * cols;
+ if (state->csiparam[0] == 0)
+ start = cols * state->cursor_y + state->cursor_x;
+ if (state->csiparam[0] == 1)
+ end = cols * state->cursor_y + state->cursor_x;
+ for (i = start; i < end; i++)
+ {
+ cell = &state->cells[i];
+ if (cell->state == FLARE || cell->state == NORMAL)
+ {
+ cell->state = FADE;
+ cell->changed = True;
+ }
+ }
+ set_cursor (state, True);
+ state->escstate = 0;
+ break;
+ case 'K':
+ start = 0;
+ end = cols;
+ if (state->csiparam[0] == 0)
+ start = state->cursor_x;
+ if (state->csiparam[1] == 1)
+ end = state->cursor_x;
+ for (i = start; i < end; i++)
+ {
+ if (cell->state == FLARE || cell->state == NORMAL)
+ {
+ cell->state = FADE;
+ cell->changed = True;
+ }
+ cell++;
+ }
+ state->escstate = 0;
+ break;
+ case 'm': /* Set attributes unimplemented (bold, blink, rev) */
+ state->escstate = 0;
+ break;
+ case 's': /* Save position */
+ state->saved_x = state->cursor_x;
+ state->saved_y = state->cursor_y;
+ state->escstate = 0;
+ break;
+ case 'u': /* Restore position */
+ state->cursor_x = state->saved_x;
+ state->cursor_y = state->saved_y;
+ state->escstate = 0;
+ break;
+ case '?': /* DEC Private modes */
+ if ((state->curparam != 0) || (state->csiparam[0] != 0))
+ state->escstate = 0;
+ break;
+ default:
+ /* Known unsupported CSIs:
+ *
+ * L - Insert blank lines
+ * M - Delete lines (I don't know what this means...)
+ * P - Delete characters
+ * X - Erase characters (difference with P being...?)
+ * c - Terminal identification
+ * g - Clear tab stop(s)
+ * h - Set mode (Mainly due to its complexity and lack of good
+ docs)
+ * l - Clear mode
+ * m - Set mode (Phosphor is, per defenition, green on black)
+ * n - Status report
+ * q - Set keyboard LEDs
+ * r - Set scrolling region (too exhausting - noone uses this,
+ right?)
+ */
+ state->escstate = 0;
+ break;
+ }
+ break;
+ case 3:
+ state->escstate = 0;
+ break;
+
+ case 102: /* states 102-106 are for UTF-8 decoding */
+ case 103:
+ case 104:
+ case 105:
+ case 106:
+ goto PRINT;
+
+ default:
+ abort();
+ }
+ set_cursor (state, True);
+ }
+ else
+#endif /* HAVE_FORKPTY */
+ {
+ if (c == '\t') c = ' '; /* blah. */
+
+ if (c == '\r' || c == '\n') /* handle CR, LF, or CRLF as "new line". */
+ {
+ if (c == '\n' && state->last_c == '\r')
+ ; /* CRLF -- do nothing */
+ else
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y == rows - 1)
+ scroll (state);
+ else
+ state->cursor_y++;
+ }
+ }
+ else if (c == '\014')
+ {
+ clear (state);
+ }
+ else
+ {
+ c = process_unicrud (state, c);
+ if (!c) return;
+
+ cell->state = FLARE;
+ cell->p_char = state->chars[c];
+ cell->changed = True;
+ state->cursor_x++;
+
+ if (c != ' ' && cell->p_char->blank_p)
+ cell->p_char = state->chars[CURSOR_INDEX];
+
+ if (state->cursor_x >= cols - 1)
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y >= rows - 1)
+ scroll (state);
+ else
+ state->cursor_y++;
+ }
+ }
+ set_cursor (state, True);
+ }
+
+ state->last_c = c;
+}
+
+
+static void
+update_display (p_state *state, Bool changed_only)
+{
+ int x, y;
+
+ for (y = 0; y < state->grid_height; y++)
+ for (x = 0; x < state->grid_width; x++)
+ {
+ p_cell *cell = &state->cells[state->grid_width * y + x];
+ int width, height, tx, ty;
+
+ if (changed_only && !cell->changed)
+ continue;
+
+ width = state->char_width * state->scale;
+ height = state->char_height * state->scale;
+ tx = x * width + state->xmargin;
+ ty = y * height + state->ymargin;
+
+ if (cell->state == BLANK || cell->p_char->blank_p)
+ {
+ XFillRectangle (state->dpy, state->window, state->gcs[BLANK],
+ tx, ty, width, height);
+ }
+ else
+ {
+#ifdef FUZZY_BORDER
+ GC gc1 = state->gcs[cell->state];
+ GC gc2 = ((cell->state + 2) < state->ticks
+ ? state->gcs[cell->state + 2]
+ : 0);
+ GC gc3 = (gc2 ? gc2 : gc1);
+ if (gc3)
+ XCopyPlane (state->dpy, cell->p_char->pixmap, state->window, gc3,
+ 0, 0, width, height, tx, ty, 1L);
+ if (gc2)
+ {
+ XSetClipMask (state->dpy, gc1, cell->p_char->pixmap2);
+ XSetClipOrigin (state->dpy, gc1, tx, ty);
+ XFillRectangle (state->dpy, state->window, gc1,
+ tx, ty, width, height);
+ XSetClipMask (state->dpy, gc1, None);
+ }
+#else /* !FUZZY_BORDER */
+
+ XCopyPlane (state->dpy,
+ cell->p_char->pixmap, state->window,
+ state->gcs[cell->state],
+ 0, 0, width, height, tx, ty, 1L);
+
+#endif /* !FUZZY_BORDER */
+ }
+
+ cell->changed = False;
+ }
+}
+
+
+static unsigned long
+phosphor_draw (Display *dpy, Window window, void *closure)
+{
+ p_state *state = (p_state *) closure;
+ int c;
+ update_display (state, True);
+ decay (state);
+
+ c = textclient_getc (state->tc);
+ if (c > 0)
+ print_char (state, c);
+
+ return state->delay;
+}
+
+
+static void
+phosphor_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ p_state *state = (p_state *) closure;
+ Bool changed_p = resize_grid (state);
+
+ if (! changed_p) return;
+
+ textclient_reshape (state->tc,
+ w - state->xmargin * 2,
+ h - state->ymargin * 2,
+ state->grid_width - 1,
+ state->grid_height - 1,
+ 0);
+}
+
+
+static Bool
+phosphor_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ p_state *state = (p_state *) closure;
+
+ if (event->xany.type == Expose)
+ update_display (state, False);
+ else if (event->xany.type == KeyPress)
+ return textclient_putc (state->tc, &event->xkey);
+ return False;
+}
+
+static void
+phosphor_free (Display *dpy, Window window, void *closure)
+{
+ p_state *state = (p_state *) closure;
+
+ textclient_close (state->tc);
+ if (state->cursor_timer)
+ XtRemoveTimeOut (state->cursor_timer);
+
+ /* #### there's more to free here */
+
+ free (state);
+}
+
+
+
+static const char *phosphor_defaults [] = {
+/* ".lowrez: true",*/
+ ".background: Black",
+ ".foreground: #00FF00",
+ "*fpsSolid: true",
+#if defined(BUILTIN_FONT)
+ "*font: (builtin)",
+#elif defined(HAVE_COCOA)
+ "*font: Monaco 15",
+#else
+ "*font: fixed",
+#endif
+ "*scale: 6",
+ "*ticks: 20",
+ "*delay: 50000",
+ "*cursor: 333",
+ "*program: xscreensaver-text",
+ "*relaunch: 5",
+ "*metaSendsESC: True",
+ "*swapBSDEL: True",
+#ifdef HAVE_FORKPTY
+ "*usePty: True",
+#else /* !HAVE_FORKPTY */
+ "*usePty: False",
+#endif /* !HAVE_FORKPTY */
+ 0
+};
+
+static XrmOptionDescRec phosphor_options [] = {
+ { "-font", ".font", XrmoptionSepArg, 0 },
+ { "-scale", ".scale", XrmoptionSepArg, 0 },
+ { "-ticks", ".ticks", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-pipe", ".usePty", XrmoptionNoArg, "False" },
+ { "-pty", ".usePty", XrmoptionNoArg, "True" },
+ { "-meta", ".metaSendsESC", XrmoptionNoArg, "False" },
+ { "-esc", ".metaSendsESC", XrmoptionNoArg, "True" },
+ { "-bs", ".swapBSDEL", XrmoptionNoArg, "False" },
+ { "-del", ".swapBSDEL", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Phosphor", phosphor)
diff --git a/hacks/phosphor.man b/hacks/phosphor.man
new file mode 100644
index 0000000..154599c
--- /dev/null
+++ b/hacks/phosphor.man
@@ -0,0 +1,173 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+phosphor - simulates an old terminal with long-sustain phosphor
+.SH SYNOPSIS
+.B phosphor
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-font \fIfont\fP] [\-scale \fIint\fP]
+[\-ticks \fIint\fP] [\-delay \fIusecs\fP] [\-program \fIcommand\fP]
+[\-meta] [\-esc] [\-bs] [\-del]
+[\-fps]
+.SH DESCRIPTION
+The \fIphosphor\fP program draws text on the screen in a very large
+pixelated font that looks like an old low resolution dumb tty. The
+pixels flare and fade out as if the phosphor was very
+long-sustain. It is also a fully functional vt100 terminal emulator.
+.SH OPTIONS
+.I phosphor
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-font \fIfont-name\fP
+The X font to use. Phosphor can take any font and scale it up to pixelate
+it. The default is \fIfixed\fP.
+.TP 8
+.B \-scale \fIint\fP
+How much to scale the font up: in other words, the size in real pixels of
+the simulated pixels. Default 6.
+.TP 8
+.B \-ticks \fIint\fP
+The number of colors to use when fading to black. Default 20.
+.TP 8
+.B \-delay \fIusecs\fP
+The speed of the terminal: how long to wait between drawing each character.
+Default 50000, or about 1/20th second.
+.TP 8
+.B \-pty
+Launch the sub-program under a PTY, so that it can address the screen
+directly. This is the default.
+.TP 8
+.B \-pipe
+Launch the sub-program at the end of a pipe: do not let it address the
+screen directly.
+.TP 8
+.B \-program \fIsh-command\fP
+The command to run to generate the text to display. This option may
+be any string acceptable to /bin/sh. The program will be run at the
+end of a pty or pipe, and any characters that it prints to \fIstdout\fP
+will be printed on phosphor's window. The characters will be printed
+artificially slowly, as per the \fI\-delay\fP option above. If the
+program exits, it will be launched again after 5 seconds.
+
+For example:
+.EX
+phosphor -program 'cat /usr/src/linux*/README'
+phosphor -program 'ping localhost'
+phosphor -program 'ps -e'
+phosphor -program 'od -txC -w6 /dev/random'
+phosphor -program 'cat /dev/random'
+phosphor -scale 2 -geom =1280x1024 -program 'top'
+phosphor -scale 4 -geom =1280x1024 \\
+ -program 'mtr www.kernel.org'
+phosphor -program 'xemacs -nw -q -f life'
+phosphor -scale 5 -geom =1280x1024 \\
+ -program 'xemacs -nw -q --eval "(hanoi 5)"'
+.EE
+If you have the
+.BR festival (1)
+text-to-speech system installed, you can have it read the screen as
+phosphor prints it:
+.EX
+phosphor -program \\
+ 'xscreensaver-text | tee /dev/stderr | festival --tts'
+.EE
+You can also use \fIphosphor\fP as a lo-fi replacement for the
+.BR xterm (1)
+and
+.BR gnome-terminal (1)
+terminal emulators:
+.EX
+phosphor -delay 0 -program tcsh
+.EE
+.TP 8
+.B \-esc
+When the user types a key with the Alt or Meta keys held down, send an
+ESC character first. This is the default.
+.TP 8
+.B \-meta
+When Meta or Alt are held down, set the high bit on the character instead.
+.TP 8
+.B \-del
+Swap Backspace and Delete. This is the default.
+.TP 8
+.B \-bs
+Do not swap Backspace and Delete.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH TERMINAL EMULATION
+By default, \fIphosphor\fP allocates a pseudo-tty for the sub-process to
+run under. This has the desirable side effect that the program will be
+able to use
+.BR ioctl (2)
+to fetch information about terminal parameters and window size, which
+many programs (such as
+.BR top (1))
+need to run properly. \fIphosphor\fP will also set the environment
+variable \fITERM\fP to \fIvt100\fP in the child process.
+
+Any characters typed on the phosphor window will be passed along to
+the sub-process. (Note that this only works when running in "window"
+mode, not when running in \fI\-root\fP mode under xscreensaver.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.TP 8
+.B TERM
+to inform the sub-process of the type of terminal emulation.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR apple2 (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR fontglide (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek ,
+.BR console_codes (4).
+.SH COPYRIGHT
+Copyright \(co 1999 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 27-Apr-99.
+Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>.
diff --git a/hacks/piecewise.c b/hacks/piecewise.c
new file mode 100644
index 0000000..6e6e484
--- /dev/null
+++ b/hacks/piecewise.c
@@ -0,0 +1,1006 @@
+/* piecewise, 21jan2003
+ * Geoffrey Irving <irving@caltech.edu>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <stdarg.h>
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+
+#define X_PI (180 * 64)
+
+#define START 0
+#define CROSS 1
+#define FINISH 2
+
+#define ARC_BUFFER_SIZE 256
+
+
+typedef struct _tree {
+ struct _tree *l, *r; /* left and right children */
+ /* extra stuff would go here */
+ } tree;
+
+
+struct _fringe;
+
+typedef struct _circle {
+ int r; /* radius */
+ double x, y; /* position */
+ double dx, dy; /* velocity */
+
+ int visible; /* default visibility */
+ struct _fringe *lo, *hi; /* lo and hi fringes */
+
+ int ni; /* number of intersections */
+ int *i; /* sorted intersection list */
+ } circle;
+
+typedef struct _fringe {
+ struct _fringe *l, *r; /* left and right children for splay trees */
+
+ circle *c; /* associated circle */
+ int side; /* 0 for lo, 1 for hi */
+
+ int mni; /* size of intersection array */
+ int ni; /* number of intersections */
+ int *i; /* sorted intersection list */
+ } fringe;
+
+
+typedef struct _event {
+ struct _event *l, *r; /* left and right children for splay tree */
+
+ int kind; /* type of event */
+ double x, y; /* position */
+ fringe *lo, *hi; /* fringes */
+ } event;
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ double event_cut_y;
+
+ double fringe_start_cut_x;
+ double fringe_start_cut_y;
+
+ double fringe_double_cut_x;
+ double fringe_double_cut_y;
+ fringe *fringe_double_cut_lo;
+ fringe *fringe_double_cut_hi;
+
+ int arc_buffer_count;
+ XArc arc_buffer[ARC_BUFFER_SIZE];
+
+ Bool dbuf;
+ XColor *colors;
+ XGCValues gcv;
+ GC erase_gc, draw_gc;
+ XWindowAttributes xgwa;
+ Pixmap b, ba, bb; /* double-buffering pixmap */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ int count, delay, ncolors, colorspeed, color_index, flags, iterations;
+ int color_iterations;
+ circle *circles;
+};
+
+typedef int (*cut)(struct state *, tree*); /* cut x is <, =, or > 0 given a <, =, or > x for some a */
+
+
+
+/******** splaying code */
+
+/* Top-down splay routine. Reference:
+ * "Self-adjusting Binary Search Trees", Sleator and Tarjan,
+ * JACM Volume 32, No 3, July 1985, pp 652-686.
+ * See page 668 for specific splay transformations */
+
+static tree *splay(struct state *st, cut c, tree *t)
+{
+ int v, vv;
+ tree *l, *r;
+ tree **lr, **rl;
+ tree *x, *y, *z;
+
+ if (!t)
+ return 0;
+
+ /* initialization */
+ x = t;
+ l = r = 0;
+ lr = &l;
+ rl = &r;
+
+ /* top-down splaying loop */
+ for (;;) {
+ v = c(st, x);
+ if (v == 0)
+ break; /*** success ***/
+ else if (v < 0) {
+ y = x->l;
+ if (!y)
+ break; /*** trivial ***/
+ else {
+ vv = c(st, y);
+ if (vv == 0) {
+ *rl = x; /*** zig ***/
+ rl = &x->l;
+ x = y;
+ break;
+ }
+ else if (vv < 0) {
+ z = y->l;
+ if (!z) {
+ *rl = x; /*** zig ***/
+ rl = &x->l;
+ x = y;
+ break;
+ }
+ else {
+ x->l = y->r; /*** zig-zig ***/
+ y->r = x;
+ *rl = y;
+ rl = &y->l;
+ x = z;
+ }
+ }
+ else { /* vv > 0 */
+ z = y->r;
+ if (!z) {
+ *rl = x; /*** zig ***/
+ rl = &x->l;
+ x = y;
+ break;
+ }
+ else { /*** zig-zag ***/
+ *lr = y;
+ lr = &y->r;
+ *rl = x;
+ rl = &x->l;
+ x = z;
+ }
+ }
+ }
+ }
+ else { /* v > 0 */
+ y = x->r;
+ if (!y)
+ break; /*** trivial ***/
+ else {
+ vv = c(st, y);
+ if (vv == 0) {
+ *lr = x; /*** zig ***/
+ lr = &x->r;
+ x = y;
+ break;
+ }
+ else if (vv > 0) {
+ z = y->r;
+ if (!z) {
+ *lr = x; /*** zig ***/
+ lr = &x->r;
+ x = y;
+ break;
+ }
+ else {
+ x->r = y->l; /*** zig-zig ***/
+ y->l = x;
+ *lr = y;
+ lr = &y->r;
+ x = z;
+ }
+ }
+ else { /* vv < 0 */
+ z = y->l;
+ if (!z) {
+ *lr = x; /*** zig ***/
+ lr = &x->r;
+ x = y;
+ break;
+ }
+ else { /*** zig-zag ***/
+ *rl = y;
+ rl = &y->l;
+ *lr = x;
+ lr = &x->r;
+ x = z;
+ }
+ }
+ }
+ }
+ }
+
+ /* completion */
+ *lr = x->l;
+ x->l = l;
+ *rl = x->r;
+ x->r = r;
+ return x;
+ }
+
+static tree *splay_min(tree *t)
+{
+ tree *r, **rl;
+ tree *x, *y, *z;
+
+ if (!t)
+ return 0;
+
+ x = t;
+ r = 0;
+ rl = &r;
+
+ for (;;) {
+ y = x->l;
+ if (!y)
+ break; /*** trivial ***/
+ else {
+ z = y->l;
+ if (!z) {
+ *rl = x; /*** zig ***/
+ rl = &x->l;
+ x = y;
+ break;
+ }
+ else {
+ x->l = y->r; /*** zig-zig ***/
+ y->r = x;
+ *rl = y;
+ rl = &y->l;
+ x = z;
+ }
+ }
+ }
+
+ x->l = 0;
+ *rl = x->r;
+ x->r = r;
+ return x;
+ }
+
+static tree *splay_max(tree *t)
+{
+ tree *l, **lr;
+ tree *x, *y, *z;
+
+ if (!t)
+ return 0;
+
+ x = t;
+ l = 0;
+ lr = &l;
+
+ for (;;) {
+ y = x->r;
+ if (!y)
+ break; /*** trivial ***/
+ else {
+ z = y->r;
+ if (!z) {
+ *lr = x; /*** zig ***/
+ lr = &x->r;
+ x = y;
+ break;
+ }
+ else {
+ x->r = y->l; /*** zig-zig ***/
+ y->l = x;
+ *lr = y;
+ lr = &y->r;
+ x = z;
+ }
+ }
+ }
+
+ *lr = x->l;
+ x->l = l;
+ x->r = 0;
+ return x;
+ }
+
+/******** circles and fringe */
+
+static inline double fringe_x(fringe *f, double y)
+{
+ double dy, d;
+ dy = f->c->y - y;
+ d = sqrt(f->c->r * f->c->r - dy * dy);
+ return f->side ? f->c->x + d : f->c->x - d;
+ }
+
+static inline void fringe_add_intersection(fringe *f, double x, double y)
+{
+ f->ni++;
+ if (f->mni < f->ni) {
+ f->mni += 2;
+ f->i = realloc(f->i, sizeof(int) * f->mni);
+ }
+ f->i[f->ni-1] = rint(atan2(y - f->c->y, x - f->c->x) * X_PI / M_PI);
+ }
+
+static circle *init_circles(struct state *st, int n, int w, int h)
+{
+ int i, r0, dr, speed;
+ double v, a;
+ double minradius, maxradius;
+ fringe *s = malloc(sizeof(fringe) * n * 2); /* never freed */
+ circle *c = malloc(sizeof(circle) * n);
+
+ speed = get_integer_resource(st->dpy, "speed", "Speed");
+ minradius = get_float_resource(st->dpy, "minradius", "Float");
+ maxradius = get_float_resource(st->dpy, "maxradius", "Float");
+ if (maxradius < minradius)
+ maxradius = minradius;
+
+ r0 = ceil(minradius * h);
+ dr = floor(maxradius * h) - r0 + 1;
+
+ for (i=0;i<n;i++) {
+ c[i].r = r0 + ((dr > 0) ? random() % dr : 0);
+ c[i].x = c[i].r + frand(w - 1 - 2 * c[i].r);
+ c[i].y = c[i].r + frand(h - 1 - 2 * c[i].r);
+ c[i].visible = random() & 1;
+
+ c[i].ni = 0;
+ c[i].i = 0;
+
+ a = frand(2 * M_PI);
+ v = (1 + frand(0.5)) * speed / 10.0;
+ c[i].dx = v * cos(a);
+ c[i].dy = v * sin(a);
+
+ c[i].lo = s+i+i;
+ c[i].hi = s+i+i+1;
+ c[i].lo->c = c[i].hi->c = c+i;
+ c[i].lo->side = 0;
+ c[i].hi->side = 1;
+ c[i].lo->mni = c[i].lo->ni = c[i].hi->mni = c[i].hi->ni = 0;
+ c[i].lo->i = c[i].hi->i = 0;
+ }
+
+ return c;
+ }
+
+/* this is a hack, but I guess that's what I writing anyways */
+static void tweak_circle(circle *c)
+{
+ c->x += frand(2) - 1;
+ c->y += frand(1) + 0.1;
+ }
+
+static void move_circle(circle *c, int w, int h)
+{
+ c->x += c->dx;
+ if (c->x < c->r) {
+ c->x = c->r;
+ c->dx = -c->dx;
+ }
+ else if (c->x >= w - c->r) {
+ c->x = w - 1 - c->r;
+ c->dx = -c->dx;
+ }
+ c->y += c->dy;
+ if (c->y < c->r) {
+ c->y = c->r;
+ c->dy = -c->dy;
+ }
+ else if (c->y >= h - c->r) {
+ c->y = h - 1 - c->r;
+ c->dy = -c->dy;
+ }
+ }
+
+/******** event queue */
+
+static int event_cut(struct state *st, event *e)
+{
+ return st->event_cut_y == e->y ? 0 : st->event_cut_y < e->y ? -1 : 1;
+ }
+
+static void event_insert(struct state *st, event **eq, event *e)
+{
+ if (!*eq) {
+ e->l = e->r = 0;
+ *eq = e;
+ return; /* avoid leak */
+ }
+
+ st->event_cut_y = e->y;
+ *eq = (event*)splay(st, (cut)event_cut, (tree*)*eq);
+
+ if (e->y == (*eq)->y) {
+ if (!((e->lo == (*eq)->lo && e->hi == (*eq)->hi) || (e->lo == (*eq)->hi && e->hi == (*eq)->lo))) {
+ e->l = (*eq)->l;
+ e->r = 0; /* doing this instead of dying might be dangerous */
+ (*eq)->l = e;
+ }
+ else
+ free(e); /* don't leak! */
+ }
+ else if (e->y < (*eq)->y) {
+ e->l = (*eq)->l;
+ e->r = *eq;
+ (*eq)->l = 0;
+ *eq = e;
+ }
+ else {
+ e->l = *eq;
+ e->r = (*eq)->r;
+ (*eq)->r = 0;
+ *eq = e;
+ }
+ }
+
+static void circle_start_event(struct state *st, event **eq, circle *c)
+{
+ event *s;
+ s = malloc(sizeof(event));
+ s->kind = START;
+ s->x = c->x;
+ s->y = c->y - c->r;
+ s->lo = c->lo;
+ s->hi = c->hi;
+ event_insert(st, eq, s);
+ }
+
+static void circle_finish_event(struct state *st, event **eq, circle *c)
+{
+ event *f;
+ f = malloc(sizeof(event));
+ f->kind = FINISH;
+ f->x = c->x;
+ f->y = c->y + c->r;
+ f->lo = c->lo;
+ f->hi = c->hi;
+ event_insert(st, eq, f);
+ }
+
+static event *event_next(event **eq)
+{
+ event *e;
+ if (!*eq)
+ return 0;
+ else {
+ e = (event*)splay_min((tree*)*eq);
+ *eq = e->r;
+ return e;
+ }
+ }
+
+static void event_shred(event *e)
+{
+ if (e) {
+ event_shred(e->l);
+ event_shred(e->r);
+ free(e);
+ }
+ }
+
+/******** fringe intersection */
+
+#if 0
+static inline int check_fringe_intersection(double ye, fringe *lo, fringe *hi, double x, double y)
+{
+ return ye <= y && ((x < lo->c->x) ^ lo->side) && ((x < hi->c->x) ^ hi->side);
+ }
+#endif /* 0 */
+
+static void fringe_intersect(struct state *st, event **eq, double y, fringe *lo, fringe *hi)
+{
+ event *e;
+ double dx, dy, sd, rs, rd, d, sx, sy, rp, sqd;
+ double x1, y1, x2, y2;
+
+ if (lo->c == hi->c)
+ return;
+
+ dx = hi->c->x - lo->c->x;
+ dy = hi->c->y - lo->c->y;
+ sd = dx * dx + dy * dy;
+
+ if (sd == 0)
+ return;
+
+ rs = hi->c->r + lo->c->r;
+ rd = hi->c->r - lo->c->r;
+ d = (rd * rd - sd) * (sd - rs * rs);
+
+ if (d <= 0)
+ return;
+
+ sd = 0.5 / sd;
+ rp = rs * rd;
+ sqd = sqrt(d);
+ sx = (lo->c->x + hi->c->x) / 2;
+ sy = (lo->c->y + hi->c->y) / 2;
+ x1 = sx + sd * (dy * sqd - dx * rp);
+ y1 = sy - sd * (dx * sqd + dy * rp);
+ x2 = sx - sd * (dy * sqd + dx * rp);
+ y2 = sy + sd * (dx * sqd - dy * rp);
+
+ #define CHECK(xi, yi) (y <= yi && ((xi < lo->c->x) ^ lo->side) && ((xi < hi->c->x) ^ hi->side))
+
+ #define ADD_CROSS(xi, yi, ilo, ihi) { \
+ e = malloc(sizeof(event)); /* #### LEAK */ \
+ e->kind = CROSS; \
+ e->x = xi; e->y = yi; \
+ e->lo = ilo; e->hi = ihi; \
+ event_insert(st, eq, e); \
+ }
+
+ if (CHECK(x1, y1)) {
+ if (CHECK(x2, y2)) {
+ if (y1 < y2) {
+ ADD_CROSS(x1, y1, lo, hi);
+ ADD_CROSS(x2, y2, hi, lo);
+ }
+ else {
+ ADD_CROSS(x1, y1, hi, lo);
+ ADD_CROSS(x2, y2, lo, hi);
+ }
+ }
+ else
+ ADD_CROSS(x1, y1, lo, hi);
+ }
+ else if (CHECK(x2, y2))
+ ADD_CROSS(x2, y2, lo, hi);
+
+ return;
+ }
+
+/******** fringe trees and event handling */
+
+#define PANIC ((fringe*)1) /* by alignment, no fringe should every be 1 */
+
+static fringe *check_lo(struct state *st, event **eq, double y, fringe *f, fringe *hi)
+{
+ if (f) {
+ f = (fringe*)splay_max((tree*)f);
+ fringe_intersect(st, eq, y, f, hi);
+ }
+ return f;
+ }
+
+static fringe *check_hi(struct state *st, event **eq, double y, fringe *lo, fringe *f)
+{
+ if (f) {
+ f = (fringe*)splay_min((tree*)f);
+ fringe_intersect(st, eq, y, lo, f);
+ }
+ return f;
+ }
+
+static int fringe_start_cut(struct state *st, fringe *f)
+{
+ double x = fringe_x(f, st->fringe_start_cut_y);
+ return st->fringe_start_cut_x == x ? 0 : st->fringe_start_cut_x < x ? -1 : 1;
+ }
+
+static fringe *fringe_start(struct state *st, event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi)
+{
+ double sx;
+
+ if (!f) {
+ circle_finish_event(st, eq, lo->c);
+ lo->l = 0;
+ lo->r = hi;
+ hi->l = hi->r = 0;
+ return lo;
+ }
+
+ st->fringe_start_cut_x = x;
+ st->fringe_start_cut_y = y;
+ f = (fringe*)splay(st, (cut)fringe_start_cut, (tree*)f);
+
+ sx = fringe_x(f, y);
+ if (x == sx) { /* time to cheat my way out of handling degeneracies */
+ tweak_circle(lo->c);
+ circle_start_event(st, eq, lo->c);
+ return f;
+ }
+ else if (x < sx) {
+ circle_finish_event(st, eq, lo->c);
+ f->l = check_lo(st, eq, y, f->l, lo);
+ fringe_intersect(st, eq, y, hi, f);
+ lo->l = f->l;
+ lo->r = f;
+ f->l = hi;
+ hi->l = hi->r = 0;
+ return lo;
+ }
+ else {
+ circle_finish_event(st, eq, lo->c);
+ fringe_intersect(st, eq, y, f, lo);
+ f->r = check_hi(st, eq, y, hi, f->r);
+ hi->r = f->r;
+ hi->l = f;
+ f->r = lo;
+ lo->l = lo->r = 0;
+ return hi;
+ }
+ }
+
+static int fringe_double_cut(struct state *st, fringe *f)
+{
+ double x;
+ if (f == st->fringe_double_cut_lo || f == st->fringe_double_cut_hi)
+ return 0;
+ x = fringe_x(f, st->fringe_double_cut_y);
+ return st->fringe_double_cut_x == x ? 0 : st->fringe_double_cut_x < x ? -1 : 1;
+ }
+
+static int fringe_double_splay(struct state *st, fringe *f, double x, double y, fringe *lo, fringe *hi)
+{
+ st->fringe_double_cut_x = x;
+ st->fringe_double_cut_y = y;
+ st->fringe_double_cut_lo = lo;
+ st->fringe_double_cut_hi = hi;
+ f = (fringe*)splay(st, (cut)fringe_double_cut, (tree*)f);
+
+ if (f == lo)
+ return (f->r = (fringe*)splay_min((tree*)f->r)) == hi;
+ else if (f == hi)
+ return (f->l = (fringe*)splay_max((tree*)f->l)) == lo;
+ else
+ return 0;
+ }
+
+static fringe *fringe_cross(struct state *st, event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi)
+{
+ fringe *l, *r;
+ if (!fringe_double_splay(st, f, x, y, lo, hi))
+ return PANIC;
+ l = check_lo(st, eq, y, lo->l, hi);
+ r = check_hi(st, eq, y, lo, hi->r);
+ lo->l = hi;
+ lo->r = r;
+ hi->l = l;
+ hi->r = 0;
+ return lo;
+ }
+
+static fringe *fringe_finish(struct state *st, event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi)
+{
+ if (!fringe_double_splay(st, f, x, y, lo, hi))
+ return PANIC;
+ else if (!lo->l)
+ return hi->r;
+ else if (!hi->r)
+ return lo->l;
+ else {
+ lo->l = (fringe*)splay_max((tree*)lo->l);
+ hi->r = (fringe*)splay_min((tree*)hi->r);
+ fringe_intersect(st, eq, y, lo->l, hi->r);
+ lo->l->r = hi->r;
+ hi->r->l = 0;
+ return lo->l;
+ }
+ }
+
+/******** plane sweep */
+
+static void sweep(struct state *st, int n, circle *c)
+{
+ int i;
+ event *eq, *e;
+ fringe *f;
+
+ RESTART:
+ #define CHECK_PANIC() \
+ if (f == PANIC) { \
+ free(e); \
+ event_shred(eq); \
+ for (i=0;i<n;i++) { \
+ tweak_circle(c+i); \
+ c[i].lo->ni = c[i].hi->ni = 0; \
+ } \
+ goto RESTART; \
+ }
+
+ eq = 0;
+ for (i=0;i<n;i++)
+ circle_start_event(st, &eq, c+i);
+ f = 0;
+
+ while ((e = event_next(&eq))) {
+ switch (e->kind) {
+ case START:
+ f = fringe_start(st, &eq, f, e->x, e->y, e->lo, e->hi);
+ break;
+ case CROSS:
+ f = fringe_cross(st, &eq, f, e->x, e->y, e->lo, e->hi);
+ CHECK_PANIC();
+ fringe_add_intersection(e->lo, e->x, e->y);
+ fringe_add_intersection(e->hi, e->x, e->y);
+ break;
+ case FINISH:
+ f = fringe_finish(st, &eq, f, e->x, e->y, e->lo, e->hi);
+ CHECK_PANIC();
+ break;
+ }
+ free(e);
+ }
+ }
+
+/******** circle drawing */
+
+static void adjust_circle_visibility(circle *c)
+{
+ int i, j, n, a;
+ int *in;
+ n = c->lo->ni + c->hi->ni;
+ in = malloc(sizeof(int) * n);
+ for (i=0;i<c->hi->ni;i++)
+ in[i] = c->hi->i[i];
+ for (i=c->lo->ni-1;i>=0;i--)
+ in[n-i-1] = c->lo->i[i] > 0 ? c->lo->i[i] : c->lo->i[i] + 2 * X_PI;
+ c->lo->ni = c->hi->ni = 0;
+
+ i = j = 0;
+ a = 0;
+ while (i < n && j < c->ni) /* whee */
+ a = (in[i] < c->i[j] ? in[i++] : c->i[j++]) - a;
+ while (i < n)
+ a = in[i++] - a;
+ while (j < c->ni)
+ a = c->i[j++] - a;
+
+ if (a > X_PI)
+ c->visible = !c->visible;
+ free(c->i);
+ c->ni = n;
+ c->i = in;
+ }
+
+static void flush_arc_buffer(struct state *st, Drawable w, GC gc)
+{
+ if (st->arc_buffer_count) {
+ XDrawArcs(st->dpy, w, gc, st->arc_buffer, st->arc_buffer_count);
+ st->arc_buffer_count = 0;
+ }
+ }
+
+static void draw_circle(struct state *st, Drawable w, GC gc, circle *c)
+{
+ int i, xi, yi, di;
+ adjust_circle_visibility(c);
+
+ xi = rint(c->x - c->r);
+ yi = rint(c->y - c->r);
+ di = c->r << 1;
+
+ #define ARC(p, a1, a2) { \
+ if (((p) & 1) ^ c->visible) { \
+ st->arc_buffer[st->arc_buffer_count].x = xi; \
+ st->arc_buffer[st->arc_buffer_count].y = yi; \
+ st->arc_buffer[st->arc_buffer_count].width = di; \
+ st->arc_buffer[st->arc_buffer_count].height = di; \
+ st->arc_buffer[st->arc_buffer_count].angle1 = -(a1); \
+ st->arc_buffer[st->arc_buffer_count].angle2 = (a1) - (a2); \
+ st->arc_buffer_count++; \
+ if (st->arc_buffer_count == ARC_BUFFER_SIZE) \
+ flush_arc_buffer(st, w, gc); \
+ } \
+ }
+
+ if (!c->ni)
+ ARC(0, 0, 2 * X_PI)
+ else
+ ARC(0, c->i[c->ni-1], c->i[0] + 2 * X_PI)
+ for (i=1;i<c->ni;i++)
+ ARC(i, c->i[i-1], c->i[i])
+ }
+
+/******** toplevel */
+
+#if 0
+static void
+check_for_leaks (void)
+{
+#ifdef HAVE_SBRK
+ static unsigned long early_brk = 0;
+ unsigned long max = 30 * 1024 * 1024; /* 30 MB */
+ int b = (unsigned long) sbrk(0);
+ if (early_brk == 0)
+ early_brk = b;
+ else if (b > early_brk + max)
+ {
+ fprintf (stderr, "%s: leaked %lu MB -- aborting!\n",
+ progname, ((b - early_brk) >> 20));
+ exit (1);
+ }
+#endif /* HAVE_SBRK */
+}
+#endif
+
+static void *
+piecewise_init (Display *dd, Window ww)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dd;
+ st->window = ww;
+
+ st->count = get_integer_resource(st->dpy, "count", "Integer");
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->ncolors = get_integer_resource(st->dpy, "ncolors", "Integer");
+ st->colorspeed = get_integer_resource(st->dpy, "colorspeed", "Integer");
+ st->dbuf = get_boolean_resource(st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ st->color_iterations = st->colorspeed ? 100 / st->colorspeed : 100000;
+ if (!st->color_iterations)
+ st->color_iterations = 1;
+
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+ st->colors = calloc(sizeof(XColor), st->ncolors);
+
+ if (get_boolean_resource(st->dpy, "mono", "Boolean")) {
+ MONO:
+ st->ncolors = 1;
+ st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap, "foreground", "Foreground");
+ }
+ else {
+ make_color_loop(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ 0, 1, 1, 120, 1, 1, 240, 1, 1,
+ st->colors, &st->ncolors, True, False);
+ if (st->ncolors < 2)
+ goto MONO;
+ }
+
+ if (st->dbuf) {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = st->backb = xdbe_get_backbuffer(st->dpy, st->window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!st->b) {
+ st->ba = XCreatePixmap(st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
+ st->bb = XCreatePixmap(st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ st->b = st->window;
+
+ /* erasure gc */
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap, "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &st->gcv);
+
+ /* drawing gc */
+ st->flags = GCForeground;
+ st->color_index = random() % st->ncolors;
+ st->gcv.foreground = st->colors[st->color_index].pixel;
+ st->draw_gc = XCreateGC(st->dpy, st->b, st->flags, &st->gcv);
+
+ /* initialize circles */
+ st->circles = init_circles(st, st->count, st->xgwa.width, st->xgwa.height);
+
+ st->iterations = 0;
+
+ return st;
+}
+
+static unsigned long
+piecewise_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+
+ XFillRectangle (st->dpy, st->b, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ sweep(st, st->count, st->circles);
+ for (i=0;i<st->count;i++) {
+ draw_circle(st, st->b, st->draw_gc, st->circles+i);
+ move_circle(st->circles+i, st->xgwa.width, st->xgwa.height);
+ }
+ flush_arc_buffer(st, st->b, st->draw_gc);
+
+ if (++st->iterations % st->color_iterations == 0) {
+ st->color_index = (st->color_index + 1) % st->ncolors;
+ XSetForeground(st->dpy, st->draw_gc, st->colors[st->color_index].pixel);
+ }
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb) {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf) {
+ XCopyArea (st->dpy, st->b, st->window, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+/* check_for_leaks(); */
+ return st->delay;
+}
+
+static void
+piecewise_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+piecewise_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+piecewise_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+static const char *piecewise_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*delay: 10000",
+ "*speed: 15",
+ "*ncolors: 256",
+ ".colorspeed: 10",
+
+ ".count: 32",
+ ".minradius: 0.05",
+ ".maxradius: 0.2",
+
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+ };
+
+static XrmOptionDescRec piecewise_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-colorspeed", ".colorspeed", XrmoptionSepArg, 0 },
+
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-minradius", ".minradius", XrmoptionSepArg, 0 },
+ { "-maxradius", ".maxradius", XrmoptionSepArg, 0 },
+
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+ };
+
+
+XSCREENSAVER_MODULE ("Piecewise", piecewise)
diff --git a/hacks/piecewise.man b/hacks/piecewise.man
new file mode 100644
index 0000000..1d313bf
--- /dev/null
+++ b/hacks/piecewise.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+piecewise - lots of moving circles intersecting in interesting ways.
+.SH SYNOPSIS
+.B piecewise
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-colorspeed \fInumber\fP]
+[\-minradius \fInumber\fP]
+[\-maxradius \fInumber\fP]
+[\-no-db]
+[\-fps]
+.SH DESCRIPTION
+This draws a bunch of moving circles which switch from visibility to invisibility
+when they intersect.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+Number of circles. Default: 32.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors, only one of which is used at a time. Default: 256.
+.TP 8
+.B \-colorspeed \fInumber\fP
+How fast the color changes (0 - 100). Default: 10.
+.TP 8
+.B \-minradius \fInumber\fP
+Minimum circle radius (as a proportion of screen height). Default: 0.05.
+.TP 8
+.B \-maxradius \fInumber\fP
+Maximum circle radius (as a proportion of screen height). Default: 0.2.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Geoffrey Irving. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Geoffrey Irving.
diff --git a/hacks/polyominoes.c b/hacks/polyominoes.c
new file mode 100644
index 0000000..b87c3d3
--- /dev/null
+++ b/hacks/polyominoes.c
@@ -0,0 +1,2368 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* polyominoes --- Shows attempts to place polyominoes into a rectangle */
+
+#if 0
+static const char sccsid[] = "@(#)polyominoes.c 5.01 2000/12/18 xlockmore";
+#endif
+
+/*
+ * Copyright (c) 2000 by Stephen Montgomery-Smith <stephen@math.missouri.edu>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 07-Jan-2001: Made improvement to the search algorithm for the puzzles
+ * involving identical polyominoes (via the variable
+ * reason_to_not_attach). By Stephen Montgomery-Smith.
+ * 20-Dec-2000: Added more puzzles at David Bagley's request.
+ * 27-Nov-2000: Adapted from euler2d.c Copyright (c) 2000 by Stephen
+ * Montgomery-Smith
+ * 05-Jun-2000: Adapted from flow.c Copyright (c) 1996 by Tim Auckland
+ * 18-Jul-1996: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+ * 31-Aug-1990: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org)
+ */
+
+#ifdef STANDALONE
+# define MODE_polyominoes
+#define DEFAULTS "*delay: 10000 \n" \
+ "*cycles: 2000 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+
+# define release_polyominoes 0
+# define reshape_polyominoes 0
+# define polyominoes_handle_event 0
+# define SMOOTH_COLORS
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_polyominoes
+#define DEF_IDENTICAL "False"
+#define DEF_PLAIN "False"
+
+static Bool identical;
+static Bool plain;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] =
+{
+ {"-identical", ".polyominoes.identical", XrmoptionNoArg, "on"},
+ {"+identical", ".polyominoes.identical", XrmoptionNoArg, "off"},
+ {"-plain", ".polyominoes.plain", XrmoptionNoArg, "on"},
+ {"+plain", ".polyominoes.plain", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&identical, "identical", "Identical", DEF_IDENTICAL, t_Bool},
+ {&plain, "plain", "Plain", DEF_PLAIN, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-/+identical", "turn on/off puzzles where the polyomino pieces are identical"},
+ {"-/+plain", "turn on/off plain pieces"}
+};
+
+ENTRYPOINT ModeSpecOpt polyominoes_opts =
+{sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct polyominoes_description = {
+ "polyominoes", "init_polyominoes", "draw_polyominoes", (char *) NULL,
+ "refresh_polyominoes", "init_polyominoes", "free_polyominoes",
+ &polyominoes_opts, 6000, 1, 8192, 1, 64, 1.0, "",
+ "Shows attempts to place polyominoes into a rectangle", 0, NULL
+};
+
+#endif
+
+/* Each polyomino is described by several quantities:
+ len: the number of squares in the polyomino;
+ point: the list of points;
+ tranform_len: the number of items in transform_list;
+ transform_list: a list of transformations that need to be done in order
+ to get all rotations and reflections (see the function
+ transform below);
+ max_white: the maximum number of white squares covered if polyomino
+ is placed on a chess board;
+ color: it's display color;
+ attached: whether it is currently attached to the rectangle;
+ attach_point: point on rectangle where attached;
+ point_no: the number of the point where it is attached;
+ transform_index: which element of transform_list is currently being used.
+*/
+
+typedef struct {int x,y;} point_type;
+
+typedef struct {int len; point_type *point;
+ int transform_len, transform_list[8], max_white;
+ unsigned long color;
+ int attached;
+ point_type attach_point;
+ int point_no, transform_index;} polyomino_type;
+
+
+typedef struct _polyominoesstruct{
+ int wait;
+
+ int width, height;
+ unsigned border_color;
+ int mono;
+
+ polyomino_type *polyomino;
+ int nr_polyominoes;
+ Bool identical, use3D;
+ int *attach_list;
+ int nr_attached;
+
+/* The array that tells where the polyominoes are attached. */
+ int *array, *changed_array;
+
+/* These specify the dimensions of how things appear on the screen. */
+ int box, x_margin, y_margin;
+
+/* These booleans decide in which way to try to attach the polyominoes. */
+ int left_right, top_bottom;
+
+/* Bitmaps for display purposes. */
+ int use_bitmaps;
+ XImage *bitmaps[256];
+
+/* Structures used for display purposes if there is not enough memory
+ to allocate bitmaps (or if the screen is small). */
+ XSegment *lines;
+ XRectangle *rectangles;
+
+/* A procedure that may be used to see if certain configurations
+ are permissible. */
+ int (*check_ok)(struct _polyominoesstruct *sp);
+
+/* Tells program that solutions are invariant under 180 degree
+ rotation. */
+ int rot180;
+
+/* This is a variable used in the case that all the polyominoes are identical
+ that will further prune the search tree. Essentially it will be
+ int reason_to_not_attach[nr_polynominoes][nr_polynominoes];
+ Let me first explain the effect it is trying to overcome. Often
+ in the search process, the computer will first try to fit shapes into
+ a region (call it A), and then into another region (call it B) that is
+ essentially disjoint from A. But it may be that it just is not possible
+ to fit shapes into region B. So it fits something into A, and then
+ tries to fit something into B. Failing it fits something else into A,
+ and then tried again to fit something into B. Thus the program is trying
+ again and again to fit something into B, when it should have figured out
+ the first time that it was impossible.
+
+ To overcome this, everytime we try to attach a piece, we collect the reasons
+ why it cannot be attached (a boolean for each piece that got in the way).
+ If we see that a piece cannot be attached, we detach the other pieces until
+ we have detached at least one piece for which the boolean reason_to_not_attach
+ is set.
+*/
+ int *reason_to_not_attach;
+
+ int counter;
+} polyominoesstruct;
+
+#define ARRAY(x,y) (sp->array[(x)*sp->height+(y)])
+#define CHANGED_ARRAY(x,y) (sp->changed_array[(x)*sp->height+(y)])
+#define ARRAY_P(p) (sp->array[(p).x*sp->height+(p).y])
+#define CHANGED_ARRAY_P(p) (sp->changed_array[(p).x*sp->height+(p).y])
+#define ARR(x,y) (((x)<0||(x)>=sp->width||(y)<0||(y)>=sp->height)?-2:ARRAY(x,y))
+
+#define REASON_TO_NOT_ATTACH(x,y) (sp->reason_to_not_attach[(x)*sp->nr_polyominoes+(y)])
+
+#define ROUND8(n) ((((n)+7)/8)*8)
+
+/* Defines to index the bitmaps. A set bit indicates that an edge or
+ corner is required. */
+#define LEFT (1<<0)
+#define RIGHT (1<<1)
+#define UP (1<<2)
+#define DOWN (1<<3)
+#define LEFT_UP (1<<4)
+#define LEFT_DOWN (1<<5)
+#define RIGHT_UP (1<<6)
+#define RIGHT_DOWN (1<<7)
+#define IS_LEFT(n) ((n) & LEFT)
+#define IS_RIGHT(n) ((n) & RIGHT)
+#define IS_UP(n) ((n) & UP)
+#define IS_DOWN(n) ((n) & DOWN)
+#define IS_LEFT_UP(n) ((n) & LEFT_UP)
+#define IS_LEFT_DOWN(n) ((n) & LEFT_DOWN)
+#define IS_RIGHT_UP(n) ((n) & RIGHT_UP)
+#define IS_RIGHT_DOWN(n) ((n) & RIGHT_DOWN)
+
+/* Defines to access the bitmaps. */
+#define BITNO(x,y) ((x)+(y)*ROUND8(sp->box))
+#define SETBIT(n,x,y) {data[BITNO(x,y)/8] |= 1<<(BITNO(x,y)%8);}
+#define RESBIT(n,x,y) {data[BITNO(x,y)/8] &= ~(1<<(BITNO(x,y)%8));}
+#define TWOTHIRDSBIT(n,x,y) {if ((x+y-1)%3) SETBIT(n,x,y) else RESBIT(n,x,y)}
+#define HALFBIT(n,x,y) {if ((x-y)%2) SETBIT(n,x,y) else RESBIT(n,x,y)}
+#define THIRDBIT(n,x,y) {if (!((x-y-1)%3)) SETBIT(n,x,y) else RESBIT(n,x,y)}
+#define THREEQUARTERSBIT(n,x,y) \
+ {if ((y%2)||((x+2+y/2+1)%2)) SETBIT(n,x,y) else RESBIT(n,x,y)}
+#define NOTHALFBIT(n,x,y) {if ((x-y)%2) RESBIT(n,x,y) else SETBIT(n,x,y)}
+
+/* Parameters for bitmaps. */
+#define G ((sp->box/45)+1) /* 1/2 of gap between polyominoes. */
+#define T ((sp->box<=12)?1:(G*2)) /* Thickness of walls of polyominoes. */
+#define R ((sp->box<=12)?1:(G*6)) /* Amount of rounding. */
+#define RT ((sp->box<=12)?1:(G*3)) /* Thickness of wall of rounded parts.
+ Here 3 is an approximation to 2 sqrt(2). */
+#define RR 0 /* Roof ridge thickness */
+
+#if 0
+/* A list of those bitmaps we need to create to display any pentomino. */
+/* (not used right now because it does not seem to work for hexonimoes.) */
+
+static int bitmaps_needed[] =
+{
+ LEFT_UP|LEFT_DOWN|RIGHT_UP|RIGHT_DOWN,
+
+ LEFT|RIGHT_UP|RIGHT_DOWN,
+ RIGHT|LEFT_UP|LEFT_DOWN,
+ UP|LEFT_DOWN|RIGHT_DOWN,
+ DOWN|LEFT_UP|RIGHT_UP,
+ LEFT|RIGHT_UP,
+ RIGHT|LEFT_UP,
+ UP|LEFT_DOWN,
+ DOWN|LEFT_UP,
+ LEFT|RIGHT_DOWN,
+ RIGHT|LEFT_DOWN,
+ UP|RIGHT_DOWN,
+ DOWN|RIGHT_UP,
+
+/* These needed for hexonimoes*/
+ LEFT,
+ RIGHT,
+ UP,
+ DOWN,
+ LEFT_DOWN|RIGHT_UP|RIGHT_DOWN,
+ LEFT_UP|RIGHT_UP|RIGHT_DOWN,
+ LEFT_UP|LEFT_DOWN|RIGHT_DOWN,
+ LEFT_UP|LEFT_DOWN|RIGHT_UP,
+
+ LEFT|UP|RIGHT_DOWN,
+ LEFT|DOWN|RIGHT_UP,
+ RIGHT|UP|LEFT_DOWN,
+ RIGHT|DOWN|LEFT_UP,
+ LEFT|UP,
+ LEFT|DOWN,
+ RIGHT|UP,
+ RIGHT|DOWN,
+
+ LEFT|RIGHT,
+ UP|DOWN,
+
+ RIGHT|UP|DOWN,
+ LEFT|UP|DOWN,
+ LEFT|RIGHT|DOWN,
+ LEFT|RIGHT|UP,
+
+ -1
+};
+
+static int bitmap_needed(int n)
+{
+ int i;
+
+ for (i=0;bitmaps_needed[i]!=-1;i++)
+ if (n == bitmaps_needed[i])
+ return 1;
+ return 0;
+}
+
+#endif
+
+/* Some debugging routines.
+
+static void print_board(polyominoesstruct *sp)
+{
+ int x,y;
+ for (y=0;y<sp->height;y++) {
+ for (x=0;x<sp->width;x++)
+ if (ARRAY(x,y) == -1)
+ fprintf(stderr," ");
+ else
+ fprintf(stderr,"%c",'a'+ARRAY(x,y));
+ fprintf(stderr,"\n");
+ }
+ fprintf(stderr,"\n");
+}
+
+static void print_points(point_type *point, int len)
+{
+ int i;
+
+ for (i=0;i<len;i++)
+ fprintf(stderr,"(%d %d) ",point[i].x,point[i].y);
+}
+
+static void print_polyomino(polyomino_type poly)
+{
+ int i;
+
+ print_points(poly.point,poly.len);
+ fprintf(stderr,"\n");
+ for (i=0;i<poly.transform_len;i++)
+ fprintf(stderr,"%d ",poly.transform_list[i]);
+ fprintf(stderr,"\n");
+}
+*/
+
+static polyominoesstruct *polyominoeses = (polyominoesstruct *) NULL;
+
+static
+void random_permutation(int n, int a[])
+{
+ int i,j,k,r;
+
+ for (i=0;i<n;i++) a[i] = -1;
+ for (i=0;i<n;i++) {
+ r=NRAND(n-i);
+ k=0;
+ while(a[k]!=-1) k++;
+ for (j=0;j<r;j++) {
+ k++;
+ while(a[k]!=-1) k++;
+ }
+ a[k]=i;
+ }
+}
+
+
+/************************************************************
+These are the routines for manipulating the polyominoes and
+attaching and detaching them from the rectangle.
+************************************************************/
+
+static void transform(point_type in, point_type offset, int transform_no,
+ point_type attach_point, point_type *out) {
+ switch (transform_no) {
+ case 0: out->x=in.x-offset.x+attach_point.x;
+ out->y=in.y-offset.y+attach_point.y;
+ break;
+ case 1: out->x=-(in.y-offset.y)+attach_point.x;
+ out->y=in.x-offset.x+attach_point.y;
+ break;
+ case 2: out->x=-(in.x-offset.x)+attach_point.x;
+ out->y=-(in.y-offset.y)+attach_point.y;
+ break;
+ case 3: out->x=in.y-offset.y+attach_point.x;
+ out->y=-(in.x-offset.x)+attach_point.y;
+ break;
+ case 4: out->x=-(in.x-offset.x)+attach_point.x;
+ out->y=in.y-offset.y+attach_point.y;
+ break;
+ case 5: out->x=in.y-offset.y+attach_point.x;
+ out->y=in.x-offset.x+attach_point.y;
+ break;
+ case 6: out->x=in.x-offset.x+attach_point.x;
+ out->y=-(in.y-offset.y)+attach_point.y;
+ break;
+ case 7: out->x=-(in.y-offset.y)+attach_point.x;
+ out->y=-(in.x-offset.x)+attach_point.y;
+ break;
+ }
+}
+
+static int first_poly_no(polyominoesstruct *sp)
+{
+ int poly_no;
+
+ poly_no = 0;
+ while(poly_no<sp->nr_polyominoes && sp->polyomino[poly_no].attached)
+ poly_no++;
+ return poly_no;
+}
+
+static void next_poly_no(polyominoesstruct *sp, int *poly_no)
+{
+
+ if (sp->identical) {
+ *poly_no = sp->nr_polyominoes;
+ } else {
+ do {
+ (*poly_no)++;
+ } while (*poly_no<sp->nr_polyominoes && sp->polyomino[*poly_no].attached);
+ }
+}
+
+/* check_all_regions_multiple_of looks for connected regions of
+ blank spaces, and returns 0 if it finds a connected region containing
+ a number of blanks that is not a multiple of n.
+*/
+
+static void count_adjacent_blanks(polyominoesstruct *sp, int *count, int x, int y, int blank_mark)
+{
+
+ if (ARRAY(x,y) == -1) {
+ (*count)++;
+ ARRAY(x,y) = blank_mark;
+ if (x>=1) count_adjacent_blanks(sp, count,x-1,y,blank_mark);
+ if (x<sp->width-1) count_adjacent_blanks(sp, count,x+1,y,blank_mark);
+ if (y>=1) count_adjacent_blanks(sp, count,x,y-1,blank_mark);
+ if (y<sp->height-1) count_adjacent_blanks(sp, count,x,y+1,blank_mark);
+ }
+}
+
+static int check_all_regions_multiple_of(polyominoesstruct *sp, int n)
+{
+ int x,y,count,good = 1;
+
+ for (x=0;x<sp->width && good;x++) for (y=0;y<sp->height && good;y++) {
+ count = 0;
+ count_adjacent_blanks(sp, &count,x,y,-2);
+ good = count%n == 0;
+ }
+
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++)
+ if (ARRAY(x,y) == -2)
+ ARRAY(x,y) = -1;
+
+ return good;
+}
+
+static int check_all_regions_positive_combination_of(polyominoesstruct *sp, int m, int n)
+{
+ int x,y,count,good = 1;
+
+ for (x=0;x<sp->width && good;x++) for (y=0;y<sp->height && good;y++) {
+ count = 0;
+ count_adjacent_blanks(sp, &count,x,y,-2);
+ good = 0;
+ for (;count>=0 && !good;count-=m)
+ good = count%n == 0;
+ }
+
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++)
+ if (ARRAY(x,y) == -2)
+ ARRAY(x,y) = -1;
+
+ return good;
+}
+
+static int find_smallest_blank_component(polyominoesstruct *sp)
+{
+ int x,y,size,smallest_size,blank_mark,smallest_mark;
+
+ smallest_mark = blank_mark = -10;
+ smallest_size = 1000000000;
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++) if (ARRAY(x,y) == -1) {
+ size = 0;
+ count_adjacent_blanks(sp, &size,x,y,blank_mark);
+ if (size<smallest_size) {
+ smallest_mark = blank_mark;
+ smallest_size = size;
+ }
+ blank_mark--;
+ }
+
+ return smallest_mark;
+}
+
+/* "Chess board" check - see init_max_whites_list above for more details.
+*/
+/* If the rectangle is alternatively covered by white and black
+ squares (chess board style), then this gives the list of
+ the maximal possible whites covered by each polyomino. It
+ is used by the function whites_ok which makes sure that the
+ array has a valid number of white or black remaining blanks left.
+*/
+
+static int whites_ok(polyominoesstruct *sp)
+{
+ int x,y,poly_no,whites=0,blacks=0,max_white=0,min_white=0;
+
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++) {
+ if (ARRAY(x,y) == -1 && (x+y)%2) whites++;
+ if (ARRAY(x,y) == -1 && (x+y+1)%2) blacks++;
+ }
+ for (poly_no=0;poly_no<sp->nr_polyominoes;poly_no++) if (!sp->polyomino[poly_no].attached) {
+ max_white += sp->polyomino[poly_no].max_white;
+ min_white += sp->polyomino[poly_no].len - sp->polyomino[poly_no].max_white;
+ }
+ return (min_white <= blacks && min_white <= whites
+ && blacks <= max_white && whites <= max_white);
+}
+
+/* This routine looks at the point (x,y) and sees how many polyominoes
+ and all their various transforms may be attached there.
+*/
+
+static int
+score_point(polyominoesstruct *sp, int x, int y, int min_score_so_far)
+{
+ int poly_no, point_no, transform_index, i, attachable;
+ point_type attach_point = { 0, 0 }, target_point = { 0, 0 };
+ int score = 0;
+
+ if (x>=1 && x<sp->width-1 && y>=1 && y<sp->height-1 &&
+ ARRAY(x-1,y-1)<0 && ARRAY(x-1,y)<0 && ARRAY(x-1,y+1)<0 &&
+ ARRAY(x+1,y-1)<0 && ARRAY(x+1,y)<0 && ARRAY(x+1,y+1)<0 &&
+ ARRAY(x,y-1)<0 && ARRAY(x,y+1)<0)
+ return 10000;
+
+ attach_point.x = x;
+ attach_point.y = y;
+ for (poly_no=first_poly_no(sp);poly_no<sp->nr_polyominoes;next_poly_no(sp,&poly_no))
+ if (!sp->polyomino[poly_no].attached) {
+ for (point_no=0;point_no<sp->polyomino[poly_no].len;point_no++)
+ for (transform_index=0;transform_index<sp->polyomino[poly_no].transform_len;transform_index++) {
+ attachable = 1;
+ for (i=0;i<sp->polyomino[poly_no].len;i++) {
+ transform(sp->polyomino[poly_no].point[i],
+ sp->polyomino[poly_no].point[point_no],
+ sp->polyomino[poly_no].transform_list[transform_index],
+ attach_point, &target_point);
+ if ( ! ((target_point.x>=0) && (target_point.x<sp->width)
+ && (target_point.y>=0) && (target_point.y<sp->height)
+ && (ARRAY_P(target_point)<0))) {
+ attachable = 0;
+ break;
+ }
+ }
+ if (attachable) {
+ score++;
+ if (score>=min_score_so_far)
+ return score;
+ }
+ }
+ }
+
+ return score;
+}
+
+static void find_blank(polyominoesstruct *sp, point_type *point)
+{
+ int score, worst_score;
+ int x, y;
+ int blank_mark;
+
+ blank_mark = find_smallest_blank_component(sp);
+
+ worst_score = 1000000;
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++) if (ARRAY(x,y)==blank_mark) {
+ score = 100*score_point(sp,x,y,worst_score);
+ if (score>0) {
+ if (sp->left_right) score += 10*x;
+ else score += 10*(sp->width-1-x);
+ if (sp->top_bottom) score += y;
+ else score += (sp->height-1-y);
+ }
+ if (score<worst_score) {
+ point->x = x;
+ point->y = y;
+ worst_score = score;
+ }
+ }
+
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++)
+ if (ARRAY(x,y)<0) ARRAY(x,y) = -1;
+}
+
+/* Detaches the most recently attached polyomino. */
+
+static
+void detach(polyominoesstruct *sp, int *poly_no, int *point_no, int *transform_index, point_type *attach_point, int rot180)
+{
+ int i;
+ point_type target_point = { 0, 0 };
+
+ if (sp->nr_attached == 0) return;
+ sp->nr_attached--;
+ *poly_no = sp->attach_list[sp->nr_attached];
+ *point_no = sp->polyomino[*poly_no].point_no;
+ *transform_index = sp->polyomino[*poly_no].transform_index;
+ *attach_point = sp->polyomino[*poly_no].attach_point;
+ for (i=0;i<sp->polyomino[*poly_no].len;i++) {
+ transform(sp->polyomino[*poly_no].point[i],
+ sp->polyomino[*poly_no].point[*point_no],
+ sp->polyomino[*poly_no].transform_list[*transform_index]^(rot180<<1),
+ *attach_point, &target_point);
+ ARRAY_P(target_point) = -1;
+ CHANGED_ARRAY_P(target_point) = 1;
+ }
+
+ sp->polyomino[*poly_no].attached = 0;
+}
+
+/* Attempts to attach a polyomino at point (x,y) at the
+ point_no-th point of that polyomino, using the transform
+ transform_no. Returns 1 if successful.
+*/
+
+static
+int attach(polyominoesstruct *sp, int poly_no, int point_no, int transform_index, point_type attach_point, int rot180,
+ int *reason_to_not_attach) {
+ point_type target_point = { 0, 0 };
+ int i;
+ int attachable = 1, worst_reason_not_to_attach = 1000000000;
+
+ if (rot180) {
+ attach_point.x = sp->width-1-attach_point.x;
+ attach_point.y = sp->height-1-attach_point.y;
+ }
+
+ if (sp->polyomino[poly_no].attached)
+ return 0;
+
+ for (i=0;i<sp->polyomino[poly_no].len;i++) {
+ transform(sp->polyomino[poly_no].point[i],
+ sp->polyomino[poly_no].point[point_no],
+ sp->polyomino[poly_no].transform_list[transform_index]^(rot180<<1),
+ attach_point, &target_point);
+ if ( ! ((target_point.x>=0) && (target_point.x<sp->width)
+ && (target_point.y>=0) && (target_point.y<sp->height)
+ && (ARRAY_P(target_point) == -1))) {
+ if (sp->identical) {
+ attachable = 0;
+ if ((target_point.x>=0) && (target_point.x<sp->width)
+ && (target_point.y>=0) && (target_point.y<sp->height)
+ && (ARRAY_P(target_point) >= 0)
+ && (ARRAY_P(target_point)<worst_reason_not_to_attach))
+ worst_reason_not_to_attach = ARRAY_P(target_point);
+ }
+ else
+ return 0;
+ }
+ }
+
+ if (sp->identical && !attachable) {
+ if (worst_reason_not_to_attach < 1000000000)
+ reason_to_not_attach[worst_reason_not_to_attach] = 1;
+ return 0;
+ }
+
+ for (i=0;i<sp->polyomino[poly_no].len;i++) {
+ transform(sp->polyomino[poly_no].point[i],
+ sp->polyomino[poly_no].point[point_no],
+ sp->polyomino[poly_no].transform_list[transform_index]^(rot180<<1),
+ attach_point, &target_point);
+ ARRAY_P(target_point) = poly_no;
+ CHANGED_ARRAY_P(target_point) = 1;
+ }
+
+ sp->attach_list[sp->nr_attached] = poly_no;
+ sp->nr_attached++;
+
+ sp->polyomino[poly_no].attached = 1;
+ sp->polyomino[poly_no].point_no = point_no;
+ sp->polyomino[poly_no].attach_point = attach_point;
+ sp->polyomino[poly_no].transform_index = transform_index;
+
+ if (!sp->check_ok(sp)) {
+ detach(sp,&poly_no,&point_no,&transform_index,&attach_point,rot180);
+ return 0;
+ }
+
+ return 1;
+}
+
+static
+int next_attach_try(polyominoesstruct *sp, int *poly_no, int *point_no, int *transform_index)
+{
+
+ (*transform_index)++;
+ if (*transform_index>=sp->polyomino[*poly_no].transform_len) {
+ *transform_index = 0;
+ (*point_no)++;
+ if (*point_no>=sp->polyomino[*poly_no].len) {
+ *point_no = 0;
+ next_poly_no(sp,poly_no);
+ if (*poly_no>=sp->nr_polyominoes) {
+ *poly_no = first_poly_no(sp);
+ return 0;
+ }
+ }
+ }
+ return 1;
+}
+
+
+/*******************************************************
+Display routines.
+*******************************************************/
+
+static void
+draw_without_bitmaps(ModeInfo * mi, polyominoesstruct *sp)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int x,y,poly_no,nr_lines,nr_rectangles;
+
+ XSetLineAttributes(display,gc,sp->box/10+1,LineSolid,CapRound,JoinRound);
+
+ for (poly_no=-1;poly_no<sp->nr_polyominoes;poly_no++) {
+ nr_rectangles = 0;
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++)
+ if (CHANGED_ARRAY(x,y) && ARRAY(x,y) == poly_no) {
+ sp->rectangles[nr_rectangles].x = sp->x_margin + sp->box*x;
+ sp->rectangles[nr_rectangles].y = sp->y_margin + sp->box*y;
+ sp->rectangles[nr_rectangles].width = sp->box;
+ sp->rectangles[nr_rectangles].height = sp->box;
+ nr_rectangles++;
+ }
+ if (poly_no == -1)
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ else
+ XSetForeground(display, gc, sp->polyomino[poly_no].color);
+ XFillRectangles(display, window, gc, sp->rectangles, nr_rectangles);
+ }
+
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+
+ nr_lines = 0;
+ for (x=0;x<sp->width-1;x++) for (y=0;y<sp->height;y++) {
+ if (ARRAY(x,y) == -1 && ARRAY(x+1,y) == -1
+ && (CHANGED_ARRAY(x,y) || CHANGED_ARRAY(x+1,y))) {
+ sp->lines[nr_lines].x1 = sp->x_margin + sp->box*(x+1);
+ sp->lines[nr_lines].y1 = sp->y_margin + sp->box*y;
+ sp->lines[nr_lines].x2 = sp->x_margin + sp->box*(x+1);
+ sp->lines[nr_lines].y2 = sp->y_margin + sp->box*(y+1);
+ nr_lines++;
+ }
+ }
+ XDrawSegments(display, window, gc, sp->lines, nr_lines);
+
+ nr_lines = 0;
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height-1;y++) {
+ if (ARRAY(x,y) == -1 && ARRAY(x,y+1) == -1
+ && (CHANGED_ARRAY(x,y) || CHANGED_ARRAY(x,y+1))) {
+ sp->lines[nr_lines].x1 = sp->x_margin + sp->box*x;
+ sp->lines[nr_lines].y1 = sp->y_margin + sp->box*(y+1);
+ sp->lines[nr_lines].x2 = sp->x_margin + sp->box*(x+1);
+ sp->lines[nr_lines].y2 = sp->y_margin + sp->box*(y+1);
+ nr_lines++;
+ }
+ }
+ XDrawSegments(display, window, gc, sp->lines, nr_lines);
+
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawRectangle(display, window, gc, sp->x_margin, sp->y_margin, sp->box*sp->width, sp->box*sp->height);
+
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+
+ nr_lines = 0;
+ for (x=0;x<sp->width-1;x++) for (y=0;y<sp->height;y++) {
+ if (ARRAY(x+1,y) != ARRAY(x,y)) {
+ sp->lines[nr_lines].x1 = sp->x_margin + sp->box*(x+1);
+ sp->lines[nr_lines].y1 = sp->y_margin + sp->box*y;
+ sp->lines[nr_lines].x2 = sp->x_margin + sp->box*(x+1);
+ sp->lines[nr_lines].y2 = sp->y_margin + sp->box*(y+1);
+ nr_lines++;
+ }
+ }
+ XDrawSegments(display, window, gc, sp->lines, nr_lines);
+
+ nr_lines = 0;
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height-1;y++) {
+ if (ARRAY(x,y+1) != ARRAY(x,y)) {
+ sp->lines[nr_lines].x1 = sp->x_margin + sp->box*x;
+ sp->lines[nr_lines].y1 = sp->y_margin + sp->box*(y+1);
+ sp->lines[nr_lines].x2 = sp->x_margin + sp->box*(x+1);
+ sp->lines[nr_lines].y2 = sp->y_margin + sp->box*(y+1);
+ nr_lines++;
+ }
+ }
+ XDrawSegments(display, window, gc, sp->lines, nr_lines);
+ XSetLineAttributes(display,gc,1,LineSolid,CapRound,JoinRound);
+}
+
+static void create_bitmaps(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int x,y,n;
+ char *data;
+
+ for (n=0;n<countof(sp->bitmaps);n++) {
+
+/* Avoid duplication of identical bitmaps. */
+ if (IS_LEFT_UP(n) && (IS_LEFT(n) || IS_UP(n)))
+ sp->bitmaps[n] = sp->bitmaps[n & ~LEFT_UP];
+ else if (IS_LEFT_DOWN(n) && (IS_LEFT(n) || IS_DOWN(n)))
+ sp->bitmaps[n] = sp->bitmaps[n & ~LEFT_DOWN];
+ else if (IS_RIGHT_UP(n) && (IS_RIGHT(n) || IS_UP(n)))
+ sp->bitmaps[n] = sp->bitmaps[n & ~RIGHT_UP];
+ else if (IS_RIGHT_DOWN(n) && (IS_RIGHT(n) || IS_DOWN(n)))
+ sp->bitmaps[n] = sp->bitmaps[n & ~RIGHT_DOWN];
+
+ else /* if (bitmap_needed(n)) */ {
+ data = (char *) malloc(sizeof(char)*(sp->box*ROUND8(sp->box)/8));
+ if (data == NULL) {
+ sp->use_bitmaps = 0;
+ return;
+ }
+
+ for (y=0;y<sp->box;y++) for (x=0;x<sp->box;x++) {
+ if (!sp->use3D) {
+#ifdef SMALL_BELLYBUTTON
+ if (x >= sp->box / 2 && x <= sp->box / 2 + 1 &&
+ y >= sp->box / 2 && y <= sp->box / 2 + 1)
+ NOTHALFBIT(n,x,y)
+ else
+#endif
+ HALFBIT(n,x,y)
+ } else if ((x>=y && x<=sp->box-y-1 && IS_UP(n))
+ || (x<=y && x<=sp->box-y-1 && y<sp->box/2 && !IS_LEFT(n))
+ || (x>=y && x>=sp->box-y-1 && y<sp->box/2 && !IS_RIGHT(n)))
+ SETBIT(n,x,y)
+ else if ((x<=y && x<=sp->box-y-1 && IS_LEFT(n))
+ || (x>=y && x<=sp->box-y-1 && x<sp->box/2 && !IS_UP(n))
+ || (x<=y && x>=sp->box-y-1 && x<sp->box/2 && !IS_DOWN(n)))
+ TWOTHIRDSBIT(n,x,y)
+ else if ((x>=y && x>=sp->box-y-1 && IS_RIGHT(n))
+ || (x>=y && x<=sp->box-y-1 && x>=sp->box/2 && !IS_UP(n))
+ || (x<=y && x>=sp->box-y-1 && x>=sp->box/2 && !IS_DOWN(n)))
+ HALFBIT(n,x,y)
+ else if ((x<=y && x>=sp->box-y-1 && IS_DOWN(n))
+ || (x<=y && x<=sp->box-y-1 && y>=sp->box/2 && !IS_LEFT(n))
+ || (x>=y && x>=sp->box-y-1 && y>=sp->box/2 && !IS_RIGHT(n)))
+ THIRDBIT(n,x,y)
+ }
+
+ if (IS_LEFT(n))
+ for (y=0;y<sp->box;y++) for (x=G;x<G+T;x++)
+ SETBIT(n,x,y)
+ if (IS_RIGHT(n))
+ for (y=0;y<sp->box;y++) for (x=G;x<G+T;x++)
+ SETBIT(n,sp->box-1-x,y)
+ if (IS_UP(n))
+ for (x=0;x<sp->box;x++) for (y=G;y<G+T;y++)
+ SETBIT(n,x,y)
+ if (IS_DOWN(n))
+ for (x=0;x<sp->box;x++) for (y=G;y<G+T;y++)
+ SETBIT(n,x,sp->box-1-y)
+ if (IS_LEFT(n))
+ for (y=0;y<sp->box;y++) for (x=0;x<G;x++)
+ RESBIT(n,x,y)
+ if (IS_RIGHT(n))
+ for (y=0;y<sp->box;y++) for (x=0;x<G;x++)
+ RESBIT(n,sp->box-1-x,y)
+ if (IS_UP(n))
+ for (x=0;x<sp->box;x++) for (y=0;y<G;y++)
+ RESBIT(n,x,y)
+ if (IS_DOWN(n))
+ for (x=0;x<sp->box;x++) for (y=0;y<G;y++)
+ RESBIT(n,x,sp->box-1-y)
+
+ if (IS_LEFT(n) && IS_UP(n))
+ for (x=G;x<=G+R;x++)
+ for (y=G;y<=R+2*G-x;y++) {
+ if (x+y>R+2*G-RT)
+ SETBIT(n,x,y)
+ else
+ RESBIT(n,x,y)
+ }
+ if (IS_LEFT(n) && IS_DOWN(n))
+ for (x=G;x<=G+R;x++)
+ for (y=G;y<=R+2*G-x;y++) {
+ if (x+y>R+2*G-RT)
+ SETBIT(n,x,sp->box-1-y)
+ else
+ RESBIT(n,x,sp->box-1-y)
+ }
+ if (IS_RIGHT(n) && IS_UP(n))
+ for (x=G;x<=G+R;x++)
+ for (y=G;y<=R+2*G-x;y++) {
+ if (x+y>R+2*G-RT)
+ SETBIT(n,sp->box-1-x,y)
+ else
+ RESBIT(n,sp->box-1-x,y)
+ }
+ if (IS_RIGHT(n) && IS_DOWN(n))
+ for (x=G;x<=G+R;x++)
+ for (y=G;y<=R+2*G-x;y++) {
+ if (x+y>R+2*G-RT)
+ SETBIT(n,sp->box-1-x,sp->box-1-y)
+ else
+ RESBIT(n,sp->box-1-x,sp->box-1-y)
+ }
+
+ if (!IS_LEFT(n) && !IS_UP(n) && IS_LEFT_UP(n)) {
+ for (x=0;x<G;x++) for(y=0;y<G;y++)
+ RESBIT(n,x,y)
+ for (x=G;x<G+T;x++) for(y=0;y<G;y++)
+ SETBIT(n,x,y)
+ for (x=0;x<G+T;x++) for(y=G;y<G+T;y++)
+ SETBIT(n,x,y)
+ }
+ if (!IS_LEFT(n) && !IS_DOWN(n) && IS_LEFT_DOWN(n)) {
+ for (x=0;x<G;x++) for(y=0;y<G;y++)
+ RESBIT(n,x,sp->box-1-y)
+ for (x=G;x<G+T;x++) for(y=0;y<G;y++)
+ SETBIT(n,x,sp->box-1-y)
+ for (x=0;x<G+T;x++) for(y=G;y<G+T;y++)
+ SETBIT(n,x,sp->box-1-y)
+ }
+ if (!IS_RIGHT(n) && !IS_UP(n) && IS_RIGHT_UP(n)) {
+ for (x=0;x<G;x++) for(y=0;y<G;y++)
+ RESBIT(n,sp->box-1-x,y)
+ for (x=G;x<G+T;x++) for(y=0;y<G;y++)
+ SETBIT(n,sp->box-1-x,y)
+ for (x=0;x<G+T;x++) for(y=G;y<G+T;y++)
+ SETBIT(n,sp->box-1-x,y)
+ }
+ if (!IS_RIGHT(n) && !IS_DOWN(n) && IS_RIGHT_DOWN(n)) {
+ for (x=0;x<G;x++) for(y=0;y<G;y++)
+ RESBIT(n,sp->box-1-x,sp->box-1-y)
+ for (x=G;x<G+T;x++) for(y=0;y<G;y++)
+ SETBIT(n,sp->box-1-x,sp->box-1-y)
+ for (x=0;x<G+T;x++) for(y=G;y<G+T;y++)
+ SETBIT(n,sp->box-1-x,sp->box-1-y)
+ }
+
+#ifdef LARGE_BELLYBUTTON
+ if (!sp->use3D) {
+ if (!IS_LEFT(n) && !IS_UP(n) && !IS_LEFT_UP(n))
+ for (x=0;x<G+T;x++) for(y=0;y<G+T;y++)
+ SETBIT(n,x,y)
+ if (!IS_LEFT(n) && !IS_DOWN(n) && !IS_LEFT_DOWN(n))
+ for (x=0;x<G+T;x++) for(y=sp->box-G-T;y<sp->box;y++)
+ SETBIT(n,x,y)
+ if (!IS_RIGHT(n) && !IS_UP(n) && !IS_RIGHT_UP(n))
+ for (x=sp->box-G-T;x<sp->box;x++) for(y=0;y<G+T;y++)
+ SETBIT(n,x,y)
+ if (!IS_RIGHT(n) && !IS_DOWN(n) && !IS_RIGHT_DOWN(n))
+ for (x=sp->box-G-T;x<sp->box;x++) for(y=sp->box-G-T;y<sp->box;y++)
+ SETBIT(n,x,y)
+ } else
+#else
+ if (sp->use3D)
+#endif
+ {
+ if (!IS_LEFT(n) && !IS_UP(n) && !IS_LEFT_UP(n))
+ for (x=0;x<sp->box/2-RR;x++) for(y=0;y<sp->box/2-RR;y++)
+ THREEQUARTERSBIT(n,x,y)
+ if (!IS_LEFT(n) && !IS_DOWN(n) && !IS_LEFT_DOWN(n))
+ for (x=0;x<sp->box/2-RR;x++) for(y=sp->box/2+RR;y<sp->box;y++)
+ THREEQUARTERSBIT(n,x,y)
+ if (!IS_RIGHT(n) && !IS_UP(n) && !IS_RIGHT_UP(n))
+ for (x=sp->box/2+RR;x<sp->box;x++) for(y=0;y<sp->box/2-RR;y++)
+ THREEQUARTERSBIT(n,x,y)
+ if (!IS_RIGHT(n) && !IS_DOWN(n) && !IS_RIGHT_DOWN(n))
+ for (x=sp->box/2+RR;x<sp->box;x++) for(y=sp->box/2+RR;y<sp->box;y++)
+ THREEQUARTERSBIT(n,x,y)
+ }
+
+ sp->bitmaps[n] = XCreateImage(MI_DISPLAY(mi), MI_VISUAL(mi), 1, XYBitmap,
+ 0, data, sp->box, sp->box, 8, 0);
+ if (sp->bitmaps[n] == None) {
+ free(data);
+ sp->use_bitmaps = 0;
+ return;
+ }
+ sp->bitmaps[n]->byte_order = MSBFirst;
+ sp->bitmaps[n]->bitmap_unit = 8;
+ sp->bitmaps[n]->bitmap_bit_order = LSBFirst;
+ }
+ }
+
+ sp->use_bitmaps = 1;
+}
+
+static void draw_with_bitmaps(ModeInfo * mi, polyominoesstruct *sp)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int x,y,t,bitmap_index;
+
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++) {
+ if (ARRAY(x,y) == -1) {
+ if (CHANGED_ARRAY(x,y)) {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XFillRectangle(display,window,gc,
+ sp->x_margin + sp->box*x,
+ sp->y_margin + sp->box*y,
+ sp->box,sp->box);
+ }
+ }
+ else {
+ XSetForeground(display, gc, sp->polyomino[ARRAY(x,y)].color);
+ bitmap_index = 0;
+ if (ARR(x,y) != ARR(x-1,y)) bitmap_index |= LEFT;
+ if (ARR(x,y) != ARR(x+1,y)) bitmap_index |= RIGHT;
+ if (ARR(x,y) != ARR(x,y-1)) bitmap_index |= UP;
+ if (ARR(x,y) != ARR(x,y+1)) bitmap_index |= DOWN;
+ if (ARR(x,y) != ARR(x-1,y-1)) bitmap_index |= LEFT_UP;
+ if (ARR(x,y) != ARR(x-1,y+1)) bitmap_index |= LEFT_DOWN;
+ if (ARR(x,y) != ARR(x+1,y-1)) bitmap_index |= RIGHT_UP;
+ if (ARR(x,y) != ARR(x+1,y+1)) bitmap_index |= RIGHT_DOWN;
+ (void) XPutImage(display,window,gc,
+ sp->bitmaps[bitmap_index],
+ 0,0,
+ sp->x_margin + sp->box*x,
+ sp->y_margin + sp->box*y,
+ sp->box,sp->box);
+ }
+ }
+
+ XSetForeground(display, gc, sp->border_color);
+ for (t=G;t<G+T;t++)
+ XDrawRectangle(display,window,gc,
+ sp->x_margin-t-1,sp->y_margin-t-1,
+ sp->box*sp->width+1+2*t, sp->box*sp->height+1+2*t);
+}
+
+
+/***************************************************
+Routines to initialise and close down polyominoes.
+***************************************************/
+
+static void free_bitmaps(polyominoesstruct *sp)
+{
+ int n;
+
+ for (n=0;n<countof(sp->bitmaps);n++)
+/* Don't bother to free duplicates */
+ if (IS_LEFT_UP(n) && (IS_LEFT(n) || IS_UP(n)))
+ sp->bitmaps[n] = None;
+ else if (IS_LEFT_DOWN(n) && (IS_LEFT(n) || IS_DOWN(n)))
+ sp->bitmaps[n] = None;
+ else if (IS_RIGHT_UP(n) && (IS_RIGHT(n) || IS_UP(n)))
+ sp->bitmaps[n] = None;
+ else if (IS_RIGHT_DOWN(n) && (IS_RIGHT(n) || IS_DOWN(n)))
+ sp->bitmaps[n] = None;
+
+ else if (sp->bitmaps[n] != None) {
+ XDestroyImage(sp->bitmaps[n]);
+ sp->bitmaps[n] = None;
+ }
+}
+
+#define deallocate(p,t) if ((p)!=NULL) {free(p); p=(t*)NULL;}
+
+ENTRYPOINT void free_polyominoes(ModeInfo * mi)
+{
+ polyominoesstruct *sp = &polyominoeses[MI_SCREEN(mi)];
+ int n;
+
+ for (n=0;n<sp->nr_polyominoes;n++) {
+ deallocate(sp->polyomino[n].point, point_type);
+ }
+
+ deallocate(sp->polyomino, polyomino_type);
+ deallocate(sp->attach_list, int);
+ deallocate(sp->rectangles, XRectangle);
+ deallocate(sp->lines, XSegment);
+ deallocate(sp->reason_to_not_attach, int);
+ deallocate(sp->array, int);
+ deallocate(sp->changed_array, int);
+
+ free_bitmaps(sp);
+}
+
+#define set_allocate(p,type,size) p = (type *) malloc(size); \
+ if ((p)==NULL) {free_polyominoes(mi);return 0;}
+
+#define copy_polyomino(dst,src,new_rand) \
+ (dst).len=(src).len; \
+ (dst).max_white = (src).max_white; \
+ set_allocate((dst).point,point_type,sizeof(point_type)*(src).len); \
+ (dst).len = (src).len; \
+ if (new_rand) \
+ random_permutation((src).len,perm_point); \
+ for (i=0;i<(src).len;i++) \
+ (dst).point[i] = (src).point[perm_point[i]]; \
+ (dst).transform_len = (src).transform_len; \
+ if (new_rand) \
+ random_permutation((src).transform_len,perm_transform); \
+ for (i=0;i<(src).transform_len;i++) \
+ (dst).transform_list[i] = (src).transform_list[perm_transform[i]]; \
+ (dst).attached = 0
+
+
+/***************************************************
+Puzzle specific initialization routines.
+***************************************************/
+
+static
+int check_pentomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_multiple_of(sp, 5) && whites_ok(sp);
+}
+
+static
+int check_hexomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_multiple_of(sp, 6) && whites_ok(sp);
+}
+
+static
+int check_tetr_pentomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_positive_combination_of(sp, 5, 4) && whites_ok(sp);
+}
+
+static
+int check_pent_hexomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_positive_combination_of(sp, 6, 5) && whites_ok(sp);
+}
+
+static
+int check_heptomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_multiple_of(sp, 7) && whites_ok(sp);
+}
+
+static
+int check_octomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_multiple_of(sp, 8) && whites_ok(sp);
+}
+
+static
+int check_dekomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_multiple_of(sp, 10) && whites_ok(sp);
+}
+
+static
+int check_elevenomino_puzzle(polyominoesstruct *sp)
+{
+ return check_all_regions_multiple_of(sp, 11) && whites_ok(sp);
+}
+
+static struct {int len; point_type point[4];
+ int transform_len, transform_list[8], max_white;} tetromino[5] =
+{
+/*
+xxxx
+*/
+ {4, {{0,0}, {1,0}, {2,0}, {3,0}},
+ 2, {0, 1, -1, -1, -1, -1, -1, -1}, 2},
+/*
+xxx
+ x
+*/
+ {4, {{0,0}, {1,0}, {2,0}, {2,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 2},
+/*
+xxx
+ x
+*/
+ {4, {{0,0}, {1,0}, {1,1}, {2,0}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+xx
+ xx
+*/
+ {4, {{0,0}, {1,0}, {1,1}, {2,1}},
+ 4, {0, 1, 4, 5, -1, -1, -1, -1}, 2},
+/*
+xx
+xx
+*/
+ {4, {{0,0}, {0,1}, {1,0}, {1,1}},
+ 1, {0, -1, -1, -1, -1, -1, -1, -1}, 2}};
+
+
+static struct pentomino_struct {int len; point_type point[5];
+ int transform_len, transform_list[8], max_white;}
+ pentomino[12] =
+{
+/*
+xxxxx
+*/
+ {5, {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}},
+ 2, {0, 1, -1, -1, -1, -1, -1, -1}, 3},
+/*
+xxxx
+ x
+*/
+ {5, {{0,0}, {1,0}, {2,0}, {3,0}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxxx
+ x
+*/
+ {5, {{0,0}, {1,0}, {2,0}, {2,1}, {3,0}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+ x
+xxx
+ x
+*/
+ {5, {{0,0}, {1,0}, {2,-1}, {2,0}, {2,1}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+xxx
+ xx
+*/
+ {5, {{0,0}, {1,0}, {2,0}, {2,1}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxx
+ xx
+*/
+ {5, {{0,0}, {1,0}, {1,1}, {2,0}, {2,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxx
+ x
+ x
+*/
+ {5, {{0,0}, {1,0}, {2,0}, {2,1}, {2,2}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+ x
+xxx
+ x
+*/
+ {5, {{0,0}, {1,-1}, {1,0}, {2,0}, {2,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxx
+x x
+*/
+ {5, {{0,0}, {0,1}, {1,0}, {2,0}, {2,1}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+ x
+xxx
+x
+*/
+ {5, {{0,0}, {0,1}, {1,0}, {2,-1}, {2,0}},
+ 4, {0, 1, 4, 5, -1, -1, -1, -1}, 3},
+/*
+ x
+xxx
+ x
+*/
+ {5, {{0,0}, {1,-1}, {1,0}, {1,1}, {2,0}},
+ 1, {0, -1, -1, -1, -1, -1, -1, -1}, 4},
+/*
+xx
+ xx
+ x
+*/
+ {5, {{0,0}, {1,0}, {1,1}, {2,1}, {2,2}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3}};
+
+
+static struct hexomino_struct {int len; point_type point[6];
+ int transform_len, transform_list[8], max_white;}
+ hexomino[35] =
+{
+/*
+xxxxxx
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
+ 2, {0, 1, -1, -1, -1, -1, -1, -1}, 3},
+/*
+xxxxx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {4,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxxxx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {3,0}, {3,1}, {4,0}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4},
+/*
+xxxxx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {2,1}, {3,0}, {4,0}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+ x
+xxxx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {3,-1}, {3,0}, {3,1}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 4},
+/*
+xxxx
+ xx
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {3,0}, {3,1}, {4,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxxx
+ xx
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {2,1}, {3,0}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxxx
+ x
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {3,0}, {3,1}, {3,2}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+ x
+xxxx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,-1}, {2,0}, {3,0}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxxx
+ x x
+*/
+ {6, {{0,0}, {1,0}, {1,1}, {2,0}, {3,0}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4},
+/*
+ x
+xxxx
+ x
+*/
+ {6, {{0,0}, {1,-1}, {1,0}, {2,0}, {3,0}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4},
+/*
+xxxx
+x x
+*/
+ {6, {{0,0}, {0,1}, {1,0}, {2,0}, {3,0}, {3,1}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+ x
+xxxx
+x
+*/
+ {6, {{0,0}, {0,1}, {1,0}, {2,0}, {3,-1}, {3,0}},
+ 4, {0, 1, 4, 5, -1, -1, -1, -1}, 3},
+/*
+ x
+xxxx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,-1}, {2,0}, {2,1}, {3,0}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 4},
+/*
+xxxx
+ xx
+*/
+ {6, {{0,0}, {1,0}, {1,1}, {2,0}, {2,1}, {3,0}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+xxxx
+ x
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {2,1}, {2,2}, {3,0}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+ x
+xxxx
+ x
+*/
+ {6, {{0,0}, {1,-1}, {1,0}, {2,0}, {2,1}, {3,0}},
+ 4, {0, 1, 4, 5, -1, -1, -1, -1}, 3},
+/*
+ xx
+xxx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,-1}, {2,0}, {2,1}, {3,-1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+ xx
+xxx
+ x
+*/
+ {6, {{0,0}, {1,-1}, {1,0}, {2,-1}, {2,0}, {2,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+ x
+xxx
+x x
+*/
+ {6, {{0,0}, {0,1}, {1,0}, {2,-1}, {2,0}, {2,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4},
+/*
+xxx
+ xxx
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {2,1}, {3,1}, {4,1}},
+ 4, {0, 1, 4, 5, -1, -1, -1, -1}, 3},
+/*
+xxx
+ xx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {2,1}, {3,1}, {3,2}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxx
+ xxx
+*/
+ {6, {{0,0}, {1,0}, {1,1}, {2,0}, {2,1}, {3,1}},
+ 4, {0, 1, 4, 5, -1, -1, -1, -1}, 4},
+/*
+xxx
+ xx
+ x
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {2,1}, {2,2}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4},
+/*
+ x
+xxx
+ xx
+*/
+ {6, {{0,0}, {1,-1}, {1,0}, {2,0}, {2,1}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4},
+/*
+xxx
+x xx
+*/
+ {6, {{0,0}, {0,1}, {1,0}, {2,0}, {2,1}, {3,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxx
+ xx
+ x
+*/
+ {6, {{0,0}, {1,0}, {1,1}, {2,0}, {2,1}, {2,2}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 4},
+/*
+ x
+xxx
+ xx
+*/
+ {6, {{0,0}, {1,-1}, {1,0}, {1,1}, {2,0}, {2,1}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 4},
+/*
+xxx
+xxx
+*/
+ {6, {{0,0}, {0,1}, {1,0}, {1,1}, {2,0}, {2,1}},
+ 2, {0, 1, -1, -1, -1, -1, -1, -1}, 3},
+/*
+xxx
+ x
+ xx
+*/
+ {6, {{0,0}, {1,0}, {2,0}, {2,1}, {2,2}, {3,2}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xxx
+ x
+ xx
+*/
+ {6, {{0,0}, {1,0}, {1,2}, {2,0}, {2,1}, {2,2}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+ x
+xxx
+x x
+*/
+ {6, {{0,0}, {0,1}, {1,-1}, {1,0}, {2,0}, {2,1}},
+ 4, {0, 1, 2, 3, -1, -1, -1, -1}, 3},
+/*
+ xx
+xxx
+x
+*/
+ {6, {{0,0}, {0,1}, {1,0}, {2,-1}, {2,0}, {3,-1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+ xx
+xxx
+x
+*/
+ {6, {{0,0}, {0,1}, {1,-1}, {1,0}, {2,-1}, {2,0}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3},
+/*
+xx
+ xx
+ xx
+*/
+ {6, {{0,0}, {1,0}, {1,1}, {2,1}, {2,2}, {3,2}},
+ 4, {0, 1, 4, 5, -1, -1, -1, -1}, 3}};
+
+static struct pentomino_struct one_sided_pentomino[60];
+
+static void make_one_sided_pentomino(void)
+{
+ int i,j,t,u;
+
+ j=0;
+ for (i=0;i<countof(pentomino);i++) {
+ one_sided_pentomino[j] = pentomino[i];
+ for (t=0;t<8;t++)
+ if (one_sided_pentomino[j].transform_list[t]>=4) {
+ one_sided_pentomino[j].transform_len = t;
+ j++;
+ one_sided_pentomino[j] = pentomino[i];
+ for (u=t;u<8;u++) one_sided_pentomino[j].transform_list[u-t] = one_sided_pentomino[j].transform_list[u];
+ one_sided_pentomino[j].transform_len -= t;
+ break;
+ }
+ j++;
+ }
+}
+
+static struct hexomino_struct one_sided_hexomino[60];
+
+static void make_one_sided_hexomino(void)
+{
+ int i,j,t,u;
+
+ j=0;
+ for (i=0;i<countof(hexomino);i++) {
+ one_sided_hexomino[j] = hexomino[i];
+ for (t=0;t<8;t++)
+ if (one_sided_hexomino[j].transform_list[t]>=4) {
+ one_sided_hexomino[j].transform_len = t;
+ j++;
+ one_sided_hexomino[j] = hexomino[i];
+ for (u=t;u<8;u++) one_sided_hexomino[j].transform_list[u-t] = one_sided_hexomino[j].transform_list[u];
+ one_sided_hexomino[j].transform_len -= t;
+ break;
+ }
+ j++;
+ }
+}
+
+/*
+Find all the ways of placing all twelve pentominoes
+into a rectangle whose size is 20x3, 15x4, 12x5 or 10x6.
+*/
+
+static
+int set_pentomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_poly[12], perm_point[5], perm_transform[8], i, p;
+
+ switch (NRAND(4)) {
+ case 0:
+ sp->width = 20;
+ sp->height = 3;
+ break;
+ case 1:
+ sp->width = 15;
+ sp->height = 4;
+ break;
+ case 2:
+ sp->width = 12;
+ sp->height = 5;
+ break;
+ case 3:
+ sp->width = 10;
+ sp->height = 6;
+ break;
+ }
+
+ sp->nr_polyominoes = 12;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ random_permutation(sp->nr_polyominoes,perm_poly);
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],pentomino[perm_poly[p]],1);
+ }
+
+ sp->check_ok = check_pentomino_puzzle;
+
+ return 1;
+}
+
+/*
+Many of the following puzzles are inspired by
+http://www.xs4all.nl/~gp/PolyominoSolver/Polyomino.html
+*/
+
+/*
+Find all the ways of placing all eighteen one-sided pentominoes
+into a rectangle.
+*/
+
+static
+int set_one_sided_pentomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_poly[18], perm_point[5], perm_transform[8], i, p;
+
+ make_one_sided_pentomino();
+
+ switch (NRAND(4)) {
+ case 0:
+ sp->width = 30;
+ sp->height = 3;
+ break;
+ case 1:
+ sp->width = 18;
+ sp->height = 5;
+ break;
+ case 2:
+ sp->width = 15;
+ sp->height = 6;
+ break;
+ case 3:
+ sp->width = 10;
+ sp->height = 9;
+ break;
+ }
+
+ sp->nr_polyominoes = 18;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ random_permutation(sp->nr_polyominoes,perm_poly);
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],one_sided_pentomino[perm_poly[p]],1);
+ }
+
+ sp->check_ok = check_pentomino_puzzle;
+
+ return 1;
+}
+
+/*
+Find all the ways of placing all sixty one-sided hexominoes
+into a rectangle.
+*/
+
+static
+int set_one_sided_hexomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_poly[60], perm_point[6], perm_transform[8], i, p;
+
+ make_one_sided_hexomino();
+
+ switch (NRAND(8)) {
+ case 0:
+ sp->width = 20;
+ sp->height = 18;
+ break;
+ case 1:
+ sp->width = 24;
+ sp->height = 15;
+ break;
+ case 2:
+ sp->width = 30;
+ sp->height = 12;
+ break;
+ case 3:
+ sp->width = 36;
+ sp->height = 10;
+ break;
+ case 4:
+ sp->width = 40;
+ sp->height = 9;
+ break;
+ case 5:
+ sp->width = 45;
+ sp->height = 8;
+ break;
+ case 6:
+ sp->width = 60;
+ sp->height = 6;
+ break;
+ case 7:
+ sp->width = 72;
+ sp->height = 5;
+ break;
+ }
+
+ sp->nr_polyominoes = 60;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ random_permutation(sp->nr_polyominoes,perm_poly);
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],one_sided_hexomino[perm_poly[p]],1);
+ }
+
+ sp->check_ok = check_hexomino_puzzle;
+
+ return 1;
+}
+
+/*
+Find all the ways of placing all five tetrominoes and all twelve
+pentominoes into a rectangle.
+*/
+
+static
+int set_tetr_pentomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_poly[17], perm_point[5], perm_transform[8], i, p;
+
+ switch (NRAND(3)) {
+ case 0:
+ sp->width = 20;
+ sp->height = 4;
+ break;
+ case 1:
+ sp->width = 16;
+ sp->height = 5;
+ break;
+ case 2:
+ sp->width = 10;
+ sp->height = 8;
+ break;
+ }
+
+ sp->nr_polyominoes = 17;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ random_permutation(sp->nr_polyominoes,perm_poly);
+ for (p=0;p<countof(tetromino);p++) {
+ copy_polyomino(sp->polyomino[perm_poly[p]],tetromino[p],1);
+ }
+ for (p=0;p<countof(pentomino);p++) {
+ copy_polyomino(sp->polyomino[perm_poly[p+5]],pentomino[p],1);
+ }
+
+ sp->check_ok = check_tetr_pentomino_puzzle;
+
+ return 1;
+}
+/*
+Find all the ways of placing all twelve pentominoes and all thirty five
+hexominoes into a rectangle whose size is 18x15.
+*/
+
+static
+int set_pent_hexomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_poly[47], perm_point[6], perm_transform[8], i, p;
+
+ switch (NRAND(5)) {
+ case 0:
+ sp->width = 54;
+ sp->height = 5;
+ break;
+ case 1:
+ sp->width = 45;
+ sp->height = 6;
+ break;
+ case 2:
+ sp->width = 30;
+ sp->height = 9;
+ break;
+ case 3:
+ sp->width = 27;
+ sp->height = 10;
+ break;
+ case 4:
+ sp->width = 18;
+ sp->height = 15;
+ break;
+ }
+
+ sp->nr_polyominoes = 47;
+ set_allocate(sp->polyomino,polyomino_type,47*sizeof(polyomino_type));
+ random_permutation(47,perm_poly);
+ for (p=0;p<countof(pentomino);p++) {
+ copy_polyomino(sp->polyomino[perm_poly[p]],pentomino[p],1);
+ }
+ for (p=0;p<countof(hexomino);p++) {
+ copy_polyomino(sp->polyomino[perm_poly[p+12]],hexomino[p],1);
+ }
+
+ sp->check_ok = check_pent_hexomino_puzzle;
+
+ return 1;
+}
+
+/*
+Other puzzles:
+
+Science News September 20, 1986 Vol 130, No 12
+Science News November 14, 1987 Vol 132, Pg 310
+*/
+
+/*
+
+ *
+**** fills a 10x5 rectangle
+
+*/
+
+static struct {int len; point_type point[5];
+ int transform_len, transform_list[8], max_white;} pentomino1 =
+ {5, {{0,0}, {1,0}, {2,0}, {3,0}, {1,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 3};
+
+static
+int set_pentomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[5], perm_transform[8], i, p;
+
+ sp->width = 10;
+ sp->height =5;
+
+ sp->nr_polyominoes = 10;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],pentomino1,1);
+ }
+
+ sp->check_ok = check_pentomino_puzzle;
+
+ return 1;
+}
+
+/*
+
+ *
+***** fills a 24x23 rectangle
+
+*/
+
+static struct {int len; point_type point[6];
+ int transform_len, transform_list[8], max_white;} hexomino1 =
+ {6, {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {1,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4};
+
+static
+int set_hexomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[6], perm_transform[8], i, p;
+
+ sp->width = 24;
+ sp->height =23;
+
+ sp->nr_polyominoes = 92;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],hexomino1,1);
+ }
+
+ sp->check_ok = check_hexomino_puzzle;
+
+ return 1;
+}
+
+/*
+
+ **
+***** fills a 21x26 rectangle
+
+(All solutions have 180 degree rotational symmetry)
+
+*/
+
+static struct {int len; point_type point[7];
+ int transform_len, transform_list[8], max_white;} heptomino1 =
+ {7, {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {1,1}, {2,1}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 4};
+
+static
+int set_heptomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[7], perm_transform[8], i, p;
+
+ sp->rot180 = 1;
+
+ sp->width = 26;
+ sp->height =21;
+
+ sp->nr_polyominoes = 78;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p+=2) {
+ copy_polyomino(sp->polyomino[p],heptomino1,1);
+ copy_polyomino(sp->polyomino[p+1],heptomino1,0);
+ }
+
+ sp->check_ok = check_heptomino_puzzle;
+
+ return 1;
+}
+
+/* The following puzzles from
+Polyominoes Puzzles, Patterns, Problems, and Packings Revised (2nd) Edition
+by Solomon W. Golomb Princeton University Press 1994
+*/
+
+/*
+
+ **
+***** fills a 28x19 rectangle
+
+*/
+static
+int set_heptomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[7], perm_transform[8], i, p;
+
+ sp->width = 28;
+ sp->height =19;
+
+ sp->nr_polyominoes = 76;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],heptomino1,1);
+ }
+
+ sp->check_ok = check_heptomino_puzzle;
+
+ return 1;
+}
+
+/*
+
+***
+**** fills a 25x22 rectangle
+****
+
+*/
+
+static struct {int len; point_type point[11];
+ int transform_len, transform_list[8], max_white;} elevenomino1 =
+ {11, {{0,0}, {1,0}, {2,0},
+ {0,1}, {1,1}, {2,1}, {3,1},
+ {0,2}, {1,2}, {2,2}, {3,2}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 6};
+
+static
+int set_elevenomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[11], perm_transform[8], i, p;
+
+ sp->rot180 = 1;
+
+ sp->width = 25;
+ sp->height =22;
+
+ sp->nr_polyominoes = 50;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p+=2) {
+ copy_polyomino(sp->polyomino[p],elevenomino1,1);
+ copy_polyomino(sp->polyomino[p+1],elevenomino1,0);
+ }
+
+ sp->check_ok = check_elevenomino_puzzle;
+
+ return 1;
+}
+
+/*
+
+ *
+ *
+**** fills 32 x 30 rectangle
+****
+
+*/
+
+static struct {int len; point_type point[10];
+ int transform_len, transform_list[8], max_white;} dekomino1 =
+ {10, { {1,-1},
+ {1,0},
+ {0,1}, {1,1}, {2,1}, {3,1},
+ {0,2}, {1,2}, {2,2}, {3,2}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 5};
+
+static
+int set_dekomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[10], perm_transform[8], i, p;
+
+ sp->width = 32;
+ sp->height =30;
+
+ sp->nr_polyominoes = 96;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],dekomino1,1);
+ }
+
+ sp->check_ok = check_dekomino_puzzle;
+
+ return 1;
+}
+
+/*
+
+ *
+*** fills 96 x 26 rectangle
+****
+
+*/
+
+static struct {int len; point_type point[10];
+ int transform_len, transform_list[8], max_white;} octomino1 =
+ {8, { {1,0},
+ {0,1}, {1,1}, {2,1},
+ {0,2}, {1,2}, {2,2}, {3,2}},
+ 8, {0, 1, 2, 3, 4, 5, 6, 7}, 5};
+
+static
+int set_octomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[8], perm_transform[8], i, p;
+
+ sp->width = 96;
+ sp->height =26;
+
+ sp->nr_polyominoes = 312;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],octomino1,1);
+ }
+
+ sp->check_ok = check_octomino_puzzle;
+
+ return 1;
+}
+
+/*
+
+ * fills 15 x 15 rectangle
+****
+
+*/
+
+static
+int set_pentomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[5], perm_transform[8], i, p;
+
+ sp->width = 15;
+ sp->height =15;
+
+ sp->nr_polyominoes = 45;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],pentomino1,1);
+ }
+
+ sp->check_ok = check_pentomino_puzzle;
+
+ return 1;
+}
+
+/*
+
+***
+**** fills a 47x33 rectangle
+****
+
+*/
+
+static
+int set_elevenomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp)
+{
+ int perm_point[11], perm_transform[8], i, p;
+
+ sp->width = 47;
+ sp->height =33;
+
+ sp->nr_polyominoes = 141;
+ set_allocate(sp->polyomino,polyomino_type,
+ sp->nr_polyominoes*sizeof(polyomino_type));
+ for (p=0;p<sp->nr_polyominoes;p++) {
+ copy_polyomino(sp->polyomino[p],elevenomino1,1);
+ }
+
+ sp->check_ok = check_elevenomino_puzzle;
+
+ return 1;
+}
+
+/**************************************************
+The main functions.
+**************************************************/
+
+#define allocate(p,type,size) p = (type *) malloc(size); if ((p)==NULL) {free_polyominoes(mi); return;}
+
+ENTRYPOINT void
+init_polyominoes (ModeInfo * mi)
+{
+ polyominoesstruct *sp;
+ int i,x,y, start;
+ int box1, box2;
+ int *perm;
+
+ MI_INIT (mi, polyominoeses);
+ sp = &polyominoeses[MI_SCREEN(mi)];
+
+ sp->rot180 = 0;
+ sp->counter = 0;
+
+ if (MI_IS_FULLRANDOM(mi)) {
+ sp->identical = (Bool) (LRAND() & 1);
+ sp->use3D = (Bool) (NRAND(4));
+ } else {
+ sp->identical = identical;
+ sp->use3D = !plain;
+ }
+ if (sp->identical) {
+ switch (NRAND(9)) {
+ case 0:
+ if (!set_pentomino_puzzle1(mi, sp))
+ return;
+ break;
+ case 1:
+ if (!set_hexomino_puzzle1(mi, sp))
+ return;
+ break;
+ case 2:
+ if (!set_heptomino_puzzle1(mi, sp))
+ return;
+ break;
+ case 3:
+ if (!set_heptomino_puzzle2(mi, sp))
+ return;
+ break;
+ case 4:
+ if (!set_elevenomino_puzzle1(mi, sp))
+ return;
+ break;
+ case 5:
+ if (!set_dekomino_puzzle1(mi, sp))
+ return;
+ break;
+ case 6:
+ if (!set_octomino_puzzle1(mi, sp))
+ return;
+ break;
+ case 7:
+ if (!set_pentomino_puzzle2(mi, sp))
+ return;
+ break;
+ case 8:
+ if (!set_elevenomino_puzzle2(mi, sp))
+ return;
+ break;
+ }
+ } else {
+ switch (NRAND(5)) {
+ case 0:
+ if (!set_pentomino_puzzle(mi, sp))
+ return;
+ break;
+ case 1:
+ if (!set_one_sided_pentomino_puzzle(mi, sp))
+ return;
+ break;
+ case 2:
+ if (!set_one_sided_hexomino_puzzle(mi, sp))
+ return;
+ break;
+ case 3:
+ if (!set_pent_hexomino_puzzle(mi, sp))
+ return;
+ break;
+ case 4:
+ if (!set_tetr_pentomino_puzzle(mi, sp))
+ return;
+ break;
+ }
+ }
+
+ if (MI_HEIGHT(mi) > MI_WIDTH(mi)) { /* rotate if portrait */
+ int swap = sp->height;
+ sp->height = sp->width;
+ sp->width = swap;
+ }
+
+ allocate(sp->attach_list,int,sp->nr_polyominoes*sizeof(int));
+ sp->nr_attached = 0;
+
+ if (sp->identical) {
+ allocate(sp->reason_to_not_attach,int,sp->nr_polyominoes*sp->nr_polyominoes*sizeof(int));
+ }
+
+ allocate(sp->array,int,sp->width*sp->height*sizeof(int));
+ allocate(sp->changed_array,int,sp->width*sp->height*sizeof(int));
+ for (x=0;x<sp->width;x++) for (y=0;y<sp->height;y++) ARRAY(x,y) = -1;
+
+ sp->left_right = NRAND(2);
+ sp->top_bottom = NRAND(2);
+
+ box1 = MI_WIDTH(mi)/(sp->width+2);
+ box2 = MI_HEIGHT(mi)/(sp->height+2);
+ if (box1<box2)
+ sp->box = box1;
+ else
+ sp->box = box2;
+
+ if (MI_WIDTH(mi) > MI_HEIGHT(mi) * 5 || /* weird window aspect ratio */
+ MI_HEIGHT(mi) > MI_WIDTH(mi)* 5) {
+ sp->box *= (MI_WIDTH(mi) > MI_HEIGHT(mi)
+ ? MI_WIDTH(mi) / (double) MI_HEIGHT(mi)
+ : MI_HEIGHT(mi) / (double) MI_WIDTH(mi));
+ }
+
+ if (sp->box >= 12) {
+ sp->box = (sp->box/12)*12;
+ create_bitmaps(mi,sp);
+ if (!sp->use_bitmaps)
+ free_bitmaps(sp);
+ }
+ else
+ sp->use_bitmaps = 0;
+
+ if (!sp->use_bitmaps) {
+ allocate(sp->rectangles,XRectangle,sp->width*sp->height*sizeof(XRectangle));
+ allocate(sp->lines,XSegment,sp->width*sp->height*sizeof(XSegment));
+ }
+
+ allocate(perm,int,sp->nr_polyominoes*sizeof(int));
+ random_permutation(sp->nr_polyominoes, perm);
+ sp->mono = MI_NPIXELS(mi) < 12;
+ start = NRAND(MI_NPIXELS(mi));
+ for (i=0;i<sp->nr_polyominoes;i++)
+ if (!sp->mono) {
+ sp->polyomino[i].color = MI_PIXEL(mi,(perm[i]*MI_NPIXELS(mi) / sp->nr_polyominoes + start) % MI_NPIXELS(mi));
+ if (sp->rot180) {
+ sp->polyomino[i+1].color = sp->polyomino[i].color;
+ i++;
+ }
+ }
+ else
+ if(sp->use_bitmaps)
+ sp->polyomino[i].color = MI_WHITE_PIXEL(mi);
+ else
+ sp->polyomino[i].color = MI_BLACK_PIXEL(mi);
+ free(perm);
+
+ if (sp->use_bitmaps) {
+ if (sp->mono)
+ sp->border_color = MI_WHITE_PIXEL(mi);
+ else
+ sp->border_color = MI_PIXEL(mi,NRAND(MI_NPIXELS(mi)));
+ }
+
+ sp->x_margin = (MI_WIDTH(mi)-sp->box*sp->width)/2;
+ sp->y_margin = (MI_HEIGHT(mi)-sp->box*sp->height)/2;
+
+ sp->wait = 0;
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+
+}
+
+ENTRYPOINT void
+draw_polyominoes (ModeInfo * mi)
+{
+ polyominoesstruct *sp;
+ int poly_no,point_no,transform_index,done,another_attachment_try;
+ point_type attach_point;
+ int i,detach_until;
+
+ if (polyominoeses == NULL)
+ return;
+ sp = &polyominoeses[MI_SCREEN(mi)];
+
+ if (MI_CYCLES(mi) != 0) {
+ if (++sp->counter > MI_CYCLES(mi)) {
+ init_polyominoes(mi);
+ return;
+ }
+ }
+
+ if (sp->box == 0) {
+ init_polyominoes(mi);
+ return;
+ }
+
+ MI_IS_DRAWN(mi) = True;
+ sp->wait--;
+ if (sp->wait>0) return;
+
+ memset(sp->changed_array,0,sp->width*sp->height*sizeof(int));
+
+ poly_no = first_poly_no(sp);
+ point_no = 0;
+ transform_index = 0;
+ done = 0;
+ another_attachment_try = 1;
+ find_blank(sp,&attach_point);
+ if (sp->identical && sp->nr_attached < sp->nr_polyominoes)
+ memset(&REASON_TO_NOT_ATTACH(sp->nr_attached,0),0,sp->nr_polyominoes*sizeof(int));
+ while(!done) {
+ if (sp->nr_attached < sp->nr_polyominoes) {
+ while (!done && another_attachment_try) {
+ done = attach(sp,poly_no,point_no,transform_index,attach_point,0,&REASON_TO_NOT_ATTACH(sp->nr_attached,0));
+ if (done && sp->rot180) {
+ poly_no = first_poly_no(sp);
+ done = attach(sp,poly_no,point_no,transform_index,attach_point,1,&REASON_TO_NOT_ATTACH(sp->nr_attached-1,0));
+ if (!done)
+ detach(sp,&poly_no,&point_no,&transform_index,&attach_point,0);
+ }
+ if (!done)
+ another_attachment_try = next_attach_try(sp,&poly_no,&point_no,&transform_index);
+ }
+ }
+
+ if (sp->identical) {
+ if (!done) {
+ if (sp->nr_attached == 0)
+ done = 1;
+ else {
+ detach_until=sp->nr_attached-1;
+ if (sp->nr_attached < sp->nr_polyominoes)
+ while (detach_until>0 && REASON_TO_NOT_ATTACH(sp->nr_attached,detach_until)==0)
+ detach_until--;
+ while (sp->nr_attached>detach_until) {
+ if (sp->rot180)
+ detach(sp,&poly_no,&point_no,&transform_index,&attach_point,1);
+ detach(sp,&poly_no,&point_no,&transform_index,&attach_point,0);
+ if (sp->nr_attached+1+sp->rot180 < sp->nr_polyominoes)
+ for (i=0;i<sp->nr_polyominoes;i++)
+ REASON_TO_NOT_ATTACH(sp->nr_attached,i) |= REASON_TO_NOT_ATTACH(sp->nr_attached+1+sp->rot180,i);
+ }
+ another_attachment_try = next_attach_try(sp,&poly_no,&point_no,&transform_index);
+ }
+ }
+ }
+ else {
+ if (!done) {
+ if (sp->nr_attached == 0)
+ done = 1;
+ else {
+ if (sp->rot180)
+ detach(sp,&poly_no,&point_no,&transform_index,&attach_point,1);
+ detach(sp,&poly_no,&point_no,&transform_index,&attach_point,0);
+ }
+ another_attachment_try = next_attach_try(sp,&poly_no,&point_no,&transform_index);
+ }
+ }
+ }
+
+ if (sp->use_bitmaps)
+ draw_with_bitmaps(mi,sp);
+ else
+ draw_without_bitmaps(mi,sp);
+
+ if (sp->nr_attached == sp->nr_polyominoes)
+ sp->wait = 100;
+ else
+ sp->wait = 0;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_polyominoes (ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Polyominoes", polyominoes)
+
+#endif /* MODE_polyominoes */
diff --git a/hacks/polyominoes.man b/hacks/polyominoes.man
new file mode 100644
index 0000000..c99a836
--- /dev/null
+++ b/hacks/polyominoes.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+polyominoes - fill a rectangle with irregularly-shaped blocks.
+.SH SYNOPSIS
+.B polyominoes
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-identical]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Repeatedly attempts to completely fill a rectangle with irregularly-shaped
+puzzle pieces.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-identical | \-no-identical
+Whether to use identical pieces.
+.TP 8
+.B \-cycles \fInumber\fP
+Duration. 500 - 5000. Default: 2000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Stephen Montgomery-Smith. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Stephen Montgomery-Smith.
diff --git a/hacks/pong.c b/hacks/pong.c
new file mode 100644
index 0000000..fe200c3
--- /dev/null
+++ b/hacks/pong.c
@@ -0,0 +1,1118 @@
+/* pong, Copyright (c) 2003 Jeremy English <jenglish@myself.com>
+ * A pong screen saver
+ *
+ * Modified by Brian Sawicki <sawicki@imsa.edu> to fix a small bug.
+ * Before this fix after a certain point the paddles would be too
+ * small for the program to effectively hit the ball. The score would
+ * then skyrocket as the paddles missed most every time. Added a max
+ * so that once a paddle gets 10 the entire game restarts. Special
+ * thanks to Scott Zager for some help on this.
+ *
+ * Modified by Trevor Blackwell <tlb@tlb.org> to use analogtv.[ch] display.
+ * Also added gradual acceleration of the ball, shrinking of paddles, and
+ * scorekeeping.
+ *
+ * Modified by Gereon Steffens <gereon@steffens.org> to add -clock and -noise
+ * options. See http://www.burovormkrijgers.nl (ugly flash site,
+ * navigate to Portfolio/Browse/Misc/Pong Clock) for the hardware implementation
+ * that gave me the idea. In clock mode, the score reflects the current time, and
+ * the paddles simply stop moving when it's time for the other side to score. This
+ * means that the display is only updated a few seconds *after* the minute actually
+ * changes, but I think this fuzzyness fits well with the display, and since we're
+ * not displaying seconds, who cares. While I was at it, I added a -noise option
+ * to control the noisyness of the display.
+ *
+ * Modified by Dave Odell <dmo2118@gmail.com> to add -p1 and -p2 options.
+ * JWXYZ doesn't support XWarpPointer, so PLAYER_MOUSE only works on native
+ * X11. JWXYZ also doesn't support cursors, so PLAYER_TABLET doesn't hide the
+ * mouse pointer.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ * TLB sez: I haven't actually seen a pong game since I was about 9. Can
+ * someone who has one make this look more realistic? Issues:
+ *
+ * - the font for scores is wrong. For example '0' was square.
+ * - was there some kind of screen display when someone won?
+ * - did the ball move smoothly, or was the X or Y position quantized?
+ *
+ * It could also use better player logic: moving the paddle even when the ball
+ * is going away, and making mistakes instead of just not keeping up with the
+ * speeding ball.
+ *
+ * There is some info at http://www.mameworld.net/discrete/Atari/Atari.htm#Pong
+ *
+ * It says that the original Pong game did not have a microprocessor, or even a
+ * custom integrated circuit. It was all discrete logic.
+ *
+ */
+
+#include "screenhack.h"
+#include "analogtv.h"
+#include <time.h>
+#ifndef HAVE_JWXYZ
+# include <X11/keysym.h>
+#endif
+/* #define OUTPUT_POS */
+
+typedef enum {
+ PLAYER_AI,
+ PLAYER_MOUSE,
+ PLAYER_TABLET,
+ PLAYER_KEYBOARD,
+ PLAYER_KEYBOARD_LEFT
+} PlayerType;
+
+typedef struct _paddle {
+ PlayerType player;
+ int x;
+ int y;
+ int w;
+ int h;
+ int wait;
+ int lock;
+ int score;
+} Paddle;
+
+typedef struct _ball {
+ int x;
+ int y;
+ int w;
+ int h;
+} Ball;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int clock;
+
+ Paddle l_paddle;
+ Paddle r_paddle;
+ Ball ball;
+ int bx,by;
+ int m_unit;
+ int paddle_rate;
+ double noise;
+
+ analogtv *tv;
+ analogtv_input *inp;
+ analogtv_reception reception;
+
+ int paddle_ntsc[4];
+ int field_ntsc[4];
+ int ball_ntsc[4];
+ int score_ntsc[4];
+ int net_ntsc[4];
+
+ analogtv_font score_font;
+
+# ifndef HAVE_JWXYZ
+ Cursor null_cursor;
+# endif
+ int mouse_y;
+ unsigned w, h, screen_h, screen_h_mm;
+ Bool is_focused;
+ Bool key_w: 1;
+ Bool key_s: 1;
+ Bool key_up: 1;
+ Bool key_down: 1;
+ unsigned int dragging : 2;
+};
+
+
+enum {
+ PONG_W = ANALOGTV_VIS_LEN,
+ PONG_H = ANALOGTV_VISLINES,
+ PONG_TMARG = 10
+};
+
+static void
+p_hit_top_bottom(Paddle *p);
+
+static void
+hit_top_bottom(struct state *st)
+{
+ if ( (st->ball.y <= PONG_TMARG) ||
+ (st->ball.y+st->ball.h >= PONG_H) )
+ st->by=-st->by;
+}
+
+static void
+reset_score(struct state * st)
+{
+ if (st->clock)
+ {
+ /* init score to current time */
+ time_t now = time(0);
+ struct tm* now_tm = localtime(&now);
+
+ st->r_paddle.score = now_tm->tm_hour;
+ st->l_paddle.score = now_tm->tm_min;
+ }
+ else
+ {
+ st->r_paddle.score = 0;
+ st->l_paddle.score = 0;
+ }
+}
+
+static void
+new_game(struct state *st)
+{
+ /* Starts a Whole New Game*/
+ st->ball.x = PONG_W/2;
+ st->ball.y = PONG_H/2;
+ st->bx = st->m_unit;
+ st->by = st->m_unit;
+
+ /* jwz: perhaps not totally accurate, but randomize things a little bit
+ so that games on multiple screens are not identical. */
+ if (random() & 1) st->by = -st->by;
+ st->ball.y += (random() % (PONG_H/6))-(PONG_H/3);
+
+ st->l_paddle.wait = 1;
+ st->l_paddle.lock = 0;
+ st->r_paddle.wait = 0;
+ st->r_paddle.lock = 0;
+ st->paddle_rate = st->m_unit-1;
+ reset_score(st);
+
+ st->l_paddle.h = PONG_H/4;
+ st->r_paddle.h = PONG_H/4;
+ /* Adjust paddle position again, because
+ paddle length is enlarged (reset) above. */
+ p_hit_top_bottom(&st->l_paddle);
+ p_hit_top_bottom(&st->r_paddle);
+}
+
+static void
+start_game(struct state *st)
+{
+ /*Init the ball*/
+ st->ball.x = PONG_W/2;
+ st->ball.y = PONG_H/2;
+ st->bx = st->m_unit;
+ st->by = st->m_unit;
+
+ /* jwz: perhaps not totally accurate, but randomize things a little bit
+ so that games on multiple screens are not identical. */
+ if (random() & 1) st->by = -st->by;
+ st->ball.y += (random() % (PONG_H/6))-(PONG_H/3);
+
+ st->l_paddle.wait = 1;
+ st->l_paddle.lock = 0;
+ st->r_paddle.wait = 0;
+ st->r_paddle.lock = 0;
+ st->paddle_rate = st->m_unit-1;
+
+ if (st->l_paddle.h > 10) st->l_paddle.h= st->l_paddle.h*19/20;
+ if (st->r_paddle.h > 10) st->r_paddle.h= st->r_paddle.h*19/20;
+}
+
+static void
+hit_paddle(struct state *st)
+{
+ if ( st->ball.x + st->ball.w >= st->r_paddle.x &&
+ st->bx > 0 ) /*we are traveling to the right*/
+ {
+ if ((st->ball.y + st->ball.h > st->r_paddle.y) &&
+ (st->ball.y < st->r_paddle.y + st->r_paddle.h))
+ {
+ st->bx=-st->bx;
+ st->l_paddle.wait = 0;
+ st->r_paddle.wait = 1;
+ st->r_paddle.lock = 0;
+ st->l_paddle.lock = 0;
+ }
+ else
+ {
+ if (st->clock)
+ {
+ reset_score(st);
+ }
+ else
+ {
+ st->r_paddle.score++;
+ if (st->r_paddle.score >=10)
+ new_game(st);
+ else
+ start_game(st);
+ }
+ }
+ }
+
+ if (st->ball.x <= st->l_paddle.x + st->l_paddle.w &&
+ st->bx < 0 ) /*we are traveling to the left*/
+ {
+ if ( st->ball.y + st->ball.h > st->l_paddle.y &&
+ st->ball.y < st->l_paddle.y + st->l_paddle.h)
+ {
+ st->bx=-st->bx;
+ st->l_paddle.wait = 1;
+ st->r_paddle.wait = 0;
+ st->r_paddle.lock = 0;
+ st->l_paddle.lock = 0;
+ }
+ else
+ {
+ if (st->clock)
+ {
+ reset_score(st);
+ }
+ else
+ {
+ st->l_paddle.score++;
+ if (st->l_paddle.score >= 10)
+ new_game(st);
+ else
+ start_game(st);
+ }
+ }
+ }
+}
+
+static PlayerType
+get_player_type(Display *dpy, char *rsrc)
+{
+ PlayerType result;
+ char *s = get_string_resource(dpy, rsrc, "String");
+ if (!strcmp(s, "ai") || !strcmp(s, "AI"))
+ {
+ result = PLAYER_AI;
+ }
+# ifndef HAVE_JWXYZ
+ else if (!strcmp(s, "mouse"))
+ {
+ result = PLAYER_MOUSE;
+ }
+# endif
+ else if (!strcmp(s, "tab") || !strcmp(s, "tablet"))
+ {
+ result = PLAYER_TABLET;
+ }
+ else if (!strcmp(s, "kb") || !strcmp(s, "keyb") || !strcmp(s, "keyboard") ||
+ !strcmp(s, "right") || !strcmp(s, "kbright") ||
+ !strcmp(s, "arrows"))
+ {
+ result = PLAYER_KEYBOARD;
+ }
+ else if (!strcmp(s, "left") || !strcmp(s, "kbleft") ||
+ !strcmp(s, "ws") || !strcmp(s, "wasd"))
+ {
+ result = PLAYER_KEYBOARD_LEFT;
+ }
+ else
+ {
+ fprintf(stderr, "%s: invalid player type\n", progname);
+ result = PLAYER_AI;
+ }
+ free(s);
+ return result;
+}
+
+static void
+do_shape (struct state *st, const XWindowAttributes *xgwa)
+{
+ st->w = xgwa->width;
+ st->h = xgwa->height;
+ st->screen_h = XHeightOfScreen(xgwa->screen);
+ st->screen_h_mm = XHeightMMOfScreen(xgwa->screen);
+}
+
+#ifndef HAVE_JWXYZ
+static Bool
+needs_grab (struct state *st)
+{
+ return
+ st->l_paddle.player == PLAYER_MOUSE ||
+ st->r_paddle.player == PLAYER_MOUSE;
+/*
+ st->l_paddle.player == PLAYER_TABLET ||
+ st->r_paddle.player == PLAYER_TABLET;
+ */
+}
+
+static void
+grab_pointer (struct state *st)
+{
+ st->is_focused = True;
+ XGrabPointer(st->dpy, st->window, True, PointerMotionMask, GrabModeAsync,
+ GrabModeAsync, st->window, st->null_cursor, CurrentTime);
+}
+#endif /* !HAVE_JWXYZ */
+
+static void *
+pong_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+
+ int i;
+ XWindowAttributes xgwa;
+ struct {
+ int w, h;
+ char *s[10];
+ } fonts[2] = {
+ { /* regular pong font */
+ /* If you think we haven't learned anything since the early 70s,
+ look at this font for a while */
+ 4, 6,
+ {
+ "****"
+ "* *"
+ "* *"
+ "* *"
+ "* *"
+ "****",
+
+ " *"
+ " *"
+ " *"
+ " *"
+ " *"
+ " *",
+
+ "****"
+ " *"
+ "****"
+ "* "
+ "* "
+ "****",
+
+ "****"
+ " *"
+ "****"
+ " *"
+ " *"
+ "****",
+
+ "* *"
+ "* *"
+ "****"
+ " *"
+ " *"
+ " *",
+
+ "****"
+ "* "
+ "****"
+ " *"
+ " *"
+ "****",
+
+ "****"
+ "* "
+ "****"
+ "* *"
+ "* *"
+ "****",
+
+ "****"
+ " *"
+ " *"
+ " *"
+ " *"
+ " *",
+
+ "****"
+ "* *"
+ "****"
+ "* *"
+ "* *"
+ "****",
+
+ "****"
+ "* *"
+ "****"
+ " *"
+ " *"
+ " *"
+ }
+ },
+ { /* pong clock font - hand-crafted double size looks better */
+ 8, 12,
+ {
+ "####### "
+ "####### "
+ "## ## "
+ "## ## "
+ "## ## "
+ "## ## "
+ "## ## "
+ "## ## "
+ "## ## "
+ "####### "
+ "####### ",
+
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## ",
+
+ "####### "
+ "####### "
+ " ## "
+ " ## "
+ "####### "
+ "####### "
+ "## "
+ "## "
+ "## "
+ "####### "
+ "####### ",
+
+ "####### "
+ "####### "
+ " ## "
+ " ## "
+ "####### "
+ "####### "
+ " ## "
+ " ## "
+ " ## "
+ "####### "
+ "####### ",
+
+ "## ## "
+ "## ## "
+ "## ## "
+ "## ## "
+ "####### "
+ "####### "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## ",
+
+ "####### "
+ "####### "
+ "## "
+ "## "
+ "####### "
+ "####### "
+ " ## "
+ " ## "
+ " ## "
+ "####### "
+ "####### ",
+
+ "####### "
+ "####### "
+ "## "
+ "## "
+ "####### "
+ "####### "
+ "## ## "
+ "## ## "
+ "## ## "
+ "####### "
+ "####### ",
+
+ "####### "
+ "####### "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## "
+ " ## ",
+
+ "####### "
+ "####### "
+ "## ## "
+ "## ## "
+ "####### "
+ "####### "
+ "## ## "
+ "## ## "
+ "## ## "
+ "####### "
+ "####### ",
+
+ "####### "
+ "####### "
+ "## ## "
+ "## ## "
+ "####### "
+ "####### "
+ " ## "
+ " ## "
+ " ## "
+ "####### "
+ "####### "
+
+ }
+ }
+ };
+
+ st->dpy = dpy;
+ st->window = window;
+ st->tv=analogtv_allocate(st->dpy, st->window);
+ analogtv_set_defaults(st->tv, "");
+
+
+ st->clock = get_boolean_resource(st->dpy, "clock", "Boolean");
+
+ analogtv_make_font(st->dpy, st->window, &st->score_font,
+ fonts[st->clock].w, fonts[st->clock].h, NULL);
+
+ for (i=0; i<10; ++i)
+ {
+ analogtv_font_set_char(&st->score_font, '0'+i, fonts[st->clock].s[i]);
+ }
+
+#ifdef OUTPUT_POS
+ printf("screen(%d,%d,%d,%d)\n",0,0,PONG_W,PONG_H);
+#endif
+
+ st->inp=analogtv_input_allocate();
+ analogtv_setup_sync(st->inp, 0, 0);
+
+ st->reception.input = st->inp;
+ st->reception.level = 2.0;
+ st->reception.ofs=0;
+#if 0
+ if (random()) {
+ st->reception.multipath = frand(1.0);
+ } else {
+#endif
+ st->reception.multipath=0.0;
+#if 0
+ }
+#endif
+
+ /*Init the paddles*/
+ st->l_paddle.player = get_player_type(dpy, "p1");
+ st->l_paddle.x = 8;
+ st->l_paddle.y = 100;
+ st->l_paddle.w = 16;
+ st->l_paddle.h = PONG_H/4;
+ st->l_paddle.wait = 1;
+ st->l_paddle.lock = 0;
+ st->r_paddle = st->l_paddle;
+ st->r_paddle.player = get_player_type(dpy, "p2");
+ st->r_paddle.x = PONG_W - 8 - st->r_paddle.w;
+ st->r_paddle.wait = 0;
+ /*Init the ball*/
+ st->ball.x = PONG_W/2;
+ st->ball.y = PONG_H/2;
+ st->ball.w = 16;
+ st->ball.h = 8;
+
+ /* The mouse warping business breaks tablet input. */
+ if (st->l_paddle.player == PLAYER_MOUSE &&
+ st->r_paddle.player == PLAYER_TABLET)
+ {
+ st->l_paddle.player = PLAYER_TABLET;
+ }
+ if (st->r_paddle.player == PLAYER_MOUSE &&
+ st->l_paddle.player == PLAYER_TABLET)
+ {
+ st->r_paddle.player = PLAYER_TABLET;
+ }
+
+ if (st->clock) {
+ st->l_paddle.player = PLAYER_AI;
+ st->r_paddle.player = PLAYER_AI;
+ fprintf(stderr, "%s: clock mode requires AI control\n", progname);
+
+ }
+
+# ifndef HAVE_JWXYZ
+ if (st->l_paddle.player == PLAYER_MOUSE ||
+ st->r_paddle.player == PLAYER_MOUSE ||
+ st->l_paddle.player == PLAYER_TABLET ||
+ st->r_paddle.player == PLAYER_TABLET)
+ {
+ XColor black = {0, 0, 0, 0};
+ Pixmap cursor_pix = XCreatePixmap(dpy, window, 4, 4, 1);
+ XGCValues gcv;
+ GC mono_gc;
+
+ gcv.foreground = 0;
+ mono_gc = XCreateGC(dpy, cursor_pix, GCForeground, &gcv);
+ st->null_cursor = XCreatePixmapCursor(dpy, cursor_pix, cursor_pix,
+ &black, &black, 0, 0);
+ XFillRectangle(dpy, cursor_pix, mono_gc, 0, 0, 4, 4);
+ XFreeGC(dpy, mono_gc);
+
+ XSelectInput(dpy, window,
+ PointerMotionMask | FocusChangeMask |
+ KeyPressMask | KeyReleaseMask |
+ ButtonPressMask | ButtonReleaseMask);
+
+ if (needs_grab(st))
+ {
+ grab_pointer(st);
+ }
+ else
+ {
+ XDefineCursor(dpy, window, st->null_cursor);
+ }
+ }
+# endif
+
+ st->m_unit = get_integer_resource (st->dpy, "speed", "Integer");
+ st->noise = get_float_resource(st->dpy, "noise", "Float");
+ st->clock = get_boolean_resource(st->dpy, "clock", "Boolean");
+
+ if (!st->clock)
+ {
+ st->score_font.y_mult *= 2;
+ st->score_font.x_mult *= 2;
+ }
+
+ reset_score(st);
+
+ start_game(st);
+
+ analogtv_lcp_to_ntsc(ANALOGTV_BLACK_LEVEL, 0.0, 0.0, st->field_ntsc);
+ analogtv_lcp_to_ntsc(100.0, 0.0, 0.0, st->ball_ntsc);
+ analogtv_lcp_to_ntsc(100.0, 0.0, 0.0, st->paddle_ntsc);
+ analogtv_lcp_to_ntsc(100.0, 0.0, 0.0, st->score_ntsc);
+ analogtv_lcp_to_ntsc(100.0, 0.0, 0.0, st->net_ntsc);
+
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START, ANALOGTV_VIS_END,
+ ANALOGTV_TOP, ANALOGTV_BOT,
+ st->field_ntsc);
+
+ XGetWindowAttributes(dpy, window, &xgwa);
+ do_shape(st, &xgwa);
+
+ return st;
+}
+
+static void
+p_logic(struct state *st, Paddle *p)
+{
+ if (p->player == PLAYER_AI)
+ {
+ if (!p->wait)
+ {
+ int targ;
+ if (st->bx > 0) {
+ targ = st->ball.y + st->by * (st->r_paddle.x-st->ball.x) / st->bx;
+ }
+ else if (st->bx < 0) {
+ targ = st->ball.y - st->by * (st->ball.x - st->l_paddle.x - st->l_paddle.w) / st->bx;
+ }
+ else {
+ targ = st->ball.y;
+ }
+ if (targ > PONG_H) targ=PONG_H;
+ if (targ < 0) targ=0;
+
+ if (targ < p->y && !p->lock)
+ {
+ p->y -= st->paddle_rate;
+ }
+ else if (targ > (p->y + p->h) && !p->lock)
+ {
+ p->y += st->paddle_rate;
+ }
+ else
+ {
+ int move=targ - (p->y + p->h/2);
+ if (move>st->paddle_rate) move=st->paddle_rate;
+ if (move<-st->paddle_rate) move=-st->paddle_rate;
+ p->y += move;
+ p->lock = 1;
+ }
+ }
+ }
+# ifndef HAVE_JWXYZ
+ else if (p->player == PLAYER_MOUSE)
+ {
+ /* Clipping happens elsewhere. */
+ /* As the screen resolution increases, the mouse moves faster in terms of
+ pixels, so divide by DPI. */
+ p->y += (int)(st->mouse_y - (st->h / 2)) * 4 * (int)st->screen_h_mm / (3 * (int)st->screen_h);
+ if (st->is_focused)
+ XWarpPointer (st->dpy, None, st->window, 0, 0, 0, 0, st->w / 2, st->h / 2);
+ }
+# endif
+ else if (p->player == PLAYER_TABLET)
+ {
+ p->y = st->mouse_y * (PONG_H - PONG_TMARG) / st->h + PONG_TMARG - p->h / 2;
+ }
+ else if (p->player == PLAYER_KEYBOARD)
+ {
+ if (st->key_up)
+ p->y -= 8;
+ if (st->key_down)
+ p->y += 8;
+ }
+ else if (p->player == PLAYER_KEYBOARD_LEFT)
+ {
+ if (st->key_w)
+ p->y -= 8;
+ if (st->key_s)
+ p->y += 8;
+ }
+
+ if ((st->dragging == 1 && p == &st->l_paddle) ||
+ (st->dragging == 2 && p == &st->r_paddle))
+ {
+ /* Not getting MotionNotify. */
+ Window root1, child1;
+ int mouse_x, mouse_y, root_x, root_y;
+ unsigned int mask;
+ if (XQueryPointer (st->dpy, st->window, &root1, &child1,
+ &root_x, &root_y, &mouse_x, &mouse_y, &mask))
+ st->mouse_y = mouse_y;
+
+ if (st->mouse_y < 0) st->mouse_y = 0;
+ p->y = st->mouse_y * (PONG_H - PONG_TMARG) / st->h + PONG_TMARG - p->h / 2;
+ }
+}
+
+static void
+p_hit_top_bottom(Paddle *p)
+{
+ if(p->y <= PONG_TMARG)
+ {
+ p->y = PONG_TMARG;
+ }
+ if((p->y + p->h) >= PONG_H)
+ {
+ p->y = PONG_H - p->h;
+ }
+}
+
+/*
+ XFillRectangle (dpy, window, gc, p->x, p->y, p->w, p->h);
+ if (old_v > p->y)
+ {
+ XClearArea(dpy,window, p->x, p->y + p->h,
+ p->w, (old_v + p->h) - (p->y + p->h), 0);
+ }
+ else if (old_v < p->y)
+ {
+ XClearArea(dpy,window, p->x, old_v, p->w, p->y - old_v, 0);
+ }
+*/
+static void
+paint_paddle(struct state *st, Paddle *p)
+{
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START + p->x, ANALOGTV_VIS_START + p->x + p->w,
+ ANALOGTV_TOP, ANALOGTV_BOT,
+ st->field_ntsc);
+
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START + p->x, ANALOGTV_VIS_START + p->x + p->w,
+ ANALOGTV_TOP + p->y, ANALOGTV_TOP + p->y + p->h,
+ st->paddle_ntsc);
+}
+
+/*
+ XClearArea(dpy,window, old_ballx, old_bally, st->ball.d, st->ball.d, 0);
+ XFillRectangle (dpy, window, gc, st->ball.x, st->ball.y, st->ball.d, st->ball.d);
+ XFillRectangle (dpy, window, gc, xgwa.width / 2, 0, st->ball.d, xgwa.height);
+*/
+
+static void
+erase_ball(struct state *st)
+{
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START + st->ball.x, ANALOGTV_VIS_START + st->ball.x + st->ball.w,
+ ANALOGTV_TOP + st->ball.y, ANALOGTV_TOP + st->ball.y + st->ball.h,
+ st->field_ntsc);
+}
+
+static void
+paint_ball(struct state *st)
+{
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START + st->ball.x, ANALOGTV_VIS_START + st->ball.x + st->ball.w,
+ ANALOGTV_TOP + st->ball.y, ANALOGTV_TOP + st->ball.y + st->ball.h,
+ st->ball_ntsc);
+}
+
+static void
+paint_score(struct state *st)
+{
+ char buf[256];
+
+ char* fmt = (st->clock ? "%02d" : "%d");
+
+ analogtv_draw_solid(st->inp,
+ ANALOGTV_VIS_START, ANALOGTV_VIS_END,
+ ANALOGTV_TOP, ANALOGTV_TOP + 10+ st->score_font.char_h * st->score_font.y_mult,
+ st->field_ntsc);
+
+
+ sprintf(buf, fmt ,st->r_paddle.score%256);
+ analogtv_draw_string(st->inp, &st->score_font, buf,
+ ANALOGTV_VIS_START + 130, ANALOGTV_TOP + 8,
+ st->score_ntsc);
+
+ sprintf(buf, fmt, st->l_paddle.score%256);
+ analogtv_draw_string(st->inp, &st->score_font, buf,
+ ANALOGTV_VIS_END - 200, ANALOGTV_TOP + 8,
+ st->score_ntsc);
+
+}
+
+static void
+paint_net(struct state *st)
+{
+ int x,y;
+
+ x=(ANALOGTV_VIS_START + ANALOGTV_VIS_END)/2;
+
+ for (y=ANALOGTV_TOP; y<ANALOGTV_BOT; y+=6) {
+ analogtv_draw_solid(st->inp, x-2, x+2, y, y+3,
+ st->net_ntsc);
+ analogtv_draw_solid(st->inp, x-2, x+2, y+3, y+6,
+ st->field_ntsc);
+
+ }
+}
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+static unsigned long
+pong_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ const analogtv_reception *reception = &st->reception;
+ double then = double_time(), now, timedelta;
+
+ if (st->clock)
+ {
+ time_t now = time(0);
+ struct tm* tm_now = localtime(&now);
+
+ if (st->r_paddle.score != tm_now->tm_hour)
+ {
+ /* l paddle must score */
+ st->r_paddle.wait = 1;
+ }
+ else if (st->l_paddle.score != tm_now->tm_min)
+ {
+ /* r paddle must score */
+ st->l_paddle.wait = 1;
+ }
+ }
+ erase_ball(st);
+
+ st->ball.x += st->bx;
+ st->ball.y += st->by;
+
+ if (!st->clock)
+ {
+ /* in non-clock mode, occasionally increase ball speed */
+ if ((random()%40)==0) {
+ if (st->bx>0) st->bx++; else st->bx--;
+ }
+ }
+
+ p_logic(st, &st->r_paddle);
+ p_logic(st, &st->l_paddle);
+
+ p_hit_top_bottom(&st->r_paddle);
+ p_hit_top_bottom(&st->l_paddle);
+
+ hit_top_bottom(st);
+ hit_paddle(st);
+
+ #ifdef OUTPUT_POS
+ printf("(%d,%d,%d,%d)\n",st->ball.x,st->ball.y,st->ball.w,st->ball.h);
+ #endif
+
+ paint_score(st);
+
+ paint_net(st);
+
+ if (1) {
+ paint_paddle(st, &st->r_paddle);
+ paint_paddle(st, &st->l_paddle);
+ }
+ if (1) paint_ball(st);
+
+ analogtv_reception_update(&st->reception);
+ analogtv_draw(st->tv, st->noise, &reception, 1);
+
+ now = double_time();
+ timedelta = (1 / 29.97) - (now - then);
+ return timedelta > 0 ? timedelta * 1000000 : 0;
+}
+
+
+
+static const char *pong_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*speed: 6",
+ "*noise: 0.04",
+ "*clock: false",
+ "*p1: ai",
+ "*p2: ai",
+ ANALOGTV_DEFAULTS
+ 0
+};
+
+static XrmOptionDescRec pong_options [] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-noise", ".noise", XrmoptionSepArg, 0 },
+ { "-clock", ".clock", XrmoptionNoArg, "true" },
+ { "-p1", ".p1", XrmoptionSepArg, 0 },
+ { "-p2", ".p2", XrmoptionSepArg, 0 },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+static void
+pong_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes xgwa;
+ analogtv_reconfigure (st->tv);
+
+ XGetWindowAttributes(dpy, window, &xgwa); /* AnalogTV does this too. */
+ xgwa.width = w;
+ xgwa.height = h;
+ do_shape(st, &xgwa);
+}
+
+static Bool
+pong_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ switch (event->type)
+ {
+ case MotionNotify:
+ st->mouse_y = event->xmotion.y;
+ break;
+# ifndef HAVE_JWXYZ
+ case FocusIn:
+ if (needs_grab(st))
+ {
+ grab_pointer(st);
+ }
+ break;
+ case FocusOut:
+ if (needs_grab(st))
+ {
+ XUngrabPointer (dpy, CurrentTime);
+ st->is_focused = False;
+ }
+ break;
+# endif /* !HAVE_JWXYZ */
+ case KeyPress:
+ case KeyRelease:
+ {
+ char c;
+ KeySym key;
+ XLookupString(&event->xkey, &c, 1, &key, 0);
+ Bool is_pressed = event->type == KeyPress;
+ switch(key)
+ {
+ case XK_Up:
+ if (st->l_paddle.player == PLAYER_KEYBOARD ||
+ st->r_paddle.player == PLAYER_KEYBOARD)
+ {
+ st->key_up = is_pressed;
+ return True;
+ }
+ break;
+ case XK_Down:
+ if (st->l_paddle.player == PLAYER_KEYBOARD ||
+ st->r_paddle.player == PLAYER_KEYBOARD)
+ {
+ st->key_down = is_pressed;
+ return True;
+ }
+ break;
+ case 'w':
+ if (st->l_paddle.player == PLAYER_KEYBOARD_LEFT ||
+ st->r_paddle.player == PLAYER_KEYBOARD_LEFT)
+ {
+ st->key_w = is_pressed;
+ return True;
+ }
+ break;
+ case 's':
+ if (st->l_paddle.player == PLAYER_KEYBOARD_LEFT ||
+ st->r_paddle.player == PLAYER_KEYBOARD_LEFT)
+ {
+ st->key_s = is_pressed;
+ return True;
+ }
+ break;
+ }
+ }
+
+ /* Allow the user to pick up and drag either paddle with the mouse,
+ even when not in a mouse-paddle mode. */
+
+ case ButtonPress:
+ if (st->dragging != 0)
+ return False;
+ else if (event->xbutton.x < st->w * 0.2)
+ {
+ if (st->l_paddle.player != PLAYER_MOUSE)
+ st->dragging = 1;
+ return True;
+ }
+ else if (event->xbutton.x > st->w * 0.8)
+ {
+ if (st->r_paddle.player != PLAYER_MOUSE)
+ st->dragging = 2;
+ return True;
+ }
+ break;
+ case ButtonRelease:
+ if (st->dragging != 0)
+ {
+ st->dragging = 0;
+ return True;
+ }
+ break;
+ }
+ return False;
+}
+
+static void
+pong_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_release(st->tv);
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Pong", pong)
diff --git a/hacks/pong.man b/hacks/pong.man
new file mode 100644
index 0000000..c37364a
--- /dev/null
+++ b/hacks/pong.man
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+pong - Pong Home Video Game Emulator
+.SH SYNOPSIS
+.B pong
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-clock \fIfloat\fP]
+[\-noise]
+[\-fps]
+.SH DESCRIPTION
+The
+.I pong
+program simulates an ancient Pong home video game, as well as various
+artifacts from displaying it on a color TV set.
+.SH OPTIONS
+.I pong
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-clock
+The score of the game will be the current time.
+.TP 8
+.B \-noise \fIfloat\fP
+How noisy the video signal should be (between 0.0 and 4.0 or so).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.TP 8
+.B (\-p1 | \-p2) \fImode\fP
+Set a player to either \fIai\fP, \fImouse\fP, \fItablet\fP, \fIkbleft\fP (for W and S), or
+\fIkbright\fP (or just \fIkb\fP, for arrow keys).
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+Notable X resources supported include the following which correspond
+to standard TV controls:
+.BR analogTVTint ,
+.BR analogTVColor ,
+.BR analogTVBrightness ,
+and
+.BR analogTVContrast .
+They range from 0 to 100, except for tint which is an angle
+between -180 and +180.
+.SH TRADEMARKS
+Pong may be a trademark.
+
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xanalogtv (MANSUFFIX),
+.BR apple2 (MANSUFFIX)
+.SH COPYRIGHT
+2003 by Jeremy English. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Original Pong program by Jeremy English <jenglish@myself.com>. Scoring
+and television emulation by Trevor Blackwell <tlb@tlb.org>.
diff --git a/hacks/popsquares.c b/hacks/popsquares.c
new file mode 100644
index 0000000..3b83fd7
--- /dev/null
+++ b/hacks/popsquares.c
@@ -0,0 +1,306 @@
+/* Copyright (c) 2003 Levi Burton <donburton@sbcglobal.net>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+typedef struct _square {
+ int x, y, w, h;
+ int color;
+} square;
+
+static void
+randomize_square_colors(square *squares, int nsquares, int ncolors)
+{
+ int i;
+ square *s = squares;
+ for (i = 0; i < nsquares; i++)
+ s[i].color = random() % ncolors;
+}
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int delay, subdivisionx, subdivisiony, border, ncolors, twitch, dbuf;
+ XWindowAttributes xgwa;
+ GC gc;
+ XColor *colors;
+ int sw, sh, gw, gh, nsquares;
+ square *squares;
+ Pixmap b, ba, bb;
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+};
+
+static void
+popsquares_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ int s = get_integer_resource(st->dpy, "subdivision", "Integer");
+ int x, y;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ if (st->xgwa.width < 100 || st->xgwa.height < 100) /* tiny window */
+ {
+ int ss = (st->xgwa.width < st->xgwa.height
+ ? st->xgwa.width : st->xgwa.height);
+ s = ss / 15;
+ if (s < 1) s = 1;
+ }
+
+ if (st->xgwa.width > st->xgwa.height * 5 || /* weird aspect ratio */
+ st->xgwa.height > st->xgwa.width * 5)
+ {
+ double r = st->xgwa.width / (double) st->xgwa.height;
+ if (r > 1)
+ {
+ st->subdivisiony = s;
+ st->subdivisionx = s * r;
+ }
+ else
+ {
+ st->subdivisionx = s;
+ st->subdivisiony = s / r;
+ }
+ }
+ else
+ {
+ st->subdivisionx = st->subdivisiony = s;
+ }
+
+ st->sw = st->xgwa.width / st->subdivisionx;
+ st->sh = st->xgwa.height / st->subdivisiony;
+ st->gw = st->sw ? st->xgwa.width / st->sw : 0;
+ st->gh = st->sh ? st->xgwa.height / st->sh : 0;
+ st->nsquares = st->gw * st->gh;
+ free (st->squares);
+ if (st->nsquares < 1) st->nsquares = 1;
+ st->squares = (square *) calloc (st->nsquares, sizeof(square));
+
+ for (y = 0; y < st->gh; y++)
+ for (x = 0; x < st->gw; x++)
+ {
+ square *s = (square *) &st->squares[st->gw * y + x];
+ s->w = st->sw;
+ s->h = st->sh;
+ s->x = x * st->sw;
+ s->y = y * st->sh;
+ }
+
+ randomize_square_colors(st->squares, st->nsquares, st->ncolors);
+
+ if (st->dbuf) {
+ XFreePixmap (dpy, st->ba);
+ XFreePixmap (dpy, st->bb);
+ st->ba = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+ st->b = st->ba;
+ }
+}
+
+static void *
+popsquares_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int x, y;
+ double s1, v1, s2, v2 = 0;
+ int h1, h2 = 0;
+ /* Not sure how to use DBEClear */
+ /* Bool dbeclear_p = get_boolean_resource(dpy, "useDBEClear", "Boolean"); */
+ XColor fg, bg;
+ XGCValues gcv;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->subdivisionx = get_integer_resource(st->dpy, "subdivision", "Integer");
+ st->subdivisiony = st->subdivisionx;
+ st->border = get_integer_resource(st->dpy, "border", "Integer");
+ st->ncolors = get_integer_resource(st->dpy, "ncolors", "Integer");
+ st->twitch = get_boolean_resource(st->dpy, "twitch", "Boolean");
+ st->dbuf = get_boolean_resource(st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ fg.pixel = get_pixel_resource (st->dpy, st->xgwa.colormap, "foreground", "Foreground");
+ bg.pixel = get_pixel_resource (st->dpy, st->xgwa.colormap, "background", "Background");
+
+ XQueryColor (st->dpy, st->xgwa.colormap, &fg);
+ XQueryColor (st->dpy, st->xgwa.colormap, &bg);
+
+ st->sw = st->xgwa.width / st->subdivisionx;
+ st->sh = st->xgwa.height / st->subdivisiony;
+ st->gw = st->sw ? st->xgwa.width / st->sw : 0;
+ st->gh = st->sh ? st->xgwa.height / st->sh : 0;
+ st->nsquares = st->gw * st->gh;
+ if (st->nsquares < 1) st->nsquares = 1;
+ if (st->ncolors < 1) st->ncolors = 1;
+
+ gcv.foreground = fg.pixel;
+ gcv.background = bg.pixel;
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+
+ st->colors = (XColor *) calloc (st->ncolors, sizeof(XColor));
+ st->squares = (square *) calloc (st->nsquares, sizeof(square));
+
+ rgb_to_hsv (fg.red, fg.green, fg.blue, &h1, &s1, &v1);
+ rgb_to_hsv (bg.red, bg.green, bg.blue, &h2, &s2, &v2);
+ make_color_ramp (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ h1, s1, v1,
+ h2, s2, v2,
+ st->colors, &st->ncolors, /* would this be considered a value-result argument? */
+ True, True, False);
+ if (st->ncolors < 2)
+ {
+ fprintf (stderr, "%s: insufficient colors!\n", progname);
+ exit (1);
+ }
+
+ for (y = 0; y < st->gh; y++)
+ for (x = 0; x < st->gw; x++)
+ {
+ square *s = (square *) &st->squares[st->gw * y + x];
+ s->w = st->sw;
+ s->h = st->sh;
+ s->x = x * st->sw;
+ s->y = y * st->sh;
+ }
+
+ randomize_square_colors(st->squares, st->nsquares, st->ncolors);
+
+ if (st->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+ st->backb = st->b;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (!st->b)
+ {
+ st->ba = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = st->window;
+ }
+
+ popsquares_reshape (dpy, window, st, st->xgwa.width, st->xgwa.height);
+
+ return st;
+}
+
+static unsigned long
+popsquares_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int x, y;
+ for (y = 0; y < st->gh; y++)
+ for (x = 0; x < st->gw; x++)
+ {
+ square *s = (square *) &st->squares[st->gw * y + x];
+ XSetForeground (st->dpy, st->gc, st->colors[s->color].pixel);
+ XFillRectangle (st->dpy, st->b, st->gc, s->x, s->y,
+ st->border ? s->w - st->border : s->w,
+ st->border ? s->h - st->border : s->h);
+ s->color++;
+ if (s->color == st->ncolors)
+ {
+ if (st->twitch && ((random() % 4) == 0))
+ randomize_square_colors (st->squares, st->nsquares, st->ncolors);
+ else
+ s->color = random() % st->ncolors;
+ }
+ }
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, st->window, st->gc, 0, 0,
+ st->xgwa.width, st->xgwa.height, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+
+static Bool
+popsquares_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+popsquares_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *popsquares_defaults [] = {
+ ".background: #0000FF",
+ ".foreground: #00008B",
+ "*delay: 25000",
+ "*subdivision: 5",
+ "*border: 1",
+ "*ncolors: 128",
+ "*twitch: False",
+ "*doubleBuffer: False",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+ "*useDBEClear: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec popsquares_options [] = {
+ { "-fg", ".foreground", XrmoptionSepArg, 0},
+ { "-bg", ".background", XrmoptionSepArg, 0},
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-subdivision", ".subdivision", XrmoptionSepArg, 0 },
+ { "-border", ".border", XrmoptionSepArg, 0},
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-twitch", ".twitch", XrmoptionNoArg, "True" },
+ { "-no-twitch", ".twitch", XrmoptionNoArg, "False" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("PopSquares", popsquares)
diff --git a/hacks/pyro.c b/hacks/pyro.c
new file mode 100644
index 0000000..442ea7f
--- /dev/null
+++ b/hacks/pyro.c
@@ -0,0 +1,368 @@
+/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Draw some fireworks. Inspired from TI Explorer Lisp code by
+ John S. Pezaris <pz@hx.lcs.mit.edu>
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+struct projectile {
+ int x, y; /* position */
+ int dx, dy; /* velocity */
+ int decay;
+ int size;
+ int fuse;
+ Bool primary;
+ Bool dead;
+ XColor color;
+ struct projectile *next_free;
+};
+
+#define PI_2000 6284
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ struct projectile *projectiles, *free_projectiles;
+ struct projectile **sorted_projectiles;
+
+ GC draw_gc, erase_gc;
+ unsigned int default_fg_pixel;
+ Colormap cmap;
+
+ int how_many, frequency, scatter, delay;
+
+ int sin_cache[PI_2000];
+ int cos_cache[PI_2000];
+
+ int draw_xlim, draw_ylim, real_draw_xlim, real_draw_ylim;
+
+ unsigned long last_pixel;
+};
+
+
+
+/* Slightly whacked, for better explosions
+ */
+
+static void
+cache(struct state *st)
+{ /*needs to be run once. Could easily be */
+ int i; /*reimplemented to run and cache at compile-time,*/
+ double dA; /*saving on init_pyro time */
+ for (i=0; i<PI_2000; i++)
+ {
+ dA=sin(((double) (random() % (PI_2000/2)))/1000.0);
+ /*Emulation of spherical distribution*/
+ dA+=asin(frand(1.0))/M_PI_2*0.1;
+ /*Approximating the integration of the binominal, for
+ well-distributed randomness*/
+ st->cos_cache[i]=(int) (cos(((double)i)/1000.0)*dA*2500.0);
+ st->sin_cache[i]=(int) (sin(((double)i)/1000.0)*dA*2500.0);
+ }
+}
+
+
+static struct projectile *
+get_projectile (struct state *st)
+{
+ struct projectile *p;
+ if (st->free_projectiles)
+ {
+ p = st->free_projectiles;
+ st->free_projectiles = p->next_free;
+ p->next_free = 0;
+ p->dead = False;
+ return p;
+ }
+ else
+ return 0;
+}
+
+static void
+free_projectile (struct state *st, struct projectile *p)
+{
+ p->next_free = st->free_projectiles;
+ st->free_projectiles = p;
+ p->dead = True;
+}
+
+static void
+launch (struct state *st,
+ int xlim, int ylim, int g)
+{
+ struct projectile *p = get_projectile (st);
+ int x, dx, xxx;
+ if (! p) return;
+
+ do {
+ x = (random () % xlim);
+ dx = 30000 - (random () % 60000);
+ xxx = x + (dx * 200);
+ } while (xxx <= 0 || xxx >= xlim);
+
+ p->x = x;
+ p->y = ylim;
+ p->dx = dx;
+ p->size = 8000;
+ p->decay = 0;
+ p->dy = (random () % 4000) - 13000;
+ p->fuse = ((((random () % 500) + 500) * abs (p->dy / g)) / 1000);
+ p->primary = True;
+
+ /* cope with small windows -- those constants assume big windows. */
+ {
+ int dd = 1000000 / ylim;
+ if (dd > 1)
+ p->fuse /= dd;
+ }
+
+ if (! mono_p)
+ {
+ hsv_to_rgb (random () % 360, 1.0, 1.0,
+ &p->color.red, &p->color.green, &p->color.blue);
+ p->color.flags = DoRed | DoGreen | DoBlue;
+ if (!XAllocColor (st->dpy, st->cmap, &p->color))
+ {
+ p->color.pixel = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ p->color.red = p->color.green = p->color.blue = 0xFFFF;
+ }
+ }
+}
+
+static struct projectile *
+shrapnel (struct state *st, struct projectile *parent)
+{
+ struct projectile *p = get_projectile (st);
+ int v;
+ if (! p) return 0;
+ p->x = parent->x;
+ p->y = parent->y;
+ v=random () % PI_2000;
+ p->dx =(st->sin_cache[v]) + parent->dx;
+ p->dy =(st->cos_cache[v]) + parent->dy;
+ p->decay = (random () % 50) - 60;
+ p->size = (parent->size * 2) / 3;
+ p->fuse = 0;
+ p->primary = False;
+
+ p->color = parent->color;
+ if (! mono_p)
+ XAllocColor (st->dpy, st->cmap, &p->color); /* dup the lock */
+
+ return p;
+}
+
+static void *
+pyro_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->last_pixel = ~0;
+ st->cmap = xgwa.colormap;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->how_many = get_integer_resource (st->dpy, "count", "Integer");
+ st->frequency = get_integer_resource (st->dpy, "frequency", "Integer");
+ st->scatter = get_integer_resource (st->dpy, "scatter", "Integer");
+ if (st->how_many <= 0) st->how_many = 100;
+ if (st->frequency <= 0) st->frequency = 30;
+ if (st->scatter <= 0) st->scatter = 20;
+ st->projectiles = 0;
+ st->free_projectiles = 0;
+ st->projectiles = (struct projectile *)
+ calloc (st->how_many, sizeof (*st->projectiles));
+ st->sorted_projectiles = (struct projectile **)
+ calloc (st->how_many, sizeof (*st->sorted_projectiles));
+ for (i = 0; i < st->how_many; i++)
+ free_projectile (st, &st->projectiles [i]);
+ for (i = 0; i < st->how_many; i++)
+ st->sorted_projectiles[i] = &st->projectiles[i];
+ gcv.foreground = st->default_fg_pixel =
+ get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ XClearWindow (st->dpy, st->window);
+ cache(st);
+
+ return st;
+}
+
+
+static int
+projectile_pixel_sorter (const void *a, const void *b)
+{
+ struct projectile *pa = *(struct projectile **) a;
+ struct projectile *pb = *(struct projectile **) b;
+ if (pa->color.pixel == pb->color.pixel) return 0;
+ else if (pa->color.pixel < pb->color.pixel) return -1;
+ else return 1;
+}
+
+static void
+sort_by_pixel (struct state *st, int length)
+{
+ qsort ((void *) st->sorted_projectiles,
+ length,
+ sizeof(*st->sorted_projectiles),
+ projectile_pixel_sorter);
+}
+
+
+static unsigned long
+pyro_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes xgwa;
+ int g = 100;
+ int resort = 0;
+ int i;
+
+ for (i = 0; i < st->how_many; i++)
+ {
+ struct projectile *p = st->sorted_projectiles [i];
+ int old_x, old_y, old_size;
+ int size, x, y;
+ if (p->dead) continue;
+ old_x = p->x >> 10;
+ old_y = p->y >> 10;
+ old_size = p->size >> 10;
+ size = (p->size += p->decay) >> 10;
+ x = (p->x += p->dx) >> 10;
+ y = (p->y += p->dy) >> 10;
+ p->dy += (p->size >> 6);
+ if (p->primary) p->fuse--;
+
+ /* erase old one */
+ if (old_size > 0)
+ {
+ if (old_size == 1)
+ XDrawPoint (st->dpy, st->window, st->erase_gc, old_x, old_y);
+ else
+ XFillRectangle (st->dpy, st->window, st->erase_gc, old_x, old_y,
+ old_size, old_size);
+ }
+
+ if ((p->primary ? (p->fuse > 0) : (p->size > 0)) &&
+ x < st->real_draw_xlim &&
+ y < st->real_draw_ylim &&
+ x > 0 &&
+ y > 0)
+ {
+ if (size > 0)
+ {
+ unsigned long pixel;
+
+ if (mono_p || p->primary)
+ pixel = st->default_fg_pixel;
+ else
+ pixel = p->color.pixel;
+
+ if (pixel != st->last_pixel)
+ {
+ st->last_pixel = pixel;
+ XSetForeground (st->dpy, st->draw_gc, pixel);
+ }
+
+ if (size == 1)
+ XDrawPoint (st->dpy, st->window, st->draw_gc, x, y);
+ else if (size < 4)
+ XFillRectangle (st->dpy, st->window, st->draw_gc, x, y, size, size);
+ else
+ XFillArc (st->dpy, st->window, st->draw_gc, x, y, size, size, 0, 360*64);
+ }
+ }
+ else
+ {
+ free_projectile (st, p);
+ if (! mono_p)
+ if (p->color.pixel != WhitePixel (st->dpy, DefaultScreen (st->dpy)))
+ XFreeColors (st->dpy, st->cmap, &p->color.pixel, 1, 0);
+ }
+
+ if (p->primary && p->fuse <= 0)
+ {
+ int j = (random () % st->scatter) + (st->scatter/2);
+ while (j--)
+ shrapnel (st, p);
+ resort = 1;
+ }
+ }
+
+ if ((random () % st->frequency) == 0)
+ {
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->real_draw_xlim = xgwa.width;
+ st->real_draw_ylim = xgwa.height;
+ st->draw_xlim = st->real_draw_xlim * 1000;
+ st->draw_ylim = st->real_draw_ylim * 1000;
+ launch (st, st->draw_xlim, st->draw_ylim, g);
+ resort = 1;
+ }
+
+ /* being sorted lets us avoid changing the GC's foreground color as often. */
+ if (resort)
+ sort_by_pixel (st, st->how_many);
+
+ return st->delay;
+}
+
+static void
+pyro_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+pyro_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+pyro_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+static const char *pyro_defaults [] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*count: 600",
+ "*delay: 10000",
+ "*frequency: 30",
+ "*scatter: 100",
+ 0
+};
+
+static XrmOptionDescRec pyro_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-frequency", ".frequency", XrmoptionSepArg, 0 },
+ { "-scatter", ".scatter", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Pyro", pyro)
diff --git a/hacks/pyro.man b/hacks/pyro.man
new file mode 100644
index 0000000..914fad7
--- /dev/null
+++ b/hacks/pyro.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+pyro - simulate fireworks
+.SH SYNOPSIS
+.B pyro
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-frequency \fIinteger\fP] [\-scatter \fIinteger\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIpyro\fP program simulates fireworks, in a way similar to a Macintosh
+program of the same name.
+.SH OPTIONS
+.I pyro
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+How many particles should be allowed on the screen at once. Default 600.
+.TP 8
+.B \-frequency \fIinteger\fP
+How often new missiles should launch. Default 30.
+.TP 8
+.B \-scatter \fIinteger\fP
+How many particles should appear when a missile explodes. Default 100.
+The actual number used is between \fIN\fP and \fIN+(N/2)\fP.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/qix.c b/hacks/qix.c
new file mode 100644
index 0000000..1498af7
--- /dev/null
+++ b/hacks/qix.c
@@ -0,0 +1,624 @@
+/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "alpha.h"
+#include <stdio.h>
+
+#define MAXPOLY 16
+#define SCALE 6
+
+struct qpoint {
+ int x, y;
+ int dx, dy;
+};
+
+struct qline {
+ struct qpoint *p;
+ XColor color;
+ Bool dead;
+};
+
+struct qix {
+ int id;
+ int fp;
+ int nlines;
+ int npoly;
+ struct qline *lines;
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC draw_gc, erase_gc;
+ unsigned int default_fg_pixel;
+ long maxx, maxy, max_spread, max_size;
+ int color_shift;
+ Bool random_p, solid_p, xor_p, transparent_p, gravity_p;
+ int delay;
+ int count;
+ Colormap cmap;
+ int npoly;
+ Bool additive_p;
+ Bool cmap_p;
+
+ GC *gcs[2];
+
+ int gtick;
+
+ struct qix **qixes;
+};
+
+
+static void
+get_geom (struct state *st)
+{
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->maxx = ((long)(xgwa.width+1)<<SCALE) - 1;
+ st->maxy = ((long)(xgwa.height+1)<<SCALE) - 1;
+}
+
+static struct qix *
+init_one_qix (struct state *st, int nlines)
+{
+ int i, j;
+ struct qix *qix = (struct qix *) calloc (1, sizeof (struct qix));
+ qix->nlines = nlines;
+ qix->lines = (struct qline *) calloc (qix->nlines, sizeof (struct qline));
+ qix->npoly = st->npoly;
+ for (i = 0; i < qix->nlines; i++)
+ qix->lines[i].p = (struct qpoint *)
+ calloc(qix->npoly, sizeof(struct qpoint));
+
+# ifndef HAVE_JWXYZ
+ if (!mono_p && !st->transparent_p)
+# endif
+ {
+ hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5,
+ &qix->lines[0].color.red, &qix->lines[0].color.green,
+ &qix->lines[0].color.blue);
+ if (!XAllocColor (st->dpy, st->cmap, &qix->lines[0].color))
+ {
+ qix->lines[0].color.pixel = st->default_fg_pixel;
+ XQueryColor (st->dpy, st->cmap, &qix->lines[0].color);
+ if (!XAllocColor (st->dpy, st->cmap, &qix->lines[0].color))
+ abort ();
+ }
+ }
+
+ if (st->max_size == 0)
+ {
+ for (i = 0; i < qix->npoly; i++)
+ {
+ qix->lines[0].p[i].x = random () % st->maxx;
+ qix->lines[0].p[i].y = random () % st->maxy;
+ }
+ }
+ else
+ {
+ /*assert(qix->npoly == 2);*/
+ qix->lines[0].p[0].x = random () % st->maxx;
+ qix->lines[0].p[0].y = random () % st->maxy;
+ qix->lines[0].p[1].x = qix->lines[0].p[0].x + (random () % (st->max_size/2));
+ qix->lines[0].p[1].y = qix->lines[0].p[0].y + (random () % (st->max_size/2));
+ if (qix->lines[0].p[1].x > st->maxx) qix->lines[0].p[1].x = st->maxx;
+ if (qix->lines[0].p[1].y > st->maxy) qix->lines[0].p[1].y = st->maxy;
+ }
+
+ for (i = 0; i < qix->npoly; i++)
+ {
+ qix->lines[0].p[i].dx = (random () % (st->max_spread + 1)) - (st->max_spread /2);
+ qix->lines[0].p[i].dy = (random () % (st->max_spread + 1)) - (st->max_spread /2);
+ }
+ qix->lines[0].dead = True;
+
+ for (i = 1; i < qix->nlines; i++)
+ {
+ for(j=0; j<qix->npoly; j++)
+ qix->lines[i].p[j] = qix->lines[0].p[j];
+ qix->lines[i].color = qix->lines[0].color;
+ qix->lines[i].dead = qix->lines[0].dead;
+
+# ifndef HAVE_JWXYZ
+ if (!mono_p && !st->transparent_p)
+# endif
+ if (!XAllocColor (st->dpy, st->cmap, &qix->lines[i].color))
+ abort ();
+ }
+ return qix;
+}
+
+
+
+
+static void *
+qix_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int nlines;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->cmap = xgwa.colormap;
+ st->count = get_integer_resource (st->dpy, "count", "Integer");
+ if (st->count <= 0) st->count = 1;
+ nlines = get_integer_resource (st->dpy, "segments", "Integer");
+ if (nlines <= 0) nlines = 20;
+ st->npoly = get_integer_resource(st->dpy, "poly", "Integer");
+ if (st->npoly <= 2) st->npoly = 2;
+ if (st->npoly > MAXPOLY) st->npoly = MAXPOLY;
+ get_geom (st);
+ st->max_spread = get_integer_resource (st->dpy, "spread", "Integer");
+ if (st->max_spread <= 0) st->max_spread = 10;
+ st->max_spread <<= SCALE;
+ st->max_size = get_integer_resource (st->dpy, "size", "Integer");
+ if (st->max_size < 0) st->max_size = 0;
+ st->max_size <<= SCALE;
+ st->random_p = get_boolean_resource (st->dpy, "random", "Boolean");
+ st->solid_p = get_boolean_resource (st->dpy, "solid", "Boolean");
+ st->xor_p = get_boolean_resource (st->dpy, "xor", "Boolean");
+ st->transparent_p = get_boolean_resource (st->dpy, "transparent", "Boolean");
+ st->gravity_p = get_boolean_resource(st->dpy, "gravity", "Boolean");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->color_shift = get_integer_resource (st->dpy, "colorShift", "Integer");
+ if (st->color_shift < 0 || st->color_shift >= 360) st->color_shift = 5;
+ if (st->delay < 0) st->delay = 0;
+
+ /* Clear up ambiguities regarding npoly */
+ if (st->solid_p)
+ {
+ if (st->npoly != 2)
+ fprintf(stderr, "%s: Can't have -solid and -poly; using -poly 2\n",
+ progname);
+ st->npoly = 2;
+ }
+ if (st->npoly > 2)
+ {
+ if (st->max_size)
+ fprintf(stderr, "%s: Can't have -poly and -size; using -size 0\n",
+ progname);
+ st->max_size = 0;
+ }
+
+ if (st->count == 1 && st->transparent_p)
+ st->transparent_p = False; /* it's a no-op */
+
+ if (st->transparent_p && CellsOfScreen (DefaultScreenOfDisplay (st->dpy)) <= 2)
+ {
+ fprintf (stderr, "%s: -transparent only works on color displays.\n",
+ progname);
+ st->transparent_p = False;
+ }
+
+ if (st->xor_p && !st->transparent_p)
+ mono_p = True;
+
+ st->gcs[0] = st->gcs[1] = 0;
+ gcv.foreground = st->default_fg_pixel =
+ get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+
+ st->additive_p = get_boolean_resource (st->dpy, "additive", "Boolean");
+ st->cmap_p = has_writable_cells (xgwa.screen, xgwa.visual);
+
+# ifndef HAVE_JWXYZ
+ if (st->transparent_p)
+ {
+ unsigned long *plane_masks = 0;
+ unsigned long base_pixel;
+ int nplanes = st->count;
+ int i;
+
+ allocate_alpha_colors (xgwa.screen, xgwa.visual, st->cmap,
+ &nplanes, st->additive_p, &plane_masks,
+ &base_pixel);
+
+ if (nplanes <= 1)
+ {
+ fprintf (stderr,
+ "%s: couldn't allocate any color planes; turning -transparent off.\n",
+ progname);
+ st->transparent_p = False;
+ if (st->xor_p)
+ goto NON_TRANSPARENT_XOR;
+ else
+ goto NON_TRANSPARENT;
+ }
+ else if (nplanes != st->count)
+ {
+ fprintf (stderr,
+ "%s: only allocated %d color planes (instead of %d).\n",
+ progname, nplanes, st->count);
+ st->count = nplanes;
+ }
+
+ st->gcs[0] = (GC *) malloc (st->count * sizeof (GC));
+ st->gcs[1] = (st->xor_p
+ ? st->gcs[0]
+ : (GC *) malloc (st->count * sizeof (GC)));
+
+ for (i = 0; i < st->count; i++)
+ {
+ gcv.plane_mask = plane_masks [i];
+ gcv.foreground = ~0;
+
+/* argh, I'm not sure how to make "-subtractive" work in truecolor...
+ if (!cmap_p && !additive_p)
+ gcv.function = GXclear;
+ */
+
+ if (st->xor_p)
+ {
+ gcv.function = GXxor;
+ st->gcs [0][i] = XCreateGC (st->dpy, st->window,
+ GCForeground|GCFunction|GCPlaneMask,
+ &gcv);
+ }
+ else
+ {
+ st->gcs [0][i] = XCreateGC (st->dpy, st->window,
+ GCForeground|GCPlaneMask,
+ &gcv);
+ gcv.foreground = 0;
+ st->gcs [1][i] = XCreateGC (st->dpy, st->window,
+ GCForeground|GCPlaneMask,
+ &gcv);
+# ifdef HAVE_JWXYZ
+ /* jwxyz_XSetAntiAliasing (st->dpy, st->gcs [0][i], False);
+ jwxyz_XSetAntiAliasing (st->dpy, st->gcs [1][i], False); */
+ if (st->transparent_p)
+ {
+ jwxyz_XSetAlphaAllowed (dpy, st->gcs [0][i], True);
+ jwxyz_XSetAlphaAllowed (dpy, st->gcs [1][i], True);
+ }
+# endif /* HAVE_JWXYZ */
+ }
+ }
+
+ if (plane_masks)
+ free (plane_masks);
+
+ XSetWindowBackground (st->dpy, st->window, base_pixel);
+ XClearWindow (st->dpy, st->window);
+ }
+ else
+#endif /* !HAVE_JWXYZ */
+ if (st->xor_p)
+ {
+#ifndef HAVE_JWXYZ
+ NON_TRANSPARENT_XOR:
+#endif
+ gcv.function = GXxor;
+ gcv.foreground =
+ (st->default_fg_pixel /* ^ get_pixel_resource (st->dpy, st->cmap,
+ "background", "Background")*/);
+ st->draw_gc = st->erase_gc = XCreateGC(st->dpy,st->window,GCForeground|GCFunction,&gcv);
+ }
+ else
+ {
+#ifndef HAVE_JWXYZ
+ NON_TRANSPARENT:
+#endif
+ st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, st->cmap,
+ "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ }
+
+#ifdef HAVE_JWXYZ
+ if (st->transparent_p)
+ jwxyz_XSetAlphaAllowed (dpy, st->draw_gc, True);
+#endif
+
+ st->qixes = (struct qix **) malloc ((st->count + 1) * sizeof (struct qix *));
+ st->qixes [st->count] = 0;
+ while (st->count--)
+ {
+ st->qixes [st->count] = init_one_qix (st, nlines);
+ st->qixes [st->count]->id = st->count;
+ }
+
+# ifdef HAVE_JWXYZ
+ /* line-mode leaves turds without this. */
+ jwxyz_XSetAntiAliasing (st->dpy, st->erase_gc, False);
+ jwxyz_XSetAntiAliasing (st->dpy, st->draw_gc, False);
+# endif
+
+ return st;
+}
+
+static void
+free_qline (struct state *st,
+ struct qline *qline,
+ struct qline *prev,
+ struct qix *qix)
+{
+ int i;
+ if (qline->dead || !prev)
+ ;
+ else if (st->solid_p)
+ {
+ XPoint points [4];
+ /*assert(qix->npoly == 2);*/
+ points [0].x = qline->p[0].x >> SCALE;
+ points [0].y = qline->p[0].y >> SCALE;
+ points [1].x = qline->p[1].x >> SCALE;
+ points [1].y = qline->p[1].y >> SCALE;
+ points [2].x = prev->p[1].x >> SCALE;
+ points [2].y = prev->p[1].y >> SCALE;
+ points [3].x = prev->p[0].x >> SCALE;
+ points [3].y = prev->p[0].y >> SCALE;
+ XFillPolygon (st->dpy, st->window,
+ (st->transparent_p && st->gcs[1]
+ ? st->gcs[1][qix->id]
+ : st->erase_gc),
+ points, 4, Complex, CoordModeOrigin);
+ }
+ else
+ {
+ /* XDrawLine (dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc),
+ qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y);*/
+ XPoint points[MAXPOLY+1];
+ for(i = 0; i < qix->npoly; i++)
+ {
+ points[i].x = qline->p[i].x >> SCALE;
+ points[i].y = qline->p[i].y >> SCALE;
+ }
+ points[qix->npoly] = points[0];
+ XDrawLines(st->dpy, st->window,
+ (st->transparent_p && st->gcs[1]
+ ? st->gcs[1][qix->id]
+ : st->erase_gc),
+ points, qix->npoly+1, CoordModeOrigin);
+ }
+
+ if (!mono_p && !st->transparent_p)
+ XFreeColors (st->dpy, st->cmap, &qline->color.pixel, 1, 0);
+
+ qline->dead = True;
+}
+
+static void
+add_qline (struct state *st,
+ struct qline *qline,
+ struct qline *prev_qline,
+ struct qix *qix)
+{
+ int i;
+
+ for(i=0; i<qix->npoly; i++)
+ qline->p[i] = prev_qline->p[i];
+ qline->color = prev_qline->color;
+ qline->dead = prev_qline->dead;
+
+#define wiggle(point,delta,max) \
+ if (st->random_p) delta += (random () % (1 << (SCALE+1))) - (1 << SCALE); \
+ if (delta > st->max_spread) delta = st->max_spread; \
+ else if (delta < -st->max_spread) delta = -st->max_spread; \
+ point += delta; \
+ if (point < 0) point = 0, delta = -delta, point += delta<<1; \
+ else if (point > max) point = max, delta = -delta, point += delta<<1;
+
+ if (st->gravity_p)
+ for(i=0; i<qix->npoly; i++)
+ qline->p[i].dy += 3;
+
+ for (i = 0; i < qix->npoly; i++)
+ {
+ wiggle (qline->p[i].x, qline->p[i].dx, st->maxx);
+ wiggle (qline->p[i].y, qline->p[i].dy, st->maxy);
+ }
+
+ if (st->max_size)
+ {
+ /*assert(qix->npoly == 2);*/
+ if (qline->p[0].x - qline->p[1].x > st->max_size)
+ qline->p[0].x = qline->p[1].x + st->max_size
+ - (st->random_p ? random() % st->max_spread : 0);
+ else if (qline->p[1].x - qline->p[0].x > st->max_size)
+ qline->p[1].x = qline->p[0].x + st->max_size
+ - (st->random_p ? random() % st->max_spread : 0);
+ if (qline->p[0].y - qline->p[1].y > st->max_size)
+ qline->p[0].y = qline->p[1].y + st->max_size
+ - (st->random_p ? random() % st->max_spread : 0);
+ else if (qline->p[1].y - qline->p[0].y > st->max_size)
+ qline->p[1].y = qline->p[0].y + st->max_size
+ - (st->random_p ? random() % st->max_spread : 0);
+ }
+
+#ifndef HAVE_JWXYZ
+ if (!mono_p && !st->transparent_p)
+#endif
+ {
+ XColor desired;
+
+ int h;
+ double s, v;
+ rgb_to_hsv (qline->color.red, qline->color.green, qline->color.blue,
+ &h, &s, &v);
+ h = (h + st->color_shift) % 360;
+ hsv_to_rgb (h, s, v,
+ &qline->color.red, &qline->color.green, &qline->color.blue);
+
+ qline->color.flags = DoRed | DoGreen | DoBlue;
+ desired = qline->color;
+ if (XAllocColor (st->dpy, st->cmap, &qline->color))
+ {
+ /* XAllocColor returns the actual RGB that the hardware let us
+ allocate. Restore the requested values into the XColor struct
+ so that limited-resolution hardware doesn't cause the cycle to
+ get "stuck". */
+ qline->color.red = desired.red;
+ qline->color.green = desired.green;
+ qline->color.blue = desired.blue;
+ }
+ else
+ {
+ qline->color = prev_qline->color;
+ if (!XAllocColor (st->dpy, st->cmap, &qline->color))
+ abort (); /* same color should work */
+ }
+
+# ifdef HAVE_JWXYZ
+ if (st->transparent_p)
+ {
+ /* give a non-opaque alpha to the color */
+ unsigned long pixel = qline->color.pixel;
+ unsigned long amask = BlackPixel (st->dpy, 0);
+ unsigned long a = (0xBBBBBBBB & amask);
+ pixel = (pixel & (~amask)) | a;
+ qline->color.pixel = pixel;
+ }
+# endif /* HAVE_JWXYZ */
+
+ XSetForeground (st->dpy, st->draw_gc, qline->color.pixel);
+ }
+ if (! st->solid_p)
+ {
+ /* XDrawLine (dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc),
+ qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y);*/
+ XPoint points[MAXPOLY+1];
+ for (i = 0; i < qix->npoly; i++)
+ {
+ points[i].x = qline->p[i].x >> SCALE;
+ points[i].y = qline->p[i].y >> SCALE;
+ }
+ points[qix->npoly] = points[0];
+ XDrawLines(st->dpy, st->window,
+ (st->transparent_p && st->gcs[0]
+ ? st->gcs[0][qix->id]
+ : st->draw_gc),
+ points, qix->npoly+1, CoordModeOrigin);
+ }
+ else if (!prev_qline->dead)
+ {
+ XPoint points [4];
+ points [0].x = qline->p[0].x >> SCALE;
+ points [0].y = qline->p[0].y >> SCALE;
+ points [1].x = qline->p[1].x >> SCALE;
+ points [1].y = qline->p[1].y >> SCALE;
+ points [2].x = prev_qline->p[1].x >> SCALE;
+ points [2].y = prev_qline->p[1].y >> SCALE;
+ points [3].x = prev_qline->p[0].x >> SCALE;
+ points [3].y = prev_qline->p[0].y >> SCALE;
+ XFillPolygon (st->dpy, st->window,
+ (st->transparent_p && st->gcs[0]
+ ? st->gcs[0][qix->id]
+ : st->draw_gc),
+ points, 4, Complex, CoordModeOrigin);
+ }
+
+ qline->dead = False;
+}
+
+static void
+qix1 (struct state *st, struct qix *qix)
+{
+ int ofp = qix->fp - 1;
+ if (ofp < 0) ofp = qix->nlines - 1;
+ if (st->gtick++ == 500)
+ get_geom (st), st->gtick = 0;
+ free_qline (st, &qix->lines [qix->fp],
+ &qix->lines[(qix->fp + 1) % qix->nlines], qix);
+ add_qline (st, &qix->lines[qix->fp], &qix->lines[ofp], qix);
+ if ((++qix->fp) >= qix->nlines)
+ qix->fp = 0;
+}
+
+
+static unsigned long
+qix_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ struct qix **q1 = st->qixes;
+ struct qix **qn;
+ for (qn = q1; *qn; qn++)
+ qix1 (st, *qn);
+ return st->delay;
+}
+
+static void
+qix_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ get_geom (st);
+}
+
+static Bool
+qix_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+qix_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->gcs[0])
+ free (st->gcs[0]);
+ if (st->gcs[1] && st->gcs[0] != st->gcs[1])
+ free (st->gcs[1]);
+ free (st->qixes);
+ free (st);
+}
+
+
+static const char *qix_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*count: 4",
+ "*segments: 250",
+ "*poly: 2",
+ "*spread: 8",
+ "*size: 200",
+ "*colorShift: 3",
+ "*solid: true",
+ "*delay: 10000",
+ "*random: false",
+ "*xor: false",
+ "*transparent:true",
+ "*gravity: false",
+ "*additive: true",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec qix_options [] = {
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-segments", ".segments", XrmoptionSepArg, 0 },
+ { "-poly", ".poly", XrmoptionSepArg, 0 },
+ { "-spread", ".spread", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-color-shift", ".colorShift", XrmoptionSepArg, 0 },
+ { "-random", ".random", XrmoptionNoArg, "true" },
+ { "-linear", ".random", XrmoptionNoArg, "false" },
+ { "-solid", ".solid", XrmoptionNoArg, "true" },
+ { "-hollow", ".solid", XrmoptionNoArg, "false" },
+ { "-xor", ".xor", XrmoptionNoArg, "true" },
+ { "-no-xor", ".xor", XrmoptionNoArg, "false" },
+ { "-transparent", ".transparent", XrmoptionNoArg, "true" },
+ { "-non-transparent", ".transparent", XrmoptionNoArg, "false" },
+ { "-gravity", ".gravity", XrmoptionNoArg, "true" },
+ { "-no-gravity", ".gravity", XrmoptionNoArg, "false" },
+ { "-additive", ".additive", XrmoptionNoArg, "true" },
+ { "-subtractive", ".additive", XrmoptionNoArg, "false" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Qix", qix)
diff --git a/hacks/qix.man b/hacks/qix.man
new file mode 100644
index 0000000..f5a0930
--- /dev/null
+++ b/hacks/qix.man
@@ -0,0 +1,132 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+qix - bounce colored lines around a window
+.SH SYNOPSIS
+.B qix
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-segments \fIint\fP] [\-spread \fIpixels\fP] [\-size \fIpixels\fP] [\-count \fIint\fP] [\-color-shift \fIdegrees\fP] [\-delay \fIusecs\fP] [\-random] [\-linear] [\-solid] [\-hollow] [\-xor] [\-no\-xor] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-poly \fIint\fP] [\-gravity] [\-no\-gravity]
+[\-fps]
+.SH DESCRIPTION
+The \fIqix\fP program bounces a series of line segments around its window.
+This is truly the swiss army chainsaw of qix programs. If you know of one
+with more display modes, I want to know about it.
+.SH OPTIONS
+.I qix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-segments \fIinteger\fP
+How many line segments should be drawn. Default 50.
+.TP 8
+.B \-spread \fIinteger\fP
+How far apart the endpoints of one segment should be from the next.
+Default 8.
+.TP 8
+.B \-size \fIinteger\fP
+The maximum distance one endpoint of a segment is allowed to be from
+the opposite end of that segment. Default 0, meaning unlimited.
+.TP 8
+.B \-count \fIinteger\fP
+How many qixes to draw. Default 1.
+.TP 8
+.B \-color\-shift \fIdegrees\fP
+If on a color display, the color of the line segments will cycle through
+the spectrum. This specifies how far the hue of each segment should be
+from the next, in degrees on the HSV wheel. Default 3.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 10000, or about 0.01 seconds.
+.TP 8
+.B \-random
+The \fIqix\fP will wander around the screen semi-randomly. This is the
+default.
+.TP 8
+.B \-linear
+The opposite of \fI\-random\fP: the \fIqix\fP will travel in straight lines
+until it reaches a wall, and then it will bounce.
+.TP 8
+.B \-solid
+If this is specified, then the area between the line segments will be filled
+in with the appropriate color, instead of the \fIqix\fP simply being composed
+of one-pixel-wide line segments. This option looks really good in color.
+.TP 8
+.B \-hollow
+The opposite of \fI\-solid\fP; this is the default.
+.TP 8
+.B \-xor
+If this is specified, then qix segments will be drawn and erased with xor,
+instead of being drawn in some color and erased in the background color.
+This implies \fI\-mono\fP, in that only two colors can be used.
+.TP 8
+.B \-transparent
+If this is specified, and \fI\-count\fP is greater than 1, then each qix
+will be drawn in one color, and when they overlap, the colors will be mixed.
+This looks best in conjunction with \fI\-solid\fP.
+.TP 8
+.B \-non\-transparent
+Turns off \fI\-transparent\fP.
+.TP 8
+.B \-additive
+If \fI\-transparent\fP is specified, then this option means that the colors
+will be mixed using an additive color model, as if the qixes were projected
+light. This is the default.
+.TP 8
+.B \-subtractive
+If \fI\-transparent\fP is specified, then this option means that the
+colors will be mixed using a subtractive color model, as if the qixes were
+translucent filters.
+.TP 8
+.B \-poly \fIint\fP
+How many vertices each qix-line should have: the default is 2, meaning the
+traditional qix line shape. Three will yield triangles, and so on.
+.TP 8
+.B \-gravity
+.TP 8
+.B \-no\-gravity
+Whether there should be downward attraction. For example, the
+options
+.B \-gravity \-linear
+will make everything move in nice smooth parabolas.
+Gravity is off by default.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Thanks to Ariel Scolnicov for the \-poly and \-gravity options.
diff --git a/hacks/rd-bomb.c b/hacks/rd-bomb.c
new file mode 100644
index 0000000..33cb602
--- /dev/null
+++ b/hacks/rd-bomb.c
@@ -0,0 +1,549 @@
+/* xscreensaver, Copyright (c) 1992-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * reaction/diffusion textures
+ * Copyright (c) 1997 Scott Draves spot@transmeta.com
+ * this code is derived from Bomb
+ * see http://www.cs.cmu.edu/~spot/bomb.html
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * And remember: X Windows is to graphics hacking as roman numerals are to
+ * the square root of pi.
+ */
+
+#include <math.h>
+
+#include "screenhack.h"
+#include "xshm.h"
+
+/* costs ~6% speed */
+#define dither_when_mapped 1
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int ncolors;
+ XColor *colors;
+ Visual *visual;
+#if dither_when_mapped
+ unsigned char *mc;
+#endif
+ Colormap cmap;
+ int mapped;
+ int pdepth;
+
+ int frame, epoch_time;
+ unsigned short *r1, *r2, *r1b, *r2b;
+ int width, height, npix;
+ int radius;
+ int reaction;
+ int diffusion;
+
+ char *pd;
+ int array_width, array_height;
+
+ XShmSegmentInfo shm_info;
+
+ GC gc;
+ XImage *image;
+ double array_x, array_y;
+ double array_dx, array_dy;
+ XWindowAttributes xgwa;
+ int delay;
+};
+
+static void random_colors(struct state *st);
+
+/* -----------------------------------------------------------
+ pixel hack, 8-bit pixel grid, first/next frame interface
+
+ pixack_init(int *size_h, int *size_v)
+ pixack_frame(char *pix_buf)
+ */
+
+
+#define bps 16
+#define mx ((1<<16)-1)
+
+/* you can replace integer mults wish shift/adds with these,
+ but it doesn't help on my 586 */
+#define x5(n) ((n<<2)+n)
+#define x7(n) ((n<<3)-n)
+
+/* why strip bit? */
+#define R (random()&((1<<30)-1))
+#define BELLRAND(x) (((random()%(x)) + (random()%(x)) + (random()%(x)))/3)
+
+/* returns number of pixels that the pixack produces. called once. */
+static void
+pixack_init(struct state *st, int *size_h, int *size_v)
+{
+ st->width = get_integer_resource (st->dpy, "width", "Integer");
+ st->height = get_integer_resource (st->dpy, "height", "Integer");
+
+ if (st->width <= 0 && st->height <= 0 && (R & 1))
+ st->width = st->height = 64 + BELLRAND(512);
+
+ if (st->width <= 0) st->width = 64 + BELLRAND(512);
+ if (st->height <= 0) st->height = 64 + BELLRAND(512);
+
+ if (st->width > st->xgwa.width) st->width = st->xgwa.width;
+ if (st->height > st->xgwa.height) st->height = st->xgwa.height;
+
+ /* jwz: when (and only when) XSHM is in use on an SGI 8-bit visual,
+ we get shear unless st->width is a multiple of 4. I don't understand
+ why. This is undoubtedly the wrong fix... */
+ if (visual_depth (st->xgwa.screen, st->xgwa.visual) == 8)
+ st->width &= ~0x7;
+
+ /* don't go there */
+ if (st->width < 10) st->width = 10;
+ if (st->height < 10) st->height = 10;
+ st->epoch_time = get_integer_resource (st->dpy, "epoch", "Integer");
+ st->npix = (st->width + 2) * (st->height + 2);
+ st->r1 = (unsigned short *) malloc(sizeof(unsigned short) * st->npix);
+ st->r2 = (unsigned short *) malloc(sizeof(unsigned short) * st->npix);
+ st->r1b = (unsigned short *) malloc(sizeof(unsigned short) * st->npix);
+ st->r2b = (unsigned short *) malloc(sizeof(unsigned short) * st->npix);
+
+ if (!st->r1 || !st->r2 || !st->r1b || !st->r2b) {
+ fprintf(stderr, "not enough memory for %d pixels.\n", st->npix);
+ exit(1);
+ }
+
+ *size_h = st->width;
+ *size_v = st->height;
+}
+
+#define test_pattern_hyper 0
+
+
+/* returns the pixels. called many times. */
+static void
+pixack_frame(struct state *st, char *pix_buf)
+{
+ int i, j;
+ int w2 = st->width + 2;
+ unsigned short *t;
+#if test_pattern_hyper
+ if (st->frame&0x100)
+ sleep(1);
+#endif
+
+ if (!(st->frame%st->epoch_time)) {
+ int s;
+
+ for (i = 0; i < st->npix; i++) {
+ /* equilibrium */
+ st->r1[i] = 65500;
+ st->r2[i] = 11;
+ }
+
+ random_colors(st);
+
+ XSetWindowBackground(st->dpy, st->window, st->colors[255 % st->ncolors].pixel);
+ XClearWindow(st->dpy, st->window);
+
+ s = w2 * (st->height/2) + st->width/2;
+ st->radius = get_integer_resource (st->dpy, "radius", "Integer");
+ {
+ int maxr = st->width/2-2;
+ int maxr2 = st->height/2-2;
+ if (maxr2 < maxr) maxr = maxr2;
+
+ if (st->radius < 0)
+ st->radius = 1 + ((R%10) ? (R%5) : (R % maxr));
+ if (st->radius > maxr) st->radius = maxr;
+ }
+ for (i = -st->radius; i < (st->radius+1); i++)
+ for (j = -st->radius; j < (st->radius+1); j++)
+ st->r2[s + i + j*w2] = mx - (R&63);
+ st->reaction = get_integer_resource (st->dpy, "reaction", "Integer");
+ if (st->reaction < 0 || st->reaction > 2) st->reaction = R&1;
+ st->diffusion = get_integer_resource (st->dpy, "diffusion", "Integer");
+ if (st->diffusion < 0 || st->diffusion > 2)
+ st->diffusion = (R%5) ? ((R%3)?0:1) : 2;
+ if (2 == st->reaction && 2 == st->diffusion)
+ st->reaction = st->diffusion = 0;
+ }
+ for (i = 0; i <= st->width+1; i++) {
+ st->r1[i] = st->r1[i + w2 * st->height];
+ st->r2[i] = st->r2[i + w2 * st->height];
+ st->r1[i + w2 * (st->height + 1)] = st->r1[i + w2];
+ st->r2[i + w2 * (st->height + 1)] = st->r2[i + w2];
+ }
+ for (i = 0; i <= st->height+1; i++) {
+ st->r1[w2 * i] = st->r1[st->width + w2 * i];
+ st->r2[w2 * i] = st->r2[st->width + w2 * i];
+ st->r1[w2 * i + st->width + 1] = st->r1[w2 * i + 1];
+ st->r2[w2 * i + st->width + 1] = st->r2[w2 * i + 1];
+ }
+ for (i = 0; i < st->height; i++) {
+ int ii = i + 1;
+ char *q = pix_buf + st->width * i;
+ short *qq = ((short *) pix_buf) + st->width * i;
+/* long *qqq = ((long *) pix_buf) + st->width * i; -- crashes on Alpha */
+ int *qqq = ((int *) pix_buf) + st->width * i;
+ unsigned short *i1 = st->r1 + 1 + w2 * ii;
+ unsigned short *i2 = st->r2 + 1 + w2 * ii;
+ unsigned short *o1 = st->r1b + 1 + w2 * ii;
+ unsigned short *o2 = st->r2b + 1 + w2 * ii;
+ for (j = 0; j < st->width; j++) {
+#if test_pattern_hyper
+ int r1 = (i * j + (st->frame&127)*frame)&65535;
+#else
+ int uvv, r1 = 0, r2 = 0;
+ switch (st->diffusion) {
+ case 0:
+ r1 = i1[j] + i1[j+1] + i1[j-1] + i1[j+w2] + i1[j-w2];
+ r1 = r1 / 5;
+ r2 = (i2[j]<<3) + i2[j+1] + i2[j-1] + i2[j+w2] + i2[j-w2];
+ r2 = r2 / 12;
+ break;
+ case 1:
+ r1 = i1[j+1] + i1[j-1] + i1[j+w2] + i1[j-w2];
+ r1 = r1 >> 2;
+ r2 = (i2[j]<<2) + i2[j+1] + i2[j-1] + i2[j+w2] + i2[j-w2];
+ r2 = r2 >> 3;
+ break;
+ case 2:
+ r1 = (i1[j]<<1) + (i1[j+1]<<1) + (i1[j-1]<<1) + i1[j+w2] + i1[j-w2];
+ r1 = r1 >> 3;
+ r2 = (i2[j]<<2) + i2[j+1] + i2[j-1] + i2[j+w2] + i2[j-w2];
+ r2 = r2 >> 3;
+ break;
+ }
+
+ /* John E. Pearson "Complex Patterns in a Simple System"
+ Science, July 1993 */
+
+ /* uvv = (((r1 * r2) >> bps) * r2) >> bps; */
+ /* avoid signed integer overflow */
+ uvv = ((((r1 >> 1)* r2) >> bps) * r2) >> (bps - 1);
+ switch (st->reaction) { /* costs 4% */
+ case 0:
+ r1 += 4 * (((28 * (mx-r1)) >> 10) - uvv);
+ r2 += 4 * (uvv - ((80 * r2) >> 10));
+ break;
+ case 1:
+ r1 += 3 * (((27 * (mx-r1)) >> 10) - uvv);
+ r2 += 3 * (uvv - ((80 * r2) >> 10));
+ break;
+ case 2:
+ r1 += 2 * (((28 * (mx-r1)) >> 10) - uvv);
+ r2 += 3 * (uvv - ((80 * r2) >> 10));
+ break;
+ }
+ if (r1 > mx) r1 = mx;
+ if (r2 > mx) r2 = mx;
+ if (r1 < 0) r1 = 0;
+ if (r2 < 0) r2 = 0;
+ o1[j] = r1;
+ o2[j] = r2;
+#endif
+
+ /* this is terrible. here i want to assume ncolors = 256.
+ should lose double indirection */
+
+ if (st->mapped)
+#if dither_when_mapped
+ q[j] = st->colors[st->mc[r1] % st->ncolors].pixel;
+#else
+ q[j] = st->colors[(r1>>8) % st->ncolors].pixel;
+#endif
+ else if (st->pdepth == 8)
+ q[j] = st->colors[(r1>>8) % st->ncolors].pixel;
+ else if (st->pdepth == 16)
+#if dither_when_mapped
+ qq[j] = st->colors[st->mc[r1] % st->ncolors].pixel;
+#else
+ qq[j] = st->colors[(r1>>8) % st->ncolors].pixel;
+#endif
+ else if (st->pdepth == 32)
+#if dither_when_mapped
+ qqq[j] = st->colors[st->mc[r1] % st->ncolors].pixel;
+#else
+ qqq[j] = st->colors[(r1>>8) % st->ncolors].pixel;
+#endif
+ else
+ abort();
+ }
+ }
+ t = st->r1; st->r1 = st->r1b; st->r1b = t;
+ t = st->r2; st->r2 = st->r2b; st->r2b = t;
+}
+
+
+/* ------------- xscreensaver rendering -------------- */
+
+static const char *rd_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*width: 0", /* tried to use -1 but it complained */
+ "*height: 0",
+ "*epoch: 40000",
+ "*reaction: -1",
+ "*diffusion: -1",
+ "*radius: -1",
+ "*speed: 0.0",
+ "*size: 1.0",
+ "*delay: 30000",
+ "*colors: 255",
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#else
+ "*useSHM: False",
+#endif
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec rd_options [] = {
+ { "-width", ".width", XrmoptionSepArg, 0 },
+ { "-height", ".height", XrmoptionSepArg, 0 },
+ { "-epoch", ".epoch", XrmoptionSepArg, 0 },
+ { "-reaction", ".reaction", XrmoptionSepArg, 0 },
+ { "-diffusion", ".diffusion", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".colors", XrmoptionSepArg, 0 },
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+static void
+random_colors(struct state *st)
+{
+ memset(st->colors, 0, st->ncolors*sizeof(*st->colors));
+ make_smooth_colormap (st->xgwa.screen, st->visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+ if (st->ncolors <= 2) {
+ mono_p = True;
+ st->ncolors = 2;
+ st->colors[0].flags = DoRed|DoGreen|DoBlue;
+ st->colors[0].red = st->colors[0].green = st->colors[0].blue = 0;
+ XAllocColor(st->dpy, st->cmap, &st->colors[0]);
+ st->colors[1].flags = DoRed|DoGreen|DoBlue;
+ st->colors[1].red = st->colors[1].green = st->colors[1].blue = 0xFFFF;
+ XAllocColor(st->dpy, st->cmap, &st->colors[1]);
+ }
+
+ /* Scale it up so that there are exactly 255 colors -- that keeps the
+ animation speed consistent, even when there aren't many allocatable
+ colors, and prevents the -mono mode from looking like static. */
+ if (st->ncolors != 255) {
+ int i, n = 255;
+ double scale = (double) st->ncolors / (double) (n+1);
+ XColor *c2 = (XColor *) malloc(sizeof(*c2) * (n+1));
+ for (i = 0; i < n; i++)
+ c2[i] = st->colors[(int) (i * scale)];
+ free(st->colors);
+ st->colors = c2;
+ st->ncolors = n;
+ }
+
+}
+
+
+/* should factor into RD-specfic and compute-every-pixel general */
+static void *
+rd_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ int vdepth;
+
+ st->dpy = dpy;
+ st->window = win;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Float");
+
+ XGetWindowAttributes (st->dpy, win, &st->xgwa);
+ st->visual = st->xgwa.visual;
+ pixack_init(st, &st->width, &st->height);
+ {
+ double s = get_float_resource (st->dpy, "size", "Float");
+ double p = get_float_resource (st->dpy, "speed", "Float");
+ if (s < 0.0 || s > 1.0)
+ s = 1.0;
+ s = sqrt(s);
+ st->array_width = st->xgwa.width * s;
+ st->array_height = st->xgwa.height * s;
+ if (s < 0.99) {
+ st->array_width = (st->array_width / st->width) * st->width;
+ st->array_height = (st->array_height / st->height) * st->height;
+ }
+ if (st->array_width < st->width) st->array_width = st->width;
+ if (st->array_height < st->height) st->array_height = st->height;
+ st->array_x = (st->xgwa.width - st->array_width)/2;
+ st->array_y = (st->xgwa.height - st->array_height)/2;
+ st->array_dx = p;
+ st->array_dy = .31415926 * p;
+
+ /* start in a random direction */
+ if (random() & 1) st->array_dx = -st->array_dx;
+ if (random() & 1) st->array_dy = -st->array_dy;
+
+ }
+ st->npix = (st->width + 2) * (st->height + 2);
+/* gcv.function = GXcopy;*/
+ st->gc = XCreateGC(st->dpy, win, 0 /*GCFunction*/, &gcv);
+ vdepth = visual_depth(DefaultScreenOfDisplay(st->dpy), st->xgwa.visual);
+
+ /* This code only deals with pixmap depths of 1, 8, 16, and 32.
+ Therefore, we assume that those depths will be supported by the
+ coresponding visual depths (that depth-24 dpys accept depth-32
+ pixmaps, and that depth-12 dpys accept depth-16 pixmaps.) */
+ st->pdepth = (vdepth == 1 ? 1 :
+ vdepth <= 8 ? 8 :
+ vdepth <= 16 ? 16 :
+ 32);
+
+ /* Ok, this like, sucks and stuff. There are some XFree86 systems
+ that have depth-24 visuals, that do not accept depth-32 XImages!
+ Which if you ask me is just absurd, since all it would take is
+ for the server to truncate the bits in that case. So, this crap
+ here detects the specific case of: we have chosen depth 32;
+ and the server does not support depth 32. In that case, we
+ try and use depth 16 instead.
+
+ The real fix would be to rewrite this program to deal with
+ depth 24 directly (or even better, arbitrary depths, but that
+ would mean going through the XImage routines instead of messing
+ with the XImage->data directly.)
+
+ jwz, 18-Mar-99: well, the X servers I have access to these days do
+ support 32-deep images on deep visuals, so I no longer have the
+ ability to test this code -- but it was causing problems on the
+ visuals that I do have, and I think that's because I mistakenly
+ wrote `pfv[i].depth' when I meant to write `pfv[i].bits_per_pixel'.
+ The symptom I was seeing was that the grid was 64x64, but the
+ images were being drawn 32x32 -- so there was a black stripe on
+ every other row. Wow, this code sucks so much.
+ */
+ if (st->pdepth == 32)
+ {
+ int i, pfvc = 0;
+ Bool ok = False;
+ XPixmapFormatValues *pfv = XListPixmapFormats (st->dpy, &pfvc);
+ for (i = 0; i < pfvc; i++)
+ if (pfv[i].bits_per_pixel == st->pdepth)
+ ok = True;
+ if (!ok)
+ st->pdepth = 16;
+ }
+
+ st->cmap = st->xgwa.colormap;
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Integer");
+
+ if (st->ncolors <= 0 || st->ncolors >= 255) {
+ if (vdepth > 8)
+ st->ncolors = 2047;
+ else
+ st->ncolors = 255;
+ }
+
+ if (mono_p || st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+
+ st->mapped = (vdepth <= 8 &&
+ has_writable_cells(st->xgwa.screen, st->xgwa.visual));
+
+ {
+ int i, di;
+ st->mc = (unsigned char *) malloc(1<<16);
+ for (i = 0; i < (1<<16); i++) {
+ di = (i + (random()&255))>>8;
+ if (di > 255) di = 255;
+ st->mc[i] = di;
+ }
+ }
+
+ st->image = create_xshm_image(st->dpy, st->xgwa.visual, vdepth,
+ ZPixmap, &st->shm_info, st->width, st->height);
+ st->pd = st->image->data;
+
+ return st;
+}
+
+static unsigned long
+rd_draw (Display *dpy, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ Bool bump = False;
+
+ int i, j;
+ pixack_frame(st, st->pd);
+ for (i = 0; i < st->array_width; i += st->width)
+ for (j = 0; j < st->array_height; j += st->height)
+ put_xshm_image(st->dpy, st->window, st->gc, st->image, 0, 0, i+st->array_x, j+st->array_y,
+ st->width, st->height, &st->shm_info);
+
+ st->array_x += st->array_dx;
+ st->array_y += st->array_dy;
+ if (st->array_x < 0) {
+ st->array_x = 0;
+ st->array_dx = -st->array_dx;
+ bump = True;
+ } else if (st->array_x > (st->xgwa.width - st->array_width)) {
+ st->array_x = (st->xgwa.width - st->array_width);
+ st->array_dx = -st->array_dx;
+ bump = True;
+ }
+ if (st->array_y < 0) {
+ st->array_y = 0;
+ st->array_dy = -st->array_dy;
+ bump = True;
+ } else if (st->array_y > (st->xgwa.height - st->array_height)) {
+ st->array_y = (st->xgwa.height - st->array_height);
+ st->array_dy = -st->array_dy;
+ bump = True;
+ }
+
+ if (bump) {
+ if (random() & 1) {
+ double swap = st->array_dx;
+ st->array_dx = st->array_dy;
+ st->array_dy = swap;
+ }
+ }
+
+ st->frame++;
+
+ return st->delay;
+}
+
+static void
+rd_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+rd_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+rd_free (Display *dpy, Window window, void *closure)
+{
+}
+
+XSCREENSAVER_MODULE_2 ("RDbomb", rdbomb, rd)
diff --git a/hacks/rd-bomb.man b/hacks/rd-bomb.man
new file mode 100644
index 0000000..4022a43
--- /dev/null
+++ b/hacks/rd-bomb.man
@@ -0,0 +1,100 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+rd-bomb - reaction/diffusion textures
+.SH SYNOPSIS
+.B rd-bomb
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-width \fIn\fP] [\-height \fIn\fP]
+[\-reaction \fIn\fP] [\-diffusion \fIn\fP]
+[\-size \fIf\fP] [\-speed \fIf\fP] [\-delay \fImillisecs\fP]
+[\-fps]
+.SH DESCRIPTION
+
+The \fIrd-bomb\fP program draws reaction/diffusion textures. The code
+is derived from the 'd' mode of the "bomb" visual musical instrument
+(see http://www.cs.cmu.edu/~spot/bomb.html). I got the equations from
+xmorphia (http://www.ccsf.caltech.edu/ismap/image.html), which is
+based on a version of the Gray-Scott model taken from:
+ John E. Pearson "Complex Patterns in a Simple System"
+ Science, 261,189, 9 July 1993.
+
+If the frame-rate is too low, consider decreasing the width and height
+of the tile, or decreasing the size of the active part of the screen.
+
+.SH OPTIONS
+
+If one of the reaction, diffusion, radius, and palette options is set
+to a negative value, then that option will be set to a random
+appropriate value.
+
+Be sure to try "-speed 1 -size 0.1 -epoch 3000".
+
+.I rd-bomb
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-width \fIn\fP
+.TP 8
+.B \-height \fIn\fP
+Specify the size of the tile, in pixels.
+.TP 8
+.B \-reaction \fIn\fP
+.TP 8
+.B \-diffusion \fIn\fP
+These are constants in the equations that effect its visual nature.
+Each may be one of 0, 1, or 2. Default is -1: these constants are
+chosen randomly.
+.TP 8
+.B \-radius \fIn\fP
+Size of the seed.
+.TP 8
+.B \-size \fIf\fP
+What fraction of the window is actively drawn, a floating point number
+between 0 (exclusive) and 1 (inclusive). Default is 1.0.
+.TP 8
+.B \-speed \fIf\fP
+When a fraction of the screen is active, the active area moves at this
+rate (a floating point number). Default is zero. Suggested value: 1.0.
+.TP 8
+.B \-delay \fImillisecs\fP
+How many milliseconds to delay between frames; default 1, or
+about 1/1000th of a second.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Scott Draves.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Scott Draves <spot@cs.cmu.edu>, 9/97
diff --git a/hacks/recanim.c b/hacks/recanim.c
new file mode 100644
index 0000000..9ef0e7a
--- /dev/null
+++ b/hacks/recanim.c
@@ -0,0 +1,413 @@
+/* recanim, Copyright (c) 2014-2018 Jamie Zawinski <jwz@jwz.org>
+ * Record animation frames of the running screenhack.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef USE_GL
+# ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+# else /* !HAVE_JWXYZ -- real Xlib */
+# include <GL/glx.h>
+# include <GL/glu.h>
+# endif /* !HAVE_JWXYZ */
+# ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+# endif /* HAVE_JWZGLES */
+#endif /* USE_GL */
+
+#ifdef HAVE_GDK_PIXBUF
+# ifdef HAVE_GTK2
+# include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else /* !HAVE_GTK2 */
+# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
+#endif /* HAVE_GDK_PIXBUF */
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "screenhackI.h"
+#include "recanim.h"
+
+#undef gettimeofday /* wrapped by recanim.h */
+#undef time
+
+struct record_anim_state {
+ Screen *screen;
+ Window window;
+ int frame_count;
+ int target_frames;
+ XWindowAttributes xgwa;
+ char *title;
+ int pct;
+ int fade_frames;
+# ifdef USE_GL
+ char *data, *data2;
+# else /* !USE_GL */
+ XImage *img;
+ Pixmap p;
+ GC gc;
+# endif /* !USE_GL */
+};
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+/* Some of the hacks set their timing based on the real-world wall clock,
+ so to make the animations record at a sensible speed, we need to slow
+ down that clock by discounting the time taken up by snapshotting and
+ saving the frame.
+ */
+static double recanim_time_warp = 0;
+
+void
+screenhack_record_anim_gettimeofday (struct timeval *tv
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ , struct timezone *tz
+# endif
+ )
+{
+ gettimeofday (tv
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ , tz
+# endif
+ );
+ tv->tv_sec -= (time_t) recanim_time_warp;
+ tv->tv_usec -= 1000000 * (recanim_time_warp - (time_t) recanim_time_warp);
+}
+
+time_t
+screenhack_record_anim_time (time_t *o)
+{
+ struct timeval tv;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tz;
+# endif
+ screenhack_record_anim_gettimeofday (&tv
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ , &tz
+# endif
+ );
+ if (o) *o = tv.tv_sec;
+ return tv.tv_sec;
+}
+
+
+record_anim_state *
+screenhack_record_anim_init (Screen *screen, Window window, int target_frames)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ record_anim_state *st;
+
+# ifndef USE_GL
+ XGCValues gcv;
+# endif /* !USE_GL */
+
+ if (target_frames <= 0) return 0;
+
+ st = (record_anim_state *) calloc (1, sizeof(*st));
+
+ st->screen = screen;
+ st->window = window;
+ st->target_frames = target_frames;
+ st->frame_count = 0;
+ st->fade_frames = 30 * 1.5;
+
+ if (st->fade_frames >= (st->target_frames / 2) - 30)
+ st->fade_frames = 0;
+
+# ifdef HAVE_GDK_PIXBUF
+ {
+ Window root;
+ int x, y;
+ unsigned int w, h, d, bw;
+ XGetGeometry (dpy, window, &root, &x, &y, &w, &h, &bw, &d);
+ gdk_pixbuf_xlib_init_with_depth (dpy, screen_number (screen), d);
+
+# ifdef HAVE_GTK2
+# if !GLIB_CHECK_VERSION(2, 36 ,0)
+ g_type_init();
+# endif
+# else /* !HAVE_GTK2 */
+ xlib_rgb_init (dpy, screen);
+# endif /* !HAVE_GTK2 */
+ }
+# else /* !HAVE_GDK_PIXBUF */
+# error GDK_PIXBUF is required
+# endif /* !HAVE_GDK_PIXBUF */
+
+ XGetWindowAttributes (dpy, st->window, &st->xgwa);
+
+# ifdef USE_GL
+
+ st->data = (char *) calloc (st->xgwa.width, st->xgwa.height * 3);
+ st->data2 = (char *) calloc (st->xgwa.width, st->xgwa.height * 3);
+
+# else /* !USE_GL */
+
+ st->gc = XCreateGC (dpy, st->window, 0, &gcv);
+ st->p = XCreatePixmap (dpy, st->window,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+ st->img = XCreateImage (dpy, st->xgwa.visual, st->xgwa.depth, ZPixmap,
+ 0, 0, st->xgwa.width, st->xgwa.height, 8, 0);
+ st->img->data = (char *) calloc (st->img->height, st->img->bytes_per_line);
+# endif /* !USE_GL */
+
+
+# ifndef HAVE_JWXYZ
+ XFetchName (dpy, st->window, &st->title);
+# endif /* !HAVE_JWXYZ */
+
+ return st;
+}
+
+
+/* Fade to black. Assumes data is 3-byte packed.
+ */
+static void
+fade_frame (record_anim_state *st, unsigned char *data, double ratio)
+{
+ int x, y, i;
+ int w = st->xgwa.width;
+ int h = st->xgwa.height;
+ unsigned char *s = data;
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ for (i = 0; i < 3; i++)
+ *s++ *= ratio;
+}
+
+
+void
+screenhack_record_anim (record_anim_state *st)
+{
+ int bytes_per_line = st->xgwa.width * 3;
+ double start_time = double_time();
+
+# ifndef USE_GL
+
+ Display *dpy = DisplayOfScreen (st->screen);
+ char *data = (char *) st->img->data;
+
+ /* Under XQuartz we can't just do XGetImage on the Window, we have to
+ go through an intermediate Pixmap first. I don't understand why.
+ Also, the fucking resize handle shows up as black. God dammit.
+ A workaround for that is to temporarily remove /opt/X11/bin/quartz-wm
+ */
+ XCopyArea (dpy, st->window, st->p, st->gc, 0, 0,
+ st->xgwa.width, st->xgwa.height, 0, 0);
+ XGetSubImage (dpy, st->p, 0, 0, st->xgwa.width, st->xgwa.height,
+ ~0L, ZPixmap, st->img, 0, 0);
+
+ /* Convert BGRA to RGB */
+ {
+ const char *in = st->img->data;
+ char *out = st->img->data;
+ int x, y;
+ int w = st->img->width;
+ int h = st->img->height;
+ for (y = 0; y < h; y++)
+ {
+ const char *in2 = in;
+ for (x = 0; x < w; x++)
+ {
+ *out++ = in2[2];
+ *out++ = in2[1];
+ *out++ = in2[0];
+ in2 += 4;
+ }
+ in += st->img->bytes_per_line;
+ }
+ }
+# else /* USE_GL */
+
+ char *data = st->data2;
+ int y;
+
+# ifdef HAVE_JWZGLES
+# undef glReadPixels /* Kludge -- unimplemented in the GLES compat layer */
+# endif
+
+ /* First OpenGL frame tends to be random data like a shot of my desktop,
+ since it is the front buffer when we were drawing in the back buffer.
+ Leave it black. */
+ /* glDrawBuffer (GL_BACK); */
+ if (st->frame_count != 0)
+ glReadPixels (0, 0, st->xgwa.width, st->xgwa.height,
+ GL_RGB, GL_UNSIGNED_BYTE, st->data);
+
+ /* Flip vertically */
+ for (y = 0; y < st->xgwa.height; y++)
+ memcpy (data + bytes_per_line * y,
+ st->data + bytes_per_line * (st->xgwa.height - y - 1),
+ bytes_per_line);
+
+# endif /* USE_GL */
+
+
+ if (st->frame_count < st->fade_frames)
+ fade_frame (st, (unsigned char *) data,
+ (double) st->frame_count / st->fade_frames);
+ else if (st->frame_count >= st->target_frames - st->fade_frames)
+ fade_frame (st, (unsigned char *) data,
+ (double) (st->target_frames - st->frame_count - 1) /
+ st->fade_frames);
+
+# ifdef HAVE_GDK_PIXBUF
+ {
+ const char *type = "png";
+ char fn[1024];
+ GError *error = 0;
+ GdkPixbuf *pixbuf;
+
+ pixbuf = gdk_pixbuf_new_from_data ((guchar *) data,
+ GDK_COLORSPACE_RGB, False, /* alpha */
+ 8, /* bits per sample */
+ st->xgwa.width, st->xgwa.height,
+ bytes_per_line,
+ 0, 0);
+
+ sprintf (fn, "%s-%06d.%s", progname, st->frame_count, type);
+ gdk_pixbuf_save (pixbuf, fn, type, &error, NULL);
+
+ if (error)
+ {
+ fprintf (stderr, "%s: %s: %s\n", progname, fn, error->message);
+ exit (1);
+ }
+
+ g_object_unref (pixbuf);
+ }
+# else /* !HAVE_GDK_PIXBUF */
+# error GDK_PIXBUF is required
+# endif /* !HAVE_GDK_PIXBUF */
+
+# ifndef HAVE_JWXYZ
+ { /* Put percent done in window title */
+ int pct = 100 * (st->frame_count + 1) / st->target_frames;
+ if (pct != st->pct && st->title)
+ {
+ Display *dpy = DisplayOfScreen (st->screen);
+ char *t2 = (char *) malloc (strlen(st->title) + 20);
+ sprintf (t2, "%s: %d%%", st->title, pct);
+ XStoreName (dpy, st->window, t2);
+ XSync (dpy, 0);
+ free (t2);
+ st->pct = pct;
+ }
+ }
+# endif /* !HAVE_JWXYZ */
+
+ if (++st->frame_count >= st->target_frames)
+ screenhack_record_anim_free (st);
+
+ recanim_time_warp += double_time() - start_time;
+}
+
+
+void
+screenhack_record_anim_free (record_anim_state *st)
+{
+# ifndef USE_GL
+ Display *dpy = DisplayOfScreen (st->screen);
+# endif /* !USE_GL */
+
+ struct stat s;
+ int i;
+ const char *type = "png";
+ char cmd[1024];
+ char fn[1024];
+ const char *soundtrack = 0;
+
+ fprintf (stderr, "%s: wrote %d frames\n", progname, st->frame_count);
+
+# ifdef USE_GL
+ free (st->data);
+ free (st->data2);
+# else /* !USE_GL */
+ free (st->img->data);
+ st->img->data = 0;
+ XDestroyImage (st->img);
+ XFreeGC (dpy, st->gc);
+ XFreePixmap (dpy, st->p);
+# endif /* !USE_GL */
+
+ sprintf (fn, "%s.%s", progname, "mp4");
+ unlink (fn);
+
+# define ST "images/drives-200.mp3"
+ soundtrack = ST;
+ if (stat (soundtrack, &s)) soundtrack = 0;
+ if (! soundtrack) soundtrack = "../" ST;
+ if (stat (soundtrack, &s)) soundtrack = 0;
+ if (! soundtrack) soundtrack = "../../" ST;
+ if (stat (soundtrack, &s)) soundtrack = 0;
+
+ sprintf (cmd,
+ "ffmpeg"
+ " -hide_banner"
+ " -v 16"
+ " -framerate 30" /* rate of input: must be before -i */
+ " -i '%s-%%06d.%s'"
+ " -r 30", /* rate of output: must be after -i */
+ progname, type);
+ if (soundtrack)
+ sprintf (cmd + strlen(cmd),
+ " -i '%s' -map 0:v:0 -map 1:a:0 -acodec aac",
+ soundtrack);
+ sprintf (cmd + strlen(cmd),
+ " -c:v libx264"
+ " -profile:v high"
+ " -crf 18"
+ " -pix_fmt yuv420p"
+ " '%s'"
+ " </dev/null"
+ /*" 2>&-"*/,
+ fn);
+ fprintf (stderr, "%s: exec: %s\n", progname, cmd);
+ system (cmd);
+
+ if (stat (fn, &s))
+ {
+ fprintf (stderr, "%s: %s was not created\n", progname, fn);
+ exit (1);
+ }
+
+ fprintf (stderr, "%s: wrote %s (%.1f MB)\n", progname, fn,
+ s.st_size / (float) (1024 * 1024));
+
+ for (i = 0; i < st->frame_count; i++)
+ {
+ sprintf (fn, "%s-%06d.%s", progname, i, type);
+ unlink (fn);
+ }
+
+ if (st->title)
+ free (st->title);
+ free (st);
+ exit (0);
+}
diff --git a/hacks/recanim.h b/hacks/recanim.h
new file mode 100644
index 0000000..a7e8cf3
--- /dev/null
+++ b/hacks/recanim.h
@@ -0,0 +1,36 @@
+/* recanim, Copyright (c) 2014-2018 Jamie Zawinski <jwz@jwz.org>
+ * Record animation frames of the running screenhack.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_RECORD_ANIM_H__
+# define __XSCREENSAVER_RECORD_ANIM_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+typedef struct record_anim_state record_anim_state;
+
+extern record_anim_state *screenhack_record_anim_init (Screen *, Window,
+ int frames);
+extern void screenhack_record_anim (record_anim_state *);
+extern void screenhack_record_anim_free (record_anim_state *);
+
+extern time_t screenhack_record_anim_time (time_t *);
+extern void screenhack_record_anim_gettimeofday (struct timeval *
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ , struct timezone *
+# endif
+ );
+#define time screenhack_record_anim_time
+#define gettimeofday screenhack_record_anim_gettimeofday
+
+#endif /* __XSCREENSAVER_RECORD_ANIM_H__ */
diff --git a/hacks/ripples.c b/hacks/ripples.c
new file mode 100644
index 0000000..447a455
--- /dev/null
+++ b/hacks/ripples.c
@@ -0,0 +1,1118 @@
+/* ripples, Copyright (c) 1999 Ian McConnell <ian@emit.demon.co.uk>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ * "Water" ripples that can cross and interfere with each other.
+ *
+ * I can't remember where I got this idea from, but it's been around for a
+ * while in various demos. Some inspiration from
+ * water.txt by Tom Hammersley,tomh@globalnet.co.uk
+ *
+ * Options
+ * -delay usleep every iteration
+ * -rate Add one drop every "rate" iterations
+ * -box Add big square splash every "box" iters (not very good)
+ * -water Ripples on a grabbed background image
+ * -foreground Interpolate ripples between these two colors
+ * -background
+ * -oily Psychedelic colours like man
+ * -stir Add a regular pattern of drops
+ * -fluidity Between 0 and 16. 16 = big drops
+ * -light Hack to add lighting effect
+ *
+ * Code mainly hacked from xflame and decayscreen.
+ */
+
+/* Version history:
+ * 13 Oct 1999: Initial hack
+ * 30 Oct 1999: Speeded up graphics with dirty buffer. Returned to using
+ * putpixel for greater portability
+ * Added a variety of methods for splashing screen.
+ * 31 Oct 1999: Added in lighting hack
+ * 13 Nov 1999: Speed up tweaks
+ * Adjust "light" for different bits per colour (-water only)
+ * 09 Oct 2016: Updated for new xshm.c
+ *
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+typedef enum {ripple_drop, ripple_blob, ripple_box, ripple_stir} ripple_mode;
+
+#include "xshm.h"
+
+#define TABLE 256
+
+struct state {
+ Display *dpy;
+ Window window;
+ GC gc;
+ Visual *visual;
+
+ XImage *orig_map, *buffer_map;
+ int ctab[256];
+ Colormap colormap;
+ Screen *screen;
+ int ncolors;
+ int light;
+
+ int width, height; /* ripple size */
+ int bigwidth, bigheight; /* screen size */
+
+ Bool transparent;
+ short *bufferA, *bufferB, *temp;
+ char *dirty_buffer;
+
+ double cos_tab[TABLE];
+
+ Bool grayscale_p;
+
+ unsigned long rmask; /* This builds on the warp effect by adding */
+ unsigned long gmask; /* in a lighting effect: brighten pixels by an */
+ unsigned long bmask; /* amount corresponding to the vertical gradient */
+
+ int rshift;
+ int gshift;
+ int bshift;
+
+ double stir_ang;
+
+ int draw_toggle;
+ int draw_count;
+
+ int iterations, delay, rate, box, oily, stir, fluidity;
+ int duration;
+ time_t start_time;
+
+ void (*draw_transparent) (struct state *st, short *src);
+
+ async_load_state *img_loader;
+
+ XShmSegmentInfo shm_info;
+};
+
+
+/* Distribution of drops: many little ones and a few big ones. */
+static const double drop_dist[] =
+ {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 0.6};
+
+
+/* How hard to hit the water */
+#define SPLASH 512
+#undef MIN
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#undef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#undef DIRTY
+#define DIRTY 3 /* dirty >= 2, 1 = restore original pixel, 0 = leave alone */
+
+/* From fortune(6) */
+/* -- really weird C code to count the number of bits in a word */
+#define BITCOUNT(x) (((BX_(x)+(BX_(x)>>4)) & 0x0F0F0F0F) % 255)
+#define BX_(x) ((x) - (((x)>>1)&0x77777777) \
+ - (((x)>>2)&0x33333333) \
+ - (((x)>>3)&0x11111111))
+
+
+static unsigned long grayscale(struct state *st, unsigned long color);
+
+/* ------------------------------------------- */
+
+
+static int
+map_color(struct state *st, int grey)
+{
+ /* Clip it */
+ grey = st->ncolors * abs(grey) / (SPLASH/4);
+ if (grey > st->ncolors)
+ grey = st->ncolors;
+
+ /* Display it */
+ return st->ctab[grey];
+}
+
+
+static void
+draw_ripple(struct state *st, short *src)
+{
+ int across, down;
+ char *dirty = st->dirty_buffer;
+
+ for (down = 0; down < st->height - 1; down++, src += 1, dirty += 1)
+ for (across = 0; across < st->width - 1; across++, src++, dirty++) {
+ int v1, v2, v3, v4;
+ v1 = (int)*src;
+ v2 = (int)*(src + 1);
+ v3 = (int)*(src + st->width);
+ v4 = (int)*(src + st->width + 1);
+ if ((v1 == 0 && v2 == 0 && v3 == 0 && v4 == 0)) {
+ if (*dirty > 0)
+ (*dirty)--;
+ } else
+ *dirty = DIRTY;
+
+ if (*dirty > 0) {
+ int dx;
+ if (st->light > 0) {
+ dx = ((v3 - v1) + (v4 - v2)) << st->light; /* light from top */
+ } else
+ dx = 0;
+ XPutPixel(st->buffer_map,(across<<1), (down<<1), map_color(st, dx + v1));
+ XPutPixel(st->buffer_map,(across<<1)+1,(down<<1), map_color(st, dx + ((v1 + v2) >> 1)));
+ XPutPixel(st->buffer_map,(across<<1), (down<<1)+1,map_color(st, dx + ((v1 + v3) >> 1)));
+ XPutPixel(st->buffer_map,(across<<1)+1,(down<<1)+1,map_color(st, dx + ((v1 + v4) >> 1)));
+ }
+ }
+}
+
+
+/* ------------------------------------------- */
+
+
+/* Uses the horizontal gradient as an offset to create a warp effect */
+static void
+draw_transparent_vanilla(struct state *st, short *src)
+{
+ int across, down, pixel;
+ char *dirty = st->dirty_buffer;
+
+ pixel = 0;
+ for (down = 0; down < st->height - 2; down++, pixel += 2)
+ for (across = 0; across < st->width-2; across++, pixel++) {
+ int gradx, grady, gradx1, grady1;
+ int x0, x1, x2, y1, y2;
+
+ x0 = src[pixel];
+ x1 = src[pixel + 1];
+ x2 = src[pixel + 2];
+ y1 = src[pixel + st->width];
+ y2 = src[pixel + 2*st->width];
+
+ gradx = (x1 - x0);
+ grady = (y1 - x0);
+ gradx1= (x2 - x1);
+ grady1= (y2 - y1);
+ gradx1 = 1 + (gradx + gradx1) / 2;
+ grady1 = 1 + (grady + grady1) / 2;
+
+ if ((2*across+MIN(gradx,gradx1) < 0) ||
+ (2*across+MAX(gradx,gradx1) >= st->bigwidth)) {
+ gradx = 0;
+ gradx1= 1;
+ }
+ if ((2*down+MIN(grady,grady1) < 0) ||
+ (2*down+MAX(grady,grady1) >= st->bigheight)) {
+ grady = 0;
+ grady1 = 1;
+ }
+
+ if ((gradx == 0 && gradx1 == 1 && grady == 0 && grady1 == 1)) {
+ if (dirty[pixel] > 0)
+ dirty[pixel]--;
+ } else
+ dirty[pixel] = DIRTY;
+
+ if (dirty[pixel] > 0) {
+ XPutPixel(st->buffer_map, (across<<1), (down<<1),
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx, (down<<1) + grady)));
+ XPutPixel(st->buffer_map, (across<<1)+1,(down<<1),
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx1,(down<<1) + grady)));
+ XPutPixel(st->buffer_map, (across<<1), (down<<1)+1,
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx, (down<<1) + grady1)));
+ XPutPixel(st->buffer_map, (across<<1)+1,(down<<1)+1,
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
+ }
+ }
+}
+
+
+/* ------------------------------------------- */
+
+
+static void
+set_mask(unsigned long *mask, int *shift)
+{
+ unsigned long color = *mask;
+ *shift = 0;
+ while (color != 0 && (color & 1) == 0) {
+ (*shift)++;
+ color >>= 1;
+ }
+ *mask = color;
+}
+
+
+static unsigned long
+cadd(unsigned long color, int dx, unsigned long mask, int shift)
+{
+ int x;
+ color >>= shift;
+ x = (color & mask);
+ x += dx;
+ if (x < 0) x = 0;
+ else if (x > (int)mask) x = mask;
+ color = x;
+ return color << shift;
+}
+
+
+static unsigned long
+bright(struct state *st, int dx, unsigned long color)
+{
+ return (cadd(color, dx, st->rmask, st->rshift) |
+ cadd(color, dx, st->gmask, st->gshift) |
+ cadd(color, dx, st->bmask, st->bshift));
+}
+
+
+static unsigned long
+grayscale(struct state *st, unsigned long color)
+{
+ int red;
+ int green;
+ int blue;
+ int total;
+ int gray_r;
+ int gray_g;
+ int gray_b;
+
+ if (!st->grayscale_p)
+ return color;
+ if (!st->transparent)
+ return color;
+ if ((st->rmask == 0) || (st->gmask == 0) || (st->bmask == 0))
+ return color;
+
+ red = ((color >> st->rshift) & st->rmask);
+ green = ((color >> st->gshift) & st->gmask);
+ blue = ((color >> st->bshift) & st->bmask);
+ total = red * st->gmask * st->bmask + green * st->rmask * st->bmask + blue * st->rmask * st->gmask;
+
+ gray_r = total / (3 * st->gmask * st->bmask);
+ if (gray_r < 0)
+ gray_r = 0;
+ if (gray_r > st->rmask)
+ gray_r = st->rmask;
+
+ gray_g = total / (3 * st->rmask * st->bmask);
+ if (gray_g < 0)
+ gray_g = 0;
+ if (gray_g > st->gmask)
+ gray_g = st->gmask;
+
+ gray_b = total / (3 * st->rmask * st->gmask);
+ if (gray_b < 0)
+ gray_b = 0;
+ if (gray_b > st->bmask)
+ gray_b = st->bmask;
+
+ return ((unsigned long)
+ ((gray_r << st->rshift) | (gray_g << st->gshift) | (gray_b << st->bshift)));
+}
+
+
+static void
+draw_transparent_light(struct state *st, short *src)
+{
+ int across, down, pixel;
+ char *dirty = st->dirty_buffer;
+
+ pixel = 0;
+ for (down = 0; down < st->height - 2; down++, pixel += 2)
+ for (across = 0; across < st->width-2; across++, pixel++) {
+ int gradx, grady, gradx1, grady1;
+ int x0, x1, x2, y1, y2;
+
+ x0 = src[pixel];
+ x1 = src[pixel + 1];
+ x2 = src[pixel + 2];
+ y1 = src[pixel + st->width];
+ y2 = src[pixel + 2*st->width];
+
+ gradx = (x1 - x0);
+ grady = (y1 - x0);
+ gradx1= (x2 - x1);
+ grady1= (y2 - y1);
+ gradx1 = 1 + (gradx + gradx1) / 2;
+ grady1 = 1 + (grady + grady1) / 2;
+
+ if ((2*across+MIN(gradx,gradx1) < 0) ||
+ (2*across+MAX(gradx,gradx1) >= st->bigwidth)) {
+ gradx = 0;
+ gradx1= 1;
+ }
+ if ((2*down+MIN(grady,grady1) < 0) ||
+ (2*down+MAX(grady,grady1) >= st->bigheight)) {
+ grady = 0;
+ grady1 = 1;
+ }
+
+ if ((gradx == 0 && gradx1 == 1 && grady == 0 && grady1 == 1)) {
+ if (dirty[pixel] > 0)
+ dirty[pixel]--;
+ } else
+ dirty[pixel] = DIRTY;
+
+ if (dirty[pixel] > 0) {
+ int dx;
+
+ /* light from top */
+ if (4-st->light >= 0)
+ dx = (grady + (src[pixel+st->width+1]-x1)) >> (4-st->light);
+ else
+ dx = (grady + (src[pixel+st->width+1]-x1)) << (st->light-4);
+
+ if (dx != 0) {
+ XPutPixel(st->buffer_map, (across<<1), (down<<1),
+ bright(st, dx, grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx, (down<<1) + grady))));
+ XPutPixel(st->buffer_map, (across<<1)+1,(down<<1),
+ bright(st, dx, grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx1,(down<<1) + grady))));
+ XPutPixel(st->buffer_map, (across<<1), (down<<1)+1,
+ bright(st, dx, grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx, (down<<1) + grady1))));
+ XPutPixel(st->buffer_map, (across<<1)+1,(down<<1)+1,
+ bright(st, dx, grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx1,(down<<1) + grady1))));
+ } else {
+ /* Could use XCopyArea, but XPutPixel is faster */
+ XPutPixel(st->buffer_map, (across<<1), (down<<1),
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx, (down<<1) + grady)));
+ XPutPixel(st->buffer_map, (across<<1)+1,(down<<1),
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx1,(down<<1) + grady)));
+ XPutPixel(st->buffer_map, (across<<1), (down<<1)+1,
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx, (down<<1) + grady1)));
+ XPutPixel(st->buffer_map, (across<<1)+1,(down<<1)+1,
+ grayscale(st, XGetPixel(st->orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
+ }
+ }
+ }
+}
+
+
+/* ------------------------------------------- */
+
+
+#if 0
+/* Doesn't go any faster and doesn't work at all colour depths */
+static void
+draw_transparent16l(short *src)
+{
+ int across, down, bigpix, pixel;
+ char *dirty = st->dirty_buffer;
+ unsigned short *buffer, *orig;
+
+ buffer = (unsigned short *) st->buffer_map->data;
+ orig = (unsigned short *) st->orig_map->data;
+
+ for (pixel = bigpix = down = 0;
+ down < st->height - 2;
+ down++, pixel += 2, bigpix += st->bigwidth+4)
+ for (across = 0; across < st->width-2; across++, pixel++, bigpix+=2) {
+ int gradx, grady, gradx1, grady1;
+ int x0, x1, x2, y1, y2;
+
+ x0 = src[pixel];
+ x1 = src[pixel + 1];
+ x2 = src[pixel + 2];
+ y1 = src[pixel + st->width];
+ y2 = src[pixel + 2*st->width];
+
+ gradx = (x1 - x0);
+ grady = (y1 - x0);
+ gradx1= (x2 - x1);
+ grady1= (y2 - y1);
+ gradx1 = 1 + (gradx + gradx1) / 2;
+ grady1 = 1 + (grady + grady1) / 2;
+
+ if ((2*across+MIN(gradx,gradx1) < 0) ||
+ (2*across+MAX(gradx,gradx1) >= st->bigwidth)) {
+ gradx = 0;
+ gradx1= 1;
+ }
+ if ((2*down+MIN(grady,grady1) < 0) ||
+ (2*down+MAX(grady,grady1) >= st->bigheight)) {
+ grady = 0;
+ grady1 = 1;
+ }
+
+ if ((gradx == 0 && gradx1 == 1 && grady == 0 && grady1 == 1)) {
+ if (dirty[pixel] > 0)
+ dirty[pixel]--;
+ } else
+ dirty[pixel] = DIRTY;
+
+ if (dirty[pixel] > 0) {
+ unsigned short *dest = buffer + bigpix;
+ unsigned short *image = orig + bigpix;
+ int dx;
+
+ /* light from top */
+ if (4-st->light >= 0)
+ dx = (grady + (src[pixel+st->width+1]-x1)) >> (4-st->light);
+ else
+ dx = (grady + (src[pixel+st->width+1]-x1)) << (st->light-4);
+
+ grady *= st->bigwidth;
+ grady1*= st->bigwidth;
+
+ if (dx != 0) {
+ *dest++ = dobright(dx, *(image + gradx + grady));
+ *dest = dobright(dx, *(image + gradx1 + grady));
+ dest += st->bigwidth - 1;
+ *dest++ = dobright(dx, *(image + gradx + grady1));
+ *dest = dobright(dx, *(image + gradx1 + grady1));
+ } else {
+ *dest++ = *(image + gradx + grady);
+ *dest = *(image + gradx1 + grady);
+ dest += st->bigwidth - 1;
+ *dest++ = *(image + gradx + grady1);
+ *dest = *(image + gradx1 + grady1);
+ }
+ }
+ }
+}
+#endif
+
+
+/* ------------------------------------------- */
+
+
+static void
+setup_X(struct state *st)
+{
+ XWindowAttributes xgwa;
+ int depth;
+
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ depth = xgwa.depth;
+ st->colormap = xgwa.colormap;
+ st->screen = xgwa.screen;
+ st->bigwidth = xgwa.width;
+ st->bigheight = xgwa.height;
+ st->visual = xgwa.visual;
+
+
+ /* This causes buffer_map to be 1 pixel taller and wider than orig_map,
+ which can cause the two XImages to have different bytes-per-line,
+ which causes stair-stepping. So this better not be necessary...
+ -jwz, 23-Nov-01
+ */
+#if 0 /* I'm not entirely sure if I need this */
+ if (st->bigwidth % 2)
+ st->bigwidth++;
+ if (st->bigheight % 2)
+ st->bigheight++;
+#endif
+
+
+ st->width = st->bigwidth / 2;
+ st->height = st->bigheight / 2;
+
+ if (st->transparent) {
+ XGCValues gcv;
+ long gcflags;
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+
+ gcflags = GCFunction;
+ if (use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+
+ st->gc = XCreateGC(st->dpy, st->window, gcflags, &gcv);
+
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ } else {
+ XGCValues gcv;
+
+ st->gc = XCreateGC(st->dpy, st->window, 0, &gcv);
+ st->orig_map = 0;
+ }
+
+ if (!st->gc) {
+ fprintf(stderr, "XCreateGC failed\n");
+ exit(1);
+ }
+
+ st->buffer_map = create_xshm_image(st->dpy, xgwa.visual, depth,
+ ZPixmap, &st->shm_info, st->bigwidth, st->bigheight);
+}
+
+
+static void
+DisplayImage(struct state *st)
+{
+ put_xshm_image(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, 0, 0,
+ st->bigwidth, st->bigheight, &st->shm_info);
+}
+
+
+/* ------------------------------------------- */
+
+
+static int
+cinterp(double a, int bg, int fg)
+{
+ int result;
+ result = (int)((1-a) * bg + a * fg + 0.5);
+ if (result < 0) result = 0;
+ if (result > 255) result = 255;
+ return result;
+}
+
+
+/* Interpolate the ripple colours between the background colour and
+ foreground colour */
+static void
+init_linear_colors(struct state *st)
+{
+ int i, j, red, green, blue, bred, bgreen, bblue;
+ XColor fg, bg;
+
+ if (st->ncolors < 2 || mono_p)
+ st->ncolors = 2;
+ if (st->ncolors <= 2)
+ mono_p = True;
+
+ /* Make it possible to set the color of the ripples,
+ Based on work by Raymond Medeiros <ray@stommel.marine.usf.edu> and jwz.
+ */
+ fg.pixel = get_pixel_resource(st->dpy, st->colormap, "foreground", "Foreground");
+ XQueryColor(st->dpy, st->colormap, &fg);
+ red = (fg.red >> 8);
+ green = (fg.green >> 8);
+ blue = (fg.blue >> 8);
+
+ bg.pixel = get_pixel_resource(st->dpy, st->colormap, "background", "Background");
+ XQueryColor(st->dpy, st->colormap, &bg);
+ bred = (bg.red >> 8);
+ bgreen = (bg.green >> 8);
+ bblue = (bg.blue >> 8);
+
+ j = 0;
+ for (i = 0; i < st->ncolors+1; i++) {
+ XColor xcl;
+ double a = (double)i / st->ncolors;
+ int r = cinterp(a, bred, red);
+ int g = cinterp(a, bgreen, green);
+ int b = cinterp(a, bblue, blue);
+
+ xcl.red = (unsigned short) ((r << 8) | r);
+ xcl.green = (unsigned short) ((g << 8) | g);
+ xcl.blue = (unsigned short) ((b << 8) | b);
+ xcl.flags = DoRed | DoGreen | DoBlue;
+
+ XAllocColor(st->dpy, st->colormap, &xcl);
+
+ st->ctab[j++] = (int) xcl.pixel;
+ }
+}
+
+
+static void
+init_oily_colors(struct state *st)
+{
+ XColor *colors = NULL;
+
+ if (st->ncolors < 2 || mono_p)
+ st->ncolors = 2;
+ if (st->ncolors <= 2)
+ mono_p = True;
+ colors = 0;
+
+ if (!mono_p) {
+ colors = (XColor *)malloc(sizeof(*colors) * (st->ncolors+1));
+ make_smooth_colormap(st->screen, st->visual, st->colormap,
+ colors, &st->ncolors,
+ True, /* allocate */
+ False, /* not writable */
+ True); /* verbose (complain about failure) */
+ if (st->ncolors <= 2) {
+ if (colors)
+ free (colors);
+ colors = 0;
+ mono_p = True;
+ }
+ }
+ if (!mono_p) {
+ int i, j = 0;
+ for (i = 0; i < st->ncolors+1; i++) {
+ XAllocColor(st->dpy, st->colormap, colors+i);
+ st->ctab[j++] = (int) colors[i].pixel;
+ }
+ free (colors);
+ } else {
+ st->ncolors = 2;
+ st->ctab[1] = get_pixel_resource(st->dpy, st->colormap, "foreground", "Foreground");
+ st->ctab[0] = get_pixel_resource(st->dpy, st->colormap, "background", "Background");
+ }
+}
+
+
+/* ------------------------------------------- */
+
+
+static void
+init_cos_tab(struct state *st)
+{
+ int i;
+ for (i = 0; i < TABLE; i++)
+ st->cos_tab[i] = cos(i * M_PI/2 / TABLE);
+}
+
+
+/* Shape of drop to add */
+static double
+sinc(struct state *st, double x)
+{
+#if 1
+ /* cosine hump */
+ int i;
+ i = (int)(x * TABLE + 0.5);
+ if (i >= TABLE) i = (TABLE-1) - (i-(TABLE-1));
+ if (i < 0) return 0.;
+ return st->cos_tab[i];
+#elif 0
+ return cos(x * M_PI/2);
+#else
+ if (fabs(x) < 0.1)
+ return 1 - x*x;
+ else
+ return sin(x) / x;
+#endif
+}
+
+
+static void
+add_circle_drop(struct state *st, int x, int y, int radius, int dheight)
+{
+ int r, r2, cx, cy;
+ short *buf = (random()&1) ? st->bufferA : st->bufferB;
+
+ r2 = radius * radius;
+
+
+ for (cy = -radius; cy <= radius; cy++)
+ for (cx = -radius; cx <= radius; cx++) {
+ int xx = x+cx;
+ int yy = y+cy;
+ if (xx < 0 || yy < 0 || xx >= st->width || yy >= st->height) {break;}
+ r = cx*cx + cy*cy;
+ if (r > r2) break;
+ buf[xx + yy*st->width] =
+ (short)(dheight * sinc(st, (radius > 0) ? sqrt(r)/radius : 0));
+ }
+}
+
+
+static void
+add_drop(struct state *st, ripple_mode mode, int drop)
+{
+ int newx, newy, dheight;
+ int radius = MIN(st->width, st->height) / 50;
+ /* Don't put drops too near the edge of the screen or they get stuck */
+ int border = 8;
+
+ switch (mode) {
+ default:
+ case ripple_drop: {
+ int x;
+
+ dheight = 1 + (random() % drop);
+ newx = border + (random() % (st->width - 2*border));
+ newy = border + (random() % (st->height - 2*border));
+ x = newy * st->width + newx;
+ st->bufferA[x + 1] = st->bufferA[x] = st->bufferA[x + st->width] = st->bufferA[x + st->width + 1] =
+ st->bufferB[x + 1] = st->bufferB[x] = st->bufferB[x + st->width] = st->bufferB[x + st->width + 1] =
+ dheight;
+ }
+ break;
+ case ripple_blob: {
+ double power;
+
+ int tmp_i, tmp_j;
+ power = drop_dist[random() % (sizeof(drop_dist)/sizeof(drop_dist[0]))]; /* clumsy */
+ dheight = (int)(drop * (power + 0.01));
+ tmp_i = (int)(st->width - 2*border - 2*radius*power);
+ tmp_j = (int)(st->height - 2*border - 2*radius*power);
+ newx = radius + border + ((tmp_i > 0) ? random() % tmp_i : 0);
+ newy = radius + border + ((tmp_j > 0) ? random() % tmp_j : 0);
+ add_circle_drop(st, newx, newy, radius, dheight);
+ }
+ break;
+ /* Adding too many boxes too quickly (-box 1) doesn't give the waves time
+ to disperse and the waves build up (and overflow) */
+ case ripple_box: {
+ int x;
+ int cx, cy;
+ short *buf = (random()&1) ? st->bufferA : st->bufferB;
+ int tmp_i, tmp_j;
+
+ radius = (1 + (random() % 5)) * (1 + (random() % 5));
+ dheight = drop / 128;
+ if (random() & 1) dheight = -dheight;
+ tmp_i = st->width - 2*border - 2*radius;
+ tmp_j = st->height - 2*border - 2*radius;
+ newx = radius + border + ((tmp_i > 0) ? random() % tmp_i : 0);
+ newy = radius + border + ((tmp_j > 0) ? random() % tmp_j : 0);
+ x = newy * st->width + newx;
+ for (cy = -radius; cy <= radius; cy++)
+ for (cx = -radius; cx <= radius; cx++)
+ buf[x + cx + cy*st->width] = (short)(dheight);
+ }
+ break;
+ case ripple_stir: {
+ border += radius;
+ newx = border + (int)((st->width-2*border) * (1+cos(3*st->stir_ang)) / 2);
+ newy = border + (int)((st->height-2*border) * (1+sin(2*st->stir_ang)) / 2);
+ add_circle_drop(st, newx, newy, radius, drop / 10);
+ st->stir_ang += 0.02;
+ if (st->stir_ang > 12*M_PI) st->stir_ang = 0;
+ }
+ break;
+ }
+}
+
+
+static void
+init_ripples(struct state *st, int ndrops, int splash)
+{
+ int i;
+
+ st->bufferA = (short *)calloc(st->width * st->height, sizeof(*st->bufferA));
+ st->bufferB = (short *)calloc(st->width * st->height, sizeof(*st->bufferB));
+ st->temp = (short *)calloc(st->width * st->height, sizeof(*st->temp));
+
+ st->dirty_buffer = (char *)calloc(st->width * st->height, sizeof(*st->dirty_buffer));
+
+ for (i = 0; i < ndrops; i++)
+ add_drop(st, ripple_blob, splash);
+
+ if (st->transparent) {
+ if (st->grayscale_p)
+ {
+ int across, down;
+ for (down = 0; down < st->bigheight; down++)
+ for (across = 0; across < st->bigwidth; across++)
+ XPutPixel(st->buffer_map, across, down,
+ grayscale(st, XGetPixel(st->orig_map, across, down)));
+ }
+ else
+ {
+ /* There's got to be a better way of doing this XCopyArea? */
+ memcpy(st->buffer_map->data, st->orig_map->data,
+ st->bigheight * st->buffer_map->bytes_per_line);
+ }
+ } else {
+ int across, down, color;
+
+ color = map_color(st, 0); /* background colour */
+ for (down = 0; down < st->bigheight; down++)
+ for (across = 0; across < st->bigwidth; across++)
+ XPutPixel(st->buffer_map,across, down, color);
+ }
+
+ DisplayImage(st);
+}
+
+
+/*
+ Explanation from hq_water.zip (Arturo R Montesinos (ARM) arami@fi.upm.es)
+
+ Differential equation is: u = a ( u + u )
+ tt xx yy
+
+ Where a = tension * gravity / surface_density.
+
+ Approximating second derivatives by central differences:
+
+ [ u(t+1)-2u(t)+u(t-1) ] / dt = a [ u(x+1)+u(x-1)+u(y+1)+u(y-1)-4u ] / h
+
+ where dt = time step squared, h = dx*dy = mesh resolution squared.
+
+ From where u(t+1) may be calculated as:
+
+ dt | 1 | dt
+ u(t+1) = a -- | 1 0 1 |u - u(t-1) + (2-4a --)u
+ h | 1 | h
+
+ When a*dt/h = 1/2 last term vanishes, giving:
+
+ 1 | 1 |
+ u(t+1) = - | 1 0 1 |u - u(t-1)
+ 2 | 1 |
+
+ (note that u(t-1,x,y) is only used to calculate u(t+1,x,y) so
+ we can use the same array for both t-1 and t+1, needing only
+ two arrays, U[0] and U[1])
+
+ Dampening is simulated by subtracting 1/2^n of result.
+ n=4 gives best-looking result
+ n<4 (eg 2 or 3) thicker consistency, waves die out immediately
+ n>4 (eg 8 or 12) more fluid, waves die out slowly
+ */
+
+static void
+ripple(struct state *st)
+{
+ int across, down, pixel;
+ short *src, *dest;
+
+ if (st->draw_toggle == 0) {
+ src = st->bufferA;
+ dest = st->bufferB;
+ st->draw_toggle = 1;
+ } else {
+ src = st->bufferB;
+ dest = st->bufferA;
+ st->draw_toggle = 0;
+ }
+
+ switch (st->draw_count) {
+ case 0: case 1:
+ pixel = 1 * st->width + 1;
+ for (down = 1; down < st->height - 1; down++, pixel += 2 * 1)
+ for (across = 1; across < st->width - 1; across++, pixel++) {
+ st->temp[pixel] =
+ (((src[pixel - 1] + src[pixel + 1] +
+ src[pixel - st->width] + src[pixel + st->width]) / 2)) - dest[pixel];
+ }
+
+ /* Smooth the output */
+ pixel = 1 * st->width + 1;
+ for (down = 1; down < st->height - 1; down++, pixel += 2 * 1)
+ for (across = 1; across < st->width - 1; across++, pixel++) {
+ if (st->temp[pixel] != 0) { /* Close enough for government work */
+ int damp =
+ (st->temp[pixel - 1] + st->temp[pixel + 1] +
+ st->temp[pixel - st->width] + st->temp[pixel + st->width] +
+ st->temp[pixel - st->width - 1] + st->temp[pixel - st->width + 1] +
+ st->temp[pixel + st->width - 1] + st->temp[pixel + st->width + 1] +
+ st->temp[pixel]) / 9;
+ dest[pixel] = damp - (damp >> st->fluidity);
+ } else
+ dest[pixel] = 0;
+ }
+ break;
+ case 2: case 3:
+ pixel = 1 * st->width + 1;
+ for (down = 1; down < st->height - 1; down++, pixel += 2 * 1)
+ for (across = 1; across < st->width - 1; across++, pixel++) {
+ int damp =
+ (((src[pixel - 1] + src[pixel + 1] +
+ src[pixel - st->width] + src[pixel + st->width]) / 2)) - dest[pixel];
+ dest[pixel] = damp - (damp >> st->fluidity);
+ }
+ break;
+ }
+ if (++st->draw_count > 3) st->draw_count = 0;
+
+ if (st->transparent)
+ st->draw_transparent(st, dest);
+ else
+ draw_ripple(st, dest);
+}
+
+
+/* ------------------------------------------- */
+
+static void *
+ripples_init (Display *disp, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = disp;
+ st->window = win;
+ st->iterations = 0;
+ st->delay = get_integer_resource(disp, "delay", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ st->rate = get_integer_resource(disp, "rate", "Integer");
+ st->box = get_integer_resource(disp, "box", "Integer");
+ st->oily = get_boolean_resource(disp, "oily", "Boolean");
+ st->stir = get_boolean_resource(disp, "stir", "Boolean");
+ st->fluidity = get_integer_resource(disp, "fluidity", "Integer");
+ st->transparent = get_boolean_resource(disp, "water", "Boolean");
+ st->grayscale_p = get_boolean_resource(disp, "grayscale", "Boolean");
+ st->light = get_integer_resource(disp, "light", "Integer");
+
+ if (st->delay < 0) st->delay = 0;
+ if (st->duration < 1) st->duration = 1;
+ if (st->fluidity <= 1) st->fluidity = 1;
+ if (st->fluidity > 16) st->fluidity = 16; /* 16 = sizeof(short) */
+ if (st->light < 0) st->light = 0;
+
+ init_cos_tab(st);
+ setup_X(st);
+
+ st->ncolors = get_integer_resource (disp, "colors", "Colors");
+ if (0 == st->ncolors) /* English spelling? */
+ st->ncolors = get_integer_resource (disp, "colours", "Colors");
+
+ if (st->ncolors > sizeof(st->ctab)/sizeof(*st->ctab))
+ st->ncolors = sizeof(st->ctab)/sizeof(*st->ctab);
+
+ if (st->oily)
+ init_oily_colors(st);
+ else
+ init_linear_colors(st);
+
+ if (st->transparent && st->light > 0) {
+ int maxbits;
+ st->draw_transparent = draw_transparent_light;
+ visual_rgb_masks (st->screen, st->visual,
+ &st->rmask, &st->gmask, &st->bmask);
+ set_mask(&st->rmask, &st->rshift);
+ set_mask(&st->gmask, &st->gshift);
+ set_mask(&st->bmask, &st->bshift);
+ if (st->rmask == 0) st->draw_transparent = draw_transparent_vanilla;
+
+ /* Adjust the shift value "light" when we don't have 8 bits per colour */
+ maxbits = MIN(MIN(BITCOUNT(st->rmask), BITCOUNT(st->gmask)), BITCOUNT(st->bmask));
+ st->light -= 8-maxbits;
+ if (st->light < 0) st->light = 0;
+ } else {
+ if (st->grayscale_p)
+ {
+ visual_rgb_masks (st->screen, st->visual,
+ &st->rmask, &st->gmask, &st->bmask);
+ set_mask(&st->rmask, &st->rshift);
+ set_mask(&st->gmask, &st->gshift);
+ set_mask(&st->bmask, &st->bshift);
+ }
+ st->draw_transparent = draw_transparent_vanilla;
+ }
+
+ if (!st->transparent)
+ init_ripples(st, 0, -SPLASH); /* Start off without any drops */
+
+ return st;
+}
+
+static unsigned long
+ripples_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+ XWindowAttributes xgwa;
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->start_time = time ((time_t *) 0);
+ st->orig_map = XGetImage (st->dpy, st->window, 0, 0,
+ xgwa.width, xgwa.height,
+ ~0L, ZPixmap);
+ init_ripples(st, 0, -SPLASH); /* Start off without any drops */
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ return st->delay;
+ }
+
+ if (st->rate > 0 && (st->iterations % st->rate) == 0)
+ add_drop(st, ripple_blob, -SPLASH);
+ if (st->stir)
+ add_drop(st, ripple_stir, -SPLASH);
+ if (st->box > 0 && (random() % st->box) == 0)
+ add_drop(st, ripple_box, -SPLASH);
+
+ ripple(st);
+ DisplayImage(st);
+
+ st->iterations++;
+
+ return st->delay;
+}
+
+
+static void
+ripples_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+ripples_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+ripples_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+static const char *ripples_defaults[] =
+{
+ ".background: black",
+ ".foreground: #FFAF5F",
+ "*colors: 200",
+ "*dontClearRoot: True",
+ "*delay: 50000",
+ "*duration: 120",
+ "*rate: 5",
+ "*box: 0",
+ "*water: True",
+ "*oily: False",
+ "*stir: False",
+ "*fluidity: 6",
+ "*light: 4",
+ "*grayscale: False",
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#else
+ "*useSHM: False",
+#endif
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec ripples_options[] =
+{
+ { "-colors", ".colors", XrmoptionSepArg, 0},
+ { "-colours", ".colors", XrmoptionSepArg, 0},
+ {"-delay", ".delay", XrmoptionSepArg, 0},
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
+ {"-rate", ".rate", XrmoptionSepArg, 0},
+ {"-box", ".box", XrmoptionSepArg, 0},
+ {"-water", ".water", XrmoptionNoArg, "True"},
+ {"-oily", ".oily", XrmoptionNoArg, "True"},
+ {"-stir", ".stir", XrmoptionNoArg, "True"},
+ {"-fluidity", ".fluidity", XrmoptionSepArg, 0},
+ {"-light", ".light", XrmoptionSepArg, 0},
+ {"-grayscale", ".grayscale", XrmoptionNoArg, "True"},
+ {"-shm", ".useSHM", XrmoptionNoArg, "True"},
+ {"-no-shm", ".useSHM", XrmoptionNoArg, "False"},
+ {0, 0, 0, 0}
+};
+
+
+XSCREENSAVER_MODULE ("Ripples", ripples)
diff --git a/hacks/ripples.man b/hacks/ripples.man
new file mode 100644
index 0000000..f016683
--- /dev/null
+++ b/hacks/ripples.man
@@ -0,0 +1,96 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ripples - interference patterns.
+.SH SYNOPSIS
+.B ripples
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-duration \fIsecs\fP]
+[\-rate \fInumber\fP]
+[\-fluidity \fInumber\fP]
+[\-light \fInumber\fP]
+[\-water]
+[\-stir]
+[\-oily]
+[\-grayscale]
+[\-colors \fInumber\fP]
+[\-no-shm]
+[\-fps]
+.SH DESCRIPTION
+This draws rippling interference patterns like splashing water. With the
+-water option, it manipulates your desktop image to look like something is
+dripping into it.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 50000 (0.05 seconds.).
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-rate \fInumber\fP
+Drizzle. 1 - 100. Default: 5.
+.TP 8
+.B \-fluidity \fInumber\fP
+Small Drops. 0 - 16. Default: 6.
+.TP 8
+.B \-light \fInumber\fP
+Lighting Effect. 0 - 8. Default: 0.
+.TP 8
+.B \-water | \-no-water
+Grab Screen Image. Boolean.
+.TP 8
+.B \-stir | \-no-stir
+Moving Splashes. Boolean.
+.TP 8
+.B \-oily | \-no-oily
+Psychedelic Colors. Boolean.
+.TP 8
+.B \-grayscale
+Convert the screen image to grayscale.
+Ignored if we don't grab the screen image or if our screen doesn't have
+enough color depth.
+.TP 8
+.B \-colors \fInumber\fP
+Colors Two. Default: 200.
+.TP 8
+.B \-shm | \-no-shm
+Use Shared Memory. Boolean.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tom Hammersley. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tom Hammersley.
diff --git a/hacks/rocks.c b/hacks/rocks.c
new file mode 100644
index 0000000..5a976df
--- /dev/null
+++ b/hacks/rocks.c
@@ -0,0 +1,550 @@
+/* xscreensaver, Copyright (c) 1992-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* 18-Sep-97: Johannes Keukelaar <johannes@nada.kth.se>: Added some color.
+ * Using -mono gives the old behaviour. (Modified by jwz.)
+ */
+/* Flying through an asteroid field. Based on TI Explorer Lisp code by
+ John Nguyen <johnn@hx.lcs.mit.edu>
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "screenhack.h"
+
+#define MIN_ROCKS 1
+#define MIN_DEPTH 2 /* rocks disappear when they get this close */
+#define MAX_DEPTH 60 /* this is where rocks appear */
+#define MIN_SIZE 3 /* how small where pixmaps are not used */
+#define MAX_SIZE 200 /* how big (in pixels) rocks are at depth 1 */
+#define DEPTH_SCALE 100 /* how many ticks there are between depths */
+#define SIN_RESOLUTION 1000
+
+#define MAX_DEP 0.3 /* how far the displacement can be (percent) */
+#define DIRECTION_CHANGE_RATE 60
+#define MAX_DEP_SPEED 5 /* Maximum speed for movement */
+#define MOVE_STYLE 0 /* Only 0 and 1. Distinguishes the fact that
+ these are the rocks that are moving (1)
+ or the rocks source (0). */
+
+/* there's not much point in the above being user-customizable, but those
+ numbers might want to be tweaked for displays with an order of magnitude
+ higher resolution or compute power.
+ */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ double sins [SIN_RESOLUTION];
+ double coss [SIN_RESOLUTION];
+ double depths [(MAX_DEPTH + 1) * DEPTH_SCALE];
+
+ int width, height, midx, midy;
+ int dep_x, dep_y;
+ int ncolors;
+ XColor *colors;
+ float max_dep;
+ GC erase_gc;
+ GC *draw_gcs;
+ Bool rotate_p;
+ Bool move_p;
+ int speed;
+ Bool threed;
+ GC threed_left_gc, threed_right_gc;
+ double threed_delta;
+
+ struct rock *rocks;
+ int nrocks;
+ Pixmap pixmaps [MAX_SIZE];
+ int delay;
+
+ int move_current_dep[2];
+ int move_speed[2];
+ short move_direction[2];
+ int move_limit[2];
+
+ int current_delta; /* observer Z rotation */
+ int new_delta;
+ int dchange_tick;
+};
+
+
+
+#define GETZDIFF(z) \
+ (st->threed_delta * 40.0 * \
+ (1.0 - ((MAX_DEPTH * DEPTH_SCALE / 2) / \
+ ((z) + 20.0 * DEPTH_SCALE))))
+
+struct rock {
+ int real_size;
+ int r;
+ int theta;
+ int depth;
+ int size, x, y;
+ int diff;
+ int color;
+};
+
+static void rock_compute (struct state *, struct rock *);
+static void rock_draw (struct state *, struct rock *, Bool draw_p);
+
+static void
+rock_reset (struct state *st, struct rock *rock)
+{
+ rock->real_size = MAX_SIZE;
+ rock->r = (SIN_RESOLUTION * 0.7) + (random () % (30 * SIN_RESOLUTION));
+ rock->theta = random () % SIN_RESOLUTION;
+ rock->depth = MAX_DEPTH * DEPTH_SCALE;
+ rock->color = random() % st->ncolors;
+ rock_compute (st, rock);
+ rock_draw (st, rock, True);
+}
+
+static void
+rock_tick (struct state *st, struct rock *rock, int d)
+{
+ if (rock->depth > 0)
+ {
+ rock_draw (st, rock, False);
+ rock->depth -= st->speed;
+ if (st->rotate_p)
+ {
+ rock->theta = (rock->theta + d) % SIN_RESOLUTION;
+ }
+ while (rock->theta < 0)
+ rock->theta += SIN_RESOLUTION;
+ if (rock->depth < (MIN_DEPTH * DEPTH_SCALE))
+ rock->depth = 0;
+ else
+ {
+ rock_compute (st, rock);
+ rock_draw (st, rock, True);
+ }
+ }
+ else if ((random () % 40) == 0)
+ rock_reset (st, rock);
+}
+
+static void
+rock_compute (struct state *st, struct rock *rock)
+{
+ double factor = st->depths [rock->depth];
+ double rsize = rock->real_size * factor;
+
+ rock->size = (int) (rsize + 0.5);
+ rock->diff = (int) GETZDIFF(rock->depth);
+ rock->x = st->midx + (st->coss [rock->theta] * rock->r * factor);
+ rock->y = st->midy + (st->sins [rock->theta] * rock->r * factor);
+
+ if (st->move_p)
+ {
+ double move_factor = (((double) MOVE_STYLE) -
+ (((double) rock->depth) /
+ (((double) (MAX_DEPTH + 1)) *
+ ((double) DEPTH_SCALE))));
+ /* move_factor is 0 when the rock is close, 1 when far */
+ rock->x += (((double) st->dep_x) * move_factor);
+ rock->y += (((double) st->dep_y) * move_factor);
+ }
+}
+
+static void
+rock_draw (struct state *st, struct rock *rock, Bool draw_p)
+{
+ GC gc = (draw_p
+ ? (st->threed ? st->erase_gc : st->draw_gcs[rock->color])
+ : st->erase_gc);
+
+ if (rock->x <= 0 || rock->y <= 0 || rock->x >= st->width || rock->y >= st->height)
+ {
+ /* this means that if a rock were to go off the screen at 12:00, but
+ would have been visible at 3:00, it won't come back once the observer
+ rotates around so that the rock would have been visible again.
+ Oh well.
+ */
+ if (!st->move_p)
+ rock->depth = 0;
+ return;
+ }
+ if (rock->size <= 1)
+ {
+ if (st->threed)
+ {
+ if (draw_p) gc = st->threed_left_gc;
+ XDrawPoint (st->dpy, st->window, gc, rock->x - rock->diff, rock->y);
+ if (draw_p) gc = st->threed_right_gc;
+ XDrawPoint (st->dpy, st->window, gc, rock->x + rock->diff, rock->y);
+ }
+ else
+ {
+ XDrawPoint (st->dpy, st->window, gc, rock->x, rock->y);
+ }
+ }
+ else if (rock->size <= MIN_SIZE || !draw_p)
+ {
+ if (st->threed)
+ {
+ if (draw_p) gc = st->threed_left_gc;
+ XFillRectangle(st->dpy, st->window, gc,
+ rock->x - rock->size / 2 - rock->diff,
+ rock->y - rock->size / 2,
+ rock->size, rock->size);
+ if (draw_p) gc = st->threed_right_gc;
+ XFillRectangle(st->dpy, st->window, gc,
+ rock->x - rock->size / 2 + rock->diff,
+ rock->y - rock->size / 2,
+ rock->size, rock->size);
+ }
+ else
+ {
+ XFillRectangle (st->dpy, st->window, gc,
+ rock->x - rock->size/2, rock->y - rock->size/2,
+ rock->size, rock->size);
+ }
+ }
+ else if (rock->size < MAX_SIZE)
+ {
+ if (st->threed)
+ {
+ gc = st->threed_left_gc;
+ XCopyPlane(st->dpy, st->pixmaps[rock->size], st->window, gc,
+ 0, 0, rock->size, rock->size,
+ rock->x - rock->size / 2 - rock->diff,
+ rock->y - rock->size / 2, 1L);
+ gc = st->threed_right_gc;
+ XCopyPlane(st->dpy, st->pixmaps[rock->size], st->window, gc,
+ 0, 0, rock->size, rock->size,
+ rock->x - rock->size / 2 + rock->diff,
+ rock->y - rock->size / 2, 1L);
+ }
+ else
+ {
+ XCopyPlane (st->dpy, st->pixmaps [rock->size], st->window, gc,
+ 0, 0, rock->size, rock->size,
+ rock->x - rock->size/2, rock->y - rock->size/2,
+ 1L);
+ }
+ }
+}
+
+
+static void
+init_pixmaps (struct state *st)
+{
+ int i;
+ XGCValues gcv;
+ GC fg_gc = 0, bg_gc = 0;
+ st->pixmaps [0] = st->pixmaps [1] = 0;
+ for (i = MIN_DEPTH; i < MAX_SIZE; i++)
+ {
+ int w = (1+(i/32))<<5; /* server might be faster if word-aligned */
+ int h = i;
+ Pixmap p = XCreatePixmap (st->dpy, st->window, w, h, 1);
+ XPoint points [7];
+ st->pixmaps [i] = p;
+ if (! p)
+ {
+ fprintf (stderr, "%s: couldn't allocate pixmaps", progname);
+ exit (1);
+ }
+ if (! fg_gc)
+ { /* must use drawable of pixmap, not window (fmh) */
+ gcv.foreground = 1;
+ fg_gc = XCreateGC (st->dpy, p, GCForeground, &gcv);
+ gcv.foreground = 0;
+ bg_gc = XCreateGC (st->dpy, p, GCForeground, &gcv);
+ }
+ XFillRectangle (st->dpy, p, bg_gc, 0, 0, w, h);
+ points [0].x = i * 0.15; points [0].y = i * 0.85;
+ points [1].x = i * 0.00; points [1].y = i * 0.20;
+ points [2].x = i * 0.30; points [2].y = i * 0.00;
+ points [3].x = i * 0.40; points [3].y = i * 0.10;
+ points [4].x = i * 0.90; points [4].y = i * 0.10;
+ points [5].x = i * 1.00; points [5].y = i * 0.55;
+ points [6].x = i * 0.45; points [6].y = i * 1.00;
+ XFillPolygon (st->dpy, p, fg_gc, points, 7, Nonconvex, CoordModeOrigin);
+ }
+ XFreeGC (st->dpy, fg_gc);
+ XFreeGC (st->dpy, bg_gc);
+}
+
+
+static int
+compute_move(struct state *st, int axe) /* 0 for x, 1 for y */
+{
+ int change = 0;
+
+ st->move_limit[0] = st->midx;
+ st->move_limit[1] = st->midy;
+
+ st->move_current_dep[axe] += st->move_speed[axe]; /* We adjust the displacement */
+
+ if (st->move_current_dep[axe] > (int) (st->move_limit[axe] * st->max_dep))
+ {
+ if (st->move_current_dep[axe] > st->move_limit[axe])
+ st->move_current_dep[axe] = st->move_limit[axe];
+ st->move_direction[axe] = -1;
+ } /* This is when we reach the upper screen limit */
+ if (st->move_current_dep[axe] < (int) (-st->move_limit[axe] * st->max_dep))
+ {
+ if (st->move_current_dep[axe] < -st->move_limit[axe])
+ st->move_current_dep[axe] = -st->move_limit[axe];
+ st->move_direction[axe] = 1;
+ } /* This is when we reach the lower screen limit */
+ if (st->move_direction[axe] == 1) /* We adjust the speed */
+ st->move_speed[axe] += 1;
+ else if (st->move_direction[axe] == -1)
+ st->move_speed[axe] -= 1;
+
+ if (st->move_speed[axe] > MAX_DEP_SPEED)
+ st->move_speed[axe] = MAX_DEP_SPEED;
+ else if (st->move_speed[axe] < -MAX_DEP_SPEED)
+ st->move_speed[axe] = -MAX_DEP_SPEED;
+
+ if (st->move_p && !(random() % DIRECTION_CHANGE_RATE))
+ {
+ /* We change direction */
+ change = random() & 1;
+ if (change != 1)
+ {
+ if (st->move_direction[axe] == 0)
+ st->move_direction[axe] = change - 1; /* 0 becomes either 1 or -1 */
+ else
+ st->move_direction[axe] = 0; /* -1 or 1 become 0 */
+ }
+ }
+ return (st->move_current_dep[axe]);
+}
+
+static void
+tick_rocks (struct state *st, int d)
+{
+ int i;
+
+ if (st->move_p)
+ {
+ st->dep_x = compute_move(st, 0);
+ st->dep_y = compute_move(st, 1);
+ }
+
+ for (i = 0; i < st->nrocks; i++)
+ rock_tick (st, &st->rocks [i], d);
+}
+
+
+static unsigned long
+rocks_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->current_delta != st->new_delta)
+ {
+ if (st->dchange_tick++ == 5)
+ {
+ st->dchange_tick = 0;
+ if (st->current_delta < st->new_delta)
+ st->current_delta++;
+ else
+ st->current_delta--;
+ }
+ }
+ else
+ {
+ if (! (random() % 50))
+ {
+ st->new_delta = ((random() % 11) - 5);
+ if (! (random() % 10))
+ st->new_delta *= 5;
+ }
+ }
+ tick_rocks (st, st->current_delta);
+
+ return st->delay;
+}
+
+static void *
+rocks_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ XGCValues gcv;
+ Colormap cmap;
+ XWindowAttributes xgwa;
+ unsigned int bg;
+ st->dpy = d;
+ st->window = w;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ st->midx = st->width/2;
+ st->midy = st->height/2;
+
+ cmap = xgwa.colormap;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+ st->speed = get_integer_resource (st->dpy, "speed", "Integer");
+ if (st->speed < 1) st->speed = 1;
+ if (st->speed > 100) st->speed = 100;
+ st->rotate_p = get_boolean_resource (st->dpy, "rotate", "Boolean");
+ st->move_p = get_boolean_resource (st->dpy, "move", "Boolean");
+ if (mono_p)
+ st->ncolors = 2;
+ else
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+
+ if (st->ncolors < 2)
+ {
+ st->ncolors = 2;
+ mono_p = True;
+ }
+
+ st->colors = (XColor *) malloc(st->ncolors * sizeof(*st->colors));
+ st->draw_gcs = (GC *) malloc(st->ncolors * sizeof(*st->draw_gcs));
+
+ bg = get_pixel_resource (st->dpy, cmap, "background", "Background");
+ st->colors[0].pixel = bg;
+ st->colors[0].flags = DoRed|DoGreen|DoBlue;
+ XQueryColor(st->dpy, cmap, &st->colors[0]);
+
+ st->ncolors--;
+ make_random_colormap(xgwa.screen, xgwa.visual, cmap,
+ st->colors+1, &st->ncolors, True,
+ True, 0, True);
+ st->ncolors++;
+
+ if (st->ncolors < 2)
+ {
+ st->ncolors = 2;
+ mono_p = True;
+ }
+
+ if (mono_p)
+ {
+ unsigned int fg = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
+ st->colors[1].pixel = fg;
+ st->colors[1].flags = DoRed|DoGreen|DoBlue;
+ XQueryColor(st->dpy, cmap, &st->colors[1]);
+ gcv.foreground = fg;
+ gcv.background = bg;
+ st->draw_gcs[0] = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+ st->draw_gcs[1] = st->draw_gcs[0];
+ }
+ else
+ for( i = 0; i < st->ncolors; i++ )
+ {
+ gcv.foreground = st->colors[i].pixel;
+ gcv.background = bg;
+ st->draw_gcs[i] = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+ }
+
+ gcv.foreground = bg;
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+
+ st->max_dep = (st->move_p ? MAX_DEP : 0);
+
+ for (i = 0; i < SIN_RESOLUTION; i++)
+ {
+ st->sins [i] = sin ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI);
+ st->coss [i] = cos ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI);
+ }
+ /* we actually only need i/speed of these, but wtf */
+ for (i = 1; i < (sizeof (st->depths) / sizeof (st->depths[0])); i++)
+ st->depths [i] = atan (((double) 0.5) / (((double) i) / DEPTH_SCALE));
+ st->depths [0] = M_PI/2; /* avoid division by 0 */
+
+ st->threed = get_boolean_resource(st->dpy, "use3d", "Boolean");
+ if (st->threed)
+ {
+ gcv.background = bg;
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "left3d", "Foreground");
+ st->threed_left_gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground,&gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "right3d", "Foreground");
+ st->threed_right_gc = XCreateGC (st->dpy, st->window,GCForeground|GCBackground,&gcv);
+ st->threed_delta = get_float_resource(st->dpy, "delta3d", "Integer");
+ }
+
+ /* don't want any exposure events from XCopyPlane */
+ for( i = 0; i < st->ncolors; i++)
+ XSetGraphicsExposures (st->dpy, st->draw_gcs[i], False);
+ XSetGraphicsExposures (st->dpy, st->erase_gc, False);
+
+ st->nrocks = get_integer_resource (st->dpy, "count", "Count");
+ if (st->nrocks < 1) st->nrocks = 1;
+ st->rocks = (struct rock *) calloc (st->nrocks, sizeof (struct rock));
+ init_pixmaps (st);
+ XClearWindow (st->dpy, st->window);
+ return st;
+}
+
+static void
+rocks_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+ st->midx = st->width/2;
+ st->midy = st->height/2;
+}
+
+static Bool
+rocks_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+rocks_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+
+static const char *rocks_defaults [] = {
+ ".lowrez: true",
+ ".background: Black",
+ ".foreground: #E9967A",
+ "*fpsSolid: true",
+ "*colors: 5",
+ "*count: 100",
+ "*delay: 50000",
+ "*speed: 100",
+ "*rotate: true",
+ "*move: true",
+ "*use3d: False",
+ "*left3d: Blue",
+ "*right3d: Red",
+ "*delta3d: 1.5",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec rocks_options [] = {
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-rotate", ".rotate", XrmoptionNoArg, "true" },
+ { "-no-rotate", ".rotate", XrmoptionNoArg, "false" },
+ { "-move", ".move", XrmoptionNoArg, "true" },
+ { "-no-move", ".move", XrmoptionNoArg, "false" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ {"-3d", ".use3d", XrmoptionNoArg, "True"},
+ {"-no-3d", ".use3d", XrmoptionNoArg, "False"},
+ {"-left3d", ".left3d", XrmoptionSepArg, 0 },
+ {"-right3d", ".right3d", XrmoptionSepArg, 0 },
+ {"-delta3d", ".delta3d", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Rocks", rocks)
diff --git a/hacks/rocks.man b/hacks/rocks.man
new file mode 100644
index 0000000..b5751d9
--- /dev/null
+++ b/hacks/rocks.man
@@ -0,0 +1,90 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+rocks - animation of flying through an asteroid field
+.SH SYNOPSIS
+.B rocks
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-ncolors \fIn\fP] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-delay \fIusecs\fP] [\-speed \fIinteger\fP] [\-norotate] [\-nomove] [\-3d]
+[\-fps]
+.SH DESCRIPTION
+The \fIrocks\fP program draws an animation of an asteroid field moving past
+the observer (or vice versa). Sometimes the observer picks up spin on Z axis.
+.SH OPTIONS
+.I rocks
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+Make all the rocks the same color.
+.TP 8
+.B \-ncolors colors
+How many different colors to use. Default 5. Colors are chosen randomly.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+Maximum number of rocks to draw on the screen at once. Default 100.
+.TP 8
+.B \-speed \fIinteger\fP
+A measure of the speed with which the observer and the rocks pass each other,
+from 1 to 100. Default 100, meaning ``very fast.'' If you're on a slow
+display connection (the animation looks jerky) then try making this number
+smaller, and/or decreasing the number of rocks.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Number of microseconds to delay between each frame. Default 50000, meaning
+about 1/20th second. Compare and contrast with \fI\-speed\fP, above.
+.TP 8
+.B \-norotate
+Don't rotate the observer; just fly through the field on the level.
+.TP 8
+.B \-nomove
+Don't turn the observer; just fly straight ahead through the field.
+.TP 8
+.B \-3d
+Do red/blue 3d separations: if you look at the screen with 3d glasses,
+the rocks will be \fIjumping\fP right \fIout\fP at you. Oooooh, scaaary!
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH BUGS
+There should be an option to display doppler shift (a gravity rainbow.)
+
+Speed of rotation should be settable.
+
+Default speed of rotation should be relative to forward velocity.
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Based on Lisp Machine code copyright 1988 John Nguyen <johnn@hx.lcs.mit.edu>.
+
+Ported to C and X by Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Steering code by Jeremie Petit; 3D code by theiling@coli.uni-sb.de.
diff --git a/hacks/rorschach.c b/hacks/rorschach.c
new file mode 100644
index 0000000..6b2d7a3
--- /dev/null
+++ b/hacks/rorschach.c
@@ -0,0 +1,214 @@
+/* xscreensaver, Copyright (c) 1992-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * 19971004: Johannes Keukelaar <johannes@nada.kth.se>: Use helix screen
+ * eraser.
+ */
+
+#include "screenhack.h"
+#include "erase.h"
+
+struct state {
+ GC draw_gc;
+ unsigned int default_fg_pixel;
+ int iterations, offset;
+ Bool xsym, ysym;
+ int sleep_time;
+ int xlim, ylim;
+ XColor color;
+ int current_x, current_y, remaining_iterations;
+ eraser_state *eraser;
+};
+
+
+static void *
+rorschach_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ Colormap cmap;
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ cmap = xgwa.colormap;
+ gcv.foreground = st->default_fg_pixel =
+ get_pixel_resource (dpy, cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (dpy, cmap, "background", "Background");
+ st->iterations = get_integer_resource (dpy, "iterations", "Integer");
+ st->offset = get_integer_resource (dpy, "offset", "Integer");
+ if (st->offset <= 0) st->offset = 3;
+ if (st->iterations < 10) st->iterations = 10;
+ st->sleep_time = get_integer_resource (dpy, "delay", "Delay");
+ st->xsym = get_boolean_resource (dpy, "xsymmetry", "Symmetry");
+ st->ysym = get_boolean_resource (dpy, "ysymmetry", "Symmetry");
+ st->remaining_iterations = -1;
+ st->color.pixel = 0;
+ return st;
+}
+
+static void
+rorschach_reshape (Display *dpy, Window window, void *closure,
+ unsigned int width, unsigned int height)
+{
+ struct state *st = (struct state *) closure;
+ st->xlim = width;
+ st->ylim = height;
+}
+
+
+static void
+rorschach_draw_start (Display *dpy, Window window, struct state *st)
+{
+ Colormap cmap;
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ st->xlim = xgwa.width;
+ st->ylim = xgwa.height;
+ cmap = xgwa.colormap;
+
+ if (st->color.pixel) XFreeColors (dpy, cmap, &st->color.pixel, 1, 0);
+
+ if (! mono_p)
+ hsv_to_rgb (random()%360, 1.0, 1.0, &st->color.red, &st->color.green, &st->color.blue);
+ if ((!mono_p) && XAllocColor (dpy, cmap, &st->color))
+ XSetForeground (dpy, st->draw_gc, st->color.pixel);
+ else
+ XSetForeground (dpy, st->draw_gc, st->default_fg_pixel);
+
+ st->current_x = st->xlim/2;
+ st->current_y = st->ylim/2;
+ st->remaining_iterations = st->iterations;
+}
+
+
+static void
+rorschach_draw_step (Display *dpy, Window window, struct state *st)
+{
+# define ITER_CHUNK 300
+ XPoint points [4 * ITER_CHUNK];
+ int x = st->current_x;
+ int y = st->current_y;
+ int i, j = 0;
+
+ int this_iterations = ITER_CHUNK;
+ if (this_iterations > st->remaining_iterations)
+ this_iterations = st->remaining_iterations;
+
+ for (i = 0; i < this_iterations; i++)
+ {
+ x += ((random () % (1 + (st->offset << 1))) - st->offset);
+ y += ((random () % (1 + (st->offset << 1))) - st->offset);
+ points [j].x = x;
+ points [j].y = y;
+ j++;
+ if (st->xsym)
+ {
+ points [j].x = st->xlim - x;
+ points [j].y = y;
+ j++;
+ }
+ if (st->ysym)
+ {
+ points [j].x = x;
+ points [j].y = st->ylim - y;
+ j++;
+ }
+ if (st->xsym && st->ysym)
+ {
+ points [j].x = st->xlim - x;
+ points [j].y = st->ylim - y;
+ j++;
+ }
+ }
+ XDrawPoints (dpy, window, st->draw_gc, points, j, CoordModeOrigin);
+ st->remaining_iterations -= this_iterations;
+ if (st->remaining_iterations < 0) st->remaining_iterations = 0;
+ st->current_x = x;
+ st->current_y = y;
+}
+
+
+static unsigned long
+rorschach_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ unsigned long delay = 20000;
+
+ if (st->eraser) {
+ st->eraser = erase_window (dpy, window, st->eraser);
+ goto END;
+ }
+
+ if (st->remaining_iterations > 0)
+ {
+ rorschach_draw_step (dpy, window, st);
+ if (st->remaining_iterations == 0)
+ delay = st->sleep_time * 1000000;
+ }
+ else
+ {
+ if (st->remaining_iterations == 0)
+ st->eraser = erase_window (dpy, window, st->eraser);
+
+ rorschach_draw_start (dpy, window, st);
+ }
+ END:
+ return delay;
+}
+
+
+static Bool
+rorschach_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->remaining_iterations = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+rorschach_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *rorschach_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*xsymmetry: true",
+ "*ysymmetry: false",
+ "*iterations: 4000",
+ "*offset: 7",
+ "*delay: 5",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec rorschach_options [] = {
+ { "-iterations", ".iterations", XrmoptionSepArg, 0 },
+ { "-offset", ".offset", XrmoptionSepArg, 0 },
+ { "-xsymmetry", ".xsymmetry", XrmoptionNoArg, "true" },
+ { "-ysymmetry", ".ysymmetry", XrmoptionNoArg, "true" },
+ { "-no-xsymmetry", ".xsymmetry", XrmoptionNoArg, "false" },
+ { "-no-ysymmetry", ".ysymmetry", XrmoptionNoArg, "false" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Rorschach", rorschach)
diff --git a/hacks/rorschach.man b/hacks/rorschach.man
new file mode 100644
index 0000000..5a28cf6
--- /dev/null
+++ b/hacks/rorschach.man
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+rorschach - simulate ink-blot patterns
+.SH SYNOPSIS
+.B rorschach
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-iterations \fIinteger\fP] [\-offset \fIinteger\fP] [\-xsymmetry] [\-ysymmetry] [\-erase\-speed \fIusecs\fP] [\-delay \fIsecs\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIrorschach\fP program draws random patterns reminiscent of the
+psychological test of same name.
+.SH OPTIONS
+.I rorschach
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-iterations \fIinteger\fP
+How many dots should be drawn each time. Default 4000.
+.TP 8
+.B \-offset \fIinteger\fP
+How far apart the dots should be. Default 4 pixels.
+.TP 8
+.B \-xsymmetry
+Whether the images should be horizontally symmetrical. Default true.
+.TP 8
+.B \-ysymmetry
+Whether the images should be vertically symmetrical. Default false.
+.TP 8
+.B \-erase\-speed \fIusecs\fP
+This controls the speed at which the screen will be erased. (Delay between
+erasing of individual lines.)
+.TP 8
+.B \-delay \fIseconds\fP
+This sets the number of seconds that the figure will be on the screen.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+May call your sanity into question.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/rotor.c b/hacks/rotor.c
new file mode 100644
index 0000000..c22479b
--- /dev/null
+++ b/hacks/rotor.c
@@ -0,0 +1,389 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* rotor --- a swirly rotor */
+
+#if 0
+static const char sccsid[] = "@(#)rotor.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 08-Mar-1995: CAT stuff for ## was tripping up some C compilers. Removed.
+ * 01-Dec-1993: added patch for AIXV3 from Tom McConnell
+ * <tmcconne@sedona.intel.com>
+ * 11-Nov-1990: put into xlock by Steve Zellers <zellers@sun.com>
+ * 16-Oct-1990: Received from Tom Lawrence (tcl@cs.brown.edu: 'flight'
+ * simulator)
+ */
+
+#ifdef STANDALONE
+#define MODE_rotor
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 4 \n" \
+ "*cycles: 20 \n" \
+ "*size: -6 \n" \
+ "*ncolors: 200 \n" \
+ "*fpsSolid: true \n" \
+ "*lowrez: True \n" \
+
+# define SMOOTH_COLORS
+# define release_rotor 0
+# define reshape_rotor 0
+# define rotor_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_rotor
+
+ENTRYPOINT ModeSpecOpt rotor_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct rotor_description =
+{"rotor", "init_rotor", "draw_rotor", (char *) NULL,
+ "refresh_rotor", "init_rotor", "free_rotor", &rotor_opts,
+ 100, 4, 100, -6, 64, 0.3, "",
+ "Shows Tom's Roto-Rooter", 0, NULL};
+
+#endif
+
+/*-
+ * A 'batchcount' of 3 or 4 works best!
+ */
+
+#define MAXANGLE 3000.0 /* irrectangular (was 10000.0) */
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+typedef struct {
+ float angle;
+ float radius;
+ float start_radius;
+ float end_radius;
+ float radius_drift_max;
+ float radius_drift_now;
+
+ float ratio;
+ float start_ratio;
+ float end_ratio;
+ float ratio_drift_max;
+ float ratio_drift_now;
+} elem;
+
+typedef struct {
+ int pix;
+ int lastx, lasty;
+ int num, rotor, prev;
+ int nsave;
+ float angle;
+ int centerx, centery;
+ int prevcenterx, prevcentery;
+ unsigned char firsttime;
+ unsigned char iconifiedscreen; /* for iconified view */
+ unsigned char forward;
+ unsigned char unused;
+ elem *elements;
+ XPoint *save;
+ int redrawing, redrawpos;
+ int linewidth;
+} rotorstruct;
+
+static rotorstruct *rotors = (rotorstruct *) NULL;
+
+ENTRYPOINT void
+free_rotor(ModeInfo * mi)
+{
+ rotorstruct *rp = &rotors[MI_SCREEN(mi)];
+ if (rp->elements != NULL) {
+ (void) free((void *) rp->elements);
+ rp->elements = (elem *) NULL;
+ }
+ if (rp->save != NULL) {
+ (void) free((void *) rp->save);
+ rp->save = (XPoint *) NULL;
+ }
+}
+
+ENTRYPOINT void
+init_rotor (ModeInfo * mi)
+{
+ int x;
+ elem *pelem;
+ unsigned char wasiconified;
+ rotorstruct *rp;
+
+ MI_INIT (mi, rotors);
+ rp = &rotors[MI_SCREEN(mi)];
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+#endif
+
+ rp->prevcenterx = rp->centerx;
+ rp->prevcentery = rp->centery;
+
+ rp->centerx = MI_WIDTH(mi) / 2;
+ rp->centery = MI_HEIGHT(mi) / 2;
+
+ rp->redrawing = 0;
+ /*
+ * sometimes, you go into iconified view, only to see a really whizzy pattern
+ * that you would like to look more closely at. Normally, clicking in the
+ * icon reinitializes everything - but I don't, cuz I'm that kind of guy.
+ * HENCE, the wasiconified stuff you see here.
+ */
+
+ wasiconified = rp->iconifiedscreen;
+ rp->iconifiedscreen = MI_IS_ICONIC(mi);
+
+ if (wasiconified && !rp->iconifiedscreen)
+ rp->firsttime = True;
+ else {
+
+ /* This is a fudge is needed since prevcenter may not be set when it comes
+ from the the random mode and return is pressed (and its not the first
+ mode that was running). This assumes that the size of the lock screen
+ window / size of the icon window = 12 */
+ if (!rp->prevcenterx)
+ rp->prevcenterx = rp->centerx * 12;
+ if (!rp->prevcentery)
+ rp->prevcentery = rp->centery * 12;
+
+ rp->num = MI_COUNT(mi);
+ if (rp->num < 0) {
+ rp->num = NRAND(-rp->num) + 1;
+ if (rp->elements != NULL) {
+ (void) free((void *) rp->elements);
+ rp->elements = (elem *) NULL;
+ }
+ }
+ if (rp->elements == NULL)
+ if ((rp->elements = (elem *) calloc(rp->num,
+ sizeof (elem))) == NULL) {
+ free_rotor(mi);
+ return;
+ }
+ rp->nsave = MI_CYCLES(mi);
+ if (rp->nsave <= 1)
+ rp->nsave = 2;
+ if (rp->save == NULL)
+ if ((rp->save = (XPoint *) malloc(rp->nsave *
+ sizeof (XPoint))) == NULL) {
+ free_rotor(mi);
+ return;
+ }
+ for (x = 0; x < rp->nsave; x++) {
+ rp->save[x].x = rp->centerx;
+ rp->save[x].y = rp->centery;
+ }
+
+ pelem = rp->elements;
+
+ for (x = rp->num; --x >= 0; pelem++) {
+ pelem->radius_drift_max = 1.0;
+ pelem->radius_drift_now = 1.0;
+
+ pelem->end_radius = 100.0;
+
+ pelem->ratio_drift_max = 1.0;
+ pelem->ratio_drift_now = 1.0;
+ pelem->end_ratio = 10.0;
+ }
+ if (MI_NPIXELS(mi) > 2)
+ rp->pix = NRAND(MI_NPIXELS(mi));
+
+ rp->rotor = 0;
+ rp->prev = 1;
+ rp->lastx = rp->centerx;
+ rp->lasty = rp->centery;
+ rp->angle = (float) NRAND((long) MAXANGLE) / 3.0;
+ rp->forward = rp->firsttime = True;
+ }
+ rp->linewidth = MI_SIZE(mi);
+
+ if (rp->linewidth == 0)
+ rp->linewidth = 1;
+ if (rp->linewidth < 0)
+ rp->linewidth = NRAND(-rp->linewidth) + 1;
+
+ MI_CLEARWINDOW(mi);
+}
+
+ENTRYPOINT void
+draw_rotor (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ register elem *pelem;
+ int thisx, thisy;
+ int i;
+ int x_1, y_1, x_2, y_2;
+ rotorstruct *rp;
+
+ if (rotors == NULL)
+ return;
+ rp = &rotors[MI_SCREEN(mi)];
+ if (rp->elements == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ if (!rp->iconifiedscreen) {
+ thisx = rp->centerx;
+ thisy = rp->centery;
+ } else {
+ thisx = rp->prevcenterx;
+ thisy = rp->prevcentery;
+ }
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), rp->linewidth,
+ LineSolid, CapButt, JoinMiter);
+ for (i = rp->num, pelem = rp->elements; --i >= 0; pelem++) {
+ if (pelem->radius_drift_max <= pelem->radius_drift_now) {
+ pelem->start_radius = pelem->end_radius;
+ pelem->end_radius = (float) NRAND(40000) / 100.0 - 200.0;
+ pelem->radius_drift_max = (float) NRAND(100000) + 10000.0;
+ pelem->radius_drift_now = 0.0;
+ }
+ if (pelem->ratio_drift_max <= pelem->ratio_drift_now) {
+ pelem->start_ratio = pelem->end_ratio;
+ pelem->end_ratio = (float) NRAND(2000) / 100.0 - 10.0;
+ pelem->ratio_drift_max = (float) NRAND(100000) + 10000.0;
+ pelem->ratio_drift_now = 0.0;
+ }
+ pelem->ratio = pelem->start_ratio +
+ (pelem->end_ratio - pelem->start_ratio) /
+ pelem->ratio_drift_max * pelem->ratio_drift_now;
+ pelem->angle = rp->angle * pelem->ratio;
+ pelem->radius = pelem->start_radius +
+ (pelem->end_radius - pelem->start_radius) /
+ pelem->radius_drift_max * pelem->radius_drift_now;
+
+ thisx += (int) (COSF(pelem->angle) * pelem->radius);
+ thisy += (int) (SINF(pelem->angle) * pelem->radius);
+
+ pelem->ratio_drift_now += 1.0;
+ pelem->radius_drift_now += 1.0;
+ }
+ if (rp->firsttime)
+ rp->firsttime = False;
+ else {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+
+ x_1 = (int) rp->save[rp->rotor].x;
+ y_1 = (int) rp->save[rp->rotor].y;
+ x_2 = (int) rp->save[rp->prev].x;
+ y_2 = (int) rp->save[rp->prev].y;
+
+ if (rp->iconifiedscreen) {
+ x_1 = x_1 * rp->centerx / rp->prevcenterx;
+ x_2 = x_2 * rp->centerx / rp->prevcenterx;
+ y_1 = y_1 * rp->centery / rp->prevcentery;
+ y_2 = y_2 * rp->centery / rp->prevcentery;
+ }
+ XDrawLine(display, MI_WINDOW(mi), gc, x_1, y_1, x_2, y_2);
+
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, gc, MI_PIXEL(mi, rp->pix));
+ if (++rp->pix >= MI_NPIXELS(mi))
+ rp->pix = 0;
+ } else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+
+ x_1 = rp->lastx;
+ y_1 = rp->lasty;
+ x_2 = thisx;
+ y_2 = thisy;
+
+ if (rp->iconifiedscreen) {
+ x_1 = x_1 * rp->centerx / rp->prevcenterx;
+ x_2 = x_2 * rp->centerx / rp->prevcenterx;
+ y_1 = y_1 * rp->centery / rp->prevcentery;
+ y_2 = y_2 * rp->centery / rp->prevcentery;
+ }
+ XDrawLine(display, MI_WINDOW(mi), gc, x_1, y_1, x_2, y_2);
+ }
+ rp->save[rp->rotor].x = rp->lastx = thisx;
+ rp->save[rp->rotor].y = rp->lasty = thisy;
+
+ ++rp->rotor;
+ rp->rotor %= rp->nsave;
+ ++rp->prev;
+ rp->prev %= rp->nsave;
+ if (rp->forward) {
+ rp->angle += 0.01;
+ if (rp->angle >= MAXANGLE) {
+ rp->angle = MAXANGLE;
+ rp->forward = False;
+ }
+ } else {
+ rp->angle -= 0.1;
+ if (rp->angle <= 0) {
+ rp->angle = 0.0;
+ rp->forward = True;
+ }
+ }
+ if (rp->redrawing) {
+ int j;
+
+ for (i = 0; i < REDRAWSTEP; i++) {
+ j = (rp->rotor - rp->redrawpos + rp->nsave) % rp->nsave;
+
+ x_1 = (int) rp->save[j].x;
+ y_1 = (int) rp->save[j].y;
+ x_2 = (int) rp->save[(j - 1 + rp->nsave) % rp->nsave].x;
+ y_2 = (int) rp->save[(j - 1 + rp->nsave) % rp->nsave].y;
+
+ if (rp->iconifiedscreen) {
+ x_1 = x_1 * rp->centerx / rp->prevcenterx;
+ x_2 = x_2 * rp->centerx / rp->prevcenterx;
+ y_1 = y_1 * rp->centery / rp->prevcentery;
+ y_2 = y_2 * rp->centery / rp->prevcentery;
+ }
+ XDrawLine(display, MI_WINDOW(mi), gc, x_1, y_1, x_2, y_2);
+
+ if (++(rp->redrawpos) >= rp->nsave) {
+ rp->redrawing = 0;
+ break;
+ }
+ }
+ }
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 1,
+ LineSolid, CapButt, JoinMiter);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_rotor (ModeInfo * mi)
+{
+ rotorstruct *rp;
+
+ if (rotors == NULL)
+ return;
+ rp = &rotors[MI_SCREEN(mi)];
+
+ MI_CLEARWINDOW(mi);
+ rp->redrawing = 1;
+ rp->redrawpos = 1;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Rotor", rotor)
+
+#endif /* MODE_rotor */
diff --git a/hacks/rotor.man b/hacks/rotor.man
new file mode 100644
index 0000000..58590ed
--- /dev/null
+++ b/hacks/rotor.man
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+rotor - screen saver.
+.SH SYNOPSIS
+.B rotor
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+This draws a line segment moving along a complex spiraling curve.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Count. 0 - 20. Default: 4.
+.TP 8
+.B \-cycles \fInumber\fP
+Length. 2 - 100. Default: 20.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 200.
+.TP 8
+.B \-size \fInumber\fP
+Size. -50 - 50. Default: -6.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tom Lawrence. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tom Lawrence.
diff --git a/hacks/rotzoomer.c b/hacks/rotzoomer.c
new file mode 100644
index 0000000..58f805c
--- /dev/null
+++ b/hacks/rotzoomer.c
@@ -0,0 +1,585 @@
+/* rotzoomer - creates a collage of rotated and scaled portions of the screen
+ * Copyright (C) 2001-2016 Claudio Matsuoka <claudio@helllabs.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Circle-mode by jwz, 2014, 2016. */
+
+/*
+ * Options:
+ *
+ * -shm enable MIT shared memory extension
+ * -no-shm disable MIT shared memory extension
+ * -n <num> number of zoomboxes
+ * -move enable mobile zoomboxes
+ * -sweep enable sweep mode
+ * -circle enable circle mode
+ * -anim enable snapshot mode
+ * -no-anim enable snapshot mode
+ * -delay delay in milliseconds
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "xshm.h"
+
+struct zoom_area {
+ int w, h; /* rectangle width and height */
+ int inc1, inc2; /* rotation and zoom angle increments */
+ int dx, dy; /* translation increments */
+ int a1, a2; /* rotation and zoom angular variables */
+ int ox, oy; /* origin in the background copy */
+ int xx, yy; /* left-upper corner position (* 256) */
+ int x, y; /* left-upper corner position */
+ int ww, hh; /* valid area to place left-upper corner */
+ int n; /* number of iteractions */
+ int count; /* current iteraction */
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC gc;
+ Visual *visual;
+ XImage *orig_map, *buffer_map;
+ Colormap colormap;
+
+ int width, height;
+ struct zoom_area **zoom_box;
+ int num_zoom;
+ int move;
+ int sweep;
+ int circle;
+ int delay;
+ int anim;
+ int duration;
+ time_t start_time;
+
+ async_load_state *img_loader;
+ Pixmap pm;
+
+ XShmSegmentInfo shm_info;
+};
+
+
+static void
+rotzoom (struct state *st, struct zoom_area *za)
+{
+ int x, y, c, s, zoom, z;
+ int x2 = za->x + za->w - 1, y2 = za->y + za->h - 1;
+ int ox = 0, oy = 0;
+ int w2 = (za->w/2) * (za->w/2);
+
+ z = 8100 * sin (M_PI * za->a2 / 8192);
+ zoom = 8192 + z;
+
+ for (y = za->y; y <= y2; y++) {
+ for (x = za->x; x <= x2; x++) {
+ Bool copyp = True;
+ double a = M_PI * za->a1 / 8192;
+ c = zoom * cos (a);
+ s = zoom * sin (a);
+ if (st->circle) {
+ int cx = za->x + za->w / 2;
+ int cy = za->y + za->h / 2;
+ int dx = x - cx;
+ int dy = y - cy;
+ int d2 = (dx*dx) + (dy*dy);
+
+ if (d2 > w2) {
+ copyp = False;
+ } else {
+ double r = sqrt ((double) d2);
+ double th = atan ((double)dy / (double) (dx == 0 ? 1 : dx));
+ copyp = 1;
+ if (dx < 0) th += M_PI;
+ th += M_PI * (za->a1 / 600.0);
+ ox = cx + (int) (r * cos(th));
+ oy = cy + (int) (r * sin(th));
+ }
+ } else {
+ ox = (x * c + y * s) >> 13;
+ oy = (-x * s + y * c) >> 13;
+ }
+
+ if (copyp) {
+ while (ox < 0)
+ ox += st->width;
+ while (oy < 0)
+ oy += st->height;
+ while (ox >= st->width)
+ ox -= st->width;
+ while (oy >= st->height)
+ oy -= st->height;
+
+ XPutPixel (st->buffer_map, x, y, XGetPixel (st->orig_map, ox, oy));
+ }
+ }
+ }
+
+ za->a1 += za->inc1; /* Rotation angle */
+ za->a1 &= 0x3fff;
+
+ za->a2 += za->inc2; /* Zoom */
+ za->a2 &= 0x3fff;
+
+ za->ox = ox; /* Save state for next iteration */
+ za->oy = oy;
+
+ if (st->circle && za->n <= 1)
+ {
+ /* Done rotating the circle: copy the bits from the working set back
+ into the origin, so that subsequent rotations pick up these changes.
+ */
+ int cx = za->x + za->w / 2;
+ int cy = za->y + za->h / 2;
+ int w2 = (za->w/2) * (za->w/2);
+ for (y = za->y; y < za->y + za->h; y++)
+ for (x = za->x; x < za->x + za->w; x++)
+ {
+ int dx = x - cx;
+ int dy = y - cy;
+ int d2 = (dx*dx) + (dy*dy);
+ if (d2 <= w2)
+ XPutPixel (st->orig_map, x, y, XGetPixel (st->buffer_map, x, y));
+ }
+ }
+
+ za->count++;
+}
+
+
+static void
+reset_zoom (struct state *st, struct zoom_area *za)
+{
+ if (st->sweep) {
+ int speed = random () % 100 + 100;
+ switch (random () % 4) {
+ case 0:
+ za->w = st->width;
+ za->h = 10;
+ za->x = 0;
+ za->y = 0;
+ za->dx = 0;
+ za->dy = speed;
+ za->n = (st->height - 10) * 256 / speed;
+ break;
+ case 1:
+ za->w = 10;
+ za->h = st->height;
+ za->x = st->width - 10;
+ za->y = 0;
+ za->dx = -speed;
+ za->dy = 0;
+ za->n = (st->width - 10) * 256 / speed;
+ break;
+ case 2:
+ za->w = st->width;
+ za->h = 10;
+ za->x = 0;
+ za->y = st->height - 10;
+ za->dx = 0;
+ za->dy = -speed;
+ za->n = (st->height - 10) * 256 / speed;
+ break;
+ case 3:
+ za->w = 10;
+ za->h = st->height;
+ za->x = 0;
+ za->y = 0;
+ za->dx = speed;
+ za->dy = 0;
+ za->n = (st->width - 10) * 256 / speed;
+ break;
+ }
+ za->ww = st->width - za->w;
+ za->hh = st->height - za->h;
+
+ /* We want smaller angle increments in sweep mode (looks better) */
+
+ za->a1 = 0;
+ za->a2 = 0;
+ za->inc1 = ((2 * (random() & 1)) - 1) * (1 + random () % 7);
+ za->inc2 = ((2 * (random() & 1)) - 1) * (1 + random () % 7);
+ } else if (st->circle) {
+
+ za->w = 50 + random() % 300;
+ if (za->w > st->width / 3)
+ za->w = st->width / 3;
+ if (za->w > st->height / 3)
+ za->w = st->height / 3;
+ za->h = za->w;
+
+ za->ww = st->width - za->w;
+ za->hh = st->height - za->h;
+
+ za->x = (za->ww ? random() % za->ww : 0);
+ za->y = (za->hh ? random() % za->hh : 0);
+ za->dx = 0;
+ za->dy = 0;
+ za->a1 = 0;
+ za->a2 = 0;
+ za->count = 0;
+
+ /* #### If we go clockwise, it doesn't start rotating from 0.
+ So only go counter-clockwise for now. Sigh. */
+ za->inc1 = (random () % 30);
+ za->inc2 = 0;
+ za->n = 50 + random() % 100;
+
+ if (!st->anim) {
+ za->count = random() % (za->n / 2);
+ za->a1 = random();
+ }
+
+ } else {
+ za->w = 50 + random() % 300;
+ za->h = 50 + random() % 300;
+
+ if (za->w > st->width / 3)
+ za->w = st->width / 3;
+ if (za->h > st->height / 3)
+ za->h = st->height / 3;
+
+ za->ww = st->width - za->w;
+ za->hh = st->height - za->h;
+
+ za->x = (za->ww ? random() % za->ww : 0);
+ za->y = (za->hh ? random() % za->hh : 0);
+
+ za->dx = ((2 * (random() & 1)) - 1) * (100 + random() % 300);
+ za->dy = ((2 * (random() & 1)) - 1) * (100 + random() % 300);
+
+ if (st->anim) {
+ za->n = 50 + random() % 1000;
+ za->a1 = 0;
+ za->a2 = 0;
+ } else {
+ za->n = 5 + random() % 10;
+ za->a1 = random ();
+ za->a2 = random ();
+ }
+
+ za->inc1 = ((2 * (random() & 1)) - 1) * (random () % 30);
+ za->inc2 = ((2 * (random() & 1)) - 1) * (random () % 30);
+ }
+
+ za->xx = za->x * 256;
+ za->yy = za->y * 256;
+
+ za->count = 0;
+}
+
+
+static struct zoom_area *
+create_zoom (struct state *st)
+{
+ struct zoom_area *za;
+
+ za = calloc (1, sizeof (struct zoom_area));
+ reset_zoom (st, za);
+
+ return za;
+}
+
+
+static void
+update_position (struct zoom_area *za)
+{
+ za->xx += za->dx;
+ za->yy += za->dy;
+
+ za->x = za->xx >> 8;
+ za->y = za->yy >> 8;
+
+ if (za->x < 0) {
+ za->x = 0;
+ za->dx = 100 + random() % 100;
+ }
+
+ if (za->y < 0) {
+ za->y = 0;
+ za->dy = 100 + random() % 100;
+ }
+
+ if (za->x > za->ww) {
+ za->x = za->ww;
+ za->dx = -(100 + random() % 100);
+ }
+
+ if (za->y > za->hh) {
+ za->y = za->hh;
+ za->dy = -(100 + random() % 100);
+ }
+}
+
+
+static void
+DisplayImage (struct state *st, int x, int y, int w, int h)
+{
+ put_xshm_image (st->dpy, st->window, st->gc, st->buffer_map, x, y, x, y,
+ w, h, &st->shm_info);
+}
+
+
+static void
+set_mode(struct state *st)
+{
+ char *s = get_string_resource (st->dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp (s, "random"))
+ {
+ switch (random() % 4) {
+ case 0: s = "stationary"; break;
+ case 1: s = "move"; break;
+ case 2: s = "sweep"; break;
+ case 3: s = "circle"; break;
+ default: abort();
+ }
+ }
+
+ st->move = False;
+ st->sweep = False;
+ st->circle = False;
+
+ if (!strcasecmp (s, "stationary"))
+ ;
+ else if (!strcasecmp (s, "move"))
+ st->move = True;
+ else if (!strcasecmp (s, "sweep"))
+ st->sweep = True;
+ else if (!strcasecmp (s, "circle"))
+ st->circle = True;
+ else
+ fprintf (stderr, "%s: bogus mode: \"%s\"\n", progname, s);
+}
+
+
+static void
+init_hack (struct state *st)
+{
+ int i;
+
+ set_mode (st);
+
+ st->start_time = time ((time_t *) 0);
+ st->zoom_box = calloc (st->num_zoom, sizeof (struct zoom_area *));
+ for (i = 0; i < st->num_zoom; i++) {
+ st->zoom_box[i] = create_zoom (st);
+ }
+
+ if (st->height && st->orig_map->data)
+ memcpy (st->buffer_map->data, st->orig_map->data,
+ st->height * st->buffer_map->bytes_per_line);
+
+ DisplayImage(st, 0, 0, st->width, st->height);
+}
+
+
+static unsigned long
+rotzoomer_draw (Display *disp, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int delay = st->delay;
+ int i;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+ if (! st->pm) abort();
+ st->orig_map = XGetImage (st->dpy, st->pm,
+ 0, 0, st->width, st->height,
+ ~0L, ZPixmap);
+ init_hack (st);
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ /* On MacOS X11, XGetImage on a Window often gets an inexplicable BadMatch,
+ possibly due to the window manager having occluded something? It seems
+ nondeterministic. Loading the image into a pixmap instead fixes it. */
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ st->pm = XCreatePixmap (st->dpy, st->window,
+ xgwa.width, xgwa.height, xgwa.depth);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->pm, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ return st->delay;
+ }
+
+ for (i = 0; i < st->num_zoom; i++) {
+ if (st->move || st->sweep)
+ update_position (st->zoom_box[i]);
+
+ if (st->zoom_box[i]->n > 0) {
+ if (st->anim || st->zoom_box[i]->count == 0) {
+ rotzoom (st, st->zoom_box[i]);
+ } else {
+ delay = 1000000;
+ }
+ st->zoom_box[i]->n--;
+ } else {
+ reset_zoom (st, st->zoom_box[i]);
+ }
+ }
+
+ for (i = 0; i < st->num_zoom; i++) {
+ DisplayImage(st, st->zoom_box[i]->x, st->zoom_box[i]->y,
+ st->zoom_box[i]->w, st->zoom_box[i]->h);
+ }
+
+ return delay;
+}
+
+
+static void
+setup_X (struct state *st)
+{
+ XWindowAttributes xgwa;
+ int depth;
+ XGCValues gcv;
+ long gcflags;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ depth = xgwa.depth;
+ st->colormap = xgwa.colormap;
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ st->visual = xgwa.visual;
+
+ if (st->width % 2)
+ st->width--;
+ if (st->height % 2)
+ st->height--;
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ gcflags = GCFunction;
+ if (use_subwindow_mode_p (xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+ st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ st->pm = XCreatePixmap (st->dpy, st->window,
+ xgwa.width, xgwa.height, xgwa.depth);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->pm, 0, 0);
+
+ st->buffer_map = create_xshm_image(st->dpy, xgwa.visual, depth,
+ ZPixmap, &st->shm_info, st->width, st->height);
+}
+
+
+static void *
+rotzoomer_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ st->num_zoom = get_integer_resource (st->dpy, "numboxes", "Integer");
+
+ set_mode(st);
+
+ st->anim = get_boolean_resource (st->dpy, "anim", "Boolean");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->delay < 0) st->delay = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ /* In sweep or static mode, we want only one box */
+ if (st->sweep || !st->anim)
+ st->num_zoom = 1;
+
+ /* Can't have static sweep mode */
+ if (!st->anim)
+ st->sweep = 0;
+
+ if (st->circle) {
+ st->move = 0;
+ st->sweep = 0;
+ }
+
+ st->start_time = time ((time_t *) 0);
+
+ setup_X (st);
+
+ return st;
+}
+
+static void
+rotzoomer_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+rotzoomer_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+rotzoomer_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->pm) XFreePixmap (dpy, st->pm);
+ free (st);
+}
+
+
+static const char *rotzoomer_defaults[] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#else
+ "*useSHM: False",
+#endif
+ "*anim: True",
+ "*mode: random",
+ "*numboxes: 2",
+ "*delay: 10000",
+ "*duration: 120",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+
+static XrmOptionDescRec rotzoomer_options[] = {
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-move", ".mode", XrmoptionNoArg, "move" },
+ { "-sweep", ".mode", XrmoptionNoArg, "sweep" },
+ { "-circle", ".mode", XrmoptionNoArg, "circle"},
+ { "-anim", ".anim", XrmoptionNoArg, "True" },
+ { "-no-anim", ".anim", XrmoptionNoArg, "False" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-n", ".numboxes", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("RotZoomer", rotzoomer)
diff --git a/hacks/rotzoomer.man b/hacks/rotzoomer.man
new file mode 100644
index 0000000..0a82550
--- /dev/null
+++ b/hacks/rotzoomer.man
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "14-Mar-01" "X Version 11"
+.SH NAME
+rotzoomer - animated rotations and scalings of portions of the screen
+.SH SYNOPSIS
+.B rotzoomer
+[\-display \fIhost:display.screen\fP]
+[\-move | \-no\-move]
+[\-delay \fImillisecs\fP]
+[\-duration \fIsecs\fP]
+[\-n \fIcount\fP]
+[\-shm | \-no\-shm]
+[\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIrotzoomer\fP program grabs an image, then picks
+rectangles and draws scaled and rotated animations of that
+section.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I rotzoomer
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImilliseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 10, or about 1/100th second.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-move
+Make the rectangles should wander around the screen.
+.TP 8
+.B \-no\-move
+Make the rectangles be stationary. This is the default.
+.TP 8
+.B \-n \fIcount\fP
+How many rectangles to animate simultaneously. Default 2.
+.TP 8
+.B \-no\-shm
+Disable use of the SHM extension, even if it appears to be available.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Claudio Matsuoka. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Claudio Matsuoka <claudio@helllabs.org>
diff --git a/hacks/screenhack.c b/hacks/screenhack.c
new file mode 100644
index 0000000..addc960
--- /dev/null
+++ b/hacks/screenhack.c
@@ -0,0 +1,984 @@
+/* xscreensaver, Copyright (c) 1992-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * And remember: X Windows is to graphics hacking as roman numerals are to
+ * the square root of pi.
+ */
+
+/* This file contains simple code to open a window or draw on the root.
+ The idea being that, when writing a graphics hack, you can just link
+ with this .o to get all of the uninteresting junk out of the way.
+
+ Create a few static global procedures and variables:
+
+ static void *YOURNAME_init (Display *, Window);
+
+ Return an opaque structure representing your drawing state.
+
+ static unsigned long YOURNAME_draw (Display *, Window, void *closure);
+
+ Draw one frame.
+ The `closure' arg is your drawing state, that you created in `init'.
+ Return the number of microseconds to wait until the next frame.
+
+ This should return in some small fraction of a second.
+ Do not call `usleep' or loop excessively. For long loops, use a
+ finite state machine.
+
+ static void YOURNAME_reshape (Display *, Window, void *closure,
+ unsigned int width, unsigned int height);
+
+ Called when the size of the window changes with the new size.
+
+ static Bool YOURNAME_event (Display *, Window, void *closure,
+ XEvent *event);
+
+ Called when a keyboard or mouse event arrives.
+ Return True if you handle it in some way, False otherwise.
+
+ static void YOURNAME_free (Display *, Window, void *closure);
+
+ Called when you are done: free everything you've allocated,
+ including your private `state' structure.
+
+ NOTE: this is called in windowed-mode when the user typed
+ 'q' or clicks on the window's close box; but when
+ xscreensaver terminates this screenhack, it does so by
+ killing the process with SIGSTOP. So this callback is
+ mostly useless.
+
+ static char YOURNAME_defaults [] = { "...", "...", ... , 0 };
+
+ This variable is an array of strings, your default resources.
+ Null-terminate the list.
+
+ static XrmOptionDescRec YOURNAME_options[] = { { ... }, ... { 0,0,0,0 } }
+
+ This variable describes your command-line options.
+ Null-terminate the list.
+
+ Finally , invoke the XSCREENSAVER_MODULE() macro to tie it all together.
+
+ Additional caveats:
+
+ - Make sure that all functions in your module are static (check this
+ by running "nm -g" on the .o file).
+
+ - Do not use global variables: all such info must be stored in the
+ private `state' structure.
+
+ - Do not use static function-local variables, either. Put it in `state'.
+
+ Assume that there are N independent runs of this code going in the
+ same address space at the same time: they must not affect each other.
+
+ - Don't forget to write an XML file to describe the user interface
+ of your screen saver module. See .../hacks/config/README for details.
+ */
+
+#define DEBUG_PAIR
+
+#include <stdio.h>
+#include <X11/Intrinsic.h>
+#include <X11/IntrinsicP.h>
+#include <X11/CoreP.h>
+#include <X11/Shell.h>
+#include <X11/StringDefs.h>
+#include <X11/keysym.h>
+
+#ifdef __sgi
+# include <X11/SGIScheme.h> /* for SgiUseSchemes() */
+#endif /* __sgi */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Error.h>
+# else /* VMS */
+# include <Xmu/Error.h>
+# endif
+#else
+# include "xmu.h"
+#endif
+
+#include "screenhackI.h"
+#include "version.h"
+#include "vroot.h"
+#include "fps.h"
+
+#ifdef HAVE_RECORD_ANIM
+# include "recanim.h"
+#endif
+
+#ifndef _XSCREENSAVER_VROOT_H_
+# error Error! You have an old version of vroot.h! Check -I args.
+#endif /* _XSCREENSAVER_VROOT_H_ */
+
+#ifndef isupper
+# define isupper(c) ((c) >= 'A' && (c) <= 'Z')
+#endif
+#ifndef _tolower
+# define _tolower(c) ((c) - 'A' + 'a')
+#endif
+
+
+/* This is defined by the SCREENHACK_MAIN() macro via screenhack.h.
+ */
+extern struct xscreensaver_function_table *xscreensaver_function_table;
+
+
+const char *progname; /* used by hacks in error messages */
+const char *progclass; /* used by ../utils/resources.c */
+Bool mono_p; /* used by hacks */
+
+
+static XrmOptionDescRec default_options [] = {
+ { "-root", ".root", XrmoptionNoArg, "True" },
+ { "-window", ".root", XrmoptionNoArg, "False" },
+ { "-mono", ".mono", XrmoptionNoArg, "True" },
+ { "-install", ".installColormap", XrmoptionNoArg, "True" },
+ { "-noinstall",".installColormap", XrmoptionNoArg, "False" },
+ { "-visual", ".visualID", XrmoptionSepArg, 0 },
+ { "-window-id", ".windowID", XrmoptionSepArg, 0 },
+ { "-fps", ".doFPS", XrmoptionNoArg, "True" },
+ { "-no-fps", ".doFPS", XrmoptionNoArg, "False" },
+
+# ifdef DEBUG_PAIR
+ { "-pair", ".pair", XrmoptionNoArg, "True" },
+# endif /* DEBUG_PAIR */
+
+# ifdef HAVE_RECORD_ANIM
+ { "-record-animation", ".recordAnim", XrmoptionSepArg, 0 },
+# endif /* HAVE_RECORD_ANIM */
+
+ { 0, 0, 0, 0 }
+};
+
+static char *default_defaults[] = {
+ ".root: false",
+ "*geometry: 1280x720", /* this should be .geometry, but noooo... */
+ "*mono: false",
+ "*installColormap: false",
+ "*doFPS: false",
+ "*multiSample: false",
+ "*visualID: default",
+ "*windowID: ",
+ "*desktopGrabber: xscreensaver-getimage %s",
+ 0
+};
+
+static XrmOptionDescRec *merged_options;
+static int merged_options_size;
+static char **merged_defaults;
+
+
+static void
+merge_options (void)
+{
+ struct xscreensaver_function_table *ft = xscreensaver_function_table;
+
+ const XrmOptionDescRec *options = ft->options;
+ const char * const *defaults = ft->defaults;
+ const char *progclass = ft->progclass;
+
+ int def_opts_size, opts_size;
+ int def_defaults_size, defaults_size;
+
+ for (def_opts_size = 0; default_options[def_opts_size].option;
+ def_opts_size++)
+ ;
+ for (opts_size = 0; options[opts_size].option; opts_size++)
+ ;
+
+ merged_options_size = def_opts_size + opts_size;
+ merged_options = (XrmOptionDescRec *)
+ malloc ((merged_options_size + 1) * sizeof(*default_options));
+ memcpy (merged_options, default_options,
+ (def_opts_size * sizeof(*default_options)));
+ memcpy (merged_options + def_opts_size, options,
+ ((opts_size + 1) * sizeof(*default_options)));
+
+ for (def_defaults_size = 0; default_defaults[def_defaults_size];
+ def_defaults_size++)
+ ;
+ for (defaults_size = 0; defaults[defaults_size]; defaults_size++)
+ ;
+ merged_defaults = (char **)
+ malloc ((def_defaults_size + defaults_size + 1) * sizeof (*defaults));;
+ memcpy (merged_defaults, default_defaults,
+ def_defaults_size * sizeof(*defaults));
+ memcpy (merged_defaults + def_defaults_size, defaults,
+ (defaults_size + 1) * sizeof(*defaults));
+
+ /* This totally sucks. Xt should behave like this by default.
+ If the string in `defaults' looks like ".foo", change that
+ to "Progclass.foo".
+ */
+ {
+ char **s;
+ for (s = merged_defaults; *s; s++)
+ if (**s == '.')
+ {
+ const char *oldr = *s;
+ char *newr = (char *) malloc(strlen(oldr) + strlen(progclass) + 3);
+ strcpy (newr, progclass);
+ strcat (newr, oldr);
+ *s = newr;
+ }
+ else
+ *s = strdup (*s);
+ }
+}
+
+
+/* Make the X errors print out the name of this program, so we have some
+ clue which one has a bug when they die under the screensaver.
+ */
+
+static int
+screenhack_ehandler (Display *dpy, XErrorEvent *error)
+{
+ fprintf (stderr, "\nX error in %s:\n", progname);
+ if (XmuPrintDefaultErrorMessage (dpy, error, stderr))
+ exit (-1);
+ else
+ fprintf (stderr, " (nonfatal.)\n");
+ return 0;
+}
+
+static Bool
+MapNotify_event_p (Display *dpy, XEvent *event, XPointer window)
+{
+ return (event->xany.type == MapNotify &&
+ event->xvisibility.window == (Window) window);
+}
+
+
+static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW;
+
+/* Dead-trivial event handling: exits if "q" or "ESC" are typed.
+ Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received.
+ Returns False if the screen saver should now terminate.
+ */
+static Bool
+screenhack_handle_event_1 (Display *dpy, XEvent *event)
+{
+ switch (event->xany.type)
+ {
+ case KeyPress:
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == 'q' ||
+ c == 'Q' ||
+ c == 3 || /* ^C */
+ c == 27) /* ESC */
+ return False; /* exit */
+ else if (! (keysym >= XK_Shift_L && keysym <= XK_Hyper_R))
+ XBell (dpy, 0); /* beep for non-chord keys */
+ }
+ break;
+ case ButtonPress:
+ XBell (dpy, 0);
+ break;
+ case ClientMessage:
+ {
+ if (event->xclient.message_type != XA_WM_PROTOCOLS)
+ {
+ char *s = XGetAtomName(dpy, event->xclient.message_type);
+ if (!s) s = "(null)";
+ fprintf (stderr, "%s: unknown ClientMessage %s received!\n",
+ progname, s);
+ }
+ else if (event->xclient.data.l[0] != XA_WM_DELETE_WINDOW)
+ {
+ char *s1 = XGetAtomName(dpy, event->xclient.message_type);
+ char *s2 = XGetAtomName(dpy, event->xclient.data.l[0]);
+ if (!s1) s1 = "(null)";
+ if (!s2) s2 = "(null)";
+ fprintf (stderr, "%s: unknown ClientMessage %s[%s] received!\n",
+ progname, s1, s2);
+ }
+ else
+ {
+ return False; /* exit */
+ }
+ }
+ break;
+ }
+ return True;
+}
+
+
+static Visual *
+pick_visual (Screen *screen)
+{
+ struct xscreensaver_function_table *ft = xscreensaver_function_table;
+
+ if (ft->pick_visual_hook)
+ {
+ Visual *v = ft->pick_visual_hook (screen);
+ if (v) return v;
+ }
+
+ return get_visual_resource (screen, "visualID", "VisualID", False);
+}
+
+
+/* Notice when the user has requested a different visual or colormap
+ on a pre-existing window (e.g., "-root -visual truecolor" or
+ "-window-id 0x2c00001 -install") and complain, since when drawing
+ on an existing window, we have no choice about these things.
+ */
+static void
+visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
+ Bool window_p)
+{
+ struct xscreensaver_function_table *ft = xscreensaver_function_table;
+
+ char *visual_string = get_string_resource (DisplayOfScreen (screen),
+ "visualID", "VisualID");
+ Visual *desired_visual = pick_visual (screen);
+ char win[100];
+ char why[100];
+
+ if (window == RootWindowOfScreen (screen))
+ strcpy (win, "root window");
+ else
+ sprintf (win, "window 0x%lx", (unsigned long) window);
+
+ if (window_p)
+ sprintf (why, "-window-id 0x%lx", (unsigned long) window);
+ else
+ strcpy (why, "-root");
+
+ if (visual_string && *visual_string)
+ {
+ char *s;
+ for (s = visual_string; *s; s++)
+ if (isupper (*s)) *s = _tolower (*s);
+
+ if (!strcmp (visual_string, "default") ||
+ !strcmp (visual_string, "default") ||
+ !strcmp (visual_string, "best"))
+ /* don't warn about these, just silently DWIM. */
+ ;
+ else if (visual != desired_visual)
+ {
+ fprintf (stderr, "%s: ignoring `-visual %s' because of `%s'.\n",
+ progname, visual_string, why);
+ fprintf (stderr, "%s: using %s's visual 0x%lx.\n",
+ progname, win, XVisualIDFromVisual (visual));
+ }
+ free (visual_string);
+ }
+
+ if (visual == DefaultVisualOfScreen (screen) &&
+ has_writable_cells (screen, visual) &&
+ get_boolean_resource (DisplayOfScreen (screen),
+ "installColormap", "InstallColormap"))
+ {
+ fprintf (stderr, "%s: ignoring `-install' because of `%s'.\n",
+ progname, why);
+ fprintf (stderr, "%s: using %s's colormap 0x%lx.\n",
+ progname, win, (unsigned long) cmap);
+ }
+
+ if (ft->validate_visual_hook)
+ {
+ if (! ft->validate_visual_hook (screen, win, visual))
+ exit (1);
+ }
+}
+
+
+static void
+fix_fds (void)
+{
+ /* Bad Things Happen if stdin, stdout, and stderr have been closed
+ (as by the `sh incantation "attraction >&- 2>&-"). When you do
+ that, the X connection gets allocated to one of these fds, and
+ then some random library writes to stderr, and random bits get
+ stuffed down the X pipe, causing "Xlib: sequence lost" errors.
+ So, we cause the first three file descriptors to be open to
+ /dev/null if they aren't open to something else already. This
+ must be done before any other files are opened (or the closing
+ of that other file will again free up one of the "magic" first
+ three FDs.)
+
+ We do this by opening /dev/null three times, and then closing
+ those fds, *unless* any of them got allocated as #0, #1, or #2,
+ in which case we leave them open. Gag.
+
+ Really, this crap is technically required of *every* X program,
+ if you want it to be robust in the face of "2>&-".
+ */
+ int fd0 = open ("/dev/null", O_RDWR);
+ int fd1 = open ("/dev/null", O_RDWR);
+ int fd2 = open ("/dev/null", O_RDWR);
+ if (fd0 > 2) close (fd0);
+ if (fd1 > 2) close (fd1);
+ if (fd2 > 2) close (fd2);
+}
+
+
+static Boolean
+screenhack_table_handle_events (Display *dpy,
+ const struct xscreensaver_function_table *ft,
+ Window window, void *closure
+#ifdef DEBUG_PAIR
+ , Window window2, void *closure2
+#endif
+ )
+{
+ XtAppContext app = XtDisplayToApplicationContext (dpy);
+
+ if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+ XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+
+ while (XPending (dpy))
+ {
+ XEvent event;
+ XNextEvent (dpy, &event);
+
+ if (event.xany.type == ConfigureNotify)
+ {
+ if (event.xany.window == window)
+ ft->reshape_cb (dpy, window, closure,
+ event.xconfigure.width, event.xconfigure.height);
+#ifdef DEBUG_PAIR
+ if (window2 && event.xany.window == window2)
+ ft->reshape_cb (dpy, window2, closure2,
+ event.xconfigure.width, event.xconfigure.height);
+#endif
+ }
+ else if (event.xany.type == ClientMessage ||
+ (! (event.xany.window == window
+ ? ft->event_cb (dpy, window, closure, &event)
+#ifdef DEBUG_PAIR
+ : (window2 && event.xany.window == window2)
+ ? ft->event_cb (dpy, window2, closure2, &event)
+#endif
+ : 0)))
+ if (! screenhack_handle_event_1 (dpy, &event))
+ return False;
+
+ if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+ XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+ }
+ return True;
+}
+
+
+static Boolean
+usleep_and_process_events (Display *dpy,
+ const struct xscreensaver_function_table *ft,
+ Window window, fps_state *fpst, void *closure,
+ unsigned long delay
+#ifdef DEBUG_PAIR
+ , Window window2, fps_state *fpst2, void *closure2,
+ unsigned long delay2
+#endif
+# ifdef HAVE_RECORD_ANIM
+ , record_anim_state *anim_state
+# endif
+ )
+{
+ do {
+ unsigned long quantum = 33333; /* 30 fps */
+ if (quantum > delay)
+ quantum = delay;
+ delay -= quantum;
+
+ XSync (dpy, False);
+
+#ifdef HAVE_RECORD_ANIM
+ if (anim_state) screenhack_record_anim (anim_state);
+#endif
+
+ if (quantum > 0)
+ {
+ usleep (quantum);
+ if (fpst) fps_slept (fpst, quantum);
+#ifdef DEBUG_PAIR
+ if (fpst2) fps_slept (fpst2, quantum);
+#endif
+ }
+
+ if (! screenhack_table_handle_events (dpy, ft, window, closure
+#ifdef DEBUG_PAIR
+ , window2, closure2
+#endif
+ ))
+ return False;
+ } while (delay > 0);
+
+ return True;
+}
+
+
+static void
+screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure)
+{
+ fps_compute (fpst, 0, -1);
+ fps_draw (fpst);
+}
+
+
+static void
+run_screenhack_table (Display *dpy,
+ Window window,
+# ifdef DEBUG_PAIR
+ Window window2,
+# endif
+# ifdef HAVE_RECORD_ANIM
+ record_anim_state *anim_state,
+# endif
+ const struct xscreensaver_function_table *ft)
+{
+
+ /* Kludge: even though the init_cb functions are declared to take 2 args,
+ actually call them with 3, for the benefit of xlockmore_init() and
+ xlockmore_setup().
+ */
+ void *(*init_cb) (Display *, Window, void *) =
+ (void *(*) (Display *, Window, void *)) ft->init_cb;
+
+ void (*fps_cb) (Display *, Window, fps_state *, void *) = ft->fps_cb;
+
+ void *closure = init_cb (dpy, window, ft->setup_arg);
+ fps_state *fpst = fps_init (dpy, window);
+ unsigned long delay = 0;
+
+#ifdef DEBUG_PAIR
+ void *closure2 = 0;
+ fps_state *fpst2 = 0;
+ unsigned long delay2 = 0;
+ if (window2) closure2 = init_cb (dpy, window2, ft->setup_arg);
+ if (window2) fpst2 = fps_init (dpy, window2);
+#endif
+
+ if (! closure) /* if it returns nothing, it can't possibly be re-entrant. */
+ abort();
+
+ if (! fps_cb) fps_cb = screenhack_do_fps;
+
+ while (1)
+ {
+ if (! usleep_and_process_events (dpy, ft,
+ window, fpst, closure, delay
+#ifdef DEBUG_PAIR
+ , window2, fpst2, closure2, delay2
+#endif
+#ifdef HAVE_RECORD_ANIM
+ , anim_state
+#endif
+ ))
+ break;
+
+ delay = ft->draw_cb (dpy, window, closure);
+#ifdef DEBUG_PAIR
+ delay2 = 0;
+ if (window2) delay2 = ft->draw_cb (dpy, window2, closure2);
+#endif
+
+ if (fpst) fps_cb (dpy, window, fpst, closure);
+#ifdef DEBUG_PAIR
+ if (fpst2) fps_cb (dpy, window2, fpst2, closure2);
+#endif
+ }
+
+#ifdef HAVE_RECORD_ANIM
+ /* Exiting before target frames hit: write the video anyway. */
+ if (anim_state) screenhack_record_anim_free (anim_state);
+#endif
+
+ ft->free_cb (dpy, window, closure);
+ if (fpst) fps_free (fpst);
+
+#ifdef DEBUG_PAIR
+ if (window2) ft->free_cb (dpy, window2, closure2);
+ if (fpst2) fps_free (fpst2);
+#endif
+}
+
+
+static Widget
+make_shell (Screen *screen, Widget toplevel, int width, int height)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Visual *visual = pick_visual (screen);
+ Boolean def_visual_p = (toplevel &&
+ visual == DefaultVisualOfScreen (screen));
+
+ if (width <= 0) width = 600;
+ if (height <= 0) height = 480;
+
+ if (def_visual_p)
+ {
+ Window window;
+ XtVaSetValues (toplevel,
+ XtNmappedWhenManaged, False,
+ XtNwidth, width,
+ XtNheight, height,
+ XtNinput, True, /* for WM_HINTS */
+ NULL);
+ XtRealizeWidget (toplevel);
+ window = XtWindow (toplevel);
+
+ if (get_boolean_resource (dpy, "installColormap", "InstallColormap"))
+ {
+ Colormap cmap =
+ XCreateColormap (dpy, window, DefaultVisualOfScreen (screen),
+ AllocNone);
+ XSetWindowColormap (dpy, window, cmap);
+ }
+ }
+ else
+ {
+ unsigned int bg, bd;
+ Widget new;
+ Colormap cmap = XCreateColormap (dpy, VirtualRootWindowOfScreen(screen),
+ visual, AllocNone);
+ bg = get_pixel_resource (dpy, cmap, "background", "Background");
+ bd = get_pixel_resource (dpy, cmap, "borderColor", "Foreground");
+
+ new = XtVaAppCreateShell (progname, progclass,
+ topLevelShellWidgetClass, dpy,
+ XtNmappedWhenManaged, False,
+ XtNvisual, visual,
+ XtNdepth, visual_depth (screen, visual),
+ XtNwidth, width,
+ XtNheight, height,
+ XtNcolormap, cmap,
+ XtNbackground, (Pixel) bg,
+ XtNborderColor, (Pixel) bd,
+ XtNinput, True, /* for WM_HINTS */
+ NULL);
+
+ if (!toplevel) /* kludge for the second window in -pair mode... */
+ XtVaSetValues (new, XtNx, 0, XtNy, 550, NULL);
+
+ XtRealizeWidget (new);
+ toplevel = new;
+ }
+
+ return toplevel;
+}
+
+static void
+init_window (Display *dpy, Widget toplevel, const char *title)
+{
+ Window window;
+ XWindowAttributes xgwa;
+ XtPopup (toplevel, XtGrabNone);
+ XtVaSetValues (toplevel, XtNtitle, title, NULL);
+
+ /* Select KeyPress, and announce that we accept WM_DELETE_WINDOW.
+ */
+ window = XtWindow (toplevel);
+ XGetWindowAttributes (dpy, window, &xgwa);
+ XSelectInput (dpy, window,
+ (xgwa.your_event_mask | KeyPressMask | KeyReleaseMask |
+ ButtonPressMask | ButtonReleaseMask));
+ XChangeProperty (dpy, window, XA_WM_PROTOCOLS, XA_ATOM, 32,
+ PropModeReplace,
+ (unsigned char *) &XA_WM_DELETE_WINDOW, 1);
+}
+
+
+int
+main (int argc, char **argv)
+{
+ struct xscreensaver_function_table *ft = xscreensaver_function_table;
+
+ XWindowAttributes xgwa;
+ Widget toplevel;
+ Display *dpy;
+ Window window;
+# ifdef DEBUG_PAIR
+ Window window2 = 0;
+ Widget toplevel2 = 0;
+# endif
+#ifdef HAVE_RECORD_ANIM
+ record_anim_state *anim_state = 0;
+#endif
+ XtAppContext app;
+ Bool root_p;
+ Window on_window = 0;
+ XEvent event;
+ Boolean dont_clear;
+ char version[255];
+
+ fix_fds();
+
+ progname = argv[0]; /* reset later */
+ progclass = ft->progclass;
+
+ if (ft->setup_cb)
+ ft->setup_cb (ft, ft->setup_arg);
+
+ merge_options ();
+
+#ifdef __sgi
+ /* We have to do this on SGI to prevent the background color from being
+ overridden by the current desktop color scheme (we'd like our backgrounds
+ to be black, thanks.) This should be the same as setting the
+ "*useSchemes: none" resource, but it's not -- if that resource is
+ present in the `default_defaults' above, it doesn't work, though it
+ does work when passed as an -xrm arg on the command line. So screw it,
+ turn them off from C instead.
+ */
+ SgiUseSchemes ("none");
+#endif /* __sgi */
+
+ toplevel = XtAppInitialize (&app, progclass, merged_options,
+ merged_options_size, &argc, argv,
+ merged_defaults, 0, 0);
+
+ dpy = XtDisplay (toplevel);
+
+ XtGetApplicationNameAndClass (dpy,
+ (char **) &progname,
+ (char **) &progclass);
+
+ /* half-assed way of avoiding buffer-overrun attacks. */
+ if (strlen (progname) >= 100) ((char *) progname)[100] = 0;
+
+ XSetErrorHandler (screenhack_ehandler);
+
+ XA_WM_PROTOCOLS = XInternAtom (dpy, "WM_PROTOCOLS", False);
+ XA_WM_DELETE_WINDOW = XInternAtom (dpy, "WM_DELETE_WINDOW", False);
+
+ {
+ char *v = (char *) strdup(strchr(screensaver_id, ' '));
+ char *s1, *s2, *s3, *s4;
+ const char *ot = get_string_resource (dpy, "title", "Title");
+ s1 = (char *) strchr(v, ' '); s1++;
+ s2 = (char *) strchr(s1, ' ');
+ s3 = (char *) strchr(v, '('); s3++;
+ s4 = (char *) strchr(s3, ')');
+ *s2 = 0;
+ *s4 = 0;
+ if (ot && !*ot) ot = 0;
+ sprintf (version, "%.50s%s%s: from the XScreenSaver %s distribution (%s)",
+ (ot ? ot : ""),
+ (ot ? ": " : ""),
+ progclass, s1, s3);
+ free(v);
+ }
+
+ if (argc > 1)
+ {
+ const char *s;
+ int i;
+ int x = 18;
+ int end = 78;
+ Bool help_p = (!strcmp(argv[1], "-help") ||
+ !strcmp(argv[1], "--help"));
+ fprintf (stderr, "%s\n", version);
+ for (s = progclass; *s; s++) fprintf(stderr, " ");
+ fprintf (stderr, " https://www.jwz.org/xscreensaver/\n\n");
+
+ if (!help_p)
+ fprintf(stderr, "Unrecognised option: %s\n", argv[1]);
+ fprintf (stderr, "Options include: ");
+ for (i = 0; i < merged_options_size; i++)
+ {
+ char *sw = merged_options [i].option;
+ Bool argp = (merged_options [i].argKind == XrmoptionSepArg);
+ int size = strlen (sw) + (argp ? 6 : 0) + 2;
+ if (x + size >= end)
+ {
+ fprintf (stderr, "\n\t\t ");
+ x = 18;
+ }
+ x += size;
+ fprintf (stderr, "%s", sw);
+ if (argp) fprintf (stderr, " <arg>");
+ if (i != merged_options_size - 1) fprintf (stderr, ", ");
+ }
+
+ fprintf (stderr, ".\n");
+
+#if 0
+ if (help_p)
+ {
+ fprintf (stderr, "\nResources:\n\n");
+ for (i = 0; i < merged_options_size; i++)
+ {
+ const char *opt = merged_options [i].option;
+ const char *res = merged_options [i].specifier + 1;
+ const char *val = merged_options [i].value;
+ char *s = get_string_resource (dpy, (char *) res, (char *) res);
+
+ if (s)
+ {
+ int L = strlen(s);
+ while (L > 0 && (s[L-1] == ' ' || s[L-1] == '\t'))
+ s[--L] = 0;
+ }
+
+ fprintf (stderr, " %-16s %-18s ", opt, res);
+ if (merged_options [i].argKind == XrmoptionSepArg)
+ {
+ fprintf (stderr, "[%s]", (s ? s : "?"));
+ }
+ else
+ {
+ fprintf (stderr, "%s", (val ? val : "(null)"));
+ if (val && s && !strcasecmp (val, s))
+ fprintf (stderr, " [default]");
+ }
+ fprintf (stderr, "\n");
+ }
+ fprintf (stderr, "\n");
+ }
+#endif
+
+ exit (help_p ? 0 : 1);
+ }
+
+ {
+ char **s;
+ for (s = merged_defaults; *s; s++)
+ free(*s);
+ }
+
+ free (merged_options);
+ free (merged_defaults);
+ merged_options = 0;
+ merged_defaults = 0;
+
+ dont_clear = get_boolean_resource (dpy, "dontClearRoot", "Boolean");
+ mono_p = get_boolean_resource (dpy, "mono", "Boolean");
+ if (CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2)
+ mono_p = True;
+
+ root_p = get_boolean_resource (dpy, "root", "Boolean");
+
+ {
+ char *s = get_string_resource (dpy, "windowID", "WindowID");
+ if (s && *s)
+ on_window = get_integer_resource (dpy, "windowID", "WindowID");
+ if (s) free (s);
+ }
+
+ if (on_window)
+ {
+ window = (Window) on_window;
+ XtDestroyWidget (toplevel);
+ XGetWindowAttributes (dpy, window, &xgwa);
+ visual_warning (xgwa.screen, window, xgwa.visual, xgwa.colormap, True);
+
+ /* Select KeyPress and resize events on the external window.
+ */
+ xgwa.your_event_mask |= KeyPressMask | StructureNotifyMask;
+ XSelectInput (dpy, window, xgwa.your_event_mask);
+
+ /* Select ButtonPress and ButtonRelease events on the external window,
+ if no other app has already selected them (only one app can select
+ ButtonPress at a time: BadAccess results.)
+ */
+ if (! (xgwa.all_event_masks & (ButtonPressMask | ButtonReleaseMask)))
+ XSelectInput (dpy, window,
+ (xgwa.your_event_mask |
+ ButtonPressMask | ButtonReleaseMask));
+ }
+ else if (root_p)
+ {
+ window = VirtualRootWindowOfScreen (XtScreen (toplevel));
+ XtDestroyWidget (toplevel);
+ XGetWindowAttributes (dpy, window, &xgwa);
+ /* With RANDR, the root window can resize! */
+ XSelectInput (dpy, window, xgwa.your_event_mask | StructureNotifyMask);
+ visual_warning (xgwa.screen, window, xgwa.visual, xgwa.colormap, False);
+ }
+ else
+ {
+ Widget new = make_shell (XtScreen (toplevel), toplevel,
+ toplevel->core.width,
+ toplevel->core.height);
+ if (new != toplevel)
+ {
+ XtDestroyWidget (toplevel);
+ toplevel = new;
+ }
+
+ init_window (dpy, toplevel, version);
+ window = XtWindow (toplevel);
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+# ifdef DEBUG_PAIR
+ if (get_boolean_resource (dpy, "pair", "Boolean"))
+ {
+ toplevel2 = make_shell (xgwa.screen, 0,
+ toplevel->core.width,
+ toplevel->core.height);
+ init_window (dpy, toplevel2, version);
+ window2 = XtWindow (toplevel2);
+ }
+# endif /* DEBUG_PAIR */
+ }
+
+ if (!dont_clear)
+ {
+ unsigned int bg = get_pixel_resource (dpy, xgwa.colormap,
+ "background", "Background");
+ XSetWindowBackground (dpy, window, bg);
+ XClearWindow (dpy, window);
+# ifdef DEBUG_PAIR
+ if (window2)
+ {
+ XSetWindowBackground (dpy, window2, bg);
+ XClearWindow (dpy, window2);
+ }
+# endif
+ }
+
+ if (!root_p && !on_window)
+ /* wait for it to be mapped */
+ XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window);
+
+ XSync (dpy, False);
+
+ /* This is the one and only place that the random-number generator is
+ seeded in any screenhack. You do not need to seed the RNG again,
+ it is done for you before your code is invoked. */
+# undef ya_rand_init
+ ya_rand_init (0);
+
+
+#ifdef HAVE_RECORD_ANIM
+ {
+ int frames = get_integer_resource (dpy, "recordAnim", "Integer");
+ if (frames > 0)
+ anim_state = screenhack_record_anim_init (xgwa.screen, window, frames);
+ }
+#endif
+
+ run_screenhack_table (dpy, window,
+# ifdef DEBUG_PAIR
+ window2,
+# endif
+# ifdef HAVE_RECORD_ANIM
+ anim_state,
+# endif
+ ft);
+
+#ifdef HAVE_RECORD_ANIM
+ if (anim_state) screenhack_record_anim_free (anim_state);
+#endif
+
+ XtDestroyWidget (toplevel);
+ XtDestroyApplicationContext (app);
+
+ return 0;
+}
diff --git a/hacks/screenhack.h b/hacks/screenhack.h
new file mode 100644
index 0000000..78621ab
--- /dev/null
+++ b/hacks/screenhack.h
@@ -0,0 +1,67 @@
+/* xscreensaver, Copyright (c) 1992-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __SCREENHACK_H__
+#define __SCREENHACK_H__
+
+#include "screenhackI.h"
+
+/* In an Xlib world, we define two global symbols here:
+ a struct in `MODULENAME_xscreensaver_function_table',
+ and a pointer to that in `xscreensaver_function_table'.
+
+ In a Cocoa/Android world, we only define the prefixed symbol;
+ the un-prefixed symbol does not exist.
+ */
+#ifdef HAVE_JWXYZ
+# define XSCREENSAVER_LINK(NAME)
+#else
+# define XSCREENSAVER_LINK(NAME) \
+ struct xscreensaver_function_table *xscreensaver_function_table = &NAME;
+#endif
+
+
+#if defined(HAVE_JWXYZ) && !defined(__XLOCKMORE_INTERNAL_H__)
+ /* this is one enormous kludge... */
+# undef ya_rand_init
+ static void
+ xscreensaver_common_setup(struct xscreensaver_function_table *xsft, void *a)
+ { ya_rand_init(0); }
+#else
+# define xscreensaver_common_setup 0
+#endif
+
+
+#ifdef HAVE_JWXYZ
+# define SCREENHACK_VISUAL DEFAULT_VISUAL
+#else /* !HAVE_JWXYZ */
+# define SCREENHACK_VISUAL 0, 0
+#endif /* !HAVE_JWXYZ */
+
+#define XSCREENSAVER_MODULE_2(CLASS,NAME,PREFIX) \
+ struct xscreensaver_function_table \
+ NAME ## _xscreensaver_function_table = { \
+ CLASS, \
+ PREFIX ## _defaults, \
+ PREFIX ## _options, \
+ xscreensaver_common_setup, 0, \
+ PREFIX ## _init, \
+ PREFIX ## _draw, \
+ PREFIX ## _reshape, \
+ PREFIX ## _event, \
+ PREFIX ## _free, \
+ 0, SCREENHACK_VISUAL }; \
+ XSCREENSAVER_LINK (NAME ## _xscreensaver_function_table)
+
+#define XSCREENSAVER_MODULE(CLASS,PREFIX) \
+ XSCREENSAVER_MODULE_2(CLASS,PREFIX,PREFIX)
+
+#endif /* __SCREENHACK_H__ */
diff --git a/hacks/screenhackI.h b/hacks/screenhackI.h
new file mode 100644
index 0000000..b53ef74
--- /dev/null
+++ b/hacks/screenhackI.h
@@ -0,0 +1,162 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Found in Don Hopkins' .plan file:
+ *
+ * The color situation is a total flying circus. The X approach to
+ * device independence is to treat everything like a MicroVax framebuffer
+ * on acid. A truely portable X application is required to act like the
+ * persistent customer in the Monty Python ``Cheese Shop'' sketch. Even
+ * the simplest applications must answer many difficult questions, like:
+ *
+ * WHAT IS YOUR DISPLAY?
+ * display = XOpenDisplay("unix:0");
+ * WHAT IS YOUR ROOT?
+ * root = RootWindow(display, DefaultScreen(display));
+ * AND WHAT IS YOUR WINDOW?
+ * win = XCreateSimpleWindow(display, root, 0, 0, 256, 256, 1,
+ * BlackPixel(display, DefaultScreen(display)),
+ * WhitePixel(display, DefaultScreen(display)))
+ * OH ALL RIGHT, YOU CAN GO ON.
+ *
+ * WHAT IS YOUR DISPLAY?
+ * display = XOpenDisplay("unix:0");
+ * WHAT IS YOUR COLORMAP?
+ * cmap = DefaultColormap(display, DefaultScreen(display));
+ * AND WHAT IS YOUR FAVORITE COLOR?
+ * favorite_color = 0; / * Black. * /
+ * / * Whoops! No, I mean: * /
+ * favorite_color = BlackPixel(display, DefaultScreen(display));
+ * / * AAAYYYYEEEEE!! (client dumps core & falls into the chasm) * /
+ *
+ * WHAT IS YOUR DISPLAY?
+ * display = XOpenDisplay("unix:0");
+ * WHAT IS YOUR VISUAL?
+ * struct XVisualInfo vinfo;
+ * if (XMatchVisualInfo(display, DefaultScreen(display),
+ * 8, PseudoColor, &vinfo) != 0)
+ * visual = vinfo.visual;
+ * AND WHAT IS THE NET SPEED VELOCITY OF AN XConfigureWindow REQUEST?
+ * / * Is that a SubStructureRedirectMask or a ResizeRedirectMask? * /
+ * WHAT?! HOW AM I SUPPOSED TO KNOW THAT?
+ * AAAAUUUGGGHHH!!!! (server dumps core & falls into the chasm)
+ */
+
+#ifndef __SCREENHACK_I_H__
+#define __SCREENHACK_I_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+
+#ifdef __hpux
+ /* Which of the ten billion standards does values.h belong to?
+ What systems always have it? */
+# include <values.h>
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+# include <string.h> /* X11/Xos.h brings this in. */
+/* From utils/visual.c. */
+# define DEFAULT_VISUAL -1
+# define GL_VISUAL -6
+#else /* real X11 */
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# include <X11/Xresource.h>
+# include <X11/Xos.h>
+#endif /* !HAVE_JWXYZ */
+
+#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+# define HAVE_MOBILE
+#endif
+
+#ifdef HAVE_ANDROID
+ /* So that hacks' debug output shows up in logcat... */
+# undef fprintf
+# define fprintf(S, ...) Log(__VA_ARGS__)
+#endif
+
+/* M_PI ought to have been defined in math.h, but... */
+#ifndef M_PI
+# define M_PI 3.1415926535
+#endif
+
+#ifndef M_PI_2
+# define M_PI_2 1.5707963267
+#endif
+
+#ifndef Button6
+# define Button6 6
+# define Button7 7
+#endif
+
+#include "yarandom.h"
+#include "usleep.h"
+#include "resources.h"
+#include "hsv.h"
+#include "colors.h"
+#include "grabscreen.h"
+#include "visual.h"
+#include "fps.h"
+#include "font-retry.h"
+
+#ifdef HAVE_RECORD_ANIM
+# include "recanim.h"
+#endif
+
+/* Be Posixly correct */
+#undef bzero
+#define bzero __ERROR_use_memset_not_bzero_in_xscreensaver__
+#undef bcopy
+#define bcopy __ERROR_use_memcpy_not_bcopy_in_xscreensaver__
+#undef ftime
+#define ftime __ERROR_use_gettimeofday_not_ftime_in_xscreensaver__
+#undef sleep
+#define sleep __ERROR_do_not_sleep_in_xscreensaver__
+
+extern Bool mono_p;
+
+struct xscreensaver_function_table {
+
+ const char *progclass;
+ const char * const *defaults;
+ const XrmOptionDescRec *options;
+
+ void (*setup_cb) (struct xscreensaver_function_table *, void *);
+ void * setup_arg;
+
+ void * (*init_cb) (Display *, Window);
+ unsigned long (*draw_cb) (Display *, Window, void *);
+ void (*reshape_cb) (Display *, Window, void *,
+ unsigned int w, unsigned int h);
+ Bool (*event_cb) (Display *, Window, void *, XEvent *);
+ void (*free_cb) (Display *, Window, void *);
+ void (*fps_cb) (Display *, Window, fps_state *, void *);
+
+# ifndef HAVE_JWXYZ
+ Visual * (*pick_visual_hook) (Screen *);
+ Bool (*validate_visual_hook) (Screen *, const char *, Visual *);
+# else
+ int visual;
+# endif
+
+};
+
+extern const char *progname;
+
+#endif /* __SCREENHACK_I_H__ */
diff --git a/hacks/shadebobs.c b/hacks/shadebobs.c
new file mode 100644
index 0000000..7a1a0ff
--- /dev/null
+++ b/hacks/shadebobs.c
@@ -0,0 +1,471 @@
+/* shadebobs, Copyright (c) 1999 Shane Smit <blackend@inconnect.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Module - "shadebobs.c"
+ *
+ * Description:
+ * There are two little shading circles (bobs) that zip around the screen.
+ * one of them shades up towards white, and the other shades down toward
+ * black.
+ * This keeps the screen in color balance at a chosen color.
+ *
+ * Its kinda like 'The Force'
+ * There is a light side, a dark side, and it keeps the world in balance.
+ *
+ * [05/23/99] - Shane Smit: Creation
+ * [05/26/99] - Shane Smit: Port to C/screenhack for use with XScreenSaver
+ * [06/11/99] - Shane Smit: Stopped trying to rape the palette.
+ * [06/20/99] - jwz: cleaned up ximage handling, gave resoources short names,
+ * introduced delay, made it restart after N iterations.
+ * [06/21/99] - Shane Smit: Modified default values slightly, color changes
+ * on cycle, and the extents of the sinus pattern change in
+ * real-time.
+ * [06/22/99] - Shane Smit: Fixed delay to be fast and use little CPU :).
+ * [09/17/99] - Shane Smit: Made all calculations based on the size of the
+ * window. Thus, it'll look the same at 100x100 as it does at
+ * 1600x1200 ( Only smaller :).
+ * [04/24/00] - Shane Smit: Revamped entire source code:
+ * Shade Bob movement is calculated very differently.
+ * Base color can be any color now.
+ */
+
+
+#include <math.h>
+#include "screenhack.h"
+
+/* #define VERBOSE */
+
+static const char *shadebobs_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*degrees: 0", /* default: Automatic degree calculation */
+ "*color: random",
+ "*count: 4",
+ "*cycles: 10",
+ "*ncolors: 64", /* changing this doesn't work particularly well */
+ "*delay: 10000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec shadebobs_options [] = {
+ { "-degrees", ".degrees", XrmoptionSepArg, 0 },
+ { "-color", ".color", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-cycles", ".cycles", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+/* Ahem. Chocolate is a flavor; not a food. Thank you */
+
+
+typedef struct
+{
+ signed char *anDeltaMap;
+ double nAngle, nAngleDelta, nAngleInc;
+ double nPosX, nPosY;
+} SShadeBob;
+
+struct state {
+ Display *dpy;
+ Window window;
+ unsigned short iDegreeCount;
+ double *anSinTable, *anCosTable;
+ unsigned short iWinWidth, iWinHeight;
+ unsigned short iWinCenterX, iWinCenterY;
+ char *sColor;
+ unsigned char iBobRadius, iBobDiameter;
+ unsigned char iVelocity;
+
+ unsigned long *aiColorVals;
+ signed short iColorCount;
+ int cycles;
+ XImage *pImage;
+ unsigned char nShadeBobCount, iShadeBob;
+ SShadeBob *aShadeBobs;
+ GC gc;
+ int delay;
+ int draw_i;
+};
+
+#define RANDOM() ((int) (random() & 0X7FFFFFFFL))
+
+
+
+static void ResetShadeBob( struct state *st, SShadeBob *pShadeBob )
+{
+ pShadeBob->nPosX = RANDOM() % st->iWinWidth;
+ pShadeBob->nPosY = RANDOM() % st->iWinHeight;
+ pShadeBob->nAngle = RANDOM() % st->iDegreeCount;
+ pShadeBob->nAngleDelta = ( RANDOM() % st->iDegreeCount ) - ( st->iDegreeCount / 2.0F );
+ pShadeBob->nAngleInc = pShadeBob->nAngleDelta / 50.0F;
+ if( pShadeBob->nAngleInc == 0.0F )
+ pShadeBob->nAngleInc = ( pShadeBob->nAngleDelta > 0.0F ) ? 0.0001F : -0.0001F;
+}
+
+
+static void InitShadeBob( struct state *st, SShadeBob *pShadeBob, Bool bDark )
+{
+ double nDelta;
+ int iWidth, iHeight;
+
+ if( ( pShadeBob->anDeltaMap = calloc( st->iBobDiameter * st->iBobDiameter, sizeof(char) ) ) == NULL )
+ {
+ fprintf( stderr, "%s: Could not allocate Delta Map!\n", progname );
+ return;
+ }
+
+ for( iHeight=-st->iBobRadius; iHeight<st->iBobRadius; iHeight++ )
+ for( iWidth=-st->iBobRadius; iWidth<st->iBobRadius; iWidth++ )
+ {
+ nDelta = 9 - ( ( sqrt( pow( iWidth+0.5, 2 ) + pow( iHeight+0.5, 2 ) ) / st->iBobRadius ) * 8 );
+ if( nDelta < 0 ) nDelta = 0;
+ if( bDark ) nDelta = -nDelta;
+ pShadeBob->anDeltaMap[ ( iWidth + st->iBobRadius ) * st->iBobDiameter + iHeight + st->iBobRadius ] = (char)nDelta;
+ }
+
+ ResetShadeBob( st, pShadeBob );
+}
+
+
+/* A delta is calculated, and the shadebob turns at an increment. When the delta
+ * falls to 0, a new delta and increment are calculated. */
+static void MoveShadeBob( struct state *st, SShadeBob *pShadeBob )
+{
+ pShadeBob->nAngle += pShadeBob->nAngleInc;
+ pShadeBob->nAngleDelta -= pShadeBob->nAngleInc;
+
+ /* Since it can happen that nAngle < 0 and nAngle + iDegreeCount >= iDegreeCount
+ on floating point, we set some marginal value.
+ */
+ if( pShadeBob->nAngle + 0.5 >= st->iDegreeCount ) pShadeBob->nAngle -= st->iDegreeCount;
+ else if( pShadeBob->nAngle < -0.5 ) pShadeBob->nAngle += st->iDegreeCount;
+
+ if( ( pShadeBob->nAngleInc>0.0F && pShadeBob->nAngleDelta<pShadeBob->nAngleInc ) ||
+ ( pShadeBob->nAngleInc<=0.0F && pShadeBob->nAngleDelta>pShadeBob->nAngleInc ) )
+ {
+ pShadeBob->nAngleDelta = ( RANDOM() % st->iDegreeCount ) - ( st->iDegreeCount / 2.0F );
+ pShadeBob->nAngleInc = pShadeBob->nAngleDelta / 50.0F;
+ if( pShadeBob->nAngleInc == 0.0F )
+ pShadeBob->nAngleInc = ( pShadeBob->nAngleDelta > 0.0F ) ? 0.0001F : -0.0001F;
+ }
+
+ pShadeBob->nPosX = ( st->anSinTable[ (int)pShadeBob->nAngle ] * st->iVelocity ) + pShadeBob->nPosX;
+ pShadeBob->nPosY = ( st->anCosTable[ (int)pShadeBob->nAngle ] * st->iVelocity ) + pShadeBob->nPosY;
+
+ /* This wraps it around the screen. */
+ if( pShadeBob->nPosX >= st->iWinWidth ) pShadeBob->nPosX -= st->iWinWidth;
+ else if( pShadeBob->nPosX < 0 ) pShadeBob->nPosX += st->iWinWidth;
+
+ if( pShadeBob->nPosY >= st->iWinHeight ) pShadeBob->nPosY -= st->iWinHeight;
+ else if( pShadeBob->nPosY < 0 ) pShadeBob->nPosY += st->iWinHeight;
+}
+
+
+static void Execute( struct state *st, SShadeBob *pShadeBob )
+{
+ unsigned long iColor;
+ short iColorVal;
+ int iPixelX, iPixelY;
+ unsigned int iWidth, iHeight;
+
+ MoveShadeBob( st, pShadeBob );
+
+ for( iHeight=0; iHeight<st->iBobDiameter; iHeight++ )
+ {
+ iPixelY = pShadeBob->nPosY + iHeight;
+ if( iPixelY >= st->iWinHeight ) iPixelY -= st->iWinHeight;
+
+ for( iWidth=0; iWidth<st->iBobDiameter; iWidth++ )
+ {
+ iPixelX = pShadeBob->nPosX + iWidth;
+ if( iPixelX >= st->iWinWidth ) iPixelX -= st->iWinWidth;
+
+ iColor = XGetPixel( st->pImage, iPixelX, iPixelY );
+
+ /* FIXME: Here is a loop I'd love to take out. */
+ for( iColorVal=0; iColorVal<st->iColorCount; iColorVal++ )
+ if( st->aiColorVals[ iColorVal ] == iColor )
+ break;
+
+ iColorVal += pShadeBob->anDeltaMap[ iWidth * st->iBobDiameter + iHeight ];
+ if( iColorVal >= st->iColorCount ) iColorVal = st->iColorCount - 1;
+ if( iColorVal < 0 ) iColorVal = 0;
+
+ XPutPixel( st->pImage, iPixelX, iPixelY, st->aiColorVals[ iColorVal ] );
+ }
+ }
+
+ /* FIXME: if it's next to the top or left sides of screen this will break. However, it's not noticable. */
+ XPutImage( st->dpy, st->window, st->gc, st->pImage,
+ pShadeBob->nPosX, pShadeBob->nPosY, pShadeBob->nPosX, pShadeBob->nPosY, st->iBobDiameter, st->iBobDiameter );
+}
+
+
+static void CreateTables( struct state *st, unsigned int nDegrees )
+{
+ double nRadian;
+ unsigned int iDegree;
+ st->anSinTable = calloc( nDegrees, sizeof(double) );
+ st->anCosTable = calloc( nDegrees, sizeof(double) );
+
+ for( iDegree=0; iDegree<nDegrees; iDegree++ )
+ {
+ nRadian = ( (double)(2*iDegree) / (double)nDegrees ) * M_PI;
+ st->anSinTable[ iDegree ] = sin( nRadian );
+ st->anCosTable[ iDegree ] = cos( nRadian );
+ }
+}
+
+
+static unsigned long * SetPalette(struct state *st )
+{
+ XWindowAttributes XWinAttribs;
+ XColor Color, *aColors;
+ signed short iColor;
+ float nHalfColors;
+
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ Color.red = RANDOM() % 0xFFFF;
+ Color.green = RANDOM() % 0xFFFF;
+ Color.blue = RANDOM() % 0xFFFF;
+
+ if( strcasecmp( st->sColor, "random" ) && !XParseColor( st->dpy, XWinAttribs.colormap, st->sColor, &Color ) )
+ fprintf( stderr, "%s: color %s not found in database. Choosing to random...\n", progname, st->sColor );
+
+#ifdef VERBOSE
+ printf( "%s: Base color (RGB): <%d, %d, %d>\n", progname, Color.red, Color.green, Color.blue );
+#endif /* VERBOSE */
+
+ st->iColorCount = get_integer_resource(st->dpy, "ncolors", "Integer" );
+ if( st->iColorCount < 2 ) st->iColorCount = 2;
+ if( st->iColorCount > 255 ) st->iColorCount = 255;
+
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+
+ for( iColor=0; iColor<st->iColorCount; iColor++ )
+ {
+ nHalfColors = st->iColorCount / 2.0F;
+ /* Black -> Base Color */
+ if( iColor < (st->iColorCount/2) )
+ {
+ aColors[ iColor ].red = ( Color.red / nHalfColors ) * iColor;
+ aColors[ iColor ].green = ( Color.green / nHalfColors ) * iColor;
+ aColors[ iColor ].blue = ( Color.blue / nHalfColors ) * iColor;
+ }
+ /* Base Color -> White */
+ else
+ {
+ aColors[ iColor ].red = ( ( ( 0xFFFF - Color.red ) / nHalfColors ) * ( iColor - nHalfColors ) ) + Color.red;
+ aColors[ iColor ].green = ( ( ( 0xFFFF - Color.green ) / nHalfColors ) * ( iColor - nHalfColors ) ) + Color.green;
+ aColors[ iColor ].blue = ( ( ( 0xFFFF - Color.blue ) / nHalfColors ) * ( iColor - nHalfColors ) ) + Color.blue;
+ }
+
+ if( !XAllocColor( st->dpy, XWinAttribs.colormap, &aColors[ iColor ] ) )
+ {
+ /* start all over with less colors */
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, iColor, 0 );
+ free( aColors );
+ free( st->aiColorVals );
+ st->iColorCount--;
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+ iColor = -1;
+ }
+ else
+ st->aiColorVals[ iColor ] = aColors[ iColor ].pixel;
+ }
+
+ free( aColors );
+
+ XSetWindowBackground( st->dpy, st->window, st->aiColorVals[ 0 ] );
+
+ return st->aiColorVals;
+}
+
+
+static void Initialize( struct state *st )
+{
+ XGCValues gcValues;
+ XWindowAttributes XWinAttribs;
+ /*int iBitsPerPixel;*/
+
+ /* Create the Image for drawing */
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+#if 0
+ /* Find the preferred bits-per-pixel. (jwz) */
+ {
+ int i, pfvc = 0;
+ XPixmapFormatValues *pfv = XListPixmapFormats( st->dpy, &pfvc );
+ for( i=0; i<pfvc; i++ )
+ if( pfv[ i ].depth == XWinAttribs.depth )
+ {
+ iBitsPerPixel = pfv[ i ].bits_per_pixel;
+ break;
+ }
+ if( pfv )
+ XFree (pfv);
+ }
+#endif
+
+ /* Create the GC. */
+ st->gc = XCreateGC( st->dpy, st->window, 0, &gcValues );
+
+ st->pImage = XCreateImage( st->dpy, XWinAttribs.visual, XWinAttribs.depth, ZPixmap, 0, NULL,
+ XWinAttribs.width, XWinAttribs.height, 8 /*BitmapPad( st->dpy )*/, 0 );
+ st->pImage->data = calloc((st->pImage)->bytes_per_line, (st->pImage)->height);
+
+ st->iWinWidth = XWinAttribs.width;
+ st->iWinHeight = XWinAttribs.height;
+
+ /* These are precalculations used in Execute(). */
+ st->iBobDiameter = ( ( st->iWinWidth < st->iWinHeight ) ? st->iWinWidth : st->iWinHeight ) / 25;
+ st->iBobRadius = st->iBobDiameter / 2;
+#ifdef VERBOSE
+ printf( "%s: Bob Diameter = %d\n", progname, st->iBobDiameter );
+#endif
+
+ st->iWinCenterX = ( XWinAttribs.width / 2 ) - st->iBobRadius;
+ st->iWinCenterY = ( XWinAttribs.height / 2 ) - st->iBobRadius;
+
+ st->iVelocity = ( ( st->iWinWidth < st->iWinHeight ) ? st->iWinWidth : st->iWinHeight ) / 150;
+
+ /* Create the Sin and Cosine lookup tables. */
+ st->iDegreeCount = get_integer_resource(st->dpy, "degrees", "Integer" );
+ if( st->iDegreeCount == 0 ) st->iDegreeCount = ( XWinAttribs.width / 6 ) + 400;
+ else if( st->iDegreeCount < 90 ) st->iDegreeCount = 90;
+ else if( st->iDegreeCount > 5400 ) st->iDegreeCount = 5400;
+ CreateTables( st, st->iDegreeCount );
+#ifdef VERBOSE
+ printf( "%s: Using a %d degree circle.\n", progname, st->iDegreeCount );
+#endif /* VERBOSE */
+
+ /* Get the base color. */
+ st->sColor = get_string_resource(st->dpy, "color", "Color" );
+}
+
+
+static void *
+shadebobs_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+
+#ifdef VERBOSE
+ time_t nTime = time( NULL );
+ unsigned short iFrame = 0;
+#endif /* VERBOSE */
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->nShadeBobCount = get_integer_resource(st->dpy, "count", "Integer" );
+ if( st->nShadeBobCount > 64 ) st->nShadeBobCount = 64;
+ if( st->nShadeBobCount < 1 ) st->nShadeBobCount = 1;
+
+ if( ( st->aShadeBobs = calloc( st->nShadeBobCount, sizeof(SShadeBob) ) ) == NULL )
+ {
+ fprintf( stderr, "%s: Could not allocate %d ShadeBobs\n", progname, st->nShadeBobCount );
+ abort();
+ }
+#ifdef VERBOSE
+ printf( "%s: Allocated %d ShadeBobs\n", progname, st->nShadeBobCount );
+#endif /* VERBOSE */
+
+ Initialize( st );
+
+ for( st->iShadeBob=0; st->iShadeBob<st->nShadeBobCount; st->iShadeBob++ )
+ InitShadeBob( st, &st->aShadeBobs[ st->iShadeBob ], st->iShadeBob % 2 );
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer" );
+ st->cycles = get_integer_resource(st->dpy, "cycles", "Integer" ) * st->iDegreeCount;
+
+ st->draw_i = 99999999;
+ return st;
+}
+
+static unsigned long
+shadebobs_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if( st->draw_i++ >= st->cycles )
+ {
+ XWindowAttributes XWinAttribs;
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ st->draw_i = 0;
+#if 0
+ memset( st->pImage->data, 0, st->pImage->bytes_per_line * st->pImage->height );
+#else
+ {
+ /* fill the image with the actual value of the black pixel, not 0. */
+ unsigned long black = BlackPixelOfScreen (XWinAttribs.screen);
+ int x, y;
+ for (y = 0; y < XWinAttribs.height; y++)
+ for (x = 0; x < XWinAttribs.width; x++)
+ XPutPixel (st->pImage, x, y, black);
+ }
+#endif
+
+ for( st->iShadeBob=0; st->iShadeBob<st->nShadeBobCount; st->iShadeBob++ )
+ ResetShadeBob( st, &st->aShadeBobs[ st->iShadeBob ] );
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, st->iColorCount, 0 );
+ free( st->aiColorVals );
+ st->aiColorVals = SetPalette( st );
+ XClearWindow( st->dpy, st->window );
+ }
+
+ for( st->iShadeBob=0; st->iShadeBob<st->nShadeBobCount; st->iShadeBob++ )
+ Execute( st, &st->aShadeBobs[ st->iShadeBob ] );
+
+ return st->delay;
+}
+
+static void
+shadebobs_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+shadebobs_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+shadebobs_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free( st->anSinTable );
+ free( st->anCosTable );
+ /* free( st->pImage->data ); */
+ XDestroyImage( st->pImage );
+ for( st->iShadeBob=0; st->iShadeBob<st->nShadeBobCount; st->iShadeBob++ )
+ free( st->aShadeBobs[ st->iShadeBob ].anDeltaMap );
+ free( st->aShadeBobs );
+ free( st->aiColorVals );
+}
+
+
+XSCREENSAVER_MODULE ("ShadeBobs", shadebobs)
+
+/* End of Module - "shadebobs.c" */
+
+/* vim: ts=4
+ */
diff --git a/hacks/shadebobs.man b/hacks/shadebobs.man
new file mode 100644
index 0000000..e98905e
--- /dev/null
+++ b/hacks/shadebobs.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+shadebobs - oscillating vapor trails.
+.SH SYNOPSIS
+.B shadebobs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-ncolors \fInumber\fP]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+This draws smoothly-shaded oscillating oval patterns, that look something
+like vapor trails or neon tubes.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-count \fInumber\fP
+Count. 0 - 20. Default: 4.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.005 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+Duration. 0 - 100. Default: 10.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Shane Smit. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Shane Smit.
diff --git a/hacks/sierpinski.c b/hacks/sierpinski.c
new file mode 100644
index 0000000..ceaca2b
--- /dev/null
+++ b/hacks/sierpinski.c
@@ -0,0 +1,213 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* sierpinski --- Sierpinski's triangle fractal */
+
+#if 0
+static const char sccsid[] = "@(#)sierpinski.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Desmond Daignault
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Dots initially appear where they "should not". Later they get
+ * "focused". This is correct behavior.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 18-Sep-1997: 3D version Antti Kuntsi <kuntsi@iki.fi>.
+ * 20-May-1997: Changed the name tri to sierpinski for more compatiblity
+ * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
+ * 05-Sep-1996: Desmond Daignault Datatimes Incorporated
+ * <tekdd@dtol.datatimes.com> .
+ */
+
+#ifdef STANDALONE
+# define MODE_sierpinski
+# define DEFAULTS "*delay: 400000 \n" \
+ "*count: 2000 \n" \
+ "*cycles: 100 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ "*lowrez: True \n" \
+
+# define BRIGHT_COLORS
+# define release_sierpinski 0
+# define reshape_sierpinski 0
+# define sierpinski_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_sierpinski
+
+ENTRYPOINT ModeSpecOpt sierpinski_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct sierpinski_description =
+{"sierpinski", "init_sierpinski", "draw_sierpinski", (char *) NULL,
+ "refresh_sierpinski", "init_sierpinski", "free_sierpinski", &sierpinski_opts,
+ 400000, 2000, 100, 1, 64, 1.0, "",
+ "Shows Sierpinski's triangle", 0, NULL};
+
+#endif
+
+#define MAXCORNERS 4
+
+typedef struct {
+ int width, height;
+ int time;
+ int px, py;
+ int total_npoints;
+ int corners;
+ int npoints[MAXCORNERS];
+ unsigned long colors[MAXCORNERS];
+ XPoint *pointBuffer[MAXCORNERS];
+ XPoint vertex[MAXCORNERS];
+} sierpinskistruct;
+
+static sierpinskistruct *tris = (sierpinskistruct *) NULL;
+
+static void
+startover(ModeInfo * mi)
+{
+ int j;
+ sierpinskistruct *sp = &tris[MI_SCREEN(mi)];
+
+ if (MI_NPIXELS(mi) > 2) {
+ if (sp->corners == 3) {
+ sp->colors[0] = (NRAND(MI_NPIXELS(mi)));
+ sp->colors[1] = (sp->colors[0] + MI_NPIXELS(mi) / 7 +
+ NRAND(2 * MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+ sp->colors[2] = (sp->colors[0] + 4 * MI_NPIXELS(mi) / 7 +
+ NRAND(2 * MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+ } else if (sp->corners == 4) {
+ sp->colors[0] = (NRAND(MI_NPIXELS(mi)));
+ sp->colors[1] = (sp->colors[0] + MI_NPIXELS(mi) / 7 +
+ NRAND(MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+ sp->colors[2] = (sp->colors[0] + 3 * MI_NPIXELS(mi) / 7 +
+ NRAND(MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+ sp->colors[3] = (sp->colors[0] + 5 * MI_NPIXELS(mi) / 7 +
+ NRAND(MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+ } else {
+ (void) fprintf(stderr, "colors not set for %d corners\n", sp->corners);
+ }
+ }
+ for (j = 0; j < sp->corners; j++) {
+ sp->vertex[j].x = NRAND(sp->width);
+ sp->vertex[j].y = NRAND(sp->height);
+ }
+ sp->px = NRAND(sp->width);
+ sp->py = NRAND(sp->height);
+ sp->time = 0;
+
+ MI_CLEARWINDOW(mi);
+}
+
+ENTRYPOINT void
+free_sierpinski(ModeInfo * mi)
+{
+ sierpinskistruct *sp = &tris[MI_SCREEN(mi)];
+ int corner;
+
+ for (corner = 0; corner < MAXCORNERS; corner++)
+ if (sp->pointBuffer[corner] != NULL) {
+ (void) free((void *) sp->pointBuffer[corner]);
+ sp->pointBuffer[corner] = (XPoint *) NULL;
+ }
+}
+
+ENTRYPOINT void
+init_sierpinski(ModeInfo * mi)
+{
+ int i;
+ sierpinskistruct *sp;
+
+ MI_INIT (mi, tris);
+ sp = &tris[MI_SCREEN(mi)];
+
+ sp->width = MI_WIDTH(mi);
+ sp->height = MI_HEIGHT(mi);
+
+ sp->total_npoints = MI_COUNT(mi);
+ if (sp->total_npoints < 1)
+ sp->total_npoints = 1;
+ sp->corners = MI_SIZE(mi);
+ if (sp->corners < 3 || sp->corners > 4) {
+ sp->corners = (int) (LRAND() & 1) + 3;
+ }
+ for (i = 0; i < sp->corners; i++) {
+ if (!sp->pointBuffer[i])
+ if ((sp->pointBuffer[i] = (XPoint *) malloc(sp->total_npoints *
+ sizeof (XPoint))) == NULL) {
+ free_sierpinski(mi);
+ return;
+ }
+ }
+ startover(mi);
+}
+
+ENTRYPOINT void
+draw_sierpinski(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ XPoint *xp[MAXCORNERS];
+ int i, v;
+ sierpinskistruct *sp;
+
+ if (tris == NULL)
+ return;
+ sp = &tris[MI_SCREEN(mi)];
+ if (sp->pointBuffer[0] == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ for (i = 0; i < sp->corners; i++)
+ xp[i] = sp->pointBuffer[i];
+ for (i = 0; i < sp->total_npoints; i++) {
+ v = NRAND(sp->corners);
+ sp->px = (sp->px + sp->vertex[v].x) / 2;
+ sp->py = (sp->py + sp->vertex[v].y) / 2;
+ xp[v]->x = sp->px;
+ xp[v]->y = sp->py;
+ xp[v]++;
+ sp->npoints[v]++;
+ }
+ for (i = 0; i < sp->corners; i++) {
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, sp->colors[i]));
+ XDrawPoints(display, MI_WINDOW(mi), gc, sp->pointBuffer[i], sp->npoints[i],
+ CoordModeOrigin);
+ sp->npoints[i] = 0;
+ }
+ if (++sp->time >= MI_CYCLES(mi))
+ startover(mi);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_sierpinski(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Sierpinski", sierpinski)
+
+#endif /* MODE_sierpinski */
diff --git a/hacks/sierpinski.man b/hacks/sierpinski.man
new file mode 100644
index 0000000..665ecad
--- /dev/null
+++ b/hacks/sierpinski.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+sierpinski - draws Sierpinski triangle fractals
+.SH SYNOPSIS
+.B sierpinski
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIsierpinski\fP program draws Sierpinski triangle fractals.
+.SH OPTIONS
+.I sierpinski
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Desmond Daignault.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Desmond Daignault <tekdd@dtol.datatimes.com>, 05-Sep-96. (Original
+xlock version was called tri.c.)
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97. (Renamed to sierpinski.)
diff --git a/hacks/slidescreen.c b/hacks/slidescreen.c
new file mode 100644
index 0000000..c5656f3
--- /dev/null
+++ b/hacks/slidescreen.c
@@ -0,0 +1,510 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+enum { DOWN = 0, LEFT, UP, RIGHT };
+enum { VERTICAL, HORIZONTAL };
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int grid_size;
+ int pix_inc;
+ int hole_x, hole_y;
+ int bitmap_w, bitmap_h;
+ int xoff, yoff;
+ int grid_w, grid_h;
+ int delay, delay2;
+ int duration;
+ GC gc;
+ unsigned long fg, bg;
+ int max_width, max_height;
+ int early_i;
+
+ int draw_rnd, draw_i;
+ int draw_x, draw_y, draw_ix, draw_iy, draw_dx, draw_dy;
+ int draw_dir, draw_w, draw_h, draw_size, draw_inc;
+ int draw_last;
+ int draw_initted;
+
+ time_t start_time;
+ async_load_state *img_loader;
+};
+
+
+static void *
+slidescreen_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+ long gcflags;
+
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+
+ st->max_width = xgwa.width;
+ st->max_height = xgwa.height;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ st->grid_size = get_integer_resource (st->dpy, "gridSize", "Integer");
+ st->pix_inc = get_integer_resource (st->dpy, "pixelIncrement", "Integer");
+
+ if (xgwa.width > 2560) st->grid_size *= 2; /* Retina displays */
+
+
+ /* Don't let the grid be smaller than 5x5 */
+ while (st->grid_size > xgwa.width / 5)
+ st->grid_size /= 2;
+ while (st->grid_size > xgwa.height / 5)
+ st->grid_size /= 2;
+
+ if (st->delay < 0) st->delay = 0;
+ if (st->delay2 < 0) st->delay2 = 0;
+ if (st->duration < 1) st->duration = 1;
+ if (st->pix_inc < 1) st->pix_inc = 1;
+ if (st->grid_size < 1) st->grid_size = 1;
+
+
+ {
+ XColor fgc, bgc;
+ char *fgs = get_string_resource(st->dpy, "background", "Background");
+ char *bgs = get_string_resource(st->dpy, "foreground", "Foreground");
+ Bool fg_ok, bg_ok;
+ if (!XParseColor (st->dpy, xgwa.colormap, fgs, &fgc))
+ XParseColor (st->dpy, xgwa.colormap, "black", &bgc);
+ if (!XParseColor (st->dpy, xgwa.colormap, bgs, &bgc))
+ XParseColor (st->dpy, xgwa.colormap, "gray", &fgc);
+
+ fg_ok = XAllocColor (st->dpy, xgwa.colormap, &fgc);
+ bg_ok = XAllocColor (st->dpy, xgwa.colormap, &bgc);
+
+ /* If we weren't able to allocate the two colors we want from the
+ colormap (which is likely if the screen has been grabbed on an
+ 8-bit SGI visual -- don't ask) then just go through the map
+ and find the closest color to the ones we wanted, and use those
+ pixels without actually allocating them.
+ */
+ if (fg_ok)
+ st->fg = fgc.pixel;
+ else
+ st->fg = 0;
+
+ if (bg_ok)
+ st->bg = bgc.pixel;
+ else
+ st->bg = 1;
+
+#ifndef HAVE_JWXYZ
+ if (!fg_ok || bg_ok)
+ {
+ int i;
+ unsigned long fgd = ~0;
+ unsigned long bgd = ~0;
+ int max = visual_cells (xgwa.screen, xgwa.visual);
+ XColor *all = (XColor *) calloc(sizeof (*all), max);
+ for (i = 0; i < max; i++)
+ {
+ all[i].flags = DoRed|DoGreen|DoBlue;
+ all[i].pixel = i;
+ }
+ XQueryColors (st->dpy, xgwa.colormap, all, max);
+ for(i = 0; i < max; i++)
+ {
+ long rd, gd, bd;
+ unsigned long dd;
+ if (!fg_ok)
+ {
+ rd = (all[i].red >> 8) - (fgc.red >> 8);
+ gd = (all[i].green >> 8) - (fgc.green >> 8);
+ bd = (all[i].blue >> 8) - (fgc.blue >> 8);
+ if (rd < 0) rd = -rd;
+ if (gd < 0) gd = -gd;
+ if (bd < 0) bd = -bd;
+ dd = (rd << 1) + (gd << 2) + bd;
+ if (dd < fgd)
+ {
+ fgd = dd;
+ st->fg = all[i].pixel;
+ if (dd == 0)
+ fg_ok = True;
+ }
+ }
+
+ if (!bg_ok)
+ {
+ rd = (all[i].red >> 8) - (bgc.red >> 8);
+ gd = (all[i].green >> 8) - (bgc.green >> 8);
+ bd = (all[i].blue >> 8) - (bgc.blue >> 8);
+ if (rd < 0) rd = -rd;
+ if (gd < 0) gd = -gd;
+ if (bd < 0) bd = -bd;
+ dd = (rd << 1) + (gd << 2) + bd;
+ if (dd < bgd)
+ {
+ bgd = dd;
+ st->bg = all[i].pixel;
+ if (dd == 0)
+ bg_ok = True;
+ }
+ }
+
+ if (fg_ok && bg_ok)
+ break;
+ }
+ XFree(all);
+ }
+#endif /* !HAVE_JWXYZ */
+ }
+
+ gcv.foreground = st->fg;
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ gcflags = GCForeground |GCFunction;
+ if (use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+ st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
+
+ return st;
+}
+
+static void
+draw_grid (struct state *st)
+{
+ int i;
+ Drawable d;
+ int border;
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ border = get_integer_resource (st->dpy, "internalBorderWidth",
+ "InternalBorderWidth");
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->bitmap_w = xgwa.width;
+ st->bitmap_h = xgwa.height;
+
+ if (xgwa.width < 50 || xgwa.height < 50) /* tiny window */
+ {
+ int s = (xgwa.width < xgwa.height ? xgwa.width : xgwa.height);
+ border = 1;
+ st->grid_size = s / 2;
+ if (st->grid_size < 16) st->grid_size = 16;
+ if (st->bitmap_w < st->grid_size*2) st->bitmap_w = st->grid_size*2;
+ if (st->bitmap_h < st->grid_size*2) st->bitmap_h = st->grid_size*2;
+ }
+
+ if (xgwa.width > 2560) border *= 2; /* Retina displays */
+
+ st->grid_w = st->bitmap_w / st->grid_size;
+ st->grid_h = st->bitmap_h / st->grid_size;
+ st->hole_x = random () % st->grid_w;
+ st->hole_y = random () % st->grid_h;
+ st->xoff = (st->bitmap_w - (st->grid_w * st->grid_size)) / 2;
+ st->yoff = (st->bitmap_h - (st->grid_h * st->grid_size)) / 2;
+
+ d = st->window;
+
+ st->early_i = -10;
+ st->draw_last = -1;
+
+ if (border)
+ {
+ int half = border/2;
+ int half2 = (border & 1 ? half+1 : half);
+ XSetForeground(st->dpy, st->gc, st->bg);
+ for (i = 0; i < st->bitmap_w; i += st->grid_size)
+ {
+ int j;
+ for (j = 0; j < st->bitmap_h; j += st->grid_size)
+ XDrawRectangle (st->dpy, d, st->gc,
+ st->xoff+i+half2, st->yoff+j+half2,
+ st->grid_size-border-1, st->grid_size-border-1);
+ }
+
+ XSetForeground(st->dpy, st->gc, st->fg);
+ for (i = 0; i <= st->bitmap_w; i += st->grid_size)
+ XFillRectangle (st->dpy, d, st->gc, st->xoff+i-half, st->yoff, border, st->bitmap_h);
+ for (i = 0; i <= st->bitmap_h; i += st->grid_size)
+ XFillRectangle (st->dpy, d, st->gc, st->xoff, st->yoff+i-half, st->bitmap_w, border);
+ }
+
+ if (st->xoff)
+ {
+ XFillRectangle (st->dpy, d, st->gc, 0, 0, st->xoff, st->bitmap_h);
+ XFillRectangle (st->dpy, d, st->gc, st->bitmap_w - st->xoff, 0, st->xoff, st->bitmap_h);
+ }
+ if (st->yoff)
+ {
+ XFillRectangle (st->dpy, d, st->gc, 0, 0, st->bitmap_w, st->yoff);
+ XFillRectangle (st->dpy, d, st->gc, 0, st->bitmap_h - st->yoff, st->bitmap_w, st->yoff);
+ }
+}
+
+
+static int
+slidescreen_draw_early (struct state *st)
+{
+ while (st->early_i < 0)
+ {
+ st->early_i++;
+ return 1;
+ }
+
+ /* for (early_i = 0; early_i < grid_size; early_i += pix_inc) */
+ {
+ XPoint points [3];
+ points[0].x = st->xoff + st->grid_size * st->hole_x;
+ points[0].y = st->yoff + st->grid_size * st->hole_y;
+ points[1].x = points[0].x + st->grid_size;
+ points[1].y = points[0].y;
+ points[2].x = points[0].x;
+ points[2].y = points[0].y + st->early_i;
+ XFillPolygon (st->dpy, st->window, st->gc, points, 3, Convex, CoordModeOrigin);
+
+ points[1].x = points[0].x;
+ points[1].y = points[0].y + st->grid_size;
+ points[2].x = points[0].x + st->early_i;
+ points[2].y = points[0].y + st->grid_size;
+ XFillPolygon (st->dpy, st->window, st->gc, points, 3, Convex, CoordModeOrigin);
+
+ points[0].x = points[1].x + st->grid_size;
+ points[0].y = points[1].y;
+ points[2].x = points[0].x;
+ points[2].y = points[0].y - st->early_i;
+ XFillPolygon (st->dpy, st->window, st->gc, points, 3, Convex, CoordModeOrigin);
+
+ points[1].x = points[0].x;
+ points[1].y = points[0].y - st->grid_size;
+ points[2].x = points[1].x - st->early_i;
+ points[2].y = points[1].y;
+ XFillPolygon (st->dpy, st->window, st->gc, points, 3, Convex, CoordModeOrigin);
+ }
+
+ st->early_i += st->pix_inc;
+ if (st->early_i < st->grid_size)
+ return 1;
+
+ XFillRectangle (st->dpy, st->window, st->gc,
+ st->xoff + st->grid_size * st->hole_x,
+ st->yoff + st->grid_size * st->hole_y,
+ st->grid_size, st->grid_size);
+ return 0;
+}
+
+
+static unsigned long
+slidescreen_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->delay;
+
+ /* this code is a total kludge, but who cares, it works... */
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+ st->start_time = time ((time_t *) 0);
+ draw_grid (st);
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ st->draw_initted = 0;
+ return st->delay;
+ }
+
+ if (! st->draw_initted)
+ {
+ if (!slidescreen_draw_early (st))
+ {
+ st->draw_initted = 1;
+ return st->delay2;
+ }
+ else
+ return st->delay;
+ }
+
+ if (st->draw_i == 0)
+ {
+ if (st->draw_last == -1) st->draw_last = random () % 2;
+
+ /* alternate between horizontal and vertical slides */
+ /* note that draw_dir specifies the direction the _hole_ moves, not the tiles */
+ if (st->draw_last == VERTICAL) {
+ if (((st->grid_w > 1) ? st->draw_rnd = random () % (st->grid_w - 1) : 0)
+ < st->hole_x) {
+ st->draw_dx = -1; st->draw_dir = LEFT; st->hole_x -= st->draw_rnd;
+ } else {
+ st->draw_dx = 1; st->draw_dir = RIGHT; st->draw_rnd -= st->hole_x;
+ }
+ st->draw_dy = 0; st->draw_w = st->draw_size = st->draw_rnd + 1; st->draw_h = 1;
+ st->draw_last = HORIZONTAL;
+ } else {
+ if (((st->grid_h > 1) ? st->draw_rnd = random () % (st->grid_h - 1) : 0)
+ < st->hole_y) {
+ st->draw_dy = -1; st->draw_dir = UP; st->hole_y -= st->draw_rnd;
+ } else {
+ st->draw_dy = 1; st->draw_dir = DOWN; st->draw_rnd -= st->hole_y;
+ }
+ st->draw_dx = 0; st->draw_h = st->draw_size = st->draw_rnd + 1; st->draw_w = 1;
+ st->draw_last = VERTICAL;
+ }
+
+ st->draw_ix = st->draw_x = st->xoff + (st->hole_x + st->draw_dx) * st->grid_size;
+ st->draw_iy = st->draw_y = st->yoff + (st->hole_y + st->draw_dy) * st->grid_size;
+ st->draw_inc = st->pix_inc;
+
+ }
+
+ /* for (draw_i = 0; draw_i < grid_size; draw_i += draw_inc) */
+ {
+ int fx, fy, tox, toy;
+ if (st->draw_inc + st->draw_i > st->grid_size)
+ st->draw_inc = st->grid_size - st->draw_i;
+ tox = st->draw_x - st->draw_dx * st->draw_inc;
+ toy = st->draw_y - st->draw_dy * st->draw_inc;
+
+ fx = (st->draw_x < 0 ? 0 : st->draw_x > st->max_width ? st->max_width : st->draw_x);
+ fy = (st->draw_y < 0 ? 0 : st->draw_y > st->max_height ? st->max_height : st->draw_y);
+ tox = (tox < 0 ? 0 : tox > st->max_width ? st->max_width : tox);
+ toy = (toy < 0 ? 0 : toy > st->max_height ? st->max_height : toy);
+
+ XCopyArea (st->dpy, st->window, st->window, st->gc,
+ fx, fy,
+ st->grid_size * st->draw_w, st->grid_size * st->draw_h,
+ tox, toy);
+
+ st->draw_x -= st->draw_dx * st->draw_inc;
+ st->draw_y -= st->draw_dy * st->draw_inc;
+ switch (st->draw_dir)
+ {
+ case DOWN: XFillRectangle (st->dpy, st->window, st->gc,
+ st->draw_ix, st->draw_y + st->grid_size * st->draw_h, st->grid_size * st->draw_w, st->draw_iy - st->draw_y);
+ break;
+ case LEFT: XFillRectangle (st->dpy, st->window, st->gc, st->draw_ix, st->draw_iy, st->draw_x - st->draw_ix, st->grid_size * st->draw_h);
+ break;
+ case UP: XFillRectangle (st->dpy, st->window, st->gc, st->draw_ix, st->draw_iy, st->grid_size * st->draw_w, st->draw_y - st->draw_iy);
+ break;
+ case RIGHT: XFillRectangle (st->dpy, st->window, st->gc,
+ st->draw_x + st->grid_size * st->draw_w, st->draw_iy, st->draw_ix - st->draw_x, st->grid_size * st->draw_h);
+ break;
+ }
+ }
+
+ st->draw_i += st->draw_inc;
+ if (st->draw_i >= st->grid_size)
+ {
+ st->draw_i = 0;
+
+ switch (st->draw_dir)
+ {
+ case DOWN: st->hole_y += st->draw_size; break;
+ case LEFT: st->hole_x--; break;
+ case UP: st->hole_y--; break;
+ case RIGHT: st->hole_x += st->draw_size; break;
+ }
+
+ this_delay = st->delay2;
+ }
+
+ return this_delay;
+}
+
+static void
+slidescreen_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->max_width = w;
+ st->max_height = h;
+ if (! st->img_loader) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ }
+}
+
+static Bool
+slidescreen_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+slidescreen_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (dpy, st->gc);
+ free (st);
+}
+
+
+
+static const char *slidescreen_defaults [] = {
+ "*dontClearRoot: True",
+ "*fpsSolid: true",
+
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+
+ ".background: Black",
+ ".foreground: #BEBEBE",
+ "*gridSize: 70",
+ "*pixelIncrement: 10",
+ "*internalBorderWidth: 4",
+ "*delay: 50000",
+ "*delay2: 1000000",
+ "*duration: 120",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec slidescreen_options [] = {
+ { "-grid-size", ".gridSize", XrmoptionSepArg, 0 },
+ { "-ibw", ".internalBorderWidth", XrmoptionSepArg, 0 },
+ { "-increment", ".pixelIncrement", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("SlideScreen", slidescreen)
diff --git a/hacks/slidescreen.man b/hacks/slidescreen.man
new file mode 100644
index 0000000..6ab4fde
--- /dev/null
+++ b/hacks/slidescreen.man
@@ -0,0 +1,97 @@
+.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
+.SH NAME
+slidescreen - permute the screen image like an 8-puzzle
+.SH SYNOPSIS
+.B slidescreen
+[\-display \fIhost:display.screen\fP]
+[\-background \fIcolor\fP]
+[\-grid-size \fIpixels\fP]
+[\-ibw \fIpixels\fP]
+[\-increment \fIpixels\fP]
+[\-delay \fIusecs\fP]
+[\-delay2 \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIslidescreen\fP program takes an image, divides it into
+a grid, deletes a random square of that grid, and then randomly slides
+one of the neighbors of this "hole" into the hole (and repeat.)
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I slidescreen
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-grid-size \fIpixels\fP
+The size of the grid cells. Default 70 pixels.
+.TP 8
+.B \-ibw \fIpixels\fP
+The size of the "gutter" between grid cells. Default 4 pixel.
+.TP 8
+.B \-increment \fIpixels\fP
+How many pixels by which a piece should be moved when sliding to a new
+location. Default 10 pixels.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation of
+the motion of each segment. Default 50000, which is 0.05 seconds. This
+is closely related to the \fI\-increment\fP parameter.
+.TP 8
+.B \-delay2 \fImicroseconds\fP
+How much of a delay should be introduced between the end of the motion of
+one segment and the beginning of the motion of another. Default 1000000,
+which is one second.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 3-dec-92.
diff --git a/hacks/slip.c b/hacks/slip.c
new file mode 100644
index 0000000..04a3063
--- /dev/null
+++ b/hacks/slip.c
@@ -0,0 +1,375 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* slip --- lots of slipping blits */
+
+#if 0
+static const char sccsid[] = "@(#)slip.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1992 by Scott Draves <spot@cs.cmu.edu>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
+ * 01-Dec-1995: Patched for VMS <joukj@hrem.stm.tudelft.nl>
+ */
+
+#ifdef STANDALONE
+# define MODE_slip
+# define DEFAULTS "*delay: 50000 \n" \
+ "*count: 35 \n" \
+ "*cycles: 50 \n" \
+ "*ncolors: 200 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define free_slip 0
+# define release_slip 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_slip
+
+ENTRYPOINT ModeSpecOpt slip_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct slip_description =
+{"slip", "init_slip", "draw_slip", (char *) NULL,
+ "init_slip", "init_slip", (char *) NULL, &slip_opts,
+ 50000, 35, 50, 1, 64, 1.0, "",
+ "Shows slipping blits", 0, NULL};
+
+#endif
+
+typedef struct {
+ int width, height;
+ int nblits_remaining;
+ int blit_width, blit_height;
+ int mode;
+ int first_time;
+ int backwards;
+ short lasthalf;
+ int stage;
+ unsigned long r;
+ Bool image_loading_p;
+} slipstruct;
+static slipstruct *slips = (slipstruct *) NULL;
+
+static short
+halfrandom(slipstruct *sp, int mv)
+{
+ unsigned long r;
+
+ if (sp->lasthalf) {
+ r = sp->lasthalf;
+ sp->lasthalf = 0;
+ } else {
+ r = LRAND();
+ sp->lasthalf = (short) (r >> 16);
+ }
+ return r % mv;
+}
+
+static int
+erandom(slipstruct *sp, int mv)
+{
+ int res;
+
+ if (0 == sp->stage) {
+ sp->r = LRAND();
+ sp->stage = 7;
+ }
+ res = (int) (sp->r & 0xf);
+ sp->r = sp->r >> 4;
+ sp->stage--;
+ if (res & 8)
+ return res & mv;
+ else
+ return -(res & mv);
+}
+
+#ifdef STANDALONE
+static void
+image_loaded_cb (Screen *screen, Window w, Drawable d,
+ const char *name, XRectangle *geom,
+ void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ slipstruct *sp = &slips[MI_SCREEN(mi)];
+ Display *dpy = DisplayOfScreen (screen);
+ XCopyArea (dpy, d, w, mi->gc, 0, 0,
+ sp->width, sp->height, 0, 0);
+ XFreePixmap (dpy, d);
+ sp->image_loading_p = False;
+}
+#endif /* STANDALONE */
+
+static Bool
+prepare_screen(ModeInfo * mi, slipstruct * sp)
+{
+
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int i, n, w = sp->width / 20;
+ int not_solid = halfrandom(sp, 10);
+
+ sp->backwards = (int) (LRAND() & 1); /* jwz: go the other way sometimes */
+
+ if (sp->first_time) {
+ XClearWindow (display, MI_WINDOW(mi));
+ n = 300;
+ } else if (!sp->image_loading_p && !halfrandom(sp, 10)) {
+ sp->first_time = 1;
+ sp->nblits_remaining = 0;
+ MI_CLEARWINDOW(mi);
+ return False;
+ } else {
+ if (halfrandom(sp, 5))
+ return True;
+ if (halfrandom(sp, 5))
+ n = 100;
+ else
+ n = 2000;
+ }
+
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, halfrandom(sp, MI_NPIXELS(mi))));
+ else if (halfrandom(sp, 2))
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ else
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+
+ for (i = 0; i < n; i++) {
+ int ww = ((w / 2) + halfrandom(sp, MAX(w, 1)));
+
+ if (not_solid) {
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, halfrandom(sp, MI_NPIXELS(mi))));
+ else if (halfrandom(sp, 2))
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ else
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ }
+ XFillRectangle(display, MI_WINDOW(mi), gc,
+ halfrandom(sp, MAX(sp->width - ww, 1)),
+ halfrandom(sp, MAX(sp->height - ww, 1)),
+ ww, ww);
+ }
+ sp->first_time = 0;
+
+
+#ifdef STANDALONE /* jwz -- sometimes hack the desktop image! */
+ if (!sp->image_loading_p &&
+ (1||halfrandom(sp, 2) == 0)) {
+ /* Load it into a pixmap so that the "Loading" message and checkerboard
+ don't show up on the window -- we keep running while the image is
+ in progress... */
+ Pixmap p = XCreatePixmap (MI_DISPLAY(mi), MI_WINDOW(mi),
+ sp->width, sp->height, mi->xgwa.depth);
+ sp->image_loading_p = True;
+ load_image_async (ScreenOfDisplay (MI_DISPLAY(mi), 0/*####MI_SCREEN(mi)*/),
+ MI_WINDOW(mi), p, image_loaded_cb, mi);
+ }
+#endif
+
+ return True;
+}
+
+static int
+quantize(double d)
+{
+ int i = (int) floor(d);
+ double f = d - i;
+
+ if ((LRAND() & 0xff) < f * 0xff)
+ i++;
+ return i;
+}
+
+ENTRYPOINT void
+reshape_slip (ModeInfo * mi, int w, int h)
+{
+ slipstruct *sp = &slips[MI_SCREEN(mi)];
+ sp->width = w;
+ sp->height = h;
+ sp->blit_width = sp->width / 25;
+ sp->blit_height = sp->height / 25;
+
+ sp->mode = 0;
+ sp->nblits_remaining = 0;
+}
+
+ENTRYPOINT void
+init_slip (ModeInfo * mi)
+{
+ slipstruct *sp;
+
+ MI_INIT (mi, slips);
+ sp = &slips[MI_SCREEN(mi)];
+
+ sp->nblits_remaining = 0;
+ sp->mode = 0;
+ sp->first_time = 1;
+
+ /* no "NoExpose" events from XCopyArea wanted */
+ XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
+
+ reshape_slip (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+ENTRYPOINT void
+draw_slip (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int timer;
+ slipstruct *sp;
+
+ if (slips == NULL)
+ return;
+ sp = &slips[MI_SCREEN(mi)];
+
+ timer = MI_COUNT(mi) * MI_CYCLES(mi);
+
+ while (timer--) {
+ int xi = halfrandom(sp, MAX(sp->width - sp->blit_width, 1));
+ int yi = halfrandom(sp, MAX(sp->height - sp->blit_height, 1));
+ double x, y, dx = 0, dy = 0, t, s1, s2;
+
+ if (0 == sp->nblits_remaining--) {
+ static const int lut[] = {0, 0, 0, 1, 1, 1, 2};
+
+ if (!prepare_screen(mi, sp))
+ break;
+ MI_IS_DRAWN(mi) = True;
+ sp->nblits_remaining = MI_COUNT(mi) *
+ (2000 + halfrandom(sp, 1000) + halfrandom(sp, 1000));
+ if (sp->mode == 2)
+ sp->mode = halfrandom(sp, 2);
+ else
+ sp->mode = lut[halfrandom(sp, 7)];
+ }
+ x = (2 * xi + sp->blit_width) / (double) sp->width - 1;
+ y = (2 * yi + sp->blit_height) / (double) sp->height - 1;
+
+ /* (x,y) is in biunit square */
+ switch (sp->mode) {
+ case 0: /* rotor */
+ dx = x;
+ dy = y;
+
+ if (dy < 0) {
+ dy += 0.04;
+ if (dy > 0)
+ dy = 0.00;
+ }
+ if (dy > 0) {
+ dy -= 0.04;
+ if (dy < 0)
+ dy = 0.00;
+ }
+ t = dx * dx + dy * dy + 1e-10;
+ s1 = 2 * dx * dx / t - 1;
+ s2 = 2 * dx * dy / t;
+ dx = s1 * 5;
+ dy = s2 * 5;
+
+ if (sp->backwards) { /* jwz: go the other way sometimes */
+ dx = -dx;
+ dy = -dy;
+ }
+ break;
+ case 1: /* shuffle */
+ dx = erandom(sp, 3);
+ dy = erandom(sp, 3);
+ break;
+ case 2: /* explode */
+ dx = x * 3;
+ dy = y * 3;
+ break;
+ }
+ {
+ int qx = xi + quantize(dx), qy = yi + quantize(dy);
+ int wrap;
+
+ if (qx < 0 || qy < 0 ||
+ qx >= sp->width - sp->blit_width ||
+ qy >= sp->height - sp->blit_height)
+ continue;
+
+/*-
+Seems to cause problems using Exceed
+with PseudoColor
+X Error of failed request: BadGC (invalid GC parameter)
+with TrueColor
+X Error of failed request: BadDrawable (invalid Pixmap or Window parameter)
+ Major opcode of failed request: 62 (X_CopyArea)
+ */
+ XCopyArea(display, window, window, gc, xi, yi,
+ sp->blit_width, sp->blit_height,
+ qx, qy);
+ switch (sp->mode) {
+ case 0:
+ /* wrap */
+ wrap = sp->width - (2 * sp->blit_width);
+ if (qx > wrap ) {
+ XCopyArea(display, window, window, gc, qx, qy,
+ sp->blit_width, sp->blit_height,
+ qx - wrap, qy);
+ }
+ if (qx < 2 * sp->blit_width) {
+ XCopyArea(display, window, window, gc, qx, qy,
+ sp->blit_width, sp->blit_height,
+ qx + wrap, qy);
+ }
+ wrap = sp->height - (2 * sp->blit_height);
+ if (qy > wrap) {
+ XCopyArea(display, window, window, gc, qx, qy,
+ sp->blit_width, sp->blit_height,
+ qx, qy - wrap);
+ }
+ if (qy < 2 * sp->blit_height) {
+ XCopyArea(display, window, window, gc, qx, qy,
+ sp->blit_width, sp->blit_height,
+ qx, qy + wrap);
+ }
+ break;
+ case 1:
+ case 2:
+ break;
+ }
+ }
+ }
+}
+
+ENTRYPOINT Bool
+slip_handle_event (ModeInfo *mi, XEvent *event)
+{
+ slipstruct *sp = &slips[MI_SCREEN(mi)];
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ sp->first_time = 1;
+ sp->nblits_remaining = 0;
+ return True;
+ }
+ return False;
+}
+
+XSCREENSAVER_MODULE ("Slip", slip)
+
+#endif /* MODE_slip */
diff --git a/hacks/slip.man b/hacks/slip.man
new file mode 100644
index 0000000..ce4e110
--- /dev/null
+++ b/hacks/slip.man
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
+.SH NAME
+slip - sucks your screen into a jet engine
+.SH SYNOPSIS
+.B slip
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP]
+[\-iterations \fIinteger\fP] [\-points \fIinteger\fP]
+[\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIslip\fP program does lots of blits and chews up an image.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I slip
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-count \fIinteger\fP
+How many whooziwhatsis to generate. Default 35.
+.TP 8
+.B \-cycles \fIinteger\fP
+How long to frobnicate. Default 50.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long we should wait between drawing each step. Default 50000,
+or about 1/20th second.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Scott Draves.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Scott Graves <spot@cs.cmu.edu>.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/hacks/speedmine.c b/hacks/speedmine.c
new file mode 100644
index 0000000..17a3f2a
--- /dev/null
+++ b/hacks/speedmine.c
@@ -0,0 +1,1647 @@
+/* -*- Mode: C; c-basic-offset: 4; tab-width: 4 -*-
+ * speedmine, Copyright (C) 2001 Conrad Parker <conrad@deephackmode.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ * Written mostly over the Easter holiday, 2001. Psychedelic option due to
+ * a night at Home nightclub, Sydney. Three all-nighters of solid partying
+ * were involved in the week this hack was written.
+ *
+ * Happy Birthday to WierdArms (17 April) and Pat (18 April)
+ */
+
+/*
+ * Hacking notes
+ *
+ * This program generates a rectangular terrain grid and maps this onto
+ * a semi-circular tunnel. The terrain has length TERRAIN_LENGTH, which
+ * corresponds to length along the tunnel, and breadth TERRAIN_BREADTH,
+ * which corresponds to circumference around the tunnel. For each frame,
+ * the tunnel is perspective mapped onto a set of X and Y screen values.
+ *
+ * Throughout this code the following temporary variable names are used:
+ *
+ * i iterates along the tunnel in the direction of travel
+ * j iterates around the tunnel clockwise
+ * t iterates along the length of the perspective mapped values
+ * from the furthest to the nearest
+ *
+ * Thus, the buffers are used with these iterators:
+ *
+ * terrain[i][j] terrain map
+ * worldx[i][j], worldy[i][j] world coordinates (after wrapping)
+ * {x,y,z}curvature[i] tunnel curvature
+ * wideness[i] tunnel wideness
+ * bonuses[i] bonus values
+ *
+ * xvals[t][j], yvals[t][j] screen coordinates
+ * {min,max}{x,y}[t] bounding boxes of screen coords
+ */
+
+/* Define or undefine NDEBUG to turn assert and abort debugging off or on */
+/*#define NDEBUG*/
+/*#include <assert.h>*/
+#define assert(X)
+#define DEBUG_FLAG 0
+
+#include <math.h>
+
+#include "screenhack.h"
+#include "erase.h"
+
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+#define RAND(r) (int)(((r)>0)?(random() % (long)(r)): -(random() % (long)(-r)))
+
+#define SIGN3(a) ((a)>0?1:((a)<0?-1:0))
+
+#define MODULO(a,b) while ((a)<0) (a)+=(b); (a) %= (b);
+
+/* No. of shades of each color (ground, walls, bonuses) */
+#define MAX_COLORS 32
+
+
+
+#define FORWARDS 1
+#define BACKWARDS -1
+/* Apparently AIX's math.h bogusly defines `nearest' as a function,
+ in violation of the ANSI C spec. */
+#undef nearest
+#define nearest n3arest
+
+#define wireframe (st->wire_flag||st->wire_bonus>8||st->wire_bonus%2==1)
+#define effective_speed (st->direction*(st->speed+st->speed_bonus))
+
+/* No. of levels of interpolation, for perspective */
+#define INTERP 32
+
+/* These must be powers of 2 */
+#define TERRAIN_LENGTH 256
+#define TERRAIN_BREADTH 32
+
+/* total "perspective distance" of terrain */
+#define TERRAIN_PDIST (INTERP*TERRAIN_LENGTH)
+
+#define ROTS 1024
+#define TB_MUL (ROTS/TERRAIN_BREADTH)
+
+#define random_elevation() (st->terrain_flag?(random() % 200):0)
+#define random_curvature() (st->curviness>0.0?((double)(random() % 40)-20)*st->curviness:0.0)
+#define random_twist() (st->twistiness>0.0?((double)(random() % 40)-20)*st->twistiness:0.0)
+#define random_wideness() (st->widening_flag?(int)(random() % 1200):0)
+
+#define STEEL_ELEVATION 300
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Pixmap dbuf, stars_mask;
+ Colormap cmap;
+ Visual *visual;
+ Screen *screen;
+ unsigned int default_fg_pixel;
+ GC draw_gc, erase_gc, tunnelend_gc, stars_gc, stars_erase_gc;
+
+ int ncolors, nr_ground_colors, nr_wall_colors, nr_bonus_colors;
+ XColor ground_colors[MAX_COLORS], wall_colors[MAX_COLORS];
+ XColor bonus_colors[MAX_COLORS];
+ GC ground_gcs[MAX_COLORS], wall_gcs[MAX_COLORS], bonus_gcs[MAX_COLORS];
+
+ int be_wormy;
+
+ int width, height;
+ int delay;
+
+ int smoothness;
+ int verbose_flag;
+ int wire_flag;
+ int terrain_flag;
+ int widening_flag;
+ int bumps_flag;
+ int bonuses_flag;
+ int crosshair_flag;
+ int psychedelic_flag;
+
+ double maxspeed;
+
+ double thrust, gravity;
+
+ double vertigo;
+ double curviness;
+ double twistiness;
+
+ double pos;
+ double speed;
+ double accel;
+ double step;
+
+ int direction;
+
+ int pindex, nearest;
+ int flipped_at;
+ int xoffset, yoffset;
+
+ int bonus_bright;
+ int wire_bonus;
+
+ double speed_bonus;
+
+ int spin_bonus;
+ int backwards_bonus;
+
+ double sintab[ROTS], costab[ROTS];
+
+ int orientation;
+
+ int terrain[TERRAIN_LENGTH][TERRAIN_BREADTH];
+ double xcurvature[TERRAIN_LENGTH];
+ double ycurvature[TERRAIN_LENGTH];
+ double zcurvature[TERRAIN_LENGTH];
+ int wideness[TERRAIN_LENGTH];
+ int bonuses[TERRAIN_LENGTH];
+ int xvals[TERRAIN_LENGTH][TERRAIN_BREADTH];
+ int yvals[TERRAIN_LENGTH][TERRAIN_BREADTH];
+ double worldx[TERRAIN_LENGTH][TERRAIN_BREADTH];
+ double worldy[TERRAIN_LENGTH][TERRAIN_BREADTH];
+ int minx[TERRAIN_LENGTH], maxx[TERRAIN_LENGTH];
+ int miny[TERRAIN_LENGTH], maxy[TERRAIN_LENGTH];
+
+ int total_nframes;
+ int nframes;
+ double fps;
+ double fps_start, fps_end;
+ struct timeval start_time;
+
+ int rotation_offset;
+ int jamming;
+};
+
+/* a forward declaration ... */
+static void change_colors(struct state *st);
+
+
+
+/*
+ * get_time ()
+ *
+ * returns the total time elapsed since the beginning of the demo
+ */
+static double get_time(struct state *st) {
+ struct timeval t;
+ float f;
+#if GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&t, NULL);
+#else
+ gettimeofday(&t);
+#endif
+ t.tv_sec -= st->start_time.tv_sec;
+ f = ((double)t.tv_sec) + t.tv_usec*1e-6;
+ return f;
+}
+
+/*
+ * init_time ()
+ *
+ * initialises the timing structures
+ */
+static void init_time(struct state *st) {
+#if GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&st->start_time, NULL);
+#else
+ gettimeofday(&st->start_time);
+#endif
+ st->fps_start = get_time(st);
+}
+
+
+/*
+ * perspective()
+ *
+ * perspective map the world coordinates worldx[i][j], worldy[i][j] onto
+ * screen coordinates xvals[t][j], yvals[t][j]
+ */
+static void
+perspective (struct state *st)
+{
+ int i, j, jj, t=0, depth, view_pos;
+ int rotation_bias, r;
+ double xc=0.0, yc=0.0, zc=0.0;
+ double xcc=0.0, ycc=0.0, zcc=0.0;
+ double xx, yy;
+ double zfactor, zf;
+
+ zf = 8.0*28.0 / (double)(st->width*TERRAIN_LENGTH);
+ if (st->be_wormy) zf *= 3.0;
+
+ depth = TERRAIN_PDIST - INTERP + st->pindex;
+
+ view_pos = (st->nearest+3*TERRAIN_LENGTH/4)%TERRAIN_LENGTH;
+
+ st->xoffset += - st->xcurvature[view_pos]*st->curviness/8;
+ st->xoffset /= 2;
+
+ st->yoffset += - st->ycurvature[view_pos]*st->curviness/4;
+ st->yoffset /= 2;
+
+ st->rotation_offset += (int)((st->zcurvature[view_pos]-st->zcurvature[st->nearest])*ROTS/8);
+ st->rotation_offset /= 2;
+ rotation_bias = st->orientation + st->spin_bonus - st->rotation_offset;
+
+ if (st->bumps_flag) {
+ if (st->be_wormy) {
+ st->yoffset -= ((st->terrain[view_pos][TERRAIN_BREADTH/4] * st->width /(8*1600)));
+ rotation_bias += (st->terrain[view_pos][TERRAIN_BREADTH/4+2] -
+ st->terrain[view_pos][TERRAIN_BREADTH/4-2])/8;
+ } else {
+ st->yoffset -= ((st->terrain[view_pos][TERRAIN_BREADTH/4] * st->width /(2*1600)));
+ rotation_bias += (st->terrain[view_pos][TERRAIN_BREADTH/4+2] -
+ st->terrain[view_pos][TERRAIN_BREADTH/4-2])/16;
+ }
+ }
+
+ MODULO(rotation_bias, ROTS);
+
+ for (t=0; t < TERRAIN_LENGTH; t++) {
+ i = st->nearest + t; MODULO(i, TERRAIN_LENGTH);
+ xc += st->xcurvature[i]; yc += st->ycurvature[i]; zc += st->zcurvature[i];
+ xcc += xc; ycc += yc; zcc += zc;
+ st->maxx[i] = st->maxy[i] = 0;
+ st->minx[i] = st->width; st->miny[i] = st->height;
+ }
+
+ for (t=0; t < TERRAIN_LENGTH; t++) {
+ i = st->nearest - 1 - t; MODULO(i, TERRAIN_LENGTH);
+
+ zfactor = (double)depth* (12.0 - TERRAIN_LENGTH/8.0) * zf;
+ for (j=0; j < TERRAIN_BREADTH; j++) {
+ jj = st->direction * j; MODULO(jj, TERRAIN_BREADTH);
+ /* jwz: not totally sure if this is right, but it avoids div0 */
+ if (zfactor != 0) {
+ xx = (st->worldx[i][jj]-(st->vertigo*xcc))/zfactor;
+ yy = (st->worldy[i][j]-(st->vertigo*ycc))/zfactor;
+ } else {
+ xx = 0;
+ yy = 0;
+ }
+ r = rotation_bias + (int)(st->vertigo*zcc); MODULO(r, ROTS);
+
+ st->xvals[t][j] = st->xoffset + (st->width>>1) +
+ (int)(xx * st->costab[r] - yy * st->sintab[r]);
+ st->maxx[t] = MAX(st->maxx[t], st->xvals[t][j]);
+ st->minx[t] = MIN(st->minx[t], st->xvals[t][j]);
+
+ st->yvals[t][j] = st->yoffset + st->height/2 +
+ (int)(xx * st->sintab[r] + yy * st->costab[r]);
+ st->maxy[t] = MAX(st->maxy[t], st->yvals[t][j]);
+ st->miny[t] = MIN(st->miny[t], st->yvals[t][j]);
+ }
+ xcc -= xc; ycc -= yc; zcc -= zc;
+ xc -= st->xcurvature[i]; yc -= st->ycurvature[i]; zc -= st->zcurvature[i];
+ depth -= INTERP;
+ }
+}
+
+/*
+ * wrap_tunnel (start, end)
+ *
+ * wrap the terrain terrain[i][j] around the semi-circular tunnel function
+ *
+ * x' = x/2 * cos(theta) - (y-k) * x * sin(theta)
+ * y' = x/4 * sin(theta) + y * cos(theta)
+ *
+ * between i=start and i=end inclusive, producing world coordinates
+ * worldx[i][j], worldy[i][j]
+ */
+static void
+wrap_tunnel (struct state *st, int start, int end)
+{
+ int i, j, v;
+ double x, y;
+
+ assert (start < end);
+
+ for (i=start; i <= end; i++) {
+ for (j=0; j < TERRAIN_BREADTH; j++) {
+ x = j * (1.0/TERRAIN_BREADTH);
+ v = st->terrain[i][j];
+ y = (double)(v==STEEL_ELEVATION?200:v) - st->wideness[i] - 1200;
+
+ /* lower road */
+ if (j > TERRAIN_BREADTH/8 && j < 3*TERRAIN_BREADTH/8) y -= 300;
+
+ st->worldx[i][j] = x/2 * st->costab[j*TB_MUL] -
+ (y-st->height/4.0)*x*st->sintab[j*TB_MUL];
+ st->worldy[i][j] = x/4 * st->sintab[j*TB_MUL] +
+ y * st->costab[j*TB_MUL];
+ }
+ }
+}
+
+/*
+ * flip_direction()
+ *
+ * perform the state transitions and terrain transformation for the
+ * "look backwards/look forwards" bonus
+ */
+static void
+flip_direction (struct state *st)
+{
+ int i, ip, in, j, t;
+
+ st->direction = -st->direction;
+
+ st->bonus_bright = 20;
+
+ for (i=0; i < TERRAIN_LENGTH; i++) {
+ in = st->nearest + i; MODULO(in, TERRAIN_BREADTH);
+ ip = st->nearest - i; MODULO(ip, TERRAIN_BREADTH);
+ for (j=0; j < TERRAIN_BREADTH; j++) {
+ t = st->terrain[ip][j];
+ st->terrain[ip][j] = st->terrain[in][j];
+ st->terrain[in][j] = t;
+ }
+ }
+}
+
+/*
+ * generate_smooth (start, end)
+ *
+ * generate smooth terrain between i=start and i=end inclusive
+ */
+static void
+generate_smooth (struct state *st, int start, int end)
+{
+ int i,j, ii;
+
+ assert (start < end);
+
+ for (i=start; i <= end; i++) {
+ ii = i; MODULO(ii, TERRAIN_LENGTH);
+ for (j=0; j < TERRAIN_BREADTH; j++) {
+ st->terrain[i][j] = STEEL_ELEVATION;
+ }
+ }
+}
+
+/*
+ * generate_straight (start, end)
+ *
+ * zero the curvature and wideness between i=start and i=end inclusive
+ */
+static void
+generate_straight (struct state *st, int start, int end)
+{
+ int i,j, ii;
+
+ assert (start < end);
+
+ for (i=start; i <= end; i++) {
+ ii = i; MODULO(ii, TERRAIN_LENGTH);
+ for (j=0; j < TERRAIN_BREADTH; j++) {
+ st->xcurvature[ii] = 0;
+ st->ycurvature[ii] = 0;
+ st->zcurvature[ii] = 0;
+ st->wideness[ii] = 0;
+ }
+ }
+}
+
+/*
+ * int generate_terrain_value (v1, v2, v3, v4, w)
+ *
+ * generate terrain value near the average of v1, v2, v3, v4, with
+ * perturbation proportional to w
+ */
+static int
+generate_terrain_value (struct state *st, int v1, int v2, int v3, int v4, int w)
+{
+ int sum, ret;
+ int rval;
+
+ if (!st->terrain_flag) return 0;
+
+ sum = v1 + v2 + v3 + v4;
+
+ rval = w*sum/st->smoothness;
+ if (rval == 0) rval = 2;
+
+ ret = (sum/4 -(rval/2) + RAND(rval));
+
+ if (ret < -400 || ret > 400) {
+ ret = sum/4;
+ }
+
+ return ret;
+}
+
+/*
+ * generate_terrain (start, end, final)
+ *
+ * generate terrain[i][j] between i=start and i=end inclusive
+ *
+ * This is performed by successive subdivision of the terrain into
+ * rectangles of decreasing size. Subdivision continues until the
+ * the minimum width or height of these rectangles is 'final'; ie.
+ * final=1 indicates to subdivide as far as possible, final=2 indicates
+ * to stop one subdivision before that (leaving a checkerboard pattern
+ * uncalculated) etc.
+ */
+static void
+generate_terrain (struct state *st, int start, int end, int final)
+{
+ int i,j,w,l;
+ int ip, jp, in, jn; /* prev, next values */
+ int diff;
+
+ assert (start < end);
+ assert (start >= 0 && start < TERRAIN_LENGTH);
+ assert (end >= 0 && end < TERRAIN_LENGTH);
+
+ diff = end - start + 1;
+
+ st->terrain[end][0] = random_elevation();
+ st->terrain[end][TERRAIN_BREADTH/2] = random_elevation();
+
+ for (w= diff/2, l=TERRAIN_BREADTH/4;
+ w >= final || l >= final; w /= 2, l /= 2) {
+
+ if (w<1) w=1;
+ if (l<1) l=1;
+
+ for (i=start+w-1; i < end; i += (w*2)) {
+ ip = i-w; MODULO(ip, TERRAIN_LENGTH);
+ in = i+w; MODULO(in, TERRAIN_LENGTH);
+ for (j=l-1; j < TERRAIN_BREADTH; j += (l*2)) {
+ jp = j-1; MODULO(jp, TERRAIN_BREADTH);
+ jn = j+1; MODULO(jn, TERRAIN_BREADTH);
+ st->terrain[i][j] =
+ generate_terrain_value (st, st->terrain[ip][jp], st->terrain[in][jp],
+ st->terrain[ip][jn], st->terrain[in][jn], w);
+ }
+ }
+
+ for (i=start+(w*2)-1; i < end; i += (w*2)) {
+ ip = i-w; MODULO(ip, TERRAIN_LENGTH);
+ in = i+w; MODULO(in, TERRAIN_LENGTH);
+ for (j=l-1; j < TERRAIN_BREADTH; j += (l*2)) {
+ jp = j-1; MODULO(jp, TERRAIN_BREADTH);
+ jn = j+1; MODULO(jn, TERRAIN_BREADTH);
+ st->terrain[i][j] =
+ generate_terrain_value (st, st->terrain[ip][j], st->terrain[in][j],
+ st->terrain[i][jp], st->terrain[i][jn], w);
+ }
+ }
+
+ for (i=start+w-1; i < end; i += (w*2)) {
+ ip = i-w; MODULO(ip, TERRAIN_LENGTH);
+ in = i+w; MODULO(in, TERRAIN_LENGTH);
+ for (j=2*l-1; j < TERRAIN_BREADTH; j += (l*2)) {
+ jp = j-1; MODULO(jp, TERRAIN_BREADTH);
+ jn = j+1; MODULO(jn, TERRAIN_BREADTH);
+ st->terrain[i][j] =
+ generate_terrain_value (st, st->terrain[ip][j], st->terrain[in][j],
+ st->terrain[i][jp], st->terrain[i][jn], w);
+ }
+ }
+ }
+}
+
+/*
+ * double generate_curvature_value (v1, v2, w)
+ *
+ * generate curvature value near the average of v1 and v2, with perturbation
+ * proportional to w
+ */
+static double
+generate_curvature_value (double v1, double v2, int w)
+{
+ double sum, avg, diff, ret;
+ int rval;
+
+ assert (!isnan(v1) && !isnan(v2));
+
+ sum = v1+v2;
+ avg = sum/2.0;
+
+ diff = MIN(v1 - avg, v2 - avg);
+
+ rval = (int)diff * w;
+ if (rval == 0.0) return avg;
+
+ ret = (avg -((double)rval)/500.0 + ((double)RAND(rval))/1000.0);
+
+ assert (!isnan(ret));
+
+ return ret;
+}
+
+/*
+ * generate_curves (start, end)
+ *
+ * generate xcurvature[i], ycurvature[i], zcurvature[i] and wideness[i]
+ * between start and end inclusive
+ */
+static void
+generate_curves (struct state *st, int start, int end)
+{
+ int i, diff, ii, in, ip, w;
+
+ assert (start < end);
+
+ diff = end - start + 1; MODULO (diff, TERRAIN_LENGTH);
+
+ if (random() % 100 == 0)
+ st->xcurvature[end] = 30 * random_curvature();
+ else if (random() % 10 == 0)
+ st->xcurvature[end] = 20 * random_curvature();
+ else
+ st->xcurvature[end] = 10 * random_curvature();
+
+ if (random() % 50 == 0)
+ st->ycurvature[end] = 20 * random_curvature();
+ else if (random() % 25 == 0)
+ st->ycurvature[end] = 30 * random_curvature();
+ else
+ st->ycurvature[end] = 10 * random_curvature();
+
+ if (random() % 3 == 0)
+ st->zcurvature[end] = random_twist();
+ else
+ st->zcurvature[end] =
+ generate_curvature_value (st->zcurvature[end], random_twist(), 1);
+
+ if (st->be_wormy)
+ st->wideness[end] = random_wideness();
+ else
+ st->wideness[end] =
+ generate_curvature_value (st->wideness[end], random_wideness(), 1);
+
+ for (w=diff/2; w >= 1; w /= 2) {
+ for (i=start+w-1; i < end; i+=(w*2)) {
+ ii = i; MODULO (ii, TERRAIN_LENGTH);
+ ip = i-w; MODULO (ip, TERRAIN_LENGTH);
+ in = i+w; MODULO (in, TERRAIN_LENGTH);
+ st->xcurvature[ii] =
+ generate_curvature_value (st->xcurvature[ip], st->xcurvature[in], w);
+ st->ycurvature[ii] =
+ generate_curvature_value (st->ycurvature[ip], st->ycurvature[in], w);
+ st->zcurvature[ii] =
+ generate_curvature_value (st->zcurvature[ip], st->zcurvature[in], w);
+ st->wideness[ii] =
+ generate_curvature_value (st->wideness[ip], st->wideness[in], w);
+ }
+ }
+}
+
+/*
+ * do_bonus ()
+ *
+ * choose a random bonus and perform its state transition
+ */
+static void
+do_bonus (struct state *st)
+{
+ st->bonus_bright = 20;
+
+ if (st->jamming > 0) {
+ st->jamming--;
+ st->nearest -= 2; MODULO(st->nearest, TERRAIN_LENGTH);
+ return;
+ }
+
+ if (st->psychedelic_flag) change_colors(st);
+
+ switch (random() % 7) {
+ case 0: /* switch to or from wireframe */
+ st->wire_bonus = (st->wire_bonus?0:300);
+ break;
+ case 1: /* speedup */
+ st->speed_bonus = 40.0;
+ break;
+ case 2:
+ st->spin_bonus += ROTS;
+ break;
+ case 3:
+ st->spin_bonus -= ROTS;
+ break;
+ case 4: /* look backwards / look forwards */
+ st->flipped_at = st->nearest;
+ flip_direction (st);
+ st->backwards_bonus = (st->backwards_bonus?0:10);
+ break;
+ case 5:
+ change_colors(st);
+ break;
+ case 6: /* jam against the bonus a few times; deja vu! */
+ st->nearest -= 2; MODULO(st->nearest, TERRAIN_LENGTH);
+ st->jamming = 3;
+ break;
+ default:
+ assert(0);
+ break;
+ }
+}
+
+/*
+ * check_bonus ()
+ *
+ * check if a bonus has been passed in the last frame, and handle it
+ */
+static void
+check_bonuses (struct state *st)
+{
+ int i, ii, start, end;
+
+ if (!st->bonuses_flag) return;
+
+ if (st->step >= 0.0) {
+ start = st->nearest; end = st->nearest + (int)floor(st->step);
+ } else {
+ end = st->nearest; start = st->nearest + (int)floor(st->step);
+ }
+
+ if (st->be_wormy) {
+ start += TERRAIN_LENGTH/4;
+ end += TERRAIN_LENGTH/4;
+ }
+
+ for (i=start; i < end; i++) {
+ ii = i; MODULO(ii, TERRAIN_LENGTH);
+ if (st->bonuses[ii] == 1) do_bonus (st);
+ }
+}
+
+/*
+ * decrement_bonuses (double time_per_frame)
+ *
+ * decrement timers associated with bonuses
+ */
+static void
+decrement_bonuses (struct state *st, double time_per_frame)
+{
+ if (!st->bonuses_flag) return;
+
+ if (st->bonus_bright > 0) st->bonus_bright-=4;
+ if (st->wire_bonus > 0) st->wire_bonus--;
+ if (st->speed_bonus > 0) st->speed_bonus -= 2.0;
+
+ if (st->spin_bonus > 10) st->spin_bonus -= (int)(st->step*13.7);
+ else if (st->spin_bonus < -10) st->spin_bonus += (int)(st->step*11.3);
+
+ if (st->backwards_bonus > 1) st->backwards_bonus--;
+ else if (st->backwards_bonus == 1) {
+ st->nearest += 2*(MAX(st->flipped_at, st->nearest) - MIN(st->flipped_at,st->nearest));
+ MODULO(st->nearest, TERRAIN_LENGTH);
+ flip_direction (st);
+ st->backwards_bonus = 0;
+ }
+}
+
+/*
+ * set_bonuses (start, end)
+ *
+ * choose if to and where to set a bonus between i=start and i=end inclusive
+ */
+static void
+set_bonuses (struct state *st, int start, int end)
+{
+ int i, diff, ii;
+
+ if (!st->bonuses_flag) return;
+
+ assert (start < end);
+
+ diff = end - start;
+
+ for (i=start; i <= end; i++) {
+ ii = i; if (ii>=TERRAIN_LENGTH) ii -= TERRAIN_LENGTH;
+ st->bonuses[ii] = 0;
+ }
+ if (random() % 4 == 0) {
+ i = start + RAND(diff-3);
+ ii = i; if (ii>=TERRAIN_LENGTH) ii -= TERRAIN_LENGTH;
+ st->bonuses[ii] = 2; /* marker */
+ ii = i+3; if (ii>=TERRAIN_LENGTH) ii -= TERRAIN_LENGTH;
+ st->bonuses[ii] = 1; /* real thing */
+ }
+}
+
+/*
+ * regenerate_terrain ()
+ *
+ * regenerate a portion of the terrain map of length TERRAIN_LENGTH/4 iff
+ * we just passed between two quarters of the terrain.
+ *
+ * choose the kind of terrain to produce, produce it and wrap the tunnel
+ */
+static void
+regenerate_terrain (struct state *st)
+{
+ int start, end;
+ int passed;
+
+ passed = st->nearest % (TERRAIN_LENGTH/4);
+
+ if (st->speed == 0.0 ||
+ (st->speed > 0.0 && passed > (int)st->step) ||
+ (st->speed < 0.0 && (TERRAIN_LENGTH/4)-passed > (int)fabs(st->step))) {
+
+ return;
+ }
+
+ end = st->nearest - passed - 1; MODULO(end, TERRAIN_LENGTH);
+ start = end - TERRAIN_LENGTH/4 + 1; MODULO(start, TERRAIN_LENGTH);
+
+ if (DEBUG_FLAG) printf ("Regenerating [%d - %d]\n", start, end);
+
+ set_bonuses (st, start, end);
+
+ switch (random() % 64) {
+ case 0:
+ case 1:
+ generate_terrain (st, start, end, 1);
+ generate_smooth (st, start,
+ start + TERRAIN_LENGTH/8 + (random() % TERRAIN_LENGTH/8));
+ break;
+ case 2:
+ generate_smooth (st, start, end);
+ generate_terrain (st, start, end, 4); break;
+ case 3:
+ generate_smooth (st, start, end);
+ generate_terrain (st, start, end, 2); break;
+ default:
+ generate_terrain (st, start, end, 1);
+ }
+
+ if (random() % 16 == 0) {
+ generate_straight (st, start, end);
+ } else {
+ generate_curves (st, start, end);
+ }
+
+ wrap_tunnel (st, start, end);
+}
+
+/*
+ * init_terrain ()
+ *
+ * initialise the terrain map for the beginning of the demo
+ */
+static void
+init_terrain (struct state *st)
+{
+ int i, j;
+
+ for (i=0; i < TERRAIN_LENGTH; i++) {
+ for (j=0; j < TERRAIN_BREADTH; j++) {
+ st->terrain[i][j] = 0;
+ }
+ }
+
+ st->terrain[TERRAIN_LENGTH-1][0] = - (random() % 300);
+ st->terrain[TERRAIN_LENGTH-1][TERRAIN_BREADTH/2] = - (random() % 300);
+
+ generate_smooth (st, 0, TERRAIN_LENGTH-1);
+ generate_terrain (st, 0, TERRAIN_LENGTH/4 -1, 4);
+ generate_terrain (st, TERRAIN_LENGTH/4, TERRAIN_LENGTH/2 -1, 2);
+ generate_terrain (st, TERRAIN_LENGTH/2, 3*TERRAIN_LENGTH/4 -1, 1);
+ generate_smooth (st, 3*TERRAIN_LENGTH/4, TERRAIN_LENGTH-1);
+}
+
+/*
+ * init_curves ()
+ *
+ * initialise the curvatures and wideness for the beginning of the demo.
+ */
+static void
+init_curves (struct state *st)
+{
+ int i;
+
+ for (i=0; i < TERRAIN_LENGTH-1; i++) {
+ st->xcurvature[i] = 0.0;
+ st->ycurvature[i] = 0.0;
+ st->zcurvature[i] = 0.0;
+ }
+
+ st->xcurvature[TERRAIN_LENGTH-1] = random_curvature();
+ st->ycurvature[TERRAIN_LENGTH-1] = random_curvature();
+ st->zcurvature[TERRAIN_LENGTH-1] = random_twist();
+
+ generate_straight (st, 0, TERRAIN_LENGTH/4-1);
+ generate_curves (st, TERRAIN_LENGTH/4, TERRAIN_LENGTH/2-1);
+ generate_curves (st, TERRAIN_LENGTH/2, 3*TERRAIN_LENGTH/4-1);
+ generate_straight (st, 3*TERRAIN_LENGTH/4, TERRAIN_LENGTH-1);
+
+}
+
+/*
+ * render_quads (dpy, d, t, dt, i)
+ *
+ * renders the quadrilaterals from perspective depth t to t+dt.
+ * i is passed as a hint, where i corresponds to t as asserted.
+ */
+static void
+render_quads (struct state *st, Drawable d, int t, int dt, int i)
+{
+ int j, t2, j2, in;
+ int index;
+ XPoint points[4];
+ GC gc;
+
+ assert (i == (st->nearest - (t + dt) + TERRAIN_LENGTH) % TERRAIN_LENGTH);
+
+ in = i + 1; MODULO(in, TERRAIN_LENGTH);
+
+ for (j=0; j < TERRAIN_BREADTH; j+=dt) {
+ t2 = t+dt; if (t2 >= TERRAIN_LENGTH) t2 -= TERRAIN_LENGTH;
+ j2 = j+dt; if (j2 >= TERRAIN_BREADTH) j2 -= TERRAIN_BREADTH;
+ points[0].x = st->xvals[t][j]; points[0].y = st->yvals[t][j];
+ points[1].x = st->xvals[t2][j]; points[1].y = st->yvals[t2][j];
+ points[2].x = st->xvals[t2][j2]; points[2].y = st->yvals[t2][j2];
+ points[3].x = st->xvals[t][j2]; points[3].y = st->yvals[t][j2];
+
+ index = st->bonus_bright + st->ncolors/3 +
+ t*(t*INTERP + st->pindex) * st->ncolors /
+ (3*TERRAIN_LENGTH*TERRAIN_PDIST);
+ if (!wireframe) {
+ index += (int)((points[0].y - points[3].y) / 8);
+ index += (int)((st->worldx[i][j] - st->worldx[in][j]) / 40);
+ index += (int)((st->terrain[in][j] - st->terrain[i][j]) / 100);
+ }
+ if (st->be_wormy && st->psychedelic_flag) index += st->ncolors/4;
+
+ if (st->ncolors > MAX_COLORS) abort();
+ index = MIN (index, st->ncolors-1);
+ index = MAX (index, 0);
+
+ if (st->bonuses[i]) {
+ XSetClipMask (st->dpy, st->bonus_gcs[index], None);
+ }
+
+ if (wireframe) {
+ if (st->bonuses[i]) gc = st->bonus_gcs[index];
+ else gc = st->ground_gcs[index];
+ XDrawLines (st->dpy, d, gc, points, 4, CoordModeOrigin);
+ } else {
+ if (st->bonuses[i])
+ gc = st->bonus_gcs[index];
+ else if ((st->direction>0 && j < TERRAIN_BREADTH/8) ||
+ (j > TERRAIN_BREADTH/8 && j < 3*TERRAIN_BREADTH/8-1) ||
+ (st->direction < 0 && j > 3*TERRAIN_BREADTH/8-1 &&
+ j < TERRAIN_BREADTH/2) ||
+ st->terrain[i][j] == STEEL_ELEVATION ||
+ st->wideness[in] - st->wideness[i] > 200)
+ gc = st->ground_gcs[index];
+ else
+ gc = st->wall_gcs[index];
+
+ XFillPolygon (st->dpy, d, gc, points, 4, Nonconvex, CoordModeOrigin);
+ }
+ }
+}
+
+/*
+ * render_pentagons (dpy, d, t, dt, i)
+ *
+ * renders the pentagons from perspective depth t to t+dt.
+ * i is passed as a hint, where i corresponds to t as asserted.
+ */
+static void
+render_pentagons (struct state *st, Drawable d, int t, int dt, int i)
+{
+ int j, t2, j2, j3, in;
+ int index;
+ XPoint points[5];
+ GC gc;
+
+ assert (i == (st->nearest -t + TERRAIN_LENGTH) % TERRAIN_LENGTH);
+
+ in = i + 1; MODULO(in, TERRAIN_LENGTH);
+
+ for (j=0; j < TERRAIN_BREADTH; j+=dt*2) {
+ t2 = t+(dt*2); if (t2 >= TERRAIN_LENGTH) t2 -= TERRAIN_LENGTH;
+ j2 = j+dt; if (j2 >= TERRAIN_BREADTH) j2 -= TERRAIN_BREADTH;
+ j3 = j+dt+dt; if (j3 >= TERRAIN_BREADTH) j3 -= TERRAIN_BREADTH;
+ points[0].x = st->xvals[t][j]; points[0].y = st->yvals[t][j];
+ points[1].x = st->xvals[t2][j]; points[1].y = st->yvals[t2][j];
+ points[2].x = st->xvals[t2][j2]; points[2].y = st->yvals[t2][j2];
+ points[3].x = st->xvals[t2][j3]; points[3].y = st->yvals[t2][j3];
+ points[4].x = st->xvals[t][j3]; points[4].y = st->yvals[t][j3];
+
+ index = st->bonus_bright + st->ncolors/3 +
+ t*(t*INTERP + st->pindex) * st->ncolors /
+ (3*TERRAIN_LENGTH*TERRAIN_PDIST);
+ if (!wireframe) {
+ index += (int)((points[0].y - points[3].y) / 8);
+ index += (int)((st->worldx[i][j] - st->worldx[in][j]) / 40);
+ index += (int)((st->terrain[in][j] - st->terrain[i][j]) / 100);
+ }
+ if (st->be_wormy && st->psychedelic_flag) index += st->ncolors/4;
+
+ index = MIN (index, st->ncolors-1);
+ index = MAX (index, 0);
+
+ if (st->bonuses[i]) {
+ XSetClipMask (st->dpy, st->bonus_gcs[index], None);
+ }
+
+ if (wireframe) {
+ if (st->bonuses[i]) gc = st->bonus_gcs[index];
+ else gc = st->ground_gcs[index];
+ XDrawLines (st->dpy, d, gc, points, 5, CoordModeOrigin);
+ } else {
+ if (st->bonuses[i])
+ gc = st->bonus_gcs[index];
+ else if (j < TERRAIN_BREADTH/8 ||
+ (j > TERRAIN_BREADTH/8 && j < 3*TERRAIN_BREADTH/8-1) ||
+ st->terrain[i][j] == STEEL_ELEVATION ||
+ st->wideness[in] - st->wideness[i] > 200)
+ gc = st->ground_gcs[index];
+ else
+ gc = st->wall_gcs[index];
+
+ XFillPolygon (st->dpy, d, gc, points, 5, Complex, CoordModeOrigin);
+ }
+ }
+}
+
+/*
+ * render_block (dpy, d, gc, t)
+ *
+ * render a filled polygon at perspective depth t using the given GC
+ */
+static void
+render_block (struct state *st, Drawable d, GC gc, int t)
+{
+ int i;
+
+ XPoint erase_points[TERRAIN_BREADTH/2];
+
+ for (i=0; i < TERRAIN_BREADTH/2; i++) {
+ erase_points[i].x = st->xvals[t][i*2];
+ erase_points[i].y = st->yvals[t][i*2];
+ }
+
+ XFillPolygon (st->dpy, d, gc, erase_points,
+ TERRAIN_BREADTH/2, Complex, CoordModeOrigin);
+}
+
+/*
+ * regenerate_stars_mask (dpy, t)
+ *
+ * regenerate the clip mask 'stars_mask' for drawing the bonus stars at
+ * random positions within the bounding box at depth t
+ */
+static void
+regenerate_stars_mask (struct state *st, int t)
+{
+ int i, w, h, a, b, l1, l2;
+ const int lim = st->width*TERRAIN_LENGTH/(300*(TERRAIN_LENGTH-t));
+
+ w = st->maxx[t] - st->minx[t];
+ h = st->maxy[t] - st->miny[t];
+
+ if (w<6||h<6) return;
+
+ XFillRectangle (st->dpy, st->stars_mask, st->stars_erase_gc,
+ 0, 0, st->width, st->height);
+
+ l1 = (t>3*TERRAIN_LENGTH/4?2:1);
+ l2 = (t>7*TERRAIN_LENGTH/8?2:1);
+
+ for (i=0; i < lim; i++) {
+ a = RAND(w); b = RAND(h);
+ XDrawLine (st->dpy, st->stars_mask, st->stars_gc,
+ st->minx[t]+a-l1, st->miny[t]+b, st->minx[t]+a+l1, st->miny[t]+b);
+ XDrawLine (st->dpy, st->stars_mask, st->stars_gc,
+ st->minx[t]+a, st->miny[t]+b-l1, st->minx[t]+a, st->miny[t]+b+l1);
+ }
+ for (i=0; i < lim; i++) {
+ a = RAND(w); b = RAND(h);
+ XDrawLine (st->dpy, st->stars_mask, st->stars_gc,
+ st->minx[t]+a-l2, st->miny[t]+b, st->minx[t]+a+l2, st->miny[t]+b);
+ XDrawLine (st->dpy, st->stars_mask, st->stars_gc,
+ st->minx[t]+a, st->miny[t]+b-l2, st->minx[t]+a, st->miny[t]+b+l2);
+ }
+}
+
+/*
+ * render_bonus_block (dpy, d, t, i)
+ *
+ * draw the bonus stars at depth t.
+ * i is passed as a hint, where i corresponds to t as asserted.
+ */
+static void
+render_bonus_block (struct state *st, Drawable d, int t, int i)
+{
+ int bt;
+
+ assert (i == (st->nearest -t + TERRAIN_LENGTH) % TERRAIN_LENGTH);
+
+ if (!st->bonuses[i] || wireframe) return;
+
+ regenerate_stars_mask (st, t);
+
+ bt = t * st->nr_bonus_colors / (2*TERRAIN_LENGTH);
+
+ XSetClipMask (st->dpy, st->bonus_gcs[bt], st->stars_mask);
+
+ render_block (st, d, st->bonus_gcs[bt], t);
+}
+
+static int
+begin_at (struct state *st)
+{
+ int t;
+ int max_minx=0, min_maxx=st->width, max_miny=0, min_maxy=st->height;
+
+ for (t=TERRAIN_LENGTH-1; t > 0; t--) {
+ max_minx = MAX (max_minx, st->minx[t]);
+ min_maxx = MIN (min_maxx, st->maxx[t]);
+ max_miny = MAX (max_miny, st->miny[t]);
+ min_maxy = MIN (min_maxy, st->maxy[t]);
+
+ if (max_miny >= min_maxy || max_minx >= min_maxx) break;
+ }
+
+ return t;
+}
+
+/*
+ * render_speedmine (dpy, d)
+ *
+ * render the current frame.
+ */
+static void
+render_speedmine (struct state *st, Drawable d)
+{
+ int t, i=st->nearest, dt=1;
+ GC gc;
+
+ assert (st->nearest >= 0 && st->nearest < TERRAIN_LENGTH);
+
+ if (st->be_wormy || wireframe) {
+ XFillRectangle (st->dpy, d, st->erase_gc, 0, 0, st->width, st->height);
+
+ dt=4;
+ for (t=0; t < TERRAIN_LENGTH/4; t+=dt) {
+ render_bonus_block (st, d, t, i);
+ i -= dt; MODULO(i, TERRAIN_LENGTH);
+ render_quads (st, d, t, dt, i);
+ }
+
+ assert (t == TERRAIN_LENGTH/4);
+ } else {
+ t = MAX(begin_at(st), TERRAIN_LENGTH/4);
+ /*t = TERRAIN_LENGTH/4; dt = 2; */
+ /*dt = (t >= 3*TERRAIN_LENGTH/4 ? 1 : 2);*/
+ i = (st->nearest -t + TERRAIN_LENGTH) % TERRAIN_LENGTH;
+ render_block (st, d, st->tunnelend_gc, t);
+ }
+
+ dt=2;
+
+ if (t == TERRAIN_LENGTH/4)
+ render_pentagons (st, d, t, dt, i);
+
+ for (; t < 3*TERRAIN_LENGTH/4; t+=dt) {
+ render_bonus_block (st, d, t, i);
+ i -= dt; MODULO(i, TERRAIN_LENGTH);
+ render_quads (st, d, t, dt, i);
+ }
+
+ dt=1;
+ if (st->be_wormy) {
+ for (; t < TERRAIN_LENGTH-(1+(st->pindex<INTERP/2)); t+=dt) {
+ render_bonus_block (st, d, t, i);
+ i -= dt; MODULO(i, TERRAIN_LENGTH);
+ }
+ } else {
+ if (wireframe) {assert (t == 3*TERRAIN_LENGTH/4);}
+
+ if (t == 3*TERRAIN_LENGTH/4)
+ render_pentagons (st, d, t, dt, i);
+
+ for (; t < TERRAIN_LENGTH-(1+(st->pindex<INTERP/2)); t+=dt) {
+ render_bonus_block (st, d, t, i);
+ i -= dt; MODULO(i, TERRAIN_LENGTH);
+ render_quads (st, d, t, dt, i);
+ }
+ }
+
+ /* Draw crosshair */
+ if (st->crosshair_flag) {
+ gc = (wireframe ? st->bonus_gcs[st->nr_bonus_colors/2] : st->erase_gc);
+ XFillRectangle (st->dpy, d, gc,
+ st->width/2+(st->xoffset)-8, st->height/2+(st->yoffset*2)-1, 16, 3);
+ XFillRectangle (st->dpy, d, gc,
+ st->width/2+(st->xoffset)-1, st->height/2+(st->yoffset*2)-8, 3, 16);
+ }
+
+}
+
+/*
+ * move (step)
+ *
+ * move to the position for the next frame, and modify the state variables
+ * st->nearest, pindex, pos, speed
+ */
+static void
+move (struct state *st)
+{
+ double dpos;
+
+ st->pos += st->step;
+ dpos = SIGN3(st->pos) * floor(fabs(st->pos));
+
+ st->pindex += SIGN3(effective_speed) + INTERP;
+ while (st->pindex >= INTERP) {
+ st->nearest --;
+ st->pindex -= INTERP;
+ }
+ while (st->pindex < 0) {
+ st->nearest ++;
+ st->pindex += INTERP;
+ }
+
+ st->nearest += dpos; MODULO(st->nearest, TERRAIN_LENGTH);
+
+ st->pos -= dpos;
+
+ st->accel = st->thrust + st->ycurvature[st->nearest] * st->gravity;
+ st->speed += st->accel;
+ if (st->speed > st->maxspeed) st->speed = st->maxspeed;
+ if (st->speed < -st->maxspeed) st->speed = -st->maxspeed;
+}
+
+/*
+ * speedmine (dpy, window)
+ *
+ * do everything required for one frame of the demo
+ */
+static unsigned long
+speedmine_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ double elapsed, time_per_frame = 0.04;
+
+ regenerate_terrain (st);
+
+ perspective (st);
+
+ render_speedmine (st, st->dbuf);
+ if (st->dbuf != st->window)
+ XCopyArea (st->dpy, st->dbuf, st->window, st->draw_gc, 0, 0, st->width, st->height, 0, 0);
+
+ st->fps_end = get_time(st);
+ st->nframes++;
+ st->total_nframes++;
+
+ if (st->fps_end > st->fps_start + 0.5) {
+ elapsed = st->fps_end - st->fps_start;
+ st->fps_start = get_time(st);
+
+ time_per_frame = elapsed / st->nframes - st->delay*1e-6;
+ st->fps = st->nframes / elapsed;
+ if (DEBUG_FLAG) {
+ printf ("%f s elapsed\t%3f s/frame\t%.1f FPS\n", elapsed,
+ time_per_frame, st->fps);
+ }
+ st->step = effective_speed * elapsed;
+
+ st->nframes = 0;
+ }
+
+
+ move (st);
+
+ decrement_bonuses (st, time_per_frame);
+
+ check_bonuses (st);
+
+ return st->delay;
+}
+
+/*
+ * speedmine_color_ramp (dpy, gcs, colors, ncolors, s1, s2, v1, v2)
+ *
+ * generate a color ramp of up to *ncolors between randomly chosen hues,
+ * varying from saturation s1 to s2 and value v1 to v2, placing the colors
+ * in 'colors' and creating corresponding GCs in 'gcs'.
+ *
+ * The number of colors actually allocated is returned in ncolors.
+ */
+static void
+speedmine_color_ramp (struct state *st, GC *gcs, XColor * colors,
+ int *ncolors, double s1, double s2, double v1, double v2)
+{
+ XGCValues gcv;
+ int h1, h2;
+ unsigned long flags;
+ int i;
+
+ assert (*st->ncolors >= 0);
+ assert (s1 >= 0.0 && s1 <= 1.0 && v1 >= 0.0 && v2 <= 1.0);
+
+ if (st->psychedelic_flag) {
+ h1 = RAND(360); h2 = (h1 + 180) % 360;
+ } else {
+ h1 = h2 = RAND(360);
+ }
+
+ make_color_ramp (st->screen, st->visual, st->cmap,
+ h1, s1, v1, h2, s2, v2,
+ colors, ncolors, False, True, False);
+
+ flags = GCForeground;
+ for (i=0; i < *ncolors; i++) {
+ gcv.foreground = colors[i].pixel;
+ if (gcs[i]) XFreeGC (st->dpy, gcs[i]);
+ gcs[i] = XCreateGC (st->dpy, st->dbuf, flags, &gcv);
+ }
+
+}
+
+/*
+ * change_colors ()
+ *
+ * perform the color changing bonus. New colors are allocated for the
+ * walls and bonuses, and if the 'psychedelic' option is set then new
+ * colors are also chosen for the ground.
+ */
+static void
+change_colors (struct state *st)
+{
+ double s1, s2;
+
+ if (st->psychedelic_flag) {
+ free_colors (st->screen, st->cmap, st->bonus_colors, st->nr_bonus_colors);
+ free_colors (st->screen, st->cmap, st->wall_colors, st->nr_wall_colors);
+ free_colors (st->screen, st->cmap, st->ground_colors, st->nr_ground_colors);
+ s1 = 0.4; s2 = 0.9;
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->ground_gcs, st->ground_colors,
+ &st->ncolors, 0.0, 0.8, 0.0, 0.9);
+ st->nr_ground_colors = st->ncolors;
+ } else {
+ free_colors (st->screen, st->cmap, st->bonus_colors, st->nr_bonus_colors);
+ free_colors (st->screen, st->cmap, st->wall_colors, st->nr_wall_colors);
+ st->ncolors = st->nr_ground_colors;
+
+ s1 = 0.0; s2 = 0.6;
+ }
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->wall_gcs, st->wall_colors, &st->ncolors,
+ s1, s2, 0.0, 0.9);
+ st->nr_wall_colors = st->ncolors;
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->bonus_gcs, st->bonus_colors, &st->ncolors,
+ 0.6, 0.9, 0.4, 1.0);
+ st->nr_bonus_colors = st->ncolors;
+}
+
+/*
+ * init_psychedelic_colors (dpy, window, cmap)
+ *
+ * initialise a psychedelic colormap
+ */
+static void
+init_psychedelic_colors (struct state *st)
+{
+ XGCValues gcv;
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->cmap, "tunnelend", "TunnelEnd");
+ st->tunnelend_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->ground_gcs, st->ground_colors, &st->ncolors,
+ 0.0, 0.8, 0.0, 0.9);
+ st->nr_ground_colors = st->ncolors;
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->wall_gcs, st->wall_colors, &st->ncolors,
+ 0.0, 0.6, 0.0, 0.9);
+ st->nr_wall_colors = st->ncolors;
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->bonus_gcs, st->bonus_colors, &st->ncolors,
+ 0.6, 0.9, 0.4, 1.0);
+ st->nr_bonus_colors = st->ncolors;
+}
+
+/*
+ * init_colors (dpy, window, cmap)
+ *
+ * initialise a normal colormap
+ */
+static void
+init_colors (struct state *st)
+{
+ XGCValues gcv;
+ XColor dark, light;
+ int h1, h2;
+ double s1, s2, v1, v2;
+ unsigned long flags;
+ int i;
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->cmap, "tunnelend", "TunnelEnd");
+ st->tunnelend_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+
+ st->ncolors = MAX_COLORS;
+
+ dark.pixel = get_pixel_resource (st->dpy, st->cmap, "darkground", "DarkGround");
+ XQueryColor (st->dpy, st->cmap, &dark);
+
+ light.pixel = get_pixel_resource (st->dpy, st->cmap, "lightground", "LightGround");
+ XQueryColor (st->dpy, st->cmap, &light);
+
+ rgb_to_hsv (dark.red, dark.green, dark.blue, &h1, &s1, &v1);
+ rgb_to_hsv (light.red, light.green, light.blue, &h2, &s2, &v2);
+ make_color_ramp (st->screen, st->visual, st->cmap,
+ h1, s1, v1, h2, s2, v2,
+ st->ground_colors, &st->ncolors, False, True, False);
+ st->nr_ground_colors = st->ncolors;
+
+ flags = GCForeground;
+ for (i=0; i < st->ncolors; i++) {
+ gcv.foreground = st->ground_colors[i].pixel;
+ st->ground_gcs[i] = XCreateGC (st->dpy, st->dbuf, flags, &gcv);
+ }
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->wall_gcs, st->wall_colors, &st->ncolors,
+ 0.0, 0.6, 0.0, 0.9);
+ st->nr_wall_colors = st->ncolors;
+
+ st->ncolors = MAX_COLORS;
+ speedmine_color_ramp (st, st->bonus_gcs, st->bonus_colors, &st->ncolors,
+ 0.6, 0.9, 0.4, 1.0);
+ st->nr_bonus_colors = st->ncolors;
+}
+
+/*
+ * print_stats ()
+ *
+ * print out average FPS stats for the demo
+ */
+#if 0
+static void
+print_stats (struct state *st)
+{
+ if (st->total_nframes >= 1)
+ printf ("Rendered %d frames averaging %f FPS\n", st->total_nframes,
+ st->total_nframes / get_time(st));
+}
+#endif
+
+/*
+ * init_speedmine (dpy, window)
+ *
+ * initialise the demo
+ */
+static void *
+speedmine_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ int i;
+ double th;
+ int wide;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->speed = 1.1;
+ st->accel = 0.00000001;
+ st->direction = FORWARDS;
+ st->orientation = (17*ROTS)/22;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->cmap = xgwa.colormap;
+ st->visual = xgwa.visual;
+ st->screen = xgwa.screen;
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+
+ st->verbose_flag = get_boolean_resource (st->dpy, "verbose", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = st->window;
+#else
+ st->dbuf = XCreatePixmap (st->dpy, st->window, st->width, st->height, xgwa.depth);
+#endif
+ st->stars_mask = XCreatePixmap (st->dpy, st->window, st->width, st->height, 1);
+
+ gcv.foreground = st->default_fg_pixel =
+ get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = 1;
+ st->stars_gc = XCreateGC (st->dpy, st->stars_mask, GCForeground, &gcv);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->dbuf, GCForeground, &gcv);
+ gcv.foreground = 0;
+ st->stars_erase_gc = XCreateGC (st->dpy, st->stars_mask, GCForeground, &gcv);
+
+ st->wire_flag = get_boolean_resource (st->dpy, "wire", "Boolean");
+
+ st->psychedelic_flag = get_boolean_resource (st->dpy, "psychedelic", "Boolean");
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+
+ st->smoothness = get_integer_resource(st->dpy, "smoothness", "Integer");
+ if (st->smoothness < 1) st->smoothness = 1;
+
+ st->maxspeed = get_float_resource(st->dpy, "maxspeed", "Float");
+ st->maxspeed *= 0.01;
+ st->maxspeed = fabs(st->maxspeed);
+
+ st->thrust = get_float_resource(st->dpy, "thrust", "Float");
+ st->thrust *= 0.2;
+
+ st->gravity = get_float_resource(st->dpy, "gravity", "Float");
+ st->gravity *= 0.002/9.8;
+
+ st->vertigo = get_float_resource(st->dpy, "vertigo", "Float");
+ st->vertigo *= 0.2;
+
+ st->curviness = get_float_resource(st->dpy, "curviness", "Float");
+ st->curviness *= 0.25;
+
+ st->twistiness = get_float_resource(st->dpy, "twistiness", "Float");
+ st->twistiness *= 0.125;
+
+ st->terrain_flag = get_boolean_resource (st->dpy, "terrain", "Boolean");
+ st->widening_flag = get_boolean_resource (st->dpy, "widening", "Boolean");
+ st->bumps_flag = get_boolean_resource (st->dpy, "bumps", "Boolean");
+ st->bonuses_flag = get_boolean_resource (st->dpy, "bonuses", "Boolean");
+ st->crosshair_flag = get_boolean_resource (st->dpy, "crosshair", "Boolean");
+
+ st->be_wormy = get_boolean_resource (st->dpy, "worm", "Boolean");
+ if (st->be_wormy) {
+ st->maxspeed *= 1.43;
+ st->thrust *= 10;
+ st->gravity *= 3;
+ st->vertigo *= 0.5;
+ st->smoothness *= 2;
+ st->curviness *= 2;
+ st->twistiness *= 2;
+ st->psychedelic_flag = True;
+ st->crosshair_flag = False;
+ }
+
+ if (st->psychedelic_flag) init_psychedelic_colors (st);
+ else init_colors (st);
+
+ for (i=0; i<ROTS; i++) {
+ th = M_PI * 2.0 * i / ROTS;
+ st->costab[i] = cos(th);
+ st->sintab[i] = sin(th);
+ }
+
+ wide = random_wideness();
+
+ for (i=0; i < TERRAIN_LENGTH; i++) {
+ st->wideness[i] = wide;
+ st->bonuses[i] = 0;
+ }
+
+ init_terrain (st);
+ init_curves (st);
+ wrap_tunnel (st, 0, TERRAIN_LENGTH-1);
+
+#if 0
+ if (DEBUG_FLAG || st->verbose_flag) atexit(print_stats);
+#endif
+
+ st->step = effective_speed;
+
+ init_time (st);
+
+ return st;
+}
+
+
+static void
+speedmine_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+ if (st->dbuf != st->window) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ XFreePixmap (dpy, st->dbuf);
+ st->dbuf = XCreatePixmap (st->dpy, st->window,
+ st->width, st->height, xgwa.depth);
+ }
+}
+
+static Bool
+speedmine_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+speedmine_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+/*
+ * Down the speedmine, you'll find speed
+ * to satisfy your moving needs;
+ * So if you're looking for a blast
+ * then hit the speedmine, really fast.
+ */
+
+/*
+ * Speedworm likes to choke and spit
+ * and chase his tail, and dance a bit
+ * he really is a funky friend;
+ * he's made of speed from end to end.
+ */
+
+
+static const char *speedmine_defaults [] = {
+ ".verbose: False",
+ "*worm: False",
+ "*wire: False",
+ ".background: black",
+ ".foreground: white",
+ "*darkground: #101010",
+ "*lightground: #a0a0a0",
+ "*tunnelend: #000000",
+ "*delay: 30000",
+ "*maxspeed: 700",
+ "*thrust: 1.0",
+ "*gravity: 9.8",
+ "*vertigo: 1.0",
+ "*terrain: True",
+ "*smoothness: 6",
+ "*curviness: 1.0",
+ "*twistiness: 1.0",
+ "*widening: True",
+ "*bumps: True",
+ "*bonuses: True",
+ "*crosshair: True",
+ "*psychedelic: False",
+ 0
+};
+
+static XrmOptionDescRec speedmine_options [] = {
+ { "-verbose", ".verbose", XrmoptionNoArg, "True"},
+ { "-worm", ".worm", XrmoptionNoArg, "True"},
+ { "-wireframe", ".wire", XrmoptionNoArg, "True"},
+ { "-no-wireframe", ".wire", XrmoptionNoArg, "False"},
+ { "-darkground", ".darkground", XrmoptionSepArg, 0 },
+ { "-lightground", ".lightground", XrmoptionSepArg, 0 },
+ { "-tunnelend", ".tunnelend", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-maxspeed", ".maxspeed", XrmoptionSepArg, 0 },
+ { "-thrust", ".thrust", XrmoptionSepArg, 0 },
+ { "-gravity", ".gravity", XrmoptionSepArg, 0 },
+ { "-vertigo", ".vertigo", XrmoptionSepArg, 0 },
+ { "-terrain", ".terrain", XrmoptionNoArg, "True"},
+ { "-no-terrain", ".terrain", XrmoptionNoArg, "False"},
+ { "-smoothness", ".smoothness", XrmoptionSepArg, 0 },
+ { "-curviness", ".curviness", XrmoptionSepArg, 0 },
+ { "-twistiness", ".twistiness", XrmoptionSepArg, 0 },
+ { "-widening", ".widening", XrmoptionNoArg, "True"},
+ { "-no-widening", ".widening", XrmoptionNoArg, "False"},
+ { "-bumps", ".bumps", XrmoptionNoArg, "True"},
+ { "-no-bumps", ".bumps", XrmoptionNoArg, "False"},
+ { "-bonuses", ".bonuses", XrmoptionNoArg, "True"},
+ { "-no-bonuses", ".bonuses", XrmoptionNoArg, "False"},
+ { "-crosshair", ".crosshair", XrmoptionNoArg, "True"},
+ { "-no-crosshair", ".crosshair", XrmoptionNoArg, "False"},
+ { "-psychedelic", ".psychedelic", XrmoptionNoArg, "True"},
+ { "-no-psychedelic", ".psychedelic", XrmoptionNoArg, "False"},
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("SpeedMine", speedmine)
+
+/* vim: ts=4
+ */
diff --git a/hacks/speedmine.man b/hacks/speedmine.man
new file mode 100644
index 0000000..c5ce919
--- /dev/null
+++ b/hacks/speedmine.man
@@ -0,0 +1,246 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "23-Apr-01" "X Version 11"
+.SH NAME
+speedmine - simulates speeding down a rocky mineshaft, or a funky dancing worm
+.SH SYNOPSIS
+.B speedmine
+[\-display \fIhost:display.screen\fP] [\-root] [\-window]
+[\-install] [\-noinstall] [\-visual \fIvisual\fP] [\-wire] [\-nowire]
+[\-worm]
+[\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-darkground \fIcolor\fP] [\-lightground \fIcolor\fP] [\-tunnelend \fIcolor\fP] [\-delay \fImicroseconds\fP] [\-maxspeed \fInumber\fP] [\-thrust \fInumber\fP] [\-gravity \fInumber\fP] [\-vertigo \fInumber\fP] [\-terrain] [\-noterrain] [\-smoothness \fInumber\fP] [\-curviness \fInumber\fP] [\-twistiness \fInumber\fP] [\-widening] [\-nowidening] [\-bumps] [\-nobumps] [\-bonuses] [\-crosshair] [\-nocrosshair] [\-psychedelic] [\-nopsychedelic]
+[\-fps]
+.SH DESCRIPTION
+.TP 8
+Speedmine!
+
+Down the speedmine, you'll find speed
+
+to satisfy your moving needs;
+
+So if you're looking for a blast
+
+then hit the speedmine, really fast.
+.PP
+Speedworm loves you.
+
+Speedworm likes to bump and grind
+
+and chase her tail, and dance around
+
+she really is a funky friend;
+
+she's made of speed from end to end.
+.PP
+You can configure stuff
+either with command-line options or X resources.
+.SH OPTIONS
+.TP 8
+.B \-display \fIhost:display.screen\fP
+Specifies which X display we should use (see the section DISPLAY NAMES in
+.BR X (1)
+for more information about this option).
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+Possible choices include
+
+.RS
+default, best, mono, monochrome, gray, grey, color, staticgray, staticcolor,
+truecolor, grayscale, greyscale, pseudocolor, directcolor, \fInumber\fP
+
+If a decimal or hexadecimal number is used,
+.BR XGetVisualInfo (3X)
+is consulted to obtain the required visual.
+.RE
+.TP 8
+.B \-worm
+Be a happy spastic worm instead of a tunnel.
+.TP 8
+.B \-wire
+Specifies that the tunnel/worm should always be rendered in wireframe style.
+.TP 8
+.B \-nowire
+Specifies that the tunnel/worm should be rendered normally. Note that
+tunnel rendering may still temporarily switch to wireframe style when
+a wireframe bonus is hit, if
+.B bonuses
+are enabled.
+.TP 8
+.B \-foreground \fIcolor\fP
+Specifies the default foreground color.
+.TP 8
+.B \-background \fIcolor\fP
+Specifies the default background color.
+.TP 8
+.B \-darkground \fIcolor\fP
+Specifies the color of the darkest portions of the ground (or the
+worm's belly.) The ground/belly is colored by a gradient between
+.B darkground
+and
+.B lightground.
+.TP 8
+.B \-lightground \fIcolor\fP
+Specifies the color of the lightest portions of the ground/belly.
+The ground/belly is colored by a gradient between
+.B darkground
+and
+.B lightground.
+.TP 8
+.B \-tunnelend \fIcolor\fP
+Specifies the color of the light at the end of the tunnel.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Specifies the delay between drawing successive frames. If you do not specify
+.BR -sync ,
+some X servers may batch up several drawing operations together,
+producing a less smooth effect. This is more likely to happen
+in monochrome mode (on monochrome servers or when
+.B \-mono
+is specified).
+.TP 8
+.B -maxspeed \fInumber\fP
+Specifies an upper bound on the speed of normal movement. This does not
+affect the speed that may be attained when hitting a speed bonus.
+.TP 8
+.B -thrust \fInumber\fP
+Specifies the thrust constantly applied. Positive numbers indicate a forwards
+thrust, negative numbers indicate a backwards thrust.
+.TP 8
+.B -gravity \fInumber\fP
+Specifies the effect of gravity. Larger numbers will increase acceleration
+downhill and decrease acceleration uphill.
+.TP 8
+.B -vertigo \fInumber\fP
+Specifies to what level the demo should accentuate the curvature and
+windiness of the tunnel or worm.
+.TP 8
+.B -terrain
+Continuously generate a fractal terrain to simulate the rockiness of the
+tunnel walls, or the texture of the worm's skin.
+.TP 8
+.B -noterrain
+Do not generate terrain. When this option is set, all surfaces are flat.
+.TP 8
+.B -smoothness \fInumber\fP
+When
+.BR -terrain
+is set, specifies how smooth the walls or skin are.
+.TP 8
+.B -curviness \fInumber\fP
+Controls how much the generated tunnel (or worm) should curve left
+and right, and dip up and down.
+.TP 8
+.B -twistiness \fInumber\fP
+Controls how much the generated tunnel (or worm) twists around itself.
+.TP 8
+.B -widening
+Specifies that the generated tunnel (or worm) may vary in width.
+.TP 8
+.B -nowidening
+Specifies that the average width should be kept constant.
+.TP 8
+.B -bumps
+Indicates that the simulation should take the bumpiness of the ground into
+account and allow the animation to shake and rattle when travelling over
+rough ground. Or that the worm should be allowed to bump around and
+shake her booty.
+.TP 8
+.B -nobumps
+Indicates that the bumpiness of the ground should be ignored, such that the
+simulation will glide through the tunnel. Or that the worm should calm
+down and behave herself.
+.TP 8
+.B -bonuses
+Indicates that the demo should include bonus events. These include speed
+bonuses, spins, and changes of viewpoint and rendering style.
+.TP 8
+.B -nobonuses
+Indicates that bonuses should not be included in the demo.
+.TP 8
+.B -crosshair
+Specifies that a gaming style crosshair be drawn on the simulation. This
+serves little purpose but may make hardcore gamers feel more comfortable.
+.TP 8
+.B -nocrosshair
+Specifies that no crosshair be drawn.
+.TP 8
+.B -psychedelic
+Specifies that a psychedelic colormap should be generated. When this is
+set, the walls and ground of the tunnel are drawn in an often changing
+rainbow of colours.
+.TP 8
+.B -nopsychedelic
+Specifies that a normal colormap should be used, with muted walls and a
+grey road.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH RESOURCES
+.EX
+Option Resource Default Value
+------ -------- -------------
+-wire .wire False
+-background .background black
+-foreground .foreground white
+-darkground .darkground #101010
+-lightground .lightground #a0a0a0
+-tunnelend .tunnelend #000000
+-delay .delay 30000
+-maxspeed .maxspeed 700
+-thrust .thrust 1.0
+-gravity .gravity 9.8
+-vertigo .vertigo 1.0
+-terrain .terrain True
+-smoothness .smoothness 6
+-curviness .curviness 1.0
+-twistiness .twistiness 1.0
+-widening .widening True
+-bumps .bumps True
+-bonuses .bonuses True
+-crosshair .crosshair False
+-psychedelic .psychedelic False
+.EE
+.SH WARNING
+Speedworm is a trained professional. Do not try this at home.
+
+Prolonged viewing of this demo with
+.B maxspeed
+and
+.B vertigo
+above the defaults may have short-term psychological side effects including
+hyperactivity and attention deficiency.
+.SH COPYRIGHT
+Copyright \(co 2001, Conrad Parker. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Conrad Parker <conrad@deephackmode.org>, April 2001.
diff --git a/hacks/sphere.c b/hacks/sphere.c
new file mode 100644
index 0000000..d35720e
--- /dev/null
+++ b/hacks/sphere.c
@@ -0,0 +1,303 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* sphere --- a bunch of shaded spheres */
+
+#if 0
+static const char sccsid[] = "@(#)sphere.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1988 by Sun Microsystems
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 30-May-1997: <jwz@jwz.org> made it go vertically as well as horizontally.
+ * 27-May-1997: <jwz@jwz.org> turned into a standalone program.
+ * 02-Sep-1993: xlock version David Bagley <bagleyd@tux.org>
+ * 1988: Revised to use SunView canvas instead of gfxsw Sun Microsystems
+ * 1982: Orignal Algorithm Tom Duff Lucasfilm Ltd.
+ */
+
+/*-
+ * original copyright
+ * **************************************************************************
+ * Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA.
+ *
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Sun or MIT not be used in advertising
+ * or publicity pertaining to distribution of the software without specific
+ * prior written permission. Sun and M.I.T. make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without any express or implied warranty.
+ *
+ * SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL SUN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ * ***************************************************************************
+ */
+
+#ifdef STANDALONE
+# define MODE_sphere
+#define DEFAULTS "*delay: 20000 \n" \
+ "*cycles: 20 \n" \
+ "*size: 0 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+
+# define BRIGHT_COLORS
+# define release_sphere 0
+# define reshape_sphere 0
+# define sphere_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_sphere
+
+ENTRYPOINT ModeSpecOpt sphere_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct sphere_description =
+{"sphere", "init_sphere", "draw_sphere", (char *) NULL,
+ "refresh_sphere", "init_sphere", "free_sphere", &sphere_opts,
+ 5000, 1, 20, 0, 64, 1.0, "",
+ "Shows a bunch of shaded spheres", 0, NULL};
+
+#endif
+
+/*-
+ * (NX, NY, NZ) is the light source vector -- length should be 100
+ */
+#define NX 48
+#define NY (-36)
+#define NZ 80
+#define NR 100
+#define SQRT(a) ((int)sqrt((double)(a)))
+
+typedef struct {
+ int width, height;
+ int radius;
+ int x0; /* x center */
+ int y0; /* y center */
+ int color;
+ int x, y;
+ int dirx, diry;
+ int shadowx, shadowy;
+ int maxx, maxy;
+ XPoint *points;
+} spherestruct;
+
+static spherestruct *spheres = (spherestruct *) NULL;
+
+ENTRYPOINT void
+init_sphere(ModeInfo * mi)
+{
+ spherestruct *sp;
+
+ MI_INIT (mi, spheres);
+ sp = &spheres[MI_SCREEN(mi)];
+
+ if (sp->points != NULL) {
+ (void) free((void *) sp->points);
+ sp->points = (XPoint *) NULL;
+ }
+ sp->width = MAX(MI_WIDTH(mi), 4);
+ sp->height = MAX(MI_HEIGHT(mi), 4);
+ if ((sp->points = (XPoint *) malloc(MIN(sp->width, sp->height) *
+ sizeof (XPoint))) == NULL) {
+ return;
+ }
+
+ MI_CLEARWINDOW(mi);
+
+ sp->dirx = 1;
+ sp->x = sp->radius;
+ sp->shadowx = (LRAND() & 1) ? 1 : -1;
+ sp->shadowy = (LRAND() & 1) ? 1 : -1;
+}
+
+ENTRYPOINT void
+draw_sphere(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int sqrd, nd;
+ register int minx = 0, maxx = 0, miny = 0, maxy = 0, npts = 0;
+ spherestruct *sp;
+
+ if (spheres == NULL)
+ return;
+ sp = &spheres[MI_SCREEN(mi)];
+ if (sp->points == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ if ((sp->dirx && ABS(sp->x) >= sp->radius) ||
+ (sp->diry && ABS(sp->y) >= sp->radius)) {
+ sp->radius = NRAND(MIN(sp->width / 2, sp->height / 2) - 1) + 1;
+
+ if (LRAND() & 1) {
+ sp->dirx = (int) (LRAND() & 1) * 2 - 1;
+ sp->diry = 0;
+ } else {
+ sp->dirx = 0;
+ sp->diry = (int) (LRAND() & 1) * 2 - 1;
+ }
+ sp->x0 = NRAND(sp->width);
+ sp->y0 = NRAND(sp->height);
+
+ sp->x = -sp->radius * sp->dirx;
+ sp->y = -sp->radius * sp->diry;
+
+ if (MI_NPIXELS(mi) > 2)
+ sp->color = NRAND(MI_NPIXELS(mi));
+ }
+ if (sp->dirx == 1) {
+ if (sp->x0 + sp->x < 0)
+ sp->x = -sp->x0;
+ } else if (sp->dirx == -1) {
+ if (sp->x0 + sp->x >= sp->width)
+ sp->x = sp->width - sp->x0 - 1;
+ }
+ if (sp->diry == 1) {
+ if (sp->y0 + sp->y < 0)
+ sp->y = -sp->y0;
+ } else if (sp->diry == -1) {
+ if (sp->y0 + sp->y >= sp->height)
+ sp->y = sp->height - sp->y0 - 1;
+ }
+ if (sp->dirx) {
+ sp->maxy = SQRT(sp->radius * sp->radius - sp->x * sp->x);
+ miny = -sp->maxy;
+ if (sp->y0 - sp->maxy < 0)
+ miny = -sp->y0;
+ maxy = sp->maxy;
+ }
+ if (sp->diry) {
+ sp->maxx = SQRT(sp->radius * sp->radius - sp->y * sp->y);
+ minx = -sp->maxx;
+ if (sp->x0 - sp->maxx < 0)
+ minx = -sp->x0;
+ maxx = sp->maxx;
+ }
+ if (sp->dirx) {
+ if (sp->y0 + sp->maxy >= sp->height)
+ maxy = sp->height - sp->y0;
+ }
+ if (sp->diry) {
+ if (sp->x0 + sp->maxx >= sp->width)
+ maxx = sp->width - sp->x0;
+ }
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+
+ if (sp->dirx)
+ XDrawLine(display, MI_WINDOW(mi), gc,
+ sp->x0 + sp->x, sp->y0 + miny, sp->x0 + sp->x, sp->y0 + maxy);
+ if (sp->diry)
+ XDrawLine(display, MI_WINDOW(mi), gc,
+ sp->x0 + minx, sp->y0 + sp->y, sp->x0 + maxx, sp->y0 + sp->y);
+
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, sp->color));
+ else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+
+ if (sp->dirx) {
+ sqrd = sp->radius * sp->radius - sp->x * sp->x;
+ nd = NX * sp->shadowx * sp->x;
+ for (sp->y = miny; sp->y <= maxy; sp->y++)
+ if ((NRAND(sp->radius * NR)) <= nd + NY * sp->shadowy * sp->y +
+ NZ * SQRT(sqrd - sp->y * sp->y)) {
+ sp->points[npts].x = sp->x + sp->x0;
+ sp->points[npts].y = sp->y + sp->y0;
+ npts++;
+ }
+ }
+ if (sp->diry) {
+ sqrd = sp->radius * sp->radius - sp->y * sp->y;
+ nd = NY * sp->shadowy * sp->y;
+ for (sp->x = minx; sp->x <= maxx; sp->x++)
+ if ((NRAND(sp->radius * NR)) <= NX * sp->shadowx * sp->x + nd +
+ NZ * SQRT(sqrd - sp->x * sp->x)) {
+ sp->points[npts].x = sp->x + sp->x0;
+ sp->points[npts].y = sp->y + sp->y0;
+ npts++;
+ }
+ }
+ XDrawPoints(display, MI_WINDOW(mi), gc, sp->points, npts, CoordModeOrigin);
+ if (sp->dirx == 1) {
+ sp->x++;
+ if (sp->x0 + sp->x >= sp->width)
+ sp->x = sp->radius;
+ } else if (sp->dirx == -1) {
+ sp->x--;
+ if (sp->x0 + sp->x < 0)
+ sp->x = -sp->radius;
+ }
+ if (sp->diry == 1) {
+ sp->y++;
+ if (sp->y0 + sp->y >= sp->height)
+ sp->y = sp->radius;
+ } else if (sp->diry == -1) {
+ sp->y--;
+ if (sp->y0 + sp->y < 0)
+ sp->y = -sp->radius;
+ }
+}
+
+ENTRYPOINT void
+free_sphere(ModeInfo * mi)
+{
+ spherestruct *sp;
+
+ if (spheres == NULL)
+ return;
+ sp = &spheres[MI_SCREEN(mi)];
+
+ if (sp->points) {
+ (void) free((void *) sp->points);
+ /* sp->points = NULL; */
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_sphere(ModeInfo * mi)
+{
+ spherestruct *sp;
+
+ if (spheres == NULL)
+ return;
+ sp = &spheres[MI_SCREEN(mi)];
+
+ MI_CLEARWINDOW(mi);
+
+ sp->x = -sp->radius;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Sphere", sphere)
+
+#endif /* MODE_sphere */
diff --git a/hacks/sphere.man b/hacks/sphere.man
new file mode 100644
index 0000000..d44c2fb
--- /dev/null
+++ b/hacks/sphere.man
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+sphere - draws shaded spheres
+.SH SYNOPSIS
+.B sphere
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIsphere\fP program draws shaded spheres.
+.SH OPTIONS
+.I sphere
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1988 by Sun Microsystems, Inc.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Sun Microsystems, Inc, 1988.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/spiral.c b/hacks/spiral.c
new file mode 100644
index 0000000..3d8159b
--- /dev/null
+++ b/hacks/spiral.c
@@ -0,0 +1,330 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* spiral --- spiraling dots */
+
+#if 0
+static const char sccsid[] = "@(#)spiral.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1994 by Darrick Brown.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: jwz@jwz.org: turned into a standalone program.
+ * 24-Jul-1995: Fix to allow cycles not to have an arbitrary value by
+ * Peter Schmitzberger (schmitz@coma.sbg.ac.at).
+ * 06-Mar-1995: Finished cleaning up and final testing.
+ * 03-Mar-1995: Cleaned up code.
+ * 12-Jul-1994: Written.
+ *
+ * Low CPU usage mode.
+ * Idea based on a graphics demo I saw a *LONG* time ago.
+ */
+
+#ifdef STANDALONE
+# define MODE_spiral
+#define DEFAULTS "*delay: 50000 \n" \
+ "*count: 40 \n" \
+ "*cycles: 350 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+
+# define SMOOTH_COLORS
+# define release_spiral 0
+# define reshape_spiral 0
+# define spiral_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_spiral
+
+ENTRYPOINT ModeSpecOpt spiral_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct spiral_description =
+{"spiral", "init_spiral", "draw_spiral", (char *) NULL,
+ "refresh_spiral", "init_spiral", "free_spiral", &spiral_opts,
+ 5000, -40, 350, 1, 64, 1.0, "",
+ "Shows a helical locus of points", 0, NULL};
+
+#endif
+
+#define MAXTRAIL 512 /* The length of the trail */
+#define MAXDOTS 40
+#define MINDOTS 1
+#define TWOPI (2.0*M_PI) /* for convienence */
+#define JAGGINESS 4 /* This sets the "Craziness" of the spiral (I like 4) */
+#define SPEED 2.0
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+
+typedef struct {
+ float hx, hy, ha, hr;
+} Traildots;
+
+typedef struct {
+ Traildots *traildots;
+ float cx, cy;
+ float angle;
+ float radius;
+ float dr, da;
+ float dx, dy;
+ int erase;
+ int inc;
+ float colors;
+ int width, height;
+ float top, bottom, left, right;
+ int dots, nlength;
+ int redrawing, redrawpos;
+} spiralstruct;
+
+static spiralstruct *spirals = (spiralstruct *) NULL;
+
+static void draw_dots(ModeInfo * mi, int in);
+
+#define TFX(sp,x) ((int)((x/sp->right)*(float)sp->width))
+#define TFY(sp,y) ((int)((y/sp->top)*(float)sp->height))
+
+static void
+draw_dots(ModeInfo * mi, int in)
+{
+
+ float i, inc;
+ float x, y;
+
+ spiralstruct *sp = &spirals[MI_SCREEN(mi)];
+
+ inc = TWOPI / (float) sp->dots;
+ for (i = 0.0; i < TWOPI; i += inc) {
+ x = sp->traildots[in].hx + COSF(i + sp->traildots[in].ha) *
+ sp->traildots[in].hr;
+ y = sp->traildots[in].hy + SINF(i + sp->traildots[in].ha) *
+ sp->traildots[in].hr;
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ TFX(sp, x), TFY(sp, y));
+ }
+}
+
+ENTRYPOINT void
+init_spiral(ModeInfo * mi)
+{
+ spiralstruct *sp;
+ int i;
+
+ MI_INIT (mi, spirals);
+ sp = &spirals[MI_SCREEN(mi)];
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+#endif
+
+ sp->width = MI_WIDTH(mi);
+ sp->height = MI_HEIGHT(mi);
+
+ MI_CLEARWINDOW(mi);
+
+ /* Init */
+ sp->nlength = MI_CYCLES(mi);
+
+ if (!sp->traildots)
+ if ((sp->traildots = (Traildots *) malloc(sp->nlength *
+ sizeof (Traildots))) == NULL) {
+ return;
+ }
+
+ /* initialize the allocated array */
+ for (i = 0; i < sp->nlength; i++) {
+ sp->traildots[i].hx = 0.0;
+ sp->traildots[i].hy = 0.0;
+ sp->traildots[i].ha = 0.0;
+ sp->traildots[i].hr = 0.0;
+ }
+ sp->redrawing = 0;
+
+ /* keep the window parameters proportional */
+ sp->top = 10000.0;
+ sp->bottom = 0;
+ sp->right = (float) (sp->width) / (float) (sp->height) * (10000.0);
+ sp->left = 0;
+
+ /* assign the initial values */
+ sp->cx = (float) (5000.0 - NRAND(2000)) / 10000.0 * sp->right;
+ sp->cy = (float) (5000.0 - NRAND(2000));
+ sp->radius = (float) (NRAND(200) + 200);
+ sp->angle = 0.0;
+ sp->dx = (float) (10 - NRAND(20)) * SPEED;
+ sp->dy = (float) (10 - NRAND(20)) * SPEED;
+ sp->dr = (float) ((NRAND(10) + 4) * (1 - (LRAND() & 1) * 2));
+ sp->da = (float) NRAND(360) / 7200.0 + 0.01;
+ if (MI_NPIXELS(mi) > 2)
+ sp->colors = (float) NRAND(MI_NPIXELS(mi));
+ sp->erase = 0;
+ sp->inc = 0;
+ sp->traildots[sp->inc].hx = sp->cx;
+ sp->traildots[sp->inc].hy = sp->cy;
+ sp->traildots[sp->inc].ha = sp->angle;
+ sp->traildots[sp->inc].hr = sp->radius;
+ sp->inc++;
+
+ sp->dots = MI_COUNT(mi);
+ if (sp->dots < -MINDOTS)
+ sp->dots = NRAND(sp->dots - MINDOTS + 1) + MINDOTS;
+ /* Absolute minimum */
+ if (sp->dots < MINDOTS)
+ sp->dots = MINDOTS;
+}
+
+ENTRYPOINT void
+draw_spiral(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int i, j;
+ spiralstruct *sp;
+
+ if (spirals == NULL)
+ return;
+ sp = &spirals[MI_SCREEN(mi)];
+ if (sp->traildots == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ if (sp->erase == 1) {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ draw_dots(mi, sp->inc);
+ }
+ sp->cx += sp->dx;
+ sp->traildots[sp->inc].hx = sp->cx;
+
+ if ((sp->cx > 9000.0) || (sp->cx < 1000.0))
+ sp->dx *= -1.0;
+
+ sp->cy += sp->dy;
+ sp->traildots[sp->inc].hy = sp->cy;
+
+ if ((sp->cy > 9000.0) || (sp->cy < 1000.0))
+ sp->dy *= -1.0;
+
+ sp->radius += sp->dr;
+ sp->traildots[sp->inc].hr = sp->radius;
+
+ if ((sp->radius > 2500.0) && (sp->dr > 0.0))
+ sp->dr *= -1.0;
+ else if ((sp->radius < 50.0) && (sp->radius < 0.0))
+ sp->dr *= -1.0;
+
+ /* Randomly give some variations to: */
+
+ /* spiral direction (if it is within the boundaries) */
+ if ((NRAND(3000) < 1 * JAGGINESS) &&
+ (((sp->cx > 2000.0) && (sp->cx < 8000.0)) &&
+ ((sp->cy > 2000.0) && (sp->cy < 8000.0)))) {
+ sp->dx = (float) (10 - NRAND(20)) * SPEED;
+ sp->dy = (float) (10 - NRAND(20)) * SPEED;
+ }
+ /* The speed of the change in size of the spiral */
+ if (NRAND(3000) < 1 * JAGGINESS) {
+ if (LRAND() & 1)
+ sp->dr += (float) (NRAND(3) + 1);
+ else
+ sp->dr -= (float) (NRAND(3) + 1);
+
+ /* don't let it get too wild */
+ if (sp->dr > 18.0)
+ sp->dr = 18.0;
+ else if (sp->dr < 4.0)
+ sp->dr = 4.0;
+ }
+ /* The speed of rotation */
+ if (NRAND(3000) < 1 * JAGGINESS)
+ sp->da = (float) NRAND(360) / 7200.0 + 0.01;
+
+ /* Reverse rotation */
+ if (NRAND(3000) < 1 * JAGGINESS)
+ sp->da *= -1.0;
+
+ sp->angle += sp->da;
+ sp->traildots[sp->inc].ha = sp->angle;
+
+ if (sp->angle > TWOPI)
+ sp->angle -= TWOPI;
+ else if (sp->angle < 0.0)
+ sp->angle += TWOPI;
+
+ sp->colors += (float) MI_NPIXELS(mi) / ((float) (2 * sp->nlength));
+ if (sp->colors >= (float) MI_NPIXELS(mi))
+ sp->colors = 0.0;
+
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, (int) sp->colors));
+ else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ draw_dots(mi, sp->inc);
+ sp->inc++;
+
+ if (sp->inc > sp->nlength - 1) {
+ sp->inc -= sp->nlength;
+ sp->erase = 1;
+ }
+ if (sp->redrawing) {
+ for (i = 0; i < REDRAWSTEP; i++) {
+ j = (sp->inc - sp->redrawpos + sp->nlength) % sp->nlength;
+ draw_dots(mi, j);
+
+ if (++(sp->redrawpos) >= sp->nlength) {
+ sp->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+ENTRYPOINT void
+free_spiral(ModeInfo * mi)
+{
+ spiralstruct *sp;
+
+ if (spirals == NULL)
+ return;
+ sp = &spirals[MI_SCREEN(mi)];
+
+ if (sp->traildots)
+ (void) free((void *) sp->traildots);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_spiral(ModeInfo * mi)
+{
+ spiralstruct *sp;
+
+ if (spirals == NULL)
+ return;
+ sp = &spirals[MI_SCREEN(mi)];
+
+ MI_CLEARWINDOW(mi);
+ sp->redrawing = 1;
+ sp->redrawpos = 0;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Spiral", spiral)
+
+#endif /* MODE_spiral */
diff --git a/hacks/spiral.man b/hacks/spiral.man
new file mode 100644
index 0000000..cf9eb6f
--- /dev/null
+++ b/hacks/spiral.man
@@ -0,0 +1,71 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+spiral - draws moving circular spiral patterns
+.SH SYNOPSIS
+.B spiral
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIspiral\fP program draws moving circular spiral patterns
+.SH OPTIONS
+.I spiral
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-count \fIinteger\fP
+Default 40.
+.TP 8
+.B \-cycles \fIinteger\fP
+Default 350.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1994 by Darrick Brown.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Darrick Brown, 1994.
+
+Improved by Peter Schmitzberger <schmitz@coma.sbg.ac.at>, 24-Jul-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/spotlight.c b/hacks/spotlight.c
new file mode 100644
index 0000000..7385899
--- /dev/null
+++ b/hacks/spotlight.c
@@ -0,0 +1,353 @@
+/*
+ * spotlight - an xscreensaver module
+ * Copyright (c) 1999, 2001 Rick Schultz <rick.schultz@gmail.com>
+ *
+ * loosely based on the BackSpace module "StefView" by Darcy Brockbank
+ */
+
+/* modified from a module from the xscreensaver distribution */
+
+/*
+ * xscreensaver, Copyright (c) 1992-2006 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+
+/* #define DEBUG */
+#include <math.h>
+#include <limits.h>
+#include "screenhack.h"
+
+#define X_PERIOD 15000.0
+#define Y_PERIOD 12000.0
+
+struct state {
+ Display *dpy;
+ Window window;
+ Screen *screen;
+
+ int sizex, sizey; /* screen size */
+ int delay;
+ int duration;
+ time_t start_time;
+ int first_time;
+ GC window_gc;
+#ifdef DEBUG
+ GC white_gc;
+#endif
+ GC buffer_gc; /* draw in buffer, then flush to screen
+ to avoid flicker */
+ int radius; /* radius of spotlight in pixels */
+
+ Pixmap pm; /* pixmap grabbed from screen */
+ Pixmap buffer; /* pixmap for the buffer */
+
+ int x, y, s; /* x & y coords of buffer (upper left corner) */
+ /* s is the width of the buffer */
+
+ int off; /* random offset from currentTimeInMs(), so that
+ two concurrent copies of spotlight have different
+ behavior. */
+
+ int oldx, oldy, max_x_speed, max_y_speed;
+ /* used to keep the new buffer position
+ over the old spotlight image to make sure
+ the old image is completely erased */
+
+ Bool first_p;
+ async_load_state *img_loader;
+ XRectangle geom;
+};
+
+
+/* The path the spotlight follows around the screen is sinusoidal.
+ This function is fed to sin() to get the x & y coords */
+static long
+currentTimeInMs(struct state *st)
+{
+ struct timeval curTime;
+ unsigned long ret_unsigned;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tz = {0,0};
+ gettimeofday(&curTime, &tz);
+#else
+ gettimeofday(&curTime);
+#endif
+ ret_unsigned = curTime.tv_sec *1000U + curTime.tv_usec / 1000;
+ return (ret_unsigned <= LONG_MAX) ? ret_unsigned : -1 - (long)(ULONG_MAX - ret_unsigned);
+}
+
+
+static void *
+spotlight_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ long gcflags;
+ Colormap cmap;
+ unsigned long bg;
+ GC clip_gc;
+ Pixmap clip_pm;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->first_p = True;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->screen = xgwa.screen;
+ st->sizex = xgwa.width;
+ st->sizey = xgwa.height;
+ cmap = xgwa.colormap;
+ bg = get_pixel_resource (st->dpy, cmap, "background", "Background");
+
+ /* read parameters, keep em sane */
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 1) st->delay = 1;
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->duration < 1) st->duration = 1;
+ st->radius = get_integer_resource (st->dpy, "radius", "Integer");
+ if (st->radius < 0) st->radius = 125;
+
+ if (xgwa.width > 2560) st->radius *= 2; /* Retina displays */
+
+ /* Don't let the spotlight be bigger than the window */
+ while (st->radius > xgwa.width * 0.45)
+ st->radius /= 2;
+ while (st->radius > xgwa.height * 0.45)
+ st->radius /= 2;
+
+ if (st->radius < 4)
+ st->radius = 4;
+
+ /* do the dance */
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ gcflags = GCForeground | GCFunction;
+ gcv.foreground = bg;
+
+#ifdef NOPE
+ if (use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+#endif
+ st->window_gc = XCreateGC(st->dpy, st->window, gcflags, &gcv);
+
+ st->pm = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, xgwa.depth);
+ XClearWindow(st->dpy, st->window);
+
+ st->first_time = 1;
+
+ /* create buffer to reduce flicker */
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->buffer = 0;
+#else
+ st->buffer = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, xgwa.depth);
+#endif
+
+ st->buffer_gc = XCreateGC(st->dpy, (st->buffer ? st->buffer : window), gcflags, &gcv);
+ if (st->buffer)
+ XFillRectangle(st->dpy, st->buffer, st->buffer_gc, 0, 0, st->sizex, st->sizey);
+
+ /* create clip mask (so it's a circle, not a square) */
+ clip_pm = XCreatePixmap(st->dpy, st->window, st->radius*4, st->radius*4, 1);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window, st->pm,
+ 0, &st->geom);
+ st->start_time = time ((time_t *) 0);
+
+ gcv.foreground = 0L;
+ clip_gc = XCreateGC(st->dpy, clip_pm, gcflags, &gcv);
+ XFillRectangle(st->dpy, clip_pm, clip_gc, 0, 0, st->radius*4, st->radius*4);
+
+ XSetForeground(st->dpy, clip_gc, 1L);
+ XFillArc(st->dpy, clip_pm, clip_gc, st->radius , st->radius,
+ st->radius*2, st->radius*2, 0, 360*64);
+
+ /* set buffer's clip mask to the one we just made */
+ XSetClipMask(st->dpy, st->buffer_gc, clip_pm);
+
+ /* free everything */
+ XFreeGC(st->dpy, clip_gc);
+ XFreePixmap(st->dpy, clip_pm);
+
+ /* avoid remants */
+ st->max_x_speed = st->max_y_speed = st->radius;
+
+ st->off = random();
+
+ /* blank out screen */
+ XFillRectangle(st->dpy, st->window, st->window_gc, 0, 0, st->sizex, st->sizey);
+
+ return st;
+}
+
+
+/*
+ * perform one iteration
+ */
+static void
+onestep (struct state *st, Bool first_p)
+{
+ long now;
+ unsigned long now_unsigned;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0,
+ &st->geom);
+ if (! st->img_loader) { /* just finished */
+ st->start_time = time ((time_t *) 0);
+ }
+ return;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ st->img_loader = load_image_async_simple (0, st->screen, st->window,
+ st->pm, 0, &st->geom);
+ return;
+ }
+
+#define nrnd(x) (random() % (x))
+
+ st->oldx = st->x;
+ st->oldy = st->y;
+
+ st->s = st->radius *4 ; /* s = width of buffer */
+
+ now_unsigned = (unsigned long) currentTimeInMs(st) + st->off;
+ now = (now_unsigned <= LONG_MAX) ? now_unsigned : -1 - (long)(ULONG_MAX - now_unsigned);
+
+ /* find new x,y */
+ st->x = st->geom.x +
+ ((1 + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0)
+ * (st->geom.width - st->s/2) -st->s/4;
+ st->y = st->geom.y +
+ ((1 + sin(((double)now) / Y_PERIOD * 2. * M_PI))/2.0)
+ * (st->geom.height - st->s/2) -st->s/4;
+
+ if (!st->first_p)
+ {
+ /* limit change in x and y to buffer width */
+ if ( st->x < (st->oldx - st->max_x_speed) ) st->x = st->oldx - st->max_x_speed;
+ if ( st->x > (st->oldx + st->max_x_speed) ) st->x = st->oldx + st->max_x_speed;
+ if ( st->y < (st->oldy - st->max_y_speed) ) st->y = st->oldy - st->max_y_speed;
+ if ( st->y > (st->oldy + st->max_y_speed) ) st->y = st->oldy + st->max_y_speed;
+ }
+
+ if (! st->buffer)
+ {
+ XClearWindow (st->dpy, st->window);
+ XSetClipOrigin(st->dpy, st->buffer_gc, st->x,st->y);
+ XCopyArea(st->dpy, st->pm, st->window, st->buffer_gc, st->x, st->y, st->s, st->s, st->x, st->y);
+ }
+ else
+ {
+ /* clear buffer */
+ XFillRectangle(st->dpy, st->buffer, st->buffer_gc, st->x, st->y, st->s, st->s);
+
+ /* copy area of screen image (pm) to buffer
+ Clip to a circle */
+ XSetClipOrigin(st->dpy, st->buffer_gc, st->x,st->y);
+ XCopyArea(st->dpy, st->pm, st->buffer, st->buffer_gc, st->x, st->y, st->s, st->s, st->x, st->y);
+
+ if (st->first_time) {
+ /* blank out screen */
+ XFillRectangle(st->dpy, st->window, st->window_gc, 0, 0, st->sizex, st->sizey);
+ st->first_time = 0;
+ }
+
+ /* copy buffer to screen (window) */
+ XCopyArea(st->dpy, st->buffer, st->window, st->window_gc, st->x , st->y, st->s, st->s, st->x, st->y);
+
+# if 0
+ XSetForeground (st->dpy, st->window_gc,
+ WhitePixel (st->dpy, DefaultScreen (st->dpy)));
+ XDrawRectangle(st->dpy, st->window, st->window_gc,
+ st->geom.x, st->geom.y, st->geom.width, st->geom.height);
+# endif
+ }
+
+#ifdef DEBUG
+ /* draw a box around the buffer */
+ XDrawRectangle(st->dpy, st->window, st->white_gc, st->x , st->y, st->s, st->s);
+#endif
+
+}
+
+
+static unsigned long
+spotlight_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ onestep(st, st->first_p);
+ st->first_p = False;
+ return st->delay;
+}
+
+static void
+spotlight_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+spotlight_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+spotlight_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (dpy, st->window_gc);
+ XFreeGC (dpy, st->buffer_gc);
+ if (st->pm) XFreePixmap (dpy, st->pm);
+ if (st->buffer) XFreePixmap (dpy, st->buffer);
+ free (st);
+}
+
+
+
+
+static const char *spotlight_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*dontClearRoot: True",
+ "*fpsSolid: true",
+
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+
+ "*delay: 10000",
+ "*duration: 120",
+ "*radius: 125",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec spotlight_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Spotlight", spotlight)
diff --git a/hacks/spotlight.man b/hacks/spotlight.man
new file mode 100644
index 0000000..770a3e8
--- /dev/null
+++ b/hacks/spotlight.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+spotlight - move spotlight around desktop
+.SH SYNOPSIS
+.B spotlight
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-radius \fIpixels\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIspotlight\fP program takes an image and exposes small sections
+of it as if through a wandering spotlight beam.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I spotlight
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-radius \fIpixels\fP
+Radius of the spotlight in pixels.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1999 by Rick Schultz. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH CREDITS
+Hacked together by Rick Schultz <rick@skapunx.net>, based on StefView for
+BackSpace by Darcy Brockbank and on several other xscreensaver hacks.
diff --git a/hacks/squiral.c b/hacks/squiral.c
new file mode 100644
index 0000000..a38e060
--- /dev/null
+++ b/hacks/squiral.c
@@ -0,0 +1,290 @@
+/* squiral, by "Jeff Epler" <jepler@inetnebr.com>, 18-mar-1999.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+#include "yarandom.h"
+
+#define R(x) (random()%x)
+#define PROB(x) (frand(1.0) < (x))
+
+#define NCOLORSMAX 255
+#define STATES 8
+
+/* 0- 3 left-winding */
+/* 4- 7 right-winding */
+
+struct worm {
+ int h;
+ int v;
+ int s;
+ int c;
+ int cc;
+};
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int width, height, count, cycle;
+ double frac, disorder, handedness;
+ int ncolors;
+ GC draw_gc, erase_gc;
+ XColor colors[NCOLORSMAX];
+
+ int delay;
+
+ int cov;
+ int dirh[4];
+ int dirv[4];
+
+ int *fill;
+
+ struct worm *worms;
+ int inclear;
+};
+
+#define CLEAR1(x,y) (!st->fill[((y)%st->height)*st->width+(x)%st->width])
+#define MOVE1(x,y) (st->fill[((y)%st->height)*st->width+(x)%st->width]=1, XDrawPoint(st->dpy, st->window, st->draw_gc, (x)%st->width,(y)%st->height), st->cov++)
+
+#define CLEARDXY(x,y,dx,dy) CLEAR1(x+dx, y+dy) && CLEAR1(x+dx+dx, y+dy+dy)
+#define MOVEDXY(x,y,dx,dy) MOVE1 (x+dx, y+dy), MOVE1 (x+dx+dx, y+dy+dy)
+
+#define CLEAR(d) CLEARDXY(w->h,w->v, st->dirh[d],st->dirv[d])
+#define MOVE(d) (XSetForeground(st->dpy, st->draw_gc, st->colors[w->c].pixel), \
+ MOVEDXY(w->h,w->v, st->dirh[d],st->dirv[d]), \
+ w->h=w->h+st->dirh[d]*2, \
+ w->v=w->v+st->dirv[d]*2, dir=d)
+
+#define RANDOM (void) (w->h = R(st->width), w->v = R(st->height), w->c = R(st->ncolors), \
+ type=R(2), dir=R(4), (st->cycle && (w->cc=R(3)+st->ncolors)))
+
+
+
+#define SUCC(x) ((x+1)%4)
+#define PRED(x) ((x+3)%4)
+#define CCW PRED(dir)
+#define CW SUCC(dir)
+#define REV ((dir+2)%4)
+#define STR (dir)
+#define TRY(x) if (CLEAR(x)) { MOVE(x); break; }
+
+static void
+do_worm(struct state *st, struct worm *w)
+{
+ int type = w->s / 4;
+ int dir = w->s % 4;
+
+ w->c = (w->c+w->cc) % st->ncolors;
+
+ if (PROB(st->disorder)) type=PROB(st->handedness);
+ switch(type) {
+ case 0: /* CCW */
+ TRY(CCW)
+ TRY(STR)
+ TRY(CW)
+ RANDOM;
+ break;
+ case 1: /* CW */
+ TRY(CW)
+ TRY(STR)
+ TRY(CCW)
+ RANDOM;
+ break;
+ }
+ w->s = type*4+dir;
+ w->h = w->h % st->width;
+ w->v = w->v % st->height;
+}
+
+static void
+squiral_init_1 (struct state *st)
+{
+ int i;
+ if (st->worms) free (st->worms);
+ if (st->fill) free (st->fill);
+
+ st->worms=calloc(st->count, sizeof(struct worm));
+ st->fill=calloc(st->width*st->height, sizeof(int));
+
+ st->dirh[0]=0; st->dirh[1]=1; st->dirh[2]=0; st->dirh[3]=st->width-1;
+ st->dirv[0]=st->height-1; st->dirv[1]=0; st->dirv[2]=1; st->dirv[3]=0;
+ for(i=0;i<st->count;i++) {
+ st->worms[i].h=R(st->width);
+ st->worms[i].v=R(st->height);
+ st->worms[i].s=R(4)+4*PROB(st->handedness);
+ st->worms[i].c=R(st->ncolors);
+ if(st->cycle) { st->worms[i].cc=R(3)+st->ncolors; }
+ else st->worms[i].cc=0;
+ }
+}
+
+static void *
+squiral_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ Colormap cmap;
+ XWindowAttributes xgwa;
+ Bool writeable = False;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->delay= get_integer_resource(st->dpy, "delay", "Integer");
+
+ XClearWindow(st->dpy, st->window);
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+
+ cmap = xgwa.colormap;
+ gcv.foreground = get_pixel_resource(st->dpy, cmap, "foreground",
+ "Foreground");
+ st->draw_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ cmap = xgwa.colormap;
+ if( st->ncolors ) {
+ free_colors(xgwa.screen, cmap, st->colors, st->ncolors);
+ st->ncolors = 0;
+ }
+ if( mono_p ) {
+ st->ncolors=1;
+ st->colors[0].pixel=get_pixel_resource(st->dpy, cmap, "foreground","Foreground");
+ } else {
+ st->ncolors = get_integer_resource(st->dpy, "ncolors", "Integer");
+ if (st->ncolors < 0 || st->ncolors > NCOLORSMAX)
+ st->ncolors = NCOLORSMAX;
+ make_uniform_colormap(xgwa.screen, xgwa.visual, cmap,
+ st->colors, &st->ncolors, True,
+ &writeable, False);
+ if (st->ncolors <= 0) {
+ st->ncolors = 1;
+ st->colors[0].pixel=get_pixel_resource(st->dpy, cmap, "foreground","Foreground");
+ }
+ }
+ st->count= get_integer_resource(st->dpy, "count", "Integer");
+ st->frac = get_integer_resource(st->dpy, "fill", "Integer")*0.01;
+ st->cycle= get_boolean_resource(st->dpy, "cycle", "Cycle");
+ st->disorder=get_float_resource(st->dpy, "disorder", "Float");
+ st->handedness=get_float_resource(st->dpy, "handedness", "Float");
+
+ if(st->frac<0.01) st->frac=0.01;
+ if(st->frac>0.99) st->frac=0.99;
+ if(st->count==0) st->count=st->width/32;
+ if(st->count<1) st->count=1;
+ if(st->count>1000) st->count=1000;
+
+ if(st->worms) free(st->worms);
+ if(st->fill) free(st->fill);
+
+ squiral_init_1 (st);
+
+ return st;
+}
+
+static unsigned long
+squiral_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+
+ if(st->inclear<st->height) {
+ XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->inclear, st->width-1, st->inclear);
+ memset(&st->fill[st->inclear*st->width], 0, sizeof(int)*st->width);
+ XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->height-st->inclear-1, st->width-1,
+ st->height-st->inclear-1);
+ memset(&st->fill[(st->height-st->inclear-1)*st->width], 0, sizeof(int)*st->width);
+ st->inclear++;
+ XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->inclear, st->width-1, st->inclear);
+ if (st->inclear < st->height)
+ memset(&st->fill[st->inclear*st->width], 0, sizeof(int)*st->width);
+ XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->height-st->inclear-1, st->width-1,
+ st->height-st->inclear-1);
+ if (st->height - st->inclear >= 1)
+ memset(&st->fill[(st->height-st->inclear-1)*st->width], 0, sizeof(int)*st->width);
+ st->inclear++;
+ if(st->inclear>st->height/2) st->inclear=st->height;
+ }
+ else if(st->cov>(st->frac*st->width*st->height)) {
+ st->inclear=0;
+ st->cov=0;
+ }
+ for(i=0;i<st->count;i++) do_worm(st, &st->worms[i]);
+ return st->delay;
+}
+
+static void
+squiral_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+ squiral_init_1 (st);
+ XClearWindow (dpy, window);
+}
+
+static Bool
+squiral_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ squiral_init_1 (st);
+ XClearWindow (dpy, window);
+ return True;
+ }
+ return False;
+}
+
+static void
+squiral_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *squiral_defaults[] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*fill: 75",
+ "*count: 0",
+ "*ncolors: 100",
+ "*delay: 10000",
+ "*disorder: 0.005",
+ "*cycle: False",
+ "*handedness: 0.5",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec squiral_options[] = {
+ {"-fill", ".fill", XrmoptionSepArg, 0},
+ {"-count", ".count", XrmoptionSepArg, 0},
+ {"-delay", ".delay", XrmoptionSepArg, 0},
+ {"-disorder", ".disorder", XrmoptionSepArg, 0},
+ {"-handedness", ".handedness", XrmoptionSepArg, 0},
+ {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+ {"-cycle", ".cycle", XrmoptionNoArg, "True"},
+ {"-no-cycle", ".cycle", XrmoptionNoArg, "False"},
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Squiral", squiral)
diff --git a/hacks/squiral.man b/hacks/squiral.man
new file mode 100644
index 0000000..a34728b
--- /dev/null
+++ b/hacks/squiral.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "18-mar-1999" "X Version 11"
+.SH NAME
+squiral - square spirals screensaver
+.SH SYNOPSIS
+.B squiral
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-noinstall] [\-visual \fIvisual\fP] [\-fill \fIpercent\fP] [-count
+\fInumber\fP] [-delay \fIusec\fP] [-disorder \fIfraction\fP] [-handedness
+\fIfraction\fP] [-cycle]
+[\-fps]
+.SH DESCRIPTION
+The \fIsquiral\fP program displays interacting, spiral-producing automata
+
+.SH OPTIONS
+.I squiral
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fill \fIpercent\fP
+Specify the percent (0-100) of the screen which must be filled before
+the screen is cleared. 60-80 percent are good values.
+.TP 8
+.B \-count \fInumber\fP
+The number of squiralies. By default, the screen width divided by 32.
+.TP 8
+.B \-delay \fIusec\fP
+The wait between steps. The default is 1000.
+.TP 8
+.B \-disorder \fIfraction\fP
+The fraction of the time a squiraly will choose a new direction.
+The default is 0.005.
+.TP 8
+.B \-handedness \fIfraction\fP
+The fraction of the time a squiraly will choose to enter lefthanded
+mode. 0.0 means exclusively right-handed behavior, 0.5 (the default) is
+a balance between the two, and 1.0 is exclusively left-handed behaviour.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+None known
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999, by Jeff Epler. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided fnord that the above copyright notice
+appear in all copies and that both that copyright notice and this permission
+notice appear in supporting documentation. No representations are made about
+the suitability of fnord this software for any purpose. It is provided "as
+is" without express or fnord implied warranty.
+.SH AUTHOR
+Jeff Epler <jepler@inetnebr.com>, 18-mar-1999
+
diff --git a/hacks/starfish.c b/hacks/starfish.c
new file mode 100644
index 0000000..5e94144
--- /dev/null
+++ b/hacks/starfish.c
@@ -0,0 +1,559 @@
+/* xscreensaver, Copyright (c) 1997-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+
+#define SCALE 1000 /* fixed-point math, for sub-pixel motion */
+
+
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+enum starfish_mode {
+ pulse,
+ zoom
+};
+
+struct starfish {
+ enum starfish_mode mode;
+ Bool blob_p;
+ int skip;
+ long x, y; /* position of midpoint */
+ double th; /* angle of rotation */
+ double rotv; /* rotational velocity */
+ double rota; /* rotational acceleration */
+ long elasticity; /* how fast it deforms: radial velocity */
+ double rot_max;
+ long min_r, max_r; /* radius range */
+ int npoints; /* control points */
+ long *r; /* radii */
+ spline *spline;
+ XPoint *prev;
+ int n_prev;
+};
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Colormap cmap;
+ XColor *colors;
+ int ncolors;
+ int fg_index;
+ GC gc;
+
+ int delay, delay2, duration, direction, blob_p;
+
+ Bool done_once;
+ Bool initted;
+ unsigned long black, white;
+
+ long tick;
+ time_t start_time;
+
+ struct starfish *starfish;
+};
+
+
+static struct starfish *
+make_starfish (struct state *st, int maxx, int maxy, int size)
+{
+ struct starfish *s = (struct starfish *) calloc(1, sizeof(*s));
+ int i;
+
+ s->blob_p = st->blob_p;
+ s->elasticity = SCALE * get_float_resource (st->dpy, "thickness", "Thickness");
+
+ if (s->elasticity == 0)
+ /* bell curve from 0-15, avg 7.5 */
+ s->elasticity = RAND(5*SCALE) + RAND(5*SCALE) + RAND(5*SCALE);
+
+ s->rotv = get_float_resource (st->dpy, "rotation", "Rotation");
+ if (s->rotv == -1)
+ /* bell curve from 0-12 degrees, avg 6 */
+ s->rotv = frand(4) + frand(4) + frand(4);
+
+ s->rotv /= 360; /* convert degrees to ratio */
+
+ if (s->blob_p)
+ {
+ s->elasticity *= 3;
+ s->rotv *= 3;
+ }
+
+ s->rot_max = s->rotv * 2;
+ s->rota = 0.0004 + frand(0.0002);
+
+
+ if (! (random() % 20))
+ size *= frand(0.35) + frand(0.35) + 0.3;
+
+ {
+ static const char skips[] = { 2, 2, 2, 2,
+ 3, 3, 3,
+ 6, 6,
+ 12 };
+ s->skip = skips[random() % sizeof(skips)];
+ }
+
+ if (! (random() % (s->skip == 2 ? 3 : 12)))
+ s->mode = zoom;
+ else
+ s->mode = pulse;
+
+ maxx *= SCALE;
+ maxy *= SCALE;
+ size *= SCALE;
+
+ s->max_r = size;
+ s->min_r = 0;
+
+ if (s->min_r < (5*SCALE)) s->min_r = (5*SCALE);
+
+ s->x = maxx/2;
+ s->y = maxy/2;
+
+ s->th = frand(M_PI+M_PI) * RANDSIGN();
+
+ {
+ static const char sizes[] = { 3, 3, 3, 3, 3,
+ 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5,
+ 8, 8, 8,
+ 10,
+ 35 };
+ int nsizes = sizeof(sizes);
+ if (s->skip > 3)
+ nsizes -= 4;
+ s->npoints = s->skip * sizes[random() % nsizes];
+ }
+
+ s->spline = make_spline (s->npoints);
+ s->r = (long *) malloc (sizeof(*s->r) * s->npoints);
+
+ for (i = 0; i < s->npoints; i++)
+ s->r[i] = ((i % s->skip) == 0) ? 0 : size;
+
+ return s;
+}
+
+
+static void
+free_starfish (struct starfish *s)
+{
+ if (s->r) free (s->r);
+ if (s->prev) free (s->prev);
+ if (s->spline)
+ {
+ if (s->spline->control_x) free (s->spline->control_x);
+ if (s->spline->control_y) free (s->spline->control_y);
+ if (s->spline->points) free (s->spline->points);
+ free (s->spline);
+ }
+ free (s);
+}
+
+
+static void
+throb_starfish (struct starfish *s)
+{
+ int i;
+ double frac = ((M_PI+M_PI) / s->npoints);
+
+ for (i = 0; i < s->npoints; i++)
+ {
+ long r = s->r[i];
+ long ra = (r > 0 ? r : -r);
+ double th = (s->th > 0 ? s->th : -s->th);
+ long x, y;
+ long elasticity = s->elasticity;
+
+ /* place control points evenly around perimiter, shifted by theta */
+ x = s->x + ra * cos (i * frac + th);
+ y = s->y + ra * sin (i * frac + th);
+
+ s->spline->control_x[i] = x / SCALE;
+ s->spline->control_y[i] = y / SCALE;
+
+ if (s->mode == zoom && ((i % s->skip) == 0))
+ continue;
+
+ /* Slow down near the end points: move fastest in the middle. */
+ {
+ double ratio = (double)ra / (double)(s->max_r - s->min_r);
+ if (ratio > 0.5) ratio = 1-ratio; /* flip */
+ ratio *= 2; /* normalize */
+ ratio = (ratio * 0.9) + 0.1; /* fudge */
+ elasticity *= ratio;
+ }
+
+
+ /* Increase/decrease radius by elasticity */
+ ra += (r >= 0 ? elasticity : -elasticity);
+ if ((i % s->skip) == 0)
+ ra += (elasticity / 2);
+
+ r = ra * (r >= 0 ? 1 : -1);
+
+ /* If we've reached the end (too long or too short) reverse direction. */
+ if ((ra > s->max_r && r >= 0) ||
+ (ra < s->min_r && r < 0))
+ r = -r;
+
+ s->r[i] = r;
+ }
+}
+
+
+static void
+spin_starfish (struct starfish *s)
+{
+ double th = s->th;
+ if (th < 0)
+ th = -(th + s->rotv);
+ else
+ th += s->rotv;
+
+ if (th > (M_PI+M_PI))
+ th -= (M_PI+M_PI);
+ else if (th < 0)
+ th += (M_PI+M_PI);
+
+ s->th = (s->th > 0 ? th : -th);
+
+ s->rotv += s->rota;
+
+ if (s->rotv > s->rot_max ||
+ s->rotv < -s->rot_max)
+ {
+ s->rota = -s->rota;
+ }
+ /* If it stops, start it going in the other direction. */
+ else if (s->rotv < 0)
+ {
+ if (random() & 1)
+ {
+ /* keep going in the same direction */
+ s->rotv = 0;
+ if (s->rota < 0)
+ s->rota = -s->rota;
+ }
+ else
+ {
+ /* reverse gears */
+ s->rotv = -s->rotv;
+ s->rota = -s->rota;
+ s->th = -s->th;
+ }
+ }
+
+
+ /* Alter direction of rotational acceleration randomly. */
+ if (! (random() % 120))
+ s->rota = -s->rota;
+
+ /* Change acceleration very occasionally. */
+ if (! (random() % 200))
+ {
+ if (random() & 1)
+ s->rota *= 1.2;
+ else
+ s->rota *= 0.8;
+ }
+}
+
+
+static void
+draw_starfish (struct state *st, Drawable drawable, GC this_gc, struct starfish *s,
+ Bool fill_p)
+{
+ compute_closed_spline (s->spline);
+ if (s->prev)
+ {
+ XPoint *points = (XPoint *)
+ malloc (sizeof(XPoint) * (s->n_prev + s->spline->n_points + 2));
+ int i = s->spline->n_points;
+ int j = s->n_prev;
+ memcpy (points, s->spline->points, (i * sizeof(*points)));
+ memcpy (points+i, s->prev, (j * sizeof(*points)));
+
+ if (s->blob_p)
+ XClearWindow (st->dpy, drawable);
+ XFillPolygon (st->dpy, drawable, this_gc, points, i+j, Complex, CoordModeOrigin);
+ free (points);
+
+ free (s->prev);
+ s->prev = 0;
+ }
+
+ s->prev = (XPoint *) malloc (s->spline->n_points * sizeof(XPoint));
+ memcpy (s->prev, s->spline->points, s->spline->n_points * sizeof(XPoint));
+ s->n_prev = s->spline->n_points;
+
+#ifdef DEBUG
+ if (s->blob_p)
+ {
+ int i;
+ for (i = 0; i < s->npoints; i++)
+ XDrawLine (st->dpy, drawable, this_gc, s->x/SCALE, s->y/SCALE,
+ s->spline->control_x[i], s->spline->control_y[i]);
+ }
+#endif
+}
+
+
+static struct starfish *
+make_window_starfish (struct state *st)
+{
+ XWindowAttributes xgwa;
+ int size;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ size = (xgwa.width < xgwa.height ? xgwa.width : xgwa.height);
+ if (st->blob_p) size /= 2;
+ else size *= 1.3;
+
+ if (xgwa.width < 100 || xgwa.height < 100) /* tiny window */
+ {
+ size = (xgwa.width > xgwa.height ? xgwa.width : xgwa.height);
+ if (size < 100) size = 100;
+ }
+
+ return make_starfish (st, xgwa.width, xgwa.height, size);
+}
+
+
+static struct starfish *
+reset_starfish (struct state *st)
+{
+ XGCValues gcv;
+ unsigned int flags = 0;
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->cmap = xgwa.colormap;
+
+ if (st->done_once)
+ {
+ if (st->colors && st->ncolors)
+ free_colors (xgwa.screen, st->cmap, st->colors, st->ncolors);
+ if (st->colors)
+ free (st->colors);
+ st->colors = 0;
+ XFreeGC (st->dpy, st->gc);
+ st->gc = 0;
+ }
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+
+ if (mono_p)
+ st->colors = 0;
+ else
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+
+ if (mono_p)
+ ;
+ else if (random() % 3)
+ make_smooth_colormap (xgwa.screen, xgwa.visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+ else
+ make_uniform_colormap (xgwa.screen, xgwa.visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+
+ st->fg_index = 0;
+
+ if (!mono_p && !st->blob_p)
+ {
+ flags |= GCForeground;
+ gcv.foreground = st->colors[st->fg_index].pixel;
+ XSetWindowBackground (st->dpy, st->window, gcv.foreground);
+ }
+
+ if (!st->done_once)
+ {
+ XClearWindow (st->dpy, st->window);
+ st->done_once = 1;
+ }
+
+ flags |= GCFillRule;
+ gcv.fill_rule = EvenOddRule;
+ st->gc = XCreateGC (st->dpy, st->window, flags, &gcv);
+#ifdef HAVE_JWXYZ
+ if (!st->blob_p)
+ jwxyz_XSetAntiAliasing (st->dpy, st->gc, False);
+#endif
+
+ return make_window_starfish (st);
+}
+
+
+
+static void
+run_starfish (struct state *st, struct starfish *s)
+{
+ throb_starfish (s);
+ spin_starfish (s);
+ draw_starfish (st, st->window, st->gc, s, False);
+
+ if (mono_p)
+ {
+ if (!st->initted)
+ {
+ st->black = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
+ st->white = get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+ st->initted = True;
+ st->fg_index = st->white;
+ XSetForeground (st->dpy, st->gc, st->fg_index);
+ }
+ else if (!s->blob_p)
+ {
+ st->fg_index = (st->fg_index == st->black ? st->white : st->black);
+ XSetForeground (st->dpy, st->gc, st->fg_index);
+ }
+ }
+ else
+ {
+ st->fg_index = (st->fg_index + 1) % st->ncolors;
+ XSetForeground (st->dpy, st->gc, st->colors [st->fg_index].pixel);
+ }
+}
+
+
+static void *
+starfish_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ char *s;
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Delay") * 1000000;
+/* st->duration = get_seconds_resource (st->dpy, "duration", "Seconds");*/
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ st->direction = (random() & 1) ? 1 : -1;
+
+ s = get_string_resource (st->dpy, "mode", "Mode");
+ if (s && !strcasecmp (s, "blob"))
+ st->blob_p = True;
+ else if (s && !strcasecmp (s, "zoom"))
+ st->blob_p = False;
+ else if (!s || !*s || !strcasecmp (s, "random"))
+ st->blob_p = !(random() % 3);
+ else
+ fprintf (stderr, "%s: mode must be blob, zoom, or random", progname);
+
+ if (st->blob_p)
+ st->delay *= 3;
+
+ st->starfish = reset_starfish (st);
+ return st;
+}
+
+static unsigned long
+starfish_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ struct starfish *s = st->starfish;
+ time_t now;
+
+ run_starfish (st, s);
+
+ if (st->duration > 0)
+ {
+ if (st->start_time == 0)
+ st->start_time = time ((time_t *) 0);
+ now = time ((time_t *) 0);
+ if (st->start_time + st->duration < now)
+ {
+ st->start_time = now;
+
+ free_starfish (s);
+
+ /* Every now and then, pick new colors; otherwise, just build
+ a new starfish with the current colors. */
+ if (! (random () % 10))
+ s = reset_starfish (st);
+ else
+ s = make_window_starfish (st);
+
+ st->starfish = s;
+ }
+ }
+
+ return st->delay;
+}
+
+static void
+starfish_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ free_starfish (st->starfish);
+ st->starfish = 0;
+ st->starfish = reset_starfish (st);
+}
+
+static Bool
+starfish_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+starfish_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+
+static const char *starfish_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 10000",
+ "*thickness: 0", /* pixels, 0 = random */
+ "*rotation: -1", /* degrees, -1 = "random" */
+ "*colors: 200",
+ "*duration: 30",
+ "*delay2: 5",
+ "*mode: random",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec starfish_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-rotation", ".rotation", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-blob", ".mode", XrmoptionNoArg, "blob" },
+ { "-zoom", ".mode", XrmoptionNoArg, "zoom" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Starfish", starfish)
diff --git a/hacks/starfish.man b/hacks/starfish.man
new file mode 100644
index 0000000..306f66c
--- /dev/null
+++ b/hacks/starfish.man
@@ -0,0 +1,84 @@
+.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
+.SH NAME
+starfish - radially-symmetric throbbing colormap-hacking graphics demo
+.SH SYNOPSIS
+.B starfish
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-delay2 \fIsecs\fP] [\-thickness \fIpixels\fP] [\-rotation \fIdegrees\fP] [\-duration \fIseconds\fP] [\-colors \fIint\fP] [\-blob] [\-no\-blob]
+[\-fps]
+.SH DESCRIPTION
+The \fIstarfish\fP program draws radially symmetric objects, which expand,
+contract, rotate, and turn inside out. It uses these shapes to lay down a
+field of smooth colors, and then rotates the colormap.
+.SH OPTIONS
+.I starfish
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 10000, or about 1/100th second.
+.TP 8
+.B \-thickness \fIpixels\fP
+How wide each color band should be. Default 0, meaning random (the chosen
+value will be between 0 and 15.)
+.TP 8
+.B \-rotation \fIdegrees\fP
+How quickly the objects should rotate at each step. Default 0, meaning
+random (the chosen value will be between 0 and 12 degrees.)
+.TP 8
+.B \-colors \fIint\fP
+How many colors to use. Default 200. The more colors, the smoother the
+transitions will be, and the nicer the resultant images.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before choosing a new shape. Default 30 seconds.
+.TP 8
+.B \-delay2 \fIseconds\fP
+When \fIduration\fP expires, how long to wait before starting a new run.
+Default 5 seconds.
+.TP 8
+.B \-blob
+.TP 8
+.B \-no\-blob
+If \fIblob\fP option is specified, then the raw shapes will be shown,
+instead of a field of colors generated from them.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Jun-97.
diff --git a/hacks/strange.c b/hacks/strange.c
new file mode 100644
index 0000000..89e9a3b
--- /dev/null
+++ b/hacks/strange.c
@@ -0,0 +1,1341 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* strange --- strange attractors */
+
+#if 0
+static const char sccsid[] = "@(#)strange.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+* Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr>
+*
+* Permission to use, copy, modify, and distribute this software and its
+* documentation for any purpose and without fee is hereby granted,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation.
+*
+* This file is provided AS IS with no warranties of any kind. The author
+* shall have no liability with respect to the infringement of copyrights,
+* trade secrets or any patents by this file or any part thereof. In no
+* event will the author be liable for any lost revenue or profits or
+* other special, indirect and consequential damages.
+*
+* Revision History:
+* 10-Apr-2017: dmo2118@gmail.com: Enhancements for accumulator mode:
+* Performance tuning, varying colors, fixed wobbliness.
+* New options: point size, zoom, brightness, motion blur.
+* 08-Apr-2017: dmo2118@gmail.com: Merged with current xlockmore strange.c.
+* Also resurrected the -curve parameter from XScreenSaver 2.31.
+* Multi-monitor fixes.
+* More allocation checks.
+* 13-Apr-2010: Added useAccumulator, VARY_SPEED_TO_AVOID_BOREDOM.
+* 22-Dec-2004: TDA: Replace Gauss_Rand with a real Gaussian.
+* 01-Nov-2000: Allocation checks
+* 30-Jul-1998: sineswiper@resonatorsoft.com: added curve factor (discovered
+* while experimenting with the Gauss_Rand function).
+* 10-May-1997: jwz AT jwz.org: turned into a standalone program.
+* Made it render into an offscreen bitmap and then copy
+* that onto the screen, to reduce flicker.
+*
+* strange attractors are not so hard to find...
+*/
+
+/* Be sure to try:
+* ./strange -points 500000 -delay 0 -point-size 3
+* ./strange -points 500000 -delay 0 -point-size 2 -curve 5 -zoom 1.5 -brightness 0.75
+*/
+
+/* TODO: Can anything be done about the overflow with -point-size 32? */
+
+#ifdef STANDALONE
+# define MODE_strange
+# define DEFAULTS "*delay: 10000 \n" \
+ "*ncolors: 100 \n" \
+ "*fpsSolid: True \n" \
+ "*ignoreRotation: True \n" \
+ "*useSHM: True \n" \
+ "*useThreads: True \n" \
+ "*lowrez: True \n" \
+
+# define SMOOTH_COLORS
+# define release_strange 0
+# define reshape_strange 0
+# define strange_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# define ENTRYPOINT
+#endif /* !STANDALONE */
+
+#include <errno.h>
+#include "pow2.h"
+#include "thread_util.h"
+#include "xshm.h"
+
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#ifdef MODE_strange
+#define DEF_CURVE "10"
+#define DEF_POINTS "5500"
+#define DEF_POINT_SIZE "1"
+#define DEF_ZOOM "0.9" /* approx. 1 / 1.1 */
+#define DEF_BRIGHTNESS "1.0"
+#define DEF_MOTION_BLUR "3.0" /* Formerly MERGE_FRAMES, but it's IIR now. */
+
+static int curve;
+static int points;
+static int pointSize;
+static float zoom;
+static float brightness;
+static float motionBlur;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-curve", ".strange.curve", XrmoptionSepArg, 0},
+ {"-points", ".strange.points", XrmoptionSepArg, 0},
+ {"-point-size", ".strange.pointSize", XrmoptionSepArg, 0},
+ {"-zoom", ".strange.zoom", XrmoptionSepArg, 0},
+ {"-brightness", ".strange.brightness", XrmoptionSepArg, 0},
+ {"-motion-blur", ".strange.motionBlur", XrmoptionSepArg, 0},
+ THREAD_OPTIONS
+};
+static argtype vars[] =
+{
+ {&curve, "curve", "Curve", DEF_CURVE, t_Int},
+ {&points, "points", "Points", DEF_POINTS, t_Int},
+ {&pointSize, "pointSize", "PointSize", DEF_POINT_SIZE, t_Int},
+ {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
+ {&brightness, "brightness", "Brightness", DEF_BRIGHTNESS, t_Float},
+ {&motionBlur, "motionBlur", "MotionBlur", DEF_MOTION_BLUR, t_Float},
+};
+static OptionStruct desc[] =
+{
+ {"-curve", "set the curve factor of the attractors"},
+ {"-points", "change the number of points/iterations each frame"},
+ {"-point-size", "change the size of individual points"},
+ {"-zoom", "zoom in or out"},
+ {"-brightness", "adjust the brightness for accumulator mode"},
+ {"-motion-blur", "adds motion blur"},
+};
+ENTRYPOINT ModeSpecOpt strange_opts =
+{sizeof opts / sizeof opts[0], opts,
+sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct strange_description =
+{"strange", "init_strange", "draw_strange", (char *) NULL,
+"init_strange", "init_strange", "free_strange", &strange_opts,
+10000, 1, 1, 1, 64, 1.0, "",
+"Shows strange attractors", 0, NULL};
+#endif
+
+#ifdef HAVE_JWXYZ
+# define NO_DBUF
+#endif
+
+typedef float DBL;
+typedef int PRM;
+
+#define UNIT_BITS 12
+#define UNIT (1<<UNIT_BITS)
+#define UNIT2 (1<<14)
+#define COLOR_BITS 16
+/* #define UNIT2 (3140*UNIT/1000) */
+
+#define SKIP_FIRST 100
+#define DBL_To_PRM(x) (PRM)( (DBL)(UNIT)*(x) )
+
+
+#define DO_FOLD(a) (a)<0 ? -A->Fold[ (-(a))&(UNIT2-1) ] : A->Fold[ (a)&(UNIT2-1) ]
+
+#if 0
+#define DO_FOLD(a) (a)<-UNIT2 ? -A->Fold[(-(a))%UNIT2] : (a)<0 ? -A->Fold[ -(a) ] :\
+(a)>UNIT2 ? A->Fold[ (a)%UNIT2 ] : A->Fold[ (a) ]
+#define DO_FOLD(a) DBL_To_PRM( sin( (DBL)(a)/UNIT ) )
+#define DO_FOLD(a) (a)<0 ? DBL_To_PRM( exp( 16.0*(a)/UNIT2 ) )-1.0 : \
+DBL_To_PRM( 1.0-exp( -16.0*(a)/UNIT2 ) )
+#endif
+
+/* useAccumulator performs two functions:
+* If it is defined, then support for the accumulator will be compiled.
+* It is also the condition for which the accumulator renderer will engage.
+*/
+#define useAccumulator (A->Max_Pt > 6000)
+#define ACC_GAMMA 10.0
+#define DEF_NUM_COLS 150
+/* Extra options: */
+#define VARY_SPEED_TO_AVOID_BOREDOM
+/*#define AUTO_ZOOM*/ /* Works funny, but try it with -curve 5. */
+
+/******************************************************************/
+
+#define MAX_PRM 3*5
+
+#if defined(__BIGGEST_ALIGNMENT__) \
+ && (defined(__GNUC__) \
+ && (__GNUC__ == 4 && __GNUC_MINOR__ >= 4 || __GNUC__ >= 5) \
+ || defined(__clang__))
+# define ALIGNED __attribute__((aligned(__BIGGEST_ALIGNMENT__)))
+# define ALIGN_HINT(ptr) __builtin_assume_aligned((ptr), __BIGGEST_ALIGNMENT__)
+#else
+# define ALIGNED
+# define ALIGN_HINT(ptr) (ptr)
+# ifndef __BIGGEST_ALIGNMENT__
+# define __BIGGEST_ALIGNMENT__ (sizeof(void *))
+# endif
+#endif
+
+
+#ifdef HAVE_INTTYPES_H
+typedef uint16_t ALIGNED PIXEL0;
+typedef uint32_t PIXEL0X;
+typedef uint32_t ALIGNED PIXEL1;
+#else
+typedef unsigned short ALIGNED PIXEL0;
+typedef unsigned long PIXEL0X;
+typedef unsigned long ALIGNED PIXEL1;
+#endif
+
+static const union {
+#ifdef HAVE_INTTYPES_H
+ uint16_t signature;
+ uint8_t bytes[2];
+#else
+ unsigned short signature;
+ unsigned char bytes[2];
+#endif
+} byte_order_union = {MSBFirst};
+
+#define LOCAL_BYTE_ORDER byte_order_union.bytes[1]
+
+typedef struct _ATTRACTOR {
+ DBL Prm1[MAX_PRM], Prm2[MAX_PRM];
+ PRM Prm[MAX_PRM], *Fold;
+ void (*Iterate) (const struct _ATTRACTOR *, PRM, PRM, PRM *, PRM *);
+ void *Buffer1, *Buffer2; /* Either XPoint or XRectangle. */
+ int Cur_Pt, Max_Pt;
+ int Col, Count, Speed;
+ int Width, Height;
+ Pixmap dbuf; /* jwz */
+ GC dbuf_gc;
+ #ifdef useAccumulator
+ int visualClass;
+ size_t alignedWidth;
+ unsigned long rMask, gMask, bMask;
+ unsigned rShift, gShift, bShift;
+ PIXEL0 blurFac; /* == 0 when no motion blur is taking place. */
+ double colorFac;
+ XColor *palette;
+ unsigned numCols;
+ unsigned long *cols;
+ XImage *accImage;
+ XShmSegmentInfo shmInfo;
+ struct _THREAD **threads;
+ struct threadpool pool;
+ #endif
+} ATTRACTOR;
+
+static ATTRACTOR *Root = (ATTRACTOR *) NULL;
+
+#ifdef useAccumulator
+typedef struct _THREAD {
+ const ATTRACTOR *Attractor;
+ unsigned long Rnd;
+ size_t y0, y1, y2;
+
+ PIXEL0 **accMap;
+ PIXEL0 *bloomRows;
+ PIXEL1 *colorRow;
+ PIXEL0 *motionBlur;
+
+ PRM xmin, xmax, ymin, ymax;
+ unsigned pixelCount;
+} THREAD;
+#endif
+
+static DBL Amp_Prm[MAX_PRM] =
+{
+ 1.0, 3.5, 3.5, 2.5, 4.7,
+ 1.0, 3.5, 3.6, 2.5, 4.7,
+ 1.0, 1.5, 2.2, 2.1, 3.5
+};
+static DBL Mid_Prm[MAX_PRM] =
+{
+ 0.0, 1.5, 0.0, .5, 1.5,
+ 0.0, 1.5, 0.0, .5, 1.5,
+ 0.0, 1.5, -1.0, -.5, 2.5,
+};
+
+#if 0
+
+static inline uint64_t frq(void)
+{
+ return 1000000;
+}
+
+static inline uint64_t tick(void)
+{
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec * frq() + tv.tv_usec;
+}
+
+#endif
+
+static DBL
+Old_Gauss_Rand(DBL c, DBL A, DBL S)
+{
+ DBL y,z;
+
+ y = (DBL) LRAND() / MAXRAND;
+ z = curve / 10;
+ y = A * (z - exp(-y * y * S)) / (z - exp(-S));
+ if (NRAND(2))
+ return (c + y);
+ else
+ return (c - y);
+}
+
+#if 0
+/* dmo2118: seems to be responsible for lots of boring-looking rings */
+
+/* I don't know that it makes a difference, but this one actually *is*
+ a Gaussian. [TDA] */
+
+/* Generate Gaussian random number: mean c, "amplitude" A (actually
+ A is 3*standard deviation). 'S' is unused. */
+
+/* Note this generates a pair of gaussian variables, so it saves one
+ to give out next time it's called */
+
+static double
+Gauss_Rand(DBL c, DBL A, DBL S)
+{
+ static double d;
+ static Bool ready = 0;
+ if(ready) {
+ ready = 0;
+ return c + A/3 * d;
+ } else {
+ double x, y, w;
+ do {
+ x = 2.0 * (double)LRAND() / MAXRAND - 1.0;
+ y = 2.0 * (double)LRAND() / MAXRAND - 1.0;
+ w = x*x + y*y;
+ } while(w >= 1.0);
+
+ w = sqrt((-2 * log(w))/w);
+ ready = 1;
+ d = x * w;
+ return c + A/3 * y * w;
+ }
+}
+#endif
+
+static void
+Random_Prm(DBL * Prm)
+{
+ int i;
+
+ for (i = 0; i < MAX_PRM; ++i) {
+#if 0
+ if (curve == 10)
+ Prm[i] = Gauss_Rand (Mid_Prm[i], Amp_Prm[i], 4.0);
+ else
+#endif
+ Prm[i] = Old_Gauss_Rand (Mid_Prm[i], Amp_Prm[i], 4.0);
+ }
+}
+
+/***************************************************************/
+
+ /* 2 examples of non-linear map */
+
+static void
+Iterate_X2(const ATTRACTOR * A, PRM x, PRM y, PRM * xo, PRM * yo)
+{
+ PRM xx, yy, xy, x2y, y2x, Tmp;
+
+ xx = (x * x) >> UNIT_BITS;
+ x2y = (xx * y) >> UNIT_BITS;
+ yy = (y * y) >> UNIT_BITS;
+ y2x = (yy * x) >> UNIT_BITS;
+ xy = (x * y) >> UNIT_BITS;
+
+ Tmp = A->Prm[1] * xx + A->Prm[2] * xy + A->Prm[3] * yy + A->Prm[4] * x2y;
+ Tmp = A->Prm[0] - y + (Tmp >> UNIT_BITS);
+ *xo = DO_FOLD(Tmp);
+ Tmp = A->Prm[6] * xx + A->Prm[7] * xy + A->Prm[8] * yy + A->Prm[9] * y2x;
+ Tmp = A->Prm[5] + x + (Tmp >> UNIT_BITS);
+ *yo = DO_FOLD(Tmp);
+}
+
+static void
+Iterate_X3(const ATTRACTOR * A, PRM x, PRM y, PRM * xo, PRM * yo)
+{
+ PRM xx, yy, xy, x2y, y2x, Tmp_x, Tmp_y, Tmp_z;
+
+ xx = (x * x) >> UNIT_BITS;
+ x2y = (xx * y) >> UNIT_BITS;
+ yy = (y * y) >> UNIT_BITS;
+ y2x = (yy * x) >> UNIT_BITS;
+ xy = (x * y) >> UNIT_BITS;
+
+ Tmp_x = A->Prm[1] * xx + A->Prm[2] * xy + A->Prm[3] * yy + A->Prm[4] * x2y;
+ Tmp_x = A->Prm[0] - y + (Tmp_x >> UNIT_BITS);
+ Tmp_x = DO_FOLD(Tmp_x);
+
+ Tmp_y = A->Prm[6] * xx + A->Prm[7] * xy + A->Prm[8] * yy + A->Prm[9] * y2x;
+ Tmp_y = A->Prm[5] + x + (Tmp_y >> UNIT_BITS);
+
+ Tmp_y = DO_FOLD(Tmp_y);
+
+ Tmp_z = A->Prm[11] * xx + A->Prm[12] * xy + A->Prm[13] * yy + A->Prm[14] * y2x;
+ Tmp_z = A->Prm[10] + x + (Tmp_z >> UNIT_BITS);
+ Tmp_z = UNIT + ((Tmp_z * Tmp_z) >> UNIT_BITS);
+
+ /* Can happen with -curve 9. */
+ if (!Tmp_z)
+ Tmp_z = 1;
+
+#ifdef HAVE_INTTYPES_H
+ {
+ uint64_t Tmp_z1 = (1 << 30) / Tmp_z;
+ *xo = (Tmp_x * Tmp_z1) >> (30 - UNIT_BITS);
+ *yo = (Tmp_y * Tmp_z1) >> (30 - UNIT_BITS);
+ }
+#else
+ *xo = (Tmp_x * UNIT) / Tmp_z;
+ *yo = (Tmp_y * UNIT) / Tmp_z;
+#endif
+}
+
+static void (*Funcs[2]) (const ATTRACTOR *, PRM, PRM, PRM *, PRM *) = {
+ Iterate_X2, Iterate_X3
+};
+
+/***************************************************************/
+
+ENTRYPOINT void
+free_strange(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ ATTRACTOR *A = &Root[MI_SCREEN(mi)];
+
+ if (A->Buffer1 != NULL) {
+ free(A->Buffer1);
+ A->Buffer1 = (XPoint *) NULL;
+ }
+ if (A->Buffer2 != NULL) {
+ free(A->Buffer2);
+ A->Buffer2 = (XPoint *) NULL;
+ }
+ if (A->dbuf) {
+ XFreePixmap(display, A->dbuf);
+ A->dbuf = None;
+ }
+ if (A->dbuf_gc) {
+ XFreeGC(display, A->dbuf_gc);
+ A->dbuf_gc = None;
+ }
+ if (A->Fold != NULL) {
+ free(A->Fold);
+ A->Fold = (PRM *) NULL;
+ }
+
+#ifdef useAccumulator
+ if (useAccumulator) {
+ if (A->pool.count) {
+ threadpool_destroy (&A->pool);
+ A->pool.count = 0;
+ }
+
+ free (A->threads);
+ A->threads = NULL;
+
+ if (A->accImage) {
+ destroy_xshm_image (display, A->accImage, &A->shmInfo);
+ A->accImage = NULL;
+ }
+
+ free (A->palette);
+ A->palette = NULL;
+
+ if (A->cols) {
+ if (A->visualClass != TrueColor && A->numCols > 2)
+ XFreeColors (display, MI_COLORMAP(mi), A->cols, A->numCols, 0);
+ free (A->cols);
+ A->cols = NULL;
+ }
+ }
+#endif
+}
+
+/* NRAND() is also in use; making three PRNGs in total here. */
+
+/* ISO/IEC 9899 suggests this one. Doesn't require 64-bit math. */
+#define GOODRND(seed) ((seed) = (((seed) * 1103515245 + 12345) & 0x7fffffff))
+#define GOODRND_BITS 31
+
+/* Extremely cheap entropy: this is often a single LEA instruction. */
+#define CHEAPRND(seed) ((seed) = (seed) * 5)
+
+static void
+init_draw (const ATTRACTOR *A, PRM *x, PRM *y,
+ PRM *xmin, PRM *ymin, PRM *xmax, PRM *ymax, unsigned long *rnd)
+{
+ int n;
+ PRM xo, yo;
+
+ *xmin = UNIT;
+ *ymin = UNIT;
+ *xmax = -UNIT;
+ *ymax = -UNIT;
+
+ *x = *y = DBL_To_PRM(.0);
+ for (n = SKIP_FIRST; n; --n) {
+ (*A->Iterate) (A, *x, *y, &xo, &yo);
+
+#ifdef AUTO_ZOOM
+ if (xo > *xmax)
+ *xmax = xo;
+ if (xo < *xmin)
+ *xmin = xo;
+ if (yo > *ymax)
+ *ymax = yo;
+ if (yo < *ymin)
+ *ymin = yo;
+#endif
+
+ /* Can't use NRAND(), because that modifies global state in a
+ * thread-unsafe way.
+ */
+ *x = xo + (GOODRND(*rnd) >> (GOODRND_BITS - 3)) - 4;
+ *y = yo + (GOODRND(*rnd) >> (GOODRND_BITS - 3)) - 4;
+ }
+}
+
+static void
+recalc_scale (const ATTRACTOR *A, PRM xmin, PRM ymin, PRM xmax, PRM ymax,
+ DBL *Lx, DBL *Ly, PRM *mx, PRM *my)
+{
+#ifndef AUTO_ZOOM
+ xmin = -UNIT;
+ ymin = -UNIT;
+ xmax = UNIT;
+ ymax = UNIT;
+#endif
+
+ *Lx = zoom * (DBL) A->Width / (xmax - xmin);
+ *Ly = -zoom * (DBL) A->Height / (ymax - ymin);
+ *mx = A->Width/2 - (xmax + xmin) * *Lx / 2;
+ *my = A->Height/2 - (ymax + ymin) * *Ly / 2;
+}
+
+#ifdef useAccumulator
+
+static void
+thread_destroy (void *Self_Raw)
+{
+ THREAD *T = (THREAD *)Self_Raw;
+
+ aligned_free (T->accMap[0]);
+ (void) free((void *) T->accMap);
+ aligned_free (T->bloomRows);
+ aligned_free (T->colorRow);
+ aligned_free (T->motionBlur);
+}
+
+static int
+thread_create (void *Self_Raw, struct threadpool *pool, unsigned id)
+{
+ THREAD *T = (THREAD *)Self_Raw;
+ int i;
+ const ATTRACTOR *A = GET_PARENT_OBJ(ATTRACTOR, pool, pool);
+
+ memset (T, 0, sizeof(*T));
+
+ T->Attractor = A;
+ A->threads[id] = T;
+
+ T->Rnd = random();
+
+ /* The gap between y0 and y1 is to preheat the box blur. */
+ T->y1 = A->Height * id / pool->count;
+ T->y2 = A->Height * (id + 1) / pool->count;
+ T->y0 = T->y1 < pointSize ? 0 : T->y1 - pointSize;
+
+ T->accMap = (PIXEL0**)calloc(A->Height,sizeof(PIXEL0*));
+ if (!T->accMap) {
+ thread_destroy (T);
+ return ENOMEM;
+ }
+ T->accMap[0] = NULL;
+ if (aligned_malloc ((void **)&T->accMap[0], __BIGGEST_ALIGNMENT__,
+ A->alignedWidth * A->Height * sizeof(PIXEL0))) {
+ thread_destroy (T);
+ return ENOMEM;
+ }
+ for (i=0;i<A->Height;i++)
+ T->accMap[i] = T->accMap[0] + A->alignedWidth * i;
+
+ if (aligned_malloc ((void **)&T->bloomRows, __BIGGEST_ALIGNMENT__,
+ A->alignedWidth * (pointSize + 2) * sizeof(*T->bloomRows))) {
+ thread_destroy (T);
+ return ENOMEM;
+ }
+ if (aligned_malloc ((void **)&T->colorRow, __BIGGEST_ALIGNMENT__,
+ A->alignedWidth * sizeof(*T->colorRow))) {
+ thread_destroy (T);
+ return ENOMEM;
+ }
+ if (A->blurFac) {
+ if (aligned_malloc ((void **)&T->motionBlur, __BIGGEST_ALIGNMENT__,
+ A->alignedWidth * (T->y2 - T->y1) * sizeof(*T->motionBlur))) {
+ thread_destroy (T);
+ return ENOMEM;
+ }
+
+ memset (T->motionBlur, 0, A->alignedWidth * (T->y2 - T->y1) * sizeof(*T->motionBlur));
+ }
+
+ return 0;
+}
+
+static void
+points_thread (void *Self_Raw)
+{
+ /* Restricts viewable area to 2^(32-L_Bits). */
+ const unsigned L_Bits = 19; /* Max. image size: 8192x8192. */
+
+ THREAD *T = (THREAD *)Self_Raw;
+ const ATTRACTOR *A = T->Attractor;
+ int n;
+ PRM x, y, xo, yo;
+ DBL Lx, Ly;
+ PRM iLx, iLy, cx, cy;
+ void (*Iterate) (const ATTRACTOR *, PRM, PRM, PRM *, PRM *);
+ unsigned Rnd;
+ PRM xmax, xmin, ymax, ymin;
+
+ Iterate = A->Iterate;
+
+ if (useAccumulator) {
+ memset (T->accMap[0], 0, sizeof(PIXEL0) * A->alignedWidth * A->Height);
+ }
+
+ /* Using CHEAPRND() by itself occasionally gets stuck at 0 mod 8, so seed it
+ * from GOODRND().
+ */
+ init_draw (A, &x, &y, &xmin, &ymin, &xmax, &ymax, &T->Rnd);
+ recalc_scale (A, xmin, ymin, xmax, ymax, &Lx, &Ly, &cx, &cy);
+
+ Rnd = GOODRND(T->Rnd);
+
+ iLx = Lx * (1 << L_Bits);
+ iLy = Ly * (1 << L_Bits);
+ if (!iLx) /* Can happen with small windows. */
+ iLx = 1;
+ if (!iLy)
+ iLy = 1;
+
+ for (n = T->Attractor->Max_Pt / A->pool.count; n; --n) {
+ unsigned mx,my;
+ (*Iterate) (T->Attractor, x, y, &xo, &yo);
+ mx = ((iLx * x) >> L_Bits) + cx;
+ my = ((iLy * y) >> L_Bits) + cy;
+ /* Fun trick: making m[x|y] unsigned means we can skip mx<0 && my<0. */
+ if (mx<A->Width && my<A->Height)
+ T->accMap[my][mx]++;
+
+ #ifdef AUTO_ZOOM
+ if (xo > xmax)
+ xmax = xo;
+ if (xo < xmin)
+ xmin = xo;
+ if (yo > ymax)
+ ymax = yo;
+ if (yo < ymin)
+ ymin = yo;
+
+ if (!(n & 0xfff)) {
+ recalc_scale (A, xmin, ymin, xmax, ymax, &Lx, &Ly, &cx, &cy);
+ }
+ #endif
+
+ /* Skimp on the randomness. */
+ x = xo + (CHEAPRND(Rnd) >> (sizeof(Rnd) * 8 - 3)) - 4;
+ y = yo + (CHEAPRND(Rnd) >> (sizeof(Rnd) * 8 - 3)) - 4;
+ }
+}
+
+static void
+rasterize_thread (void *Self_Raw)
+{
+ THREAD *T = (THREAD *)Self_Raw;
+ const ATTRACTOR *A = T->Attractor;
+ unsigned i, j, k;
+ PRM xmax = 0, xmin = A->Width, ymax = 0, ymin = A->Height;
+ unsigned long colorScale =
+ (double)A->Width * A->Height
+ * (1 << COLOR_BITS) * brightness
+ * A->colorFac
+ * (zoom * zoom) / (0.9 * 0.9)
+ / 640.0 / 480.0
+ / (pointSize * pointSize)
+ * 800000.0
+ / (float)A->Max_Pt
+ * (float)A->numCols/256;
+ #ifdef VARY_SPEED_TO_AVOID_BOREDOM
+ unsigned pixelCount = 0;
+ #endif
+ PIXEL0 *motionBlurRow = T->motionBlur;
+ void *outRow = (char *)A->accImage->data
+ + A->accImage->bytes_per_line * T->y1;
+
+ /* Clang needs these for loop-vectorizing; A->Width doesn't work. */
+ unsigned w = A->Width, aw = A->alignedWidth;
+
+ if (A->numCols == 2) /* Brighter for monochrome. */
+ colorScale *= 4;
+
+ /* bloomRows: row ring buffer, bloom accumulator, in that order. */
+ memset (T->bloomRows, 0, (pointSize + 1) * aw * sizeof(*T->bloomRows));
+
+ /* This code is highly amenable to auto-vectorization; on GCC use -O3 to get
+ * that. On x86-32, also add -msse2.
+ */
+ for (j=T->y0;j<T->y2;j++) {
+ Bool has_col = False;
+ int accum = 0;
+
+ PIXEL0 *bloomRow =
+ ALIGN_HINT(T->bloomRows + A->alignedWidth * (j % pointSize));
+ PIXEL0 *accumRow =
+ ALIGN_HINT(T->bloomRows + A->alignedWidth * pointSize);
+ PIXEL1 *colRow = T->colorRow;
+
+ /* Moderately fast bloom. */
+
+ for (i=0;i<aw;i++) {
+ accumRow[i] -= bloomRow[i];
+ bloomRow[i] = 0;
+ }
+
+ for (k=0;k<A->pool.count;k++) {
+ const PIXEL0 *inRow = ALIGN_HINT(A->threads[k]->accMap[j]);
+ for (i=0;i<aw;i++) {
+ /* Lots of last-level cache misses. Such is life. */
+ bloomRow[i] += inRow[i];
+ }
+ }
+
+ /* Hardware prefetching works better going forwards than going backwards.
+ * Since this blurs/blooms/convolves in-place, it expands points to the
+ * right instead of to the left.
+ */
+ for (i=0;i<pointSize-1;i++)
+ accum += bloomRow[i];
+
+ for (i=0;i<aw;i++) {
+ PIXEL0 oldBloom = bloomRow[i];
+
+ /* alignedWidth has extra padding for this one line. */
+ accum += bloomRow[i+pointSize-1];
+
+ bloomRow[i] = accum;
+ accumRow[i] += accum;
+ accum -= oldBloom;
+ }
+
+ if (j>=T->y1) {
+ PIXEL0 *accumRow1 = A->blurFac ? motionBlurRow : accumRow;
+ PIXEL0 blurFac = A->blurFac;
+
+ if (blurFac) {
+ /* TODO: Do I vectorize OK? */
+ if (blurFac == 0x8000) {
+ /* Optimization for the default. */
+ for (i=0;i<aw;i++)
+ motionBlurRow[i] = (motionBlurRow[i] >> 1) + accumRow[i];
+ } else {
+ for (i=0;i<aw;i++)
+ motionBlurRow[i] = (PIXEL0)(((PIXEL0X)motionBlurRow[i] * blurFac) >> 16) + accumRow[i];
+ }
+
+ motionBlurRow += aw;
+ }
+
+ for (i=0;i<aw;i++) {
+ unsigned col = (accumRow1[i] * colorScale) >> COLOR_BITS;
+ if (col>A->numCols-1) {
+ col = A->numCols-1;
+ }
+ #ifdef VARY_SPEED_TO_AVOID_BOREDOM
+ if (col>0) {
+ if (col<A->numCols-1) /* we don't count maxxed out pixels */
+ pixelCount++;
+ if (i > xmax)
+ xmax = i;
+ if (i < xmin)
+ xmin = i;
+ has_col = True;
+ }
+ #endif
+ colRow[i] = A->cols[col];
+ }
+
+ #ifdef VARY_SPEED_TO_AVOID_BOREDOM
+ if (has_col) {
+ if (j > ymax)
+ ymax = j;
+ if (j < ymin)
+ ymin = j;
+ }
+ #endif
+
+#if 0
+ for (i=0;i<aw;i++) {
+ if (MI_NPIXELS(mi) < 2)
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ else
+ /*XSetForeground(display, gc, MI_PIXEL(mi, A->Col % MI_NPIXELS(mi)));*/
+ XSetForeground(display, gc, cols[col].pixel);
+
+ if (A->dbuf != None) {
+ XSetForeground(display, A->dbuf_gc, cols[col].pixel);
+ XDrawPoint(display, A->dbuf, A->dbuf_gc, i, j);
+ } else {
+ XSetForeground(display, gc, cols[col].pixel);
+ XDrawPoint(display, window, gc, i, j);
+ }
+ }
+#endif
+
+ if (A->accImage->bits_per_pixel==32 &&
+ A->accImage->byte_order==LOCAL_BYTE_ORDER) {
+ for (i=0;i<aw;i++)
+ ((uint32_t *)outRow)[i] = colRow[i];
+ } else if (A->accImage->bits_per_pixel==16 &&
+ A->accImage->byte_order==LOCAL_BYTE_ORDER) {
+ for (i=0;i<aw;i++)
+ ((uint16_t *)outRow)[i] = colRow[i];
+ } else if (A->accImage->bits_per_pixel==8) {
+ for (i=0;i<aw;i++)
+ ((uint8_t *)outRow)[i] = colRow[i];
+ } else {
+ for (i=0;i<w;i++)
+ XPutPixel (A->accImage, i, j, colRow[i]);
+ }
+
+ outRow = (char *)outRow + A->accImage->bytes_per_line;
+ }
+ }
+
+ /*
+ uint64_t dt = 0;
+ uint64_t t0 = tick();
+ dt += tick() - t0;
+
+ printf("B %g\t(%d,%d)\t%dx%d\t%d\n", 1000.0 * dt / frq(),
+ xmin, ymin, xmax - xmin, ymax - ymin, pixelCount);
+ */
+
+ T->xmax = xmax;
+ T->xmin = xmin;
+ T->ymax = ymax;
+ T->ymin = ymin;
+ T->pixelCount = pixelCount;
+}
+
+static void
+ramp_color (const XColor *color_in, XColor *color_out, unsigned i, unsigned n)
+{
+ float li;
+ #define MINBLUE 1
+ #define FULLBLUE 128
+ #define LOW_COLOR(c) ((c)*li/FULLBLUE)
+ #define HIGH_COLOR(c) ((65535-(c))*(li-FULLBLUE)/(256-FULLBLUE)+(c))
+ li = MINBLUE
+ + (255.0-MINBLUE) * log(1.0 + ACC_GAMMA*(float)i/n)
+ / log(1.0 + ACC_GAMMA);
+ if (li<FULLBLUE) {
+ color_out->red = LOW_COLOR(color_in->red);
+ color_out->green = LOW_COLOR(color_in->green);
+ color_out->blue = LOW_COLOR(color_in->blue);
+ } else {
+ color_out->red = HIGH_COLOR(color_in->red);
+ color_out->green = HIGH_COLOR(color_in->green);
+ color_out->blue = HIGH_COLOR(color_in->blue);
+ }
+}
+
+#endif
+
+static void
+draw_points (Display *display, Drawable d, GC gc, const void *Buf,
+ unsigned Count)
+{
+ if (pointSize == 1)
+ XDrawPoints(display, d, gc, (XPoint *)Buf, Count, CoordModeOrigin);
+ else
+ XFillRectangles(display, d, gc, (XRectangle *)Buf, Count);
+}
+
+ENTRYPOINT void
+draw_strange(ModeInfo * mi)
+{
+ int i, j, n, Cur_Pt;
+ PRM x, y, xo, yo;
+ DBL u;
+ void *Buf;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ DBL Lx, Ly;
+ void (*Iterate) (const ATTRACTOR *, PRM, PRM, PRM *, PRM *);
+ PRM xmin, xmax, ymin, ymax;
+ ATTRACTOR *A;
+ unsigned long Rnd = random();
+ int cx, cy;
+
+ if (Root == NULL)
+ return;
+ A = &Root[MI_SCREEN(mi)];
+ if (A->Fold == NULL)
+ return;
+
+ Cur_Pt = A->Cur_Pt;
+ Iterate = A->Iterate;
+
+ u = (DBL) (A->Count) / 40000.0;
+ for (j = MAX_PRM - 1; j >= 0; --j)
+ A->Prm[j] = DBL_To_PRM((1.0 - u) * A->Prm1[j] + u * A->Prm2[j]);
+
+ /* We collect the accumulation of the orbits in the 2d int array field. */
+
+ init_draw (A, &x, &y, &xmin, &ymin, &xmax, &ymax, &Rnd);
+ recalc_scale (A, xmin, ymin, xmax, ymax, &Lx, &Ly, &cx, &cy);
+
+ A->Cur_Pt = 0;
+
+ xmax = 0;
+ xmin = A->Width;
+ ymax = 0;
+ ymin = A->Height;
+
+ MI_IS_DRAWN(mi) = True;
+
+ #ifdef useAccumulator
+ if (useAccumulator) {
+ int pixelCount = 0;
+
+ threadpool_run (&A->pool, points_thread);
+
+ if (A->visualClass == TrueColor) {
+ XColor *src_color = &A->palette[A->Col % MI_NPIXELS(mi)];
+
+ for (i=0;i<A->numCols;i++) {
+ XColor color;
+ ramp_color (src_color, &color, i, A->numCols);
+ A->cols[i] =
+ ((((unsigned long)color.red << 16) >> A->rShift) & A->rMask) |
+ ((((unsigned long)color.green << 16) >> A->gShift) & A->gMask) |
+ ((((unsigned long)color.blue << 16) >> A->bShift) & A->bMask);
+ }
+ }
+ threadpool_wait (&A->pool);
+
+ threadpool_run(&A->pool, rasterize_thread);
+ threadpool_wait(&A->pool);
+
+ for (i=0; i!=A->pool.count; ++i) {
+ THREAD *T = A->threads[i];
+ if (T->xmax > xmax)
+ xmax = T->xmax;
+ if (T->xmin < xmin)
+ xmin = T->xmin;
+ if (T->ymax > ymax)
+ ymax = T->ymax;
+ if (T->ymin < ymin)
+ ymin = T->ymin;
+ pixelCount += T->pixelCount;
+ }
+
+ put_xshm_image (display, A->dbuf != None ? A->dbuf : window,
+ A->dbuf != None ? A->dbuf_gc : gc, A->accImage,
+ 0, 0, 0, 0, A->accImage->width, A->accImage->height,
+ &A->shmInfo);
+
+ if (A->dbuf != None) {
+ XCopyArea(display, A->dbuf, window, gc, 0, 0, A->Width, A->Height, 0, 0);
+ }
+ #ifdef VARY_SPEED_TO_AVOID_BOREDOM
+ /* Increase the rate of change of the parameters if the attractor has become visually boring. */
+ if ((xmax - xmin < Lx * DBL_To_PRM(.2)) && (ymax - ymin < Ly * DBL_To_PRM(.2))) {
+ A->Speed *= 1.25;
+ } else if (pixelCount>0 && pixelCount<A->Width*A->Height/1000) {
+ A->Speed *= 1.25; /* A->Count = 1000; */
+ } else {
+ A->Speed = 4; /* reset to normal/default */
+ }
+ if (A->Speed > 32)
+ A->Speed = 32;
+ A->Count += A->Speed;
+ if (A->Count >= 1000) {
+ for (i = MAX_PRM - 1; i >= 0; --i)
+ A->Prm1[i] = A->Prm2[i];
+ Random_Prm(A->Prm2);
+ A->Count = 0;
+ }
+ #endif
+ } else {
+ #endif
+ for (n = 0; n != A->Max_Pt; ++n) {
+ int x1, y1;
+ (*Iterate) (A, x, y, &xo, &yo);
+ x1 = (int) (Lx * x) + cx;
+ y1 = (int) (Ly * y) + cy;
+ if (pointSize == 1) {
+ XPoint *Buf = &((XPoint *)A->Buffer2)[n];
+ Buf->x = x1;
+ Buf->y = y1;
+ } else {
+ XRectangle *Buf = &((XRectangle *)A->Buffer2)[n];
+ /* Position matches bloom in accumulator mode. */
+ Buf->x = x1 - pointSize + 1;
+ Buf->y = y1;
+ Buf->width = pointSize;
+ Buf->height = pointSize;
+ }
+
+ if (x1 > xmax)
+ xmax = x1;
+ if (x1 < xmin)
+ xmin = x1;
+ if (y1 > ymax)
+ ymax = y1;
+ if (y1 < ymin)
+ ymin = y1;
+
+ A->Cur_Pt++;
+ /* (void) fprintf( stderr, "X,Y: %d %d ", Buf->x, Buf->y ); */
+ x = xo + NRAND(8) - 4;
+ y = yo + NRAND(8) - 4;
+ }
+
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+
+ if (A->dbuf != None) { /* jwz */
+ XSetForeground(display, A->dbuf_gc, 0);
+/* XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer1,
+ Cur_Pt,CoordModeOrigin); */
+ XFillRectangle(display, A->dbuf, A->dbuf_gc, 0, 0, A->Width, A->Height);
+ } else {
+ draw_points(display, window, gc, A->Buffer1, Cur_Pt);
+ }
+
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ else
+ XSetForeground(display, gc, MI_PIXEL(mi, A->Col % MI_NPIXELS(mi)));
+
+ if (A->dbuf != None) {
+ XSetForeground(display, A->dbuf_gc, 1);
+ draw_points(display, A->dbuf, A->dbuf_gc, A->Buffer2, A->Cur_Pt);
+ XCopyPlane(display, A->dbuf, window, gc, 0, 0, A->Width, A->Height, 0, 0, 1);
+ } else
+ draw_points(display, window, gc, A->Buffer2, A->Cur_Pt);
+
+ #ifdef useAccumulator
+ }
+ #endif
+
+ Buf = A->Buffer1;
+ A->Buffer1 = A->Buffer2;
+ A->Buffer2 = Buf;
+
+ if ((xmax - xmin < Lx * DBL_To_PRM(.2)) && (ymax - ymin < Ly * DBL_To_PRM(.2)))
+ A->Count += 4 * A->Speed;
+ else
+ A->Count += A->Speed;
+ if (A->Count >= 1000) {
+ for (i = MAX_PRM - 1; i >= 0; --i)
+ A->Prm1[i] = A->Prm2[i];
+ Random_Prm(A->Prm2);
+ A->Count = 0;
+ }
+ A->Col++;
+#ifdef STANDALONE
+ mi->recursion_depth = A->Count;
+#endif
+}
+
+
+/***************************************************************/
+
+ENTRYPOINT void
+init_strange(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+#ifndef NO_DBUF
+ GC gc = MI_GC(mi);
+#endif
+ ATTRACTOR *Attractor;
+ size_t pointStructSize =
+ pointSize == 1 ? sizeof (XPoint) : sizeof (XRectangle);
+
+ if (curve <= 0) curve = 10;
+
+ MI_INIT (mi, Root);
+ Attractor = &Root[MI_SCREEN(mi)];
+
+ if (Attractor->Fold == NULL) {
+ int i;
+
+ if ((Attractor->Fold = (PRM *) calloc(UNIT2 + 1,
+ sizeof (PRM))) == NULL) {
+ free_strange(mi);
+ return;
+ }
+ for (i = 0; i <= UNIT2; ++i) {
+ DBL x;
+
+ /* x = ( DBL )(i)/UNIT2; */
+ /* x = sin( M_PI/2.0*x ); */
+ /* x = sqrt( x ); */
+ /* x = x*x; */
+ /* x = x*(1.0-x)*4.0; */
+ x = (DBL) (i) / UNIT;
+ x = sin(x);
+ Attractor->Fold[i] = DBL_To_PRM(x);
+ }
+ }
+
+ Attractor->Max_Pt = points;
+
+ if (Attractor->Buffer1 == NULL)
+ if ((Attractor->Buffer1 = calloc(Attractor->Max_Pt,
+ pointStructSize)) == NULL) {
+ free_strange(mi);
+ return;
+ }
+ if (Attractor->Buffer2 == NULL)
+ if ((Attractor->Buffer2 = calloc(Attractor->Max_Pt,
+ pointStructSize)) == NULL) {
+ free_strange(mi);
+ return;
+ }
+
+ Attractor->Width = MI_WIDTH(mi);
+ Attractor->Height = MI_HEIGHT(mi);
+ Attractor->Cur_Pt = 0;
+ Attractor->Count = 0;
+ Attractor->Col = NRAND(MI_NPIXELS(mi));
+ Attractor->Speed = 4;
+
+ Attractor->Iterate = Funcs[NRAND(2)];
+ if (curve < 10) /* Avoid boring Iterate_X2. */
+ Attractor->Iterate = Iterate_X3;
+
+ Random_Prm(Attractor->Prm1);
+ Random_Prm(Attractor->Prm2);
+#ifndef NO_DBUF
+ if (Attractor->dbuf != None)
+ XFreePixmap(display, Attractor->dbuf);
+ #ifdef useAccumulator
+ #define A Attractor
+ if (useAccumulator)
+ {
+ Attractor->dbuf = None;
+ }
+ else
+ #undef A
+ #endif
+ {
+ Attractor->dbuf = XCreatePixmap (display, MI_WINDOW(mi),
+ Attractor->Width, Attractor->Height,
+ /* useAccumulator ? MI_DEPTH(mi) : */ 1);
+ }
+ /* Allocation checked */
+ if (Attractor->dbuf != None) {
+ XGCValues gcv;
+
+ gcv.foreground = 0;
+ gcv.background = 0;
+#ifndef HAVE_JWXYZ
+ gcv.graphics_exposures = False;
+#endif /* HAVE_JWXYZ */
+ gcv.function = GXcopy;
+
+ if (Attractor->dbuf_gc != None)
+ XFreeGC(display, Attractor->dbuf_gc);
+
+ if ((Attractor->dbuf_gc = XCreateGC(display, Attractor->dbuf,
+#ifndef HAVE_JWXYZ
+ GCGraphicsExposures |
+#endif /* HAVE_JWXYZ */
+ GCFunction | GCForeground | GCBackground,
+ &gcv)) == None) {
+ XFreePixmap(display, Attractor->dbuf);
+ Attractor->dbuf = None;
+ } else {
+ XFillRectangle(display, Attractor->dbuf, Attractor->dbuf_gc,
+ 0, 0, Attractor->Width, Attractor->Height);
+ XSetBackground(display, gc, MI_BLACK_PIXEL(mi));
+ XSetFunction(display, gc, GXcopy);
+ }
+ }
+#endif
+
+
+#ifdef useAccumulator
+ #define A Attractor
+ if (useAccumulator) {
+ static const struct threadpool_class threadClass = {
+ sizeof(THREAD),
+ thread_create,
+ thread_destroy
+ };
+ Screen *screen = MI_SCREENPTR(mi);
+ int i;
+ unsigned maxThreads, threadCount;
+ unsigned bpp = visual_pixmap_depth (screen, MI_VISUAL(mi));
+ size_t threadAlign1 = 8 * thread_memory_alignment(display) - 1;
+ if (A->cols) {
+ if (A->visualClass != TrueColor && A->numCols > 2)
+ XFreeColors (display, MI_COLORMAP(mi), A->cols, A->numCols, 0);
+ free (A->cols);
+ }
+ if (MI_NPIXELS(mi) <= 2) {
+ A->numCols = 2;
+ A->visualClass = StaticColor;
+ } else {
+ A->numCols = DEF_NUM_COLS;
+ A->visualClass = visual_class(screen, MI_VISUAL(mi));
+ }
+
+ A->cols = calloc (A->numCols,sizeof(*A->cols));
+ if (!A->cols) {
+ free_strange(mi);
+ return;
+ }
+
+ if (A->visualClass == TrueColor) {
+ /* Rebuilds ramp every frame. No need for XAllocColor. */
+ /* TODO: This could also include PseudoColor. */
+ visual_rgb_masks (screen, MI_VISUAL(mi),
+ &A->rMask, &A->gMask, &A->bMask);
+ A->rShift = 31 - i_log2 (A->rMask);
+ A->gShift = 31 - i_log2 (A->gMask);
+ A->bShift = 31 - i_log2 (A->bMask);
+
+ free (A->palette);
+ A->palette = malloc(MI_NPIXELS(mi) * sizeof(XColor));
+ if (!A->palette) {
+ free_strange (mi);
+ return;
+ }
+
+ for (i=0;i<MI_NPIXELS(mi);i++)
+ A->palette[i].pixel = MI_PIXEL(mi,i);
+
+ XQueryColors (display, MI_COLORMAP(mi), A->palette, MI_NPIXELS(mi));
+ } else if (A->numCols == 2) {
+ A->cols[0] = MI_BLACK_PIXEL (mi);
+ A->cols[1] = MI_WHITE_PIXEL (mi);
+ } else {
+ /* No changing colors, unfortunately. */
+ XColor color;
+
+ color.pixel = MI_PIXEL(mi,NRAND(MI_NPIXELS(mi)));
+ XQueryColor (display, MI_COLORMAP(mi), &color);
+
+ for (;;) {
+ for (i=0;i<A->numCols;i++) {
+ XColor out_color;
+ ramp_color (&color, &out_color, i, A->numCols);
+ if (!XAllocColor (display, MI_COLORMAP(mi), &out_color))
+ break;
+ A->cols[i] = out_color.pixel;
+ /*
+ if (!XAllocColor(MI_DISPLAY(mi), cmap, &cols[i])) {
+ if (!XAllocColor(display, cmap, &cols[i])) {
+ cols[i].pixel = WhitePixel (display, DefaultScreen (display));
+ cols[i].red = cols[i].green = cols[i].blue = 0xFFFF;
+ }
+ */
+ }
+
+ if (i==A->numCols)
+ break;
+
+ XFreeColors (display, MI_COLORMAP(mi), A->cols, i, 0);
+ A->numCols = A->numCols * 11 / 12;
+ if (A->numCols < 2) {
+ A->numCols = 0;
+ free_strange (mi);
+ abort();
+ return;
+ }
+ }
+ }
+
+ /* Add slack for horizontal blur, then round up to the platform's SIMD
+ * alignment.
+ */
+ A->alignedWidth =
+ (((A->Width + pointSize) * sizeof(PIXEL0) + (__BIGGEST_ALIGNMENT__ - 1)) &
+ ~(__BIGGEST_ALIGNMENT__ - 1)) / sizeof(PIXEL0);
+
+ if (A->accImage)
+ destroy_xshm_image (display, A->accImage, &A->shmInfo);
+ A->accImage = create_xshm_image(display, MI_VISUAL(mi),
+ MI_DEPTH(mi), ZPixmap, &A->shmInfo,
+ ((A->alignedWidth * bpp + threadAlign1) & ~threadAlign1) / bpp,
+ A->Height);
+
+ A->blurFac = (PIXEL0)(65536 * (motionBlur - 1) / (motionBlur + 1));
+ A->colorFac = 2 / (motionBlur + 1);
+
+ /* Don't overdose on threads. */
+ threadCount = hardware_concurrency (display);
+ maxThreads = A->Height / (pointSize * 4);
+ if (maxThreads < 1)
+ maxThreads = 1;
+ if (threadCount > maxThreads)
+ threadCount = maxThreads;
+
+ if (A->threads)
+ free (A->threads);
+ A->threads = malloc (threadCount * sizeof(*A->threads));
+ if (!A->threads) {
+ free_strange (mi);
+ return;
+ }
+
+ if (A->pool.count)
+ threadpool_destroy (&A->pool);
+ if (threadpool_create (&A->pool, &threadClass, display, threadCount)) {
+ A->pool.count = 0;
+ free_strange (mi);
+ return;
+ }
+ }
+ #undef A
+#endif
+ MI_CLEARWINDOW(mi);
+
+ /* Do not want any exposure events from XCopyPlane */
+ XSetGraphicsExposures(display, MI_GC(mi), False);
+}
+
+/***************************************************************/
+
+#ifdef STANDALONE
+XSCREENSAVER_MODULE ("Strange", strange)
+#endif
+
+#endif /* MODE_strange */
diff --git a/hacks/strange.man b/hacks/strange.man
new file mode 100644
index 0000000..625b659
--- /dev/null
+++ b/hacks/strange.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+strange - draws strange attractors
+.SH SYNOPSIS
+.B strange
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIstrange\fP program draws strange attractors
+.SH OPTIONS
+.I strange
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 100.
+The colors are chosen randomly.
+.TP 8
+.B \-points \fIinteger\fP
+Change the number of points/iterations each frame. Default 5500. More than
+6000 activates the accumulator, which makes parts of the image brighter or
+darker depending on how often the attractor hits each pixel.
+.TP 8
+.B \-point-size \fIinteger\fP
+Changes the size of individual points. Default 1.
+.TP 8
+.B \-zoom \fIfloat\fP
+Zooms in or out. Default 0.9.
+.TP 8
+.B \-brightness \fIfloat\fP
+Adjusts the brightness for accumulator mode. Default 1.0.
+.TP 8
+.B \-motion-blur \fIfloat\fP
+Adds motion blur. Default 3.0, no motion blur is 1.0.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Massimino Pascal.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Massimino Pascal <Pascal.Massimon@ens.fr>, 1997.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/substrate.c b/hacks/substrate.c
new file mode 100644
index 0000000..278a3bd
--- /dev/null
+++ b/hacks/substrate.c
@@ -0,0 +1,773 @@
+/*
+ * Substrate (dragorn@kismetwireless.net)
+ * Directly ported code from complexification.net Substrate art
+ * http://complexification.net/gallery/machines/substrate/applet_s/substrate_s.pde
+ *
+ * Substrate code:
+ * j.tarbell June, 2004
+ * Albuquerque, New Mexico
+ * complexification.net
+ *
+ * CHANGES
+ *
+ * 1.1 dragorn Jan 04 2005 Fixed some indenting, typo in errors for parsing
+ * cmdline args
+ * 1.1 dagraz Jan 04 2005 Added option for circular cracks (David Agraz)
+ * Cleaned up issues with timeouts in start_crack (DA)
+ * 1.0 dragorn Oct 10 2004 First port done
+ *
+ * Directly based the hacks of:
+ *
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+/* this program goes faster if some functions are inline. The following is
+ * borrowed from ifs.c */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+
+#define STEP 0.42
+
+/* Raw colormap extracted from pollockEFF.gif */
+static const char *rgb_colormap[] = {
+ "#201F21", "#262C2E", "#352626", "#372B27",
+ "#302C2E", "#392B2D", "#323229", "#3F3229",
+ "#38322E", "#2E333D", "#333A3D", "#473329",
+ "#40392C", "#40392E", "#47402C", "#47402E",
+ "#4E402C", "#4F402E", "#4E4738", "#584037",
+ "#65472D", "#6D5D3D", "#745530", "#755532",
+ "#745D32", "#746433", "#7C6C36", "#523152",
+ "#444842", "#4C5647", "#655D45", "#6D5D44",
+ "#6C5D4E", "#746C43", "#7C6C42", "#7C6C4B",
+ "#6B734B", "#73734B", "#7B7B4A", "#6B6C55",
+ "#696D5E", "#7B6C5D", "#6B7353", "#6A745D",
+ "#727B52", "#7B7B52", "#57746E", "#687466",
+ "#9C542B", "#9D5432", "#9D5B35", "#936B36",
+ "#AA7330", "#C45A27", "#D95223", "#D85A20",
+ "#DB5A23", "#E57037", "#836C4B", "#8C6B4B",
+ "#82735C", "#937352", "#817B63", "#817B6D",
+ "#927B63", "#D9893B", "#E49832", "#DFA133",
+ "#E5A037", "#F0AB3B", "#8A8A59", "#B29A58",
+ "#89826B", "#9A8262", "#888B7C", "#909A7A",
+ "#A28262", "#A18A69", "#A99968", "#99A160",
+ "#99A168", "#CA8148", "#EB8D43", "#C29160",
+ "#C29168", "#D1A977", "#C9B97F", "#F0E27B",
+ "#9F928B", "#C0B999", "#E6B88F", "#C8C187",
+ "#E0C886", "#F2CC85", "#F5DA83", "#ECDE9D",
+ "#F5D294", "#F5DA94", "#F4E784", "#F4E18A",
+ "#F4E193", "#E7D8A7", "#F1D4A5", "#F1DCA5",
+ "#F4DBAD", "#F1DCAE", "#F4DBB5", "#F5DBBD",
+ "#F4E2AD", "#F5E9AD", "#F4E3BE", "#F5EABE",
+ "#F7F0B6", "#D9D1C1", "#E0D0C0", "#E7D8C0",
+ "#F1DDC6", "#E8E1C0", "#F3EDC7", "#F6ECCE",
+ "#F8F2C7", "#EFEFD0", 0
+};
+
+typedef struct {
+ /* Synthesis of data from Crack:: and SandPainter:: */
+ float x, y;
+ float t;
+ float ys, xs, t_inc; /* for curvature calculations */
+
+ int curved;
+
+ unsigned long sandcolor;
+ float sandp, sandg;
+
+ float degrees_drawn;
+
+ int crack_num;
+
+} crack;
+
+struct field {
+ unsigned int height;
+ unsigned int width;
+
+ unsigned int initial_cracks;
+
+ unsigned int num;
+ unsigned int max_num;
+
+ int grains; /* number of grains in the sand painting */
+
+ int circle_percent;
+
+ crack *cracks; /* grid of cracks */
+ int *cgrid; /* grid of actual crack placement */
+
+ /* Raw map of pixels we need to keep for alpha blending */
+ unsigned long int *off_img;
+
+ /* color parms */
+ int numcolors;
+ unsigned long *parsedcolors;
+ unsigned long fgcolor;
+ unsigned long bgcolor;
+ int visdepth;
+
+ unsigned int cycles;
+
+ unsigned int wireframe;
+ unsigned int seamless;
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ struct field *f;
+ unsigned int max_cycles;
+ int growth_delay;
+ GC fgc;
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+};
+
+
+static void
+*xrealloc(void *p, size_t size)
+{
+ void *ret;
+ if ((ret = realloc(p, size)) == NULL) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ return ret;
+}
+
+static struct field
+*init_field(void)
+{
+ struct field *f = xrealloc(NULL, sizeof(struct field));
+ f->height = 0;
+ f->width = 0;
+ f->initial_cracks = 0;
+ f->num = 0;
+ f->max_num = 0;
+ f->cracks = NULL;
+ f->cgrid = NULL;
+ f->off_img = NULL;
+ f->numcolors = 0;
+ f->parsedcolors = NULL;
+ f->cycles = 0;
+ f->wireframe = 0;
+ f->seamless = 0;
+ f->fgcolor = 0;
+ f->bgcolor = 0;
+ f->visdepth = 0;
+ f->grains = 0;
+ f->circle_percent = 0;
+ return f;
+}
+
+/* Quick references to pixels in the offscreen map and in the crack grid */
+#define ref_pixel(f, x, y) ((f)->off_img[(y) * (f)->width + (x)])
+#define ref_cgrid(f, x, y) ((f)->cgrid[(y) * (f)->width + (x)])
+
+static inline void start_crack(struct field *f, crack *cr)
+{
+ /* synthesis of Crack::findStart() and crack::startCrack() */
+ int px = 0;
+ int py = 0;
+ int found = 0;
+ int timeout = 0;
+ float a;
+
+ /* shift until crack is found */
+ while ((!found) && (timeout++ < 10000)) {
+ px = (int) (random() % f->width);
+ py = (int) (random() % f->height);
+
+ if (ref_cgrid(f, px, py) < 10000)
+ found = 1;
+ }
+
+ if ( !found ) {
+ /* We timed out. Use our default values */
+ px = cr->x;
+ py = cr->y;
+
+ /* Sanity check needed */
+ if (px < 0) px = 0;
+ if (px >= f->width) px = f->width - 1;
+ if (py < 0) py = 0;
+ if (py >= f->height) py = f->height - 1;
+
+ ref_cgrid(f, px, py) = cr->t;
+ }
+
+ /* start a crack */
+ a = ref_cgrid(f, px, py);
+
+ if ((random() % 100) < 50) {
+ /* conversion of the java int(random(-2, 2.1)) */
+ a -= 90 + (frand(4.1) - 2.0);
+ } else {
+ a += 90 + (frand(4.1) - 2.0);
+ }
+
+ if ((random() % 100) < f->circle_percent) {
+ float r; /* radius */
+ float radian_inc;
+
+ cr->curved = 1;
+ cr->degrees_drawn = 0;
+
+ r = 10 + (random() % ((f->width + f->height) / 2));
+
+ if ((random() % 100) < 50) {
+ r *= -1;
+ }
+
+ /* arc length = r * theta => theta = arc length / r */
+ radian_inc = STEP / r;
+ cr->t_inc = radian_inc * 360 / 2 / M_PI;
+
+ cr->ys = r * sin(radian_inc);
+ cr->xs = r * ( 1 - cos(radian_inc));
+
+ }
+ else {
+ cr->curved = 0;
+ }
+
+ /* Condensed from Crack::startCrack */
+ cr->x = px + ((float) 0.61 * cos(a * M_PI / 180));
+ cr->y = py + ((float) 0.61 * sin(a * M_PI / 180));
+ cr->t = a;
+
+}
+
+static inline void make_crack(struct field *f)
+{
+ crack *cr;
+
+ if (f->num < f->max_num) {
+ /* make a new crack */
+ f->cracks = (crack *) xrealloc(f->cracks, sizeof(crack) * (f->num + 1));
+
+ cr = &(f->cracks[f->num]);
+ /* assign colors */
+ cr->sandp = 0;
+ cr->sandg = (frand(0.2) - 0.01);
+ cr->sandcolor = f->parsedcolors[random() % f->numcolors];
+ cr->crack_num = f->num;
+ cr->curved = 0;
+ cr->degrees_drawn = 0;
+
+ /* We could use these values in the timeout case of start_crack */
+
+ cr->x = random() % f->width;
+ cr->y = random() % f->height;
+ cr->t = random() % 360;
+
+ /* start it */
+ start_crack(f, cr);
+
+ f->num++;
+ }
+}
+
+static inline void point2rgb(int depth, unsigned long c, int *r, int *g, int *b)
+{
+ switch(depth) {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ *r = (c & 0x00ff0000) >> 16;
+ *g = (c & 0x0000ffff) >> 8;
+ *b = (c & 0x000000ff);
+#else
+ *g = (c & 0xff00) >> 8;
+ *r = (c & 0xff0000) >> 16;
+ *b = c & 0xff;
+#endif
+ break;
+ case 16:
+ *g = ((c >> 5) & 0x3f) << 2;
+ *r = ((c >> 11) & 0x1f) << 3;
+ *b = (c & 0x1f) << 3;
+ break;
+ case 15:
+ *g = ((c >> 5) & 0x1f) << 3;
+ *r = ((c >> 10) & 0x1f) << 3;
+ *b = (c & 0x1f) << 3;
+ break;
+ }
+}
+
+static inline unsigned long rgb2point(int depth, int r, int g, int b)
+{
+ unsigned long ret = 0;
+
+ switch(depth) {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ ret = 0xFF000000 | (r << 16) | (g << 8) | b;
+#else
+ ret |= (r << 16) | (g << 8) | b;
+#endif
+ break;
+ case 16:
+ ret = ((r>>3) << 11) | ((g>>2)<<5) | (b>>3);
+ break;
+ case 15:
+ ret = ((r>>3) << 10) | ((g>>3)<<5) | (b>>3);
+ break;
+ }
+
+ return ret;
+}
+
+/* alpha blended point drawing -- this is Not Right and will likely fail on
+ * non-intel platforms as it is now, needs fixing */
+static inline unsigned long
+trans_point(struct state *st,
+ int x1, int y1, unsigned long myc, float a,
+ struct field *f)
+{
+ if ((x1 >= 0) && (x1 < f->width) && (y1 >= 0) && (y1 < f->height)) {
+ if (a >= 1.0) {
+ ref_pixel(f, x1, y1) = myc;
+ } else {
+ int or = 0, og = 0, ob = 0;
+ int r = 0, g = 0, b = 0;
+ int nr, ng, nb;
+ unsigned long c;
+
+ c = ref_pixel(f, x1, y1);
+
+ point2rgb(f->visdepth, c, &or, &og, &ob);
+ point2rgb(f->visdepth, myc, &r, &g, &b);
+
+ nr = or + (r - or) * a;
+ ng = og + (g - og) * a;
+ nb = ob + (b - ob) * a;
+
+ c = rgb2point(f->visdepth, nr, ng, nb);
+
+ ref_pixel(f, x1, y1) = c;
+
+ return c;
+ }
+ }
+
+ return f->bgcolor;
+}
+
+static inline void
+region_color(struct state *st, GC fgc, struct field *f, crack *cr)
+{
+ /* synthesis of Crack::regionColor() and SandPainter::render() */
+
+ float rx = cr->x;
+ float ry = cr->y;
+ int openspace = 1;
+ int cx, cy;
+ float maxg;
+ int grains, i;
+ float w;
+ float drawx, drawy;
+ unsigned long c;
+
+ while (openspace) {
+ /* move perpendicular to crack */
+ rx += (0.81 * sin(cr->t * M_PI/180));
+ ry -= (0.81 * cos(cr->t * M_PI/180));
+
+ cx = (int) rx;
+ cy = (int) ry;
+ if (f->seamless) {
+ cx %= f->width;
+ cy %= f->height;
+ }
+
+ if ((cx >= 0) && (cx < f->width) && (cy >= 0) && (cy < f->height)) {
+ /* safe to check */
+ if (f->cgrid[cy * f->width + cx] > 10000) {
+ /* space is open */
+ } else {
+ openspace = 0;
+ }
+ } else {
+ openspace = 0;
+ }
+ }
+
+ /* SandPainter stuff here */
+
+ /* Modulate gain */
+ cr->sandg += (frand(0.1) - 0.050);
+ maxg = 1.0;
+
+ if (cr->sandg < 0)
+ cr->sandg = 0;
+
+ if (cr->sandg > maxg)
+ cr->sandg = maxg;
+
+ grains = f->grains;
+
+ /* Lay down grains of sand */
+ w = cr->sandg / (grains - 1);
+
+ for (i = 0; i < grains; i++) {
+ drawx = (cr->x + (rx - cr->x) * sin(cr->sandp + sin((float) i * w)));
+ drawy = (cr->y + (ry - cr->y) * sin(cr->sandp + sin((float) i * w)));
+ if (f->seamless) {
+ drawx = fmod(drawx + f->width, f->width);
+ drawy = fmod(drawy + f->height, f->height);
+ }
+
+ /* Draw sand bit */
+ c = trans_point(st, drawx, drawy, cr->sandcolor, (0.1 - i / (grains * 10.0)), f);
+
+ XSetForeground(st->dpy, fgc, c);
+ XDrawPoint(st->dpy, st->window, fgc, (int) drawx, (int) drawy);
+ XSetForeground(st->dpy, fgc, f->fgcolor);
+ }
+}
+
+static void build_substrate(struct field *f)
+{
+ int tx;
+ /* int ty; */
+
+ f->cycles = 0;
+
+ if (f->cgrid) {
+ free(f->cgrid);
+ f->cgrid = NULL;
+ }
+
+ if (f->cracks) {
+ free(f->cracks);
+ f->cracks = NULL;
+ }
+
+ f->num = 0;
+
+ /* erase the crack grid */
+ f->cgrid = (int *) xrealloc(f->cgrid, sizeof(int) * f->height * f->width);
+ {
+ int j;
+ int *p = f->cgrid;
+ for (j = 0; j < f->height * f->width; j++)
+ *p++ = 10001;
+ }
+
+ /* Not necessary now that make_crack ensures we have usable default
+ * values in start_crack's timeout case
+ * make random crack seeds *
+ for (tx = 0; tx < 16; tx++) {
+ ty = (int) (random() % (f->width * f->height - 1));
+ f->cgrid[ty] = (int) random() % 360;
+ }
+ */
+
+ /* make the initial cracks */
+ for (tx = 0; tx < f->initial_cracks; tx++)
+ make_crack(f);
+}
+
+
+static inline void
+movedrawcrack(struct state *st, GC fgc, struct field *f, int cracknum)
+{
+ /* Basically Crack::move() */
+
+ int cx, cy;
+ crack *cr = &(f->cracks[cracknum]);
+
+ /* continue cracking */
+ if ( !cr->curved ) {
+ cr->x += ((float) STEP * cos(cr->t * M_PI/180));
+ cr->y += ((float) STEP * sin(cr->t * M_PI/180));
+ }
+ else {
+ cr->x += ((float) cr->ys * cos(cr->t * M_PI/180));
+ cr->y += ((float) cr->ys * sin(cr->t * M_PI/180));
+
+ cr->x += ((float) cr->xs * cos(cr->t * M_PI/180 - M_PI / 2));
+ cr->y += ((float) cr->xs * sin(cr->t * M_PI/180 - M_PI / 2));
+
+ cr->t += cr->t_inc;
+ cr->degrees_drawn += fabsf(cr->t_inc);
+ }
+ if (f->seamless) {
+ cr->x = fmod(cr->x + f->width, f->width);
+ cr->y = fmod(cr->y + f->height, f->height);
+ }
+
+ /* bounds check */
+ /* modification of random(-0.33,0.33) */
+ cx = (int) (cr->x + (frand(0.66) - 0.33));
+ cy = (int) (cr->y + (frand(0.66) - 0.33));
+ if (f->seamless) {
+ cx %= f->width;
+ cy %= f->height;
+ }
+
+ if ((cx >= 0) && (cx < f->width) && (cy >= 0) && (cy < f->height)) {
+ /* draw sand painter if we're not wireframe */
+ if (!f->wireframe)
+ region_color(st, fgc, f, cr);
+
+ /* draw fgcolor crack */
+ ref_pixel(f, cx, cy) = f->fgcolor;
+ XDrawPoint(st->dpy, st->window, fgc, cx, cy);
+
+ if ( cr->curved && (cr->degrees_drawn > 360) ) {
+ /* completed the circle, stop cracking */
+ start_crack(f, cr); /* restart ourselves */
+ make_crack(f); /* generate a new crack */
+ }
+ /* safe to check */
+ else if ((f->cgrid[cy * f->width + cx] > 10000) ||
+ (fabsf(f->cgrid[cy * f->width + cx] - cr->t) < 5)) {
+ /* continue cracking */
+ f->cgrid[cy * f->width + cx] = (int) cr->t;
+ } else if (fabsf(f->cgrid[cy * f->width + cx] - cr->t) > 2) {
+ /* crack encountered (not self), stop cracking */
+ start_crack(f, cr); /* restart ourselves */
+ make_crack(f); /* generate a new crack */
+ }
+ } else {
+ /* out of bounds, stop cracking */
+
+ /* need these in case of timeout in start_crack */
+ cr->x = random() % f->width;
+ cr->y = random() % f->height;
+ cr->t = random() % 360;
+
+ start_crack(f, cr); /* restart ourselves */
+ make_crack(f); /* generate a new crack */
+ }
+
+}
+
+
+static void build_img(Display *dpy, Window window, XWindowAttributes xgwa, GC fgc,
+ struct field *f)
+{
+ if (f->off_img) {
+ free(f->off_img);
+ f->off_img = NULL;
+ }
+
+ f->off_img = (unsigned long *) xrealloc(f->off_img, sizeof(unsigned long) *
+ f->width * f->height);
+
+ memset(f->off_img, f->bgcolor, sizeof(unsigned long) * f->width * f->height);
+}
+
+
+static void *
+substrate_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XColor tmpcolor;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->f = init_field();
+
+ st->growth_delay = (get_integer_resource(st->dpy, "growthDelay", "Integer"));
+ st->max_cycles = (get_integer_resource(st->dpy, "maxCycles", "Integer"));
+ st->f->initial_cracks = (get_integer_resource(st->dpy, "initialCracks", "Integer"));
+ st->f->max_num = (get_integer_resource(st->dpy, "maxCracks", "Integer"));
+ st->f->wireframe = (get_boolean_resource(st->dpy, "wireFrame", "Boolean"));
+ st->f->grains = (get_integer_resource(st->dpy, "sandGrains", "Integer"));
+ st->f->circle_percent = (get_integer_resource(st->dpy, "circlePercent", "Integer"));
+ st->f->seamless = (get_boolean_resource(st->dpy, "seamless", "Boolean"));
+
+ if (st->f->initial_cracks <= 2) {
+ fprintf(stderr, "%s: Initial cracks must be greater than 2\n", progname);
+ exit (1);
+ }
+
+ if (st->f->max_num <= 10) {
+ fprintf(stderr, "%s: Maximum number of cracks must be less than 10\n",
+ progname);
+ exit (1);
+ }
+
+ if (st->f->circle_percent < 0) {
+ fprintf(stderr, "%s: circle percent must be at least 0\n", progname);
+ exit (1);
+ }
+
+ if (st->f->circle_percent > 100) {
+ fprintf(stderr, "%s: circle percent must be less than 100\n", progname);
+ exit (1);
+ }
+
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+
+ st->f->height = st->xgwa.height;
+ st->f->width = st->xgwa.width;
+ st->f->visdepth = st->xgwa.depth;
+
+ /* Count the colors in our map and assign them in a horrifically inefficient
+ * manner but it only happens once */
+ while (rgb_colormap[st->f->numcolors] != NULL) {
+ st->f->parsedcolors = (unsigned long *) xrealloc(st->f->parsedcolors,
+ sizeof(unsigned long) *
+ (st->f->numcolors + 1));
+ if (!XParseColor(st->dpy, st->xgwa.colormap, rgb_colormap[st->f->numcolors], &tmpcolor)) {
+ fprintf(stderr, "%s: couldn't parse color %s\n", progname,
+ rgb_colormap[st->f->numcolors]);
+ exit(1);
+ }
+
+ if (!XAllocColor(st->dpy, st->xgwa.colormap, &tmpcolor)) {
+ fprintf(stderr, "%s: couldn't allocate color %s\n", progname,
+ rgb_colormap[st->f->numcolors]);
+ exit(1);
+ }
+
+ st->f->parsedcolors[st->f->numcolors] = tmpcolor.pixel;
+
+ st->f->numcolors++;
+ }
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->gcv.background = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->fgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ st->f->fgcolor = st->gcv.foreground;
+ st->f->bgcolor = st->gcv.background;
+
+ /* Initialize stuff */
+ build_img(st->dpy, st->window, st->xgwa, st->fgc, st->f);
+ build_substrate(st->f);
+
+ return st;
+}
+
+static unsigned long
+substrate_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int tempx;
+
+ if ((st->f->cycles % 10) == 0) {
+
+ /* Restart if the window size changes */
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+
+ if (st->f->height != st->xgwa.height || st->f->width != st->xgwa.width) {
+ st->f->height = st->xgwa.height;
+ st->f->width = st->xgwa.width;
+ st->f->visdepth = st->xgwa.depth;
+
+ build_substrate(st->f);
+ build_img(st->dpy, st->window, st->xgwa, st->fgc, st->f);
+ XSetForeground(st->dpy, st->fgc, st->gcv.background);
+ XFillRectangle(st->dpy, st->window, st->fgc, 0, 0, st->xgwa.width, st->xgwa.height);
+ XSetForeground(st->dpy, st->fgc, st->gcv.foreground);
+ }
+ }
+
+ for (tempx = 0; tempx < st->f->num; tempx++) {
+ movedrawcrack(st, st->fgc, st->f, tempx);
+ }
+
+ st->f->cycles++;
+
+ if (st->f->cycles >= st->max_cycles && st->max_cycles != 0) {
+ build_substrate(st->f);
+ build_img(st->dpy, st->window, st->xgwa, st->fgc, st->f);
+ XSetForeground(st->dpy, st->fgc, st->gcv.background);
+ XFillRectangle(st->dpy, st->window, st->fgc, 0, 0, st->xgwa.width, st->xgwa.height);
+ XSetForeground(st->dpy, st->fgc, st->gcv.foreground);
+ }
+
+ /* #### mi->recursion_depth = st->f->cycles; */
+ return st->growth_delay;
+}
+
+
+static void
+substrate_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+substrate_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->f->cycles = st->max_cycles;
+ return True;
+ }
+ return False;
+}
+
+static void
+substrate_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+static const char *substrate_defaults[] = {
+ ".background: white",
+ ".foreground: black",
+ "*fpsSolid: true",
+ "*wireFrame: false",
+ "*seamless: false",
+ "*maxCycles: 10000",
+ "*growthDelay: 18000",
+ "*initialCracks: 3",
+ "*maxCracks: 100",
+ "*sandGrains: 64",
+ "*circlePercent: 33",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec substrate_options[] = {
+ {"-background", ".background", XrmoptionSepArg, 0},
+ {"-foreground", ".foreground", XrmoptionSepArg, 0},
+ {"-wireframe", ".wireFrame", XrmoptionNoArg, "true"},
+ {"-seamless", ".seamless", XrmoptionNoArg, "true"},
+ {"-max-cycles", ".maxCycles", XrmoptionSepArg, 0},
+ {"-growth-delay", ".growthDelay", XrmoptionSepArg, 0},
+ {"-initial-cracks", ".initialCracks", XrmoptionSepArg, 0},
+ {"-max-cracks", ".maxCracks", XrmoptionSepArg, 0},
+ {"-sand-grains", ".sandGrains", XrmoptionSepArg, 0},
+ {"-circle-percent", ".circlePercent", XrmoptionSepArg, 0},
+ {0, 0, 0, 0}
+};
+
+XSCREENSAVER_MODULE ("Substrate", substrate)
diff --git a/hacks/substrate.man b/hacks/substrate.man
new file mode 100644
index 0000000..54de179
--- /dev/null
+++ b/hacks/substrate.man
@@ -0,0 +1,73 @@
+.TH Substrate 1 "08-Oct-04" "X Version 11"
+.SH NAME
+substrate - Grow crystal-like lines on a computational substrate
+.SH SYNOPSIS
+.B substrate
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-wireframe]
+[\-max\-cycles \fIcyclecount\fP]
+[\-growth\-delay \fIdelayms\fP]
+[\-initial\-cracks \fInuminitial\fP]
+[\-max\-cracks \fInummax\fP]
+[\-sand\-grains \fInumgrains\fP]
+[\-circle\-percent \fIcirclepercent\fP]
+[\-fps]
+.SH DESCRIPTION
+Lines like crystals grow on a computational substrate. A simple
+perpendicular growth rule creates intricate city-like structures. Optionally, cracks may also be circular, producing a cityscape more familiar to places for which city planning is a distant, theoretical concern.
+
+Ported from the code by j.tarbell at http://complexification.net
+.SH OPTIONS
+.I substrate
+accepts the following options:
+.TP 8
+.B \-wireframe (Default: \fIFalse\fP)
+Don't draw sand-painting colored effects, only make a wireframe.
+.TP 8
+.B \-max\-cycles \fIcyclecount\fP (Default: \fI10000\fP)
+Maximum number of growth cycles before restarting. The higher this is,
+the more complex the art.
+.TP 8
+.B \-growth\-delay \fIdelayms\fP (Default: \fI18000\fP)
+Delay in ms between growth cycles. More delay, slower (but smoother
+and less CPU intensive)
+art.
+.TP 8
+.B \-initial\-cracks \fInuminitial\fP (Default: \fI3\fP)
+Initial number of cracks in the substrate
+.TP 8
+.B \-max\-cracks \fInummax\fP (Default: \fI100\fP)
+Maximum number of cracks in the substrate at a single time
+.TP 8
+.B \-sand\-grains \fInumgrains\fP (Default: \fI64\fP)
+Number of sand grains dropped during coloring. More grains cause
+a denser colour but use more cpu power.
+.TP 8
+.B \-circle-percent \fIcirclepercent\fP (Default: \fI0\fP)
+The percentage of the cracks will be circular.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global
+resources stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by J. Tarbell
+(complex@complexification.net, http://www.complexification.net).
+
+Ported to XScreensaver 2004 by Mike Kershaw (dragorn@kismetwireless.net)
+.SH AUTHOR
+J. Tarbell <complex@complexification.net>, Jun-03
+
+Mike Kershaw <dragorn@kismetwireless.net>, Oct-04
diff --git a/hacks/swirl.c b/hacks/swirl.c
new file mode 100644
index 0000000..ae72820
--- /dev/null
+++ b/hacks/swirl.c
@@ -0,0 +1,1445 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * swirl --- swirly color-cycling patterns.
+ */
+#if 0
+static const char sccsid[] = "@(#)swirl.c 4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1994 M.Dobie <mrd@ecs.soton.ac.uk>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * 09-Oct-2016: dmo2118@gmail.com: Updated for new xshm.c.
+ * 13-May-1997: jwz@jwz.org: turned into a standalone program.
+ * 21-Apr-1995: improved startup time for TrueColour displays
+ * (limited to 16bpp to save memory) S.Early <sde1000@cam.ac.uk>
+ * 09-Jan-1995: fixed colour maps (more colourful) and the image now spirals
+ * outwards from the centre with a fixed number of points drawn
+ * every iteration. Thanks to M.Dobie <mrd@ecs.soton.ac.uk>.
+ * 1994: written. Copyright (c) 1994 M.Dobie <mrd@ecs.soton.ac.uk>
+ * based on original code by R.Taylor
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*count: 5 \n" \
+ "*delay: 10000 \n" \
+ "*ncolors: 200 \n" \
+ "*useSHM: True \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ ".lowrez: True \n" \
+
+# define SMOOTH_COLORS
+# define WRITABLE_COLORS
+# define release_swirl 0
+# define reshape_swirl 0
+# define swirl_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+# include "xshm.h"
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# undef HAVE_XSHM_EXTENSION
+#endif /* !STANDALONE */
+
+ENTRYPOINT ModeSpecOpt swirl_opts = {
+ 0, NULL, 0, NULL, NULL };
+
+#include <time.h>
+
+/****************************************************************/
+
+#define MASS 4 /* maximum mass of a knot */
+#define MIN_RES 5 /* minimim resolution (>= MIN_RES) */
+#define MAX_RES 1 /* maximum resolution (>0) */
+#define TWO_PLANE_PCNT 30 /* probability for two plane mode (0-100) */
+#define RESTART 2500 /* number of cycles before restart */
+#define BATCH_DRAW 100 /* points to draw per iteration */
+
+/* knot types */
+typedef enum {
+ NONE = 0,
+ ORBIT = (1 << 0),
+ WHEEL = (1 << 1),
+ PICASSO = (1 << 2),
+ RAY = (1 << 3),
+ HOOK = (1 << 4),
+ ALL = (1 << 5)
+} KNOT_T;
+
+/* a knot */
+typedef struct Knot {
+ int x, y; /* position */
+ int m; /* mass */
+ KNOT_T t; /* type in the first (or only) plane */
+ KNOT_T T; /* type in second plane if there is one */
+ int M; /* mass in second plane if there is one */
+} KNOT , *KNOT_P;
+
+/* a colour specification */
+typedef struct Colour {
+ unsigned short r, g, b;
+} COLOUR , *COLOUR_P;
+
+/* drawing direction */
+typedef enum {
+ DRAW_RIGHT, DRAW_DOWN, DRAW_LEFT, DRAW_UP
+} DIR_T;
+
+/****************************************************************/
+
+/* data associated with a swirl window */
+typedef struct swirl_data {
+ /* window paramaters */
+ Window win; /* the window */
+ int width, height; /* window size */
+ int depth; /* depth */
+ int rdepth; /* real depth (for XImage) */
+ Visual *visual; /* visual */
+
+ /* swirl drawing parameters */
+ int n_knots; /* number of knots */
+ KNOT_P knots; /* knot details */
+ KNOT_T knot_type; /* general type of knots */
+ int resolution; /* drawing resolution, 1..5 */
+ int max_resolution; /* maximum resolution, MAX_RES */
+ int r; /* pixel step */
+ Bool two_plane; /* two plane mode? */
+ Bool first_plane; /* doing first plane? */
+ int start_again; /* when to restart */
+
+ /* spiral drawing parameters */
+ int x, y; /* current point */
+ DIR_T direction; /* current direction */
+ int dir_todo, dir_done; /* how many points in current direction? */
+ int batch_todo, batch_done; /* how many points in this batch */
+ Bool started, drawing; /* are we drawing? */
+
+ /* image stuff */
+ unsigned char *image; /* image data */
+ XImage *ximage;
+ XShmSegmentInfo shm_info;
+
+ /* colours stuff */
+ int colours; /* how many colours possible */
+ int dcolours; /* how many colours for shading */
+#ifndef STANDALONE
+ Bool fixed_colourmap; /* fixed colourmap? */
+#endif /* !STANDALONE */
+ Bool monochrome; /* monochrome? */
+ Colormap cmap; /* colour map for the window */
+ XColor *rgb_values; /* colour definitions array */
+#ifndef STANDALONE
+ int current_map; /* current colour map, 0..dcolours-1 */
+ unsigned long fg, bg, white, black; /* black and white pixel values */
+ int shift; /* colourmap shift */
+ int dshift; /* colourmap shift while drawing */
+ XColor fgcol, bgcol; /* foreground and background colour specs */
+#endif /* !STANDALONE */
+ Bool off_screen;
+} SWIRL , *SWIRL_P;
+
+#define SWIRLCOLOURS 13
+
+#ifndef STANDALONE
+/* basic colours */
+static COLOUR basic_colours[SWIRLCOLOURS];
+#endif /* !STANDALONE */
+
+/* an array of swirls for each screen */
+static SWIRL_P swirls = NULL;
+
+/*
+ random_no
+
+ Return a random integer between 0 and n inclusive
+
+ - n is the maximum number
+
+ Returns a random integer */
+
+static int
+random_no(unsigned int n)
+{
+ return ((int) ((n + 1) * (double) LRAND() / MAXRAND));
+}
+
+/****************************************************************/
+
+/*
+ initialise_swirl
+
+ Initialise all the swirl data
+
+ - swirl is the swirl data */
+
+static void
+initialise_swirl(ModeInfo * mi, SWIRL_P swirl)
+{
+#ifndef STANDALONE
+ Display *display = MI_DISPLAY(mi);
+#endif /* !STANDALONE */
+
+ swirl->width = 0; /* width and height of window */
+ swirl->height = 0;
+ swirl->depth = 1;
+ swirl->rdepth = 1;
+ swirl->visual = NULL;
+ swirl->resolution = MIN_RES + 1; /* current resolution */
+ swirl->max_resolution = MAX_RES; /* maximum resolution */
+ swirl->n_knots = 0; /* number of knots */
+ swirl->knot_type = ALL; /* general type of knots */
+ swirl->two_plane = False; /* two plane mode? */
+ swirl->first_plane = False; /* doing first plane? */
+ swirl->start_again = -1; /* restart counter */
+
+ /* drawing parameters */
+ swirl->x = 0;
+ swirl->y = 0;
+ swirl->started = False;
+ swirl->drawing = False;
+
+ /* image stuff */
+ swirl->image = NULL; /* image data */
+ swirl->ximage = NULL;
+
+ /* colours stuff */
+ swirl->colours = 0; /* how many colours possible */
+ swirl->dcolours = 0; /* how many colours for shading */
+ swirl->cmap = (Colormap) NULL;
+ swirl->rgb_values = NULL; /* colour definitions array */
+#ifndef STANDALONE
+ swirl->current_map = 0; /* current colour map, 0..dcolours-1 */
+
+ /* set up fg fb colour specs */
+ swirl->white = MI_WIN_WHITE_PIXEL(mi);
+ swirl->black = MI_WIN_BLACK_PIXEL(mi);
+#endif /* !STANDALONE */
+
+
+#ifndef STANDALONE
+ swirl->fg = MI_FG_COLOR(mi);
+ swirl->bg = MI_BG_COLOR(mi);
+ swirl->fgcol.pixel = swirl->fg;
+ swirl->bgcol.pixel = swirl->bg;
+ XQueryColor(display, MI_COLORMAP(mi), &(swirl->fgcol));
+ XQueryColor(display, MI_COLORMAP(mi), &(swirl->bgcol));
+#endif /* !STANDALONE */
+}
+
+/****************************************************************/
+
+/*
+ * initialise_image
+ *
+ * Initialise the image for drawing to
+ *
+ * - swirl is the swirl data
+ */
+static void
+initialise_image(ModeInfo * mi, SWIRL_P swirl)
+{
+ Display *dpy = MI_DISPLAY(mi);
+
+ if (swirl->ximage != NULL)
+ destroy_xshm_image(dpy, swirl->ximage, &swirl->shm_info);
+
+ swirl->ximage = create_xshm_image(dpy, swirl->visual, swirl->rdepth,
+ ZPixmap, &swirl->shm_info,
+ swirl->width, swirl->height);
+}
+
+/****************************************************************/
+
+#ifndef STANDALONE
+/*
+ * initialise_colours
+ *
+ * Initialise the list of colours from which the colourmaps are derived
+ *
+ * - colours is the array to initialise
+ * - saturation is the saturation value to use 0->grey,
+ * 1.0->full saturation
+ */
+static void
+initialise_colours(COLOUR * colours, float saturate)
+{
+ int i;
+
+ /* start off fully saturated, medium and bright colours */
+ colours[0].r = 0xA000;
+ colours[0].g = 0x0000;
+ colours[0].b = 0x0000;
+ colours[1].r = 0xD000;
+ colours[1].g = 0x0000;
+ colours[1].b = 0x0000;
+ colours[2].r = 0x0000;
+ colours[2].g = 0x6000;
+ colours[2].b = 0x0000;
+ colours[3].r = 0x0000;
+ colours[3].g = 0x9000;
+ colours[3].b = 0x0000;
+ colours[4].r = 0x0000;
+ colours[4].g = 0x0000;
+ colours[4].b = 0xC000;
+ colours[5].r = 0x0000;
+ colours[5].g = 0x0000;
+ colours[5].b = 0xF000;
+ colours[6].r = 0xA000;
+ colours[6].g = 0x6000;
+ colours[6].b = 0x0000;
+ colours[7].r = 0xD000;
+ colours[7].g = 0x9000;
+ colours[7].b = 0x0000;
+ colours[8].r = 0xA000;
+ colours[8].g = 0x0000;
+ colours[8].b = 0xC000;
+ colours[9].r = 0xD000;
+ colours[9].g = 0x0000;
+ colours[9].b = 0xF000;
+ colours[10].r = 0x0000;
+ colours[10].g = 0x6000;
+ colours[10].b = 0xC000;
+ colours[11].r = 0x0000;
+ colours[11].g = 0x9000;
+ colours[11].b = 0xF000;
+ colours[12].r = 0xA000;
+ colours[12].g = 0xA000;
+ colours[12].b = 0xA000;
+
+ /* add white for low saturation */
+ for (i = 0; i < SWIRLCOLOURS - 1; i++) {
+ unsigned short max_rg, max;
+
+ /* what is the max intensity for this colour? */
+ max_rg = (colours[i].r > colours[i].g) ? colours[i].r : colours[i].g;
+ max = (max_rg > colours[i].b) ? max_rg : colours[i].b;
+
+ /* bring elements up to max as saturation approaches 0.0 */
+ colours[i].r += (unsigned short) ((float) (1.0 - saturate) *
+ ((float) max - colours[i].r));
+ colours[i].g += (unsigned short) ((float) (1.0 - saturate) *
+ ((float) max - colours[i].g));
+ colours[i].b += (unsigned short) ((float) (1.0 - saturate) *
+ ((float) max - colours[i].b));
+ }
+}
+#endif /* !STANDALONE */
+
+/****************************************************************/
+
+#ifndef STANDALONE
+/*
+ * set_black_and_white
+ *
+ * Set the entries for foreground & background pixels and
+ * WhitePixel & BlackPixel in an array of colour specifications.
+ *
+ * - swirl is the swirl data
+ * - values is the array of specifications
+ */
+static void
+set_black_and_white(SWIRL_P swirl, XColor * values)
+{
+ unsigned long white, black;
+
+ /* where is black and white? */
+ white = swirl->white;
+ black = swirl->black;
+
+ /* set black and white up */
+ values[white].flags = DoRed | DoGreen | DoBlue;
+ values[white].pixel = white;
+ values[white].red = 0xFFFF;
+ values[white].green = 0xFFFF;
+ values[white].blue = 0xFFFF;
+ values[black].flags = DoRed | DoGreen | DoBlue;
+ values[black].pixel = black;
+ values[black].red = 0;
+ values[black].green = 0;
+ values[black].blue = 0;
+
+ /* copy the colour specs from the original entries */
+ values[swirl->fg] = swirl->fgcol;
+ values[swirl->bg] = swirl->bgcol;
+}
+
+/****************************************************************/
+
+/*
+ * set_colour
+ *
+ * Set an entry in an array of XColor specifications. The given entry will be
+ * set to the given colour. If the entry corresponds to the foreground,
+ * background, WhitePixel, or BlackPixel it is ignored and the given colour
+ * is is put in the next entry.
+ *
+ * Therefore, the given colour may be placed up to four places after the
+ * specified entry in the array, if foreground, background, white, or black
+ * intervene.
+ *
+ * - swirl is the swirl data
+ * - value points to a pointer to the array entry. It gets updated to
+ * point to the next free entry.
+ * - pixel points to the current pixel number. It gets updated.
+ * - c points to the colour to add
+ */
+static void
+set_colour(SWIRL_P swirl, XColor ** value, unsigned long *pixel, COLOUR_P c)
+{
+ Bool done;
+ unsigned long fg, bg, white, black;
+
+ /* where are foreground, background, white, and black? */
+ fg = swirl->fg;
+ bg = swirl->bg;
+ white = swirl->white;
+ black = swirl->black;
+
+ /* haven't set it yet */
+ done = False;
+
+ /* try and set the colour */
+ while (!done) {
+ (**value).flags = DoRed | DoGreen | DoBlue;
+ (**value).pixel = *pixel;
+
+ /* white, black, fg, bg, or a colour? */
+ if ((*pixel != fg) && (*pixel != bg) &&
+ (*pixel != white) && (*pixel != black)) {
+ (**value).red = c->r;
+ (**value).green = c->g;
+ (**value).blue = c->b;
+
+ /* now we've done it */
+ done = True;
+ }
+ /* next pixel */
+ (*value)++;
+ (*pixel)++;
+ }
+}
+
+/****************************************************************/
+
+/*
+ * get_colour
+ *
+ * Get an entry from an array of XColor specifications. The next colour from
+ * the array will be returned. Foreground, background, WhitePixel, or
+ * BlackPixel will be ignored.
+ *
+ * - swirl is the swirl data
+ * - value points the array entry. It is updated to point to the entry
+ * following the one returned.
+ * - c is set to the colour found
+ */
+static void
+get_colour(SWIRL_P swirl, XColor ** value, COLOUR_P c)
+{
+ Bool done;
+ unsigned long fg, bg, white, black;
+
+ /* where is white and black? */
+ fg = swirl->fg;
+ bg = swirl->bg;
+ white = swirl->white;
+ black = swirl->black;
+
+ /* haven't set it yet */
+ done = False;
+
+ /* try and set the colour */
+ while (!done) {
+ /* black, white or a colour? */
+ if (((*value)->pixel != fg) && ((*value)->pixel != bg) &&
+ ((*value)->pixel != white) && ((*value)->pixel != black)) {
+ c->r = (*value)->red;
+ c->g = (*value)->green;
+ c->b = (*value)->blue;
+
+ /* now we've done it */
+ done = True;
+ }
+ /* next value */
+ (*value)++;
+ }
+}
+#endif /* !STANDALONE */
+
+/****************************************************************/
+
+#ifndef STANDALONE
+/*
+ * interpolate
+ *
+ * Generate n colours between c1 and c2. n XColors at *value are set up with
+ * ascending pixel values.
+ *
+ * If the pixel range includes BlackPixel or WhitePixel they are set to black
+ * and white respectively but otherwise ignored. Therefore, up to n+2 colours
+ * may actually be set by this function.
+ *
+ * - swirl is the swirl data
+ * - values points a pointer to an array of XColors to update
+ * - pixel points to the pixel number to start at
+ * - k n is the number of colours to generate
+ * - c1, c2 are the colours to interpolate between
+ */
+static void
+interpolate(SWIRL_P swirl, XColor ** values, unsigned long *pixel, int n, COLOUR_P c1, COLOUR_P c2)
+{
+ int i, r, g, b;
+ COLOUR c;
+ unsigned short maxv;
+
+ /* maximum value */
+ maxv = (255 << 8);
+
+ for (i = 0; i < n / 2 && (int) *pixel < swirl->colours; i++) {
+ /* work out the colour */
+ r = c1->r + 2 * i * ((int) c2->r) / n;
+ c.r = (r > (int) maxv) ? maxv : r;
+ g = c1->g + 2 * i * ((int) c2->g) / n;
+ c.g = (g > (int) maxv) ? maxv : g;
+ b = c1->b + 2 * i * ((int) c2->b) / n;
+ c.b = (b > (int) maxv) ? maxv : b;
+
+ /* set it up */
+ set_colour(swirl, values, pixel, &c);
+ }
+ for (i = n / 2; i >= 0 && (int) *pixel < swirl->colours; i--) {
+ r = c2->r + 2 * i * ((int) c1->r) / n;
+ c.r = (r > (int) maxv) ? maxv : r;
+ g = c2->g + 2 * i * ((int) c1->g) / n;
+ c.g = (g > (int) maxv) ? maxv : g;
+ b = c2->b + 2 * i * ((int) c1->b) / n;
+ c.b = (b > (int) maxv) ? maxv : b;
+
+ /* set it up */
+ set_colour(swirl, values, pixel, &c);
+ }
+}
+
+/****************************************************************/
+
+/*
+ * basic_map
+ *
+ * Generate a `random' closed loop colourmap that occupies the whole colour
+ * map.
+ *
+ * - swirl is the swirl data
+ * - values is the array of colour definitions to set up
+ */
+static void
+basic_map(SWIRL_P swirl, XColor * values)
+{
+ COLOUR c[3];
+ int i;
+ unsigned short r1, g1, b1, r2, g2, b2, r3, g3, b3;
+ int L1, L2, L3, L;
+ unsigned long pixel;
+ XColor *value;
+
+ /* start at the beginning of the colour map */
+ pixel = 0;
+ value = values;
+
+ /* choose 3 different basic colours at random */
+ for (i = 0; i < 3;) {
+ int j;
+ Bool same;
+
+ /* choose colour i */
+ c[i] = basic_colours[random_no(SWIRLCOLOURS - 1)];
+
+ /* assume different */
+ same = False;
+
+ /* different from the rest? */
+ for (j = 0; j < i; j++)
+ if ((c[i].r == c[j].r) &&
+ (c[i].g == c[j].g) &&
+ (c[i].b == c[j].b))
+ same = True;
+
+ /* ready for the next colour? */
+ if (!same)
+ i++;
+ }
+
+ /* extract components into variables */
+ r1 = c[0].r;
+ g1 = c[0].g;
+ b1 = c[0].b;
+ r2 = c[1].r;
+ g2 = c[1].g;
+ b2 = c[1].b;
+ r3 = c[2].r;
+ g3 = c[2].g;
+ b3 = c[2].b;
+
+ /* work out the lengths of each side of the triangle */
+ L1 = (int) sqrt((((double) r1 - r2) * ((double) r1 - r2) +
+ ((double) g1 - g2) * ((double) g1 - g2) +
+ ((double) b1 - b2) * ((double) b1 - b2)));
+
+ L2 = (int) sqrt((((double) r3 - r2) * ((double) r3 - r2) +
+ ((double) g3 - g2) * ((double) g3 - g2) +
+ ((double) b3 - b2) * ((double) b3 - b2)));
+
+ L3 = (int) sqrt((((double) r1 - r3) * ((double) r1 - r3) +
+ ((double) g1 - g3) * ((double) g1 - g3) +
+ ((double) b1 - b3) * ((double) b1 - b3)));
+
+ L = L1 + L2 + L3;
+
+ /* allocate colours in proportion to the lengths of the sides */
+ interpolate(swirl, &value, &pixel,
+ (int) ((double) swirl->dcolours * ((double) L1 / (double) L)) + 1, c, c + 1);
+ interpolate(swirl, &value, &pixel,
+ (int) ((double) swirl->dcolours * ((double) L2 / (double) L)) + 1, c + 1, c + 2);
+ interpolate(swirl, &value, &pixel,
+ (int) ((double) swirl->dcolours * ((double) L3 / (double) L)) + 1, c + 2, c);
+
+ /* fill up any remaining slots (due to rounding) */
+ while ((int) pixel < swirl->colours) {
+ /* repeat the last colour */
+ set_colour(swirl, &value, &pixel, c);
+ }
+
+ /* ensure black and white are correct */
+ if (!swirl->fixed_colourmap)
+ set_black_and_white(swirl, values);
+}
+
+/****************************************************************/
+
+/*
+ * pre_rotate
+ *
+ * Generate pre-rotated versions of the colour specifications
+ *
+ * - swirl is the swirl data
+ * - values is an array of colour specifications
+ */
+static void
+pre_rotate(SWIRL_P swirl, XColor * values)
+{
+ int i, j;
+ XColor *src, *dest;
+ int dcolours;
+ unsigned long pixel;
+
+ /* how many colours to display? */
+ dcolours = swirl->dcolours;
+
+ /* start at the first map */
+ src = values;
+ dest = values + swirl->colours;
+
+ /* generate dcolours-1 rotated maps */
+ for (i = 0; i < dcolours - 1; i++) {
+ COLOUR first;
+
+ /* start at the first pixel */
+ pixel = 0;
+
+ /* remember the first one and skip it */
+ get_colour(swirl, &src, &first);
+
+ /* put a rotated version of src at dest */
+ for (j = 0; j < dcolours - 1; j++) {
+ COLOUR c;
+
+ /* get the source colour */
+ get_colour(swirl, &src, &c);
+
+ /* set the colour */
+ set_colour(swirl, &dest, &pixel, &c);
+ }
+
+ /* put the first one at the end */
+ set_colour(swirl, &dest, &pixel, &first);
+
+ /* NB: src and dest should now be ready for the next table */
+
+ /* ensure black and white are properly set */
+ set_black_and_white(swirl, src);
+ }
+}
+
+/****************************************************************/
+
+/*
+ * create_colourmap
+ *
+ * Create a read/write colourmap to use
+ *
+ * - swirl is the swirl data
+ */
+
+static void
+create_colourmap(ModeInfo * mi, SWIRL_P swirl)
+{
+ Display *display = MI_DISPLAY(mi);
+ int preserve;
+ int n_rotations;
+ int i;
+ Bool truecolor;
+ unsigned long redmask, greenmask, bluemask;
+
+ swirl->fixed_colourmap = !setupColormap(mi, &(swirl->colours),
+ &truecolor, &redmask, &greenmask, &bluemask);
+ preserve = preserveColors(swirl->fg, swirl->bg, swirl->white, swirl->black);
+
+ /* how many colours should we animate? */
+ swirl->dcolours = (swirl->colours > preserve + 1) ?
+ swirl->colours - preserve : swirl->colours;
+
+ if (MI_NPIXELS(mi) < 2)
+ return;
+
+ /* how fast to shift the colourmap? */
+ swirl->shift = (swirl->colours > 64) ? swirl->colours / 64 : 1;
+ swirl->dshift = (swirl->shift > 1) ? swirl->shift * 2 : 1;
+
+ /* how may colour map rotations are there? */
+ n_rotations = (swirl->fixed_colourmap) ? 1 : swirl->dcolours;
+
+ /* allocate space for colour definitions (if not already there) */
+ if (swirl->rgb_values == NULL) {
+ swirl->rgb_values = (XColor *) calloc((swirl->colours + 3) * n_rotations,
+ sizeof (XColor));
+
+ /* create a colour map */
+ if (!swirl->fixed_colourmap)
+ swirl->cmap =
+ XCreateColormap(display, swirl->win, swirl->visual, AllocAll);
+ }
+ /* select a set of colours for the colour map */
+ basic_map(swirl, swirl->rgb_values);
+
+ /* are we rotating them? */
+ if (!swirl->fixed_colourmap) {
+ /* generate rotations of the colour maps */
+ pre_rotate(swirl, swirl->rgb_values);
+
+ /* store the colours in the colour map */
+ XStoreColors(display, swirl->cmap, swirl->rgb_values, swirl->colours);
+ } else {
+ if (truecolor) {
+ int rsh, gsh, bsh;
+ unsigned long int t;
+
+ t = redmask;
+ for (i = 0; (int) t > 0; i++, t >>= 1);
+ rsh = 16 - i;
+ t = greenmask;
+ for (i = 0; (int) t > 0; i++, t >>= 1);
+ gsh = 16 - i;
+ t = bluemask;
+ for (i = 0; (int) t > 0; i++, t >>= 1);
+ bsh = 16 - i;
+ for (i = 0; i < swirl->colours; i++)
+ swirl->rgb_values[i].pixel =
+ ((rsh > 0 ? (swirl->rgb_values[i].red) >> rsh :
+ (swirl->rgb_values[i].red) << (-rsh)) & redmask) |
+ ((gsh > 0 ? (swirl->rgb_values[i].green) >> gsh :
+ (swirl->rgb_values[i].green) << (-gsh)) & greenmask) |
+ ((bsh > 0 ? (swirl->rgb_values[i].blue) >> bsh :
+ (swirl->rgb_values[i].blue) << (-bsh)) & bluemask);
+ } else {
+ /* lookup the colours in the fixed colour map */
+ for (i = 0; i < swirl->colours; i++)
+ (void) XAllocColor(display, MI_COLORMAP(mi),
+ &(swirl->rgb_values[i]));
+ }
+ }
+}
+
+/****************************************************************/
+
+/*
+ * install_map
+ *
+ * Install a new set of colours into the colour map
+ *
+ * - dpy is the display
+ * - swirl is the swirl data
+ * - shift is the amount to rotate the colour map by
+ */
+static void
+install_map(Display * dpy, SWIRL_P swirl, int shift)
+{
+ if (!swirl->fixed_colourmap) {
+ /* shift the colour map */
+ swirl->current_map = (swirl->current_map + shift) %
+ swirl->dcolours;
+
+ /* store it */
+ XStoreColors(dpy, swirl->cmap,
+ swirl->rgb_values +
+ swirl->current_map * swirl->colours,
+ swirl->colours);
+ }
+}
+#endif /* !STANDALONE */
+
+/****************************************************************/
+
+/*
+ * create_knots
+ *
+ * Initialise the array of knot
+ *
+ * swirl is the swirl data
+ */
+static void
+create_knots(SWIRL_P swirl)
+{
+ int k;
+ Bool orbit, wheel, picasso, ray, hook;
+ KNOT_P knot;
+
+ /* create array for knots */
+ if (swirl->knots)
+ (void) free((void *) swirl->knots);
+ swirl->knots = (KNOT_P) calloc(swirl->n_knots, sizeof (KNOT));
+
+ /* no knots yet */
+ orbit = wheel = picasso = ray = hook = False;
+
+ /* what types do we have? */
+ if ((int) swirl->knot_type & (int) ALL) {
+ orbit = wheel = ray = hook = True;
+ } else {
+ if ((int) swirl->knot_type & (int) ORBIT)
+ orbit = True;
+ if ((int) swirl->knot_type & (int) WHEEL)
+ wheel = True;
+ if ((int) swirl->knot_type & (int) PICASSO)
+ picasso = True;
+ if ((int) swirl->knot_type & (int) RAY)
+ ray = True;
+ if ((int) swirl->knot_type & (int) HOOK)
+ hook = True;
+ }
+
+ /* initialise each knot */
+ knot = swirl->knots;
+ for (k = 0; k < swirl->n_knots; k++) {
+ /* position */
+ knot->x = random_no((unsigned int) swirl->width);
+ knot->y = random_no((unsigned int) swirl->height);
+
+ /* mass */
+ knot->m = random_no(MASS) + 1;
+
+ /* can be negative */
+ if (random_no(100) > 50)
+ knot->m *= -1;
+
+ /* type */
+ knot->t = NONE;
+ while (knot->t == NONE) {
+ /* choose a random one from the types available */
+ switch (random_no(4)) {
+ case 0:
+ if (orbit)
+ knot->t = ORBIT;
+ break;
+ case 1:
+ if (wheel)
+ knot->t = WHEEL;
+ break;
+ case 2:
+ if (picasso)
+ knot->t = PICASSO;
+ break;
+ case 3:
+ if (ray)
+ knot->t = RAY;
+ break;
+ case 4:
+ if (hook)
+ knot->t = HOOK;
+ break;
+ }
+ }
+
+ /* if two planes, do same for second plane */
+ if (swirl->two_plane) {
+ knot->T = NONE;
+ while (knot->T == NONE || knot->T == knot->t) {
+ /* choose a different type */
+ switch (random_no(4)) {
+ case 0:
+ if (orbit)
+ knot->T = ORBIT;
+ break;
+ case 1:
+ if (wheel)
+ knot->T = WHEEL;
+ break;
+ case 2:
+ if (picasso)
+ knot->T = PICASSO;
+ break;
+ case 3:
+ if (ray)
+ knot->T = RAY;
+ break;
+ case 4:
+ if (hook)
+ knot->T = HOOK;
+ break;
+ }
+ }
+ }
+ /* next knot */
+ knot++;
+ }
+}
+
+/****************************************************************/
+
+/*
+ * do_point
+ *
+ * Work out the pixel value at i, j. Ensure it does not clash with BlackPixel
+ * or WhitePixel.
+ *
+ * - swirl is the swirl data
+ * - i, j is the point to calculate
+ *
+ * Returns the value of the point
+ */
+static unsigned long
+do_point(SWIRL_P swirl, int i, int j)
+{
+ int tT, k, value, add;
+ double dx, dy, theta, dist;
+ int dcolours, qcolours;
+ double rads;
+ KNOT_P knot;
+
+ /* how many colours? */
+ dcolours = swirl->dcolours;
+ qcolours = dcolours / 4;
+
+ /* colour step round a circle */
+ rads = (double) dcolours / (2.0 * M_PI);
+
+ /* start at zero */
+ value = 0;
+
+ /* go through all the knots */
+ knot = swirl->knots;
+ for (k = 0; k < swirl->n_knots; k++) {
+ dx = i - knot->x;
+ dy = j - knot->y;
+
+ /* in two_plane mode get the appropriate knot type */
+ if (swirl->two_plane)
+ tT = (int) ((swirl->first_plane) ? knot->t : knot->T);
+ else
+ tT = (int) knot->t;
+
+ /* distance from knot */
+ dist = sqrt(dx * dx + dy * dy);
+
+ /* nothing to add at first */
+ add = 0;
+
+ /* work out the contribution (if close enough) */
+ if (dist > 0.1)
+ switch (tT) {
+ case ORBIT:
+ add = (int) (dcolours / (1.0 + 0.01 * abs(knot->m) * dist));
+ break;
+ case WHEEL:
+ /* Avoid atan2: DOMAIN error message */
+ if (dy == 0.0 && dx == 0.0)
+ theta = 1.0;
+ else
+ theta = (atan2(dy, dx) + M_PI) / M_PI;
+ if (theta < 1.0)
+ add = (int) (dcolours * theta +
+ sin(0.1 * knot->m * dist) *
+ qcolours * exp(-0.01 * dist));
+ else
+ add = (int) (dcolours * (theta - 1.0) +
+ sin(0.1 * knot->m * dist) *
+ qcolours * exp(-0.01 * dist));
+ break;
+ case PICASSO:
+ add = (int) (dcolours *
+ fabs(cos(0.002 * knot->m * dist)));
+ break;
+ case RAY:
+ /* Avoid atan2: DOMAIN error message */
+ if (dy == 0.0 && dx == 0.0)
+ add = 0;
+ else
+ add = (int) (dcolours * fabs(sin(2.0 * atan2(dy, dx))));
+
+ break;
+ case HOOK:
+ /* Avoid atan2: DOMAIN error message */
+ if (dy == 0.0 && dx == 0.0)
+ add = (int) (0.05 * (abs(knot->m) - 1) * dist);
+ else
+ add = (int) (rads * atan2(dy, dx) +
+ 0.05 * (abs(knot->m) - 1) * dist);
+ break;
+ }
+ /* for a +ve mass add on the contribution else take it off */
+ if (knot->m > 0)
+ value += add;
+ else
+ value -= add;
+
+ /* next knot */
+ knot++;
+ }
+
+ /* toggle plane */
+ swirl->first_plane = (!swirl->first_plane);
+
+ /* make sure we handle -ve values properly */
+ if (value >= 0)
+ value = (value % dcolours) + 2;
+ else
+ value = dcolours - (abs(value) % (dcolours - 1));
+
+#ifndef STANDALONE
+ /* if fg and bg are 1 and 0 we should be OK, but just in case */
+ while ((dcolours > 2) &&
+ (((value % swirl->colours) == (int) swirl->fg) ||
+ ((value % swirl->colours) == (int) swirl->bg) ||
+ ((value % swirl->colours) == (int) swirl->white) ||
+ ((value % swirl->colours) == (int) swirl->black))) {
+ value++;
+ }
+#endif /* !STANDALONE */
+
+ /* definitely make sure it is in range */
+ value = value % swirl->colours;
+
+ /* lookup the pixel value if necessary */
+#ifndef STANDALONE
+ if (swirl->fixed_colourmap && swirl->dcolours > 2)
+#endif
+ value = swirl->rgb_values[value].pixel;
+
+ /* return it */
+ return ((unsigned long) value);
+}
+
+/****************************************************************/
+
+/*
+ * draw_block
+ *
+ * Draw a square block of points with the same value.
+ *
+ * - ximage is the XImage to draw on.
+ * - x, y is the top left corner
+ * - s is the length of each side
+ * - v is the value
+ */
+static void
+draw_block(XImage * ximage, int x, int y, int s, unsigned long v)
+{
+ int a, b;
+
+ for (a = 0; a < s; a++)
+ for (b = 0; b < s; b++) {
+ XPutPixel(ximage, x + b, y + a, v);
+ }
+}
+
+/****************************************************************/
+
+/*
+ * draw_point Draw the current point in a swirl pattern onto the XImage
+ *
+ * - swirl is the swirl
+ * - win is the window to update
+ */
+static void
+draw_point(ModeInfo * mi, SWIRL_P swirl)
+{
+ int r;
+ int x, y;
+
+ /* get current point coordinates and resolution */
+ x = swirl->x;
+ y = swirl->y;
+ r = swirl->r;
+
+ /* check we are within the window */
+ if ((x < 0) || (x > swirl->width - r) || (y < 0) || (y > swirl->height - r))
+ return;
+
+ /* what style are we drawing? */
+ if (swirl->two_plane) {
+ int r2;
+
+ /* halve the block size */
+ r2 = r / 2;
+
+ /* interleave blocks at half r */
+ draw_block(swirl->ximage, x, y, r2, do_point(swirl, x, y));
+ draw_block(swirl->ximage, x + r2, y, r2, do_point(swirl, x + r2, y));
+ draw_block(swirl->ximage, x + r2, y + r2, r2, do_point(swirl,
+ x + r2, y + r2));
+ draw_block(swirl->ximage, x, y + r2, r2, do_point(swirl, x, y + r2));
+ } else
+ draw_block(swirl->ximage, x, y, r, do_point(swirl, x, y));
+
+ /* update the screen */
+
+ put_xshm_image(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), swirl->ximage,
+ x, y, x, y, r, r, &swirl->shm_info);
+}
+
+/****************************************************************/
+
+/*
+ * next_point Move to the next point in the spiral pattern
+ * - swirl is the swirl
+ * - win is the window to update
+ */
+static void
+next_point(SWIRL_P swirl)
+{
+ /* more to do in this direction? */
+ if (swirl->dir_done < swirl->dir_todo) {
+ /* move in the current direction */
+ switch (swirl->direction) {
+ case DRAW_RIGHT:
+ swirl->x += swirl->r;
+ break;
+ case DRAW_DOWN:
+ swirl->y += swirl->r;
+ break;
+ case DRAW_LEFT:
+ swirl->x -= swirl->r;
+ break;
+ case DRAW_UP:
+ swirl->y -= swirl->r;
+ break;
+ }
+
+ /* done another point */
+ swirl->dir_done++;
+ } else {
+ /* none drawn yet */
+ swirl->dir_done = 0;
+
+ /* change direction - check and record if off screen */
+ switch (swirl->direction) {
+ case DRAW_RIGHT:
+ swirl->direction = DRAW_DOWN;
+ if (swirl->x > swirl->width - swirl->r) {
+ /* skip these points */
+ swirl->dir_done = swirl->dir_todo;
+ swirl->y += (swirl->dir_todo * swirl->r);
+
+ /* check for finish */
+ if (swirl->off_screen)
+ swirl->drawing = False;
+ swirl->off_screen = True;
+ } else
+ swirl->off_screen = False;
+ break;
+ case DRAW_DOWN:
+ swirl->direction = DRAW_LEFT;
+ swirl->dir_todo++;
+ if (swirl->y > swirl->height - swirl->r) {
+ /* skip these points */
+ swirl->dir_done = swirl->dir_todo;
+ swirl->x -= (swirl->dir_todo * swirl->r);
+
+ /* check for finish */
+ if (swirl->off_screen)
+ swirl->drawing = False;
+ swirl->off_screen = True;
+ } else
+ swirl->off_screen = False;
+ break;
+ case DRAW_LEFT:
+ swirl->direction = DRAW_UP;
+ if (swirl->x < 0) {
+ /* skip these points */
+ swirl->dir_done = swirl->dir_todo;
+ swirl->y -= (swirl->dir_todo * swirl->r);
+
+ /* check for finish */
+ if (swirl->off_screen)
+ swirl->drawing = False;
+ swirl->off_screen = True;
+ } else
+ swirl->off_screen = False;
+ break;
+ case DRAW_UP:
+ swirl->direction = DRAW_RIGHT;
+ swirl->dir_todo++;
+ if (swirl->y < 0) {
+ /* skip these points */
+ swirl->dir_done = swirl->dir_todo;
+ swirl->x += (swirl->dir_todo * swirl->r);
+
+ /* check for finish */
+ if (swirl->off_screen)
+ swirl->drawing = False;
+ swirl->off_screen = True;
+ } else
+ swirl->off_screen = False;
+ break;
+ }
+ }
+}
+
+/****************************************************************/
+
+/*
+ * init_swirl
+ *
+ * Initialise things for swirling
+ *
+ * - win is the window to draw in
+ */
+ENTRYPOINT void
+init_swirl(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ SWIRL_P swirl;
+
+ MI_INIT (mi, swirls);
+ swirl = &(swirls[MI_SCREEN(mi)]);
+ initialise_swirl(mi, swirl);
+
+ /* get window parameters */
+ swirl->win = window;
+ swirl->width = MI_WIN_WIDTH(mi);
+ swirl->height = MI_WIN_HEIGHT(mi);
+ swirl->depth = MI_WIN_DEPTH(mi);
+ swirl->rdepth = swirl->depth;
+ swirl->visual = MI_VISUAL(mi);
+
+ if (swirl->depth > 16)
+ swirl->depth = 16;
+
+ /* initialise image for speeding up drawing */
+ initialise_image(mi, swirl);
+
+ /* clear the window (before setting the colourmap) */
+ XClearWindow(display, MI_WINDOW(mi));
+
+#ifdef STANDALONE
+
+ swirl->rgb_values = mi->colors;
+ swirl->colours = mi->npixels;
+ swirl->dcolours = swirl->colours;
+/* swirl->fixed_colourmap = !mi->writable_p;*/
+
+#else /* !STANDALONE */
+
+ /* initialise the colours from which the colourmap is derived */
+ initialise_colours(basic_colours, MI_SATURATION(mi));
+
+ /* set up the colour map */
+ create_colourmap(mi, swirl);
+
+ /* attach the colour map to the window (if we have one) */
+ if (!swirl->fixed_colourmap) {
+#if 1
+ setColormap(display, window, swirl->cmap, MI_WIN_IS_INWINDOW(mi));
+#else
+ XSetWindowColormap(display, window, swirl->cmap);
+ (void) XSetWMColormapWindows(display, window, &window, 1);
+ XInstallColormap(display, swirl->cmap);
+#endif
+ }
+#endif /* STANDALONE */
+
+ /* resolution starts off chunky */
+ swirl->resolution = MIN_RES + 1;
+
+ /* calculate the pixel step for this resulution */
+ swirl->r = (1 << (swirl->resolution - 1));
+
+ /* how many knots? */
+ swirl->n_knots = random_no((unsigned int) MI_BATCHCOUNT(mi) / 2) +
+ MI_BATCHCOUNT(mi) + 1;
+
+ /* what type of knots? */
+ swirl->knot_type = ALL; /* for now */
+
+ /* use two_plane mode occaisionally */
+ if (random_no(100) <= TWO_PLANE_PCNT) {
+ swirl->two_plane = swirl->first_plane = True;
+ swirl->max_resolution = 2;
+ } else
+ swirl->two_plane = False;
+
+ /* fix the knot values */
+ create_knots(swirl);
+
+ /* we are off */
+ swirl->started = True;
+ swirl->drawing = False;
+}
+
+/****************************************************************/
+
+/*
+ * draw_swirl
+ *
+ * Draw one iteration of swirling
+ *
+ * - win is the window to draw in
+ */
+ENTRYPOINT void
+draw_swirl(ModeInfo * mi)
+{
+ SWIRL_P swirl = &(swirls[MI_SCREEN(mi)]);
+
+ /* are we going? */
+ if (swirl->started) {
+ /* in the middle of drawing? */
+ if (swirl->drawing) {
+#ifdef STANDALONE
+ if (mi->writable_p)
+ rotate_colors(mi->xgwa.screen, MI_COLORMAP(mi),
+ swirl->rgb_values, swirl->colours, 1);
+#else /* !STANDALONE */
+ /* rotate the colours */
+ install_map(MI_DISPLAY(mi), swirl, swirl->dshift);
+#endif /* !STANDALONE */
+
+ /* draw a batch of points */
+ swirl->batch_todo = BATCH_DRAW;
+ while ((swirl->batch_todo > 0) && swirl->drawing) {
+ /* draw a point */
+ draw_point(mi, swirl);
+
+ /* move to the next point */
+ next_point(swirl);
+
+ /* done a point */
+ swirl->batch_todo--;
+ }
+ } else {
+#ifdef STANDALONE
+ if (mi->writable_p)
+ rotate_colors(mi->xgwa.screen, MI_COLORMAP(mi),
+ swirl->rgb_values, swirl->colours, 1);
+#else /* !STANDALONE */
+ /* rotate the colours */
+ install_map(MI_DISPLAY(mi), swirl, swirl->shift);
+#endif /* !STANDALONE */
+
+ /* time for a higher resolution? */
+ if (swirl->resolution > swirl->max_resolution) {
+ /* move to higher resolution */
+ swirl->resolution--;
+
+ /* calculate the pixel step for this resulution */
+ swirl->r = (1 << (swirl->resolution - 1));
+
+ /* start drawing again */
+ swirl->drawing = True;
+
+ /* start in the middle of the screen */
+ swirl->x = (swirl->width - swirl->r) / 2;
+ swirl->y = (swirl->height - swirl->r) / 2;
+
+ /* initialise spiral drawing parameters */
+ swirl->direction = DRAW_RIGHT;
+ swirl->dir_todo = 1;
+ swirl->dir_done = 0;
+ } else {
+ /* all done, decide when to restart */
+ if (swirl->start_again == -1) {
+ /* start the counter */
+ swirl->start_again = RESTART;
+ } else if (swirl->start_again == 0) {
+ /* reset the counter */
+ swirl->start_again = -1;
+
+#ifdef STANDALONE
+ /* Pick a new colormap! */
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+ free_colors (mi->xgwa.screen, MI_COLORMAP(mi),
+ mi->colors, mi->npixels);
+ make_smooth_colormap (mi->xgwa.screen, MI_VISUAL(mi),
+ MI_COLORMAP(mi),
+ mi->colors, &mi->npixels, True,
+ &mi->writable_p, True);
+ swirl->colours = mi->npixels;
+#endif /* STANDALONE */
+
+ /* start again */
+ init_swirl(mi);
+ } else
+ /* decrement the counter */
+ swirl->start_again--;
+ }
+ }
+ }
+}
+
+/****************************************************************/
+
+ENTRYPOINT void
+free_swirl (ModeInfo * mi)
+{
+ SWIRL_P swirl = &(swirls[MI_SCREEN(mi)]);
+
+#ifndef STANDALONE
+ if (swirl->cmap != (Colormap) NULL)
+ XFreeColormap(MI_DISPLAY(mi), swirl->cmap);
+#endif /* STANDALONE */
+#ifndef STANDALONE
+ if (swirl->rgb_values != NULL)
+ XFree((void *) swirl->rgb_values);
+#endif /* !STANDALONE */
+ if (swirl->ximage != NULL)
+ destroy_xshm_image(MI_DISPLAY(mi), swirl->ximage,
+ &swirl->shm_info);
+ if (swirl->knots)
+ (void) free((void *) swirl->knots);
+}
+
+/****************************************************************/
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_swirl (ModeInfo * mi)
+{
+ SWIRL_P swirl = &(swirls[MI_SCREEN(mi)]);
+
+ if (swirl->started) {
+ if (swirl->drawing)
+ swirl->resolution = swirl->resolution + 1;
+ swirl->drawing = False;
+ }
+}
+#endif
+
+XSCREENSAVER_MODULE ("Swirl", swirl)
diff --git a/hacks/swirl.man b/hacks/swirl.man
new file mode 100644
index 0000000..decbaf0
--- /dev/null
+++ b/hacks/swirl.man
@@ -0,0 +1,70 @@
+.TH XScreenSaver 1 "13-May-97" "X Version 11"
+.SH NAME
+swirl - draws swirly color-cycling patterns
+.SH SYNOPSIS
+.B swirl
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-ncolors \fIinteger\fP]
+[\-delay \fImicroseconds\fP]
+[\-count \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIswirl\fP program draws swirly color-cycling patterns.
+.SH OPTIONS
+.I swirl
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1994 M. Dobie.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+.SH AUTHOR
+M.Dobie <mrd@ecs.soton.ac.uk>, 1994.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 13-May-97.
diff --git a/hacks/t3d.c b/hacks/t3d.c
new file mode 100644
index 0000000..959d24a
--- /dev/null
+++ b/hacks/t3d.c
@@ -0,0 +1,980 @@
+/* t3d -- Flying Balls Clock Demo
+ by Bernd Paysan , paysan@informatik.tu-muenchen.de
+
+ Copy, modify, and distribute T3D either under GPL version 2 or newer,
+ or under the standard MIT/X license notice.
+
+ partly based on flying balls demo by Georg Acher,
+ acher@informatik.tu-muenchen.de
+ (developed on HP9000/720 (55 MIPS,20 MFLOPS) )
+ NO warranty at all ! Complaints to /dev/null !
+
+ 4-Jan-99 jwz@jwz.org -- adapted to xscreensaver framework, to take advantage
+ of the command-line options provided by screenhack.c.
+*/
+
+#ifndef HAVE_JWXYZ
+# define FASTDRAW
+# define FASTCOPY
+#endif /* !HAVE_JWXYZ */
+
+#include <stdio.h>
+#include <math.h>
+#include <time.h> /* for localtime() and gettimeofday() */
+
+#include "screenhack.h"
+
+
+#define WIDTH 200
+#define HEIGHT 200
+#define norm 20.0
+
+#define ROOT 0x1
+#define PI M_PI
+#define TWOPI 2*M_PI
+
+#define MIN(i,j) ((i)<(j)?(i):(j))
+
+#define kmax ((st->minutes?60:24))
+/* Anzahl der Kugeln */
+#define sines 52
+/* Werte in der Sinus-Tabelle */
+/*-----------------------------------------------------------------*/
+#define setink(inkcolor) \
+ XSetForeground (st->dpy,st->gc,inkcolor)
+
+#define drawline(xx1,yy1,xx2,yy2) \
+ XDrawLine(st->dpy,st->win,st->gc,xx1,yy1,xx2,yy2)
+
+#define drawseg(segments,nr_segments) \
+ XDrawSegments(st->dpy,st->win,st->gc,segments,nr_segments)
+
+
+#define polyfill(ppts,pcount) \
+ XFillPolygon(st->dpy,st->win,st->gc,ppts,pcount,Convex,CoordModeOrigin)
+
+
+#define frac(argument) argument-floor(argument)
+
+#undef ABS
+#define ABS(x) ((x)<0.0 ? -(x) : (x))
+
+typedef struct {
+ double x,y,z,r,d,r1;
+ int x1,y1;
+} kugeldat;
+
+/* Felder fuer 3D */
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int maxk;
+ int timewait;
+
+ Colormap cmap;
+ double r,g,b;
+ double hue,sat,val;
+
+ kugeldat kugeln[100];
+
+ double a[3],am[3],x[3],y[3],v[3];
+ double zoom,speed,zaehler,vspeed;
+ double vturn;
+ double sinus[sines];
+ double cosinus[sines];
+
+ int startx,starty;
+ double mag;
+ int minutes;
+ int cycl;
+ double hsvcycl;
+ double movef, wobber, cycle;
+
+ XWindowAttributes xgwa;
+ GC gc;
+ GC orgc;
+ GC andgc;
+ int scrnWidth, scrnHeight;
+ Pixmap buffer;
+ int fastch;
+
+ int scrnW2,scrnH2;
+ XColor colors[64];
+ struct tm *zeit;
+
+ int planes;
+
+ Window junk_win,in_win;
+ int px,py,junk;
+ unsigned int kb;
+
+ int fastdraw;
+ int draw_color;
+
+# ifdef FASTDRAW
+# ifdef FASTCOPY
+# define sum1ton(a) (((a)*(a)+1)/2)
+# define fastcw sum1ton(st->fastch)
+ Pixmap fastcircles;
+ Pixmap fastmask;
+# else /* !FASTCOPY */
+ XImage* fastcircles[maxfast];
+ XImage* fastmask[maxfast];
+# endif /* !FASTCOPY */
+# endif /* FASTDRAW */
+};
+
+
+
+#define maxfast 100
+
+/* compute time */
+
+static double
+gettime (struct state *st)
+{
+ struct timeval time1;
+ struct tm *zeit;
+ time_t lt;
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone zone1;
+ gettimeofday(&time1,&zone1);
+#else
+ gettimeofday(&time1);
+#endif
+ lt = time1.tv_sec; /* avoid type cast lossage */
+ zeit=localtime(&lt);
+
+ return (zeit->tm_sec+60*(zeit->tm_min+60*(zeit->tm_hour))
+ + time1.tv_usec*1.0E-6);
+}
+
+/* --------------------COLORMAP---------------------*/
+
+static void
+hsv2rgb (double h, double s, double v, double *r, double *g, double *b)
+{
+ h/=360.0; h=6*(h-floor(h));
+
+ if(s==0.0)
+ {
+ *r=*g=*b=v;
+ }
+ else
+ { int i=(int)h;
+ double t,u,w;
+
+ h=h-floor(h);
+
+ u=v*(s*(1.0-h));
+ w=v*(1.0-s);
+ t=v*(s*h+1.0-s);
+
+ switch(i)
+ {
+ case 0: *r=v; *g=t; *b=w; break;
+ case 1: *r=u; *g=v; *b=w; break;
+ case 2: *r=w; *g=v; *b=t; break;
+ case 3: *r=w; *g=u; *b=v; break;
+ case 4: *r=t; *g=w; *b=v; break;
+ case 5: *r=v; *g=w; *b=u; break;
+ }
+ }
+#ifdef PRTDBX
+ printf("HSV: %f %f %f to\nRGB: %f %f %f\n",h,s,v,*r,*g,*b);
+#endif
+}
+
+static void
+changeColor (struct state *st, double r, double g, double b)
+{
+ int n,n1;
+
+ n1=0;
+ for(n=30;n<64;n+=3)
+ {
+ st->colors[n1].red =1023+ n*(int)(1024.*r);
+ st->colors[n1].blue =1023+ n*(int)(1024.*b);
+ st->colors[n1].green =1023+ n*(int)(1024.*g);
+
+ n1++;
+ }
+
+ XStoreColors (st->dpy, st->cmap, st->colors, 12);
+}
+
+static void
+initColor (struct state *st, double r, double g, double b)
+{
+ int n,n1;
+ unsigned long pixels[12];
+ unsigned long dummy;
+
+ st->cmap = st->xgwa.colormap;
+
+ if(st->hsvcycl!=0.0 && XAllocColorCells(st->dpy, st->cmap, 0, &dummy, 0, pixels, 12))
+ {
+ for(n1=0;n1<12;n1++)
+ {
+ st->colors[n1].pixel=pixels[n1];
+ st->colors[n1].flags=DoRed | DoGreen | DoBlue;
+ }
+
+ changeColor(st,r,g,b);
+ }
+ else
+ {
+ n1=0;
+ for(n=30;n<64;n+=3)
+ {
+ st->colors[n1].red =1023+ n*(int)(1024.*r);
+ st->colors[n1].blue =1023+ n*(int)(1024.*b);
+ st->colors[n1].green =1023+ n*(int)(1024.*g);
+
+ if (!(XAllocColor (st->dpy, st->cmap, &st->colors[n1]))) {
+ fprintf (stderr, "Error: Cannot allocate colors\n");
+ exit (1);
+ }
+
+ n1++;
+ }
+ }
+}
+
+/* ----------------WINDOW-------------------*/
+
+static void
+initialize (struct state *st)
+{
+ XGCValues *xgc;
+ XGCValues *xorgc;
+ XGCValues *xandgc;
+
+ st->maxk=34;
+ st->r = st->g = st->b = 1;
+ st->hue = st->sat = 0;
+ st->val = 1;
+ st->mag = 10;
+ st->movef = 0.5;
+ st->wobber = 2;
+ st->cycle = 6;
+ st->scrnWidth = WIDTH;
+ st->scrnHeight = HEIGHT;
+
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->scrnWidth = st->xgwa.width;
+ st->scrnHeight = st->xgwa.height;
+
+ {
+ float f = get_float_resource (st->dpy, "cycle", "Float");
+ if (f <= 0 || f > 60) f = 6.0;
+ st->cycle = 60.0 / f;
+ }
+ st->movef = get_float_resource (st->dpy, "move", "Float");
+ st->wobber = get_float_resource (st->dpy, "wobble", "Float");
+
+ {
+ double magfac = get_float_resource (st->dpy, "mag", "Float");
+ st->mag *= magfac;
+ st->fastch=(int)(st->fastch*magfac);
+ }
+
+ if (get_boolean_resource (st->dpy, "minutes", "Boolean")) {
+ st->minutes=1; st->maxk+=60-24;
+ }
+
+ st->timewait = get_integer_resource (st->dpy, "delay", "Integer");
+ st->fastch = get_integer_resource (st->dpy, "fast", "Integer");
+ st->cycl = get_boolean_resource (st->dpy, "colcycle", "Integer");
+ st->hsvcycl = get_float_resource (st->dpy, "hsvcycle", "Integer");
+
+ {
+ char *s = get_string_resource (st->dpy, "rgb", "RGB");
+ char dummy;
+ if (s && *s)
+ {
+ double rr, gg, bb;
+ if (3 == sscanf (s, "%lf %lf %lf %c", &rr, &gg, &bb, &dummy))
+ st->r = rr, st->g = gg, st->b = bb;
+ }
+ if (s) free (s);
+
+ s = get_string_resource (st->dpy, "hsv", "HSV");
+ if (s && *s)
+ {
+ double hh, ss, vv;
+ if (3 == sscanf (s, "%lf %lf %lf %c", &hh, &ss, &vv, &dummy)) {
+ st->hue = hh, st->sat = ss, st->val = vv;
+ hsv2rgb(st->hue,st->sat,st->val,&st->r,&st->g,&st->b);
+ }
+ }
+ if (s) free (s);
+ }
+
+ if (st->fastch > maxfast)
+ st->fastch=maxfast;
+
+ xgc=( XGCValues *) malloc(sizeof(XGCValues) );
+ xorgc=( XGCValues *) malloc(sizeof(XGCValues) );
+ xandgc=( XGCValues *) malloc(sizeof(XGCValues) );
+
+ st->planes=st->xgwa.depth;
+
+#ifdef HAVE_JWXYZ
+# define GXandInverted GXcopy /* #### this can't be right, right? */
+#endif
+ st->gc = XCreateGC (st->dpy, st->window, 0, xgc);
+ xorgc->function =GXor;
+ st->orgc = XCreateGC (st->dpy, st->window, GCFunction, xorgc);
+ xandgc->function =GXandInverted;
+ st->andgc = XCreateGC (st->dpy, st->window, GCFunction, xandgc);
+
+ st->buffer = XCreatePixmap (st->dpy, st->window, st->scrnWidth, st->scrnHeight,
+ st->xgwa.depth);
+
+#ifdef DEBUG
+ printf("Time 3D drawing ");
+#ifdef FASTDRAW
+# ifdef FASTCOPY
+ puts("fast by Pixmap copy");
+# else
+ puts("fast by XImage copy");
+# endif
+#else
+ puts("slow");
+#endif
+#endif /* DEBUG */
+
+#ifdef FASTCOPY
+ st->fastcircles = XCreatePixmap (st->dpy, st->window, fastcw, st->fastch+1, st->xgwa.depth);
+ st->fastmask = XCreatePixmap (st->dpy, st->window, fastcw, st->fastch+1, st->xgwa.depth);
+#endif
+
+ setink(BlackPixelOfScreen (st->xgwa.screen));
+ XFillRectangle (st->dpy, st->buffer , st->gc, 0, 0, st->scrnWidth, st->scrnHeight);
+
+#ifdef FASTCOPY
+
+ setink(0);
+ XFillRectangle (st->dpy, st->fastcircles, st->gc, 0, 0, fastcw, st->fastch+1);
+ XFillRectangle (st->dpy, st->fastmask , st->gc, 0, 0, fastcw, st->fastch+1);
+
+#endif
+
+#ifdef PRTDBX
+ printf("move\t%.2f\nwobber\t%.2f\nmag\t%.2f\ncycle\t%.4f\n",
+ st->movef,st->wobber,st->mag/10,st->cycle);
+ printf("fast\t%i\nmarks\t%i\nwait\t%i\n",st->fastch,st->maxk,st->timewait);
+#endif
+
+}
+
+static void fill_kugel(struct state *st, int i, Pixmap buf, int setcol);
+
+
+/*------------------------------------------------------------------*/
+static void
+init_kugel(struct state *st)
+{
+
+#ifdef FASTDRAW
+ int i;
+
+ for(i=0; i<st->fastch; i++)
+ {
+# ifdef FASTCOPY
+ st->kugeln[i].r1=-((double) i)/2 -1;
+ st->kugeln[i].x1=sum1ton(i);
+ st->kugeln[i].y1=((double) i)/2 +1;
+
+ fill_kugel(st,i,st->fastcircles,1);
+ setink((1<<MIN(24,st->xgwa.depth))-1);
+ fill_kugel(st,i,st->fastmask,0);
+# else
+ st->kugeln[i].r1=-((double) i)/2 -1;
+ st->kugeln[i].x1=st->kugeln[i].y1=((double) i)/2 +1;
+
+ fill_kugel(i,st->buffer,1);
+ st->fastcircles[i]=XGetImage(st->dpy,st->buffer,0,0,i+2,i+2,(1<<st->planes)-1,ZPixmap);
+
+ setink((1<<MIN(24,st->xgwa.depth))-1);
+ fill_kugel(i,st->buffer,0);
+ st->fastmask[i]=XGetImage(st->dpy,st->buffer,0,0,i+2,i+2,(1<<st->planes)-1,ZPixmap);
+
+ setink(0);
+ XFillRectangle (st->dpy, st->buffer , st->gc, 0, 0, st->scrnWidth, st->scrnHeight);
+# endif
+ }
+ st->fastdraw=1;
+#endif
+}
+
+/* Zeiger zeichnen */
+
+static void
+zeiger(struct state *st, double dist,double rad, double z, double sec, int *q)
+{
+ int i,n;
+ double gratio=sqrt(2.0/(1.0+sqrt(5.0)));
+
+ n = *q;
+
+ for(i=0;i<3;i++)
+ {
+ st->kugeln[n].x=dist*cos(sec);
+ st->kugeln[n].y=-dist*sin(sec);
+ st->kugeln[n].z=z;
+ st->kugeln[n].r=rad;
+ n++;
+
+ dist += rad;
+ rad = rad*gratio;
+ }
+ *q = n;
+}
+
+/*-----------------------------------------------------------------*
+ * Uhr zeichnen *
+ *-----------------------------------------------------------------*/
+
+static void
+manipulate(struct state *st, double k)
+{
+ double i,l,/*xs,*/ys,zs,mod;
+ double /*persec,*/sec,min,hour;
+ int n;
+
+ sec=TWOPI*modf(k/60,&mod);
+ min=TWOPI*modf(k/3600,&mod);
+ hour=TWOPI*modf(k/43200,&mod);
+
+ l=TWOPI*modf(k/300,&mod);
+ i=0.0;
+ for (n=0;n<kmax;n++)
+ {
+
+ st->kugeln[n].x=4.0*sin(i);
+ st->kugeln[n].y=4.0*cos(i);
+ st->kugeln[n].z=st->wobber* /* (sin(floor(2+2*l/(PI))*i)*sin(2*l)); */
+ cos((i-sec)*floor(2+5*l/(PI)))*sin(5*l);
+ if(st->minutes)
+ {
+ st->kugeln[n].r=/* (1.0+0.3*cos(floor(2+2*l/(PI))*i)*sin(2*l))* */
+ ((n % 5!=0) ? 0.3 : 0.6)*
+ ((n % 15 ==0) ? 1.25 : .75);
+ }
+ else
+ {
+ st->kugeln[n].r=/* (1.0+0.3*cos(floor(2+2*l/(PI))*i)*sin(2*l))* */
+ ((n & 1) ? 0.5 : 1.0)*
+ ((n % 6==0) ? 1.25 : .75);
+ }
+ i+=TWOPI/kmax;
+ }
+
+ st->kugeln[n].x=0.0;
+ st->kugeln[n].y=0.0;
+ st->kugeln[n].z=0.0;
+ st->kugeln[n].r=2.0+cos(TWOPI*modf(k,&mod))/2;
+ n++;
+
+ zeiger(st,2.0,0.75,-2.0,sec,&n);
+ zeiger(st,1.0,1.0,-1.5,min,&n);
+ zeiger(st,0.0,1.5,-1.0,hour,&n);
+
+ for(n=0;n<st->maxk;n++)
+ {
+ ys=st->kugeln[n].y*cos(st->movef*sin(st->cycle*sec))+
+ st->kugeln[n].z*sin(st->movef*sin(st->cycle*sec));
+ zs=-st->kugeln[n].y*sin(st->movef*sin(st->cycle*sec))+
+ st->kugeln[n].z*cos(st->movef*sin(st->cycle*sec));
+ st->kugeln[n].y=ys;
+ st->kugeln[n].z=zs;
+ }
+}
+/*------------------------------------------------------------------*/
+static void
+t3d_sort(struct state *st, int l, int r)
+{
+ int i,j;
+ kugeldat ex;
+ double x;
+
+ i=l;j=r;
+ x=st->kugeln[(l+r)/2].d;
+ while(1)
+ {
+ while(st->kugeln[i].d>x) i++;
+ while(x>st->kugeln[j].d) j--;
+ if (i<=j)
+ {
+ ex=st->kugeln[i];st->kugeln[i]=st->kugeln[j];st->kugeln[j]=ex;
+ i++;j--;
+ }
+ if (i>j) break;
+ }
+ if (l<j) t3d_sort(st,l,j);
+ if (i<r) t3d_sort(st,i,r);
+}
+
+/*------------------------------------------------------------------*/
+static void
+fill_kugel(struct state *st, int i, Pixmap buf, int setcol)
+{
+ double ra;
+ int m,col,inr=3,d;
+#ifdef USE_POLYGON
+ int inc=1;
+#endif
+ d=(int)((ABS(st->kugeln[i].r1)*2));
+ if (d==0) d=1;
+
+#ifdef FASTDRAW
+ if(st->fastdraw && d<st->fastch)
+ {
+# ifdef FASTCOPY
+ XCopyArea(st->dpy, st->fastmask, buf, st->andgc, sum1ton(d)-(d+1)/2, 1,d,d,
+ (int)(st->kugeln[i].x1)-d/2, (int)(st->kugeln[i].y1)-d/2);
+ XCopyArea(st->dpy, st->fastcircles, buf, st->orgc, sum1ton(d)-(d+1)/2, 1,d,d,
+ (int)(st->kugeln[i].x1)-d/2, (int)(st->kugeln[i].y1)-d/2);
+# else
+ XPutImage(st->dpy, buf, st->andgc, st->fastmask[d-1], 0, 0,
+ (int)(st->kugeln[i].x1)-d/2, (int)(st->kugeln[i].y1)-d/2, d, d);
+ XPutImage(st->dpy, buf, st->orgc, st->fastcircles[d-1], 0, 0,
+ (int)(st->kugeln[i].x1)-d/2, (int)(st->kugeln[i].y1)-d/2, d, d);
+# endif
+ }
+ else
+#endif
+ {
+ if(ABS(st->kugeln[i].r1)<6.0) inr=9;
+
+ for (m=0;m<=28;m+=inr)
+ {
+ ra=st->kugeln[i].r1*sqrt(1-m*m/(28.0*28.0));
+#ifdef PRTDBX
+ printf("Radius: %f\n",ra);
+#endif
+#ifdef USE_POLYGON
+ if(-ra< 3.0) inc=14;
+ else if(-ra< 6.0) inc=8;
+ else if(-ra<20.0) inc=4;
+ else if(-ra<40.0) inc=2;
+#endif
+ if(setcol)
+ {
+ if (m==27)
+ col=33;
+ else
+ col=(int)(m);
+
+ if (col>33)
+ col=33;
+
+ col/=3;
+ setink(st->colors[col].pixel);
+ }
+
+#ifdef USE_POLYGON
+ {
+ int n, nr;
+ for (n=0,nr=0;n<=sines-1;n+=inc,nr++)
+ {
+ track[nr].x=st->kugeln[i].x1+(int)(ra*st->sinus[n])+(st->kugeln[i].r1-ra)/2;
+ track[nr].y=st->kugeln[i].y1+(int)(ra*st->cosinus[n])+(st->kugeln[i].r1-ra)/2;
+ }
+ XFillPolygon(st->dpy,buf,st->gc,track,nr,Convex,CoordModeOrigin);
+ }
+#else /* Use XFillArc */
+ XFillArc(st->dpy, buf, st->gc,
+ (int)(st->kugeln[i].x1+(st->kugeln[i].r1+ra)/2),
+ (int)(st->kugeln[i].y1+(st->kugeln[i].r1+ra)/2),
+ (int)-(2*ra+1), (int)-(2*ra+1), 0, 360*64);
+#endif
+ }
+ }
+}
+
+/*------------------------------------------------------------------*/
+
+static void
+init_3d(struct state *st)
+{
+ double i;
+ int n=0;
+
+ st->a[0]=0.0;
+ st->a[1]=0.0;
+ st->a[2]=-10.0;
+
+ st->x[0]=10.0;
+ st->x[1]=0.0;
+ st->x[2]=0.0;
+
+ st->y[0]=0.0;
+ st->y[1]=10.0;
+ st->y[2]=0.0;
+
+
+ st->zoom=-10.0;
+ st->speed=.0;
+
+ for (i=0.0;n<sines;i+=TWOPI/sines,n++)
+ {
+ st->sinus[n]=sin(i);
+ st->cosinus[n]=cos(i);
+ }
+}
+/*------------------------------------------------------------------*/
+
+
+static void
+vektorprodukt(double feld1[], double feld2[], double feld3[])
+{
+ feld3[0]=feld1[1]*feld2[2]-feld1[2]*feld2[1];
+ feld3[1]=feld1[2]*feld2[0]-feld1[0]*feld2[2];
+ feld3[2]=feld1[0]*feld2[1]-feld1[1]*feld2[0];
+}
+
+
+/*------------------------------------------------------------------*/
+static void
+turn(double feld1[], double feld2[], double winkel)
+{
+ double temp[3];
+ double s,ca,sa,sx1,sx2,sx3;
+
+ vektorprodukt(feld1,feld2,temp);
+
+ s=feld1[0]*feld2[0]+feld1[1]*feld2[1]+feld1[2]*feld2[2];
+
+ sx1=s*feld2[0];
+ sx2=s*feld2[1];
+ sx3=s*feld2[2];
+ sa=sin(winkel);ca=cos(winkel);
+ feld1[0]=ca*(feld1[0]-sx1)+sa*temp[0]+sx1;
+ feld1[1]=ca*(feld1[1]-sx2)+sa*temp[1]+sx2;
+ feld1[2]=ca*(feld1[2]-sx3)+sa*temp[2]+sx3;
+}
+/*------------------------------------------------------------------*/
+
+/* 1: Blickrichtung v;3:Ebenenmittelpunkt m
+ double feld1[],feld3[]; */
+static void
+viewpoint(struct state *st)
+{
+ st->am[0]=-st->zoom*st->v[0];
+ st->am[1]=-st->zoom*st->v[1];
+ st->am[2]=-st->zoom*st->v[2];
+
+ st->zaehler=norm*norm*st->zoom;
+}
+
+/*------------------------------------------------------------------*/
+static void
+projektion(struct state *st)
+{
+ double c1[3],c2[3],k[3],x1,y1;
+ double cno,cnorm/*,magnit*/;
+ int i;
+
+ for (i=0;i<st->maxk;i++)
+ {
+ c1[0]=st->kugeln[i].x-st->a[0];
+ c1[1]=st->kugeln[i].y-st->a[1];
+ c1[2]=st->kugeln[i].z-st->a[2];
+ cnorm=sqrt(c1[0]*c1[0]+c1[1]*c1[1]+c1[2]*c1[2]);
+
+ c2[0]=c1[0];
+ c2[1]=c1[1];
+ c2[2]=c1[2];
+
+ cno=c2[0]*st->v[0]+c2[1]*st->v[1]+c2[2]*st->v[2];
+ st->kugeln[i].d=cnorm;
+ if (cno<0) st->kugeln[i].d=-20.0;
+
+
+ st->kugeln[i].r1=(st->mag*st->zoom*st->kugeln[i].r/cnorm);
+
+ c2[0]=st->v[0]/cno;
+ c2[1]=st->v[1]/cno;
+ c2[2]=st->v[2]/cno;
+
+ vektorprodukt(c2,c1,k);
+
+
+ x1=(st->startx+(st->x[0]*k[0]+st->x[1]*k[1]+st->x[2]*k[2])*st->mag);
+ y1=(st->starty-(st->y[0]*k[0]+st->y[1]*k[1]+st->y[2]*k[2])*st->mag);
+ if( (x1>-2000.0)
+ && (x1<st->scrnWidth+2000.0)
+ && (y1>-2000.0)
+ && (y1<st->scrnHeight+2000.0))
+ {
+ st->kugeln[i].x1=(int)x1;
+ st->kugeln[i].y1=(int)y1;
+ }
+ else
+ {
+ st->kugeln[i].x1=0;
+ st->kugeln[i].y1=0;
+ st->kugeln[i].d=-20.0;
+ }
+ }
+}
+
+
+static void *
+t3d_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ st->dpy = dpy;
+ st->window = window;
+ initialize(st);
+
+ initColor(st,st->r,st->g,st->b);
+ init_3d(st);
+ st->zeit=(struct tm *)malloc(sizeof(struct tm));
+ init_kugel(st);
+
+ st->startx=st->scrnWidth/2;
+ st->starty=st->scrnHeight/2;
+ st->scrnH2=st->startx;
+ st->scrnW2=st->starty;
+ st->vspeed=0;
+
+
+ vektorprodukt(st->x,st->y,st->v);
+ viewpoint(st/*m,v*/);
+
+ setink (BlackPixelOfScreen(st->xgwa.screen));
+ XFillRectangle (st->dpy, st->window, st->gc, 0, 0, st->scrnWidth, st->scrnHeight);
+ XQueryPointer (st->dpy, st->window, &st->junk_win, &st->junk_win, &st->junk, &st->junk,
+ &st->px, &st->py, &st->kb);
+
+ return st;
+}
+
+static unsigned long
+t3d_draw (Display *d, Window w, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ double dtime;
+ double vnorm;
+
+
+ /*--------------- Zeichenteil --------------*/
+
+ vektorprodukt(st->x,st->y,st->v);
+
+ vnorm=sqrt(st->v[0]*st->v[0]+st->v[1]*st->v[1]+st->v[2]*st->v[2]);
+ st->v[0]=st->v[0]*norm/vnorm;
+ st->v[1]=st->v[1]*norm/vnorm;
+ st->v[2]=st->v[2]*norm/vnorm;
+ vnorm=sqrt(st->x[0]*st->x[0]+st->x[1]*st->x[1]+st->x[2]*st->x[2]);
+ st->x[0]=st->x[0]*norm/vnorm;
+ st->x[1]=st->x[1]*norm/vnorm;
+ st->x[2]=st->x[2]*norm/vnorm;
+ vnorm=sqrt(st->y[0]*st->y[0]+st->y[1]*st->y[1]+st->y[2]*st->y[2]);
+ st->y[0]=st->y[0]*norm/vnorm;
+ st->y[1]=st->y[1]*norm/vnorm;
+ st->y[2]=st->y[2]*norm/vnorm;
+
+ projektion(st);
+ t3d_sort (st,0,st->maxk-1);
+
+ dtime=gettime(st);
+
+ if(st->cycl)
+ {
+ st->draw_color=(int)(64.0*(dtime/60-floor(dtime/60)))-32;
+
+ if(st->draw_color<0)
+ st->draw_color=-st->draw_color;
+
+ setink(st->colors[st->draw_color/3].pixel);
+ }
+ else
+ setink(BlackPixelOfScreen (st->xgwa.screen));
+
+ XFillRectangle(st->dpy,st->buffer,st->gc,0,0,st->scrnWidth,st->scrnHeight);
+
+ {
+ int i;
+
+ manipulate(st,dtime);
+
+ for (i=0;i<st->maxk;i++)
+ {
+ if (st->kugeln[i].d>0.0)
+ fill_kugel(st,i,st->buffer,1);
+ }
+ }
+
+ /* manipulate(gettime());
+ var+=PI/500;
+ if (var>=TWOPI) var=PI/500; */
+
+ if(st->hsvcycl!=0.0)
+ {
+ dtime=st->hsvcycl*dtime/10.0+st->hue/360.0;
+ dtime=360*(dtime-floor(dtime));
+
+ hsv2rgb(dtime,st->sat,st->val,&st->r,&st->g,&st->b);
+ changeColor(st,st->r,st->g,st->b);
+ }
+
+ XCopyArea (st->dpy, st->buffer, st->window, st->gc, 0, 0, st->scrnWidth, st->scrnHeight, 0, 0);
+
+
+ /*-------------------------------------------------*/
+
+ XQueryPointer (st->dpy, st->window, &st->junk_win, &st->in_win, &st->junk, &st->junk,
+ &st->px, &st->py, &st->kb);
+
+ if ((st->px>0)&&(st->px<st->scrnWidth)&&(st->py>0)&&(st->py<st->scrnHeight) )
+ {
+ if ((st->px !=st->startx)&&(st->kb&Button2Mask))
+ {
+ /* printf("y=(%f,%f,%f)",y[0],y[1],y[2]);*/
+ turn(st->y,st->x,((double)(st->px-st->startx))/(8000*st->mag));
+ /* printf("->(%f,%f,%f)\n",y[0],y[1],y[2]);*/
+ }
+ if ((st->py !=st->starty)&&(st->kb&Button2Mask))
+ {
+ /* printf("x=(%f,%f,%f)",x[0],x[1],x[2]);*/
+ turn(st->x,st->y,((double)(st->py-st->starty))/(-8000*st->mag));
+ /* printf("->(%f,%f,%f)\n",x[0],x[1],x[2]);*/
+ }
+ if ((st->kb&Button1Mask))
+ {
+ if (st->vturn==0.0) st->vturn=.005; else if (st->vturn<2) st->vturn+=.01;
+ turn(st->x,st->v,.002*st->vturn);
+ turn(st->y,st->v,.002*st->vturn);
+ }
+ if ((st->kb&Button3Mask))
+ {
+ if (st->vturn==0.0) st->vturn=.005; else if (st->vturn<2) st->vturn+=.01;
+ turn(st->x,st->v,-.002*st->vturn);
+ turn(st->y,st->v,-.002*st->vturn);
+ }
+ }
+ if (!(st->kb&Button1Mask)&&!(st->kb&Button3Mask))
+ st->vturn=0;
+
+ st->speed=st->speed+st->speed*st->vspeed;
+ if ((st->speed<0.0000001) &&(st->vspeed>0.000001)) st->speed=0.000001;
+ st->vspeed=.1*st->vspeed;
+ if (st->speed>0.01) st->speed=.01;
+ st->a[0]=st->a[0]+st->speed*st->v[0];
+ st->a[1]=st->a[1]+st->speed*st->v[1];
+ st->a[2]=st->a[2]+st->speed*st->v[2];
+
+ return st->timewait;
+}
+
+static void
+t3d_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (w != st->scrnWidth ||
+ h != st->scrnHeight)
+ {
+ XFreePixmap (st->dpy, st->buffer);
+ st->scrnWidth = w;
+ st->scrnHeight = h;
+ st->buffer = XCreatePixmap (st->dpy, st->window, st->scrnWidth, st->scrnHeight, st->xgwa.depth);
+
+ st->startx=st->scrnWidth/2;
+ st->starty=st->scrnHeight/2;
+ st->scrnH2=st->startx;
+ st->scrnW2=st->starty;
+ }
+}
+
+static Bool
+t3d_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->type == KeyPress)
+ {
+ KeySym keysym;
+ char kpr = 0;
+ XLookupString (&event->xkey, &kpr, 1, &keysym, 0);
+ switch (kpr)
+ {
+ case 's': case 'S':
+ st->vspeed = 0.5;
+ return True;
+ case 'a': case 'A':
+ st->vspeed = -0.3;
+ return True;
+ case '0':
+ st->speed = 0;
+ st->vspeed = 0;
+ return True;
+ case 'z': case 'Z':
+ st->mag *= 1.02;
+ return True;
+ case 'x': case 'X':
+ st->mag /= 1.02;
+ return True;
+ default:
+ break;
+ }
+ }
+ return False;
+}
+
+static void
+t3d_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+
+
+/*-------------------------------------------------*/
+
+static const char *t3d_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*move: 0.5",
+ "*wobble: 2.0",
+ "*cycle: 10.0",
+ "*mag: 1.0",
+ "*minutes: False",
+ "*delay: 40000",
+ "*fast: 50",
+ "*colcycle: False",
+ "*hsvcycle: 0.0",
+ "*rgb: ",
+ "*hsv: ",
+ 0
+};
+
+static XrmOptionDescRec t3d_options [] = {
+ { "-move", ".move", XrmoptionSepArg, 0 },
+ { "-wobble", ".wobble", XrmoptionSepArg, 0 },
+ { "-cycle", ".cycle", XrmoptionSepArg, 0 },
+ { "-mag", ".mag", XrmoptionSepArg, 0 },
+ { "-minutes", ".minutes", XrmoptionNoArg, "True" },
+ { "-no-minutes", ".minutes", XrmoptionNoArg, "False" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-fast", ".fast", XrmoptionSepArg, 0 },
+ { "-colcycle", ".colcycle", XrmoptionSepArg, 0 },
+ { "-hsvcycle", ".hsvcycle", XrmoptionSepArg, 0 },
+ { "-rgb", ".rgb", XrmoptionSepArg, 0 },
+ { "-hsv", ".hsv", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("T3D", t3d)
diff --git a/hacks/t3d.man b/hacks/t3d.man
new file mode 100644
index 0000000..0db943b
--- /dev/null
+++ b/hacks/t3d.man
@@ -0,0 +1,131 @@
+.TH t3d 1 "Version 1.1" "Time 3D"
+.SH NAME
+t3d \- clock using flying balls to display the time
+.SH SYNOPSIS
+t3d [ \f2 options\f1 ]...
+.SH DESCRIPTION
+.PP
+Time 3D is a clock. It uses flying balls to display the time. This
+balls move and wobble around to give you the impression your
+graphic workstation with its many XStones is doing something.
+.PP
+t3d uses mouse and keyboard to let you fly through the balls. Hit
+.B S
+to speed up,
+.B A
+to slow down,
+.B Z
+to zoom in and
+.B X
+to zoom out.
+Use the
+.B left mouse button
+to rotate to the left and the
+.B right mouse button
+to rotate the view to the right. Use the
+.B middle mouse button
+to change the optical axis and the moving direction.
+.B 0
+(zero) will stop you.
+.B Q
+quits.
+.PP
+.SH OPTIONS
+.TP
+.BI "-move " "factor"
+Modifies the direction move of t3d. The clock looks 30 degrees*
+.I factor
+to the left and to the right periodically.
+.TP
+.BI "-wobble " "factor"
+Modifies the wobbling (sounds nice :-) of t3d by multiplying the
+default deformation of the clock with
+.I factor.
+.TP
+.B -minutes
+Shows one small ball for every minute, instead of one for every 2.5 minutes.
+.TP
+.BI "-mag " "factor"
+Changes the magnification of t3d. By default, t3d draws a 200x200 image.
+A .I factor
+of 2 means, it will use a 400x400 image.
+.TP
+.BI "-cycle " "period"
+Sets the moving cycle to
+.I period
+seconds. By default, this value is 10 seconds.
+.TP
+.BI "-delay " "microsec"
+Inserts a wait after drawing one view of the clock. By default, t3d waits
+40 ms after each drawing. This helps you to keep the performance loss
+small.
+.TP
+.BI "-fast " "precalc_radius"
+t3d uses bitmap copy to draw precalculated balls. You can specify the radius
+in pixels up to which t3d should precalculate balls. t3d will set a useful
+range by itself using the magnification when it is started.
+.TP
+.B -colcycle
+Draws cyclic the color scale used for the balls in the background instead
+of the normal black.
+.TP
+.BI "-rgb " "red green blue"
+Selects the color in RGB color space of the lightning spot on the balls.
+All the other colors used for balls or
+.B -colcycle
+are less intensive colors of the same hue and saturation. All values
+in range of 0 to 1.
+.TP
+.BI "-hsv " "hue saturation value"
+Selects the color in HSV color space.
+.I hue
+is in degrees from 0 to 360, all other values in range from 0 to 1. It gives
+nice but rather unpredictable results, if you use a saturation of e.g. 2.
+Try it at your own risk.
+.TP
+.BI "-hsvcycle " "speed"
+Rotates the hue axis every 10 seconds*
+.I speed.
+.TP
+.B -help
+Prints a short usage message.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.PP
+.SH AUTHOR
+.PP
+Bernd Paysan
+
+Email: bernd.paysan@gmx.de
+
+Hacked on by jwz@jwz.org for xscreensaver.
+
+.SH ACKNOWLEDGEMENT
+.PP
+Acknowledgement to Georg Acher, who wrote the initial program displaying
+balls.
+
+.SH COPYING
+.PP
+Copy, modify, and distribute T3D either under GPL version 2 or newer, or
+under the standard MIT/X license notice.
+
+.SH DISCLAIMER
+.PP
+T3D is not related to T3D(tm), the massive parallel Alpha--based
+supercomputer from Cray Research. T3D's name was invented in 1991,
+years before the project at Cray Research started. There is no
+relation from T3D to Cray's T3D, even the balls surrounding T3D on
+some posters weren't an inspiration for T3D. I don't know anything
+about the other way round.
+
+The programming style of T3D isn't intended as example of good style,
+but as example of how a fast prototyped demo may look like. T3D wasn't
+created to be useful, it was created to be nice.
+
+.SH KNOWN BUGS
+.PP
+There are no known bugs in T3D. Maybe there are bugs in X. Slight
+changes in the T3D sources are known to show these bugs, e.g. if
+you remove the (int) casting at the XFillArc x,y,w,h-coordinates...
diff --git a/hacks/tessellimage.c b/hacks/tessellimage.c
new file mode 100644
index 0000000..b9a8bd9
--- /dev/null
+++ b/hacks/tessellimage.c
@@ -0,0 +1,1013 @@
+/* tessellimage, Copyright (c) 2014-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "delaunay.h"
+
+#ifndef HAVE_JWXYZ
+# define XK_MISCELLANY
+# include <X11/keysymdef.h>
+#endif
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ GC wgc, pgc;
+ int delay;
+ Bool outline_p, cache_p, fill_p;
+ double duration, duration2;
+ int max_depth, max_resolution;
+ double start_time, start_time2;
+
+ XImage *img, *delta;
+ Pixmap image, output, deltap;
+ int nthreshes, threshes[256], vsizes[256];
+ int thresh, dthresh;
+ Pixmap cache[256];
+
+ async_load_state *img_loader;
+ XRectangle geom;
+ Bool button_down_p;
+ enum { DELAUNAY, VORONOI } mode;
+};
+
+typedef struct {
+ int npoints;
+ XPoint ctr;
+ XPoint *p;
+} voronoi_polygon;
+
+typedef struct {
+ XPoint p;
+ double slope;
+} voronoi_pa;
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static void *
+tessellimage_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+
+ st->dpy = dpy;
+ st->window = window;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 1) st->delay = 1;
+
+ st->outline_p = get_boolean_resource (st->dpy, "outline", "Boolean");
+ st->cache_p = get_boolean_resource (st->dpy, "cache", "Boolean");
+ st->fill_p = get_boolean_resource (st->dpy, "fillScreen", "Boolean");
+
+ st->max_depth = get_integer_resource (st->dpy, "maxDepth", "MaxDepth");
+ if (st->max_depth < 100) st->max_depth = 100;
+
+ st->max_resolution = get_integer_resource (st->dpy,
+ "maxResolution", "MaxResolution");
+ if (st->max_resolution < 0) st->max_resolution = 0;
+
+ st->duration = get_float_resource (st->dpy, "duration", "Seconds");
+ if (st->duration < 1) st->duration = 1;
+
+ st->duration2 = get_float_resource (st->dpy, "duration2", "Seconds");
+ if (st->duration2 < 0.001) st->duration = 0.001;
+
+ XClearWindow(st->dpy, st->window);
+
+ return st;
+}
+
+
+/* Given a bitmask, returns the position and width of the field.
+ */
+static void
+decode_mask (unsigned int mask, unsigned int *pos_ret, unsigned int *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+static unsigned long
+pixel_distance (Screen *s, Visual *v, unsigned long p1, unsigned long p2)
+{
+ static int initted_p = 0;
+ static unsigned long rmsk=0, gmsk=0, bmsk=0;
+ static unsigned int rpos=0, gpos=0, bpos=0;
+ static unsigned int rsiz=0, gsiz=0, bsiz=0;
+
+ unsigned char r1, g1, b1;
+ unsigned char r2, g2, b2;
+ long distance;
+
+ if (!p1 && !p2) return 0;
+
+ if (! initted_p) {
+ visual_rgb_masks (s, v, &rmsk, &gmsk, &bmsk);
+ decode_mask (rmsk, &rpos, &rsiz);
+ decode_mask (gmsk, &gpos, &gsiz);
+ decode_mask (bmsk, &bpos, &bsiz);
+ initted_p = 1;
+ }
+
+ r1 = (p1 & rmsk) >> rpos;
+ g1 = (p1 & gmsk) >> gpos;
+ b1 = (p1 & bmsk) >> bpos;
+
+ r2 = (p2 & rmsk) >> rpos;
+ g2 = (p2 & gmsk) >> gpos;
+ b2 = (p2 & bmsk) >> bpos;
+
+#if 0
+ /* Compute the distance in linear RGB space.
+ */
+ distance = cbrt (((r2 - r1) * (r2 - r1)) +
+ ((g2 - g1) * (g2 - g1)) +
+ ((b2 - b1) * (b2 - b1)));
+
+# elif 1
+ /* Compute the distance in luminance-weighted RGB space.
+ */
+ {
+ int rd = (r2 - r1) * 0.2989 * (1 / 0.5870);
+ int gd = (g2 - g1) * 0.5870 * (1 / 0.5870);
+ int bd = (b2 - b1) * 0.1140 * (1 / 0.5870);
+ distance = cbrt ((rd * rd) + (gd * gd) + (bd * bd));
+ }
+# else
+ /* Compute the distance in brightness-weighted HSV space.
+ (Slower, and doesn't seem to look better than luminance RGB.)
+ */
+ {
+ int h1, h2;
+ double s1, s2;
+ double v1, v2;
+ double hd, sd, vd, dd;
+ rgb_to_hsv (r1, g1, b1, &h1, &s1, &v1);
+ rgb_to_hsv (r2, g2, b2, &h2, &s2, &v2);
+
+ hd = abs (h2 - h1);
+ if (hd >= 180) hd -= 180;
+ hd /= 180.0;
+ sd = fabs (s2 - s1);
+ vd = fabs (v2 - v1);
+
+ /* [hsv]d are now the distance as 0.0 - 1.0. */
+ /* Compute the overall distance, giving more weight to V. */
+ dd = (hd * 0.25 + sd * 0.25 + vd * 0.5);
+
+ if (dd < 0 || dd > 1.0) abort();
+ distance = dd * 255;
+ }
+# endif
+
+ if (distance < 0) distance = -distance;
+ return distance;
+}
+
+
+static void
+flush_cache (struct state *st)
+{
+ int i;
+ for (i = 0; i < countof(st->cache); i++)
+ if (st->cache[i])
+ {
+ XFreePixmap (st->dpy, st->cache[i]);
+ st->cache[i] = 0;
+ }
+ if (st->deltap)
+ {
+ XFreePixmap (st->dpy, st->deltap);
+ st->deltap = 0;
+ }
+}
+
+
+/* Scale up the bits in st->img so that it fills the screen, centered.
+ */
+static void
+scale_image (struct state *st)
+{
+ double scale, s1, s2;
+ XImage *img2;
+ int x, y, cx, cy;
+
+ if (st->geom.width <= 0 || st->geom.height <= 0)
+ return;
+
+ s1 = st->geom.width / (double) st->img->width;
+ s2 = st->geom.height / (double) st->img->height;
+ scale = (s1 < s2 ? s1 : s2);
+
+ img2 = XCreateImage (st->dpy, st->xgwa.visual, st->img->depth,
+ ZPixmap, 0, NULL,
+ st->img->width, st->img->height, 8, 0);
+ if (! img2) abort();
+ img2->data = (char *) calloc (img2->height, img2->bytes_per_line);
+ if (! img2->data) abort();
+
+ cx = st->img->width / 2;
+ cy = st->img->height / 2;
+
+ if (st->geom.width < st->geom.height) /* portrait: aim toward the top */
+ cy = st->img->height / (2 / scale);
+
+ for (y = 0; y < img2->height; y++)
+ for (x = 0; x < img2->width; x++)
+ {
+ int x2 = cx + ((x - cx) * scale);
+ int y2 = cy + ((y - cy) * scale);
+ unsigned long p = 0;
+ if (x2 >= 0 && y2 >= 0 &&
+ x2 < st->img->width && y2 < st->img->height)
+ p = XGetPixel (st->img, x2, y2);
+ XPutPixel (img2, x, y, p);
+ }
+ free (st->img->data);
+ st->img->data = 0;
+ XDestroyImage (st->img);
+ st->img = img2;
+
+ st->geom.x = 0;
+ st->geom.y = 0;
+ st->geom.width = st->img->width;
+ st->geom.height = st->img->height;
+}
+
+
+
+static void
+analyze (struct state *st)
+{
+ Window root;
+ int x, y, i;
+ unsigned int w, h, bw, d;
+ unsigned long histo[256];
+
+ {
+ char *s = get_string_resource (st->dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp(s, "random"))
+ st->mode = (random() & 1) ? DELAUNAY : VORONOI;
+ else if (!strcasecmp(s, "delaunay"))
+ st->mode = DELAUNAY;
+ else if (!strcasecmp(s, "voronoi"))
+ st->mode = VORONOI;
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be delaunay, voronoi or random, not \"%s\"\n",
+ progname, s);
+ exit (1);
+ }
+ }
+
+ flush_cache (st);
+
+ /* Convert the loaded pixmap to an XImage.
+ */
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ XGetGeometry (st->dpy, st->image, &root, &x, &y, &w, &h, &bw, &d);
+
+ if (st->img)
+ {
+ free (st->img->data);
+ st->img->data = 0;
+ XDestroyImage (st->img);
+ }
+ st->img = XGetImage (st->dpy, st->image, 0, 0, w, h, ~0L, ZPixmap);
+
+ if (st->fill_p) scale_image (st);
+
+ /* Create the delta map: color space distance between each pixel.
+ Maybe doing running a Sobel Filter matrix on this would be a
+ better idea. That might be a bit faster, but I think it would
+ make no visual difference.
+ */
+ if (st->delta)
+ {
+ free (st->delta->data);
+ st->delta->data = 0;
+ XDestroyImage (st->delta);
+ }
+ st->delta = XCreateImage (st->dpy, st->xgwa.visual, d, ZPixmap, 0, NULL,
+ w, h, 32, 0);
+ st->delta->data = (char *)
+ calloc (st->delta->height, st->delta->bytes_per_line);
+
+ for (y = 0; y < st->delta->height; y++)
+ {
+ for (x = 0; x < st->delta->width; x++)
+ {
+ unsigned long pixels[5];
+ int i = 0;
+ int distance = 0;
+ pixels[i++] = XGetPixel (st->img, x, y);
+ pixels[i++] = (x > 0 && y > 0 ? XGetPixel (st->img, x-1, y-1) : 0);
+ pixels[i++] = ( y > 0 ? XGetPixel (st->img, x, y-1) : 0);
+ pixels[i++] = (x > 0 ? XGetPixel (st->img, x-1, y) : 0);
+ pixels[i++] = (x > 0 && y < h-1 ? XGetPixel (st->img, x-1, y+1) : 0);
+
+ for (i = 1; i < countof(pixels); i++)
+ distance += pixel_distance (st->xgwa.screen, st->xgwa.visual,
+ pixels[0], pixels[i]);
+ distance /= countof(pixels)-1;
+ XPutPixel (st->delta, x, y, distance);
+ }
+ }
+
+ /* Collect a histogram of every distance value.
+ */
+ memset (histo, 0, sizeof(histo));
+ for (y = 0; y < st->delta->height; y++)
+ for (x = 0; x < st->delta->width; x++)
+ {
+ unsigned long p = XGetPixel (st->delta, x, y);
+ if (p > sizeof(histo)) abort();
+ histo[p]++;
+ }
+
+ /* Convert that from "occurrences of N" to ">= N".
+ */
+ for (i = countof(histo) - 1; i > 0; i--)
+ histo[i-1] += histo[i];
+
+# if 0
+ fprintf (stderr, "%s: histo: ", progname);
+ for (i = 0; i < countof(histo); i++)
+ fprintf(stderr, "%d:%lu ", i, histo[i]);
+ fprintf(stderr, "\n");
+# endif
+
+ /* Collect a useful set of threshold values, ignoring thresholds that
+ result in a very similar number of control points (since those images
+ probably won't look very different).
+ */
+
+ {
+ int max_vsize = st->max_depth;
+ int min_vsize = 20;
+ int min_delta = 100;
+
+ if (min_vsize > max_vsize/100)
+ min_vsize = max_vsize/100;
+
+ if (min_delta > max_vsize/1000)
+ min_delta = max_vsize/1000;
+
+ st->nthreshes = 0;
+ for (i = countof(histo)-1; i >= 0; i--)
+ {
+ unsigned long vsize = histo[i];
+
+ /* If this is a different vsize, push it. */
+ if (vsize >= min_vsize &&
+ vsize <= max_vsize &&
+ (st->nthreshes == 0 ||
+ vsize >= st->vsizes[st->nthreshes-1] + min_delta))
+ {
+ st->threshes[st->nthreshes] = i;
+ st->vsizes[st->nthreshes] = vsize;
+ st->nthreshes++;
+ }
+ }
+ }
+
+ st->thresh = 0; /* startup */
+ st->dthresh = 1; /* forward */
+
+ if (st->output)
+ {
+ XFreePixmap (st->dpy, st->output);
+ st->output = 0;
+ }
+
+
+# if 0
+ fprintf (stderr, "%s: threshes:", progname);
+ for (i = 0; i < st->nthreshes; i++)
+ fprintf (stderr, " %d=%d", st->threshes[i], st->vsizes[i]);
+ fprintf (stderr, "\n");
+# endif
+}
+
+
+/* True if the distance between any two corners is too small for it to
+ make sense to draw an outline around this triangle.
+ */
+static Bool
+small_triangle_p (const XPoint *p)
+{
+ int min = 4;
+ if (abs (p[0].x - p[1].x) < min) return True;
+ if (abs (p[0].y - p[1].y) < min) return True;
+ if (abs (p[1].x - p[2].x) < min) return True;
+ if (abs (p[1].y - p[2].y) < min) return True;
+ if (abs (p[2].x - p[0].x) < min) return True;
+ if (abs (p[2].y - p[0].y) < min) return True;
+ return False;
+}
+
+static Bool
+small_cell_p (const voronoi_polygon *p)
+{
+ int min = 4;
+ if (abs (p->p[0].x - p->ctr.x) < min) return True;
+ if (abs (p->p[0].y - p->ctr.y) < min) return True;
+ return False;
+}
+
+
+static int
+cmp_ccw (const void *v1, const void *v2)
+{
+ const voronoi_pa *p1,*p2;
+ p1 = v1;
+ p2 = v2;
+ if (p1->slope < p2->slope) return -1;
+ else if (p1->slope > p2->slope) return 1;
+ return 0;
+}
+
+static void
+sort_ccw (XPoint *ctr, XPoint *p, int npoints)
+{
+ voronoi_pa *pa = (void *) malloc (npoints * sizeof(*pa));
+ int i;
+ for (i = 0; i < npoints; i++)
+ {
+ pa[i].p = p[i];
+ pa[i].slope = atan2 (p[i].x - ctr->x, p[i].y - ctr->y);
+ }
+ qsort (pa, npoints, sizeof(*pa), cmp_ccw);
+ for (i = 0; i < npoints; i++)
+ p[i] = pa[i].p;
+ free (pa);
+}
+
+
+static voronoi_polygon *
+delaunay_to_voronoi (int np, XYZ *p, int nv, ITRIANGLE *v, double scale)
+{
+ struct tri_list {
+ int count, size;
+ int *tri;
+ };
+
+ int i, j;
+ struct tri_list *vert_to_tri = (struct tri_list *)
+ calloc (np + 1, sizeof(*vert_to_tri));
+ voronoi_polygon *out = (voronoi_polygon *) calloc (np + 1, sizeof(*out));
+
+ /* Iterate the triangles to construct a map of vertices to the
+ triangles that contain them.
+ */
+ for (i = 0; i < nv; i++)
+ {
+ for (j = 0; j < 3; j++) /* iterate points in each triangle */
+ {
+ int p = *((&v[i].p1) + j);
+ struct tri_list *t = &vert_to_tri[p];
+ if (p < 0 || p >= np) abort();
+ if (t->size <= t->count + 1)
+ {
+ t->size += 3;
+ t->size *= 1.3;
+ t->tri = realloc (t->tri, t->size * sizeof(*t->tri));
+ if (! t->tri) abort();
+ }
+ t->tri[t->count++] = i;
+ }
+ }
+
+ /* For every vertex, compose a polygon whose corners are the centers
+ of each triangle using that vertex. Skip any with less than 3 points.
+
+ This is currently omitting the voronoi cells that should touch the edges
+ of the outer rectangle. Not sure exactly how to include those.
+ */
+ for (i = 0; i < np; i++)
+ {
+ long ctr_x = 0, ctr_y = 0;
+ struct tri_list *t = &vert_to_tri[i];
+ int n = t->count;
+ if (n < 3) n = 0;
+ out[i].npoints = n;
+ if (n == 0) continue;
+ out[i].ctr.x = out[i].ctr.y = 0;
+ out[i].p = (n > 0
+ ? (XPoint *) calloc (out[i].npoints + 1, sizeof (*out[i].p))
+ : 0);
+ for (j = 0; j < out[i].npoints; j++)
+ {
+ ITRIANGLE *tt = &v[t->tri[j]];
+ out[i].p[j].x = scale * (p[tt->p1].x + p[tt->p2].x + p[tt->p3].x) / 3;
+ out[i].p[j].y = scale * (p[tt->p1].y + p[tt->p2].y + p[tt->p3].y) / 3;
+ ctr_x += out[i].p[j].x;
+ ctr_y += out[i].p[j].y;
+ }
+ out[i].ctr.x = ctr_x / out[i].npoints; /* long -> short */
+ out[i].ctr.y = ctr_y / out[i].npoints;
+ if (out[i].ctr.x < 0) abort();
+ if (out[i].ctr.y < 0) abort();
+ sort_ccw (&out[i].ctr, out[i].p, out[i].npoints);
+ }
+
+ for (i = 0; i < np+1; i++)
+ if (vert_to_tri[i].tri)
+ free (vert_to_tri[i].tri);
+ free (vert_to_tri);
+
+ return out;
+}
+
+
+static void
+tessellate (struct state *st)
+{
+ Bool ticked_p = False;
+
+ if (! st->image) return;
+
+ if (! st->wgc)
+ {
+ XGCValues gcv;
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ st->wgc = XCreateGC(st->dpy, st->window, GCFunction, &gcv);
+ st->pgc = XCreateGC(st->dpy, st->image, GCFunction, &gcv);
+ }
+
+ if (! st->nthreshes) return;
+
+
+ /* If duration2 has expired, switch to the next threshold. */
+
+ if (! st->button_down_p)
+ {
+ double t2 = double_time();
+ if (st->start_time2 + st->duration2 < t2)
+ {
+ st->start_time2 = t2;
+ st->thresh += st->dthresh;
+ ticked_p = True;
+ if (st->thresh >= st->nthreshes)
+ {
+ st->thresh = st->nthreshes - 1;
+ st->dthresh = -1;
+ }
+ else if (st->thresh < 0)
+ {
+ st->thresh = 0;
+ st->dthresh = 1;
+ }
+ }
+ }
+
+ if (! st->output)
+ ticked_p = True;
+
+ /* If we've picked a new threshold, regenerate the output image. */
+
+ if (ticked_p && st->cache[st->thresh])
+ {
+ if (st->output)
+ XCopyArea (st->dpy,
+ st->cache[st->thresh],
+ st->output, st->pgc,
+ 0, 0, st->xgwa.width, st->xgwa.height,
+ 0, 0);
+ }
+ else if (ticked_p)
+ {
+ int threshold = st->threshes[st->thresh];
+ int vsize = st->vsizes[st->thresh];
+ ITRIANGLE *v;
+ XYZ *p = 0;
+ int nv = 0;
+ int ntri = 0;
+ int x, y, i;
+ double wscale = st->xgwa.width / (double) st->delta->width;
+
+#if 0
+ fprintf(stderr, "%s: thresh %d/%d = %d=%d\n",
+ progname, st->thresh, st->nthreshes, threshold, vsize);
+#endif
+
+ /* Create a control point at every pixel where the delta is above
+ the current threshold. Triangulate from those. */
+
+ vsize += 8; /* corners of screen + corners of image */
+
+ p = (XYZ *) calloc (vsize+4, sizeof(*p));
+ v = (ITRIANGLE *) calloc (3*(vsize+4), sizeof(*v));
+ if (!p || !v)
+ {
+ fprintf (stderr, "%s: out of memory (%d)\n", progname, vsize);
+ abort();
+ }
+
+ /* Add control points for the corners of the screen, and for the
+ corners of the image.
+ */
+ if (st->geom.width <= 0) st->geom.width = st->delta->width;
+ if (st->geom.height <= 0) st->geom.height = st->delta->height;
+
+ for (y = 0; y <= 1; y++)
+ for (x = 0; x <= 1; x++)
+ {
+ p[nv].x = x ? st->delta->width-1 : 0;
+ p[nv].y = y ? st->delta->height-1 : 0;
+ p[nv].z = XGetPixel (st->delta, (int) p[nv].x, (int) p[nv].y);
+ nv++;
+ p[nv].x = st->geom.x + (x ? st->geom.width-1 : 0);
+ p[nv].y = st->geom.y + (y ? st->geom.height-1 : 0);
+ p[nv].z = XGetPixel (st->delta, (int) p[nv].x, (int) p[nv].y);
+ nv++;
+ }
+
+ /* Add control points for every pixel that exceeds the threshold.
+ */
+ for (y = 0; y < st->delta->height; y++)
+ for (x = 0; x < st->delta->width; x++)
+ {
+ unsigned long px = XGetPixel (st->delta, x, y);
+ if (px >= threshold)
+ {
+ if (nv >= vsize) abort();
+ p[nv].x = x;
+ p[nv].y = y;
+ p[nv].z = px;
+ nv++;
+ }
+ }
+
+ if (nv != vsize) abort();
+
+ qsort (p, nv, sizeof(*p), delaunay_xyzcompare);
+ if (delaunay (nv, p, v, &ntri))
+ {
+ fprintf (stderr, "%s: out of memory\n", progname);
+ abort();
+ }
+
+ /* Create the output pixmap based on that triangulation. */
+
+ if (st->output)
+ XFreePixmap (st->dpy, st->output);
+ st->output = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+ XFillRectangle (st->dpy, st->output, st->pgc,
+ 0, 0, st->xgwa.width, st->xgwa.height);
+
+ switch (st->mode) {
+ case VORONOI:
+ {
+ voronoi_polygon *polys =
+ delaunay_to_voronoi (nv, p, ntri, v, wscale);
+ for (i = 0; i < nv; i++)
+ {
+ if (polys[i].npoints >= 3)
+ {
+ unsigned long color = XGetPixel (st->img,
+ polys[i].ctr.x / wscale,
+ polys[i].ctr.y / wscale);
+ XSetForeground (st->dpy, st->pgc, color);
+ XFillPolygon (st->dpy, st->output, st->pgc,
+ polys[i].p, polys[i].npoints,
+ Convex, CoordModeOrigin);
+
+ if (st->outline_p && !small_cell_p(&polys[i]))
+ {
+ XColor bd;
+ double scale = 0.8;
+ bd.pixel = color;
+ XQueryColor (st->dpy, st->xgwa.colormap, &bd);
+ bd.red *= scale;
+ bd.green *= scale;
+ bd.blue *= scale;
+
+ /* bd.red = 0xFFFF; bd.green = 0; bd.blue = 0; */
+
+ XAllocColor (st->dpy, st->xgwa.colormap, &bd);
+ XSetForeground (st->dpy, st->pgc, bd.pixel);
+ XDrawLines (st->dpy, st->output, st->pgc,
+ polys[i].p, polys[i].npoints,
+ CoordModeOrigin);
+ XFreeColors (st->dpy, st->xgwa.colormap, &bd.pixel,
+ 1, 0);
+ }
+ }
+ if (polys[i].p) free (polys[i].p);
+ polys[i].p = 0;
+ }
+ free (polys);
+ }
+ break;
+
+ case DELAUNAY:
+ for (i = 0; i < ntri; i++)
+ {
+ XPoint xp[3];
+ unsigned long color;
+ xp[0].x = p[v[i].p1].x * wscale; xp[0].y = p[v[i].p1].y * wscale;
+ xp[1].x = p[v[i].p2].x * wscale; xp[1].y = p[v[i].p2].y * wscale;
+ xp[2].x = p[v[i].p3].x * wscale; xp[2].y = p[v[i].p3].y * wscale;
+
+ /* Set the color of this triangle to the pixel at its midpoint. */
+ color = XGetPixel (st->img,
+ (xp[0].x + xp[1].x + xp[2].x) / (3 * wscale),
+ (xp[0].y + xp[1].y + xp[2].y) / (3 * wscale));
+
+ XSetForeground (st->dpy, st->pgc, color);
+ XFillPolygon (st->dpy, st->output, st->pgc, xp, countof(xp),
+ Convex, CoordModeOrigin);
+
+ if (st->outline_p && !small_triangle_p(xp))
+ { /* Border the triangle with a color that is darker */
+ XColor bd;
+ double scale = 0.8;
+ bd.pixel = color;
+ XQueryColor (st->dpy, st->xgwa.colormap, &bd);
+ bd.red *= scale;
+ bd.green *= scale;
+ bd.blue *= scale;
+
+ /* bd.red = 0xFFFF; bd.green = 0; bd.blue = 0; */
+
+ XAllocColor (st->dpy, st->xgwa.colormap, &bd);
+ XSetForeground (st->dpy, st->pgc, bd.pixel);
+ XDrawLines (st->dpy, st->output, st->pgc,
+ xp, countof(xp), CoordModeOrigin);
+ XFreeColors (st->dpy, st->xgwa.colormap, &bd.pixel, 1, 0);
+ }
+ }
+ break;
+ default:
+ abort();
+ }
+
+ free (p);
+ free (v);
+
+ if (st->cache_p && !st->cache[st->thresh])
+ {
+ st->cache[st->thresh] =
+ XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+ if (! st->cache[st->thresh])
+ {
+ fprintf (stderr, "%s: out of memory\n", progname);
+ abort();
+ }
+ if (st->output)
+ XCopyArea (st->dpy,
+ st->output,
+ st->cache[st->thresh],
+ st->pgc,
+ 0, 0, st->xgwa.width, st->xgwa.height,
+ 0, 0);
+ }
+ }
+
+ if (! st->output) abort();
+}
+
+
+/* Convert the delta map into a displayable pixmap.
+ */
+static Pixmap
+get_deltap (struct state *st)
+{
+ int x, y;
+ int w = st->xgwa.width;
+ int h = st->xgwa.height;
+ double wscale = st->xgwa.width / (double) st->delta->width;
+ XImage *dimg;
+
+ Visual *v = st->xgwa.visual;
+ unsigned long rmsk=0, gmsk=0, bmsk=0;
+ unsigned int rpos=0, gpos=0, bpos=0;
+ unsigned int rsiz=0, gsiz=0, bsiz=0;
+
+ if (st->deltap) return st->deltap;
+
+ visual_rgb_masks (st->xgwa.screen, v, &rmsk, &gmsk, &bmsk);
+ decode_mask (rmsk, &rpos, &rsiz);
+ decode_mask (gmsk, &gpos, &gsiz);
+ decode_mask (bmsk, &bpos, &bsiz);
+
+ dimg = XCreateImage (st->dpy, st->xgwa.visual, st->xgwa.depth,
+ ZPixmap, 0, NULL, w, h, 8, 0);
+ if (! dimg) abort();
+ dimg->data = (char *) calloc (dimg->height, dimg->bytes_per_line);
+ if (! dimg->data) abort();
+
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ {
+ unsigned long v = XGetPixel (st->delta, x / wscale, y / wscale) << 5;
+ unsigned long p = (((v << rpos) & rmsk) |
+ ((v << gpos) & gmsk) |
+ ((v << bpos) & bmsk));
+ XPutPixel (dimg, x, y, p);
+ }
+
+ st->deltap = XCreatePixmap (st->dpy, st->window, w, h, st->xgwa.depth);
+ XPutImage (st->dpy, st->deltap, st->pgc, dimg, 0, 0, 0, 0, w, h);
+ XDestroyImage (dimg);
+ return st->deltap;
+}
+
+
+static unsigned long
+tessellimage_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0,
+ &st->geom);
+ if (! st->img_loader) { /* just finished */
+ analyze (st);
+ st->start_time = double_time();
+ st->start_time2 = st->start_time;
+ }
+ goto DONE;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < double_time()) {
+ int w = st->xgwa.width;
+ int h = st->xgwa.height;
+
+ /* Analysing a full-resolution image on a Retina display is too slow,
+ so scale down the source at image-load time. */
+ if (st->max_resolution > 10)
+ {
+ if (w > h && w > st->max_resolution)
+ h = st->max_resolution * h / w, w = st->max_resolution;
+ else if (h > st->max_resolution)
+ w = st->max_resolution * w / h, h = st->max_resolution;
+ }
+ /* fprintf(stderr,"%s: loading %d x %d\n", progname, w, h); */
+
+ XClearWindow (st->dpy, st->window);
+ if (st->image) XFreePixmap (dpy, st->image);
+ st->image = XCreatePixmap (st->dpy, st->window, w, h, st->xgwa.depth);
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->image, 0, &st->geom);
+ goto DONE;
+ }
+
+ tessellate (st);
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ XClearWindow (st->dpy, st->window);
+
+ if (st->output)
+ XCopyArea (st->dpy,
+ (st->button_down_p ? get_deltap (st) : st->output),
+ st->window, st->wgc,
+ 0, 0, st->xgwa.width, st->xgwa.height, 0, 0);
+ else if (!st->nthreshes)
+ XCopyArea (st->dpy,
+ st->image,
+ st->window, st->wgc,
+ 0, 0, st->xgwa.width, st->xgwa.height, 0, 0);
+
+
+ DONE:
+ return st->delay;
+}
+
+static void
+tessellimage_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+tessellimage_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->xany.type == ButtonPress)
+ {
+ st->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ st->button_down_p = False;
+ return True;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0; /* load next image */
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+tessellimage_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ flush_cache (st);
+ if (st->wgc) XFreeGC (dpy, st->wgc);
+ if (st->pgc) XFreeGC (dpy, st->pgc);
+ if (st->image) XFreePixmap (dpy, st->image);
+ if (st->output) XFreePixmap (dpy, st->output);
+ if (st->delta) XDestroyImage (st->delta);
+ free (st);
+}
+
+
+
+
+static const char *tessellimage_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: True",
+ "*dontClearRoot: True",
+ "*fpsSolid: true",
+ "*mode: random",
+ "*delay: 30000",
+ "*duration: 120",
+ "*duration2: 0.4",
+ "*maxDepth: 30000",
+ "*maxResolution: 1024",
+ "*outline: True",
+ "*fillScreen: True",
+ "*cache: True",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec tessellimage_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-duration2", ".duration2", XrmoptionSepArg, 0 },
+ { "-max-depth", ".maxDepth", XrmoptionSepArg, 0 },
+ { "-max-resolution", ".maxResolution", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-outline", ".outline", XrmoptionNoArg, "True" },
+ { "-no-outline", ".outline", XrmoptionNoArg, "False" },
+ { "-fill-screen", ".fillScreen", XrmoptionNoArg, "True" },
+ { "-no-fill-screen", ".fillScreen", XrmoptionNoArg, "False" },
+ { "-cache", ".cache", XrmoptionNoArg, "True" },
+ { "-no-cache", ".cache", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Tessellimage", tessellimage)
diff --git a/hacks/tessellimage.man b/hacks/tessellimage.man
new file mode 100644
index 0000000..a0a928f
--- /dev/null
+++ b/hacks/tessellimage.man
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+tessellimage - Converts an image to triangles using Delaunay tessellation.
+.SH SYNOPSIS
+.B tessellimage
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-duration \fInumber\fP]
+[\-duration2 \fInumber\fP]
+[\-max-depth \fInumber\fP]
+[\-max-resolution \fIpixels\fP]
+[\-no-outline]
+[\-no-fill-screen]
+[\-fps]
+.SH DESCRIPTION
+Converts an image to triangles using Delaunay tessellation, and animates
+the result at various depths. More triangles are allocated to visually
+complex parts of the image. This is accomplished by first computing the
+first derivative of the image: the distance between each pixel and its
+neighbors. Then the Delaunay control points are chosen by selecting those
+pixels whose distance value is above a certain threshold: those are the
+pixels that have the largest change in color/brightness.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-duration \fInumber\fP
+Length of time until loading a new image. Default: 2 minutes.
+.TP 8
+.B \-duration2 \fInumber\fP
+Length of time until increasing or decreasing the triangulation depth.
+Default: 0.4 seconds.
+.TP 8
+.B \-max-depth \fInumber\fP
+The maximum number of triangles to render. Default: 40000.
+.TP 8
+.B \-max-resolution \fIpixels\fP
+The size of the loaded image will be constrained to this width or
+height, to reduce the number of pixels examined. Think of it as
+an initial low-pass filter. Default 1024.
+.TP 8
+.B \-outline | \-no-outline
+Whether to outline the triangles.
+.TP 8
+.B \-fill-screen | \-no-fill-screen
+Whether to zoom in on the image to completely fill the screen,
+or to center it.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2014-2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/testx11.c b/hacks/testx11.c
new file mode 100644
index 0000000..cc21621
--- /dev/null
+++ b/hacks/testx11.c
@@ -0,0 +1,968 @@
+/* testx11.c, Copyright (c) 2015-2017 Dave Odell <dmo2118@gmail.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This is a test for X11 drawing primitives for the non-X11 ports of
+ * XScreenSaver. It shouldn't normally be installed with the other screenhacks.
+ *
+ * Almost no error checking in here. This is intentional.
+ */
+
+#include "screenhack.h"
+#include "glx/rotator.h"
+#include "colorbars.h"
+#include "erase.h"
+
+#include "ximage-loader.h"
+#include "images/gen/logo-180_png.h"
+
+#include <assert.h>
+#include <errno.h>
+
+#ifndef HAVE_JWXYZ
+# define jwxyz_XSetAntiAliasing(dpy, gc, p)
+#endif
+
+#ifndef jwxyz_assert_display
+# define jwxyz_assert_display(dpy)
+#endif
+
+#define countof(a) (sizeof(a) / sizeof(*(a)))
+
+static const char *testx11_defaults [] = {
+ ".background: #a020f0", /* purple */
+ ".foreground: white",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec testx11_options [] = {
+ { 0, 0, 0, 0 }
+};
+
+enum
+{
+ mode_welcome,
+ mode_primitives,
+ mode_images,
+ mode_copy,
+ mode_preserve,
+ mode_erase,
+
+ mode_count
+};
+
+struct testx11 {
+ Display *dpy;
+ Window win;
+
+ XWindowAttributes xgwa;
+
+# ifndef HAVE_JWXYZ
+ Pixmap backbuffer;
+# endif
+
+ unsigned mode;
+
+ /* Pixels from XAllocPixel. */
+ unsigned long rgb[3], salmon, magenta, gray50, dark_slate_gray1, cyan;
+
+ unsigned frame;
+
+ Bool anti_alias_p;
+
+ /* These X11 objects aren't altered after creation, except for:
+ - copy_gc and thick_line_gc get anti-aliasing toggled.
+ - xor_gc's clip mask (if it's turned on) always covers the entire window.
+ */
+ GC copy_gc, mono_gc, thick_line_gc, xor_gc, graph_gc;
+ Pixmap clip_mask_tile;
+
+ /* Backdrop stuff, naturally. */
+ GC backdrop_black_gc;
+ Pixmap backdrop_tile, backdrop_scratch;
+ XColor backdrop_colors[64];
+ int backdrop_ncolors;
+
+ /* The following items may be modified by various test modes. */
+ Pixmap primitives_mini_pix;
+
+ GC images_point_gc;
+
+ Pixmap copy_pix64;
+
+ Pixmap preserve[2];
+
+ eraser_state *erase;
+
+ rotator *rot;
+};
+
+
+static void
+abort_no_mem (void)
+{
+ fprintf(stderr, "%s: %s\n", progname, strerror(ENOMEM));
+ abort();
+}
+
+static void
+check_no_mem (void *ptr)
+{
+ if(!ptr)
+ abort_no_mem();
+}
+
+
+static unsigned long
+alloc_color (struct testx11 *st,
+ unsigned short r, unsigned short g, unsigned short b)
+{
+ XColor color;
+ color.red = r;
+ color.green = g;
+ color.blue = b;
+ color.flags = DoRed | DoGreen | DoBlue;
+ XAllocColor (st->dpy, st->xgwa.colormap, &color);
+ return color.pixel;
+}
+
+static void
+create_backbuffer(struct testx11 *st)
+{
+# ifndef HAVE_JWXYZ
+ st->backbuffer = XCreatePixmap (st->dpy, st->win,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+# endif
+}
+
+static Bool
+toggle_antialiasing (struct testx11 *st)
+{
+ st->anti_alias_p ^= True;
+ jwxyz_XSetAntiAliasing (st->dpy, st->copy_gc, st->anti_alias_p);
+ jwxyz_XSetAntiAliasing (st->dpy, st->thick_line_gc, st->anti_alias_p);
+ return True;
+}
+
+
+static void
+primitives_mini_rect(struct testx11 *st, Drawable t, int x, int y)
+{
+ XFillRectangle(st->dpy, t, st->copy_gc, x, y, 2, 2);
+}
+
+static void
+images_copy_test (Display *dpy, Drawable src, Drawable dst, GC gc,
+ int src_y, int dst_x, int dst_y, unsigned long cells)
+{
+ XCopyArea(dpy, src, dst, gc, 0, src_y, 3, 2, dst_x, dst_y);
+
+ {
+ XImage *image = XGetImage(dpy, src, 0, src_y, 3, 2, cells, ZPixmap);
+ XPutImage(dpy, dst, gc, image, 0, 0, dst_x, dst_y + 2, 3, 2);
+ XDestroyImage(image);
+ }
+}
+
+static void
+images_pattern (struct testx11 *st, Drawable d, unsigned y)
+{
+ unsigned x;
+ for (x = 0; x != 3; ++x) {
+ XSetForeground(st->dpy, st->images_point_gc, st->rgb[x]);
+ XDrawPoint(st->dpy, d, st->images_point_gc, x, y);
+ XSetForeground(st->dpy, st->images_point_gc, st->rgb[2 - x]);
+ XFillRectangle(st->dpy, d, st->images_point_gc, x, y + 1, 1, 1);
+ }
+
+ images_copy_test (st->dpy, d, d, st->images_point_gc, y, 0, y + 2,
+ st->rgb[0] | st->rgb[1] | st->rgb[2]);
+}
+
+static const unsigned tile_size = 16;
+static const unsigned tile_count = 8;
+
+static const unsigned preserve_size = 128;
+
+static void
+make_clip_mask (struct testx11 *st)
+{
+ /* Activate this for extra Fun! */
+# if 0
+ /* This is kind of slow, but that's OK, because this only happens on int
+ or during a resize.
+ */
+ unsigned w = st->xgwa.width, h = st->xgwa.height;
+ unsigned x, y;
+ Pixmap mask = XCreatePixmap (st->dpy, st->clip_mask_tile, w, h, 1);
+
+ for (y = 0; y < h; y += 8) {
+ for (x = 0; x < w; x += 8) {
+ XCopyArea (st->dpy, st->clip_mask_tile, mask, st->mono_gc,
+ 0, 0, 8, 8, x, y);
+ }
+ }
+
+ XSetClipMask (st->dpy, st->xor_gc, mask);
+ XFreePixmap (st->dpy, mask);
+# endif
+}
+
+
+static void
+colorbars (struct testx11 *st)
+{
+ Pixmap logo_mask = 0;
+ Pixmap logo = image_data_to_pixmap (st->dpy, st->win,
+ logo_180_png, sizeof(logo_180_png),
+ 0, 0, &logo_mask);
+ draw_colorbars (st->xgwa.screen, st->xgwa.visual, st->win,
+ st->xgwa.colormap, 0, 0, st->xgwa.width, st->xgwa.height,
+ logo, logo_mask);
+ XFreePixmap (st->dpy, logo);
+ XFreePixmap (st->dpy, logo_mask);
+}
+
+
+static void *
+testx11_init (Display *dpy, Window win)
+{
+ static const char backdrop_pattern[] = {
+ '\xff', '\x00', '\xfe', '\x01', '\xfc', '\x03', '\xf8', '\x07', /* Zig */
+ '\xf0', '\x0f', '\xf8', '\x07', '\xfc', '\x03', '\xfe', '\x01', /* Zag */
+ '\xff', '\x00', '\xfe', '\x01', '\xfc', '\x03', '\xf8', '\x07', /* etc. */
+ '\xf0', '\x0f', '\xf8', '\x07', '\xfc', '\x03', '\xfe', '\x01',
+ '\xff', '\x00', '\xfe', '\x01', '\xfc', '\x03', '\xf8', '\x07',
+ '\xf0', '\x0f', '\xf8', '\x07', '\xfc', '\x03', '\xfe', '\x01',
+ '\xff', '\x00', '\xfe', '\x01', '\xfc', '\x03', '\xf8', '\x07',
+ '\xf0', '\x0f', '\xf8', '\x07', '\xfc', '\x03', '\xfe', '\x01',
+ };
+
+ static const char clip_bits[] = {
+ '\x33', '\x33', '\xcc', '\xcc', '\x33', '\x33', '\xcc', '\xcc'
+ };
+
+ struct testx11 *st = (struct testx11 *) malloc (sizeof(*st));
+ XGCValues gcv;
+
+ check_no_mem (st);
+
+ st->dpy = dpy;
+ st->win = win;
+
+ XGetWindowAttributes (dpy, win, &st->xgwa);
+
+ create_backbuffer (st);
+
+ st->rgb[0] = alloc_color (st, 0xffff, 0x0000, 0x0000);
+ st->rgb[1] = alloc_color (st, 0x0000, 0xffff, 0x0000);
+ st->rgb[2] = alloc_color (st, 0x0000, 0x0000, 0xffff);
+ st->salmon = alloc_color (st, 0xffff, 0x7fff, 0x7fff);
+ st->magenta = alloc_color (st, 0xffff, 0x0000, 0xffff);
+ st->gray50 = alloc_color (st, 0x8000, 0x8000, 0x8000);
+ st->dark_slate_gray1 = alloc_color (st, 0x8000, 0xffff, 0xffff);
+ st->cyan = alloc_color (st, 0x0000, 0xffff, 0xffff);
+
+ st->backdrop_tile = XCreatePixmapFromBitmapData (dpy, win,
+ (char *) backdrop_pattern,
+ tile_size, tile_size * 2,
+ 1, 0, 1);
+
+ st->clip_mask_tile = XCreatePixmapFromBitmapData (dpy, win,
+ (char *) clip_bits, 8, 8,
+ 1, 0, 1);
+
+ {
+ unsigned s = tile_size * tile_count;
+ st->backdrop_scratch = XCreatePixmap (dpy, win, s, s, st->xgwa.depth);
+ }
+
+ st->backdrop_ncolors = countof (st->backdrop_colors);
+ make_color_loop (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ 180, 1, 0.5, 210, 1, 0.5, 240, 1, 0.5,
+ st->backdrop_colors, &st->backdrop_ncolors, True, NULL);
+
+ st->frame = 0;
+
+# ifdef HAVE_ANDROID
+ st->mode = mode_primitives;
+# else
+ st->mode = mode_welcome;
+# endif
+
+ st->anti_alias_p = False;
+
+ gcv.function = GXcopy;
+ gcv.foreground = st->cyan;
+ gcv.background = st->magenta;
+ gcv.line_width = 0;
+ gcv.cap_style = CapRound;
+ /* TODO: Real X11 uses fixed by default. */
+ gcv.font = XLoadFont (dpy, "fixed");
+ st->copy_gc = XCreateGC (dpy, win,
+ GCFunction | GCForeground | GCBackground
+ | GCLineWidth | GCCapStyle | GCFont, &gcv);
+
+ gcv.foreground = BlackPixelOfScreen (st->xgwa.screen);
+ st->backdrop_black_gc = XCreateGC (dpy, win, GCForeground, &gcv);
+
+ gcv.foreground = alloc_color (st, 0x8000, 0x4000, 0xffff);
+ gcv.line_width = 8;
+ gcv.cap_style = CapProjecting;
+ st->thick_line_gc = XCreateGC (dpy, win,
+ GCForeground | GCLineWidth | GCCapStyle,
+ &gcv);
+
+ gcv.function = GXxor;
+ st->xor_gc = XCreateGC (dpy, win, GCFunction, &gcv);
+
+ st->images_point_gc = XCreateGC (dpy, win, 0, NULL);
+
+ st->graph_gc = XCreateGC (dpy, win, 0, &gcv);
+
+ st->mono_gc = XCreateGC (dpy, st->clip_mask_tile, 0, &gcv);
+
+ st->copy_pix64 = XCreatePixmap(dpy, win, 64, 64, st->xgwa.depth);
+
+ st->primitives_mini_pix = XCreatePixmap (dpy, win, 16, 24, st->xgwa.depth);
+
+ {
+ static const char text[] = "Welcome from testx11_init().";
+ colorbars (st);
+ XDrawString (dpy, win, st->copy_gc, 16, 16, text, countof (text) - 1);
+ }
+
+ make_clip_mask (st);
+
+ st->preserve[0] =
+ XCreatePixmap(dpy, win, preserve_size, preserve_size, st->xgwa.depth);
+ st->preserve[1] =
+ XCreatePixmap(dpy, win, preserve_size, preserve_size, st->xgwa.depth);
+
+ toggle_antialiasing (st);
+
+ st->erase = NULL;
+
+ jwxyz_assert_display (dpy);
+
+ st->rot = make_rotator (2, 2, 2, 2, 0.01, False);
+ return st;
+}
+
+
+static void
+backdrop (struct testx11 *st, Drawable t)
+{
+ unsigned w = st->xgwa.width, h = st->xgwa.height;
+ unsigned x, y;
+
+ for (y = 0; y != tile_count; ++y) {
+ const float s0 = 2 * M_PI / tile_count;
+ float y_fac = sin ((y + st->frame / 16.0) * s0);
+ for (x = 0; x != tile_count; ++x) {
+ int c = ((sin ((x + st->frame / 8.0) * s0) * y_fac) - 1) / 2 *
+ st->backdrop_ncolors / 2;
+ c = (c + st->frame) % st->backdrop_ncolors;
+ XSetBackground (st->dpy, st->backdrop_black_gc,
+ st->backdrop_colors[c].pixel);
+ XCopyPlane (st->dpy, st->backdrop_tile, st->backdrop_scratch,
+ st->backdrop_black_gc, 0, st->frame % tile_size,
+ tile_size, tile_size, x * tile_size, y * tile_size, 1);
+ }
+ }
+
+ /* XFillRectangle (st->dpy, t, st->backdrop_black_gc, 0, 0, w, h); */
+
+ for (y = 0; y < h; y += tile_count * tile_size) {
+ for (x = 0; x < w; x += tile_count * tile_size) {
+ XCopyArea (st->dpy, st->backdrop_scratch, t, st->copy_gc, 0, 0,
+ tile_count * tile_size, tile_count * tile_size, x, y);
+ }
+ }
+}
+
+static const unsigned button_pad = 16;
+static const unsigned button_size = 64;
+
+
+static void
+testx11_graph_rotator (struct testx11 *st)
+{
+ double x, y, z;
+
+ int boxw = st->xgwa.width / 3;
+ int boxh = (st->xgwa.height - (22 * 5)) / 4;
+ int boxx = st->xgwa.width - boxw - 20;
+ int boxy = st->xgwa.height - boxh - 20;
+
+ /* position */
+
+ get_position (st->rot, &x, &y, &z, True);
+ if (x < 0 || x >= 1 || y < 0 || y >= 1 || z < 0 || z >= 1) abort();
+
+
+ XSetForeground (st->dpy, st->graph_gc, st->dark_slate_gray1);
+ XDrawRectangle (st->dpy, st->win, st->graph_gc,
+ boxx-1, boxy-1, boxw+2, boxh+2);
+
+ XCopyArea (st->dpy, st->win, st->win, st->graph_gc,
+ boxx+1, boxy, boxw-1, boxh, boxx, boxy);
+
+ XSetForeground (st->dpy, st->graph_gc, BlackPixelOfScreen (st->xgwa.screen));
+ XDrawLine (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1, boxy,
+ boxx + boxw - 1, boxy + boxh);
+
+ XSetForeground (st->dpy, st->graph_gc, st->salmon);
+ XDrawPoint (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1,
+ boxy + boxh - 1 - (int) (x * (boxh - 1)));
+
+ XSetForeground (st->dpy, st->graph_gc, st->magenta);
+ XDrawPoint (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1,
+ boxy + boxh - 1 - (int) (y * (boxh - 1)));
+
+ XSetForeground (st->dpy, st->graph_gc, st->gray50);
+ XDrawPoint (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1,
+ boxy + boxh - 1 - (int) (z * (boxh - 1)));
+
+ /* spin */
+
+ get_rotation (st->rot, &x, &y, &z, True);
+ if (x < 0 || x >= 1 || y < 0 || y >= 1 || z < 0 || z >= 1) abort();
+
+ /* put 0 in the middle */
+ x += 0.5; if (x > 1) x--;
+ y += 0.5; if (y > 1) y--;
+ z += 0.5; if (z > 1) z--;
+
+
+ boxy -= boxh + 20;
+
+ XSetForeground (st->dpy, st->graph_gc, st->dark_slate_gray1);
+ XDrawRectangle (st->dpy, st->win, st->graph_gc,
+ boxx-1, boxy-1, boxw+2, boxh+2);
+
+ XCopyArea (st->dpy, st->win, st->win, st->graph_gc,
+ boxx+1, boxy, boxw-1, boxh, boxx, boxy);
+
+ XSetForeground (st->dpy, st->graph_gc, BlackPixelOfScreen (st->xgwa.screen));
+ XDrawLine (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1, boxy,
+ boxx + boxw - 1, boxy + boxh);
+
+ XSetForeground (st->dpy, st->graph_gc, st->magenta);
+ XDrawPoint (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1,
+ boxy + boxh - 1 - (int) (x * (boxh - 1)));
+
+
+ boxy -= boxh + 20;
+
+ XSetForeground (st->dpy, st->graph_gc, st->dark_slate_gray1);
+ XDrawRectangle (st->dpy, st->win, st->graph_gc,
+ boxx-1, boxy-1, boxw+2, boxh+2);
+
+ XCopyArea (st->dpy, st->win, st->win, st->graph_gc,
+ boxx+1, boxy, boxw-1, boxh, boxx, boxy);
+
+ XSetForeground (st->dpy, st->graph_gc, BlackPixelOfScreen (st->xgwa.screen));
+ XDrawLine (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1, boxy,
+ boxx + boxw - 1, boxy + boxh);
+
+ XSetForeground (st->dpy, st->graph_gc, st->magenta);
+ XDrawPoint (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1,
+ boxy + boxh - 1 - (int) (y * (boxh - 1)));
+
+
+ boxy -= boxh + 20;
+
+ XSetForeground (st->dpy, st->graph_gc, st->dark_slate_gray1);
+ XDrawRectangle (st->dpy, st->win, st->graph_gc,
+ boxx-1, boxy-1, boxw+2, boxh+2);
+
+ XCopyArea (st->dpy, st->win, st->win, st->graph_gc,
+ boxx+1, boxy, boxw-1, boxh, boxx, boxy);
+
+ XSetForeground (st->dpy, st->graph_gc, BlackPixelOfScreen (st->xgwa.screen));
+ XDrawLine (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1, boxy,
+ boxx + boxw - 1, boxy + boxh);
+
+ XSetForeground (st->dpy, st->graph_gc, st->magenta);
+ XDrawPoint (st->dpy, st->win, st->graph_gc,
+ boxx + boxw - 1,
+ boxy + boxh - 1 - (int) (z * (boxh - 1)));
+}
+
+
+/* Draws a blinking box in what should be the upper left corner of the
+ device, as physically oriented. The box is taller than it is wide.
+ */
+static void
+testx11_show_orientation (struct testx11 *st)
+{
+#ifdef HAVE_MOBILE
+ int x, y;
+ int w = st->xgwa.width;
+ int h = st->xgwa.height;
+ int ww = 15;
+ int hh = ww*2;
+ static int tick = 0;
+ static int oo = -1;
+ int o = (int) current_device_rotation ();
+
+ if (o != oo) {
+// fprintf (stderr,"ROT %d -> %d\n", oo, o);
+ oo = o;
+ }
+
+ switch (o) {
+ case 0: case 360: x = 0; y = 0; w = ww; h = hh; break;
+ case 90: case -270: x = 0; y = h-ww; w = hh; h = ww; break;
+ case -90: case 270: x = w-hh; y = 0; w = hh; h = ww; break;
+ case 180: case -180: x = w-ww; y = h-hh; w = ww; h = hh; break;
+ default: return;
+ }
+
+ if (++tick > 20) tick = 0;
+
+ XSetForeground (st->dpy, st->graph_gc,
+ (tick > 10
+ ? WhitePixelOfScreen (st->xgwa.screen)
+ : BlackPixelOfScreen (st->xgwa.screen)));
+ XFillRectangle (st->dpy, st->win, st->graph_gc,
+ x, y, w, h);
+#endif
+}
+
+
+static unsigned long
+testx11_draw (Display *dpy, Window win, void *st_raw)
+{
+ struct testx11 *st = (struct testx11 *) st_raw;
+ unsigned w = st->xgwa.width, h = st->xgwa.height;
+# ifdef HAVE_JWXYZ
+ Drawable t = win;
+# else
+ Drawable t = st->mode == mode_primitives ? st->backbuffer : win;
+# endif
+ unsigned i;
+
+ assert (dpy == st->dpy);
+ assert (win == st->win);
+
+ jwxyz_assert_display (dpy);
+
+ XSetWindowBackground (dpy, win, st->gray50);
+
+ switch (st->mode)
+ {
+ case mode_primitives:
+ backdrop (st, t);
+
+ XDrawPoint (dpy, t, st->thick_line_gc, 0, 0);
+ XDrawPoint (dpy, t, st->thick_line_gc, 0, 1);
+ XDrawPoint (dpy, t, st->thick_line_gc, 1, 0);
+ XDrawPoint (dpy, t, st->thick_line_gc, 1, 1);
+
+ primitives_mini_rect (st, t, 2, 0);
+ primitives_mini_rect (st, t, 0, 2);
+ primitives_mini_rect (st, t, 4, 2);
+ primitives_mini_rect (st, t, 2, 4);
+
+ primitives_mini_rect (st, t, 30, -2);
+ primitives_mini_rect (st, t, 32, 0);
+
+ primitives_mini_rect (st, t, 30, h - 2);
+ primitives_mini_rect (st, t, 32, h);
+
+ primitives_mini_rect (st, t, -2, 30);
+ primitives_mini_rect (st, t, 0, 32);
+ primitives_mini_rect (st, t, w - 2, 30);
+ primitives_mini_rect (st, t, w, 32);
+
+ primitives_mini_rect (st, t, w / 2 + 4, h / 2 + 4);
+
+ XFillArc (dpy, t, st->copy_gc, 16, 16, 256, 256, 45 * 64, -135 * 64);
+ /* XCopyArea(dpy, t, t, st->copy_gc, 48, 48, 128, 128, 64, 64); */
+
+ /* Center */
+ XDrawPoint (dpy, t, st->copy_gc, w / 2, h / 2);
+
+ /* Top/bottom */
+ XDrawPoint (dpy, t, st->copy_gc, w / 2, 0);
+ XDrawPoint (dpy, t, st->copy_gc, w / 2, h - 1);
+
+ XDrawPoint (dpy, t, st->copy_gc, 16, -1);
+ XDrawPoint (dpy, t, st->copy_gc, 17, 0);
+
+ XDrawPoint (dpy, t, st->copy_gc, 15, h - 2);
+ XDrawPoint (dpy, t, st->copy_gc, 16, h - 1);
+ XDrawPoint (dpy, t, st->copy_gc, 17, h);
+
+ {
+ XPoint *points = malloc (sizeof(XPoint) * h);
+ XSegment *lines = malloc (sizeof(XSegment) * h);
+ XPoint *points2 = malloc (sizeof(XPoint) * h);
+ for(i = 0; i != h; ++i)
+ {
+ points[i].x = 8 + (i & 1);
+ points[i].y = i;
+
+ lines[i].x1 = 48 + (i & 1) * 4;
+ lines[i].y1 = i;
+ lines[i].x2 = 50;
+ lines[i].y2 = i;
+
+ points2[i].x = 24 + (i & 1);
+ points2[i].y = i;
+ /* XFillRectangle(st->dpy, t, st->copy_gc, 24 + (i & 1), i, 1, 1); */
+ }
+
+ XDrawPoints (dpy, t, st->copy_gc, points, h, CoordModeOrigin);
+ XDrawSegments (dpy, t, st->copy_gc, lines, h);
+ XDrawPoints (dpy, t, st->copy_gc, points2, h, CoordModeOrigin);
+ free (lines);
+ free (points);
+ free (points2);
+ }
+
+ /* Left/right */
+ XDrawPoint (dpy, t, st->copy_gc, -1, 16);
+ XDrawPoint (dpy, t, st->copy_gc, 0, 17);
+ XDrawPoint (dpy, t, st->copy_gc, w - 1, 16);
+ XDrawPoint (dpy, t, st->copy_gc, w, 17);
+
+ {
+ XPoint *points = malloc(sizeof(XPoint) * w);
+ XSegment *lines = malloc(sizeof(XSegment) * w);
+ XPoint *points2 = malloc(sizeof(XPoint) * w);
+ for(i = 0; i != w; ++i)
+ {
+ points[i].x = i;
+ points[i].y = 8 + (i & 1);
+ lines[i].x1 = i;
+ lines[i].y1 = 48 + (i & 1) * 4;
+ lines[i].x2 = i;
+ lines[i].y2 = 50;
+
+ points2[i].x = i;
+ points2[i].y = 24 + (i & 1);
+ /* XFillRectangle(dpy, t, st->copy_gc, i, 24 + (i & 1), 1, 1); */
+ }
+
+ XDrawPoints (dpy, t, st->copy_gc, points, w, CoordModeOrigin);
+ XDrawSegments (dpy, t, st->copy_gc, lines, w);
+ {
+ /* Thick purple lines */
+ XSegment seg[2] =
+ {
+ {31, 31, 31, 31}, /* TODO: This should not be rotated in Cocoa. */
+ {42, 31, 42, 42}
+ };
+ XDrawSegments (dpy, t, st->thick_line_gc, seg, 2);
+
+ XDrawLine (dpy, t, st->thick_line_gc, 58, 43, 64, 43);
+ XDrawLine (dpy, t, st->thick_line_gc, 73, 43, 80, 43);
+ }
+
+ XDrawPoints (dpy, t, st->copy_gc, points2, w, CoordModeOrigin);
+ free (points);
+ free (points2);
+ free (lines);
+ }
+
+ XDrawLine (dpy, t, st->copy_gc, 54, 11, 72, 22);
+
+ {
+ XPoint vertices[] = {{5, 5}, {5, 8}, {8, 8}, {8, 5}};
+ XFillPolygon (dpy, t, st->copy_gc, vertices, 4, Convex, CoordModeOrigin);
+ }
+
+ {
+ XDrawRectangle (dpy, t, st->copy_gc, 11, 11, 11, 11);
+ XFillRectangle (dpy, t, st->copy_gc, 13, 13, 8, 8);
+ }
+
+ /* Several ~16 pixel boxes in a row. */
+
+ /* Box 0 */
+ {
+ XDrawRectangle (dpy, t, st->copy_gc, 54, 54, 16, 16);
+ XDrawRectangle (dpy, t, st->copy_gc, 55, 55, 14, 14);
+
+ XDrawPoint (dpy, t, st->thick_line_gc, 56, 56);
+ XDrawPoint (dpy, t, st->copy_gc, 57, 56);
+ }
+
+ /* Box 1 */
+ XCopyArea (dpy, t, t, st->copy_gc, 55, 55, 15, 15, 72, 55);
+
+ /* Box 2 */
+ {
+ XImage *image = XGetImage(st->dpy, t, 55, 55, 15, 15, 0xffffff, ZPixmap);
+ XPutPixel(image, 2, 0, 0x00000000);
+ XPutImage (dpy, t, st->copy_gc, image, 0, 0, 88, 55, 15, 15);
+ XDestroyImage(image);
+ }
+
+ /* Box 3 */
+
+ {
+ XCopyArea (dpy, t, st->primitives_mini_pix, st->copy_gc,
+ 104, 55, 16, 16, 0, 0);
+ /* XCopyArea (dpy, t, st->primitives_mini_pix, st->copy_gc,
+ 105, 56, 14, 14, 1, 1);
+ XCopyArea (dpy, t, st->primitives_mini_pix, st->copy_gc,
+ 1, 1, 14, 14, 1, 1);
+ */
+
+ /* This point gets hidden. */
+ XDrawPoint (dpy, t, st->copy_gc, 104 + 8, 55 + 8);
+
+ XDrawPoint (dpy, st->primitives_mini_pix, st->copy_gc, 0, 0);
+ XDrawPoint (dpy, st->primitives_mini_pix, st->copy_gc, 1, 0);
+ XDrawPoint (dpy, st->primitives_mini_pix, st->copy_gc, 15, 15);
+ XDrawRectangle (dpy, st->primitives_mini_pix, st->copy_gc,
+ 1, 1, 13, 13);
+ XCopyArea (dpy, st->primitives_mini_pix, t, st->copy_gc,
+ 0, 0, 16, 16, 104, 55);
+ }
+
+ {
+ XDrawLine (dpy, t, st->copy_gc, 11, 28, 22, 28);
+ XDrawLine (dpy, t, st->copy_gc, 12, 27, 12, 46);
+ XDrawLine (dpy, t, st->copy_gc, 14, 30, 14, 30);
+ }
+
+ XDrawArc (dpy, t, st->copy_gc, 27, 11, 19, 11, 0, 360 * 64);
+
+ XDrawRectangle (dpy, t, st->copy_gc, 54, 73, 64, 64);
+ XFillArc (dpy, t, st->copy_gc, 56, 75, 60, 60, 0, 360 * 64);
+ /* XDrawArc (dpy, t, st->thick_line_gc, 56, 75, 60, 60, 0, 360 * 64); */
+
+ XClearArea (dpy, win, 121, 55, 16, 16, False);
+ break;
+
+ case mode_images:
+ backdrop (st, t);
+
+ /* if(w >= 9 && h >= 10) */
+ {
+#ifdef HAVE_ANDROID
+ /* Draw below the status bar. */
+ const unsigned y = 64;
+#else
+ const unsigned y = 0;
+#endif
+
+ Screen *screen = st->xgwa.screen;
+ Visual *visual = st->xgwa.visual;
+ Pixmap pixmap = XCreatePixmap (dpy, t, 3, 10,
+ visual_depth (screen, visual));
+ unsigned long cells = cells = st->rgb[0] | st->rgb[1] | st->rgb[2];
+
+ {
+ XSetForeground (dpy, st->images_point_gc, st->salmon);
+ XDrawPoint (dpy, t, st->images_point_gc, 0, h - 1);
+ XDrawLine (dpy, t, st->images_point_gc, 0, y - 1, 8, y - 1);
+ }
+
+ images_pattern (st, t, y);
+ images_pattern (st, pixmap, 0);
+ /* Here's a good spot to verify that the pixmap contains the right colors
+ at the top.
+ */
+ images_copy_test (dpy, t, pixmap, st->copy_gc, y, 0, 6, cells);
+
+ XCopyArea (dpy, pixmap, t, st->copy_gc, 0, 0, 3, 10, 3, y);
+
+ {
+ XImage *image = XGetImage (dpy, pixmap, 0, 0, 3, 10, cells, ZPixmap);
+ XPutImage (dpy, t, st->copy_gc, image, 0, 0, 6, y, 3, 10);
+ XDestroyImage (image);
+ }
+
+ XFreePixmap (dpy, pixmap);
+ XSync (dpy, False);
+ }
+ break;
+
+ case mode_copy:
+ backdrop (st, win);
+
+ /* X.org isn't making a whole lot of sense here. */
+
+ Bool use_copy = (st->frame / 20) & 1;
+
+ {
+ GC gc = use_copy ? st->copy_gc : st->xor_gc;
+
+ XSetWindowBackground (dpy, t, st->magenta);
+ XCopyArea (dpy, t, t, gc, -2, -2, 40, 40, 20, 20);
+
+ if (!use_copy)
+ XCopyArea (st->dpy, t, t, gc, -20, h - 20, 40, 40, 20, h - 60);
+ XCopyArea (dpy, t, t, gc, w - 38, h - 38, 40, 40, w - 60, h - 60);
+ XCopyArea (dpy, t, t, gc, w - 20, -20, 40, 40, w - 60, 20);
+
+ XSetWindowBackground (dpy, t, st->gray50);
+ XCopyArea (st->dpy, t, t, gc, -20, 64, 40, 40, 20, 64);
+
+ XSetWindowBackground (dpy, t, st->dark_slate_gray1);
+ XCopyArea (st->dpy, t, t, gc, -20, 112, 40, 40, 20, 112);
+ }
+
+ if (use_copy)
+ {
+ GC gc = st->copy_gc;
+ XCopyArea (st->dpy, t, st->copy_pix64, gc, 0, h - 64, 64, 64, 0, 0);
+
+ XSetForeground (st->dpy, st->xor_gc, st->rgb[1]);
+ XSetBackground (st->dpy, st->xor_gc, st->cyan);
+
+ /* XCopyArea (st->dpy, st->copy_pix64, st->copy_pix64, gc,
+ 32, 32, 64, 64, 0, 0);
+ XCopyArea (st->dpy, st->copy_pix64, t, gc, 0, 0, 64, 64, 4, h - 68);
+ */
+ XCopyArea (st->dpy, st->copy_pix64, t, gc, 32, 32, 128, 64, 0, h - 64);
+ }
+
+ break;
+
+ case mode_preserve:
+ backdrop (st, t);
+
+ if(!(st->frame % 10)) {
+ const unsigned r = 16;
+ unsigned n = st->frame / 10;
+ unsigned m = n >> 1;
+ XFillArc (st->dpy, st->preserve[n & 1],
+ m & 1 ? st->copy_gc : st->thick_line_gc,
+ NRAND(preserve_size) - r, NRAND(preserve_size) - r,
+ r * 2, r * 2, 0, 360 * 64);
+ }
+
+ XCopyArea (st->dpy, st->preserve[0], t, st->copy_gc, 0, 0,
+ preserve_size, preserve_size, 0, 0);
+ XCopyArea (st->dpy, st->preserve[1], t, st->copy_gc, 0, 0,
+ preserve_size, preserve_size, preserve_size, 0);
+ XCopyArea (st->dpy, st->preserve[1], t, st->copy_gc, 0, 0,
+ preserve_size, preserve_size,
+ w - preserve_size / 2, preserve_size);
+ break;
+
+ case mode_erase:
+ if (!st->erase)
+ colorbars (st);
+ st->erase = erase_window(st->dpy, st->win, st->erase);
+ break;
+ }
+
+ /* Mode toggle buttons */
+ for (i = 1; i != mode_count; ++i) {
+ unsigned i0 = i - 1;
+ char str[32];
+ XRectangle button_dims;
+ button_dims.x = i0 * (button_pad + button_size) + button_pad;
+ button_dims.y = h - button_pad - button_size;
+ button_dims.width = button_size;
+ button_dims.height = button_size;
+ if (!st->mode)
+ XFillRectangles (dpy, t, st->backdrop_black_gc, &button_dims, 1);
+ XDrawRectangle (dpy, t, st->copy_gc, button_dims.x, button_dims.y,
+ button_dims.width, button_dims.height);
+
+ XDrawString (dpy, t, st->copy_gc,
+ button_dims.x + button_size / 2 - 3,
+ h - button_pad - button_size / 2 + 13 / 2,
+ str, sprintf(str, "%u", i));
+ }
+
+ if (t != win)
+ XCopyArea (dpy, t, win, st->copy_gc, 0, 0, w, h, 0, 0);
+
+ testx11_graph_rotator (st);
+ testx11_show_orientation (st);
+
+ ++st->frame;
+ return 1000000 / 20;
+}
+
+static void
+testx11_reshape (Display *dpy, Window window, void *st_raw,
+ unsigned int w, unsigned int h)
+{
+ struct testx11 *st = (struct testx11 *)st_raw;
+ st->xgwa.width = w;
+ st->xgwa.height = h;
+# ifndef HAVE_JWXYZ
+ XFreePixmap (st->dpy, st->backbuffer);
+# endif
+ create_backbuffer (st);
+ make_clip_mask (st);
+}
+
+static Bool
+testx11_event (Display *dpy, Window window, void *st_raw, XEvent *event)
+{
+ struct testx11 *st = (struct testx11 *) st_raw;
+
+ Bool handled = False;
+
+ switch (event->xany.type)
+ {
+ case KeyPress:
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ')
+ handled = toggle_antialiasing (st);
+
+ if (c >= '0' && c <= '9' && c < '0' + mode_count) {
+ st->mode = c - '0';
+ handled = True;
+ }
+ }
+ break;
+
+ case ButtonPress:
+ if (event->xbutton.y >= st->xgwa.height - button_pad * 2 - button_size) {
+ int i = (event->xbutton.x - button_pad / 2) / (button_pad + button_size) + 1;
+ if (i && i < mode_count) {
+ st->mode = i;
+ handled = True;
+ }
+ }
+
+ if (!handled)
+ handled = toggle_antialiasing (st);
+ break;
+ }
+
+ return handled;
+}
+
+static void
+testx11_free (Display *dpy, Window window, void *st_raw)
+{
+ /* Omitted for the sake of brevity. */
+}
+
+XSCREENSAVER_MODULE_2 ("TestX11", testx11, testx11)
diff --git a/hacks/thornbird.c b/hacks/thornbird.c
new file mode 100644
index 0000000..07e0cbd
--- /dev/null
+++ b/hacks/thornbird.c
@@ -0,0 +1,264 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* thornbird --- continuously varying Thornbird set */
+
+#if 0
+static const char sccsid[] = "@(#)thornbird.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "thornbird" shows a view of the "Bird in a Thornbush" fractal,
+ * continuously varying the three free parameters.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 04-Jun-1999: 3D tumble added by Tim Auckland
+ * 31-Jul-1997: Adapted from discrete.c Copyright (c) 1996 by Tim Auckland
+ */
+
+#ifdef STANDALONE
+# define MODE_thornbird
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 100 \n" \
+ "*cycles: 400 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ "*lowrez: True \n" \
+
+# define BRIGHT_COLORS
+# define release_thornbird 0
+# define reshape_thornbird 0
+# define thornbird_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_thornbird
+
+ENTRYPOINT ModeSpecOpt thornbird_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct thornbird_description =
+{"thornbird", "init_thornbird", "draw_thornbird", (char *) NULL,
+ "refresh_thornbird", "init_thornbird", "free_thornbird", &thornbird_opts,
+ 1000, 800, 16, 1, 64, 1.0, "",
+ "Shows an animated Bird in a Thorn Bush fractal map", 0, NULL};
+
+#endif
+
+#define balance_rand(v) ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
+
+typedef struct {
+ int maxx;
+ int maxy; /* max of the screen */
+ double a;
+ double b;
+ double c;
+ double d;
+ double e;
+ double i;
+ double j; /* thornbird parameters */
+ struct {
+ double f1;
+ double f2;
+ } liss;
+ struct {
+ double theta;
+ double dtheta;
+ double phi;
+ double dphi;
+ } tumble;
+ int inc;
+ int pix;
+ int count;
+ int nbuffers;
+ XPoint **pointBuffer; /* pointer for XDrawPoints */
+} thornbirdstruct;
+
+static thornbirdstruct *thornbirds = (thornbirdstruct *) NULL;
+
+ENTRYPOINT void
+free_thornbird(ModeInfo * mi)
+{
+ thornbirdstruct *hp = &thornbirds[MI_SCREEN(mi)];
+ if (hp->pointBuffer != NULL) {
+ int buffer;
+
+ for (buffer = 0; buffer < hp->nbuffers; buffer++)
+ if (hp->pointBuffer[buffer] != NULL)
+ (void) free((void *) hp->pointBuffer[buffer]);
+ (void) free((void *) hp->pointBuffer);
+ hp->pointBuffer = (XPoint **) NULL;
+ }
+}
+
+ENTRYPOINT void
+init_thornbird (ModeInfo * mi)
+{
+ thornbirdstruct *hp;
+
+ MI_INIT (mi, thornbirds);
+ hp = &thornbirds[MI_SCREEN(mi)];
+
+
+ hp->maxx = MI_WIDTH(mi);
+ hp->maxy = MI_HEIGHT(mi);
+
+ hp->b = 0.1;
+ hp->i = hp->j = 0.1;
+
+ hp->pix = 0;
+ hp->inc = 0;
+
+ hp->nbuffers = MI_CYCLES(mi);
+
+ if (hp->pointBuffer == NULL)
+ if ((hp->pointBuffer = (XPoint **) calloc(MI_CYCLES(mi),
+ sizeof (XPoint *))) == NULL) {
+ free_thornbird(mi);
+ return;
+ }
+
+ if (hp->pointBuffer[0] == NULL)
+ if ((hp->pointBuffer[0] = (XPoint *) malloc(MI_COUNT(mi) *
+ sizeof (XPoint))) == NULL) {
+ free_thornbird(mi);
+ return;
+ }
+
+ /* select frequencies for parameter variation */
+ hp->liss.f1 = LRAND() % 5000;
+ hp->liss.f2 = LRAND() % 2000;
+
+ /* choose random 3D tumbling */
+ hp->tumble.theta = 0;
+ hp->tumble.phi = 0;
+ hp->tumble.dtheta = balance_rand(0.001);
+ hp->tumble.dphi = balance_rand(0.005);
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+
+ hp->count = 0;
+}
+
+
+ENTRYPOINT void
+draw_thornbird(ModeInfo * mi)
+{
+ Display *dsp = MI_DISPLAY(mi);
+ Window win = MI_WINDOW(mi);
+ double oldj, oldi;
+ int batchcount = MI_COUNT(mi);
+ int k;
+ XPoint *xp;
+ GC gc = MI_GC(mi);
+ int erase;
+ int current;
+
+ double sint, cost, sinp, cosp;
+ thornbirdstruct *hp;
+
+ if (thornbirds == NULL)
+ return;
+ hp = &thornbirds[MI_SCREEN(mi)];
+ if (hp->pointBuffer == NULL)
+ return;
+
+ erase = (hp->inc + 1) % MI_CYCLES(mi);
+ current = hp->inc % MI_CYCLES(mi);
+ k = batchcount;
+
+
+ xp = hp->pointBuffer[current];
+
+ /* vary papameters */
+ hp->a = 1.99 + (0.4 * sin(hp->inc / hp->liss.f1) +
+ 0.05 * cos(hp->inc / hp->liss.f2));
+ hp->c = 0.80 + (0.15 * cos(hp->inc / hp->liss.f1) +
+ 0.05 * sin(hp->inc / hp->liss.f2));
+
+ /* vary view */
+ hp->tumble.theta += hp->tumble.dtheta;
+ hp->tumble.phi += hp->tumble.dphi;
+ sint = sin(hp->tumble.theta);
+ cost = cos(hp->tumble.theta);
+ sinp = sin(hp->tumble.phi);
+ cosp = cos(hp->tumble.phi);
+
+ while (k--) {
+ oldj = hp->j;
+ oldi = hp->i;
+
+ hp->j = oldi;
+ hp->i = (1 - hp->c) * cos(M_PI * hp->a * oldj) + hp->c * hp->b;
+ hp->b = oldj;
+
+ xp->x = (short)
+ (hp->maxx / 2 * (1
+ + sint*hp->j + cost*cosp*hp->i - cost*sinp*hp->b));
+ xp->y = (short)
+ (hp->maxy / 2 * (1
+ - cost*hp->j + sint*cosp*hp->i - sint*sinp*hp->b));
+ xp++;
+ }
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1;
+ if (hp->pointBuffer[erase] == NULL) {
+ if ((hp->pointBuffer[erase] = (XPoint *) malloc(MI_COUNT(mi) *
+ sizeof (XPoint))) == NULL) {
+ free_thornbird(mi);
+ return;
+ }
+ } else {
+ XSetForeground(dsp, gc, MI_BLACK_PIXEL(mi));
+ XDrawPoints(dsp, win, gc, hp->pointBuffer[erase],
+ batchcount, CoordModeOrigin);
+ }
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
+#if 0
+ if (erase == 0) /* change colours after "cycles" cycles */
+#else
+ if (!((hp->inc + 1) % (1 + (MI_CYCLES(mi) / 3)))) /* jwz: sooner */
+#endif
+ if (++hp->pix >= MI_NPIXELS(mi))
+ hp->pix = 0;
+ } else
+ XSetForeground(dsp, gc, MI_WHITE_PIXEL(mi));
+
+ XDrawPoints(dsp, win, gc, hp->pointBuffer[current],
+ batchcount, CoordModeOrigin);
+ hp->inc++;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_thornbird (ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+
+XSCREENSAVER_MODULE ("Thornbird", thornbird)
+
+#endif /* MODE_thornbird */
diff --git a/hacks/thornbird.man b/hacks/thornbird.man
new file mode 100644
index 0000000..e063b1a
--- /dev/null
+++ b/hacks/thornbird.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+thornbird - Bird in a Thornbush fractal.
+.SH SYNOPSIS
+.B thornbird
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Displays a view of the "Bird in a Thornbush" fractal.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Points. 10 - 1000. Default: 800.
+.TP 8
+.B \-cycles \fInumber\fP
+Thickness. 2 - 500. Default: 16.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tim Auckland. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tim Auckland.
diff --git a/hacks/triangle.c b/hacks/triangle.c
new file mode 100644
index 0000000..e48c087
--- /dev/null
+++ b/hacks/triangle.c
@@ -0,0 +1,354 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* triangle --- create a triangle-mountain */
+
+#if 0
+static const char sccsid[] = "@(#)triangle.c 4.04 97/07/28 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 by Tobias Gloth
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 10-Mar-96: re-arranged and re-formatted the code for appearance and
+ * to make common subroutines. Simplified.
+ * Ron Hitchens <ron@idiom.com>
+ * 07-Mar-96: Removed internal delay code, set MI_PAUSE(mi) for inter-scene
+ * delays. No other delays are needed here.
+ * Made pause time sensitive to value of cycles (in 10ths of a
+ * second). Removed (hopefully) all references to globals.
+ * Ron Hitchens <ron@idiom.com>
+ * 27-Feb-96: Undid the changes listed below. Added ModeInfo argument.
+ * Implemented delay between scenes using the MI_PAUSE(mi)
+ * scheme. Ron Hitchens <ron@idiom.com>
+ * 27-Dec-95: Ron Hitchens <ron@idiom.com>
+ * Modified logic of draw_triangle() to provide a delay
+ * (sensitive to the value of cycles) between each iteration.
+ * Because this mode is so compute intensive, when the new
+ * event loop adjusted the delay to compensate, this mode had
+ * almost no delay time left. This change pauses between each
+ * new landscape, but could still be done better (it is not
+ * sensitive to input events while drawing, for example).
+ * 03-Nov-95: Many changes (hopefully some good ones) by David Bagley
+ * 01-Oct-95: Written by Tobias Gloth
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*ncolors: 128 \n" \
+ "*fpsSolid: true \n" \
+
+# define SMOOTH_COLORS
+# define free_triangle 0
+# define release_triangle 0
+# define reshape_triangle 0
+# define triangle_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ENTRYPOINT ModeSpecOpt triangle_opts =
+{0, NULL, 0, NULL, NULL};
+
+#define MAX_STEPS 8
+#define MAX_SIZE (1<<MAX_STEPS)
+#define MAX_LEVELS 1000
+
+#undef TOP /* FTSO AIX */
+
+#define DELTA 0.4
+#define LEFT (-0.25)
+#define RIGHT 1.25
+#define TOP 0.3
+#define BOTTOM 1.0
+#define BLUE 45 /* Just the right shade of blue */
+
+#define BACKFACE_REMOVAL
+
+#define DISPLACE(h,d) ((h)/2+LRAND()/(MAXRAND/(2*(d)+1))-d)
+
+typedef struct {
+ int width;
+ int height;
+ int size;
+ int steps;
+ int stage;
+ int init_now;
+ int fast;
+ int i;
+ int j;
+ int d;
+ short level[MAX_LEVELS];
+ int xpos[2 * MAX_SIZE + 1];
+ int ypos[MAX_SIZE + 1];
+ short H[(MAX_SIZE + 1) * (MAX_SIZE + 2) / 2];
+ short *h[MAX_SIZE + 1];
+ short delta[MAX_STEPS];
+} trianglestruct;
+
+static trianglestruct *triangles = NULL;
+
+static
+void
+draw_atriangle(ModeInfo * mi, XPoint * p, int y_0, int y_1, int y_2, double dinv)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+
+ if (MI_NCOLORS(mi) > 2) { /* color */
+ int dmax, dmin;
+ long color;
+
+ dmin = MIN(y_0, y_1);
+ dmin = MIN(dmin, y_2);
+ dmax = MAX(y_0, y_1);
+ dmax = MAX(dmax, y_2);
+
+ if (dmax == 0) {
+ color = BLUE;
+ } else {
+ color = MI_NCOLORS(mi) -
+ (int) ((double) MI_NCOLORS(mi) / M_PI_2 * atan(dinv * (dmax - dmin)));
+ }
+
+ XSetForeground(display, gc, mi->colors[color % MI_NCOLORS(mi)].pixel);
+ XFillPolygon(display, window, gc, p, 3, Convex, CoordModeOrigin);
+ } else {
+ /* mono */
+#ifdef BACKFACE_REMOVAL
+ XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+ XFillPolygon(display, window, gc, p, 3, Convex, CoordModeOrigin);
+#endif
+ XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+ XDrawLine(display, window, gc, p[0].x, p[0].y, p[1].x, p[1].y);
+ XDrawLine(display, window, gc, p[1].x, p[1].y, p[2].x, p[2].y);
+ XDrawLine(display, window, gc, p[2].x, p[2].y, p[0].x, p[0].y);
+ }
+}
+
+static
+void
+calc_points1(trianglestruct * tp, int d, int *y0_p, int *y1_p, int *y2_p, XPoint * p)
+{
+ *y0_p = tp->level[MAX(tp->h[tp->i][tp->j], 0)];
+ *y1_p = tp->level[MAX(tp->h[tp->i + d][tp->j], 0)];
+ *y2_p = tp->level[MAX(tp->h[tp->i][tp->j + d], 0)];
+
+ p[0].x = tp->xpos[2 * tp->i + tp->j];
+ p[1].x = tp->xpos[2 * (tp->i + d) + tp->j];
+ p[2].x = tp->xpos[2 * tp->i + (tp->j + d)];
+
+ p[0].y = tp->ypos[tp->j] - *y0_p;
+ p[1].y = tp->ypos[tp->j] - *y1_p;
+ p[2].y = tp->ypos[tp->j + d] - *y2_p;
+}
+
+static
+void
+calc_points2(trianglestruct * tp, int d, int *y0_p, int *y1_p, int *y2_p, XPoint * p)
+{
+ *y0_p = tp->level[MAX(tp->h[tp->i + d][tp->j], 0)];
+ *y1_p = tp->level[MAX(tp->h[tp->i + d][tp->j + d], 0)];
+ *y2_p = tp->level[MAX(tp->h[tp->i][tp->j + d], 0)];
+
+ p[0].x = tp->xpos[2 * (tp->i + d) + tp->j];
+ p[1].x = tp->xpos[2 * (tp->i + d) + (tp->j + d)];
+ p[2].x = tp->xpos[2 * tp->i + (tp->j + d)];
+
+ p[0].y = tp->ypos[tp->j] - *y0_p;
+ p[1].y = tp->ypos[tp->j + d] - *y1_p;
+ p[2].y = tp->ypos[tp->j + d] - *y2_p;
+}
+
+
+static
+void
+draw_mesh(ModeInfo * mi, trianglestruct * tp, int d, int count)
+{
+ XPoint p[3];
+ int first = 1;
+ int y_0, y_1, y_2;
+ double dinv = 0.2 / d;
+
+ if ((tp->j == 0) && (tp->i == 0)) {
+#if 0 /* jwz */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#else
+ {
+ int x = 0;
+ int y = 0;
+ int x2 = MI_WIN_WIDTH(mi);
+ int y2 = tp->ypos[0];
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ x, y, x2, y2);
+ }
+#endif
+ }
+ for (; (tp->j < tp->size) && (count > 0); tp->j += ((count) ? d : 0)) {
+ for (tp->i = (first) ? tp->i : 0, first = 0;
+ (tp->i < MAX_SIZE - tp->j) && (count > 0);
+ tp->i += d, count--) {
+ if (tp->i + tp->j < tp->size) {
+ calc_points1(tp, d, &y_0, &y_1, &y_2, p);
+ draw_atriangle(mi, p, y_0, y_1, y_2, dinv);
+ }
+ if (tp->i + tp->j + d < tp->size) {
+ calc_points2(tp, d, &y_0, &y_1, &y_2, p);
+ draw_atriangle(mi, p, y_0, y_1, y_2, dinv);
+ }
+ }
+ }
+
+ if (tp->j == tp->size) {
+ tp->init_now = 1;
+ }
+}
+
+ENTRYPOINT void
+init_triangle (ModeInfo * mi)
+{
+ trianglestruct *tp;
+ short *tmp;
+ int i, dim, one;
+
+ MI_INIT (mi, triangles);
+ tp = &triangles[MI_SCREEN(mi)];
+
+ tp->width = MI_WIN_WIDTH(mi);
+ tp->height = MI_WIN_HEIGHT(mi);
+ tp->init_now = 1;
+ tp->fast = 2;
+
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+
+
+ tp->steps = MAX_STEPS;
+ do {
+ tp->size = 1 << --tp->steps;
+ } while (tp->size * 5 > tp->width);
+ tmp = tp->H;
+ for (i = 0; i < tp->size + 1; i++) {
+ tp->h[i] = tmp;
+ tmp += (tp->size) + 1 - i;
+ }
+
+ tp->stage = -1;
+ dim = MIN(tp->width, tp->height);
+
+ for (i = 0; i < 2 * tp->size + 1; i++) {
+ tp->xpos[i] = (short) ((((double) i)
+ / ((double) (2 * tp->size)) * (RIGHT - LEFT) + LEFT)
+ * dim) + (tp->width - dim) / 2;
+ }
+
+ for (i = 0; i < (tp->size + 1); i++) {
+ tp->ypos[i] = (short) ((((double) i)
+ / ((double) tp->size) * (BOTTOM - TOP) + TOP) * dim)
+ + (tp->height - dim) / 2;
+ }
+
+ for (i = 0; i < tp->steps; i++) {
+ tp->delta[i] = ((short) (DELTA * dim)) >> i;
+ }
+
+ one = tp->delta[0];
+
+ if (one > 0)
+ for (i = 0; i < MAX_LEVELS; i++) {
+ tp->level[i] = (i * i) / one;
+ }
+}
+
+ENTRYPOINT void
+draw_triangle (ModeInfo * mi)
+{
+ trianglestruct *tp = &triangles[MI_SCREEN(mi)];
+ int d, d2, i, j, delta;
+
+ if (!tp->init_now) {
+ draw_mesh(mi, tp, tp->d / 2, MAX_SIZE / tp->d);
+
+ /* The init_now flag will pop up when the scene is complete.
+ * Cycles specifies how long to wait, in 1/10 secs.
+ TODO: This is wrong for multi-screens ***
+ */
+ if (tp->init_now) {
+#ifndef STANDALONE
+ MI_PAUSE(mi) = 2000000;
+#else
+ if (tp->stage == -1)
+ {
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+ if (!mono_p)
+ {
+ free_colors(mi->xgwa.screen, mi->xgwa.colormap, mi->colors,
+ mi->npixels);
+ mi->npixels =
+ get_integer_resource (mi->dpy, "ncolors", "Integer");
+ make_smooth_colormap (mi->xgwa.screen,
+ mi->xgwa.visual, mi->xgwa.colormap,
+ mi->colors, &mi->npixels,
+ True, &mi->writable_p, True);
+ }
+ }
+#endif
+ }
+ return;
+ }
+ if (tp->delta[0] > 0) {
+ if (!(++tp->stage)) {
+ tp->h[0][0] = (short int) MAX(0, DISPLACE(0, tp->delta[0]));
+ tp->h[tp->size][0] = (short int) MAX(0, DISPLACE(0, tp->delta[0]));
+ tp->h[0][tp->size] = (short int) MAX(0, DISPLACE(0, tp->delta[0]));
+ } else {
+ d = 2 << (tp->steps - tp->stage);
+ d2 = d / 2;
+ delta = tp->delta[tp->stage - 1];
+
+ for (i = 0; i < tp->size; i += d) {
+ for (j = 0; j < (tp->size - i); j += d) {
+ tp->h[i + d2][j] = (short int) DISPLACE(tp->h[i][j] +
+ tp->h[i + d][j], delta);
+ tp->h[i][j + d2] = (short int) DISPLACE(tp->h[i][j] +
+ tp->h[i][j + d], delta);
+ tp->h[i + d2][j + d2] = (short int) DISPLACE(tp->h[i + d][j] +
+ tp->h[i][j + d], delta);
+ }
+
+ tp->init_now = 0;
+ tp->i = 0;
+ tp->j = 0;
+ tp->d = d;
+ }
+ }
+ }
+ if (tp->stage == tp->steps) {
+ tp->stage = -1;
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_triangle (ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Triangle", triangle)
diff --git a/hacks/triangle.man b/hacks/triangle.man
new file mode 100644
index 0000000..ec8eadc
--- /dev/null
+++ b/hacks/triangle.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+triangle - random mountains using iterative subdivision of triangles.
+.SH SYNOPSIS
+.B triangle
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Generates random mountain ranges using iterative subdivision of triangles.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 128.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tobias Gloth. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tobias Gloth.
diff --git a/hacks/truchet.c b/hacks/truchet.c
new file mode 100644
index 0000000..d0276f7
--- /dev/null
+++ b/hacks/truchet.c
@@ -0,0 +1,536 @@
+/* truchet --- curved and straight tilings
+ * Copyright (c) 1998 Adrian Likins <adrian@gimp.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This screensaver draws two varieties of truchet patterns, a curved one and
+ a straight one. There are lots and lots of command line options to play
+ with.
+
+ If your running remotely or on a slow machine or slow xserver, some of the
+ settings will be way too much. The default settings should be okay though.
+
+ This screensaver doesnt use anything bizarre or special at all, just a few
+ standard xlib calls.
+
+ A few suggested commandline combos..All these were tested on a k6-200
+ running XFree86 3.3 on a ark2000, so your mileage may vary...
+
+ truchet -delay 200 -no-curves
+ truchet -delay 500 -no-curves -square -no-erase
+ truchet -delay 500 -no-erase -square -erase-count 5
+ truchet -scroll
+ truchet -scroll -no-erase -anim-step-size 9
+ truchet -delay 200 -no-angles -min-width 36 -max-width 36
+ truchet -delay 200 -no-curves -min-width 12 -max-width 12
+ truchet -delay 200 -no-curves -min-width 36 -max-width 36 -no-erase
+ truchet -delay 100 -min-width 256 -max-width 512 -no-erase \
+ -min-linewidth 96 -root
+ truchet -min-width 64 -max-width 128 -no-erase -max-linewidth 4 \
+ -root -no-angles
+ truchet -min-width 64 -max-width 128 -no-erase -max-linewidth 4 \
+ -root -no-curves -delay 25
+ */
+
+#include "screenhack.h"
+
+#define MAXRATIO 2
+
+static const char *truchet_defaults [] = {
+ "*minWidth: 40",
+ "*minHeight: 40",
+ "*max-Width: 150",
+ "*max-Height: 150",
+ "*maxLineWidth: 25",
+ "*minLineWidth: 2",
+ "*erase: True",
+ "*eraseCount: 25",
+ "*square: True",
+ "*delay: 400000",
+ "*curves: True",
+ "*angles: True",
+ "*scroll: False",
+ "*scroll-overlap: 400",
+ "*anim-delay: 100",
+ "*anim-step-size: 3",
+ "*randomize: true",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+/* options passed to this program */
+static XrmOptionDescRec truchet_options [] = {
+ { "-min-width", ".minWidth", XrmoptionSepArg, 0 },
+ { "-max-height", ".max-Height", XrmoptionSepArg, 0 },
+ { "-max-width", ".max-Width", XrmoptionSepArg, 0 },
+ { "-min-height", ".minHeight", XrmoptionSepArg, 0 },
+ { "-max-linewidth", ".maxLineWidth", XrmoptionSepArg, 0 },
+ { "-min-linewidth", ".minLineWidth", XrmoptionSepArg, 0 },
+ { "-erase", ".erase", XrmoptionNoArg, "True" },
+ { "-no-erase", ".erase", XrmoptionNoArg, "False" },
+ { "-erase-count", ".eraseCount", XrmoptionSepArg, 0 },
+ { "-square", ".square", XrmoptionNoArg, "True" },
+ { "-not-square", ".square", XrmoptionNoArg, "False" },
+ { "-curves", ".curves", XrmoptionNoArg, "True" },
+ { "-angles", ".angles", XrmoptionNoArg, "True" },
+ { "-no-angles", ".angles", XrmoptionNoArg, "False" },
+ { "-no-curves", ".curves", XrmoptionNoArg, "False" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-scroll", ".scroll", XrmoptionNoArg, "True" },
+ { "-scroll-overlap", ".scroll-overlap", XrmoptionSepArg, 0 },
+ { "-anim-delay", ".anim-delay", XrmoptionSepArg, 0 },
+ { "-anim-step-size", ".anim-step-size", XrmoptionSepArg, 0 },
+ { "-randomize", ".randomize", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ XGCValues gcv;
+ GC agc, bgc;
+ int linewidth;
+ int width, height;
+ XWindowAttributes xgwa;
+ Pixmap frame;
+ int overlap;
+
+ int maxlinewidth;
+ int minlinewidth;
+ int minwidth;
+ int minheight;
+ int max_height;
+ int max_width;
+ int delay;
+ int count;
+ int anim_delay;
+ int anim_step_size;
+
+ Colormap cmap;
+ XColor fgc;
+ Bool curves;
+ Bool square;
+ Bool angles;
+ Bool erase;
+ Bool eraseCount;
+ Bool scroll;
+ int scrolling;
+};
+
+static void draw_truchet(struct state *st);
+static void draw_angles(struct state *st);
+static void scroll_area(struct state *st, int step_size);
+
+static void draw_angles(struct state *st)
+{
+ int cx = 0, cy = 0;
+
+ while((st->xgwa.height+st->overlap) > cy*st->height)
+ {
+ while((st->xgwa.width+st->overlap) > cx*st->width)
+ {
+ if(random()%2)
+ {
+ /* block1 */
+ XDrawLine(st->dpy,st->frame,st->agc,
+ (cx*st->width)+(st->width/2),
+ (cy*st->height),
+ (cx*st->width)+(st->width),
+ (cy*st->height)+(st->height/2));
+ XDrawLine(st->dpy,st->frame,st->agc,
+ (cx*st->width),
+ (cy*st->height)+(st->height/2),
+ (cx*st->width)+(st->width/2),
+ (cy*st->height)+(st->height));
+ }
+ else
+ {
+ /* block 2 */
+ XDrawLine(st->dpy,st->frame,st->agc,
+ (cx*st->width)+(st->width/2),
+ (cy*st->height),
+ (cx*st->width),
+ (cy*st->height)+(st->height/2));
+ XDrawLine(st->dpy,st->frame,st->agc,
+ (cx*st->width)+(st->width),
+ (cy*st->height)+(st->height/2),
+ (cx*st->width)+(st->width/2),
+ (cy*st->height)+(st->height));
+ }
+ cx++;
+ }
+ cy++;
+ cx=0;
+ }
+}
+
+
+static void draw_truchet(struct state *st)
+{
+ int cx = 0, cy = 0;
+
+ while(st->xgwa.height+st->overlap > cy*st->height)
+ {
+ while(st->xgwa.width+st->overlap > cx*st->width)
+ {
+ if(random()%2)
+ {
+ /* block1 */
+ XDrawArc(st->dpy, st->frame, st->agc,
+ ((cx*st->width)-(st->width/2)),
+ ((cy*st->height)-(st->height/2)),
+ st->width,
+ st->height,
+ 0, -5760);
+ XDrawArc(st->dpy,st->frame, st->agc,
+ ((cx*st->width)+(st->width/2)),
+ ((cy*st->height)+(st->height/2)),
+ st->width,
+ st->height,
+ 11520,
+ -5760);
+ }
+ else
+ {
+ /* block 2 */
+ XDrawArc(st->dpy,st->frame,st->agc,
+ ((cx*st->width)+(st->width/2)),
+ ((cy*st->height)-(st->height/2)),
+ st->width,
+ st->height,
+ 17280,
+ -5760);
+ XDrawArc(st->dpy,st->frame,st->agc,
+ ((cx*st->width)-(st->width/2)),
+ ((cy*st->height)+(st->height/2)),
+ st->width,
+ st->height,
+ 0,
+ 5760);
+ }
+ cx++;
+ }
+ cy++;
+ cx=0;
+ }
+}
+
+
+static void scroll_area(struct state *st, int step_size)
+{
+ int scrollcount_x;
+ int scrollcount_y;
+ int offset;
+ int scroll;
+ int direction;
+ int progress;
+
+ offset=st->overlap/2;
+ scroll=st->overlap/4;
+
+ /* This runs in a loop, starting with
+ * st->scrolling = (scroll / st->anim_step_size) * 4 - 1;
+ * and going all the way down to st->scrolling = 0.
+ */
+
+ /* if anyone knows a good way to generate
+ * a more random scrolling motion... */
+
+ direction = st->scrolling / (scroll / st->anim_step_size);
+ progress = (st->scrolling % (scroll / st->anim_step_size)) * st->anim_step_size;
+
+ if (direction & 1) {
+ scrollcount_x = progress - scroll;
+ scrollcount_y = progress;
+ } else {
+ scrollcount_x = -progress;
+ scrollcount_y = progress - scroll;
+ }
+
+ if (direction & 2) {
+ scrollcount_x = -scrollcount_x;
+ scrollcount_y = -scrollcount_y;
+ }
+
+ XCopyArea(st->dpy, st->frame, st->window, st->agc,scrollcount_x+offset,scrollcount_y+offset, st->xgwa.width, st->xgwa.height, 0,0);
+}
+
+
+static void *
+truchet_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->maxlinewidth = get_integer_resource (st->dpy, "maxLineWidth", "Integer");
+ st->minlinewidth = get_integer_resource (st->dpy, "minLineWidth", "Integer");
+ st->minwidth = get_integer_resource (st->dpy, "minWidth", "Integer");
+ st->minheight = get_integer_resource (st->dpy, "minHeight", "Integer");
+ st->max_width = get_integer_resource (st->dpy, "max-Width", "Integer");
+ st->max_height = get_integer_resource (st->dpy, "max-Height", "Integer" );
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->eraseCount = get_integer_resource (st->dpy, "eraseCount", "Integer");
+ st->square = get_boolean_resource (st->dpy, "square", "Boolean");
+ st->curves = get_boolean_resource (st->dpy, "curves", "Boolean");
+ st->angles = get_boolean_resource (st->dpy, "angles", "Boolean");
+ st->erase = get_boolean_resource (st->dpy, "erase", "Boolean");
+ st->scroll = get_boolean_resource (st->dpy, "scroll", "Boolean");
+ st->overlap = get_integer_resource (st->dpy, "scroll-overlap", "Integer");
+ st->anim_delay = get_integer_resource (st->dpy, "anim-delay", "Integer");
+ st->anim_step_size = get_integer_resource (st->dpy, "anim-step-size", "Integer");
+
+ if (get_boolean_resource(st->dpy, "randomize", "Randomize"))
+ {
+ int i = (random() % 12);
+ switch(i) {
+ case 0:
+ break;
+ case 1:
+ st->curves = False;
+ break;
+ case 2:
+ st->curves = False;
+ st->square = True;
+ st->erase = False;
+ break;
+ case 3:
+ st->square = True;
+ st->erase = False;
+ st->eraseCount = 5;
+ break;
+ case 4:
+ st->scroll = True;
+ break;
+ case 5:
+ st->scroll = True;
+ st->erase = False;
+ st->anim_step_size = 9;
+ break;
+ case 6:
+ st->angles = False;
+ st->minwidth = st->max_width = 36;
+ break;
+ case 7:
+ st->curves = False;
+ st->minwidth = st->max_width = 12;
+ break;
+ case 8:
+ st->curves = False;
+ st->erase = False;
+ st->minwidth = st->max_width = 36;
+ break;
+ case 9:
+ st->erase = False;
+ st->minwidth = 256;
+ st->max_width = 512;
+ st->minlinewidth = 96;
+ break;
+ case 10:
+ st->angles = False;
+ st->minwidth = 64;
+ st->max_width = 128;
+ st->maxlinewidth = 4;
+ break;
+ case 11:
+ st->curves = False;
+ st->minwidth = 64;
+ st->max_width = 128;
+ st->maxlinewidth = 4;
+ break;
+ default:
+ abort();
+ break;
+ }
+ }
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->gcv.foreground = BlackPixel(st->dpy,0);
+ st->gcv.background = WhitePixel(st->dpy,0);
+ st->gcv.line_width = 25;
+ st->cmap = st->xgwa.colormap;
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+
+ st->bgc = XCreateGC (st->dpy, st->window, GCForeground, &st->gcv);
+ st->agc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ XFillRectangle(st->dpy, st->window, st->bgc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+
+ st->width=60;
+ st->height=60;
+ st->linewidth=1;
+ st->count=0;
+ XSetForeground(st->dpy, st->agc, st->gcv.background);
+
+
+ st->frame = XCreatePixmap(st->dpy,st->window, st->xgwa.width+st->overlap, st->xgwa.height+st->overlap, st->xgwa.depth);
+ XFillRectangle(st->dpy, st->frame, st->bgc, 0, 0,
+ st->xgwa.width + st->overlap,
+ st->xgwa.height + st->overlap);
+
+ return st;
+}
+
+static unsigned long
+truchet_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->scrolling)
+ {
+ st->scrolling--;
+ scroll_area(st, st->anim_step_size);
+ return st->anim_delay*1000;
+ }
+
+ if (!mono_p)
+ {
+ /* XXX there are probably bugs with this. */
+ /* could be...I just borrowed this code from munch */
+
+ st->fgc.red = random() % 65535;
+ st->fgc.green = random() % 65535;
+ st->fgc.blue = random() % 65535;
+
+ if (XAllocColor(st->dpy, st->cmap, &st->fgc))
+ {
+ XSetForeground(st->dpy, st->agc, st->fgc.pixel);
+ }
+ else
+ {
+ /* use white if all else fails */
+ XSetForeground(st->dpy,st->agc, st->gcv.background);
+ }
+ }
+
+
+
+
+ /* generate a random line width */
+ st->linewidth=(random()% st->maxlinewidth);
+
+ /* check for lower bound */
+ if(st->linewidth < st->minlinewidth)
+ st->linewidth = st->minlinewidth;
+
+ /* try to get an odd linewidth as it seem to work a little better */
+ if(st->linewidth%2)
+ st->linewidth++;
+
+ /* grab a random height and width */
+ st->width=(random()%st->max_width);
+ st->height=(random()%st->max_height);
+
+ /* make sure we dont get a 0 height or width */
+ if(st->width == 0 || st->height == 0)
+ {
+ st->height=st->max_height;
+ st->width=st->max_width;
+ }
+
+
+ /* check for min height and width */
+ if(st->height < st->minheight)
+ {
+ st->height=st->minheight;
+ }
+ if(st->width < st->minwidth)
+ {
+ st->width=st->minwidth;
+ }
+
+ /* if tiles need to be square, fix it... */
+ if(st->square)
+ st->height=st->width;
+
+ /* check for sane aspect ratios */
+ if((st->width/st->height) > MAXRATIO)
+ st->height=st->width;
+ if((st->height/st->width) > MAXRATIO)
+ st->width=st->height;
+
+ /* to avoid linewidths of zero */
+ if(st->linewidth == 0 || st->linewidth < st->minlinewidth)
+ st->linewidth = st->minlinewidth;
+
+ /* try to keep from getting line widths that would be too big */
+ if(st->linewidth > 0 && st->linewidth >= (st->height/5))
+ st->linewidth = st->height/5;
+
+ XSetLineAttributes(st->dpy, st->agc, st->linewidth, LineSolid, CapRound, JoinRound);
+
+ if(st->erase || (st->count >= st->eraseCount))
+ {
+ /* XClearWindow(dpy,window); */
+ XFillRectangle(st->dpy, st->frame, st->bgc, 0, 0, st->xgwa.width+st->overlap, st->xgwa.height+st->overlap);
+ st->count=0;
+ }
+
+ if(!st->scroll)
+ st->overlap=0;
+
+ /* do the fun stuff...*/
+ if(st->curves && st->angles)
+ {
+ if(random()%2)
+ draw_truchet(st);
+ else
+ draw_angles(st);
+ }
+ else if(st->curves && !st->angles)
+ draw_truchet(st);
+ else if(!st->curves && st->angles)
+ draw_angles(st);
+
+
+ st->count++;
+
+ if(st->scroll)
+ {
+ st->scrolling = ((st->overlap / 4) / st->anim_step_size) * 4;
+ return 0;
+ }
+
+ XCopyArea(st->dpy,st->frame,st->window,st->agc,0,0,st->xgwa.width,st->xgwa.height,0,0);
+
+ return st->delay;
+}
+
+static void
+truchet_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+truchet_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+truchet_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+XSCREENSAVER_MODULE ("Truchet", truchet)
+
diff --git a/hacks/truchet.man b/hacks/truchet.man
new file mode 100644
index 0000000..33890e6
--- /dev/null
+++ b/hacks/truchet.man
@@ -0,0 +1,139 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+truchet - draws curved or angular Truchet patterns
+.SH SYNOPSIS
+.B truchet
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP]
+[\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fImilliseconds\fP]
+[\-min\-width \fIinteger\fP] [\-min-height \fIinteger\fP] [\-max-width \fIinteger\fP]
+[\-max-height \fIinteger\fP] [\-max\-linewidth \fIinteger\fP] [\-min-linewidth \fIinteger\fP]
+[\-erase] [\-no\-erase] [\-erase\-count \fIinteger\fP] [\-square] [\-not\-square] [\-curves]
+[\-no\-curves] [\-angle] [\-no\-angles] [\-scroll] [\-scroll\-overlap \fIinteger\fP]
+[\-anim\-delay \fIinteger\fP] [\-anim\-step\-size \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fItruchet\fP program draws arc and line based Truchet patterns.
+.SH OPTIONS
+.I truchet
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+
+.TP 8
+.B \-delay \fImilliseconds\fP
+How long to wait between drawing each screenful. Default is 1 seconds.
+
+.TP 8
+.B \-min-width \fIinteger\fP
+The minimum width in pixels of each square. Default is 40.
+
+.TP 8
+.B \-min-height \fIinteger\fP
+The minimum height in pixels of each square. Default is 40.
+
+.TP 8
+.B \-max-width \fIinteger\fP
+The maximum width in pixels of each square. Default is 150.
+
+.TP 8
+.B \-max-height \fIinteger\fP
+The maximum height in pixels of each square. Default is 150.
+
+.TP 8
+.B \-max-linewidth \fIinteger\fP
+The maximum width of the lines used to draw. Default is 25.
+
+.TP 8
+.B \-min-linewidth \fIinteger\fP
+The minimum width of the lines used to draw. Default is 2.
+
+.TP 8
+.B \-erase
+
+.TP 8
+.B \-no-erase
+Whether to clear the screen after each screenful is drawn. Default is True (erase).
+
+.TP 8
+.B \-erase-count \fIinteger\fP
+The number of screenfuls to draw before erasing. Default is 25.
+
+.TP 8
+.B \-square
+
+.TP 8
+.B \-not-square
+Whether to force the tiles to be square. Default is True (square).
+
+.TP 8
+.B \-curves
+
+.TP 8
+.B \-no-curves
+Whether to draw the arc based Truchet pattern. Default is True (curves).
+
+.TP 8
+.B \-angles
+
+.TP 8
+.B \-no-angles
+Whether or not to draw the line based Truchet pattern. Default is True (angles)
+
+.TP 8
+.B \-scroll
+Use the scroll mode. Default is False.
+
+.TP 8
+.B \-scroll-overlap
+The amount to scroll from one side to another. Default is 400.
+
+.TP 8
+.B \-anim-delay
+The time to pause between each animation step. Default is 100.
+
+.TP 8
+.B \-anim-step-size
+The amount of steps to skip between each animation step. Default is 3.
+
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Adrian Likins.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Adrian Likins, 1998.
+
diff --git a/hacks/twang.c b/hacks/twang.c
new file mode 100644
index 0000000..1b2cdf6
--- /dev/null
+++ b/hacks/twang.c
@@ -0,0 +1,775 @@
+/* twang, twist around screen bits, v1.3
+ * by Dan Bornstein, danfuzz@milk.com
+ * Copyright (c) 2003 Dan Bornstein. All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * See the included man page for more details.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "xshm.h"
+
+#define FLOAT double
+
+/* random float in the range (-1..1) */
+#define RAND_FLOAT_PM1 \
+ (((FLOAT) ((random() >> 8) & 0xffff)) / ((FLOAT) 0x10000) * 2 - 1)
+
+/* random float in the range (0..1) */
+#define RAND_FLOAT_01 \
+ (((FLOAT) ((random() >> 8) & 0xffff)) / ((FLOAT) 0x10000))
+
+
+typedef struct
+{
+ int x; /* x coordinate of the center of the tile */
+ int y; /* y coordinate of the center of the tile */
+ FLOAT angle; /* angle of the tile (-pi..pi) */
+ FLOAT zoom; /* log of the zoom of the tile (-1..1) */
+ FLOAT vAngle; /* angular velocity (-pi/4..pi/4) */
+ FLOAT vZoom; /* zoomular velocity (-0.25..0.25) */
+}
+Tile;
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int delay; /* delay (usec) between iterations */
+ int duration; /* time (sec) before loading new image */
+ int maxColumns; /* the maximum number of columns of tiles */
+ int maxRows; /* the maximum number of rows of tiles */
+ int tileSize; /* the size (width and height) of a tile */
+ int borderWidth; /* the width of the border around each tile */
+ FLOAT eventChance; /* the chance, per iteration, of an interesting event happening */
+ FLOAT friction; /* friction: the fraction (0..1) by which velocity decreased per iteration */
+ FLOAT springiness; /* springiness: the fraction (0..1) of the orientation that turns into velocity towards the center */
+ FLOAT transference; /* transference: the fraction (0..1) of the orientations of orthogonal neighbors that turns into velocity (in the same direction as the orientation) */
+ int windowWidth; /* width and height of the window */
+ int windowHeight;
+ Screen *screen; /* the screen to draw on */
+ XImage *sourceImage; /* image source of stuff to draw */
+ XImage *workImage; /* work area image, used when rendering */
+
+ GC backgroundGC; /* GC for the background color */
+ GC foregroundGC; /* GC for the foreground color */
+ GC borderGC; /* GC for the border color */
+ unsigned long backgroundPixel; /* background color as a pixel value */
+ unsigned long borderPixel; /* border color as a pixel value */
+
+ Tile *tiles; /* array of tiles (left->right, top->bottom, row major) */
+ int rows; /* number of rows of tiles */
+ int columns; /* number of columns of tiles */
+
+ Tile **sortedTiles; /* array of tile pointers, sorted by zoom */
+ int tileCount; /* total number of tiles */
+
+ time_t start_time;
+ async_load_state *img_loader;
+ Pixmap pm;
+
+ XShmSegmentInfo shmInfo;
+};
+
+
+#define TILE_AT(col,row) (&st->tiles[(row) * st->columns + (col)])
+
+#define MAX_VANGLE (M_PI / 4.0)
+#define MAX_VZOOM 0.25
+
+#define RAND_ANGLE (RAND_FLOAT_PM1 * M_PI)
+#define RAND_ZOOM (RAND_FLOAT_PM1)
+#define RAND_VANGLE (RAND_FLOAT_PM1 * MAX_VANGLE)
+#define RAND_VZOOM (RAND_FLOAT_PM1 * MAX_VZOOM)
+
+
+
+/*
+ * overall setup stuff
+ */
+
+/* grab the source image */
+static void
+grabImage_start (struct state *st, XWindowAttributes *xwa)
+{
+ /* On MacOS X11, XGetImage on a Window often gets an inexplicable BadMatch,
+ possibly due to the window manager having occluded something? It seems
+ nondeterministic. Loading the image into a pixmap instead fixes it. */
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ st->pm = XCreatePixmap (st->dpy, st->window,
+ xwa->width, xwa->height, xwa->depth);
+
+ st->start_time = time ((time_t *) 0);
+ st->img_loader = load_image_async_simple (0, xwa->screen, st->window,
+ st->pm, 0, 0);
+}
+
+static void
+grabImage_done (struct state *st)
+{
+ XWindowAttributes xwa;
+ XGetWindowAttributes (st->dpy, st->window, &xwa);
+
+ st->start_time = time ((time_t *) 0);
+ if (st->sourceImage) XDestroyImage (st->sourceImage);
+ st->sourceImage = XGetImage (st->dpy, st->pm, 0, 0,
+ st->windowWidth, st->windowHeight,
+ ~0L, ZPixmap);
+
+ if (st->workImage) destroy_xshm_image (st->dpy, st->workImage,
+ &st->shmInfo);
+
+ st->workImage = create_xshm_image (st->dpy, xwa.visual, xwa.depth,
+ ZPixmap, &st->shmInfo,
+ st->windowWidth, st->windowHeight);
+}
+
+/* set up the system */
+static void setup (struct state *st)
+{
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->screen = xgwa.screen;
+ st->windowWidth = xgwa.width;
+ st->windowHeight = xgwa.height;
+
+ gcv.line_width = st->borderWidth;
+ gcv.foreground = get_pixel_resource (st->dpy, xgwa.colormap,
+ "borderColor", "BorderColor");
+ st->borderPixel = gcv.foreground;
+ st->borderGC = XCreateGC (st->dpy, st->window, GCForeground | GCLineWidth,
+ &gcv);
+
+ gcv.foreground = get_pixel_resource (st->dpy, xgwa.colormap,
+ "background", "Background");
+ st->backgroundPixel = gcv.foreground;
+ st->backgroundGC = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+
+ gcv.foreground = get_pixel_resource (st->dpy, xgwa.colormap,
+ "foreground", "Foreground");
+ st->foregroundGC = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+
+ grabImage_start (st, &xgwa);
+}
+
+
+
+/*
+ * the simulation
+ */
+
+/* event: randomize all the angular velocities */
+static void randomizeAllAngularVelocities (struct state *st)
+{
+ int c;
+ int r;
+
+ for (r = 0; r < st->rows; r++)
+ {
+ for (c = 0; c < st->columns; c++)
+ {
+ TILE_AT (c, r)->vAngle = RAND_VANGLE;
+ }
+ }
+}
+
+/* event: randomize all the zoomular velocities */
+static void randomizeAllZoomularVelocities (struct state *st)
+{
+ int c;
+ int r;
+
+ for (r = 0; r < st->rows; r++)
+ {
+ for (c = 0; c < st->columns; c++)
+ {
+ TILE_AT (c, r)->vZoom = RAND_VZOOM;
+ }
+ }
+}
+
+/* event: randomize all the velocities */
+static void randomizeAllVelocities (struct state *st)
+{
+ randomizeAllAngularVelocities (st);
+ randomizeAllZoomularVelocities (st);
+}
+
+/* event: randomize all the angular orientations */
+static void randomizeAllAngularOrientations (struct state *st)
+{
+ int c;
+ int r;
+
+ for (r = 0; r < st->rows; r++)
+ {
+ for (c = 0; c < st->columns; c++)
+ {
+ TILE_AT (c, r)->angle = RAND_ANGLE;
+ }
+ }
+}
+
+/* event: randomize all the zoomular orientations */
+static void randomizeAllZoomularOrientations (struct state *st)
+{
+ int c;
+ int r;
+
+ for (r = 0; r < st->rows; r++)
+ {
+ for (c = 0; c < st->columns; c++)
+ {
+ TILE_AT (c, r)->zoom = RAND_ZOOM;
+ }
+ }
+}
+
+/* event: randomize all the orientations */
+static void randomizeAllOrientations (struct state *st)
+{
+ randomizeAllAngularOrientations (st);
+ randomizeAllZoomularOrientations (st);
+}
+
+/* event: randomize everything */
+static void randomizeEverything (struct state *st)
+{
+ randomizeAllVelocities (st);
+ randomizeAllOrientations (st);
+}
+
+/* event: pick one tile and randomize all its stats */
+static void randomizeOneTile (struct state *st)
+{
+ int c = RAND_FLOAT_01 * st->columns;
+ int r = RAND_FLOAT_01 * st->rows;
+
+ Tile *t = TILE_AT (c, r);
+ t->angle = RAND_ANGLE;
+ t->zoom = RAND_ZOOM;
+ t->vAngle = RAND_VANGLE;
+ t->vZoom = RAND_VZOOM;
+}
+
+/* event: pick one row and randomize everything about each of its tiles */
+static void randomizeOneRow (struct state *st)
+{
+ int c;
+ int r = RAND_FLOAT_01 * st->rows;
+
+ for (c = 0; c < st->columns; c++)
+ {
+ Tile *t = TILE_AT (c, r);
+ t->angle = RAND_ANGLE;
+ t->zoom = RAND_ZOOM;
+ t->vAngle = RAND_VANGLE;
+ t->vZoom = RAND_VZOOM;
+ }
+}
+
+/* event: pick one column and randomize everything about each of its tiles */
+static void randomizeOneColumn (struct state *st)
+{
+ int c = RAND_FLOAT_01 * st->columns;
+ int r;
+
+ for (r = 0; r < st->rows; r++)
+ {
+ Tile *t = TILE_AT (c, r);
+ t->angle = RAND_ANGLE;
+ t->zoom = RAND_ZOOM;
+ t->vAngle = RAND_VANGLE;
+ t->vZoom = RAND_VZOOM;
+ }
+}
+
+/* do model event processing */
+static void modelEvents (struct state *st)
+{
+ int which;
+
+ if (RAND_FLOAT_01 > st->eventChance)
+ {
+ return;
+ }
+
+ which = RAND_FLOAT_01 * 10;
+
+ switch (which)
+ {
+ case 0: randomizeAllAngularVelocities (st); break;
+ case 1: randomizeAllZoomularVelocities (st); break;
+ case 2: randomizeAllVelocities (st); break;
+ case 3: randomizeAllAngularOrientations (st); break;
+ case 4: randomizeAllZoomularOrientations (st); break;
+ case 5: randomizeAllOrientations (st); break;
+ case 6: randomizeEverything (st); break;
+ case 7: randomizeOneTile (st); break;
+ case 8: randomizeOneColumn (st); break;
+ case 9: randomizeOneRow (st); break;
+ }
+}
+
+/* update the model for one iteration */
+static void updateModel (struct state *st)
+{
+ int r;
+ int c;
+
+ /* for each tile, decrease its velocities according to the friction,
+ * and increase them based on its current orientation and the orientations
+ * of its orthogonal neighbors */
+ for (r = 0; r < st->rows; r++)
+ {
+ for (c = 0; c < st->columns; c++)
+ {
+ Tile *t = TILE_AT (c, r);
+ FLOAT a = t->angle;
+ FLOAT z = t->zoom;
+ FLOAT va = t->vAngle;
+ FLOAT vz = t->vZoom;
+
+ va -= t->angle * st->springiness;
+ vz -= t->zoom * st->springiness;
+
+ if (c > 0)
+ {
+ Tile *t2 = TILE_AT (c - 1, r);
+ va += (t2->angle - a) * st->transference;
+ vz += (t2->zoom - z) * st->transference;
+ }
+
+ if (c < (st->columns - 1))
+ {
+ Tile *t2 = TILE_AT (c + 1, r);
+ va += (t2->angle - a) * st->transference;
+ vz += (t2->zoom - z) * st->transference;
+ }
+
+ if (r > 0)
+ {
+ Tile *t2 = TILE_AT (c, r - 1);
+ va += (t2->angle - a) * st->transference;
+ vz += (t2->zoom - z) * st->transference;
+ }
+
+ if (r < (st->rows - 1))
+ {
+ Tile *t2 = TILE_AT (c, r + 1);
+ va += (t2->angle - a) * st->transference;
+ vz += (t2->zoom - z) * st->transference;
+ }
+
+ va *= (1.0 - st->friction);
+ vz *= (1.0 - st->friction);
+
+ if (va > MAX_VANGLE) va = MAX_VANGLE;
+ else if (va < -MAX_VANGLE) va = -MAX_VANGLE;
+ t->vAngle = va;
+
+ if (vz > MAX_VZOOM) vz = MAX_VZOOM;
+ else if (vz < -MAX_VZOOM) vz = -MAX_VZOOM;
+ t->vZoom = vz;
+ }
+ }
+
+ /* for each tile, update its orientation based on its velocities */
+ for (r = 0; r < st->rows; r++)
+ {
+ for (c = 0; c < st->columns; c++)
+ {
+ Tile *t = TILE_AT (c, r);
+ FLOAT a = t->angle + t->vAngle;
+ FLOAT z = t->zoom + t->vZoom;
+
+ if (a > M_PI) a = M_PI;
+ else if (a < -M_PI) a = -M_PI;
+ t->angle = a;
+
+ if (z > 1.0) z = 1.0;
+ else if (z < -1.0) z = -1.0;
+ t->zoom = z;
+ }
+ }
+}
+
+/* the comparator to us to sort the tiles (used immediately below); it'd
+ * sure be nice if C allowed inner functions (or jeebus-forbid *real
+ * closures*!) */
+static int sortTilesComparator (const void *v1, const void *v2)
+{
+ Tile *t1 = *(Tile **) v1;
+ Tile *t2 = *(Tile **) v2;
+
+ if (t1->zoom < t2->zoom)
+ {
+ return -1;
+ }
+
+ if (t1->zoom > t2->zoom)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* sort the tiles in sortedTiles by zoom */
+static void sortTiles (struct state *st)
+{
+ qsort (st->sortedTiles, st->tileCount, sizeof (Tile *), sortTilesComparator);
+}
+
+/* render the given tile */
+static void renderTile (struct state *st, Tile *t)
+{
+ /* note: the zoom as stored per tile is log-based (centered on 0, with
+ * 0 being no zoom, but the range for zoom-as-drawn is 0.4..2.5,
+ * hence the alteration of t->zoom, below */
+
+ int x, y;
+
+ int tx = t->x;
+ int ty = t->y;
+
+ FLOAT zoom = pow (2.5, t->zoom);
+ FLOAT ang = -t->angle;
+ FLOAT sinAng = sin (ang);
+ FLOAT cosAng = cos (ang);
+
+ FLOAT innerBorder = (st->tileSize - st->borderWidth) / 2.0;
+ FLOAT outerBorder = innerBorder + st->borderWidth;
+
+ int maxCoord = outerBorder * zoom * (fabs (sinAng) + fabs (cosAng));
+ int minX = tx - maxCoord;
+ int maxX = tx + maxCoord;
+ int minY = ty - maxCoord;
+ int maxY = ty + maxCoord;
+
+ FLOAT prey;
+
+ if (minX < 0) minX = 0;
+ if (maxX > st->windowWidth) maxX = st->windowWidth;
+ if (minY < 0) minY = 0;
+ if (maxY > st->windowHeight) maxY = st->windowHeight;
+
+ sinAng /= zoom;
+ cosAng /= zoom;
+
+ for (y = minY, prey = y - ty; y < maxY; y++, prey++)
+ {
+ FLOAT prex = minX - tx;
+ FLOAT srcx = prex * cosAng - prey * sinAng;
+ FLOAT srcy = prex * sinAng + prey * cosAng;
+
+ for (x = minX;
+ x < maxX;
+ x++, srcx += cosAng, srcy += sinAng)
+ {
+ if ((srcx < -innerBorder) || (srcx >= innerBorder) ||
+ (srcy < -innerBorder) || (srcy >= innerBorder))
+ {
+ if ((srcx < -outerBorder) || (srcx >= outerBorder) ||
+ (srcy < -outerBorder) || (srcy >= outerBorder))
+ {
+ continue;
+ }
+ XPutPixel (st->workImage, x, y, st->borderPixel);
+ }
+ else
+ {
+ unsigned long p =
+ XGetPixel (st->sourceImage, srcx + tx, srcy + ty);
+ XPutPixel (st->workImage, x, y, p);
+ }
+ }
+ }
+}
+
+/* render and display the current model */
+static void renderFrame (struct state *st)
+{
+ int n;
+
+ /* This assumes black is zero. */
+ memset (st->workImage->data, 0,
+ st->workImage->bytes_per_line * st->workImage->height);
+
+ sortTiles (st);
+
+ for (n = 0; n < st->tileCount; n++)
+ {
+ renderTile (st, st->sortedTiles[n]);
+ }
+
+ put_xshm_image (st->dpy, st->window, st->backgroundGC, st->workImage, 0, 0, 0, 0,
+ st->windowWidth, st->windowHeight, &st->shmInfo);
+}
+
+/* set up the model */
+static void setupModel (struct state *st)
+{
+ int c;
+ int r;
+
+ int leftX; /* x of the center of the top-left tile */
+ int topY; /* y of the center of the top-left tile */
+
+ if (st->tileSize > (st->windowWidth / 2))
+ {
+ st->tileSize = st->windowWidth / 2;
+ }
+
+ if (st->tileSize > (st->windowHeight / 2))
+ {
+ st->tileSize = st->windowHeight / 2;
+ }
+
+ st->columns = st->tileSize ? st->windowWidth / st->tileSize : 0;
+ st->rows = st->tileSize ? st->windowHeight / st->tileSize : 0;
+
+ if ((st->maxColumns != 0) && (st->columns > st->maxColumns))
+ {
+ st->columns = st->maxColumns;
+ }
+
+ if ((st->maxRows != 0) && (st->rows > st->maxRows))
+ {
+ st->rows = st->maxRows;
+ }
+
+ st->tileCount = st->rows * st->columns;
+
+ leftX = (st->windowWidth - (st->columns * st->tileSize) + st->tileSize) / 2;
+ topY = (st->windowHeight - (st->rows * st->tileSize) + st->tileSize) / 2;
+
+ if (st->tileCount < 1) st->tileCount = 1;
+ st->tiles = calloc (st->tileCount, sizeof (Tile));
+ st->sortedTiles = calloc (st->tileCount, sizeof (Tile *));
+
+ for (r = 0; r < st->rows; r++)
+ {
+ for (c = 0; c < st->columns; c++)
+ {
+ Tile *t = TILE_AT (c, r);
+ t->x = leftX + c * st->tileSize;
+ t->y = topY + r * st->tileSize;
+ st->sortedTiles[c + r * st->columns] = t;
+ }
+ }
+
+ randomizeEverything (st);
+}
+
+/* do one iteration */
+
+static unsigned long
+twang_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+ grabImage_done (st);
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ grabImage_start (st, &xgwa);
+ return st->delay;
+ }
+
+ modelEvents (st);
+ updateModel (st);
+ renderFrame (st);
+ return st->delay;
+}
+
+
+static void
+twang_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+twang_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+twang_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->pm) XFreePixmap (dpy, st->pm);
+ free (st);
+}
+
+
+
+/* main and options and stuff */
+
+/* initialize the user-specifiable params */
+static void initParams (struct state *st)
+{
+ int problems = 0;
+
+ st->borderWidth = get_integer_resource (st->dpy, "borderWidth", "Integer");
+ if (st->borderWidth < 0)
+ {
+ fprintf (stderr, "error: border width must be at least 0\n");
+ problems = 1;
+ }
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ if (st->delay < 0)
+ {
+ fprintf (stderr, "error: delay must be at least 0\n");
+ problems = 1;
+ }
+
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->duration < 1) st->duration = 1;
+
+ st->eventChance = get_float_resource (st->dpy, "eventChance", "Double");
+ if ((st->eventChance < 0.0) || (st->eventChance > 1.0))
+ {
+ fprintf (stderr, "error: eventChance must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ st->friction = get_float_resource (st->dpy, "friction", "Double");
+ if ((st->friction < 0.0) || (st->friction > 1.0))
+ {
+ fprintf (stderr, "error: friction must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ st->maxColumns = get_integer_resource (st->dpy, "maxColumns", "Integer");
+ if (st->maxColumns < 0)
+ {
+ fprintf (stderr, "error: max columns must be at least 0\n");
+ problems = 1;
+ }
+
+ st->maxRows = get_integer_resource (st->dpy, "maxRows", "Integer");
+ if (st->maxRows < 0)
+ {
+ fprintf (stderr, "error: max rows must be at least 0\n");
+ problems = 1;
+ }
+
+ st->springiness = get_float_resource (st->dpy, "springiness", "Double");
+ if ((st->springiness < 0.0) || (st->springiness > 1.0))
+ {
+ fprintf (stderr, "error: springiness must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ st->tileSize = get_integer_resource (st->dpy, "tileSize", "Integer");
+ if (st->tileSize < 1)
+ {
+ fprintf (stderr, "error: tile size must be at least 1\n");
+ problems = 1;
+ }
+
+ st->transference = get_float_resource (st->dpy, "transference", "Double");
+ if ((st->transference < 0.0) || (st->transference > 1.0))
+ {
+ fprintf (stderr, "error: transference must be in the range 0..1\n");
+ problems = 1;
+ }
+
+ if (problems)
+ {
+ exit (1);
+ }
+}
+
+static void *
+twang_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = win;
+
+ initParams (st);
+ setup (st);
+ setupModel (st);
+
+ return st;
+}
+
+
+static const char *twang_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: true",
+ "*borderColor: blue",
+ "*borderWidth: 3",
+ "*delay: 10000",
+ "*duration: 120",
+ "*eventChance: 0.01",
+ "*friction: 0.05",
+ "*maxColumns: 0",
+ "*maxRows: 0",
+ "*springiness: 0.1",
+ "*tileSize: 120",
+ "*transference: 0.025",
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#else
+ "*useSHM: False",
+#endif
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec twang_options [] = {
+ { "-border-color", ".borderColor", XrmoptionSepArg, 0 },
+ { "-border-width", ".borderWidth", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-event-chance", ".eventChance", XrmoptionSepArg, 0 },
+ { "-friction", ".friction", XrmoptionSepArg, 0 },
+ { "-max-columns", ".maxColumns", XrmoptionSepArg, 0 },
+ { "-max-rows", ".maxRows", XrmoptionSepArg, 0 },
+ { "-springiness", ".springiness", XrmoptionSepArg, 0 },
+ { "-tile-size", ".tileSize", XrmoptionSepArg, 0 },
+ { "-transference", ".transference", XrmoptionSepArg, 0 },
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Twang", twang)
diff --git a/hacks/twang.man b/hacks/twang.man
new file mode 100644
index 0000000..3e6b06a
--- /dev/null
+++ b/hacks/twang.man
@@ -0,0 +1,132 @@
+.TH XScreenSaver 1 "07-Feb-2002" "X Version 11"
+.SH NAME
+twang - pluck pieces of the screen
+.SH SYNOPSIS
+.B twang
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-shm]
+[\-no-shm]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-border-color \fIcolor\fP]
+[\-border-width \fIinteger\fP]
+[\-event-chance \fIfraction\fP]
+[\-friction \fIfraction\fP]
+[\-springiness \fIfraction\fP]
+[\-tile-size \fIinteger\fP]
+[\-transference \fIfraction\fP]
+[\-fps]
+.SH DESCRIPTION
+\fITwang\fP divides the screen into equal-sized tiles, and then plucks
+them in various ways. Tiles are affected by their neighbors, so waves
+of motion flow through the grid. This manpage
+describes v1.3 of the program.
+.SH OPTIONS
+.I twang
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-shm
+.TP 8
+.B \-no-shm
+Use the shared memory extension (or not, respectively), if available.
+This may speed things
+up a bit, but probably won't make that much difference. If available,
+defaults to true, resource \fIuseSHM\fP.
+.TP 8
+.B \-delay \fImicroseconds\fP
+The interframe delay, in microseconds. Defaults to 10000, resource
+\fIdelay\fP.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-border-color \fIcolor\fP
+Color of the border surrounding each tile. Defaults to blue, resource
+\fIborderColor\fP.
+.TP 8
+.B \-border-width \fIinteger\fP
+Width of the border surrounding each tile. Defaults to 3, resource
+\fIborderWidth\fP.
+.TP 8
+.B \-event-chance \fIfraction\fP
+The chance, per iteration, for an event to occur (such as tweaking
+the orientation of a tile), in the range 0..1. Defaults to 0.01,
+resource \fIeventChance\fP.
+.TP 8
+.B \-friction \fIfraction\fP
+How much friction there is in the system, in the range 0..1.
+This is the amount by which velocities are damped per iteration.
+Defaults to 0.05, resource \fIfriction\fP.
+.TP 8
+.B \-springiness \fIfraction\fP
+How springy the tiles are, in the range 0..1.
+This is the fraction of an orientation that gets turned into a velocity
+towards the center (resting point). Defaults to 0.1, resource
+\fIspringiness\fP.
+.TP 8
+.B \-tile-size \fIinteger\fP
+Size (width and height) of each tile, not including the outer edge
+of the border. Defaults to 120, resource \fItileSize\fP.
+.TP 8
+.B \-transference \fIfraction\fP
+How much a tile's neighbors affect it, in the range 0..1.
+This is the fraction of an orientation of a neighbor that gets turned
+into a velocity in the same direction Defaults to 0.025, resource
+\fItransference\fP.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+There are resource equivalents for each option, noted above.
+.SH BUGS
+.I twang
+should have more interesting events.
+.TP 8
+Ways of speeding it up need to be investigated. It's kinda sluggish,
+especially on hugeass displays.
+.SH SEE ALSO
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Dan Bornstein. All rights reserved.
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of this
+software for any purpose. It is provided "as is" without express or
+implied warranty.
+.SH AUTHOR
+Dan Bornstein <danfuzz@milk.com>.
diff --git a/hacks/vermiculate.c b/hacks/vermiculate.c
new file mode 100644
index 0000000..9364791
--- /dev/null
+++ b/hacks/vermiculate.c
@@ -0,0 +1,1221 @@
+/*
+ * @(#) vermiculate.c
+ * @(#) Copyright (C) 2001 Tyler Pierce (tyler@alumni.brown.edu)
+ * The full program, with documentation, is available at:
+ * http://freshmeat.net/projects/fdm
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <ctype.h>
+#include <math.h>
+#include "screenhack.h"
+
+#define degs 360
+#define degs2 (degs/2)
+#define degs4 (degs/4)
+#define degs8 (degs/8)
+#define dtor 0.0174532925 /* pi / degs2; */
+#define thrmax 120
+#define tailmax (thrmax * 2 + 1)
+#define tmodes '7'
+#define ymax (st->hei - 1)
+#define ymin 0
+#define xmax (st->wid - 1)
+#define xmin 0
+#define rlmax 200
+#define SPEEDINC 10
+#define SPEEDMAX 1000
+#define wraparound(VAL,LOWER,UPPER) { \
+ if (VAL >= UPPER) \
+ VAL -= UPPER - LOWER; \
+ else if (VAL < LOWER) \
+ VAL += UPPER - LOWER; }
+#define arrcpy(DEST,SRC) memcpy (DEST, SRC, sizeof(DEST))
+
+typedef double real;
+typedef unsigned char banktype[thrmax];
+
+typedef struct linedata
+{
+ int deg, spiturn, turnco, turnsize;
+ unsigned char col;
+ Bool dead;
+
+ char orichar;
+ real x, y;
+ int tmode, tsc, tslen, tclim, otslen, ctinc, reclen, recpos, circturn, prey,
+ slice;
+ int xrec[rlmax + 1], yrec[rlmax + 1];
+ int turnseq[50];
+ Bool filled, killwalls, vhfollow,
+ selfbounce, tailfollow, realbounce, little;
+}
+linedata;
+
+static const struct stringAndSpeed
+{
+ char *str;
+ int speed;
+}
+sampleStrings[] =
+{
+/* { "]]]]]]]]7ces123400-9-8#c123456#s9998880004#ma3#car9ma6#c-#r1", 600} ,
+ { "bmarrrr#c1234#lc5678#lyet]", 600} , */
+ { "AEBMN222222223#CAR9CAD4CAOV", 150} ,
+ { "mn333#c23#f1#]]]]]]]]]]]3bc9#r9#c78#f9#ma4#", 600} ,
+ { "AEBMN22222#CAD4CAORc1#f2#c1#r6", 100} ,
+/* { "mn6666666#c1i#f1#y2#sy2#vyety1#ry13i#l", 40} , */
+ { "aebmnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr#", 500} ,
+/* { "bg+++++++++++++++++++++++#mnrrrrrrrrrrrrrrrrrrrrrrr#y1#k", 500}, */
+/* { "BMN22222223#CAD4CAOVYAS", 150}, */
+/* { "aebmnrrrrrrrrrrrrrrrr#yaryakg--#", 100} , */
+ { "mn6rrrrrrrrrrrrrrr#by1i#lcalc1#fnyav" , 200 } ,
+ { "mn1rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr#by1i#lcalc1#fn", 2000 },
+ { "baeMn333333333333333333333333#CerrYerCal", 800 },
+ { "baeMn1111111111111111111111111111111111111111111111111111111111#Cer9YesYevYerCal", 1200 },
+ { "baMn111111222222333333444444555555#Ct1#lCt2#lCt3#lCt4#lCt5#lCerrYerYet", 1400 },
+ { "baMn111111222222333333444444555555#Ct1#lCt2#lCt3#lCt4#lCt5#lCerrYerYetYt1i#lYt1i#sYt1#v", 1400 }
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC mygc;
+ Colormap mycmap;
+ XWindowAttributes xgwa;
+ XColor mycolors[tailmax];
+
+ int hei, wid, speed;
+ Bool erasing, cleared, autopal;
+ char *instring;
+ int max_ticks;
+
+ real sinof[degs], cosof[degs], tanof[degs];
+ unsigned char *point;
+
+ linedata thread[thrmax];
+ banktype bank;
+ int bnkt;
+ int boxw, boxh, curviness, gridden, ogd, bordcorn;
+ unsigned char bordcol, threads;
+ char ch, boolop;
+
+ int reset_p;
+ int cyc;
+};
+
+
+
+static void
+consume_instring(struct state *st);
+
+static Bool
+wasakeypressed (struct state *st)
+{
+ if (*st->instring != 0)
+ return True;
+ else
+ return False;
+}
+
+static char
+readkey (struct state *st)
+{
+ char readkey_result;
+ if (*st->instring == 0)
+ {
+ readkey_result = '#';
+ }
+ else
+ {
+ readkey_result = *st->instring;
+ st->instring++;
+ };
+ return toupper (readkey_result);
+}
+
+static unsigned int
+random1 (unsigned int i)
+{
+ return (ya_random () % i);
+}
+
+static unsigned long
+waitabit (struct state *st)
+{
+ int result = 0;
+ st->cyc += st->threads;
+ while (st->cyc > st->speed)
+ {
+ result += 10000;
+ st->cyc -= st->speed;
+ }
+ return result;
+}
+
+static void
+clearscreen (struct state *st)
+{
+ XClearWindow (st->dpy, st->window);
+ memset (st->point, 0, st->wid * st->hei);
+}
+
+static void
+sp (struct state *st, int x, int y, int c)
+{
+ XSetForeground (st->dpy, st->mygc, st->mycolors[c].pixel);
+ XDrawPoint (st->dpy, st->window, st->mygc, x, y);
+ st->point[(st->wid * y) + x] = c;
+}
+
+static int
+gp (struct state *st, int x, int y)
+{
+ return st->point[(st->wid * y) + x];
+}
+
+static void
+redraw (struct state *st, int x, int y, int width, int height)
+{
+ int xc, yc;
+ for (xc = x; xc <= x + width - 1; xc++)
+ for (yc = y; yc <= y + height - 1; yc++)
+ if (st->point[st->wid * yc + xc] != 0)
+ sp (st, xc, yc, st->point[st->wid * yc + xc]);
+}
+
+static void
+palupdate (struct state *st, Bool forceUpdate)
+{
+ if (forceUpdate || *st->instring == 0)
+ {
+ redraw (st, xmin, ymin, st->wid, st->hei);
+ }
+}
+
+static void
+randpal (struct state *st)
+{
+ int ncolors = tailmax - 1;
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->mycmap,
+ &st->mycolors[1], &ncolors, True, True, 0, True);
+ if (ncolors < tailmax - 1)
+ {
+ int c;
+ for (c = 1; c < tailmax; c++)
+ st->mycolors[c].pixel = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ }
+}
+
+static void
+gridupdate (struct state *st, Bool interruptible)
+{
+ int x, y;
+ if (st->gridden > 0)
+ for (x = 0; x <= xmax && !(wasakeypressed (st) && interruptible); x += st->boxw)
+ for (y = 0; y <= ymax; y += st->boxh)
+ {
+ if (random1 (15) < st->gridden)
+ {
+#define lesser(A,B) ( ((A)<(B)) ? (A) : (B) )
+ int max = lesser (x + st->boxw, xmax);
+ int xc;
+ for (xc = x; xc <= max; xc++)
+ sp (st, xc, y, 1);
+ }
+ if (random1 (15) < st->gridden)
+ {
+ int max = lesser (y + st->boxh, ymax);
+ int yc;
+ for (yc = y; yc <= max; yc++)
+ sp (st, x, yc, 1);
+ }
+ }
+}
+
+static void
+bordupdate (struct state *st)
+{
+ int xbord, ybord;
+
+ if (st->bordcorn == 0 || st->bordcorn == 1)
+ ybord = ymin;
+ else
+ ybord = ymax;
+ if (st->bordcorn == 0 || st->bordcorn == 3)
+ xbord = xmin;
+ else
+ xbord = xmax;
+ {
+ int x, y;
+ for (x = xmin; x <= xmax; x++)
+ sp (st, x, ybord, st->bordcol);
+ for (y = ymin; y <= ymax; y++)
+ sp (st, xbord, y, st->bordcol);
+ }
+}
+
+static Bool
+inbank (struct state *st, unsigned char thr)
+{
+ int c;
+ if (st->bnkt > 0)
+ for (c = 1; c <= st->bnkt; c++)
+ if (st->bank[c - 1] == thr)
+ return True;
+ return False;
+}
+
+static void
+pickbank (struct state *st)
+{
+ unsigned char thr = 1;
+ st->bnkt = 0;
+ st->ch = '\0';
+ do
+ {
+ while (inbank (st, thr))
+ thr = thr % st->threads + 1;
+
+ palupdate (st, False);
+ st->ch = readkey (st);
+ palupdate (st, False);
+ switch (st->ch)
+ {
+ case '+':
+ case '-':
+ do
+ {
+ if (st->ch == '+')
+ thr++;
+ else
+ thr--;
+ wraparound (thr, 1, st->threads + 1);
+ }
+ while (inbank (st, thr));
+ break;
+ case ' ':
+ st->bank[++st->bnkt - 1] = thr;
+ break;
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+
+ st->bank[++st->bnkt - 1] = st->ch - '0';
+ if (st->bank[st->bnkt - 1] > st->threads)
+ st->bnkt--;
+ break;
+ case 'I':
+ {
+ banktype tbank;
+ int tbankt = 0;
+ int c;
+ for (c = 1; c <= st->threads; c++)
+ if (!inbank (st, c))
+ tbank[++tbankt - 1] = c;
+ st->bnkt = tbankt;
+ arrcpy (st->bank, tbank);
+ }
+ break;
+ case 'T':
+ st->ch = readkey (st);
+ switch (st->ch)
+ {
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+
+ {
+ int c;
+ for (c = 1; c <= st->threads; c++)
+ if (st->thread[c - 1].tmode == st->ch - '0')
+ st->bank[++st->bnkt - 1] = c;
+ }
+ break;
+ }
+ break;
+ case 'A':
+ for (st->bnkt = 1; st->bnkt <= st->threads; st->bnkt++)
+ st->bank[st->bnkt - 1] = st->bnkt;
+ st->bnkt = st->threads;
+ break;
+ case 'E':
+ for (st->bnkt = 1; st->bnkt <= thrmax; st->bnkt++)
+ st->bank[st->bnkt - 1] = st->bnkt;
+ st->bnkt = thrmax;
+ break;
+ }
+ }
+ while (!(st->bnkt >= st->threads || st->ch == 'N' || st->ch == '\15' || st->ch == '#'));
+ if (st->bnkt == 0 && st->ch != 'N')
+ {
+ st->bnkt = 1;
+ st->bank[0] = thr;
+ }
+ palupdate (st, False);
+}
+
+static void
+bankmod (char boolop, Bool * Bool_)
+{
+ switch (boolop)
+ {
+ case 'T':
+ *Bool_ = !*Bool_;
+ break;
+ case 'Y':
+ *Bool_ = True;
+ break;
+ case 'N':
+ *Bool_ = False;
+ break;
+ }
+}
+
+static void
+newonscreen (struct state *st, unsigned char thr)
+{
+ linedata *LP = &st->thread[thr - 1];
+ LP->filled = False;
+ LP->dead = False;
+ LP->reclen = (LP->little) ?
+ random1 (10) + 5 : random1 (rlmax - 30) + 30;
+ LP->deg = random1 (degs);
+ LP->y = random1 (st->hei);
+ LP->x = random1 (st->wid);
+ LP->recpos = 0;
+ LP->turnco = 2;
+ LP->turnsize = random1 (4) + 2;
+}
+
+static void
+firstinit (struct state *st, unsigned char thr)
+{
+ linedata *LP = &st->thread[thr - 1];
+ LP->col = thr + 1;
+ LP->prey = 0;
+ LP->tmode = 1;
+ LP->slice = degs / 3;
+ LP->orichar = 'R';
+ LP->spiturn = 5;
+ LP->selfbounce = False;
+ LP->realbounce = False;
+ LP->vhfollow = False;
+ LP->tailfollow = False;
+ LP->killwalls = False;
+ LP->little = False;
+ LP->ctinc = random1 (2) * 2 - 1;
+ LP->circturn = ((thr % 2) * 2 - 1) * ((thr - 1) % 7 + 1);
+ LP->tsc = 1;
+ LP->tslen = 6;
+ LP->turnseq[0] = 6;
+ LP->turnseq[1] = -6;
+ LP->turnseq[2] = 6;
+ LP->turnseq[3] = 6;
+ LP->turnseq[4] = -6;
+ LP->turnseq[5] = 6;
+ LP->tclim = (unsigned char) (((real) degs) / 2 / 12);
+}
+
+static void
+maininit (struct state *st)
+{
+ if (!st->instring)
+ {
+ int n = random1 (sizeof (sampleStrings) / sizeof (sampleStrings[0]));
+ st->instring = sampleStrings[n].str;
+ st->speed = sampleStrings[n].speed;
+ }
+ st->boxh = 10;
+ st->boxw = 10;
+ st->gridden = 0;
+ st->bordcorn = 0;
+ st->threads = 4;
+ st->curviness = 30;
+ st->bordcol = 1;
+ st->ogd = 8;
+ st->ch = '\0';
+ st->erasing = True;
+ {
+ unsigned char thr;
+ for (thr = 1; thr <= thrmax; thr++)
+ {
+ firstinit (st, thr);
+ newonscreen (st, thr);
+ }
+ }
+ {
+ int d;
+ for (d = degs - 1; d >= 0; d--)
+ {
+ st->sinof[d] = sin (d * dtor);
+ st->cosof[d] = cos (d * dtor);
+ if (d % degs4 == 0)
+ st->tanof[d] = st->tanof[d + 1];
+ else
+ st->tanof[d] = tan (d * dtor);
+ }
+ }
+ randpal (st);
+}
+
+static Bool
+move (struct state *st, unsigned char thr)
+{
+ linedata *LP = &st->thread[thr - 1];
+ if (LP->dead)
+ return (False);
+ if (LP->prey == 0)
+ switch (LP->tmode)
+ {
+ case 1:
+ LP->deg += random1 (2 * LP->turnsize + 1) - LP->turnsize;
+ break;
+ case 2:
+ if (LP->slice == degs || LP->slice == degs2 || LP->slice == degs4)
+ {
+ if (LP->orichar == 'D')
+ {
+ if (LP->deg % degs4 != degs8)
+ LP->deg = degs4 * random1 (4) + degs8;
+ }
+ else if (LP->orichar == 'V')
+ if (LP->deg % degs4 != 0)
+ LP->deg = degs4 * random1 (4);
+ }
+ if (random1 (100) == 0)
+ {
+ if (LP->slice == 0)
+ LP->deg = LP->deg - degs4 + random1 (degs2);
+ else
+ LP->deg += (random1 (2) * 2 - 1) * LP->slice;
+ }
+ break;
+ case 3:
+ LP->deg += LP->circturn;
+ break;
+ case 4:
+ if (abs (LP->spiturn) > 11)
+ LP->spiturn = 5;
+ else
+ LP->deg += LP->spiturn;
+ if (random1 (15 - abs (LP->spiturn)) == 0)
+ {
+ LP->spiturn += LP->ctinc;
+ if (abs (LP->spiturn) > 10)
+ LP->ctinc *= -1;
+ }
+ break;
+ case 5:
+ LP->turnco = abs (LP->turnco) - 1;
+ if (LP->turnco == 0)
+ {
+ LP->turnco = st->curviness + random1 (10);
+ LP->circturn *= -1;
+ }
+ LP->deg += LP->circturn;
+ break;
+ case 6:
+ if (abs (LP->turnco) == 1)
+ LP->turnco *= -1 * (random1 (degs2 / abs (LP->circturn)) + 5);
+ else if (LP->turnco == 0)
+ LP->turnco = 2;
+ else if (LP->turnco > 0)
+ {
+ LP->turnco--;
+ LP->deg += LP->circturn;
+ }
+ else
+ LP->turnco++;
+ break;
+ case 7:
+ LP->turnco++;
+ if (LP->turnco > LP->tclim)
+ {
+ LP->turnco = 1;
+ LP->tsc = (LP->tsc % LP->tslen) + 1;
+ }
+ LP->deg += LP->turnseq[LP->tsc - 1];
+ break;
+ }
+ else
+ {
+ int desdeg;
+ real dy, dx;
+ if (LP->tailfollow || LP->prey == thr)
+ {
+ dx = st->thread[LP->prey - 1].xrec[st->thread[LP->prey - 1].recpos] - LP->x;
+ dy = st->thread[LP->prey - 1].yrec[st->thread[LP->prey - 1].recpos] - LP->y;
+ }
+ else
+ {
+ dx = st->thread[LP->prey - 1].x - LP->x;
+ dy = st->thread[LP->prey - 1].y - LP->y;
+ }
+ desdeg =
+ (LP->vhfollow) ?
+ ((fabs (dx) > fabs (dy)) ?
+ ((dx > 0) ?
+ 0 * degs4
+ :
+ 2 * degs4)
+ :
+ ((dy > 0) ?
+ 1 * degs4
+ :
+ 3 * degs4))
+ :
+ ((dx > 0) ?
+ ((dy > 0) ?
+ 1 * degs8 : 7 * degs8) : ((dy > 0) ? 3 * degs8 : 5 * degs8));
+ if (desdeg - desdeg % degs4 != LP->deg - LP->deg % degs4
+ || LP->vhfollow)
+ {
+ if (!LP->vhfollow)
+ {
+ /* Using atan2 here doesn't seem to slow things down: */
+ desdeg = atan2 (dy, dx) / dtor;
+ wraparound (desdeg, 0, degs);
+ }
+ if (abs (desdeg - LP->deg) <= abs (LP->circturn))
+ LP->deg = desdeg;
+ else
+ LP->deg +=
+ (desdeg > LP->deg) ?
+ ((desdeg - LP->deg > degs2) ?
+ -abs (LP->circturn) : abs (LP->circturn))
+ : ((LP->deg - desdeg > degs2) ?
+ abs (LP->circturn) : -abs (LP->circturn));
+ }
+ else
+ LP->deg +=
+ (st->tanof[LP->deg] >
+ dy / dx) ? -abs (LP->circturn) : abs (LP->circturn);
+ }
+
+ wraparound (LP->deg, 0, degs);
+ {
+ unsigned char oldcol;
+ real oldy = LP->y, oldx = LP->x;
+ LP->x += st->cosof[LP->deg];
+ wraparound (LP->x, xmin, xmax + 1);
+ LP->y += st->sinof[LP->deg];
+ wraparound (LP->y, ymin, ymax + 1);
+#define xi ((int) LP->x)
+#define yi ((int) LP->y)
+
+ oldcol = gp (st, xi, yi);
+ if (oldcol != 0)
+ {
+ Bool vertwall = False, horiwall = False;
+ if (oldcol == 1 && ((LP->killwalls && st->gridden > 0) || LP->realbounce))
+ {
+ vertwall = (gp (st, xi, (int) oldy) == 1);
+ horiwall = (gp (st, (int) oldx, yi) == 1);
+ }
+ if (oldcol == 1 && LP->realbounce && (vertwall || horiwall))
+ {
+ if (vertwall)
+ LP->deg = -LP->deg + degs2;
+ else
+ LP->deg = -LP->deg;
+ }
+ else
+ {
+ if ((oldcol != LP->col && LP->realbounce)
+ || (oldcol == LP->col && LP->selfbounce))
+ LP->deg += degs4 * (random1 (2) * 2 - 1);
+ else if (oldcol != LP->col)
+ LP->deg += degs2;
+ }
+ if (LP->killwalls && st->gridden > 0 && oldcol == 1)
+ {
+ if (vertwall && xi + 1 <= xmax)
+ {
+ int yy;
+ for (yy = yi - yi % st->boxh;
+ yy <= yi - yi % st->boxh + st->boxh && yy <= ymax; yy++)
+ if (gp (st, xi + 1, yy) != 1 || yy == ymax)
+ sp (st, xi, yy, 0);
+ }
+ if (horiwall && yi + 1 <= ymax)
+ {
+ int xx;
+ for (xx = xi - xi % st->boxw;
+ xx <= xi - xi % st->boxw + st->boxw && xx <= xmax; xx++)
+ if (gp (st, xx, yi + 1) != 1 || xx == xmax)
+ sp (st, xx, yi, 0);
+ }
+ }
+ if (oldcol != LP->col || LP->selfbounce)
+ {
+ LP->x = oldx;
+ LP->y = oldy;
+ }
+ wraparound (LP->deg, 0, degs);
+ }
+ }
+
+ sp (st, xi, yi, LP->col);
+ if (LP->filled)
+ {
+ if (st->erasing)
+ sp (st, LP->xrec[LP->recpos], LP->yrec[LP->recpos], 0);
+ else
+ sp (st, LP->xrec[LP->recpos], LP->yrec[LP->recpos], LP->col + thrmax);
+ }
+ LP->yrec[LP->recpos] = yi;
+ LP->xrec[LP->recpos] = xi;
+ if (LP->recpos == LP->reclen - 1)
+ LP->filled = True;
+ if (LP->filled && !st->erasing)
+ {
+ int co = LP->recpos;
+ LP->dead = True;
+ do
+ {
+ int nextco = co + 1;
+ wraparound (nextco, 0, LP->reclen);
+ if (LP->yrec[co] != LP->yrec[nextco]
+ || LP->xrec[co] != LP->xrec[nextco])
+ LP->dead = False;
+ co = nextco;
+ }
+ while (!(!LP->dead || co == LP->recpos));
+ }
+ LP->recpos++;
+ wraparound (LP->recpos, 0, LP->reclen);
+ return (!LP->dead);
+}
+
+static unsigned long
+vermiculate_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int had_instring = (st->instring != 0);
+ int tick = 0;
+ int this_delay = 0;
+ int loop = 0;
+
+
+ AGAIN:
+ if (st->reset_p)
+ {
+ st->reset_p = 0;
+
+ clearscreen (st);
+ {
+ unsigned char thr;
+ for (thr = 1; thr <= st->threads; thr++)
+ newonscreen (st, thr);
+ }
+ if (st->autopal)
+ {
+ randpal (st);
+ palupdate (st, False);
+ }
+ bordupdate (st);
+ gridupdate (st, False);
+ }
+
+ {
+ Bool alltrap = True;
+ unsigned char thr;
+ for (thr = 1; thr <= st->threads; thr++)
+ if (move (st, thr))
+ alltrap = False;
+ if (alltrap) /* all threads are trapped */
+ st->reset_p = True;
+ if (st->speed != SPEEDMAX)
+ this_delay = waitabit (st);
+ }
+
+ if (tick++ > st->max_ticks && !had_instring)
+ {
+ tick = 0;
+ st->instring = 0;
+ maininit(st);
+ st->reset_p = True;
+ st->autopal = False;
+ }
+
+ if (this_delay == 0 && loop++ < 1000)
+ goto AGAIN;
+
+ return this_delay;
+}
+
+static void *
+vermiculate_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = d;
+ st->window = w;
+ st->reset_p = 1;
+ st->instring = get_string_resource (st->dpy, "instring", "Instring");
+ if (st->instring && !*st->instring)
+ st->instring = 0;
+
+ st->max_ticks = get_integer_resource (st->dpy, "ticks", "Integer");
+ st->speed = get_integer_resource (st->dpy, "speed", "Speed");
+ if (st->speed <= 0) st->speed = 1;
+ st->mycolors[0].pixel = BlackPixel (st->dpy, DefaultScreen (st->dpy));
+
+ XSetWindowBackground (st->dpy, st->window,
+ BlackPixel (st->dpy, DefaultScreen (st->dpy)));
+ {
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->wid = st->xgwa.width;
+ st->hei = st->xgwa.height;
+ st->mycmap = st->xgwa.colormap;
+ }
+ {
+ XGCValues mygcv;
+ st->mygc = XCreateGC (st->dpy, st->window, 0, &mygcv);
+ }
+
+ st->point = (unsigned char *) calloc (1, st->wid * st->hei);
+ maininit (st);
+ palupdate (st, True);
+ consume_instring(st);
+ return st;
+}
+
+
+static void
+vermiculate_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->wid = w;
+ st->hei = h;
+ free (st->point);
+ st->point = (unsigned char *) calloc (1, st->wid * st->hei);
+}
+
+static Bool
+vermiculate_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->reset_p = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+consume_instring(struct state *st)
+{
+ char boolop;
+
+ while (wasakeypressed (st))
+ {
+ st->ch = readkey (st);
+ switch (st->ch)
+ {
+ case 'M':
+ st->ch = readkey (st);
+ switch (st->ch)
+ {
+ case 'A':
+ case 'N':
+ {
+ unsigned char othreads = st->threads;
+ if (st->ch == 'N')
+ st->threads = 0;
+ do
+ {
+ st->ch = readkey (st);
+ switch (st->ch)
+ {
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ st->thread[++st->threads - 1].tmode = st->ch - '0';
+ break;
+ case 'R':
+ st->thread[++st->threads - 1].tmode =
+ random1 (tmodes - '0') + 1;
+ break;
+ }
+ }
+ while (!(st->ch == '\15' || st->ch == '#'
+ || st->threads == thrmax));
+ if (st->threads == 0)
+ st->threads = othreads;
+ st->reset_p = 1;
+ }
+ break;
+ }
+ break;
+ case 'C':
+ pickbank (st);
+ if (st->bnkt > 0)
+ {
+ st->ch = readkey (st);
+ switch (st->ch)
+ {
+ case 'D':
+ st->ch = readkey (st);
+ switch (st->ch)
+ {
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+/* Careful! The following macro needs to be at the beginning of any
+block in which it's invoked, since it declares variables: */
+#define forallinbank(LDP) linedata *LDP; int bankc; \
+ for (bankc = 1; \
+ ((bankc <= st->bnkt) ? ( \
+ (LDP = &st->thread[st->bank[bankc - 1] - 1], 1) \
+ ) : 0) ; bankc++)
+ {
+ forallinbank (L) L->slice = degs / (st->ch - '0');
+ }
+ break;
+ case 'M':
+ {
+ forallinbank (L) L->slice = 0;
+ }
+ break;
+ }
+ break;
+ case 'S':
+ {
+ forallinbank (L)
+ {
+ L->otslen = L->tslen;
+ L->tslen = 0;
+ }
+ }
+ do
+ {
+ char oldch = st->ch;
+ st->ch = readkey (st);
+ {
+ forallinbank (L)
+ {
+ switch (st->ch)
+ {
+ case '0':
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ L->tslen++;
+ L->turnseq[L->tslen - 1] = st->ch - '0';
+ if (oldch == '-')
+ L->turnseq[L->tslen - 1] *= -1;
+ if (bankc % 2 == 0)
+ L->turnseq[L->tslen - 1] *= -1;
+ break;
+ }
+ }
+ }
+ }
+ while (!(st->ch == '\15' || st->ch == '#'
+ || st->thread[st->bank[0] - 1].tslen == 50));
+ {
+ forallinbank (L)
+ {
+ int seqSum = 0, c;
+
+ if (L->tslen == 0)
+ L->tslen = L->otslen;
+ for (c = 1; c <= L->tslen; c++)
+ seqSum += L->turnseq[c - 1];
+ if (seqSum == 0)
+ L->tclim = 1;
+ else
+ L->tclim =
+ (int) (((real) degs2) / abs (seqSum));
+ L->tsc = random1 (L->tslen) + 1;
+ }
+ }
+ break;
+ case 'T':
+ {
+ st->ch = readkey (st);
+ {
+ forallinbank (L)
+ {
+ switch (st->ch)
+ {
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ L->tmode = st->ch - '0';
+ break;
+ case 'R':
+ L->tmode = random1 (tmodes - '0') + 1;
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case 'O':
+ st->ch = readkey (st);
+ {
+ forallinbank (L) L->orichar = st->ch;
+ }
+ break;
+ case 'F':
+ {
+ banktype fbank;
+ arrcpy (fbank, st->bank);
+ {
+ int fbnkt = st->bnkt;
+ int bankc;
+ pickbank (st);
+ for (bankc = 1; bankc <= fbnkt; bankc++)
+ {
+ linedata *L = &st->thread[fbank[bankc - 1] - 1];
+ if (st->ch == 'N')
+ L->prey = 0;
+ else
+ L->prey = st->bank[0 + (bankc - 1) % st->bnkt];
+ }
+ }
+ }
+ break;
+ case 'L':
+ {
+ forallinbank (L) L->prey = st->bank[bankc % st->bnkt];
+ }
+ break;
+ case 'R':
+ st->ch = readkey (st);
+ {
+ forallinbank (L) switch (st->ch)
+ {
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ L->circturn = 10 - (st->ch - '0');
+ break;
+ case 'R':
+ L->circturn = random1 (7) + 1;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ case 'T':
+ case 'Y':
+ case 'N':
+ boolop = st->ch;
+ pickbank (st);
+ if (st->bnkt > 0)
+ {
+ st->ch = readkey (st);
+ {
+ forallinbank (L)
+ {
+ switch (st->ch)
+ {
+ case 'S':
+ bankmod (boolop, &L->selfbounce);
+ break;
+ case 'V':
+ bankmod (boolop, &L->vhfollow);
+ break;
+ case 'R':
+ bankmod (boolop, &L->realbounce);
+ break;
+ case 'L':
+ bankmod (boolop, &L->little);
+ st->cleared = True;
+ break;
+ case 'T':
+ bankmod (boolop, &L->tailfollow);
+ break;
+ case 'K':
+ bankmod (boolop, &L->killwalls);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case 'R':
+ if (st->bordcol == 1)
+ {
+ st->bordcol = 0;
+ bordupdate (st);
+ st->bordcorn = (st->bordcorn + 1) % 4;
+ st->bordcol = 1;
+ bordupdate (st);
+ }
+ break;
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ {
+ int c;
+ for (c = 1; c <= thrmax; c++)
+ st->thread[c - 1].tmode = st->ch - '0';
+ }
+ break;
+ case '\40':
+ st->cleared = True;
+ break;
+ case 'E':
+ st->erasing = !st->erasing;
+ break;
+ case 'P':
+ randpal (st);
+ palupdate (st, True);
+ break;
+ case 'G':
+ {
+ char dimch = 'B';
+ Bool gridchanged = True;
+ if (st->gridden == 0)
+ st->gridden = st->ogd;
+ do
+ {
+ int msize = 0;
+ if (gridchanged)
+ {
+ clearscreen (st);
+ gridupdate (st, True);
+ }
+ st->ch = readkey (st);
+ gridchanged = True;
+ switch (st->ch)
+ {
+ case '+':
+ msize = 1;
+ break;
+ case '-':
+ msize = -1;
+ break;
+ case ']':
+ if (st->gridden < 15)
+ st->gridden++;
+ break;
+ case '[':
+ if (st->gridden > 0)
+ st->gridden--;
+ break;
+ case 'O':
+ st->ogd = st->gridden;
+ st->gridden = 0;
+ break;
+ case 'S':
+ st->boxw = st->boxh;
+ case 'W':
+ case 'H':
+ case 'B':
+ dimch = st->ch;
+ break;
+ default:
+ gridchanged = False;
+ }
+ if (dimch == 'W' || dimch == 'B')
+ st->boxw += msize;
+ if (dimch == 'H' || dimch == 'B')
+ st->boxh += msize;
+ if (st->boxw == 0)
+ st->boxw = 1;
+ if (st->boxh == 0)
+ st->boxh = 1;
+ }
+ while (!(st->ch == '\15' || st->ch == '#' || st->ch == 'O'));
+ st->cleared = True;
+ }
+ break;
+ case 'A':
+ st->autopal = !st->autopal;
+ break;
+ case 'B':
+ st->bordcol = 1 - st->bordcol;
+ bordupdate (st);
+ break;
+ case '-':
+ st->speed -= SPEEDINC;
+ if (st->speed < 1)
+ st->speed = 1;
+ break;
+ case '+':
+ st->speed += SPEEDINC;
+ if (st->speed > SPEEDMAX)
+ st->speed = SPEEDMAX;
+ break;
+ case '/':
+ if (st->curviness > 5)
+ st->curviness -= 5;
+ break;
+ case '*':
+ if (st->curviness < 50)
+ st->curviness += 5;
+ break;
+ case ']':
+ if (st->threads < thrmax)
+ newonscreen (st, ++st->threads);
+ break;
+ case '[':
+ if (st->threads > 1)
+ {
+ linedata *L = &st->thread[st->threads - 1];
+ int lastpos = (L->filled) ? L->reclen - 1 : L->recpos;
+ int c;
+ for (c = 0; c <= lastpos; c++)
+ sp (st, L->xrec[c], L->yrec[c], 0);
+ st->threads--;
+ }
+ break;
+ }
+ }
+}
+
+static void
+vermiculate_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->point)
+ {
+ free(st->point);
+ }
+ free (st);
+}
+
+
+static const char *vermiculate_defaults[] = {
+ ".lowrez: true",
+ ".background: Black",
+ "*ticks: 20000",
+ "*fpsSolid: true",
+ "*speed: 1",
+ "*instring: ",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec vermiculate_options[] = {
+ {"-speed", ".speed", XrmoptionSepArg, 0},
+ {"-instring", ".instring", XrmoptionSepArg, 0},
+ {0, 0, 0, 0}
+};
+
+
+XSCREENSAVER_MODULE ("Vermiculate", vermiculate)
diff --git a/hacks/vermiculate.man b/hacks/vermiculate.man
new file mode 100644
index 0000000..cbb9077
--- /dev/null
+++ b/hacks/vermiculate.man
@@ -0,0 +1,48 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+vermiculate - to move in a worm-like manner.
+.SH SYNOPSIS
+.B vermiculate
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-fps]
+.SH DESCRIPTION
+Draws squiggly worm-like paths.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tyler Pierce. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tyler Pierce.
diff --git a/hacks/vfeedback.c b/hacks/vfeedback.c
new file mode 100644
index 0000000..5b482a7
--- /dev/null
+++ b/hacks/vfeedback.c
@@ -0,0 +1,628 @@
+/* vfeedback, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Simulates video feedback: pointing a video camera at an NTSC television.
+ *
+ * Created: 4-Aug-2018.
+ *
+ * TODO:
+ *
+ * - Figure out better UI gestures on mobile to pan, zoom and rotate.
+ *
+ * - When zoomed in really far, grab_rectangle should decompose pixels
+ * into RGB phosphor dots.
+ *
+ * - Maybe load an image and chroma-key it, letting transparency bleed,
+ * for that Amiga Genlock, Cabaret Voltaire look.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "screenhack.h"
+#include "analogtv.h"
+
+#include <time.h>
+
+#undef DEBUG
+#undef DARKEN
+
+#ifdef DEBUG
+# include "ximage-loader.h"
+# include "images/gen/testcard_bbcf_png.h"
+#endif
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int w, h;
+ Pixmap pix;
+ GC gc;
+ double start, last_time;
+ double noise;
+ double zoom, rot;
+ double value, svalue, speed, dx, dy, ds, dth;
+
+ struct { double x, y, w, h, th; } rect, orect;
+ struct { int x, y, s; } specular;
+
+ enum { POWERUP, IDLE, MOVE } state;
+ analogtv *tv;
+ analogtv_reception rec;
+ Bool button_down_p;
+ int mouse_x, mouse_y;
+ double mouse_th;
+ Bool dragmode;
+
+# ifdef DEBUG
+ XImage *tcimg;
+# endif
+
+};
+
+
+static void
+twiddle_knobs (struct state *st)
+{
+ st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN; /* roll picture once */
+ st->rec.level = 0.8 + frand(1.0); /* signal strength (low = dark, static) */
+ st->tv->color_control = frand(1.0) * RANDSIGN();
+ st->tv->contrast_control = 0.4 + frand(1.0);
+ st->tv->tint_control = frand(360);
+}
+
+
+static void
+twiddle_camera (struct state *st)
+{
+# if 0
+ st->rect.x = 0;
+ st->rect.y = 0;
+ st->rect.w = 1;
+ st->rect.h = 1;
+ st->rect.th = 0;
+# else
+ st->rect.x = frand(0.1) * RANDSIGN();
+ st->rect.y = frand(0.1) * RANDSIGN();
+ st->rect.w = st->rect.h = 1 + frand(0.4) * RANDSIGN();
+ st->rect.th = 0.2 + frand(1.0) * RANDSIGN();
+# endif
+}
+
+
+static void *
+vfeedback_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->tv = analogtv_allocate (st->dpy, st->window);
+ analogtv_set_defaults (st->tv, "");
+ st->tv->need_clear = 1;
+ st->rec.input = analogtv_input_allocate();
+ analogtv_setup_sync (st->rec.input, 1, 0);
+ st->tv->use_color = 1;
+ st->tv->powerup = 0;
+ st->rec.multipath = 0;
+ twiddle_camera (st);
+ twiddle_knobs (st);
+ st->noise = get_float_resource (st->dpy, "noise", "Float");
+ st->speed = get_float_resource (st->dpy, "speed", "Float");
+
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ st->state = POWERUP;
+ st->value = 0;
+
+ st->w = 640;
+ st->h = 480;
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->gc = XCreateGC (dpy, st->window, GCForeground, &gcv);
+
+ st->orect = st->rect;
+
+# ifdef DEBUG
+ {
+ int w, h;
+ Pixmap p;
+ p = image_data_to_pixmap (dpy, window,
+ testcard_bbcf_png, sizeof(testcard_bbcf_png),
+ &w, &h, 0);
+ st->tcimg = XGetImage (dpy, p, 0, 0, w, h, ~0L, ZPixmap);
+ XFreePixmap (dpy, p);
+ }
+# endif
+
+# ifndef HAVE_JWXYZ
+ XSelectInput (dpy, window,
+ PointerMotionMask | st->xgwa.your_event_mask);
+# endif
+
+ return st;
+}
+
+
+static double
+ease_fn (double r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static double
+ease_ratio (double r)
+{
+ double ease = 0.5;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+static XImage *
+grab_rectangle (struct state *st)
+{
+ XImage *in, *out;
+
+ /* Under XQuartz we can't just do XGetImage on the Window, we have to
+ go through an intermediate Pixmap first. I don't understand why.
+ */
+ if (! st->pix)
+ st->pix = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+
+ XCopyArea (st->dpy, st->window, st->pix, st->gc, 0, 0,
+ st->xgwa.width, st->xgwa.height, 0, 0);
+
+ if (st->specular.s)
+ {
+ double p = 0.2;
+ double r = (st->svalue < p ? st->svalue/p :
+ st->svalue >= 1-p ? (1-st->svalue)/p :
+ 1);
+ double s = st->specular.s * ease_ratio (r * 2);
+ XFillArc (st->dpy, st->pix, st->gc,
+ st->specular.x - s/2,
+ st->specular.y - s/2,
+ s, s, 0, 360*64);
+ }
+
+# ifdef DEBUG
+ in = st->tcimg;
+# else
+ in = XGetImage (st->dpy, st->pix,
+ 0, 0, st->xgwa.width, st->xgwa.height,
+ ~0L, ZPixmap);
+ /* Could actually use st->tv->image here, except we don't have the
+ subrectangle being used (overall_top, usewidth, etc.) */
+# endif
+
+ out = XCreateImage (st->dpy, st->xgwa.visual, st->xgwa.depth,
+ ZPixmap, 0, NULL,
+ st->w, st->h, 8, 0);
+
+ if (! in) abort();
+ if (! out) abort();
+ out->data = (char *) calloc (out->height, out->bytes_per_line);
+ if (! out->data) abort();
+
+ {
+ double C = cos (st->rect.th);
+ double S = sin (st->rect.th);
+ unsigned long black = BlackPixelOfScreen (st->xgwa.screen);
+ int ox, oy;
+ for (oy = 0; oy < out->height; oy++)
+ {
+ double doy = (double) oy / out->height;
+ double diy = st->rect.h * doy + st->rect.y - 0.5;
+
+ float dix_mul = (float) st->rect.w / out->width;
+ float dix_add = (-0.5 + st->rect.x) * st->rect.w;
+ float ix_add = (-diy * S + 0.5) * in->width;
+ float iy_add = ( diy * C + 0.5) * in->height;
+ float ix_mul = C * in->width;
+ float iy_mul = S * in->height;
+
+ ix_add += dix_add * ix_mul;
+ iy_add += dix_add * iy_mul;
+ ix_mul *= dix_mul;
+ iy_mul *= dix_mul;
+
+ if (in->bits_per_pixel == 32 &&
+ out->bits_per_pixel == 32)
+ {
+ /* Unwrapping XGetPixel and XPutPixel gains us several FPS here */
+ uint32_t *out_line =
+ (uint32_t *) (out->data + out->bytes_per_line * oy);
+ for (ox = 0; ox < out->width; ox++)
+ {
+ float dix = ox;
+ int ix = dix * ix_mul + ix_add;
+ int iy = dix * iy_mul + iy_add;
+ unsigned long p = (ix >= 0 && ix < in->width &&
+ iy >= 0 && iy < in->height
+ ? ((uint32_t *)
+ (in->data + in->bytes_per_line * iy))[ix]
+ : black);
+# ifdef HAVE_JWXYZ
+ p |= black; /* We get 0 instead of BlackPixel... */
+# endif
+ out_line[ox] = p;
+ }
+ }
+ else
+ for (ox = 0; ox < out->width; ox++)
+ {
+ float dix = ox;
+ int ix = dix * ix_mul + ix_add;
+ int iy = dix * iy_mul + iy_add;
+ unsigned long p = (ix >= 0 && ix < in->width &&
+ iy >= 0 && iy < in->height
+ ? XGetPixel (in, ix, iy)
+ : black);
+# ifdef HAVE_JWXYZ
+ p |= black; /* We get 0 instead of BlackPixel... */
+# endif
+ XPutPixel (out, ox, oy, p);
+ }
+ }
+ }
+
+# ifndef DEBUG
+ XDestroyImage (in);
+# endif
+
+ return out;
+}
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static unsigned long
+vfeedback_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ const analogtv_reception *rec = &st->rec;
+ double then = double_time(), now, timedelta;
+ XImage *img = 0;
+
+ switch (st->state) {
+ case POWERUP: case IDLE: break;
+ case MOVE:
+ st->rect.x = st->orect.x + st->dx * ease_ratio (st->value);
+ st->rect.y = st->orect.y + st->dy * ease_ratio (st->value);
+ st->rect.th = st->orect.th + st->dth * ease_ratio (st->value);
+ st->rect.w = st->orect.w * (1 + (st->ds * ease_ratio (st->value)));
+ st->rect.h = st->orect.h * (1 + (st->ds * ease_ratio (st->value)));
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ if (! st->button_down_p)
+ {
+ st->value += 0.03 * st->speed;
+ if (st->value > 1 || st->state == POWERUP)
+ {
+ st->orect = st->rect;
+ st->value = 0;
+ st->dx = st->dy = st->ds = st->dth = 0;
+
+ switch (st->state) {
+ case POWERUP:
+ /* Wait until the monitor has warmed up before turning on
+ the camcorder? */
+ /* if (st->tv->powerup > 4.0) */
+ st->state = IDLE;
+ break;
+ case IDLE:
+ st->state = MOVE;
+ if (! (random() % 5))
+ st->ds = frand(0.2) * RANDSIGN(); /* zoom */
+ if (! (random() % 3))
+ st->dth = frand(0.2) * RANDSIGN(); /* rotate */
+ if (! (random() % 8))
+ st->dx = frand(0.05) * RANDSIGN(), /* pan */
+ st->dy = frand(0.05) * RANDSIGN();
+ if (! (random() % 2000))
+ {
+ twiddle_knobs (st);
+ if (! (random() % 10))
+ twiddle_camera (st);
+ }
+ break;
+ case MOVE:
+ st->state = IDLE;
+ st->value = 0.3;
+ break;
+ default:
+ abort();
+ break;
+ }
+ }
+
+ /* Draw a specular reflection somewhere on the screen, to mix it up
+ with a little noise from environmental light.
+ */
+ if (st->specular.s)
+ {
+ st->svalue += 0.01 * st->speed;
+ if (st->svalue > 1)
+ {
+ st->svalue = 0;
+ st->specular.s = 0;
+ }
+ }
+ else if (! (random() % 300))
+ {
+# if 1
+ /* Center on the monitor's screen, depth 1 */
+ int cx = st->xgwa.width / 2;
+ int cy = st->xgwa.height / 2;
+# else
+ /* Center on the monitor's screen, depth 0 -- but this clips. */
+ int cx = (st->rect.x + st->rect.w / 2) * st->xgwa.width;
+ int cy = (st->rect.y + st->rect.h / 2) * st->xgwa.height;
+# endif
+ int ww = 4 + (st->rect.h * st->xgwa.height) / 12;
+ st->specular.x = cx + (random() % ww) * RANDSIGN();
+ st->specular.y = cy + (random() % ww) * RANDSIGN();
+ st->specular.s = ww * (0.8 + frand(0.4));
+ st->svalue = 0;
+ }
+ }
+
+ if (st->last_time == 0)
+ st->start = then;
+
+ if (st->state != POWERUP)
+ {
+ img = grab_rectangle (st);
+ analogtv_load_ximage (st->tv, st->rec.input, img, 0, 0, 0, 0, 0);
+ }
+
+ analogtv_reception_update (&st->rec);
+ analogtv_draw (st->tv, st->noise, &rec, 1);
+ if (img)
+ XDestroyImage (img);
+
+ now = double_time();
+ timedelta = (1 / 29.97) - (now - then);
+
+ st->tv->powerup = then - st->start;
+ st->last_time = then;
+
+ return timedelta > 0 ? timedelta * 1000000 : 0;
+}
+
+
+static void
+vfeedback_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_reconfigure (st->tv);
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ if (st->pix)
+ {
+ XFreePixmap (dpy, st->pix);
+ st->pix = 0;
+ }
+}
+
+
+static Bool
+vfeedback_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ double i = 0.02;
+
+ /* Pan with left button and no modifier keys.
+ Rotate with other buttons, or left-with-modifiers.
+ */
+ if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button1 ||
+ event->xbutton.button == Button2 ||
+ event->xbutton.button == Button3))
+ {
+ st->button_down_p = True;
+ st->mouse_x = event->xbutton.x;
+ st->mouse_y = event->xbutton.y;
+ st->mouse_th = st->rect.th;
+ st->dragmode = (event->xbutton.button == Button1 &&
+ !event->xbutton.state);
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ (event->xbutton.button == Button1 ||
+ event->xbutton.button == Button2 ||
+ event->xbutton.button == Button3))
+ {
+ st->button_down_p = False;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && st->button_down_p)
+ {
+ if (st->dragmode)
+ {
+ double dx = st->mouse_x - event->xmotion.x;
+ double dy = st->mouse_y - event->xmotion.y;
+ st->rect.x += dx / st->xgwa.width * st->rect.w;
+ st->rect.y += dy / st->xgwa.height * st->rect.h;
+ st->mouse_x = event->xmotion.x;
+ st->mouse_y = event->xmotion.y;
+ }
+ else
+ {
+ /* Angle between center and initial click */
+ double a1 = -atan2 (st->mouse_y - st->xgwa.height / 2,
+ st->mouse_x - st->xgwa.width / 2);
+ /* Angle between center and drag position */
+ double a2 = -atan2 (event->xmotion.y - st->xgwa.height / 2,
+ event->xmotion.x - st->xgwa.width / 2);
+ /* Cumulatively rotate by difference between them */
+ st->rect.th = a2 - a1 + st->mouse_th;
+ }
+ goto OK;
+ }
+
+ /* Zoom with mouse wheel */
+
+ else if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button6))
+ {
+ i = 1-i;
+ goto ZZ;
+ }
+ else if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button5 ||
+ event->xbutton.button == Button7))
+ {
+ i = 1+i;
+ goto ZZ;
+ }
+ else if (event->type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ switch (keysym) {
+ /* pan with arrow keys */
+ case XK_Up: st->rect.y += i; goto OK; break;
+ case XK_Down: st->rect.y -= i; goto OK; break;
+ case XK_Left: st->rect.x += i; goto OK; break;
+ case XK_Right: st->rect.x -= i; goto OK; break;
+ default: break;
+ }
+ switch (c) {
+
+ /* rotate with <> */
+ case '<': case ',': st->rect.th += i; goto OK; break;
+ case '>': case '.': st->rect.th -= i; goto OK; break;
+
+ /* zoom with += */
+ case '-': case '_':
+ i = 1+i;
+ goto ZZ;
+ case '=': case '+':
+ i = 1-i;
+ ZZ:
+ st->orect = st->rect;
+ st->rect.w *= i;
+ st->rect.h *= i;
+ st->rect.x += (st->orect.w - st->rect.w) / 2;
+ st->rect.y += (st->orect.h - st->rect.h) / 2;
+ goto OK;
+ break;
+
+ /* tv controls with T, C, B, O */
+ case 't': st->tv->tint_control += 5; goto OK; break;
+ case 'T': st->tv->tint_control -= 5; goto OK; break;
+ case 'c': st->tv->color_control += 0.1; goto OK; break;
+ case 'C': st->tv->color_control -= 0.1; goto OK; break;
+ case 'b': st->tv->brightness_control += 0.01; goto OK; break;
+ case 'B': st->tv->brightness_control -= 0.01; goto OK; break;
+ case 'o': st->tv->contrast_control += 0.1; goto OK; break;
+ case 'O': st->tv->contrast_control -= 0.1; goto OK; break;
+ case 'r': st->rec.level += 0.01; goto OK; break;
+ case 'R': st->rec.level -= 0.01; goto OK; break;
+ default: break;
+ }
+ goto NOPE;
+ OK:
+# if 0
+ fprintf (stderr, " %.6f x %.6f @ %.6f, %.6f %.6f\t",
+ st->rect.w, st->rect.h,
+ st->rect.x, st->rect.y, st->rect.th);
+ fprintf (stderr," T=%.2f C=%.2f B=%.2f O=%.2f R=%.3f\n",
+ st->tv->tint_control,
+ st->tv->color_control/* * 100*/,
+ st->tv->brightness_control/* * 100*/,
+ st->tv->contrast_control/* * 100*/,
+ st->rec.level);
+# endif
+ st->value = 0;
+ st->state = IDLE;
+ st->orect = st->rect;
+ return True;
+ }
+
+ NOPE:
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ /* SPC or RET re-randomize the TV controls. */
+ twiddle_knobs (st);
+ goto OK;
+ }
+
+ return False;
+}
+
+
+static void
+vfeedback_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_release (st->tv);
+ if (st->pix)
+ XFreePixmap (dpy, st->pix);
+ XFreeGC (dpy, st->gc);
+ free (st);
+}
+
+
+static const char *vfeedback_defaults [] = {
+
+ ".foreground: #CCCC44",
+ ".background: #000000",
+ "*noise: 0.02",
+ "*speed: 1.0",
+ ANALOGTV_DEFAULTS
+ "*TVBrightness: 1.5",
+ "*TVContrast: 150",
+ 0
+};
+
+static XrmOptionDescRec vfeedback_options [] = {
+ { "-noise", ".noise", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("VFeedback", vfeedback)
diff --git a/hacks/vfeedback.man b/hacks/vfeedback.man
new file mode 100644
index 0000000..d58fe06
--- /dev/null
+++ b/hacks/vfeedback.man
@@ -0,0 +1,71 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+vfeedback - Simulates video feedback.
+.SH SYNOPSIS
+.B vfeedback
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-tv-color \fInumber\fP]
+[\-tv-tint \fInumber\fP]
+[\-noise \fInumber\fP]
+[\-tv-brightness \fInumber\fP]
+[\-tv-contrast \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Simulates video feedback: pointing a video camera at an NTSC television.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-tv-color \fInumber\fP
+Color Knob. 0 - 1000. Default: 70.
+.TP 8
+.B \-tv-tint \fInumber\fP
+Tint Knob. 0 - 100. Default: 5.
+.TP 8
+.B \-noise \fInumber\fP
+Analog noise. 0.0 - 0.2. Default: 0.02.
+.TP 8
+.B \-darken \fInumber\fP
+Darken the looped image. 0.0 - 1.0. Default: 0.7.
+.TP 8
+.B \-tv-brightness \fInumber\fP
+Brightness Knob. 0.0 - 100.0. Default: 3.0.
+.TP 8
+.B \-tv-contrast \fInumber\fP
+Contrast Knob. 0 - 1500. Default: 1000.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/vidwhacker b/hacks/vidwhacker
new file mode 100755
index 0000000..9646f6b
--- /dev/null
+++ b/hacks/vidwhacker
@@ -0,0 +1,506 @@
+#!/usr/bin/perl -w
+# vidwhacker, for xscreensaver. Copyright (c) 1998-2011 Jamie Zawinski.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This program grabs a frame of video, then uses various pbm filters to
+# munge the image in random nefarious ways, then uses xloadimage, xli, or xv
+# to put it on the root window. This works out really nicely if you just
+# feed some random TV station into it...
+#
+# Created: 14-Apr-01.
+
+require 5;
+use diagnostics;
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.33 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+my $use_stdin = 0;
+my $use_stdout = 0;
+my $video_p = 0;
+my $file_p = 1;
+my $delay = 5;
+my $imagedir;
+
+my $screen_width = -1;
+
+my $displayer = "xscreensaver-getimage -root -file";
+
+sub which($);
+
+# apparently some versions of netpbm call it "pamoil" instead of "pgmoil"...
+#
+my $pgmoil = (which("pamoil") ? "pamoil" : "pgmoil");
+
+
+# List of interesting PPM filter pipelines.
+# In this list, the following magic words may be used:
+#
+# COLORS a randomly-selected pair of RGB foreground/background colors.
+# FILE1 the (already-existing) input PPM file (ok to overwrite it).
+# FILE2-FILE4 names of other tmp files you can use.
+#
+# These commands should read from FILE1, and write to stdout.
+# All tmp files will be deleted afterward.
+#
+my @filters = (
+ "ppmtopgm FILE1 | pgmedge | pgmtoppm COLORS | ppmnorm",
+ "ppmtopgm FILE1 | pgmenhance | pgmtoppm COLORS",
+ "ppmtopgm FILE1 | $pgmoil | pgmtoppm COLORS",
+ "ppmtopgm FILE1 | pgmbentley | pgmtoppm COLORS",
+
+ "ppmrelief FILE1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |" .
+ " pgmedge | pnminvert | pgmtoppm COLORS",
+
+ "ppmspread 71 FILE1 > FILE2 ; " .
+ " pnmarith -add FILE1 FILE2 ; ",
+
+ "pnmflip -lr < FILE1 > FILE2 ; " .
+ " pnmarith -multiply FILE1 FILE2 > FILE3 ; " .
+ " pnmflip -tb FILE3 | ppmnorm > FILE2 ; " .
+ " pnmarith -multiply FILE1 FILE2",
+
+ "pnmflip -lr FILE1 > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2",
+
+ "pnmflip -tb FILE1 > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2",
+
+ "pnmflip -lr FILE1 | pnmflip -tb > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2",
+
+ "ppmtopgm < FILE1 | pgmedge > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2 > FILE3 ; " .
+ " cp FILE3 FILE1 ; " .
+ " ppmtopgm < FILE1 | pgmedge > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2 > FILE3 ; " .
+ " ppmnorm < FILE1",
+
+ "pnmflip -lr < FILE1 > FILE2 ; " .
+ " pnmarith -multiply FILE1 FILE2 | ppmrelief | ppmnorm | pnminvert",
+
+ "pnmflip -lr FILE1 > FILE2 ; " .
+ " pnmarith -subtract FILE1 FILE2 | ppmrelief | ppmtopgm | pgmedge",
+
+ "pgmcrater -number 20000 -width WIDTH -height HEIGHT FILE1 | " .
+ " pgmtoppm COLORS > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2 > FILE3 ; " .
+ " pnmflip -tb FILE3 | ppmnorm > FILE2 ; " .
+ " pnmarith -multiply FILE1 FILE2",
+
+ "ppmshift 30 FILE1 | ppmtopgm | $pgmoil | pgmedge | " .
+ " pgmtoppm COLORS > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2",
+
+ "ppmpat -madras WIDTH HEIGHT | pnmdepth 255 > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2",
+
+ "ppmpat -tartan WIDTH HEIGHT | pnmdepth 255 > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2",
+
+ "ppmpat -camo WIDTH HEIGHT | pnmdepth 255 | ppmshift 50 > FILE2 ; " .
+ " pnmarith -multiply FILE1 FILE2",
+
+ "pgmnoise WIDTH HEIGHT | pgmedge | pgmtoppm COLORS > FILE2 ; " .
+ " pnmarith -difference FILE1 FILE2 | pnmdepth 255 | pnmsmooth",
+);
+
+
+# Any files on this list will be deleted at exit.
+#
+my @all_tmpfiles = ();
+
+sub exit_cleanup() {
+ print STDERR "$progname: delete tmp files\n" if ($verbose);
+ unlink @all_tmpfiles;
+}
+
+sub signal_cleanup() {
+ my ($sig) = @_;
+ print STDERR "$progname: caught SIG$sig\n" if ($verbose);
+ exit 1;
+}
+
+sub init_signals() {
+
+ $SIG{HUP} = \&signal_cleanup;
+ $SIG{INT} = \&signal_cleanup;
+ $SIG{QUIT} = \&signal_cleanup;
+ $SIG{ABRT} = \&signal_cleanup;
+ $SIG{KILL} = \&signal_cleanup;
+ $SIG{TERM} = \&signal_cleanup;
+
+ # Need this so that if giftopnm dies, we don't die.
+ $SIG{PIPE} = 'IGNORE';
+}
+
+END { exit_cleanup(); }
+
+
+# returns the full path of the named program, or undef.
+#
+sub which($) {
+ my ($prog) = @_;
+ foreach (split (/:/, $ENV{PATH})) {
+ if (-x "$_/$prog") {
+ return $prog;
+ }
+ }
+ return undef;
+}
+
+
+# Choose random foreground and background colors
+#
+sub randcolors() {
+ return sprintf ("#%02x%02x%02x-#%02x%02x%02x",
+ int(rand()*60),
+ int(rand()*60),
+ int(rand()*60),
+ 120+int(rand()*135),
+ 120+int(rand()*135),
+ 120+int(rand()*135));
+}
+
+
+
+sub filter_subst($$$@) {
+ my ($filter, $width, $height, @tmpfiles) = @_;
+ my $colors = randcolors();
+ $filter =~ s/\bWIDTH\b/$width/g;
+ $filter =~ s/\bHEIGHT\b/$height/g;
+ $filter =~ s/\bCOLORS\b/'$colors'/g;
+ my $i = 1;
+ foreach my $t (@tmpfiles) {
+ $filter =~ s/\bFILE$i\b/$t/g;
+ $i++;
+ }
+ if ($filter =~ m/([A-Z]+)/) {
+ error ("internal error: what is \"$1\"?");
+ }
+ $filter =~ s/ +/ /g;
+ return $filter;
+}
+
+# Frobnicate the image in some random way.
+#
+sub frob_ppm($) {
+ my ($ppm_data) = @_;
+ $_ = $ppm_data;
+
+ error ("0-length data") if (!defined($ppm_data) || $ppm_data eq "");
+ error ("not a PPM file") unless (m/^P\d\n/s);
+ my ($width, $height) = m/^P\d\n(\d+) (\d+)\n/s;
+ error ("got a bogus PPM") unless ($width && $height);
+
+ my $tmpdir = $ENV{TMPDIR};
+ $tmpdir = "/tmp" unless $tmpdir;
+ my $fn = sprintf ("%s/vidwhacker-0-%08x", $tmpdir, rand(0xFFFFFFFF));
+ my $fn1 = sprintf ("%s/vidwhacker-1-%08x", $tmpdir, rand(0xFFFFFFFF));
+ my $fn2 = sprintf ("%s/vidwhacker-2-%08x", $tmpdir, rand(0xFFFFFFFF));
+ my $fn3 = sprintf ("%s/vidwhacker-3-%08x", $tmpdir, rand(0xFFFFFFFF));
+ my @files = ( "$fn", "$fn1", "$fn2", "$fn3" );
+ push @all_tmpfiles, @files;
+
+ my $n = int(rand($#filters+1));
+ my $filter = $filters[$n];
+
+ if ($verbose == 1) {
+ printf STDERR "$progname: running filter $n\n";
+ } elsif ($verbose > 1) {
+ my $f = $filter;
+ $f =~ s/ +/ /g;
+ $f =~ s/^ */\t/;
+ $f =~ s/ *\|/\n\t|/g;
+ $f =~ s/ *\; */ ;\n\t/g;
+ print STDERR "$progname: filter $n:\n\n$f\n\n" if $verbose;
+ }
+
+ $filter = filter_subst ($filter, $width, $height, @files);
+
+ unlink @files;
+
+ local *OUT;
+ open (OUT, ">$files[0]") || error ("writing $files[0]: $!");
+ print OUT $ppm_data;
+ close OUT;
+
+ $filter = "( $filter )";
+ $filter .= "2>/dev/null" unless ($verbose > 1);
+
+ local *IN;
+ open (IN, "$filter |") || error ("opening pipe: $!");
+ $ppm_data = "";
+ while (<IN>) { $ppm_data .= $_; }
+ close IN;
+
+ unlink @files;
+ return $ppm_data;
+}
+
+
+sub read_config() {
+ my $conf = "$ENV{HOME}/.xscreensaver";
+
+ my $had_dir = defined($imagedir);
+
+ local *IN;
+ open (IN, "<$conf") || error ("reading $conf: $!");
+ while (<IN>) {
+ if (!$imagedir && m/^imageDirectory:\s+(.*)\s*$/i) { $imagedir = $1; }
+ elsif (m/^grabVideoFrames:\s+true\s*$/i) { $video_p = 1; }
+ elsif (m/^grabVideoFrames:\s+false\s*$/i) { $video_p = 0; }
+ elsif (m/^chooseRandomImages:\s+true\s*$/i) { $file_p = 1; }
+ elsif (m/^chooseRandomImages:\s+false\s*$/i) { $file_p = 0; }
+ }
+ close IN;
+
+ $file_p = 1 if $had_dir;
+
+ $imagedir = undef unless ($imagedir && $imagedir ne '');
+
+ if (!$file_p && !$video_p) {
+# error ("neither grabVideoFrames nor chooseRandomImages are set\n\t") .
+# "in $conf; $progname requires one or both."
+ $file_p = 1;
+ }
+
+ if ($file_p) {
+ error ("no imageDirectory set in $conf") unless $imagedir;
+ error ("imageDirectory $imagedir doesn't exist") unless (-d $imagedir);
+ }
+
+ if ($verbose > 1) {
+ printf STDERR "$progname: grab video: $video_p\n";
+ printf STDERR "$progname: grab images: $file_p\n";
+ printf STDERR "$progname: directory: $imagedir\n";
+ }
+
+}
+
+
+sub get_ppm() {
+ if ($use_stdin) {
+ print STDERR "$progname: reading from stdin\n" if ($verbose > 1);
+ my $ppm = "";
+ while (<STDIN>) { $ppm .= $_; }
+ return $ppm;
+
+ } else {
+
+ my $do_file_p;
+
+ if ($file_p && $video_p) {
+ $do_file_p = (int(rand(2)) == 0);
+ print STDERR "$progname: doing " . ($do_file_p ? "files" : "video") ."\n"
+ if ($verbose);
+ }
+ elsif ($file_p) { $do_file_p = 1; }
+ elsif ($video_p) { $do_file_p = 0; }
+ else {
+ error ("internal error: not grabbing files or video?");
+ }
+
+ my $v = ($verbose <= 1 ? "" : "-" . ("v" x ($verbose-1)));
+ my $cmd;
+ if ($do_file_p) {
+ $cmd = "xscreensaver-getimage-file $v --name \"$imagedir\"";
+ } else {
+ $cmd = "xscreensaver-getimage-video $v --stdout";
+ }
+
+ my $ppm;
+
+ if ($do_file_p) {
+
+ print STDERR "$progname: running: $cmd\n" if ($verbose > 1);
+ my $fn = `$cmd`;
+ $fn =~ s/\n$//s;
+ error ("didn't get a file?") if ($fn eq "");
+ $fn = "$imagedir/$fn" unless ($fn =~ m@^/@s);
+
+ print STDERR "$progname: selected file $fn\n" if ($verbose > 1);
+
+ if ($fn =~ m/\.gif/i) { $cmd = "giftopnm < \"$fn\""; }
+ elsif ($fn =~ m/\.jpe?g/i) { $cmd = "djpeg < \"$fn\""; }
+ elsif ($fn =~ m/\.png/i) { $cmd = "pngtopnm < \"$fn\""; }
+ elsif ($fn =~ m/\.xpm/i) { $cmd = "xpmtoppm < \"$fn\""; }
+ elsif ($fn =~ m/\.bmp/i) { $cmd = "bmptoppm < \"$fn\""; }
+ elsif ($fn =~ m/\.tiff?/i) { $cmd = "tifftopnm < \"$fn\""; }
+ elsif ($fn =~ m/\.p[bgp]m/i) { return `cat \"$fn\"`; }
+ else {
+ print STDERR "$progname: $fn: unrecognized file extension\n";
+ # go around the loop and get another
+ return undef;
+ }
+
+ print STDERR "$progname: converting with: $cmd\n" if ($verbose > 1);
+ $cmd .= " 2>/dev/null" unless ($verbose > 1);
+ $ppm = `$cmd`;
+
+ } else {
+
+ print STDERR "$progname: running: $cmd\n" if ($verbose > 1);
+ $ppm = `$cmd`;
+ error ("no data?") if ($ppm eq "");
+ error ("not a PPM file") unless ($ppm =~ m/^P\d\n/s);
+
+ $_ = $ppm;
+ my ($width, $height) = m/^P\d\n(\d+) (\d+)\n/s;
+ error ("got a bogus PPM") unless ($width && $height);
+ print STDERR "$progname: grabbed ${width}x$height PPM\n"
+ if ($verbose > 1);
+ $_ = 0;
+ }
+
+ return $ppm;
+ }
+}
+
+sub dispose_ppm($) {
+ my ($ppm) = @_;
+
+ error ("0-length data") if (!defined($ppm) || $ppm eq "");
+ error ("not a PPM file") unless ($ppm =~ m/^P\d\n/s);
+
+ if ($use_stdout) {
+ print STDERR "$progname: writing to stdout\n" if ($verbose > 1);
+ print $ppm;
+
+ } else {
+ my $tmpdir = $ENV{TMPDIR};
+ $tmpdir = "/tmp" unless $tmpdir;
+ my $fn = sprintf ("%s/vidwhacker-%08x.ppm", $tmpdir, rand(0xFFFFFFFF));
+ local *OUT;
+ unlink $fn;
+ push @all_tmpfiles, $fn;
+ open (OUT, ">$fn") || error ("writing $fn: $!");
+ print OUT $ppm;
+ close OUT;
+
+ my @cmd = split (/ +/, $displayer);
+ push @cmd, $fn;
+ print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+ if ($verbose);
+ system (@cmd);
+
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+
+ unlink $fn;
+
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ error ("$cmd[0]: exited with $exit_value!") if ($exit_value);
+ }
+}
+
+
+my $stdin_ppm = undef;
+
+sub vidwhack() {
+ my $ppm;
+ if ($use_stdin) {
+ if (!defined($stdin_ppm)) {
+ $stdin_ppm = get_ppm();
+ }
+ $ppm = $stdin_ppm;
+ } else {
+ my $max_err_count = 20;
+ my $err_count = 0;
+ while (!defined($ppm)) {
+ $ppm = get_ppm();
+ $err_count++ if (!defined ($ppm));
+ error ("too many errors, too few images!")
+ if ($err_count > $max_err_count);
+ }
+ }
+
+ $ppm = frob_ppm ($ppm);
+ dispose_ppm ($ppm);
+ $ppm = undef;
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "VidWhacker, Copyright (c) 2001 Jamie Zawinski <jwz\@jwz.org>\n";
+ print STDERR " https://www.jwz.org/xscreensaver/";
+ print STDERR "\n";
+ print STDERR "usage: $0 [-display dpy] [-verbose]\n";
+ print STDERR "\t\t[-root | -window | -window-id 0xXXXXX ]\n";
+ print STDERR "\t\t[-stdin] [-stdout] [-delay secs]\n";
+ print STDERR "\t\t[-directory image_directory]\n";
+ exit 1;
+}
+
+sub main() {
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/) { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^(-display|-disp|-dis|-dpy|-d)$/) { $ENV{DISPLAY} = shift @ARGV; }
+ elsif (m/^--?stdin$/) { $use_stdin = 1; }
+ elsif (m/^--?stdout$/) { $use_stdout = 1; }
+ elsif (m/^--?delay$/) { $delay = shift @ARGV; }
+ elsif (m/^--?dir(ectory)?$/) { $imagedir = shift @ARGV; }
+ elsif (m/^--?root$/) { }
+ elsif (m/^--?window-id$/) {
+ my $id = shift @ARGV;
+ error ("unparsable window id: $id")
+ unless ($id =~ m/^\d+$|^0x[\da-f]+$/i);
+ $displayer =~ s/--?root\b/$id/ ||
+ error ("unable to munge displayer: $displayer");
+ }
+ elsif (m/^--?window$/) {
+ print STDERR "$progname: sorry, \"-window\" is unimplemented.\n";
+ print STDERR "$progname: use \"-stdout\" and pipe to a displayer.\n";
+ exit 1;
+ }
+ elsif (m/^-./) { usage; }
+ else { usage; }
+ }
+
+ init_signals();
+
+ read_config;
+
+ # sanity checking - is pbm installed?
+ # (this is a non-exhaustive but representative list)
+ foreach ("ppmtopgm", "pgmenhance", "pnminvert", "pnmarith", "pnmdepth") {
+ which ($_) || error "$_ not found on \$PATH.";
+ }
+
+ if (!$use_stdout) {
+ $_ = `xdpyinfo 2>&-`;
+ ($screen_width) =~ m/ dimensions: +(\d+)x(\d+) pixels/;
+ $screen_width = 800 unless $screen_width > 0;
+ }
+
+ if ($use_stdout) {
+ vidwhack();
+ } else {
+ while (1) {
+ vidwhack();
+ sleep $delay;
+ }
+ }
+}
+
+main();
+exit 0;
diff --git a/hacks/vidwhacker.man b/hacks/vidwhacker.man
new file mode 100644
index 0000000..8c2505b
--- /dev/null
+++ b/hacks/vidwhacker.man
@@ -0,0 +1,89 @@
+.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
+.SH NAME
+vidwhacker - grab images and apply random filters to them
+.SH SYNOPSIS
+.B vidwhacker
+[\-display \fIhost:display.screen\fP] [\-root] [\-verbose]
+[\-stdin] [\-stdout] [\-delay seconds]
+[-directory \fIdirectory\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIvidwhacker\fP program grabs an image from disk, or from the
+system's video input, then applies random image filters to it, and
+displays the result. The \fIvidwhacker\fP program does not terminate
+until killed.
+
+It depends heavily on the various PBM tools (e.g.,
+.BR ppmrelief (1).)
+
+Selection of random image files is done by running the
+.BR xscreensaver-getimage-file (1)
+program. Capture of video frames (if requested) is done by running the
+.BR xscreensaver-getimage-video (1)
+program. The options of whether to do video, and which directory to
+search for images, are specified in the \fI~/.xscreensaver\fP file.
+.SH OPTIONS
+.I vidwhacker
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window. This is the default.
+.TP 8
+.B \-verbose
+Print diagnostics.
+.TP 8
+.B \-stdin
+Instead of grabbing an image from disk or video, read an image
+to manipulate from stdin. This image must be in
+.BR ppm (5)
+format. The program will still perform repeated random image
+transformations, but it will always use this one image as its starting point.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to sleep between images. Default 5 seconds (the actual
+elapsed time is significantly longer, due to processing time.)
+.TP 8
+.B \-stdout
+Instead of displaying the image on a window or on the root, write the new
+image on stdout, and exit.
+.TP 8
+.B \-directory \fIdirectory\fP
+Use this directory instead of the \fBimageDirectory\fP specified in
+the \fI~/.xscreensaver\fP file.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+It's slow.
+.SH TO DO
+It might be interesting to rewrite this to use
+.BR gimp (1)
+plugins instead of the pbm tools. It probably wouldn't be any faster,
+but there would be a wider variety of effects available.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver-getimage-file (1),
+.BR xscreensaver-getimage-video (1),
+.BR xv (1),
+.BR ppmtogif (1),
+.BR cjpeg (1)
+.SH COPYRIGHT
+Copyright \(co 1998-2001 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 18-Jan-98.
diff --git a/hacks/vines.c b/hacks/vines.c
new file mode 100644
index 0000000..7f519b4
--- /dev/null
+++ b/hacks/vines.c
@@ -0,0 +1,179 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* vines --- vine fractals */
+
+#if 0
+static const char sccsid[] = "@(#)vines.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1997 by Tracy Camp campt@hurrah.com
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * If you make a modification I would of course appreciate a copy.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 11-Jul-1997: David Hansen <dhansen@metapath.com>
+ * Changed names to vines and modified draw loop
+ * to honor batchcount so vines can be grown or plotted.
+ * 10-May-1997: Compatible with xscreensaver
+ * 21-Mar-1997: David Hansen <dhansen@metapath.com>
+ * Updated mode to draw complete patterns on every
+ * iteration instead of growing the vine. Also made
+ * adjustments to randomization and changed variable
+ * names to make logic easier to follow.
+ */
+
+/*-
+ * This was modifed from a 'screen saver' that a friend and I
+ * wrote on our TI-8x calculators in high school physics one day
+ * Basically another geometric pattern generator, this ones claim
+ * to fame is a pseudo-fractal looking vine like pattern that creates
+ * nifty whorls and loops.
+ */
+
+#ifdef STANDALONE
+# define MODE_vines
+# define DEFAULTS "*delay: 200000 \n" \
+ "*count: 0 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*lowrez: True \n" \
+
+# include "xlockmore.h" /* in xscreensaver distribution */
+# define free_vines 0
+# define release_vines 0
+# define reshape_vines 0
+# define vines_handle_event 0
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_vines
+
+ENTRYPOINT ModeSpecOpt vines_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct vines_description =
+{"vines", "init_vines", "draw_vines", (char *) NULL,
+ "refresh_vines", "init_vines", (char *) NULL, &vines_opts,
+ 200000, 0, 1, 1, 64, 1.0, "",
+ "Shows fractals", 0, NULL};
+
+#endif
+
+typedef struct {
+ int a;
+ int x1;
+ int y1;
+ int x2;
+ int y2;
+ int i;
+ int length;
+ int iterations;
+ int constant;
+ int ang;
+ int centerx;
+ int centery;
+} vinestruct;
+
+static vinestruct *vines = (vinestruct *) NULL;
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_vines(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+} /* refresh_vines */
+#endif
+
+ENTRYPOINT void
+init_vines(ModeInfo * mi)
+{
+ vinestruct *fp;
+
+ MI_INIT (mi, vines);
+ fp = &vines[MI_SCREEN(mi)];
+
+ fp->i = 0;
+ fp->length = 0;
+ fp->iterations = 30 + NRAND(100);
+
+ MI_CLEARWINDOW(mi);
+} /* init_vines */
+
+ENTRYPOINT void
+draw_vines(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int count;
+ vinestruct *fp;
+
+ if (vines == NULL)
+ return;
+ fp = &vines[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (fp->i >= fp->length) {
+ if (--(fp->iterations) == 0) {
+ init_vines(mi);
+ return;
+ }
+ fp->centerx = NRAND(MI_WIDTH(mi));
+ fp->centery = NRAND(MI_HEIGHT(mi));
+
+ fp->ang = 60 + NRAND(720);
+ fp->length = 100 + NRAND(3000);
+ fp->constant = fp->length * (10 + NRAND(10));
+
+ fp->i = 0;
+ fp->a = 0;
+ fp->x1 = 0;
+ fp->y1 = 0;
+ fp->x2 = 1;
+ fp->y2 = 0;
+
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
+ else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ }
+ count = fp->i + MI_COUNT(mi);
+ if ((count <= fp->i) || (count > fp->length))
+ count = fp->length;
+
+ while (fp->i < count) {
+ XDrawLine(display, MI_WINDOW(mi), gc,
+ fp->centerx + (fp->x1 / fp->constant),
+ fp->centery - (fp->y1 / fp->constant),
+ fp->centerx + (fp->x2 / fp->constant),
+ fp->centery - (fp->y2 / fp->constant));
+
+ fp->a += (fp->ang * fp->i);
+
+ fp->x1 = fp->x2;
+ fp->y1 = fp->y2;
+
+ fp->x2 += (int) (fp->i * (cos((double) fp->a) * 360.0) / (2.0 * M_PI));
+ fp->y2 += (int) (fp->i * (sin((double) fp->a) * 360.0) / (2.0 * M_PI));
+ fp->i++;
+ }
+} /* draw_vines */
+
+
+XSCREENSAVER_MODULE ("Vines", vines)
+
+#endif /* MODE_vines */
diff --git a/hacks/vines.man b/hacks/vines.man
new file mode 100644
index 0000000..45e7985
--- /dev/null
+++ b/hacks/vines.man
@@ -0,0 +1,66 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+vines - draws pseudo-fractal geometric patterns
+.SH SYNOPSIS
+.B vines
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIvines\fP program is yet another geometric pattern generator, this
+one's claim to fame being a pseudo-fractal looking vine like pattern that
+creates nifty whorls and loops.
+.SH OPTIONS
+.I vines
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Tracy Camp.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Tracy Camp <campt@hurrah.com>, 1997.
+
+Tweaked by David Hansen <dhansen@metapath.com>, 21-Mar-97.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/vms_axp.opt b/hacks/vms_axp.opt
new file mode 100644
index 0000000..6446159
--- /dev/null
+++ b/hacks/vms_axp.opt
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/vms_axp_12.opt b/hacks/vms_axp_12.opt
new file mode 100644
index 0000000..10f9426
--- /dev/null
+++ b/hacks/vms_axp_12.opt
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/vms_decc.opt b/hacks/vms_decc.opt
new file mode 100644
index 0000000..43d6858
--- /dev/null
+++ b/hacks/vms_decc.opt
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/vms_decc_12.opt b/hacks/vms_decc_12.opt
new file mode 100644
index 0000000..dd6d2f3
--- /dev/null
+++ b/hacks/vms_decc_12.opt
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/wander.c b/hacks/wander.c
new file mode 100644
index 0000000..50fe255
--- /dev/null
+++ b/hacks/wander.c
@@ -0,0 +1,280 @@
+/* wander, by Rick Campbell <rick@campbellcentral.org>, 19 December 1998.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <stdio.h>
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+
+#define MAXIMUM_COLOR_COUNT (256)
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ unsigned int advance;
+ Bool circles;
+ Colormap color_map;
+ int color_count;
+ int color_index;
+ XColor colors [MAXIMUM_COLOR_COUNT];
+ GC context;
+ unsigned int density;
+ int depth;
+ int height;
+ unsigned int length;
+ unsigned int reset;
+ Bool reset_p;
+ unsigned int size;
+ int width;
+ int delay;
+
+ int x, y, last_x, last_y, width_1, height_1, length_limit, reset_limit;
+ unsigned long color;
+ Pixmap pixmap;
+
+ eraser_state *eraser;
+};
+
+
+static void *
+wander_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues values;
+ XWindowAttributes attributes;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+
+ XClearWindow (st->dpy, st->window);
+ XGetWindowAttributes (st->dpy, st->window, &attributes);
+ st->width = attributes.width;
+ st->height = attributes.height;
+ st->depth = attributes.depth;
+ st->color_map = attributes.colormap;
+ if (st->color_count)
+ {
+ free_colors (attributes.screen, st->color_map,
+ st->colors, st->color_count);
+ st->color_count = 0;
+ }
+ st->context = XCreateGC (st->dpy, st->window, 0, &values);
+ st->color_count = MAXIMUM_COLOR_COUNT;
+ make_color_loop (attributes.screen, attributes.visual, st->color_map,
+ 0, 1, 1,
+ 120, 1, 1,
+ 240, 1, 1,
+ st->colors, &st->color_count, True, False);
+ if (st->color_count <= 0)
+ {
+ st->color_count = 2;
+ st->colors [0].red = st->colors [0].green = st->colors [0].blue = 0;
+ st->colors [1].red = st->colors [1].green = st->colors [1].blue = 0xFFFF;
+ XAllocColor (st->dpy, st->color_map, &st->colors [0]);
+ XAllocColor (st->dpy, st->color_map, &st->colors [1]);
+ }
+ st->color_index = NRAND (st->color_count);
+
+ st->advance = get_integer_resource (st->dpy, "advance", "Integer");
+ st->density = get_integer_resource (st->dpy, "density", "Integer");
+ if (st->density < 1) st->density = 1;
+ st->reset = get_integer_resource (st->dpy, "reset", "Integer");
+ if (st->reset < 100) st->reset = 100;
+ st->circles = get_boolean_resource (st->dpy, "circles", "Boolean");
+ st->size = get_integer_resource (st->dpy, "size", "Integer");
+ if (st->size < 1) st->size = 1;
+ st->width = st->width / st->size;
+ st->height = st->height / st->size;
+ st->length = get_integer_resource (st->dpy, "length", "Integer");
+ if (st->length < 1) st->length = 1;
+ XSetForeground (st->dpy, st->context, st->colors [st->color_index].pixel);
+
+
+ st->x = NRAND (st->width);
+ st->y = NRAND (st->height);
+ st->last_x = st->x;
+ st->last_y = st->y;
+ st->width_1 = st->width - 1;
+ st->height_1 = st->height - 1;
+ st->length_limit = st->length;
+ st->reset_limit = st->reset;
+ st->color_index = NRAND (st->color_count);
+ st->color = st->colors [NRAND (st->color_count)].pixel;
+ st->pixmap = XCreatePixmap (st->dpy, window, st->size,
+ st->size, st->depth);
+
+ XSetForeground (st->dpy, st->context,
+ BlackPixel (st->dpy, DefaultScreen (st->dpy)));
+ XFillRectangle (st->dpy, st->pixmap, st->context, 0, 0,
+ st->width * st->size, st->height * st->size);
+ XSetForeground (st->dpy, st->context, st->color);
+ XFillArc (st->dpy, st->pixmap, st->context, 0, 0, st->size, st->size, 0, 360*64);
+
+ return st;
+}
+
+
+static unsigned long
+wander_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+
+ if (st->eraser) {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ goto END;
+ }
+
+ for (i = 0; i < 2000; i++)
+ {
+ if (NRAND (st->density))
+ {
+ st->x = st->last_x;
+ st->y = st->last_y;
+ }
+ else
+ {
+ st->last_x = st->x;
+ st->last_y = st->y;
+ st->x += st->width_1 + NRAND (3);
+ while (st->x >= st->width)
+ st->x -= st->width;
+ st->y += st->height_1 + NRAND (3);
+ while (st->y >= st->height)
+ st->y -= st->height;
+ }
+
+ if (NRAND (st->length_limit) == 0)
+ {
+ if (st->advance == 0)
+ {
+ st->color_index = NRAND (st->color_count);
+ }
+ else
+ {
+ st->color_index = (st->color_index + st->advance) % st->color_count;
+ }
+ st->color = st->colors [st->color_index].pixel;
+ XSetForeground (st->dpy, st->context, st->color);
+ if (st->circles)
+ {
+ XFillArc (st->dpy, st->pixmap, st->context,
+ 0, 0, st->size, st->size, 0, 360 * 64);
+ }
+ }
+
+ if (st->reset_p || NRAND (st->reset_limit) == 0)
+ {
+ st->reset_p = 0;
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ st->color = st->colors [NRAND (st->color_count)].pixel;
+ st->x = NRAND (st->width);
+ st->y = NRAND (st->height);
+ st->last_x = st->x;
+ st->last_y = st->y;
+ if (st->circles)
+ {
+ XFillArc (st->dpy, st->pixmap, st->context, 0, 0, st->size, st->size, 0, 360*64);
+ }
+ }
+
+ if (st->size == 1)
+ {
+ XDrawPoint (st->dpy, st->window, st->context, st->x, st->y);
+ }
+ else
+ {
+ if (st->circles)
+ {
+ XCopyArea (st->dpy, st->pixmap, st->window, st->context, 0, 0, st->size, st->size,
+ st->x * st->size, st->y * st->size);
+ }
+ else
+ {
+ XFillRectangle (st->dpy, st->window, st->context, st->x * st->size, st->y * st->size,
+ st->size, st->size);
+ }
+ }
+ }
+
+ END:
+ return st->delay;
+}
+
+
+static void
+wander_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w / st->size;
+ st->height = h / st->size;
+ st->width_1 = st->width - 1;
+ st->height_1 = st->height - 1;
+}
+
+static Bool
+wander_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->reset_p = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+wander_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (st->dpy, st->context);
+ free (st);
+}
+
+static const char *wander_defaults [] =
+{
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ ".fpsSolid: true",
+ ".advance: 1",
+ ".density: 2",
+ ".length: 25000",
+ ".delay: 20000",
+ ".reset: 2500000",
+ ".circles: False",
+ ".size: 1",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec wander_options [] =
+{
+ { "-advance", ".advance", XrmoptionSepArg, 0 },
+ { "-circles", ".circles", XrmoptionNoArg, "True" },
+ { "-no-circles",".circles", XrmoptionNoArg, "False" },
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-length", ".length", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-reset", ".reset", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Wander", wander)
diff --git a/hacks/wander.man b/hacks/wander.man
new file mode 100644
index 0000000..497d35e
--- /dev/null
+++ b/hacks/wander.man
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+wander - colorful random-walk.
+.SH SYNOPSIS
+.B wander
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-density \fInumber\fP]
+[\-reset \fInumber\fP]
+[\-length \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-circles]
+[\-size \fInumber\fP]
+[\-advance \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a colorful random-walk, in various forms.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-density \fInumber\fP
+Density. 1 - 30. Default: 2.
+.TP 8
+.B \-reset \fInumber\fP
+Number of frames before resetting. Default: 2500000.
+.TP 8
+.B \-length \fInumber\fP
+Number of iterations. Default: 25000.
+.TP 8
+.B \-delay \fInumber\fP
+Sustain. 0 - 60. Default: 1.
+.TP 8
+.B \-circles | \-no-circles
+Whether to draw spots.
+.TP 8
+.B \-size \fInumber\fP
+Size. 0 - 100. Default: 1.
+.TP 8
+.B \-advance \fInumber\fP
+Color Contrast. 1 - 100. Default: 1.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Rick Campbell. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Rick Campbell.
diff --git a/hacks/webcollage b/hacks/webcollage
new file mode 100755
index 0000000..bacc814
--- /dev/null
+++ b/hacks/webcollage
@@ -0,0 +1,4048 @@
+#!/usr/bin/perl -w
+#
+# webcollage, Copyright © 1999-2018 by Jamie Zawinski <jwz@jwz.org>
+# This program decorates the screen with random images from the web.
+# One satisfied customer described it as "a nonstop pop culture brainbath."
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+
+
+# To run this as a display mode with xscreensaver, add this to `programs':
+#
+# webcollage --root
+# webcollage --root --filter 'vidwhacker --stdin --stdout'
+#
+#
+# You can see this in action at https://www.jwz.org/webcollage/ --
+# it auto-reloads about once a minute. To make a page similar to
+# that on your own system, do this:
+#
+# webcollage --size '800x600' --imagemap $HOME/www/webcollage/index
+#
+#
+# Requires that either the provided "webcollage-helper" program or
+# ImageMagick's "convert" be available on $PATH.
+#
+#
+# If you have the "driftnet" program installed, webcollage can display a
+# collage of images sniffed off your local ethernet, instead of pulled out
+# of search engines: in that way, your screensaver can display the images
+# that your co-workers are downloading!
+#
+# Driftnet is available here: http://www.ex-parrot.com/~chris/driftnet/
+# Use it like so:
+#
+# webcollage --root --driftnet
+#
+# Driftnet is the Unix implementation of the MacOS "EtherPEG" program.
+
+
+require 5;
+use strict;
+
+# We can't "use diagnostics" here, because that library malfunctions if
+# you signal and catch alarms: it says "Uncaught exception from user code"
+# and exits, even though I damned well AM catching it!
+#use diagnostics;
+
+
+require Time::Local;
+require POSIX;
+use Fcntl ':flock'; # import LOCK_* constants
+use POSIX qw(strftime);
+use LWP::UserAgent;
+
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.182 $' =~ m/\s(\d[.\d]+)\s/s);
+my $copyright = "WebCollage $version, Copyright (c) 1999-2017" .
+ " Jamie Zawinski <jwz\@jwz.org>\n" .
+ " https://www.jwz.org/webcollage/\n";
+
+
+
+my @search_methods = (
+ # Google is rate-limiting us now, so this works ok from
+ # a short-running screen saver, but not as a batch job.
+ # I haven't found a workaround.
+ #
+ 5, "googlephotos", \&pick_from_google_image_photos,
+ 3, "googleimgs", \&pick_from_google_images,
+ 3, "googlenums", \&pick_from_google_image_numbers,
+
+ # So let's try Bing instead. No rate limiting yet!
+ #
+ 13, "bingphotos", \&pick_from_bing_image_photos,
+ 11, "bingimgs", \&pick_from_bing_images,
+ 10, "bingnums", \&pick_from_bing_image_numbers,
+
+ 20, "flickr_recent", \&pick_from_flickr_recent,
+ 15, "flickr_random", \&pick_from_flickr_random,
+ 6, "livejournal", \&pick_from_livejournal_images,
+
+ 11, "imgur", \&pick_from_imgur,
+
+ # Tumblr doesn't have an "or" search, so this isn't great.
+ 3, "tumblr", \&pick_from_tumblr,
+
+ # I ran out of usable access tokens, May 2017
+ # 0, "instagram", \&pick_from_instagram,
+
+ # No longer exists, as of Apr 2014
+ # 0, "yahoorand", \&pick_from_yahoo_random_link,
+
+ # Twitter destroyed their whole API in 2013.
+ # 0, "twitpic", \&pick_from_twitpic_images,
+ # 0, "twitter", \&pick_from_twitter_images,
+
+ # This is a cute way to search for a certain webcams.
+ # Not included in default methods, since these images
+ # aren't terribly interesting by themselves.
+ # See also "SurveillanceSaver".
+ #
+ 0, "securitycam", \&pick_from_security_camera,
+
+ # Nonfunctional as of June 2011.
+ # 0, "altavista", \&pick_from_alta_vista_random_link,
+
+ # In Apr 2002, Google asked me to stop searching them.
+ # I asked them to add a "random link" url. They said
+ # "that would be easy, we'll think about it" and then
+ # never wrote back. Booo Google! Booooo! So, screw
+ # those turkeys, I've turned Google searching back on.
+ # I'm sure they can take it. (Jan 2005.)
+
+ # Jan 2005: Yahoo fucked up their search form so that
+ # it's no longer possible to do "or" searches on news
+ # images, so we rarely get any hits there any more.
+ #
+ # 0, "yahoonews", \&pick_from_yahoo_news_text,
+
+ # Dec 2004: the ircimages guy's server can't take the
+ # heat, so he started banning the webcollage user agent.
+ # I tried to convince him to add a lighter-weight page to
+ # support webcollage better, but he doesn't care.
+ #
+ # 0, "ircimages", \&pick_from_ircimages,
+
+ # Dec 2002: Alta Vista has a new "random link" URL now.
+ # They added it specifically to better support webcollage!
+ # That was super cool of them. This is how we used to do
+ # it, before:
+ #
+ # 0, "avimages", \&pick_from_alta_vista_images,
+ # 0, "avtext", \&pick_from_alta_vista_text,
+
+ # This broke in 2004. Eh, Lycos sucks anyway.
+ #
+ # 0, "lycos", \&pick_from_lycos_text,
+
+ # This broke in 2003, I think. I suspect Hotbot is
+ # actually the same search engine data as Lycos.
+ #
+ # 0, "hotbot", \&pick_from_hotbot_text,
+ );
+
+# programs we can use to write to the root window (tried in ascending order.)
+#
+my @root_displayers = (
+ "xscreensaver-getimage -root -file",
+ "chbg -once -xscreensaver -max_size 100",
+ "xv -root -quit -viewonly +noresetroot -quick24 -rmode 5" .
+ " -rfg black -rbg black",
+ "xli -quiet -onroot -center -border black",
+ "xloadimage -quiet -onroot -center -border black",
+
+# this lame program wasn't built with vroot.h:
+# "xsri -scale -keep-aspect -center-horizontal -center-vertical",
+);
+
+
+# Some sites need cookies to work properly. These are they.
+#
+my %cookies = (
+ "www.altavista.com" => "AV_ALL=1", # request uncensored searches
+ "web.altavista.com" => "AV_ALL=1",
+ "ircimages.com" => 'disclaimer=1',
+);
+
+
+# If this is set, it's a helper program to use for pasting images together:
+# this is somewhat faster than using ImageMagick.
+#
+my $webcollage_helper = undef;
+my $convert_cmd = 'convert';
+
+my $opacity = 0.85; # Opacity when pasting images together.
+
+
+# Some sites have managed to poison the search engines. These are they.
+# (We auto-detect sites that have poisoned the search engines via excessive
+# keywords or dictionary words, but these are ones that slip through
+# anyway.)
+#
+# This can contain full host names, or 2 or 3 component domains.
+#
+my %poisoners = (
+ "die.net" => 1, # 'l33t h4ck3r d00dz.
+ "genforum.genealogy.com" => 1, # Cluttering avtext with human names.
+ "rootsweb.com" => 1, # Cluttering avtext with human names.
+ "akamai.net" => 1, # Lots of sites have their images on Akamai.
+ "akamaitech.net" => 1, # But those are pretty much all banners.
+ # Since Akamai is super-expensive, let's
+ # go out on a limb and assume that all of
+ # their customers are rich-and-boring.
+ "bartleby.com" => 1, # Dictionary, cluttering avtext.
+ "encyclopedia.com" => 1, # Dictionary, cluttering avtext.
+ "onlinedictionary.datasegment.com" => 1, # Dictionary, cluttering avtext.
+ "hotlinkpics.com" => 1, # Porn site that has poisoned avimages
+ # (I don't see how they did it, though!)
+ "alwayshotels.com" => 1, # Poisoned Lycos pretty heavily.
+ "nextag.com" => 1, # Poisoned Alta Vista real good.
+ "ghettodriveby.com" => 1, # Poisoned Google Images.
+ "crosswordsolver.org" => 1, # Poisoned Google Images.
+ "xona.com" => 1, # Poisoned Google Images.
+ "freepatentsonline.com" => 1, # Poisoned Google Images.
+ "herbdatanz.com" => 1, # Poisoned Google Images.
+);
+
+
+# When verbosity is turned on, we warn about sites that we seem to be hitting
+# a lot: usually this means some new poisoner has made it into the search
+# engines. But sometimes, the warning is just because that site has a lot
+# of stuff on it. So these are the sites that are immune to the "frequent
+# site" diagnostic message.
+#
+my %warningless_sites = (
+ "home.earthlink.net" => 1,
+ "www.angelfire.com" => 1,
+ "members.aol.com" => 1,
+ "img.photobucket.com" => 1,
+ "pics.livejournal.com" => 1,
+ "tinypic.com" => 1,
+ "flickr.com" => 1,
+ "staticflickr.com" => 1,
+ "pbase.com" => 1,
+ "blogger.com" => 1,
+ "multiply.com" => 1,
+ "wikimedia.org" => 1,
+ "twitpic.com" => 1,
+ "amazonaws.com" => 1,
+ "blogspot.com" => 1,
+ "photoshelter.com" => 1,
+ "myspacecdn.com" => 1,
+ "feedburner.com" => 1,
+ "wikia.com" => 1,
+ "ljplus.ru" => 1,
+ "yandex.ru" => 1,
+ "imgur.com" => 1,
+ "tumblr.com" => 1,
+ "yfrog.com" => 1,
+ "cdninstagram.com" => 1,
+ "gstatic.com" => 1,
+
+ "yimg.com" => 1, # This is where dailynews.yahoo.com stores
+ "eimg.com" => 1, # its images, so pick_from_yahoo_news_text()
+ # hits this every time.
+
+ "images.quizfarm.com" => 1, # damn those LJ quizzes...
+ "images.quizilla.com" => 1,
+ "images.quizdiva.net" => 1,
+
+ "driftnet" => 1, # builtin...
+ "local-directory" => 1, # builtin...
+);
+
+
+# For decoding HTML-encoded character entities to URLs.
+# In This Modern World, probably we should use HTML::Entities instead.
+#
+my %entity_table = (
+ "apos" => '\'',
+ "quot" => '"', "amp" => '&', "lt" => '<',
+ "gt" => '>', "nbsp" => ' ', "iexcl" => '',
+ "cent" => "\xA2", "pound" => "\xA3", "curren" => "\xA4",
+ "yen" => "\xA5", "brvbar" => "\xA6", "sect" => "\xA7",
+ "uml" => "\xA8", "copy" => "\xA9", "ordf" => "\xAA",
+ "laquo" => "\xAB", "not" => "\xAC", "shy" => "\xAD",
+ "reg" => "\xAE", "macr" => "\xAF", "deg" => "\xB0",
+ "plusmn" => "\xB1", "sup2" => "\xB2", "sup3" => "\xB3",
+ "acute" => "\xB4", "micro" => "\xB5", "para" => "\xB6",
+ "middot" => "\xB7", "cedil" => "\xB8", "sup1" => "\xB9",
+ "ordm" => "\xBA", "raquo" => "\xBB", "frac14" => "\xBC",
+ "frac12" => "\xBD", "frac34" => "\xBE", "iquest" => "\xBF",
+ "Agrave" => "\xC0", "Aacute" => "\xC1", "Acirc" => "\xC2",
+ "Atilde" => "\xC3", "Auml" => "\xC4", "Aring" => "\xC5",
+ "AElig" => "\xC6", "Ccedil" => "\xC7", "Egrave" => "\xC8",
+ "Eacute" => "\xC9", "Ecirc" => "\xCA", "Euml" => "\xCB",
+ "Igrave" => "\xCC", "Iacute" => "\xCD", "Icirc" => "\xCE",
+ "Iuml" => "\xCF", "ETH" => "\xD0", "Ntilde" => "\xD1",
+ "Ograve" => "\xD2", "Oacute" => "\xD3", "Ocirc" => "\xD4",
+ "Otilde" => "\xD5", "Ouml" => "\xD6", "times" => "\xD7",
+ "Oslash" => "\xD8", "Ugrave" => "\xD9", "Uacute" => "\xDA",
+ "Ucirc" => "\xDB", "Uuml" => "\xDC", "Yacute" => "\xDD",
+ "THORN" => "\xDE", "szlig" => "\xDF", "agrave" => "\xE0",
+ "aacute" => "\xE1", "acirc" => "\xE2", "atilde" => "\xE3",
+ "auml" => "\xE4", "aring" => "\xE5", "aelig" => "\xE6",
+ "ccedil" => "\xE7", "egrave" => "\xE8", "eacute" => "\xE9",
+ "ecirc" => "\xEA", "euml" => "\xEB", "igrave" => "\xEC",
+ "iacute" => "\xED", "icirc" => "\xEE", "iuml" => "\xEF",
+ "eth" => "\xF0", "ntilde" => "\xF1", "ograve" => "\xF2",
+ "oacute" => "\xF3", "ocirc" => "\xF4", "otilde" => "\xF5",
+ "ouml" => "\xF6", "divide" => "\xF7", "oslash" => "\xF8",
+ "ugrave" => "\xF9", "uacute" => "\xFA", "ucirc" => "\xFB",
+ "uuml" => "\xFC", "yacute" => "\xFD", "thorn" => "\xFE",
+ "yuml" => "\xFF",
+
+ # HTML 4 entities that do not have 1:1 Latin1 mappings.
+ "bull" => "*", "hellip"=> "...", "prime" => "'", "Prime" => "\"",
+ "frasl" => "/", "trade" => "[tm]", "larr" => "<-", "rarr" => "->",
+ "harr" => "<->", "lArr" => "<=", "rArr" => "=>", "hArr" => "<=>",
+ "empty" => "\xD8", "minus" => "-", "lowast"=> "*", "sim" => "~",
+ "cong" => "=~", "asymp" => "~", "ne" => "!=", "equiv" => "==",
+ "le" => "<=", "ge" => ">=", "lang" => "<", "rang" => ">",
+ "loz" => "<>", "OElig" => "OE", "oelig" => "oe", "Yuml" => "Y",
+ "circ" => "^", "tilde" => "~", "ensp" => " ", "emsp" => " ",
+ "thinsp"=> " ", "ndash" => "-", "mdash" => "--", "lsquo" => "`",
+ "rsquo" => "'", "sbquo" => "'", "ldquo" => "\"", "rdquo" => "\"",
+ "bdquo" => "\"", "lsaquo"=> "<", "rsaquo"=> ">",
+);
+
+
+##############################################################################
+#
+# Various global flags set by command line parameters, or computed
+#
+##############################################################################
+
+
+my $current_state = "???"; # for diagnostics
+my $load_method;
+my $last_search;
+my $image_succeeded = -1;
+my $suppress_audit = 0;
+
+my $verbose_imgmap = 0; # print out rectangles and URLs only (stdout)
+my $verbose_warnings = 0; # print out warnings when things go wrong
+my $verbose_load = 0; # diagnostics about loading of URLs
+my $verbose_filter = 0; # diagnostics about page selection/rejection
+my $verbose_net = 0; # diagnostics about network I/O
+my $verbose_decode = 0; # diagnostics about img conversion pipelines
+my $verbose_http = 0; # diagnostics about all HTTP activity
+my $verbose_exec = 0; # diagnostics about executing programs
+
+my $report_performance_interval = 60 * 15; # print some stats every 15 minutes
+
+my $http_proxy = undef;
+my $http_timeout = 20;
+my $cvt_timeout = 10;
+
+my $min_width = 50;
+my $min_height = 50;
+my $min_ratio = 1/5;
+
+my $min_gif_area = (120 * 120);
+
+
+my $no_output_p = 0;
+my $urls_only_p = 0;
+my $cocoa_p = 0;
+my $imagemap_base = undef;
+
+my @pids_to_kill = (); # forked pids we should kill when we exit, if any.
+
+my $driftnet_magic = 'driftnet';
+my $driftnet_dir = undef;
+my $default_driftnet_cmd = "driftnet -a -m 100";
+
+my $local_magic = 'local-directory';
+my $local_dir = undef;
+
+my $wordlist;
+
+my %rejected_urls;
+my @tripwire_words = ("aberrate", "abode", "amorphous", "antioch",
+ "arrhenius", "arteriole", "blanket", "brainchild",
+ "burdensome", "carnival", "cherub", "chord", "clever",
+ "dedicate", "dilogarithm", "dolan", "dryden",
+ "eggplant");
+
+
+##############################################################################
+#
+# Retrieving URLs
+#
+##############################################################################
+
+# returns three values: the HTTP response line; the document headers;
+# and the document body.
+#
+sub get_document_1($$$) {
+ my ($url, $referer, $timeout) = @_;
+
+ if (!defined($timeout)) { $timeout = $http_timeout; }
+ if ($timeout > $http_timeout) { $timeout = $http_timeout; }
+
+ my $user_agent = "$progname/$version";
+
+ if ($url =~ m@^https?://www\.altavista\.com/@s ||
+ $url =~ m@^https?://random\.yahoo\.com/@s ||
+ $url =~ m@^https?://[^./]+\.google\.com/@s ||
+ $url =~ m@^https?://www\.livejournal\.com/@s) {
+ # block this, you turkeys.
+ $user_agent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7)' .
+ ' Gecko/20070914 Firefox/2.0.0.7';
+ }
+
+ my $ua = LWP::UserAgent->new ( agent => $user_agent,
+ keep_alive => 0,
+ env_proxy => 0,
+ );
+ $ua->proxy ('http', $http_proxy) if $http_proxy;
+ $ua->default_header ('Referer' => $referer) if $referer;
+ $ua->default_header ('Accept' => '*/*');
+ $ua->timeout($timeout) if $timeout;
+
+ if (0) {
+ $ua->add_handler ("request_send",
+ sub($$$) {
+ my ($req, $ua, $h) = @_;
+ print "\n>>[[\n"; $req->dump; print "\n]]\n";
+ return;
+ });
+ $ua->add_handler ("response_data",
+ sub($$$$) {
+ my ($req, $ua, $h, $data) = @_;
+ #print "\n<<[[\n"; print $data; print "\n]]\n";
+ return 1;
+ });
+ $ua->add_handler ("request_done",
+ sub($$$) {
+ my ($req, $ua, $h) = @_;
+ print "\n<<[[\n"; $req->dump; print "\n]]\n";
+ return;
+ });
+ }
+
+ if ($verbose_http) {
+ LOG (1, " ==> GET $url");
+ LOG (1, " ==> User-Agent: $user_agent");
+ LOG (1, " ==> Referer: $referer") if $referer;
+ }
+
+ my $res = $ua->get ($url);
+
+ my $http = ($res ? $res->status_line : '') || '';
+ my $head = ($res ? $res->headers() : '') || '';
+ $head = $head->as_string() if $head;
+ my $body = ($res && $res->is_success ? $res->decoded_content : '') || '';
+
+ LOG ($verbose_net, "get_document_1 $url " . ($referer ? $referer : ""));
+
+ $head =~ s/\r\n/\n/gs;
+ $head =~ s/\r/\n/gs;
+ if ($verbose_http) {
+ foreach (split (/\n/, $head)) {
+ LOG ($verbose_http, " <== $_");
+ }
+ }
+
+ my @L = split(/\r\n|\r|\n/, $body);
+ my $lines = @L;
+ LOG ($verbose_http,
+ " <== [ body ]: $lines lines, " . length($body) . " bytes");
+
+ if (!$http) {
+ LOG (($verbose_net || $verbose_load), "null response: $url");
+ return ();
+ }
+
+ return ( $http, $head, $body );
+}
+
+
+# returns two values: the document headers; and the document body.
+# if the given URL did a redirect, returns the redirected-to document.
+#
+sub get_document($$;$) {
+ my ($url, $referer, $timeout) = @_;
+ my $start = time;
+
+ if (defined($referer) && $referer eq $driftnet_magic) {
+ return get_driftnet_file ($url);
+ }
+
+ if (defined($referer) && $referer eq $local_magic) {
+ return get_local_file ($url);
+ }
+
+ my $orig_url = $url;
+ my $loop_count = 0;
+ my $max_loop_count = 4;
+
+ do {
+ if (defined($timeout) && $timeout <= 0) {
+ LOG (($verbose_net || $verbose_load), "timed out for $url");
+ $suppress_audit = 1;
+ return ();
+ }
+
+ my ( $http, $head, $body ) = get_document_1 ($url, $referer, $timeout);
+
+ if (defined ($timeout)) {
+ my $now = time;
+ my $elapsed = $now - $start;
+ $timeout -= $elapsed;
+ $start = $now;
+ }
+
+ return () unless $http; # error message already printed
+
+ $http =~ s/[\r\n]+$//s;
+
+ if ( $http =~ m@^HTTP/[0-9.]+ 30[123]@ ) {
+ $_ = $head;
+
+ my ( $location ) = m@^location:[ \t]*(.*)$@im;
+ if ( $location ) {
+ $location =~ s/[\r\n]$//;
+
+ LOG ($verbose_net, "redirect from $url to $location");
+ $referer = $url;
+ $url = $location;
+
+ if ($url =~ m@^/@) {
+ $referer =~ m@^(https?://[^/]+)@i;
+ $url = $1 . $url;
+ } elsif (! ($url =~ m@^[a-z]+:@i)) {
+ $_ = $referer;
+ s@[^/]+$@@g if m@^https?://[^/]+/@i;
+ $_ .= "/" if m@^https?://[^/]+$@i;
+ $url = $_ . $url;
+ }
+
+ } else {
+ LOG ($verbose_net, "no Location with \"$http\"");
+ return ( $url, $body );
+ }
+
+ if ($loop_count++ > $max_loop_count) {
+ LOG ($verbose_net,
+ "too many redirects ($max_loop_count) from $orig_url");
+ $body = undef;
+ return ();
+ }
+
+ } elsif ( $http =~ m@^HTTP/[0-9.]+ ([4-9][0-9][0-9].*)$@ ) {
+
+ LOG (($verbose_net || $verbose_load), "failed: $1 ($url)");
+
+ # http errors -- return nothing.
+ $body = undef;
+ return ();
+
+ } elsif (!$body) {
+
+ LOG (($verbose_net || $verbose_load), "document contains no data: $url");
+ return ();
+
+ } else {
+
+ # ok!
+ return ( $url, $body );
+ }
+
+ } while (1);
+}
+
+# If we already have a cookie defined for this site, and the site is trying
+# to overwrite that very same cookie, let it do so. This is because nytimes
+# expires its cookies - it lets you upgrade to a new cookie without logging
+# in again, but you have to present the old cookie to get the new cookie.
+# So, by doing this, the built-in cypherpunks cookie will never go "stale".
+#
+sub set_cookie($$) {
+ my ($host, $cookie) = @_;
+ my $oc = $cookies{$host};
+ return unless $oc;
+ $_ = $oc;
+ my ($oc_name, $oc_value) = m@^([^= \t\r\n]+)=(.*)$@;
+ $_ = $cookie;
+ my ($nc_name, $nc_value) = m@^([^= \t\r\n]+)=(.*)$@;
+
+ if ($oc_name eq $nc_name &&
+ $oc_value ne $nc_value) {
+ $cookies{$host} = $cookie;
+ LOG ($verbose_net, "overwrote ${host}'s $oc_name cookie");
+ }
+}
+
+
+############################################################################
+#
+# Extracting image URLs from HTML
+#
+############################################################################
+
+# given a URL and the body text at that URL, selects and returns a random
+# image from it. returns () if no suitable images found.
+#
+sub pick_image_from_body($$) {
+ my ($url, $body) = @_;
+
+ my $base = $url;
+ $_ = $url;
+
+ # if there's at least one slash after the host, take off the last
+ # pathname component
+ if ( m@^https?://[^/]+/@io ) {
+ $base =~ s@[^/]+$@@go;
+ }
+
+ # if there are no slashes after the host at all, put one on the end.
+ if ( m@^https?://[^/]+$@io ) {
+ $base .= "/";
+ }
+
+ $_ = $body;
+
+ # strip out newlines, compress whitespace
+ s/[\r\n\t ]+/ /go;
+
+ # nuke comments
+ s/<!--.*?-->//go;
+
+
+ # There are certain web sites that list huge numbers of dictionary
+ # words in their bodies or in their <META NAME=KEYWORDS> tags (surprise!
+ # Porn sites tend not to be reputable!)
+ #
+ # I do not want webcollage to filter on content: I want it to select
+ # randomly from the set of images on the web. All the logic here for
+ # rejecting some images is really a set of heuristics for rejecting
+ # images that are not really images: for rejecting *text* that is in
+ # GIF/JPEG/PNG form. I don't want text, I want pictures, and I want
+ # the content of the pictures to be randomly selected from among all
+ # the available content.
+ #
+ # So, filtering out "dirty" pictures by looking for "dirty" keywords
+ # would be wrong: dirty pictures exist, like it or not, so webcollage
+ # should be able to select them.
+ #
+ # However, picking a random URL is a hard thing to do. The mechanism I'm
+ # using is to search for a selection of random words. This is not
+ # perfect, but works ok most of the time. The way it breaks down is when
+ # some URLs get precedence because their pages list *every word* as
+ # related -- those URLs come up more often than others.
+ #
+ # So, after we've retrieved a URL, if it has too many keywords, reject
+ # it. We reject it not on the basis of what those keywords are, but on
+ # the basis that by having so many, the page has gotten an unfair
+ # advantage against our randomizer.
+ #
+ my $trip_count = 0;
+ foreach my $trip (@tripwire_words) {
+ $trip_count++ if m/$trip/i;
+ }
+
+ if ($trip_count >= $#tripwire_words - 2) {
+ LOG (($verbose_filter || $verbose_load),
+ "there is probably a dictionary in \"$url\": rejecting.");
+ $rejected_urls{$url} = -1;
+ $body = undef;
+ $_ = undef;
+ return ();
+ }
+
+
+ my @urls;
+ my %unique_urls;
+
+ foreach (split(/ *</)) {
+ if ( m/^meta.*["']keywords["']/i ) {
+
+ # Likewise, reject any web pages that have a KEYWORDS meta tag
+ # that is too long.
+ #
+ my $L = length($_);
+ if ($L > 1000) {
+ LOG (($verbose_filter || $verbose_load),
+ "excessive keywords ($L bytes) in $url: rejecting.");
+ $rejected_urls{$url} = $L;
+ $body = undef;
+ $_ = undef;
+ return ();
+ } else {
+ LOG ($verbose_filter, " keywords ($L bytes) in $url (ok)");
+ }
+
+ } elsif (m/^ (IMG|A) \b .* (SRC|HREF) \s* = \s* ["']? (.*?) [ "'<>] /six ||
+ m/^ (LINK|META) \b .* (REL|PROPERTY) \s* = \s*
+ ["']? (image_src|og:image) ["']? /six) {
+
+ my $was_inline = (lc($1) eq 'img');
+ my $was_meta = (lc($1) eq 'link' || lc($1) eq 'meta');
+ my $link = $3;
+
+ # For <link rel="image_src" href="...">
+ # and <meta property="og:image" content="...">
+ #
+ if ($was_meta) {
+ next unless (m/ (HREF|CONTENT) \s* = \s* ["']? (.*?) [ "'<>] /six);
+ $link = $2;
+ }
+
+ my ( $width ) = m/width ?=[ \"]*(\d+)/oi;
+ my ( $height ) = m/height ?=[ \"]*(\d+)/oi;
+ $_ = $link;
+
+ if ( m@^/@o ) {
+ my $site;
+ ( $site = $base ) =~ s@^(https?://[^/]*).*@$1@gio;
+ $_ = "$site$link";
+ } elsif ( ! m@^[^/:?]+:@ ) {
+ $_ = "$base$link";
+ s@/\./@/@g;
+ 1 while (s@/[^/]+/\.\./@/@g);
+ }
+
+ # skip non-http
+ if ( ! m@^https?://@io ) {
+ next;
+ }
+
+ # skip non-image
+ if ( ! m@[.](gif|jpg|jpeg|pjpg|pjpeg|png)$@io ) {
+ next;
+ }
+
+ # skip really short or really narrow images
+ if ( $width && $width < $min_width) {
+ if (!$height) { $height = "?"; }
+ LOG ($verbose_filter, " skip narrow image $_ (${width}x$height)");
+ next;
+ }
+
+ if ( $height && $height < $min_height) {
+ if (!$width) { $width = "?"; }
+ LOG ($verbose_filter, " skip short image $_ (${width}x$height)");
+ next;
+ }
+
+ # skip images with ratios that make them look like banners.
+ if ($min_ratio && $width && $height &&
+ ($width * $min_ratio ) > $height) {
+ if (!$height) { $height = "?"; }
+ LOG ($verbose_filter, " skip bad ratio $_ (${width}x$height)");
+ next;
+ }
+
+ # skip GIFs with a small number of pixels -- those usually suck.
+ if ($width && $height &&
+ m/\.gif$/io &&
+ ($width * $height) < $min_gif_area) {
+ LOG ($verbose_filter, " skip small GIF $_ (${width}x$height)");
+ next;
+ }
+
+ # skip images with a URL that indicates a Yahoo thumbnail.
+ if (m@\.yimg\.com/.*/t/@) {
+ if (!$width) { $width = "?"; }
+ if (!$height) { $height = "?"; }
+ LOG ($verbose_filter, " skip yahoo thumb $_ (${width}x$height)");
+ next;
+ }
+
+ my $url = $_;
+
+ if ($unique_urls{$url}) {
+ LOG ($verbose_filter, " skip duplicate image $_");
+ next;
+ }
+
+ LOG ($verbose_filter,
+ " image $url" .
+ ($width && $height ? " (${width}x${height})" : "") .
+ ($was_meta ? " (meta)" : $was_inline ? " (inline)" : ""));
+
+
+ my $weight = 1;
+
+ if ($was_meta) {
+ $weight = 20; # meta tag images are far preferable to inline images.
+ } else {
+ if ($url !~ m@[.](gif|png)$@io ) {
+ $weight += 2; # JPEGs are preferable to GIFs and PNGs.
+ }
+ if (! $was_inline) {
+ $weight += 4; # pointers to images are preferable to inlined images.
+ }
+ }
+
+ $unique_urls{$url}++;
+ for (my $i = 0; $i < $weight; $i++) {
+ $urls[++$#urls] = $url;
+ }
+ }
+ }
+
+ my $fsp = ($body =~ m@<frameset@i);
+
+ $_ = undef;
+ $body = undef;
+
+ @urls = depoison (@urls);
+
+ if ( $#urls < 0 ) {
+ LOG ($verbose_load, "no images on $base" . ($fsp ? " (frameset)" : ""));
+ return ();
+ }
+
+ # pick a random element of the table
+ my $i = int(rand($#urls+1));
+ $url = $urls[$i];
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/" . ($#urls+1) . ": $url");
+
+ return $url;
+}
+
+
+# Given a URL and the RSS feed from that URL, pick a random image from
+# the feed. This is a lot simpler than extracting images out of a page:
+# we already know we have reasonable images, so we just pick one.
+# Returns: the real URL of the page (preferably not the RSS version),
+# and the image.
+
+sub pick_image_from_rss($$) {
+ my ($url, $body) = @_;
+
+ my ($base) = ($body =~ m@<link>([^<>]+)</link>@si); # root link
+
+ my @items = ($body =~ m@<item\b[^<>]*>(.*?)</item>@gsi);
+ return unless @items;
+
+ my $n = @items;
+ my $i = int(rand($n));
+ my $item = $items[$i];
+
+ $base = $1 if ($item =~ m@<link>([^<>]+)</link>@si); # item link
+ $base = $url unless $base;
+
+ ($url) = ($item =~ m/<enclosure\b[^<>]*\burl="(.*?)"/si);
+ return unless $url;
+
+ LOG ($verbose_load, "picked image $i/$n: $url");
+ return ($base, $url);
+}
+
+
+############################################################################
+#
+# Subroutines for getting pages and images out of search engines
+#
+############################################################################
+
+
+sub pick_dictionary() {
+ my @dicts = ("/usr/dict/words",
+ "/usr/share/dict/words",
+ "/usr/share/lib/dict/words",
+ "/usr/share/dict/cracklib-small",
+ "/usr/share/dict/cracklib-words"
+ );
+ foreach my $f (@dicts) {
+ if (-f $f) {
+ $wordlist = $f;
+ last;
+ }
+ }
+ error ("$dicts[0] does not exist") unless defined($wordlist);
+}
+
+# returns a random word from the dictionary
+#
+sub random_word() {
+
+ return undef unless open (my $in, '<', $wordlist);
+
+ my $size = (stat($in))[7];
+ my $word = undef;
+ my $count = 0;
+
+ while (1) {
+ error ("looping ($count) while reading $wordlist")
+ if (++$count > 100);
+
+ my $pos = int (rand ($size));
+ if (seek ($in, $pos, 0)) {
+ $word = <$in>; # toss partial line
+ $word = <$in>; # keep next line
+ }
+
+ next unless ($word);
+ next if ($word =~ m/^[-\']/);
+
+ $word = lc($word);
+ $word =~ s/^.*-//s;
+ $word =~ s/^[^a-z]+//s;
+ $word =~ s/[^a-z]+$//s;
+ $word =~ s/\'s$//s;
+ $word =~ s/ys$/y/s;
+ $word =~ s/ally$//s;
+ $word =~ s/ly$//s;
+ $word =~ s/ies$/y/s;
+ $word =~ s/ally$/al/s;
+ $word =~ s/izes$/ize/s;
+ $word =~ s/esses$/ess/s;
+ $word =~ s/(.{5})ing$/$1/s;
+
+ next if (length ($word) > 14);
+ last if ($word);
+ }
+
+ close ($in);
+
+ if ( $word =~ s/\s/\+/gs ) { # convert intra-word spaces to "+".
+ $word = "\%22$word\%22"; # And put quotes (%22) around it.
+ }
+
+ return $word;
+}
+
+
+sub random_words($) {
+ my ($sep) = @_;
+ return (random_word() . $sep .
+ random_word() . $sep .
+ random_word() . $sep .
+ random_word() . $sep .
+ random_word());
+}
+
+
+sub url_quote($) {
+ my ($s) = @_;
+ $s =~ s|([^-a-zA-Z0-9.\@/_\r\n])|sprintf("%%%02X", ord($1))|ge;
+ return $s;
+}
+
+sub url_unquote($) {
+ my ($s) = @_;
+ $s =~ s/[+]/ /g;
+ $s =~ s/%([a-z0-9]{2})/chr(hex($1))/ige;
+ return $s;
+}
+
+sub html_quote($) {
+ my ($s) = @_;
+ $s =~ s/&/&amp;/gi;
+ $s =~ s/</&lt;/gi;
+ $s =~ s/>/&gt;/gi;
+ $s =~ s/\"/&quot;/gi;
+ return $s;
+}
+
+sub html_unquote($) {
+ my ($s) = @_;
+ $s =~ s/(&([a-z]+);)/{ $entity_table{$2} || $1; }/gexi; # e.g., &apos;
+ $s =~ s/(&\#(\d+);)/{ chr($2) }/gexi; # e.g., &#39;
+ return $s;
+}
+
+
+# Loads the given URL (a search on some search engine) and returns:
+# - the total number of hits the search engine claimed it had;
+# - a list of URLs from the page that the search engine returned;
+# Note that this list contains all kinds of internal search engine
+# junk URLs too -- caller must prune them.
+#
+sub pick_from_search_engine($$$) {
+ my ( $timeout, $search_url, $words ) = @_;
+
+ $_ = $words;
+ s/%20/ /g;
+
+ print STDERR "\n\n" if ($verbose_load);
+
+ LOG ($verbose_load, "words: $_");
+ LOG ($verbose_load, "URL: $search_url");
+
+ $last_search = $search_url; # for warnings
+
+ my $start = time;
+ my ( $base, $body ) = get_document ($search_url, undef, $timeout);
+ if (defined ($timeout)) {
+ $timeout -= (time - $start);
+ if ($timeout <= 0) {
+ $body = undef;
+ LOG (($verbose_net || $verbose_load),
+ "timed out (late) for $search_url");
+ $suppress_audit = 1;
+ return ();
+ }
+ }
+
+ return () if (! $body);
+
+
+ my @subpages;
+
+ my $search_count = "?";
+ if ($body =~ m@found (approximately |about )?(<B>)?(\d+)(</B>)? image@) {
+ $search_count = $3;
+ } elsif ($body =~ m@<NOBR>((\d{1,3})(,\d{3})*)&nbsp;@i) {
+ $search_count = $1;
+ } elsif ($body =~ m@found ((\d{1,3})(,\d{3})*|\d+) Web p@) {
+ $search_count = $1;
+ } elsif ($body =~ m@found about ((\d{1,3})(,\d{3})*|\d+) results@) {
+ $search_count = $1;
+ } elsif ($body =~ m@\b\d+ - \d+ of (\d+)\b@i) { # avimages
+ $search_count = $1;
+ } elsif ($body =~ m@About ((\d{1,3})(,\d{3})*) images@i) { # avimages
+ $search_count = $1;
+ } elsif ($body =~ m@We found ((\d{1,3})(,\d{3})*|\d+) results@i) { # *vista
+ $search_count = $1;
+ } elsif ($body =~ m@ of about <B>((\d{1,3})(,\d{3})*)<@i) { # googleimages
+ $search_count = $1;
+ } elsif ($body =~ m@<B>((\d{1,3})(,\d{3})*)</B> Web sites were found@i) {
+ $search_count = $1; # lycos
+ } elsif ($body =~ m@WEB.*?RESULTS.*?\b((\d{1,3})(,\d{3})*)\b.*?Matches@i) {
+ $search_count = $1; # hotbot
+ } elsif ($body =~ m@no photos were found containing@i) { # avimages
+ $search_count = "0";
+ } elsif ($body =~ m@found no document matching@i) { # avtext
+ $search_count = "0";
+ }
+ 1 while ($search_count =~ s/^(\d+)(\d{3})/$1,$2/);
+
+# if ($search_count eq "?" || $search_count eq "0") {
+# my $file = "/tmp/wc.html";
+# open (my $out, '>', $file) || error ("writing $file: $!");
+# print $out $body;
+# close $out;
+# print STDERR blurb() . "###### wrote $file\n";
+# }
+
+
+ my $length = length($body);
+ my $href_count = 0;
+
+ $_ = $body;
+
+ s/[\r\n\t ]+/ /g;
+
+
+ s/(<A )/\n$1/gi;
+ foreach (split(/\n/)) {
+ $href_count++;
+ my ($u) = m@<A\s.*?\bHREF\s*=\s*([\"\'][^\"\'<>]+)@i;
+ next unless $u;
+ my ($u2) = m@<IMG\s.*\bSRC\s*=\s*[\"\']([^\"\'<>]+)@i;
+
+ if (m/\bm="\{(.*?)\}"/s) { # Bing info is inside JSON crud
+ my $json = html_unquote($1);
+ my ($href) = ($json =~ m/\b(?:surl|purl)\"?:\s*"(.*?)"/s);
+ my ($img) = ($json =~ m/\b(?:imgurl|murl)\"?:\s*"(.*?)"/s);
+ $u = "$img\t$href" if ($img && $href);
+
+ } elsif ($u2 && $u2 =~ m@://[^/]*\.gstatic\.com/@s) { $u = $u2;
+ $u =~ s/^\"|\"$//s;
+
+ } elsif ($u =~ m/^\"([^\"]*)\"/) { $u = $1 # quoted string
+ } elsif ($u =~ m/^([^\s]*)\s/) { $u = $1; # or token
+ }
+
+ if ( $rejected_urls{$u} ) {
+ LOG ($verbose_filter, " pre-rejecting candidate: $u");
+ next;
+ }
+
+ LOG ($verbose_http, " HREF: $u");
+
+ $subpages[++$#subpages] = $u;
+ }
+
+ if ( $#subpages < 0 ) {
+ LOG ($verbose_filter,
+ "found nothing on $base ($length bytes, $href_count links).");
+ return ();
+ }
+
+ LOG ($verbose_filter, "" . $#subpages+1 . " links on $search_url");
+
+ return ($search_count, @subpages);
+}
+
+
+sub depoison(@) {
+ my (@urls) = @_;
+ my @urls2 = ();
+ foreach (@urls) {
+ my ($h) = m@^https?://([^/: \t\r\n]+)@i;
+
+ next unless defined($h);
+
+ if ($poisoners{$h}) {
+ LOG (($verbose_filter), " rejecting poisoner: $_");
+ next;
+ }
+ if ($h =~ m@([^.]+\.[^.]+\.[^.]+)$@ &&
+ $poisoners{$1}) {
+ LOG (($verbose_filter), " rejecting poisoner: $_");
+ next;
+ }
+ if ($h =~ m@([^.]+\.[^.]+)$@ &&
+ $poisoners{$1}) {
+ LOG (($verbose_filter), " rejecting poisoner: $_");
+ next;
+ }
+
+ push @urls2, $_;
+ }
+ return @urls2;
+}
+
+
+# given a list of URLs, picks one at random; loads it; and returns a
+# random image from it.
+# returns the url of the page loaded; the url of the image chosen.
+#
+sub pick_image_from_pages($$$$@) {
+ my ($base, $total_hit_count, $unfiltered_link_count, $timeout, @pages) = @_;
+
+ $total_hit_count = "?" unless defined($total_hit_count);
+
+ @pages = depoison (@pages);
+ LOG ($verbose_load,
+ "" . ($#pages+1) . " candidates of $unfiltered_link_count links" .
+ " ($total_hit_count total)");
+
+ return () if ($#pages < 0);
+
+ my $i = int(rand($#pages+1));
+ my $page = $pages[$i];
+
+ LOG ($verbose_load, "picked page $page");
+
+ $suppress_audit = 1;
+
+ my ( $base2, $body2 ) = get_document ($page, $base, $timeout);
+
+ if (!$base2 || !$body2) {
+ $body2 = undef;
+ return ();
+ }
+
+ my $img = pick_image_from_body ($base2, $body2);
+ $body2 = undef;
+
+ if ($img) {
+ return ($base2, $img);
+ } else {
+ return ();
+ }
+}
+
+
+#############################################################################
+##
+## Pick images from random pages returned by the Yahoo Random Link
+##
+#############################################################################
+#
+## yahoorand
+#my $yahoo_random_link = "http://random.yahoo.com/fast/ryl";
+#
+#
+# Picks a random page; picks a random image on that page;
+# returns two URLs: the page containing the image, and the image.
+# Returns () if nothing found this time.
+#
+#sub pick_from_yahoo_random_link($) {
+# my ($timeout) = @_;
+#
+# print STDERR "\n\n" if ($verbose_load);
+# LOG ($verbose_load, "URL: $yahoo_random_link");
+#
+# $last_search = $yahoo_random_link; # for warnings
+#
+# $suppress_audit = 1;
+#
+# my ( $base, $body ) = get_document ($yahoo_random_link, undef, $timeout);
+# if (!$base || !$body) {
+# $body = undef;
+# return;
+# }
+#
+# LOG ($verbose_load, "redirected to: $base");
+#
+# my $img = pick_image_from_body ($base, $body);
+# $body = undef;
+#
+# if ($img) {
+# return ($base, $img);
+# } else {
+# return ();
+# }
+#}
+
+
+############################################################################
+#
+# Pick images from random pages returned by the Alta Vista Random Link
+# Note: this seems to have gotten a *lot* less random lately (2007).
+#
+############################################################################
+
+# altavista
+my $alta_vista_random_link = "http://www.altavista.com/image/randomlink";
+
+
+# Picks a random page; picks a random image on that page;
+# returns two URLs: the page containing the image, and the image.
+# Returns () if nothing found this time.
+#
+sub pick_from_alta_vista_random_link($) {
+ my ($timeout) = @_;
+
+ print STDERR "\n\n" if ($verbose_load);
+ LOG ($verbose_load, "URL: $alta_vista_random_link");
+
+ $last_search = $alta_vista_random_link; # for warnings
+
+ $suppress_audit = 1;
+
+ my ( $base, $body ) = get_document ($alta_vista_random_link,
+ undef, $timeout);
+ if (!$base || !$body) {
+ $body = undef;
+ return;
+ }
+
+ LOG ($verbose_load, "redirected to: $base");
+
+ my $img = pick_image_from_body ($base, $body);
+ $body = undef;
+
+ if ($img) {
+ return ($base, $img);
+ } else {
+ return ();
+ }
+}
+
+
+############################################################################
+#
+# Pick images by feeding random words into Alta Vista Image Search
+#
+############################################################################
+
+
+my $alta_vista_images_url = "http://www.altavista.com/image/results" .
+ "?ipht=1" . # photos
+ "&igrph=1" . # graphics
+ "&iclr=1" . # color
+ "&ibw=1" . # b&w
+ "&micat=1" . # no partner sites
+ "&sc=on" . # "site collapse"
+ "&q=";
+
+# avimages
+sub pick_from_alta_vista_images($) {
+ my ($timeout) = @_;
+
+ my $words = random_word();
+ my $page = (int(rand(9)) + 1);
+ my $search_url = $alta_vista_images_url . $words;
+
+ if ($page > 1) {
+ $search_url .= "&pgno=" . $page; # page number
+ $search_url .= "&stq=" . (($page-1) * 12); # first hit result on page
+ }
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, $words);
+
+ my @candidates = ();
+ foreach my $u (@subpages) {
+
+ # avimages is encoding their URLs now.
+ next unless ($u =~ s/^.*\*\*(http%3a.*$)/$1/gsi);
+ $u = url_unquote($u);
+
+ next unless ($u =~ m@^https?://@i); # skip non-HTTP or relative URLs
+ next if ($u =~ m@[/.]altavista\.com\b@i); # skip altavista builtins
+ next if ($u =~ m@[/.]yahoo\.com\b@i); # yahoo and av in cahoots?
+ next if ($u =~ m@[/.]doubleclick\.net\b@i); # you cretins
+ next if ($u =~ m@[/.]clicktomarket\.com\b@i); # more cretins
+
+ next if ($u =~ m@[/.]viewimages\.com\b@i); # stacked deck
+ next if ($u =~ m@[/.]gettyimages\.com\b@i);
+
+ LOG ($verbose_filter, " candidate: $u");
+ push @candidates, $u;
+ }
+
+ return pick_image_from_pages ($search_url, $search_hit_count, $#subpages+1,
+ $timeout, @candidates);
+}
+
+
+
+############################################################################
+#
+# Pick images from Aptix security cameras
+# Cribbed liberally from google image search code.
+# By Jason Sullivan <jasonsul@us.ibm.com>
+#
+############################################################################
+
+my $aptix_images_url = ("http://www.google.com/search" .
+ "?q=inurl:%22jpg/image.jpg%3Fr%3D%22");
+
+# securitycam
+sub pick_from_security_camera($) {
+ my ($timeout) = @_;
+
+ my $page = (int(rand(9)) + 1);
+ my $num = 20; # 20 images per page
+ my $search_url = $aptix_images_url;
+
+ if ($page > 1) {
+ $search_url .= "&start=" . $page*$num; # page number
+ $search_url .= "&num=" . $num; #images per page
+ }
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, '');
+
+ my @candidates = ();
+ my %referers;
+ foreach my $u (@subpages) {
+ next if ($u =~ m@[/.]google\.com\b@i); # skip google builtins (most links)
+ next unless ($u =~ m@jpg/image.jpg\?r=@i); # All pics contain this
+
+ LOG ($verbose_filter, " candidate: $u");
+ push @candidates, $u;
+ $referers{$u} = $u;
+ }
+
+ @candidates = depoison (@candidates);
+ return () if ($#candidates < 0);
+ my $i = int(rand($#candidates+1));
+ my $img = $candidates[$i];
+ my $ref = $referers{$img};
+
+ LOG ($verbose_load, "picked image " . ($i+1) . ": $img (on $ref)");
+ return ($ref, $img);
+}
+
+
+############################################################################
+#
+# Pick images by feeding random words into Google Image Search.
+# By Charles Gales <gales@us.ibm.com>
+#
+############################################################################
+
+my $google_images_url = 'https://www.google.com/search' .
+ '?source=lnms&tbm=isch&tbs=isz:l&q=';
+
+# googleimgs
+sub pick_from_google_images($;$$) {
+ my ($timeout, $words, $max_page) = @_;
+
+ if (!defined($words)) {
+ $words = random_word(); # only one word for Google
+ }
+
+ my $off = int(rand(40));
+ my $search_url = $google_images_url . $words . "&start=" . $off;
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, $words);
+
+ my @candidates = ();
+ foreach my $u (@subpages) {
+ $u = html_unquote($u);
+ # next if ($u =~ m@^https?://[^.]*\.(google|youtube)\.com/@s);
+ next unless ($u =~ m@^https?://[^/]*\.gstatic\.com@s);
+ LOG ($verbose_filter, " candidate: $u");
+ push @candidates, $u;
+ }
+
+ @candidates = depoison (@candidates);
+ return () if ($#candidates < 0);
+ my $i = int(rand($#candidates+1));
+ my $img = $candidates[$i];
+
+ LOG ($verbose_load, "picked image " . ($i+1) . ": $img");
+ return ($img, $img);
+}
+
+
+
+############################################################################
+#
+# Pick images by feeding random numbers into Google Image Search.
+# By jwz, suggested by Ian O'Donnell.
+#
+############################################################################
+
+
+# googlenums
+sub pick_from_google_image_numbers($) {
+ my ($timeout) = @_;
+
+ my $max = 9999;
+ my $number = int(rand($max));
+
+ $number = sprintf("%04d", $number)
+ if (rand() < 0.3);
+
+ pick_from_google_images ($timeout, "$number");
+}
+
+
+
+############################################################################
+#
+# Pick images by feeding random digital camera file names into
+# Google Image Search.
+# By jwz, inspired by the excellent Random Personal Picture Finder
+# at http://www.diddly.com/random/
+# May 2017: Commented out a bunch of formats that have fallen out of favor.
+#
+############################################################################
+
+my @photomakers = (
+ #
+ # Common digital camera file name formats, as described at
+ # http://www.diddly.com/random/about.html
+ #
+# sub { sprintf ("dcp%05d.jpg", int(rand(4000))); }, # Kodak
+ sub { sprintf ("dsc%05d.jpg", int(rand(4000))); }, # Nikon
+ sub { sprintf ("dscn%04d.jpg", int(rand(4000))); }, # Nikon
+# sub { sprintf ("mvc-%03d.jpg", int(rand(999))); }, # Sony Mavica
+# sub { sprintf ("mvc%05d.jpg", int(rand(9999))); }, # Sony Mavica
+# sub { sprintf ("P101%04d.jpg", int(rand(9999))); }, # Olympus w/ date=101
+# sub { sprintf ("P%x%02d%04d.jpg", # Olympus
+# int(rand(0xC)), int(rand(30))+1,
+# rand(9999)); },
+ sub { sprintf ("IMG_%03d.jpg", int(rand(999))); }, # ?
+# sub { sprintf ("IMAG%04d.jpg", int(rand(9999))); }, # RCA and Samsung
+# sub { my $n = int(rand(9999)); # Canon
+# sprintf ("1%02d-%04d.jpg", int($n/100), $n); },
+# sub { my $n = int(rand(9999)); # Canon
+# sprintf ("1%02d-%04d_IMG.jpg",
+# int($n/100), $n); },
+ sub { sprintf ("IMG_%04d.jpg", int(rand(9999))); }, # Canon
+ sub { sprintf ("dscf%04d.jpg", int(rand(9999))); }, # Fuji Finepix
+# sub { sprintf ("pdrm%04d.jpg", int(rand(9999))); }, # Toshiba PDR
+# sub { sprintf ("IM%06d.jpg", int(rand(9999))); }, # HP Photosmart
+# sub { sprintf ("EX%06d.jpg", int(rand(9999))); }, # HP Photosmart
+# sub { my $n = int(rand(3)); # Kodak DC-40,50,120
+# sprintf ("DC%04d%s.jpg", int(rand(9999)),
+# $n == 0 ? 'S' : $n == 1 ? 'M' : 'L'); },
+ sub { sprintf ("pict%04d.jpg", int(rand(9999))); }, # Minolta Dimage
+# sub { sprintf ("P%07d.jpg", int(rand(9999))); }, # Kodak DC290
+# sub { sprintf ("%02d%02d%04d.jpg", # Casio QV3000, QV4000
+# int(rand(12))+1, int(rand(31))+1,
+# int(rand(999))); },
+# sub { sprintf ("%02d%x%02d%04d.jpg", # Casio QV7000
+# int(rand(6)), # year
+# int(rand(12))+1, int(rand(31))+1,
+# int(rand(999))); },
+ sub { sprintf ("IMGP%04d.jpg", int(rand(9999))); }, # Pentax Optio S
+# sub { sprintf ("PANA%04d.jpg", int(rand(9999))); }, # Panasonic vid still
+ sub { sprintf ("HPIM%04d.jpg", int(rand(9999))); }, # HP Photosmart
+# sub { sprintf ("PCDV%04d.jpg", int(rand(9999))); }, # ?
+ );
+
+
+# googlephotos
+sub pick_from_google_image_photos($) {
+ my ($timeout) = @_;
+
+ my $i = int(rand($#photomakers + 1));
+ my $fn = $photomakers[$i];
+ my $file = &$fn;
+ #$file .= "%20filetype:jpg";
+
+ pick_from_google_images ($timeout, $file);
+}
+
+
+############################################################################
+#
+# Pick images by feeding random words into Google Image Search.
+# By the way: fuck Microsoft.
+#
+############################################################################
+
+my $bing_images_url = "http://www.bing.com/images/async?q=";
+
+
+# bingimgs
+sub pick_from_bing_images($;$$) {
+ my ($timeout, $words, $max_page) = @_;
+
+ if (!defined($words)) {
+ $words = random_word(); # only one word for Bing
+ }
+
+ my $off = int(rand(300));
+ my $search_url = $bing_images_url . $words . "&first=" . $off;
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, $words);
+
+ my @candidates = ();
+ my %referers;
+ foreach my $u (@subpages) {
+ my ($img, $ref) = ($u =~ m/^(.*?)\t(.*)$/s);
+ next unless $img;
+ LOG ($verbose_filter, " candidate: $ref");
+ push @candidates, $img;
+ $referers{$img} = $ref;
+ }
+
+ @candidates = depoison (@candidates);
+ return () if ($#candidates < 0);
+ my $i = int(rand($#candidates+1));
+ my $img = $candidates[$i];
+ my $ref = $referers{$img};
+
+ LOG ($verbose_load, "picked image " . ($i+1) . ": $img (on $ref)");
+ return ($ref, $img);
+}
+
+
+
+
+############################################################################
+#
+# Pick images by feeding random numbers into Bing Image Search.
+#
+############################################################################
+
+# bingnums
+sub pick_from_bing_image_numbers($) {
+ my ($timeout) = @_;
+
+ my $max = 9999;
+ my $number = int(rand($max));
+
+ $number = sprintf("%04d", $number)
+ if (rand() < 0.3);
+
+ pick_from_bing_images ($timeout, "$number");
+}
+
+
+############################################################################
+#
+# Pick images by feeding random numbers into Bing Image Search.
+#
+############################################################################
+
+# bingphotos
+sub pick_from_bing_image_photos($) {
+ my ($timeout) = @_;
+
+ my $i = int(rand($#photomakers + 1));
+ my $fn = $photomakers[$i];
+ my $file = &$fn;
+
+ pick_from_bing_images ($timeout, $file);
+}
+
+
+############################################################################
+#
+# Pick images by feeding random words into Alta Vista Text Search
+#
+############################################################################
+
+
+my $alta_vista_url = "http://www.altavista.com/web/results" .
+ "?pg=aq" .
+ "&aqmode=s" .
+ "&filetype=html" .
+ "&sc=on" . # "site collapse"
+ "&nbq=50" .
+ "&aqo=";
+
+# avtext
+sub pick_from_alta_vista_text($) {
+ my ($timeout) = @_;
+
+ my $words = random_words('%20');
+ my $page = (int(rand(9)) + 1);
+ my $search_url = $alta_vista_url . $words;
+
+ if ($page > 1) {
+ $search_url .= "&pgno=" . $page;
+ $search_url .= "&stq=" . (($page-1) * 10);
+ }
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, $words);
+
+ my @candidates = ();
+ foreach my $u (@subpages) {
+
+ # Those altavista fuckers are playing really nasty redirection games
+ # these days: the filter your clicks through their site, but use
+ # onMouseOver to make it look like they're not! Well, it makes it
+ # easier for us to identify search results...
+ #
+ next unless ($u =~ s/^.*\*\*(http%3a.*$)/$1/gsi);
+ $u = url_unquote($u);
+
+ next unless ($u =~ m@^https?://@i); # skip non-HTTP or relative URLs
+ next if ($u =~ m@[/.]altavista\.com\b@i); # skip altavista builtins
+ next if ($u =~ m@[/.]yahoo\.com\b@i); # yahoo and av in cahoots?
+
+ LOG ($verbose_filter, " candidate: $u");
+ push @candidates, $u;
+ }
+
+ return pick_image_from_pages ($search_url, $search_hit_count, $#subpages+1,
+ $timeout, @candidates);
+}
+
+
+
+############################################################################
+#
+# Pick images by feeding random words into Hotbot
+#
+############################################################################
+
+my $hotbot_search_url =("http://hotbot.lycos.com/default.asp" .
+ "?ca=w" .
+ "&descriptiontype=0" .
+ "&imagetoggle=1" .
+ "&matchmode=any" .
+ "&nummod=2" .
+ "&recordcount=50" .
+ "&sitegroup=1" .
+ "&stem=1" .
+ "&cobrand=undefined" .
+ "&query=");
+
+sub pick_from_hotbot_text($) {
+ my ($timeout) = @_;
+
+ $last_search = $hotbot_search_url; # for warnings
+
+ # lycos seems to always give us back dictionaries and word lists if
+ # we search for more than one word...
+ #
+ my $words = random_word();
+
+ my $start = int(rand(8)) * 10 + 1;
+ my $search_url = $hotbot_search_url . $words . "&first=$start&page=more";
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, $words);
+
+ my @candidates = ();
+ foreach my $u (@subpages) {
+
+ # Hotbot plays redirection games too
+ # (not any more?)
+# next unless ($u =~ m@/director.asp\?.*\btarget=([^&]+)@);
+# $u = url_decode($1);
+
+ next unless ($u =~ m@^https?://@i); # skip non-HTTP or relative URLs
+ next if ($u =~ m@[/.]hotbot\.com\b@i); # skip hotbot builtins
+ next if ($u =~ m@[/.]lycos\.com\b@i); # skip hotbot builtins
+ next if ($u =~ m@[/.]inktomi\.com\b@i); # skip hotbot builtins
+
+ LOG ($verbose_filter, " candidate: $u");
+ push @candidates, $u;
+ }
+
+ return pick_image_from_pages ($search_url, $search_hit_count, $#subpages+1,
+ $timeout, @candidates);
+}
+
+
+
+############################################################################
+#
+# Pick images by feeding random words into Lycos
+#
+############################################################################
+
+my $lycos_search_url = "http://search.lycos.com/default.asp" .
+ "?lpv=1" .
+ "&loc=searchhp" .
+ "&tab=web" .
+ "&query=";
+
+sub pick_from_lycos_text($) {
+ my ($timeout) = @_;
+
+ $last_search = $lycos_search_url; # for warnings
+
+ # lycos seems to always give us back dictionaries and word lists if
+ # we search for more than one word...
+ #
+ my $words = random_word();
+
+ my $start = int(rand(8)) * 10 + 1;
+ my $search_url = $lycos_search_url . $words . "&first=$start&page=more";
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, $words);
+
+ my @candidates = ();
+ foreach my $u (@subpages) {
+
+ # Lycos plays redirection games.
+ # (not any more?)
+# next unless ($u =~ m@^https?://click.lycos.com/director.asp
+# .*
+# \btarget=([^&]+)
+# .*
+# @x);
+# $u = url_decode($1);
+
+ next unless ($u =~ m@^https?://@i); # skip non-HTTP or relative URLs
+ next if ($u =~ m@[/.]hotbot\.com\b@i); # skip lycos builtins
+ next if ($u =~ m@[/.]lycos\.com\b@i); # skip lycos builtins
+ next if ($u =~ m@[/.]terralycos\.com\b@i); # skip lycos builtins
+ next if ($u =~ m@[/.]inktomi\.com\b@i); # skip lycos builtins
+
+
+ LOG ($verbose_filter, " candidate: $u");
+ push @candidates, $u;
+ }
+
+ return pick_image_from_pages ($search_url, $search_hit_count, $#subpages+1,
+ $timeout, @candidates);
+}
+
+
+
+############################################################################
+#
+# Pick images by feeding random words into news.yahoo.com
+#
+############################################################################
+
+my $yahoo_news_url = "http://news.search.yahoo.com/search/news" .
+ "?c=news_photos" .
+ "&p=";
+
+# yahoonews
+sub pick_from_yahoo_news_text($) {
+ my ($timeout) = @_;
+
+ $last_search = $yahoo_news_url; # for warnings
+
+ my $words = random_word();
+ my $search_url = $yahoo_news_url . $words;
+
+ my ($search_hit_count, @subpages) =
+ pick_from_search_engine ($timeout, $search_url, $words);
+
+ my @candidates = ();
+ foreach my $u (@subpages) {
+
+ # de-redirectize the URLs
+ $u =~ s@^https?://rds\.yahoo\.com/.*-http%3A@http:@s;
+
+ # only accept URLs on Yahoo's news site
+ next unless ($u =~ m@^https?://dailynews\.yahoo\.com/@i ||
+ $u =~ m@^https?://story\.news\.yahoo\.com/@i);
+ next unless ($u =~ m@&u=/@);
+
+ LOG ($verbose_filter, " candidate: $u");
+ push @candidates, $u;
+ }
+
+ return pick_image_from_pages ($search_url, $search_hit_count, $#subpages+1,
+ $timeout, @candidates);
+}
+
+
+
+############################################################################
+#
+# Pick images from LiveJournal's list of recently-posted images.
+#
+############################################################################
+
+my $livejournal_img_url = "http://www.livejournal.com/stats/latest-img.bml";
+
+# With most of our image sources, we get a random page and then select
+# from the images on it. However, in the case of LiveJournal, the page
+# of images tends to update slowly; so we'll remember the last N entries
+# on it and randomly select from those, to get a wider variety each time.
+
+my $lj_cache_size = 1000;
+my @lj_cache = (); # fifo, for ordering by age
+my %lj_cache = (); # hash, for detecting dups
+
+# livejournal
+sub pick_from_livejournal_images($) {
+ my ($timeout) = @_;
+
+ $last_search = $livejournal_img_url; # for warnings
+
+ my ( $base, $body ) = get_document ($livejournal_img_url, undef, $timeout);
+
+ # Often the document comes back empty. If so, just use the cache.
+ # return () unless $body;
+ $body = '' unless defined($body);
+
+ $body =~ s/\n/ /gs;
+ $body =~ s/(<recent-image)\b/\n$1/gsi;
+
+ foreach (split (/\n/, $body)) {
+ next unless (m/^<recent-image\b/);
+ next unless (m/\bIMG=[\'\"]([^\'\"]+)[\'\"]/si);
+ my $img = html_unquote ($1);
+
+ next if ($lj_cache{$img}); # already have it
+
+ next unless (m/\bURL=[\'\"]([^\'\"]+)[\'\"]/si);
+ my $page = html_unquote ($1);
+ my @pair = ($img, $page);
+ LOG ($verbose_filter, " candidate: $img");
+ push @lj_cache, \@pair;
+ $lj_cache{$img} = \@pair;
+ }
+
+ return () if ($#lj_cache == -1);
+
+ my $n = $#lj_cache+1;
+ my $i = int(rand($n));
+ my ($img, $page) = @{$lj_cache[$i]};
+
+ # delete this one from @lj_cache and from %lj_cache.
+ #
+ @lj_cache = ( @lj_cache[0 .. $i-1],
+ @lj_cache[$i+1 .. $#lj_cache] );
+ delete $lj_cache{$img};
+
+ # Keep the size of the cache under the limit by nuking older entries
+ #
+ while ($#lj_cache >= $lj_cache_size) {
+ my $pairP = shift @lj_cache;
+ my $img = $pairP->[0];
+ delete $lj_cache{$img};
+ }
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/$n: $img");
+
+ return ($page, $img);
+}
+
+
+############################################################################
+#
+# Pick images from ircimages.com (images that have been in the /topic of
+# various IRC channels.)
+#
+############################################################################
+
+my $ircimages_url = "http://ircimages.com/";
+
+# ircimages
+sub pick_from_ircimages($) {
+ my ($timeout) = @_;
+
+ $last_search = $ircimages_url; # for warnings
+
+ my $n = int(rand(2900));
+ my $search_url = $ircimages_url . "page-$n";
+
+ my ( $base, $body ) = get_document ($search_url, undef, $timeout);
+ return () unless $body;
+
+ my @candidates = ();
+
+ $body =~ s/\n/ /gs;
+ $body =~ s/(<A)\b/\n$1/gsi;
+
+ foreach (split (/\n/, $body)) {
+
+ my ($u) = m@<A\s.*\bHREF\s*=\s*([^>]+)>@i;
+ next unless $u;
+
+ if ($u =~ m/^\"([^\"]*)\"/) { $u = $1; } # quoted string
+ elsif ($u =~ m/^([^\s]*)\s/) { $u = $1; } # or token
+
+ next unless ($u =~ m/^https?:/i);
+ next if ($u =~ m@^https?://(searchirc\.com\|ircimages\.com)@i);
+ next unless ($u =~ m@[.](gif|jpg|jpeg|pjpg|pjpeg|png)$@i);
+
+ LOG ($verbose_http, " HREF: $u");
+ push @candidates, $u;
+ }
+
+ LOG ($verbose_filter, "" . $#candidates+1 . " links on $search_url");
+
+ return () if ($#candidates == -1);
+
+ my $i = int(rand($#candidates+1));
+ my $img = $candidates[$i];
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/" . ($#candidates+1) .
+ ": $img");
+
+ $search_url = $img; # hmm...
+ return ($search_url, $img);
+}
+
+
+############################################################################
+#
+# Pick images from Twitpic's list of recently-posted images.
+#
+############################################################################
+
+my $twitpic_img_url = "http://twitpic.com/public_timeline/feed.rss";
+
+# With most of our image sources, we get a random page and then select
+# from the images on it. However, in the case of Twitpic, the page
+# of images tends to update slowly; so we'll remember the last N entries
+# on it and randomly select from those, to get a wider variety each time.
+
+my $twitpic_cache_size = 1000;
+my @twitpic_cache = (); # fifo, for ordering by age
+my %twitpic_cache = (); # hash, for detecting dups
+
+# twitpic
+sub pick_from_twitpic_images($) {
+ my ($timeout) = @_;
+
+ $last_search = $twitpic_img_url; # for warnings
+
+ my ( $base, $body ) = get_document ($twitpic_img_url, undef, $timeout);
+
+ # Update the cache.
+
+ if ($body) {
+ $body =~ s/\n/ /gs;
+ $body =~ s/(<item)\b/\n$1/gsi;
+
+ my @items = split (/\n/, $body);
+ shift @items;
+ foreach (@items) {
+ next unless (m@<link>([^<>]*)</link>@si);
+ my $page = html_unquote ($1);
+
+ $page =~ s@/$@@s;
+ $page .= '/full';
+
+ next if ($twitpic_cache{$page}); # already have it
+
+ LOG ($verbose_filter, " candidate: $page");
+ push @twitpic_cache, $page;
+ $twitpic_cache{$page} = $page;
+ }
+ }
+
+ # Pull from the cache.
+
+ return () if ($#twitpic_cache == -1);
+
+ my $n = $#twitpic_cache+1;
+ my $i = int(rand($n));
+ my $page = $twitpic_cache[$i];
+
+ # delete this one from @twitpic_cache and from %twitpic_cache.
+ #
+ @twitpic_cache = ( @twitpic_cache[0 .. $i-1],
+ @twitpic_cache[$i+1 .. $#twitpic_cache] );
+ delete $twitpic_cache{$page};
+
+ # Keep the size of the cache under the limit by nuking older entries
+ #
+ while ($#twitpic_cache >= $twitpic_cache_size) {
+ my $page = shift @twitpic_cache;
+ delete $twitpic_cache{$page};
+ }
+
+ ( $base, $body ) = get_document ($page, undef, $timeout);
+ my $img = undef;
+ $body = '' unless defined($body);
+
+ foreach (split (/<img\s+/, $body)) {
+ my ($src) = m/\bsrc=[\"\'](.*?)[\"\']/si;
+ next unless $src;
+ next if m@/js/@s;
+ next if m@/images/@s;
+
+ $img = $src;
+
+ $img = "http:$img" if ($img =~ m@^//@s); # Oh come on
+
+ # Sometimes these images are hosted on twitpic, sometimes on Amazon.
+ if ($img =~ m@^/@) {
+ $base =~ s@^(https?://[^/]+)/.*@$1@s;
+ $img = $base . $img;
+ }
+ last;
+ }
+
+ if (!$img) {
+ LOG ($verbose_load, "no matching images on $page\n");
+ return ();
+ }
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/$n: $img");
+
+ return ($page, $img);
+}
+
+
+############################################################################
+#
+# Pick images from Twitter's list of recently-posted updates.
+#
+############################################################################
+
+# With most of our image sources, we get a random page and then select
+# from the images on it. However, in the case of Twitter, the page
+# of images only updates once a minute; so we'll remember the last N entries
+# on it and randomly select from those, to get a wider variety each time.
+
+my $twitter_img_url = "http://api.twitter.com/1/statuses/" .
+ "public_timeline.json" .
+ "?include_entities=true" .
+ "&include_rts=true" .
+ "&count=200";
+
+my $twitter_cache_size = 1000;
+
+my @twitter_cache = (); # fifo, for ordering by age
+my %twitter_cache = (); # hash, for detecting dups
+
+
+# twitter
+sub pick_from_twitter_images($) {
+ my ($timeout) = @_;
+
+ $last_search = $twitter_img_url; # for warnings
+
+ my ( $base, $body ) = get_document ($twitter_img_url, undef, $timeout);
+ # Update the cache.
+
+ if ($body) {
+ $body =~ s/[\r\n]+/ /gs;
+
+ # Parsing JSON is a pain in the ass. So we halfass it as usual.
+ $body =~ s/^\[|\]$//s;
+ $body =~ s/(\[.*?\])/{ $_ = $1; s@\},@\} @gs; $_; }/gsexi;
+ my @items = split (/\},\{/, $body);
+ foreach (@items) {
+ my ($name) = m@"screen_name":"([^\"]+)"@si;
+ my ($img) = m@"media_url":"([^\"]+)"@si;
+ my ($page) = m@"display_url":"([^\"]+)"@si;
+ next unless ($name && $img && $page);
+ foreach ($img, $page) {
+ s/\\//gs;
+ $_ = "http://$_" unless (m/^http/si);
+ }
+
+ next if ($twitter_cache{$page}); # already have it
+
+ LOG ($verbose_filter, " candidate: $page - $img");
+ push @twitter_cache, $page;
+ $twitter_cache{$page} = $img;
+ }
+ }
+
+ # Pull from the cache.
+
+ return () if ($#twitter_cache == -1);
+
+ my $n = $#twitter_cache+1;
+ my $i = int(rand($n));
+ my $page = $twitter_cache[$i];
+ my $url = $twitter_cache{$page};
+
+ # delete this one from @twitter_cache and from %twitter_cache.
+ #
+ @twitter_cache = ( @twitter_cache[0 .. $i-1],
+ @twitter_cache[$i+1 .. $#twitter_cache] );
+ delete $twitter_cache{$page};
+
+ # Keep the size of the cache under the limit by nuking older entries
+ #
+ while ($#twitter_cache >= $twitter_cache_size) {
+ my $page = shift @twitter_cache;
+ delete $twitter_cache{$page};
+ }
+
+ LOG ($verbose_load, "picked page $url");
+
+ $suppress_audit = 1;
+
+ return ($page, $url);
+}
+
+
+############################################################################
+#
+# Pick images from Flickr's page of recently-posted photos.
+#
+############################################################################
+
+my $flickr_img_url = "http://www.flickr.com/explore/";
+
+# Like LiveJournal, the Flickr page of images tends to update slowly,
+# so remember the last N entries on it and randomly select from those.
+
+# I know that Flickr has an API (http://www.flickr.com/services/api/)
+# but it was easy enough to scrape the HTML, so I didn't bother exploring.
+
+my $flickr_cache_size = 1000;
+my @flickr_cache = (); # fifo, for ordering by age
+my %flickr_cache = (); # hash, for detecting dups
+
+
+# flickr_recent
+sub pick_from_flickr_recent($) {
+ my ($timeout) = @_;
+
+ my $start = 16 * int(rand(100));
+
+ $last_search = $flickr_img_url; # for warnings
+ $last_search .= "?start=$start" if ($start > 0);
+
+ my ( $base, $body ) = get_document ($last_search, undef, $timeout);
+
+ # If the document comes back empty. just use the cache.
+ # return () unless $body;
+ $body = '' unless defined($body);
+
+ my $count = 0;
+ my $count2 = 0;
+
+ if ($body =~ m@{ *"_data": \[ ( .*? \} ) \]@six) {
+ $body = $1;
+ } else {
+ LOG ($verbose_load, "flickr unparsable: $last_search");
+ return ();
+ }
+
+ $body =~ s/[\r\n]/ /gs;
+ $body =~ s/(\},) *(\{)/$1\n$2/gs; # "_flickrModelRegistry"
+
+ foreach my $chunk (split (/\n/, $body)) {
+ my ($img) = ($chunk =~ m@"displayUrl": *"(.*?)"@six);
+ next unless defined ($img);
+ $img =~ s/\\//gs;
+ $img = "//" unless ($img =~ m@^/@s);
+ $img = "http:$img" unless ($img =~ m/^http/s);
+
+ my ($user) = ($chunk =~ m/"pathAlias": *"(.*?)"/si);
+ next unless defined ($user);
+
+ my ($id) = ($img =~ m@/\d+/(\d+)_([\da-f]+)_@si);
+ my ($page) = "https://www.flickr.com/photos/$user/$id/";
+
+ # $img =~ s/_[a-z](\.[a-z\d]+)$/$1/si; # take off "thumb" suffix
+
+ $count++;
+ next if ($flickr_cache{$img}); # already have it
+
+ my @pair = ($img, $page, $start);
+ LOG ($verbose_filter, " candidate: $img");
+ push @flickr_cache, \@pair;
+ $flickr_cache{$img} = \@pair;
+ $count2++;
+ }
+
+ return () if ($#flickr_cache == -1);
+
+ my $n = $#flickr_cache+1;
+ my $i = int(rand($n));
+ my ($img, $page) = @{$flickr_cache[$i]};
+
+ # delete this one from @flickr_cache and from %flickr_cache.
+ #
+ @flickr_cache = ( @flickr_cache[0 .. $i-1],
+ @flickr_cache[$i+1 .. $#flickr_cache] );
+ delete $flickr_cache{$img};
+
+ # Keep the size of the cache under the limit by nuking older entries
+ #
+ while ($#flickr_cache >= $flickr_cache_size) {
+ my $pairP = shift @flickr_cache;
+ my $img = $pairP->[0];
+ delete $flickr_cache{$img};
+ }
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/$n: $img");
+
+ return ($page, $img);
+}
+
+
+############################################################################
+#
+# Pick images from a random RSS feed on Flickr.
+#
+############################################################################
+
+my $flickr_rss_base = ("http://www.flickr.com/services/feeds/" .
+ "photos_public.gne" .
+ "?format=rss_200_enc&tagmode=any&tags=");
+
+# Picks a random RSS feed; picks a random image from that feed;
+# returns 2 URLs: the page containing the image, and the image.
+# Mostly by Joe Mcmahon <mcmahon@yahoo-inc.com>
+#
+# flickr_random
+sub pick_from_flickr_random($) {
+ my $timeout = shift;
+
+ my $words = random_words(',');
+ my $rss = $flickr_rss_base . $words;
+ $last_search = $rss;
+
+ $_ = $words;
+ s/,/ /g;
+
+ print STDERR "\n\n" if ($verbose_load);
+ LOG ($verbose_load, "words: $_");
+ LOG ($verbose_load, "URL: $last_search");
+
+ $suppress_audit = 1;
+
+ my ( $base, $body ) = get_document ($last_search, undef, $timeout);
+ if (!$base || !$body) {
+ $body = undef;
+ return;
+ }
+
+ my $img;
+ ($base, $img) = pick_image_from_rss ($base, $body);
+ $body = undef;
+ return () unless defined ($img);
+
+ LOG ($verbose_load, "redirected to: $base");
+ return ($base, $img);
+}
+
+
+############################################################################
+#
+# Pick random images from Instagram.
+#
+############################################################################
+
+my $instagram_url_base = "https://api.instagram.com/v1/media/popular";
+
+# instagram_random
+sub pick_from_instagram($) {
+ my $timeout = shift;
+
+ # Liberated access tokens.
+ # jsdo.it search for: instagram client_id
+ # Google search for: instagram "&client_id=" site:jsfiddle.net
+ my @tokens = (#'b59fbe4563944b6c88cced13495c0f49', # gramfeed.com
+ #'fa26679250df49c48a33fbcf30aae989', # instac.at
+ #'d9494686198d4dfeb954979a3e270e5e', # iconosquare.com
+ #'793ef48bb18e4197b61afce2d799b81c', # jsdo.it
+ #'67b8a3e0073449bba70600d0fc68e6cb', # jsdo.it
+ #'26a098e0df4d4b9ea8b4ce6c505b7742', # jsdo.it
+ #'2437cbcd906a4c10940f990d283d3cd5', # jsdo.it
+ #'191c7d7d5312464cbd92134f36ffdab5', # jsdo.it
+ #'acfec809437b4340b2c38f66503af774', # jsdo.it
+ #'e9f77604a3a24beba949c12d18130988', # jsdo.it
+ #'2cd7bcf68ae346529770073d311575b3', # jsdo.it
+ #'830c600fe8d742e2ab3f3b94f9bb22b7', # jsdo.it
+ #'55865a0397ad41e5997dd95ef4df8da1', # jsdo.it
+ #'192a5742f3644ea8bed1d25e439286a8', # jsdo.it
+ #'38ed1477e7a44595861b8842cdb8ba23', # jsdo.it
+ #'e52f79f645f54488ad0cc47f6f55ade6', # jsfiddle.net
+ );
+
+ my $tok = $tokens[int(rand($#tokens+1))];
+ $last_search = $instagram_url_base . "?client_id=" . $tok;
+
+ print STDERR "\n\n" if ($verbose_load);
+ LOG ($verbose_load, "URL: $last_search");
+
+ my ( $base, $body ) = get_document ($last_search, undef, $timeout);
+ if (!$base || !$body) {
+ $body = undef;
+ return;
+ }
+
+ $body =~ s/("link")/\001$1/gs;
+ my @chunks = split(/\001/, $body);
+ shift @chunks;
+ my @urls = ();
+ foreach (@chunks) {
+ s/\\//gs;
+ my ($url) = m/"link":\s*"(.*?)"/s;
+ my ($img) = m/"standard_resolution":\{"url":\s*"(.*?)"/s;
+ ($img) = m/"url":\s*"(.*?)"/s unless $url;
+ next unless ($url && $img);
+ push @urls, [ $url, $img ];
+ }
+
+ if ($#urls < 0) {
+ LOG ($verbose_load, "no images on $last_search");
+ return ();
+ }
+
+ my $i = int(rand($#urls+1));
+ my ($url, $img) = @{$urls[$i]};
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/" . ($#urls+1) . ": $url");
+ return ($url, $img);
+}
+
+
+############################################################################
+#
+# Pick images from Imgur.
+#
+############################################################################
+
+my $imgur_base = 'http://imgur.com/search?qs=thumb&q_any=';
+
+sub pick_from_imgur($) {
+ my $timeout = shift;
+
+ my $words = random_words('%20');
+ $last_search = $imgur_base . $words;
+
+ $_ = $words;
+ s/%20/ /g;
+
+ print STDERR "\n\n" if ($verbose_load);
+ LOG ($verbose_load, "words: $_");
+ LOG ($verbose_load, "URL: $last_search");
+
+ $suppress_audit = 1;
+
+ my ( $base, $body ) = get_document ($last_search, undef, $timeout);
+ if (!$base || !$body) {
+ $body = undef;
+ return;
+ }
+
+ my @imgs = ($body =~ m@\bHREF=[\"\']([^\'\"<>]*/gallery/[^\'\"<>]+)@gsi);
+ return () unless @imgs;
+
+ my $n = @imgs;
+ my $i = int(rand($n));
+ my $page = $imgs[$i];
+ $page =~ s/[?&].*$//s;
+ $page = "http://imgur.com$page" if ($page =~ m@^/@s);
+
+ my ($id) = ($page =~ m@([^/?&]+)$@s);
+ my $img = "http://i.imgur.com/$id.jpg";
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/$n: $img");
+
+ return ($page, $img);
+}
+
+
+############################################################################
+#
+# Pick images from Tumblr.
+#
+############################################################################
+
+my $tumblr_base = 'https://www.tumblr.com/search/';
+
+sub pick_from_tumblr($) {
+ my $timeout = shift;
+
+ # Tumblr doesn't have an "or" search, which means our vocabulary is
+ # a bit too extensive to work well...
+
+ my $words = random_word();
+ $last_search = $tumblr_base . $words;
+
+ print STDERR "\n\n" if ($verbose_load);
+ LOG ($verbose_load, "words: $words");
+ LOG ($verbose_load, "URL: $last_search");
+
+ $suppress_audit = 1;
+
+ my ( $base, $body ) = get_document ($last_search, undef, $timeout);
+ if (!$base || !$body) {
+ $body = undef;
+ return;
+ }
+
+ my @imgs0 = ($body =~ m@<IMG\b([^<>]*)>@gsi);
+ return () unless @imgs0;
+ my @imgs;
+ foreach my $img (@imgs0) {
+ my ($src) = ($img =~ m@\bsrc=[\"\'](.*?)[\"\']@si);
+ my ($href) = ($img =~ m@\bdata-pin-url=[\"\'](.*?)[\"\']@si);
+ next unless ($src && $href);
+ next if ($src =~ m/^data:/s);
+ foreach ($src, $href) { $_ = "http://www.tumblr.com$_" if (m@^/@s); }
+ push @imgs, [$href, $src];
+ }
+ return () unless @imgs;
+
+ my $n = @imgs;
+ my $i = int(rand($n));
+ my $page = $imgs[$i]->[0];
+ my $img = $imgs[$i]->[1];
+
+ LOG ($verbose_load, "picked image " .($i+1) . "/$n: $img");
+
+ return ($page, $img);
+}
+
+
+############################################################################
+#
+# Pick images by waiting for driftnet to populate a temp dir with files.
+# Requires driftnet version 0.1.5 or later.
+# (Driftnet is a program by Chris Lightfoot that sniffs your local ethernet
+# for images being downloaded by others.)
+# Driftnet/webcollage integration by jwz.
+#
+############################################################################
+
+# driftnet
+sub pick_from_driftnet($) {
+ my ($timeout) = @_;
+
+ my $id = $driftnet_magic;
+ my $dir = $driftnet_dir;
+ my $start = time;
+ my $now;
+
+ error ("\$driftnet_dir unset?") unless ($dir);
+ $dir =~ s@/+$@@;
+
+ error ("$dir unreadable") unless (-d "$dir/.");
+
+ $timeout = $http_timeout unless ($timeout);
+ $last_search = $id;
+
+ while ($now = time, $now < $start + $timeout) {
+ opendir (my $dir, $dir) || error ("$dir: $!");
+ while (my $file = readdir($dir)) {
+ next if ($file =~ m/^\./);
+ $file = "$dir/$file";
+ closedir ($dir);
+ LOG ($verbose_load, "picked file $file ($id)");
+ return ($id, $file);
+ }
+ closedir ($dir);
+ }
+ LOG (($verbose_net || $verbose_load), "timed out for $id");
+ return ();
+}
+
+
+sub get_driftnet_file($) {
+ my ($file) = @_;
+
+ error ("\$driftnet_dir unset?") unless ($driftnet_dir);
+
+ my $id = $driftnet_magic;
+ error ("$id: $file not in $driftnet_dir?")
+ unless ($file =~ m@^\Q$driftnet_dir@o);
+
+ open (my $in, '<', $file) || error ("$id: $file: $!");
+ my $body = '';
+ local $/ = undef; # read entire file
+ $body = <$in>;
+ close ($in) || error ("$id: $file: $!");
+ unlink ($file) || error ("$id: $file: rm: $!");
+ return ($id, $body);
+}
+
+
+sub spawn_driftnet($) {
+ my ($cmd) = @_;
+
+ # make a directory to use.
+ while (1) {
+ my $tmp = $ENV{TEMPDIR} || "/tmp";
+ $driftnet_dir = sprintf ("$tmp/driftcollage-%08x", rand(0xffffffff));
+ LOG ($verbose_exec, "mkdir $driftnet_dir");
+ last if mkdir ($driftnet_dir, 0700);
+ }
+
+ if (! ($cmd =~ m/\s/)) {
+ # if the command didn't have any arguments in it, then it must be just
+ # a pointer to the executable. Append the default args to it.
+ my $dargs = $default_driftnet_cmd;
+ $dargs =~ s/^[^\s]+//;
+ $cmd .= $dargs;
+ }
+
+ # point the driftnet command at our newly-minted private directory.
+ #
+ $cmd .= " -d $driftnet_dir";
+ $cmd .= ">/dev/null" unless ($verbose_exec);
+
+ my $pid = fork();
+ if ($pid < 0) { error ("fork: $!\n"); }
+ if ($pid) {
+ # parent fork
+ push @pids_to_kill, $pid;
+ LOG ($verbose_exec, "forked for \"$cmd\"");
+ } else {
+ # child fork
+ nontrapping_system ($cmd) || error ("exec: $!");
+ }
+
+ # wait a bit, then make sure the process actually started up.
+ #
+ sleep (1);
+ error ("pid $pid failed to start \"$cmd\"")
+ unless (1 == kill (0, $pid));
+}
+
+# local-directory
+sub pick_from_local_dir($) {
+ my ($timeout) = @_;
+
+ my $id = $local_magic;
+ $last_search = $id;
+
+ my $dir = $local_dir;
+ error ("\$local_dir unset?") unless ($dir);
+ $dir =~ s@/+$@@;
+
+ error ("$dir unreadable") unless (-d "$dir/.");
+
+ my $v = ($verbose_exec ? "-v" : "");
+ my $pick = `xscreensaver-getimage-file $v "$dir"`;
+ $pick =~ s/\s+$//s;
+ $pick = "$dir/$pick" unless ($pick =~ m@^/@s); # relative path
+
+ LOG ($verbose_load, "picked file $pick ($id)");
+ return ($id, $pick);
+}
+
+
+sub get_local_file($) {
+ my ($file) = @_;
+
+ error ("\$local_dir unset?") unless ($local_dir);
+
+ my $id = $local_magic;
+ error ("$id: $file not in $local_dir?")
+ unless ($file =~ m@^\Q$local_dir@o);
+
+ open (my $in, '<:raw', $file) || error ("$id: $file: $!");
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close ($in) || error ("$id: $file: $!");
+ return ($id, $body);
+}
+
+
+
+############################################################################
+#
+# Pick a random image in a random way
+#
+############################################################################
+
+
+# Picks a random image on a random page, and returns two URLs:
+# the page containing the image, and the image.
+# Returns () if nothing found this time.
+#
+
+sub pick_image(;$) {
+ my ($timeout) = @_;
+
+ $current_state = "select";
+ $load_method = "none";
+
+ my $n = int(rand(100));
+ my $fn = undef;
+ my $total = 0;
+ my @rest = @search_methods;
+
+ while (@rest) {
+ my $pct = shift @rest;
+ my $name = shift @rest;
+ my $tfn = shift @rest;
+ $total += $pct;
+ if ($total > $n && !defined($fn)) {
+ $fn = $tfn;
+ $current_state = $name;
+ $load_method = $current_state;
+ }
+ }
+
+ if ($total != 100) {
+ error ("internal error: \@search_methods totals to $total%!");
+ }
+
+ record_attempt ($current_state);
+ return $fn->($timeout);
+}
+
+
+
+############################################################################
+#
+# Statistics and logging
+#
+############################################################################
+
+sub timestr() {
+ return strftime ("%H:%M:%S: ", localtime);
+}
+
+sub blurb() {
+ return "$progname: " . timestr() . "$current_state: ";
+}
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR blurb() . "$err\n";
+ exit 1;
+}
+
+sub stacktrace() {
+ my $i = 1;
+ print STDERR "$progname: stack trace:\n";
+ while (1) {
+ my ($package, $filename, $line, $subroutine) = caller($i++);
+ last unless defined($package);
+ $filename =~ s@^.*/@@;
+ print STDERR " $filename#$line, $subroutine\n";
+ }
+}
+
+
+my $lastlog = "";
+
+sub clearlog() {
+ $lastlog = "";
+}
+
+sub showlog() {
+ my $head = "$progname: DEBUG: ";
+ foreach (split (/\n/, $lastlog)) {
+ print STDERR "$head$_\n";
+ }
+ $lastlog = "";
+}
+
+sub LOG($$) {
+ my ($print, $msg) = @_;
+ my $blurb = timestr() . "$current_state: ";
+ $lastlog .= "$blurb$msg\n";
+ print STDERR "$progname: $blurb$msg\n" if $print;
+}
+
+
+my %stats_attempts;
+my %stats_successes;
+my %stats_elapsed;
+
+my $last_state = undef;
+sub record_attempt($) {
+ my ($name) = @_;
+
+ if ($last_state) {
+ record_failure($last_state) unless ($image_succeeded > 0);
+ }
+ $last_state = $name;
+
+ clearlog();
+ report_performance();
+
+ start_timer($name);
+ $image_succeeded = 0;
+ $suppress_audit = 0;
+}
+
+sub record_success($$$) {
+ my ($name, $url, $base) = @_;
+ if (defined($stats_successes{$name})) {
+ $stats_successes{$name}++;
+ } else {
+ $stats_successes{$name} = 1;
+ }
+
+ stop_timer ($name, 1);
+ my $o = $current_state;
+ $current_state = $name;
+ save_recent_url ($url, $base);
+ $current_state = $o;
+ $image_succeeded = 1;
+ clearlog();
+}
+
+
+sub record_failure($) {
+ my ($name) = @_;
+
+ return if $image_succeeded;
+
+ stop_timer ($name, 0);
+ if ($verbose_load && !$verbose_exec) {
+
+ if ($suppress_audit) {
+ print STDERR "$progname: " . timestr() . "(audit log suppressed)\n";
+ return;
+ }
+
+ my $o = $current_state;
+ $current_state = "DEBUG";
+
+ my $line = "#" x 78;
+ print STDERR "\n\n\n";
+ print STDERR ("#" x 78) . "\n";
+ print STDERR blurb() . "failed to get an image. Full audit log:\n";
+ print STDERR "\n";
+ showlog();
+ print STDERR ("-" x 78) . "\n";
+ print STDERR "\n\n";
+
+ $current_state = $o;
+ }
+ $image_succeeded = 0;
+}
+
+
+
+sub stats_of($) {
+ my ($name) = @_;
+ my $i = $stats_successes{$name};
+ my $j = $stats_attempts{$name};
+ $i = 0 unless $i;
+ $j = 0 unless $j;
+ return "" . ($j ? int($i * 100 / $j) : "0") . "%";
+}
+
+
+my $current_start_time = 0;
+
+sub start_timer($) {
+ my ($name) = @_;
+ $current_start_time = time;
+
+ if (defined($stats_attempts{$name})) {
+ $stats_attempts{$name}++;
+ } else {
+ $stats_attempts{$name} = 1;
+ }
+ if (!defined($stats_elapsed{$name})) {
+ $stats_elapsed{$name} = 0;
+ }
+}
+
+sub stop_timer($$) {
+ my ($name, $success) = @_;
+ $stats_elapsed{$name} += time - $current_start_time;
+}
+
+
+my $last_report_time = 0;
+sub report_performance() {
+
+ return unless $verbose_warnings;
+
+ my $now = time;
+ return unless ($now >= $last_report_time + $report_performance_interval);
+ my $ot = $last_report_time;
+ $last_report_time = $now;
+
+ return if ($ot == 0);
+
+ my $blurb = "$progname: " . timestr();
+
+ print STDERR "\n";
+ print STDERR "${blurb}Current standings:\n";
+
+ foreach my $name (sort keys (%stats_attempts)) {
+ my $try = $stats_attempts{$name};
+ my $suc = $stats_successes{$name} || 0;
+ my $pct = int($suc * 100 / $try);
+ my $secs = $stats_elapsed{$name};
+ my $secs_link = $secs / $try;
+ print STDERR sprintf ("$blurb %-14s %4s (%d/%d);" .
+ " \t %.1f secs/link\n",
+ "$name:", "$pct%", $suc, $try, $secs_link);
+ }
+}
+
+
+
+my $max_recent_images = 400;
+my $max_recent_sites = 20;
+my @recent_images = ();
+my @recent_sites = ();
+
+sub save_recent_url($$) {
+ my ($url, $base) = @_;
+
+ return unless ($verbose_warnings);
+
+ $_ = $url;
+ my ($site) = m@^https?://([^ \t\n\r/:]+)@;
+ return unless defined ($site);
+
+ if ($base eq $driftnet_magic || $base eq $local_magic) {
+ $site = $base;
+ @recent_images = ();
+ }
+
+ my $done = 0;
+ foreach (@recent_images) {
+ if ($_ eq $url) {
+ print STDERR blurb() . "WARNING: recently-duplicated image: $url" .
+ " (on $base via $last_search)\n";
+ $done = 1;
+ last;
+ }
+ }
+
+ # suppress "duplicate site" warning via %warningless_sites.
+ #
+ if ($warningless_sites{$site}) {
+ $done = 1;
+ } elsif ($site =~ m@([^.]+\.[^.]+\.[^.]+)$@ &&
+ $warningless_sites{$1}) {
+ $done = 1;
+ } elsif ($site =~ m@([^.]+\.[^.]+)$@ &&
+ $warningless_sites{$1}) {
+ $done = 1;
+ }
+
+ if (!$done) {
+ foreach (@recent_sites) {
+ if ($_ eq $site) {
+ print STDERR blurb() . "WARNING: recently-duplicated site: $site" .
+ " ($url on $base via $last_search)\n";
+ last;
+ }
+ }
+ }
+
+ push @recent_images, $url;
+ push @recent_sites, $site;
+ shift @recent_images if ($#recent_images >= $max_recent_images);
+ shift @recent_sites if ($#recent_sites >= $max_recent_sites);
+}
+
+
+
+##############################################################################
+#
+# other utilities
+#
+##############################################################################
+
+# Does %-decoding.
+#
+sub url_decode($) {
+ ($_) = @_;
+ tr/+/ /;
+ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ return $_;
+}
+
+
+# Given the raw body of a GIF document, returns the dimensions of the image.
+#
+sub gif_size($) {
+ my ($body) = @_;
+ my $type = substr($body, 0, 6);
+ my $s;
+ return () unless ($type =~ /GIF8[7,9]a/);
+ $s = substr ($body, 6, 10);
+ my ($a,$b,$c,$d) = unpack ("C"x4, $s);
+ return () unless defined ($d);
+ return (($b<<8|$a), ($d<<8|$c));
+}
+
+# Given the raw body of a JPEG document, returns the dimensions of the image.
+#
+sub jpeg_size($) {
+ my ($body) = @_;
+ my $i = 0;
+ my $L = length($body);
+
+ my $c1 = substr($body, $i, 1); $i++;
+ my $c2 = substr($body, $i, 1); $i++;
+ return () unless (ord($c1) == 0xFF && ord($c2) == 0xD8);
+
+ my $ch = "0";
+ while (ord($ch) != 0xDA && $i < $L) {
+ # Find next marker, beginning with 0xFF.
+ while (ord($ch) != 0xFF) {
+ return () if (length($body) <= $i);
+ $ch = substr($body, $i, 1); $i++;
+ }
+ # markers can be padded with any number of 0xFF.
+ while (ord($ch) == 0xFF) {
+ return () if (length($body) <= $i);
+ $ch = substr($body, $i, 1); $i++;
+ }
+
+ # $ch contains the value of the marker.
+ my $marker = ord($ch);
+
+ if (($marker >= 0xC0) &&
+ ($marker <= 0xCF) &&
+ ($marker != 0xC4) &&
+ ($marker != 0xCC)) { # it's a SOFn marker
+ $i += 3;
+ return () if (length($body) <= $i);
+ my $s = substr($body, $i, 4); $i += 4;
+ my ($a,$b,$c,$d) = unpack("C"x4, $s);
+ return (($c<<8|$d), ($a<<8|$b));
+
+ } else {
+ # We must skip variables, since FFs in variable names aren't
+ # valid JPEG markers.
+ return () if (length($body) <= $i);
+ my $s = substr($body, $i, 2); $i += 2;
+ my ($c1, $c2) = unpack ("C"x2, $s);
+ my $length = ($c1 << 8) | $c2;
+ return () if ($length < 2);
+ $i += $length-2;
+ }
+ }
+ return ();
+}
+
+# Given the raw body of a PNG document, returns the dimensions of the image.
+#
+sub png_size($) {
+ my ($body) = @_;
+ return () unless ($body =~ m/^\211PNG\r/);
+ my ($bits) = ($body =~ m/^.{12}(.{12})/s);
+ return () unless defined ($bits);
+ return () unless ($bits =~ /^IHDR/);
+ my ($ign, $w, $h) = unpack("a4N2", $bits);
+ return ($w, $h);
+}
+
+
+# Given the raw body of a PNM document, returns the dimensions of the image.
+#
+sub pnm_size($) {
+ my ($body) = @_;
+ return () unless ($body =~ m/^P[1-6]\r?\n(\d+) +(\d+)\r?\n/s);
+ return ($1, $2);
+}
+
+
+# Given the raw body of a GIF, JPEG, or PNG document, returns the dimensions
+# of the image.
+#
+sub image_size($) {
+ my ($body) = @_;
+ my ($w, $h) = gif_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ ($w, $h) = jpeg_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ return png_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ return pnm_size ($body);
+}
+
+
+# returns the full path of the named program, or undef.
+#
+sub which($) {
+ my ($prog) = @_;
+ foreach (split (/:/, $ENV{PATH})) {
+ my $path = "$_/$prog";
+ if (-x $path) {
+ return $path;
+ }
+ }
+ return undef;
+}
+
+
+# Like rand(), but chooses numbers with a bell curve distribution.
+sub bellrand(;$) {
+ ($_) = @_;
+ $_ = 1.0 unless defined($_);
+ $_ /= 3.0;
+ return (rand($_) + rand($_) + rand($_));
+}
+
+
+sub exit_cleanup() {
+ x_cleanup();
+ print STDERR "$progname: exiting\n" if ($verbose_warnings);
+ if (@pids_to_kill) {
+ print STDERR blurb() . "killing: " . join(' ', @pids_to_kill) . "\n";
+ kill ('TERM', @pids_to_kill);
+ }
+}
+
+sub signal_cleanup($) {
+ my ($sig) = @_;
+ print STDERR blurb() . (defined($sig)
+ ? "caught signal $sig."
+ : "exiting.")
+ . "\n"
+ if ($verbose_exec || $verbose_warnings);
+ exit 1;
+}
+
+
+
+##############################################################################
+#
+# Generating a list of urls only
+#
+##############################################################################
+
+sub url_only_output() {
+ do {
+ my ($base, $img) = pick_image;
+ if ($img) {
+ $base =~ s/ /%20/g;
+ $img =~ s/ /%20/g;
+ print "$img $base\n";
+ }
+ } while (1);
+}
+
+##############################################################################
+#
+# Running as an xscreensaver module, or as a web page imagemap
+#
+##############################################################################
+
+my ($image_png, $image_tmp1, $image_tmp2);
+{
+ my $seed = rand(0xFFFFFFFF);
+ $image_png = sprintf ("%s/webcollage-%08x",
+ ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
+ $seed);
+ $image_tmp1 = $image_png . '-1.png';
+ $image_tmp2 = $image_png . '-2.png';
+ $image_png .= '.png';
+}
+
+
+my $filter_cmd = undef;
+my $post_filter_cmd = undef;
+my $background = undef;
+
+my @imagemap_areas = ();
+my $imagemap_html_tmp = undef;
+my $imagemap_jpg_tmp = undef;
+
+
+my $img_width; # size of the image being generated.
+my $img_height;
+
+my $delay = 2;
+
+sub x_cleanup() {
+ unlink $image_png, $image_tmp1, $image_tmp2;
+ unlink $imagemap_html_tmp, $imagemap_jpg_tmp
+ if (defined ($imagemap_html_tmp));
+}
+
+
+# Like system, but prints status about exit codes, and kills this process
+# with whatever signal killed the sub-process, if any.
+#
+sub nontrapping_system(@) {
+ $! = 0;
+
+ $_ = join(" ", @_);
+ s/\"[^\"]+\"/\"...\"/g;
+
+ LOG ($verbose_exec, "executing \"$_\"");
+
+ my $rc = system @_;
+
+ if ($rc == 0) {
+ LOG ($verbose_exec, "subproc exited normally.");
+ } elsif (($rc & 0xff) == 0) {
+ $rc >>= 8;
+ LOG ($verbose_exec, "subproc exited with status $rc.");
+ } else {
+ if ($rc & 0x80) {
+ LOG ($verbose_exec, "subproc dumped core.");
+ $rc &= ~0x80;
+ }
+ LOG ($verbose_exec, "subproc died with signal $rc.");
+ # die that way ourselves.
+ kill $rc, $$;
+ }
+
+ return $rc;
+}
+
+
+# Creates a solid-colored PNG.
+#
+sub pngmake($$$$) {
+ my ($outfile, $bgcolor, $w, $h) = @_;
+
+ my @cmd;
+ if ($webcollage_helper) {
+ @cmd = ($webcollage_helper, $bgcolor, $w, $h, $outfile);
+ } else {
+ @cmd = ($convert_cmd, '-size', "${w}x${h}", "xc:$bgcolor", $outfile);
+ }
+
+ my $rc = nontrapping_system (@cmd);
+ if ($rc != 0) {
+ LOG(0, "failed to create $bgcolor image: \"$outfile\"");
+ exit(1);
+ }
+}
+
+
+sub pick_root_displayer() {
+ my @names = ();
+
+ if ($cocoa_p) {
+ # see "xscreensaver/hacks/webcollage-cocoa.m"
+ return "echo COCOA LOAD ";
+ }
+
+ foreach my $cmd (@root_displayers) {
+ $_ = $cmd;
+ my ($name) = m/^([^ ]+)/;
+ push @names, "\"$name\"";
+ LOG ($verbose_exec, "looking for $name...");
+ foreach my $dir (split (/:/, $ENV{PATH})) {
+ LOG ($verbose_exec, " checking $dir/$name");
+ return $cmd if (-x "$dir/$name");
+ }
+ }
+
+ $names[$#names] = "or " . $names[$#names];
+ error "none of: " . join (", ", @names) . " were found on \$PATH.";
+}
+
+
+my $png_to_root_window_cmd = undef;
+
+
+sub x_or_image_output($) {
+ my ($window_id) = @_;
+
+ # Adjust the PATH for OS X 10.10.
+ #
+ $_ = $0;
+ s:/[^/]*$::;
+ s/([^a-zA-Z0-9._\-+\/])/\\$1/g;
+ $ENV{PATH} = "$_:$ENV{PATH}";
+
+ # Check for our helper program, to see whether we need to use imagemagick.
+ #
+ $_ = "webcollage-helper";
+
+ if (! defined ($webcollage_helper)) {
+ $webcollage_helper = which ($_);
+ }
+
+ if (defined ($webcollage_helper)) {
+ LOG ($verbose_decode, "found \"$webcollage_helper\"");
+ } else {
+ LOG (($verbose_decode || $verbose_load), "no $_ program");
+ }
+
+ if ($cocoa_p && !defined ($webcollage_helper)) {
+ error ("webcollage-helper not found in Cocoa-mode!");
+ }
+
+ if (!$cocoa_p && defined ($webcollage_helper)) {
+ foreach ($image_png, $image_tmp1, $image_tmp2) {
+ s/\.png$/.jpg/si;
+ }
+ }
+
+ # make sure the various programs we execute exist, right up front.
+ #
+ my @progs = ();
+
+ push @progs, $convert_cmd unless defined($webcollage_helper);
+
+ foreach (@progs) {
+ which ($_) || error "$_ not found on \$PATH.";
+ }
+
+ # find a root-window displayer program.
+ #
+ if (!$no_output_p) {
+ $png_to_root_window_cmd = pick_root_displayer();
+ }
+
+ if (defined ($window_id)) {
+ error ("-window-id only works if xscreensaver-getimage is installed")
+ unless ($png_to_root_window_cmd =~ m/^xscreensaver-getimage\b/);
+
+ error ("unparsable window id: $window_id")
+ unless ($window_id =~ m/^\d+$|^0x[\da-f]+$/i);
+ $png_to_root_window_cmd =~ s/--?root\b/$window_id/ ||
+ error ("unable to munge displayer: $png_to_root_window_cmd");
+ }
+
+ if (!$img_width || !$img_height) {
+
+ if (!defined ($window_id) &&
+ defined ($ENV{XSCREENSAVER_WINDOW})) {
+ $window_id = $ENV{XSCREENSAVER_WINDOW};
+ }
+
+ if (!defined ($window_id)) {
+ $_ = "xdpyinfo";
+ which ($_) || error "$_ not found on \$PATH.";
+ $_ = `$_`;
+ ($img_width, $img_height) = m/dimensions: *(\d+)x(\d+) /;
+ if (!defined($img_height)) {
+ error "xdpyinfo failed.";
+ }
+ } else { # we have a window id
+ $_ = "xwininfo";
+ which ($_) || error "$_ not found on \$PATH.";
+ $_ .= " -id $window_id";
+ $_ = `$_`;
+ ($img_width, $img_height) = m/^\s*Width:\s*(\d+)\n\s*Height:\s*(\d+)\n/m;
+
+ if (!defined($img_height)) {
+ error "xwininfo failed.";
+ }
+ }
+ }
+
+ my $bgcolor = "#000000";
+ my $bgimage = undef;
+
+ if ($background) {
+ if ($background =~ m/^\#[0-9a-f]+$/i) {
+ $bgcolor = $background;
+
+ } elsif (-r $background) {
+ $bgimage = $background;
+
+ } elsif (! $background =~ m@^[-a-z0-9 ]+$@i) {
+ error "not a color or readable file: $background";
+
+ } else {
+ # default to assuming it's a color
+ $bgcolor = $background;
+ }
+ }
+
+ # Create the sold-colored base image.
+ #
+ LOG ($verbose_decode, "creating base image: ${img_width}x${img_height}");
+ $_ = pngmake ($image_png, $bgcolor, $img_width, $img_height);
+
+ # Paste the default background image in the middle of it.
+ #
+ if ($bgimage) {
+ open (my $in, '<:raw', $bgimage) || error ("$bgimage: $!");
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close ($in) || error ("$bgimage: $!");
+ paste_image ('init', $image_png, $body, 'init', 1);
+ }
+
+ clearlog();
+
+ while (1) {
+ my ($base, $img) = pick_image();
+ my $source = $current_state;
+ $current_state = "loadimage";
+ if ($img) {
+ my ($headers, $body) = get_document ($img, $base);
+ if ($body) {
+ paste_image ($base, $img, $body, $source);
+ $body = undef;
+ }
+ }
+ $current_state = "idle";
+ $load_method = "none";
+
+ unlink $image_tmp1, $image_tmp2;
+ sleep $delay;
+ }
+}
+
+sub paste_image($$$$;$) {
+ my ($base, $img, $body, $source, $init_p) = @_;
+
+ $current_state = "paste";
+
+ $suppress_audit = 0;
+
+ LOG ($verbose_decode, "got $img (" . length($body) . ")");
+
+ my ($iw, $ih) = image_size ($body);
+ if (!$iw || !$ih) {
+ LOG (($verbose_decode || $verbose_load),
+ "not a GIF, JPG, or PNG" .
+ (($body =~ m@<(base|html|head|body|script|table|a href)>@i)
+ ? " (looks like HTML)" : "") .
+ ": $img");
+ $suppress_audit = 1;
+ $body = undef;
+ return 0;
+ }
+
+ if ($iw <= 0 || $ih <= 0 || $iw > 9999 || $ih > 9999) {
+ LOG (($verbose_decode || $verbose_load),
+ "ludicrous image dimensions: $iw x $ih (" . length($body) .
+ "): $img");
+ $body = undef;
+ return 0;
+ }
+
+ open (my $out, '>:raw', $image_tmp1) || error ("writing $image_tmp1: $!");
+ (print $out $body) || error ("writing $image_tmp1: $!");
+ close ($out) || error ("writing $image_tmp1: $!");
+
+ record_success ($load_method, $img, $base);
+
+ my $ow = $iw; # used only for error messages
+ my $oh = $ih;
+
+ # don't just tack this onto the front of the pipeline -- we want it to
+ # be able to change the size of the input image.
+ #
+ if ($filter_cmd && !$init_p) {
+ LOG ($verbose_decode, "running $filter_cmd");
+
+ # #### Historically, $filter_cmd read and write PPM files.
+ # This is doing PNG or JPEG now. I'll bet nobody uses this.
+
+ my $rc = nontrapping_system "($filter_cmd) < $image_tmp1 >$image_tmp2";
+ if ($rc != 0) {
+ LOG(($verbose_decode || $verbose_load),
+ "failed command: \"$filter_cmd\"");
+ LOG(($verbose_decode || $verbose_load),
+ "failed URL: \"$img\" (${ow}x$oh)");
+ return;
+ }
+ rename ($image_tmp2, $image_tmp1);
+
+ # re-get the width/height in case the filter resized it.
+ open (my $imgf, '<:raw', $image_tmp1) || return 0;
+ my $b = '';
+ sysread ($imgf, $b, 10240);
+ close $imgf;
+ ($iw, $ih) = image_size ($b);
+ return 0 unless ($iw && $ih);
+ }
+
+ my $target_w = $img_width; # max rectangle into which the image must fit
+ my $target_h = $img_height;
+
+ my $scale = 1.0;
+
+ my $crop_x = 0; # the sub-rectangle of the image
+ my $crop_y = 0; # that we will actually paste.
+ my $crop_w = $iw;
+ my $crop_h = $ih;
+ my $x = 0;
+ my $y = 0;
+
+ if (!$init_p) {
+
+ # Usually scale the image to fit on the screen -- but sometimes scale it
+ # to fit on half or a quarter of the screen. (We do this by reducing the
+ # size of the target rectangle.) Note that the image is not merely scaled
+ # to fit; we instead cut the image in half repeatedly until it fits in the
+ # target rectangle -- that gives a wider distribution of sizes.
+ #
+ if (rand() < 0.3) { $target_w /= 2; $target_h /= 2; } # reduce target rect
+ if (rand() < 0.3) { $target_w /= 2; $target_h /= 2; }
+
+ if ($iw > $target_w || $ih > $target_h) {
+ while ($iw > $target_w ||
+ $ih > $target_h) {
+ $iw = int($iw / 2);
+ $ih = int($ih / 2);
+ $scale /= 2;
+ }
+ if ($iw <= 10 || $ih <= 10) {
+ LOG ($verbose_decode, "scaling ${ow}x${oh} to ${iw}x$ih" .
+ " would have been bogus.");
+ return 0;
+ }
+
+ $crop_w = $iw;
+ $crop_h = $ih;
+
+ LOG ($verbose_decode, "scaling ${ow}x${oh} to ${iw}x$ih ($scale)");
+ }
+
+
+ my $src = $image_tmp1;
+
+ # The chance that we will randomly crop out a section of an image starts
+ # out fairly low, but goes up for images that are very large, or images
+ # that have ratios that make them look like banners (we try to avoid
+ # banner images entirely, but they slip through when the IMG tags didn't
+ # have WIDTH and HEIGHT specified.)
+ #
+ my $crop_chance = 0.2;
+ if ($iw > $img_width * 0.4 || $ih > $img_height * 0.4) {
+ $crop_chance += 0.2;
+ }
+ if ($iw > $img_width * 0.7 || $ih > $img_height * 0.7) {
+ $crop_chance += 0.2;
+ }
+ if ($min_ratio && ($iw * $min_ratio) > $ih) {
+ $crop_chance += 0.7;
+ }
+
+ if ($crop_chance > 0.1) {
+ LOG ($verbose_decode, "crop chance: $crop_chance");
+ }
+
+ if (rand() < $crop_chance) {
+
+ my $ow = $crop_w;
+ my $oh = $crop_h;
+
+ if ($crop_w > $min_width) {
+ # if it's a banner, select the width linearly.
+ # otherwise, select a bell.
+ my $r = (($min_ratio && ($iw * $min_ratio) > $ih)
+ ? rand()
+ : bellrand());
+ $crop_w = $min_width + int ($r * ($crop_w - $min_width));
+ $crop_x = int (rand() * ($ow - $crop_w));
+ }
+ if ($crop_h > $min_height) {
+ # height always selects as a bell.
+ $crop_h = $min_height + int (bellrand() * ($crop_h - $min_height));
+ $crop_y = int (rand() * ($oh - $crop_h));
+ }
+
+ # Clip it to the actual post-scaling image size.
+ if ($crop_x + $crop_w > $iw) { $crop_w = $iw - $crop_x; }
+ if ($crop_y + $crop_h > $ih) { $crop_h = $ih - $crop_y; }
+ if ($crop_x < 0) { $crop_w += $crop_x; $crop_x = 0; }
+ if ($crop_y < 0) { $crop_h += $crop_y; $crop_y = 0; }
+
+ if ($crop_x != 0 || $crop_y != 0 ||
+ $crop_w != $iw || $crop_h != $ih) {
+ LOG ($verbose_decode,
+ "randomly cropping to ${crop_w}x$crop_h \@ $crop_x,$crop_y");
+ }
+ }
+
+ # Where the image should logically land -- this might be negative.
+ #
+ $x = int((rand() * ($img_width + $crop_w/2)) - $crop_w*3/4);
+ $y = int((rand() * ($img_height + $crop_h/2)) - $crop_h*3/4);
+
+ # if we have chosen to paste the image outside of the rectangle of the
+ # screen, then we need to crop it.
+ #
+ if ($x < 0 ||
+ $y < 0 ||
+ $x + $crop_w > $img_width ||
+ $y + $crop_h > $img_height) {
+
+ LOG ($verbose_decode,
+ "cropping for effective paste of ${crop_w}x${crop_h} \@ $x,$y");
+
+ if ($x < 0) { $crop_x -= $x; $crop_w += $x; $x = 0; }
+ if ($y < 0) { $crop_y -= $y; $crop_h += $y; $y = 0; }
+
+ if ($x + $crop_w >= $img_width) { $crop_w = $img_width - $x - 1; }
+ if ($y + $crop_h >= $img_height) { $crop_h = $img_height - $y - 1; }
+ }
+
+ # If any cropping needs to happen, add pnmcut.
+ #
+ if ($crop_x != 0 || $crop_y != 0 ||
+ $crop_w != $iw || $crop_h != $ih) {
+ $iw = $crop_w;
+ $ih = $crop_h;
+ LOG ($verbose_decode, "cropping to ${crop_w}x$crop_h \@ " .
+ "$crop_x,$crop_y");
+ }
+
+ LOG ($verbose_decode, "pasting ${iw}x$ih \@ $x,$y in $image_png");
+ }
+
+ my @cmd;
+ if (defined ($webcollage_helper)) {
+ @cmd = ($webcollage_helper,
+ $image_tmp1, $image_png,
+ $scale, $opacity,
+ $crop_x, $crop_y, $x, $y,
+ $iw, $ih);
+ } else {
+ @cmd = ($convert_cmd,
+ $image_png,
+ '(',
+ $image_tmp1 . '[0]',
+ '-scale', sprintf("%.2f%%", 100 * $scale),
+ '-crop', "${iw}x${ih}+${crop_x}+${crop_y}",
+ '-geometry', "+${x}+${y}",
+
+ ($init_p ? () :
+ (
+ # Blurry edges with rounded corners
+ '-alpha', 'set',
+ '-virtual-pixel', 'transparent',
+ '-channel', 'A',
+ '-blur', '0x12',
+ '-level', '50%,100%',
+
+ # Overall transparency
+ '-evaluate', 'multiply', $opacity,
+
+ '+channel',
+ )),
+ ')',
+ '-composite',
+ '+repage',
+ '-strip',
+ $image_png);
+ }
+
+ #### $verbose_decode should mean 2>/dev/null
+
+ my $rc = nontrapping_system (@cmd);
+
+ if (-z $image_png) {
+ LOG (1, "failed command: \"@cmd\"");
+ print STDERR "\naudit log:\n\n\n";
+ print STDERR ("#" x 78) . "\n";
+ print STDERR blurb() . "$image_png has zero size\n";
+ showlog();
+ print STDERR "\n\n";
+ exit (1);
+ }
+
+ if ($rc != 0) {
+ LOG (($verbose_decode || $verbose_load), "failed command: \"@cmd\"");
+ LOG (($verbose_decode || $verbose_load),
+ "failed URL: \"$img\" (${ow}x$oh)");
+ return;
+ }
+
+ my $target = "$image_png";
+
+ # don't just tack this onto the end of the pipeline -- we don't want it
+ # to end up in $image_png, because we don't want the results to be
+ # cumulative.
+ #
+ if ($post_filter_cmd) {
+
+ # #### Historically, $post_filter_cmd read and write PPM files.
+ # This is doing PNG or JPEG now. I'll bet nobody uses this.
+
+ $target = $image_tmp1;
+ my $cmd = "($post_filter_cmd) < $image_png > $target";
+ $rc = nontrapping_system ($cmd);
+ if ($rc != 0) {
+ LOG ($verbose_decode, "filter failed: \"$post_filter_cmd\"\n");
+ return;
+ }
+ }
+
+ if (!$no_output_p) {
+ my $tsize = (stat($target))[7];
+ if ($tsize > 200) {
+ my $cmd = "$png_to_root_window_cmd $target";
+
+ # xv seems to hate being killed. it tends to forget to clean
+ # up after itself, and leaves windows around and colors allocated.
+ # I had this same problem with vidwhacker, and I'm not entirely
+ # sure what I did to fix it. But, let's try this: launch xv
+ # in the background, so that killing this process doesn't kill it.
+ # it will die of its own accord soon enough. So this means we
+ # start pumping bits to the root window in parallel with starting
+ # the next network retrieval, which is probably a better thing
+ # to do anyway.
+ #
+ $cmd .= " &" unless ($cocoa_p);
+
+ $rc = nontrapping_system ($cmd);
+
+ if ($rc != 0) {
+ LOG (($verbose_decode || $verbose_load), "display failed: \"$cmd\"");
+ return;
+ }
+
+ } else {
+ LOG ($verbose_decode, "$target size is $tsize");
+ }
+ }
+
+ if (defined($source)) {
+ $source .= "-" . stats_of($source);
+ print STDOUT "image: ${iw}x${ih} @ $x,$y $base $source\n"
+ if ($verbose_imgmap);
+ if ($imagemap_base) {
+ update_imagemap ($base, $x, $y, $iw, $ih,
+ $image_png, $img_width, $img_height);
+ }
+ }
+
+ clearlog();
+
+ return 1;
+}
+
+
+sub update_imagemap($$$$$$$$) {
+ my ($url, $x, $y, $w, $h, $image_png, $image_width, $image_height) = @_;
+
+ $current_state = "imagemap";
+
+ my $max_areas = 200;
+
+ $url = html_quote ($url);
+ push @imagemap_areas, [$x, $y, $w, $h, $url];
+ shift @imagemap_areas if (@imagemap_areas > $max_areas);
+ LOG ($verbose_decode, "area: $x,$y,$w,$h");
+
+ my $map_name = $imagemap_base;
+ $map_name =~ s@^.*/@@;
+ $map_name = 'collage' if ($map_name eq '');
+
+ my $imagemap_html = $imagemap_base . ".html";
+ my $imagemap_jpg = $imagemap_base . ".jpg";
+ my $imagemap_jpg2 = $imagemap_jpg;
+ $imagemap_jpg2 =~ s@^.*/@@gs;
+
+ if (!defined ($imagemap_html_tmp)) {
+ $imagemap_html_tmp = $imagemap_html . sprintf (".%08x", rand(0xffffffff));
+ $imagemap_jpg_tmp = $imagemap_jpg . sprintf (".%08x", rand(0xffffffff));
+ }
+
+ # Read the imagemap html file (if any) to get a template.
+ #
+ my $template_html = '';
+ {
+ if (open (my $in, '<', $imagemap_html)) {
+ local $/ = undef; # read entire file
+ $template_html = <$in>;
+ close $in;
+ LOG ($verbose_decode, "read template $imagemap_html");
+ }
+
+ if (! ($template_html =~ m/\.webcollage_box\b/s)) { # missing or old
+ $template_html =
+ '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+ <HEAD>
+ <BASE TARGET="_new">
+ <meta HTTP-EQUIV="Refresh" content="60" />
+ <TITLE>WebCollage</TITLE>
+ <STYLE TYPE="text/css">
+ <!--
+ body { color: #FFF; max-width: 100%; }
+ .webcollage_date, .webcollage_size {
+ display: block; margin-top: 4px; font-size: 7pt; color: #888;
+ }
+ .webcollage_date { float: left; }
+ .webcollage_size { float: right; }
+
+ .webcollage_frame {
+ overflow: hidden;
+ position: relative;
+ padding-bottom: 56.25%;
+ padding-bottom: 75%; /* 4:3 aspect ratio */
+ border: 1px solid #888;
+ background: #000;
+ }
+
+ .webcollage_box {
+ position: absolute; top: 0; left: 0;
+ border: 0; margin: 0; padding: 0;
+ width: 100%;
+ height: 100%;
+ }
+
+ .webcollage_box > img { width: 100%; height: 100%; border: 0; }
+
+ .webcollage_frame > a {
+ display: block;
+ position: absolute;
+ border-radius: 16px;
+ }
+
+ .webcollage_frame > a:hover {
+ background: rgba(1,1,1,.25);
+ }
+ -->
+ </STYLE>
+ </HEAD>
+ <BODY>
+ <DIV CLASS="webcollage_frame">
+ </DIV>
+ </BODY>
+</HTML>
+';
+
+ LOG ($verbose_decode, "created dummy template");
+ }
+ }
+
+ # Write the jpg to a tmp file
+ #
+ {
+ my @cmd;
+ if (defined($webcollage_helper)) {
+ @cmd = ('cp', '-p', $image_png, $imagemap_jpg_tmp);
+ } else {
+ @cmd = ($convert_cmd, $image_png, 'jpeg:' . $imagemap_jpg_tmp);
+ }
+ my $rc = nontrapping_system (@cmd);
+ if ($rc != 0) {
+ error ("imagemap jpeg failed: \"@cmd\"\n");
+ }
+ }
+
+ # Write the html to a tmp file
+ #
+ {
+ my $body = $template_html;
+ my $img = (" <DIV CLASS=\"webcollage_box\">" .
+ "<IMG SRC=\"$imagemap_jpg2\">" .
+ "</DIV>\n");
+ foreach my $a (@imagemap_areas) {
+ my ($x, $y, $w, $h, $u) = @$a;
+ $x /= $img_width / 100;
+ $y /= $img_height / 100;
+ $w /= $img_width / 100;
+ $h /= $img_height / 100;
+ foreach ($x, $y, $w, $h) { $_ = sprintf("%.1f%%", $_); }
+ $u = html_quote($u);
+ $img .= (" <A HREF=\"$u\" STYLE=\"" .
+ "left:$x;top:$y;width:$w;height:$h\"/>\n");
+ }
+
+ $img = ("<DIV CLASS=\"webcollage_frame\">\n" .
+ $img .
+ " </DIV>\n");
+ $body =~ s@<DIV \s+ CLASS=[\"\']webcollage_frame[\"\']>
+ .*? </DIV> .*? </DIV>@$img@sex ||
+ error ("$imagemap_html_tmp: unable to splice image");
+
+
+ # if there are magic webcollage spans in the html, update those too.
+ #
+ {
+ my @st = stat ($imagemap_jpg_tmp);
+ my $date = strftime("%d-%b-%Y %l:%M:%S %p %Z", localtime($st[9]));
+ my $size = int(($st[7] / 1024) + 0.5) . "K";
+ $body =~ s@(<SPAN\s+CLASS=\"webcollage_date\">).*?(</SPAN>)@$1$date$2@si;
+ $body =~ s@(<SPAN\s+CLASS=\"webcollage_size\">).*?(</SPAN>)@$1$size$2@si;
+ }
+
+ open (my $out, '>', $imagemap_html_tmp) || error("$imagemap_html_tmp: $!");
+ (print $out $body) || error("$imagemap_html_tmp: $!");
+ close ($out) || error("$imagemap_html_tmp: $!");
+ LOG ($verbose_decode, "wrote $imagemap_html_tmp");
+ }
+
+ # Rename the two tmp files to the real files
+ #
+ rename ($imagemap_html_tmp, $imagemap_html) ||
+ error "renaming $imagemap_html_tmp to $imagemap_html";
+ LOG ($verbose_decode, "wrote $imagemap_html");
+
+ if ($imagemap_jpg_tmp ne $image_png) {
+ rename ($imagemap_jpg_tmp, $imagemap_jpg) ||
+ error "renaming $imagemap_jpg_tmp to $imagemap_jpg";
+ LOG ($verbose_decode, "wrote $imagemap_jpg");
+ }
+}
+
+
+# Figure out what the proxy server should be, either from environment
+# variables or by parsing the output of the (MacOS) program "scutil",
+# which tells us what the system-wide proxy settings are.
+#
+sub set_proxy() {
+
+ if (! defined($http_proxy)) {
+ # historical suckage: the environment variable name is lower case.
+ $http_proxy = $ENV{http_proxy} || $ENV{HTTP_PROXY};
+ }
+
+ if (defined ($http_proxy)) {
+ if ($http_proxy && $http_proxy =~ m@^https?://([^/]*)/?$@ ) {
+ # historical suckage: allow "http://host:port" as well as "host:port".
+ $http_proxy = $1;
+ }
+
+ } else {
+ my $proxy_data = `scutil --proxy 2>/dev/null`;
+ my ($server) = ($proxy_data =~ m/\bHTTPProxy\s*:\s*([^\s]+)/s);
+ my ($port) = ($proxy_data =~ m/\bHTTPPort\s*:\s*([^\s]+)/s);
+ # Note: this ignores the "ExceptionsList".
+ if ($server) {
+ $http_proxy = $server;
+ $http_proxy .= ":$port" if $port;
+ }
+ }
+
+ delete $ENV{http_proxy};
+ delete $ENV{HTTP_PROXY};
+ delete $ENV{https_proxy};
+ delete $ENV{HTTPS_PROXY};
+ delete $ENV{PERL_LWP_ENV_PROXY};
+
+ if ($http_proxy) {
+ $http_proxy = 'http://' . $http_proxy;
+ LOG ($verbose_net, "proxy server: $http_proxy");
+ } else {
+ $http_proxy = undef; # for --proxy ''
+ }
+}
+
+
+sub init_signals() {
+
+ $SIG{HUP} = \&signal_cleanup;
+ $SIG{INT} = \&signal_cleanup;
+ $SIG{QUIT} = \&signal_cleanup;
+ $SIG{ABRT} = \&signal_cleanup;
+ $SIG{KILL} = \&signal_cleanup;
+ $SIG{TERM} = \&signal_cleanup;
+
+ # Need this so that if subprocess filters die, we don't die.
+ $SIG{PIPE} = 'IGNORE';
+}
+
+END { exit_cleanup(); }
+
+
+sub main() {
+ $| = 1;
+ srand(time ^ $$);
+
+ my $verbose = 0;
+ my $dict;
+ my $driftnet_cmd = 0;
+
+ $current_state = "init";
+ $load_method = "none";
+
+ my $root_p = 0;
+ my $window_id = undef;
+
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if (m/^--?d(i(s(p(l(a(y)?)?)?)?)?)?$/s) {
+ $ENV{DISPLAY} = shift @ARGV;
+ } elsif (m/^--?root$/s) {
+ $root_p = 1;
+ } elsif (m/^--?window-id$/s) {
+ $window_id = shift @ARGV;
+ $root_p = 1;
+ } elsif (m/^--?no-output$/s) {
+ $no_output_p = 1;
+ } elsif (m/^--?urls(-only)?$/s) {
+ $urls_only_p = 1;
+ $no_output_p = 1;
+ } elsif (m/^--?cocoa$/s) {
+ $cocoa_p = 1;
+ } elsif (m/^--?imagemap$/s) {
+ $imagemap_base = shift @ARGV;
+ $no_output_p = 1;
+ } elsif (m/^--?verbose$/s) {
+ $verbose++;
+ } elsif (m/^-v+$/) {
+ $verbose += length($_)-1;
+ } elsif (m/^--?delay$/s) {
+ $delay = shift @ARGV;
+ } elsif (m/^--?timeout$/s) {
+ $http_timeout = shift @ARGV;
+ } elsif (m/^--?filter$/s) {
+ $filter_cmd = shift @ARGV;
+ } elsif (m/^--?filter2$/s) {
+ $post_filter_cmd = shift @ARGV;
+ } elsif (m/^--?(background|bg)$/s) {
+ $background = shift @ARGV;
+ } elsif (m/^--?size$/s) {
+ $_ = shift @ARGV;
+ if (m@^(\d+)x(\d+)$@) {
+ $img_width = $1;
+ $img_height = $2;
+ } else {
+ error "argument to \"--size\" must be of the form \"640x400\"";
+ }
+ } elsif (m/^--?(http-)?proxy$/s) {
+ $http_proxy = shift @ARGV;
+ } elsif (m/^--?dict(ionary)?$/s) {
+ $dict = shift @ARGV;
+ } elsif (m/^--?opacity$/s) {
+ $opacity = shift @ARGV;
+ error ("opacity must be between 0.0 and 1.0")
+ if ($opacity <= 0 || $opacity > 1);
+ } elsif (m/^--?driftnet$/s) {
+ @search_methods = ( 100, "driftnet", \&pick_from_driftnet );
+ if (! ($ARGV[0] =~ m/^-/)) {
+ $driftnet_cmd = shift @ARGV;
+ } else {
+ $driftnet_cmd = $default_driftnet_cmd;
+ }
+ } elsif (m/^--?dir(ectory)?$/s) {
+ @search_methods = ( 100, "local", \&pick_from_local_dir );
+ if (! ($ARGV[0] =~ m/^-/)) {
+ $local_dir = shift @ARGV;
+ } else {
+ error ("local directory path must be set")
+ }
+ } elsif (m/^--?fps$/s) {
+ # -fps only works on MacOS, via "webcollage-cocoa.m".
+ # Ignore it if passed to this script in an X11 context.
+ } elsif (m/^--?debug$/s) {
+ my $which = shift @ARGV;
+ my @rest = @search_methods;
+ my $ok = 0;
+ while (@rest) {
+ my $pct = shift @rest;
+ my $name = shift @rest;
+ my $tfn = shift @rest;
+
+ if ($name eq $which) {
+ @search_methods = (100, $name, $tfn);
+ $ok = 1;
+ last;
+ }
+ }
+ error "no such search method as \"$which\"" unless ($ok);
+ LOG (1, "DEBUG: using only \"$which\"");
+ $report_performance_interval = 30;
+
+ } else {
+ print STDERR "unknown option: $_\n\n";
+ print STDERR "$copyright\nusage: $progname " .
+ "[--root] [--display dpy] [--verbose] [--debug which]\n" .
+ "\t\t [--timeout secs] [--delay secs] [--size WxH]\n" .
+ "\t\t [--no-output] [--urls-only] [--imagemap filename]\n" .
+ "\t\t [--background color] [--opacity f]\n" .
+ "\t\t [--filter cmd] [--filter2 cmd]\n" .
+ "\t\t [--dictionary dictionary-file] [--http-proxy host[:port]]\n" .
+ "\t\t [--driftnet [driftnet-program-and-args]]\n" .
+ "\t\t [--directory local-image-directory]\n" .
+ "\n";
+ exit 1;
+ }
+ }
+
+ if (!$root_p && !$no_output_p && !$cocoa_p) {
+ print STDERR $copyright;
+ error "the --root argument is mandatory (for now.)";
+ }
+
+ if (!$no_output_p && !$cocoa_p && !$ENV{DISPLAY}) {
+ error "\$DISPLAY is not set.";
+ }
+
+
+ if ($verbose == 1) {
+ $verbose_imgmap = 1;
+ $verbose_warnings = 1;
+
+ } elsif ($verbose == 2) {
+ $verbose_imgmap = 1;
+ $verbose_warnings = 1;
+ $verbose_load = 1;
+
+ } elsif ($verbose == 3) {
+ $verbose_imgmap = 1;
+ $verbose_warnings = 1;
+ $verbose_load = 1;
+ $verbose_filter = 1;
+
+ } elsif ($verbose == 4) {
+ $verbose_imgmap = 1;
+ $verbose_warnings = 1;
+ $verbose_load = 1;
+ $verbose_filter = 1;
+ $verbose_net = 1;
+
+ } elsif ($verbose == 5) {
+ $verbose_imgmap = 1;
+ $verbose_warnings = 1;
+ $verbose_load = 1;
+ $verbose_filter = 1;
+ $verbose_net = 1;
+ $verbose_decode = 1;
+
+ } elsif ($verbose == 6) {
+ $verbose_imgmap = 1;
+ $verbose_warnings = 1;
+ $verbose_load = 1;
+ $verbose_filter = 1;
+ $verbose_net = 1;
+ $verbose_decode = 1;
+ $verbose_http = 1;
+
+ } elsif ($verbose >= 7) {
+ $verbose_imgmap = 1;
+ $verbose_warnings = 1;
+ $verbose_load = 1;
+ $verbose_filter = 1;
+ $verbose_net = 1;
+ $verbose_decode = 1;
+ $verbose_http = 1;
+ $verbose_exec = 1;
+ }
+
+ if ($dict) {
+ error ("$dict does not exist") unless (-f $dict);
+ $wordlist = $dict;
+ } else {
+ pick_dictionary();
+ }
+
+ if ($imagemap_base && !($img_width && $img_height)) {
+ error ("--size WxH is required with --imagemap");
+ }
+
+ if (defined ($local_dir)) {
+ $_ = "xscreensaver-getimage-file";
+ which ($_) || error "$_ not found on \$PATH.";
+ }
+
+ init_signals();
+ set_proxy();
+
+ spawn_driftnet ($driftnet_cmd) if ($driftnet_cmd);
+
+ if ($urls_only_p) {
+ url_only_output ();
+ } else {
+ x_or_image_output ($window_id);
+ }
+}
+
+main();
+exit (0);
diff --git a/hacks/webcollage-cocoa.m b/hacks/webcollage-cocoa.m
new file mode 100644
index 0000000..e8bc2b2
--- /dev/null
+++ b/hacks/webcollage-cocoa.m
@@ -0,0 +1,428 @@
+/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+ /* This is the Cocoa shim for webcollage.
+
+ It runs the webcollage perl script
+ (in "WebCollage.saver/Contents/Resources/webcollage")
+ at the end of a pipe; each time that script updates the image file on
+ disk it prints the file name, and this program loads and displays that
+ image.
+
+ The script uses "WebCollage.saver/Contents/Resources/webcollage-helper"
+ to paste the images together in the usual way.
+ */
+
+#include <math.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <signal.h>
+#import <Cocoa/Cocoa.h>
+
+#include "screenhack.h"
+
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int delay;
+ pid_t pid;
+ FILE *pipe_fd;
+ XtInputId pipe_id;
+ Bool verbose_p;
+} state;
+
+
+/* Violating the cardinal rule of "don't use global variables",
+ but we need to get at these from the atexit() handler, and
+ the callback doesn't take a closure arg. Because apparently
+ those hadn't been invented yet in the seventies.
+ */
+static state *all_states[50] = { 0, };
+
+static void webcollage_atexit (void);
+static void signal_handler (int sig);
+
+
+static void
+subproc_cb (XtPointer closure, int *source, XtInputId *id)
+{
+ /* state *st = (state *) closure; */
+ /* st->input_available_p = True; */
+}
+
+
+/* whether there is data available to be read on the file descriptor
+ */
+static int
+input_available_p (int fd)
+{
+ struct timeval tv = { 0, };
+ fd_set fds;
+# if 0
+ /* This breaks on BSD, which uses bzero() in the definition of FD_ZERO */
+ FD_ZERO (&fds);
+# else
+ memset (&fds, 0, sizeof(fds));
+# endif
+ FD_SET (fd, &fds);
+ return select (fd+1, &fds, NULL, NULL, &tv);
+}
+
+
+static void
+display_image (Display *dpy, Window window, state *st, const char *file)
+{
+ NSImage *image = [[NSImage alloc]
+ initWithContentsOfFile:
+ [NSString stringWithCString: file
+ encoding: NSUTF8StringEncoding]];
+
+ if (! image) {
+ fprintf (stderr, "webcollage: failed to load \"%s\"\n", file);
+ return;
+ }
+
+ CGFloat w = [image size].width;
+ CGFloat h = [image size].height;
+ if (w <= 1 || h <= 1) {
+ fprintf (stderr, "webcollage: unparsable image \"%s\"\n", file);
+ [image release];
+ return;
+ }
+
+ jwxyz_draw_NSImage_or_CGImage (dpy, window, True, image, 0, 0);
+ [image release];
+}
+
+
+static void
+open_pipe (state *st)
+{
+ /* This mess is because popen() doesn't give us the pid.
+ */
+
+ pid_t forked;
+ int fds [2];
+ int in, out;
+ char buf[1024];
+
+ char *av[20];
+ int ac = 0;
+
+ int timeout = get_integer_resource (st->dpy, "timeout", "Timeout");
+ int delay = get_integer_resource (st->dpy, "delay", "Delay");
+ float opacity = get_float_resource (st->dpy, "opacity", "Opacity");
+ char *filter = get_string_resource (st->dpy, "filter", "Filter");
+ char *filter2 = get_string_resource (st->dpy, "filter2", "Filter2");
+
+ av[ac++] = strdup ("webcollage");
+ av[ac++] = strdup ("-cocoa");
+
+ av[ac++] = strdup ("-size");
+ sprintf (buf, "%dx%d", st->xgwa.width, st->xgwa.height);
+ av[ac++] = strdup (buf);
+
+ av[ac++] = strdup ("-timeout"); sprintf (buf, "%d", timeout);
+ av[ac++] = strdup (buf);
+ av[ac++] = strdup ("-delay"); sprintf (buf, "%d", delay);
+ av[ac++] = strdup (buf);
+ av[ac++] = strdup ("-opacity"); sprintf (buf, "%.2f", opacity);
+ av[ac++] = strdup (buf);
+
+ if (filter && *filter) {
+ av[ac++] = strdup ("-filter");
+ av[ac++] = filter;
+ }
+ if (filter2 && *filter2) {
+ av[ac++] = strdup ("-filter2");
+ av[ac++] = filter2;
+ }
+
+ av[ac] = 0;
+
+
+ if (st->verbose_p) {
+ fprintf (stderr, "webcollage: launching:");
+ int i;
+ for (i = 0; i < ac; i++)
+ fprintf (stderr, " %s", av[i]);
+ fprintf (stderr, "\n");
+ }
+
+
+ if (pipe (fds))
+ {
+ perror ("webcollage: error creating pipe");
+ exit (1);
+ }
+
+ in = fds [0];
+ out = fds [1];
+
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ perror ("webcollage: couldn't fork");
+ exit (1);
+ }
+ case 0:
+ {
+ int stdout_fd = 1;
+
+ close (in); /* don't need this one */
+
+ if (dup2 (out, stdout_fd) < 0) /* pipe stdout */
+ {
+ perror ("could not dup() a new stdout:");
+ exit (1);
+ }
+
+ execvp (av[0], av); /* shouldn't return. */
+
+ if (errno != ENOENT)
+ {
+ /* Ignore "no such file or directory" errors, unless verbose.
+ Issue all other exec errors, though. */
+ sprintf (buf, "webcollage: %s", av[0]);
+ perror (buf);
+ }
+
+ exit (1); /* exits fork */
+ break;
+ }
+ default:
+ {
+ st->pipe_fd = fdopen (in, "r");
+ close (out); /* don't need this one */
+ }
+ }
+
+ while (ac > 0)
+ free (av[--ac]);
+
+ if (! st->pipe_fd) abort();
+
+ st->pid = forked;
+ st->pipe_id =
+ XtAppAddInput (XtDisplayToApplicationContext (st->dpy),
+ fileno (st->pipe_fd),
+ (XtPointer) (XtInputReadMask | XtInputExceptMask),
+ subproc_cb, (XtPointer) st);
+
+ if (st->verbose_p)
+ fprintf (stderr, "webcollage: subprocess pid: %d\n", st->pid);
+}
+
+
+static void *
+webcollage_init (Display *dpy, Window window)
+{
+ state *st = (state *) calloc (1, sizeof(*st));
+ int i;
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->delay = 1000000; /* check once a second */
+
+ // Log to syslog when FPS is turned on.
+ st->verbose_p = get_boolean_resource (dpy, "doFPS", "DoFPS");
+
+
+ static int done_once = 0;
+ if (! done_once) {
+ done_once = 1;
+
+ if (atexit (webcollage_atexit)) { // catch calls to exit()
+ perror ("webcollage: atexit");
+ exit (-1);
+ }
+
+ int sigs[] = { SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT,
+ SIGFPE, SIGBUS, SIGSEGV, SIGSYS, /*SIGPIPE,*/
+ SIGALRM, SIGTERM };
+ for (i = 0; i < sizeof(sigs)/sizeof(*sigs); i++) {
+ if (signal (sigs[i], signal_handler)) {
+ perror ("webcollage: signal");
+ //exit (1);
+ }
+ }
+ }
+
+
+ open_pipe (st);
+
+ i = 0;
+ while (all_states[i]) i++;
+ all_states[i] = st;
+
+ return st;
+}
+
+
+static unsigned long
+webcollage_draw (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+
+ if (! st->pipe_fd)
+ exit (1);
+
+ if (! input_available_p (fileno (st->pipe_fd)))
+ return st->delay;
+
+ char buf[10240];
+ int n = read (fileno (st->pipe_fd),
+ (void *) buf,
+ sizeof(buf) - 1);
+ if (n <= 0)
+ {
+ XtRemoveInput (st->pipe_id);
+ st->pipe_id = 0;
+ // #### sometimes hangs -- pclose (st->pipe_fd);
+ st->pipe_fd = 0;
+
+ if (st->verbose_p)
+ fprintf (stderr, "webcollage: subprocess has exited: bailing.\n");
+
+ return st->delay * 10;
+ }
+
+ buf[n] = 0;
+ char *s = strchr (buf, '\n');
+ if (s) *s = 0;
+
+ const char *target = "COCOA LOAD ";
+ if (!strncmp (target, buf, strlen(target))) {
+ const char *file = buf + strlen(target);
+ display_image (dpy, window, st, file);
+ }
+
+ return st->delay;
+}
+
+
+static void
+webcollage_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+
+static Bool
+webcollage_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+
+static void
+webcollage_atexit (void)
+{
+ int i = 0;
+
+ if (all_states[0] && all_states[0]->verbose_p)
+ fprintf (stderr, "webcollage: atexit handler\n");
+
+ while (all_states[i]) {
+ state *st = all_states[i];
+ if (st->pid) {
+ if (st->verbose_p)
+ fprintf (stderr, "webcollage: kill %d\n", st->pid);
+ if (kill (st->pid, SIGTERM) < 0) {
+ fprintf (stderr, "webcollage: kill (%d, TERM): ", st->pid);
+ perror ("webcollage: kill");
+ }
+ st->pid = 0;
+ }
+ all_states[i] = 0;
+ i++;
+ }
+}
+
+
+static void
+signal_handler (int sig)
+{
+ if (all_states[0] && all_states[0]->verbose_p)
+ fprintf (stderr, "webcollage: signal %d\n", sig);
+ webcollage_atexit ();
+ exit (sig);
+}
+
+
+/* This is important because OSX doesn't actually kill the screen savers!
+ It just sends them a [ScreenSaverView stopAnimation] method. Were
+ they to actually exit, the resultant SIGPIPE should reap the children,
+ but instead, we need to do it here.
+
+ On top of that, there's an atexit() handler because otherwise the
+ inferior perl script process was failing to die when SaverTester or
+ System Preferences exited. I don't pretend to understand.
+
+ It still fails to clean up when I hit the stop button in Xcode.
+ WTF.
+ */
+static void
+webcollage_free (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+
+ if (st->verbose_p)
+ fprintf (stderr, "webcollage: free cb\n");
+
+ // Dammit dammit dammit! Why won't this shit die when we pclose it!
+// killpg (0, SIGTERM);
+
+ webcollage_atexit();
+
+ if (st->pipe_id)
+ XtRemoveInput (st->pipe_id);
+
+ if (st->pipe_fd)
+ fclose (st->pipe_fd);
+
+ // Reap zombies.
+# undef sleep
+ sleep (1);
+ int wait_status = 0;
+ waitpid (-1, &wait_status, 0);
+
+ free (st);
+}
+
+
+static const char *webcollage_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+
+ "*timeout: 30",
+ "*delay: 2",
+ "*opacity: 0.85",
+ "*filter: ",
+ "*filter2: ",
+ 0
+};
+
+static XrmOptionDescRec webcollage_options [] = {
+ { "-timeout", ".timeout", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-opacity", ".opacity", XrmoptionSepArg, 0 },
+ { "-filter", ".filter", XrmoptionSepArg, 0 },
+ { "-filter2", ".filter2", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("WebCollage", webcollage)
diff --git a/hacks/webcollage-helper-cocoa.m b/hacks/webcollage-helper-cocoa.m
new file mode 100644
index 0000000..fde1f0d
--- /dev/null
+++ b/hacks/webcollage-helper-cocoa.m
@@ -0,0 +1,510 @@
+/* webcollage-helper-cocoa --- scales and pastes one image into another
+ * xscreensaver, Copyright (c) 2002-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is the Cocoa implementation. See webcollage-helper.c for the
+ GDK + JPEGlib implementation.
+ */
+
+#import <Cocoa/Cocoa.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
+ typedef int NSInteger;
+ typedef unsigned int NSUInteger;
+#endif
+
+
+char *progname;
+static int verbose_p = 0;
+
+static void write_image (NSImage *img, const char *file);
+
+
+/* NSImage can't load PPMs by default...
+ */
+static NSImage *
+load_ppm_image (const char *file)
+{
+ FILE *in = fopen (file, "r");
+ if (! in) return 0;
+
+ char buf[255];
+
+ char *s = fgets (buf, sizeof(buf)-1, in); /* P6 */
+ if (!s || !!strcmp (s, "P6\n"))
+ return 0;
+
+ s = fgets (buf, sizeof(buf)-1, in); /* W H */
+ if (!s)
+ return 0;
+
+ int w = 0, h = 0, d = 0;
+ if (2 != sscanf (buf, " %d %d \n", &w, &h))
+ return 0;
+ if (w <= 0 || h <= 0)
+ return 0;
+
+ s = fgets (buf, sizeof(buf)-1, in); /* 255 */
+ if (!s)
+ return 0;
+
+ if (1 != sscanf (buf, " %d \n", &d))
+ return 0;
+ if (d != 255)
+ return 0;
+
+ int size = (w * (h+1) * 3);
+ unsigned char *bits = malloc (size);
+ if (!bits) return 0;
+
+ int n = read (fileno (in), (void *) bits, size); /* body */
+ if (n < 20) return 0;
+
+ fclose (in);
+
+ NSBitmapImageRep *rep =
+ [[NSBitmapImageRep alloc]
+ initWithBitmapDataPlanes: &bits
+ pixelsWide: w
+ pixelsHigh: h
+ bitsPerSample: 8
+ samplesPerPixel: 3
+ hasAlpha: NO
+ isPlanar: NO
+ colorSpaceName: NSDeviceRGBColorSpace
+ bitmapFormat: NSAlphaFirstBitmapFormat
+ bytesPerRow: w * 3
+ bitsPerPixel: 8 * 3];
+
+ NSImage *image = [[NSImage alloc] initWithSize: NSMakeSize (w, h)];
+ [image addRepresentation: rep];
+ [rep release];
+
+ // #### 'bits' is leaked... the NSImageRep doesn't free it when freed.
+
+ return image;
+}
+
+
+static NSImage *
+load_image (const char *file)
+{
+ NSImage *image = [[NSImage alloc]
+ initWithContentsOfFile:
+ [NSString stringWithCString: file
+ encoding: NSUTF8StringEncoding]];
+ if (! image)
+ image = load_ppm_image (file);
+
+ if (! image) {
+ fprintf (stderr, "%s: unable to load %s\n", progname, file);
+ exit (1);
+ }
+
+
+ // [NSImage size] defaults to the image size in points instead of pixels,
+ // so if an image file specified "pixels per inch" we can end up with
+ // absurdly sized images. Set it back to 1:1 pixel:point.
+ //
+ NSImageRep *rep = [image.representations objectAtIndex:0];
+ image.size = NSMakeSize (rep.pixelsWide, rep.pixelsHigh);
+
+ return image;
+}
+
+
+static void
+bevel_image (NSImage *img, int bevel_pct,
+ int x, int y, int w, int h, double scale)
+{
+ int small_size = (w > h ? h : w);
+
+ int bevel_size = small_size * (bevel_pct / 100.0);
+
+ bevel_size /= scale;
+
+ /* Use a proportionally larger bevel size for especially small images. */
+ if (bevel_size < 20 && small_size > 40) bevel_size = 20;
+ else if (bevel_size < 10 && small_size > 20) bevel_size = 10;
+ else if (bevel_size < 5) /* too small to bother bevelling */
+ return;
+
+
+ NSBitmapImageRep *rep =
+ [[NSBitmapImageRep alloc]
+ initWithBitmapDataPlanes: NULL
+ pixelsWide: w
+ pixelsHigh: h
+ bitsPerSample: 8
+ samplesPerPixel: 4
+ hasAlpha: YES
+ isPlanar: NO
+ colorSpaceName: NSDeviceRGBColorSpace
+ bitmapFormat: NSAlphaFirstBitmapFormat
+ bytesPerRow: 0
+ bitsPerPixel: 0];
+
+ NSInteger xx, yy;
+ double *ramp = (double *) malloc (sizeof(*ramp) * (bevel_size + 1));
+
+ if (!ramp)
+ {
+ fprintf (stderr, "%s: out of memory (%d)\n", progname, bevel_size);
+ exit (1);
+ }
+
+ for (xx = 0; xx <= bevel_size; xx++)
+ {
+# if 0 /* linear */
+ ramp[xx] = xx / (double) bevel_size;
+
+# else /* sinusoidal */
+ double p = (xx / (double) bevel_size);
+ double s = sin (p * M_PI / 2);
+ ramp[xx] = s;
+# endif
+ }
+
+ memset ([rep bitmapData], 0xFFFFFFFF,
+ [rep bytesPerRow] * h);
+
+ for (yy = 0; yy < h; yy++)
+ {
+ for (xx = 0; xx < w; xx++)
+ {
+ double rx, ry, r;
+
+ if (xx < bevel_size) rx = ramp[xx];
+ else if (xx >= w - bevel_size) rx = ramp[w - xx - 1];
+ else rx = 1;
+
+ if (yy < bevel_size) ry = ramp[yy];
+ else if (yy >= h - bevel_size) ry = ramp[h - yy - 1];
+ else ry = 1;
+
+ r = rx * ry;
+ if (r != 1)
+ {
+ NSUInteger p[4];
+ p[0] = 0xFF * r;
+ p[1] = p[2] = p[3] = 0xFF;
+ [rep setPixel:p atX:xx y:yy];
+ }
+ }
+ }
+
+ free (ramp);
+
+ NSImage *bevel_img = [[NSImage alloc]
+ initWithData: [rep TIFFRepresentation]];
+
+ [img lockFocus];
+ y = [img size].height - (y + h);
+ [bevel_img drawAtPoint: NSMakePoint (x, y)
+ fromRect: NSMakeRect (0, 0, w, h)
+ operation: NSCompositeDestinationIn /* Destination image
+ wherever both images are
+ opaque, transparent
+ elsewhere. */
+ fraction: 1.0];
+ [img unlockFocus];
+
+ [rep release];
+ [bevel_img release];
+
+ if (verbose_p)
+ fprintf (stderr, "%s: added %d%% bevel (%d px)\n", progname,
+ bevel_pct, bevel_size);
+}
+
+
+static void
+paste (const char *paste_file,
+ const char *base_file,
+ double from_scale,
+ double opacity, int bevel_pct,
+ int from_x, int from_y, int to_x, int to_y,
+ int w, int h)
+{
+ NSImage *paste_img = load_image (paste_file);
+ NSImage *base_img = load_image (base_file);
+
+ int paste_w = [paste_img size].width;
+ int paste_h = [paste_img size].height;
+
+ int base_w = [base_img size].width;
+ int base_h = [base_img size].height;
+
+ if (verbose_p)
+ {
+ fprintf (stderr, "%s: loaded %s: %dx%d\n",
+ progname, base_file, base_w, base_h);
+ fprintf (stderr, "%s: loaded %s: %dx%d\n",
+ progname, paste_file, paste_w, paste_h);
+ }
+
+ if (bevel_pct > 0 && paste_w > 5 && paste_h > 5)
+ bevel_image (paste_img, bevel_pct,
+ from_x, from_y, w, h,
+ from_scale);
+
+ int scaled_w = w * from_scale;
+ int scaled_h = h * from_scale;
+
+ from_y = paste_h - (from_y + h); // Cocoa flipped coordinate system
+ to_y = base_h - (to_y + scaled_h);
+
+ [base_img lockFocus];
+ [paste_img drawInRect: NSMakeRect (to_x, to_y, scaled_w, scaled_h)
+ fromRect: NSMakeRect (from_x, from_y, w, h)
+ operation: NSCompositeSourceOver
+ fraction: opacity];
+ [base_img unlockFocus];
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pasted %dx%d (%dx%d) from %d,%d to %d,%d\n",
+ progname, w, h, scaled_w, scaled_h, from_x, from_y, to_x, to_y);
+
+ [paste_img release];
+ write_image (base_img, base_file);
+ [base_img release];
+}
+
+
+static NSColor *
+parse_color (const char *s)
+{
+ static const char hex[128] =
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
+ 0, 10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+ unsigned char r=0, g=0, b=0;
+
+ if (!strcasecmp (s, "black")) ;
+ else if (!strcasecmp (s, "white")) r = g = b = 0xFF;
+ else if (!strcasecmp (s, "red")) r = 0xFF;
+ else if (!strcasecmp (s, "green")) g = 0xFF;
+ else if (!strcasecmp (s, "blue")) b = 0xFF;
+ else
+ {
+ if (*s != '#' || strlen(s) != 7)
+ {
+ fprintf (stderr, "%s: unparsable color: \"%s\"\n", progname, s);
+ exit (1);
+ }
+ s++;
+ r = (hex[(int) s[0]] << 4) | hex[(int) s[1]], s += 2;
+ g = (hex[(int) s[0]] << 4) | hex[(int) s[1]], s += 2;
+ b = (hex[(int) s[0]] << 4) | hex[(int) s[1]], s += 2;
+ }
+
+ return [NSColor colorWithRed: r / 255.0
+ green: g / 255.0
+ blue: b / 255.0
+ alpha: 1.0];
+}
+
+
+static void
+create (const char *color,
+ int w, int h,
+ const char *file)
+{
+ NSColor *c = parse_color (color);
+ NSImage *img = [[NSImage alloc] initWithSize:NSMakeSize(w, h)];
+ [img lockFocus];
+ [c drawSwatchInRect:NSMakeRect(0, 0, w, h)];
+ [img unlockFocus];
+ write_image (img, file);
+ [img release];
+}
+
+
+static void
+write_image (NSImage *img, const char *file)
+{
+ float jpeg_quality = .85;
+
+ // Load the NSImage's contents into an NSBitmapImageRep.
+
+#if 0
+ // If the local display is Retina, this doubles the size of the output JPEG.
+ NSBitmapImageRep *bit_rep = [NSBitmapImageRep
+ imageRepWithData:[img TIFFRepresentation]];
+#else
+ // Render the image into a rep using pixels instead of points.
+ NSBitmapImageRep *bit_rep = [[NSBitmapImageRep alloc]
+ initWithBitmapDataPlanes:NULL
+ pixelsWide:[img size].width
+ pixelsHigh:[img size].height
+ bitsPerSample:8
+ samplesPerPixel:4
+ hasAlpha:YES
+ isPlanar:NO
+ colorSpaceName:NSCalibratedRGBColorSpace
+ bytesPerRow:0
+ bitsPerPixel:0];
+ bit_rep.size = [img size];
+ [NSGraphicsContext saveGraphicsState];
+ [NSGraphicsContext setCurrentContext:
+ [NSGraphicsContext
+ graphicsContextWithBitmapImageRep:bit_rep]];
+ [img drawInRect:NSMakeRect(0, 0, [img size].width, [img size].height)
+ fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
+ [NSGraphicsContext restoreGraphicsState];
+#endif
+
+ // Write the bitmapImageRep to a JPEG file.
+ if (bit_rep == nil)
+ {
+ fprintf (stderr, "%s: error converting image?\n", progname);
+ exit (1);
+ }
+
+ if (verbose_p)
+ fprintf (stderr, "%s: writing %s (q=%d%%) ", progname, file,
+ (int) (jpeg_quality * 100));
+
+ NSData *jpeg_data = [bit_rep representationUsingType:NSJPEGFileType
+ properties:@{ NSImageCompressionFactor:
+ [NSNumber numberWithFloat:
+ jpeg_quality] }];
+ [jpeg_data writeToFile:
+ [NSString stringWithCString:file
+ encoding:NSISOLatin1StringEncoding]
+ atomically:YES];
+
+ if (verbose_p)
+ {
+ struct stat st;
+ if (stat (file, &st))
+ {
+ char buf[255];
+ sprintf (buf, "%.100s: %.100s", progname, file);
+ perror (buf);
+ exit (1);
+ }
+ fprintf (stderr, " %luK\n", ((unsigned long) st.st_size + 1023) / 1024);
+ }
+}
+
+
+static void
+usage (void)
+{
+ fprintf (stderr,
+ "\nusage: %s [-v] paste-file base-file\n"
+ "\t from-scale opacity\n"
+ "\t from-x from-y to-x to-y w h\n"
+ "\n"
+ "\t Pastes paste-file into base-file.\n"
+ "\t base-file will be overwritten (with JPEG data.)\n"
+ "\t scaling is applied first: coordinates apply to scaled image.\n"
+ "\n"
+ "usage: %s [-v] color width height output-file\n"
+ "\t Creates a new image of a solid color.\n\n",
+ progname, progname);
+ exit (1);
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ char *paste_file, *base_file, *s, dummy;
+ double from_scale, opacity;
+ int from_x, from_y, to_x, to_y, w, h, bevel_pct;
+
+ i = 0;
+ progname = argv[i++];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
+
+ // Much of Cocoa needs one of these to be available.
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ //Need an NSApp instance to make [NSImage TIFFRepresentation] work
+ NSApp = [NSApplication sharedApplication];
+ [NSApp autorelease];
+
+ if (!strcmp(argv[i], "-v"))
+ verbose_p++, i++;
+
+ if (argc == 11 || argc == 12)
+ {
+ paste_file = argv[i++];
+ base_file = argv[i++];
+
+ if (*paste_file == '-') usage();
+ if (*base_file == '-') usage();
+
+ s = argv[i++];
+ if (1 != sscanf (s, " %lf %c", &from_scale, &dummy)) usage();
+ if (from_scale <= 0 || from_scale > 100) usage();
+
+ s = argv[i++];
+ if (1 != sscanf (s, " %lf %c", &opacity, &dummy)) usage();
+ if (opacity <= 0 || opacity > 1) usage();
+
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &from_x, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &from_y, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &to_x, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &to_y, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &w, &dummy)) usage();
+ s = argv[i]; if (1 != sscanf (s, " %d %c", &h, &dummy)) usage();
+
+ bevel_pct = 10; /* #### */
+
+ if (w < 0) usage();
+ if (h < 0) usage();
+
+ if (w == 0 || h == 0 ||
+ w > 10240 || h > 10240) {
+ fprintf (stderr, "%s: absurd size: %d x %d\n", progname, w, h);
+ exit (1);
+ }
+
+ paste (paste_file, base_file,
+ from_scale, opacity, bevel_pct,
+ from_x, from_y, to_x, to_y,
+ w, h);
+ }
+ else if (argc == 4 || argc == 5)
+ {
+ char *color = argv[i++];
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &w, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &h, &dummy)) usage();
+ paste_file = argv[i++];
+ if (*paste_file == '-') usage();
+
+ create (color, w, h, paste_file);
+ }
+ else
+ {
+ usage();
+ }
+
+ [pool release];
+
+ exit (0);
+}
diff --git a/hacks/webcollage-helper.c b/hacks/webcollage-helper.c
new file mode 100644
index 0000000..46ec608
--- /dev/null
+++ b/hacks/webcollage-helper.c
@@ -0,0 +1,592 @@
+/* webcollage-helper --- scales and pastes one image into another
+ * xscreensaver, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is the GDK + JPEGlib implementation. See webcollage-helper-cocoa.m
+ for the Cocoa implementation.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if defined(HAVE_GDK_PIXBUF) && defined(HAVE_JPEGLIB) /* whole file */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#undef HAVE_STDLIB_H /* stupid jconfig.h! */
+#include <jpeglib.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+
+char *progname;
+static int verbose_p = 0;
+
+static void add_jpeg_comment (struct jpeg_compress_struct *cinfo);
+static void write_pixbuf (GdkPixbuf *pb, const char *file);
+
+static GdkPixbuf *
+load_pixbuf (const char *file)
+{
+ GdkPixbuf *pb;
+#ifdef HAVE_GTK2
+ GError *err = NULL;
+
+ pb = gdk_pixbuf_new_from_file (file, &err);
+#else /* !HAVE_GTK2 */
+ pb = gdk_pixbuf_new_from_file (file);
+#endif /* HAVE_GTK2 */
+
+ if (!pb)
+ {
+#ifdef HAVE_GTK2
+ fprintf (stderr, "%s: %s\n", progname, err->message);
+ g_error_free (err);
+#else /* !HAVE_GTK2 */
+ fprintf (stderr, "%s: unable to load %s\n", progname, file);
+#endif /* !HAVE_GTK2 */
+ exit (1);
+ }
+
+ return pb;
+}
+
+
+static void
+bevel_image (GdkPixbuf **pbP, int bevel_pct,
+ int x, int y, int w, int h)
+{
+ GdkPixbuf *pb = *pbP;
+ int small_size = (w > h ? h : w);
+
+ int bevel_size = small_size * (bevel_pct / 100.0);
+
+ /* Use a proportionally larger bevel size for especially small images. */
+ if (bevel_size < 20 && small_size > 40) bevel_size = 20;
+ else if (bevel_size < 10 && small_size > 20) bevel_size = 10;
+ else if (bevel_size < 5) /* too small to bother bevelling */
+ return;
+
+ /* Ensure the pixbuf has an alpha channel. */
+ if (! gdk_pixbuf_get_has_alpha (pb))
+ {
+ GdkPixbuf *pb2 = gdk_pixbuf_add_alpha (pb, FALSE, 0, 0, 0);
+ g_object_unref (pb);
+ pb = pb2;
+ }
+
+ {
+ guchar *data = gdk_pixbuf_get_pixels (pb);
+ guchar *line;
+ int rs = gdk_pixbuf_get_rowstride (pb);
+ int ch = gdk_pixbuf_get_n_channels (pb);
+ int xx, yy;
+ double *ramp = (double *) malloc (sizeof(*ramp) * (bevel_size + 1));
+
+ if (!ramp)
+ {
+ fprintf (stderr, "%s: out of memory (%d)\n", progname, bevel_size);
+ exit (1);
+ }
+
+ for (xx = 0; xx <= bevel_size; xx++)
+ {
+
+# if 0 /* linear */
+ ramp[xx] = xx / (double) bevel_size;
+
+# else /* sinusoidal */
+ double p = (xx / (double) bevel_size);
+ double s = sin (p * M_PI / 2);
+ ramp[xx] = s;
+# endif
+ }
+
+ line = data + (rs * y);
+ for (yy = 0; yy < h; yy++)
+ {
+ guchar *p = line + (x * ch);
+ for (xx = 0; xx < w; xx++)
+ {
+ double rx, ry, r;
+
+ if (xx < bevel_size) rx = ramp[xx];
+ else if (xx >= w - bevel_size) rx = ramp[w - xx - 1];
+ else rx = 1;
+
+ if (yy < bevel_size) ry = ramp[yy];
+ else if (yy >= h - bevel_size) ry = ramp[h - yy - 1];
+ else ry = 1;
+
+ r = rx * ry;
+ if (r != 1)
+ p[ch-1] *= r;
+
+ p += ch;
+ }
+ line += rs;
+ }
+
+#if 0 /* show the ramp */
+ line = data + (rs * y);
+ for (yy = 0; yy < h; yy++)
+ {
+ guchar *p = line + (x * ch);
+ for (xx = 0; xx < w; xx++)
+ {
+ int cc = 0;
+ for (cc = 0; cc < ch-1; cc++)
+ p[cc] = 255;
+ p += ch;
+ }
+ line += rs;
+ }
+#endif
+
+ free (ramp);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: added %d%% bevel (%d px)\n", progname,
+ bevel_pct, bevel_size);
+ }
+
+ *pbP = pb;
+}
+
+
+static void
+paste (const char *paste_file,
+ const char *base_file,
+ double from_scale,
+ double opacity, int bevel_pct,
+ int from_x, int from_y, int to_x, int to_y,
+ int w, int h)
+{
+ GdkPixbuf *paste_pb;
+ GdkPixbuf *base_pb;
+
+ int paste_w, paste_h;
+ int base_w, base_h;
+
+ paste_pb = load_pixbuf (paste_file);
+ base_pb = load_pixbuf (base_file);
+
+ paste_w = gdk_pixbuf_get_width (paste_pb);
+ paste_h = gdk_pixbuf_get_height (paste_pb);
+
+ base_w = gdk_pixbuf_get_width (base_pb);
+ base_h = gdk_pixbuf_get_height (base_pb);
+
+ if (verbose_p)
+ {
+ fprintf (stderr, "%s: loaded %s: %dx%d\n",
+ progname, base_file, base_w, base_h);
+ fprintf (stderr, "%s: loaded %s: %dx%d\n",
+ progname, paste_file, paste_w, paste_h);
+ }
+
+ if (from_scale != 1.0)
+ {
+ int new_w = paste_w * from_scale;
+ int new_h = paste_h * from_scale;
+ GdkPixbuf *new_pb = gdk_pixbuf_scale_simple (paste_pb, new_w, new_h,
+ GDK_INTERP_HYPER);
+ g_object_unref (paste_pb);
+ paste_pb = new_pb;
+ paste_w = gdk_pixbuf_get_width (paste_pb);
+ paste_h = gdk_pixbuf_get_height (paste_pb);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: %s: scaled to %dx%d (%.2f)\n",
+ progname, paste_file, paste_w, paste_h, from_scale);
+ }
+
+ if (w == 0) w = paste_w - from_x;
+ if (h == 0) h = paste_h - from_y;
+
+ {
+ int ofx = from_x;
+ int ofy = from_y;
+ int otx = to_x;
+ int oty = to_y;
+ int ow = w;
+ int oh = h;
+
+ int clipped = 0;
+
+ if (from_x < 0) /* from left out of bounds */
+ {
+ w += from_x;
+ from_x = 0;
+ clipped = 1;
+ }
+
+ if (from_y < 0) /* from top out of bounds */
+ {
+ h += from_y;
+ from_y = 0;
+ clipped = 1;
+ }
+
+ if (to_x < 0) /* to left out of bounds */
+ {
+ w += to_x;
+ from_x -= to_x;
+ to_x = 0;
+ clipped = 1;
+ }
+
+ if (to_y < 0) /* to top out of bounds */
+ {
+ h += to_y;
+ from_y -= to_y;
+ to_y = 0;
+ clipped = 1;
+ }
+
+ if (from_x + w > paste_w) /* from right out of bounds */
+ {
+ w = paste_w - from_x;
+ clipped = 1;
+ }
+
+ if (from_y + h > paste_h) /* from bottom out of bounds */
+ {
+ h = paste_h - from_y;
+ clipped = 1;
+ }
+
+ if (to_x + w > base_w) /* to right out of bounds */
+ {
+ w = base_w - to_x;
+ clipped = 1;
+ }
+
+ if (to_y + h > base_h) /* to bottom out of bounds */
+ {
+ h = base_h - to_y;
+ clipped = 1;
+ }
+
+
+ if (clipped && verbose_p)
+ {
+ fprintf (stderr, "clipped from: %dx%d %d,%d %d,%d\n",
+ ow, oh, ofx, ofy, otx, oty);
+ fprintf (stderr, "clipped to: %dx%d %d,%d %d,%d\n",
+ w, h, from_x, from_y, to_x, to_y);
+ }
+ }
+
+ if (bevel_pct > 0)
+ bevel_image (&paste_pb, bevel_pct,
+ from_x, from_y, w, h);
+
+ if (opacity == 1.0 && bevel_pct == 0)
+ gdk_pixbuf_copy_area (paste_pb,
+ from_x, from_y, w, h,
+ base_pb,
+ to_x, to_y);
+ else
+ {
+ from_x++; /* gdk_pixbuf_composite gets confused about the bevel: */
+ from_y++; /* it leaves a stripe on the top and left if we try to */
+ to_x++; /* start at 0,0, so pull it right and down by 1 pixel. */
+ to_y++; /* (problem seen in gtk2-2.4.14-2.fc3) */
+ w--;
+ h--;
+
+ if (w > 0 && h > 0)
+ gdk_pixbuf_composite (paste_pb, base_pb,
+ to_x, to_y, w, h,
+ to_x - from_x, to_y - from_y,
+ 1.0, 1.0,
+ GDK_INTERP_HYPER,
+ opacity * 255);
+ }
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pasted %dx%d from %d,%d to %d,%d\n",
+ progname, paste_w, paste_h, from_x, from_y, to_x, to_y);
+
+ g_object_unref (paste_pb);
+ write_pixbuf (base_pb, base_file);
+ g_object_unref (base_pb);
+}
+
+
+static guint32
+parse_color (const char *s)
+{
+ static const char hex[128] =
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
+ 0, 10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+ unsigned char r=0, g=0, b=0;
+
+ if (!strcasecmp (s, "black")) ;
+ else if (!strcasecmp (s, "white")) r = g = b = 0xFF;
+ else if (!strcasecmp (s, "red")) r = 0xFF;
+ else if (!strcasecmp (s, "green")) g = 0xFF;
+ else if (!strcasecmp (s, "blue")) b = 0xFF;
+ else
+ {
+ if (*s != '#' || strlen(s) != 7)
+ {
+ fprintf (stderr, "%s: unparsable color: \"%s\"\n", progname, s);
+ exit (1);
+ }
+ s++;
+ r = (hex[(int) s[0]] << 4) | hex[(int) s[1]], s += 2;
+ g = (hex[(int) s[0]] << 4) | hex[(int) s[1]], s += 2;
+ b = (hex[(int) s[0]] << 4) | hex[(int) s[1]], s += 2;
+ }
+
+ return (r << 16) | (g << 8) | b;
+}
+
+
+static void
+create (const char *color,
+ int w, int h,
+ const char *file)
+{
+ int i;
+ GdkPixbuf *pb;
+ guint32 pixel = parse_color (color);
+ unsigned char *bytes = malloc (w * h * 3);
+ if (!bytes) abort();
+ for (i = 0; i < w * h * 3; i += 3)
+ {
+ bytes[i] = 0xFF & (pixel >> 16);
+ bytes[i+1] = 0xFF & (pixel >> 8);
+ bytes[i+2] = 0xFF & (pixel);
+ }
+
+ pb = gdk_pixbuf_new_from_data (bytes, GDK_COLORSPACE_RGB,
+ FALSE, 8, /* alpha, sample size */
+ w, h,
+ w * 3, /* rowstride */
+ NULL, 0);
+ if (!pb) abort();
+ write_pixbuf (pb, file);
+ g_object_unref (pb);
+ free (bytes);
+}
+
+
+static void
+write_pixbuf (GdkPixbuf *pb, const char *file)
+{
+ int jpeg_quality = 85;
+
+ int w = gdk_pixbuf_get_width (pb);
+ int h = gdk_pixbuf_get_height (pb);
+ guchar *data = gdk_pixbuf_get_pixels (pb);
+ int ww = gdk_pixbuf_get_rowstride (pb);
+ int channels = gdk_pixbuf_get_n_channels (pb);
+
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ FILE *out;
+
+ if (channels != 3)
+ {
+ fprintf (stderr, "%s: %d channels?\n", progname, channels);
+ exit (1);
+ }
+
+ cinfo.err = jpeg_std_error (&jerr);
+ jpeg_create_compress (&cinfo);
+
+ out = fopen (file, "wb");
+ if (!out)
+ {
+ char buf[255];
+ sprintf (buf, "%.100s: %.100s", progname, file);
+ perror (buf);
+ exit (1);
+ }
+ else if (verbose_p)
+ fprintf (stderr, "%s: writing %s...", progname, file);
+
+ jpeg_stdio_dest (&cinfo, out);
+
+ cinfo.image_width = w;
+ cinfo.image_height = h;
+ cinfo.input_components = channels;
+ cinfo.in_color_space = JCS_RGB;
+
+ jpeg_set_defaults (&cinfo);
+ jpeg_simple_progression (&cinfo);
+ jpeg_set_quality (&cinfo, jpeg_quality, TRUE);
+
+ jpeg_start_compress (&cinfo, TRUE);
+ add_jpeg_comment (&cinfo);
+
+ {
+ guchar *d = data;
+ guchar *end = d + (ww * h);
+ while (d < end)
+ {
+ jpeg_write_scanlines (&cinfo, &d, 1);
+ d += ww;
+ }
+ }
+
+ jpeg_finish_compress (&cinfo);
+ jpeg_destroy_compress (&cinfo);
+
+ if (verbose_p)
+ {
+ struct stat st;
+ fflush (out);
+ if (fstat (fileno (out), &st))
+ {
+ char buf[255];
+ sprintf (buf, "%.100s: %.100s", progname, file);
+ perror (buf);
+ exit (1);
+ }
+ fprintf (stderr, " %luK\n", ((unsigned long) st.st_size + 1023) / 1024);
+ }
+
+ fclose (out);
+}
+
+
+static void
+add_jpeg_comment (struct jpeg_compress_struct *cinfo)
+{
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ const char fmt[] =
+ "\r\n"
+ " Generated by WebCollage: Exterminate All Rational Thought. \r\n"
+ " Copyright (c) 1999-%Y by Jamie Zawinski <jwz@jwz.org> \r\n"
+ "\r\n"
+ " https://www.jwz.org/webcollage/ \r\n"
+ "\r\n"
+ " This is what the web looked like on %d %b %Y at %I:%M:%S %p %Z. \r\n"
+ "\r\n";
+ char comment[sizeof(fmt) + 100];
+ strftime (comment, sizeof(comment)-1, fmt, tm);
+ jpeg_write_marker (cinfo, JPEG_COM,
+ (unsigned char *) comment,
+ strlen (comment));
+}
+
+
+static void
+usage (void)
+{
+ fprintf (stderr,
+ "\nusage: %s [-v] paste-file base-file\n"
+ "\t from-scale opacity\n"
+ "\t from-x from-y to-x to-y w h\n"
+ "\n"
+ "\t Pastes paste-file into base-file.\n"
+ "\t base-file will be overwritten (with JPEG data.)\n"
+ "\t scaling is applied first: coordinates apply to scaled image.\n"
+ "\n"
+ "usage: %s [-v] color width height output-file\n"
+ "\t Creates a new image of a solid color.\n\n",
+ progname, progname);
+ exit (1);
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ char *paste_file, *base_file, *s, dummy;
+ double from_scale, opacity;
+ int from_x, from_y, to_x, to_y, w, h, bevel_pct;
+
+ i = 0;
+ progname = argv[i++];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
+
+ if (!strcmp(argv[i], "-v"))
+ verbose_p++, i++;
+
+ if (argc == 11 || argc == 12)
+ {
+ paste_file = argv[i++];
+ base_file = argv[i++];
+
+ if (*paste_file == '-') usage();
+ if (*base_file == '-') usage();
+
+ s = argv[i++];
+ if (1 != sscanf (s, " %lf %c", &from_scale, &dummy)) usage();
+ if (from_scale <= 0 || from_scale > 100) usage();
+
+ s = argv[i++];
+ if (1 != sscanf (s, " %lf %c", &opacity, &dummy)) usage();
+ if (opacity <= 0 || opacity > 1) usage();
+
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &from_x, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &from_y, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &to_x, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &to_y, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &w, &dummy)) usage();
+ s = argv[i]; if (1 != sscanf (s, " %d %c", &h, &dummy)) usage();
+
+ bevel_pct = 10; /* #### */
+
+ if (w < 0) usage();
+ if (h < 0) usage();
+
+# ifdef HAVE_GTK2
+# if !GLIB_CHECK_VERSION(2, 36 ,0)
+ g_type_init ();
+# endif
+# endif /* HAVE_GTK2 */
+
+ paste (paste_file, base_file,
+ from_scale, opacity, bevel_pct,
+ from_x, from_y, to_x, to_y,
+ w, h);
+ }
+ else if (argc == 4 || argc == 5)
+ {
+ char *color = argv[i++];
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &w, &dummy)) usage();
+ s = argv[i++]; if (1 != sscanf (s, " %d %c", &h, &dummy)) usage();
+ paste_file = argv[i++];
+ if (*paste_file == '-') usage();
+
+ create (color, w, h, paste_file);
+ }
+ else
+ {
+ usage();
+ }
+
+ exit (0);
+}
+
+#endif /* HAVE_GDK_PIXBUF && HAVE_JPEGLIB -- whole file */
diff --git a/hacks/webcollage.man b/hacks/webcollage.man
new file mode 100644
index 0000000..82bf5d7
--- /dev/null
+++ b/hacks/webcollage.man
@@ -0,0 +1,247 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
+.SH NAME
+webcollage - decorate the screen with random images from the web
+.SH SYNOPSIS
+.B webcollage
+[\-display \fIhost:display.screen\fP]
+[\-root]
+[\-window\-id \fIid\fP]
+[\-verbose]
+[\-timeout \fIsecs\fP]
+[\-delay \fIsecs\fP]
+[\-background \fIbg\fP]
+[\-no-output]
+[\-urls-only]
+[\-imagemap \fIfilename-base\fP]
+[\-size \fIWxH\fP]
+[\-opacity \fIratio\fP]
+[\-filter \fIcommand\fP]
+[\-filter2 \fIcommand\fP]
+[\-http\-proxy host[:port]]
+[\-dictionary \fIdictionary-file\fP]
+[\-driftnet [\fIcmd\fP]]
+[\-directory \fIdir\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIwebcollage\fP program pulls random image off of the World Wide Web
+and scatters them on the root window. One satisfied customer described it
+as "a nonstop pop culture brainbath." This program finds its images by
+doing random web searches, and extracting images from the returned pages.
+
+\fIwebcollage\fP is written in
+.BR perl (1)
+and requires Perl 5.
+
+It will be an order of magnitude faster if you also have
+the \fIwebcollage-helper\fP program installed (a GDK/JPEG image
+compositor), but \fIwebcollage\fP works without it as well.
+
+\fIwebcollage\fP can be used in conjunction with the
+.BR driftnet (1)
+program (the Unix equivalent of EtherPEG) to snoop images from traffic
+on your local subnet, instead of getting images from search engines.
+.SH OPTIONS
+.I webcollage
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window. This option is mandatory, if output is being
+produced: drawing to a window other than the root window is not yet
+supported.
+
+Images are placed on the root window by using one of the
+.BR xscreensaver-getimage (1),
+.BR chbg (1),
+.BR xv (1),
+.BR xli (1),
+or
+.BR xloadimage (1)
+programs (whichever is available.)
+.TP 8
+.B \-window\-id \fIid\fP
+Draw to the indicated window instead; this only works if the
+.BR xscreensaver-getimage (1)
+program is installed.
+.TP 8
+.B \-verbose \fRor\fP \-v
+Print diagnostics to stderr. Multiple \fI-v\fP switches increase the
+amount of output. \fI-v\fP will print out the URLs of the images,
+and where they were placed; \fI-vv\fP will print out any warnings,
+and all URLs being loaded; \fI-vvv\fP will print information on
+what URLs were rejected; and so on.
+.TP 8
+.B \-timeout \fIseconds\fP
+How long to wait for a URL to complete before giving up on it and
+moving on to the next one.
+Default 30 seconds.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to sleep between images. Default 2 seconds. (Remember that
+this program probably spends a lot of time waiting for the network.)
+.TP 8
+.B \-background \fIcolor-or-ppm\fP
+What to use for the background onto which images are pasted. This may be
+a color name, a hexadecimal RGB specification in the form '#rrggbb', or
+the name of a PPM file.
+.TP 8
+.B \-size \fIWxH\fP
+Normally, the output image will be made to be the size of the
+screen (or target window.) This lets you specify the desired size.
+.TP 8
+.B \-opacity \fIratio\fP
+How transparently to paste the images together, with 0.0 meaning
+"completely transparent" and 1.0 meaning "opaque." Default 0.85.
+A value of around 0.3 will produce an interestingly blurry image
+after a while.
+.TP 8
+.B \-no-output
+If this option is specified, then no composite output image will be
+generated. This is only useful when used in conjunction
+with \fB\-verbose\fP.
+.TP 8
+.B \-urls-only
+If this option is specified, then no composite output image will be
+generated: instead, a list of image URLs will be printed on stdout.
+.TP 8
+.B \-imagemap \fIfilename-base\fP
+If this option is specified, then instead of writing an image to the
+root window, two files will be created: "\fIbase\fP.html" and "\fIbase\fP.jpg".
+The JPEG will be the collage; the HTML file will include that image, and
+an image-map making the sub-images be linked to the pages on which they
+were found (just like \fIhttps://www.jwz.org/webcollage/\fP.)
+.TP 8
+.B \-filter \fIcommand\fP
+Filter all source images through this command. The command must take
+a PPM file on stdin, and write a new PPM file to stdout. One good
+choice for a filter would be:
+.EX
+webcollage -root -filter 'vidwhacker -stdin -stdout'
+.EE
+.TP 8
+.B \-filter2 \fIcommand\fP
+Filter the \fIcomposite\fP image through this command. The \fI-filter\fP
+option applies to the sub-images; the \fI-filter2\fP applies to the
+final, full-screen image.
+.TP 8
+.B \-http\-proxy \fIhost:port\fP
+If you must go through a proxy to connect to the web, you can specify it
+with this option, or with the \fB$http_proxy\fP or \fB$HTTP_PROXY\fP
+environment variables.
+.TP 8
+.B \-dictionary \fIfile\fP
+Webcollage normally looks at the system's default spell-check dictionary
+to generate words to feed into the search engines. You can specify an
+alternate dictionary with this option.
+
+Note that by default, webcollage searches for images using several
+different methods, not all of which involve dictionary words, so
+using a "topical" dictionary file will not, in itself, be as effective
+as you might be hoping.
+.TP 8
+.B \-driftnet \fI[ args ]\fP
+.BR driftnet (1)
+is a program that snoops your local ethernet for packets that look
+like they might be image files. It can be used in conjunction
+with \fIwebcollage\fP to generate a collage of what other people on
+your network are looking at, instead of a search-engine collage.
+If you have \fIdriftnet\fP installed on your $PATH, just use
+the \fI\-driftnet\fP option. You can also specify the location
+of the program like this:
+.EX
+-driftnet /path/to/driftnet
+.EE
+or, you can provide extra arguments like this:
+.EX
+-driftnet '/path/to/driftnet -extra -args'
+.EE
+Driftnet version 0.1.5 or later is required. Note that
+the \fIdriftnet\fP program requires root access, so you'll have
+to make \fIdriftnet\fP be setuid-root for this to work.
+Please exercise caution.
+.TP 8
+.B \-directory \fIdir\fP
+Instead of searching the web for images, use the contents of
+the given directory.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load (MacOS only).
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.TP 8
+.B http_proxy\fR or \fPHTTP_PROXY
+to get the default HTTP proxy host and port.
+.SH FILES AND URLS
+.I /usr/dict/words,
+.I /usr/share/lib/dict/words,\fP
+or
+.I /usr/share/dict/words
+to find the random words to feed to certain search engines.
+
+ \fIhttp://www.altavista.com/image/randomlink\fP,
+ \fIhttp://random.yahoo.com/fast/ryl\fP,
+ \fIhttp://www.livejournal.com/stats/latest-img.bml\fP, and
+ \fIhttp://www.google.com/\fP
+to find random web pages.
+.SH BOOBIES
+The Internet being what it is, absolutely anything might show up in the
+collage including -- quite possibly -- pornography, or even nudity.
+.SH BUGS
+Animating GIFs are not supported: only the first frame will be used.
+.SH UPGRADES
+The latest version of webcollage can be found as a part of
+xscreensaver, at
+.B https://www.jwz.org/xscreensaver/,
+or on the WebCollage page at
+.B https://www.jwz.org/webcollage/.
+
+DriftNet:
+.B http://www.ex-parrot.com/~chris/driftnet/
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xli (1),
+.BR xv (1),
+.BR xloadimage (1),
+.BR ppmmake (1),
+.BR giftopnm (1),
+.BR pnmpaste (1),
+.BR pnmscale (1),
+.BR djpeg (1),
+.BR cjpeg (1),
+.BR xdpyinfo (1),
+.BR perl (1),
+.BR vidwhacker (MANSUFFIX),
+.BR dadadodo (1),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 1998-2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 24-May-1998.
diff --git a/hacks/whirlwindwarp.c b/hacks/whirlwindwarp.c
new file mode 100644
index 0000000..3525e49
--- /dev/null
+++ b/hacks/whirlwindwarp.c
@@ -0,0 +1,506 @@
+/* xscreensaver, Copyright (c) 2000 Paul "Joey" Clark <pclark@bris.ac.uk>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * 19971004: Johannes Keukelaar <johannes@nada.kth.se>: Use helix screen
+ * eraser.
+ */
+
+/* WhirlwindWarp: moving stars. Ported from QBasic by Joey.
+ Version 1.3. Smooth with pretty colours.
+
+ This code adapted from original program by jwz/jk above.
+ Freely distrubtable. Please keep this tag with
+ this code, and add your own if you contribute.
+ I would be delighted to hear if have made use of this code.
+ If you find this code useful or have any queries, please
+ contact me: pclark@cs.bris.ac.uk / joeyclark@usa.net
+ Paul "Joey" Clark, hacking for humanity, Feb 99
+ www.cs.bris.ac.uk/~pclark | www.changetheworld.org.uk */
+
+/* 15/May/05: Added colour rotation, limit on max FPS, scaling size dots, and smoother drivers.
+ 4/Mar/01: Star colours are cycled when new colour can not be allocated.
+ 4/Mar/01: Stars are plotted as squares with size relative to screen.
+ 28/Nov/00: Submitted to xscreensaver as "whirlwindwarp".
+ 10/Oct/00: Ported to xscreensaver as "twinkle".
+ 19/Feb/98: Meters and interaction added for Ivor's birthday "stars11f".
+ 11/Aug/97: Original QBasic program. */
+
+#include <math.h>
+
+#include "screenhack.h"
+#include "erase.h"
+#include "hsv.h"
+
+/* Maximum number of points, maximum tail length, and the number of forcefields/effects (hard-coded) */
+#define maxps 1000
+#define maxts 50
+#define fs 16
+/* TODO: change ps and ts arrays into pointers, for dynamic allocation at runtime. */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC draw_gc, erase_gc;
+ unsigned int default_fg_pixel;
+
+ int scrwid,scrhei;
+ int starsize;
+
+ float cx[maxps]; /* Current x,y of stars in realspace */
+ float cy[maxps];
+ int tx[maxps*maxts]; /* Previous x,y plots in pixelspace for removal later */
+ int ty[maxps*maxts];
+ char *name[fs]; /* The force fields and their parameters */
+
+ int fon[fs]; /* Is field on or off? */
+ float var[fs]; /* Current parameter */
+ float op[fs]; /* Optimum (central/mean) value */
+ float acc[fs];
+ float vel[fs];
+
+ int ps; /* Number of points and tail length */
+ int ts;
+
+ Bool meters;
+
+ int initted;
+ XWindowAttributes xgwa;
+ int got_color;
+ XColor color[maxps]; /* The colour assigned to each star */
+ XColor bgcolor;
+ int p,f,nt, sx,sy, resets,lastresets,cnt;
+ int colsavailable;
+ int hue;
+
+ struct timeval lastframe;
+};
+
+
+static void *
+whirlwindwarp_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ Colormap cmap;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->ps=500;
+ st->ts=5;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ cmap = st->xgwa.colormap;
+ gcv.foreground = st->default_fg_pixel = get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+
+ st->ps = get_integer_resource (st->dpy, "points", "Integer");
+ st->ts = get_integer_resource (st->dpy, "tails", "Integer");
+ st->meters = get_boolean_resource (st->dpy, "meters", "Show meters");
+ if (st->ps > maxps) st->ps = maxps;
+ if (st->ts > maxts) st->ts = maxts;
+
+ return st;
+}
+
+static float myrnd(void)
+{ /* between -1.0 (inclusive) and +1.0 (exclusive) */
+ return 2.0*((float)((random()%10000000)/10000000.0)-0.5);
+}
+
+#if 0
+static float mysgn(float x)
+{
+ return ( x < 0 ? -1 :
+ x > 0 ? +1 :
+ 0 );
+}
+#endif
+
+static void stars_newp(struct state *st, int pp)
+{
+ st->cx[pp]=myrnd();
+ st->cy[pp]=myrnd();
+}
+
+/* Adjust a variable var about optimum op,
+ with damp = dampening about op
+ force = force of random perturbation */
+/* float stars_perturb(float var,float op,float damp,float force) {
+ return op+damp*(var-op)+force*myrnd()/4.0;
+ }*/
+#define stars_perturb(var,op,damp,force) \
+ ( (op) + (damp)*((var)-(op)) + (force)*myrnd()/4.0 )
+
+/* Get pixel coordinates of a star */
+static int stars_scrpos_x(struct state *st, int pp)
+{
+ return st->scrwid*(st->cx[pp]+1.0)/2.0;
+}
+
+static int stars_scrpos_y(struct state *st, int pp)
+{
+ return st->scrhei*(st->cy[pp]+1.0)/2.0;
+}
+
+/* Draw a meter of a forcefield's parameter */
+static void stars_draw_meter(struct state *st, int ff)
+{
+ int x,y,w,h;
+ x=st->scrwid/2;
+ y=ff*10;
+ w=(st->var[ff]-st->op[ff])*st->scrwid*4;
+ h=7;
+ if (w<0) {
+ w=-w;
+ x=x-w;
+ }
+ if (st->fon[ff])
+ XFillRectangle(st->dpy,st->window,st->draw_gc,x,y,w,h);
+ /* else
+ XDrawRectangle(dpy,window,draw_gc,x,y,w,h); */
+}
+
+/* Move a star according to acting forcefields */
+static void stars_move(struct state *st, int pp)
+{
+ float nx,ny;
+ float x=st->cx[pp];
+ float y=st->cy[pp];
+
+ /* In theory all these if checks are unneccessary,
+ since each forcefield effect should do nothing when its var = op.
+ But the if's are good for efficiency because this function
+ is called once for every point.
+
+ Squirge towards edges (makes a leaf shape, previously split the screen in 4 but now only 1 :)
+ These ones must go first, to avoid x+1.0 < 0
+ */
+ if (st->fon[6]) {
+ /* x = mysgn(x) * pow(fabs(x),var[6]);
+ y = mysgn(y) * pow(fabs(y),var[6]);*/
+ x = -1.0 + 2.0*pow((x + 1.0)/2.0,st->var[6]);
+ }
+ if (st->fon[7]) {
+ y = -1.0 + 2.0*pow((y + 1.0)/2.0,st->var[7]);
+ }
+
+ /* Warping in/out */
+ if (st->fon[1]) {
+ x = x * st->var[1]; y = y * st->var[1];
+ }
+
+ /* Rotation */
+ if (st->fon[2]) {
+ nx=x*cos(1.1*st->var[2])+y*sin(1.1*st->var[2]);
+ ny=-x*sin(1.1*st->var[2])+y*cos(1.1*st->var[2]);
+ x=nx;
+ y=ny;
+ }
+
+ /* Asymptotes (looks like a plane with a horizon; equivalent to 1D warp) */
+ if (st->fon[3]) { /* Horizontal asymptote */
+ y=y*st->var[3];
+ }
+ if (st->fon[4]) { /* Vertical asymptote */
+ x=x+st->var[4]*x; /* this is the same maths as the last, but with op=0 */
+ }
+ if (st->fon[5]) { /* Vertical asymptote at right of screen */
+ x=(x-1.0)*st->var[5]+1.0;
+ }
+
+ /* Splitting (whirlwind effect): */
+ #define num_splits ( 2 + (int) (fabs(st->var[0]) * 1000) )
+ /* #define thru ( (float)(pp%num_splits)/(float)(num_splits-1) ) */
+ #define thru ( (float)((int)(num_splits*(float)(pp)/(float)(st->ps)))/(float)(num_splits-1) )
+ if (st->fon[8]) {
+ x=x+0.5*st->var[8]*(-1.0+2.0*thru);
+ }
+ if (st->fon[9]) {
+ y=y+0.5*st->var[9]*(-1.0+2.0*thru);
+ }
+
+ /* Waves */
+ if (st->fon[10]) {
+ y = y + 0.4*st->var[10]*sin(300.0*st->var[12]*x + 600.0*st->var[11]);
+ }
+ if (st->fon[13]) {
+ x = x + 0.4*st->var[13]*sin(300.0*st->var[15]*y + 600.0*st->var[14]);
+ }
+
+ st->cx[pp]=x;
+ st->cy[pp]=y;
+}
+
+/* Turns a forcefield on, and ensures its vars are suitable. */
+static void turn_on_field(struct state *st, int ff)
+{
+ if (!st->fon[ff]) {
+ /* acc[ff]=0.0; */
+ st->acc[ff]=0.02 * myrnd();
+ st->vel[ff]=0.0;
+ st->var[ff]=st->op[ff];
+ }
+ st->fon[ff] = 1;
+ if (ff == 10) {
+ turn_on_field(st, 11);
+ turn_on_field(st, 12);
+ }
+ if (ff == 13) {
+ turn_on_field(st, 14);
+ turn_on_field(st, 15);
+ }
+}
+
+static unsigned long
+whirlwindwarp_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ /* time_t lastframe = time((time_t) 0); */
+
+ if (!st->initted) {
+ st->initted = 1;
+
+ XClearWindow (st->dpy, st->window);
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->scrwid = st->xgwa.width;
+ st->scrhei = st->xgwa.height;
+
+ st->starsize=st->scrhei/480;
+ if (st->starsize<=0)
+ st->starsize=1;
+
+ /* Setup colours */
+ hsv_to_rgb (0.0, 0.0, 0.0, &st->bgcolor.red, &st->bgcolor.green, &st->bgcolor.blue);
+ st->got_color = XAllocColor (st->dpy, st->xgwa.colormap, &st->bgcolor);
+ st->colsavailable=0;
+ for (st->p=0;st->p<st->ps;st->p++) {
+ if (!mono_p)
+ hsv_to_rgb (random()%360, .6+.4*myrnd(), .6+.4*myrnd(), &st->color[st->p].red, &st->color[st->p].green, &st->color[st->p].blue);
+ /* hsv_to_rgb (random()%360, 1.0, 1.0, &color[p].red, &color[p].green, &color[p].blue); for stronger colours! */
+ if ((!mono_p) && (st->got_color = XAllocColor (st->dpy, st->xgwa.colormap, &st->color[st->p]))) {
+ st->colsavailable=st->p;
+ } else {
+ if (st->colsavailable>0) /* assign colours from those already allocated */
+ st->color[st->p]=st->color[ st->p % st->colsavailable ];
+ else
+ st->color[st->p].pixel=st->default_fg_pixel;
+ }
+ }
+
+ /* Set up central (optimal) points for each different forcefield */
+ st->op[1] = 1; st->name[1] = "Warp";
+ st->op[2] = 0; st->name[2] = "Rotation";
+ st->op[3] = 1; st->name[3] = "Horizontal asymptote";
+ st->op[4] = 0; st->name[4] = "Vertical asymptote";
+ st->op[5] = 1; st->name[5] = "Vertical asymptote right";
+ st->op[6] = 1; st->name[6] = "Squirge x";
+ st->op[7] = 1; st->name[7] = "Squirge y";
+ st->op[0] = 0; st->name[0] = "Split number (inactive)";
+ st->op[8] = 0; st->name[8] = "Split velocity x";
+ st->op[9] = 0; st->name[9] = "Split velocity y";
+ st->op[10] = 0; st->name[10] = "Horizontal wave amplitude";
+ st->op[11] = myrnd()*3.141; st->name[11] = "Horizontal wave phase (inactive)";
+ st->op[12] = 0.01; st->name[12] = "Horizontal wave frequency (inactive)";
+ st->op[13] = 0; st->name[13] = "Vertical wave amplitude";
+ st->op[14] = myrnd()*3.141; st->name[14] = "Vertical wave phase (inactive)";
+ st->op[15] = 0.01; st->name[15] = "Vertical wave frequency (inactive)";
+
+ /* Initialise parameters to optimum, all off */
+ for (st->f=0;st->f<fs;st->f++) {
+ st->var[st->f]=st->op[st->f];
+ st->fon[st->f]=( myrnd()>0.5 ? 1 : 0 );
+ st->acc[st->f]=0.02 * myrnd();
+ st->vel[st->f]=0;
+ }
+
+ /* Initialise stars */
+ for (st->p=0;st->p<st->ps;st->p++)
+ stars_newp(st, st->p);
+
+ /* tx[nt],ty[nt] remember earlier screen plots (tails of stars)
+ which are deleted when nt comes round again */
+ st->nt = 0;
+ st->resets = 0;
+
+ st->hue = 180 + 180*myrnd();
+
+ gettimeofday(&st->lastframe, NULL);
+
+ }
+
+
+ if (myrnd()>0.75) {
+ /* Change one of the allocated colours to something near the current hue. */
+ /* By changing a random colour, we sometimes get a tight colour spread, sometime a diverse one. */
+ int pp = st->colsavailable * (0.5+myrnd()/2);
+ hsv_to_rgb (st->hue, .6+.4*myrnd(), .6+.4*myrnd(), &st->color[pp].red, &st->color[pp].green, &st->color[pp].blue);
+ if ((!mono_p) && (st->got_color = XAllocColor (st->dpy, st->xgwa.colormap, &st->color[pp]))) {
+ }
+ st->hue = st->hue + 0.5 + myrnd()*9.0;
+ if (st->hue<0) st->hue+=360;
+ if (st->hue>=360) st->hue-=360;
+ }
+
+ /* Move current points */
+ st->lastresets=st->resets;
+ st->resets=0;
+ for (st->p=0;st->p<st->ps;st->p++) {
+ /* Erase old */
+ XSetForeground (st->dpy, st->draw_gc, st->bgcolor.pixel);
+ /* XDrawPoint(dpy,window,draw_gc,tx[nt],ty[nt]); */
+ XFillRectangle(st->dpy,st->window,st->draw_gc,st->tx[st->nt],st->ty[st->nt],st->starsize,st->starsize);
+
+ /* Move */
+ stars_move(st, st->p);
+ /* If moved off screen, create a new one */
+ if (st->cx[st->p]<=-0.9999 || st->cx[st->p]>=+0.9999 ||
+ st->cy[st->p]<=-0.9999 || st->cy[st->p]>=+0.9999 ||
+ fabs(st->cx[st->p])<.0001 || fabs(st->cy[st->p])<.0001) {
+ stars_newp(st, st->p);
+ st->resets++;
+ } else if (myrnd()>0.99) /* Reset at random */
+ stars_newp(st, st->p);
+
+ /* Draw point */
+ st->sx=stars_scrpos_x(st, st->p);
+ st->sy=stars_scrpos_y(st, st->p);
+ XSetForeground (st->dpy, st->draw_gc, st->color[st->p].pixel);
+ /* XDrawPoint(dpy,window,draw_gc,sx,sy); */
+ XFillRectangle(st->dpy,st->window,st->draw_gc,st->sx,st->sy,st->starsize,st->starsize);
+
+ /* Remember it for removal later */
+ st->tx[st->nt]=st->sx;
+ st->ty[st->nt]=st->sy;
+ st->nt=(st->nt+1)%(st->ps*st->ts);
+ }
+
+ /* Adjust force fields */
+ st->cnt=0;
+ for (st->f=0;st->f<fs;st->f++) {
+
+ if (st->meters) { /* Remove meter from display */
+ XSetForeground(st->dpy, st->draw_gc, st->bgcolor.pixel);
+ stars_draw_meter(st,st->f);
+ }
+
+ /* Adjust forcefield's parameter */
+ if (st->fon[st->f]) {
+ /* This configuration produces var[f]s usually below 0.01 */
+ st->acc[st->f]=stars_perturb(st->acc[st->f],0,0.98,0.005);
+ st->vel[st->f]=stars_perturb(st->vel[st->f]+0.03*st->acc[st->f],0,0.995,0.0);
+ st->var[st->f]=st->op[st->f]+(st->var[st->f]-st->op[st->f])*0.9995+0.001*st->vel[st->f];
+ }
+ /* fprintf(stderr,"f=%i fon=%i acc=%f vel=%f var=%f\n",f,fon[f],acc[f],vel[f],var[f]); */
+
+ /* Decide whether to turn this forcefield on or off. */
+ /* prob_on makes the "splitting" effects less likely than the rest */
+ #define prob_on ( st->f==8 || st->f==9 ? 0.999975 : 0.9999 )
+ if ( st->fon[st->f]==0 && myrnd()>prob_on ) {
+ turn_on_field(st, st->f);
+ } else if ( st->fon[st->f]!=0 && myrnd()>0.99 && fabs(st->var[st->f]-st->op[st->f])<0.0005 && fabs(st->vel[st->f])<0.005 /* && fabs(acc[f])<0.01 */ ) {
+ /* We only turn it off if it has gently returned to its optimal (as opposed to rapidly passing through it). */
+ st->fon[st->f] = 0;
+ }
+
+ if (st->meters) { /* Redraw the meter */
+ XSetForeground(st->dpy, st->draw_gc, st->color[st->f].pixel);
+ stars_draw_meter(st,st->f);
+ }
+
+ if (st->fon[st->f])
+ st->cnt++;
+ }
+
+ /* Ensure at least three forcefields are on.
+ * BUG: Picking randomly might not be enough since 0,11,12,14 and 15 do nothing!
+ * But then what's wrong with a rare gentle twinkle?!
+ */
+ if (st->cnt<3) {
+ st->f=random() % fs;
+ turn_on_field(st, st->f);
+ }
+
+ if (st->meters) {
+ XSetForeground(st->dpy, st->draw_gc, st->bgcolor.pixel);
+ XDrawRectangle(st->dpy,st->window,st->draw_gc,0,0,st->lastresets*5,3);
+ XSetForeground(st->dpy, st->draw_gc, st->default_fg_pixel);
+ XDrawRectangle(st->dpy,st->window,st->draw_gc,0,0,st->resets*5,3);
+ }
+
+ /* Cap frames per second; do not go above specified fps: */
+ {
+ unsigned long this_delay = 0;
+ int maxfps = 200;
+ long utimeperframe = 1000000/maxfps;
+ struct timeval now;
+ long timediff;
+ gettimeofday(&now, NULL);
+ /* timediff = now.tv_sec*1000000 + now.tv_usec - st->lastframe.tv_sec*1000000 - st->lastframe.tv_usec; */
+ timediff = (now.tv_sec - st->lastframe.tv_sec) * 1000000 + now.tv_usec - st->lastframe.tv_usec;
+ if (timediff < utimeperframe) {
+ /* fprintf(stderr,"sleeping for %i\n",utimeperframe-timediff); */
+ this_delay = (utimeperframe-timediff);
+ }
+ st->lastframe = now;
+
+ return this_delay;
+ }
+}
+
+
+static void
+whirlwindwarp_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->scrwid = w;
+ st->scrhei = h;
+}
+
+static Bool
+whirlwindwarp_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+whirlwindwarp_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *whirlwindwarp_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*points: 400",
+ "*tails: 8",
+ "*meters: false",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec whirlwindwarp_options [] = {
+ { "-points", ".points", XrmoptionSepArg, 0 },
+ { "-tails", ".tails", XrmoptionSepArg, 0 },
+ { "-meters", ".meters", XrmoptionNoArg, "true" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("WhirlWindWarp", whirlwindwarp)
diff --git a/hacks/whirlwindwarp.man b/hacks/whirlwindwarp.man
new file mode 100644
index 0000000..8cd054f
--- /dev/null
+++ b/hacks/whirlwindwarp.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+whirlwindwarp - crazy moving stars
+.SH SYNOPSIS
+.B whirlwindwarp
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIinteger\fP] [\-tails \fIinteger\fP]
+[\-fps]
+.SH DESCRIPTION
+\fIwhirlwindwarp\fP plots stars moving according to various forcefields
+(simple 2D equations).
+.SH WARNING!
+This screensaver may be \fIdangerous\fP for your eyes.
+Please don't watch it for too long!
+.SH OPTIONS
+.I whirlwindwarp
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-points \fIinteger\fP
+The number of stars plotted (default 400).
+.TP 8
+.B \-tails \fIinteger\fP
+The length of the tail of each star (default 8).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright (c) Paul "Joey" Clark. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any
+purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Paul "Joey" Clark <pclark@cs.bris.ac.uk> 10-Oct-00
diff --git a/hacks/whirlygig.c b/hacks/whirlygig.c
new file mode 100644
index 0000000..22c7ddd
--- /dev/null
+++ b/hacks/whirlygig.c
@@ -0,0 +1,733 @@
+/* Whirlygig -- an experiment in X programming
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * When I was in trigonometry class as a kid, I remember being fascinated
+ * by the beauty of the shapes one receives when playing with sine waves
+ * Here is a little experiment to show that beauty is simple
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define NCOLORS 100
+#define FULL_CYCLE 429496729
+#define START_ARC 0
+#define END_ARC 23040
+
+struct info {
+/* Bool writable; / * Is the screen writable */
+ double xspeed; /* A factor to modify the horizontal movement */
+ double yspeed; /* A factor to modify vertical movement */
+ double xamplitude;
+ double yamplitude;
+ int whirlies; /* How many whirlies per line do you want? */
+ int nlines; /* How many lines of whirlies do you want? */
+ int half_width; /* 1/2 the width of the screen */
+ int half_height;
+ int speed;
+ int trail;
+ int color_modifier;
+ double xoffset;
+ double yoffset;
+ double offset_period;
+ Bool wrap;
+};
+
+enum object_mode {
+ spin_mode, funky_mode, circle_mode, linear_mode, test_mode, fun_mode, innie_mode, lissajous_mode
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ XGCValues gcv; /* The structure to hold the GC data */
+ XWindowAttributes xgwa; /* A structure to hold window data */
+ Pixmap b, ba; /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ Bool dbeclear_p;
+ XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ GC fgc, bgc;
+ int screen;
+ Bool dbuf;
+
+ unsigned long int current_time; /* The global int telling the current time */
+ unsigned long int start_time;
+ struct info *info;
+ char *xmode_str, *ymode_str; /* holds the current mode for x and y computation */
+
+ /* pos is the current position x,y -- last_x contains one cell of
+ every x coordinate for every position of every whirly in every
+ line up to 100 whirlies in 100 lines -- lasy_y and last_size hold
+ the same information for y and size respectively */
+
+ int pos[2], last_x[100][100], last_y[100][100], last_size[100][100];
+ int current_color;
+ Bool wrap;
+ int xmode, ymode;
+ double modifier; /* for innie */
+
+ XColor colors[NCOLORS];
+ int ncolors;
+ int explaining;
+};
+
+static void draw_explain_string(struct state *, int, int, Display *, Window, GC);
+static void spin(struct state *, unsigned long int, struct info *, int *, int);
+static void funky(struct state *, unsigned long int, struct info *, int *, int);
+static void circle(struct state *, unsigned long int, struct info *, int *, int);
+static void fun(struct state *, unsigned long int, struct info *, int *, int);
+static void linear(struct state *, unsigned long int, struct info *, int *, int);
+static void lissajous(struct state *, unsigned long int, struct info *, int *, int);
+static void test(struct state *, unsigned long int, struct info *, int *, int);
+static void innie(struct state *, unsigned long int, struct info *, int *, int, double);
+
+
+
+static const char spin_explanation[] =
+"Spin mode is a simple sin/cos with every argument modified";
+
+static const char funky_explanation[] =
+"Funky mode is me goofing off.";
+
+static const char circle_explanation[] =
+"Circle mode graphs the x and y positions as you trace the edge of a circle over time.";
+
+static const char linear_explanation[] =
+"Linear mode draws a straight line";
+
+static const char test_explanation[] =
+"Test mode is a mode that I play around with ideas in.";
+
+static const char fun_explanation[] =
+"Fun mode is the coolest.";
+
+static const char innie_explanation[] =
+"Innie mode does something or other. Looks cool, though.";
+
+static const char lissajous_explanation[] =
+"Lissajous mode draws a slightly modified lissajous curve";
+
+static void
+draw_explain_string(struct state *st, int mode, int offset, Display *dpy, Window window, GC fgc)
+{
+ switch(mode) {
+ case spin_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) spin_explanation, strlen(spin_explanation));
+ break;
+ case funky_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) funky_explanation, strlen(funky_explanation));
+ break;
+ case circle_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) circle_explanation, strlen(circle_explanation));
+ break;
+ case linear_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) linear_explanation, strlen(linear_explanation));
+ break;
+ case test_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) test_explanation, strlen(test_explanation));
+ break;
+ case fun_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) fun_explanation, strlen(fun_explanation));
+ break;
+ case innie_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) innie_explanation, strlen(innie_explanation));
+ break;
+ case lissajous_mode:
+ XDrawString(st->dpy, st->window, st->fgc, 50, offset,
+ (char*) lissajous_explanation, strlen(linear_explanation));
+ }
+}
+
+static void
+funky(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ double new_time = ((the_time % 360 ) / 180.0) * M_PI;
+ if (index == 0) {
+ double time_modifier = cos(new_time / 180.0);
+ double the_cos = cos((new_time * (double)st->info->xspeed) + (time_modifier * 80.0));
+ double dist_mod_x = cos(new_time) * (st->info->half_width - 50);
+ st->pos[index]= st->info->xamplitude * (the_cos * dist_mod_x) + st->info->half_width;
+ }
+ else {
+ double new_time = ((the_time % 360 ) / 180.0) * M_PI;
+ double time_modifier = sin(new_time / 180.0);
+ double the_sin = sin((new_time * (double)st->info->yspeed) + (time_modifier * 80.0));
+ double dist_mod_y = sin(new_time) * (st->info->half_height - 50);
+ st->pos[index] = st->info->yamplitude * (the_sin * dist_mod_y) + st->info->half_height;
+ }
+}
+
+static void
+innie(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index, double modifier)
+{
+ double frequency = 2000000.0 + (st->modifier * cos(((double)the_time / 100.0)));
+ double arg = (double)the_time / frequency;
+ double amplitude = 200.0 * cos(arg);
+ double fun = 150.0 * cos((double)the_time / 2000.0);
+ int vert_mod, horiz_mod;
+ if (index == 0) {
+ horiz_mod = (int)(fun * cos((double)the_time / 100.0)) + st->info->half_width;
+ st->pos[index] = (amplitude * cos((double)the_time / 100.0 * st->info->xspeed)) + horiz_mod;
+ }
+ else {
+ vert_mod = (int)(fun * sin((double)the_time / 100.0)) + st->info->half_height;
+ st->pos[index] = (amplitude * sin((double)the_time / 100.0 * st->info->yspeed)) + vert_mod;
+ }
+}
+
+static void
+lissajous(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ /* This is a pretty standard lissajous curve
+ x = a sin(nt + c)
+ y = b sin(t)
+ The n and c modifiers are cyclic as well, however... */
+ int result;
+ double time = (double)the_time / 100.0;
+ double fun = 15.0 * cos((double)the_time / 800.0);
+ double weird = cos((time / 1100000.0) / 1000.0);
+
+ if (index == 0) {
+ result = st->info->xamplitude * 200.0 * sin((weird * time) + fun) + st->info->half_width;
+ }
+ else {
+ result = st->info->yamplitude * 200.0 * sin(time) + st->info->half_height;
+ }
+ st->pos[index] = result;
+}
+
+static void
+circle(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ int result;
+ if (index == 0) {
+ result = st->info->xamplitude * (cos((double)the_time / 100.0 * st->info->xspeed) * (st->info->half_width / 2)) + st->info->half_width;
+ }
+ else {
+ result = st->info->yamplitude * (sin((double)the_time / 100.0 * st->info->yspeed) * (st->info->half_height / 2)) + st->info->half_height;
+ }
+ st->pos[index] = result;
+}
+
+#if 0
+static void
+mod(unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ int amplitude;
+ int max = st->info->half_width;
+ if ((the_time % (max * 2)) < max)
+ amplitude = max - ((the_time % (max * 2)) - max);
+ else
+ amplitude = the_time % (max * 2);
+ amplitude = amplitude - max;
+}
+#endif
+
+static void
+spin(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ double funky = (((the_time % 360) * 1.0) / 180.0) * M_PI;
+ if (index ==0) {
+ double the_cos = cos((double)the_time / (180.0 * st->info->xspeed));
+ double dist_mod_x = cos((double)funky) * (st->info->half_width - 50);
+ st->pos[index] = st->info->xamplitude * (the_cos * dist_mod_x) + st->info->half_width;
+ }
+ else {
+ double the_sin = sin((double)the_time / (180.0 * st->info->yspeed));
+ double dist_mod_y = sin((double)funky) * (st->info->half_height - 50);
+ st->pos[index] = st->info->yamplitude * (the_sin * dist_mod_y) + st->info->half_height;
+ }
+}
+
+static void
+fun(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ int amplitude;
+ int max = st->info->half_width;
+ if ((the_time % (max * 2)) < max)
+ amplitude = max - ((the_time % (max * 2)) - max);
+ else
+ amplitude = the_time % (max * 2);
+ amplitude = amplitude - max;
+ if (index ==0) {
+ st->pos[index] = (amplitude * cos((double)the_time / 100.0 * st->info->xspeed)) + st->info->half_width;
+ }
+ else {
+ st->pos[index] = (amplitude * sin((double)the_time / 100.0 * st->info->yspeed)) + st->info->half_height;
+ }
+}
+
+static void
+linear(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ if (index == 0) /* Calculate for the x axis */
+ st->pos[index] = ((the_time / 2) % (st->info->half_width * 2));
+ else
+ st->pos[index] = ((the_time / 2) % (st->info->half_height * 2));
+}
+
+static void
+test(struct state *st, unsigned long int the_time, struct info *info, int pos[], int index)
+{
+ if (index == 0) {
+ st->pos[index] = st->info->xamplitude * (cos((double)the_time / 100.0 * st->info->xspeed) * (st->info->half_width / 2)) + st->info->half_width;
+ }
+ else {
+ st->pos[index] = st->info->yamplitude * (sin((double)the_time / 100.0 * st->info->yspeed) * (st->info->half_height / 2)) + st->info->half_height;
+ }
+}
+
+static int preen(int current, int max) {
+ if (current > max)
+ current=current-max;
+ if (current < 0)
+ current=current+max;
+ return(current);
+}
+
+#if 0
+static void
+smoothen(struct state *st, int x, int lastx, int y, int lasty, int size, int last_color, XColor *colors, Display *dpy, Window window, GC bgc, int screen, struct info *info)
+{
+ double xdistance = abs((double)x-(double)lastx);
+ double ydistance = abs((double)y-(double)lasty);
+ double distance = sqrt(((xdistance * xdistance) + (ydistance * ydistance)) );
+ double slope = (((double)y-(double)lasty) / ((double)x-(double)lastx));
+ printf("Starting smoothen with values: %f, %f, %f, %f\n", xdistance, ydistance, distance, slope);
+ if (distance > 2.0) {
+ int newx = (int)((xdistance / distance) * slope);
+ int newy = (int)((ydistance / distance) * slope);
+ if (! st->info->trail) {
+ XSetForeground(st->dpy, st->bgc, BlackPixel(st->dpy, st->screen));
+ XFillArc(st->dpy, st->window, st->bgc, lastx, lasty, size, size, START_ARC, END_ARC);
+ }
+ XSetForeground(st->dpy, st->bgc, st->colors[last_color].pixel);
+ XFillArc(st->dpy, st->window, st->bgc, newx, newy, size, size, START_ARC, END_ARC);
+ smoothen(st, newx, x, newy, y, size, last_color, st->colors, st->dpy, st->window, st->bgc, st->screen, st->info);
+ }
+}
+#endif
+
+
+static void *
+whirlygig_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+
+ st->ncolors = NCOLORS;
+
+ st->dbuf = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ st->start_time = st->current_time;
+ st->info = (struct info *)malloc(sizeof(struct info));
+
+ st->screen = DefaultScreen(st->dpy);
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ if (st->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (get_boolean_resource(st->dpy,"useDBE","Boolean"))
+ {
+ st->dbeclear_p = get_boolean_resource (st->dpy, "useDBEClear",
+ "Boolean");
+ if (st->dbeclear_p)
+ st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeBackground);
+ else
+ st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+ st->backb = st->b;
+ }
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!st->b)
+ {
+ st->ba = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = st->window;
+ }
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap, "foreground", "Foreground");
+ st->fgc = XCreateGC (st->dpy, st->b, GCForeground, &st->gcv);
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap, "background", "Background");
+ st->bgc = XCreateGC (st->dpy, st->b, GCForeground, &st->gcv);
+
+#ifdef HAVE_JWXYZ /* #### should turn off double-buffering instead */
+ jwxyz_XSetAntiAliasing (dpy, st->fgc, False);
+ jwxyz_XSetAntiAliasing (dpy, st->bgc, False);
+#endif
+
+ {
+ Bool writable_p = False;
+ make_uniform_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ True, &writable_p, True);
+ }
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->bgc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ /* info is a structure holding all the random pieces of information I may want to
+ pass to my baby functions -- much of it I may never use, but it is nice to
+ have around just in case I want it to make a funky function funkier */
+/* info->writable = get_boolean_resource (dpy, "cycle", "Boolean"); */
+ st->info->xspeed = get_float_resource(st->dpy, "xspeed" , "Float");
+ st->info->yspeed = get_float_resource(st->dpy, "yspeed" , "Float");
+ st->info->xamplitude = get_float_resource(st->dpy, "xamplitude", "Float");
+ st->info->yamplitude = get_float_resource(st->dpy, "yamplitude", "Float");
+ st->info->offset_period = get_float_resource(st->dpy, "offset_period", "Float");
+ st->info->whirlies = get_integer_resource(st->dpy, "whirlies", "Integer");
+ st->info->nlines = get_integer_resource(st->dpy, "nlines", "Integer");
+ st->info->half_width = st->xgwa.width / 2;
+ st->info->half_height = st->xgwa.height / 2;
+ st->info->speed = get_integer_resource(st->dpy, "speed" , "Integer");
+ st->info->trail = get_boolean_resource(st->dpy, "trail", "Integer");
+ st->info->color_modifier = get_integer_resource(st->dpy, "color_modifier", "Integer");
+ st->info->xoffset = get_float_resource(st->dpy, "xoffset", "Float");
+ st->info->yoffset = get_float_resource(st->dpy, "yoffset", "Float");
+ st->xmode_str = get_string_resource(st->dpy, "xmode", "Mode");
+ st->ymode_str = get_string_resource(st->dpy, "ymode", "Mode");
+ st->wrap = get_boolean_resource(st->dpy, "wrap", "Boolean");
+ st->modifier = 3000.0 + frand(1500.0);
+ if (! st->xmode_str) st->xmode = spin_mode;
+ else if (! strcmp (st->xmode_str, "spin")) st->xmode = spin_mode;
+ else if (! strcmp (st->xmode_str, "funky")) st->xmode = funky_mode;
+ else if (! strcmp (st->xmode_str, "circle")) st->xmode = circle_mode;
+ else if (! strcmp (st->xmode_str, "linear")) st->xmode = linear_mode;
+ else if (! strcmp (st->xmode_str, "test")) st->xmode = test_mode;
+ else if (! strcmp (st->xmode_str, "fun")) st->xmode = fun_mode;
+ else if (! strcmp (st->xmode_str, "innie")) st->xmode = innie_mode;
+ else if (! strcmp (st->xmode_str, "lissajous")) st->xmode = lissajous_mode;
+ else {
+ st->xmode = random() % (int) lissajous_mode;
+ }
+ if (! st->ymode_str) st->ymode = spin_mode;
+ else if (! strcmp (st->ymode_str, "spin")) st->ymode = spin_mode;
+ else if (! strcmp (st->ymode_str, "funky")) st->ymode = funky_mode;
+ else if (! strcmp (st->ymode_str, "circle")) st->ymode = circle_mode;
+ else if (! strcmp (st->ymode_str, "linear")) st->ymode = linear_mode;
+ else if (! strcmp (st->ymode_str, "test")) st->ymode = test_mode;
+ else if (! strcmp (st->ymode_str, "fun")) st->ymode = fun_mode;
+ else if (! strcmp (st->ymode_str, "innie")) st->ymode = innie_mode;
+ else if (! strcmp (st->ymode_str, "lissajous")) st->ymode = lissajous_mode;
+ else {
+ st->ymode = random() % (int) lissajous_mode;
+ }
+
+ if (get_integer_resource(st->dpy, "start_time", "Integer") == -1)
+ st->current_time = (unsigned long int)(random());
+ else
+ st->current_time = get_integer_resource(st->dpy, "start_time", "Integer");
+ if (st->info->whirlies == -1)
+ st->info->whirlies = 1 + (random() % 15);
+ if (st->info->nlines == -1)
+ st->info->nlines = 1 + (random() % 5);
+ if (st->info->color_modifier == -1)
+ st->info->color_modifier = 1 + (random() % 25);
+ if (get_boolean_resource(st->dpy, "explain", "Integer"))
+ st->explaining = 1;
+ st->current_color = 1 + (random() % NCOLORS);
+
+ return st;
+}
+
+static unsigned long
+whirlygig_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int wcount; /* wcount is a counter incremented for every whirly take note of
+ internal_time before you mess with it */
+ int change_time = 4000;
+
+ if (st->explaining == 1) {
+ XClearWindow (st->dpy, st->window);
+ draw_explain_string(st, st->xmode, st->info->half_height-100,
+ st->dpy, st->window, st->fgc);
+ st->explaining++;
+ return 3000000;
+ } else if (st->explaining == 2) {
+ XClearWindow (st->dpy, st->window);
+ st->explaining = 0;
+ }
+
+ if (! strcmp (st->xmode_str, "change") && ! strcmp (st->ymode_str, "change")) {
+ if ((st->current_time - st->start_time) > change_time) {
+ st->start_time = st->current_time;
+ st->xmode = 1 + (random() % 4);
+ st->ymode = 1 + (random() % 4);
+ }
+ }
+ else if (! strcmp (st->xmode_str, "change")) {
+ if ((st->current_time - st->start_time) > change_time) {
+ st->start_time = st->current_time;
+ st->xmode = 1 + (random() % 4);
+ }
+ }
+ else if (! strcmp (st->ymode_str, "change")) {
+ if ((st->current_time - st->start_time) > change_time) {
+ st->start_time = st->current_time;
+ st->ymode = 1 + (random() % 3);
+ printf("Changing ymode to %d\n", st->ymode);
+ }
+ }
+ if (++st->current_color >= NCOLORS)
+ st->current_color = 0;
+ for (wcount = 0; wcount < st->info->whirlies; wcount++) {
+ int lcount; /* lcount is a counter for every line -- take note of the offsets changing */
+ int internal_time = 0;
+ int color_offset = (st->current_color + (st->info->color_modifier * wcount)) % NCOLORS;
+ if (st->current_time != 0)
+ /* I want the distance between whirlies to increase more each whirly */
+ internal_time = st->current_time + (10 * wcount) + (wcount * wcount);
+ switch (st->xmode) {
+ /* All these functions expect an int time, the struct info,
+ a pointer to an array of positions, and the index that the
+ the function will fill of the array */
+ case spin_mode:
+ spin(st, internal_time, st->info, st->pos, 0);
+ break;
+ case funky_mode:
+ funky(st, internal_time, st->info, st->pos, 0);
+ break;
+ case circle_mode:
+ circle(st, internal_time, st->info, st->pos, 0);
+ break;
+ case linear_mode:
+ linear(st, internal_time, st->info, st->pos, 0);
+ break;
+ case fun_mode:
+ fun(st, internal_time, st->info, st->pos, 0);
+ break;
+ case test_mode:
+ test(st, internal_time, st->info, st->pos, 0);
+ break;
+ case innie_mode:
+ innie(st, internal_time, st->info, st->pos, 0, st->modifier);
+ break;
+ case lissajous_mode:
+ lissajous(st, internal_time, st->info, st->pos, 0);
+ break;
+ default:
+ spin(st, internal_time, st->info, st->pos, 0);
+ break;
+ } /* End of the switch for the x position*/
+ switch (st->ymode) {
+ case spin_mode:
+ spin(st, internal_time, st->info, st->pos, 1);
+ break;
+ case funky_mode:
+ funky(st, internal_time, st->info, st->pos, 1);
+ break;
+ case circle_mode:
+ circle(st, internal_time, st->info, st->pos, 1);
+ break;
+ case linear_mode:
+ linear(st, internal_time, st->info, st->pos, 1);
+ break;
+ case fun_mode:
+ fun(st, internal_time, st->info, st->pos, 1);
+ break;
+ case test_mode:
+ test(st, internal_time, st->info, st->pos, 1);
+ break;
+ case innie_mode:
+ innie(st, internal_time, st->info, st->pos, 1, st->modifier);
+ break;
+ case lissajous_mode:
+ lissajous(st, internal_time, st->info, st->pos, 1);
+ break;
+ default:
+ spin(st, internal_time, st->info, st->pos, 1);
+ break;
+ } /* End of the switch for the y position*/
+ for (lcount = 0; lcount < st->info->nlines; lcount++) {
+ double arg = (double)((internal_time * st->info->offset_period) / 90.0);
+ double line_offset = 20.0 * (double)lcount * sin(arg);
+ int size;
+ size = (int)(15.0 + 5.0 * sin((double)internal_time / 180.0));
+ /* First delete the old circle... */
+ if (!st->info->trail
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ && ( !st->dbeclear_p || !st->backb)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ ) {
+ XSetForeground(st->dpy, st->bgc, BlackPixel(st->dpy, st->screen));
+ XFillArc(st->dpy, st->b, st->bgc, st->last_x[wcount][lcount], st->last_y[wcount][lcount], st->last_size[wcount][lcount], st->last_size[wcount][lcount], START_ARC, END_ARC);
+ }
+ /* Now, lets draw in the new circle */
+ { /* Starting new scope for local x_pos and y_pos */
+ int xpos, ypos;
+ if (st->wrap) {
+ xpos = preen((int)(st->info->xoffset*line_offset)+st->pos[0], st->info->half_width * 2);
+ ypos = preen((int)(st->info->yoffset*line_offset)+st->pos[1], st->info->half_height * 2);
+ }
+ else {
+ xpos = (int)(st->info->xoffset*line_offset)+st->pos[0];
+ ypos = (int)(st->info->yoffset*line_offset)+st->pos[1];
+ }
+ if (st->start_time == st->current_time) {
+ /* smoothen should move from one mode to another prettily... */
+
+ /* Note: smoothen has not been modified to take the double
+ buffering code into account, and needs to be hacked on
+ before uncommenting.
+ */
+ /*
+ smoothen(xpos, last_x[wcount][lcount], ypos, last_y[wcount][lcount], size, color_offset, colors, dpy, window, bgc, screen, info);
+ */
+ }
+ st->last_x[wcount][lcount] = xpos;
+ st->last_y[wcount][lcount] = ypos;
+ st->last_size[wcount][lcount] = size;
+ XSetForeground(st->dpy, st->bgc, st->colors[color_offset].pixel);
+ XFillArc(st->dpy, st->b, st->bgc, xpos, ypos, size, size, START_ARC, END_ARC);
+ } /* End of my temporary scope for xpos and ypos */
+ } /* End of the for each line in nlines */
+ } /* End of the for each whirly in whirlies */
+
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = (st->dbeclear_p ? XdbeBackground : XdbeUndefined);
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, st->window, st->bgc, 0, 0,
+ st->xgwa.width, st->xgwa.height, 0, 0);
+ }
+
+ if (st->current_time == FULL_CYCLE)
+ st->current_time = 1;
+ else
+ st->current_time = st->current_time + st->info->speed;
+
+ return 10000;
+}
+
+
+static void
+whirlygig_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+whirlygig_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+whirlygig_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *whirlygig_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*xspeed: 1.0",
+ "*yspeed: 1.0",
+ "*xamplitude: 1.0",
+ "*yamplitude: 1.0",
+ "*whirlies: -1",
+ "*nlines: -1",
+ "*xmode: change",
+ "*ymode: change",
+ "*speed: 1",
+ "*trail: false",
+ "*color_modifier: -1",
+ "*start_time: -1",
+ "*explain: False",
+ "*xoffset: 1.0",
+ "*yoffset: 1.0",
+ "*offset_period: 1",
+ "*wrap: False",
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBEClear: True",
+ "*useDBE: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ 0
+};
+
+static XrmOptionDescRec whirlygig_options [] = {
+ { "-xspeed", ".xspeed", XrmoptionSepArg, 0 },
+ /* xspeed is a modifier of the argument to cos -- changing it thus
+ changes the frequency of cos */
+ { "-yspeed", ".yspeed", XrmoptionSepArg, 0 },
+ /* Similiarly, yspeed changes the frequency of sin */
+ { "-xamplitude", ".xamplitude", XrmoptionSepArg, 0 },
+ /* A factor by which to increase/decrease the amplitude of the sin */
+ { "-yamplitude", ".yamplitude", XrmoptionSepArg, 0 },
+ /* A factor by which to increase/decrease the amplitude of the cos */
+ { "-whirlies", ".whirlies",XrmoptionSepArg, 0 },
+ /* whirlies defines the number of circles to draw per line */
+ { "-nlines", ".nlines",XrmoptionSepArg, 0 },
+ /* nlines is the number of lines of whirlies to draw */
+ { "-xmode", ".xmode", XrmoptionSepArg, 0 },
+ /* There are a few different modes that I have written -- each mode
+ is in theory a different experiment with the possible modifiers to sin/cos */
+ { "-ymode", ".ymode", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ /* This will modify how often it should draw, changing it will probably suck */
+ { "-trail", ".trail", XrmoptionNoArg, "True" },
+ /* Control whether or not you want the old circles to be erased */
+ { "-color_modifier", ".color_modifier", XrmoptionSepArg, 0 },
+ /* How many colors away from the current should the next whirly be? */
+ { "-start_time", ".start_time", XrmoptionSepArg, 0 },
+ /* Specify exactly at what time to start graphing... */
+ { "-xoffset", ".xoffset", XrmoptionSepArg, 0 },
+ /* Tell the whirlies to be offset by this factor of a sin */
+ { "-yoffset", ".yoffset", XrmoptionSepArg, 0 },
+ /* Tell the whirlies to be offset by this factor of a cos */
+ { "-offset_period", ".offset_period", XrmoptionSepArg, 0 },
+ /* Change the period of an offset cycle */
+ { "-explain", ".explain", XrmoptionNoArg, "True" },
+ /* Specify whether or not to print an explanation of the function used. */
+ { "-wrap", ".wrap", XrmoptionNoArg, "True" },
+ { "-no-wrap", ".wrap", XrmoptionNoArg, "False" },
+ /* Specify if you want whirlies which are out of the boundary of the screen to be
+ wrapped around to the other side */
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Whirlygig", whirlygig)
diff --git a/hacks/whirlygig.man b/hacks/whirlygig.man
new file mode 100644
index 0000000..9a60ef3
--- /dev/null
+++ b/hacks/whirlygig.man
@@ -0,0 +1,137 @@
+.TH XScreenSaver 1 "31-Mar-01" "X Version 11"
+.SH NAME
+whirlygig -- zooming chains of sinusoidal spots
+.SH SYNOPSIS
+.B whirlygig
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-mono]
+[\-install] [\-noinstall] [\-visual arg] [\-window-id arg]
+[\-xspeed arg] [\-yspeed arg] [\-whirlies arg] [\-nlines arg]
+[\-xmode arg] [\-ymode arg] [\-speed arg] [\-trail 1|0]
+[\-color_modifier arg] [\-start_time arg] [\-explain 1|0]
+[\-wrap 1|0] [\-db] [\-no-db]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIwhirlygig\fP program draws a series of circles on your screen.
+They then move about in a cyclic pattern
+.SH OPTIONS
+.I whirlygig
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-xspeed \fIspeed\fP
+Specify how fast the dots should cycle horizontally.
+Try out values from .01 to 4000. Defaults to 1.0.
+.TP 8
+.B \-yspeed \fIspeed\fP
+Specify how fast the dots should cycle vertically.
+Try out values from .01 to 4000. Defaults to 1.0.
+.TP 8
+.B \-xamplitude \fIfactor\fP
+Specify the horizontal amplitude.
+Try out values from .01 to 10. Defaults to 1.0.
+.TP 8
+.B \-yamplitude \fIfactor\fP
+Specify the horizontal amplitude.
+Try out values from .01 to 10. Defaults to 1.0.
+.TP 8
+.B \-whirlies \fIa number\fP
+Specify how many whirlies you want (per line). Defaults
+to a random number.
+.TP 8
+.B \-nlines \fInumber of lines\fP
+Specify how many lines of whirlies you want. Defaults to a
+random number.
+.TP 8
+.B \-xmode \fImode\fP
+.TP 8
+.B \-ymode \fImode\fP
+Specify which mode to use for calculating the x and y positions of the
+whirlies. Can be any of spin, funky, circle, linear, test, fun, innie
+or lissajous. Defaults to 'change' mode, which randomly selects a new
+mode for x and y every now an then. Unrecognized options default to spin.
+.TP 8
+.B \-explain
+Prints some strings to the window explaining what the initially
+selected modes are, before displaying the whirlies. Off by default.
+.TP 8
+.B \-trail \fI1 or 0\fP
+Trail mode fails to erase the whirlies as they move, so they leave a
+multicoloured trail behind. Doesn't work if the doubled buffered mode
+is using the X server's double buffer extension, and the useDBEclear
+resource is true (which it is by default).
+.TP 8
+.B \-speed \fIint\fP
+Specifies how fast to cycle through the internal time. Values 1,2 and
+3 look ok, up to 10 is not too bad, but beyond ends up
+flickery. Adjust xspeed and yspeed instead.
+.TP 8
+.B \-start_time \fIint\fP
+Where in the internal time cycle to start. Ranges from 1 to 429496729,
+Defaults to a random value.
+.TP 8
+.B \-xoffset \fIfactor\fP
+Tell the whirlies to be offset by this factor of a sin.
+Defaults to 1.0
+.TP 8
+.B \-yoffset \fIfactor\fP
+Tell the whirlies to be offset by this factor of a cos.
+Defaults to 1.0
+.TP 8
+.B \-offset_period \fIfactor\fP
+Change the period of an offset cycle
+Defaults to 1
+.TP 8
+.B \-color_modifier \fIint\fP
+How many colors away from the current should the next whirly be?
+.TP 8
+.B \-wrap \fI1|0\fP
+Causes whirlies that fall off the edge of the screen to wrap over to
+the other end of the screen. Otherwise they disappear and new ones
+to materialize on the other side of the screen. The difference is
+subtle, but it is different. Try it. On by default.
+.TP 8
+.B \-db
+.TP 8
+.B \-no-db
+Use double buffering to reduce flicker. This uses the double buffering
+extension if your X server supports it, otherwise it draws to it's own
+pixmap buffer and copies that to the window, which works almost as
+well. If the resource 'useDBEClear' is true, whirlies are not
+individually erased, so the -trail option won't work, and running
+multiple instances on the root window will flicker.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Ashton Trey Belew. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ashton Trey Belew <trey@veggie.wesleyan.edu>, 31-Mar-01
diff --git a/hacks/worm.c b/hacks/worm.c
new file mode 100644
index 0000000..452ae12
--- /dev/null
+++ b/hacks/worm.c
@@ -0,0 +1,433 @@
+
+/* -*- Mode: C; tab-width: 4 -*- */
+/* worm --- draw wiggly worms */
+
+#if 0
+static const char sccsid[] = "@(#)worm.c 4.04 97/07/28 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 03-Sep-96: fixed bug in allocation of space for worms, added 3d support
+ * Henrik Theiling <theiling@coli.uni-sb.de>
+ * 27-Sep-95: put back malloc
+ * 23-Sep-93: got rid of "rint". (David Bagley)
+ * 27-Sep-91: got rid of all malloc calls since there were no calls to free().
+ * 25-Sep-91: Integrated into X11R5 contrib xlock.
+ *
+ * Adapted from a concept in the Dec 87 issue of Scientific American p. 142.
+ *
+ * SunView version: Brad Taylor <brad@sun.com>
+ * X11 version: Dave Lemke <lemke@ncd.com>
+ * xlock version: Boris Putanec <bp@cs.brown.edu>
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 17000 \n" \
+ "*count: -20 \n" \
+ "*cycles: 10 \n" \
+ "*size: -3 \n" \
+ "*ncolors: 150 \n" \
+ "*use3d: False \n" \
+ "*delta3d: 1.5 \n" \
+ "*right3d: red \n" \
+ "*left3d: blue \n" \
+ "*both3d: magenta \n" \
+ "*none3d: black \n" \
+ "*fpsSolid: true \n" \
+
+# define SMOOTH_COLORS
+# define release_worm 0
+# define reshape_worm 0
+# define worm_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ENTRYPOINT ModeSpecOpt worm_opts =
+{0, NULL, 0, NULL, NULL};
+
+#define MINSIZE 1
+
+#define SEGMENTS 36
+#define MINWORMS 1
+
+#define MAXZ 750
+#define MINZ 100
+#define SCREENZ 200
+#define GETZDIFF(z) (MI_DELTA3D(mi)*20.0*(1.0-(SCREENZ)/((float)(z)+MINZ)))
+#define IRINT(x) ((int)(((x)>0.0)?(x)+0.5:(x)-0.5))
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+typedef struct {
+ XPoint *circ;
+ int *diffcirc;
+ int dir, dir2;
+ int tail;
+ int x, y, z;
+ int redrawing, redrawpos;
+} wormstuff;
+
+typedef struct {
+ int xsize, ysize, zsize;
+ int wormlength;
+ int nc;
+ int nw;
+ int circsize;
+ wormstuff *worm;
+ XRectangle *rects; /* [NUMCOLORS * batchcount/NUMCOLORS+1] */
+ int maxsize;
+ int *size;
+ unsigned int chromo;
+} wormstruct;
+
+static float sintab[SEGMENTS];
+static float costab[SEGMENTS];
+static int init_table = 0;
+
+static wormstruct *worms = NULL;
+
+static void
+worm_doit(ModeInfo * mi, int which, unsigned long color)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ wormstruct *wp = &worms[MI_SCREEN(mi)];
+ wormstuff *ws = &wp->worm[which];
+ int x, y, z;
+ int diff;
+
+ ws->tail++;
+ if (ws->tail == wp->wormlength)
+ ws->tail = 0;
+
+ x = ws->circ[ws->tail].x;
+ y = ws->circ[ws->tail].y;
+
+ if (MI_WIN_IS_USE3D(mi)) {
+ diff = ws->diffcirc[ws->tail];
+ if (MI_WIN_IS_INSTALL(mi)) {
+ XSetForeground(display, gc, MI_NONE_COLOR(mi));
+ XFillRectangle(display, window, gc, x - diff, y,
+ wp->circsize, wp->circsize);
+ XFillRectangle(display, window, gc, x + diff, y,
+ wp->circsize, wp->circsize);
+ } else {
+ XClearArea(display, window, x - diff, y,
+ wp->circsize, wp->circsize, False);
+ XClearArea(display, window, x + diff, y,
+ wp->circsize, wp->circsize, False);
+ }
+ } else
+ XClearArea(display, window, x, y, wp->circsize, wp->circsize, False);
+
+ if (LRAND() & 1)
+ ws->dir = (ws->dir + 1) % SEGMENTS;
+ else
+ ws->dir = (ws->dir + SEGMENTS - 1) % SEGMENTS;
+
+ x = (ws->x + IRINT((float) wp->circsize * costab[ws->dir]) +
+ wp->xsize) % wp->xsize;
+ y = (ws->y + IRINT((float) wp->circsize * sintab[ws->dir]) +
+ wp->ysize) % wp->ysize;
+
+ ws->circ[ws->tail].x = x;
+ ws->circ[ws->tail].y = y;
+ ws->x = x;
+ ws->y = y;
+
+ if (MI_WIN_IS_USE3D(mi)) {
+ if (LRAND() & 1)
+ ws->dir2 = (ws->dir2 + 1) % SEGMENTS;
+ else
+ ws->dir2 = (ws->dir2 + SEGMENTS - 1) % SEGMENTS;
+ /* for the z-axis the wrap-around looks bad, so worms should just turn around. */
+ z = (int) (ws->z + wp->circsize * sintab[ws->dir2]);
+ if (z < 0 || z >= wp->zsize)
+ z = (int) (ws->z - wp->circsize * sintab[ws->dir2]);
+
+ diff = (int) (GETZDIFF(z) + 0.5); /* ROUND */
+ ws->diffcirc[ws->tail] = diff;
+
+ ws->z = z;
+
+ /* right eye */
+ color = 0;
+ wp->rects[color * wp->maxsize + wp->size[color]].x = x + diff;
+ wp->rects[color * wp->maxsize + wp->size[color]].y = y;
+ wp->size[color]++;
+
+ /* left eye */
+ color = 1;
+ wp->rects[color * wp->maxsize + wp->size[color]].x = x - diff;
+ wp->rects[color * wp->maxsize + wp->size[color]].y = y;
+ wp->size[color]++;
+
+#if 0
+ if (ws->redrawing) { /* Too hard for now */
+ int j;
+
+ for (j = 0; j < REDRAWSTEP; j++) {
+ int k = (ws->tail - ws->redrawpos + wp->wormlength)
+ % wp->wormlength;
+
+ color = 0;
+ wp->rects[color * wp->maxsize + wp->size[color]].x =
+ ws->circ[k].x + ws->diffcirc[k];
+ wp->rects[color * wp->maxsize + wp->size[color]].y =
+ ws->circ[k].y;
+ wp->size[color]++;
+
+ color = 1;
+ wp->rects[color * wp->maxsize + wp->size[color]].x =
+ ws->circ[k].x - ws->diffcirc[k];
+ wp->rects[color * wp->maxsize + wp->size[color]].y =
+ ws->circ[k].y;
+ wp->size[color]++;
+
+ if (++(ws->redrawpos) >= wp->wormlength) {
+ ws->redrawing = 0;
+ break;
+ }
+ }
+ }
+#endif
+
+ } else {
+
+ wp->rects[color * wp->maxsize + wp->size[color]].x = x;
+ wp->rects[color * wp->maxsize + wp->size[color]].y = y;
+ wp->size[color]++;
+ if (ws->redrawing) {
+ int j;
+
+ ws->redrawpos++;
+ /* Compensates for the changed ws->tail
+ since the last callback. */
+
+ for (j = 0; j < REDRAWSTEP; j++) {
+ int k = (ws->tail - ws->redrawpos + wp->wormlength)
+ % wp->wormlength;
+
+ wp->rects[color * wp->maxsize + wp->size[color]].x = ws->circ[k].x;
+ wp->rects[color * wp->maxsize + wp->size[color]].y = ws->circ[k].y;
+ wp->size[color]++;
+
+ if (++(ws->redrawpos) >= wp->wormlength) {
+ ws->redrawing = 0;
+ break;
+ }
+ }
+ }
+ }
+}
+
+ENTRYPOINT void
+free_worm(ModeInfo * mi)
+{
+ wormstruct *wp;
+ int wn;
+
+ if(!worms)
+ return;
+ wp = &worms[MI_SCREEN(mi)];
+
+ if (wp->worm) {
+ for (wn = 0; wn < wp->nw; wn++) {
+ if (wp->worm[wn].circ)
+ (void) free((void *) wp->worm[wn].circ);
+ if (wp->worm[wn].diffcirc)
+ (void) free((void *) wp->worm[wn].diffcirc);
+ }
+ (void) free((void *) wp->worm);
+ wp->worm = NULL;
+ }
+ if (wp->rects) {
+ (void) free((void *) wp->rects);
+ wp->rects = NULL;
+ }
+ if (wp->size) {
+ (void) free((void *) wp->size);
+ wp->size = NULL;
+ }
+}
+
+ENTRYPOINT void
+init_worm (ModeInfo * mi)
+{
+ wormstruct *wp;
+ int size = MI_SIZE(mi);
+ int i, j;
+
+ MI_INIT (mi, worms);
+ wp = &worms[MI_SCREEN(mi)];
+ if (MI_NPIXELS(mi) <= 2 || MI_WIN_IS_USE3D(mi))
+ wp->nc = 2;
+ else
+ wp->nc = MI_NPIXELS(mi);
+ if (wp->nc > NUMCOLORS)
+ wp->nc = NUMCOLORS;
+
+ free_worm(mi);
+ wp->nw = MI_BATCHCOUNT(mi);
+ if (wp->nw < -MINWORMS)
+ wp->nw = NRAND(-wp->nw - MINWORMS + 1) + MINWORMS;
+ else if (wp->nw < MINWORMS)
+ wp->nw = MINWORMS;
+ if (!wp->worm)
+ wp->worm = (wormstuff *) malloc(wp->nw * sizeof (wormstuff));
+
+ if (!wp->size)
+ wp->size = (int *) malloc(NUMCOLORS * sizeof (int));
+
+ wp->maxsize = (REDRAWSTEP + 1) * wp->nw; /* / wp->nc + 1; */
+ if (!wp->rects)
+ wp->rects =
+ (XRectangle *) malloc(wp->maxsize * NUMCOLORS * sizeof (XRectangle));
+
+
+ if (!init_table) {
+ init_table = 1;
+ for (i = 0; i < SEGMENTS; i++) {
+ sintab[i] = SINF(i * 2.0 * M_PI / SEGMENTS);
+ costab[i] = COSF(i * 2.0 * M_PI / SEGMENTS);
+ }
+ }
+ wp->xsize = MI_WIN_WIDTH(mi);
+ wp->ysize = MI_WIN_HEIGHT(mi);
+ wp->zsize = MAXZ - MINZ + 1;
+ if (MI_NPIXELS(mi) > 2)
+ wp->chromo = NRAND(MI_NPIXELS(mi));
+
+ if (size < -MINSIZE)
+ wp->circsize = NRAND(-size - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE)
+ wp->circsize = MINSIZE;
+ else
+ wp->circsize = size;
+
+ for (i = 0; i < wp->nc; i++) {
+ for (j = 0; j < wp->maxsize; j++) {
+ wp->rects[i * wp->maxsize + j].width = wp->circsize;
+ wp->rects[i * wp->maxsize + j].height = wp->circsize;
+
+ }
+ }
+ (void) memset((char *) wp->size, 0, wp->nc * sizeof (int));
+
+ wp->wormlength = (int) sqrt(wp->xsize + wp->ysize) *
+ MI_CYCLES(mi) / 8; /* Fudge this to something reasonable */
+ for (i = 0; i < wp->nw; i++) {
+ wp->worm[i].circ = (XPoint *) malloc(wp->wormlength * sizeof (XPoint));
+ wp->worm[i].diffcirc = (int *) malloc(wp->wormlength * sizeof (int));
+
+ for (j = 0; j < wp->wormlength; j++) {
+ wp->worm[i].circ[j].x = wp->xsize / 2;
+ wp->worm[i].circ[j].y = wp->ysize / 2;
+ if (MI_WIN_IS_USE3D(mi))
+ wp->worm[i].diffcirc[j] = 0;
+ }
+ wp->worm[i].dir = NRAND(SEGMENTS);
+ wp->worm[i].dir2 = NRAND(SEGMENTS);
+ wp->worm[i].tail = 0;
+ wp->worm[i].x = wp->xsize / 2;
+ wp->worm[i].y = wp->ysize / 2;
+ wp->worm[i].z = SCREENZ - MINZ;
+ wp->worm[i].redrawing = 0;
+ }
+
+ if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_NONE_COLOR(mi));
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, 0, wp->xsize, wp->ysize);
+ } else
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+draw_worm (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ wormstruct *wp = &worms[MI_SCREEN(mi)];
+ unsigned long wcolor;
+ int i;
+
+ (void) memset((char *) wp->size, 0, wp->nc * sizeof (int));
+
+ for (i = 0; i < wp->nw; i++) {
+ if (MI_NPIXELS(mi) > 2) {
+ wcolor = (i + wp->chromo) % wp->nc;
+
+ worm_doit(mi, i, wcolor);
+ } else
+ worm_doit(mi, i, (unsigned long) 0);
+ }
+
+ if (MI_WIN_IS_USE3D(mi)) {
+ if (MI_WIN_IS_INSTALL(mi))
+ XSetFunction(display, gc, GXor);
+ XSetForeground(display, gc, MI_RIGHT_COLOR(mi));
+ XFillRectangles(display, window, gc, &(wp->rects[0]), wp->size[0]);
+
+ XSetForeground(display, gc, MI_LEFT_COLOR(mi));
+ XFillRectangles(display, window, gc, &(wp->rects[wp->maxsize]), wp->size[1]);
+ if (MI_WIN_IS_INSTALL(mi))
+ XSetFunction(display, gc, GXcopy);
+ } else if (MI_NPIXELS(mi) > 2) {
+ for (i = 0; i < wp->nc; i++) {
+ XSetForeground(display, gc, MI_PIXEL(mi, i));
+ XFillRectangles(display, window, gc, &(wp->rects[i * wp->maxsize]), wp->size[i]);
+ }
+ } else {
+ XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+ XFillRectangles(display, window, gc,
+ &(wp->rects[0]), wp->size[0]);
+ }
+
+ if (++wp->chromo == (unsigned long) wp->nc)
+ wp->chromo = 0;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_worm (ModeInfo * mi)
+{
+ if (MI_WIN_IS_USE3D(mi))
+ /* The 3D code does drawing&clearing by XORing. We do not
+ want to go to too much trouble here to make it redraw
+ correctly. */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+ else if (worms != NULL) {
+ wormstruct *wp = &worms[MI_SCREEN(mi)];
+ int i;
+
+ for (i = 0; i < wp->nw; i++) {
+ wp->worm[i].redrawing = 1;
+ wp->worm[i].redrawpos = 0;
+ }
+ }
+}
+#endif
+
+XSCREENSAVER_MODULE ("Worm", worm)
diff --git a/hacks/worm.man b/hacks/worm.man
new file mode 100644
index 0000000..d9698b5
--- /dev/null
+++ b/hacks/worm.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+worm - multicolored worms that crawl around the screen.
+.SH SYNOPSIS
+.B worm
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+An ancient hack that draws multicolored worms that crawl around the screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Count. -100 - 100. Default: -20.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 17000 (0.017 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 150.
+.TP 8
+.B \-size \fInumber\fP
+Size. -20 - 20. Default: -3.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Brad Taylor, Dave Lemke, Boris Putanec, and
+Henrik Theiling. Permission to use, copy, modify, distribute, and sell
+this software and its documentation for any purpose is hereby granted
+without fee, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about
+the suitability of this software for any purpose. It is provided "as
+is" without express or implied warranty.
+.SH AUTHOR
+Brad Taylor, Dave Lemke, Boris Putanec, and Henrik Theiling.
diff --git a/hacks/wormhole.c b/hacks/wormhole.c
new file mode 100644
index 0000000..f28c5b2
--- /dev/null
+++ b/hacks/wormhole.c
@@ -0,0 +1,725 @@
+/* xscreensaver, Copyright (c) 1992-2011 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* wormhole:
+ * Animation of moving through a wormhole. Based on my own code written
+ * a few years ago.
+ * author: Jon Rafkind <jon@rafkind.com>
+ * date: 1/19/04
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#ifndef debug
+#define debug printf("File:%s Line:%d\n", __FILE__, __LINE__ );
+#endif
+
+typedef struct STAR{
+ int x, y;
+ int calc_x, calc_y;
+ int Z;
+ int center_x, center_y;
+} star;
+
+typedef struct STARLINE{
+ star begin, end;
+} starline;
+
+/*
+typedef struct RGBHANDLE{
+ XColor mine;
+ unsigned short rwant, gwant, bwant;
+} RGBHandle;
+*/
+
+typedef struct COLORCHANGER{
+ XColor * shade;
+ int min, max;
+ int shade_use;
+ int shade_max;
+ int min_want;
+ /* RGBHandle handle_begin, handle_end; */
+} color_changer;
+
+typedef struct WORMHOLE{
+ int diameter;
+ int diameter_change;
+ int actualx, actualy;
+ double virtualx, virtualy;
+ double speed;
+ int ang;
+ int want_ang;
+ int want_x, want_y;
+ int max_Z;
+ int addStar;
+ int spiral;
+ color_changer changer;
+ starline ** stars;
+ int num_stars; /* top of array we are using */
+ XColor black;
+ Pixmap work;
+} wormhole;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int SCREEN_X, SCREEN_Y;
+ int z_speed;
+ int make_stars;
+
+ int delay;
+ wormhole worm;
+ GC gc;
+ Colormap cmap;
+};
+
+
+/*inline*/ static int rnd( int q )
+{
+ if (q < 1) q = 1;
+ return random() % q;
+
+}
+
+static int gang( int x1, int y1, int x2, int y2 )
+{
+
+ int tang = 0;
+ if ( x1 == x2 ) {
+ if ( y1 < y2 )
+ tang = 90;
+ else
+ tang = 270;
+ } else if ( y1 == y2 ) {
+
+ if ( x1 < x2 )
+ tang = 0;
+ else
+ tang = 180;
+
+ } else {
+ tang = (int)(0.5+atan2( -(y2-y1), x2 - x1 ) * 180.0 / M_PI );
+ }
+
+ while ( tang < 0 )
+ tang += 360;
+ return tang % 360;
+
+}
+
+static void blend_palette( XColor * pal, int max, XColor * sc, XColor * ec )
+{
+
+ int q;
+
+ int sc_r = sc->red;
+ int sc_g = sc->green;
+ int sc_b = sc->blue;
+
+ int ec_r = ec->red;
+ int ec_g = ec->green;
+ int ec_b = ec->blue;
+
+ for ( q = 0; q < max; q++ ) {
+ float j = (float)( q ) / (float)( max );
+ int f_r = (int)( 0.5 + (float)( sc_r ) + (float)( ec_r-sc_r ) * j );
+ int f_g = (int)( 0.5 + (float)( sc_g ) + (float)( ec_g-sc_g ) * j );
+ int f_b = (int)( 0.5 + (float)( sc_b ) + (float)( ec_b-sc_b ) * j );
+ /* pal[q] = makecol( f_r, f_g, f_b ); */
+ pal[q].red = f_r;
+ pal[q].blue = f_b;
+ pal[q].green = f_g;
+ }
+
+}
+
+
+/*
+static void initHandle( RGBHandle * handle )
+{
+
+ handle->mine.red = rnd( 65536 );
+ handle->mine.green = rnd( 65536 );
+ handle->mine.blue = rnd( 65536 );
+ handle->rwant = rnd( 65536 );
+ handle->gwant = rnd( 65536 );
+ handle->bwant = rnd( 65536 );
+
+}
+*/
+
+static void initXColor( XColor * color )
+{
+ color->red = rnd( 50000 ) + 10000;
+ color->blue = rnd( 50000 ) + 10000;
+ color->green = rnd( 50000 ) + 10000;
+}
+
+static void initColorChanger( struct state *st, color_changer * ch )
+{
+
+ int q;
+ XColor old_color, new_color;
+
+ ch->shade_max = 2048;
+ ch->shade_use = 128;
+ ch->min = 0;
+ ch->max = ch->shade_use;
+ ch->min_want = rnd( ch->shade_max - ch->shade_use );
+ ch->shade = (XColor *)malloc( sizeof(XColor) * ch->shade_max );
+ memset( ch->shade, 0, sizeof(XColor) * ch->shade_max );
+
+ initXColor( &old_color );
+ initXColor( &new_color );
+
+ for ( q = 0; q < ch->shade_max; q += ch->shade_use ){
+ blend_palette( ch->shade + q, ch->shade_use, &old_color, &new_color );
+ old_color = new_color;
+
+ initXColor( &new_color );
+ }
+
+ for ( q = 0; q < ch->shade_max; q++ )
+ XAllocColor( st->dpy, st->cmap, &( ch->shade[q] ) );
+
+ /*
+ initHandle( &(ch->handle_begin) );
+ initHandle( &(ch->handle_end) );
+ ch->shade = (XColor *)malloc( sizeof(XColor) * MAX_COLORS );
+ ch->max = MAX_COLORS;
+ memset( ch->shade, 0, sizeof(XColor) * ch->max );
+
+ blend_palette( ch->shade, ch->max, &(ch->handle_begin.mine), &(ch->handle_end.mine) );
+ for ( q = 0; q < ch->max; q++ )
+ XAllocColor( st->dpy, *cmap, &( ch->shade[q] ) );
+ */
+
+}
+
+/*
+static void changeColor( unsigned short * col, unsigned short * change, int min, int max )
+{
+ int RGB_GO_BLACK = 30;
+ if ( *col < *change ) *col++;
+ if ( *col > *change ) *col--;
+ if ( *col == *change ){
+ if ( rnd( RGB_GO_BLACK ) == rnd( RGB_GO_BLACK ) )
+ *change = 0;
+ else *change = rnd(max-min) + min;
+ }
+}
+*/
+
+/*
+static void moveRGBHandle( RGBHandle * handle, int min, int max )
+{
+
+ unsigned short * want[ 3 ];
+ int q;
+ int cy = 0;
+ want[0] = &(handle->rwant);
+ want[1] = &(handle->gwant);
+ want[2] = &(handle->bwant);
+
+ for ( q = 0; q < 10; q++ ){
+ changeColor( &( handle->mine.red ), &handle->rwant, min, max );
+ changeColor( &( handle->mine.green ), &handle->gwant, min, max );
+ changeColor( &( handle->mine.blue ), &handle->bwant, min, max );
+ }
+
+ for ( q = 0; q < 3; q++ )
+ cy = cy || (*(want[q]) >= min && *(want[q]) <= max);
+ if ( !cy ) *(want[rnd(3)]) = rnd(max-min)+min;
+ cy = 1;
+ for ( q = 0; q < 3; q++ )
+ cy = cy && *(want[q]) == 0;
+ if ( cy ) *(want[rnd(3)]) = rnd(max-min)+min;
+
+ if ( rnd( 30 ) == rnd( 30 ) )
+ *(want[rnd(3)]) = rnd(max-min)+min;
+
+}
+*/
+
+static void moveColorChanger( color_changer * ch )
+{
+
+ /* int q; */
+
+ if ( ch->min < ch->min_want ){
+ ch->min++;
+ ch->max++;
+ }
+ if ( ch->min > ch->min_want ) {
+ ch->min--;
+ ch->max--;
+ }
+ if ( ch->min == ch->min_want )
+ ch->min_want = rnd( ch->shade_max - ch->shade_use );
+
+ /*
+ for ( q = 0; q < ch->max; q++ )
+ XFreeColors( st->dpy, *cmap, &( ch->shade[q].pixel ), 1, 0 );
+
+ moveRGBHandle( &( ch->handle_begin ), 5000, 65500 );
+ moveRGBHandle( &( ch->handle_end ), 5000, 65500 );
+
+ blend_palette( ch->shade, ch->max, &(ch->handle_begin.mine), &(ch->handle_end.mine) );
+ for ( q = 0; q < ch->max; q++ )
+ XAllocColor( st->dpy, *cmap, &( ch->shade[q] ) );
+ */
+
+}
+
+#if 0
+static void destroyColorChanger( color_changer * ch )
+{
+ int q;
+ for ( q = 0; q < ch->max; q++ )
+ XFreeColors( st->dpy, *cmap, &( ch->shade[q].pixel ), 1, 0 );
+ free( ch->shade );
+}
+#endif
+
+static void resizeWormhole( struct state *st, wormhole * worm )
+{
+
+ XWindowAttributes attr;
+
+ XGetWindowAttributes( st->dpy, st->window, &attr );
+
+ st->cmap = attr.colormap;
+
+ st->SCREEN_X = attr.width;
+ st->SCREEN_Y = attr.height;
+
+# ifndef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XFreePixmap( st->dpy, worm->work );
+ worm->work = XCreatePixmap( st->dpy, st->window, st->SCREEN_X, st->SCREEN_Y, attr.depth );
+# endif
+
+}
+
+static void initWormhole( struct state *st, wormhole * worm, Display * display, Window win )
+{
+
+ int i;
+ XWindowAttributes attr;
+
+ XGetWindowAttributes( st->dpy, st->window, &attr );
+
+ st->cmap = attr.colormap;
+
+ st->SCREEN_X = attr.width;
+ st->SCREEN_Y = attr.height;
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ worm->work = st->window;
+# else
+ worm->work = XCreatePixmap( st->dpy, st->window, st->SCREEN_X, st->SCREEN_Y, attr.depth );
+# endif
+
+ worm->diameter = rnd( 10 ) + 15;
+ worm->diameter_change = rnd( 10 ) + 15;
+ /* worm->actualx = rnd( attr.width );
+ worm->actualy = rnd( attr.height ); */
+ worm->actualx = attr.width / 2;
+ worm->actualy = attr.height / 2;
+ worm->virtualx = worm->actualx;
+ worm->virtualy = worm->actualy;
+ worm->speed = (float)st->SCREEN_X / 180.0;
+ /* z_speed = SCREEN_X / 120; */
+ worm->spiral = 0;
+ worm->addStar = st->make_stars;
+ worm->want_x = rnd( attr.width - 50 ) + 25;
+ worm->want_y = rnd( attr.height - 50 ) + 25;
+ worm->want_ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y );
+ worm->ang = worm->want_ang;
+ worm->max_Z = 600;
+ worm->black.red = 0;
+ worm->black.green = 0;
+ worm->black.blue = 0;
+ XAllocColor( st->dpy, st->cmap, &worm->black );
+ initColorChanger( st, &(worm->changer) );
+
+ worm->num_stars = 64;
+ worm->stars = (starline **)malloc( sizeof(starline *) * worm->num_stars );
+ for ( i = 0; i < worm->num_stars; i++ )
+ worm->stars[i] = NULL;
+
+}
+
+#if 0
+static void destroyWormhole( wormhole * worm )
+{
+ destroyColorChanger( &(worm->changer), st->dpy, cmap );
+ if (work->work != st->window)
+ XFreePixmap( st->dpy, worm->work );
+ free( worm->stars );
+}
+#endif
+
+static double Cos( int a )
+{
+ return cos( a * 180.0 / M_PI );
+}
+
+static double Sine( int a )
+{
+ return sin( a * 180.0 / M_PI );
+}
+
+
+
+static void calcStar( star * st )
+{
+ if ( st->center_x == 0 || st->center_y == 0 ){
+ st->Z = 0;
+ return;
+ }
+ if ( st->Z <= 0 ){
+ st->calc_x = (st->x << 10) / st->center_x;
+ st->calc_y = (st->y << 10) / st->center_y;
+ } else {
+ st->calc_x = (st->x << 10 ) / st->Z + st->center_x;
+ st->calc_y = (st->y << 10 ) / st->Z + st->center_y;
+ }
+}
+
+static void initStar( star * st, int Z, int ang, wormhole * worm )
+{
+
+ st->x = Cos( ang ) * worm->diameter;
+ st->y = Sine( ang ) * worm->diameter;
+ st->center_x = worm->actualx;
+ st->center_y = worm->actualy;
+ st->Z = Z;
+ calcStar( st );
+
+}
+
+static void addStar( wormhole * worm )
+{
+
+ starline * star_new;
+ starline ** xstars;
+ int old_stars;
+ int q;
+ int ang;
+ star_new = (starline *)malloc( sizeof( starline ) );
+ ang = rnd( 360 );
+ initStar( &star_new->begin, worm->max_Z, ang, worm );
+ initStar( &star_new->end, worm->max_Z+rnd(6)+4, ang, worm );
+
+ for ( q = 0; q < worm->num_stars; q++ ){
+ if ( worm->stars[q] == NULL ){
+ worm->stars[q] = star_new;
+ return;
+ }
+ }
+
+ old_stars = worm->num_stars;
+ worm->num_stars = worm->num_stars << 1;
+ xstars = (starline **)malloc( sizeof(starline *) * worm->num_stars );
+ for ( q = 0; q < worm->num_stars; q++ )
+ xstars[q] = NULL;
+
+ for ( q = 0; q < old_stars; q++ )
+ if ( worm->stars[q] != NULL ) xstars[q] = worm->stars[q];
+ free( worm->stars );
+ worm->stars = xstars;
+
+ worm->stars[ old_stars ] = star_new;
+
+}
+
+static int moveStar( struct state *st, starline * stl )
+{
+
+ stl->begin.Z -= st->z_speed;
+ stl->end.Z -= st->z_speed;
+
+ calcStar( &stl->begin );
+ calcStar( &stl->end );
+
+ return ( stl->begin.Z <= 0 || stl->end.Z <= 0 );
+
+}
+
+static int dist( int x1, int y1, int x2, int y2 )
+{
+ int xs, ys;
+ xs = x1-x2;
+ ys = y1-y2;
+ return (int)sqrt( xs*xs + ys*ys );
+}
+
+static void moveWormhole( struct state *st, wormhole * worm )
+{
+
+ int q;
+ double dx, dy;
+ /* int x1, y1, x2, y2; */
+ int min_dist = 100;
+ int find = 0;
+ dx = Cos( worm->ang ) * worm->speed;
+ dy = Sine( worm->ang ) * worm->speed;
+
+ worm->virtualx += dx;
+ worm->virtualy += dy;
+ worm->actualx = (int)worm->virtualx;
+ worm->actualy = (int)worm->virtualy;
+
+ if ( worm->spiral ){
+
+ if ( worm->spiral % 5 == 0 )
+ worm->ang = (worm->ang + 1 ) % 360;
+ worm->spiral--;
+ if ( worm->spiral <= 0 ) find = 1;
+
+ } else {
+
+ if ( dist( worm->actualx, worm->actualy, worm->want_x, worm->want_y ) < 20 )
+ find = 1;
+
+ if ( rnd( 20 ) == rnd( 20 ) )
+ find = 1;
+
+ if ( worm->actualx < min_dist ){
+ worm->actualx = min_dist;
+ worm->virtualx = worm->actualx;
+ find = 1;
+ }
+ if ( worm->actualy < min_dist ){
+ worm->actualy = min_dist;
+ worm->virtualy = worm->actualy;
+ find = 1;
+ }
+ if ( worm->actualx > st->SCREEN_X - min_dist ){
+ worm->actualx = st->SCREEN_X - min_dist;
+ worm->virtualx = worm->actualx;
+ find = 1;
+ }
+ if ( worm->actualy > st->SCREEN_Y - min_dist ){
+ worm->actualy = st->SCREEN_Y - min_dist;
+ worm->virtualy = worm->actualy;
+ find = 1;
+ }
+
+ if ( rnd( 500 ) == rnd( 500 ) ) worm->spiral = rnd( 30 ) + 50;
+ }
+
+ if ( find ){
+ worm->want_x = rnd( st->SCREEN_X - min_dist * 2 ) + min_dist;
+ worm->want_y = rnd( st->SCREEN_Y - min_dist * 2 ) + min_dist;
+ worm->ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y );
+ }
+
+
+ /* worm->ang = ( worm->ang + 360 + rnd( 30 ) - 15 ) % 360; */
+
+ /*
+ if ( worm->ang < worm->want_ang ) worm->ang++;
+ if ( worm->ang > worm->want_ang ) worm->ang--;
+ if ( worm->ang == worm->want_ang && rnd( 3 ) == rnd( 3 ) ) worm->want_ang = rnd( 360 );
+ */
+
+ /*
+ if ( rnd( 25 ) == rnd( 25 ) ){
+ x1 = worm->actualx;
+ y1 = worm->actualy;
+ x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
+ y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
+ worm->want_ang = gang(x1,y1,x2,y2);
+ }
+ */
+
+ /*
+ if ( worm->actualx < min_dist || worm->actualx > SCREEN_X - min_dist || worm->actualy < min_dist || worm->actualy > SCREEN_Y - min_dist ){
+ x1 = worm->actualx;
+ y1 = worm->actualy;
+ x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
+ y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
+ / * worm->ang = gang( worm->actualx, worm->actualy, SCREEN_X/2+rnd(20)-10, SCREEN_Y/2+rnd(20)-10 ); * /
+ worm->ang = gang( x1, y1, x2, y2 );
+ worm->want_ang = worm->ang;
+ / * printf("Angle = %d\n", worm->ang ); * /
+
+ if ( worm->actualx < min_dist )
+ worm->actualx = min_dist;
+ if ( worm->actualx > SCREEN_X - min_dist )
+ worm->actualx = SCREEN_X - min_dist;
+ if ( worm->actualy < min_dist )
+ worm->actualy = min_dist;
+ if ( worm->actualy > SCREEN_Y - min_dist )
+ worm->actualy = SCREEN_Y - min_dist;
+ worm->virtualx = worm->actualx;
+ worm->virtualy = worm->actualy;
+ }
+ */
+
+ for ( q = 0; q < worm->num_stars; q++ ){
+ if ( worm->stars[q] != NULL ){
+ if ( moveStar( st, worm->stars[q] ) ){
+ free( worm->stars[q] );
+ worm->stars[q] = NULL;
+ }
+ }
+ }
+
+ moveColorChanger( &worm->changer );
+
+ if ( worm->diameter < worm->diameter_change )
+ worm->diameter++;
+ if ( worm->diameter > worm->diameter_change )
+ worm->diameter--;
+ if ( rnd( 30 ) == rnd( 30 ) )
+ worm->diameter_change = rnd( 35 ) + 5;
+
+ for ( q = 0; q < worm->addStar; q++ )
+ addStar( worm );
+
+}
+
+static XColor * getColorShade( color_changer * ch )
+{
+ return ch->shade + ch->min;
+}
+
+static void drawWormhole( struct state *st, wormhole * worm )
+{
+
+ int i;
+ int color;
+ int z;
+ starline * current;
+ XColor * xcol;
+ XColor * shade;
+
+ XSetForeground( st->dpy, st->gc, worm->black.pixel );
+ XFillRectangle( st->dpy, worm->work, st->gc, 0, 0, st->SCREEN_X, st->SCREEN_Y );
+
+ for ( i = 0; i < worm->num_stars; i++ )
+ if ( worm->stars[i] != NULL ){
+
+ current = worm->stars[i];
+ z = current->begin.Z;
+
+ color = z * worm->changer.shade_use / worm->max_Z;
+ shade = getColorShade( &worm->changer );
+ /* xcol = &worm->changer.shade[ color ]; */
+ xcol = &shade[ color ];
+
+ XSetForeground( st->dpy, st->gc, xcol->pixel );
+ /* XDrawLine( st->dpy, st->window, *gc, current->begin.calc_x, current->begin.calc_y, current->end.calc_x, current->end.calc_y ); */
+ XDrawLine( st->dpy, worm->work, st->gc, current->begin.calc_x, current->begin.calc_y, current->end.calc_x, current->end.calc_y );
+
+ }
+ if (worm->work != st->window)
+ XCopyArea( st->dpy, worm->work, st->window, st->gc, 0, 0, st->SCREEN_X, st->SCREEN_Y, 0, 0 );
+}
+
+/*
+static void eraseWormhole( Display * display, Window * st->window, wormhole * worm ){
+ starline * current;
+ int i;
+ XColor * xcol;
+ for ( i = 0; i < worm->num_stars; i++ )
+ if ( worm->stars[i] != NULL ){
+ xcol = &worm->black;
+ current = worm->stars[i];
+ XSetForeground( st->dpy, *gc, xcol->pixel );
+ XDrawLine( st->dpy, st->window, *gc, current->begin.calc_x, current->begin.calc_y, current->end.calc_x, current->end.calc_y );
+ }
+}
+*/
+
+
+
+static void *
+wormhole_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes attr;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer" );
+ st->make_stars = get_integer_resource(st->dpy, "stars", "Integer" );
+ st->z_speed = get_integer_resource(st->dpy, "zspeed", "Integer" );
+
+ initWormhole( st, &st->worm, st->dpy, st->window );
+
+ st->gc = XCreateGC( st->dpy, st->window, 0, &gcv );
+ XGetWindowAttributes( st->dpy, st->window, &attr );
+ st->cmap = attr.colormap;
+
+ return st;
+}
+
+static unsigned long
+wormhole_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ moveWormhole( st, &st->worm );
+ drawWormhole( st, &st->worm );
+ return st->delay;
+}
+
+static void
+wormhole_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ resizeWormhole( st, &st->worm );
+}
+
+static Bool
+wormhole_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+wormhole_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+
+static const char *wormhole_defaults [] = {
+ ".lowrez: true",
+ ".background: Black",
+ ".foreground: #E9967A",
+ "*delay: 10000",
+ "*zspeed: 10",
+ "*stars: 20",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec wormhole_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-zspeed", ".zspeed", XrmoptionSepArg, 0 },
+ { "-stars", ".stars", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Wormhole", wormhole)
diff --git a/hacks/wormhole.man b/hacks/wormhole.man
new file mode 100644
index 0000000..f3287fa
--- /dev/null
+++ b/hacks/wormhole.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "11-feb-04" "X Version 11"
+.SH NAME
+wormhole - animation of flying through a wormhole
+.SH SYNOPSIS
+.B wormhole
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-visual \fIvisual\fP]
+[\-root]
+[\-stars \fIn\fP]
+[\-delay \fIusecs\fP]
+[\-zspeed \fIn\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIwormhole\fP program shows an animation of flying through a tunnel surrounded by streaks of light.
+.SH OPTIONS
+.I wormhole
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+Make all the rocks the same color.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-stars \fIinteger\fP
+Number of stars to create every animation loop.
+.TP 8
+.B \-zspeed \fIinteger\fP
+Speed light streaks fly by.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Number of microseconds to delay between each frame. Default 10000, meaning
+about 1/100th second. Compare and contrast with \fI\-zspeed\fP, above.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Jon Rafkind. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jon Rafkind <jon@rafkind.com>
diff --git a/hacks/xanalogtv.c b/hacks/xanalogtv.c
new file mode 100644
index 0000000..80cc7d9
--- /dev/null
+++ b/hacks/xanalogtv.c
@@ -0,0 +1,654 @@
+/* xanalogtv, Copyright (c) 2003-2018 Trevor Blackwell <tlb@tlb.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ *
+ * Simulate test patterns on an analog TV. Concept similar to xteevee
+ * in this distribution, but a totally different implementation based
+ * on the simulation of an analog TV set in utils/analogtv.c. Much
+ * more realistic, but needs more video card bandwidth.
+ *
+ * It flips around through simulated channels 2 through 13. Some show
+ * pictures from your images directory, some show color bars, and some
+ * just have static. Some channels receive two stations simultaneously
+ * so you see a ghostly, misaligned image.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <math.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h> /* for XtDatabase in hack_resources() */
+#endif
+
+#include "screenhack.h"
+#include "ximage-loader.h"
+#include "analogtv.h"
+
+#define USE_TEST_PATTERNS
+
+#include "images/gen/logo-180_png.h"
+
+#ifdef USE_TEST_PATTERNS
+# include "images/gen/testcard_rca_png.h"
+# include "images/gen/testcard_pm5544_png.h"
+# include "images/gen/testcard_bbcf_png.h"
+#endif
+
+
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+enum {
+ N_CHANNELS=12, /* Channels 2 through 13 on VHF */
+ MAX_MULTICHAN=2,
+ MAX_STATIONS=6
+};
+
+typedef struct chansetting_s {
+
+ analogtv_reception recs[MAX_MULTICHAN];
+ double noise_level;
+ Bool image_loaded_p;
+/* char *filename; was only used for diagnostics */
+ int dur;
+} chansetting;
+
+
+struct state {
+ Display *dpy;
+ Window window;
+ analogtv *tv;
+ analogtv_font ugly_font;
+ struct timeval basetime;
+
+ int n_stations;
+ analogtv_input *stations[MAX_STATIONS];
+ Bool image_loading_p;
+ XImage *logo, *logo_mask;
+# ifdef USE_TEST_PATTERNS
+ XImage *test_patterns[MAX_STATIONS];
+# endif
+
+ int curinputi;
+ int change_ticks;
+ chansetting chansettings[N_CHANNELS];
+ chansetting *cs;
+
+ int change_now;
+ int colorbars_only_p;
+};
+
+
+static void
+update_smpte_colorbars(analogtv_input *input)
+{
+ struct state *st = (struct state *) input->client_data;
+ int col;
+ int xpos, ypos;
+ int black_ntsc[4];
+
+ /*
+ SMPTE is the society of motion picture and television engineers, and
+ these are the standard color bars in the US. Following the partial spec
+ at http://broadcastengineering.com/ar/broadcasting_inside_color_bars/
+ These are luma, chroma, and phase numbers for each of the 7 bars.
+ */
+ double top_cb_table[7][3]={
+ {75, 0, 0.0}, /* gray */
+ {69, 31, 167.0}, /* yellow */
+ {56, 44, 283.5}, /* cyan */
+ {48, 41, 240.5}, /* green */
+ {36, 41, 60.5}, /* magenta */
+ {28, 44, 103.5}, /* red */
+ {15, 31, 347.0} /* blue */
+ };
+ double mid_cb_table[7][3]={
+ {15, 31, 347.0}, /* blue */
+ {7, 0, 0}, /* black */
+ {36, 41, 60.5}, /* magenta */
+ {7, 0, 0}, /* black */
+ {56, 44, 283.5}, /* cyan */
+ {7, 0, 0}, /* black */
+ {75, 0, 0.0} /* gray */
+ };
+
+ analogtv_lcp_to_ntsc(0.0, 0.0, 0.0, black_ntsc);
+
+ analogtv_setup_sync(input, 1, 0);
+ analogtv_setup_teletext(input);
+
+ for (col=0; col<7; col++) {
+ analogtv_draw_solid_rel_lcp(input, col*(1.0/7.0), (col+1)*(1.0/7.0), 0.00, 0.68,
+ top_cb_table[col][0],
+ top_cb_table[col][1], top_cb_table[col][2]);
+
+ analogtv_draw_solid_rel_lcp(input, col*(1.0/7.0), (col+1)*(1.0/7.0), 0.68, 0.75,
+ mid_cb_table[col][0],
+ mid_cb_table[col][1], mid_cb_table[col][2]);
+ }
+
+ analogtv_draw_solid_rel_lcp(input, 0.0, 1.0/6.0,
+ 0.75, 1.00, 7, 40, 303); /* -I */
+ analogtv_draw_solid_rel_lcp(input, 1.0/6.0, 2.0/6.0,
+ 0.75, 1.00, 100, 0, 0); /* white */
+ analogtv_draw_solid_rel_lcp(input, 2.0/6.0, 3.0/6.0,
+ 0.75, 1.00, 7, 40, 33); /* +Q */
+ analogtv_draw_solid_rel_lcp(input, 3.0/6.0, 4.0/6.0,
+ 0.75, 1.00, 7, 0, 0); /* black */
+ analogtv_draw_solid_rel_lcp(input, 12.0/18.0, 13.0/18.0,
+ 0.75, 1.00, 3, 0, 0); /* black -4 */
+ analogtv_draw_solid_rel_lcp(input, 13.0/18.0, 14.0/18.0,
+ 0.75, 1.00, 7, 0, 0); /* black */
+ analogtv_draw_solid_rel_lcp(input, 14.0/18.0, 15.0/18.0,
+ 0.75, 1.00, 11, 0, 0); /* black +4 */
+ analogtv_draw_solid_rel_lcp(input, 5.0/6.0, 6.0/6.0,
+ 0.75, 1.00, 7, 0, 0); /* black */
+
+
+ ypos=ANALOGTV_V/5;
+ xpos=ANALOGTV_VIS_START + ANALOGTV_VIS_LEN/2;
+
+ /* if (! st->colorbars_only_p) */
+ {
+ char localname[256];
+ if (gethostname (localname, sizeof (localname))==0) {
+ int L;
+ localname[sizeof(localname)-1]=0; /* "The returned name is null-
+ terminated unless insufficient
+ space is provided" */
+ L = strlen(localname);
+ if (L > 6 && !strcmp(".local", localname+L-6))
+ localname[L-6] = 0;
+
+ localname[24]=0; /* limit length */
+
+ analogtv_draw_string_centered(input, &st->ugly_font, localname,
+ xpos, ypos, black_ntsc);
+ }
+ }
+ ypos += st->ugly_font.char_h*5/2;
+
+ if (st->logo)
+ {
+ int w2 = st->tv->xgwa.width * 0.2;
+ int h2 = st->tv->xgwa.height * 0.2;
+ analogtv_load_ximage (st->tv, input, st->logo, st->logo_mask,
+ (st->tv->xgwa.width - w2) / 2,
+ st->tv->xgwa.height * 0.28,
+ w2, h2);
+ }
+
+ ypos += 58;
+
+#if 0
+ analogtv_draw_string_centered(input, &st->ugly_font,
+ "Please Stand By", xpos, ypos);
+ ypos += st->ugly_font.char_h*4;
+#endif
+
+ /* if (! st->colorbars_only_p) */
+ {
+ char timestamp[256];
+ time_t t = time ((time_t *) 0);
+ struct tm *tm = localtime (&t);
+
+ /* Y2K: It is OK for this to use a 2-digit year because it's simulating a
+ TV display and is purely decorative. */
+ strftime(timestamp, sizeof(timestamp)-1, "%y.%m.%d %H:%M:%S ", tm);
+ analogtv_draw_string_centered(input, &st->ugly_font, timestamp,
+ xpos, ypos, black_ntsc);
+ }
+
+
+ input->next_update_time += 1.0;
+}
+
+static int
+getticks(struct state *st)
+{
+ struct timeval tv;
+ gettimeofday(&tv,NULL);
+ return ((tv.tv_sec - st->basetime.tv_sec)*1000 +
+ (tv.tv_usec - st->basetime.tv_usec)/1000);
+}
+
+
+/* The first time we grab an image, do it the default way.
+ The second and subsequent times, add "-no-desktop" to the command.
+ That way we don't have to watch the window un-map 5+ times in a row.
+ Also, we end up with the desktop on only one channel, and pictures
+ on all the others (or colorbars, if no imageDirectory is set.)
+ */
+static void
+hack_resources (Display *dpy)
+{
+#ifndef HAVE_JWXYZ
+ static int count = -1;
+ count++;
+
+ if (count == 0)
+ return;
+ else if (count == 1)
+ {
+ XrmDatabase db = XtDatabase (dpy);
+ char *res = "desktopGrabber";
+ char *val = get_string_resource (dpy, res, "DesktopGrabber");
+ char buf1[255];
+ char buf2[255];
+ XrmValue value;
+ sprintf (buf1, "%.100s.%.100s", progname, res);
+ sprintf (buf2, "%.200s -no-desktop", val);
+ value.addr = buf2;
+ value.size = strlen(buf2);
+ XrmPutResource (&db, buf1, "String", &value);
+ }
+#endif /* HAVE_JWXYZ */
+}
+
+
+static void analogtv_load_random_image(struct state *);
+
+
+static void image_loaded_cb (Screen *screen, Window window, Drawable pixmap,
+ const char *name, XRectangle *geometry,
+ void *closure)
+{
+ /* When an image has just been loaded, store it into the first available
+ channel. If there are other unloaded channels, then start loading
+ another image.
+ */
+ struct state *st = (struct state *) closure;
+ int i;
+ int this = -1;
+ int next = -1;
+
+ if (!st->image_loading_p) abort(); /* only one at a time... */
+ st->image_loading_p = False;
+
+ for (i = 0; i < MAX_STATIONS; i++) {
+ if (! st->chansettings[i].image_loaded_p) {
+ if (this == -1) this = i;
+ else if (next == -1) next = i;
+ }
+ }
+ if (this == -1) abort(); /* no unloaded stations? */
+
+ /* Load this image into the next channel. */
+ {
+ analogtv_input *input = st->stations[this];
+ int width=ANALOGTV_PIC_LEN;
+ int height=width*3/4;
+ XImage *image = XGetImage (st->dpy, pixmap, 0, 0,
+ width, height, ~0L, ZPixmap);
+ XFreePixmap(st->dpy, pixmap);
+
+ analogtv_setup_sync(input, 1, (random()%20)==0);
+ analogtv_load_ximage(st->tv, input, image, 0, 0, 0, 0, 0);
+ if (image) XDestroyImage(image);
+ st->chansettings[this].image_loaded_p = True;
+#if 0
+ if (name) {
+ const char *s = strrchr (name, '/');
+ if (s) s++;
+ else s = name;
+ st->chansettings[this].filename = strdup (s);
+ }
+ fprintf(stderr, "%s: loaded channel %d, %s\n", progname, this,
+ st->chansettings[this].filename);
+#endif
+ }
+
+ /* If there are still unloaded stations, fire off another loader. */
+ if (next != -1)
+ analogtv_load_random_image (st);
+}
+
+
+/* Queues a single image for loading. Only load one at a time.
+ The image is done loading when st->img_loader is null and
+ it->loaded_image is a pixmap.
+ */
+static void
+analogtv_load_random_image(struct state *st)
+{
+ int width=ANALOGTV_PIC_LEN;
+ int height=width*3/4;
+ Pixmap p;
+
+ if (st->image_loading_p) /* a load is already in progress */
+ return;
+
+ st->image_loading_p = True;
+ p = XCreatePixmap(st->dpy, st->window, width, height, st->tv->visdepth);
+ hack_resources(st->dpy);
+ load_image_async (st->tv->xgwa.screen, st->window, p, image_loaded_cb, st);
+}
+
+
+static void add_stations(struct state *st)
+{
+ while (st->n_stations < MAX_STATIONS) {
+ analogtv_input *input=analogtv_input_allocate();
+ st->stations[st->n_stations++]=input;
+ input->client_data = st;
+ }
+}
+
+
+static void load_station_images(struct state *st)
+{
+ int i;
+ for (i = 0; i < MAX_STATIONS; i++) {
+ analogtv_input *input = st->stations[i];
+
+ st->chansettings[i].image_loaded_p = True;
+ if (i == 0 || /* station 0 is always colorbars */
+ st->colorbars_only_p) {
+ input->updater = update_smpte_colorbars;
+ input->do_teletext=1;
+ }
+#ifdef USE_TEST_PATTERNS
+ else if (random()%5==0) {
+ int count = 0, j;
+ for (count = 0; st->test_patterns[count]; count++)
+ ;
+ j=random()%count;
+ analogtv_setup_sync(input, 1, 0);
+ analogtv_load_ximage(st->tv, input, st->test_patterns[j],
+ 0, 0, 0, 0, 0);
+ analogtv_setup_teletext(input);
+ }
+#endif
+ else {
+ analogtv_load_random_image(st);
+ input->do_teletext=1;
+ st->chansettings[i].image_loaded_p = False;
+ }
+ }
+}
+
+
+static void *
+xanalogtv_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ int last_station=42;
+ int delay = get_integer_resource(dpy, "delay", "Integer");
+
+ if (delay < 1) delay = 1;
+
+ analogtv_make_font(dpy, window, &st->ugly_font, 7, 10, "6x10");
+
+ st->dpy = dpy;
+ st->window = window;
+ st->tv=analogtv_allocate(dpy, window);
+
+ st->colorbars_only_p =
+ get_boolean_resource(dpy, "colorbarsOnly", "ColorbarsOnly");
+
+ /* if (!st->colorbars_only_p) */
+ {
+ int w, h;
+ Pixmap mask = 0;
+ Pixmap p = image_data_to_pixmap (dpy, window,
+ logo_180_png, sizeof(logo_180_png),
+ &w, &h, &mask);
+ st->logo = XGetImage (dpy, p, 0, 0, w, h, ~0L, ZPixmap);
+ XFreePixmap (dpy, p);
+ if (mask)
+ {
+ st->logo_mask = XGetImage (dpy, mask, 0, 0, w, h, ~0L, ZPixmap);
+ XFreePixmap (dpy, mask);
+ }
+ }
+
+# ifdef USE_TEST_PATTERNS
+ {
+ int i = 0;
+ int w, h;
+ Pixmap p;
+ p = image_data_to_pixmap (dpy, window,
+ testcard_rca_png, sizeof(testcard_rca_png),
+ &w, &h, 0);
+ st->test_patterns[i++] = XGetImage (dpy, p, 0, 0, w, h, ~0L, ZPixmap);
+ XFreePixmap (dpy, p);
+
+ p = image_data_to_pixmap (dpy, window,
+ testcard_pm5544_png, sizeof(testcard_pm5544_png),
+ &w, &h, 0);
+ st->test_patterns[i++] = XGetImage (dpy, p, 0, 0, w, h, ~0L, ZPixmap);
+ XFreePixmap (dpy, p);
+
+ p = image_data_to_pixmap (dpy, window,
+ testcard_bbcf_png, sizeof(testcard_bbcf_png),
+ &w, &h, 0);
+ st->test_patterns[i++] = XGetImage (dpy, p, 0, 0, w, h, ~0L, ZPixmap);
+ XFreePixmap (dpy, p);
+ }
+# endif /* USE_TEST_PATTERNS */
+
+
+ add_stations(st);
+
+ analogtv_set_defaults(st->tv, "");
+ st->tv->need_clear=1;
+
+ if (random()%4==0) {
+ st->tv->tint_control += pow(frand(2.0)-1.0, 7) * 180.0;
+ }
+ if (1) {
+ st->tv->color_control += frand(0.3);
+ }
+
+ for (i=0; i<N_CHANNELS; i++) {
+ memset(&st->chansettings[i], 0, sizeof(chansetting));
+
+ st->chansettings[i].noise_level = 0.06;
+ st->chansettings[i].dur = 1000*delay;
+
+ if (random()%6==0) {
+ st->chansettings[i].dur=600;
+ }
+ else {
+ int stati;
+ for (stati=0; stati<MAX_MULTICHAN; stati++) {
+ analogtv_reception *rec=&st->chansettings[i].recs[stati];
+ int station;
+ while (1) {
+ station=random()%st->n_stations;
+ if (station!=last_station) break;
+ if ((random()%10)==0) break;
+ }
+ last_station=station;
+ rec->input = st->stations[station];
+ rec->level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
+ rec->ofs=random()%ANALOGTV_SIGNAL_LEN;
+ if (random()%3) {
+ rec->multipath = frand(1.0);
+ } else {
+ rec->multipath=0.0;
+ }
+ if (stati) {
+ /* We only set a frequency error for ghosting stations,
+ because it doesn't matter otherwise */
+ rec->freqerr = (frand(2.0)-1.0) * 3.0;
+ }
+
+ if (rec->level > 0.3) break;
+ if (random()%4) break;
+ }
+ }
+ }
+
+ gettimeofday(&st->basetime,NULL);
+
+ st->curinputi=0;
+ st->cs = &st->chansettings[st->curinputi];
+ st->change_ticks = st->cs->dur + 1500;
+
+ st->tv->powerup=0.0;
+
+ load_station_images(st);
+
+ return st;
+}
+
+static unsigned long
+xanalogtv_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+
+ int curticks=getticks(st);
+ double curtime=curticks*0.001;
+
+ const analogtv_reception *recs[MAX_MULTICHAN];
+ unsigned rec_count = 0;
+
+ int auto_change = curticks >= st->change_ticks && st->tv->powerup > 10.0 ? 1 : 0;
+
+ if (st->change_now || auto_change) {
+ st->curinputi=(st->curinputi+st->change_now+auto_change+N_CHANNELS)%N_CHANNELS;
+ st->change_now = 0;
+ st->cs = &st->chansettings[st->curinputi];
+#if 0
+ fprintf (stderr, "%s: channel %d, %s\n", progname, st->curinputi,
+ st->cs->filename);
+#endif
+ st->change_ticks = curticks + st->cs->dur;
+ /* Set channel change noise flag */
+ st->tv->channel_change_cycles=200000;
+ }
+
+ for (i=0; i<MAX_MULTICHAN; i++) {
+ analogtv_reception *rec = &st->cs->recs[i];
+ analogtv_input *inp=rec->input;
+ if (!inp) continue;
+
+ if (inp->updater) {
+ inp->next_update_time = curtime;
+ (inp->updater)(inp);
+ }
+ rec->ofs += rec->freqerr;
+ }
+
+ st->tv->powerup=curtime;
+
+ for (i=0; i<MAX_MULTICHAN; i++) {
+ analogtv_reception *rec = &st->cs->recs[i];
+ if (rec->input) {
+ analogtv_reception_update(rec);
+ recs[rec_count] = rec;
+ ++rec_count;
+ }
+ }
+ analogtv_draw(st->tv, st->cs->noise_level, recs, rec_count);
+
+#ifdef HAVE_MOBILE
+ return 0;
+#else
+ return 5000;
+#endif
+}
+
+static void
+xanalogtv_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_reconfigure(st->tv);
+}
+
+static Bool
+xanalogtv_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+
+ if (event->type == ButtonPress)
+ {
+ unsigned button = event->xbutton.button;
+ st->change_now = button == 2 || button == 3 || button == 5 ? -1 : 1;
+ return True;
+ }
+ else if (event->type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t' || c == '\r' || c == '\n' ||
+ keysym == XK_Up || keysym == XK_Right || keysym == XK_Prior)
+ {
+ st->change_now = 1;
+ return True;
+ }
+ else if (c == '\b' ||
+ keysym == XK_Down || keysym == XK_Left || keysym == XK_Next)
+ {
+ st->change_now = -1;
+ return True;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ {
+ DEF:
+ st->change_now = ((random() & 1) ? 1 : -1);
+ return True;
+ }
+
+ return False;
+}
+
+static void
+xanalogtv_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_release(st->tv);
+ if (st->logo) XDestroyImage (st->logo);
+ if (st->logo_mask) XDestroyImage (st->logo_mask);
+# ifdef USE_TEST_PATTERNS
+ {
+ int i;
+ for (i = 0; i < countof(st->test_patterns); i++)
+ if (st->test_patterns[i]) XDestroyImage (st->test_patterns[i]);
+ }
+# endif
+ free (st);
+}
+
+
+static const char *xanalogtv_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*delay: 5",
+ "*grabDesktopImages: False", /* HAVE_JWXYZ */
+ "*chooseRandomImages: True", /* HAVE_JWXYZ */
+ "*colorbarsOnly: False",
+ ANALOGTV_DEFAULTS
+ 0,
+};
+
+static XrmOptionDescRec xanalogtv_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-colorbars-only", ".colorbarsOnly", XrmoptionNoArg, "True" },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("XAnalogTV", xanalogtv)
diff --git a/hacks/xanalogtv.man b/hacks/xanalogtv.man
new file mode 100644
index 0000000..79ac57b
--- /dev/null
+++ b/hacks/xanalogtv.man
@@ -0,0 +1,84 @@
+.TH XScreenSaver 1 "10-Oct-03" "X Version 11"
+.SH NAME
+xanalogtv - Simulate reception on an old analog TV set
+.SH SYNOPSIS
+.B xanalogtv
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-cycle] [\-no-cycle]
+[\-fps]
+.SH DESCRIPTION
+.I xanalogtv
+shows a simulation of an old TV set showing test patterns and any
+other images you have provided. It reproduces a wide range of TV
+reception bummage: snow, bloom, ghosting, and loss of vertical and
+horizontal sync. It also simulates the TV warming up. It will cycle
+through 12 channels, some with images you give it, and some with color
+bars or nothing but static.
+.PP
+The images that it uses will be grabbed from the portion of the screen
+underlying the window, or from the system's video input, or from a
+random file on disk, as indicated by the \fIgrabDesktopImages\fP,
+\fIgrabVideoFrames\fP, and \fIchooseRandomImages\fP options in the
+\fI~/.xscreensaver\fP file; see
+.BR xscreensaver-demo (1)
+for more details. It looks best with a video input or
+your digital photo collection.
+.PP
+.SH OPTIONS
+.I xanalogtv
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+Notable X resources supported include the following which correspond
+to standard TV controls:
+.BR analogTVTint ,
+.BR analogTVColor ,
+.BR analogTVBrightness ,
+and
+.BR analogTVContrast .
+They range from 0 to 100, except for tint which is an angle
+between -180 and +180.
+
+.SH SEE ALSO
+.BR X (1),
+.BR xteevee (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR bsod (MANSUFFIX),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Trevor Blackwell. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Trevor Blackwell <tlb@tlb.org>
diff --git a/hacks/xflame.c b/hacks/xflame.c
new file mode 100644
index 0000000..1037460
--- /dev/null
+++ b/hacks/xflame.c
@@ -0,0 +1,819 @@
+/* xflame, Copyright (c) 1996-2018 Carsten Haitzler <raster@redhat.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Version history as near as I (jwz) can piece together:
+
+ * Carsten Haitzler <raster@redhat.com> wrote the first version in 1996.
+
+ * Rahul Jain <rahul@rice.edu> added support for TrueColor displays.
+
+ * Someone did a rough port of it to use the xscreensaver utility routines
+ instead of creating its own window by hand.
+
+ * Someone (probably Raster) came up with a subsequent version that had
+ a Red Hat logo hardcoded into it.
+
+ * Daniel Zahn <stumpy@religions.com> found that version in 1998, and
+ hacked it to be able to load a different logo from a PGM (P5) file,
+ with a single hardcoded pathname.
+
+ * Jamie Zawinski <jwz@jwz.org> found several versions of xflame in
+ March 1999, and pieced them together. Changes:
+
+ - Correct and fault-tolerant use of the Shared Memory extension;
+ previous versions of xflame did not work when $DISPLAY was remote.
+
+ - Replaced PGM-reading code with code that can read arbitrary XBM
+ and XPM files (color ones will be converted to grayscale.)
+
+ - Command-line options all around -- no hardcoded pathnames or
+ behavioral constants.
+
+ - General cleanup and portability tweaks.
+
+ * 4-Oct-99, jwz: added support for packed-24bpp (versus 32bpp.)
+ * 16-Jan-2002, jwz: added gdk_pixbuf support.
+ * 9-Oct-2016, Dave Odell <dmo2118@gmail.com>: Updated for new xshm.c.
+
+ */
+
+/* portions by Daniel Zahn <stumpy@religions.com> */
+
+
+#include "screenhack.h"
+#include "ximage-loader.h"
+#include <limits.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+# undef MAX
+# undef MIN
+# define MAX(A,B) ((A)>(B)?(A):(B))
+# define MIN(A,B) ((A)<(B)?(A):(B))
+
+#include "xshm.h"
+
+#include "images/gen/bob_png.h"
+
+#define MAX_VAL 255
+
+struct state {
+ Display *dpy;
+ Window window;
+ int depth;
+ int width;
+ int height;
+ Colormap colormap;
+ Visual *visual;
+ Screen *screen;
+ Bool bloom;
+ XImage *xim;
+ XShmSegmentInfo shminfo;
+ GC gc;
+ int ctab[256];
+
+ unsigned char *flame;
+ unsigned char *theim;
+ int fwidth;
+ int fheight;
+ int top;
+ int hspread;
+ int vspread;
+ int residual;
+
+ int ihspread;
+ int ivspread;
+ int iresidual;
+ int variance;
+ int vartrend;
+
+ int delay;
+ int baseline;
+ int theimx, theimy;
+};
+
+static void
+GetXInfo(struct state *st)
+{
+ XWindowAttributes xwa;
+
+ XGetWindowAttributes(st->dpy,st->window,&xwa);
+
+ st->colormap = xwa.colormap;
+ st->depth = xwa.depth;
+ st->visual = xwa.visual;
+ st->screen = xwa.screen;
+ st->width = xwa.width;
+ st->height = xwa.height;
+
+ if (st->width%2)
+ st->width++;
+ if (st->height%2)
+ st->height++;
+}
+
+static void
+MakeImage(struct state *st)
+{
+ XGCValues gcv;
+
+ if (st->xim)
+ destroy_xshm_image (st->dpy, st->xim, &st->shminfo);
+
+ st->xim = create_xshm_image (st->dpy, st->visual, st->depth, ZPixmap,
+ &st->shminfo, st->width, st->height);
+ if (!st->xim)
+ {
+ fprintf(stderr,"%s: out of memory.\n", progname);
+ exit(1);
+ }
+
+ if (! st->gc)
+ st->gc = XCreateGC(st->dpy,st->window,0,&gcv);
+}
+
+
+static void
+InitColors(struct state *st)
+{
+ int i = 0, j = 0, red = 0, green = 0, blue = 0;
+ XColor fg;
+
+ /* Make it possible to set the color of the flames,
+ by Raymond Medeiros <ray@stommel.marine.usf.edu> and jwz.
+ */
+ fg.pixel = get_pixel_resource (st->dpy, st->colormap,
+ "foreground", "Foreground");
+ XQueryColor (st->dpy, st->colormap, &fg);
+
+ red = 255 - (fg.red >> 8);
+ green = 255 - (fg.green >> 8);
+ blue = 255 - (fg.blue >> 8);
+
+
+ for (i = 0; i < 256 * 2; i += 2)
+ {
+ XColor xcl;
+ int r = (i - red) * 3;
+ int g = (i - green) * 3;
+ int b = (i - blue) * 3;
+
+ if (r < 0) r = 0;
+ if (r > 255) r = 255;
+ if (g < 0) g = 0;
+ if (g > 255) g = 255;
+ if (b < 0) b = 0;
+ if (b > 255) b = 255;
+
+ xcl.red = (unsigned short)((r << 8) | r);
+ xcl.green = (unsigned short)((g << 8) | g);
+ xcl.blue = (unsigned short)((b << 8) | b);
+ xcl.flags = DoRed | DoGreen | DoBlue;
+
+ XAllocColor(st->dpy,st->colormap,&xcl);
+
+ st->ctab[j++] = (int)xcl.pixel;
+ }
+}
+
+
+static void
+DisplayImage(struct state *st)
+{
+ put_xshm_image(st->dpy, st->window, st->gc, st->xim, 0,(st->top - 1) << 1, 0,
+ (st->top - 1) << 1, st->width, st->height - ((st->top - 1) << 1),
+ &st->shminfo);
+}
+
+
+static void
+InitFlame(struct state *st)
+{
+ st->fwidth = st->width / 2;
+ st->fheight = st->height / 2;
+
+ if (st->flame) free (st->flame);
+ st->flame = (unsigned char *) malloc((st->fwidth + 2) * (st->fheight + 2)
+ * sizeof(unsigned char));
+
+ if (!st->flame)
+ {
+ fprintf(stderr,"%s: out of memory\n", progname);
+ exit(1);
+ }
+
+ st->top = 1;
+ st->ihspread = get_integer_resource(st->dpy, "hspread", "Integer");
+ st->ivspread = get_integer_resource(st->dpy, "vspread", "Integer");
+ st->iresidual = get_integer_resource(st->dpy, "residual", "Integer");
+ st->variance = get_integer_resource(st->dpy, "variance", "Integer");
+ st->vartrend = get_integer_resource(st->dpy, "vartrend", "Integer");
+ st->bloom = get_boolean_resource(st->dpy, "bloom", "Boolean");
+
+# define THROTTLE(VAR,NAME) \
+ if (VAR < 0 || VAR > 255) { \
+ fprintf(stderr, "%s: %s must be in the range 0-255 (not %d).\n", \
+ progname, NAME, VAR); \
+ exit(1); }
+ THROTTLE (st->ihspread, "hspread");
+ THROTTLE (st->ivspread, "vspread");
+ THROTTLE (st->iresidual,"residual");
+ THROTTLE (st->variance, "variance");
+ THROTTLE (st->vartrend, "vartrend");
+# undef THROTTLE
+
+#if 0
+ if (st->width > 2560) /* Retina displays */
+ {
+ /* #### One of these knobs must mean "make the fire be twice as tall"
+ but I can't figure out how. Changing any of the default values
+ of any of these seems to just make it all go crappy. */
+ st->ivspread = MAX (0, MIN (255, st->ivspread + 1));
+ }
+#endif
+
+ st->hspread = st->ihspread;
+ st->vspread = st->ivspread;
+ st->residual = st->iresidual;
+}
+
+
+static void
+Flame2Image16(struct state *st)
+{
+ int x,y;
+ unsigned short *ptr;
+ unsigned char *ptr1;
+ int v1,v2,v3,v4;
+
+ ptr = (unsigned short *)st->xim->data;
+ ptr += (st->top << 1) * st->width;
+ ptr1 = st->flame + 1 + (st->top * (st->fwidth + 2));
+
+ for(y = st->top; y < st->fheight; y++)
+ {
+ for( x = 0; x < st->fwidth; x++)
+ {
+ v1 = (int)*ptr1;
+ v2 = (int)*(ptr1 + 1);
+ v3 = (int)*(ptr1 + st->fwidth + 2);
+ v4 = (int)*(ptr1 + st->fwidth + 2 + 1);
+ ptr1++;
+ *ptr++ = (unsigned short)st->ctab[v1];
+ *ptr = (unsigned short)st->ctab[(v1 + v2) >> 1];
+ ptr += st->width - 1;
+ *ptr++ = (unsigned short)st->ctab[(v1 + v3) >> 1];
+ *ptr = (unsigned short)st->ctab[(v1 + v4) >> 1];
+ ptr -= st->width - 1;
+ }
+ ptr += st->width;
+ ptr1 += 2;
+ }
+}
+
+static void
+Flame2Image32(struct state *st)
+{
+ int x,y;
+ unsigned int *ptr;
+ unsigned char *ptr1;
+ int v1,v2,v3,v4;
+
+ ptr = (unsigned int *)st->xim->data;
+ ptr += (st->top << 1) * st->width;
+ ptr1 = st->flame + 1 + (st->top * (st->fwidth + 2));
+
+ for( y = st->top; y < st->fheight; y++)
+ {
+ for( x = 0; x < st->fwidth; x++)
+ {
+ v1 = (int)*ptr1;
+ v2 = (int)*(ptr1 + 1);
+ v3 = (int)*(ptr1 + st->fwidth + 2);
+ v4 = (int)*(ptr1 + st->fwidth + 2 + 1);
+ ptr1++;
+ *ptr++ = (unsigned int)st->ctab[v1];
+ *ptr = (unsigned int)st->ctab[(v1 + v2) >> 1];
+ ptr += st->width - 1;
+ *ptr++ = (unsigned int)st->ctab[(v1 + v3) >> 1];
+ *ptr = (unsigned int)st->ctab[(v1 + v4) >> 1];
+ ptr -= st->width - 1;
+ }
+ ptr += st->width;
+ ptr1 += 2;
+ }
+}
+
+static void
+Flame2Image24(struct state *st)
+{
+ int x,y;
+ unsigned char *ptr;
+ unsigned char *ptr1;
+ int v1,v2,v3,v4;
+
+ ptr = (unsigned char *)st->xim->data;
+ ptr += (st->top << 1) * st->xim->bytes_per_line;
+ ptr1 = st->flame + 1 + (st->top * (st->fwidth + 2));
+
+ for( y = st->top; y < st->fheight; y++)
+ {
+ unsigned char *last_ptr = ptr;
+ for( x = 0; x < st->fwidth; x++)
+ {
+ v1 = (int)*ptr1;
+ v2 = (int)*(ptr1 + 1);
+ v3 = (int)*(ptr1 + st->fwidth + 2);
+ v4 = (int)*(ptr1 + st->fwidth + 2 + 1);
+ ptr1++;
+
+ ptr[2] = ((unsigned int)st->ctab[v1] & 0x00FF0000) >> 16;
+ ptr[1] = ((unsigned int)st->ctab[v1] & 0x0000FF00) >> 8;
+ ptr[0] = ((unsigned int)st->ctab[v1] & 0x000000FF);
+ ptr += 3;
+
+ ptr[2] = ((unsigned int)st->ctab[(v1 + v2) >> 1] & 0x00FF0000) >> 16;
+ ptr[1] = ((unsigned int)st->ctab[(v1 + v2) >> 1] & 0x0000FF00) >> 8;
+ ptr[0] = ((unsigned int)st->ctab[(v1 + v2) >> 1] & 0x000000FF);
+ ptr += ((st->width - 1) * 3);
+
+ ptr[2] = ((unsigned int)st->ctab[(v1 + v3) >> 1] & 0x00FF0000) >> 16;
+ ptr[1] = ((unsigned int)st->ctab[(v1 + v3) >> 1] & 0x0000FF00) >> 8;
+ ptr[0] = ((unsigned int)st->ctab[(v1 + v3) >> 1] & 0x000000FF);
+ ptr += 3;
+
+ ptr[2] = ((unsigned int)st->ctab[(v1 + v4) >> 1] & 0x00FF0000) >> 16;
+ ptr[1] = ((unsigned int)st->ctab[(v1 + v4) >> 1] & 0x0000FF00) >> 8;
+ ptr[0] = ((unsigned int)st->ctab[(v1 + v4) >> 1] & 0x000000FF);
+ ptr -= ((st->width - 1) * 3);
+ }
+
+ ptr = last_ptr + (st->xim->bytes_per_line << 1);
+ ptr1 += 2;
+ }
+}
+
+static void
+Flame2Image8(struct state *st)
+{
+ int x,y;
+ unsigned char *ptr;
+ unsigned char *ptr1;
+ int v1,v2,v3,v4;
+
+ ptr = (unsigned char *)st->xim->data;
+ ptr += (st->top << 1) * st->width;
+ ptr1 = st->flame + 1 + (st->top * (st->fwidth + 2));
+
+ for(y=st->top;y<st->fheight;y++)
+ {
+ for(x=0;x<st->fwidth;x++)
+ {
+ v1 = (int)*ptr1;
+ v2 = (int)*(ptr1 + 1);
+ v3 = (int)*(ptr1 + st->fwidth + 2);
+ v4 = (int)*(ptr1 + st->fwidth + 2 + 1);
+ ptr1++;
+ *ptr++ = (unsigned char)st->ctab[v1];
+ *ptr = (unsigned char)st->ctab[(v1 + v2) >> 1];
+ ptr += st->width - 1;
+ *ptr++ = (unsigned char)st->ctab[(v1 + v3) >> 1];
+ *ptr = (unsigned char)st->ctab[(v1 + v4) >> 1];
+ ptr -= st->width - 1;
+ }
+ ptr += st->width;
+ ptr1 += 2;
+ }
+}
+
+static void
+Flame2Image1234567(struct state *st)
+{
+ int x,y;
+ unsigned char *ptr1;
+ int v1,v2,v3,v4;
+
+ ptr1 = st->flame + 1 + (st->top * (st->fwidth + 2));
+
+ for( y = st->top; y < st->fheight; y++)
+ {
+ for( x = 0; x < st->fwidth; x++)
+ {
+ v1 = (int)*ptr1;
+ v2 = (int)*(ptr1 + 1);
+ v3 = (int)*(ptr1 + st->fwidth + 2);
+ v4 = (int)*(ptr1 + st->fwidth + 2 + 1);
+ ptr1++;
+ XPutPixel(st->xim,(x << 1), (y << 1), st->ctab[v1]);
+ XPutPixel(st->xim,(x << 1) + 1,(y << 1), st->ctab[(v1 + v2) >> 1]);
+ XPutPixel(st->xim,(x << 1), (y << 1) + 1,st->ctab[(v1 + v3) >> 1]);
+ XPutPixel(st->xim,(x << 1) + 1,(y << 1) + 1,st->ctab[(v1 + v4) >> 1]);
+ }
+ }
+}
+
+static void
+Flame2Image(struct state *st)
+{
+ switch (st->xim->bits_per_pixel)
+ {
+ case 32: Flame2Image32(st); break;
+ case 24: Flame2Image24(st); break;
+ case 16: Flame2Image16(st); break;
+ case 8: Flame2Image8(st); break;
+ default:
+ if (st->xim->bits_per_pixel <= 7)
+ Flame2Image1234567(st);
+ else
+ abort();
+ break;
+ }
+}
+
+
+static void
+FlameActive(struct state *st)
+{
+ int x,v1;
+ unsigned char *ptr1;
+
+ ptr1 = st->flame + ((st->fheight + 1) * (st->fwidth + 2));
+
+ for (x = 0; x < st->fwidth + 2; x++)
+ {
+ v1 = *ptr1;
+ v1 += ((random() % st->variance) - st->vartrend);
+ *ptr1++ = v1 % 255;
+ }
+
+ if (st->bloom)
+ {
+ v1= (random() % 100);
+ if (v1 == 10)
+ st->residual += (random()%10);
+ else if (v1 == 20)
+ st->hspread += (random()%15);
+ else if (v1 == 30)
+ st->vspread += (random()%20);
+ }
+
+ st->residual = ((st->iresidual* 10) + (st->residual *90)) / 100;
+ st->hspread = ((st->ihspread * 10) + (st->hspread *90)) / 100;
+ st->vspread = ((st->ivspread * 10) + (st->vspread *90)) / 100;
+}
+
+
+static void
+FlameAdvance(struct state *st)
+{
+ int x,y;
+ unsigned char *ptr2;
+ int newtop = st->top;
+
+ for (y = st->fheight + 1; y >= st->top; y--)
+ {
+ int used = 0;
+ unsigned char *ptr1 = st->flame + 1 + (y * (st->fwidth + 2));
+ for (x = 0; x < st->fwidth; x++)
+ {
+ int v1 = (int)*ptr1;
+ int v2, v3;
+ if (v1 > 0)
+ {
+ used = 1;
+ ptr2 = ptr1 - st->fwidth - 2;
+ v3 = (v1 * st->vspread) >> 8;
+ v2 = (int)*(ptr2);
+ v2 += v3;
+ if (v2 > MAX_VAL)
+ v2 = MAX_VAL;
+
+ *(ptr2) = (unsigned char)v2;
+ v3 = (v1 * st->hspread) >> 8;
+ v2 = (int)*(ptr2 + 1);
+ v2 += v3;
+ if (v2 > MAX_VAL)
+ v2 = MAX_VAL;
+
+ *(ptr2 + 1) = (unsigned char)v2;
+ v2 = (int)*(ptr2 - 1);
+ v2 += v3;
+ if (v2 > MAX_VAL)
+ v2 = MAX_VAL;
+
+ *(ptr2 - 1) = (unsigned char)v2;
+
+ if (y < st->fheight + 1)
+ {
+ v1 = (v1 * st->residual) >> 8;
+ *ptr1 = (unsigned char)v1;
+ }
+ }
+ ptr1++;
+ if (used)
+ newtop = y - 1;
+ }
+
+ /* clean up the right gutter */
+ {
+ int v1 = (int)*ptr1;
+ v1 = (v1 * st->residual) >> 8;
+ *ptr1 = (unsigned char)v1;
+ }
+ }
+
+ st->top = newtop - 1;
+
+ if (st->top < 1)
+ st->top = 1;
+}
+
+
+static void
+FlameFill(struct state *st, int val)
+{
+ int x, y;
+ for (y = 0; y < st->fheight + 1; y++)
+ {
+ unsigned char *ptr1 = st->flame + 1 + (y * (st->fwidth + 2));
+ for (x = 0; x < st->fwidth; x++)
+ {
+ *ptr1 = val;
+ ptr1++;
+ }
+ }
+}
+
+
+static void
+FlamePasteData(struct state *st,
+ unsigned char *d, int xx, int yy, int w, int h)
+{
+ unsigned char *ptr1,*ptr2;
+ ptr2 = d;
+
+ if (xx < 0) xx = 0;
+ if (yy < 0) yy = 0;
+
+ if ((xx >= 0) &&
+ (yy >= 0) &&
+ (xx + w <= st->fwidth) &&
+ (yy + h <= st->fheight))
+ {
+ int x, y;
+ for (y = 0; y < h; y++)
+ {
+ ptr1 = st->flame + 1 + xx + ((yy + y) * (st->fwidth + 2));
+ for (x = 0; x < w; x++)
+ {
+ if (*ptr2 / 24)
+ *ptr1 += random() % (*ptr2 / 24);
+
+ ptr1++;
+ ptr2++;
+ }
+ }
+ }
+ else
+ {
+ static Bool warned = False;
+ if (!warned)
+ {
+ fprintf (stderr, "%s: st->window is %dx%d; image must be "
+ "smaller than %dx%d (not %dx%d).\n",
+ progname, st->width, st->height, st->fwidth, st->fheight, w, h);
+ warned = True;
+ }
+ }
+}
+
+
+static XImage *
+double_ximage (Display *dpy, Visual *visual, XImage *image)
+{
+ int x, y;
+ XImage *out = XCreateImage (dpy, visual, image->depth, ZPixmap, 0, 0,
+ image->width * 2, image->height * 2, 8, 0);
+ out->data = (char *) malloc (out->height * out->bytes_per_line);
+ for (y = 0; y < image->width; y++)
+ for (x = 0; x < image->height; x++)
+ {
+ unsigned long p = XGetPixel (image, x, y);
+ XPutPixel (out, x*2, y*2, p);
+ XPutPixel (out, x*2+1, y*2, p);
+ XPutPixel (out, x*2, y*2+1, p);
+ XPutPixel (out, x*2+1, y*2+1, p);
+ }
+ XDestroyImage (image);
+ return out;
+}
+
+
+static unsigned char *
+gaussian_blur (unsigned char *in, int w, int h, double r)
+{
+ unsigned char *out = malloc(w * h);
+ int rs = (int) ((r * 2.57) + 0.5);
+ int i, j;
+
+ for (i = 0; i < h; i ++)
+ for (j = 0; j < w; j++)
+ {
+ double val = 0, wsum = 0;
+ int ix, iy;
+ for (iy = i-rs; iy<i+rs+1; iy++)
+ for (ix = j-rs; ix<j+rs+1; ix++)
+ {
+ int x = MIN(w-1, MAX(0, ix));
+ int y = MIN(h-1, MAX(0, iy));
+ int dsq = (ix-j)*(ix-j)+(iy-i)*(iy-i);
+ double wght = exp (-dsq / (2*r*r)) / (M_PI*2*r*r);
+ val += in[y*w+x] * wght;
+ wsum += wght;
+ }
+ out[i*w+j] = val/wsum;
+ }
+
+ free (in);
+ return out;
+}
+
+
+static unsigned char *
+loadBitmap (struct state *st)
+{
+ int x, y;
+ unsigned char *result, *o;
+ int blur = 0;
+
+# ifdef HAVE_JWXYZ
+ const char *bitmap_name = "(default)"; /* #### always use builtin */
+# else
+ char *bitmap_name = get_string_resource (st->dpy, "bitmap", "Bitmap");
+# endif
+ XImage *image = 0;
+ if (!bitmap_name ||
+ !*bitmap_name ||
+ !strcmp(bitmap_name, "none"))
+ ;
+ else if (!strcmp(bitmap_name, "(default)")) /* use the builtin */
+ image = image_data_to_ximage (st->dpy, st->visual,
+ bob_png, sizeof(bob_png));
+ else
+ image = file_to_ximage (st->dpy, st->visual, bitmap_name);
+
+ if (! image) return 0;
+
+ while (image->width < st->width / 10 &&
+ image->height < st->height / 10)
+ {
+ image = double_ximage (st->dpy, st->visual, image);
+ blur++;
+ }
+
+ result = (unsigned char *) malloc (image->width * image->height);
+ o = result;
+ for (y = 0; y < image->height; y++)
+ for (x = 0; x < image->width; x++)
+ {
+ unsigned long agbr = XGetPixel (image, x, image->height - y - 1);
+ unsigned long a = (agbr >> 24) & 0xFF;
+ unsigned long gray = (a == 0
+ ? 0xFF
+ : ((((agbr >> 16) & 0xFF) +
+ ((agbr >> 8) & 0xFF) +
+ ((agbr >> 0) & 0xFF))
+ / 3));
+ if (gray < 96) gray /= 2; /* a little more contrast */
+ *o++ = 255 - gray;
+ }
+
+ /* If we enlarged the image, file off the sharp edges. */
+ if (blur > 0)
+ result = gaussian_blur (result, image->width, image->height, blur * 1.7);
+
+ st->theimx = image->width;
+ st->theimy = image->height;
+ XDestroyImage (image);
+ return result;
+}
+
+
+static void *
+xflame_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = win;
+ st->baseline = get_integer_resource (dpy, "bitmapBaseline", "Integer");
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+ st->xim = NULL;
+ st->top = 1;
+ st->flame = NULL;
+
+ GetXInfo(st);
+ InitColors(st);
+ st->theim = loadBitmap(st);
+
+ MakeImage(st);
+ InitFlame(st);
+ FlameFill(st,0);
+
+ return st;
+}
+
+static unsigned long
+xflame_draw (Display *dpy, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ FlameActive(st);
+
+ if (st->theim)
+ FlamePasteData(st, st->theim, (st->fwidth - st->theimx) / 2,
+ st->fheight - st->theimy - st->baseline, st->theimx, st->theimy);
+
+ FlameAdvance(st);
+ Flame2Image(st);
+ DisplayImage(st);
+
+ return st->delay;
+}
+
+static void
+xflame_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ GetXInfo(st);
+ MakeImage(st);
+ InitFlame(st);
+ FlameFill(st,0);
+ XClearWindow (dpy, window);
+}
+
+static Bool
+xflame_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+xflame_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+
+
+static const char *xflame_defaults [] = {
+ ".background: black",
+ ".foreground: #FFAF5F",
+ "*fpsTop: true",
+ "*fpsSolid: true",
+ "*bitmap: (default)",
+ "*bitmapBaseline: 20",
+ "*delay: 10000",
+ "*hspread: 30",
+ "*vspread: 97",
+ "*residual: 99",
+ "*variance: 50",
+ "*vartrend: 20",
+ "*bloom: True",
+
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: False", /* xshm turns out not to help. */
+#endif /* HAVE_XSHM_EXTENSION */
+ 0
+};
+
+static XrmOptionDescRec xflame_options [] = {
+ { "-foreground",".foreground", XrmoptionSepArg, 0 },
+ { "-fg", ".foreground", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-bitmap", ".bitmap", XrmoptionSepArg, 0 },
+ { "-baseline", ".bitmapBaseline", XrmoptionSepArg, 0 },
+ { "-hspread", ".hspread", XrmoptionSepArg, 0 },
+ { "-vspread", ".vspread", XrmoptionSepArg, 0 },
+ { "-residual", ".residual", XrmoptionSepArg, 0 },
+ { "-variance", ".variance", XrmoptionSepArg, 0 },
+ { "-vartrend", ".vartrend", XrmoptionSepArg, 0 },
+ { "-bloom", ".bloom", XrmoptionNoArg, "True" },
+ { "-no-bloom", ".bloom", XrmoptionNoArg, "False" },
+#ifdef HAVE_XSHM_EXTENSION
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("XFlame", xflame)
diff --git a/hacks/xflame.man b/hacks/xflame.man
new file mode 100644
index 0000000..faba0af
--- /dev/null
+++ b/hacks/xflame.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "27-Feb-00" "X Version 11"
+.SH NAME
+xflame - draws animated flames
+.SH SYNOPSIS
+.B xflame
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-foreground \fIcolor\fP]
+[\-hspread \fIint\fP] [\-vspread \fIint\fP]
+[\-residual \fIint\fP] [\-variance \fIint\fP] [\-vartrend \fIint\fP]
+[\-bloom \| \-no\-bloom]
+[\-bitmap \fIxbm\-file\fP] [\-baseline \fIint\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIxflame\fP program draws animated flames across the bottom of the
+screen. The flames occasionally flare up. If a bitmap is specified,
+that image will float above the flames, burning.
+.SH OPTIONS
+.I xflame
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-foreground \fIcolor\fP\fP or \fB\-fg\fP \fIcolor\fP\fP
+The color of the flames; default red. (The background color is always black.)
+.TP 8
+.B \-bitmap \fIfilename\fP\fP
+Specifies the bitmap file to use (a monochrome XBM file.)
+The name "none" means not to use a bitmap at all.
+If unspecified, a built-in image will be used.
+.PP
+The other options are arcane. If someone would care to document them,
+that would be great.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1996-1999 by Carsten Haitzler. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Primarily written by Carsten Haitzler <raster@redhat.com>.
+Modified over the years by Rahul Jain <rahul@rice.edu>,
+Daniel Zahn <stumpy@religions.com>, and Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/ximage-loader.c b/hacks/ximage-loader.c
new file mode 100644
index 0000000..382699b
--- /dev/null
+++ b/hacks/ximage-loader.c
@@ -0,0 +1,686 @@
+/* ximage-loader.c --- converts image files or data to XImages or Pixmap.
+ * xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+#endif
+
+#include "ximage-loader.h"
+
+#if defined(HAVE_GDK_PIXBUF) || defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# undef HAVE_LIBPNG
+#endif
+
+#ifdef HAVE_COCOA
+# include "grabscreen.h" /* for osx_load_image_file() */
+#endif
+
+#ifdef HAVE_GDK_PIXBUF
+# include <gdk-pixbuf/gdk-pixbuf.h>
+# ifdef HAVE_GTK2
+# include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else /* !HAVE_GTK2 */
+# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
+#endif /* HAVE_GDK_PIXBUF */
+
+#ifdef HAVE_LIBPNG
+# include <png.h>
+#endif
+
+#ifdef HAVE_ANDROID
+ /* So that debug output shows up in logcat... */
+extern void Log(const char *format, ...);
+# undef fprintf
+# define fprintf(S, ...) Log(__VA_ARGS__)
+#endif
+
+extern char *progname;
+
+static Bool
+bigendian (void)
+{
+ union { int i; char c[sizeof(int)]; } u;
+ u.i = 1;
+ return !u.c[0];
+}
+
+
+#ifdef HAVE_GDK_PIXBUF
+
+/* Loads the image to an XImage, RGBA -- GDK Pixbuf version.
+ */
+static XImage *
+make_ximage (Display *dpy, Visual *visual, const char *filename,
+ const unsigned char *image_data, unsigned long data_size)
+{
+ GdkPixbuf *pb;
+ static int initted = 0;
+# ifdef HAVE_GTK2
+ GError *gerr = NULL;
+# endif
+
+ if (!initted)
+ {
+# ifdef HAVE_GTK2
+# if !GLIB_CHECK_VERSION(2, 36 ,0)
+ g_type_init ();
+# endif
+# endif
+ gdk_pixbuf_xlib_init (dpy, DefaultScreen (dpy));
+ xlib_rgb_init (dpy, DefaultScreenOfDisplay (dpy));
+ initted = 1;
+ }
+
+ if (filename)
+ {
+# ifdef HAVE_GTK2
+ pb = gdk_pixbuf_new_from_file (filename, &gerr);
+ if (!pb)
+ {
+ fprintf (stderr, "%s: %s\n", progname, gerr->message);
+ return 0;
+ }
+# else
+ pb = gdk_pixbuf_new_from_file (filename);
+ if (!pb)
+ {
+ fprintf (stderr, "%s: GDK unable to load %s: %s\n",
+ progname, filename, (gerr ? gerr->message : "?"));
+ return 0;
+ }
+# endif /* HAVE_GTK2 */
+ }
+ else
+ {
+# ifdef HAVE_GTK2
+ GInputStream *s =
+ g_memory_input_stream_new_from_data (image_data, data_size, 0);
+ pb = gdk_pixbuf_new_from_stream (s, 0, &gerr);
+
+ g_input_stream_close (s, NULL, NULL);
+ g_object_unref (s);
+
+ if (! pb)
+ {
+ /* fprintf (stderr, "%s: GDK unable to parse image data: %s\n",
+ progname, (gerr ? gerr->message : "?")); */
+ return 0;
+ }
+# else /* !HAVE_GTK2 */
+ fprintf (stderr, "%s: image loading not supported with GTK 1.x\n",
+ progname);
+ return 0;
+# endif /* !HAVE_GTK2 */
+ }
+
+ if (!pb) abort();
+
+ {
+ XImage *image;
+ int w = gdk_pixbuf_get_width (pb);
+ int h = gdk_pixbuf_get_height (pb);
+ guchar *row = gdk_pixbuf_get_pixels (pb);
+ int stride = gdk_pixbuf_get_rowstride (pb);
+ int chan = gdk_pixbuf_get_n_channels (pb);
+ int x, y;
+
+ image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0, w, h, 32, 0);
+ image->data = (char *) malloc(h * image->bytes_per_line);
+
+ /* Set the bit order in the XImage structure to whatever the
+ local host's native bit order is.
+ */
+ image->bitmap_bit_order =
+ image->byte_order =
+ (bigendian() ? MSBFirst : LSBFirst);
+
+ if (!image->data)
+ {
+ fprintf (stderr, "%s: out of memory (%d x %d)\n", progname, w, h);
+ return 0;
+ }
+
+ for (y = 0; y < h; y++)
+ {
+ guchar *i = row;
+ for (x = 0; x < w; x++)
+ {
+ unsigned long rgba = 0;
+ switch (chan) {
+ case 1:
+ rgba = ((0xFF << 24) |
+ (*i << 16) |
+ (*i << 8) |
+ *i);
+ i++;
+ break;
+ case 3:
+ rgba = ((0xFF << 24) |
+ (i[2] << 16) |
+ (i[1] << 8) |
+ i[0]);
+ i += 3;
+ break;
+ case 4:
+ rgba = ((i[3] << 24) |
+ (i[2] << 16) |
+ (i[1] << 8) |
+ i[0]);
+ i += 4;
+ break;
+ default:
+ abort();
+ break;
+ }
+ XPutPixel (image, x, y, rgba);
+ }
+ row += stride;
+ }
+
+ g_object_unref (pb);
+ return image;
+ }
+}
+
+#elif defined(HAVE_JWXYZ) /* MacOS, iOS or Android */
+
+/* Loads the image to an XImage, RGBA -- MacOS, iOS or Android version.
+ */
+static XImage *
+make_ximage (Display *dpy, Visual *visual, const char *filename,
+ const unsigned char *image_data, unsigned long data_size)
+{
+ XImage *ximage = 0;
+
+ if (filename)
+ {
+# ifdef HAVE_COCOA /* MacOS */
+ XRectangle geom;
+ Screen *screen = DefaultScreenOfDisplay (dpy);
+ Window window = RootWindowOfScreen (screen);
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ Pixmap pixmap =
+ XCreatePixmap (dpy, window, xgwa.width, xgwa.height, xgwa.depth);
+ int x, y;
+
+ if (! osx_load_image_file (screen, window, pixmap, filename, &geom))
+ {
+ fprintf (stderr, "%s: %s failed\n", progname, filename);
+ return 0;
+ }
+
+ ximage = XGetImage (dpy, pixmap, geom.x, geom.y,
+ geom.width, geom.height,
+ ~0L, ZPixmap);
+ if (!ximage) abort();
+
+ /* Have to convert ABGR to RGBA */
+ for (y = 0; y < ximage->height; y++)
+ for (x = 0; x < ximage->width; x++)
+ {
+ unsigned long p = XGetPixel (ximage, x, y);
+ unsigned long a = (p >> 24) & 0xFF;
+ unsigned long b = (p >> 16) & 0xFF;
+ unsigned long g = (p >> 8) & 0xFF;
+ unsigned long r = (p >> 0) & 0xFF;
+ p = (r << 24) | (g << 16) | (b << 8) | (a << 0);
+ XPutPixel (ximage, x, y, p);
+ }
+
+ XFreePixmap (dpy, pixmap);
+
+# else /* !HAVE_COCOA -- iOS or Android. */
+ fprintf (stderr, "%s: image file loading not supported\n", progname);
+ return 0;
+# endif /* !HAVE_COCOA */
+ }
+ else
+ {
+ ximage = jwxyz_png_to_ximage (dpy, visual, image_data, data_size);
+ }
+
+ return ximage;
+}
+
+#elif defined(HAVE_LIBPNG)
+
+typedef struct {
+ const unsigned char *buf;
+ png_size_t siz, ptr;
+} png_read_closure;
+
+static void
+png_reader_fn (png_structp png_ptr, png_bytep buf, png_size_t siz)
+{
+ png_read_closure *r = png_get_io_ptr (png_ptr);
+ if (siz > r->siz - r->ptr)
+ png_error (png_ptr, "PNG internal read error");
+ memcpy (buf, r->buf + r->ptr, siz);
+ r->ptr += siz;
+}
+
+
+/* Loads the image to an XImage, RGBA -- libpng version.
+ */
+static XImage *
+make_ximage (Display *dpy, Visual *visual,
+ const char *filename, const unsigned char *image_data,
+ unsigned long data_size)
+{
+ XImage *image = 0;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_infop end_info;
+ png_uint_32 width, height, channels;
+ int bit_depth, color_type, interlace_type;
+ FILE *fp = 0;
+
+ png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
+ if (!png_ptr) return 0;
+
+ info_ptr = png_create_info_struct (png_ptr);
+ if (!info_ptr)
+ {
+ png_destroy_read_struct (&png_ptr, 0, 0);
+ return 0;
+ }
+
+ end_info = png_create_info_struct (png_ptr);
+ if (!end_info)
+ {
+ png_destroy_read_struct (&png_ptr, &info_ptr, 0);
+ return 0;
+ }
+
+ if (setjmp (png_jmpbuf(png_ptr)))
+ {
+ png_destroy_read_struct (&png_ptr, &info_ptr, &end_info);
+ return 0;
+ }
+
+ if (filename)
+ {
+ fp = fopen (filename, "r");
+ if (! fp)
+ {
+ fprintf (stderr, "%s: unable to read %s\n", progname, filename);
+ return 0;
+ }
+ png_init_io (png_ptr, fp);
+ }
+ else
+ {
+ png_read_closure closure;
+ closure.buf = image_data;
+ closure.siz = data_size;
+ closure.ptr = 0;
+ png_set_read_fn (png_ptr, (void *) &closure, png_reader_fn);
+ }
+
+ png_read_info (png_ptr, info_ptr);
+ png_get_IHDR (png_ptr, info_ptr,
+ &width, &height, &bit_depth, &color_type,
+ &interlace_type, 0, 0);
+
+ png_set_strip_16 (png_ptr); /* Truncate 16 bits per component to 8 */
+ png_set_packing (png_ptr); /* Unpack to 1 pixel per byte */
+
+# if 0
+ if (color_type == PNG_COLOR_TYPE_PALETTE) /* Colormap to RGB */
+ png_set_palette_rgb (png_ptr);
+
+ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) /* Mono to 8bit */
+ png_set_gray_1_2_4_to_8 (png_ptr);
+# endif
+
+ if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) /* Fix weird alpha */
+ png_set_tRNS_to_alpha (png_ptr);
+
+ /* At least 8 bits deep */
+ if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8)
+ png_set_expand (png_ptr);
+
+ if (bit_depth == 8 && /* Convert RGB to RGBA */
+ (color_type == PNG_COLOR_TYPE_RGB ||
+ color_type == PNG_COLOR_TYPE_PALETTE))
+ png_set_filler (png_ptr, 0xFF, PNG_FILLER_AFTER);
+
+ /* Grayscale to color */
+ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+ png_set_expand (png_ptr);
+
+
+ /* Convert graysale to color */
+ if (color_type == PNG_COLOR_TYPE_GRAY ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ png_set_gray_to_rgb (png_ptr);
+
+# if 0
+ {
+ png_color_16 *bg;
+ if (png_get_bKGD (png_ptr, info_ptr, &bg))
+ png_set_background (png_ptr, bg, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
+ }
+# endif
+
+ /* Commit */
+ png_read_update_info (png_ptr, info_ptr);
+
+ channels = png_get_channels (png_ptr, info_ptr);
+
+ {
+ png_bytep *rows = png_malloc (png_ptr, height * sizeof(*rows));
+ int x, y;
+ for (y = 0; y < height; y++)
+ rows[y] = png_malloc (png_ptr, png_get_rowbytes (png_ptr, info_ptr));
+ png_read_image (png_ptr, rows);
+ png_read_end (png_ptr, info_ptr);
+
+ image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0,
+ width, height, 32, 0);
+ image->data = (char *) malloc (height * image->bytes_per_line);
+
+ /* Set the bit order in the XImage structure to whatever the
+ local host's native bit order is.
+ */
+ image->bitmap_bit_order =
+ image->byte_order =
+ (bigendian() ? MSBFirst : LSBFirst);
+
+ if (!image->data)
+ {
+ fprintf (stderr, "%s: out of memory (%lu x %lu)\n",
+ progname, (unsigned long)width, (unsigned long)height);
+ return 0;
+ }
+
+ for (y = 0; y < height; y++)
+ {
+ png_bytep i = rows[y];
+ for (x = 0; x < width; x++)
+ {
+ unsigned long rgba;
+ switch (channels) {
+ case 4:
+ rgba = ((i[3] << 24) |
+ (i[2] << 16) |
+ (i[1] << 8) |
+ i[0]);
+ break;
+ case 3:
+ rgba = ((0xFF << 24) |
+ (i[2] << 16) |
+ (i[1] << 8) |
+ i[0]);
+ break;
+ case 2:
+ rgba = ((i[1] << 24) |
+ (i[0] << 16) |
+ (i[0] << 8) |
+ i[0]);
+ break;
+ case 1:
+ rgba = ((0xFF << 24) |
+ (i[0] << 16) |
+ (i[0] << 8) |
+ i[0]);
+ break;
+ default:
+ abort();
+ }
+ XPutPixel (image, x, y, rgba);
+ i += channels;
+ }
+ png_free (png_ptr, rows[y]);
+ }
+
+ png_free (png_ptr, rows);
+ }
+
+ png_destroy_read_struct (&png_ptr, &info_ptr, &end_info);
+ if (fp) fclose (fp);
+
+ return image;
+}
+
+
+#else /* No image loaders! */
+
+static XImage *
+make_ximage (Display *dpy, Visual *visual,
+ const char *filename, const unsigned char *image_data,
+ unsigned long data_size)
+{
+ fprintf (stderr, "%s: no image loading support!\n", progname);
+ return 0;
+}
+
+#endif /* no loaders */
+
+
+/* Given a bitmask, returns the position and width of the field.
+ */
+static void
+decode_mask (unsigned long mask, unsigned long *pos_ret,
+ unsigned long *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+/* Loads the image to a Pixmap and optional 1-bit mask.
+ */
+static Pixmap
+make_pixmap (Display *dpy, Window window,
+ const char *filename,
+ const unsigned char *image_data, unsigned long data_size,
+ int *width_ret, int *height_ret, Pixmap *mask_ret)
+{
+ XWindowAttributes xgwa;
+ XImage *in, *out, *mask = 0;
+ Pixmap pixmap;
+ XGCValues gcv;
+ GC gc;
+ int x, y;
+
+ unsigned long crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+ unsigned long srpos=0, sgpos=0, sbpos=0;
+ unsigned long srmsk=0, sgmsk=0, sbmsk=0;
+ unsigned long srsiz=0, sgsiz=0, sbsiz=0;
+
+# ifdef HAVE_JWXYZ
+ // BlackPixel has alpha: 0xFF000000.
+ unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
+#else
+ unsigned long black = 0;
+# endif
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ in = make_ximage (dpy, xgwa.visual, filename, image_data, data_size);
+ if (!in) return 0;
+
+ /* Create a new image in the depth and bit-order of the server. */
+ out = XCreateImage (dpy, xgwa.visual, xgwa.depth, ZPixmap, 0, 0,
+ in->width, in->height, 8, 0);
+
+ out->bitmap_bit_order = in->bitmap_bit_order;
+ out->byte_order = in->byte_order;
+
+ out->bitmap_bit_order = BitmapBitOrder (dpy);
+ out->byte_order = ImageByteOrder (dpy);
+
+ out->data = (char *) malloc (out->height * out->bytes_per_line);
+ if (!out->data) abort();
+
+ if (mask_ret)
+ {
+ mask = XCreateImage (dpy, xgwa.visual, 1, XYPixmap, 0, 0,
+ in->width, in->height, 8, 0);
+ mask->byte_order = in->byte_order;
+ mask->data = (char *) malloc (mask->height * mask->bytes_per_line);
+ }
+
+ /* Find the server's color masks.
+ */
+ srmsk = out->red_mask;
+ sgmsk = out->green_mask;
+ sbmsk = out->blue_mask;
+
+ if (!(srmsk && sgmsk && sbmsk)) abort(); /* No server color masks? */
+
+ decode_mask (srmsk, &srpos, &srsiz);
+ decode_mask (sgmsk, &sgpos, &sgsiz);
+ decode_mask (sbmsk, &sbpos, &sbsiz);
+
+ /* 'in' is RGBA in client endianness. Convert to what the server wants. */
+ if (bigendian())
+ crpos = 24, cgpos = 16, cbpos = 8, capos = 0;
+ else
+ crpos = 0, cgpos = 8, cbpos = 16, capos = 24;
+
+ for (y = 0; y < in->height; y++)
+ for (x = 0; x < in->width; x++)
+ {
+ unsigned long p = XGetPixel (in, x, y);
+ unsigned char a = (p >> capos) & 0xFF;
+ unsigned char b = (p >> cbpos) & 0xFF;
+ unsigned char g = (p >> cgpos) & 0xFF;
+ unsigned char r = (p >> crpos) & 0xFF;
+ XPutPixel (out, x, y, ((r << srpos) |
+ (g << sgpos) |
+ (b << sbpos) |
+ black));
+ if (mask)
+ XPutPixel (mask, x, y, (a ? 1 : 0));
+ }
+
+ XDestroyImage (in);
+ in = 0;
+
+ pixmap = XCreatePixmap (dpy, window, out->width, out->height, xgwa.depth);
+ gc = XCreateGC (dpy, pixmap, 0, &gcv);
+ XPutImage (dpy, pixmap, gc, out, 0, 0, 0, 0, out->width, out->height);
+ XFreeGC (dpy, gc);
+
+ if (mask)
+ {
+ Pixmap p2 = XCreatePixmap (dpy, window, mask->width, mask->height, 1);
+ gcv.foreground = 1;
+ gcv.background = 0;
+ gc = XCreateGC (dpy, p2, GCForeground|GCBackground, &gcv);
+ XPutImage (dpy, p2, gc, mask, 0, 0, 0, 0, mask->width, mask->height);
+ XFreeGC (dpy, gc);
+ XDestroyImage (mask);
+ mask = 0;
+ *mask_ret = p2;
+ }
+
+ if (width_ret) *width_ret = out->width;
+ if (height_ret) *height_ret = out->height;
+
+ XDestroyImage (out);
+
+ return pixmap;
+}
+
+
+/* Textures are upside down, so invert XImages before returning them.
+ */
+static void
+flip_ximage (XImage *ximage)
+{
+ char *data2, *in, *out;
+ int y;
+
+ if (!ximage) return;
+ data2 = malloc (ximage->bytes_per_line * ximage->height);
+ if (!data2) abort();
+ in = ximage->data;
+ out = data2 + ximage->bytes_per_line * (ximage->height - 1);
+ for (y = 0; y < ximage->height; y++)
+ {
+ memcpy (out, in, ximage->bytes_per_line);
+ in += ximage->bytes_per_line;
+ out -= ximage->bytes_per_line;
+ }
+ free (ximage->data);
+ ximage->data = data2;
+}
+
+
+Pixmap
+image_data_to_pixmap (Display *dpy, Window window,
+ const unsigned char *image_data, unsigned long data_size,
+ int *width_ret, int *height_ret,
+ Pixmap *mask_ret)
+{
+ return make_pixmap (dpy, window, 0, image_data, data_size,
+ width_ret, height_ret, mask_ret);
+}
+
+Pixmap
+file_to_pixmap (Display *dpy, Window window, const char *filename,
+ int *width_ret, int *height_ret,
+ Pixmap *mask_ret)
+{
+ return make_pixmap (dpy, window, filename, 0, 0,
+ width_ret, height_ret, mask_ret);
+}
+
+
+/* This XImage has RGBA data, which is what OpenGL code typically expects.
+ Also it is upside down: the origin is at the bottom left of the image.
+ X11 typically expects 0RGB as it has no notion of alpha, only 1-bit masks.
+ With X11 code, you should probably use the _pixmap routines instead.
+ */
+XImage *
+image_data_to_ximage (Display *dpy, Visual *visual,
+ const unsigned char *image_data,
+ unsigned long data_size)
+{
+ XImage *ximage = make_ximage (dpy, visual, 0, image_data, data_size);
+ flip_ximage (ximage);
+ return ximage;
+}
+
+XImage *
+file_to_ximage (Display *dpy, Visual *visual, const char *filename)
+{
+ XImage *ximage = make_ximage (dpy, visual, filename, 0, 0);
+ flip_ximage (ximage);
+ return ximage;
+}
diff --git a/hacks/ximage-loader.h b/hacks/ximage-loader.h
new file mode 100644
index 0000000..bed163f
--- /dev/null
+++ b/hacks/ximage-loader.h
@@ -0,0 +1,37 @@
+/* ximage-loader.h --- converts XPM data to Pixmaps.
+ * xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef _XIMAGE_LOADER_H_
+#define _XIMAGE_LOADER_H_
+
+extern Pixmap file_to_pixmap (Display *, Window, const char *filename,
+ int *width_ret, int *height_ret,
+ Pixmap *mask_ret);
+
+extern Pixmap image_data_to_pixmap (Display *, Window,
+ const unsigned char *image_data,
+ unsigned long data_size,
+ int *width_ret, int *height_ret,
+ Pixmap *mask_ret);
+
+/* This XImage has RGBA data, which is what OpenGL code typically expects.
+ Also it is upside down: the origin is at the bottom left of the image.
+ X11 typically expects 0RGB as it has no notion of alpha, only 1-bit masks.
+ With X11 code, you should probably use the _pixmap routines instead.
+ */
+extern XImage *image_data_to_ximage (Display *, Visual *,
+ const unsigned char *image_data,
+ unsigned long data_size);
+
+extern XImage *file_to_ximage (Display *, Visual *, const char *filename);
+
+#endif /* _XIMAGE_LOADER_H_ */
diff --git a/hacks/xjack.c b/hacks/xjack.c
new file mode 100644
index 0000000..f5a3eb7
--- /dev/null
+++ b/hacks/xjack.c
@@ -0,0 +1,487 @@
+/* xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Wendy, let me explain something to you. Whenever you come in here and
+ * interrupt me, you're BREAKING my CONCENTRATION. You're DISTRACTING me!
+ * And it will then take me time to get back to where I was. You understand?
+ * Now, we're going to make a new rule. When you come in here and you hear
+ * me typing, or whether you DON'T hear me typing, or whatever the FUCK you
+ * hear me doing; when I'm in here, it means that I am working, THAT means
+ * don't come in! Now, do you think you can handle that?
+ */
+
+#include <ctype.h>
+#include "screenhack.h"
+
+static const char *source = "All work and no play makes Jack a dull boy. ";
+/* If you're here because you're thinking about making the above string be
+ customizable, then you don't get the joke. You loser. */
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ XFontStruct *font;
+ GC gc;
+
+ const char *s;
+ int columns, rows; /* characters */
+ int left, right; /* characters */
+ int char_width, line_height; /* pixels */
+ int x, y; /* characters */
+ int mode;
+ int hspace; /* pixels */
+ int vspace; /* pixels */
+ Bool break_para;
+ Bool caps;
+ int sentences;
+ int paras;
+ int scrolling;
+ int subscrolling;
+ int pining;
+
+ int delay;
+};
+
+
+static void
+xjack_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->columns = (st->xgwa.width - st->hspace - st->hspace) / st->char_width;
+ st->rows = (st->xgwa.height - st->vspace - st->vspace) / st->line_height;
+ st->rows--;
+ st->columns--;
+
+ /* If the window is stupidly small, just truncate. */
+ if (st->rows < 4) st->rows = 4;
+ if (st->columns < 12) st->columns = 12;
+
+ if (st->y > st->rows) st->y = st->rows-1;
+ if (st->x > st->columns) st->x = st->columns-2;
+
+ if (st->right > st->columns) st->right = st->columns;
+ if (st->left > st->columns-20) st->left = st->columns-20;
+ if (st->left < 0) st->left = 0;
+
+ XClearWindow (st->dpy, st->window);
+}
+
+
+static void *
+xjack_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ char *fontname;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->s = source;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ fontname = get_string_resource (st->dpy, "font", "Font");
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ if (st->xgwa.width <= 480)
+ fontname = "-*-courier-medium-r-*-*-*-180-*-*-m-*-*-*";
+
+ st->font = load_font_retry (st->dpy, fontname);
+ if (!st->font) abort();
+
+ gcv.font = st->font->fid;
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ gcv.background = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->gc = XCreateGC (st->dpy, st->window,
+ (GCFont | GCForeground | GCBackground), &gcv);
+
+ st->char_width =
+ (st->font->per_char
+ ? st->font->per_char['n'-st->font->min_char_or_byte2].rbearing
+ : st->font->min_bounds.rbearing);
+ st->line_height = st->font->ascent + st->font->descent + 1;
+
+ xjack_reshape (dpy, window, st, st->xgwa.width, st->xgwa.height);
+
+ st->left = 0xFF & (random() % ((st->columns / 2)+1));
+ st->right = st->left + (0xFF & (random() % (st->columns - st->left)
+ + 10));
+ if (st->right < st->left + 10) st->right = st->left + 10;
+ if (st->right > st->columns) st->right = st->columns;
+
+ st->x = st->left;
+ st->y = 0;
+
+ if (st->xgwa.width > 200 && st->xgwa.height > 200)
+ st->hspace = st->vspace = 40;
+
+ return st;
+}
+
+static unsigned long
+xjack_scroll (struct state *st)
+{
+ st->break_para = 0;
+ if (st->subscrolling)
+ {
+ int inc = st->line_height / 7;
+ XCopyArea (st->dpy, st->window, st->window, st->gc,
+ 0, inc,
+ st->xgwa.width, st->xgwa.height - inc,
+ 0, 0);
+
+ /* See? It's OK. He saw it on the television. */
+ XClearArea (st->dpy, st->window,
+ 0, st->xgwa.height - inc, st->xgwa.width, inc,
+ False);
+
+ st->subscrolling -= inc;
+ if (st->subscrolling <= 0)
+ st->subscrolling = 0;
+ if (st->subscrolling == 0)
+ {
+ if (st->scrolling > 0)
+ st->scrolling--;
+ st->y--;
+ }
+ return st->delay / 1000;
+ }
+ else if (st->scrolling)
+ st->subscrolling = st->line_height;
+
+ if (st->y < 0)
+ st->y = 0;
+ else if (st->y >= st->rows-1)
+ st->y = st->rows-1;
+
+ return st->delay;
+}
+
+static unsigned long
+xjack_pine (struct state *st)
+{
+ /* See also http://catalog.com/hopkins/unix-haters/login.html */
+ const char *n1 = "NFS server overlook not responding, still trying...";
+ const char *n2 = "NFS server overlook ok.";
+ int prev = st->pining;
+
+ if (!st->pining)
+ st->pining = 1 + (random() % 3);
+
+ if (prev)
+ while (*n2)
+ {
+ XDrawString (st->dpy, st->window, st->gc,
+ (st->x * st->char_width) + st->hspace,
+ ((st->y * st->line_height) + st->vspace
+ + st->font->ascent),
+ (char *) n2, 1);
+ st->x++;
+ if (st->x >= st->columns) st->x = 0, st->y++;
+ n2++;
+ }
+ st->y++;
+ st->x = 0;
+ st->pining--;
+
+ if (st->pining)
+ while (*n1)
+ {
+ XDrawString (st->dpy, st->window, st->gc,
+ (st->x * st->char_width) + st->hspace,
+ ((st->y * st->line_height) + st->vspace
+ + st->font->ascent),
+ (char *) n1, 1);
+ st->x++;
+ if (st->x >= st->columns) st->x = 0, st->y++;
+ n1++;
+ }
+
+ return 5000000;
+}
+
+
+static unsigned long
+xjack_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->delay;
+ int word_length = 0;
+ const char *s2;
+
+ if (st->scrolling)
+ return xjack_scroll (st);
+ if (st->pining)
+ return xjack_pine (st);
+
+ for (s2 = st->s; *s2 && *s2 != ' '; s2++)
+ word_length++;
+
+ if (st->break_para ||
+ (*st->s != ' ' &&
+ (st->x + word_length) >= st->right))
+ {
+ st->x = st->left;
+ st->y++;
+
+ if (st->break_para)
+ st->y++;
+
+ st->break_para = 0;
+
+ if (st->mode == 1 || st->mode == 2)
+ {
+ /* 1 = left margin goes southwest; 2 = southeast */
+ st->left += (st->mode == 1 ? 1 : -1);
+ if (st->left >= st->right - 10)
+ {
+ if ((st->right < (st->columns - 10)) && (random() & 1))
+ st->right += (0xFF & (random() % (st->columns - st->right)));
+ else
+ st->mode = 2;
+ }
+ else if (st->left <= 0)
+ {
+ st->left = 0;
+ st->mode = 1;
+ }
+ }
+ else if (st->mode == 3 || st->mode == 4)
+ {
+ /* 3 = right margin goes southeast; 4 = southwest */
+ st->right += (st->mode == 3 ? 1 : -1);
+ if (st->right >= st->columns)
+ {
+ st->right = st->columns;
+ st->mode = 4;
+ }
+ else if (st->right <= st->left + 10)
+ st->mode = 3;
+ }
+
+ if (st->y >= st->rows-1) /* bottom of page */
+ {
+# if 0 /* Nah, this looks bad. */
+
+ /* scroll by 1-5 lines */
+ st->scrolling = (random() % 5 ? 0 : (0xFF & (random() % 5))) + 1;
+
+ if (st->break_para)
+ st->scrolling++;
+
+ /* but sometimes scroll by a whole page */
+ if (0 == (random() % 100))
+ st->scrolling += st->rows;
+# else
+ st->scrolling = 1;
+# endif
+
+ return xjack_scroll (st);
+ }
+ }
+
+ if (*st->s != ' ')
+ {
+ char c = *st->s;
+ int xshift = 0, yshift = 0;
+ if (0 == random() % 50)
+ {
+ xshift = random() % ((st->char_width / 3) + 1); /* mis-strike */
+ yshift = random() % ((st->line_height / 6) + 1);
+ if (0 == (random() % 3))
+ yshift *= 2;
+ if (random() & 1)
+ xshift = -xshift;
+ if (random() & 1)
+ yshift = -yshift;
+ }
+
+ if (0 == (random() % 250)) /* introduce adjascent-key typo */
+ {
+ static const char * const typo[] = {
+ "asqw", "ASQW", "bgvhn", "cxdfv", "dserfcx", "ewsdrf",
+ "Jhuikmn", "kjiol,m", "lkop;.,", "mnjk,", "nbhjm", "oiklp09",
+ "pol;(-0", "redft54", "sawedxz", "uyhji87", "wqase32",
+ "yuhgt67", ".,l;/", 0 };
+ int i = 0;
+ while (typo[i] && typo[i][0] != c)
+ i++;
+ if (typo[i])
+ c = typo[i][0xFF & ((random() % strlen(typo[i]+1)) + 1)];
+ }
+
+ /* caps typo */
+ if (c >= 'a' && c <= 'z' && (st->caps || 0 == (random() % 350)))
+ {
+ c -= ('a'-'A');
+ if (c == 'O' && random() & 1)
+ c = '0';
+ }
+
+ OVERSTRIKE:
+ XDrawString (st->dpy, st->window, st->gc,
+ (st->x * st->char_width) + st->hspace + xshift,
+ ((st->y * st->line_height) + st->vspace + st->font->ascent
+ + yshift),
+ &c, 1);
+ if (xshift == 0 && yshift == 0 && (0 == (random() & 3000)))
+ {
+ if (random() & 1)
+ xshift--;
+ else
+ yshift--;
+ goto OVERSTRIKE;
+ }
+
+ if ((tolower(c) != tolower(*st->s))
+ ? (0 == (random() % 10)) /* backup to correct */
+ : (0 == (random() % 400))) /* fail to advance */
+ {
+ st->x--;
+ st->s--;
+ if (st->delay)
+ st->delay += (0xFFFF & (st->delay +
+ (random() % (st->delay * 10))));
+ }
+ }
+
+ st->x++;
+ st->s++;
+
+ if (0 == random() % 200)
+ {
+ if (random() & 1 && st->s != source)
+ st->s--; /* duplicate character */
+ else if (*st->s)
+ st->s++; /* skip character */
+ }
+
+ if (*st->s == 0)
+ {
+ st->sentences++;
+ st->caps = (0 == random() % 40); /* capitalize sentence */
+
+ if (0 == (random() % 10) || /* randomly break paragraph */
+ (st->mode == 0 &&
+ ((0 == (random() % 10)) || st->sentences > 20)))
+ {
+ st->break_para = True;
+ st->sentences = 0;
+ st->paras++;
+
+ if (random() & 1) /* mode=0 50% of the time */
+ st->mode = 0;
+ else
+ st->mode = (0xFF & (random() % 5));
+
+ if (0 == (random() % 2)) /* re-pick margins */
+ {
+ st->left = 0xFF & (random() % (st->columns / 3));
+ st->right = (st->columns -
+ (0xFF & (random() % (st->columns / 3))));
+
+ if (0 == random() % 3) /* sometimes be wide */
+ st->right = st->left + ((st->right - st->left) / 2);
+ }
+
+ if (st->right - st->left <= 10) /* introduce sanity */
+ {
+ st->left = 0;
+ st->right = st->columns;
+ }
+
+ if (st->right - st->left > 50) /* if wide, shrink and move */
+ {
+ st->left += (0xFF & (random() % ((st->columns - 50) + 1)));
+ st->right = st->left + (0xFF & ((random() % 40) + 10));
+ }
+
+ /* oh, gag. */
+ if (st->mode == 0 &&
+ st->right - st->left < 25 &&
+ st->columns > 40)
+ {
+ st->right += 20;
+ if (st->right > st->columns)
+ st->left -= (st->right - st->columns);
+ }
+
+ if (st->right - st->left < 5)
+ st->left = st->right - 5;
+ if (st->left < 0)
+ st->left = 0;
+ if (st->right - st->left < 5)
+ st->right = st->left + 5;
+ }
+ st->s = source;
+ }
+
+ if (st->delay)
+ {
+ if (0 == random() % 3)
+ this_delay += (0xFFFFFF & ((random() % (st->delay * 5)) + 1));
+
+ if (st->break_para)
+ this_delay += (0xFFFFFF & ((random() % (st->delay * 15)) + 1));
+ }
+
+ if (st->paras > 5 &&
+ (0 == (random() % 1000)) &&
+ st->y < st->rows-2)
+ return xjack_pine (st);
+
+ return this_delay;
+}
+
+static Bool
+xjack_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->xany.type == ButtonPress)
+ {
+ st->scrolling++;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+xjack_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *xjack_defaults [] = {
+ ".background: #FFF0B4",
+ ".foreground: #000000",
+ "*fpsSolid: true",
+#ifdef HAVE_COCOA
+ ".font: American Typewriter 24",
+#else
+ ".font: -*-courier-medium-r-*-*-*-240-*-*-m-*-*-*",
+#endif
+ "*delay: 50000",
+ 0
+};
+
+static XrmOptionDescRec xjack_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-font", ".font", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("XJack", xjack)
diff --git a/hacks/xjack.man b/hacks/xjack.man
new file mode 100644
index 0000000..894f9ea
--- /dev/null
+++ b/hacks/xjack.man
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "18-sep-97" "X Version 11"
+.SH NAME
+xjack - all work and no play makes jack a dull boy
+.SH SYNOPSIS
+.B xjack
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIusecs\fP]
+[\-fps]
+.SH DESCRIPTION
+All work and no play makes jack a dull boy. All work and no play makes jack
+a dull boy. All work and no play makes jack a dull boy. All work and no
+play makes jack a dull boy. All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy.
+.PP
+.RS 8
+All work and no play makes jack a dull boy. All work and no play makes jack
+a dull boy. All work and no play makes jack a dull boy. All work and no
+play makes jack a dull boy. All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy.
+.PP
+All work and no play makes jack a dull boy. All work and no play makes jack
+a dull boy. All work and no play makes jack a dull boy. All work and no
+play makes jack a dull boy. All work and no play makes jack a dull boy. All
+work and no play makes jack a dull boy. All work and no play makes jack a
+dull boy. All work and no play makes jack a dull boy.
+.PP
+.RE
+All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy. All work and no play makes jack
+a dull boy. All work and no play makes jack a dull boy. All work and no
+play makes jack a dull boy. All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy. All work and no play makes jack
+a dull boy.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+All work and no play makes jack a dull boy.
+.TP 8
+.B XENVIRONMENT
+All work and no play makes jack a dull boy. All work and no play makes jack
+a dull boy.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. All work and no play makes jack a
+dull boy. All work and no play makes jack a dull boy. All work and no play
+makes jack a dull boy. All work and no play makes jack a dull boy. All work
+and no play makes jack a fnord dull boy. All work and no play makes jack a
+dull boy.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 15-Nov-97.
diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c
new file mode 100644
index 0000000..79d430a
--- /dev/null
+++ b/hacks/xlockmore.c
@@ -0,0 +1,773 @@
+/* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules.
+ * xscreensaver, Copyright (c) 1997-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This file, along with xlockmore.h, make it possible to compile an xlockmore
+ * module into a standalone program, and thus use it with xscreensaver.
+ * By Jamie Zawinski <jwz@jwz.org> on 10-May-97; based on the ideas
+ * in the older xlock.h by Charles Hannum <mycroft@ai.mit.edu>. (I had
+ * to redo it, since xlockmore has diverged so far from xlock...)
+ */
+
+#include "xlockmoreI.h"
+#include "screenhack.h"
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h>
+#endif /* !HAVE_JWXYZ */
+
+#include <assert.h>
+#include <float.h>
+
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+#define MAX_COLORS (1L<<13)
+
+extern struct xscreensaver_function_table *xscreensaver_function_table;
+
+extern const char *progclass;
+
+extern struct xlockmore_function_table xlockmore_function_table;
+
+static void *xlockmore_init (Display *, Window,
+ struct xlockmore_function_table *);
+static unsigned long xlockmore_draw (Display *, Window, void *);
+static void xlockmore_reshape (Display *, Window, void *,
+ unsigned int w, unsigned int h);
+static Bool xlockmore_event (Display *, Window, void *, XEvent *);
+static void xlockmore_free (Display *, Window, void *);
+
+
+void
+xlockmore_setup (struct xscreensaver_function_table *xsft, void *arg)
+{
+ struct xlockmore_function_table *xlmft =
+ (struct xlockmore_function_table *) arg;
+ int i, j;
+ char *s;
+ XrmOptionDescRec *new_options;
+ char **new_defaults;
+ const char *xlockmore_defaults;
+ ModeSpecOpt *xlockmore_opts = xlmft->opts;
+
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ xsft->init_cb = (void *(*) (Display *, Window)) xlockmore_init;
+ xsft->draw_cb = xlockmore_draw;
+ xsft->reshape_cb = xlockmore_reshape;
+ xsft->event_cb = xlockmore_event;
+ xsft->free_cb = xlockmore_free;
+
+ progclass = xlmft->progclass;
+ xlockmore_defaults = xlmft->defaults;
+
+ /* Translate the xlockmore `opts[]' argument to a form that
+ screenhack.c expects.
+ */
+ new_options = (XrmOptionDescRec *)
+ calloc (xlockmore_opts->numopts*3 + 100, sizeof (*new_options));
+
+ for (i = 0; i < xlockmore_opts->numopts; i++)
+ {
+ XrmOptionDescRec *old = &xlockmore_opts->opts[i];
+ XrmOptionDescRec *new = &new_options[i];
+
+ if (old->option[0] == '-')
+ new->option = old->option;
+ else
+ {
+ /* Convert "+foo" to "-no-foo". */
+ new->option = (char *) malloc (strlen(old->option) + 5);
+ strcpy (new->option, "-no-");
+ strcat (new->option, old->option + 1);
+ }
+
+ new->specifier = strrchr (old->specifier, '.');
+ if (!new->specifier) abort();
+
+ new->argKind = old->argKind;
+ new->value = old->value;
+ }
+
+ /* Add extra args, if they're mentioned in the defaults... */
+ {
+ char *args[] = { "-count", "-cycles", "-delay", "-ncolors",
+ "-size", "-font", "-wireframe", "-use3d", "-useSHM" };
+ for (j = 0; j < countof(args); j++)
+ if (strstr(xlockmore_defaults, args[j]+1))
+ {
+ XrmOptionDescRec *new = &new_options[i++];
+ new->option = args[j];
+ new->specifier = strdup(args[j]);
+ new->specifier[0] = '.';
+ if (!strcmp(new->option, "-wireframe"))
+ {
+ new->argKind = XrmoptionNoArg;
+ new->value = "True";
+ new = &new_options[i++];
+ new->option = "-no-wireframe";
+ new->specifier = new_options[i-2].specifier;
+ new->argKind = XrmoptionNoArg;
+ new->value = "False";
+ }
+ else if (!strcmp(new->option, "-use3d"))
+ {
+ new->option = "-3d";
+ new->argKind = XrmoptionNoArg;
+ new->value = "True";
+ new = &new_options[i++];
+ new->option = "-no-3d";
+ new->specifier = new_options[i-2].specifier;
+ new->argKind = XrmoptionNoArg;
+ new->value = "False";
+ }
+ else if (!strcmp(new->option, "-useSHM"))
+ {
+ new->option = "-shm";
+ new->argKind = XrmoptionNoArg;
+ new->value = "True";
+ new = &new_options[i++];
+ new->option = "-no-shm";
+ new->specifier = new_options[i-2].specifier;
+ new->argKind = XrmoptionNoArg;
+ new->value = "False";
+ }
+ else
+ {
+ new->argKind = XrmoptionSepArg;
+ new->value = 0;
+ }
+ }
+ }
+
+
+
+ /* Construct the kind of `defaults' that screenhack.c expects from
+ the xlockmore `vars[]' argument.
+ */
+ i = 0;
+
+ new_defaults = (char **) calloc (1, xlockmore_opts->numvarsdesc * 10 + 1000);
+
+ /* Put on the PROGCLASS.background/foreground resources. */
+ s = (char *) malloc(50);
+ *s = 0;
+# ifndef HAVE_JWXYZ
+ strcpy (s, progclass);
+# endif
+ strcat (s, ".background: black");
+ new_defaults [i++] = s;
+
+ s = (char *) malloc(50);
+ *s = 0;
+# ifndef HAVE_JWXYZ
+ strcpy (s, progclass);
+# endif
+ strcat (s, ".foreground: white");
+ new_defaults [i++] = s;
+
+ /* Copy the lines out of the `xlockmore_defaults' var and into this array. */
+ s = strdup (xlockmore_defaults);
+ while (s && *s)
+ {
+ new_defaults [i++] = s;
+ s = strchr(s, '\n');
+ if (s)
+ *s++ = 0;
+ }
+
+ /* Copy the defaults out of the `xlockmore_opts->' variable. */
+ for (j = 0; j < xlockmore_opts->numvarsdesc; j++)
+ {
+ const char *def = xlockmore_opts->vars[j].def;
+
+ if (!def) abort();
+ if (!*def) abort();
+ if (strlen(def) > 1000) abort();
+
+ s = (char *) malloc (strlen (xlockmore_opts->vars[j].name) +
+ strlen (def) + 10);
+ strcpy (s, "*");
+ strcat (s, xlockmore_opts->vars[j].name);
+ strcat (s, ": ");
+ strcat (s, def);
+ new_defaults [i++] = s;
+
+ /* Go through the list of resources and print a warning if there
+ are any duplicates.
+ */
+ {
+ char *onew = strdup (xlockmore_opts->vars[j].name);
+ const char *new = onew;
+ int k;
+ if ((s = strrchr (new, '.'))) new = s+1;
+ if ((s = strrchr (new, '*'))) new = s+1;
+ for (k = 0; k < i-1; k++)
+ {
+ char *oold = strdup (new_defaults[k]);
+ const char *old = oold;
+ if ((s = strchr (oold, ':'))) *s = 0;
+ if ((s = strrchr (old, '.'))) old = s+1;
+ if ((s = strrchr (old, '*'))) old = s+1;
+ if (!strcasecmp (old, new))
+ {
+ fprintf (stderr,
+ "%s: duplicate resource \"%s\": "
+ "set in both DEFAULTS and vars[]\n",
+ progname, old);
+ }
+ free (oold);
+ }
+ free (onew);
+ }
+ }
+
+ new_defaults [i] = 0;
+
+ xsft->progclass = progclass;
+ xsft->options = new_options;
+ xsft->defaults = (const char * const *) new_defaults;
+}
+
+
+static void
+xlockmore_release_screens (ModeInfo *mi)
+{
+ struct xlockmore_function_table *xlmft = mi->xlmft;
+
+ /* 2. Call release_##, if it exists. */
+ if (xlmft->hack_release)
+ xlmft->hack_release (mi);
+
+ /* 3. Free the state array. */
+ if (xlmft->state_array) {
+ free(*xlmft->state_array);
+ *xlmft->state_array = NULL;
+ xlmft->state_array = NULL;
+ }
+
+ /* 4. Pretend FreeAllGL(mi) gets called here. */
+
+ mi->xlmft->got_init = 0;
+}
+
+
+static void
+xlockmore_free_screens (ModeInfo *mi)
+{
+ struct xlockmore_function_table *xlmft = mi->xlmft;
+
+ /* Optimization: xlockmore_read_resources calls this lots on first start. */
+ if (!xlmft->got_init)
+ return;
+
+ /* Order is important here: */
+
+ /* 1. Call free_## for all screens. */
+ if (xlmft->hack_free) {
+ int old_screen = mi->screen_number;
+ for (mi->screen_number = 0; mi->screen_number < XLOCKMORE_NUM_SCREENS;
+ ++mi->screen_number) {
+ xlmft->hack_free (mi);
+ }
+ mi->screen_number = old_screen;
+ }
+
+ xlockmore_release_screens (mi);
+}
+
+
+static void
+xlockmore_read_resources (ModeInfo *mi)
+{
+ Display *dpy = mi->dpy;
+ ModeSpecOpt *xlockmore_opts = mi->xlmft->opts;
+ int i;
+ for (i = 0; i < xlockmore_opts->numvarsdesc; i++)
+ {
+ void *var = xlockmore_opts->vars[i].var;
+ Bool *var_b = (Bool *) var;
+ char **var_c = (char **) var;
+ int *var_i = (int *) var;
+ float *var_f = (float *) var;
+
+ /* If any of the options changed, stop this hack's other instances. */
+ switch (xlockmore_opts->vars[i].type)
+ {
+ case t_String:
+ {
+ char *c = get_string_resource (dpy, xlockmore_opts->vars[i].name,
+ xlockmore_opts->vars[i].classname);
+ if ((!c && !*var_c) || (c && *var_c && !strcmp(c, *var_c))) {
+ free (c);
+ } else {
+ xlockmore_free_screens (mi);
+ if (*var_c) free (*var_c);
+ *var_c = c;
+ }
+ }
+ break;
+ case t_Float:
+ {
+ float f = get_float_resource (dpy, xlockmore_opts->vars[i].name,
+ xlockmore_opts->vars[i].classname);
+ float frac = fabsf(*var_f) * (1.0f / (1l << (FLT_MANT_DIG - 4)));
+ if (f < *var_f - frac || f > *var_f + frac) {
+ xlockmore_free_screens (mi);
+ *var_f = f;
+ }
+ }
+ break;
+ case t_Int:
+ {
+ int ii = get_integer_resource (dpy, xlockmore_opts->vars[i].name,
+ xlockmore_opts->vars[i].classname);
+ if (ii != *var_i) {
+ xlockmore_free_screens (mi);
+ *var_i = ii;
+ }
+ }
+ break;
+ case t_Bool:
+ {
+ Bool b = get_boolean_resource (dpy, xlockmore_opts->vars[i].name,
+ xlockmore_opts->vars[i].classname);
+ if (b != *var_b) {
+ xlockmore_free_screens (mi);
+ *var_b = b;
+ }
+ }
+ break;
+ default:
+ abort ();
+ }
+ }
+}
+
+
+/* We keep a list of all of the screen numbers that are in use and not
+ yet freed so that they can have sensible screen numbers. If three
+ displays are created (0, 1, 2) and then #1 is closed, then the fourth
+ display will be given the now-unused display number 1. (Everything in
+ here assumes a 1:1 Display/Screen mapping.)
+
+ XLOCKMORE_NUM_SCREENS is the most number of live displays at one time. So
+ if it's 64, then we'll blow up if the system has 64 monitors and also has
+ System Preferences open (the small preview window).
+
+ Note that xlockmore-style savers tend to allocate big structures, so
+ setting XLOCKMORE_NUM_SCREENS to 1000 will waste a few megabytes. Also
+ most (all?) of them assume that the number of screens never changes, so
+ dynamically expanding this array won't work.
+ */
+
+
+static void *
+xlockmore_init (Display *dpy, Window window,
+ struct xlockmore_function_table *xlmft)
+{
+ ModeInfo *mi = (ModeInfo *) calloc (1, sizeof(*mi));
+ XGCValues gcv;
+ XColor color;
+ int i;
+ Bool root_p;
+
+ if (! xlmft)
+ abort();
+ mi->xlmft = xlmft;
+
+ mi->dpy = dpy;
+ mi->window = window;
+ XGetWindowAttributes (dpy, window, &mi->xgwa);
+
+ /* In Cocoa and Android-based xscreensaver, as well as with DEBUG_PAIR,
+ hacks run in the same address space, so each one needs to get its own
+ screen number.
+
+ Find the first empty slot in live_displays and plug us in.
+ */
+ {
+ const int size = XLOCKMORE_NUM_SCREENS;
+ int i;
+ for (i = 0; i < size; i++) {
+ if (! (xlmft->live_displays & (1 << i)))
+ break;
+ }
+ if (i >= size) abort();
+ xlmft->live_displays |= 1ul << i;
+ xlmft->got_init &= ~(1ul << i);
+ mi->screen_number = i;
+ }
+
+ root_p = (window == RootWindowOfScreen (mi->xgwa.screen));
+
+#ifndef HAVE_JWXYZ
+
+ /* Everybody gets motion events, just in case. */
+ XSelectInput (dpy, window, (mi->xgwa.your_event_mask | PointerMotionMask));
+
+#endif /* !HAVE_JWXYZ */
+
+ if (mi->xlmft->hack_release) {
+/*
+ fprintf (
+ stderr,
+ "%s: WARNING: hack_release is not usually recommended; see MI_INIT.\n",
+ progname);
+*/
+ }
+
+ color.flags = DoRed|DoGreen|DoBlue;
+ color.red = color.green = color.blue = 0;
+ if (!XAllocColor(dpy, mi->xgwa.colormap, &color))
+ abort();
+ mi->black = color.pixel;
+ color.red = color.green = color.blue = 0xFFFF;
+ if (!XAllocColor(dpy, mi->xgwa.colormap, &color))
+ abort();
+ mi->white = color.pixel;
+
+ if (mono_p)
+ {
+ static XColor colors[2];
+ MONO:
+ mi->npixels = 2;
+ if (! mi->pixels)
+ mi->pixels = (unsigned long *)
+ calloc (mi->npixels, sizeof (*mi->pixels));
+ if (!mi->colors)
+ mi->colors = (XColor *)
+ calloc (mi->npixels, sizeof (*mi->colors));
+ colors[0].flags = DoRed|DoGreen|DoBlue;
+ colors[1].flags = DoRed|DoGreen|DoBlue;
+ colors[0].red = colors[0].green = colors[0].blue = 0;
+ colors[1].red = colors[1].green = colors[1].blue = 0xFFFF;
+ mi->writable_p = False;
+ }
+ else
+ {
+ mi->npixels = get_integer_resource (dpy, "ncolors", "Integer");
+ if (mi->npixels <= 0)
+ mi->npixels = 64;
+ else if (mi->npixels > MAX_COLORS)
+ mi->npixels = MAX_COLORS;
+
+ mi->colors = (XColor *) calloc (mi->npixels, sizeof (*mi->colors));
+
+ mi->writable_p = mi->xlmft->want_writable_colors;
+
+ switch (mi->xlmft->desired_color_scheme)
+ {
+ case color_scheme_uniform:
+ make_uniform_colormap (mi->xgwa.screen, mi->xgwa.visual,
+ mi->xgwa.colormap,
+ mi->colors, &mi->npixels,
+ True, &mi->writable_p, True);
+ break;
+ case color_scheme_smooth:
+ make_smooth_colormap (mi->xgwa.screen, mi->xgwa.visual,
+ mi->xgwa.colormap,
+ mi->colors, &mi->npixels,
+ True, &mi->writable_p, True);
+ break;
+ case color_scheme_bright:
+ case color_scheme_default:
+ make_random_colormap (mi->xgwa.screen, mi->xgwa.visual,
+ mi->xgwa.colormap,
+ mi->colors, &mi->npixels,
+ (mi->xlmft->desired_color_scheme ==
+ color_scheme_bright),
+ True, &mi->writable_p, True);
+ break;
+ default:
+ abort();
+ }
+
+ if (mi->npixels <= 2)
+ goto MONO;
+ else
+ {
+ mi->pixels = (unsigned long *)
+ calloc (mi->npixels, sizeof (*mi->pixels));
+ for (i = 0; i < mi->npixels; i++)
+ mi->pixels[i] = mi->colors[i].pixel;
+ }
+ }
+
+ gcv.foreground = mi->white;
+ gcv.background = mi->black;
+ mi->gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+
+ mi->fullrandom = True;
+
+ mi->pause = get_integer_resource (dpy, "delay", "Usecs");
+
+ mi->cycles = get_integer_resource (dpy, "cycles", "Int");
+ mi->batchcount = get_integer_resource (dpy, "count", "Int");
+ mi->size = get_integer_resource (dpy, "size", "Int");
+
+ mi->threed = get_boolean_resource (dpy, "use3d", "Boolean");
+ mi->threed_delta = get_float_resource (dpy, "delta3d", "Float");
+ mi->threed_right_color = get_pixel_resource (dpy,
+ mi->xgwa.colormap, "right3d", "Color");
+ mi->threed_left_color = get_pixel_resource (dpy,
+ mi->xgwa.colormap, "left3d", "Color");
+ mi->threed_both_color = get_pixel_resource (dpy,
+ mi->xgwa.colormap, "both3d", "Color");
+ mi->threed_none_color = get_pixel_resource (dpy,
+ mi->xgwa.colormap, "none3d", "Color");
+
+ mi->wireframe_p = get_boolean_resource (dpy, "wireframe", "Boolean");
+ mi->root_p = root_p;
+ mi->fps_p = get_boolean_resource (dpy, "doFPS", "DoFPS");
+ mi->recursion_depth = -1; /* see fps.c */
+
+ if (mi->pause < 0)
+ mi->pause = 0;
+ else if (mi->pause > 100000000)
+ mi->pause = 100000000;
+
+ /* If this hack uses fonts (meaning, mentioned "font" in DEFAULTS)
+ then load it. */
+ {
+ char *name = get_string_resource (dpy, "font", "Font");
+ if (name)
+ {
+ XFontStruct *f = load_font_retry (dpy, name);
+ if (!f) abort();
+ XSetFont (dpy, mi->gc, f->fid);
+ XFreeFont (dpy, f);
+ free (name);
+ }
+ }
+
+ xlockmore_read_resources (mi);
+
+ return mi;
+}
+
+
+static void
+xlockmore_clear (ModeInfo *mi)
+{
+# ifndef HAVE_ANDROID
+ /* TODO: Clear the window for Xlib hacks on Android. */
+ XClearWindow (mi->dpy, mi->window);
+# endif
+}
+
+
+static void
+xlockmore_do_init (ModeInfo *mi)
+{
+ mi->xlmft->got_init |= 1 << mi->screen_number;
+ xlockmore_clear (mi);
+ mi->xlmft->hack_init (mi);
+}
+
+
+static Bool
+xlockmore_got_init (ModeInfo *mi)
+{
+ return mi->xlmft->got_init & (1 << mi->screen_number);
+}
+
+
+static void
+xlockmore_abort_erase (ModeInfo *mi)
+{
+ if (mi->eraser) {
+ eraser_free (mi->eraser);
+ mi->eraser = NULL;
+ }
+ mi->needs_clear = False;
+}
+
+
+static void
+xlockmore_check_init (ModeInfo *mi)
+{
+ if (! xlockmore_got_init (mi)) {
+ xlockmore_abort_erase (mi);
+ xlockmore_do_init (mi);
+ }
+}
+
+
+static unsigned long
+xlockmore_draw (Display *dpy, Window window, void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ unsigned long orig_pause = mi->pause;
+ unsigned long this_pause;
+
+ if (mi->needs_clear) {
+ /* OpenGL hacks never get here. */
+ if (!mi->is_drawn) {
+ xlockmore_clear (mi);
+ } else {
+ mi->eraser = erase_window (dpy, window, mi->eraser);
+ /* Delay calls to xlockmore hooks while the erase animation is running. */
+ if (mi->eraser)
+ return 33333;
+ }
+ mi->needs_clear = False;
+ }
+
+ xlockmore_check_init (mi);
+ if (mi->needs_clear)
+ return 0;
+ mi->xlmft->hack_draw (mi);
+
+ this_pause = mi->pause;
+ mi->pause = orig_pause;
+ return mi->needs_clear ? 0 : this_pause;
+}
+
+
+static void
+xlockmore_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ if (mi) {
+ /* Ignore spurious resize events, because xlockmore_do_init usually clears
+ the screen, and there's no reason to do that if we don't have to.
+ */
+# ifndef HAVE_MOBILE
+ /* These are not spurious on mobile: they are rotations. */
+ if (mi->xgwa.width == w && mi->xgwa.height == h)
+ return;
+# endif
+ mi->xgwa.width = w;
+ mi->xgwa.height = h;
+
+ /* Finish any erase operations. */
+ if (mi->needs_clear) {
+ xlockmore_abort_erase (mi);
+ xlockmore_clear (mi);
+ }
+
+ /* If there hasn't been an init yet, init now, but don't call reshape_##.
+ */
+ if (xlockmore_got_init (mi) && mi->xlmft->hack_reshape) {
+ mi->xlmft->hack_reshape (mi, mi->xgwa.width, mi->xgwa.height);
+ } else {
+ mi->is_drawn = False;
+ xlockmore_do_init (mi);
+ }
+ }
+}
+
+static Bool
+xlockmore_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ if (mi) {
+ if (mi->xlmft->hack_handle_events) {
+ xlockmore_check_init (mi);
+ return mi->xlmft->hack_handle_events (mi, event);
+ }
+
+ if (screenhack_event_helper (mi->dpy, mi->window, event)) {
+ /* If a clear is in progress, don't interrupt or restart it. */
+ if (mi->needs_clear)
+ mi->xlmft->got_init &= ~(1ul << mi->screen_number);
+ else
+ mi->xlmft->hack_init (mi);
+ return True;
+ }
+ }
+ return False;
+}
+
+void
+xlockmore_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ fps_compute (fpst, 0, mi ? mi->recursion_depth : -1);
+ fps_draw (fpst);
+}
+
+
+static void
+xlockmore_free (Display *dpy, Window window, void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+
+ if (mi->eraser)
+ eraser_free (mi->eraser);
+
+ /* Some hacks may need to do things with their Display * on cleanup. And
+ under JWXYZ, the Display * for this hack gets cleaned up right after
+ xlockmore_free returns. Thus, hack_free has to happen now, rather than
+ after the final screen has been released.
+ */
+ if (mi->xlmft->hack_free)
+ mi->xlmft->hack_free (mi);
+
+ /* Find us in live_displays and clear that slot. */
+ assert (mi->xlmft->live_displays & (1ul << mi->screen_number));
+ mi->xlmft->live_displays &= ~(1ul << mi->screen_number);
+ if (!mi->xlmft->live_displays)
+ xlockmore_release_screens (mi);
+
+ XFreeGC (dpy, mi->gc);
+ free_colors (mi->xgwa.screen, mi->xgwa.colormap, mi->colors, mi->npixels);
+ free (mi->colors);
+ free (mi->pixels);
+
+ free (mi);
+}
+
+
+void
+xlockmore_mi_init (ModeInfo *mi, size_t state_size, void **state_array)
+{
+ struct xlockmore_function_table *xlmft = mi->xlmft;
+
+ /* Steal the state_array for safe keeping.
+ Only necessary when the screenhack isn't a once per process deal.
+ (i.e. macOS, iOS, Android)
+ */
+ assert ((!xlmft->state_array && !*state_array) ||
+ xlmft->state_array == state_array);
+ xlmft->state_array = state_array;
+
+ if (!*xlmft->state_array) {
+ *xlmft->state_array = calloc (XLOCKMORE_NUM_SCREENS, state_size);
+
+ if (!*xlmft->state_array) {
+#ifdef HAVE_JWXYZ
+ /* Throws an exception instead of exiting the process. */
+ jwxyz_abort ("%s: out of memory", progname);
+#else
+ fprintf (stderr, "%s: out of memory\n", progname);
+ exit (1);
+#endif
+ }
+ }
+
+ /* Find the appropriate state object, clear it, and we're done. */
+ {
+ if (xlmft->hack_free)
+ xlmft->hack_free (mi);
+ memset ((char *)(*xlmft->state_array) + mi->screen_number * state_size, 0,
+ state_size);
+ }
+}
+
+
+Bool
+xlockmore_no_events (ModeInfo *mi, XEvent *event)
+{
+ return False;
+}
diff --git a/hacks/xlockmore.h b/hacks/xlockmore.h
new file mode 100644
index 0000000..285a126
--- /dev/null
+++ b/hacks/xlockmore.h
@@ -0,0 +1,255 @@
+/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
+ * xscreensaver, Copyright (c) 1997-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * The definitions in this file make it possible to compile an xlockmore
+ * module into a standalone program, and thus use it with xscreensaver.
+ * By Jamie Zawinski <jwz@jwz.org> on 10-May-97; based on the ideas
+ * in the older xlock.h by Charles Hannum <mycroft@ai.mit.edu>. (I had
+ * to redo it, since xlockmore has diverged so far from xlock...)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef __STDC__
+ERROR! Sorry, xlockmore.h requires ANSI C (gcc, for example.)
+ /* (The ansi dependency is that we use string concatenation,
+ and cpp-based stringification of tokens.) */
+#endif
+
+#include "screenhackI.h"
+#include "xlockmoreI.h"
+
+# define ENTRYPOINT static
+
+/* Accessor macros for the ModeInfo structure
+ */
+#define MI_DISPLAY(MI) ((MI)->dpy)
+#define MI_WINDOW(MI) ((MI)->window)
+#define MI_NUM_SCREENS(MI) XLOCKMORE_NUM_SCREENS
+#define MI_SCREEN(MI) ((MI)->screen_number)
+#define MI_SCREENPTR(MI) ((MI)->xgwa.screen)
+#define MI_WIN_WHITE_PIXEL(MI) ((MI)->white)
+#define MI_WIN_BLACK_PIXEL(MI) ((MI)->black)
+#define MI_NPIXELS(MI) ((MI)->npixels)
+#define MI_PIXEL(MI,N) ((MI)->pixels[(N)])
+#define MI_WIN_WIDTH(MI) ((MI)->xgwa.width)
+#define MI_WIN_HEIGHT(MI) ((MI)->xgwa.height)
+#define MI_WIN_DEPTH(MI) ((MI)->xgwa.depth)
+#define MI_DEPTH(MI) ((MI)->xgwa.depth)
+#define MI_WIN_COLORMAP(MI) ((MI)->xgwa.colormap)
+#define MI_VISUAL(MI) ((MI)->xgwa.visual)
+#define MI_GC(MI) ((MI)->gc)
+#define MI_PAUSE(MI) ((MI)->pause)
+#define MI_DELAY(MI) ((MI)->pause)
+#define MI_WIN_IS_FULLRANDOM(MI)((MI)->fullrandom)
+#define MI_WIN_IS_VERBOSE(MI) (False)
+#define MI_WIN_IS_INSTALL(MI) (True)
+#define MI_WIN_IS_MONO(MI) (mono_p)
+#define MI_WIN_IS_INROOT(MI) ((MI)->root_p)
+#define MI_WIN_IS_INWINDOW(MI) (!(MI)->root_p)
+#define MI_WIN_IS_ICONIC(MI) (False)
+#define MI_WIN_IS_WIREFRAME(MI) ((MI)->wireframe_p)
+#define MI_WIN_IS_USE3D(MI) ((MI)->threed)
+#define MI_LEFT_COLOR(MI) ((MI)->threed_left_color)
+#define MI_RIGHT_COLOR(MI) ((MI)->threed_right_color)
+#define MI_BOTH_COLOR(MI) ((MI)->threed_both_color)
+#define MI_NONE_COLOR(MI) ((MI)->threed_none_color)
+#define MI_DELTA3D(MI) ((MI)->threed_delta)
+#define MI_CYCLES(MI) ((MI)->cycles)
+#define MI_BATCHCOUNT(MI) ((MI)->batchcount)
+#define MI_SIZE(MI) ((MI)->size)
+#define MI_IS_DRAWN(MI) ((MI)->is_drawn)
+#define MI_IS_FPS(MI) ((MI)->fps_p)
+#define MI_NCOLORS(MI) ((MI)->npixels)
+#define MI_NAME(MI) (progname)
+
+#define MI_COLORMAP(MI) (MI_WIN_COLORMAP((MI)))
+#define MI_WIDTH(MI) (MI_WIN_WIDTH((MI)))
+#define MI_HEIGHT(MI) (MI_WIN_HEIGHT((MI)))
+#define MI_IS_ICONIC(MI) (MI_WIN_IS_ICONIC((MI)))
+#define MI_IS_WIREFRAME(MI) (MI_WIN_IS_WIREFRAME((MI)))
+#define MI_IS_MONO(MI) (MI_WIN_IS_MONO((MI)))
+#define MI_COUNT(MI) (MI_BATCHCOUNT((MI)))
+#define MI_BLACK_PIXEL(MI) (MI_WIN_BLACK_PIXEL(MI))
+#define MI_WHITE_PIXEL(MI) (MI_WIN_WHITE_PIXEL(MI))
+#define MI_IS_FULLRANDOM(MI) (MI_WIN_IS_FULLRANDOM(MI))
+#define MI_IS_VERBOSE(MI) (MI_WIN_IS_VERBOSE(MI))
+#define MI_IS_INSTALL(MI) (MI_WIN_IS_INSTALL(MI))
+#define MI_IS_DEBUG(MI) (False)
+#define MI_IS_MOUSE(MI) (False)
+
+/* Under xlockmore, MI_CLEARWINDOW runs immediately, and for animated clears
+ it delays execution while the animation runs. This doesn't work on
+ XScreenSaver, which has mandatory double-buffering on macOS/iOS/Android.
+
+ Tricky: As a result, MI_CLEARWINDOW doesn't clear the window until after
+ init_##() or draw_##() finishes.
+ */
+#ifdef USE_GL
+# define MI_CLEARWINDOW(mi) XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi))
+#else
+# define MI_CLEARWINDOW(mi) ((mi)->needs_clear = True)
+#endif
+
+/* MI_INIT and MI_ABORT are XScreenSaver extensions. These exist primarily for
+ the sake of ports to macOS, iOS, and Android, all of which need to restart
+ individual screenhacks repeatedly in the same process. This requires
+ reusing MI_SCREEN() numbers; previously many xlockmore API hacks did not
+ support this the way they were supposed to.
+ */
+
+/* MI_INIT implements the following pattern, as seen in various forms at the
+ beginning of init_##():
+
+ if(!state_array) {
+ state_array = (state_t *)calloc(MI_NUM_SCREENS(mi), sizeof(state_t));
+ if(!state_array) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ return;
+ }
+ }
+ hack_free_state(mi);
+ memset(&state_array[MI_SCREEN(mi)], 0, sizeof(*state_array));
+
+ MI_INIT also assumes ownership of the state_array over to xlockmore.c,
+ which frees it after all screens (or "screens") are closed.
+ */
+
+#define MI_INIT(mi, state_array) \
+ xlockmore_mi_init ((mi), sizeof(*(state_array)), (void **)&(state_array))
+
+/* Use MI_ABORT if an init_## or draw_## hook needs to shut everything down.
+ This replaces explicit calls to release_## hooks when things go wrong from
+ inside an xlockmore API screenhack.
+
+ At some point this may do something other than just abort().
+ */
+#define MI_ABORT(mi) abort();
+
+#define FreeAllGL(dpy) /* */
+
+/* Some other utility macros.
+ */
+#define SINF(n) ((float)sin((double)(n)))
+#define COSF(n) ((float)cos((double)(n)))
+#define FABSF(n) ((float)fabs((double)(n)))
+
+#undef MAX
+#undef MIN
+#undef ABS
+#define MAX(a,b)((a)>(b)?(a):(b))
+#define MIN(a,b)((a)<(b)?(a):(b))
+#define ABS(a)((a)<0 ? -(a) : (a))
+
+/* Maximum possible number of colors (*not* default number of colors.) */
+#define NUMCOLORS 256
+
+
+/* In an Xlib world, we define two global symbols here:
+ a struct in `MODULENAME_xscreensaver_function_table',
+ and a pointer to that in `xscreensaver_function_table'.
+
+ In a Cocoa or Android world, we only define the prefixed symbol;
+ the un-prefixed symbol does not exist.
+ */
+#ifdef HAVE_MOBILE
+# define XSCREENSAVER_LINK(NAME)
+#else
+# define XSCREENSAVER_LINK(NAME) \
+ struct xscreensaver_function_table *xscreensaver_function_table = &NAME;
+#endif
+
+
+# if !defined(USE_GL) || defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define xlockmore_pick_gl_visual 0
+# define xlockmore_validate_gl_visual 0
+# endif /* !USE_GL || HAVE_COCOA || HAVE_ANDROID */
+
+# ifdef USE_GL
+# define XLOCKMORE_FPS xlockmore_gl_compute_fps
+# else
+# define XLOCKMORE_FPS xlockmore_do_fps
+# endif
+
+# ifdef HAVE_JWXYZ
+# ifdef USE_GL
+# define XLOCKMORE_VISUAL GL_VISUAL
+# else
+# define XLOCKMORE_VISUAL DEFAULT_VISUAL
+# endif
+# else /* !HAVE_JWXYZ */
+# define XLOCKMORE_VISUAL \
+ xlockmore_pick_gl_visual, xlockmore_validate_gl_visual
+# endif /* !HAVE_JWXYZ */
+
+#ifdef WRITABLE_COLORS
+# undef WRITABLE_COLORS
+# define WRITABLE_COLORS 1
+#else
+# define WRITABLE_COLORS 0
+#endif
+
+#if defined(UNIFORM_COLORS)
+# define XLOCKMORE_COLOR_SCHEME color_scheme_uniform
+#elif defined(SMOOTH_COLORS)
+# define XLOCKMORE_COLOR_SCHEME color_scheme_smooth
+#elif defined(BRIGHT_COLORS)
+# define XLOCKMORE_COLOR_SCHEME color_scheme_bright
+#else
+# define XLOCKMORE_COLOR_SCHEME color_scheme_default
+#endif
+
+/* This is the macro that links this program in with the rest of
+ xscreensaver. For example:
+
+ XSCREENSAVER_MODULE ("Atlantis", atlantis)
+ XSCREENSAVER_MODULE_2 ("GLMatrix", glmatrix, matrix)
+
+ CLASS: a string, the class name for resources.
+ NAME: a token, the name of the executable. Should be the same
+ as CLASS, but downcased.
+ PREFIX: the symbol used in the function names, e.g., `draw_atlantis'.
+
+ NAME and PREFIX are usually the same. If they are not, use
+ XSCREENSAVER_MODULE_2() instead of XSCREENSAVER_MODULE().
+ */
+#define XSCREENSAVER_MODULE_2(CLASS,NAME,PREFIX) \
+ \
+ static struct xlockmore_function_table \
+ NAME ## _xlockmore_function_table = { \
+ CLASS, \
+ DEFAULTS, \
+ WRITABLE_COLORS, \
+ XLOCKMORE_COLOR_SCHEME, \
+ init_ ## PREFIX, \
+ draw_ ## PREFIX, \
+ reshape_ ## PREFIX, \
+ release_ ## PREFIX, \
+ free_ ## PREFIX, \
+ PREFIX ## _handle_event, \
+ & PREFIX ## _opts \
+ }; \
+ \
+ struct xscreensaver_function_table \
+ NAME ## _xscreensaver_function_table = { \
+ 0, 0, 0, \
+ xlockmore_setup, \
+ & NAME ## _xlockmore_function_table, \
+ 0, 0, 0, 0, 0, \
+ XLOCKMORE_FPS, \
+ XLOCKMORE_VISUAL }; \
+ \
+ XSCREENSAVER_LINK (NAME ## _xscreensaver_function_table)
+
+#define XSCREENSAVER_MODULE(CLASS,PREFIX) \
+ XSCREENSAVER_MODULE_2(CLASS,PREFIX,PREFIX)
diff --git a/hacks/xlockmoreI.h b/hacks/xlockmoreI.h
new file mode 100644
index 0000000..bf0adbf
--- /dev/null
+++ b/hacks/xlockmoreI.h
@@ -0,0 +1,177 @@
+/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
+ * xscreensaver, Copyright (c) 1997-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * See xlockmore.h and xlockmore.c.
+ */
+
+#ifndef __XLOCKMORE_INTERNAL_H__
+#define __XLOCKMORE_INTERNAL_H__
+
+#include <time.h>
+
+#include "screenhackI.h"
+#include "erase.h"
+
+
+typedef struct ModeInfo ModeInfo;
+
+#ifdef HAVE_GL
+
+/* I'm told that the Sun version of OpenGL needs to have the constant
+ SUN_OGL_NO_VERTEX_MACROS defined in order for morph3d to compile
+ (the number of arguments to the glNormal3f macro changes...)
+ Verified with gcc 2.7.2.2 and Sun cc 4.2 with OpenGL 1.1.1 dev 4
+ on Solaris 2.5.1.
+ */
+# ifndef HAVE_MESA_GL
+# if defined(__sun) && defined(__SVR4) /* Solaris */
+# define SUN_OGL_NO_VERTEX_MACROS 1
+# endif /* Solaris */
+# endif /* !HAVE_MESA_GL */
+
+# ifdef HAVE_COCOA
+# ifndef USE_IPHONE
+# include <OpenGL/gl.h>
+# include <OpenGL/glu.h>
+# endif
+# elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+# else
+# include <GL/gl.h>
+# include <GL/glu.h>
+# include <GL/glx.h>
+# endif
+
+# ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+# endif /* HAVE_JWZGLES */
+#endif /* HAVE_GL */
+
+
+#ifdef USE_GL
+
+ extern GLXContext *init_GL (ModeInfo *);
+ extern void xlockmore_reset_gl_state(void);
+ extern void clear_gl_error (void);
+ extern void check_gl_error (const char *type);
+
+ extern Visual *xlockmore_pick_gl_visual (Screen *);
+ extern Bool xlockmore_validate_gl_visual (Screen *, const char *, Visual *);
+
+#endif /* USE_GL */
+
+/* These are only used in GL mode, but I don't understand why XCode
+ isn't seeing the prototypes for them in glx/fps-gl.c... */
+extern void do_fps (ModeInfo *);
+extern void xlockmore_gl_compute_fps (Display *, Window, fps_state *, void *);
+extern void xlockmore_gl_draw_fps (ModeInfo *);
+# define do_fps xlockmore_gl_draw_fps
+
+
+extern void xlockmore_setup (struct xscreensaver_function_table *, void *);
+extern void xlockmore_do_fps (Display *, Window, fps_state *, void *);
+extern void xlockmore_mi_init (ModeInfo *, size_t, void **);
+extern Bool xlockmore_no_events (ModeInfo *, XEvent *);
+
+
+/* The xlockmore RNG API is implemented in utils/yarandom.h. */
+
+
+struct ModeInfo {
+ struct xlockmore_function_table *xlmft;
+ Display *dpy;
+ Window window;
+ Bool root_p;
+ int screen_number;
+ int npixels;
+ unsigned long *pixels;
+ XColor *colors;
+ Bool writable_p;
+ unsigned long white;
+ unsigned long black;
+ XWindowAttributes xgwa;
+ GC gc;
+ long pause;
+ Bool fullrandom;
+ long cycles;
+ long batchcount;
+ long size;
+ Bool threed;
+ long threed_left_color;
+ long threed_right_color;
+ long threed_both_color;
+ long threed_none_color;
+ long threed_delta;
+ Bool wireframe_p;
+ Bool is_drawn;
+ eraser_state *eraser;
+ Bool needs_clear;
+
+ /* Used only by OpenGL programs, since FPS is tricky there. */
+ fps_state *fpst;
+ Bool fps_p;
+ unsigned long polygon_count; /* These values are for -fps display only */
+ double recursion_depth;
+#if !defined HAVE_JWXYZ && defined HAVE_GL
+ GLXContext glx_context;
+#endif
+};
+
+typedef enum { t_String, t_Float, t_Int, t_Bool } xlockmore_type;
+
+typedef struct {
+ void *var;
+ char *name;
+ char *classname;
+ char *def;
+ xlockmore_type type;
+} argtype;
+
+typedef struct {
+ char *opt;
+ char *desc;
+} OptionStruct;
+
+typedef struct {
+ int numopts;
+ XrmOptionDescRec *opts;
+ int numvarsdesc;
+ argtype *vars;
+ OptionStruct *desc;
+} ModeSpecOpt;
+
+struct xlockmore_function_table {
+ const char *progclass;
+ const char *defaults;
+ Bool want_writable_colors;
+ enum { color_scheme_default, color_scheme_uniform,
+ color_scheme_smooth, color_scheme_bright }
+ desired_color_scheme;
+ void (*hack_init) (ModeInfo *);
+ void (*hack_draw) (ModeInfo *);
+ void (*hack_reshape) (ModeInfo *, int, int);
+ void (*hack_release) (ModeInfo *);
+ void (*hack_free) (ModeInfo *);
+ Bool (*hack_handle_events) (ModeInfo *, XEvent *);
+ ModeSpecOpt *opts;
+
+ void **state_array;
+ unsigned long live_displays, got_init;
+};
+
+#ifdef HAVE_JWXYZ
+# define XLOCKMORE_NUM_SCREENS \
+ (sizeof(((struct xlockmore_function_table *)0)->live_displays) * 8)
+#else
+# define XLOCKMORE_NUM_SCREENS 2 /* For DEBUG_PAIR. */
+#endif
+
+#endif /* __XLOCKMORE_INTERNAL_H__ */
diff --git a/hacks/xlyap.c b/hacks/xlyap.c
new file mode 100644
index 0000000..2d43ce9
--- /dev/null
+++ b/hacks/xlyap.c
@@ -0,0 +1,1932 @@
+/* Lyap - calculate and display Lyapunov exponents */
+
+/* Written by Ron Record (rr@sco) 03 Sep 1991 */
+
+/* The idea here is to calculate the Lyapunov exponent for a periodically
+ * forced logistic map (later i added several other nonlinear maps of the unit
+ * interval). In order to turn the 1-dimensional parameter space of the
+ * logistic map into a 2-dimensional parameter space, select two parameter
+ * values ('a' and 'b') then alternate the iterations of the logistic map using
+ * first 'a' then 'b' as the parameter. This program accepts an argument to
+ * specify a forcing function, so instead of just alternating 'a' and 'b', you
+ * can use 'a' as the parameter for say 6 iterations, then 'b' for 6 iterations
+ * and so on. An interesting forcing function to look at is abbabaab (the
+ * Morse-Thue sequence, an aperiodic self-similar, self-generating sequence).
+ * Anyway, step through all the values of 'a' and 'b' in the ranges you want,
+ * calculating the Lyapunov exponent for each pair of values. The exponent
+ * is calculated by iterating out a ways (specified by the variable "settle")
+ * then on subsequent iterations calculating an average of the logarithm of
+ * the absolute value of the derivative at that point. Points in parameter
+ * space with a negative Lyapunov exponent are colored one way (using the
+ * value of the exponent to index into a color map) while points with a
+ * non-negative exponent are colored differently.
+ *
+ * The algorithm was taken from the September 1991 Scientific American article
+ * by A. K. Dewdney who gives credit to Mario Markus of the Max Planck
+ * Institute for its creation. Additional information and ideas were gleaned
+ * from the discussion on alt.fractals involving Stephen Hall, Ed Kubaitis,
+ * Dave Platt and Baback Moghaddam. Assistance with colormaps and spinning
+ * color wheels and X was gleaned from Hiram Clawson. Rubber banding code was
+ * adapted from an existing Mandelbrot program written by Stacey Campbell.
+ */
+
+#define LYAP_PATCHLEVEL 4
+#define LYAP_VERSION "#(@) lyap 2.3 2/20/92"
+
+#include <assert.h>
+#include <math.h>
+
+#include "screenhack.h"
+#include "yarandom.h"
+#include "hsv.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifndef HAVE_JWXYZ
+# include <X11/cursorfont.h>
+#endif
+
+static const char *xlyap_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: true",
+ "*fpsSolid: true",
+ "*randomize: true",
+ "*builtin: -1",
+ "*minColor: 1",
+ "*maxColor: 256",
+ "*dwell: 50",
+ "*useLog: false",
+ "*colorExponent: 1.0",
+ "*colorOffset: 0",
+ "*randomForce: ", /* 0.5 */
+ "*settle: 50",
+ "*minA: 2.0",
+ "*minB: 2.0",
+ "*wheels: 7",
+ "*function: 10101010",
+ "*forcingFunction: abbabaab",
+ "*bRange: ", /* 2.0 */
+ "*startX: 0.65",
+ "*mapIndex: ", /* 0 */
+ "*outputFile: ",
+ "*beNegative: false",
+ "*rgbMax: 65000",
+ "*spinLength: 256",
+ "*show: false",
+ "*aRange: ", /* 2.0 */
+ "*delay: 10000",
+ "*linger: 5",
+ "*colors: 200",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec xlyap_options [] = {
+ { "-randomize", ".randomize", XrmoptionNoArg, "true" },
+ { "-builtin", ".builtin", XrmoptionSepArg, 0 },
+ { "-C", ".minColor", XrmoptionSepArg, 0 }, /* n */
+ { "-D", ".dwell", XrmoptionSepArg, 0 }, /* n */
+ { "-L", ".useLog", XrmoptionNoArg, "true" },
+ { "-M", ".colorExponent", XrmoptionSepArg, 0 }, /* r */
+ { "-O", ".colorOffset", XrmoptionSepArg, 0 }, /* n */
+ { "-R", ".randomForce", XrmoptionSepArg, 0 }, /* p */
+ { "-S", ".settle", XrmoptionSepArg, 0 }, /* n */
+ { "-a", ".minA", XrmoptionSepArg, 0 }, /* r */
+ { "-b", ".minB", XrmoptionSepArg, 0 }, /* n */
+ { "-c", ".wheels", XrmoptionSepArg, 0 }, /* n */
+ { "-F", ".function", XrmoptionSepArg, 0 }, /* 10101010 */
+ { "-f", ".forcingFunction", XrmoptionSepArg, 0 }, /* abbabaab */
+ { "-h", ".bRange", XrmoptionSepArg, 0 }, /* r */
+ { "-i", ".startX", XrmoptionSepArg, 0 }, /* r */
+ { "-m", ".mapIndex", XrmoptionSepArg, 0 }, /* n */
+ { "-o", ".outputFile", XrmoptionSepArg, 0 }, /* filename */
+ { "-p", ".beNegative", XrmoptionNoArg, "true" },
+ { "-r", ".rgbMax", XrmoptionSepArg, 0 }, /* n */
+ { "-s", ".spinLength", XrmoptionSepArg, 0 }, /* n */
+ { "-v", ".show", XrmoptionNoArg, "true" },
+ { "-w", ".aRange", XrmoptionSepArg, 0 }, /* r */
+ { "-delay", ".delay", XrmoptionSepArg, 0 }, /* delay */
+ { "-linger", ".linger", XrmoptionSepArg, 0 }, /* linger */
+ { 0, 0, 0, 0 }
+};
+
+
+#define ABS(a) (((a)<0) ? (0-(a)) : (a) )
+#define Min(x,y) ((x < y)?x:y)
+#define Max(x,y) ((x > y)?x:y)
+
+#ifdef SIXTEEN_COLORS
+# define MAXPOINTS 128
+# ifdef BIGMEM
+# define MAXFRAMES 4
+# else /* !BIGMEM */
+# define MAXFRAMES 2
+# endif /* !BIGMEM */
+# define MAXCOLOR 16
+#else /* !SIXTEEN_COLORS */
+# define MAXPOINTS 256
+# ifdef BIGMEM
+# define MAXFRAMES 8
+# else /* !BIGMEM */
+# define MAXFRAMES 2
+# endif /* !BIGMEM */
+# define MAXCOLOR 256
+#endif /* !SIXTEEN_COLORS */
+
+
+#define MAXINDEX 64
+#define FUNCMAXINDEX 16
+#define MAXWHEELS 7
+#define NUMMAPS 5
+#define NBUILTINS 22
+
+#ifndef TRUE
+# define TRUE 1
+# define FALSE 0
+#endif
+
+
+typedef struct {
+ int x, y;
+} xy_t;
+
+#if 0
+typedef struct {
+ int start_x, start_y;
+ int last_x, last_y;
+} rubber_band_data_t;
+#endif
+
+typedef struct {
+# ifndef HAVE_JWXYZ
+ Cursor band_cursor;
+# endif
+ double p_min, p_max, q_min, q_max;
+/* rubber_band_data_t rubber_band;*/
+} image_data_t;
+
+typedef struct points_t {
+ XPoint data[MAXCOLOR][MAXPOINTS];
+ int npoints[MAXCOLOR];
+} points_t;
+
+
+typedef double (*PFD)(double,double);
+
+/* #### What was this for? Everything was drawn twice, to the window and
+ to this, and this was never displayed! */
+/*#define BACKING_PIXMAP*/
+
+struct state {
+ Display *dpy;
+ Screen *screen;
+ Visual *visual;
+ Colormap cmap;
+
+ unsigned long foreground, background;
+
+ Window canvas;
+ int delay, linger;
+
+ unsigned int maxcolor, startcolor, mincolindex;
+ int color_offset;
+ int dwell, settle;
+ int width, height, xposition, yposition;
+
+ points_t Points;
+/* image_data_t rubber_data;*/
+
+ GC Data_GC[MAXCOLOR]/*, RubberGC*/;
+ PFD map, deriv;
+
+ int aflag, bflag, wflag, hflag, Rflag;
+
+ int maxindex;
+ int funcmaxindex;
+ double min_a, min_b, a_range, b_range, minlyap;
+ double max_a, max_b;
+ double start_x, lyapunov, a_inc, b_inc, a, b;
+ int numcolors, numfreecols, lowrange;
+ xy_t point;
+#ifdef BACKING_PIXMAP
+ Pixmap pixmap;
+#endif
+/* XColor Colors[MAXCOLOR];*/
+ double *exponents[MAXFRAMES];
+ double a_minimums[MAXFRAMES], b_minimums[MAXFRAMES];
+ double a_maximums[MAXFRAMES], b_maximums[MAXFRAMES];
+ double minexp, maxexp, prob;
+ int expind[MAXFRAMES], resized[MAXFRAMES];
+ int numwheels, force, Force, negative;
+ int rgb_max, nostart, stripe_interval;
+ int save, show, useprod, spinlength;
+ int maxframe, frame, dorecalc, mapindex, run;
+ char *outname;
+
+ int sendpoint_index;
+
+ int forcing[MAXINDEX];
+ int Forcing[FUNCMAXINDEX];
+
+ int reset_countdown;
+
+ int ncolors;
+ XColor colors[MAXCOLOR];
+};
+
+
+static const double pmins[NUMMAPS] = { 2.0, 0.0, 0.0, 0.0, 0.0 };
+static const double pmaxs[NUMMAPS] = { 4.0, 1.0, 6.75, 6.75, 16.0 };
+static const double amins[NUMMAPS] = { 2.0, 0.0, 0.0, 0.0, 0.0 };
+static const double aranges[NUMMAPS] = { 2.0, 1.0, 6.75, 6.75, 16.0 };
+static const double bmins[NUMMAPS] = { 2.0, 0.0, 0.0, 0.0, 0.0 };
+static const double branges[NUMMAPS] = { 2.0, 1.0, 6.75, 6.75, 16.0 };
+
+/****************************************************************************/
+
+/* callback function declarations
+ */
+
+static double logistic(double,double);
+static double circle(double,double);
+static double leftlog(double,double);
+static double rightlog(double,double);
+static double doublelog(double,double);
+static double dlogistic(double,double);
+static double dcircle(double,double);
+static double dleftlog(double,double);
+static double drightlog(double,double);
+static double ddoublelog(double,double);
+
+static const PFD Maps[NUMMAPS] = { logistic, circle, leftlog, rightlog,
+ doublelog };
+static const PFD Derivs[NUMMAPS] = { dlogistic, dcircle, dleftlog,
+ drightlog, ddoublelog };
+
+
+/****************************************************************************/
+
+/* other function declarations
+ */
+
+static void resize(struct state *);
+/*static void Spin(struct state *);*/
+static void show_defaults(struct state *);
+/*static void StartRubberBand(struct state *, image_data_t *, XEvent *);
+static void TrackRubberBand(struct state *, image_data_t *, XEvent *);
+static void EndRubberBand(struct state *, image_data_t *, XEvent *);*/
+/*static void CreateXorGC(struct state *);*/
+static void InitBuffer(struct state *);
+static void BufferPoint(struct state *, int color, int x, int y);
+static void FlushBuffer(struct state *);
+static void init_data(struct state *);
+static void init_color(struct state *);
+static void parseargs(struct state *);
+static void Clear(struct state *);
+static void setupmem(struct state *);
+static int complyap(struct state *);
+static Bool Getkey(struct state *, XKeyEvent *);
+static int sendpoint(struct state *, double expo);
+/*static void save_to_file(struct state *);*/
+static void setforcing(struct state *);
+static void check_params(struct state *, int mapnum, int parnum);
+static void usage(struct state *);
+static void Destroy_frame(struct state *);
+static void freemem(struct state *);
+static void Redraw(struct state *);
+static void redraw(struct state *, double *exparray, int index, int cont);
+static void recalc(struct state *);
+/*static void SetupCorners(XPoint *, image_data_t *);
+static void set_new_params(struct state *, image_data_t *);*/
+static void go_down(struct state *);
+static void go_back(struct state *);
+static void go_init(struct state *);
+static void jumpwin(struct state *);
+static void print_help(struct state *);
+static void print_values(struct state *);
+
+
+/****************************************************************************/
+
+
+/* complyap() is the guts of the program. This is where the Lyapunov exponent
+ * is calculated. For each iteration (past some large number of iterations)
+ * calculate the logarithm of the absolute value of the derivative at that
+ * point. Then average them over some large number of iterations. Some small
+ * speed up is achieved by utilizing the fact that log(a*b) = log(a) + log(b).
+ */
+static int
+complyap(struct state *st)
+{
+ int i, bindex;
+ double total, prod, x, dx, r;
+
+ if (st->maxcolor > MAXCOLOR)
+ abort();
+
+ if (!st->run)
+ return TRUE;
+ st->a += st->a_inc;
+ if (st->a >= st->max_a) {
+ if (sendpoint(st, st->lyapunov) == TRUE)
+ return FALSE;
+ else {
+ FlushBuffer(st);
+ /* if (savefile)
+ save_to_file(); */
+ return TRUE;
+ }
+ }
+ if (st->b >= st->max_b) {
+ FlushBuffer(st);
+ /* if (savefile)
+ save_to_file();*/
+ return TRUE;
+ }
+ prod = 1.0;
+ total = 0.0;
+ bindex = 0;
+ x = st->start_x;
+ r = (st->forcing[bindex]) ? st->b : st->a;
+#ifdef MAPS
+ findex = 0;
+ map = Maps[st->Forcing[findex]];
+#endif
+ for (i=0;i<st->settle;i++) { /* Here's where we let the thing */
+ x = st->map (x, r); /* "settle down". There is usually */
+ if (++bindex >= st->maxindex) { /* some initial "noise" in the */
+ bindex = 0; /* iterations. How can we optimize */
+ if (st->Rflag) /* the value of settle ??? */
+ setforcing(st);
+ }
+ r = (st->forcing[bindex]) ? st->b : st->a;
+#ifdef MAPS
+ if (++findex >= funcmaxindex)
+ findex = 0;
+ map = Maps[st->Forcing[findex]];
+#endif
+ }
+#ifdef MAPS
+ deriv = Derivs[st->Forcing[findex]];
+#endif
+ if (st->useprod) { /* using log(a*b) */
+ for (i=0;i<st->dwell;i++) {
+ x = st->map (x, r);
+ dx = st->deriv (x, r); /* ABS is a macro, so don't be fancy */
+ dx = ABS(dx);
+ if (dx == 0.0) /* log(0) is nasty so break out. */
+ {
+ i++;
+ break;
+ }
+ prod *= dx;
+ /* we need to prevent overflow and underflow */
+ if ((prod > 1.0e12) || (prod < 1.0e-12)) {
+ total += log(prod);
+ prod = 1.0;
+ }
+ if (++bindex >= st->maxindex) {
+ bindex = 0;
+ if (st->Rflag)
+ setforcing(st);
+ }
+ r = (st->forcing[bindex]) ? st->b : st->a;
+#ifdef MAPS
+ if (++findex >= funcmaxindex)
+ findex = 0;
+ map = Maps[st->Forcing[findex]];
+ deriv = Derivs[st->Forcing[findex]];
+#endif
+ }
+ total += log(prod);
+ st->lyapunov = (total * M_LOG2E) / (double)i;
+ }
+ else { /* use log(a) + log(b) */
+ for (i=0;i<st->dwell;i++) {
+ x = st->map (x, r);
+ dx = st->deriv (x, r); /* ABS is a macro, so don't be fancy */
+ dx = ABS(dx);
+ if (x == 0.0) /* log(0) check */
+ {
+ i++;
+ break;
+ }
+ total += log(dx);
+ if (++bindex >= st->maxindex) {
+ bindex = 0;
+ if (st->Rflag)
+ setforcing(st);
+ }
+ r = (st->forcing[bindex]) ? st->b : st->a;
+#ifdef MAPS
+ if (++findex >= funcmaxindex)
+ findex = 0;
+ map = Maps[st->Forcing[findex]];
+ deriv = Derivs[st->Forcing[findex]];
+#endif
+ }
+ st->lyapunov = (total * M_LOG2E) / (double)i;
+ }
+
+ if (sendpoint(st, st->lyapunov) == TRUE)
+ return FALSE;
+ else {
+ FlushBuffer(st);
+ /* if (savefile)
+ save_to_file();*/
+ return TRUE;
+ }
+}
+
+static double
+logistic(double x, double r) /* the familiar logistic map */
+{
+ return(r * x * (1.0 - x));
+}
+
+static double
+dlogistic(double x, double r) /* the derivative of logistic map */
+{
+ return(r - (2.0 * r * x));
+}
+
+static double
+circle(double x, double r) /* sin() hump or sorta like the circle map */
+{
+ return(r * sin(M_PI * x));
+}
+
+static double
+dcircle(double x, double r) /* derivative of the "sin() hump" */
+{
+ return(r * M_PI * cos(M_PI * x));
+}
+
+static double
+leftlog(double x, double r) /* left skewed logistic */
+{
+ double d;
+
+ d = 1.0 - x;
+ return(r * x * d * d);
+}
+
+static double
+dleftlog(double x, double r) /* derivative of the left skewed logistic */
+{
+ return(r * (1.0 - (4.0 * x) + (3.0 * x * x)));
+}
+
+static double
+rightlog(double x, double r) /* right skewed logistic */
+{
+ return(r * x * x * (1.0 - x));
+}
+
+static double
+drightlog(double x, double r) /* derivative of the right skewed logistic */
+{
+ return(r * ((2.0 * x) - (3.0 * x * x)));
+}
+
+static double
+doublelog(double x, double r) /* double logistic */
+{
+ double d;
+
+ d = 1.0 - x;
+ return(r * x * x * d * d);
+}
+
+static double
+ddoublelog(double x, double r) /* derivative of the double logistic */
+{
+ double d;
+
+ d = x * x;
+ return(r * ((2.0 * x) - (6.0 * d) + (4.0 * x * d)));
+}
+
+static void
+init_data(struct state *st)
+{
+ st->numcolors = get_integer_resource (st->dpy, "colors", "Integer");
+ if (st->numcolors < 2)
+ st->numcolors = 2;
+ if (st->numcolors > st->maxcolor)
+ st->numcolors = st->maxcolor;
+ st->numfreecols = st->numcolors - st->mincolindex;
+ st->lowrange = st->mincolindex - st->startcolor;
+ st->a_inc = st->a_range / (double)st->width;
+ st->b_inc = st->b_range / (double)st->height;
+ st->point.x = -1;
+ st->point.y = 0;
+ st->a = /*st->rubber_data.p_min = */st->min_a;
+ st->b = /*st->rubber_data.q_min = */st->min_b;
+/* st->rubber_data.p_max = st->max_a;
+ st->rubber_data.q_max = st->max_b;*/
+ if (st->show)
+ show_defaults(st);
+ InitBuffer(st);
+}
+
+#if 0
+static void
+hls2rgb(int hue_light_sat[3],
+ int rgb[3]) /* Each in range [0..65535] */
+{
+ unsigned short r, g, b;
+ hsv_to_rgb((int) (hue_light_sat[0] / 10), /* 0-3600 -> 0-360 */
+ (int) ((hue_light_sat[2]/1000.0) * 64435), /* 0-1000 -> 0-65535 */
+ (int) ((hue_light_sat[1]/1000.0) * 64435), /* 0-1000 -> 0-65535 */
+ &r, &g, &b);
+ rgb[0] = r;
+ rgb[1] = g;
+ rgb[2] = b;
+}
+#endif /* 0 */
+
+
+static void
+init_color(struct state *st)
+{
+ int i;
+ if (st->ncolors)
+ free_colors (st->screen, st->cmap, st->colors, st->ncolors);
+ st->ncolors = st->maxcolor;
+ make_smooth_colormap(st->screen, st->visual, st->cmap,
+ st->colors, &st->ncolors, True, NULL, True);
+
+ for (i = 0; i < st->maxcolor; i++) {
+ if (! st->Data_GC[i]) {
+ XGCValues gcv;
+ gcv.background = BlackPixelOfScreen(st->screen);
+ st->Data_GC[i] = XCreateGC(st->dpy, st->canvas, GCBackground, &gcv);
+ }
+ XSetForeground(st->dpy, st->Data_GC[i],
+ st->colors[((int) ((i / ((float)st->maxcolor)) *
+ st->ncolors))].pixel);
+ }
+}
+
+
+static void
+parseargs(struct state *st)
+{
+ int i;
+ int bindex=0, findex;
+ char *s, *ch;
+
+ st->map = Maps[0];
+ st->deriv = Derivs[0];
+ st->maxexp=st->minlyap; st->minexp= -1.0 * st->minlyap;
+
+ st->mincolindex = get_integer_resource(st->dpy, "minColor", "Integer");
+ st->dwell = get_integer_resource(st->dpy, "dwell", "Integer");
+#ifdef MAPS
+ {
+ char *optarg = get_string_resource(st->dpy, "function", "String");
+ funcmaxindex = strlen(optarg);
+ if (funcmaxindex > FUNCMAXINDEX)
+ usage();
+ ch = optarg;
+ st->Force++;
+ for (findex=0;findex<funcmaxindex;findex++) {
+ st->Forcing[findex] = (int)(*ch++ - '0');;
+ if (st->Forcing[findex] >= NUMMAPS)
+ usage();
+ }
+ }
+#endif
+ if (get_boolean_resource(st->dpy, "useLog", "Boolean"))
+ st->useprod=0;
+
+ st->minlyap=ABS(get_float_resource(st->dpy, "colorExponent", "Float"));
+ st->maxexp=st->minlyap;
+ st->minexp= -1.0 * st->minlyap;
+
+ st->color_offset = get_integer_resource(st->dpy, "colorOffset", "Integer");
+
+ st->maxcolor=ABS(get_integer_resource(st->dpy, "maxColor", "Integer"));
+ if ((st->maxcolor - st->startcolor) <= 0)
+ st->startcolor = get_pixel_resource(st->dpy, st->cmap,
+ "background", "Background");
+ if ((st->maxcolor - st->mincolindex) <= 0) {
+ st->mincolindex = 1;
+ st->color_offset = 0;
+ }
+
+ s = get_string_resource(st->dpy, "randomForce", "Float");
+ if (s && *s) {
+ st->prob=atof(s); st->Rflag++; setforcing(st);
+ }
+
+ st->settle = get_integer_resource(st->dpy, "settle", "Integer");
+
+#if 0
+ s = get_string_resource(st->dpy, "minA", "Float");
+ if (s && *s) {
+ st->min_a = atof(s);
+ st->aflag++;
+ }
+
+ s = get_string_resource(st->dpy, "minB", "Float");
+ if (s && *s) {
+ st->min_b=atof(s); st->bflag++;
+ }
+#else
+ st->min_a = get_float_resource (st->dpy, "minA", "Float");
+ st->aflag++;
+ st->min_b = get_float_resource (st->dpy, "minB", "Float");
+ st->bflag++;
+#endif
+
+
+ st->numwheels = get_integer_resource(st->dpy, "wheels", "Integer");
+
+ s = get_string_resource(st->dpy, "forcingFunction", "String");
+ if (s && *s) {
+ st->maxindex = strlen(s);
+ if (st->maxindex > MAXINDEX)
+ usage(st);
+ ch = s;
+ st->force++;
+ while (bindex < st->maxindex) {
+ if (*ch == 'a')
+ st->forcing[bindex++] = 0;
+ else if (*ch == 'b')
+ st->forcing[bindex++] = 1;
+ else
+ usage(st);
+ ch++;
+ }
+ }
+
+ s = get_string_resource(st->dpy, "bRange", "Float");
+ if (s && *s) {
+ st->b_range = atof(s);
+ st->hflag++;
+ }
+
+ st->start_x = get_float_resource(st->dpy, "startX", "Float");
+
+ s = get_string_resource(st->dpy, "mapIndex", "Integer");
+ if (s && *s) {
+ st->mapindex=atoi(s);
+ if ((st->mapindex >= NUMMAPS) || (st->mapindex < 0))
+ usage(st);
+ st->map = Maps[st->mapindex];
+ st->deriv = Derivs[st->mapindex];
+ if (!st->aflag)
+ st->min_a = amins[st->mapindex];
+ if (!st->wflag)
+ st->a_range = aranges[st->mapindex];
+ if (!st->bflag)
+ st->min_b = bmins[st->mapindex];
+ if (!st->hflag)
+ st->b_range = branges[st->mapindex];
+ if (!st->Force)
+ for (i=0;i<FUNCMAXINDEX;i++)
+ st->Forcing[i] = st->mapindex;
+ }
+
+ st->outname = get_string_resource(st->dpy, "outputFile", "Integer");
+
+ if (get_boolean_resource(st->dpy, "beNegative", "Boolean"))
+ st->negative--;
+
+ st->rgb_max = get_integer_resource(st->dpy, "rgbMax", "Integer");
+ st->spinlength = get_integer_resource(st->dpy, "spinLength", "Integer");
+ st->show = get_boolean_resource(st->dpy, "show", "Boolean");
+
+ s = get_string_resource(st->dpy, "aRange", "Float");
+ if (s && *s) {
+ st->a_range = atof(s); st->wflag++;
+ }
+
+ st->max_a = st->min_a + st->a_range;
+ st->max_b = st->min_b + st->b_range;
+
+ st->a_minimums[0] = st->min_a; st->b_minimums[0] = st->min_b;
+ st->a_maximums[0] = st->max_a; st->b_maximums[0] = st->max_b;
+
+ if (st->Force)
+ if (st->maxindex == st->funcmaxindex)
+ for (findex=0;findex<st->funcmaxindex;findex++)
+ check_params(st, st->Forcing[findex],st->forcing[findex]);
+ else
+ fprintf(stderr, "Warning! Unable to check parameters\n");
+ else
+ check_params(st, st->mapindex,2);
+}
+
+static void
+check_params(struct state *st, int mapnum, int parnum)
+{
+
+ if (parnum != 1) {
+ if ((st->max_a > pmaxs[mapnum]) || (st->min_a < pmins[mapnum])) {
+ fprintf(stderr, "Warning! Parameter 'a' out of range.\n");
+ fprintf(stderr, "You have requested a range of (%f,%f).\n",
+ st->min_a,st->max_a);
+ fprintf(stderr, "Valid range is (%f,%f).\n",
+ pmins[mapnum],pmaxs[mapnum]);
+ }
+ }
+ if (parnum != 0) {
+ if ((st->max_b > pmaxs[mapnum]) || (st->min_b < pmins[mapnum])) {
+ fprintf(stderr, "Warning! Parameter 'b' out of range.\n");
+ fprintf(stderr, "You have requested a range of (%f,%f).\n",
+ st->min_b,st->max_b);
+ fprintf(stderr, "Valid range is (%f,%f).\n",
+ pmins[mapnum],pmaxs[mapnum]);
+ }
+ }
+}
+
+static void
+usage(struct state *st)
+{
+ fprintf(stderr,"lyap [-BLs][-W#][-H#][-a#][-b#][-w#][-h#][-x xstart]\n");
+ fprintf(stderr,"\t[-M#][-S#][-D#][-f string][-r#][-O#][-C#][-c#][-m#]\n");
+#ifdef MAPS
+ fprintf(stderr,"\t[-F string]\n");
+#endif
+ fprintf(stderr,"\tWhere: -C# specifies the minimum color index\n");
+ fprintf(stderr,"\t -r# specifies the maxzimum rgb value\n");
+ fprintf(stderr,"\t -u displays this message\n");
+ fprintf(stderr,"\t -a# specifies the minimum horizontal parameter\n");
+ fprintf(stderr,"\t -b# specifies the minimum vertical parameter\n");
+ fprintf(stderr,"\t -w# specifies the horizontal parameter range\n");
+ fprintf(stderr,"\t -h# specifies the vertical parameter range\n");
+ fprintf(stderr,"\t -D# specifies the dwell\n");
+ fprintf(stderr,"\t -S# specifies the settle\n");
+ fprintf(stderr,"\t -H# specifies the initial window height\n");
+ fprintf(stderr,"\t -W# specifies the initial window width\n");
+ fprintf(stderr,"\t -O# specifies the color offset\n");
+ fprintf(stderr,"\t -c# specifies the desired color wheel\n");
+ fprintf(stderr,"\t -m# specifies the desired map (0-4)\n");
+ fprintf(stderr,"\t -f aabbb specifies a forcing function of 00111\n");
+#ifdef MAPS
+ fprintf(stderr,"\t -F 00111 specifies the function forcing function\n");
+#endif
+ fprintf(stderr,"\t -L indicates use log(x)+log(y) rather than log(xy)\n");
+ fprintf(stderr,"\tDuring display :\n");
+ fprintf(stderr,"\t Use the mouse to zoom in on an area\n");
+ fprintf(stderr,"\t e or E recalculates color indices\n");
+ fprintf(stderr,"\t f or F saves exponents to a file\n");
+ fprintf(stderr,"\t KJmn increase/decrease minimum negative exponent\n");
+ fprintf(stderr,"\t r or R redraws\n");
+ fprintf(stderr,"\t s or S spins the colorwheel\n");
+ fprintf(stderr,"\t w or W changes the color wheel\n");
+ fprintf(stderr,"\t x or X clears the window\n");
+ fprintf(stderr,"\t q or Q exits\n");
+ exit(1);
+}
+
+static void
+Cycle_frames(struct state *st)
+{
+ int i;
+ for (i=0;i<=st->maxframe;i++)
+ redraw(st, st->exponents[i], st->expind[i], 1);
+}
+
+#if 0
+static void
+Spin(struct state *st)
+{
+ int i, j;
+ long tmpxcolor;
+
+ if (!mono_p) {
+ for (j=0;j<st->spinlength;j++) {
+ tmpxcolor = st->Colors[st->mincolindex].pixel;
+ for (i=st->mincolindex;i<st->numcolors-1;i++)
+ st->Colors[i].pixel = st->Colors[i+1].pixel;
+ st->Colors[st->numcolors-1].pixel = tmpxcolor;
+ XStoreColors(st->dpy, st->cmap, st->Colors, st->numcolors);
+ }
+ for (j=0;j<st->spinlength;j++) {
+ tmpxcolor = st->Colors[st->numcolors-1].pixel;
+ for (i=st->numcolors-1;i>st->mincolindex;i--)
+ st->Colors[i].pixel = st->Colors[i-1].pixel;
+ st->Colors[st->mincolindex].pixel = tmpxcolor;
+ XStoreColors(st->dpy, st->cmap, st->Colors, st->numcolors);
+ }
+ }
+}
+#endif
+
+static Bool
+Getkey(struct state *st, XKeyEvent *event)
+{
+ unsigned char key;
+ int i;
+ if (XLookupString(event, (char *)&key, sizeof(key), (KeySym *)0,
+ (XComposeStatus *) 0) > 0) {
+
+ if (st->reset_countdown)
+ st->reset_countdown = st->linger;
+
+ switch (key) {
+ case '<': st->dwell /= 2; if (st->dwell < 1) st->dwell = 1; return True;
+ case '>': st->dwell *= 2; return True;
+ case '[': st->settle /= 2; if (st->settle < 1) st->settle = 1; return True;
+ case ']': st->settle *= 2; return True;
+ case 'd': go_down(st); return True;
+ case 'D': FlushBuffer(st); return True;
+ case 'e':
+ case 'E': FlushBuffer(st);
+ st->dorecalc = (!st->dorecalc);
+ if (st->dorecalc)
+ recalc(st);
+ else {
+ st->maxexp = st->minlyap; st->minexp = -1.0 * st->minlyap;
+ }
+ redraw(st, st->exponents[st->frame], st->expind[st->frame], 1);
+ return True;
+ case 'f':
+ /* case 'F': save_to_file(); return True;*/
+ case 'i': if (st->stripe_interval > 0) {
+ st->stripe_interval--;
+ if (!mono_p) {
+ init_color(st);
+ }
+ }
+ return True;
+ case 'I': st->stripe_interval++;
+ if (!mono_p) {
+ init_color(st);
+ }
+ return True;
+ case 'K': if (st->minlyap > 0.05)
+ st->minlyap -= 0.05;
+ return True;
+ case 'J': st->minlyap += 0.05;
+ return True;
+ case 'm': st->mapindex++;
+ if (st->mapindex >= NUMMAPS)
+ st->mapindex=0;
+ st->map = Maps[st->mapindex];
+ st->deriv = Derivs[st->mapindex];
+ if (!st->aflag)
+ st->min_a = amins[st->mapindex];
+ if (!st->wflag)
+ st->a_range = aranges[st->mapindex];
+ if (!st->bflag)
+ st->min_b = bmins[st->mapindex];
+ if (!st->hflag)
+ st->b_range = branges[st->mapindex];
+ if (!st->Force)
+ for (i=0;i<FUNCMAXINDEX;i++)
+ st->Forcing[i] = st->mapindex;
+ st->max_a = st->min_a + st->a_range;
+ st->max_b = st->min_b + st->b_range;
+ st->a_minimums[0] = st->min_a; st->b_minimums[0] = st->min_b;
+ st->a_maximums[0] = st->max_a; st->b_maximums[0] = st->max_b;
+ st->a_inc = st->a_range / (double)st->width;
+ st->b_inc = st->b_range / (double)st->height;
+ st->point.x = -1;
+ st->point.y = 0;
+ st->a = /*st->rubber_data.p_min = */st->min_a;
+ st->b = /*st->rubber_data.q_min = */st->min_b;
+/* st->rubber_data.p_max = st->max_a;
+ st->rubber_data.q_max = st->max_b;*/
+ Clear(st);
+ return True;
+ case 'M': if (st->minlyap > 0.005)
+ st->minlyap -= 0.005;
+ return True;
+ case 'N': st->minlyap += 0.005;
+ return True;
+ case 'p':
+ case 'P': st->negative = (!st->negative);
+ FlushBuffer(st); redraw(st, st->exponents[st->frame],
+ st->expind[st->frame], 1);
+ return True;
+ case 'r': FlushBuffer(st); redraw(st, st->exponents[st->frame],
+ st->expind[st->frame], 1);
+ return True;
+ case 'R': FlushBuffer(st); Redraw(st); return True;
+ case 's':
+ st->spinlength=st->spinlength/2;
+#if 0
+ case 'S': if (!mono_p)
+ Spin(st);
+ st->spinlength=st->spinlength*2; return True;
+#endif
+ case 'u': go_back(st); return True;
+ case 'U': go_init(st); return True;
+ case 'v':
+ case 'V': print_values(st); return True;
+ case 'W': if (st->numwheels < MAXWHEELS)
+ st->numwheels++;
+ else
+ st->numwheels = 0;
+ if (!mono_p) {
+ init_color(st);
+ }
+ return True;
+ case 'w': if (st->numwheels > 0)
+ st->numwheels--;
+ else
+ st->numwheels = MAXWHEELS;
+ if (!mono_p) {
+ init_color(st);
+ }
+ return True;
+ case 'x': Clear(st); return True;
+ case 'X': Destroy_frame(st); return True;
+ case 'z': Cycle_frames(st); redraw(st, st->exponents[st->frame],
+ st->expind[st->frame], 1);
+ return True;
+#if 0
+ case 'Z': while (!XPending(st->dpy)) Cycle_frames(st);
+ redraw(st, st->exponents[st->frame], st->expind[st->frame], 1);
+ return True;
+#endif
+ case 'q':
+ case 'Q': exit(0); return True;
+ case '?':
+ case 'h':
+ case 'H': print_help(st); return True;
+ default: return False;
+ }
+ }
+
+ return False;
+}
+
+/* Here's where we index into a color map. After the Lyapunov exponent is
+ * calculated, it is used to determine what color to use for that point. I
+ * suppose there are a lot of ways to do this. I used the following : if it's
+ * non-negative then there's a reserved area at the lower range of the color
+ * map that i index into. The ratio of some "minimum exponent value" and the
+ * calculated value is used as a ratio of how high to index into this reserved
+ * range. Usually these colors are dark red (see init_color). If the exponent
+ * is negative, the same ratio (expo/minlyap) is used to index into the
+ * remaining portion of the colormap (which is usually some light shades of
+ * color or a rainbow wheel). The coloring scheme can actually make a great
+ * deal of difference in the quality of the picture. Different colormaps bring
+ * out different details of the dynamics while different indexing algorithms
+ * also greatly effect what details are seen. Play around with this.
+ */
+static int
+sendpoint(struct state *st, double expo)
+{
+ double tmpexpo;
+
+ if (st->maxcolor > MAXCOLOR)
+ abort();
+
+#if 0
+ /* The relationship st->minexp <= expo <= maxexp should always be true. This
+ test enforces that. But maybe not enforcing it makes better pictures. */
+ if (expo < st->minexp)
+ expo = st->minexp;
+ else if (expo > maxexp)
+ expo = maxexp;
+#endif
+
+ st->point.x++;
+ tmpexpo = (st->negative) ? expo : -1.0 * expo;
+ if (tmpexpo > 0) {
+ if (!mono_p) {
+ st->sendpoint_index = (int)(tmpexpo*st->lowrange/st->maxexp);
+ st->sendpoint_index = ((st->sendpoint_index % st->lowrange) +
+ st->startcolor);
+ }
+ else
+ st->sendpoint_index = 0;
+ }
+ else {
+ if (!mono_p) {
+ st->sendpoint_index = (int)(tmpexpo*st->numfreecols/st->minexp);
+ st->sendpoint_index = ((st->sendpoint_index % st->numfreecols)
+ + st->mincolindex);
+ }
+ else
+ st->sendpoint_index = 1;
+ }
+ BufferPoint(st, st->sendpoint_index, st->point.x, st->point.y);
+ if (st->save) {
+ if (st->frame > MAXFRAMES)
+ abort();
+ st->exponents[st->frame][st->expind[st->frame]++] = expo;
+ }
+ if (st->point.x >= st->width) {
+ st->point.y++;
+ st->point.x = 0;
+ if (st->save) {
+ st->b += st->b_inc;
+ st->a = st->min_a;
+ }
+ if (st->point.y >= st->height)
+ return FALSE;
+ else
+ return TRUE;
+ }
+ return TRUE;
+}
+
+
+static void
+resize(struct state *st)
+{
+ Window r;
+ int n, x, y;
+ unsigned int bw, d, new_w, new_h;
+
+ XGetGeometry(st->dpy,st->canvas,&r,&x,&y,&new_w,&new_h,&bw,&d);
+ if ((new_w == st->width) && (new_h == st->height))
+ return;
+ st->width = new_w; st->height = new_h;
+ XClearWindow(st->dpy, st->canvas);
+#ifdef BACKING_PIXMAP
+ if (st->pixmap)
+ XFreePixmap(st->dpy, st->pixmap);
+ st->pixmap = XCreatePixmap(st->dpy, st->canvas, st->width, st->height, d);
+#endif
+ st->a_inc = st->a_range / (double)st->width;
+ st->b_inc = st->b_range / (double)st->height;
+ st->point.x = -1;
+ st->point.y = 0;
+ st->run = 1;
+ st->a = /*st->rubber_data.p_min = */st->min_a;
+ st->b = /*st->rubber_data.q_min = */st->min_b;
+/* st->rubber_data.p_max = st->max_a;
+ st->rubber_data.q_max = st->max_b;*/
+ freemem(st);
+ setupmem(st);
+ for (n=0;n<MAXFRAMES;n++)
+ if ((n <= st->maxframe) && (n != st->frame))
+ st->resized[n] = 1;
+ InitBuffer(st);
+ Clear(st);
+ Redraw(st);
+}
+
+static void
+redraw(struct state *st, double *exparray, int index, int cont)
+{
+ int i, x_sav, y_sav;
+
+ x_sav = st->point.x;
+ y_sav = st->point.y;
+
+ st->point.x = -1;
+ st->point.y = 0;
+
+ st->save=0;
+ for (i=0;i<index;i++)
+ sendpoint(st, exparray[i]);
+ st->save=1;
+
+ if (cont) {
+ st->point.x = x_sav;
+ st->point.y = y_sav;
+ }
+ else {
+ st->a = st->point.x * st->a_inc + st->min_a;
+ st->b = st->point.y * st->b_inc + st->min_b;
+ }
+ FlushBuffer(st);
+}
+
+static void
+Redraw(struct state *st)
+{
+ FlushBuffer(st);
+ st->point.x = -1;
+ st->point.y = 0;
+ st->run = 1;
+ st->a = st->min_a;
+ st->b = st->min_b;
+ st->expind[st->frame] = 0;
+ st->resized[st->frame] = 0;
+}
+
+static void
+recalc(struct state *st)
+{
+ int i;
+
+ st->minexp = st->maxexp = 0.0;
+ for (i=0;i<st->expind[st->frame];i++) {
+ if (st->exponents[st->frame][i] < st->minexp)
+ st->minexp = st->exponents[st->frame][i];
+ if (st->exponents[st->frame][i] > st->maxexp)
+ st->maxexp = st->exponents[st->frame][i];
+ }
+}
+
+static void
+Clear(struct state *st)
+{
+ XClearWindow(st->dpy, st->canvas);
+#ifdef BACKING_PIXMAP
+ XCopyArea(st->dpy, st->canvas, st->pixmap, st->Data_GC[0],
+ 0, 0, st->width, st->height, 0, 0);
+#endif
+ InitBuffer(st);
+}
+
+static void
+show_defaults(struct state *st)
+{
+
+ printf("Width=%d Height=%d numcolors=%d settle=%d dwell=%d\n",
+ st->width,st->height,st->numcolors,st->settle,st->dwell);
+ printf("min_a=%f a_range=%f max_a=%f\n", st->min_a,st->a_range,st->max_a);
+ printf("min_b=%f b_range=%f max_b=%f\n", st->min_b,st->b_range,st->max_b);
+ printf("minlyap=%f minexp=%f maxexp=%f\n", st->minlyap,st->minexp,
+ st->maxexp);
+ exit(0);
+}
+
+#if 0
+static void
+CreateXorGC(struct state *st)
+{
+ XGCValues values;
+
+ values.foreground = st->foreground;
+ values.function = GXxor;
+ st->RubberGC = XCreateGC(st->dpy, st->canvas,
+ GCForeground | GCFunction, &values);
+}
+
+static void
+StartRubberBand(struct state *st, image_data_t *data, XEvent *event)
+{
+ XPoint corners[5];
+
+ st->nostart = 0;
+ data->rubber_band.last_x = data->rubber_band.start_x = event->xbutton.x;
+ data->rubber_band.last_y = data->rubber_band.start_y = event->xbutton.y;
+ SetupCorners(corners, data);
+ XDrawLines(st->dpy, st->canvas, st->RubberGC,
+ corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+}
+
+static void
+SetupCorners(XPoint *corners, image_data_t *data)
+{
+ corners[0].x = data->rubber_band.start_x;
+ corners[0].y = data->rubber_band.start_y;
+ corners[1].x = data->rubber_band.start_x;
+ corners[1].y = data->rubber_band.last_y;
+ corners[2].x = data->rubber_band.last_x;
+ corners[2].y = data->rubber_band.last_y;
+ corners[3].x = data->rubber_band.last_x;
+ corners[3].y = data->rubber_band.start_y;
+ corners[4] = corners[0];
+}
+
+static void
+TrackRubberBand(struct state *st, image_data_t *data, XEvent *event)
+{
+ XPoint corners[5];
+ int xdiff, ydiff;
+
+ if (st->nostart)
+ return;
+ SetupCorners(corners, data);
+ XDrawLines(st->dpy, st->canvas, st->RubberGC,
+ corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+ ydiff = event->xbutton.y - data->rubber_band.start_y;
+ xdiff = event->xbutton.x - data->rubber_band.start_x;
+ data->rubber_band.last_x = data->rubber_band.start_x + xdiff;
+ data->rubber_band.last_y = data->rubber_band.start_y + ydiff;
+ if (data->rubber_band.last_y < data->rubber_band.start_y ||
+ data->rubber_band.last_x < data->rubber_band.start_x)
+ {
+ data->rubber_band.last_y = data->rubber_band.start_y;
+ data->rubber_band.last_x = data->rubber_band.start_x;
+ }
+ SetupCorners(corners, data);
+ XDrawLines(st->dpy, st->canvas, st->RubberGC,
+ corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+}
+
+static void
+EndRubberBand(struct state *st, image_data_t *data, XEvent *event)
+{
+ XPoint corners[5];
+ XPoint top, bot;
+ double delta, diff;
+
+ st->nostart = 1;
+ SetupCorners(corners, data);
+ XDrawLines(st->dpy, st->canvas, st->RubberGC,
+ corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+ if (data->rubber_band.start_x >= data->rubber_band.last_x ||
+ data->rubber_band.start_y >= data->rubber_band.last_y)
+ return;
+ top.x = data->rubber_band.start_x;
+ bot.x = data->rubber_band.last_x;
+ top.y = data->rubber_band.start_y;
+ bot.y = data->rubber_band.last_y;
+ diff = data->q_max - data->q_min;
+ delta = (double)top.y / (double)st->height;
+ data->q_min += diff * delta;
+ delta = (double)(st->height - bot.y) / (double)st->height;
+ data->q_max -= diff * delta;
+ diff = data->p_max - data->p_min;
+ delta = (double)top.x / (double)st->width;
+ data->p_min += diff * delta;
+ delta = (double)(st->width - bot.x) / (double)st->width;
+ data->p_max -= diff * delta;
+ set_new_params(st, data);
+}
+
+static void
+set_new_params(struct state *st, image_data_t *data)
+{
+ st->frame = (st->maxframe + 1) % MAXFRAMES;
+ if (st->frame > st->maxframe)
+ st->maxframe = st->frame;
+ st->a_range = data->p_max - data->p_min;
+ st->b_range = data->q_max - data->q_min;
+ st->a_minimums[st->frame] = st->min_a = data->p_min;
+ st->b_minimums[st->frame] = st->min_b = data->q_min;
+ st->a_inc = st->a_range / (double)st->width;
+ st->b_inc = st->b_range / (double)st->height;
+ st->point.x = -1;
+ st->point.y = 0;
+ st->run = 1;
+ st->a = st->min_a;
+ st->b = st->min_b;
+ st->a_maximums[st->frame] = st->max_a = data->p_max;
+ st->b_maximums[st->frame] = st->max_b = data->q_max;
+ st->expind[st->frame] = 0;
+ Clear(st);
+}
+#endif
+
+static void
+go_down(struct state *st)
+{
+ st->frame++;
+ if (st->frame > st->maxframe)
+ st->frame = 0;
+ jumpwin(st);
+}
+
+static void
+go_back(struct state *st)
+{
+ st->frame--;
+ if (st->frame < 0)
+ st->frame = st->maxframe;
+ jumpwin(st);
+}
+
+static void
+jumpwin(struct state *st)
+{
+ /*st->rubber_data.p_min =*/ st->min_a = st->a_minimums[st->frame];
+ /*st->rubber_data.q_min =*/ st->min_b = st->b_minimums[st->frame];
+ /*st->rubber_data.p_max =*/ st->max_a = st->a_maximums[st->frame];
+ /*st->rubber_data.q_max =*/ st->max_b = st->b_maximums[st->frame];
+ st->a_range = st->max_a - st->min_a;
+ st->b_range = st->max_b - st->min_b;
+ st->a_inc = st->a_range / (double)st->width;
+ st->b_inc = st->b_range / (double)st->height;
+ st->point.x = -1;
+ st->point.y = 0;
+ st->a = st->min_a;
+ st->b = st->min_b;
+ Clear(st);
+ if (st->resized[st->frame])
+ Redraw(st);
+ else
+ redraw(st, st->exponents[st->frame], st->expind[st->frame], 0);
+}
+
+static void
+go_init(struct state *st)
+{
+ st->frame = 0;
+ jumpwin(st);
+}
+
+static void
+Destroy_frame(struct state *st)
+{
+ int i;
+
+ for (i=st->frame; i<st->maxframe; i++) {
+ st->exponents[st->frame] = st->exponents[st->frame+1];
+ st->expind[st->frame] = st->expind[st->frame+1];
+ st->a_minimums[st->frame] = st->a_minimums[st->frame+1];
+ st->b_minimums[st->frame] = st->b_minimums[st->frame+1];
+ st->a_maximums[st->frame] = st->a_maximums[st->frame+1];
+ st->b_maximums[st->frame] = st->b_maximums[st->frame+1];
+ }
+ st->maxframe--;
+ go_back(st);
+}
+
+static void
+InitBuffer(struct state *st)
+{
+ int i;
+
+ for (i = 0 ; i < st->maxcolor; ++i)
+ st->Points.npoints[i] = 0;
+}
+
+static void
+BufferPoint(struct state *st, int color, int x, int y)
+{
+ if (st->maxcolor > MAXCOLOR)
+ abort();
+
+ /* Guard against bogus color values. Shouldn't be necessary but paranoia
+ is good. */
+ if (color < 0)
+ color = 0;
+ else if (color >= st->maxcolor)
+ color = st->maxcolor - 1;
+
+ if (st->Points.npoints[color] == MAXPOINTS)
+ {
+ XDrawPoints(st->dpy, st->canvas, st->Data_GC[color],
+ st->Points.data[color], st->Points.npoints[color],
+ CoordModeOrigin);
+#ifdef BACKING_PIXMAP
+ XDrawPoints(st->dpy, st->pixmap, st->Data_GC[color],
+ st->Points.data[color], st->Points.npoints[color],
+ CoordModeOrigin);
+#endif
+ st->Points.npoints[color] = 0;
+ }
+ st->Points.data[color][st->Points.npoints[color]].x = x;
+ st->Points.data[color][st->Points.npoints[color]].y = y;
+ ++st->Points.npoints[color];
+}
+
+static void
+FlushBuffer(struct state *st)
+{
+ int color;
+
+ for (color = 0; color < st->maxcolor; ++color)
+ if (st->Points.npoints[color])
+ {
+ XDrawPoints(st->dpy, st->canvas, st->Data_GC[color],
+ st->Points.data[color], st->Points.npoints[color],
+ CoordModeOrigin);
+#ifdef BACKING_PIXMAP
+ XDrawPoints(st->dpy, st->pixmap, st->Data_GC[color],
+ st->Points.data[color], st->Points.npoints[color],
+ CoordModeOrigin);
+#endif
+ st->Points.npoints[color] = 0;
+ }
+}
+
+static void
+print_help(struct state *st)
+{
+ printf("During run-time, interactive control can be exerted via : \n");
+ printf("Mouse buttons allow rubber-banding of a zoom box\n");
+ printf("< halves the 'dwell', > doubles the 'dwell'\n");
+ printf("[ halves the 'settle', ] doubles the 'settle'\n");
+ printf("D flushes the drawing buffer\n");
+ printf("e or E recalculates color indices\n");
+ printf("f or F saves exponents to a file\n");
+ printf("h or H or ? displays this message\n");
+ printf("i decrements, I increments the stripe interval\n");
+ printf("KJMN increase/decrease minimum negative exponent\n");
+ printf("m increments the map index, changing maps\n");
+ printf("p or P reverses the colormap for negative/positive exponents\n");
+ printf("r redraws without recalculating\n");
+ printf("R redraws, recalculating with new dwell and settle values\n");
+ printf("s or S spins the colorwheel\n");
+ printf("u pops back up to the last zoom\n");
+ printf("U pops back up to the first picture\n");
+ printf("v or V displays the values of various settings\n");
+ printf("w decrements, W increments the color wheel index\n");
+ printf("x or X clears the window\n");
+ printf("q or Q exits\n");
+}
+
+static void
+print_values(struct state *st)
+{
+ int i;
+ printf("\nminlyap=%f minexp=%f maxexp=%f\n",
+ st->minlyap,st->minexp, st->maxexp);
+ printf("width=%d height=%d\n",st->width,st->height);
+ printf("settle=%d dwell=%d st->start_x=%f\n",
+ st->settle,st->dwell, st->start_x);
+ printf("min_a=%f a_rng=%f max_a=%f\n",
+ st->min_a,st->a_range,st->max_a);
+ printf("min_b=%f b_rng=%f max_b=%f\n",
+ st->min_b,st->b_range,st->max_b);
+ if (st->Rflag)
+ printf("pseudo-random forcing\n");
+ else if (st->force) {
+ printf("periodic forcing=");
+ for (i=0;i<st->maxindex;i++)
+ printf("%d",st->forcing[i]);
+ printf("\n");
+ }
+ else
+ printf("periodic forcing=01\n");
+ if (st->Force) {
+ printf("function forcing=");
+ for (i=0;i<st->funcmaxindex;i++) {
+ printf("%d",st->Forcing[i]);
+ }
+ printf("\n");
+ }
+ printf("numcolors=%d\n",st->numcolors-1);
+}
+
+static void
+freemem(struct state *st)
+{
+ int i;
+ for (i=0;i<MAXFRAMES;i++)
+ free(st->exponents[i]);
+}
+
+static void
+setupmem(struct state *st)
+{
+ int i;
+ for (i=0;i<MAXFRAMES;i++) {
+ if((st->exponents[i]=
+ (double *)malloc(sizeof(double)*st->width*(st->height+1)))==NULL){
+ fprintf(stderr,"Error malloc'ing exponent array.\n");
+ exit(-1);
+ }
+ }
+}
+
+static void
+setforcing(struct state *st)
+{
+ int i;
+ for (i=0;i<MAXINDEX;i++)
+ st->forcing[i] = (random() > st->prob) ? 0 : 1;
+}
+
+/****************************************************************************/
+
+static void
+do_defaults (struct state *st)
+{
+ int i;
+
+ memset (st->expind, 0, sizeof(st->expind));
+ memset (st->resized, 0, sizeof(st->resized));
+
+ st->aflag = 0;
+ st->bflag = 0;
+ st->hflag = 0;
+ st->wflag = 0;
+ st->minexp = 0;
+ st->mapindex = 0;
+
+# ifdef SIXTEEN_COLORS
+ st->maxcolor=16;
+ st->startcolor=0;
+ st->color_offset=0;
+ st->mincolindex=1;
+ st->dwell=50;
+ st->settle=25;
+ st->xposition=128;
+ st->yposition=128;
+# else /* !SIXTEEN_COLORS */
+ st->maxcolor=256;
+ st->startcolor=17;
+ st->color_offset=96;
+ st->mincolindex=33;
+ st->dwell=100;
+ st->settle=50;
+# endif /* !SIXTEEN_COLORS */
+
+ st->maxindex = MAXINDEX;
+ st->funcmaxindex = FUNCMAXINDEX;
+ st->min_a=2.0;
+ st->min_b=2.0;
+ st->a_range=2.0;
+ st->b_range=2.0;
+ st->minlyap=1.0;
+ st->max_a=4.0;
+ st->max_b=4.0;
+ st->numcolors=16;
+ st->prob=0.5;
+ st->numwheels=MAXWHEELS;
+ st->negative=1;
+ st->rgb_max=65000;
+ st->nostart=1;
+ st->stripe_interval=7;
+ st->save=1;
+ st->useprod=1;
+ st->spinlength=256;
+ st->run=1;
+
+ for (i = 0; i < countof(st->forcing); i++)
+ st->forcing[i] = (i & 1) ? 1 : 0;
+}
+
+static void
+do_preset (struct state *st, int builtin)
+{
+ char *ff = 0;
+ switch (builtin) {
+ case 0:
+ st->min_a = 3.75; st->aflag++;
+ st->min_b = 3.299999; st->bflag++;
+ st->a_range = 0.05; st->wflag++;
+ st->b_range = 0.05; st->hflag++;
+ st->dwell = 200;
+ st->settle = 100;
+ ff = "abaabbaaabbb";
+ break;
+
+ case 1:
+ st->min_a = 3.8; st->aflag++;
+ st->min_b = 3.2; st->bflag++;
+ st->b_range = .05; st->hflag++;
+ st->a_range = .05; st->wflag++;
+ ff = "bbbbbaaaaa";
+ break;
+
+ case 2:
+ st->min_a = 3.4; st->aflag++;
+ st->min_b = 3.04; st->bflag++;
+ st->a_range = .5; st->wflag++;
+ st->b_range = .5; st->hflag++;
+ ff = "abbbbbbbbb";
+ st->settle = 500;
+ st->dwell = 1000;
+ break;
+
+ case 3:
+ st->min_a = 3.5; st->aflag++;
+ st->min_b = 3.0; st->bflag++;
+ st->a_range = 0.2; st->wflag++;
+ st->b_range = 0.2; st->hflag++;
+ st->dwell = 600;
+ st->settle = 300;
+ ff = "aaabbbab";
+ break;
+
+ case 4:
+ st->min_a = 3.55667; st->aflag++;
+ st->min_b = 3.2; st->bflag++;
+ st->b_range = .05; st->hflag++;
+ st->a_range = .05; st->wflag++;
+ ff = "bbbbbaaaaa";
+ break;
+
+ case 5:
+ st->min_a = 3.79; st->aflag++;
+ st->min_b = 3.22; st->bflag++;
+ st->b_range = .02999; st->hflag++;
+ st->a_range = .02999; st->wflag++;
+ ff = "bbbbbaaaaa";
+ break;
+
+ case 6:
+ st->min_a = 3.7999; st->aflag++;
+ st->min_b = 3.299999; st->bflag++;
+ st->a_range = 0.2; st->wflag++;
+ st->b_range = 0.2; st->hflag++;
+ st->dwell = 300;
+ st->settle = 150;
+ ff = "abaabbaaabbb";
+ break;
+
+ case 7:
+ st->min_a = 3.89; st->aflag++;
+ st->min_b = 3.22; st->bflag++;
+ st->b_range = .028; st->hflag++;
+ st->a_range = .02999; st->wflag++;
+ ff = "bbbbbaaaaa";
+ st->settle = 600;
+ st->dwell = 1000;
+ break;
+
+ case 8:
+ st->min_a = 3.2; st->aflag++;
+ st->min_b = 3.7; st->bflag++;
+ st->a_range = 0.05; st->wflag++;
+ st->b_range = .005; st->hflag++;
+ ff = "abbbbaa";
+ break;
+
+ case 9:
+ ff = "aaaaaabbbbbb";
+ st->mapindex = 1;
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 10:
+ ff = "aaaaaabbbbbb";
+ st->mapindex = 1;
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 11:
+ st->mapindex = 1;
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 12:
+ ff = "abbb";
+ st->mapindex = 1;
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 13:
+ ff = "abbabaab";
+ st->mapindex = 1;
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 14:
+ ff = "abbabaab";
+ st->dwell = 800;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ /* #### -x 0.05 */
+ st->min_a = 3.91; st->aflag++;
+ st->a_range = 0.0899999999; st->wflag++;
+ st->min_b = 3.28; st->bflag++;
+ st->b_range = 0.35; st->hflag++;
+ break;
+
+ case 15:
+ ff = "aaaaaabbbbbb";
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 16:
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 17:
+ ff = "abbb";
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 18:
+ ff = "abbabaab";
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 19:
+ st->mapindex = 2;
+ ff = "aaaaaabbbbbb";
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 20:
+ st->mapindex = 2;
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 21:
+ st->mapindex = 2;
+ ff = "abbb";
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ case 22:
+ st->mapindex = 2;
+ ff = "abbabaab";
+ st->dwell = 400;
+ st->settle = 200;
+ st->minlyap = st->maxexp = ABS(-0.85);
+ st->minexp = -1.0 * st->minlyap;
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ if (ff) {
+ char *ch;
+ int bindex = 0;
+ st->maxindex = strlen(ff);
+ if (st->maxindex > MAXINDEX)
+ usage(st);
+ ch = ff;
+ st->force++;
+ while (bindex < st->maxindex) {
+ if (*ch == 'a')
+ st->forcing[bindex++] = 0;
+ else if (*ch == 'b')
+ st->forcing[bindex++] = 1;
+ else
+ usage(st);
+ ch++;
+ }
+ }
+}
+
+
+static void *
+xlyap_init (Display *d, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes xgwa;
+ int builtin = -1;
+ XGetWindowAttributes (d, window, &xgwa);
+ st->dpy = d;
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ st->visual = xgwa.visual;
+ st->screen = xgwa.screen;
+ st->cmap = xgwa.colormap;
+
+ do_defaults(st);
+ parseargs(st);
+
+ if (get_boolean_resource(st->dpy, "randomize", "Boolean"))
+ builtin = random() % NBUILTINS;
+ else {
+ char *s = get_string_resource(st->dpy, "builtin", "Integer");
+ if (s && *s)
+ builtin = atoi(s);
+ if (s) free (s);
+ }
+
+ if (builtin >= 0)
+ do_preset (st, builtin);
+
+ st->background = BlackPixelOfScreen(st->screen);
+ setupmem(st);
+ init_data(st);
+ if (!mono_p)
+ st->foreground = st->startcolor;
+ else
+ st->foreground = WhitePixelOfScreen(st->screen);
+
+ /*
+ * Create the window to display the Lyapunov exponents
+ */
+ st->canvas = window;
+ init_color(st);
+
+#ifdef BACKING_PIXMAP
+ st->pixmap = XCreatePixmap(st->dpy, window, st->width, st->height,
+ xgwa.depth);
+#endif
+/* st->rubber_data.band_cursor = XCreateFontCursor(st->dpy, XC_hand2);*/
+/* CreateXorGC(st);*/
+ Clear(st);
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Delay");
+ st->linger = get_integer_resource(st->dpy, "linger", "Linger");
+ if (st->linger < 1) st->linger = 1;
+
+ return st;
+}
+
+
+static unsigned long
+xlyap_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+
+ if (!st->run && st->reset_countdown) {
+ st->reset_countdown--;
+ if (st->reset_countdown)
+ return 1000000;
+ else {
+ do_defaults (st);
+ do_preset (st, (random() % NBUILTINS));
+ Clear (st);
+ init_data(st);
+ init_color(st);
+ resize (st);
+ st->frame = 0;
+ st->run = 1;
+ }
+ }
+
+ for (i = 0; i < 1000; i++)
+ if (complyap(st) == TRUE)
+ {
+ st->run = 0;
+ st->reset_countdown = st->linger;
+ break;
+ }
+ return st->delay;
+}
+
+static void
+xlyap_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ resize(st);
+}
+
+static Bool
+xlyap_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+
+ switch(event->type)
+ {
+ case KeyPress:
+ if (Getkey(st, &event->xkey))
+ return True;
+ break;
+#if 0
+ case ButtonPress:
+ StartRubberBand(st, &st->rubber_data, event);
+ return True;
+ case MotionNotify:
+ TrackRubberBand(st, &st->rubber_data, event);
+ return True;
+ case ButtonRelease:
+ EndRubberBand(st, &st->rubber_data, event);
+ return True;
+#endif
+ default:
+ break;
+ }
+
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ Clear(st);
+ return True;
+ }
+
+ return False;
+}
+
+static void
+xlyap_free (Display *dpy, Window window, void *closure)
+{
+ int i;
+ struct state *st = (struct state *) closure;
+
+ freemem (st);
+
+#ifdef BACKING_PIXMAP
+ XFreePixmap (st->dpy, st->pixmap);
+#endif
+/* XFreeGC (st->dpy, st->RubberGC);*/
+ for (i = 0; i < st->maxcolor; i++)
+ XFreeGC (st->dpy, st->Data_GC[i]);
+
+ free (st);
+}
+
+
+XSCREENSAVER_MODULE ("XLyap", xlyap)
diff --git a/hacks/xlyap.man b/hacks/xlyap.man
new file mode 100644
index 0000000..ddef540
--- /dev/null
+++ b/hacks/xlyap.man
@@ -0,0 +1,223 @@
+.TH XLYAP 6X
+.SH NAME
+xlyap \- display an array of Lyapunov exponents graphically
+.SH SYNOPSIS
+.in +8n
+.ti -8n
+\fIxlyap\fR
+[-BLps][-W width][-H height][-o filename][-a
+\fIn\fR ]
+[-b
+\fIn\fR ]
+[-w
+\fIn\fR ]
+[-h
+\fIn\fR ]
+[-i xstart]
+[-M
+\fIn\fR ]
+[-R
+\fIp\fR ]
+[-S
+\fIn\fR ]
+[-D
+\fIn\fR ]
+[-F string][-f string][-r
+\fIn\fR ]
+[-O
+\fIn\fR ]
+[-C
+\fIn\fR ]
+[-c
+\fIn\fR ]
+[-m
+\fIn\fR ]
+[-x xpos]
+[-y ypos]
+.in -8n
+[\-fps]
+.SH DESCRIPTION
+\fIxlyap\fR
+generates and graphically displays an array of Lyapunov exponents for a
+variety of iterated periodically forced non-linear maps of the unit interval.
+.SH OPTIONS
+.TP 8
+-random
+A good choice for use with xscreensaver: picks random parameters from
+a built-in list.
+.TP 8
+-C \fIn\fP
+Specifies the minimum color index to be used for negative exponents
+.TP
+-D \fIn\fP
+Specifies the "dwell" or number of iterations over which to average in order
+to calculate the Lyapunov exponent. Default is 50.
+.TP
+-H \fIn\fP
+Specifies the height of the window. Default is 256.
+.TP
+-L
+Indicates use log(x) + log(y) rather than log(xy).
+.TP
+-M \fIr\fP
+Specifies the real value to compare exponent values to for indexing into
+a color wheel. The default value is 1.0.
+.TP
+-O \fIn\fP
+Specifies the minimum color index to be used for positive exponents
+.TP
+-R \fIp\fP
+Specifies pseudo-random forcing with probability \fIp\fP of using parameter
+value 'a'.
+.TP
+-S \fIn\fP
+Specifies the "settle" or number of iterations prior to the beginning of
+the calculation of the Lyapunov exponent. Default is 50.
+.TP
+-a \fIr\fP
+Specifies the real value to use as the minimum parameter value of the
+horizontal axis. Default is 2.0 for the logistic map.
+.TP
+-b \fIn\fP
+Specifies the real value to use as the minimum parameter value of the
+vertical axis. Default is 2.0 for the logistic map.
+.TP
+-c \fIn\fP
+Selects one of six different color wheels to use. The default color
+wheel is a rainbow palette.
+.TP
+-F \fI10101010\fP
+Specifies the "Function" forcing function to use. The example above would
+alternate between iterating the circle and logistic maps. An argument of
+"-F 2323" would alternate between left and right logistic maps. The default
+is to only use the single specified map (see the description of -m).
+.TP
+-f \fIabbabaab\fP
+Specifies the forcing function to use. The default is to alternate between
+the "a" parameter and the "b" parameter.
+.TP
+-h \fIr\fP
+Specifies the real value to be used as the range over which the vertical
+parameter values vary. The default is 1.0.
+.TP
+-i \fIr\fP
+Specifies the real value of the initial condition to use. Default is 0.65.
+.TP
+-m \fIn\fP
+Selects between available non-linear maps of the unit interval. A value of
+0 specifies the logistic map. A value of 1, the circle map. A value of 2,
+the left-logistic. A value of 3, the right-logistic. A value of 4, the
+double-logistic. The default is 0, the logistic map.
+.TP
+-o \fIfilename\fP
+Specifies the output filename to be used. If the -o option is given, this
+file will automatically be written out at the completion of the drawing.
+If it is not specified, a default filename of lyap.out is used and only
+written if the 'f' or 'F' keys are pressed during a run. The format of the
+output file is PPM for color and PGM for monochrome. The parameters used to
+calculate the picture are included as comments at the beginning of the output
+file.
+.TP
+-p
+Switches color indices for negative and positive exponents. Generally,
+causes negative exponents to be displayed in more detail while darkening
+and narrowing the color range for positive exponents. This can be toggled
+during runtime by pressing the 'p' key.
+.TP
+-r \fIn\fP
+Specifies the maximum rgb value to be used. Default is 65000.
+.TP
+-s \fIn\fP
+Specifies the length of the color wheel spin.
+.TP
+-v
+Prints out the various values to be used and exits.
+.TP
+-w \fIr\fP
+Specifies the real value to be used as the range over which the horizontal
+parameter values vary. The default is 1.0.
+.sp 2
+.SH NOTES
+.sp
+During display, pressing any mouse button allows you to select the area to
+be investigated with the mouse. The upper left hand corner of the desired
+area is the location of the cursor when the button is pressed. The lower
+right hand corner is specified by the cursor when the button is released.
+.sp 2
+Use of the keys
+\fIbBeEfFkKjJmnrRsSwWxXqQ\fP
+indicates:
+.sp
+.ti 10
+(<) Halve dwell value.
+.ti 10
+(>) Double dwell value.
+.ti 10
+([) Halve settle value.
+.ti 10
+(]) Double settle value.
+.ti 10
+(B or b) Toggle button display on/off
+.ti 10
+(E or e) Recalculate the indices into the color wheel using a different method
+.ti 10
+(F or f) Save current screen to output file (not yet implemented)
+.ti 10
+(H or h or ?) Display brief help message
+.ti 10
+(i) Decrement the interval between stripes for the striped color map.
+.ti 10
+(I) Increment the interval between stripes for the striped color map.
+.ti 10
+(K) Decrease value exponents are compared against by 0.05.
+.ti 10
+(J) Increase value exponents are compared against by 0.05.
+.ti 10
+(M) Decrease value exponents are compared against by 0.005.
+.ti 10
+(N) Increase value exponents are compared against by 0.005.
+.ti 10
+(m) Increment the map index, changing the map to be iterated.
+.ti 10
+(P or p) Toggle positive/negative exponent display.
+.ti 10
+(r) Redraw the window using previously calculated exponents.
+.ti 10
+(R) Redraw the window using the newly set dwell and/or settle values.
+.ti 10
+(S) Spin the color wheel
+.ti 10
+(s) Halve the length of the spin and spin the color wheel
+.ti 10
+(u) Go up to the window just prior to the most recent zoom.
+.ti 10
+(U) Go all the way up to the original window.
+.ti 10
+(V or v) Display values of various parameters currently in use
+.ti 10
+(W or w) Use next color map.
+.ti 10
+(X or x) Clear window
+.ti 10
+(Q or q) quit
+.sp 2
+.SH AUTHOR
+.nf
+ Ronald Joe Record
+ The Santa Cruz Operation
+ P.O. Box 1900
+ Santa Cruz, CA 95061
+ rr@sco.com
+.fi
+.sp 2
+.SH ACKNOWLEDGEMENTS
+.PP
+The algorithm was taken from the September 1991 Scientific American article
+by A. K. Dewdney who gives credit to Mario Markus of the Max Planck Institute
+for its creation. Additional information and ideas were gleaned from the
+discussion on alt.fractals involving Stephen Hall, Ed Kubaitis, Dave Platt
+and Baback Moghaddam. Assistance with colormaps and spinning color wheels
+and X was gleaned from Hiram Clawson. Rubber banding code was adapted from
+an existing Mandelbrot program written by Stacey Campbell.
+
+Viciously hacked for xscreensaver by Jamie Zawinski, 20-Nov-97.
diff --git a/hacks/xmatrix.c b/hacks/xmatrix.c
new file mode 100644
index 0000000..decddaa
--- /dev/null
+++ b/hacks/xmatrix.c
@@ -0,0 +1,1856 @@
+/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Matrix -- simulate the text scrolls from the movie "The Matrix".
+ *
+ * The movie people distribute their own Windows/Mac screensaver that does
+ * a similar thing, so I wrote one for Unix. However, that version (the
+ * Windows/Mac version at http://www.whatisthematrix.com/) doesn't match
+ * what the computer screens in the movie looked like, so my `xmatrix' does
+ * things differently.
+ *
+ * See also my `glmatrix' program, which does a 3D rendering of the similar
+ * effect that appeared in the title sequence of the movies.
+ *
+ *
+ * ==========================================================
+ *
+ * NOTE:
+ *
+ * People just love to hack on this one. I get sent
+ * patches to this all the time saying, ``here, I made
+ * it better!'' Mostly this hasn't been true.
+ *
+ * If you've made changes to xmatrix, when you send me
+ * your patch, please explain, in English, both *what*
+ * your changes are, and *why* you think those changes
+ * make this screensaver behave more like the displays
+ * in the movie did. I'd rather not have to read your
+ * diffs to try and figure that out for myself...
+ *
+ * In particular, note that the characters in the movie
+ * were, in fact, low resolution and somewhat blurry/
+ * washed out. They also definitely scrolled a
+ * character at a time, not a pixel at a time.
+ *
+ * And keep in mind that this program emulates the
+ * behavior of the computer screens that were visible
+ * in the movies -- not the behavior of the effects in
+ * the title sequences. "GLMatrix" does that.
+ *
+ * ==========================================================
+ *
+ */
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "screenhack.h"
+#include "textclient.h"
+#include "ximage-loader.h"
+#include <stdio.h>
+#include <sys/wait.h>
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h>
+#endif
+
+#include "images/gen/matrix1_png.h"
+#include "images/gen/matrix2_png.h"
+#include "images/gen/matrix1b_png.h"
+#include "images/gen/matrix2b_png.h"
+
+#define CHAR_COLS 16
+#define CHAR_ROWS 13
+#define CHAR_MAPS 3
+#define PLAIN_MAP 1
+#define GLOW_MAP 2
+
+typedef struct {
+ int glow : 8;
+ unsigned int glyph : 9; /* note: 9 bit characters! */
+ unsigned int changed : 1;
+ unsigned int spinner : 1;
+} m_cell;
+
+typedef struct {
+ int pipe_loc;
+ int remaining;
+ int throttle;
+ int y;
+} m_feeder;
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+
+static const int matrix_encoding[] = { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207 };
+static const int decimal_encoding[] = { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
+static const int hex_encoding[] = { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 33, 34, 35, 36, 37, 38 };
+static const int binary_encoding[] = { 16, 17 };
+static const int dna_encoding[] = { 33, 35, 39, 52 };
+static const int ascii_encoding[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
+};
+static const unsigned char char_map[256] = {
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0 */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 16 */
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 32 */
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 48 */
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 64 */
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 80 */
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 96 */
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 112 */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 128 */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 144 */
+ 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 160 */
+ 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 176 */
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 192 */
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 208 */
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, /* 224 */
+ 176,177,178,195,180,181,182,183,184,185,186,187,188,189,190,191 /* 240 */
+};
+
+#define CURSOR_GLYPH 97
+
+/* larger numbers should mean more variability between columns */
+#define BUF_SIZE 200
+
+typedef enum { DRAIN_TRACE_A,
+ TRACE_TEXT_A, /* Call trans opt: received. */
+ TRACE_A, /* (31_) 5__-0_9_ */
+ TRACE_DONE,
+
+ DRAIN_TRACE_B,
+ TRACE_TEXT_B, /* Call trans opt: received. */
+ TRACE_B,
+ TRACE_FAIL, /* System Failure */
+
+ DRAIN_KNOCK,
+ KNOCK, /* Wake up, Neo... */
+
+ DRAIN_NMAP,
+ NMAP, /* Starting nmap V. 2.54BETA25 */
+
+ DRAIN_MATRIX,
+ MATRIX,
+ DNA,
+ BINARY,
+ DEC,
+ HEX,
+ ASCII } m_mode;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ GC draw_gc, erase_gc, scratch_gc;
+ int grid_width, grid_height;
+ int char_width, char_height;
+ m_cell *cells;
+ m_cell *background;
+ m_feeder *feeders;
+ int nspinners;
+ Bool knock_knock_p;
+ Bool small_p;
+ Bool insert_top_p, insert_bottom_p;
+ Bool use_pipe_p;
+ m_mode mode;
+ m_mode def_mode; /* Mode to return to after trace etc. */
+
+ text_data *tc;
+ char buf [BUF_SIZE*2+1]; /* ring buffer */
+ Bool do_fill_buff;
+ int buf_done;
+ int buf_pos;
+ Bool start_reveal_back_p; /* start reveal process for pipe */
+ Bool back_text_full_p; /* is the pipe buffer (background) full ? */
+ char back_line [BUF_SIZE*2+1]; /* line buffer for background */
+ int back_pos; /* background line buffer position */
+ int back_y;
+
+ signed char *tracing;
+ int density;
+
+ const char *typing;
+ Bool typing_scroll_p;
+ Bool typing_cursor_p;
+ Bool typing_bold_p;
+ Bool typing_stutter_p;
+ int typing_left_margin;
+ int typing_char_delay;
+ int typing_line_delay;
+ int typing_delay;
+
+ Bool cursor_on;
+ int cursor_x, cursor_y;
+ XtIntervalId cursor_timer;
+
+ Pixmap images[CHAR_MAPS];
+ int image_width, image_height;
+ Bool images_flipped_p;
+
+ int nglyphs;
+ const int *glyph_map;
+
+ unsigned long colors[5];
+ int delay;
+} m_state;
+
+
+static void
+load_images_1 (Display *dpy, m_state *state, int which)
+{
+ const unsigned char *png = 0;
+ unsigned long size = 0;
+ if (which == 1)
+ {
+ if (state->small_p)
+ png = matrix1b_png, size = sizeof(matrix1b_png);
+ else
+ png = matrix1_png, size = sizeof(matrix1_png);
+ }
+ else
+ {
+ if (state->small_p)
+ png = matrix2b_png, size = sizeof(matrix2b_png);
+ else
+ png = matrix2_png, size = sizeof(matrix2_png);
+ }
+ state->images[which] =
+ image_data_to_pixmap (state->dpy, state->window, png, size,
+ &state->image_width, &state->image_height, 0);
+}
+
+
+static void
+load_images (Display *dpy, m_state *state)
+{
+ load_images_1 (dpy, state, 1);
+ load_images_1 (dpy, state, 2);
+}
+
+
+static void
+flip_images_1 (m_state *state, int which)
+{
+ XImage *im = XGetImage (state->dpy, state->images[which], 0, 0,
+ state->image_width, state->image_height,
+ ~0L, (state->xgwa.depth > 1 ? ZPixmap : XYPixmap));
+ int x, y, xx;
+ int ww = state->char_width;
+ unsigned long *row = (unsigned long *) malloc (sizeof(*row) * ww);
+
+ for (y = 0; y < state->image_height; y++)
+ {
+ for (x = 0; x < CHAR_COLS; x++)
+ {
+ for (xx = 0; xx < ww; xx++)
+ row[xx] = XGetPixel (im, (x * ww) + xx, y);
+ for (xx = 0; xx < ww; xx++)
+ XPutPixel (im, (x * ww) + xx, y, row[ww - xx - 1]);
+ }
+ }
+
+ XPutImage (state->dpy, state->images[which], state->draw_gc, im, 0, 0, 0, 0,
+ state->image_width, state->image_height);
+ XDestroyImage (im);
+ free (row);
+}
+
+static void
+flip_images (m_state *state, Bool flipped_p)
+{
+ if (flipped_p != state->images_flipped_p)
+ {
+ state->images_flipped_p = flipped_p;
+ flip_images_1 (state, 1);
+ flip_images_1 (state, 2);
+ }
+}
+
+
+/* When the subprocess has generated some output, this reads as much as it
+ can into s->buf at s->buf_tail.
+ */
+static void
+fill_input (m_state *s)
+{
+ int n = 0;
+ int loadBytes;
+ if(s->buf_done > s->buf_pos){
+ loadBytes = (s->buf_done - s->buf_pos) - 1;
+ }
+ else{
+ loadBytes = ((BUF_SIZE - s->buf_pos) + s->buf_done) - 1;
+ }
+
+ if (!s->tc)
+ return;
+
+ if (loadBytes > 0)
+ {
+ int c = textclient_getc (s->tc);
+ n = (c > 0 ? 1 : -1);
+ s->buf [s->buf_pos] = (char) c;
+ }
+
+
+ if (n > 0)
+ {
+ s->do_fill_buff = False;
+ s->buf_pos = (s->buf_pos + n);
+ if(s->buf_pos > BUF_SIZE){
+ /* copy to start of buffer */
+ /* areas shouldn't overlap, but just in case, use memmove */
+ memmove(s->buf,s->buf+BUF_SIZE,s->buf_pos-BUF_SIZE);
+ }
+ s->buf_pos = s->buf_pos % BUF_SIZE;
+ }
+ else
+ {
+ /* Couldn't read anything from the buffer */
+ /* Assume EOF has been reached, so start again */
+ s->do_fill_buff = True;
+ }
+}
+
+
+static void cursor_on_timer (XtPointer closure, XtIntervalId *id);
+static void cursor_off_timer (XtPointer closure, XtIntervalId *id);
+
+static Bool
+set_cursor_1 (m_state *state, Bool on)
+{
+ Bool changed = (state->cursor_on != on);
+ state->cursor_on = on;
+
+ if (changed && state->cursor_x >= 0 && state->cursor_y >= 0)
+ {
+ m_cell *cell = &state->cells[state->grid_width * state->cursor_y
+ + state->cursor_x];
+ cell->glow = 0;
+ cell->changed = True;
+ }
+ return changed;
+}
+
+
+static void
+set_cursor (m_state *state, Bool on)
+{
+ if (set_cursor_1 (state, on))
+ {
+ if (state->cursor_timer)
+ XtRemoveTimeOut (state->cursor_timer);
+ state->cursor_timer = 0;
+ if (on)
+ cursor_on_timer (state, 0);
+ }
+}
+
+static void
+cursor_off_timer (XtPointer closure, XtIntervalId *id)
+{
+ m_state *state = (m_state *) closure;
+ XtAppContext app = XtDisplayToApplicationContext (state->dpy);
+ set_cursor_1 (state, False);
+ state->cursor_timer = XtAppAddTimeOut (app, 333,
+ cursor_on_timer, closure);
+}
+
+static void
+cursor_on_timer (XtPointer closure, XtIntervalId *id)
+{
+ m_state *state = (m_state *) closure;
+ XtAppContext app = XtDisplayToApplicationContext (state->dpy);
+ set_cursor_1 (state, True);
+ state->cursor_timer = XtAppAddTimeOut (app, 666,
+ cursor_off_timer, closure);
+}
+
+
+static void
+init_spinners (m_state *state)
+{
+ int i = state->nspinners;
+ int x, y;
+ m_cell *cell;
+
+ for (y = 0; y < state->grid_height; y++)
+ for (x = 0; x < state->grid_width; x++)
+ {
+ cell = &state->cells[state->grid_width * y + x];
+ cell->spinner = 0;
+ }
+
+ while (--i > 0)
+ {
+ x = random() % state->grid_width;
+ y = random() % state->grid_height;
+ cell = &state->cells[state->grid_width * y + x];
+ cell->spinner = 1;
+ }
+}
+
+
+static void
+clear_spinners (m_state *state)
+{
+ int i;
+ for (i = 0; i < state->grid_width * state->grid_height; i++)
+ if (state->cells[i].spinner)
+ {
+ state->cells[i].spinner = 0;
+ state->cells[i].changed = 1;
+ }
+}
+
+
+static void set_mode (m_state *, m_mode);
+
+
+static void
+init_trace (m_state *state)
+{
+ char *s = get_string_resource (state->dpy, "tracePhone", "TracePhone");
+ const char *s2;
+ signed char *s3;
+ if (!s)
+ goto FAIL;
+
+ state->tracing = (signed char *) malloc (strlen (s) + 1);
+ s3 = state->tracing;
+
+ for (s2 = s; *s2; s2++)
+ if (*s2 >= '0' && *s2 <= '9')
+ *s3++ = -*s2;
+ *s3 = 0;
+
+ if (s3 == state->tracing)
+ goto FAIL;
+
+ state->glyph_map = decimal_encoding;
+ state->nglyphs = countof(decimal_encoding);
+
+ return;
+
+ FAIL:
+ fprintf (stderr, "%s: bad phone number: \"%s\".\n",
+ progname, s ? s : "(null)");
+
+ if (s) free (s);
+ if (state->tracing) free (state->tracing);
+ state->tracing = 0;
+ set_mode (state, MATRIX);
+}
+
+
+static void
+init_drain (m_state *state)
+{
+ int i;
+
+ set_cursor (state, False);
+ state->cursor_x = -1;
+ state->cursor_y = -1;
+
+ /* Fill the top row with empty top-feeders, to clear the screen. */
+ for (i = 0; i < state->grid_width; i++)
+ {
+ m_feeder *f = &state->feeders[i];
+ f->y = -1;
+ f->remaining = 0;
+ f->throttle = 0;
+ }
+
+ /* Turn off all the spinners, else they never go away. */
+ clear_spinners (state);
+}
+
+static Bool
+screen_blank_p (m_state *state)
+{
+ int i;
+ for (i = 0; i < state->grid_width * state->grid_height; i++)
+ if (state->cells[i].glyph)
+ return False;
+ return True;
+}
+
+
+static void
+set_mode (m_state *state, m_mode mode)
+{
+ if (mode == state->mode)
+ return;
+
+ state->mode = mode;
+ state->typing = 0;
+
+ switch (mode)
+ {
+ case MATRIX:
+ state->glyph_map = matrix_encoding;
+ state->nglyphs = countof(matrix_encoding);
+ flip_images (state, True);
+ init_spinners (state);
+ break;
+ case DNA:
+ state->glyph_map = dna_encoding;
+ state->nglyphs = countof(dna_encoding);
+ flip_images (state, False);
+ break;
+ case BINARY:
+ state->glyph_map = binary_encoding;
+ state->nglyphs = countof(binary_encoding);
+ flip_images (state, False);
+ break;
+ case HEX:
+ state->glyph_map = hex_encoding;
+ state->nglyphs = countof(hex_encoding);
+ flip_images (state, False);
+ break;
+ case ASCII:
+ state->glyph_map = ascii_encoding;
+ state->nglyphs = countof(ascii_encoding);
+ flip_images (state, False);
+ break;
+ case DEC:
+ case TRACE_A:
+ case TRACE_B:
+ case NMAP:
+ case KNOCK:
+ state->glyph_map = decimal_encoding;
+ state->nglyphs = countof(decimal_encoding);
+ flip_images (state, False);
+ break;
+ case TRACE_TEXT_A:
+ case TRACE_TEXT_B:
+ flip_images (state, False);
+ init_trace (state);
+ break;
+ case DRAIN_TRACE_A:
+ case DRAIN_TRACE_B:
+ case DRAIN_KNOCK:
+ case DRAIN_NMAP:
+ case DRAIN_MATRIX:
+ init_drain (state);
+ break;
+ case TRACE_DONE:
+ case TRACE_FAIL:
+ break;
+ default:
+ abort();
+ }
+}
+
+
+static void *
+xmatrix_init (Display *dpy, Window window)
+{
+ XGCValues gcv;
+ char *insert, *mode;
+ int i;
+ m_state *state = (m_state *) calloc (sizeof(*state), 1);
+
+ state->dpy = dpy;
+ state->window = window;
+ state->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ XGetWindowAttributes (dpy, window, &state->xgwa);
+
+ state->small_p = (state->xgwa.width < 300);
+ {
+ const char *s = get_string_resource (dpy, "matrixFont", "String");
+ if (!s || !*s || !strcasecmp(s, "large"))
+ state->small_p = False;
+ else if (!strcasecmp(s, "small"))
+ state->small_p = True;
+ else
+ fprintf (stderr, "%s: matrixFont should be 'small' or 'large' not '%s'\n",
+ progname, s);
+ }
+
+ load_images (dpy, state);
+
+ gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "foreground", "Foreground");
+ gcv.background = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "background", "Background");
+ state->draw_gc = XCreateGC (state->dpy, state->window,
+ GCForeground|GCBackground, &gcv);
+ gcv.foreground = gcv.background;
+ state->erase_gc = XCreateGC (state->dpy, state->window,
+ GCForeground|GCBackground, &gcv);
+
+ state->scratch_gc = XCreateGC (state->dpy, state->window, 0, &gcv);
+
+ /* Allocate colors for SYSTEM FAILURE box */
+ {
+ XColor boxcolors[] = {
+ { 0, 0x0808, 0x1E1E, 0x0808, DoRed|DoGreen|DoBlue, 0 },
+ { 0, 0x5A5A, 0xD2D2, 0x5A5A, DoRed|DoGreen|DoBlue, 0 },
+ { 0, 0xE0E0, 0xF7F7, 0xE0E0, DoRed|DoGreen|DoBlue, 0 },
+ { 0, 0x5A5A, 0xD2D2, 0x5A5A, DoRed|DoGreen|DoBlue, 0 },
+ { 0, 0x0808, 0x1E1E, 0x0808, DoRed|DoGreen|DoBlue, 0 },
+ };
+ for (i = 0; i < countof(boxcolors); i++)
+ {
+ if (XAllocColor (state->dpy, state->xgwa.colormap, &boxcolors[i]))
+ state->colors[i] = boxcolors[i].pixel;
+ else
+ state->colors[i] = gcv.foreground; /* default black */
+ }
+ }
+
+ state->char_width = state->image_width / CHAR_COLS;
+ state->char_height = state->image_height / CHAR_ROWS;
+
+ state->grid_width = state->xgwa.width / state->char_width;
+ state->grid_height = state->xgwa.height / state->char_height;
+ state->grid_width++;
+ state->grid_height++;
+ if (state->grid_width < 5) state->grid_width = 5;
+ if (state->grid_height < 5) state->grid_height = 5;
+
+ state->glyph_map = matrix_encoding;
+ state->nglyphs = countof(matrix_encoding);
+
+ state->cells = (m_cell *)
+ calloc (sizeof(m_cell), state->grid_width * state->grid_height);
+ state->background = (m_cell *)
+ calloc (sizeof(m_cell), state->grid_width * state->grid_height);
+ state->feeders = (m_feeder *) calloc (sizeof(m_feeder), state->grid_width);
+
+ state->density = get_integer_resource (dpy, "density", "Integer");
+
+ insert = get_string_resource(dpy, "insert", "Insert");
+ if (insert && !strcmp(insert, "top"))
+ {
+ state->insert_top_p = True;
+ state->insert_bottom_p = False;
+ }
+ else if (insert && !strcmp(insert, "bottom"))
+ {
+ state->insert_top_p = False;
+ state->insert_bottom_p = True;
+ }
+ else if (insert && !strcmp(insert, "both"))
+ {
+ state->insert_top_p = True;
+ state->insert_bottom_p = True;
+ }
+ else
+ {
+ if (insert && *insert)
+ fprintf (stderr,
+ "%s: `insert' must be `top', `bottom', or `both', not `%s'\n",
+ progname, insert);
+ state->insert_top_p = False;
+ state->insert_bottom_p = True;
+ }
+
+ state->nspinners = get_integer_resource (dpy, "spinners", "Integer");
+
+ if (insert)
+ free (insert);
+
+ state->knock_knock_p = get_boolean_resource (dpy, "knockKnock", "KnockKnock");
+
+ state->use_pipe_p = get_boolean_resource (dpy, "usePipe", "Boolean");
+ state->buf_pos = 1;
+ state->buf[0] = ' '; /* spacer byte in buffer (space) */
+ state->buf_done = 0;
+ state->do_fill_buff = True;
+ state->start_reveal_back_p = False;
+ state->back_text_full_p = False;
+ state->back_y = 0;
+ state->back_pos = 0;
+
+ state->mode = -1;
+ state->def_mode = MATRIX;
+ mode = get_string_resource (dpy, "mode", "Mode");
+ if (mode && !strcasecmp(mode, "trace"))
+ set_mode (state, ((random() % 3) ? TRACE_TEXT_A : TRACE_TEXT_B));
+ else if (mode && !strcasecmp(mode, "crack"))
+ set_mode (state, DRAIN_NMAP);
+ else if (mode && !strcasecmp(mode, "dna")){
+ set_mode (state, DNA);
+ state->def_mode = DNA;
+ }
+ else if (mode && (!strcasecmp(mode, "bin") ||
+ !strcasecmp(mode, "binary"))){
+ set_mode (state, BINARY);
+ state->def_mode = BINARY;
+ }
+ else if (mode && (!strcasecmp(mode, "hex") ||
+ !strcasecmp(mode, "hexadecimal"))){
+ set_mode (state, HEX);
+ state->def_mode = HEX;
+ }
+ else if (mode && (!strcasecmp(mode, "dec") ||
+ !strcasecmp(mode, "decimal"))){
+ set_mode (state, DEC);
+ state->def_mode = DEC;
+ }
+ else if (mode && (!strcasecmp(mode, "asc") ||
+ !strcasecmp(mode, "ascii"))){
+ set_mode (state, ASCII);
+ state->def_mode = ASCII;
+ }
+ else if (mode && !strcasecmp(mode, "pipe"))
+ {
+ set_mode (state, ASCII);
+ state->def_mode = ASCII;
+ state->use_pipe_p = True;
+ state->tc = textclient_open (dpy);
+ }
+ else if (!mode || !*mode || !strcasecmp(mode, "matrix"))
+ set_mode (state, MATRIX);
+ else
+ {
+ fprintf (stderr, "%s: `mode' must be ",progname);
+ fprintf (stderr, "matrix, trace, dna, binary, ascii, hex, or pipe: ");
+ fprintf (stderr, "not `%s'\n", mode);
+ set_mode (state, MATRIX);
+ }
+
+ if (state->mode == MATRIX && get_boolean_resource (dpy, "trace", "Boolean"))
+ set_mode (state, ((random() % 3) ? TRACE_TEXT_A : TRACE_TEXT_B));
+
+ state->cursor_x = -1;
+ state->cursor_y = -1;
+
+ return state;
+}
+
+
+static void
+insert_glyph (m_state *state, int glyph, int x, int y)
+{
+ Bool bottom_feeder_p = (y >= 0);
+ m_cell *from, *to;
+ if (y >= state->grid_height)
+ return;
+
+ if (bottom_feeder_p)
+ {
+ to = &state->cells[state->grid_width * y + x];
+ }
+ else
+ {
+ for (y = state->grid_height-1; y > 0; y--)
+ {
+ from = &state->cells[state->grid_width * (y-1) + x];
+ to = &state->cells[state->grid_width * y + x];
+ to->glyph = from->glyph;
+ to->glow = from->glow;
+ to->changed = 1;
+ }
+ to = &state->cells[x];
+ }
+
+ to->glyph = glyph;
+ to->changed = 1;
+
+ if (!to->glyph)
+ ;
+ else if (bottom_feeder_p)
+ to->glow = 1 + (random() % (state->tracing ? 4 : 2));
+ else
+ to->glow = 0;
+}
+
+
+static void
+place_back_char (m_state *state, char textc, int x, int y){
+ if((x>=0) && (y>=0) &&
+ (x < state->grid_width) && (y < state->grid_height)){
+ m_cell *celltmp = &state->background[state->grid_width * y + x];
+ celltmp -> glyph = char_map[(unsigned char)textc] + 1;
+ if(!celltmp->glyph || (celltmp->glyph == 3)){
+ celltmp -> glyph = char_map[32] + 1;
+ }
+ celltmp -> changed = 1;
+ }
+}
+
+static void
+place_back_text (m_state *state, char *text, int x, int y){
+ int i;
+ for(i=0; i<strlen(text); i++){
+ place_back_char(state, text[i], x+i, y);
+ }
+}
+
+static void
+place_back_pipe (m_state *state, char textc){
+ Bool new_line = False;
+ /* gringer pipe insert */
+ state->back_line[state->back_pos] = textc;
+ if(textc == '\n'){
+ state->back_line[state->back_pos] = '\0';
+ new_line = True;
+ }
+ else if ((state->back_pos > (state->grid_width - 4)) ||
+ (state->back_pos >= BUF_SIZE)){ /* off by 1? */
+ state->back_line[++state->back_pos] = '\0';
+ new_line = True;
+ }
+ else{
+ state->back_pos++;
+ }
+ if(new_line){
+ int startx = (state->grid_width >> 1) -
+ (strlen(state->back_line) >> 1);
+ place_back_text(state, state->back_line,
+ startx, state->back_y);
+ state->back_pos = 0;
+ state->back_y++;
+ if(state->back_y >= (state->grid_height - 1)){
+ state->back_y = 1;
+ state->back_text_full_p = True;
+ state->start_reveal_back_p = True;
+ }
+ }
+}
+
+static void
+feed_matrix (m_state *state)
+{
+ int x;
+
+ switch (state->mode)
+ {
+ case TRACE_A:
+ {
+ int L = strlen((char *) state->tracing);
+ int count = 0;
+ int i;
+
+ for (i = 0; i < strlen((char *) state->tracing); i++)
+ if (state->tracing[i] > 0)
+ count++;
+
+ if (count >= L)
+ {
+ set_mode (state, TRACE_DONE);
+ state->typing_delay = 1000000;
+ return;
+ }
+ else
+ {
+ i = 5 + (30 / (count+1)); /* how fast numbers are discovered */
+
+ if ((random() % i) == 0)
+ {
+ i = random() % L;
+ if (state->tracing[i] < 0)
+ state->tracing[i] = -state->tracing[i];
+ }
+ }
+ }
+ break;
+
+ case TRACE_B:
+ if ((random() % 40) == 0)
+ {
+ set_mode (state, TRACE_FAIL);
+ return;
+ }
+ break;
+
+ case MATRIX: case DNA: case BINARY: case DEC: case HEX: case ASCII:
+ case DRAIN_TRACE_A:
+ case DRAIN_TRACE_B:
+ case DRAIN_KNOCK:
+ case DRAIN_NMAP:
+ case DRAIN_MATRIX:
+ break;
+
+ default:
+ abort();
+ }
+
+ /*get input*/
+ if((state->use_pipe_p) && (!state->back_text_full_p)){
+ place_back_pipe(state, state->buf[state->buf_done]);
+ state->buf_done = (state->buf_done + 1) % BUF_SIZE;
+ if(state->buf_done == (state->buf_pos - 1)){
+ state->do_fill_buff = True;
+ }
+ }
+ if(state->buf_done == (state->buf_pos + 1)){
+ state->do_fill_buff = False;
+ }
+ else{
+ state->do_fill_buff = True;
+ fill_input(state);
+ }
+
+ /* Update according to current feeders. */
+ for (x = 0; x < state->grid_width; x++)
+ {
+ m_feeder *f = &state->feeders[x];
+
+ if (f->throttle) /* this is a delay tick, synced to frame. */
+ {
+ f->throttle--;
+ }
+ else if (f->remaining > 0) /* how many items are in the pipe */
+ {
+ int g;
+ long rval;
+ if((state->use_pipe_p) && (!state->back_text_full_p)){
+ rval = (int) state->buf[f->pipe_loc];
+ if(++f->pipe_loc > (BUF_SIZE-1)){
+ f->pipe_loc = 0;
+ /*fill_input(state);*/
+ }
+ rval = (rval % state->nglyphs);
+ }
+ else{
+ rval = (random() % state->nglyphs);
+ }
+ g = state->glyph_map[rval] + 1;
+ insert_glyph (state, g, x, f->y);
+ f->remaining--;
+ if (f->y >= 0) /* bottom_feeder_p */
+ f->y++;
+ }
+ else /* if pipe is empty, insert spaces */
+ {
+ insert_glyph (state, 0, x, f->y);
+ if (f->y >= 0) /* bottom_feeder_p */
+ f->y++;
+ }
+
+ if ((random() % 10) == 0) /* randomly change throttle speed */
+ {
+ f->throttle = ((random() % 5) + (random() % 5));
+ }
+ }
+}
+
+
+static void
+redraw_cells (m_state *state, Bool active)
+{
+ int x, y;
+ int count = 0;
+ Bool use_back_p = False;
+
+ for (y = 0; y < state->grid_height; y++)
+ for (x = 0; x < state->grid_width; x++)
+ {
+ m_cell *cell = &state->cells[state->grid_width * y + x];
+ m_cell *back = &state->background[state->grid_width * y + x];
+ Bool cursor_p = (state->cursor_on &&
+ x == state->cursor_x &&
+ y == state->cursor_y);
+
+ if (cell->glyph)
+ count++;
+ else {
+ if((state->start_reveal_back_p) &&
+ (back->glyph) && !(state->mode == TRACE_A ||
+ state->mode == TRACE_B ||
+ state->mode == TRACE_DONE)){
+ use_back_p = True;
+ cell = back;
+ }
+ }
+
+ /* In trace-mode, the state of each cell is random unless we have
+ a match for this digit. */
+ if (active && (state->mode == TRACE_A ||
+ state->mode == TRACE_B ||
+ state->mode == TRACE_DONE))
+ {
+ int xx = x % strlen((char *) state->tracing);
+ Bool dead_p = state->tracing[xx] > 0;
+
+ if (y == 0 && x == xx && !use_back_p)
+ cell->glyph = (dead_p
+ ? state->glyph_map[state->tracing[xx]-'0'] + 1
+ : 0);
+ else if (y == 0 && !use_back_p)
+ cell->glyph = 0;
+ else if (!use_back_p)
+ cell->glyph = (dead_p ? 0 :
+ (state->glyph_map[(random()%state->nglyphs)]
+ + 1));
+ if (!use_back_p)
+ cell->changed = 1;
+ }
+
+ if (!cell->changed)
+ continue;
+
+
+ if (cell->glyph == 0 && !cursor_p && !use_back_p)
+ XFillRectangle (state->dpy, state->window, state->erase_gc,
+ x * state->char_width,
+ y * state->char_height,
+ state->char_width,
+ state->char_height);
+ else
+ {
+ int g = (cursor_p ? CURSOR_GLYPH : cell->glyph);
+ int cx = (g - 1) % CHAR_COLS;
+ int cy = (g - 1) / CHAR_COLS;
+ int map = ((cell->glow != 0 || cell->spinner) ? GLOW_MAP :
+ PLAIN_MAP);
+
+ XCopyArea (state->dpy, state->images[map],
+ state->window, state->draw_gc,
+ cx * state->char_width,
+ cy * state->char_height,
+ state->char_width,
+ state->char_height,
+ x * state->char_width,
+ y * state->char_height);
+ }
+ if (!use_back_p)
+ cell->changed = 0;
+
+ if (cell->glow > 0 && state->mode != NMAP && !use_back_p)
+ {
+ cell->glow--;
+ cell->changed = 1;
+ }
+ else if (cell->glow < 0)
+ abort();
+
+ if (cell->spinner && active && !use_back_p)
+ {
+ cell->glyph = (state->glyph_map[(random()%state->nglyphs)] + 1);
+ cell->changed = 1;
+ }
+ }
+}
+
+
+static int
+densitizer (m_state *state)
+{
+ /* Horrid kludge that converts percentages (density of screen coverage)
+ to the parameter that actually controls this. I got this mapping
+ empirically, on a 1024x768 screen. Sue me. */
+ if (state->density < 10) return 85;
+ else if (state->density < 15) return 60;
+ else if (state->density < 20) return 45;
+ else if (state->density < 25) return 25;
+ else if (state->density < 30) return 20;
+ else if (state->density < 35) return 15;
+ else if (state->density < 45) return 10;
+ else if (state->density < 50) return 8;
+ else if (state->density < 55) return 7;
+ else if (state->density < 65) return 5;
+ else if (state->density < 80) return 3;
+ else if (state->density < 90) return 2;
+ else return 1;
+}
+
+
+static void
+hack_text (m_state *state)
+{
+ if (!state->typing)
+ {
+ set_cursor (state, False);
+ state->cursor_x = 0;
+ state->cursor_y = 0;
+ state->typing_scroll_p = False;
+ state->typing_bold_p = False;
+ state->typing_cursor_p = True;
+ state->typing_stutter_p = False;
+ state->typing_char_delay = 10000;
+ state->typing_line_delay = 1500000;
+
+ switch (state->mode)
+ {
+ case TRACE_TEXT_A:
+ case TRACE_TEXT_B:
+ clear_spinners (state);
+ if (state->mode == TRACE_TEXT_A)
+ {
+ if (state->grid_width >= 52)
+ state->typing =
+ ("Call trans opt: received. 2-19-98 13:24:18 REC:Log>\n"
+ "Trace program: running\n");
+ else
+ state->typing =
+ ("Call trans opt: received.\n2-19-98 13:24:18 REC:Log>\n"
+ "Trace program: running\n");
+ }
+ else
+ {
+ if (state->grid_width >= 52)
+ state->typing =
+ ("Call trans opt: received. 9-18-99 14:32:21 REC:Log>\n"
+ "WARNING: carrier anomaly\n"
+ "Trace program: running\n");
+ else
+ state->typing =
+ ("Call trans opt: received.\n9-18-99 14:32:21 REC:Log>\n"
+ "WARNING: carrier anomaly\n"
+ "Trace program: running\n");
+ }
+ break;
+
+ case TRACE_FAIL:
+ {
+ const char *s = "SYSTEM FAILURE\n";
+ int i;
+ float cx = (state->grid_width - strlen(s) - 1) / 2 - 0.5;
+ float cy = (state->grid_height / 2) - 1.3;
+
+ if (cy < 0) cy = 0;
+ if (cx < 0) cx = 0;
+
+ XFillRectangle (state->dpy, state->window, state->erase_gc,
+ cx * state->char_width,
+ cy * state->char_height,
+ strlen(s) * state->char_width,
+ state->char_height * 1.6);
+
+ for (i = -2; i < 3; i++)
+ {
+ XGCValues gcv;
+ gcv.foreground = state->colors[i + 2];
+ XChangeGC (state->dpy, state->scratch_gc, GCForeground, &gcv);
+ XDrawRectangle (state->dpy, state->window, state->scratch_gc,
+ cx * state->char_width - i,
+ cy * state->char_height - i,
+ strlen(s) * state->char_width + (2 * i),
+ (state->char_height * 1.6) + (2 * i));
+ }
+
+ /* If we don't clear these, part of the box may get overwritten */
+ for (i = 0; i < state->grid_height * state->grid_width; i++)
+ {
+ m_cell *cell = &state->cells[i];
+ cell->changed = 0;
+ }
+
+ state->cursor_x = (state->grid_width - strlen(s) - 1) / 2;
+ state->cursor_y = (state->grid_height / 2) - 1;
+ if (state->cursor_x < 0) state->cursor_x = 0;
+ if (state->cursor_y < 0) state->cursor_y = 0;
+
+ state->typing = s;
+ state->typing_char_delay = 0;
+ state->typing_cursor_p = False;
+ }
+ break;
+
+ case KNOCK:
+ {
+ clear_spinners (state);
+ state->typing = ("\001Wake up, Neo...\n"
+ "\001The Matrix has you...\n"
+ "\001Follow the white rabbit.\n"
+ "\n"
+ "Knock, knock, Neo.\n");
+
+ state->cursor_x = 4;
+ state->cursor_y = 2;
+ state->typing_char_delay = 0;
+ state->typing_line_delay = 2000000;
+ }
+ break;
+
+ case NMAP:
+ {
+ /* Note that what Trinity is using here is moderately accurate:
+ She runs nmap (http://www.insecure.org/nmap/) then breaks in
+ with a (hypothetical) program called "sshnuke" that exploits
+ the (very real) SSHv1 CRC32 compensation attack detector bug
+ (http://staff.washington.edu/dittrich/misc/ssh-analysis.txt).
+
+ The command syntax of the power grid control software looks a
+ lot like Cisco IOS to me. (IOS is a descendant of VMS.)
+ */
+
+ clear_spinners (state);
+ state->typing =
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than
+ the length ISO C89 compilers are required to
+ support"... */
+
+# endif
+ ("# "
+ "\010\010\010\010"
+ "\001nmap -v -sS -O 10.2.2.2\n"
+ "Starting nmap V. 2.54BETA25\n"
+ "\010\010\010\010\010\010\010\010\010\010"
+ "Insufficient responses for TCP sequencing (3), OS detection"
+ " may be less accurate\n"
+ "Interesting ports on 10.2.2.2:\n"
+ "(The 1539 ports scanned but not shown below are in state:"
+ " closed)\n"
+ "Port state service\n"
+ "22/tcp open ssh\n"
+ "\n"
+ "No exact OS matches for host\n"
+ "\n"
+ "Nmap run completed -- 1 IP address (1 host up) scanned\n"
+ "# "
+
+ "\010\010\010\010"
+ "\001sshnuke 10.2.2.2 -rootpw=\"Z1ON0101\"\n"
+ "Connecting to 10.2.2.2:ssh ... "
+ "\010\010"
+ "successful.\n"
+ "Attempting to exploit SSHv1 CRC32 ... "
+ "\010\010\010\010"
+ "successful.\n"
+ "Resetting root password to \"Z1ON0101\".\n"
+ "\010\010"
+ "System open: Access Level <9>\n"
+
+ "# "
+ "\010\010"
+
+ "\001ssh 10.2.2.2 -l root\n"
+ "\010\010"
+ "root@10.2.2.2's password: "
+ "\010\010\n"
+ "\010\010\n"
+ "RRF-CONTROL> "
+
+ "\010\010"
+ "\001disable grid nodes 21 - 48\n"
+ "\n"
+ "\002Warning: Disabling nodes 21-48 will disconnect sector 11"
+ " (28 nodes)\n"
+ "\n"
+ "\002 ARE YOU SURE? (y/n) "
+
+ "\010\010"
+ "\001y\n"
+ "\n"
+ "\n"
+ "\010\002Grid Node 21 offline...\n"
+ "\010\002Grid Node 22 offline...\n"
+ "\010\002Grid Node 23 offline...\n"
+ "\010\002Grid Node 24 offline...\n"
+ "\010\002Grid Node 25 offline...\n"
+ "\010\002Grid Node 26 offline...\n"
+ "\010\002Grid Node 27 offline...\n"
+ "\010\002Grid Node 28 offline...\n"
+ "\010\002Grid Node 29 offline...\n"
+ "\010\002Grid Node 30 offline...\n"
+ "\010\002Grid Node 31 offline...\n"
+ "\010\002Grid Node 32 offline...\n"
+ "\010\002Grid Node 33 offline...\n"
+ "\010\002Grid Node 34 offline...\n"
+ "\010\002Grid Node 35 offline...\n"
+ "\010\002Grid Node 36 offline...\n"
+ "\010\002Grid Node 37 offline...\n"
+ "\010\002Grid Node 38 offline...\n"
+ "\010\002Grid Node 39 offline...\n"
+ "\010\002Grid Node 40 offline...\n"
+ "\010\002Grid Node 41 offline...\n"
+ "\010\002Grid Node 42 offline...\n"
+ "\010\002Grid Node 43 offline...\n"
+ "\010\002Grid Node 44 offline...\n"
+ "\010\002Grid Node 45 offline...\n"
+ "\010\002Grid Node 46 offline...\n"
+ "\010\002Grid Node 47 offline...\n"
+ "\010\002Grid Node 48 offline...\n"
+ "\010\010"
+ "\nRRF-CONTROL> "
+ "\010\010\010\010\010\010\010\010"
+ );
+
+ state->cursor_x = 0;
+ state->cursor_y = state->grid_height - 3;
+ state->typing_scroll_p = True;
+ state->typing_char_delay = 0;
+ state->typing_line_delay = 20000;
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ state->typing_left_margin = state->cursor_x;
+ state->typing_delay = state->typing_char_delay;
+ if (state->typing_cursor_p)
+ set_cursor (state, True);
+
+# ifdef USE_IPHONE
+ /* Stupid iPhone X bezel.
+ #### This is the worst of all possible ways to do this! But how else?
+ */
+ if (state->xgwa.width == 2436 || state->xgwa.height == 2436)
+ switch (state->mode)
+ {
+ case TRACE_TEXT_A:
+ case TRACE_TEXT_B:
+ case KNOCK:
+ case NMAP:
+ {
+ int off = 5 * (state->small_p ? 2 : 1);
+ if (state->xgwa.width > state->xgwa.height)
+ {
+ state->typing_left_margin += off;
+ state->cursor_x += off;
+ }
+ else
+ {
+ state->cursor_y += off;
+ }
+ }
+ default: break;
+ }
+# endif
+ }
+ else
+ {
+ Bool scrolled_p = False;
+ unsigned char c, c1;
+ int x = state->cursor_x;
+ int y = state->cursor_y;
+
+ AGAIN:
+ c = ((unsigned char *) state->typing)[0];
+ c1 = c ? ((unsigned char *) state->typing)[1] : 0;
+
+ state->typing_delay = (!c || c1 == '\n'
+ ? state->typing_line_delay
+ : state->typing_char_delay);
+ if (! c)
+ {
+ state->typing_delay = 0;
+ state->typing = 0;
+ return;
+ }
+
+ if (state->typing_scroll_p &&
+ (c == '\n' ||
+ x >= state->grid_width - 1))
+ {
+ set_cursor (state, False);
+ x = 0;
+ y++;
+
+ if (y >= state->grid_height-1)
+ {
+ int xx, yy;
+ for (yy = 0; yy < state->grid_height-2; yy++)
+ for (xx = 0; xx < state->grid_width; xx++)
+ {
+ int ii = yy * state->grid_width + xx;
+ int jj = (yy+1) * state->grid_width + xx;
+ state->cells[ii] = state->cells[jj];
+ state->cells[ii].changed = 1;
+ }
+ /* clear bottom row */
+ for (xx = 0; xx < state->grid_width; xx++)
+ {
+ int ii = yy * state->grid_width + xx;
+ state->cells[ii].glyph = 0;
+ state->cells[ii].changed = 1;
+ }
+ y--; /* move back up to bottom line */
+ scrolled_p = True;
+ }
+ }
+
+ if (c == '\n')
+ {
+ if (!state->typing_scroll_p)
+ {
+ int i, j;
+ set_cursor (state, False);
+ x = state->typing_left_margin;
+
+ /* clear the line */
+ i = state->grid_width * y;
+ j = i + state->grid_width;
+ for (; i < j; i++)
+ {
+ state->cells[i].glyph = 0;
+ state->cells[i].changed = 1;
+ }
+ }
+ state->typing_bold_p = False;
+ state->typing_stutter_p = False;
+ scrolled_p = True;
+ }
+
+ else if (c == '\010')
+ state->typing_delay += 500000;
+
+ else if (c == '\001')
+ {
+ state->typing_stutter_p = True;
+ state->typing_bold_p = False;
+ }
+ else if (c == '\002')
+ state->typing_bold_p = True;
+
+ else if (x < state->grid_width-1)
+ {
+ m_cell *cell = &state->cells[state->grid_width * y + x];
+ cell->glyph = char_map[c] + 1;
+ if (c == ' ' || c == '\t') cell->glyph = 0;
+ cell->changed = 1;
+ cell->glow = (state->typing_bold_p ? 127 : 0);
+ }
+
+ if (c >= ' ')
+ x++;
+
+ if (x >= state->grid_width-1)
+ x = state->grid_width-1;
+
+ state->typing++;
+
+ if (state->typing_stutter_p)
+ {
+ if (state->typing_delay == 0)
+ state->typing_delay = 20000;
+ if (random() % 3)
+ state->typing_delay += (0xFFFFFF & ((random() % 200000) + 1));
+ }
+
+ /* If there's no delay after this character, just keep going. */
+ if (state->typing_delay == 0)
+ goto AGAIN;
+
+ if (scrolled_p || x != state->cursor_x || y != state->cursor_y)
+ {
+ set_cursor (state, False);
+ state->cursor_x = x;
+ state->cursor_y = y;
+ if (state->typing_cursor_p)
+ set_cursor (state, True);
+ }
+ }
+}
+
+
+static void
+hack_matrix (m_state *state)
+{
+ int x;
+
+ switch (state->mode)
+ {
+ case TRACE_DONE: case TRACE_FAIL:
+ return;
+ case TRACE_A: case TRACE_B:
+ case MATRIX: case DNA: case BINARY: case DEC: case HEX: case ASCII:
+ break;
+ default:
+ abort(); break;
+ }
+
+ /* Glow some characters. */
+ if (!state->insert_bottom_p)
+ {
+ int i = random() % (state->grid_width / 2);
+ while (--i > 0)
+ {
+ int yy = random() % state->grid_height;
+ int xx = random() % state->grid_width;
+ m_cell *cell = &state->cells[state->grid_width * yy + xx];
+ if (cell->glyph && cell->glow == 0)
+ {
+ cell->glow = random() % 10;
+ cell->changed = 1;
+ }
+ }
+ }
+
+ /* Change some of the feeders. */
+ for (x = 0; x < state->grid_width; x++)
+ {
+ m_feeder *f = &state->feeders[x];
+ Bool bottom_feeder_p;
+
+ if (f->remaining > 0) /* never change if pipe isn't empty */
+ continue;
+
+ if ((random() % densitizer(state)) != 0) /* then change N% of the time */
+ continue;
+
+ f->remaining = 3 + (random() % state->grid_height);
+ f->throttle = ((random() % 5) + (random() % 5));
+
+ if ((random() % 4) != 0)
+ f->remaining = 0;
+
+ if (state->mode == TRACE_A || state->mode == TRACE_B)
+ bottom_feeder_p = True;
+ else if (state->insert_top_p && state->insert_bottom_p)
+ bottom_feeder_p = (random() & 1);
+ else
+ bottom_feeder_p = state->insert_bottom_p;
+
+ if (bottom_feeder_p)
+ f->y = random() % (state->grid_height / 2);
+ else
+ f->y = -1;
+ }
+
+ if (state->mode == MATRIX && (! (random() % 500)))
+ init_spinners (state);
+}
+
+
+static unsigned long
+xmatrix_draw (Display *dpy, Window window, void *closure)
+{
+ m_state *state = (m_state *) closure;
+
+ if (state->typing_delay > 0)
+ {
+ state->typing_delay -= state->delay;
+ if (state->typing_delay < 0)
+ state->typing_delay = 0;
+ redraw_cells (state, False);
+ return state->delay;
+ }
+
+ switch (state->mode)
+ {
+ case MATRIX: case DNA: case BINARY: case DEC: case HEX: case ASCII:
+ case TRACE_A: case TRACE_B:
+ feed_matrix (state);
+ hack_matrix (state);
+ break;
+
+ case DRAIN_TRACE_A:
+ case DRAIN_TRACE_B:
+ case DRAIN_KNOCK:
+ case DRAIN_NMAP:
+ case DRAIN_MATRIX:
+ feed_matrix (state);
+ if (screen_blank_p (state))
+ {
+ state->typing_delay = 500000;
+ if(state->start_reveal_back_p){
+ m_cell *back, *to;
+ int x,y;
+ state->typing_delay = 5000000;
+ state->start_reveal_back_p = False;
+ state->back_text_full_p = False;
+ /* for loop to move background to foreground */
+ for (y = 0; y < state->grid_height; y++){
+ for (x = 0; x < state->grid_width; x++){
+ to = &state->cells[state->grid_width * y + x];
+ back = &state->background[state->grid_width * y + x];
+ to->glyph = back->glyph;
+ to->changed = back->changed;
+ back->glyph = 0;
+ back->changed = 0;
+ }
+ }
+ }
+ switch (state->mode)
+ {
+ case DRAIN_TRACE_A: set_mode (state, TRACE_TEXT_A); break;
+ case DRAIN_TRACE_B: set_mode (state, TRACE_TEXT_B); break;
+ case DRAIN_KNOCK: set_mode (state, KNOCK); break;
+ case DRAIN_NMAP: set_mode (state, NMAP); break;
+ case DRAIN_MATRIX: set_mode (state, state->def_mode); break;
+ default: abort(); break;
+ }
+ }
+ break;
+
+ case TRACE_DONE:
+ set_mode (state, state->def_mode);
+ break;
+
+ case TRACE_TEXT_A:
+ case TRACE_TEXT_B:
+ case TRACE_FAIL:
+ case KNOCK:
+ case NMAP:
+ hack_text (state);
+
+ if (! state->typing) /* done typing */
+ {
+ set_cursor (state, False);
+ switch (state->mode)
+ {
+ case TRACE_TEXT_A: set_mode (state, TRACE_A); break;
+ case TRACE_TEXT_B: set_mode (state, TRACE_B); break;
+ case TRACE_FAIL: set_mode (state, state->def_mode); break;
+ case KNOCK: set_mode (state, state->def_mode); break;
+ case NMAP: set_mode (state, state->def_mode); break;
+ default: abort(); break;
+ }
+ }
+ break;
+
+ default:
+ abort();
+ }
+ if (state->start_reveal_back_p){
+ set_mode (state, DRAIN_MATRIX);
+ }
+ if (state->mode == MATRIX &&
+ state->knock_knock_p &&
+ (! (random() % 10000)))
+ {
+ if (! (random() % 5))
+ set_mode (state, DRAIN_NMAP);
+ else
+ set_mode (state, DRAIN_KNOCK);
+ }
+
+ redraw_cells (state, True);
+
+#if 0
+ {
+ static int i = 0;
+ static int ndens = 0;
+ static int tdens = 0;
+ i++;
+ if (i > 50)
+ {
+ int dens = (100.0 *
+ (((double)count) /
+ ((double) (state->grid_width * state->grid_height))));
+ tdens += dens;
+ ndens++;
+ printf ("density: %d%% (%d%%)\n", dens, (tdens / ndens));
+ i = 0;
+ }
+ }
+#endif
+
+ return state->delay;
+}
+
+
+static void
+xmatrix_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ m_state *state = (m_state *) closure;
+ int ow = state->grid_width;
+ int oh = state->grid_height;
+ XGetWindowAttributes (state->dpy, state->window, &state->xgwa);
+ state->grid_width = state->xgwa.width / state->char_width;
+ state->grid_height = state->xgwa.height / state->char_height;
+ state->grid_width++;
+ state->grid_height++;
+ if (state->grid_width < 5) state->grid_width = 5;
+ if (state->grid_height < 5) state->grid_height = 5;
+
+ if (ow != state->grid_width ||
+ oh != state->grid_height)
+ {
+ m_cell *ncells = (m_cell *)
+ calloc (sizeof(m_cell), state->grid_width * state->grid_height);
+ m_cell *nbackground = (m_cell *)
+ calloc (sizeof(m_cell), state->grid_width * state->grid_height);
+ m_feeder *nfeeders = (m_feeder *)
+ calloc (sizeof(m_feeder), state->grid_width);
+ int x, y, i;
+
+ /* fprintf(stderr, "resize: %d x %d ==> %d x %d\n",
+ ow, oh, state->grid_width, state->grid_height); */
+
+ for (y = 0; y < oh; y++)
+ for (x = 0; x < ow; x++)
+ if (x < ow && x < state->grid_width &&
+ y < oh && y < state->grid_height){
+ ncells[y * state->grid_width + x] =
+ state->cells[y * ow + x];
+ nbackground[y * state->grid_width + x] =
+ state->background[y * ow + x];
+ }
+ free (state->cells);
+ free (state->background);
+ state->cells = ncells;
+ state->background = nbackground;
+
+ x = (ow < state->grid_width ? ow : state->grid_width);
+ for (i = 0; i < x; i++)
+ nfeeders[i] = state->feeders[i];
+ free (state->feeders);
+ state->feeders = nfeeders;
+ }
+ if (state->tc)
+ textclient_reshape (state->tc,
+ state->xgwa.width,
+ state->xgwa.height,
+ state->grid_width - 2,
+ state->grid_height - 1,
+ 0);
+}
+
+static Bool
+xmatrix_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ m_state *state = (m_state *) closure;
+
+ if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ switch (c)
+ {
+ case '0':
+ /*set_mode (state, DRAIN_MATRIX);*/
+ state->back_y = 1;
+ state->back_text_full_p = True;
+ state->start_reveal_back_p = True;
+ return True;
+
+ case '+': case '=': case '>': case '.':
+ state->density += 10;
+ if (state->density > 100)
+ state->density = 100;
+ else
+ return True;
+ break;
+
+ case '-': case '_': case '<': case ',':
+ state->density -= 10;
+ if (state->density < 0)
+ state->density = 0;
+ else
+ return True;
+ break;
+
+ case '[': case '(': case '{':
+ state->insert_top_p = True;
+ state->insert_bottom_p = False;
+ return True;
+
+ case ']': case ')': case '}':
+ state->insert_top_p = False;
+ state->insert_bottom_p = True;
+ return True;
+
+ case '\\': case '|':
+ state->insert_top_p = True;
+ state->insert_bottom_p = True;
+ return True;
+
+ case 't':
+ set_mode (state, DRAIN_TRACE_A);
+ return True;
+
+ case 'T':
+ set_mode (state, DRAIN_TRACE_B);
+ return True;
+
+ case 'k':
+ set_mode (state, DRAIN_KNOCK);
+ return True;
+
+ case 'c':
+ set_mode (state, DRAIN_NMAP);
+ return True;
+
+ default:
+ break;
+ }
+ }
+
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ set_mode (state, DRAIN_MATRIX);
+ return True;
+ }
+
+ return False;
+}
+
+static void
+xmatrix_free (Display *dpy, Window window, void *closure)
+{
+ m_state *state = (m_state *) closure;
+ if (state->tc)
+ textclient_close (state->tc);
+ if (state->cursor_timer)
+ XtRemoveTimeOut (state->cursor_timer);
+
+ /* #### there's more to free here */
+
+ free (state);
+}
+
+static const char *xmatrix_defaults [] = {
+ ".background: black",
+ ".foreground: #00AA00",
+ ".lowrez: true", /* Small font is unreadable at 5120x2880 */
+ "*fpsSolid: true",
+ "*matrixFont: large",
+ "*delay: 10000",
+ "*insert: both",
+ "*mode: Matrix",
+ "*tracePhone: (312) 555-0690",
+ "*spinners: 5",
+ "*density: 75",
+ "*trace: True",
+ "*knockKnock: True",
+ "*usePipe: False",
+ "*usePty: False",
+ "*program: xscreensaver-text --latin1",
+ "*geometry: 960x720",
+ 0
+};
+
+static XrmOptionDescRec xmatrix_options [] = {
+ { "-small", ".matrixFont", XrmoptionNoArg, "Small" },
+ { "-large", ".matrixFont", XrmoptionNoArg, "Large" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-insert", ".insert", XrmoptionSepArg, 0 },
+ { "-top", ".insert", XrmoptionNoArg, "top" },
+ { "-bottom", ".insert", XrmoptionNoArg, "bottom" },
+ { "-both", ".insert", XrmoptionNoArg, "both" },
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-trace", ".trace", XrmoptionNoArg, "True" },
+ { "-no-trace", ".trace", XrmoptionNoArg, "False" },
+ { "-crack", ".mode", XrmoptionNoArg, "crack"},
+ { "-phone", ".tracePhone", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-dna", ".mode", XrmoptionNoArg, "DNA" },
+ { "-binary", ".mode", XrmoptionNoArg, "binary" },
+ { "-hexadecimal", ".mode", XrmoptionNoArg, "hexadecimal"},
+ { "-decimal", ".mode", XrmoptionNoArg, "decimal"},
+ { "-knock-knock", ".knockKnock", XrmoptionNoArg, "True" },
+ { "-no-knock-knock", ".knockKnock", XrmoptionNoArg, "False" },
+ { "-ascii", ".mode", XrmoptionNoArg, "ascii"},
+ { "-pipe", ".usePipe", XrmoptionNoArg, "True" },
+ { "-no-pipe", ".usePipe", XrmoptionNoArg, "False" },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("XMatrix", xmatrix)
diff --git a/hacks/xmatrix.man b/hacks/xmatrix.man
new file mode 100644
index 0000000..bdfed21
--- /dev/null
+++ b/hacks/xmatrix.man
@@ -0,0 +1,146 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+xmatrix - simulates the computer displays from the movie
+.SH SYNOPSIS
+.B xmatrix
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-density \fIpercentage\fP]
+[\-top | \-bottom | \-both]
+[\-small | \-large]
+[\-trace]
+[\-mode \fImode\fP]
+[\-phone \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIxmatrix\fP program draws the 2D "digital rain" effect, as seen on
+the computer monitors in the Wachowski brothers' film, "The Matrix".
+
+Also see
+.BR glmatrix (MANSUFFIX)
+for a 3D rendering of the similar effect that appeared in the title
+sequence of the movie.
+.SH OPTIONS
+.I xmatrix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation, in microseconds: default 10000.
+.TP 8
+.B \-density \fIpercentage\fP
+The approximate percentage of the screen that should be filled with
+characters at any given time. Default 75%.
+
+When running in a window, typing \fB+\fP will increase the density and
+typing \fB-\fP will decrease it. Typing \fB0\fP will momentarily
+drain the screen.
+.TP 8
+.B \-top\fP | \fB\-bottom\fP | \fB\-both
+If \fB\-top\fP is specified, the characters will only drop in from the
+top of the screen as sliding columns of characters. If \fB\-bottom\fP
+is specified, then instead of sliding columns, the characters will appear
+as columns that grow downwards and are erased from above. If \fB\-both\fP
+is specified, then a mixture of both styles will be used. The default
+is \fB\-both\fP.
+
+When running in a window, typing \fB[\fP will switch to top-mode,
+typing \fB\]\fP will switch to bottom-mode, and typing \fB\\\fP will
+switch to both-mode.
+.TP 8
+.B \-small\fP | \fB\-large
+These options specify the sizes of the characters. The default
+is \fB\-large\fP.
+.TP 8
+.B \-mode trace
+Start off with a representation of a phone number being traced.
+When the number is finally found, display The Matrix as usual.
+This is the default.
+.TP 8
+.B \-phone\fP \fInumber\fP
+The phone number to trace, if \fB\-trace\fP is specified.
+.TP 8
+.B \-mode crack
+Start off by shutting down the power grid.
+.TP 8
+.B \-mode binary
+Instead of displaying Matrix glyphs, only display ones and zeros.
+.TP 8
+.B \-mode hexadecimal
+Instead of displaying Matrix glyphs, display hexadecimal digits.
+.TP 8
+.B \-mode dna
+Instead of displaying Matrix glyphs, display genetic code
+(guanine, adenine, thymine, and cytosine.)
+.TP 8
+.B \-mode ascii
+Instead of displaying Matrix glyphs, display random ASCII characters.
+.TP 8
+.B \-mode pipe
+Instead of displaying random characters, display the output of a subprocess,
+as ASCII.
+.TP 8
+.B \-program \fIsh-command\fP
+The command to run to generate the text to display. This option may
+be any string acceptable to /bin/sh. The program will be run at the
+end of a pty or pipe, and any characters that it prints to
+\fIstdout\fP will be placed in the feeders for xmatrix. If the program
+exits, it will be launched again after xmatrix has processed all the
+text it produced.
+
+For example:
+.EX
+xmatrix -program 'echo Hello World'
+xmatrix -ascii -program 'ps -eo comm | rev'
+xmatrix -program 'od -txC -w6 /dev/random'
+xmatrix -program 'cat /dev/random'
+.EE
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR glmatrix (MANSUFFIX),
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999-2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 25-Apr-99.
diff --git a/hacks/xml2man.pl b/hacks/xml2man.pl
new file mode 100755
index 0000000..d7d4e32
--- /dev/null
+++ b/hacks/xml2man.pl
@@ -0,0 +1,266 @@
+#!/usr/bin/perl -w
+# Copyright © 2002-2014 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Created: 30-May-2002.
+#
+# This creates man pages from the XML program descriptions in
+# xscreensaver/hacks/config/.
+#
+# They aren't necessarily the most accurate or well-written man pages,
+# but at least they exist.
+
+require 5;
+use diagnostics;
+use strict;
+
+use Text::Wrap;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.7 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+my $default_args = ("[\\-display \\fIhost:display.screen\\fP]\n" .
+ "[\\-visual \\fIvisual\\fP]\n" .
+ "[\\-window]\n" .
+ "[\\-root]\n");
+my $default_options = (".TP 8\n" .
+ ".B \\-visual \\fIvisual\\fP\n" .
+ "Specify which visual to use. Legal values " .
+ "are the name of a visual class,\n" .
+ "or the id number (decimal or hex) of a " .
+ "specific visual.\n" .
+ ".TP 8\n" .
+ ".B \\-window\n" .
+ "Draw on a newly-created window. " .
+ "This is the default.\n" .
+ ".TP 8\n" .
+ ".B \\-root\n" .
+ "Draw on the root window.\n");
+
+my $man_suffix = (".SH ENVIRONMENT\n" .
+ ".PP\n" .
+ ".TP 8\n" .
+ ".B DISPLAY\n" .
+ "to get the default host and display number.\n" .
+ ".TP 8\n" .
+ ".B XENVIRONMENT\n" .
+ "to get the name of a resource file that overrides " .
+ "the global resources\n" .
+ "stored in the RESOURCE_MANAGER property.\n" .
+ ".SH SEE ALSO\n" .
+ ".BR X (1),\n" .
+ ".BR xscreensaver (1)\n" .
+ ".SH COPYRIGHT\n" .
+ "Copyright \\(co %YEAR% by %AUTHOR%. " .
+ "Permission to use, copy, modify, \n" .
+ "distribute, and sell this software and its " .
+ "documentation for any purpose is \n" .
+ "hereby granted without fee, provided that " .
+ "the above copyright notice appear \n" .
+ "in all copies and that both that copyright " .
+ "notice and this permission notice\n" .
+ "appear in supporting documentation. No " .
+ "representations are made about the \n" .
+ "suitability of this software for any purpose. " .
+ "It is provided \"as is\" without\n" .
+ "express or implied warranty.\n" .
+ ".SH AUTHOR\n" .
+ "%AUTHOR%.\n");
+
+sub xml2man($) {
+ my ($exe) = @_;
+ $exe =~ s/\.xml$//s;
+ my $cfgdir = (-d "config" ? "config" : "../config");
+ my $xml = "$cfgdir/$exe.xml";
+ my $man = "$exe.man";
+
+ error ("$exe does not exist") if (! -f $exe);
+ error ("$xml does not exist") if (! -f $xml);
+ error ("$man already exists") if (-f $man);
+
+ local *IN;
+ open (IN, "<$xml") || error ("$xml: $!");
+ my $xmltxt = "";
+ while (<IN>) { $xmltxt .= $_; }
+ close IN;
+
+ my $args = "";
+ my $body = "";
+ my $desc;
+
+ $xmltxt =~ s/\s+/ /gs;
+ $xmltxt =~ s/<!--.*?-->//g;
+ $xmltxt =~ s@(<[^/])@\n$1@gs;
+
+ foreach (split ('\n', $xmltxt)) {
+ next if m/^$/;
+ next if m/^<\?xml\b/;
+ next if m/^<screensaver\b/;
+ next if m/^<command\b/;
+ next if m/^<[hv]group\b/;
+ next if m/^<select\b/;
+
+ my ($x,$arg) = m@\barg(|-unset|-set)=\"([^\"]+)\"@;
+ my ($label) = m@\b_?label=\"([^\"]+)\"@;
+ my ($low) = m@\blow=\"([^\"]+)\"@;
+ my ($hi) = m@\bhigh=\"([^\"]+)\"@;
+ my ($def) = m@\bdefault=\"([^\"]+)\"@;
+
+ $arg =~ s@\s*\%\s*@ \\fInumber\\fP@g if ($arg);
+
+ my $carg = $arg;
+ my $boolp = m/^<boolean/;
+ my $novalsp = 0;
+
+ if ($arg && $arg =~ m/^-no(-.*)/) {
+ $arg = "$1 | \\$arg";
+ } elsif ($boolp && $arg) {
+ $arg = "$arg | \\-no$arg";
+ }
+
+ if ($carg && $carg =~ m/colors/) {
+ $hi = $low = undef;
+ }
+
+ if (!$carg) {
+ } elsif ($carg eq '-move' || $carg eq '-no-move' ||
+ $carg eq '-wander' || $carg eq '-no-wander') {
+ $label = "Whether the object should wander around the screen.";
+ } elsif ($boolp && ($carg eq '-spin' || $carg eq '-no-spin')) {
+ $label = "Whether the object should spin.";
+ } elsif ($carg eq '-spin X') {
+ $carg = '-spin \fI[XYZ]\fP';
+ $arg = $carg;
+ $label = "Around which axes should the object spin?";
+ } elsif ($carg eq '-fps' || $carg eq '-no-fps') {
+ $label = "Whether to show a frames-per-second display " .
+ "at the bottom of the screen.";
+ } elsif ($carg eq '-wireframe' || $carg eq '-wire') {
+ $label = "Render in wireframe instead of solid.";
+ } elsif ($carg =~ m/^-delay/ && $hi && $hi >= 10000) {
+ $label = "Per-frame delay, in microseconds.";
+ $def = sprintf ("%d (%0.2f seconds)", $def, ($def/1000000.0));
+ $low = $hi = undef;
+ } elsif ($carg eq '-speed \fInumber\fP') {
+ $label = "Animation speed. 2.0 means twice as fast, " .
+ "0.5 means half as fast.";
+ $novalsp = 1;
+ } elsif ($boolp) {
+ $label .= ". Boolean.";
+ } elsif ($label) {
+ $label .= ".";
+ }
+
+ if (m/^<(number|boolean|option)/) {
+
+ next if (!$arg && m/<option/);
+ if (!$label) {
+ print STDERR "$progname: ERROR: no label: $_\n";
+ $label = "???";
+ }
+
+ $args .= "[\\$carg]\n";
+
+ if (! $novalsp) {
+ $label .= " $low - $hi." if (defined($low) && defined($hi));
+ $label .= " Default: $def." if (defined ($def));
+ }
+ $label = wrap ("", "", $label);
+
+ $body .= ".TP 8\n.B \\$arg\n$label";
+ $body .= "\n";
+
+ } elsif (m@^<_description>\s*(.*)\s*</_description>@) {
+ $desc = $1;
+ } elsif (m@^<xscreensaver-updater@) {
+ } elsif (m@^<video\b@) {
+ } else {
+ print STDERR "$progname: ERROR: UNKNOWN: $_\n";
+ }
+ }
+
+ $desc = "Something pretty." unless $desc;
+
+ my $author = undef;
+ if ($desc =~ m@^(.*?)\s*(Written by|By) ([^.]+\.?\s*)$@s) {
+ $desc = $1;
+ $author = $3;
+ $author =~ s/\s*[.]\s*$//;
+ }
+
+ if (!$author) {
+ print STDERR "$progname: $exe: WARNING: unknown author\n";
+ $author = "UNKNOWN";
+ }
+
+ $desc =~ s@http://en\.wikipedia\.org/[^\s]+@@gs;
+
+ $desc = wrap ("", "", $desc);
+
+ $body = (".TH XScreenSaver 1 \"\" \"X Version 11\"\n" .
+ ".SH NAME\n" .
+ "$exe - screen saver.\n" .
+ ".SH SYNOPSIS\n" .
+ ".B $exe\n" .
+ $default_args .
+ $args .
+ ".SH DESCRIPTION\n" .
+ $desc . "\n" .
+ ".SH OPTIONS\n" .
+ $default_options .
+ $body .
+ $man_suffix);
+
+ my $year = $1 if ($author =~ s/; (\d{4})$//s);
+ $year = (localtime)[5] + 1900 unless $year;
+
+ $body =~ s/%AUTHOR%/$author/g;
+ $body =~ s/%YEAR%/$year/g;
+
+#print $body; exit 0;
+
+ local *OUT;
+ open (OUT, ">$man") || error ("$man: $!");
+ print OUT $body || error ("$man: $!");
+ close OUT || error ("$man: $!");
+ print STDERR "$progname: wrote $man\n";
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] programs...\n";
+ exit 1;
+}
+
+sub main() {
+ my @progs = ();
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^-./) { usage; }
+ else { push @progs, $_; }
+ }
+
+ usage() if ($#progs < 0);
+
+ foreach (@progs) { xml2man($_); }
+}
+
+main();
+exit 0;
diff --git a/hacks/xrayswarm.c b/hacks/xrayswarm.c
new file mode 100644
index 0000000..678c7b0
--- /dev/null
+++ b/hacks/xrayswarm.c
@@ -0,0 +1,1224 @@
+/*
+ * Copyright (c) 2000 by Chris Leger (xrayjones@users.sourceforge.net)
+ *
+ * xrayswarm - a shameless ripoff of the 'swarm' screensaver on SGI
+ * boxes.
+ *
+ * Version 1.0 - initial release. doesn't read any special command-line
+ * options, and only supports the variable 'delay' via Xresources.
+ * (the delay resouces is most useful on systems w/o gettimeofday, in
+ * which case automagical level-of-detail for FPS maintainance can't
+ * be used.)
+ *
+ * The code isn't commented, but isn't too ugly. It should be pretty
+ * easy to understand, with the exception of the colormap stuff.
+ *
+ */
+/*
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+*/
+
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/time.h>
+#include "screenhack.h"
+
+#ifdef HAVE_JWXYZ
+# define HAVE_GETTIMEOFDAY 1
+#endif
+
+/**********************************************************************
+ *
+ * window crap
+ *
+ **********************************************************************/
+
+static const char *xrayswarm_defaults [] ={
+ ".lowrez: true",
+ ".background: black",
+ "*delay: 20000",
+ "*fpsSolid: true",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec xrayswarm_options [] = {
+ {"-delay",".delay",XrmoptionSepArg,0},
+ {0,0,0,0}
+};
+
+
+/**********************************************************************
+ *
+ * bug structs & variables
+ *
+ **********************************************************************/
+#define MAX_TRAIL_LEN 60
+#define MAX_BUGS 100
+#define MAX_TARGETS 10
+#define sq(x) ((x)*(x))
+
+#define MAX_FPS 150
+#define MIN_FPS 16
+#define DESIRED_DT 0.2
+
+typedef struct _sbug {
+ float pos[3];
+ int hist[MAX_TRAIL_LEN][2];
+ float vel[2];
+ struct _sbug *closest;
+} bug;
+
+#define GRAY_TRAILS 0
+#define GRAY_SCHIZO 1
+#define COLOR_TRAILS 2
+#define RANDOM_TRAILS 3
+#define RANDOM_SCHIZO 4
+#define COLOR_SCHIZO 5
+#define NUM_SCHEMES 6 /* too many schizos; don't use last 2 */
+
+
+
+struct state {
+ Display *dpy;
+ Window win;
+
+ unsigned char colors[768];
+
+ GC fgc[256];
+ GC cgc;
+ int xsize, ysize;
+ int xc, yc;
+ unsigned long delay;
+ float maxx, maxy;
+
+ float dt;
+ float targetVel;
+ float targetAcc;
+ float maxVel;
+ float maxAcc;
+ float noise;
+ float minVelMultiplier;
+
+ int nbugs;
+ int ntargets;
+ int trailLen;
+
+ float dtInv;
+ float halfDtSq;
+ float targetVelSq;
+ float maxVelSq;
+ float minVelSq;
+ float minVel;
+
+ bug bugs[MAX_BUGS];
+ bug targets[MAX_TARGETS];
+ int head;
+ int tail;
+ int colorScheme;
+ float changeProb;
+
+ int grayIndex[MAX_TRAIL_LEN];
+ int redIndex[MAX_TRAIL_LEN];
+ int blueIndex[MAX_TRAIL_LEN];
+ int graySIndex[MAX_TRAIL_LEN];
+ int redSIndex[MAX_TRAIL_LEN];
+ int blueSIndex[MAX_TRAIL_LEN];
+ int randomIndex[MAX_TRAIL_LEN];
+ int numColors;
+ int numRandomColors;
+
+ int checkIndex;
+ int rsc_callDepth;
+ int rbc_callDepth;
+
+ float draw_fps;
+ float draw_timePerFrame, draw_elapsed;
+ int *draw_targetColorIndex, *draw_colorIndex;
+ int draw_targetStartColor, draw_targetNumColors;
+ int draw_startColor, draw_numColors;
+ double draw_start, draw_end;
+ int draw_cnt;
+ int draw_sleepCount;
+ int draw_delayAccum;
+ int draw_nframes;
+
+ struct timeval startupTime;
+};
+
+
+typedef struct {
+ float dt;
+ float targetVel;
+ float targetAcc;
+ float maxVel;
+ float maxAcc;
+ float noise;
+
+ int nbugs;
+ int ntargets;
+ int trailLen;
+ int colorScheme;
+ int changeProb;
+} bugParams;
+
+#if 0
+static const bugParams good1 = {
+ 0.3, /* dt */
+ 0.03, /* targetVel */
+ 0.02, /* targetAcc */
+ 0.05, /* maxVel */
+ 0.03, /* maxAcc */
+ 0.01, /* noise */
+ -1, /* nbugs */
+ -1, /* ntargets */
+ 60, /* trailLen */
+ 2, /* colorScheme */
+ 0.15 /* changeProb */
+};
+
+static const bugParams *goodParams[] = {
+&good1
+};
+
+static int numParamSets = 1;
+#endif
+
+static void initCMap(struct state *st)
+{
+ int i, n;
+ int temp;
+
+ n = 0;
+
+ /* color 0 is black */
+ st->colors[n++] = 0;
+ st->colors[n++] = 0;
+ st->colors[n++] = 0;
+
+ /* color 1 is red */
+ st->colors[n++] = 255;
+ st->colors[n++] = 0;
+ st->colors[n++] = 0;
+
+ /* color 2 is green */
+ st->colors[n++] = 255;
+ st->colors[n++] = 0;
+ st->colors[n++] = 0;
+
+ /* color 3 is blue */
+ st->colors[n++] = 255;
+ st->colors[n++] = 0;
+ st->colors[n++] = 0;
+
+ /* start greyscale colors at 4; 16 levels */
+ for (i = 0; i < 16; i++) {
+ temp = i*16;
+ if (temp > 255) temp = 255;
+ st->colors[n++] = 255 - temp;
+ st->colors[n++] = 255 - temp;
+ st->colors[n++] = 255 - temp;
+ }
+
+ /* start red fade at 20; 16 levels */
+ for (i = 0; i < 16; i++) {
+ temp = i*16;
+ if (temp > 255) temp = 255;
+ st->colors[n++] = 255 - temp;
+ st->colors[n++] = 255 - pow(i/16.0+0.001, 0.3)*255;
+ st->colors[n++] = 65 - temp/4;
+ }
+
+ /* start blue fade at 36; 16 levels */
+ for (i = 0; i < 16; i++) {
+ temp = i*16;
+ if (temp > 255) temp = 255;
+ st->colors[n++] = 32 - temp/8;
+ st->colors[n++] = 180 - pow(i/16.0+0.001, 0.3)*180;
+ st->colors[n++] = 255 - temp;
+ }
+
+ /* random colors start at 52 */
+ st->numRandomColors = MAX_TRAIL_LEN;
+
+ st->colors[n] = random()&255; n++;
+ st->colors[n] = random()&255; n++;
+ st->colors[n] = st->colors[n-2]/2 + st->colors[n-3]/2; n++;
+
+ for (i = 0; i < st->numRandomColors; i++) {
+ st->colors[n] = (st->colors[n-3] + (random()&31) - 16)&255; n++;
+ st->colors[n] = (st->colors[n-3] + (random()&31) - 16)&255; n++;
+ st->colors[n] = st->colors[n-2]/(float)(i+2) + st->colors[n-3]/(float)(i+2); n++;
+ }
+
+ st->numColors = n/3 + 1;
+}
+
+static int initGraphics(struct state *st)
+{
+ XGCValues xgcv;
+ XWindowAttributes xgwa;
+/* XSetWindowAttributes xswa;*/
+ Colormap cmap;
+ XColor color;
+ int n, i;
+
+ initCMap(st);
+
+ XGetWindowAttributes(st->dpy,st->win,&xgwa);
+ cmap=xgwa.colormap;
+/* xswa.backing_store=Always;
+ XChangeWindowAttributes(st->dpy,st->win,CWBackingStore,&xswa);*/
+ xgcv.function=GXcopy;
+
+ st->delay = get_integer_resource(st->dpy, "delay","Integer");
+
+ xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background");
+ st->fgc[0]=XCreateGC(st->dpy, st->win, GCForeground|GCFunction,&xgcv);
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (st->dpy, st->fgc[0], False);
+#endif
+
+ n=0;
+ if (mono_p) {
+ xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
+ st->fgc[1]=XCreateGC(st->dpy,st->win,GCForeground|GCFunction,&xgcv);
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (st->dpy, st->fgc[1], False);
+#endif
+ for (i=0;i<st->numColors;i+=2) st->fgc[i]=st->fgc[0];
+ for (i=1;i<st->numColors;i+=2) st->fgc[i]=st->fgc[1];
+ } else {
+ for (i = 0; i < st->numColors; i++) {
+ color.red=st->colors[n++]<<8;
+ color.green=st->colors[n++]<<8;
+ color.blue=st->colors[n++]<<8;
+ color.flags=DoRed|DoGreen|DoBlue;
+ XAllocColor(st->dpy,cmap,&color);
+ xgcv.foreground=color.pixel;
+ st->fgc[i] = XCreateGC(st->dpy, st->win, GCForeground | GCFunction,&xgcv);
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (st->dpy, st->fgc[i], False);
+#endif
+ }
+ }
+ st->cgc = XCreateGC(st->dpy,st->win,GCForeground|GCFunction,&xgcv);
+ XSetGraphicsExposures(st->dpy,st->cgc,False);
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (st->dpy, st->cgc, False);
+#endif
+
+ st->xsize = xgwa.width;
+ st->ysize = xgwa.height;
+ st->xc = st->xsize >> 1;
+ st->yc = st->ysize >> 1;
+
+ st->maxx = 1.0;
+ st->maxy = st->ysize/(float)st->xsize;
+
+ if (st->colorScheme < 0) st->colorScheme = random()%NUM_SCHEMES;
+
+ return True;
+}
+
+static void initBugs(struct state *st)
+{
+ register bug *b;
+ int i;
+
+ st->head = st->tail = 0;
+
+ memset((char *)st->bugs, 0,MAX_BUGS*sizeof(bug));
+ memset((char *)st->targets, 0, MAX_TARGETS*sizeof(bug));
+
+ if (st->ntargets < 0) st->ntargets = (0.25+frand(0.75)*frand(1))*MAX_TARGETS;
+ if (st->ntargets < 1) st->ntargets = 1;
+
+ if (st->nbugs < 0) st->nbugs = (0.25+frand(0.75)*frand(1))*MAX_BUGS;
+ if (st->nbugs <= st->ntargets) st->nbugs = st->ntargets+1;
+
+ if (st->trailLen < 0) {
+ st->trailLen = (1.0 - frand(0.6)*frand(1))*MAX_TRAIL_LEN;
+ }
+
+ if (st->nbugs > MAX_BUGS) st->nbugs = MAX_BUGS;
+ if (st->ntargets > MAX_TARGETS) st->ntargets = MAX_TARGETS;
+ if (st->trailLen > MAX_TRAIL_LEN) st->trailLen = MAX_TRAIL_LEN;
+
+ b = st->bugs;
+ for (i = 0; i < st->nbugs; i++, b++) {
+ b->pos[0] = frand(st->maxx);
+ b->pos[1] = frand(st->maxy);
+ b->vel[0] = frand(st->maxVel/2);
+ b->vel[1] = frand(st->maxVel/2);
+
+ b->hist[st->head][0] = b->pos[0]*st->xsize;
+ b->hist[st->head][1] = b->pos[1]*st->xsize;
+ b->closest = &st->targets[random()%st->ntargets];
+ }
+
+ b = st->targets;
+ for (i = 0; i < st->ntargets; i++, b++) {
+ b->pos[0] = frand(st->maxx);
+ b->pos[1] = frand(st->maxy);
+
+ b->vel[0] = frand(st->targetVel/2);
+ b->vel[1] = frand(st->targetVel/2);
+
+ b->hist[st->head][0] = b->pos[0]*st->xsize;
+ b->hist[st->head][1] = b->pos[1]*st->xsize;
+ }
+}
+
+static void pickNewTargets(struct state *st)
+{
+ register int i;
+ register bug *b;
+
+ b = st->bugs;
+ for (i = 0; i < st->nbugs; i++, b++) {
+ b->closest = &st->targets[random()%st->ntargets];
+ }
+}
+
+#if 0
+static void addBugs(int numToAdd)
+{
+ register bug *b;
+ int i;
+
+ if (numToAdd + st->nbugs > MAX_BUGS) numToAdd = MAX_BUGS-st->nbugs;
+ else if (numToAdd < 0) numToAdd = 0;
+
+ for (i = 0; i < numToAdd; i++) {
+ b = &st->bugs[random()%st->nbugs];
+ memcpy((char *)&st->bugs[st->nbugs+i], (char *)b, sizeof(bug));
+ b->closest = &st->targets[random()%st->ntargets];
+ }
+
+ st->nbugs += numToAdd;
+}
+
+static void addTargets(int numToAdd)
+{
+ register bug *b;
+ int i;
+
+ if (numToAdd + st->ntargets > MAX_TARGETS) numToAdd = MAX_TARGETS-st->ntargets;
+ else if (numToAdd < 0) numToAdd = 0;
+
+ for (i = 0; i < numToAdd; i++) {
+ b = &st->targets[random()%st->ntargets];
+ memcpy((char *)&st->targets[st->ntargets+i], (char *)b, sizeof(bug));
+ b->closest = &st->targets[random()%st->ntargets];
+ }
+
+ st->ntargets += numToAdd;
+}
+#endif
+
+static void computeConstants(struct state *st)
+{
+ st->halfDtSq = st->dt*st->dt*0.5;
+ st->dtInv = 1.0/st->dt;
+ st->targetVelSq = st->targetVel*st->targetVel;
+ st->maxVelSq = st->maxVel*st->maxVel;
+ st->minVel = st->maxVel*st->minVelMultiplier;
+ st->minVelSq = st->minVel*st->minVel;
+}
+
+static void computeColorIndices(struct state *st)
+{
+ int i;
+ int schizoLength;
+
+ /* note: colors are used in *reverse* order! */
+
+ /* grayscale */
+ for (i = 0; i < st->trailLen; i++) {
+ st->grayIndex[st->trailLen-1-i] = 4 + i*16.0/st->trailLen + 0.5;
+ if (st->grayIndex[st->trailLen-1-i] > 19) st->grayIndex[st->trailLen-1-i] = 19;
+ }
+
+ /* red */
+ for (i = 0; i < st->trailLen; i++) {
+ st->redIndex[st->trailLen-1-i] = 20 + i*16.0/st->trailLen + 0.5;
+ if (st->redIndex[st->trailLen-1-i] > 35) st->redIndex[st->trailLen-1-i] = 35;
+ }
+
+ /* blue */
+ for (i = 0; i < st->trailLen; i++) {
+ st->blueIndex[st->trailLen-1-i] = 36 + i*16.0/st->trailLen + 0.5;
+ if (st->blueIndex[st->trailLen-1-i] > 51) st->blueIndex[st->trailLen-1-i] = 51;
+ }
+
+ /* gray schizo - same as gray*/
+ for (i = 0; i < st->trailLen; i++) {
+ st->graySIndex[st->trailLen-1-i] = 4 + i*16.0/st->trailLen + 0.5;
+ if (st->graySIndex[st->trailLen-1-i] > 19) st->graySIndex[st->trailLen-1-i] = 19;
+ }
+
+ /*schizoLength = st->trailLen/4;
+ if (schizoLength < 3) schizoLength = 3;*/
+ /* red schizo */
+ for (i = 0; i < st->trailLen; i++) {
+ /* redSIndex[trailLen-1-i] =
+ 20 + 16.0*(i%schizoLength)/(schizoLength-1.0) + 0.5;*/
+ st->redSIndex[st->trailLen-1-i] = 20 + i*16.0/st->trailLen + 0.5;
+ if (st->redSIndex[st->trailLen-1-i] > 35) st->redSIndex[st->trailLen-1-i] = 35;
+ }
+
+ schizoLength = st->trailLen/2;
+ if (schizoLength < 3) schizoLength = 3;
+ /* blue schizo is next */
+ for (i = 0; i < st->trailLen; i++) {
+ st->blueSIndex[st->trailLen-1-i] =
+ 36 + 16.0*(i%schizoLength)/(schizoLength-1.0) + 0.5;
+ if (st->blueSIndex[st->trailLen-1-i] > 51) st->blueSIndex[st->trailLen-1-i] = 51;
+ }
+
+ /* random is next */
+ for (i = 0; i < st->trailLen; i++) {
+ st->randomIndex[i] = 52 + random()%(st->numRandomColors);
+ }
+}
+
+#if 0
+static void setParams(bugParams *p)
+{
+ st->dt = p->dt;
+ st->targetVel = p->targetVel;
+ st->targetAcc = p->targetAcc;
+ st->maxVel = p->maxVel;
+ st->maxAcc = p->maxAcc;
+ st->noise = p->noise;
+
+ st->nbugs = p->nbugs;
+ st->ntargets = p->ntargets;
+ st->trailLen = p->trailLen;
+ st->colorScheme = p->colorScheme;
+ st->changeProb = p->changeProb;
+ computeConstants();
+ computeColorIndices();
+}
+#endif
+
+static void drawBugs(struct state *st, int *tColorIdx, int tci0, int tnc,
+ int *colorIdx, int ci0, int nc)
+{
+ register bug *b;
+ register int i, j;
+ int temp;
+
+ if (((st->head+1)%st->trailLen) == st->tail) {
+ /* first, erase last segment of bugs if necessary */
+ temp = (st->tail+1) % st->trailLen;
+
+ b = st->bugs;
+ for (i = 0; i < st->nbugs; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[0],
+ b->hist[st->tail][0], b->hist[st->tail][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+
+ b = st->targets;
+ for (i = 0; i < st->ntargets; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[0],
+ b->hist[st->tail][0], b->hist[st->tail][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+ st->tail = (st->tail+1)%st->trailLen;
+ }
+
+ for (j = st->tail; j != st->head; j = temp) {
+ temp = (j+1)%st->trailLen;
+
+ b = st->bugs;
+ for (i = 0; i < st->nbugs; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[colorIdx[ci0]],
+ b->hist[j][0], b->hist[j][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+
+ b = st->targets;
+ for (i = 0; i < st->ntargets; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[tColorIdx[tci0]],
+ b->hist[j][0], b->hist[j][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+ ci0 = (ci0+1)%nc;
+ tci0 = (tci0+1)%tnc;
+ }
+}
+
+static void clearBugs(struct state *st)
+{
+ register bug *b;
+ register int i, j;
+ int temp;
+
+ st->tail = st->tail-1;
+ if (st->tail < 0) st->tail = st->trailLen-1;
+
+ if (((st->head+1)%st->trailLen) == st->tail) {
+ /* first, erase last segment of bugs if necessary */
+ temp = (st->tail+1) % st->trailLen;
+
+ b = st->bugs;
+ for (i = 0; i < st->nbugs; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[0],
+ b->hist[st->tail][0], b->hist[st->tail][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+
+ b = st->targets;
+ for (i = 0; i < st->ntargets; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[0],
+ b->hist[st->tail][0], b->hist[st->tail][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+ st->tail = (st->tail+1)%st->trailLen;
+ }
+
+ for (j = st->tail; j != st->head; j = temp) {
+ temp = (j+1)%st->trailLen;
+
+ b = st->bugs;
+ for (i = 0; i < st->nbugs; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[0],
+ b->hist[j][0], b->hist[j][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+
+ b = st->targets;
+ for (i = 0; i < st->ntargets; i++, b++) {
+ XDrawLine(st->dpy, st->win, st->fgc[0],
+ b->hist[j][0], b->hist[j][1],
+ b->hist[temp][0], b->hist[temp][1]);
+ }
+ }
+}
+
+static void updateState(struct state *st)
+{
+ register int i;
+ register bug *b;
+ register float ax, ay, temp;
+ float theta;
+ bug *b2;
+ int j;
+
+ st->head = (st->head+1)%st->trailLen;
+
+ for (j = 0; j < 5; j++) {
+ /* update closets bug for the bug indicated by checkIndex */
+ st->checkIndex = (st->checkIndex+1)%st->nbugs;
+ b = &st->bugs[st->checkIndex];
+
+ ax = b->closest->pos[0] - b->pos[0];
+ ay = b->closest->pos[1] - b->pos[1];
+ temp = ax*ax + ay*ay;
+ for (i = 0; i < st->ntargets; i++) {
+ b2 = &st->targets[i];
+ if (b2 == b->closest) continue;
+ ax = b2->pos[0] - b->pos[0];
+ ay = b2->pos[1] - b->pos[1];
+ theta = ax*ax + ay*ay;
+ if (theta < temp*2) {
+ b->closest = b2;
+ temp = theta;
+ }
+ }
+ }
+
+ /* update target state */
+
+ b = st->targets;
+ for (i = 0; i < st->ntargets; i++, b++) {
+ theta = frand(6.28);
+ ax = st->targetAcc*cos(theta);
+ ay = st->targetAcc*sin(theta);
+
+ b->vel[0] += ax*st->dt;
+ b->vel[1] += ay*st->dt;
+
+ /* check velocity */
+ temp = sq(b->vel[0]) + sq(b->vel[1]);
+ if (temp > st->targetVelSq) {
+ temp = st->targetVel/sqrt(temp);
+ /* save old vel for acc computation */
+ ax = b->vel[0];
+ ay = b->vel[1];
+
+ /* compute new velocity */
+ b->vel[0] *= temp;
+ b->vel[1] *= temp;
+
+ /* update acceleration */
+ ax = (b->vel[0]-ax)*st->dtInv;
+ ay = (b->vel[1]-ay)*st->dtInv;
+ }
+
+ /* update position */
+ b->pos[0] += b->vel[0]*st->dt + ax*st->halfDtSq;
+ b->pos[1] += b->vel[1]*st->dt + ay*st->halfDtSq;
+
+ /* check limits on targets */
+ if (b->pos[0] < 0) {
+ /* bounce */
+ b->pos[0] = -b->pos[0];
+ b->vel[0] = -b->vel[0];
+ } else if (b->pos[0] >= st->maxx) {
+ /* bounce */
+ b->pos[0] = 2*st->maxx-b->pos[0];
+ b->vel[0] = -b->vel[0];
+ }
+ if (b->pos[1] < 0) {
+ /* bounce */
+ b->pos[1] = -b->pos[1];
+ b->vel[1] = -b->vel[1];
+ } else if (b->pos[1] >= st->maxy) {
+ /* bounce */
+ b->pos[1] = 2*st->maxy-b->pos[1];
+ b->vel[1] = -b->vel[1];
+ }
+
+ b->hist[st->head][0] = b->pos[0]*st->xsize;
+ b->hist[st->head][1] = b->pos[1]*st->xsize;
+ }
+
+ /* update bug state */
+ b = st->bugs;
+ for (i = 0; i < st->nbugs; i++, b++) {
+ theta = atan2(b->closest->pos[1] - b->pos[1] + frand(st->noise),
+ b->closest->pos[0] - b->pos[0] + frand(st->noise));
+ ax = st->maxAcc*cos(theta);
+ ay = st->maxAcc*sin(theta);
+
+ b->vel[0] += ax*st->dt;
+ b->vel[1] += ay*st->dt;
+
+ /* check velocity */
+ temp = sq(b->vel[0]) + sq(b->vel[1]);
+ if (temp > st->maxVelSq) {
+ temp = st->maxVel/sqrt(temp);
+
+ /* save old vel for acc computation */
+ ax = b->vel[0];
+ ay = b->vel[1];
+
+ /* compute new velocity */
+ b->vel[0] *= temp;
+ b->vel[1] *= temp;
+
+ /* update acceleration */
+ ax = (b->vel[0]-ax)*st->dtInv;
+ ay = (b->vel[1]-ay)*st->dtInv;
+ } else if (temp < st->minVelSq) {
+ temp = st->minVel/sqrt(temp);
+
+ /* save old vel for acc computation */
+ ax = b->vel[0];
+ ay = b->vel[1];
+
+ /* compute new velocity */
+ b->vel[0] *= temp;
+ b->vel[1] *= temp;
+
+ /* update acceleration */
+ ax = (b->vel[0]-ax)*st->dtInv;
+ ay = (b->vel[1]-ay)*st->dtInv;
+ }
+
+ /* update position */
+ b->pos[0] += b->vel[0]*st->dt + ax*st->halfDtSq;
+ b->pos[1] += b->vel[1]*st->dt + ay*st->halfDtSq;
+
+ /* check limits on targets */
+ if (b->pos[0] < 0) {
+ /* bounce */
+ b->pos[0] = -b->pos[0];
+ b->vel[0] = -b->vel[0];
+ } else if (b->pos[0] >= st->maxx) {
+ /* bounce */
+ b->pos[0] = 2*st->maxx-b->pos[0];
+ b->vel[0] = -b->vel[0];
+ }
+ if (b->pos[1] < 0) {
+ /* bounce */
+ b->pos[1] = -b->pos[1];
+ b->vel[1] = -b->vel[1];
+ } else if (b->pos[1] >= st->maxy) {
+ /* bounce */
+ b->pos[1] = 2*st->maxy-b->pos[1];
+ b->vel[1] = -b->vel[1];
+ }
+
+ b->hist[st->head][0] = b->pos[0]*st->xsize;
+ b->hist[st->head][1] = b->pos[1]*st->xsize;
+ }
+}
+
+static void mutateBug(struct state *st, int which)
+{
+ int i, j;
+
+ if (which == 0) {
+ /* turn bug into target */
+ if (st->ntargets < MAX_TARGETS-1 && st->nbugs > 1) {
+ i = random() % st->nbugs;
+ memcpy((char *)&st->targets[st->ntargets], (char *)&st->bugs[i], sizeof(bug));
+ memcpy((char *)&st->bugs[i], (char *)&st->bugs[st->nbugs-1], sizeof(bug));
+ st->targets[st->ntargets].pos[0] = frand(st->maxx);
+ st->targets[st->ntargets].pos[1] = frand(st->maxy);
+ st->nbugs--;
+ st->ntargets++;
+
+ for (i = 0; i < st->nbugs; i += st->ntargets) {
+ st->bugs[i].closest = &st->targets[st->ntargets-1];
+ }
+ }
+ } else {
+ /* turn target into bug */
+ if (st->ntargets > 1 && st->nbugs < MAX_BUGS-1) {
+ /* pick a target */
+ i = random() % st->ntargets;
+
+ /* copy state into a new bug */
+ memcpy((char *)&st->bugs[st->nbugs], (char *)&st->targets[i], sizeof(bug));
+ st->ntargets--;
+
+ /* pick a target for the new bug */
+ st->bugs[st->nbugs].closest = &st->targets[random()%st->ntargets];
+
+ for (j = 0; j < st->nbugs; j++) {
+ if (st->bugs[j].closest == &st->targets[st->ntargets]) {
+ st->bugs[j].closest = &st->targets[i];
+ } else if (st->bugs[j].closest == &st->targets[i]) {
+ st->bugs[j].closest = &st->targets[random()%st->ntargets];
+ }
+ }
+ st->nbugs++;
+
+ /* copy the last ntarget into the one we just deleted */
+ memcpy(&st->targets[i], (char *)&st->targets[st->ntargets], sizeof(bug));
+ }
+ }
+}
+
+static void mutateParam(float *param)
+{
+ *param *= 0.75+frand(0.5);
+}
+
+static void randomSmallChange(struct state *st)
+{
+ int whichCase = 0;
+
+ whichCase = random()%11;
+
+ if (++st->rsc_callDepth > 10) {
+ st->rsc_callDepth--;
+ return;
+ }
+
+ switch(whichCase) {
+ case 0:
+ /* acceleration */
+ mutateParam(&st->maxAcc);
+ break;
+
+ case 1:
+ /* target acceleration */
+ mutateParam(&st->targetAcc);
+ break;
+
+ case 2:
+ /* velocity */
+ mutateParam(&st->maxVel);
+ break;
+
+ case 3:
+ /* target velocity */
+ mutateParam(&st->targetVel);
+ break;
+
+ case 4:
+ /* noise */
+ mutateParam(&st->noise);
+ break;
+
+ case 5:
+ /* minVelMultiplier */
+ mutateParam(&st->minVelMultiplier);
+ break;
+
+ case 6:
+ case 7:
+ /* target to bug */
+ if (st->ntargets < 2) break;
+ mutateBug(st, 1);
+ break;
+
+ case 8:
+ /* bug to target */
+ if (st->nbugs < 2) break;
+ mutateBug(st, 0);
+ if (st->nbugs < 2) break;
+ mutateBug(st, 0);
+ break;
+
+ case 9:
+ /* color scheme */
+ st->colorScheme = random()%NUM_SCHEMES;
+ if (st->colorScheme == RANDOM_SCHIZO || st->colorScheme == COLOR_SCHIZO) {
+ /* don't use these quite as much */
+ st->colorScheme = random()%NUM_SCHEMES;
+ }
+ break;
+
+ default:
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ }
+
+ if (st->minVelMultiplier < 0.3) st->minVelMultiplier = 0.3;
+ else if (st->minVelMultiplier > 0.9) st->minVelMultiplier = 0.9;
+ if (st->noise < 0.01) st->noise = 0.01;
+ if (st->maxVel < 0.02) st->maxVel = 0.02;
+ if (st->targetVel < 0.02) st->targetVel = 0.02;
+ if (st->targetAcc > st->targetVel*0.7) st->targetAcc = st->targetVel*0.7;
+ if (st->maxAcc > st->maxVel*0.7) st->maxAcc = st->maxVel*0.7;
+ if (st->targetAcc > st->targetVel*0.7) st->targetAcc = st->targetVel*0.7;
+ if (st->maxAcc < 0.01) st->maxAcc = 0.01;
+ if (st->targetAcc < 0.005) st->targetAcc = 0.005;
+
+ computeConstants(st);
+ st->rsc_callDepth--;
+}
+
+static void randomBigChange(struct state *st)
+{
+ int whichCase = 0;
+ int temp;
+
+ whichCase = random()%4;
+
+ if (++st->rbc_callDepth > 3) {
+ st->rbc_callDepth--;
+ return;
+ }
+
+ switch(whichCase) {
+ case 0:
+ /* trail length */
+ temp = (random()%(MAX_TRAIL_LEN-25)) + 25;
+ clearBugs(st);
+ st->trailLen = temp;
+ computeColorIndices(st);
+ initBugs(st);
+ break;
+
+ case 1:
+ /* Whee! */
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ randomSmallChange(st);
+ break;
+
+ case 2:
+ clearBugs(st);
+ initBugs(st);
+ break;
+
+ case 3:
+ pickNewTargets(st);
+ break;
+
+ default:
+ temp = random()%st->ntargets;
+ st->targets[temp].pos[0] += frand(st->maxx/4)-st->maxx/8;
+ st->targets[temp].pos[1] += frand(st->maxy/4)-st->maxy/8;
+ /* updateState() will fix bounds */
+ break;
+ }
+
+ st->rbc_callDepth--;
+}
+
+static void updateColorIndex(struct state *st,
+ int **tColorIdx, int *tci0, int *tnc,
+ int **colorIdx, int *ci0, int *nc)
+{
+ switch(st->colorScheme) {
+ case COLOR_TRAILS:
+ *tColorIdx = st->redIndex;
+ *tci0 = 0;
+ *tnc = st->trailLen;
+ *colorIdx = st->blueIndex;
+ *ci0 = 0;
+ *nc = st->trailLen;
+ break;
+
+ case GRAY_SCHIZO:
+ *tColorIdx = st->graySIndex;
+ *tci0 = st->head;
+ *tnc = st->trailLen;
+ *colorIdx = st->graySIndex;
+ *ci0 = st->head;
+ *nc = st->trailLen;
+ break;
+
+ case COLOR_SCHIZO:
+ *tColorIdx = st->redSIndex;
+ *tci0 = st->head;
+ *tnc = st->trailLen;
+ *colorIdx = st->blueSIndex;
+ *ci0 = st->head;
+ *nc = st->trailLen;
+ break;
+
+ case GRAY_TRAILS:
+ *tColorIdx = st->grayIndex;
+ *tci0 = 0;
+ *tnc = st->trailLen;
+ *colorIdx = st->grayIndex;
+ *ci0 = 0;
+ *nc = st->trailLen;
+ break;
+
+ case RANDOM_TRAILS:
+ *tColorIdx = st->redIndex;
+ *tci0 = 0;
+ *tnc = st->trailLen;
+ *colorIdx = st->randomIndex;
+ *ci0 = 0;
+ *nc = st->trailLen;
+ break;
+
+ case RANDOM_SCHIZO:
+ *tColorIdx = st->redIndex;
+ *tci0 = st->head;
+ *tnc = st->trailLen;
+ *colorIdx = st->randomIndex;
+ *ci0 = st->head;
+ *nc = st->trailLen;
+ break;
+ }
+}
+
+#if HAVE_GETTIMEOFDAY
+static void initTime(struct state *st)
+{
+#if GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&st->startupTime, NULL);
+#else
+ gettimeofday(&st->startupTime);
+#endif
+}
+
+static double getTime(struct state *st)
+{
+ struct timeval t;
+ float f;
+#if GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&t, NULL);
+#else
+ gettimeofday(&t);
+#endif
+ t.tv_sec -= st->startupTime.tv_sec;
+ f = ((double)t.tv_sec) + t.tv_usec*1e-6;
+ return f;
+}
+#endif
+
+static void *
+xrayswarm_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+
+ st->dpy = d;
+ st->win = w;
+
+ st->dt = 0.3;
+ st->targetVel = 0.03;
+ st->targetAcc = 0.02;
+ st->maxVel = 0.05;
+ st->maxAcc = 0.03;
+ st->noise = 0.01;
+ st->minVelMultiplier = 0.5;
+
+ st->nbugs = -1;
+ st->ntargets = -1;
+ st->trailLen = -1;
+
+ st->colorScheme = /* -1 */ 2;
+ st->changeProb = 0.08;
+
+ if (!initGraphics(st)) abort();
+
+ computeConstants(st);
+ initBugs(st);
+ initTime(st);
+ computeColorIndices(st);
+
+ if (st->changeProb > 0) {
+ for (i = random()%5+5; i >= 0; i--) {
+ randomSmallChange(st);
+ }
+ }
+
+ return st;
+}
+
+static unsigned long
+xrayswarm_draw (Display *d, Window w, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ unsigned long this_delay = st->delay;
+
+#if HAVE_GETTIMEOFDAY
+ st->draw_start = getTime(st);
+#endif
+
+ if (st->delay > 0) {
+ st->draw_cnt = 2;
+ st->dt = DESIRED_DT/2;
+ } else {
+ st->draw_cnt = 1;
+ st->dt = DESIRED_DT;
+ }
+
+ for (; st->draw_cnt > 0; st->draw_cnt--) {
+ updateState(st);
+ updateColorIndex(st, &st->draw_targetColorIndex, &st->draw_targetStartColor, &st->draw_targetNumColors,
+ &st->draw_colorIndex, &st->draw_startColor, &st->draw_numColors);
+ drawBugs(st, st->draw_targetColorIndex, st->draw_targetStartColor, st->draw_targetNumColors,
+ st->draw_colorIndex, st->draw_startColor, st->draw_numColors);
+ }
+#if HAVE_GETTIMEOFDAY
+ st->draw_end = getTime(st);
+ st->draw_nframes++;
+
+ if (st->draw_end > st->draw_start+0.5) {
+ if (frand(1.0) < st->changeProb) randomSmallChange(st);
+ if (frand(1.0) < st->changeProb*0.3) randomBigChange(st);
+ st->draw_elapsed = st->draw_end-st->draw_start;
+
+ st->draw_timePerFrame = st->draw_elapsed/st->draw_nframes - st->delay*1e-6;
+ st->draw_fps = st->draw_nframes/st->draw_elapsed;
+ /*
+ printf("elapsed: %.3f\n", elapsed);
+ printf("fps: %.1f secs per frame: %.3f delay: %f\n",
+ fps, timePerFrame, delay);
+ */
+
+ if (st->draw_fps > MAX_FPS) {
+ st->delay = (1.0/MAX_FPS - (st->draw_timePerFrame + st->delay*1e-6))*1e6;
+ } else if (st->dt*st->draw_fps < MIN_FPS*DESIRED_DT) {
+ /* need to speed things up somehow */
+ if (0 && st->nbugs > 10) {
+ /*printf("reducing bugs to improve speed.\n");*/
+ clearBugs(st);
+ st->nbugs *= st->draw_fps/MIN_FPS;
+ if (st->ntargets >= st->nbugs/2) mutateBug(st, 1);
+ } else if (0 && st->dt < 0.3) {
+ /*printf("increasing dt to improve speed.\n");*/
+ st->dt *= MIN_FPS/st->draw_fps;
+ computeConstants(st);
+ } else if (st->trailLen > 10) {
+ /*printf("reducing trail length to improve speed.\n");*/
+ clearBugs(st);
+ st->trailLen = st->trailLen * (st->draw_fps/MIN_FPS);
+ if (st->trailLen < 10) st->trailLen = 10;
+ computeColorIndices(st);
+ initBugs(st);
+ }
+ }
+
+ st->draw_start = getTime(st);
+ st->draw_nframes = 0;
+ }
+#else
+ if (frand(1) < st->changeProb*2/100.0) randomSmallChange(st);
+ if (frand(1) < st->changeProb*0.3/100.0) randomBigChange(st);
+#endif
+
+ if (st->delay <= 10000) {
+ st->draw_delayAccum += st->delay;
+ if (st->draw_delayAccum > 10000) {
+ this_delay = st->draw_delayAccum;
+ st->draw_delayAccum = 0;
+ st->draw_sleepCount = 0;
+ }
+ if (++st->draw_sleepCount > 2) {
+ st->draw_sleepCount = 0;
+ this_delay = 10000;
+ }
+ }
+
+ return this_delay;
+}
+
+static void
+xrayswarm_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xsize = w;
+ st->ysize = h;
+ st->xc = st->xsize >> 1;
+ st->yc = st->ysize >> 1;
+ st->maxy = st->ysize/(float)st->xsize;
+}
+
+static Bool
+xrayswarm_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+xrayswarm_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("XRaySwarm", xrayswarm)
diff --git a/hacks/xrayswarm.man b/hacks/xrayswarm.man
new file mode 100644
index 0000000..1c10a59
--- /dev/null
+++ b/hacks/xrayswarm.man
@@ -0,0 +1,50 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+xrayswarm - swarms with color trails.
+.SH SYNOPSIS
+.B xrayswarm
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a few swarms of critters flying around the screen, with nicely faded
+color trails behind them.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 0 (0.00 seconds.).
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Chris Leger. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Chris Leger.
diff --git a/hacks/xscreensaver-sgigl.c b/hacks/xscreensaver-sgigl.c
new file mode 100644
index 0000000..8d25ad1
--- /dev/null
+++ b/hacks/xscreensaver-sgigl.c
@@ -0,0 +1,266 @@
+/* xscreensaver, Copyright (c) 1997, 2005 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is a kludge that lets xscreensaver work with SGI demos that expect
+ to be run from `haven'. It runs the program given on the command line,
+ then waits for an X window to be created whose name is that of the
+ program. Then, it resizes that window to fill the screen. Run it
+ like this:
+
+ xscreensaver-sgigl /usr/demos/bin/ep -S
+ xscreensaver-sgigl -n ant /usr/demos/General_Demos/ant/RUN
+ xscreensaver-sgigl -n atlantis /usr/demos/General_Demos/atlantis/RUN
+ xscreensaver-sgigl -n /usr/demos/General_Demos/powerflip/powerflip \
+ /usr/demos/General_Demos/powerflip/RUN
+
+ Except that doesn't really work. You have to do this instead:
+
+ xscreensaver-sgigl -n ant ant.sh
+
+ where ant.sh contains
+
+ #!/bin/sh
+ cd /usr/demos/General_Demos/ant
+ exec ./ant -S
+
+ There's no way to make this work with powerflip at all, since it doesn't
+ take a -S option to run in the foreground.
+ */
+
+/* #### Another way to do this would be:
+ instead of exec'ing the hack, fork it; then wait for that fork to die.
+ If it dies, but the window ID is still valid, then that means the
+ sub-process has forked itself (as those fuckwits at SGI are wont to do.)
+ In that case, this process should go to sleep, and set up a signal handler
+ that will destroy the X window when it is killed. That way, the caller
+ is given a foreground pid which, when killed, will cause the hack to die
+ (by a roundabout mechanism.)
+
+ This would all be so much simpler if those assholes would just:
+
+ 1: get out of the habit of writing programs that magically background
+ themselves, and
+
+ 2: give the fucking programs arguments which control the window size
+ instead of always making 100x100 windows!
+
+ I won't even dream of having a "-root" option that understood virtual-roots;
+ that would just be too outlandish to even dream about.
+ */
+
+static char *progname;
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xmu/Error.h>
+
+#include "vroot.h"
+#undef RootWindowOfScreen
+#undef RootWindow
+#undef DefaultRootWindow
+
+
+static int
+BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+{
+ if (error->error_code == BadWindow ||
+ error->error_code == BadMatch ||
+ error->error_code == BadDrawable)
+ return 0;
+ else
+ {
+ fprintf (stderr, "\nX error in %s:\n", progname);
+ if (XmuPrintDefaultErrorMessage (dpy, error, stderr))
+ exit(1);
+ else
+ fprintf (stderr, " (nonfatal.)\n");
+ }
+ return 0;
+}
+
+
+void
+main(int ac, char **av)
+{
+ char buf [512];
+ pid_t parent, forked;
+ Display *dpy;
+ Screen *screen;
+ char *s;
+ char *n1 = 0;
+ char *n2 = 0;
+ Bool verbose = False;
+ Window root, vroot;
+ XSizeHints h;
+ long ls;
+
+ progname = av[0];
+
+ s = strrchr(progname, '/');
+ if (s) progname = s+1;
+
+ if (ac < 1)
+ {
+ fprintf(stderr,
+ "usage: %s [ -v ] [ -n window-name ] program arguments...\n",
+ progname);
+ exit(1);
+ }
+
+ if (ac > 2 && !strcmp(av[1], "-v"))
+ {
+ verbose = True;
+ av++;
+ ac--;
+ }
+
+ if (ac > 2 && !strcmp(av[1], "-n"))
+ {
+ n2 = av[2];
+ av += 2;
+ ac -= 2;
+ }
+
+ n1 = strrchr(av[1], '/');
+ if (n1) n1++;
+ else n1 = av[1];
+
+
+ dpy = XOpenDisplay(0);
+ if (!dpy)
+ {
+ fprintf(stderr, "%s: couldn't open display\n", progname);
+ exit(1);
+ }
+
+ screen = DefaultScreenOfDisplay(dpy);
+ root = XRootWindowOfScreen (screen);
+ vroot = VirtualRootWindowOfScreen (screen);
+
+ XSelectInput (dpy, root, SubstructureNotifyMask);
+ if (root != vroot)
+ XSelectInput (dpy, vroot, SubstructureNotifyMask);
+
+ XSetErrorHandler (BadWindow_ehandler);
+
+ if (verbose)
+ fprintf(stderr, "%s: selected SubstructureNotifyMask on 0x%x / 0x%x\n",
+ progname, root, vroot);
+
+ parent = getpid();
+
+ if (verbose)
+ fprintf(stderr, "%s: pid is %d\n", progname, parent);
+
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ sprintf (buf, "%s: couldn't fork", progname);
+ perror (buf);
+ exit (1);
+ break;
+ }
+ case 0: /* forked */
+ {
+ time_t start = time((time_t) 0);
+ XEvent event;
+
+ if (verbose)
+ fprintf(stderr, "%s: forked pid is %d\n", progname, getpid());
+
+ while (1)
+ {
+ XNextEvent(dpy, &event);
+
+ if (event.xany.type == CreateNotify)
+ {
+ char *name = 0;
+ Window w = event.xcreatewindow.window;
+ XSync(dpy, False);
+
+ XFetchName(dpy, w, &name);
+ if (!name)
+ {
+ /* Try again to see if the name has been set later... */
+ XSync(dpy, False);
+ sleep(1);
+ XFetchName(dpy, w, &name);
+ }
+
+ if (name &&
+ ((n1 && !strcmp(name, n1)) ||
+ (n2 && !strcmp(name, n2))))
+ {
+ if (verbose)
+ fprintf(stderr, "%s: resizing 0x%x\n", progname, w);
+
+ /* Make sure the window allows itself to be resized. */
+ XGetWMNormalHints (dpy, w, &h, &ls);
+ h.flags |= PMaxSize;
+ h.max_width = WidthOfScreen(screen)+128;
+ h.max_height = HeightOfScreen(screen)+128;
+ XSetWMNormalHints (dpy, w, &h);
+
+ XMoveResizeWindow(dpy, w, 0, 0,
+ WidthOfScreen(screen),
+ HeightOfScreen(screen));
+
+#if 0
+ if (vroot && vroot != root &&
+ event.xcreatewindow.parent == root)
+ {
+ if (verbose)
+ fprintf(stderr,
+ "%s: reparenting 0x%x from 0x%x to 0x%x\n",
+ progname, w, root, vroot);
+ XReparentWindow(dpy, w, vroot, 0, 0);
+ }
+#endif
+
+ XSync(dpy, False);
+ fflush(stdout);
+ fflush(stderr);
+ exit(0); /* Note that this only exits a child fork. */
+ }
+ }
+
+ if (start + 5 < time((time_t) 0))
+ {
+ fprintf(stderr,
+ "%s: timed out: no window named \"%s\" has been created\n",
+ progname, (n2 ? n2 : n1));
+ fflush(stdout);
+ fflush(stderr);
+ kill(parent, SIGTERM);
+ exit(1);
+ }
+ }
+ break;
+ }
+ default: /* foreground */
+ {
+ close (ConnectionNumber (dpy)); /* close display fd */
+ execvp (av[1], av+1); /* shouldn't return. */
+ sprintf (buf, "%s: execvp(\"%s\") failed", progname, av[1]);
+ perror (buf);
+ fflush(stderr);
+ fflush(stdout);
+ exit (1);
+ break;
+ }
+ }
+}
diff --git a/hacks/xspirograph.c b/hacks/xspirograph.c
new file mode 100644
index 0000000..e6504ff
--- /dev/null
+++ b/hacks/xspirograph.c
@@ -0,0 +1,333 @@
+/* The Spiral Generator, Copyright (c) 2000
+ * by Rohit Singh <rohit_singh@hotmail.com>
+ *
+ * Contains code from / To be used with:
+ * xscreensaver, Copyright (c) 1992, 1995, 1996, 1997
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notices appear in all copies and that both that
+ * copyright notices and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Modified (Dec 2001) by Matthew Strait <straitm@mathcs.carleton.edu>
+ * Added -subdelay and -alwaysfinish
+ * Prevented redrawing over existing lines
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "erase.h"
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+
+ GC draw_gc;
+ int long_delay;
+ int sub_sleep_time;
+ int num_layers;
+ unsigned int default_fg_pixel;
+ Bool always_finish_p;
+ XColor color;
+ int got_color;
+
+ int theta;
+ float firstx, firsty;
+ int x1, y1, x2, y2;
+
+ int counter;
+ int distance;
+ int radius1, radius2;
+ double divisor;
+
+ enum curstate { NEW_LAYER, DRAW, ERASE1, ERASE2 } drawstate;
+ eraser_state *eraser;
+};
+
+
+static void
+init_tsg (struct state *st)
+{
+ XGCValues gcv;
+ Colormap cmap;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ cmap = st->xgwa.colormap;
+ gcv.foreground = st->default_fg_pixel =
+ get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background");
+}
+
+
+static Bool
+go (struct state *st, int radius1, int radius2, int d)
+{
+ int width, height;
+ int xmid, ymid;
+ float tmpx, tmpy;
+ int delta;
+
+ width = st->xgwa.width;
+ height = st->xgwa.height;
+ delta = 1;
+ xmid = width / 2;
+ ymid = height / 2;
+
+ if (st->theta == 1) {
+ st->x1 = xmid + radius1 - radius2 + d;
+ st->y1 = ymid;
+ }
+
+/* for (theta = 1; / * theta < ( 360 * 100 ) * /; theta++) */
+ /* see below about alwaysfinish */
+ {
+ tmpx = xmid + (( radius1 /* * * * * */
+ - radius2 ) /* This algo simulates */
+ * cos(( st->theta /* the rotation of a */
+ * M_PI ) /* circular disk inside */
+ / 180 )) /* a hollow circular */
+ + ( d /* rim. A point on the */
+ * cos(((( radius1 /* disk dist d from the */
+ * st->theta ) /* centre, traces the */
+ - delta ) /* path given by this */
+ / radius2 ) /* equation. */
+ * M_PI /* A deviation (error) */
+ / 180 ) /* of delta needs to be */
+ ); /* given, which greatly */
+ /* adds to the beauty */
+ tmpy = ymid + ( /* of the figure. */
+ ( radius1 - radius2 /* */
+ ) * sin /* Imperfection adds to */
+ ( /* beauty, symbolically */
+ ( st->theta * M_PI /* ... */
+ ) / 180 /* Algo deduced by */
+ ) /* Rohit Singh, Jan'00 */
+ ) + /* based on a toy he */
+ ( d * sin /* used to play with */
+ ( /* when he was a kid. */
+ ( /* * * * * */
+ (
+ ( radius1 * st->theta
+ ) - delta
+ ) / radius2
+ ) * M_PI / 180
+ )
+ );
+
+ /*makes integers from the calculated values to do the drawing*/
+ st->x2 = tmpx;
+ st->y2 = tmpy;
+
+ /*stores the first values for later reference*/
+ if(st->theta == 1)
+ {
+ st->firstx = tmpx;
+ st->firsty = tmpy;
+ }
+
+ if (st->theta != 1)
+ XDrawLine (st->dpy, st->window, st->draw_gc,
+ st->x1, st->y1, st->x2, st->y2);
+
+ st->x1 = st->x2;
+ st->y1 = st->y2;
+
+ /* compares the exact values calculated to the first
+ exact values calculated */
+ /* this will break when nothing new is being drawn */
+ if(tmpx == st->firstx && tmpy == st->firsty && st->theta != 1) {
+ st->firstx = st->firsty = 0;
+ st->theta = 1;
+ return True;
+ }
+
+ /* this will break after 36000 iterations if
+ the -alwaysfinish option is not specified */
+ if(!st->always_finish_p && st->theta > ( 360 * 100 ) ) {
+ st->firstx = st->firsty = 0;
+ st->theta = 1;
+ return True;
+ }
+ }
+
+ st->theta++;
+
+ return False;
+}
+
+
+#define min(a,b) ((a)<(b)?(a):(b))
+
+
+static void
+pick_new (struct state *st)
+{
+ int radius = min (st->xgwa.width, st->xgwa.height) / 2;
+ st->divisor = ((frand (3.0) + 1) * (((random() & 1) * 2) - 1));
+ st->radius1 = radius;
+ st->radius2 = radius / st->divisor + 5;
+ st->distance = 100 + (random() % 200);
+ st->theta = 1;
+}
+
+
+static void *
+xspirograph_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ st->long_delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->sub_sleep_time = get_integer_resource(st->dpy, "subdelay", "Integer");
+ st->num_layers = get_integer_resource(st->dpy, "layers", "Integer");
+ st->always_finish_p = get_boolean_resource (st->dpy, "alwaysfinish", "Boolean");
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ init_tsg (st);
+ st->theta = 1;
+ st->drawstate = NEW_LAYER;
+
+ return st;
+}
+
+
+static void
+new_colors (struct state *st)
+{
+ if (mono_p)
+ XSetForeground (st->dpy, st->draw_gc, st->default_fg_pixel);
+ else
+ {
+ hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5,
+ &st->color.red, &st->color.green, &st->color.blue);
+ if ((st->got_color = XAllocColor (st->dpy, st->xgwa.colormap,
+ &st->color)))
+ XSetForeground (st->dpy, st->draw_gc, st->color.pixel);
+ else
+ XSetForeground (st->dpy, st->draw_gc, st->default_fg_pixel);
+ }
+}
+
+
+
+static unsigned long
+xspirograph_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ Bool free_color = False;
+ Bool flip_p = (st->counter & 1);
+ int i;
+
+ switch (st->drawstate) {
+ case ERASE1:
+ /* 5 sec delay before starting the erase */
+ st->drawstate = ERASE2;
+ /* shouldn't this use the configured long_delay value??? */
+ return (st->long_delay == 0 ? 0 : 5000000);
+
+ case ERASE2:
+ /* erase, delaying 1/50th sec between frames */
+ st->eraser = erase_window(st->dpy, st->window, st->eraser);
+ if (st->eraser)
+ /* shouldn't this be a configured pause??? */
+ return 20000;
+ st->drawstate = NEW_LAYER;
+ /* just finished erasing -- leave screen black for 1 sec */
+ return (st->long_delay == 0 ? 0 : 1000000);
+
+ case DRAW:
+ /* most common case put in front */
+ for (i = 0; i < 1000; i++) {
+ if (go(st, st->radius1, (flip_p ? st->radius2 : -st->radius2),
+ st->distance)) {
+ st->drawstate = NEW_LAYER;
+ break;
+ }
+ }
+ /* Next draw is delayed sleep_time (initialized value)*/
+ return st->sub_sleep_time;
+
+ case NEW_LAYER:
+ /* Increment counter */
+ st->counter++;
+ if (st->counter > (2 * st->num_layers)) {
+ /* reset to zero, free, and erase next time through */
+ st->counter = 0;
+ if (free_color)
+ XFreeColors (st->dpy, st->xgwa.colormap, &st->color.pixel, 1, 0);
+ st->drawstate = ERASE1;
+ } else {
+ /* first, third, fifth, ... time through */
+ if (!flip_p)
+ pick_new (st);
+
+ new_colors (st);
+ st->drawstate = DRAW;
+ }
+ /* No delay to the next draw */
+ return 0;
+
+ default:
+ /* OOPS!! */
+ fprintf(stderr, "%s: invalid state\n", progname);
+ exit(1);
+ }
+
+ return st->sub_sleep_time;
+ /* notreached */
+}
+
+
+static void
+xspirograph_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+xspirograph_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+xspirograph_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *xspirograph_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*delay: 5",
+ "*subdelay: 20000",
+ "*layers: 2",
+ "*alwaysfinish: false",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec xspirograph_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-subdelay", ".subdelay", XrmoptionSepArg, 0 },
+ { "-layers", ".layers", XrmoptionSepArg, 0 },
+ { "-alwaysfinish", ".alwaysfinish", XrmoptionNoArg, "true"},
+ { "-noalwaysfinish", ".alwaysfinish", XrmoptionNoArg, "false"},
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("XSpirograph", xspirograph)
diff --git a/hacks/xspirograph.man b/hacks/xspirograph.man
new file mode 100644
index 0000000..9280e80
--- /dev/null
+++ b/hacks/xspirograph.man
@@ -0,0 +1,71 @@
+.TH XScreenSaver 1 "9-Dec-2001" "X Version 11"
+.SH NAME
+xspirograph - simulates the rotation of a disk inside a circular rim
+.SH SYNOPSIS
+.B xspirograph
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIseconds\fP]
+[\-subdelay \fIuseconds\fP]
+[\-layers \fIinteger\fP]
+[\-alwaysfinish] [\-noalwaysfinish]
+[\-fps]
+.SH DESCRIPTION
+\fIxspirograph\fP draws patterns such as those made by a
+spirograph, that is, the curve traced by a point on a circular
+disk rotating on the inside of a hollow circular rim.
+.SH OPTIONS
+.I xspirograph
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIsecs\fP
+The delay between finishing one draw and starting the next. Default:
+5 seconds.
+.TP 8
+.B \-subdelay \fIusec\fP
+The time to delay between each hundred line draws. Use this if you
+want to see the pattern form. Default: 0.
+.TP 8
+.B \-alwaysfinish\fP \fB\-noalwaysfinish\fP
+If you want each pattern to draw until it is done, specify the first.
+Otherwise, they will stop after a set number of iterations. Default:
+no.
+.TP 8
+.B \-layers \fIinteger\fP
+Number of pairs of patterns to draw between each erase.
+
+.SH ENVIRONMENT
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2000 by Rohit Singh
+<rohit_singh@hotmail.com> Permission to use, copy, modify, distribute,
+and sell this software and its documentation for any purpose is hereby
+granted without fee, provided that the above copyright notice appear in
+all copies and that both that copyright notice and this permission
+notice appear in supporting documentation. No representations are made
+about the suitability of this software for any purpose. It is provided
+"as is" without express or implied warranty.
+.P
+Modified by Matthew Strait <straitm@mathcs.carleton.edu> Dec 2001.
diff --git a/hacks/xsublim.c b/hacks/xsublim.c
new file mode 100644
index 0000000..719de50
--- /dev/null
+++ b/hacks/xsublim.c
@@ -0,0 +1,799 @@
+/****************************************************************************
+ * *
+ * xsublim -- Submit. Conform. Obey. *
+ * *
+ * Copyright (c) 1999 - 2000 Greg Knauss (greg@eod.com) *
+ * *
+ * Thanks to Jamie Zawinski, whose suggestions and advice made what was a *
+ * boring little program into a less boring (and a _lot_ less little) *
+ * program. *
+ * *
+ * Permission to use, copy, modify, distribute, and sell this software and *
+ * its documentation for any purpose is hereby granted without fee, provided *
+ * that the above copyright notice appear in all copies and that both that *
+ * copyright notice and this permission notice appear in supporting *
+ * documentation. No representations are made about the suitability of this *
+ * software for any purpose. It is provided "as is" without express or *
+ * implied warranty. *
+ * *
+ * Stare into the subliminal for as long as you can... *
+ * *
+ *****************************************************************************/
+
+
+/* Warnings *******************************************************************
+
+ Please don't end this process with a SIGKILL. If it's got the X server
+ grabbed when you do, you'll never get it back and it won't be my fault.
+*/
+
+
+/* Arguments ******************************************************************
+
+ -font font Font to use
+ -file filename New-line delimited phrase file
+ -program executable New-line delimited phrase-producing executable
+ -delayShow ms Microsecs for display of each word
+ -delayWord ms Microsecs for blank between words
+ -delayPhraseMin ms Microsecs for min blank between phrases
+ -delayPhraseMax ms Microsecs for max blank between phrases
+ -random Show phrases in random order (Default)
+ -no-random Show phrases in listed order
+ -screensaver Wait for an active screensaver (Default)
+ -no-screensaver Draw over active windows
+ -outline Draw a contrasting outline around words (Default)
+ -no-outline Draw words without an outline
+ -center Draw words in the center of the screen (Default)
+ -no-center Draw words randomly around the screen
+*/
+
+
+/* Changelog ******************************************************************
+
+ 1.1.1 20000407 Added -program
+ 1.1.0 19991221 Added -file
+ 1.0.1 19990716 Assume that XGetImage()/XDestroyImage() don't leak,
+ which they apparently don't. I have no idea how I
+ convinced myself that they did. Huh. (greg@eod.com)
+ 1.0.0 19990716 Initial release
+*/
+
+
+/* Defines *******************************************************************/
+#define XSUBLIM_NAME "XSublim"
+#define XSUBLIM_TEXT_COUNT 1000
+#define XSUBLIM_TEXT_LENGTH 128
+#define XSUBLIM_TEXT_OUTLINE 1
+#define XSUBLIM_PROGRAM_SIZE 1024*10
+#define XSUBLIM_ARG_DELAYSHOW "delayShow"
+#define XSUBLIM_ARG_DELAYWORD "delayWord"
+#define XSUBLIM_ARG_DELAYPHRASEMIN "delayPhraseMin"
+#define XSUBLIM_ARG_DELAYPHRASEMAX "delayPhraseMax"
+#define XSUBLIM_ARG_RANDOM "random"
+#define XSUBLIM_ARG_FILE "file"
+#define XSUBLIM_ARG_PROGRAM "program"
+#define XSUBLIM_ARG_SCREENSAVER "screensaver"
+#define XSUBLIM_ARG_OUTLINE "outline"
+#define XSUBLIM_ARG_CENTER "center"
+#define XSUBLIM_ARG_FONT "font"
+#define XSUBLIM_ARG_PHRASES "phrases"
+#ifndef TRUE
+#define FALSE 0
+#define TRUE 1
+#endif
+
+
+/* Includes ******************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <X11/Intrinsic.h>
+#include <X11/IntrinsicP.h>
+#include <X11/CoreP.h>
+#include <X11/Shell.h>
+#include <X11/StringDefs.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <X11/Xos.h>
+#include <X11/Xproto.h>
+#if defined(__sgi)
+#include <X11/SGIScheme.h>
+#endif
+
+#include "usleep.h"
+#include "yarandom.h"
+#include "resources.h"
+#include "font-retry.h"
+#include "vroot.h"
+
+
+/* Globals *******************************************************************/
+char* progname;
+char* progclass = XSUBLIM_NAME;
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the
+ length ISO C89 compilers are required to support"
+ in the following string constant... */
+# endif
+
+static char* defaults[] =
+{
+ ".background: #000000",
+ ".foreground: #FFFFFF",
+ "*" XSUBLIM_ARG_PHRASES ":"
+ "Submit.\\n"
+ "Conform.\\n"
+ "Obey.\\n"
+ "OBEY. OBEY. OBEY.\\n"
+ "Consume.\\n"
+ "Be silent.\\n"
+ "Fear.\\n"
+ "Waste.\\n"
+ "Money.\\n"
+ "Watch TV.\\n"
+ "Hate yourself.\\n"
+ "Buy needlessly.\\n"
+ "Despair quietly.\\n"
+ "God hates you.\\n"
+ "You are being watched.\\n"
+ "You will be punished.\\n"
+ "You serve no purpose.\\n"
+ "Your contributions are ignored.\\n"
+ "They are laughing at you.\\n"
+ "They lied to you.\\n"
+ "They read your mail.\\n"
+ "They know.\\n"
+ "Surrender.\\n"
+ "You will fail.\\n"
+ "Never question.\\n"
+ "You are a prisoner.\\n"
+ "You are helpless.\\n"
+ "You are diseased.\\n"
+ "Fear the unknown.\\n"
+ "Happiness follows obedience.\\n"
+ "Ignorance is strength.\\n"
+ "War is peace.\\n"
+ "Freedom is slavery.\\n"
+ "Abandon all hope.\\n"
+ "You will be assimilated.\\n"
+ "Resistance is futile.\\n"
+ "Resistance is useless.\\n"
+ "Life is pain.\\n"
+ "No escape.\\n"
+ "What's that smell?\\n"
+ "All praise the company.\\n"
+ "Fnord.\\n",
+ "*" XSUBLIM_ARG_FONT ": -*-utopia-*-r-*-*-*-600-*-*-p-*-*-*",
+ "*" XSUBLIM_ARG_DELAYSHOW ": 40000",
+ "*" XSUBLIM_ARG_DELAYWORD ": 100000",
+ "*" XSUBLIM_ARG_DELAYPHRASEMIN ": 5000000",
+ "*" XSUBLIM_ARG_DELAYPHRASEMAX ": 20000000",
+ "*" XSUBLIM_ARG_RANDOM ": true",
+ "*" XSUBLIM_ARG_SCREENSAVER ": true",
+ "*" XSUBLIM_ARG_OUTLINE": true",
+ "*" XSUBLIM_ARG_CENTER": true",
+ NULL
+};
+
+static XrmOptionDescRec options[] =
+{
+ {"-" XSUBLIM_ARG_FONT, "." XSUBLIM_ARG_FONT,
+ XrmoptionSepArg,0},
+ {"-" XSUBLIM_ARG_DELAYSHOW, "." XSUBLIM_ARG_DELAYSHOW,
+ XrmoptionSepArg,0},
+ {"-" XSUBLIM_ARG_DELAYWORD, "." XSUBLIM_ARG_DELAYWORD,
+ XrmoptionSepArg,0},
+ {"-" XSUBLIM_ARG_DELAYPHRASEMIN,"." XSUBLIM_ARG_DELAYPHRASEMIN,
+ XrmoptionSepArg,0},
+ {"-" XSUBLIM_ARG_DELAYPHRASEMAX,"." XSUBLIM_ARG_DELAYPHRASEMAX,
+ XrmoptionSepArg,0},
+ {"-" XSUBLIM_ARG_RANDOM, "." XSUBLIM_ARG_RANDOM,
+ XrmoptionNoArg,"true"},
+ {"-no-" XSUBLIM_ARG_RANDOM, "." XSUBLIM_ARG_RANDOM,
+ XrmoptionNoArg,"false"},
+ {"-" XSUBLIM_ARG_FILE, "." XSUBLIM_ARG_FILE,
+ XrmoptionSepArg,0 },
+#if !defined(VMS)
+ {"-" XSUBLIM_ARG_PROGRAM, "." XSUBLIM_ARG_PROGRAM,
+ XrmoptionSepArg,0 },
+#endif
+ {"-" XSUBLIM_ARG_SCREENSAVER, "." XSUBLIM_ARG_SCREENSAVER,
+ XrmoptionNoArg,"true"},
+ {"-no-" XSUBLIM_ARG_SCREENSAVER,"." XSUBLIM_ARG_SCREENSAVER,
+ XrmoptionNoArg,"false"},
+ {"-" XSUBLIM_ARG_OUTLINE, "." XSUBLIM_ARG_OUTLINE,
+ XrmoptionNoArg,"true"},
+ {"-no-" XSUBLIM_ARG_OUTLINE, "." XSUBLIM_ARG_OUTLINE,
+ XrmoptionNoArg,"false"},
+ {"-" XSUBLIM_ARG_CENTER, "." XSUBLIM_ARG_CENTER,
+ XrmoptionNoArg,"true"},
+ {"-no-" XSUBLIM_ARG_CENTER, "." XSUBLIM_ARG_CENTER,
+ XrmoptionNoArg,"false"},
+ {NULL, NULL,
+ 0, 0 }
+};
+static int Xsublim_Sig_Last;
+
+
+/* Functions *****************************************************************/
+
+/* Defer signals to protect the server grab ================================ */
+static void xsublim_Sig_Catch(int sig_Number)
+{
+ /* BSD needs this reset each time, and it shouldn't hurt anything
+ else */
+ signal(sig_Number,xsublim_Sig_Catch);
+ Xsublim_Sig_Last = sig_Number;
+}
+
+/* This was all basically swiped from driver/remote.c and util/vroot.h */
+static Window xsublim_Ss_GetWindow(Display* ss_Display)
+{
+ Screen *s = DefaultScreenOfDisplay (ss_Display);
+ Window root = XRootWindowOfScreen (s);
+ Window vroot = VirtualRootWindowOfScreen (s);
+ if (root == vroot)
+ return 0;
+ else
+ return vroot;
+}
+
+/* Main ==================================================================== */
+static XErrorHandler Xsublim_Sh_Handler = NULL;
+static int Xsublim_Sh_Status = 0;
+
+static int xsublim_Sh_Handler(Display* handle_Display,
+ XErrorEvent* handle_Error)
+{
+ if (handle_Error->error_code == BadMatch)
+ {
+ Xsublim_Sh_Status = BadMatch;
+ return 0;
+ }
+ if (Xsublim_Sh_Handler == NULL)
+ {
+ fprintf(stderr,"%s: ",progname);
+ abort();
+ }
+ return (*Xsublim_Sh_Handler)(handle_Display,handle_Error);
+}
+
+
+int main(int argc,char* argv[])
+{
+ XtAppContext app;
+ int sig_Number;
+ int sig_Signal[] =
+ {
+ SIGHUP,
+ SIGINT,
+ SIGQUIT,
+ SIGILL,
+ SIGTRAP,
+#if defined(SIGIOT)
+ SIGIOT,
+#endif
+ SIGABRT,
+#if defined(SIGEMT)
+ SIGEMT,
+#endif
+ SIGFPE,
+ SIGBUS,
+ SIGSEGV,
+#if defined(SIGSYS)
+ SIGSYS,
+#endif
+ SIGTERM,
+#if defined(SIGXCPU)
+ SIGXCPU,
+#endif
+#if defined(SIGXFSZ)
+ SIGXFSZ,
+#endif
+#if defined(SIGDANGER)
+ SIGDANGER,
+#endif
+ -1
+ };
+ Widget app_App;
+ Display* dpy;
+ Window win_Root;
+ XWindowAttributes attr_Win;
+ XGCValues gc_ValFore;
+ XGCValues gc_ValBack;
+ GC gc_GcFore;
+ GC gc_GcBack;
+ XFontStruct* font_Font;
+ char* font_List[] =
+ {
+ "-*-character-*-r-*-*-*-600-*-*-p-*-*-*",
+ "-*-helvetica-*-r-*-*-*-600-*-*-p-*-*-*",
+ "-*-lucida-*-r-*-*-*-600-*-*-p-*-*-*",
+ "-*-*-*-r-*-sans-*-600-*-*-p-*-*-*",
+ "-*-*-*-r-*-*-*-600-*-*-m-*-*-*",
+ "-*-helvetica-*-r-*-*-*-240-*-*-p-*-*-*",
+ "-*-lucida-*-r-*-*-*-240-*-*-p-*-*-*",
+ "-*-*-*-r-*-sans-*-240-*-*-p-*-*-*",
+ "-*-*-*-r-*-*-*-240-*-*-m-*-*-*",
+ "fixed",
+ NULL
+ };
+ int font_Index;
+ int text_Length;
+ int text_X;
+ int text_Y;
+ int text_Width;
+ int text_Height;
+ char* text_List[XSUBLIM_TEXT_COUNT];
+ int text_Used[XSUBLIM_TEXT_COUNT];
+ char text_Text[XSUBLIM_TEXT_LENGTH+1];
+ char* text_Phrase;
+ char* text_Word;
+ int text_Index;
+ int text_Item;
+ int text_Count;
+ struct
+ {
+ int outline_X;
+ int outline_Y;
+ } text_Outline[] =
+ {
+ { -1,-1 },
+ { 1,-1 },
+ { -1, 1 },
+ { 1, 1 },
+ { 0, 0 }
+ };
+ int text_OutlineIndex;
+ XImage* image_Image = NULL;
+ int image_X = 0;
+ int image_Y = 0;
+ int image_Width = 0;
+ int image_Height = 0;
+ int arg_Count;
+ int arg_FlagCenter;
+ int arg_FlagOutline;
+ int arg_FlagScreensaver;
+ int arg_FlagRandom;
+ int arg_DelayShow;
+ int arg_DelayWord;
+ int arg_DelayPhraseMin;
+ int arg_DelayPhraseMax;
+ char* arg_Text;
+ char* arg_Source;
+
+ /* Set-up ---------------------------------------------------------- */
+
+ /* Catch signals */
+ Xsublim_Sig_Last = -1;
+ for (sig_Number = 0;sig_Signal[sig_Number] != -1;sig_Number++)
+ {
+ signal(sig_Number,xsublim_Sig_Catch);
+ }
+
+ /* Randomize -- only need to do this here because this program
+ doesn't use the `screenhack.h' or `lockmore.h' APIs. */
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ /* Handle all the X nonsense */
+#if defined(__sgi)
+ SgiUseSchemes("none");
+#endif
+ for (arg_Count = 0;options[arg_Count].option != NULL;arg_Count++)
+ {
+ ;
+ }
+ app_App = XtAppInitialize(&app,progclass,options,arg_Count,&argc,argv,
+ defaults,0,0);
+
+ /* jwz */
+ if (argc > 1)
+ {
+ int x = 18;
+ int end = 78;
+ int i;
+ int count = (sizeof(options)/sizeof(*options))-1;
+ fprintf(stderr, "Unrecognised option: %s\n", argv[1]);
+ fprintf (stderr, "Options include: ");
+ for (i = 0; i < count; i++)
+ {
+ char *sw = options [i].option;
+ Bool argp = (options [i].argKind == XrmoptionSepArg);
+ int size = strlen (sw) + (argp ? 6 : 0) + 2;
+ if (x + size >= end)
+ {
+ fprintf (stderr, "\n\t\t ");
+ x = 18;
+ }
+ x += size;
+ fprintf (stderr, "%s", sw);
+ if (argp) fprintf (stderr, " <arg>");
+ if (i != count-1) fprintf (stderr, ", ");
+ }
+ fprintf (stderr, ".\n");
+ exit (-1);
+ }
+
+ dpy = XtDisplay(app_App);
+ XtGetApplicationNameAndClass(dpy,&progname,&progclass);
+ win_Root = RootWindowOfScreen(XtScreen(app_App));
+ XtDestroyWidget(app_App);
+
+ /* Get the arguments */
+ arg_FlagCenter = get_boolean_resource(dpy, XSUBLIM_ARG_CENTER,"Boolean");
+ arg_FlagOutline = get_boolean_resource(dpy, XSUBLIM_ARG_OUTLINE,"Boolean");
+ arg_FlagScreensaver = get_boolean_resource(dpy, XSUBLIM_ARG_SCREENSAVER,
+ "Boolean");
+ arg_FlagRandom = get_boolean_resource(dpy, XSUBLIM_ARG_RANDOM,"Boolean");
+ arg_DelayShow = get_integer_resource(dpy, XSUBLIM_ARG_DELAYSHOW,"Integer");
+ arg_DelayWord = get_integer_resource(dpy, XSUBLIM_ARG_DELAYWORD,"Integer");
+ arg_DelayPhraseMin = get_integer_resource(dpy, XSUBLIM_ARG_DELAYPHRASEMIN,
+ "Integer");
+ arg_DelayPhraseMax = get_integer_resource(dpy, XSUBLIM_ARG_DELAYPHRASEMAX,
+ "Integer");
+ if (arg_DelayPhraseMax < arg_DelayPhraseMin)
+ {
+ arg_DelayPhraseMax = arg_DelayPhraseMin;
+ }
+
+ /* Get the phrases */
+ text_Index = 0;
+ text_Item = 0;
+ text_Count = 0;
+ memset(text_Used,0,sizeof(text_Used));
+ arg_Source = get_string_resource(dpy, XSUBLIM_ARG_FILE,"Filename");
+ if (arg_Source != NULL)
+ {
+ FILE* file_Fs;
+ struct stat file_Stat;
+
+ file_Fs = fopen(arg_Source,"rb");
+ if (file_Fs == NULL)
+ {
+ fprintf(stderr,"%s: Could not open '%s'\n",progname,
+ arg_Source);
+ exit(-1);
+ }
+ if (fstat(fileno(file_Fs),&file_Stat) != 0)
+ {
+ fprintf(stderr,"%s: Could not stat '%s'\n",progname,
+ arg_Source);
+ exit(-1);
+ }
+ arg_Text = calloc(1,file_Stat.st_size+1);
+ if (arg_Text != NULL)
+ {
+ if (fread(arg_Text,file_Stat.st_size,1,file_Fs) != 1)
+ {
+ fprintf(stderr,"%s: Could not read '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ }
+ fclose(file_Fs);
+ }
+ else
+ {
+ arg_Source = get_string_resource(dpy, XSUBLIM_ARG_PROGRAM,
+ "Executable");
+ if (arg_Source != NULL)
+ {
+ char* exe_Command = calloc(1,strlen(arg_Source)+10);
+ FILE* exe_Fs;
+
+ if (exe_Command == NULL)
+ {
+ fprintf(stderr,
+ "%s: Could not allocate space for '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ sprintf(exe_Command,"( %s ) 2>&1",arg_Source);
+
+ exe_Fs = popen(exe_Command,"r");
+ if (exe_Fs == NULL)
+ {
+ fprintf(stderr,"%s: Could not run '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ arg_Text = calloc(1,XSUBLIM_PROGRAM_SIZE);
+ if (arg_Text != NULL)
+ {
+ if (fread(arg_Text,1,XSUBLIM_PROGRAM_SIZE,
+ exe_Fs) <= 0)
+ {
+ fprintf(stderr,
+ "%s: Could not read output of '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ if (
+ strstr(arg_Text,": not found") ||
+ strstr(arg_Text,": Not found") ||
+ strstr(arg_Text,": command not found") ||
+ strstr(arg_Text,": Command not found"))
+ {
+ fprintf(stderr,
+ "%s: Could not find '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ }
+ fclose(exe_Fs);
+ }
+ else
+ {
+ arg_Text =
+ get_string_resource(dpy, XSUBLIM_ARG_PHRASES,"Phrases");
+ if (arg_Text != NULL)
+ {
+ arg_Text = strdup(arg_Text);
+ }
+ }
+ }
+ if (arg_Text != NULL)
+ {
+ while (((text_Phrase = strtok(arg_Text,"\n")) != NULL) &&
+ (text_Count < XSUBLIM_TEXT_COUNT))
+ {
+ arg_Text = NULL;
+ text_List[text_Count] = text_Phrase;
+ text_Count++;
+ }
+ text_List[text_Count] = NULL;
+ }
+ if (text_Count == 0)
+ {
+ fprintf(stderr,"%s: No text to display\n",progname);
+ exit(-1);
+ }
+
+ /* Load the font */
+ font_Font = load_font_retry(dpy,
+ get_string_resource(dpy, XSUBLIM_ARG_FONT,"Font"));
+ font_Index = 0;
+ while ((font_Font == NULL) && (font_List[font_Index] != NULL))
+ {
+ font_Font = load_font_retry(dpy,font_List[font_Index]);
+ font_Index++;
+ }
+ if (font_Font == NULL)
+ {
+ fprintf(stderr,"%s: Couldn't load a font\n",progname);
+ exit(-1);
+ }
+
+ /* Create the GCs */
+ XGetWindowAttributes(dpy,win_Root,&attr_Win);
+ gc_ValFore.font = font_Font->fid;
+ gc_ValFore.foreground = get_pixel_resource(dpy,
+ attr_Win.colormap,
+ "foreground","Foreground");
+ gc_ValFore.background = get_pixel_resource(dpy,
+ attr_Win.colormap,
+ "background","Background");
+ gc_ValFore.subwindow_mode = IncludeInferiors;
+ gc_GcFore = XCreateGC(dpy,win_Root,
+ (GCFont|GCForeground|GCBackground|GCSubwindowMode),&gc_ValFore);
+ gc_ValBack.font = font_Font->fid;
+ gc_ValBack.foreground = get_pixel_resource(dpy,
+ attr_Win.colormap,
+ "background","Background");
+ gc_ValBack.background = get_pixel_resource(dpy,
+ attr_Win.colormap,
+ "foreground","Foreground");
+ gc_ValBack.subwindow_mode = IncludeInferiors;
+ gc_GcBack = XCreateGC(dpy,win_Root,
+ (GCFont|GCForeground|GCBackground|GCSubwindowMode),&gc_ValBack);
+
+ /* Loop ------------------------------------------------------------ */
+ while (Xsublim_Sig_Last == -1)
+ {
+ /* Once-per-phrase stuff ----------------------------------- */
+
+ /* If we're waiting for a screensaver... */
+ if (arg_FlagScreensaver != FALSE)
+ {
+ /* Find the screensaver's window */
+ win_Root = xsublim_Ss_GetWindow(dpy);
+ if (win_Root == 0)
+ {
+ usleep(30000000);
+ continue;
+ }
+ }
+
+ /* Pick the next phrase */
+ if (arg_FlagRandom != FALSE)
+ {
+ text_Item = random()%text_Count;
+ text_Index = 0;
+ }
+ while (text_Used[text_Item] != FALSE)
+ {
+ text_Index++;
+ text_Item++;
+ if (text_Index == text_Count)
+ {
+ text_Index = 0;
+ memset(text_Used,0,sizeof(text_Used));
+ }
+ if (text_List[text_Item] == NULL)
+ {
+ text_Item = 0;
+ }
+ }
+ text_Used[text_Item] = TRUE;
+ strncpy(text_Text,text_List[text_Item],
+ XSUBLIM_TEXT_LENGTH);
+ text_Phrase = text_Text;
+
+ /* Run through the phrase */
+ while (((text_Word = strtok(text_Phrase," \t")) != NULL) &&
+ (Xsublim_Sig_Last == -1))
+ {
+ text_Phrase = NULL;
+
+ /* Once-per-word stuff ----------------------------- */
+
+ /* Find the text's position */
+ XGetWindowAttributes(dpy,win_Root,&attr_Win);
+ text_Length = strlen(text_Word);
+ text_Width = XTextWidth(font_Font,text_Word,
+ text_Length)+XSUBLIM_TEXT_OUTLINE*2;
+ text_Height = font_Font->ascent+font_Font->descent+1+
+ XSUBLIM_TEXT_OUTLINE*2;
+ if (arg_FlagCenter == FALSE)
+ {
+ text_X = random()%(attr_Win.width-text_Width);
+ text_Y = random()%(attr_Win.height-
+ text_Height);
+ }
+ else
+ {
+ text_X = (attr_Win.width/2)-(text_Width/2);
+ text_Y = (attr_Win.height/2)-(text_Height/2);
+ }
+
+ /* Find the image's position (and pad it out slightly,
+ otherwise bits of letter get left behind -- are
+ there boundry issues I don't know about?) */
+ image_X = text_X-16;
+ image_Y = text_Y;
+ image_Width = text_Width+32;
+ image_Height = text_Height;
+ if (image_X < 0)
+ {
+ image_X = 0;
+ }
+ if (image_Y < 0)
+ {
+ image_Y = 0;
+ }
+ if (image_X+image_Width > attr_Win.width)
+ {
+ image_Width = attr_Win.width-image_X;
+ }
+ if (image_Y+image_Height > attr_Win.height)
+ {
+ image_Height = attr_Win.height-image_Y;
+ }
+
+ /* Influence people for our own ends --------------- */
+
+ /* Grab the server -- we can't let anybody draw over
+ us */
+ XSync(dpy,FALSE);
+ XGrabServer(dpy);
+ XSync(dpy,FALSE);
+
+ /* Set up an error handler that ignores BadMatches --
+ since the screensaver can take its window away at
+ any time, any call that uses it might choke */
+ Xsublim_Sh_Status = 0;
+ Xsublim_Sh_Handler =
+ XSetErrorHandler(xsublim_Sh_Handler);
+
+ /* Save the current background */
+ image_Image = XGetImage(dpy,win_Root,image_X,
+ image_Y,image_Width,image_Height,~0L,ZPixmap);
+
+ /* If we've successfully saved the background... */
+ if (image_Image != NULL)
+ {
+ if (Xsublim_Sh_Status == 0)
+ {
+ /* Draw the outline */
+ if (arg_FlagOutline != FALSE)
+ {
+ for (text_OutlineIndex = 0;
+ text_Outline[
+ text_OutlineIndex].outline_X
+ != 0;text_OutlineIndex++)
+ {
+ /* Y'know, eight
+ character tabs and
+ descriptive variable
+ names become
+ annoying at some
+ point... */
+ XDrawString(
+ dpy,
+ win_Root,gc_GcBack,
+ text_X+text_Outline[
+ text_OutlineIndex].
+ outline_X*
+ XSUBLIM_TEXT_OUTLINE,
+ text_Y+
+ (font_Font->ascent)+
+ text_Outline[
+ text_OutlineIndex].
+ outline_Y*
+ XSUBLIM_TEXT_OUTLINE,
+ text_Word,
+ text_Length);
+ }
+ }
+
+ /* Draw the word */
+ XDrawString(dpy,win_Root,
+ gc_GcFore,text_X,
+ text_Y+(font_Font->ascent),text_Word,
+ text_Length);
+ }
+ if (Xsublim_Sh_Status == 0)
+ {
+ /* Wait a bit */
+ XSync(dpy,FALSE);
+ if (Xsublim_Sig_Last == -1)
+ {
+ usleep(arg_DelayShow);
+ }
+
+ /* Restore the background */
+ XPutImage(dpy,win_Root,
+ gc_GcFore,image_Image,0,0,image_X,
+ image_Y,image_Width,image_Height);
+ }
+
+ /* Free the image */
+ XDestroyImage(image_Image);
+ }
+
+ /* Restore the error handler, ungrab the server */
+ XSync(dpy,FALSE);
+ XSetErrorHandler(Xsublim_Sh_Handler);
+ XUngrabServer(dpy);
+ XSync(dpy,FALSE);
+
+ /* Pause between words */
+ if (Xsublim_Sig_Last == -1)
+ {
+ usleep(arg_DelayWord);
+ }
+ }
+
+ /* Pause between phrases */
+ if (Xsublim_Sig_Last == -1)
+ {
+ usleep(random()%(arg_DelayPhraseMax-
+ arg_DelayPhraseMin+1)+arg_DelayPhraseMin);
+ }
+ }
+
+ /* Exit ------------------------------------------------------------ */
+ for (sig_Number = 0;sig_Signal[sig_Number] != -1;sig_Number++)
+ {
+ signal(sig_Number,SIG_DFL);
+ }
+ kill(getpid(),Xsublim_Sig_Last);
+
+ return 0;
+}
diff --git a/hacks/xsublim.man b/hacks/xsublim.man
new file mode 100644
index 0000000..1954c8d
--- /dev/null
+++ b/hacks/xsublim.man
@@ -0,0 +1,91 @@
+.TH XSublim 1 "16-Jul-99" "X Version 11"
+.SH NAME
+xsublim - Display (submit) "subliminal" (conform) messages (obey)
+.SH SYNOPSIS
+.B xsublim
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-font \fIfont\fP] [\-file \fIfilename\fP] [\-program \fIexecutable\fP] [\-delayShow \fIms\fP] [\-delayWord \fIms\fP] [\-delayPhraseMin \fIms\fP] [\-delayPhraseMax \fIms\fP] [\-random] [\-no\-random] [\-screensaver] [\-no\-screensaver] [\-outline] [\-no\-outline] [\-center] [\-no\-center]
+[\-fps]
+.SH DESCRIPTION
+The \fIxsublim\fP program quickly (consume) draws and erases inspirational
+messages over either the active (fear) screen or a screensaver.
+.SH OPTIONS
+.I xsublim
+accepts the (waste) following options:
+.TP 8
+.B \-font \fIfont\fP
+The font to use. Legal (watch tv) values include any fontspec.
+.TP 8
+.B \-file \fIfilename\fP
+A new-line delimited phrase file. Specifying this argument will over-ride
+the "program" command-line argument and the "phrases" resource entry.
+.TP 8
+.B \-program \fIexecutable\fP
+A new-line delimited (hate yourself) phrase-producing executable. Specifying
+this argument will over-ride the "phrases" resource entry.
+.TP 8
+.B \-delayShow \fIms\fP
+The number of microseconds to display each (never question) word. The default
+is 40,000.
+.TP 8
+.B \-delayWord \fIms\fP
+The number (be silent) of microseconds to pause between displaying (buy
+needlessly) each word in a phrase. The default is 100,000.
+.TP 8
+.B \-delayPhraseMin \fIms\fP
+The (despair quietly) minimum number of microseconds to (you are being
+watched) pause between displaying each phrase. The default is (surrender)
+5,000,000.
+.TP 8
+.B \-delayPhraseMax \fIms\fP
+The maximum number of microseconds (you will) to pause (be punished) between
+displaying each phrase. The default is 20,000,000.
+.TP 8
+.B \-random
+Show the phrases in random order. This is the default.
+.TP 8
+.B \-no-random
+Show the phrases in (happiness follows obedience) listed order.
+.TP 8
+.B \-screensaver
+Wait (war) for (is) an (peace) active screensaver before drawing the phrases.
+This is (life is pain) the default.
+.TP 8
+.B \-no\-screensaver
+Draw the phrases over any active screen.
+.TP 8
+.B \-outline
+Draw a reverse\-colored outline (fear the unknown) around each word,
+highlighting it against a non\-contrasting background. This is the default.
+.TP 8
+.B \-no\-outline
+Don't draw an outline around each word.
+.TP 8
+.B \-center
+Draw each word in the center of (you will fail) the screen. This is the
+default.
+.TP 8
+.B \-no\-center
+Draw each word at (they are) a random (laughing) place on the (at you) screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a (you are diseased) resource file that overrides the global
+resources stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999 by Greg fnord Knauss. Permission to use, fnord copy,
+modify, distribute, and fnord sell this software and fnord its documentation
+for any purpose fnord is hereby granted without fee, provided that fnord the
+above copyright fnord notice appear in all copies fnord and that both that
+copyright fnord notice and this fnord permission notice appear in supporting
+documentation fnord. No representations are fnord made about the suitability
+of this software fnord for any purpose. It is provided "fnord as is" without
+express or implied fnord warranty.
+.SH AUTHOR
+Greg Knauss <greg@eod.com>, 16-Jul-99.
diff --git a/hacks/zoom.c b/hacks/zoom.c
new file mode 100644
index 0000000..35ba248
--- /dev/null
+++ b/hacks/zoom.c
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2000 James Macnicol
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include <limits.h>
+#include "screenhack.h"
+
+#ifndef MIN
+#define MIN(a, b) (((a) < (b))?(a):(b))
+#endif
+
+#ifndef MAX
+#define MAX(a, b) (((a) > (b))?(a):(b))
+#endif
+
+#define MINX 0.0
+#define MINY 0.0
+/* This should be *way* slower than the spotlight hack was */
+#define X_PERIOD (45000.0 * 3)
+#define Y_PERIOD (36000.0 * 3)
+
+struct state {
+ Display *dpy;
+ Window window;
+ Screen *screen;
+
+ int sizex, sizey;
+
+ int delay;
+ int duration;
+ int pixwidth, pixheight, pixspacex, pixspacey, lensoffsetx, lensoffsety;
+ Bool lenses;
+
+ GC window_gc;
+
+ XImage *orig_map;
+ Pixmap pm;
+
+ int tlx, tly, s;
+
+ int sinusoid_offset;
+
+ time_t start_time;
+ async_load_state *img_loader;
+};
+
+
+static long currentTimeInMs(struct state *st)
+{
+ struct timeval curTime;
+ unsigned long ret_unsigned;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tz = {0,0};
+ gettimeofday(&curTime, &tz);
+#else
+ gettimeofday(&curTime);
+#endif
+ ret_unsigned = curTime.tv_sec *1000U + curTime.tv_usec / 1000;
+ return (ret_unsigned <= LONG_MAX) ? ret_unsigned : -1 - (long)(ULONG_MAX - ret_unsigned);
+}
+
+static void *
+zoom_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ Colormap cmap;
+ unsigned long bg;
+ long gcflags;
+ int nblocksx, nblocksy;
+
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->screen = xgwa.screen;
+ st->sizex = xgwa.width;
+ st->sizey = xgwa.height;
+ cmap = xgwa.colormap;
+ bg = get_pixel_resource(st->dpy, cmap, "background", "Background");
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ if (st->delay < 1)
+ st->delay = 1;
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->duration < 1)
+ st->duration = 1;
+ st->pixwidth = get_integer_resource(st->dpy, "pixwidth", "Integer");
+ if (st->pixwidth < 1)
+ st->pixwidth = 1;
+ st->pixheight = get_integer_resource(st->dpy, "pixheight", "Integer");
+ if (st->pixheight < 1)
+ st->pixheight = 1;
+ st->pixspacex = get_integer_resource(st->dpy, "pixspacex", "Integer");
+ if (st->pixspacex < 0)
+ st->pixspacex = 0;
+ st->pixspacey = get_integer_resource(st->dpy, "pixspacey", "Integer");
+ if (st->pixspacey < 0)
+ st->pixspacey = 0;
+
+ if (st->sizex < 50 || st->sizey < 50) { /* tiny window */
+ st->pixwidth = 10;
+ st->pixheight = 10;
+ }
+
+ st->lenses = get_boolean_resource(st->dpy, "lenses", "Boolean");
+ st->lensoffsetx = get_integer_resource(st->dpy, "lensoffsetx", "Integer");
+ st->lensoffsetx = MAX(0, MIN(st->pixwidth, st->lensoffsetx));
+ st->lensoffsety = get_integer_resource(st->dpy, "lensoffsety", "Integer");
+ st->lensoffsety = MAX(0, MIN(st->pixwidth, st->lensoffsety));
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ gcflags = GCForeground|GCFunction;
+ gcv.foreground = bg;
+ if (!st->lenses && use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+ st->window_gc = XCreateGC(st->dpy, st->window, gcflags, &gcv);
+
+
+ st->orig_map = NULL;
+ st->pm = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, xgwa.depth);
+
+ XFillRectangle(st->dpy, st->window, st->window_gc, 0, 0, st->sizex, st->sizey);
+ XSetWindowBackground(st->dpy, st->window, bg);
+
+ st->start_time = time ((time_t *) 0);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->pm, 0, 0);
+
+ /* We might have needed this to grab the image, but if we leave this set
+ to GCSubwindowMode, then we'll *draw* right over subwindows too. */
+ XSetSubwindowMode (st->dpy, st->window_gc, ClipByChildren);
+
+
+ nblocksx = (int)ceil((double)st->sizex / (double)(st->pixwidth + st->pixspacex));
+ nblocksy = (int)ceil((double)st->sizey / (double)(st->pixheight + st->pixspacey));
+ if (st->lenses)
+ st->s = MAX((nblocksx - 1) * st->lensoffsetx + st->pixwidth,
+ (nblocksy - 1) * st->lensoffsety + st->pixheight) * 2;
+ else
+ st->s = MAX(nblocksx, nblocksy) * 2;
+
+ st->sinusoid_offset = random();
+
+ return st;
+}
+
+static unsigned long
+zoom_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ unsigned x, y, i, j;
+
+ long now;
+ unsigned long now_unsigned;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+ XClearWindow (st->dpy, st->window);
+ st->start_time = time ((time_t *) 0);
+ if (!st->lenses) {
+ st->orig_map = XGetImage(st->dpy, st->pm, 0, 0, st->sizex, st->sizey, ~0L, ZPixmap);
+/* XFreePixmap(st->dpy, st->pm);
+ st->pm = 0;*/
+ }
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ st->img_loader = load_image_async_simple (0, st->screen, st->window,
+ st->pm, 0, 0);
+ return st->delay;
+ }
+
+#define nrnd(x) (random() % (x))
+
+ now = currentTimeInMs(st);
+ now_unsigned = (unsigned long) now + st->sinusoid_offset; /* don't run multiple screens in lock-step */
+ now = (now_unsigned <= LONG_MAX) ? now_unsigned : -1 - (long)(ULONG_MAX - now_unsigned);
+
+ /* find new x,y */
+ st->tlx = ((1. + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0)
+ * (st->sizex - st->s/2) /* -s/4 */ + MINX;
+ st->tly = ((1. + sin(((double)now) / Y_PERIOD * 2. * M_PI))/2.0)
+ * (st->sizey - st->s/2) /* -s/4 */ + MINY;
+
+ if (st->lenses) {
+ for (x = i = 0; x < st->sizex; x += (st->pixwidth + st->pixspacex), ++i)
+ for (y = j = 0; y < st->sizey; y += (st->pixheight + st->pixspacey), ++j) {
+ XCopyArea(st->dpy, st->pm /* src */, st->window /* dest */, st->window_gc,
+ st->tlx + i * st->lensoffsetx /* src_x */,
+ st->tly + j * st->lensoffsety /* src_y */,
+ st->pixwidth, st->pixheight,
+ x /* dest_x */, y /* dest_y */);
+ }
+ } else {
+ for (x = i = 0; x < st->sizex; x += (st->pixwidth + st->pixspacex), ++i)
+ for (y = j = 0; y < st->sizey; y += (st->pixheight + st->pixspacey), ++j) {
+ XSetForeground(st->dpy, st->window_gc, XGetPixel(st->orig_map, st->tlx+i, st->tly+j));
+ XFillRectangle(st->dpy, st->window, st->window_gc,
+ i * (st->pixwidth + st->pixspacex),
+ j * (st->pixheight + st->pixspacey), st->pixwidth, st->pixheight);
+ }
+ }
+
+ return st->delay;
+}
+
+static void
+zoom_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+zoom_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+zoom_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (st->dpy, st->window_gc);
+ if (st->orig_map) XDestroyImage (st->orig_map);
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ free (st);
+}
+
+
+static const char *zoom_defaults[] = {
+ "*dontClearRoot: True",
+ ".foreground: white",
+ ".background: #111111",
+ ".lowrez: true",
+ "*fpsSolid: true",
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+ "*lenses: true",
+ "*delay: 10000",
+ "*duration: 120",
+ "*pixwidth: 40",
+ "*pixheight: 40",
+ "*pixspacex: 2",
+ "*pixspacey: 2",
+ "*lensoffsetx: 5",
+ "*lensoffsety: 5",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec zoom_options[] = {
+ { "-lenses", ".lenses", XrmoptionNoArg, "true" },
+ { "-no-lenses", ".lenses", XrmoptionNoArg, "false" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-pixwidth", ".pixwidth", XrmoptionSepArg, 0 },
+ { "-pixheight", ".pixheight", XrmoptionSepArg, 0 },
+ { "-pixspacex", ".pixspacex", XrmoptionSepArg, 0 },
+ { "-pixspacey", ".pixspacey", XrmoptionSepArg, 0 },
+ { "-lensoffsetx", ".lensoffsetx", XrmoptionSepArg, 0 },
+ { "-lensoffsety", ".lensoffsety", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Zoom", zoom)
diff --git a/hacks/zoom.man b/hacks/zoom.man
new file mode 100644
index 0000000..3d8f750
--- /dev/null
+++ b/hacks/zoom.man
@@ -0,0 +1,111 @@
+.TH XScreenSaver 1 "20-Nov-2000" "X Version 11"
+.SH NAME
+zoom - wander around magnified desktop
+.SH SYNOPSIS
+.B zoom
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-lenses]
+[\-pixwidth \fIpixels\fP] [\-pixheight \fIpixels\fP]
+[\-pixspacex \fIpixels\fP] [\-pixspacey \fIpixels\fP]
+[\-lensoffsetx \fIpixels\fP] [\-lensoffsety \fIpixels\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIzoom\fP program takes an image, magnifies it, and scrolls around
+it, fatbits-style.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I zoom
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-lenses
+Instead of doing magnification we just copy an offset region from the original
+image. If lensoffsetx < pixwidth (and similarly for Y) then consecutive
+regions will overlap, giving the effect of looking through an array of
+lenses.
+.TP 8
+.B \-pixwidth \fIpixels\fP
+Width of the magnified pixels.
+.TP 8
+.B \-pixheight \fIpixels\fP
+Height of the magnified pixels.
+.TP 8
+.B \-pixspacex \fIpixels\fP
+Amount of black space between magnified pixels (X direction).
+.TP 8
+.B \-pixspacey \fIpixels\fP
+Amount of black space between magnified pixels (Y direction).
+.TP 8
+.B \-lensoffsetx \fIpixels\fP
+Distance in X direction between consecutive copied regions (only effective
+when
+.I -lenses
+used).
+.TP 8
+.B \-lensoffsety \fIpixels\fP
+Distance in Y direction between consecutive copied regions (only effective
+when
+.I -lenses
+used).
+.TP 8
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2000 by James Macnicol. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+James Macnicol <james.macnicol@mailexcite.com>, 20-Nov-2000. Much code was
+shamelessly stolen from the
+.B spotlight
+hack and a few others.
+